ZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCmluZGV4IDJhN2UzMzguLmNhNDQyZDMgMTAwNjQ0Ci0tLSBhL0NPUFlJTkcKKysrIGIvQ09QWUlORwpAQCAtMTgsNyArMTgsNyBAQAogCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKIAogIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICAgICAgICAgICAgICAgICAgICAgICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwogIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgogCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKIAogCiBBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IGYyOGEyNGUuLjQzM2NmNWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtNDYsNiArNDYsOCBAQAogCS0gcHJvY2VkdXJlIHRvIGdldCBhIHNvdXJjZSBwYXRjaCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4KIFZHQS1zb2Z0Y3Vyc29yLnR4dAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCithcHBseWluZy1wYXRjaGVzLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdmFyaW91cyB0cmVlcyBhbmQgaG93IHRvIGFwcGx5IHRoZWlyIHBhdGNoZXMuCiBhcm0vCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIHRoZSBBUk0gYXJjaGl0ZWN0dXJlLgogYmFzaWNfcHJvZmlsaW5nLnR4dApAQCAtMjc1LDcgKzI3Nyw3IEBACiB1bmljb2RlLnR4dAogCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCiB1bWwvCi0JLSBkaXJlY3Rvcnkgd2l0aCBpbmZvbWF0aW9uIGFib3V0IFVzZXIgTW9kZSBMaW51eC4KKwktIGRpcmVjdG9yeSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IFVzZXIgTW9kZSBMaW51eC4KIHVzYi8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gcmVnYXJkaW5nIHRoZSBVbml2ZXJzYWwgU2VyaWFsIEJ1cy4KIHZpZGVvNGxpbnV4LwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZSBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKaW5kZXggZjI1YjM5NS4uMjJlNWY5MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCkBAIC0yMzYsNiArMjM2LDkgQEAKIG9mIHRoZSBmdW5jdGlvbiwgdGVsbGluZyBwZW9wbGUgd2hhdCBpdCBkb2VzLCBhbmQgcG9zc2libHkgV0hZIGl0IGRvZXMKIGl0LgogCitXaGVuIGNvbW1lbnRpbmcgdGhlIGtlcm5lbCBBUEkgZnVuY3Rpb25zLCBwbGVhc2UgdXNlIHRoZSBrZXJuZWxkb2MgZm9ybWF0LgorU2VlIHRoZSBmaWxlcyBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQgYW5kIHNjcmlwdHMva2VybmVsLWRvYworZm9yIGRldGFpbHMuCiAKIAkJQ2hhcHRlciA4OiBZb3UndmUgbWFkZSBhIG1lc3Mgb2YgaXQKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKaW5kZXggNmVlM2NkNi4uMWFmMGYyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCWRtYV9hZGRyX3QgYWRkcik7CiAKIFRoaXMgcHV0cyBtZW1vcnkgYmFjayBpbnRvIHRoZSBwb29sLiAgVGhlIHBvb2wgaXMgd2hhdCB3YXMgcGFzc2VkIHRvCi10aGUgdGhlIHBvb2wgYWxsb2NhdGlvbiByb3V0aW5lOyB0aGUgY3B1IGFuZCBkbWEgYWRkcmVzc2VzIGFyZSB3aGF0Cit0aGUgcG9vbCBhbGxvY2F0aW9uIHJvdXRpbmU7IHRoZSBjcHUgYW5kIGRtYSBhZGRyZXNzZXMgYXJlIHdoYXQKIHdlcmUgcmV0dXJuZWQgd2hlbiB0aGF0IHJvdXRpbmUgYWxsb2NhdGVkIHRoZSBtZW1vcnkgYmVpbmcgZnJlZWQuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtSVNBLUxQQy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1JU0EtTFBDLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVmNmJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ETUEtSVNBLUxQQy50eHQKQEAgLTAsMCArMSwxNTEgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQSB3aXRoIElTQSBhbmQgTFBDIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgIFBpZXJyZSBPc3NtYW4gPGRyemV1c0BkcnpldXMuY3g+CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byBkbyBETUEgdHJhbnNmZXJzIHVzaW5nIHRoZSBvbGQgSVNBIERNQQorY29udHJvbGxlci4gRXZlbiB0aG91Z2ggSVNBIGlzIG1vcmUgb3IgbGVzcyBkZWFkIHRvZGF5IHRoZSBMUEMgYnVzCit1c2VzIHRoZSBzYW1lIERNQSBzeXN0ZW0gc28gaXQgd2lsbCBiZSBhcm91bmQgZm9yIHF1aXRlIHNvbWUgdGltZS4KKworUGFydCBJIC0gSGVhZGVycyBhbmQgZGVwZW5kZW5jaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gZG8gSVNBIHN0eWxlIERNQSB5b3UgbmVlZCB0byBpbmNsdWRlIHR3byBoZWFkZXJzOgorCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKK1RoZSBmaXJzdCBpcyB0aGUgZ2VuZXJpYyBETUEgQVBJIHVzZWQgdG8gY29udmVydCB2aXJ0dWFsIGFkZHJlc3NlcyB0bworcGh5c2ljYWwgYWRkcmVzc2VzIChzZWUgRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBmb3IgZGV0YWlscykuCisKK1RoZSBzZWNvbmQgY29udGFpbnMgdGhlIHJvdXRpbmVzIHNwZWNpZmljIHRvIElTQSBETUEgdHJhbnNmZXJzLiBTaW5jZQordGhpcyBpcyBub3QgcHJlc2VudCBvbiBhbGwgcGxhdGZvcm1zIG1ha2Ugc3VyZSB5b3UgY29uc3RydWN0IHlvdXIKK0tjb25maWcgdG8gYmUgZGVwZW5kZW50IG9uIElTQV9ETUFfQVBJIChub3QgSVNBKSBzbyB0aGF0IG5vYm9keSB0cmllcwordG8gYnVpbGQgeW91ciBkcml2ZXIgb24gdW5zdXBwb3J0ZWQgcGxhdGZvcm1zLgorCitQYXJ0IElJIC0gQnVmZmVyIGFsbG9jYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSVNBIERNQSBjb250cm9sbGVyIGhhcyBzb21lIHZlcnkgc3RyaWN0IHJlcXVpcmVtZW50cyBvbiB3aGljaAorbWVtb3J5IGl0IGNhbiBhY2Nlc3Mgc28gZXh0cmEgY2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gYWxsb2NhdGluZworYnVmZmVycy4KKworKFlvdSB1c3VhbGx5IG5lZWQgYSBzcGVjaWFsIGJ1ZmZlciBmb3IgRE1BIHRyYW5zZmVycyBpbnN0ZWFkIG9mCit0cmFuc2ZlcnJpbmcgZGlyZWN0bHkgdG8gYW5kIGZyb20geW91ciBub3JtYWwgZGF0YSBzdHJ1Y3R1cmVzLikKKworVGhlIERNQS1hYmxlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIGxvd2VzdCAxNiBNQiBvZiBfcGh5c2ljYWxfIG1lbW9yeS4KK0Fsc28gdGhlIHRyYW5zZmVyIGJsb2NrIG1heSBub3QgY3Jvc3MgcGFnZSBib3VuZGFyaWVzICh3aGljaCBhcmUgNjQKK29yIDEyOCBLaUIgZGVwZW5kaW5nIG9uIHdoaWNoIGNoYW5uZWwgeW91IHVzZSkuCisKK0luIG9yZGVyIHRvIGFsbG9jYXRlIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgc2F0aXNmaWVzIGFsbCB0aGVzZQorcmVxdWlyZW1lbnRzIHlvdSBwYXNzIHRoZSBmbGFnIEdGUF9ETUEgdG8ga21hbGxvYy4KKworVW5mb3J0dW5hdGVseSB0aGUgbWVtb3J5IGF2YWlsYWJsZSBmb3IgSVNBIERNQSBpcyBzY2FyY2Ugc28gdW5sZXNzIHlvdQorYWxsb2NhdGUgdGhlIG1lbW9yeSBkdXJpbmcgYm9vdC11cCBpdCdzIGEgZ29vZCBpZGVhIHRvIGFsc28gcGFzcworX19HRlBfUkVQRUFUIGFuZCBfX0dGUF9OT1dBUk4gdG8gbWFrZSB0aGUgYWxsb2NhdGVyIHRyeSBhIGJpdCBoYXJkZXIuCisKKyhUaGlzIHNjYXJjaXR5IGFsc28gbWVhbnMgdGhhdCB5b3Ugc2hvdWxkIGFsbG9jYXRlIHRoZSBidWZmZXIgYXMKK2Vhcmx5IGFzIHBvc3NpYmxlIGFuZCBub3QgcmVsZWFzZSBpdCB1bnRpbCB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLikKKworUGFydCBJSUkgLSBBZGRyZXNzIHRyYW5zbGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCB1c2UgdGhlIG5vcm1hbCBETUEKK0FQSS4gRG8gX25vdF8gdXNlIGlzYV92aXJ0X3RvX3BoeXMoKSBldmVuIHRob3VnaCBpdCBkb2VzIHRoZSBzYW1lCit0aGluZy4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBmdW5jdGlvbiBpc2FfdmlydF90b19waHlzKCkKK3dpbGwgcmVxdWlyZSBhIEtjb25maWcgZGVwZW5kZW5jeSB0byBJU0EsIG5vdCBqdXN0IElTQV9ETUFfQVBJIHdoaWNoCitpcyByZWFsbHkgYWxsIHlvdSBuZWVkLiBSZW1lbWJlciB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBETUEgY29udHJvbGxlcgoraGFzIGl0cyBvcmlnaW5zIGluIElTQSBpdCBpcyB1c2VkIGVsc2V3aGVyZS4KKworTm90ZTogeDg2XzY0IGhhZCBhIGJyb2tlbiBETUEgQVBJIHdoZW4gaXQgY2FtZSB0byBJU0EgYnV0IGhhcyBzaW5jZQorYmVlbiBmaXhlZC4gSWYgeW91ciBhcmNoIGhhcyBwcm9ibGVtcyB0aGVuIGZpeCB0aGUgRE1BIEFQSSBpbnN0ZWFkIG9mCityZXZlcnRpbmcgdG8gdGhlIElTQSBmdW5jdGlvbnMuCisKK1BhcnQgSVYgLSBDaGFubmVscworLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Egbm9ybWFsIElTQSBETUEgY29udHJvbGxlciBoYXMgOCBjaGFubmVscy4gVGhlIGxvd2VyIGZvdXIgYXJlIGZvcgorOC1iaXQgdHJhbnNmZXJzIGFuZCB0aGUgdXBwZXIgZm91ciBhcmUgZm9yIDE2LWJpdCB0cmFuc2ZlcnMuCisKKyhBY3R1YWxseSB0aGUgRE1BIGNvbnRyb2xsZXIgaXMgcmVhbGx5IHR3byBzZXBhcmF0ZSBjb250cm9sbGVycyB3aGVyZQorY2hhbm5lbCA0IGlzIHVzZWQgdG8gZ2l2ZSBETUEgYWNjZXNzIGZvciB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgKDAtMykuCitUaGlzIG1lYW5zIHRoYXQgb2YgdGhlIGZvdXIgMTYtYml0cyBjaGFubmVscyBvbmx5IHRocmVlIGFyZSB1c2FibGUuKQorCitZb3UgYWxsb2NhdGUgdGhlc2UgaW4gYSBzaW1pbGFyIGZhc2hpb24gYXMgYWxsIGJhc2ljIHJlc291cmNlczoKKworZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNvbnN0IGNoYXIgKiBkZXZpY2VfaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKTsKKworVGhlIGFiaWxpdHkgdG8gdXNlIDE2LWJpdCBvciA4LWJpdCB0cmFuc2ZlcnMgaXMgX25vdF8gdXAgdG8geW91IGFzIGEKK2RyaXZlciBhdXRob3IgYnV0IGRlcGVuZHMgb24gd2hhdCB0aGUgaGFyZHdhcmUgc3VwcG9ydHMuIENoZWNrIHlvdXIKK3NwZWNzIG9yIHRlc3QgZGlmZmVyZW50IGNoYW5uZWxzLgorCitQYXJ0IFYgLSBUcmFuc2ZlciBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdyBmb3IgdGhlIGdvb2Qgc3R1ZmYsIHRoZSBhY3R1YWwgRE1BIHRyYW5zZmVyLiA6KQorCitCZWZvcmUgeW91IHVzZSBhbnkgSVNBIERNQSByb3V0aW5lcyB5b3UgbmVlZCB0byBjbGFpbSB0aGUgRE1BIGxvY2sKK3VzaW5nIGNsYWltX2RtYV9sb2NrKCkuIFRoZSByZWFzb24gaXMgdGhhdCBzb21lIERNQSBvcGVyYXRpb25zIGFyZQorbm90IGF0b21pYyBzbyBvbmx5IG9uZSBkcml2ZXIgbWF5IGZpZGRsZSB3aXRoIHRoZSByZWdpc3RlcnMgYXQgYQordGltZS4KKworVGhlIGZpcnN0IHRpbWUgeW91IHVzZSB0aGUgRE1BIGNvbnRyb2xsZXIgeW91IHNob3VsZCBjYWxsCitjbGVhcl9kbWFfZmYoKS4gVGhpcyBjbGVhcnMgYW4gaW50ZXJuYWwgcmVnaXN0ZXIgaW4gdGhlIERNQQorY29udHJvbGxlciB0aGF0IGlzIHVzZWQgZm9yIHRoZSBub24tYXRvbWljIG9wZXJhdGlvbnMuIEFzIGxvbmcgYXMgeW91CisoYW5kIGV2ZXJ5b25lIGVsc2UpIHVzZXMgdGhlIGxvY2tpbmcgZnVuY3Rpb25zIHRoZW4geW91IG9ubHkgbmVlZCB0bworcmVzZXQgdGhpcyBvbmNlLgorCitOZXh0LCB5b3UgdGVsbCB0aGUgY29udHJvbGxlciBpbiB3aGljaCBkaXJlY3Rpb24geW91IGludGVuZCB0byBkbyB0aGUKK3RyYW5zZmVyIHVzaW5nIHNldF9kbWFfbW9kZSgpLiBDdXJyZW50bHkgeW91IGhhdmUgdGhlIG9wdGlvbnMKK0RNQV9NT0RFX1JFQUQgYW5kIERNQV9NT0RFX1dSSVRFLgorCitTZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgdHJhbnNmZXIgc2hvdWxkIHN0YXJ0ICh0aGlzIG5lZWRzIHRvCitiZSAxNi1iaXQgYWxpZ25lZCBmb3IgMTYtYml0IHRyYW5zZmVycykgYW5kIGhvdyBtYW55IGJ5dGVzIHRvCit0cmFuc2Zlci4gTm90ZSB0aGF0IGl0J3MgX2J5dGVzXy4gVGhlIERNQSByb3V0aW5lcyB3aWxsIGRvIGFsbCB0aGUKK3JlcXVpcmVkIHRyYW5zbGF0aW9uIHRvIHZhbHVlcyB0aGF0IHRoZSBETUEgY29udHJvbGxlciB1bmRlcnN0YW5kcy4KKworVGhlIGZpbmFsIHN0ZXAgaXMgZW5hYmxpbmcgdGhlIERNQSBjaGFubmVsIGFuZCByZWxlYXNpbmcgdGhlIERNQQorbG9jay4KKworT25jZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGZpbmlzaGVkIChvciB0aW1lZCBvdXQpIHlvdSBzaG91bGQgZGlzYWJsZQordGhlIGNoYW5uZWwgYWdhaW4uIFlvdSBzaG91bGQgYWxzbyBjaGVjayBnZXRfZG1hX3Jlc2lkdWUoKSB0byBtYWtlCitzdXJlIHRoYXQgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJlZC4KKworRXhhbXBsZToKKworaW50IGZsYWdzLCByZXNpZHVlOworCitmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKK2NsZWFyX2RtYV9mZigpOworCitzZXRfZG1hX21vZGUoY2hhbm5lbCwgRE1BX01PREVfV1JJVEUpOworc2V0X2RtYV9hZGRyKGNoYW5uZWwsIHBoeXNfYWRkcik7CitzZXRfZG1hX2NvdW50KGNoYW5uZWwsIG51bV9ieXRlcyk7CisKK2RtYV9lbmFibGUoY2hhbm5lbCk7CisKK3JlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCit3aGlsZSAoIWRldmljZV9kb25lKCkpOworCitmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKK2RtYV9kaXNhYmxlKGNoYW5uZWwpOworCityZXNpZHVlID0gZG1hX2dldF9yZXNpZHVlKGNoYW5uZWwpOworaWYgKHJlc2lkdWUgIT0gMCkKKwlwcmludGsoS0VSTl9FUlIgImRyaXZlcjogSW5jb21wbGV0ZSBETUEgdHJhbnNmZXIhIgorCQkiICVkIGJ5dGVzIGxlZnQhXG4iLCByZXNpZHVlKTsKKworcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKK1BhcnQgVkkgLSBTdXNwZW5kL3Jlc3VtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIHRoZSBkcml2ZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbWFjaGluZSBpc24ndAorc3VzcGVuZGVkIHdoaWxlIGEgRE1BIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiBBbHNvLCBhbGwgRE1BIHNldHRpbmdzCithcmUgbG9zdCB3aGVuIHRoZSBzeXN0ZW0gc3VzcGVuZHMgc28gaWYgeW91ciBkcml2ZXIgcmVsaWVzIG9uIHRoZSBETUEKK2NvbnRyb2xsZXIgYmVpbmcgaW4gYSBjZXJ0YWluIHN0YXRlIHRoZW4geW91IGhhdmUgdG8gcmVzdG9yZSB0aGVzZQorcmVnaXN0ZXJzIHVwb24gcmVzdW1lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2pvdXJuYWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbAppbmRleCAxZWY2ZjQzLi4zNDFhYWE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbApAQCAtMTE2LDcgKzExNiw3IEBACiAKIFlvdSBzdGlsbCBuZWVkIHRvIGFjdHVhbGx5IGpvdXJuYWwgeW91ciBmaWxlc3lzdGVtIGNoYW5nZXMsIHRoaXMKIGlzIGRvbmUgYnkgd3JhcHBpbmcgdGhlbSBpbnRvIHRyYW5zYWN0aW9ucy4gQWRkaXRpb25hbGx5IHlvdQotYWxzbyBuZWVkIHRvIHdyYXAgdGhlIG1vZGlmaWNhdGlvbiBvZiBlYWNoIG9mIHRoZSB0aGUgYnVmZmVycworYWxzbyBuZWVkIHRvIHdyYXAgdGhlIG1vZGlmaWNhdGlvbiBvZiBlYWNoIG9mIHRoZSBidWZmZXJzCiB3aXRoIGNhbGxzIHRvIHRoZSBqb3VybmFsIGxheWVyLCBzbyBpdCBrbm93cyB3aGF0IHRoZSBtb2RpZmljYXRpb25zCiB5b3UgYXJlIGFjdHVhbGx5IG1ha2luZyBhcmUuIFRvIGRvIHRoaXMgdXNlICBqb3VybmFsX3N0YXJ0KCkgd2hpY2gKIHJldHVybnMgYSB0cmFuc2FjdGlvbiBoYW5kbGUuCkBAIC0xMjgsNyArMTI4LDcgQEAKIGFyZSBuZXN0YWJsZSBjYWxscywgc28geW91IGNhbiByZWVudGVyIGEgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LAogYnV0IHJlbWVtYmVyIHlvdSBtdXN0IGNhbGwgam91cm5hbF9zdG9wKCkgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIGFzCiBqb3VybmFsX3N0YXJ0KCkgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZWQgKG9yIG1vcmUgYWNjdXJhdGVseQotbGVhdmVzIHRoZSB0aGUgdXBkYXRlIHBoYXNlKS4gRXh0My9WRlMgbWFrZXMgdXNlIG9mIHRoaXMgZmVhdHVyZSB0byBzaW1wbGlmeSAKK2xlYXZlcyB0aGUgdXBkYXRlIHBoYXNlKS4gRXh0My9WRlMgbWFrZXMgdXNlIG9mIHRoaXMgZmVhdHVyZSB0byBzaW1wbGlmeQogcXVvdGEgc3VwcG9ydC4KIDwvcGFyYT4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1oYWNraW5nLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAppbmRleCA0OWE5ZWY4Li42MzY3YmJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbApAQCAtOCw4ICs4LDcgQEAKICAgCiAgIDxhdXRob3Jncm91cD4KICAgIDxhdXRob3I+Ci0gICAgPGZpcnN0bmFtZT5QYXVsPC9maXJzdG5hbWU+Ci0gICAgPG90aGVybmFtZT5SdXN0eTwvb3RoZXJuYW1lPgorICAgIDxmaXJzdG5hbWU+UnVzdHk8L2ZpcnN0bmFtZT4KICAgICA8c3VybmFtZT5SdXNzZWxsPC9zdXJuYW1lPgogICAgIDxhZmZpbGlhdGlvbj4KICAgICAgPGFkZHJlc3M+CkBAIC0yMCw3ICsxOSw3IEBACiAgIDwvYXV0aG9yZ3JvdXA+CiAKICAgPGNvcHlyaWdodD4KLSAgIDx5ZWFyPjIwMDE8L3llYXI+CisgICA8eWVhcj4yMDA1PC95ZWFyPgogICAgPGhvbGRlcj5SdXN0eSBSdXNzZWxsPC9ob2xkZXI+CiAgIDwvY29weXJpZ2h0PgogCkBAIC02NCw3ICs2Myw3IEBACiAgPGNoYXB0ZXIgaWQ9ImludHJvZHVjdGlvbiI+CiAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgogICA8cGFyYT4KLSAgIFdlbGNvbWUsIGdlbnRsZSByZWFkZXIsIHRvIFJ1c3R5J3MgVW5yZWxpYWJsZSBHdWlkZSB0byBMaW51eAorICAgV2VsY29tZSwgZ2VudGxlIHJlYWRlciwgdG8gUnVzdHkncyBSZW1hcmthYmx5IFVucmVsaWFibGUgR3VpZGUgdG8gTGludXgKICAgIEtlcm5lbCBIYWNraW5nLiAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNvbW1vbiByb3V0aW5lcyBhbmQKICAgIGdlbmVyYWwgcmVxdWlyZW1lbnRzIGZvciBrZXJuZWwgY29kZTogaXRzIGdvYWwgaXMgdG8gc2VydmUgYXMgYQogICAgcHJpbWVyIGZvciBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgZm9yIGV4cGVyaWVuY2VkIEMKQEAgLTk2LDEzICs5NSwxMyBAQAogCiAgICA8bGlzdGl0ZW0+CiAgICAgPHBhcmE+Ci0gICAgIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHByb2Nlc3MsIHNlcnZpbmcgYSBzb2Z0aXJxLCB0YXNrbGV0IG9yIGJoOworICAgICBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBwcm9jZXNzLCBzZXJ2aW5nIGEgc29mdGlycSBvciB0YXNrbGV0OwogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KLSAgICAgcnVubmluZyBpbiBrZXJuZWwgc3BhY2UsIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3M7CisgICAgIHJ1bm5pbmcgaW4ga2VybmVsIHNwYWNlLCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzICh1c2VyIGNvbnRleHQpOwogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKQEAgLTExNCwxMSArMTEzLDEyIEBACiAgIDwvaXRlbWl6ZWRsaXN0PgogCiAgIDxwYXJhPgotICAgVGhlcmUgaXMgYSBzdHJpY3Qgb3JkZXJpbmcgYmV0d2VlbiB0aGVzZTogb3RoZXIgdGhhbiB0aGUgbGFzdAotICAgY2F0ZWdvcnkgKHVzZXJzcGFjZSkgZWFjaCBjYW4gb25seSBiZSBwcmUtZW1wdGVkIGJ5IHRob3NlIGFib3ZlLgotICAgRm9yIGV4YW1wbGUsIHdoaWxlIGEgc29mdGlycSBpcyBydW5uaW5nIG9uIGEgQ1BVLCBubyBvdGhlcgotICAgc29mdGlycSB3aWxsIHByZS1lbXB0IGl0LCBidXQgYSBoYXJkd2FyZSBpbnRlcnJ1cHQgY2FuLiAgSG93ZXZlciwKLSAgIGFueSBvdGhlciBDUFVzIGluIHRoZSBzeXN0ZW0gZXhlY3V0ZSBpbmRlcGVuZGVudGx5LgorICAgVGhlcmUgaXMgYW4gb3JkZXJpbmcgYmV0d2VlbiB0aGVzZS4gIFRoZSBib3R0b20gdHdvIGNhbiBwcmVlbXB0CisgICBlYWNoIG90aGVyLCBidXQgYWJvdmUgdGhhdCBpcyBhIHN0cmljdCBoaWVyYXJjaHk6IGVhY2ggY2FuIG9ubHkgYmUKKyAgIHByZWVtcHRlZCBieSB0aGUgb25lcyBhYm92ZSBpdC4gIEZvciBleGFtcGxlLCB3aGlsZSBhIHNvZnRpcnEgaXMKKyAgIHJ1bm5pbmcgb24gYSBDUFUsIG5vIG90aGVyIHNvZnRpcnEgd2lsbCBwcmVlbXB0IGl0LCBidXQgYSBoYXJkd2FyZQorICAgaW50ZXJydXB0IGNhbi4gIEhvd2V2ZXIsIGFueSBvdGhlciBDUFVzIGluIHRoZSBzeXN0ZW0gZXhlY3V0ZQorICAgaW5kZXBlbmRlbnRseS4KICAgPC9wYXJhPgogCiAgIDxwYXJhPgpAQCAtMTMwLDEwICsxMzAsMTAgQEAKICAgIDx0aXRsZT5Vc2VyIENvbnRleHQ8L3RpdGxlPgogCiAgICA8cGFyYT4KLSAgICBVc2VyIGNvbnRleHQgaXMgd2hlbiB5b3UgYXJlIGNvbWluZyBpbiBmcm9tIGEgc3lzdGVtIGNhbGwgb3IKLSAgICBvdGhlciB0cmFwOiB5b3UgY2FuIHNsZWVwLCBhbmQgeW91IG93biB0aGUgQ1BVIChleGNlcHQgZm9yCi0gICAgaW50ZXJydXB0cykgdW50aWwgeW91IGNhbGwgPGZ1bmN0aW9uPnNjaGVkdWxlKCk8L2Z1bmN0aW9uPi4gIAotICAgIEluIG90aGVyIHdvcmRzLCB1c2VyIGNvbnRleHQgKHVubGlrZSB1c2Vyc3BhY2UpIGlzIG5vdCBwcmUtZW1wdGFibGUuCisgICAgVXNlciBjb250ZXh0IGlzIHdoZW4geW91IGFyZSBjb21pbmcgaW4gZnJvbSBhIHN5c3RlbSBjYWxsIG9yIG90aGVyCisgICAgdHJhcDogbGlrZSB1c2Vyc3BhY2UsIHlvdSBjYW4gYmUgcHJlZW1wdGVkIGJ5IG1vcmUgaW1wb3J0YW50IHRhc2tzCisgICAgYW5kIGJ5IGludGVycnVwdHMuICBZb3UgY2FuIHNsZWVwLCBieSBjYWxsaW5nCisgICAgPGZ1bmN0aW9uPnNjaGVkdWxlKCk8L2Z1bmN0aW9uPi4KICAgIDwvcGFyYT4KIAogICAgPG5vdGU+CkBAIC0xNTMsNyArMTUzLDcgQEAKIAogICAgPGNhdXRpb24+CiAgICAgPHBhcmE+Ci0gICAgIEJld2FyZSB0aGF0IGlmIHlvdSBoYXZlIGludGVycnVwdHMgb3IgYm90dG9tIGhhbHZlcyBkaXNhYmxlZCAKKyAgICAgQmV3YXJlIHRoYXQgaWYgeW91IGhhdmUgcHJlZW1wdGlvbiBvciBzb2Z0aXJxcyBkaXNhYmxlZAogICAgICAoc2VlIGJlbG93KSwgPGZ1bmN0aW9uPmluX2ludGVycnVwdCgpPC9mdW5jdGlvbj4gd2lsbCByZXR1cm4gYSAKICAgICAgZmFsc2UgcG9zaXRpdmUuCiAgICAgPC9wYXJhPgpAQCAtMTY4LDEwICsxNjgsMTAgQEAKICAgICA8aGFyZHdhcmU+a2V5Ym9hcmQ8L2hhcmR3YXJlPiBhcmUgZXhhbXBsZXMgb2YgcmVhbAogICAgIGhhcmR3YXJlIHdoaWNoIHByb2R1Y2UgaW50ZXJydXB0cyBhdCBhbnkgdGltZS4gIFRoZSBrZXJuZWwgcnVucwogICAgIGludGVycnVwdCBoYW5kbGVycywgd2hpY2ggc2VydmljZXMgdGhlIGhhcmR3YXJlLiAgVGhlIGtlcm5lbAotICAgIGd1YXJhbnRlZXMgdGhhdCB0aGlzIGhhbmRsZXIgaXMgbmV2ZXIgcmUtZW50ZXJlZDogaWYgYW5vdGhlcgorICAgIGd1YXJhbnRlZXMgdGhhdCB0aGlzIGhhbmRsZXIgaXMgbmV2ZXIgcmUtZW50ZXJlZDogaWYgdGhlIHNhbWUKICAgICBpbnRlcnJ1cHQgYXJyaXZlcywgaXQgaXMgcXVldWVkIChvciBkcm9wcGVkKS4gIEJlY2F1c2UgaXQKICAgICBkaXNhYmxlcyBpbnRlcnJ1cHRzLCB0aGlzIGhhbmRsZXIgaGFzIHRvIGJlIGZhc3Q6IGZyZXF1ZW50bHkgaXQKLSAgICBzaW1wbHkgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQsIG1hcmtzIGEgYHNvZnR3YXJlIGludGVycnVwdCcKKyAgICBzaW1wbHkgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQsIG1hcmtzIGEgJ3NvZnR3YXJlIGludGVycnVwdCcKICAgICBmb3IgZXhlY3V0aW9uIGFuZCBleGl0cy4KICAgIDwvcGFyYT4KIApAQCAtMTg4LDYwICsxODgsNTIgQEAKICAgPC9zZWN0MT4KIAogICA8c2VjdDEgaWQ9ImJhc2ljcy1zb2Z0aXJxcyI+Ci0gICA8dGl0bGU+U29mdHdhcmUgSW50ZXJydXB0IENvbnRleHQ6IEJvdHRvbSBIYWx2ZXMsIFRhc2tsZXRzLCBzb2Z0aXJxczwvdGl0bGU+CisgICA8dGl0bGU+U29mdHdhcmUgSW50ZXJydXB0IENvbnRleHQ6IFNvZnRpcnFzIGFuZCBUYXNrbGV0czwvdGl0bGU+CiAKICAgIDxwYXJhPgogICAgIFdoZW5ldmVyIGEgc3lzdGVtIGNhbGwgaXMgYWJvdXQgdG8gcmV0dXJuIHRvIHVzZXJzcGFjZSwgb3IgYQotICAgIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGV4aXRzLCBhbnkgYHNvZnR3YXJlIGludGVycnVwdHMnCisgICAgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZXhpdHMsIGFueSAnc29mdHdhcmUgaW50ZXJydXB0cycKICAgICB3aGljaCBhcmUgbWFya2VkIHBlbmRpbmcgKHVzdWFsbHkgYnkgaGFyZHdhcmUgaW50ZXJydXB0cykgYXJlCiAgICAgcnVuICg8ZmlsZW5hbWU+a2VybmVsL3NvZnRpcnEuYzwvZmlsZW5hbWU+KS4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+CiAgICAgTXVjaCBvZiB0aGUgcmVhbCBpbnRlcnJ1cHQgaGFuZGxpbmcgd29yayBpcyBkb25lIGhlcmUuICBFYXJseSBpbgotICAgIHRoZSB0cmFuc2l0aW9uIHRvIDxhY3JvbnltPlNNUDwvYWNyb255bT4sIHRoZXJlIHdlcmUgb25seSBgYm90dG9tIAorICAgIHRoZSB0cmFuc2l0aW9uIHRvIDxhY3JvbnltPlNNUDwvYWNyb255bT4sIHRoZXJlIHdlcmUgb25seSAnYm90dG9tCiAgICAgaGFsdmVzJyAoQkhzKSwgd2hpY2ggZGlkbid0IHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIENQVXMuICBTaG9ydGx5IAogICAgIGFmdGVyIHdlIHN3aXRjaGVkIGZyb20gd2luZC11cCBjb21wdXRlcnMgbWFkZSBvZiBtYXRjaC1zdGlja3MgYW5kIHNub3QsCi0gICAgd2UgYWJhbmRvbmVkIHRoaXMgbGltaXRhdGlvbi4KKyAgICB3ZSBhYmFuZG9uZWQgdGhpcyBsaW1pdGF0aW9uIGFuZCBzd2l0Y2hlZCB0byAnc29mdGlycXMnLgogICAgPC9wYXJhPgogCiAgICA8cGFyYT4KICAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvaW50ZXJydXB0Lmg8L2ZpbGVuYW1lPiBsaXN0cyB0aGUKLSAgICBkaWZmZXJlbnQgQkgncy4gIE5vIG1hdHRlciBob3cgbWFueSBDUFVzIHlvdSBoYXZlLCBubyB0d28gQkhzIHdpbGwgcnVuIGF0IAotICAgIHRoZSBzYW1lIHRpbWUuIFRoaXMgbWFkZSB0aGUgdHJhbnNpdGlvbiB0byBTTVAgc2ltcGxlciwgYnV0IHN1Y2tzIGhhcmQgZm9yCi0gICAgc2NhbGFibGUgcGVyZm9ybWFuY2UuICBBIHZlcnkgaW1wb3J0YW50IGJvdHRvbSBoYWxmIGlzIHRoZSB0aW1lcgotICAgIEJIICg8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvdGltZXIuaDwvZmlsZW5hbWU+KTogeW91Ci0gICAgY2FuIHJlZ2lzdGVyIHRvIGhhdmUgaXQgY2FsbCBmdW5jdGlvbnMgZm9yIHlvdSBpbiBhIGdpdmVuIGxlbmd0aCBvZiB0aW1lLgorICAgIGRpZmZlcmVudCBzb2Z0aXJxcy4gIEEgdmVyeSBpbXBvcnRhbnQgc29mdGlycSBpcyB0aGUKKyAgICB0aW1lciBzb2Z0aXJxICg8ZmlsZW5hbWUKKyAgICBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC90aW1lci5oPC9maWxlbmFtZT4pOiB5b3UgY2FuCisgICAgcmVnaXN0ZXIgdG8gaGF2ZSBpdCBjYWxsIGZ1bmN0aW9ucyBmb3IgeW91IGluIGEgZ2l2ZW4gbGVuZ3RoIG9mCisgICAgdGltZS4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+Ci0gICAgMi4zLjQzIGludHJvZHVjZWQgc29mdGlycXMsIGFuZCByZS1pbXBsZW1lbnRlZCB0aGUgKG5vdwotICAgIGRlcHJlY2F0ZWQpIEJIcyB1bmRlcm5lYXRoIHRoZW0uICBTb2Z0aXJxcyBhcmUgZnVsbHktU01QCi0gICAgdmVyc2lvbnMgb2YgQkhzOiB0aGV5IGNhbiBydW4gb24gYXMgbWFueSBDUFVzIGF0IG9uY2UgYXMKLSAgICByZXF1aXJlZC4gIFRoaXMgbWVhbnMgdGhleSBuZWVkIHRvIGRlYWwgd2l0aCBhbnkgcmFjZXMgaW4gc2hhcmVkCi0gICAgZGF0YSB1c2luZyB0aGVpciBvd24gbG9ja3MuICBBIGJpdG1hc2sgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0gICAgd2hpY2ggYXJlIGVuYWJsZWQsIHNvIHRoZSAzMiBhdmFpbGFibGUgc29mdGlycXMgc2hvdWxkIG5vdCBiZQotICAgIHVzZWQgdXAgbGlnaHRseS4gICg8ZW1waGFzaXM+WWVzPC9lbXBoYXNpcz4sIHBlb3BsZSB3aWxsCi0gICAgbm90aWNlKS4KLSAgIDwvcGFyYT4KLQotICAgPHBhcmE+Ci0gICAgdGFza2xldHMgKDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaDwvZmlsZW5hbWU+KQotICAgIGFyZSBsaWtlIHNvZnRpcnFzLCBleGNlcHQgdGhleSBhcmUgZHluYW1pY2FsbHktcmVnaXN0cmFibGUgKG1lYW5pbmcgeW91IAotICAgIGNhbiBoYXZlIGFzIG1hbnkgYXMgeW91IHdhbnQpLCBhbmQgdGhleSBhbHNvIGd1YXJhbnRlZSB0aGF0IGFueSB0YXNrbGV0IAotICAgIHdpbGwgb25seSBydW4gb24gb25lIENQVSBhdCBhbnkgdGltZSwgYWx0aG91Z2ggZGlmZmVyZW50IHRhc2tsZXRzIGNhbiAKLSAgICBydW4gc2ltdWx0YW5lb3VzbHkgKHVubGlrZSBkaWZmZXJlbnQgQkhzKS4gIAorICAgIFNvZnRpcnFzIGFyZSBvZnRlbiBhIHBhaW4gdG8gZGVhbCB3aXRoLCBzaW5jZSB0aGUgc2FtZSBzb2Z0aXJxCisgICAgd2lsbCBydW4gc2ltdWx0YW5lb3VzbHkgb24gbW9yZSB0aGFuIG9uZSBDUFUuICBGb3IgdGhpcyByZWFzb24sCisgICAgdGFza2xldHMgKDxmaWxlbmFtZQorICAgIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oPC9maWxlbmFtZT4pIGFyZSBtb3JlCisgICAgb2Z0ZW4gdXNlZDogdGhleSBhcmUgZHluYW1pY2FsbHktcmVnaXN0cmFibGUgKG1lYW5pbmcgeW91IGNhbiBoYXZlCisgICAgYXMgbWFueSBhcyB5b3Ugd2FudCksIGFuZCB0aGV5IGFsc28gZ3VhcmFudGVlIHRoYXQgYW55IHRhc2tsZXQKKyAgICB3aWxsIG9ubHkgcnVuIG9uIG9uZSBDUFUgYXQgYW55IHRpbWUsIGFsdGhvdWdoIGRpZmZlcmVudCB0YXNrbGV0cworICAgIGNhbiBydW4gc2ltdWx0YW5lb3VzbHkuCiAgICA8L3BhcmE+CiAgICA8Y2F1dGlvbj4KICAgICA8cGFyYT4KLSAgICAgVGhlIG5hbWUgYHRhc2tsZXQnIGlzIG1pc2xlYWRpbmc6IHRoZXkgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggYHRhc2tzJywgCisgICAgIFRoZSBuYW1lICd0YXNrbGV0JyBpcyBtaXNsZWFkaW5nOiB0aGV5IGhhdmUgbm90aGluZyB0byBkbyB3aXRoICd0YXNrcycsCiAgICAgIGFuZCBwcm9iYWJseSBtb3JlIHRvIGRvIHdpdGggc29tZSBiYWQgdm9ka2EgQWxleGV5IEt1em5ldHNvdiBoYWQgYXQgdGhlIAogICAgICB0aW1lLgogICAgIDwvcGFyYT4KICAgIDwvY2F1dGlvbj4KIAogICAgPHBhcmE+Ci0gICAgWW91IGNhbiB0ZWxsIHlvdSBhcmUgaW4gYSBzb2Z0aXJxIChvciBib3R0b20gaGFsZiwgb3IgdGFza2xldCkKKyAgICBZb3UgY2FuIHRlbGwgeW91IGFyZSBpbiBhIHNvZnRpcnEgKG9yIHRhc2tsZXQpCiAgICAgdXNpbmcgdGhlIDxmdW5jdGlvbj5pbl9zb2Z0aXJxKCk8L2Z1bmN0aW9uPiBtYWNybyAKICAgICAoPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oPC9maWxlbmFtZT4pLgogICAgPC9wYXJhPgpAQCAtMjg4LDExICsyODAsMTAgQEAKICAgICA8dGVybT5BIHJpZ2lkIHN0YWNrIGxpbWl0PC90ZXJtPgogICAgIDxsaXN0aXRlbT4KICAgICAgPHBhcmE+Ci0gICAgICBUaGUga2VybmVsIHN0YWNrIGlzIGFib3V0IDZLIGluIDIuMiAoZm9yIG1vc3QKLSAgICAgIGFyY2hpdGVjdHVyZXM6IGl0J3MgYWJvdXQgMTRLIG9uIHRoZSBBbHBoYSksIGFuZCBzaGFyZWQKLSAgICAgIHdpdGggaW50ZXJydXB0cyBzbyB5b3UgY2FuJ3QgdXNlIGl0IGFsbC4gIEF2b2lkIGRlZXAKLSAgICAgIHJlY3Vyc2lvbiBhbmQgaHVnZSBsb2NhbCBhcnJheXMgb24gdGhlIHN0YWNrIChhbGxvY2F0ZQotICAgICAgdGhlbSBkeW5hbWljYWxseSBpbnN0ZWFkKS4KKyAgICAgIERlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhlIGtlcm5lbCBzdGFjayBpcyBhYm91dCAzSyB0byA2SyBmb3IgbW9zdCAzMi1iaXQgYXJjaGl0ZWN0dXJlczogaXQncworICAgICAgYWJvdXQgMTRLIG9uIG1vc3QgNjQtYml0IGFyY2hzLCBhbmQgb2Z0ZW4gc2hhcmVkIHdpdGggaW50ZXJydXB0cworICAgICAgc28geW91IGNhbid0IHVzZSBpdCBhbGwuICBBdm9pZCBkZWVwIHJlY3Vyc2lvbiBhbmQgaHVnZSBsb2NhbAorICAgICAgYXJyYXlzIG9uIHRoZSBzdGFjayAoYWxsb2NhdGUgdGhlbSBkeW5hbWljYWxseSBpbnN0ZWFkKS4KICAgICAgPC9wYXJhPgogICAgIDwvbGlzdGl0ZW0+CiAgICA8L3Zhcmxpc3RlbnRyeT4KQEAgLTMzOSw3ICszMzAsNyBAQAogCiAgIDxwYXJhPgogICAgSWYgYWxsIHlvdXIgcm91dGluZSBkb2VzIGlzIHJlYWQgb3Igd3JpdGUgc29tZSBwYXJhbWV0ZXIsIGNvbnNpZGVyCi0gICBpbXBsZW1lbnRpbmcgYSA8ZnVuY3Rpb24+c3lzY3RsPC9mdW5jdGlvbj4gaW50ZXJmYWNlIGluc3RlYWQuCisgICBpbXBsZW1lbnRpbmcgYSA8ZnVuY3Rpb24+c3lzZnM8L2Z1bmN0aW9uPiBpbnRlcmZhY2UgaW5zdGVhZC4KICAgPC9wYXJhPgogCiAgIDxwYXJhPgpAQCAtNDE3LDcgKzQwOCwxMCBAQAogICA8L3BhcmE+CiAKICAgPHBhcmE+Ci0gICBZb3Ugd2lsbCBldmVudHVhbGx5IGxvY2sgdXAgeW91ciBib3ggaWYgeW91IGJyZWFrIHRoZXNlIHJ1bGVzLiAgCisgICBZb3Ugc2hvdWxkIGFsd2F5cyBjb21waWxlIHlvdXIga2VybmVsCisgICA8c3ltYm9sPkNPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUDwvc3ltYm9sPiBvbiwgYW5kIGl0IHdpbGwgd2FybgorICAgeW91IGlmIHlvdSBicmVhayB0aGVzZSBydWxlcy4gIElmIHlvdSA8ZW1waGFzaXM+ZG88L2VtcGhhc2lzPiBicmVhaworICAgdGhlIHJ1bGVzLCB5b3Ugd2lsbCBldmVudHVhbGx5IGxvY2sgdXAgeW91ciBib3guCiAgIDwvcGFyYT4KIAogICA8cGFyYT4KQEAgLTUxNSw4ICs1MDksNyBAQAogICAgICAgc3VjY2VzcykuCiAgICAgIDwvcGFyYT4KICAgICA8L2NhdXRpb24+Ci0gICAgW1llcywgdGhpcyBtb3JvbmljIGludGVyZmFjZSBtYWtlcyBtZSBjcmluZ2UuICBQbGVhc2Ugc3VibWl0IGEKLSAgICBwYXRjaCBhbmQgYmVjb21lIG15IGhlcm8gLS1SUi5dCisgICAgW1llcywgdGhpcyBtb3JvbmljIGludGVyZmFjZSBtYWtlcyBtZSBjcmluZ2UuICBUaGUgZmxhbWV3YXIgY29tZXMgdXAgZXZlcnkgeWVhciBvciBzby4gLS1SUi5dCiAgICA8L3BhcmE+CiAgICA8cGFyYT4KICAgICBUaGUgZnVuY3Rpb25zIG1heSBzbGVlcCBpbXBsaWNpdGx5LiBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKQEAgLTU4NywxMCArNTgwLDExIEBACiAgICA8L3ZhcmlhYmxlbGlzdD4KIAogICAgPHBhcmE+Ci0gICAgSWYgeW91IHNlZSBhIDxlcnJvcm5hbWU+a21lbV9ncm93OiBDYWxsZWQgbm9uYXRvbWljYWxseSBmcm9tIGludAotICAgIDwvZXJyb3JuYW1lPiB3YXJuaW5nIG1lc3NhZ2UgeW91IGNhbGxlZCBhIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uCi0gICAgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB3aXRob3V0IDxjb25zdGFudD5HRlBfQVRPTUlDPC9jb25zdGFudD4uCi0gICAgWW91IHNob3VsZCByZWFsbHkgZml4IHRoYXQuICBSdW4sIGRvbid0IHdhbGsuCisgICAgSWYgeW91IHNlZSBhIDxlcnJvcm5hbWU+c2xlZXBpbmcgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW52YWxpZAorICAgIGNvbnRleHQ8L2Vycm9ybmFtZT4gd2FybmluZyBtZXNzYWdlLCB0aGVuIG1heWJlIHlvdSBjYWxsZWQgYQorICAgIHNsZWVwaW5nIGFsbG9jYXRpb24gZnVuY3Rpb24gZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB3aXRob3V0CisgICAgPGNvbnN0YW50PkdGUF9BVE9NSUM8L2NvbnN0YW50Pi4gIFlvdSBzaG91bGQgcmVhbGx5IGZpeCB0aGF0LgorICAgIFJ1biwgZG9uJ3Qgd2Fsay4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+CkBAIC02MzksMTYgKzYzMywxNiBAQAogICA8L3NlY3QxPgogCiAgIDxzZWN0MSBpZD0icm91dGluZXMtdWRlbGF5Ij4KLSAgIDx0aXRsZT48ZnVuY3Rpb24+dWRlbGF5KCk8L2Z1bmN0aW9uPi88ZnVuY3Rpb24+bWRlbGF5KCk8L2Z1bmN0aW9uPgorICAgPHRpdGxlPjxmdW5jdGlvbj5tZGVsYXkoKTwvZnVuY3Rpb24+LzxmdW5jdGlvbj51ZGVsYXkoKTwvZnVuY3Rpb24+CiAgICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9hc20vZGVsYXkuaDwvZmlsZW5hbWU+CiAgICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9kZWxheS5oPC9maWxlbmFtZT4KICAgIDwvdGl0bGU+CiAKICAgIDxwYXJhPgotICAgIFRoZSA8ZnVuY3Rpb24+dWRlbGF5KCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3Igc21hbGwgcGF1c2VzLgotICAgIERvIG5vdCB1c2UgbGFyZ2UgdmFsdWVzIHdpdGggPGZ1bmN0aW9uPnVkZWxheSgpPC9mdW5jdGlvbj4gYXMgeW91IHJpc2sKKyAgICBUaGUgPGZ1bmN0aW9uPnVkZWxheSgpPC9mdW5jdGlvbj4gYW5kIDxmdW5jdGlvbj5uZGVsYXkoKTwvZnVuY3Rpb24+IGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBmb3Igc21hbGwgcGF1c2VzLgorICAgIERvIG5vdCB1c2UgbGFyZ2UgdmFsdWVzIHdpdGggdGhlbSBhcyB5b3UgcmlzawogICAgIG92ZXJmbG93IC0gdGhlIGhlbHBlciBmdW5jdGlvbiA8ZnVuY3Rpb24+bWRlbGF5KCk8L2Z1bmN0aW9uPiBpcyB1c2VmdWwKLSAgICBoZXJlLCBvciBldmVuIGNvbnNpZGVyIDxmdW5jdGlvbj5zY2hlZHVsZV90aW1lb3V0KCk8L2Z1bmN0aW9uPi4KKyAgICBoZXJlLCBvciBjb25zaWRlciA8ZnVuY3Rpb24+bXNsZWVwKCk8L2Z1bmN0aW9uPi4KICAgIDwvcGFyYT4gCiAgIDwvc2VjdDE+CiAgCkBAIC02OTgsOCArNjkyLDggQEAKICAgICBUaGVzZSByb3V0aW5lcyBkaXNhYmxlIHNvZnQgaW50ZXJydXB0cyBvbiB0aGUgbG9jYWwgQ1BVLCBhbmQKICAgICByZXN0b3JlIHRoZW0uICBUaGV5IGFyZSByZWVudHJhbnQ7IGlmIHNvZnQgaW50ZXJydXB0cyB3ZXJlCiAgICAgZGlzYWJsZWQgYmVmb3JlLCB0aGV5IHdpbGwgc3RpbGwgYmUgZGlzYWJsZWQgYWZ0ZXIgdGhpcyBwYWlyCi0gICAgb2YgZnVuY3Rpb25zIGhhcyBiZWVuIGNhbGxlZC4gIFRoZXkgcHJldmVudCBzb2Z0aXJxcywgdGFza2xldHMKLSAgICBhbmQgYm90dG9tIGhhbHZlcyBmcm9tIHJ1bm5pbmcgb24gdGhlIGN1cnJlbnQgQ1BVLgorICAgIG9mIGZ1bmN0aW9ucyBoYXMgYmVlbiBjYWxsZWQuICBUaGV5IHByZXZlbnQgc29mdGlycXMgYW5kIHRhc2tsZXRzCisgICAgZnJvbSBydW5uaW5nIG9uIHRoZSBjdXJyZW50IENQVS4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIApAQCAtNzA4LDEwICs3MDIsMTYgQEAKICAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvYXNtL3NtcC5oPC9maWxlbmFtZT48L3RpdGxlPgogICAgCiAgICA8cGFyYT4KLSAgICA8ZnVuY3Rpb24+c21wX3Byb2Nlc3Nvcl9pZCgpPC9mdW5jdGlvbj4gcmV0dXJucyB0aGUgY3VycmVudAotICAgIHByb2Nlc3NvciBudW1iZXIsIGJldHdlZW4gMCBhbmQgPHN5bWJvbD5OUl9DUFVTPC9zeW1ib2w+ICh0aGUKLSAgICBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHN1cHBvcnRlZCBieSBMaW51eCwgY3VycmVudGx5IDMyKS4gIFRoZXNlCi0gICAgdmFsdWVzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29udGludW91cy4KKyAgICA8ZnVuY3Rpb24+Z2V0X2NwdSgpPC9mdW5jdGlvbj4gZGlzYWJsZXMgcHJlZW1wdGlvbiAoc28geW91IHdvbid0CisgICAgc3VkZGVubHkgZ2V0IG1vdmVkIHRvIGFub3RoZXIgQ1BVKSBhbmQgcmV0dXJucyB0aGUgY3VycmVudAorICAgIHByb2Nlc3NvciBudW1iZXIsIGJldHdlZW4gMCBhbmQgPHN5bWJvbD5OUl9DUFVTPC9zeW1ib2w+LiAgTm90ZQorICAgIHRoYXQgdGhlIENQVSBudW1iZXJzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29udGludW91cy4gIFlvdSByZXR1cm4KKyAgICBpdCBhZ2FpbiB3aXRoIDxmdW5jdGlvbj5wdXRfY3B1KCk8L2Z1bmN0aW9uPiB3aGVuIHlvdSBhcmUgZG9uZS4KKyAgIDwvcGFyYT4KKyAgIDxwYXJhPgorICAgIElmIHlvdSBrbm93IHlvdSBjYW5ub3QgYmUgcHJlZW1wdGVkIGJ5IGFub3RoZXIgdGFzayAoaWUuIHlvdSBhcmUKKyAgICBpbiBpbnRlcnJ1cHQgY29udGV4dCwgb3IgaGF2ZSBwcmVlbXB0aW9uIGRpc2FibGVkKSB5b3UgY2FuIHVzZQorICAgIHNtcF9wcm9jZXNzb3JfaWQoKS4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIApAQCAtNzIyLDE5ICs3MjIsMTQgQEAKICAgIDxwYXJhPgogICAgIEFmdGVyIGJvb3QsIHRoZSBrZXJuZWwgZnJlZXMgdXAgYSBzcGVjaWFsIHNlY3Rpb247IGZ1bmN0aW9ucwogICAgIG1hcmtlZCB3aXRoIDx0eXBlPl9faW5pdDwvdHlwZT4gYW5kIGRhdGEgc3RydWN0dXJlcyBtYXJrZWQgd2l0aAotICAgIDx0eXBlPl9faW5pdGRhdGE8L3R5cGU+IGFyZSBkcm9wcGVkIGFmdGVyIGJvb3QgaXMgY29tcGxldGUgKHdpdGhpbgotICAgIG1vZHVsZXMgdGhpcyBkaXJlY3RpdmUgaXMgY3VycmVudGx5IGlnbm9yZWQpLiAgPHR5cGU+X19leGl0PC90eXBlPgorICAgIDx0eXBlPl9faW5pdGRhdGE8L3R5cGU+IGFyZSBkcm9wcGVkIGFmdGVyIGJvb3QgaXMgY29tcGxldGU6IHNpbWlsYXJseQorICAgIG1vZHVsZXMgZGlzY2FyZCB0aGlzIG1lbW9yeSBhZnRlciBpbml0aWFsaXphdGlvbi4gIDx0eXBlPl9fZXhpdDwvdHlwZT4KICAgICBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmdW5jdGlvbiB3aGljaCBpcyBvbmx5IHJlcXVpcmVkIG9uIGV4aXQ6IHRoZQogICAgIGZ1bmN0aW9uIHdpbGwgYmUgZHJvcHBlZCBpZiB0aGlzIGZpbGUgaXMgbm90IGNvbXBpbGVkIGFzIGEgbW9kdWxlLgogICAgIFNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIHVzZS4gTm90ZSB0aGF0IGl0IG1ha2VzIG5vIHNlbnNlIGZvciBhIGZ1bmN0aW9uCiAgICAgbWFya2VkIHdpdGggPHR5cGU+X19pbml0PC90eXBlPiB0byBiZSBleHBvcnRlZCB0byBtb2R1bGVzIHdpdGggCiAgICAgPGZ1bmN0aW9uPkVYUE9SVF9TWU1CT0woKTwvZnVuY3Rpb24+IC0gdGhpcyB3aWxsIGJyZWFrLgogICAgPC9wYXJhPgotICAgPHBhcmE+Ci0gICBTdGF0aWMgZGF0YSBzdHJ1Y3R1cmVzIG1hcmtlZCBhcyA8dHlwZT5fX2luaXRkYXRhPC90eXBlPiBtdXN0IGJlIGluaXRpYWxpc2VkCi0gICAoYXMgb3Bwb3NlZCB0byBvcmRpbmFyeSBzdGF0aWMgZGF0YSB3aGljaCBpcyB6ZXJvZWQgQlNTKSBhbmQgY2Fubm90IGJlIAotICAgPHR5cGU+Y29uc3Q8L3R5cGU+LgotICAgPC9wYXJhPiAKIAogICA8L3NlY3QxPgogCkBAIC03NjIsOSArNzU3LDggQEAKICAgIDxwYXJhPgogICAgIFRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIHRvIGNhdXNlCiAgICAgbW9kdWxlIGxvYWRpbmcgdG8gZmFpbCAodW5mb3J0dW5hdGVseSwgdGhpcyBoYXMgbm8gZWZmZWN0IGlmCi0gICAgdGhlIG1vZHVsZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwpLiAgRm9yIG1vZHVsZXMsIHRoaXMgaXMKLSAgICBjYWxsZWQgaW4gdXNlciBjb250ZXh0LCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCwgYW5kIHRoZQotICAgIGtlcm5lbCBsb2NrIGhlbGQsIHNvIGl0IGNhbiBzbGVlcC4KKyAgICB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCkuICBUaGlzIGZ1bmN0aW9uIGlzCisgICAgY2FsbGVkIGluIHVzZXIgY29udGV4dCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCwgc28gaXQgY2FuIHNsZWVwLgogICAgPC9wYXJhPgogICA8L3NlY3QxPgogICAKQEAgLTc3OSw2ICs3NzMsMzQgQEAKICAgICByZWFjaGVkIHplcm8uICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIHNsZWVwLCBidXQgY2Fubm90IGZhaWw6CiAgICAgZXZlcnl0aGluZyBtdXN0IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpbWUgaXQgcmV0dXJucy4KICAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgTm90ZSB0aGF0IHRoaXMgbWFjcm8gaXMgb3B0aW9uYWw6IGlmIGl0IGlzIG5vdCBwcmVzZW50LCB5b3VyCisgICAgbW9kdWxlIHdpbGwgbm90IGJlIHJlbW92YWJsZSAoZXhjZXB0IGZvciAncm1tb2QgLWYnKS4KKyAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InJvdXRpbmVzLW1vZHVsZS11c2UtY291bnRlcnMiPgorICAgPHRpdGxlPiA8ZnVuY3Rpb24+dHJ5X21vZHVsZV9nZXQoKTwvZnVuY3Rpb24+LzxmdW5jdGlvbj5tb2R1bGVfcHV0KCk8L2Z1bmN0aW9uPgorICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9tb2R1bGUuaDwvZmlsZW5hbWU+PC90aXRsZT4KKworICAgPHBhcmE+CisgICAgVGhlc2UgbWFuaXB1bGF0ZSB0aGUgbW9kdWxlIHVzYWdlIGNvdW50LCB0byBwcm90ZWN0IGFnYWluc3QKKyAgICByZW1vdmFsIChhIG1vZHVsZSBhbHNvIGNhbid0IGJlIHJlbW92ZWQgaWYgYW5vdGhlciBtb2R1bGUgdXNlcyBvbmUKKyAgICBvZiBpdHMgZXhwb3J0ZWQgc3ltYm9sczogc2VlIGJlbG93KS4gIEJlZm9yZSBjYWxsaW5nIGludG8gbW9kdWxlCisgICAgY29kZSwgeW91IHNob3VsZCBjYWxsIDxmdW5jdGlvbj50cnlfbW9kdWxlX2dldCgpPC9mdW5jdGlvbj4gb24KKyAgICB0aGF0IG1vZHVsZTogaWYgaXQgZmFpbHMsIHRoZW4gdGhlIG1vZHVsZSBpcyBiZWluZyByZW1vdmVkIGFuZCB5b3UKKyAgICBzaG91bGQgYWN0IGFzIGlmIGl0IHdhc24ndCB0aGVyZS4gIE90aGVyd2lzZSwgeW91IGNhbiBzYWZlbHkgZW50ZXIKKyAgICB0aGUgbW9kdWxlLCBhbmQgY2FsbCA8ZnVuY3Rpb24+bW9kdWxlX3B1dCgpPC9mdW5jdGlvbj4gd2hlbiB5b3UncmUKKyAgICBmaW5pc2hlZC4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICBNb3N0IHJlZ2lzdGVyYWJsZSBzdHJ1Y3R1cmVzIGhhdmUgYW4KKyAgIDxzdHJ1Y3RmaWVsZD5vd25lcjwvc3RydWN0ZmllbGQ+IGZpZWxkLCBzdWNoIGFzIGluIHRoZQorICAgPHN0cnVjdG5hbWU+ZmlsZV9vcGVyYXRpb25zPC9zdHJ1Y3RuYW1lPiBzdHJ1Y3R1cmUuIFNldCB0aGlzIGZpZWxkCisgICB0byB0aGUgbWFjcm8gPHN5bWJvbD5USElTX01PRFVMRTwvc3ltYm9sPi4KKyAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIAogIDwhLS0gYWRkIGluZm8gb24gbmV3LXN0eWxlIG1vZHVsZSByZWZjb3VudGluZyBoZXJlIC0tPgpAQCAtODIxLDcgKzg0Myw3IEBACiAgICAgVGhlcmUgaXMgYSBtYWNybyB0byBkbyB0aGlzOgogICAgIDxmdW5jdGlvbj53YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKTwvZnVuY3Rpb24+CiAKLSAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvc2NoZWQuaDwvZmlsZW5hbWU+IFRoZQorICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC93YWl0Lmg8L2ZpbGVuYW1lPiBUaGUKICAgICBmaXJzdCBhcmd1bWVudCBpcyB0aGUgd2FpdCBxdWV1ZSBoZWFkLCBhbmQgdGhlIHNlY29uZCBpcyBhbgogICAgIGV4cHJlc3Npb24gd2hpY2ggaXMgZXZhbHVhdGVkOyB0aGUgbWFjcm8gcmV0dXJucwogICAgIDxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gd2hlbiB0aGlzIGV4cHJlc3Npb24gaXMgdHJ1ZSwgb3IKQEAgLTg0NywxMCArODY5LDExIEBACiAgICA8cGFyYT4KICAgICBDYWxsIDxmdW5jdGlvbj53YWtlX3VwKCk8L2Z1bmN0aW9uPgogCi0gICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L3NjaGVkLmg8L2ZpbGVuYW1lPjssCisgICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L3dhaXQuaDwvZmlsZW5hbWU+OywKICAgICB3aGljaCB3aWxsIHdha2UgdXAgZXZlcnkgcHJvY2VzcyBpbiB0aGUgcXVldWUuICBUaGUgZXhjZXB0aW9uIGlzCiAgICAgaWYgb25lIGhhcyA8Y29uc3RhbnQ+VEFTS19FWENMVVNJVkU8L2NvbnN0YW50PiBzZXQsIGluIHdoaWNoIGNhc2UKLSAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBxdWV1ZSB3aWxsIG5vdCBiZSB3b2tlbi4KKyAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBxdWV1ZSB3aWxsIG5vdCBiZSB3b2tlbi4gIFRoZXJlIGFyZSBvdGhlciB2YXJpYW50cworICAgIG9mIHRoaXMgYmFzaWMgZnVuY3Rpb24gYXZhaWxhYmxlIGluIHRoZSBzYW1lIGhlYWRlci4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KICA8L2NoYXB0ZXI+CkBAIC04NjMsNyArODg2LDcgQEAKICAgIGZpcnN0IGNsYXNzIG9mIG9wZXJhdGlvbnMgd29yayBvbiA8dHlwZT5hdG9taWNfdDwvdHlwZT4KIAogICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2FzbS9hdG9taWMuaDwvZmlsZW5hbWU+OyB0aGlzCi0gICBjb250YWlucyBhIHNpZ25lZCBpbnRlZ2VyIChhdCBsZWFzdCAyNCBiaXRzIGxvbmcpLCBhbmQgeW91IG11c3QgdXNlCisgICBjb250YWlucyBhIHNpZ25lZCBpbnRlZ2VyIChhdCBsZWFzdCAzMiBiaXRzIGxvbmcpLCBhbmQgeW91IG11c3QgdXNlCiAgICB0aGVzZSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBvciByZWFkIGF0b21pY190IHZhcmlhYmxlcy4KICAgIDxmdW5jdGlvbj5hdG9taWNfcmVhZCgpPC9mdW5jdGlvbj4gYW5kCiAgICA8ZnVuY3Rpb24+YXRvbWljX3NldCgpPC9mdW5jdGlvbj4gZ2V0IGFuZCBzZXQgdGhlIGNvdW50ZXIsCkBAIC04ODIsMTMgKzkwNSwxMiBAQAogCiAgIDxwYXJhPgogICAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgc2xvd2VyIHRoYW4gbm9ybWFsIGFyaXRobWV0aWMsIGFuZAotICAgc28gc2hvdWxkIG5vdCBiZSB1c2VkIHVubmVjZXNzYXJpbHkuICBPbiBzb21lIHBsYXRmb3JtcyB0aGV5Ci0gICBhcmUgbXVjaCBzbG93ZXIsIGxpa2UgMzItYml0IFNwYXJjIHdoZXJlIHRoZXkgdXNlIGEgc3BpbmxvY2suCisgICBzbyBzaG91bGQgbm90IGJlIHVzZWQgdW5uZWNlc3NhcmlseS4KICAgPC9wYXJhPgogCiAgIDxwYXJhPgotICAgVGhlIHNlY29uZCBjbGFzcyBvZiBhdG9taWMgb3BlcmF0aW9ucyBpcyBhdG9taWMgYml0IG9wZXJhdGlvbnMgb24gYQotICAgPHR5cGU+bG9uZzwvdHlwZT4sIGRlZmluZWQgaW4KKyAgIFRoZSBzZWNvbmQgY2xhc3Mgb2YgYXRvbWljIG9wZXJhdGlvbnMgaXMgYXRvbWljIGJpdCBvcGVyYXRpb25zIG9uIGFuCisgICA8dHlwZT51bnNpZ25lZCBsb25nPC90eXBlPiwgZGVmaW5lZCBpbgogCiAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvYml0b3BzLmg8L2ZpbGVuYW1lPi4gIFRoZXNlCiAgICBvcGVyYXRpb25zIGdlbmVyYWxseSB0YWtlIGEgcG9pbnRlciB0byB0aGUgYml0IHBhdHRlcm4sIGFuZCBhIGJpdApAQCAtODk5LDcgKzkyMSw3IEBACiAgICA8ZnVuY3Rpb24+dGVzdF9hbmRfY2xlYXJfYml0KCk8L2Z1bmN0aW9uPiBhbmQKICAgIDxmdW5jdGlvbj50ZXN0X2FuZF9jaGFuZ2VfYml0KCk8L2Z1bmN0aW9uPiBkbyB0aGUgc2FtZSB0aGluZywKICAgIGV4Y2VwdCByZXR1cm4gdHJ1ZSBpZiB0aGUgYml0IHdhcyBwcmV2aW91c2x5IHNldDsgdGhlc2UgYXJlCi0gICBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB2ZXJ5IHNpbXBsZSBsb2NraW5nLgorICAgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYXRvbWljYWxseSBzZXR0aW5nIGZsYWdzLgogICA8L3BhcmE+CiAgIAogICA8cGFyYT4KQEAgLTkwNywxMiArOTI5LDYgQEAKICAgIHRoYW4gQklUU19QRVJfTE9ORy4gIFRoZSByZXN1bHRpbmcgYmVoYXZpb3IgaXMgc3RyYW5nZSBvbiBiaWctZW5kaWFuCiAgICBwbGF0Zm9ybXMgdGhvdWdoIHNvIGl0IGlzIGEgZ29vZCBpZGVhIG5vdCB0byBkbyB0aGlzLgogICA8L3BhcmE+Ci0KLSAgPHBhcmE+Ci0gICBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGJpdHMgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLCBhbmQgaW4KLSAgIHBhcnRpY3VsYXIsIHRoZSBiaXRmaWVsZCBwYXNzZWQgdG8gdGhlc2Ugb3BlcmF0aW9ucyBtdXN0IGJlIGF0Ci0gICBsZWFzdCBhcyBsYXJnZSBhcyBhIDx0eXBlPmxvbmc8L3R5cGU+LgotICA8L3BhcmE+CiAgPC9jaGFwdGVyPgogCiAgPGNoYXB0ZXIgaWQ9InN5bWJvbHMiPgpAQCAtOTMyLDExICs5NDgsOCBAQAogICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9tb2R1bGUuaDwvZmlsZW5hbWU+PC90aXRsZT4KIAogICAgPHBhcmE+Ci0gICAgVGhpcyBpcyB0aGUgY2xhc3NpYyBtZXRob2Qgb2YgZXhwb3J0aW5nIGEgc3ltYm9sLCBhbmQgaXQgd29ya3MKLSAgICBmb3IgYm90aCBtb2R1bGVzIGFuZCBub24tbW9kdWxlcy4gIEluIHRoZSBrZXJuZWwgYWxsIHRoZXNlCi0gICAgZGVjbGFyYXRpb25zIGFyZSBvZnRlbiBidW5kbGVkIGludG8gYSBzaW5nbGUgZmlsZSB0byBoZWxwCi0gICAgZ2Vua3N5bXMgKHdoaWNoIHNlYXJjaGVzIHNvdXJjZSBmaWxlcyBmb3IgdGhlc2UgZGVjbGFyYXRpb25zKS4KLSAgICBTZWUgdGhlIGNvbW1lbnQgb24gZ2Vua3N5bXMgYW5kIE1ha2VmaWxlcyBiZWxvdy4KKyAgICBUaGlzIGlzIHRoZSBjbGFzc2ljIG1ldGhvZCBvZiBleHBvcnRpbmcgYSBzeW1ib2w6IGR5bmFtaWNhbGx5CisgICAgbG9hZGVkIG1vZHVsZXMgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgc3ltYm9sIGFzIG5vcm1hbC4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KIApAQCAtOTQ5LDcgKzk2Miw4IEBACiAgICAgc3ltYm9scyBleHBvcnRlZCBieSA8ZnVuY3Rpb24+RVhQT1JUX1NZTUJPTF9HUEwoKTwvZnVuY3Rpb24+IGNhbgogICAgIG9ubHkgYmUgc2VlbiBieSBtb2R1bGVzIHdpdGggYQogICAgIDxmdW5jdGlvbj5NT0RVTEVfTElDRU5TRSgpPC9mdW5jdGlvbj4gdGhhdCBzcGVjaWZpZXMgYSBHUEwKLSAgICBjb21wYXRpYmxlIGxpY2Vuc2UuCisgICAgY29tcGF0aWJsZSBsaWNlbnNlLiAgSXQgaW1wbGllcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkCisgICAgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaXNzdWUsIGFuZCBub3QgcmVhbGx5IGFuIGludGVyZmFjZS4KICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KICA8L2NoYXB0ZXI+CkBAIC05NjIsMTIgKzk3NiwxMyBAQAogICAgIDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9saW51eC9saXN0Lmg8L2ZpbGVuYW1lPjwvdGl0bGU+CiAKICAgIDxwYXJhPgotICAgIFRoZXJlIGFyZSB0aHJlZSBzZXRzIG9mIGxpbmtlZC1saXN0IHJvdXRpbmVzIGluIHRoZSBrZXJuZWwKLSAgICBoZWFkZXJzLCBidXQgdGhpcyBvbmUgc2VlbXMgdG8gYmUgd2lubmluZyBvdXQgKGFuZCBMaW51cyBoYXMKLSAgICB1c2VkIGl0KS4gIElmIHlvdSBkb24ndCBoYXZlIHNvbWUgcGFydGljdWxhciBwcmVzc2luZyBuZWVkIGZvcgotICAgIGEgc2luZ2xlIGxpc3QsIGl0J3MgYSBnb29kIGNob2ljZS4gIEluIGZhY3QsIEkgZG9uJ3QgY2FyZQotICAgIHdoZXRoZXIgaXQncyBhIGdvb2QgY2hvaWNlIG9yIG5vdCwganVzdCB1c2UgaXQgc28gd2UgY2FuIGdldAotICAgIHJpZCBvZiB0aGUgb3RoZXJzLgorICAgIFRoZXJlIHVzZWQgdG8gYmUgdGhyZWUgc2V0cyBvZiBsaW5rZWQtbGlzdCByb3V0aW5lcyBpbiB0aGUga2VybmVsCisgICAgaGVhZGVycywgYnV0IHRoaXMgb25lIGlzIHRoZSB3aW5uZXIuICBJZiB5b3UgZG9uJ3QgaGF2ZSBzb21lCisgICAgcGFydGljdWxhciBwcmVzc2luZyBuZWVkIGZvciBhIHNpbmdsZSBsaXN0LCBpdCdzIGEgZ29vZCBjaG9pY2UuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIEluIHBhcnRpY3VsYXIsIDxmdW5jdGlvbj5saXN0X2Zvcl9lYWNoX2VudHJ5PC9mdW5jdGlvbj4gaXMgdXNlZnVsLgogICAgPC9wYXJhPgogICA8L3NlY3QxPgogCkBAIC05NzksMTQgKzk5NCwxMyBAQAogICAgIGNvbnZlbnRpb24sIGFuZCByZXR1cm4gPHJldHVybnZhbHVlPjA8L3JldHVybnZhbHVlPiBmb3Igc3VjY2VzcywKICAgICBhbmQgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIKICAgICAoZWcuIDxyZXR1cm52YWx1ZT4tRUZBVUxUPC9yZXR1cm52YWx1ZT4pIGZvciBmYWlsdXJlLiAgVGhpcyBjYW4gYmUKLSAgICB1bmludHVpdGl2ZSBhdCBmaXJzdCwgYnV0IGl0J3MgZmFpcmx5IHdpZGVzcHJlYWQgaW4gdGhlIG5ldHdvcmtpbmcKLSAgICBjb2RlLCBmb3IgZXhhbXBsZS4KKyAgICB1bmludHVpdGl2ZSBhdCBmaXJzdCwgYnV0IGl0J3MgZmFpcmx5IHdpZGVzcHJlYWQgaW4gdGhlIGtlcm5lbC4KICAgIDwvcGFyYT4KIAogICAgPHBhcmE+Ci0gICAgVGhlIGZpbGVzeXN0ZW0gY29kZSB1c2VzIDxmdW5jdGlvbj5FUlJfUFRSKCk8L2Z1bmN0aW9uPgorICAgIFVzaW5nIDxmdW5jdGlvbj5FUlJfUFRSKCk8L2Z1bmN0aW9uPgogCi0gICAgPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2xpbnV4L2ZzLmg8L2ZpbGVuYW1lPjsgdG8KKyAgICA8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvZXJyLmg8L2ZpbGVuYW1lPjsgdG8KICAgICBlbmNvZGUgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgaW50byBhIHBvaW50ZXIsIGFuZAogICAgIDxmdW5jdGlvbj5JU19FUlIoKTwvZnVuY3Rpb24+IGFuZCA8ZnVuY3Rpb24+UFRSX0VSUigpPC9mdW5jdGlvbj4KICAgICB0byBnZXQgaXQgYmFjayBvdXQgYWdhaW46IGF2b2lkcyBhIHNlcGFyYXRlIHBvaW50ZXIgcGFyYW1ldGVyIGZvcgpAQCAtMTA0MCw3ICsxMDU0LDcgQEAKICAgICBzdXBwb3J0ZWQsIGR1ZSB0byBsYWNrIG9mIGdlbmVyYWwgdXNlLCBidXQgdGhlIGZvbGxvd2luZyBhcmUKICAgICBjb25zaWRlcmVkIHN0YW5kYXJkIChzZWUgdGhlIEdDQyBpbmZvIHBhZ2Ugc2VjdGlvbiAiQwogICAgIEV4dGVuc2lvbnMiIGZvciBtb3JlIGRldGFpbHMgLSBZZXMsIHJlYWxseSB0aGUgaW5mbyBwYWdlLCB0aGUKLSAgICBtYW4gcGFnZSBpcyBvbmx5IGEgc2hvcnQgc3VtbWFyeSBvZiB0aGUgc3R1ZmYgaW4gaW5mbyk6CisgICAgbWFuIHBhZ2UgaXMgb25seSBhIHNob3J0IHN1bW1hcnkgb2YgdGhlIHN0dWZmIGluIGluZm8pLgogICAgPC9wYXJhPgogICAgPGl0ZW1pemVkbGlzdD4KICAgICA8bGlzdGl0ZW0+CkBAIC0xMDkxLDcgKzExMDUsNyBAQAogICAgIDwvbGlzdGl0ZW0+CiAgICAgPGxpc3RpdGVtPgogICAgICA8cGFyYT4KLSAgICAgIEZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MgKF9fRlVOQ1RJT05fXykKKyAgICAgIEZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MgKF9fZnVuY19fKS4KICAgICAgPC9wYXJhPgogICAgIDwvbGlzdGl0ZW0+CiAgICAgPGxpc3RpdGVtPgpAQCAtMTE2NCw2MyArMTE3OCwzNSBAQAogICAgPGxpc3RpdGVtPgogICAgIDxwYXJhPgogICAgICBVc3VhbGx5IHlvdSB3YW50IGEgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIHlvdXIga2VybmVsIGhhY2suCi0gICAgIEVkaXQgPGZpbGVuYW1lPkNvbmZpZy5pbjwvZmlsZW5hbWU+IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkKLSAgICAgKGJ1dCB1bmRlciA8ZmlsZW5hbWU+YXJjaC88L2ZpbGVuYW1lPiBpdCdzIGNhbGxlZAotICAgICA8ZmlsZW5hbWU+Y29uZmlnLmluPC9maWxlbmFtZT4pLiAgVGhlIENvbmZpZyBMYW5ndWFnZSB1c2VkIGlzIG5vdAotICAgICBiYXNoLCBldmVuIHRob3VnaCBpdCBsb29rcyBsaWtlIGJhc2g7IHRoZSBzYWZlIHdheSBpcyB0byB1c2Ugb25seQotICAgICB0aGUgY29uc3RydWN0cyB0aGF0IHlvdSBhbHJlYWR5IHNlZSBpbgotICAgICA8ZmlsZW5hbWU+Q29uZmlnLmluPC9maWxlbmFtZT4gZmlsZXMgKHNlZQotICAgICA8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQ8L2ZpbGVuYW1lPikuCi0gICAgIEl0J3MgZ29vZCB0byBydW4gIm1ha2UgeGNvbmZpZyIgYXQgbGVhc3Qgb25jZSB0byB0ZXN0IChiZWNhdXNlCi0gICAgIGl0J3MgdGhlIG9ubHkgb25lIHdpdGggYSBzdGF0aWMgcGFyc2VyKS4KLSAgICA8L3BhcmE+Ci0KLSAgICA8cGFyYT4KLSAgICAgVmFyaWFibGVzIHdoaWNoIGNhbiBiZSBZIG9yIE4gdXNlIDx0eXBlPmJvb2w8L3R5cGU+IGZvbGxvd2VkIGJ5IGEKLSAgICAgdGFnbGluZSBhbmQgdGhlIGNvbmZpZyBkZWZpbmUgbmFtZSAod2hpY2ggbXVzdCBzdGFydCB3aXRoCi0gICAgIENPTkZJR18pLiAgVGhlIDx0eXBlPnRyaXN0YXRlPC90eXBlPiBmdW5jdGlvbiBpcyB0aGUgc2FtZSwgYnV0Ci0gICAgIGFsbG93cyB0aGUgYW5zd2VyIE0gKHdoaWNoIGRlZmluZXMKLSAgICAgPHN5bWJvbD5DT05GSUdfZm9vX01PRFVMRTwvc3ltYm9sPiBpbiB5b3VyIHNvdXJjZSwgaW5zdGVhZCBvZgotICAgICA8c3ltYm9sPkNPTkZJR19GT088L3N5bWJvbD4pIGlmIDxzeW1ib2w+Q09ORklHX01PRFVMRVM8L3N5bWJvbD4KLSAgICAgaXMgZW5hYmxlZC4KKyAgICAgRWRpdCA8ZmlsZW5hbWU+S2NvbmZpZzwvZmlsZW5hbWU+IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkuCisgICAgIFRoZSBDb25maWcgbGFuZ3VhZ2UgaXMgc2ltcGxlIHRvIHVzZSBieSBjdXQgYW5kIHBhc3RlLCBhbmQgdGhlcmUncworICAgICBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGluCisgICAgIDxmaWxlbmFtZT5Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dDwvZmlsZW5hbWU+LgogICAgIDwvcGFyYT4KIAogICAgIDxwYXJhPgogICAgICBZb3UgbWF5IHdlbGwgd2FudCB0byBtYWtlIHlvdXIgQ09ORklHIG9wdGlvbiBvbmx5IHZpc2libGUgaWYKICAgICAgPHN5bWJvbD5DT05GSUdfRVhQRVJJTUVOVEFMPC9zeW1ib2w+IGlzIGVuYWJsZWQ6IHRoaXMgc2VydmVzIGFzIGEKICAgICAgd2FybmluZyB0byB1c2Vycy4gIFRoZXJlIG1hbnkgb3RoZXIgZmFuY3kgdGhpbmdzIHlvdSBjYW4gZG86IHNlZQotICAgICB0aGUgdmFyaW91cyA8ZmlsZW5hbWU+Q29uZmlnLmluPC9maWxlbmFtZT4gZmlsZXMgZm9yIGlkZWFzLgorICAgICB0aGUgdmFyaW91cyA8ZmlsZW5hbWU+S2NvbmZpZzwvZmlsZW5hbWU+IGZpbGVzIGZvciBpZGVhcy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgSW4geW91ciBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9uLCBtYWtlIHN1cmUgeW91IGFkZHJlc3MgYm90aCB0aGUKKyAgICAgZXhwZXJ0IHVzZXIgYW5kIHRoZSB1c2VyIHdobyBrbm93cyBub3RoaW5nIGFib3V0IHlvdXIgZmVhdHVyZS4gIE1lbnRpb24KKyAgICAgaW5jb21wYXRpYmlsaXRpZXMgYW5kIGlzc3VlcyBoZXJlLiAgPGVtcGhhc2lzPiBEZWZpbml0ZWx5CisgICAgIDwvZW1waGFzaXM+IGVuZCB5b3VyIGRlc2NyaXB0aW9uIHdpdGggPHF1b3RlPiBpZiBpbiBkb3VidCwgc2F5IE4KKyAgICAgPC9xdW90ZT4gKG9yLCBvY2Nhc2lvbmFsbHksIGBZJyk7IHRoaXMgaXMgZm9yIHBlb3BsZSB3aG8gaGF2ZSBubworICAgICBpZGVhIHdoYXQgeW91IGFyZSB0YWxraW5nIGFib3V0LgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKICAgIDxsaXN0aXRlbT4KICAgICA8cGFyYT4KICAgICAgRWRpdCB0aGUgPGZpbGVuYW1lPk1ha2VmaWxlPC9maWxlbmFtZT46IHRoZSBDT05GSUcgdmFyaWFibGVzIGFyZQotICAgICBleHBvcnRlZCBoZXJlIHNvIHlvdSBjYW4gY29uZGl0aW9uYWxpemUgY29tcGlsYXRpb24gd2l0aCBgaWZlcScuCi0gICAgIElmIHlvdXIgZmlsZSBleHBvcnRzIHN5bWJvbHMgdGhlbiBhZGQgdGhlIG5hbWVzIHRvCi0gICAgIDx2YXJuYW1lPmV4cG9ydC1vYmpzPC92YXJuYW1lPiBzbyB0aGF0IGdlbmtzeW1zIHdpbGwgZmluZCB0aGVtLgotICAgICA8Y2F1dGlvbj4KLSAgICAgIDxwYXJhPgotICAgICAgIFRoZXJlIGlzIGEgcmVzdHJpY3Rpb24gb24gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0gdGhhdCBvYmplY3RzCi0gICAgICAgd2hpY2ggZXhwb3J0IHN5bWJvbHMgbXVzdCBoYXZlIGdsb2JhbGx5IHVuaXF1ZSBuYW1lcy4KLSAgICAgICBJZiB5b3VyIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgZ2xvYmFsbHkgdW5pcXVlIG5hbWUgdGhlbiB0aGUKLSAgICAgICBzdGFuZGFyZCBmaXggaXMgdG8gbW92ZSB0aGUKLSAgICAgICA8ZnVuY3Rpb24+RVhQT1JUX1NZTUJPTCgpPC9mdW5jdGlvbj4gc3RhdGVtZW50cyB0byB0aGVpciBvd24KLSAgICAgICBvYmplY3Qgd2l0aCBhIHVuaXF1ZSBuYW1lLgotICAgICAgIFRoaXMgaXMgd2h5IHNldmVyYWwgc3lzdGVtcyBoYXZlIHNlcGFyYXRlIGV4cG9ydGluZyBvYmplY3RzLAotICAgICAgIHVzdWFsbHkgc3VmZml4ZWQgd2l0aCBrc3ltcy4KLSAgICAgIDwvcGFyYT4KLSAgICAgPC9jYXV0aW9uPgotICAgIDwvcGFyYT4KLSAgIDwvbGlzdGl0ZW0+Ci0KLSAgIDxsaXN0aXRlbT4KLSAgICA8cGFyYT4KLSAgICAgRG9jdW1lbnQgeW91ciBvcHRpb24gaW4gRG9jdW1lbnRhdGlvbi9Db25maWd1cmUuaGVscC4gIE1lbnRpb24KLSAgICAgaW5jb21wYXRpYmlsaXRpZXMgYW5kIGlzc3VlcyBoZXJlLiAgPGVtcGhhc2lzPiBEZWZpbml0ZWx5Ci0gICAgIDwvZW1waGFzaXM+IGVuZCB5b3VyIGRlc2NyaXB0aW9uIHdpdGggPHF1b3RlPiBpZiBpbiBkb3VidCwgc2F5IE4KLSAgICAgPC9xdW90ZT4gKG9yLCBvY2Nhc2lvbmFsbHksIGBZJyk7IHRoaXMgaXMgZm9yIHBlb3BsZSB3aG8gaGF2ZSBubwotICAgICBpZGVhIHdoYXQgeW91IGFyZSB0YWxraW5nIGFib3V0LgorICAgICBleHBvcnRlZCBoZXJlIHNvIHlvdSBjYW4gdXN1YWxseSBqdXN0IGFkZCBhICJvYmotJChDT05GSUdfeHh4KSArPQorICAgICB4eHgubyIgbGluZS4gIFRoZSBzeW50YXggaXMgZG9jdW1lbnRlZCBpbgorICAgICA8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dDwvZmlsZW5hbWU+LgogICAgIDwvcGFyYT4KICAgIDwvbGlzdGl0ZW0+CiAKQEAgLTEyNTMsMjAgKzEyMzksMTIgQEAKICAgPC9wYXJhPgogCiAgIDxwYXJhPgotICAgPGZpbGVuYW1lPmluY2x1ZGUvbGludXgvYnJsb2NrLmg6PC9maWxlbmFtZT4KKyAgIDxmaWxlbmFtZT5pbmNsdWRlL2FzbS1pMzg2L2RlbGF5Lmg6PC9maWxlbmFtZT4KICAgPC9wYXJhPgogICA8cHJvZ3JhbWxpc3Rpbmc+Ci1leHRlcm4gaW5saW5lIHZvaWQgYnJfcmVhZF9sb2NrIChlbnVtIGJybG9ja19pbmRpY2VzIGlkeCkKLXsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBjYXVzZXMgYSBsaW5rLXRpbWUgYnVnIG1lc3NhZ2UgaWYgYW4KLSAgICAgICAgICogaW52YWxpZCBpbmRleCBpcyB1c2VkOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGlkeCA+PSBfX0JSX0VORCkKLSAgICAgICAgICAgICAgICBfX2JyX2xvY2tfdXNhZ2VfYnVnKCk7Ci0KLSAgICAgICAgcmVhZF9sb2NrKCZhbXA7X19icmxvY2tfYXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXVtpZHhdKTsKLX0KKyNkZWZpbmUgbmRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKKyAgICAgICAgKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKKyAgICAgICAgX19uZGVsYXkobikpCiAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKICAgPHBhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWNhYm9vay50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21jYWJvb2sudG1wbAppbmRleCA0MzY3ZjQ2Li40MmE3NjBjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWNhYm9vay50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tY2Fib29rLnRtcGwKQEAgLTk2LDcgKzk2LDcgQEAKIAogICA8Y2hhcHRlciBpZD0icHViZnVuY3Rpb25zIj4KICAgICAgPHRpdGxlPlB1YmxpYyBGdW5jdGlvbnMgUHJvdmlkZWQ8L3RpdGxlPgotIUVhcmNoL2kzODYva2VybmVsL21jYS5jCishRWRyaXZlcnMvbWNhL21jYS1sZWdhY3kuYwogICA8L2NoYXB0ZXI+CiAKICAgPGNoYXB0ZXIgaWQ9ImRtYWZ1bmN0aW9ucyI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdXNiLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdXNiLnRtcGwKaW5kZXggZjNlZjBiZi4uNzA1YzQ0MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3VzYi50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay91c2IudG1wbApAQCAtODQxLDcgKzg0MSw3IEBACiAJCSAgICBGaWxlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIG5vdCB1cGRhdGVkIGJ5IHRoaXMgcmVxdWVzdC4KIAkJICAgIDwvcGFyYT48cGFyYT4KIAkJICAgIFRob3NlIHN0cnVjdCBtZW1iZXJzIGFyZSBmcm9tIHNvbWUgaW50ZXJmYWNlIGRlc2NyaXB0b3IKLQkJICAgIGFwcGx5aW5nIHRvIHRoZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorCQkgICAgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KIAkJICAgIFRoZSBpbnRlcmZhY2UgbnVtYmVyIGlzIHRoZSBiSW50ZXJmYWNlTnVtYmVyIHZhbHVlLCBhbmQKIAkJICAgIHRoZSBhbHRzZXR0aW5nIG51bWJlciBpcyB0aGUgYkFsdGVybmF0ZVNldHRpbmcgdmFsdWUuCiAJCSAgICAoVGhpcyByZXNldHMgZWFjaCBlbmRwb2ludCBpbiB0aGUgaW50ZXJmYWNlLikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSVBNSS50eHQgYi9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CmluZGV4IDg0ZDNkNGQuLmJmMWNmOThkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vSVBNSS50eHQKQEAgLTYwNSwxMiArNjA1LDEzIEBACiBpdCB3aWxsIHNlbmQgdGhlIHByb3BlciBJUE1JIGNvbW1hbmRzIHRvIGRvIHRoaXMuICBUaGlzIGlzIHN1cHBvcnRlZCBvbgogc2V2ZXJhbCBwbGF0Zm9ybXMuCiAKLVRoZXJlIGlzIGEgbW9kdWxlIHBhcmFtZXRlciBuYW1lZCAicG93ZXJvZmZfY29udHJvbCIgdGhhdCBtYXkgZWl0aGVyIGJlIHplcm8KLShkbyBhIHBvd2VyIGRvd24pIG9yIDIgKGRvIGEgcG93ZXIgY3ljbGUsIHBvd2VyIHRoZSBzeXN0ZW0gb2ZmLCB0aGVuIHBvd2VyCi1pdCBvbiBpbiBhIGZldyBzZWNvbmRzKS4gIFNldHRpbmcgaXBtaV9wb3dlcm9mZi5wb3dlcm9mZl9jb250cm9sPXggd2lsbCBkbwotdGhlIHNhbWUgdGhpbmcgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGUgcGFyYW1ldGVyIGlzIGFsc28gYXZhaWxhYmxlCi12aWEgdGhlIHByb2MgZmlsZXN5c3RlbSBpbiAvcHJvYy9pcG1pL3Bvd2Vyb2ZmX2NvbnRyb2wuICBOb3RlIHRoYXQgaWYgdGhlCi1zeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBwb3dlciBjeWNsaW5nLCBpdCB3aWxsIGFsd2F5cyB0byB0aGUgcG93ZXIgb2ZmLgorVGhlcmUgaXMgYSBtb2R1bGUgcGFyYW1ldGVyIG5hbWVkICJwb3dlcm9mZl9wb3dlcmN5Y2xlIiB0aGF0IG1heQorZWl0aGVyIGJlIHplcm8gKGRvIGEgcG93ZXIgZG93bikgb3Igbm9uLXplcm8gKGRvIGEgcG93ZXIgY3ljbGUsIHBvd2VyCit0aGUgc3lzdGVtIG9mZiwgdGhlbiBwb3dlciBpdCBvbiBpbiBhIGZldyBzZWNvbmRzKS4gIFNldHRpbmcKK2lwbWlfcG93ZXJvZmYucG93ZXJvZmZfY29udHJvbD14IHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcgb24gdGhlIGtlcm5lbAorY29tbWFuZCBsaW5lLiAgVGhlIHBhcmFtZXRlciBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIHByb2MgZmlsZXN5c3RlbQoraW4gL3Byb2Mvc3lzL2Rldi9pcG1pL3Bvd2Vyb2ZmX3Bvd2VyY3ljbGUuICBOb3RlIHRoYXQgaWYgdGhlIHN5c3RlbQorZG9lcyBub3Qgc3VwcG9ydCBwb3dlciBjeWNsaW5nLCBpdCB3aWxsIGFsd2F5cyBkbyB0aGUgcG93ZXIgb2ZmLgogCiBOb3RlIHRoYXQgaWYgeW91IGhhdmUgQUNQSSBlbmFibGVkLCB0aGUgc3lzdGVtIHdpbGwgcHJlZmVyIHVzaW5nIEFDUEkgdG8KIHBvd2VyIG9mZi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dAppbmRleCBkNTAzMmViLi42M2VkYzVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0CkBAIC00MzAsNyArNDMwLDcgQEAKIE1TSS1jYXBhYmxlIGhhcmR3YXJlIGlzIHJlc3BvbnNpYmxlIGZvciB3aGV0aGVyIGNhbGxpbmcKIHBjaV9lbmFibGVfbXNpIG9yIG5vdC4gQSByZXR1cm4gb2YgemVybyBpbmRpY2F0ZXMgdGhlIGtlcm5lbAogc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVzIHRoZSBNU0kvTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgb2YgdGhlCi1kZXZpY2UgZnVudGlvbi4gVGhlIGRldmljZSBmdW5jdGlvbiBpcyBub3cgcnVubmluZyBvbiBNU0kvTVNJLVggbW9kZS4KK2RldmljZSBmdW5jdGlvbi4gVGhlIGRldmljZSBmdW5jdGlvbiBpcyBub3cgcnVubmluZyBvbiBNU0kvTVNJLVggbW9kZS4KIAogNS42IEhvdyB0byB0ZWxsIHdoZXRoZXIgTVNJL01TSS1YIGlzIGVuYWJsZWQgb24gZGV2aWNlIGZ1bmN0aW9uCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL05NSS1SQ1UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvTk1JLVJDVS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MzRhNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL05NSS1SQ1UudHh0CkBAIC0wLDAgKzEsMTEyIEBACitVc2luZyBSQ1UgdG8gUHJvdGVjdCBEeW5hbWljIE5NSSBIYW5kbGVycworCisKK0FsdGhvdWdoIFJDVSBpcyB1c3VhbGx5IHVzZWQgdG8gcHJvdGVjdCByZWFkLW1vc3RseSBkYXRhIHN0cnVjdHVyZXMsCitpdCBpcyBwb3NzaWJsZSB0byB1c2UgUkNVIHRvIHByb3ZpZGUgZHluYW1pYyBub24tbWFza2FibGUgaW50ZXJydXB0CitoYW5kbGVycywgYXMgd2VsbCBhcyBkeW5hbWljIGlycSBoYW5kbGVycy4gIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzCitob3cgdG8gZG8gdGhpcywgZHJhd2luZyBsb29zZWx5IGZyb20gWndhbmUgTXdhaWthbWJvJ3MgTk1JLXRpbWVyCit3b3JrIGluICJhcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jIiBhbmQgaW4KKyJhcmNoL2kzODYva2VybmVsL3RyYXBzLmMiLgorCitUaGUgcmVsZXZhbnQgcGllY2VzIG9mIGNvZGUgYXJlIGxpc3RlZCBiZWxvdywgZWFjaCBmb2xsb3dlZCBieSBhCiticmllZiBleHBsYW5hdGlvbi4KKworCXN0YXRpYyBpbnQgZHVtbXlfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQorCXsKKwkJcmV0dXJuIDA7CisJfQorCitUaGUgZHVtbXlfbm1pX2NhbGxiYWNrKCkgZnVuY3Rpb24gaXMgYSAiZHVtbXkiIE5NSSBoYW5kbGVyIHRoYXQgZG9lcworbm90aGluZywgYnV0IHJldHVybnMgemVybywgdGh1cyBzYXlpbmcgdGhhdCBpdCBkaWQgbm90aGluZywgYWxsb3dpbmcKK3RoZSBOTUkgaGFuZGxlciB0byB0YWtlIHRoZSBkZWZhdWx0IG1hY2hpbmUtc3BlY2lmaWMgYWN0aW9uLgorCisJc3RhdGljIG5taV9jYWxsYmFja190IG5taV9jYWxsYmFjayA9IGR1bW15X25taV9jYWxsYmFjazsKKworVGhpcyBubWlfY2FsbGJhY2sgdmFyaWFibGUgaXMgYSBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgY3VycmVudAorTk1JIGhhbmRsZXIuCisKKwlmYXN0Y2FsbCB2b2lkIGRvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKKwl7CisJCWludCBjcHU7CisKKwkJbm1pX2VudGVyKCk7CisKKwkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQkrK25taV9jb3VudChjcHUpOworCisJCWlmICghcmN1X2RlcmVmZXJlbmNlKG5taV9jYWxsYmFjaykocmVncywgY3B1KSkKKwkJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOworCisJCW5taV9leGl0KCk7CisJfQorCitUaGUgZG9fbm1pKCkgZnVuY3Rpb24gcHJvY2Vzc2VzIGVhY2ggTk1JLiAgSXQgZmlyc3QgZGlzYWJsZXMgcHJlZW1wdGlvbgoraW4gdGhlIHNhbWUgd2F5IHRoYXQgYSBoYXJkd2FyZSBpcnEgd291bGQsIHRoZW4gaW5jcmVtZW50cyB0aGUgcGVyLUNQVQorY291bnQgb2YgTk1Jcy4gIEl0IHRoZW4gaW52b2tlcyB0aGUgTk1JIGhhbmRsZXIgc3RvcmVkIGluIHRoZSBubWlfY2FsbGJhY2sKK2Z1bmN0aW9uIHBvaW50ZXIuICBJZiB0aGlzIGhhbmRsZXIgcmV0dXJucyB6ZXJvLCBkb19ubWkoKSBpbnZva2VzIHRoZQorZGVmYXVsdF9kb19ubWkoKSBmdW5jdGlvbiB0byBoYW5kbGUgYSBtYWNoaW5lLXNwZWNpZmljIE5NSS4gIEZpbmFsbHksCitwcmVlbXB0aW9uIGlzIHJlc3RvcmVkLgorCitTdHJpY3RseSBzcGVha2luZywgcmN1X2RlcmVmZXJlbmNlKCkgaXMgbm90IG5lZWRlZCwgc2luY2UgdGhpcyBjb2RlIHJ1bnMKK29ubHkgb24gaTM4Niwgd2hpY2ggZG9lcyBub3QgbmVlZCByY3VfZGVyZWZlcmVuY2UoKSBhbnl3YXkuICBIb3dldmVyLAoraXQgaXMgYSBnb29kIGRvY3VtZW50YXRpb24gYWlkLCBwYXJ0aWN1bGFybHkgZm9yIGFueW9uZSBhdHRlbXB0aW5nIHRvCitkbyBzb21ldGhpbmcgc2ltaWxhciBvbiBBbHBoYS4KKworUXVpY2sgUXVpejogIFdoeSBtaWdodCB0aGUgcmN1X2RlcmVmZXJlbmNlKCkgYmUgbmVjZXNzYXJ5IG9uIEFscGhhLAorCSAgICAgZ2l2ZW4gdGhhdCB0aGUgY29kZSByZWZlcmVuY2VkIGJ5IHRoZSBwb2ludGVyIGlzIHJlYWQtb25seT8KKworCitCYWNrIHRvIHRoZSBkaXNjdXNzaW9uIG9mIE5NSSBhbmQgUkNVLi4uCisKKwl2b2lkIHNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrX3QgY2FsbGJhY2spCisJeworCQlyY3VfYXNzaWduX3BvaW50ZXIobm1pX2NhbGxiYWNrLCBjYWxsYmFjayk7CisJfQorCitUaGUgc2V0X25taV9jYWxsYmFjaygpIGZ1bmN0aW9uIHJlZ2lzdGVycyBhbiBOTUkgaGFuZGxlci4gIE5vdGUgdGhhdCBhbnkKK2RhdGEgdGhhdCBpcyB0byBiZSB1c2VkIGJ5IHRoZSBjYWxsYmFjayBtdXN0IGJlIGluaXRpYWxpemVkIHVwIC1iZWZvcmUtCit0aGUgY2FsbCB0byBzZXRfbm1pX2NhbGxiYWNrKCkuICBPbiBhcmNoaXRlY3R1cmVzIHRoYXQgZG8gbm90IG9yZGVyCit3cml0ZXMsIHRoZSByY3VfYXNzaWduX3BvaW50ZXIoKSBlbnN1cmVzIHRoYXQgdGhlIE5NSSBoYW5kbGVyIHNlZXMgdGhlCitpbml0aWFsaXplZCB2YWx1ZXMuCisKKwl2b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKQorCXsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5taV9jYWxsYmFjaywgZHVtbXlfbm1pX2NhbGxiYWNrKTsKKwl9CisKK1RoaXMgZnVuY3Rpb24gdW5yZWdpc3RlcnMgYW4gTk1JIGhhbmRsZXIsIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwKK2R1bW15X25taV9oYW5kbGVyKCkuICBIb3dldmVyLCB0aGVyZSBtYXkgd2VsbCBiZSBhbiBOTUkgaGFuZGxlcgorY3VycmVudGx5IGV4ZWN1dGluZyBvbiBzb21lIG90aGVyIENQVS4gIFdlIHRoZXJlZm9yZSBjYW5ub3QgZnJlZQordXAgYW55IGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBvbGQgTk1JIGhhbmRsZXIgdW50aWwgZXhlY3V0aW9uCitvZiBpdCBjb21wbGV0ZXMgb24gYWxsIG90aGVyIENQVXMuCisKK09uZSB3YXkgdG8gYWNjb21wbGlzaCB0aGlzIGlzIHZpYSBzeW5jaHJvbml6ZV9zY2hlZCgpLCBwZXJoYXBzIGFzCitmb2xsb3dzOgorCisJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJc3luY2hyb25pemVfc2NoZWQoKTsKKwlrZnJlZShteV9ubWlfZGF0YSk7CisKK1RoaXMgd29ya3MgYmVjYXVzZSBzeW5jaHJvbml6ZV9zY2hlZCgpIGJsb2NrcyB1bnRpbCBhbGwgQ1BVcyBjb21wbGV0ZQorYW55IHByZWVtcHRpb24tZGlzYWJsZWQgc2VnbWVudHMgb2YgY29kZSB0aGF0IHRoZXkgd2VyZSBleGVjdXRpbmcuCitTaW5jZSBOTUkgaGFuZGxlcnMgZGlzYWJsZSBwcmVlbXB0aW9uLCBzeW5jaHJvbml6ZV9zY2hlZCgpIGlzIGd1YXJhbnRlZWQKK25vdCB0byByZXR1cm4gdW50aWwgYWxsIG9uZ29pbmcgTk1JIGhhbmRsZXJzIGV4aXQuICBJdCBpcyB0aGVyZWZvcmUgc2FmZQordG8gZnJlZSB1cCB0aGUgaGFuZGxlcidzIGRhdGEgYXMgc29vbiBhcyBzeW5jaHJvbml6ZV9zY2hlZCgpIHJldHVybnMuCisKKworQW5zd2VyIHRvIFF1aWNrIFF1aXoKKworCVdoeSBtaWdodCB0aGUgcmN1X2RlcmVmZXJlbmNlKCkgYmUgbmVjZXNzYXJ5IG9uIEFscGhhLCBnaXZlbgorCXRoYXQgdGhlIGNvZGUgcmVmZXJlbmNlZCBieSB0aGUgcG9pbnRlciBpcyByZWFkLW9ubHk/CisKKwlBbnN3ZXI6IFRoZSBjYWxsZXIgdG8gc2V0X25taV9jYWxsYmFjaygpIG1pZ2h0IHdlbGwgaGF2ZQorCQlpbml0aWFsaXplZCBzb21lIGRhdGEgdGhhdCBpcyB0byBiZSB1c2VkIGJ5IHRoZQorCQluZXcgTk1JIGhhbmRsZXIuICBJbiB0aGlzIGNhc2UsIHRoZSByY3VfZGVyZWZlcmVuY2UoKQorCQl3b3VsZCBiZSBuZWVkZWQsIGJlY2F1c2Ugb3RoZXJ3aXNlIGEgQ1BVIHRoYXQgcmVjZWl2ZWQKKwkJYW4gTk1JIGp1c3QgYWZ0ZXIgdGhlIG5ldyBoYW5kbGVyIHdhcyBzZXQgbWlnaHQgc2VlCisJCXRoZSBwb2ludGVyIHRvIHRoZSBuZXcgTk1JIGhhbmRsZXIsIGJ1dCB0aGUgb2xkCisJCXByZS1pbml0aWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBoYW5kbGVyJ3MgZGF0YS4KKworCQlNb3JlIGltcG9ydGFudCwgdGhlIHJjdV9kZXJlZmVyZW5jZSgpIG1ha2VzIGl0IGNsZWFyCisJCXRvIHNvbWVvbmUgcmVhZGluZyB0aGUgY29kZSB0aGF0IHRoZSBwb2ludGVyIGlzIGJlaW5nCisJCXByb3RlY3RlZCBieSBSQ1UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9SVEZQLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CmluZGV4IDljNmQ0NTAuLmZjYmNiYzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CkBAIC0yLDcgKzIsOCBAQAogCiAKIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIFJDVS1yZWxhdGVkIHB1YmxpY2F0aW9ucywgYW5kIGlzIGZvbGxvd2VkIGJ5Ci10aGUgY29ycmVzcG9uZGluZyBiaWJ0ZXggZW50cmllcy4KK3RoZSBjb3JyZXNwb25kaW5nIGJpYnRleCBlbnRyaWVzLiAgQSBudW1iZXIgb2YgdGhlIHB1YmxpY2F0aW9ucyBtYXkKK2JlIGZvdW5kIGF0IGh0dHA6Ly93d3cucmRyb3AuY29tL3VzZXJzL3BhdWxtY2svUkNVLy4KIAogVGhlIGZpcnN0IHRoaW5nIHJlc2VtYmxpbmcgUkNVIHdhcyBwdWJsaXNoZWQgaW4gMTk4MCwgd2hlbiBLdW5nIGFuZCBMZWhtYW4KIFtLdW5nODBdIHJlY29tbWVuZGVkIHVzZSBvZiBhIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGRlZmVyIGRlc3RydWN0aW9uCkBAIC0xMTMsNiArMTE0LDEwIEBACiBhbmQgYSBwYXBlciBkZXNjcmliaW5nIFNFTGludXggcGVyZm9ybWFuY2Ugd2l0aCBSQ1UgW0phbWVzTW9ycmlzMDRiXS4KIAogCisyMDA1IGhhcyBzZWVuIGZ1cnRoZXIgYWRhcHRhdGlvbiBvZiBSQ1UgdG8gcmVhbHRpbWUgdXNlLCBwZXJtaXR0aW5nCitwcmVlbXB0aW9uIG9mIFJDVSByZWFsdGltZSBjcml0aWNhbCBzZWN0aW9ucyBbUGF1bE1jS2VubmV5MDVhLAorUGF1bE1jS2VubmV5MDViXS4KKwogQmlidGV4IEVudHJpZXMKIAogQGFydGljbGV7S3VuZzgwCkBAIC00MTAsMyArNDE1LDMyIEBACiBcdXJse2h0dHA6Ly93d3cubGl2ZWpvdXJuYWwuY29tL3VzZXJzL2phbWVzX21vcnJpcy8yMTUzLmh0bWx9CiBbVmlld2VkIERlY2VtYmVyIDEwLCAyMDA0XSIKIH0KKworQHVucHVibGlzaGVke1BhdWxNY0tlbm5leTA1YQorLEF1dGhvcj0iUGF1bCBFLiBNY0tlbm5leSIKKyxUaXRsZT0ie1tSRkNdfSB7UkNVfSBhbmQge0NPTkZJR1xfUFJFRU1QVFxfUlR9IHByb2dyZXNzIgorLG1vbnRoPSJNYXkiCisseWVhcj0iMjAwNSIKKyxub3RlPSJBdmFpbGFibGU6CitcdXJse2h0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDUvNS85LzE4NX0KK1tWaWV3ZWQgTWF5IDEzLCAyMDA1XSIKKyxhbm5vdGF0aW9uPSIKKwlGaXJzdCBwdWJsaWNhdGlvbiBvZiB3b3JraW5nIGxvY2stYmFzZWQgZGVmZXJyZWQgZnJlZSBwYXRjaGVzCisJZm9yIHRoZSBDT05GSUdfUFJFRU1QVF9SVCBlbnZpcm9ubWVudC4KKyIKK30KKworQGNvbmZlcmVuY2V7UGF1bE1jS2VubmV5MDViCissQXV0aG9yPSJQYXVsIEUuIE1jS2VubmV5IGFuZCBEaXBhbmthciBTYXJtYSIKKyxUaXRsZT0iVG93YXJkcyBIYXJkIFJlYWx0aW1lIFJlc3BvbnNlIGZyb20gdGhlIExpbnV4IEtlcm5lbCBvbiBTTVAgSGFyZHdhcmUiCissQm9va3RpdGxlPSJsaW51eC5jb25mLmF1IDIwMDUiCissbW9udGg9IkFwcmlsIgorLHllYXI9IjIwMDUiCissYWRkcmVzcz0iQ2FuYmVycmEsIEF1c3RyYWxpYSIKKyxub3RlPSJBdmFpbGFibGU6CitcdXJse2h0dHA6Ly93d3cucmRyb3AuY29tL3VzZXJzL3BhdWxtY2svUkNVL3JlYWx0aW1lUkNVLjIwMDUuMDQuMjNhLnBkZn0KK1tWaWV3ZWQgTWF5IDEzLCAyMDA1XSIKKyxhbm5vdGF0aW9uPSIKKwlSZWFsdGltZSB0dXJucyBpbnRvIG1ha2luZyBSQ1UgeWV0IG1vcmUgcmVhbHRpbWUgZnJpZW5kbHkuCisiCit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9VUC50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9VUC50eHQKaW5kZXggM2JmYjg0Yi4uYWFiNGE5ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvVVAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL1VQLnR4dApAQCAtOCw3ICs4LDcgQEAKIHdhaXQgZm9yIGFueXRoaW5nIGVsc2UgdG8gZ2V0IGRvbmUsIHNpbmNlIHRoZXJlIGFyZSBubyBvdGhlciBDUFVzIGZvcgogYW55dGhpbmcgZWxzZSB0byBiZSBoYXBwZW5pbmcgb24uICBBbHRob3VnaCB0aGlzIGFwcHJvYWNoIHdpbGwgLXNvcnQtIC1vZi0KIHdvcmsgYSBzdXJwcmlzaW5nIGFtb3VudCBvZiB0aGUgdGltZSwgaXQgaXMgYSB2ZXJ5IGJhZCBpZGVhIGluIGdlbmVyYWwuCi1UaGlzIGRvY3VtZW50IHByZXNlbnRzIHR3byBleGFtcGxlcyB0aGF0IGRlbW9uc3RyYXRlIGV4YWN0bHkgaG93IGJhZCBhbgorVGhpcyBkb2N1bWVudCBwcmVzZW50cyB0aHJlZSBleGFtcGxlcyB0aGF0IGRlbW9uc3RyYXRlIGV4YWN0bHkgaG93IGJhZCBhbgogaWRlYSB0aGlzIGlzLgogCiAKQEAgLTI2LDYgKzI2LDkgQEAKIGVsZW1lbnQgQi4gIFRoaXMgc2l0dWF0aW9uIGNhbiBncmVhdGx5IGRlY3JlYXNlIHRoZSBsaWZlIGV4cGVjdGFuY3kgb2YKIHlvdXIga2VybmVsLgogCitUaGlzIHNhbWUgcHJvYmxlbSBjYW4gb2NjdXIgaWYgY2FsbF9yY3UoKSBpcyBpbnZva2VkIGZyb20gYSBoYXJkd2FyZQoraW50ZXJydXB0IGhhbmRsZXIuCisKIAogRXhhbXBsZSAyOiBGdW5jdGlvbi1DYWxsIEZhdGFsaXR5CiAKQEAgLTQ0LDggKzQ3LDM3IEBACiB1bmRlcmx5aW5nIFJDVSwgbmFtZWx5IHRoYXQgY2FsbF9yY3UoKSBkZWZlcnMgaW52b2tpbmcgaXRzIGFyZ3VtZW50cyB1bnRpbAogYWxsIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgY3VycmVudGx5IGV4ZWN1dGluZyBoYXZlIGNvbXBsZXRlZC4KIAotUXVpY2sgUXVpejogd2h5IGlzIGl0IC1ub3QtIGxlZ2FsIHRvIGludm9rZSBzeW5jaHJvbml6ZV9yY3UoKSBpbgotdGhpcyBjYXNlPworUXVpY2sgUXVpeiAjMTogd2h5IGlzIGl0IC1ub3QtIGxlZ2FsIHRvIGludm9rZSBzeW5jaHJvbml6ZV9yY3UoKSBpbgorCXRoaXMgY2FzZT8KKworCitFeGFtcGxlIDM6IERlYXRoIGJ5IERlYWRsb2NrCisKK1N1cHBvc2UgdGhhdCBjYWxsX3JjdSgpIGlzIGludm9rZWQgd2hpbGUgaG9sZGluZyBhIGxvY2ssIGFuZCB0aGF0IHRoZQorY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBhY3F1aXJlIHRoaXMgc2FtZSBsb2NrLiAgSW4gdGhpcyBjYXNlLCBpZgorY2FsbF9yY3UoKSB3ZXJlIHRvIGRpcmVjdGx5IGludm9rZSB0aGUgY2FsbGJhY2ssIHRoZSByZXN1bHQgd291bGQKK2JlIHNlbGYtZGVhZGxvY2suCisKK0luIHNvbWUgY2FzZXMsIGl0IHdvdWxkIHBvc3NpYmxlIHRvIHJlc3RydWN0dXJlIHRvIGNvZGUgc28gdGhhdAordGhlIGNhbGxfcmN1KCkgaXMgZGVsYXllZCB1bnRpbCBhZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZC4gIEhvd2V2ZXIsCit0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW4gYmUgcXVpdGUgdWdseToKKworMS4JSWYgYSBudW1iZXIgb2YgaXRlbXMgbmVlZCB0byBiZSBwYXNzZWQgdG8gY2FsbF9yY3UoKSB3aXRoaW4KKwl0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHRoZSBjb2RlIHdvdWxkIG5lZWQgdG8gY3JlYXRlCisJYSBsaXN0IG9mIHRoZW0sIHRoZW4gdHJhdmVyc2UgdGhlIGxpc3Qgb25jZSB0aGUgbG9jayB3YXMKKwlyZWxlYXNlZC4KKworMi4JSW4gc29tZSBjYXNlcywgdGhlIGxvY2sgd2lsbCBiZSBoZWxkIGFjcm9zcyBzb21lIGtlcm5lbCBBUEksCisJc28gdGhhdCBkZWxheWluZyB0aGUgY2FsbF9yY3UoKSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZAorCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgaXRlbSBiZSBwYXNzZWQgdXAgdmlhIGEgY29tbW9uIEFQSS4KKwlJdCBpcyBmYXIgYmV0dGVyIHRvIGd1YXJhbnRlZSB0aGF0IGNhbGxiYWNrcyBhcmUgaW52b2tlZAorCXdpdGggbm8gbG9ja3MgaGVsZCB0aGFuIHRvIGhhdmUgdG8gbW9kaWZ5IHN1Y2ggQVBJcyB0byBhbGxvdworCWFyYml0cmFyeSBkYXRhIGl0ZW1zIHRvIGJlIHBhc3NlZCBiYWNrIHVwIHRocm91Z2ggdGhlbS4KKworSWYgY2FsbF9yY3UoKSBkaXJlY3RseSBpbnZva2VzIHRoZSBjYWxsYmFjaywgcGFpbmZ1bCBsb2NraW5nIHJlc3RyaWN0aW9ucworb3IgQVBJIGNoYW5nZXMgd291bGQgYmUgcmVxdWlyZWQuCisKK1F1aWNrIFF1aXogIzI6IFdoYXQgbG9ja2luZyByZXN0cmljdGlvbiBtdXN0IFJDVSBjYWxsYmFja3MgcmVzcGVjdD8KIAogCiBTdW1tYXJ5CkBAIC01MywxMiArODUsMzUgQEAKIFBlcm1pdHRpbmcgY2FsbF9yY3UoKSB0byBpbW1lZGlhdGVseSBpbnZva2UgaXRzIGFyZ3VtZW50cyBvciBwZXJtaXR0aW5nCiBzeW5jaHJvbml6ZV9yY3UoKSB0byBpbW1lZGlhdGVseSByZXR1cm4gYnJlYWtzIFJDVSwgZXZlbiBvbiBhIFVQIHN5c3RlbS4KIFNvIGRvIG5vdCBkbyBpdCEgIEV2ZW4gb24gYSBVUCBzeXN0ZW0sIHRoZSBSQ1UgaW5mcmFzdHJ1Y3R1cmUgLW11c3QtCi1yZXNwZWN0IGdyYWNlIHBlcmlvZHMuCityZXNwZWN0IGdyYWNlIHBlcmlvZHMsIGFuZCAtbXVzdC0gaW52b2tlIGNhbGxiYWNrcyBmcm9tIGEga25vd24gZW52aXJvbm1lbnQKK2luIHdoaWNoIG5vIGxvY2tzIGFyZSBoZWxkLgogCiAKLUFuc3dlciB0byBRdWljayBRdWl6CitBbnN3ZXIgdG8gUXVpY2sgUXVpeiAjMToKKwlXaHkgaXMgaXQgLW5vdC0gbGVnYWwgdG8gaW52b2tlIHN5bmNocm9uaXplX3JjdSgpIGluIHRoaXMgY2FzZT8KIAotVGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgc2Nhbm5pbmcgYW4gUkNVLXByb3RlY3RlZCBsaW5rZWQgbGlzdCwgYW5kCi1pcyB0aGVyZWZvcmUgd2l0aGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4gIFRoZXJlZm9yZSwKLXRoZSBjYWxsZWQgZnVuY3Rpb24gaGFzIGJlZW4gaW52b2tlZCB3aXRoaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbAotc2VjdGlvbiwgYW5kIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmxvY2suCisJQmVjYXVzZSB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyBzY2FubmluZyBhbiBSQ1UtcHJvdGVjdGVkIGxpbmtlZAorCWxpc3QsIGFuZCBpcyB0aGVyZWZvcmUgd2l0aGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KKwlUaGVyZWZvcmUsIHRoZSBjYWxsZWQgZnVuY3Rpb24gaGFzIGJlZW4gaW52b2tlZCB3aXRoaW4gYW4gUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGFuZCBpcyBub3QgcGVybWl0dGVkIHRvIGJsb2NrLgorCitBbnN3ZXIgdG8gUXVpY2sgUXVpeiAjMjoKKwlXaGF0IGxvY2tpbmcgcmVzdHJpY3Rpb24gbXVzdCBSQ1UgY2FsbGJhY2tzIHJlc3BlY3Q/CisKKwlBbnkgbG9jayB0aGF0IGlzIGFjcXVpcmVkIHdpdGhpbiBhbiBSQ1UgY2FsbGJhY2sgbXVzdCBiZQorCWFjcXVpcmVkIGVsc2V3aGVyZSB1c2luZyBhbiBfaXJxIHZhcmlhbnQgb2YgdGhlIHNwaW5sb2NrCisJcHJpbWl0aXZlLiAgRm9yIGV4YW1wbGUsIGlmICJteWxvY2siIGlzIGFjcXVpcmVkIGJ5IGFuCisJUkNVIGNhbGxiYWNrLCB0aGVuIGEgcHJvY2Vzcy1jb250ZXh0IGFjcXVpc2l0aW9uIG9mIHRoaXMKKwlsb2NrIG11c3QgdXNlIHNvbWV0aGluZyBsaWtlIHNwaW5fbG9ja19pcnFzYXZlKCkgdG8KKwlhY3F1aXJlIHRoZSBsb2NrLgorCisJSWYgdGhlIHByb2Nlc3MtY29udGV4dCBjb2RlIHdlcmUgdG8gc2ltcGx5IHVzZSBzcGluX2xvY2soKSwKKwl0aGVuLCBzaW5jZSBSQ1UgY2FsbGJhY2tzIGNhbiBiZSBpbnZva2VkIGZyb20gc29mdGlycSBjb250ZXh0LAorCXRoZSBjYWxsYmFjayBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIHNvZnRpcnEgdGhhdCBpbnRlcnJ1cHRlZAorCXRoZSBwcm9jZXNzLWNvbnRleHQgY3JpdGljYWwgc2VjdGlvbi4gIFRoaXMgd291bGQgcmVzdWx0IGluCisJc2VsZi1kZWFkbG9jay4KKworCVRoaXMgcmVzdHJpY3Rpb24gbWlnaHQgc2VlbSBncmF0dWl0b3VzLCBzaW5jZSB2ZXJ5IGZldyBSQ1UKKwljYWxsYmFja3MgYWNxdWlyZSBsb2NrcyBkaXJlY3RseS4gIEhvd2V2ZXIsIGEgZ3JlYXQgbWFueSBSQ1UKKwljYWxsYmFja3MgZG8gYWNxdWlyZSBsb2NrcyAtaW5kaXJlY3RseS0sIGZvciBleGFtcGxlLCB2aWEKKwl0aGUga2ZyZWUoKSBwcmltaXRpdmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCA4ZjNmYjc3Li5lMTE4YTdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTQzLDYgKzQzLDEwIEBACiAJcmN1X3JlYWRfbG9ja19iaCgpKSBpbiB0aGUgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLAogCWFuZCBhcmUgYWxzbyBhbiBleGNlbGxlbnQgYWlkIHRvIHJlYWRhYmlsaXR5LgogCisJQXMgYSByb3VnaCBydWxlIG9mIHRodW1iLCBhbnkgZGVyZWZlcmVuY2Ugb2YgYW4gUkNVLXByb3RlY3RlZAorCXBvaW50ZXIgbXVzdCBiZSBjb3ZlcmVkIGJ5IHJjdV9yZWFkX2xvY2soKSBvciByY3VfcmVhZF9sb2NrX2JoKCkKKwlvciBieSB0aGUgYXBwcm9wcmlhdGUgdXBkYXRlLXNpZGUgbG9jay4KKwogMy4JRG9lcyB0aGUgdXBkYXRlIGNvZGUgdG9sZXJhdGUgY29uY3VycmVudCBhY2Nlc3Nlcz8KIAogCVRoZSB3aG9sZSBwb2ludCBvZiBSQ1UgaXMgdG8gcGVybWl0IHJlYWRlcnMgdG8gcnVuIHdpdGhvdXQKQEAgLTkwLDcgKzk0LDExIEBACiAKIAkJVGhlIHJjdV9kZXJlZmVyZW5jZSgpIHByaW1pdGl2ZSBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzCiAJCSJfcmN1KCkiIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZXMsIHN1Y2ggYXMgdGhlCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCkuCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCkuICBOb3RlIHRoYXQgaXQgaXMgcGVyZmVjdGx5CisJCWxlZ2FsIChpZiByZWR1bmRhbnQpIGZvciB1cGRhdGUtc2lkZSBjb2RlIHRvIHVzZQorCQlyY3VfZGVyZWZlcmVuY2UoKSBhbmQgdGhlICJfcmN1KCkiIGxpc3QtdHJhdmVyc2FsCisJCXByaW1pdGl2ZXMuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29kZQorCQl0aGF0IGlzIGNvbW1vbiB0byByZWFkZXJzIGFuZCB1cGRhdGVycy4KIAogCWIuCUlmIHRoZSBsaXN0IG1hY3JvcyBhcmUgYmVpbmcgdXNlZCwgdGhlIGxpc3RfYWRkX3RhaWxfcmN1KCkKIAkJYW5kIGxpc3RfYWRkX3JjdSgpIHByaW1pdGl2ZXMgbXVzdCBiZSB1c2VkIGluIG9yZGVyCkBAIC0xNTAsMTYgKzE1OCw5IEBACiAKIAlVc2Ugb2YgdGhlIF9yY3UoKSBsaXN0LXRyYXZlcnNhbCBwcmltaXRpdmVzIG91dHNpZGUgb2YgYW4KIAlSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24gY2F1c2VzIG5vIGhhcm0gb3RoZXIgdGhhbgotCWEgc2xpZ2h0IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIG9uIEFscGhhIENQVXMgYW5kIHNvbWUKLQljb25mdXNpb24gb24gdGhlIHBhcnQgb2YgcGVvcGxlIHRyeWluZyB0byByZWFkIHRoZSBjb2RlLgotCi0JQW5vdGhlciB3YXkgb2YgdGhpbmtpbmcgb2YgdGhpcyBpcyAiSWYgeW91IGFyZSBob2xkaW5nIHRoZQotCWxvY2sgdGhhdCBwcmV2ZW50cyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBjaGFuZ2luZywgd2h5IGRvCi0JeW91IGFsc28gbmVlZCBSQ1UtYmFzZWQgcHJvdGVjdGlvbj8iICBUaGF0IHNhaWQsIHRoZXJlIG1heQotCXdlbGwgYmUgc2l0dWF0aW9ucyB3aGVyZSB1c2Ugb2YgdGhlIF9yY3UoKSBsaXN0LXRyYXZlcnNhbAotCXByaW1pdGl2ZXMgd2hpbGUgdGhlIHVwZGF0ZS1zaWRlIGxvY2sgaXMgaGVsZCByZXN1bHRzIGluCi0Jc2ltcGxlciBhbmQgbW9yZSBtYWludGFpbmFibGUgY29kZS4gIFRoZSBqdXJ5IGlzIHN0aWxsIG91dAotCW9uIHRoaXMgcXVlc3Rpb24uCisJYSBzbGlnaHQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gb24gQWxwaGEgQ1BVcy4gIEl0IGNhbgorCWFsc28gYmUgcXVpdGUgaGVscGZ1bCBpbiByZWR1Y2luZyBjb2RlIGJsb2F0IHdoZW4gY29tbW9uCisJY29kZSBpcyBzaGFyZWQgYmV0d2VlbiByZWFkZXJzIGFuZCB1cGRhdGVycy4KIAogMTAuCUNvbnZlcnNlbHksIGlmIHlvdSBhcmUgaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLAogCXlvdSAtbXVzdC0gdXNlIHRoZSAiX3JjdSgpIiB2YXJpYW50cyBvZiB0aGUgbGlzdCBtYWNyb3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvcmN1LnR4dAppbmRleCBlYjQ0NDAwLi42ZmEwOTIyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3JjdS50eHQKQEAgLTY0LDYgKzY0LDU0IEBACiAJT2YgdGhlc2UsIG9uZSB3YXMgYWxsb3dlZCB0byBsYXBzZSBieSB0aGUgYXNzaWduZWUsIGFuZCB0aGUKIAlvdGhlcnMgaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIHRvIHRoZSBMaW51eCBrZXJuZWwgdW5kZXIgR1BMLgogCitvCUkgaGVhciB0aGF0IFJDVSBuZWVkcyB3b3JrIGluIG9yZGVyIHRvIHN1cHBvcnQgcmVhbHRpbWUga2VybmVscz8KKworCVllcywgd29yayBpbiBwcm9ncmVzcy4KKwogbwlXaGVyZSBjYW4gSSBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gUkNVPwogCiAJU2VlIHRoZSBSVEZQLnR4dCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgorCU9yIHBvaW50IHlvdXIgYnJvd3NlciBhdCBodHRwOi8vd3d3LnJkcm9wLmNvbS91c2Vycy9wYXVsbWNrL1JDVS8uCisKK28JV2hhdCBhcmUgYWxsIHRoZXNlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5PworCisKKwlOTUktUkNVLnR4dAorCisJCURlc2NyaWJlcyBob3cgdG8gdXNlIFJDVSB0byBpbXBsZW1lbnQgZHluYW1pYworCQlOTUkgaGFuZGxlcnMsIHdoaWNoIGNhbiBiZSByZXZlY3RvcmVkIG9uIHRoZSBmbHksCisJCXdpdGhvdXQgcmVib290aW5nLgorCisJUlRGUC50eHQKKworCQlMaXN0IG9mIFJDVS1yZWxhdGVkIHB1YmxpY2F0aW9ucyBhbmQgd2ViIHNpdGVzLgorCisJVVAudHh0CisKKwkJRGlzY3Vzc2lvbiBvZiBSQ1UgdXNhZ2UgaW4gVVAga2VybmVscy4KKworCWFycmF5UkNVLnR4dAorCisJCURlc2NyaWJlcyBob3cgdG8gdXNlIFJDVSB0byBwcm90ZWN0IGFycmF5cywgd2l0aAorCQlyZXNpemVhYmxlIGFycmF5cyB3aG9zZSBlbGVtZW50cyByZWZlcmVuY2Ugb3RoZXIKKwkJZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG9mIHRoZSBtb3N0IGludGVyZXN0LgorCisJY2hlY2tsaXN0LnR4dAorCisJCUxpc3RzIHRoaW5ncyB0byBjaGVjayBmb3Igd2hlbiBpbnNwZWN0aW5nIGNvZGUgdGhhdAorCQl1c2VzIFJDVS4KKworCWxpc3RSQ1UudHh0CisKKwkJRGVzY3JpYmVzIGhvdyB0byB1c2UgUkNVIHRvIHByb3RlY3QgbGlua2VkIGxpc3RzLgorCQlUaGlzIGlzIHRoZSBzaW1wbGVzdCBhbmQgbW9zdCBjb21tb24gdXNlIG9mIFJDVQorCQlpbiB0aGUgTGludXgga2VybmVsLgorCisJcmN1LnR4dAorCisJCVlvdSBhcmUgcmVhZGluZyBpdCEKKworCXdoYXRpc1JDVS50eHQKKworCQlPdmVydmlldyBvZiBob3cgdGhlIFJDVSBpbXBsZW1lbnRhdGlvbiB3b3Jrcy4gIEFsb25nCisJCXRoZSB3YXksIHByZXNlbnRzIGEgY29uY2VwdHVhbCB2aWV3IG9mIFJDVS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3JjdXJlZi50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2ZlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0CkBAIC0wLDAgKzEsNzQgQEAKK1JlZmNvdW50ZXIgZnJhbWV3b3JrIGZvciBlbGVtZW50cyBvZiBsaXN0cy9hcnJheXMgcHJvdGVjdGVkIGJ5CitSQ1UuCisKK1JlZmNvdW50aW5nIG9uIGVsZW1lbnRzIG9mICBsaXN0cyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRpdGlvbmFsCityZWFkZXIvd3JpdGVyIHNwaW5sb2NrcyBvciBzZW1hcGhvcmVzIGFyZSBzdHJhaWdodCBmb3J3YXJkIGFzIGluOgorCisxLgkJCQkJMi4KK2FkZCgpCQkJCQlzZWFyY2hfYW5kX3JlZmVyZW5jZSgpCit7CQkJCQl7CisJYWxsb2Nfb2JqZWN0CQkJCXJlYWRfbG9jaygmbGlzdF9sb2NrKTsKKwkuLi4JCQkJCXNlYXJjaF9mb3JfZWxlbWVudAorCWF0b21pY19zZXQoJmVsLT5yYywgMSk7CQkJYXRvbWljX2luYygmZWwtPnJjKTsKKwl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwkJCS4uLgorCWFkZF9lbGVtZW50CQkJCXJlYWRfdW5sb2NrKCZsaXN0X2xvY2spOworCS4uLgkJCQkJLi4uCisJd3JpdGVfdW5sb2NrKCZsaXN0X2xvY2spOwl9Cit9CisKKzMuCQkJCQk0LgorcmVsZWFzZV9yZWZlcmVuY2VkKCkJCQlkZWxldGUoKQorewkJCQkJeworCS4uLgkJCQl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOworCWF0b21pY19kZWMoJmVsLT5yYywgcmVsZnVuYykJLi4uCisJLi4uCQkJCWRlbGV0ZV9lbGVtZW50Cit9CQkJCQl3cml0ZV91bmxvY2soJmxpc3RfbG9jayk7CisgCQkJCQkuLi4KKwkJCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVsLT5yYykpCisJCQkJCQlrZnJlZShlbCk7CisJCQkJCS4uLgorCQkJCQl9CisKK0lmIHRoaXMgbGlzdC9hcnJheSBpcyBtYWRlIGxvY2sgZnJlZSB1c2luZyByY3UgYXMgaW4gY2hhbmdpbmcgdGhlCit3cml0ZV9sb2NrIGluIGFkZCgpIGFuZCBkZWxldGUoKSB0byBzcGluX2xvY2sgYW5kIGNoYW5naW5nIHJlYWRfbG9jaworaW4gc2VhcmNoX2FuZF9yZWZlcmVuY2UgdG8gcmN1X3JlYWRfbG9jaygpLCB0aGUgcmN1cmVmX2dldCBpbgorc2VhcmNoX2FuZF9yZWZlcmVuY2UgY291bGQgcG90ZW50aWFsbHkgaG9sZCByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCB3aGljaAoraGFzIGFscmVhZHkgYmVlbiBkZWxldGVkIGZyb20gdGhlIGxpc3QvYXJyYXkuICByY3VyZWZfbGZfZ2V0X3JjdSB0YWtlcworY2FyZSBvZiB0aGlzIHNjZW5hcmlvLiBzZWFyY2hfYW5kX3JlZmVyZW5jZSBzaG91bGQgbG9vayBhczsKKworMS4JCQkJCTIuCithZGQoKQkJCQkJc2VhcmNoX2FuZF9yZWZlcmVuY2UoKQorewkJCQkJeworIAlhbGxvY19vYmplY3QJCQkJcmN1X3JlYWRfbG9jaygpOworCS4uLgkJCQkJc2VhcmNoX2Zvcl9lbGVtZW50CisJYXRvbWljX3NldCgmZWwtPnJjLCAxKTsJCQlpZiAocmN1cmVmX2luY19sZigmZWwtPnJjKSkgeworCXdyaXRlX2xvY2soJmxpc3RfbG9jayk7CQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCQkJCXJldHVybiBGQUlMOworCWFkZF9lbGVtZW50CQkJCX0KKwkuLi4JCQkJCS4uLgorCXdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsJCXJjdV9yZWFkX3VubG9jaygpOworfQkJCQkJfQorMy4JCQkJCTQuCityZWxlYXNlX3JlZmVyZW5jZWQoKQkJCWRlbGV0ZSgpCit7CQkJCQl7CisJLi4uCQkJCXdyaXRlX2xvY2soJmxpc3RfbG9jayk7CisJcmN1cmVmX2RlYygmZWwtPnJjLCByZWxmdW5jKQkuLi4KKwkuLi4JCQkJZGVsZXRlX2VsZW1lbnQKK30JCQkJCXdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsKKyAJCQkJCS4uLgorCQkJCQlpZiAocmN1cmVmX2RlY19hbmRfdGVzdCgmZWwtPnJjKSkKKwkJCQkJCWNhbGxfcmN1KCZlbC0+aGVhZCwgZWxfZnJlZSk7CisJCQkJCS4uLgorCQkJCQl9CisKK1NvbWV0aW1lcywgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IG5lZWQgdG8gYmUgb2J0YWluZWQgaW4gdGhlCit1cGRhdGUgKHdyaXRlKSBzdHJlYW0uICBJbiBzdWNoIGNhc2VzLCByY3VyZWZfaW5jX2xmIG1pZ2h0IGJlIGFuIG92ZXJraWxsCitzaW5jZSB0aGUgc3BpbmxvY2sgc2VyaWFsaXNpbmcgbGlzdCB1cGRhdGVzIGFyZSBoZWxkLiByY3VyZWZfaW5jCitpcyB0byBiZSB1c2VkIGluIHN1Y2ggY2FzZXMuCitGb3IgYXJjaGVzIHdoaWNoIGRvIG5vdCBoYXZlIGNtcHhjaGcgcmN1cmVmX2luY19sZgorYXBpIHVzZXMgYSBoYXNoZWQgc3BpbmxvY2sgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzYW1lIGhhc2hlZCBzcGlubG9jaworaXMgYWNxdWlyZWQgaW4gYWxsIHJjdXJlZl94eHggcHJpbWl0aXZlcyB0byBwcmVzZXJ2ZSBhdG9taWNpdHkuCitOb3RlOiBVc2UgcmN1cmVmX2luYyBhcGkgb25seSBpZiB5b3UgbmVlZCB0byB1c2UgcmN1cmVmX2luY19sZiBvbiB0aGUKK3JlZmNvdW50ZXIgYXRsZWFzdCBhdCBvbmUgcGxhY2UuICBNaXhpbmcgcmN1cmVmX2luYyBhbmQgYXRvbWljX3h4eCBhcGkKK21pZ2h0IGxlYWQgdG8gcmFjZXMuIHJjdXJlZl9pbmNfbGYoKSBtdXN0IGJlIHVzZWQgaW4gbG9ja2ZyZWUKK1JDVSBjcml0aWNhbCBzZWN0aW9ucyBvbmx5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZDg5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKQEAgLTAsMCArMSw5MDIgQEAKK1doYXQgaXMgUkNVPworCitSQ1UgaXMgYSBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBMaW51eCBrZXJuZWwKK2R1cmluZyB0aGUgMi41IGRldmVsb3BtZW50IGVmZm9ydCB0aGF0IGlzIG9wdGltaXplZCBmb3IgcmVhZC1tb3N0bHkKK3NpdHVhdGlvbnMuICBBbHRob3VnaCBSQ1UgaXMgYWN0dWFsbHkgcXVpdGUgc2ltcGxlIG9uY2UgeW91IHVuZGVyc3RhbmQgaXQsCitnZXR0aW5nIHRoZXJlIGNhbiBzb21ldGltZXMgYmUgYSBjaGFsbGVuZ2UuICBQYXJ0IG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQKK21vc3Qgb2YgdGhlIHBhc3QgZGVzY3JpcHRpb25zIG9mIFJDVSBoYXZlIGJlZW4gd3JpdHRlbiB3aXRoIHRoZSBtaXN0YWtlbgorYXNzdW1wdGlvbiB0aGF0IHRoZXJlIGlzICJvbmUgdHJ1ZSB3YXkiIHRvIGRlc2NyaWJlIFJDVS4gIEluc3RlYWQsCit0aGUgZXhwZXJpZW5jZSBoYXMgYmVlbiB0aGF0IGRpZmZlcmVudCBwZW9wbGUgbXVzdCB0YWtlIGRpZmZlcmVudCBwYXRocwordG8gYXJyaXZlIGF0IGFuIHVuZGVyc3RhbmRpbmcgb2YgUkNVLiAgVGhpcyBkb2N1bWVudCBwcm92aWRlcyBzZXZlcmFsCitkaWZmZXJlbnQgcGF0aHMsIGFzIGZvbGxvd3M6CisKKzEuCVJDVSBPVkVSVklFVworMi4JV0hBVCBJUyBSQ1UnUyBDT1JFIEFQST8KKzMuCVdIQVQgQVJFIFNPTUUgRVhBTVBMRSBVU0VTIE9GIENPUkUgUkNVIEFQST8KKzQuCVdIQVQgSUYgTVkgVVBEQVRJTkcgVEhSRUFEIENBTk5PVCBCTE9DSz8KKzUuCVdIQVQgQVJFIFNPTUUgU0lNUExFIElNUExFTUVOVEFUSU9OUyBPRiBSQ1U/Cis2LglBTkFMT0dZIFdJVEggUkVBREVSLVdSSVRFUiBMT0NLSU5HCis3LglGVUxMIExJU1QgT0YgUkNVIEFQSXMKKzguCUFOU1dFUlMgVE8gUVVJQ0sgUVVJWlpFUworCitQZW9wbGUgd2hvIHByZWZlciBzdGFydGluZyB3aXRoIGEgY29uY2VwdHVhbCBvdmVydmlldyBzaG91bGQgZm9jdXMgb24KK1NlY3Rpb24gMSwgdGhvdWdoIG1vc3QgcmVhZGVycyB3aWxsIHByb2ZpdCBieSByZWFkaW5nIHRoaXMgc2VjdGlvbiBhdAorc29tZSBwb2ludC4gIFBlb3BsZSB3aG8gcHJlZmVyIHRvIHN0YXJ0IHdpdGggYW4gQVBJIHRoYXQgdGhleSBjYW4gdGhlbgorZXhwZXJpbWVudCB3aXRoIHNob3VsZCBmb2N1cyBvbiBTZWN0aW9uIDIuICBQZW9wbGUgd2hvIHByZWZlciB0byBzdGFydAord2l0aCBleGFtcGxlIHVzZXMgc2hvdWxkIGZvY3VzIG9uIFNlY3Rpb25zIDMgYW5kIDQuICBQZW9wbGUgd2hvIG5lZWQgdG8KK3VuZGVyc3RhbmQgdGhlIFJDVSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZm9jdXMgb24gU2VjdGlvbiA1LCB0aGVuIGRpdmUKK2ludG8gdGhlIGtlcm5lbCBzb3VyY2UgY29kZS4gIFBlb3BsZSB3aG8gcmVhc29uIGJlc3QgYnkgYW5hbG9neSBzaG91bGQKK2ZvY3VzIG9uIFNlY3Rpb24gNi4gIFNlY3Rpb24gNyBzZXJ2ZXMgYXMgYW4gaW5kZXggdG8gdGhlIGRvY2Jvb2sgQVBJCitkb2N1bWVudGF0aW9uLCBhbmQgU2VjdGlvbiA4IGlzIHRoZSB0cmFkaXRpb25hbCBhbnN3ZXIga2V5LgorCitTbywgc3RhcnQgd2l0aCB0aGUgc2VjdGlvbiB0aGF0IG1ha2VzIHRoZSBtb3N0IHNlbnNlIHRvIHlvdSBhbmQgeW91cgorcHJlZmVycmVkIG1ldGhvZCBvZiBsZWFybmluZy4gIElmIHlvdSBuZWVkIHRvIGtub3cgZXZlcnl0aGluZyBhYm91dAorZXZlcnl0aGluZywgZmVlbCBmcmVlIHRvIHJlYWQgdGhlIHdob2xlIHRoaW5nIC0tIGJ1dCBpZiB5b3UgYXJlIHJlYWxseQordGhhdCB0eXBlIG9mIHBlcnNvbiwgeW91IGhhdmUgcGVydXNlZCB0aGUgc291cmNlIGNvZGUgYW5kIHdpbGwgdGhlcmVmb3JlCituZXZlciBuZWVkIHRoaXMgZG9jdW1lbnQgYW55d2F5LiAgOy0pCisKKworMS4gIFJDVSBPVkVSVklFVworCitUaGUgYmFzaWMgaWRlYSBiZWhpbmQgUkNVIGlzIHRvIHNwbGl0IHVwZGF0ZXMgaW50byAicmVtb3ZhbCIgYW5kCisicmVjbGFtYXRpb24iIHBoYXNlcy4gIFRoZSByZW1vdmFsIHBoYXNlIHJlbW92ZXMgcmVmZXJlbmNlcyB0byBkYXRhIGl0ZW1zCit3aXRoaW4gYSBkYXRhIHN0cnVjdHVyZSAocG9zc2libHkgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCByZWZlcmVuY2VzIHRvCituZXcgdmVyc2lvbnMgb2YgdGhlc2UgZGF0YSBpdGVtcyksIGFuZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlYWRlcnMuCitUaGUgcmVhc29uIHRoYXQgaXQgaXMgc2FmZSB0byBydW4gdGhlIHJlbW92YWwgcGhhc2UgY29uY3VycmVudGx5IHdpdGgKK3JlYWRlcnMgaXMgdGhlIHNlbWFudGljcyBvZiBtb2Rlcm4gQ1BVcyBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlCitlaXRoZXIgdGhlIG9sZCBvciB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIHJhdGhlciB0aGFuIGEKK3BhcnRpYWxseSB1cGRhdGVkIHJlZmVyZW5jZS4gIFRoZSByZWNsYW1hdGlvbiBwaGFzZSBkb2VzIHRoZSB3b3JrIG9mIHJlY2xhaW1pbmcKKyhlLmcuLCBmcmVlaW5nKSB0aGUgZGF0YSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlIGR1cmluZyB0aGUKK3JlbW92YWwgcGhhc2UuICBCZWNhdXNlIHJlY2xhaW1pbmcgZGF0YSBpdGVtcyBjYW4gZGlzcnVwdCBhbnkgcmVhZGVycworY29uY3VycmVudGx5IHJlZmVyZW5jaW5nIHRob3NlIGRhdGEgaXRlbXMsIHRoZSByZWNsYW1hdGlvbiBwaGFzZSBtdXN0Citub3Qgc3RhcnQgdW50aWwgcmVhZGVycyBubyBsb25nZXIgaG9sZCByZWZlcmVuY2VzIHRvIHRob3NlIGRhdGEgaXRlbXMuCisKK1NwbGl0dGluZyB0aGUgdXBkYXRlIGludG8gcmVtb3ZhbCBhbmQgcmVjbGFtYXRpb24gcGhhc2VzIHBlcm1pdHMgdGhlCit1cGRhdGVyIHRvIHBlcmZvcm0gdGhlIHJlbW92YWwgcGhhc2UgaW1tZWRpYXRlbHksIGFuZCB0byBkZWZlciB0aGUKK3JlY2xhbWF0aW9uIHBoYXNlIHVudGlsIGFsbCByZWFkZXJzIGFjdGl2ZSBkdXJpbmcgdGhlIHJlbW92YWwgcGhhc2UgaGF2ZQorY29tcGxldGVkLCBlaXRoZXIgYnkgYmxvY2tpbmcgdW50aWwgdGhleSBmaW5pc2ggb3IgYnkgcmVnaXN0ZXJpbmcgYQorY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIGFmdGVyIHRoZXkgZmluaXNoLiAgT25seSByZWFkZXJzIHRoYXQgYXJlIGFjdGl2ZQorZHVyaW5nIHRoZSByZW1vdmFsIHBoYXNlIG5lZWQgYmUgY29uc2lkZXJlZCwgYmVjYXVzZSBhbnkgcmVhZGVyIHN0YXJ0aW5nCithZnRlciB0aGUgcmVtb3ZhbCBwaGFzZSB3aWxsIGJlIHVuYWJsZSB0byBnYWluIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkCitkYXRhIGl0ZW1zLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBkaXNydXB0ZWQgYnkgdGhlIHJlY2xhbWF0aW9uIHBoYXNlLgorCitTbyB0aGUgdHlwaWNhbCBSQ1UgdXBkYXRlIHNlcXVlbmNlIGdvZXMgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworYS4JUmVtb3ZlIHBvaW50ZXJzIHRvIGEgZGF0YSBzdHJ1Y3R1cmUsIHNvIHRoYXQgc3Vic2VxdWVudAorCXJlYWRlcnMgY2Fubm90IGdhaW4gYSByZWZlcmVuY2UgdG8gaXQuCisKK2IuCVdhaXQgZm9yIGFsbCBwcmV2aW91cyByZWFkZXJzIHRvIGNvbXBsZXRlIHRoZWlyIFJDVSByZWFkLXNpZGUKKwljcml0aWNhbCBzZWN0aW9ucy4KKworYy4JQXQgdGhpcyBwb2ludCwgdGhlcmUgY2Fubm90IGJlIGFueSByZWFkZXJzIHdobyBob2xkIHJlZmVyZW5jZXMKKwl0byB0aGUgZGF0YSBzdHJ1Y3R1cmUsIHNvIGl0IG5vdyBtYXkgc2FmZWx5IGJlIHJlY2xhaW1lZAorCShlLmcuLCBrZnJlZSgpZCkuCisKK1N0ZXAgKGIpIGFib3ZlIGlzIHRoZSBrZXkgaWRlYSB1bmRlcmx5aW5nIFJDVSdzIGRlZmVycmVkIGRlc3RydWN0aW9uLgorVGhlIGFiaWxpdHkgdG8gd2FpdCB1bnRpbCBhbGwgcmVhZGVycyBhcmUgZG9uZSBhbGxvd3MgUkNVIHJlYWRlcnMgdG8KK3VzZSBtdWNoIGxpZ2h0ZXItd2VpZ2h0IHN5bmNocm9uaXphdGlvbiwgaW4gc29tZSBjYXNlcywgYWJzb2x1dGVseSBubworc3luY2hyb25pemF0aW9uIGF0IGFsbC4gIEluIGNvbnRyYXN0LCBpbiBtb3JlIGNvbnZlbnRpb25hbCBsb2NrLWJhc2VkCitzY2hlbWVzLCByZWFkZXJzIG11c3QgdXNlIGhlYXZ5LXdlaWdodCBzeW5jaHJvbml6YXRpb24gaW4gb3JkZXIgdG8KK3ByZXZlbnQgYW4gdXBkYXRlciBmcm9tIGRlbGV0aW5nIHRoZSBkYXRhIHN0cnVjdHVyZSBvdXQgZnJvbSB1bmRlciB0aGVtLgorVGhpcyBpcyBiZWNhdXNlIGxvY2stYmFzZWQgdXBkYXRlcnMgdHlwaWNhbGx5IHVwZGF0ZSBkYXRhIGl0ZW1zIGluIHBsYWNlLAorYW5kIG11c3QgdGhlcmVmb3JlIGV4Y2x1ZGUgcmVhZGVycy4gIEluIGNvbnRyYXN0LCBSQ1UtYmFzZWQgdXBkYXRlcnMKK3R5cGljYWxseSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdyaXRlcyB0byBzaW5nbGUgYWxpZ25lZAorcG9pbnRlcnMgYXJlIGF0b21pYyBvbiBtb2Rlcm4gQ1BVcywgYWxsb3dpbmcgYXRvbWljIGluc2VydGlvbiwgcmVtb3ZhbCwKK2FuZCByZXBsYWNlbWVudCBvZiBkYXRhIGl0ZW1zIGluIGEgbGlua2VkIHN0cnVjdHVyZSB3aXRob3V0IGRpc3J1cHRpbmcKK3JlYWRlcnMuICBDb25jdXJyZW50IFJDVSByZWFkZXJzIGNhbiB0aGVuIGNvbnRpbnVlIGFjY2Vzc2luZyB0aGUgb2xkCit2ZXJzaW9ucywgYW5kIGNhbiBkaXNwZW5zZSB3aXRoIHRoZSBhdG9taWMgb3BlcmF0aW9ucywgbWVtb3J5IGJhcnJpZXJzLAorYW5kIGNvbW11bmljYXRpb25zIGNhY2hlIG1pc3NlcyB0aGF0IGFyZSBzbyBleHBlbnNpdmUgb24gcHJlc2VudC1kYXkKK1NNUCBjb21wdXRlciBzeXN0ZW1zLCBldmVuIGluIGFic2VuY2Ugb2YgbG9jayBjb250ZW50aW9uLgorCitJbiB0aGUgdGhyZWUtc3RlcCBwcm9jZWR1cmUgc2hvd24gYWJvdmUsIHRoZSB1cGRhdGVyIGlzIHBlcmZvcm1pbmcgYm90aAordGhlIHJlbW92YWwgYW5kIHRoZSByZWNsYW1hdGlvbiBzdGVwLCBidXQgaXQgaXMgb2Z0ZW4gaGVscGZ1bCBmb3IgYW4KK2VudGlyZWx5IGRpZmZlcmVudCB0aHJlYWQgdG8gZG8gdGhlIHJlY2xhbWF0aW9uLCBhcyBpcyBpbiBmYWN0IHRoZSBjYXNlCitpbiB0aGUgTGludXgga2VybmVsJ3MgZGlyZWN0b3J5LWVudHJ5IGNhY2hlIChkY2FjaGUpLiAgRXZlbiBpZiB0aGUgc2FtZQordGhyZWFkIHBlcmZvcm1zIGJvdGggdGhlIHVwZGF0ZSBzdGVwIChzdGVwIChhKSBhYm92ZSkgYW5kIHRoZSByZWNsYW1hdGlvbgorc3RlcCAoc3RlcCAoYykgYWJvdmUpLCBpdCBpcyBvZnRlbiBoZWxwZnVsIHRvIHRoaW5rIG9mIHRoZW0gc2VwYXJhdGVseS4KK0ZvciBleGFtcGxlLCBSQ1UgcmVhZGVycyBhbmQgdXBkYXRlcnMgbmVlZCBub3QgY29tbXVuaWNhdGUgYXQgYWxsLAorYnV0IFJDVSBwcm92aWRlcyBpbXBsaWNpdCBsb3ctb3ZlcmhlYWQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlYWRlcnMKK2FuZCByZWNsYWltZXJzLCBuYW1lbHksIGluIHN0ZXAgKGIpIGFib3ZlLgorCitTbyBob3cgdGhlIGhlY2sgY2FuIGEgcmVjbGFpbWVyIHRlbGwgd2hlbiBhIHJlYWRlciBpcyBkb25lLCBnaXZlbgordGhhdCByZWFkZXJzIGFyZSBub3QgZG9pbmcgYW55IHNvcnQgb2Ygc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnM/Pz8KK1JlYWQgb24gdG8gbGVhcm4gYWJvdXQgaG93IFJDVSdzIEFQSSBtYWtlcyB0aGlzIGVhc3kuCisKKworMi4gIFdIQVQgSVMgUkNVJ1MgQ09SRSBBUEk/CisKK1RoZSBjb3JlIFJDVSBBUEkgaXMgcXVpdGUgc21hbGw6CisKK2EuCXJjdV9yZWFkX2xvY2soKQorYi4JcmN1X3JlYWRfdW5sb2NrKCkKK2MuCXN5bmNocm9uaXplX3JjdSgpIC8gY2FsbF9yY3UoKQorZC4JcmN1X2Fzc2lnbl9wb2ludGVyKCkKK2UuCXJjdV9kZXJlZmVyZW5jZSgpCisKK1RoZXJlIGFyZSBtYW55IG90aGVyIG1lbWJlcnMgb2YgdGhlIFJDVSBBUEksIGJ1dCB0aGUgcmVzdCBjYW4gYmUKK2V4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGVzZSBmaXZlLCB0aG91Z2ggbW9zdCBpbXBsZW1lbnRhdGlvbnMgaW5zdGVhZAorZXhwcmVzcyBzeW5jaHJvbml6ZV9yY3UoKSBpbiB0ZXJtcyBvZiB0aGUgY2FsbF9yY3UoKSBjYWxsYmFjayBBUEkuCisKK1RoZSBmaXZlIGNvcmUgUkNVIEFQSXMgYXJlIGRlc2NyaWJlZCBiZWxvdywgdGhlIG90aGVyIDE4IHdpbGwgYmUgZW51bWVyYXRlZAorbGF0ZXIuICBTZWUgdGhlIGtlcm5lbCBkb2Nib29rIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbywgb3IgbG9vayBkaXJlY3RseQorYXQgdGhlIGZ1bmN0aW9uIGhlYWRlciBjb21tZW50cy4KKworcmN1X3JlYWRfbG9jaygpCisKKwl2b2lkIHJjdV9yZWFkX2xvY2sodm9pZCk7CisKKwlVc2VkIGJ5IGEgcmVhZGVyIHRvIGluZm9ybSB0aGUgcmVjbGFpbWVyIHRoYXQgdGhlIHJlYWRlciBpcworCWVudGVyaW5nIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4gIEl0IGlzIGlsbGVnYWwKKwl0byBibG9jayB3aGlsZSBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIHRob3VnaAorCWtlcm5lbHMgYnVpbHQgd2l0aCBDT05GSUdfUFJFRU1QVF9SQ1UgY2FuIHByZWVtcHQgUkNVIHJlYWQtc2lkZQorCWNyaXRpY2FsIHNlY3Rpb25zLiAgQW55IFJDVS1wcm90ZWN0ZWQgZGF0YSBzdHJ1Y3R1cmUgYWNjZXNzZWQKKwlkdXJpbmcgYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmVtYWluCisJdW5yZWNsYWltZWQgZm9yIHRoZSBmdWxsIGR1cmF0aW9uIG9mIHRoYXQgY3JpdGljYWwgc2VjdGlvbi4KKwlSZWZlcmVuY2UgY291bnRzIG1heSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUkNVIHRvIG1haW50YWluCisJbG9uZ2VyLXRlcm0gcmVmZXJlbmNlcyB0byBkYXRhIHN0cnVjdHVyZXMuCisKK3JjdV9yZWFkX3VubG9jaygpCisKKwl2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKTsKKworCVVzZWQgYnkgYSByZWFkZXIgdG8gaW5mb3JtIHRoZSByZWNsYWltZXIgdGhhdCB0aGUgcmVhZGVyIGlzCisJZXhpdGluZyBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uICBOb3RlIHRoYXQgUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG1heSBiZSBuZXN0ZWQgYW5kL29yIG92ZXJsYXBwaW5nLgorCitzeW5jaHJvbml6ZV9yY3UoKQorCisJdm9pZCBzeW5jaHJvbml6ZV9yY3Uodm9pZCk7CisKKwlNYXJrcyB0aGUgZW5kIG9mIHVwZGF0ZXIgY29kZSBhbmQgdGhlIGJlZ2lubmluZyBvZiByZWNsYWltZXIKKwljb2RlLiAgSXQgZG9lcyB0aGlzIGJ5IGJsb2NraW5nIHVudGlsIGFsbCBwcmUtZXhpc3RpbmcgUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG9uIGFsbCBDUFVzIGhhdmUgY29tcGxldGVkLgorCU5vdGUgdGhhdCBzeW5jaHJvbml6ZV9yY3UoKSB3aWxsIC1ub3QtIG5lY2Vzc2FyaWx5IHdhaXQgZm9yCisJYW55IHN1YnNlcXVlbnQgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyB0byBjb21wbGV0ZS4KKwlGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBldmVudHM6CisKKwkgICAgICAgICBDUFUgMCAgICAgICAgICAgICAgICAgIENQVSAxICAgICAgICAgICAgICAgICBDUFUgMgorCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0KKwkgMS4gIHJjdV9yZWFkX2xvY2soKQorCSAyLiAgICAgICAgICAgICAgICAgICAgZW50ZXJzIHN5bmNocm9uaXplX3JjdSgpCisJIDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY3VfcmVhZF9sb2NrKCkKKwkgNC4gIHJjdV9yZWFkX3VubG9jaygpCisJIDUuICAgICAgICAgICAgICAgICAgICAgZXhpdHMgc3luY2hyb25pemVfcmN1KCkKKwkgNi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCkKKworCVRvIHJlaXRlcmF0ZSwgc3luY2hyb25pemVfcmN1KCkgd2FpdHMgb25seSBmb3Igb25nb2luZyBSQ1UKKwlyZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgdG8gY29tcGxldGUsIG5vdCBuZWNlc3NhcmlseSBmb3IKKwlhbnkgdGhhdCBiZWdpbiBhZnRlciBzeW5jaHJvbml6ZV9yY3UoKSBpcyBpbnZva2VkLgorCisJT2YgY291cnNlLCBzeW5jaHJvbml6ZV9yY3UoKSBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXR1cm4KKwktaW1tZWRpYXRlbHktIGFmdGVyIHRoZSBsYXN0IHByZS1leGlzdGluZyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCisJc2VjdGlvbiBjb21wbGV0ZXMuICBGb3Igb25lIHRoaW5nLCB0aGVyZSBtaWdodCB3ZWxsIGJlIHNjaGVkdWxpbmcKKwlkZWxheXMuICBGb3IgYW5vdGhlciB0aGluZywgbWFueSBSQ1UgaW1wbGVtZW50YXRpb25zIHByb2Nlc3MKKwlyZXF1ZXN0cyBpbiBiYXRjaGVzIGluIG9yZGVyIHRvIGltcHJvdmUgZWZmaWNpZW5jaWVzLCB3aGljaCBjYW4KKwlmdXJ0aGVyIGRlbGF5IHN5bmNocm9uaXplX3JjdSgpLgorCisJU2luY2Ugc3luY2hyb25pemVfcmN1KCkgaXMgdGhlIEFQSSB0aGF0IG11c3QgZmlndXJlIG91dCB3aGVuCisJcmVhZGVycyBhcmUgZG9uZSwgaXRzIGltcGxlbWVudGF0aW9uIGlzIGtleSB0byBSQ1UuICBGb3IgUkNVCisJdG8gYmUgdXNlZnVsIGluIGFsbCBidXQgdGhlIG1vc3QgcmVhZC1pbnRlbnNpdmUgc2l0dWF0aW9ucywKKwlzeW5jaHJvbml6ZV9yY3UoKSdzIG92ZXJoZWFkIG11c3QgYWxzbyBiZSBxdWl0ZSBzbWFsbC4KKworCVRoZSBjYWxsX3JjdSgpIEFQSSBpcyBhIGNhbGxiYWNrIGZvcm0gb2Ygc3luY2hyb25pemVfcmN1KCksCisJYW5kIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBhIGxhdGVyIHNlY3Rpb24uICBJbnN0ZWFkIG9mCisJYmxvY2tpbmcsIGl0IHJlZ2lzdGVycyBhIGZ1bmN0aW9uIGFuZCBhcmd1bWVudCB3aGljaCBhcmUgaW52b2tlZAorCWFmdGVyIGFsbCBvbmdvaW5nIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgaGF2ZSBjb21wbGV0ZWQuCisJVGhpcyBjYWxsYmFjayB2YXJpYW50IGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZQorCWl0IGlzIGlsbGVnYWwgdG8gYmxvY2suCisKK3JjdV9hc3NpZ25fcG9pbnRlcigpCisKKwl0eXBlb2YocCkgcmN1X2Fzc2lnbl9wb2ludGVyKHAsIHR5cGVvZihwKSB2KTsKKworCVllcywgcmN1X2Fzc2lnbl9wb2ludGVyKCkgLWlzLSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLCB0aG91Z2ggaXQKKwl3b3VsZCBiZSBjb29sIHRvIGJlIGFibGUgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIGluIHRoaXMgbWFubmVyLgorCShDb21waWxlciBleHBlcnRzIHdpbGwgbm8gZG91YnQgZGlzYWdyZWUuKQorCisJVGhlIHVwZGF0ZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byBhbgorCVJDVS1wcm90ZWN0ZWQgcG9pbnRlciwgaW4gb3JkZXIgdG8gc2FmZWx5IGNvbW11bmljYXRlIHRoZSBjaGFuZ2UKKwlpbiB2YWx1ZSBmcm9tIHRoZSB1cGRhdGVyIHRvIHRoZSByZWFkZXIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKwl0aGUgbmV3IHZhbHVlLCBhbmQgYWxzbyBleGVjdXRlcyBhbnkgbWVtb3J5LWJhcnJpZXIgaW5zdHJ1Y3Rpb25zCisJcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gQ1BVIGFyY2hpdGVjdHVyZS4KKworCVBlcmhhcHMgbW9yZSBpbXBvcnRhbnQsIGl0IHNlcnZlcyB0byBkb2N1bWVudCB3aGljaCBwb2ludGVycworCWFyZSBwcm90ZWN0ZWQgYnkgUkNVLiAgVGhhdCBzYWlkLCByY3VfYXNzaWduX3BvaW50ZXIoKSBpcyBtb3N0CisJZnJlcXVlbnRseSB1c2VkIGluZGlyZWN0bHksIHZpYSB0aGUgX3JjdSBsaXN0LW1hbmlwdWxhdGlvbgorCXByaW1pdGl2ZXMgc3VjaCBhcyBsaXN0X2FkZF9yY3UoKS4KKworcmN1X2RlcmVmZXJlbmNlKCkKKworCXR5cGVvZihwKSByY3VfZGVyZWZlcmVuY2UocCk7CisKKwlMaWtlIHJjdV9hc3NpZ25fcG9pbnRlcigpLCByY3VfZGVyZWZlcmVuY2UoKSBtdXN0IGJlIGltcGxlbWVudGVkCisJYXMgYSBtYWNyby4KKworCVRoZSByZWFkZXIgdXNlcyByY3VfZGVyZWZlcmVuY2UoKSB0byBmZXRjaCBhbiBSQ1UtcHJvdGVjdGVkCisJcG9pbnRlciwgd2hpY2ggcmV0dXJucyBhIHZhbHVlIHRoYXQgbWF5IHRoZW4gYmUgc2FmZWx5CisJZGVyZWZlcmVuY2VkLiAgTm90ZSB0aGF0IHJjdV9kZWZlcmVuY2UoKSBkb2VzIG5vdCBhY3R1YWxseQorCWRlcmVmZXJlbmNlIHRoZSBwb2ludGVyLCBpbnN0ZWFkLCBpdCBwcm90ZWN0cyB0aGUgcG9pbnRlciBmb3IKKwlsYXRlciBkZXJlZmVyZW5jaW5nLiAgSXQgYWxzbyBleGVjdXRlcyBhbnkgbmVlZGVkIG1lbW9yeS1iYXJyaWVyCisJaW5zdHJ1Y3Rpb25zIGZvciBhIGdpdmVuIENQVSBhcmNoaXRlY3R1cmUuICBDdXJyZW50bHksIG9ubHkgQWxwaGEKKwluZWVkcyBtZW1vcnkgYmFycmllcnMgd2l0aGluIHJjdV9kZXJlZmVyZW5jZSgpIC0tIG9uIG90aGVyIENQVXMsCisJaXQgY29tcGlsZXMgdG8gbm90aGluZywgbm90IGV2ZW4gYSBjb21waWxlciBkaXJlY3RpdmUuCisKKwlDb21tb24gY29kaW5nIHByYWN0aWNlIHVzZXMgcmN1X2RlcmVmZXJlbmNlKCkgdG8gY29weSBhbgorCVJDVS1wcm90ZWN0ZWQgcG9pbnRlciB0byBhIGxvY2FsIHZhcmlhYmxlLCB0aGVuIGRlcmVmZXJlbmNlcworCXRoaXMgbG9jYWwgdmFyaWFibGUsIGZvciBleGFtcGxlIGFzIGZvbGxvd3M6CisKKwkJcCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLm5leHQpOworCQlyZXR1cm4gcC0+ZGF0YTsKKworCUhvd2V2ZXIsIGluIHRoaXMgY2FzZSwgb25lIGNvdWxkIGp1c3QgYXMgZWFzaWx5IGNvbWJpbmUgdGhlc2UKKwlpbnRvIG9uZSBzdGF0ZW1lbnQ6CisKKwkJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZShoZWFkLm5leHQpLT5kYXRhOworCisJSWYgeW91IGFyZSBnb2luZyB0byBiZSBmZXRjaGluZyBtdWx0aXBsZSBmaWVsZHMgZnJvbSB0aGUKKwlSQ1UtcHJvdGVjdGVkIHN0cnVjdHVyZSwgdXNpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGlzIG9mCisJY291cnNlIHByZWZlcnJlZC4gIFJlcGVhdGVkIHJjdV9kZXJlZmVyZW5jZSgpIGNhbGxzIGxvb2sKKwl1Z2x5IGFuZCBpbmN1ciB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBvbiBBbHBoYSBDUFVzLgorCisJTm90ZSB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSByY3VfZGVyZWZlcmVuY2UoKSBpcyB2YWxpZAorCW9ubHkgd2l0aGluIHRoZSBlbmNsb3NpbmcgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorCUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGlzIC1ub3QtIGxlZ2FsOgorCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLm5leHQpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJeCA9IHAtPmFkZHJlc3M7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJeSA9IHAtPmRhdGE7CisJCXJjdV9yZWFkX3VubG9jaygpOworCisJSG9sZGluZyBhIHJlZmVyZW5jZSBmcm9tIG9uZSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24KKwl0byBhbm90aGVyIGlzIGp1c3QgYXMgaWxsZWdhbCBhcyBob2xkaW5nIGEgcmVmZXJlbmNlIGZyb20KKwlvbmUgbG9jay1iYXNlZCBjcml0aWNhbCBzZWN0aW9uIHRvIGFub3RoZXIhICBTaW1pbGFybHksCisJdXNpbmcgYSByZWZlcmVuY2Ugb3V0c2lkZSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpbiB3aGljaAorCWl0IHdhcyBhY3F1aXJlZCBpcyBqdXN0IGFzIGlsbGVnYWwgYXMgZG9pbmcgc28gd2l0aCBub3JtYWwKKwlsb2NraW5nLgorCisJQXMgd2l0aCByY3VfYXNzaWduX3BvaW50ZXIoKSwgYW4gaW1wb3J0YW50IGZ1bmN0aW9uIG9mCisJcmN1X2RlcmVmZXJlbmNlKCkgaXMgdG8gZG9jdW1lbnQgd2hpY2ggcG9pbnRlcnMgYXJlIHByb3RlY3RlZAorCWJ5IFJDVS4gIEFuZCwgYWdhaW4gbGlrZSByY3VfYXNzaWduX3BvaW50ZXIoKSwgcmN1X2RlcmVmZXJlbmNlKCkKKwlpcyB0eXBpY2FsbHkgdXNlZCBpbmRpcmVjdGx5LCB2aWEgdGhlIF9yY3UgbGlzdC1tYW5pcHVsYXRpb24KKwlwcmltaXRpdmVzLCBzdWNoIGFzIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCkuCisKK1RoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyBob3cgZWFjaCBBUEkgY29tbXVuaWNhdGVzIGFtb25nIHRoZQorcmVhZGVyLCB1cGRhdGVyLCBhbmQgcmVjbGFpbWVyLgorCisKKwkgICAgcmN1X2Fzc2lnbl9wb2ludGVyKCkKKwkgICAgCQkJICAgICstLS0tLS0tLSsKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCByZWFkZXIgfC0tLS0tLS0tLSsKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKyAgICAgICAgIHwKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgUHJvdGVjdDoKKwkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgcmN1X3JlYWRfbG9jaygpCisJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IHJjdV9yZWFkX3VubG9jaygpCisJICAgIHwgICAgICAgIHJjdV9kZXJlZmVyZW5jZSgpICB8ICAgICAgICAgICAgICB8CisgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgIHwgdXBkYXRlciB8PC0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgIHwKKyAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IHJlY2xhaW1lciB8CisJICAgIAkJCQkgICAgICAgICArLS0tLS0tLS0tLS0rCisJICAgICAgRGVmZXI6CisJICAgICAgc3luY2hyb25pemVfcmN1KCkgJiBjYWxsX3JjdSgpCisKKworVGhlIFJDVSBpbmZyYXN0cnVjdHVyZSBvYnNlcnZlcyB0aGUgdGltZSBzZXF1ZW5jZSBvZiByY3VfcmVhZF9sb2NrKCksCityY3VfcmVhZF91bmxvY2soKSwgc3luY2hyb25pemVfcmN1KCksIGFuZCBjYWxsX3JjdSgpIGludm9jYXRpb25zIGluCitvcmRlciB0byBkZXRlcm1pbmUgd2hlbiAoMSkgc3luY2hyb25pemVfcmN1KCkgaW52b2NhdGlvbnMgbWF5IHJldHVybgordG8gdGhlaXIgY2FsbGVycyBhbmQgKDIpIGNhbGxfcmN1KCkgY2FsbGJhY2tzIG1heSBiZSBpbnZva2VkLiAgRWZmaWNpZW50CitpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFJDVSBpbmZyYXN0cnVjdHVyZSBtYWtlIGhlYXZ5IHVzZSBvZiBiYXRjaGluZyBpbgorb3JkZXIgdG8gYW1vcnRpemUgdGhlaXIgb3ZlcmhlYWQgb3ZlciBtYW55IHVzZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQVBJcy4KKworVGhlcmUgYXJlIG5vIGZld2VyIHRoYW4gdGhyZWUgUkNVIG1lY2hhbmlzbXMgaW4gdGhlIExpbnV4IGtlcm5lbDsgdGhlCitkaWFncmFtIGFib3ZlIHNob3dzIHRoZSBmaXJzdCBvbmUsIHdoaWNoIGlzIGJ5IGZhciB0aGUgbW9zdCBjb21tb25seSB1c2VkLgorVGhlIHJjdV9kZXJlZmVyZW5jZSgpIGFuZCByY3VfYXNzaWduX3BvaW50ZXIoKSBwcmltaXRpdmVzIGFyZSB1c2VkIGZvcgorYWxsIHRocmVlIG1lY2hhbmlzbXMsIGJ1dCBkaWZmZXJlbnQgZGVmZXIgYW5kIHByb3RlY3QgcHJpbWl0aXZlcyBhcmUKK3VzZWQgYXMgZm9sbG93czoKKworCURlZmVyCQkJUHJvdGVjdAorCithLglzeW5jaHJvbml6ZV9yY3UoKQlyY3VfcmVhZF9sb2NrKCkgLyByY3VfcmVhZF91bmxvY2soKQorCWNhbGxfcmN1KCkKKworYi4JY2FsbF9yY3VfYmgoKQkJcmN1X3JlYWRfbG9ja19iaCgpIC8gcmN1X3JlYWRfdW5sb2NrX2JoKCkKKworYy4Jc3luY2hyb25pemVfc2NoZWQoKQlwcmVlbXB0X2Rpc2FibGUoKSAvIHByZWVtcHRfZW5hYmxlKCkKKwkJCQlsb2NhbF9pcnFfc2F2ZSgpIC8gbG9jYWxfaXJxX3Jlc3RvcmUoKQorCQkJCWhhcmRpcnEgZW50ZXIgLyBoYXJkaXJxIGV4aXQKKwkJCQlOTUkgZW50ZXIgLyBOTUkgZXhpdAorCitUaGVzZSB0aHJlZSBtZWNoYW5pc21zIGFyZSB1c2VkIGFzIGZvbGxvd3M6CisKK2EuCVJDVSBhcHBsaWVkIHRvIG5vcm1hbCBkYXRhIHN0cnVjdHVyZXMuCisKK2IuCVJDVSBhcHBsaWVkIHRvIG5ldHdvcmtpbmcgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgbWF5IGJlIHN1YmplY3RlZAorCXRvIHJlbW90ZSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLgorCitjLglSQ1UgYXBwbGllZCB0byBzY2hlZHVsZXIgYW5kIGludGVycnVwdC9OTUktaGFuZGxlciB0YXNrcy4KKworQWdhaW4sIG1vc3QgdXNlcyB3aWxsIGJlIG9mIChhKS4gIFRoZSAoYikgYW5kIChjKSBjYXNlcyBhcmUgaW1wb3J0YW50Citmb3Igc3BlY2lhbGl6ZWQgdXNlcywgYnV0IGFyZSByZWxhdGl2ZWx5IHVuY29tbW9uLgorCisKKzMuICBXSEFUIEFSRSBTT01FIEVYQU1QTEUgVVNFUyBPRiBDT1JFIFJDVSBBUEk/CisKK1RoaXMgc2VjdGlvbiBzaG93cyBhIHNpbXBsZSB1c2Ugb2YgdGhlIGNvcmUgUkNVIEFQSSB0byBwcm90ZWN0IGEKK2dsb2JhbCBwb2ludGVyIHRvIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cnVjdHVyZS4gIE1vcmUgdHlwaWNhbAordXNlcyBvZiBSQ1UgbWF5IGJlIGZvdW5kIGluIGxpc3RSQ1UudHh0LCBhcnJheVJDVS50eHQsIGFuZCBOTUktUkNVLnR4dC4KKworCXN0cnVjdCBmb28geworCQlpbnQgYTsKKwkJY2hhciBiOworCQlsb25nIGM7CisJfTsKKwlERUZJTkVfU1BJTkxPQ0soZm9vX211dGV4KTsKKworCXN0cnVjdCBmb28gKmdibF9mb287CisKKwkvKgorCSAqIENyZWF0ZSBhIG5ldyBzdHJ1Y3QgZm9vIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBjdXJyZW50bHkKKwkgKiBwb2ludGVkIHRvIGJ5IGdibF9mb28sIGV4Y2VwdCB0aGF0IGZpZWxkICJhIiBpcyByZXBsYWNlZAorCSAqIHdpdGggIm5ld19hIi4gIFBvaW50cyBnYmxfZm9vIHRvIHRoZSBuZXcgc3RydWN0dXJlLCBhbmQKKwkgKiBmcmVlcyB1cCB0aGUgb2xkIHN0cnVjdHVyZSBhZnRlciBhIGdyYWNlIHBlcmlvZC4KKwkgKgorCSAqIFVzZXMgcmN1X2Fzc2lnbl9wb2ludGVyKCkgdG8gZW5zdXJlIHRoYXQgY29uY3VycmVudCByZWFkZXJzCisJICogc2VlIHRoZSBpbml0aWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBuZXcgc3RydWN0dXJlLgorCSAqCisJICogVXNlcyBzeW5jaHJvbml6ZV9yY3UoKSB0byBlbnN1cmUgdGhhdCBhbnkgcmVhZGVycyB0aGF0IG1pZ2h0CisJICogaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgc3RydWN0dXJlIGNvbXBsZXRlIGJlZm9yZSBmcmVlaW5nCisJICogdGhlIG9sZCBzdHJ1Y3R1cmUuCisJICovCisJdm9pZCBmb29fdXBkYXRlX2EoaW50IG5ld19hKQorCXsKKwkJc3RydWN0IGZvbyAqbmV3X2ZwOworCQlzdHJ1Y3QgZm9vICpvbGRfZnA7CisKKwkJbmV3X2ZwID0ga21hbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CisJCXNwaW5fbG9jaygmZm9vX211dGV4KTsKKwkJb2xkX2ZwID0gZ2JsX2ZvbzsKKwkJKm5ld19mcCA9ICpvbGRfZnA7CisJCW5ld19mcC0+YSA9IG5ld19hOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZ2JsX2ZvbywgbmV3X2ZwKTsKKwkJc3Bpbl91bmxvY2soJmZvb19tdXRleCk7CisJCXN5bmNocm9uaXplX3JjdSgpOworCQlrZnJlZShvbGRfZnApOworCX0KKworCS8qCisJICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBmaWVsZCAiYSIgb2YgdGhlIGN1cnJlbnQgZ2JsX2ZvbworCSAqIHN0cnVjdHVyZS4gIFVzZSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpCisJICogdG8gZW5zdXJlIHRoYXQgdGhlIHN0cnVjdHVyZSBkb2VzIG5vdCBnZXQgZGVsZXRlZCBvdXQKKwkgKiBmcm9tIHVuZGVyIHVzLCBhbmQgdXNlIHJjdV9kZXJlZmVyZW5jZSgpIHRvIGVuc3VyZSB0aGF0CisJICogd2Ugc2VlIHRoZSBpbml0aWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUgKGltcG9ydGFudAorCSAqIGZvciBERUMgQWxwaGEgYW5kIGZvciBwZW9wbGUgcmVhZGluZyB0aGUgY29kZSkuCisJICovCisJaW50IGZvb19nZXRfYSh2b2lkKQorCXsKKwkJaW50IHJldHZhbDsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXJldHZhbCA9IHJjdV9kZXJlZmVyZW5jZShnYmxfZm9vKS0+YTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCitTbywgdG8gc3VtIHVwOgorCitvCVVzZSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpIHRvIGd1YXJkIFJDVQorCXJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucy4KKworbwlXaXRoaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLCB1c2UgcmN1X2RlcmVmZXJlbmNlKCkKKwl0byBkZXJlZmVyZW5jZSBSQ1UtcHJvdGVjdGVkIHBvaW50ZXJzLgorCitvCVVzZSBzb21lIHNvbGlkIHNjaGVtZSAoc3VjaCBhcyBsb2NrcyBvciBzZW1hcGhvcmVzKSB0bworCWtlZXAgY29uY3VycmVudCB1cGRhdGVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLgorCitvCVVzZSByY3VfYXNzaWduX3BvaW50ZXIoKSB0byB1cGRhdGUgYW4gUkNVLXByb3RlY3RlZCBwb2ludGVyLgorCVRoaXMgcHJpbWl0aXZlIHByb3RlY3RzIGNvbmN1cnJlbnQgcmVhZGVycyBmcm9tIHRoZSB1cGRhdGVyLAorCS1ub3QtIGNvbmN1cnJlbnQgdXBkYXRlcyBmcm9tIGVhY2ggb3RoZXIhICBZb3UgdGhlcmVmb3JlIHN0aWxsCisJbmVlZCB0byB1c2UgbG9ja2luZyAob3Igc29tZXRoaW5nIHNpbWlsYXIpIHRvIGtlZXAgY29uY3VycmVudAorCXJjdV9hc3NpZ25fcG9pbnRlcigpIHByaW1pdGl2ZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIuCisKK28JVXNlIHN5bmNocm9uaXplX3JjdSgpIC1hZnRlci0gcmVtb3ZpbmcgYSBkYXRhIGVsZW1lbnQgZnJvbSBhbgorCVJDVS1wcm90ZWN0ZWQgZGF0YSBzdHJ1Y3R1cmUsIGJ1dCAtYmVmb3JlLSByZWNsYWltaW5nL2ZyZWVpbmcKKwl0aGUgZGF0YSBlbGVtZW50LCBpbiBvcmRlciB0byB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiBhbGwKKwlSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIHRoYXQgbWlnaHQgYmUgcmVmZXJlbmNpbmcgdGhhdAorCWRhdGEgaXRlbS4KKworU2VlIGNoZWNrbGlzdC50eHQgZm9yIGFkZGl0aW9uYWwgcnVsZXMgdG8gZm9sbG93IHdoZW4gdXNpbmcgUkNVLgorCisKKzQuICBXSEFUIElGIE1ZIFVQREFUSU5HIFRIUkVBRCBDQU5OT1QgQkxPQ0s/CisKK0luIHRoZSBleGFtcGxlIGFib3ZlLCBmb29fdXBkYXRlX2EoKSBibG9ja3MgdW50aWwgYSBncmFjZSBwZXJpb2QgZWxhcHNlcy4KK1RoaXMgaXMgcXVpdGUgc2ltcGxlLCBidXQgaW4gc29tZSBjYXNlcyBvbmUgY2Fubm90IGFmZm9yZCB0byB3YWl0IHNvCitsb25nIC0tIHRoZXJlIG1pZ2h0IGJlIG90aGVyIGhpZ2gtcHJpb3JpdHkgd29yayB0byBiZSBkb25lLgorCitJbiBzdWNoIGNhc2VzLCBvbmUgdXNlcyBjYWxsX3JjdSgpIHJhdGhlciB0aGFuIHN5bmNocm9uaXplX3JjdSgpLgorVGhlIGNhbGxfcmN1KCkgQVBJIGlzIGFzIGZvbGxvd3M6CisKKwl2b2lkIGNhbGxfcmN1KHN0cnVjdCByY3VfaGVhZCAqIGhlYWQsCisJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKTsKKworVGhpcyBmdW5jdGlvbiBpbnZva2VzIGZ1bmMoaGVhZCkgYWZ0ZXIgYSBncmFjZSBwZXJpb2QgaGFzIGVsYXBzZWQuCitUaGlzIGludm9jYXRpb24gbWlnaHQgaGFwcGVuIGZyb20gZWl0aGVyIHNvZnRpcnEgb3IgcHJvY2VzcyBjb250ZXh0LAorc28gdGhlIGZ1bmN0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmxvY2suICBUaGUgZm9vIHN0cnVjdCBuZWVkcyB0bworaGF2ZSBhbiByY3VfaGVhZCBzdHJ1Y3R1cmUgYWRkZWQsIHBlcmhhcHMgYXMgZm9sbG93czoKKworCXN0cnVjdCBmb28geworCQlpbnQgYTsKKwkJY2hhciBiOworCQlsb25nIGM7CisJCXN0cnVjdCByY3VfaGVhZCByY3U7CisJfTsKKworVGhlIGZvb191cGRhdGVfYSgpIGZ1bmN0aW9uIG1pZ2h0IHRoZW4gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgorCisJLyoKKwkgKiBDcmVhdGUgYSBuZXcgc3RydWN0IGZvbyB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgY3VycmVudGx5CisJICogcG9pbnRlZCB0byBieSBnYmxfZm9vLCBleGNlcHQgdGhhdCBmaWVsZCAiYSIgaXMgcmVwbGFjZWQKKwkgKiB3aXRoICJuZXdfYSIuICBQb2ludHMgZ2JsX2ZvbyB0byB0aGUgbmV3IHN0cnVjdHVyZSwgYW5kCisJICogZnJlZXMgdXAgdGhlIG9sZCBzdHJ1Y3R1cmUgYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCisJICoKKwkgKiBVc2VzIHJjdV9hc3NpZ25fcG9pbnRlcigpIHRvIGVuc3VyZSB0aGF0IGNvbmN1cnJlbnQgcmVhZGVycworCSAqIHNlZSB0aGUgaW5pdGlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgbmV3IHN0cnVjdHVyZS4KKwkgKgorCSAqIFVzZXMgY2FsbF9yY3UoKSB0byBlbnN1cmUgdGhhdCBhbnkgcmVhZGVycyB0aGF0IG1pZ2h0IGhhdmUKKwkgKiByZWZlcmVuY2VzIHRvIHRoZSBvbGQgc3RydWN0dXJlIGNvbXBsZXRlIGJlZm9yZSBmcmVlaW5nIHRoZQorCSAqIG9sZCBzdHJ1Y3R1cmUuCisJICovCisJdm9pZCBmb29fdXBkYXRlX2EoaW50IG5ld19hKQorCXsKKwkJc3RydWN0IGZvbyAqbmV3X2ZwOworCQlzdHJ1Y3QgZm9vICpvbGRfZnA7CisKKwkJbmV3X2ZwID0ga21hbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CisJCXNwaW5fbG9jaygmZm9vX211dGV4KTsKKwkJb2xkX2ZwID0gZ2JsX2ZvbzsKKwkJKm5ld19mcCA9ICpvbGRfZnA7CisJCW5ld19mcC0+YSA9IG5ld19hOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZ2JsX2ZvbywgbmV3X2ZwKTsKKwkJc3Bpbl91bmxvY2soJmZvb19tdXRleCk7CisJCWNhbGxfcmN1KCZvbGRfZnAtPnJjdSwgZm9vX3JlY2xhaW0pOworCX0KKworVGhlIGZvb19yZWNsYWltKCkgZnVuY3Rpb24gbWlnaHQgYXBwZWFyIGFzIGZvbGxvd3M6CisKKwl2b2lkIGZvb19yZWNsYWltKHN0cnVjdCByY3VfaGVhZCAqcnApCisJeworCQlzdHJ1Y3QgZm9vICpmcCA9IGNvbnRhaW5lcl9vZihycCwgc3RydWN0IGZvbywgcmN1KTsKKworCQlrZnJlZShmcCk7CisJfQorCitUaGUgY29udGFpbmVyX29mKCkgcHJpbWl0aXZlIGlzIGEgbWFjcm8gdGhhdCwgZ2l2ZW4gYSBwb2ludGVyIGludG8gYQorc3RydWN0LCB0aGUgdHlwZSBvZiB0aGUgc3RydWN0LCBhbmQgdGhlIHBvaW50ZWQtdG8gZmllbGQgd2l0aGluIHRoZQorc3RydWN0LCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3QuCisKK1RoZSB1c2Ugb2YgY2FsbF9yY3UoKSBwZXJtaXRzIHRoZSBjYWxsZXIgb2YgZm9vX3VwZGF0ZV9hKCkgdG8KK2ltbWVkaWF0ZWx5IHJlZ2FpbiBjb250cm9sLCB3aXRob3V0IG5lZWRpbmcgdG8gd29ycnkgZnVydGhlciBhYm91dCB0aGUKK29sZCB2ZXJzaW9uIG9mIHRoZSBuZXdseSB1cGRhdGVkIGVsZW1lbnQuICBJdCBhbHNvIGNsZWFybHkgc2hvd3MgdGhlCitSQ1UgZGlzdGluY3Rpb24gYmV0d2VlbiB1cGRhdGVyLCBuYW1lbHkgZm9vX3VwZGF0ZV9hKCksIGFuZCByZWNsYWltZXIsCituYW1lbHkgZm9vX3JlY2xhaW0oKS4KKworVGhlIHN1bW1hcnkgb2YgYWR2aWNlIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgcHJldmlvdXMgc2VjdGlvbiwgZXhjZXB0Cit0aGF0IHdlIGFyZSBub3cgdXNpbmcgY2FsbF9yY3UoKSByYXRoZXIgdGhhbiBzeW5jaHJvbml6ZV9yY3UoKToKKworbwlVc2UgY2FsbF9yY3UoKSAtYWZ0ZXItIHJlbW92aW5nIGEgZGF0YSBlbGVtZW50IGZyb20gYW4KKwlSQ1UtcHJvdGVjdGVkIGRhdGEgc3RydWN0dXJlIGluIG9yZGVyIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sKKwlmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBhbGwgUkNVCisJcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIHRoYXQgbWlnaHQgYmUgcmVmZXJlbmNpbmcgdGhhdAorCWRhdGEgaXRlbS4KKworQWdhaW4sIHNlZSBjaGVja2xpc3QudHh0IGZvciBhZGRpdGlvbmFsIHJ1bGVzIGdvdmVybmluZyB0aGUgdXNlIG9mIFJDVS4KKworCis1LiAgV0hBVCBBUkUgU09NRSBTSU1QTEUgSU1QTEVNRU5UQVRJT05TIE9GIFJDVT8KKworT25lIG9mIHRoZSBuaWNlIHRoaW5ncyBhYm91dCBSQ1UgaXMgdGhhdCBpdCBoYXMgZXh0cmVtZWx5IHNpbXBsZSAidG95IgoraW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGEgZ29vZCBmaXJzdCBzdGVwIHRvd2FyZHMgdW5kZXJzdGFuZGluZyB0aGUKK3Byb2R1Y3Rpb24tcXVhbGl0eSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIExpbnV4IGtlcm5lbC4gIFRoaXMgc2VjdGlvbgorcHJlc2VudHMgdHdvIHN1Y2ggInRveSIgaW1wbGVtZW50YXRpb25zIG9mIFJDVSwgb25lIHRoYXQgaXMgaW1wbGVtZW50ZWQKK2luIHRlcm1zIG9mIGZhbWlsaWFyIGxvY2tpbmcgcHJpbWl0aXZlcywgYW5kIGFub3RoZXIgdGhhdCBtb3JlIGNsb3NlbHkKK3Jlc2VtYmxlcyAiY2xhc3NpYyIgUkNVLiAgQm90aCBhcmUgd2F5IHRvbyBzaW1wbGUgZm9yIHJlYWwtd29ybGQgdXNlLAorbGFja2luZyBib3RoIGZ1bmN0aW9uYWxpdHkgYW5kIHBlcmZvcm1hbmNlLiAgSG93ZXZlciwgdGhleSBhcmUgdXNlZnVsCitpbiBnZXR0aW5nIGEgZmVlbCBmb3IgaG93IFJDVSB3b3Jrcy4gIFNlZSBrZXJuZWwvcmN1cGRhdGUuYyBmb3IgYQorcHJvZHVjdGlvbi1xdWFsaXR5IGltcGxlbWVudGF0aW9uLCBhbmQgc2VlOgorCisJaHR0cDovL3d3dy5yZHJvcC5jb20vdXNlcnMvcGF1bG1jay9SQ1UKKworZm9yIHBhcGVycyBkZXNjcmliaW5nIHRoZSBMaW51eCBrZXJuZWwgUkNVIGltcGxlbWVudGF0aW9uLiAgVGhlIE9MUycwMQorYW5kIE9MUycwMiBwYXBlcnMgYXJlIGEgZ29vZCBpbnRyb2R1Y3Rpb24sIGFuZCB0aGUgZGlzc2VydGF0aW9uIHByb3ZpZGVzCittb3JlIGRldGFpbHMgb24gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCisKKworNUEuICAiVE9ZIiBJTVBMRU1FTlRBVElPTiAjMTogTE9DS0lORworCitUaGlzIHNlY3Rpb24gcHJlc2VudHMgYSAidG95IiBSQ1UgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBiYXNlZCBvbgorZmFtaWxpYXIgbG9ja2luZyBwcmltaXRpdmVzLiAgSXRzIG92ZXJoZWFkIG1ha2VzIGl0IGEgbm9uLXN0YXJ0ZXIgZm9yCityZWFsLWxpZmUgdXNlLCBhcyBkb2VzIGl0cyBsYWNrIG9mIHNjYWxhYmlsaXR5LiAgSXQgaXMgYWxzbyB1bnN1aXRhYmxlCitmb3IgcmVhbHRpbWUgdXNlLCBzaW5jZSBpdCBhbGxvd3Mgc2NoZWR1bGluZyBsYXRlbmN5IHRvICJibGVlZCIgZnJvbQorb25lIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIHRvIGFub3RoZXIuCisKK0hvd2V2ZXIsIGl0IGlzIHByb2JhYmx5IHRoZSBlYXNpZXN0IGltcGxlbWVudGF0aW9uIHRvIHJlbGF0ZSB0bywgc28gaXMKK2EgZ29vZCBzdGFydGluZyBwb2ludC4KKworSXQgaXMgZXh0cmVtZWx5IHNpbXBsZToKKworCXN0YXRpYyBERUZJTkVfUldMT0NLKHJjdV9ncF9tdXRleCk7CisKKwl2b2lkIHJjdV9yZWFkX2xvY2sodm9pZCkKKwl7CisJCXJlYWRfbG9jaygmcmN1X2dwX211dGV4KTsKKwl9CisKKwl2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKQorCXsKKwkJcmVhZF91bmxvY2soJnJjdV9ncF9tdXRleCk7CisJfQorCisJdm9pZCBzeW5jaHJvbml6ZV9yY3Uodm9pZCkKKwl7CisJCXdyaXRlX2xvY2soJnJjdV9ncF9tdXRleCk7CisJCXdyaXRlX3VubG9jaygmcmN1X2dwX211dGV4KTsKKwl9CisKK1tZb3UgY2FuIGlnbm9yZSByY3VfYXNzaWduX3BvaW50ZXIoKSBhbmQgcmN1X2RlcmVmZXJlbmNlKCkgd2l0aG91dAorbWlzc2luZyBtdWNoLiAgQnV0IGhlcmUgdGhleSBhcmUgYW55d2F5LiAgQW5kIHdoYXRldmVyIHlvdSBkbywgZG9uJ3QKK2ZvcmdldCBhYm91dCB0aGVtIHdoZW4gc3VibWl0dGluZyBwYXRjaGVzIG1ha2luZyB1c2Ugb2YgUkNVIV0KKworCSNkZWZpbmUgcmN1X2Fzc2lnbl9wb2ludGVyKHAsIHYpCSh7IFwKKwkJCQkJCQlzbXBfd21iKCk7IFwKKwkJCQkJCQkocCkgPSAodik7IFwKKwkJCQkJCX0pCisKKwkjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZShwKSAgICAgKHsgXAorCQkJCQl0eXBlb2YocCkgX19fX19fX19fcDEgPSBwOyBcCisJCQkJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyBcCisJCQkJCShfX19fX19fX19wMSk7IFwKKwkJCQkJfSkKKworCitUaGUgcmN1X3JlYWRfbG9jaygpIGFuZCByY3VfcmVhZF91bmxvY2soKSBwcmltaXRpdmUgcmVhZC1hY3F1aXJlCithbmQgcmVsZWFzZSBhIGdsb2JhbCByZWFkZXItd3JpdGVyIGxvY2suICBUaGUgc3luY2hyb25pemVfcmN1KCkKK3ByaW1pdGl2ZSB3cml0ZS1hY3F1aXJlcyB0aGlzIHNhbWUgbG9jaywgdGhlbiBpbW1lZGlhdGVseSByZWxlYXNlcworaXQuICBUaGlzIG1lYW5zIHRoYXQgb25jZSBzeW5jaHJvbml6ZV9yY3UoKSBleGl0cywgYWxsIFJDVSByZWFkLXNpZGUKK2NyaXRpY2FsIHNlY3Rpb25zIHRoYXQgd2VyZSBpbiBwcm9ncmVzcyBiZWZvcmUgc3luY2hvbml6ZV9yY3UoKSB3YXMKK2NhbGxlZCBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBsZXRlZCAtLSB0aGVyZSBpcyBubyB3YXkgdGhhdAorc3luY2hyb25pemVfcmN1KCkgd291bGQgaGF2ZSBiZWVuIGFibGUgdG8gd3JpdGUtYWNxdWlyZSB0aGUgbG9jaworb3RoZXJ3aXNlLgorCitJdCBpcyBwb3NzaWJsZSB0byBuZXN0IHJjdV9yZWFkX2xvY2soKSwgc2luY2UgcmVhZGVyLXdyaXRlciBsb2NrcyBtYXkKK2JlIHJlY3Vyc2l2ZWx5IGFjcXVpcmVkLiAgTm90ZSBhbHNvIHRoYXQgcmN1X3JlYWRfbG9jaygpIGlzIGltbXVuZQorZnJvbSBkZWFkbG9jayAoYW4gaW1wb3J0YW50IHByb3BlcnR5IG9mIFJDVSkuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzCit0aGF0IHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIGJsb2NrIHJjdV9yZWFkX2xvY2soKSBpcyBhIHN5bmNocm9uaXplX3JjdSgpLgorQnV0IHN5bmNocm9uaXplX3JjdSgpIGRvZXMgbm90IGFjcXVpcmUgYW55IGxvY2tzIHdoaWxlIGhvbGRpbmcgcmN1X2dwX211dGV4LAorc28gdGhlcmUgY2FuIGJlIG5vIGRlYWRsb2NrIGN5Y2xlLgorCitRdWljayBRdWl6ICMxOglXaHkgaXMgdGhpcyBhcmd1bWVudCBuYWl2ZT8gIEhvdyBjb3VsZCBhIGRlYWRsb2NrCisJCW9jY3VyIHdoZW4gdXNpbmcgdGhpcyBhbGdvcml0aG0gaW4gYSByZWFsLXdvcmxkIExpbnV4CisJCWtlcm5lbD8gIEhvdyBjb3VsZCB0aGlzIGRlYWRsb2NrIGJlIGF2b2lkZWQ/CisKKworNUIuICAiVE9ZIiBFWEFNUExFICMyOiBDTEFTU0lDIFJDVQorCitUaGlzIHNlY3Rpb24gcHJlc2VudHMgYSAidG95IiBSQ1UgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBiYXNlZCBvbgorImNsYXNzaWMgUkNVIi4gIEl0IGlzIGFsc28gc2hvcnQgb24gcGVyZm9ybWFuY2UgKGJ1dCBvbmx5IGZvciB1cGRhdGVzKSBhbmQKK29uIGZlYXR1cmVzIHN1Y2ggYXMgaG90cGx1ZyBDUFUgYW5kIHRoZSBhYmlsaXR5IHRvIHJ1biBpbiBDT05GSUdfUFJFRU1QVAora2VybmVscy4gIFRoZSBkZWZpbml0aW9ucyBvZiByY3VfZGVyZWZlcmVuY2UoKSBhbmQgcmN1X2Fzc2lnbl9wb2ludGVyKCkKK2FyZSB0aGUgc2FtZSBhcyB0aG9zZSBzaG93biBpbiB0aGUgcHJlY2VkaW5nIHNlY3Rpb24sIHNvIHRoZXkgYXJlIG9taXR0ZWQuCisKKwl2b2lkIHJjdV9yZWFkX2xvY2sodm9pZCkgeyB9CisKKwl2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKSB7IH0KKworCXZvaWQgc3luY2hyb25pemVfcmN1KHZvaWQpCisJeworCQlpbnQgY3B1OworCisJCWZvcl9lYWNoX2NwdShjcHUpCisJCQlydW5fb24oY3B1KTsKKwl9CisKK05vdGUgdGhhdCByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpIGRvIGFic29sdXRlbHkgbm90aGluZy4KK1RoaXMgaXMgdGhlIGdyZWF0IHN0cmVuZ3RoIG9mIGNsYXNzaWMgUkNVIGluIGEgbm9uLXByZWVtcHRpdmUga2VybmVsOgorcmVhZC1zaWRlIG92ZXJoZWFkIGlzIHByZWNpc2VseSB6ZXJvLCBhdCBsZWFzdCBvbiBub24tQWxwaGEgQ1BVcy4KK0FuZCB0aGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdheSB0aGF0IHJjdV9yZWFkX2xvY2soKSBjYW4gcG9zc2libHkKK3BhcnRpY2lwYXRlIGluIGEgZGVhZGxvY2sgY3ljbGUhCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6ZV9yY3UoKSBzaW1wbHkgc2NoZWR1bGVzIGl0c2VsZiBvbiBlYWNoCitDUFUgaW4gdHVybi4gIFRoZSBydW5fb24oKSBwcmltaXRpdmUgY2FuIGJlIGltcGxlbWVudGVkIHN0cmFpZ2h0Zm9yd2FyZGx5CitpbiB0ZXJtcyBvZiB0aGUgc2NoZWRfc2V0YWZmaW5pdHkoKSBwcmltaXRpdmUuICBPZiBjb3Vyc2UsIGEgc29tZXdoYXQgbGVzcworInRveSIgaW1wbGVtZW50YXRpb24gd291bGQgcmVzdG9yZSB0aGUgYWZmaW5pdHkgdXBvbiBjb21wbGV0aW9uIHJhdGhlcgordGhhbiBqdXN0IGxlYXZpbmcgYWxsIHRhc2tzIHJ1bm5pbmcgb24gdGhlIGxhc3QgQ1BVLCBidXQgd2hlbiBJIHNhaWQKKyJ0b3kiLCBJIG1lYW50IC10b3ktIQorCitTbyBob3cgdGhlIGhlY2sgaXMgdGhpcyBzdXBwb3NlZCB0byB3b3JrPz8/CisKK1JlbWVtYmVyIHRoYXQgaXQgaXMgaWxsZWdhbCB0byBibG9jayB3aGlsZSBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCitzZWN0aW9uLiAgVGhlcmVmb3JlLCBpZiBhIGdpdmVuIENQVSBleGVjdXRlcyBhIGNvbnRleHQgc3dpdGNoLCB3ZSBrbm93Cit0aGF0IGl0IG11c3QgaGF2ZSBjb21wbGV0ZWQgYWxsIHByZWNlZGluZyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgorT25jZSAtYWxsLSBDUFVzIGhhdmUgZXhlY3V0ZWQgYSBjb250ZXh0IHN3aXRjaCwgdGhlbiAtYWxsLSBwcmVjZWRpbmcKK1JDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgd2lsbCBoYXZlIGNvbXBsZXRlZC4KKworU28sIHN1cHBvc2UgdGhhdCB3ZSByZW1vdmUgYSBkYXRhIGl0ZW0gZnJvbSBpdHMgc3RydWN0dXJlIGFuZCB0aGVuIGludm9rZQorc3luY2hyb25pemVfcmN1KCkuICBPbmNlIHN5bmNocm9uaXplX3JjdSgpIHJldHVybnMsIHdlIGFyZSBndWFyYW50ZWVkCit0aGF0IHRoZXJlIGFyZSBubyBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGhvbGRpbmcgYSByZWZlcmVuY2UKK3RvIHRoYXQgZGF0YSBpdGVtLCBzbyB3ZSBjYW4gc2FmZWx5IHJlY2xhaW0gaXQuCisKK1F1aWNrIFF1aXogIzI6CUdpdmUgYW4gZXhhbXBsZSB3aGVyZSBDbGFzc2ljIFJDVSdzIHJlYWQtc2lkZQorCQlvdmVyaGVhZCBpcyAtbmVnYXRpdmUtLgorCitRdWljayBRdWl6ICMzOiAgSWYgaXQgaXMgaWxsZWdhbCB0byBibG9jayBpbiBhbiBSQ1UgcmVhZC1zaWRlCisJCWNyaXRpY2FsIHNlY3Rpb24sIHdoYXQgdGhlIGhlY2sgZG8geW91IGRvIGluCisJCVBSRUVNUFRfUlQsIHdoZXJlIG5vcm1hbCBzcGlubG9ja3MgY2FuIGJsb2NrPz8/CisKKworNi4gIEFOQUxPR1kgV0lUSCBSRUFERVItV1JJVEVSIExPQ0tJTkcKKworQWx0aG91Z2ggUkNVIGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXMsIGEgdmVyeSBjb21tb24gdXNlIG9mCitSQ1UgaXMgYW5hbG9nb3VzIHRvIHJlYWRlci13cml0ZXIgbG9ja2luZy4gIFRoZSBmb2xsb3dpbmcgdW5pZmllZAorZGlmZiBzaG93cyBob3cgY2xvc2VseSByZWxhdGVkIFJDVSBhbmQgcmVhZGVyLXdyaXRlciBsb2NraW5nIGNhbiBiZS4KKworCUBAIC0xMywxNSArMTQsMTUgQEAKKwkJc3RydWN0IGxpc3RfaGVhZCAqbHA7CisJCXN0cnVjdCBlbCAqcDsKKworCS0JcmVhZF9sb2NrKCk7CisJLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGhlYWQsIGxwKSB7CisJKwlyY3VfcmVhZF9sb2NrKCk7CisJKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBoZWFkLCBscCkgeworCQkJaWYgKHAtPmtleSA9PSBrZXkpIHsKKwkJCQkqcmVzdWx0ID0gcC0+ZGF0YTsKKwktCQkJcmVhZF91bmxvY2soKTsKKwkrCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwktCXJlYWRfdW5sb2NrKCk7CisJKwlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIDA7CisJIH0KKworCUBAIC0yOSwxNSArMzAsMTYgQEAKKwkgeworCQlzdHJ1Y3QgZWwgKnA7CisKKwktCXdyaXRlX2xvY2soJmxpc3RtdXRleCk7CisJKwlzcGluX2xvY2soJmxpc3RtdXRleCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgaGVhZCwgbHApIHsKKwkJCWlmIChwLT5rZXkgPT0ga2V5KSB7CisJCQkJbGlzdF9kZWwoJnAtPmxpc3QpOworCS0JCQl3cml0ZV91bmxvY2soJmxpc3RtdXRleCk7CisJKwkJCXNwaW5fdW5sb2NrKCZsaXN0bXV0ZXgpOworCSsJCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJCQlrZnJlZShwKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCS0Jd3JpdGVfdW5sb2NrKCZsaXN0bXV0ZXgpOworCSsJc3Bpbl91bmxvY2soJmxpc3RtdXRleCk7CisJCXJldHVybiAwOworCSB9CisKK09yLCBmb3IgdGhvc2Ugd2hvIHByZWZlciBhIHNpZGUtYnktc2lkZSBsaXN0aW5nOgorCisgMSBzdHJ1Y3QgZWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgMSBzdHJ1Y3QgZWwgeworIDIgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgICAgICAgICAgIDIgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisgMyAgIGxvbmcga2V5OyAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgIGxvbmcga2V5OworIDQgICBzcGlubG9ja190IG11dGV4OyAgICAgICAgICAgICAgICAgIDQgICBzcGlubG9ja190IG11dGV4OworIDUgICBpbnQgZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIDUgICBpbnQgZGF0YTsKKyA2ICAgLyogT3RoZXIgZGF0YSBmaWVsZHMgKi8gICAgICAgICAgICA2ICAgLyogT3RoZXIgZGF0YSBmaWVsZHMgKi8KKyA3IH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IH07CisgOCBzcGlubG9ja190IGxpc3RtdXRleDsgICAgICAgICAgICAgICAgOCBzcGlubG9ja190IGxpc3RtdXRleDsKKyA5IHN0cnVjdCBlbCBoZWFkOyAgICAgICAgICAgICAgICAgICAgICA5IHN0cnVjdCBlbCBoZWFkOworCisgMSBpbnQgc2VhcmNoKGxvbmcga2V5LCBpbnQgKnJlc3VsdCkgICAgMSBpbnQgc2VhcmNoKGxvbmcga2V5LCBpbnQgKnJlc3VsdCkKKyAyIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIHsKKyAzICAgc3RydWN0IGxpc3RfaGVhZCAqbHA7ICAgICAgICAgICAgICAzICAgc3RydWN0IGxpc3RfaGVhZCAqbHA7CisgNCAgIHN0cnVjdCBlbCAqcDsgICAgICAgICAgICAgICAgICAgICAgNCAgIHN0cnVjdCBlbCAqcDsKKyA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisgNiAgIHJlYWRfbG9jaygpOyAgICAgICAgICAgICAgICAgICAgICAgNiAgIHJjdV9yZWFkX2xvY2soKTsKKyA3ICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBoZWFkLCBscCkgeyA3ICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocCwgaGVhZCwgbHApIHsKKyA4ICAgICBpZiAocC0+a2V5ID09IGtleSkgeyAgICAgICAgICAgICA4ICAgICBpZiAocC0+a2V5ID09IGtleSkgeworIDkgICAgICAgKnJlc3VsdCA9IHAtPmRhdGE7ICAgICAgICAgICAgIDkgICAgICAgKnJlc3VsdCA9IHAtPmRhdGE7CisxMCAgICAgICByZWFkX3VubG9jaygpOyAgICAgICAgICAgICAgICAxMCAgICAgICByY3VfcmVhZF91bmxvY2soKTsKKzExICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgIDExICAgICAgIHJldHVybiAxOworMTIgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgIH0KKzEzICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgfQorMTQgICByZWFkX3VubG9jaygpOyAgICAgICAgICAgICAgICAgICAgMTQgICByY3VfcmVhZF91bmxvY2soKTsKKzE1ICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgcmV0dXJuIDA7CisxNiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiB9CisKKyAxIGludCBkZWxldGUobG9uZyBrZXkpICAgICAgICAgICAgICAgICAxIGludCBkZWxldGUobG9uZyBrZXkpCisgMiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiB7CisgMyAgIHN0cnVjdCBlbCAqcDsgICAgICAgICAgICAgICAgICAgICAgMyAgIHN0cnVjdCBlbCAqcDsKKyA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisgNSAgIHdyaXRlX2xvY2soJmxpc3RtdXRleCk7ICAgICAgICAgICAgNSAgIHNwaW5fbG9jaygmbGlzdG11dGV4KTsKKyA2ICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBoZWFkLCBscCkgeyA2ICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBoZWFkLCBscCkgeworIDcgICAgIGlmIChwLT5rZXkgPT0ga2V5KSB7ICAgICAgICAgICAgIDcgICAgIGlmIChwLT5rZXkgPT0ga2V5KSB7CisgOCAgICAgICBsaXN0X2RlbCgmcC0+bGlzdCk7ICAgICAgICAgICAgOCAgICAgICBsaXN0X2RlbCgmcC0+bGlzdCk7CisgOSAgICAgICB3cml0ZV91bmxvY2soJmxpc3RtdXRleCk7ICAgICAgOSAgICAgICBzcGluX3VubG9jaygmbGlzdG11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgIHN5bmNocm9uaXplX3JjdSgpOworMTAgICAgICAga2ZyZWUocCk7ICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAga2ZyZWUocCk7CisxMSAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAxMiAgICAgICByZXR1cm4gMTsKKzEyICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgICB9CisxMyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgIH0KKzE0ICAgd3JpdGVfdW5sb2NrKCZsaXN0bXV0ZXgpOyAgICAgICAgIDE1ICAgc3Bpbl91bmxvY2soJmxpc3RtdXRleCk7CisxNSAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgIHJldHVybiAwOworMTYgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcgfQorCitFaXRoZXIgd2F5LCB0aGUgZGlmZmVyZW5jZXMgYXJlIHF1aXRlIHNtYWxsLiAgUmVhZC1zaWRlIGxvY2tpbmcgbW92ZXMKK3RvIHJjdV9yZWFkX2xvY2soKSBhbmQgcmN1X3JlYWRfdW5sb2NrLCB1cGRhdGUtc2lkZSBsb2NraW5nIG1vdmVzIGZyb20KK2Zyb20gYSByZWFkZXItd3JpdGVyIGxvY2sgdG8gYSBzaW1wbGUgc3BpbmxvY2ssIGFuZCBhIHN5bmNocm9uaXplX3JjdSgpCitwcmVjZWRlcyB0aGUga2ZyZWUoKS4KKworSG93ZXZlciwgdGhlcmUgaXMgb25lIHBvdGVudGlhbCBjYXRjaDogdGhlIHJlYWQtc2lkZSBhbmQgdXBkYXRlLXNpZGUKK2NyaXRpY2FsIHNlY3Rpb25zIGNhbiBub3cgcnVuIGNvbmN1cnJlbnRseS4gIEluIG1hbnkgY2FzZXMsIHRoaXMgd2lsbAorbm90IGJlIGEgcHJvYmxlbSwgYnV0IGl0IGlzIG5lY2Vzc2FyeSB0byBjaGVjayBjYXJlZnVsbHkgcmVnYXJkbGVzcy4KK0ZvciBleGFtcGxlLCBpZiBtdWx0aXBsZSBpbmRlcGVuZGVudCBsaXN0IHVwZGF0ZXMgbXVzdCBiZSBzZWVuIGFzCithIHNpbmdsZSBhdG9taWMgdXBkYXRlLCBjb252ZXJ0aW5nIHRvIFJDVSB3aWxsIHJlcXVpcmUgc3BlY2lhbCBjYXJlLgorCitBbHNvLCB0aGUgcHJlc2VuY2Ugb2Ygc3luY2hyb25pemVfcmN1KCkgbWVhbnMgdGhhdCB0aGUgUkNVIHZlcnNpb24gb2YKK2RlbGV0ZSgpIGNhbiBub3cgYmxvY2suICBJZiB0aGlzIGlzIGEgcHJvYmxlbSwgdGhlcmUgaXMgYSBjYWxsYmFjay1iYXNlZAorbWVjaGFuaXNtIHRoYXQgbmV2ZXIgYmxvY2tzLCBuYW1lbHkgY2FsbF9yY3UoKSwgdGhhdCBjYW4gYmUgdXNlZCBpbgorcGxhY2Ugb2Ygc3luY2hyb25pemVfcmN1KCkuCisKKworNy4gIEZVTEwgTElTVCBPRiBSQ1UgQVBJcworCitUaGUgUkNVIEFQSXMgYXJlIGRvY3VtZW50ZWQgaW4gZG9jYm9vay1mb3JtYXQgaGVhZGVyIGNvbW1lbnRzIGluIHRoZQorTGludXgta2VybmVsIHNvdXJjZSBjb2RlLCBidXQgaXQgaGVscHMgdG8gaGF2ZSBhIGZ1bGwgbGlzdCBvZiB0aGUKK0FQSXMsIHNpbmNlIHRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHdheSB0byBjYXRlZ29yaXplIHRoZW0KK2luIGRvY2Jvb2suICBIZXJlIGlzIHRoZSBsaXN0LCBieSBjYXRlZ29yeS4KKworTWFya2VycyBmb3IgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uczoKKworCXJjdV9yZWFkX2xvY2sKKwlyY3VfcmVhZF91bmxvY2sKKwlyY3VfcmVhZF9sb2NrX2JoCisJcmN1X3JlYWRfdW5sb2NrX2JoCisKK1JDVSBwb2ludGVyL2xpc3QgdHJhdmVyc2FsOgorCisJcmN1X2RlcmVmZXJlbmNlCisJbGlzdF9mb3JfZWFjaF9yY3UJCSh0byBiZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mCisJCQkJCSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSkKKwlsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1CQkoZGVwcmVjYXRlZCwgbm90IHVzZWQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UKKwlsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdQkodG8gYmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBuZXcKKwkJCQkJIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KQorCWhsaXN0X2Zvcl9lYWNoX3JjdQkJKHRvIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YKKwkJCQkJIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSkKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UKKworUkNVIHBvaW50ZXIgdXBkYXRlOgorCisJcmN1X2Fzc2lnbl9wb2ludGVyCisJbGlzdF9hZGRfcmN1CisJbGlzdF9hZGRfdGFpbF9yY3UKKwlsaXN0X2RlbF9yY3UKKwlsaXN0X3JlcGxhY2VfcmN1CisJaGxpc3RfZGVsX3JjdQorCWhsaXN0X2FkZF9oZWFkX3JjdQorCitSQ1UgZ3JhY2UgcGVyaW9kOgorCisJc3luY2hyb25pemVfa2VybmVsIChkZXByZWNhdGVkKQorCXN5bmNocm9uaXplX25ldAorCXN5bmNocm9uaXplX3NjaGVkCisJc3luY2hyb25pemVfcmN1CisJY2FsbF9yY3UKKwljYWxsX3JjdV9iaAorCitTZWUgdGhlIGNvbW1lbnQgaGVhZGVycyBpbiB0aGUgc291cmNlIGNvZGUgKG9yIHRoZSBkb2Nib29rIGdlbmVyYXRlZAorZnJvbSB0aGVtKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCis4LiAgQU5TV0VSUyBUTyBRVUlDSyBRVUlaWkVTCisKK1F1aWNrIFF1aXogIzE6CVdoeSBpcyB0aGlzIGFyZ3VtZW50IG5haXZlPyAgSG93IGNvdWxkIGEgZGVhZGxvY2sKKwkJb2NjdXIgd2hlbiB1c2luZyB0aGlzIGFsZ29yaXRobSBpbiBhIHJlYWwtd29ybGQgTGludXgKKwkJa2VybmVsPyAgW1JlZmVycmluZyB0byB0aGUgbG9jay1iYXNlZCAidG95IiBSQ1UKKwkJYWxnb3JpdGhtLl0KKworQW5zd2VyOgkJQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBldmVudHM6CisKKwkJMS4JQ1BVIDAgYWNxdWlyZXMgc29tZSB1bnJlbGF0ZWQgbG9jaywgY2FsbCBpdAorCQkJInByb2JsZW1hdGljX2xvY2siLgorCisJCTIuCUNQVSAxIGVudGVycyBzeW5jaHJvbml6ZV9yY3UoKSwgd3JpdGUtYWNxdWlyaW5nCisJCQlyY3VfZ3BfbXV0ZXguCisKKwkJMy4JQ1BVIDAgZW50ZXJzIHJjdV9yZWFkX2xvY2soKSwgYnV0IG11c3Qgd2FpdAorCQkJYmVjYXVzZSBDUFUgMSBob2xkcyByY3VfZ3BfbXV0ZXguCisKKwkJNC4JQ1BVIDEgaXMgaW50ZXJydXB0ZWQsIGFuZCB0aGUgaXJxIGhhbmRsZXIKKwkJCWF0dGVtcHRzIHRvIGFjcXVpcmUgcHJvYmxlbWF0aWNfbG9jay4KKworCQlUaGUgc3lzdGVtIGlzIG5vdyBkZWFkbG9ja2VkLgorCisJCU9uZSB3YXkgdG8gYXZvaWQgdGhpcyBkZWFkbG9jayBpcyB0byB1c2UgYW4gYXBwcm9hY2ggbGlrZQorCQl0aGF0IG9mIENPTkZJR19QUkVFTVBUX1JULCB3aGVyZSBhbGwgbm9ybWFsIHNwaW5sb2NrcworCQliZWNvbWUgYmxvY2tpbmcgbG9ja3MsIGFuZCBhbGwgaXJxIGhhbmRsZXJzIGV4ZWN1dGUgaW4KKwkJdGhlIGNvbnRleHQgb2Ygc3BlY2lhbCB0YXNrcy4gIEluIHRoaXMgY2FzZSwgaW4gc3RlcCA0CisJCWFib3ZlLCB0aGUgaXJxIGhhbmRsZXIgd291bGQgYmxvY2ssIGFsbG93aW5nIENQVSAxIHRvCisJCXJlbGVhc2UgcmN1X2dwX211dGV4LCBhdm9pZGluZyB0aGUgZGVhZGxvY2suCisKKwkJRXZlbiBpbiB0aGUgYWJzZW5jZSBvZiBkZWFkbG9jaywgdGhpcyBSQ1UgaW1wbGVtZW50YXRpb24KKwkJYWxsb3dzIGxhdGVuY3kgdG8gImJsZWVkIiBmcm9tIHJlYWRlcnMgdG8gb3RoZXIKKwkJcmVhZGVycyB0aHJvdWdoIHN5bmNocm9uaXplX3JjdSgpLiAgVG8gc2VlIHRoaXMsCisJCWNvbnNpZGVyIHRhc2sgQSBpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24KKwkJKHRodXMgcmVhZC1ob2xkaW5nIHJjdV9ncF9tdXRleCksIHRhc2sgQiBibG9ja2VkCisJCWF0dGVtcHRpbmcgdG8gd3JpdGUtYWNxdWlyZSByY3VfZ3BfbXV0ZXgsIGFuZAorCQl0YXNrIEMgYmxvY2tlZCBpbiByY3VfcmVhZF9sb2NrKCkgYXR0ZW1wdGluZyB0bworCQlyZWFkX2FjcXVpcmUgcmN1X2dwX211dGV4LiAgVGFzayBBJ3MgUkNVIHJlYWQtc2lkZQorCQlsYXRlbmN5IGlzIGhvbGRpbmcgdXAgdGFzayBDLCBhbGJlaXQgaW5kaXJlY3RseSB2aWEKKwkJdGFzayBCLgorCisJCVJlYWx0aW1lIFJDVSBpbXBsZW1lbnRhdGlvbnMgdGhlcmVmb3JlIHVzZSBhIGNvdW50ZXItYmFzZWQKKwkJYXBwcm9hY2ggd2hlcmUgdGFza3MgaW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucworCQljYW5ub3QgYmUgYmxvY2tlZCBieSB0YXNrcyBleGVjdXRpbmcgc3luY2hyb25pemVfcmN1KCkuCisKK1F1aWNrIFF1aXogIzI6CUdpdmUgYW4gZXhhbXBsZSB3aGVyZSBDbGFzc2ljIFJDVSdzIHJlYWQtc2lkZQorCQlvdmVyaGVhZCBpcyAtbmVnYXRpdmUtLgorCitBbnN3ZXI6CQlJbWFnaW5lIGEgc2luZ2xlLUNQVSBzeXN0ZW0gd2l0aCBhIG5vbi1DT05GSUdfUFJFRU1QVAorCQlrZXJuZWwgd2hlcmUgYSByb3V0aW5nIHRhYmxlIGlzIHVzZWQgYnkgcHJvY2Vzcy1jb250ZXh0CisJCWNvZGUsIGJ1dCBjYW4gYmUgdXBkYXRlZCBieSBpcnEtY29udGV4dCBjb2RlIChmb3IgZXhhbXBsZSwKKwkJYnkgYW4gIklDTVAgUkVESVJFQ1QiIHBhY2tldCkuCVRoZSB1c3VhbCB3YXkgb2YgaGFuZGxpbmcKKwkJdGhpcyB3b3VsZCBiZSB0byBoYXZlIHRoZSBwcm9jZXNzLWNvbnRleHQgY29kZSBkaXNhYmxlCisJCWludGVycnVwdHMgd2hpbGUgc2VhcmNoaW5nIHRoZSByb3V0aW5nIHRhYmxlLiAgVXNlIG9mCisJCVJDVSBhbGxvd3Mgc3VjaCBpbnRlcnJ1cHQtZGlzYWJsaW5nIHRvIGJlIGRpc3BlbnNlZCB3aXRoLgorCQlUaHVzLCB3aXRob3V0IFJDVSwgeW91IHBheSB0aGUgY29zdCBvZiBkaXNhYmxpbmcgaW50ZXJydXB0cywKKwkJYW5kIHdpdGggUkNVIHlvdSBkb24ndC4KKworCQlPbmUgY2FuIGFyZ3VlIHRoYXQgdGhlIG92ZXJoZWFkIG9mIFJDVSBpbiB0aGlzCisJCWNhc2UgaXMgbmVnYXRpdmUgd2l0aCByZXNwZWN0IHRvIHRoZSBzaW5nbGUtQ1BVCisJCWludGVycnVwdC1kaXNhYmxpbmcgYXBwcm9hY2guICBPdGhlcnMgbWlnaHQgYXJndWUgdGhhdAorCQl0aGUgb3ZlcmhlYWQgb2YgUkNVIGlzIG1lcmVseSB6ZXJvLCBhbmQgdGhhdCByZXBsYWNpbmcKKwkJdGhlIHBvc2l0aXZlIG92ZXJoZWFkIG9mIHRoZSBpbnRlcnJ1cHQtZGlzYWJsaW5nIHNjaGVtZQorCQl3aXRoIHRoZSB6ZXJvLW92ZXJoZWFkIFJDVSBzY2hlbWUgZG9lcyBub3QgY29uc3RpdHV0ZQorCQluZWdhdGl2ZSBvdmVyaGVhZC4KKworCQlJbiByZWFsIGxpZmUsIG9mIGNvdXJzZSwgdGhpbmdzIGFyZSBtb3JlIGNvbXBsZXguICBCdXQKKwkJZXZlbiB0aGUgdGhlb3JldGljYWwgcG9zc2liaWxpdHkgb2YgbmVnYXRpdmUgb3ZlcmhlYWQgZm9yCisJCWEgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZSBpcyBhIGJpdCB1bmV4cGVjdGVkLiAgOy0pCisKK1F1aWNrIFF1aXogIzM6ICBJZiBpdCBpcyBpbGxlZ2FsIHRvIGJsb2NrIGluIGFuIFJDVSByZWFkLXNpZGUKKwkJY3JpdGljYWwgc2VjdGlvbiwgd2hhdCB0aGUgaGVjayBkbyB5b3UgZG8gaW4KKwkJUFJFRU1QVF9SVCwgd2hlcmUgbm9ybWFsIHNwaW5sb2NrcyBjYW4gYmxvY2s/Pz8KKworQW5zd2VyOgkJSnVzdCBhcyBQUkVFTVBUX1JUIHBlcm1pdHMgcHJlZW1wdGlvbiBvZiBzcGlubG9jaworCQljcml0aWNhbCBzZWN0aW9ucywgaXQgcGVybWl0cyBwcmVlbXB0aW9uIG9mIFJDVQorCQlyZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMuICBJdCBhbHNvIHBlcm1pdHMKKwkJc3BpbmxvY2tzIGJsb2NraW5nIHdoaWxlIGluIFJDVSByZWFkLXNpZGUgY3JpdGljYWwKKwkJc2VjdGlvbnMuCisKKwkJV2h5IHRoZSBhcHBhcmVudCBpbmNvbnNpc3RlbmN5PyAgQmVjYXVzZSBpdCBpcyBpdAorCQlwb3NzaWJsZSB0byB1c2UgcHJpb3JpdHkgYm9vc3RpbmcgdG8ga2VlcCB0aGUgUkNVCisJCWdyYWNlIHBlcmlvZHMgc2hvcnQgaWYgbmVlZCBiZSAoZm9yIGV4YW1wbGUsIGlmIHJ1bm5pbmcKKwkJc2hvcnQgb2YgbWVtb3J5KS4gIEluIGNvbnRyYXN0LCBpZiBibG9ja2luZyB3YWl0aW5nCisJCWZvciAoc2F5KSBuZXR3b3JrIHJlY2VwdGlvbiwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cKKwkJd2hhdCBzaG91bGQgYmUgYm9vc3RlZC4gIEVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0aGUKKwkJcHJvY2VzcyB3ZSBuZWVkIHRvIGJvb3N0IG1pZ2h0IHdlbGwgYmUgYSBodW1hbiBiZWluZworCQl3aG8ganVzdCB3ZW50IG91dCBmb3IgYSBwaXp6YSBvciBzb21ldGhpbmcuICBBbmQgYWx0aG91Z2gKKwkJYSBjb21wdXRlci1vcGVyYXRlZCBjYXR0bGUgcHJvZCBtaWdodCBhcm91c2Ugc2VyaW91cworCQlpbnRlcmVzdCwgaXQgbWlnaHQgYWxzbyBwcm92b2tlIHNlcmlvdXMgb2JqZWN0aW9ucy4KKwkJQmVzaWRlcywgaG93IGRvZXMgdGhlIGNvbXB1dGVyIGtub3cgd2hhdCBwaXp6YSBwYXJsb3IKKwkJdGhlIGh1bWFuIGJlaW5nIHdlbnQgdG8/Pz8KKworCitBQ0tOT1dMRURHRU1FTlRTCisKK015IHRoYW5rcyB0byB0aGUgcGVvcGxlIHdobyBoZWxwZWQgbWFrZSB0aGlzIGh1bWFuLXJlYWRhYmxlLCBpbmNsdWRpbmcKK0pvbiBXYWxwb2xlLCBKb3NoIFRyaXBsZXR0LCBTZXJnZSBIYWxseW4sIGFuZCBTdXphbm5lIFdvb2QuCisKKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LnJkcm9wLmNvbS91c2Vycy9wYXVsbWNrL1JDVS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKaW5kZXggMGFjZGM4MC4uNzQ0ZjFhZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKQEAgLTM1LDQgKzM1LDQgQEAKIHRvIHJldHJpZXZlIGl0LgogCiBOb3RlOiBVc2UgY21kbGluZSAiYWNwaV9nZW5lcmljX2hvdGtleSIgdG8gb3Zlci1yaWRlCi1sb2FkaW5nIGFueSBwbGF0Zm9ybSBzcGVjaWZpYyBkcml2ZXJzLgorcGxhdGZvcm0tc3BlY2lmaWMgd2l0aCBnZW5lcmljIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWU0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CkBAIC0wLDAgKzEsNDM5IEBACisKKwlBcHBseWluZyBQYXRjaGVzIFRvIFRoZSBMaW51eCBLZXJuZWwKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCShXcml0dGVuIGJ5IEplc3BlciBKdWhsLCBBdWd1c3QgMjAwNSkKKworCisKK0EgZnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbiBvbiB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdCBpcyBob3cgdG8gYXBwbHkKK2EgcGF0Y2ggdG8gdGhlIGtlcm5lbCBvciwgbW9yZSBzcGVjaWZpY2FsbHksIHdoYXQgYmFzZSBrZXJuZWwgYSBwYXRjaCBmb3IKK29uZSBvZiB0aGUgbWFueSB0cmVlcy9icmFuY2hlcyBzaG91bGQgYmUgYXBwbGllZCB0by4gSG9wZWZ1bGx5IHRoaXMgZG9jdW1lbnQKK3dpbGwgZXhwbGFpbiB0aGlzIHRvIHlvdS4KKworSW4gYWRkaXRpb24gdG8gZXhwbGFpbmluZyBob3cgdG8gYXBwbHkgYW5kIHJldmVydCBwYXRjaGVzLCBhIGJyaWVmCitkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZmVyZW50IGtlcm5lbCB0cmVlcyAoYW5kIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseQordGhlaXIgc3BlY2lmaWMgcGF0Y2hlcykgaXMgYWxzbyBwcm92aWRlZC4KKworCitXaGF0IGlzIGEgcGF0Y2g/CistLS0KKyBBIHBhdGNoIGlzIGEgc21hbGwgdGV4dCBkb2N1bWVudCBjb250YWluaW5nIGEgZGVsdGEgb2YgY2hhbmdlcyBiZXR3ZWVuIHR3bworZGlmZmVyZW50IHZlcnNpb25zIG9mIGEgc291cmNlIHRyZWUuIFBhdGNoZXMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgYGRpZmYnCitwcm9ncmFtLgorVG8gY29ycmVjdGx5IGFwcGx5IGEgcGF0Y2ggeW91IG5lZWQgdG8ga25vdyB3aGF0IGJhc2UgaXQgd2FzIGdlbmVyYXRlZCBmcm9tCithbmQgd2hhdCBuZXcgdmVyc2lvbiB0aGUgcGF0Y2ggd2lsbCBjaGFuZ2UgdGhlIHNvdXJjZSB0cmVlIGludG8uIFRoZXNlCitzaG91bGQgYm90aCBiZSBwcmVzZW50IGluIHRoZSBwYXRjaCBmaWxlIG1ldGFkYXRhIG9yIGJlIHBvc3NpYmxlIHRvIGRlZHVjZQorZnJvbSB0aGUgZmlsZW5hbWUuCisKKworSG93IGRvIEkgYXBwbHkgb3IgcmV2ZXJ0IGEgcGF0Y2g/CistLS0KKyBZb3UgYXBwbHkgYSBwYXRjaCB3aXRoIHRoZSBgcGF0Y2gnIHByb2dyYW0uIFRoZSBwYXRjaCBwcm9ncmFtIHJlYWRzIGEgZGlmZgorKG9yIHBhdGNoKSBmaWxlIGFuZCBtYWtlcyB0aGUgY2hhbmdlcyB0byB0aGUgc291cmNlIHRyZWUgZGVzY3JpYmVkIGluIGl0LgorCitQYXRjaGVzIGZvciB0aGUgTGludXgga2VybmVsIGFyZSBnZW5lcmF0ZWQgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkKK2hvbGRpbmcgdGhlIGtlcm5lbCBzb3VyY2UgZGlyLgorCitUaGlzIG1lYW5zIHRoYXQgcGF0aHMgdG8gZmlsZXMgaW5zaWRlIHRoZSBwYXRjaCBmaWxlIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlCitrZXJuZWwgc291cmNlIGRpcmVjdG9yaWVzIGl0IHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCAob3Igc29tZSBvdGhlciBkaXJlY3RvcnkKK25hbWVzIGxpa2UgImEvIiBhbmQgImIvIikuCitTaW5jZSB0aGlzIGlzIHVubGlrZWx5IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgc291cmNlIGRpciBvbiB5b3VyCitsb2NhbCBtYWNoaW5lIChidXQgaXMgb2Z0ZW4gdXNlZnVsIGluZm8gdG8gc2VlIHdoYXQgdmVyc2lvbiBhbiBvdGhlcndpc2UKK3VubGFiZWxlZCBwYXRjaCB3YXMgZ2VuZXJhdGVkIGFnYWluc3QpIHlvdSBzaG91bGQgY2hhbmdlIGludG8geW91ciBrZXJuZWwKK3NvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZW4gc3RyaXAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHBhdGggZnJvbSBmaWxlbmFtZXMKK2luIHRoZSBwYXRjaCBmaWxlIHdoZW4gYXBwbHlpbmcgaXQgKHRoZSAtcDEgYXJndW1lbnQgdG8gYHBhdGNoJyBkb2VzIHRoaXMpLgorCitUbyByZXZlcnQgYSBwcmV2aW91c2x5IGFwcGxpZWQgcGF0Y2gsIHVzZSB0aGUgLVIgYXJndW1lbnQgdG8gcGF0Y2guCitTbywgaWYgeW91IGFwcGxpZWQgYSBwYXRjaCBsaWtlIHRoaXM6CisJcGF0Y2ggLXAxIDwgLi4vcGF0Y2gteC55LnoKKworWW91IGNhbiByZXZlcnQgKHVuZG8pIGl0IGxpa2UgdGhpczoKKwlwYXRjaCAtUiAtcDEgPCAuLi9wYXRjaC14LnkuegorCisKK0hvdyBkbyBJIGZlZWQgYSBwYXRjaC9kaWZmIGZpbGUgdG8gYHBhdGNoJz8KKy0tLQorIFRoaXMgKGFzIHVzdWFsIHdpdGggTGludXggYW5kIG90aGVyIFVOSVggbGlrZSBvcGVyYXRpbmcgc3lzdGVtcykgY2FuIGJlCitkb25lIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXMuCitJbiBhbGwgdGhlIGV4YW1wbGVzIGJlbG93IEkgZmVlZCB0aGUgZmlsZSAoaW4gdW5jb21wcmVzc2VkIGZvcm0pIHRvIHBhdGNoCit2aWEgc3RkaW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6CisJcGF0Y2ggLXAxIDwgcGF0aC90by9wYXRjaC14LnkuegorCitJZiB5b3UganVzdCB3YW50IHRvIGJlIGFibGUgdG8gZm9sbG93IHRoZSBleGFtcGxlcyBiZWxvdyBhbmQgZG9uJ3Qgd2FudCB0bwora25vdyBvZiBtb3JlIHRoYW4gb25lIHdheSB0byB1c2UgcGF0Y2gsIHRoZW4geW91IGNhbiBzdG9wIHJlYWRpbmcgdGhpcworc2VjdGlvbiBoZXJlLgorCitQYXRjaCBjYW4gYWxzbyBnZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdXNlIHZpYSB0aGUgLWkgYXJndW1lbnQsIGxpa2UKK3RoaXM6CisJcGF0Y2ggLXAxIC1pIHBhdGgvdG8vcGF0Y2gteC55LnoKKworSWYgeW91ciBwYXRjaCBmaWxlIGlzIGNvbXByZXNzZWQgd2l0aCBnemlwIG9yIGJ6aXAyIGFuZCB5b3UgZG9uJ3Qgd2FudCB0bwordW5jb21wcmVzcyBpdCBiZWZvcmUgYXBwbHlpbmcgaXQsIHRoZW4geW91IGNhbiBmZWVkIGl0IHRvIHBhdGNoIGxpa2UgdGhpcworaW5zdGVhZDoKKwl6Y2F0IHBhdGgvdG8vcGF0Y2gteC55LnouZ3ogfCBwYXRjaCAtcDEKKwliemNhdCBwYXRoL3RvL3BhdGNoLXgueS56LmJ6MiB8IHBhdGNoIC1wMQorCitJZiB5b3Ugd2lzaCB0byB1bmNvbXByZXNzIHRoZSBwYXRjaCBmaWxlIGJ5IGhhbmQgZmlyc3QgYmVmb3JlIGFwcGx5aW5nIGl0Cisod2hhdCBJIGFzc3VtZSB5b3UndmUgZG9uZSBpbiB0aGUgZXhhbXBsZXMgYmVsb3cpLCB0aGVuIHlvdSBzaW1wbHkgcnVuCitndW56aXAgb3IgYnVuemlwMiBvbiB0aGUgZmlsZSAtIGxpa2UgdGhpczoKKwlndW56aXAgcGF0Y2gteC55LnouZ3oKKwlidW56aXAyIHBhdGNoLXgueS56LmJ6MgorCitXaGljaCB3aWxsIGxlYXZlIHlvdSB3aXRoIGEgcGxhaW4gdGV4dCBwYXRjaC14LnkueiBmaWxlIHRoYXQgeW91IGNhbiBmZWVkIHRvCitwYXRjaCB2aWEgc3RkaW4gb3IgdGhlIC1pIGFyZ3VtZW50LCBhcyB5b3UgcHJlZmVyLgorCitBIGZldyBvdGhlciBuaWNlIGFyZ3VtZW50cyBmb3IgcGF0Y2ggYXJlIC1zIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBiZSBzaWxlbnQKK2V4Y2VwdCBmb3IgZXJyb3JzIHdoaWNoIGlzIG5pY2UgdG8gcHJldmVudCBlcnJvcnMgZnJvbSBzY3JvbGxpbmcgb3V0IG9mIHRoZQorc2NyZWVuIHRvbyBmYXN0LCBhbmQgLS1kcnktcnVuIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBqdXN0IHByaW50IGEgbGlzdGluZyBvZgord2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXMuIEZpbmFsbHkgLS12ZXJib3NlCit0ZWxscyBwYXRjaCB0byBwcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3b3JrIGJlaW5nIGRvbmUuCisKKworQ29tbW9uIGVycm9ycyB3aGVuIHBhdGNoaW5nCistLS0KKyBXaGVuIHBhdGNoIGFwcGxpZXMgYSBwYXRjaCBmaWxlIGl0IGF0dGVtcHRzIHRvIHZlcmlmeSB0aGUgc2FuaXR5IG9mIHRoZQorZmlsZSBpbiBkaWZmZXJlbnQgd2F5cy4KK0NoZWNraW5nIHRoYXQgdGhlIGZpbGUgbG9va3MgbGlrZSBhIHZhbGlkIHBhdGNoIGZpbGUsIGNoZWNraW5nIHRoZSBjb2RlCithcm91bmQgdGhlIGJpdHMgYmVpbmcgbW9kaWZpZWQgbWF0Y2hlcyB0aGUgY29udGV4dCBwcm92aWRlZCBpbiB0aGUgcGF0Y2ggYXJlCitqdXN0IHR3byBvZiB0aGUgYmFzaWMgc2FuaXR5IGNoZWNrcyBwYXRjaCBkb2VzLgorCitJZiBwYXRjaCBlbmNvdW50ZXJzIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBxdWl0ZSByaWdodCBpdCBoYXMgdHdvCitvcHRpb25zLiBJdCBjYW4gZWl0aGVyIHJlZnVzZSB0byBhcHBseSB0aGUgY2hhbmdlcyBhbmQgYWJvcnQgb3IgaXQgY2FuIHRyeQordG8gZmluZCBhIHdheSB0byBtYWtlIHRoZSBwYXRjaCBhcHBseSB3aXRoIGEgZmV3IG1pbm9yIGNoYW5nZXMuCisKK09uZSBleGFtcGxlIG9mIHNvbWV0aGluZyB0aGF0J3Mgbm90ICdxdWl0ZSByaWdodCcgdGhhdCBwYXRjaCB3aWxsIGF0dGVtcHQgdG8KK2ZpeCB1cCBpcyBpZiBhbGwgdGhlIGNvbnRleHQgbWF0Y2hlcywgdGhlIGxpbmVzIGJlaW5nIGNoYW5nZWQgbWF0Y2gsIGJ1dCB0aGUKK2xpbmUgbnVtYmVycyBhcmUgZGlmZmVyZW50LiBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGUgcGF0Y2ggbWFrZXMKK2EgY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZpbGUgYnV0IGZvciBzb21lIHJlYXNvbnMgYSBmZXcgbGluZXMgaGF2ZQorYmVlbiBhZGRlZCBvciByZW1vdmVkIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gSW4gdGhhdCBjYXNlCitldmVyeXRoaW5nIGxvb2tzIGdvb2QgaXQgaGFzIGp1c3QgbW92ZWQgdXAgb3IgZG93biBhIGJpdCwgYW5kIHBhdGNoIHdpbGwKK3VzdWFsbHkgYWRqdXN0IHRoZSBsaW5lIG51bWJlcnMgYW5kIGFwcGx5IHRoZSBwYXRjaC4KKworV2hlbmV2ZXIgcGF0Y2ggYXBwbGllcyBhIHBhdGNoIHRoYXQgaXQgaGFkIHRvIG1vZGlmeSBhIGJpdCB0byBtYWtlIGl0IGZpdAoraXQnbGwgdGVsbCB5b3UgYWJvdXQgaXQgYnkgc2F5aW5nIHRoZSBwYXRjaCBhcHBsaWVkIHdpdGggJ2Z1enonLgorWW91IHNob3VsZCBiZSB3YXJ5IG9mIHN1Y2ggY2hhbmdlcyBzaW5jZSBldmVuIHRob3VnaCBwYXRjaCBwcm9iYWJseSBnb3QgaXQKK3JpZ2h0IGl0IGRvZXNuJ3QgL2Fsd2F5cy8gZ2V0IGl0IHJpZ2h0LCBhbmQgdGhlIHJlc3VsdCB3aWxsIHNvbWV0aW1lcyBiZQord3JvbmcuCisKK1doZW4gcGF0Y2ggZW5jb3VudGVycyBhIGNoYW5nZSB0aGF0IGl0IGNhbid0IGZpeCB1cCB3aXRoIGZ1enogaXQgcmVqZWN0cyBpdAorb3V0cmlnaHQgYW5kIGxlYXZlcyBhIGZpbGUgd2l0aCBhIC5yZWogZXh0ZW5zaW9uIChhIHJlamVjdCBmaWxlKS4gWW91IGNhbgorcmVhZCB0aGlzIGZpbGUgdG8gc2VlIGV4YWN0ZWx5IHdoYXQgY2hhbmdlIGNvdWxkbid0IGJlIGFwcGxpZWQsIHNvIHlvdSBjYW4KK2dvIGZpeCBpdCB1cCBieSBoYW5kIGlmIHlvdSB3aXNoLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgdGhpcmQgcGFydHkgcGF0Y2hlcyBhcHBsaWVkIHRvIHlvdXIga2VybmVsIHNvdXJjZSwgYnV0Citvbmx5IHBhdGNoZXMgZnJvbSBrZXJuZWwub3JnIGFuZCB5b3UgYXBwbHkgdGhlIHBhdGNoZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsCithbmQgaGF2ZSBtYWRlIG5vIG1vZGlmaWNhdGlvbnMgeW91cnNlbGYgdG8gdGhlIHNvdXJjZSBmaWxlcywgdGhlbiB5b3Ugc2hvdWxkCituZXZlciBzZWUgYSBmdXp6IG9yIHJlamVjdCBtZXNzYWdlIGZyb20gcGF0Y2guIElmIHlvdSBkbyBzZWUgc3VjaCBtZXNzYWdlcworYW55d2F5LCB0aGVuIHRoZXJlJ3MgYSBoaWdoIHJpc2sgdGhhdCBlaXRoZXIgeW91ciBsb2NhbCBzb3VyY2UgdHJlZSBvciB0aGUKK3BhdGNoIGZpbGUgaXMgY29ycnVwdGVkIGluIHNvbWUgd2F5LiBJbiB0aGF0IGNhc2UgeW91IHNob3VsZCBwcm9iYWJseSB0cnkKK3JlZG93bmxvYWRpbmcgdGhlIHBhdGNoIGFuZCBpZiB0aGluZ3MgYXJlIHN0aWxsIG5vdCBPSyB0aGVuIHlvdSdkIGJlIGFkdmlzZWQKK3RvIHN0YXJ0IHdpdGggYSBmcmVzaCB0cmVlIGRvd25sb2FkZWQgaW4gZnVsbCBmcm9tIGtlcm5lbC5vcmcuCisKK0xldCdzIGxvb2sgYSBiaXQgbW9yZSBhdCBzb21lIG9mIHRoZSBtZXNzYWdlcyBwYXRjaCBjYW4gcHJvZHVjZS4KKworSWYgcGF0Y2ggc3RvcHMgYW5kIHByZXNlbnRzIGEgIkZpbGUgdG8gcGF0Y2g6IiBwcm9tcHQsIHRoZW4gcGF0Y2ggY291bGQgbm90CitmaW5kIGEgZmlsZSB0byBiZSBwYXRjaGVkLiBNb3N0IGxpa2VseSB5b3UgZm9yZ290IHRvIHNwZWNpZnkgLXAxIG9yIHlvdSBhcmUKK2luIHRoZSB3cm9uZyBkaXJlY3RvcnkuIExlc3Mgb2Z0ZW4sIHlvdSdsbCBmaW5kIHBhdGNoZXMgdGhhdCBuZWVkIHRvIGJlCithcHBsaWVkIHdpdGggLXAwIGluc3RlYWQgb2YgLXAxIChyZWFkaW5nIHRoZSBwYXRjaCBmaWxlIHNob3VsZCByZXZlYWwgaWYKK3RoaXMgaXMgdGhlIGNhc2UgLSBpZiBzbywgdGhlbiB0aGlzIGlzIGFuIGVycm9yIGJ5IHRoZSBwZXJzb24gd2hvIGNyZWF0ZWQKK3RoZSBwYXRjaCBidXQgaXMgbm90IGZhdGFsKS4KKworSWYgeW91IGdldCAiSHVuayAjMiBzdWNjZWVkZWQgYXQgMTg4NyB3aXRoIGZ1enogMiAob2Zmc2V0IDcgbGluZXMpLiIgb3IgYQorbWVzc2FnZSBzaW1pbGFyIHRvIHRoYXQsIHRoZW4gaXQgbWVhbnMgdGhhdCBwYXRjaCBoYWQgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbgorb2YgdGhlIGNoYW5nZSAoaW4gdGhpcyBleGFtcGxlIGl0IG5lZWRlZCB0byBtb3ZlIDcgbGluZXMgZnJvbSB3aGVyZSBpdAorZXhwZWN0ZWQgdG8gbWFrZSB0aGUgY2hhbmdlIHRvIG1ha2UgaXQgZml0KS4KK1RoZSByZXN1bHRpbmcgZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSBPSywgZGVwZW5kaW5nIG9uIHRoZSByZWFzb24gdGhlIGZpbGUKK3dhcyBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZC4KK1RoaXMgb2Z0ZW4gaGFwcGVucyBpZiB5b3UgdHJ5IHRvIGFwcGx5IGEgcGF0Y2ggdGhhdCB3YXMgZ2VuZXJhdGVkIGFnYWluc3QgYQorZGlmZmVyZW50IGtlcm5lbCB2ZXJzaW9uIHRoYW4gdGhlIG9uZSB5b3UgYXJlIHRyeWluZyB0byBwYXRjaC4KKworSWYgeW91IGdldCBhIG1lc3NhZ2UgbGlrZSAiSHVuayAjMyBGQUlMRUQgYXQgMjM4Ny4iLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlCitwYXRjaCBjb3VsZCBub3QgYmUgYXBwbGllZCBjb3JyZWN0bHkgYW5kIHRoZSBwYXRjaCBwcm9ncmFtIHdhcyB1bmFibGUgdG8KK2Z1enogaXRzIHdheSB0aHJvdWdoLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSAucmVqIGZpbGUgd2l0aCB0aGUgY2hhbmdlIHRoYXQKK2NhdXNlZCB0aGUgcGF0Y2ggdG8gZmFpbCBhbmQgYWxzbyBhIC5vcmlnIGZpbGUgc2hvd2luZyB5b3UgdGhlIG9yaWdpbmFsCitjb250ZW50IHRoYXQgY291bGRuJ3QgYmUgY2hhbmdlZC4KKworSWYgeW91IGdldCAiUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSIKK3RoZW4gcGF0Y2ggZGV0ZWN0ZWQgdGhhdCB0aGUgY2hhbmdlIGNvbnRhaW5lZCBpbiB0aGUgcGF0Y2ggc2VlbXMgdG8gaGF2ZQorYWxyZWFkeSBiZWVuIG1hZGUuCitJZiB5b3UgYWN0dWFsbHkgZGlkIGFwcGx5IHRoaXMgcGF0Y2ggcHJldmlvdXNseSBhbmQgeW91IGp1c3QgcmUtYXBwbGllZCBpdAoraW4gZXJyb3IsIHRoZW4ganVzdCBzYXkgW25dbyBhbmQgYWJvcnQgdGhpcyBwYXRjaC4gSWYgeW91IGFwcGxpZWQgdGhpcyBwYXRjaAorcHJldmlvdXNseSBhbmQgYWN0dWFsbHkgaW50ZW5kZWQgdG8gcmV2ZXJ0IGl0LCBidXQgZm9yZ290IHRvIHNwZWNpZnkgLVIsCit0aGVuIHlvdSBjYW4gc2F5IFt5XWVzIGhlcmUgdG8gbWFrZSBwYXRjaCByZXZlcnQgaXQgZm9yIHlvdS4KK1RoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHRoZSBjcmVhdG9yIG9mIHRoZSBwYXRjaCByZXZlcnNlZCB0aGUgc291cmNlIGFuZAorZGVzdGluYXRpb24gZGlyZWN0b3JpZXMgd2hlbiBjcmVhdGluZyB0aGUgcGF0Y2gsIGFuZCBpbiB0aGF0IGNhc2UgcmV2ZXJ0aW5nCit0aGUgcGF0Y2ggd2lsbCBpbiBmYWN0IGFwcGx5IGl0LgorCitBIG1lc3NhZ2Ugc2ltaWxhciB0byAicGF0Y2g6ICoqKiogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBwYXRjaCIgb3IgInBhdGNoCit1bmV4cGVjdGVkbHkgZW5kcyBpbiBtaWRkbGUgb2YgbGluZSIgbWVhbnMgdGhhdCBwYXRjaCBjb3VsZCBtYWtlIG5vIHNlbnNlIG9mCit0aGUgZmlsZSB5b3UgZmVkIHRvIGl0LiBFaXRoZXIgeW91ciBkb3dubG9hZCBpcyBicm9rZW4gb3IgeW91IHRyaWVkIHRvIGZlZWQKK3BhdGNoIGEgY29tcHJlc3NlZCBwYXRjaCBmaWxlIHdpdGhvdXQgdW5jb21wcmVzc2luZyBpdCBmaXJzdC4KKworQXMgSSBhbHJlYWR5IG1lbnRpb25lZCBhYm92ZSwgdGhlc2UgZXJyb3JzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgeW91IGFwcGx5CithIHBhdGNoIGZyb20ga2VybmVsLm9yZyB0byB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIGFuIHVubW9kaWZpZWQgc291cmNlIHRyZWUuCitTbyBpZiB5b3UgZ2V0IHRoZXNlIGVycm9ycyB3aXRoIGtlcm5lbC5vcmcgcGF0Y2hlcyB0aGVuIHlvdSBzaG91bGQgcHJvYmFibHkKK2Fzc3VtZSB0aGF0IGVpdGhlciB5b3VyIHBhdGNoIGZpbGUgb3IgeW91ciB0cmVlIGlzIGJyb2tlbiBhbmQgSSdkIGFkdmljZSB5b3UKK3RvIHN0YXJ0IG92ZXIgd2l0aCBhIGZyZXNoIGRvd25sb2FkIG9mIGEgZnVsbCBrZXJuZWwgdHJlZSBhbmQgdGhlIHBhdGNoIHlvdQord2lzaCB0byBhcHBseS4KKworCitBcmUgdGhlcmUgYW55IGFsdGVybmF0aXZlcyB0byBgcGF0Y2gnPworLS0tCisgWWVzIHRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMuIFlvdSBjYW4gdXNlIHRoZSBgaW50ZXJkaWZmJyBwcm9ncmFtCisoaHR0cDovL2N5YmVyZWxrLm5ldC90aW0vcGF0Y2h1dGlscy8pIHRvIGdlbmVyYXRlIGEgcGF0Y2ggcmVwcmVzZW50aW5nIHRoZQorZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcGF0Y2hlcyBhbmQgdGhlbiBhcHBseSB0aGUgcmVzdWx0LgorVGhpcyB3aWxsIGxldCB5b3UgbW92ZSBmcm9tIHNvbWV0aGluZyBsaWtlIDIuNi4xMi4yIHRvIDIuNi4xMi4zIGluIGEgc2luZ2xlCitzdGVwLiBUaGUgLXogZmxhZyB0byBpbnRlcmRpZmYgd2lsbCBldmVuIGxldCB5b3UgZmVlZCBpdCBwYXRjaGVzIGluIGd6aXAgb3IKK2J6aXAyIGNvbXByZXNzZWQgZm9ybSBkaXJlY3RseSB3aXRob3V0IHRoZSB1c2Ugb2YgemNhdCBvciBiemNhdCBvciBtYW51YWwKK2RlY29tcHJlc3Npb24uCisKK0hlcmUncyBob3cgeW91J2QgZ28gZnJvbSAyLjYuMTIuMiB0byAyLjYuMTIuMyBpbiBhIHNpbmdsZSBzdGVwOgorCWludGVyZGlmZiAteiAuLi9wYXRjaC0yLjYuMTIuMi5iejIgLi4vcGF0Y2gtMi42LjEyLjMuZ3ogfCBwYXRjaCAtcDEKKworQWx0aG91Z2ggaW50ZXJkaWZmIG1heSBzYXZlIHlvdSBhIHN0ZXAgb3IgdHdvIHlvdSBhcmUgZ2VuZXJhbGx5IGFkdmlzZWQgdG8KK2RvIHRoZSBhZGRpdGlvbmFsIHN0ZXBzIHNpbmNlIGludGVyZGlmZiBjYW4gZ2V0IHRoaW5ncyB3cm9uZyBpbiBzb21lIGNhc2VzLgorCisgQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyBga2V0Y2h1cCcsIHdoaWNoIGlzIGEgcHl0aG9uIHNjcmlwdCBmb3IgYXV0b21hdGljCitkb3dubG9hZGluZyBhbmQgYXBwbHlpbmcgb2YgcGF0Y2hlcyAoaHR0cDovL3d3dy5zZWxlbmljLmNvbS9rZXRjaHVwLykuCisKK090aGVyIG5pY2UgdG9vbHMgYXJlIGRpZmZzdGF0IHdoaWNoIHNob3dzIGEgc3VtbWFyeSBvZiBjaGFuZ2VzIG1hZGUgYnkgYQorcGF0Y2gsIGxzZGlmZiB3aGljaCBkaXNwbGF5cyBhIHNob3J0IGxpc3Rpbmcgb2YgYWZmZWN0ZWQgZmlsZXMgaW4gYSBwYXRjaAorZmlsZSwgYWxvbmcgd2l0aCAob3B0aW9uYWxseSkgdGhlIGxpbmUgbnVtYmVycyBvZiB0aGUgc3RhcnQgb2YgZWFjaCBwYXRjaAorYW5kIGdyZXBkaWZmIHdoaWNoIGRpc3BsYXlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgbW9kaWZpZWQgYnkgYSBwYXRjaCB3aGVyZQordGhlIHBhdGNoIGNvbnRhaW5zIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLgorCisKK1doZXJlIGNhbiBJIGRvd25sb2FkIHRoZSBwYXRjaGVzPworLS0tCisgVGhlIHBhdGNoZXMgYXJlIGF2YWlsYWJsZSBhdCBodHRwOi8va2VybmVsLm9yZy8KK01vc3QgcmVjZW50IHBhdGNoZXMgYXJlIGxpbmtlZCBmcm9tIHRoZSBmcm9udCBwYWdlLCBidXQgdGhleSBhbHNvIGhhdmUKK3NwZWNpZmljIGhvbWVzLgorCitUaGUgMi42LngueSAoLXN0YWJsZSkgYW5kIDIuNi54IHBhdGNoZXMgbGl2ZSBhdAorIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi8KKworVGhlIC1yYyBwYXRjaGVzIGxpdmUgYXQKKyBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3YyLjYvdGVzdGluZy8KKworVGhlIC1naXQgcGF0Y2hlcyBsaXZlIGF0CisgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92Mi42L3NuYXBzaG90cy8KKworVGhlIC1tbSBrZXJuZWxzIGxpdmUgYXQKKyBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ha3BtL3BhdGNoZXMvMi42LworCitJbiBwbGFjZSBvZiBmdHAua2VybmVsLm9yZyB5b3UgY2FuIHVzZSBmdHAuY2Mua2VybmVsLm9yZywgd2hlcmUgY2MgaXMgYQorY291bnRyeSBjb2RlLiBUaGlzIHdheSB5b3UnbGwgYmUgZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBzaXRlIHRoYXQncyBtb3N0CitsaWtlbHkgZ2VvZ3JhcGhpY2FsbHkgY2xvc2VyIHRvIHlvdSwgcmVzdWx0aW5nIGluIGZhc3RlciBkb3dubG9hZHMgZm9yIHlvdSwKK2xlc3MgYmFuZHdpZHRoIHVzZWQgZ2xvYmFsbHkgYW5kIGxlc3MgbG9hZCBvbiB0aGUgbWFpbiBrZXJuZWwub3JnIHNlcnZlcnMgLQordGhlc2UgYXJlIGdvb2QgdGhpbmdzLCBkbyB1c2UgbWlycm9ycyB3aGVuIHBvc3NpYmxlLgorCisKK1RoZSAyLjYueCBrZXJuZWxzCistLS0KKyBUaGVzZSBhcmUgdGhlIGJhc2Ugc3RhYmxlIHJlbGVhc2VzIHJlbGVhc2VkIGJ5IExpbnVzLiBUaGUgaGlnaGVzdCBudW1iZXJlZAorcmVsZWFzZSBpcyB0aGUgbW9zdCByZWNlbnQuCisKK0lmIHJlZ3Jlc3Npb25zIG9yIG90aGVyIHNlcmlvdXMgZmxhd3MgYXJlIGZvdW5kIHRoZW4gYSAtc3RhYmxlIGZpeCBwYXRjaAord2lsbCBiZSByZWxlYXNlZCAoc2VlIGJlbG93KSBvbiB0b3Agb2YgdGhpcyBiYXNlLiBPbmNlIGEgbmV3IDIuNi54IGJhc2UKK2tlcm5lbCBpcyByZWxlYXNlZCwgYSBwYXRjaCBpcyBtYWRlIGF2YWlsYWJsZSB0aGF0IGlzIGEgZGVsdGEgYmV0d2VlbiB0aGUKK3ByZXZpb3VzIDIuNi54IGtlcm5lbCBhbmQgdGhlIG5ldyBvbmUuCisKK1RvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMiB5b3UnZCBkbyB0aGUgZm9sbG93aW5nIChub3RlCit0aGF0IHN1Y2ggcGF0Y2hlcyBkbyAqTk9UKiBhcHBseSBvbiB0b3Agb2YgMi42LngueSBrZXJuZWxzIGJ1dCBvbiB0b3Agb2YgdGhlCitiYXNlIDIuNi54IGtlcm5lbCAtIGlmIHlvdSBuZWVkIHRvIG1vdmUgZnJvbSAyLjYueC55IHRvIDIuNi54KzEgeW91IG5lZWQgdG8KK2ZpcnN0IHJldmVydCB0aGUgMi42LngueSBwYXRjaCkuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKyMgbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMgorJCBjZCB+L2xpbnV4LTIuNi4xMQkJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMgkJIyBhcHBseSB0aGUgMi42LjEyIHBhdGNoCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMSBsaW51eC0yLjYuMTIJCSMgcmVuYW1lIHNvdXJjZSBkaXIKKworIyBtb3ZpbmcgZnJvbSAyLjYuMTEuMSB0byAyLjYuMTIKKyQgY2Qgfi9saW51eC0yLjYuMTEuMQkJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTIuNi4xMS4xCSMgcmV2ZXJ0IHRoZSAyLjYuMTEuMSBwYXRjaAorCQkJCQkjIHNvdXJjZSBkaXIgaXMgbm93IDIuNi4xMQorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTIJCSMgYXBwbHkgbmV3IDIuNi4xMiBwYXRjaAorJCBjZCAuLgorJCBtdiBsaW51eC0yLjYuMTEuMSBpbnV4LTIuNi4xMgkJIyByZW5hbWUgc291cmNlIGRpcgorCisKK1RoZSAyLjYueC55IGtlcm5lbHMKKy0tLQorIEtlcm5lbHMgd2l0aCA0IGRpZ2l0IHZlcnNpb25zIGFyZSAtc3RhYmxlIGtlcm5lbHMuIFRoZXkgY29udGFpbiBzbWFsbChpc2gpCitjcml0aWNhbCBmaXhlcyBmb3Igc2VjdXJpdHkgcHJvYmxlbXMgb3Igc2lnbmlmaWNhbnQgcmVncmVzc2lvbnMgZGlzY292ZXJlZAoraW4gYSBnaXZlbiAyLjYueCBrZXJuZWwuCisKK1RoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGJyYW5jaCBmb3IgdXNlcnMgd2hvIHdhbnQgdGhlIG1vc3QgcmVjZW50IHN0YWJsZQora2VybmVsIGFuZCBhcmUgbm90IGludGVyZXN0ZWQgaW4gaGVscGluZyB0ZXN0IGRldmVsb3BtZW50L2V4cGVyaW1lbnRhbAordmVyc2lvbnMuCisKK0lmIG5vIDIuNi54Lnkga2VybmVsIGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgaGlnaGVzdCBudW1iZXJlZCAyLjYueCBrZXJuZWwgaXMKK3RoZSBjdXJyZW50IHN0YWJsZSBrZXJuZWwuCisKK1RoZXNlIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgbWVhbmluZyB0aGF0IGZvciBleGFtcGxlIHRoZSAyLjYuMTIuMworcGF0Y2ggZG9lcyBub3QgYXBwbHkgb24gdG9wIG9mIHRoZSAyLjYuMTIuMiBrZXJuZWwgc291cmNlLCBidXQgcmF0aGVyIG9uIHRvcAorb2YgdGhlIGJhc2UgMi42LjEyIGtlcm5lbCBzb3VyY2UuCitTbywgaW4gb3JkZXIgdG8gYXBwbHkgdGhlIDIuNi4xMi4zIHBhdGNoIHRvIHlvdXIgZXhpc3RpbmcgMi42LjEyLjIga2VybmVsCitzb3VyY2UgeW91IGhhdmUgdG8gZmlyc3QgYmFjayBvdXQgdGhlIDIuNi4xMi4yIHBhdGNoIChzbyB5b3UgYXJlIGxlZnQgd2l0aCBhCitiYXNlIDIuNi4xMiBrZXJuZWwgc291cmNlKSBhbmQgdGhlbiBhcHBseSB0aGUgbmV3IDIuNi4xMi4zIHBhdGNoLgorCitIZXJlJ3MgYSBzbWFsbCBleGFtcGxlOgorCiskIGNkIH4vbGludXgtMi42LjEyLjIJCQkjIGNoYW5nZSBpbnRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTIuMgkjIHJldmVydCB0aGUgMi42LjEyLjIgcGF0Y2gKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyLjMJCSMgYXBwbHkgdGhlIG5ldyAyLjYuMTIuMyBwYXRjaAorJCBjZCAuLgorJCBtdiBsaW51eC0yLjYuMTIuMiBsaW51eC0yLjYuMTIuMwkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKworCitUaGUgLXJjIGtlcm5lbHMKKy0tLQorIFRoZXNlIGFyZSByZWxlYXNlLWNhbmRpZGF0ZSBrZXJuZWxzLiBUaGVzZSBhcmUgZGV2ZWxvcG1lbnQga2VybmVscyByZWxlYXNlZAorYnkgTGludXMgd2hlbmV2ZXIgaGUgZGVlbXMgdGhlIGN1cnJlbnQgZ2l0ICh0aGUga2VybmVsJ3Mgc291cmNlIG1hbmFnZW1lbnQKK3Rvb2wpIHRyZWUgdG8gYmUgaW4gYSByZWFzb25hYmx5IHNhbmUgc3RhdGUgYWRlcXVhdGUgZm9yIHRlc3RpbmcuCisKK1RoZXNlIGtlcm5lbHMgYXJlIG5vdCBzdGFibGUgYW5kIHlvdSBzaG91bGQgZXhwZWN0IG9jY2FzaW9uYWwgYnJlYWthZ2UgaWYKK3lvdSBpbnRlbmQgdG8gcnVuIHRoZW0uIFRoaXMgaXMgaG93ZXZlciB0aGUgbW9zdCBzdGFibGUgb2YgdGhlIG1haW4KK2RldmVsb3BtZW50IGJyYW5jaGVzIGFuZCBpcyBhbHNvIHdoYXQgd2lsbCBldmVudHVhbGx5IHR1cm4gaW50byB0aGUgbmV4dAorc3RhYmxlIGtlcm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgaXQgYmUgdGVzdGVkIGJ5IGFzIG1hbnkgcGVvcGxlIGFzCitwb3NzaWJsZS4KKworVGhpcyBpcyBhIGdvb2QgYnJhbmNoIHRvIHJ1biBmb3IgcGVvcGxlIHdobyB3YW50IHRvIGhlbHAgb3V0IHRlc3RpbmcKK2RldmVsb3BtZW50IGtlcm5lbHMgYnV0IGRvIG5vdCB3YW50IHRvIHJ1biBzb21lIG9mIHRoZSByZWFsbHkgZXhwZXJpbWVudGFsCitzdHVmZiAoc3VjaCBwZW9wbGUgc2hvdWxkIHNlZSB0aGUgc2VjdGlvbnMgYWJvdXQgLWdpdCBhbmQgLW1tIGtlcm5lbHMgYmVsb3cpLgorCitUaGUgLXJjIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgdGhleSBhcHBseSB0byBhIGJhc2UgMi42Lngga2VybmVsLCBqdXN0CitsaWtlIHRoZSAyLjYueC55IHBhdGNoZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUga2VybmVsIHZlcnNpb24gYmVmb3JlIHRoZSAtcmNOCitzdWZmaXggZGVub3RlcyB0aGUgdmVyc2lvbiBvZiB0aGUga2VybmVsIHRoYXQgdGhpcyAtcmMga2VybmVsIHdpbGwgZXZlbnR1YWxseQordHVybiBpbnRvLgorU28sIDIuNi4xMy1yYzUgbWVhbnMgdGhhdCB0aGlzIGlzIHRoZSBmaWZ0aCByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgdGhlIDIuNi4xMwora2VybmVsIGFuZCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGFwcGxpZWQgb24gdG9wIG9mIHRoZSAyLjYuMTIga2VybmVsIHNvdXJjZS4KKworSGVyZSBhcmUgMyBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczoKKworIyBmaXJzdCBhbiBleGFtcGxlIG9mIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTMtcmMzCiskIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEyIHNvdXJjZSBkaXIKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMiBsaW51eC0yLjYuMTMtcmMzCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCisKKyMgbm93IGxldCdzIG1vdmUgZnJvbSAyLjYuMTMtcmMzIHRvIDIuNi4xMy1yYzUKKyQgY2Qgfi9saW51eC0yLjYuMTMtcmMzCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEzLXJjMyBkaXIKKyQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIHJldmVydCB0aGUgMi42LjEzLXJjMyBwYXRjaAorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgdGhlIG5ldyAyLjYuMTMtcmM1IHBhdGNoCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMy1yYzMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCisjIGZpbmFsbHkgbGV0J3MgdHJ5IGFuZCBtb3ZlIGZyb20gMi42LjEyLjMgdG8gMi42LjEzLXJjNQorJCBjZCB+L2xpbnV4LTIuNi4xMi4zCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTIuNi4xMi4zCSMgcmV2ZXJ0IHRoZSAyLjYuMTIuMyBwYXRjaAorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgbmV3IDIuNi4xMy1yYzUgcGF0Y2gKKyQgY2QgLi4KKyQgbXYgbGludXgtMi42LjEyLjMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKworCitUaGUgLWdpdCBrZXJuZWxzCistLS0KKyBUaGVzZSBhcmUgZGFpbHkgc25hcHNob3RzIG9mIExpbnVzJyBrZXJuZWwgdHJlZSAobWFuYWdlZCBpbiBhIGdpdAorcmVwb3NpdG9yeSwgaGVuY2UgdGhlIG5hbWUpLgorCitUaGVzZSBwYXRjaGVzIGFyZSB1c3VhbGx5IHJlbGVhc2VkIGRhaWx5IGFuZCByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YKK0xpbnVzJyB0cmVlLiBUaGV5IGFyZSBtb3JlIGV4cGVyaW1lbnRhbCB0aGFuIC1yYyBrZXJuZWxzIHNpbmNlIHRoZXkgYXJlCitnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IGV2ZW4gYSBjdXJzb3J5IGdsYW5jZSB0byBzZWUgaWYgdGhleSBhcmUKK3NhbmUuCisKKy1naXQgcGF0Y2hlcyBhcmUgbm90IGluY3JlbWVudGFsIGFuZCBhcHBseSBlaXRoZXIgdG8gYSBiYXNlIDIuNi54IGtlcm5lbCBvcgorYSBiYXNlIDIuNi54LXJjIGtlcm5lbCAtIHlvdSBjYW4gc2VlIHdoaWNoIGZyb20gdGhlaXIgbmFtZS4KK0EgcGF0Y2ggbmFtZWQgMi42LjEyLWdpdDEgYXBwbGllcyB0byB0aGUgMi42LjEyIGtlcm5lbCBzb3VyY2UgYW5kIGEgcGF0Y2gKK25hbWVkIDIuNi4xMy1yYzMtZ2l0MiBhcHBsaWVzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIDIuNi4xMy1yYzMga2VybmVsLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOgorCisjIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTItZ2l0MQorJCBjZCB+L2xpbnV4LTIuNi4xMgkJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTItZ2l0MQkjIGFwcGx5IHRoZSAyLjYuMTItZ2l0MSBwYXRjaAorJCBjZCAuLgorJCBtdiBsaW51eC0yLjYuMTIgbGludXgtMi42LjEyLWdpdDEJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisKKyMgbW92aW5nIGZyb20gMi42LjEyLWdpdDEgdG8gMi42LjEzLXJjMi1naXQzCiskIGNkIH4vbGludXgtMi42LjEyLWdpdDEJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTItZ2l0MQkjIHJldmVydCB0aGUgMi42LjEyLWdpdDEgcGF0Y2gKKwkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBrZXJuZWwKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMgkjIGFwcGx5IHRoZSAyLjYuMTMtcmMyIHBhdGNoCisJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgMi42LjEzLXJjMgorJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmMyLWdpdDMJIyBhcHBseSB0aGUgMi42LjEzLXJjMi1naXQzIHBhdGNoCisJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgMi42LjEzLXJjMi1naXQzCiskIGNkIC4uCiskIG12IGxpbnV4LTIuNi4xMi1naXQxIGxpbnV4LTIuNi4xMy1yYzItZ2l0MwkjIHJlbmFtZSBzb3VyY2UgZGlyCisKKworVGhlIC1tbSBrZXJuZWxzCistLS0KKyBUaGVzZSBhcmUgZXhwZXJpbWVudGFsIGtlcm5lbHMgcmVsZWFzZWQgYnkgQW5kcmV3IE1vcnRvbi4KKworVGhlIC1tbSB0cmVlIHNlcnZlcyBhcyBhIHNvcnQgb2YgcHJvdmluZyBncm91bmQgZm9yIG5ldyBmZWF0dXJlcyBhbmQgb3RoZXIKK2V4cGVyaW1lbnRhbCBwYXRjaGVzLgorT25jZSBhIHBhdGNoIGhhcyBwcm92ZWQgaXRzIHdvcnRoIGluIC1tbSBmb3IgYSB3aGlsZSBBbmRyZXcgcHVzaGVzIGl0IG9uIHRvCitMaW51cyBmb3IgaW5jbHVzaW9uIGluIG1haW5saW5lLgorCitBbHRob3VnaCBpdCdzIGVuY291cmFnZWQgdGhhdCBwYXRjaGVzIGZsb3cgdG8gTGludXMgdmlhIHRoZSAtbW0gdHJlZSwgdGhpcworaXMgbm90IGFsd2F5cyBlbmZvcmNlZC4KK1N1YnN5c3RlbSBtYWludGFpbmVycyAob3IgaW5kaXZpZHVhbHMpIHNvbWV0aW1lcyBwdXNoIHRoZWlyIHBhdGNoZXMgZGlyZWN0bHkKK3RvIExpbnVzLCBldmVuIHRob3VnaCAob3IgYWZ0ZXIpIHRoZXkgaGF2ZSBiZWVuIG1lcmdlZCBhbmQgdGVzdGVkIGluIC1tbSAob3IKK3NvbWV0aW1lcyBldmVuIHdpdGhvdXQgcHJpb3IgdGVzdGluZyBpbiAtbW0pLgorCitZb3Ugc2hvdWxkIGdlbmVyYWxseSBzdHJpdmUgdG8gZ2V0IHlvdXIgcGF0Y2hlcyBpbnRvIG1haW5saW5lIHZpYSAtbW0gdG8KK2Vuc3VyZSBtYXhpbXVtIHRlc3RpbmcuCisKK1RoaXMgYnJhbmNoIGlzIGluIGNvbnN0YW50IGZsdXggYW5kIGNvbnRhaW5zIG1hbnkgZXhwZXJpbWVudGFsIGZlYXR1cmVzLCBhCitsb3Qgb2YgZGVidWdnaW5nIHBhdGNoZXMgbm90IGFwcHJvcHJpYXRlIGZvciBtYWlubGluZSBldGMgYW5kIGlzIHRoZSBtb3N0CitleHBlcmltZW50YWwgb2YgdGhlIGJyYW5jaGVzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgorCitUaGVzZSBrZXJuZWxzIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHVzZSBvbiBzeXN0ZW1zIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlCitzdGFibGUgYW5kIHRoZXkgYXJlIG1vcmUgcmlza3kgdG8gcnVuIHRoYW4gYW55IG9mIHRoZSBvdGhlciBicmFuY2hlcyAobWFrZQorc3VyZSB5b3UgaGF2ZSB1cC10by1kYXRlIGJhY2t1cHMgLSB0aGF0IGdvZXMgZm9yIGFueSBleHBlcmltZW50YWwga2VybmVsIGJ1dAorZXZlbiBtb3JlIHNvIGZvciAtbW0ga2VybmVscykuCisKK1RoZXNlIGtlcm5lbHMgaW4gYWRkaXRpb24gdG8gYWxsIHRoZSBvdGhlciBleHBlcmltZW50YWwgcGF0Y2hlcyB0aGV5IGNvbnRhaW4KK3VzdWFsbHkgYWxzbyBjb250YWluIGFueSBjaGFuZ2VzIGluIHRoZSBtYWlubGluZSAtZ2l0IGtlcm5lbHMgYXZhaWxhYmxlIGF0Cit0aGUgdGltZSBvZiByZWxlYXNlLgorCitUZXN0aW5nIG9mIC1tbSBrZXJuZWxzIGlzIGdyZWF0bHkgYXBwcmVjaWF0ZWQgc2luY2UgdGhlIHdob2xlIHBvaW50IG9mIHRoZQordHJlZSBpcyB0byB3ZWVkIG91dCByZWdyZXNzaW9ucywgY3Jhc2hlcywgZGF0YSBjb3JydXB0aW9uIGJ1Z3MsIGJ1aWxkCiticmVha2FnZSAoYW5kIGFueSBvdGhlciBidWcgaW4gZ2VuZXJhbCkgYmVmb3JlIGNoYW5nZXMgYXJlIG1lcmdlZCBpbnRvIHRoZQorbW9yZSBzdGFibGUgbWFpbmxpbmUgTGludXMgdHJlZS4KK0J1dCB0ZXN0ZXJzIG9mIC1tbSBzaG91bGQgYmUgYXdhcmUgdGhhdCBicmVha2FnZSBpbiB0aGlzIHRyZWUgaXMgbW9yZSBjb21tb24KK3RoYW4gaW4gYW55IG90aGVyIHRyZWUuCisKK1RoZSAtbW0ga2VybmVscyBhcmUgbm90IHJlbGVhc2VkIG9uIGEgZml4ZWQgc2NoZWR1bGUsIGJ1dCB1c3VhbGx5IGEgZmV3IC1tbQora2VybmVscyBhcmUgcmVsZWFzZWQgaW4gYmV0d2VlbiBlYWNoIC1yYyBrZXJuZWwgKDEgdG8gMyBpcyBjb21tb24pLgorVGhlIC1tbSBrZXJuZWxzIGFwcGx5IHRvIGVpdGhlciBhIGJhc2UgMi42Lngga2VybmVsICh3aGVuIG5vIC1yYyBrZXJuZWxzCitoYXZlIGJlZW4gcmVsZWFzZWQgeWV0KSBvciB0byBhIExpbnVzIC1yYyBrZXJuZWwuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgYXBwbHlpbmcgdGhlIC1tbSBwYXRjaGVzOgorCisjIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTItbW0xCiskIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgdG8gdGhlIDIuNi4xMiBzb3VyY2UgZGlyCiskIHBhdGNoIC1wMSA8IC4uLzIuNi4xMi1tbTEJCSMgYXBwbHkgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKKyQgY2QgLi4KKyQgbXYgbGludXgtMi42LjEyIGxpbnV4LTIuNi4xMi1tbTEJIyByZW5hbWUgdGhlIHNvdXJjZSBhcHByb3ByaWF0ZWx5CisKKyMgbW92aW5nIGZyb20gMi42LjEyLW1tMSB0byAyLjYuMTMtcmMzLW1tMworJCBjZCB+L2xpbnV4LTIuNi4xMi1tbTEKKyQgcGF0Y2ggLXAxIC1SIDwgLi4vMi42LjEyLW1tMQkJIyByZXZlcnQgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKKwkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBzb3VyY2UKKyQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCisJCQkJCSMgd2Ugbm93IGhhdmUgYSAyLjYuMTMtcmMzIHNvdXJjZQorJCBwYXRjaCAtcDEgPCAuLi8yLjYuMTMtcmMzLW1tMwkJIyBhcHBseSB0aGUgMi42LjEzLXJjMy1tbTMgcGF0Y2gKKyQgY2QgLi4KKyQgbXYgbGludXgtMi42LjEyLW1tMSBsaW51eC0yLjYuMTMtcmMzLW1tMwkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCisKK1RoaXMgY29uY2x1ZGVzIHRoaXMgbGlzdCBvZiBleHBsYW5hdGlvbnMgb2YgdGhlIHZhcmlvdXMga2VybmVsIHRyZWVzIGFuZCBJCitob3BlIHlvdSBhcmUgbm93IGNyeXN0YWwgY2xlYXIgb24gaG93IHRvIGFwcGx5IHRoZSB2YXJpb3VzIHBhdGNoZXMgYW5kIGhlbHAKK3Rlc3RpbmcgdGhlIGtlcm5lbC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zb255Y2Q1MzUgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQppbmRleCA1OTU4MWE0Li5iODFlMTA5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQorKysgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQpAQCAtNjgsNyArNjgsOCBAQAogUG9yZmlyaSBDbGF1ZGlvIDxDLlBvcmZpcmlAbmlzbXMudGVpLmVyaWNzc29uLnNlPiBmb3IgcGF0Y2hlcwogdG8gbWFrZSB0aGUgZHJpdmVyIHdvcmsgd2l0aCB0aGUgb2xkZXIgQ0RVLTUxMC81MTUgc2VyaWVzLCBhbmQKIEhlaWtvIEVpc3NmZWxkdCA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPiBmb3IgcG9pbnRpbmcgb3V0IHRoYXQKLXRoZSB2ZXJpZnlfYXJlYSgpIGNoZWNrcyB3ZXJlIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIHNhaWQgY2hlY2tzLgordGhlIHZlcmlmeV9hcmVhKCkgY2hlY2tzIHdlcmUgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2Ygc2FpZCBjaGVja3MKKyhub3RlOiB2ZXJpZnlfYXJlYSgpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KIAogKEFja25vd2xlZGdtZW50cyBmcm9tIFJvbiBKZXBwZXNlbiBpbiB0aGUgMC4zIHJlbGVhc2U6KQogVGhhbmtzIHRvIENvcmV5IE1pbnlhcmQgd2hvIHdyb3RlIHRoZSBvcmlnaW5hbCBDRFUtMzFBIGRyaXZlciBvbiB3aGljaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1zdGF0cy50eHQKaW5kZXggZTJkMWU3Ni4uNmE4Mjk0OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0CkBAIC0zNiw3ICszNiw3IEBACiAKIEFsbCB0aGUgc3RhdGlzdGljcyB3aWxsIGJlIGZyb20gdGhlIHRpbWUgdGhlIHN0YXRzIGRyaXZlciBoYXMgYmVlbiBpbnNlcnRlZCAKIHRvIHRoZSB0aW1lIHdoZW4gYSByZWFkIG9mIGEgcGFydGljdWxhciBzdGF0aXN0aWMgaXMgZG9uZS4gT2J2aW91c2x5LCBzdGF0cyAKLWRyaXZlciB3aWxsIG5vdCBoYXZlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGhlIGZyZXF1Y255IHRyYW5zaXRpb25zIGJlZm9yZQorZHJpdmVyIHdpbGwgbm90IGhhdmUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmVxdWVuY3kgdHJhbnNpdGlvbnMgYmVmb3JlCiB0aGUgc3RhdHMgZHJpdmVyIGluc2VydGlvbi4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CmluZGV4IGFkOTQ0YzAuLmQxN2I3ZDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dApAQCAtNjAsNiArNjAsMTggQEAKIGxvYWQgYmFsYW5jaW5nIGNvZGUgdHJ5aW5nIHRvIHB1bGwgdGFza3Mgb3V0c2lkZSBvZiB0aGUgY3B1IGV4Y2x1c2l2ZQogY3B1c2V0IG9ubHkgdG8gYmUgcHJldmVudGVkIGJ5IHRoZSB0YXNrcycgY3B1c19hbGxvd2VkIG1hc2suCiAKK0EgY3B1c2V0IHRoYXQgaXMgbWVtX2V4Y2x1c2l2ZSByZXN0cmljdHMga2VybmVsIGFsbG9jYXRpb25zIGZvcgorcGFnZSwgYnVmZmVyIGFuZCBvdGhlciBkYXRhIGNvbW1vbmx5IHNoYXJlZCBieSB0aGUga2VybmVsIGFjcm9zcworbXVsdGlwbGUgdXNlcnMuICBBbGwgY3B1c2V0cywgd2hldGhlciBtZW1fZXhjbHVzaXZlIG9yIG5vdCwgcmVzdHJpY3QKK2FsbG9jYXRpb25zIG9mIG1lbW9yeSBmb3IgdXNlciBzcGFjZS4gIFRoaXMgZW5hYmxlcyBjb25maWd1cmluZyBhCitzeXN0ZW0gc28gdGhhdCBzZXZlcmFsIGluZGVwZW5kZW50IGpvYnMgY2FuIHNoYXJlIGNvbW1vbiBrZXJuZWwKK2RhdGEsIHN1Y2ggYXMgZmlsZSBzeXN0ZW0gcGFnZXMsIHdoaWxlIGlzb2xhdGluZyBlYWNoIGpvYnMgdXNlcgorYWxsb2NhdGlvbiBpbiBpdHMgb3duIGNwdXNldC4gIFRvIGRvIHRoaXMsIGNvbnN0cnVjdCBhIGxhcmdlCittZW1fZXhjbHVzaXZlIGNwdXNldCB0byBob2xkIGFsbCB0aGUgam9icywgYW5kIGNvbnN0cnVjdCBjaGlsZCwKK25vbi1tZW1fZXhjbHVzaXZlIGNwdXNldHMgZm9yIGVhY2ggaW5kaXZpZHVhbCBqb2IuICBPbmx5IGEgc21hbGwKK2Ftb3VudCBvZiB0eXBpY2FsIGtlcm5lbCBtZW1vcnksIHN1Y2ggYXMgcmVxdWVzdHMgZnJvbSBpbnRlcnJ1cHQKK2hhbmRsZXJzLCBpcyBhbGxvd2VkIHRvIGJlIHRha2VuIG91dHNpZGUgZXZlbiBhIG1lbV9leGNsdXNpdmUgY3B1c2V0LgorCiBVc2VyIGxldmVsIGNvZGUgbWF5IGNyZWF0ZSBhbmQgZGVzdHJveSBjcHVzZXRzIGJ5IG5hbWUgaW4gdGhlIGNwdXNldAogdmlydHVhbCBmaWxlIHN5c3RlbSwgbWFuYWdlIHRoZSBhdHRyaWJ1dGVzIGFuZCBwZXJtaXNzaW9ucyBvZiB0aGVzZQogY3B1c2V0cyBhbmQgd2hpY2ggQ1BVcyBhbmQgTWVtb3J5IE5vZGVzIGFyZSBhc3NpZ25lZCB0byBlYWNoIGNwdXNldCwKQEAgLTI2NSw3ICsyNzcsNyBAQAogaW1wYWN0aW5nIHRoZSBzY2hlZHVsZXIgY29kZSBpbiB0aGUga2VybmVsIHdpdGggYSBjaGVjayBmb3IgY2hhbmdlcwogaW4gYSB0YXNrcyBwcm9jZXNzb3IgcGxhY2VtZW50LgogCi1UaGVyZSBpcyBhbiBleGNlcHRpb24gdG8gdGhlIGFib3ZlLiAgSWYgaG90cGx1ZyBmdW50aW9uYWxpdHkgaXMgdXNlZAorVGhlcmUgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBhYm92ZS4gIElmIGhvdHBsdWcgZnVuY3Rpb25hbGl0eSBpcyB1c2VkCiB0byByZW1vdmUgYWxsIHRoZSBDUFVzIHRoYXQgYXJlIGN1cnJlbnRseSBhc3NpZ25lZCB0byBhIGNwdXNldCwKIHRoZW4gdGhlIGtlcm5lbCB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBjcHVzX2FsbG93ZWQgb2YgYWxsCiB0YXNrcyBhdHRhY2hlZCB0byBDUFVzIGluIHRoYXQgY3B1c2V0IHRvIGFsbG93IGFsbCBDUFVzLiAgV2hlbiBtZW1vcnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2Rlc2NvcmUtcmVhZG1lLnR4dCBiL0RvY3VtZW50YXRpb24vY3J5cHRvL2Rlc2NvcmUtcmVhZG1lLnR4dAppbmRleCAxNjY0NzRjLi4xNmU5ZTYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NyeXB0by9kZXNjb3JlLXJlYWRtZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcnlwdG8vZGVzY29yZS1yZWFkbWUudHh0CkBAIC0xLDQgKzEsNCBAQAotQmVsb3cgaXMgdGhlIG9yZ2luYWwgUkVBRE1FIGZpbGUgZnJvbSB0aGUgZGVzY29yZS5zaGFyIHBhY2thZ2UuCitCZWxvdyBpcyB0aGUgb3JpZ2luYWwgUkVBRE1FIGZpbGUgZnJvbSB0aGUgZGVzY29yZS5zaGFyIHBhY2thZ2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogZGVzIC0gZmFzdCAmIHBvcnRhYmxlIERFUyBlbmNyeXB0aW9uICYgZGVjcnlwdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGNkYmFzLnR4dCBiL0RvY3VtZW50YXRpb24vZGNkYmFzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM1MmUyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kY2RiYXMudHh0CkBAIC0wLDAgKzEsOTEgQEAKK092ZXJ2aWV3CisKK1RoZSBEZWxsIFN5c3RlbXMgTWFuYWdlbWVudCBCYXNlIERyaXZlciBwcm92aWRlcyBhIHN5c2ZzIGludGVyZmFjZSBmb3IKK3N5c3RlbXMgbWFuYWdlbWVudCBzb2Z0d2FyZSBzdWNoIGFzIERlbGwgT3Blbk1hbmFnZSB0byBwZXJmb3JtIHN5c3RlbQorbWFuYWdlbWVudCBpbnRlcnJ1cHRzIGFuZCBob3N0IGNvbnRyb2wgYWN0aW9ucyAoc3lzdGVtIHBvd2VyIGN5Y2xlIG9yCitwb3dlciBvZmYgYWZ0ZXIgT1Mgc2h1dGRvd24pIG9uIGNlcnRhaW4gRGVsbCBzeXN0ZW1zLgorCitEZWxsIE9wZW5NYW5hZ2UgcmVxdWlyZXMgdGhpcyBkcml2ZXIgb24gdGhlIGZvbGxvd2luZyBEZWxsIFBvd2VyRWRnZSBzeXN0ZW1zOgorMzAwLCAxMzAwLCAxNDAwLCA0MDBTQywgNTAwU0MsIDE1MDBTQywgMTU1MCwgNjAwU0MsIDE2MDBTQywgNjUwLCAxNjU1TUMsCis3MDAsIGFuZCA3NTAuICBPdGhlciBEZWxsIHNvZnR3YXJlIHN1Y2ggYXMgdGhlIG9wZW4gc291cmNlIGxpYnNtYmlvcyBwcm9qZWN0CitpcyBleHBlY3RlZCB0byBtYWtlIHVzZSBvZiB0aGlzIGRyaXZlciwgYW5kIGl0IG1heSBpbmNsdWRlIHRoZSB1c2Ugb2YgdGhpcworZHJpdmVyIG9uIG90aGVyIERlbGwgc3lzdGVtcy4KKworVGhlIERlbGwgbGlic21iaW9zIHByb2plY3QgYWltcyB0b3dhcmRzIHByb3ZpZGluZyBhY2Nlc3MgdG8gYXMgbXVjaCBCSU9TCitpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZS4gIFNlZSBodHRwOi8vbGludXguZGVsbC5jb20vbGlic21iaW9zL21haW4vIGZvcgorbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGlic21iaW9zIHByb2plY3QuCisKKworU3lzdGVtIE1hbmFnZW1lbnQgSW50ZXJydXB0CisKK09uIHNvbWUgRGVsbCBzeXN0ZW1zLCBzeXN0ZW1zIG1hbmFnZW1lbnQgc29mdHdhcmUgbXVzdCBhY2Nlc3MgY2VydGFpbgorbWFuYWdlbWVudCBpbmZvcm1hdGlvbiB2aWEgYSBzeXN0ZW0gbWFuYWdlbWVudCBpbnRlcnJ1cHQgKFNNSSkuICBUaGUgU01JIGRhdGEKK2J1ZmZlciBtdXN0IHJlc2lkZSBpbiAzMi1iaXQgYWRkcmVzcyBzcGFjZSwgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorYnVmZmVyIGlzIHJlcXVpcmVkIGZvciB0aGUgU01JLiAgVGhlIGRyaXZlciBtYWludGFpbnMgdGhlIG1lbW9yeSByZXF1aXJlZCBmb3IKK3RoZSBTTUkgYW5kIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgYXBwbGljYXRpb24gdG8gZ2VuZXJhdGUgdGhlIFNNSS4KK1RoZSBkcml2ZXIgY3JlYXRlcyB0aGUgZm9sbG93aW5nIHN5c2ZzIGVudHJpZXMgZm9yIHN5c3RlbXMgbWFuYWdlbWVudAorc29mdHdhcmUgdG8gcGVyZm9ybSB0aGVzZSBzeXN0ZW0gbWFuYWdlbWVudCBpbnRlcnJ1cHRzOgorCisvc3lzL2RldmljZXMvcGxhdGZvcm0vZGNkYmFzL3NtaV9kYXRhCisvc3lzL2RldmljZXMvcGxhdGZvcm0vZGNkYmFzL3NtaV9kYXRhX2J1Zl9waHlzX2FkZHIKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvc21pX2RhdGFfYnVmX3NpemUKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvc21pX3JlcXVlc3QKKworU3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIG11c3QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGV4ZWN1dGUKK2EgU01JIHVzaW5nIHRoaXMgZHJpdmVyOgorCisxKSBMb2NrIHNtaV9kYXRhLgorMikgV3JpdGUgc3lzdGVtIG1hbmFnZW1lbnQgY29tbWFuZCB0byBzbWlfZGF0YS4KKzMpIFdyaXRlICIxIiB0byBzbWlfcmVxdWVzdCB0byBnZW5lcmF0ZSBhIGNhbGxpbmcgaW50ZXJmYWNlIFNNSSBvcgorICAgIjIiIHRvIGdlbmVyYXRlIGEgcmF3IFNNSS4KKzQpIFJlYWQgc3lzdGVtIG1hbmFnZW1lbnQgY29tbWFuZCByZXNwb25zZSBmcm9tIHNtaV9kYXRhLgorNSkgVW5sb2NrIHNtaV9kYXRhLgorCisKK0hvc3QgQ29udHJvbCBBY3Rpb24KKworRGVsbCBPcGVuTWFuYWdlIHN1cHBvcnRzIGEgaG9zdCBjb250cm9sIGZlYXR1cmUgdGhhdCBhbGxvd3MgdGhlIGFkbWluaXN0cmF0b3IKK3RvIHBlcmZvcm0gYSBwb3dlciBjeWNsZSBvciBwb3dlciBvZmYgb2YgdGhlIHN5c3RlbSBhZnRlciB0aGUgT1MgaGFzIGZpbmlzaGVkCitzaHV0dGluZyBkb3duLiAgT24gc29tZSBEZWxsIHN5c3RlbXMsIHRoaXMgaG9zdCBjb250cm9sIGZlYXR1cmUgcmVxdWlyZXMgdGhhdAorYSBkcml2ZXIgcGVyZm9ybSBhIFNNSSBhZnRlciB0aGUgT1MgaGFzIGZpbmlzaGVkIHNodXR0aW5nIGRvd24uCisKK1RoZSBkcml2ZXIgY3JlYXRlcyB0aGUgZm9sbG93aW5nIHN5c2ZzIGVudHJpZXMgZm9yIHN5c3RlbXMgbWFuYWdlbWVudCBzb2Z0d2FyZQordG8gc2NoZWR1bGUgdGhlIGRyaXZlciB0byBwZXJmb3JtIGEgcG93ZXIgY3ljbGUgb3IgcG93ZXIgb2ZmIGhvc3QgY29udHJvbAorYWN0aW9uIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIGZpbmlzaGVkIHNodXR0aW5nIGRvd246CisKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvaG9zdF9jb250cm9sX2FjdGlvbgorL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2RjZGJhcy9ob3N0X2NvbnRyb2xfc21pX3R5cGUKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kY2RiYXMvaG9zdF9jb250cm9sX29uX3NodXRkb3duCisKK0RlbGwgT3Blbk1hbmFnZSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGV4ZWN1dGUgYSBwb3dlciBjeWNsZSBvcgorcG93ZXIgb2ZmIGhvc3QgY29udHJvbCBhY3Rpb24gdXNpbmcgdGhpcyBkcml2ZXI6CisKKzEpIFdyaXRlIGhvc3QgY29udHJvbCBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHRvIGhvc3RfY29udHJvbF9hY3Rpb24uCisyKSBXcml0ZSB0eXBlIG9mIFNNSSB0aGF0IGRyaXZlciBuZWVkcyB0byBwZXJmb3JtIHRvIGhvc3RfY29udHJvbF9zbWlfdHlwZS4KKzMpIFdyaXRlICIxIiB0byBob3N0X2NvbnRyb2xfb25fc2h1dGRvd24gdG8gZW5hYmxlIGhvc3QgY29udHJvbCBhY3Rpb24uCis0KSBJbml0aWF0ZSBPUyBzaHV0ZG93bi4KKyAgIChEcml2ZXIgd2lsbCBwZXJmb3JtIGhvc3QgY29udHJvbCBTTUkgd2hlbiBpdCBpcyBub3RpZmllZCB0aGF0IHRoZSBPUworICAgaGFzIGZpbmlzaGVkIHNodXR0aW5nIGRvd24uKQorCisKK0hvc3QgQ29udHJvbCBTTUkgVHlwZQorCitUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSB2YWx1ZSB0byB3cml0ZSB0byBob3N0X2NvbnRyb2xfc21pX3R5cGUgdG8KK3BlcmZvcm0gYSBwb3dlciBjeWNsZSBvciBwb3dlciBvZmYgaG9zdCBjb250cm9sIGFjdGlvbjoKKworUG93ZXJFZGdlIFN5c3RlbSAgICBIb3N0IENvbnRyb2wgU01JIFR5cGUKKy0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAzMDAgICAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMQorICAgICAxMzAwICAgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTEKKyAgICAgMTQwMCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUyCisgICAgICA1MDBTQyAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMgorICAgICAxNTAwU0MgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTIKKyAgICAgMTU1MCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUyCisgICAgICA2MDBTQyAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMgorICAgICAxNjAwU0MgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTIKKyAgICAgIDY1MCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUyCisgICAgIDE2NTVNQyAgICAgICAgICAgSENfU01JVFlQRV9UWVBFMgorICAgICAgNzAwICAgICAgICAgICAgIEhDX1NNSVRZUEVfVFlQRTMKKyAgICAgIDc1MCAgICAgICAgICAgICBIQ19TTUlUWVBFX1RZUEUzCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQgYi9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZhNWMzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQKQEAgLTAsMCArMSw3NCBAQAorUHVycG9zZToKK0RlbW9uc3RyYXRlIHRoZSB1c2FnZSBvZiB0aGUgbmV3IG9wZW4gc291cmNlZCByYnUgKFJlbW90ZSBCSU9TIFVwZGF0ZSkgZHJpdmVyCitmb3IgdXBkYXRpbmcgQklPUyBpbWFnZXMgb24gRGVsbCBzZXJ2ZXJzIGFuZCBkZXNrdG9wcy4KKworU2NvcGU6CitUaGlzIGRvY3VtZW50IGRpc2N1c3NlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmJ1IGRyaXZlciBvbmx5LgorSXQgZG9lcyBub3QgY292ZXIgdGhlIHN1cHBvcnQgbmVlZGVkIGZyb20gYXBsaWNhdGlvbnMgdG8gZW5hYmxlIHRoZSBCSU9TIHRvCit1cGRhdGUgaXRzZWxmIHdpdGggdGhlIGltYWdlIGRvd25sb2FkZWQgaW4gdG8gdGhlIG1lbW9yeS4KKworT3ZlcnZpZXc6CitUaGlzIGRyaXZlciB3b3JrcyB3aXRoIERlbGwgT3Blbk1hbmFnZSBvciBEZWxsIFVwZGF0ZSBQYWNrYWdlcyBmb3IgdXBkYXRpbmcKK3RoZSBCSU9TIG9uIERlbGwgc2VydmVycyAoc3RhcnRpbmcgZnJvbSBzZXJ2ZXJzIHNvbGQgc2luY2UgMTk5OSksIGRlc2t0b3BzCithbmQgbm90ZWJvb2tzIChzdGFydGluZyBmcm9tIHRob3NlIHNvbGQgaW4gMjAwNSkuCitQbGVhc2UgZ28gdG8gIGh0dHA6Ly9zdXBwb3J0LmRlbGwuY29tIHJlZ2lzdGVyIGFuZCB5b3UgY2FuIGZpbmQgaW5mbyBvbgorT3Blbk1hbmFnZSBhbmQgRGVsbCBVcGRhdGUgcGFja2FnZXMgKERVUCkuCisKK0RlbGxfUkJVIGRyaXZlciBzdXBwb3J0cyBCSU9TIHVwZGF0ZSB1c2luZyB0aGUgbW9uaWxvdGhpYyBpbWFnZSBhbmQgcGFja2V0aXplZAoraW1hZ2UgbWV0aG9kcy4gSW4gY2FzZSBvZiBtb25pb2xpdGhpYyB0aGUgZHJpdmVyIGFsbG9jYXRlcyBhIGNvbnRpZ3VvdXMgY2h1bmsKK29mIHBoeXNpY2FsIHBhZ2VzIGhhdmluZyB0aGUgQklPUyBpbWFnZS4gSW4gY2FzZSBvZiBwYWNrZXRpemVkIHRoZSBhcHAKK3VzaW5nIHRoZSBkcml2ZXIgYnJlYWtzIHRoZSBpbWFnZSBpbiB0byBwYWNrZXRzIG9mIGZpeGVkIHNpemVzIGFuZCB0aGUgZHJpdmVyCit3b3VsZCBwbGFjZSBlYWNoIHBhY2tldCBpbiBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gVGhlIGRyaXZlciBhbHNvCittYWludGFpbnMgYSBsaW5rIGxpc3Qgb2YgcGFja2V0cyBmb3IgcmVhZGluZyB0aGVtIGJhY2suCitJZiB0aGUgZGVsbF9yYnUgZHJpdmVyIGlzIHVubG9hZGVkIGFsbCB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KKworVGhlIHJidSBkcml2ZXIgbmVlZHMgdG8gaGF2ZSBhbiBhcHBsaWNhdGlvbiB3aGljaCB3aWxsIGluZm9ybSB0aGUgQklPUyB0bworZW5hYmxlIHRoZSB1cGRhdGUgaW4gdGhlIG5leHQgc3lzdGVtIHJlYm9vdC4KKworVGhlIHVzZXIgc2hvdWxkIG5vdCB1bmxvYWQgdGhlIHJidSBkcml2ZXIgYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIEJJT1MgaW1hZ2UKK29yIHVwZGF0aW5nLgorCitUaGUgZHJpdmVyIGxvYWQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSAvc3lzIGZpbGUgc3lzdGVtLgorL3N5cy9jbGFzcy9maXJtd2FyZS9kZWxsX3JidS9sb2FkaW5nCisvc3lzL2NsYXNzL2Zpcm13YXJlL2RlbGxfcmJ1L2RhdGEKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kZWxsX3JidS9pbWFnZV90eXBlCisvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvZGF0YQorCitUaGUgZHJpdmVyIHN1cHBvcnRzIHR3byB0eXBlcyBvZiB1cGRhdGUgbWVjaGFuaXNtOyBtb25vbGl0aGljIGFuZCBwYWNrZXRpemVkLgorVGhlc2UgdXBkYXRlIG1lY2hhbmlzbSBkZXBlbmRzIHVwb24gdGhlIEJJT1MgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIHN5c3RlbS4KK01vc3Qgb2YgdGhlIERlbGwgc3lzdGVtcyBzdXBwb3J0IGEgbW9ub2xpdGhpYyB1cGRhdGUgd2hlcmUgdGhlIEJJT1MgaW1hZ2UgaXMKK2NvcGllZCB0byBhIHNpbmdsZSBjb250aWd1b3VzIGJsb2NrIG9mIHBoeXNpY2FsIG1lbW9yeS4KK0luIGNhc2Ugb2YgcGFja2V0IG1lY2hhbmlzbSB0aGUgc2luZ2xlIG1lbW9yeSBjYW4gYmUgYnJva2VuIGluIHNtYWxsZXIgY2h1a3MKK29mIGNvbnRpZ3VvdXMgbWVtb3J5IGFuZCB0aGUgQklPUyBpbWFnZSBpcyBzY2F0dGVyZWQgaW4gdGhlc2UgcGFja2V0cy4KKworQnkgZGVmYXVsdCB0aGUgZHJpdmVyIHVzZXMgbW9ub2xpdGhpYyBtZW1vcnkgZm9yIHRoZSB1cGRhdGUgdHlwZS4gVGhpcyBjYW4gYmUKK2NoYW5nZWQgdG8gY29udGlndW91cyBkdXJpbmcgdGhlIGRyaXZlciBsb2FkIHRpbWUgYnkgc3BlY2lmeWluZyB0aGUgbG9hZAorcGFyYW1ldGVyIGltYWdlX3R5cGU9cGFja2V0LiAgVGhpcyBjYW4gYWxzbyBiZSBjaGFuZ2VkIGxhdGVyIGFzIGJlbG93CitlY2hvIHBhY2tldCA+IC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9kZWxsX3JidS9pbWFnZV90eXBlCisKK0RvIHRoZSBzdGVwcyBiZWxvdyB0byBkb3dubG9hZCB0aGUgQklPUyBpbWFnZS4KKzEpIGVjaG8gMSA+IC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvbG9hZGluZworMikgY3AgYmlvc19pbWFnZS5oZHIgL3N5cy9jbGFzcy9maXJtd2FyZS9kZWxsX3JidS9kYXRhCiszKSBlY2hvIDAgPiAvc3lzL2NsYXNzL2Zpcm13YXJlL2RlbGxfcmJ1L2xvYWRpbmcKKworVGhlIC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvIGVudHJpZXMgd2lsbCByZW1haW4gdGlsbCB0aGUgZm9sbG93aW5nIGlzCitkb25lLgorZWNobyAtMSA+IC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvbG9hZGluZworCitVbnRpbCB0aGlzIHN0ZXAgaXMgY29tcGxldGVkIHRoZSBkcml2ciBjYW5ub3QgYmUgdW5sb2FkZWQuCisKK0Fsc28gdGhlIGRyaXZlciBwcm92aWRlcyAvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvZGF0YSByZWFkb25seSBmaWxlIHRvCityZWFkIGJhY2sgdGhlIGltYWdlIGRvd25sb2FkZWQuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2Ugb2YgcGFja2V0IHVwZGF0ZQorbWVjaGFuaXNtIHdoZXJlIHRoZSBhYm92ZSBzdGVwcyAxLDIsMyB3aWxsIHJlcGVhdGVkIGZvciBldmVyeSBwYWNrZXQuCitCeSByZWFkaW5nIHRoZSAvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvZGF0YSBmaWxlIGFsbCBwYWNrZXQgZGF0YQorZG93bmxvYWRlZCBjYW4gYmUgdmVyaWZpZWQgaW4gYSBzaW5nbGUgZmlsZS4KK1RoZSBwYWNrZXRzIGFyZSBhcnJhbmdlZCBpbiB0aGlzIGZpbGUgb25lIGFmdGVyIHRoZSBvdGhlciBpbiBhIEZJRk8gb3JkZXIuCisKK05PVEU6CitUaGlzIGRyaXZlciByZXF1aXJlcyBhIHBhdGNoIGZvciBmaXJtd2FyZV9jbGFzcy5jIHdoaWNoIGhhcyB0aGUgYWRkaXRpb24KK29mIHJlcXVlc3RfZmlybXdhcmVfbm93YWl0X25vaG90cGx1ZyBmdW5jdGlvbiB0byB3b3J0aworQWxzbyBhZnRlciB1cGRhdGluZyB0aGUgQklPUyBpbWFnZSBhbiB1c2VyIG1kb2UgYXBwbGljYXRpb24gbmVlZWRzIHRvIGV4ZWN1dGUKK2NvZGUgd2hpY2ggbWVzc2FnZSB0aGUgQklPUyB1cGRhdGUgcmVxdWVzdCB0byB0aGUgQklPUy4gU28gb24gdGhlIG5leHQgcmVib290Cit0aGUgQklPUyBrbm93cyBhYm91dCB0aGUgbmV3IGltYWdlIGRvd25sb2FkZWQgYW5kIGl0IHVwZGF0ZXMgaXQgc2VsZi4KK0Fsc28gZG9uJ3QgdW5sb2FkIHRoZSByYnUgZHJpdmUgaWYgdGhlIGltYWdlIGhhcyB0byBiZSB1cGRhdGVkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQKaW5kZXggZTZiOGQwNS4uY2I2M2I3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dApAQCAtMSw1NSArMSw3NCBAQAotSG93IHRvIGdldCB0aGUgTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViwgUGlubmFjbGUgUENUViBTYXQsIFR3aW5oYW4gRFNUICsgY2xvbmVzIHdvcmtpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gZ2V0IHRoZSBOZWJ1bGEsIFBDVFYgYW5kIFR3aW5oYW4gRFNUIGNhcmRzIHdvcmtpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0xKSBHZW5lcmFsIGluZm9ybWF0aW9uCi09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGNsYXNzIG9mIGNhcmRzIGhhcyBhIGJ0ODc4YSBhcyB0aGUgUENJIGludGVyZmFjZSwgYW5kCityZXF1aXJlIHRoZSBidHR2IGRyaXZlci4KIAotVGhpcyBjbGFzcyBvZiBjYXJkcyBoYXMgYSBidDg3OGEgY2hpcCBhcyB0aGUgUENJIGludGVyZmFjZS4KLVRoZSBkaWZmZXJlbnQgY2FyZCBkcml2ZXJzIHJlcXVpcmUgdGhlIGJ0dHYgZHJpdmVyIHRvIHByb3ZpZGUgdGhlIG1lYW5zCi10byBhY2Nlc3MgdGhlIGkyYyBidXMgYW5kIHRoZSBncGlvIHBpbnMgb2YgdGhlIGJ0OHh4IGNoaXBzZXQuCitQbGVhc2UgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgd2FybmluZyBhYm91dCB0aGUgYnR0diBtb2R1bGUKK29wdGlvbnMgYmVsb3cgZm9yIHRoZSBEU1QgY2FyZC4KIAotMikgQ29tcGlsYXRpb24gcnVsZXMgZm9yIEtlcm5lbCA+PSAyLjYuMTIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisxKSBHZW5lcmFsIGluZm9ybWF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT0KIAotRW5hYmxlIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK1RoZXNlIGRyaXZlcnMgcmVxdWlyZSB0aGUgYnR0diBkcml2ZXIgdG8gcHJvdmlkZSB0aGUgbWVhbnMgdG8gYWNjZXNzCit0aGUgaTJjIGJ1cyBhbmQgdGhlIGdwaW8gcGlucyBvZiB0aGUgYnQ4eHggY2hpcHNldC4KIAorQmVjYXVzZSBvZiB0aGlzLCB5b3UgbmVlZCB0byBlbmFibGUKICJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIKLSA9PiAiVmlkZW8gRm9yIExpbnV4IiA9PiAiQlQ4NDggVmlkZW8gRm9yIExpbnV4IgotIkRldmljZSBkcml2ZXJzIiA9PiAiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcyIKLSA9PiAiRFZCIGZvciBMaW51eCIgIkRWQiBDb3JlIFN1cHBvcnQiICJOZWJ1bGEvUGlubmFjbGUgUENUVi9Ud2luSGFuIFBDSSBDYXJkcyIKKyAgPT4gIlZpZGVvIEZvciBMaW51eCIgPT4gIkJUODQ4IFZpZGVvIEZvciBMaW51eCIKIAotMykgTG9hZGluZyBNb2R1bGVzLCBkZXNjcmliZWQgYnkgdHdvIGFwcHJvYWNoZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitGdXJ0aGVybW9yZSB5b3UgbmVlZCB0byBlbmFibGUKKyJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkRpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMiCisgID0+ICJEVkIgZm9yIExpbnV4IiAiRFZCIENvcmUgU3VwcG9ydCIgIkJUOHh4IGJhc2VkIFBDSSBjYXJkcyIKKworMikgTG9hZGluZyBNb2R1bGVzCis9PT09PT09PT09PT09PT09PT0KIAogSW4gZ2VuZXJhbCB5b3UgbmVlZCB0byBsb2FkIHRoZSBidHR2IGRyaXZlciwgd2hpY2ggd2lsbCBoYW5kbGUgdGhlIGdwaW8gYW5kCi1pMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlciwKLXdoaWNoIGlzIGNhbGxlZCB0aGUgYmFja2VuZC4KLVRoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSBEaWdpVFYgKG54dDYwMDApLCBQaW5uYWNsZSBQQ1RWIFNhdCAoY3gyNDExMCksCi1Ud2luSGFuIERTVCArIGNsb25lcyAoZHN0IGFuZCBkc3QtY2EpIGFyZSBsb2FkZWQgYXV0b21hdGljYWxseSBieSB0aGUgYmFja2VuZC4KLUZvciBmdXJ0aGVyIGRldGFpbHMgYWJvdXQgVHdpbkhhbiBEU1QgKyBjbG9uZXMgc2VlIC9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQuCitpMmMgY29tbXVuaWNhdGlvbiBmb3IgdXMsIHBsdXMgdGhlIGNvbW1vbiBkdmItYnQ4eHggZGV2aWNlIGRyaXZlci4KK1RoZSBmcm9udGVuZHMgZm9yIE5lYnVsYSAobnh0NjAwMCksIFBpbm5hY2xlIFBDVFYgKGN4MjQxMTApIGFuZAorVHdpbkhhbiAoZHN0KSBhcmUgbG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGR2Yi1idDh4eCBkZXZpY2UgZHJpdmVyLgogCi0zYSkgVGhlIG1hbnVhbCBhcHByb2FjaAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTG9hZGluZyBtb2R1bGVzOgotbW9kcHJvYmUgYnR0dgotbW9kcHJvYmUgZHZiLWJ0OHh4Ci0KLVVubG9hZGluZyBtb2R1bGVzOgotbW9kcHJvYmUgLXIgZHZiLWJ0OHh4Ci1tb2Rwcm9iZSAtciBidHR2Ci0KLTNiKSBUaGUgYXV0b21hdGljIGFwcHJvYWNoCiszYSkgTmVidWxhIC8gUGlubmFjbGUgUENUVgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSWYgbm90IGFscmVhZHkgZG9uZSBieSBpbnN0YWxsYXRpb24sIHBsYWNlIGEgbGluZSBlaXRoZXIgaW4KLS9ldGMvbW9kdWxlcy5jb25mIG9yIGluIC9ldGMvbW9kcHJvYmUuY29uZiBjb250YWluaW5nIHRoaXMgdGV4dDoKLWFsaWFzIGNoYXItbWFqb3ItODEJYnR0dgorICAgJCBtb2Rwcm9iZSBidHR2IChub3JtYWxseSBidHR2IGlzIGJlaW5nIGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IGttb2QpCisgICAkIG1vZHByb2JlIGR2Yi1idDh4eCAob3IganVzdCBwbGFjZSBkdmItYnQ4eHggaW4gL2V0Yy9tb2R1bGVzIGZvciBhdXRvbWF0aWMgbG9hZGluZykKIAotVGhlbiBwbGFjZSBhIGxpbmUgaW4gL2V0Yy9tb2R1bGVzIGNvbnRhaW5pbmcgdGhpcyB0ZXh0OgotZHZiLWJ0OHh4CiAKLVJlYm9vdCB5b3VyIHN5c3RlbSBhbmQgaGF2ZSBmdW4hCiszYikgVHdpbkhhbiBhbmQgQ2xvbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAkIG1vZHByb2JlIGJ0dHYgaTJjX2h3PTEgY2FyZD0weDcxCisgICAkIG1vZHByb2JlIGR2Yi1idDh4eAorICAgJCBtb2Rwcm9iZSBkc3QKKworVGhlIHZhbHVlIDB4NzEgd2lsbCBvdmVycmlkZSB0aGUgUENJIHR5cGUgZGV0ZWN0aW9uIGZvciBkdmItYnQ4eHgsCit3aGljaCAgaXMgbmVjZXNzYXJ5IGZvciBUd2luSGFuIGNhcmRzLgorCitJZiB5b3UncmUgaGF2aW5nIGFuIG9sZGVyIGNhcmQgKGJsdWUgY29sb3IgY2lyY3VpdCkgYW5kIGNhcmQ9MHg3MSBsb2NrcworeW91ciBtYWNoaW5lLCB0cnkgdXNpbmcgMHg2OCwgdG9vLiBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGFzayBvbiB0aGUKK21haWxpbmcgbGlzdC4KKworVGhlIERTVCBtb2R1bGUgdGFrZXMgYSBjb3VwbGUgb2YgdXNlZnVsIHBhcmFtZXRlcnMuCisKK3ZlcmJvc2UgdGFrZXMgdmFsdWVzIDAgdG8gNC4gVGhlc2UgdmFsdWVzIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSBsZXZlbCwKK2FuZCBjYW4gYmUgdXNlZCB0byBkZWJ1ZyBhbHNvLgorCit2ZXJib3NlPTAgbWVhbnMgY29tcGxldGUgZGlzYWJsaW5nIG9mIG1lc3NhZ2VzCisJMSBvbmx5IGVycm9yIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQKKwkyIG5vdGlmaWNhdGlvbnMgYXJlIGFsc28gZGlzcGxheWVkCisJMyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFyZSBhbHNvIGRpc3BsYXllZAorCTQgZGVidWcgc2V0dGluZworCitkc3RfYWRkb25zIHRha2VzIHZhbHVlcyAwIGFuZCAweDIwLiBBIHZhbHVlIG9mIDAgbWVhbnMgaXQgaXMgYSBGVEEgY2FyZC4KKzB4MjAgbWVhbnMgaXQgaGFzIGEgQ29uZGl0aW9uYWwgQWNjZXNzIHNsb3QuCisKK1RoZSBhdXRvZGVjdGVkIHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieXRoZSBjYXJkcyAncmVzcG9uc2UKK3N0cmluZycgd2hpY2ggeW91IGNhbiBzZWUgaW4geW91ciBsb2dzIGUuZy4KKworZHN0X2dldF9kZXZpY2VfaWQ6IFJlY29nbmlzZSBbRFNUTUNJXQorCiAKIC0tCi1BdXRob3JzOiBSaWNoYXJkIFdhbGtlciwgSmFtaWUgSG9uYW4sIE1pY2hhZWwgSHVub2xkLCBNYW51IEFicmFoYW0sIFV3ZSBCdWdsYQorQXV0aG9yczogUmljaGFyZCBXYWxrZXIsIEphbWllIEhvbmFuLCBNaWNoYWVsIEh1bm9sZCwgTWFudSBBYnJhaGFtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQKaW5kZXggNjJlMDcwMS4uOTVmMGU3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2NpLnR4dApAQCAtMjMsNyArMjMsNiBAQAogCSAgZWc6ICQgc3phcCAtYyBjaGFubmVscy5jb25mIC1yICJUTUMiIC14CiAKIAkoYikgYSBjaGFubmVscy5jb25mIGNvbnRhaW5pbmcgYSB2YWxpZCBQTVQgUElECi0KIAkgIGVnOiBUTUM6MTE5OTY6aDowOjI3NTAwOjI3ODo1MTI6NjUwOjMyMQogCiAJICBoZXJlIDI3OCBpcyBhIHZhbGlkIFBNVCBQSUQuIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIHRoZQpAQCAtMzEsMTMgKzMwLDcgQEAKIAogCShjKSBhZnRlciBydW5uaW5nIGEgc3phcCwgeW91IGhhdmUgdG8gcnVuIGNhX3phcCwgZm9yIHRoZQogCSAgZGVzY3JhbWJsZXIgdG8gZnVuY3Rpb24sCi0KLQkgIGVnOiAkIGNhX3phcCBwYXRjaGVkX2NoYW5uZWxzLmNvbmYgIlRNQyIKLQotCSAgVGhlIHBhdGNoZWQgbWVhbnMgYSBwYXRjaCB0byBhcHBseSB0byBzY2FuLCBzdWNoIHRoYXQgc2NhbiBjYW4KLQkgIGdlbmVyYXRlIGEgY2hhbm5lbHMuY29uZl93aXRoIHBtdCwgd2hpY2ggaGFzIHRoaXMgUE1UIFBJRCBpbmZvCi0JICAoTk9URTogc3phcCBjYW5ub3QgdXNlIHRoaXMgY2hhbm5lbHMuY29uZiB3aXRoIHRoZSBQTVRfUElEKQotCisJICBlZzogJCBjYV96YXAgY2hhbm5lbHMuY29uZiAiVE1DIgogCiAJKGQpIEhvcGVmbGx5IEVuam95IHlvdXIgZmF2b3VyaXRlIHN1YnNjcmliZWQgY2hhbm5lbCBhcyB5b3UgZG8gd2l0aAogCSAgYSBGVEEgY2FyZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXhjZXB0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZXhjZXB0aW9uLnR4dAppbmRleCBmMWQ0MzY5Li4zY2IzOWFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2V4Y2VwdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9leGNlcHRpb24udHh0CkBAIC03LDcgKzcsNyBAQAogCiBJbiBvbGRlciB2ZXJzaW9ucyBvZiBMaW51eCB0aGlzIHdhcyBkb25lIHdpdGggdGhlIAogaW50IHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKSAKLWZ1bmN0aW9uLgorZnVuY3Rpb24gKHdoaWNoIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KIAogVGhpcyBmdW5jdGlvbiB2ZXJpZmllZCB0aGF0IHRoZSBtZW1vcnkgYXJlYSBzdGFydGluZyBhdCBhZGRyZXNzIAogYWRkciBhbmQgb2Ygc2l6ZSBzaXplIHdhcyBhY2Nlc3NpYmxlIGZvciB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZCAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9idWdzIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2J1Z3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwY2M2NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9idWdzCkBAIC0wLDAgKzEsMTQgQEAKK0J1Z3MKKz09PT0KKworSSBjdXJyZW50bHkgZG9uJ3Qga25vdyBvZiBhbnkgYnVnLiBQbGVhc2UgZG8gc2VuZCByZXBvcnRzIHRvOgorIC0gbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CisgLSBLbnV0X1BldGVyc2VuQHQtb25saW5lLmRlLgorCisKK1VudGVzdGVkIGZlYXR1cmVzCis9PT09PT09PT09PT09PT09PQorCitBbGwgTENEIHN0dWZmIGlzIHVudGVzdGVkLiBJZiBpdCB3b3JrZWQgaW4gdHJpZGVudGZiLCBpdCBzaG91bGQgd29yayBpbgorY3libGFmYi4gUGxlYXNlIHRlc3QgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cyB0byBLbnV0X1BldGVyc2VuQHQtb25saW5lLmRlLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvY3JlZGl0cyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9jcmVkaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjNiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvY3JlZGl0cwpAQCAtMCwwICsxLDcgQEAKK1RoYW5rcyB0bworPT09PT09PT09CisgICAqIAlBbGFuIEhvdXJpaGFuZSwgZm9yIHdyaXRpbmcgdGhlIFggdHJpZGVudCBkcml2ZXIKKyAgICoJSmFuaSBNb25vc2VzLCBmb3Igd3JpdGluZyB0aGUgdHJpZGVudGZiIGRyaXZlcgorICAgKglBbnRvbmlubyBBLiBEYXBsYXMsIGZvciByZXZpZXcgb2YgdGhlIGZpcnN0IHB1Ymxpc2hlZAorCXZlcnNpb24gb2YgY3libGFmYiBhbmQgc29tZSBjb2RlCisgICAqCUpvY2hlbiBIZWluLCBmb3IgdGVzdGluZyBhbmQgYSBoZWxwZnVsbCBidWcgcmVwb3J0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvZG9jdW1lbnRhdGlvbiBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9kb2N1bWVudGF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWFhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvZG9jdW1lbnRhdGlvbgpAQCAtMCwwICsxLDE3IEBACitBdmFpbGFibGUgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT0KKworQXBvbGxvIFBMRSAxMzMgQ2hpcHNldCBWVDg2MDFBIE5vcnRoIEJyaWRnZSBEYXRhc2hlZXQsIFJldi4gMS44MiwgT2N0b2JlciAyMiwKKzIwMDEsIGF2YWlsYWJsZSBmcm9tIFZJQToKKworCWh0dHA6Ly93d3cudmlhdnBzZC5jb20vcHJvZHVjdC82LzE1L0RTODYwMUExODIucGRmCisKK1RoZSBkYXRhc2hlZXQgaXMgaW5jb21wbGV0ZSwgc29tZSByZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIHByb2dyYW1tZWQgYXJlIG5vdAorZXhwbGFpbmVkIGF0IGFsbCBhbmQgaW1wb3J0YW50IGJpdHMgYXJlIGxpc3RlZCBhcyAicmVzZXJ2ZWQiLiBCdXQgeW91IHJlYWxseQorbmVlZCB0aGUgZGF0YXNoZWV0IHRvIHVuZGVyc3RhbmQgdGhlIGNvZGUuICAicC4geHh4IiBjb21tZW50cyByZWZlciB0byBwYWdlCitudW1iZXJzIG9mIHRoaXMgZG9jdW1lbnQuCisKK1hGcmVlL1hPcmcgZHJpdmVycyBhcmUgYXZhaWxhYmxlIGFuZCBvZiBnb29kIHF1YWxpdHksIGxvb2tpbmcgYXQgdGhlIGNvZGUKK3RoZXJlIGlzIGEgZ29vZCBpZGVhIGlmIHRoZSBkYXRhc2hlZXQgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24KK29yIGlmIHRoZSBkYXRhc2hlZXQgc2VlbXMgdG8gYmUgd3JvbmcuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9mYi5tb2RlcyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9mYi5tb2RlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQzNTFmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2ZiLm1vZGVzCkBAIC0wLDAgKzEsMTU1IEBACisjCisjICAgU2FtcGxlIGZiLm1vZGVzIGZpbGUKKyMKKyMJUHJvdmlkZXMgYW4gaW5jb21wbGV0ZSBsaXN0IG9mIHdvcmtpbmcgbW9kZXMgZm9yCisjCXRoZSBjeWJlcmJsYWRlL2kxIGdyYXBoaWNzIGNvcmUuCisjCisjCVRoZSB2YWx1ZSA0Mjk0OTY3MjU2IGlzIHVzZWQgaW5zdGVhZCBvZiAtNDAuIE9mIGNvdXJzZSwgLTQwIGlzIG5vdAorIwlhIHJlYWxseSByZWFzb25hYmxlIHZhbHVlLCBidXQgY2hpcCBkZXNpZ24gZG9lcyBub3QgYWx3YXlzIGZvbGxvdworIwlsb2dpYy4gQmVsaWV2ZSBtZSwgaXQncyBvaywgYW5kIGl0J3MgdGhlIHdheSB0aGUgQklPUyBkb2VzIGl0LgorIworIwlmYnNldCByZXF1aXJlcyA0Mjk0OTY3MjU2IGluIGZiLm1vZGVzIGFuZCAtNDAgYXMgYW4gYXJndW1lbnQgdG8KKyMJdGhlIC10IHBhcmFtZXRlci4gVGhhdCdzIGFsc28gbm90IHRvbyByZWFzb25hYmxlLCBhbmQgaXQgbWlnaHQgY2hhbmdlCisjCWluIHRoZSBmdXR1cmUgb3IgbWlnaHQgZXZlbiBiZSBkaWZmZXJ0IGZvciB5b3VyIGN1cnJlbnQgdmVyc2lvbi4KKyMKKworbW9kZSAiNjQweDQ4MC01MCIKKyAgICBnZW9tZXRyeSA2NDAgNDgwIDY0MCAzNzU2IDgKKyAgICB0aW1pbmdzIDQ3NjE5IDQyOTQ5NjcyNTYgMjQgMTcgMCAyMTYgMworZW5kbW9kZQorCittb2RlICI2NDB4NDgwLTYwIgorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDM3NTYgOAorICAgIHRpbWluZ3MgMzk2ODIgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCitlbmRtb2RlCisKK21vZGUgIjY0MHg0ODAtNzAiCisgICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgdGltaW5ncyAzNDAxMyA0Mjk0OTY3MjU2IDI0IDE3IDAgMjE2IDMKK2VuZG1vZGUKKworbW9kZSAiNjQweDQ4MC03MiIKKyAgICBnZW9tZXRyeSA2NDAgNDgwIDY0MCAzNzU2IDgKKyAgICB0aW1pbmdzIDMzMDY4IDQyOTQ5NjcyNTYgMjQgMTcgMCAyMTYgMworZW5kbW9kZQorCittb2RlICI2NDB4NDgwLTc1IgorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDM3NTYgOAorICAgIHRpbWluZ3MgMzE3NDYgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCitlbmRtb2RlCisKK21vZGUgIjY0MHg0ODAtODAiCisgICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgdGltaW5ncyAyOTc2MSA0Mjk0OTY3MjU2IDI0IDE3IDAgMjE2IDMKK2VuZG1vZGUKKworbW9kZSAiNjQweDQ4MC04NSIKKyAgICBnZW9tZXRyeSA2NDAgNDgwIDY0MCAzNzU2IDgKKyAgICB0aW1pbmdzIDI4MDExIDQyOTQ5NjcyNTYgMjQgMTcgMCAyMTYgMworZW5kbW9kZQorCittb2RlICI4MDB4NjAwLTUwIgorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIHRpbWluZ3MgMzAzMDMgOTYgMjQgMTQgMCAxMzYgMTEKK2VuZG1vZGUKKworbW9kZSAiODAweDYwMC02MCIKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCAzMjIxIDgKKyAgICB0aW1pbmdzIDI1MjUyIDk2IDI0IDE0IDAgMTM2IDExCitlbmRtb2RlCisKK21vZGUgIjgwMHg2MDAtNzAiCisgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgdGltaW5ncyAyMTY0NSA5NiAyNCAxNCAwIDEzNiAxMQorZW5kbW9kZQorCittb2RlICI4MDB4NjAwLTcyIgorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIHRpbWluZ3MgMjEwNDMgOTYgMjQgMTQgMCAxMzYgMTEKK2VuZG1vZGUKKworbW9kZSAiODAweDYwMC03NSIKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCAzMjIxIDgKKyAgICB0aW1pbmdzIDIwMjAyIDk2IDI0IDE0IDAgMTM2IDExCitlbmRtb2RlCisKK21vZGUgIjgwMHg2MDAtODAiCisgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgdGltaW5ncyAxODkzOSA5NiAyNCAxNCAwIDEzNiAxMQorZW5kbW9kZQorCittb2RlICI4MDB4NjAwLTg1IgorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIHRpbWluZ3MgMTc4MjUgOTYgMjQgMTQgMCAxMzYgMTEKK2VuZG1vZGUKKworbW9kZSAiMTAyNHg3NjgtNTAiCisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICB0aW1pbmdzIDE5MDU0IDE0NCAyNCAyOSAwIDEyMCAzCitlbmRtb2RlCisKK21vZGUgIjEwMjR4NzY4LTYwIgorICAgIGdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgMjgxNSA4CisgICAgdGltaW5ncyAxNTg4MCAxNDQgMjQgMjkgMCAxMjAgMworZW5kbW9kZQorCittb2RlICIxMDI0eDc2OC03MCIKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAxMDI0IDI4MTUgOAorICAgIHRpbWluZ3MgMTM2MTAgMTQ0IDI0IDI5IDAgMTIwIDMKK2VuZG1vZGUKKworbW9kZSAiMTAyNHg3NjgtNzIiCisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICB0aW1pbmdzIDEzMjMyIDE0NCAyNCAyOSAwIDEyMCAzCitlbmRtb2RlCisKK21vZGUgIjEwMjR4NzY4LTc1IgorICAgIGdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgMjgxNSA4CisgICAgdGltaW5ncyAxMjcwMyAxNDQgMjQgMjkgMCAxMjAgMworZW5kbW9kZQorCittb2RlICIxMDI0eDc2OC04MCIKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAxMDI0IDI4MTUgOAorICAgIHRpbWluZ3MgMTE5MTAgMTQ0IDI0IDI5IDAgMTIwIDMKK2VuZG1vZGUKKworbW9kZSAiMTAyNHg3NjgtODUiCisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICB0aW1pbmdzIDExMjA5IDE0NCAyNCAyOSAwIDEyMCAzCitlbmRtb2RlCisKK21vZGUgIjEyODB4MTAyNC01MCIKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICB0aW1pbmdzIDExMTE0IDIzMiAxNiAzOSAwIDE2MCAzCitlbmRtb2RlCisKK21vZGUgIjEyODB4MTAyNC02MCIKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICB0aW1pbmdzIDkyNjIgMjMyIDE2IDM5IDAgMTYwIDMKK2VuZG1vZGUKKworbW9kZSAiMTI4MHgxMDI0LTcwIgorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIHRpbWluZ3MgNzkzOSAyMzIgMTYgMzkgMCAxNjAgMworZW5kbW9kZQorCittb2RlICIxMjgweDEwMjQtNzIiCisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMjY2MiA4CisgICAgdGltaW5ncyA3NzE5IDIzMiAxNiAzOSAwIDE2MCAzCitlbmRtb2RlCisKK21vZGUgIjEyODB4MTAyNC03NSIKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICB0aW1pbmdzIDc0MTAgMjMyIDE2IDM5IDAgMTYwIDMKK2VuZG1vZGUKKworbW9kZSAiMTI4MHgxMDI0LTgwIgorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIHRpbWluZ3MgNjk0NiAyMzIgMTYgMzkgMCAxNjAgMworZW5kbW9kZQorCittb2RlICIxMjgweDEwMjQtODUiCisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMjY2MiA4CisgICAgdGltaW5ncyA2NTM4IDIzMiAxNiAzOSAwIDE2MCAzCitlbmRtb2RlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9wZXJmb3JtYW5jZSBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9wZXJmb3JtYW5jZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRlNDdhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3BlcmZvcm1hbmNlCkBAIC0wLDAgKzEsODAgQEAKK1NwZWVkCis9PT09PQorCitDeUJsYUZCIGlzIG11Y2ggZmFzdGVyIHRoYW4gdHJpZGVudGZiIGFuZCB2ZXNhZmIuIENvbXBhcmUgdGhlIHBlcmZvcm1hbmNlIGRhdGEKK2ZvciBtb2RlIDEyODB4MTAyNC1bOCwxNiwzMl1ANjEgSHouCisKK1Rlc3QgMTogQ2F0IGEgZmlsZSB3aXRoIDIwMDAgbGluZXMgb2YgMCBjaGFyYWN0ZXJzLgorVGVzdCAyOiBDYXQgYSBmaWxlIHdpdGggMjAwMCBsaW5lcyBvZiA4MCBjaGFyYWN0ZXJzLgorVGVzdCAzOiBDYXQgYSBmaWxlIHdpdGggMjAwMCBsaW5lcyBvZiAxNjAgY2hhcmFjdGVycy4KKworQWxsIHZhbHVlcyBzaG93IHN5c3RlbSB0aW1lIHVzZSBpbiBzZWNvbmRzLCBrZXJuZWwgMi42LjEyIHdhcyB1c2VkIGZvcgordGhlIG1lYXN1cmVtZW50cy4gMi42LjEzIGlzIGEgYml0IHNsb3dlciwgMi42LjE0IGhvcGVmdWxseSB3aWxsIGluY2x1ZGUgYQorcGF0Y2ggdGhhdCBzcGVlZHMgdXAga2VybmVsIGJpdGJsaXR0aW5nIGEgbG90ICggPiAyMCUpLgorCisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8CSAgICB8CQkJbm90IGFjY2VsZXJhdGVkIAkJICB8Cit8IFRSSURFTlRGQiArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCit8IG9mIDIuNi4xMiB8CSAgIDggYnBwICAgICAgfCAgICAgMTYgYnBwCXwgICAgIDMyIGJwcAkgIHwKK3wJICAgIHwgbm95cGFuIHwJIHlwYW4gfCBub3lwYW4gfCAgIHlwYW4gfCBub3lwYW4gfCAgIHlwYW4gfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfCAgICBUZXN0IDEgfAk0LjMxIHwJIDQuMzMgfCAgIDYuMDUgfCAgMTIuODEgfCAgLS0tLSAgfCAgLS0tLSAgfAorfCAgICBUZXN0IDIgfCAgNjcuOTQgfAkgNS40NCB8IDEyMy4xNiB8ICAxNC43OSB8ICAtLS0tICB8ICAtLS0tICB8Cit8ICAgIFRlc3QgMyB8IDEzMS4zNiB8CSA2LjU1IHwgMjQwLjEyIHwgIDE2Ljc2IHwgIC0tLS0gIHwgIC0tLS0gIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wgIENvbW1lbnRzIHwJCSAgICAgIHwgCQl8IGNvbXBsZXRlbHkgYnJvLSB8Cit8CSAgICB8CQkgICAgICB8IAkJfCBrZW4sIG1vbml0b3IJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfCBzd2l0Y2hlcyBvZmYJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkgICAgfAkJCSAgYWNjZWxlcmF0ZWQJCQkgIHwKK3wgVFJJREVOVEZCICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKK3wgb2YgMi42LjEyIHwJICAgOCBicHAgICAgICB8ICAgICAxNiBicHAJfCAgICAgMzIgYnBwCSAgfAorfAkgICAgfCBub3lwYW4gfAkgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICAgIFRlc3QgMSB8ICAtLS0tICB8CS0tLS0gIHwgIDIwLjYyIHwgICAxLjIyIHwgIC0tLS0gIHwgIC0tLS0gIHwKK3wgICAgVGVzdCAyIHwgIC0tLS0gIHwJLS0tLSAgfCAgMjIuNjEgfCAgIDMuMTkgfCAgLS0tLSAgfCAgLS0tLSAgfAorfCAgICBUZXN0IDMgfCAgLS0tLSAgfAktLS0tICB8ICAyNC41OSB8ICAgNS4xNiB8ICAtLS0tICB8ICAtLS0tICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICBDb21tZW50cyB8IGJyb2tlbiwgd3JpdGluZyB8IGJyb2tlbiwgb2sgb25seSB8IGNvbXBsZXRlbHkgYnJvLSB8Cit8CSAgICB8IHRvIHdyb25nIHBsYWNlcyB8IGlmIGJnY29sb3IgaXMJfCBrZW4sIG1vbml0b3IJICB8Cit8CSAgICB8IG9uIHNjcmVlbiArIGJ1ZyB8IGJsYWNrLCBidWcgaW4JfCBzd2l0Y2hlcyBvZmYJICB8Cit8CSAgICB8IGluIGZpbGxyZWN0KCkgICB8IGZpbGxyZWN0KCkJfAkJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkgICAgfAkJCW5vdCBhY2NlbGVyYXRlZCAJCSAgfAorfCAgIFZFU0FGQiAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKworfCBvZiAyLjYuMTIgfAkgICA4IGJwcCAgICAgIHwgICAgIDE2IGJwcAl8ICAgICAzMiBicHAJICB8Cit8CSAgICB8IG5veXBhbiB8CSB5cGFuIHwgbm95cGFuIHwgICB5cGFuIHwgbm95cGFuIHwgICB5cGFuIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wgICAgVGVzdCAxIHwJNC4yNiB8CSAzLjc2IHwgICA1Ljk5IHwgICA3LjIzIHwgIC0tLS0gIHwgIC0tLS0gIHwKK3wgICAgVGVzdCAyIHwgIDY1LjY1IHwJIDQuODkgfCAxMjAuODggfCAgIDkuMDggfCAgLS0tLSAgfCAgLS0tLSAgfAorfCAgICBUZXN0IDMgfCAxMjYuOTEgfAkgNS45NCB8IDIzNS43NyB8ICAxMS4wMyB8ICAtLS0tICB8ICAtLS0tICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICBDb21tZW50cyB8IHZnYT0weDMwNyAgICAgICB8IHZnYT0weDMxYQl8IHZnYT0weDMxYiBub3QgICB8Cit8CSAgICB8IGZoPTgwa0h6CSAgICAgIHwgZmg9ODBrSHoJfCBzdXBwb3J0ZWQgYnkJICB8Cit8CSAgICB8IGZ2PTc1a0h6CSAgICAgIHwgZnY9NzVrSHoJfCB2aWRlbyBCSU9TIGFuZCAgfAorfAkgICAgfAkJICAgICAgfCAJCXwgaGFyZHdhcmUJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAkgICAgfAkJCSAgYWNjZWxlcmF0ZWQJCQkgIHwKK3wgIENZQkxBRkIgICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKK3wJICAgIHwJICAgOCBicHAgICAgICB8ICAgICAxNiBicHAJfCAgICAgMzIgYnBwCSAgfAorfAkgICAgfCBub3lwYW4gfAkgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8IG5veXBhbiB8ICAgeXBhbiB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICAgIFRlc3QgMSB8CTguMDIgfAkgMC4yMyB8ICAxOS4wNCB8ICAgMC42MSB8ICA1Ny4xMiB8ICAgMi43NCB8Cit8ICAgIFRlc3QgMiB8CTguMzggfAkgMC41NSB8ICAxOS4zOSB8ICAgMC45MiB8ICA1Ny41NCB8ICAgMy4xMyB8Cit8ICAgIFRlc3QgMyB8CTguNzMgfAkgMC44NiB8ICAxOS43NCB8ICAgMS4yNCB8ICA1Ny45NSB8ICAgMy41MSB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8ICBDb21tZW50cyB8CQkgICAgICB8IAkJfAkJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfAkJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfAkJICB8Cit8CSAgICB8CQkgICAgICB8IAkJfAkJICB8CisrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi90b2RvIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3RvZG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmYjJmOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi90b2RvCkBAIC0wLDAgKzEsMzIgQEAKK1RPRE8gLyBNaXNzaW5nIGZlYXR1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PQorCitWZXJpZnkgTENEIHN0dWZmCQkic3RyZXRjaCIgYW5kICJjZW50ZXIiIG9wdGlvbnMgYXJlCisJCQkJY29tcGxldGVseSB1bnRlc3RlZCAuLi4gdGhpcyBjb2RlIG5lZWRzIHRvIGJlCisJCQkJdmVyaWZpZWQuIEFzIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gc3VjaAorCQkJCWhhcmR3YXJlLCBwbGVhc2UgY29udGFjdCBtZSBpZiB5b3UgYXJlCisJCQkJd2lsbGluZyBydW4gc29tZSB0ZXN0cy4KKworSW50ZXJsYWNlZCB2aWRlbyBtb2RlcwkJVGhlIHJlYXNvbiB0aGF0IGludGVybGVhdmVkCisJCQkJbW9kZXMgYXJlIGRpc2FibGVkIGlzIHRoYXQgSSBkbyBub3Qga25vdworCQkJCXRoZSBtZWFuaW5nIG9mIHRoZSB2ZXJ0aWNhbCBpbnRlcmxhY2UKKwkJCQlwYXJhbWV0ZXIuIEFsc28gdGhlIGRhdGFzaGVldCBtZW50aW9ucyBhCisJCQkJYml0IGQ4IG9mIGEgaG9yaXpvbnRhbCBpbnRlcmxhY2UgcGFyYW1ldGVyLAorCQkJCWJ1dCBub3doZXJlIHRoZSBsb3dlciA4IGJpdHMuIFBsZWFzZSBoZWxwCisJCQkJaWYgeW91IGNhbi4KKworbG93LXJlcyBkb3VibGUgc2NhbiBtb2RlcwlXaG8gbmVlZHMgaXQ/CisKK2FjY2VsZXJhdGVkIGNvbG9yIGJsaXR0aW5nCVdobyBuZWVkcyBpdD8gVGhlIGNvbnNvbGUgZHJpdmVyIGRvZXMgdXNlIGNvbG9yCisJCQkJYmxpdHRpbmcgZm9yIG5vdGhpbmcgYnV0IGRyYXdpbmcgdGhlIHBlbmd1aW5lLAorCQkJCWV2ZXJ5dGhpbmcgZWxzZSBpcyBkb25lIHVzaW5nIGNvbG9yIGV4cGFuZGluZworCQkJCWJsaXR0aW5nIG9mIDFicHAgY2hhcmFjdGVyIGJpdG1hcHMuCisKK3hwYW5uaW5nCQkJV2hvIG5lZWRzIGl0PworCitpb2N0bHMJCQkJV2hvIG5lZWRzIGl0PworCitUVi1vdXQJCQkJV2lsbCBiZSBkb25lIGxhdGVyCisKKz8/PwkJCQlGZWVsIGZyZWUgdG8gY29udGFjdCBtZSBpZiB5b3UgaGF2ZSBhbnkKKwkJCQlmZWF0dXJlIHJlcXVlc3RzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdXNhZ2UgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdXNhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyN2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi91c2FnZQpAQCAtMCwwICsxLDIwNiBAQAorQ3lCbGFGQiBpcyBhIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgdGhlIEN5YmVyYmxhZGUvaTEgZ3JhcGhpY3MgY29yZSBpbnRlZ3JhdGVkCitpbnRvIHRoZSBWSUEgQXBvbGxvIFBMRTEzMyAoYWthIHZ0ODYwMSkgc291dGggYnJpZGdlLiBJdCBpcyBkZXZlbG9wZWQgYW5kCit0ZXN0ZWQgdXNpbmcgYSBWSUEgRVBJQSA1MDAwIGJvYXJkLgorCitDeWJsYWZiIC0gY29tcGlsZWQgaW50byB0aGUga2VybmVsIG9yIGFzIGEgbW9kdWxlPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IG1pZ2h0IGNvbXBpbGUgY3libGFmYiBlaXRoZXIgYXMgYSBtb2R1bGUgb3IgY29tcGlsZSBpdCBwZXJtYW5lbnRseSBpbnRvIHRoZQora2VybmVsLgorCitVbmxlc3MgeW91IGhhdmUgYSByZWFsIHJlYXNvbiB0byBkbyBzbyB5b3Ugc2hvdWxkIG5vdCBjb21waWxlIGJvdGggdmVzYWZiIGFuZAorY3libGFmYiBwZXJtYW5lbnRseSBpbnRvIHRoZSBrZXJuZWwuIEl0J3MgcG9zc2libGUgYW5kIGl0IGhlbHBzIGR1cmluZyB0aGUKK2RldmVsb3BlbWVudCBjeWNsZSwgYnV0IGl0J3MgdXNlbGVzcyBhbmQgd2lsbCBhdCBsZWFzdCBibG9jayBzb21lIG90aGVyd2lzZQordXNlZnVsbCBtZW1vcnkgZm9yIG9yZGluYXJ5IHVzZXJzLgorCitTZWxlY3RpbmcgTW9kZXMKKz09PT09PT09PT09PT09PQorCisJU3RhcnR1cCBNb2RlCisJPT09PT09PT09PT09CisKKwlGaXJzdCBvZiBhbGwsIHlvdSBtaWdodCB1c2UgdGhlICJ2Z2E9Pz8/IiBib290IHBhcmFtZXRlciBhcyBpdCBpcworCWRvY3VtZW50ZWQgaW4gdmVzYWZiLnR4dCBhbmQgc3ZnYS50eHQuIEN5YmxhZmIgd2lsbCBkZXRlY3QgdGhlIHZpZGVvCisJbW9kZSBzZWxlY3RlZCBhbmQgd2lsbCB1c2UgdGhlIGdlb21ldHJ5IGFuZCB0aW1pbmdzIGZvdW5kIGJ5CisJaW5zcGVjdGluZyB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLgorCisJCXZpZGVvPWN5YmxhZmIgdmdhPTB4MzE3CisKKwlBbHRlcm5hdGl2ZWx5IHlvdSBtaWdodCB1c2UgYSBjb21iaW5hdGlvbiBvZiB0aGUgbW9kZSwgcmVmIGFuZCBicHAKKwlwYXJhbWV0ZXJzLiBJZiB5b3UgY29tcGlsZWQgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIGFkZCBzb21ldGhpbmcKKwlsaWtlIHRoaXMgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmU6CisKKwkJdmlkZW89Y3libGFmYjoxMjgweDEwMjQsYnBwPTE2LHJlZj01MCAuLi4KKworCUlmIHlvdSBjb21waWxlZCB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCB0aGUgc2FtZSBtb2RlIHdvdWxkIGJlCisJc2VsZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJCW1vZHByb2JlIGN5YmxhZmIgbW9kZT0xMjgweDEwMjQgYnBwPTE2IHJlZj01MCAuLi4KKworCU5vbmUgb2YgdGhlIG1vZGVzIHBvc3NpYmxlIHRvIHNlbGVjdCBhcyBzdGFydHVwIG1vZGVzIGFyZSBhZmZlY3RlZCBieQorCXRoZSBwcm9ibGVtcyBkZXNjcmliZWQgYXQgdGhlIGVuZCBvZiB0aGUgbmV4dCBzdWJzZWN0aW9uLgorCisJTW9kZSBjaGFuZ2VzIHVzaW5nIGZic2V0CisJPT09PT09PT09PT09PT09PT09PT09PT09CisKKwlZb3UgbWlnaHQgdXNlIGZic2V0IHRvIGNoYW5nZSB0aGUgdmlkZW8gbW9kZSwgc2VlICJtYW4gZmJzZXQiLiBDeWJsYWZiCisJZ2VuZXJhbGx5IGRvZXMgYXNzdW1lIHRoYXQgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdXQgaXQgZG9lcworCXNvbWUgY2hlY2tzLCBlc3BlY2lhbGx5IHRob3NlIHRoYXQgYXJlIG5lZWRlZCB0byBwcmV2ZW50IHlvdSBmcm9tCisJZGFtYWdpbmcgeW91ciBoYXJkd2FyZS4KKworCQktIG9ubHkgOCwgMTYsIDI0IGFuZCAzMiBicHAgdmlkZW8gbW9kZXMgYXJlIGFjY2VwdGVkCisJCS0gaW50ZXJsYWNlZCB2aWRlbyBtb2RlcyBhcmUgbm90IGFjY2VwdGVkCisJCS0gZG91YmxlIHNjYW4gdmlkZW8gbW9kZXMgYXJlIG5vdCBhY2NlcHRlZAorCQktIGlmIGEgZmxhdCBwYW5lbCBpcyBmb3VuZCwgY3libGFmYiBkb2VzIG5vdCBhbGxvdyB5b3UKKwkJICB0byBwcm9ncmFtIGEgcmVzb2x1dGlvbiBoaWdoZXIgdGhhbiB0aGUgcGh5c2ljYWwKKwkJICByZXNvbHV0aW9uIG9mIHRoZSBmbGF0IHBhbmVsIG1vbml0b3IKKwkJLSBjeWJsYWZiIGRvZXMgbm90IGFsbG93IHhyZXMgdG8gZGlmZmVyIGZyb20geHJlc192aXJ0dWFsCisJCS0gY3libGFmYiBkb2VzIG5vdCBhbGxvdyB2Y2xrIHRvIGV4Y2VlZCAyMzAgTUh6LiBBcyAzMiBicHAKKwkJICBhbmQgKGN1cnJlbnRseSkgMjQgYml0IG1vZGVzIHVzZSBhIGRvdWJsZWQgdmNsayBpbnRlcm5hbGx5LAorCQkgIHRoZSBkb3RjbG9jayBsaW1pdCBhcyBzZWVuIGJ5IGZic2V0IGlzIDExNSBNSHogZm9yIHRob3NlCisJCSAgbW9kZXMgYW5kIDIzMCBNSHogZm9yIDggYW5kIDE2IGJwcCBtb2Rlcy4KKworCUFueSByZXF1ZXN0IHRoYXQgdmlvbGF0ZXMgdGhlIHJ1bGVzIGdpdmVuIGFib3ZlIHdpbGwgYmUgaWdub3JlZCBhbmQKKwlmYnNldCB3aWxsIHJldHVybiBhbiBlcnJvci4KKworCUlmIHlvdSBwcm9ncmFtIGEgdmlydHVhbCB5IHJlc29sdXRpb24gaGlnaGVyIHRoYW4gdGhlIGhhcmR3YXJlIGxpbWl0LAorCWN5YmxhZmIgd2lsbCBzaWxlbnRseSBkZWNyZWFzZSB0aGF0IHZhbHVlIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlCisJdmFsdWUuCisKKwlBdHRlbXB0cyB0byBkaXNhYmxlIGFjY2VsZXJhdGlvbiBhcmUgaWdub3JlZC4KKworCVNvbWUgdmlkZW8gbW9kZXMgdGhhdCBzaG91bGQgd29yayBkbyBub3Qgd29yayBhcyBleHBlY3RlZC4gSWYgeW91IHVzZQorCXRoZSBzdGFuZGFyZCBmYi5tb2RlcywgZmJzZXQgNjQweDQ4MC02MCB3aWxsIHByb2dyYW0gdGhhdCBtb2RlLCBidXQKKwl5b3Ugd2lsbCBzZWUgYSB2ZXJ0aWNhbCBhcmVhLCBhYm91dCB0d28gY2hhcmFjdGVycyB3aWRlLCB3aXRoIG9ubHkKKwltdWNoIGRhcmtlciBjaGFyYWN0ZXJzIHRoYW4gdGhlIG90aGVyIGNoYXJhY3RlcnMgb24gdGhlIHNjcmVlbi4KKwlDeWJsYWZiIGRvZXMgYWxsb3cgdGhhdCBtb2RlIHRvIGJlIHNldCwgYXMgaXQgZG9lcyBub3QgdmlvbGF0ZSB0aGUKKwlvZmZpY2lhbCBzcGVjaWZpY2F0aW9ucy4gSXQgd291bGQgbmVlZCBhIGxvdCBvZiBjb2RlIHRvIHJlbGlhYmx5IHNvcnQKKwlvdXQgYWxsIGludmFsaWQgbW9kZXMsIHBsYXlpbmcgYXJvdW5kIHdpdGggdGhlIG1hcmdpbiB2YWx1ZXMgd2lsbAorCWdpdmUgYSB2YWxpZCBtb2RlIHF1aWNrbHkuIEFuZCBpZiBjeWJsYWZiIHdvdWxkIGRldGVjdCBzdWNoIGFuIGludmFsaWQKKwltb2RlLCBzaG91bGQgaXQgc2lsZW50bHkgYWx0ZXIgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb3Igc2hvdWxkIGl0CisJcmVwb3J0IGFuIGVycm9yPyBCb3RoIG9wdGlvbnMgaGF2ZSBzb21lIHByb3MgYW5kIGNvbnMuIEFzIHN0YXRlZAorCWFib3ZlLCBub25lIG9mIHRoZSBzdGFydHVwIG1vZGVzIGFyZSBhZmZlY3RlZCwgYW5kIGlmIHlvdSBzZXQKKwl2ZXJib3NpdHkgdG8gMSBvciBoaWdoZXIsIGN5YmxhZmIgd2lsbCBwcmludCB0aGUgZmJzZXQgY29tbWFuZCB0aGF0CisJd291bGQgYmUgbmVlZGVkIHRvIHByb2dyYW0gdGhhdCBtb2RlIHVzaW5nIGZic2V0LgorCisKK090aGVyIFBhcmFtZXRlcnMKKz09PT09PT09PT09PT09PT0KKworCitjcnQJCWRvbid0IGF1dG9kZXRlY3QsIGFzc3VtZSBtb25pdG9yIGNvbm5lY3RlZCB0bworCQlzdGFuZGFyZCBWR0EgY29ubmVjdG9yCisKK2ZwCQlkb24ndCBhdXRvZGV0ZWN0LCBhc3N1bWUgZmxhdCBwYW5lbCBkaXNwbGF5CisJCWNvbm5lY3RlZCB0byBmbGF0IHBhbmVsIG1vbml0b3IgaW50ZXJmYWNlCisKK25hdGl2ZXggCWluZm9ybSBkcml2ZXIgYWJvdXQgbmF0aXZlIHggcmVzb2x1dGlvbiBvZgorCQlmbGF0IHBhbmVsIG1vbml0b3IgY29ubmVjdGVkIHRvIHNwZWNpYWwKKwkJaW50ZXJmYWNlIChzaG91bGQgYmUgYXV0b2RldGVjdGVkKQorCitzdHJldGNoIAlzdHJldGNoIGltYWdlIHRvIGFkYXB0IGxvdyByZXNvbHV0aW9uIG1vZGVzIHRvCisJCWhpZ2VyIHJlc29sdXRpb25zIG9mIGZsYXQgcGFuZWwgbW9uaXRvcnMKKwkJY29ubmVjdGVkIHRvIHNwZWNpYWwgaW50ZXJmYWNlCisKK2NlbnRlcgkJY2VudGVyIGltYWdlIHRvIGFkYXB0IGxvdyByZXNvbHV0aW9uIG1vZGVzIHRvCisJCWhpZ2VyIHJlc29sdXRpb25zIG9mIGZsYXQgcGFuZWwgbW9uaXRvcnMKKwkJY29ubmVjdGVkIHRvIHNwZWNpYWwgaW50ZXJmYWNlCisKK21lbXNpemUgCXVzZSBpZiBhdXRvZGV0ZWN0ZWQgbWVtc2l6ZSBpcyB3cm9uZyAuLi4KKwkJc2hvdWxkIG5ldmVyIGJlIG5lY2Vzc2FyeQorCitub3BjaXJyIAlkaXNhYmxlIFBDSSByZWFkIHJldHJ5Citub3BjaXdyIAlkaXNhYmxlIFBDSSB3cml0ZSByZXRyeQorbm9wY2lyYiAJZGlzYWJsZSBQQ0kgcmVhZCBidXJzdHMKK25vcGNpd2IgCWRpc2FibGUgUENJIHdyaXRlIGJ1cnN0cworCiticHAJCWJwcCBmb3Igc3BlY2lmaWVkIG1vZGVzCisJCXZhbGlkIHZhbHVlczogOCB8fCAxNiB8fCAyNCB8fCAzMgorCityZWYJCXJlZnJlc2ggcmF0ZSBmb3Igc3BlY2lmaWVkIG1vZGUKKwkJdmFsaWQgdmFsdWVzOiA1MCA8PSByZWYgPD0gODUKKworbW9kZQkJNjQweDQ4MCBvciA4MDB4NjAwIG9yIDEwMjR4NzY4IG9yIDEyODB4MTAyNAorCQlpZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhcnR1cCBtb2RlIHdpbGwgYmUgZGV0ZWN0ZWQKKwkJYW5kIHVzZWQsIHNvIHlvdSBtaWdodCBhbHNvIHVzZSB0aGUgdmdhPT8/PyBwYXJhbWV0ZXIKKwkJZGVzY3JpYmVkIGluIHZlc2FmYi50eHQuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIG1vZGUsCisJCWJwcCBhbmQgcmVmIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCisKK3ZlcmJvc2l0eQkwIGlzIHRoZSBkZWZhdWx0LCBpbmNyZWFzZSB0byBhdCBsZWFzdCAyIGZvciBldmVyeQorCQlidWcgcmVwb3J0IQorCit2ZXNhZmIJCWFsbG93cyBjeWJsYWZiIHRvIGJlIGxvYWRlZCBhZnRlciB2ZXNhZmIgaGFzIGJlZW4KKwkJbG9hZGVkLiBTZWUgc2VjdGlvbnMgIk1vZHVsZSB1bmxvYWRpbmcgLi4uIi4KKworCitEZXZlbG9wbWVudCBoaW50cworPT09PT09PT09PT09PT09PT0KKworSXQncyBtdWNoIGZhc3RlciBkbyBjb21waWxlIGEgbW9kdWxlIGFuZCB0byBsb2FkIHRoZSBuZXcgdmVyc2lvbiBhZnRlcgordW5sb2FkaW5nIHRoZSBvbGQgbW9kdWxlIHRoYW4gdG8gY29tcGlsZSBhIG5ldyBrZXJuZWwgYW5kIHRvIHJlYm9vdC4gU28gaWYgeW91Cit0cnkgdG8gd29yayBvbiBjeWJsYWZiLCBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0byB1c2UgY3libGFmYiBhcyBhIG1vZHVsZS4KK0luIHJlYWwgbGlmZSwgZmFzdCBvZnRlbiBtZWFucyBkYW5nZXJvdXMsIGFuZCB0aGF0J3MgYWxzbyB0aGUgY2FzZSBoZXJlLiBJZgoreW91IGludHJvZHVjZSBhIHNlcmlvdXMgYnVnIHdoZW4gY3libGFmYiBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIHRoZQora2VybmVsIHdpbGwgbG9jayBvciBvb3BzIHdpdGggYSBoaWdoIHByb2JhYmlsaXR5IGJlZm9yZSB0aGUgZmlsZSBzeXN0ZW0gaXMKK21vdW50ZWQsIGFuZCB0aGUgZGFuZ2VyIGZvciB5b3VyIGRhdGEgaXMgbG93LiBJZiB5b3UgbG9hZCBhIGJyb2tlbiBvd24gdmVyc2lvbgorb2YgY3libGFmYiBvbiBhIHJ1bm5pbmcgc3lzdGVtLCB0aGUgZGFuZ2VyIGZvciB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmaWxlCitzeXN0ZW0gaXMgbXVjaCBoaWdoZXIgYXMgeW91IG1pZ2h0IG5lZWQgYSBoYXJkIHJlc2V0IGFmdGVyd2FyZHMuIERlY2lkZQoreW91cnNlbGYuCisKK01vZHVsZSB1bmxvYWRpbmcsIHRoZSB2ZmIgbWV0aG9kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3Ugd2FudCB0byB1bmxvYWQvcmVsb2FkIGN5YmxhZmIgdXNpbmcgdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIsIHlvdSBuZWVkCit0byBlbmFibGUgdmZiIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBmaXJzdC4gQWZ0ZXIgdGhhdCwgbG9hZCB0aGUgbW9kdWxlcyBhcworc2hvd24gYmVsb3c6CisKKwltb2Rwcm9iZSB2ZmIgdmZiX2VuYWJsZT0xCisJbW9kcHJvYmUgZmJjb24KKwltb2Rwcm9iZSBjeWJsYWZiCisJZmJzZXQgLWZiIC9kZXYvZmIxIDEyODB4MTAyNC02MCAtdnlyZXMgMjY2MgorCWNvbjJmYiAvZGV2L2ZiMSAvZGV2L3R0eTEKKwkuLi4KKworSWYgeW91IG5vdyBtYWRlIHNvbWUgY2hhbmdlcyB0byBjeWJsYWZiIGFuZCB3YW50IHRvIHJlbG9hZCBpdCwgeW91IG1pZ2h0IGRvIGl0CithcyBzaG93IGJlbG93OgorCisJY29uMmZiIC9kZXYvZmIwIC9kZXYvdHR5MQorCS4uLgorCXJtbW9kIGN5YmxhZmIKKwltb2Rwcm9iZSBjeWJsYWZiCisJY29uMmZiIC9kZXYvZmIxIC9kZXYvdHR5MQorCS4uLgorCitPZiBjb3Vyc2UsIHlvdSBtaWdodCBjaG9vc2UgYW5vdGhlciBtb2RlLCBhbmQgbW9zdCBjZXJ0YWlubHkgeW91IGFsc28gd2FudCB0bworbWFwIHNvbWUgb3RoZXIgL2Rldi90dHkqIHRvIHRoZSByZWFsIGZyYW1lYnVmZmVyIGRldmljZS4gWW91IG1pZ2h0IGFsc28gY2hvb3NlCit0byBjb21waWxlIGZiY29uIGFzIGEga2VybmVsIG1vZHVsZSBvciBwbGFjZSBpdCBwZXJtYW5lbnRseSBpbiB0aGUga2VybmVsLgorCitJIGRvIG5vdCBrbm93IG9mIGFueSB3YXkgdG8gdW5sb2FkIGZiY29uLCBhbmQgZmJjb24gd2lsbCBwcmV2ZW50IHRoZQorZnJhbWVidWZmZXIgZGV2aWNlIGxvYWRlZCBmaXJzdCBmcm9tIHVubG9hZGluZy4gW0lmIHRoZXJlIGlzIGEgd2F5LCB0aGVuCitwbGVhc2UgYWRkIGEgZGVzY3JpcHRpb24gaGVyZSFdCisKK01vZHVsZSB1bmxvYWRpbmcsIHRoZSB2ZXNhZmIgbWV0aG9kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb25maWd1cmUgdGhlIGtlcm5lbDoKKworCTwqPiBTdXBwb3J0IGZvciBmcmFtZSBidWZmZXIgZGV2aWNlcworCVsqXSAgIFZFU0EgVkdBIGdyYXBoaWNzIHN1cHBvcnQKKwk8TT4gICBDeWJlcmJsYWRlL2kxIHN1cHBvcnQKKworQWRkIGUuZy4gInZpZGVvPXZlc2FmYjp5cGFuIHZnYT0weDMwNyIgdG8gdGhlIGtlcm5lbCBwYXJhbWV0ZXJzLiBUaGUgeXBhbgorcGFyYW1ldGVyIGlzIGltcG9ydGFudCwgY2hvb3NlIGFueSB2Z2EgcGFyYW1ldGVyIHlvdSBsaWtlIGFzIGxvbmcgYXMgaXQgaXMKK2EgZ3JhcGhpY3MgbW9kZS4KKworQWZ0ZXIgYm9vdGluZywgbG9hZCBjeWJsYWZiIHdpdGhvdXQgYW55IG1vZGUgYW5kIGJwcCBwYXJhbWV0ZXIgYW5kIGFzc2lnbgorY3libGFmYiB0byBpbmRpdmlkdWFsIHR0eXMgdXNpbmcgY29uMmZiLCBlLmcuOgorCisJbW9kcHJvYmUgY3libGFmYiB2ZXNhZmI9MQorCWNvbjJmYiAvZGV2L2ZiMSAvZGV2L3R0eTEKKworVW5sb2FkaW5nIGN5YmxhZmIgd29ya3Mgd2l0aG91dCBwcm9ibGVtcyBhZnRlciB5b3UgYXNzaWduIHZlc2FmYiB0byBhbGwKK3R0eXMgYWdhaW4sIGUuZy46CisKKwljb24yZmIgL2Rldi9mYjAgL2Rldi90dHkxCisJcm1tb2QgY3libGFmYgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvd2h5Y3libGFmYiBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi93aHljeWJsYWZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjNiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvd2h5Y3libGFmYgpAQCAtMCwwICsxLDg1IEBACitJIHRyaWVkIHRoZSBmb2xsb3dpbmcgZnJhbWVidWZmZXIgZHJpdmVyczoKKworCS0gVFJJREVOVEZCIGlzIGZ1bGwgb2YgYnVncy4gQWNjZWxlcmF0aW9uIGlzIGJyb2tlbiBmb3IgQmxhZGUzRAorCSAgZ3JhcGhpY3MgY29yZXMgbGlrZSB0aGUgY3liZXJibGFkZS9pMS4gSXQgY2xhaW1zIHRvIHN1cHBvcnQgYSBncmVhdAorCSAgbnVtYmVyIG9mIGRldmljZXMsIGJ1dCBkb2N1bWVudGF0aW9uIGZvciBtb3N0IG9mIHRoZXNlIGRldmljZXMgaXMKKwkgIHVuZm9ydHVuYXRlbHkgbm90IGF2YWlsYWJsZS4gVGhlcmUgaXMgX25vXyByZWFzb24gdG8gdXNlIHRyaWRlbnRmYgorCSAgZm9yIGN5YmVyYmxhZGUvaTEgKyBDUlQgdXNlcnMuIFZFU0FGQiBpcyBmYXN0ZXIsIGFuZCB0aGUgb25lCisJICBhZHZhbnRhZ2UsIG1vZGUgc3dpdGNoaW5nLCBpcyBicm9rZW4gaW4gdHJpZGVudGZiLgorCisJLSBWRVNBRkIgaXMgdXNlZCBieSBtYW55IGRpc3RyaWJ1dGlvbnMgYXMgYSBzdGFuZGFyZC4gVmVzYWZiIGRvZXMKKwkgIG5vdCBzdXBwb3J0IG1vZGUgc3dpdGNoaW5nLiBWRVNBRkIgaXMgYSBiaXQgZmFzdGVyIHRoYW4gdGhlIHdvcmtpbmcKKwkgIGNvbmZpZ3VyYXRpb25zIG9mIFRSSURFTlRGQiwgYnV0IGl0IGlzIHN0aWxsIHRvbyBzbG93LCBldmVuIGlmIHlvdQorCSAgdXNlIHlwYW4uCisKKwktIEVQSUFGQiAoeW91J2xsIGZpbmQgaXQgb24gc291cmNlZm9yZ2UpIHN1cHBvcnRzIHRoZSBDeWJlcmJsYWRlL2kxCisJICBncmFwaGljcyBjb3JlLCBidXQgaXQgc3RpbGwgaGFzIHNlcmlvdXMgYnVncyBhbmQgZGV2ZWxvcGVtZW50IHNlZW1zCisJICB0byBoYXZlIHN0b3BwZWQuIFRoaXMgaXMgdGhlIG9uZSBkcml2ZXIgd2l0aCBUVi1vdXQgc3VwcG9ydC4gSWYgeW91CisJICBkbyBuZWVkIHRoaXMgZmVhdHVyZSwgdHJ5IGVwaWFmYi4KKworTm9uZSBvZiB0aGVzZSBkcml2ZXJzIHdhcyBhIHJlYWwgb3B0aW9uIGZvciBtZS4KKworSSBiZWxpZXZlIHRoYXQgaXMgdW5yZWFzb25hYmxlIHRvIGNoYW5nZSBjb2RlIHRoYXQgYW5ub3VuY2VzIHRvIHN1cHBvcnQgMjAKK2RldmljZXMgaWYgSSBvbmx5IGhhdmUgbW9yZSBvciBsZXNzIHN1ZmZpY2llbnQgZG9jdW1lbnRhdGlvbiBmb3IgZXhhY3RseSBvbmUKK29mIHRoZXNlLiBUaGUgcmlzayBvZiBicmVha2luZyBkZXZpY2UgZm9vIHdoaWxlIGZpeGluZyBkZXZpY2UgYmFyIGlzIHRvbyBoaWdoLgorCitTbyBJIGRlY2lkZWQgdG8gc3RhcnQgQ3lCbGFGQiBhcyBhIHN0cmlwcGVkIGRvd24gdHJpZGVudGZiLgorCitBbGwgY29kZSBzcGVjaWZpYyB0byBvdGhlciBUcmlkZW50IGNoaXBzIGhhcyBiZWVuIHJlbW92ZWQuIEFmdGVyIHRoYXQgdGhlcmUKK3dlcmUgYSBsb3Qgb2YgY29zbWV0aWMgY2hhbmdlcyB0byBpbmNyZWFzZSB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIGNvZGUuIEFsbAorcmVnaXN0ZXIgbmFtZXMgd2VyZSBjaGFuZ2VkIHRvIHRob3NlIG1uZW1vbmljcyB1c2VkIGluIHRoZSBkYXRhc2hlZXQuIEZ1bmN0aW9uCithbmQgbWFjcm8gbmFtZXMgd2VyZSBjaGFuZ2VkIGlmIHRoZXkgaGluZGVyZWQgZWFzeSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb2RlLgorCitBZnRlciB0aGF0IEkgZGVidWdnZWQgdGhlIGNvZGUgYW5kIGltcGxlbWVudGVkIHNvbWUgbmV3IGZlYXR1cmVzLiBJJ2xsIHRyeSB0bworZ2l2ZSBhIGxpdHRsZSBzdW1tYXJ5IG9mIHRoZSBtYWluIGNoYW5nZXM6CisKKwktIGNhbGN1bGF0aW9uIG9mIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHRpbWluZ3Mgd2FzIGZpeGVkCisKKwktIHZpZGVvIHNpZ25hbCBxdWFsaXR5IGhhcyBiZWVuIGltcHJvdmVkIGRyYW1hdGljYWxseQorCisJLSBhY2NlbGVyYXRpb246CisKKwkJLSBmaWxscmVjdCBhbmQgY29weWFyZWEgd2VyZSBmaXhlZCBhbmQgcmVlbmFibGVkCisKKwkJLSBjb2xvciBleHBhbmRpbmcgaW1hZ2VibGl0IHdhcyBuZXdseSBpbXBsZW1lbnRlZCwgY29sb3IKKwkJICBpbWFnZWJsaXQgKG9ubHkgdXNlZCB0byBkcmF3IHRoZSBwZW5ndWluZSkgc3RpbGwgdXNlcyB0aGUKKwkJICBnZW5lcmljIGNvZGUuCisKKwkJLSBpbml0IG9mIHRoZSBhY2NlbGVyYXRpb24gZW5naW5lIHdhcyBpbXByb3ZlZCBhbmQgbW92ZWQgdG8gYQorCQkgIHBsYWNlIHdoZXJlIGl0IHJlYWxseSB3b3JrcyAuLi4KKworCQktIHN5bmMgZnVuY3Rpb24gaGFzIGEgdGltZW91dCBub3cgYW5kIHRyaWVzIHRvIHJlc2V0IGFuZAorCQkgIHJlaW5pdCB0aGUgYWNjZWwgZW5naW5lIGlmIG5lY2Vzc2FyeQorCisJCS0gZmV3ZXIgc2xvdyBjb3B5YXJlYSBjYWxscyB3aGVuIGRvaW5nIHlwYW4gc2Nyb2xsaW5nIGJ5IHVzaW5nCisJCSAgdW5kb2N1bWVudGVkIGJpdCBkMjEgb2Ygc2NyZWVuIHN0YXJ0IGFkZHJlc3Mgc3RvcmVkIGluCisJCSAgQ1IyQls1XS4gQklPUyBkb2VzIHVzZSBpdCBhbHNvLCBzbyB0aGlzIHNob3VsZCBiZSBzYWZlLgorCisJLSBjeWJsYWZiIHJlamVjdHMgYW55IGF0dGVtcHQgdG8gc2V0IG1vZGVzIHRoYXQgd291bGQgY2F1c2UgdmNsaworCSAgdmFsdWVzIGFib3ZlIHJlYXNvbmFibGUgMjMwIE1Iei4gMzJiaXQgbW9kZXMgdXNlIGEgY2xvY2sKKwkgIG11bHRpcGxpY2F0b3Igb2YgMiwgc28gZmJzZXQgZG9lcyBzaG93IHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IKKwkgIHBpeGNsb2NrIGJ1dCBub3QgZm9yIHZjbGsgaW4gdGhpcyBjYXNlLiBUaGUgZmJzZXQgbGltaXQgaXMgMTE1IE1IegorCSAgZm9yIDMyIGJwcCBtb2Rlcy4KKworCS0gY3libGFmYiByZWplY3RzIG1vZGVzIGtub3duIHRvIGJlIGJyb2tlbiBvciB1bmltcGxlbWVudGVkIChhbGwKKwkgIGludGVybGFjZWQgbW9kZXMsIGFsbCBkb3VibGVzY2FuIG1vZGVzIGZvciBub3cpCisKKwktIGN5YmxhZmIgbm93IHdvcmtzIGluZGVwZW5kYW50IG9mIHRoZSB2aWRlbyBtb2RlIGluIGVmZmVjdCBhdCBzdGFydHVwCisJICB0aW1lICh0cmlkZW50ZmIgZG9lcyBub3QgaW5pdCBhbGwgbmVlZGVkIHJlZ2lzdGVycyB0byByZWFzb25hYmxlCisJICB2YWx1ZXMpCisKKwktIHN3aXRjaGluZyBiZXR3ZWVuIHZpZGVvIG1vZGVzIGRvZXMgd29yayByZWxpYWJseSBub3cKKworCS0gdGhlIGZpcnN0IHZpZGVvIG1vZGUgbm93IGlzIHRoZSBvbmUgc2VsZWN0ZWQgb24gc3RhcnR1cCB1c2luZyB0aGUKKwkgIHZnYT0/Pz8/IG1lY2hhbmlzbSBvciBhbnkgb2YKKwkJLSA2NDB4NDgwLCA4MDB4NjAwLCAxMDI0eDc2OCwgMTI4MHgxMDI0CisJCS0gOCwgMTYsIDI0IG9yIDMyIGJwcAorCQktIHJlZnJlc2ggYmV0d2VlbiA1MCBIeiBhbmQgODUgSHosIDEgSHogc3RlcHMgKDEyODB4MTAyNC0zMgorCQkgIGlzIGxpbWl0ZWQgdG8gNjNIeikKKworCS0gcGNpIHJldHJ5IGFuZCBwY2kgYnVyc3QgbW9kZSBhcmUgc2V0dGFibGUgKHRyeSB0byBkaXNhYmxlIGlmIHlvdQorCSAgZXhwZXJpZW5jZSBsYXRlbmN5IHByb2JsZW1zKQorCisJLSBidWlsdCBhcyBhIG1vZHVsZSBjeWJsYWZiIG1pZ2h0IGJlIHVubG9hZGVkIGFuZCByZWxvYWRlZCB1c2luZworCSAgdGhlIHZmYiBtb2R1bGUgYW5kIGNvbjJ2dCBvciBtaWdodCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggdmVzYWZiCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvbW9kZWRiLnR4dCBiL0RvY3VtZW50YXRpb24vZmIvbW9kZWRiLnR4dAppbmRleCBlMDQ0NThiMy4uNGZjZGI0YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYi9tb2RlZGIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmIvbW9kZWRiLnR4dApAQCAtMjAsMTIgKzIwLDgzIEBACiAKIFZhbGlkIG1vZGUgc3BlY2lmaWVycyAobW9kZV9vcHRpb24gYXJndW1lbnQpOgogCi0gICAgPHhyZXM+eDx5cmVzPlstPGJwcD5dW0A8cmVmcmVzaD5dCisgICAgPHhyZXM+eDx5cmVzPltNXVtSXVstPGJwcD5dW0A8cmVmcmVzaD5dW2ldW21dCiAgICAgPG5hbWU+Wy08YnBwPl1bQDxyZWZyZXNoPl0KIAogd2l0aCA8eHJlcz4sIDx5cmVzPiwgPGJwcD4gYW5kIDxyZWZyZXNoPiBkZWNpbWFsIG51bWJlcnMgYW5kIDxuYW1lPiBhIHN0cmluZy4KIFRoaW5ncyBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cyBhcmUgb3B0aW9uYWwuCiAKK0lmICdNJyBpcyBzcGVjaWZpZWQgaW4gdGhlIG1vZGVfb3B0aW9uIGFyZ3VtZW50IChhZnRlciA8eXJlcz4gYW5kIGJlZm9yZQorPGJwcD4gYW5kIDxyZWZyZXNoPiwgaWYgc3BlY2lmaWVkKSB0aGUgdGltaW5ncyB3aWxsIGJlIGNhbGN1bGF0ZWQgdXNpbmcKK1ZFU0EoVE0pIENvb3JkaW5hdGVkIFZpZGVvIFRpbWluZ3MgaW5zdGVhZCBvZiBsb29raW5nIHVwIHRoZSBtb2RlIGZyb20gYSB0YWJsZS4KK0lmICdSJyBpcyBzcGVjaWZpZWQsIGRvIGEgJ3JlZHVjZWQgYmxhbmtpbmcnIGNhbGN1bGF0aW9uIGZvciBkaWdpdGFsIGRpc3BsYXlzLgorSWYgJ2knIGlzIHNwZWNpZmllZCwgY2FsY3VsYXRlIGZvciBhbiBpbnRlcmxhY2VkIG1vZGUuICBBbmQgaWYgJ20nIGlzCitzcGVjaWZpZWQsIGFkZCBtYXJnaW5zIHRvIHRoZSBjYWxjdWxhdGlvbiAoMS44JSBvZiB4cmVzIHJvdW5kZWQgZG93biB0byA4CitwaXhlbHMgYW5kIDEuOCUgb2YgeXJlcykuCisKKyAgICAgICBTYW1wbGUgdXNhZ2U6IDEwMjR4NzY4TUA2MG0gLSBDVlQgdGltaW5nIHdpdGggbWFyZ2lucworCisqKioqKiBvT28gKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKioKKworV2hhdCBpcyB0aGUgVkVTQShUTSkgQ29vcmRpbmF0ZWQgVmlkZW8gVGltaW5ncyAoQ1ZUKT8KKworRnJvbSB0aGUgVkVTQShUTSkgV2Vic2l0ZToKKworICAgICAiVGhlIHB1cnBvc2Ugb2YgQ1ZUIGlzIHRvIHByb3ZpZGUgYSBtZXRob2QgZm9yIGdlbmVyYXRpbmcgYSBjb25zaXN0ZW50CisgICAgICBhbmQgY29vcmRpbmF0ZWQgc2V0IG9mIHN0YW5kYXJkIGZvcm1hdHMsIGRpc3BsYXkgcmVmcmVzaCByYXRlcywgYW5kCisgICAgICB0aW1pbmcgc3BlY2lmaWNhdGlvbnMgZm9yIGNvbXB1dGVyIGRpc3BsYXkgcHJvZHVjdHMsIGJvdGggdGhvc2UKKyAgICAgIGVtcGxveWluZyBDUlRzLCBhbmQgdGhvc2UgdXNpbmcgb3RoZXIgZGlzcGxheSB0ZWNobm9sb2dpZXMuIFRoZQorICAgICAgaW50ZW50aW9uIG9mIENWVCBpcyB0byBnaXZlIGJvdGggc291cmNlIGFuZCBkaXNwbGF5IG1hbnVmYWN0dXJlcnMgYQorICAgICAgY29tbW9uIHNldCBvZiB0b29scyB0byBlbmFibGUgbmV3IHRpbWluZ3MgdG8gYmUgZGV2ZWxvcGVkIGluIGEKKyAgICAgIGNvbnNpc3RlbnQgbWFubmVyIHRoYXQgZW5zdXJlcyBncmVhdGVyIGNvbXBhdGliaWxpdHkuIgorCitUaGlzIGlzIHRoZSB0aGlyZCBzdGFuZGFyZCBhcHByb3ZlZCBieSBWRVNBKFRNKSBjb25jZXJuaW5nIHZpZGVvIHRpbWluZ3MuICBUaGUKK2ZpcnN0IHdhcyB0aGUgRGlzY3JldGUgVmlkZW8gVGltaW5ncyAoRFZUKSB3aGljaCBpcyAgYSBjb2xsZWN0aW9uIG9mCitwcmUtZGVmaW5lZCBtb2RlcyBhcHByb3ZlZCBieSBWRVNBKFRNKS4gIFRoZSBzZWNvbmQgaXMgdGhlIEdlbmVyYWxpemVkIFRpbWluZworRm9ybXVsYSAoR1RGKSB3aGljaCBpcyBhbiBhbGdvcml0aG0gdG8gY2FsY3VsYXRlIHRoZSB0aW1pbmdzLCBnaXZlbiB0aGUKK3BpeGVsY2xvY2ssIHRoZSBob3Jpem9udGFsIHN5bmMgZnJlcXVlbmN5LCBvciB0aGUgdmVydGljYWwgcmVmcmVzaCByYXRlLgorCitUaGUgR1RGIGlzIGxpbWl0ZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBpcyBkZXNpZ25lZCBtYWlubHkgZm9yIENSVCBkaXNwbGF5cy4KK0l0IGFydGlmaWNpYWxseSBpbmNyZWFzZXMgdGhlIHBpeGVsY2xvY2sgYmVjYXVzZSBvZiBpdHMgaGlnaCBibGFua2luZworcmVxdWlyZW1lbnQuIFRoaXMgaXMgaW5hcHByb3ByaWF0ZSBmb3IgZGlnaXRhbCBkaXNwbGF5IGludGVyZmFjZSB3aXRoIGl0cyBoaWdoCitkYXRhIHJhdGUgd2hpY2ggcmVxdWlyZXMgdGhhdCBpdCBjb25zZXJ2ZXMgdGhlIHBpeGVsY2xvY2sgYXMgbXVjaCBhcyBwb3NzaWJsZS4KK0Fsc28sIEdURiBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBkaXNwbGF5LgorCitUaGUgQ1ZUIGFkZHJlc3NlcyB0aGVzZSBsaW1pdGF0aW9ucy4gIElmIHVzZWQgd2l0aCBDUlQncywgdGhlIGZvcm11bGEgdXNlZAoraXMgYSBkZXJpdmF0aW9uIG9mIEdURiB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMuICBJZiB1c2VkIHdpdGggZGlnaXRhbAorZGlzcGxheXMsIHRoZSAicmVkdWNlZCBibGFua2luZyIgY2FsY3VsYXRpb24gY2FuIGJlIHVzZWQuCisKK0Zyb20gdGhlIGZyYW1lYnVmZmVyIHN1YnN5c3RlbSBwZXJzcGVjdGl2ZSwgbmV3IGZvcm1hdHMgbmVlZCBub3QgYmUgYWRkZWQKK3RvIHRoZSBnbG9iYWwgbW9kZSBkYXRhYmFzZSB3aGVuZXZlciBhIG5ldyBtb2RlIGlzIHJlbGVhc2VkIGJ5IGRpc3BsYXkKK21hbnVmYWN0dXJlcnMuIFNwZWNpZnlpbmcgZm9yIENWVCB3aWxsIHdvcmsgZm9yIG1vc3QsIGlmIG5vdCBhbGwsIHJlbGF0aXZlbHkKK25ldyBDUlQgZGlzcGxheXMgYW5kIHByb2JhYmx5IHdpdGggbW9zdCBmbGF0cGFuZWxzLCBpZiAncmVkdWNlZCBibGFua2luZycKK2NhbGN1bGF0aW9uIGlzIHNwZWNpZmllZC4gIChUaGUgQ1ZUIGNvbXBhdGliaWxpdHkgb2YgdGhlIGRpc3BsYXkgY2FuIGJlCitkZXRlcm1pbmVkIGZyb20gaXRzIEVESUQuIFRoZSB2ZXJzaW9uIDEuMyBvZiB0aGUgRURJRCBoYXMgZXh0cmEgMTI4LWJ5dGUKK2Jsb2NrcyB3aGVyZSBhZGRpdGlvbmFsIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBwbGFjZWQuICBBcyBvZiB0aGlzIHRpbWUsIHRoZXJlCitpcyBubyBzdXBwb3J0IHlldCBpbiB0aGUgbGF5ZXIgdG8gcGFyc2UgdGhpcyBhZGRpdGlvbmFsIGJsb2Nrcy4pCisKK0NWVCBhbHNvIGludHJvZHVjZWQgYSBuZXcgbmFtaW5nIGNvbnZlbnRpb24gKHNob3VsZCBiZSBzZWVuIGZyb20gZG1lc2cgb3V0cHV0KToKKworICAgIDxwaXg+TTxhPlstUl0KKworICAgIHdoZXJlOiBwaXggPSB0b3RhbCBhbW91bnQgb2YgcGl4ZWxzIGluIE1CICh4cmVzIHggeXJlcykKKyAgICAgICAgICAgTSAgID0gYWx3YXlzIHByZXNlbnQKKyAgICAgICAgICAgYSAgID0gYXNwZWN0IHJhdGlvICgzIC0gNDozOyA0IC0gNTo0OyA5IC0gMTU6OSwgMTY6OTsgQSAtIDE2OjEwKQorICAgICAgICAgIC1SICAgPSByZWR1Y2VkIGJsYW5raW5nCisKKwkgIGV4YW1wbGU6ICAuNDhNMy1SIC0gODAweDYwMCB3aXRoIHJlZHVjZWQgYmxhbmtpbmcKKworTm90ZTogVkVTQShUTSkgaGFzIHJlc3RyaWN0aW9ucyBvbiB3aGF0IGlzIGEgc3RhbmRhcmQgQ1ZUIHRpbWluZzoKKworICAgICAgLSBhc3BlY3QgcmF0aW8gY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICAgIC0gYWNjZXB0YWJsZSByZWZyZXNoIHJhdGVzIGFyZSA1MCwgNjAsIDcwIG9yIDg1IEh6IG9ubHkKKyAgICAgIC0gaWYgcmVkdWNlZCBibGFua2luZywgdGhlIHJlZnJlc2ggcmF0ZSBtdXN0IGJlIGF0IDYwSHoKKworSWYgb25lIG9mIHRoZSBhYm92ZSBhcmUgbm90IHNhdGlzZmllZCwgdGhlIGtlcm5lbCB3aWxsIHByaW50IGEgd2FybmluZyBidXQgdGhlCit0aW1pbmdzIHdpbGwgc3RpbGwgYmUgY2FsY3VsYXRlZC4KKworKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKiogb09vICoqKioqIG9PbyAqKioqKiBvT28gKioqKiogb09vICoqKioqCisKIFRvIGZpbmQgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLCB5b3UganVzdCBjYWxsCiAKIGludCBfX2luaXQgZmJfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDM2MzkwOTAuLjc4NGUwOGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTE3LDIzICsxNyw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglBQ1BJIFM0YmlvcyBzdXBwb3J0Ci1XaGVuOglNYXkgMjAwNQotV2h5OglOb29uZSB1c2VzIGl0LCBhbmQgaXQgcHJvYmFibHkgZG9lcyBub3Qgd29yaywgYW55d2F5LiBzd3N1c3AgaXMKLQlmYXN0ZXIsIG1vcmUgcmVsaWFibGUsIGFuZCBwZW9wbGUgYXJlIGFjdHVhbGx5IHVzaW5nIGl0LgotV2hvOglQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XaGF0OglQQ0kgTmFtZSBEYXRhYmFzZSAoQ09ORklHX1BDSV9OQU1FUykKLVdoZW46CUp1bHkgMjAwNQotV2h5OglJdCBibG9hdHMgdGhlIGtlcm5lbCB1bm5lY2Vzc2FyaWx5LCBhbmQgaXMgaGFuZGxlZCBieSB1c2Vyc3BhY2UgYmV0dGVyCi0JKHBjaXV0aWxzIHN1cHBvcnRzIGl0LikgIFdpbGwgZWxpbWluYXRlIHRoZSBuZWVkIHRvIHRyeSB0byBrZWVwIHRoZQotCXBjaS5pZHMgZmlsZSBpbiBzeW5jIHdpdGggdGhlIHNmLm5ldCBkYXRhYmFzZSBhbGwgb2YgdGhlIHRpbWUuCi1XaG86CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0Oglpb19yZW1hcF9wYWdlX3JhbmdlKCkgKG1hY3JvIG9yIGZ1bmN0aW9uKQogV2hlbjoJU2VwdGVtYmVyIDIwMDUKIFdoeToJUmVwbGFjZWQgYnkgaW9fcmVtYXBfcGZuX3JhbmdlKCkgd2hpY2ggYWxsb3dzIG1vcmUgbWVtb3J5IHNwYWNlCkBAIC01MSwxNCArMzQsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKCkgLyB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbigpCi1XaGVuOglBcHJpbCAyMDA1Ci1XaHk6CVJlcGxhY2VkIGJ5IC0+Y29tcGF0X2lvY3RsIGluIGZpbGVfb3BlcmF0aW9ucyBhbmQgb3RoZXIgbWV0aG9kCi0JdmVjb3JzLgotV2hvOglBbmRpIEtsZWVuIDxha0BtdWMuZGU+LCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CVJDVSBBUEkgbW92ZXMgdG8gRVhQT1JUX1NZTUJPTF9HUEwKIFdoZW46CUFwcmlsIDIwMDYKIEZpbGVzOglpbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgsIGtlcm5lbC9yY3VwZGF0ZS5jCkBAIC03NCwxNCArNDksNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJcmVtb3ZlIHZlcmlmeV9hcmVhKCkKLVdoZW46CUp1bHkgMjAwNgotRmlsZXM6CVZhcmlvdXMgdWFjY2Vzcy5oIGhlYWRlcnMuCi1XaHk6CURlcHJlY2F0ZWQgYW5kIHJlZHVuZGFudC4gYWNjZXNzX29rKCkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLVdobzoJSmVzcGVyIEp1aGwgPGp1aGwtbGttbEBkaWYuZGs+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglJRUVFMTM5NCBBdWRpbyBhbmQgTXVzaWMgRGF0YSBUcmFuc21pc3Npb24gUHJvdG9jb2wgZHJpdmVyLAogCUNvbm5lY3Rpb24gTWFuYWdlbWVudCBQcm9jZWR1cmVzIGRyaXZlcgogV2hlbjoJTm92ZW1iZXIgMjAwNQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9maWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2ZpbGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIwNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9maWxlcy50eHQKQEAgLTAsMCArMSwxMjMgQEAKK0ZpbGUgbWFuYWdlbWVudCBpbiB0aGUgTGludXgga2VybmVsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgbG9ja2luZyBmb3IgZmlsZXMgKHN0cnVjdCBmaWxlKQorYW5kIGZpbGUgZGVzY3JpcHRvciB0YWJsZSAoc3RydWN0IGZpbGVzKSB3b3Jrcy4KKworVXAgdW50aWwgMi42LjEyLCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGhhcyBiZWVuIHByb3RlY3RlZAord2l0aCBhIGxvY2sgKGZpbGVzLT5maWxlX2xvY2spIGFuZCByZWZlcmVuY2UgY291bnQgKGZpbGVzLT5jb3VudCkuCistPmZpbGVfbG9jayBwcm90ZWN0ZWQgYWNjZXNzZXMgdG8gYWxsIHRoZSBmaWxlIHJlbGF0ZWQgZmllbGRzCitvZiB0aGUgdGFibGUuIC0+Y291bnQgd2FzIHVzZWQgZm9yIHNoYXJpbmcgdGhlIGZpbGUgZGVzY3JpcHRvcgordGFibGUgYmV0d2VlbiB0YXNrcyBjbG9uZWQgd2l0aCBDTE9ORV9GSUxFUyBmbGFnLiBUeXBpY2FsbHkKK3RoaXMgd291bGQgYmUgdGhlIGNhc2UgZm9yIHBvc2l4IHRocmVhZHMuIEFzIHdpdGggdGhlIGNvbW1vbgorcmVmY291bnRpbmcgbW9kZWwgaW4gdGhlIGtlcm5lbCwgdGhlIGxhc3QgdGFzayBkb2luZworYSBwdXRfZmlsZXNfc3RydWN0KCkgZnJlZXMgdGhlIGZpbGUgZGVzY3JpcHRvciAoZmQpIHRhYmxlLgorVGhlIGZpbGVzIChzdHJ1Y3QgZmlsZSkgdGhlbXNlbHZlcyBhcmUgcHJvdGVjdGVkIHVzaW5nCityZWZlcmVuY2UgY291bnQgKC0+Zl9jb3VudCkuCisKK0luIHRoZSBuZXcgbG9jay1mcmVlIG1vZGVsIG9mIGZpbGUgZGVzY3JpcHRvciBtYW5hZ2VtZW50LAordGhlIHJlZmVyZW5jZSBjb3VudGluZyBpcyBzaW1pbGFyLCBidXQgdGhlIGxvY2tpbmcgaXMKK2Jhc2VkIG9uIFJDVS4gVGhlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBjb250YWlucyBtdWx0aXBsZQorZWxlbWVudHMgLSB0aGUgZmQgc2V0cyAob3Blbl9mZHMgYW5kIGNsb3NlX29uX2V4ZWMsIHRoZQorYXJyYXkgb2YgZmlsZSBwb2ludGVycywgdGhlIHNpemVzIG9mIHRoZSBzZXRzIGFuZCB0aGUgYXJyYXkKK2V0Yy4pLiBJbiBvcmRlciBmb3IgdGhlIHVwZGF0ZXMgdG8gYXBwZWFyIGF0b21pYyB0bworYSBsb2NrLWZyZWUgcmVhZGVyLCBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IKK3RhYmxlIGFyZSBpbiBhIHNlcGFyYXRlIHN0cnVjdHVyZSAtIHN0cnVjdCBmZHRhYmxlLgorZmlsZXNfc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciB0byBzdHJ1Y3QgZmR0YWJsZSB0aHJvdWdoCit3aGljaCB0aGUgYWN0dWFsIGZkIHRhYmxlIGlzIGFjY2Vzc2VkLiBJbml0aWFsbHkgdGhlCitmZHRhYmxlIGlzIGVtYmVkZGVkIGluIGZpbGVzX3N0cnVjdCBpdHNlbGYuIE9uIGEgc3Vic2VxdWVudAorZXhwYW5zaW9uIG9mIGZkdGFibGUsIGEgbmV3IGZkdGFibGUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZAorYW5kIGZpbGVzLT5mZHRhYiBwb2ludHMgdG8gdGhlIG5ldyBzdHJ1Y3R1cmUuIFRoZSBmZHRhYmxlCitzdHJ1Y3R1cmUgaXMgZnJlZWQgd2l0aCBSQ1UgYW5kIGxvY2stZnJlZSByZWFkZXJzIGVpdGhlcgorc2VlIHRoZSBvbGQgZmR0YWJsZSBvciB0aGUgbmV3IGZkdGFibGUgbWFraW5nIHRoZSB1cGRhdGUKK2FwcGVhciBhdG9taWMuIEhlcmUgYXJlIHRoZSBsb2NraW5nIHJ1bGVzIGZvcgordGhlIGZkdGFibGUgc3RydWN0dXJlIC0KKworMS4gQWxsIHJlZmVyZW5jZXMgdG8gdGhlIGZkdGFibGUgbXVzdCBiZSBkb25lIHRocm91Z2gKKyAgIHRoZSBmaWxlc19mZHRhYmxlKCkgbWFjcm8gOgorCisJc3RydWN0IGZkdGFibGUgKmZkdDsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCS4uLi4KKwlpZiAobiA8PSBmZHQtPm1heF9mZHMpCisJCS4uLi4KKwkuLi4KKwlyY3VfcmVhZF91bmxvY2soKTsKKworICAgZmlsZXNfZmR0YWJsZSgpIHVzZXMgcmN1X2RlcmVmZXJlbmNlKCkgbWFjcm8gd2hpY2ggdGFrZXMgY2FyZSBvZgorICAgdGhlIG1lbW9yeSBiYXJyaWVyIHJlcXVpcmVtZW50cyBmb3IgbG9jay1mcmVlIGRlcmVmZXJlbmNlLgorICAgVGhlIGZkdGFibGUgcG9pbnRlciBtdXN0IGJlIHJlYWQgd2l0aGluIHRoZSByZWFkLXNpZGUKKyAgIGNyaXRpY2FsIHNlY3Rpb24uCisKKzIuIFJlYWRpbmcgb2YgdGhlIGZkdGFibGUgYXMgZGVzY3JpYmVkIGFib3ZlIG11c3QgYmUgcHJvdGVjdGVkCisgICBieSByY3VfcmVhZF9sb2NrKCkvcmN1X3JlYWRfdW5sb2NrKCkuCisKKzMuIEZvciBhbnkgdXBkYXRlIHRvIHRoZSB0aGUgZmQgdGFibGUsIGZpbGVzLT5maWxlX2xvY2sgbXVzdAorICAgYmUgaGVsZC4KKworNC4gVG8gbG9vayB1cCB0aGUgZmlsZSBzdHJ1Y3R1cmUgZ2l2ZW4gYW4gZmQsIGEgcmVhZGVyCisgICBtdXN0IHVzZSBlaXRoZXIgZmNoZWNrKCkgb3IgZmNoZWNrX2ZpbGVzKCkgQVBJcy4gVGhlc2UKKyAgIHRha2UgY2FyZSBvZiBiYXJyaWVyIHJlcXVpcmVtZW50cyBkdWUgdG8gbG9jay1mcmVlIGxvb2t1cC4KKyAgIEFuIGV4YW1wbGUgOgorCisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmlsZSA9IGZjaGVjayhmZCk7CisJaWYgKGZpbGUpIHsKKwkJLi4uCisJfQorCS4uLi4KKwlyY3VfcmVhZF91bmxvY2soKTsKKworNS4gSGFuZGxpbmcgb2YgdGhlIGZpbGUgc3RydWN0dXJlcyBpcyBzcGVjaWFsLiBTaW5jZSB0aGUgbG9vay11cAorICAgb2YgdGhlIGZkIChmZ2V0KCkvZmdldF9saWdodCgpKSBhcmUgbG9jay1mcmVlLCBpdCBpcyBwb3NzaWJsZQorICAgdGhhdCBsb29rLXVwIG1heSByYWNlIHdpdGggdGhlIGxhc3QgcHV0KCkgb3BlcmF0aW9uIG9uIHRoZQorICAgZmlsZSBzdHJ1Y3R1cmUuIFRoaXMgaXMgYXZvaWRlZCB1c2luZyB0aGUgcmN1cmVmIEFQSXMKKyAgIG9uIC0+Zl9jb3VudCA6CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOworCWlmIChmaWxlKSB7CisJCWlmIChyY3VyZWZfaW5jX2xmKCZmaWxlLT5mX2NvdW50KSkKKwkJCSpmcHV0X25lZWRlZCA9IDE7CisJCWVsc2UKKwkJLyogRGlkbid0IGdldCB0aGUgcmVmZXJlbmNlLCBzb21lb25lJ3MgZnJlZWQgKi8KKwkJCWZpbGUgPSBOVUxMOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwkuLi4uCisJcmV0dXJuIGZpbGU7CisKKyAgIHJjdXJlZl9pbmNfbGYoKSBkZXRlY3RzIGlmIHJlZmNvdW50cyBpcyBhbHJlYWR5IHplcm8gb3IKKyAgIGdvZXMgdG8gemVybyBkdXJpbmcgaW5jcmVtZW50LiBJZiBpdCBkb2VzLCB3ZSBmYWlsCisgICBmZ2V0KCkvZmdldF9saWdodCgpLgorCis2LiBTaW5jZSBib3RoIGZkdGFibGUgYW5kIGZpbGUgc3RydWN0dXJlcyBjYW4gYmUgbG9va2VkIHVwCisgICBsb2NrLWZyZWUsIHRoZXkgbXVzdCBiZSBpbnN0YWxsZWQgdXNpbmcgcmN1X2Fzc2lnbl9wb2ludGVyKCkKKyAgIEFQSS4gSWYgdGhleSBhcmUgbG9va2VkIHVwIGxvY2stZnJlZSwgcmN1X2RlcmVmZXJlbmNlKCkKKyAgIG11c3QgYmUgdXNlZC4gSG93ZXZlciBpdCBpcyBhZHZpc2FibGUgdG8gdXNlIGZpbGVzX2ZkdGFibGUoKQorICAgYW5kIGZjaGVjaygpL2ZjaGVja19maWxlcygpIHdoaWNoIHRha2UgY2FyZSBvZiB0aGVzZSBpc3N1ZXMuCisKKzcuIFdoaWxlIHVwZGF0aW5nLCB0aGUgZmR0YWJsZSBwb2ludGVyIG11c3QgYmUgbG9va2VkIHVwIHdoaWxlCisgICBob2xkaW5nIGZpbGVzLT5maWxlX2xvY2suIElmIC0+ZmlsZV9sb2NrIGlzIGRyb3BwZWQsIHRoZW4KKyAgIGFub3RoZXIgdGhyZWFkIGV4cGFuZCB0aGUgZmlsZXMgdGhlcmVieSBjcmVhdGluZyBhIG5ldworICAgZmR0YWJsZSBhbmQgbWFraW5nIHRoZSBlYXJsaWVyIGZkdGFibGUgcG9pbnRlciBzdGFsZS4KKyAgIEZvciBleGFtcGxlIDoKKworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmQgPSBsb2NhdGVfZmQoZmlsZXMsIGZpbGUsIHN0YXJ0KTsKKwlpZiAoZmQgPj0gMCkgeworCQkvKiBsb2NhdGVfZmQoKSBtYXkgaGF2ZSBleHBhbmRlZCBmZHRhYmxlLCBsb2FkIHRoZSBwdHIgKi8KKwkJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJCUZEX1NFVChmZCwgZmR0LT5vcGVuX2Zkcyk7CisJCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKKwkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCS4uLi4uCisKKyAgIFNpbmNlIGxvY2F0ZV9mZCgpIGNhbiBkcm9wIC0+ZmlsZV9sb2NrIChhbmQgcmVhY3F1aXJlIC0+ZmlsZV9sb2NrKSwKKyAgIHRoZSBmZHRhYmxlIHBvaW50ZXIgKGZkdCkgbXVzdCBiZSBsb2FkZWQgYWZ0ZXIgbG9jYXRlX2ZkKCkuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTc0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0CkBAIC0wLDAgKzEsMzE1IEBACitEZWZpbml0aW9ucworfn5+fn5+fn5+fn4KKworVXNlcnNwYWNlIGZpbGVzeXN0ZW06CisKKyAgQSBmaWxlc3lzdGVtIGluIHdoaWNoIGRhdGEgYW5kIG1ldGFkYXRhIGFyZSBwcm92aWRlZCBieSBhbiBvcmRpbmFyeQorICB1c2Vyc3BhY2UgcHJvY2Vzcy4gIFRoZSBmaWxlc3lzdGVtIGNhbiBiZSBhY2Nlc3NlZCBub3JtYWxseSB0aHJvdWdoCisgIHRoZSBrZXJuZWwgaW50ZXJmYWNlLgorCitGaWxlc3lzdGVtIGRhZW1vbjoKKworICBUaGUgcHJvY2VzcyhlcykgcHJvdmlkaW5nIHRoZSBkYXRhIGFuZCBtZXRhZGF0YSBvZiB0aGUgZmlsZXN5c3RlbS4KKworTm9uLXByaXZpbGVnZWQgbW91bnQgKG9yIHVzZXIgbW91bnQpOgorCisgIEEgdXNlcnNwYWNlIGZpbGVzeXN0ZW0gbW91bnRlZCBieSBhIG5vbi1wcml2aWxlZ2VkIChub24tcm9vdCkgdXNlci4KKyAgVGhlIGZpbGVzeXN0ZW0gZGFlbW9uIGlzIHJ1bm5pbmcgd2l0aCB0aGUgcHJpdmlsZWdlcyBvZiB0aGUgbW91bnRpbmcKKyAgdXNlci4gIE5PVEU6IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIG1vdW50cyBhbGxvd2VkIHdpdGggdGhlICJ1c2VyIgorICBvcHRpb24gaW4gL2V0Yy9mc3RhYiwgd2hpY2ggaXMgbm90IGRpc2N1c3NlZCBoZXJlLgorCitNb3VudCBvd25lcjoKKworICBUaGUgdXNlciB3aG8gZG9lcyB0aGUgbW91bnRpbmcuCisKK1VzZXI6CisKKyAgVGhlIHVzZXIgd2hvIGlzIHBlcmZvcm1pbmcgZmlsZXN5c3RlbSBvcGVyYXRpb25zLgorCitXaGF0IGlzIEZVU0U/Cit+fn5+fn5+fn5+fn5+CisKK0ZVU0UgaXMgYSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSBmcmFtZXdvcmsuICBJdCBjb25zaXN0cyBvZiBhIGtlcm5lbAorbW9kdWxlIChmdXNlLmtvKSwgYSB1c2Vyc3BhY2UgbGlicmFyeSAobGliZnVzZS4qKSBhbmQgYSBtb3VudCB1dGlsaXR5CisoZnVzZXJtb3VudCkuCisKK09uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMgb2YgRlVTRSBpcyBhbGxvd2luZyBzZWN1cmUsCitub24tcHJpdmlsZWdlZCBtb3VudHMuICBUaGlzIG9wZW5zIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciB0aGUgdXNlIG9mCitmaWxlc3lzdGVtcy4gIEEgZ29vZCBleGFtcGxlIGlzIHNzaGZzOiBhIHNlY3VyZSBuZXR3b3JrIGZpbGVzeXN0ZW0KK3VzaW5nIHRoZSBzZnRwIHByb3RvY29sLgorCitUaGUgdXNlcnNwYWNlIGxpYnJhcnkgYW5kIHV0aWxpdGllcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIEZVU0UKK2hvbWVwYWdlOgorCisgIGh0dHA6Ly9mdXNlLnNvdXJjZWZvcmdlLm5ldC8KKworTW91bnQgb3B0aW9ucworfn5+fn5+fn5+fn5+fgorCisnZmQ9TicKKworICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHVzZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSB1c2Vyc3BhY2UKKyAgZmlsZXN5c3RlbSBhbmQgdGhlIGtlcm5lbC4gIFRoZSBmaWxlIGRlc2NyaXB0b3IgbXVzdCBoYXZlIGJlZW4KKyAgb2J0YWluZWQgYnkgb3BlbmluZyB0aGUgRlVTRSBkZXZpY2UgKCcvZGV2L2Z1c2UnKS4KKworJ3Jvb3Rtb2RlPU0nCisKKyAgVGhlIGZpbGUgbW9kZSBvZiB0aGUgZmlsZXN5c3RlbSdzIHJvb3QgaW4gb2N0YWwgcmVwcmVzZW50YXRpb24uCisKKyd1c2VyX2lkPU4nCisKKyAgVGhlIG51bWVyaWMgdXNlciBpZCBvZiB0aGUgbW91bnQgb3duZXIuCisKKydncm91cF9pZD1OJworCisgIFRoZSBudW1lcmljIGdyb3VwIGlkIG9mIHRoZSBtb3VudCBvd25lci4KKworJ2RlZmF1bHRfcGVybWlzc2lvbnMnCisKKyAgQnkgZGVmYXVsdCBGVVNFIGRvZXNuJ3QgY2hlY2sgZmlsZSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZQorICBmaWxlc3lzdGVtIGlzIGZyZWUgdG8gaW1wbGVtZW50IGl0J3MgYWNjZXNzIHBvbGljeSBvciBsZWF2ZSBpdCB0bworICB0aGUgdW5kZXJseWluZyBmaWxlIGFjY2VzcyBtZWNoYW5pc20gKGUuZy4gaW4gY2FzZSBvZiBuZXR3b3JrCisgIGZpbGVzeXN0ZW1zKS4gIFRoaXMgb3B0aW9uIGVuYWJsZXMgcGVybWlzc2lvbiBjaGVja2luZywgcmVzdHJpY3RpbmcKKyAgYWNjZXNzIGJhc2VkIG9uIGZpbGUgbW9kZS4gIFRoaXMgaXMgb3B0aW9uIGlzIHVzdWFsbHkgdXNlZnVsCisgIHRvZ2V0aGVyIHdpdGggdGhlICdhbGxvd19vdGhlcicgbW91bnQgb3B0aW9uLgorCisnYWxsb3dfb3RoZXInCisKKyAgVGhpcyBvcHRpb24gb3ZlcnJpZGVzIHRoZSBzZWN1cml0eSBtZWFzdXJlIHJlc3RyaWN0aW5nIGZpbGUgYWNjZXNzCisgIHRvIHRoZSB1c2VyIG1vdW50aW5nIHRoZSBmaWxlc3lzdGVtLiAgVGhpcyBvcHRpb24gaXMgYnkgZGVmYXVsdCBvbmx5CisgIGFsbG93ZWQgdG8gcm9vdCwgYnV0IHRoaXMgcmVzdHJpY3Rpb24gY2FuIGJlIHJlbW92ZWQgd2l0aCBhCisgICh1c2Vyc3BhY2UpIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgorCisnbWF4X3JlYWQ9TicKKworICBXaXRoIHRoaXMgb3B0aW9uIHRoZSBtYXhpbXVtIHNpemUgb2YgcmVhZCBvcGVyYXRpb25zIGNhbiBiZSBzZXQuCisgIFRoZSBkZWZhdWx0IGlzIGluZmluaXRlLiAgTm90ZSB0aGF0IHRoZSBzaXplIG9mIHJlYWQgcmVxdWVzdHMgaXMKKyAgbGltaXRlZCBhbnl3YXkgdG8gMzIgcGFnZXMgKHdoaWNoIGlzIDEyOGtieXRlIG9uIGkzODYpLgorCitIb3cgZG8gbm9uLXByaXZpbGVnZWQgbW91bnRzIHdvcms/Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1NpbmNlIHRoZSBtb3VudCgpIHN5c3RlbSBjYWxsIGlzIGEgcHJpdmlsZWdlZCBvcGVyYXRpb24sIGEgaGVscGVyCitwcm9ncmFtIChmdXNlcm1vdW50KSBpcyBuZWVkZWQsIHdoaWNoIGlzIGluc3RhbGxlZCBzZXR1aWQgcm9vdC4KKworVGhlIGltcGxpY2F0aW9uIG9mIHByb3ZpZGluZyBub24tcHJpdmlsZWdlZCBtb3VudHMgaXMgdGhhdCB0aGUgbW91bnQKK293bmVyIG11c3Qgbm90IGJlIGFibGUgdG8gdXNlIHRoaXMgY2FwYWJpbGl0eSB0byBjb21wcm9taXNlIHRoZQorc3lzdGVtLiAgT2J2aW91cyByZXF1aXJlbWVudHMgYXJpc2luZyBmcm9tIHRoaXMgYXJlOgorCisgQSkgbW91bnQgb3duZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGdldCBlbGV2YXRlZCBwcml2aWxlZ2VzIHdpdGggdGhlCisgICAgaGVscCBvZiB0aGUgbW91bnRlZCBmaWxlc3lzdGVtCisKKyBCKSBtb3VudCBvd25lciBzaG91bGQgbm90IGdldCBpbGxlZ2l0aW1hdGUgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGZyb20KKyAgICBvdGhlciB1c2VycycgYW5kIHRoZSBzdXBlciB1c2VyJ3MgcHJvY2Vzc2VzCisKKyBDKSBtb3VudCBvd25lciBzaG91bGQgbm90IGJlIGFibGUgdG8gaW5kdWNlIHVuZGVzaXJlZCBiZWhhdmlvciBpbgorICAgIG90aGVyIHVzZXJzJyBvciB0aGUgc3VwZXIgdXNlcidzIHByb2Nlc3NlcworCitIb3cgYXJlIHJlcXVpcmVtZW50cyBmdWxmaWxsZWQ/Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyBBKSBUaGUgbW91bnQgb3duZXIgY291bGQgZ2FpbiBlbGV2YXRlZCBwcml2aWxlZ2VzIGJ5IGVpdGhlcjoKKworICAgICAxKSBjcmVhdGluZyBhIGZpbGVzeXN0ZW0gY29udGFpbmluZyBhIGRldmljZSBmaWxlLCB0aGVuIG9wZW5pbmcKKwl0aGlzIGRldmljZQorCisgICAgIDIpIGNyZWF0aW5nIGEgZmlsZXN5c3RlbSBjb250YWluaW5nIGEgc3VpZCBvciBzZ2lkIGFwcGxpY2F0aW9uLAorCXRoZW4gZXhlY3V0aW5nIHRoaXMgYXBwbGljYXRpb24KKworICAgIFRoZSBzb2x1dGlvbiBpcyBub3QgdG8gYWxsb3cgb3BlbmluZyBkZXZpY2UgZmlsZXMgYW5kIGlnbm9yZQorICAgIHNldHVpZCBhbmQgc2V0Z2lkIGJpdHMgd2hlbiBleGVjdXRpbmcgcHJvZ3JhbXMuICBUbyBlbnN1cmUgdGhpcworICAgIGZ1c2VybW91bnQgYWx3YXlzIGFkZHMgIm5vc3VpZCIgYW5kICJub2RldiIgdG8gdGhlIG1vdW50IG9wdGlvbnMKKyAgICBmb3Igbm9uLXByaXZpbGVnZWQgbW91bnRzLgorCisgQikgSWYgYW5vdGhlciB1c2VyIGlzIGFjY2Vzc2luZyBmaWxlcyBvciBkaXJlY3RvcmllcyBpbiB0aGUKKyAgICBmaWxlc3lzdGVtLCB0aGUgZmlsZXN5c3RlbSBkYWVtb24gc2VydmluZyByZXF1ZXN0cyBjYW4gcmVjb3JkIHRoZQorICAgIGV4YWN0IHNlcXVlbmNlIGFuZCB0aW1pbmcgb2Ygb3BlcmF0aW9ucyBwZXJmb3JtZWQuICBUaGlzCisgICAgaW5mb3JtYXRpb24gaXMgb3RoZXJ3aXNlIGluYWNjZXNzaWJsZSB0byB0aGUgbW91bnQgb3duZXIsIHNvIHRoaXMKKyAgICBjb3VudHMgYXMgYW4gaW5mb3JtYXRpb24gbGVhay4KKworICAgIFRoZSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0gd2lsbCBiZSBwcmVzZW50ZWQgaW4gcG9pbnQgMikgb2YgQykuCisKKyBDKSBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIGluIHdoaWNoIHRoZSBtb3VudCBvd25lciBjYW4gaW5kdWNlCisgICAgdW5kZXNpcmVkIGJlaGF2aW9yIGluIG90aGVyIHVzZXJzJyBwcm9jZXNzZXMsIHN1Y2ggYXM6CisKKyAgICAgMSkgbW91bnRpbmcgYSBmaWxlc3lzdGVtIG92ZXIgYSBmaWxlIG9yIGRpcmVjdG9yeSB3aGljaCB0aGUgbW91bnQKKyAgICAgICAgb3duZXIgY291bGQgb3RoZXJ3aXNlIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSAob3IgY291bGQgb25seQorICAgICAgICBtYWtlIGxpbWl0ZWQgbW9kaWZpY2F0aW9ucykuCisKKyAgICAgICAgVGhpcyBpcyBzb2x2ZWQgaW4gZnVzZXJtb3VudCwgYnkgY2hlY2tpbmcgdGhlIGFjY2VzcworICAgICAgICBwZXJtaXNzaW9ucyBvbiB0aGUgbW91bnRwb2ludCBhbmQgb25seSBhbGxvd2luZyB0aGUgbW91bnQgaWYKKyAgICAgICAgdGhlIG1vdW50IG93bmVyIGNhbiBkbyB1bmxpbWl0ZWQgbW9kaWZpY2F0aW9uIChoYXMgd3JpdGUKKyAgICAgICAgYWNjZXNzIHRvIHRoZSBtb3VudHBvaW50LCBhbmQgbW91bnRwb2ludCBpcyBub3QgYSAic3RpY2t5IgorICAgICAgICBkaXJlY3RvcnkpCisKKyAgICAgMikgRXZlbiBpZiAxKSBpcyBzb2x2ZWQgdGhlIG1vdW50IG93bmVyIGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yCisgICAgICAgIG9mIG90aGVyIHVzZXJzJyBwcm9jZXNzZXMuCisKKyAgICAgICAgIGkpIEl0IGNhbiBzbG93IGRvd24gb3IgaW5kZWZpbml0ZWx5IGRlbGF5IHRoZSBleGVjdXRpb24gb2YgYQorICAgICAgICAgICBmaWxlc3lzdGVtIG9wZXJhdGlvbiBjcmVhdGluZyBhIERvUyBhZ2FpbnN0IHRoZSB1c2VyIG9yIHRoZQorICAgICAgICAgICB3aG9sZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSBhIHN1aWQgYXBwbGljYXRpb24gbG9ja2luZyBhCisgICAgICAgICAgIHN5c3RlbSBmaWxlLCBhbmQgdGhlbiBhY2Nlc3NpbmcgYSBmaWxlIG9uIHRoZSBtb3VudCBvd25lcidzCisgICAgICAgICAgIGZpbGVzeXN0ZW0gY291bGQgYmUgc3RvcHBlZCwgYW5kIHRodXMgY2F1c2luZyB0aGUgc3lzdGVtCisgICAgICAgICAgIGZpbGUgdG8gYmUgbG9ja2VkIGZvcmV2ZXIuCisKKyAgICAgICAgIGlpKSBJdCBjYW4gcHJlc2VudCBmaWxlcyBvciBkaXJlY3RvcmllcyBvZiB1bmxpbWl0ZWQgbGVuZ3RoLCBvcgorICAgICAgICAgICBkaXJlY3Rvcnkgc3RydWN0dXJlcyBvZiB1bmxpbWl0ZWQgZGVwdGgsIHBvc3NpYmx5IGNhdXNpbmcgYQorICAgICAgICAgICBzeXN0ZW0gcHJvY2VzcyB0byBlYXQgdXAgZGlza3NwYWNlLCBtZW1vcnkgb3Igb3RoZXIKKyAgICAgICAgICAgcmVzb3VyY2VzLCBhZ2FpbiBjYXVzaW5nIERvUy4KKworCVRoZSBzb2x1dGlvbiB0byB0aGlzIGFzIHdlbGwgYXMgQikgaXMgbm90IHRvIGFsbG93IHByb2Nlc3NlcworCXRvIGFjY2VzcyB0aGUgZmlsZXN5c3RlbSwgd2hpY2ggY291bGQgb3RoZXJ3aXNlIG5vdCBiZQorCW1vbml0b3JlZCBvciBtYW5pcHVsYXRlZCBieSB0aGUgbW91bnQgb3duZXIuICBTaW5jZSBpZiB0aGUKKwltb3VudCBvd25lciBjYW4gcHRyYWNlIGEgcHJvY2VzcywgaXQgY2FuIGRvIGFsbCBvZiB0aGUgYWJvdmUKKwl3aXRob3V0IHVzaW5nIGEgRlVTRSBtb3VudCwgdGhlIHNhbWUgY3JpdGVyaWEgYXMgdXNlZCBpbgorCXB0cmFjZSBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBhIHByb2Nlc3MgaXMgYWxsb3dlZCB0byBhY2Nlc3MKKwl0aGUgZmlsZXN5c3RlbSBvciBub3QuCisKKwlOb3RlIHRoYXQgdGhlIHB0cmFjZSBjaGVjayBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvCisJcHJldmVudCBCLzIvaSwgaXQgaXMgZW5vdWdoIHRvIGNoZWNrIGlmIG1vdW50IG93bmVyIGhhcyBlbm91Z2gKKwlwcml2aWxlZ2UgdG8gc2VuZCBzaWduYWwgdG8gdGhlIHByb2Nlc3MgYWNjZXNzaW5nIHRoZQorCWZpbGVzeXN0ZW0sIHNpbmNlIFNJR1NUT1AgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgc2ltaWxhciBlZmZlY3QuCisKK0kgdGhpbmsgdGhlc2UgbGltaXRhdGlvbnMgYXJlIHVuYWNjZXB0YWJsZT8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgYSBzeXNhZG1pbiB0cnVzdHMgdGhlIHVzZXJzIGVub3VnaCwgb3IgY2FuIGVuc3VyZSB0aHJvdWdoIG90aGVyCittZWFzdXJlcywgdGhhdCBzeXN0ZW0gcHJvY2Vzc2VzIHdpbGwgbmV2ZXIgZW50ZXIgbm9uLXByaXZpbGVnZWQKK21vdW50cywgaXQgY2FuIHJlbGF4IHRoZSBsYXN0IGxpbWl0YXRpb24gd2l0aCBhICJ1c2VyX2FsbG93X290aGVyIgorY29uZmlnIG9wdGlvbi4gIElmIHRoaXMgY29uZmlnIG9wdGlvbiBpcyBzZXQsIHRoZSBtb3VudGluZyB1c2VyIGNhbgorYWRkIHRoZSAiYWxsb3dfb3RoZXIiIG1vdW50IG9wdGlvbiB3aGljaCBkaXNhYmxlcyB0aGUgY2hlY2sgZm9yIG90aGVyCit1c2VycycgcHJvY2Vzc2VzLgorCitLZXJuZWwgLSB1c2Vyc3BhY2UgaW50ZXJmYWNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyBob3cgYSBmaWxlc3lzdGVtIG9wZXJhdGlvbiAoaW4gdGhpcworZXhhbXBsZSB1bmxpbmspIGlzIHBlcmZvcm1lZCBpbiBGVVNFLgorCitOT1RFOiBldmVyeXRoaW5nIGluIHRoaXMgZGVzY3JpcHRpb24gaXMgZ3JlYXRseSBzaW1wbGlmaWVkCisKKyB8ICAicm0gL21udC9mdXNlL2ZpbGUiICAgICAgICAgICAgICAgfCAgRlVTRSBmaWxlc3lzdGVtIGRhZW1vbgorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgID5zeXNfcmVhZCgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPmZ1c2VfZGV2X3JlYWQoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgPnJlcXVlc3Rfd2FpdCgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIFtzbGVlcCBvbiBmYy0+d2FpdHFdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICA+c3lzX3VubGluaygpICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgPmZ1c2VfdW5saW5rKCkgICAgICAgICAgICAgICAgICB8CisgfCAgICAgIFtnZXQgcmVxdWVzdCBmcm9tICAgICAgICAgICAgIHwKKyB8ICAgICAgIGZjLT51bnVzZWRfbGlzdF0gICAgICAgICAgICAgfAorIHwgICAgICA+cmVxdWVzdF9zZW5kKCkgICAgICAgICAgICAgICB8CisgfCAgICAgICAgW3F1ZXVlIHJlcSBvbiBmYy0+cGVuZGluZ10gIHwKKyB8ICAgICAgICBbd2FrZSB1cCBmYy0+d2FpdHFdICAgICAgICAgfCAgICAgICAgW3dva2VuIHVwXQorIHwgICAgICAgID5yZXF1ZXN0X3dhaXRfYW5zd2VyKCkgICAgICB8CisgfCAgICAgICAgICBbc2xlZXAgb24gcmVxLT53YWl0cV0gICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIDxyZXF1ZXN0X3dhaXQoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3JlbW92ZSByZXEgZnJvbSBmYy0+cGVuZGluZ10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtjb3B5IHJlcSB0byByZWFkIGJ1ZmZlcl0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFthZGQgcmVxIHRvIGZjLT5wcm9jZXNzaW5nXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDxmdXNlX2Rldl9yZWFkKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPHN5c19yZWFkKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbcGVyZm9ybSB1bmxpbmtdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPnN5c193cml0ZSgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPmZ1c2VfZGV2X3dyaXRlKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtsb29rIHVwIHJlcSBpbiBmYy0+cHJvY2Vzc2luZ10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtyZW1vdmUgZnJvbSBmYy0+cHJvY2Vzc2luZ10KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtjb3B5IHdyaXRlIGJ1ZmZlciB0byByZXFdCisgfCAgICAgICAgICBbd29rZW4gdXBdICAgICAgICAgICAgICAgIHwgICAgICBbd2FrZSB1cCByZXEtPndhaXRxXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDxmdXNlX2Rldl93cml0ZSgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDxzeXNfd3JpdGUoKQorIHwgICAgICAgIDxyZXF1ZXN0X3dhaXRfYW5zd2VyKCkgICAgICB8CisgfCAgICAgIDxyZXF1ZXN0X3NlbmQoKSAgICAgICAgICAgICAgIHwKKyB8ICAgICAgW2FkZCByZXF1ZXN0IHRvICAgICAgICAgICAgICAgfAorIHwgICAgICAgZmMtPnVudXNlZF9saXN0XSAgICAgICAgICAgICB8CisgfCAgICA8ZnVzZV91bmxpbmsoKSAgICAgICAgICAgICAgICAgIHwKKyB8ICA8c3lzX3VubGluaygpICAgICAgICAgICAgICAgICAgICAgfAorCitUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygd2F5cyBpbiB3aGljaCB0byBkZWFkbG9jayBhIEZVU0UgZmlsZXN5c3RlbS4KK1NpbmNlIHdlIGFyZSB0YWxraW5nIGFib3V0IHVucHJpdmlsZWdlZCB1c2Vyc3BhY2UgcHJvZ3JhbXMsCitzb21ldGhpbmcgbXVzdCBiZSBkb25lIGFib3V0IHRoZXNlLgorCitTY2VuYXJpbyAxIC0gIFNpbXBsZSBkZWFkbG9jaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIHwgICJybSAvbW50L2Z1c2UvZmlsZSIgICAgICAgICAgICAgICB8ICBGVVNFIGZpbGVzeXN0ZW0gZGFlbW9uCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICA+c3lzX3VubGluaygiL21udC9mdXNlL2ZpbGUiKSAgICAgfAorIHwgICAgW2FjcXVpcmUgaW5vZGUgc2VtYXBob3JlICAgICAgICB8CisgfCAgICAgZm9yICJmaWxlIl0gICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgID5mdXNlX3VubGluaygpICAgICAgICAgICAgICAgICAgfAorIHwgICAgICBbc2xlZXAgb24gcmVxLT53YWl0cV0gICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDxzeXNfcmVhZCgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgID5zeXNfdW5saW5rKCIvbW50L2Z1c2UvZmlsZSIpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgW2FjcXVpcmUgaW5vZGUgc2VtYXBob3JlCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIGZvciAiZmlsZSJdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgKkRFQURMT0NLKgorCitUaGUgc29sdXRpb24gZm9yIHRoaXMgaXMgdG8gYWxsb3cgcmVxdWVzdHMgdG8gYmUgaW50ZXJydXB0ZWQgd2hpbGUKK3RoZXkgYXJlIGluIHVzZXJzcGFjZToKKworIHwgICAgICBbaW50ZXJydXB0ZWQgYnkgc2lnbmFsXSAgICAgICB8CisgfCAgICA8ZnVzZV91bmxpbmsoKSAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIFtyZWxlYXNlIHNlbWFwaG9yZV0gICAgICAgICAgICAgfCAgICBbc2VtYXBob3JlIGFjcXVpcmVkXQorIHwgIDxzeXNfdW5saW5rKCkgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgPmZ1c2VfdW5saW5rKCkKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFtxdWV1ZSByZXEgb24gZmMtPnBlbmRpbmddCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbd2FrZSB1cCBmYy0+d2FpdHFdCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbc2xlZXAgb24gcmVxLT53YWl0cV0KKworSWYgdGhlIGZpbGVzeXN0ZW0gZGFlbW9uIHdhcyBzaW5nbGUgdGhyZWFkZWQsIHRoaXMgd2lsbCBzdG9wIGhlcmUsCitzaW5jZSB0aGVyZSdzIG5vIG90aGVyIHRocmVhZCB0byBkZXF1ZXVlIGFuZCBleGVjdXRlIHRoZSByZXF1ZXN0LgorSW4gdGhpcyBjYXNlIHRoZSBzb2x1dGlvbiBpcyB0byBraWxsIHRoZSBGVVNFIGRhZW1vbiBhcyB3ZWxsLiAgSWYKK3RoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aW5nIHRocmVhZHMsIHlvdSBqdXN0IGhhdmUgdG8ga2lsbCB0aGVtIGFzCitsb25nIGFzIGFueSByZW1haW4uCisKK01vcmFsOiBhIGZpbGVzeXN0ZW0gd2hpY2ggZGVhZGxvY2tzLCBjYW4gc29vbiBmaW5kIGl0c2VsZiBkZWFkLgorCitTY2VuYXJpbyAyIC0gVHJpY2t5IGRlYWRsb2NrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgb25lIG5lZWRzIGEgY2FyZWZ1bGx5IGNyYWZ0ZWQgZmlsZXN5c3RlbS4gIEl0J3MgYSB2YXJpYXRpb24gb24KK3RoZSBhYm92ZSwgb25seSB0aGUgY2FsbCBiYWNrIHRvIHRoZSBmaWxlc3lzdGVtIGlzIG5vdCBleHBsaWNpdCwKK2J1dCBpcyBjYXVzZWQgYnkgYSBwYWdlZmF1bHQuCisKKyB8ICBLYW1pa2F6ZSBmaWxlc3lzdGVtIHRocmVhZCAxICAgICAgfCAgS2FtaWthemUgZmlsZXN5c3RlbSB0aHJlYWQgMgorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgW2ZkID0gb3BlbigiL21udC9mdXNlL2ZpbGUiKV0gICAgIHwgIFtyZXF1ZXN0IHNlcnZlZCBub3JtYWxseV0KKyB8ICBbbW1hcCBmZCB0byAnYWRkciddICAgICAgICAgICAgICAgfAorIHwgIFtjbG9zZSBmZF0gICAgICAgICAgICAgICAgICAgICAgICB8ICBbRkxVU0ggdHJpZ2dlcnMgJ21hZ2ljJyBmbGFnXQorIHwgIFtyZWFkIGEgYnl0ZSBmcm9tIGFkZHJdICAgICAgICAgICB8CisgfCAgICA+ZG9fcGFnZV9mYXVsdCgpICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgW2ZpbmQgb3IgY3JlYXRlIHBhZ2VdICAgICAgICAgfAorIHwgICAgICBbbG9jayBwYWdlXSAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgID5mdXNlX3JlYWRwYWdlKCkgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgW3F1ZXVlIFJFQUQgcmVxdWVzdF0gICAgICAgfAorIHwgICAgICAgICBbc2xlZXAgb24gcmVxLT53YWl0cV0gICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFtyZWFkIHJlcXVlc3QgdG8gYnVmZmVyXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbY3JlYXRlIHJlcGx5IGhlYWRlciBiZWZvcmUgYWRkcl0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgPnN5c193cml0ZShhZGRyIC0gaGVhZGVybGVuZ3RoKQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgID5mdXNlX2Rldl93cml0ZSgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbbG9vayB1cCByZXEgaW4gZmMtPnByb2Nlc3NpbmddCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbcmVtb3ZlIGZyb20gZmMtPnByb2Nlc3NpbmddCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbY29weSB3cml0ZSBidWZmZXIgdG8gcmVxXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICA+ZG9fcGFnZV9mYXVsdCgpCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIFtmaW5kIG9yIGNyZWF0ZSBwYWdlXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBbbG9jayBwYWdlXQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAqIERFQURMT0NLICoKKworU29sdXRpb24gaXMgYWdhaW4gdG8gbGV0IHRoZSB0aGUgcmVxdWVzdCBiZSBpbnRlcnJ1cHRlZCAobm90CitlbGFib3JhdGVkIGZ1cnRoZXIpLgorCitBbiBhZGRpdGlvbmFsIHByb2JsZW0gaXMgdGhhdCB3aGlsZSB0aGUgd3JpdGUgYnVmZmVyIGlzIGJlaW5nCitjb3BpZWQgdG8gdGhlIHJlcXVlc3QsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIGludGVycnVwdGVkLiAgVGhpcworaXMgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgY29weSBtYXkgbm90IGJlIHZhbGlkCithZnRlciB0aGUgcmVxdWVzdCBpcyBpbnRlcnJ1cHRlZC4KKworVGhpcyBpcyBzb2x2ZWQgd2l0aCBkb2luZyB0aGUgY29weSBhdG9taWNhbGx5LCBhbmQgYWxsb3dpbmcKK2ludGVycnVwdGlvbiB3aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUKK2ZhdWx0ZWQgd2l0aCBnZXRfdXNlcl9wYWdlcygpLiAgVGhlICdyZXEtPmxvY2tlZCcgZmxhZyBpbmRpY2F0ZXMKK3doZW4gdGhlIGNvcHkgaXMgdGFraW5nIHBsYWNlLCBhbmQgaW50ZXJydXB0aW9uIGlzIGRlbGF5ZWQgdW50aWwKK3RoaXMgZmxhZyBpcyB1bnNldC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKaW5kZXggZWVmNGFjYTAuLmE1ZmJjOGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dApAQCAtNDM5LDYgKzQzOSwxOCBAQAogCiBOb3RlLCBhIHRlY2huaWNhbCBDaGFuZ2VMb2cgYWltZWQgYXQga2VybmVsIGhhY2tlcnMgaXMgaW4gZnMvbnRmcy9DaGFuZ2VMb2cuCiAKKzIuMS4yNDoKKwktIFN1cHBvcnQgam91cm5hbHMgKCRMb2dGaWxlKSB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgY2hrZHNrLiAgVGhpcworCSAgbWVhbnMgdXNlcnMgY2FuIGJvb3QgaW50byBXaW5kb3dzIGFmdGVyIHdlIG1hcmtlZCB0aGUgdm9sdW1lIGRpcnR5LgorCSAgVGhlIFdpbmRvd3MgYm9vdCB3aWxsIHJ1biBjaGtkc2sgYW5kIHRoZW4gcmVib290LiAgVGhlIHVzZXIgY2FuIHRoZW4KKwkgIGltbWVkaWF0ZWx5IGJvb3QgaW50byBMaW51eCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gZG8gYSBmdWxsIFdpbmRvd3MKKwkgIGJvb3QgZmlyc3QgYmVmb3JlIHJlYm9vdGluZyBpbnRvIExpbnV4IGFuZCB3ZSB3aWxsIHJlY29nbml6ZSBzdWNoIGEKKwkgIGpvdXJuYWwgYW5kIGVtcHR5IGl0IGFzIGl0IGlzIGNsZWFuIGJ5IGRlZmluaXRpb24uCisJLSBTdXBwb3J0IGpvdXJuYWxzICgkTG9nRmlsZSkgd2l0aCBvbmx5IG9uZSByZXN0YXJ0IHBhZ2UgYXMgd2VsbCBhcworCSAgam91cm5hbHMgd2l0aCB0d28gZGlmZmVyZW50IHJlc3RhcnQgcGFnZXMuICBXZSBzYW5pdHkgY2hlY2sgYm90aCBhbmQKKwkgIGVpdGhlciB1c2UgdGhlIG9ubHkgc2FuZSBvbmUgb3IgdGhlIG1vcmUgcmVjZW50IG9uZSBvZiB0aGUgdHdvIGluIHRoZQorCSAgY2FzZSB0aGF0IGJvdGggYXJlIHZhbGlkLgorCS0gTG90cyBvZiBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cyBhY3Jvc3MgdGhlIGJvYXJkLgogMi4xLjIzOgogCS0gU3RhbXAgdGhlIHVzZXIgc3BhY2Ugam91cm5hbCwgYWthIHRyYW5zYWN0aW9uIGxvZywgYWthICRVc25Kcm5sLCBpZgogCSAgaXQgaXMgcHJlc2VudCBhbmQgYWN0aXZlIHRodXMgdGVsbGluZyBXaW5kb3dzIGFuZCBhcHBsaWNhdGlvbnMgdXNpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDUwMjRiYTcuLmQ0NzczNTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTI0MSwxNiArMTI0MSwzOCBAQAogb3ZlcmNvbW1pdF9tZW1vcnkKIC0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZmlsZSAgY29udGFpbnMgIG9uZSAgdmFsdWUuICBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkIHRvIGRlY2lkZSBpZgotdGhlcmUncyBlbm91Z2ggIG1lbW9yeTogIGlmICB0aGUgIHZhbHVlIG9mIG92ZXJjb21taXRfbWVtb3J5IGlzIHBvc2l0aXZlLCB0aGVuCi10aGVyZSdzIGFsd2F5cyAgZW5vdWdoICBtZW1vcnkuIFRoaXMgaXMgYSB1c2VmdWwgZmVhdHVyZSwgc2luY2UgcHJvZ3JhbXMgb2Z0ZW4KLW1hbGxvYygpIGh1Z2UgIGFtb3VudHMgIG9mICBtZW1vcnkgJ2p1c3QgaW4gY2FzZScsIHdoaWxlIHRoZXkgb25seSB1c2UgYSBzbWFsbAotcGFydCBvZiAgaXQuICBMZWF2aW5nICB0aGlzIHZhbHVlIGF0IDAgd2lsbCBsZWFkIHRvIHRoZSBmYWlsdXJlIG9mIHN1Y2ggYSBodWdlCi1tYWxsb2MoKSwgd2hlbiBpbiBmYWN0IHRoZSBzeXN0ZW0gaGFzIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBwcm9ncmFtIHRvIHJ1bi4KK0NvbnRyb2xzIG92ZXJjb21taXQgb2Ygc3lzdGVtIG1lbW9yeSwgcG9zc2libHkgYWxsb3dpbmcgcHJvY2Vzc2VzCit0byBhbGxvY2F0ZSAoYnV0IG5vdCB1c2UpIG1vcmUgbWVtb3J5IHRoYW4gaXMgYWN0dWFsbHkgYXZhaWxhYmxlLgogCi1PbiB0aGUgIG90aGVyICBoYW5kLCAgZW5hYmxpbmcgdGhpcyBmZWF0dXJlIGNhbiBjYXVzZSB5b3UgdG8gcnVuIG91dCBvZiBtZW1vcnkKLWFuZCB0aHJhc2ggdGhlIHN5c3RlbSB0byBkZWF0aCwgc28gbGFyZ2UgYW5kL29yIGltcG9ydGFudCBzZXJ2ZXJzIHdpbGwgd2FudCB0bwotc2V0IHRoaXMgdmFsdWUgdG8gMC4KKworMAktCUhldXJpc3RpYyBvdmVyY29tbWl0IGhhbmRsaW5nLiBPYnZpb3VzIG92ZXJjb21taXRzIG9mCisJCWFkZHJlc3Mgc3BhY2UgYXJlIHJlZnVzZWQuIFVzZWQgZm9yIGEgdHlwaWNhbCBzeXN0ZW0uIEl0CisJCWVuc3VyZXMgYSBzZXJpb3VzbHkgd2lsZCBhbGxvY2F0aW9uIGZhaWxzIHdoaWxlIGFsbG93aW5nCisJCW92ZXJjb21taXQgdG8gcmVkdWNlIHN3YXAgdXNhZ2UuICByb290IGlzIGFsbG93ZWQgdG8KKwkJYWxsb2NhdGUgc2xpZ2hseSBtb3JlIG1lbW9yeSBpbiB0aGlzIG1vZGUuIFRoaXMgaXMgdGhlCisJCWRlZmF1bHQuCisKKzEJLQlBbHdheXMgb3ZlcmNvbW1pdC4gQXBwcm9wcmlhdGUgZm9yIHNvbWUgc2NpZW50aWZpYworCQlhcHBsaWNhdGlvbnMuCisKKzIJLQlEb24ndCBvdmVyY29tbWl0LiBUaGUgdG90YWwgYWRkcmVzcyBzcGFjZSBjb21taXQKKwkJZm9yIHRoZSBzeXN0ZW0gaXMgbm90IHBlcm1pdHRlZCB0byBleGNlZWQgc3dhcCBwbHVzIGEKKwkJY29uZmlndXJhYmxlIHBlcmNlbnRhZ2UgKGRlZmF1bHQgaXMgNTApIG9mIHBoeXNpY2FsIFJBTS4KKwkJRGVwZW5kaW5nIG9uIHRoZSBwZXJjZW50YWdlIHlvdSB1c2UsIGluIG1vc3Qgc2l0dWF0aW9ucworCQl0aGlzIG1lYW5zIGEgcHJvY2VzcyB3aWxsIG5vdCBiZSBraWxsZWQgd2hpbGUgYXR0ZW1wdGluZworCQl0byB1c2UgYWxyZWFkeS1hbGxvY2F0ZWQgbWVtb3J5IGJ1dCB3aWxsIHJlY2VpdmUgZXJyb3JzCisJCW9uIG1lbW9yeSBhbGxvY2F0aW9uIGFzCWFwcHJvcHJpYXRlLgorCitvdmVyY29tbWl0X3JhdGlvCistLS0tLS0tLS0tLS0tLS0tCisKK1BlcmNlbnRhZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5IHNpemUgdG8gaW5jbHVkZSBpbiBvdmVyY29tbWl0IGNhbGN1bGF0aW9ucworKHNlZSBhYm92ZS4pCisKK01lbW9yeSBhbGxvY2F0aW9uIGxpbWl0ID0gc3dhcHNwYWNlICsgcGh5c21lbSAqIChvdmVyY29tbWl0X3JhdGlvIC8gMTAwKQorCisJc3dhcHNwYWNlID0gdG90YWwgc2l6ZSBvZiBhbGwgc3dhcCBhcmVhcworCXBoeXNtZW0gPSBzaXplIG9mIHBoeXNpY2FsIG1lbW9yeSBpbiBzeXN0ZW0KIAogbnJfaHVnZXBhZ2VzIGFuZCBodWdldGxiX3NobV9ncm91cAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yZWxheWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXlmcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0ZTFiMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXlmcy50eHQKQEAgLTAsMCArMSwzNjIgQEAKKworcmVsYXlmcyAtIGEgaGlnaC1zcGVlZCBkYXRhIHJlbGF5IGZpbGVzeXN0ZW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3JlbGF5ZnMgaXMgYSBmaWxlc3lzdGVtIGRlc2lnbmVkIHRvIHByb3ZpZGUgYW4gZWZmaWNpZW50IG1lY2hhbmlzbSBmb3IKK3Rvb2xzIGFuZCBmYWNpbGl0aWVzIHRvIHJlbGF5IGxhcmdlIGFuZCBwb3RlbnRpYWxseSBzdXN0YWluZWQgc3RyZWFtcworb2YgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLgorCitUaGUgbWFpbiBhYnN0cmFjdGlvbiBvZiByZWxheWZzIGlzIHRoZSAnY2hhbm5lbCcuICBBIGNoYW5uZWwgY29uc2lzdHMKK29mIGEgc2V0IG9mIHBlci1jcHUga2VybmVsIGJ1ZmZlcnMgZWFjaCByZXByZXNlbnRlZCBieSBhIGZpbGUgaW4gdGhlCityZWxheWZzIGZpbGVzeXN0ZW0uICBLZXJuZWwgY2xpZW50cyB3cml0ZSBpbnRvIGEgY2hhbm5lbCB1c2luZworZWZmaWNpZW50IHdyaXRlIGZ1bmN0aW9ucyB3aGljaCBhdXRvbWF0aWNhbGx5IGxvZyB0byB0aGUgY3VycmVudCBjcHUncworY2hhbm5lbCBidWZmZXIuICBVc2VyIHNwYWNlIGFwcGxpY2F0aW9ucyBtbWFwKCkgdGhlIHBlci1jcHUgZmlsZXMgYW5kCityZXRyaWV2ZSB0aGUgZGF0YSBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKworVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBsb2dnZWQgaW50byB0aGUgY2hhbm5lbCBidWZmZXJzIGlzIGNvbXBsZXRlbHkKK3VwIHRvIHRoZSByZWxheWZzIGNsaWVudDsgcmVsYXlmcyBkb2VzIGhvd2V2ZXIgcHJvdmlkZSBob29rcyB3aGljaAorYWxsb3cgY2xpZW50cyB0byBpbXBvc2Ugc29tZSBzdHVjdHVyZSBvbiB0aGUgYnVmZmVyIGRhdGEuICBOb3IgZG9lcworcmVsYXlmcyBpbXBsZW1lbnQgYW55IGZvcm0gb2YgZGF0YSBmaWx0ZXJpbmcgLSB0aGlzIGFsc28gaXMgbGVmdCB0bwordGhlIGNsaWVudC4gIFRoZSBwdXJwb3NlIGlzIHRvIGtlZXAgcmVsYXlmcyBhcyBzaW1wbGUgYXMgcG9zc2libGUuCisKK1RoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIHJlbGF5ZnMgQVBJLiAgVGhlIGRldGFpbHMgb2YKK3RoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIGZ1bmN0aW9ucyBpbiB0aGUKK2ZpbGVzeXN0ZW0gY29kZSAtIHBsZWFzZSBzZWUgdGhhdCBmb3IgZGV0YWlscy4KKworU2VtYW50aWNzCis9PT09PT09PT0KKworRWFjaCByZWxheWZzIGNoYW5uZWwgaGFzIG9uZSBidWZmZXIgcGVyIENQVSwgZWFjaCBidWZmZXIgaGFzIG9uZSBvcgorbW9yZSBzdWItYnVmZmVycy4gTWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGZpcnN0IHN1Yi1idWZmZXIgdW50aWwKK2l0IGlzIHRvbyBmdWxsIHRvIGNvbnRhaW4gYSBuZXcgbWVzc2FnZSwgaW4gd2hpY2ggY2FzZSBpdCBpdCBpcword3JpdHRlbiB0byB0aGUgbmV4dCAoaWYgYXZhaWxhYmxlKS4gIE1lc3NhZ2VzIGFyZSBuZXZlciBzcGxpdCBhY3Jvc3MKK3N1Yi1idWZmZXJzLiAgQXQgdGhpcyBwb2ludCwgdXNlcnNwYWNlIGNhbiBiZSBub3RpZmllZCBzbyBpdCBlbXB0aWVzCit0aGUgZmlyc3Qgc3ViLWJ1ZmZlciwgd2hpbGUgdGhlIGtlcm5lbCBjb250aW51ZXMgd3JpdGluZyB0byB0aGUgbmV4dC4KKworV2hlbiBub3RpZmllZCB0aGF0IGEgc3ViLWJ1ZmZlciBpcyBmdWxsLCB0aGUga2VybmVsIGtub3dzIGhvdyBtYW55CitieXRlcyBvZiBpdCBhcmUgcGFkZGluZyBpLmUuIHVudXNlZC4gIFVzZXJzcGFjZSBjYW4gdXNlIHRoaXMga25vd2xlZGdlCit0byBjb3B5IG9ubHkgdmFsaWQgZGF0YS4KKworQWZ0ZXIgY29weWluZyBpdCwgdXNlcnNwYWNlIGNhbiBub3RpZnkgdGhlIGtlcm5lbCB0aGF0IGEgc3ViLWJ1ZmZlcgoraGFzIGJlZW4gY29uc3VtZWQuCisKK3JlbGF5ZnMgY2FuIG9wZXJhdGUgaW4gYSBtb2RlIHdoZXJlIGl0IHdpbGwgb3ZlcndyaXRlIGRhdGEgbm90IHlldAorY29sbGVjdGVkIGJ5IHVzZXJzcGFjZSwgYW5kIG5vdCB3YWl0IGZvciBpdCB0byBjb25zdW1lIGl0LgorCityZWxheWZzIGl0c2VsZiBkb2VzIG5vdCBwcm92aWRlIGZvciBjb21tdW5pY2F0aW9uIG9mIHN1Y2ggZGF0YSBiZXR3ZWVuCit1c2Vyc3BhY2UgYW5kIGtlcm5lbCwgYWxsb3dpbmcgdGhlIGtlcm5lbCBzaWRlIHRvIHJlbWFpbiBzaW1wbGUgYW5kIG5vdAoraW1wb3NlIGEgc2luZ2xlIGludGVyZmFjZSBvbiB1c2Vyc3BhY2UuIEl0IGRvZXMgcHJvdmlkZSBhIHNlcGFyYXRlCitoZWxwZXIgdGhvdWdoLCBkZXNjcmliZWQgYmVsb3cuCisKK2tsb2csIHJlbGF5LWFwcCAmIGxpYnJlbGF5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCityZWxheWZzIGl0c2VsZiBpcyByZWFkeSB0byB1c2UsIGJ1dCB0byBtYWtlIHRoaW5ncyBlYXNpZXIsIHR3bworYWRkaXRpb25hbCBzeXN0ZW1zIGFyZSBwcm92aWRlZC4gIGtsb2cgaXMgYSBzaW1wbGUgd3JhcHBlciB0byBtYWtlCit3cml0aW5nIGZvcm1hdHRlZCB0ZXh0IG9yIHJhdyBkYXRhIHRvIGEgY2hhbm5lbCBzaW1wbGVyLCByZWdhcmRsZXNzIG9mCit3aGV0aGVyIGEgY2hhbm5lbCB0byB3cml0ZSBpbnRvIGV4aXN0cyBvciBub3QsIG9yIHdoZXRoZXIgcmVsYXlmcyBpcworY29tcGlsZWQgaW50byB0aGUga2VybmVsIG9yIGlzIGNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUuICByZWxheS1hcHAgaXMKK3RoZSBrZXJuZWwgY291bnRlcnBhcnQgb2YgdXNlcnNwYWNlIGxpYnJlbGF5LmMsIGNvbWJpbmVkIHRoZXNlIHR3bworZmlsZXMgcHJvdmlkZSBnbHVlIHRvIGVhc2lseSBzdHJlYW0gZGF0YSB0byBkaXNrLCB3aXRob3V0IGhhdmluZyB0bworYm90aGVyIHdpdGggaG91c2VrZWVwaW5nLiAga2xvZyBhbmQgcmVsYXktYXBwIGNhbiBiZSB1c2VkIHRvZ2V0aGVyLAord2l0aCBrbG9nIHByb3ZpZGluZyBoaWdoLWxldmVsIGxvZ2dpbmcgZnVuY3Rpb25zIHRvIHRoZSBrZXJuZWwgYW5kCityZWxheS1hcHAgdGFraW5nIGNhcmUgb2Yga2VybmVsLXVzZXIgY29udHJvbCBhbmQgZGlzay1sb2dnaW5nIGNob3Jlcy4KKworSXQgaXMgcG9zc2libGUgdG8gdXNlIHJlbGF5ZnMgd2l0aG91dCByZWxheS1hcHAgJiBsaWJyZWxheSwgYnV0IHlvdSdsbAoraGF2ZSB0byBpbXBsZW1lbnQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLCBhbGxvd2luZworYm90aCB0byBjb252ZXkgdGhlIHN0YXRlIG9mIGJ1ZmZlcnMgKGZ1bGwsIGVtcHR5LCBhbW91bnQgb2YgcGFkZGluZykuCisKK2tsb2csIHJlbGF5LWFwcCBhbmQgbGlicmVsYXkgY2FuIGJlIGZvdW5kIGluIHRoZSByZWxheS1hcHBzIHRhcmJhbGwgb24KK2h0dHA6Ly9yZWxheWZzLnNvdXJjZWZvcmdlLm5ldAorCitUaGUgcmVsYXlmcyB1c2VyIHNwYWNlIEFQSQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcmVsYXlmcyBpbXBsZW1lbnRzIGJhc2ljIGZpbGUgb3BlcmF0aW9ucyBmb3IgdXNlciBzcGFjZSBhY2Nlc3MgdG8KK3JlbGF5ZnMgY2hhbm5lbCBidWZmZXIgZGF0YS4gIEhlcmUgYXJlIHRoZSBmaWxlIG9wZXJhdGlvbnMgdGhhdCBhcmUKK2F2YWlsYWJsZSBhbmQgc29tZSBjb21tZW50cyByZWdhcmRpbmcgdGhlaXIgYmVoYXZpb3I6CisKK29wZW4oKQkgZW5hYmxlcyB1c2VyIHRvIG9wZW4gYW4gX2V4aXN0aW5nXyBidWZmZXIuCisKK21tYXAoKQkgcmVzdWx0cyBpbiBjaGFubmVsIGJ1ZmZlciBiZWluZyBtYXBwZWQgaW50byB0aGUgY2FsbGVyJ3MKKwkgbWVtb3J5IHNwYWNlLiBOb3RlIHRoYXQgeW91IGNhbid0IGRvIGEgcGFydGlhbCBtbWFwIC0geW91IG11c3QKKwkgbWFwIHRoZSBlbnRpcmUgZmlsZSwgd2hpY2ggaXMgTlJCVUYgKiBTVUJCVUZTSVpFLgorCityZWFkKCkJIHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgY2hhbm5lbCBidWZmZXIuICBUaGUgYnl0ZXMgcmVhZCBhcmUKKwkgJ2NvbnN1bWVkJyBieSB0aGUgcmVhZGVyIGkuZS4gdGhleSB3b24ndCBiZSBhdmFpbGFibGUgYWdhaW4KKwkgdG8gc3Vic2VxdWVudCByZWFkcy4gIElmIHRoZSBjaGFubmVsIGlzIGJlaW5nIHVzZWQgaW4KKwkgbm8tb3ZlcndyaXRlIG1vZGUgKHRoZSBkZWZhdWx0KSwgaXQgY2FuIGJlIHJlYWQgYXQgYW55IHRpbWUKKwkgZXZlbiBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBrZXJuZWwgd3JpdGVyLiAgSWYgdGhlIGNoYW5uZWwgaXMKKwkgYmVpbmcgdXNlZCBpbiBvdmVyd3JpdGUgbW9kZSBhbmQgdGhlcmUgYXJlIGFjdGl2ZSBjaGFubmVsCisJIHdyaXRlcnMsIHJlc3VsdHMgbWF5IGJlIHVucHJlZGljdGFibGUgLSB1c2VycyBzaG91bGQgbWFrZQorCSBzdXJlIHRoYXQgYWxsIGxvZ2dpbmcgdG8gdGhlIGNoYW5uZWwgaGFzIGVuZGVkIGJlZm9yZSB1c2luZworCSByZWFkKCkgd2l0aCBvdmVyd3JpdGUgbW9kZS4KKworcG9sbCgpCSBQT0xMSU4vUE9MTFJETk9STS9QT0xMRVJSIHN1cHBvcnRlZC4gIFVzZXIgYXBwbGljYXRpb25zIGFyZQorCSBub3RpZmllZCB3aGVuIHN1Yi1idWZmZXIgYm91bmRhcmllcyBhcmUgY3Jvc3NlZC4KKworY2xvc2UoKSBkZWNyZW1lbnRzIHRoZSBjaGFubmVsIGJ1ZmZlcidzIHJlZmNvdW50LiAgV2hlbiB0aGUgcmVmY291bnQKKwlyZWFjaGVzIDAgaS5lLiB3aGVuIG5vIHByb2Nlc3Mgb3Iga2VybmVsIGNsaWVudCBoYXMgdGhlIGJ1ZmZlcgorCW9wZW4sIHRoZSBjaGFubmVsIGJ1ZmZlciBpcyBmcmVlZC4KKworCitJbiBvcmRlciBmb3IgYSB1c2VyIGFwcGxpY2F0aW9uIHRvIG1ha2UgdXNlIG9mIHJlbGF5ZnMgZmlsZXMsIHRoZQorcmVsYXlmcyBmaWxlc3lzdGVtIG11c3QgYmUgbW91bnRlZC4gIEZvciBleGFtcGxlLAorCisJbW91bnQgLXQgcmVsYXlmcyByZWxheWZzIC9tbnQvcmVsYXkKKworTk9URToJcmVsYXlmcyBkb2Vzbid0IG5lZWQgdG8gYmUgbW91bnRlZCBmb3Iga2VybmVsIGNsaWVudHMgdG8gY3JlYXRlCisJb3IgdXNlIGNoYW5uZWxzIC0gaXQgb25seSBuZWVkcyB0byBiZSBtb3VudGVkIHdoZW4gdXNlciBzcGFjZQorCWFwcGxpY2F0aW9ucyBuZWVkIGFjY2VzcyB0byB0aGUgYnVmZmVyIGRhdGEuCisKKworVGhlIHJlbGF5ZnMga2VybmVsIEFQSQorPT09PT09PT09PT09PT09PT09PT09PQorCitIZXJlJ3MgYSBzdW1tYXJ5IG9mIHRoZSBBUEkgcmVsYXlmcyBwcm92aWRlcyB0byBpbi1rZXJuZWwgY2xpZW50czoKKworCisgIGNoYW5uZWwgbWFuYWdlbWVudCBmdW5jdGlvbnM6CisKKyAgICByZWxheV9vcGVuKGJhc2VfZmlsZW5hbWUsIHBhcmVudCwgc3ViYnVmX3NpemUsIG5fc3ViYnVmcywKKyAgICAgICAgICAgICAgIGNhbGxiYWNrcykKKyAgICByZWxheV9jbG9zZShjaGFuKQorICAgIHJlbGF5X2ZsdXNoKGNoYW4pCisgICAgcmVsYXlfcmVzZXQoY2hhbikKKyAgICByZWxheWZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KQorICAgIHJlbGF5ZnNfcmVtb3ZlX2RpcihkZW50cnkpCisKKyAgY2hhbm5lbCBtYW5hZ2VtZW50IHR5cGljYWxseSBjYWxsZWQgb24gaW5zdGlnYXRpb24gb2YgdXNlcnNwYWNlOgorCisgICAgcmVsYXlfc3ViYnVmc19jb25zdW1lZChjaGFuLCBjcHUsIHN1YmJ1ZnNfY29uc3VtZWQpCisKKyAgd3JpdGUgZnVuY3Rpb25zOgorCisgICAgcmVsYXlfd3JpdGUoY2hhbiwgZGF0YSwgbGVuZ3RoKQorICAgIF9fcmVsYXlfd3JpdGUoY2hhbiwgZGF0YSwgbGVuZ3RoKQorICAgIHJlbGF5X3Jlc2VydmUoY2hhbiwgbGVuZ3RoKQorCisgIGNhbGxiYWNrczoKKworICAgIHN1YmJ1Zl9zdGFydChidWYsIHN1YmJ1ZiwgcHJldl9zdWJidWYsIHByZXZfcGFkZGluZykKKyAgICBidWZfbWFwcGVkKGJ1ZiwgZmlscCkKKyAgICBidWZfdW5tYXBwZWQoYnVmLCBmaWxwKQorCisgIGhlbHBlciBmdW5jdGlvbnM6CisKKyAgICByZWxheV9idWZfZnVsbChidWYpCisgICAgc3ViYnVmX3N0YXJ0X3Jlc2VydmUoYnVmLCBsZW5ndGgpCisKKworQ3JlYXRpbmcgYSBjaGFubmVsCistLS0tLS0tLS0tLS0tLS0tLS0KKworcmVsYXlfb3BlbigpIGlzIHVzZWQgdG8gY3JlYXRlIGEgY2hhbm5lbCwgYWxvbmcgd2l0aCBpdHMgcGVyLWNwdQorY2hhbm5lbCBidWZmZXJzLiAgRWFjaCBjaGFubmVsIGJ1ZmZlciB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBmaWxlCitjcmVhdGVkIGZvciBpdCBpbiB0aGUgcmVsYXlmcyBmaWxlc3lzdGVtLCB3aGljaCBjYW4gYmUgb3BlbmVkIGFuZAorbW1hcHBlZCBmcm9tIHVzZXIgc3BhY2UgaWYgZGVzaXJlZC4gIFRoZSBmaWxlcyBhcmUgbmFtZWQKK2Jhc2VuYW1lMC4uLmJhc2VuYW1lTi0xIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBvbmxpbmUgY3B1cywgYW5kIGJ5CitkZWZhdWx0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbS4gIElmIHlvdSB3YW50IGEKK2RpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gY29udGFpbiB5b3VyIHJlbGF5ZnMgZmlsZXMsIHlvdSBjYW4gY3JlYXRlIGl0Cit3aXRoIHJlbGF5ZnNfY3JlYXRlX2RpcigpIGFuZCBwYXNzIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHRvCityZWxheV9vcGVuKCkuICBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgdXAgYW55IGRpcmVjdG9yeQorc3RydWN0dXJlIHRoZXkgY3JlYXRlIHdoZW4gdGhlIGNoYW5uZWwgaXMgY2xvc2VkIC0gdXNlCityZWxheWZzX3JlbW92ZV9kaXIoKSBmb3IgdGhhdC4KKworVGhlIHRvdGFsIHNpemUgb2YgZWFjaCBwZXItY3B1IGJ1ZmZlciBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIHRoZQorbnVtYmVyIG9mIHN1Yi1idWZmZXJzIGJ5IHRoZSBzdWItYnVmZmVyIHNpemUgcGFzc2VkIGludG8gcmVsYXlfb3BlbigpLgorVGhlIGlkZWEgYmVoaW5kIHN1Yi1idWZmZXJzIGlzIHRoYXQgdGhleSdyZSBiYXNpY2FsbHkgYW4gZXh0ZW5zaW9uIG9mCitkb3VibGUtYnVmZmVyaW5nIHRvIE4gYnVmZmVycywgYW5kIHRoZXkgYWxzbyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8KK2Vhc2lseSBpbXBsZW1lbnQgcmFuZG9tLWFjY2Vzcy1vbi1idWZmZXItYm91bmRhcnkgc2NoZW1lcywgd2hpY2ggY2FuCitiZSBpbXBvcnRhbnQgZm9yIHNvbWUgaGlnaC12b2x1bWUgYXBwbGljYXRpb25zLiAgVGhlIG51bWJlciBhbmQgc2l6ZQorb2Ygc3ViLWJ1ZmZlcnMgaXMgY29tcGxldGVseSBkZXBlbmRlbnQgb24gdGhlIGFwcGxpY2F0aW9uIGFuZCBldmVuIGZvcgordGhlIHNhbWUgYXBwbGljYXRpb24sIGRpZmZlcmVudCBjb25kaXRpb25zIHdpbGwgd2FycmFudCBkaWZmZXJlbnQKK3ZhbHVlcyBmb3IgdGhlc2UgcGFyYW1ldGVycyBhdCBkaWZmZXJlbnQgdGltZXMuICBUeXBpY2FsbHksIHRoZSByaWdodAordmFsdWVzIHRvIHVzZSBhcmUgYmVzdCBkZWNpZGVkIGFmdGVyIHNvbWUgZXhwZXJpbWVudGF0aW9uOyBpbiBnZW5lcmFsLAordGhvdWdoLCBpdCdzIHNhZmUgdG8gYXNzdW1lIHRoYXQgaGF2aW5nIG9ubHkgMSBzdWItYnVmZmVyIGlzIGEgYmFkCitpZGVhIC0geW91J3JlIGd1YXJhbnRlZWQgdG8gZWl0aGVyIG92ZXJ3cml0ZSBkYXRhIG9yIGxvc2UgZXZlbnRzCitkZXBlbmRpbmcgb24gdGhlIGNoYW5uZWwgbW9kZSBiZWluZyB1c2VkLgorCitDaGFubmVsICdtb2RlcycKKy0tLS0tLS0tLS0tLS0tLQorCityZWxheWZzIGNoYW5uZWxzIGNhbiBiZSB1c2VkIGluIGVpdGhlciBvZiB0d28gbW9kZXMgLSAnb3ZlcndyaXRlJyBvcgorJ25vLW92ZXJ3cml0ZScuICBUaGUgbW9kZSBpcyBlbnRpcmVseSBkZXRlcm1pbmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbgorb2YgdGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLCBhcyBkZXNjcmliZWQgYmVsb3cuICBJbiAnb3ZlcndyaXRlJworbW9kZSwgYWxzbyBrbm93biBhcyAnZmxpZ2h0IHJlY29yZGVyJyBtb2RlLCB3cml0ZXMgY29udGludW91c2x5IGN5Y2xlCithcm91bmQgdGhlIGJ1ZmZlciBhbmQgd2lsbCBuZXZlciBmYWlsLCBidXQgd2lsbCB1bmNvbmRpdGlvbmFsbHkKK292ZXJ3cml0ZSBvbGQgZGF0YSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQncyBhY3R1YWxseSBiZWVuIGNvbnN1bWVkLgorSW4gbm8tb3ZlcndyaXRlIG1vZGUsIHdyaXRlcyB3aWxsIGZhaWwgaS5lLiBkYXRhIHdpbGwgYmUgbG9zdCwgaWYgdGhlCitudW1iZXIgb2YgdW5jb25zdW1lZCBzdWItYnVmZmVycyBlcXVhbHMgdGhlIHRvdGFsIG51bWJlciBvZgorc3ViLWJ1ZmZlcnMgaW4gdGhlIGNoYW5uZWwuICBJdCBzaG91bGQgYmUgY2xlYXIgdGhhdCBpZiB0aGVyZSBpcyBubworY29uc3VtZXIgb3IgaWYgdGhlIGNvbnN1bWVyIGNhbid0IGNvbnN1bWUgc3ViLWJ1ZmZlcnMgZmFzdCBlbm91Z2h0LAorZGF0YSB3aWxsIGJlIGxvc3QgaW4gZWl0aGVyIGNhc2U7IHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2hldGhlciBkYXRhCitpcyBsb3N0IGZyb20gdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIGEgYnVmZmVyLgorCitBcyBleHBsYWluZWQgYWJvdmUsIGEgcmVsYXlmcyBjaGFubmVsIGlzIG1hZGUgb2YgdXAgb25lIG9yIG1vcmUKK3Blci1jcHUgY2hhbm5lbCBidWZmZXJzLCBlYWNoIGltcGxlbWVudGVkIGFzIGEgY2lyY3VsYXIgYnVmZmVyCitzdWJkaXZpZGVkIGludG8gb25lIG9yIG1vcmUgc3ViLWJ1ZmZlcnMuICBNZXNzYWdlcyBhcmUgd3JpdHRlbiBpbnRvCit0aGUgY3VycmVudCBzdWItYnVmZmVyIG9mIHRoZSBjaGFubmVsJ3MgY3VycmVudCBwZXItY3B1IGJ1ZmZlciB2aWEgdGhlCit3cml0ZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93LiAgV2hlbmV2ZXIgYSBtZXNzYWdlIGNhbid0IGZpdCBpbnRvCit0aGUgY3VycmVudCBzdWItYnVmZmVyLCBiZWNhdXNlIHRoZXJlJ3Mgbm8gcm9vbSBsZWZ0IGZvciBpdCwgdGhlCitjbGllbnQgaXMgbm90aWZpZWQgdmlhIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjayB0aGF0IGEgc3dpdGNoIHRvIGEKK25ldyBzdWItYnVmZmVyIGlzIGFib3V0IHRvIG9jY3VyLiAgVGhlIGNsaWVudCB1c2VzIHRoaXMgY2FsbGJhY2sgdG8gMSkKK2luaXRpYWxpemUgdGhlIG5leHQgc3ViLWJ1ZmZlciBpZiBhcHByb3ByaWF0ZSAyKSBmaW5hbGl6ZSB0aGUgcHJldmlvdXMKK3N1Yi1idWZmZXIgaWYgYXBwcm9wcmlhdGUgYW5kIDMpIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZword2hldGhlciBvciBub3QgdG8gYWN0dWFsbHkgZ28gYWhlYWQgd2l0aCB0aGUgc3ViLWJ1ZmZlciBzd2l0Y2guCisKK1RvIGltcGxlbWVudCAnbm8tb3ZlcndyaXRlJyBtb2RlLCB0aGUgdXNlcnNwYWNlIGNsaWVudCB3b3VsZCBwcm92aWRlCithbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3ViYnVmX3N0YXJ0KCkgY2FsbGJhY2sgc29tZXRoaW5nIGxpa2UgdGhlCitmb2xsb3dpbmc6CisKK3N0YXRpYyBpbnQgc3ViYnVmX3N0YXJ0KHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN1YmJ1ZiwKKwkJCXZvaWQgKnByZXZfc3ViYnVmLAorCQkJdW5zaWduZWQgaW50IHByZXZfcGFkZGluZykKK3sKKwlpZiAocHJldl9zdWJidWYpCisJCSooKHVuc2lnbmVkICopcHJldl9zdWJidWYpID0gcHJldl9wYWRkaW5nOworCisJaWYgKHJlbGF5X2J1Zl9mdWxsKGJ1ZikpCisJCXJldHVybiAwOworCisJc3ViYnVmX3N0YXJ0X3Jlc2VydmUoYnVmLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisKKwlyZXR1cm4gMTsKK30KKworSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGZ1bGwgaS5lLiBhbGwgc3ViLWJ1ZmZlcnMgcmVtYWluIHVuY29uc3VtZWQsCit0aGUgY2FsbGJhY2sgcmV0dXJucyAwIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBzd2l0Y2ggc2hvdWxkIG5vdAorb2NjdXIgeWV0IGkuZS4gdW50aWwgdGhlIGNvbnN1bWVyIGhhcyBoYWQgYSBjaGFuY2UgdG8gcmVhZCB0aGUgY3VycmVudAorc2V0IG9mIHJlYWR5IHN1Yi1idWZmZXJzLiAgRm9yIHRoZSByZWxheV9idWZfZnVsbCgpIGZ1bmN0aW9uIHRvIG1ha2UKK3NlbnNlLCB0aGUgY29uc3VtZXIgaXMgcmVwb25zaWJsZSBmb3Igbm90aWZ5aW5nIHJlbGF5ZnMgd2hlbgorc3ViLWJ1ZmZlcnMgaGF2ZSBiZWVuIGNvbnN1bWVkIHZpYSByZWxheV9zdWJidWZzX2NvbnN1bWVkKCkuICBBbnkKK3N1YnNlcXVlbnQgYXR0ZW1wdHMgdG8gd3JpdGUgaW50byB0aGUgYnVmZmVyIHdpbGwgYWdhaW4gaW52b2tlIHRoZQorc3ViYnVmX3N0YXJ0KCkgY2FsbGJhY2sgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzOyBvbmx5IHdoZW4gdGhlCitjb25zdW1lciBoYXMgY29uc3VtZWQgb25lIG9yIG1vcmUgb2YgdGhlIHJlYWR5IHN1Yi1idWZmZXJzIHdpbGwKK3JlbGF5X2J1Zl9mdWxsKCkgcmV0dXJuIDAsIGluIHdoaWNoIGNhc2UgdGhlIGJ1ZmZlciBzd2l0Y2ggY2FuCitjb250aW51ZS4KKworVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjayBmb3IgJ292ZXJ3cml0ZScgbW9kZQord291bGQgYmUgdmVyeSBzaW1pbGFyOgorCitzdGF0aWMgaW50IHN1YmJ1Zl9zdGFydChzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzdWJidWYsCisJCQl2b2lkICpwcmV2X3N1YmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBwcmV2X3BhZGRpbmcpCit7CisJaWYgKHByZXZfc3ViYnVmKQorCQkqKCh1bnNpZ25lZCAqKXByZXZfc3ViYnVmKSA9IHByZXZfcGFkZGluZzsKKworCXN1YmJ1Zl9zdGFydF9yZXNlcnZlKGJ1Ziwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCisJcmV0dXJuIDE7Cit9CisKK0luIHRoaXMgY2FzZSwgdGhlIHJlbGF5X2J1Zl9mdWxsKCkgY2hlY2sgaXMgbWVhbmluZ2xlc3MgYW5kIHRoZQorY2FsbGJhY2sgYWx3YXlzIHJldHVybnMgMSwgY2F1c2luZyB0aGUgYnVmZmVyIHN3aXRjaCB0byBvY2N1cgordW5jb25kaXRpb25hbGx5LiAgSXQncyBhbHNvIG1lYW5pbmdsZXNzIGZvciB0aGUgY2xpZW50IHRvIHVzZSB0aGUKK3JlbGF5X3N1YmJ1ZnNfY29uc3VtZWQoKSBmdW5jdGlvbiBpbiB0aGlzIG1vZGUsIGFzIGl0J3MgbmV2ZXIKK2NvbnN1bHRlZC4KKworVGhlIGRlZmF1bHQgc3ViYnVmX3N0YXJ0KCkgaW1wbGVtZW50YXRpb24sIHVzZWQgaWYgdGhlIGNsaWVudCBkb2Vzbid0CitkZWZpbmUgYW55IGNhbGxiYWNrcywgb3IgZG9lc24ndCBkZWZpbmUgdGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLAoraW1wbGVtZW50cyB0aGUgc2ltcGxlc3QgcG9zc2libGUgJ25vLW92ZXJ3cml0ZScgbW9kZSBpLmUuIGl0IGRvZXMKK25vdGhpbmcgYnV0IHJldHVybiAwLgorCitIZWFkZXIgaW5mb3JtYXRpb24gY2FuIGJlIHJlc2VydmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzdWItYnVmZmVyCitieSBjYWxsaW5nIHRoZSBzdWJidWZfc3RhcnRfcmVzZXJ2ZSgpIGhlbHBlciBmdW5jdGlvbiBmcm9tIHdpdGhpbiB0aGUKK3N1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLiAgVGhpcyByZXNlcnZlZCBhcmVhIGNhbiBiZSB1c2VkIHRvIHN0b3JlCit3aGF0ZXZlciBpbmZvcm1hdGlvbiB0aGUgY2xpZW50IHdhbnRzLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHJvb20gaXMKK3Jlc2VydmVkIGluIGVhY2ggc3ViLWJ1ZmZlciB0byBzdG9yZSB0aGUgcGFkZGluZyBjb3VudCBmb3IgdGhhdAorc3ViLWJ1ZmZlci4gIFRoaXMgaXMgZmlsbGVkIGluIGZvciB0aGUgcHJldmlvdXMgc3ViLWJ1ZmZlciBpbiB0aGUKK3N1YmJ1Zl9zdGFydCgpIGltcGxlbWVudGF0aW9uOyB0aGUgcGFkZGluZyB2YWx1ZSBmb3IgdGhlIHByZXZpb3VzCitzdWItYnVmZmVyIGlzIHBhc3NlZCBpbnRvIHRoZSBzdWJidWZfc3RhcnQoKSBjYWxsYmFjayBhbG9uZyB3aXRoIGEKK3BvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHN1Yi1idWZmZXIsIHNpbmNlIHRoZSBwYWRkaW5nIHZhbHVlIGlzbid0Citrbm93biB1bnRpbCBhIHN1Yi1idWZmZXIgaXMgZmlsbGVkLiAgVGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrIGlzCithbHNvIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHN1Yi1idWZmZXIgd2hlbiB0aGUgY2hhbm5lbCBpcyBvcGVuZWQsIHRvCitnaXZlIHRoZSBjbGllbnQgYSBjaGFuY2UgdG8gcmVzZXJ2ZSBzcGFjZSBpbiBpdC4gIEluIHRoaXMgY2FzZSB0aGUKK3ByZXZpb3VzIHN1Yi1idWZmZXIgcG9pbnRlciBwYXNzZWQgaW50byB0aGUgY2FsbGJhY2sgd2lsbCBiZSBOVUxMLCBzbwordGhlIGNsaWVudCBzaG91bGQgY2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBwcmV2X3N1YmJ1ZiBwb2ludGVyIGJlZm9yZQord3JpdGluZyBpbnRvIHRoZSBwcmV2aW91cyBzdWItYnVmZmVyLgorCitXcml0aW5nIHRvIGEgY2hhbm5lbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora2VybmVsIGNsaWVudHMgd3JpdGUgZGF0YSBpbnRvIHRoZSBjdXJyZW50IGNwdSdzIGNoYW5uZWwgYnVmZmVyIHVzaW5nCityZWxheV93cml0ZSgpIG9yIF9fcmVsYXlfd3JpdGUoKS4gIHJlbGF5X3dyaXRlKCkgaXMgdGhlIG1haW4gbG9nZ2luZworZnVuY3Rpb24gLSBpdCB1c2VzIGxvY2FsX2lycXNhdmUoKSB0byBwcm90ZWN0IHRoZSBidWZmZXIgYW5kIHNob3VsZCBiZQordXNlZCBpZiB5b3UgbWlnaHQgYmUgbG9nZ2luZyBmcm9tIGludGVycnVwdCBjb250ZXh0LiAgSWYgeW91IGtub3cKK3lvdSdsbCBuZXZlciBiZSBsb2dnaW5nIGZyb20gaW50ZXJydXB0IGNvbnRleHQsIHlvdSBjYW4gdXNlCitfX3JlbGF5X3dyaXRlKCksIHdoaWNoIG9ubHkgZGlzYWJsZXMgcHJlZW1wdGlvbi4gIFRoZXNlIGZ1bmN0aW9ucworZG9uJ3QgcmV0dXJuIGEgdmFsdWUsIHNvIHlvdSBjYW4ndCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhleQorZmFpbGVkIC0gdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB5b3Ugd291bGRuJ3Qgd2FudCB0byBjaGVjayBhIHJldHVybgordmFsdWUgaW4gdGhlIGZhc3QgbG9nZ2luZyBwYXRoIGFueXdheSwgYW5kIHRoYXQgdGhleSdsbCBhbHdheXMgc3VjY2VlZAordW5sZXNzIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgbm8tb3ZlcndyaXRlIG1vZGUgaXMgYmVpbmcgdXNlZCwgaW4KK3doaWNoIGNhc2UgeW91IGNhbiBkZXRlY3QgYSBmYWlsZWQgd3JpdGUgaW4gdGhlIHN1YmJ1Zl9zdGFydCgpCitjYWxsYmFjayBieSBjYWxsaW5nIHRoZSByZWxheV9idWZfZnVsbCgpIGhlbHBlciBmdW5jdGlvbi4KKworcmVsYXlfcmVzZXJ2ZSgpIGlzIHVzZWQgdG8gcmVzZXJ2ZSBhIHNsb3QgaW4gYSBjaGFubmVsIGJ1ZmZlciB3aGljaAorY2FuIGJlIHdyaXR0ZW4gdG8gbGF0ZXIuICBUaGlzIHdvdWxkIHR5cGljYWxseSBiZSB1c2VkIGluIGFwcGxpY2F0aW9ucwordGhhdCBuZWVkIHRvIHdyaXRlIGRpcmVjdGx5IGludG8gYSBjaGFubmVsIGJ1ZmZlciB3aXRob3V0IGhhdmluZyB0bworc3RhZ2UgZGF0YSBpbiBhIHRlbXBvcmFyeSBidWZmZXIgYmVmb3JlaGFuZC4gIEJlY2F1c2UgdGhlIGFjdHVhbCB3cml0ZQorbWF5IG5vdCBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNsb3QgaXMgcmVzZXJ2ZWQsIGFwcGxpY2F0aW9ucwordXNpbmcgcmVsYXlfcmVzZXJ2ZSgpIGNhbiBrZWVwIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseQord3JpdHRlbiwgZWl0aGVyIGluIHNwYWNlIHJlc2VydmVkIGluIHRoZSBzdWItYnVmZmVycyB0aGVtc2VsdmVzIG9yIGFzCithIHNlcGFyYXRlIGFycmF5LiAgU2VlIHRoZSAncmVzZXJ2ZScgZXhhbXBsZSBpbiB0aGUgcmVsYXktYXBwcyB0YXJiYWxsCithdCBodHRwOi8vcmVsYXlmcy5zb3VyY2Vmb3JnZS5uZXQgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgY2FuIGJlCitkb25lLiAgQmVjYXVzZSB0aGUgd3JpdGUgaXMgdW5kZXIgY29udHJvbCBvZiB0aGUgY2xpZW50IGFuZCBpcworc2VwYXJhdGVkIGZyb20gdGhlIHJlc2VydmUsIHJlbGF5X3Jlc2VydmUoKSBkb2Vzbid0IHByb3RlY3QgdGhlIGJ1ZmZlcgorYXQgYWxsIC0gaXQncyB1cCB0byB0aGUgY2xpZW50IHRvIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlCitzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyByZWxheV9yZXNlcnZlKCkuCisKK0Nsb3NpbmcgYSBjaGFubmVsCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgY2xpZW50IGNhbGxzIHJlbGF5X2Nsb3NlKCkgd2hlbiBpdCdzIGZpbmlzaGVkIHVzaW5nIHRoZSBjaGFubmVsLgorVGhlIGNoYW5uZWwgYW5kIGl0cyBhc3NvY2lhdGVkIGJ1ZmZlcnMgYXJlIGRlc3Ryb3llZCB3aGVuIHRoZXJlIGFyZSBubworbG9uZ2VyIGFueSByZWZlcmVuY2VzIHRvIGFueSBvZiB0aGUgY2hhbm5lbCBidWZmZXJzLiAgcmVsYXlfZmx1c2goKQorZm9yY2VzIGEgc3ViLWJ1ZmZlciBzd2l0Y2ggb24gYWxsIHRoZSBjaGFubmVsIGJ1ZmZlcnMsIGFuZCBjYW4gYmUgdXNlZAordG8gZmluYWxpemUgYW5kIHByb2Nlc3MgdGhlIGxhc3Qgc3ViLWJ1ZmZlcnMgYmVmb3JlIHRoZSBjaGFubmVsIGlzCitjbG9zZWQuCisKK01pc2MKKy0tLS0KKworU29tZSBhcHBsaWNhdGlvbnMgbWF5IHdhbnQgdG8ga2VlcCBhIGNoYW5uZWwgYXJvdW5kIGFuZCByZS11c2UgaXQKK3JhdGhlciB0aGFuIG9wZW4gYW5kIGNsb3NlIGEgbmV3IGNoYW5uZWwgZm9yIGVhY2ggdXNlLiAgcmVsYXlfcmVzZXQoKQorY2FuIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZSAtIGl0IHJlc2V0cyBhIGNoYW5uZWwgdG8gaXRzIGluaXRpYWwKK3N0YXRlIHdpdGhvdXQgcmVhbGxvY2F0aW5nIGNoYW5uZWwgYnVmZmVyIG1lbW9yeSBvciBkZXN0cm95aW5nCitleGlzdGluZyBtYXBwaW5ncy4gIEl0IHNob3VsZCBob3dldmVyIG9ubHkgYmUgY2FsbGVkIHdoZW4gaXQncyBzYWZlIHRvCitkbyBzbyBpLmUuIHdoZW4gdGhlIGNoYW5uZWwgaXNuJ3QgY3VycmVudGx5IGJlaW5nIHdyaXR0ZW4gdG8uCisKK0ZpbmFsbHksIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiB1dGlsaXR5IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSB1c2VkIGZvcgorZGlmZmVyZW50IHB1cnBvc2VzLiAgYnVmX21hcHBlZCgpIGlzIGNhbGxlZCB3aGVuZXZlciBhIGNoYW5uZWwgYnVmZmVyCitpcyBtbWFwcGVkIGZyb20gdXNlciBzcGFjZSBhbmQgYnVmX3VubWFwcGVkKCkgaXMgY2FsbGVkIHdoZW4gaXQncwordW5tYXBwZWQuICBUaGUgY2xpZW50IGNhbiB1c2UgdGhpcyBub3RpZmljYXRpb24gdG8gdHJpZ2dlciBhY3Rpb25zCit3aXRoaW4gdGhlIGtlcm5lbCBhcHBsaWNhdGlvbiwgc3VjaCBhcyBlbmFibGluZy9kaXNhYmxpbmcgbG9nZ2luZyB0bwordGhlIGNoYW5uZWwuCisKKworUmVzb3VyY2VzCis9PT09PT09PT0KKworRm9yIG5ld3MsIGV4YW1wbGUgY29kZSwgbWFpbGluZyBsaXN0LCBldGMuIHNlZSB0aGUgcmVsYXlmcyBob21lcGFnZToKKworICAgIGh0dHA6Ly9yZWxheWZzLnNvdXJjZWZvcmdlLm5ldAorCisKK0NyZWRpdHMKKz09PT09PT0KKworVGhlIGlkZWFzIGFuZCBzcGVjcyBmb3IgcmVsYXlmcyBjYW1lIGFib3V0IGFzIGEgcmVzdWx0IG9mIGRpc2N1c3Npb25zCitvbiB0cmFjaW5nIGludm9sdmluZyB0aGUgZm9sbG93aW5nOgorCitNaWNoZWwgRGFnZW5haXMJCTxtaWNoZWwuZGFnZW5haXNAcG9seW10bC5jYT4KK1JpY2hhcmQgTW9vcmUJCTxyaWNoYXJkal9tb29yZUB1ay5pYm0uY29tPgorQm9iIFdpc25pZXdza2kJCTxib2JAd2F0c29uLmlibS5jb20+CitLYXJpbSBZYWdobW91cgkJPGthcmltQG9wZXJzeXMuY29tPgorVG9tIFphbnVzc2kJCTx6YW51c3NpQHVzLmlibS5jb20+CisKK0Fsc28gdGhhbmtzIHRvIEh1YmVydHVzIEZyYW5rZSBmb3IgYSBsb3Qgb2YgdXNlZnVsIHN1Z2dlc3Rpb25zIGFuZCBidWcKK3JlcG9ydHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Y5ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92OWZzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkyZmViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92OWZzLnR4dApAQCAtMCwwICsxLDk1IEBACisJCQlWOUZTOiA5UDIwMDAgZm9yIExpbnV4CisJCQk9PT09PT09PT09PT09PT09PT09PT09CisKK0FCT1VUCis9PT09PQorCit2OWZzIGlzIGEgVW5peCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGxhbiA5IDlwIHJlbW90ZSBmaWxlc3lzdGVtIHByb3RvY29sLgorCitUaGlzIHNvZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CithbmQgTWF5YSBHb2toYWxlIDxtYXlhQGxhbmwuZ292Pi4gIEFkZGl0aW9uYWwgZGV2ZWxvcG1lbnQgYnkgR3JlZyBXYXRzb24KKzxnd2F0c29uQGxhbmwuZ292PiBhbmQgbW9zdCByZWNlbnRseSBFcmljIFZhbiBIZW5zYmVyZ2VuCis8ZXJpY3ZoQGdtYWlsLmNvbT4gYW5kIExhdGNoZXNhciBJb25rb3YgPGx1Y2hvQGlvbmtvdi5uZXQ+LgorCitVU0FHRQorPT09PT0KKworRm9yIHJlbW90ZSBmaWxlIHNlcnZlcjoKKworCW1vdW50IC10IDlQIDEwLjEwLjEuMiAvbW50LzkKKworRm9yIFBsYW4gOSBGcm9tIFVzZXIgU3BhY2UgYXBwbGljYXRpb25zIChodHRwOi8vc3d0Y2guY29tL3BsYW45KQorCisJbW91bnQgLXQgOVAgYG5hbWVzcGFjZWAvYWNtZSAvbW50LzkgLW8gcHJvdG89dW5peCxuYW1lPSRVU0VSCisKK09QVElPTlMKKz09PT09PT0KKworICBwcm90bz1uYW1lCXNlbGVjdCBhbiBhbHRlcm5hdGl2ZSB0cmFuc3BvcnQuICBWYWxpZCBvcHRpb25zIGFyZQorICAJCWN1cnJlbnRseToKKyAJCQl1bml4IC0gc3BlY2lmeWluZyBhIG5hbWVkIHBpcGUgbW91bnQgcG9pbnQKKyAJCQl0Y3AgIC0gc3BlY2lmeWluZyBhIG5vcm1hbCBUQ1AvSVAgY29ubmVjdGlvbgorIAkJCWZkICAgLSB1c2VkIHBhc3NlZCBmaWxlIGRlc2NyaXB0b3JzIGZvciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgcmZkbm8gYW5kIHdmZG5vKQorCisgIG5hbWU9bmFtZQl1c2VyIG5hbWUgdG8gYXR0ZW1wdCBtb3VudCBhcyBvbiB0aGUgcmVtb3RlIHNlcnZlci4gIFRoZQorICAJCXNlcnZlciBtYXkgb3ZlcnJpZGUgb3IgaWdub3JlIHRoaXMgdmFsdWUuICBDZXJ0YWluIHVzZXIKKwkJbmFtZXMgbWF5IHJlcXVpcmUgYXV0aGVudGljYXRpb24uCisKKyAgYW5hbWU9bmFtZQlhbmFtZSBzcGVjaWZpZXMgdGhlIGZpbGUgdHJlZSB0byBhY2Nlc3Mgd2hlbiB0aGUgc2VydmVyIGlzCisgIAkJb2ZmZXJpbmcgc2V2ZXJhbCBleHBvcnRlZCBmaWxlIHN5c3RlbXMuCisKKyAgZGVidWc9bglzcGVjaWZpZXMgZGVidWcgbGV2ZWwuICBUaGUgZGVidWcgbGV2ZWwgaXMgYSBiaXRtYXNrLgorICAJCQkweDAxID0gZGlzcGxheSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzCisJCQkweDAyID0gZGV2ZWxvcGVyIGRlYnVnIChERUJVR19DVVJSRU5UKQorCQkJMHgwNCA9IGRpc3BsYXkgOVAgdHJhY2UKKwkJCTB4MDggPSBkaXNwbGF5IFZGUyB0cmFjZQorCQkJMHgxMCA9IGRpc3BsYXkgTWFyc2hhbGxpbmcgZGVidWcKKwkJCTB4MjAgPSBkaXNwbGF5IFJQQyBkZWJ1ZworCQkJMHg0MCA9IGRpc3BsYXkgdHJhbnNwb3J0IGRlYnVnCisJCQkweDgwID0gZGlzcGxheSBhbGxvY2F0aW9uIGRlYnVnCisKKyAgcmZkbm89bgl0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nIHdpdGggcHJvdG89ZmQKKworICB3ZmRubz1uCXRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHdyaXRpbmcgd2l0aCBwcm90bz1mZAorCisgIG1heGRhdGE9bgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSBmb3IgOVAgcGFja2V0IHBheWxvYWQgKG1zaXplKQorCisgIHBvcnQ9bglwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBzZXJ2ZXIKKworICB0aW1lb3V0PW4JcmVxdWVzdCB0aW1lb3V0cyAoaW4gbXMpIChkZWZhdWx0IDYwMDAwbXMpCisKKyAgbm9leHRlbmQJZm9yY2UgbGVnYWN5IG1vZGUgKG5vIDlQMjAwMC51IHNlbWFudGljcykKKworICB1aWQJCWF0dGVtcHQgdG8gbW91bnQgYXMgYSBwYXJ0aWN1bGFyIHVpZAorCisgIGdpZAkJYXR0ZW1wdCB0byBtb3VudCB3aXRoIGEgcGFydGljdWxhciBnaWQKKworICBhZmlkCQlzZWN1cml0eSBjaGFubmVsIC0gdXNlZCBieSBQbGFuIDkgYXV0aGVudGljYXRpb24gcHJvdG9jb2xzCisKKyAgbm9kZXZtYXAJZG8gbm90IG1hcCBzcGVjaWFsIGZpbGVzIC0gcmVwcmVzZW50IHRoZW0gYXMgbm9ybWFsIGZpbGVzLgorICAJCVRoaXMgY2FuIGJlIHVzZWQgdG8gc2hhcmUgZGV2aWNlcy9uYW1lZCBwaXBlcy9zb2NrZXRzIGJldHdlZW4KKwkJaG9zdHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBleHBhbmRlZCBpbiBsYXRlciB2ZXJzaW9ucy4KKworUkVTT1VSQ0VTCis9PT09PT09PT0KKworVGhlIExpbnV4IHZlcnNpb24gb2YgdGhlIDlQIHNlcnZlciwgYWxvbmcgd2l0aCBzb21lIGNsaWVudC1zaWRlIHV0aWxpdGllcworY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly92OWZzLnNmLm5ldCAoYWxvbmcgd2l0aCBhIENWUyByZXBvc2l0b3J5IG9mIHRoZQorZGV2ZWxvcG1lbnQgYnJhbmNoIG9mIHRoaXMgbW9kdWxlKS4gIFRoZXJlIGFyZSB1c2VyIGFuZCBkZXZlbG9wZXIgbWFpbGluZworbGlzdHMgaGVyZSwgYXMgd2VsbCBhcyBhIGJ1Zy10cmFja2VyLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgUGxhbiA5IE9wZXJhdGluZyBTeXN0ZW0gY2hlY2sgb3V0CitodHRwOi8vcGxhbjkuYmVsbC1sYWJzLmNvbS9wbGFuOQorCitGb3IgaW5mb3JtYXRpb24gb24gUGxhbiA5IGZyb20gVXNlciBTcGFjZSAoUGxhbiA5IGFwcGxpY2F0aW9ucyBhbmQgbGlicmFyaWVzCitwb3J0ZWQgdG8gTGludXgvQlNEL09TWC9ldGMpIGNoZWNrIG91dCBodHRwOi8vc3d0Y2guY29tL3BsYW45CisKKworU1RBVFVTCis9PT09PT0KKworVGhlIDIuNiBrZXJuZWwgc3VwcG9ydCBpcyB3b3JraW5nIG9uIFBQQyBhbmQgeDg2LgorCitQTEVBU0UgVVNFIFRIRSBTT1VSQ0VGT1JHRSBCVUctVFJBQ0tFUiBUTyBSRVBPUlQgUFJPQkxFTVMuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCAzZjMxOGRkLi5mMDQyYzEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC0xLDM1ICsxLDI3IEBACi0vKiAtKi0gYXV0by1maWxsIC0qLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLQkJT3ZlcnZpZXcgb2YgdGhlIFZpcnR1YWwgRmlsZSBTeXN0ZW0KKwkgICAgICBPdmVydmlldyBvZiB0aGUgTGludXggVmlydHVhbCBGaWxlIFN5c3RlbQogCi0JCVJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCU9yaWdpbmFsIGF1dGhvcjogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAKLQkJCSAgICAgIDUtSlVMLTE5OTkKKwkJICBMYXN0IHVwZGF0ZWQgb24gQXVndXN0IDI1LCAyMDA1CisKKyAgQ29weXJpZ2h0IChDKSAxOTk5IFJpY2hhcmQgR29vY2gKKyAgQ29weXJpZ2h0IChDKSAyMDA1IFBla2thIEVuYmVyZworCisgIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAKIAotQ29udmVudGlvbnMgdXNlZCBpbiB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uPgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUVhY2ggc2VjdGlvbiBpbiB0aGlzIGRvY3VtZW50IHdpbGwgaGF2ZSB0aGUgc3RyaW5nICI8c2VjdGlvbj4iIGF0IHRoZQotcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBzZWN0aW9uIHRpdGxlLiBFYWNoIHN1YnNlY3Rpb24gd2lsbCBoYXZlCi0iPHN1YnNlY3Rpb24+IiBhdCB0aGUgcmlnaHQtaGFuZCBzaWRlLiBUaGVzZSBzdHJpbmdzIGFyZSBtZWFudCB0byBtYWtlCi1pdCBlYXNpZXIgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGRvY3VtZW50LgotCi1OT1RFIHRoYXQgdGhlIG1hc3RlciBjb3B5IG9mIHRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIG9ubGluZSBhdDoKLWh0dHA6Ly93d3cuYXRuZi5jc2lyby5hdS9+cmdvb2NoL2xpbnV4L2RvY3MvdmZzLnR4dAotCi0KLVdoYXQgaXMgaXQ/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK1doYXQgaXMgaXQ/CiA9PT09PT09PT09PQogCiBUaGUgVmlydHVhbCBGaWxlIFN5c3RlbSAob3RoZXJ3aXNlIGtub3duIGFzIHRoZSBWaXJ0dWFsIEZpbGVzeXN0ZW0KIFN3aXRjaCkgaXMgdGhlIHNvZnR3YXJlIGxheWVyIGluIHRoZSBrZXJuZWwgdGhhdCBwcm92aWRlcyB0aGUKIGZpbGVzeXN0ZW0gaW50ZXJmYWNlIHRvIHVzZXJzcGFjZSBwcm9ncmFtcy4gSXQgYWxzbyBwcm92aWRlcyBhbgogYWJzdHJhY3Rpb24gd2l0aGluIHRoZSBrZXJuZWwgd2hpY2ggYWxsb3dzIGRpZmZlcmVudCBmaWxlc3lzdGVtCi1pbXBsZW1lbnRhdGlvbnMgdG8gY28tZXhpc3QuCitpbXBsZW1lbnRhdGlvbnMgdG8gY29leGlzdC4KIAogCi1BIFF1aWNrIExvb2sgQXQgSG93IEl0IFdvcmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+CitBIFF1aWNrIExvb2sgQXQgSG93IEl0IFdvcmtzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEluIHRoaXMgc2VjdGlvbiBJJ2xsIGJyaWVmbHkgZGVzY3JpYmUgaG93IHRoaW5ncyB3b3JrLCBiZWZvcmUKQEAgLTM4LDcgKzMwLDggQEAKIG90aGVyIHZpZXcgd2hpY2ggaXMgaG93IGEgZmlsZXN5c3RlbSBpcyBzdXBwb3J0ZWQgYW5kIHN1YnNlcXVlbnRseQogbW91bnRlZC4KIAotT3BlbmluZyBhIEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWJzZWN0aW9uPgorCitPcGVuaW5nIGEgRmlsZQogLS0tLS0tLS0tLS0tLS0KIAogVGhlIFZGUyBpbXBsZW1lbnRzIHRoZSBvcGVuKDIpLCBzdGF0KDIpLCBjaG1vZCgyKSBhbmQgc2ltaWxhciBzeXN0ZW0KQEAgLTc3LDcgKzcwLDcgQEAKIAogT3BlbmluZyBhIGZpbGUgcmVxdWlyZXMgYW5vdGhlciBvcGVyYXRpb246IGFsbG9jYXRpb24gb2YgYSBmaWxlCiBzdHJ1Y3R1cmUgKHRoaXMgaXMgdGhlIGtlcm5lbC1zaWRlIGltcGxlbWVudGF0aW9uIG9mIGZpbGUKLWRlc2NyaXB0b3JzKS4gVGhlIGZyZXNobHkgYWxsb2NhdGVkIGZpbGUgc3RydWN0dXJlIGlzIGluaXRpYWxpc2VkIHdpdGgKK2Rlc2NyaXB0b3JzKS4gVGhlIGZyZXNobHkgYWxsb2NhdGVkIGZpbGUgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHdpdGgKIGEgcG9pbnRlciB0byB0aGUgZGVudHJ5IGFuZCBhIHNldCBvZiBmaWxlIG9wZXJhdGlvbiBtZW1iZXIgZnVuY3Rpb25zLgogVGhlc2UgYXJlIHRha2VuIGZyb20gdGhlIGlub2RlIGRhdGEuIFRoZSBvcGVuKCkgZmlsZSBtZXRob2QgaXMgdGhlbgogY2FsbGVkIHNvIHRoZSBzcGVjaWZpYyBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGNhbiBkbyBpdCdzIHdvcmsuIFlvdQpAQCAtMTAyLDcgKzk1LDggQEAKIHByb2Nlc3NvcnMuIFlvdSBzaG91bGQgZW5zdXJlIHRoYXQgYWNjZXNzIHRvIHNoYXJlZCByZXNvdXJjZXMgaXMKIHByb3RlY3RlZCBieSBhcHByb3ByaWF0ZSBsb2Nrcy4KIAotUmVnaXN0ZXJpbmcgYW5kIE1vdW50aW5nIGEgRmlsZXN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWJzZWN0aW9uPgorCitSZWdpc3RlcmluZyBhbmQgTW91bnRpbmcgYSBGaWxlc3lzdGVtCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSB3YW50IHRvIHN1cHBvcnQgYSBuZXcga2luZCBvZiBmaWxlc3lzdGVtIGluIHRoZSBrZXJuZWwsIGFsbCB5b3UKQEAgLTEyMywxNyArMTE3LDIxIEBACiBJdCdzIG5vdyB0aW1lIHRvIGxvb2sgYXQgdGhpbmdzIGluIG1vcmUgZGV0YWlsLgogCiAKLXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlCiA9PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGlzIGRlc2NyaWJlcyB0aGUgZmlsZXN5c3RlbS4gQXMgb2Yga2VybmVsIDIuMS45OSwgdGhlIGZvbGxvd2luZworVGhpcyBkZXNjcmliZXMgdGhlIGZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcKIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHsKIAljb25zdCBjaGFyICpuYW1lOwogCWludCBmc19mbGFnczsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKigqcmVhZF9zdXBlcikgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCk7Ci0Jc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiBuZXh0OworICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKigqZ2V0X3NiKSAoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICopOworICAgICAgICB2b2lkICgqa2lsbF9zYikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKyAgICAgICAgc3RydWN0IG1vZHVsZSAqb3duZXI7CisgICAgICAgIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICogbmV4dDsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBmc19zdXBlcnM7CiB9OwogCiAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGUsIHN1Y2ggYXMgImV4dDIiLCAiaXNvOTY2MCIsCkBAIC0xNDEsNTEgKzEzOSw5NyBAQAogCiAgIGZzX2ZsYWdzOiB2YXJpb3VzIGZsYWdzIChpLmUuIEZTX1JFUVVJUkVTX0RFViwgRlNfTk9fRENBQ0hFLCBldGMuKQogCi0gIHJlYWRfc3VwZXI6IHRoZSBtZXRob2QgdG8gY2FsbCB3aGVuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMKKyAgZ2V0X3NiOiB0aGUgbWV0aG9kIHRvIGNhbGwgd2hlbiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzCiAJZmlsZXN5c3RlbSBzaG91bGQgYmUgbW91bnRlZAogCi0gIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpc2UgdGhpcyB0byBOVUxMCisgIGtpbGxfc2I6IHRoZSBtZXRob2QgdG8gY2FsbCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoaXMgZmlsZXN5c3RlbQorCXNob3VsZCBiZSB1bm1vdW50ZWQKIAotVGhlIHJlYWRfc3VwZXIoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICBvd25lcjogZm9yIGludGVybmFsIFZGUyB1c2U6IHlvdSBzaG91bGQgaW5pdGlhbGl6ZSB0aGlzIHRvIFRISVNfTU9EVUxFIGluCisgIAltb3N0IGNhc2VzLgorCisgIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0byBOVUxMCisKK1RoZSBnZXRfc2IoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCiAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2I6IHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4gVGhpcyBpcyBwYXJ0aWFsbHkKLQlpbml0aWFsaXNlZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpc2VkIGJ5IHRoZQotCXJlYWRfc3VwZXIoKSBtZXRob2QKKwlpbml0aWFsaXplZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IHRoZQorCWdldF9zYigpIG1ldGhvZAorCisgIGludCBmbGFnczogbW91bnQgZmxhZ3MKKworICBjb25zdCBjaGFyICpkZXZfbmFtZTogdGhlIGRldmljZSBuYW1lIHdlIGFyZSBtb3VudGluZy4KIAogICB2b2lkICpkYXRhOiBhcmJpdHJhcnkgbW91bnQgb3B0aW9ucywgdXN1YWxseSBjb21lcyBhcyBhbiBBU0NJSQogCXN0cmluZwogCiAgIGludCBzaWxlbnQ6IHdoZXRoZXIgb3Igbm90IHRvIGJlIHNpbGVudCBvbiBlcnJvcgogCi1UaGUgcmVhZF9zdXBlcigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAorVGhlIGdldF9zYigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAogaW4gdGhlIHN1cGVyYmxvY2sgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKIHN1cHBvcnRzLiBPbiBzdWNjZXNzIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc3VwZXJibG9jayBwb2ludGVyLCBvbgogZmFpbHVyZSBpdCByZXR1cm5zIE5VTEwuCiAKIFRoZSBtb3N0IGludGVyZXN0aW5nIG1lbWJlciBvZiB0aGUgc3VwZXJibG9jayBzdHJ1Y3R1cmUgdGhhdCB0aGUKLXJlYWRfc3VwZXIoKSBtZXRob2QgZmlsbHMgaW4gaXMgdGhlICJzX29wIiBmaWVsZC4gVGhpcyBpcyBhIHBvaW50ZXIgdG8KK2dldF9zYigpIG1ldGhvZCBmaWxscyBpbiBpcyB0aGUgInNfb3AiIGZpZWxkLiBUaGlzIGlzIGEgcG9pbnRlciB0bwogYSAic3RydWN0IHN1cGVyX29wZXJhdGlvbnMiIHdoaWNoIGRlc2NyaWJlcyB0aGUgbmV4dCBsZXZlbCBvZiB0aGUKIGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24uCiAKK1VzdWFsbHksIGEgZmlsZXN5c3RlbSB1c2VzIGdlbmVyaWMgb25lIG9mIHRoZSBnZW5lcmljIGdldF9zYigpCitpbXBsZW1lbnRhdGlvbnMgYW5kIHByb3ZpZGVzIGEgZmlsbF9zdXBlcigpIG1ldGhvZCBpbnN0ZWFkLiBUaGUKK2dlbmVyaWMgbWV0aG9kcyBhcmU6CiAKLXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KKyAgZ2V0X3NiX2JkZXY6IG1vdW50IGEgZmlsZXN5c3RlbSByZXNpZGluZyBvbiBhIGJsb2NrIGRldmljZQorCisgIGdldF9zYl9ub2RldjogbW91bnQgYSBmaWxlc3lzdGVtIHRoYXQgaXMgbm90IGJhY2tlZCBieSBhIGRldmljZQorCisgIGdldF9zYl9zaW5nbGU6IG1vdW50IGEgZmlsZXN5c3RlbSB3aGljaCBzaGFyZXMgdGhlIGluc3RhbmNlIGJldHdlZW4KKyAgCWFsbCBtb3VudHMKKworQSBmaWxsX3N1cGVyKCkgbWV0aG9kIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKworICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOiB0aGUgc3VwZXJibG9jayBzdHJ1Y3R1cmUuIFRoZSBtZXRob2QgZmlsbF9zdXBlcigpCisgIAltdXN0IGluaXRpYWxpemUgdGhpcyBwcm9wZXJseS4KKworICB2b2lkICpkYXRhOiBhcmJpdHJhcnkgbW91bnQgb3B0aW9ucywgdXN1YWxseSBjb21lcyBhcyBhbiBBU0NJSQorCXN0cmluZworCisgIGludCBzaWxlbnQ6IHdoZXRoZXIgb3Igbm90IHRvIGJlIHNpbGVudCBvbiBlcnJvcgorCisKK3N0cnVjdCBzdXBlcl9vcGVyYXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSB0aGUgc3VwZXJibG9jayBvZiB5b3VyCi1maWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi4xLjk5LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CitmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHsKLQl2b2lkICgqcmVhZF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKLQlpbnQgKCp3cml0ZV9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwotCXZvaWQgKCpwdXRfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7Ci0Jdm9pZCAoKmRyb3BfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7Ci0Jdm9pZCAoKmRlbGV0ZV9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKLQlpbnQgKCpub3RpZnlfY2hhbmdlKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7Ci0Jdm9pZCAoKnB1dF9zdXBlcikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLQl2b2lkICgqd3JpdGVfc3VwZXIpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci0JaW50ICgqc3RhdGZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBzdGF0ZnMgKiwgaW50KTsKLQlpbnQgKCpyZW1vdW50X2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwotCXZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKyAgICAgICAgc3RydWN0IGlub2RlICooKmFsbG9jX2lub2RlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKyAgICAgICAgdm9pZCAoKmRlc3Ryb3lfaW5vZGUpKHN0cnVjdCBpbm9kZSAqKTsKKworICAgICAgICB2b2lkICgqcmVhZF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKworICAgICAgICB2b2lkICgqZGlydHlfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CisgICAgICAgIGludCAoKndyaXRlX2lub2RlKSAoc3RydWN0IGlub2RlICosIGludCk7CisgICAgICAgIHZvaWQgKCpwdXRfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CisgICAgICAgIHZvaWQgKCpkcm9wX2lub2RlKSAoc3RydWN0IGlub2RlICopOworICAgICAgICB2b2lkICgqZGVsZXRlX2lub2RlKSAoc3RydWN0IGlub2RlICopOworICAgICAgICB2b2lkICgqcHV0X3N1cGVyKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworICAgICAgICB2b2lkICgqd3JpdGVfc3VwZXIpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisgICAgICAgIGludCAoKnN5bmNfZnMpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KTsKKyAgICAgICAgdm9pZCAoKndyaXRlX3N1cGVyX2xvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKyAgICAgICAgdm9pZCAoKnVubG9ja2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworICAgICAgICBpbnQgKCpzdGF0ZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CisgICAgICAgIGludCAoKnJlbW91bnRfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CisgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKKyAgICAgICAgdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworICAgICAgICB2b2lkICgqc3luY19pbm9kZXMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CisgICAgICAgIGludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKKworICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CisgICAgICAgIHNzaXplX3QgKCpxdW90YV93cml0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CiB9OwogCiBBbGwgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2tzIGJlaW5nIGhlbGQsIHVubGVzcyBvdGhlcndpc2UKQEAgLTE5Myw0MyArMjM3LDYyIEBACiBvbmx5IGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0IChpLmUuIG5vdCBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyCiBvciBib3R0b20gaGFsZikuCiAKKyAgYWxsb2NfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBpbm9kZV9hbGxvYygpIHRvIGFsbG9jYXRlIG1lbW9yeQorIAlmb3Igc3RydWN0IGlub2RlIGFuZCBpbml0aWFsaXplIGl0LgorCisgIGRlc3Ryb3lfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBkZXN0cm95X2lub2RlKCkgdG8gcmVsZWFzZQorICAJcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3Igc3RydWN0IGlub2RlLgorCiAgIHJlYWRfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZWFkIGEgc3BlY2lmaWMgaW5vZGUgZnJvbSB0aGUKLQltb3VudGVkIGZpbGVzeXN0ZW0uIFRoZSAiaV9pbm8iIG1lbWJlciBpbiB0aGUgInN0cnVjdCBpbm9kZSIKLQl3aWxsIGJlIGluaXRpYWxpc2VkIGJ5IHRoZSBWRlMgdG8gaW5kaWNhdGUgd2hpY2ggaW5vZGUgdG8KLQlyZWFkLiBPdGhlciBtZW1iZXJzIGFyZSBmaWxsZWQgaW4gYnkgdGhpcyBtZXRob2QKKyAgICAgICAgbW91bnRlZCBmaWxlc3lzdGVtLiAgVGhlIGlfaW5vIG1lbWJlciBpbiB0aGUgc3RydWN0IGlub2RlIGlzCisJaW5pdGlhbGl6ZWQgYnkgdGhlIFZGUyB0byBpbmRpY2F0ZSB3aGljaCBpbm9kZSB0byByZWFkLiBPdGhlcgorCW1lbWJlcnMgYXJlIGZpbGxlZCBpbiBieSB0aGlzIG1ldGhvZC4KKworCVlvdSBjYW4gc2V0IHRoaXMgdG8gTlVMTCBhbmQgdXNlIGlnZXQ1X2xvY2tlZCgpIGluc3RlYWQgb2YgaWdldCgpCisJdG8gcmVhZCBpbm9kZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZmlsZXN5c3RlbXMgZm9yIHdoaWNoIHRoZQorCWlub2RlIG51bWJlciBpcyBub3Qgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbiBpbm9kZS4KKworICBkaXJ0eV9pbm9kZTogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbWFyayBhbiBpbm9kZSBkaXJ0eS4KIAogICB3cml0ZV9pbm9kZTogdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIFZGUyBuZWVkcyB0byB3cml0ZSBhbgogCWlub2RlIHRvIGRpc2MuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd3JpdGUKIAlzaG91bGQgYmUgc3luY2hyb25vdXMgb3Igbm90LCBub3QgYWxsIGZpbGVzeXN0ZW1zIGNoZWNrIHRoaXMgZmxhZy4KIAogICBwdXRfaW5vZGU6IGNhbGxlZCB3aGVuIHRoZSBWRlMgaW5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBpbm9kZQotCWNhY2hlLiBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbAorCWNhY2hlLgogCiAgIGRyb3BfaW5vZGU6IGNhbGxlZCB3aGVuIHRoZSBsYXN0IGFjY2VzcyB0byB0aGUgaW5vZGUgaXMgZHJvcHBlZCwKIAl3aXRoIHRoZSBpbm9kZV9sb2NrIHNwaW5sb2NrIGhlbGQuCiAKLQlUaGlzIG1ldGhvZCBzaG91bGQgYmUgZWl0aGVyIE5VTEwgKG5vcm1hbCB1bml4IGZpbGVzeXN0ZW0KKwlUaGlzIG1ldGhvZCBzaG91bGQgYmUgZWl0aGVyIE5VTEwgKG5vcm1hbCBVTklYIGZpbGVzeXN0ZW0KIAlzZW1hbnRpY3MpIG9yICJnZW5lcmljX2RlbGV0ZV9pbm9kZSIgKGZvciBmaWxlc3lzdGVtcyB0aGF0IGRvIG5vdAogCXdhbnQgdG8gY2FjaGUgaW5vZGVzIC0gY2F1c2luZyAiZGVsZXRlX2lub2RlIiB0byBhbHdheXMgYmUKIAljYWxsZWQgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgaV9ubGluaykKIAotCVRoZSAiZ2VuZXJpY19kZWxldGVfaW5vZGUoKSIgYmVoYXZpb3VyIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisJVGhlICJnZW5lcmljX2RlbGV0ZV9pbm9kZSgpIiBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHRoZQogCW9sZCBwcmFjdGljZSBvZiB1c2luZyAiZm9yY2VfZGVsZXRlIiBpbiB0aGUgcHV0X2lub2RlKCkgY2FzZSwKIAlidXQgZG9lcyBub3QgaGF2ZSB0aGUgcmFjZXMgdGhhdCB0aGUgImZvcmNlX2RlbGV0ZSgpIiBhcHByb2FjaAogCWhhZC4gCiAKICAgZGVsZXRlX2lub2RlOiBjYWxsZWQgd2hlbiB0aGUgVkZTIHdhbnRzIHRvIGRlbGV0ZSBhbiBpbm9kZQogCi0gIG5vdGlmeV9jaGFuZ2U6IGNhbGxlZCB3aGVuIFZGUyBpbm9kZSBhdHRyaWJ1dGVzIGFyZSBjaGFuZ2VkLiBJZiB0aGlzCi0JaXMgTlVMTCB0aGUgVkZTIGZhbGxzIGJhY2sgdG8gdGhlIHdyaXRlX2lub2RlKCkgbWV0aG9kLiBUaGlzCi0JaXMgY2FsbGVkIHdpdGggdGhlIGtlcm5lbCBsb2NrIGhlbGQKLQogICBwdXRfc3VwZXI6IGNhbGxlZCB3aGVuIHRoZSBWRlMgd2lzaGVzIHRvIGZyZWUgdGhlIHN1cGVyYmxvY2sKIAkoaS5lLiB1bm1vdW50KS4gVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgc3VwZXJibG9jayBsb2NrIGhlbGQKIAogICB3cml0ZV9zdXBlcjogY2FsbGVkIHdoZW4gdGhlIFZGUyBzdXBlcmJsb2NrIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8KIAlkaXNjLiBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbAogCisgIHN5bmNfZnM6IGNhbGxlZCB3aGVuIFZGUyBpcyB3cml0aW5nIG91dCBhbGwgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGgKKyAgCWEgc3VwZXJibG9jay4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1ldGhvZAorCXNob3VsZCB3YWl0IHVudGlsIHRoZSB3cml0ZSBvdXQgaGFzIGJlZW4gY29tcGxldGVkLiBPcHRpb25hbC4KKworICB3cml0ZV9zdXBlcl9sb2NrZnM6IGNhbGxlZCB3aGVuIFZGUyBpcyBsb2NraW5nIGEgZmlsZXN5c3RlbSBhbmQgZm9yY2luZworICAJaXQgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUuICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZQorCUxvZ2ljYWwgVm9sdW1lIE1hbmFnZXIgKExWTSkuCisKKyAgdW5sb2NrZnM6IGNhbGxlZCB3aGVuIFZGUyBpcyB1bmxvY2tpbmcgYSBmaWxlc3lzdGVtIGFuZCBtYWtpbmcgaXQgd3JpdGFibGUKKyAgCWFnYWluLgorCiAgIHN0YXRmczogY2FsbGVkIHdoZW4gdGhlIFZGUyBuZWVkcyB0byBnZXQgZmlsZXN5c3RlbSBzdGF0aXN0aWNzLiBUaGlzCiAJaXMgY2FsbGVkIHdpdGggdGhlIGtlcm5lbCBsb2NrIGhlbGQKIApAQCAtMjM4LDIxICszMDEsMzEgQEAKIAogICBjbGVhcl9pbm9kZTogY2FsbGVkIHRoZW4gdGhlIFZGUyBjbGVhcnMgdGhlIGlub2RlLiBPcHRpb25hbAogCisgIHVtb3VudF9iZWdpbjogY2FsbGVkIHdoZW4gdGhlIFZGUyBpcyB1bm1vdW50aW5nIGEgZmlsZXN5c3RlbS4KKworICBzeW5jX2lub2RlczogY2FsbGVkIHdoZW4gdGhlIFZGUyBpcyB3cml0aW5nIG91dCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aAorICAJYSBzdXBlcmJsb2NrLgorCisgIHNob3dfb3B0aW9uczogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gc2hvdyBtb3VudCBvcHRpb25zIGZvciAvcHJvYy88cGlkPi9tb3VudHMuCisKKyAgcXVvdGFfcmVhZDogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVhZCBmcm9tIGZpbGVzeXN0ZW0gcXVvdGEgZmlsZS4KKworICBxdW90YV93cml0ZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gd3JpdGUgdG8gZmlsZXN5c3RlbSBxdW90YSBmaWxlLgorCiBUaGUgcmVhZF9pbm9kZSgpIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgImlfb3AiCiBmaWVsZC4gVGhpcyBpcyBhIHBvaW50ZXIgdG8gYSAic3RydWN0IGlub2RlX29wZXJhdGlvbnMiIHdoaWNoCiBkZXNjcmliZXMgdGhlIG1ldGhvZHMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGluZGl2aWR1YWwgaW5vZGVzLgogCiAKLXN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSBhbiBpbm9kZSBpbiB5b3VyCi1maWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi4xLjk5LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CitmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CiAKIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICogZGVmYXVsdF9maWxlX29wczsKLQlpbnQgKCpjcmVhdGUpIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKLQlpbnQgKCpsb29rdXApIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOworCWludCAoKmNyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CisJc3RydWN0IGRlbnRyeSAqICgqbG9va3VwKSAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogCWludCAoKmxpbmspIChzdHJ1Y3QgZGVudHJ5ICosc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKIAlpbnQgKCp1bmxpbmspIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOwogCWludCAoKnN5bWxpbmspIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosY29uc3QgY2hhciAqKTsKQEAgLTI2MSwyNSArMzM0LDIyIEBACiAJaW50ICgqbWtub2QpIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LGRldl90KTsKIAlpbnQgKCpyZW5hbWUpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAogCQkJc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7Ci0JaW50ICgqcmVhZGxpbmspIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKixpbnQpOwotCXN0cnVjdCBkZW50cnkgKiAoKmZvbGxvd19saW5rKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwotCWludCAoKnJlYWRwYWdlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7Ci0JaW50ICgqd3JpdGVwYWdlKSAoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKLQlpbnQgKCpibWFwKSAoc3RydWN0IGlub2RlICosaW50KTsKKwlpbnQgKCpyZWFkbGluaykgKHN0cnVjdCBkZW50cnkgKiwgY2hhciBfX3VzZXIgKixpbnQpOworICAgICAgICB2b2lkICogKCpmb2xsb3dfbGluaykgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKKyAgICAgICAgdm9pZCAoKnB1dF9saW5rKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICosIHZvaWQgKik7CiAJdm9pZCAoKnRydW5jYXRlKSAoc3RydWN0IGlub2RlICopOwotCWludCAoKnBlcm1pc3Npb24pIChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLQlpbnQgKCpzbWFwKSAoc3RydWN0IGlub2RlICosaW50KTsKLQlpbnQgKCp1cGRhdGVwYWdlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKiwgY29uc3QgY2hhciAqLAotCQkJCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgaW50KTsKLQlpbnQgKCpyZXZhbGlkYXRlKSAoc3RydWN0IGRlbnRyeSAqKTsKKwlpbnQgKCpwZXJtaXNzaW9uKSAoc3RydWN0IGlub2RlICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKKwlpbnQgKCpzZXRhdHRyKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CisJaW50ICgqZ2V0YXR0cikgKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdCAqKTsKKwlpbnQgKCpzZXR4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqLGNvbnN0IHZvaWQgKixzaXplX3QsaW50KTsKKwlzc2l6ZV90ICgqZ2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworCXNzaXplX3QgKCpsaXN0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKKwlpbnQgKCpyZW1vdmV4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKIH07CiAKIEFnYWluLCBhbGwgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2tzIGJlaW5nIGhlbGQsIHVubGVzcwogb3RoZXJ3aXNlIG5vdGVkLgogCi0gIGRlZmF1bHRfZmlsZV9vcHM6IHRoaXMgaXMgYSBwb2ludGVyIHRvIGEgInN0cnVjdCBmaWxlX29wZXJhdGlvbnMiCi0Jd2hpY2ggZGVzY3JpYmVzIGhvdyB0byBvcGVuIGFuZCB0aGVuIG1hbmlwdWxhdGUgb3BlbiBmaWxlcwotCiAgIGNyZWF0ZTogY2FsbGVkIGJ5IHRoZSBvcGVuKDIpIGFuZCBjcmVhdCgyKSBzeXN0ZW0gY2FsbHMuIE9ubHkKIAlyZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHJlZ3VsYXIgZmlsZXMuIFRoZSBkZW50cnkgeW91CiAJZ2V0IHNob3VsZCBub3QgaGF2ZSBhbiBpbm9kZSAoaS5lLiBpdCBzaG91bGQgYmUgYSBuZWdhdGl2ZQpAQCAtMzI4LDMxICszOTgsMTQzIEBACiAJeW91IHdhbnQgdG8gc3VwcG9ydCByZWFkaW5nIHN5bWJvbGljIGxpbmtzCiAKICAgZm9sbG93X2xpbms6IGNhbGxlZCBieSB0aGUgVkZTIHRvIGZvbGxvdyBhIHN5bWJvbGljIGxpbmsgdG8gdGhlCi0JaW5vZGUgaXQgcG9pbnRzIHRvLiBPbmx5IHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQKLQlzeW1ib2xpYyBsaW5rcworCWlub2RlIGl0IHBvaW50cyB0by4gIE9ubHkgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gc3VwcG9ydAorCXN5bWJvbGljIGxpbmtzLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdm9pZCBwb2ludGVyIGNvb2tpZQorCXRoYXQgaXMgcGFzc2VkIHRvIHB1dF9saW5rKCkuCisKKyAgcHV0X2xpbms6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGFsbG9jYXRlZCBieQorICAJZm9sbG93X2xpbmsoKS4gIFRoZSBjb29raWUgcmV0dXJuZWQgYnkgZm9sbG93X2xpbmsoKSBpcyBwYXNzZWQgdG8KKwl0byB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4gIEl0IGlzIHVzZWQgYnkgZmlsZXN5c3RlbXMKKwlzdWNoIGFzIE5GUyB3aGVyZSBwYWdlIGNhY2hlIGlzIG5vdCBzdGFibGUgKGkuZS4gcGFnZSB0aGF0IHdhcworCWluc3RhbGxlZCB3aGVuIHRoZSBzeW1ib2xpYyBsaW5rIHdhbGsgc3RhcnRlZCBtaWdodCBub3QgYmUgaW4gdGhlCisJcGFnZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoZSB3YWxrKS4KKworICB0cnVuY2F0ZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gY2hhbmdlIHRoZSBzaXplIG9mIGEgZmlsZS4gIFRoZSBpX3NpemUKKyAJZmllbGQgb2YgdGhlIGlub2RlIGlzIHNldCB0byB0aGUgZGVzaXJlZCBzaXplIGJ5IHRoZSBWRlMgYmVmb3JlCisJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHJ1bmNhdGUoMikKKwlzeXN0ZW0gY2FsbCBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgorCisgIHBlcm1pc3Npb246IGNhbGxlZCBieSB0aGUgVkZTIHRvIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzIG9uIGEgUE9TSVgtbGlrZQorICAJZmlsZXN5c3RlbS4KKworICBzZXRhdHRyOiBjYWxsZWQgYnkgdGhlIFZGUyB0byBzZXQgYXR0cmlidXRlcyBmb3IgYSBmaWxlLiAgVGhpcyBmdW5jdGlvbiBpcworICAJY2FsbGVkIGJ5IGNobW9kKDIpIGFuZCByZWxhdGVkIHN5c3RlbSBjYWxscy4KKworICBnZXRhdHRyOiBjYWxsZWQgYnkgdGhlIFZGUyB0byBnZXQgYXR0cmlidXRlcyBvZiBhIGZpbGUuICBUaGlzIGZ1bmN0aW9uIGlzCisgIAljYWxsZWQgYnkgc3RhdCgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMuCisKKyAgc2V0eGF0dHI6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHNldCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgZm9yIGEgZmlsZS4KKyAgCUV4dGVuZGVkIGF0dHJpYnV0ZSBpcyBhIG5hbWU6dmFsdWUgcGFpciBhc3NvY2lhdGVkIHdpdGggYW4gaW5vZGUuIFRoaXMKKwlmdW5jdGlvbiBpcyBjYWxsZWQgYnkgc2V0eGF0dHIoMikgc3lzdGVtIGNhbGwuCisKKyAgZ2V0eGF0dHI6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUKKyAgCW5hbWUuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBnZXR4YXR0cigyKSBmdW5jdGlvbiBjYWxsLgorCisgIGxpc3R4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbGlzdCBhbGwgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbgorICAJZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpc3R4YXR0cigyKSBzeXN0ZW0gY2FsbC4KKworICByZW1vdmV4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmcm9tIGEgZmlsZS4KKyAgCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHJlbW92ZXhhdHRyKDIpIHN5c3RlbSBjYWxsLgogCiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkZXNjcmliZXMgaG93IHRoZSBWRlMgY2FuIG1hbmlwdWxhdGUgbWFwcGluZyBvZiBhIGZpbGUgdG8gcGFnZSBjYWNoZSBpbgoreW91ciBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgeworCWludCAoKndyaXRlcGFnZSkoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKKwlpbnQgKCpyZWFkcGFnZSkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqc3luY19wYWdlKShzdHJ1Y3QgcGFnZSAqKTsKKwlpbnQgKCp3cml0ZXBhZ2VzKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKik7CisJaW50ICgqc2V0X3BhZ2VfZGlydHkpKHN0cnVjdCBwYWdlICpwYWdlKTsKKwlpbnQgKCpyZWFkcGFnZXMpKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcyk7CisJaW50ICgqcHJlcGFyZV93cml0ZSkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKKwlpbnQgKCpjb21taXRfd3JpdGUpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7CisJc2VjdG9yX3QgKCpibWFwKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7CisJaW50ICgqaW52YWxpZGF0ZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBsb25nKTsKKwlpbnQgKCpyZWxlYXNlcGFnZSkgKHN0cnVjdCBwYWdlICosIGludCk7CisJc3NpemVfdCAoKmRpcmVjdF9JTykoaW50LCBzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOworCXN0cnVjdCBwYWdlKiAoKmdldF94aXBfcGFnZSkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QsCisJCQlpbnQpOworfTsKKworICB3cml0ZXBhZ2U6IGNhbGxlZCBieSB0aGUgVk0gd3JpdGUgYSBkaXJ0eSBwYWdlIHRvIGJhY2tpbmcgc3RvcmUuCisKKyAgcmVhZHBhZ2U6IGNhbGxlZCBieSB0aGUgVk0gdG8gcmVhZCBhIHBhZ2UgZnJvbSBiYWNraW5nIHN0b3JlLgorCisgIHN5bmNfcGFnZTogY2FsbGVkIGJ5IHRoZSBWTSB0byBub3RpZnkgdGhlIGJhY2tpbmcgc3RvcmUgdG8gcGVyZm9ybSBhbGwKKyAgCXF1ZXVlZCBJL08gb3BlcmF0aW9ucyBmb3IgYSBwYWdlLiBJL08gb3BlcmF0aW9ucyBmb3Igb3RoZXIgcGFnZXMKKwlhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGRyZXNzX3NwYWNlIG9iamVjdCBtYXkgYWxzbyBiZSBwZXJmb3JtZWQuCisKKyAgd3JpdGVwYWdlczogY2FsbGVkIGJ5IHRoZSBWTSB0byB3cml0ZSBvdXQgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAJYWRkcmVzc19zcGFjZSBvYmplY3QuCisKKyAgc2V0X3BhZ2VfZGlydHk6IGNhbGxlZCBieSB0aGUgVk0gdG8gc2V0IGEgcGFnZSBkaXJ0eS4KKworICByZWFkcGFnZXM6IGNhbGxlZCBieSB0aGUgVk0gdG8gcmVhZCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3Nfc3BhY2UKKyAgCW9iamVjdC4KKworICBwcmVwYXJlX3dyaXRlOiBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgd3JpdGUgcGF0aCBpbiBWTSB0byBzZXQgdXAgYSB3cml0ZQorICAJcmVxdWVzdCBmb3IgYSBwYWdlLgorCisgIGNvbW1pdF93cml0ZTogY2FsbGVkIGJ5IHRoZSBnZW5lcmljIHdyaXRlIHBhdGggaW4gVk0gdG8gd3JpdGUgcGFnZSB0bworICAJaXRzIGJhY2tpbmcgc3RvcmUuCisKKyAgYm1hcDogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbWFwIGEgbG9naWNhbCBibG9jayBvZmZzZXQgd2l0aGluIG9iamVjdCB0bworICAJcGh5c2ljYWwgYmxvY2sgbnVtYmVyLiBUaGlzIG1ldGhvZCBpcyB1c2UgYnkgZm9yIHRoZSBsZWdhY3kgRklCTUFQCisJaW9jdGwuIE90aGVyIHVzZXMgYXJlIGRpc2NvdXJhZ2VkLgorCisgIGludmFsaWRhdGVwYWdlOiBjYWxsZWQgYnkgdGhlIFZNIG9uIHRydW5jYXRlIHRvIGRpc2Fzc29jaWF0ZSBhIHBhZ2UgZnJvbSBpdHMKKyAgCWFkZHJlc3Nfc3BhY2UgbWFwcGluZy4KKworICByZWxlYXNlcGFnZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVsZWFzZSBmaWxlc3lzdGVtIHNwZWNpZmljIG1ldGFkYXRhIGZyb20KKyAgCWEgcGFnZS4KKworICBkaXJlY3RfSU86IGNhbGxlZCBieSB0aGUgVk0gZm9yIGRpcmVjdCBJL08gd3JpdGVzIGFuZCByZWFkcy4KKworICBnZXRfeGlwX3BhZ2U6IGNhbGxlZCBieSB0aGUgVk0gdG8gdHJhbnNsYXRlIGEgYmxvY2sgbnVtYmVyIHRvIGEgcGFnZS4KKwlUaGUgcGFnZSBpcyB2YWxpZCB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC4KKwlGaWxlc3lzdGVtcyB0aGF0IHdhbnQgdG8gdXNlIGV4ZWN1dGUtaW4tcGxhY2UgKFhJUCkgbmVlZCB0byBpbXBsZW1lbnQKKwlpdC4gIEFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIGZzL2V4dDIveGlwLmMuCisKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGRlc2NyaWJlcyBob3cgdGhlIFZGUyBjYW4gbWFuaXB1bGF0ZSBhbiBvcGVuIGZpbGUuIEFzIG9mIGtlcm5lbAotMi4xLjk5LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6CisyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB7CiAJbG9mZl90ICgqbGxzZWVrKSAoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwotCXNzaXplX3QgKCpyZWFkKSAoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLQlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgbG9mZl90ICopOworCXNzaXplX3QgKCpyZWFkKSAoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisJc3NpemVfdCAoKmFpb19yZWFkKSAoc3RydWN0IGtpb2NiICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90KTsKKwlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlzc2l6ZV90ICgqYWlvX3dyaXRlKSAoc3RydWN0IGtpb2NiICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90KTsKIAlpbnQgKCpyZWFkZGlyKSAoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwogCXVuc2lnbmVkIGludCAoKnBvbGwpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CiAJaW50ICgqaW9jdGwpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlsb25nICgqdW5sb2NrZWRfaW9jdGwpIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCWxvbmcgKCpjb21wYXRfaW9jdGwpIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCWludCAoKm1tYXApIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiAJaW50ICgqb3BlbikgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKwlpbnQgKCpmbHVzaCkgKHN0cnVjdCBmaWxlICopOwogCWludCAoKnJlbGVhc2UpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci0JaW50ICgqZnN5bmMpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwotCWludCAoKmZhc3luYykgKHN0cnVjdCBmaWxlICosIGludCk7Ci0JaW50ICgqY2hlY2tfbWVkaWFfY2hhbmdlKSAoa2Rldl90IGRldik7Ci0JaW50ICgqcmV2YWxpZGF0ZSkgKGtkZXZfdCBkZXYpOworCWludCAoKmZzeW5jKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQgZGF0YXN5bmMpOworCWludCAoKmFpb19mc3luYykgKHN0cnVjdCBraW9jYiAqLCBpbnQgZGF0YXN5bmMpOworCWludCAoKmZhc3luYykgKGludCwgc3RydWN0IGZpbGUgKiwgaW50KTsKIAlpbnQgKCpsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOworCXNzaXplX3QgKCpyZWFkdikgKHN0cnVjdCBmaWxlICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QgKik7CisJc3NpemVfdCAoKndyaXRldikgKHN0cnVjdCBmaWxlICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QgKik7CisJc3NpemVfdCAoKnNlbmRmaWxlKSAoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosIHNpemVfdCwgcmVhZF9hY3Rvcl90LCB2b2lkICopOworCXNzaXplX3QgKCpzZW5kcGFnZSkgKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICosIGludCwgc2l6ZV90LCBsb2ZmX3QgKiwgaW50KTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X3VubWFwcGVkX2FyZWEpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmNoZWNrX2ZsYWdzKShpbnQpOworCWludCAoKmRpcl9ub3RpZnkpKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZyk7CisJaW50ICgqZmxvY2spIChzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CiB9OwogCiBBZ2FpbiwgYWxsIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrcyBiZWluZyBoZWxkLCB1bmxlc3MKQEAgLTM2Miw4ICs1NDQsMTIgQEAKIAogICByZWFkOiBjYWxsZWQgYnkgcmVhZCgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMKIAorICBhaW9fcmVhZDogY2FsbGVkIGJ5IGlvX3N1Ym1pdCgyKSBhbmQgb3RoZXIgYXN5bmNocm9ub3VzIEkvTyBvcGVyYXRpb25zCisKICAgd3JpdGU6IGNhbGxlZCBieSB3cml0ZSgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMKIAorICBhaW9fd3JpdGU6IGNhbGxlZCBieSBpb19zdWJtaXQoMikgYW5kIG90aGVyIGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9ucworCiAgIHJlYWRkaXI6IGNhbGxlZCB3aGVuIHRoZSBWRlMgbmVlZHMgdG8gcmVhZCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzCiAKICAgcG9sbDogY2FsbGVkIGJ5IHRoZSBWRlMgd2hlbiBhIHByb2Nlc3Mgd2FudHMgdG8gY2hlY2sgaWYgdGhlcmUgaXMKQEAgLTM3MiwxOCArNTU4LDI1IEBACiAKICAgaW9jdGw6IGNhbGxlZCBieSB0aGUgaW9jdGwoMikgc3lzdGVtIGNhbGwKIAorICB1bmxvY2tlZF9pb2N0bDogY2FsbGVkIGJ5IHRoZSBpb2N0bCgyKSBzeXN0ZW0gY2FsbC4gRmlsZXN5c3RlbXMgdGhhdCBkbyBub3QKKyAgCXJlcXVpcmUgdGhlIEJLTCBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGlvY3RsKCkgYWJvdmUuCisKKyAgY29tcGF0X2lvY3RsOiBjYWxsZWQgYnkgdGhlIGlvY3RsKDIpIHN5c3RlbSBjYWxsIHdoZW4gMzIgYml0IHN5c3RlbSBjYWxscworIAkgYXJlIHVzZWQgb24gNjQgYml0IGtlcm5lbHMuCisKICAgbW1hcDogY2FsbGVkIGJ5IHRoZSBtbWFwKDIpIHN5c3RlbSBjYWxsCiAKICAgb3BlbjogY2FsbGVkIGJ5IHRoZSBWRlMgd2hlbiBhbiBpbm9kZSBzaG91bGQgYmUgb3BlbmVkLiBXaGVuIHRoZSBWRlMKLQlvcGVucyBhIGZpbGUsIGl0IGNyZWF0ZXMgYSBuZXcgInN0cnVjdCBmaWxlIiBhbmQgaW5pdGlhbGlzZXMKLQl0aGUgImZfb3AiIGZpbGUgb3BlcmF0aW9ucyBtZW1iZXIgd2l0aCB0aGUgImRlZmF1bHRfZmlsZV9vcHMiCi0JZmllbGQgaW4gdGhlIGlub2RlIHN0cnVjdHVyZS4gSXQgdGhlbiBjYWxscyB0aGUgb3BlbiBtZXRob2QKLQlmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBmaWxlIHN0cnVjdHVyZS4gWW91IG1pZ2h0IHRoaW5rIHRoYXQKLQl0aGUgb3BlbiBtZXRob2QgcmVhbGx5IGJlbG9uZ3MgaW4gInN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIiwKLQlhbmQgeW91IG1heSBiZSByaWdodC4gSSB0aGluayBpdCdzIGRvbmUgdGhlIHdheSBpdCBpcyBiZWNhdXNlCi0JaXQgbWFrZXMgZmlsZXN5c3RlbXMgc2ltcGxlciB0byBpbXBsZW1lbnQuIFRoZSBvcGVuKCkgbWV0aG9kCi0JaXMgYSBnb29kIHBsYWNlIHRvIGluaXRpYWxpc2UgdGhlICJwcml2YXRlX2RhdGEiIG1lbWJlciBpbiB0aGUKLQlmaWxlIHN0cnVjdHVyZSBpZiB5b3Ugd2FudCB0byBwb2ludCB0byBhIGRldmljZSBzdHJ1Y3R1cmUKKwlvcGVucyBhIGZpbGUsIGl0IGNyZWF0ZXMgYSBuZXcgInN0cnVjdCBmaWxlIi4gSXQgdGhlbiBjYWxscyB0aGUKKwlvcGVuIG1ldGhvZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBmaWxlIHN0cnVjdHVyZS4gWW91IG1pZ2h0CisJdGhpbmsgdGhhdCB0aGUgb3BlbiBtZXRob2QgcmVhbGx5IGJlbG9uZ3MgaW4KKwkic3RydWN0IGlub2RlX29wZXJhdGlvbnMiLCBhbmQgeW91IG1heSBiZSByaWdodC4gSSB0aGluayBpdCdzCisJZG9uZSB0aGUgd2F5IGl0IGlzIGJlY2F1c2UgaXQgbWFrZXMgZmlsZXN5c3RlbXMgc2ltcGxlciB0bworCWltcGxlbWVudC4gVGhlIG9wZW4oKSBtZXRob2QgaXMgYSBnb29kIHBsYWNlIHRvIGluaXRpYWxpemUgdGhlCisJInByaXZhdGVfZGF0YSIgbWVtYmVyIGluIHRoZSBmaWxlIHN0cnVjdHVyZSBpZiB5b3Ugd2FudCB0byBwb2ludAorCXRvIGEgZGV2aWNlIHN0cnVjdHVyZQorCisgIGZsdXNoOiBjYWxsZWQgYnkgdGhlIGNsb3NlKDIpIHN5c3RlbSBjYWxsIHRvIGZsdXNoIGEgZmlsZQogCiAgIHJlbGVhc2U6IGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhbiBvcGVuIGZpbGUgaXMgY2xvc2VkCiAKQEAgLTM5Miw2ICs1ODUsMjMgQEAKICAgZmFzeW5jOiBjYWxsZWQgYnkgdGhlIGZjbnRsKDIpIHN5c3RlbSBjYWxsIHdoZW4gYXN5bmNocm9ub3VzCiAJKG5vbi1ibG9ja2luZykgbW9kZSBpcyBlbmFibGVkIGZvciBhIGZpbGUKIAorICBsb2NrOiBjYWxsZWQgYnkgdGhlIGZjbnRsKDIpIHN5c3RlbSBjYWxsIGZvciBGX0dFVExLLCBGX1NFVExLLCBhbmQgRl9TRVRMS1cKKyAgCWNvbW1hbmRzCisKKyAgcmVhZHY6IGNhbGxlZCBieSB0aGUgcmVhZHYoMikgc3lzdGVtIGNhbGwKKworICB3cml0ZXY6IGNhbGxlZCBieSB0aGUgd3JpdGV2KDIpIHN5c3RlbSBjYWxsCisKKyAgc2VuZGZpbGU6IGNhbGxlZCBieSB0aGUgc2VuZGZpbGUoMikgc3lzdGVtIGNhbGwKKworICBnZXRfdW5tYXBwZWRfYXJlYTogY2FsbGVkIGJ5IHRoZSBtbWFwKDIpIHN5c3RlbSBjYWxsCisKKyAgY2hlY2tfZmxhZ3M6IGNhbGxlZCBieSB0aGUgZmNudGwoMikgc3lzdGVtIGNhbGwgZm9yIEZfU0VURkwgY29tbWFuZAorCisgIGRpcl9ub3RpZnk6IGNhbGxlZCBieSB0aGUgZmNudGwoMikgc3lzdGVtIGNhbGwgZm9yIEZfTk9USUZZIGNvbW1hbmQKKworICBmbG9jazogY2FsbGVkIGJ5IHRoZSBmbG9jaygyKSBzeXN0ZW0gY2FsbAorCiBOb3RlIHRoYXQgdGhlIGZpbGUgb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHNwZWNpZmljCiBmaWxlc3lzdGVtIGluIHdoaWNoIHRoZSBpbm9kZSByZXNpZGVzLiBXaGVuIG9wZW5pbmcgYSBkZXZpY2Ugbm9kZQogKGNoYXJhY3RlciBvciBibG9jayBzcGVjaWFsKSBtb3N0IGZpbGVzeXN0ZW1zIHdpbGwgY2FsbCBzcGVjaWFsCkBAIC00MDAsMjkgKzYxMCwyOCBAQAogb3BlcmF0aW9ucyB3aXRoIHRob3NlIGZvciB0aGUgZGV2aWNlIGRyaXZlciwgYW5kIHRoZW4gcHJvY2VlZCB0byBjYWxsCiB0aGUgbmV3IG9wZW4oKSBtZXRob2QgZm9yIHRoZSBmaWxlLiBUaGlzIGlzIGhvdyBvcGVuaW5nIGEgZGV2aWNlIGZpbGUKIGluIHRoZSBmaWxlc3lzdGVtIGV2ZW50dWFsbHkgZW5kcyB1cCBjYWxsaW5nIHRoZSBkZXZpY2UgZHJpdmVyIG9wZW4oKQotbWV0aG9kLiBOb3RlIHRoZSBkZXZmcyAodGhlIERldmljZSBGaWxlU3lzdGVtKSBoYXMgYSBtb3JlIGRpcmVjdCBwYXRoCi1mcm9tIGRldmljZSBub2RlIHRvIGRldmljZSBkcml2ZXIgKHRoaXMgaXMgYW4gdW5vZmZpY2lhbCBrZXJuZWwKLXBhdGNoKS4KK21ldGhvZC4KIAogCi1EaXJlY3RvcnkgRW50cnkgQ2FjaGUgKGRjYWNoZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RpcmVjdG9yeSBFbnRyeSBDYWNoZSAoZGNhY2hlKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIAogc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGRlc2NyaWJlcyBob3cgYSBmaWxlc3lzdGVtIGNhbiBvdmVybG9hZCB0aGUgc3RhbmRhcmQgZGVudHJ5CiBvcGVyYXRpb25zLiBEZW50cmllcyBhbmQgdGhlIGRjYWNoZSBhcmUgdGhlIGRvbWFpbiBvZiB0aGUgVkZTIGFuZCB0aGUKIGluZGl2aWR1YWwgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbnMuIERldmljZSBkcml2ZXJzIGhhdmUgbm8gYnVzaW5lc3MKIGhlcmUuIFRoZXNlIG1ldGhvZHMgbWF5IGJlIHNldCB0byBOVUxMLCBhcyB0aGV5IGFyZSBlaXRoZXIgb3B0aW9uYWwgb3IKLXRoZSBWRlMgdXNlcyBhIGRlZmF1bHQuIEFzIG9mIGtlcm5lbCAyLjEuOTksIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUKK3RoZSBWRlMgdXNlcyBhIGRlZmF1bHQuIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUKIGRlZmluZWQ6CiAKIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB7Ci0JaW50ICgqZF9yZXZhbGlkYXRlKShzdHJ1Y3QgZGVudHJ5ICopOworCWludCAoKmRfcmV2YWxpZGF0ZSkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogCWludCAoKmRfaGFzaCkgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKik7CiAJaW50ICgqZF9jb21wYXJlKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcXN0ciAqLCBzdHJ1Y3QgcXN0ciAqKTsKLQl2b2lkICgqZF9kZWxldGUpKHN0cnVjdCBkZW50cnkgKik7CisJaW50ICgqZF9kZWxldGUpKHN0cnVjdCBkZW50cnkgKik7CiAJdm9pZCAoKmRfcmVsZWFzZSkoc3RydWN0IGRlbnRyeSAqKTsKIAl2b2lkICgqZF9pcHV0KShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqKTsKIH07CkBAIC00NTEsNiArNjYwLDcgQEAKIG9mIGNoaWxkIGRlbnRyaWVzLiBDaGlsZCBkZW50cmllcyBhcmUgYmFzaWNhbGx5IGxpa2UgZmlsZXMgaW4gYQogZGlyZWN0b3J5LgogCisKIERpcmVjdG9yeSBFbnRyeSBDYWNoZSBBUElzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NzEsNyArNjgxLDcgQEAKIAkiZF9kZWxldGUiIG1ldGhvZCBpcyBjYWxsZWQKIAogICBkX2Ryb3A6IHRoaXMgdW5oYXNoZXMgYSBkZW50cnkgZnJvbSBpdHMgcGFyZW50cyBoYXNoIGxpc3QuIEEKLQlzdWJzZXF1ZW50IGNhbGwgdG8gZHB1dCgpIHdpbGwgZGVsbG9jYXRlIHRoZSBkZW50cnkgaWYgaXRzCisJc3Vic2VxdWVudCBjYWxsIHRvIGRwdXQoKSB3aWxsIGRlYWxsb2NhdGUgdGhlIGRlbnRyeSBpZiBpdHMKIAl1c2FnZSBjb3VudCBkcm9wcyB0byAwCiAKICAgZF9kZWxldGU6IGRlbGV0ZSBhIGRlbnRyeS4gSWYgdGhlcmUgYXJlIG5vIG90aGVyIG9wZW4gcmVmZXJlbmNlcyB0bwpAQCAtNTA3LDE2ICs3MTcsMTYgQEAKIG9mIHRoZSBwYXRobmFtZSBhbmQgdXNpbmcgdGhhdCBkZW50cnkgYWxvbmcgd2l0aCB0aGUgbmV4dAogY29tcG9uZW50IHRvIGxvb2sgdXAgdGhlIG5leHQgbGV2ZWwgYW5kIHNvIG9uLiBTaW5jZSBpdAogaXMgYSBmcmVxdWVudCBvcGVyYXRpb24gZm9yIHdvcmtsb2FkcyBsaWtlIG11bHRpdXNlcgotZW52aXJvbm1lbnRzIGFuZCB3ZWJzZXJ2ZXJzLCBpdCBpcyBpbXBvcnRhbnQgdG8gb3B0aW1pemUKK2Vudmlyb25tZW50cyBhbmQgd2ViIHNlcnZlcnMsIGl0IGlzIGltcG9ydGFudCB0byBvcHRpbWl6ZQogdGhpcyBwYXRoLgogCiBQcmlvciB0byAyLjUuMTAsIGRjYWNoZV9sb2NrIHdhcyBhY3F1aXJlZCBpbiBkX2xvb2t1cCBhbmQgdGh1cwogaW4gZXZlcnkgY29tcG9uZW50IGR1cmluZyBwYXRoIGxvb2stdXAuIFNpbmNlIDIuNS4xMCBvbndhcmRzLAotZmFzdHdhbGsgYWxnb3JpdGhtIGNoYW5nZWQgdGhpcyBieSBob2xkaW5nIHRoZSBkY2FjaGVfbG9jaworZmFzdC13YWxrIGFsZ29yaXRobSBjaGFuZ2VkIHRoaXMgYnkgaG9sZGluZyB0aGUgZGNhY2hlX2xvY2sKIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHdhbGtpbmcgYXMgbWFueSBjYWNoZWQgcGF0aCBjb21wb25lbnQKLWRlbnRyaWVzIGFzIHBvc3NpYmxlLiBUaGlzIHNpZ25maWNhbnRseSBkZWNyZWFzZXMgdGhlIG51bWJlcgorZGVudHJpZXMgYXMgcG9zc2libGUuIFRoaXMgc2lnbmlmaWNhbnRseSBkZWNyZWFzZXMgdGhlIG51bWJlcgogb2YgYWNxdWlzaXRpb24gb2YgZGNhY2hlX2xvY2suIEhvd2V2ZXIgaXQgYWxzbyBpbmNyZWFzZXMgdGhlCi1sb2NrIGhvbGQgdGltZSBzaWduZmljYW50bHkgYW5kIGFmZmVjdHMgcGVyZm9ybWFuY2UgaW4gbGFyZ2UKK2xvY2sgaG9sZCB0aW1lIHNpZ25pZmljYW50bHkgYW5kIGFmZmVjdHMgcGVyZm9ybWFuY2UgaW4gbGFyZ2UKIFNNUCBtYWNoaW5lcy4gU2luY2UgMi41LjYyIGtlcm5lbCwgZGNhY2hlIGhhcyBiZWVuIHVzaW5nCiBhIG5ldyBsb2NraW5nIG1vZGVsIHRoYXQgdXNlcyBSQ1UgdG8gbWFrZSBkY2FjaGUgbG9vay11cAogbG9jay1mcmVlLgpAQCAtNTI3LDcgKzczNyw3IEBACiBhcyBkX2lub2RlIGFuZCBzZXZlcmFsIG90aGVyIHRoaW5ncyBsaWtlIG1vdW50IGxvb2stdXAuIFJDVS1iYXNlZAogY2hhbmdlcyBhZmZlY3Qgb25seSB0aGUgd2F5IHRoZSBoYXNoIGNoYWluIGlzIHByb3RlY3RlZC4gRm9yIGV2ZXJ5dGhpbmcKIGVsc2UgdGhlIGRjYWNoZV9sb2NrIG11c3QgYmUgdGFrZW4gZm9yIGJvdGggdHJhdmVyc2luZyBhcyB3ZWxsIGFzCi11cGRhdGluZy4gVGhlIGhhc2ggY2hhaW4gdXBkYXRpb25zIHRvbyB0YWtlIHRoZSBkY2FjaGVfbG9jay4KK3VwZGF0aW5nLiBUaGUgaGFzaCBjaGFpbiB1cGRhdGVzIHRvbyB0YWtlIHRoZSBkY2FjaGVfbG9jay4KIFRoZSBzaWduaWZpY2FudCBjaGFuZ2UgaXMgdGhlIHdheSBkX2xvb2t1cCB0cmF2ZXJzZXMgdGhlIGhhc2ggY2hhaW4sCiBpdCBkb2Vzbid0IGFjcXVpcmUgdGhlIGRjYWNoZV9sb2NrIGZvciB0aGlzIGFuZCByZWx5IG9uIFJDVSB0bwogZW5zdXJlIHRoYXQgdGhlIGRlbnRyeSBoYXMgbm90IGJlZW4gKmZyZWVkKi4KQEAgLTUzNSwxNCArNzQ1LDE1IEBACiAKIERjYWNoZSBsb2NraW5nIGRldGFpbHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogRm9yIG1hbnkgbXVsdGktdXNlciB3b3JrbG9hZHMsIG9wZW4oKSBhbmQgc3RhdCgpIG9uIGZpbGVzIGFyZQogdmVyeSBmcmVxdWVudGx5IG9jY3VycmluZyBvcGVyYXRpb25zLiBCb3RoIGludm9sdmUgd2Fsa2luZwogb2YgcGF0aCBuYW1lcyB0byBmaW5kIHRoZSBkZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUKIGNvbmNlcm5lZCBmaWxlLiBJbiAyLjQga2VybmVsLCBkY2FjaGVfbG9jayB3YXMgaGVsZAogZHVyaW5nIGxvb2stdXAgb2YgZWFjaCBwYXRoIGNvbXBvbmVudC4gQ29udGVudGlvbiBhbmQKLWNhY2hlbGluZSBib3VuY2luZyBvZiB0aGlzIGdsb2JhbCBsb2NrIGNhdXNlZCBzaWduaWZpY2FudAorY2FjaGUtbGluZSBib3VuY2luZyBvZiB0aGlzIGdsb2JhbCBsb2NrIGNhdXNlZCBzaWduaWZpY2FudAogc2NhbGFiaWxpdHkgcHJvYmxlbXMuIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBSQ1UKLWluIGxpbnV4IGtlcm5lbCwgdGhpcyB3YXMgd29ya2VkIGFyb3VuZCBieSBtYWtpbmcKK2luIExpbnV4IGtlcm5lbCwgdGhpcyB3YXMgd29ya2VkIGFyb3VuZCBieSBtYWtpbmcKIHRoZSBsb29rLXVwIG9mIHBhdGggY29tcG9uZW50cyBkdXJpbmcgcGF0aCB3YWxraW5nIGxvY2stZnJlZS4KIAogCkBAIC01NjIsNyArNzczLDcgQEAKIDIuIEluc2VydGlvbiBvZiBhIGRlbnRyeSBpbnRvIHRoZSBoYXNoIHRhYmxlIGlzIGRvbmUgdXNpbmcKICAgIGhsaXN0X2FkZF9oZWFkX3JjdSgpIHdoaWNoIHRha2UgY2FyZSBvZiBvcmRlcmluZyB0aGUgd3JpdGVzIC0KICAgIHRoZSB3cml0ZXMgdG8gdGhlIGRlbnRyeSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHRoZSBkZW50cnkKLSAgIGlzIGluc2VydGVkLiBUaGlzIHdvcmtzIGluIGNvbmp1Y3Rpb24gd2l0aCBobGlzdF9mb3JfZWFjaF9yY3UoKQorICAgaXMgaW5zZXJ0ZWQuIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBobGlzdF9mb3JfZWFjaF9yY3UoKQogICAgd2hpbGUgd2Fsa2luZyB0aGUgaGFzaCBjaGFpbi4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdAogICAgYWxsIGluaXRpYWxpemF0aW9uIHRvIHRoZSBkZW50cnkgbXVzdCBiZSBkb25lIGJlZm9yZSBobGlzdF9hZGRfaGVhZF9yY3UoKQogICAgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBkY2FjaGVfbG9jayBwcm90ZWN0aW9uIHdoaWxlIHRyYXZlcnNpbmcKQEAgLTU4NCw3ICs3OTUsNyBAQAogICAgdGhlIHNhbWUuICBJbiBzb21lIHNlbnNlLCBkY2FjaGVfcmN1IHBhdGggd2Fsa2luZyBsb29rcyBsaWtlCiAgICB0aGUgcHJlLTIuNS4xMCB2ZXJzaW9uLgogCi01LiBBbGwgZGVudHJ5IGhhc2ggY2hhaW4gdXBkYXRpb25zIG11c3QgdGFrZSB0aGUgZGNhY2hlX2xvY2sgYXMgd2VsbCBhcworNS4gQWxsIGRlbnRyeSBoYXNoIGNoYWluIHVwZGF0ZXMgbXVzdCB0YWtlIHRoZSBkY2FjaGVfbG9jayBhcyB3ZWxsIGFzCiAgICB0aGUgcGVyLWRlbnRyeSBsb2NrIGluIHRoYXQgb3JkZXIuIGRwdXQoKSBkb2VzIHRoaXMgdG8gZW5zdXJlCiAgICB0aGF0IGEgZGVudHJ5IHRoYXQgaGFzIGp1c3QgYmVlbiBsb29rZWQgdXAgaW4gYW5vdGhlciBDUFUKICAgIGRvZXNuJ3QgZ2V0IGRlbGV0ZWQgYmVmb3JlIGRnZXQoKSBjYW4gYmUgZG9uZSBvbiBpdC4KQEAgLTY0MCwxMCArODUxLDEwIEBACiAgICBTaW5jZSB3ZSByZWRvIHRoZSBkX3BhcmVudCBjaGVjayBhbmQgY29tcGFyZSBuYW1lIHdoaWxlIGhvbGRpbmcKICAgIGRfbG9jaywgbG9jay1mcmVlIGxvb2stdXAgd2lsbCBub3QgcmFjZSBhZ2FpbnN0IGRfbW92ZSgpLgogCi00LiBUaGVyZSBjYW4gYmUgYSB0aGVvcml0aWNhbCByYWNlIHdoZW4gYSBkZW50cnkga2VlcHMgY29taW5nIGJhY2sKKzQuIFRoZXJlIGNhbiBiZSBhIHRoZW9yZXRpY2FsIHJhY2Ugd2hlbiBhIGRlbnRyeSBrZWVwcyBjb21pbmcgYmFjawogICAgdG8gb3JpZ2luYWwgYnVja2V0IGR1ZSB0byBkb3VibGUgbW92ZXMuIER1ZSB0byB0aGlzIGxvb2stdXAgbWF5CiAgICBjb25zaWRlciB0aGF0IGl0IGhhcyBuZXZlciBtb3ZlZCBhbmQgY2FuIGVuZCB1cCBpbiBhIGluZmluaXRlIGxvb3AuCi0gICBCdXQgdGhpcyBpcyBub3QgYW55IHdvcnNlIHRoYXQgdGhlb3JpdGljYWwgbGl2ZWxvY2tzIHdlIGFscmVhZHkKKyAgIEJ1dCB0aGlzIGlzIG5vdCBhbnkgd29yc2UgdGhhdCB0aGVvcmV0aWNhbCBsaXZlbG9ja3Mgd2UgYWxyZWFkeQogICAgaGF2ZSBpbiB0aGUga2VybmVsLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dCBiL0RvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dAppbmRleCAxYzQ4ZjBlLi4xMDMxMmJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0CkBAIC0yLDcgKzIsNyBAQAogCQkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCQkgICAgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+Ci0JCQlMYXN0IHVwZGF0ZSAyMDAyLTAxLTAxCisJCQlMYXN0IHVwZGF0ZSAyMDA1LTA5LTAyCiAKIE9uIHRoZSBpMzg2IHBsYXRmb3JtLCB0aGUgTGludXgga2VybmVsIHVzZXMgYSByYXRoZXIgY29tcGxpY2F0ZWQgYm9vdAogY29udmVudGlvbi4gIFRoaXMgaGFzIGV2b2x2ZWQgcGFydGlhbGx5IGR1ZSB0byBoaXN0b3JpY2FsIGFzcGVjdHMsIGFzCkBAIC0zNCw2ICszNCw4IEBACiBQcm90b2NvbCAyLjAzOgkoS2VybmVsIDIuNC4xOC1wcmUxKSBFeHBsaWNpdGx5IG1ha2VzIHRoZSBoaWdoZXN0IHBvc3NpYmxlCiAJCWluaXRyZCBhZGRyZXNzIGF2YWlsYWJsZSB0byB0aGUgYm9vdGxvYWRlci4KIAorUHJvdG9jb2wgMi4wNDoJKEtlcm5lbCAyLjYuMTQpIEV4dGVuZCB0aGUgc3lzc2l6ZSBmaWVsZCB0byBmb3VyIGJ5dGVzLgorCiAKICoqKiogTUVNT1JZIExBWU9VVAogCkBAIC0xMDMsMTAgKzEwNSw5IEBACiBPZmZzZXQJUHJvdG8JTmFtZQkJTWVhbmluZwogL1NpemUKIAotMDFGMS8xCUFMTAlzZXR1cF9zZWN0cwlUaGUgc2l6ZSBvZiB0aGUgc2V0dXAgaW4gc2VjdG9ycworMDFGMS8xCUFMTCgxCXNldHVwX3NlY3RzCVRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBzZWN0b3JzCiAwMUYyLzIJQUxMCXJvb3RfZmxhZ3MJSWYgc2V0LCB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWRvbmx5Ci0wMUY0LzIJQUxMCXN5c3NpemUJCURPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3QuUyB1c2Ugb25seQotMDFGNi8yCUFMTAlzd2FwX2RldglETyBOT1QgVVNFIC0gb2Jzb2xldGUKKzAxRjQvNAkyLjA0KygyCXN5c3NpemUJCVRoZSBzaXplIG9mIHRoZSAzMi1iaXQgY29kZSBpbiAxNi1ieXRlIHBhcmFzCiAwMUY4LzIJQUxMCXJhbV9zaXplCURPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3QuUyB1c2Ugb25seQogMDFGQS8yCUFMTAl2aWRfbW9kZQlWaWRlbyBtb2RlIGNvbnRyb2wKIDAxRkMvMglBTEwJcm9vdF9kZXYJRGVmYXVsdCByb290IGRldmljZSBudW1iZXIKQEAgLTEyOSw4ICsxMzAsMTIgQEAKIDAyMjgvNAkyLjAyKwljbWRfbGluZV9wdHIJMzItYml0IHBvaW50ZXIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKIDAyMkMvNAkyLjAzKwlpbml0cmRfYWRkcl9tYXgJSGlnaGVzdCBsZWdhbCBpbml0cmQgYWRkcmVzcwogCi1Gb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIHRoZSBzZXR1cF9zZWN0cyBmaWVsZCBjb250YWlucyAwLCB0aGUKLXJlYWwgdmFsdWUgaXMgNC4KKygxKSBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIHRoZSBzZXR1cF9zZWN0cyBmaWVsZCBjb250YWlucyAwLCB0aGUKKyAgICByZWFsIHZhbHVlIGlzIDQuCisKKygyKSBGb3IgYm9vdCBwcm90b2NvbCBwcmlvciB0byAyLjA0LCB0aGUgdXBwZXIgdHdvIGJ5dGVzIG9mIHRoZSBzeXNzaXplCisgICAgZmllbGQgYXJlIHVudXNhYmxlLCB3aGljaCBtZWFucyB0aGUgc2l6ZSBvZiBhIGJ6SW1hZ2Uga2VybmVsCisgICAgY2Fubm90IGJlIGRldGVybWluZWQuCiAKIElmIHRoZSAiSGRyUyIgKDB4NTM3MjY0NDgpIG1hZ2ljIG51bWJlciBpcyBub3QgZm91bmQgYXQgb2Zmc2V0IDB4MjAyLAogdGhlIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiBpcyAib2xkIi4gIExvYWRpbmcgYW4gb2xkIGtlcm5lbCwgdGhlCkBAIC0yMzAsMTIgKzIzNSwxNiBAQAogcmVsZXZhbnQgdG8gdGhlIGJvb3QgbG9hZGVyIGl0c2VsZiwgc2VlICJzcGVjaWFsIGNvbW1hbmQgbGluZSBvcHRpb25zIgogYmVsb3cuCiAKLVRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGlzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB1cCB0byAyNTUKLWNoYXJhY3RlcnMgbG9uZywgcGx1cyB0aGUgZmluYWwgbnVsbC4KK1RoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGlzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjdXJyZW50bHkgdXAgdG8KKzI1NSBjaGFyYWN0ZXJzIGxvbmcsIHBsdXMgdGhlIGZpbmFsIG51bGwuICBBIHN0cmluZyB0aGF0IGlzIHRvbyBsb25nCit3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHJ1bmNhdGVkIGJ5IHRoZSBrZXJuZWwsIGEgYm9vdCBsb2FkZXIgbWF5IGFsbG93CithIGxvbmdlciBjb21tYW5kIGxpbmUgdG8gYmUgcGFzc2VkIHRvIHBlcm1pdCBmdXR1cmUga2VybmVscyB0byBleHRlbmQKK3RoaXMgbGltaXQuCiAKIElmIHRoZSBib290IHByb3RvY29sIHZlcnNpb24gaXMgMi4wMiBvciBsYXRlciwgdGhlIGFkZHJlc3Mgb2YgdGhlCiBrZXJuZWwgY29tbWFuZCBsaW5lIGlzIGdpdmVuIGJ5IHRoZSBoZWFkZXIgZmllbGQgY21kX2xpbmVfcHRyIChzZWUKLWFib3ZlLikKK2Fib3ZlLikgIFRoaXMgYWRkcmVzcyBjYW4gYmUgYW55d2hlcmUgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBzZXR1cAoraGVhcCBhbmQgMHhBMDAwMC4KIAogSWYgdGhlIHByb3RvY29sIHZlcnNpb24gaXMgKm5vdCogMi4wMiBvciBoaWdoZXIsIHRoZSBrZXJuZWwKIGNvbW1hbmQgbGluZSBpcyBlbnRlcmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHJvdG9jb2w6CkBAIC0yNTUsNyArMjY0LDcgQEAKICoqKiogU0FNUExFIEJPT1QgQ09ORklHVVJBVElPTgogCiBBcyBhIHNhbXBsZSBjb25maWd1cmF0aW9uLCBhc3N1bWUgdGhlIGZvbGxvd2luZyBsYXlvdXQgb2YgdGhlIHJlYWwKLW1vZGUgc2VnbWVudDoKK21vZGUgc2VnbWVudCAodGhpcyBpcyBhIHR5cGljYWwsIGFuZCByZWNvbW1lbmRlZCBsYXlvdXQpOgogCiAJMHgwMDAwLTB4N0ZGRglSZWFsIG1vZGUga2VybmVsCiAJMHg4MDAwLTB4OEZGRglTdGFjayBhbmQgaGVhcApAQCAtMzEyLDkgKzMyMSw5IEBACiAKICoqKiogTE9BRElORyBUSEUgUkVTVCBPRiBUSEUgS0VSTkVMCiAKLVRoZSBub24tcmVhbC1tb2RlIGtlcm5lbCBzdGFydHMgYXQgb2Zmc2V0IChzZXR1cF9zZWN0cysxKSo1MTIgaW4gdGhlCi1rZXJuZWwgZmlsZSAoYWdhaW4sIGlmIHNldHVwX3NlY3RzID09IDAgdGhlIHJlYWwgdmFsdWUgaXMgNC4pICBJdAotc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzIDB4MTAwMDAgZm9yIEltYWdlL3pJbWFnZSBrZXJuZWxzIGFuZAorVGhlIDMyLWJpdCAobm9uLXJlYWwtbW9kZSkga2VybmVsIHN0YXJ0cyBhdCBvZmZzZXQgKHNldHVwX3NlY3RzKzEpKjUxMgoraW4gdGhlIGtlcm5lbCBmaWxlIChhZ2FpbiwgaWYgc2V0dXBfc2VjdHMgPT0gMCB0aGUgcmVhbCB2YWx1ZSBpcyA0LikKK0l0IHNob3VsZCBiZSBsb2FkZWQgYXQgYWRkcmVzcyAweDEwMDAwIGZvciBJbWFnZS96SW1hZ2Uga2VybmVscyBhbmQKIDB4MTAwMDAwIGZvciBiekltYWdlIGtlcm5lbHMuCiAKIFRoZSBrZXJuZWwgaXMgYSBiekltYWdlIGtlcm5lbCBpZiB0aGUgcHJvdG9jb2wgPj0gMi4wMCBhbmQgdGhlIDB4MDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaWJtLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQKaW5kZXggYzQzN2IxYS4uOGIzZmQ4MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQKQEAgLTEsMTYgKzEsMTYgQEAKIAkJICAgIElCTSBUaGlua1BhZCBBQ1BJIEV4dHJhcyBEcml2ZXIKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMC44Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDggTm92ZW1iZXIgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMC4xMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcgQXVndXN0IDIwMDUKIAogICAgICAgICAgICAgICAgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAdXNlcnMuc2YubmV0PgogCQkgICAgICBodHRwOi8vaWJtLWFjcGkuc2YubmV0LwogCiAKLVRoaXMgaXMgYSBMaW51eCBBQ1BJIGRyaXZlciBmb3IgdGhlIElCTSBUaGlua1BhZCBsYXB0b3BzLiBJdCBhaW1zIHRvCi1zdXBwb3J0IHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlc2UgbGFwdG9wcyB3aGljaCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoCi10aGUgQUNQSSBmcmFtZXdvcmsgYnV0IG5vdCBvdGhlcndpc2Ugc3VwcG9ydGVkIGJ5IHRoZSBnZW5lcmljIExpbnV4Ci1BQ1BJIGRyaXZlcnMuCitUaGlzIGlzIGEgTGludXggQUNQSSBkcml2ZXIgZm9yIHRoZSBJQk0gVGhpbmtQYWQgbGFwdG9wcy4gSXQgc3VwcG9ydHMKK3ZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlc2UgbGFwdG9wcyB3aGljaCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZQorQUNQSSBmcmFtZXdvcmsgYnV0IG5vdCBvdGhlcndpc2Ugc3VwcG9ydGVkIGJ5IHRoZSBnZW5lcmljIExpbnV4IEFDUEkKK2RyaXZlcnMuCiAKIAogU3RhdHVzCkBAIC0yNSw5ICsyNSwxNCBAQAogCS0gVGhpbmtMaWdodCBvbiBhbmQgb2ZmCiAJLSBsaW1pdGVkIGRvY2tpbmcgYW5kIHVuZG9ja2luZwogCS0gVWx0cmFCYXkgZWplY3QKLQktIEV4cGVyaW1lbnRhbDogQ01PUyBjb250cm9sCi0JLSBFeHBlcmltZW50YWw6IExFRCBjb250cm9sCi0JLSBFeHBlcmltZW50YWw6IEFDUEkgc291bmRzCisJLSBDTU9TIGNvbnRyb2wKKwktIExFRCBjb250cm9sCisJLSBBQ1BJIHNvdW5kcworCS0gdGVtcGVyYXR1cmUgc2Vuc29ycworCS0gRXhwZXJpbWVudGFsOiBlbWJlZGRlZCBjb250cm9sbGVyIHJlZ2lzdGVyIGR1bXAKKwktIEV4cGVyaW1lbnRhbDogTENEIGJyaWdodG5lc3MgY29udHJvbAorCS0gRXhwZXJpbWVudGFsOiB2b2x1bWUgY29udHJvbAorCS0gRXhwZXJpbWVudGFsOiBmYW4gc3BlZWQsIGZhbiBlbmFibGUvZGlzYWJsZQogCiBBIGNvbXBhdGliaWxpdHkgdGFibGUgYnkgbW9kZWwgYW5kIGZlYXR1cmUgaXMgbWFpbnRhaW5lZCBvbiB0aGUgd2ViCiBzaXRlLCBodHRwOi8vaWJtLWFjcGkuc2YubmV0Ly4gSSBhcHByZWNpYXRlIGFueSBzdWNjZXNzIG9yIGZhaWx1cmUKQEAgLTkxLDEyICs5NiwxMiBAQAogY29tbWFuZHMgc3VwcG9ydGVkIGJ5IHRoZSB2YXJpb3VzIGZlYXR1cmVzIGlzIGd1YXJhbnRlZWQgdG8gY2hhbmdlCiBmcmVxdWVudGx5LgogCi1Ecml2ZXIgVmVyc2lvbiAtLSAvcHJvYy9hY3BpL2libS9kcml2ZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEcml2ZXIgdmVyc2lvbiAtLSAvcHJvYy9hY3BpL2libS9kcml2ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgZHJpdmVyIG5hbWUgYW5kIHZlcnNpb24uIE5vIGNvbW1hbmRzIGNhbiBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KIAotSG90IEtleXMgLS0gL3Byb2MvYWNwaS9pYm0vaG90a2V5CitIb3Qga2V5cyAtLSAvcHJvYy9hY3BpL2libS9ob3RrZXkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBXaXRob3V0IHRoaXMgZHJpdmVyLCBvbmx5IHRoZSBGbi1GNCBrZXkgKHNsZWVwIGJ1dHRvbikgZ2VuZXJhdGVzIGFuCkBAIC0xODgsNyArMTkzLDcgQEAKIHRoZSBmbGlja2VyaW5nIG9yIHZpZGVvIGNvcnJ1cHRpb24gY2FuIGJlIGF2b2lkZWQuCiAKIFRoZSB2aWRlb19zd2l0Y2ggY29tbWFuZCBjeWNsZXMgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIHZpZGVvIG91dHB1dHMKLShpdCBzdW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIEZuLUY3KS4KKyhpdCBzaW11bGF0ZXMgdGhlIGJlaGF2aW9yIG9mIEZuLUY3KS4KIAogVmlkZW8gZXhwYW5zaW9uIGNhbiBiZSB0b2dnbGVkIHRocm91Z2ggdGhpcyBmZWF0dXJlLiBUaGlzIGNvbnRyb2xzCiB3aGV0aGVyIHRoZSBkaXNwbGF5IGlzIGV4cGFuZGVkIHRvIGZpbGwgdGhlIGVudGlyZSBMQ0Qgc2NyZWVuIHdoZW4gYQpAQCAtMjAxLDYgKzIwNiwxMiBAQAogZmVhdHVyZXMgb2YgdGhpcyBkcml2ZXIsIGFzIGl0IHVzZXMgdGhlIHNhbWUgQUNQSSBtZXRob2RzIGFzCiBGbi1GNy4gVmlkZW8gc3dpdGNoaW5nIG9uIHRoZSBjb25zb2xlIHNob3VsZCBzdGlsbCB3b3JrLgogCitVUERBVEU6IFRoZXJlJ3Mgbm93IGEgcGF0Y2ggZm9yIHRoZSBYLm9yZyBSYWRlb24gZHJpdmVyIHdoaWNoCithZGRyZXNzZXMgdGhpcyBpc3N1ZS4gU29tZSBwZW9wbGUgYXJlIHJlcG9ydGluZyBzdWNjZXNzIHdpdGggdGhlIHBhdGNoCit3aGlsZSBvdGhlcnMgYXJlIHN0aWxsIGhhdmluZyBwcm9ibGVtcy4gRm9yIG1vcmUgaW5mb3JtYXRpb246CisKK2h0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDAKKwogVGhpbmtMaWdodCBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2xpZ2h0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjExLDcgKzIyMiw3IEBACiAJZWNobyBvbiAgPiAvcHJvYy9hY3BpL2libS9saWdodAogCWVjaG8gb2ZmID4gL3Byb2MvYWNwaS9pYm0vbGlnaHQKIAotRG9ja2luZyAvIFVuZG9ja2luZyAtLSAvcHJvYy9hY3BpL2libS9kb2NrCitEb2NraW5nIC8gdW5kb2NraW5nIC0tIC9wcm9jL2FjcGkvaWJtL2RvY2sKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBEb2NraW5nIGFuZCB1bmRvY2tpbmcgKGUuZy4gd2l0aCB0aGUgWDQgVWx0cmFCYXNlKSByZXF1aXJlcyBzb21lCkBAIC0yMjgsMTEgKzIzOSwxNSBAQAogd2hlbiBvcmlnaW5hbGx5IGJvb3RlZC4gVGhpcyBpcyBkdWUgdG8gdGhlIGN1cnJlbnQgbGFjayBvZiBzdXBwb3J0IGZvcgogaG90IHBsdWdnaW5nIG9mIGRldmljZXMgaW4gdGhlIExpbnV4IEFDUEkgZnJhbWV3b3JrLiBJZiB0aGUgbGFwdG9wIHdhcwogYm9vdGVkIHdoaWxlIG5vdCBpbiB0aGUgZG9jaywgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGlzIHNob3duIGluIHRoZQotbG9nczogImlibV9hY3BpOiBkb2NrIGRldmljZSBub3QgcHJlc2VudCIuIE5vIGRvY2stcmVsYXRlZCBldmVudHMgYXJlCi1nZW5lcmF0ZWQgYnV0IHRoZSBkb2NrIGFuZCB1bmRvY2sgY29tbWFuZHMgZGVzY3JpYmVkIGJlbG93IHN0aWxsCi13b3JrLiBUaGV5IGNhbiBiZSBleGVjdXRlZCBtYW51YWxseSBvciB0cmlnZ2VyZWQgYnkgRm4ga2V5Ci1jb21iaW5hdGlvbnMgKHNlZSB0aGUgZXhhbXBsZSBhY3BpZCBjb25maWd1cmF0aW9uIGZpbGVzIGluY2x1ZGVkIGluCi10aGUgZHJpdmVyIHRhcmJhbGwgcGFja2FnZSBhdmFpbGFibGUgb24gdGhlIHdlYiBzaXRlKS4KK2xvZ3M6CisKKwlNYXIgMTcgMDE6NDI6MzQgYWVybyBrZXJuZWw6IGlibV9hY3BpOiBkb2NrIGRldmljZSBub3QgcHJlc2VudAorCitJbiB0aGlzIGNhc2UsIG5vIGRvY2stcmVsYXRlZCBldmVudHMgYXJlIGdlbmVyYXRlZCBidXQgdGhlIGRvY2sgYW5kCit1bmRvY2sgY29tbWFuZHMgZGVzY3JpYmVkIGJlbG93IHN0aWxsIHdvcmsuIFRoZXkgY2FuIGJlIGV4ZWN1dGVkCittYW51YWxseSBvciB0cmlnZ2VyZWQgYnkgRm4ga2V5IGNvbWJpbmF0aW9ucyAoc2VlIHRoZSBleGFtcGxlIGFjcGlkCitjb25maWd1cmF0aW9uIGZpbGVzIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIgdGFyYmFsbCBwYWNrYWdlIGF2YWlsYWJsZQorb24gdGhlIHdlYiBzaXRlKS4KIAogV2hlbiB0aGUgZWplY3QgcmVxdWVzdCBidXR0b24gb24gdGhlIGRvY2sgaXMgcHJlc3NlZCwgdGhlIGZpcnN0IGV2ZW50CiBhYm92ZSBpcyBnZW5lcmF0ZWQuIFRoZSBoYW5kbGVyIGZvciB0aGlzIGV2ZW50IHNob3VsZCBpc3N1ZSB0aGUKQEAgLTI2Nyw3ICsyODIsNyBAQAogVWx0cmFCYXNlIGRvY2tzIGFuZCAiZHVtYiIgcG9ydCByZXBsaWNhdG9ycyBsaWtlIHRoZSBNaW5pIERvY2sgKHRoZQogbGF0dGVyIGRvbid0IG5lZWQgYW55IEFDUEkgc3VwcG9ydCwgYWN0dWFsbHkpLgogCi1VbHRyYUJheSBFamVjdCAtLSAvcHJvYy9hY3BpL2libS9iYXkKK1VsdHJhQmF5IGVqZWN0IC0tIC9wcm9jL2FjcGkvaWJtL2JheQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEluc2VydGluZyBvciBlamVjdGluZyBhbiBVbHRyYUJheSBkZXZpY2UgcmVxdWlyZXMgc29tZSBhY3Rpb25zIHRvIGJlCkBAIC0yODQsOCArMjk5LDExIEBACiBpcyBpbiB0aGUgZG9jaywgc28gaXQgbWF5IG5vdCBiZSBwcmVzZW50IGlmIHRoZSBsYXB0b3Agd2FzIHVuZG9ja2VkKS4KIFRoaXMgaXMgZHVlIHRvIHRoZSBjdXJyZW50IGxhY2sgb2Ygc3VwcG9ydCBmb3IgaG90IHBsdWdnaW5nIG9mIGRldmljZXMKIGluIHRoZSBMaW51eCBBQ1BJIGZyYW1ld29yay4gSWYgdGhlIGxhcHRvcCB3YXMgYm9vdGVkIHdpdGhvdXQgdGhlCi1VbHRyYUJheSwgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGlzIHNob3duIGluIHRoZSBsb2dzOiAiaWJtX2FjcGk6IGJheQotZGV2aWNlIG5vdCBwcmVzZW50Ii4gTm8gYmF5LXJlbGF0ZWQgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgYnV0IHRoZSBlamVjdAorVWx0cmFCYXksIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBpcyBzaG93biBpbiB0aGUgbG9nczoKKworCU1hciAxNyAwMTo0MjozNCBhZXJvIGtlcm5lbDogaWJtX2FjcGk6IGJheSBkZXZpY2Ugbm90IHByZXNlbnQKKworSW4gdGhpcyBjYXNlLCBubyBiYXktcmVsYXRlZCBldmVudHMgYXJlIGdlbmVyYXRlZCBidXQgdGhlIGVqZWN0CiBjb21tYW5kIGRlc2NyaWJlZCBiZWxvdyBzdGlsbCB3b3Jrcy4gSXQgY2FuIGJlIGV4ZWN1dGVkIG1hbnVhbGx5IG9yCiB0cmlnZ2VyZWQgYnkgYSBob3Qga2V5IGNvbWJpbmF0aW9uLgogCkBAIC0zMDYsMjIgKzMyNCwzMyBAQAogVGhlIGNvbnRlbnRzIG9mIHRoZSAvcHJvYy9hY3BpL2libS9iYXkgZmlsZSBzaG93cyB0aGUgY3VycmVudCBzdGF0dXMKIG9mIHRoZSBVbHRyYUJheSwgYXMgcHJvdmlkZWQgYnkgdGhlIEFDUEkgZnJhbWV3b3JrLgogCi1FeHBlcmltZW50YWwgRmVhdHVyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVhQRVJJTUVOVEFMIHdhcm0gZWplY3Qgc3VwcG9ydCBvbiB0aGUgNjAwZS94LCBBMjJwIGFuZCBBM3ggKFRvIHVzZQordGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlIGV4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuCitsb2FkaW5nIHRoZSBtb2R1bGUpOgogCi1UaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBtYXJrZWQgZXhwZXJpbWVudGFsIGJlY2F1c2UgdXNpbmcgdGhlbQotaW52b2x2ZXMgZ3Vlc3NpbmcgdGhlIGNvcnJlY3QgdmFsdWVzIG9mIHNvbWUgcGFyYW1ldGVycy4gR3Vlc3NpbmcKLWluY29ycmVjdGx5IG1heSBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMgbGlrZSBjcmFzaGluZyB5b3VyCi1UaGlua1BhZC4gVVNFIFRIRVNFIFdJVEggQ0FVVElPTiEgVG8gYWN0aXZhdGUgdGhlbSwgeW91J2xsIG5lZWQgdG8KLXN1cHBseSB0aGUgZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgorVGhlc2UgbW9kZWxzIGRvIG5vdCBoYXZlIGEgYnV0dG9uIG5lYXIgdGhlIFVsdHJhQmF5IGRldmljZSB0byByZXF1ZXN0CithIGhvdCBlamVjdCBidXQgcmF0aGVyIHJlcXVpcmUgdGhlIGxhcHRvcCB0byBiZSBwdXQgdG8gc2xlZXAKKyhzdXNwZW5kLXRvLXJhbSkgYmVmb3JlIHRoZSBiYXkgZGV2aWNlIGlzIGVqZWN0ZWQgb3IgaW5zZXJ0ZWQpLgorVGhlIHNlcXVlbmNlIG9mIHN0ZXBzIHRvIGVqZWN0IHRoZSBkZXZpY2UgaXMgYXMgZm9sbG93czoKIAotRXhwZXJpbWVudGFsOiBDTU9TIGNvbnRyb2wgLSAvcHJvYy9hY3BpL2libS9jbW9zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwllY2hvIGVqZWN0ID4gL3Byb2MvYWNwaS9pYm0vYmF5CisJcHV0IHRoZSBUaGlua1BhZCB0byBzbGVlcAorCXJlbW92ZSB0aGUgZHJpdmUKKwlyZXN1bWUgZnJvbSBzbGVlcAorCWNhdCAvcHJvYy9hY3BpL2libS9iYXkgc2hvdWxkIHNob3cgdGhhdCB0aGUgZHJpdmUgd2FzIHJlbW92ZWQKKworT24gdGhlIEEzeCwgYm90aCB0aGUgVWx0cmFCYXkgMjAwMCBhbmQgVWx0cmFCYXkgUGx1cyBkZXZpY2VzIGFyZQorc3VwcG9ydGVkLiBVc2UgImVqZWN0MiIgaW5zdGVhZCBvZiAiZWplY3QiIGZvciB0aGUgc2Vjb25kIGJheS4KKworTm90ZTogdGhlIFVsdHJhQmF5IGVqZWN0IHN1cHBvcnQgb24gdGhlIDYwMGUveCwgQTIycCBhbmQgQTN4IGlzCitFWFBFUklNRU5UQUwgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFIFdJVEggQ0FVVElPTiEKKworQ01PUyBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2Ntb3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZmVhdHVyZSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFDUEkgZmlybXdhcmUgdG8gY29udHJvbCB0aGUKLVRoaW5rTGlnaHQgb24gbW9zdCBuZXdlciBUaGlua1BhZCBtb2RlbHMuIEl0IGFwcGVhcnMgdGhhdCBpdCBjYW4gYWxzbwotY29udHJvbCBMQ0QgYnJpZ2h0bmVzcywgc291bmRzIHZvbHVtZSBhbmQgbW9yZSwgYnV0IG9ubHkgb24gc29tZQotbW9kZWxzLgorVGhpbmtMaWdodCBvbiBtb3N0IG5ld2VyIFRoaW5rUGFkIG1vZGVscy4gSXQgbWF5IGFsc28gY29udHJvbCBMQ0QKK2JyaWdodG5lc3MsIHNvdW5kcyB2b2x1bWUgYW5kIG1vcmUsIGJ1dCBvbmx5IG9uIHNvbWUgbW9kZWxzLgogCiBUaGUgY29tbWFuZHMgYXJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG51bWJlcnM6CiAKQEAgLTMzMCwxMCArMzU5LDkgQEAKIAllY2hvIDIgPi9wcm9jL2FjcGkvaWJtL2Ntb3MKIAkuLi4KIAotVGhlIHJhbmdlIG9mIG51bWJlcnMgd2hpY2ggYXJlIHVzZWQgaW50ZXJuYWxseSBieSB2YXJpb3VzIG1vZGVscyBpcyAwCi10byAyMSwgYnV0IGl0J3MgcG9zc2libGUgdGhhdCBudW1iZXJzIG91dHNpZGUgdGhpcyByYW5nZSBoYXZlCi1pbnRlcmVzdGluZyBiZWhhdmlvci4gSGVyZSBpcyB0aGUgYmVoYXZpb3Igb24gdGhlIFg0MCAodHBiIGlzIHRoZQotVGhpbmtQYWQgQnV0dG9ucyB1dGlsaXR5KToKK1RoZSByYW5nZSBvZiB2YWxpZCBudW1iZXJzIGlzIDAgdG8gMjEsIGJ1dCBub3QgYWxsIGhhdmUgYW4gZWZmZWN0IGFuZAordGhlIGJlaGF2aW9yIHZhcmllcyBmcm9tIG1vZGVsIHRvIG1vZGVsLiBIZXJlIGlzIHRoZSBiZWhhdmlvciBvbiB0aGUKK1g0MCAodHBiIGlzIHRoZSBUaGlua1BhZCBCdXR0b25zIHV0aWxpdHkpOgogCiAJMCAtIG5vIGVmZmVjdCBidXQgdHBiIHJlcG9ydHMgIlZvbHVtZSBkb3duIgogCTEgLSBubyBlZmZlY3QgYnV0IHRwYiByZXBvcnRzICJWb2x1bWUgdXAiCkBAIC0zNDYsMjYgKzM3NCwxOCBAQAogCTEzIC0gVGhpbmtMaWdodCBvZmYKIAkxNCAtIG5vIGVmZmVjdCBidXQgdHBiIHJlcG9ydHMgVGhpbmtMaWdodCBzdGF0dXMgY2hhbmdlCiAKLUlmIHlvdSB0cnkgdGhpcyBmZWF0dXJlLCBwbGVhc2Ugc2VuZCBtZSBhIHJlcG9ydCBzaW1pbGFyIHRvIHRoZQotYWJvdmUuIE9uIG1vZGVscyB3aGljaCBhbGxvdyBjb250cm9sIG9mIExDRCBicmlnaHRuZXNzIG9yIHNvdW5kCi12b2x1bWUsIEknZCBsaWtlIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGFuIHVzZXItZnJpZW5kbHkKLXdheSwgYnV0IGZpcnN0IEkgbmVlZCBhIHdheSB0byBpZGVudGlmeSB0aGUgbW9kZWxzIHdoaWNoIHRoaXMgaXMKLXBvc3NpYmxlLgotCi1FeHBlcmltZW50YWw6IExFRCBjb250cm9sIC0gL3Byb2MvYWNwaS9pYm0vTEVECi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMRUQgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS9sZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBTb21lIG9mIHRoZSBMRUQgaW5kaWNhdG9ycyBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIHRoaXMgZmVhdHVyZS4gVGhlCiBhdmFpbGFibGUgY29tbWFuZHMgYXJlOgogCi0JZWNobyA8bGVkIG51bWJlcj4gb24gPi9wcm9jL2FjcGkvaWJtL2xlZAotCWVjaG8gPGxlZCBudW1iZXI+IG9mZiA+L3Byb2MvYWNwaS9pYm0vbGVkCi0JZWNobyA8bGVkIG51bWJlcj4gYmxpbmsgPi9wcm9jL2FjcGkvaWJtL2xlZAorCWVjaG8gJzxsZWQgbnVtYmVyPiBvbicgPi9wcm9jL2FjcGkvaWJtL2xlZAorCWVjaG8gJzxsZWQgbnVtYmVyPiBvZmYnID4vcHJvYy9hY3BpL2libS9sZWQKKwllY2hvICc8bGVkIG51bWJlcj4gYmxpbmsnID4vcHJvYy9hY3BpL2libS9sZWQKIAotVGhlIDxsZWQgbnVtYmVyPiBwYXJhbWV0ZXIgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gVGhlIHJhbmdlIG9mIExFRAotbnVtYmVycyB1c2VkIGludGVybmFsbHkgYnkgdmFyaW91cyBtb2RlbHMgaXMgMCB0byA3IGJ1dCBpdCdzIHBvc3NpYmxlCi10aGF0IG51bWJlcnMgb3V0c2lkZSB0aGlzIHJhbmdlIGFyZSBhbHNvIHZhbGlkLiBIZXJlIGlzIHRoZSBtYXBwaW5nIG9uCi10aGUgWDQwOgorVGhlIDxsZWQgbnVtYmVyPiByYW5nZSBpcyAwIHRvIDcuIFRoZSBzZXQgb2YgTEVEcyB0aGF0IGNhbiBiZQorY29udHJvbGxlZCB2YXJpZXMgZnJvbSBtb2RlbCB0byBtb2RlbC4gSGVyZSBpcyB0aGUgbWFwcGluZyBvbiB0aGUgWDQwOgogCiAJMCAtIHBvd2VyCiAJMSAtIGJhdHRlcnkgKG9yYW5nZSkKQEAgLTM3Niw0OSArMzk2LDIyNCBAQAogCiBBbGwgb2YgdGhlIGFib3ZlIGNhbiBiZSB0dXJuZWQgb24gYW5kIG9mZiBhbmQgY2FuIGJlIG1hZGUgdG8gYmxpbmsuCiAKLUlmIHlvdSB0cnkgdGhpcyBmZWF0dXJlLCBwbGVhc2Ugc2VuZCBtZSBhIHJlcG9ydCBzaW1pbGFyIHRvIHRoZQotYWJvdmUuIEknZCBsaWtlIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGFuIHVzZXItZnJpZW5kbHkgd2F5LAotYnV0IGZpcnN0IEkgbmVlZCB0byBpZGVudGlmeSB0aGUgd2hpY2ggbnVtYmVycyBjb3JyZXNwb25kIHRvIHdoaWNoCi1MRURzIG9uIHZhcmlvdXMgbW9kZWxzLgotCi1FeHBlcmltZW50YWw6IEFDUEkgc291bmRzIC0gL3Byb2MvYWNwaS9pYm0vYmVlcAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDUEkgc291bmRzIC0tIC9wcm9jL2FjcGkvaWJtL2JlZXAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIEJFRVAgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQUNQSSBmaXJtd2FyZSB0byBwcm92aWRlCi1hdWRpYmxlIGFsZXJ0cyBpbiB2YXJpb3VzIHNpdHV0YXRpb24uIFRoaXMgZmVhdHVyZSBhbGxvd3MgdGhlIHNhbWUKK2F1ZGlibGUgYWxlcnRzIGluIHZhcmlvdXMgc2l0dWF0aW9ucy4gVGhpcyBmZWF0dXJlIGFsbG93cyB0aGUgc2FtZQogc291bmRzIHRvIGJlIHRyaWdnZXJlZCBtYW51YWxseS4KIAogVGhlIGNvbW1hbmRzIGFyZSBub24tbmVnYXRpdmUgaW50ZWdlciBudW1iZXJzOgogCi0JZWNobyAwID4vcHJvYy9hY3BpL2libS9iZWVwCi0JZWNobyAxID4vcHJvYy9hY3BpL2libS9iZWVwCi0JZWNobyAyID4vcHJvYy9hY3BpL2libS9iZWVwCi0JLi4uCisJZWNobyA8bnVtYmVyPiA+L3Byb2MvYWNwaS9pYm0vYmVlcAogCi1UaGUgcmFuZ2Ugb2YgbnVtYmVycyB3aGljaCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHZhcmlvdXMgbW9kZWxzIGlzIDAKLXRvIDE3LCBidXQgaXQncyBwb3NzaWJsZSB0aGF0IG51bWJlcnMgb3V0c2lkZSB0aGlzIHJhbmdlIGFyZSBhbHNvCi12YWxpZC4gSGVyZSBpcyB0aGUgYmVoYXZpb3Igb24gdGhlIFg0MDoKK1RoZSB2YWxpZCA8bnVtYmVyPiByYW5nZSBpcyAwIHRvIDE3LiBOb3QgYWxsIG51bWJlcnMgdHJpZ2dlciBzb3VuZHMKK2FuZCB0aGUgc291bmRzIHZhcnkgZnJvbSBtb2RlbCB0byBtb2RlbC4gSGVyZSBpcyB0aGUgYmVoYXZpb3Igb24gdGhlCitYNDA6CiAKLQkyIC0gdHdvIGJlZXBzLCBwYXVzZSwgdGhpcmQgYmVlcAorCTAgLSBzdG9wIGEgc291bmQgaW4gcHJvZ3Jlc3MgKGJ1dCB1c2UgMTcgdG8gc3RvcCAxNikKKwkyIC0gdHdvIGJlZXBzLCBwYXVzZSwgdGhpcmQgYmVlcCAoImxvdyBiYXR0ZXJ5IikKIAkzIC0gc2luZ2xlIGJlZXAKLQk0IC0gInVuYWJsZSIJCisJNCAtIGhpZ2gsIGZvbGxvd2VkIGJ5IGxvdy1waXRjaGVkIGJlZXAgKCJ1bmFibGUiKQogCTUgLSBzaW5nbGUgYmVlcAotCTYgLSAiQUMvREMiCisJNiAtIHZlcnkgaGlnaCwgZm9sbG93ZWQgYnkgaGlnaC1waXRjaGVkIGJlZXAgKCJBQy9EQyIpCiAJNyAtIGhpZ2gtcGl0Y2hlZCBiZWVwCiAJOSAtIHRocmVlIHNob3J0IGJlZXBzCiAJMTAgLSB2ZXJ5IGxvbmcgYmVlcAogCTEyIC0gbG93LXBpdGNoZWQgYmVlcAorCTE1IC0gdGhyZWUgaGlnaC1waXRjaGVkIGJlZXBzIHJlcGVhdGluZyBjb25zdGFudGx5LCBzdG9wIHdpdGggMAorCTE2IC0gb25lIG1lZGl1bS1waXRjaGVkIGJlZXAgcmVwZWF0aW5nIGNvbnN0YW50bHksIHN0b3Agd2l0aCAxNworCTE3IC0gc3RvcCAxNgogCi0oSSd2ZSBvbmx5IGJlZW4gYWJsZSB0byBpZGVudGlmeSBhIGNvdXBsZSBvZiB0aGVtKS4KK1RlbXBlcmF0dXJlIHNlbnNvcnMgLS0gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUlmIHlvdSB0cnkgdGhpcyBmZWF0dXJlLCBwbGVhc2Ugc2VuZCBtZSBhIHJlcG9ydCBzaW1pbGFyIHRvIHRoZQotYWJvdmUuIEknZCBsaWtlIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGFuIHVzZXItZnJpZW5kbHkgd2F5LAotYnV0IGZpcnN0IEkgbmVlZCB0byBpZGVudGlmeSB0aGUgd2hpY2ggbnVtYmVycyBjb3JyZXNwb25kIHRvIHdoaWNoCi1zb3VuZHMgb24gdmFyaW91cyBtb2RlbHMuCitNb3N0IFRoaW5rUGFkcyBpbmNsdWRlIHNpeCBvciBtb3JlIHNlcGFyYXRlIHRlbXBlcmF0dXJlIHNlbnNvcnMgYnV0Citvbmx5IGV4cG9zZSB0aGUgQ1BVIHRlbXBlcmF0dXJlIHRocm91Z2ggdGhlIHN0YW5kYXJkIEFDUEkgbWV0aG9kcy4KK1RoaXMgZmVhdHVyZSBzaG93cyByZWFkaW5ncyBmcm9tIHVwIHRvIGVpZ2h0IGRpZmZlcmVudCBzZW5zb3JzLiBTb21lCityZWFkaW5ncyBtYXkgbm90IGJlIHZhbGlkLCBlLmcuIG1heSBzaG93IGxhcmdlIG5lZ2F0aXZlIHZhbHVlcy4gRm9yCitleGFtcGxlLCBvbiB0aGUgWDQwLCBhIHR5cGljYWwgb3V0cHV0IG1heSBiZToKKwordGVtcGVyYXR1cmVzOiAgIDQyIDQyIDQ1IDQxIDM2IC0xMjggMzMgLTEyOAorCitUaG9tYXMgR3J1YmVyIHRvb2sgaGlzIFI1MSBhcGFydCBhbmQgdHJhY2VkIGFsbCBzaXggYWN0aXZlIHNlbnNvcnMgaW4KK2hpcyBsYXB0b3AgKHRoZSBsb2NhdGlvbiBvZiBzZW5zb3JzIG1heSB2YXJ5IG9uIG90aGVyIG1vZGVscyk6CisKKzE6ICBDUFUKKzI6ICBNaW5pIFBDSSBNb2R1bGUKKzM6ICBIREQKKzQ6ICBHUFUKKzU6ICBCYXR0ZXJ5Cis2OiAgTi9BCis3OiAgQmF0dGVyeQorODogIE4vQQorCitObyBjb21tYW5kcyBjYW4gYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUuCisKK0VYUEVSSU1FTlRBTDogRW1iZWRkZWQgY29udHJvbGxlciByZWlnc3RlciBkdW1wIC0tIC9wcm9jL2FjcGkvaWJtL2VjZHVtcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCitkaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCitXSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKK2V4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KKworVGhpcyBmZWF0dXJlIGR1bXBzIHRoZSB2YWx1ZXMgb2YgMjU2IGVtYmVkZGVkIGNvbnRyb2xsZXIKK3JlZ2lzdGVycy4gVmFsdWVzIHdoaWNoIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSByZWdpc3RlcnMKK3dlcmUgZHVtcGVkIGFyZSBtYXJrZWQgd2l0aCBhIHN0YXI6CisKK1tyb290QHg0MCBpYm0tYWNwaV0jIGNhdCAvcHJvYy9hY3BpL2libS9lY2R1bXAgCitFQyAgICAgICArMDAgKzAxICswMiArMDMgKzA0ICswNSArMDYgKzA3ICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGYKK0VDIDB4MDA6ICBhNyAgNDcgIDg3ICAwMSAgZmUgIDk2ICAwMCAgMDggIDAxICAwMCAgY2IgIDAwICAwMCAgMDAgIDQwICAwMAorRUMgMHgxMDogIDAwICAwMCAgZmYgIGZmICBmNCAgM2MgIDg3ICAwOSAgMDEgIGZmICA0MiAgMDEgIGZmICBmZiAgMGQgIDAwCitFQyAweDIwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMyAgNDMgIDAwICAwMCAgODAKK0VDIDB4MzA6ICAwMSAgMDcgIDFhICAwMCAgMzAgIDA0ICAwMCAgMDAgKjg1ICAwMCAgMDAgIDEwICAwMCAgNTAgIDAwICAwMAorRUMgMHg0MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDE0ICAwMSAgMDAgIDA0ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweDUwOiAgMDAgIGMwICAwMiAgMGQgIDAwICAwMSAgMDEgIDAyICAwMiAgMDMgIDAzICAwMyAgMDMgKmJjICowMiAqYmMKK0VDIDB4NjA6ICowMiAqYmMgKjAyICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHg3MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMTIgIDMwICA0MCAqMjQgKjI2ICoyYyAqMjcgKjIwICA4MCAqMWYgIDgwCitFQyAweDgwOiAgMDAgIDAwICAwMCAgMDYgKjM3ICowZSAgMDMgIDAwICAwMCAgMDAgIDBlICAwNyAgMDAgIDAwICAwMCAgMDAKK0VDIDB4OTA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHhhMDogKmZmICAwOSAgZmYgIDA5ICBmZiAgZmYgKjY0ICAwMCAqMDAgKjAwICphMiAgNDEgKmZmICpmZiAqZTAgIDAwCitFQyAweGIwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKK0VDIDB4YzA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHhkMDogIDAzICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweGUwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAxMSAgMjAgIDQ5ICAwNCAgMjQgIDA2ICA1NSAgMDMKK0VDIDB4ZjA6ICAzMSAgNTUgIDQ4ICA1NCAgMzUgIDM4ICA1NyAgNTcgIDA4ICAyZiAgNDUgIDczICAwNyAgNjUgIDZjICAxYQorCitUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWdpc3RlciBob2xkaW5nIHRoZSBmYW4KK3NwZWVkIG9uIHNvbWUgbW9kZWxzLiBUbyBkbyB0aGF0LCBkbyB0aGUgZm9sbG93aW5nOgorCisJLSBtYWtlIHN1cmUgdGhlIGJhdHRlcnkgaXMgZnVsbHkgY2hhcmdlZAorCS0gbWFrZSBzdXJlIHRoZSBmYW4gaXMgcnVubmluZworCS0gcnVuICdjYXQgL3Byb2MvYWNwaS9pYm0vZWNkdW1wJyBzZXZlcmFsIHRpbWVzLCBvbmNlIHBlciBzZWNvbmQgb3Igc28KKworVGhlIGZpcnN0IHN0ZXAgbWFrZXMgc3VyZSB2YXJpb3VzIGNoYXJnaW5nLXJlbGF0ZWQgdmFsdWVzIGRvbid0Cit2YXJ5LiBUaGUgc2Vjb25kIGVuc3VyZXMgdGhhdCB0aGUgZmFuLXJlbGF0ZWQgdmFsdWVzIGRvIHZhcnksIHNpbmNlCit0aGUgZmFuIHNwZWVkIGZsdWN0dWF0ZXMgYSBiaXQuIFRoZSB0aGlyZCB3aWxsIChob3BlZnVsbHkpIG1hcmsgdGhlCitmYW4gcmVnaXN0ZXIgd2l0aCBhIHN0YXI6CisKK1tyb290QHg0MCBpYm0tYWNwaV0jIGNhdCAvcHJvYy9hY3BpL2libS9lY2R1bXAgCitFQyAgICAgICArMDAgKzAxICswMiArMDMgKzA0ICswNSArMDYgKzA3ICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGYKK0VDIDB4MDA6ICBhNyAgNDcgIDg3ICAwMSAgZmUgIDk2ICAwMCAgMDggIDAxICAwMCAgY2IgIDAwICAwMCAgMDAgIDQwICAwMAorRUMgMHgxMDogIDAwICAwMCAgZmYgIGZmICBmNCAgM2MgIDg3ICAwOSAgMDEgIGZmICA0MiAgMDEgIGZmICBmZiAgMGQgIDAwCitFQyAweDIwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMyAgNDMgIDAwICAwMCAgODAKK0VDIDB4MzA6ICAwMSAgMDcgIDFhICAwMCAgMzAgIDA0ICAwMCAgMDAgIDg1ICAwMCAgMDAgIDEwICAwMCAgNTAgIDAwICAwMAorRUMgMHg0MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDE0ICAwMSAgMDAgIDA0ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweDUwOiAgMDAgIGMwICAwMiAgMGQgIDAwICAwMSAgMDEgIDAyICAwMiAgMDMgIDAzICAwMyAgMDMgIGJjICAwMiAgYmMKK0VDIDB4NjA6ICAwMiAgYmMgIDAyICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHg3MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMTIgIDMwICA0MCAgMjQgIDI3ICAyYyAgMjcgIDIxICA4MCAgMWYgIDgwCitFQyAweDgwOiAgMDAgIDAwICAwMCAgMDYgKmJlICAwZCAgMDMgIDAwICAwMCAgMDAgIDBlICAwNyAgMDAgIDAwICAwMCAgMDAKK0VDIDB4OTA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHhhMDogIGZmICAwOSAgZmYgIDA5ICBmZiAgZmYgIDY0ICAwMCAgMDAgIDAwICBhMiAgNDEgIGZmICBmZiAgZTAgIDAwCitFQyAweGIwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKK0VDIDB4YzA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAorRUMgMHhkMDogIDAzICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCitFQyAweGUwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAxMSAgMjAgIDQ5ICAwNCAgMjQgIDA2ICA1NSAgMDMKK0VDIDB4ZjA6ICAzMSAgNTUgIDQ4ICA1NCAgMzUgIDM4ICA1NyAgNTcgIDA4ICAyZiAgNDUgIDczICAwNyAgNjUgIDZjICAxYQorCitBbm90aGVyIHNldCBvZiB2YWx1ZXMgdGhhdCB2YXJpZXMgb2Z0ZW4gaXMgdGhlIHRlbXBlcmF0dXJlCityZWFkaW5ncy4gU2luY2UgdGVtcGVyYXR1cmVzIGRvbid0IGNoYW5nZSB2YXJ5IGZhc3QsIHlvdSBjYW4gdGFrZQorc2V2ZXJhbCBxdWljayBkdW1wcyB0byBlbGltaW5hdGUgdGhlbS4KKworWW91IGNhbiB1c2UgYSBzaW1pbGFyIG1ldGhvZCB0byBmaWd1cmUgb3V0IHRoZSBtZWFuaW5nIG9mIG90aGVyCitlbWJlZGRlZCBjb250cm9sbGVyIHJlZ2lzdGVycyAtIGUuZy4gbWFrZSBzdXJlIG5vdGhpbmcgZWxzZSBjaGFuZ2VzCitleGNlcHQgdGhlIGNoYXJnaW5nIG9yIGRpc2NoYXJnaW5nIGJhdHRlcnkgdG8gZGV0ZXJtaW5lIHdoaWNoCityZWdpc3RlcnMgY29udGFpbiB0aGUgY3VycmVudCBiYXR0ZXJ5IGNhcGFjaXR5LCBldGMuIElmIHlvdSBleHBlcmltZW50Cit3aXRoIHRoaXMsIGRvIHNlbmQgbWUgeW91ciByZXN1bHRzIChpbmNsdWRpbmcgc29tZSBjb21wbGV0ZSBkdW1wcyB3aXRoCithIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25kaXRpb25zIHdoZW4gdGhleSB3ZXJlIHRha2VuLikKKworRVhQRVJJTUVOVEFMOiBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCitkaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCitXSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKK2V4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KKworVGhpcyBmZWF0dXJlIGFsbG93cyBzb2Z0d2FyZSBjb250cm9sIG9mIHRoZSBMQ0QgYnJpZ2h0bmVzcyBvbiBUaGlua1BhZAorbW9kZWxzIHdoaWNoIGRvbid0IGhhdmUgYSBoYXJkd2FyZSBicmlnaHRuZXNzIHNsaWRlci4gVGhlIGF2YWlsYWJsZQorY29tbWFuZHMgYXJlOgorCisJZWNobyB1cCAgID4vcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCisJZWNobyBkb3duID4vcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCisJZWNobyAnbGV2ZWwgPGxldmVsPicgPi9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKKworVGhlIDxsZXZlbD4gbnVtYmVyIHJhbmdlIGlzIDAgdG8gNywgYWx0aG91Z2ggbm90IGFsbCBvZiB0aGVtIG1heSBiZQorZGlzdGluY3QuIFRoZSBjdXJyZW50IGJyaWdodG5lc3MgbGV2ZWwgaXMgc2hvd24gaW4gdGhlIGZpbGUuCisKK0VYUEVSSU1FTlRBTDogVm9sdW1lIGNvbnRyb2wgLS0gL3Byb2MvYWNwaS9pYm0vdm9sdW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZlYXR1cmUgaXMgbWFya2VkIEVYUEVSSU1FTlRBTCBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbgorZGlyZWN0bHkgYWNjZXNzZXMgaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIFVTRQorV0lUSCBDQVVUSU9OISBUbyB1c2UgdGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlCitleHBlcmltZW50YWw9MSBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCisKK1RoaXMgZmVhdHVyZSBhbGxvd3Mgdm9sdW1lIGNvbnRyb2wgb24gVGhpbmtQYWQgbW9kZWxzIHdoaWNoIGRvbid0IGhhdmUKK2EgaGFyZHdhcmUgdm9sdW1lIGtub2IuIFRoZSBhdmFpbGFibGUgY29tbWFuZHMgYXJlOgorCisJZWNobyB1cCAgID4vcHJvYy9hY3BpL2libS92b2x1bWUKKwllY2hvIGRvd24gPi9wcm9jL2FjcGkvaWJtL3ZvbHVtZQorCWVjaG8gbXV0ZSA+L3Byb2MvYWNwaS9pYm0vdm9sdW1lCisJZWNobyAnbGV2ZWwgPGxldmVsPicgPi9wcm9jL2FjcGkvaWJtL3ZvbHVtZQorCitUaGUgPGxldmVsPiBudW1iZXIgcmFuZ2UgaXMgMCB0byAxNSBhbHRob3VnaCBub3QgYWxsIG9mIHRoZW0gbWF5IGJlCitkaXN0aW5jdC4gVGhlIHVubXV0ZSB0aGUgdm9sdW1lIGFmdGVyIHRoZSBtdXRlIGNvbW1hbmQsIHVzZSBlaXRoZXIgdGhlCit1cCBvciBkb3duIGNvbW1hbmQgKHRoZSBsZXZlbCBjb21tYW5kIHdpbGwgbm90IHVubXV0ZSB0aGUgdm9sdW1lKS4KK1RoZSBjdXJyZW50IHZvbHVtZSBsZXZlbCBhbmQgbXV0ZSBzdGF0ZSBpcyBzaG93biBpbiB0aGUgZmlsZS4KKworRVhQRVJJTUVOVEFMOiBmYW4gc3BlZWQsIGZhbiBlbmFibGUvZGlzYWJsZSAtLSAvcHJvYy9hY3BpL2libS9mYW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCitkaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCitXSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKK2V4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KKworVGhpcyBmZWF0dXJlIGF0dGVtcHRzIHRvIHNob3cgdGhlIGN1cnJlbnQgZmFuIHNwZWVkLiBUaGUgc3BlZWQgaXMgcmVhZAorZGlyZWN0bHkgZnJvbSB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzIG9mIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyLiBUaGlzCitpcyBrbm93biB0byB3b3JrIG9uIGxhdGVyIFIsIFQgYW5kIFggc2VyaWVzIFRoaW5rUGFkcyBidXQgbWF5IHNob3cgYQorYm9ndXMgdmFsdWUgb24gb3RoZXIgbW9kZWxzLgorCitUaGUgZmFuIG1heSBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworCWVjaG8gZW5hYmxlICA+L3Byb2MvYWNwaS9pYm0vZmFuCisJZWNobyBkaXNhYmxlID4vcHJvYy9hY3BpL2libS9mYW4KKworV0FSTklORyBXQVJOSU5HIFdBUk5JTkc6IGRvIG5vdCBsZWF2ZSB0aGUgZmFuIGRpc2FibGVkIHVubGVzcyB5b3UgYXJlCittb25pdG9yaW5nIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVhZGluZ3MgYW5kIHlvdSBhcmUgcmVhZHkgdG8gZW5hYmxlCitpdCBpZiBuZWNlc3NhcnkgdG8gYXZvaWQgb3ZlcmhlYXRpbmcuCisKK1RoZSBmYW4gb25seSBydW5zIGlmIGl0J3MgZW5hYmxlZCAqYW5kKiB0aGUgdmFyaW91cyB0ZW1wZXJhdHVyZQorc2Vuc29ycyB3aGljaCBjb250cm9sIGl0IHJlYWQgaGlnaCBlbm91Z2guIE9uIHRoZSBYNDAsIHRoaXMgc2VlbXMgdG8KK2RlcGVuZCBvbiB0aGUgQ1BVIGFuZCBIREQgdGVtcGVyYXR1cmVzLiBTcGVjaWZpY2FsbHksIHRoZSBmYW4gaXMKK3R1cm5lZCBvbiB3aGVuIGVpdGhlciB0aGUgQ1BVIHRlbXBlcmF0dXJlIGNsaW1icyB0byA1NiBkZWdyZWVzIG9yIHRoZQorSEREIHRlbXBlcmF0dXJlIGNsaW1icyB0byA0NiBkZWdyZWVzLiBUaGUgZmFuIGlzIHR1cm5lZCBvZmYgd2hlbiB0aGUKK0NQVSB0ZW1wZXJhdHVyZSBkcm9wcyB0byA0OSBkZWdyZWVzIGFuZCB0aGUgSEREIHRlbXBlcmF0dXJlIGRyb3BzIHRvCis0MSBkZWdyZWVzLiBUaGVzZSB0aHJlc2hvbGRzIGNhbm5vdCBjdXJyZW50bHkgYmUgY29udHJvbGxlZC4KKworT24gdGhlIFgzMSBhbmQgWDQwIChhbmQgT05MWSBvbiB0aG9zZSBtb2RlbHMpLCB0aGUgZmFuIHNwZWVkIGNhbiBiZQorY29udHJvbGxlZCB0byBhIGNlcnRhaW4gZGVncmVlLiBPbmNlIHRoZSBmYW4gaXMgcnVubmluZywgaXQgY2FuIGJlCitmb3JjZWQgdG8gcnVuIGZhc3RlciBvciBzbG93ZXIgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKwllY2hvICdzcGVlZCA8c3BlZWQ+JyA+IC9wcm9jL2FjcGkvaWJtL3RoZXJtYWwKKworVGhlIHN1c3RhaW5hYmxlIHJhbmdlIG9mIGZhbiBzcGVlZHMgb24gdGhlIFg0MCBhcHBlYXJzIHRvIGJlIGZyb20KK2Fib3V0IDM3MDAgdG8gYWJvdXQgNzM1MC4gVmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZSBlaXRoZXIgZG8gbm90IGhhdmUKK2FueSBlZmZlY3Qgb3IgdGhlIGZhbiBzcGVlZCBldmVudHVhbGx5IHNldHRsZXMgc29tZXdoZXJlIGluIHRoYXQKK3JhbmdlLiBUaGUgZmFuIGNhbm5vdCBiZSBzdG9wcGVkIG9yIHN0YXJ0ZWQgd2l0aCB0aGlzIGNvbW1hbmQuCisKK09uIHRoZSA1NzAsIHRlbXBlcmF0dXJlIHJlYWRpbmdzIGFyZSBub3QgYXZhaWxhYmxlIHRocm91Z2ggdGhpcworZmVhdHVyZSBhbmQgdGhlIGZhbiBjb250cm9sIHdvcmtzIGEgbGl0dGxlIGRpZmZlcmVudGx5LiBUaGUgZmFuIHNwZWVkCitpcyByZXBvcnRlZCBpbiBsZXZlbHMgZnJvbSAwIChvZmYpIHRvIDcgKG1heCkgYW5kIGNhbiBiZSBjb250cm9sbGVkCit3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworCWVjaG8gJ2xldmVsIDxsZXZlbD4nID4gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAogCiAKLU11bHRpcGxlIENvbW1hbmQsIE1vZHVsZSBQYXJhbWV0ZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTXVsdGlwbGUgQ29tbWFuZHMsIE1vZHVsZSBQYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogTXVsdGlwbGUgY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHByb2MgZmlsZXMgaW4gb25lIHNob3QgYnkKIHNlcGFyYXRpbmcgdGhlbSB3aXRoIGNvbW1hcywgZm9yIGV4YW1wbGU6CkBAIC00NTEsMjQgKzY0NiwxOSBAQAogCS91c3IvbG9jYWwvc2Jpbi9sYXB0b3BfbW9kZSAtLSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgc291cmNlCiAJCWRpc3RyaWJ1dGlvbiwgc2VlIERvY3VtZW50YXRpb24vbGFwdG9wLW1vZGUudHh0CiAJL3NiaW4vc2VydmljZSAtLSBjb21lcyB3aXRoIFJlZGhhdC9GZWRvcmEgZGlzdHJpYnV0aW9ucworCS91c3Ivc2Jpbi9oaWJlcm5hdGUgLS0gZnJvbSB0aGUgU29mdHdhcmUgU3VzcGVuZCAyIGRpc3RyaWJ1dGlvbiwKKwkJc2VlIGh0dHA6Ly9zb2Z0d2FyZXN1c3BlbmQuYmVybGlvcy5kZS8KIAotVG9hbiBUIE5ndXllbiA8bnR0QGNvbnRyb2wudWNoaWNhZ28uZWR1PiBoYXMgd3JpdHRlbiBhIFN1U0UgcG93ZXJzYXZlCi1zY3JpcHQgZm9yIHRoZSBYMjAsIGluY2x1ZGVkIGluIGNvbmZpZy91c3Ivc2Jpbi9pYm1faG90a2V5c19YMjAKK1RvYW4gVCBOZ3V5ZW4gPG50dEBwaHlzaWNzLnVjbGEuZWR1PiBub3RlcyB0aGF0IFN1c2UgdXNlcyB0aGUKK3Bvd2Vyc2F2ZSBwcm9ncmFtIHRvIHN1c3BlbmQgKCdwb3dlcnNhdmUgLS1zdXNwZW5kLXRvLXJhbScpIG9yCitoaWJlcm5hdGUgKCdwb3dlcnNhdmUgLS1zdXNwZW5kLXRvLWRpc2snKS4gVGhpcyBtZWFucyB0aGF0IHRoZQoraGliZXJuYXRlIHNjcmlwdCBpcyBub3QgbmVlZGVkIG9uIHRoYXQgZGlzdHJpYnV0aW9uLgogCiBIZW5yaWsgQnJpeCBBbmRlcnNlbiA8YnJpeEBnZW50b28ub3JnPiBoYXMgd3JpdHRlbiBhIEdlbnRvbyBBQ1BJIGV2ZW50CiBoYW5kbGVyIHNjcmlwdCBmb3IgdGhlIFgzMS4gWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20KIGh0dHA6Ly9kZXYuZ2VudG9vLm9yZy9+YnJpeC9maWxlcy94MzEuc2gKIAogRGF2aWQgU2Nod2Vpa2VydCA8ZHdzQGVlLmV0aC5jaD4gaGFzIHdyaXR0ZW4gYW4gYWx0ZXJuYXRpdmUgYmxhbmsuc2gKLXNjcmlwdCB3aGljaCB3b3JrcyBvbiBEZWJpYW4gc3lzdGVtcywgaW5jbHVkZWQgaW4KLWNvbmZpZ3MvZXRjL2FjcGkvYWN0aW9ucy9ibGFuay1kZWJpYW4uc2gKLQotCi1UT0RPCi0tLS0tCi0KLUknZCBsaWtlIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzIGJ1dCBoYXZlbid0IHlldCBmb3VuZCB0aGUKLXRpbWUgYW5kL29yIEkgZG9uJ3QgeWV0IGtub3cgaG93IHRvIGltcGxlbWVudCB0aGVtOgotCi0tIFVsdHJhQmF5IGZsb3BweSBkcml2ZSBzdXBwb3J0Ci0KK3NjcmlwdCB3aGljaCB3b3JrcyBvbiBEZWJpYW4gc3lzdGVtcy4gVGhpcyBzY3JpcHRzIGhhcyBub3cgYmVlbgorZXh0ZW5kZWQgdG8gYWxzbyB3b3JrIG9uIEZlZG9yYSBzeXN0ZW1zIGFuZCBpbmNsdWRlZCBhcyB0aGUgZGVmYXVsdAorYmxhbmsuc2ggaW4gdGhlIGRpc3RyaWJ1dGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5wdXQveWVhbGluay50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3llYWxpbmsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjA5NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC95ZWFsaW5rLnR4dApAQCAtMCwwICsxLDIwMyBAQAorRHJpdmVyIGRvY3VtZW50YXRpb24gZm9yIHllYWxpbmsgdXNiLXAxayBwaG9uZXMKKworMC4gU3RhdHVzCit+fn5+fn5+fn4KKworVGhlIHAxayBpcyBhIHJlbGF0aXZlbHkgY2hlYXAgdXNiIDEuMSBwaG9uZSB3aXRoOgorICAtIGtleWJvYXJkCQlmdWxsIHN1cHBvcnQsIHllYWxpbmsua28gLyBpbnB1dCBldmVudCBBUEkKKyAgLSBMQ0QJCQlmdWxsIHN1cHBvcnQsIHllYWxpbmsua28gLyBzeXNmcyBBUEkKKyAgLSBMRUQJCQlmdWxsIHN1cHBvcnQsIHllYWxpbmsua28gLyBzeXNmcyBBUEkKKyAgLSBkaWFsdG9uZQkJZnVsbCBzdXBwb3J0LCB5ZWFsaW5rLmtvIC8gc3lzZnMgQVBJCisgIC0gcmluZ3RvbmUJCWZ1bGwgc3VwcG9ydCwgeWVhbGluay5rbyAvIHN5c2ZzIEFQSQorICAtIGF1ZGlvIHBsYXliYWNrICAgCWZ1bGwgc3VwcG9ydCwgc25kX3VzYl9hdWRpby5rbyAvIGFsc2EgQVBJCisgIC0gYXVkaW8gcmVjb3JkICAgICAJZnVsbCBzdXBwb3J0LCBzbmRfdXNiX2F1ZGlvLmtvIC8gYWxzYSBBUEkKKworRm9yIHZlbmRvciBkb2N1bWVudGF0aW9uIHNlZSBodHRwOi8vd3d3LnllYWxpbmsuY29tCisKKworMS4gQ29tcGlsYXRpb24gKHN0YW5kIGFsb25lIHZlcnNpb24pCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQ3VycmVudGx5IG9ubHkga2VybmVsIDIuNi54LnkgdmVyc2lvbnMgYXJlIHN1cHBvcnRlZC4KK0luIG9yZGVyIHRvIGJ1aWxkIHRoZSB5ZWFsaW5rLmtvIG1vZHVsZSBkbzoKKworICBtYWtlCisKK0lmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgcGxlYXNlIGNoZWNrIGlmIGluIHRoZSBNQUtFX09QVFMgdmFyaWFibGUgaW4KK3RoZSBNYWtlZmlsZSBpcyBwb2ludGluZyB0byB0aGUgbG9jYXRpb24gd2hlcmUgeW91ciBrZXJuZWwgc291cmNlcworYXJlIGxvY2F0ZWQsIGRlZmF1bHQgL3Vzci9zcmMvbGludXguCisKKworCisyLiBrZXlib2FyZCBmZWF0dXJlcworfn5+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBjdXJyZW50IG1hcHBpbmcgaW4gdGhlIGtlcm5lbCBpcyBwcm92aWRlZCBieSB0aGUgbWFwX3Axa190b19rZXkKK2Z1bmN0aW9uOgorCisgICBQaHlzaWNhbCBVU0ItUDFLIGJ1dHRvbiBsYXlvdXQJaW5wdXQgZXZlbnRzCisKKworICAgICAgICAgICAgICB1cAkJCSAgICAgdXAKKyAgICAgICAgSU4gICAgICAgICAgIE9VVAkJbGVmdCwJcmlnaHQKKyAgICAgICAgICAgICBkb3duCQkJICAgIGRvd24KKworICAgICAgcGlja3VwICAgQyAgICBoYW5ndXAJCWVudGVyLCBiYWNrc3BhY2UsIGVzY2FwZQorICAgICAgICAxICAgICAgMiAgICAgIDMJCQkxLCAyLCAzCisgICAgICAgIDQgICAgICA1ICAgICAgNgkJCTQsIDUsIDYsCisgICAgICAgIDcgICAgICA4ICAgICAgOQkJCTcsIDgsIDksCisgICAgICAgICogICAgICAwICAgICAgIwkJCSosIDAsICMsCisKKyAgVGhlICJ1cCIgYW5kICJkb3duIiBrZXlzLCBhcmUgc3ltYm9saXNlZCBieSBhcnJvd3Mgb24gdGhlIGJ1dHRvbi4KKyAgVGhlICJwaWNrdXAiIGFuZCAiaGFuZ3VwIiBrZXlzIGFyZSBzeW1ib2xpc2VkIGJ5IGEgZ3JlZW4gYW5kIHJlZCBwaG9uZQorICBvbiB0aGUgYnV0dG9uLgorCisKKzMuIExDRCBmZWF0dXJlcworfn5+fn5+fn5+fn5+fn5+CitUaGUgTENEIGlzIGRpdmlkZWQgYW5kIG9yZ2FuaXNlZCBhcyBhIDMgbGluZSBkaXNwbGF5OgorCisgICAgfFtdICAgW11bXSAgIFtdW10gICBbXVtdICAgaW4gICB8W11bXQorICAgIHxbXSBNIFtdW10gRCBbXVtdIDogW11bXSAgIG91dCAgfFtdW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlCisKKyAgICBORVcgUkVQICAgICAgICAgU1UgTU8gVFUgV0UgVEggRlIgU0EKKworICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdIFtdCisgICAgW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10KKworCitMaW5lIDEJRm9ybWF0IChzZWUgYmVsb3cpCTogMTguZTguTTguODguLi4xODgKKwlJY29uIG5hbWVzCQk6ICAgTSAgRCAgOiAgSU4gT1VUIFNUT1JFCitMaW5lIDIgIEZvcm1hdAkJCTogLi4uLi4uLi4uCisJSWNvbiBuYW1lCQk6IE5FVyBSRVAgU1UgTU8gVFUgV0UgVEggRlIgU0EKK0xpbmUgMyAgRm9ybWF0CQkJOiA4ODg4ODg4ODg4ODgKKworCitGb3JtYXQgZGVzY3JpcHRpb246CisgIEZyb20gYSB1c2VyIHNwYWNlIHBlcnNwZWN0aXZlIHRoZSB3b3JsZCBpcyBzZXBlcmF0ZWQgaW4gImRpZ2l0cyIgYW5kICJpY29ucyIuCisgIEEgZGlnaXQgY2FuIGhhdmUgYSBjaGFyYWN0ZXIgc2V0LCBhbiBpY29uIGNhbiBvbmx5IGJlIE9OIG9yIE9GRi4KKworICBGb3JtYXQgc3BlY2lmaWVyCisgICAgJzgnIDogIEdlbmVyaWMgNyBzZWdtZW50IGRpZ2l0IHdpdGggaW5kaXZpZHVhbCBhZGRyZXNzYWJsZSBzZWdtZW50cworCisgICAgUmVkdWNlZCBjYXBhYmlsbGl0eSA3IHNlZ20gZGlnaXQsIHdoZW4gc2VnbWVudHMgYXJlIGhhcmQgd2lyZWQgdG9nZXRoZXIuCisgICAgJzEnIDogMiBzZWdtZW50cyBkaWdpdCBvbmx5IGFibGUgdG8gcHJvZHVjZSBhIDEuCisgICAgJ2UnIDogTW9zdCBzaWduaWZpY2FudCBkYXkgb2YgdGhlIG1vbnRoIGRpZ2l0LAorICAgICAgICAgIGFibGUgdG8gcHJvZHVjZSBhdCBsZWFzdCAxIDIgMy4KKyAgICAnTScgOiBNb3N0IHNpZ25pZmljYW50IG1pbnV0ZSBkaWdpdCwKKyAgICAgICAgICBhYmxlIHRvIHByb2R1Y2UgYXQgbGVhc3QgMCAxIDIgMyA0IDUuCisKKyAgICBJY29ucyBvciBwaWN0b2dyYW1zOgorICAgICcuJyA6IEZvciBleGFtcGxlIGxpa2UgQU0sIFBNLCBTVSwgYSAnZG90JyAuLiBvciBvdGhlciBzaW5nbGUgc2VnbWVudAorCSAgZWxlbWVudHMuCisKKworNC4gRHJpdmVyIHVzYWdlCit+fn5+fn5+fn5+fn5+fn4KK0ZvciB1c2VybGFuZCB0aGUgZm9sbG93aW5nIGludGVyZmFjZXMgYXJlIGF2YWlsYWJsZSB1c2luZyB0aGUgc3lzZnMgaW50ZXJmYWNlOgorICAvc3lzLy4uLi8KKyAgICAgICAgICAgbGluZTEJUmVhZC9Xcml0ZSwgbGNkIGxpbmUxCisgICAgICAgICAgIGxpbmUyCVJlYWQvV3JpdGUsIGxjZCBsaW5lMgorICAgICAgICAgICBsaW5lMwlSZWFkL1dyaXRlLCBsY2QgbGluZTMKKworCSAgIGdldF9pY29ucyAgICBSZWFkLCByZXR1cm5zIGEgc2V0IG9mIGF2YWlsYWJsZSBpY29ucy4KKwkgICBoaWRlX2ljb24gICAgV3JpdGUsIGhpZGUgdGhlIGVsZW1lbnQgYnkgd3JpdGluZyB0aGUgaWNvbiBuYW1lLgorCSAgIHNob3dfaWNvbiAgICBXcml0ZSwgZGlzcGxheSB0aGUgZWxlbWVudCBieSB3cml0aW5nIHRoZSBpY29uIG5hbWUuCisKKwkgICBtYXBfc2VnNwlSZWFkL1dyaXRlLCB0aGUgNyBzZWdtZW50cyBjaGFyIHNldCwgY29tbW9uIGZvciBhbGwKKwkgICAJCXllYWxpbmsgcGhvbmVzLiAoc2VlIG1hcF90b183c2VnbWVudC5oKQorCisJICAgcmluZ3RvbmUJV3JpdGUsIHVwbG9hZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgYSByaW5ndG9uZSwKKwkgICAJCXNlZSB5ZWFsaW5rLmMuIHN0YXR1cyBFWFBFUklNRU5UQUwgZHVlIHRvIHBvdGVudGlhbAorCQkJcmFjZXMgYmV0d2VlbiBhc3luYy4gYW5kIHN5bmMgdXNiIGNhbGxzLgorCisKKzQuMSBsaW5lWAorfn5+fn5+fn5+CitSZWFkaW5nIC9zeXMvLi4vbGluZVggd2lsbCByZXR1cm4gdGhlIGZvcm1hdCBzdHJpbmcgd2l0aCBpdHMgY3VycmVudCB2YWx1ZToKKworICBFeGFtcGxlOgorICBjYXQgLi9saW5lMworICA4ODg4ODg4ODg4ODgKKyAgTGludXggUm9ja3MhCisKK1dyaXRpbmcgdG8gL3N5cy8uLi9saW5lWCB3aWxsIHNldCB0aGUgY29yZXNwb25kaW5nIExDRCBsaW5lLgorIC0gRXhjZXNzIGNoYXJhY3RlcnMgYXJlIGlnbm9yZWQuCisgLSBJZiBsZXNzIGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhhbiBhbGxvd2VkLCB0aGUgcmVtYWluaW5nIGRpZ2l0cyBhcmUKKyAgIHVuY2hhbmdlZC4KKyAtIFRoZSB0YWIgJ1x0J2FuZCAnXG4nIGNoYXIgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBjb250ZW50LgorIC0gV3JpdGluZyBhIHNwYWNlIHRvIGFuIGljb24gd2lsbCBhbHdheXMgaGlkZSBpdHMgY29udGVudC4KKworICBFeGFtcGxlOgorICBkYXRlICsiJW0uJWUuJWs6JU0iICB8IHNlZCAncy9eMC8gLycgPiAuL2xpbmUxCisKKyAgV2lsbCB1cGRhdGUgdGhlIExDRCB3aXRoIHRoZSBjdXJyZW50IGRhdGUgJiB0aW1lLgorCisKKzQuMiBnZXRfaWNvbnMKK35+fn5+fn5+fn5+fn4KK1JlYWRpbmcgd2lsbCByZXR1cm4gYWxsIGF2YWlsYWJsZSBpY29uIG5hbWVzIGFuZCBpdHMgY3VycmVudCBzZXR0aW5nczoKKworICBjYXQgLi9nZXRfaWNvbnMKKyAgb24gTQorICBvbiBECisgIG9uIDoKKyAgICAgSU4KKyAgICAgT1VUCisgICAgIFNUT1JFCisgICAgIE5FVworICAgICBSRVAKKyAgICAgU1UKKyAgICAgTU8KKyAgICAgVFUKKyAgICAgV0UKKyAgICAgVEgKKyAgICAgRlIKKyAgICAgU0EKKyAgICAgTEVECisgICAgIERJQUxUT05FCisgICAgIFJJTkdUT05FCisKKworNC4zIHNob3cvaGlkZSBpY29ucworfn5+fn5+fn5+fn5+fn5+fn5+fgorV3JpdGluZyB0byB0aGVzZSBmaWxlcyB3aWxsIHVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIGljb24uCitPbmx5IG9uZSBpY29uIGF0IGEgdGltZSBjYW4gYmUgdXBkYXRlZC4KKworSWYgYW4gaWNvbiBpcyBhbHNvIG9uIGEgLi9saW5lWCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpcwordXBkYXRlZCB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIGljb24uCisKKyAgRXhhbXBsZSAtIGxpZ2h0IHVwIHRoZSBzdG9yZSBpY29uOgorICBlY2hvIC1uICJTVE9SRSIgPiAuL3Nob3dfaWNvbgorCisgIGNhdCAuL2xpbmUxCisgIDE4LmU4Lk04Ljg4Li4uMTg4CisgICAgICAgICAgICAgICBTCisKKyAgRXhhbXBsZSAtIHNvdW5kIHRoZSByaW5ndG9uZSBmb3IgMTAgc2Vjb25kczoKKyAgZWNobyAtbiBSSU5HVE9ORSA+IC9zeXMvLi4uLi9zaG93X2ljb24KKyAgc2xlZXAgMTAKKyAgZWNobyAtbiBSSU5HVE9ORSA+IC9zeXMvLi4uLi9oaWRlX2ljb24KKworCis1LiBTb3VuZCBmZWF0dXJlcworfn5+fn5+fn5+fn5+fn5+fn4KK1NvdW5kIGlzIHN1cHBvcnRlZCBieSB0aGUgQUxTQSBkcml2ZXI6IHNuZF91c2JfYXVkaW8KKworT25lIDE2LWJpdCBjaGFubmVsIHdpdGggc2FtcGxlIGFuZCBwbGF5YmFjayByYXRlcyBvZiA4MDAwIEh6IGlzIHRoZSBwcmFjdGljYWwKK2xpbWl0IG9mIHRoZSBkZXZpY2UuCisKKyAgRXhhbXBsZSAtIHJlY29yZGluZyB0ZXN0OgorICBhcmVjb3JkIC12IC1kIDEwIC1yIDgwMDAgLWYgUzE2X0xFIC10IHdhdiAgZm9vYmFyLndhdgorCisgIEV4YW1wbGUgLSBwbGF5YmFjayB0ZXN0OgorICBhcGxheSBmb29iYXIud2F2CisKKworNi4gQ3JlZGl0cyAmIEFja25vd2xlZGdtZW50cworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICAtIE9saXZpZXIgVmFuZG9ycGUsIGZvciBzdGFydGluZyB0aGUgdXNiYjJrLWFwaSBwcm9qZWN0IGRvaW5nIG11Y2ggb2YKKwl0aGUgcmV2ZXJzZSBlbmdpbmVlcmluZy4KKyAgLSBNYXJ0aW4gRGllaGwsIGZvciBwb2ludGluZyBvdXQgaG93IHRvIGhhbmRsZSBVU0IgbWVtb3J5IGFsbG9jYXRpb24uCisgIC0gRG1pdHJ5IFRvcm9raG92LCBmb3IgdGhlIG51bWVyb3VzIGNvZGUgcmV2aWV3cyBhbmQgc3VnZ2VzdGlvbnMuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9jZHJvbS50eHQKaW5kZXggNGNjZGNjNi4uOGVjMzJjYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9jZHJvbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9jZHJvbS50eHQKQEAgLTg3OCw3ICs4NzgsNyBAQAogCiAJZXJyb3IgcmV0dXJuczoKIAkgIEVJTlZBTAlwaHlzaWNhbC5sYXllcl9udW0gZXhjZWVkcyBudW1iZXIgb2YgbGF5ZXJzCi0JICBFSU8JCVJlY2lldmVkIGludmFsaWQgcmVzcG9uc2UgZnJvbSBkcml2ZQorCSAgRUlPCQlSZWNlaXZlZCBpbnZhbGlkIHJlc3BvbnNlIGZyb20gZHJpdmUKIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKaW5kZXggN2ZmMjEzZi4uMWY1ZjdkMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKQEAgLTM5LDggKzM5LDcgQEAKICAgIGFuZCBhcHBseSBodHRwOi8vbHNlLnNvdXJjZWZvcmdlLm5ldC9rZHVtcC9wYXRjaGVzL2tleGVjLXRvb2xzLTEuMTAxLWtkdW1wLnBhdGNoCiAgICBhbmQgYWZ0ZXIgdGhhdCBidWlsZCB0aGUgc291cmNlLgogCi0yKSBEb3dubG9hZCBhbmQgYnVpbGQgdGhlIGFwcHJvcHJpYXRlIChsYXRlc3QpIGtleGVjL2tkdW1wICgtbW0pIGtlcm5lbAotICAgcGF0Y2hzZXQgYW5kIGFwcGx5IGl0IHRvIHRoZSB2YW5pbGxhIGtlcm5lbCB0cmVlLgorMikgRG93bmxvYWQgYW5kIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSAoMi42LjEzLXJjMSBvbndhcmRzKSB2YW5pbGxhIGtlcm5lbC4KIAogICAgVHdvIGtlcm5lbHMgbmVlZCB0byBiZSBidWlsdCBpbiBvcmRlciB0byBnZXQgdGhpcyBmZWF0dXJlIHdvcmtpbmcuCiAKQEAgLTg0LDE1ICs4MywxNiBAQAogCiA0KSBMb2FkIHRoZSBzZWNvbmQga2VybmVsIHRvIGJlIGJvb3RlZCB1c2luZzoKIAotICAga2V4ZWMgLXAgPHNlY29uZC1rZXJuZWw+IC0tY3Jhc2gtZHVtcCAtLWFyZ3MtbGludXggLS1hcHBlbmQ9InJvb3Q9PHJvb3QtZGV2PgotICAgaW5pdCAxIGlycXBvbGwiCisgICBrZXhlYyAtcCA8c2Vjb25kLWtlcm5lbD4gLS1hcmdzLWxpbnV4IC0tZWxmMzItY29yZS1oZWFkZXJzCisgICAtLWFwcGVuZD0icm9vdD08cm9vdC1kZXY+IGluaXQgMSBpcnFwb2xsIgogCiAgICBOb3RlOiBpKSA8c2Vjb25kLWtlcm5lbD4gaGFzIHRvIGJlIGEgdm1saW51eCBpbWFnZS4gYnpJbWFnZSB3aWxsIG5vdCB3b3JrLAogCSAgICBhcyBvZiBub3cuCi0JaWkpIEJ5IGRlZmF1bHQgRUxGIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBFTEYzMiBmb3JtYXQgKGZvciBpMzg2KS4gVGhpcwotCSAgICBpcyBzdWZmaWNpZW50IHRvIHJlcHJlc2VudCB0aGUgcGh5c2ljYWwgbWVtb3J5IHVwIHRvIDRHQi4gVG8gc3RvcmUKLQkgICAgaGVhZGVycyBpbiBFTEY2NCBmb3JtYXQsIHNwZWNpZml5ICItLWVsZjY0LWNvcmUtaGVhZGVycyIgb24gdGhlCi0JICAgIGtleGVjIGNvbW1hbmQgbGluZSBhZGRpdGlvbmFsbHkuCisJaWkpIEJ5IGRlZmF1bHQgRUxGIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBFTEY2NCBmb3JtYXQuIE9wdGlvbgorCSAgICAtLWVsZjMyLWNvcmUtaGVhZGVycyBmb3JjZXMgZ2VuZXJhdGlvbiBvZiBFTEYzMiBoZWFkZXJzLiBnZGIgY2FuCisJICAgIG5vdCBvcGVuIEVMRjY0IGhlYWRlcnMgb24gMzIgYml0IHN5c3RlbXMuIFNvIGNyZWF0aW5nIEVMRjMyCisJICAgIGhlYWRlcnMgY2FuIGNvbWUgaGFuZHkgZm9yIHVzZXJzIHdobyBoYXZlIGdvdCBub24tUEFFIHN5c3RlbXMgYW5kCisJICAgIGhlbmNlIGhhdmUgbWVtb3J5IGxlc3MgdGhhbiA0R0IuCiAgICAgICAgaWlpKSBTcGVjaWZ5ICJpcnFwb2xsIiBhcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLiBUaGlzIHJlZHVjZXMgZHJpdmVyCiAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBmYWlsdXJlcyBpbiBzZWNvbmQga2VybmVsIGR1ZSB0byBzaGFyZWQgaW50ZXJydXB0cy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCAzZDVjZDdhLi5kYjI2MDNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNTQ5LDYgKzU0OSw3IEBACiAJCQkgICAgIGtleWJvYXJkIGFuZCBjYW4gbm90IGNvbnRyb2wgaXRzIHN0YXRlCiAJCQkgICAgIChEb24ndCBhdHRlbXB0IHRvIGJsaW5rIHRoZSBsZWRzKQogCWk4MDQyLm5vYXV4CVtIV10gRG9uJ3QgY2hlY2sgZm9yIGF1eGlsaWFyeSAoPT0gbW91c2UpIHBvcnQKKwlpODA0Mi5ub2tiZAlbSFddIERvbid0IGNoZWNrL2NyZWF0ZSBrZXlib2FyZCBwb3J0CiAJaTgwNDIubm9tdXgJW0hXXSBEb24ndCBjaGVjayBwcmVzZW5jZSBvZiBhbiBhY3RpdmUgbXVsdGlwbGV4aW5nCiAJCQkgICAgIGNvbnRyb2xsZXIKIAlpODA0Mi5ub3BucAlbSFddIERvbid0IHVzZSBBQ1BJUG5QIC8gUG5QQklPUyB0byBkaXNjb3ZlciBLQkQvQVVYCkBAIC0xMTc0LDYgKzExNzUsMTEgQEAKIAkJCU5ldyBuYW1lIGZvciB0aGUgcmFtZGlzayBwYXJhbWV0ZXIuCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9yYW1kaXNrLnR4dC4KIAorCXJkaW5pdD0JCVtLTkxdCisJCQlGb3JtYXQ6IDxmdWxsX3BhdGg+CisJCQlSdW4gc3BlY2lmaWVkIGJpbmFyeSBpbnN0ZWFkIG9mIC9pbml0IGZyb20gdGhlIHJhbWRpc2ssCisJCQl1c2VkIGZvciBlYXJseSB1c2Vyc3BhY2Ugc3RhcnR1cC4gU2VlIGluaXRyZC4KKwogCXJlYm9vdD0JCVtCVUdTPUlBLTMyLEJVR1M9QVJNLEJVR1M9SUEtNjRdIFJlYm9vdGluZyBtb2RlCiAJCQlGb3JtYXQ6IDxyZWJvb3RfbW9kZT5bLDxyZWJvb3RfbW9kZTI+WywuLi5dXQogCQkJU2VlIGFyY2gvKi9rZXJuZWwvcmVib290LmMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21vbm8udHh0IGIvRG9jdW1lbnRhdGlvbi9tb25vLnR4dAppbmRleCA2NzM5YWI5Li44MDdhMGM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21vbm8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbW9uby50eHQKQEAgLTMwLDcgKzMwLDcgQEAKICAgIFJlYWQgdGhlIGZpbGUgJ2JpbmZtdF9taXNjLnR4dCcgaW4gdGhpcyBkaXJlY3RvcnkgdG8ga25vdwogICAgbW9yZSBhYm91dCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgogCi0zKSBBZGQgdGhlIGZvbGxvd2luZyBlbnJpZXMgdG8gL2V0Yy9yYy5sb2NhbCBvciBzaW1pbGFyIHNjcmlwdAorMykgQWRkIHRoZSBmb2xsb3dpbmcgZW50cmllcyB0byAvZXRjL3JjLmxvY2FsIG9yIHNpbWlsYXIgc2NyaXB0CiAgICB0byBiZSBydW4gYXQgc3lzdGVtIHN0YXJ0dXA6CiAKICMgSW5zZXJ0IEJJTkZNVF9NSVNDIG1vZHVsZSBpbnRvIHRoZSBrZXJuZWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dAppbmRleCAyNGQwMjk0Li5hNTVmMGY5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCiAJSWYgcnVubmluZyBTTk1QIGFnZW50cywgdGhlIGJvbmRpbmcgZHJpdmVyIHNob3VsZCBiZSBsb2FkZWQKIGJlZm9yZSBhbnkgbmV0d29yayBkcml2ZXJzIHBhcnRpY2lwYXRpbmcgaW4gYSBib25kLiAgVGhpcyByZXF1aXJlbWVudAotaXMgZHVlIHRvIHRoZSB0aGUgaW50ZXJmYWNlIGluZGV4IChpcEFkRW50SWZJbmRleCkgYmVpbmcgYXNzb2NpYXRlZCB0bworaXMgZHVlIHRvIHRoZSBpbnRlcmZhY2UgaW5kZXggKGlwQWRFbnRJZkluZGV4KSBiZWluZyBhc3NvY2lhdGVkIHRvCiB0aGUgZmlyc3QgaW50ZXJmYWNlIGZvdW5kIHdpdGggYSBnaXZlbiBJUCBhZGRyZXNzLiAgVGhhdCBpcywgdGhlcmUgaXMKIG9ubHkgb25lIGlwQWRFbnRJZkluZGV4IGZvciBlYWNoIElQIGFkZHJlc3MuICBGb3IgZXhhbXBsZSwgaWYgZXRoMCBhbmQKIGV0aDEgYXJlIHNsYXZlcyBvZiBib25kMCBhbmQgdGhlIGRyaXZlciBmb3IgZXRoMCBpcyBsb2FkZWQgYmVmb3JlIHRoZQpAQCAtMTkzNyw3ICsxOTM3LDcgQEAKIAlJZiBub3QgZXhwbGljaXRseSBjb25maWd1cmVkICh3aXRoIGlmY29uZmlnIG9yIGlwIGxpbmspLCB0aGUKIE1BQyBhZGRyZXNzIG9mIHRoZSBib25kaW5nIGRldmljZSBpcyB0YWtlbiBmcm9tIGl0cyBmaXJzdCBzbGF2ZQogZGV2aWNlLiAgVGhpcyBNQUMgYWRkcmVzcyBpcyB0aGVuIHBhc3NlZCB0byBhbGwgZm9sbG93aW5nIHNsYXZlcyBhbmQKLXJlbWFpbnMgcGVyc2lzdGVudCAoZXZlbiBpZiB0aGUgdGhlIGZpcnN0IHNsYXZlIGlzIHJlbW92ZWQpIHVudGlsIHRoZQorcmVtYWlucyBwZXJzaXN0ZW50IChldmVuIGlmIHRoZSBmaXJzdCBzbGF2ZSBpcyByZW1vdmVkKSB1bnRpbCB0aGUKIGJvbmRpbmcgZGV2aWNlIGlzIGJyb3VnaHQgZG93biBvciByZWNvbmZpZ3VyZWQuCiAKIAlJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIE1BQyBhZGRyZXNzLCB5b3UgY2FuIHNldCBpdCB3aXRoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQKaW5kZXggYWVhMjBjZC4uYzk2ODk3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dApAQCAtMzU1LDcgKzM1NSw3IEBACiAJCQkJVGhlcmUgaXMgbm8gZnVuY3Rpb25hbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcyAgICAgICAgIAogCiAyLjAuNyAgIEF1ZyAyNiwgMTk5OQkJbyAgTWVyZ2VkIFgyNUFQSSBjb2RlIGludG8gV0FOUElQRS4KLQkJCQlvICBGaXhlZCBhIG1lbWVvcnkgbGVhayBmb3IgWDI1QVBJCisJCQkJbyAgRml4ZWQgYSBtZW1vcnkgbGVhayBmb3IgWDI1QVBJCiAJCQkJbyAgVXBkYXRlZCB0aGUgWDI1QVBJIGNvZGUgZm9yIDIuMi5YIGtlcm5lbHMuCiAJCQkJbyAgSW1wcm92ZWQgTkVNIGhhbmRsaW5nLiAgIAogCkBAIC01MTQsNyArNTE0LDcgQEAKIAkJCQlvIFBhdGNoZXMgZm9yIDIuNC4wIGtlcm5lbAogCQkJCW8gUGF0Y2hlcyBmb3IgMi4yLjE4IGtlcm5lbAogCQkJCW8gTWlub3IgdXBkYXRlcyB0byBQUFAgYW5kIENITERDIGRyaXZlcnMuCi0JCQkJICBOb3RlOiBObyBmdW5jdGluYWwgZGlmZmVyZW5jZS4gCisJCQkJICBOb3RlOiBObyBmdW5jdGlvbmFsIGRpZmZlcmVuY2UuCiAKIGJldGEzLTIuMi45CUphbiAxMCAyMDAxCiAJCQkJbyBJIG1pc3NlZCB0aGUgMi4yLjE4IGtlcm5lbCBwYXRjaGVzIGluIGJldGEyLTIuMi4wCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BjaS50eHQgYi9Eb2N1bWVudGF0aW9uL3BjaS50eHQKaW5kZXggNzZkMjhkMC4uNzExMjEwYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGNpLnR4dApAQCAtODQsNyArODQsNyBAQAogCiBNb3N0IGRyaXZlcnMgZG9uJ3QgbmVlZCB0byB1c2UgdGhlIGRyaXZlcl9kYXRhIGZpZWxkLiAgQmVzdCBwcmFjdGljZQogZm9yIHVzZSBvZiBkcml2ZXJfZGF0YSBpcyB0byB1c2UgaXQgYXMgYW4gaW5kZXggaW50byBhIHN0YXRpYyBsaXN0IG9mCi1lcXVpdmFsYW50IGRldmljZSB0eXBlcywgbm90IHRvIHVzZSBpdCBhcyBhIHBvaW50ZXIuCitlcXVpdmFsZW50IGRldmljZSB0eXBlcywgbm90IHRvIHVzZSBpdCBhcyBhIHBvaW50ZXIuCiAKIEhhdmUgYSB0YWJsZSBlbnRyeSB7UENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0KIHRvIGhhdmUgcHJvYmUoKSBjYWxsZWQgZm9yIGV2ZXJ5IFBDSSBkZXZpY2Uga25vd24gdG8gdGhlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAppbmRleCBkZGY5MDdmLi5iMGQ1MDg0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CkBAIC0xLDIyICsxLDIwIEBACi1Gcm9tIGtlcm5lbC9zdXNwZW5kLmM6CitTb21lIHdhcm5pbmdzLCBmaXJzdC4KIAogICogQklHIEZBVCBXQVJOSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIElmIHlvdSBoYXZlIHVuc3VwcG9ydGVkICgqKSBkZXZpY2VzIHVzaW5nIERNQS4uLgotICoJCQkJLi4uc2F5IGdvb2RieWUgdG8geW91ciBkYXRhLgotICoKICAqIElmIHlvdSB0b3VjaCBhbnl0aGluZyBvbiBkaXNrIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLi4uCiAgKgkJCQkuLi5raXNzIHlvdXIgZGF0YSBnb29kYnllLgogICoKLSAqIElmIHlvdXIgZGlzayBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzdXNwZW5kLi4uIChJREUgZG9lcykKLSAqCQkJCS4uLnlvdSdkIGJldHRlciBmaW5kIG91dCBob3cgdG8gZ2V0IGFsb25nCi0gKgkJCQkgICB3aXRob3V0IHlvdXIgZGF0YS4KKyAqIElmIHlvdSBkbyByZXN1bWUgZnJvbSBpbml0cmQgYWZ0ZXIgeW91ciBmaWxlc3lzdGVtcyBhcmUgbW91bnRlZC4uLgorICoJCQkJLi4uYnllIGJ5ZSByb290IHBhcnRpdGlvbi4KKyAqCQkJW3RoaXMgaXMgYWN0dWFsbHkgc2FtZSBjYXNlIGFzIGFib3ZlXQogICoKLSAqIElmIHlvdSBjaGFuZ2Uga2VybmVsIGNvbW1hbmQgbGluZSBiZXR3ZWVuIHN1c3BlbmQgYW5kIHJlc3VtZS4uLgotICoJCQkgICAgICAgIC4uLnByZXBhcmUgZm9yIG5hc3R5IGZzY2sgb3Igd29yc2UuCi0gKgotICogSWYgeW91IGNoYW5nZSB5b3VyIGhhcmR3YXJlIHdoaWxlIHN5c3RlbSBpcyBzdXNwZW5kZWQuLi4KLSAqCQkJICAgICAgICAuLi53ZWxsLCBpdCB3YXMgbm90IGdvb2QgaWRlYS4KKyAqIElmIHlvdSBoYXZlIHVuc3VwcG9ydGVkICgqKSBkZXZpY2VzIHVzaW5nIERNQSwgeW91IG1heSBoYXZlIHNvbWUKKyAqIHByb2JsZW1zLiBJZiB5b3VyIGRpc2sgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuZC4uLiAoSURFIGRvZXMpLAorICogaXQgbWF5IGNhdXNlIHNvbWUgcHJvYmxlbXMsIHRvby4gSWYgeW91IGNoYW5nZSBrZXJuZWwgY29tbWFuZCBsaW5lCisgKiBiZXR3ZWVuIHN1c3BlbmQgYW5kIHJlc3VtZSwgaXQgbWF5IGRvIHNvbWV0aGluZyB3cm9uZy4gSWYgeW91IGNoYW5nZQorICogeW91ciBoYXJkd2FyZSB3aGlsZSBzeXN0ZW0gaXMgc3VzcGVuZGVkLi4uIHdlbGwsIGl0IHdhcyBub3QgZ29vZCBpZGVhOworICogYnV0IGl0IHdpbGwgcHJvYmFibHkgb25seSBjcmFzaC4KICAqCiAgKiAoKikgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydCBpcyBuZWVkZWQgdG8gbWFrZSBpdCBzYWZlLgogCkBAIC0zMCw2ICsyOCwxMyBAQAogZWNobyBwbGF0Zm9ybSA+IC9zeXMvcG93ZXIvZGlzazsgZWNobyBkaXNrID4gL3N5cy9wb3dlci9zdGF0ZQogCiAKK0VuY3J5cHRlZCBzdXNwZW5kIGltYWdlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJZiB5b3Ugd2FudCB0byBzdG9yZSB5b3VyIHN1c3BlbmQgaW1hZ2UgZW5jcnlwdGVkIHdpdGggYSB0ZW1wb3JhcnkKK2tleSB0byBwcmV2ZW50IGRhdGEgZ2F0aGVyaW5nIGFmdGVyIHJlc3VtZSB5b3UgbXVzdCBjb21waWxlCitjcnlwdG8gYW5kIHRoZSBhZXMgYWxnb3JpdGhtIGludG8gdGhlIGtlcm5lbCAtIG1vZHVsZXMgd29uJ3Qgd29yaworYXMgdGhleSBjYW5ub3QgYmUgbG9hZGVkIGF0IHJlc3VtZSB0aW1lLgorCiAKIEFydGljbGUgYWJvdXQgZ29hbHMgYW5kIGltcGxlbWVudGF0aW9uIG9mIFNvZnR3YXJlIFN1c3BlbmQgZm9yIExpbnV4CiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpAQCAtODUsMTEgKzkwLDYgQEAKIFlvdSBoYXZlIHlvdXIgc2VydmVyIG9uIFVQUy4gUG93ZXIgZGllZCwgYW5kIFVQUyBpcyBpbmRpY2F0aW5nIDMwCiBzZWNvbmRzIHRvIGZhaWx1cmUuIFdoYXQgZG8geW91IGRvPyBTdXNwZW5kIHRvIGRpc2suCiAKLUV0aGVybmV0IGNhcmQgaW4geW91ciBzZXJ2ZXIgZGllZC4gWW91IHdhbnQgdG8gcmVwbGFjZSBpdC4gWW91cgotc2VydmVyIGlzIG5vdCBob3RwbHVnIGNhcGFibGUuIFdoYXQgZG8geW91IGRvPyBTdXNwZW5kIHRvIGRpc2ssCi1yZXBsYWNlIGV0aGVybmV0IGNhcmQsIHJlc3VtZS4gSWYgeW91IGFyZSBmYXN0IHlvdXIgdXNlcnMgd2lsbCBub3QKLWV2ZW4gc2VlIGJyb2tlbiBjb25uZWN0aW9ucy4KLQogCiBROiBNYXliZSBJJ20gbWlzc2luZyBzb21ldGhpbmcsIGJ1dCB3aHkgZG9uJ3QgdGhlIHJlZ3VsYXIgSS9PIHBhdGhzIHdvcms/CiAKQEAgLTExNywzMSArMTE3LDYgQEAKIAogQTogWWVzLiBUaGF0J3Mgd2hhdCBlY2hvIHBsYXRmb3JtID4gL3N5cy9wb3dlci9kaXNrIGRvZXMuCiAKLVE6IE15IG1hY2hpbmUgZG9lc24ndCB3b3JrIHdpdGggQUNQSS4gSG93IGNhbiBJIHVzZSBzd3N1c3AgdGhhbiA/Ci0KLUE6IERvIGEgcmVib290KCkgc3lzY2FsbCB3aXRoIHJpZ2h0IHBhcmFtZXRlcnMuIFdhcm5pbmc6IGdsaWJjIGdldHMgaW4KLWl0cyB3YXksIHNvIGNoZWNrIHdpdGggc3RyYWNlOgotCi1yZWJvb3QoTElOVVhfUkVCT09UX01BR0lDMSwgTElOVVhfUkVCT09UX01BR0lDMiwgMHhkMDAwZmNlMikKLQotKFRoYW5rcyB0byBQZXRlciBPc3Rlcmx1bmQ6KQotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzY2FsbC5oPgotCi0jZGVmaW5lIExJTlVYX1JFQk9PVF9NQUdJQzEgICAgIDB4ZmVlMWRlYWQKLSNkZWZpbmUgTElOVVhfUkVCT09UX01BR0lDMiAgICAgNjcyMjc0NzkzCi0jZGVmaW5lIExJTlVYX1JFQk9PVF9DTURfU1dfU1VTUEVORCAgICAgMHhEMDAwRkNFMgotCi1pbnQgbWFpbigpCi17Ci0gICAgc3lzY2FsbChTWVNfcmVib290LCBMSU5VWF9SRUJPT1RfTUFHSUMxLCBMSU5VWF9SRUJPT1RfTUFHSUMyLAotICAgICAgICAgICAgTElOVVhfUkVCT09UX0NNRF9TV19TVVNQRU5ELCAwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotQWxzbyAvc3lzLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHN0aWxsIHByZXNlbnQuCi0KIFE6IFdoYXQgaXMgJ3N1c3BlbmQyJz8KIAogQTogc3VzcGVuZDIgaXMgJ1NvZnR3YXJlIFN1c3BlbmQgMicsIGEgZm9ya2VkIGltcGxlbWVudGF0aW9uIG9mCkBAIC0zMTIsOSArMjg3LDQ1IEBACiBzdXNwZW5kIGltYWdlIHRvIHByZXZlbnQgc2Vuc2l0aXZlIGRhdGEgZnJvbSBiZWluZyBzdG9sZW4gYWZ0ZXIKIHJlc3VtZS4KIAotUTogV2h5IHdlIGNhbm5vdCBzdXNwZW5kIHRvIGEgc3dhcCBmaWxlPworUTogV2h5IGNhbid0IHdlIHN1c3BlbmQgdG8gYSBzd2FwIGZpbGU/CiAKIEE6IEJlY2F1c2UgYWNjZXNzaW5nIHN3YXAgZmlsZSBuZWVkcyB0aGUgZmlsZXN5c3RlbSBtb3VudGVkLCBhbmQKIGZpbGVzeXN0ZW0gbWlnaHQgZG8gc29tZXRoaW5nIHdyb25nIChsaWtlIHJlcGxheWluZyB0aGUgam91cm5hbCkKLWR1cmluZyBtb3VudC4gW1Byb2JhYmx5IGNvdWxkIGJlIHNvbHZlZCBieSBtb2RpZnlpbmcgZXZlcnkgZmlsZXN5c3RlbQotdG8gc3VwcG9ydCBzb21lIGtpbmQgb2YgInJlYWxseSByZWFkLW9ubHkhIiBvcHRpb24uIFBhdGNoZXMgd2VsY29tZS5dCitkdXJpbmcgbW91bnQuCisKK1RoZXJlIGFyZSBmZXcgd2F5cyB0byBnZXQgdGhhdCBmaXhlZDoKKworMSkgUHJvYmFibHkgY291bGQgYmUgc29sdmVkIGJ5IG1vZGlmeWluZyBldmVyeSBmaWxlc3lzdGVtIHRvIHN1cHBvcnQKK3NvbWUga2luZCBvZiAicmVhbGx5IHJlYWQtb25seSEiIG9wdGlvbi4gUGF0Y2hlcyB3ZWxjb21lLgorCisyKSBzdXNwZW5kMiBnZXRzIGFyb3VuZCB0aGF0IGJ5IHN0b3JpbmcgYWJzb2x1dGUgcG9zaXRpb25zIGluIG9uLWRpc2sKK2ltYWdlIChhbmQgYmxvY2tzaXplKSwgd2l0aCByZXN1bWUgcGFyYW1ldGVyIHBvaW50aW5nIGRpcmVjdGx5IHRvCitzdXNwZW5kIGhlYWRlci4KKworUTogSXMgdGhlcmUgYSBtYXhpbXVtIHN5c3RlbSBSQU0gc2l6ZSB0aGF0IGlzIHN1cHBvcnRlZCBieSBzd3N1c3A/CisKK0E6IEl0IHNob3VsZCB3b3JrIG9rYXkgd2l0aCBoaWdobWVtLgorCitROiBEb2VzIHN3c3VzcCAodG8gZGlzaykgdXNlIG9ubHkgb25lIHN3YXAgcGFydGl0aW9uIG9yIGNhbiBpdCB1c2UKK211bHRpcGxlIHN3YXAgcGFydGl0aW9ucyAoYWdncmVnYXRlIHRoZW0gaW50byBvbmUgbG9naWNhbCBzcGFjZSk/CisKK0E6IE9ubHkgb25lIHN3YXAgcGFydGl0aW9uLCBzb3JyeS4KKworUTogSWYgbXkgYXBwbGljYXRpb24ocykgY2F1c2VzIGxvdHMgb2YgbWVtb3J5ICYgc3dhcCBzcGFjZSB0byBiZSB1c2VkCisob3ZlciBoYWxmIG9mIHRoZSB0b3RhbCBzeXN0ZW0gUkFNKSwgaXMgaXQgY29ycmVjdCB0aGF0IGl0IGlzIGxpa2VseQordG8gYmUgdXNlbGVzcyB0byB0cnkgdG8gc3VzcGVuZCB0byBkaXNrIHdoaWxlIHRoYXQgYXBwIGlzIHJ1bm5pbmc/CisKK0E6IE5vLCBpdCBzaG91bGQgd29yayBva2F5LCBhcyBsb25nIGFzIHlvdXIgYXBwIGRvZXMgbm90IG1sb2NrKCkKK2l0LiBKdXN0IHByZXBhcmUgYmlnIGVub3VnaCBzd2FwIHBhcnRpdGlvbi4KKworUTogV2hhdCBpbmZvcm1hdGlvbiBpcyB1c2VmdWxsIGZvciBkZWJ1Z2dpbmcgc3VzcGVuZC10by1kaXNrIHByb2JsZW1zPworCitBOiBXZWxsLCBsYXN0IG1lc3NhZ2VzIG9uIHRoZSBzY3JlZW4gYXJlIGFsd2F5cyB1c2VmdWwuIElmIHNvbWV0aGluZworaXMgYnJva2VuLCBpdCBpcyB1c3VhbGx5IHNvbWUga2VybmVsIGRyaXZlciwgdGhlcmVmb3JlIHRyeWluZyB3aXRoIGFzCitsaXR0bGUgYXMgcG9zc2libGUgbW9kdWxlcyBsb2FkZWQgaGVscHMgYSBsb3QuIEkgYWxzbyBwcmVmZXIgcGVvcGxlIHRvCitzdXNwZW5kIGZyb20gY29uc29sZSwgcHJlZmVyYWJseSB3aXRob3V0IFggcnVubmluZy4gQm9vdGluZyB3aXRoCitpbml0PS9iaW4vYmFzaCwgdGhlbiBzd2Fwb24gYW5kIHN0YXJ0aW5nIHN1c3BlbmQgc2VxdWVuY2UgbWFudWFsbHkKK3VzdWFsbHkgZG9lcyB0aGUgdHJpY2suIFRoZW4gaXQgaXMgZ29vZCBpZGVhIHRvIHRyeSB3aXRoIGxhdGVzdAordmFuaWxsYSBrZXJuZWwuCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAppbmRleCAxYTQ0ZThhLi41MjZkNmRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dApAQCAtMTIwLDYgKzEyMCw3IEBACiBJQk0gVFAgWDIwCQkJPz8/ICgqKQogSUJNIFRQIFgzMAkJCXMzX2Jpb3MgKDIpCiBJQk0gVFAgWDMxIC8gVHlwZSAyNjcyLVhYSCAgICAgIG5vbmUgKDEpLCB1c2UgcmFkZW9udG9vbCAoaHR0cDovL2ZkZC5jb20vc29mdHdhcmUvcmFkZW9uLykgdG8gdHVybiBvZmYgYmFja2xpZ2h0LgorSUJNIFRQIFgzMgkJCW5vbmUgKDEpLCBidXQgYmFja2xpZ2h0IGlzIG9uIGFuZCB2aWRlbyBpcyB0cmFzaGVkIGFmdGVyIGxvbmcgc3VzcGVuZAogSUJNIFRoaW5rcGFkIFg0MCBUeXBlIDIzNzEtN0pHICBzM19iaW9zLHMzX21vZGUgKDQpCiBNZWRpb24gTUQ0MjIwCQkJPz8/ICgqKQogU2Ftc3VuZyBQMzUJCQl2YmV0b29sIG5lZWRlZCAoNikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9lZWgtcGNpLWVycm9yLXJlY292ZXJ5LnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9lZWgtcGNpLWVycm9yLXJlY292ZXJ5LnR4dAppbmRleCAyYmZlNzFiLi5lNzVkNzQ3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZWVoLXBjaS1lcnJvci1yZWNvdmVyeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2VlaC1wY2ktZXJyb3ItcmVjb3ZlcnkudHh0CkBAIC0xMzQsNyArMTM0LDcgQEAKIHdpdGggdGhhdCBhZGRyZXNzIChpZiBhbnkpLgogCiBUaGUgZGVmYXVsdCBpbmNsdWRlL2FzbS1wcGM2NC9pby5oIG1hY3JvcyByZWFkYigpLCBpbmIoKSwgaW5zYigpLAotZXRjLiBpbmNsdWRlIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSB0aGUgaS9vIHJlYWQgcmV0dXJuZWQgYWxsLTB4ZmYncy4KK2V0Yy4gaW5jbHVkZSBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgaS9vIHJlYWQgcmV0dXJuZWQgYWxsLTB4ZmYncy4KIElmIHNvLCB0aGVzZSBtYWtlIGEgY2FsbCB0byBlZWhfZG5fY2hlY2tfZmFpbHVyZSgpLCB3aGljaCBpbiB0dXJuCiBhc2tzIHRoZSBmaXJtd2FyZSBpZiB0aGUgYWxsLWZmJ3MgdmFsdWUgaXMgdGhlIHNpZ24gb2YgYSB0cnVlIEVFSAogZXJyb3IuICBJZiBpdCBpcyBub3QsIHByb2Nlc3NpbmcgY29udGludWVzIGFzIG5vcm1hbC4gIFRoZSBncmFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CmluZGV4IGUyNGZkZWEuLmUzMjFhOGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKQEAgLTQ2OCw3ICs0NjgsNyBAQAogVGhlIHJhdyB2aWV3IHJldHVybnMgYSBieXRlc3RyZWFtIGFzIHRoZSBkZWJ1ZyBhcmVhcyBhcmUgc3RvcmVkIGluIG1lbW9yeS4KIAogVGhlIHNwcmludGYgdmlldyBmb3JtYXRzIHRoZSBkZWJ1ZyBlbnRyaWVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgc3ByaW50ZgotZnVuY3Rpb24gd291bGQgZG8uIFRoZSBzcHJpbnRmIGV2ZW50L2V4cGVjdGlvbiBmdWN0aW9ucyB3cml0ZSB0byB0aGUgCitmdW5jdGlvbiB3b3VsZCBkby4gVGhlIHNwcmludGYgZXZlbnQvZXhwZWN0aW9uIGZ1bmN0aW9ucyB3cml0ZSB0byB0aGUKIGRlYnVnIGVudHJ5IGEgcG9pbnRlciB0byB0aGUgZm9ybWF0IHN0cmluZyAoc2l6ZSA9IHNpemVvZihsb25nKSkgCiBhbmQgZm9yIGVhY2ggdmFyYXJnIGEgbG9uZyB2YWx1ZS4gU28gZS5nLiBmb3IgYSBkZWJ1ZyBlbnRyeSB3aXRoIGEgZm9ybWF0IAogc3RyaW5nIHBsdXMgdHdvIHZhcmFyZ3Mgb25lIHdvdWxkIG5lZWQgdG8gYWxsb2NhdGUgYSAoMyAqIHNpemVvZihsb25nKSkgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eC50eHQKaW5kZXggMTYwZTczNS4uNDdlNzRkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4LnR4dApAQCAtMSw1ICsxLDUgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09ICAgIEFkYXB0ZWMgQWljN3h4eCBGYXN0IC0+IFVsdHJhMTYwIEZhbWlseSBNYW5hZ2VyIFNldCB2Ni4yLjI4ICAgPQorPSAgICBBZGFwdGVjIEFpYzd4eHggRmFzdCAtPiBVbHRyYTE2MCBGYW1pbHkgTWFuYWdlciBTZXQgdjcuMCAgICAgID0KID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRE1FIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9CiA9ICAgICAgICAgICAgICAgICAgICAgVGhlIExpbnV4IE9wZXJhdGluZyBTeXN0ZW0gICAgICAgICAgICAgICAgICAgPQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEzMSw2ICsxMzEsMTAgQEAKICAgICAgIFNDU0kgInN0dWIiIGVmZmVjdHMuCiAKIDIuIFZlcnNpb24gSGlzdG9yeQorICAgNy4wCSAgKDR0aCBBdWd1c3QsIDIwMDUpCisJLSBVcGRhdGVkIGRyaXZlciB0byB1c2UgU0NTSSB0cmFuc3BvcnQgY2xhc3MgaW5mcmFzdHJ1Y3R1cmUKKwktIFVwcG9ydGVkIHNlcXVlbmNlciBhbmQgY29yZSBmaXhlcyBmcm9tIGxhc3QgYWRhcHRlYyByZWxlYXNlZAorCSAgdmVyc2lvbiBvZiB0aGUgZHJpdmVyLgogICAgNi4yLjM2IChKdW5lIDNyZCwgMjAwMykKICAgICAgICAgLSBDb3JyZWN0IGNvZGUgdGhhdCBkaXNhYmxlcyBQQ0kgcGFyaXR5IGVycm9yIGNoZWNraW5nLgogICAgICAgICAtIENvcnJlY3QgYW5kIHNpbXBsaWZ5IGhhbmRsaW5nIG9mIHRoZSBpZ25vcmUgd2lkZSByZXNpZHVlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0CmluZGV4IDI4MTQ0OTEuLjJmZmIzYWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgIC9wcm9jL3Njc2kvaWJtbWNhLzxob3N0X25vPi4gaWJtbWNhX3Byb2NfaW5mbygpIHByb3ZpZGVzIHRoaXMgaW5mb3JtYXRpb24uCiAgICAKICAgIFRoaXMgdGFibGUgaXMgcXVpdGUgaW5mb3JtYXRpdmUgZm9yIGludGVyZXN0ZWQgdXNlcnMuIEl0IHNob3dzIHRoZSBsb2FkCi0gICBvZiBjb21tYW5kcyBvbiB0aGUgc3Vic3lzdGVtIGFuZCB3ZXRoZXIgeW91IGFyZSBydW5uaW5nIHRoZSBieXBhc3NlZCAKKyAgIG9mIGNvbW1hbmRzIG9uIHRoZSBzdWJzeXN0ZW0gYW5kIHdoZXRoZXIgeW91IGFyZSBydW5uaW5nIHRoZSBieXBhc3NlZAogICAgKHNvZnR3YXJlKSBvciBpbnRlZ3JhdGVkIChoYXJkd2FyZSkgU0NTSS1jb21tYW5kIHNldCAoc2VlIGJlbG93KS4gVGhlCiAgICBhbW91bnQgb2YgYWNjZXNzZXMgaXMgc2hvd24uIFJlYWQsIHdyaXRlLCBtb2Rlc2VsZWN0IGlzIHNob3duIHNlcGFyYXRlbHkKICAgIGluIG9yZGVyIHRvIGhlbHAgZGVidWdnaW5nIHByb2JsZW1zIHdpdGggQ0QtUk9NcyBvciB0YXBlZHJpdmVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0CmluZGV4IDc1MzY4MjMuLjQ0ZGY4OWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX21pZF9sb3dfYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9taWRfbG93X2FwaS50eHQKQEAgLTM3MywxMyArMzczLDExIEBACiAgICBzY3NpX2FjdGl2YXRlX3RjcSAtIHR1cm4gb24gdGFnIGNvbW1hbmQgcXVldWVpbmcKICAgIHNjc2lfYWRkX2RldmljZSAtIGNyZWF0ZXMgbmV3IHNjc2kgZGV2aWNlIChsdSkgaW5zdGFuY2UKICAgIHNjc2lfYWRkX2hvc3QgLSBwZXJmb3JtIHN5c2ZzIHJlZ2lzdHJhdGlvbiBhbmQgU0NTSSBidXMgc2Nhbi4KLSAgIHNjc2lfYWRkX3RpbWVyIC0gKHJlLSlzdGFydCB0aW1lciBvbiBhIFNDU0kgY29tbWFuZC4KICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoIC0gY2hhbmdlIHRoZSBxdWV1ZSBkZXB0aCBvbiBhIFNDU0kgZGV2aWNlCiAgICBzY3NpX2Fzc2lnbl9sb2NrIC0gcmVwbGFjZSBkZWZhdWx0IGhvc3RfbG9jayB3aXRoIGdpdmVuIGxvY2sKICAgIHNjc2lfYmlvc19wdGFibGUgLSByZXR1cm4gY29weSBvZiBibG9jayBkZXZpY2UncyBwYXJ0aXRpb24gdGFibGUKICAgIHNjc2lfYmxvY2tfcmVxdWVzdHMgLSBwcmV2ZW50IGZ1cnRoZXIgY29tbWFuZHMgYmVpbmcgcXVldWVkIHRvIGdpdmVuIGhvc3QKICAgIHNjc2lfZGVhY3RpdmF0ZV90Y3EgLSB0dXJuIG9mZiB0YWcgY29tbWFuZCBxdWV1ZWluZwotICAgc2NzaV9kZWxldGVfdGltZXIgLSBjYW5jZWwgdGltZXIgb24gYSBTQ1NJIGNvbW1hbmQuCiAgICBzY3NpX2hvc3RfYWxsb2MgLSByZXR1cm4gYSBuZXcgc2NzaV9ob3N0IGluc3RhbmNlIHdob3NlIHJlZmNvdW50PT0xCiAgICBzY3NpX2hvc3RfZ2V0IC0gaW5jcmVtZW50cyBTY3NpX0hvc3QgaW5zdGFuY2UncyByZWZjb3VudAogICAgc2NzaV9ob3N0X3B1dCAtIGRlY3JlbWVudHMgU2NzaV9Ib3N0IGluc3RhbmNlJ3MgcmVmY291bnQgKGZyZWUgaWYgMCkKQEAgLTQ1OCwyNyArNDU2LDYgQEAKIAogCiAvKioKLSAqIHNjc2lfYWRkX3RpbWVyIC0gKHJlLSlzdGFydCB0aW1lciBvbiBhIFNDU0kgY29tbWFuZC4KLSAqIEBzY21kOiAgICBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBpbnN0YW5jZQotICogQHRpbWVvdXQ6IGR1cmF0aW9uIG9mIHRpbWVvdXQgaW4gImppZmZpZXMiCi0gKiBAY29tcGxldGU6IHBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gY2FsbCBpZiB0aW1lb3V0IGV4cGlyZXMKLSAqCi0gKiAgICAgIFJldHVybnMgbm90aGluZwotICoKLSAqICAgICAgTWlnaHQgYmxvY2s6IG5vCi0gKgotICogICAgICBOb3RlczogRWFjaCBzY3NpIGNvbW1hbmQgaGFzIGl0cyBvd24gdGltZXIsIGFuZCBhcyBpdCBpcyBhZGRlZAotICogICAgICB0byB0aGUgcXVldWUsIHdlIHNldCB1cCB0aGUgdGltZXIuIFdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLCAKLSAqICAgICAgd2UgY2FuY2VsIHRoZSB0aW1lci4gQW4gTExEIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2UKLSAqICAgICAgdGhlIGV4aXN0aW5nIHRpbWVvdXQgdmFsdWUuCi0gKgotICogICAgICBEZWZpbmVkIGluOiBkcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCi0gKiovCi12b2lkIHNjc2lfYWRkX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIGludCB0aW1lb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQotCi0KLS8qKgogICogc2NzaV9hZGp1c3RfcXVldWVfZGVwdGggLSBhbGxvdyBMTEQgdG8gY2hhbmdlIHF1ZXVlIGRlcHRoIG9uIGEgU0NTSSBkZXZpY2UKICAqIEBzZGV2OiAgICAgICBwb2ludGVyIHRvIFNDU0kgZGV2aWNlIHRvIGNoYW5nZSBxdWV1ZSBkZXB0aCBvbgogICogQHRhZ2dlZDogICAgIDAgLSBubyB0YWdnZWQgcXVldWluZwpAQCAtNTY2LDI0ICs1NDMsNiBAQAogCiAKIC8qKgotICogc2NzaV9kZWxldGVfdGltZXIgLSBjYW5jZWwgdGltZXIgb24gYSBTQ1NJIGNvbW1hbmQuCi0gKiBAc2NtZDogICAgcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgaW5zdGFuY2UKLSAqCi0gKiAgICAgIFJldHVybnMgMSBpZiBhYmxlIHRvIGNhbmNlbCB0aW1lciBlbHNlIDAgKGkuZS4gdG9vIGxhdGUgb3IgYWxyZWFkeQotICogICAgICBjYW5jZWxsZWQpLgotICoKLSAqICAgICAgTWlnaHQgYmxvY2s6IG5vIFttYXkgaW4gdGhlIGZ1dHVyZSBpZiBpdCBpbnZva2VzIGRlbF90aW1lcl9zeW5jKCldCi0gKgotICogICAgICBOb3RlczogQWxsIGNvbW1hbmRzIGlzc3VlZCBieSB1cHBlciBsZXZlbHMgYWxyZWFkeSBoYXZlIGEgdGltZW91dAotICogICAgICBhc3NvY2lhdGVkIHdpdGggdGhlbS4gQW4gTExEIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBjYW5jZWwgdGhlCi0gKiAgICAgIHRpbWVyLgotICoKLSAqICAgICAgRGVmaW5lZCBpbjogZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwotICoqLwotaW50IHNjc2lfZGVsZXRlX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCi0KLQotLyoqCiAgKiBzY3NpX2hvc3RfYWxsb2MgLSBjcmVhdGUgYSBzY3NpIGhvc3QgYWRhcHRlciBpbnN0YW5jZSBhbmQgcGVyZm9ybSBiYXNpYwogICogICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uCiAgKiBAc2h0OiAgICAgICAgcG9pbnRlciB0byBzY3NpIGhvc3QgdGVtcGxhdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc29ueXBpLnR4dCBiL0RvY3VtZW50YXRpb24vc29ueXBpLnR4dAppbmRleCAwZjNiMjQwLi5jMTIzN2E5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb255cGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc29ueXBpLnR4dApAQCAtOTksNiArOTksNyBAQAogCQkJCVNPTllQSV9NRVlFX01BU0sJCTB4MDQwMAogCQkJCVNPTllQSV9NRU1PUllTVElDS19NQVNLCQkweDA4MDAKIAkJCQlTT05ZUElfQkFUVEVSWV9NQVNLCQkweDEwMDAKKwkJCQlTT05ZUElfV0lSRUxFU1NfTUFTSwkJMHgyMDAwCiAKIAl1c2VpbnB1dDoJaWYgc2V0ICh3aGljaCBpcyB0aGUgZGVmYXVsdCkgdHdvIGlucHV0IGRldmljZXMgYXJlCiAJCQljcmVhdGVkLCBvbmUgd2hpY2ggaW50ZXJwcmV0cyB0aGUgam9nZGlhbCBldmVudHMgYXMKQEAgLTEzNyw2ICsxMzgsMTUgQEAKIAkgIHNwZWVkIGhhbmRsaW5nIGV0YykuIFVzZSBBQ1BJIGluc3RlYWQgb2YgQVBNIGlmIGl0IHdvcmtzIG9uIHlvdXIKIAkgIGxhcHRvcC4KIAorCS0gc29ueXBpIGxhY2tzIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gY2VydGFpbiBrZXkKKwkgIGV2ZW50cyBvbiBzb21lIG1vZGVscy4KKworCS0gc29tZSBtb2RlbHMgd2l0aCB0aGUgbnZpZGlhIGNhcmQgKGdlZm9yY2UgZ28gNjIwMCB0YykgdXNlcyBhCisJICBkaWZmZXJlbnQgd2F5IHRvIGFkanVzdCB0aGUgYmFja2xpZ2h0aW5nIG9mIHRoZSBzY3JlZW4uIFRoZXJlCisJICBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IHRvIGFkanVzdCB0aGUgYnJpZ2h0bmVzcyBvbiB0aG9zZSBtb2RlbHMsCisJICB3aGljaCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tCisJICBodHRwOi8vd3d3LmFjYy51bXUuc2UvfmVyaWt3L3Byb2dyYW0vc21hcnRkaW1tZXItMC4xLnRhci5iejIKKwogCS0gc2luY2UgYWxsIGRldmVsb3BtZW50IHdhcyBkb25lIGJ5IHJldmVyc2UgZW5naW5lZXJpbmcsIHRoZXJlIGlzCiAJICBfYWJzb2x1dGVseSBubyBndWFyYW50ZWVfIHRoYXQgdGhpcyBkcml2ZXIgd2lsbCBub3QgY3Jhc2ggeW91cgogCSAgbGFwdG9wLiBQZXJtYW5lbnRseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggNWM0OWJhMC4uZWJmY2RmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTE0NTksNyArMTQ1OSw3IEBACiBUbyBhdXRvLWxvYWQgYW4gQUxTQSBkcml2ZXIgZm9yIE9TUyBzZXJ2aWNlcywgZGVmaW5lIHRoZSBzdHJpbmcKICdzb3VuZC1zbG90LSVpJyB3aGVyZSAlaSBtZWFucyB0aGUgc2xvdCBudW1iZXIgZm9yIE9TUywgd2hpY2gKIGNvcnJlc3BvbmRzIHRvIHRoZSBjYXJkIGluZGV4IG9mIEFMU0EuICBVc3VhbGx5LCBkZWZpbmUgdGhpcwotYXMgdGhlIHRoZSBzYW1lIGNhcmQgbW9kdWxlLgorYXMgdGhlIHNhbWUgY2FyZCBtb2R1bGUuCiAKIEFuIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgZW11MTBrMSBjYXJkIGlzIGxpa2UgYmVsb3c6CiAtLS0tLSAvZXRjL21vZHByb2JlLmNvbmYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dCBiL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dAppbmRleCBmOTc4NDE0Li41ZGY0NGRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0CkBAIC01Nyw3ICs1Nyw3IEBACiAKIGFuZCBEYXZlSiBoYXMgdGFyLWJhbGxzIGF0CiAKLQlodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL3Byb2plY3RzL2JpdGtlZXBlci9zcGFyc2UvCisJaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9naXQtc25hcHNob3RzL3NwYXJzZS8KIAogCiBPbmNlIHlvdSBoYXZlIGl0LCBqdXN0IGRvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzcnEudHh0CmluZGV4IDEzNmQ4MTcuLmJhZjE3YjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzcnEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzcnEudHh0CkBAIC0xNzEsNyArMTcxLDcgQEAKIE5leHQsIHlvdSBtdXN0IGNyZWF0ZSBhIHN5c3JxX2tleV9vcCBzdHJ1Y3QsIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIEEpIHRoZSBrZXkKIGhhbmRsZXIgZnVuY3Rpb24geW91IHdpbGwgdXNlLCBCKSBhIGhlbHBfbXNnIHN0cmluZywgdGhhdCB3aWxsIHByaW50IHdoZW4gU3lzUlEKIHByaW50cyBoZWxwLCBhbmQgQykgYW4gYWN0aW9uX21zZyBzdHJpbmcsIHRoYXQgd2lsbCBwcmludCByaWdodCBiZWZvcmUgeW91cgotaGFuZGxlciBpcyBjYWxsZWQuIFlvdXIgaGFuZGxlciBtdXN0IGNvbmZvcm0gdG8gdGhlIHByb3RveXBlIGluICdzeXNycS5oJy4KK2hhbmRsZXIgaXMgY2FsbGVkLiBZb3VyIGhhbmRsZXIgbXVzdCBjb25mb3JtIHRvIHRoZSBwcm90b3R5cGUgaW4gJ3N5c3JxLmgnLgogCiBBZnRlciB0aGUgc3lzcnFfa2V5X29wIGlzIGNyZWF0ZWQsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gCiByZWdpc3Rlcl9zeXNycV9rZXkoaW50IGtleSwgc3RydWN0IHN5c3JxX2tleV9vcCAqb3BfcCkgdGhhdCBpcyBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CmluZGV4IDBjN2I2NTQuLjU0NDQzMGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CkBAIC0yMTc2LDcgKzIxNzYsNyBAQAogICBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgZmlsZXMgb24gdGhlIGhvc3QgbWFjaGluZSBmcm9tIGluc2lkZSBVTUwsIHlvdQogICBjYW4gdHJlYXQgaXQgYXMgYSBzZXBhcmF0ZSBtYWNoaW5lIGFuZCBlaXRoZXIgbmZzIG1vdW50IGRpcmVjdG9yaWVzCiAgIGZyb20gdGhlIGhvc3Qgb3IgY29weSBmaWxlcyBpbnRvIHRoZSB2aXJ0dWFsIG1hY2hpbmUgd2l0aCBzY3Agb3IgcmNwLgotICBIb3dldmVyLCBzaW5jZSBVTUwgaXMgcnVubmluZyBvbiB0aGUgdGhlIGhvc3QsIGl0IGNhbiBhY2Nlc3MgdGhvc2UKKyAgSG93ZXZlciwgc2luY2UgVU1MIGlzIHJ1bm5pbmcgb24gdGhlIGhvc3QsIGl0IGNhbiBhY2Nlc3MgdGhvc2UKICAgZmlsZXMganVzdCBsaWtlIGFueSBvdGhlciBwcm9jZXNzIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlIGluc2lkZSB0aGUKICAgdmlydHVhbCBtYWNoaW5lIHdpdGhvdXQgbmVlZGluZyB0byB1c2UgdGhlIG5ldHdvcmsuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2dhZGdldF9zZXJpYWwudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X3NlcmlhbC50eHQKaW5kZXggYTkzOGMzZC4uODE1ZjVjMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X3NlcmlhbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X3NlcmlhbC50eHQKQEAgLTIwLDcgKzIwLDcgQEAKIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiBNQSAwMjExMS0xMzA3IFVTQS4KIAotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRoZSBnYWRnZXQgc2VyaWFsIGRyaXZlciBpdHNlbGYgYXJlCitUaGlzIGRvY3VtZW50IGFuZCB0aGUgZ2FkZ2V0IHNlcmlhbCBkcml2ZXIgaXRzZWxmIGFyZQogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEFsIEJvcmNoZXJzIChhbGJvcmNoZXJzQHN0ZWluZXJwb2ludC5jb20pLgogCiBJZiB5b3UgaGF2ZSBxdWVzdGlvbnMsIHByb2JsZW1zLCBvciBzdWdnZXN0aW9ucyBmb3IgdGhpcyBkcml2ZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgppbmRleCA2MmExMmEwLi5lYzc4NWY5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CkBAIC0xMjYsMTAgKzEyNiwxMiBAQAogY2FyZD0xMjUgLSBNQVRSSVggVmlzaW9uIFNpZ21hLVNRCiBjYXJkPTEyNiAtIE1BVFJJWCBWaXNpb24gU2lnbWEtU0xDCiBjYXJkPTEyNyAtIEFQQUMgVmlld2NvbXAgODc4KEFNQVgpCi1jYXJkPTEyOCAtIERWSUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZQorY2FyZD0xMjggLSBEVmlDTyBGdXNpb25IRFRWIERWQi1UIExpdGUKIGNhcmQ9MTI5IC0gVi1HZWFyIE15VkNECiBjYXJkPTEzMCAtIFN1cGVyIFRWIFR1bmVyCiBjYXJkPTEzMSAtIFRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNgogY2FyZD0xMzIgLSBLb2RpY29tIDQ0MDBSIChtYXN0ZXIpCiBjYXJkPTEzMyAtIEtvZGljb20gNDQwMFIgKHNsYXZlKQogY2FyZD0xMzQgLSBBZGxpbmsgUlRWMjQKK2NhcmQ9MTM1IC0gRFZpQ08gRnVzaW9uSERUViA1IExpdGUKK2NhcmQ9MTM2IC0gQWNvcnAgWTg3OEYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCAxYjVhM2E5Li5kYzU3MjI1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC02MiwzICs2Miw2IEBACiAgNjEgLT4gUGhpbGlwcyBUT1VHSCBEVkItVCByZWZlcmVuY2UgZGVzaWduICAgICBbMTEzMToyMDA0XQogIDYyIC0+IENvbXBybyBWaWRlb01hdGUgVFYgR29sZCtJSQogIDYzIC0+IEt3b3JsZCBYcGVydCBUViBQVlI3MTM0CisgNjQgLT4gRmx5VFYgbWluaSBBc3VzIERpZ2ltYXRyaXggICAgICAgICAgICAgICBbMTA0MzowMjEwLDEwNDM6MDIxMF0KKyA2NSAtPiBWLVN0cmVhbSBTdHVkaW8gVFYgVGVybWluYXRvcgorIDY2IC0+IFl1YW4gVFVOLTkwMCAoc2FhNzEzNSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCmluZGV4IGYzMzAyZTEuLmY1ODc2YmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgpAQCAtNjQsMyArNjQsNCBAQAogdHVuZXI9NjMgLSBQaGlsaXBzIEZNRDEyMTZNRSBNSzMgSHlicmlkIFR1bmVyCiB0dW5lcj02NCAtIExHIFREVlMtSDA2MkYvVFVBNjAzNAogdHVuZXI9NjUgLSBZbWVjIFRWRjY2VDUtQi9ERkYKK3R1bmVyPTY2IC0gTEcgTlRTQyAoVEFMTiBtaW5pIHNlcmllcykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4gYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuCmluZGV4IDAxNDI1YzIuLjUyYzk0YmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4KKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbgpAQCAtMjIyLDcgKzIyMiw3IEBACiBjYW4gZ2VuZXJhdGU6IFBBTCAsIE5UU0MgLCBTRUNBTQogCiBUaGUgYWR2NzE3eCwgc2hvdWxkIGJlIGFibGUgdG8gcHJvZHVjZSBQQUwgTi4gQnV0IHlvdSBmaW5kIG5vdGhpbmcgUEFMIE4gCi1zcGVjaWZpYyBpbiB0aGUgdGhlIHJlZ2lzdGVycy4gU2VlbSB0aGF0IHlvdSBoYXZlIHRvIHJldXNlIGEgb3RoZXIgc3RhbmRhcmQKK3NwZWNpZmljIGluIHRoZSByZWdpc3RlcnMuIFNlZW0gdGhhdCB5b3UgaGF2ZSB0byByZXVzZSBhIG90aGVyIHN0YW5kYXJkCiB0byBnZW5lcmF0ZSBQQUwgTiwgbWF5YmUgaXQgd291bGQgd29yayBpZiB5b3UgdXNlIHRoZSBQQUwgTSBzZXR0aW5ncy4gCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9LYnVpbGQgYi9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMDM5MQotLS0gL2Rldi9udWxsCisrKyBiL0tidWlsZApAQCAtMCwwICsxLDQ5IEBACisjCisjIEtidWlsZCBmb3IgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsCisjIFRoaXMgZmlsZSB0YWtlcyBjYXJlIG9mIHRoZSBmb2xsb3dpbmc6CisjIDEpIEdlbmVyYXRlIGFzbS1vZmZzZXRzLmgKKworIyMjIyMKKyMgMSkgR2VuZXJhdGUgYXNtLW9mZnNldHMuaAorIworCitvZmZzZXRzLWZpbGUgOj0gaW5jbHVkZS9hc20tJChBUkNIKS9hc20tb2Zmc2V0cy5oCisKK2Fsd2F5cyAgOj0gJChvZmZzZXRzLWZpbGUpCit0YXJnZXRzIDo9ICQob2Zmc2V0cy1maWxlKQordGFyZ2V0cyArPSBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKKworIyBEZWZhdWx0IHNlZCByZWdleHAgLSBtdWx0aWxpbmUgZHVlIHRvIHN5bnRheCBjb25zdHJhaW50cworZGVmaW5lIHNlZC15CisJIi9eLT4ve3M6Xi0+XChbXiBdKlwpIFtcJCQjXSpcKFteIF0qXCkgXCguKlwpOiNkZWZpbmUgXDEgXDIgLyogXDMgKi86OyBzOi0+Ojo7IHA7fSIKK2VuZGVmCisjIE92ZXJyaWRlIGRlZmF1bHQgcmVnZXhwIGZvciBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzCitzZWQtJChDT05GSUdfTUlQUykgOj0gIi9eQEBAL3MvLy9wIgorCitxdWlldF9jbWRfb2Zmc2V0cyA9IEdFTiAgICAgJEAKK2RlZmluZSBjbWRfb2Zmc2V0cworCW1rZGlyIC1wICQoZGlyICRAKTsgXAorCWNhdCAkPCB8IFwKKwkoc2V0IC1lOyBcCisJIGVjaG8gIiNpZm5kZWYgX19BU01fT0ZGU0VUU19IX18iOyBcCisJIGVjaG8gIiNkZWZpbmUgX19BU01fT0ZGU0VUU19IX18iOyBcCisJIGVjaG8gIi8qIjsgXAorCSBlY2hvICIgKiBETyBOT1QgTU9ESUZZLiI7IFwKKwkgZWNobyAiICoiOyBcCisJIGVjaG8gIiAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICQoc3JjdHJlZSkvS2J1aWxkIjsgXAorCSBlY2hvICIgKiI7IFwKKwkgZWNobyAiICovIjsgXAorCSBlY2hvICIiOyBcCisJIHNlZCAtbmUgJChzZWQteSk7IFwKKwkgZWNobyAiIjsgXAorCSBlY2hvICIjZW5kaWYiICkgPiAkQAorZW5kZWYKKworIyBXZSB1c2UgaW50ZXJuYWwga2J1aWxkIHJ1bGVzIHRvIGF2b2lkIHRoZSAiaXMgdXAgdG8gZGF0ZSIgbWVzc2FnZSBmcm9tIG1ha2UKK2FyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuczogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5jIEZPUkNFCisJJChRKW1rZGlyIC1wICQoZGlyICRAKQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19zX2MpCisKKyQob2JqKS8kKG9mZnNldHMtZmlsZSk6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucyBLYnVpbGQKKwkkKGNhbGwgY21kLG9mZnNldHMpCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggN2UxZjY3MS4uZjAzOGRjYSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTExNiw2ICsxMTYsMTIgQEAKIEw6CWxpbnV4LWhhbXNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK1lFQUxJTksgUEhPTkUgRFJJVkVSCitQOglIZW5rIFZlcmdvbmV0CitNOglIZW5rLlZlcmdvbmV0QGdtYWlsLmNvbQorTDoJdXNiYjJrLWFwaS1kZXZAbm9uZ251Lm9yZworUzoJTWFpbnRhaW5lZAorCiA4MTM5Q1AgMTAvMTAwIEZBU1QgRVRIRVJORVQgRFJJVkVSCiBQOglKZWZmIEdhcnppawogTToJamdhcnppa0Bwb2JveC5jb20KQEAgLTIwMiwxMyArMjA4LDYgQEAKIE06CWNvbGluQGNvbGluby5uZXQKIFM6CU1haW50YWluZWQKIAotQURWQU5TWVMgU0NTSSBEUklWRVIKLVA6CUJvYiBGcmV5Ci1NOglsaW51eEBhZHZhbnN5cy5jb20KLVc6CWh0dHA6Ly93d3cuYWR2YW5zeXMuY29tL2xpbnV4Lmh0bWwKLUw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIEFFRFNQMTYgRFJJVkVSCiBQOglSaWNjYXJkbyBGYWNjaGV0dGkKIE06CWZpemJhbkB0aW4uaXQKQEAgLTYyNyw2ICs2MjYsMTIgQEAKIFc6CWh0dHA6Ly93d3cuYXJtLmxpbnV4Lm9yZy51ay8KIFM6CU1haW50YWluZWQKIAorQ1lCTEFGQiBGUkFNRUJVRkZFUiBEUklWRVIKK1A6CUtudXQgUGV0ZXJzZW4KK006CUtudXRfUGV0ZXJzZW5AdC1vbmxpbmUuZGUKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzoJTWFpbnRhaW5lZAorCiBDWUNMQURFUyAyWCBTWU5DIENBUkQgRFJJVkVSCiBQOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KIE06CWFjbWVAY29uZWN0aXZhLmNvbS5icgpAQCAtNjk2LDYgKzcwMSwxMSBAQAogVzoJaHR0cDovL3d3dy5kZWJpYW4ub3JnL35kei9pOGsvCiBTOglNYWludGFpbmVkCiAKK0RFTEwgU1lTVEVNUyBNQU5BR0VNRU5UIEJBU0UgRFJJVkVSIChkY2RiYXMpCitQOglEb3VnIFdhcnplY2hhCitNOglEb3VnbGFzX1dhcnplY2hhQGRlbGwuY29tCitTOglNYWludGFpbmVkCisKIERFVklDRS1NQVBQRVIKIFA6CUFsYXNkYWlyIEtlcmdvbgogTDoJZG0tZGV2ZWxAcmVkaGF0LmNvbQpAQCAtODI0LDYgKzgzNCwxMyBAQAogVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lbXUxMGsxLwogUzoJTWFpbnRhaW5lZAogCitFTVVMRVggTFBGQyBGQyBTQ1NJIERSSVZFUgorUDogICAgICBKYW1lcyBTbWFydAorTTogICAgICBqYW1lcy5zbWFydEBlbXVsZXguY29tCitMOiAgICAgIGxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOiAgICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbHBmY3h4eHgKK1M6ICAgICAgU3VwcG9ydGVkCisKIEVQU09OIDEzNTUgRlJBTUVCVUZGRVIgRFJJVkVSCiBQOglDaHJpc3RvcGhlciBIb292ZXIKIE06CWNoQG11cmdhdHJvaWQuY29tLCBjaEBocGwuaHAuY29tCkBAIC04NzksNyArODk2LDcgQEAKIAogRklMRVNZU1RFTVMgKFZGUyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCiBQOglBbGV4YW5kZXIgVmlybwotTToJdmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsKK006CXZpcm9AemVuaXYubGludXgub3JnLnVrCiBTOglNYWludGFpbmVkCiAKIEZJUk1XQVJFIExPQURFUiAocmVxdWVzdF9maXJtd2FyZSkKQEAgLTkxNCw2ICs5MzEsMTMgQEAKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZnRhcGUKIFM6CU9ycGhhbgogCitGVVNFOiBGSUxFU1lTVEVNIElOIFVTRVJTUEFDRQorUDoJTWlrbG9zIFN6ZXJlZGkKK006CW1pa2xvc0BzemVyZWRpLmh1CitMOglmdXNlLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL2Z1c2Uuc291cmNlZm9yZ2UubmV0LworUzoJTWFpbnRhaW5lZAorCiBGVVRVUkUgRE9NQUlOIFRNQy0xNngwIFNDU0kgRFJJVkVSICgxNi1iaXQpCiBQOglSaWsgRmFpdGgKIE06CWZhaXRoQGNzLnVuYy5lZHUKQEAgLTE4MDgsMTMgKzE4MzIsNiBAQAogTDoJbGludXgtYWJpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogCi1QQ0kgSUQgREFUQUJBU0UKLVA6CU1hcnRpbiBNYXJlcwotTToJbWpAdWN3LmN6Ci1MOglwY2lpZHMtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOglodHRwOi8vcGNpaWRzLnNvdXJjZWZvcmdlLm5ldC8KLVM6CU1haW50YWluZWQKLQogUENJIFNPVU5EIERSSVZFUlMgKEVTMTM3MCwgRVMxMzcxIGFuZCBTT05JQ1ZJQkVTKQogUDoJVGhvbWFzIFNhaWxlcgogTToJc2FpbGVyQGlmZS5lZS5ldGh6LmNoCkBAIC0xOTY3LDcgKzE5ODQsNiBAQAogCiBST0NLRVRQT1JUIERSSVZFUgogUDoJQ29tdHJvbCBDb3JwLgotTToJc3VwcG9ydEBjb210cm9sLmNvbQogVzoJaHR0cDovL3d3dy5jb210cm9sLmNvbQogUzoJTWFpbnRhaW5lZAogCkBAIC0yNjgxLDYgKzI2OTcsMTcgQEAKIFc6CWh0dHA6Ly9yaW81MDAuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKK1Y5RlMgRklMRSBTWVNURU0KK1A6ICAgICAgRXJpYyBWYW4gSGVuc2JlcmdlbgorTTogICAgICBlcmljdmhAZ21haWwuY29tCitQOiAgICAgIFJvbiBNaW5uaWNoCitNOiAgICAgIHJtaW5uaWNoQGxhbmwuZ292CitQOiAgICAgIExhdGNoZXNhciBJb25rb3YKK006ICAgICAgbHVjaG9AaW9ua292Lm5ldAorTDogICAgICB2OWZzLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6ICAgICAgaHR0cDovL3Y5ZnMuc2YubmV0CitTOiAgICAgIE1haW50YWluZWQKKwogVklERU8gRk9SIExJTlVYCiBQOglNYXVybyBDYXJ2YWxobyBDaGVoYWIKIE06CW1jaGVoYWJAYnJ0dXJiby5jb20uYnIKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNjNlNWM5Zi4uMzgyMjk4ZiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTMzNCw3ICszMzQsNyBAQAogUEVSTAkJPSBwZXJsCiBDSEVDSwkJPSBzcGFyc2UKIAotQ0hFQ0tGTEFHUyAgICAgOj0gLURfX2xpbnV4X18gLURsaW51eCAtRF9fU1REQ19fIC1EdW5peCAtRF9fdW5peF9fCitDSEVDS0ZMQUdTICAgICA6PSAtRF9fbGludXhfXyAtRGxpbnV4IC1EX19TVERDX18gLUR1bml4IC1EX191bml4X18gJChDRikKIE1PREZMQUdTCT0gLURNT0RVTEUKIENGTEFHU19NT0RVTEUgICA9ICQoTU9ERkxBR1MpCiBBRkxBR1NfTU9EVUxFICAgPSAkKE1PREZMQUdTKQpAQCAtMzgyLDYgKzM4Miw5IEBACiBzY3JpcHRzX2Jhc2ljOgogCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMvYmFzaWMKIAorIyBUbyBhdm9pZCBhbnkgaW1wbGljaXQgcnVsZSB0byBraWNrIGluLCBkZWZpbmUgYW4gZW1wdHkgY29tbWFuZC4KK3NjcmlwdHMvYmFzaWMvJTogc2NyaXB0c19iYXNpYyA7CisKIC5QSE9OWTogb3V0cHV0bWFrZWZpbGUKICMgb3V0cHV0bWFrZWZpbGUgZ2VuZXJhdGUgYSBNYWtlZmlsZSB0byBiZSBwbGFjZWQgaW4gb3V0cHV0IGRpcmVjdG9yeSwgaWYKICMgdXNpbmcgYSBzZXBlcmF0ZSBvdXRwdXQgZGlyZWN0b3J5LiBUaGlzIGFsbG93cyBjb252aW5pZW50IHVzZQpAQCAtNDQ0LDkgKzQ0Nyw4IEBACiBpbmNsdWRlICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL01ha2VmaWxlCiBleHBvcnQgS0JVSUxEX0RFRkNPTkZJRwogCi1jb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKLSVjb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgRk9SQ0UKK2NvbmZpZyAlY29uZmlnOiBzY3JpcHRzX2Jhc2ljIG91dHB1dG1ha2VmaWxlIEZPUkNFCisJJChRKW1rZGlyIC1wIGluY2x1ZGUvbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKIAogZWxzZQpAQCAtNjQxLDggKzY0MywxMyBAQAogIyBHZW5lcmF0ZSBuZXcgdm1saW51eCB2ZXJzaW9uCiBxdWlldF9jbWRfdm1saW51eF92ZXJzaW9uID0gR0VOICAgICAudmVyc2lvbgogICAgICAgY21kX3ZtbGludXhfdmVyc2lvbiA9IHNldCAtZTsgICAgICAgICAgICAgICAgICAgICBcCi0JLiAkKHNyY3RyZWUpL3NjcmlwdHMvbWt2ZXJzaW9uID4gLnRtcF92ZXJzaW9uOwlcCi0JbXYgLWYgLnRtcF92ZXJzaW9uIC52ZXJzaW9uOwkJCVwKKwlpZiBbICEgLXIgLnZlcnNpb24gXTsgdGhlbgkJCVwKKwkgIHJtIC1mIC52ZXJzaW9uOwkJCQlcCisJICBlY2hvIDEgPi52ZXJzaW9uOwkJCQlcCisJZWxzZQkJCQkJCVwKKwkgIG12IC52ZXJzaW9uIC5vbGRfdmVyc2lvbjsJCQlcCisJICBleHByIDAkJChjYXQgLm9sZF92ZXJzaW9uKSArIDEgPi52ZXJzaW9uOwlcCisJZmk7CQkJCQkJXAogCSQoTUFLRSkgJChidWlsZCk9aW5pdAogCiAjIEdlbmVyYXRlIFN5c3RlbS5tYXAKQEAgLTc1Niw2ICs3NjMsNyBAQAogIyB2bWxpbnV4IGltYWdlIC0gaW5jbHVkaW5nIHVwZGF0ZWQga2VybmVsIHN5bWJvbHMKIHZtbGludXg6ICQodm1saW51eC1sZHMpICQodm1saW51eC1pbml0KSAkKHZtbGludXgtbWFpbikgJChrYWxsc3ltcy5vKSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsdm1saW51eF9fKQorCSQoUSlybSAtZiAub2xkX3ZlcnNpb24KIAogIyBUaGUgYWN0dWFsIG9iamVjdHMgYXJlIGdlbmVyYXRlZCB3aGVuIGRlc2NlbmRpbmcsIAogIyBtYWtlIHN1cmUgbm8gaW1wbGljaXQgcnVsZSBraWNrcyBpbgpAQCAtNzc2LDE0ICs3ODQsMTQgQEAKICMgQSBtdWx0aSBsZXZlbCBhcHByb2FjaCBpcyB1c2VkLiBwcmVwYXJlMSBpcyB1cGRhdGVkIGZpcnN0LCB0aGVuIHByZXBhcmUwLgogIyBwcmVwYXJlLWFsbCBpcyB0aGUgY29sbGVjdGlvbiBwb2ludCBmb3IgdGhlIHByZXBhcmUgdGFyZ2V0cy4KIAotLlBIT05ZOiBwcmVwYXJlLWFsbCBwcmVwYXJlIHByZXBhcmUwIHByZXBhcmUxIHByZXBhcmUyCisuUEhPTlk6IHByZXBhcmUtYWxsIHByZXBhcmUgcHJlcGFyZTAgcHJlcGFyZTEgcHJlcGFyZTIgcHJlcGFyZTMKIAotIyBwcmVwYXJlMiBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIGFyZSBidWlsZGluZyBpbiBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnksCisjIHByZXBhcmUzIGlzIHVzZWQgdG8gY2hlY2sgaWYgd2UgYXJlIGJ1aWxkaW5nIGluIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeSwKICMgYW5kIGlmIHNvIGRvOgogIyAxKSBDaGVjayB0aGF0IG1ha2UgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIGluIHRoZSBrZXJuZWwgc3JjICQoc3JjdHJlZSkKICMgMikgQ3JlYXRlIHRoZSBpbmNsdWRlMiBkaXJlY3RvcnksIHVzZWQgZm9yIHRoZSBzZWNvbmQgYXNtIHN5bWxpbmsKIAotcHJlcGFyZTI6CitwcmVwYXJlMzoKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKIAlAZWNobyAnICBVc2luZyAkKHNyY3RyZWUpIGFzIHNvdXJjZSBmb3Iga2VybmVsJwogCSQoUSlpZiBbIC1mICQoc3JjdHJlZSkvLmNvbmZpZyBdOyB0aGVuIFwKQEAgLTc5NSwxOCArODAzLDIxIEBACiAJJChRKWxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpIGluY2x1ZGUyL2FzbQogZW5kaWYKIAotIyBwcmVwYXJlMSBjcmVhdGVzIGEgbWFrZWZpbGUgaWYgdXNpbmcgYSBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5Ci1wcmVwYXJlMTogcHJlcGFyZTIgb3V0cHV0bWFrZWZpbGUKKyMgcHJlcGFyZTIgY3JlYXRlcyBhIG1ha2VmaWxlIGlmIHVzaW5nIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeQorcHJlcGFyZTI6IHByZXBhcmUzIG91dHB1dG1ha2VmaWxlCiAKLXByZXBhcmUwOiBwcmVwYXJlMSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBpbmNsdWRlL2FzbSBcCitwcmVwYXJlMTogcHJlcGFyZTIgaW5jbHVkZS9saW51eC92ZXJzaW9uLmggaW5jbHVkZS9hc20gXAogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUvY29uZmlnL01BUktFUgogaWZuZXEgKCQoS0JVSUxEX01PRFVMRVMpLCkKIAkkKFEpcm0gLXJmICQoTU9EVkVSRElSKQogCSQoUSlta2RpciAtcCAkKE1PRFZFUkRJUikKIGVuZGlmCiAKK3ByZXBhcmUwOiBwcmVwYXJlIHByZXBhcmUxIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9LgorCiAjIEFsbCB0aGUgcHJlcGFyaW5nLi4KLXByZXBhcmUtYWxsOiBwcmVwYXJlMCBwcmVwYXJlCitwcmVwYXJlLWFsbDogcHJlcGFyZTAKIAogIwlMZWF2ZSB0aGlzIGFzIGRlZmF1bHQgZm9yIHByZXByb2Nlc3Npbmcgdm1saW51eC5sZHMuUywgd2hpY2ggaXMgbm93CiAjCWRvbmUgaW4gYXJjaC8kKEFSQ0gpL2tlcm5lbC9NYWtlZmlsZQpAQCAtODQ1LDcgKzg1Niw3IEBACiAKICMgCVNwbGl0IGF1dG9jb25mLmggaW50byBpbmNsdWRlL2xpbnV4L2NvbmZpZy8qCiAKLWluY2x1ZGUvY29uZmlnL01BUktFUjogaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCitpbmNsdWRlL2NvbmZpZy9NQVJLRVI6IHNjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZSBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgKIAlAZWNobyAnICBTUExJVCAgIGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaCAtPiBpbmNsdWRlL2NvbmZpZy8qJwogCUBzY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUgaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIGluY2x1ZGUvY29uZmlnCiAJQHRvdWNoICRACkBAIC05NDksMjYgKzk2MCw2IEBACiAKIGVuZGlmICMgQ09ORklHX01PRFVMRVMKIAotIyBHZW5lcmF0ZSBhc20tb2Zmc2V0cy5oIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZGVmaW5lIGZpbGVjaGtfZ2VuLWFzbS1vZmZzZXRzCi0JKHNldCAtZTsgXAotCSBlY2hvICIjaWZuZGVmIF9fQVNNX09GRlNFVFNfSF9fIjsgXAotCSBlY2hvICIjZGVmaW5lIF9fQVNNX09GRlNFVFNfSF9fIjsgXAotCSBlY2hvICIvKiI7IFwKLQkgZWNobyAiICogRE8gTk9UIE1PRElGWS4iOyBcCi0JIGVjaG8gIiAqIjsgXAotCSBlY2hvICIgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhcmNoLyQoQVJDSCkvTWFrZWZpbGUiOyBcCi0JIGVjaG8gIiAqIjsgXAotCSBlY2hvICIgKi8iOyBcCi0JIGVjaG8gIiI7IFwKLQkgc2VkIC1uZSAiL14tPi97czpeLT5cKFteIF0qXCkgW1wkJCNdKlwoW14gXSpcKSBcKC4qXCk6I2RlZmluZSBcMSBcMiAvKiBcMyAqLzo7IHM6LT46OjsgcDt9IjsgXAotCSBlY2hvICIiOyBcCi0JIGVjaG8gIiNlbmRpZiIgKQotZW5kZWYKLQotCiAjIyMKICMgQ2xlYW5pbmcgaXMgZG9uZSBvbiB0aHJlZSBsZXZlbHMuCiAjIG1ha2UgY2xlYW4gICAgIERlbGV0ZSBtb3N0IGdlbmVyYXRlZCBmaWxlcwpAQCAtOTkxLDcgKzk4Miw3IEBACiAjCiBjbGVhbjogcm0tZGlycyAgOj0gJChDTEVBTl9ESVJTKQogY2xlYW46IHJtLWZpbGVzIDo9ICQoQ0xFQU5fRklMRVMpCi1jbGVhbi1kaXJzICAgICAgOj0gJChhZGRwcmVmaXggX2NsZWFuXywkKHZtbGludXgtYWxsZGlycykpCitjbGVhbi1kaXJzICAgICAgOj0gJChhZGRwcmVmaXggX2NsZWFuXywkKHNyY3RyZWUpICQodm1saW51eC1hbGxkaXJzKSkKIAogLlBIT05ZOiAkKGNsZWFuLWRpcnMpIGNsZWFuIGFyY2hjbGVhbgogJChjbGVhbi1kaXJzKToKQEAgLTEwNzAsNiArMTA2MSw3IEBACiAJQGVjaG8gICcgIHJwbQkJICAtIEJ1aWxkIGEga2VybmVsIGFzIGFuIFJQTSBwYWNrYWdlJwogCUBlY2hvICAnICB0YWdzL1RBR1MJICAtIEdlbmVyYXRlIHRhZ3MgZmlsZSBmb3IgZWRpdG9ycycKIAlAZWNobyAgJyAgY3Njb3BlCSAgLSBHZW5lcmF0ZSBjc2NvcGUgaW5kZXgnCisJQGVjaG8gICcgIGtlcm5lbHJlbGVhc2UJICAtIE91dHB1dCB0aGUgcmVsZWFzZSB2ZXJzaW9uIHN0cmluZycKIAlAZWNobyAgJycKIAlAZWNobyAgJ1N0YXRpYyBhbmFseXNlcnMnCiAJQGVjaG8gICcgIGJ1aWxkY2hlY2sgICAgICAtIExpc3QgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byB2bWxpbnV4IGRpc2NhcmRlZCBzZWN0aW9ucycKZGlmZiAtLWdpdCBhL1JFUE9SVElORy1CVUdTIGIvUkVQT1JUSU5HLUJVR1MKaW5kZXggMjI0YzM0Ny4uZjlkYTgyNyAxMDA2NDQKLS0tIGEvUkVQT1JUSU5HLUJVR1MKKysrIGIvUkVQT1JUSU5HLUJVR1MKQEAgLTksNyArOSw3IEBACiBidWcgcmVwb3J0LiBUaGlzIGV4cGxhaW5zIHdoYXQgeW91IHNob3VsZCBkbyB3aXRoIHRoZSAiT29wcyIgaW5mb3JtYXRpb24KIHRvIG1ha2UgaXQgdXNlZnVsIHRvIHRoZSByZWNpcGllbnQuCiAKLSAgICAgIFNlbmQgdGhlIG91dHB1dCB0aGUgbWFpbnRhaW5lciBvZiB0aGUga2VybmVsIGFyZWEgdGhhdCBzZWVtcyB0bworICAgICAgU2VuZCB0aGUgb3V0cHV0IHRvIHRoZSBtYWludGFpbmVyIG9mIHRoZSBrZXJuZWwgYXJlYSB0aGF0IHNlZW1zIHRvCiBiZSBpbnZvbHZlZCB3aXRoIHRoZSBwcm9ibGVtLiBEb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBnZXR0aW5nIHRoZQogd3JvbmcgcGVyc29uLiBJZiB5b3UgYXJlIHVuc3VyZSBzZW5kIGl0IHRvIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoZQogY29kZSByZWxldmFudCB0byB3aGF0IHlvdSB3ZXJlIGRvaW5nLiBJZiBpdCBvY2N1cnMgcmVwZWF0YWJseSB0cnkgYW5kCkBAIC0xOCwxNSArMTgsMTUgQEAKIAogICAgICAgSWYgaXQgaXMgYSBzZWN1cml0eSBidWcsIHBsZWFzZSBjb3B5IHRoZSBTZWN1cml0eSBDb250YWN0IGxpc3RlZAogaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUuICBUaGV5IGNhbiBoZWxwIGNvb3JkaW5hdGUgYnVnZml4IGFuZCBkaXNjbG9zdXJlLgotU2VlIERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzIGZvciBtb3JlIGluZm9tYXRpb24uCitTZWUgRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKICAgICAgIElmIHlvdSBhcmUgdG90YWxseSBzdHVtcGVkIGFzIHRvIHdob20gdG8gc2VuZCB0aGUgcmVwb3J0LCBzZW5kIGl0IHRvCiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnLiAoRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpbnV4LWtlcm5lbAogbWFpbGluZyBsaXN0IHNlZSBodHRwOi8vd3d3LnR1eC5vcmcvbGttbC8pLgogCi1UaGlzIGlzIGEgc3VnZ2VzdGVkIGZvcm1hdCBmb3IgYSBidWcgcmVwb3J0IHNlbnQgdG8gdGhlIExpbnV4IGtlcm5lbCBtYWlsaW5nIAotbGlzdC4gSGF2aW5nIGEgc3RhbmRhcmRpemVkIGJ1ZyByZXBvcnQgZm9ybSBtYWtlcyBpdCBlYXNpZXIgIGZvciB5b3Ugbm90IHRvIAotb3Zlcmxvb2sgdGhpbmdzLCBhbmQgZWFzaWVyIGZvciB0aGUgZGV2ZWxvcGVycyB0byBmaW5kIHRoZSBwaWVjZXMgb2YgCitUaGlzIGlzIGEgc3VnZ2VzdGVkIGZvcm1hdCBmb3IgYSBidWcgcmVwb3J0IHNlbnQgdG8gdGhlIExpbnV4IGtlcm5lbCBtYWlsaW5nCitsaXN0LiBIYXZpbmcgYSBzdGFuZGFyZGl6ZWQgYnVnIHJlcG9ydCBmb3JtIG1ha2VzIGl0IGVhc2llciBmb3IgeW91IG5vdCB0bworb3Zlcmxvb2sgdGhpbmdzLCBhbmQgZWFzaWVyIGZvciB0aGUgZGV2ZWxvcGVycyB0byBmaW5kIHRoZSBwaWVjZXMgb2YKIGluZm9ybWF0aW9uIHRoZXkncmUgcmVhbGx5IGludGVyZXN0ZWQgaW4uIERvbid0IGZlZWwgeW91IGhhdmUgdG8gZm9sbG93IGl0LgogCiAgICAgICBGaXJzdCBydW4gdGhlIHZlcl9saW51eCBzY3JpcHQgaW5jbHVkZWQgYXMgc2NyaXB0cy92ZXJfbGludXgsIHdoaWNoCkBAIC0zNSw5ICszNSw5IEBACiAKIFVzZSB0aGF0IGluZm9ybWF0aW9uIHRvIGZpbGwgaW4gYWxsIGZpZWxkcyBvZiB0aGUgYnVnIHJlcG9ydCBmb3JtLCBhbmQKIHBvc3QgaXQgdG8gdGhlIG1haWxpbmcgbGlzdCB3aXRoIGEgc3ViamVjdCBvZiAiUFJPQkxFTTogPG9uZSBsaW5lCi1zdW1tYXJ5IGZyb20gWzEuXT4iIGZvciBlYXN5IGlkZW50aWZpY2F0aW9uIGJ5IHRoZSBkZXZlbG9wZXJzICAgIAorc3VtbWFyeSBmcm9tIFsxLl0+IiBmb3IgZWFzeSBpZGVudGlmaWNhdGlvbiBieSB0aGUgZGV2ZWxvcGVycy4KIAotWzEuXSBPbmUgbGluZSBzdW1tYXJ5IG9mIHRoZSBwcm9ibGVtOiAgICAKK1sxLl0gT25lIGxpbmUgc3VtbWFyeSBvZiB0aGUgcHJvYmxlbToKIFsyLl0gRnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS9yZXBvcnQ6CiBbMy5dIEtleXdvcmRzIChpLmUuLCBtb2R1bGVzLCBuZXR3b3JraW5nLCBrZXJuZWwpOgogWzQuXSBLZXJuZWwgdmVyc2lvbiAoZnJvbSAvcHJvYy92ZXJzaW9uKToKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCAxODlkNWVhLi43ODY0OTFmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC00NzksNiArNDc5LDkgQEAKIAlkZXBlbmRzIG9uIEFMUEhBX0dFTkVSSUMgfHwgQUxQSEFfSkVOU0VOIHx8IEFMUEhBX0FMQ09SIHx8IEFMUEhBX01JS0FTQSB8fCBBTFBIQV9TQUJMRSB8fCBBTFBIQV9MWU5YIHx8IEFMUEhBX05PUklUQUtFIHx8IEFMUEhBX1JBV0hJREUKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJZGVmX2Jvb2wgeQorCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFMUEhBX1NBQkxFIHx8IEFMUEhBX0xZTlggfHwgQUxQSEFfUkFXSElERSB8fCBBTFBIQV9EUDI2NCB8fCBBTFBIQV9XSUxERklSRSB8fCBBTFBIQV9USVRBTiB8fCBBTFBIQV9HRU5FUklDIHx8IEFMUEhBX1NIQVJLIHx8IEFMUEhBX01BUlZFTApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9NYWtlZmlsZSBiL2FyY2gvYWxwaGEvTWFrZWZpbGUKaW5kZXggMjJlYmZiMi4uMWI3MDRlZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9NYWtlZmlsZQorKysgYi9hcmNoL2FscGhhL01ha2VmaWxlCkBAIC0xMDgsMjAgKzEwOCw5IEBACiBib290aW1hZ2UgYm9vdHBmaWxlIGJvb3RwemZpbGU6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAotCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLQogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gJyogYm9vdAkJLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC9hbHBoYS9ib290L3ZtbGludXguZ3opJwogICBlY2hvICcgIGJvb3RpbWFnZQktIFNSTSBib290YWJsZSBpbWFnZSAoYXJjaC9hbHBoYS9ib290L2Jvb3RpbWFnZSknCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvYWxwaGFfa3N5bXMuYwppbmRleCBmYzVlZjkwLi4yNGFlOWEzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMKQEAgLTE4NSwxNSArMTg1LDYgQEAKIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUpOwogRVhQT1JUX1NZTUJPTChfYXRvbWljX2RlY19hbmRfbG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi1FWFBPUlRfU1lNQk9MKF9yYXdfc3Bpbl91bmxvY2spOwotRVhQT1JUX1NZTUJPTChkZWJ1Z19zcGluX2xvY2spOwotRVhQT1JUX1NZTUJPTChkZWJ1Z19zcGluX3RyeWxvY2spOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JXTE9DSwotRVhQT1JUX1NZTUJPTChfcmF3X3dyaXRlX2xvY2spOwotRVhQT1JUX1NZTUJPTChfcmF3X3JlYWRfbG9jayk7Ci0jZW5kaWYKIEVYUE9SVF9TWU1CT0woY3B1X3ByZXNlbnRfbWFzayk7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9hbHBoYS9rZXJuZWwvZW50cnkuUwppbmRleCBmMDkyN2VlLi43NmNjMGNiIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2VudHJ5LlMKQEAgLTUsNyArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWwuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2hlYWQuUyBiL2FyY2gvYWxwaGEva2VybmVsL2hlYWQuUwppbmRleCA0Y2EyZTQwLi4wOTA1NzIxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvaGVhZC5TCkBAIC05LDcgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAuZ2xvYmwgc3dhcHBlcl9wZ19kaXIKIC5nbG9ibCBfc3RleHQKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL21vZHVsZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZmMyNzFlMy4uYWFjNmQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogc3RydWN0IGdvdF9lbnRyeSB7CiAJc3RydWN0IGdvdF9lbnRyeSAqbmV4dDsKLQlFbGY2NF9BZGRyIHJfb2Zmc2V0OworCUVsZjY0X1N4d29yZCByX2FkZGVuZDsKIAlpbnQgZ290X29mZnNldDsKIH07CiAKQEAgLTU3LDE0ICs1NywxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgcl9zeW0gPSBFTEY2NF9SX1NZTSAocmVsYS0+cl9pbmZvKTsKIAl1bnNpZ25lZCBsb25nIHJfdHlwZSA9IEVMRjY0X1JfVFlQRSAocmVsYS0+cl9pbmZvKTsKLQlFbGY2NF9BZGRyIHJfb2Zmc2V0ID0gcmVsYS0+cl9vZmZzZXQ7CisJRWxmNjRfU3h3b3JkIHJfYWRkZW5kID0gcmVsYS0+cl9hZGRlbmQ7CiAJc3RydWN0IGdvdF9lbnRyeSAqZzsKIAogCWlmIChyX3R5cGUgIT0gUl9BTFBIQV9MSVRFUkFMKQogCQlyZXR1cm47CiAKIAlmb3IgKGcgPSBjaGFpbnMgKyByX3N5bTsgZyA7IGcgPSBnLT5uZXh0KQotCQlpZiAoZy0+cl9vZmZzZXQgPT0gcl9vZmZzZXQpIHsKKwkJaWYgKGctPnJfYWRkZW5kID09IHJfYWRkZW5kKSB7CiAJCQlpZiAoZy0+Z290X29mZnNldCA9PSAwKSB7CiAJCQkJZy0+Z290X29mZnNldCA9ICpwb2Zmc2V0OwogCQkJCSpwb2Zmc2V0ICs9IDg7CkBAIC03NCw3ICs3NCw3IEBACiAKIAlnID0ga21hbGxvYyAoc2l6ZW9mICgqZyksIEdGUF9LRVJORUwpOwogCWctPm5leHQgPSBjaGFpbnNbcl9zeW1dLm5leHQ7Ci0JZy0+cl9vZmZzZXQgPSByX29mZnNldDsKKwlnLT5yX2FkZGVuZCA9IHJfYWRkZW5kOwogCWctPmdvdF9vZmZzZXQgPSAqcG9mZnNldDsKIAkqcG9mZnNldCArPSA4OwogCWNoYWluc1tyX3N5bV0ubmV4dCA9IGc7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKaW5kZXggMTY3ZmQ4OWYuLjA2MzYxMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKQEAgLTk3NCw2ICs5NzQsNyBAQAogCXNpemVfdCBzaXplOwogCWxvbmcgdGltZW91dDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCWlmICh0dnApIHsKQEAgLTk5NSw3ICs5OTYsOCBAQAogCQl9CiAJfQogCi0JaWYgKG4gPCAwIHx8IG4gPiBjdXJyZW50LT5maWxlcy0+bWF4X2Zkc2V0KQorCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCWlmIChuIDwgMCB8fCBuID4gZmR0LT5tYXhfZmRzZXQpCiAJCWdvdG8gb3V0X25vZmRzOwogCiAJLyoKQEAgLTExNTIsOCArMTE1NCw3IEBACiAKIAl0aWNrcyA9IHRpbWV2YWxfdG9famlmZmllcygmdG1wKTsKIAotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXRpY2tzID0gc2NoZWR1bGVfdGltZW91dCh0aWNrcyk7CisJdGlja3MgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGlja3MpOwogCiAJaWYgKHJlbWFpbikgewogCQlqaWZmaWVzX3RvX3RpbWV2YWwodGlja3MsICZ0bXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwppbmRleCBlMjExYWE3Li5kYTBiZTM0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwpAQCAtOTg5LDE3NSArOTg5LDMgQEAKIAogCXByZWVtcHRfZW5hYmxlKCk7CiB9Ci0MCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi12b2lkCi1fcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKQotewotCW1iKCk7Ci0JbG9jay0+bG9jayA9IDA7Ci0KLQlsb2NrLT5vbl9jcHUgPSAtMTsKLQlsb2NrLT5wcmV2aW91cyA9IE5VTEw7Ci0JbG9jay0+dGFzayA9IE5VTEw7Ci0JbG9jay0+YmFzZV9maWxlID0gIm5vbmUiOwotCWxvY2stPmxpbmVfbm8gPSAwOwotfQotCi12b2lkCi1kZWJ1Z19zcGluX2xvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pCi17Ci0JbG9uZyB0bXA7Ci0JbG9uZyBzdHVjazsKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0JdW5zaWduZWQgbG9uZyBzdGFydGVkID0gamlmZmllczsKLQlpbnQgcHJpbnRlZCA9IDA7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCXN0dWNrID0gMUwgPDwgMzA7Ci0gdHJ5X2FnYWluOgotCi0JLyogVXNlIHN1Yi1zZWN0aW9ucyB0byBwdXQgdGhlIGFjdHVhbCBsb29wIGF0IHRoZSBlbmQKLQkgICBvZiB0aGlzIG9iamVjdCBmaWxlJ3MgdGV4dCBzZWN0aW9uIHNvIGFzIHRvIHBlcmZlY3QKLQkgICBicmFuY2ggcHJlZGljdGlvbi4gICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIjE6CWxkbF9sCSUwLCUxXG4iCi0JIglzdWJxCSUyLDEsJTJcbiIKLQkiCWJsYnMJJTAsMmZcbiIKLQkiCW9yCSUwLDEsJTBcbiIKLQkiCXN0bF9jCSUwLCUxXG4iCi0JIgliZXEJJTAsM2ZcbiIKLQkiNDoJbWJcbiIKLQkiLnN1YnNlY3Rpb24gMlxuIgotCSIyOglsZGwJJTAsJTFcbiIKLQkiCXN1YnEJJTIsMSwlMlxuIgotCSIzOglibHQJJTIsNGJcbiIKLQkiCWJsYnMJJTAsMmJcbiIKLQkiCWJyCTFiXG4iCi0JIi5wcmV2aW91cyIKLQk6ICI9ciIgKHRtcCksICI9bSIgKGxvY2stPmxvY2spLCAiPXIiIChzdHVjaykKLQk6ICJtIiAobG9jay0+bG9jayksICIyIiAoc3R1Y2spIDogIm1lbW9yeSIpOwotCi0JaWYgKHN0dWNrIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiJXM6JWQgc3BpbmxvY2sgc3R1Y2sgaW4gJXMgYXQgJXAoJWQpIgotCQkgICAgICAgIiBvd25lciAlcyBhdCAlcCglZCkgJXM6JWRcbiIsCi0JCSAgICAgICBiYXNlX2ZpbGUsIGxpbmVfbm8sCi0JCSAgICAgICBjdXJyZW50LT5jb21tLCBpbmxpbmVfcGMsIGNwdSwKLQkJICAgICAgIGxvY2stPnRhc2stPmNvbW0sIGxvY2stPnByZXZpb3VzLAotCQkgICAgICAgbG9jay0+b25fY3B1LCBsb2NrLT5iYXNlX2ZpbGUsIGxvY2stPmxpbmVfbm8pOwotCQlzdHVjayA9IDFMIDw8IDM2OwotCQlwcmludGVkID0gMTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JLyogRXhpdGluZy4gIEdvdCB0aGUgbG9jay4gICovCi0JbG9jay0+b25fY3B1ID0gY3B1OwotCWxvY2stPnByZXZpb3VzID0gaW5saW5lX3BjOwotCWxvY2stPnRhc2sgPSBjdXJyZW50OwotCWxvY2stPmJhc2VfZmlsZSA9IGJhc2VfZmlsZTsKLQlsb2NrLT5saW5lX25vID0gbGluZV9ubzsKLQotCWlmIChwcmludGVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczolZCBzcGlubG9jayBncmFiYmVkIGluICVzIGF0ICVwKCVkKSAlbGQgdGlja3NcbiIsCi0JCSAgICAgICBiYXNlX2ZpbGUsIGxpbmVfbm8sIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywKLQkJICAgICAgIGNwdSwgamlmZmllcyAtIHN0YXJ0ZWQpOwotCX0KLX0KLQotaW50Ci1kZWJ1Z19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pCi17Ci0JaW50IHJldDsKLQlpZiAoKHJldCA9ICF0ZXN0X2FuZF9zZXRfYml0KDAsIGxvY2spKSkgewotCQlsb2NrLT5vbl9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWxvY2stPnByZXZpb3VzID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCQlsb2NrLT50YXNrID0gY3VycmVudDsKLQl9IGVsc2UgewotCQlsb2NrLT5iYXNlX2ZpbGUgPSBiYXNlX2ZpbGU7Ci0JCWxvY2stPmxpbmVfbm8gPSBsaW5lX25vOwotCX0KLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19TUElOTE9DSyAqLwotDAotI2lmZGVmIENPTkZJR19ERUJVR19SV0xPQ0sKLXZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICogbG9jaykKLXsKLQlsb25nIHJlZ3gsIHJlZ3k7Ci0JaW50IHN0dWNrX2xvY2ssIHN0dWNrX3JlYWRlcjsKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0KLSB0cnlfYWdhaW46Ci0KLQlzdHVja19sb2NrID0gMTw8MzA7Ci0Jc3R1Y2tfcmVhZGVyID0gMTw8MzA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiMToJbGRsX2wJJTEsJTBcbiIKLQkiCWJsYnMJJTEsNmZcbiIKLQkiCWJsdAklMSw4ZlxuIgotCSIJbW92CTEsJTFcbiIKLQkiCXN0bF9jCSUxLCUwXG4iCi0JIgliZXEJJTEsNmZcbiIKLQkiNDoJbWJcbiIKLQkiLnN1YnNlY3Rpb24gMlxuIgotCSI2OglibHQJJTMsNGIJIyBkZWJ1Z1xuIgotCSIJc3VibAklMywxLCUzCSMgZGVidWdcbiIKLQkiCWxkbAklMSwlMFxuIgotCSIJYmxicwklMSw2YlxuIgotCSI4OglibHQJJTQsNGIJIyBkZWJ1Z1xuIgotCSIJc3VibAklNCwxLCU0CSMgZGVidWdcbiIKLQkiCWxkbAklMSwlMFxuIgotCSIJYmx0CSUxLDhiXG4iCi0JIglicgkxYlxuIgotCSIucHJldmlvdXMiCi0JOiAiPW0iICgqKHZvbGF0aWxlIGludCAqKWxvY2spLCAiPSZyIiAocmVneCksICI9JnIiIChyZWd5KSwKLQkgICI9JnIiIChzdHVja19sb2NrKSwgIj0mciIgKHN0dWNrX3JlYWRlcikKLQk6ICJtIiAoKih2b2xhdGlsZSBpbnQgKilsb2NrKSwgIjMiIChzdHVja19sb2NrKSwgIjQiIChzdHVja19yZWFkZXIpIDogIm1lbW9yeSIpOwotCi0JaWYgKHN0dWNrX2xvY2sgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIndyaXRlX2xvY2sgc3R1Y2sgYXQgJXBcbiIsIGlubGluZV9wYyk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQlpZiAoc3R1Y2tfcmVhZGVyIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3cml0ZV9sb2NrIHN0dWNrIG9uIHJlYWRlcnMgYXQgJXBcbiIsCi0JCSAgICAgICBpbmxpbmVfcGMpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci19Ci0KLXZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKiBsb2NrKQotewotCWxvbmcgcmVneDsKLQlpbnQgc3R1Y2tfbG9jazsKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0KLSB0cnlfYWdhaW46Ci0KLQlzdHVja19sb2NrID0gMTw8MzA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiMToJbGRsX2wJJTEsJTA7IgotCSIJYmxicwklMSw2ZjsiCi0JIglzdWJsCSUxLDIsJTE7IgotCSIJc3RsX2MJJTEsJTA7IgotCSIJYmVxCSUxLDZmOyIKLQkiNDoJbWJcbiIKLQkiLnN1YnNlY3Rpb24gMlxuIgotCSI2OglsZGwJJTEsJTA7IgotCSIJYmx0CSUyLDRiCSMgZGVidWdcbiIKLQkiCXN1YmwJJTIsMSwlMgkjIGRlYnVnXG4iCi0JIglibGJzCSUxLDZiOyIKLQkiCWJyCTFiXG4iCi0JIi5wcmV2aW91cyIKLQk6ICI9bSIgKCoodm9sYXRpbGUgaW50ICopbG9jayksICI9JnIiIChyZWd4KSwgIj0mciIgKHN0dWNrX2xvY2spCi0JOiAibSIgKCoodm9sYXRpbGUgaW50ICopbG9jayksICIyIiAoc3R1Y2tfbG9jaykgOiAibWVtb3J5Iik7Ci0KLQlpZiAoc3R1Y2tfbG9jayA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZF9sb2NrIHN0dWNrIGF0ICVwXG4iLCBpbmxpbmVfcGMpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1JXTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCmluZGV4IDgwNDcyNzguLmUzMmZlZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKQEAgLTM3MywxMiArMzczLDExIEBACiAJCWlycSArPSAweDgwOwkJCS8qIG9mZnNldCBmb3IgbHNpICAgICAgICovCiAKICNpZiAxCi0JCXByaW50aygiUENJOiVkOiVkOiVkIChob3NlICVkKSBbJXNdIGlzIHVzaW5nIE1TSVxuIiwKKwkJcHJpbnRrKCJQQ0k6JWQ6JWQ6JWQgKGhvc2UgJWQpIGlzIHVzaW5nIE1TSVxuIiwKIAkJICAgICAgIGRldi0+YnVzLT5udW1iZXIsIAogCQkgICAgICAgUENJX1NMT1QoZGV2LT5kZXZmbiksIAogCQkgICAgICAgUENJX0ZVTkMoZGV2LT5kZXZmbiksCi0JCSAgICAgICBob3NlLT5pbmRleCwKLQkJICAgICAgIHBjaV9wcmV0dHlfbmFtZSAoZGV2KSk7CisJCSAgICAgICBob3NlLT5pbmRleCk7CiAJCXByaW50aygiICAlZCBtZXNzYWdlKHMpIGZyb20gMHglMDR4XG4iLCAKIAkJICAgICAgIDEgPDwgKChtc2dfY3RsICYgUENJX01TSV9GTEFHU19RU0laRSkgPj4gNCksCiAJCSAgICAgICBtc2dfZGF0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYwppbmRleCA4MjI2YzVjLi42N2JlNTBiIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAKKwlpZiAobnRwX3N5bmNlZCgpCiAJICAgICYmIHh0aW1lLnR2X3NlYyA+IHN0YXRlLmxhc3RfcnRjX3VwZGF0ZSArIDY2MAogCSAgICAmJiB4dGltZS50dl9uc2VjID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyCiAJICAgICYmIHh0aW1lLnR2X25zZWMgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKQEAgLTUwMiwxMCArNTAyLDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbGliL2RiZ19zdGFja2NoZWNrLlMgYi9hcmNoL2FscGhhL2xpYi9kYmdfc3RhY2tjaGVjay5TCmluZGV4IGNjNWNlM2EuLjNjMWYzZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbGliL2RiZ19zdGFja2NoZWNrLlMKKysrIGIvYXJjaC9hbHBoYS9saWIvZGJnX3N0YWNrY2hlY2suUwpAQCAtNSw3ICs1LDcgQEAKICAqIFZlcmlmeSB0aGF0IHdlIGhhdmUgbm90IG92ZXJmbG93ZWQgdGhlIHN0YWNrLiAgT29wcyBpZiB3ZSBoYXZlLgogICovCiAKLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAJLnNldCBub2F0CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2xpYi9kYmdfc3RhY2traWxsLlMgYi9hcmNoL2FscGhhL2xpYi9kYmdfc3RhY2traWxsLlMKaW5kZXggZTA5ZjJhZS4uZTlmNmE5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvZGJnX3N0YWNra2lsbC5TCisrKyBiL2FyY2gvYWxwaGEvbGliL2RiZ19zdGFja2tpbGwuUwpAQCAtNiw3ICs2LDcgQEAKICAqIHVuaW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBhY3QuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIAkuc2V0IG5vYXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDY4ZGZkYmEuLjExZmZmMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtNjQsNiArNjQsOSBAQAogY29uZmlnIEdFTkVSSUNfQlVTVF9TUElOTE9DSwogCWJvb2wKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCiBjb25maWcgR0VORVJJQ19JU0FfRE1BCiAJYm9vbAogCkBAIC0xNTAsNiArMTUzLDcgQEAKIAlzZWxlY3QgQVJDSF9BQ09STgogCXNlbGVjdCBGSVEKIAlzZWxlY3QgVElNRVJfQUNPUk4KKwlzZWxlY3QgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAloZWxwCiAJICBPbiB0aGUgQWNvcm4gUmlzYy1QQywgTGludXggY2FuIHN1cHBvcnQgdGhlIGludGVybmFsIElERSBkaXNrIGFuZAogCSAgQ0QtUk9NIGludGVyZmFjZSwgc2VyaWFsIGFuZCBwYXJhbGxlbCBwb3J0LCBhbmQgdGhlIGZsb3BweSBkcml2ZS4KQEAgLTMyMiw4ICszMjYsOCBAQAogCSAgcHJvY2Vzc29yIG1hY2hpbmVzLiBPbiBhIHNpbmdsZSBwcm9jZXNzb3IgbWFjaGluZSwgdGhlIGtlcm5lbCB3aWxsCiAJICBydW4gZmFzdGVyIGlmIHlvdSBzYXkgTiBoZXJlLgogCi0JICBTZWUgYWxzbyB0aGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zbXAudGV4PiwKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnR4dD4sIDxmaWxlOkRvY3VtZW50YXRpb24vaTM4Ni9JTy1BUElDLnR4dD4sCisJICBTZWUgYWxzbyB0aGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zbXAudHh0PiwKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vaTM4Ni9JTy1BUElDLnR4dD4sCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25taV93YXRjaGRvZy50eHQ+IGFuZCB0aGUgU01QLUhPV1RPIGF2YWlsYWJsZSBhdAogCSAgPGh0dHA6Ly93d3cubGludXhkb2Mub3JnL2RvY3MuaHRtbCNob3d0bz4uCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcuZGVidWcgYi9hcmNoL2FybS9LY29uZmlnLmRlYnVnCmluZGV4IDQ1YTU3MDkuLjVkM2FjZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZwpAQCAtNTMsNyArNTMsNyBAQAogCWJvb2wgIktlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIGZ1bmN0aW9ucyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAogCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBkZWZpbml0aW9ucyBvZiBwcmludGFzY2lpLCBwcmludGNoYXIsIHByaW50aGV4CisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgZGVmaW5pdGlvbnMgb2YgcHJpbnRhc2NpaSwgcHJpbnRjaCwgcHJpbnRoZXgKIAkgIGluIHRoZSBrZXJuZWwuICBUaGlzIGlzIGhlbHBmdWwgaWYgeW91IGFyZSBkZWJ1Z2dpbmcgY29kZSB0aGF0CiAJICBleGVjdXRlcyBiZWZvcmUgdGhlIGNvbnNvbGUgaXMgaW5pdGlhbGl6ZWQuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggNjdmMTQ1My4uZTYyNWFjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTE3OCw3ICsxNzgsNyBAQAogcHJlcGFyZTogbWFrZXRvb2xzIGluY2x1ZGUvYXNtLWFybS8uYXJjaAogCiAuUEhPTlk6IG1ha2V0b29scyBGT1JDRQotbWFrZXRvb2xzOiBpbmNsdWRlL2FzbS1hcm0vY29uc3RhbnRzLmggaW5jbHVkZS9saW51eC92ZXJzaW9uLmggRk9SQ0UKK21ha2V0b29sczogaW5jbHVkZS9saW51eC92ZXJzaW9uLmggRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcmNoL2FybS90b29scyBpbmNsdWRlL2FzbS1hcm0vbWFjaC10eXBlcy5oCiAKICMgQ29udmVydCBiekltYWdlIHRvIHpJbWFnZQpAQCAtMTkwLDcgKzE5MCw3IEBACiB6aW5zdGFsbCBpbnN0YWxsOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJEAKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tYXJtL2NvbnN0YW50cy5oKiBpbmNsdWRlL2FzbS1hcm0vbWFjaC10eXBlcy5oIFwKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLWFybS9tYWNoLXR5cGVzLmggXAogCSAgICAgICBpbmNsdWRlL2FzbS1hcm0vYXJjaCBpbmNsdWRlL2FzbS1hcm0vLmFyY2gKIAogIyBXZSB1c2UgTVJQUk9QRVJfRklMRVMgYW5kIENMRUFOX0ZJTEVTIG5vdwpAQCAtMjAxLDExICsyMDEsNiBAQAogYnA6OwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIE1BQ0hJTkU9JChNQUNISU5FKSAkKGJvb3QpL2Jvb3RwSW1hZ2UKIGkgemk6OwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIE1BQ0hJTkU9JChNQUNISU5FKSAkQAogCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2FzbS1hcm0vLmFyY2gKLQotaW5jbHVkZS9hc20tJChBUkNIKS9jb25zdGFudHMuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQogCiBkZWZpbmUgYXJjaGhlbHAKICAgZWNobyAgJyogekltYWdlICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC96SW1hZ2UpJwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2hhcnBzbC5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2hhcnBzbC5TCmluZGV4IGQ2YmY4YTIuLjU5YWQ2OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNoYXJwc2wuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaGFycHNsLlMKQEAgLTcsNyArNyw4IEBACiAgKiBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIG1hY2hpbmUgZm9yIG91cnNlbHZlcy4uLgogICoKICAqIFN1cHBvcnQgZm9yIFBvb2RsZSwgQ29yZ2kgKFNMLUM3MDApLCBTaGVwaGVyZCAoU0wtQzc1MCkKLSAqIGFuZCBIdXNreSAoU0wtQzc2MCkuCisgKiBIdXNreSAoU0wtQzc2MCksIFRvc2EgKFNMLUM2MDAwKSwgU3BpdHogKFNMLUMzMDAwKSwKKyAqIEFraXRhIChTTC1DMTAwMCkgYW5kIEJvcnpvaSAoU0wtQzMxMDApLgogICoKICAqLwogCkBAIC0yMyw2ICsyNCwyMiBAQAogCiBfX1NoYXJwU0xfc3RhcnQ6CiAKKy8qIENoZWNrIGZvciBUQzYzOTMgLSBpZiBmb3VuZCB3ZSBoYXZlIGEgVG9zYSAqLworCWxkcglyNywgLlRPU0FJRAorCW1vdglyMSwgIzB4MTAwMDAwMDAJCUAgQmFzZSBhZGRyZXNzIG9mIFRDNjM5MyBjaGlwCisJbW92IAlyNiwgIzB4MDMKKwlsZHJoCXIzLCBbcjEsICM4XQkJQCBMb2FkIFRDNjM5M1hCIFJldmlzb246IFRoaXMgaXMgMHgwMDAzCisJY21wCXI2LCByMworCWJlcQkuU0hBUlBFTkQJCUAgU3VjY2VzcyAtPiB0b3NhCisKKy8qIENoZWNrIGZvciBweGEyNzAgLSBpZiBmb3VuZCwgYnJhbmNoICovCisJbXJjIHAxNSwgMCwgcjQsIGMwLCBjMAkJQCBHZXQgUHJvY2Vzc29yIElECisJYW5kCXI0LCByNCwgIzB4ZmZmZmZmMDAKKwlsZHIJcjMsIC5QWEEyNzBJRAorCWNtcAlyNCwgcjMKKwliZXEJLlBYQTI3MAorCisvKiBDaGVjayBmb3IgdzEwMCAtIGlmIG5vdCBmb3VuZCB3ZSBoYXZlIGEgUG9vZGxlICovCiAJbGRyCXIxLCAuVzEwMEFERFIJCUAgQmFzZSBhZGRyZXNzIG9mIHcxMDAgY2hpcCArIHJlZ3Mgb2Zmc2V0CiAKIAltb3YgcjYsICMweDMxCQkJQCBMb2FkIE1hZ2ljIEluaXQgdmFsdWUKQEAgLTMwLDcgKzQ3LDcgQEAKIAltb3YgcjUsICMweDMwMDAKIC5XMTAwTE9PUDoKIAlzdWJzIHI1LCByNSwgIzEKLSAgICBibmUgLlcxMDBMT09QCisJYm5lIC5XMTAwTE9PUAogCW1vdiByNiwgIzB4MzAJCQlAIExvYWQgMm5kIE1hZ2ljIEluaXQgdmFsdWUKIAlzdHIJcjYsIFtyMSwgIzB4MjgwXQlAIHRvIFNDUkFUQ0hfVU1TSwogCkBAIC00MCw0NSArNTcsNTIgQEAKIAljbXAJcjYsIHIzCiAJYm5lCS5TSEFSUEVORAkJCUAgV2UgaGF2ZSBubyB3MTAwIC0gUG9vZGxlCiAKLQltcmMgcDE1LCAwLCByNiwgYzAsIGMwCUAgR2V0IFByb2Nlc3NvciBJRAotCWFuZAlyNiwgcjYsICMweGZmZmZmZjAwCisvKiBDaGVjayBmb3IgcHhhMjUwIC0gaWYgZm91bmQgd2UgaGF2ZSBhIENvcmdpICovCiAJbGRyCXI3LCAuQ09SR0lJRAogCWxkcglyMywgLlBYQTI1NUlECi0JY21wCXI2LCByMworCWNtcAlyNCwgcjMKIAlibG8JLlNIQVJQRU5ECQkJQCBXZSBoYXZlIGEgUFhBMjUwIC0gQ29yZ2kKIAotCW1vdglyMSwgIzB4MGMwMDAwMDAJCUAgQmFzZSBhZGRyZXNzIG9mIE5BTkQgY2hpcAotCWxkcmIJcjMsIFtyMSwgIzI0XQlAIExvYWQgRkxBU0hDVEwKLQliaWMJcjMsIHIzLCAjMHgxMQkJQCBTRVQgTkNFCi0Jb3JyCXIzLCByMywgIzB4MGEJCUAgU0VUIENMUiArIEZMV1AKLQlzdHJiCXIzLCBbcjEsICMyNF0JQCBTYXZlIHRvIEZMQVNIQ1RMCi0JbW92IAlyMiwgIzB4OTAJCUAgQ29tbWFuZCAicmVhZGlkIgotCXN0cmIJcjIsIFtyMSwgIzIwXQlAIFNhdmUgdG8gRkxBU0hJTwotCWJpYwlyMywgcjMsICMyCQkJQCBDTFIgQ0xFCi0Jb3JyCXIzLCByMywgIzQJCQlAIFNFVCBBTEUKLQlzdHJiCXIzLCBbcjEsICMyNF0JQCBTYXZlIHRvIEZMQVNIQ1RMCi0JbW92CQlyMiwgIzAJCQlAIEFkZHJlc3MgMHgwMAotCXN0cmIJcjIsIFtyMSwgIzIwXQlAIFNhdmUgdG8gRkxBU0hJTwotCWJpYwlyMywgcjMsICM0CQkJQCBDTFIgQUxFCi0Jc3RyYglyMywgW3IxLCAjMjRdCUAgU2F2ZSB0byBGTEFTSENUTAotLlNIQVJQMToKLQlsZHJiCXIzLCBbcjEsICMyNF0JQCBMb2FkIEZMQVNIQ1RMCi0JdHN0CXIzLCAjMzIJCQkJQCBJcyBjaGlwIHJlYWR5PwotCWJlcQkuU0hBUlAxCi0JbGRyYglyMiwgW3IxLCAjMjBdCUAgTkFORCBNYW51ZmFjdHVyZXIgSUQKLQlsZHJiCXIzLCBbcjEsICMyMF0JQCBOQU5EIENoaXAgSUQKKy8qIENoZWNrIGZvciA2NE1pQiBmbGFzaCAtIGlmIGZvdW5kIHdlIGhhdmUgYSBTaGVwaGVyZCAqLworCWJsCWdldF9mbGFzaF9pZHMKIAlsZHIJcjcsIC5TSEVQSEVSRElECiAJY21wCXIzLCAjMHg3NgkJCUAgNjRNaUIgZmxhc2gKIAliZXEJLlNIQVJQRU5ECQkJQCBXZSBoYXZlIFNoZXBoZXJkCisKKy8qIE11c3QgYmUgYSBIdXNreSAqLwogCWxkcglyNywgLkhVU0tZSUQJCUAgTXVzdCBiZSBIdXNreQogCWIgLlNIQVJQRU5ECiAKKy5QWEEyNzA6CisvKiBDaGVjayBmb3IgMTZNaUIgZmxhc2ggLSBpZiBmb3VuZCB3ZSBoYXZlIFNwaXR6ICovCisJYmwJZ2V0X2ZsYXNoX2lkcworCWxkcglyNywgLlNQSVRaSUQKKwljbXAJcjMsICMweDczCQkJQCAxNk1pQiBmbGFzaAorCWJlcQkuU0hBUlBFTkQJCQlAIFdlIGhhdmUgU3BpdHoKKworLyogQ2hlY2sgZm9yIGEgc2Vjb25kIFNDT09QIGNoaXAgLSBpZiBmb3VuZCB3ZSBoYXZlIEJvcnpvaSAqLworCWxkcglyMSwgLlNDT09QMkFERFIKKwlsZHIJcjcsIC5CT1JaT0lJRAorCW1vdiAJcjYsICMweDAxNDAKKwlzdHJoCXI2LCBbcjFdCisJbGRyaAlyNiwgW3IxXQorCWNtcAlyNiwgIzB4MDE0MAorCWJlcQkuU0hBUlBFTkQJCQlAIFdlIGhhdmUgQm9yem9pCisKKy8qIE11c3QgYmUgQWtpdGEgKi8KKwlsZHIJcjcsIC5BS0lUQUlECisJYgkuU0hBUlBFTkQJCQlAIFdlIGhhdmUgQm9yem9pCisKIC5QWEEyNTVJRDoKIAkud29yZAkweDY5MDUyZDAwCQlAIFBYQTI1NSBQcm9jZXNzb3IgSUQKKy5QWEEyNzBJRDoKKwkud29yZAkweDY5MDU0MTAwCQlAIFBYQTI3MCBQcm9jZXNzb3IgSUQKIC5XMTAwSUQ6CiAJLndvcmQJMHg1NzQxMTAwMgkJQCB3MTAwIENoaXAgSUQKIC5XMTAwQUREUjoKIAkud29yZCAJMHgwODAxMDAwMAkJQCB3MTAwIENoaXAgSUQgUmVnIEFkZHJlc3MKKy5TQ09PUDJBRERSOgorCS53b3JkCTB4MDg4MDAwNDAKIC5QT09ETEVJRDoKIAkud29yZAlNQUNIX1RZUEVfUE9PRExFCiAuQ09SR0lJRDoKQEAgLTg3LDYgKzExMSw0MSBAQAogCS53b3JkCU1BQ0hfVFlQRV9TSEVQSEVSRAogLkhVU0tZSUQ6CiAJLndvcmQJTUFDSF9UWVBFX0hVU0tZCisuVE9TQUlEOgorCS53b3JkCU1BQ0hfVFlQRV9UT1NBCisuU1BJVFpJRDoKKwkud29yZAlNQUNIX1RZUEVfU1BJVFoKKy5BS0lUQUlEOgorCS53b3JkCU1BQ0hfVFlQRV9BS0lUQQorLkJPUlpPSUlEOgorCS53b3JkCU1BQ0hfVFlQRV9CT1JaT0kKKworLyoKKyAqIFJldHVybjogcjIgLSBOQU5EIE1hbnVmYWN0dXJlciBJRAorICogICAgICAgICByMyAtIE5BTkQgQ2hpcCBJRAorICogQ29ycnVwdHM6IHIxCisgKi8KK2dldF9mbGFzaF9pZHM6CisJbW92CXIxLCAjMHgwYzAwMDAwMAkJQCBCYXNlIGFkZHJlc3Mgb2YgTkFORCBjaGlwCisJbGRyYglyMywgW3IxLCAjMjRdCQlAIExvYWQgRkxBU0hDVEwKKwliaWMJcjMsIHIzLCAjMHgxMQkJQCBTRVQgTkNFCisJb3JyCXIzLCByMywgIzB4MGEJCUAgU0VUIENMUiArIEZMV1AKKwlzdHJiCXIzLCBbcjEsICMyNF0JCUAgU2F2ZSB0byBGTEFTSENUTAorCW1vdiAJcjIsICMweDkwCQlAIENvbW1hbmQgInJlYWRpZCIKKwlzdHJiCXIyLCBbcjEsICMyMF0JCUAgU2F2ZSB0byBGTEFTSElPCisJYmljCXIzLCByMywgIzIJCUAgQ0xSIENMRQorCW9ycglyMywgcjMsICM0CQlAIFNFVCBBTEUKKwlzdHJiCXIzLCBbcjEsICMyNF0JCUAgU2F2ZSB0byBGTEFTSENUTAorCW1vdglyMiwgIzAJCQlAIEFkZHJlc3MgMHgwMAorCXN0cmIJcjIsIFtyMSwgIzIwXQkJQCBTYXZlIHRvIEZMQVNISU8KKwliaWMJcjMsIHIzLCAjNAkJQCBDTFIgQUxFCisJc3RyYglyMywgW3IxLCAjMjRdCQlAIFNhdmUgdG8gRkxBU0hDVEwKKy5maWRzMToKKwlsZHJiCXIzLCBbcjEsICMyNF0JCUAgTG9hZCBGTEFTSENUTAorCXRzdAlyMywgIzMyCQkJQCBJcyBjaGlwIHJlYWR5PworCWJlcQkuZmlkczEKKwlsZHJiCXIyLCBbcjEsICMyMF0JCUAgTkFORCBNYW51ZmFjdHVyZXIgSUQKKwlsZHJiCXIzLCBbcjEsICMyMF0JCUAgTkFORCBDaGlwIElECisJbW92CXBjLCBscgorCiAuU0hBUlBFTkQ6Ci0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDUxZjQzMGMuLjI3ODZmN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYworKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTU0MSw2ICs1NDEsMTAzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorCitzdHJ1Y3QgbG9jb21vX3NhdmVfZGF0YSB7CisJdTE2CUxDTV9HUE87CisJdTE2CUxDTV9TUElDVDsKKwl1MTYJTENNX0dQRTsKKwl1MTYJTENNX0FTRDsKKwl1MTYJTENNX1NQSU1EOworfTsKKworc3RhdGljIGludCBsb2NvbW9fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBwbV9tZXNzYWdlX3QsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBsb2NvbW9fc2F2ZV9kYXRhICpzYXZlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGV2ZWwgIT0gU1VTUEVORF9ESVNBQkxFKQorCQlyZXR1cm4gMDsKKworCXNhdmUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9jb21vX3NhdmVfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghc2F2ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPnBvd2VyLnNhdmVkX3N0YXRlID0gKHZvaWQgKikgc2F2ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsY2hpcC0+bG9jaywgZmxhZ3MpOworCisJc2F2ZS0+TENNX0dQTyAgICAgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fR1BPKTsJLyogR1BJTyAqLworCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fR1BPKTsKKwlzYXZlLT5MQ01fU1BJQ1QgICA9IGxvY29tb19yZWFkbChsY2hpcC0+YmFzZSArIExPQ09NT19TUElDVCk7CS8qIFNQSSAqLworCWxvY29tb193cml0ZWwoMHg0MCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJQ1QpOworCXNhdmUtPkxDTV9HUEUgICAgID0gbG9jb21vX3JlYWRsKGxjaGlwLT5iYXNlICsgTE9DT01PX0dQRSk7CS8qIEdQSU8gKi8KKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0dQRSk7CisJc2F2ZS0+TENNX0FTRCAgICAgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fQVNEKTsJLyogQURTVEFSVCAqLworCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fQVNEKTsKKwlzYXZlLT5MQ01fU1BJTUQgICA9IGxvY29tb19yZWFkbChsY2hpcC0+YmFzZSArIExPQ09NT19TUElNRCk7CS8qIFNQSSAqLworCWxvY29tb193cml0ZWwoMHgzQzE0LCBsY2hpcC0+YmFzZSArIExPQ09NT19TUElNRCk7CisKKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX1BBSUYpOworCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fREFDKTsKKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0JBQ0tMSUdIVCArIExPQ09NT19UQyk7CisKKwlpZiAoIChsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fTEVEICsgTE9DT01PX0xQVDApICYgMHg4OCkgJiYgKGxvY29tb19yZWFkbChsY2hpcC0+YmFzZSArIExPQ09NT19MRUQgKyBMT0NPTU9fTFBUMSkgJiAweDg4KSApCisJCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fQzMySyk7IAkvKiBDTEszMiBvZmYgKi8KKwllbHNlCisJCS8qIDE4TUh6IGFscmVhZHkgZW5hYmxlZCwgc28gbm8gd2FpdCAqLworCQlsb2NvbW9fd3JpdGVsKDB4YzEsIGxjaGlwLT5iYXNlICsgTE9DT01PX0MzMkspOyAJLyogQ0xLMzIgb24gKi8KKworCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fVEFEQyk7CQkvKiAxOE1IeiBjbG9jayBvZmYqLworCWxvY29tb193cml0ZWwoMHgwMCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fQVVESU8gKyBMT0NPTU9fQUNDKTsJCQkvKiAyMk1Iei8yNE1IeiBjbG9jayBvZmYgKi8KKwlsb2NvbW9fd3JpdGVsKDB4MDAsIGxjaGlwLT5iYXNlICsgTE9DT01PX0ZST05UTElHSFQgKyBMT0NPTU9fQUxTKTsJCQkvKiBGTCAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxvY29tb19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGxvY29tbyAqbGNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbG9jb21vX3NhdmVfZGF0YSAqc2F2ZTsKKwl1bnNpZ25lZCBsb25nIHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAobGV2ZWwgIT0gUkVTVU1FX0VOQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlzYXZlID0gKHN0cnVjdCBsb2NvbW9fc2F2ZV9kYXRhICopIGRldi0+cG93ZXIuc2F2ZWRfc3RhdGU7CisJaWYgKCFzYXZlKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsY2hpcC0+bG9jaywgZmxhZ3MpOworCisJbG9jb21vX3dyaXRlbChzYXZlLT5MQ01fR1BPLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUE8pOworCWxvY29tb193cml0ZWwoc2F2ZS0+TENNX1NQSUNULCBsY2hpcC0+YmFzZSArIExPQ09NT19TUElDVCk7CisJbG9jb21vX3dyaXRlbChzYXZlLT5MQ01fR1BFLCBsY2hpcC0+YmFzZSArIExPQ09NT19HUEUpOworCWxvY29tb193cml0ZWwoc2F2ZS0+TENNX0FTRCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fQVNEKTsKKwlsb2NvbW9fd3JpdGVsKHNhdmUtPkxDTV9TUElNRCwgbGNoaXAtPmJhc2UgKyBMT0NPTU9fU1BJTUQpOworCisJbG9jb21vX3dyaXRlbCgweDAwLCBsY2hpcC0+YmFzZSArIExPQ09NT19DMzJLKTsKKwlsb2NvbW9fd3JpdGVsKDB4OTAsIGxjaGlwLT5iYXNlICsgTE9DT01PX1RBREMpOworCisJbG9jb21vX3dyaXRlbCgwLCBsY2hpcC0+YmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LU0MpOworCXIgPSBsb2NvbW9fcmVhZGwobGNoaXAtPmJhc2UgKyBMT0NPTU9fS0VZQk9BUkQgKyBMT0NPTU9fS0lDKTsKKwlyICY9IDB4RkVGRjsKKwlsb2NvbW9fd3JpdGVsKHIsIGxjaGlwLT5iYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7CisJbG9jb21vX3dyaXRlbCgweDEsIGxjaGlwLT5iYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tDTUQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKKworCWRldi0+cG93ZXIuc2F2ZWRfc3RhdGUgPSBOVUxMOworCWtmcmVlKHNhdmUpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogLyoqCiAgKglsb2NvbW9fcHJvYmUgLSBwcm9iZSBmb3IgYSBzaW5nbGUgTG9Db01vIGNoaXAuCiAgKglAcGh5c19hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRldmljZS4KQEAgLTcwNyw2ICs4MDQsMTAgQEAKIAkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKIAkucHJvYmUJCT0gbG9jb21vX3Byb2JlLAogCS5yZW1vdmUJCT0gbG9jb21vX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGxvY29tb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gbG9jb21vX3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKaW5kZXggNjg4YTU5NS4uZDNhMDRjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKQEAgLTkxLDcgKzkxLDcgQEAKIEVYUE9SVF9TWU1CT0wod3JpdGVfc2Nvb3BfcmVnKTsKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzY29vcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQorc3RhdGljIGludCBzY29vcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1aW50MzJfdCBsZXZlbCkKIHsKIAlpZiAobGV2ZWwgPT0gU1VTUEVORF9QT1dFUl9ET1dOKSB7CiAJCXN0cnVjdCBzY29vcF9kZXYgKnNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwppbmRleCAyNDk1NTI2Li40MTk4Njc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgotIyBGcmkgSnVsICA4IDA0OjQ5OjM0IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMworIyBNb24gU2VwICA1IDE4OjA3OjEyIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0xMDIsOSArMTAyLDExIEBACiAjIENPTkZJR19PTUFQX01QVV9USU1FUiBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF8zMktfVElNRVI9eQogQ09ORklHX09NQVBfMzJLX1RJTUVSX0haPTEyOAorIyBDT05GSUdfT01BUF9ETV9USU1FUiBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMT15CiAjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKICMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDMgaXMgbm90IHNldAorQ09ORklHX09NQVBfU0VSSUFMX1dBS0U9eQogCiAjCiAjIE9NQVAgQ29yZSBUeXBlCkBAIC0xNjYsNyArMTY4LDYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCi0jIENPTkZJR19TTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQogQ09ORklHX05PX0lETEVfSFo9eQogIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKQEAgLTIzMCw2ICsyMzEsNjggQEAKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMjQzLDc4ICszMDYsNyBAQAogIwogIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCiAjCi1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfREVCVUc9eQotQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTMKLSMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci0jIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxPQ0s9eQotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi1DT05GSUdfTVREX0NGST15Ci0jIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0dFTl9QUk9CRT15Ci0jIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLSMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9VVElMPXkKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAotCi0jCi0jIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKLSMKLSMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRURCNzMxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKLQotIwotIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwogIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKQEAgLTQwMyw3MiArMzk1LDggQEAKICMKIAogIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQklDPXkKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CkBAIC01MTgsNiArNDQ2LDggQEAKICMgQ09ORklHX1NMSVBfTU9ERV9TTElQNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogCiAjCiAjIElTRE4gc3Vic3lzdGVtCkBAIC02MTUsNzcgKzU0NSwxNSBAQAogIwogIyBJMkMgc3VwcG9ydAogIwotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotCi0jCi0jIEkyQyBBbGdvcml0aG1zCi0jCi0jIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKK0NPTkZJR19JU1AxMzAxX09NQVA9eQogCiAjCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CiAjCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAotQ09ORklHX0lTUDEzMDFfT01BUD15Ci1DT05GSUdfVFBTNjUwMTA9eQotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwpAQCAtNzU2LDE1ICs2MjQsOSBAQAogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPXkKLSMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9DUzQyODEgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX01TTkRDTEFTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX01TTkRQSU4gaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1RWTUlYRVIgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfQUQxOTgwIGlzIG5vdCBzZXQKIAogIwpAQCAtODEwLDYgKzY3Miw3IEBACiAjIENPTkZJR19KQkQgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAKICMKICMgWEZTIHN1cHBvcnQKQEAgLTgxNyw2ICs2ODAsNyBAQAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfSU5PVElGWT15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldApAQCAtODU3LDE1ICs3MjEsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9GU19ERUJVRz0yCi0jIENPTkZJR19KRkZTMl9GU19OQU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfSkZGUzJfWkxJQj15Ci1DT05GSUdfSkZGUzJfUlRJTUU9eQotIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogQ09ORklHX0NSQU1GUz15CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldApAQCAtMTAwNyw0ICs4NjIsMyBAQAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKaW5kZXggOTZhNzk0ZC4uNzU2MzQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDQKLSMgV2VkIEp1biAyMiAxNTo1Njo0MiAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtZ2l0OAorIyBUaHUgU2VwICA4IDE5OjI0OjAyIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0yMiw2ICsyMiw3IEBACiAjIEdlbmVyYWwgc2V0dXAKICMKIENPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldApAQCAtMzEsNiArMzIsNyBAQAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldApAQCAtODgsNyArOTAsOSBAQAogIwogIyBTM0MyNFhYIEltcGxlbWVudGF0aW9ucwogIworQ09ORklHX01BQ0hfQU5VQklTPXkKIENPTkZJR19BUkNIX0JBU1Q9eQorQ09ORklHX0JBU1RfUEMxMDRfSVJRPXkKIENPTkZJR19BUkNIX0gxOTQwPXkKIENPTkZJR19NQUNIX04zMD15CiBDT05GSUdfQVJDSF9TTURLMjQxMD15CkBAIC0xMTIsNiArMTE2LDcgQEAKICMgQ09ORklHX1MzQzI0MTBfRE1BX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1MzQzI0MTBfUE1fREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfUzNDMjQxMF9QTV9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfUE1fU0lNVEVDPXkKIENPTkZJR19TM0MyNDEwX0xPV0xFVkVMX1VBUlRfUE9SVD0wCiAKICMKQEAgLTE0OSw3ICsxNTQsMTUgQEAKICMKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJU0NPTlRJR01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CiAKICMKQEAgLTE4Niw2ICsxOTksNzQgQEAKIENPTkZJR19BUE09eQogCiAjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMjU4LDYgKzMzOSw3IEBACiAjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAogQ09ORklHX01URF9CQVNUPXkKIENPTkZJR19NVERfQkFTVF9NQVhTSVpFPTQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKQEAgLTMxMiw3ICszOTQsNiBAQAogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogCiAjCkBAIC0zNTQsNiArNDM1LDcgQEAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKIAogIwpAQCAtMzc2LDcwICs0NTgsOCBAQAogIwogCiAjCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAorIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CiAjCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldApAQCAtNDQ3LDYgKzQ2NywxMSBAQAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKIAogIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKQEAgLTQ4MCw2ICs1MDUsOCBAQAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogCiAjCiAjIElTRE4gc3Vic3lzdGVtCkBAIC01NjIsNyArNTg5LDYgQEAKIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQogIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKIAogIwpAQCAtNjA1LDcgKzYzMSw2IEBACiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCkBAIC02MjgsNyArNjUzLDcgQEAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCi0jIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSVNBPW0KICMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfUzNDMjQxMD15CkBAIC02MzYsMTQgKzY2MSwzMyBAQAogIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0CisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotQ09ORklHX0kyQ19TRU5TT1I9bQorIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfRUVQUk9NPW0KKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorQ09ORklHX0hXTU9OX1ZJRD1tCiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldApAQCAtNjYyLDMwICs3MDYsMjQgQEAKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLUNPTkZJR19TRU5TT1JTX0VFUFJPTT1tCi0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwogIwogCiAjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKQEAgLTczMSw3ICs3NjksNyBAQAogIyBVU0Igc3VwcG9ydAogIwogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKICMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc0OSw2ICs3ODcsNyBAQAogIwogQ09ORklHX0VYVDJfRlM9eQogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CkBAIC03NTgsNiArNzk3LDcgQEAKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogCiAjCiAjIFhGUyBzdXBwb3J0CkBAIC03NjUsNiArODA1LDcgQEAKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQorQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTc5MSwxMSArODMyLDExIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKQEAgLTgxMiw4ICs4NTMsNyBAQAogIyBDT05GSUdfSkZGU19QUk9DX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9GUz15CiBDT05GSUdfSkZGUzJfRlNfREVCVUc9MAotIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CiAjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9aTElCPXkKIENPTkZJR19KRkZTMl9SVElNRT15CkBAIC04MzUsNiArODc1LDcgQEAKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKQEAgLTkyMCw2ICs5NjEsNyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNgorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCmluZGV4IGRiMDdjZTQuLjk0OWVjNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCkBAIC0xMCw3ICsxMCw3IEBACiAgKiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIHR3aWNlIGluIGVudHJ5LWNvbW1vbi5TCiAgKi8KICNpZm5kZWYgTlJfc3lzY2FsbHMKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzIwCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyOAogI2Vsc2UKIAogX19zeXNjYWxsX3N0YXJ0OgpAQCAtMzMzLDYgKzMzMyw5IEBACiAJCS5sb25nCXN5c19pbm90aWZ5X2luaXQKIAkJLmxvbmcJc3lzX2lub3RpZnlfYWRkX3dhdGNoCiAJCS5sb25nCXN5c19pbm90aWZ5X3JtX3dhdGNoCisJCS5sb25nCXN5c19tYmluZF93cmFwcGVyCisvKiAzMjAgKi8JLmxvbmcJc3lzX2dldF9tZW1wb2xpY3kKKwkJLmxvbmcJc3lzX3NldF9tZW1wb2xpY3kKIF9fc3lzY2FsbF9lbmQ6CiAKIAkJLnJlcHQJTlJfc3lzY2FsbHMgLSAoX19zeXNjYWxsX2VuZCAtIF9fc3lzY2FsbF9zdGFydCkgLyA0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggNjI4MWQ0ODguLmRiMzAyYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTI2OSw2ICsyNjksMTAgQEAKIAkJc3RyCXI1LCBbc3AsICM0XQkJQCBwdXNoIHI1IHRvIHN0YWNrCiAJCWIJc3lzX2FybV9mYWR2aXNlNjRfNjQKIAorc3lzX21iaW5kX3dyYXBwZXI6CisJCXN0cglyNSwgW3NwLCAjNF0KKwkJYglzeXNfbWJpbmQKKwogLyoKICAqIE5vdGU6IG9mZl80ayAocjUpIGlzIGFsd2F5cyB1bml0cyBvZiA0Sy4gIElmIHdlIGNhbid0IGRvIHRoZSByZXF1ZXN0ZWQKICAqIG9mZnNldCwgd2UgcmV0dXJuIEVJTlZBTC4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUwppbmRleCBhZmVmMjEyLi42NDhjZmZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCkBAIC0zLDcgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCmluZGV4IDExNTVjZjAuLjUzOTYyNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pd21teHQuUyBiL2FyY2gvYXJtL2tlcm5lbC9pd21teHQuUwppbmRleCA4Zjc0ZTI0Li4yNGM3YjA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaXdtbXh0LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNkZWZpbmUgTU1YX1dSMAkJIAkoMHgwMCkKICNkZWZpbmUgTU1YX1dSMQkJIAkoMHgwOCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IDg4ODA0ODIuLjY5NDQ5YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19zZXRfcnRjKHZvaWQpCiB7Ci0JaWYgKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQyB8fCBzZXRfcnRjID09IE5VTEwpCisJaWYgKCFudHBfc3luY2VkKCkgfHwgc2V0X3J0YyA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAobmV4dF9ydGNfdXBkYXRlICYmCkBAIC0yOTIsMTAgKzI5Miw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TCmluZGV4IDRjMzhhYmQuLjY4MTE3OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUworKysgYi9hcmNoL2FybS9saWIvY29weV9wYWdlLlMKQEAgLTExLDcgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjZGVmaW5lIENPUFlfQ09VTlQgKFBBR0VfU1ovNjQgUExEKCAtMSApKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwppbmRleCA0NmEyZGM5Li4zMzNiY2EyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCQkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZ2V0dXNlci5TIGIvYXJjaC9hcm0vbGliL2dldHVzZXIuUwppbmRleCA2NGFhNmY0Li5kMjA0MDE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvZ2V0dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9nZXR1c2VyLlMKQEAgLTI2LDcgKzI2LDcgQEAKICAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAuCiAgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fZ2V0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCiAgKi8KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9wdXR1c2VyLlMgYi9hcmNoL2FybS9saWIvcHV0dXNlci5TCmluZGV4IGIwOTM5OGQuLjQ1OTNlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9wdXR1c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL3B1dHVzZXIuUwpAQCAtMjYsNyArMjYsNyBAQAogICogTm90ZSB0aGF0IEFERFJfTElNSVQgaXMgZWl0aGVyIDAgb3IgMHhjMDAwMDAwMAogICogTm90ZSBhbHNvIHRoYXQgaXQgaXMgaW50ZW5kZWQgdGhhdCBfX3B1dF91c2VyX2JhZCBpcyBub3QgZ2xvYmFsLgogICovCi0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCmluZGV4IDExMmYxZDY4Li5lMjE2YWI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwpAQCAtMzU0LDcgKzM1NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYwppbmRleCAyM2M0ZGExLi41YWVhZGZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9hcmNoLmMgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwppbmRleCA3ZGFhMDIxLi40NGM1NjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYworKysgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwpAQCAtNTIsNyArNTIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZwppbmRleCAzMjRkOWVkLi5iZGQyNTc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZwpAQCAtODcsNiArODcsNyBAQAogCiAjIEVCU0EyODUgYm9hcmQgaW4gZWl0aGVyIGhvc3Qgb3IgYWRkaW4gbW9kZQogY29uZmlnIEFSQ0hfRUJTQTI4NQorCXNlbGVjdCBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWJvb2wKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EuYwppbmRleCBhYTNhMWZlLi4yODg0NmM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS5jCkBAIC0zNCw3ICszNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYwppbmRleCA0YjMxOTkzLi5hNGE3YzAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtdGltZS5jCmluZGV4IGQ1M2FmMTYuLjAwMzk3OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXRpbWUuYwpAQCAtNjAsNyArNjAsNyBAQAogCS8qCiAJICogTm93IGNvbnZlcnQgdGhlbSB0byB1c2VjLgogCSAqLwotCXVzZWMgPSAodW5zaWduZWQgbG9uZykoZWxhcHNlZCAqICh0aWNrX25zZWMgLyAxMDAwKSkgLyBMQVRDSDsKKwl1c2VjID0gKHVuc2lnbmVkIGxvbmcpKGVsYXBzZWQgLyAoQ0xPQ0tfVElDS19SQVRFLzEwMDAwMDApKTsKIAogCXJldHVybiB1c2VjOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS10aW1lLmMKaW5kZXggMWE2ZDlkNi4uOGVkZGZhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtdGltZS5jCkBAIC01OCw3ICs1OCw3IEBACiAJLyoKIAkgKiBOb3cgY29udmVydCB0aGVtIHRvIHVzZWMuCiAJICovCi0JdXNlYyA9ICh1bnNpZ25lZCBsb25nKShlbGFwc2VkICogKHRpY2tfbnNlYyAvIDEwMDApKSAvIExBVENIOworCXVzZWMgPSAodW5zaWduZWQgbG9uZykoZWxhcHNlZCAvIChDTE9DS19USUNLX1JBVEUvMTAwMDAwMCkpOwogCiAJcmV0dXJuIHVzZWM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwppbmRleCA3ODFkMTBhLi43NGJkMmZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeHAyMDAwX3NlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJPSAwLAorCS5pZAkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCQk9IGl4cDIwMDBfc2VyaWFsX3BvcnQsCiAJfSwKQEAgLTM4Miw3ICszODIsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDIwMDBfR1BJT19pcnFfY2hpcCA9IHsKIAkuYWNrCQk9IGl4cDIwMDBfR1BJT19pcnFfbWFza19hY2ssCiAJLm1hc2sJCT0gaXhwMjAwMF9HUElPX2lycV9tYXNrLAotCS51bm1hc2sJCT0gaXhwMjAwMF9HUElPX2lycV91bm1hc2sKKwkudW5tYXNrCQk9IGl4cDIwMDBfR1BJT19pcnFfdW5tYXNrLAogCS5zZXRfdHlwZQk9IGl4cDIwMDBfR1BJT19pcnFfdHlwZSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKaW5kZXggMDQyMmU5MC4uNTJhZDExMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTE3OSwxNyArMTc5LDE3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2xldmVsX2NoaXAgPSB7Ci0JLmFjawk9IGl4cDR4eF9pcnFfbWFzaywKLQkubWFzawk9IGl4cDR4eF9pcnFfbWFzaywKLQkudW5tYXNrCT0gaXhwNHh4X2lycV9sZXZlbF91bm1hc2ssCi0JLnR5cGUJPSBpeHA0eHhfc2V0X2lycV90eXBlCisJLmFjawkJPSBpeHA0eHhfaXJxX21hc2ssCisJLm1hc2sJCT0gaXhwNHh4X2lycV9tYXNrLAorCS51bm1hc2sJCT0gaXhwNHh4X2lycV9sZXZlbF91bm1hc2ssCisJLnNldF90eXBlCT0gaXhwNHh4X3NldF9pcnFfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2VkZ2VfY2hpcCA9IHsKLQkuYWNrCT0gaXhwNHh4X2lycV9hY2ssCi0JLm1hc2sJPSBpeHA0eHhfaXJxX21hc2ssCi0JLnVubWFzawk9IGl4cDR4eF9pcnFfdW5tYXNrLAotCS50eXBlCT0gaXhwNHh4X3NldF9pcnFfdHlwZQorCS5hY2sJCT0gaXhwNHh4X2lycV9hY2ssCisJLm1hc2sJCT0gaXhwNHh4X2lycV9tYXNrLAorCS51bm1hc2sJCT0gaXhwNHh4X2lycV91bm1hc2ssCisJLnNldF90eXBlCT0gaXhwNHh4X3NldF9pcnFfdHlwZSwKIH07CiAKIHN0YXRpYyB2b2lkIGl4cDR4eF9jb25maWdfaXJxKHVuc2lnbmVkIGlycSwgZW51bSBpeHA0eHhfaXJxX3R5cGUgdHlwZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKaW5kZXggOGIyZjI1My4uMDUwYzkyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY295b3RlX3VhcnQgPSB7CiAJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJPSAwLAorCS5pZAkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IGNveW90ZV91YXJ0X2RhdGEsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCmluZGV4IDNmZDkyYzUuLjI5YTZkMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYwpAQCAtOTMsNyArOTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBndHd4NTcxNV91YXJ0X2RldmljZSA9IHsKIAkubmFtZQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQk9IDAsCisJLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gZ3R3eDU3MTVfdWFydF9wbGF0Zm9ybV9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKaW5kZXggNmMxNGZmMy4uYWUxZmEwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwpAQCAtOTYsNyArOTYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeGRwNDI1X3VhcnQgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldi5wbGF0Zm9ybV9kYXRhCT0gaXhkcDQyNV91YXJ0X2RhdGEsCiAJLm51bV9yZXNvdXJjZXMJCT0gMiwKIAkucmVzb3VyY2UJCT0gaXhkcDQyNV91YXJ0X3Jlc291cmNlcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnCmluZGV4IDc0MDhhYzkuLjI3ZmMyZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcKQEAgLTQ3LDYgKzQ3LDE0IEBACiAJICBUSSBPTUFQIDU5MTIgT1NLIChPTUFQIFN0YXJ0ZXIgS2l0KSBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlCiAgICAgICAgICAgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgogCitjb25maWcgT01BUF9PU0tfTUlTVFJBTAorCWJvb2wgIk1pc3RyYWwgUVZHQSBib2FyZCBTdXBwb3J0IgorCWRlcGVuZHMgb24gTUFDSF9PTUFQX09TSworICAgIAloZWxwCisJICBUaGUgT1NLIHN1cHBvcnRzIGFuIG9wdGlvbmFsIGFkZC1vbiBib2FyZCB3aXRoIGEgUXVhcnRlci1WR0EKKwkgIHRvdWNoc2NyZWVuLCBQREEtaXNoIGJ1dHRvbnMsIGEgcmVzdW1lIGJ1dHRvbiwgYmljb2xvciBMRUQsCisJICBhbmQgY2FtZXJhIGNvbm5lY3Rvci4gIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgdGhpcyBib2FyZC4KKwogY29uZmlnIE1BQ0hfT01BUF9QRVJTRVVTMgogCWJvb2wgIlRJIFBlcnNldXMyIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVA3MzAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCmluZGV4IGQzODZmZDkuLjE4MWE5M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogIyBDb21tb24gc3VwcG9ydAotb2JqLXkgOj0gaW8ubyBpZC5vIGlycS5vIHRpbWUubyBzZXJpYWwubworb2JqLXkgOj0gaW8ubyBpZC5vIGlycS5vIHRpbWUubyBzZXJpYWwubyBkZXZpY2VzLm8KIGxlZC15IDo9IGxlZHMubwogCiAjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKQEAgLTIzLDYgKzIzLDcgQEAKIAogIyBMRURzIHN1cHBvcnQKIGxlZC0kKENPTkZJR19NQUNIX09NQVBfSDIpCQkrPSBsZWRzLWgycDItZGVidWcubworbGVkLSQoQ09ORklHX01BQ0hfT01BUF9IMykJCSs9IGxlZHMtaDJwMi1kZWJ1Zy5vCiBsZWQtJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikJKz0gbGVkcy1pbm5vdmF0b3IubwogbGVkLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikJKz0gbGVkcy1oMnAyLWRlYnVnLm8KIGxlZC0kKENPTkZJR19NQUNIX09NQVBfT1NLKQkJKz0gbGVkcy1vc2subwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwppbmRleCAxMjI3OTZlLi5jMjA5YzcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwpAQCAtNDgsMTkgKzQ4LDQzIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQogc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgZ2VuZXJpYzE2MTBfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJLm90ZwkJPSAxLAorI2VuZGlmCiAJLnJlZ2lzdGVyX2hvc3QJPSAxLAogCS5yZWdpc3Rlcl9kZXYJPSAxLAogCS5obWNfbW9kZQk9IDE2LAogCS5waW5zWzBdCT0gNiwKIH07CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGdlbmVyaWNfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5tbWMgWzBdID0geworCQkuZW5hYmxlZCAJPSAwLAorCQkud2lyZTQJCT0gMCwKKwkJLndwX3BpbgkJPSAtMSwKKwkJLnBvd2VyX3Bpbgk9IC0xLAorCQkuc3dpdGNoX3Bpbgk9IC0xLAorCX0sCisJLm1tYyBbMV0gPSB7CisJCS5lbmFibGVkIAk9IDAsCisJCS53aXJlNAkJPSAwLAorCQkud3BfcGluCQk9IC0xLAorCQkucG93ZXJfcGluCT0gLTEsCisJCS5zd2l0Y2hfcGluCT0gLTEsCisJfSwKK307CisKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBnZW5lcmljX2NvbmZpZ1tdID0gewogCXsgT01BUF9UQUdfVVNCLCAgICAgICAgICAgTlVMTCB9LAorCXsgT01BUF9UQUdfTU1DLCAgICAgICAgICAgJmdlbmVyaWNfbW1jX2NvbmZpZyB9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0KHZvaWQpCiB7CisJY29uc3Qgc3RydWN0IG9tYXBfdWFydF9jb25maWcgKnVhcnRfY29uZjsKKwogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBzZXJpYWwgcG9ydHMgYXJlIG11eGVkIG9uIGF0IHRoaXMgcG9pbnQuCiAJICogWW91IGhhdmUgdG8gbXV4IHRoZW0gb2ZmIGluIGRldmljZSBkcml2ZXJzIGxhdGVyIG9uCkBAIC03Niw2ICsxMDAsMTggQEAKIAkJZ2VuZXJpY19jb25maWdbMF0uZGF0YSA9ICZnZW5lcmljMTYxMF91c2JfY29uZmlnOwogCX0KICNlbmRpZgorCisJdWFydF9jb25mID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX1VBUlQsIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnKTsKKwlpZiAodWFydF9jb25mICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IGVuYWJsZWRfcG9ydHMsIGk7CisKKwkJZW5hYmxlZF9wb3J0cyA9IHVhcnRfY29uZi0+ZW5hYmxlZF91YXJ0czsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJaWYgKCEoZW5hYmxlZF9wb3J0cyAmICgxIDw8IGkpKSkKKwkJCQlnZW5lcmljX3NlcmlhbF9wb3J0c1tpXSA9IDA7CisJCX0KKwl9CisKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IGdlbmVyaWNfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGdlbmVyaWNfY29uZmlnKTsKIAlvbWFwX3NlcmlhbF9pbml0KGdlbmVyaWNfc2VyaWFsX3BvcnRzKTsKQEAgLTgzLDcgKzExOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcF9tYXBfY29tbW9uX2lvKCkKKwlvbWFwX21hcF9jb21tb25faW8oKTsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX0dFTkVSSUMsICJHZW5lcmljIE9NQVAxNTEwLzE2MTAvMTcxMCIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKaW5kZXggZjQ5ODNlZS4uZDQ2YTcwMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgpAQCAtODAsOCArODEsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoMl9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gT01BUF9DUzJCX1BIWVMsCi0JLmVuZAkJPSBPTUFQX0NTMkJfUEhZUyArIE9NQVBfQ1MyQl9TSVpFIC0gMSwKKwkvKiBUaGlzIGlzIG9uIENTMywgd2hlcmV2ZXIgaXQncyBtYXBwZWQgKi8KIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCkBAIC0xMjYsMTAgKzEyNiw5IEBACiAJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDAgZm9yIHNtYzkxeCBpcnFcbiIpOwogCQlyZXR1cm47CiAJfQotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDAsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOwogfQogCi12b2lkIGgyX2luaXRfaXJxKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdF9pcnEodm9pZCkKIHsKIAlvbWFwX2luaXRfaXJxKCk7CiAJb21hcF9ncGlvX2luaXQoKTsKQEAgLTE1Miw5ICsxNTEsMTMgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGgyX21tY19jb25maWcgX19pbml0ZGF0YSA9IHsKLQkubW1jX2Jsb2NrcwkJPSAxLAotCS5tbWMxX3Bvd2VyX3BpbgkJPSAtMSwJLyogdHBzNjUwMTAgZ3BpbzMgKi8KLQkubW1jMV9zd2l0Y2hfcGluCT0gT01BUF9NUFVJTygxKSwKKwkubW1jIFswXSA9IHsKKwkJLmVuYWJsZWQgCT0gMSwKKwkJLndpcmU0CQk9IDEsCisJCS53cF9waW4JCT0gT01BUF9NUFVJTygzKSwKKwkJLnBvd2VyX3Bpbgk9IC0xLAkvKiB0cHM2NTAxMCBncGlvMyAqLworCQkuc3dpdGNoX3Bpbgk9IE9NQVBfTVBVSU8oMSksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGgyX2NvbmZpZ1tdID0gewpAQCAtMTY0LDYgKzE2NywxNiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdCh2b2lkKQogeworCS8qIE5PVEU6IHJldkMgYm9hcmRzIHN1cHBvcnQgTkFORC1ib290LCB3aGljaCBjYW4gcHV0IE5PUiBvbiBDUzJCCisJICogYW5kIE5BTkQgKGVpdGhlciAxNmJpdCBvciA4Yml0KSBvbiBDUzMuCisJICovCisJaDJfZmxhc2hfcmVzb3VyY2UuZW5kID0gaDJfZmxhc2hfcmVzb3VyY2Uuc3RhcnQgPSBvbWFwX2NzM19waHlzKCk7CisJaDJfZmxhc2hfcmVzb3VyY2UuZW5kICs9IFNaXzMyTSAtIDE7CisKKwkvKiBNTUM6ICBjYXJkIGRldGVjdCBhbmQgV1AgKi8KKwkvLyBvbWFwX2NmZ19yZWcoVTE5X0FSTUlPMSk7CQkvKiBDRCAqLworCW9tYXBfY2ZnX3JlZyhCQUxMT1VUX1Y4X0FSTUlPMyk7CS8qIFdQICovCisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhoMl9kZXZpY2VzLCBBUlJBWV9TSVpFKGgyX2RldmljZXMpKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IGgyX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShoMl9jb25maWcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCmluZGV4IDdjZDQxOWQuLjI3OTg2MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKQEAgLTgyLDggKzgyLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDNfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IE9NQVBfQ1MyQl9QSFlTLAotCS5lbmQJCT0gT01BUF9DUzJCX1BIWVMgKyBPTUFQX0NTMkJfU0laRSAtIDEsCisJLyogVGhpcyBpcyBvbiBDUzMsIHdoZXJldmVyIGl0J3MgbWFwcGVkICovCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIApAQCAtMTYxLDEzICsxNjAsMjYgQEAKIAkucGluc1sxXQk9IDMsCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyBoM19tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLm1tY1swXSA9IHsKKwkJLmVuYWJsZWQgCT0gMSwKKwkJLnBvd2VyX3Bpbgk9IC0xLCAgIC8qIHRwczY1MDEwIEdQSU80ICovCisJCS5zd2l0Y2hfcGluCT0gT01BUF9NUFVJTygxKSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDNfY29uZmlnW10gPSB7CiAJeyBPTUFQX1RBR19VU0IsCSAmaDNfdXNiX2NvbmZpZyB9LAorCXsgT01BUF9UQUdfTU1DLCAgJmgzX21tY19jb25maWcgfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0KHZvaWQpCiB7CisJaDNfZmxhc2hfcmVzb3VyY2UuZW5kID0gaDNfZmxhc2hfcmVzb3VyY2Uuc3RhcnQgPSBvbWFwX2NzM19waHlzKCk7CisJaDNfZmxhc2hfcmVzb3VyY2UuZW5kICs9IE9NQVBfQ1MzX1NJWkUgLSAxOwogCSh2b2lkKSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKwlvbWFwX2JvYXJkX2NvbmZpZyA9IGgzX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShoM19jb25maWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaDNfaW5pdF9zbWM5MXgodm9pZCkKQEAgLTE3Nyw3ICsxODksNiBAQAogCQlwcmludGsoIkVycm9yIHJlcXVlc3RpbmcgZ3BpbyA0MCBmb3Igc21jOTF4IGlycVxuIik7CiAJCXJldHVybjsKIAl9Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoNDAsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOwogfQogCiB2b2lkIGgzX2luaXRfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwppbmRleCA5MWRlNjBhLi5kZjAzMTJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgpAQCAtMTczLDcgKzE3NCw2IEBACiAJCQlwcmludGsoIkVycm9yIHJlcXVlc3RpbmcgZ3BpbyAwIGZvciBzbWM5MXggaXJxXG4iKTsKIAkJCXJldHVybjsKIAkJfQotCQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgwLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwogCX0KIH0KIApAQCAtMjIwLDggKzIyMCwxOSBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyBpbm5vdmF0b3JfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5tbWMgWzBdID0geworCQkuZW5hYmxlZCAJPSAxLAorCQkud2lyZTQJCT0gMSwKKwkJLndwX3BpbgkJPSBPTUFQX01QVUlPKDMpLAorCQkucG93ZXJfcGluCT0gLTEsCS8qIEZQR0EgRjMgVUlPNDIgKi8KKwkJLnN3aXRjaF9waW4JPSAtMSwJLyogRlBHQSBGNCBVSU80MyAqLworCX0sCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBpbm5vdmF0b3JfY29uZmlnW10gPSB7CiAJeyBPTUFQX1RBR19VU0IsICAgICAgICAgTlVMTCB9LAorCXsgT01BUF9UQUdfTU1DLAkJJmlubm92YXRvcl9tbWNfY29uZmlnIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5ub3ZhdG9yX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbmV0c3Rhci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKaW5kZXggNjc1MGIyMC4uZDkwNGU2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKQEAgLTc1LDE2ICs3NSwxNSBAQAogCW1kZWxheSg1MCk7CS8qIDUwbXMgdW50aWwgUEhZIHJlYWR5ICovCiAJLyogc21jOTF4IGludGVycnVwdCBwaW4gKi8KIAlvbWFwX3JlcXVlc3RfZ3Bpbyg4KTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg4LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwogCiAJb21hcF9yZXF1ZXN0X2dwaW8oMTIpOwogCW9tYXBfcmVxdWVzdF9ncGlvKDEzKTsKIAlvbWFwX3JlcXVlc3RfZ3BpbygxNCk7CiAJb21hcF9yZXF1ZXN0X2dwaW8oMTUpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEyLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxMywgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTQsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE1LCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKKwlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxMiksIElSUVRfRkFMTElORyk7CisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoMTMpLCBJUlFUX0ZBTExJTkcpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDE0KSwgSVJRVF9GQUxMSU5HKTsKKwlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxNSksIElSUVRfRkFMTElORyk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhuZXRzdGFyX2RldmljZXMsIEFSUkFZX1NJWkUobmV0c3Rhcl9kZXZpY2VzKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCmluZGV4IDY4NDRlNTMuLjIxMTAzZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpAQCAtMjksMTEgKzI5LDE2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgpAQCAtNDEsMTIgKzQ2LDU2IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvc2s1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewoteyBPTUFQX09TS19OT1JfRkxBU0hfQkFTRSwgT01BUF9PU0tfTk9SX0ZMQVNIX1NUQVJULCBPTUFQX09TS19OT1JfRkxBU0hfU0laRSwKLQlNVF9ERVZJQ0UgfSwKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBvc2tfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIG9za19wYXJ0aXRpb25zW10gPSB7CisJLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLworCXsKKwkgICAgICAubmFtZQkJPSAiYm9vdGxvYWRlciIsCisJICAgICAgLm9mZnNldAkJPSAwLAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCS8qIGJvb3Rsb2FkZXIgcGFyYW1zIGluIHRoZSBuZXh0IHNlY3RvciAqLworCXsKKwkgICAgICAubmFtZQkJPSAicGFyYW1zIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMCwKKwl9LCB7CisJICAgICAgLm5hbWUJCT0gImtlcm5lbCIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gU1pfMk0sCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfSwgeworCSAgICAgIC5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKKwkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkgICAgICAuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0KIH07CiAKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBvc2tfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAwLCAwfTsKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBvc2tfZmxhc2hfZGF0YSA9IHsKKwkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkud2lkdGgJCT0gMiwKKwkucGFydHMJCT0gb3NrX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShvc2tfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9za19mbGFzaF9yZXNvdXJjZSA9IHsKKwkvKiB0aGlzIGlzIG9uIENTMywgd2hlcmV2ZXIgaXQncyBtYXBwZWQgKi8KKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvc2s1OTEyX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcGZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmb3NrX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJm9za19mbGFzaF9yZXNvdXJjZSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3NrNTkxMl9zbWM5MXhfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtODYsOSArMTM1LDE2IEBACiAJLnJlc291cmNlCT0gb3NrNTkxMl9jZl9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvc2s1OTEyX21jYnNwMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXBfbWNic3AiLAorCS5pZAkJPSAxLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9zazU5MTJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm9zazU5MTJfZmxhc2hfZGV2aWNlLAogCSZvc2s1OTEyX3NtYzkxeF9kZXZpY2UsCiAJJm9zazU5MTJfY2ZfZGV2aWNlLAorCSZvc2s1OTEyX21jYnNwMV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfc21jOTF4KHZvaWQpCkBAIC05Nyw3ICsxNTMsNiBAQAogCQlwcmludGsoIkVycm9yIHJlcXVlc3RpbmcgZ3BpbyAwIGZvciBzbWM5MXggaXJxXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgwLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwogCiAJLyogQ2hlY2sgRU1JRlMgd2FpdCBzdGF0ZXMgdG8gZml4IGVycm9ycyB3aXRoIFNNQ19HRVRfUEtUX0hEUiAqLwogCUVNSUZTX0NDUygxKSB8PSAweDI7CkBAIC0xMTAsMTEgKzE2NSwxMSBAQAogCQlwcmludGsoIkVycm9yIHJlcXVlc3RpbmcgZ3BpbyA2MiBmb3IgQ0YgaXJxXG4iKTsKIAkJcmV0dXJuOwogCX0KLQkvKiBpdCdzIHJlYWxseSBhY3RpdmUtbG93ICovCi0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoNjIsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCS8qIHRoZSBDRiBJL08gSVJRIGlzIHJlYWxseSBhY3RpdmUtbG93ICovCisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoNjIpLCBJUlFUX0ZBTExJTkcpOwogfQogCi12b2lkIG9za19pbml0X2lycSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG9za19pbml0X2lycSh2b2lkKQogewogCW9tYXBfaW5pdF9pcnEoKTsKIAlvbWFwX2dwaW9faW5pdCgpOwpAQCAtMTQyLDE4ICsxOTcsNjkgQEAKIAl7IE9NQVBfVEFHX1VTQiwgICAgICAgICAgICZvc2tfdXNiX2NvbmZpZyB9LAogfTsKIAorI2lmZGVmCUNPTkZJR19PTUFQX09TS19NSVNUUkFMCisKKyNpZmRlZglDT05GSUdfUE0KK3N0YXRpYyBpcnFyZXR1cm5fdAorb3NrX21pc3RyYWxfd2FrZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaWdub3JlZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWlzdHJhbF9pbml0KHZvaWQpCit7CisJLyogRklYTUUgaGVyZSdzIHdoZXJlIHRvIGZlZWQgaW4gZnJhbWVidWZmZXIsIHRvdWNocGFkLCBhbmQKKwkgKiBrZXlib2FyZCBzZXR1cCAuLi4gIG5vdCBpbiB0aGUgZHJpdmVycyBmb3IgdGhvc2UgZGV2aWNlcyEKKwkgKgorCSAqIE5PVEU6ICB3ZSBjb3VsZCBhY3R1YWxseSB0ZWxsIGlmIHRoZXJlJ3MgYSBNaXN0cmFsIGJvYXJkCisJICogYXR0YWNoZWQsIGUuZy4gYnkgdHJ5aW5nIHRvIHJlYWQgc29tZXRoaW5nIGZyb20gdGhlIGFkczc4NDYuCisJICogQnV0IHRoaXMgaXMgdG9vIGVhcmx5IGZvciB0aGF0Li4uCisJICovCisKKwkvKiB0aGUgc2lkZXdheXMgYnV0dG9uIChTVzEpIGlzIGZvciB1c2UgYXMgYSAid2FrZXVwIiBidXR0b24gKi8KKwlvbWFwX2NmZ19yZWcoTjE1XzE2MTBfTVBVSU8yKTsKKwlpZiAob21hcF9yZXF1ZXN0X2dwaW8oT01BUF9NUFVJTygyKSkgPT0gMCkgeworCQlpbnQgcmV0ID0gMDsKKwkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oT01BUF9NUFVJTygyKSwgMSk7CisJCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKE9NQVBfTVBVSU8oMikpLCBJUlFUX1JJU0lORyk7CisjaWZkZWYJQ09ORklHX1BNCisJCS8qIHNoYXJlIHRoZSBJUlEgaW4gY2FzZSBzb21lb25lIHdhbnRzIHRvIHVzZSB0aGUKKwkJICogYnV0dG9uIGZvciBtb3JlIHRoYW4gd2FrZXVwIGZyb20gc3lzdGVtIHNsZWVwLgorCQkgKi8KKwkJcmV0ID0gcmVxdWVzdF9pcnEoT01BUF9HUElPX0lSUShPTUFQX01QVUlPKDIpKSwKKwkJCQkmb3NrX21pc3RyYWxfd2FrZV9pbnRlcnJ1cHQsCisJCQkJU0FfU0hJUlEsICJtaXN0cmFsX3dha2V1cCIsCisJCQkJJm9za19taXN0cmFsX3dha2VfaW50ZXJydXB0KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlvbWFwX2ZyZWVfZ3BpbyhPTUFQX01QVUlPKDIpKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiT1NLK01pc3RyYWw6IG5vIHdha2V1cCBpcnEsICVkP1xuIiwKKwkJCQlyZXQpOworCQl9IGVsc2UKKwkJCWVuYWJsZV9pcnFfd2FrZShPTUFQX0dQSU9fSVJRKE9NQVBfTVBVSU8oMikpKTsKKyNlbmRpZgorCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIk9TSytNaXN0cmFsOiB3YWtldXAgYnV0dG9uIGlzIGF3b2xcbiIpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWlzdHJhbF9pbml0KHZvaWQpIHsgfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIF9faW5pdCBvc2tfaW5pdCh2b2lkKQogeworCW9za19mbGFzaF9yZXNvdXJjZS5lbmQgPSBvc2tfZmxhc2hfcmVzb3VyY2Uuc3RhcnQgPSBvbWFwX2NzM19waHlzKCk7CisJb3NrX2ZsYXNoX3Jlc291cmNlLmVuZCArPSBTWl8zMk0gLSAxOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG9zazU5MTJfZGV2aWNlcywgQVJSQVlfU0laRShvc2s1OTEyX2RldmljZXMpKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IG9za19jb25maWc7CiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUob3NrX2NvbmZpZyk7CiAJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHIHw9ICgzIDw8IDEpOworCisJb3NrX21pc3RyYWxfaW5pdCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb3NrX21hcF9pbyh2b2lkKQogewogCW9tYXBfbWFwX2NvbW1vbl9pbygpOwotCWlvdGFibGVfaW5pdChvc2s1OTEyX2lvX2Rlc2MsIEFSUkFZX1NJWkUob3NrNTkxMl9pb19kZXNjKSk7CiAJb21hcF9zZXJpYWxfaW5pdChvc2tfc2VyaWFsX3BvcnRzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCmluZGV4IDIxMzMxNzMuLjEwN2M2OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgpAQCAtODMsOCArODQsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwMl9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gT01BUF9GTEFTSF8wX1NUQVJULAotCS5lbmQJCT0gT01BUF9GTEFTSF8wX1NUQVJUICsgT01BUF9GTEFTSF8wX1NJWkUgLSAxLAorCS5zdGFydAkJPSBPTUFQX0NTMF9QSFlTLAorCS5lbmQJCT0gT01BUF9DUzBfUEhZUyArIFNaXzMyTSAtIDEsCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKaW5kZXggZTQyMjgxOTguLmJmMzBiMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwpAQCAtMjUsMTMgKzI1LDE0IEBACiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogCiBleHRlcm4gdm9pZCBvbWFwX2luaXRfdGltZSh2b2lkKTsKIGV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CkBAIC03NCw3ICs3NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDEsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0xLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSB2b2ljZWJsdWVfcG9ydHMsCiAJfSwKQEAgLTg2LDYgKzg3LDI3IEBACiB9CiBhcmNoX2luaXRjYWxsKGV4dF91YXJ0X2luaXQpOwogCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgdm9pY2VibHVlX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHZvaWNlYmx1ZV9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBPTUFQX0NTMF9QSFlTLAorCS5lbmQJPSBPTUFQX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZvaWNlYmx1ZV9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXBmbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnZvaWNlYmx1ZV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZ2b2ljZWJsdWVfZmxhc2hfcmVzb3VyY2UsCit9OworCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSBPTUFQX0NTMl9QSFlTICsgMHgzMDAsCkBAIC0xMDcsNiArMTI5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp2b2ljZWJsdWVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnZvaWNlYmx1ZV9mbGFzaF9kZXZpY2UsCiAJJnZvaWNlYmx1ZV9zbWM5MXhfZGV2aWNlLAogfTsKIApAQCAtMTE5LDggKzE0MiwxNyBAQAogCS5waW5zWzJdCT0gNiwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIHZvaWNlYmx1ZV9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLm1tY1swXSA9IHsKKwkJLmVuYWJsZWQJPSAxLAorCQkucG93ZXJfcGluCT0gMiwKKwkJLnN3aXRjaF9waW4JPSAtMSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgdm9pY2VibHVlX2NvbmZpZ1tdID0gewogCXsgT01BUF9UQUdfVVNCLCAmdm9pY2VibHVlX3VzYl9jb25maWcgfSwKKwl7IE9NQVBfVEFHX01NQywgJnZvaWNlYmx1ZV9tbWNfY29uZmlnIH0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdm9pY2VibHVlX2luaXRfaXJxKHZvaWQpCkBAIC0xMzEsOSArMTYzLDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0KHZvaWQpCiB7Ci0JLyogVGhlcmUgaXMgYSBnb29kIGNoYW5jZSBib2FyZCBpcyBnb2luZyB1cCwgc28gZW5hYmxlIFBvd2VyIExFRAotCSAqIChpdCBpcyBjb25uZWN0ZWQgdGhyb3VnaCBpbnZlcnRvcikgKi8KLQlvbWFwX3dyaXRlYigweDAwLCBPTUFQX0xQRzFfTENSKTsKIAkvKiBXYXRjaGRvZyAqLwogCW9tYXBfcmVxdWVzdF9ncGlvKDApOwogCS8qIHNtYzkxeCByZXNldCAqLwpAQCAtMTQ1LDcgKzE3NCw2IEBACiAJbWRlbGF5KDUwKTsJLyogNTBtcyB1bnRpbCBQSFkgcmVhZHkgKi8KIAkvKiBzbWM5MXggaW50ZXJydXB0IHBpbiAqLwogCW9tYXBfcmVxdWVzdF9ncGlvKDgpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDgsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CiAJLyogMTZDNTU0IHJlc2V0Ki8KIAlvbWFwX3JlcXVlc3RfZ3Bpbyg2KTsKIAlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig2LCAwKTsKQEAgLTE1NSwxNCArMTgzLDE5IEBACiAJb21hcF9yZXF1ZXN0X2dwaW8oMTMpOwogCW9tYXBfcmVxdWVzdF9ncGlvKDE0KTsKIAlvbWFwX3JlcXVlc3RfZ3BpbygxNSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTIsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTMsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTQsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTUsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoMTIpLCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoMTMpLCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoMTQpLCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoMTUpLCBJUlFUX1JJU0lORyk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh2b2ljZWJsdWVfZGV2aWNlcywgQVJSQVlfU0laRSh2b2ljZWJsdWVfZGV2aWNlcykpOwogCW9tYXBfYm9hcmRfY29uZmlnID0gdm9pY2VibHVlX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRSh2b2ljZWJsdWVfY29uZmlnKTsKKworCS8qIFRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgYm9hcmQgaXMgZ29pbmcgdXAsIHNvIGVuYWJsZSBwb3dlciBMRUQKKwkgKiAoaXQgaXMgY29ubmVjdGVkIHRocm91Z2ggaW52ZXJ0b3IpICovCisJb21hcF93cml0ZWIoMHgwMCwgT01BUF9MUEcxX0xDUik7CisJb21hcF93cml0ZWIoMHgwMCwgT01BUF9MUEcxX1BNUik7CS8qIERpc2FibGUgY2xvY2sgKi8KIH0KIAogc3RhdGljIGludCBfX2luaXRkYXRhIG9tYXBfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKQEAgLTE4NCw5ICsyMTcsOSBAQAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KE1BQ0hJTkVfUEFOSUNFRCwgJm1hY2hpbmVfc3RhdGUpKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQkvKiBGbGFzaCBQb3dlciBMRUQKLQkgKiAoVE9ETzogRW5hYmxlIGNsb2NrIHJpZ2h0IHdheSAoZW5hYmxlZCBpbiBib290bG9hZGVyIGFscmVhZHkpKSAqLworCS8qIEZsYXNoIHBvd2VyIExFRCAqLwogCW9tYXBfd3JpdGViKDB4NzgsIE9NQVBfTFBHMV9MQ1IpOworCW9tYXBfd3JpdGViKDB4MDEsIE9NQVBfTFBHMV9QTVIpOwkvKiBFbmFibGUgY2xvY2sgKi8KIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KQEAgLTE5NSwxNSArMjI4LDE0IEBACiAJLm5vdGlmaWVyX2NhbGwJPSBwYW5pY19ldmVudCwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX25vdGlmaWVyKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB2b2ljZWJsdWVfc2V0dXAodm9pZCkKIHsKIAkvKiBTZXR1cCBwYW5pYyBub3RpZmllciAqLwogCW5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmcGFuaWNfYmxvY2spOwogCiAJcmV0dXJuIDA7CiB9Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKHNldHVwX25vdGlmaWVyKTsKK3Bvc3Rjb3JlX2luaXRjYWxsKHZvaWNlYmx1ZV9zZXR1cCk7CiAKIHN0YXRpYyBpbnQgd2R0X2dwaW9fc3RhdGU7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiMzk4MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKKyAqCisgKiBPTUFQMSBwbGF0Zm9ybSBkZXZpY2Ugc2V0dXAvaW5pdGlhbGl6YXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKworCitzdGF0aWMgdm9pZCBvbWFwX25vcF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAgICAgICAgLyogTm90aGluZyAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYJZGVmaW5lZChDT05GSUdfSTJDX09NQVApIHx8IGRlZmluZWQoQ09ORklHX0kyQ19PTUFQX01PRFVMRSkKKworI2RlZmluZQlPTUFQX0kyQ19CQVNFCQkweGZmZmIzODAwCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IE9NQVBfSTJDX0JBU0UsCisJCS5lbmQJCT0gT01BUF9JMkNfQkFTRSArIDB4M2YsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElOVF9JMkMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworLyogRE1BIG5vdCB1c2VkOyB3b3JrcyBhcm91bmQgZXJyYXR1bSB3cml0aW5nIHRvIG5vbi1lbXB0eSBpMmMgZmlmbyAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwX2kyY19kZXZpY2UgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJpMmNfb21hcCIsCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IC0xLAorICAgICAgICAuZGV2ID0geworICAgICAgICAgICAgICAgIC5yZWxlYXNlICAgICAgICA9IG9tYXBfbm9wX3JlbGVhc2UsCisgICAgICAgIH0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGkyY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGkyY19yZXNvdXJjZXMsCit9OworCitzdGF0aWMgdm9pZCBvbWFwX2luaXRfaTJjKHZvaWQpCit7CisJLyogRklYTUUgZGVmaW5lIGFuZCB1c2UgYSBib290IHRhZywgaW4gY2FzZSBvZiBib2FyZHMgdGhhdAorCSAqIGVpdGhlciBkb24ndCB3aXJlIHVwIEkyQywgb3IgY2hpcHMgdGhhdCBtdXggaXQgZGlmZmVyZW50bHkuLi4KKwkgKiBpdCBjYW4gaW5jbHVkZSBjbG9ja2luZyBhbmQgYWRkcmVzcyBpbmZvLCBtYXliZSBtb3JlLgorCSAqLworCW9tYXBfY2ZnX3JlZyhJMkNfU0NMKTsKKwlvbWFwX2NmZ19yZWcoSTJDX1NEQSk7CisKKwkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwX2kyY19kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfaTJjKHZvaWQpIHt9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmCWRlZmluZWQoQ09ORklHX09NQVAxNjEwX0lSKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMTYxT19JUl9NT0RVTEUpCisKK3N0YXRpYyB1NjQgaXJkYV9kbWFtYXNrID0gMHhmZmZmZmZmZjsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2MTBpcl9kZXZpY2UgPSB7CisJLm5hbWUgPSAib21hcDE2MTAtaXIiLAorCS5pZCA9IC0xLAorCS5kZXYgPSB7CisJCS5yZWxlYXNlCT0gb21hcF9ub3BfcmVsZWFzZSwKKwkJLmRtYV9tYXNrCT0gJmlyZGFfZG1hbWFzaywKKwl9LAorfTsKKworc3RhdGljIHZvaWQgb21hcF9pbml0X2lyZGEodm9pZCkKK3sKKwkvKiBGSVhNRSBkZWZpbmUgYW5kIHVzZSBhIGJvb3QgdGFnLCBtZW1iZXJzIHNvbWV0aGluZyBsaWtlOgorCSAqICB1OAkJdWFydDsJCS8vIHVhcnQxLCBvciB1YXJ0MworCSAqIC4uLiBidXQgZHJpdmVyIG9ubHkgaGFuZGxlcyB1YXJ0MyBmb3Igbm93CisJICogIHMxNgkJZmlyX3NlbDsJLy8gZ3BpbyBmb3IgU0lSIHZzIEZJUgorCSAqIC4uLiBtYXkgcHJlZmVyIGEgY2FsbGJhY2sgZm9yIFNJUi9NSVIvRklSIG1vZGUgc2VsZWN0OworCSAqIHdoaWxlIGgyIHVzZXMgYSBHUElPLCBIMyB1c2VzIGEgZ3BpbyBleHBhbmRlcgorCSAqLworCWlmIChtYWNoaW5lX2lzX29tYXBfaDIoKQorCQkJfHwgbWFjaGluZV9pc19vbWFwX2gzKCkpCisJCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAxNjEwaXJfZGV2aWNlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X2lyZGEodm9pZCkge30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYJZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKworI2RlZmluZQlPTUFQX01NQzFfQkFTRQkJMHhmZmZiNzgwMAorI2RlZmluZQlPTUFQX01NQzJfQkFTRQkJMHhmZmZiN2MwMAkvKiBvbWFwMTZ4eCBvbmx5ICovCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZiBtbWMxX2NvbmY7CisKK3N0YXRpYyB1NjQgbW1jMV9kbWFtYXNrID0gMHhmZmZmZmZmZjsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtbWMxX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IElPX0FERFJFU1MoT01BUF9NTUMxX0JBU0UpLAorCQkuZW5kCQk9IElPX0FERFJFU1MoT01BUF9NTUMxX0JBU0UpICsgMHg3ZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gSU5UX01NQywKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtbWNfb21hcF9kZXZpY2UxID0geworCS5uYW1lCQk9ICJtbWNpLW9tYXAiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5yZWxlYXNlCT0gb21hcF9ub3BfcmVsZWFzZSwKKwkJLmRtYV9tYXNrCT0gJm1tYzFfZG1hbWFzaywKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbW1jMV9jb25mLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG1tYzFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtbWMxX3Jlc291cmNlcywKK307CisKKyNpZmRlZglDT05GSUdfQVJDSF9PTUFQMTZYWAorCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmYgbW1jMl9jb25mOworCitzdGF0aWMgdTY0IG1tYzJfZG1hbWFzayA9IDB4ZmZmZmZmZmY7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jMl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBJT19BRERSRVNTKE9NQVBfTU1DMl9CQVNFKSwKKwkJLmVuZAkJPSBJT19BRERSRVNTKE9NQVBfTU1DMl9CQVNFKSArIDB4N2YsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElOVF8xNjEwX01NQzIsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW1jX29tYXBfZGV2aWNlMiA9IHsKKwkubmFtZQkJPSAibW1jaS1vbWFwIiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucmVsZWFzZQk9IG9tYXBfbm9wX3JlbGVhc2UsCisJCS5kbWFfbWFzawk9ICZtbWMyX2RtYW1hc2ssCisJCS5wbGF0Zm9ybV9kYXRhCT0gJm1tYzJfY29uZiwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtbWMyX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbW1jMl9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2luaXRfbW1jKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IG9tYXBfbW1jX2NvbmZpZwkqbW1jX2NvbmY7CisJY29uc3Qgc3RydWN0IG9tYXBfbW1jX2NvbmYJKm1tYzsKKworCS8qIE5PVEU6ICBhc3N1bWVzIE1NQyB3YXMgbmV2ZXIgKHdyb25nbHkpIGVuYWJsZWQgKi8KKwltbWNfY29uZiA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19NTUMsIHN0cnVjdCBvbWFwX21tY19jb25maWcpOworCWlmICghbW1jX2NvbmYpCisJCXJldHVybjsKKworCS8qIGJsb2NrIDEgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgaGFzIGp1c3Qgb25lIHBpbm91dCBvcHRpb24gKi8KKwltbWMgPSAmbW1jX2NvbmYtPm1tY1swXTsKKwlpZiAobW1jLT5lbmFibGVkKSB7CisJCW9tYXBfY2ZnX3JlZyhNTUNfQ01EKTsKKwkJb21hcF9jZmdfcmVnKE1NQ19DTEspOworCQlvbWFwX2NmZ19yZWcoTU1DX0RBVDApOworCQlpZiAoY3B1X2lzX29tYXAxNzEwKCkpIHsKKwkgICAgICAgICAgICAgIG9tYXBfY2ZnX3JlZyhNMTVfMTcxMF9NTUNfQ0xLSSk7CisJICAgICAgICAgICAgICBvbWFwX2NmZ19yZWcoUDE5XzE3MTBfTU1DX0NNRERJUik7CisJICAgICAgICAgICAgICBvbWFwX2NmZ19yZWcoUDIwXzE3MTBfTU1DX0RBVERJUjApOworCSAgICAgICAgfQorCQlpZiAobW1jLT53aXJlNCkgeworCQkJb21hcF9jZmdfcmVnKE1NQ19EQVQxKTsKKwkJCS8qIE5PVEU6ICBEQVQyIGNhbiBiZSBvbiBXMTAgKGhlcmUpIG9yIE0xNSAqLworCQkJaWYgKCFtbWMtPm5vbXV4KQorCQkJCW9tYXBfY2ZnX3JlZyhNTUNfREFUMik7CisJCQlvbWFwX2NmZ19yZWcoTU1DX0RBVDMpOworCQl9CisJCW1tYzFfY29uZiA9ICptbWM7CisJCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1tY19vbWFwX2RldmljZTEpOworCX0KKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAxNlhYCisJLyogYmxvY2sgMiBpcyBvbiBuZXdlciBjaGlwcywgYW5kIGhhcyBtYW55IHBpbm91dCBvcHRpb25zICovCisJbW1jID0gJm1tY19jb25mLT5tbWNbMV07CisJaWYgKG1tYy0+ZW5hYmxlZCkgeworCQlpZiAoIW1tYy0+bm9tdXgpIHsKKwkJCW9tYXBfY2ZnX3JlZyhZOF8xNjEwX01NQzJfQ01EKTsKKwkJCW9tYXBfY2ZnX3JlZyhZMTBfMTYxMF9NTUMyX0NMSyk7CisJCQlvbWFwX2NmZ19yZWcoUjE4XzE2MTBfTU1DMl9DTEtJTik7CisJCQlvbWFwX2NmZ19yZWcoVzhfMTYxMF9NTUMyX0RBVDApOworCQkJaWYgKG1tYy0+d2lyZTQpIHsKKwkJCQlvbWFwX2NmZ19yZWcoVjhfMTYxMF9NTUMyX0RBVDEpOworCQkJCW9tYXBfY2ZnX3JlZyhXMTVfMTYxMF9NTUMyX0RBVDIpOworCQkJCW9tYXBfY2ZnX3JlZyhSMTBfMTYxMF9NTUMyX0RBVDMpOworCQkJfQorCisJCQkvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciB0aGUgbGV2ZWwgc2hpZnRlciAqLworCQkJb21hcF9jZmdfcmVnKFY5XzE2MTBfTU1DMl9DTURESVIpOworCQkJb21hcF9jZmdfcmVnKFY1XzE2MTBfTU1DMl9EQVRESVIwKTsKKwkJCW9tYXBfY2ZnX3JlZyhXMTlfMTYxMF9NTUMyX0RBVERJUjEpOworCQl9CisKKwkJLyogRmVlZGJhY2sgY2xvY2sgbXVzdCBiZSBzZXQgb24gT01BUC0xNzEwIE1NQzIgKi8KKwkJaWYgKGNwdV9pc19vbWFwMTcxMCgpKQorCQkJb21hcF93cml0ZWwob21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpIHwgKDEgPDwgMjQpLAorCQkJCSAgICAgTU9EX0NPTkZfQ1RSTF8xKTsKKwkJbW1jMl9jb25mID0gKm1tYzsKKwkJKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbW1jX29tYXBfZGV2aWNlMik7CisJfQorI2VuZGlmCisJcmV0dXJuOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfbW1jKHZvaWQpIHt9CisjZW5kaWYKKworI2lmCWRlZmluZWQoQ09ORklHX09NQVBfUlRDKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX1JUQykKKworI2RlZmluZQlPTUFQX1JUQ19CQVNFCQkweGZmZmI0ODAwCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IE9NQVBfUlRDX0JBU0UsCisJCS5lbmQJCT0gT01BUF9SVENfQkFTRSArIDB4NWYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElOVF9SVENfVElNRVIsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElOVF9SVENfQUxBUk0sCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9ydGNfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJvbWFwX3J0YyIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiA9IHsKKwkJLnJlbGVhc2UgICAgICAgID0gb21hcF9ub3BfcmVsZWFzZSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShydGNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBydGNfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHZvaWQgb21hcF9pbml0X3J0Yyh2b2lkKQoreworCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXBfcnRjX2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9ydGModm9pZCkge30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYJZGVmaW5lZChDT05GSUdfT01BUDE2WFhfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX09NQVAxNlhYX1dBVENIRE9HX01PRFVMRSkKKworI2RlZmluZQlPTUFQX1dEVF9CQVNFCQkweGZmZmViMDAwCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd2R0X3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IE9NQVBfV0RUX0JBU0UsCisJCS5lbmQJCT0gT01BUF9XRFRfQkFTRSArIDB4NGYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF93ZHRfZGV2aWNlID0geworCS5uYW1lCSAgID0gIm9tYXAxNjEwX3dkdCIsCisJLmlkCSAgICAgPSAtMSwKKwkuZGV2ID0geworCQkucmVsZWFzZQk9IG9tYXBfbm9wX3JlbGVhc2UsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUod2R0X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gd2R0X3Jlc291cmNlcywKK307CisKK3N0YXRpYyB2b2lkIG9tYXBfaW5pdF93ZHQodm9pZCkKK3sKKwkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwX3dkdF9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfd2R0KHZvaWQpIHt9CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCBhZnRlciBib2FyZC1zcGVjaWZpYyBJTklUX01BQ0hJTkUsIGFuZCBpbml0aWFsaXplcyBtb3N0CisgKiBvbi1jaGlwIHBlcmlwaGVyYWxzIGFjY2Vzc2libGUgb24gdGhpcyBib2FyZCAoZXhjZXB0IGZvciBmZXcgbGlrZSBVU0IpOgorICoKKyAqICAoYSkgRG9lcyBhbnkgInN0YW5kYXJkIGNvbmZpZyIgcGluIG11eGluZyBuZWVkZWQuICBCb2FyZC1zcGVjaWZpYworICoJY29kZSB3aWxsIGhhdmUgbXV4ZWQgR1BJTyBwaW5zIGFuZCBkb25lICJub25zdGFuZGFyZCIgc2V0dXA7CisgKgl0aGF0IGNvZGUgY291bGQgbGl2ZSBpbiB0aGUgYm9vdCBsb2FkZXIuCisgKiAgKGIpIFBvcHVsYXRpbmcgYm9hcmQtc3BlY2lmaWMgcGxhdGZvcm1fZGF0YSB3aXRoIHRoZSBkYXRhIGRyaXZlcnMKKyAqCXJlbHkgb24gdG8gaGFuZGxlIHdpcmluZyB2YXJpYXRpb25zLgorICogIChjKSBDcmVhdGluZyBwbGF0Zm9ybSBkZXZpY2VzIGFzIG1lYW5pbmdmdWwgb24gdGhpcyBib2FyZCBhbmQKKyAqCXdpdGggdGhpcyBrZXJuZWwgY29uZmlndXJhdGlvbi4KKyAqCisgKiBDbGFpbWluZyBHUElPcywgYW5kIHNldHRpbmcgdGhlaXIgZGlyZWN0aW9uIGFuZCBpbml0aWFsIHZhbHVlcywgaXMgdGhlCisgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgZGV2aWNlIGRyaXZlcnMuICBTbyBpcyByZXNwb25kaW5nIHRvIHByb2JlKCkuCisgKgorICogQm9hcmQtc3BlY2lmaWMga25vd2xlZ2UgbGlrZSBjcmVhdGluZyBkZXZpY2VzIG9yIHBpbiBzZXR1cCBpcyB0byBiZQorICoga2VwdCBvdXQgb2YgZHJpdmVycyBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSW4gcGFydGljdWxhciwgcGluIHNldHVwCisgKiBtYXkgYmUgaGFuZGxlZCBieSB0aGUgYm9vdCBsb2FkZXIsIGFuZCBkcml2ZXJzIHNob3VsZCBleHBlY3QgaXQgd2lsbAorICogbm9ybWFsbHkgaGF2ZSBiZWVuIGRvbmUgYnkgdGhlIHRpbWUgdGhleSdyZSBwcm9iZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdF9kZXZpY2VzKHZvaWQpCit7CisJLyogcGxlYXNlIGtlZXAgdGhlc2UgY2FsbHMsIGFuZCB0aGVpciBpbXBsZW1lbnRhdGlvbnMgYWJvdmUsCisJICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHNvIHRoZXkncmUgZWFzaWVyIHRvIHNvcnQgdGhyb3VnaC4KKwkgKi8KKwlvbWFwX2luaXRfaTJjKCk7CisJb21hcF9pbml0X2lyZGEoKTsKKwlvbWFwX2luaXRfbW1jKCk7CisJb21hcF9pbml0X3J0YygpOworCW9tYXBfaW5pdF93ZHQoKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChvbWFwX2luaXRfZGV2aWNlcyk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKaW5kZXggYzEyYTc4My4uYWNhMmExMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2ZwZ2EuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKICAqCiAgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgT01BUC0xNTEwIElubm92YXRvciBGUEdBCiAgKgpAQCAtMTgxLDcgKzE4MSw3IEBACiAJICovCiAJb21hcF9yZXF1ZXN0X2dwaW8oMTMpOwogCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDEzLCAxKTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxMywgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKwlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxMyksIElSUVRfUklTSU5HKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihPTUFQMTUxMF9JTlRfRlBHQSwgaW5ub3ZhdG9yX2ZwZ2FfSVJRX2RlbXV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCmluZGV4IDIwN2RmMGYuLmViODI2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogZXh0ZXJuIGludCBjbGtfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXBfY2hlY2tfcmV2aXNpb24odm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX3NyYW1faW5pdCh2b2lkKTsKIAogLyoKICAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgbWF5IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlcyB0aGUKQEAgLTMyLDcgKzMzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDczMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKICB7IE9NQVA3MzBfRFNQX0JBU0UsICAgIE9NQVA3MzBfRFNQX1NUQVJULCAgICBPTUFQNzMwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKICB7IE9NQVA3MzBfRFNQUkVHX0JBU0UsIE9NQVA3MzBfRFNQUkVHX1NUQVJULCBPTUFQNzMwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLSB7IE9NQVA3MzBfU1JBTV9CQVNFLCAgIE9NQVA3MzBfU1JBTV9TVEFSVCwgICBPTUFQNzMwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQogfTsKICNlbmRpZgogCkBAIC00MCwyNyArNDAsMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE1MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAgeyBPTUFQMTUxMF9EU1BfQkFTRSwgICAgT01BUDE1MTBfRFNQX1NUQVJULCAgICBPTUFQMTUxMF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCiAgeyBPTUFQMTUxMF9EU1BSRUdfQkFTRSwgT01BUDE1MTBfRFNQUkVHX1NUQVJULCBPTUFQMTUxMF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCi0geyBPTUFQMTUxMF9TUkFNX0JBU0UsICAgT01BUDE1MTBfU1JBTV9TVEFSVCwgICBPTUFQMTUxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNjEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMTZ4eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKICB7IE9NQVAxNlhYX0RTUF9CQVNFLCAgICBPTUFQMTZYWF9EU1BfU1RBUlQsICAgIE9NQVAxNlhYX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKICB7IE9NQVAxNlhYX0RTUFJFR19CQVNFLCBPTUFQMTZYWF9EU1BSRUdfU1RBUlQsIE9NQVAxNlhYX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLSB7IE9NQVAxNlhYX1NSQU1fQkFTRSwgICBPTUFQMTZYWF9TUkFNX1NUQVJULCAgIE9NQVAxNjEwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwNTkxMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLSB7IE9NQVAxNlhYX0RTUF9CQVNFLCAgICBPTUFQMTZYWF9EU1BfU1RBUlQsICAgIE9NQVAxNlhYX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKLSB7IE9NQVAxNlhYX0RTUFJFR19CQVNFLCBPTUFQMTZYWF9EU1BSRUdfU1RBUlQsIE9NQVAxNlhYX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLS8qCi0gKiBUaGUgT01BUDU5MTIgaGFzIDI1MGtCeXRlIGludGVybmFsIFNSQU0uIEJlY2F1c2UgdGhlIG1hcHBpbmcgaXMgYmFzZWVkIG9uIHBhZ2UKLSAqIHNpemUgKDRrQnl0ZSksIGl0IHNlZW1zIHRoYXQgdGhlIGxhc3QgMmtCeXRlICg9MHg4MDApIG9mIHRoZSAyNTBrQnl0ZSBhcmUgbm90IG1hcHBlZC4KLSAqIEFkZCBhZGRpdGlvbmFsIDJrQnl0ZSAoMHg4MDApIHNvIHRoYXQgdGhlIGxhc3QgcGFnZSBpcyBtYXBwZWQgYW5kIHRoZSBsYXN0IDJrQnl0ZQotICogY2FuIGJlIHVzZWQuCi0gKi8KLSB7IE9NQVAxNlhYX1NSQU1fQkFTRSwgICBPTUFQMTZYWF9TUkFNX1NUQVJULCAgIE9NQVA1OTEyX1NSQU1fU0laRSArIDB4ODAwLCAgIE1UX0RFVklDRSB9CiB9OwogI2VuZGlmCiAKQEAgLTg2LDE0ICs3MiwxMyBAQAogCX0KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0JaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7Ci0JCWlvdGFibGVfaW5pdChvbWFwMTYxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNjEwX2lvX2Rlc2MpKTsKLQl9Ci0JaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7Ci0JCWlvdGFibGVfaW5pdChvbWFwNTkxMl9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA1OTEyX2lvX2Rlc2MpKTsKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJaW90YWJsZV9pbml0KG9tYXAxNnh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE2eHhfaW9fZGVzYykpOwogCX0KICNlbmRpZgogCisJb21hcF9zcmFtX2luaXQoKTsKKwogCS8qIFJFVklTSVQ6IFJlZmVyIHRvIE9NQVA1OTEwIEVycmF0YSwgQWR2aXNvcnkgU1lTXzE6ICJUaW1lb3V0IEFib3J0CiAJICogb24gYSBQb3N0ZWQgV3JpdGUgaW4gdGhlIFRJUEIgQnJpZGdlIi4KIAkgKi8KQEAgLTEwOCw4ICs5Myw5IEBACiAvKgogICogVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAogICovCi12b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKQordm9pZCBfX2luaXQgb21hcF9tYXBfY29tbW9uX2lvKHZvaWQpCiB7CiAJaWYgKCFpbml0aWFsaXplZCkKIAkJX29tYXBfbWFwX2lvKCk7CiB9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCmluZGV4IGExMWI2ZDguLjE5MmNlNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKICAqCiAgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgYWxsIE9NQVAgYm9hcmRzCiAgKgpAQCAtMTY1LDEwICsxNjUsMTAgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGlycWNoaXAgb21hcF9pcnFfY2hpcCA9IHsKLQkuYWNrICAgID0gb21hcF9tYXNrX2Fja19pcnEsCi0JLm1hc2sgICA9IG9tYXBfbWFza19pcnEsCi0JLnVubWFzayA9IG9tYXBfdW5tYXNrX2lycSwKLQkud2FrZQk9IG9tYXBfd2FrZV9pcnEsCisJLmFjawkJPSBvbWFwX21hc2tfYWNrX2lycSwKKwkubWFzawkJPSBvbWFwX21hc2tfaXJxLAorCS51bm1hc2sJCT0gb21hcF91bm1hc2tfaXJxLAorCS5zZXRfd2FrZQk9IG9tYXBfd2FrZV9pcnEsCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwX2luaXRfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwppbmRleCBlYzBkODI4Li5iZTI4M2NkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaDJwMi1kZWJ1Zy5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCiAgKgogICogQ29weXJpZ2h0IDIwMDMgYnkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkCiAgKgpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaW5ub3ZhdG9yLmMKaW5kZXggODA0M2I3ZC4uYzhmZmQxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWlubm92YXRvci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1pbm5vdmF0b3IuYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWlubm92YXRvci5jCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKaW5kZXggNGEwZThiOS4uMmM4YmRhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYworICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCiAgKgogICogTEVEIGRyaXZlciBmb3IgT1NLLCBhbmQgb3B0aW9uYWxseSBNaXN0cmFsIFFWR0EsIGJvYXJkcwogICovCkBAIC02NCw3ICs2NCw3IEBACiAKIHN0YXRpYyBERUNMQVJFX1dPUksod29yaywgdHBzX3dvcmssIE5VTEwpOwogCi0jaWZkZWYJQ09ORklHX0ZCX09NQVAKKyNpZmRlZglDT05GSUdfT01BUF9PU0tfTUlTVFJBTAogCiAvKiBGb3Igbm93LCBhbGwgc3lzdGVtIGluZGljYXRvcnMgcmVxdWlyZSB0aGUgTWlzdHJhbCBib2FyZCwgc2luY2UgdGhhdAogICogTEVEIGNhbiBiZSBtYW5pcHVsYXRlZCB3aXRob3V0IGEgdGFzayBjb250ZXh0LiAgVGhpcyBMRUQgaXMgZWl0aGVyIHJlZCwKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQlod19sZWRfc3RhdGUgPSAwOwogCQlicmVhazsKIAotI2lmZGVmCUNPTkZJR19GQl9PTUFQCisjaWZkZWYJQ09ORklHX09NQVBfT1NLX01JU1RSQUwKIAogCWNhc2UgbGVkX3RpbWVyOgogCQlod19sZWRfc3RhdGUgXj0gVElNRVJfTEVEOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCW1pc3RyYWxfc2V0bGVkKCk7CiAJCWJyZWFrOwogCi0jZW5kaWYJLyogQ09ORklHX0ZCX09NQVAgKi8KKyNlbmRpZgkvKiBDT05GSUdfT01BUF9PU0tfTUlTVFJBTCAqLwogCiAJLyogImdyZWVuIiA9PSB0cHMgTEVEMSAobGVmdG1vc3QsIG5vcm1hbGx5IHBvd2VyLWdvb2QpCiAJICogd29ya3Mgb25seSB3aXRoIERDIGFkYXB0ZXIsIG5vdCBvbiBiYXR0ZXJ5IHBvd2VyIQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwppbmRleCA4YWIyMWZlLi41YzZiMWJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5jCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwogICoKICAqIE9NQVAgTEVEcyBkaXNwYXRjaGVyCiAgKi8KQEAgLTIwLDcgKzIwLDkgQEAKIAlpZiAobWFjaGluZV9pc19vbWFwX2lubm92YXRvcigpKQogCQlsZWRzX2V2ZW50ID0gaW5ub3ZhdG9yX2xlZHNfZXZlbnQ7CiAKLQllbHNlIGlmIChtYWNoaW5lX2lzX29tYXBfaDIoKSB8fCBtYWNoaW5lX2lzX29tYXBfcGVyc2V1czIoKSkKKwllbHNlIGlmIChtYWNoaW5lX2lzX29tYXBfaDIoKQorCQkJfHwgbWFjaGluZV9pc19vbWFwX2gzKCkKKwkJCXx8IG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpKQogCQlsZWRzX2V2ZW50ID0gaDJwMl9kYmdfbGVkc19ldmVudDsKIAogCWVsc2UgaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkKQEAgLTMwLDggKzMyLDEyIEBACiAJCXJldHVybiAtMTsKIAogCWlmIChtYWNoaW5lX2lzX29tYXBfaDIoKQorCQkJfHwgbWFjaGluZV9pc19vbWFwX2gzKCkKIAkJCXx8IG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpCi0JCQl8fCBtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKKyNpZmRlZglDT05GSUdfT01BUF9PU0tfTUlTVFJBTAorCQkJfHwgbWFjaGluZV9pc19vbWFwX29zaygpCisjZW5kaWYKKwkJCSkgewogCiAJCS8qIExFRDEvTEVEMiBwaW5zIGNhbiBiZSB1c2VkIGFzIEdQSU8gKGFzIGRvbmUgaGVyZSksIG9yIGJ5CiAJCSAqIHRoZSBMUEcgKHdvcmtzIGV2ZW4gaW4gZGVlcCBzbGVlcCEpLCB0byBkcml2ZSBhIGJpY29sb3IKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCmluZGV4IDIxNGU1ZDEuLjQwYzRmN2M0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKQEAgLTI0LDcgKzI0LDExIEBACiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisjaWZkZWYgQ09ORklHX1BNCisjaW5jbHVkZSA8YXNtL2FyY2gvcG0uaD4KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGNsayAqIHVhcnQxX2NrID0gTlVMTDsKIHN0YXRpYyBzdHJ1Y3QgY2xrICogdWFydDJfY2sgPSBOVUxMOwpAQCAtOTQsNyArOTgsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApAQCAtMTkzLDYgKzE5Nyw4NiBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19PTUFQX1NFUklBTF9XQUtFCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX3NlcmlhbF93YWtlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIE5lZWQgdG8gZG8gc29tZXRoaW5nIHdpdGggc2VyaWFsIHBvcnQgcmlnaHQgYWZ0ZXIgd2FrZS11cD8gKi8KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBSZXJvdXRlcyBzZXJpYWwgUlggbGluZXMgdG8gR1BJTyBsaW5lcyBmb3IgdGhlIGR1cmF0aW9uIG9mCisgKiBzbGVlcCB0byBhbGxvdyB3YWtpbmcgdXAgdGhlIGRldmljZSBmcm9tIHNlcmlhbCBwb3J0IGV2ZW4KKyAqIGluIGRlZXAgc2xlZXAuCisgKi8KK3ZvaWQgb21hcF9zZXJpYWxfd2FrZV90cmlnZ2VyKGludCBlbmFibGUpCit7CisJaWYgKCFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuOworCisJaWYgKHVhcnQxX2NrICE9IE5VTEwpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCW9tYXBfY2ZnX3JlZyhWMTRfMTZYWF9HUElPMzcpOworCQllbHNlCisJCQlvbWFwX2NmZ19yZWcoVjE0XzE2WFhfVUFSVDFfUlgpOworCX0KKwlpZiAodWFydDJfY2sgIT0gTlVMTCkgeworCQlpZiAoZW5hYmxlKQorCQkJb21hcF9jZmdfcmVnKFI5XzE2WFhfR1BJTzE4KTsKKwkJZWxzZQorCQkJb21hcF9jZmdfcmVnKFI5XzE2WFhfVUFSVDJfUlgpOworCX0KKwlpZiAodWFydDNfY2sgIT0gTlVMTCkgeworCQlpZiAoZW5hYmxlKQorCQkJb21hcF9jZmdfcmVnKEwxNF8xNlhYX0dQSU80OSk7CisJCWVsc2UKKwkJCW9tYXBfY2ZnX3JlZyhMMTRfMTZYWF9VQVJUM19SWCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9zZXJpYWxfc2V0X3BvcnRfd2FrZXVwKGludCBncGlvX25yKQoreworCWludCByZXQ7CisKKwlyZXQgPSBvbWFwX3JlcXVlc3RfZ3BpbyhncGlvX25yKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZXF1ZXN0IFVBUlQgd2FrZSBHUElPOiAlaVxuIiwKKwkJICAgICAgIGdwaW9fbnIpOworCQlyZXR1cm47CisJfQorCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGdwaW9fbnIsIDEpOworCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKGdwaW9fbnIpLCBJUlFUX1JJU0lORyk7CisJcmV0ID0gcmVxdWVzdF9pcnEoT01BUF9HUElPX0lSUShncGlvX25yKSwgJm9tYXBfc2VyaWFsX3dha2VfaW50ZXJydXB0LAorCQkJICAwLCAic2VyaWFsIHdha2V1cCIsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJb21hcF9mcmVlX2dwaW8oZ3Bpb19ucik7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gaW50ZXJydXB0IGZvciBVQVJUIHdha2UgR1BJTzogJWlcbiIsCisJCSAgICAgICBncGlvX25yKTsKKwkJcmV0dXJuOworCX0KKwllbmFibGVfaXJxX3dha2UoT01BUF9HUElPX0lSUShncGlvX25yKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfc2VyaWFsX3dha2V1cF9pbml0KHZvaWQpCit7CisJaWYgKCFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodWFydDFfY2sgIT0gTlVMTCkKKwkJb21hcF9zZXJpYWxfc2V0X3BvcnRfd2FrZXVwKDM3KTsKKwlpZiAodWFydDJfY2sgIT0gTlVMTCkKKwkJb21hcF9zZXJpYWxfc2V0X3BvcnRfd2FrZXVwKDE4KTsKKwlpZiAodWFydDNfY2sgIT0gTlVMTCkKKwkJb21hcF9zZXJpYWxfc2V0X3BvcnRfd2FrZXVwKDQ5KTsKKworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChvbWFwX3NlcmlhbF93YWtldXBfaW5pdCk7CisKKyNlbmRpZgkvKiBDT05GSUdfT01BUF9TRVJJQUxfV0FLRSAqLworCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKaW5kZXggZDU0MDUzOS4uMTkxYTliMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKQEAgLTI0NywxMyArMjQ3LDYgQEAKICNkZWZpbmUgT01BUF8zMktfVElNRVJfVENSCQkweDA0CiAKICNkZWZpbmUgT01BUF8zMktfVElDS1NfUEVSX0haCQkoMzI3NjggLyBIWikKLSNpZiAoMzI3NjggJSBIWikgIT0gMAotLyogV2UgY2Fubm90IGlnbm9yZSBtb2R1bG8uCi0gKiBQb3RlbnRpYWwgZXJyb3IgY2FuIGJlIGFzIGhpZ2ggYXMgc2V2ZXJhbCBwZXJjZW50LgotICovCi0jZGVmaW5lIE9NQVBfMzJLX1RJQ0tfTU9EVUxPCQkoMzI3NjggJSBIWikKLXN0YXRpYyB1bnNpZ25lZCBtb2R1bG9fY291bnQgPSAwOyAvKiBDb3VudHMgMS9IWiB1bml0cyAqLwotI2VuZGlmCiAKIC8qCiAgKiBUUk0gc2F5cyAxIC8gSFogPSAoIFRWUiArIDEpIC8gMzI3NjgsIHNvIFRSViA9ICgzMjc2OCAvIEhaKSAtIDEKQEAgLTI5NiwxMyArMjg5LDIyIEBACiB9CiAKIC8qCi0gKiBSb3VuZHMgZG93biB0byBuZWFyZXN0IHVzZWMKKyAqIFJvdW5kcyBkb3duIHRvIG5lYXJlc3QgdXNlYy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVyZmxvdyBmb3IgbGFyZ2VyIHZhbHVlcy4KICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX3RpY2tzX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgdGlja3NfMzJrKQogewogCXJldHVybiAodGlja3NfMzJrICogNSo1KjUqNSo1KjUpID4+IDk7CiB9CiAKKy8qCisgKiBSb3VuZHMgZG93biB0byBuZWFyZXN0IG5zZWMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitvbWFwXzMya190aWNrc190b19uc2Vjcyh1bnNpZ25lZCBsb25nIHRpY2tzXzMyaykKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZykgdGlja3NfMzJrICogMTAwMCAqIDUqNSo1KjUqNSo1ID4+IDk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX2xhc3RfdGljayA9IDA7CiAKIC8qCkBAIC0zMTUsNiArMzE3LDE1IEBACiB9CiAKIC8qCisgKiBSZXR1cm5zIGN1cnJlbnQgdGltZSBmcm9tIGJvb3QgaW4gbnNlY3MuIEl0J3MgT0sgZm9yIHRoaXMgdG8gd3JhcAorICogYXJvdW5kIGZvciBub3csIGFzIGl0J3MganVzdCBhIHJlbGF0aXZlIHRpbWUgc3RhbXAuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXJldHVybiBvbWFwXzMya190aWNrc190b19uc2VjcyhvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKSk7Cit9CisKKy8qCiAgKiBUaW1lciBpbnRlcnJ1cHQgZm9yIDMyS0h6IHRpbWVyLiBXaGVuIGR5bmFtaWMgdGljayBpcyBlbmFibGVkLCB0aGlzCiAgKiBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIG90aGVyIGludGVycnVwdHMgdG8gcmVtb3ZlIGxhdGVuY3kKICAqIGlzc3VlcyB3aXRoIGR5bmFtaWMgdGljay4gSW4gdGhlIGR5bmFtaWMgdGljayBjYXNlLCB3ZSBuZWVkIHRvIGxvY2sKQEAgLTMzMCwxOSArMzQxLDYgQEAKIAlub3cgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKIAogCXdoaWxlIChub3cgLSBvbWFwXzMya19sYXN0X3RpY2sgPj0gT01BUF8zMktfVElDS1NfUEVSX0haKSB7Ci0jaWZkZWYgT01BUF8zMktfVElDS19NT0RVTE8KLQkJLyogTW9kdWxvIGFkZGl0aW9uIG1heSBwdXQgb21hcF8zMmtfbGFzdF90aWNrIGFoZWFkIG9mIG5vdwotCQkgKiBhbmQgY2F1c2UgdW53YW50ZWQgcmVwZXRpdGlvbiBvZiB0aGUgd2hpbGUgbG9vcC4KLQkJICovCi0JCWlmICh1bmxpa2VseShub3cgLSBvbWFwXzMya19sYXN0X3RpY2sgPT0gfjApKQotCQkJYnJlYWs7Ci0KLQkJbW9kdWxvX2NvdW50ICs9IE9NQVBfMzJLX1RJQ0tfTU9EVUxPOwotCQlpZiAobW9kdWxvX2NvdW50ID4gSFopIHsKLQkJCSsrb21hcF8zMmtfbGFzdF90aWNrOwotCQkJbW9kdWxvX2NvdW50IC09IEhaOwotCQl9Ci0jZW5kaWYKIAkJb21hcF8zMmtfbGFzdF90aWNrICs9IE9NQVBfMzJLX1RJQ0tTX1BFUl9IWjsKIAkJdGltZXJfdGljayhyZWdzKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCmluZGV4IGVmYzJmNjUuLjMzZGFlOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCkBAIC0xMSw3ICsxMSw3IEBACiBvYmotJChDT05GSUdfQVJDSF9MVUJCT0NLKSArPSBsdWJib2NrLm8KIG9iai0kKENPTkZJR19NQUNIX01BSU5TVE9ORSkgKz0gbWFpbnN0b25lLm8KIG9iai0kKENPTkZJR19BUkNIX1BYQV9JRFApICs9IGlkcC5vCi1vYmotJChDT05GSUdfUFhBX1NIQVJQX0M3eHgpCSs9IGNvcmdpLm8gY29yZ2lfc3NwLm8gc3NwLm8KK29iai0kKENPTkZJR19QWEFfU0hBUlBfQzd4eCkJKz0gY29yZ2kubyBjb3JnaV9zc3AubyBjb3JnaV9sY2QubyBzc3Aubwogb2JqLSQoQ09ORklHX01BQ0hfUE9PRExFKQkrPSBwb29kbGUubwogCiAjIFN1cHBvcnQgZm9yIGJsaW5reSBsaWdodHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCmluZGV4IDA2ZWE3MzAuLjA3YjVkZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwpAQCAtMzksNyArMzksNiBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvc2hhcnBzbF9wYXJhbS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgotI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCkBAIC04Nyw3ICs4Niw3IEBACiAgKiBhbHNvIHVzZSBzY29vcCBmdW5jdGlvbnMgYW5kIHRoaXMgbWFrZXMgdGhlIHBvd2VyIHVwL2Rvd24gb3JkZXIKICAqIHdvcmsgY29ycmVjdGx5LgogICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXNzcF9kZXZpY2UgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpc3NwX2RldmljZSA9IHsKIAkubmFtZQkJPSAiY29yZ2ktc3NwIiwKIAkuZGV2CQk9IHsKICAJCS5wYXJlbnQgPSAmY29yZ2lzY29vcF9kZXZpY2UuZGV2LApAQCAtOTcsMzUgKzk2LDYgQEAKIAogCiAvKgotICogQ29yZ2kgdzEwMCBGcmFtZSBCdWZmZXIgRGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdzEwMGZiX21hY2hfaW5mbyBjb3JnaV9mYl9pbmZvID0gewotCS53MTAwZmJfc3NwX3NlbmQgCT0gY29yZ2lfc3NwX2xjZHRnX3NlbmQsCi0JLmNvbWFkaiAJCQk9IC0xLAotCS5waGFkYWRqIAkJCT0gLTEsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNvcmdpX2ZiX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IDB4MDgwMDAwMDAsCi0JCS5lbmQJCT0gMHgwOGZmZmZmZiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaWZiX2RldmljZSA9IHsKLQkubmFtZQkJPSAidzEwMGZiIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0gCQkucGxhdGZvcm1fZGF0YQk9ICZjb3JnaV9mYl9pbmZvLAotIAkJLnBhcmVudCA9ICZjb3JnaXNzcF9kZXZpY2UuZGV2LAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvcmdpX2ZiX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gY29yZ2lfZmJfcmVzb3VyY2VzLAotfTsKLQotCi0vKgogICogQ29yZ2kgQmFja2xpZ2h0IERldmljZQogICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaWJsX2RldmljZSA9IHsKQEAgLTEzOCwyOSArMTA4LDM1IEBACiAKIAogLyoKKyAqIENvcmdpIEtleWJvYXJkIERldmljZQorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaWtiZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImNvcmdpLWtleWJvYXJkIiwKKwkuaWQJCT0gLTEsCit9OworCisKKy8qCisgKiBDb3JnaSBUb3VjaCBTY3JlZW4gRGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpdHNfZGV2aWNlID0geworCS5uYW1lCQk9ICJjb3JnaS10cyIsCisJLmRldgkJPSB7CisgCQkucGFyZW50ID0gJmNvcmdpc3NwX2RldmljZS5kZXYsCisJfSwKKwkuaWQJCT0gLTEsCit9OworCisKKy8qCiAgKiBNTUMvU0QgRGV2aWNlCiAgKgotICogVGhlIGNhcmQgZGV0ZWN0IGludGVycnVwdCBpc24ndCBkZWJvdW5jZWQgc28gd2UgZGVsYXkgaXQgYnkgSFovNAorICogVGhlIGNhcmQgZGV0ZWN0IGludGVycnVwdCBpc24ndCBkZWJvdW5jZWQgc28gd2UgZGVsYXkgaXQgYnkgMjUwbXMKICAqIHRvIGdpdmUgdGhlIGNhcmQgYSBjaGFuY2UgdG8gZnVsbHkgaW5zZXJ0L2VqZWN0LgogICovCi1zdGF0aWMgc3RydWN0IG1tY19kZXRlY3QgewotCXN0cnVjdCB0aW1lcl9saXN0IGRldGVjdF90aW1lcjsKLQl2b2lkICpkZXZpZDsKLX0gbW1jX2RldGVjdDsKK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGE7CiAKLXN0YXRpYyB2b2lkIG1tY19kZXRlY3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQotewotCW1tY19kZXRlY3RfY2hhbmdlKG1tY19kZXRlY3QuZGV2aWQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgY29yZ2lfbW1jX2RldGVjdF9pbnQoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCW1tY19kZXRlY3QuZGV2aWQ9ZGV2aWQ7Ci0JbW9kX3RpbWVyKCZtbWNfZGV0ZWN0LmRldGVjdF90aW1lciwgamlmZmllcyArIEhaLzQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBjb3JnaV9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycXJldHVybl90ICgqdW51c2VkX2RldGVjdF9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgY29yZ2lfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFyZXR1cm5fdCAoKmNvcmdpX2RldGVjdF9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgZXJyOwogCkBAIC0xNzAsMTEgKzE0Niw5IEBACiAJcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX25TRF9ERVRFQ1QgfCBHUElPX0lOKTsKIAlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fU0RfUFdSIHwgR1BJT19PVVQpOwogCi0JaW5pdF90aW1lcigmbW1jX2RldGVjdC5kZXRlY3RfdGltZXIpOwotCW1tY19kZXRlY3QuZGV0ZWN0X3RpbWVyLmZ1bmN0aW9uID0gbW1jX2RldGVjdF9jYWxsYmFjazsKLQltbWNfZGV0ZWN0LmRldGVjdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZtbWNfZGV0ZWN0OworCWNvcmdpX21jaV9wbGF0Zm9ybV9kYXRhLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKIAotCWVyciA9IHJlcXVlc3RfaXJxKENPUkdJX0lSUV9HUElPX25TRF9ERVRFQ1QsIGNvcmdpX21tY19kZXRlY3RfaW50LCBTQV9JTlRFUlJVUFQsCisJZXJyID0gcmVxdWVzdF9pcnEoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgY29yZ2lfZGV0ZWN0X2ludCwgU0FfSU5URVJSVVBULAogCQkJICAgICAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgImNvcmdpX21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7CkBAIC0xOTksMjAgKzE3MywyNiBAQAogCX0KIH0KIAorc3RhdGljIGludCBjb3JnaV9tY2lfZ2V0X3JvKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gR1BMUihDT1JHSV9HUElPX25TRF9XUCkgJiBHUElPX2JpdChDT1JHSV9HUElPX25TRF9XUCk7Cit9CisKIHN0YXRpYyB2b2lkIGNvcmdpX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlmcmVlX2lycShDT1JHSV9JUlFfR1BJT19uU0RfREVURUNULCBkYXRhKTsKLQlkZWxfdGltZXIoJm1tY19kZXRlY3QuZGV0ZWN0X3RpbWVyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBjb3JnaV9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKIAkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCiAJLmluaXQgCQk9IGNvcmdpX21jaV9pbml0LAorCS5nZXRfcm8JCT0gY29yZ2lfbWNpX2dldF9ybywKIAkuc2V0cG93ZXIgCT0gY29yZ2lfbWNpX3NldHBvd2VyLAogCS5leGl0CQk9IGNvcmdpX21jaV9leGl0LAogfTsKIAogCisKIC8qCiAgKiBVU0IgRGV2aWNlIENvbnRyb2xsZXIKICAqLwpAQCAtMjM4LDE0ICsyMTgsMTMgQEAKIAkmY29yZ2lzY29vcF9kZXZpY2UsCiAJJmNvcmdpc3NwX2RldmljZSwKIAkmY29yZ2lmYl9kZXZpY2UsCisJJmNvcmdpa2JkX2RldmljZSwKIAkmY29yZ2libF9kZXZpY2UsCisJJmNvcmdpdHNfZGV2aWNlLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNvcmdpX2luaXQodm9pZCkKIHsKLQljb3JnaV9mYl9pbmZvLmNvbWFkaj1zaGFycHNsX3BhcmFtLmNvbWFkajsKLQljb3JnaV9mYl9pbmZvLnBoYWRhZGo9c2hhcnBzbF9wYXJhbS5waGFkYWRqOwotCiAJcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX1VTQl9QVUxMVVAgfCBHUElPX09VVCk7CiAgCXB4YV9zZXRfdWRjX2luZm8oJnVkY19pbmZvKTsKIAlweGFfc2V0X21jaV9pbmZvKCZjb3JnaV9tY2lfcGxhdGZvcm1fZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9sY2QuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX2xjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWMyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9sY2QuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMKKyAqCisgKiBDb3JnaSBMQ0QgU3BlY2lmaWMgQ29kZSBmb3IgQVRJIEltYWdlb24gdzEwMCAoV2FsbGFieSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmljaGFyZCBQdXJkaWUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jb3JnaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KKyNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KKworLyogUmVnaXN0ZXIgQWRkcmVzc2VzICovCisjZGVmaW5lIFJFU0NUTF9BRFJTICAgICAweDAwCisjZGVmaW5lIFBIQUNUUkxfQURSUyAgICAweDAxCisjZGVmaW5lIERVVFlDVFJMX0FEUlMgICAweDAyCisjZGVmaW5lIFBPV0VSUkVHMF9BRFJTICAweDAzCisjZGVmaW5lIFBPV0VSUkVHMV9BRFJTICAweDA0CisjZGVmaW5lIEdQT1IzX0FEUlMgICAgICAweDA1CisjZGVmaW5lIFBJQ1RSTF9BRFJTICAgICAweDA2CisjZGVmaW5lIFBPTENUUkxfQURSUyAgICAweDA3CisKKy8qIFJlc2dpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUkVTQ1RMX1FWR0EgICAgIDB4MDEKKyNkZWZpbmUgUkVTQ1RMX1ZHQSAgICAgIDB4MDAKKworI2RlZmluZSBQT1dFUjFfVldfT04gICAgMHgwMSAgLyogVlcgU3VwcGx5IEZFVCBPTiAqLworI2RlZmluZSBQT1dFUjFfR1ZTU19PTiAgMHgwMiAgLyogR1ZTUygtOFYpIFBvd2VyIFN1cHBseSBPTiAqLworI2RlZmluZSBQT1dFUjFfVkREX09OICAgMHgwNCAgLyogVkREKDhWKSxTVlNTKC00VikgUG93ZXIgU3VwcGx5IE9OICovCisKKyNkZWZpbmUgUE9XRVIxX1ZXX09GRiAgIDB4MDAgIC8qIFZXIFN1cHBseSBGRVQgT0ZGICovCisjZGVmaW5lIFBPV0VSMV9HVlNTX09GRiAweDAwICAvKiBHVlNTKC04VikgUG93ZXIgU3VwcGx5IE9GRiAqLworI2RlZmluZSBQT1dFUjFfVkREX09GRiAgMHgwMCAgLyogVkREKDhWKSxTVlNTKC00VikgUG93ZXIgU3VwcGx5IE9GRiAqLworCisjZGVmaW5lIFBPV0VSMF9DT01fRENMSyAweDAxICAvKiBDT00gVm9sdGFnZSBEQyBCaWFzIERBQyBTZXJpYWwgRGF0YSBDbG9jayAqLworI2RlZmluZSBQT1dFUjBfQ09NX0RPVVQgMHgwMiAgLyogQ09NIFZvbHRhZ2UgREMgQmlhcyBEQUMgU2VyaWFsIERhdGEgT3V0ICovCisjZGVmaW5lIFBPV0VSMF9EQUNfT04gICAweDA0ICAvKiBEQUMgUG93ZXIgU3VwcGx5IE9OICovCisjZGVmaW5lIFBPV0VSMF9DT01fT04gICAweDA4ICAvKiBDT00gUG93ZXdyIFN1cHBseSBPTiAqLworI2RlZmluZSBQT1dFUjBfVkNDNV9PTiAgMHgxMCAgLyogVkNDNSBQb3dlciBTdXBwbHkgT04gKi8KKworI2RlZmluZSBQT1dFUjBfREFDX09GRiAgMHgwMCAgLyogREFDIFBvd2VyIFN1cHBseSBPRkYgKi8KKyNkZWZpbmUgUE9XRVIwX0NPTV9PRkYgIDB4MDAgIC8qIENPTSBQb3dld3IgU3VwcGx5IE9GRiAqLworI2RlZmluZSBQT1dFUjBfVkNDNV9PRkYgMHgwMCAgLyogVkNDNSBQb3dlciBTdXBwbHkgT0ZGICovCisKKyNkZWZpbmUgUElDVFJMX0lOSVRfU1RBVEUgICAgICAweDAxCisjZGVmaW5lIFBJQ1RSTF9JTklPRkYgICAgICAgICAgMHgwMgorI2RlZmluZSBQSUNUUkxfUE9XRVJfRE9XTiAgICAgIDB4MDQKKyNkZWZpbmUgUElDVFJMX0NPTV9TSUdOQUxfT0ZGICAweDA4CisjZGVmaW5lIFBJQ1RSTF9EQUNfU0lHTkFMX09GRiAgMHgxMAorCisjZGVmaW5lIFBPTENUUkxfU1lOQ19QT0xfRkFMTCAgMHgwMQorI2RlZmluZSBQT0xDVFJMX0VOX1BPTF9GQUxMICAgIDB4MDIKKyNkZWZpbmUgUE9MQ1RSTF9EQVRBX1BPTF9GQUxMICAweDA0CisjZGVmaW5lIFBPTENUUkxfU1lOQ19BQ1RfSCAgICAgMHgwOAorI2RlZmluZSBQT0xDVFJMX0VOX0FDVF9MICAgICAgIDB4MTAKKworI2RlZmluZSBQT0xDVFJMX1NZTkNfUE9MX1JJU0UgIDB4MDAKKyNkZWZpbmUgUE9MQ1RSTF9FTl9QT0xfUklTRSAgICAweDAwCisjZGVmaW5lIFBPTENUUkxfREFUQV9QT0xfUklTRSAgMHgwMAorI2RlZmluZSBQT0xDVFJMX1NZTkNfQUNUX0wgICAgIDB4MDAKKyNkZWZpbmUgUE9MQ1RSTF9FTl9BQ1RfSCAgICAgICAweDAwCisKKyNkZWZpbmUgUEhBQ1RSTF9QSEFTRV9NQU5VQUwgICAweDAxCisjZGVmaW5lIERFRkFVTFRfUEhBRF9RVkdBICAgICAoOSkKKyNkZWZpbmUgREVGQVVMVF9DT01BREogICAgICAgICgxMjUpCisKKy8qCisgKiBUaGlzIGlzIG9ubHkgYSBwc3VlZG8gSTJDIGludGVyZmFjZS4gV2UgY2FuJ3QgdXNlIHRoZSBzdGFuZGFyZCBrZXJuZWwKKyAqIHJvdXRpbmVzIGFzIHRoZSBpbnRlcmZhY2UgaXMgd3JpdGUgb25seS4gV2UganVzdCBhc3N1bWUgdGhlIGRhdGEgaXMgYWNrZWQuLi4KKyAqLworc3RhdGljIHZvaWQgbGNkdGdfc3NwX2kyY19zZW5kKHU4IGRhdGEpCit7CisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcwX0FEUlMsIGRhdGEpOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX2JpdCh1OCBkYXRhKQoreworCWxjZHRnX3NzcF9pMmNfc2VuZChkYXRhKTsKKwlsY2R0Z19zc3BfaTJjX3NlbmQoZGF0YSB8IFBPV0VSMF9DT01fRENMSyk7CisJbGNkdGdfc3NwX2kyY19zZW5kKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdGFydCh1OCBiYXNlKQoreworCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUKTsKKwlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyk7CisJbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdG9wKHU4IGJhc2UpCit7CisJbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UpOworCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLKTsKKwlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX2J5dGUodTggYmFzZSwgdTggZGF0YSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChkYXRhICYgMHg4MCkKKwkJCWxjZHRnX2kyY19zZW5kX2JpdChiYXNlIHwgUE9XRVIwX0NPTV9ET1VUKTsKKwkJZWxzZQorCQkJbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UpOworCQlkYXRhIDw8PSAxOworCX0KK30KKworc3RhdGljIHZvaWQgbGNkdGdfaTJjX3dhaXRfYWNrKHU4IGJhc2UpCit7CisJbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19zZXRfY29tbW9uX3ZvbHRhZ2UodTggYmFzZV9kYXRhLCB1OCBkYXRhKQoreworCS8qIFNldCBDb21tb24gVm9sdGFnZSB0byBNNjIzMzJGUCB2aWEgSTJDICovCisJbGNkdGdfaTJjX3NlbmRfc3RhcnQoYmFzZV9kYXRhKTsKKwlsY2R0Z19pMmNfc2VuZF9ieXRlKGJhc2VfZGF0YSwgMHg5Yyk7CisJbGNkdGdfaTJjX3dhaXRfYWNrKGJhc2VfZGF0YSk7CisJbGNkdGdfaTJjX3NlbmRfYnl0ZShiYXNlX2RhdGEsIDB4MDApOworCWxjZHRnX2kyY193YWl0X2FjayhiYXNlX2RhdGEpOworCWxjZHRnX2kyY19zZW5kX2J5dGUoYmFzZV9kYXRhLCBkYXRhKTsKKwlsY2R0Z19pMmNfd2FpdF9hY2soYmFzZV9kYXRhKTsKKwlsY2R0Z19pMmNfc2VuZF9zdG9wKGJhc2VfZGF0YSk7Cit9CisKKy8qIFNldCBQaGFzZSBBZGp1Y3QgKi8KK3N0YXRpYyB2b2lkIGxjZHRnX3NldF9waGFkYWRqKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJaW50IGFkajsKKwlzd2l0Y2gocGFyLT54cmVzKSB7CisJCWNhc2UgNDgwOgorCQljYXNlIDY0MDoKKwkJCS8qIFNldHRpbmcgZm9yIFZHQSAqLworCQkJYWRqID0gc2hhcnBzbF9wYXJhbS5waGFkYWRqOworCQkJaWYgKGFkaiA8IDApIHsKKwkJCQlhZGogPSBQSEFDVFJMX1BIQVNFX01BTlVBTDsKKwkJCX0gZWxzZSB7CisJCQkJYWRqID0gKChhZGogJiAweDBmKSA8PCAxKSB8IFBIQUNUUkxfUEhBU0VfTUFOVUFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjQwOgorCQljYXNlIDMyMDoKKwkJZGVmYXVsdDoKKwkJCS8qIFNldHRpbmcgZm9yIFFWR0EgKi8KKwkJCWFkaiA9IChERUZBVUxUX1BIQURfUVZHQSA8PCAxKSB8IFBIQUNUUkxfUEhBU0VfTUFOVUFMOworCQkJYnJlYWs7CisJfQorCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUEhBQ1RSTF9BRFJTLCBhZGopOworfQorCitzdGF0aWMgaW50IGxjZF9pbml0ZWQ7CisKK3N0YXRpYyB2b2lkIGxjZHRnX2h3X2luaXQoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKK3sKKwlpZiAoIWxjZF9pbml0ZWQpIHsKKwkJaW50IGNvbWFkajsKKworCQkvKiBJbml0aWFsaXplIEludGVybmFsIExvZ2ljICYgUG9ydCAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfSU5JT0ZGIHwgUElDVFJMX0lOSVRfU1RBVEUKKwkgIAkJCXwgUElDVFJMX0NPTV9TSUdOQUxfT0ZGIHwgUElDVFJMX0RBQ19TSUdOQUxfT0ZGKTsKKworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzBfQURSUywgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PRkYKKwkJCQl8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKKworCQkvKiBWREQoKzhWKSwgU1ZTUygtNFYpIE9OICovCisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTik7CisJCW1kZWxheSgzKTsKKworCQkvKiBEQUMgT04gKi8KKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT04KKwkJCQl8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCQkvKiBJTklCID0gSCwgSU5JID0gTCAgKi8KKwkJLyogUElDVExbMF0gPSBIICwgUElDVExbMV0gPSBQSUNUTFsyXSA9IFBJQ1RMWzRdID0gTCAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX0lOSVRfU1RBVEUgfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCisJCS8qIFNldCBDb21tb24gVm9sdGFnZSAqLworCQljb21hZGogPSBzaGFycHNsX3BhcmFtLmNvbWFkajsKKwkJaWYgKGNvbWFkaiA8IDApCisJCQljb21hZGogPSBERUZBVUxUX0NPTUFESjsKKwkJbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKChQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpLCBjb21hZGopOworCisJCS8qIFZDQzUgT04sIERBQyBPTiAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzBfQURSUywgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTiB8CisJCQkJUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7CisKKwkJLyogR1ZTUygtOFYpIE9OLCBWREQgT04gKi8KKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOworCQltZGVsYXkoMik7CisKKwkJLyogQ09NIFNJR05BTCBPTiAoUElDVExbM10gPSBMKSAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgUElDVFJMX0lOSVRfU1RBVEUpOworCisJCS8qIENPTSBPTiwgREFDIE9OLCBWQ0M1X09OICovCisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09OCisJCQkJfCBQT1dFUjBfQ09NX09OIHwgUE9XRVIwX1ZDQzVfT04pOworCisJCS8qIFZXIE9OLCBHVlNTIE9OLCBWREQgT04gKi8KKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PTiB8IFBPV0VSMV9HVlNTX09OIHwgUE9XRVIxX1ZERF9PTik7CisKKwkJLyogU2lnbmFscyBvdXRwdXQgZW5hYmxlICovCisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBJQ1RSTF9BRFJTLCAwKTsKKworCQkvKiBTZXQgUGhhc2UgQWRqdWN0ICovCisJCWxjZHRnX3NldF9waGFkYWRqKHBhcik7CisKKwkJLyogSW5pdGlhbGl6ZSBmb3IgSW5wdXQgU2lnbmFscyBmcm9tIEFUSSAqLworCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT0xDVFJMX0FEUlMsIFBPTENUUkxfU1lOQ19QT0xfUklTRSB8IFBPTENUUkxfRU5fUE9MX1JJU0UKKwkJCQl8IFBPTENUUkxfREFUQV9QT0xfUklTRSB8IFBPTENUUkxfU1lOQ19BQ1RfTCB8IFBPTENUUkxfRU5fQUNUX0gpOworCQl1ZGVsYXkoMTAwMCk7CisKKwkJbGNkX2luaXRlZD0xOworCX0gZWxzZSB7CisJCWxjZHRnX3NldF9waGFkYWRqKHBhcik7CisJfQorCisJc3dpdGNoKHBhci0+eHJlcykgeworCQljYXNlIDQ4MDoKKwkJY2FzZSA2NDA6CisJCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFZHQSkgKi8KKwkJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFJFU0NUTF9BRFJTLCBSRVNDVExfVkdBKTsKKwkJCWJyZWFrOworCQljYXNlIDI0MDoKKwkJY2FzZSAzMjA6CisJCWRlZmF1bHQ6CisJCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFFWR0EpICovCisJCQljb3JnaV9zc3BfbGNkdGdfc2VuZChSRVNDVExfQURSUywgUkVTQ1RMX1FWR0EpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBsY2R0Z19zdXNwZW5kKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJLyogNjBIeiB4IDIgZnJhbWUgPSAxNi43bXNlYyB4IDIgPSAzMy40IG1zZWMgKi8KKwltZGVsYXkoMzQpOworCisJLyogKDEpVlcgT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOworCisJLyogKDIpQ09NIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBJQ1RSTF9BRFJTLCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7CisKKwkvKiAoMylTZXQgQ29tbW9uIFZvbHRhZ2UgQmlhcyAwViAqLworCWxjZHRnX3NldF9jb21tb25fdm9sdGFnZShQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTiwgMCk7CisKKwkvKiAoNClHVlNTIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTik7CisKKwkvKiAoNSlWQ0M1IE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpOworCisJLyogKDYpU2V0IFBEV04sIElOSU9GRiwgREFDT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9JTklPRkYgfCBQSUNUUkxfREFDX1NJR05BTF9PRkYgfAorCQkJUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCisJLyogKDcpREFDIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09GRiB8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCS8qICg4KVZERCBPRkYgKi8KKwljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKKworCWxjZF9pbml0ZWQgPSAwOworfQorCitzdGF0aWMgc3RydWN0IHcxMDBfdGdfaW5mbyBjb3JnaV9sY2R0Z19pbmZvID0geworCS5jaGFuZ2U9bGNkdGdfaHdfaW5pdCwKKwkuc3VzcGVuZD1sY2R0Z19zdXNwZW5kLAorCS5yZXN1bWU9bGNkdGdfaHdfaW5pdCwKK307CisKKy8qCisgKiBDb3JnaSB3MTAwIEZyYW1lIEJ1ZmZlciBEZXZpY2UKKyAqLworCitzdGF0aWMgc3RydWN0IHcxMDBfbWVtX2luZm8gY29yZ2lfZmJfbWVtID0geworCS5leHRfY250bCAgICAgICAgICA9IDB4MDAwNDAwMDMsCisJLnNkcmFtX21vZGVfcmVnICAgID0gMHgwMDY1MDAyMSwKKwkuZXh0X3RpbWluZ19jbnRsICAgPSAweDEwMDAyYTRhLAorCS5pb19jbnRsICAgICAgICAgICA9IDB4N2ZmODcwMTIsCisJLnNpemUgICAgICAgICAgICAgID0gMHgxZmZmZmYsCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBfZ2VuX3JlZ3MgY29yZ2lfZmJfcmVncyA9IHsKKwkubGNkX2Zvcm1hdCAgICA9IDB4MDAwMDAwMDMsCisJLmxjZGRfY250bDEgICAgPSAweDAxQ0MwMDAwLAorCS5sY2RkX2NudGwyICAgID0gMHgwMDAzRkZGRiwKKwkuZ2VubGNkX2NudGwxICA9IDB4MDBGRkZGMEQsCisJLmdlbmxjZF9jbnRsMiAgPSAweDAwM0YzMDAzLAorCS5nZW5sY2RfY250bDMgID0gMHgwMDAxMDJhYSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9ncGlvX3JlZ3MgY29yZ2lfZmJfZ3BpbyA9IHsKKwkuaW5pdF9kYXRhMSAgID0gMHgwMDAwMDBiZiwKKwkuaW5pdF9kYXRhMiAgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19kaXIxICAgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19vZTEgICAgID0gMHgwM2MwZmVmZiwKKwkuZ3Bpb19kaXIyICAgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19vZTIgICAgID0gMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9tb2RlIGNvcmdpX2ZiX21vZGVzW10gPSB7Cit7CisJLnhyZXMgICAgICAgICAgICA9IDQ4MCwKKwkueXJlcyAgICAgICAgICAgID0gNjQwLAorCS5sZWZ0X21hcmdpbiAgICAgPSAweDU2LAorCS5yaWdodF9tYXJnaW4gICAgPSAweDU1LAorCS51cHBlcl9tYXJnaW4gICAgPSAweDAzLAorCS5sb3dlcl9tYXJnaW4gICAgPSAweDAwLAorCS5jcnRjX3NzICAgICAgICAgPSAweDgyMzYwMDU2LAorCS5jcnRjX2xzICAgICAgICAgPSAweEEwMjgwMDAwLAorCS5jcnRjX2dzICAgICAgICAgPSAweDgwMjgwMDI4LAorCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAyODMwMDAyLAorCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMDA4LAorCS5jcnRjX2RjbGsgICAgICAgPSAweEEwMDAwMDAwLAorCS5jcnRjX2djbGsgICAgICAgPSAweDgwMTUwMTBGLAorCS5jcnRjX2dvZSAgICAgICAgPSAweDgwMTAwMTEwLAorCS5jcnRjX3BzMV9hY3RpdmUgPSAweDQxMDYwMDEwLAorCS5wbGxfZnJlcSAgICAgICAgPSA3NSwKKwkuZmFzdF9wbGxfZnJlcSAgID0gMTAwLAorCS5zeXNjbGtfc3JjICAgICAgPSBDTEtfU1JDX1BMTCwKKwkuc3lzY2xrX2RpdmlkZXIgID0gMCwKKwkucGl4Y2xrX3NyYyAgICAgID0gQ0xLX1NSQ19QTEwsCisJLnBpeGNsa19kaXZpZGVyICA9IDIsCisJLnBpeGNsa19kaXZpZGVyX3JvdGF0ZWQgPSA2LAorfSx7CisJLnhyZXMgICAgICAgICAgICA9IDI0MCwKKwkueXJlcyAgICAgICAgICAgID0gMzIwLAorCS5sZWZ0X21hcmdpbiAgICAgPSAweDI3LAorCS5yaWdodF9tYXJnaW4gICAgPSAweDJlLAorCS51cHBlcl9tYXJnaW4gICAgPSAweDAxLAorCS5sb3dlcl9tYXJnaW4gICAgPSAweDAwLAorCS5jcnRjX3NzICAgICAgICAgPSAweDgxMTcwMDI3LAorCS5jcnRjX2xzICAgICAgICAgPSAweEEwMTQwMDAwLAorCS5jcnRjX2dzICAgICAgICAgPSAweEMwMTQwMDE0LAorCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAwMDEwMTQxLAorCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMDA4LAorCS5jcnRjX2RjbGsgICAgICAgPSAweEEwMDAwMDAwLAorCS5jcnRjX2djbGsgICAgICAgPSAweDgwMTUwMTBGLAorCS5jcnRjX2dvZSAgICAgICAgPSAweDgwMTAwMTEwLAorCS5jcnRjX3BzMV9hY3RpdmUgPSAweDQxMDYwMDEwLAorCS5wbGxfZnJlcSAgICAgICAgPSAwLAorCS5mYXN0X3BsbF9mcmVxICAgPSAwLAorCS5zeXNjbGtfc3JjICAgICAgPSBDTEtfU1JDX1hUQUwsCisJLnN5c2Nsa19kaXZpZGVyICA9IDAsCisJLnBpeGNsa19zcmMgICAgICA9IENMS19TUkNfWFRBTCwKKwkucGl4Y2xrX2RpdmlkZXIgID0gMSwKKwkucGl4Y2xrX2RpdmlkZXJfcm90YXRlZCA9IDEsCit9LAorCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gY29yZ2lfZmJfaW5mbyA9IHsKKwkudGcgICAgICAgICA9ICZjb3JnaV9sY2R0Z19pbmZvLAorCS5pbml0X21vZGUgID0gSU5JVF9NT0RFX1JPVEFURUQsCisJLm1lbSAgICAgICAgPSAmY29yZ2lfZmJfbWVtLAorCS5yZWdzICAgICAgID0gJmNvcmdpX2ZiX3JlZ3MsCisJLm1vZGVsaXN0ICAgPSAmY29yZ2lfZmJfbW9kZXNbMF0sCisJLm51bV9tb2RlcyAgPSAyLAorCS5ncGlvICAgICAgID0gJmNvcmdpX2ZiX2dwaW8sCisJLnh0YWxfZnJlcSAgPSAxMjUwMDAwMCwKKwkueHRhbF9kYmwgICA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvcmdpX2ZiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICAgPSAweDA4MDAwMDAwLAorCQkuZW5kICAgICA9IDB4MDhmZmZmZmYsCisJCS5mbGFncyAgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lmYl9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gIncxMDBmYiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvcmdpX2ZiX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY29yZ2lfZmJfcmVzb3VyY2VzLAorCS5kZXYgICAgICAgICAgICA9IHsKKyAJCS5wbGF0Zm9ybV9kYXRhID0gJmNvcmdpX2ZiX2luZm8sCisgCQkucGFyZW50ID0gJmNvcmdpc3NwX2RldmljZS5kZXYsCisJfSwKKworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfc3NwLmMKaW5kZXggOGNjZmZiYS4uMzY2YTliZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfc3NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfc3NwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9jb3JnaS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CiAKLXN0YXRpYyBzcGlubG9ja190IGNvcmdpX3NzcF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhjb3JnaV9zc3BfbG9jayk7CiBzdGF0aWMgc3RydWN0IHNzcF9kZXYgY29yZ2lfc3NwX2RldjsKIHN0YXRpYyBzdHJ1Y3Qgc3NwX3N0YXRlIGNvcmdpX3NzcF9zdGF0ZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwppbmRleCBhMTAyNjg2Li5lMzU4N2VmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYworKysgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDAsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCmluZGV4IGQ0ZDAzZDAuLjA2ODA3YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCkBAIC0yLDYgKzIsMTMgQEAKIAogbWVudSAiUzNDMjRYWCBJbXBsZW1lbnRhdGlvbnMiCiAKK2NvbmZpZyBNQUNIX0FOVUJJUworCWJvb2wgIlNpbXRlYyBFbGVjdHJvbmljcyBBTlVCSVMiCisJc2VsZWN0IENQVV9TM0MyNDQwCisJaGVscAorCSAgU2F5IFkgZ2VyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBTaW10ZWMgRWxlY3Ryb25pY3MgQU5VQklTCisJICBkZXZlbG9wbWVudCBzeXN0ZW0KKwogY29uZmlnIEFSQ0hfQkFTVAogCWJvb2wgIlNpbXRlYyBFbGVjdHJvbmljcyBCQVNUIChFQjI0MTBJVFgpIgogCXNlbGVjdCBDUFVfUzNDMjQxMApAQCAtMTEsNiArMTgsMTQgQEAKIAogCSAgUHJvZHVjdCBwYWdlOiA8aHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvRUIyNDEwSVRYLz4uCiAKK2NvbmZpZyBCQVNUX1BDMTA0X0lSUQorCWJvb2wgIkJBU1QgUEMxMDQgSVJRIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JBU1QKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWQloZXJlIHRvIGVuYWJsZSB0aGUgUEMxMDQgSVJRIHJvdXRpbmcgb24gdGhlCisJICBTaW10ZWMgQkFTVCAoRUIyNDEwSVRYKQorCiBjb25maWcgQVJDSF9IMTk0MAogCWJvb2wgIklQQVEgSDE5NDAiCiAJc2VsZWN0IENQVV9TM0MyNDEwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKaW5kZXggNTVlZDdjNy4uYjRmMWUwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQpAQCAtMjYsOCArMjYsMTMgQEAKIG9iai0kKENPTkZJR19DUFVfUzNDMjQ0MCkgICs9IHMzYzI0NDAtaXJxLm8KIG9iai0kKENPTkZJR19DUFVfUzNDMjQ0MCkgICs9IHMzYzI0NDAtY2xvY2subwogCisjIGJhc3QgZXh0cmFzCisKK29iai0kKENPTkZJR19CQVNUX1BDMTA0X0lSUSkJKz0gYmFzdC1pcnEubworCiAjIG1hY2hpbmUgc3BlY2lmaWMgc3VwcG9ydAogCitvYmotJChDT05GSUdfTUFDSF9BTlVCSVMpCSs9IG1hY2gtYW51YmlzLm8KIG9iai0kKENPTkZJR19BUkNIX0JBU1QpCQkrPSBtYWNoLWJhc3QubyB1c2Itc2ltdGVjLm8KIG9iai0kKENPTkZJR19BUkNIX0gxOTQwKQkrPSBtYWNoLWgxOTQwLm8KIG9iai0kKENPTkZJR19NQUNIX04zMCkJCSs9IG1hY2gtbjMwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QtaXJxLmMKaW5kZXggNDk5MTQ3MC4uZmJiZWIwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QtaXJxLmMKQEAgLTEsNiArMSw2IEBACiAvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIENvcHlyaWdodCAoYykgMjAwMywyMDA1IFNpbXRlYyBFbGVjdHJvbmljcwogICogICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgogICogaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvRUIyNDEwSVRYLwpAQCAtMjEsNyArMjEsOCBAQAogICoKICAqIE1vZGlmaWNhdGlvbnM6CiAgKiAgICAgMDgtSmFuLTIwMDMgQkpEICBNb3ZlZCBmcm9tIGNlbnRyYWwgSVJRIGNvZGUKLSAqLworICogICAgIDIxLUF1Zy0yMDA1IEJKRCAgRml4ZWQgbWlzc2luZyBjb2RlIGFuZCBjb21waWxlIGVycm9ycworKi8KIAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzAsMTIgKzMxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3MzYzI0MTAvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWlycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYmFzdC1pcnEuaD4KKworI2luY2x1ZGUgImlycS5oIgogCiAjaWYgMAogI2luY2x1ZGUgPGFzbS9kZWJ1Zy1sbC5oPgpAQCAtNzksMTUgKzg3LDE1IEBACiAJdGVtcCA9IF9fcmF3X3JlYWRiKEJBU1RfVkFfUEMxMDRfSVJRTUFTSyk7CiAJdGVtcCAmPSB+YmFzdF9wYzEwNF9pcnFtYXNrc1tpcnFub107CiAJX19yYXdfd3JpdGViKHRlbXAsIEJBU1RfVkFfUEMxMDRfSVJRTUFTSyk7Ci0KLQlpZiAodGVtcCA9PSAwKQotCQliYXN0X2V4dGludF9tYXNrKElSUV9JU0EpOwogfQogCiBzdGF0aWMgdm9pZAotYmFzdF9wYzEwNF9hY2sodW5zaWduZWQgaW50IGlycW5vKQorYmFzdF9wYzEwNF9tYXNrYWNrKHVuc2lnbmVkIGludCBpcnFubykKIHsKLQliYXN0X2V4dGludF9hY2soSVJRX0lTQSk7CisJc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIElSUV9JU0E7CisKKwliYXN0X3BjMTA0X21hc2soaXJxbm8pOworCWRlc2MtPmNoaXAtPmFjayhJUlFfSVNBKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTk4LDE0ICsxMDYsMTIgQEAKIAl0ZW1wID0gX19yYXdfcmVhZGIoQkFTVF9WQV9QQzEwNF9JUlFNQVNLKTsKIAl0ZW1wIHw9IGJhc3RfcGMxMDRfaXJxbWFza3NbaXJxbm9dOwogCV9fcmF3X3dyaXRlYih0ZW1wLCBCQVNUX1ZBX1BDMTA0X0lSUU1BU0spOwotCi0JYmFzdF9leHRpbnRfdW5tYXNrKElSUV9JU0EpOwogfQogCi1zdGF0aWMgc3RydWN0IGJhc3RfcGMxMDRfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCAgYmFzdF9wYzEwNF9jaGlwID0gewogCS5tYXNrCSAgICAgPSBiYXN0X3BjMTA0X21hc2ssCiAJLnVubWFzawkgICAgID0gYmFzdF9wYzEwNF91bm1hc2ssCi0JLmFjawkgICAgID0gYmFzdF9wYzEwNF9hY2sKKwkuYWNrCSAgICAgPSBiYXN0X3BjMTA0X21hc2thY2sKIH07CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTksMTQgKzEyNSw0OSBAQAogCiAJc3RhdCA9IF9fcmF3X3JlYWRiKEJBU1RfVkFfUEMxMDRfSVJRUkVRKSAmIDB4ZjsKIAotCWZvciAoaSA9IDA7IGkgPCA0ICYmIHN0YXQgIT0gMDsgaSsrKSB7Ci0JCWlmIChzdGF0ICYgMSkgewotCQkJaXJxbm8gPSBiYXN0X3BjMTA0X2lycXNbaV07Ci0JCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnFubzsKKwlpZiAodW5saWtlbHkoc3RhdCA9PSAwKSkgeworCQkvKiBhY2sgaWYgd2UgZ2V0IGFuIGlycSB3aXRoIG5vdGhpbmcgKGllLCBzdGFydHVwKSAqLwogCi0JCQlkZXNjX2hhbmRsZV9pcnEoaXJxbm8sIGRlc2MsIHJlZ3MpOworCQlkZXNjID0gaXJxX2Rlc2MgKyBJUlFfSVNBOworCQlkZXNjLT5jaGlwLT5hY2soSVJRX0lTQSk7CisJfSBlbHNlIHsKKwkJLyogaGFuZGxlIHRoZSBJUlEgKi8KKworCQlmb3IgKGkgPSAwOyBzdGF0ICE9IDA7IGkrKywgc3RhdCA+Pj0gMSkgeworCQkJaWYgKHN0YXQgJiAxKSB7CisJCQkJaXJxbm8gPSBiYXN0X3BjMTA0X2lycXNbaV07CisKKwkJCQlkZXNjX2hhbmRsZV9pcnEoaXJxbm8sIGlycV9kZXNjICsgaXJxbm8sIHJlZ3MpOworCQkJfQogCQl9Ci0KLQkJc3RhdCA+Pj0gMTsKIAl9CiB9CisKK3N0YXRpYyBfX2luaXQgaW50IGJhc3RfaXJxX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChtYWNoaW5lX2lzX2Jhc3QoKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJCQVNUIFBDMTA0IElSUSByb3V0aW5nLCAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3NcbiIpOworCisJCS8qIHphcCBhbGwgdGhlIElSUXMgKi8KKworCQlfX3Jhd193cml0ZWIoMHgwLCBCQVNUX1ZBX1BDMTA0X0lSUU1BU0spOworCisJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9JU0EsIGJhc3RfaXJxX3BjMTA0X2RlbXV4KTsKKworCQkvKiByZWlnc3RlciBvdXIgSVJRcyAqLworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBpcnFubyA9IGJhc3RfcGMxMDRfaXJxc1tpXTsKKworCQkJc2V0X2lycV9jaGlwKGlycW5vLCAmYmFzdF9wYzEwNF9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoYmFzdF9pcnFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYwppbmRleCA0NjY0YmQxLi4wMDc3OTM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KKyNpbmNsdWRlIDxhc20vYXJjaC9mYi5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTEwMyw2ICsxMDMsMTUgQEAKIAogRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX2xjZCk7CiAKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyBzM2MyNDEwZmJfaW5mbzsKKwordm9pZCBfX2luaXQgc2V0X3MzYzI0MTBmYl9pbmZvKHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICpoYXJkX3MzYzI0MTBmYl9pbmZvKQoreworCW1lbWNweSgmczNjMjQxMGZiX2luZm8saGFyZF9zM2MyNDEwZmJfaW5mbyxzaXplb2Yoc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8pKTsKKwlzM2NfZGV2aWNlX2xjZC5kZXYucGxhdGZvcm1fZGF0YSA9ICZzM2MyNDEwZmJfaW5mbzsKK30KK0VYUE9SVF9TWU1CT0woc2V0X3MzYzI0MTBmYl9pbmZvKTsKKwogLyogTkFORCBDb250cm9sbGVyICovCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX25hbmRfcmVzb3VyY2VbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFudWJpcy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW51YmlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3YWEwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFudWJpcy5jCkBAIC0wLDAgKzEsMjcwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbnViaXMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqCTAyLU1heS0yMDA1IEJKRCAgQ29waWVkIGZyb20gbWFjaC1iYXN0LmMKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2FudWJpcy1tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hbnViaXMtaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYW51YmlzLWNwbGQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLW1lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtbGNkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbmFuZC5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfZWNjLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiZGV2cy5oIgorI2luY2x1ZGUgImNwdS5oIgorCisjZGVmaW5lIENPUFlSSUdIVCAiLCAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MiCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYW51YmlzX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgIC8qIElTQSBJTyBhcmVhcyAqLworCisgIHsgKHUzMilTM0MyNFhYX1ZBX0lTQV9CWVRFLCAweDAsCSAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilTM0MyNFhYX1ZBX0lTQV9XT1JELCAweDAsCSAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCisKKyAgLyogd2UgY291bGQgcG9zc2libHkgY29tcHJlc3MgdGhlIG5leHQgc2V0IGRvd24gaW50byBhIHNldCBvZiBzbWFsbGVyIHRhYmxlcworICAgKiBwYWdldGFibGVzLCBidXQgdGhhdCB3b3VsZCBtZWFuIHVzaW5nIGFuIEwyIHNlY3Rpb24sIGFuZCBpdCBzdGlsbCBtZWFucworICAgKiB3ZSBjYW5ub3QgYWN0dWFsbHkgZmVlZCB0aGUgc2FtZSByZWdpc3RlciB0byBhbiBMRFIgZHVlIHRvIDE2SyBzcGFjaW5nCisgICAqLworCisgIC8qIENQTEQgY29udHJvbCByZWdpc3RlcnMgKi8KKworICB7ICh1MzIpQU5VQklTX1ZBX0NUUkwxLAlBTlVCSVNfUEFfQ1RSTDEsCVNaXzRLLCBNVF9ERVZJQ0UgfSwKKyAgeyAodTMyKUFOVUJJU19WQV9DVFJMMiwJQU5VQklTX1BBX0NUUkwyLAlTWl80SywgTVRfREVWSUNFIH0sCisKKyAgLyogSURFIGRyaXZlcyAqLworCisgIHsgKHUzMilBTlVCSVNfSURFUFJJLAkJUzNDMjQxMF9DUzMsCQlTWl8xTSwgTVRfREVWSUNFIH0sCisgIHsgKHUzMilBTlVCSVNfSURFUFJJQVVYLAlTM0MyNDEwX0NTMysoMTw8MjYpLAlTWl8xTSwgTVRfREVWSUNFIH0sCisKKyAgeyAodTMyKUFOVUJJU19JREVTRUMsCQlTM0MyNDEwX0NTNCwJCVNaXzFNLCBNVF9ERVZJQ0UgfSwKKyAgeyAodTMyKUFOVUJJU19JREVTRUNBVVgsCVMzQzI0MTBfQ1M0KygxPDwyNiksCVNaXzFNLCBNVF9ERVZJQ0UgfSwKK307CisKKyNkZWZpbmUgVUNPTiBTM0MyNDEwX1VDT05fREVGQVVMVCB8IFMzQzI0MTBfVUNPTl9VQ0xLCisjZGVmaW5lIFVMQ09OIFMzQzI0MTBfTENPTl9DUzggfCBTM0MyNDEwX0xDT05fUE5PTkUgfCBTM0MyNDEwX0xDT05fU1RPUEIKKyNkZWZpbmUgVUZDT04gUzNDMjQxMF9VRkNPTl9SWFRSSUc4IHwgUzNDMjQxMF9VRkNPTl9GSUZPTU9ERQorCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgYW51YmlzX3NlcmlhbF9jbG9ja3NbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCQk9ICJ1Y2xrIiwKKwkJLmRpdmlzb3IJPSAxLAorCQkubWluX2JhdWQJPSAwLAorCQkubWF4X2JhdWQJPSAwLAorCX0sCisJWzFdID0geworCQkubmFtZQkJPSAicGNsayIsCisJCS5kaXZpc29yCT0gMSwKKwkJLm1pbl9iYXVkCT0gMCwKKwkJLm1heF9iYXVkCT0gMC4KKwl9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIGFudWJpc191YXJ0Y2Znc1tdID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwkJLmNsb2NrcwkgICAgID0gYW51YmlzX3NlcmlhbF9jbG9ja3MsCisJCS5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUoYW51YmlzX3NlcmlhbF9jbG9ja3MpCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJICAgICA9IDIsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IFVDT04sCisJCS51bGNvbgkgICAgID0gVUxDT04sCisJCS51ZmNvbgkgICAgID0gVUZDT04sCisJCS5jbG9ja3MJICAgICA9IGFudWJpc19zZXJpYWxfY2xvY2tzLAorCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKGFudWJpc19zZXJpYWxfY2xvY2tzKQorCX0sCit9OworCisvKiBOQU5EIEZsYXNoIG9uIEFudWJpcyBib2FyZCAqLworCitzdGF0aWMgaW50IGV4dGVybmFsX21hcFtdICAgPSB7IDIgfTsKK3N0YXRpYyBpbnQgY2hpcDBfbWFwW10gICAgICA9IHsgMCB9Oworc3RhdGljIGludCBjaGlwMV9tYXBbXSAgICAgID0geyAxIH07CisKK3N0cnVjdCBtdGRfcGFydGl0aW9uIGFudWJpc19kZWZhdWx0X25hbmRfcGFydFtdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQm9vdCBBZ2VudCIsCisJCS5zaXplCT0gU1pfMTZLLAorCQkub2Zmc2V0CT0gMAorCX0sCisJWzFdID0geworCQkubmFtZQk9ICIvYm9vdCIsCisJCS5zaXplCT0gU1pfNE0gLSBTWl8xNkssCisJCS5vZmZzZXQJPSBTWl8xNkssCisJfSwKKwlbMl0gPSB7CisJCS5uYW1lCT0gInVzZXIxIiwKKwkJLm9mZnNldAk9IFNaXzRNLAorCQkuc2l6ZQk9IFNaXzMyTSAtIFNaXzRNLAorCX0sCisJWzNdID0geworCQkubmFtZQk9ICJ1c2VyMiIsCisJCS5vZmZzZXQJPSBTWl8zMk0sCisJCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKKwl9Cit9OworCisvKiB0aGUgQW51YmlzIGhhcyAzIHNlbGVjdGFibGUgc2xvdHMgZm9yIG5hbmQtZmxhc2gsIHRoZSB0d28KKyAqIG9uLWJvYXJkIGNoaXAgYXJlYXMsIGFzIHdlbGwgYXMgdGhlIGV4dGVybmFsIHNsb3QuCisgKgorICogTm90ZSwgdGhlcmUgaXMgbm8gY3VycmVudCBob3QtcGx1ZyBzdXBwb3J0IGZvciB0aGUgRXh0ZXJuYWwKKyAqIHNvY2tldC4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCBhbnViaXNfbmFuZF9zZXRzW10gPSB7CisJWzFdID0geworCQkubmFtZQkJPSAiRXh0ZXJuYWwiLAorCQkubnJfY2hpcHMJPSAxLAorCQkubnJfbWFwCQk9IGV4dGVybmFsX21hcCwKKwkJLm5yX3BhcnRpdGlvbnMJPSBBUlJBWV9TSVpFKGFudWJpc19kZWZhdWx0X25hbmRfcGFydCksCisJCS5wYXJ0aXRpb25zCT0gYW51YmlzX2RlZmF1bHRfbmFuZF9wYXJ0CisJfSwKKwlbMF0gPSB7CisJCS5uYW1lCQk9ICJjaGlwMCIsCisJCS5ucl9jaGlwcwk9IDEsCisJCS5ucl9tYXAJCT0gY2hpcDBfbWFwLAorCQkubnJfcGFydGl0aW9ucwk9IEFSUkFZX1NJWkUoYW51YmlzX2RlZmF1bHRfbmFuZF9wYXJ0KSwKKwkJLnBhcnRpdGlvbnMJPSBhbnViaXNfZGVmYXVsdF9uYW5kX3BhcnQKKwl9LAorCVsyXSA9IHsKKwkJLm5hbWUJCT0gImNoaXAxIiwKKwkJLm5yX2NoaXBzCT0gMSwKKwkJLm5yX21hcAkJPSBjaGlwMV9tYXAsCisJCS5ucl9wYXJ0aXRpb25zCT0gQVJSQVlfU0laRShhbnViaXNfZGVmYXVsdF9uYW5kX3BhcnQpLAorCQkucGFydGl0aW9ucwk9IGFudWJpc19kZWZhdWx0X25hbmRfcGFydAorCX0sCit9OworCitzdGF0aWMgdm9pZCBhbnViaXNfbmFuZF9zZWxlY3Qoc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKnNldCwgaW50IHNsb3QpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNsb3QgPSBzZXQtPm5yX21hcFtzbG90XSAmIDM7CisKKwlwcl9kZWJ1ZygiYW51YmlzX25hbmQ6IHNlbGVjdGluZyBzbG90ICVkIChzZXQgJXAsJXApXG4iLAorCQkgc2xvdCwgc2V0LCBzZXQtPm5yX21hcCk7CisKKwl0bXAgPSBfX3Jhd19yZWFkYihBTlVCSVNfVkFfQ1RSTDEpOworCXRtcCAmPSB+QU5VQklTX0NUUkwxX05BTkRTRUw7CisJdG1wIHw9IHNsb3Q7CisKKwlwcl9kZWJ1ZygiYW51YmlzX25hbmQ6IGN0cmwxIG5vdyAlMDJ4XG4iLCB0bXApOworCisJX19yYXdfd3JpdGViKHRtcCwgQU5VQklTX1ZBX0NUUkwxKTsKK30KKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX25hbmQgYW51YmlzX25hbmRfaW5mbyA9IHsKKwkudGFjbHMJCT0gMjUsCisJLnR3cnBoMAkJPSA4MCwKKwkudHdycGgxCQk9IDgwLAorCS5ucl9zZXRzCT0gQVJSQVlfU0laRShhbnViaXNfbmFuZF9zZXRzKSwKKwkuc2V0cwkJPSBhbnViaXNfbmFuZF9zZXRzLAorCS5zZWxlY3RfY2hpcAk9IGFudWJpc19uYW5kX3NlbGVjdCwKK307CisKKworLyogU3RhbmRhcmQgQW51YmlzIGRldmljZXMgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFudWJpc19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV91c2IsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzM2NfZGV2aWNlX2FkYywKKwkmczNjX2RldmljZV9pMmMsCisgCSZzM2NfZGV2aWNlX3J0YywKKwkmczNjX2RldmljZV9uYW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmFudWJpc19jbG9ja3NbXSA9IHsKKwkmczNjMjR4eF9kY2xrMCwKKwkmczNjMjR4eF9kY2xrMSwKKwkmczNjMjR4eF9jbGtvdXQwLAorCSZzM2MyNHh4X2Nsa291dDEsCisJJnMzYzI0eHhfdWNsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9ib2FyZCBhbnViaXNfYm9hcmQgX19pbml0ZGF0YSA9IHsKKwkuZGV2aWNlcyAgICAgICA9IGFudWJpc19kZXZpY2VzLAorCS5kZXZpY2VzX2NvdW50ID0gQVJSQVlfU0laRShhbnViaXNfZGV2aWNlcyksCisJLmNsb2NrcwkgICAgICAgPSBhbnViaXNfY2xvY2tzLAorCS5jbG9ja3NfY291bnQgID0gQVJSQVlfU0laRShhbnViaXNfY2xvY2tzKQorfTsKKwordm9pZCBfX2luaXQgYW51YmlzX21hcF9pbyh2b2lkKQoreworCS8qIGluaXRpYWxpc2UgdGhlIGNsb2NrcyAqLworCisJczNjMjR4eF9kY2xrMC5wYXJlbnQgPSBOVUxMOworCXMzYzI0eHhfZGNsazAucmF0ZSAgID0gMTIqMTAwMCoxMDAwOworCisJczNjMjR4eF9kY2xrMS5wYXJlbnQgPSBOVUxMOworCXMzYzI0eHhfZGNsazEucmF0ZSAgID0gMjQqMTAwMCoxMDAwOworCisJczNjMjR4eF9jbGtvdXQwLnBhcmVudCAgPSAmczNjMjR4eF9kY2xrMDsKKwlzM2MyNHh4X2Nsa291dDEucGFyZW50ICA9ICZzM2MyNHh4X2RjbGsxOworCisJczNjMjR4eF91Y2xrLnBhcmVudCAgPSAmczNjMjR4eF9jbGtvdXQxOworCisJczNjX2RldmljZV9uYW5kLmRldi5wbGF0Zm9ybV9kYXRhID0gJmFudWJpc19uYW5kX2luZm87CisKKwlzM2MyNHh4X2luaXRfaW8oYW51YmlzX2lvZGVzYywgQVJSQVlfU0laRShhbnViaXNfaW9kZXNjKSk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygwKTsKKwlzM2MyNHh4X2luaXRfdWFydHMoYW51YmlzX3VhcnRjZmdzLCBBUlJBWV9TSVpFKGFudWJpc191YXJ0Y2ZncykpOworCXMzYzI0eHhfc2V0X2JvYXJkKCZhbnViaXNfYm9hcmQpOworCisJLyogZW5zdXJlIHRoYXQgdGhlIEdQSU8gaXMgc2V0dXAgKi8KKwlzM2MyNDEwX2dwaW9fc2V0cGluKFMzQzI0MTBfR1BBMCwgMSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQU5VQklTLCAiU2ltdGVjLUFudWJpcyIpCisJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLworCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkubWFwX2lvCQk9IGFudWJpc19tYXBfaW8sCisJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKKwkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCmluZGV4IGU5MTgyMjQuLjFhMzM2N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKQEAgLTM4MSw3ICszODEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiYXN0X3NpbyA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmJhc3Rfc2lvX2RhdGEsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCmluZGV4IGVhNGZiMWEuLjZmZjE4ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwpAQCAtNDUsNiArNDUsOSBAQAogCiAvLyNpbmNsdWRlIDxhc20vZGVidWctbGwuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtbGNkLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9mYi5oPgogCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KIApAQCAtODgsNiArOTEsNDggQEAKIAogCiAKKy8qKgorICogU2V0IGxjZCBvbiBvciBvZmYKKyAqKi8KK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyBoMTk0MF9sY2RjZmcgX19pbml0ZGF0YSA9IHsKKwkuZml4ZWRfc3luY3M9CQkxLAorCS5yZWdzPXsKKwkJLmxjZGNvbjE9CVMzQzI0MTBfTENEQ09OMV9URlQxNkJQUCB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjFfVEZUIHwgXAorCQkJCVMzQzI0MTBfTENEQ09OMV9DTEtWQUwoMHgwQyksCisKKwkJLmxjZGNvbjI9CVMzQzI0MTBfTENEQ09OMl9WQlBEKDcpIHwgXAorCQkJCVMzQzI0MTBfTENEQ09OMl9MSU5FVkFMKDMxOSkgfCBcCisJCQkJUzNDMjQxMF9MQ0RDT04yX1ZGUEQoNikgfCBcCisJCQkJUzNDMjQxMF9MQ0RDT04yX1ZTUFcoMCksCisKKwkJLmxjZGNvbjM9CVMzQzI0MTBfTENEQ09OM19IQlBEKDE5KSB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjNfSE9aVkFMKDIzOSkgfCBcCisJCQkJUzNDMjQxMF9MQ0RDT04zX0hGUEQoNyksCisKKwkJLmxjZGNvbjQ9CVMzQzI0MTBfTENEQ09ONF9NVkFMKDApIHwgXAorCQkJCVMzQzI0MTBfTENEQ09ONF9IU1BXKDMpLAorCisJCS5sY2Rjb241PQlTM0MyNDEwX0xDRENPTjVfRlJNNTY1IHwgXAorCQkJCVMzQzI0MTBfTENEQ09ONV9JTlZWTElORSB8IFwKKwkJCQlTM0MyNDEwX0xDRENPTjVfSFdTV1AsCisJfSwKKwkubHBjc2VsPQkweDAyLAorCS5ncGNjb249CTB4YWE5NDA2NTksCisJLmdwY2Nvbl9tYXNrPQkweGZmZmZmZmZmLAorCS5ncGN1cD0JCTB4MDAwMGZmZmYsCisJLmdwY3VwX21hc2s9CTB4ZmZmZmZmZmYsCisJLmdwZGNvbj0JMHhhYTg0YWFhMCwKKwkuZ3BkY29uX21hc2s9CTB4ZmZmZmZmZmYsCisJLmdwZHVwPQkJMHgwMDAwZmFmZiwKKwkuZ3BkdXBfbWFzaz0JMHhmZmZmZmZmZiwKKworCS53aWR0aD0JCTI0MCwKKwkuaGVpZ2h0PQkzMjAsCisJLnhyZXM9CQl7MjQwLDI0MCwyNDB9LAorCS55cmVzPQkJezMyMCwzMjAsMzIwfSwKKwkuYnBwPQkJezE2LDE2LDE2fSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpoMTk0MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV91c2IsCkBAIC0xMTYsNiArMTYxLDExIEBACiAKIH0KIAordm9pZCBfX2luaXQgaDE5NDBfaW5pdCh2b2lkKQoreworCXNldF9zM2MyNDEwZmJfaW5mbygmaDE5NDBfbGNkY2ZnKTsKK30KKwogTUFDSElORV9TVEFSVChIMTk0MCwgIklQQVEtSDE5NDAiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4gKi8KIAkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLApAQCAtMTI0LDUgKzE3NCw2IEBACiAJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAogCS5tYXBfaW8JCT0gaDE5NDBfbWFwX2lvLAogCS5pbml0X2lycQk9IGgxOTQwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgICA9IGgxOTQwX2luaXQsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKaW5kZXggOTI0ZTg0Ni4uOGY5YWIyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLXNpbXRlYy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLXNpbXRlYy5jCmluZGV4IDJjYjc5ODguLjRjN2NjZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0tc2ltdGVjLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogCS8qIGNoZWNrIHdoaWNoIG1hY2hpbmUgd2UgYXJlIHJ1bm5pbmcgb24gKi8KIAotCWlmICghbWFjaGluZV9pc19iYXN0KCkgJiYgIW1hY2hpbmVfaXNfdnIxMDAwKCkpCisJaWYgKCFtYWNoaW5lX2lzX2Jhc3QoKSAmJiAhbWFjaGluZV9pc192cjEwMDAoKSAmJiAhbWFjaGluZV9pc19hbnViaXMoKSkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJTaW10ZWMgQm9hcmQgUG93ZXIgTWFuYW5nZW1lbnQiIENPUFlSSUdIVCAiXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCmluZGV4IDc2NWEzYTkuLmMwYWNmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3RpbWUuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAkvKiBjb25maWd1cmUgdGhlIHN5c3RlbSBmb3Igd2hpY2hldmVyIG1hY2hpbmUgaXMgaW4gdXNlICovCiAKLQlpZiAobWFjaGluZV9pc19iYXN0KCkgfHwgbWFjaGluZV9pc192cjEwMDAoKSkgeworCWlmIChtYWNoaW5lX2lzX2Jhc3QoKSB8fCBtYWNoaW5lX2lzX3ZyMTAwMCgpIHx8IG1hY2hpbmVfaXNfYW51YmlzKCkpIHsKIAkJLyogdGltZXIgaXMgYXQgMTJNSHosIHNjYWxlciBpcyAxICovCiAJCXRpbWVyX3VzZWNfdGlja3MgPSB0aW1lcl9tYXNrX3VzZWNfdGlja3MoMSwgMTIwMDAwMDApOwogCQl0Y250ID0gMTIwMDAwMDAgLyBIWjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKaW5kZXggZTczN2VhZS4uOTQ2YzBkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKIAkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMCwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12My5TCmluZGV4IDQ5NDBmMTkuLjNjNThlYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLlMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuUwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCQkudGV4dAogCQkuYWxpZ24JNQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TCmluZGV4IGI5NGMzNDUuLjgzMTE3MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d2IuUworKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHdiLlMKQEAgLTExLDcgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIAkuYWxpZ24JNQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5TIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5TCmluZGV4IDk3Njc5MzkuLmUxZjJhZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d3QuUworKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHd0LlMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIAkuYWxpZ24JNQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmx1c2guYyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKaW5kZXggMTkxNzg4Zi4uYjAyMDhjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmx1c2guYworKysgYi9hcmNoL2FybS9tbS9mbHVzaC5jCkBAIC0xNiw2ICsxNiw1OCBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCiAjaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9WSVBUCisKK3ZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJaWYgKGNhY2hlX2lzX3ZpdnQoKSkgeworCQlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW0tPmNwdV92bV9tYXNrKSkKKwkJCV9fY3B1Y19mbHVzaF91c2VyX2FsbCgpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgeworCQlhc20oCSJtY3IJcDE1LCAwLCAlMCwgYzcsIGMxNCwgMFxuIgorCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzUsIDBcbiIKKwkJIgltY3IJcDE1LCAwLCAlMCwgYzcsIGMxMCwgNCIKKwkJICAgIDoKKwkJICAgIDogInIiICgwKQorCQkgICAgOiAiY2MiKTsKKwl9Cit9CisKK3ZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWlmIChjYWNoZV9pc192aXZ0KCkpIHsKKwkJaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHZtYS0+dm1fbW0tPmNwdV92bV9tYXNrKSkKKwkJCV9fY3B1Y19mbHVzaF91c2VyX3JhbmdlKHN0YXJ0ICYgUEFHRV9NQVNLLCBQQUdFX0FMSUdOKGVuZCksCisJCQkJCQl2bWEtPnZtX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpIHsKKwkJYXNtKAkibWNyCXAxNSwgMCwgJTAsIGM3LCBjMTQsIDBcbiIKKwkJIgltY3IJcDE1LCAwLCAlMCwgYzcsIGM1LCAwXG4iCisJCSIJbWNyCXAxNSwgMCwgJTAsIGM3LCBjMTAsIDQiCisJCSAgICA6CisJCSAgICA6ICJyIiAoMCkKKwkJICAgIDogImNjIik7CisJfQorfQorCit2b2lkIGZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlpZiAoY2FjaGVfaXNfdml2dCgpKSB7CisJCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCB2bWEtPnZtX21tLT5jcHVfdm1fbWFzaykpIHsKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHVzZXJfYWRkciAmIFBBR0VfTUFTSzsKKwkJCV9fY3B1Y19mbHVzaF91c2VyX3JhbmdlKGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUsIHZtYS0+dm1fZmxhZ3MpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKQorCQlmbHVzaF9wZm5fYWxpYXMocGZuLCB1c2VyX2FkZHIpOworfQorCiAjZGVmaW5lIEFMSUFTX0ZMVVNIX1NUQVJUCTB4ZmZmZjQwMDAKIAogI2RlZmluZSBUT1BfUFRFKHgpCXB0ZV9vZmZzZXRfa2VybmVsKHRvcF9wbWQsIHgpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TCmluZGV4IDVjMGFlNTIuLjFkNzM5ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKaW5kZXggZDY5Mzg5Yy4uOWI3MjU2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUwppbmRleCA3NDdlZDk2My4uMzdiNzBmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKaW5kZXggMjQ4MTEwYy4uOTMxYjY5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCmluZGV4IDE4OWVmNmEuLmQwZjFiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCmluZGV4IDU3Y2ZhNmEuLmM2OWM5ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMgYi9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCmluZGV4IDkxMzdmZTUuLjdjZmMyNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUwpAQCAtNCw3ICs0LDcgQEAKICAqICBWTUFfVk1fRkxBR1MKICAqICBWTV9FWEVDCiAgKi8KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKaW5kZXggMzYwY2FlOS4uMzRmN2U3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKaW5kZXggZDQ0N2NkNS4uY2ExNGY4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKaW5kZXggMTM5YTM4Ni4uZWIzNDgyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwpAQCAtMTEsNyArMTEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXYzLlMgYi9hcmNoL2FybS9tbS90bGItdjMuUwppbmRleCA0NGIwZGFlLi5jMTA3ODZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS90bGItdjMuUworKysgYi9hcmNoL2FybS9tbS90bGItdjMuUwpAQCAtMTMsNyArMTMsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXY0LlMgYi9hcmNoL2FybS9tbS90bGItdjQuUwppbmRleCBkYjgyZWU0Li5kNmM5NDQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS90bGItdjQuUworKysgYi9hcmNoL2FybS9tbS90bGItdjQuUwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXY0d2IuUyBiL2FyY2gvYXJtL21tL3RsYi12NHdiLlMKaW5kZXggNzkwOGQ1Zi4uY2I4MjljYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vdGxiLXY0d2IuUworKysgYi9hcmNoL2FybS9tbS90bGItdjR3Yi5TCkBAIC0xNCw3ICsxNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjR3YmkuUyBiL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCmluZGV4IGVmYmU5NGIuLjYwY2ZjNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCisrKyBiL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCkBAIC0xNCw3ICsxNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjYuUyBiL2FyY2gvYXJtL21tL3RsYi12Ni5TCmluZGV4IDk5ZWQyNmUuLjZmNzZiODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12Ni5TCisrKyBiL2FyY2gvYXJtL21tL3RsYi12Ni5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgVGhlc2UgYXNzdW1lIGEgc3BsaXQgSS9EIFRMQi4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZW50cnkyNi5TIGIvYXJjaC9hcm0vbndmcGUvZW50cnkyNi5TCmluZGV4IDBlZDM4YjAuLjUxOTQwYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL253ZnBlL2VudHJ5MjYuUworKysgYi9hcmNoL2FybS9ud2ZwZS9lbnRyeTI2LlMKQEAgLTIwLDcgKzIwLDcgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC8qIFRoaXMgaXMgdGhlIGtlcm5lbCdzIGVudHJ5IHBvaW50IGludG8gdGhlIGZsb2F0aW5nIHBvaW50IGVtdWxhdG9yLgogSXQgaXMgY2FsbGVkIGZyb20gdGhlIGtlcm5lbCB3aXRoIGNvZGUgc2ltaWxhciB0byB0aGlzOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwppbmRleCAzNDUzNjU4Li45NjkzZTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwpAQCAtOTEsNiArOTEsMTMgQEAKIAkgIEtlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgc2hvdWxkIGJlIGEgZGl2aXNvciBvZiAzMjc2OCwKIAkgIHN1Y2ggYXMgNjQgb3IgMTI4LgogCitjb25maWcgT01BUF9ETV9USU1FUgorCWJvb2wgIlVzZSBkdWFsLW1vZGUgdGltZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCisJaGVscAorCSBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIE9NQVAgRHVhbC1Nb2RlIHRpbWVycy4KKwogY2hvaWNlCiAJcHJvbXB0ICJMb3ctbGV2ZWwgZGVidWcgY29uc29sZSBVQVJUIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQCkBAIC0xMDcsNiArMTE0LDE1IEBACiAKIGVuZGNob2ljZQogCitjb25maWcgT01BUF9TRVJJQUxfV0FLRQorCWJvb2wgIkVuYWJsZSB3YWtlLXVwIGV2ZW50cyBmb3Igc2VyaWFsIHBvcnRzIgorCWRlcGVuZHMgT01BUF9NVVgKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gaGF2ZSB5b3VyIHN5c3RlbSB3YWtlIHVwCisJICB0byBkYXRhIG9uIHRoZSBzZXJpYWwgUlggbGluZS4gVGhpcyBhbGxvd3MgeW91IHRvIHdha2UgdGhlCisJICBzeXN0ZW0gZnJvbSBzZXJpYWwgY29uc29sZS4KKwogZW5kbWVudQogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCmluZGV4IDUzMWUxMWEuLjdlMTQ0ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjCiAKICMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNvbW1vbi5vIGRtYS5vIGNsb2NrLm8gbXV4Lm8gZ3Bpby5vIG1jYnNwLm8gdXNiLm8KK29iai15IDo9IGNvbW1vbi5vIHNyYW0ubyBzcmFtLWZuLm8gY2xvY2subyBkbWEubyBtdXgubyBncGlvLm8gbWNic3AubyB1c2Iubwogb2JqLW0gOj0KIG9iai1uIDo9CiBvYmotICA6PQpAQCAtMTUsMyArMTUsNSBAQAogb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vIHNsZWVwLm8KIAogb2JqLSQoQ09ORklHX0NQVV9GUkVRKSArPSBjcHUtb21hcC5vCitvYmotJChDT05GSUdfT01BUF9ETV9USU1FUikgKz0gZG10aW1lci5vCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKaW5kZXggNTlkOTFiMy4uNTJhNThiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAic3JhbS5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7CiBzdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKQEAgLTE0MSw3ICsxNDIsNyBAQAogc3RhdGljIHN0cnVjdCBjbGsgYXJtcGVyX2NrID0gewogCS5uYW1lCQk9ICJhcm1wZXJfY2siLAogCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNzMwIHwgQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAogCQkJICBSQVRFX0NLQ1RMLAogCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCiAJLmVuYWJsZV9iaXQJPSBFTl9QRVJDSywKQEAgLTM4NSw3ICszODYsOCBAQAogCS5uYW1lCQk9ICJ1YXJ0Ml9jayIsCiAJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCiAJLnJhdGUJCT0gMTIwMDAwMDAsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfCBFTkFCTEVfUkVHXzMyQklULAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgRU5BQkxFX1JFR18zMkJJVCB8CisJCQkgIEFMV0FZU19FTkFCTEVELAogCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAogCS5lbmFibGVfYml0CT0gMzAsCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KIAkuc2V0X3JhdGUJPSAmc2V0X3VhcnRfcmF0ZSwKQEAgLTQ0Myw2ICs0NDUsMTUgQEAKIAkuZW5hYmxlX2JpdAk9IDggLyogVUhPU1RfRU4gKi8sCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayB1c2JfZGNfY2sgPSB7CisJLm5hbWUJCT0gInVzYl9kY19jayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gNDgwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwgUkFURV9GSVhFRCwKKwkuZW5hYmxlX3JlZwk9IFNPRlRfUkVRX1JFRywKKwkuZW5hYmxlX2JpdAk9IDQsCit9OworCiBzdGF0aWMgc3RydWN0IGNsayBtY2xrXzE1MTAgPSB7CiAJLm5hbWUJCT0gIm1jbGsiLAogCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwpAQCAtNTUyLDYgKzU2Myw3IEBACiAJJnVhcnQzXzE2eHgsCiAJJnVzYl9jbGtvLAogCSZ1c2JfaGhjX2NrMTUxMCwgJnVzYl9oaGNfY2sxNnh4LAorCSZ1c2JfZGNfY2ssCiAJJm1jbGtfMTUxMCwgICZtY2xrXzE2eHgsCiAJJmJjbGtfMTUxMCwgICZiY2xrXzE2eHgsCiAJJm1tYzFfY2ssCkBAIC05NDYsMTQgKzk1OCwxMyBAQAogCWlmICghcHRyLT5yYXRlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghcHRyLT5yYXRlKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIEluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIG5vdCBuZWVkIHRvIHJlcHJvZ3JhbSBEUExMLgorCSAqIFJlcHJvZ3JhbW1pbmcgdGhlIERQTEwgaXMgdHJpY2t5LCBpdCBtdXN0IGJlIGRvbmUgZnJvbSBTUkFNLgorCSAqLworCW9tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2socHRyLT5kcGxsY3RsX3ZhbCwgcHRyLT5ja2N0bF92YWwpOwogCi0JaWYgKHVubGlrZWx5KGNrX2RwbGwxLnJhdGUgPT0gMCkpIHsKLQkJb21hcF93cml0ZXcocHRyLT5kcGxsY3RsX3ZhbCwgRFBMTF9DVEwpOwotCQlja19kcGxsMS5yYXRlID0gcHRyLT5wbGxfcmF0ZTsKLQl9Ci0Jb21hcF93cml0ZXcocHRyLT5ja2N0bF92YWwsIEFSTV9DS0NUTCk7CisJY2tfZHBsbDEucmF0ZSA9IHB0ci0+cGxsX3JhdGU7CiAJcHJvcGFnYXRlX3JhdGUoJmNrX2RwbGwxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjQsOSArMTIzNSwxMSBAQAogI2VuZGlmCiAJLyogQ2FjaGUgcmF0ZXMgZm9yIGNsb2NrcyBjb25uZWN0ZWQgdG8gY2tfcmVmIChub3QgZHBsbDEpICovCiAJcHJvcGFnYXRlX3JhdGUoJmNrX3JlZik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ2xvY2tpbmcgcmF0ZSAoeHRhbC9EUExMMS9NUFUpOiAlbGQuJTAxbGQvJWxkLyVsZCBNSHpcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiQ2xvY2tpbmcgcmF0ZSAoeHRhbC9EUExMMS9NUFUpOiAiCisJCSIlbGQuJTAxbGQvJWxkLiUwMWxkLyVsZC4lMDFsZCBNSHpcbiIsCiAJICAgICAgIGNrX3JlZi5yYXRlIC8gMTAwMDAwMCwgKGNrX3JlZi5yYXRlIC8gMTAwMDAwKSAlIDEwLAotCSAgICAgICBja19kcGxsMS5yYXRlLCBhcm1fY2sucmF0ZSk7CisJICAgICAgIGNrX2RwbGwxLnJhdGUgLyAxMDAwMDAwLCAoY2tfZHBsbDEucmF0ZSAvIDEwMDAwMCkgJSAxMCwKKwkgICAgICAgYXJtX2NrLnJhdGUgLyAxMDAwMDAwLCAoYXJtX2NrLnJhdGUgLyAxMDAwMDApICUgMTApOwogCiAjaWZkZWYgQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMgogCS8qIFNlbGVjdCBzbGljZXIgb3V0cHV0IGFzIE9NQVAgaW5wdXQgY2xvY2sgKi8KQEAgLTEyNzEsNyArMTI4NCw5IEBACiAJc3RydWN0IGNsayAqcDsKIAlfX3UzMiByZWd2YWwzMjsKIAotCW9tYXBfd3JpdGV3KDAsIFNPRlRfUkVRX1JFRyk7CisJLyogVVNCX1JFUV9FTiB3aWxsIGJlIGRpc2FibGVkIGxhdGVyIGlmIG5lY2Vzc2FyeSAodXNiX2RjX2NrKSAqLworCXJlZ3ZhbDMyID0gb21hcF9yZWFkdyhTT0ZUX1JFUV9SRUcpICYgKDEgPDwgNCk7CisJb21hcF93cml0ZXcocmVndmFsMzIsIFNPRlRfUkVRX1JFRyk7CiAJb21hcF93cml0ZXcoMCwgU09GVF9SRVFfUkVHMik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwppbmRleCBlYTk2N2E4Li42Y2IyMGFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CkBAIC0zNSwxMSArMzYsMTEgQEAKIAogI2RlZmluZSBOT19MRU5HVEhfQ0hFQ0sgMHhmZmZmZmZmZgogCi1leHRlcm4gaW50IG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuOwotZXh0ZXJuIHU4IG9tYXBfYm9vdGxvYWRlcl90YWdbXTsKK3Vuc2lnbmVkIGNoYXIgb21hcF9ib290bG9hZGVyX3RhZ1s1MTJdOworaW50IG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuOwogCiBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpvbWFwX2JvYXJkX2NvbmZpZzsKLWludCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gMDsKK2ludCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplOwogCiBzdGF0aWMgY29uc3Qgdm9pZCAqZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgc2tpcCwgc2l6ZV90ICpsZW5fb3V0KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCmluZGV4IGMwYTVjMmYuLmRhN2I2NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKQEAgLTQyNSw3ICs0MjUsNyBAQAogCQlkbWFfY2hhbltjaCArIDZdLnNhdmVkX2NzciA9IGNzciA+PiA3OwogCQljc3IgJj0gMHg3ZjsKIAl9Ci0JaWYgKCFjc3IpCisJaWYgKChjc3IgJiAweDNmKSA9PSAwKQogCQlyZXR1cm4gMDsKIAlpZiAodW5saWtlbHkoZG1hX2NoYW5bY2hdLmRldl9pZCA9PSAtMSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgaW50ZXJydXB0IGZyb20gRE1BIGNoYW5uZWwgJWQgKENTUiAlMDR4KVxuIiwKQEAgLTg5MCwxMSArODkwLDExIEBACiAJdyB8PSAxIDw8IDg7CiAJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKIAorCWxjZF9kbWEuYWN0aXZlID0gMTsKKwogCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKIAl3IHw9IDEgPDwgNzsKIAlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0KLQlsY2RfZG1hLmFjdGl2ZSA9IDE7CiB9CiAKIHZvaWQgb21hcF9zZXR1cF9sY2RfZG1hKHZvaWQpCkBAIC05NjUsOCArOTY1LDggQEAKICAqLwogZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfc3JjX3BvcyhpbnQgbGNoKQogewotCXJldHVybiAoZG1hX2FkZHJfdCkgKE9NQVBfRE1BX0NTU0FfTChsY2gpIHwKLQkJCSAgICAgKE9NQVBfRE1BX0NTU0FfVShsY2gpIDw8IDE2KSk7CisJcmV0dXJuIChkbWFfYWRkcl90KSAob21hcF9yZWFkdyhPTUFQX0RNQV9DU1NBX0wobGNoKSkgfAorCShvbWFwX3JlYWR3KE9NQVBfRE1BX0NTU0FfVShsY2gpKSA8PCAxNikpOwogfQogCiAvKgpAQCAtOTc5LDggKzk3OSwxOCBAQAogICovCiBkbWFfYWRkcl90IG9tYXBfZ2V0X2RtYV9kc3RfcG9zKGludCBsY2gpCiB7Ci0JcmV0dXJuIChkbWFfYWRkcl90KSAoT01BUF9ETUFfQ0RTQV9MKGxjaCkgfAotCQkJICAgICAoT01BUF9ETUFfQ0RTQV9VKGxjaCkgPDwgMTYpKTsKKwlyZXR1cm4gKGRtYV9hZGRyX3QpIChvbWFwX3JlYWR3KE9NQVBfRE1BX0NEU0FfTChsY2gpKSB8CisJKG9tYXBfcmVhZHcoT01BUF9ETUFfQ0RTQV9VKGxjaCkpIDw8IDE2KSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGN1cnJlbnQgc291cmNlIHRyYW5zZmVyIGNvdW50aW5nIGZvciB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwuCisgKiBDYW4gYmUgdXNlZCB0byBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZiBhIHRyYW5zZmVyIGluc2lkZSBhICBibG9jay4KKyAqIEl0IG11c3QgYmUgY2FsbGVkIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cy4KKyAqLworaW50IG9tYXBfZ2V0X2RtYV9zcmNfYWRkcl9jb3VudGVyKGludCBsY2gpCit7CisJcmV0dXJuIChkbWFfYWRkcl90KSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTQUMobGNoKSk7CiB9CiAKIGludCBvbWFwX2RtYV9ydW5uaW5nKHZvaWQpCkBAIC0xMDc2LDYgKzEwODYsNyBAQAogCiBFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X2RtYV9zcmNfcG9zKTsKIEVYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX2RzdF9wb3MpOworRVhQT1JUX1NZTUJPTChvbWFwX2dldF9kbWFfc3JjX2FkZHJfY291bnRlcik7CiBFWFBPUlRfU1lNQk9MKG9tYXBfY2xlYXJfZG1hKTsKIEVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3ByaW9yaXR5KTsKIEVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2RtYSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ2OGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKKyAqCisgKiBPTUFQIER1YWwtTW9kZSBUaW1lcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogTGF1cmkgTGV1a2t1bmVuIDxsYXVyaS5sZXVra3VuZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTgorICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZG10aW1lci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZSBPTUFQX1RJTUVSX0NPVU5UCQk4CisKKyNkZWZpbmUgT01BUF9USU1FUl9JRF9SRUcJCTB4MDAKKyNkZWZpbmUgT01BUF9USU1FUl9PQ1BfQ0ZHX1JFRwkJMHgxMAorI2RlZmluZSBPTUFQX1RJTUVSX1NZU19TVEFUX1JFRwkJMHgxNAorI2RlZmluZSBPTUFQX1RJTUVSX1NUQVRfUkVHCQkweDE4CisjZGVmaW5lIE9NQVBfVElNRVJfSU5UX0VOX1JFRwkJMHgxYworI2RlZmluZSBPTUFQX1RJTUVSX1dBS0VVUF9FTl9SRUcJMHgyMAorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfUkVHCQkweDI0CisjZGVmaW5lIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcJCTB4MjgKKyNkZWZpbmUgT01BUF9USU1FUl9MT0FEX1JFRwkJMHgyYworI2RlZmluZSBPTUFQX1RJTUVSX1RSSUdHRVJfUkVHCQkweDMwCisjZGVmaW5lIE9NQVBfVElNRVJfV1JJVEVfUEVORF9SRUcgCTB4MzQKKyNkZWZpbmUgT01BUF9USU1FUl9NQVRDSF9SRUcJCTB4MzgKKyNkZWZpbmUgT01BUF9USU1FUl9DQVBUVVJFX1JFRwkJMHgzYworI2RlZmluZSBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHCQkweDQwCisKKworc3RhdGljIHN0cnVjdCBkbXRpbWVyX2luZm9fc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXVudXNlZF90aW1lcnM7CisJc3RydWN0IGxpc3RfaGVhZAlyZXNlcnZlZF90aW1lcnM7Cit9IGRtX3RpbWVyX2luZm87CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciBkbV90aW1lcnNbXSA9IHsKKwl7IC5iYXNlPTB4ZmZmYjE0MDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjEgfSwKKwl7IC5iYXNlPTB4ZmZmYjFjMDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjIgfSwKKwl7IC5iYXNlPTB4ZmZmYjI0MDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjMgfSwKKwl7IC5iYXNlPTB4ZmZmYjJjMDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjQgfSwKKwl7IC5iYXNlPTB4ZmZmYjM0MDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjUgfSwKKwl7IC5iYXNlPTB4ZmZmYjNjMDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjYgfSwKKwl7IC5iYXNlPTB4ZmZmYjQ0MDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjcgfSwKKwl7IC5iYXNlPTB4ZmZmYjRjMDAsIC5pcnE9SU5UXzE2MTBfR1BUSU1FUjggfSwKKwl7IC5iYXNlPTB4MCB9LAorfTsKKworCitzdGF0aWMgc3BpbmxvY2tfdCBkbV90aW1lcl9sb2NrOworCisKK2lubGluZSB2b2lkIG9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCW9tYXBfd3JpdGVsKHZhbHVlLCB0aW1lci0+YmFzZSArIHJlZyk7CisJd2hpbGUgKG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfV1JJVEVfUEVORF9SRUcpKQorCQk7Cit9CisKK3UzMiBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHJlZykKK3sKKwlyZXR1cm4gb21hcF9yZWFkbCh0aW1lci0+YmFzZSArIHJlZyk7Cit9CisKK2ludCBvbWFwX2RtX3RpbWVyc19hY3RpdmUodm9pZCkKK3sKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXI7CisKKwlmb3IgKHRpbWVyID0gJmRtX3RpbWVyc1swXTsgdGltZXItPmJhc2U7ICsrdGltZXIpCisJCWlmIChvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKSAmCisJCSAgICBPTUFQX1RJTUVSX0NUUkxfU1QpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHNvdXJjZSkKK3sKKwlpbnQgbiA9ICh0aW1lciAtIGRtX3RpbWVycykgPDwgMTsKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKE1PRF9DT05GX0NUUkxfMSkgJiB+KDB4MDMgPDwgbik7CisJbCB8PSBzb3VyY2UgPDwgbjsKKwlvbWFwX3dyaXRlbChsLCBNT0RfQ09ORl9DVFJMXzEpOworfQorCisKK3N0YXRpYyB2b2lkIG9tYXBfZG1fdGltZXJfcmVzZXQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCS8qIFJlc2V0IGFuZCBzZXQgcG9zdGVkIG1vZGUgKi8KKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9JRl9DVFJMX1JFRywgMHgwNik7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfT0NQX0NGR19SRUcsIDB4MDIpOworCisJb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHRpbWVyLCBPTUFQX1RJTUVSX1NSQ19BUk1YT1IpOworfQorCisKKworc3RydWN0IG9tYXBfZG1fdGltZXIgKiBvbWFwX2RtX3RpbWVyX3JlcXVlc3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmZG1fdGltZXJfaW5mby51bnVzZWRfdGltZXJzKSkgeworCQl0aW1lciA9IChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqKQorCQkJCWRtX3RpbWVyX2luZm8udW51c2VkX3RpbWVycy5uZXh0OworCQlsaXN0X21vdmVfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKXRpbWVyLAorCQkJCSZkbV90aW1lcl9pbmZvLnJlc2VydmVkX3RpbWVycyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB0aW1lcjsKK30KKworCit2b2lkIG9tYXBfZG1fdGltZXJfZnJlZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW9tYXBfZG1fdGltZXJfcmVzZXQodGltZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKKwlsaXN0X21vdmVfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKXRpbWVyLCAmZG1fdGltZXJfaW5mby51bnVzZWRfdGltZXJzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsCisJCQkJdW5zaWduZWQgaW50IHZhbHVlKQoreworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0lOVF9FTl9SRUcsIHZhbHVlKTsKK30KKwordW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXJldHVybiBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1NUQVRfUkVHKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9TVEFUX1JFRywgdmFsdWUpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfZW5hYmxlX2F1dG9yZWxvYWQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXUzMiBsOworCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwlsIHw9IE9NQVBfVElNRVJfQ1RSTF9BUjsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl90cmlnZ2VyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9UUklHR0VSX1JFRywgMSk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfdHJpZ2dlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwlsIHw9IHZhbHVlICYgMHgzOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwlsIHw9IE9NQVBfVElNRVJfQ1RSTF9TVDsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwlsICY9IH4weDE7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworfQorCit1bnNpZ25lZCBpbnQgb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXJldHVybiBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX3Jlc2V0X2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCAwKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX3NldF9sb2FkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IGxvYWQpCit7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfTE9BRF9SRUcsIGxvYWQpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X21hdGNoKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IG1hdGNoKQoreworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX01BVENIX1JFRywgbWF0Y2gpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfZW5hYmxlX2NvbXBhcmUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXUzMiBsOworCisJbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpOworCWwgfD0gT01BUF9USU1FUl9DVFJMX0NFOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgX19kbV90aW1lcl9pbml0KHZvaWQpCit7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyOworCisJc3Bpbl9sb2NrX2luaXQoJmRtX3RpbWVyX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZkbV90aW1lcl9pbmZvLnVudXNlZF90aW1lcnMpOworCUlOSVRfTElTVF9IRUFEKCZkbV90aW1lcl9pbmZvLnJlc2VydmVkX3RpbWVycyk7CisKKwl0aW1lciA9ICZkbV90aW1lcnNbMF07CisJd2hpbGUgKHRpbWVyLT5iYXNlKSB7CisJCWxpc3RfYWRkX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil0aW1lciwgJmRtX3RpbWVyX2luZm8udW51c2VkX3RpbWVycyk7CisJCW9tYXBfZG1fdGltZXJfcmVzZXQodGltZXIpOworCQl0aW1lcisrOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgb21hcF9kbV90aW1lcl9pbml0KHZvaWQpCit7CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQlfX2RtX3RpbWVyX2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChvbWFwX2RtX3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKaW5kZXggYWE0ODFlYS4uNTUwNTlhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBPTUFQIEdQSU8KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE5va2lhIENvcnBvcmF0aW9uCiAgKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE3LDggKzE3LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgpAQCAtMjksNyArMzIsNyBAQAogLyoKICAqIE9NQVAxNTEwIEdQSU8gcmVnaXN0ZXJzCiAgKi8KLSNkZWZpbmUgT01BUDE1MTBfR1BJT19CQVNFCQkweGZmZmNlMDAwCisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmY2UwMDAKICNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX0lOUFVUCTB4MDAKICNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVAkweDA0CiAjZGVmaW5lIE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0wJMHgwOApAQCAtNDMsMzQgKzQ2LDM3IEBACiAvKgogICogT01BUDE2MTAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICAqLwotI2RlZmluZSBPTUFQMTYxMF9HUElPMV9CQVNFCQkweGZmZmJlNDAwCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU8yX0JBU0UJCTB4ZmZmYmVjMDAKLSNkZWZpbmUgT01BUDE2MTBfR1BJTzNfQkFTRQkJMHhmZmZiYjQwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPNF9CQVNFCQkweGZmZmJiYzAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJlNDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU8yX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJlYzAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU8zX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJiNDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJiYzAwCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fUkVWSVNJT04JCTB4MDAwMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1NZU0NPTkZJRwkJMHgwMDEwCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU1lTU1RBVFVTCQkweDAwMTQKICNkZWZpbmUgT01BUDE2MTBfR1BJT19JUlFTVEFUVVMxCTB4MDAxOAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0lSUUVOQUJMRTEJMHgwMDFjCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fV0FLRVVQRU5BQkxFCTB4MDAyOAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFJTgkJMHgwMDJjCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fREFUQU9VVAkJMHgwMDMwCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fRElSRUNUSU9OCQkweDAwMzQKICNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwxCTB4MDAzOAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDIJMHgwMDNjCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfSVJRRU5BQkxFMQkweDAwOWMKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19DTEVBUl9XQUtFVVBFTkEJMHgwMGE4CiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfREFUQU9VVAkweDAwYjAKICNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMQkweDAwZGMKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BCTB4MDBlOAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1NFVF9EQVRBT1VUCTB4MDBmMAogCiAvKgogICogT01BUDczMCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycwogICovCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzFfQkFTRQkJMHhmZmZiYzAwMAotI2RlZmluZSBPTUFQNzMwX0dQSU8yX0JBU0UJCTB4ZmZmYmM4MDAKLSNkZWZpbmUgT01BUDczMF9HUElPM19CQVNFCQkweGZmZmJkMDAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzRfQkFTRQkJMHhmZmZiZDgwMAotI2RlZmluZSBPTUFQNzMwX0dQSU81X0JBU0UJCTB4ZmZmYmUwMDAKLSNkZWZpbmUgT01BUDczMF9HUElPNl9CQVNFCQkweGZmZmJlODAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzFfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmMwMDAKKyNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYzgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU8zX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJkMDAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzRfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmQ4MDAKKyNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTAwMAorI2RlZmluZSBPTUFQNzMwX0dQSU82X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJlODAwCiAjZGVmaW5lIE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUCQkweDAwCiAjZGVmaW5lIE9NQVA3MzBfR1BJT19EQVRBX09VVFBVVAkweDA0CiAjZGVmaW5lIE9NQVA3MzBfR1BJT19ESVJfQ09OVFJPTAkweDA4CkBAIC03OCwxNCArODQsNDMgQEAKICNkZWZpbmUgT01BUDczMF9HUElPX0lOVF9NQVNLCQkweDEwCiAjZGVmaW5lIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTCQkweDE0CiAKKy8qCisgKiBvbWFwMjR4eCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycworICovCisjZGVmaW5lIE9NQVAyNFhYX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDE4MDAwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU8yX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDFhMDAwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU8zX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDFjMDAwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDFlMDAwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04JCTB4MDAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1NZU0NPTkZJRwkJMHgwMDEwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU1lTU1RBVFVTCQkweDAwMTQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19JUlFTVEFUVVMxCTB4MDAxOAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0lSUUVOQUJMRTEJMHgwMDFjCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ1RSTAkJMHgwMDMwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fT0UJCTB4MDAzNAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0RBVEFJTgkJMHgwMDM4CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fREFUQU9VVAkJMHgwMDNjCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QwCTB4MDA0MAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMQkweDAwNDQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19SSVNJTkdERVRFQ1QJMHgwMDQ4CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fRkFMTElOR0RFVEVDVAkweDAwNGMKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19DTEVBUklSUUVOQUJMRTEJMHgwMDYwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUSVJRRU5BQkxFMQkweDAwNjQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQQkweDAwODAKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19TRVRXS1VFTkEJCTB4MDA4NAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0NMRUFSREFUQU9VVAkweDAwOTAKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19TRVREQVRBT1VUCTB4MDA5NAorCiAjZGVmaW5lIE9NQVBfTVBVSU9fTUFTSwkJKH5PTUFQX01BWF9HUElPX0xJTkVTICYgMHhmZikKIAogc3RydWN0IGdwaW9fYmFuayB7Ci0JdTMyIGJhc2U7CisJdm9pZCBfX2lvbWVtICpiYXNlOwogCXUxNiBpcnE7CiAJdTE2IHZpcnR1YWxfaXJxX3N0YXJ0OwotCXU4IG1ldGhvZDsKKwlpbnQgbWV0aG9kOwogCXUzMiByZXNlcnZlZF9tYXA7CisJdTMyIHN1c3BlbmRfd2FrZXVwOworCXUzMiBzYXZlZF93YWtldXA7CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIApAQCAtOTMsOCArMTI4LDkgQEAKICNkZWZpbmUgTUVUSE9EX0dQSU9fMTUxMAkxCiAjZGVmaW5lIE1FVEhPRF9HUElPXzE2MTAJMgogI2RlZmluZSBNRVRIT0RfR1BJT183MzAJCTMKKyNkZWZpbmUgTUVUSE9EX0dQSU9fMjRYWAk0CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCiBzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMTYxMFs1XSA9IHsKIAl7IE9NQVBfTVBVSU9fQkFTRSwgICAgIElOVF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsICAgICBNRVRIT0RfTVBVSU99LAogCXsgT01BUDE2MTBfR1BJTzFfQkFTRSwgSU5UX0dQSU9fQkFOSzEsCSAgICBJSF9HUElPX0JBU0UsICAgICAgTUVUSE9EX0dQSU9fMTYxMCB9LApAQCAtMTIzLDYgKzE1OSwxNSBAQAogfTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rIGdwaW9fYmFua18yNHh4WzRdID0geworCXsgT01BUDI0WFhfR1BJTzFfQkFTRSwgSU5UXzI0WFhfR1BJT19CQU5LMSwgSUhfR1BJT19CQVNFLAlNRVRIT0RfR1BJT18yNFhYIH0sCisJeyBPTUFQMjRYWF9HUElPMl9CQVNFLCBJTlRfMjRYWF9HUElPX0JBTksyLCBJSF9HUElPX0JBU0UgKyAzMiwJTUVUSE9EX0dQSU9fMjRYWCB9LAorCXsgT01BUDI0WFhfR1BJTzNfQkFTRSwgSU5UXzI0WFhfR1BJT19CQU5LMywgSUhfR1BJT19CQVNFICsgNjQsCU1FVEhPRF9HUElPXzI0WFggfSwKKwl7IE9NQVAyNFhYX0dQSU80X0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzQsIElIX0dQSU9fQkFTRSArIDk2LAlNRVRIT0RfR1BJT18yNFhYIH0sCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rICpncGlvX2Jhbms7CiBzdGF0aWMgaW50IGdwaW9fYmFua19jb3VudDsKIApAQCAtMTQ5LDE0ICsxOTQsMjMgQEAKIAkJcmV0dXJuICZncGlvX2JhbmtbMSArIChncGlvID4+IDUpXTsKIAl9CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJcmV0dXJuICZncGlvX2JhbmtbZ3BpbyA+PiA1XTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfZ3Bpb19pbmRleChpbnQgZ3BpbykKIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCiAJaWYgKGNwdV9pc19vbWFwNzMwKCkpCiAJCXJldHVybiBncGlvICYgMHgxZjsKLQllbHNlCi0JCXJldHVybiBncGlvICYgMHgwZjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQlyZXR1cm4gZ3BpbyAmIDB4MWY7CisjZW5kaWYKKwlyZXR1cm4gZ3BpbyAmIDB4MGY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdmFsaWQoaW50IGdwaW8pCkBAIC0xODAsNiArMjM0LDEwIEBACiAJaWYgKGNwdV9pc19vbWFwNzMwKCkgJiYgZ3BpbyA8IDE5MikKIAkJcmV0dXJuIDA7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChjcHVfaXNfb21hcDI0eHgoKSAmJiBncGlvIDwgMTI4KQorCQlyZXR1cm4gMDsKKyNlbmRpZgogCXJldHVybiAtMTsKIH0KIApAQCAtMTk1LDcgKzI1Myw3IEBACiAKIHN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19kaXJlY3Rpb24oc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBpc19pbnB1dCkKIHsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CiAJdTMyIGw7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewpAQCAtMjExLDYgKzI2OSw5IEBACiAJY2FzZSBNRVRIT0RfR1BJT183MzA6CiAJCXJlZyArPSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0w7CiAJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJcmVnICs9IE9NQVAyNFhYX0dQSU9fT0U7CisJCWJyZWFrOwogCX0KIAlsID0gX19yYXdfcmVhZGwocmVnKTsKIAlpZiAoaXNfaW5wdXQpCkBAIC0yMzQsNyArMjk1LDcgQEAKIAogc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlbmFibGUpCiB7Ci0JdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsID0gMDsKIAogCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CkBAIC0yNjksNiArMzMwLDEzIEBACiAJCWVsc2UKIAkJCWwgJj0gfigxIDw8IGdwaW8pOwogCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCWlmIChlbmFibGUpCisJCQlyZWcgKz0gT01BUDI0WFhfR1BJT19TRVREQVRBT1VUOworCQllbHNlCisJCQlyZWcgKz0gT01BUDI0WFhfR1BJT19DTEVBUkRBVEFPVVQ7CisJCWwgPSAxIDw8IGdwaW87CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm47CkBAIC0yOTEsNyArMzU5LDcgQEAKIGludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3BpbykKIHsKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwotCXUzMiByZWc7CisJdm9pZCBfX2lvbWVtICpyZWc7CiAKIAlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCiAJCXJldHVybiAtMTsKQEAgLTMxMCwxMDkgKzM3OCwxMzIgQEAKIAljYXNlIE1FVEhPRF9HUElPXzczMDoKIAkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUOwogCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCXJlZyArPSBPTUFQMjRYWF9HUElPX0RBVEFJTjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJCXJldHVybiAtMTsKIAl9Ci0JcmV0dXJuIChfX3Jhd19yZWFkbChyZWcpICYgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpKSAhPSAwOworCXJldHVybiAoX19yYXdfcmVhZGwocmVnKQorCQkJJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpICE9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19lZGdlX2N0cmwoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlZGdlKQorI2RlZmluZSBNT0RfUkVHX0JJVChyZWcsIGJpdF9tYXNrLCBzZXQpCVwKK2RvIHsJXAorCWludCBsID0gX19yYXdfcmVhZGwoYmFzZSArIHJlZyk7IFwKKwlpZiAoc2V0KSBsIHw9IGJpdF9tYXNrOyBcCisJZWxzZSBsICY9IH5iaXRfbWFzazsgXAorCV9fcmF3X3dyaXRlbChsLCBiYXNlICsgcmVnKTsgXAorfSB3aGlsZSgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0XzI0eHhfZ3Bpb190cmlnZ2VyaW5nKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IGdwaW8sIGludCB0cmlnZ2VyKQogewotCXUzMiByZWcgPSBiYW5rLT5iYXNlOwotCXUzMiBsOworCXUzMiBncGlvX2JpdCA9IDEgPDwgZ3BpbzsKKworCU1PRF9SRUdfQklUKE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QwLCBncGlvX2JpdCwKKwkJdHJpZ2dlciAmIElSUVRfTE9XKTsKKwlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMSwgZ3Bpb19iaXQsCisJCXRyaWdnZXIgJiBJUlFUX0hJR0gpOworCU1PRF9SRUdfQklUKE9NQVAyNFhYX0dQSU9fUklTSU5HREVURUNULCBncGlvX2JpdCwKKwkJdHJpZ2dlciAmIElSUVRfUklTSU5HKTsKKwlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAorCQl0cmlnZ2VyICYgSVJRVF9GQUxMSU5HKTsKKwkvKiBGSVhNRTogUG9zc2libHkgZG8gJ3NldF9pcnFfaGFuZGxlcihqLCBkb19sZXZlbF9JUlEpJyBpZiBvbmx5IGxldmVsCisJICogdHJpZ2dlcmluZyByZXF1ZXN0ZWQuICovCit9CisKK3N0YXRpYyBpbnQgX3NldF9ncGlvX3RyaWdnZXJpbmcoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCB0cmlnZ2VyKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKKwl1MzIgbCA9IDA7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewogCWNhc2UgTUVUSE9EX01QVUlPOgogCQlyZWcgKz0gT01BUF9NUFVJT19HUElPX0lOVF9FREdFOwogCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVkZ2UgPT0gT01BUF9HUElPX1JJU0lOR19FREdFKQorCQlpZiAodHJpZ2dlciA9PSBJUlFUX1JJU0lORykKIAkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCisJCWVsc2UgaWYgKHRyaWdnZXIgPT0gSVJRVF9GQUxMSU5HKQogCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQllbHNlCisJCQlnb3RvIGJhZDsKIAkJYnJlYWs7CiAJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgogCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfQ09OVFJPTDsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJaWYgKHRyaWdnZXIgPT0gSVJRVF9SSVNJTkcpCiAJCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQorCQllbHNlIGlmICh0cmlnZ2VyID09IElSUVRfRkFMTElORykKIAkJCWwgJj0gfigxIDw8IGdwaW8pOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJZWxzZQorCQkJZ290byBiYWQ7CiAJCWJyZWFrOwogCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJZWRnZSAmPSAweDAzOwogCQlpZiAoZ3BpbyAmIDB4MDgpCiAJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwyOwogCQllbHNlCiAJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwxOwogCQlncGlvICY9IDB4MDc7CisJCS8qIFdlIGFsbG93IG9ubHkgZWRnZSB0cmlnZ2VyaW5nLCBpLmUuIHR3byBsb3dlc3QgYml0cyAqLworCQlpZiAodHJpZ2dlciAmIH5JUlFUX0JPVEhFREdFKQorCQkJQlVHKCk7CisJCS8qIE5PVEU6IGtub3dzIF9fSVJRVF97RkFMLFJJU31FREdFIG1hdGNoIE9NQVAgaGFyZHdhcmUgKi8KKwkJdHJpZ2dlciAmPSAweDAzOwogCQlsID0gX19yYXdfcmVhZGwocmVnKTsKIAkJbCAmPSB+KDMgPDwgKGdwaW8gPDwgMSkpOwotCQlsIHw9IGVkZ2UgPDwgKGdwaW8gPDwgMSk7Ci0JCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQlsIHw9IHRyaWdnZXIgPDwgKGdwaW8gPDwgMSk7CiAJCWJyZWFrOwogCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgogCQlyZWcgKz0gT01BUDczMF9HUElPX0lOVF9DT05UUk9MOwogCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVkZ2UgPT0gT01BUF9HUElPX1JJU0lOR19FREdFKQorCQlpZiAodHJpZ2dlciA9PSBJUlFUX1JJU0lORykKIAkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCisJCWVsc2UgaWYgKHRyaWdnZXIgPT0gSVJRVF9GQUxMSU5HKQogCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQllbHNlCisJCQlnb3RvIGJhZDsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlzZXRfMjR4eF9ncGlvX3RyaWdnZXJpbmcocmVnLCBncGlvLCB0cmlnZ2VyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JCXJldHVybjsKKwkJZ290byBiYWQ7CiAJfQorCV9fcmF3X3dyaXRlbChsLCByZWcpOworCXJldHVybiAwOworYmFkOgorCXJldHVybiAtRUlOVkFMOwogfQogCi12b2lkIG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKGludCBncGlvLCBpbnQgZWRnZSkKK3N0YXRpYyBpbnQgZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpcnEsIHVuc2lnbmVkIHR5cGUpCiB7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKwl1bnNpZ25lZCBncGlvOworCWludCByZXR2YWw7CisKKwlpZiAoaXJxID4gSUhfTVBVSU9fQkFTRSkKKwkJZ3BpbyA9IE9NQVBfTVBVSU8oaXJxIC0gSUhfTVBVSU9fQkFTRSk7CisJZWxzZQorCQlncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwogCiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHR5cGUgJiAoX19JUlFUX0xPV0xWTHxfX0lSUVRfSElHSExWTHxJUlFUX1BST0JFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKIAlzcGluX2xvY2soJmJhbmstPmxvY2spOwotCV9zZXRfZ3Bpb19lZGdlX2N0cmwoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVkZ2UpOworCXJldHZhbCA9IF9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCB0eXBlKTsKIAlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Ci19Ci0KLQotc3RhdGljIGludCBfZ2V0X2dwaW9fZWRnZV9jdHJsKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvKQotewotCXUzMiByZWcgPSBiYW5rLT5iYXNlLCBsOwotCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRSk7Ci0JCXJldHVybiAobCAmICgxIDw8IGdwaW8pKSA/Ci0JCQlPTUFQX0dQSU9fUklTSU5HX0VER0UgOiBPTUFQX0dQSU9fRkFMTElOR19FREdFOwotCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0wpOwotCQlyZXR1cm4gKGwgJiAoMSA8PCBncGlvKSkgPwotCQkJT01BUF9HUElPX1JJU0lOR19FREdFIDogT01BUF9HUElPX0ZBTExJTkdfRURHRTsKLQljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCWlmIChncGlvICYgMHgwOCkKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDI7Ci0JCWVsc2UKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDE7Ci0JCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSA+PiAoKGdwaW8gJiAweDA3KSA8PCAxKSkgJiAweDAzOwotCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgotCQlsID0gX19yYXdfcmVhZGwocmVnICsgT01BUDczMF9HUElPX0lOVF9DT05UUk9MKTsKLQkJcmV0dXJuIChsICYgKDEgPDwgZ3BpbykpID8KLQkJCU9NQVBfR1BJT19SSVNJTkdfRURHRSA6IE9NQVBfR1BJT19GQUxMSU5HX0VER0U7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAtMTsKLQl9CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgX2NsZWFyX2dwaW9faXJxYmFuayhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3Bpb19tYXNrKQogewotCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKIAogCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CiAJY2FzZSBNRVRIT0RfTVBVSU86CkBAIC00MjgsNiArNTE5LDkgQEAKIAljYXNlIE1FVEhPRF9HUElPXzczMDoKIAkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTOwogCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCXJlZyArPSBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzE7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm47CkBAIC00NDIsNyArNTM2LDcgQEAKIAogc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKIHsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CiAJdTMyIGw7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewpAQCAtNDc3LDYgKzU3MSwxMyBAQAogCQllbHNlCiAJCQlsIHw9IGdwaW9fbWFzazsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlpZiAoZW5hYmxlKQorCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fU0VUSVJRRU5BQkxFMTsKKwkJZWxzZQorCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fQ0xFQVJJUlFFTkFCTEUxOworCQlsID0gZ3Bpb19tYXNrOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAkJcmV0dXJuOwpAQCAtNDg5LDYgKzU5MCw1MCBAQAogCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVuYWJsZSk7CiB9CiAKKy8qCisgKiBOb3RlIHRoYXQgRU5BV0FLRVVQIG5lZWRzIHRvIGJlIGVuYWJsZWQgaW4gR1BJT19TWVNDT05GSUcgcmVnaXN0ZXIuCisgKiAxNTEwIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBhIHdha2UtdXAgcmVnaXN0ZXIuIElmIEpUQUcgaXMgY29ubmVjdGVkCisgKiB0byB0aGUgdGFyZ2V0LCBzeXN0ZW0gd2lsbCB3YWtlIHVwIGFsd2F5cyBvbiBHUElPIGV2ZW50cy4gV2hpbGUKKyAqIHN5c3RlbSBpcyBydW5uaW5nIGFsbCByZWdpc3RlcmVkIEdQSU8gaW50ZXJydXB0cyBuZWVkIHRvIGhhdmUgd2FrZS11cAorICogZW5hYmxlZC4gV2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkLCBvbmx5IHNlbGVjdGVkIEdQSU8gaW50ZXJydXB0cyBuZWVkCisgKiB0byBoYXZlIHdha2UtdXAgZW5hYmxlZC4KKyAqLworc3RhdGljIGludCBfc2V0X2dwaW9fd2FrZXVwKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZW5hYmxlKQoreworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWJhbmstPnN1c3BlbmRfd2FrZXVwIHw9ICgxIDw8IGdwaW8pOworCQllbHNlCisJCQliYW5rLT5zdXNwZW5kX3dha2V1cCAmPSB+KDEgPDwgZ3Bpbyk7CisJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBlbmFibGUgR1BJTyB3YWtldXAgZm9yIG1ldGhvZCAlaVxuIiwKKwkJICAgICAgIGJhbmstPm1ldGhvZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyogVXNlIGRpc2FibGVfaXJxX3dha2UoKSBhbmQgZW5hYmxlX2lycV93YWtlKCkgZnVuY3Rpb25zIGZyb20gZHJpdmVycyAqLworc3RhdGljIGludCBncGlvX3dha2VfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKwlpbnQgcmV0dmFsOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlzcGluX2xvY2soJmJhbmstPmxvY2spOworCXJldHZhbCA9IF9zZXRfZ3Bpb193YWtldXAoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVuYWJsZSk7CisJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKwogaW50IG9tYXBfcmVxdWVzdF9ncGlvKGludCBncGlvKQogewogCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CkBAIC01MDUsMTUgKzY1MCwzMyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCWJhbmstPnJlc2VydmVkX21hcCB8PSAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSk7CisKKwkvKiBTZXQgdHJpZ2dlciB0byBub25lLiBZb3UgbmVlZCB0byBlbmFibGUgdGhlIHRyaWdnZXIgYWZ0ZXIgcmVxdWVzdF9pcnEgKi8KKwlfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgSVJRVF9OT0VER0UpOworCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKIAlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE1MTApIHsKLQkJdTMyIHJlZzsKKwkJdm9pZCBfX2lvbWVtICpyZWc7CiAKLQkJLyogQ2xhaW0gdGhlIHBpbiBmb3IgdGhlIEFSTSAqLworCQkvKiBDbGFpbSB0aGUgcGluIGZvciBNUFUgKi8KIAkJcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0w7CiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChyZWcpIHwgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpLCByZWcpOwogCX0KICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CisJCS8qIEVuYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KKwkJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOworCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkgeworCQkvKiBFbmFibGUgd2FrZS11cCBkdXJpbmcgaWRsZSBmb3IgZHluYW1pYyB0aWNrICovCisJCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fU0VUV0tVRU5BOworCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKKwl9CisjZW5kaWYKIAlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTUzMyw2ICs2OTYsMjAgQEAKIAkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwogCQlyZXR1cm47CiAJfQorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CisJCS8qIERpc2FibGUgd2FrZS11cCBkdXJpbmcgaWRsZSBmb3IgZHluYW1pYyB0aWNrICovCisJCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOworCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkgeworCQkvKiBEaXNhYmxlIHdha2UtdXAgZHVyaW5nIGlkbGUgZm9yIGR5bmFtaWMgdGljayAqLworCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BOworCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKKwl9CisjZW5kaWYKIAliYW5rLT5yZXNlcnZlZF9tYXAgJj0gfigxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKIAlfc2V0X2dwaW9fZGlyZWN0aW9uKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCAxKTsKIAlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwpAQCAtNTUyLDcgKzcyOSw3IEBACiBzdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAogCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1MzIgaXNyX3JlZyA9IDA7CisJdm9pZCBfX2lvbWVtICppc3JfcmVnID0gTlVMTDsKIAl1MzIgaXNyOwogCXVuc2lnbmVkIGludCBncGlvX2lycTsKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwpAQCAtNTc0LDI0ICs3NTEsMzAgQEAKIAlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzczMCkKIAkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKQorCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMTsKKyNlbmRpZgogCi0JaXNyID0gX19yYXdfcmVhZGwoaXNyX3JlZyk7Ci0JX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKLQlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcik7Ci0JX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAxKTsKLQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKKwl3aGlsZSgxKSB7CisJCWlzciA9IF9fcmF3X3JlYWRsKGlzcl9yZWcpOworCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3IsIDApOworCQlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcik7CisJCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlzciwgMSk7CisJCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwogCi0JaWYgKHVubGlrZWx5KCFpc3IpKQotCQlyZXR1cm47CisJCWlmICghaXNyKQorCQkJYnJlYWs7CiAKLQlncGlvX2lycSA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OwotCWZvciAoOyBpc3IgIT0gMDsgaXNyID4+PSAxLCBncGlvX2lycSsrKSB7Ci0JCXN0cnVjdCBpcnFkZXNjICpkOwotCQlpZiAoIShpc3IgJiAxKSkKLQkJCWNvbnRpbnVlOwotCQlkID0gaXJxX2Rlc2MgKyBncGlvX2lycTsKLQkJZGVzY19oYW5kbGVfaXJxKGdwaW9faXJxLCBkLCByZWdzKTsKLQl9CisJCWdwaW9faXJxID0gYmFuay0+dmlydHVhbF9pcnFfc3RhcnQ7CisJCWZvciAoOyBpc3IgIT0gMDsgaXNyID4+PSAxLCBncGlvX2lycSsrKSB7CisJCQlzdHJ1Y3QgaXJxZGVzYyAqZDsKKwkJCWlmICghKGlzciAmIDEpKQorCQkJCWNvbnRpbnVlOworCQkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7CisJCQlkZXNjX2hhbmRsZV9pcnEoZ3Bpb19pcnEsIGQsIHJlZ3MpOworCQl9CisgICAgICAgIH0KIH0KIAogc3RhdGljIHZvaWQgZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC02MTMsMTQgKzc5NiwxMCBAQAogc3RhdGljIHZvaWQgZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7CisJdW5zaWduZWQgaW50IGdwaW9faWR4ID0gZ2V0X2dwaW9faW5kZXgoZ3Bpbyk7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CiAKLQlpZiAoX2dldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSkgPT0gT01BUF9HUElPX05PX0VER0UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIEdQSU8gJWQ6IHRyeWluZyB0byBlbmFibGUgR1BJTyBJUlEgd2hpbGUgbm8gZWRnZSBpcyBzZXRcbiIsCi0JCSAgICAgICBncGlvKTsKLQkJX3NldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKLQl9Ci0JX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAxKTsKKwlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW9faWR4LCAxKTsKIH0KIAogc3RhdGljIHZvaWQgbXB1aW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtNjQ1LDkgKzgyNCwxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycWNoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKLQkuYWNrCT0gZ3Bpb19hY2tfaXJxLAotCS5tYXNrCT0gZ3Bpb19tYXNrX2lycSwKLQkudW5tYXNrID0gZ3Bpb191bm1hc2tfaXJxLAorCS5hY2sJCT0gZ3Bpb19hY2tfaXJxLAorCS5tYXNrCQk9IGdwaW9fbWFza19pcnEsCisJLnVubWFzawkJPSBncGlvX3VubWFza19pcnEsCisJLnNldF90eXBlCT0gZ3Bpb19pcnFfdHlwZSwKKwkuc2V0X3dha2UJPSBncGlvX3dha2VfZW5hYmxlLAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFjaGlwIG1wdWlvX2lycV9jaGlwID0gewpAQCAtNjU3LDYgKzgzOCw3IEBACiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICogZ3Bpb19jayA9IE5VTEw7CiAKIHN0YXRpYyBpbnQgX19pbml0IF9vbWFwX2dwaW9faW5pdCh2b2lkKQogewpAQCAtNjY1LDYgKzg0NywxNCBAQAogCiAJaW5pdGlhbGl6ZWQgPSAxOwogCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWdwaW9fY2sgPSBjbGtfZ2V0KE5VTEwsICJhcm1fZ3Bpb19jayIpOworCQlpZiAoSVNfRVJSKGdwaW9fY2spKQorCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGFybV9ncGlvX2NrXG4iKTsKKwkJZWxzZQorCQkJY2xrX3VzZShncGlvX2NrKTsKKwl9CisKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAogCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMTUxMCBHUElPIGhhcmR3YXJlXG4iKTsKQEAgLTY3NCw3ICs4NjQsNyBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKIAlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJaW50IHJldjsKKwkJdTMyIHJldjsKIAogCQlncGlvX2JhbmtfY291bnQgPSA1OwogCQlncGlvX2JhbmsgPSBncGlvX2JhbmtfMTYxMDsKQEAgLTY5MCw2ICs4ODAsMTcgQEAKIAkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzczMDsKIAl9CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgeworCQlpbnQgcmV2OworCisJCWdwaW9fYmFua19jb3VudCA9IDQ7CisJCWdwaW9fYmFuayA9IGdwaW9fYmFua18yNHh4OworCQlyZXYgPSBvbWFwX3JlYWRsKGdwaW9fYmFua1swXS5iYXNlICsgT01BUDI0WFhfR1BJT19SRVZJU0lPTik7CisJCXByaW50ayhLRVJOX0lORk8gIk9NQVAyNHh4IEdQSU8gaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKKwkJCShyZXYgPj4gNCkgJiAweDBmLCByZXYgJiAweDBmKTsKKwl9CisjZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgZ3Bpb19iYW5rX2NvdW50OyBpKyspIHsKIAkJaW50IGosIGdwaW9fY291bnQgPSAxNjsKIApAQCAtNzEwLDYgKzkxMSw3IEBACiAJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgewogCQkJX19yYXdfd3JpdGV3KDB4MDAwMCwgYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMSk7CiAJCQlfX3Jhd193cml0ZXcoMHhmZmZmLCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19JUlFTVEFUVVMxKTsKKwkJCV9fcmF3X3dyaXRldygweDAwMTQsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NZU0NPTkZJRyk7CiAJCX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKQEAgLTcyMCw2ICs5MjIsMTQgQEAKIAkJCWdwaW9fY291bnQgPSAzMjsgLyogNzMwIGhhcyAzMi1iaXQgR1BJT3MgKi8KIAkJfQogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKSB7CisJCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRRU5BQkxFMSk7CisJCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMSk7CisKKwkJCWdwaW9fY291bnQgPSAzMjsKKwkJfQorI2VuZGlmCiAJCWZvciAoaiA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OwogCQkgICAgIGogPCBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCArIGdwaW9fY291bnQ7IGorKykgewogCQkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfTVBVSU8pCkBAIC03MzUsMTIgKzk0NSw5NyBAQAogCiAJLyogRW5hYmxlIHN5c3RlbSBjbG9jayBmb3IgR1BJTyBtb2R1bGUuCiAJICogVGhlIENBTV9DTEtfQ1RSTCAqaXMqIHJlYWxseSB0aGUgcmlnaHQgcGxhY2UuICovCi0JaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKQorCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKIAkJb21hcF93cml0ZWwob21hcF9yZWFkbChVTFBEX0NBTV9DTEtfQ1RSTCkgfCAweDA0LCBVTFBEX0NBTV9DTEtfQ1RSTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX09NQVAxNlhYKSB8fCBkZWZpbmVkIChDT05GSUdfQVJDSF9PTUFQMjRYWCkKK3N0YXRpYyBpbnQgb21hcF9ncGlvX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJaW50IGk7CisKKwlpZiAoIWNwdV9pc19vbWFwMjR4eCgpICYmICFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb19iYW5rX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9ICZncGlvX2JhbmtbaV07CisJCXZvaWQgX19pb21lbSAqd2FrZV9zdGF0dXM7CisJCXZvaWQgX19pb21lbSAqd2FrZV9jbGVhcjsKKwkJdm9pZCBfX2lvbWVtICp3YWtlX3NldDsKKworCQlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgeworCQljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCQl3YWtlX3N0YXR1cyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1dBS0VVUEVOQUJMRTsKKwkJCXdha2VfY2xlYXIgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19DTEVBUl9XQUtFVVBFTkE7CisJCQl3YWtlX3NldCA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NFVF9XQUtFVVBFTkE7CisJCQlicmVhazsKKwkJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQkJd2FrZV9zdGF0dXMgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CisJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fQ0xFQVJXS1VFTkE7CisJCQl3YWtlX3NldCA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX1NFVFdLVUVOQTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCX0KKworCQlzcGluX2xvY2soJmJhbmstPmxvY2spOworCQliYW5rLT5zYXZlZF93YWtldXAgPSBfX3Jhd19yZWFkbCh3YWtlX3N0YXR1cyk7CisJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCB3YWtlX2NsZWFyKTsKKwkJX19yYXdfd3JpdGVsKGJhbmstPnN1c3BlbmRfd2FrZXVwLCB3YWtlX3NldCk7CisJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2dwaW9fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlpZiAoIWNwdV9pc19vbWFwMjR4eCgpICYmICFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb19iYW5rX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9ICZncGlvX2JhbmtbaV07CisJCXZvaWQgX19pb21lbSAqd2FrZV9jbGVhcjsKKwkJdm9pZCBfX2lvbWVtICp3YWtlX3NldDsKKworCQlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgeworCQljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOworCQkJYnJlYWs7CisJCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJCXdha2VfY2xlYXIgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19DTEVBUl9XQUtFVVBFTkE7CisJCQl3YWtlX3NldCA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NFVF9XQUtFVVBFTkE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIHdha2VfY2xlYXIpOworCQlfX3Jhd193cml0ZWwoYmFuay0+c2F2ZWRfd2FrZXVwLCB3YWtlX3NldCk7CisJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgb21hcF9ncGlvX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoImdwaW8iKSwKKwkuc3VzcGVuZAk9IG9tYXBfZ3Bpb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gb21hcF9ncGlvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBvbWFwX2dwaW9fZGV2aWNlID0geworCS5pZAkJPSAwLAorCS5jbHMJCT0gJm9tYXBfZ3Bpb19zeXNjbGFzcywKK307CisjZW5kaWYKKwogLyoKICAqIFRoaXMgbWF5IGdldCBjYWxsZWQgZWFybHkgZnJvbSBib2FyZCBzcGVjaWZpYyBpbml0CiAgKi8KQEAgLTc1MiwxMSArMTA0NywzMCBAQAogCQlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX2luaXQgb21hcF9ncGlvX3N5c2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghaW5pdGlhbGl6ZWQpCisJCXJldCA9IF9vbWFwX2dwaW9faW5pdCgpOworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJm9tYXBfZ3Bpb19zeXNjbGFzcyk7CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZvbWFwX2dwaW9fZGV2aWNlKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKwogRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfZ3Bpbyk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9ncGlvKTsKIEVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24pOwogRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2RhdGFvdXQpOwogRVhQT1JUX1NZTUJPTChvbWFwX2dldF9ncGlvX2RhdGFpbik7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKTsKIAotYXJjaF9pbml0Y2FsbChvbWFwX2dwaW9faW5pdCk7CithcmNoX2luaXRjYWxsKG9tYXBfZ3Bpb19zeXNpbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKaW5kZXggNDM1NjdkNS4uOWM5YjdkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZHNwX2NvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL21jYnNwLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KQEAgLTE4Nyw5ICsxODgsNiBAQAogCXJldHVybiAtMTsKIH0KIAotI2RlZmluZSBFTl9YT1JQQ0sJCTEKLSNkZWZpbmUgRFNQX1JTVENUMiAgICAgICAgICAgICAgMHhlMTAwODAxNAotCiBzdGF0aWMgdm9pZCBvbWFwX21jYnNwX2RzcF9yZXF1ZXN0KHZvaWQpCiB7CiAJaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTZ4eCgpKSB7CkBAIC0xOTgsNiArMTk2LDExIEBACiAKIAkJLyogZW5hYmxlIDEyTUh6IGNsb2NrIHRvIG1jYnNwIDEgJiAzICovCiAJCWNsa191c2UobWNic3BfZHNweG9yX2NrKTsKKworCQkvKgorCQkgKiBEU1AgZXh0ZXJuYWwgcGVyaXBoZXJhbCByZXNldAorCQkgKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gZHNwIGNvZGUKKwkJICovCiAJCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhEU1BfUlNUQ1QyKSB8IDEgfCAxIDw8IDEsCiAJCQkgICAgIERTUF9SU1RDVDIpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwppbmRleCBlYTdiOTU1Li42NDQ4MjA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCkBAIC00OCw2ICs0OCw5IEBACiAJCXB1bGxfb3JpZyA9IDAsIHB1bGwgPSAwOwogCXVuc2lnbmVkIGludCBtYXNrLCB3YXJuID0gMDsKIAorCWlmIChjcHVfaXNfb21hcDd4eCgpKQorCQlyZXR1cm4gMDsKKwogCWlmIChyZWdfY2ZnID4gQVJSQVlfU0laRShyZWdfY2ZnX3RhYmxlKSkgewogCQlwcmludGsoS0VSTl9FUlIgIk1VWDogcmVnX2NmZyAlZFxuIiwgcmVnX2NmZyk7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKaW5kZXggMmVkZTJlZS4uMWZiMTZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvcG0uYwppbmRleCBlNjUzNmIxLi5lMTVjNmMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvcG0uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvcG0uYwpAQCAtMzksMjQgKzM5LDMyIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAxNnh4Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9wbS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvdHBzNjUwMTAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9kc3BfY29tbW9uLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInNyYW0uaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCBhcm1fc2xlZXBfc2F2ZVtBUk1fU0xFRVBfU0FWRV9TSVpFXTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB1bHBkX3NsZWVwX3NhdmVbVUxQRF9TTEVFUF9TQVZFX1NJWkVdOwogc3RhdGljIHVuc2lnbmVkIGludCBtcHVpMTUxMF9zbGVlcF9zYXZlW01QVUkxNTEwX1NMRUVQX1NBVkVfU0laRV07CiBzdGF0aWMgdW5zaWduZWQgaW50IG1wdWkxNjEwX3NsZWVwX3NhdmVbTVBVSTE2MTBfU0xFRVBfU0FWRV9TSVpFXTsKIAorc3RhdGljIHZvaWQgKCpvbWFwX3NyYW1faWRsZSkodm9pZCkgPSBOVUxMOworc3RhdGljIHZvaWQgKCpvbWFwX3NyYW1fc3VzcGVuZCkodW5zaWduZWQgbG9uZyByMCwgdW5zaWduZWQgbG9uZyByMSkgPSBOVUxMOworCiAvKgogICogTGV0J3MgcG93ZXIgZG93biBvbiBpZGxlLCBidXQgb25seSBpZiB3ZSBhcmUgcmVhbGx5CiAgKiBpZGxlLCBiZWNhdXNlIG9uY2Ugd2Ugc3RhcnQgZG93biB0aGUgcGF0aCBvZgpAQCAtNjUsNyArNzMsNiBAQAogICovCiB2b2lkIG9tYXBfcG1faWRsZSh2b2lkKQogewotCWludCAoKmZ1bmNfcHRyKSh2b2lkKSA9IDA7CiAJdW5zaWduZWQgaW50IG1hc2szMiA9IDA7CiAKIAkvKgpAQCAtODQsNiArOTEsMTMgQEAKIAltYXNrMzIgPSBvbWFwX3JlYWRsKEFSTV9TWVNTVCk7CiAKIAkvKgorCSAqIFByZXZlbnQgdGhlIFVMUEQgZnJvbSBlbnRlcmluZyBsb3cgcG93ZXIgc3RhdGUgYnkgc2V0dGluZworCSAqIFBPV0VSX0NUUkxfUkVHOjQgPSAwCisJICovCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKKwkJICAgIH5VTFBEX0RFRVBfU0xFRVBfVFJBTlNJVElPTl9FTiwgVUxQRF9QT1dFUl9DVFJMKTsKKworCS8qCiAJICogU2luY2UgYW4gaW50ZXJydXB0IG1heSBzZXQgdXAgYSB0aW1lciwgd2UgZG9uJ3Qgd2FudCB0bwogCSAqIHJlcHJvZ3JhbSB0aGUgaGFyZHdhcmUgdGltZXIgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCiAJICogUmUtZW5hYmxlIGludGVycnVwdHMgb25seSBhZnRlciByZXR1cm5pbmcgZnJvbSBpZGxlLgpAQCAtOTIsMTggKzEwNiw5IEBACiAKIAlpZiAoKG1hc2szMiAmIERTUF9JRExFKSA9PSAwKSB7CiAJCV9fYXNtX18gdm9sYXRpbGUgKCJtY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0Iik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKKwkJb21hcF9zcmFtX2lkbGUoKTsKIAotCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQpOwotCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7Ci0JCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5EKTsKLQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCk7Ci0JCX0KLQotCQlmdW5jX3B0cigpOwotCX0KIAlsb2NhbF9maXFfZW5hYmxlKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQpAQCAtMTE1LDU4ICsxMjAsNTUgQEAKICAqLwogc3RhdGljIHZvaWQgb21hcF9wbV93YWtldXBfc2V0dXAodm9pZCkKIHsKLQkvKgotCSAqIEVuYWJsZSBBUk0gWE9SIGNsb2NrIGFuZCByZWxlYXNlIHBlcmlwaGVyYWwgZnJvbSByZXNldCBieQotCSAqIHdyaXRpbmcgMSB0byBQRVJfRU4gYml0IGluIEFSTV9SU1RDVDIsIHRoaXMgaXMgcmVxdWlyZWQKLQkgKiBmb3IgVUFSVCBjb25maWd1cmF0aW9uIHRvIHVzZSBVQVJUMiB0byB3YWtlIHVwLgotCSAqLwotCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCBFTkFCTEVfWE9SQ0xLLCBBUk1fSURMRUNUMik7Ci0Jb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fUlNUQ1QyKSB8IFBFUl9FTiwgQVJNX1JTVENUMik7Ci0Jb21hcF93cml0ZXcoTU9ERU1fMzJLX0VOLCBVTFBEX0NMT0NLX0NUUkwpOworCXUzMiBsZXZlbDFfd2FrZSA9IE9NQVBfSVJRX0JJVChJTlRfSUgyX0lSUSk7CisJdTMyIGxldmVsMl93YWtlID0gT01BUF9JUlFfQklUKElOVF9VQVJUMikgfCBPTUFQX0lSUV9CSVQoSU5UX0tFWUJPQVJEKTsKIAogCS8qCi0JICogVHVybiBvZmYgYWxsIGludGVycnVwdHMgZXhjZXB0IEwxLTJuZCBsZXZlbCBjYXNjYWRlLAotCSAqIGFuZCB0aGUgTDIgd2FrZXVwIGludGVycnVwdHM6IGtleXBhZCBhbmQgVUFSVDIuCisJICogVHVybiBvZmYgYWxsIGludGVycnVwdHMgZXhjZXB0IEdQSU8gYmFuayAxLCBMMS0ybmQgbGV2ZWwgY2FzY2FkZSwKKwkgKiBhbmQgdGhlIEwyIHdha2V1cCBpbnRlcnJ1cHRzOiBrZXlwYWQgYW5kIFVBUlQyLiBOb3RlIHRoYXQgdGhlCisJICogZHJpdmVycyBtdXN0IHN0aWxsIHNlcGFyYXRlbHkgY2FsbCBvbWFwX3NldF9ncGlvX3dha2V1cCgpIHRvCisJICogd2FrZSB1cCB0byBhIEdQSU8gaW50ZXJydXB0LgogCSAqLworCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkKKwkJbGV2ZWwxX3dha2UgfD0gT01BUF9JUlFfQklUKElOVF9HUElPX0JBTksxKTsKKwllbHNlIGlmIChjcHVfaXNfb21hcDczMCgpKQorCQlsZXZlbDFfd2FrZSB8PSBPTUFQX0lSUV9CSVQoSU5UXzczMF9HUElPX0JBTksxKTsKIAotCW9tYXBfd3JpdGVsKH5JUlFfTEVWRUwyLCBPTUFQX0lIMV9NSVIpOworCW9tYXBfd3JpdGVsKH5sZXZlbDFfd2FrZSwgT01BUF9JSDFfTUlSKTsKIAotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlvbWFwX3dyaXRlbCh+KElSUV9VQVJUMiB8IElSUV9LRVlCT0FSRCksICBPTUFQX0lIMl9NSVIpOwotCX0KKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCW9tYXBfd3JpdGVsKH5sZXZlbDJfd2FrZSwgIE9NQVBfSUgyX01JUik7CiAKKwkvKiBJTlRfMTYxMF9XQUtFX1VQX1JFUSBpcyBuZWVkZWQgZm9yIEdQSU8gd2FrZXVwLi4uICovCiAJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCW9tYXBfd3JpdGVsKH4oSVJRX1VBUlQyIHwgSVJRX0tFWUJPQVJEKSwgT01BUF9JSDJfMF9NSVIpOwotCi0JCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzFfTUlSKTsKKwkJb21hcF93cml0ZWwofmxldmVsMl93YWtlLCBPTUFQX0lIMl8wX01JUik7CisJCW9tYXBfd3JpdGVsKH5PTUFQX0lSUV9CSVQoSU5UXzE2MTBfV0FLRV9VUF9SRVEpLCBPTUFQX0lIMl8xX01JUik7CiAJCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzJfTUlSKTsKIAkJb21hcF93cml0ZWwofjB4MCwgT01BUF9JSDJfM19NSVIpOwogCX0KIAotCS8qICBOZXcgSVJRIGFncmVlbWVudCAqLworCS8qICBOZXcgSVJRIGFncmVlbWVudCwgcmVjYWxjdWxhdGUgaW4gY2FzY2FkZSBvcmRlciAqLworCW9tYXBfd3JpdGVsKDEsIE9NQVBfSUgyX0NPTlRST0wpOwogIAlvbWFwX3dyaXRlbCgxLCBPTUFQX0lIMV9DT05UUk9MKTsKLQotCS8qIGV4dGVybmFsIFBVTEwgdG8gZG93biwgYml0IDIyID0gMCAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoUFVMTF9EV05fQ1RSTF8yKSAmIH4oMTw8MjIpLCBQVUxMX0RXTl9DVFJMXzIpOwogfQogCiB2b2lkIG9tYXBfcG1fc3VzcGVuZCh2b2lkKQogewotCXVuc2lnbmVkIGludCBtYXNrMzIgPSAwOwogCXVuc2lnbmVkIGxvbmcgYXJnMCA9IDAsIGFyZzEgPSAwOwotCWludCAoKmZ1bmNfcHRyKSh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBzYXZlX2RzcF9pZGxlY3QyOwogCi0JcHJpbnRrKCJQTTogT01BUCV4IGlzIGVudGVyaW5nIGRlZXAgc2xlZXAgbm93IC4uLlxuIiwgc3lzdGVtX3Jldik7CisJcHJpbnRrKCJQTTogT01BUCV4IGlzIHRyeWluZyB0byBlbnRlciBkZWVwIHNsZWVwLi4uXG4iLCBzeXN0ZW1fcmV2KTsKKworCW9tYXBfc2VyaWFsX3dha2VfdHJpZ2dlcigxKTsKIAogCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKIAkJLyogU3RvcCBMRUQxIChEOSkgYmxpbmsgKi8KIAkJdHBzNjUwMTBfc2V0X2xlZChMRUQxLCBPRkYpOwogCX0KIAorCW9tYXBfd3JpdGV3KDB4ZmZmZiwgVUxQRF9TT0ZUX0RJU0FCTEVfUkVRX1JFRyk7CisKIAkvKgotCSAqIFN0ZXAgMTogdHVybiBvZmYgaW50ZXJydXB0cworCSAqIFN0ZXAgMTogdHVybiBvZmYgaW50ZXJydXB0cyAoRklYTUU6IE5PVEU6IGFscmVhZHkgZGlzYWJsZWQpCiAJICovCiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtMjA3LDYgKzIwOSw4IEBACiAJQVJNX1NBVkUoQVJNX0NLQ1RMKTsKIAlBUk1fU0FWRShBUk1fSURMRUNUMSk7CiAJQVJNX1NBVkUoQVJNX0lETEVDVDIpOworCWlmICghKGNwdV9pc19vbWFwMTUxMCgpKSkKKwkJQVJNX1NBVkUoQVJNX0lETEVDVDMpOwogCUFSTV9TQVZFKEFSTV9FV1VQQ1QpOwogCUFSTV9TQVZFKEFSTV9SU1RDVDEpOwogCUFSTV9TQVZFKEFSTV9SU1RDVDIpOwpAQCAtMjE0LDQyICsyMTgsMTIgQEAKIAlVTFBEX1NBVkUoVUxQRF9DTE9DS19DVFJMKTsKIAlVTFBEX1NBVkUoVUxQRF9TVEFUVVNfUkVRKTsKIAotCS8qCi0JICogU3RlcCAzOiBMT1dfUFdSIHNpZ25hbCBlbmFibGluZwotCSAqCi0JICogQWxsb3cgdGhlIExPV19QV1Igc2lnbmFsIHRvIGJlIHZpc2libGUgb24gTVBVSU81IGJhbGwuCi0JICovCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgxIChMT1dfUE9XRVIgaXMgYXZhaWxhYmxlKSAqLwotCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KFVMUERfUE9XRVJfQ1RSTCkgfAotCQkJICAgIE9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgxIChMT1dfUE9XRVIgaXMgYXZhaWxhYmxlKSAqLwotCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KFVMUERfUE9XRVJfQ1RSTCkgfAotCQkJICAgIE9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9Ci0KLQkvKiBjb25maWd1cmUgTE9XX1BXUiBwaW4gKi8KLQlvbWFwX2NmZ19yZWcoVDIwXzE2MTBfTE9XX1BXUik7CisJLyogKFN0ZXAgMyByZW1vdmVkIC0gd2Ugbm93IGFsbG93IGRlZXAgc2xlZXAgYnkgZGVmYXVsdCkgKi8KIAogCS8qCiAJICogU3RlcCA0OiBPTUFQIERTUCBTaHV0ZG93bgogCSAqLwogCi0JLyogU2V0IERTUF9SU1QgPSAxIGFuZCBEU1BfRU4gPSAwLCBwdXQgRFNQIGJsb2NrIGludG8gcmVzZXQgKi8KLQlvbWFwX3dyaXRlbCgob21hcF9yZWFkbChBUk1fUlNUQ1QxKSB8IERTUF9SU1QpICYgfkRTUF9FTkFCTEUsCi0JCSAgICBBUk1fUlNUQ1QxKTsKLQotCS8qIFNldCBEU1AgYm9vdCBtb2RlIHRvIERTUC1JRExFLCBEU1BfQk9PVF9NT0RFID0gMHgyICovCi0gICAgICAgIG9tYXBfd3JpdGVsKERTUF9JRExFX01PREUsIE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKLQotCS8qIFNldCBFTl9EU1BDSyA9IDAsIHN0b3AgRFNQIGJsb2NrIGNsb2NrICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fQ0tDVEwpICYgfkRTUF9DTE9DS19FTkFCTEUsIEFSTV9DS0NUTCk7Ci0KLQkvKiBTdG9wIGFueSBEU1AgZG9tYWluIGNsb2NrcyAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgKDE8PEVOX0FQSUNLKSwgQVJNX0lETEVDVDIpOwotCXNhdmVfZHNwX2lkbGVjdDIgPSBfX3Jhd19yZWFkdyhEU1BfSURMRUNUMik7Ci0JX19yYXdfd3JpdGV3KDAsIERTUF9JRExFQ1QyKTsKIAogCS8qCiAJICogU3RlcCA1OiBXYWtldXAgRXZlbnQgU2V0dXAKQEAgLTI1OCwyNCArMjMyLDkgQEAKIAlvbWFwX3BtX3dha2V1cF9zZXR1cCgpOwogCiAJLyoKLQkgKiBTdGVwIDZhOiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgotCSAqCi0JICogU3RlcCA2IHN0YXJ0cyBoZXJlIHdpdGggY2xvY2sgYW5kIHdhdGNoZG9nIGRpc2FibGUKKwkgKiBTdGVwIDY6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCiAJICovCiAKLQkvKiBzdG9wIGNsb2NrcyAqLwotCW1hc2szMiA9IG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpOwotCW1hc2szMiAmPSB+KDE8PEVOX1dEVENLKTsgIC8qIGJpdCAwIC0+IDAgKFdEVCBjbG9jaykgKi8KLQltYXNrMzIgfD0gICgxPDxFTl9YT1JQQ0spOyAvKiBiaXQgMSAtPiAxIChYT1JQQ0sgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fUEVSQ0spOyAgLyogYml0IDIgLT4gMCAoTVBVUEVSX0NLIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX0xDRENLKTsgIC8qIGJpdCAzIC0+IDAgKExDREMgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fTEJDSyk7ICAgLyogYml0IDQgLT4gMCAobG9jYWwgYnVzIGNsb2NrKSAqLwotCW1hc2szMiB8PSAgKDE8PEVOX0FQSUNLKTsgIC8qIGJpdCA2IC0+IDEgKE1QVUkgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fVElNQ0spOyAgLyogYml0IDcgLT4gMCAoTVBVIHRpbWVyIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PERNQUNLX1JFUSk7IC8qIGJpdCA4IC0+IDAgKERNQUMgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fR1BJT0NLKTsgLyogYml0IDkgLT4gMCAoR1BJTyBjbG9jaykgKi8KLQlvbWFwX3dyaXRlbChtYXNrMzIsIEFSTV9JRExFQ1QyKTsKLQogCS8qIGRpc2FibGUgQVJNIHdhdGNoZG9nICovCiAJb21hcF93cml0ZWwoMHgwMEY1LCBPTUFQX1dEVF9USU1FUl9NT0RFKTsKIAlvbWFwX3dyaXRlbCgweDAwQTAsIE9NQVBfV0RUX1RJTUVSX01PREUpOwpAQCAtMjk1LDQ3ICsyNTQsMjQgQEAKIAlhcmcwID0gYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfQVJNX0lETEVDVDFdOwogCWFyZzEgPSBhcm1fc2xlZXBfc2F2ZVtBUk1fU0xFRVBfU0FWRV9BUk1fSURMRUNUMl07CiAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQMTUxMF9TUkFNX0FQSV9TVVNQRU5EKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7Ci0JCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE2MTBfU1JBTV9BUElfU1VTUEVORCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVA1OTEyX1NSQU1fQVBJX1NVU1BFTkQpOwotCX0KLQogCS8qCiAJICogU3RlcCA2YzogQVJNIGFuZCBUcmFmZmljIGNvbnRyb2xsZXIgc2h1dGRvd24KIAkgKgogCSAqIEp1bXAgdG8gYXNzZW1ibHkgY29kZS4gVGhlIHByb2Nlc3NvciB3aWxsIHN0YXkgdGhlcmUKICAJICogdW50aWwgd2FrZSB1cC4KIAkgKi8KLQotICAgICAgICBmdW5jX3B0cihhcmcwLCBhcmcxKTsKKyAgICAgICAgb21hcF9zcmFtX3N1c3BlbmQoYXJnMCwgYXJnMSk7CiAKIAkvKgogCSAqIElmIHdlIGFyZSBoZXJlLCBwcm9jZXNzb3IgaXMgd29rZW4gdXAhCiAJICovCiAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJLyogUE9XRVJfQ1RSTF9SRUcgPSAweDAgKExPV19QT1dFUiBpcyBkaXNhYmxlZCkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKLQkJCSAgICB+T01BUDE1MTBfVUxQRF9MT1dfUE9XRVJfUkVRLCBVTFBEX1BPV0VSX0NUUkwpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJLyogUE9XRVJfQ1RSTF9SRUcgPSAweDAgKExPV19QT1dFUiBpcyBkaXNhYmxlZCkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKLQkJCSAgICB+T01BUDE2MTBfVUxQRF9MT1dfUE9XRVJfUkVRLCBVTFBEX1BPV0VSX0NUUkwpOwotCX0KLQotCi0JLyogUmVzdG9yZSBEU1AgY2xvY2tzICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCAoMTw8RU5fQVBJQ0spLCBBUk1fSURMRUNUMik7Ci0JX19yYXdfd3JpdGV3KHNhdmVfZHNwX2lkbGVjdDIsIERTUF9JRExFQ1QyKTsKLQlBUk1fUkVTVE9SRShBUk1fSURMRUNUMik7Ci0KIAkvKgogCSAqIFJlc3RvcmUgQVJNIHN0YXRlLCBleGNlcHQgQVJNX0lETEVDVDEvMiB3aGljaCBvbWFwX2NwdV9zdXNwZW5kIGRpZAogCSAqLwogCisJaWYgKCEoY3B1X2lzX29tYXAxNTEwKCkpKQorCQlBUk1fUkVTVE9SRShBUk1fSURMRUNUMyk7CiAJQVJNX1JFU1RPUkUoQVJNX0NLQ1RMKTsKIAlBUk1fUkVTVE9SRShBUk1fRVdVUENUKTsKIAlBUk1fUkVTVE9SRShBUk1fUlNUQ1QxKTsKQEAgLTM2Niw2ICszMDIsOCBAQAogCQlNUFVJMTYxMF9SRVNUT1JFKE9NQVBfSUgyXzNfTUlSKTsKIAl9CiAKKwlvbWFwX3dyaXRldygwLCBVTFBEX1NPRlRfRElTQUJMRV9SRVFfUkVHKTsKKwogCS8qCiAJICogUmVlbmFibGUgaW50ZXJydXB0cwogCSAqLwpAQCAtMzczLDYgKzMxMSw4IEBACiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWxvY2FsX2ZpcV9lbmFibGUoKTsKIAorCW9tYXBfc2VyaWFsX3dha2VfdHJpZ2dlcigwKTsKKwogCXByaW50aygiUE06IE9NQVAleCBpcyByZS1zdGFydGluZyBmcm9tIGRlZXAgc2xlZXAuLi5cbiIsIHN5c3RlbV9yZXYpOwogCiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgewpAQCAtNDAxLDYgKzM0MSw4IEBACiAJQVJNX1NBVkUoQVJNX0NLQ1RMKTsKIAlBUk1fU0FWRShBUk1fSURMRUNUMSk7CiAJQVJNX1NBVkUoQVJNX0lETEVDVDIpOworCWlmICghKGNwdV9pc19vbWFwMTUxMCgpKSkKKwkJQVJNX1NBVkUoQVJNX0lETEVDVDMpOwogCUFSTV9TQVZFKEFSTV9FV1VQQ1QpOwogCUFSTV9TQVZFKEFSTV9SU1RDVDEpOwogCUFSTV9TQVZFKEFSTV9SU1RDVDIpOwpAQCAtNDM2LDYgKzM3OCw3IEBACiAJCSAgICJBUk1fQ0tDVExfUkVHOiAgICAgICAgICAgIDB4JS04eCAgICAgXG4iCiAJCSAgICJBUk1fSURMRUNUMV9SRUc6ICAgICAgICAgIDB4JS04eCAgICAgXG4iCiAJCSAgICJBUk1fSURMRUNUMl9SRUc6ICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fSURMRUNUM19SRUc6CSAgICAgIDB4JS04eCAgICAgXG4iCiAJCSAgICJBUk1fRVdVUENUX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCiAJCSAgICJBUk1fUlNUQ1QxX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCiAJCSAgICJBUk1fUlNUQ1QyX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCkBAIC00NDksNiArMzkyLDcgQEAKIAkJICAgQVJNX1NIT1coQVJNX0NLQ1RMKSwKIAkJICAgQVJNX1NIT1coQVJNX0lETEVDVDEpLAogCQkgICBBUk1fU0hPVyhBUk1fSURMRUNUMiksCisJCSAgIEFSTV9TSE9XKEFSTV9JRExFQ1QzKSwKIAkJICAgQVJNX1NIT1coQVJNX0VXVVBDVCksCiAJCSAgIEFSTV9TSE9XKEFSTV9SU1RDVDEpLAogCQkgICBBUk1fU0hPVyhBUk1fUlNUQ1QyKSwKQEAgLTUwNyw3ICs0NTEsNyBAQAogCiAJZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJkcml2ZXIvb21hcF9wbSIsCiAJCQkJICAgICAgIFNfSVdVU1IgfCBTX0lSVUdPLCBOVUxMLAotCQkJCSAgICAgICBvbWFwX3BtX3JlYWRfcHJvYywgMCk7CisJICAgb21hcF9wbV9yZWFkX3Byb2MsIE5VTEwpOwogfQogCiAjZW5kaWYgLyogREVCVUcgJiYgQ09ORklHX1BST0NfRlMgKi8KQEAgLTU4MCw3ICs1MjQsMjEgQEAKIH0KIAogCi1zdHJ1Y3QgcG1fb3BzIG9tYXBfcG1fb3BzID17CitzdGF0aWMgaXJxcmV0dXJuX3QgIG9tYXBfd2FrZXVwX2ludGVycnVwdChpbnQgIGlycSwgdm9pZCAqICBkZXYsCisJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqICByZWdzKQoreworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF93YWtldXBfaXJxID0geworCS5uYW1lCQk9ICJwZXJpcGhlcmFsIHdha2V1cCIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IG9tYXBfd2FrZXVwX2ludGVycnVwdAorfTsKKworCisKK3N0YXRpYyBzdHJ1Y3QgcG1fb3BzIG9tYXBfcG1fb3BzID17CiAJLnBtX2Rpc2tfbW9kZSA9IDAsCiAgICAgICAgIC5wcmVwYXJlICAgICAgICA9IG9tYXBfcG1fcHJlcGFyZSwKICAgICAgICAgLmVudGVyICAgICAgICAgID0gb21hcF9wbV9lbnRlciwKQEAgLTU5MCw0MiArNTQ4LDYxIEBACiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX3BtX2luaXQodm9pZCkKIHsKIAlwcmludGsoIlBvd2VyIE1hbmFnZW1lbnQgZm9yIFRJIE9NQVAuXG4iKTsKLQlwbV9pZGxlID0gb21hcF9wbV9pZGxlOwogCS8qCiAJICogV2UgY29weSB0aGUgYXNzZW1ibGVyIHNsZWVwL3dha2V1cCByb3V0aW5lcyB0byBTUkFNLgogCSAqIFRoZXNlIHJvdXRpbmVzIG5lZWQgdG8gYmUgaW4gU1JBTSBhcyB0aGF0J3MgdGhlIG9ubHkKIAkgKiBtZW1vcnkgdGhlIE1QVSBjYW4gc2VlIHdoZW4gaXQgd2FrZXMgdXAuCiAJICovCi0KLSNpZmRlZglDT05GSUdfQVJDSF9PTUFQMTUxMAogCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQltZW1jcHkoKHZvaWQgKilPTUFQMTUxMF9TUkFNX0lETEVfU1VTUEVORCwKLQkJICAgICAgIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kLAotCQkgICAgICAgb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOwotCQltZW1jcHkoKHZvaWQgKilPTUFQMTUxMF9TUkFNX0FQSV9TVVNQRU5ELCBvbWFwMTUxMF9jcHVfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KTsKLQl9IGVsc2UKLSNlbmRpZgotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQltZW1jcHkoKHZvaWQgKilPTUFQMTYxMF9TUkFNX0lETEVfU1VTUEVORCwKLQkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kLAotCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOwotCQltZW1jcHkoKHZvaWQgKilPTUFQMTYxMF9TUkFNX0FQSV9TVVNQRU5ELCBvbWFwMTYxMF9jcHVfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7Ci0JCW1lbWNweSgodm9pZCAqKU9NQVA1OTEyX1NSQU1fSURMRV9TVVNQRU5ELAotCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQsCi0JCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7Ci0JCW1lbWNweSgodm9pZCAqKU9NQVA1OTEyX1NSQU1fQVBJX1NVU1BFTkQsIG9tYXAxNjEwX2NwdV9zdXNwZW5kLAotCQkgICAgICAgb21hcDE2MTBfY3B1X3N1c3BlbmRfc3opOworCQlvbWFwX3NyYW1faWRsZSA9IG9tYXBfc3JhbV9wdXNoKG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kLAorCQkJCQkJb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOworCQlvbWFwX3NyYW1fc3VzcGVuZCA9IG9tYXBfc3JhbV9wdXNoKG9tYXAxNTEwX2NwdV9zdXNwZW5kLAorCQkJCQkJICAgb21hcDE1MTBfY3B1X3N1c3BlbmRfc3opOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJb21hcF9zcmFtX2lkbGUgPSBvbWFwX3NyYW1fcHVzaChvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKKwkJCQkJCW9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKKwkJb21hcF9zcmFtX3N1c3BlbmQgPSBvbWFwX3NyYW1fcHVzaChvbWFwMTYxMF9jcHVfc3VzcGVuZCwKKwkJCQkJCSAgIG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KTsKIAl9CiAKKwlpZiAob21hcF9zcmFtX2lkbGUgPT0gTlVMTCB8fCBvbWFwX3NyYW1fc3VzcGVuZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUE0gbm90IGluaXRpYWxpemVkOiBNaXNzaW5nIFNSQU0gc3VwcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBtX2lkbGUgPSBvbWFwX3BtX2lkbGU7CisKKwlzZXR1cF9pcnEoSU5UXzE2MTBfV0FLRV9VUF9SRVEsICZvbWFwX3dha2V1cF9pcnEpOworI2lmIDAKKwkvKiAtLS0gQkVHSU4gQk9BUkQtREVQRU5ERU5UIENPREUgLS0tICovCisJLyogU2xlZXB4IG1hc2sgZGlyZWN0aW9uICovCisJb21hcF93cml0ZXcoKG9tYXBfcmVhZHcoMHhmZmZiNTAwOCkgJiB+MiksIDB4ZmZmYjUwMDgpOworCS8qIFVubWFzayBzbGVlcHggc2lnbmFsICovCisJb21hcF93cml0ZXcoKG9tYXBfcmVhZHcoMHhmZmZiNTAwNCkgJiB+MiksIDB4ZmZmYjUwMDQpOworCS8qIC0tLSBFTkQgQk9BUkQtREVQRU5ERU5UIENPREUgLS0tICovCisjZW5kaWYKKworCS8qIFByb2dyYW0gbmV3IHBvd2VyIHJhbXAtdXAgdGltZQorCSAqICgwIGZvciBtb3N0IGJvYXJkcyBzaW5jZSB3ZSBkb24ndCBsb3dlciB2b2x0YWdlIHdoZW4gaW4gZGVlcCBzbGVlcCkKKwkgKi8KKwlvbWFwX3dyaXRldyhVTFBEX1NFVFVQX0FOQUxPR19DRUxMXzNfVkFMLCBVTFBEX1NFVFVQX0FOQUxPR19DRUxMXzMpOworCisJLyogU2V0dXAgVUxQRCBQT1dFUl9DVFJMX1JFRyAtIGVudGVyIGRlZXAgc2xlZXAgd2hlbmV2ZXIgcG9zc2libGUgKi8KKwlvbWFwX3dyaXRldyhVTFBEX1BPV0VSX0NUUkxfUkVHX1ZBTCwgVUxQRF9QT1dFUl9DVFJMKTsKKworCS8qIENvbmZpZ3VyZSBJRExFQ1QzICovCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQlvbWFwX3dyaXRlbChPTUFQMTYxMF9JRExFQ1QzX1ZBTCwgT01BUDE2MTBfSURMRUNUMyk7CisKIAlwbV9zZXRfb3BzKCZvbWFwX3BtX29wcyk7CiAKICNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQogCW9tYXBfcG1faW5pdF9wcm9jKCk7CiAjZW5kaWYKIAorCS8qIGNvbmZpZ3VyZSBMT1dfUFdSIHBpbiAqLworCW9tYXBfY2ZnX3JlZyhUMjBfMTYxMF9MT1dfUFdSKTsKKwogCXJldHVybiAwOwogfQogX19pbml0Y2FsbChvbWFwX3BtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUwppbmRleCAyNzk0OTBjLi45Zjc0NTgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUwpAQCAtNjYsNyArNjYsNyBAQAogCUAgZ2V0IEFSTV9JRExFQ1QyIGludG8gcjIKIAlsZHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAltb3YJcjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCi0gCW9ycglyNSxyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAorCW9ycglyNSwgcjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKIAlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcmVxdWVzdCBBUk0gaWRsZQpAQCAtNzYsNyArNzYsNyBAQAogCXN0cmgJcjMsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJbW92CXI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYKLQlvcnIgICAgIHI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKKwlvcnIJcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAogbF8xNTEwOglzdWJzCXI1LCByNSwgIzEKIAlibmUJbF8xNTEwCiAvKgpAQCAtOTYsNyArOTYsNyBAQAogCXN0cmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCXN0cmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQogCi0JbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9ICAgICBAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQkJQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgogCiBFTlRSWShvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeikKIAkud29yZAkuIC0gb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQKQEAgLTExNSw4ICsxMTUsOCBAQAogCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucwogCUAgZ2V0IEFSTV9JRExFQ1QyIGludG8gcjIKIAlsZHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQltb3YJcjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCi0gCW9ycglyNSxyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAorCW1vdglyNSwgI09NQVAxNjEwX0lETEVDVDJfU0xFRVBfVkFMICYgMHhmZgorCW9ycglyNSwgcjUsICNPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTCAmIDB4ZmYwMAogCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJQCByZXF1ZXN0IEFSTSBpZGxlCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAogCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKIGxfMTYxMDoJc3VicwlyNSwgcjUsICMxCiAJYm5lCWxfMTYxMAogLyoKQEAgLTE0Niw3ICsxNDYsNyBAQAogCXN0cmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCXN0cmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQogCi0JbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9ICAgICBAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQkJQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgogCiBFTlRSWShvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeikKIAkud29yZAkuIC0gb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAJQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCiAJbW92CXI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKKwlvcnIJcjUsIHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCiAJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIHJlcXVlc3QgQVJNIGlkbGUKQEAgLTIxNyw3ICsyMTcsNyBAQAogCXN0cmgJcjMsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJbW92CXI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYKLQlvcnIgICAgIHI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKKwlvcnIJcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAogbF8xNTEwXzI6CiAJc3VicwlyNSwgcjUsICMxCiAJYm5lCWxfMTUxMF8yCkBAIC0yMzcsNyArMjM3LDcgQEAKIAlzdHJoCXIwLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KLQlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30KKwlsZG1mZAlzcCEsIHtyMCAtIHIxMiwgcGN9CiAKIEVOVFJZKG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KQogCS53b3JkCS4gLSBvbWFwMTUxMF9jcHVfc3VzcGVuZApAQCAtMjQ5LDIxICsyNDksMjYgQEAKIAlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCiAJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQogCisJQCBEcmFpbiB3cml0ZSBjYWNoZQorCW1vdglyNCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAorCW5vcAorCiAJQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBUcmFmZmljIENvbnRyb2xsZXIKLQltb3YJcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4ZmYwMDAwMDAKLQlvcnIJcjQsIHI0LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwZmYwMDAwCi0Jb3JyCXI0LCByNCwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMDAwZmYwMAorCW1vdglyNiwgI1RDTUlGX0FTTV9CQVNFICYgMHhmZjAwMDAwMAorCW9ycglyNiwgcjYsICNUQ01JRl9BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjYsIHI2LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwMDBmZjAwCiAKIAlAIHByZXBhcmUgdG8gcHV0IFNEUkFNIGludG8gc2VsZi1yZWZyZXNoIG1hbnVhbGx5Ci0JbGRyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCi0Jb3JyCXI1LCByNSwgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHhmZjAwMDAwMAotCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4MDAwMDAwZmYKLQlzdHIJcjUsIFtyNCwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwlsZHIJcjcsIFtyNiwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwlvcnIJcjksIHI3LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweGZmMDAwMDAwCisJb3JyCXI5LCByOSwgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHgwMDAwMDBmZgorCXN0cglyOSwgW3I2LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJQCBwcmVwYXJlIHRvIHB1dCBFTUlGUyB0byBTbGVlcAotCWxkcglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCW9ycglyNSwgcjUsICNJRExFX0VNSUZTX1JFUVVFU1QgJiAweGZmCi0Jc3RyCXI1LCBbcjQsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJbGRyCXI4LCBbcjYsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXI5LCByOCwgI0lETEVfRU1JRlNfUkVRVUVTVCAmIDB4ZmYKKwlzdHIJcjksIFtyNiwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyCiAJbW92CXI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4ZmYwMDAwMDAKQEAgLTI3MSwyNiArMjc2LDIyIEBACiAJb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwMDBmZjAwCiAKIAlAIHR1cm4gb2ZmIGNsb2NrIGRvbWFpbnMKLQltb3YJcjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCi0gCW9ycglyNSxyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAotCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQotCi0JQCB3b3JrIGFyb3VuZCBlcnJhdGEgb2YgT01BUDE2MTAvNTkxMi4gRW5hYmxlICghKSBwZXJpcGhlcmFsCi0JQCBjbG9jayB0byBsZXQgdGhlIGNoaXAgZ28gaW50byBkZWVwIHNsZWVwCi0JbGRyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0gCW9ycglyNSxyNSwgI0VOX1BFUkNLX0JJVCAmIDB4ZmYKKwlAIGRvIG5vdCBkaXNhYmxlIFBFUkNLICgweDA0KQorCW1vdglyNSwgI09NQVAxNjEwX0lETEVDVDJfU0xFRVBfVkFMICYgMHhmZgorCW9ycglyNSwgcjUsICNPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTCAmIDB4ZmYwMAogCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJQCByZXF1ZXN0IEFSTSBpZGxlCi0JbW92CXIzLCAjT01BUDE2MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZgotCW9ycglyMywgcjMsICNPTUFQMTYxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmMDAKKwltb3YJcjMsICNPTUFQMTYxMF9JRExFQ1QxX1NMRUVQX1ZBTCAmIDB4ZmYKKwlvcnIJcjMsIHIzLCAjT01BUDE2MTBfSURMRUNUMV9TTEVFUF9WQUwgJiAweGZmMDAKIAlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAotCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCi1sXzE2MTBfMjoKLQlzdWJzCXI1LCByNSwgIzEKLQlibmUJbF8xNjEwXzIKKwlAIGRpc2FibGUgaW5zdHJ1Y3Rpb24gY2FjaGUKKwltcmMJcDE1LCAwLCByOSwgYzEsIGMwLCAwCisJYmljCXIyLCByOSwgIzB4MTAwMAorCW1jcglwMTUsIDAsIHIyLCBjMSwgYzAsIDAKKwlub3AKKwogLyoKICAqIExldCdzIHdhaXQgZm9yIHRoZSBuZXh0IHdha2UgdXAgZXZlbnQgdG8gd2FrZSB1cyB1cC4gcjAgY2FuJ3QgYmUKICAqIHVzZWQgaGVyZSBiZWNhdXNlIHIwIGhvbGRzIEFSTV9JRExFQ1QxCkBAIC0zMDEsMTMgKzMwMiwyMSBAQAogICogb21hcDE2MTBfY3B1X3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KICAqCiAgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKLSAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICogc3RhY2suCiAgKi8KKwlAIHJlLWVuYWJsZSBJY2FjaGUKKwltY3IJcDE1LCAwLCByOSwgYzEsIGMwLCAwCisKKwlAIHJlc2V0IHRoZSBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIuCiAJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCiAJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKKwlAIFJlc3RvcmUgRU1JRkYgY29udHJvbHMKKwlzdHIJcjcsIFtyNiwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwlzdHIJcjgsIFtyNiwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwogCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KLQlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30KKwlsZG1mZAlzcCEsIHtyMCAtIHIxMiwgcGN9CiAKIEVOVFJZKG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KQogCS53b3JkCS4gLSBvbWFwMTYxMF9jcHVfc3VzcGVuZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0tZm4uUyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLWZuLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlYTM2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLWZuLlMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLlMKKyAqCisgKiBGdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJ1biBpbiBpbnRlcm5hbCBTUkFNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKwkudGV4dAorCisvKgorICogUmVwcm9ncmFtcyBVTFBEIGFuZCBDS0NUTC4KKyAqLworRU5UUlkoc3JhbV9yZXByb2dyYW1fY2xvY2spCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQkJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjaworCisJbW92CXIyLCAjSU9fQUREUkVTUyhEUExMX0NUTCkgJiAweGZmMDAwMDAwCisJb3JyCXIyLCByMiwgI0lPX0FERFJFU1MoRFBMTF9DVEwpICYgMHgwMGZmMDAwMAorCW9ycglyMiwgcjIsICNJT19BRERSRVNTKERQTExfQ1RMKSAmIDB4MDAwMGZmMDAKKworCW1vdglyMywgI0lPX0FERFJFU1MoQVJNX0NLQ1RMKSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjMsIHIzLCAjSU9fQUREUkVTUyhBUk1fQ0tDVEwpICYgMHgwMGZmMDAwMAorCW9ycglyMywgcjMsICNJT19BRERSRVNTKEFSTV9DS0NUTCkgJiAweDAwMDBmZjAwCisKKwl0c3QJcjAsICMxIDw8IDQJCQlAIHdhbnQgbG9jayBtb2RlPworCWJlcQluZXdjawkJCQlAIG5vcGUKKwliaWMJcjAsIHIwLCAjMSA8PCA0CQkJQCBlbHNlIGNsZWFyIGxvY2sgYml0CisJc3RyaAlyMCwgW3IyXQkJCUAgc2V0IGRwbGwgaW50byBieXBhc3MgbW9kZQorCW9ycglyMCwgcjAsICMxIDw8IDQJCQlAIHNldCBsb2NrIGJpdCBhZ2FpbgorCituZXdjazoKKwlzdHJoCXIxLCBbcjNdCQkJQCB3cml0ZSBuZXcgY2tjdGwgdmFsdWUKKwlzdHJoCXIwLCBbcjJdCQkJQCB3cml0ZSBuZXcgZHBsbCB2YWx1ZQorCisJbW92CXI0LCAjMHgwNzAwCQkJQCBsZXQgdGhlIGNsb2NrcyBzZXR0bGUKKwlvcnIJcjQsIHI0LCAjMHgwMGZmCitkZWxheToJc3ViCXI0LCByNCwgIzEKKwljbXAJcjQsICMwCisJYm5lCWRlbGF5CisKK2xvY2s6CWxkcmgJcjQsIFtyMl0sICMwCQkJQCByZWFkIGJhY2sgZHBsbCB2YWx1ZQorCXRzdAlyMCwgIzEgPDwgNAkJCUAgd2FudCBsb2NrIG1vZGU/CisJYmVxCW91dAkJCQlAIG5vcGUKKwl0c3QJcjQsICMxIDw8IDAJCQlAIGRwbGwgcmF0ZSBsb2NrZWQ/CisJYmVxCWxvY2sJCQkJQCB0cnkgYWdhaW4KKworb3V0OgorCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30JCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KK0VOVFJZKHNyYW1fcmVwcm9ncmFtX2Nsb2NrX3N6KQorCS53b3JkCS4gLSBzcmFtX3JlcHJvZ3JhbV9jbG9jawpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxOWE0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCisgKgorICogT01BUCBTUkFNIGRldGVjdGlvbiBhbmQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogV3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNpbmNsdWRlICJzcmFtLmgiCisKKyNkZWZpbmUgT01BUDFfU1JBTV9CQVNFCQkweGQwMDAwMDAwCisjZGVmaW5lIE9NQVAxX1NSQU1fU1RBUlQJMHgyMDAwMDAwMAorI2RlZmluZSBTUkFNX0JPT1RMT0FERVJfU1oJMHg4MAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3NyYW1fYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfc3JhbV9zaXplOworc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX2NlaWw7CisKKy8qCisgKiBUaGUgYW1vdW50IG9mIFNSQU0gZGVwZW5kcyBvbiB0aGUgY29yZSB0eXBlOgorICogNzMwID0gMjAwSywgMTUxMCA9IDUxMkssIDU5MTIgPSAyNTZLLCAxNjEwID0gMTZLLCAxNzEwID0gMTZLCisgKiBOb3RlIHRoYXQgd2UgY2Fubm90IHRyeSB0byB0ZXN0IGZvciBTUkFNIGhlcmUgYmVjYXVzZSB3cml0ZXMKKyAqIHRvIHNlY3VyZSBTUkFNIHdpbGwgaGFuZyB0aGUgc3lzdGVtLiBBbHNvIHRoZSBTUkFNIGlzIG5vdAorICogeWV0IG1hcHBlZCBhdCB0aGlzIHBvaW50LgorICovCit2b2lkIF9faW5pdCBvbWFwX2RldGVjdF9zcmFtKHZvaWQpCit7CisJb21hcF9zcmFtX2Jhc2UgPSBPTUFQMV9TUkFNX0JBU0U7CisKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJb21hcF9zcmFtX3NpemUgPSAweDMyMDAwOworCWVsc2UgaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQlvbWFwX3NyYW1fc2l6ZSA9IDB4ODAwMDA7CisJZWxzZSBpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNjIxKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpCisJCW9tYXBfc3JhbV9zaXplID0gMHg0MDAwOworCWVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMSgpKQorCQlvbWFwX3NyYW1fc2l6ZSA9IDB4M2U4MDA7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGRldGVjdCBTUkFNIHNpemVcbiIpOworCQlvbWFwX3NyYW1fc2l6ZSA9IDB4NDAwMDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJTUkFNIHNpemU6IDB4JWx4XG4iLCBvbWFwX3NyYW1fc2l6ZSk7CisJb21hcF9zcmFtX2NlaWwgPSBvbWFwX3NyYW1fYmFzZSArIG9tYXBfc3JhbV9zaXplOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfc3JhbV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7IE9NQVAxX1NSQU1fQkFTRSwgT01BUDFfU1JBTV9TVEFSVCwgMCwgTVRfREVWSUNFIH0KK307CisKKy8qCisgKiBJbiBvcmRlciB0byB1c2UgbGFzdCAya0Igb2YgU1JBTSBvbiAxNjExYiwgd2UgbXVzdCByb3VuZCB0aGUgc2l6ZQorICogdXAgdG8gbXVsdGlwbGUgb2YgUEFHRV9TSVpFLiBXZSBjYW5ub3QgdXNlIGlvcmVtYXAgZm9yIFNSQU0sIGFzCisgKiBjbG9jayBpbml0IG5lZWRzIFNSQU0gZWFybHkuCisgKi8KK3ZvaWQgX19pbml0IG9tYXBfbWFwX3NyYW0odm9pZCkKK3sKKwlpZiAob21hcF9zcmFtX3NpemUgPT0gMCkKKwkJcmV0dXJuOworCisJb21hcF9zcmFtX2lvX2Rlc2NbMF0ubGVuZ3RoID0gKG9tYXBfc3JhbV9zaXplICsgUEFHRV9TSVpFLTEpL1BBR0VfU0laRTsKKwlvbWFwX3NyYW1faW9fZGVzY1swXS5sZW5ndGggKj0gUEFHRV9TSVpFOworCWlvdGFibGVfaW5pdChvbWFwX3NyYW1faW9fZGVzYywgQVJSQVlfU0laRShvbWFwX3NyYW1faW9fZGVzYykpOworCisJLyoKKwkgKiBMb29rcyBsaWtlIHdlIG5lZWQgdG8gcHJlc2VydmUgc29tZSBib290bG9hZGVyIGNvZGUgYXQgdGhlCisJICogYmVnaW5uaW5nIG9mIFNSQU0gZm9yIGp1bXBpbmcgdG8gZmxhc2ggZm9yIHJlYm9vdCB0byB3b3JrLi4uCisJICovCisJbWVtc2V0KCh2b2lkICopb21hcF9zcmFtX2Jhc2UgKyBTUkFNX0JPT1RMT0FERVJfU1osIDAsCisJICAgICAgIG9tYXBfc3JhbV9zaXplIC0gU1JBTV9CT09UTE9BREVSX1NaKTsKK30KKworc3RhdGljIHZvaWQgKCpfb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jaykodTMyIGRwbGxjdGwsIHUzMiBja2N0bCkgPSBOVUxMOworCit2b2lkIG9tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2sodTMyIGRwbGxjdGwsIHUzMiBja2N0bCkKK3sKKwlpZiAoX29tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2sgPT0gTlVMTCkKKwkJcGFuaWMoIkNhbm5vdCB1c2UgU1JBTSIpOworCisJcmV0dXJuIF9vbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrKGRwbGxjdGwsIGNrY3RsKTsKK30KKwordm9pZCAqIG9tYXBfc3JhbV9wdXNoKHZvaWQgKiBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChzaXplID4gKG9tYXBfc3JhbV9jZWlsIC0gKG9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOb3QgZW5vdWdoIHNwYWNlIGluIFNSQU1cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJb21hcF9zcmFtX2NlaWwgLT0gc2l6ZTsKKwlvbWFwX3NyYW1fY2VpbCAmPSB+MHgzOworCW1lbWNweSgodm9pZCAqKW9tYXBfc3JhbV9jZWlsLCBzdGFydCwgc2l6ZSk7CisKKwlyZXR1cm4gKHZvaWQgKilvbWFwX3NyYW1fY2VpbDsKK30KKwordm9pZCBfX2luaXQgb21hcF9zcmFtX2luaXQodm9pZCkKK3sKKwlvbWFwX2RldGVjdF9zcmFtKCk7CisJb21hcF9tYXBfc3JhbSgpOworCV9vbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrID0gb21hcF9zcmFtX3B1c2goc3JhbV9yZXByb2dyYW1fY2xvY2ssCisJCQkJCQkgICAgc3JhbV9yZXByb2dyYW1fY2xvY2tfc3opOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5ODRlZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmgKKyAqCisgKiBJbnRlcmZhY2UgZm9yIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcnVuIGluIGludGVybmFsIFNSQU0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9PTUFQX1NSQU1fSAorI2RlZmluZSBfX0FSQ0hfQVJNX09NQVBfU1JBTV9ICisKK2V4dGVybiB2b2lkICogb21hcF9zcmFtX3B1c2godm9pZCAqIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jayh1MzIgZHBsbGN0bCwgdTMyIGNrY3RsKTsKKworLyogRG8gbm90IHVzZSB0aGVzZSAqLworZXh0ZXJuIHZvaWQgc3JhbV9yZXByb2dyYW1fY2xvY2sodTMyIGNrY3RsLCB1MzIgZHBsbGN0bCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzcmFtX3JlcHJvZ3JhbV9jbG9ja19zejsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKaW5kZXggMjViYzRhOC4uOThmMWM3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwpAQCAtNDEsNiArNDEsNyBAQAogCiAvKiBUaGVzZSByb3V0aW5lcyBzaG91bGQgaGFuZGxlIHRoZSBzdGFuZGFyZCBjaGlwLXNwZWNpZmljIG1vZGVzCiAgKiBmb3IgdXNiMC8xLzIgcG9ydHMsIGNvdmVyaW5nIGJhc2ljIG11eCBhbmQgdHJhbnNjZWl2ZXIgc2V0dXAuCisgKiBDYWxsIG9tYXBfdXNiX2luaXQoKSBvbmNlLCBmcm9tIElOSVRfTUFDSElORSgpLgogICoKICAqIFNvbWUgYm9hcmQtKi5jIGZpbGVzIHdpbGwgbmVlZCB0byBzZXQgdXAgYWRkaXRpb25hbCBtdXggb3B0aW9ucywKICAqIGxpa2UgZm9yIHN1c3BlbmQgaGFuZGxpbmcsIHZidXMgc2Vuc2luZywgR1BJT3MsIGFuZCB0aGUgRCsgcHVsbHVwLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL2VudHJ5LlMgYi9hcmNoL2FybS92ZnAvZW50cnkuUwppbmRleCBlNzNjOGRlLi42ZjE3MTg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvZW50cnkuUworKysgYi9hcmNoL2FybS92ZnAvZW50cnkuUwpAQCAtMTcsNyArMTcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3ZmcG1hY3Jvcy5oPgogCiAJLmdsb2JsCWRvX3ZmcApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9LY29uZmlnIGIvYXJjaC9hcm0yNi9LY29uZmlnCmluZGV4IDFmMDM3MzIuLjFmMDBiM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvS2NvbmZpZworKysgYi9hcmNoL2FybTI2L0tjb25maWcKQEAgLTU1LDYgKzU1LDEwIEBACiBjb25maWcgR0VORVJJQ19JU0FfRE1BCiAJYm9vbAogCitjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKKwlib29sCisJZGVmYXVsdCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvTWFrZWZpbGUgYi9hcmNoL2FybTI2L01ha2VmaWxlCmluZGV4IGFkYTg5ODUuLjg0NGE5ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0yNi9NYWtlZmlsZQpAQCAtMTcsMTAgKzE3LDYgQEAKIENGTEFHUwkJKz0tZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtbW5vLXNjaGVkLXByb2xvZwogZW5kaWYKIAotaWZlcSAoJChDT05GSUdfREVCVUdfSU5GTykseSkKLUNGTEFHUwkJKz0tZwotZW5kaWYKLQogQ0ZMQUdTX0JPT1QJOj0tbWFwY3MtMjYgLW1jcHU9YXJtMyAtbXNvZnQtZmxvYXQgLVVhcm0KIENGTEFHUwkJKz0tbWFwY3MtMjYgLW1jcHU9YXJtMyAtbXNvZnQtZmxvYXQgLVVhcm0KIEFGTEFHUwkJKz0tbWFwY3MtMjYgLW1jcHU9YXJtMyAtbXNvZnQtZmxvYXQKQEAgLTUzLDEwICs0OSw2IEBACiAKIGJvb3QgOj0gYXJjaC9hcm0yNi9ib290CiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oCi0KLQogLlBIT05ZOiBtYWtldG9vbHMgRk9SQ0UKIG1ha2V0b29sczogRk9SQ0UKIAkKQEAgLTk4LDEyICs5MCw2IEBACiAJZmk7IFwKIAkpCiAKLWFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gICcqIHpJbWFnZSAgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvekltYWdlKScKICAgZWNobyAgJyAgSW1hZ2UgICAgICAgICAtIFVuY29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvJChBUkNIKS9ib290L0ltYWdlKScKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2FybTI2L2tlcm5lbC9lbnRyeS5TCmluZGV4IGEyMzFkZDguLjZkOTEwZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvZW50cnkuUwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc3lzaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybTI2L2tlcm5lbC90aW1lLmMKaW5kZXggNTQ5YTZiMi4uZTY2YWVkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3RpbWUuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19zZXRfcnRjKHZvaWQpCiB7Ci0JaWYgKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQyB8fCBzZXRfcnRjID09IE5VTEwpCisJaWYgKCFudHBfc3luY2VkKCkgfHwgc2V0X3J0YyA9PSBOVUxMKQogCQlyZXR1cm47CiAKIC8vRklYTUUgLSB0aW1lc3BlYy50dl9zZWMgaXMgYSB0aW1lX3Qgbm90IHVuc2lnbmVkIGxvbmcKQEAgLTE4OSwxMCArMTg5LDcgQEAKIAogCXh0aW1lLnR2X3NlYyA9IHR2LT50dl9zZWM7CiAJeHRpbWUudHZfbnNlYyA9IHR2LT50dl9uc2VjOwotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm0yNi9saWIvY29weV9wYWdlLlMKaW5kZXggMmQ3OWVlMS4uYzc1MTFhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9saWIvY29weV9wYWdlLlMKKysrIGIvYXJjaC9hcm0yNi9saWIvY29weV9wYWdlLlMKQEAgLTExLDcgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkJLnRleHQKIAkJLmFsaWduCTUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUyBiL2FyY2gvYXJtMjYvbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwppbmRleCA1YjgyMTE4Li4yNjFkZDE1IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKKysrIGIvYXJjaC9hcm0yNi9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCQkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2xpYi9nZXR1c2VyLlMgYi9hcmNoL2FybTI2L2xpYi9nZXR1c2VyLlMKaW5kZXggZTZkNTliMzMuLjJiMWRlN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbGliL2dldHVzZXIuUworKysgYi9hcmNoL2FybTI2L2xpYi9nZXR1c2VyLlMKQEAgLTI2LDcgKzI2LDcgQEAKICAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAuCiAgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fZ2V0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCiAgKi8KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9saWIvcHV0dXNlci5TIGIvYXJjaC9hcm0yNi9saWIvcHV0dXNlci5TCmluZGV4IDg3NTg4Y2IuLjQ2YzdmMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbGliL3B1dHVzZXIuUworKysgYi9hcmNoL2FybTI2L2xpYi9wdXR1c2VyLlMKQEAgLTI2LDcgKzI2LDcgQEAKICAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAKICAqIE5vdGUgYWxzbyB0aGF0IGl0IGlzIGludGVuZGVkIHRoYXQgX19wdXRfdXNlcl9iYWQgaXMgbm90IGdsb2JhbC4KICAqLwotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L21tL3Byb2MtZnVuY3MuUyBiL2FyY2gvYXJtMjYvbW0vcHJvYy1mdW5jcy5TCmluZGV4IGMzZDRjZDMuLmY5ZmNhNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbW0vcHJvYy1mdW5jcy5TCisrKyBiL2FyY2gvYXJtMjYvbW0vcHJvYy1mdW5jcy5TCkBAIC0xNCw3ICsxNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9ud2ZwZS9lbnRyeS5TIGIvYXJjaC9hcm0yNi9ud2ZwZS9lbnRyeS5TCmluZGV4IDdkNmRmYWEuLmU2MzEyMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbndmcGUvZW50cnkuUworKysgYi9hcmNoL2FybTI2L253ZnBlL2VudHJ5LlMKQEAgLTIwLDcgKzIwLDcgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogVGhpcyBpcyB0aGUga2VybmVsJ3MgZW50cnkgcG9pbnQgaW50byB0aGUgZmxvYXRpbmcgcG9pbnQgZW11bGF0b3IuCiBJdCBpcyBjYWxsZWQgZnJvbSB0aGUga2VybmVsIHdpdGggY29kZSBzaW1pbGFyIHRvIHRoaXM6CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvTWFrZWZpbGUgYi9hcmNoL2NyaXMvTWFrZWZpbGUKaW5kZXggOTBjYTg3My4uYTAwMDQzYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9NYWtlZmlsZQpAQCAtMTA3LDggKzEwNyw3IEBACiAJcm0gLWYgdGltYWdlIHZtbGludXguYmluIGRlY29tcHJlc3MuYmluIHJlc2N1ZS5iaW4gY3JhbWZzLmltZwogCXJtIC1yZiAkKExEX1NDUklQVCkudG1wCiAKLXByZXBhcmU6ICQoU1JDX0FSQ0gpLy5saW5rcyAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkvLmFyY2ggXAotCSBpbmNsdWRlL2FzbS0kKEFSQ0gpLyQoU0FSQ0gpL29mZnNldC5oCitwcmVwYXJlOiAkKFNSQ19BUkNIKS8ubGlua3MgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpLy5hcmNoCiAKICMgQ3JlYXRlIHNvbWUgbGlua3MgdG8gbWFrZSBhbGwgdG9vbHMgaGFwcHkKICQoU1JDX0FSQ0gpLy5saW5rczoKQEAgLTEyMCw2ICsxMTksNyBAQAogCUBsbiAtc2ZuICQoU1JDX0FSQ0gpLyQoU0FSQ0gpL2xpYiAkKFNSQ19BUkNIKS9saWIKIAlAbG4gLXNmbiAkKFNSQ19BUkNIKS8kKFNBUkNIKSAkKFNSQ19BUkNIKS9hcmNoCiAJQGxuIC1zZm4gJChTUkNfQVJDSCkvJChTQVJDSCkvdm1saW51eC5sZHMuUyAkKFNSQ19BUkNIKS9rZXJuZWwvdm1saW51eC5sZHMuUworCUBsbiAtc2ZuICQoU1JDX0FSQ0gpLyQoU0FSQ0gpL2FzbS1vZmZzZXRzLmMgJChTUkNfQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLmMKIAlAdG91Y2ggJEAKIAogIyBDcmVhdGUgbGluayB0byBzdWIgYXJjaCBpbmNsdWRlcwpAQCAtMTI4LDkgKzEyOCwzIEBACiAJQHJtIC1mIGluY2x1ZGUvYXNtLSQoQVJDSCkvYXJjaAogCUBsbiAtc2YgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpLyQoU0FSQ0gpICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKS9hcmNoCiAJQHRvdWNoICRACi0KLWFyY2gvJChBUkNIKS8kKFNBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCQlpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS8kKFNBUkNIKS9vZmZzZXQuaDogYXJjaC8kKEFSQ0gpLyQoU0FSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TCmluZGV4IGMwMTYzYmYuLmM4MDgwMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2VudHJ5LlMKQEAgLTI3MCw3ICsyNzAsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL3N2X2FkZHJfYWcuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC90aW1lLmMKaW5kZXggNmI3YjRlMC4uZGMzZGZlOSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC90aW1lLmMKQEAgLTI0MCw3ICsyNDAsNyBAQAogCSAqIFRoZSBkaXZpc2lvbiBoZXJlIGlzIG5vdCB0aW1lIGNyaXRpY2FsIHNpbmNlIGl0IHdpbGwgcnVuIG9uY2UgaW4gCiAJICogMTEgbWludXRlcwogCSAqLwotCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJgogCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA+PSA1MDAwMDAgLSAodGlja19uc2VjIC8gMTAwMCkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKHRpY2tfbnNlYyAvIDEwMDApIC8gMikgewpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TCmluZGV4IGE4ZWQ1NWUuLjNiZDg1MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2VudHJ5LlMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2FzbS9pbnRyX3ZlY3RfZGVmc19hc20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKaW5kZXggZmEyZDQzMi4uYTJkOTliNCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKQEAgLTExNCwxMCArMTE0LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvZnJ2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjYzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2Zydi9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxIEBACisvKiBEdW1teSBhc20tb2Zmc2V0cy5jIGZpbGUuIFJlcXVpcmVkIGJ5IGtidWlsZCBhbmQgcmVhZHkgdG8gYmUgdXNlZCAtIGhpbnQhICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvdGltZS5jIGIvYXJjaC9mcnYva2VybmVsL3RpbWUuYwppbmRleCAwNzVkYjY2Li44ZDY1NThiIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC90aW1lLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAgJiYKKwlpZiAobnRwX3N5bmNlZCgpICYmCiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIKQEAgLTIxNiwxMCArMjE2LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL01ha2VmaWxlIGIvYXJjaC9oODMwMC9NYWtlZmlsZQppbmRleCBjOWI4MGNmLi40MGIzZjU2IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvTWFrZWZpbGUKQEAgLTYxLDEyICs2MSw2IEBACiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmgKLQotaW5jbHVkZS9hc20tJChBUkNIKS9hc20tb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMgXAotCQkJCSAgIGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCiB2bWxpbnV4LnNyZWMgdm1saW51eC5iaW46IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIApAQCAtNzQsNSArNjgsMyBAQAogICBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCiAgIGVjaG8gICd2bWxpbnV4LnNyZWMgLSBDcmVhdGUgc3JlYyBiaW5hcnknCiBlbmRlZgotCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmgKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWUuYyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWUuYwppbmRleCA4YTYwMDIxLi5hZjhjNWQyIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZS5jCkBAIC0xMTYsMTAgKzExNiw3IEBACiAKIAl4dGltZS50dl9zZWMgPSB0di0+dHZfc2VjOwogCXh0aW1lLnR2X25zZWMgPSB0di0+dHZfbnNlYzsKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvS2NvbmZpZyBiL2FyY2gvaTM4Ni9LY29uZmlnCmluZGV4IDNiM2IwMTcuLmIyMmYwMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9LY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnCkBAIC0zNyw2ICszNywxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgpAQCAtMTIwOCw3ICsxMjEyLDYgQEAKIGNvbmZpZyBQQ0lfTU1DT05GSUcKIAlib29sCiAJZGVwZW5kcyBvbiBQQ0kgJiYgQUNQSSAmJiAoUENJX0dPTU1DT05GSUcgfHwgUENJX0dPQU5ZKQotCXNlbGVjdCBBQ1BJX0JPT1QKIAlkZWZhdWx0IHkKIAogc291cmNlICJkcml2ZXJzL3BjaS9wY2llL0tjb25maWciCkBAIC0xMzE4LDYgKzEzMjEsMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX1BFTkRJTkdfSVJRCisJYm9vbAorCWRlcGVuZHMgb24gR0VORVJJQ19IQVJESVJRUyAmJiBTTVAKKwlkZWZhdWx0IHkKKwogY29uZmlnIFg4Nl9TTVAKIAlib29sCiAJZGVwZW5kcyBvbiBTTVAgJiYgIVg4Nl9WT1lBR0VSCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggYmY3YzliYS4uMDk5NTE5OSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMTU2LDE1ICsxNTYsNiBAQAogaW5zdGFsbCBrZXJuZWxfaW5zdGFsbDoKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIEJPT1RJTUFHRT0kKEtCVUlMRF9JTUFHRSkgaW5zdGFsbAogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAotCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL2kzODYvYm9vdAogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9zZXR1cC5TIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwppbmRleCA4Y2I0MjBmLi5jYTY2OGQ5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC9zZXR1cC5TCisrKyBiL2FyY2gvaTM4Ni9ib290L3NldHVwLlMKQEAgLTgyLDcgKzgyLDcgQEAKICMgVGhpcyBpcyB0aGUgc2V0dXAgaGVhZGVyLCBhbmQgaXQgbXVzdCBzdGFydCBhdCAlY3M6MiAob2xkIDB4OTAyMDoyKQogCiAJCS5hc2NpaQkiSGRyUyIJCSMgaGVhZGVyIHNpZ25hdHVyZQotCQkud29yZAkweDAyMDMJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCisJCS53b3JkCTB4MDIwNAkJIyBoZWFkZXIgdmVyc2lvbiBudW1iZXIgKD49IDB4MDEwNSkKIAkJCQkJIyBvciBlbHNlIG9sZCBsb2FkbGluLTEuNSB3aWxsIGZhaWwpCiByZWFsbW9kZV9zd3RjaDoJLndvcmQJMCwgMAkJIyBkZWZhdWx0X3N3aXRjaCwgU0VUVVBTRUcKIHN0YXJ0X3N5c19zZWc6CS53b3JkCVNZU1NFRwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYyBiL2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1aWxkLmMKaW5kZXggNjgzNWY2ZC4uMDU3OTg0MSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYworKysgYi9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jCkBAIC0xNzcsNyArMTc3LDkgQEAKIAkJZGllKCJPdXRwdXQ6IHNlZWsgZmFpbGVkIik7CiAJYnVmWzBdID0gKHN5c19zaXplICYgMHhmZik7CiAJYnVmWzFdID0gKChzeXNfc2l6ZSA+PiA4KSAmIDB4ZmYpOwotCWlmICh3cml0ZSgxLCBidWYsIDIpICE9IDIpCisJYnVmWzJdID0gKChzeXNfc2l6ZSA+PiAxNikgJiAweGZmKTsKKwlidWZbM10gPSAoKHN5c19zaXplID4+IDI0KSAmIDB4ZmYpOworCWlmICh3cml0ZSgxLCBidWYsIDQpICE9IDQpCiAJCWRpZSgiV3JpdGUgb2YgaW1hZ2UgbGVuZ3RoIGZhaWxlZCIpOwogCiAJcmV0dXJuIDA7CQkJCQkgICAgLyogRXZlcnl0aGluZyBpcyBPSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKaW5kZXggMDU4NzQ3Ny4uOTJmNjY5NCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUworKysgYi9hcmNoL2kzODYvYm9vdC92aWRlby5TCkBAIC05Nyw2ICs5Nyw3IEBACiAjZGVmaW5lIFBBUkFNX1ZFU0FQTV9PRkYJMHgzMAogI2RlZmluZSBQQVJBTV9MRkJfUEFHRVMJCTB4MzIKICNkZWZpbmUgUEFSQU1fVkVTQV9BVFRSSUIJMHgzNAorI2RlZmluZSBQQVJBTV9DQVBBQklMSVRJRVMgICAgICAweDM2CiAKIC8qIERlZmluZSBET19TVE9SRSBhY2NvcmRpbmcgdG8gQ09ORklHX1ZJREVPX1JFVEFJTiAqLwogI2lmZGVmIENPTkZJR19WSURFT19SRVRBSU4KQEAgLTIzMyw2ICsyMzQsMTAgQEAKIAltb3Z3CTE4KCVkaSksICVheAogCW1vdmwJJWVheCwgJWZzOihQQVJBTV9MRkJfU0laRSkKIAorIyBzdG9yZSBtb2RlIGNhcGFiaWxpdGllcworCW1vdmwgICAgMTAoJWRpKSwgJWVheAorCW1vdmwgICAgJWVheCwgJWZzOihQQVJBTV9DQVBBQklMSVRJRVMpCisKICMgc3dpdGNoaW5nIHRoZSBEQUMgdG8gOC1iaXQgaXMgZm9yIDw9IDggYnBwIG9ubHkKIAltb3Z3CSVmczooUEFSQU1fTEZCX0RFUFRIKSwgJWF4CiAJY21wdwkkOCwgJWF4CkBAIC0xOTQ0LDcgKzE5NDksNyBAQAogCW1vdncJJDB4NGYxNSwgJWF4ICAgICAgICAgICAgICAgICAgICAjIGRvIFZCRS9EREMKIAltb3Z3CSQweDAxLCAlYngKIAltb3Z3CSQweDAwLCAlY3gKLQltb3Z3ICAgICQweDAxLCAlZHgKKwltb3Z3ICAgICQweDAwLCAlZHgKIAltb3Z3CSQweDE0MCwgJWRpCiAJaW50CSQweDEwCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9kZWZjb25maWcgYi9hcmNoL2kzODYvZGVmY29uZmlnCmluZGV4IGNhMDdiOTUuLjZhNDMxYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9kZWZjb25maWcKKysrIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwpAQCAtMTMxLDggKzEzMSw2IEBACiAjIEFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydAogIwogQ09ORklHX0FDUEk9eQotQ09ORklHX0FDUElfQk9PVD15Ci1DT05GSUdfQUNQSV9JTlRFUlBSRVRFUj15CiBDT05GSUdfQUNQSV9TTEVFUD15CiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX0ZTPXkKIENPTkZJR19BQ1BJX0FDPXkKQEAgLTE0NCwxMCArMTQyLDggQEAKICMgQ09ORklHX0FDUElfQVNVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ1BJX1RPU0hJQkEgaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9CVVM9eQogQ09ORklHX0FDUElfRUM9eQogQ09ORklHX0FDUElfUE9XRVI9eQotQ09ORklHX0FDUElfUENJPXkKIENPTkZJR19BQ1BJX1NZU1RFTT15CiAjIENPTkZJR19YODZfUE1fVElNRVIgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCA2NDY4MmEwLi5mMTBkZTBmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTExLDcgKzExLDcgQEAKIAogb2JqLXkJCQkJKz0gY3B1Lwogb2JqLXkJCQkJKz0gdGltZXJzLwotb2JqLSQoQ09ORklHX0FDUElfQk9PVCkJCSs9IGFjcGkvCitvYmotJChDT05GSUdfQUNQSSkJCSs9IGFjcGkvCiBvYmotJChDT05GSUdfWDg2X0JJT1NfUkVCT09UKQkrPSByZWJvb3Qubwogb2JqLSQoQ09ORklHX01DQSkJCSs9IG1jYS5vCiBvYmotJChDT05GSUdfWDg2X01TUikJCSs9IG1zci5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKaW5kZXggNWUyOTFhMi4uMjY3Y2E0OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLW9iai0kKENPTkZJR19BQ1BJX0JPT1QpCQk6PSBib290Lm8KK29iai15CQkJCTo9IGJvb3Qubwogb2JqLSQoQ09ORklHX1g4Nl9JT19BUElDKQkrPSBlYXJseXF1aXJrLm8KIG9iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBzbGVlcC5vIHdha2V1cC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDM0ZWU1MDAuLmE2MzM1MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtNDAsMTkgKzQwLDI1IEBACiAKICNpZmRlZglDT05GSUdfWDg2XzY0CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAgYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKK3sKK30KIGV4dGVybiB2b2lkIF9faW5pdCBjbHVzdGVyZWRfYXBpY19jaGVjayh2b2lkKTsKLXN0YXRpYyBpbmxpbmUgaW50IGlvYXBpY19zZXR1cF9kaXNhYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBpb2FwaWNfc2V0dXBfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogCi0jZWxzZQkvKiBYODYgKi8KKyNlbHNlCQkJCS8qIFg4NiAqLwogCiAjaWZkZWYJQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CiAjaW5jbHVkZSA8bWFjaF9tcHBhcnNlLmg+Ci0jZW5kaWYJLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCisjZW5kaWYJCQkJLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKLSNlbmRpZgkvKiBYODYgKi8KKyNlbmRpZgkJCQkvKiBYODYgKi8KIAogI2RlZmluZSBCQURfTUFEVF9FTlRSWShlbnRyeSwgZW5kKSAoCQkJCQkgICAgXAogCQkoIWVudHJ5KSB8fCAodW5zaWduZWQgbG9uZyllbnRyeSArIHNpemVvZigqZW50cnkpID4gZW5kIHx8ICBcCkBAIC02MCwxMyArNjYsOCBAQAogCiAjZGVmaW5lIFBSRUZJWAkJCSJBQ1BJOiAiCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKIGludCBhY3BpX25vaXJxIF9faW5pdGRhdGE7CS8qIHNraXAgQUNQSSBJUlEgaW5pdGlhbGl6YXRpb24gKi8KLWludCBhY3BpX3BjaV9kaXNhYmxlZCBfX2luaXRkYXRhOyAvKiBza2lwIEFDUEkgUENJIHNjYW4gYW5kIElSUSBpbml0aWFsaXphdGlvbiAqLwotI2Vsc2UKLWludCBhY3BpX25vaXJxIF9faW5pdGRhdGEgPSAxOwotaW50IGFjcGlfcGNpX2Rpc2FibGVkIF9faW5pdGRhdGEgPSAxOwotI2VuZGlmCitpbnQgYWNwaV9wY2lfZGlzYWJsZWQgX19pbml0ZGF0YTsJLyogc2tpcCBBQ1BJIFBDSSBzY2FuIGFuZCBJUlEgaW5pdGlhbGl6YXRpb24gKi8KIGludCBhY3BpX2h0IF9faW5pdGRhdGEgPSAxOwkvKiBlbmFibGUgSFQgKi8KIAogaW50IGFjcGlfbGFwaWM7CkBAIC04OCw3ICs4OSw3IEBACiAKICNkZWZpbmUgTUFYX01BRFRfRU5UUklFUwkyNTYKIHU4IHg4Nl9hY3BpaWRfdG9fYXBpY2lkW01BWF9NQURUX0VOVFJJRVNdID0KLQkJCXsgWzAgLi4uIE1BWF9NQURUX0VOVFJJRVMtMV0gPSAweGZmIH07CisgICAge1swIC4uLiBNQVhfTUFEVF9FTlRSSUVTIC0gMV0gPSAweGZmIH07CiBFWFBPUlRfU1lNQk9MKHg4Nl9hY3BpaWRfdG9fYXBpY2lkKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk5LDcgKzEwMCw3IEBACiAgKiBUaGUgZGVmYXVsdCBpbnRlcnJ1cHQgcm91dGluZyBtb2RlbCBpcyBQSUMgKDgyNTkpLiAgVGhpcyBnZXRzCiAgKiBvdmVycmlkZW4gaWYgSU9BUElDcyBhcmUgZW51bWVyYXRlZCAoYmVsb3cpLgogICovCi1lbnVtIGFjcGlfaXJxX21vZGVsX2lkCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX1BJQzsKK2VudW0gYWNwaV9pcnFfbW9kZWxfaWQgYWNwaV9pcnFfbW9kZWwgPSBBQ1BJX0lSUV9NT0RFTF9QSUM7CiAKICNpZmRlZglDT05GSUdfWDg2XzY0CiAKQEAgLTEwNyw3ICsxMDgsNyBAQAogY2hhciAqX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQotCXJldHVybiBOVUxMOworCQlyZXR1cm4gTlVMTDsKIAogCWlmIChwaHlzX2FkZHIgPCAoZW5kX3Bmbl9tYXAgPDwgUEFHRV9TSElGVCkpCiAJCXJldHVybiBfX3ZhKHBoeXNfYWRkcik7CkBAIC0xMzQsOCArMTM1LDggQEAKIAl1bnNpZ25lZCBsb25nIGJhc2UsIG9mZnNldCwgbWFwcGVkX3NpemU7CiAJaW50IGlkeDsKIAotCWlmIChwaHlzICsgc2l6ZSA8IDgqMTAyNCoxMDI0KSAKLQkJcmV0dXJuIF9fdmEocGh5cyk7IAorCWlmIChwaHlzICsgc2l6ZSA8IDggKiAxMDI0ICogMTAyNCkKKwkJcmV0dXJuIF9fdmEocGh5cyk7CiAKIAlvZmZzZXQgPSBwaHlzICYgKFBBR0VfU0laRSAtIDEpOwogCW1hcHBlZF9zaXplID0gUEFHRV9TSVpFIC0gb2Zmc2V0OwpAQCAtMTU0LDcgKzE1NSw3IEBACiAJCW1hcHBlZF9zaXplICs9IFBBR0VfU0laRTsKIAl9CiAKLQlyZXR1cm4gKCh1bnNpZ25lZCBjaGFyICopIGJhc2UgKyBvZmZzZXQpOworCXJldHVybiAoKHVuc2lnbmVkIGNoYXIgKiliYXNlICsgb2Zmc2V0KTsKIH0KICNlbmRpZgogCkBAIC0xNzIsNyArMTczLDcgQEAKIAlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltY2ZnID0gKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKikgX19hY3BpX21hcF90YWJsZShwaHlzX2FkZHIsIHNpemUpOworCW1jZmcgPSAoc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqKV9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKIAlpZiAoIW1jZmcpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgTUNGR1xuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjA5LDIwICsyMTAsMTcgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19QQ0lfTU1DT05GSUcgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUENJX01NQ09ORklHICovCiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX21hZHQgKAotCXVuc2lnbmVkIGxvbmcJCXBoeXNfYWRkciwKLQl1bnNpZ25lZCBsb25nCQlzaXplKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tYWR0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbWFkdAkqbWFkdCA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdCA9IE5VTEw7CiAKIAlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltYWR0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX21hZHQgKikgX19hY3BpX21hcF90YWJsZShwaHlzX2FkZHIsIHNpemUpOworCW1hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKV9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKIAlpZiAoIW1hZHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgTUFEVFxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjMyLDIyICsyMzAsMjAgQEAKIAkJYWNwaV9sYXBpY19hZGRyID0gKHU2NCkgbWFkdC0+bGFwaWNfYWRkcmVzczsKIAogCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIkxvY2FsIEFQSUMgYWRkcmVzcyAweCUwOHhcbiIsCi0JCQltYWR0LT5sYXBpY19hZGRyZXNzKTsKKwkJICAgICAgIG1hZHQtPmxhcGljX2FkZHJlc3MpOwogCX0KIAogCWFjcGlfbWFkdF9vZW1fY2hlY2sobWFkdC0+aGVhZGVyLm9lbV9pZCwgbWFkdC0+aGVhZGVyLm9lbV90YWJsZV9pZCk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9sYXBpYyAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2xhcGljKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYwkqcHJvY2Vzc29yID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYyAqcHJvY2Vzc29yID0gTlVMTDsKIAotCXByb2Nlc3NvciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYyopIGhlYWRlcjsKKwlwcm9jZXNzb3IgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkocHJvY2Vzc29yLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI2MCwyMCArMjU2LDE5IEBACiAKIAl4ODZfYWNwaWlkX3RvX2FwaWNpZFtwcm9jZXNzb3ItPmFjcGlfaWRdID0gcHJvY2Vzc29yLT5pZDsKIAotCW1wX3JlZ2lzdGVyX2xhcGljICgKLQkJcHJvY2Vzc29yLT5pZCwJCQkJCSAgIC8qIEFQSUMgSUQgKi8KLQkJcHJvY2Vzc29yLT5mbGFncy5lbmFibGVkKTsJCQkgIC8qIEVuYWJsZWQ/ICovCisJbXBfcmVnaXN0ZXJfbGFwaWMocHJvY2Vzc29yLT5pZCwJLyogQVBJQyBJRCAqLworCQkJICBwcm9jZXNzb3ItPmZsYWdzLmVuYWJsZWQpOwkvKiBFbmFibGVkPyAqLwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpY19hZGRyX292ciA9IE5VTEw7CiAKLQlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciopIGhlYWRlcjsKKwlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShsYXBpY19hZGRyX292ciwgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yODQsMTIgKzI3OSwxMSBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9sYXBpY19ubWkgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9sYXBpY19ubWkoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqbGFwaWNfbm1pID0gTlVMTDsKIAotCWxhcGljX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkqKSBoZWFkZXI7CisJbGFwaWNfbm1pID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShsYXBpY19ubWksIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzAyLDM3ICsyOTYsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2VuZGlmCQkJCS8qQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKLSNlbmRpZiAvKkNPTkZJR19YODZfTE9DQUxfQVBJQyovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykgJiYgZGVmaW5lZChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfaW9hcGljICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfaW9hcGljKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9pb2FwaWMgKmlvYXBpYyA9IE5VTEw7CiAKLQlpb2FwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljKikgaGVhZGVyOworCWlvYXBpYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pb2FwaWMgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkoaW9hcGljLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKLSAKKwogCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOwogCi0JbXBfcmVnaXN0ZXJfaW9hcGljICgKLQkJaW9hcGljLT5pZCwKLQkJaW9hcGljLT5hZGRyZXNzLAotCQlpb2FwaWMtPmdsb2JhbF9pcnFfYmFzZSk7Ci0gCisJbXBfcmVnaXN0ZXJfaW9hcGljKGlvYXBpYy0+aWQsCisJCQkgICBpb2FwaWMtPmFkZHJlc3MsIGlvYXBpYy0+Z2xvYmFsX2lycV9iYXNlKTsKKwogCXJldHVybiAwOwogfQogCiAvKgogICogUGFyc2UgSW50ZXJydXB0IFNvdXJjZSBPdmVycmlkZSBmb3IgdGhlIEFDUEkgU0NJCiAgKi8KLXN0YXRpYyB2b2lkCi1hY3BpX3NjaV9pb2FwaWNfc2V0dXAodTMyIGdzaSwgdTE2IHBvbGFyaXR5LCB1MTYgdHJpZ2dlcikKK3N0YXRpYyB2b2lkIGFjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQogewogCWlmICh0cmlnZ2VyID09IDApCS8qIGNvbXBhdGlibGUgU0NJIHRyaWdnZXIgaXMgbGV2ZWwgKi8KIAkJdHJpZ2dlciA9IDM7CkBAIC0zNDgsNyArMzM3LDcgQEAKIAkJcG9sYXJpdHkgPSBhY3BpX3NjaV9mbGFncy5wb2xhcml0eTsKIAogCS8qCi0gCSAqIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCkgYWxyZWFkeSBzZXR1cCBJUlFzIDwgMTYKKwkgKiBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcygpIGFscmVhZHkgc2V0dXAgSVJRcyA8IDE2CiAJICogSWYgR1NJIGlzIDwgMTYsIHRoaXMgd2lsbCB1cGRhdGUgaXRzIGZsYWdzLAogCSAqIGVsc2UgaXQgd2lsbCBjcmVhdGUgYSBuZXcgbXBfaXJxc1tdIGVudHJ5LgogCSAqLwpAQCAtMzYzLDEyICszNTIsMTIgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfaW50X3NyY19vdnIgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9pbnRfc3JjX292cihhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICppbnRzcmMgPSBOVUxMOwogCi0JaW50c3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyKikgaGVhZGVyOworCWludHNyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShpbnRzcmMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzc3LDMzICszNjYsMzAgQEAKIAogCWlmIChpbnRzcmMtPmJ1c19pcnEgPT0gYWNwaV9mYWR0LnNjaV9pbnQpIHsKIAkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGludHNyYy0+Z2xvYmFsX2lycSwKLQkJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksIGludHNyYy0+ZmxhZ3MudHJpZ2dlcik7CisJCQkJICAgICAgaW50c3JjLT5mbGFncy5wb2xhcml0eSwKKwkJCQkgICAgICBpbnRzcmMtPmZsYWdzLnRyaWdnZXIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlICYmCi0JCWludHNyYy0+YnVzX2lycSA9PSAwICYmIGludHNyYy0+Z2xvYmFsX2lycSA9PSAyKSB7Ci0JCQlwcmludGsoUFJFRklYICJCSU9TIElSUTAgcGluMiBvdmVycmlkZSBpZ25vcmVkLlxuIik7Ci0JCQlyZXR1cm4gMDsKKwkgICAgaW50c3JjLT5idXNfaXJxID09IDAgJiYgaW50c3JjLT5nbG9iYWxfaXJxID09IDIpIHsKKwkJcHJpbnRrKFBSRUZJWCAiQklPUyBJUlEwIHBpbjIgb3ZlcnJpZGUgaWdub3JlZC5cbiIpOworCQlyZXR1cm4gMDsKIAl9CiAKLQltcF9vdmVycmlkZV9sZWdhY3lfaXJxICgKLQkJaW50c3JjLT5idXNfaXJxLAotCQlpbnRzcmMtPmZsYWdzLnBvbGFyaXR5LAotCQlpbnRzcmMtPmZsYWdzLnRyaWdnZXIsCi0JCWludHNyYy0+Z2xvYmFsX2lycSk7CisJbXBfb3ZlcnJpZGVfbGVnYWN5X2lycShpbnRzcmMtPmJ1c19pcnEsCisJCQkgICAgICAgaW50c3JjLT5mbGFncy5wb2xhcml0eSwKKwkJCSAgICAgICBpbnRzcmMtPmZsYWdzLnRyaWdnZXIsIGludHNyYy0+Z2xvYmFsX2lycSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9ubWlfc3JjICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2Vfbm1pX3NyYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqbm1pX3NyYyA9IE5VTEw7CiAKLQlubWlfc3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMqKSBoZWFkZXI7CisJbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKG5taV9zcmMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDE1LDkgKzQwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfWDg2X0lPX0FQSUMgKi8KLQotI2lmZGVmCUNPTkZJR19BQ1BJX0JVUworI2VuZGlmCQkJCS8qIENPTkZJR19YODZfSU9fQVBJQyAqLwogCiAvKgogICogYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKCkKQEAgLTQzMyw4ICs0MTcsNyBAQAogICogRUNMUjIgaXMgSVJRJ3MgOC0xNSAoSVJRIDgsIDEzIG11c3QgYmUgMCkKICAqLwogCi12b2lkIF9faW5pdAotYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKHVuc2lnbmVkIGludCBpcnEsIHUxNiB0cmlnZ2VyKQordm9pZCBfX2luaXQgYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKHVuc2lnbmVkIGludCBpcnEsIHUxNiB0cmlnZ2VyKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCBpcnE7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3OwpAQCAtNDU0LDEwICs0MzcsMTAgQEAKIAkgKiByb3V0aW5nIHRhYmxlcy4uCiAJICovCiAJc3dpdGNoICh0cmlnZ2VyKSB7Ci0JY2FzZSAxOgkvKiBFZGdlIC0gY2xlYXIgKi8KKwljYXNlIDE6CQkvKiBFZGdlIC0gY2xlYXIgKi8KIAkJbmV3ICY9IH5tYXNrOwogCQlicmVhazsKLQljYXNlIDM6IC8qIExldmVsIC0gc2V0ICovCisJY2FzZSAzOgkJLyogTGV2ZWwgLSBzZXQgKi8KIAkJbmV3IHw9IG1hc2s7CiAJCWJyZWFrOwogCX0KQEAgLTQ3MCwyMSArNDUzLDIyIEBACiAJb3V0YihuZXcgPj4gOCwgMHg0ZDEpOwogfQogCi0KLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9CVVMgKi8KLQogaW50IGFjcGlfZ3NpX3RvX2lycSh1MzIgZ3NpLCB1bnNpZ25lZCBpbnQgKmlycSkKIHsKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAlpZiAodXNlX3BjaV92ZWN0b3IoKSAmJiAhcGxhdGZvcm1fbGVnYWN5X2lycShnc2kpKQotIAkJKmlycSA9IElPX0FQSUNfVkVDVE9SKGdzaSk7CisJCSppcnEgPSBJT19BUElDX1ZFQ1RPUihnc2kpOwogCWVsc2UKICNlbmRpZgogCQkqaXJxID0gZ3NpOwogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBpbnQgYWNwaV9yZWdpc3Rlcl9nc2kodTMyIGdzaSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCisvKgorICogc3VjY2VzczogcmV0dXJuIElSUSBudW1iZXIgKD49MCkKKyAqIGZhaWx1cmU6IHJldHVybiA8IDAKKyAqLworaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQogewogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgaW50IHBsYXRfZ3NpID0gZ3NpOwpAQCAtNDk3LDcgKzQ4MSw3IEBACiAJCWV4dGVybiB2b2lkIGVpc2Ffc2V0X2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIAogCQlpZiAoZWRnZV9sZXZlbCA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkKLQkJCQllaXNhX3NldF9sZXZlbF9pcnEoZ3NpKTsKKwkJCWVpc2Ffc2V0X2xldmVsX2lycShnc2kpOwogCX0KICNlbmRpZgogCkBAIC01MDksNjAgKzQ5Myw1OCBAQAogCWFjcGlfZ3NpX3RvX2lycShwbGF0X2dzaSwgJmlycSk7CiAJcmV0dXJuIGlycTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3JlZ2lzdGVyX2dzaSk7CiAKIC8qCiAgKiAgQUNQSSBiYXNlZCBob3RwbHVnIHN1cHBvcnQgZm9yIENQVQogICovCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKLWludAotYWNwaV9tYXBfbHNhcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpwY3B1KQoraW50IGFjcGlfbWFwX2xzYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcGNwdSkKIHsKIAkvKiBUQkQgKi8KIAlyZXR1cm4gLUVJTlZBTDsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX21hcF9sc2FwaWMpOwogCi0KLWludAotYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSkKK2ludCBhY3BpX3VubWFwX2xzYXBpYyhpbnQgY3B1KQogewogCS8qIFRCRCAqLwogCXJldHVybiAtRUlOVkFMOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLworI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVICovCiAKLWludAotYWNwaV9yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpCitpbnQgYWNwaV9yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpCiB7CiAJLyogVEJEICovCiAJcmV0dXJuIC1FSU5WQUw7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9pb2FwaWMpOwogCi1pbnQKLWFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZ3NpX2Jhc2UpCitpbnQgYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSkKIHsKIAkvKiBUQkQgKi8KIAlyZXR1cm4gLUVJTlZBTDsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfaW9hcGljKTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0Ci1hY3BpX3NjYW5fcnNkcCAoCi0JdW5zaWduZWQgbG9uZwkJc3RhcnQsCi0JdW5zaWduZWQgbG9uZwkJbGVuZ3RoKQorYWNwaV9zY2FuX3JzZHAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCiB7Ci0JdW5zaWduZWQgbG9uZwkJb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBsb25nCQlzaWdfbGVuID0gc2l6ZW9mKCJSU0QgUFRSICIpIC0gMTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBzaWdfbGVuID0gc2l6ZW9mKCJSU0QgUFRSICIpIC0gMTsKIAogCS8qCiAJICogU2NhbiBhbGwgMTYtYnl0ZSBib3VuZGFyaWVzIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uIGZvciB0aGUKIAkgKiBSU0RQIHNpZ25hdHVyZS4KIAkgKi8KIAlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0ICs9IDE2KSB7Ci0JCWlmIChzdHJuY21wKChjaGFyICopIChzdGFydCArIG9mZnNldCksICJSU0QgUFRSICIsIHNpZ19sZW4pKQorCQlpZiAoc3RybmNtcCgoY2hhciAqKShzdGFydCArIG9mZnNldCksICJSU0QgUFRSICIsIHNpZ19sZW4pKQogCQkJY29udGludWU7CiAJCXJldHVybiAoc3RhcnQgKyBvZmZzZXQpOwogCX0KQEAgLTU3NSwyMCArNTU3LDE5IEBACiAJc3RydWN0IGFjcGlfdGFibGVfc2JmICpzYjsKIAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQotCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNiID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJc2IgPSAoc3RydWN0IGFjcGlfdGFibGVfc2JmICopX19hY3BpX21hcF90YWJsZShwaHlzX2FkZHIsIHNpemUpOwogCWlmICghc2IpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgU0JGXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc2JmX3BvcnQgPSBzYi0+c2JmX2Ntb3M7IC8qIFNhdmUgQ01PUyBwb3J0ICovCisJc2JmX3BvcnQgPSBzYi0+c2JmX2Ntb3M7CS8qIFNhdmUgQ01PUyBwb3J0ICovCiAKIAlyZXR1cm4gMDsKIH0KIAotCiAjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9ocGV0KHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKQpAQCAtNTk4LDcgKzU3OSw3IEBACiAJaWYgKCFwaHlzIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWhwZXRfdGJsID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hwZXQgKikgX19hY3BpX21hcF90YWJsZShwaHlzLCBzaXplKTsKKwlocGV0X3RibCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ocGV0ICopX19hY3BpX21hcF90YWJsZShwaHlzLCBzaXplKTsKIAlpZiAoIWhwZXRfdGJsKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIEhQRVRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTYwOSwyMiArNTkwLDIxIEBACiAJCSAgICAgICAibWVtb3J5LlxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0KICNpZmRlZglDT05GSUdfWDg2XzY0Ci0gICAgICAgIHZ4dGltZS5ocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkci5hZGRybCB8Ci0gICAgICAgICAgICAgICAgKChsb25nKSBocGV0X3RibC0+YWRkci5hZGRyaCA8PCAzMik7CisJdnh0aW1lLmhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyLmFkZHJsIHwKKwkgICAgKChsb25nKWhwZXRfdGJsLT5hZGRyLmFkZHJoIDw8IDMyKTsKIAotICAgICAgICBwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCi0gICAgICAgICAgICAgICBocGV0X3RibC0+aWQsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOwotI2Vsc2UJLyogWDg2ICovCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkhQRVQgaWQ6ICUjeCBiYXNlOiAlI2x4XG4iLAorCSAgICAgICBocGV0X3RibC0+aWQsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOworI2Vsc2UJCQkJLyogWDg2ICovCiAJewogCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CiAKIAkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHIuYWRkcmw7CiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKLQkJCWhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKKwkJICAgICAgIGhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKIAl9Ci0jZW5kaWYJLyogWDg2ICovCisjZW5kaWYJCQkJLyogWDg2ICovCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY0MCwyOCArNjIwLDI1IEBACiB7CiAJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpmYWR0ID0gTlVMTDsKIAotCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKikgX19hY3BpX21hcF90YWJsZShwaHlzLHNpemUpOwotCWlmKCFmYWR0KSB7CisJZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXMsIHNpemUpOworCWlmICghZmFkdCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBGQURUXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCi0jaWZkZWYJQ09ORklHX0FDUElfSU5URVJQUkVURVIKIAkvKiBpbml0aWFsaXplIHNjaV9pbnQgZWFybHkgZm9yIElOVF9TUkNfT1ZSIE1BRFQgcGFyc2luZyAqLwogCWFjcGlfZmFkdC5zY2lfaW50ID0gZmFkdC0+c2NpX2ludDsKLSNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0FDUElfQlVTCiAJLyogaW5pdGlhbGl6ZSByZXYgYW5kIGFwaWNfcGh5c19kZXN0X21vZGUgZm9yIHg4Nl82NCBnZW5hcGljICovCiAJYWNwaV9mYWR0LnJldmlzaW9uID0gZmFkdC0+cmV2aXNpb247Ci0JYWNwaV9mYWR0LmZvcmNlX2FwaWNfcGh5c2ljYWxfZGVzdGluYXRpb25fbW9kZSA9IGZhZHQtPmZvcmNlX2FwaWNfcGh5c2ljYWxfZGVzdGluYXRpb25fbW9kZTsKLSNlbmRpZgorCWFjcGlfZmFkdC5mb3JjZV9hcGljX3BoeXNpY2FsX2Rlc3RpbmF0aW9uX21vZGUgPQorCSAgICBmYWR0LT5mb3JjZV9hcGljX3BoeXNpY2FsX2Rlc3RpbmF0aW9uX21vZGU7CiAKICNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCiAJLyogZGV0ZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQUNQSSBQTSBUaW1lciAqLwogCWlmIChmYWR0LT5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCkgewogCQkvKiBGQURUIHJldi4gMiAqLwotCQlpZiAoZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzc19zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pCisJCWlmIChmYWR0LT54cG1fdG1yX2Jsay5hZGRyZXNzX3NwYWNlX2lkICE9CisJCSAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pCiAJCQlyZXR1cm4gMDsKIAogCQlwbXRtcl9pb3BvcnQgPSBmYWR0LT54cG1fdG1yX2Jsay5hZGRyZXNzOwpAQCAtNjcwLDE2ICs2NDcsMTUgQEAKIAkJcG10bXJfaW9wb3J0ID0gZmFkdC0+VjFfcG1fdG1yX2JsazsKIAl9CiAJaWYgKHBtdG1yX2lvcG9ydCkKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBNLVRpbWVyIElPIFBvcnQ6ICUjeFxuIiwgcG10bXJfaW9wb3J0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBNLVRpbWVyIElPIFBvcnQ6ICUjeFxuIiwKKwkJICAgICAgIHBtdG1yX2lvcG9ydCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAotCi11bnNpZ25lZCBsb25nIF9faW5pdAotYWNwaV9maW5kX3JzZHAgKHZvaWQpCit1bnNpZ25lZCBsb25nIF9faW5pdCBhY3BpX2ZpbmRfcnNkcCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcJCXJzZHBfcGh5cyA9IDA7CisJdW5zaWduZWQgbG9uZyByc2RwX3BoeXMgPSAwOwogCiAJaWYgKGVmaV9lbmFibGVkKSB7CiAJCWlmIChlZmkuYWNwaTIwKQpAQCAtNjkxLDkgKzY2Nyw5IEBACiAJICogU2NhbiBtZW1vcnkgbG9va2luZyBmb3IgdGhlIFJTRFAgc2lnbmF0dXJlLiBGaXJzdCBzZWFyY2ggRUJEQSAobG93CiAJICogbWVtb3J5KSBwYXJhZ3JhcGhzIGFuZCB0aGVuIHNlYXJjaCB1cHBlciBtZW1vcnkgKEUwMDAwLUZGRkZGKS4KIAkgKi8KLQlyc2RwX3BoeXMgPSBhY3BpX3NjYW5fcnNkcCAoMCwgMHg0MDApOworCXJzZHBfcGh5cyA9IGFjcGlfc2Nhbl9yc2RwKDAsIDB4NDAwKTsKIAlpZiAoIXJzZHBfcGh5cykKLQkJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDB4RTAwMDAsIDB4MjAwMDApOworCQlyc2RwX3BoeXMgPSBhY3BpX3NjYW5fcnNkcCgweEUwMDAwLCAweDIwMDAwKTsKIAogCXJldHVybiByc2RwX3BoeXM7CiB9CkBAIC03MDMsOCArNjc5LDcgQEAKICAqIFBhcnNlIExBUElDIGVudHJpZXMgaW4gTUFEVAogICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvcgogICovCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9tYWR0X2xhcGljX2VudHJpZXModm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfbWFkdF9sYXBpY19lbnRyaWVzKHZvaWQpCiB7CiAJaW50IGNvdW50OwogCkBAIC03MTMsMjggKzY4OCwzMSBAQAogCSAqIGFuZCAob3B0aW9uYWxseSkgb3ZlcnJpZGVuIGJ5IGEgTEFQSUNfQUREUl9PVlIgZW50cnkgKDY0LWJpdCB2YWx1ZSkuCiAJICovCiAKLQljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApOworCWNvdW50ID0KKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19BRERSX09WUiwKKwkJCQkgIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApOwogCWlmIChjb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkVycm9yIHBhcnNpbmcgTEFQSUMgYWRkcmVzcyBvdmVycmlkZSBlbnRyeVxuIik7CiAJCXJldHVybiBjb3VudDsKIAl9CiAKIAltcF9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzKGFjcGlfbGFwaWNfYWRkcik7CiAKIAljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUMsIGFjcGlfcGFyc2VfbGFwaWMsCi0JCQkJICAgICAgIE1BWF9BUElDUyk7Ci0JaWYgKCFjb3VudCkgeyAKKwkJCQkgICAgICBNQVhfQVBJQ1MpOworCWlmICghY291bnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiTm8gTEFQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKIAkJLyogVEJEOiBDbGVhbnVwIHRvIGFsbG93IGZhbGxiYWNrIHRvIE1QUyAqLwogCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JZWxzZSBpZiAoY291bnQgPCAwKSB7CisJfSBlbHNlIGlmIChjb3VudCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBlbnRyeVxuIik7CiAJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KIAkJcmV0dXJuIGNvdW50OwogCX0KIAotCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKTsKKwljb3VudCA9CisJICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfTk1JLCBhY3BpX3BhcnNlX2xhcGljX25taSwgMCk7CiAJaWYgKGNvdW50IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIExBUElDIE5NSSBlbnRyeVxuIik7CiAJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KQEAgLTc0MiwxNSArNzIwLDE0IEBACiAJfQogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLworI2VuZGlmCQkJCS8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisjaWZkZWYJQ09ORklHX1g4Nl9JT19BUElDCiAvKgogICogUGFyc2UgSU9BUElDIHJlbGF0ZWQgZW50cmllcyBpbiBNQURUCiAgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPCAwIG9uIGVycm9yCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfbWFkdF9pb2FwaWNfZW50cmllcyh2b2lkKQogewogCWludCBjb3VudDsKIApAQCAtNzYyLDMwICs3MzksMzQgQEAKIAkgKi8KIAlpZiAoYWNwaV9kaXNhYmxlZCB8fCBhY3BpX25vaXJxKSB7CiAJCXJldHVybiAtRU5PREVWOwotICAgICAgICB9CisJfQogCiAJLyoKLSAJICogaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24sIGRvbid0IGxvb2sgZm9yIElPLUFQSUNzCisJICogaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24sIGRvbid0IGxvb2sgZm9yIElPLUFQSUNzCiAJICovCiAJaWYgKHNraXBfaW9hcGljX3NldHVwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJTa2lwcGluZyBJT0FQSUMgcHJvYmUgIgotCQkJImR1ZSB0byAnbm9hcGljJyBvcHRpb24uXG4iKTsKKwkJICAgICAgICJkdWUgdG8gJ25vYXBpYycgb3B0aW9uLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9JT0FQSUMsIGFjcGlfcGFyc2VfaW9hcGljLCBNQVhfSU9fQVBJQ1MpOworCWNvdW50ID0KKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9JT0FQSUMsIGFjcGlfcGFyc2VfaW9hcGljLAorCQkJCSAgTUFYX0lPX0FQSUNTKTsKIAlpZiAoIWNvdW50KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk5vIElPQVBJQyBlbnRyaWVzIHByZXNlbnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JZWxzZSBpZiAoY291bnQgPCAwKSB7CisJfSBlbHNlIGlmIChjb3VudCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBJT0FQSUMgZW50cnlcbiIpOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lOVF9TUkNfT1ZSLCBhY3BpX3BhcnNlX2ludF9zcmNfb3ZyLCBOUl9JUlFfVkVDVE9SUyk7CisJY291bnQgPQorCSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lOVF9TUkNfT1ZSLCBhY3BpX3BhcnNlX2ludF9zcmNfb3ZyLAorCQkJCSAgTlJfSVJRX1ZFQ1RPUlMpOwogCWlmIChjb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlcyBlbnRyeVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJFcnJvciBwYXJzaW5nIGludGVycnVwdCBzb3VyY2Ugb3ZlcnJpZGVzIGVudHJ5XG4iKTsKIAkJLyogVEJEOiBDbGVhbnVwIHRvIGFsbG93IGZhbGxiYWNrIHRvIE1QUyAqLwogCQlyZXR1cm4gY291bnQ7CiAJfQpAQCAtODAwLDcgKzc4MSw5IEBACiAJLyogRmlsbCBpbiBpZGVudGl0eSBsZWdhY3kgbWFwaW5ncyB3aGVyZSBubyBvdmVycmlkZSAqLwogCW1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCk7CiAKLQljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTk1JX1NSQywgYWNwaV9wYXJzZV9ubWlfc3JjLCBOUl9JUlFfVkVDVE9SUyk7CisJY291bnQgPQorCSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX05NSV9TUkMsIGFjcGlfcGFyc2Vfbm1pX3NyYywKKwkJCQkgIE5SX0lSUV9WRUNUT1JTKTsKIAlpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTk1JIFNSQyBlbnRyeVxuIik7CiAJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KQEAgLTgxNCwxMSArNzk3LDkgQEAKIHsKIAlyZXR1cm4gLTE7CiB9Ci0jZW5kaWYgLyogIShDT05GSUdfWDg2X0lPX0FQSUMgJiYgQ09ORklHX0FDUElfSU5URVJQUkVURVIpICovCisjZW5kaWYJLyogIUNPTkZJR19YODZfSU9fQVBJQyAqLwogCi0KLXN0YXRpYyB2b2lkIF9faW5pdAotYWNwaV9wcm9jZXNzX21hZHQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3Byb2Nlc3NfbWFkdCh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCWludCBjb3VudCwgZXJyb3I7CkBAIC04NTMsNyArODM0LDggQEAKIAkJCS8qCiAJCQkgKiBEZWxsIFByZWNpc2lvbiBXb3Jrc3RhdGlvbiA0MTAsIDYxMCBjb21lIGhlcmUuCiAJCQkgKi8KLQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgQklPUyBNQURULCBkaXNhYmxpbmcgQUNQSVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCQkgICAgICAgIkludmFsaWQgQklPUyBNQURULCBkaXNhYmxpbmcgQUNQSVxuIik7CiAJCQlkaXNhYmxlX2FjcGkoKTsKIAkJfQogCX0KQEAgLTg2NSw3ICs4NDcsNiBAQAogCiAjaWZkZWYgX19pMzg2X18KIAotI2lmZGVmCUNPTkZJR19BQ1BJX1BDSQogc3RhdGljIGludCBfX2luaXQgZGlzYWJsZV9hY3BpX2lycShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKIAlpZiAoIWFjcGlfZm9yY2UpIHsKQEAgLTg4NSwxMiArODY2LDExIEBACiAJfQogCXJldHVybiAwOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19pbml0IGRtaV9kaXNhYmxlX2FjcGkoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCiB7CiAJaWYgKCFhY3BpX2ZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGFjcGkgb2ZmXG4iLGQtPmlkZW50KTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogYWNwaSBvZmZcbiIsIGQtPmlkZW50KTsKIAkJZGlzYWJsZV9hY3BpKCk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFCkBAIC05MDUsNyArODg1LDggQEAKIHN0YXRpYyBpbnQgX19pbml0IGZvcmNlX2FjcGlfaHQoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCiB7CiAJaWYgKCFhY3BpX2ZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPWh0XG4iLCBkLT5pZGVudCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPWh0XG4iLAorCQkgICAgICAgZC0+aWRlbnQpOwogCQlkaXNhYmxlX2FjcGkoKTsKIAkJYWNwaV9odCA9IDE7CiAJfSBlbHNlIHsKQEAgLTkyNCwxNTUgKzkwNSwxNTUgQEAKIAkgKiBCb3hlcyB0aGF0IG5lZWQgQUNQSSBkaXNhYmxlZAogCSAqLwogCXsKLQkJLmNhbGxiYWNrID0gZG1pX2Rpc2FibGVfYWNwaSwKLQkJLmlkZW50ID0gIklCTSBUaGlua3BhZCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIjI2MjlIMUciKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9hY3BpLAorCSAuaWRlbnQgPSAiSUJNIFRoaW5rcGFkIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICIyNjI5SDFHIiksCisJCSAgICAgfSwKKwkgfSwKIAogCS8qCiAJICogQm94ZXMgdGhhdCBuZWVkIGFjcGk9aHQKIAkgKi8KIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJGU0MgUHJpbWVyZ3kgVDg1MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBSSU1FUkdZIFQ4NTAiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiRlNDIFByaW1lcmd5IFQ4NTAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBSSU1FUkdZIFQ4NTAiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIkRFTEwgR1gyNDAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiT3B0aVBsZXggR1gyNDAiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiREVMTCBHWDI0MCIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk9wdGlQbGV4IEdYMjQwIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIFZJU1VBTElaRSBOVCBXb3Jrc3RhdGlvbiIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgVklTVUFMSVpFIE5UIFdvcmtzdGF0aW9uIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJDb21wYXEgV29ya3N0YXRpb24gVzgwMDAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbXBhcSIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJXb3Jrc3RhdGlvbiBXODAwMCIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJDb21wYXEgV29ya3N0YXRpb24gVzgwMDAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJDb21wYXEiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIldvcmtzdGF0aW9uIFc4MDAwIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJBU1VTIFA0QjI2NiIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlA0QjI2NiIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJBU1VTIFA0QjI2NiIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRCMjY2IiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJBU1VTIFAyQi1EUyIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlAyQi1EUyIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJIC5pZGVudCA9ICJBU1VTIFAyQi1EUyIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUDJCLURTIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJBU1VTIENVUi1ETFMiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJDVVItRExTIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIkFTVVMgQ1VSLURMUyIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQ1VSLURMUyIpLAorCQkgICAgIH0sCisJIH0sCiAJewotCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAotCQkuaWRlbnQgPSAiQUJJVCBpNDQwQlgtVzgzOTc3IiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFCSVQgPGh0dHA6Ly93d3cuYWJpdC5jb20+IiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJpNDQwQlgtVzgzOTc3IChCUDYpIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIkFCSVQgaTQ0MEJYLVc4Mzk3NyIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQUJJVCA8aHR0cDovL3d3dy5hYml0LmNvbT4iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJpNDQwQlgtVzgzOTc3IChCUDYpIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJJQk0gQmxhZGVjZW50ZXIiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJJQk0gZVNlcnZlciBCbGFkZUNlbnRlciBIUzIwIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIklCTSBCbGFkZWNlbnRlciIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiSUJNIGVTZXJ2ZXIgQmxhZGVDZW50ZXIgSFMyMCIpLAorCQkgICAgIH0sCisJIH0sCiAJewotCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAotCQkuaWRlbnQgPSAiSUJNIGVTZXJ2ZXIgeFNlcmllcyAzNjAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJlU2VydmVyIHhTZXJpZXMgMzYwIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIklCTSBlU2VydmVyIHhTZXJpZXMgMzYwIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJlU2VydmVyIHhTZXJpZXMgMzYwIiksCisJCSAgICAgfSwKKwkgfSwKIAl7Ci0JCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCi0JCS5pZGVudCA9ICJJQk0gZXNlcnZlciB4U2VyaWVzIDMzMCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyAzMzAiKSwKLQkJfSwKLQl9LAorCSAuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCSAuaWRlbnQgPSAiSUJNIGVzZXJ2ZXIgeFNlcmllcyAzMzAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyAzMzAiKSwKKwkJICAgICB9LAorCSB9LAogCXsKLQkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKLQkJLmlkZW50ID0gIklCTSBlc2VydmVyIHhTZXJpZXMgNDQwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJlc2VydmVyIHhTZXJpZXMgNDQwIiksCi0JCX0sCi0JfSwKKwkgLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkgLmlkZW50ID0gIklCTSBlc2VydmVyIHhTZXJpZXMgNDQwIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyA0NDAiKSwKKwkJICAgICB9LAorCSB9LAogCi0jaWZkZWYJQ09ORklHX0FDUElfUENJCiAJLyoKIAkgKiBCb3hlcyB0aGF0IG5lZWQgQUNQSSBQQ0kgSVJRIHJvdXRpbmcgZGlzYWJsZWQKIAkgKi8KIAl7Ci0JCS5jYWxsYmFjayA9IGRpc2FibGVfYWNwaV9pcnEsCi0JCS5pZGVudCA9ICJBU1VTIEE3ViIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQyIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiPEE3Vj4iKSwKLQkJCS8qIG5ld2VyIEJJT1MsIFJldmlzaW9uIDEwMTEsIGRvZXMgd29yayAqLwotCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIEE3ViBBQ1BJIEJJT1MgUmV2aXNpb24gMTAwNyIpLAotCQl9LAotCX0sCisJIC5jYWxsYmFjayA9IGRpc2FibGVfYWNwaV9pcnEsCisJIC5pZGVudCA9ICJBU1VTIEE3ViIsCisJIC5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICI8QTdWPiIpLAorCQkgICAgIC8qIG5ld2VyIEJJT1MsIFJldmlzaW9uIDEwMTEsIGRvZXMgd29yayAqLworCQkgICAgIERNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLAorCQkJICAgICAgICJBU1VTIEE3ViBBQ1BJIEJJT1MgUmV2aXNpb24gMTAwNyIpLAorCQkgICAgIH0sCisJIH0sCiAKIAkvKgogCSAqIEJveGVzIHRoYXQgbmVlZCBBQ1BJIFBDSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gZGlzYWJsZWQKIAkgKi8KLQl7CS8qIF9CQk4gMCBidWcgKi8KLQkJLmNhbGxiYWNrID0gZGlzYWJsZV9hY3BpX3BjaSwKLQkJLmlkZW50ID0gIkFTVVMgUFItRExTIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUFItRExTIiksCi0JCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIkFTVVMgUFItRExTIEFDUEkgQklPUyBSZXZpc2lvbiAxMDEwIiksCi0JCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjAzLzIxLzIwMDMiKQotCQl9LAotCX0sCisJewkJCS8qIF9CQk4gMCBidWcgKi8KKwkgLmNhbGxiYWNrID0gZGlzYWJsZV9hY3BpX3BjaSwKKwkgLmlkZW50ID0gIkFTVVMgUFItRExTIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQUi1ETFMiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwKKwkJCSAgICAgICAiQVNVUyBQUi1ETFMgQUNQSSBCSU9TIFJldmlzaW9uIDEwMTAiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjAzLzIxLzIwMDMiKQorCQkgICAgIH0sCisJIH0sCiAJewotCQkuY2FsbGJhY2sgPSBkaXNhYmxlX2FjcGlfcGNpLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDM2eCBMYXB0b3AiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKLSAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzYwIiksCi0JCX0sCi0JfSwKLSNlbmRpZgotCXsgfQorCSAuY2FsbGJhY2sgPSBkaXNhYmxlX2FjcGlfcGNpLAorCSAuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDM2eCBMYXB0b3AiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCisJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDM2MCIpLAorCQkgICAgIH0sCisJIH0sCisJe30KIH07CiAKLSNlbmRpZgkvKiBfX2kzODZfXyAqLworI2VuZGlmCQkJCS8qIF9faTM4Nl9fICovCiAKIC8qCiAgKiBhY3BpX2Jvb3RfdGFibGVfaW5pdCgpIGFuZCBhY3BpX2Jvb3RfaW5pdCgpCkBAIC0xMDk3LDggKzEwNzgsNyBAQAogICoJITA6IGZhaWx1cmUKICAqLwogCi1pbnQgX19pbml0Ci1hY3BpX2Jvb3RfdGFibGVfaW5pdCh2b2lkKQoraW50IF9faW5pdCBhY3BpX2Jvb3RfdGFibGVfaW5pdCh2b2lkKQogewogCWludCBlcnJvcjsKIApAQCAtMTExMSw3ICsxMDkxLDcgQEAKIAkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKIAkgKi8KIAlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKLQkJIHJldHVybiAxOworCQlyZXR1cm4gMTsKIAogCS8qIAogCSAqIEluaXRpYWxpemUgdGhlIEFDUEkgYm9vdC10aW1lIHRhYmxlIHBhcnNlci4KQEAgLTExMjEsNyArMTEwMSw2IEBACiAJCWRpc2FibGVfYWNwaSgpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCiAjaWZkZWYgX19pMzg2X18KIAljaGVja19hY3BpX3BjaSgpOwogI2VuZGlmCkBAIC0xMTQ1LDcgKzExMjQsNiBAQAogCXJldHVybiAwOwogfQogCi0KIGludCBfX2luaXQgYWNwaV9ib290X2luaXQodm9pZCkKIHsKIAkvKgpAQCAtMTE1Myw3ICsxMTMxLDcgQEAKIAkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKIAkgKi8KIAlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKLQkJIHJldHVybiAxOworCQlyZXR1cm4gMTsKIAogCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9CT09ULCBhY3BpX3BhcnNlX3NiZik7CiAKQEAgLTExNzEsNCArMTE0OSwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKaW5kZXggNzI2YTVjYS4uZjFiOWQyYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCkBAIC04LDQ0ICs4LDQ0IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgogCi1zdGF0aWMgaW50IF9faW5pdCBjaGVja19icmlkZ2UoaW50IHZlbmRvciwgaW50IGRldmljZSkgCitzdGF0aWMgaW50IF9faW5pdCBjaGVja19icmlkZ2UoaW50IHZlbmRvciwgaW50IGRldmljZSkKIHsKIAkvKiBBY2NvcmRpbmcgdG8gTnZpZGlhIGFsbCB0aW1lciBvdmVycmlkZXMgYXJlIGJvZ3VzLiBKdXN0IGlnbm9yZQogCSAgIHRoZW0gYWxsLiAqLwotCWlmICh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsgCi0JCWFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSA9IDE7IAkJCisJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgeworCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOwogCX0KIAlyZXR1cm4gMDsKIH0KLSAgIAotdm9pZCBfX2luaXQgY2hlY2tfYWNwaV9wY2kodm9pZCkgCi17IAotCWludCBudW0sc2xvdCxmdW5jOyAKKwordm9pZCBfX2luaXQgY2hlY2tfYWNwaV9wY2kodm9pZCkKK3sKKwlpbnQgbnVtLCBzbG90LCBmdW5jOwogCiAJLyogQXNzdW1lIHRoZSBtYWNoaW5lIHN1cHBvcnRzIHR5cGUgMS4gSWYgbm90IGl0IHdpbGwgCiAJICAgYWx3YXlzIHJlYWQgZmZmZmZmZmYgYW5kIHNob3VsZCBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3QuICovCiAKIAkvKiBQb29yIG1hbidzIFBDSSBkaXNjb3ZlcnkgKi8KLQlmb3IgKG51bSA9IDA7IG51bSA8IDMyOyBudW0rKykgeyAKLQkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDMyOyBzbG90KyspIHsgCi0JCQlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgODsgZnVuYysrKSB7IAorCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7CisJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCAzMjsgc2xvdCsrKSB7CisJCQlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgODsgZnVuYysrKSB7CiAJCQkJdTMyIGNsYXNzOwogCQkJCXUzMiB2ZW5kb3I7Ci0JCQkJY2xhc3MgPSByZWFkX3BjaV9jb25maWcobnVtLHNsb3QsZnVuYywKKwkJCQljbGFzcyA9IHJlYWRfcGNpX2NvbmZpZyhudW0sIHNsb3QsIGZ1bmMsCiAJCQkJCQkJUENJX0NMQVNTX1JFVklTSU9OKTsKIAkJCQlpZiAoY2xhc3MgPT0gMHhmZmZmZmZmZikKLQkJCQkJYnJlYWs7IAorCQkJCQlicmVhazsKIAogCQkJCWlmICgoY2xhc3MgPj4gMTYpICE9IFBDSV9DTEFTU19CUklER0VfUENJKQotCQkJCQljb250aW51ZTsgCi0JCQkJCi0JCQkJdmVuZG9yID0gcmVhZF9wY2lfY29uZmlnKG51bSwgc2xvdCwgZnVuYywgCisJCQkJCWNvbnRpbnVlOworCisJCQkJdmVuZG9yID0gcmVhZF9wY2lfY29uZmlnKG51bSwgc2xvdCwgZnVuYywKIAkJCQkJCQkgUENJX1ZFTkRPUl9JRCk7Ci0JCQkJCi0JCQkJaWYgKGNoZWNrX2JyaWRnZSh2ZW5kb3ImMHhmZmZmLCB2ZW5kb3IgPj4gMTYpKQotCQkJCQlyZXR1cm47IAotCQkJfSAKLQkJCQorCisJCQkJaWYgKGNoZWNrX2JyaWRnZSh2ZW5kb3IgJiAweGZmZmYsIHZlbmRvciA+PiAxNikpCisJCQkJCXJldHVybjsKKwkJCX0KKwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3NsZWVwLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCBjMWFmOTMwLi4xY2IyYjE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtMjAsMTIgKzIwLDEzIEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIEZBU1RDQUxMKGFjcGlfY29weV93YWtldXBfcm91dGluZSh1bnNpZ25lZCBsb25nKSk7CiAKLXN0YXRpYyB2b2lkIGluaXRfbG93X21hcHBpbmcocGdkX3QgKnBnZCwgaW50IHBnZF9saW1pdCkKK3N0YXRpYyB2b2lkIGluaXRfbG93X21hcHBpbmcocGdkX3QgKiBwZ2QsIGludCBwZ2RfbGltaXQpCiB7CiAJaW50IHBnZF9vZnMgPSAwOwogCi0Jd2hpbGUgKChwZ2Rfb2ZzIDwgcGdkX2xpbWl0KSAmJiAocGdkX29mcyArIFVTRVJfUFRSU19QRVJfUEdEIDwgUFRSU19QRVJfUEdEKSkgewotCQlzZXRfcGdkKHBnZCwgKihwZ2QrVVNFUl9QVFJTX1BFUl9QR0QpKTsKKwl3aGlsZSAoKHBnZF9vZnMgPCBwZ2RfbGltaXQpCisJICAgICAgICYmIChwZ2Rfb2ZzICsgVVNFUl9QVFJTX1BFUl9QR0QgPCBQVFJTX1BFUl9QR0QpKSB7CisJCXNldF9wZ2QocGdkLCAqKHBnZCArIFVTRVJfUFRSU19QRVJfUEdEKSk7CiAJCXBnZF9vZnMrKywgcGdkKys7CiAJfQogCWZsdXNoX3RsYl9hbGwoKTsKQEAgLTM3LDEyICszOCwxMyBAQAogICogQ3JlYXRlIGFuIGlkZW50aXR5IG1hcHBlZCBwYWdlIHRhYmxlIGFuZCBjb3B5IHRoZSB3YWtldXAgcm91dGluZSB0bwogICogbG93IG1lbW9yeS4KICAqLwotaW50IGFjcGlfc2F2ZV9zdGF0ZV9tZW0gKHZvaWQpCitpbnQgYWNwaV9zYXZlX3N0YXRlX21lbSh2b2lkKQogewogCWlmICghYWNwaV93YWtldXBfYWRkcmVzcykKIAkJcmV0dXJuIDE7CiAJaW5pdF9sb3dfbWFwcGluZyhzd2FwcGVyX3BnX2RpciwgVVNFUl9QVFJTX1BFUl9QR0QpOwotCW1lbWNweSgodm9pZCAqKSBhY3BpX3dha2V1cF9hZGRyZXNzLCAmd2FrZXVwX3N0YXJ0LCAmd2FrZXVwX2VuZCAtICZ3YWtldXBfc3RhcnQpOworCW1lbWNweSgodm9pZCAqKWFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsCisJICAgICAgICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CiAJYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKGFjcGlfd2FrZXVwX2FkZHJlc3MpOwogCiAJcmV0dXJuIDA7CkBAIC01MSw3ICs1Myw3IEBACiAvKgogICogYWNwaV9yZXN0b3JlX3N0YXRlIC0gdW5kbyBlZmZlY3RzIG9mIGFjcGlfc2F2ZV9zdGF0ZV9tZW0KICAqLwotdm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtICh2b2lkKQordm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJemFwX2xvd19tYXBwaW5ncygpOwogfQpAQCAtNjcsNyArNjksOCBAQAogdm9pZCBfX2luaXQgYWNwaV9yZXNlcnZlX2Jvb3RtZW0odm9pZCkKIHsKIAlpZiAoKCZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCkgPiBQQUdFX1NJWkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBQ1BJOiBXYWtldXAgY29kZSB3YXkgdG9vIGJpZywgUzMgZGlzYWJsZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQUNQSTogV2FrZXVwIGNvZGUgd2F5IHRvbyBiaWcsIFMzIGRpc2FibGVkLlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTkwLDEwICs5Myw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogX19zZXR1cCgiYWNwaV9zbGVlcD0iLCBhY3BpX3NsZWVwX3NldHVwKTsKIAotCiBzdGF0aWMgX19pbml0IGludCByZXNldF92aWRlb21vZGVfYWZ0ZXJfczMoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCiB7CiAJYWNwaV92aWRlb19mbGFncyB8PSAyOwpAQCAtMTAxLDE0ICsxMDIsMTQgQEAKIH0KIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9zeXN0ZW1faWQgYWNwaXNsZWVwX2RtaV90YWJsZVtdID0gewotCXsJLyogUmVzZXQgdmlkZW8gbW9kZSBhZnRlciByZXR1cm5pbmcgZnJvbSBBQ1BJIFMzIHNsZWVwICovCi0JCS5jYWxsYmFjayA9IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMywKLQkJLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIDQwMzBjZHQiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzQwMzBDRFQvNC4zIiksCi0JCX0sCi0JfSwKLQl7IH0KKwl7CQkJLyogUmVzZXQgdmlkZW8gbW9kZSBhZnRlciByZXR1cm5pbmcgZnJvbSBBQ1BJIFMzIHNsZWVwICovCisJIC5jYWxsYmFjayA9IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMywKKwkgLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIDQwMzBjZHQiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLAorCQkgICAgIH0sCisJIH0sCisJe30KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlzbGVlcF9kbWlfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCmluZGV4IDQ0ZDg4NmMuLjdjNzRmZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMKQEAgLTMwNCwxMiArMzA0LDYgQEAKIAljYWxsCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlCiAJcmV0CiAKLUVOVFJZKGRvX3N1c3BlbmRfbG93bGV2ZWxfczRiaW9zKQotCWNhbGwgc2F2ZV9wcm9jZXNzb3Jfc3RhdGUKLQljYWxsIHNhdmVfcmVnaXN0ZXJzCi0JY2FsbCBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcwotCXJldAotCiBBTElHTgogIyBzYXZlZCByZWdpc3RlcnMKIHNhdmVkX2dkdDoJLmxvbmcJMCwwCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCmluZGV4IDQ2Y2U5YjI0Li45YWQ0M2JlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMTUxLDcgKzE1MSw3IEBACiB9CiAKIAotdm9pZCBfX2RldmluaXQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjLCBpbnQgZWFybHkpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjLCBpbnQgZWFybHkpCiB7CiAJY2hhciAqdiA9IGMtPng4Nl92ZW5kb3JfaWQ7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCA2MGE5ZTU0Li44MjJjOGNlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNTcsNiArNTgsOCBAQAogCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGFjcGlfY3B1ZnJlcV9kcml2ZXI7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWNwaV9wc3RhdGVfc3RyaWN0OworCiBzdGF0aWMgaW50CiBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9wb3J0KAogCXUxNglwb3J0LApAQCAtMTYzLDM0ICsxNjYsNDQgQEAKIAl9CiAKIAkvKgotCSAqIFRoZW4gd2UgcmVhZCB0aGUgJ3N0YXR1c19yZWdpc3RlcicgYW5kIGNvbXBhcmUgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogdGFyZ2V0IHN0YXRlJ3MgJ3N0YXR1cycgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc2l0aW9uIHdhcyBzdWNjZXNzZnVsLgotCSAqIE5vdGUgdGhhdCB3ZSdsbCBwb2xsIGZvciB1cCB0byAxbXMgKDEwMCBjeWNsZXMgb2YgMTB1cykgYmVmb3JlCi0JICogZ2l2aW5nIHVwLgorCSAqIEFzc3VtZSB0aGUgd3JpdGUgd2VudCB0aHJvdWdoIHdoZW4gYWNwaV9wc3RhdGVfc3RyaWN0IGlzIG5vdCB1c2VkLgorCSAqIEFzIHJlYWQgc3RhdHVzX3JlZ2lzdGVyIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gYW5kIHRoZXJlIAorCSAqIGFyZSBubyBzcGVjaWZpYyBlcnJvciBjYXNlcyB3aGVyZSBhbiBJTyBwb3J0IHdyaXRlIHdpbGwgZmFpbC4KIAkgKi8KKwlpZiAoYWNwaV9wc3RhdGVfc3RyaWN0KSB7CisJCS8qIFRoZW4gd2UgcmVhZCB0aGUgJ3N0YXR1c19yZWdpc3RlcicgYW5kIGNvbXBhcmUgdGhlIHZhbHVlIAorCQkgKiB3aXRoIHRoZSB0YXJnZXQgc3RhdGUncyAnc3RhdHVzJyB0byBtYWtlIHN1cmUgdGhlIAorCQkgKiB0cmFuc2l0aW9uIHdhcyBzdWNjZXNzZnVsLgorCQkgKiBOb3RlIHRoYXQgd2UnbGwgcG9sbCBmb3IgdXAgdG8gMW1zICgxMDAgY3ljbGVzIG9mIDEwdXMpIAorCQkgKiBiZWZvcmUgZ2l2aW5nIHVwLgorCQkgKi8KIAotCXBvcnQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmFkZHJlc3M7Ci0JYml0X3dpZHRoID0gZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5iaXRfd2lkdGg7CisJCXBvcnQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmFkZHJlc3M7CisJCWJpdF93aWR0aCA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuYml0X3dpZHRoOwogCi0JZHByaW50aygiTG9va2luZyBmb3IgMHglMDh4IGZyb20gcG9ydCAweCUwNHhcbiIsCi0JCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLnN0YXR1cywgcG9ydCk7CisJCWRwcmludGsoIkxvb2tpbmcgZm9yIDB4JTA4eCBmcm9tIHBvcnQgMHglMDR4XG4iLAorCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzLCBwb3J0KTsKIAotCWZvciAoaT0wOyBpPDEwMDsgaSsrKSB7Ci0JCXJldCA9IGFjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydChwb3J0LCBiaXRfd2lkdGgsICZ2YWx1ZSk7Ci0JCWlmIChyZXQpIHsJCi0JCQlkcHJpbnRrKCJJbnZhbGlkIHBvcnQgd2lkdGggMHglMDR4XG4iLCBiaXRfd2lkdGgpOwotCQkJcmV0dmFsID0gcmV0OwotCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJZm9yIChpPTA7IGk8MTAwOyBpKyspIHsKKwkJCXJldCA9IGFjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydChwb3J0LCBiaXRfd2lkdGgsICZ2YWx1ZSk7CisJCQlpZiAocmV0KSB7CQorCQkJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7CisJCQkJcmV0dmFsID0gcmV0OworCQkJCWdvdG8gbWlncmF0ZV9lbmQ7CisJCQl9CisJCQlpZiAodmFsdWUgPT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKIAkJfQotCQlpZiAodmFsdWUgPT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7CisJfSBlbHNlIHsKKwkJaSA9IDA7CisJCXZhbHVlID0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzOwogCX0KIAogCS8qIG5vdGlmeSBjcHVmcmVxICovCiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKIAotCWlmICh2YWx1ZSAhPSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMpIHsKKwlpZiAodW5saWtlbHkodmFsdWUgIT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKSkgewogCQl1bnNpZ25lZCBpbnQgdG1wID0gY3B1ZnJlcV9mcmVxcy5uZXc7CiAJCWNwdWZyZXFfZnJlcXMubmV3ID0gY3B1ZnJlcV9mcmVxcy5vbGQ7CiAJCWNwdWZyZXFfZnJlcXMub2xkID0gdG1wOwpAQCAtNTM3LDYgKzU1MCw4IEBACiAJcmV0dXJuOwogfQogCittb2R1bGVfcGFyYW0oYWNwaV9wc3RhdGVfc3RyaWN0LCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWNwaV9wc3RhdGVfc3RyaWN0LCAidmFsdWUgMCBvciBub24temVyby4gbm9uLXplcm8gLT4gc3RyaWN0IEFDUEkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIGZyZXF1ZW5jeSBjaGFuZ2VzLiIpOwogCiBsYXRlX2luaXRjYWxsKGFjcGlfY3B1ZnJlcV9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfY3B1ZnJlcV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCBiZjAyYjUwMi4uOGVmMzg1NCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpAQCAtNDY3LDExICs0NjcsMTEgQEAKIAl9CiAKIAlpZiAodnJtcmV2PT0wKSB7Ci0JCWRwcmludGsgKCJWUk0gOC41IFxuIik7CisJCWRwcmludGsgKCJWUk0gOC41XG4iKTsKIAkJbWVtY3B5ICh2b2x0YWdlX3RhYmxlLCB2cm04NXNjYWxlcywgc2l6ZW9mKHZvbHRhZ2VfdGFibGUpKTsKIAkJbnVtdnNjYWxlcyA9ICh2b2x0YWdlX3RhYmxlW21heHZpZF0tdm9sdGFnZV90YWJsZVttaW52aWRdKS8yNTsKIAl9IGVsc2UgewotCQlkcHJpbnRrICgiTW9iaWxlIFZSTSBcbiIpOworCQlkcHJpbnRrICgiTW9iaWxlIFZSTVxuIik7CiAJCW1lbWNweSAodm9sdGFnZV90YWJsZSwgbW9iaWxldnJtc2NhbGVzLCBzaXplb2Yodm9sdGFnZV90YWJsZSkpOwogCQludW12c2NhbGVzID0gKHZvbHRhZ2VfdGFibGVbbWF4dmlkXS12b2x0YWdlX3RhYmxlW21pbnZpZF0pLzU7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggMzI3YTU1ZC4uYzM5N2I2MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAogCWlmIChtb2RlbC0+b3BfcG9pbnRzID09IE5VTEwpIHsKIAkJLyogTWF0Y2hlZCBhIG5vbi1tYXRjaCAqLwotCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5vIHRhYmxlIHN1cHBvcnQgZm9yIENQVSBtb2RlbCBcIiVzXCI6IFxuIiwKKwkJZHByaW50ayhLRVJOX0lORk8gUEZYICJubyB0YWJsZSBzdXBwb3J0IGZvciBDUFUgbW9kZWwgXCIlc1wiXG4iLAogCQkgICAgICAgY3B1LT54ODZfbW9kZWxfaWQpOwogI2lmbmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCiAJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAidHJ5IGNvbXBpbGluZyB3aXRoIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkgZW5hYmxlZFxuIik7CkBAIC00MDIsNyArNDAyLDcgQEAKIAogCWZvciAoaT0wOyBpPHAuc3RhdGVfY291bnQ7IGkrKykgewogCQlpZiAocC5zdGF0ZXNbaV0uY29udHJvbCAhPSBwLnN0YXRlc1tpXS5zdGF0dXMpIHsKLQkJCWRwcmludGsoIkRpZmZlcmVudCBjb250cm9sICgleCkgYW5kIHN0YXR1cyB2YWx1ZXMgKCV4KVxuIiwKKwkJCWRwcmludGsoIkRpZmZlcmVudCBjb250cm9sICglbGx1KSBhbmQgc3RhdHVzIHZhbHVlcyAoJWxsdSlcbiIsCiAJCQkJcC5zdGF0ZXNbaV0uY29udHJvbCwgcC5zdGF0ZXNbaV0uc3RhdHVzKTsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl91bnJlZzsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQl9CiAKIAkJaWYgKHAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ID4gcC5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kpIHsKLQkJCWRwcmludGsoIlAldSBoYXMgbGFyZ2VyIGZyZXF1ZW5jeSAoJXUpIHRoYW4gUDAgKCV1KSwgc2tpcHBpbmdcbiIsIGksCisJCQlkcHJpbnRrKCJQJXUgaGFzIGxhcmdlciBmcmVxdWVuY3kgKCVsbHUpIHRoYW4gUDAgKCVsbHUpLCBza2lwcGluZ1xuIiwgaSwKIAkJCQlwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwgcC5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kpOwogCQkJcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPSAwOwogCQkJY29udGludWU7CkBAIC00OTgsMTMgKzQ5OCw2IEBACiAJaWYgKGNwdS0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8ICFjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfRVNUKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTl9JRFM7IGkrKykKLQkJaWYgKGNlbnRyaW5vX3ZlcmlmeV9jcHVfaWQoY3B1LCAmY3B1X2lkc1tpXSkpCi0JCQlicmVhazsKLQotCWlmIChpICE9IE5fSURTKQotCQljZW50cmlub19jcHVbcG9saWN5LT5jcHVdID0gJmNwdV9pZHNbaV07Ci0KIAlpZiAoaXNfY29uc3RfbG9vcHNfY3B1KHBvbGljeS0+Y3B1KSkgewogCQljZW50cmlub19kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKIAl9CkBAIC01MTMsNiArNTA2LDEzIEBACiAJCWlmIChwb2xpY3ktPmNwdSAhPSAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKKwkJZm9yIChpID0gMDsgaSA8IE5fSURTOyBpKyspCisJCQlpZiAoY2VudHJpbm9fdmVyaWZ5X2NwdV9pZChjcHUsICZjcHVfaWRzW2ldKSkKKwkJCQlicmVhazsKKworCQlpZiAoaSAhPSBOX0lEUykKKwkJCWNlbnRyaW5vX2NwdVtwb2xpY3ktPmNwdV0gPSAmY3B1X2lkc1tpXTsKKwogCQlpZiAoIWNlbnRyaW5vX2NwdVtwb2xpY3ktPmNwdV0pIHsKIAkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiZm91bmQgdW5zdXBwb3J0ZWQgQ1BVIHdpdGggIgogCQkJIkVuaGFuY2VkIFNwZWVkU3RlcDogc2VuZCAvcHJvYy9jcHVpbmZvIHRvICIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKaW5kZXggYjI1ZmI2Yi4uMjcxOGZiNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAl1MzIgZnVuY3Rpb24gPSBHRVRfU1BFRURTVEVQX0ZSRVFTOwogCiAJaWYgKCEoaXN0X2luZm8uZXZlbnQgJiAweEZGRkYpKSB7Ci0JCWRwcmludGsoImJ1ZyAjMTQyMiAtLSBjYW4ndCByZWFkIGZyZXFzIGZyb20gQklPU1xuIiwgcmVzdWx0KTsKKwkJZHByaW50aygiYnVnICMxNDIyIC0tIGNhbid0IHJlYWQgZnJlcXMgZnJvbSBCSU9TXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKaW5kZXggYTNjZGY4OS4uNTg1MTZlMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYwpAQCAtNiwzMiArNiwyOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogCi1zdHJ1Y3QgZG1pX2hlYWRlciB7Ci0JdTggdHlwZTsKLQl1OCBsZW5ndGg7Ci0JdTE2IGhhbmRsZTsKLX07Ci0KLSN1bmRlZiBETUlfREVCVUcKLQotI2lmZGVmIERNSV9ERUJVRwotI2RlZmluZSBkbWlfcHJpbnRrKHgpIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkbWlfcHJpbnRrKHgpCi0jZW5kaWYKLQogc3RhdGljIGNoYXIgKiBfX2luaXQgZG1pX3N0cmluZyhzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHU4IHMpCiB7CiAJdTggKmJwID0gKCh1OCAqKSBkbSkgKyBkbS0+bGVuZ3RoOworCWNoYXIgKnN0ciA9ICIiOwogCi0JaWYgKCFzKQotCQlyZXR1cm4gIiI7Ci0Jcy0tOwotCXdoaWxlIChzID4gMCAmJiAqYnApIHsKLQkJYnAgKz0gc3RybGVuKGJwKSArIDE7CisJaWYgKHMpIHsKIAkJcy0tOwotCX0KLQlyZXR1cm4gYnA7CisJCXdoaWxlIChzID4gMCAmJiAqYnApIHsKKwkJCWJwICs9IHN0cmxlbihicCkgKyAxOworCQkJcy0tOworCQl9CisKKwkJaWYgKCpicCAhPSAwKSB7CisJCQlzdHIgPSBhbGxvY19ib290bWVtKHN0cmxlbihicCkgKyAxKTsKKwkJCWlmIChzdHIgIT0gTlVMTCkKKwkJCQlzdHJjcHkoc3RyLCBicCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc3RyaW5nOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCX0KKyAJfQorCisJcmV0dXJuIHN0cjsKIH0KIAogLyoKQEAgLTg0LDcgKzgwLDExMSBAQAogCXJldHVybiBzdW0gPT0gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZG1pX2l0ZXJhdGUodm9pZCAoKmRlY29kZSkoc3RydWN0IGRtaV9oZWFkZXIgKikpCitzdGF0aWMgY2hhciAqZG1pX2lkZW50W0RNSV9TVFJJTkdfTUFYXTsKK3N0YXRpYyBMSVNUX0hFQUQoZG1pX2RldmljZXMpOworCisvKgorICoJU2F2ZSBhIERNSSBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGRtaV9zYXZlX2lkZW50KHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgaW50IHNsb3QsIGludCBzdHJpbmcpCit7CisJY2hhciAqcCwgKmQgPSAoY2hhciopIGRtOworCisJaWYgKGRtaV9pZGVudFtzbG90XSkKKwkJcmV0dXJuOworCisJcCA9IGRtaV9zdHJpbmcoZG0sIGRbc3RyaW5nXSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZG1pX2lkZW50W3Nsb3RdID0gcDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRtaV9zYXZlX2RldmljZXMoc3RydWN0IGRtaV9oZWFkZXIgKmRtKQoreworCWludCBpLCBjb3VudCA9IChkbS0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBkbWlfaGVhZGVyKSkgLyAyOworCXN0cnVjdCBkbWlfZGV2aWNlICpkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQljaGFyICpkID0gKChjaGFyICopIGRtKSArIChpICogMik7CisKKwkJLyogU2tpcCBkaXNhYmxlZCBkZXZpY2UgKi8KKwkJaWYgKCgqZCAmIDB4ODApID09IDApCisJCQljb250aW51ZTsKKworCQlkZXYgPSBhbGxvY19ib290bWVtKHNpemVvZigqZGV2KSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRtaV9zYXZlX2RldmljZXM6IG91dCBvZiBtZW1vcnkuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2LT50eXBlID0gKmQrKyAmIDB4N2Y7CisJCWRldi0+bmFtZSA9IGRtaV9zdHJpbmcoZG0sICpkKTsKKwkJZGV2LT5kZXZpY2VfZGF0YSA9IE5VTEw7CisKKwkJbGlzdF9hZGQoJmRldi0+bGlzdCwgJmRtaV9kZXZpY2VzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbWlfc2F2ZV9pcG1pX2RldmljZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisJc3RydWN0IGRtaV9kZXZpY2UgKmRldjsKKwl2b2lkICogZGF0YTsKKworCWRhdGEgPSBhbGxvY19ib290bWVtKGRtLT5sZW5ndGgpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9pcG1pX2RldmljZTogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KGRhdGEsIGRtLCBkbS0+bGVuZ3RoKTsKKworCWRldiA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKCpkZXYpKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImRtaV9zYXZlX2lwbWlfZGV2aWNlOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPnR5cGUgPSBETUlfREVWX1RZUEVfSVBNSTsKKwlkZXYtPm5hbWUgPSAiSVBNSSBjb250cm9sbGVyIjsKKwlkZXYtPmRldmljZV9kYXRhID0gZGF0YTsKKworCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZkbWlfZGV2aWNlcyk7Cit9CisKKy8qCisgKglQcm9jZXNzIGEgRE1JIHRhYmxlIGVudHJ5LiBSaWdodCBub3cgYWxsIHdlIGNhcmUgYWJvdXQgYXJlIHRoZSBCSU9TCisgKglhbmQgbWFjaGluZSBlbnRyaWVzLiBGb3IgMi41IHdlIHNob3VsZCBwdWxsIHRoZSBzbWJ1cyBjb250cm9sbGVyIGluZm8KKyAqCW91dCBvZiBoZXJlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisJc3dpdGNoKGRtLT50eXBlKSB7CisJY2FzZSAwOgkJLyogQklPUyBJbmZvcm1hdGlvbiAqLworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfVkVORE9SLCA0KTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfREFURSwgOCk7CisJCWJyZWFrOworCWNhc2UgMToJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAqLworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1NZU19WRU5ET1IsIDQpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfTkFNRSwgNSk7CisJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfUFJPRFVDVF9WRVJTSU9OLCA2KTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX1NFUklBTCwgNyk7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIEJhc2UgQm9hcmQgSW5mb3JtYXRpb24gKi8KKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRU5ET1IsIDQpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX1ZFUlNJT04sIDYpOworCQlicmVhazsKKwljYXNlIDEwOgkvKiBPbmJvYXJkIERldmljZXMgSW5mb3JtYXRpb24gKi8KKwkJZG1pX3NhdmVfZGV2aWNlcyhkbSk7CisJCWJyZWFrOworCWNhc2UgMzg6CS8qIElQTUkgRGV2aWNlIEluZm9ybWF0aW9uICovCisJCWRtaV9zYXZlX2lwbWlfZGV2aWNlKGRtKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGRtaV9zY2FuX21hY2hpbmUodm9pZCkKIHsKIAl1OCBidWZbMTVdOwogCWNoYXIgX19pb21lbSAqcCwgKnE7CkBAIC05Niw3ICsxOTYsNyBAQAogCSAqLwogCXAgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOwogCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAtMTsKKwkJZ290byBvdXQ7CiAKIAlmb3IgKHEgPSBwOyBxIDwgcCArIDB4MTAwMDA7IHEgKz0gMTYpIHsKIAkJbWVtY3B5X2Zyb21pbyhidWYsIHEsIDE1KTsKQEAgLTExNiw4MiArMjE2LDEyIEBACiAJCQllbHNlCiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHByZXNlbnQuXG4iKTsKIAotCQkJZG1pX3ByaW50aygoS0VSTl9JTkZPICIlZCBzdHJ1Y3R1cmVzIG9jY3VweWluZyAlZCBieXRlcy5cbiIsCi0JCQkJbnVtLCBsZW4pKTsKLQkJCWRtaV9wcmludGsoKEtFUk5fSU5GTyAiRE1JIHRhYmxlIGF0IDB4JTA4WC5cbiIsIGJhc2UpKTsKLQotCQkJaWYgKGRtaV90YWJsZShiYXNlLGxlbiwgbnVtLCBkZWNvZGUpID09IDApCi0JCQkJcmV0dXJuIDA7CisJCQlpZiAoZG1pX3RhYmxlKGJhc2UsbGVuLCBudW0sIGRtaV9kZWNvZGUpID09IDApCisJCQkJcmV0dXJuOwogCQl9CiAJfQotCXJldHVybiAtMTsKLX0KIAotc3RhdGljIGNoYXIgKmRtaV9pZGVudFtETUlfU1RSSU5HX01BWF07Ci0KLS8qCi0gKglTYXZlIGEgRE1JIHN0cmluZwotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZG1pX3NhdmVfaWRlbnQoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCBpbnQgc2xvdCwgaW50IHN0cmluZykKLXsKLQljaGFyICpkID0gKGNoYXIqKWRtOwotCWNoYXIgKnAgPSBkbWlfc3RyaW5nKGRtLCBkW3N0cmluZ10pOwotCi0JaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAwKQotCQlyZXR1cm47Ci0JaWYgKGRtaV9pZGVudFtzbG90XSkKLQkJcmV0dXJuOwotCi0JZG1pX2lkZW50W3Nsb3RdID0gYWxsb2NfYm9vdG1lbShzdHJsZW4ocCkgKyAxKTsKLQlpZihkbWlfaWRlbnRbc2xvdF0pCi0JCXN0cmNweShkbWlfaWRlbnRbc2xvdF0sIHApOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9pZGVudDogb3V0IG9mIG1lbW9yeS5cbiIpOwotfQotCi0vKgotICoJUHJvY2VzcyBhIERNSSB0YWJsZSBlbnRyeS4gUmlnaHQgbm93IGFsbCB3ZSBjYXJlIGFib3V0IGFyZSB0aGUgQklPUwotICoJYW5kIG1hY2hpbmUgZW50cmllcy4gRm9yIDIuNSB3ZSBzaG91bGQgcHVsbCB0aGUgc21idXMgY29udHJvbGxlciBpbmZvCi0gKglvdXQgb2YgaGVyZS4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGRtaV9kZWNvZGUoc3RydWN0IGRtaV9oZWFkZXIgKmRtKQotewotCXU4ICpkYXRhIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSA9ICh1OCAqKWRtOwotCQotCXN3aXRjaChkbS0+dHlwZSkgewotCWNhc2UgIDA6Ci0JCWRtaV9wcmludGsoKCJCSU9TIFZlbmRvcjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQklPU19WRU5ET1IsIDQpOwotCQlkbWlfcHJpbnRrKCgiQklPUyBWZXJzaW9uOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs1XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOwotCQlkbWlfcHJpbnRrKCgiQklPUyBSZWxlYXNlOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs4XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX0RBVEUsIDgpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWRtaV9wcmludGsoKCJTeXN0ZW0gVmVuZG9yOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9TWVNfVkVORE9SLCA0KTsKLQkJZG1pX3ByaW50aygoIlByb2R1Y3QgTmFtZTogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNV0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfUFJPRFVDVF9OQU1FLCA1KTsKLQkJZG1pX3ByaW50aygoIlZlcnNpb246ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzZdKSkpOwotCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfVkVSU0lPTiwgNik7Ci0JCWRtaV9wcmludGsoKCJTZXJpYWwgTnVtYmVyOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs3XSkpKTsKLQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX1NFUklBTCwgNyk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZG1pX3ByaW50aygoIkJvYXJkIFZlbmRvcjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQk9BUkRfVkVORE9SLCA0KTsKLQkJZG1pX3ByaW50aygoIkJvYXJkIE5hbWU6ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOwotCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOwotCQlkbWlfcHJpbnRrKCgiQm9hcmQgVmVyc2lvbjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7Ci0JCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQk9BUkRfVkVSU0lPTiwgNik7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBfX2luaXQgZG1pX3NjYW5fbWFjaGluZSh2b2lkKQotewotCWlmIChkbWlfaXRlcmF0ZShkbWlfZGVjb2RlKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIG5vdCBwcmVzZW50LlxuIik7CitvdXQ6CXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudC5cbiIpOwogfQogCiAKQEAgLTIxOCw5ICsyNDgsOSBAQAogCQkJLyogTm8gbWF0Y2ggKi8KIAkJCWdvdG8gZmFpbDsKIAkJfQorCQljb3VudCsrOwogCQlpZiAoZC0+Y2FsbGJhY2sgJiYgZC0+Y2FsbGJhY2soZCkpCiAJCQlicmVhazsKLQkJY291bnQrKzsKIGZhaWw6CQlkKys7CiAJfQogCkBAIC0yNDAsMyArMjcwLDMyIEBACiAJcmV0dXJuIGRtaV9pZGVudFtmaWVsZF07CiB9CiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOworCisvKioKKyAqCWRtaV9maW5kX2RldmljZSAtIGZpbmQgb25ib2FyZCBkZXZpY2UgYnkgdHlwZS9uYW1lCisgKglAdHlwZTogZGV2aWNlIHR5cGUgb3IgJURNSV9ERVZfVFlQRV9BTlkgdG8gbWF0Y2ggYWxsIGRldmljZSB0eXBlcworICoJQGRlc2M6IGRldmljZSBuYW1lIHN0cmluZyBvciAlTlVMTCB0byBtYXRjaCBhbGwKKyAqCUBmcm9tOiBwcmV2aW91cyBkZXZpY2UgZm91bmQgaW4gc2VhcmNoLCBvciAlTlVMTCBmb3IgbmV3IHNlYXJjaC4KKyAqCisgKglJdGVyYXRlcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGtub3duIG9uYm9hcmQgZGV2aWNlcy4gSWYgYSBkZXZpY2UgaXMKKyAqCWZvdW5kIHdpdGggYSBtYXRjaGluZyBAdmVuZG9yIGFuZCBAZGV2aWNlLCBhIHBvaW50ZXIgdG8gaXRzIGRldmljZQorICoJc3RydWN0dXJlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqCUEgbmV3IHNlYXJjaCBpcyBpbml0aWF0ZWQgYnkgcGFzc2luZyAlTlVMTCB0byB0aGUgQGZyb20gYXJndW1lbnQuCisgKglJZiBAZnJvbSBpcyBub3QgJU5VTEwsIHNlYXJjaGVzIGNvbnRpbnVlIGZyb20gbmV4dCBkZXZpY2UuCisgKi8KK3N0cnVjdCBkbWlfZGV2aWNlICogZG1pX2ZpbmRfZGV2aWNlKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICBzdHJ1Y3QgZG1pX2RldmljZSAqZnJvbSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkLCAqaGVhZCA9IGZyb20gPyAmZnJvbS0+bGlzdCA6ICZkbWlfZGV2aWNlczsKKworCWZvcihkID0gaGVhZC0+bmV4dDsgZCAhPSAmZG1pX2RldmljZXM7IGQgPSBkLT5uZXh0KSB7CisJCXN0cnVjdCBkbWlfZGV2aWNlICpkZXYgPSBsaXN0X2VudHJ5KGQsIHN0cnVjdCBkbWlfZGV2aWNlLCBsaXN0KTsKKworCQlpZiAoKCh0eXBlID09IERNSV9ERVZfVFlQRV9BTlkpIHx8IChkZXYtPnR5cGUgPT0gdHlwZSkpICYmCisJCSAgICAoKG5hbWUgPT0gTlVMTCkgfHwgKHN0cmNtcChkZXYtPm5hbWUsIG5hbWUpID09IDApKSkKKwkJCXJldHVybiBkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRtaV9maW5kX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKaW5kZXggYWJiOTA5Ny4uM2FhZDAzOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwpAQCAtNTA3LDcgKzUwNyw3IEBACiAJcHVzaGwgJF9fS0VSTkVMX0NTOwkJCVwKIAlwdXNobCAkc3lzZW50ZXJfcGFzdF9lc3AKIAotRU5UUlkoZGVidWcpCitLUFJPQkVfRU5UUlkoZGVidWcpCiAJY21wbCAkc3lzZW50ZXJfZW50cnksKCVlc3ApCiAJam5lIGRlYnVnX3N0YWNrX2NvcnJlY3QKIAlGSVhfU1RBQ0soMTIsIGRlYnVnX3N0YWNrX2NvcnJlY3QsIGRlYnVnX2VzcF9maXhfaW5zbikKQEAgLTUxOCw3ICs1MTgsNyBAQAogCW1vdmwgJWVzcCwlZWF4CQkJIyBwdF9yZWdzIHBvaW50ZXIKIAljYWxsIGRvX2RlYnVnCiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgotCisJLnByZXZpb3VzIC50ZXh0CiAvKgogICogTk1JIGlzIGRvdWJseSBuYXN0eS4gSXQgY2FuIGhhcHBlbiBfd2hpbGVfIHdlJ3JlIGhhbmRsaW5nCiAgKiBhIGRlYnVnIGZhdWx0LCBhbmQgdGhlIGRlYnVnIGZhdWx0IGhhc24ndCB5ZXQgYmVlbiBhYmxlIHRvCkBAIC01OTEsMTMgKzU5MSwxNCBAQAogCS5sb25nIDFiLGlyZXRfZXhjCiAucHJldmlvdXMKIAotRU5UUlkoaW50MykKK0tQUk9CRV9FTlRSWShpbnQzKQogCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAogCVNBVkVfQUxMCiAJeG9ybCAlZWR4LCVlZHgJCSMgemVybyBlcnJvciBjb2RlCiAJbW92bCAlZXNwLCVlYXgJCSMgcHRfcmVncyBwb2ludGVyCiAJY2FsbCBkb19pbnQzCiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCS5wcmV2aW91cyAudGV4dAogCiBFTlRSWShvdmVyZmxvdykKIAlwdXNobCAkMApAQCAtNjMxLDE3ICs2MzIsMTkgQEAKIAlwdXNobCAkZG9fc3RhY2tfc2VnbWVudAogCWptcCBlcnJvcl9jb2RlCiAKLUVOVFJZKGdlbmVyYWxfcHJvdGVjdGlvbikKK0tQUk9CRV9FTlRSWShnZW5lcmFsX3Byb3RlY3Rpb24pCiAJcHVzaGwgJGRvX2dlbmVyYWxfcHJvdGVjdGlvbgogCWptcCBlcnJvcl9jb2RlCisJLnByZXZpb3VzIC50ZXh0CiAKIEVOVFJZKGFsaWdubWVudF9jaGVjaykKIAlwdXNobCAkZG9fYWxpZ25tZW50X2NoZWNrCiAJam1wIGVycm9yX2NvZGUKIAotRU5UUlkocGFnZV9mYXVsdCkKK0tQUk9CRV9FTlRSWShwYWdlX2ZhdWx0KQogCXB1c2hsICRkb19wYWdlX2ZhdWx0CiAJam1wIGVycm9yX2NvZGUKKwkucHJldmlvdXMgLnRleHQKIAogI2lmZGVmIENPTkZJR19YODZfTUNFCiBFTlRSWShtYWNoaW5lX2NoZWNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwppbmRleCAwNDgwY2E5Li5lNDM3ZmIzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDY1NzhmNDAuLjM1ZDNjZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CkBAIC03Nyw3ICs3OCw3IEBACiAJaW50IGFwaWMsIHBpbiwgbmV4dDsKIH0gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CiAKLWludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OworaW50IHZlY3Rvcl9pcnFbTlJfVkVDVE9SU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX1ZFQ1RPUlMgLSAxXSA9IC0xfTsKICNpZmRlZiBDT05GSUdfUENJX01TSQogI2RlZmluZSB2ZWN0b3JfdG9faXJxKHZlY3RvcikgCVwKIAkocGxhdGZvcm1fbGVnYWN5X2lycSh2ZWN0b3IpID8gdmVjdG9yIDogdmVjdG9yX2lycVt2ZWN0b3JdKQpAQCAtMjIyLDEzICsyMjMsMjEgQEAKIAkJCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgY3B1bWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwaW47CiAJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CiAJdW5zaWduZWQgaW50IGFwaWNpZF92YWx1ZTsKKwljcHVtYXNrX3QgdG1wOwogCQorCWNwdXNfYW5kKHRtcCwgY3B1bWFzaywgY3B1X29ubGluZV9tYXApOworCWlmIChjcHVzX2VtcHR5KHRtcCkpCisJCXRtcCA9IFRBUkdFVF9DUFVTOworCisJY3B1c19hbmQoY3B1bWFzaywgdG1wLCBDUFVfTUFTS19BTEwpOworCiAJYXBpY2lkX3ZhbHVlID0gY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2spOwogCS8qIFByZXBhcmUgdG8gZG8gdGhlIGlvX2FwaWNfd3JpdGUgKi8KIAlhcGljaWRfdmFsdWUgPSBhcGljaWRfdmFsdWUgPDwgMjQ7CkBAIC0yNDIsNiArMjUxLDcgQEAKIAkJCWJyZWFrOwogCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OwogCX0KKwlzZXRfaXJxX2luZm8oaXJxLCBjcHVtYXNrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNTksNyArMjY5LDYgQEAKICMgIGRlZmluZSBEcHJpbnRrKHguLi4pIAogIyBlbmRpZgogCi1jcHVtYXNrX3QgX19jYWNoZWxpbmVfYWxpZ25lZCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbTlJfSVJRU107CiAKICNkZWZpbmUgSVJRQkFMQU5DRV9DSEVDS19BUkNIIC05OTkKIHN0YXRpYyBpbnQgaXJxYmFsYW5jZV9kaXNhYmxlZCA9IElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSDsKQEAgLTMyOCwxMiArMzM3LDcgQEAKIAljcHVzX2FuZChhbGxvd2VkX21hc2ssIGNwdV9vbmxpbmVfbWFwLCBpcnFfYWZmaW5pdHlbaXJxXSk7CiAJbmV3X2NwdSA9IG1vdmUoY3B1LCBhbGxvd2VkX21hc2ssIG5vdywgMSk7CiAJaWYgKGNwdSAhPSBuZXdfY3B1KSB7Ci0JCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQlwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSA9IGNwdW1hc2tfb2ZfY3B1KG5ld19jcHUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJCXNldF9wZW5kaW5nX2lycShpcnEsIGNwdW1hc2tfb2ZfY3B1KG5ld19jcHUpKTsKIAl9CiB9CiAKQEAgLTUyOCwxNiArNTMyLDEyIEBACiAJY3B1c19hbmQodG1wLCB0YXJnZXRfY3B1X21hc2ssIGFsbG93ZWRfbWFzayk7CiAKIAlpZiAoIWNwdXNfZW1wdHkodG1wKSkgewotCQlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBzZWxlY3RlZF9pcnE7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJRHByaW50aygiaXJxID0gJWQgbW92ZWQgdG8gY3B1ID0gJWRcbiIsCiAJCQkJc2VsZWN0ZWRfaXJxLCBtaW5fbG9hZGVkKTsKIAkJLyogbWFyayBmb3IgY2hhbmdlIGRlc3RpbmF0aW9uICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JCXBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tzZWxlY3RlZF9pcnFdID0KLQkJCQkJY3B1bWFza19vZl9jcHUobWluX2xvYWRlZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJc2V0X3BlbmRpbmdfaXJxKHNlbGVjdGVkX2lycSwgY3B1bWFza19vZl9jcHUobWluX2xvYWRlZCkpOworCiAJCS8qIFNpbmNlIHdlIG1hZGUgYSBjaGFuZ2UsIGNvbWUgYmFjayBzb29uZXIgdG8gCiAJCSAqIGNoZWNrIGZvciBtb3JlIHZhcmlhdGlvbi4KIAkJICovCkBAIC01NjgsMTIgKzU2OCwxMiBAQAogCQogCS8qIHB1c2ggZXZlcnl0aGluZyB0byBDUFUgMCB0byBnaXZlIHVzIGEgc3RhcnRpbmcgcG9pbnQuICAqLwogCWZvciAoaSA9IDAgOyBpIDwgTlJfSVJRUyA7IGkrKykgewotCQlwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaV0gPSBjcHVtYXNrX29mX2NwdSgwKTsKKwkJcGVuZGluZ19pcnFfY3B1bWFza1tpXSA9IGNwdW1hc2tfb2ZfY3B1KDApOworCQlzZXRfcGVuZGluZ19pcnEoaSwgY3B1bWFza19vZl9jcHUoMCkpOwogCX0KIAogCWZvciAoIDsgOyApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZV9yZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVfcmVtYWluaW5nKTsKKwkJdGltZV9yZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZV9yZW1haW5pbmcpOwogCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCiAJCQkJcHJldl9iYWxhbmNlX3RpbWUrYmFsYW5jZWRfaXJxX2ludGVydmFsKSkgewpAQCAtNjQ3LDIwICs2NDcsOSBAQAogCiBfX3NldHVwKCJub2lycWJhbGFuY2UiLCBpcnFiYWxhbmNlX2Rpc2FibGUpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9pcnEoaW50IGlycSkKLXsKLQkvKiBub3RlIC0gd2UgaG9sZCB0aGUgZGVzYy0+bG9jayAqLwotCWlmICh1bmxpa2VseSghY3B1c19lbXB0eShwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSkpKSB7Ci0JCXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0pOwotCQljcHVzX2NsZWFyKHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tpcnFdKTsKLQl9Ci19Ci0KIGxhdGVfaW5pdGNhbGwoYmFsYW5jZWRfaXJxX2luaXQpOwotCi0jZWxzZSAvKiAhQ09ORklHX0lSUUJBTEFOQ0UgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtb3ZlX2lycShpbnQgaXJxKSB7IH0KICNlbmRpZiAvKiBDT05GSUdfSVJRQkFMQU5DRSAqLworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmbmRlZiBDT05GSUdfU01QCiB2b2lkIGZhc3RjYWxsIHNlbmRfSVBJX3NlbGYoaW50IHZlY3RvcikKQEAgLTgyMCw2ICs4MDksNyBAQAogICogd2UgbmVlZCB0byByZXByb2dyYW0gdGhlIGlvcmVkdGJscyB0byBjYXRlciBmb3IgdGhlIGNwdXMgd2hpY2ggaGF2ZSBjb21lIG9ubGluZQogICogc28gbWFzayBpbiBhbGwgY2FzZXMgc2hvdWxkIHNpbXBseSBiZSBUQVJHRVRfQ1BVUwogICovCisjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2Rlc3Qodm9pZCkKIHsKIAlpbnQgcGluLCBpb2FwaWMsIGlycSwgaXJxX2VudHJ5OwpAQCAtODM4LDYgKzgyOCw3IEBACiAKIAl9CiB9CisjZW5kaWYKIAogLyoKICAqIEVJU0EgRWRnZS9MZXZlbCBjb250cm9sIHJlZ2lzdGVyLCBFTENSCkBAIC0xMTI3LDcgKzExMTgsNyBAQAogfQogCiAvKiBpcnFfdmVjdG9ycyBpcyBpbmRleGVkIGJ5IHRoZSBzdW0gb2YgYWxsIFJURXMgaW4gYWxsIEkvTyBBUElDcy4gKi8KLXU4IGlycV92ZWN0b3JbTlJfSVJRX1ZFQ1RPUlNdID0geyBGSVJTVF9ERVZJQ0VfVkVDVE9SICwgMCB9OwordTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gX19yZWFkX21vc3RseSA9IHsgRklSU1RfREVWSUNFX1ZFQ1RPUiAsIDAgfTsKIAogaW50IGFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEpCiB7CkBAIC0xMjQ5LDYgKzEyNDAsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAkJaW9fYXBpY193cml0ZShhcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7CiAJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMCkpOworCQlzZXRfbmF0aXZlX2lycV9pbmZvKGlycSwgVEFSR0VUX0NQVVMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCX0KIAl9CkBAIC0xNjQxLDkgKzE2MzMsOSBAQAogCWNsZWFyX0lPX0FQSUMoKTsKIAogCS8qCi0JICogSWYgdGhlIGk4MjU1OSBpcyByb3V0ZWQgdGhyb3VnaCBhbiBJT0FQSUMKKwkgKiBJZiB0aGUgaTgyNTkgaXMgcm91dGVkIHRocm91Z2ggYW4gSU9BUElDCiAJICogUHV0IHRoYXQgSU9BUElDIGluIHZpcnR1YWwgd2lyZSBtb2RlCi0JICogc28gbGVnYWN5IGludGVycnVwcyBjYW4gYmUgZGVsaXZlcmVkLgorCSAqIHNvIGxlZ2FjeSBpbnRlcnJ1cHRzIGNhbiBiZSBkZWxpdmVyZWQuCiAJICovCiAJcGluID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOwogCWlmIChwaW4gIT0gLTEpIHsKQEAgLTE5NDQsNiArMTkzNiw3IEBACiB7CiAJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKIAorCW1vdmVfaXJxKHZlY3Rvcik7CiAJYWNrX2VkZ2VfaW9hcGljX2lycShpcnEpOwogfQogCkBAIC0xOTU4LDYgKzE5NTEsNyBAQAogewogCWludCBpcnEgPSB2ZWN0b3JfdG9faXJxKHZlY3Rvcik7CiAKKwltb3ZlX2lycSh2ZWN0b3IpOwogCWVuZF9sZXZlbF9pb2FwaWNfaXJxKGlycSk7CiB9CiAKQEAgLTE5NzUsMTQgKzE5NjksMTcgQEAKIAl1bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yLAogCQkJCQljcHVtYXNrX3QgY3B1X21hc2spCiB7CiAJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKIAorCXNldF9uYXRpdmVfaXJxX2luZm8odmVjdG9yLCBjcHVfbWFzayk7CiAJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBjcHVfbWFzayk7CiB9CiAjZW5kaWYKKyNlbmRpZgogCiAvKgogICogTGV2ZWwgYW5kIGVkZ2UgdHJpZ2dlcmVkIElPLUFQSUMgaW50ZXJydXB0cyBuZWVkIGRpZmZlcmVudCBoYW5kbGluZywKQEAgLTE5OTIsNyArMTk4OSw3IEBACiAgKiBlZGdlLXRyaWdnZXJlZCBoYW5kbGVyLCB3aXRob3V0IHJpc2tpbmcgSVJRIHN0b3JtcyBhbmQgb3RoZXIgdWdseQogICogcmFjZXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2VkZ2VfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2VkZ2VfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewogCS50eXBlbmFtZSAJPSAiSU8tQVBJQy1lZGdlIiwKIAkuc3RhcnR1cCAJPSBzdGFydHVwX2VkZ2VfaW9hcGljLAogCS5zaHV0ZG93biAJPSBzaHV0ZG93bl9lZGdlX2lvYXBpYywKQEAgLTIwMDAsMTAgKzE5OTcsMTIgQEAKIAkuZGlzYWJsZSAJPSBkaXNhYmxlX2VkZ2VfaW9hcGljLAogCS5hY2sgCQk9IGFja19lZGdlX2lvYXBpYywKIAkuZW5kIAkJPSBlbmRfZWRnZV9pb2FwaWMsCisjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgCT0gc2V0X2lvYXBpY19hZmZpbml0eSwKKyNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpb2FwaWNfbGV2ZWxfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2xldmVsX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgCT0gIklPLUFQSUMtbGV2ZWwiLAogCS5zdGFydHVwIAk9IHN0YXJ0dXBfbGV2ZWxfaW9hcGljLAogCS5zaHV0ZG93biAJPSBzaHV0ZG93bl9sZXZlbF9pb2FwaWMsCkBAIC0yMDExLDcgKzIwMTAsOSBAQAogCS5kaXNhYmxlIAk9IGRpc2FibGVfbGV2ZWxfaW9hcGljLAogCS5hY2sgCQk9IG1hc2tfYW5kX2Fja19sZXZlbF9pb2FwaWMsCiAJLmVuZCAJCT0gZW5kX2xldmVsX2lvYXBpYywKKyNpZmRlZiBDT05GSUdfU01QCiAJLnNldF9hZmZpbml0eSAJPSBzZXRfaW9hcGljX2FmZmluaXR5LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9JT19BUElDX3RyYXBzKHZvaWQpCkBAIC0yMDc0LDcgKzIwNzUsNyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaSkgeyAvKiBub3RoaW5nICovIH0KIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYXBpY19pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbGFwaWNfaXJxX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgCT0gImxvY2FsLUFQSUMtZWRnZSIsCiAJLnN0YXJ0dXAgCT0gTlVMTCwgLyogc3RhcnR1cF9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLwogCS5zaHV0ZG93biAJPSBOVUxMLCAvKiBzaHV0ZG93bl9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLwpAQCAtMjQyMSw3ICsyNDIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBJT0FQSUMgQ29uZmlndXJhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCiBpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZCAoaW50IGlvYXBpYywgaW50IGFwaWNfaWQpCiB7CkBAIC0yNTY5LDkgKzI1NzAsMTAgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlpb19hcGljX3dyaXRlKGlvYXBpYywgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOwogCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyh1c2VfcGNpX3ZlY3RvcigpID8gZW50cnkudmVjdG9yIDogaXJxLCBUQVJHRVRfQ1BVUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwppbmRleCBhNmQ4YzQ1Li42MzQ1YjQzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwpAQCAtNjIsMzIgKzYyLDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCitpbnQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJbWVtY3B5KHAtPmFpbnNuLmluc24sIHAtPmFkZHIsIE1BWF9JTlNOX1NJWkUgKiBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiAJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyLAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKLXZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IHAtPm9wY29kZTsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsCiAJCQkgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIH0KIAotdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogfQogCkBAIC0xMjcsNyArMTI3LDggQEAKIAkJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpJnAtPmFpbnNuLmluc247CiB9CiAKLXZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgKnNhcmEgPSAodW5zaWduZWQgbG9uZyAqKSZyZWdzLT5lc3A7CiAgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwpAQCAtMTUwLDcgKzE1MSw3IEBACiAgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSBhcyB0cmFwMyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSBhbmQgdGhleQogICogcmVtYWluIGRpc2FibGVkIHRob3JvdWdoIG91dCB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGtwcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBfX2twcm9iZXMga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqcDsKIAlpbnQgcmV0ID0gMDsKQEAgLTE3Niw3ICsxNzcsOCBAQAogCQkgICBEaXNhcm0gdGhlIHByb2JlIHdlIGp1c3QgaGl0LCBhbmQgaWdub3JlIGl0LiAqLwogCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKIAkJaWYgKHApIHsKLQkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MgJiYKKwkJCQkqcC0+YWluc24uaW5zbiA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CiAJCQkJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOwogCQkJCXJlZ3MtPmVmbGFncyB8PSBrcHJvYmVfc2F2ZWRfZWZsYWdzOwogCQkJCXVubG9ja19rcHJvYmVzKCk7CkBAIC0yMjAsNyArMjIyLDEwIEBACiAJCQkgKiBlaXRoZXIgYSBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludAogCQkJICogYXQgdGhpcyBhZGRyZXNzLiAgSW4gZWl0aGVyIGNhc2UsIG5vIGZ1cnRoZXIKIAkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlLgorCQkJICogQmFjayB1cCBvdmVyIHRoZSAobm93IG1pc3NpbmcpIGludDMgYW5kIHJ1bgorCQkJICogdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgogCQkJICovCisJCQlyZWdzLT5laXAgLT0gc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCk7CiAJCQlyZXQgPSAxOwogCQl9CiAJCS8qIE5vdCBvbmUgb2Ygb3VyczogbGV0IGtlcm5lbCBoYW5kbGUgaXQgKi8KQEAgLTI1OSw3ICsyNjQsNyBAQAogLyoKICAqIENhbGxlZCB3aGVuIHdlIGhpdCB0aGUgcHJvYmUgcG9pbnQgYXQga3JldHByb2JlX3RyYW1wb2xpbmUKICAqLwotaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogICAgICAgICBzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSA9IE5VTEw7CiAgICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtMzM4LDcgKzM0Myw3IEBACiAgKiB0aGF0IGlzIGF0b3AgdGhlIHN0YWNrIGlzIHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGUgY29waWVkIGluc3RydWN0aW9uLgogICogV2UgbmVlZCB0byBtYWtlIGl0IHRoZSBhZGRyZXNzIGZvbGxvd2luZyB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nICp0b3MgPSAodW5zaWduZWQgbG9uZyAqKSZyZWdzLT5lc3A7CiAJdW5zaWduZWQgbG9uZyBuZXh0X2VpcCA9IDA7CkBAIC00NDQsOCArNDQ5LDggQEAKIC8qCiAgKiBXcmFwcGVyIHJvdXRpbmUgdG8gZm9yIGhhbmRsaW5nIGV4Y2VwdGlvbnMuCiAgKi8KLWludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSAgICAgdm9pZCAqZGF0YSkKK2ludCBfX2twcm9iZXMga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gKHN0cnVjdCBkaWVfYXJncyAqKWRhdGE7CiAJc3dpdGNoICh2YWwpIHsKQEAgLTQ3Myw3ICs0NzgsNyBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotaW50IHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC00OTUsNyArNTAwLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZCBqcHJvYmVfcmV0dXJuKHZvaWQpCit2b2lkIF9fa3Byb2JlcyBqcHJvYmVfcmV0dXJuKHZvaWQpCiB7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCWFzbSB2b2xhdGlsZSAoIiAgICAgICB4Y2hnbCAgICUlZWJ4LCUlZXNwICAgICBcbiIKQEAgLTUwNiw3ICs1MTEsNyBAQAogCQkgICAgICAoanByb2JlX3NhdmVkX2VzcCk6Im1lbW9yeSIpOwogfQogCi1pbnQgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTggKmFkZHIgPSAodTggKikgKHJlZ3MtPmVpcCAtIDEpOwogCXVuc2lnbmVkIGxvbmcgc3RhY2tfYWRkciA9ICh1bnNpZ25lZCBsb25nKWpwcm9iZV9zYXZlZF9lc3A7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IDVkMGI5YThmLi4xNTk0OWZkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpAQCAtMTIyLDggKzEyMiw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBNUF9wcm9jZXNzb3JfaW5mbyAoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKQogewotIAlpbnQgdmVyLCBhcGljaWQsIGNwdSwgZm91bmRfYnNwID0gMDsKLQlwaHlzaWRfbWFza190IHRtcDsKKyAJaW50IHZlciwgYXBpY2lkOworCXBoeXNpZF9tYXNrX3QgcGh5c19jcHU7CiAgCQogCWlmICghKG0tPm1wY19jcHVmbGFnICYgQ1BVX0VOQUJMRUQpKQogCQlyZXR1cm47CkBAIC0xODEsNyArMTgxLDYgQEAKIAlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgewogCQlEcHJpbnRrKCIgICAgQm9vdHVwIENQVVxuIik7CiAJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPm1wY19hcGljaWQ7Ci0JCWZvdW5kX2JzcCA9IDE7CiAJfQogCiAJaWYgKG51bV9wcm9jZXNzb3JzID49IE5SX0NQVVMpIHsKQEAgLTE5NSwyOSArMTk0LDI2IEBACiAJCQkiIFByb2Nlc3NvciBpZ25vcmVkLlxuIiwgbWF4Y3B1cyk7IAogCQlyZXR1cm47CiAJfQotCW51bV9wcm9jZXNzb3JzKys7CiAJdmVyID0gbS0+bXBjX2FwaWN2ZXI7CiAKIAlpZiAoIU1QX3ZhbGlkX2FwaWNpZChhcGljaWQsIHZlcikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2Vzc29yICMlZCBJTlZBTElELiAoTWF4IElEOiAlZCkuXG4iLAogCQkJbS0+bXBjX2FwaWNpZCwgTUFYX0FQSUNTKTsKLQkJLS1udW1fcHJvY2Vzc29yczsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChmb3VuZF9ic3ApCi0JCWNwdSA9IDA7Ci0JZWxzZQotCQljcHUgPSBudW1fcHJvY2Vzc29ycyAtIDE7Ci0JY3B1X3NldChjcHUsIGNwdV9wb3NzaWJsZV9tYXApOwotCXRtcCA9IGFwaWNpZF90b19jcHVfcHJlc2VudChhcGljaWQpOwotCXBoeXNpZHNfb3IocGh5c19jcHVfcHJlc2VudF9tYXAsIHBoeXNfY3B1X3ByZXNlbnRfbWFwLCB0bXApOwotCQorCWNwdV9zZXQobnVtX3Byb2Nlc3NvcnMsIGNwdV9wb3NzaWJsZV9tYXApOworCW51bV9wcm9jZXNzb3JzKys7CisJcGh5c19jcHUgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQoYXBpY2lkKTsKKwlwaHlzaWRzX29yKHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBwaHlzX2NwdV9wcmVzZW50X21hcCwgcGh5c19jcHUpOworCiAJLyoKIAkgKiBWYWxpZGF0ZSB2ZXJzaW9uCiAJICovCiAJaWYgKHZlciA9PSAweDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQklPUyBidWcsIEFQSUMgdmVyc2lvbiBpcyAwIGZvciBDUFUjJWQhIGZpeGluZyB1cCB0byAweDEwLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsIG0tPm1wY19hcGljaWQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIGJ1ZywgQVBJQyB2ZXJzaW9uIGlzIDAgZm9yIENQVSMlZCEgIgorCQkJCSJmaXhpbmcgdXAgdG8gMHgxMC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLAorCQkJCW0tPm1wY19hcGljaWQpOwogCQl2ZXIgPSAweDEwOwogCX0KIAlhcGljX3ZlcnNpb25bbS0+bXBjX2FwaWNpZF0gPSB2ZXI7CkBAIC02NjgsOCArNjY0LDYgQEAKIAlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZiA9IG1wZl9mb3VuZDsKIAogCS8qCi0JICogQUNQSSBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGVudGlyZSBTTVAgY29uZmlndXJhdGlvbiBvciBqdXN0IHRvIAotCSAqIGVudW1lcmF0ZS9jb25maWd1cmUgcHJvY2Vzc29ycyAoQ09ORklHX0FDUElfQk9PVCkuICBOb3RlIHRoYXQgCiAJICogQUNQSSBzdXBwb3J0cyBib3RoIGxvZ2ljYWwgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSBhbmQgcGh5c2ljYWwgCiAJICogcHJvY2Vzc29ycywgd2hlcmUgTVBTIG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwuCiAJICovCkBAIC04MjUsNyArODE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJLWJhc2VkIE1QIENvbmZpZ3VyYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAogdm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyAoCiAJdTY0CQkJYWRkcmVzcykKQEAgLTg3MSw3ICs4NjUsNyBAQAogCU1QX3Byb2Nlc3Nvcl9pbmZvKCZwcm9jZXNzb3IpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIChkZWZpbmVkKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0JPT1QpKQorI2lmZGVmCUNPTkZJR19YODZfSU9fQVBJQwogCiAjZGVmaW5lIE1QX0lTQV9CVVMJCTAKICNkZWZpbmUgTVBfTUFYX0lPQVBJQ19QSU4JMTI3CkBAIC0xMDg2LDExICsxMDgwLDkgQEAKIAkgKi8KIAlzdGF0aWMgaW50CQlnc2lfdG9faXJxW01BWF9HU0lfTlVNXTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCiAJaWYgKGFjcGlfZmFkdC5zY2lfaW50ID09IGdzaSkKIAkJcmV0dXJuIGdzaTsKLSNlbmRpZgogCiAJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKIAlpZiAoaW9hcGljIDwgMCkgewpAQCAtMTEzMywxMyArMTEyNSwxMSBAQAogCQlpZiAoZ3NpIDwgTUFYX0dTSV9OVU0pIHsKIAkJCWlmIChnc2kgPiAxNSkKIAkJCQlnc2kgPSBwY2lfaXJxKys7Ci0jaWZkZWYgQ09ORklHX0FDUElfQlVTCiAJCQkvKgogCQkJICogRG9uJ3QgYXNzaWduIElSUSB1c2VkIGJ5IEFDUEkgU0NJCiAJCQkgKi8KIAkJCWlmIChnc2kgPT0gYWNwaV9mYWR0LnNjaV9pbnQpCiAJCQkJZ3NpID0gcGNpX2lycSsrOwotI2VuZGlmCiAJCQlnc2lfdG9faXJxW2lycV0gPSBnc2k7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkdTSSAldSBpcyB0b28gaGlnaFxuIiwgZ3NpKTsKQEAgLTExNTMsNSArMTE0Myw1IEBACiAJcmV0dXJuIGdzaTsKIH0KIAotI2VuZGlmIC8qQ09ORklHX1g4Nl9JT19BUElDICYmIChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUiB8fCBDT05GSUdfQUNQSV9CT09UKSovCi0jZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KKyNlbmRpZiAvKiBDT05GSUdfWDg2X0lPX0FQSUMgKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggOGJiZGJkYS4uMDE3ODQ1NyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC00NzgsNiArNDc4LDExIEBACiAJICovCiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKIAkJYWxlcnRfY291bnRlcltpXSA9IDA7CisKKwkvKgorCSAqIFRpY2tsZSB0aGUgc29mdGxvY2t1cCBkZXRlY3RvciB0b286CisJICovCisJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogfQogCiBleHRlcm4gdm9pZCBkaWVfbm1pKHN0cnVjdCBwdF9yZWdzICosIGNvbnN0IGNoYXIgKm1zZyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCAzNDA5ODAyMC4uN2I2MzY4YiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCkBAIC02OTQsMTcgKzY5NCwyMiBAQAogX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSkpCiBpbnQgZG9fc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCkKIHsKLQlpbnQgaXNfc3lzZW11ID0gdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9FTVUpLCByZXQgPSAwOwotCS8qIFdpdGggVElGX1NZU0NBTExfRU1VIHNldCB3ZSB3YW50IHRvIGlnbm9yZSBUSUZfU0lOR0xFU1RFUCBmb3Igc3lzY2FsbAotCSAqIGludGVyY2VwdGlvbi4gKi8KKwlpbnQgaXNfc3lzZW11ID0gdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9FTVUpOworCS8qCisJICogV2l0aCBUSUZfU1lTQ0FMTF9FTVUgc2V0IHdlIHdhbnQgdG8gaWdub3JlIFRJRl9TSU5HTEVTVEVQIGZvciBzeXNjYWxsCisJICogaW50ZXJjZXB0aW9uCisJICovCiAJaW50IGlzX3NpbmdsZXN0ZXAgPSAhaXNfc3lzZW11ICYmIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApOworCWludCByZXQgPSAwOwogCiAJLyogZG8gdGhlIHNlY3VyZSBjb21wdXRpbmcgY2hlY2sgZmlyc3QgKi8KLQlzZWN1cmVfY29tcHV0aW5nKHJlZ3MtPm9yaWdfZWF4KTsKKwlpZiAoIWVudHJ5ZXhpdCkKKwkJc2VjdXJlX2NvbXB1dGluZyhyZWdzLT5vcmlnX2VheCk7CiAKIAlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkpIHsKIAkJaWYgKGVudHJ5ZXhpdCkKLQkJCWF1ZGl0X3N5c2NhbGxfZXhpdChjdXJyZW50LCBBVURJVFNDX1JFU1VMVChyZWdzLT5lYXgpLCByZWdzLT5lYXgpOworCQkJYXVkaXRfc3lzY2FsbF9leGl0KGN1cnJlbnQsIEFVRElUU0NfUkVTVUxUKHJlZ3MtPmVheCksCisJCQkJCQlyZWdzLT5lYXgpOwogCQkvKiBEZWJ1ZyB0cmFwcywgd2hlbiB1c2luZyBQVFJBQ0VfU0lOR0xFU1RFUCwgbXVzdCBiZSBzZW50IG9ubHkKIAkJICogb24gdGhlIHN5c2NhbGwgZXhpdCBwYXRoLiBOb3JtYWxseSwgd2hlbiBUSUZfU1lTQ0FMTF9BVURJVCBpcwogCQkgKiBub3QgdXNlZCwgZW50cnkuUyB3aWxsIGNhbGwgdXMgb25seSBvbiBzeXNjYWxsIGV4aXQsIG5vdApAQCAtNzM4LDcgKzc0Myw3IEBACiAJLyogdGhlIDB4ODAgcHJvdmlkZXMgYSB3YXkgZm9yIHRoZSB0cmFjaW5nIHBhcmVudCB0byBkaXN0aW5ndWlzaAogCSAgIGJldHdlZW4gYSBzeXNjYWxsIHN0b3AgYW5kIFNJR1RSQVAgZGVsaXZlcnkgKi8KIAkvKiBOb3RlIHRoYXQgdGhlIGRlYnVnZ2VyIGNvdWxkIGNoYW5nZSB0aGUgcmVzdWx0IG9mIHRlc3RfdGhyZWFkX2ZsYWchKi8KLQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVAgfCAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFU1lTR09PRCkgPyAweDgwIDogMCkpOworCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKSA/IDB4ODA6MCkpOwogCiAJLyoKIAkgKiB0aGlzIGlzbid0IHRoZSBzYW1lIGFzIGNvbnRpbnVpbmcgd2l0aCBhIHNpZ25hbCwgYnV0IGl0IHdpbGwgZG8KQEAgLTc1MCw3ICs3NTUsNyBAQAogCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOwogCX0KIAlyZXQgPSBpc19zeXNlbXU7Ci0gb3V0Ogorb3V0OgogCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiAhZW50cnlleGl0KQogCQlhdWRpdF9zeXNjYWxsX2VudHJ5KGN1cnJlbnQsIEFVRElUX0FSQ0hfSTM4NiwgcmVncy0+b3JpZ19lYXgsCiAJCQkJICAgIHJlZ3MtPmVieCwgcmVncy0+ZWN4LCByZWdzLT5lZHgsIHJlZ3MtPmVzaSk7CkBAIC03NTksNiArNzY0LDcgQEAKIAogCXJlZ3MtPm9yaWdfZWF4ID0gLTE7IC8qIGZvcmNlIHNraXAgb2Ygc3lzY2FsbCByZXN0YXJ0aW5nICovCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQotCQlhdWRpdF9zeXNjYWxsX2V4aXQoY3VycmVudCwgQVVESVRTQ19SRVNVTFQocmVncy0+ZWF4KSwgcmVncy0+ZWF4KTsKKwkJYXVkaXRfc3lzY2FsbF9leGl0KGN1cnJlbnQsIEFVRElUU0NfUkVTVUxUKHJlZ3MtPmVheCksCisJCQkJcmVncy0+ZWF4KTsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCAyOTRiY2NhLi5mM2Q4MDg0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC04MiwxOSArODIsMTkgQEAKIC8qIGNwdSBkYXRhIGFzIGRldGVjdGVkIGJ5IHRoZSBhc3NlbWJseSBjb2RlIGluIGhlYWQuUyAqLwogc3RydWN0IGNwdWluZm9feDg2IG5ld19jcHVfZGF0YSBfX2luaXRkYXRhID0geyAwLCAwLCAwLCAwLCAtMSwgMSwgMCwgMCwgLTEgfTsKIC8qIGNvbW1vbiBjcHUgZGF0YSBmb3IgYWxsIGNwdXMgKi8KLXN0cnVjdCBjcHVpbmZvX3g4NiBib290X2NwdV9kYXRhID0geyAwLCAwLCAwLCAwLCAtMSwgMSwgMCwgMCwgLTEgfTsKK3N0cnVjdCBjcHVpbmZvX3g4NiBib290X2NwdV9kYXRhIF9fcmVhZF9tb3N0bHkgPSB7IDAsIDAsIDAsIDAsIC0xLCAxLCAwLCAwLCAtMSB9OwogRVhQT1JUX1NZTUJPTChib290X2NwdV9kYXRhKTsKIAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzOwogCi0jaWZkZWYJQ09ORklHX0FDUElfSU5URVJQUkVURVIKKyNpZmRlZglDT05GSUdfQUNQSQogCWludCBhY3BpX2Rpc2FibGVkID0gMDsKICNlbHNlCiAJaW50IGFjcGlfZGlzYWJsZWQgPSAxOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZWQpOwogCi0jaWZkZWYJQ09ORklHX0FDUElfQk9PVAorI2lmZGVmCUNPTkZJR19BQ1BJCiBpbnQgX19pbml0ZGF0YSBhY3BpX2ZvcmNlID0gMDsKIGV4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncwlhY3BpX3NjaV9mbGFnczsKICNlbmRpZgpAQCAtMTM5LDYgKzEzOSw3IEBACiAJdW5zaWduZWQgY2hhciB0YWJsZVswXTsKIH07CiBzdHJ1Y3QgZWRpZF9pbmZvIGVkaWRfaW5mbzsKK0VYUE9SVF9TWU1CT0xfR1BMKGVkaWRfaW5mbyk7CiBzdHJ1Y3QgaXN0X2luZm8gaXN0X2luZm87CiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19YODZfU1BFRURTVEVQX1NNSV9NT0RVTEUpCkBAIC03OTgsNyArNzk5LDcgQEAKIAkJfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkJLyogImFjcGk9b2ZmIiBkaXNhYmxlcyBib3RoIEFDUEkgdGFibGUgcGFyc2luZyBhbmQgaW50ZXJwcmV0ZXIgKi8KIAkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1vZmYiLCA4KSkgewogCQkJZGlzYWJsZV9hY3BpKCk7CkBAIC04NTQsNyArODU1LDcgQEAKIAkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibm9hcGljIiwgNikpCiAJCQlkaXNhYmxlX2lvYXBpY19zZXR1cCgpOwogI2VuZGlmIC8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLwotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JPT1QgKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJCS8qIGVuYWJsZSBsb2NhbCBBUElDICovCkBAIC0xMjk5LDcgKzEzMDAsNyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcmVnaXN0ZXJfbWVtb3J5KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBnYXBzdGFydCwgZ2Fwc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplLCByb3VuZDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdDsKIAlpbnQJICAgICAgaTsKIApAQCAtMTM0NCwxNCArMTM0NSwxNCBAQAogCX0KIAogCS8qCi0JICogU3RhcnQgYWxsb2NhdGluZyBkeW5hbWljIFBDSSBtZW1vcnkgYSBiaXQgaW50byB0aGUgZ2FwLAotCSAqIGFsaWduZWQgdXAgdG8gdGhlIG5lYXJlc3QgbWVnYWJ5dGUuCi0JICoKLQkgKiBRdWVzdGlvbjogc2hvdWxkIHdlIHRyeSB0byBwYWQgaXQgdXAgYSBiaXQgKGRvIHNvbWV0aGluZwotCSAqIGxpa2UgIiArIChnYXBzaXplID4+IDMpIiBpbiB0aGVyZSB0b28/KS4gV2Ugbm93IGhhdmUgdGhlCi0JICogdGVjaG5vbG9neS4KKwkgKiBTZWUgaG93IG11Y2ggd2Ugd2FudCB0byByb3VuZCB1cDogc3RhcnQgb2ZmIHdpdGgKKwkgKiByb3VuZGluZyB0byB0aGUgbmV4dCAxTUIgYXJlYS4KIAkgKi8KLQlwY2lfbWVtX3N0YXJ0ID0gKGdhcHN0YXJ0ICsgMHhmZmZmZikgJiB+MHhmZmZmZjsKKwlyb3VuZCA9IDB4MTAwMDAwOworCXdoaWxlICgoZ2Fwc2l6ZSA+PiA0KSA+IHJvdW5kKQorCQlyb3VuZCArPSByb3VuZDsKKwkvKiBGdW4gd2l0aCB0d28ncyBjb21wbGVtZW50ICovCisJcGNpX21lbV9zdGFydCA9IChnYXBzdGFydCArIHJvdW5kKSAmIC1yb3VuZDsKIAogCXByaW50aygiQWxsb2NhdGluZyBQQ0kgcmVzb3VyY2VzIHN0YXJ0aW5nIGF0ICUwOGx4IChnYXA6ICUwOGx4OiUwOGx4KVxuIiwKIAkJcGNpX21lbV9zdGFydCwgZ2Fwc3RhcnQsIGdhcHNpemUpOwpAQCAtMTU3OSw3ICsxNTgwLDcgQEAKIAlpZiAoZWZpX2VuYWJsZWQpCiAJCWVmaV9tYXBfbWVtbWFwKCk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkvKgogCSAqIFBhcnNlIHRoZSBBQ1BJIHRhYmxlcyBmb3IgcG9zc2libGUgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oIGIvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oCmluZGV4IGQyMWIxNGYuLjBiMjIyMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc2lnZnJhbWUuaAorKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmgKQEAgLTEsNiArMSw2IEBACiBzdHJ1Y3Qgc2lnZnJhbWUKIHsKLQljaGFyICpwcmV0Y29kZTsKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CiAJaW50IHNpZzsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKIAlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKQEAgLTEwLDEwICsxMCwxMCBAQAogCiBzdHJ1Y3QgcnRfc2lnZnJhbWUKIHsKLQljaGFyICpwcmV0Y29kZTsKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CiAJaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnaW5mbyAqcGluZm87Ci0Jdm9pZCAqcHVjOworCXN0cnVjdCBzaWdpbmZvIF9fdXNlciAqcGluZm87CisJdm9pZCBfX3VzZXIgKnB1YzsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKIAlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggNWU0ODkzZC4uYzcwY2QyYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTEzMzAsOCArMTMzMCw3IEBACiAJCQlwcmludGsgKCJDUFUgJWQgaXMgbm93IG9mZmxpbmVcbiIsIGNwdSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CisJCW1zbGVlcCgxMDApOwogCX0KICAJcHJpbnRrKEtFUk5fRVJSICJDUFUgJXUgZGlkbid0IGRpZS4uLlxuIiwgY3B1KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKaW5kZXggNmY3OTRhNy4uMjg4M2E0ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKQEAgLTE5NCwxMCArMTk0LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CkBAIC0yNTIsOCArMjQ5LDcgQEAKICAqIHRpbWVyX2ludGVycnVwdCgpIG5lZWRzIHRvIGtlZXAgdXAgdGhlIHJlYWwtdGltZSBjbG9jaywKICAqIGFzIHdlbGwgYXMgY2FsbCB0aGUgImRvX3RpbWVyKCkiIHJvdXRpbmUgZXZlcnkgY2xvY2t0aWNrCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb190aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb190aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJaWYgKHRpbWVyX2FjaykgewpAQCAtMzA3LDcgKzMwMyw3IEBACiAKIAljdXJfdGltZXItPm1hcmtfb2Zmc2V0KCk7CiAgCi0JZG9fdGltZXJfaW50ZXJydXB0KGlycSwgTlVMTCwgcmVncyk7CisJZG9fdGltZXJfaW50ZXJydXB0KGlycSwgcmVncyk7CiAKIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTMzMyw4ICszMjksNyBAQAogCiBzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSk7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzeW5jX2Ntb3NfdGltZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUl9JTklUSUFMSVpFUihzeW5jX2Ntb3NfY2xvY2ssIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzeW5jX2Ntb3NfdGltZXIsIHN5bmNfY21vc19jbG9jaywgMCwgMCk7CiAKIHN0YXRpYyB2b2lkIHN5bmNfY21vc19jbG9jayh1bnNpZ25lZCBsb25nIGR1bW15KQogewpAQCAtMzQ4LDcgKzM0Myw3IEBACiAJICogVGhpcyBjb2RlIGlzIHJ1biBvbiBhIHRpbWVyLiAgSWYgdGhlIGNsb2NrIGlzIHNldCwgdGhhdCB0aW1lcgogCSAqIG1heSBub3QgZXhwaXJlIGF0IHRoZSBjb3JyZWN0IHRpbWUuICBUaHVzLCB3ZSBhZGp1c3QuLi4KIAkgKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgIT0gMCkKKwlpZiAoIW50cF9zeW5jZWQoKSkKIAkJLyoKIAkJICogTm90IHN5bmNlZCwgZXhpdCwgZG8gbm90IHJlc3RhcnQgYSB0aW1lciAoaWYgb25lIGlzCiAJCSAqIHJ1bm5pbmcsIGxldCBpdCBydW4gb3V0KS4KQEAgLTQyMiw2ICs0MTcsNyBAQAogCQlsYXN0X3RpbWVyLT5yZXN1bWUoKTsKIAljdXJfdGltZXIgPSBsYXN0X3RpbWVyOwogCWxhc3RfdGltZXIgPSBOVUxMOworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfaHBldC5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfaHBldC5jCmluZGV4IDAwMWRlOTcuLmQ5NzNhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKQEAgLTE4LDggKzE4LDggQEAKICNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19yZWFkX21vc3RseSBocGV0X3VzZWNfcXVvdGllbnQ7CS8qIGNvbnZlcnQgaHBldCBjbGtzIHRvIHVzZWMgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRzY19ocGV0X3F1b3RpZW50OwkJLyogY29udmVydCB0c2MgdG8gaHBldCBjbGtzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3VzZWNfcXVvdGllbnQgX19yZWFkX21vc3RseTsJLyogY29udmVydCBocGV0IGNsa3MgdG8gdXNlYyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHNjX2hwZXRfcXVvdGllbnQgX19yZWFkX21vc3RseTsJLyogY29udmVydCB0c2MgdG8gaHBldCBjbGtzICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X2xhc3Q7IAkvKiBocGV0IGNvdW50ZXIgdmFsdWUgYXQgbGFzdCB0aWNrKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfdHNjX2xvdzsJLyogbHNiIDMyIGJpdHMgb2YgVGltZSBTdGFtcCBDb3VudGVyICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19oaWdoOyAJLyogbXNiIDMyIGJpdHMgb2YgVGltZSBTdGFtcCBDb3VudGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKaW5kZXggNTQ2MjliYi4uMDlhNThjYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMzYzLDggKzM2Myw5IEBACiAJCWRpZShzdHIsIHJlZ3MsIGVycik7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsIGludCB2bTg2LAotCQkJICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsIHNpZ2luZm9fdCAqaW5mbykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBkb190cmFwKGludCB0cmFwbnIsIGludCBzaWduciwgY2hhciAqc3RyLCBpbnQgdm04NiwKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlLAorCQkJICAgICAgc2lnaW5mb190ICppbmZvKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKQEAgLTQ2MCw3ICs0NjEsOCBAQAogRE9fRVJST1JfSU5GTygxNywgU0lHQlVTLCAiYWxpZ25tZW50IGNoZWNrIiwgYWxpZ25tZW50X2NoZWNrLCBCVVNfQURSQUxOLCAwKQogRE9fRVJST1JfSU5GTygzMiwgU0lHU0VHViwgImlyZXQgZXhjZXB0aW9uIiwgaXJldF9lcnJvciwgSUxMX0JBRFNUSywgMCkKIAotZmFzdGNhbGwgdm9pZCBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCitmYXN0Y2FsbCB2b2lkIF9fa3Byb2JlcyBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJCQkgICAgICBsb25nIGVycm9yX2NvZGUpCiB7CiAJaW50IGNwdSA9IGdldF9jcHUoKTsKIAlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CkBAIC02NTcsNyArNjU5LDcgQEAKIAogCSsrbm1pX2NvdW50KGNwdSk7CiAKLQlpZiAoIW5taV9jYWxsYmFjayhyZWdzLCBjcHUpKQorCWlmICghcmN1X2RlcmVmZXJlbmNlKG5taV9jYWxsYmFjaykocmVncywgY3B1KSkKIAkJZGVmYXVsdF9kb19ubWkocmVncyk7CiAKIAlubWlfZXhpdCgpOwpAQCAtNjY1LDcgKzY2Nyw3IEBACiAKIHZvaWQgc2V0X25taV9jYWxsYmFjayhubWlfY2FsbGJhY2tfdCBjYWxsYmFjaykKIHsKLQlubWlfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlyY3VfYXNzaWduX3BvaW50ZXIobm1pX2NhbGxiYWNrLCBjYWxsYmFjayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZXRfbm1pX2NhbGxiYWNrKTsKIApAQCAtNjc2LDcgKzY3OCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1bnNldF9ubWlfY2FsbGJhY2spOwogCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKLWZhc3RjYWxsIHZvaWQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQorZmFzdGNhbGwgdm9pZCBfX2twcm9iZXMgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQogewogCWlmIChub3RpZnlfZGllKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIDMsIFNJR1RSQVApCiAJCQk9PSBOT1RJRllfU1RPUCkKQEAgLTcxMCw3ICs3MTIsNyBAQAogICogZmluZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSBURiBiaXQgdGhhdCBjb3VsZCBiZSBzYXZlZCBhd2F5IGV2ZW4KICAqIGJ5IHVzZXIgY29kZSkKICAqLwotZmFzdGNhbGwgdm9pZCBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK2Zhc3RjYWxsIHZvaWQgX19rcHJvYmVzIGRvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQogewogCXVuc2lnbmVkIGludCBjb25kaXRpb247CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDc2MTk3MmYuLjQ3MTAxOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTIyLDYgKzIyLDcgQEAKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKKwlLUFJPQkVTX1RFWFQKIAkqKC5maXh1cCkKIAkqKC5nbnUud2FybmluZykKIAl9ID0gMHg5MDkwCkBAIC0xNDMsMTIgKzE0NCw3IEBACiAJKiguZXhpdGNhbGwuZXhpdCkKIAl9CiAKLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CisgIFNUQUJTX0RFQlVHCisKKyAgRFdBUkZfREVCVUcKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc2lncmV0dXJuLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXNpZ3JldHVybi5TCmluZGV4IDY4YWZhNTAuLmZhZGI1YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc2lncmV0dXJuLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAKIC8qIFhYWApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwubGRzLlMKaW5kZXggYTc5Nzc3MC4uOTg2OTljYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLmxkcy5TCkBAIC0zLDcgKzMsNyBAQAogICogb2JqZWN0IHByZWxpbmtlZCB0byBpdHMgdmlydHVhbCBhZGRyZXNzLCBhbmQgd2l0aCBvbmx5IG9uZSByZWFkLW9ubHkKICAqIHNlZ21lbnQgKHRoYXQgZml0cyBpbiBvbmUgcGFnZSkuICBUaGlzIHNjcmlwdCBjb250cm9scyBpdHMgbGF5b3V0LgogICovCi0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIFNFQ1RJT05TCiB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3RvcG9sb2d5LmMgYi9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3RvcG9sb2d5LmMKaW5kZXggMjMzOTVmZi4uYjY0MzE0MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC90b3BvbG9neS5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYwpAQCAtNzYsNyArNzYsNyBAQAogCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCiAJCWFyY2hfcmVnaXN0ZXJfbm9kZShpKTsKIAotCWZvcl9lYWNoX2NwdShpKQorCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpCiAJCWFyY2hfcmVnaXN0ZXJfY3B1KGkpOwogCXJldHVybiAwOwogfQpAQCAtODcsNyArODcsNyBAQAogewogCWludCBpOwogCi0JZm9yX2VhY2hfY3B1KGkpCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoaSkKIAkJYXJjaF9yZWdpc3Rlcl9jcHUoaSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwppbmRleCAyMDAwYmRjLi5kYzY2NjA1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDBwbGF0LmMKQEAgLTUxLDcgKzUxLDcgQEAKIGludCAJCQltaXBfcG9ydDsKIHVuc2lnbmVkIGxvbmcJCW1pcF9hZGRyLCBob3N0X2FkZHI7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykgJiYgKGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpIHx8IGRlZmluZWQoQ09ORklHX0FDUElfQk9PVCkpCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUEkpCiAKIC8qCiAgKiBHU0kgb3ZlcnJpZGUgZm9yIEVTNzAwMCBwbGF0Zm9ybXMuCkBAIC03Myw3ICs3Myw3IEBACiAJcmV0dXJuIGdzaTsKIH0KIAotI2VuZGlmIC8vIChDT05GSUdfWDg2X0lPX0FQSUMpICYmIChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUiB8fCBDT05GSUdfQUNQSV9CT09UKQorI2VuZGlmCS8qIChDT05GSUdfWDg2X0lPX0FQSUMpICYmIChDT05GSUdfQUNQSSkgKi8KIAogdm9pZCBfX2luaXQKIHNldHVwX3VuaXN5cyAoKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jIGIvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCmluZGV4IDY3MTFjZTMuLjI0NGQ4ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYworKysgYi9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8Ymlvc19lYmRhLmg+CiAKLXN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU107CitzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKG5vZGVfZGF0YSk7CiBib290bWVtX2RhdGFfdCBub2RlMF9iZGF0YTsKIApAQCAtNDksOCArNDksOCBAQAogICogMikgbm9kZV9zdGFydF9wZm4gICAtIHRoZSBzdGFydGluZyBwYWdlIGZyYW1lIG51bWJlciBmb3IgYSBub2RlCiAgKiAzKSBub2RlX2VuZF9wZm4gICAgIC0gdGhlIGVuZGluZyBwYWdlIGZyYW0gbnVtYmVyIGZvciBhIG5vZGUKICAqLwotdW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOwotdW5zaWduZWQgbG9uZyBub2RlX2VuZF9wZm5bTUFYX05VTU5PREVTXTsKK3Vuc2lnbmVkIGxvbmcgbm9kZV9zdGFydF9wZm5bTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OwordW5zaWduZWQgbG9uZyBub2RlX2VuZF9wZm5bTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OwogCiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCkBAIC02Niw3ICs2Niw3IEBACiAgKiAgICAgcGh5c25vZGVfbWFwWzQtN10gPSAxOwogICogICAgIHBoeXNub2RlX21hcFs4LSBdID0gLTE7CiAgKi8KLXM4IHBoeXNub2RlX21hcFtNQVhfRUxFTUVOVFNdID0geyBbMCAuLi4gKE1BWF9FTEVNRU5UUyAtIDEpXSA9IC0xfTsKK3M4IHBoeXNub2RlX21hcFtNQVhfRUxFTUVOVFNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiAoTUFYX0VMRU1FTlRTIC0gMSldID0gLTF9OwogRVhQT1JUX1NZTUJPTChwaHlzbm9kZV9tYXApOwogCiB2b2lkIG1lbW9yeV9wcmVzZW50KGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2ZhdWx0LmMgYi9hcmNoL2kzODYvbW0vZmF1bHQuYwppbmRleCA0MTFiODUwLi45ZWRkNDQ4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vZmF1bHQuYworKysgYi9hcmNoL2kzODYvbW0vZmF1bHQuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4JCS8qIEZvciB1bmJsYW5rX3NjcmVlbigpICovCiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjIzLDcgKzIyNCw4IEBACiAgKgliaXQgMSA9PSAwIG1lYW5zIHJlYWQsIDEgbWVhbnMgd3JpdGUKICAqCWJpdCAyID09IDAgbWVhbnMga2VybmVsLCAxIG1lYW5zIHVzZXItbW9kZQogICovCi1mYXN0Y2FsbCB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK2Zhc3RjYWxsIHZvaWQgX19rcHJvYmVzIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKaW5kZXggOWVkZmMwNS4uMmViYWY3NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2luaXQuYworKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIH0KIAogc3RhdGljIGludCBkaXNhYmxlX254IF9faW5pdGRhdGEgPSAwOwotdTY0IF9fc3VwcG9ydGVkX3B0ZV9tYXNrID0gfl9QQUdFX05YOwordTY0IF9fc3VwcG9ydGVkX3B0ZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSB+X1BBR0VfTlg7CiAKIC8qCiAgKiBub2V4ZWMgPSBvbnxvZmYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9pbml0LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvaW5pdC5jCmluZGV4IGM5MDMzMmQuLjUzNDFkNDggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9pbml0LmMKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL2luaXQuYwpAQCAtMTUsOSArMTUsOSBAQAogICogd2l0aCB0aGUgTk1JIG1vZGUgZHJpdmVyLgogICovCiAgCi1leHRlcm4gaW50IG5taV9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKTsKLWV4dGVybiBpbnQgbm1pX3RpbWVyX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpOwotZXh0ZXJuIHZvaWQgbm1pX2V4aXQodm9pZCk7CitleHRlcm4gaW50IG9wX25taV9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKTsKK2V4dGVybiBpbnQgb3Bfbm1pX3RpbWVyX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpOworZXh0ZXJuIHZvaWQgb3Bfbm1pX2V4aXQodm9pZCk7CiBleHRlcm4gdm9pZCB4ODZfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywgdW5zaWduZWQgaW50IGRlcHRoKTsKIAogCkBAIC0yOCwxMSArMjgsMTEgQEAKIAlyZXQgPSAtRU5PREVWOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JcmV0ID0gbm1pX2luaXQob3BzKTsKKwlyZXQgPSBvcF9ubWlfaW5pdChvcHMpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJaWYgKHJldCA8IDApCi0JCXJldCA9IG5taV90aW1lcl9pbml0KG9wcyk7CisJCXJldCA9IG9wX25taV90aW1lcl9pbml0KG9wcyk7CiAjZW5kaWYKIAlvcHMtPmJhY2t0cmFjZSA9IHg4Nl9iYWNrdHJhY2U7CiAKQEAgLTQzLDYgKzQzLDYgQEAKIHZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0Jbm1pX2V4aXQoKTsKKwlvcF9ubWlfZXhpdCgpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jIGIvYXJjaC9pMzg2L29wcm9maWxlL25taV9pbnQuYwppbmRleCAyNTVlNDcwLi4wNDkzZThiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMKQEAgLTM1NSw3ICszNTUsNyBAQAogLyogaW4gb3JkZXIgdG8gZ2V0IGRyaXZlcmZzIHJpZ2h0ICovCiBzdGF0aWMgaW50IHVzaW5nX25taTsKIAotaW50IF9faW5pdCBubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoraW50IF9faW5pdCBvcF9ubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQogewogCV9fdTggdmVuZG9yID0gYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yOwogCV9fdTggZmFtaWx5ID0gYm9vdF9jcHVfZGF0YS54ODY7CkBAIC00MjAsNyArNDIwLDcgQEAKIH0KIAogCi12b2lkIG5taV9leGl0KHZvaWQpCit2b2lkIG9wX25taV9leGl0KHZvaWQpCiB7CiAJaWYgKHVzaW5nX25taSkKIAkJZXhpdF9kcml2ZXJmcygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKaW5kZXggYzU4ZDBjMS4uYWQ5M2NkZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYworKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCkBAIC00MCw3ICs0MCw3IEBACiB9CiAKIAotaW50IF9faW5pdCBubWlfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcykKK2ludCBfX2luaXQgb3Bfbm1pX3RpbWVyX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpCiB7CiAJZXh0ZXJuIGludCBubWlfYWN0aXZlOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL01ha2VmaWxlIGIvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZQppbmRleCAxYmZmMDNmLi5lYWQ2MTIyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9wY2kvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiBvYmotJChDT05GSUdfUENJX0RJUkVDVCkJKz0gZGlyZWN0Lm8KIAogcGNpLXkJCQkJOj0gZml4dXAubwotcGNpLSQoQ09ORklHX0FDUElfUENJKQkJKz0gYWNwaS5vCitwY2ktJChDT05GSUdfQUNQSSkJCSs9IGFjcGkubwogcGNpLXkJCQkJKz0gbGVnYWN5Lm8gaXJxLm8KIAogcGNpLSQoQ09ORklHX1g4Nl9WSVNXUykJCTo9IHZpc3dzLm8gZml4dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMgYi9hcmNoL2kzODYvcGNpL2kzODYuYwppbmRleCAzY2M0ODA5Li42ZDYzMzg1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2kzODYuYworKysgYi9hcmNoL2kzODYvcGNpL2kzODYuYwpAQCAtMjgzLDkgKzI4Myw5IEBACiAJLyogV3JpdGUtY29tYmluZSBzZXR0aW5nIGlzIGlnbm9yZWQsIGl0IGlzIGNoYW5nZWQgdmlhIHRoZSBtdHJyCiAJICogaW50ZXJmYWNlcyBvbiB0aGlzIHBsYXRmb3JtLgogCSAqLwotCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAotCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCi0JCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKKwkJCSAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgICAgdm1hLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pcnEuYyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKaW5kZXggODYzNDhiNi4uMzI2YTJlZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9pcnEuYworKysgYi9hcmNoL2kzODYvcGNpL2lycS5jCkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogCiB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQorI2lmZGVmIENPTkZJR19BQ1BJCiAJaWYgKCFhY3BpX25vaXJxKQogCQlhY3BpX3BlbmFsaXplX2lzYV9pcnEoaXJxLCBhY3RpdmUpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUyBiL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUwppbmRleCBjNDEwNTI4Li5jODkzYjg5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMKKysrIGIvYXJjaC9pMzg2L3Bvd2VyL3N3c3VzcC5TCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggM2RlY2VkNi4uZWQyNWQ2NiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTYwLDYgKzYwLDcgQEAKIAogY29uZmlnIElBNjRfR0VORVJJQwogCWJvb2wgImdlbmVyaWMiCisJc2VsZWN0IEFDUEkKIAlzZWxlY3QgTlVNQQogCXNlbGVjdCBBQ1BJX05VTUEKIAlzZWxlY3QgVklSVFVBTF9NRU1fTUFQCkBAIC0zMzgsMTEgKzMzOSw2IEBACiAJICBUbyB1c2UgdGhpcyBvcHRpb24sIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSAiL3Byb2MgZmlsZSBzeXN0ZW0KIAkgIHN1cHBvcnQiIChDT05GSUdfUFJPQ19GUykgaXMgZW5hYmxlZCwgdG9vLgogCi1jb25maWcgQUNQSV9ERUFMTE9DQVRFX0lSUQotCWJvb2wKLQlkZXBlbmRzIG9uIElPU0FQSUMgJiYgRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCB5Ci0KIHNvdXJjZSAiZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgpAQCAtMzUxLDM4ICszNDcsMTAgQEAKIAogbWVudSAiUG93ZXIgbWFuYWdlbWVudCBhbmQgQUNQSSIKIAotY29uZmlnIFBNCi0JYm9vbCAiUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IgotCWRlcGVuZHMgb24gIUlBNjRfSFBfU0lNCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgIlBvd2VyIE1hbmFnZW1lbnQiIG1lYW5zIHRoYXQgcGFydHMgb2YgeW91ciBjb21wdXRlciBhcmUgc2h1dAotCSAgb2ZmIG9yIHB1dCBpbnRvIGEgcG93ZXIgY29uc2VydmluZyAic2xlZXAiIG1vZGUgaWYgdGhleSBhcmUgbm90Ci0JICBiZWluZyB1c2VkLiAgVGhlcmUgYXJlIHR3byBjb21wZXRpbmcgc3RhbmRhcmRzIGZvciBkb2luZyB0aGlzOiBBUE0KLQkgIGFuZCBBQ1BJLiAgSWYgeW91IHdhbnQgdG8gdXNlIGVpdGhlciBvbmUsIHNheSBZIGhlcmUgYW5kIHRoZW4gYWxzbwotCSAgdG8gdGhlIHJlcXVpc2l0ZSBzdXBwb3J0IGJlbG93LgotCi0JICBQb3dlciBNYW5hZ2VtZW50IGlzIG1vc3QgaW1wb3J0YW50IGZvciBiYXR0ZXJ5IHBvd2VyZWQgbGFwdG9wCi0JICBjb21wdXRlcnM7IGlmIHlvdSBoYXZlIGEgbGFwdG9wLCBjaGVjayBvdXQgdGhlIExpbnV4IExhcHRvcCBob21lCi0JICBwYWdlIG9uIHRoZSBXV1cgYXQgPGh0dHA6Ly93d3cubGludXgtb24tbGFwdG9wcy5jb20vPiBhbmQgdGhlCi0JICBCYXR0ZXJ5IFBvd2VyZWQgTGludXggbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCi0KLQkgIE5vdGUgdGhhdCwgZXZlbiBpZiB5b3Ugc2F5IE4gaGVyZSwgTGludXggb24gdGhlIHg4NiBhcmNoaXRlY3R1cmUKLQkgIHdpbGwgaXNzdWUgdGhlIGhsdCBpbnN0cnVjdGlvbiBpZiBub3RoaW5nIGlzIHRvIGJlIGRvbmUsIHRoZXJlYnkKLQkgIHNlbmRpbmcgdGhlIHByb2Nlc3NvciB0byBzbGVlcCBhbmQgc2F2aW5nIHBvd2VyLgotCi1jb25maWcgQUNQSQotCWJvb2wKLQlkZXBlbmRzIG9uICFJQTY0X0hQX1NJTQotCWRlZmF1bHQgeQotCi1pZiAhSUE2NF9IUF9TSU0KK3NvdXJjZSAia2VybmVsL3Bvd2VyL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9hY3BpL0tjb25maWciCiAKLWVuZGlmCi0KIGlmIFBNCiAKIHNvdXJjZSAiYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL0tjb25maWciCkBAIC00MzQsNiArNDAyLDExIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19QRU5ESU5HX0lSUQorCWJvb2wKKwlkZXBlbmRzIG9uIEdFTkVSSUNfSEFSRElSUVMgJiYgU01QCisJZGVmYXVsdCB5CisKIHNvdXJjZSAiYXJjaC9pYTY0L2hwL3NpbS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvaWE2NC9vcHJvZmlsZS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L01ha2VmaWxlIGIvYXJjaC9pYTY0L01ha2VmaWxlCmluZGV4IGY5YmQ4OGEuLjdlZDY3OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQvTWFrZWZpbGUKQEAgLTgyLDI1ICs4MiwxOCBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20taWE2NC8ub2Zmc2V0cy5oLnN0YW1wIHZtbGludXguZ3ogYm9vdGxvYWRlcgotCi1NUlBST1BFUl9GSUxFUyArPSBpbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaAotCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaAotCi1hcmNoL2lhNjQva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaDogYXJjaC9pYTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCi1hcmNoL2lhNjQva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtLWlhNjQvLm9mZnNldHMuaC5zdGFtcAorcHJlcGFyZTogIGluY2x1ZGUvYXNtLWlhNjQvLm9mZnNldHMuaC5zdGFtcAogCiBpbmNsdWRlL2FzbS1pYTY0Ly5vZmZzZXRzLmguc3RhbXA6CiAJbWtkaXIgLXAgaW5jbHVkZS9hc20taWE2NAotCVsgLXMgaW5jbHVkZS9hc20taWE2NC9vZmZzZXRzLmggXSBcCi0JIHx8IGVjaG8gIiNkZWZpbmUgSUE2NF9UQVNLX1NJWkUgMCIgPiBpbmNsdWRlL2FzbS1pYTY0L29mZnNldHMuaAorCVsgLXMgaW5jbHVkZS9hc20taWE2NC9hc20tb2Zmc2V0cy5oIF0gXAorCXx8IGVjaG8gIiNkZWZpbmUgSUE2NF9UQVNLX1NJWkUgMCIgPiBpbmNsdWRlL2FzbS1pYTY0L2FzbS1vZmZzZXRzLmgKIAl0b3VjaCAkQAogCisKKworQ0xFQU5fRklMRVMgKz0gdm1saW51eC5neiBib290bG9hZGVyIGluY2x1ZGUvYXNtLWlhNjQvLm9mZnNldHMuaC5zdGFtcAorCiBib290OglsaWIvbGliLmEgdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJEAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKaW5kZXggYjk1ZmNmOC4uM2I2NWNiYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCkBAIC0xMDcsMTggKzEwNywxMiBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLUNPTkZJR19BQ1BJX1ZJREVPPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQogQ09ORklHX0FDUElfVEhFUk1BTD1tCi1DT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCiAjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0JVUz15CiBDT05GSUdfQUNQSV9QT1dFUj15Ci1DT05GSUdfQUNQSV9QQ0k9eQogQ09ORklHX0FDUElfU1lTVEVNPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKaW5kZXggZGNjZjM1Yy4uMDgxMTJhYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCkBAIC0xMTEsNyArMTExLDYgQEAKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKLUNPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xMzAsMTkgKzEyOSwxMiBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogIyBDT05GSUdfQUNQSV9CVVRUT04gaXMgbm90IHNldAotQ09ORklHX0FDUElfVklERU89bQotQ09ORklHX0FDUElfSE9US0VZPW0KICMgQ09ORklHX0FDUElfRkFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDUElfUFJPQ0VTU09SIGlzIG5vdCBzZXQKIENPTkZJR19BQ1BJX05VTUE9eQotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9CVVM9eQogQ09ORklHX0FDUElfUE9XRVI9eQotQ09ORklHX0FDUElfUENJPXkKIENPTkZJR19BQ1BJX1NZU1RFTT15CiAjIENPTkZJR19BQ1BJX0NPTlRBSU5FUiBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCBjODUzY2ZjLi5kNDUyZTE4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC0xMDksNyArMTA5LDYgQEAKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKLUNPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xMjgsMjAgKzEyNywxMyBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLSMgQ09ORklHX0FDUElfVklERU8gaXMgbm90IHNldAotIyBDT05GSUdfQUNQSV9IT1RLRVkgaXMgbm90IHNldAogQ09ORklHX0FDUElfRkFOPW0KIENPTkZJR19BQ1BJX1BST0NFU1NPUj1tCiAjIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKIENPTkZJR19BQ1BJX1RIRVJNQUw9bQotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9CVVM9eQogQ09ORklHX0FDUElfUE9XRVI9eQotQ09ORklHX0FDUElfUENJPXkKIENPTkZJR19BQ1BJX1NZU1RFTT15CiAjIENPTkZJR19BQ1BJX0NPTlRBSU5FUiBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCmluZGV4IDg4ZTg4NjcuLjgwYjBlOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZwpAQCAtMTA5LDcgKzEwOSw2IEBACiBDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlk9eQogQ09ORklHX1BFUkZNT049eQogQ09ORklHX0lBNjRfUEFMSU5GTz15Ci1DT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUT15CiAKICMKICMgRmlybXdhcmUgRHJpdmVycwpAQCAtMTI4LDE5ICsxMjcsMTIgQEAKICMKICMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0CiAjCi1DT05GSUdfQUNQSV9CT09UPXkKLUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSPXkKIENPTkZJR19BQ1BJX0JVVFRPTj15Ci1DT05GSUdfQUNQSV9WSURFTz1tCi1DT05GSUdfQUNQSV9IT1RLRVk9bQogQ09ORklHX0FDUElfRkFOPXkKIENPTkZJR19BQ1BJX1BST0NFU1NPUj15CiBDT05GSUdfQUNQSV9USEVSTUFMPXkKLUNPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1BDST15CiBDT05GSUdfQUNQSV9TWVNURU09eQogIyBDT05GSUdfQUNQSV9DT05UQUlORVIgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvZGVmY29uZmlnIGIvYXJjaC9pYTY0L2RlZmNvbmZpZwppbmRleCA4NDQ0YWRkLi41ZGEyMDgxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9kZWZjb25maWcKQEAgLTk5LDcgKzk5LDYgQEAKIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CiBDT05GSUdfUEVSRk1PTj15CiBDT05GSUdfSUE2NF9QQUxJTkZPPXkKLUNPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xMTgsMjAgKzExNywxNCBAQAogIwogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLUNPTkZJR19BQ1BJX1ZJREVPPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQogQ09ORklHX0FDUElfSE9UUExVR19DUFU9eQogQ09ORklHX0FDUElfVEhFUk1BTD1tCiBDT05GSUdfQUNQSV9OVU1BPXkKLUNPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUElfQlVTPXkKIENPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1BDST15CiBDT05GSUdfQUNQSV9TWVNURU09eQogQ09ORklHX0FDUElfQ09OVEFJTkVSPW0KIApAQCAtMzQxLDcgKzMzNCw3IEBACiBDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKICMgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMT0dJQ19GQz15CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ19GQ19GSVJNV0FSRSBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwXzEwNDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKaW5kZXggN2RjYjg1OC4uYjQyZWMzNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAogc3RhdGljIHZvaWQgcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLSNpZiBTSU1TRVJJQUxfREVCVUcKKyNpZmRlZiBTSU1TRVJJQUxfREVCVUcKIAlwcmludGsoInJzX3N0YXJ0OiB0dHktPnN0b3BwZWQ9JWQgdHR5LT5od19zdG9wcGVkPSVkIHR0eS0+Zmxvd19zdG9wcGVkPSVkXG4iLAogCQl0dHktPnN0b3BwZWQsIHR0eS0+aHdfc3RvcHBlZCwgdHR5LT5mbG93X3N0b3BwZWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKaW5kZXggODI5YTZkOC4uNDk0ZmFkNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwpAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KICNpbmNsdWRlIDxhc20vaWEzMi5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlkYXRhOCBzeXMzMl9mb3JrCiAJZGF0YTggc3lzX3JlYWQKIAlkYXRhOCBzeXNfd3JpdGUKLQlkYXRhOCBzeXMzMl9vcGVuCSAgLyogNSAqLworCWRhdGE4IGNvbXBhdF9zeXNfb3BlbgkgIC8qIDUgKi8KIAlkYXRhOCBzeXNfY2xvc2UKIAlkYXRhOCBzeXMzMl93YWl0cGlkCiAJZGF0YTggc3lzX2NyZWF0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jIGIvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCBjMWUyMGQ2Li5lMjlhOGE1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKQEAgLTIzNTksMzcgKzIzNTksNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBFeGFjdGx5IGxpa2UgZnMvb3Blbi5jOnN5c19vcGVuKCksIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3Qgc2V0IHRoZSBPX0xBUkdFRklMRSBmbGFnLgotICovCi1hc21saW5rYWdlIGxvbmcKLXN5czMyX29wZW4gKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCi17Ci0JY2hhciAqIHRtcDsKLQlpbnQgZmQsIGVycm9yOwotCi0JdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7Ci0JZmQgPSBQVFJfRVJSKHRtcCk7Ci0JaWYgKCFJU19FUlIodG1wKSkgewotCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCXN0cnVjdCBmaWxlICpmID0gZmlscF9vcGVuKHRtcCwgZmxhZ3MsIG1vZGUpOwotCQkJZXJyb3IgPSBQVFJfRVJSKGYpOwotCQkJaWYgKElTX0VSUihmKSkKLQkJCQlnb3RvIG91dF9lcnJvcjsKLQkJCWZkX2luc3RhbGwoZmQsIGYpOwotCQl9Ci1vdXQ6Ci0JCXB1dG5hbWUodG1wKTsKLQl9Ci0JcmV0dXJuIGZkOwotCi1vdXRfZXJyb3I6Ci0JcHV0X3VudXNlZF9mZChmZCk7Ci0JZmQgPSBlcnJvcjsKLQlnb3RvIG91dDsKLX0KLQogLyogU3RydWN0dXJlIGZvciBpYTMyIGVtdWxhdGlvbiBvbiBpYTY0ICovCiBzdHJ1Y3QgZXBvbGxfZXZlbnQzMgogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYjI0MjU5NC4uMzA3NTE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw3IEBACiBvYmotJChDT05GSUdfSUE2NF9QQUxJTkZPKQkrPSBwYWxpbmZvLm8KIG9iai0kKENPTkZJR19JT1NBUElDKQkJKz0gaW9zYXBpYy5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vCi1vYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIGRvbWFpbi5vCitvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vCiBvYmotJChDT05GSUdfTlVNQSkJCSs9IG51bWEubwogb2JqLSQoQ09ORklHX1BFUkZNT04pCQkrPSBwZXJmbW9uX2RlZmF1bHRfc21wbC5vCiBvYmotJChDT05GSUdfSUE2NF9DWUNMT05FKQkrPSBjeWNsb25lLm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1leHQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1leHQuYwppbmRleCAyNjIzZGY1Li4xM2E1YjNiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGktZXh0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLWV4dC5jCkBAIC0xNywyMCArMTcsMjAgQEAKICNpbmNsdWRlIDxhc20vYWNwaS1leHQuaD4KIAogc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgewotCXU4CQkJCWd1aWRfaWQ7Ci0JZWZpX2d1aWRfdAkJCWd1aWQ7CisJdTggZ3VpZF9pZDsKKwllZmlfZ3VpZF90IGd1aWQ7CiB9OwogCiBzdHJ1Y3QgYWNwaV92ZW5kb3JfaW5mbyB7Ci0Jc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IJKmRlc2NyaXB0b3I7Ci0JdTgJCQkJKmRhdGE7Ci0JdTMyCQkJCWxlbmd0aDsKKwlzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciAqZGVzY3JpcHRvcjsKKwl1OCAqZGF0YTsKKwl1MzIgbGVuZ3RoOwogfTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfdmVuZG9yX3Jlc291cmNlX21hdGNoKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV92ZW5kb3JfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV92ZW5kb3JfaW5mbyAqKSBjb250ZXh0OworCXN0cnVjdCBhY3BpX3ZlbmRvcl9pbmZvICppbmZvID0gKHN0cnVjdCBhY3BpX3ZlbmRvcl9pbmZvICopY29udGV4dDsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgKnZlbmRvcjsKIAlzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciAqZGVzY3JpcHRvcjsKIAl1MzIgbGVuZ3RoOwpAQCAtMzgsOCArMzgsOCBAQAogCWlmIChyZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfVkVORE9SKQogCQlyZXR1cm4gQUVfT0s7CiAKLQl2ZW5kb3IgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICopICZyZXNvdXJjZS0+ZGF0YTsKLQlkZXNjcmlwdG9yID0gKHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICopIHZlbmRvci0+cmVzZXJ2ZWQ7CisJdmVuZG9yID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciAqKSZyZXNvdXJjZS0+ZGF0YTsKKwlkZXNjcmlwdG9yID0gKHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICopdmVuZG9yLT5yZXNlcnZlZDsKIAlpZiAodmVuZG9yLT5sZW5ndGggPD0gc2l6ZW9mKCppbmZvLT5kZXNjcmlwdG9yKSB8fAogCSAgICBkZXNjcmlwdG9yLT5ndWlkX2lkICE9IGluZm8tPmRlc2NyaXB0b3ItPmd1aWRfaWQgfHwKIAkgICAgZWZpX2d1aWRjbXAoZGVzY3JpcHRvci0+Z3VpZCwgaW5mby0+ZGVzY3JpcHRvci0+Z3VpZCkpCkBAIC01MCwyMSArNTAsMjQgQEAKIAlpZiAoIWluZm8tPmRhdGEpCiAJCXJldHVybiBBRV9OT19NRU1PUlk7CiAKLQltZW1jcHkoaW5mby0+ZGF0YSwgdmVuZG9yLT5yZXNlcnZlZCArIHNpemVvZihzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciksIGxlbmd0aCk7CisJbWVtY3B5KGluZm8tPmRhdGEsCisJICAgICAgIHZlbmRvci0+cmVzZXJ2ZWQgKyBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IpLAorCSAgICAgICBsZW5ndGgpOwogCWluZm8tPmxlbmd0aCA9IGxlbmd0aDsKIAlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2ZpbmRfdmVuZG9yX3Jlc291cmNlKGFjcGlfaGFuZGxlIG9iaiwgc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgKmlkLAotCQl1OCAqKmRhdGEsIHUzMiAqbGVuZ3RoKQorYWNwaV9maW5kX3ZlbmRvcl9yZXNvdXJjZShhY3BpX2hhbmRsZSBvYmosIHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICogaWQsCisJCQkgIHU4ICoqIGRhdGEsIHUzMiAqIGxlbmd0aCkKIHsKIAlzdHJ1Y3QgYWNwaV92ZW5kb3JfaW5mbyBpbmZvOwogCiAJaW5mby5kZXNjcmlwdG9yID0gaWQ7CiAJaW5mby5kYXRhID0gTlVMTDsKIAotCWFjcGlfd2Fsa19yZXNvdXJjZXMob2JqLCBNRVRIT0RfTkFNRV9fQ1JTLCBhY3BpX3ZlbmRvcl9yZXNvdXJjZV9tYXRjaCwgJmluZm8pOworCWFjcGlfd2Fsa19yZXNvdXJjZXMob2JqLCBNRVRIT0RfTkFNRV9fQ1JTLCBhY3BpX3ZlbmRvcl9yZXNvdXJjZV9tYXRjaCwKKwkJCSAgICAmaW5mbyk7CiAJaWYgKCFpbmZvLmRhdGEpCiAJCXJldHVybiBBRV9OT1RfRk9VTkQ7CiAKQEAgLTc1LDE3ICs3OCwxOSBAQAogCiBzdHJ1Y3QgYWNwaV92ZW5kb3JfZGVzY3JpcHRvciBocF9jY3NyX2Rlc2NyaXB0b3IgPSB7CiAJLmd1aWRfaWQgPSAyLAotCS5ndWlkICAgID0gRUZJX0dVSUQoMHg2OWU5YWRmOSwgMHg5MjRmLCAweGFiNWYsIDB4ZjYsIDB4NGEsIDB4MjQsIDB4ZDIsIDB4MDEsIDB4MzcsIDB4MGUsIDB4YWQpCisJLmd1aWQgPQorCSAgICBFRklfR1VJRCgweDY5ZTlhZGY5LCAweDkyNGYsIDB4YWI1ZiwgMHhmNiwgMHg0YSwgMHgyNCwgMHhkMiwgMHgwMSwKKwkJICAgICAweDM3LCAweDBlLCAweGFkKQogfTsKIAotYWNwaV9zdGF0dXMKLWhwX2FjcGlfY3NyX3NwYWNlKGFjcGlfaGFuZGxlIG9iaiwgdTY0ICpjc3JfYmFzZSwgdTY0ICpjc3JfbGVuZ3RoKQorYWNwaV9zdGF0dXMgaHBfYWNwaV9jc3Jfc3BhY2UoYWNwaV9oYW5kbGUgb2JqLCB1NjQgKiBjc3JfYmFzZSwgdTY0ICogY3NyX2xlbmd0aCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTggKmRhdGE7CiAJdTMyIGxlbmd0aDsKIAotCXN0YXR1cyA9IGFjcGlfZmluZF92ZW5kb3JfcmVzb3VyY2Uob2JqLCAmaHBfY2Nzcl9kZXNjcmlwdG9yLCAmZGF0YSwgJmxlbmd0aCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9maW5kX3ZlbmRvcl9yZXNvdXJjZShvYmosICZocF9jY3NyX2Rlc2NyaXB0b3IsICZkYXRhLCAmbGVuZ3RoKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCBsZW5ndGggIT0gMTYpCiAJCXJldHVybiBBRV9OT1RfRk9VTkQ7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDk2MDlmMjQuLjI4YTQ1MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC03NCwxMiArNzQsMTEgQEAKIHVuc2lnbmVkIGludCBhY3BpX2NwZWlfcGh5c19jcHVpZDsKIAogI2RlZmluZSBNQVhfU0FQSUNTIDI1NgotdTE2IGlhNjRfYWNwaWlkX3RvX3NhcGljaWRbTUFYX1NBUElDU10gPQotCXsgWzAgLi4uIE1BWF9TQVBJQ1MgLSAxXSA9IC0xIH07Cit1MTYgaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtNQVhfU0FQSUNTXSA9IHtbMCAuLi4gTUFYX1NBUElDUyAtIDFdID0gLTEgfTsKKwogRVhQT1JUX1NZTUJPTChpYTY0X2FjcGlpZF90b19zYXBpY2lkKTsKIAotY29uc3QgY2hhciAqCi1hY3BpX2dldF9zeXNuYW1lICh2b2lkKQorY29uc3QgY2hhciAqYWNwaV9nZXRfc3lzbmFtZSh2b2lkKQogewogI2lmZGVmIENPTkZJR19JQTY0X0dFTkVSSUMKIAl1bnNpZ25lZCBsb25nIHJzZHBfcGh5czsKQEAgLTg5LDI3ICs4OCwyOSBAQAogCiAJcnNkcF9waHlzID0gYWNwaV9maW5kX3JzZHAoKTsKIAlpZiAoIXJzZHBfcGh5cykgewotCQlwcmludGsoS0VSTl9FUlIgIkFDUEkgMi4wIFJTRFAgbm90IGZvdW5kLCBkZWZhdWx0IHRvIFwiZGlnXCJcbiIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJBQ1BJIDIuMCBSU0RQIG5vdCBmb3VuZCwgZGVmYXVsdCB0byBcImRpZ1wiXG4iKTsKIAkJcmV0dXJuICJkaWciOwogCX0KIAotCXJzZHAgPSAoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwICopIF9fdmEocnNkcF9waHlzKTsKKwlyc2RwID0gKHN0cnVjdCBhY3BpMjBfdGFibGVfcnNkcCAqKV9fdmEocnNkcF9waHlzKTsKIAlpZiAoc3RybmNtcChyc2RwLT5zaWduYXR1cmUsIFJTRFBfU0lHLCBzaXplb2YoUlNEUF9TSUcpIC0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBQ1BJIDIuMCBSU0RQIHNpZ25hdHVyZSBpbmNvcnJlY3QsIGRlZmF1bHQgdG8gXCJkaWdcIlxuIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkFDUEkgMi4wIFJTRFAgc2lnbmF0dXJlIGluY29ycmVjdCwgZGVmYXVsdCB0byBcImRpZ1wiXG4iKTsKIAkJcmV0dXJuICJkaWciOwogCX0KIAotCXhzZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfeHNkdCAqKSBfX3ZhKHJzZHAtPnhzZHRfYWRkcmVzcyk7CisJeHNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV94c2R0ICopX192YShyc2RwLT54c2R0X2FkZHJlc3MpOwogCWhkciA9ICZ4c2R0LT5oZWFkZXI7CiAJaWYgKHN0cm5jbXAoaGRyLT5zaWduYXR1cmUsIFhTRFRfU0lHLCBzaXplb2YoWFNEVF9TSUcpIC0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBQ1BJIDIuMCBYU0RUIHNpZ25hdHVyZSBpbmNvcnJlY3QsIGRlZmF1bHQgdG8gXCJkaWdcIlxuIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkFDUEkgMi4wIFhTRFQgc2lnbmF0dXJlIGluY29ycmVjdCwgZGVmYXVsdCB0byBcImRpZ1wiXG4iKTsKIAkJcmV0dXJuICJkaWciOwogCX0KIAogCWlmICghc3RyY21wKGhkci0+b2VtX2lkLCAiSFAiKSkgewogCQlyZXR1cm4gImhwengxIjsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChoZHItPm9lbV9pZCwgIlNHSSIpKSB7CisJfSBlbHNlIGlmICghc3RyY21wKGhkci0+b2VtX2lkLCAiU0dJIikpIHsKIAkJcmV0dXJuICJzbjIiOwogCX0KIApAQCAtMTMxLDcgKzEzMiw3IEBACiAjZW5kaWYKIH0KIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCiAjZGVmaW5lIEFDUElfTUFYX1BMQVRGT1JNX0lOVEVSUlVQVFMJMjU2CiAKQEAgLTE0Niw4ICsxNDcsNyBAQAogICogSW50ZXJydXB0IHJvdXRpbmcgQVBJIGZvciBkZXZpY2UgZHJpdmVycy4gIFByb3ZpZGVzIGludGVycnVwdCB2ZWN0b3IgZm9yCiAgKiBhIGdlbmVyaWMgcGxhdGZvcm0gZXZlbnQuICBDdXJyZW50bHkgb25seSBDUEVJIGlzIGltcGxlbWVudGVkLgogICovCi1pbnQKLWFjcGlfcmVxdWVzdF92ZWN0b3IgKHUzMiBpbnRfdHlwZSkKK2ludCBhY3BpX3JlcXVlc3RfdmVjdG9yKHUzMiBpbnRfdHlwZSkKIHsKIAlpbnQgdmVjdG9yID0gLTE7CiAKQEAgLTE1NSwxMiArMTU1LDEyIEBACiAJCS8qIGNvcnJlY3RlZCBwbGF0Zm9ybSBlcnJvciBpbnRlcnJ1cHQgKi8KIAkJdmVjdG9yID0gcGxhdGZvcm1faW50cl9saXN0W2ludF90eXBlXTsKIAl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJhY3BpX3JlcXVlc3RfdmVjdG9yKCk6IGludmFsaWQgaW50ZXJydXB0IHR5cGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJhY3BpX3JlcXVlc3RfdmVjdG9yKCk6IGludmFsaWQgaW50ZXJydXB0IHR5cGVcbiIpOwogCXJldHVybiB2ZWN0b3I7CiB9CiAKLWNoYXIgKgotX19hY3BpX21hcF90YWJsZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2NoYXIgKl9fYWNwaV9tYXBfdGFibGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX192YShwaHlzX2FkZHIpOwogfQpAQCAtMTY5LDE5ICsxNjksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb290LXRpbWUgVGFibGUgUGFyc2luZwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAkJCXRvdGFsX2NwdXMgX19pbml0ZGF0YTsKLXN0YXRpYyBpbnQJCQlhdmFpbGFibGVfY3B1cyBfX2luaXRkYXRhOwotc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqCWFjcGlfbWFkdCBfX2luaXRkYXRhOwotc3RhdGljIHU4CQkJaGFzXzgyNTk7Ci0KK3N0YXRpYyBpbnQgdG90YWxfY3B1cyBfX2luaXRkYXRhOworc3RhdGljIGludCBhdmFpbGFibGVfY3B1cyBfX2luaXRkYXRhOworc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqYWNwaV9tYWR0IF9faW5pdGRhdGE7CitzdGF0aWMgdTggaGFzXzgyNTk7CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpYzsKIAotCWxhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICopIGhlYWRlcjsKKwlsYXBpYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShsYXBpYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTMsMjIgKzE5MiwyMyBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xzYXBpYyAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2xzYXBpYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbHNhcGljICpsc2FwaWM7CiAKLQlsc2FwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfbHNhcGljICopIGhlYWRlcjsKKwlsc2FwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfbHNhcGljICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGxzYXBpYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAobHNhcGljLT5mbGFncy5lbmFibGVkKSB7CiAjaWZkZWYgQ09ORklHX1NNUAotCQlzbXBfYm9vdF9kYXRhLmNwdV9waHlzX2lkW2F2YWlsYWJsZV9jcHVzXSA9IChsc2FwaWMtPmlkIDw8IDgpIHwgbHNhcGljLT5laWQ7CisJCXNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbYXZhaWxhYmxlX2NwdXNdID0KKwkJICAgIChsc2FwaWMtPmlkIDw8IDgpIHwgbHNhcGljLT5laWQ7CiAjZW5kaWYKLQkJaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtsc2FwaWMtPmFjcGlfaWRdID0gKGxzYXBpYy0+aWQgPDwgOCkgfCBsc2FwaWMtPmVpZDsKKwkJaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtsc2FwaWMtPmFjcGlfaWRdID0KKwkJICAgIChsc2FwaWMtPmlkIDw8IDgpIHwgbHNhcGljLT5laWQ7CiAJCSsrYXZhaWxhYmxlX2NwdXM7CiAJfQogCkBAIC0yMTYsMTMgKzIxNiwxMiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xhcGljX25taSAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2xhcGljX25taShhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICpsYWNwaV9ubWk7CiAKLQlsYWNwaV9ubWkgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pKikgaGVhZGVyOworCWxhY3BpX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkobGFjcGlfbm1pLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzMSwxMyArMjMwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfaW9zYXBpYyAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2lvc2FwaWMoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKmlvc2FwaWM7CiAKLQlpb3NhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKikgaGVhZGVyOworCWlvc2FwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShpb3NhcGljLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0NSwxNSArMjQzLDE0IEBACiAJcmV0dXJuIGlvc2FwaWNfaW5pdChpb3NhcGljLT5hZGRyZXNzLCBpb3NhcGljLT5nbG9iYWxfaXJxX2Jhc2UpOwogfQogCi0KIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX3BsYXRfaW50X3NyYyAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX3BsYXRfaW50X3NyYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyAqcGxpbnRzcmM7CiAJaW50IHZlY3RvcjsKIAotCXBsaW50c3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyAqKSBoZWFkZXI7CisJcGxpbnRzcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfcGxhdF9pbnRfc3JjICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKHBsaW50c3JjLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI2Nyw4ICsyNjQsMTIgQEAKIAkJCQkJCXBsaW50c3JjLT5pb3NhcGljX3ZlY3RvciwKIAkJCQkJCXBsaW50c3JjLT5laWQsCiAJCQkJCQlwbGludHNyYy0+aWQsCi0JCQkJCQkocGxpbnRzcmMtPmZsYWdzLnBvbGFyaXR5ID09IDEpID8gSU9TQVBJQ19QT0xfSElHSCA6IElPU0FQSUNfUE9MX0xPVywKLQkJCQkJCShwbGludHNyYy0+ZmxhZ3MudHJpZ2dlciA9PSAxKSA/IElPU0FQSUNfRURHRSA6IElPU0FQSUNfTEVWRUwpOworCQkJCQkJKHBsaW50c3JjLT5mbGFncy5wb2xhcml0eSA9PQorCQkJCQkJIDEpID8gSU9TQVBJQ19QT0xfSElHSCA6CisJCQkJCQlJT1NBUElDX1BPTF9MT1csCisJCQkJCQkocGxpbnRzcmMtPmZsYWdzLnRyaWdnZXIgPT0KKwkJCQkJCSAxKSA/IElPU0FQSUNfRURHRSA6CisJCQkJCQlJT1NBUElDX0xFVkVMKTsKIAogCXBsYXRmb3JtX2ludHJfbGlzdFtwbGludHNyYy0+dHlwZV0gPSB2ZWN0b3I7CiAJaWYgKGFjcGlfbWFkdF9yZXYgPiAxKSB7CkBAIC0yODMsNyArMjg0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiB1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCkKIHsKIAlleHRlcm4gaW50IGNwZV92ZWN0b3I7CkBAIC0zMjIsMjkgKzMyMiwzMCBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9pbnRfc3JjX292ciAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2ludF9zcmNfb3ZyKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKnA7CiAKLQlwID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICopIGhlYWRlcjsKKwlwID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKHAsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaW9zYXBpY19vdmVycmlkZV9pc2FfaXJxKHAtPmJ1c19pcnEsIHAtPmdsb2JhbF9pcnEsCi0JCQkJIChwLT5mbGFncy5wb2xhcml0eSA9PSAxKSA/IElPU0FQSUNfUE9MX0hJR0ggOiBJT1NBUElDX1BPTF9MT1csCi0JCQkJIChwLT5mbGFncy50cmlnZ2VyID09IDEpID8gSU9TQVBJQ19FREdFIDogSU9TQVBJQ19MRVZFTCk7CisJCQkJIChwLT5mbGFncy5wb2xhcml0eSA9PQorCQkJCSAgMSkgPyBJT1NBUElDX1BPTF9ISUdIIDogSU9TQVBJQ19QT0xfTE9XLAorCQkJCSAocC0+ZmxhZ3MudHJpZ2dlciA9PQorCQkJCSAgMSkgPyBJT1NBUElDX0VER0UgOiBJT1NBUElDX0xFVkVMKTsKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9ubWlfc3JjIChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2Vfbm1pX3NyYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqbm1pX3NyYzsKIAotCW5taV9zcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyopIGhlYWRlcjsKKwlubWlfc3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkobm1pX3NyYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNTMsMTEgKzM1NCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdAotYWNwaV9tYWR0X29lbV9jaGVjayAoY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKIHsKLQlpZiAoIXN0cm5jbXAob2VtX2lkLCAiSUJNIiwgMykgJiYKLQkgICAgKCFzdHJuY21wKG9lbV90YWJsZV9pZCwgIlNFUk1PVyIsIDYpKSkgeworCWlmICghc3RybmNtcChvZW1faWQsICJJQk0iLCAzKSAmJiAoIXN0cm5jbXAob2VtX3RhYmxlX2lkLCAiU0VSTU9XIiwgNikpKSB7CiAKIAkJLyoKIAkJICogVW5mb3J0dW5hdGVseSBJVENfRFJJRlQgaXMgbm90IHlldCBwYXJ0IG9mIHRoZQpAQCAtMzcwLDE5ICszNjksMTggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX21hZHQgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX21hZHQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhY3BpX21hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKSBfX3ZhKHBoeXNfYWRkcik7CisJYWNwaV9tYWR0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX21hZHQgKilfX3ZhKHBoeXNfYWRkcik7CiAKIAlhY3BpX21hZHRfcmV2ID0gYWNwaV9tYWR0LT5oZWFkZXIucmV2aXNpb247CiAKIAkvKiByZW1lbWJlciB0aGUgdmFsdWUgZm9yIHJlZmVyZW5jZSBhZnRlciBmcmVlX2luaXRtZW0oKSAqLwogI2lmZGVmIENPTkZJR19JVEFOSVVNCi0JaGFzXzgyNTkgPSAxOyAvKiBGaXJtd2FyZSBvbiBvbGQgSXRhbml1bSBzeXN0ZW1zIGlzIGJyb2tlbiAqLworCWhhc184MjU5ID0gMTsJCS8qIEZpcm13YXJlIG9uIG9sZCBJdGFuaXVtIHN5c3RlbXMgaXMgYnJva2VuICovCiAjZWxzZQogCWhhc184MjU5ID0gYWNwaV9tYWR0LT5mbGFncy5wY2F0X2NvbXBhdDsKICNlbmRpZgpAQCAtMzk2LDE5ICszOTQsMTggQEAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTG9jYWwgQVBJQyBhZGRyZXNzICVwXG4iLCBpcGlfYmFzZV9hZGRyKTsKIAogCWFjcGlfbWFkdF9vZW1fY2hlY2soYWNwaV9tYWR0LT5oZWFkZXIub2VtX2lkLAotCQlhY3BpX21hZHQtPmhlYWRlci5vZW1fdGFibGVfaWQpOworCQkJICAgIGFjcGlfbWFkdC0+aGVhZGVyLm9lbV90YWJsZV9pZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCiAjdW5kZWYgU0xJVF9ERUJVRwogCiAjZGVmaW5lIFBYTV9GTEFHX0xFTiAoKE1BWF9QWE1fRE9NQUlOUyArIDEpLzMyKQogCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgc3JhdF9udW1fY3B1czsJCQkvKiBudW1iZXIgb2YgY3B1cyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHNyYXRfbnVtX2NwdXM7CS8qIG51bWJlciBvZiBjcHVzICovCiBzdGF0aWMgdTMyIF9fZGV2aW5pdGRhdGEgcHhtX2ZsYWdbUFhNX0ZMQUdfTEVOXTsKICNkZWZpbmUgcHhtX2JpdF9zZXQoYml0KQkoc2V0X2JpdChiaXQsKHZvaWQgKilweG1fZmxhZykpCiAjZGVmaW5lIHB4bV9iaXRfdGVzdChiaXQpCSh0ZXN0X2JpdChiaXQsKHZvaWQgKilweG1fZmxhZykpCkBAIC00MjEsMTUgKzQxOCwxNSBAQAogICogQUNQSSAyLjAgU0xJVCAoU3lzdGVtIExvY2FsaXR5IEluZm9ybWF0aW9uIFRhYmxlKQogICogaHR0cDovL2RldnJlc291cmNlLmhwLmNvbS9kZXZyZXNvdXJjZS9Eb2NzL1RlY2hQYXBlcnMvSUE2NC9zbGl0LnBkZgogICovCi12b2lkIF9faW5pdAotYWNwaV9udW1hX3NsaXRfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCkKK3ZvaWQgX19pbml0IGFjcGlfbnVtYV9zbGl0X2luaXQoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCkKIHsKIAl1MzIgbGVuOwogCiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikgKyA4Ci0JCSsgc2xpdC0+bG9jYWxpdGllcyAqIHNsaXQtPmxvY2FsaXRpZXM7CisJICAgICsgc2xpdC0+bG9jYWxpdGllcyAqIHNsaXQtPmxvY2FsaXRpZXM7CiAJaWYgKHNsaXQtPmhlYWRlci5sZW5ndGggIT0gbGVuKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQUNQSSAyLjAgU0xJVDogc2l6ZSBtaXNtYXRjaDogJWQgZXhwZWN0ZWQsICVkIGFjdHVhbFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQUNQSSAyLjAgU0xJVDogc2l6ZSBtaXNtYXRjaDogJWQgZXhwZWN0ZWQsICVkIGFjdHVhbFxuIiwKIAkJICAgICAgIGxlbiwgc2xpdC0+aGVhZGVyLmxlbmd0aCk7CiAJCW1lbXNldChudW1hX3NsaXQsIDEwLCBzaXplb2YobnVtYV9zbGl0KSk7CiAJCXJldHVybjsKQEAgLTQzOCwxOSArNDM1LDIwIEBACiB9CiAKIHZvaWQgX19pbml0Ci1hY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQgKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqcGEpCithY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwYSkKIHsKIAkvKiByZWNvcmQgdGhpcyBub2RlIGluIHByb3hpbWl0eSBiaXRtYXAgKi8KIAlweG1fYml0X3NldChwYS0+cHJveGltaXR5X2RvbWFpbik7CiAKLQlub2RlX2NwdWlkW3NyYXRfbnVtX2NwdXNdLnBoeXNfaWQgPSAocGEtPmFwaWNfaWQgPDwgOCkgfCAocGEtPmxzYXBpY19laWQpOworCW5vZGVfY3B1aWRbc3JhdF9udW1fY3B1c10ucGh5c19pZCA9CisJICAgIChwYS0+YXBpY19pZCA8PCA4KSB8IChwYS0+bHNhcGljX2VpZCk7CiAJLyogbmlkIHNob3VsZCBiZSBvdmVycmlkZGVuIGFzIGxvZ2ljYWwgbm9kZSBpZCBsYXRlciAqLwogCW5vZGVfY3B1aWRbc3JhdF9udW1fY3B1c10ubmlkID0gcGEtPnByb3hpbWl0eV9kb21haW47CiAJc3JhdF9udW1fY3B1cysrOwogfQogCiB2b2lkIF9faW5pdAotYWNwaV9udW1hX21lbW9yeV9hZmZpbml0eV9pbml0IChzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKm1hKQorYWNwaV9udW1hX21lbW9yeV9hZmZpbml0eV9pbml0KHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqbWEpCiB7CiAJdW5zaWduZWQgbG9uZyBwYWRkciwgc2l6ZTsKIAl1OCBweG07CkBAIC00ODcsOCArNDg1LDcgQEAKIAludW1fbm9kZV9tZW1ibGtzKys7CiB9CiAKLXZvaWQgX19pbml0Ci1hY3BpX251bWFfYXJjaF9maXh1cCAodm9pZCkKK3ZvaWQgX19pbml0IGFjcGlfbnVtYV9hcmNoX2ZpeHVwKHZvaWQpCiB7CiAJaW50IGksIGosIG5vZGVfZnJvbSwgbm9kZV90bzsKIApAQCAtNTM0LDIxICs1MzEsMjQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc3JhdF9udW1fY3B1czsgaSsrKQogCQlub2RlX2NwdWlkW2ldLm5pZCA9IHB4bV90b19uaWRfbWFwW25vZGVfY3B1aWRbaV0ubmlkXTsKIAotCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBsb2dpY2FsIG5vZGVzIGluIHN5c3RlbSA9ICVkXG4iLCBudW1fb25saW5lX25vZGVzKCkpOwotCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBtZW1vcnkgY2h1bmtzIGluIHN5c3RlbSA9ICVkXG4iLCBudW1fbm9kZV9tZW1ibGtzKTsKKwlwcmludGsoS0VSTl9JTkZPICJOdW1iZXIgb2YgbG9naWNhbCBub2RlcyBpbiBzeXN0ZW0gPSAlZFxuIiwKKwkgICAgICAgbnVtX29ubGluZV9ub2RlcygpKTsKKwlwcmludGsoS0VSTl9JTkZPICJOdW1iZXIgb2YgbWVtb3J5IGNodW5rcyBpbiBzeXN0ZW0gPSAlZFxuIiwKKwkgICAgICAgbnVtX25vZGVfbWVtYmxrcyk7CiAKLQlpZiAoIXNsaXRfdGFibGUpIHJldHVybjsKKwlpZiAoIXNsaXRfdGFibGUpCisJCXJldHVybjsKIAltZW1zZXQobnVtYV9zbGl0LCAtMSwgc2l6ZW9mKG51bWFfc2xpdCkpOwotCWZvciAoaT0wOyBpPHNsaXRfdGFibGUtPmxvY2FsaXRpZXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzbGl0X3RhYmxlLT5sb2NhbGl0aWVzOyBpKyspIHsKIAkJaWYgKCFweG1fYml0X3Rlc3QoaSkpCiAJCQljb250aW51ZTsKIAkJbm9kZV9mcm9tID0gcHhtX3RvX25pZF9tYXBbaV07Ci0JCWZvciAoaj0wOyBqPHNsaXRfdGFibGUtPmxvY2FsaXRpZXM7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgc2xpdF90YWJsZS0+bG9jYWxpdGllczsgaisrKSB7CiAJCQlpZiAoIXB4bV9iaXRfdGVzdChqKSkKIAkJCQljb250aW51ZTsKIAkJCW5vZGVfdG8gPSBweG1fdG9fbmlkX21hcFtqXTsKIAkJCW5vZGVfZGlzdGFuY2Uobm9kZV9mcm9tLCBub2RlX3RvKSA9Ci0JCQkJc2xpdF90YWJsZS0+ZW50cnlbaSpzbGl0X3RhYmxlLT5sb2NhbGl0aWVzICsgal07CisJCQkgICAgc2xpdF90YWJsZS0+ZW50cnlbaSAqIHNsaXRfdGFibGUtPmxvY2FsaXRpZXMgKyBqXTsKIAkJfQogCX0KIApAQCAtNTU2LDM2ICs1NTYsNDEgQEAKIAlwcmludGsoIkFDUEkgMi4wIFNMSVQgbG9jYWxpdHkgdGFibGU6XG4iKTsKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSB7CiAJCWZvcl9lYWNoX29ubGluZV9ub2RlKGopCi0JCQlwcmludGsoIiUwM2QgIiwgbm9kZV9kaXN0YW5jZShpLGopKTsKKwkJICAgIHByaW50aygiJTAzZCAiLCBub2RlX2Rpc3RhbmNlKGksIGopKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KICNlbmRpZgogfQotI2VuZGlmIC8qIENPTkZJR19BQ1BJX05VTUEgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9OVU1BICovCiAKLXVuc2lnbmVkIGludAotYWNwaV9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQorLyoKKyAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgbnVtYmVyICg+PTApCisgKiBmYWlsdXJlOiByZXR1cm4gPCAwCisgKi8KK2ludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKIHsKIAlpZiAoaGFzXzgyNTkgJiYgZ3NpIDwgMTYpCiAJCXJldHVybiBpc2FfaXJxX3RvX3ZlY3Rvcihnc2kpOwogCiAJcmV0dXJuIGlvc2FwaWNfcmVnaXN0ZXJfaW50cihnc2ksCi0JCQkoYWN0aXZlX2hpZ2hfbG93ID09IEFDUElfQUNUSVZFX0hJR0gpID8gSU9TQVBJQ19QT0xfSElHSCA6IElPU0FQSUNfUE9MX0xPVywKLQkJCShlZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUpID8gSU9TQVBJQ19FREdFIDogSU9TQVBJQ19MRVZFTCk7CisJCQkJICAgICAoYWN0aXZlX2hpZ2hfbG93ID09CisJCQkJICAgICAgQUNQSV9BQ1RJVkVfSElHSCkgPyBJT1NBUElDX1BPTF9ISUdIIDoKKwkJCQkgICAgIElPU0FQSUNfUE9MX0xPVywKKwkJCQkgICAgIChlZGdlX2xldmVsID09CisJCQkJICAgICAgQUNQSV9FREdFX1NFTlNJVElWRSkgPyBJT1NBUElDX0VER0UgOgorCQkJCSAgICAgSU9TQVBJQ19MRVZFTCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9nc2kpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfREVBTExPQ0FURV9JUlEKLXZvaWQKLWFjcGlfdW5yZWdpc3Rlcl9nc2kgKHUzMiBnc2kpCit2b2lkIGFjcGlfdW5yZWdpc3Rlcl9nc2kodTMyIGdzaSkKIHsKIAlpb3NhcGljX3VucmVnaXN0ZXJfaW50cihnc2kpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfZ3NpKTsKLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUSAqLwogCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9mYWR0ICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfZ3NpKTsKKworc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9mYWR0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpmYWR0X2hlYWRlcjsKIAlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQ7CkBAIC01OTMsMTEgKzU5OCwxMSBAQAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZhZHRfaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKSBfX3ZhKHBoeXNfYWRkcik7CisJZmFkdF9oZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopX192YShwaHlzX2FkZHIpOwogCWlmIChmYWR0X2hlYWRlci0+cmV2aXNpb24gIT0gMykKLQkJcmV0dXJuIC1FTk9ERVY7CQkvKiBPbmx5IGRlYWwgd2l0aCBBQ1BJIDIuMCBGQURUICovCisJCXJldHVybiAtRU5PREVWOwkvKiBPbmx5IGRlYWwgd2l0aCBBQ1BJIDIuMCBGQURUICovCiAKLQlmYWR0ID0gKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqKSBmYWR0X2hlYWRlcjsKKwlmYWR0ID0gKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqKWZhZHRfaGVhZGVyOwogCiAJaWYgKCEoZmFkdC0+aWFwY19ib290X2FyY2ggJiBCQUZfODA0Ml9LRVlCT0FSRF9DT05UUk9MTEVSKSkKIAkJYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50ID0gMDsKQEAgLTYwOSwyMiArNjE0LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotdW5zaWduZWQgbG9uZyBfX2luaXQKLWFjcGlfZmluZF9yc2RwICh2b2lkKQordW5zaWduZWQgbG9uZyBfX2luaXQgYWNwaV9maW5kX3JzZHAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJzZHBfcGh5cyA9IDA7CiAKIAlpZiAoZWZpLmFjcGkyMCkKIAkJcnNkcF9waHlzID0gX19wYShlZmkuYWNwaTIwKTsKIAllbHNlIGlmIChlZmkuYWNwaSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggInYxLjAvcjAuNzEgdGFibGVzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkgICAgICAgInYxLjAvcjAuNzEgdGFibGVzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIpOwogCXJldHVybiByc2RwX3BoeXM7CiB9CiAKLQotaW50IF9faW5pdAotYWNwaV9ib290X2luaXQgKHZvaWQpCitpbnQgX19pbml0IGFjcGlfYm9vdF9pbml0KHZvaWQpCiB7CiAKIAkvKgpAQCAtNjQyLDMxICs2NDQsNDMgQEAKIAogCS8qIExvY2FsIEFQSUMgKi8KIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDX0FERFJfT1ZSLCBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKSA8IDApCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgYWRkcmVzcyBvdmVycmlkZSBlbnRyeVxuIik7CisJaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdAorCSAgICAoQUNQSV9NQURUX0xBUElDX0FERFJfT1ZSLCBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJFcnJvciBwYXJzaW5nIExBUElDIGFkZHJlc3Mgb3ZlcnJpZGUgZW50cnlcbiIpOwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTFNBUElDLCBhY3BpX3BhcnNlX2xzYXBpYywgTlJfQ1BVUykgPCAxKQotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIE1BRFQgLSBubyBMQVBJQyBlbnRyaWVzXG4iKTsKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MU0FQSUMsIGFjcGlfcGFyc2VfbHNhcGljLCBOUl9DUFVTKQorCSAgICA8IDEpCisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJFcnJvciBwYXJzaW5nIE1BRFQgLSBubyBMQVBJQyBlbnRyaWVzXG4iKTsKIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDX05NSSwgYWNwaV9wYXJzZV9sYXBpY19ubWksIDApIDwgMCkKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKQorCSAgICA8IDApCiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgTk1JIGVudHJ5XG4iKTsKIAogCS8qIEkvTyBBUElDICovCiAKLQlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9JT1NBUElDLCBhY3BpX3BhcnNlX2lvc2FwaWMsIE5SX0lPU0FQSUNTKSA8IDEpCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTUFEVCAtIG5vIElPU0FQSUMgZW50cmllc1xuIik7CisJaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdAorCSAgICAoQUNQSV9NQURUX0lPU0FQSUMsIGFjcGlfcGFyc2VfaW9zYXBpYywgTlJfSU9TQVBJQ1MpIDwgMSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkVycm9yIHBhcnNpbmcgTUFEVCAtIG5vIElPU0FQSUMgZW50cmllc1xuIik7CiAKIAkvKiBTeXN0ZW0tTGV2ZWwgSW50ZXJydXB0IFJvdXRpbmcgKi8KIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1BMQVRfSU5UX1NSQywgYWNwaV9wYXJzZV9wbGF0X2ludF9zcmMsIEFDUElfTUFYX1BMQVRGT1JNX0lOVEVSUlVQVFMpIDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBwbGF0Zm9ybSBpbnRlcnJ1cHQgc291cmNlIGVudHJ5XG4iKTsKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0CisJICAgIChBQ1BJX01BRFRfUExBVF9JTlRfU1JDLCBhY3BpX3BhcnNlX3BsYXRfaW50X3NyYywKKwkgICAgIEFDUElfTUFYX1BMQVRGT1JNX0lOVEVSUlVQVFMpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkVycm9yIHBhcnNpbmcgcGxhdGZvcm0gaW50ZXJydXB0IHNvdXJjZSBlbnRyeVxuIik7CiAKLQlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9JTlRfU1JDX09WUiwgYWNwaV9wYXJzZV9pbnRfc3JjX292ciwgMCkgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIGludGVycnVwdCBzb3VyY2Ugb3ZlcnJpZGVzIGVudHJ5XG4iKTsKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0CisJICAgIChBQ1BJX01BRFRfSU5UX1NSQ19PVlIsIGFjcGlfcGFyc2VfaW50X3NyY19vdnIsIDApIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOwogCiAJaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTk1JX1NSQywgYWNwaV9wYXJzZV9ubWlfc3JjLCAwKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTk1JIFNSQyBlbnRyeVxuIik7Ci0gIHNraXBfbWFkdDoKKyAgICAgIHNraXBfbWFkdDoKIAogCS8qCiAJICogRkFEVCBzYXlzIHdoZXRoZXIgYSBsZWdhY3kga2V5Ym9hcmQgY29udHJvbGxlciBpcyBwcmVzZW50LgpAQCAtNjgxLDggKzY5NSw5IEBACiAJaWYgKGF2YWlsYWJsZV9jcHVzID09IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSTogRm91bmQgMCBDUFVTOyBhc3N1bWluZyAxXG4iKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIDAgKDB4JTA0eCkiLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCXNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbYXZhaWxhYmxlX2NwdXNdID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWF2YWlsYWJsZV9jcHVzID0gMTsgLyogV2UndmUgZ290IGF0IGxlYXN0IG9uZSBvZiB0aGVzZSwgbm8/ICovCisJCXNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbYXZhaWxhYmxlX2NwdXNdID0KKwkJICAgIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlhdmFpbGFibGVfY3B1cyA9IDE7CS8qIFdlJ3ZlIGdvdCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UsIG5vPyAqLwogCX0KIAlzbXBfYm9vdF9kYXRhLmNwdV9jb3VudCA9IGF2YWlsYWJsZV9jcHVzOwogCkBAIC02OTEsOCArNzA2LDEwIEBACiAJaWYgKHNyYXRfbnVtX2NwdXMgPT0gMCkgewogCQlpbnQgY3B1LCBpID0gMTsKIAkJZm9yIChjcHUgPSAwOyBjcHUgPCBzbXBfYm9vdF9kYXRhLmNwdV9jb3VudDsgY3B1KyspCi0JCQlpZiAoc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdICE9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKQotCQkJCW5vZGVfY3B1aWRbaSsrXS5waHlzX2lkID0gc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdOworCQkJaWYgKHNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbY3B1XSAhPQorCQkJICAgIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQkJCW5vZGVfY3B1aWRbaSsrXS5waHlzX2lkID0KKwkJCQkgICAgc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdOwogCX0KICMgZW5kaWYKICNlbmRpZgpAQCAtNzAwLDEyICs3MTcsMTIgQEAKIAlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKICNlbmRpZgogCS8qIE1ha2UgYm9vdC11cCBsb29rIHByZXR0eSAqLwotCXByaW50ayhLRVJOX0lORk8gIiVkIENQVXMgYXZhaWxhYmxlLCAlZCBDUFVzIHRvdGFsXG4iLCBhdmFpbGFibGVfY3B1cywgdG90YWxfY3B1cyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJWQgQ1BVcyBhdmFpbGFibGUsICVkIENQVXMgdG90YWxcbiIsIGF2YWlsYWJsZV9jcHVzLAorCSAgICAgICB0b3RhbF9jcHVzKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1hY3BpX2dzaV90b19pcnEgKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKQoraW50IGFjcGlfZ3NpX3RvX2lycSh1MzIgZ3NpLCB1bnNpZ25lZCBpbnQgKmlycSkKIHsKIAlpbnQgdmVjdG9yOwogCkBAIC03MjYsMTEgKzc0MywxMCBAQAogICovCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKIHN0YXRpYwotaW50Ci1hY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGxvbmcgcGh5c2lkKQoraW50IGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgbG9uZyBwaHlzaWQpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCWludCAJCQlweG1faWQ7CisJaW50IHB4bV9pZDsKIAogCXB4bV9pZCA9IGFjcGlfZ2V0X3B4bShoYW5kbGUpOwogCkBAIC03MzgsMzEgKzc1NCwyOCBAQAogCSAqIEFzc3VtaW5nIHRoYXQgdGhlIGNvbnRhaW5lciBkcml2ZXIgd291bGQgaGF2ZSBzZXQgdGhlIHByb3hpbWl0eQogCSAqIGRvbWFpbiBhbmQgd291bGQgaGF2ZSBpbml0aWFsaXplZCBweG1fdG9fbmlkX21hcFtweG1faWRdICYmIHB4bV9mbGFnCiAJICovCi0Jbm9kZV9jcHVpZFtjcHVdLm5pZCA9IChweG1faWQgPCAwKSA/IDA6Ci0JCQlweG1fdG9fbmlkX21hcFtweG1faWRdOworCW5vZGVfY3B1aWRbY3B1XS5uaWQgPSAocHhtX2lkIDwgMCkgPyAwIDogcHhtX3RvX25pZF9tYXBbcHhtX2lkXTsKIAotCW5vZGVfY3B1aWRbY3B1XS5waHlzX2lkID0gIHBoeXNpZDsKKwlub2RlX2NwdWlkW2NwdV0ucGh5c19pZCA9IHBoeXNpZDsKICNlbmRpZgotCXJldHVybigwKTsKKwlyZXR1cm4gKDApOwogfQogCi0KLWludAotYWNwaV9tYXBfbHNhcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpwY3B1KQoraW50IGFjcGlfbWFwX2xzYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcGNwdSkKIHsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGFjcGlfdGFibGVfbHNhcGljICpsc2FwaWM7CiAJY3B1bWFza190IHRtcF9tYXA7CiAJbG9uZyBwaHlzaWQ7CiAJaW50IGNwdTsKLSAKKwogCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWJ1ZmZlci5sZW5ndGggfHwgICFidWZmZXIucG9pbnRlcikKKwlpZiAoIWJ1ZmZlci5sZW5ndGggfHwgIWJ1ZmZlci5wb2ludGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKLSAKKwogCW9iaiA9IGJ1ZmZlci5wb2ludGVyOwogCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUiB8fAogCSAgICBvYmotPmJ1ZmZlci5sZW5ndGggPCBzaXplb2YoKmxzYXBpYykpIHsKQEAgLTc3OCw3ICs3OTEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwaHlzaWQgPSAoKGxzYXBpYy0+aWQgPDw4KSB8IChsc2FwaWMtPmVpZCkpOworCXBoeXNpZCA9ICgobHNhcGljLT5pZCA8PCA4KSB8IChsc2FwaWMtPmVpZCkpOwogCiAJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9CVUZGRVI7CkBAIC03ODYsNTAgKzc5OSw0OSBAQAogCiAJY3B1c19jb21wbGVtZW50KHRtcF9tYXAsIGNwdV9wcmVzZW50X21hcCk7CiAJY3B1ID0gZmlyc3RfY3B1KHRtcF9tYXApOwotCWlmKGNwdSA+PSBOUl9DUFVTKQorCWlmIChjcHUgPj0gTlJfQ1BVUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlhY3BpX21hcF9jcHUybm9kZShoYW5kbGUsIGNwdSwgcGh5c2lkKTsKIAotIAljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKIAlpYTY0X2NwdV90b19zYXBpY2lkW2NwdV0gPSBwaHlzaWQ7CiAJaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtsc2FwaWMtPmFjcGlfaWRdID0gaWE2NF9jcHVfdG9fc2FwaWNpZFtjcHVdOwogCiAJKnBjcHUgPSBjcHU7Ci0JcmV0dXJuKDApOworCXJldHVybiAoMCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9tYXBfbHNhcGljKTsKIAotCi1pbnQKLWFjcGlfdW5tYXBfbHNhcGljKGludCBjcHUpCitpbnQgYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSkKIHsKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpPE1BWF9TQVBJQ1M7IGkrKykgewotIAkJaWYgKGlhNjRfYWNwaWlkX3RvX3NhcGljaWRbaV0gPT0gaWE2NF9jcHVfdG9fc2FwaWNpZFtjcHVdKSB7Ci0gCQkJaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtpXSA9IC0xOwotIAkJCWJyZWFrOwotIAkJfQotIAl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9TQVBJQ1M7IGkrKykgeworCQlpZiAoaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtpXSA9PSBpYTY0X2NwdV90b19zYXBpY2lkW2NwdV0pIHsKKwkJCWlhNjRfYWNwaWlkX3RvX3NhcGljaWRbaV0gPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQogCWlhNjRfY3B1X3RvX3NhcGljaWRbY3B1XSA9IC0xOwotCWNwdV9jbGVhcihjcHUsY3B1X3ByZXNlbnRfbWFwKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfcHJlc2VudF9tYXApOwogCiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCS8qIE5VTUEgc3BlY2lmaWMgY2xlYW51cCdzICovCiAjZW5kaWYKIAotCXJldHVybigwKTsKKwlyZXR1cm4gKDApOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwotIAorI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVICovCiAKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiBhY3BpX3N0YXR1cyBfX2RldmluaXQKLWFjcGlfbWFwX2lvc2FwaWMgKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGRlcHRoLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0KQorYWNwaV9tYXBfaW9zYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZXB0aCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldCkKIHsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqaW9zYXBpYzsKIAl1bnNpZ25lZCBpbnQgZ3NpX2Jhc2U7CkBAIC04NzgsMTAgKzg5MCw5IEBACiAJbWFwX2lvc2FwaWNfdG9fbm9kZShnc2lfYmFzZSwgbm9kZSk7CiAJcmV0dXJuIEFFX09LOwogfQotI2VuZGlmIC8qIENPTkZJR19OVU1BICovCisjZW5kaWYJCQkJLyogQ09ORklHX05VTUEgKi8KIAotaW50Ci1hY3BpX3JlZ2lzdGVyX2lvYXBpYyAoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpCitpbnQgYWNwaV9yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpCiB7CiAJaW50IGVycjsKIApAQCAtODkwLDE3ICs5MDEsMTggQEAKIAogI2lmIENPTkZJR19BQ1BJX05VTUEKIAlhY3BpX21hcF9pb3NhcGljKGhhbmRsZSwgMCwgTlVMTCwgTlVMTCk7Ci0jZW5kaWYgLyogQ09ORklHX0FDUElfTlVNQSAqLworI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX05VTUEgKi8KIAogCXJldHVybiAwOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfcmVnaXN0ZXJfaW9hcGljKTsKIAotaW50Ci1hY3BpX3VucmVnaXN0ZXJfaW9hcGljIChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSkKK2ludCBhY3BpX3VucmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGdzaV9iYXNlKQogewogCXJldHVybiBpb3NhcGljX3JlbW92ZShnc2lfYmFzZSk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyk7CiAKLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9CT09UICovCisjZW5kaWYJCQkJLyogQ09ORklHX0FDUEkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMgYi9hcmNoL2lhNjQva2VybmVsL2RvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmI4ZWZlLi4wMDAwMDAwCi0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoKLSAqIGFyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMKLSAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzY2hlZC1kb21haW5zIGJ1aWxkZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEplc3NlIEJhcm5lcwotICogQ29weXJpZ2h0IChDKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgotI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+Ci0KLSNkZWZpbmUgU0RfTk9ERVNfUEVSX0RPTUFJTiAxNgotCi0jaWZkZWYgQ09ORklHX05VTUEKLS8qKgotICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0byBpbmNsdWRlIGluIGEgc2NoZWRfZG9tYWluCi0gKiBAbm9kZTogbm9kZSB3aG9zZSBzY2hlZF9kb21haW4gd2UncmUgYnVpbGRpbmcKLSAqIEB1c2VkX25vZGVzOiBub2RlcyBhbHJlYWR5IGluIHRoZSBzY2hlZF9kb21haW4KLSAqCi0gKiBGaW5kIHRoZSBuZXh0IG5vZGUgdG8gaW5jbHVkZSBpbiBhIGdpdmVuIHNjaGVkdWxpbmcgZG9tYWluLiAgU2ltcGx5Ci0gKiBmaW5kcyB0aGUgY2xvc2VzdCBub2RlIG5vdCBhbHJlYWR5IGluIHRoZSBAdXNlZF9ub2RlcyBtYXAuCi0gKgotICogU2hvdWxkIHVzZSBub2RlbWFza190LgotICovCi1zdGF0aWMgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgKnVzZWRfbm9kZXMpCi17Ci0JaW50IGksIG4sIHZhbCwgbWluX3ZhbCwgYmVzdF9ub2RlID0gMDsKLQotCW1pbl92YWwgPSBJTlRfTUFYOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCS8qIFN0YXJ0IGF0IEBub2RlICovCi0JCW4gPSAobm9kZSArIGkpICUgTUFYX05VTU5PREVTOwotCi0JCWlmICghbnJfY3B1c19ub2RlKG4pKQotCQkJY29udGludWU7Ci0KLQkJLyogU2tpcCBhbHJlYWR5IHVzZWQgbm9kZXMgKi8KLQkJaWYgKHRlc3RfYml0KG4sIHVzZWRfbm9kZXMpKQotCQkJY29udGludWU7Ci0KLQkJLyogU2ltcGxlIG1pbiBkaXN0YW5jZSBzZWFyY2ggKi8KLQkJdmFsID0gbm9kZV9kaXN0YW5jZShub2RlLCBuKTsKLQotCQlpZiAodmFsIDwgbWluX3ZhbCkgewotCQkJbWluX3ZhbCA9IHZhbDsKLQkJCWJlc3Rfbm9kZSA9IG47Ci0JCX0KLQl9Ci0KLQlzZXRfYml0KGJlc3Rfbm9kZSwgdXNlZF9ub2Rlcyk7Ci0JcmV0dXJuIGJlc3Rfbm9kZTsKLX0KLQotLyoqCi0gKiBzY2hlZF9kb21haW5fbm9kZV9zcGFuIC0gZ2V0IGEgY3B1bWFzayBmb3IgYSBub2RlJ3Mgc2NoZWRfZG9tYWluCi0gKiBAbm9kZTogbm9kZSB3aG9zZSBjcHVtYXNrIHdlJ3JlIGNvbnN0cnVjdGluZwotICogQHNpemU6IG51bWJlciBvZiBub2RlcyB0byBpbmNsdWRlIGluIHRoaXMgc3BhbgotICoKLSAqIEdpdmVuIGEgbm9kZSwgY29uc3RydWN0IGEgZ29vZCBjcHVtYXNrIGZvciBpdHMgc2NoZWRfZG9tYWluIHRvIHNwYW4uICBJdAotICogc2hvdWxkIGJlIG9uZSB0aGF0IHByZXZlbnRzIHVubmVjZXNzYXJ5IGJhbGFuY2luZywgYnV0IGFsc28gc3ByZWFkcyB0YXNrcwotICogb3V0IG9wdGltYWxseS4KLSAqLwotc3RhdGljIGNwdW1hc2tfdCBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGludCBub2RlKQotewotCWludCBpOwotCWNwdW1hc2tfdCBzcGFuLCBub2RlbWFzazsKLQlERUNMQVJFX0JJVE1BUCh1c2VkX25vZGVzLCBNQVhfTlVNTk9ERVMpOwotCi0JY3B1c19jbGVhcihzcGFuKTsKLQliaXRtYXBfemVybyh1c2VkX25vZGVzLCBNQVhfTlVNTk9ERVMpOwotCi0Jbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobm9kZSk7Ci0JY3B1c19vcihzcGFuLCBzcGFuLCBub2RlbWFzayk7Ci0Jc2V0X2JpdChub2RlLCB1c2VkX25vZGVzKTsKLQotCWZvciAoaSA9IDE7IGkgPCBTRF9OT0RFU19QRVJfRE9NQUlOOyBpKyspIHsKLQkJaW50IG5leHRfbm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgdXNlZF9ub2Rlcyk7Ci0JCW5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKG5leHRfbm9kZSk7Ci0JCWNwdXNfb3Ioc3Bhbiwgc3Bhbiwgbm9kZW1hc2spOwotCX0KLQotCXJldHVybiBzcGFuOwotfQotI2VuZGlmCi0KLS8qCi0gKiBBdCB0aGUgbW9tZW50LCBDT05GSUdfU0NIRURfU01UIGlzIG5ldmVyIGRlZmluZWQsIGJ1dCBsZWF2ZSBpdCBpbiBzbyB3ZQotICogY2FuIHN3aXRjaCBpdCBvbiBlYXNpbHkgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIGNwdV9kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfY3B1c1tOUl9DUFVTXTsKLXN0YXRpYyBpbnQgY3B1X3RvX2NwdV9ncm91cChpbnQgY3B1KQotewotCXJldHVybiBjcHU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIHBoeXNfZG9tYWlucyk7Ci1zdGF0aWMgc3RydWN0IHNjaGVkX2dyb3VwIHNjaGVkX2dyb3VwX3BoeXNbTlJfQ1BVU107Ci1zdGF0aWMgaW50IGNwdV90b19waHlzX2dyb3VwKGludCBjcHUpCi17Ci0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCXJldHVybiBmaXJzdF9jcHUoY3B1X3NpYmxpbmdfbWFwW2NwdV0pOwotI2Vsc2UKLQlyZXR1cm4gY3B1OwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotLyoKLSAqIFRoZSBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyBjYW4ndCBoYW5kbGUgd2hhdCB3ZSB3YW50IHRvIGRvIHdpdGggbm9kZQotICogZ3JvdXBzLCBzbyByb2xsIG91ciBvd24uIE5vdyBlYWNoIG5vZGUgaGFzIGl0cyBvd24gbGlzdCBvZiBncm91cHMgd2hpY2gKLSAqIGdldHMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgotICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgbm9kZV9kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNjaGVkX2dyb3VwX25vZGVzW01BWF9OVU1OT0RFU107Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluLCBhbGxub2Rlc19kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfYWxsbm9kZXNbTUFYX05VTU5PREVTXTsKLQotc3RhdGljIGludCBjcHVfdG9fYWxsbm9kZXNfZ3JvdXAoaW50IGNwdSkKLXsKLQlyZXR1cm4gY3B1X3RvX25vZGUoY3B1KTsKLX0KLSNlbmRpZgotCi0vKgotICogQnVpbGQgc2NoZWQgZG9tYWlucyBmb3IgYSBnaXZlbiBzZXQgb2YgY3B1cyBhbmQgYXR0YWNoIHRoZSBzY2hlZCBkb21haW5zCi0gKiB0byB0aGUgaW5kaXZpZHVhbCBjcHVzCi0gKi8KLXZvaWQgYnVpbGRfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFNldCB1cCBkb21haW5zIGZvciBjcHVzIHNwZWNpZmllZCBieSB0aGUgY3B1X21hcC4KLQkgKi8KLQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewotCQlpbnQgZ3JvdXA7Ci0JCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gTlVMTCwgKnA7Ci0JCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhjcHVfdG9fbm9kZShpKSk7Ci0KLQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotCQlpZiAobnVtX29ubGluZV9jcHVzKCkKLQkJCQk+IFNEX05PREVTX1BFUl9ET01BSU4qY3B1c193ZWlnaHQobm9kZW1hc2spKSB7Ci0JCQlzZCA9ICZwZXJfY3B1KGFsbG5vZGVzX2RvbWFpbnMsIGkpOwotCQkJKnNkID0gU0RfQUxMTk9ERVNfSU5JVDsKLQkJCXNkLT5zcGFuID0gKmNwdV9tYXA7Ci0JCQlncm91cCA9IGNwdV90b19hbGxub2Rlc19ncm91cChpKTsKLQkJCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfYWxsbm9kZXNbZ3JvdXBdOwotCQkJcCA9IHNkOwotCQl9IGVsc2UKLQkJCXAgPSBOVUxMOwotCi0JCXNkID0gJnBlcl9jcHUobm9kZV9kb21haW5zLCBpKTsKLQkJKnNkID0gU0RfTk9ERV9JTklUOwotCQlzZC0+c3BhbiA9IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oY3B1X3RvX25vZGUoaSkpOwotCQlzZC0+cGFyZW50ID0gcDsKLQkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCAqY3B1X21hcCk7Ci0jZW5kaWYKLQotCQlwID0gc2Q7Ci0JCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBpKTsKLQkJZ3JvdXAgPSBjcHVfdG9fcGh5c19ncm91cChpKTsKLQkJKnNkID0gU0RfQ1BVX0lOSVQ7Ci0JCXNkLT5zcGFuID0gbm9kZW1hc2s7Ci0JCXNkLT5wYXJlbnQgPSBwOwotCQlzZC0+Z3JvdXBzID0gJnNjaGVkX2dyb3VwX3BoeXNbZ3JvdXBdOwotCi0jaWZkZWYgQ09ORklHX1NDSEVEX1NNVAotCQlwID0gc2Q7Ci0JCXNkID0gJnBlcl9jcHUoY3B1X2RvbWFpbnMsIGkpOwotCQlncm91cCA9IGNwdV90b19jcHVfZ3JvdXAoaSk7Ci0JCSpzZCA9IFNEX1NJQkxJTkdfSU5JVDsKLQkJc2QtPnNwYW4gPSBjcHVfc2libGluZ19tYXBbaV07Ci0JCWNwdXNfYW5kKHNkLT5zcGFuLCBzZC0+c3BhbiwgKmNwdV9tYXApOwotCQlzZC0+cGFyZW50ID0gcDsKLQkJc2QtPmdyb3VwcyA9ICZzY2hlZF9ncm91cF9jcHVzW2dyb3VwXTsKLSNlbmRpZgotCX0KLQotI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLQkvKiBTZXQgdXAgQ1BVIChzaWJsaW5nKSBncm91cHMgKi8KLQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewotCQljcHVtYXNrX3QgdGhpc19zaWJsaW5nX21hcCA9IGNwdV9zaWJsaW5nX21hcFtpXTsKLQkJY3B1c19hbmQodGhpc19zaWJsaW5nX21hcCwgdGhpc19zaWJsaW5nX21hcCwgKmNwdV9tYXApOwotCQlpZiAoaSAhPSBmaXJzdF9jcHUodGhpc19zaWJsaW5nX21hcCkpCi0JCQljb250aW51ZTsKLQotCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9jcHVzLCB0aGlzX3NpYmxpbmdfbWFwLAotCQkJCQkJJmNwdV90b19jcHVfZ3JvdXApOwotCX0KLSNlbmRpZgotCi0JLyogU2V0IHVwIHBoeXNpY2FsIGdyb3VwcyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgewotCQljcHVtYXNrX3Qgbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2soaSk7Ci0KLQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7Ci0JCWlmIChjcHVzX2VtcHR5KG5vZGVtYXNrKSkKLQkJCWNvbnRpbnVlOwotCi0JCWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHNjaGVkX2dyb3VwX3BoeXMsIG5vZGVtYXNrLAotCQkJCQkJJmNwdV90b19waHlzX2dyb3VwKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotCWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHNjaGVkX2dyb3VwX2FsbG5vZGVzLCAqY3B1X21hcCwKLQkJCQkmY3B1X3RvX2FsbG5vZGVzX2dyb3VwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgewotCQkvKiBTZXQgdXAgbm9kZSBncm91cHMgKi8KLQkJc3RydWN0IHNjaGVkX2dyb3VwICpzZywgKnByZXY7Ci0JCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhpKTsKLQkJY3B1bWFza190IGRvbWFpbnNwYW47Ci0JCWNwdW1hc2tfdCBjb3ZlcmVkID0gQ1BVX01BU0tfTk9ORTsKLQkJaW50IGo7Ci0KLQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7Ci0JCWlmIChjcHVzX2VtcHR5KG5vZGVtYXNrKSkKLQkJCWNvbnRpbnVlOwotCi0JCWRvbWFpbnNwYW4gPSBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGkpOwotCQljcHVzX2FuZChkb21haW5zcGFuLCBkb21haW5zcGFuLCAqY3B1X21hcCk7Ci0KLQkJc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApLCBHRlBfS0VSTkVMKTsKLQkJc2NoZWRfZ3JvdXBfbm9kZXNbaV0gPSBzZzsKLQkJZm9yX2VhY2hfY3B1X21hc2soaiwgbm9kZW1hc2spIHsKLQkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGopOwotCQkJc2QtPmdyb3VwcyA9IHNnOwotCQkJaWYgKHNkLT5ncm91cHMgPT0gTlVMTCkgewotCQkJCS8qIFR1cm4gb2ZmIGJhbGFuY2luZyBpZiB3ZSBoYXZlIG5vIGdyb3VwcyAqLwotCQkJCXNkLT5mbGFncyA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFzZykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJIkNhbiBub3QgYWxsb2MgZG9tYWluIGdyb3VwIGZvciBub2RlICVkXG4iLCBpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNnLT5jcHVfcG93ZXIgPSAwOwotCQlzZy0+Y3B1bWFzayA9IG5vZGVtYXNrOwotCQljcHVzX29yKGNvdmVyZWQsIGNvdmVyZWQsIG5vZGVtYXNrKTsKLQkJcHJldiA9IHNnOwotCi0JCWZvciAoaiA9IDA7IGogPCBNQVhfTlVNTk9ERVM7IGorKykgewotCQkJY3B1bWFza190IHRtcCwgbm90Y292ZXJlZDsKLQkJCWludCBuID0gKGkgKyBqKSAlIE1BWF9OVU1OT0RFUzsKLQotCQkJY3B1c19jb21wbGVtZW50KG5vdGNvdmVyZWQsIGNvdmVyZWQpOwotCQkJY3B1c19hbmQodG1wLCBub3Rjb3ZlcmVkLCAqY3B1X21hcCk7Ci0JCQljcHVzX2FuZCh0bXAsIHRtcCwgZG9tYWluc3Bhbik7Ci0JCQlpZiAoY3B1c19lbXB0eSh0bXApKQotCQkJCWJyZWFrOwotCi0JCQlub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhuKTsKLQkJCWNwdXNfYW5kKHRtcCwgdG1wLCBub2RlbWFzayk7Ci0JCQlpZiAoY3B1c19lbXB0eSh0bXApKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFzZykgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiQ2FuIG5vdCBhbGxvYyBkb21haW4gZ3JvdXAgZm9yIG5vZGUgJWRcbiIsIGopOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2ctPmNwdV9wb3dlciA9IDA7Ci0JCQlzZy0+Y3B1bWFzayA9IHRtcDsKLQkJCWNwdXNfb3IoY292ZXJlZCwgY292ZXJlZCwgdG1wKTsKLQkJCXByZXYtPm5leHQgPSBzZzsKLQkJCXByZXYgPSBzZzsKLQkJfQotCQlwcmV2LT5uZXh0ID0gc2NoZWRfZ3JvdXBfbm9kZXNbaV07Ci0JfQotI2VuZGlmCi0KLQkvKiBDYWxjdWxhdGUgQ1BVIHBvd2VyIGZvciBwaHlzaWNhbCBwYWNrYWdlcyBhbmQgbm9kZXMgKi8KLQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewotCQlpbnQgcG93ZXI7Ci0JCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLQkJc2QgPSAmcGVyX2NwdShjcHVfZG9tYWlucywgaSk7Ci0JCXBvd2VyID0gU0NIRURfTE9BRF9TQ0FMRTsKLQkJc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyID0gcG93ZXI7Ci0jZW5kaWYKLQotCQlzZCA9ICZwZXJfY3B1KHBoeXNfZG9tYWlucywgaSk7Ci0JCXBvd2VyID0gU0NIRURfTE9BRF9TQ0FMRSArIFNDSEVEX0xPQURfU0NBTEUgKgotCQkJCShjcHVzX3dlaWdodChzZC0+Z3JvdXBzLT5jcHVtYXNrKS0xKSAvIDEwOwotCQlzZC0+Z3JvdXBzLT5jcHVfcG93ZXIgPSBwb3dlcjsKLQotI2lmZGVmIENPTkZJR19OVU1BCi0JCXNkID0gJnBlcl9jcHUoYWxsbm9kZXNfZG9tYWlucywgaSk7Ci0JCWlmIChzZC0+Z3JvdXBzKSB7Ci0JCQlwb3dlciA9IFNDSEVEX0xPQURfU0NBTEUgKyBTQ0hFRF9MT0FEX1NDQUxFICoKLQkJCQkoY3B1c193ZWlnaHQoc2QtPmdyb3Vwcy0+Y3B1bWFzayktMSkgLyAxMDsKLQkJCXNkLT5ncm91cHMtPmNwdV9wb3dlciA9IHBvd2VyOwotCQl9Ci0jZW5kaWYKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgewotCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnID0gc2NoZWRfZ3JvdXBfbm9kZXNbaV07Ci0JCWludCBqOwotCi0JCWlmIChzZyA9PSBOVUxMKQotCQkJY29udGludWU7Ci1uZXh0X3NnOgotCQlmb3JfZWFjaF9jcHVfbWFzayhqLCBzZy0+Y3B1bWFzaykgewotCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0JCQlpbnQgcG93ZXI7Ci0KLQkJCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBqKTsKLQkJCWlmIChqICE9IGZpcnN0X2NwdShzZC0+Z3JvdXBzLT5jcHVtYXNrKSkgewotCQkJCS8qCi0JCQkJICogT25seSBhZGQgInBvd2VyIiBvbmNlIGZvciBlYWNoCi0JCQkJICogcGh5c2ljYWwgcGFja2FnZS4KLQkJCQkgKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXBvd2VyID0gU0NIRURfTE9BRF9TQ0FMRSArIFNDSEVEX0xPQURfU0NBTEUgKgotCQkJCShjcHVzX3dlaWdodChzZC0+Z3JvdXBzLT5jcHVtYXNrKS0xKSAvIDEwOwotCi0JCQlzZy0+Y3B1X3Bvd2VyICs9IHBvd2VyOwotCQl9Ci0JCXNnID0gc2ctPm5leHQ7Ci0JCWlmIChzZyAhPSBzY2hlZF9ncm91cF9ub2Rlc1tpXSkKLQkJCWdvdG8gbmV4dF9zZzsKLQl9Ci0jZW5kaWYKLQotCS8qIEF0dGFjaCB0aGUgZG9tYWlucyAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7Ci0JCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLQkJc2QgPSAmcGVyX2NwdShjcHVfZG9tYWlucywgaSk7Ci0jZWxzZQotCQlzZCA9ICZwZXJfY3B1KHBoeXNfZG9tYWlucywgaSk7Ci0jZW5kaWYKLQkJY3B1X2F0dGFjaF9kb21haW4oc2QsIGkpOwotCX0KLX0KLS8qCi0gKiBTZXQgdXAgc2NoZWR1bGVyIGRvbWFpbnMgYW5kIGdyb3Vwcy4gIENhbGxlcnMgbXVzdCBob2xkIHRoZSBob3RwbHVnIGxvY2suCi0gKi8KLXZvaWQgYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQotewotCWNwdW1hc2tfdCBjcHVfZGVmYXVsdF9tYXA7Ci0KLQkvKgotCSAqIFNldHVwIG1hc2sgZm9yIGNwdXMgd2l0aG91dCBzcGVjaWFsIGNhc2Ugc2NoZWR1bGluZyByZXF1aXJlbWVudHMuCi0JICogRm9yIG5vdyB0aGlzIGp1c3QgZXhjbHVkZXMgaXNvbGF0ZWQgY3B1cywgYnV0IGNvdWxkIGJlIHVzZWQgdG8KLQkgKiBleGNsdWRlIG90aGVyIHNwZWNpYWwgY2FzZXMgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQljcHVzX2FuZG5vdChjcHVfZGVmYXVsdF9tYXAsICpjcHVfbWFwLCBjcHVfaXNvbGF0ZWRfbWFwKTsKLQotCWJ1aWxkX3NjaGVkX2RvbWFpbnMoJmNwdV9kZWZhdWx0X21hcCk7Ci19Ci0KLXZvaWQgYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQotewotI2lmZGVmIENPTkZJR19OVU1BCi0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhpKTsKLQkJc3RydWN0IHNjaGVkX2dyb3VwICpvbGRzZywgKnNnID0gc2NoZWRfZ3JvdXBfbm9kZXNbaV07Ci0KLQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7Ci0JCWlmIChjcHVzX2VtcHR5KG5vZGVtYXNrKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzZyA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXNnID0gc2ctPm5leHQ7Ci1uZXh0X3NnOgotCQlvbGRzZyA9IHNnOwotCQlzZyA9IHNnLT5uZXh0OwotCQlrZnJlZShvbGRzZyk7Ci0JCWlmIChvbGRzZyAhPSBzY2hlZF9ncm91cF9ub2Rlc1tpXSkKLQkJCWdvdG8gbmV4dF9zZzsKLQkJc2NoZWRfZ3JvdXBfbm9kZXNbaV0gPSBOVUxMOwotCX0KLSNlbmRpZgotfQotCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKaW5kZXggOWJlNTNlMS4uYmEwYjZhMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9rcmVncy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMjA0LDkgKzIwNCw2IEBACiAocDYpCWJyLmNvbmQuZHBudCAubWFwCiAJOzsKIC5kb25lOgotKHA2KQlzc20gcHNyLmljCQkJLy8gaWYgd2UgaGFkIHRvIG1hcCwgcmVlbmFibGUgdGhlIHBzci5pYyBiaXQgRklSU1QhISEKLQk7OwotKHA2KQlzcmx6LmQKIAlsZDggc3A9W3IyMV0JCQkvLyBsb2FkIGtlcm5lbCBzdGFjayBwb2ludGVyIG9mIG5ldyB0YXNrCiAJbW92IElBNjRfS1IoQ1VSUkVOVCk9aW4wCS8vIHVwZGF0ZSAiY3VycmVudCIgYXBwbGljYXRpb24gcmVnaXN0ZXIKIAltb3Ygcjg9cjEzCQkJLy8gcmV0dXJuIHBvaW50ZXIgdG8gcHJldmlvdXNseSBydW5uaW5nIHRhc2sKQEAgLTIzNCw2ICsyMzEsOSBAQAogCW1vdiBJQTY0X0tSKENVUlJFTlRfU1RBQ0spPXIyNgkvLyByZW1lbWJlciBsYXN0IHBhZ2Ugd2UgbWFwcGVkLi4uCiAJOzsKIAlpdHIuZCBkdHJbcjI1XT1yMjMJCS8vIHdpcmUgaW4gbmV3IG1hcHBpbmcuLi4KKwlzc20gcHNyLmljCQkJLy8gcmVlbmFibGUgdGhlIHBzci5pYyBiaXQKKwk7OworCXNybHouZAogCWJyLmNvbmQuc3B0ayAuZG9uZQogRU5EKGlhNjRfc3dpdGNoX3RvKQogCkBAIC00NzAsNiArNDcwLDI5IEBACiAJYnIuY29uZC5zcHRrLm1hbnkgYjcKIEVORChsb2FkX3N3aXRjaF9zdGFjaykKIAorR0xPQkFMX0VOVFJZKHByZWZldGNoX3N0YWNrKQorCWFkZCByMTQgPSAtSUE2NF9TV0lUQ0hfU1RBQ0tfU0laRSwgc3AKKwlhZGQgcjE1ID0gSUE2NF9UQVNLX1RIUkVBRF9LU1BfT0ZGU0VULCBpbjAKKwk7OworCWxkOCByMTYgPSBbcjE1XQkJCQkvLyBsb2FkIG5leHQncyBzdGFjayBwb2ludGVyCisJbGZldGNoLmZhdWx0LmV4Y2wgW3IxNF0sIDEyOAorCTs7CisJbGZldGNoLmZhdWx0LmV4Y2wgW3IxNF0sIDEyOAorCWxmZXRjaC5mYXVsdCBbcjE2XSwgMTI4CisJOzsKKwlsZmV0Y2guZmF1bHQuZXhjbCBbcjE0XSwgMTI4CisJbGZldGNoLmZhdWx0IFtyMTZdLCAxMjgKKwk7OworCWxmZXRjaC5mYXVsdC5leGNsIFtyMTRdLCAxMjgKKwlsZmV0Y2guZmF1bHQgW3IxNl0sIDEyOAorCTs7CisJbGZldGNoLmZhdWx0LmV4Y2wgW3IxNF0sIDEyOAorCWxmZXRjaC5mYXVsdCBbcjE2XSwgMTI4CisJOzsKKwlsZmV0Y2guZmF1bHQgW3IxNl0sIDEyOAorCWJyLnJldC5zcHRrLm1hbnkgcnAKK0VORChwcmVmZXRjaF9zd2l0Y2hfc3RhY2spCisKIEdMT0JBTF9FTlRSWShleGVjdmUpCiAJbW92IHIxNT1fX05SX2V4ZWN2ZQkJCS8vIHB1dCBzeXNjYWxsIG51bWJlciBpbiBwbGFjZQogCWJyZWFrIF9fQlJFQUtfU1lTQ0FMTApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwppbmRleCA3ZDc2ODRhLi4yZGRiYWM2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwpAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3NhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9nYXRlLlMgYi9hcmNoL2lhNjQva2VybmVsL2dhdGUuUwppbmRleCA4Njk0OGNlLi44NjA2NGNhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2dhdGUuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2dhdGUuUwpAQCAtMTAsNyArMTAsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCmluZGV4IDhkM2E5MjkuLmJmZTY1YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgogI2luY2x1ZGUgPGFzbS9rcmVncy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BhbC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMgYi9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYwppbmRleCA3OTM2YjYyLi41NzQwODRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYwpAQCAtNTYxLDcgKzU2MSw3IEBACiAJcmV0dXJuIChpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLmNvdW50ID4gMSk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiByZWdpc3Rlcl9pbnRyICh1bnNpZ25lZCBpbnQgZ3NpLCBpbnQgdmVjdG9yLCB1bnNpZ25lZCBjaGFyIGRlbGl2ZXJ5LAogCSAgICAgICB1bnNpZ25lZCBsb25nIHBvbGFyaXR5LCB1bnNpZ25lZCBsb25nIHRyaWdnZXIpCiB7CkBAIC01NzYsNyArNTc2LDcgQEAKIAlpbmRleCA9IGZpbmRfaW9zYXBpYyhnc2kpOwogCWlmIChpbmRleCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIElPU0FQSUMgZm9yIEdTSSAldVxuIiwgX19GVU5DVElPTl9fLCBnc2kpOwotCQlyZXR1cm47CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlvc2FwaWNfYWRkcmVzcyA9IGlvc2FwaWNfbGlzdHNbaW5kZXhdLmFkZHI7CkBAIC01ODcsNyArNTg3LDcgQEAKIAkJcnRlID0gaW9zYXBpY19hbGxvY19ydGUoKTsKIAkJaWYgKCFydGUpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQlydGVfaW5kZXggPSBnc2kgLSBnc2lfYmFzZTsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCQlzdHJ1Y3QgaW9zYXBpY19pbnRyX2luZm8gKmluZm8gPSAmaW9zYXBpY19pbnRyX2luZm9bdmVjdG9yXTsKIAkJaWYgKGluZm8tPnRyaWdnZXIgIT0gdHJpZ2dlciB8fCBpbmZvLT5wb2xhcml0eSAhPSBwb2xhcml0eSkgewogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGludGVycnVwdFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCkBAIC02MjMsNiArNjIzLDcgQEAKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHZlY3RvciwgaWRlc2MtPmhhbmRsZXItPnR5cGVuYW1lLCBpcnFfdHlwZS0+dHlwZW5hbWUpOwogCQlpZGVzYy0+aGFuZGxlciA9IGlycV90eXBlOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtNzEwLDcgKzcxMSw3IEBACiBpb3NhcGljX3JlZ2lzdGVyX2ludHIgKHVuc2lnbmVkIGludCBnc2ksCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIHBvbGFyaXR5LCB1bnNpZ25lZCBsb25nIHRyaWdnZXIpCiB7Ci0JaW50IHZlY3RvciwgbWFzayA9IDE7CisJaW50IHZlY3RvciwgbWFzayA9IDEsIGVycjsKIAl1bnNpZ25lZCBpbnQgZGVzdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpb3NhcGljX3J0ZV9pbmZvICpydGU7CkBAIC03MzcsOCArNzM4LDggQEAKIAl2ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3RvcihBVVRPX0FTU0lHTik7CiAJaWYgKHZlY3RvciA8IDApIHsKIAkJdmVjdG9yID0gaW9zYXBpY19maW5kX3NoYXJhYmxlX3ZlY3Rvcih0cmlnZ2VyLCBwb2xhcml0eSk7Ci0JCWlmICh2ZWN0b3IgPCAwKQotCQkJcGFuaWMoIiVzOiBvdXQgb2YgaW50ZXJydXB0IHZlY3RvcnMhXG4iLCBfX0ZVTkNUSU9OX18pOworICAJCWlmICh2ZWN0b3IgPCAwKQorCQkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjcCh2ZWN0b3IpLT5sb2NrLCBmbGFncyk7CkBAIC03NTMsOCArNzU0LDEzIEBACiAJCX0KIAogCQlkZXN0ID0gZ2V0X3RhcmdldF9jcHUoZ3NpLCB2ZWN0b3IpOwotCQlyZWdpc3Rlcl9pbnRyKGdzaSwgdmVjdG9yLCBJT1NBUElDX0xPV0VTVF9QUklPUklUWSwKKwkJZXJyID0gcmVnaXN0ZXJfaW50cihnc2ksIHZlY3RvciwgSU9TQVBJQ19MT1dFU1RfUFJJT1JJVFksCiAJCQkgICAgICBwb2xhcml0eSwgdHJpZ2dlcik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlzcGluX3VubG9jaygmaW9zYXBpY19sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjcCh2ZWN0b3IpLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAKIAkJLyoKIAkJICogSWYgdGhlIHZlY3RvciBpcyBzaGFyZWQgYW5kIGFscmVhZHkgdW5tYXNrZWQgZm9yCkBAIC03NzYsNyArNzgyLDYgQEAKIAlyZXR1cm4gdmVjdG9yOwogfQogCi0jaWZkZWYgQ09ORklHX0FDUElfREVBTExPQ0FURV9JUlEKIHZvaWQKIGlvc2FwaWNfdW5yZWdpc3Rlcl9pbnRyICh1bnNpZ25lZCBpbnQgZ3NpKQogewpAQCAtODU5LDcgKzg2NCw2IEBACiAJc3Bpbl91bmxvY2soJmlvc2FwaWNfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlc2MtPmxvY2ssIGZsYWdzKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUSAqLwogCiAvKgogICogQUNQSSBjYWxscyB0aGlzIHdoZW4gaXQgZmluZHMgYW4gZW50cnkgZm9yIGEgcGxhdGZvcm0gaW50ZXJydXB0LgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMKaW5kZXggMjhmMmFhZC4uMjA1ZDk4MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycS5jCkBAIC05MSwyMyArOTEsOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotLyoKLSAqIFRoaXMgaXMgdXBkYXRlZCB3aGVuIHRoZSB1c2VyIHNldHMgaXJxIGFmZmluaXR5IHZpYSAvcHJvYwotICovCi1zdGF0aWMgY3B1bWFza190IF9fY2FjaGVsaW5lX2FsaWduZWQgcGVuZGluZ19pcnFfY3B1bWFza1tOUl9JUlFTXTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBlbmRpbmdfaXJxX3JlZGlyW0JJVFNfVE9fTE9OR1MoTlJfSVJRUyldOwotCiBzdGF0aWMgY2hhciBpcnFfcmVkaXIgW05SX0lSUVNdOyAvLyA9IHsgWzAgLi4uIE5SX0lSUVMtMV0gPSAxIH07CiAKLS8qCi0gKiBBcmNoIHNwZWNpZmljIHJvdXRpbmUgZm9yIGRlZmVycmVkIHdyaXRlIHRvIGlvc2FwaWMgcnRlIHRvIHJlcHJvZ3JhbQotICogaW50ciBkZXN0aW5hdGlvbi4KLSAqLwotdm9pZCBwcm9jX3NldF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2tfdmFsKQotewotCXBlbmRpbmdfaXJxX2NwdW1hc2tbaXJxXSA9IG1hc2tfdmFsOwotfQotCiB2b2lkIHNldF9pcnFfYWZmaW5pdHlfaW5mbyAodW5zaWduZWQgaW50IGlycSwgaW50IGh3aWQsIGludCByZWRpcikKIHsKIAljcHVtYXNrX3QgbWFzayA9IENQVV9NQVNLX05PTkU7CkBAIC0xMTYsMzIgKzEwMSwxMCBAQAogCiAJaWYgKGlycSA8IE5SX0lSUVMpIHsKIAkJaXJxX2FmZmluaXR5W2lycV0gPSBtYXNrOworCQlzZXRfaXJxX2luZm8oaXJxLCBtYXNrKTsKIAkJaXJxX3JlZGlyW2lycV0gPSAoY2hhcikgKHJlZGlyICYgMHhmZik7CiAJfQogfQotCi0KLXZvaWQgbW92ZV9pcnEoaW50IGlycSkKLXsKLQkvKiBub3RlIC0gd2UgaG9sZCBkZXNjLT5sb2NrICovCi0JY3B1bWFza190IHRtcDsKLQlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2NwKGlycSk7Ci0JaW50IHJlZGlyID0gdGVzdF9iaXQoaXJxLCBwZW5kaW5nX2lycV9yZWRpcik7Ci0KLQlpZiAodW5saWtlbHkoIWRlc2MtPmhhbmRsZXItPnNldF9hZmZpbml0eSkpCi0JCXJldHVybjsKLQotCWlmICghY3B1c19lbXB0eShwZW5kaW5nX2lycV9jcHVtYXNrW2lycV0pKSB7Ci0JCWNwdXNfYW5kKHRtcCwgcGVuZGluZ19pcnFfY3B1bWFza1tpcnFdLCBjcHVfb25saW5lX21hcCk7Ci0JCWlmICh1bmxpa2VseSghY3B1c19lbXB0eSh0bXApKSkgewotCQkJZGVzYy0+aGFuZGxlci0+c2V0X2FmZmluaXR5KGlycSB8IChyZWRpciA/IElBNjRfSVJRX1JFRElSRUNURUQgOiAwKSwKLQkJCQkJCSAgICBwZW5kaW5nX2lycV9jcHVtYXNrW2lycV0pOwotCQl9Ci0JCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfY3B1bWFza1tpcnFdKTsKLQl9Ci19Ci0KLQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUyBiL2FyY2gvaWE2NC9rZXJuZWwvaXZ0LlMKaW5kZXggM2JiM2ExMy4uM2JhODM4NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2l2dC5TCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSA8YXNtL2JyZWFrLmg+CiAjaW5jbHVkZSA8YXNtL2lhMzIuaD4KICNpbmNsdWRlIDxhc20va3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvanByb2Jlcy5TIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKaW5kZXggYjdmYTNjYy4uMjMyMzM3NyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAkvKgogCSAqIHZvaWQganByb2JlX2JyZWFrKHZvaWQpCiAJICovCisJLnNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgogRU5UUlkoanByb2JlX2JyZWFrKQogCWJyZWFrLm0gMHg4MDMwMAogRU5EKGpwcm9iZV9icmVhaykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggODg0ZjVjZC4uNDcxMDg2YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTg3LDEyICs4NywyNSBAQAogICogaXMgSVAgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gYW5kIHVwZGF0ZSB0aGUga3Byb2JlCiAgKiBpbnN0IGZsYWcgYWNjb3JkaW5nbHkKICAqLwotc3RhdGljIHZvaWQgdXBkYXRlX2twcm9iZV9pbnN0X2ZsYWcodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwgdWludCBtYWpvcl9vcGNvZGUsCi0JdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyB1cGRhdGVfa3Byb2JlX2luc3RfZmxhZyh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LAorCQkJCQkgICAgICB1aW50IG1ham9yX29wY29kZSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwKKwkJCQkJICAgICAgc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlwLT5haW5zbi5pbnN0X2ZsYWcgPSAwOwogCXAtPmFpbnNuLnRhcmdldF9icl9yZWcgPSAwOwogCisJLyogQ2hlY2sgZm9yIEJyZWFrIGluc3RydWN0aW9uCisgCSAqIEJpdHMgMzc6NDAgTWFqb3Igb3Bjb2RlIHRvIGJlIHplcm8KKwkgKiBCaXRzIDI3OjMyIFg2IHRvIGJlIHplcm8KKwkgKiBCaXRzIDMyOjM1IFgzIHRvIGJlIHplcm8KKwkgKi8KKwlpZiAoKCFtYWpvcl9vcGNvZGUpICYmICghKChrcHJvYmVfaW5zdCA+PiAyNykgJiAweDFGRikpICkgeworCQkvKiBpcyBhIGJyZWFrIGluc3RydWN0aW9uICovCisJIAlwLT5haW5zbi5pbnN0X2ZsYWcgfD0gSU5TVF9GTEFHX0JSRUFLX0lOU1Q7CisJCXJldHVybjsKKwl9CisKIAlpZiAoYnVuZGxlX2VuY29kaW5nW3RlbXBsYXRlXVtzbG90XSA9PSBCKSB7CiAJCXN3aXRjaCAobWFqb3Jfb3Bjb2RlKSB7CiAJCSAgY2FzZSBJTkRJUkVDVF9DQUxMX09QQ09ERToKQEAgLTEyNiw4ICsxMzksMTAgQEAKICAqIFJldHVybnMgMCBpZiBzdXBwb3J0ZWQKICAqIFJldHVybnMgLUVJTlZBTCBpZiB1bnN1cHBvcnRlZAogICovCi1zdGF0aWMgaW50IHVuc3VwcG9ydGVkX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwgdWludCBtYWpvcl9vcGNvZGUsCi0JdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgX19rcHJvYmVzIHVuc3VwcG9ydGVkX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwKKwkJCQkgICAgICB1aW50IG1ham9yX29wY29kZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LAorCQkJCSAgICAgIHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKIApAQCAtMTY4LDggKzE4Myw5IEBACiAgKiBvbiB3aGljaCB3ZSBhcmUgaW5zZXJ0aW5nIGtwcm9iZSBpcyBjbXAgaW5zdHJ1Y3Rpb24KICAqIHdpdGggY3R5cGUgYXMgdW5jLgogICovCi1zdGF0aWMgdWludCBpc19jbXBfY3R5cGVfdW5jX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCBzbG90LCB1aW50IG1ham9yX29wY29kZSwKLXVuc2lnbmVkIGxvbmcga3Byb2JlX2luc3QpCitzdGF0aWMgdWludCBfX2twcm9iZXMgaXNfY21wX2N0eXBlX3VuY19pbnN0KHVpbnQgdGVtcGxhdGUsIHVpbnQgc2xvdCwKKwkJCQkJICAgIHVpbnQgbWFqb3Jfb3Bjb2RlLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCkKIHsKIAljbXBfaW5zdF90IGNtcF9pbnN0OwogCXVpbnQgY3R5cGVfdW5jID0gMDsKQEAgLTIwMSw4ICsyMTcsMTAgQEAKICAqIEluIHRoaXMgZnVuY3Rpb24gd2Ugb3ZlcnJpZGUgdGhlIGJ1bmRsZSB3aXRoCiAgKiB0aGUgYnJlYWsgaW5zdHJ1Y3Rpb24gYXQgdGhlIGdpdmVuIHNsb3QuCiAgKi8KLXN0YXRpYyB2b2lkIHByZXBhcmVfYnJlYWtfaW5zdCh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LCB1aW50IG1ham9yX29wY29kZSwKLQl1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LCBzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHByZXBhcmVfYnJlYWtfaW5zdCh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LAorCQkJCQkgdWludCBtYWpvcl9vcGNvZGUsCisJCQkJCSB1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LAorCQkJCQkgc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGJyZWFrX2luc3QgPSBCUkVBS19JTlNUOwogCWJ1bmRsZV90ICpidW5kbGUgPSAmcC0+YWluc24uaW5zbi5idW5kbGU7CkBAIC0yNzEsNyArMjg5LDggQEAKIAkJJiYgYWRkciA8ICh1bnNpZ25lZCBsb25nKV9fZW5kX2l2dF90ZXh0KTsKIH0KIAotc3RhdGljIGludCB2YWxpZF9rcHJvYmVfYWRkcihpbnQgdGVtcGxhdGUsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW50IF9fa3Byb2JlcyB2YWxpZF9rcHJvYmVfYWRkcihpbnQgdGVtcGxhdGUsIGludCBzbG90LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaWYgKChzbG90ID4gMikgfHwgKChidW5kbGVfZW5jb2RpbmdbdGVtcGxhdGVdWzFdID09IEwpICYmIHNsb3QgPiAxKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdHRlbXB0aW5nIHRvIGluc2VydCB1bmFsaWduZWQga3Byb2JlICIKQEAgLTMyMyw3ICszNDIsNyBAQAogICogICAgLSBjbGVhbnVwIGJ5IG1hcmtpbmcgdGhlIGluc3RhbmNlIGFzIHVudXNlZAogICogICAgLSBsb25nIGp1bXAgYmFjayB0byB0aGUgb3JpZ2luYWwgcmV0dXJuIGFkZHJlc3MKICAqLwotaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTM4MSw3ICs0MDAsOCBAQAogICAgICAgICByZXR1cm4gMTsKIH0KIAotdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnAsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CiAKQEAgLTM5OSw3ICs0MTksNyBAQAogCX0KIH0KIAotaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK2ludCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyOwogCXVuc2lnbmVkIGxvbmcgKmtwcm9iZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgKikoYWRkciAmIH4weEZVTEwpOwpAQCAtNDMwLDcgKzQ1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOwogCXVuc2lnbmVkIGxvbmcgYXJtX2FkZHIgPSBhZGRyICYgfjB4RlVMTDsKQEAgLTQzOSw3ICs0NTksNyBAQAogCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2YoYnVuZGxlX3QpKTsKIH0KIAotdm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CiAJdW5zaWduZWQgbG9uZyBhcm1fYWRkciA9IGFkZHIgJiB+MHhGVUxMOwpAQCAtNDQ5LDcgKzQ2OSw3IEBACiAJZmx1c2hfaWNhY2hlX3JhbmdlKGFybV9hZGRyLCBhcm1fYWRkciArIHNpemVvZihidW5kbGVfdCkpOwogfQogCi12b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiB9CiAKQEAgLTQ2MSw3ICs0ODEsNyBAQAogICogdG8gb3JpZ2luYWwgc3RhY2sgYWRkcmVzcywgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gZml4dXAgdGhlCiAgKiByZWxhdGl2ZSBJUCBhZGRyZXNzIGFuZC9vciBmaXh1cCBicmFuY2ggcmVnaXN0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKICAgCXVuc2lnbmVkIGxvbmcgYnVuZGxlX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcpICgmcC0+b3Bjb2RlLmJ1bmRsZSkpICYgfjB4RlVMTDsKICAgCXVuc2lnbmVkIGxvbmcgcmVzdW1lX2FkZHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICYgfjB4RlVMTDsKQEAgLTUyOCwxMyArNTQ4LDE2IEBACiAgIAlpYTY0X3BzcihyZWdzKS0+c3MgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBwcmVwYXJlX3NzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHByZXBhcmVfc3Moc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBidW5kbGVfYWRkciA9ICh1bnNpZ25lZCBsb25nKSAmcC0+b3Bjb2RlLmJ1bmRsZTsKIAl1bnNpZ25lZCBsb25nIHNsb3QgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICYgMHhmOwogCi0JLyogVXBkYXRlIGluc3RydWN0aW9uIHBvaW50ZXIgKElJUCkgYW5kIHNsb3QgbnVtYmVyIChJUFNSLnJpKSAqLwotCXJlZ3MtPmNyX2lpcCA9IGJ1bmRsZV9hZGRyICYgfjB4RlVMTDsKKwkvKiBzaW5nbGUgc3RlcCBpbmxpbmUgaWYgYnJlYWsgaW5zdHJ1Y3Rpb24gKi8KKwlpZiAocC0+YWluc24uaW5zdF9mbGFnID09IElOU1RfRkxBR19CUkVBS19JTlNUKQorCQlyZWdzLT5jcl9paXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICYgfjB4RlVMTDsKKwllbHNlCisJCXJlZ3MtPmNyX2lpcCA9IGJ1bmRsZV9hZGRyICYgfjB4RlVMTDsKIAogCWlmIChzbG90ID4gMikKIAkJc2xvdCA9IDA7CkBAIC01NDUsNyArNTY4LDM5IEBACiAJaWE2NF9wc3IocmVncyktPnNzID0gMTsKIH0KIAotc3RhdGljIGludCBwcmVfa3Byb2Jlc19oYW5kbGVyKHN0cnVjdCBkaWVfYXJncyAqYXJncykKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGlzX2lhNjRfYnJlYWtfaW5zdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgc2xvdCA9IGlhNjRfcHNyKHJlZ3MpLT5yaTsKKwl1bnNpZ25lZCBpbnQgdGVtcGxhdGUsIG1ham9yX29wY29kZTsKKwl1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0OworCXVuc2lnbmVkIGxvbmcgKmtwcm9iZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5jcl9paXA7CisJYnVuZGxlX3QgYnVuZGxlOworCisJbWVtY3B5KCZidW5kbGUsIGtwcm9iZV9hZGRyLCBzaXplb2YoYnVuZGxlX3QpKTsKKwl0ZW1wbGF0ZSA9IGJ1bmRsZS5xdWFkMC50ZW1wbGF0ZTsKKworCS8qIE1vdmUgdG8gc2xvdCAyLCBpZiBidW5kbGUgaXMgTUxYIHR5cGUgYW5kIGtwcm9iZSBzbG90IGlzIDEgKi8KKwlpZiAoc2xvdCA9PSAxICYmIGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bMV0gPT0gTCkKKyAgCQlzbG90Kys7CisKKwkvKiBHZXQgS3Byb2JlIHByb2JlIGluc3RydWN0aW9uIGF0IGdpdmVuIHNsb3QqLworCWdldF9rcHJvYmVfaW5zdCgmYnVuZGxlLCBzbG90LCAma3Byb2JlX2luc3QsICZtYWpvcl9vcGNvZGUpOworCisJLyogRm9yIGJyZWFrIGluc3RydWN0aW9uLAorCSAqIEJpdHMgMzc6NDAgTWFqb3Igb3Bjb2RlIHRvIGJlIHplcm8KKwkgKiBCaXRzIDI3OjMyIFg2IHRvIGJlIHplcm8KKwkgKiBCaXRzIDMyOjM1IFgzIHRvIGJlIHplcm8KKwkgKi8KKwlpZiAobWFqb3Jfb3Bjb2RlIHx8ICgoa3Byb2JlX2luc3QgPj4gMjcpICYgMHgxRkYpICkgeworCQkvKiBOb3QgYSBicmVhayBpbnN0cnVjdGlvbiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJcyBhIGJyZWFrIGluc3RydWN0aW9uICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIHByZV9rcHJvYmVzX2hhbmRsZXIoc3RydWN0IGRpZV9hcmdzICphcmdzKQogewogCXN0cnVjdCBrcHJvYmUgKnA7CiAJaW50IHJldCA9IDA7CkBAIC01NTgsNyArNjEzLDkgQEAKIAlpZiAoa3Byb2JlX3J1bm5pbmcoKSkgewogCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKIAkJaWYgKHApIHsKLQkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCWlmICggKGtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUykgJiYKKwkgCQkgICAgIChwLT5haW5zbi5pbnN0X2ZsYWcgPT0gSU5TVF9GTEFHX0JSRUFLX0lOU1QpKSB7CisgIAkJCQlpYTY0X3BzcihyZWdzKS0+c3MgPSAwOwogCQkJCXVubG9ja19rcHJvYmVzKCk7CiAJCQkJZ290byBub19rcHJvYmU7CiAJCQl9CkBAIC01OTIsNiArNjQ5LDE5IEBACiAJcCA9IGdldF9rcHJvYmUoYWRkcik7CiAJaWYgKCFwKSB7CiAJCXVubG9ja19rcHJvYmVzKCk7CisJCWlmICghaXNfaWE2NF9icmVha19pbnN0KHJlZ3MpKSB7CisJCQkvKgorCQkJICogVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gd2FzIHJlbW92ZWQgcmlnaHQKKwkJCSAqIGFmdGVyIHdlIGhpdCBpdC4gIEFub3RoZXIgY3B1IGhhcyByZW1vdmVkCisJCQkgKiBlaXRoZXIgYSBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludAorCQkJICogYXQgdGhpcyBhZGRyZXNzLiAgSW4gZWl0aGVyIGNhc2UsIG5vIGZ1cnRoZXIKKwkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlLgorCQkJICovCisJCQlyZXQgPSAxOworCisJCX0KKworCQkvKiBOb3Qgb25lIG9mIG91ciBicmVhaywgbGV0IGtlcm5lbCBoYW5kbGUgaXQgKi8KIAkJZ290byBub19rcHJvYmU7CiAJfQogCkBAIC02MTYsNyArNjg2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBvc3Rfa3Byb2Jlc19oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBfX2twcm9iZXMgcG9zdF9rcHJvYmVzX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKCFrcHJvYmVfcnVubmluZygpKQogCQlyZXR1cm4gMDsKQEAgLTY0MSw3ICs3MTEsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGtwcm9iZXNfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGtwcm9iZXNfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKIHsKIAlpZiAoIWtwcm9iZV9ydW5uaW5nKCkpCiAJCXJldHVybiAwOwpAQCAtNjU5LDggKzcyOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSAgICAgdm9pZCAqZGF0YSkKK2ludCBfX2twcm9iZXMga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gKHN0cnVjdCBkaWVfYXJncyAqKWRhdGE7CiAJc3dpdGNoKHZhbCkgewpAQCAtNjgxLDcgKzc1MSw3IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1pbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGpwcm9iZSAqanAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGpwcm9iZSwga3ApOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICgoc3RydWN0IGZucHRyICopKGpwLT5lbnRyeSkpLT5pcDsKQEAgLTcwMyw3ICs3NzMsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJKnJlZ3MgPSBqcHJvYmVfc2F2ZWRfcmVnczsKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IDRlYmJmMzkuLjhkNDg0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtNDkxLDEyICs0OTEsNyBAQAogCXVud19pbml0X2Zyb21faW50ZXJydXB0aW9uKCZpbmZvLCBjdXJyZW50LCBwdCwgc3cpOwogCWlhNjRfZG9fc2hvd19zdGFjaygmaW5mbywgTlVMTCk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0JLyogcmVhZF90cnlsb2NrKCkgd291bGQgYmUgaGFuZHkuLi4gKi8KLQlpZiAoIXRhc2tsaXN0X2xvY2sud3JpdGVfbG9jaykKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLSNlbmRpZgotCXsKKwlpZiAocmVhZF90cnlsb2NrKCZ0YXNrbGlzdF9sb2NrKSkgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICp0OwogCQlkb19lYWNoX3RocmVhZCAoZywgdCkgewogCQkJaWYgKHQgPT0gY3VycmVudCkKQEAgLTUwNiwxMCArNTAxLDYgQEAKIAkJCXNob3dfc3RhY2sodCwgTlVMTCk7CiAJCX0gd2hpbGVfZWFjaF90aHJlYWQgKGcsIHQpOwogCX0KLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKCF0YXNrbGlzdF9sb2NrLndyaXRlX2xvY2spCi0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLSNlbmRpZgogCiAJcHJpbnRrKCJcbklOSVQgZHVtcCBjb21wbGV0ZS4gIFBsZWFzZSByZWJvb3Qgbm93LlxuIik7CiAJd2hpbGUgKDEpOwkJCS8qIGhhbmcgY2l0eSBpZiBubyBkZWJ1Z2dlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCBmMTIwMWFjLi4xNjUwMzUzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgpAQCAtNDk2LDcgKzQ5Nyw3IEBACiBzdGF0aWMgcGZtX3N0YXRzX3QJCXBmbV9zdGF0c1tOUl9DUFVTXTsKIHN0YXRpYyBwZm1fc2Vzc2lvbl90CQlwZm1fc2Vzc2lvbnM7CS8qIGdsb2JhbCBzZXNzaW9ucyBpbmZvcm1hdGlvbiAqLwogCi1zdGF0aWMgc3BpbmxvY2tfdCBwZm1fYWx0X2luc3RhbGxfY2hlY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBmbV9hbHRfaW5zdGFsbF9jaGVjayk7CiBzdGF0aWMgcGZtX2ludHJfaGFuZGxlcl9kZXNjX3QgICpwZm1fYWx0X2ludHJfaGFuZGxlcjsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAJKnBlcmZtb25fZGlyOwpAQCAtMjIxNywxNSArMjIxOCwxNyBAQAogcGZtX2ZyZWVfZmQoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKIAogCS8qIAogCSAqIHRoZXJlIGllIG5vIGZkX3VuaW5zdGFsbCgpLCBzbyB3ZSBkbyBpdCBoZXJlCiAJICovCiAJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLSAgICAgICAgZmlsZXMtPmZkW2ZkXSA9IE5VTEw7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBOVUxMKTsKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAKLQlpZiAoZmlsZSkgcHV0X2ZpbHAoZmlsZSk7CisJaWYgKGZpbGUpCisJCXB1dF9maWxwKGZpbGUpOwogCXB1dF91bnVzZWRfZmQoZmQpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggODRmODlkYS4uMWY1YzI2ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtMzg0LDcgKzM4NCw3IEBACiAJaWYgKGVhcmx5X2NvbnNvbGVfc2V0dXAoKmNtZGxpbmVfcCkgPT0gMCkKIAkJbWFya19ic3Bfb25saW5lKCk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkvKiBJbml0aWFsaXplIHRoZSBBQ1BJIGJvb3QtdGltZSB0YWJsZSBwYXJzZXIgKi8KIAlhY3BpX3RhYmxlX2luaXQoKTsKICMgaWZkZWYgQ09ORklHX0FDUElfTlVNQQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKIAljcHVfaW5pdCgpOwkvKiBpbml0aWFsaXplIHRoZSBib290c3RyYXAgQ1BVICovCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAlhY3BpX2Jvb3RfaW5pdCgpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCA5MmZmNDZhLi43MDZiNzczIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCkBAIC0zNiw3ICszNiw3IEBACiAJcGFyZW50ID0gJnN5c2ZzX25vZGVzW2NwdV90b19ub2RlKG51bSldOwogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIAkvKgogCSAqIElmIENQRUkgY2Fubm90IGJlIHJlLXRhcmdldHRlZCwgYW5kIHRoaXMgaXMKIAkgKiBDUEVJIHRhcmdldCwgdGhlbiBkb250IGNyZWF0ZSB0aGUgY29udHJvbCBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKaW5kZXggNDQ0MGM4My4uZjk3MDM1OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4JCS8qIEZvciB1bmJsYW5rX3NjcmVlbigpICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ICAgICAgIC8qIGZvciBFWFBPUlRfU1lNQk9MICovCiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9mcHN3YS5oPgogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CkBAIC0xMjIsNyArMTIzLDcgQEAKIH0KIAogdm9pZAotaWE2NF9iYWRfYnJlYWsgKHVuc2lnbmVkIGxvbmcgYnJlYWtfbnVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK19fa3Byb2JlcyBpYTY0X2JhZF9icmVhayAodW5zaWduZWQgbG9uZyBicmVha19udW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXNpZ2luZm9fdCBzaWdpbmZvOwogCWludCBzaWcsIGNvZGU7CkBAIC00NDQsNyArNDQ1LDcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXZvaWQKK3ZvaWQgX19rcHJvYmVzCiBpYTY0X2ZhdWx0ICh1bnNpZ25lZCBsb25nIHZlY3RvciwgdW5zaWduZWQgbG9uZyBpc3IsIHVuc2lnbmVkIGxvbmcgaWZhLAogCSAgICB1bnNpZ25lZCBsb25nIGlpbSwgdW5zaWduZWQgbG9uZyBpdGlyLCBsb25nIGFyZzUsIGxvbmcgYXJnNiwKIAkgICAgbG9uZyBhcmc3LCBzdHJ1Y3QgcHRfcmVncyByZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGE2NzZlNzkuLjMwZDg1NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKKwlLUFJPQkVTX1RFWFQKIAkqKC5nbnUubGlua29uY2UudCopCiAgICAgfQogICAudGV4dDIgOiBBVChBRERSKC50ZXh0MikgLSBMT0FEX09GRlNFVCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvZmx1c2guUyBiL2FyY2gvaWE2NC9saWIvZmx1c2guUwppbmRleCAzZTJjZmEyLi4yYTBkMjdmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2ZsdXNoLlMKKysrIGIvYXJjaC9pYTY0L2xpYi9mbHVzaC5TCkBAIC0yMCw2ICsyMCw3IEBACiAJICoKIAkgKglOb3RlOiAiaW4wIiBhbmQgImluMSIgYXJlIHByZXNlcnZlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogCSAqLworCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsImF4IgogR0xPQkFMX0VOVFJZKGZsdXNoX2ljYWNoZV9yYW5nZSkKIAogCS5wcm9sb2d1ZQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2xpYi9tZW1jcHlfbWNrLlMgYi9hcmNoL2lhNjQvbGliL21lbWNweV9tY2suUwppbmRleCA2ZjMwOGU2Li40NmM5MzMxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL21lbWNweV9tY2suUworKysgYi9hcmNoL2lhNjQvbGliL21lbWNweV9tY2suUwpAQCAtNjI1LDggKzYyNSwxMSBAQAogCWNscnJyYgogCTs7CiAJYWxsb2MJc2F2ZWRfcGZzX3N0YWNrPWFyLnBmcywzLDMsMywwCisJY21wLmx0CXA4LHAwPUEscjAKIAlzdWIJQiA9IGRzdDAsIHNhdmVkX2luMAkvLyBob3cgbWFueSBieXRlIGNvcGllZCBzbyBmYXIKIAk7OworKHA4KQltb3YJQSA9IDA7CQkJLy8gQSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUsIGNhcCBpdAorCTs7CiAJc3ViCUMgPSBBLCBCCiAJc3ViCUQgPSBzYXZlZF9pbjIsIEEKIAk7OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2ZhdWx0LmMgYi9hcmNoL2lhNjQvbW0vZmF1bHQuYwppbmRleCBmZjYyNTUxLi4zYzMyYWY5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL2lhNjQvbW0vZmF1bHQuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC03Niw3ICs3Nyw3IEBACiAJcmV0dXJuIHB0ZV9wcmVzZW50KHB0ZSk7CiB9CiAKLXZvaWQKK3ZvaWQgX19rcHJvYmVzCiBpYTY0X2RvX3BhZ2VfZmF1bHQgKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBpc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBzaWduYWwgPSBTSUdTRUdWLCBjb2RlID0gU0VHVl9NQVBFUlI7CkBAIC0yMjksOSArMjMwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChpYTY0X2RvbmVfd2l0aF9leGNlcHRpb24ocmVncykpCi0JCXJldHVybjsKLQogCS8qCiAJICogU2luY2Ugd2UgaGF2ZSBubyB2bWEncyBmb3IgcmVnaW9uIDUsIHdlIG1pZ2h0IGdldCBoZXJlIGV2ZW4gaWYgdGhlIGFkZHJlc3MgaXMKIAkgKiB2YWxpZCwgZHVlIHRvIHRoZSBWSFBUIHdhbGtlciBpbnNlcnRpbmcgYSBub24gcHJlc2VudCB0cmFuc2xhdGlvbiB0aGF0IGJlY29tZXMKQEAgLTI0Miw2ICsyNDAsOSBAQAogCWlmIChSRUdJT05fTlVNQkVSKGFkZHJlc3MpID09IDUgJiYgbWFwcGVkX2tlcm5lbF9wYWdlX2lzX3ByZXNlbnQoYWRkcmVzcykpCiAJCXJldHVybjsKIAorCWlmIChpYTY0X2RvbmVfd2l0aF9leGNlcHRpb24ocmVncykpCisJCXJldHVybjsKKwogCS8qCiAJICogT29wcy4gVGhlIGtlcm5lbCB0cmllZCB0byBhY2Nlc3Mgc29tZSBiYWQgcGFnZS4gV2UnbGwgaGF2ZSB0byB0ZXJtaW5hdGUgdGhpbmdzCiAJICogd2l0aCBleHRyZW1lIHByZWp1ZGljZS4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IDk5NzdjMTIuLjliNWRlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtNDk4LDEzICs0OTgsMTEgQEAKIAlyZXR1cm4gYWNwaV9wY2lfaXJxX2VuYWJsZShkZXYpOwogfQogCi0jaWZkZWYgQ09ORklHX0FDUElfREVBTExPQ0FURV9JUlEKIHZvaWQKIHBjaWJpb3NfZGlzYWJsZV9kZXZpY2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJYWNwaV9wY2lfaXJxX2Rpc2FibGUoZGV2KTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUSAqLwogCiB2b2lkCiBwY2liaW9zX2FsaWduX3Jlc291cmNlICh2b2lkICpkYXRhLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggNDU2NGVkMC4uOTA2NjIyZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogewogCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OwogCi0JZWxlbWVudCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CisJZWxlbWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbGVtZW50KSB7CiAJCWRldl9kYmcoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnkhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwppbmRleCA5ZmM3NDYzLi4wMWQxOGI3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKQEAgLTIzLDcgKzIzLDcgQEAKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2ludHJfcGRhKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pOwogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9pbnRyX3BkYShzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKTsKIAotZXh0ZXJuIGludCBzbl9mb3JjZV9pbnRlcnJ1cHRfZmxhZzsKK2ludCBzbl9mb3JjZV9pbnRlcnJ1cHRfZmxhZyA9IDE7CiBleHRlcm4gaW50IHNuX2lvaWZfaW5pdGVkOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKipzbl9pcnFfbGg7CiBzdGF0aWMgc3BpbmxvY2tfdCBzbl9pcnFfaW5mb19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOyAvKiBub24tSVJRIGxvY2sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwppbmRleCBhNTk0YWNhLi4xNDkwOGFkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCkBAIC01Niw3ICs1Niw3IEBACiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZGFfcywgcGRhX3BlcmNwdSk7CiAKLSNkZWZpbmUgTUFYX1BIWVNfTUVNT1JZCQkoMVVMIDw8IDQ5KQkvKiAxIFRCICovCisjZGVmaW5lIE1BWF9QSFlTX01FTU9SWQkJKDFVTCA8PCBJQTY0X01BWF9QSFlTX0JJVFMpCS8qIE1heCBwaHlzaWNhbCBhZGRyZXNzIHN1cHBvcnRlZCAqLwogCiBsYm9hcmRfdCAqcm9vdF9sYm9hcmRbTUFYX0NPTVBBQ1RfTk9ERVNdOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9wcm9jX2ZzLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9wcm9jX2ZzLmMKaW5kZXggNTFiZjgyNy4uYTA2NzE5ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25fcHJvY19mcy5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX3Byb2NfZnMuYwpAQCAtNTIsNyArNTIsNyBAQAogICogdGhlIGJyaWRnZSBjaGlwLiAgVGhlIGhhcmR3YXJlIHdpbGwgdGhlbiBzZW5kIGFuIGludGVycnVwdCBtZXNzYWdlIGlmIHRoZQogICogaW50ZXJydXB0IGxpbmUgaXMgYWN0aXZlLiAgVGhpcyBtaW1pY3MgYSBsZXZlbCBzZW5zaXRpdmUgaW50ZXJydXB0LgogICovCi1pbnQgc25fZm9yY2VfaW50ZXJydXB0X2ZsYWcgPSAxOworZXh0ZXJuIGludCBzbl9mb3JjZV9pbnRlcnJ1cHRfZmxhZzsKIAogc3RhdGljIGludCBzbl9mb3JjZV9pbnRlcnJ1cHRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKaW5kZXggMjU0ZmUxNS4uYjQ1ZGI1MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwpAQCAtMTkxLDcgKzE5MSw3IEBACiB7CiAJc3RydWN0IGN4X2RldiAqY3hfZGV2OwogCi0JY3hfZGV2ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGN4X2RldiksIEdGUF9LRVJORUwpOworCWN4X2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjeF9kZXYpLCBHRlBfS0VSTkVMKTsKIAlEQkcoImN4X2Rldj0gMHglcFxuIiwgY3hfZGV2KTsKIAlpZiAoY3hfZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCmluZGV4IGJiMWQ1Y2YuLmVkN2MyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKQEAgLTg4NSw2ICs4ODUsMTAgQEAKIAlwaWRfdCBwaWQ7CiAKIAorCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJLyoKIAkgKiB4cGNfcmVtb3RlX2NvcHlfYnVmZmVyIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciBidGVfY29weSduZwogCSAqIGJvdGggYSBwYXJ0aXRpb24ncyByZXNlcnZlZCBwYWdlIGFuZCBpdHMgWFBDIHZhcmlhYmxlcy4gSXRzIHNpemUgd2FzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMKaW5kZXggNzhjMTNkNi4uZTVjNmQzYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cG5ldC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAgKi8KIHN0YXRpYyB1NjQgeHBuZXRfYnJvYWRjYXN0X3BhcnRpdGlvbnM7CiAvKiBwcm90ZWN0IGFib3ZlICovCi1zdGF0aWMgc3BpbmxvY2tfdCB4cG5ldF9icm9hZGNhc3RfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soeHBuZXRfYnJvYWRjYXN0X2xvY2spOwogCiAvKgogICogU2luY2UgdGhlIEJsb2NrIFRyYW5zZmVyIEVuZ2luZSAoQlRFKSBpcyBiZWluZyB1c2VkIGZvciB0aGUgdHJhbnNmZXIKQEAgLTYzNiw2ICs2MzYsMTAgQEAKIAlpbnQgcmVzdWx0ID0gLUVOT01FTTsKIAogCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlkZXZfaW5mbyh4cG5ldCwgInJlZ2lzdGVyaW5nIG5ldHdvcmsgZGV2aWNlICVzXG4iLCBYUE5FVF9ERVZJQ0VfTkFNRSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCmluZGV4IGVhMDljMTJmLi4xOWJjZWQzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAl0aW9jYV9rZXJuLT5jYV9wY2lnYXJ0X2VudHJpZXMgPQogCSAgICB0aW9jYV9rZXJuLT5jYV9wY2lhcF9zaXplIC8gdGlvY2Ffa2Vybi0+Y2FfYXBfcGFnZXNpemU7CiAJdGlvY2Ffa2Vybi0+Y2FfcGNpZ2FydF9wYWdlbWFwID0KLQkgICAga2NhbGxvYygxLCB0aW9jYV9rZXJuLT5jYV9wY2lnYXJ0X2VudHJpZXMgLyA4LCBHRlBfS0VSTkVMKTsKKwkgICAga3phbGxvYyh0aW9jYV9rZXJuLT5jYV9wY2lnYXJ0X2VudHJpZXMgLyA4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRpb2NhX2tlcm4tPmNhX3BjaWdhcnRfcGFnZW1hcCkgewogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXRpb2NhX2tlcm4tPmNhX2dhcnQsCiAJCQkgICBnZXRfb3JkZXIodGlvY2Ffa2Vybi0+Y2FfZ2FydF9zaXplKSk7CkBAIC0zOTIsNyArMzkyLDcgQEAKIAkgKiBhbGxvY2F0ZSBhIG1hcCBzdHJ1Y3QKIAkgKi8KIAotCWNhX2RtYW1hcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0aW9jYV9kbWFtYXApLCBHRlBfQVRPTUlDKTsKKwljYV9kbWFtYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGlvY2FfZG1hbWFwKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjYV9kbWFtYXApCiAJCWdvdG8gbWFwX3JldHVybjsKIApAQCAtNjAwLDcgKzYwMCw3IEBACiAJICogQWxsb2NhdGUga2VybmVsIGJ1cyBzb2Z0IGFuZCBjb3B5IGZyb20gcHJvbS4KIAkgKi8KIAotCXRpb2NhX2NvbW1vbiA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0aW9jYV9jb21tb24pLCBHRlBfS0VSTkVMKTsKKwl0aW9jYV9jb21tb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGlvY2FfY29tbW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0aW9jYV9jb21tb24pCiAJCXJldHVybiBOVUxMOwogCkBAIC02MDksNyArNjA5LDcgQEAKIAogCS8qIGluaXQga2VybmVsLXByaXZhdGUgYXJlYSAqLwogCi0JdGlvY2Ffa2VybiA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0aW9jYV9rZXJuZWwpLCBHRlBfS0VSTkVMKTsKKwl0aW9jYV9rZXJuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpb2NhX2tlcm5lbCksIEdGUF9LRVJORUwpOwogCWlmICghdGlvY2Ffa2VybikgewogCQlrZnJlZSh0aW9jYV9jb21tb24pOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggNzYyMmQ0ZS4uMWVmMzk4N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0yNDIsOCArMjQyLDggQEAKIAkgIFkgdG8gIkVuaGFuY2VkIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0IiwgYmVsb3cuIFRoZSAiQWR2YW5jZWQgUG93ZXIKIAkgIE1hbmFnZW1lbnQiIGNvZGUgd2lsbCBiZSBkaXNhYmxlZCBpZiB5b3Ugc2F5IFkgaGVyZS4KIAotCSAgU2VlIGFsc28gdGhlIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnRleD4sCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NtcC50eHQ+IGFuZCB0aGUgU01QLUhPV1RPIGF2YWlsYWJsZSBhdAorCSAgU2VlIGFsc28gdGhlIDxmaWxlOkRvY3VtZW50YXRpb24vc21wLnR4dD4sCisJICBhbmQgdGhlIFNNUC1IT1dUTyBhdmFpbGFibGUgYXQKIAkgIDxodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9kb2NzLmh0bWwjaG93dG8+LgogCiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjYzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL20zMnIva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTAsMCArMSBAQAorLyogRHVtbXkgYXNtLW9mZnNldHMuYyBmaWxlLiBSZXF1aXJlZCBieSBrYnVpbGQgYW5kIHJlYWR5IHRvIGJlIHVzZWQgLSBoaW50ISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYyBiL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKaW5kZXggNDhiMTg3Zi4uYTQ1NzZhYyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NtcC5jCkBAIC04OTIsNyArODkyLDYgQEAKIAlpbnQgdHJ5KQogewogCXNwaW5sb2NrX3QgKmlwaWxvY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaXBpY3JfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGlwaWNyX3ZhbDsKIAl1bnNpZ25lZCBsb25nIG15X3BoeXNpZF9tYXNrOwpAQCAtOTE2LDUwICs5MTUsMjcgQEAKIAkgKiB3cml0ZSBJUElDUmkgKHNlbmQgSVBJaSkKIAkgKiB1bmxvY2sgaXBpX2xvY2tbaV0KIAkgKi8KKwlzcGluX2xvY2soaXBpbG9jayk7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiOzsgTE9DSyBpcGlfbG9ja1tpXQkJXG5cdCIKLQkJIi5maWxsaW5zbgkJCVxuIgotCQkiMToJCQkJXG5cdCIKLQkJIm12ZmMJJTEsIHBzdyAJCVxuXHQiCi0JCSJjbHJwc3cJIzB4NDAgLT4gbm9wCQlcblx0IgotCQlEQ0FDSEVfQ0xFQVIoInI0IiwgInI1IiwgIiUyIikKLQkJImxvY2sJcjQsIEAlMgkJCVxuXHQiCi0JCSJhZGRpCXI0LCAjLTEJCQlcblx0IgotCQkidW5sb2NrCXI0LCBAJTIJCQlcblx0IgotCQkibXZ0YwklMSwgcHN3CQkJXG5cdCIKLQkJImJuZXoJcjQsIDJmCQkJXG5cdCIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIuYmFsaWduIDQgXG5cdCIpCi0JCSIuZmlsbGluc24JCQlcbiIKLQkJIjI6CQkJCVxuXHQiCi0JCSJsZAlyNCwgQCUyCQkJXG5cdCIKLQkJImJsZXoJcjQsIDJiCQkJXG5cdCIKLQkJImJyYQkxYgkJCVxuXHQiCi0JCUxPQ0tfU0VDVElPTl9FTkQKIAkJIjs7IENIRUNLIElQSUNSaSA9PSAwCQlcblx0IgogCQkiLmZpbGxpbnNuCQkJXG4iCi0JCSIzOgkJCQlcblx0IgotCQkibGQJJTAsIEAlMwkJCVxuXHQiCi0JCSJhbmQJJTAsICU2CQkJXG5cdCIKLQkJImJlcXoJJTAsIDRmCQkJXG5cdCIKLQkJImJuZXoJJTUsIDVmCQkJXG5cdCIKLQkJImJyYQkzYgkJCVxuXHQiCisJCSIxOgkJCQlcblx0IgorCQkibGQJJTAsIEAlMQkJCVxuXHQiCisJCSJhbmQJJTAsICU0CQkJXG5cdCIKKwkJImJlcXoJJTAsIDJmCQkJXG5cdCIKKwkJImJuZXoJJTMsIDNmCQkJXG5cdCIKKwkJImJyYQkxYgkJCVxuXHQiCiAJCSI7OyBXUklURSBJUElDUmkgKHNlbmQgSVBJaSkJXG5cdCIKIAkJIi5maWxsaW5zbgkJCVxuIgotCQkiNDoJCQkJXG5cdCIKLQkJInN0CSU0LCBAJTMJCQlcblx0IgotCQkiOzsgVU5MT0NLIGlwaV9sb2NrW2ldCQlcblx0IgorCQkiMjoJCQkJXG5cdCIKKwkJInN0CSUyLCBAJTEJCQlcblx0IgogCQkiLmZpbGxpbnNuCQkJXG4iCi0JCSI1OgkJCQlcblx0IgotCQkibGRpCXI0LCAjMQkJCVxuXHQiCi0JCSJzdAlyNCwgQCUyCQkJXG5cdCIKKwkJIjM6CQkJCVxuXHQiCiAJCTogIj0mciIoaXBpY3JfdmFsKQotCQk6ICJyIihmbGFncyksICJyIigmaXBpbG9jay0+c2xvY2spLCAiciIoaXBpY3JfYWRkciksCi0JCSAgInIiKG1hc2spLCAiciIodHJ5KSwgInIiKG15X3BoeXNpZF9tYXNrKQotCQk6ICJtZW1vcnkiLCAicjQiCi0jaWZkZWYgQ09ORklHX0NISVBfTTMyNzAwX1RTMQotCQksICJyNSIKLSNlbmRpZgkvKiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxICovCisJCTogInIiKGlwaWNyX2FkZHIpLCAiciIobWFzayksICJyIih0cnkpLCAiciIobXlfcGh5c2lkX21hc2spCisJCTogIm1lbW9yeSIKIAkpOworCXNwaW5fdW5sb2NrKGlwaWxvY2spOwogCiAJcmV0dXJuIGlwaWNyX3ZhbDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvdGltZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKaW5kZXggOGEyYjc3Yi4uNTM5YzU2MiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKQEAgLTE3MSwxMCArMTcxLDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAKQEAgLTIyMSw3ICsyMTgsNyBAQAogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMAorCWlmIChudHBfc3luY2VkKCkKIAkJJiYgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwCiAJCSYmICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZClUSUNLX1NJWkUpIC8gMgogCQkmJiAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDE3OGM0YTMuLmJhOTYwYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0yNSw2ICsyNSwxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlcGVuZHMgb24gUTQwIHx8IChCUk9LRU4gJiYgU1VOM1gpCisJZGVmYXVsdCB5CisKIG1haW5tZW51ICJMaW51eC82OGsgS2VybmVsIENvbmZpZ3VyYXRpb24iCiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL01ha2VmaWxlIGIvYXJjaC9tNjhrL01ha2VmaWxlCmluZGV4IDQ2NmU3NDAuLjM0ZDgyNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvTWFrZWZpbGUKQEAgLTExMywxNCArMTEzLDUgQEAKIAliemlwMiAtMWMgdm1saW51eCA+dm1saW51eC5iejIKIGVuZGlmCiAKLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0cy5oCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldHMuaAotCi1hcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQogYXJjaGNsZWFuOgogCXJtIC1mIHZtbGludXguZ3ogdm1saW51eC5iejIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9hbWlzb3VuZC5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKaW5kZXggY2I1ZDkzNjMuLmJkNWQxMzRlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvYW1pc291bmQuYworKysgYi9hcmNoL202OGsvYW1pZ2EvYW1pc291bmQuYwpAQCAtNjMsNyArNjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBub3NvdW5kKCB1bnNpZ25lZCBsb25nIGlnbm9yZWQgKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzb3VuZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKG5vc291bmQsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzb3VuZF90aW1lciwgbm9zb3VuZCwgMCwgMCk7CiAKIHZvaWQgYW1pZ2FfbWtzb3VuZCggdW5zaWduZWQgaW50IGh6LCB1bnNpZ25lZCBpbnQgdGlja3MgKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jIGIvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jCmluZGV4IGM2YjJhNDEuLmViNjNjYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYworKysgYi9hcmNoL202OGsvYnZtZTYwMDAvcnRjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4JLyogRm9yIHN0cnVjdCBydGNfdGltZSBhbmQgaW9jdGxzLCBldGMgKi8KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGFzbS9idm1lNjAwMGh3Lmg+CkBAIC0xNzEsNyArMTcyLDcgQEAKIAkuZm9wcyA9CQkmcnRjX2ZvcHMKIH07CiAKLWludCBfX2luaXQgcnRjX0RQODU3MEFfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcnRjX0RQODU3MEFfaW5pdCh2b2lkKQogewogCWlmICghTUFDSF9JU19CVk1FNjAwMCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNzksNCArMTgwLDQgQEAKIAlwcmludGsoS0VSTl9JTkZPICJEUDg1NzBBIFJlYWwgVGltZSBDbG9jayBEcml2ZXIgdiVzXG4iLCBSVENfVkVSU0lPTik7CiAJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnJ0Y19kZXYpOwogfQotCittb2R1bGVfaW5pdChydGNfRFA4NTcwQV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9mcHNwMDQwL3NrZWxldG9uLlMgYi9hcmNoL202OGsvZnBzcDA0MC9za2VsZXRvbi5TCmluZGV4IGRiYzEyNTUuLjk1NzFhMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9mcHNwMDQwL3NrZWxldG9uLlMKKysrIGIvYXJjaC9tNjhrL2Zwc3AwNDAvc2tlbGV0b24uUwpAQCAtNDAsNyArNDAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIHxTS0VMRVRPTglpZG50ICAgIDIsMSB8IE1vdG9yb2xhIDA0MCBGbG9hdGluZyBQb2ludCBTb2Z0d2FyZSBQYWNrYWdlCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pZnBzcDA2MC9pc2tlbGV0b24uUyBiL2FyY2gvbTY4ay9pZnBzcDA2MC9pc2tlbGV0b24uUwppbmRleCA4MDNhNmVjLi40YmEyYzc0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaWZwc3AwNjAvaXNrZWxldG9uLlMKKysrIGIvYXJjaC9tNjhrL2lmcHNwMDYwL2lza2VsZXRvbi5TCkBAIC0zNiw3ICszNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2VudHJ5Lmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCiB8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwppbmRleCBlOTY0MDE1Li4yM2NhNjBhIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCi0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLmdsb2JsIHN5c3RlbV9jYWxsLCBidXNlcnIsIHRyYXAKIC5nbG9ibCByZXN1bWUsIHJldF9mcm9tX2V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwppbmRleCA3Y2Q2ZGUxLi5kNDMzNmQ4IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2hlYWQuUworKysgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwpAQCAtMjYzLDcgKzI2Myw3IEBACiAjaW5jbHVkZSA8YXNtL2VudHJ5Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNpZmRlZiBDT05GSUdfTUFDCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdGltZS5jIGIvYXJjaC9tNjhrL2tlcm5lbC90aW1lLmMKaW5kZXggZTQ3ZTE5NS4uNGVjOTVlMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90aW1lLmMKQEAgLTE2NiwxMCArMTY2LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL21hY2JvaW5nLmMgYi9hcmNoL202OGsvbWFjL21hY2JvaW5nLmMKaW5kZXggNDRjNWNkMi4uOGYwNjQwOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9tYWNib2luZy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvbWFjYm9pbmcuYwpAQCAtNTYsOCArNTYsNyBAQAogLyoKICAqIG91ciB0aW1lciB0byBzdGFydC9jb250aW51ZS9zdG9wIHRoZSBiZWxsCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtYWNfc291bmRfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihtYWNfbm9zb3VuZCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKG1hY19zb3VuZF90aW1lciwgbWFjX25vc291bmQsIDAsIDApOwogCiAvKgogICogU29ydCBvZiBpbml0aWFsaXplIHRoZSBzb3VuZCBjaGlwIChjYWxsZWQgZnJvbSBtYWNfbWtzb3VuZCBvbiB0aGUgZmlyc3QKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9lbXUuaCBiL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9lbXUuaAppbmRleCAxZDZlZGM5Li5jMWVjZmVmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWF0aC1lbXUvZnBfZW11LmgKKysrIGIvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2VtdS5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIF9GUF9FTVVfSAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9tYXRoLWVtdS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE2eC9ydGMuYyBiL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCmluZGV4IDhhMjQyNTAuLjc5NzdlYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCisrKyBiL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkuZm9wcyA9CQkmcnRjX2ZvcHMKIH07CiAKLWludCBfX2luaXQgcnRjX01LNDhUMDhfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcnRjX01LNDhUMDhfaW5pdCh2b2lkKQogewogCWlmICghTUFDSF9JU19NVk1FMTZ4KQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE2OSw0ICsxNjksNCBAQAogCXByaW50ayhLRVJOX0lORk8gIk1LNDhUMDggUmVhbCBUaW1lIENsb2NrIERyaXZlciB2JXNcbiIsIFJUQ19WRVJTSU9OKTsKIAlyZXR1cm4gbWlzY19yZWdpc3RlcigmcnRjX2Rldik7CiB9Ci0KK21vZHVsZV9pbml0KHJ0Y19NSzQ4VDA4X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvTWFrZWZpbGUgYi9hcmNoL202OGtub21tdS9NYWtlZmlsZQppbmRleCA3Y2U1ZTU1Li5iOGZkZjE5IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9NYWtlZmlsZQorKysgYi9hcmNoL202OGtub21tdS9NYWtlZmlsZQpAQCAtMTAyLDIxICsxMDIsMTEgQEAKIAogaGVhZC15IDo9IGFyY2gvbTY4a25vbW11L3BsYXRmb3JtLyQoY3B1Y2xhc3MteSkvaGVhZC5vCiAKLUNMRUFOX0ZJTEVTIDo9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaCBcCi0JICAgICAgIGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCiBjb3JlLXkJKz0gYXJjaC9tNjhrbm9tbXUva2VybmVsLyBcCiAJICAgYXJjaC9tNjhrbm9tbXUvbW0vIFwKIAkgICAkKENMQVNTRElSKSBcCiAJICAgYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vJChQTEFURk9STSkvCiBsaWJzLXkJKz0gYXJjaC9tNjhrbm9tbXUvbGliLwogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1vZmZzZXRzLmgKLQogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPWFyY2gvbTY4a25vbW11L2Jvb3QKLQotaW5jbHVkZS9hc20tJChBUkNIKS9hc20tb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMgXAotCQkJCSAgIGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RpbWUuYwppbmRleCA1YzNjYTY3Li5iMTdjMWVjIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90aW1lLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAgJiYKKwlpZiAobnRwX3N5bmNlZCgpICYmCiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjICAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CkBAIC0xNzgsMTAgKzE3OCw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9NYWtlZmlsZSBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1NzhiMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIG02OGtub21tdSBsaW51eCBrZXJuZWwuCisjCisKKyMKKyMgSWYgeW91IHdhbnQgdG8gcGxheSB3aXRoIHRoZSBIVyBicmVha3BvaW50cyB0aGVuIHlvdSB3aWxsCisjIG5lZWQgdG8gYWRkIGRlZmluZSB0aGlzLCAgd2hpY2ggd2lsbCBnaXZlIHlvdSBhIHN0YWNrIGJhY2t0cmFjZQorIyBvbiB0aGUgY29uc29sZSBwb3J0IHdoZW5ldmVyIGEgREJHIGludGVycnVwdCBvY2N1cnMuICBZb3UgaGF2ZSB0bworIyBzZXQgdXAgeW91IEhXIGJyZWFrcG9pbnRzIHRvIHRyaWdnZXIgYSBEQkcgaW50ZXJydXB0OgorIworIyBFWFRSQV9DRkxBR1MgKz0gLURUUkFQX0RCR19JTlRFUlJVUFQKKyMgRVhUUkFfQUZMQUdTICs9IC1EVFJBUF9EQkdfSU5URVJSVVBUCisjCisKK2lmZGVmIENPTkZJR19GVUxMREVCVUcKK0FGTEFHUyArPSAtRERFQlVHR0VSX0NPTVBBVElCTEVfQ0FDSEU9MQorZW5kaWYKKworb2JqLXkgOj0gY29uZmlnLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNzIvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjcyL2NvbmZpZy5jCmluZGV4IDVjYjI4NjkuLmNmMzZlN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNzIvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI3Mi9jb25maWcuYwpAQCAtMTA0LDExICsxMDQsMTEgQEAKIAogdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKIHsKLSNpZiAwCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZwkqcGl2cnA7CisjaWYgZGVmaW5lZCAoQ09ORklHX01PRDUyNzIpCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqcGl2cnA7CiAKIAkvKiBTZXQgYmFzZSBvZiBkZXZpY2UgdmVjdG9ycyB0byBiZSA2NCAqLwotCXBpdnJwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX1BJVlIpOworCXBpdnJwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgTUNGU0lNX1BJVlIpOwogCSpwaXZycCA9IDB4NDA7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9NYWtlZmlsZSBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvTWFrZWZpbGUKaW5kZXggODRiNmI3MC4uNmZlNWEyYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9NYWtlZmlsZQorKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfQ09MREZJUkUpCSs9IGVudHJ5Lm8gdmVjdG9ycy5vIGludHMubwogb2JqLSQoQ09ORklHX001MjA2KQkrPSB0aW1lcnMubwogb2JqLSQoQ09ORklHX001MjA2ZSkJKz0gdGltZXJzLm8KK29iai0kKENPTkZJR19NNTIzeCkJKz0gcGl0Lm8KIG9iai0kKENPTkZJR19NNTI0OSkJKz0gdGltZXJzLm8KIG9iai0kKENPTkZJR19NNTI3eCkgICAgICs9IHBpdC5vCiBvYmotJChDT05GSUdfTTUyNzIpCSs9IHRpbWVycy5vCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2NvbmZpZy5jCmluZGV4IGZkN2M5M2YuLmJjZmE1ZDdmIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9jb25maWcuYwpAQCAtMSw1ICsxLDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qCi0gKiAgbGludXgvYXJjaC8kKEFSQ0gpL3BsYXRmb3JtLyQoUExBVEZPUk0pL2NvbmZpZy5jCisgKiAgbGludXgvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvY29uZmlnLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTkzIEhhbWlzaCBNYWNkb25hbGQKICAqICBDb3B5cmlnaHQgKEMpIDE5OTkgRC4gSmVmZiBEaW9ubmUKQEAgLTExLDYgKzEzLDggQEAKICAqIFZaIFN1cHBvcnQvRml4ZXMgICAgICAgICAgICAgRXZhbiBTdGF3bnljenkgPGVAbGluZW8uY2E+CiAgKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgPGFzbS9kYmcuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTI5LDc2ICszMywxNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL01DNjgzMjguaD4KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBCU1Bfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKnRpbWVyX3JvdXRpbmUpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKK3ZvaWQgbTY4MzI4X3RpbWVyX2luaXQoaXJxcmV0dXJuX3QgKCp0aW1lcl9yb3V0aW5lKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKK3ZvaWQgbTY4MzI4X3RpbWVyX3RpY2sodm9pZCk7Cit1bnNpZ25lZCBsb25nIG02ODMyOF90aW1lcl9nZXR0aW1lb2Zmc2V0KHZvaWQpOwordm9pZCBtNjgzMjhfdGltZXJfZ2V0dG9kKGludCAqeWVhciwgaW50ICptb24sIGludCAqZGF5LCBpbnQgKmhvdXIsIGludCAqbWluLCBpbnQgKnNlYyk7CiAKLSNpZmRlZiBDT05GSUdfWENPUElMT1RfQlVHUwotICAvKgotICAgKiBUaGUgb25seSB0aGluZyBJIGtub3cgaXMgdGhhdCBDTEszMiBpcyBub3QgYXZhaWxhYmxlIG9uIFhjb3BpbG90Ci0gICAqIEkgaGF2ZSBsaXR0bGUgaWRlYSBhYm91dCB3aGF0IGZyZXF1ZW5jeSBTWVNDTEsgaGFzIG9uIFhjb3BpbG90LiAKLSAgICogVGhlIHZhbHVlcyBmb3IgcHJlc2NhbGVyIGFuZCBjb21wYXJlIHJlZ2lzdGVycyB3ZXJlIHNpbXBseSAKLSAgICogdGFrZW4gZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlCi0gICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKiBSZXN0YXJ0IG1vZGUsIEVuYWJsZSBpbnQsIFNZU0NMSywgRW5hYmxlIHRpbWVyICovCi0gIFRDVEwyID0gVENUTF9PTSB8IFRDVExfSVJRRU4gfCBUQ1RMX0NMS1NPVVJDRV9TWVNDTEsgfCBUQ1RMX1RFTjsKLSAgLyogU2V0IHByZXNjYWxlciAqLwotICBUUFJFUjIgPSAyOwotICAvKiBTZXQgY29tcGFyZSByZWdpc3RlciAqLwotICBUQ01QMiA9IDB4ZDdlNDsKLSNlbHNlCi0gIC8qIFJlc3RhcnQgbW9kZSwgRW5hYmxlIGludCwgMzJLSHosIEVuYWJsZSB0aW1lciAqLwotICBUQ1RMMiA9IFRDVExfT00gfCBUQ1RMX0lSUUVOIHwgVENUTF9DTEtTT1VSQ0VfMzJLSFogfCBUQ1RMX1RFTjsKLSAgLyogU2V0IHByZXNjYWxlciAoRGl2aWRlIDMyS0h6IGJ5IDMyKSovCi0gIFRQUkVSMiA9IDMxOwotICAvKiBTZXQgY29tcGFyZSByZWdpc3RlciAgMzJLaHogLyAzMiAvIDEwID0gMTAwICovCi0gIFRDTVAyID0gMTA7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHJlcXVlc3RfaXJxKFRNUjJfSVJRX05VTSwgdGltZXJfcm91dGluZSwgSVJRX0ZMR19MT0NLLCAidGltZXIiLCBOVUxMKTsKLX0KLQotdm9pZCBCU1BfdGljayh2b2lkKQotewotICAvKiBSZXNldCBUaW1lcjIgKi8KLSAgVFNUQVQyICY9IDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgQlNQX2dldHRpbWVvZmZzZXQgKHZvaWQpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkIEJTUF9nZXR0b2QgKGludCAqeWVhcnAsIGludCAqbW9ucCwgaW50ICpkYXlwLAotCQkgICBpbnQgKmhvdXJwLCBpbnQgKm1pbnAsIGludCAqc2VjcCkKLXsKLX0KLQotaW50IEJTUF9od2NsayhpbnQgb3AsIHN0cnVjdCBod2Nsa190aW1lICp0KQotewotICBpZiAoIW9wKSB7Ci0gICAgLyogcmVhZCAqLwotICB9IGVsc2UgewotICAgIC8qIHdyaXRlICovCi0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBCU1Bfc2V0X2Nsb2NrX21tc3MgKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKLXsKLSNpZiAwCi0gIHNob3J0IHJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MCwgcmVhbF9taW51dGVzID0gKG5vd3RpbWUgLyA2MCkgJSA2MDsKLQotICB0b2QtPnNlY29uZDEgPSByZWFsX3NlY29uZHMgLyAxMDsKLSAgdG9kLT5zZWNvbmQyID0gcmVhbF9zZWNvbmRzICUgMTA7Ci0gIHRvZC0+bWludXRlMSA9IHJlYWxfbWludXRlcyAvIDEwOwotICB0b2QtPm1pbnV0ZTIgPSByZWFsX21pbnV0ZXMgJSAxMDsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotdm9pZCBCU1BfcmVzZXQgKHZvaWQpCit2b2lkIG02ODMyOF9yZXNldCAodm9pZCkKIHsKICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKICAgYXNtIHZvbGF0aWxlICgibW92ZWFsICMweDEwYzAwMDAwLCAlYTA7XG5cdCIKQEAgLTEwOCwxOCArNTIsMjIgQEAKIAkJImptcCAoJWEwKTsiKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmQsIGludCBsZW4pCiB7CiAgIHByaW50ayhLRVJOX0lORk8gIlxuNjgzMjggc3VwcG9ydCBELiBKZWZmIERpb25uZSA8amVmZkB1Y2xpbnV4Lm9yZz5cbiIpOwogICBwcmludGsoS0VSTl9JTkZPICI2ODMyOCBzdXBwb3J0IEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqc2hkcy5jb20+XG4iKTsKICAgcHJpbnRrKEtFUk5fSU5GTyAiNjgzMjgvUGlsb3Qgc3VwcG9ydCBCZXJuaGFyZCBLdWhuIDxrdWhuQGxwci5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+XG4iKTsKIAotICBtYWNoX3NjaGVkX2luaXQgICAgICA9IEJTUF9zY2hlZF9pbml0OwotICBtYWNoX3RpY2sgICAgICAgICAgICA9IEJTUF90aWNrOwotICBtYWNoX2dldHRpbWVvZmZzZXQgICA9IEJTUF9nZXR0aW1lb2Zmc2V0OwotICBtYWNoX2dldHRvZCAgICAgICAgICA9IEJTUF9nZXR0b2Q7CisgIG1hY2hfc2NoZWRfaW5pdCAgICAgID0gbTY4MzI4X3RpbWVyX2luaXQ7CisgIG1hY2hfdGljayAgICAgICAgICAgID0gbTY4MzI4X3RpbWVyX3RpY2s7CisgIG1hY2hfZ2V0dGltZW9mZnNldCAgID0gbTY4MzI4X3RpbWVyX2dldHRpbWVvZmZzZXQ7CisgIG1hY2hfZ2V0dG9kICAgICAgICAgID0gbTY4MzI4X3RpbWVyX2dldHRvZDsKICAgbWFjaF9od2NsayAgICAgICAgICAgPSBOVUxMOwogICBtYWNoX3NldF9jbG9ja19tbXNzICA9IE5VTEw7Ci0gIG1hY2hfcmVzZXQgICAgICAgICAgID0gQlNQX3Jlc2V0OworICBtYWNoX3Jlc2V0ICAgICAgICAgICA9IG02ODMyOF9yZXNldDsKICAgKmNvbW1hbmQgPSAnXDAnOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGMyY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgbGludXgvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzIEhhbWlzaCBNYWNkb25hbGQKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgRC4gSmVmZiBEaW9ubmUKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgR2VvcmdlcyBNZW5pZSwgS2VuIERlc21ldAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9NQzY4VlozMjguaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0RSQUdFTjIpCisvKiB3aXRoIGEgMzMuMTYgTUh6IGNsb2NrLCB0aGlzIHdpbGwgZ2l2ZSB1c2VjIHJlc29sdXRpb24gdG8gdGhlIHRpbWUgZnVuY3Rpb25zICovCisjZGVmaW5lIENMT0NLX1NPVVJDRQlUQ1RMX0NMS1NPVVJDRV9TWVNDTEsKKyNkZWZpbmUgQ0xPQ0tfUFJFCTcKKyNkZWZpbmUgVElDS1NfUEVSX0pJRkZZCTQxNDUwCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1hDT1BJTE9UX0JVR1MpCisvKgorICogVGhlIG9ubHkgdGhpbmcgSSBrbm93IGlzIHRoYXQgQ0xLMzIgaXMgbm90IGF2YWlsYWJsZSBvbiBYY29waWxvdAorICogSSBoYXZlIGxpdHRsZSBpZGVhIGFib3V0IHdoYXQgZnJlcXVlbmN5IFNZU0NMSyBoYXMgb24gWGNvcGlsb3QuCisgKiBUaGUgdmFsdWVzIGZvciBwcmVzY2FsZXIgYW5kIGNvbXBhcmUgcmVnaXN0ZXJzIHdlcmUgc2ltcGx5CisgKiB0YWtlbiBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqLworI2RlZmluZSBDTE9DS19TT1VSQ0UJVENUTF9DTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIENMT0NLX1BSRQkyCisjZGVmaW5lIFRJQ0tTX1BFUl9KSUZGWQkweGQ3ZTQKKworI2Vsc2UKKy8qIGRlZmF1bHQgdG8gdXNpbmcgdGhlIDMyS2h6IGNsb2NrICovCisjZGVmaW5lIENMT0NLX1NPVVJDRQlUQ1RMX0NMS1NPVVJDRV8zMktIWgorI2RlZmluZSBDTE9DS19QUkUJMzEKKyNkZWZpbmUgVElDS1NfUEVSX0pJRkZZCTEwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBtNjgzMjhfdGltZXJfaW5pdChpcnFyZXR1cm5fdCAoKnRpbWVyX3JvdXRpbmUpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCit7CisJLyogZGlzYWJsZSB0aW1lciAxICovCisJVENUTCA9IDA7CisKKwkvKiBzZXQgSVNSICovCisJaWYgKHJlcXVlc3RfaXJxKFRNUl9JUlFfTlVNLCB0aW1lcl9yb3V0aW5lLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIE5VTEwpKSAKKwkJcGFuaWMoIlVuYWJsZSB0byBhdHRhY2ggdGltZXIgaW50ZXJydXB0XG4iKTsKKworCS8qIFJlc3RhcnQgbW9kZSwgRW5hYmxlIGludCwgU2V0IGNsb2NrIHNvdXJjZSAqLworCVRDVEwgPSBUQ1RMX09NIHwgVENUTF9JUlFFTiB8IENMT0NLX1NPVVJDRTsKKwlUUFJFUiA9IENMT0NLX1BSRTsKKwlUQ01QID0gVElDS1NfUEVSX0pJRkZZOworCisJLyogRW5hYmxlIHRpbWVyIDEgKi8KKwlUQ1RMIHw9IFRDVExfVEVOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG02ODMyOF90aW1lcl90aWNrKHZvaWQpCit7CisJLyogUmVzZXQgVGltZXIxICovCisJVFNUQVQgJj0gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGxvbmcgbTY4MzI4X3RpbWVyX2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpY2tzID0gVENOLCBvZmZzZXQgPSAwOworCisJLyogY2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0ICovCisJaWYgKHRpY2tzIDwgKFRJQ0tTX1BFUl9KSUZGWSA+PiAxKSAmJiAoSVNSICYgKDEgPDwgVE1SX0lSUV9OVU0pKSkKKwkJb2Zmc2V0ID0gMTAwMDAwMCAvIEhaOworCXRpY2tzID0gKHRpY2tzICogMTAwMDAwMCAvIEhaKSAvIFRJQ0tTX1BFUl9KSUZGWTsKKwlyZXR1cm4gdGlja3MgKyBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgbTY4MzI4X3RpbWVyX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLCBpbnQgKm1pbiwgaW50ICpzZWMpCit7CisJbG9uZyBub3cgPSBSVENUSU1FOworCisJKnllYXIgPSAqbW9uID0gKmRheSA9IDE7CisJKmhvdXIgPSAobm93ID4+IDI0KSAlIDI0OworCSptaW4gPSAobm93ID4+IDE2KSAlIDYwOworCSpzZWMgPSBub3cgJSA2MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4RVozMjgvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OEVaMzI4L2NvbmZpZy5jCmluZGV4IGMyMTk3MTkuLmQ4ZDU2ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4RVozMjgvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhFWjMyOC9jb25maWcuYwpAQCAtMSw1ICsxLDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qCi0gKiAgbGludXgvYXJjaC8kKEFSQ0gpL3BsYXRmb3JtLyQoUExBVEZPUk0pL2NvbmZpZy5jCisgKiAgbGludXgvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhFWjMyOC9jb25maWcuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTMgSGFtaXNoIE1hY2RvbmFsZAogICogIENvcHlyaWdodCAoQykgMTk5OSBELiBKZWZmIERpb25uZQpAQCAtOSw2ICsxMSw4IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMjAsNjggKzI0LDIyIEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL01DNjhFWjMyOC5oPgogI2lmZGVmIENPTkZJR19VQ1NJTU0KICNpbmNsdWRlIDxhc20vYm9vdHN0ZC5oPgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BJTE9UCi0jaW5jbHVkZSAiUGFsbVYvcm9tZnMuaCIKLSNlbmRpZgogCi12b2lkIEJTUF9zY2hlZF9pbml0KHZvaWQgKCp0aW1lcl9yb3V0aW5lKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCi17Ci0gIC8qIFJlc3RhcnQgbW9kZSwgRW5hYmxlIGludCwgMzJLSHosIEVuYWJsZSB0aW1lciAqLwotICBUQ1RMID0gVENUTF9PTSB8IFRDVExfSVJRRU4gfCBUQ1RMX0NMS1NPVVJDRV8zMktIWiB8IFRDVExfVEVOOwotICAvKiBTZXQgcHJlc2NhbGVyIChEaXZpZGUgMzJLSHogYnkgMzIpKi8KLSAgVFBSRVIgPSAzMTsKLSAgLyogU2V0IGNvbXBhcmUgcmVnaXN0ZXIgIDMyS2h6IC8gMzIgLyAxMCA9IDEwMCAqLwotICBUQ01QID0gMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgcmVxdWVzdF9pcnEoVE1SX0lSUV9OVU0sIHRpbWVyX3JvdXRpbmUsIElSUV9GTEdfTE9DSywgInRpbWVyIiwgTlVMTCk7Ci19Cit2b2lkIG02ODMyOF90aW1lcl9pbml0KGlycXJldHVybl90ICgqdGltZXJfcm91dGluZSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7Cit2b2lkIG02ODMyOF90aW1lcl90aWNrKHZvaWQpOwordW5zaWduZWQgbG9uZyBtNjgzMjhfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKTsKK3ZvaWQgbTY4MzI4X3RpbWVyX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLCBpbnQgKm1pbiwgaW50ICpzZWMpOwogCi12b2lkIEJTUF90aWNrKHZvaWQpCi17Ci0gIAkvKiBSZXNldCBUaW1lcjEgKi8KLQlUU1RBVCAmPSAwOwotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5zaWduZWQgbG9uZyBCU1BfZ2V0dGltZW9mZnNldCAodm9pZCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQlNQX2dldHRvZCAoaW50ICp5ZWFycCwgaW50ICptb25wLCBpbnQgKmRheXAsCi0JCSAgIGludCAqaG91cnAsIGludCAqbWlucCwgaW50ICpzZWNwKQotewotfQotCi1pbnQgQlNQX2h3Y2xrKGludCBvcCwgc3RydWN0IGh3Y2xrX3RpbWUgKnQpCi17Ci0gIGlmICghb3ApIHsKLSAgICAvKiByZWFkICovCi0gIH0gZWxzZSB7Ci0gICAgLyogd3JpdGUgKi8KLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IEJTUF9zZXRfY2xvY2tfbW1zcyAodW5zaWduZWQgbG9uZyBub3d0aW1lKQotewotI2lmIDAKLSAgc2hvcnQgcmVhbF9zZWNvbmRzID0gbm93dGltZSAlIDYwLCByZWFsX21pbnV0ZXMgPSAobm93dGltZSAvIDYwKSAlIDYwOwotCi0gIHRvZC0+c2Vjb25kMSA9IHJlYWxfc2Vjb25kcyAvIDEwOwotICB0b2QtPnNlY29uZDIgPSByZWFsX3NlY29uZHMgJSAxMDsKLSAgdG9kLT5taW51dGUxID0gcmVhbF9taW51dGVzIC8gMTA7Ci0gIHRvZC0+bWludXRlMiA9IHJlYWxfbWludXRlcyAlIDEwOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi12b2lkIEJTUF9yZXNldCAodm9pZCkKK3ZvaWQgbTY4ZXozMjhfcmVzZXQodm9pZCkKIHsKICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKICAgYXNtIHZvbGF0aWxlICgiCkBAIC05Myw2ICs1MSw4IEBACiAgICAgIik7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVuc2lnbmVkIGNoYXIgKmNzODkwMGFfaHdhZGRyOwogc3RhdGljIGludCBlcnJubzsKIApAQCAtMTE5LDExICs3OSwxMyBAQAogICBlbHNlIGNvbW1hbmRbMF0gPSAwOwogI2VuZGlmCiAgCi0gIG1hY2hfc2NoZWRfaW5pdCAgICAgID0gQlNQX3NjaGVkX2luaXQ7Ci0gIG1hY2hfdGljayAgICAgICAgICAgID0gQlNQX3RpY2s7Ci0gIG1hY2hfZ2V0dGltZW9mZnNldCAgID0gQlNQX2dldHRpbWVvZmZzZXQ7Ci0gIG1hY2hfZ2V0dG9kICAgICAgICAgID0gQlNQX2dldHRvZDsKKyAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSBtNjgzMjhfdGltZXJfaW5pdDsKKyAgbWFjaF90aWNrICAgICAgICAgICAgPSBtNjgzMjhfdGltZXJfdGljazsKKyAgbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBtNjgzMjhfdGltZXJfZ2V0dGltZW9mZnNldDsKKyAgbWFjaF9nZXR0b2QgICAgICAgICAgPSBtNjgzMjhfdGltZXJfZ2V0dG9kOwogICBtYWNoX2h3Y2xrICAgICAgICAgICA9IE5VTEw7CiAgIG1hY2hfc2V0X2Nsb2NrX21tc3MgID0gTlVMTDsKLSAgbWFjaF9yZXNldCAgICAgICAgICAgPSBCU1BfcmVzZXQ7CisgIG1hY2hfcmVzZXQgICAgICAgICAgID0gbTY4ZXozMjhfcmVzZXQ7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI2NTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC9jb25maWcuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBsaW51eC9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2NvbmZpZy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MyBIYW1pc2ggTWFjZG9uYWxkCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IEQuIEplZmYgRGlvbm5lCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIEdlb3JnZXMgTWVuaWUsIEtlbiBEZXNtZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9NQzY4VlozMjguaD4KKyNpbmNsdWRlIDxhc20vYm9vdHN0ZC5oPgorCisjaWZkZWYgQ09ORklHX0lOSVRfTENECisjaW5jbHVkZSAiYm9vdGxvZ28uaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG02ODMyOF90aW1lcl9pbml0KGlycXJldHVybl90ICgqdGltZXJfcm91dGluZSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSk7Cit2b2lkIG02ODMyOF90aW1lcl90aWNrKHZvaWQpOwordW5zaWduZWQgbG9uZyBtNjgzMjhfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKTsKK3ZvaWQgbTY4MzI4X3RpbWVyX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLCBpbnQgKm1pbiwgaW50ICpzZWMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICBJbml0IERyYW5nb24gRW5naW5lIGhhcmR3YXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfRFJBR0VOMikKKworc3RhdGljIHZvaWQgbTY4dnozMjhfcmVzZXQodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisjaWZkZWYgQ09ORklHX0lOSVRfTENECisJUEJEQVRBIHw9IDB4MjA7CQkJCS8qIGRpc2FibGUgQ0NGTCBsaWdodCAqLworCVBLREFUQSB8PSAweDQ7CQkJCS8qIGRpc2FibGUgTENEIGNvbnRyb2xsZXIgKi8KKwlMQ0tDT04gPSAwOworI2VuZGlmCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJInJlc2V0XG5cdCIKKwkJIm1vdmVhbCAjMHgwNDAwMDAwMCwgJWEwXG5cdCIKKwkJIm1vdmVhbCAwKCVhMCksICVzcFxuXHQiCisJCSJtb3ZlYWwgNCglYTApLCAlYTBcblx0IgorCQkiam1wICglYTApIgorCSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfaGFyZHdhcmUoY2hhciAqY29tbWFuZCwgaW50IHNpemUpCit7CisjaWZkZWYgQ09ORklHX0RJUkVDVF9JT19BQ0NFU1MKKwlTQ1IgPSAweDEwOwkJCQkJLyogYWxsb3cgdXNlciBhY2Nlc3MgdG8gaW50ZXJuYWwgcmVnaXN0ZXJzICovCisjZW5kaWYKKworCS8qIENTR0IgSW5pdCAqLworCUNTR0JCID0gMHg0MDAwOworCUNTQiA9IDB4MWExOworCisJLyogQ1M4OTAwIGluaXQgKi8KKwkvKiBQSzM6IGhhcmR3YXJlIHNsZWVwIGZ1bmN0aW9uIHBpbiwgYWN0aXZlIGxvdyAqLworCVBLU0VMIHw9IFBLKDMpOwkJCQkvKiBzZWxlY3QgcGluIGFzIEkvTyAqLworCVBLRElSIHw9IFBLKDMpOwkJCQkvKiBzZWxlY3QgcGluIGFzIG91dHB1dCAqLworCVBLREFUQSB8PSBQSygzKTsJCQkvKiBzZXQgcGluIGhpZ2ggKi8KKworCS8qIFBGNTogaGFyZHdhcmUgcmVzZXQgZnVuY3Rpb24gcGluLCBhY3RpdmUgaGlnaCAqLworCVBGU0VMIHw9IFBGKDUpOwkJCQkvKiBzZWxlY3QgcGluIGFzIEkvTyAqLworCVBGRElSIHw9IFBGKDUpOwkJCQkvKiBzZWxlY3QgcGluIGFzIG91dHB1dCAqLworCVBGREFUQSAmPSB+UEYoNSk7CQkJLyogc2V0IHBpbiBsb3cgKi8KKworCS8qIGNzODkwMCBoYXJkd2FyZSByZXNldCAqLworCVBGREFUQSB8PSBQRig1KTsKKwl7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMzIwMDA7ICsraSk7IH0KKwlQRkRBVEEgJj0gflBGKDUpOworCisJLyogSU5UMSBlbmFibGUgKGNzODkwMCBJUlEpICovCisJUERQT0wgJj0gflBEKDEpOwkJCS8qIGFjdGl2ZSBoaWdoIHNpZ25hbCAqLworCVBESVFFRyAmPSB+UEQoMSk7CisJUERJUlFFTiB8PSBQRCgxKTsJCQkvKiBJUlEgZW5hYmxlZCAqLworCisjaWZkZWYgQ09ORklHXzY4MzI4X1NFUklBTF9VQVJUMgorCS8qIEVuYWJsZSBSWEQgVFhEIHBvcnQgYml0cyB0byBlbmFibGUgVUFSVDIgKi8KKwlQSlNFTCAmPSB+KFBKKDUpIHwgUEooNCkpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSU5JVF9MQ0QKKwkvKiBpbml0aWFsaXplIExDRCBjb250cm9sbGVyICovCisJTFNTQSA9IChsb25nKSBzY3JlZW5fYml0czsKKwlMVlBXID0gMHgxNDsKKwlMWE1BWCA9IDB4MTQwOworCUxZTUFYID0gMHhlZjsKKwlMUlJBID0gMDsKKwlMUFhDRCA9IDM7CisJTFBJQ0YgPSAweDA4OworCUxQT0xDRiA9IDA7CisJTENLQ09OID0gMHg4MDsKKwlQQ1BERU4gPSAweGZmOworCVBDU0VMID0gMDsKKworCS8qIEVuYWJsZSBMQ0QgY29udHJvbGxlciAqLworCVBLRElSIHw9IDB4NDsKKwlQS1NFTCB8PSAweDQ7CisJUEtEQVRBICY9IH4weDQ7CisKKwkvKiBFbmFibGUgQ0NGTCBiYWNrbGlnaHRpbmcgY2lyY3VpdCAqLworCVBCRElSIHw9IDB4MjA7CisJUEJTRUwgfD0gMHgyMDsKKwlQQkRBVEEgJj0gfjB4MjA7CisKKwkvKiBjb250cmFzdCBjb250cm9sIHJlZ2lzdGVyICovCisJUEZESVIgfD0gMHgxOworCVBGU0VMICY9IH4weDE7CisJUFdNUiA9IDB4MDM3RjsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgSW5pdCBSVC1Db250cm9sIHVDZGltbSBoYXJkd2FyZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZWxpZiBkZWZpbmVkKENPTkZJR19VQ0RJTU0pCisKK3N0YXRpYyB2b2lkIG02OHZ6MzI4X3Jlc2V0KHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlhc20gdm9sYXRpbGUgKCIKKwkJbW92ZWFsICMweDEwYzAwMDAwLCAlYTA7CisJCW1vdmViICMwLCAweEZGRkZGMzAwOworCQltb3ZlYWwgMCglYTApLCAlc3A7CisJCW1vdmVhbCA0KCVhMCksICVhMDsKKwkJam1wICglYTApOworCSIpOworfQorCit1bnNpZ25lZCBjaGFyICpjczg5MDBhX2h3YWRkcjsKK3N0YXRpYyBpbnQgZXJybm87CisKK19ic2MwKGNoYXIgKiwgZ2V0c2VyaWFsbnVtKQorX2JzYzEodW5zaWduZWQgY2hhciAqLCBnZXRod2FkZHIsIGludCwgYSkKK19ic2MxKGNoYXIgKiwgZ2V0YmVudiwgY2hhciAqLCBhKQorCitzdGF0aWMgdm9pZCBpbml0X2hhcmR3YXJlKGNoYXIgKmNvbW1hbmQsIGludCBzaXplKQoreworCWNoYXIgKnA7CisKKwlwcmludGsoS0VSTl9JTkZPICJ1Q2RpbW0gc2VyaWFsIHN0cmluZyBbJXNdXG4iLCBnZXRzZXJpYWxudW0oKSk7CisJcCA9IGNzODkwMGFfaHdhZGRyID0gZ2V0aHdhZGRyKDApOworCXByaW50ayhLRVJOX0lORk8gInVDZGltbSBod2FkZHIgJS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4OiUuMnhcbiIsCisJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0pOworCXAgPSBnZXRiZW52KCJBUFBFTkQiKTsKKwlpZiAocCkKKwkJc3RyY3B5KHAsIGNvbW1hbmQpOworCWVsc2UKKwkJY29tbWFuZFswXSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZWxzZQorCitzdGF0aWMgdm9pZCBtNjh2ejMyOF9yZXNldCh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBpbml0X2hhcmR3YXJlKGNoYXIgKmNvbW1hbmQsIGludCBzaXplKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbmZpZ19CU1AoY2hhciAqY29tbWFuZCwgaW50IHNpemUpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiNjhWWjMyOCBEcmFnb25CYWxsVlogc3VwcG9ydCAoYykgMjAwMSBMaW5lbywgSW5jLlxuIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUEFSQU0pCisJc3RybmNweShjb21tYW5kLCBDT05GSUdfQk9PVFBBUkFNX1NUUklORywgc2l6ZSk7CisJY29tbWFuZFtzaXplLTFdID0gMDsKKyNlbHNlCisJbWVtc2V0KGNvbW1hbmQsIDAsIHNpemUpOworI2VuZGlmCisKKwlpbml0X2hhcmR3YXJlKGNvbW1hbmQsIHNpemUpOworCisJbWFjaF9zY2hlZF9pbml0ID0gKHZvaWQgKikgbTY4MzI4X3RpbWVyX2luaXQ7CisJbWFjaF90aWNrID0gbTY4MzI4X3RpbWVyX3RpY2s7CisJbWFjaF9nZXR0aW1lb2Zmc2V0ID0gbTY4MzI4X3RpbWVyX2dldHRpbWVvZmZzZXQ7CisJbWFjaF9nZXR0b2QgPSBtNjgzMjhfdGltZXJfZ2V0dG9kOworCW1hY2hfcmVzZXQgPSBtNjh2ejMyOF9yZXNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvZGUyL2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC9kZTIvY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTg2MTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC9kZTIvY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9NQzY4VlozMjgvZGUyL2NvbmZpZy5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5MyBIYW1pc2ggTWFjZG9uYWxkCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5IEQuIEplZmYgRGlvbm5lCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEdlb3JnZXMgTWVuaWUsIEtlbiBEZXNtZXQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9NQzY4VlozMjguaD4KLQotI2lmZGVmIENPTkZJR19JTklUX0xDRAotI2luY2x1ZGUgInNjcmVlbi5oIgotI2VuZGlmCi0KLS8qIHdpdGggYSAzMy4xNiBNSHogY2xvY2ssIHRoaXMgd2lsbCBnaXZlIHVzZWMgcmVzb2x1dGlvbiB0byB0aGUgdGltZSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ0xPQ0tfU09VUkNFIFRDVExfQ0xLU09VUkNFX1NZU0NMSwotI2RlZmluZSBDTE9DS19QUkUgNwotI2RlZmluZSBUSUNLU19QRVJfSklGRlkgNDE0NTAKLQotc3RhdGljIHZvaWQKLWRyYWdlbjJfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKnRpbWVyX3JvdXRpbmUpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCi17Ci0JLyogZGlzYWJsZSB0aW1lciAxICovCi0JVENUTCA9IDA7Ci0KLQkvKiBzZXQgSVNSICovCi0JaWYgKHJlcXVlc3RfaXJxKFRNUl9JUlFfTlVNLCB0aW1lcl9yb3V0aW5lLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIE5VTEwpKSAKLQkJcGFuaWMoIlVuYWJsZSB0byBhdHRhY2ggdGltZXIgaW50ZXJydXB0XG4iKTsKLQotCS8qIFJlc3RhcnQgbW9kZSwgRW5hYmxlIGludCwgU2V0IGNsb2NrIHNvdXJjZSAqLwotCVRDVEwgPSBUQ1RMX09NIHwgVENUTF9JUlFFTiB8IENMT0NLX1NPVVJDRTsKLQlUUFJFUiA9IENMT0NLX1BSRTsKLQlUQ01QID0gVElDS1NfUEVSX0pJRkZZOwotCi0JLyogRW5hYmxlIHRpbWVyIDEgKi8KLQlUQ1RMIHw9IFRDVExfVEVOOwotfQotCi1zdGF0aWMgdm9pZCBkcmFnZW4yX3RpY2sodm9pZCkKLXsKLQkvKiBSZXNldCBUaW1lcjEgKi8KLQlUU1RBVCAmPSAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkcmFnZW4yX2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpY2tzID0gVENOLCBvZmZzZXQgPSAwOwotCi0JLyogY2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0ICovCi0JaWYgKHRpY2tzIDwgKFRJQ0tTX1BFUl9KSUZGWSA+PiAxKSAmJiAoSVNSICYgKDEgPDwgVE1SX0lSUV9OVU0pKSkKLQkJb2Zmc2V0ID0gMTAwMDAwMCAvIEhaOwotCi0JdGlja3MgPSAodGlja3MgKiAxMDAwMDAwIC8gSFopIC8gVElDS1NfUEVSX0pJRkZZOwotCi0JcmV0dXJuIHRpY2tzICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCBkcmFnZW4yX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLAotCQkJCQkJICAgaW50ICptaW4sIGludCAqc2VjKQotewotCWxvbmcgbm93ID0gUlRDVElNRTsKLQotCSp5ZWFyID0gKm1vbiA9ICpkYXkgPSAxOwotCSpob3VyID0gKG5vdyA+PiAyNCkgJSAyNDsKLQkqbWluID0gKG5vdyA+PiAxNikgJSA2MDsKLQkqc2VjID0gbm93ICUgNjA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYWdlbjJfcmVzZXQodm9pZCkKLXsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0jaWZkZWYgQ09ORklHX0lOSVRfTENECi0JUEJEQVRBIHw9IDB4MjA7CQkJCS8qIGRpc2FibGUgQ0NGTCBsaWdodCAqLwotCVBLREFUQSB8PSAweDQ7CQkJCS8qIGRpc2FibGUgTENEIGNvbnRyb2xsZXIgKi8KLQlMQ0tDT04gPSAwOwotI2VuZGlmCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJInJlc2V0XG5cdCIKLQkJIm1vdmVhbCAjMHgwNDAwMDAwMCwgJWEwXG5cdCIKLQkJIm1vdmVhbCAwKCVhMCksICVzcFxuXHQiCi0JCSJtb3ZlYWwgNCglYTApLCAlYTBcblx0IgotCQkiam1wICglYTApIgotCSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfaGFyZHdhcmUodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfRElSRUNUX0lPX0FDQ0VTUwotCVNDUiA9IDB4MTA7CQkJCQkvKiBhbGxvdyB1c2VyIGFjY2VzcyB0byBpbnRlcm5hbCByZWdpc3RlcnMgKi8KLSNlbmRpZgotCi0JLyogQ1NHQiBJbml0ICovCi0JQ1NHQkIgPSAweDQwMDA7Ci0JQ1NCID0gMHgxYTE7Ci0KLQkvKiBDUzg5MDAgaW5pdCAqLwotCS8qIFBLMzogaGFyZHdhcmUgc2xlZXAgZnVuY3Rpb24gcGluLCBhY3RpdmUgbG93ICovCi0JUEtTRUwgfD0gUEsoMyk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgSS9PICovCi0JUEtESVIgfD0gUEsoMyk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgb3V0cHV0ICovCi0JUEtEQVRBIHw9IFBLKDMpOwkJCS8qIHNldCBwaW4gaGlnaCAqLwotCi0JLyogUEY1OiBoYXJkd2FyZSByZXNldCBmdW5jdGlvbiBwaW4sIGFjdGl2ZSBoaWdoICovCi0JUEZTRUwgfD0gUEYoNSk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgSS9PICovCi0JUEZESVIgfD0gUEYoNSk7CQkJCS8qIHNlbGVjdCBwaW4gYXMgb3V0cHV0ICovCi0JUEZEQVRBICY9IH5QRig1KTsJCQkvKiBzZXQgcGluIGxvdyAqLwotCi0JLyogY3M4OTAwIGhhcmR3YXJlIHJlc2V0ICovCi0JUEZEQVRBIHw9IFBGKDUpOwotCXsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAzMjAwMDsgKytpKTsgfQotCVBGREFUQSAmPSB+UEYoNSk7Ci0KLQkvKiBJTlQxIGVuYWJsZSAoY3M4OTAwIElSUSkgKi8KLQlQRFBPTCAmPSB+UEQoMSk7CQkJLyogYWN0aXZlIGhpZ2ggc2lnbmFsICovCi0JUERJUUVHICY9IH5QRCgxKTsKLQlQRElSUUVOIHw9IFBEKDEpOwkJCS8qIElSUSBlbmFibGVkICovCi0KLSNpZmRlZiBDT05GSUdfNjgzMjhfU0VSSUFMX1VBUlQyCi0JLyogRW5hYmxlIFJYRCBUWEQgcG9ydCBiaXRzIHRvIGVuYWJsZSBVQVJUMiAqLwotCVBKU0VMICY9IH4oUEooNSkgfCBQSig0KSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19JTklUX0xDRAotCS8qIGluaXRpYWxpemUgTENEIGNvbnRyb2xsZXIgKi8KLQlMU1NBID0gKGxvbmcpIHNjcmVlbl9iaXRzOwotCUxWUFcgPSAweDE0OwotCUxYTUFYID0gMHgxNDA7Ci0JTFlNQVggPSAweGVmOwotCUxSUkEgPSAwOwotCUxQWENEID0gMzsKLQlMUElDRiA9IDB4MDg7Ci0JTFBPTENGID0gMDsKLQlMQ0tDT04gPSAweDgwOwotCVBDUERFTiA9IDB4ZmY7Ci0JUENTRUwgPSAwOwotCi0JLyogRW5hYmxlIExDRCBjb250cm9sbGVyICovCi0JUEtESVIgfD0gMHg0OwotCVBLU0VMIHw9IDB4NDsKLQlQS0RBVEEgJj0gfjB4NDsKLQotCS8qIEVuYWJsZSBDQ0ZMIGJhY2tsaWdodGluZyBjaXJjdWl0ICovCi0JUEJESVIgfD0gMHgyMDsKLQlQQlNFTCB8PSAweDIwOwotCVBCREFUQSAmPSB+MHgyMDsKLQotCS8qIGNvbnRyYXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQlQRkRJUiB8PSAweDE7Ci0JUEZTRUwgJj0gfjB4MTsKLQlQV01SID0gMHgwMzdGOwotI2VuZGlmCi19Ci0KLXZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kLCBpbnQgc2l6ZSkKLXsKLQlwcmludGsoS0VSTl9JTkZPICI2OFZaMzI4IERyYWdvbkJhbGxWWiBzdXBwb3J0IChjKSAyMDAxIExpbmVvLCBJbmMuXG4iKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQQVJBTSkKLQlzdHJuY3B5KGNvbW1hbmQsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLQljb21tYW5kW3NpemUtMV0gPSAwOwotI2Vsc2UKLQltZW1zZXQoY29tbWFuZCwgMCwgc2l6ZSk7Ci0jZW5kaWYKLQotCWluaXRfaGFyZHdhcmUoKTsKLQotCW1hY2hfc2NoZWRfaW5pdCA9ICh2b2lkICopZHJhZ2VuMl9zY2hlZF9pbml0OwotCW1hY2hfdGljayA9IGRyYWdlbjJfdGljazsKLQltYWNoX2dldHRpbWVvZmZzZXQgPSBkcmFnZW4yX2dldHRpbWVvZmZzZXQ7Ci0JbWFjaF9yZXNldCA9IGRyYWdlbjJfcmVzZXQ7Ci0JbWFjaF9nZXR0b2QgPSBkcmFnZW4yX2dldHRvZDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvdWNkaW1tL2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC91Y2RpbW0vY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWFkYWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC91Y2RpbW0vY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L3VjZGltbS9jb25maWcuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTMgSGFtaXNoIE1hY2RvbmFsZAotICogIENvcHlyaWdodCAoQykgMTk5OSBELiBKZWZmIERpb25uZQotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9NQzY4VlozMjguaD4KLSNpbmNsdWRlIDxhc20vYm9vdHN0ZC5oPgotCi12b2lkIEJTUF9zY2hlZF9pbml0KHZvaWQgKCp0aW1lcl9yb3V0aW5lKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCi17Ci0JLyogUmVzdGFydCBtb2RlLCBFbmFibGUgaW50LCAzMktIeiwgRW5hYmxlIHRpbWVyICovCi0JVENUTCA9IFRDVExfT00gfCBUQ1RMX0lSUUVOIHwgVENUTF9DTEtTT1VSQ0VfMzJLSFogfCBUQ1RMX1RFTjsKLQkvKiBTZXQgcHJlc2NhbGVyIChEaXZpZGUgMzJLSHogYnkgMzIpKi8KLQlUUFJFUiA9IDMxOwotCS8qIFNldCBjb21wYXJlIHJlZ2lzdGVyICAzMktoeiAvIDMyIC8gMTAgPSAxMDAgKi8KLQlUQ01QID0gMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCXJlcXVlc3RfaXJxKFRNUl9JUlFfTlVNLCB0aW1lcl9yb3V0aW5lLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIE5VTEwpOwotfQotCi12b2lkIEJTUF90aWNrKHZvaWQpCi17Ci0gIAkvKiBSZXNldCBUaW1lcjEgKi8KLQlUU1RBVCAmPSAwOwotfQotCi11bnNpZ25lZCBsb25nIEJTUF9nZXR0aW1lb2Zmc2V0ICh2b2lkKQotewotCXJldHVybiAwOwotfQotCi12b2lkIEJTUF9nZXR0b2QgKGludCAqeWVhcnAsIGludCAqbW9ucCwgaW50ICpkYXlwLAotCQkgICBpbnQgKmhvdXJwLCBpbnQgKm1pbnAsIGludCAqc2VjcCkKLXsKLX0KLQotaW50IEJTUF9od2NsayhpbnQgb3AsIHN0cnVjdCBod2Nsa190aW1lICp0KQotewotCWlmICghb3ApIHsKLQkJLyogcmVhZCAqLwotCX0gZWxzZSB7Ci0JCS8qIHdyaXRlICovCi0JfQotCXJldHVybiAwOwotfQotCi1pbnQgQlNQX3NldF9jbG9ja19tbXNzICh1bnNpZ25lZCBsb25nIG5vd3RpbWUpCi17Ci0jaWYgMAotCXNob3J0IHJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MCwgcmVhbF9taW51dGVzID0gKG5vd3RpbWUgLyA2MCkgJSA2MDsKLQotCXRvZC0+c2Vjb25kMSA9IHJlYWxfc2Vjb25kcyAvIDEwOwotCXRvZC0+c2Vjb25kMiA9IHJlYWxfc2Vjb25kcyAlIDEwOwotCXRvZC0+bWludXRlMSA9IHJlYWxfbWludXRlcyAvIDEwOwotCXRvZC0+bWludXRlMiA9IHJlYWxfbWludXRlcyAlIDEwOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQlNQX3Jlc2V0ICh2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JYXNtIHZvbGF0aWxlICgiCi0JCW1vdmVhbCAjMHgxMGMwMDAwMCwgJWEwOwotCQltb3ZlYiAjMCwgMHhGRkZGRjMwMDsKLQkJbW92ZWFsIDAoJWEwKSwgJXNwOwotCQltb3ZlYWwgNCglYTApLCAlYTA7Ci0JCWptcCAoJWEwKTsKLQkiKTsKLX0KLQotdW5zaWduZWQgY2hhciAqY3M4OTAwYV9od2FkZHI7Ci1zdGF0aWMgaW50IGVycm5vOwotCi1fYnNjMChjaGFyICosIGdldHNlcmlhbG51bSkKLV9ic2MxKHVuc2lnbmVkIGNoYXIgKiwgZ2V0aHdhZGRyLCBpbnQsIGEpCi1fYnNjMShjaGFyICosIGdldGJlbnYsIGNoYXIgKiwgYSkKLQotdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmQsIGludCBsZW4pCi17Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCXByaW50ayhLRVJOX0lORk8gIlxuNjhWWjMyOCBEcmFnb25CYWxsVlogc3VwcG9ydCAoYykgMjAwMSBMaW5lbywgSW5jLlxuIik7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ1Q2RpbW0gc2VyaWFsIHN0cmluZyBbJXNdXG4iLGdldHNlcmlhbG51bSgpKTsKLQlwID0gY3M4OTAwYV9od2FkZHIgPSBnZXRod2FkZHIoMCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidUNkaW1tIGh3YWRkciAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeFxuIiwKLQkJcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSk7Ci0JcCA9IGdldGJlbnYoIkFQUEVORCIpOwotCWlmIChwKSBzdHJjcHkocCxjb21tYW5kKTsKLQllbHNlIGNvbW1hbmRbMF0gPSAwOwotIAotCW1hY2hfc2NoZWRfaW5pdCAgICAgID0gQlNQX3NjaGVkX2luaXQ7Ci0JbWFjaF90aWNrICAgICAgICAgICAgPSBCU1BfdGljazsKLQltYWNoX2dldHRpbWVvZmZzZXQgICA9IEJTUF9nZXR0aW1lb2Zmc2V0OwotCW1hY2hfZ2V0dG9kICAgICAgICAgID0gQlNQX2dldHRvZDsKLQltYWNoX3Jlc2V0ICAgICAgICAgICA9IEJTUF9yZXNldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnIGIvYXJjaC9taXBzL0tjb25maWcKaW5kZXggZDc5ZmJhMC4uMGViNzFhYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcKQEAgLTQsNiArNCwxMSBAQAogCSMgSG9ycmlibGUgc291cmNlIG9mIGNvbmZ1c2lvbi4gIERpZSwgZGllLCBkaWUgLi4uCiAJc2VsZWN0IEVNQkVEREVECiAKKyMgc2hvdWxkbid0IGl0IGJlIHBlci1zdWJhcmNoaXRlY3R1cmU/Citjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKKwlib29sCisJZGVmYXVsdCB5CisKIG1haW5tZW51ICJMaW51eC9NSVBTIEtlcm5lbCBDb25maWd1cmF0aW9uIgogCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKQEAgLTE0OSw2ICsxNTQsMTMgQEAKIAkgIFRoZSBUQU5CQUMgTWJhc2UoVEIwMjI2KSBpcyBhIE1JUFMtYmFzZWQgcGxhdGZvcm0gbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KIAkgIFBsZWFzZSByZWZlciB0byA8aHR0cDovL3d3dy50YW5iYWMuY28uanAvPiBhYm91dCBNYmFzZS4KIAorY29uZmlnIFRBTkJBQ19UQjAyODcKKwlib29sICJTdXBwb3J0IGZvciBUQU5CQUMgTWluaS1JVFggRElNTSBiYXNlKFRCMDI4NykiCisJZGVwZW5kcyBvbiBUQU5CQUNfVEIwMjJYCisJaGVscAorCSAgVGhlIFRBTkJBQyBNaW5pLUlUWCBESU1NIGJhc2UoVEIwMjg3KSBpcyBhIE1JUFMtYmFzZWQgcGxhdGZvcm0gbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KKwkgIFBsZWFzZSByZWZlciB0byA8aHR0cDovL3d3dy50YW5iYWMuY28uanAvPiBhYm91dCBNaW5pLUlUWCBESU1NIGJhc2UuCisKIGNvbmZpZyBWSUNUT1JfTVBDMzBYCiAJYm9vbCAiU3VwcG9ydCBmb3IgVmljdG9yIE1QLUMzMDMvMzA0IgogCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCBiMGZkYWVlLi4zNDZlODAzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC03MjAsMzggKzcyMCw3IEBACiAJQCQoTUFLRSkgJChjbGVhbik9YXJjaC9taXBzL2Jvb3QKIAlAJChNQUtFKSAkKGNsZWFuKT1hcmNoL21pcHMvbGFzYXQKIAotIyBHZW5lcmF0ZSA8YXNtL29mZnNldC5oCi0jCi0jIFRoZSBkZWZhdWx0IHJ1bGUgaXMgc3VmZmVyaW5nIGZyb20gZnVubnkgcHJvYmxlbXMgb24gTUlQUyBzbyB3ZSB1c2luZyBvdXIKLSMgb3duIC4uLgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotZGVmaW5lIGZpbGVjaGtfZ2VuLWFzbS1vZmZzZXQuaAotCShzZXQgLWU7IFwKLQkgZWNobyAiI2lmbmRlZiBfQVNNX09GRlNFVF9IIjsgXAotCSBlY2hvICIjZGVmaW5lIF9BU01fT0ZGU0VUX0giOyBcCi0JIGVjaG8gIi8qIjsgXAotCSBlY2hvICIgKiBETyBOT1QgTU9ESUZZLiI7IFwKLQkgZWNobyAiICoiOyBcCi0JIGVjaG8gIiAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFyY2gvJChBUkNIKS9NYWtlZmlsZSI7IFwKLQkgZWNobyAiICoiOyBcCi0JIGVjaG8gIiAqLyI7IFwKLQkgZWNobyAiIjsgXAotCSBzZWQgLW5lICIvXkBAQC9zLy8vcCI7IFwKLQkgZWNobyAiI2VuZGlmIC8qIF9BU01fT0ZGU0VUX0ggKi8iICkKLWVuZGVmCi0KLXByZXBhcmU6IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0LmgKLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9vZmZzZXQuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldC5oOiBhcmNoLyQoQVJDSCkva2VybmVsL29mZnNldC5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXQuaCkKLQotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXQuaC50bXAgXAotCSAgICAgICBpbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldC5oIFwKLQkgICAgICAgdm1saW51eC4zMiBcCitDTEVBTl9GSUxFUyArPSB2bWxpbnV4LjMyIFwKIAkgICAgICAgdm1saW51eC42NCBcCiAJICAgICAgIHZtbGludXguZWNvZmYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDI4N19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjlmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTA0MSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLW1tMQorIyBUaHUgU2VwICAxIDIyOjU4OjM0IDIwMDUKKyMKK0NPTkZJR19NSVBTPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQorQ09ORklHX0tNT0Q9eQorQ09ORklHX1NZU19TVVBQT1JUU18zMkJJVF9LRVJORUw9eQorQ09ORklHX1NZU19TVVBQT1JUU182NEJJVF9LRVJORUw9eQorQ09ORklHX0NQVV9TVVBQT1JUU18zMkJJVF9LRVJORUw9eQorQ09ORklHX0NQVV9TVVBQT1JUU182NEJJVF9LRVJORUw9eQorCisjCisjIEtlcm5lbCB0eXBlCisjCitDT05GSUdfMzJCSVQ9eQorIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAorCisjCisjIE1hY2hpbmUgc2VsZWN0aW9uCisjCisjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAorQ09ORklHX01BQ0hfVlI0MVhYPXkKKyMgQ09ORklHX05FQ19DTUJWUjQxMzMgaXMgbm90IHNldAorIyBDT05GSUdfQ0FTSU9fRTU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9XT1JLUEFEIGlzIG5vdCBzZXQKK0NPTkZJR19UQU5CQUNfVEIwMjJYPXkKKyMgQ09ORklHX1RBTkJBQ19UQjAyMjYgaXMgbm90IHNldAorQ09ORklHX1RBTkJBQ19UQjAyODc9eQorIyBDT05GSUdfVklDVE9SX01QQzMwWCBpcyBub3Qgc2V0CisjIENPTkZJR19aQU9fQ0FQQ0VMTEEgaXMgbm90IHNldAorQ09ORklHX1BDSV9WUjQxWFg9eQorIyBDT05GSUdfVlJDNDE3MyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAorIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfQVRMQVMgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NQUxUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX1NFQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19PQ0VMT1QgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRyBpcyBub3Qgc2V0CisjIENPTkZJR19NT01FTkNPX09DRUxPVF9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTUVOQ09fT0NFTE9UXzMgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNQ19ZT1NFTUlURSBpcyBub3Qgc2V0CisjIENPTkZJR19EREI1MDc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0REQjU0NzYgaXMgbm90IHNldAorIyBDT05GSUdfRERCNTQ3NyBpcyBub3Qgc2V0CisjIENPTkZJR19RRU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPQ19BVTFYMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX1NCMXh4eF9TT0MgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CitDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKK0NPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKK0NPTkZJR19DUFVfTElUVExFX0VORElBTj15CitDT05GSUdfSVJRX0NQVT15CitDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01CisKKyMKKyMgQ1BVIHNlbGVjdGlvbgorIworIyBDT05GSUdfQ1BVX01JUFMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTUlQUzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfVlI0MVhYPXkKKyMgQ09ORklHX0NQVV9SNDMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjRYMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1RYNDlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjUwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I1NDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SNjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTkVWQURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SODAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjEwMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9STTcwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1JNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU0IxIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX1NZTkM9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKworIworIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIElTQSwgVEMpCisjCitDT05GSUdfSFdfSEFTX1BDST15CitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CitDT05GSUdfTU1VPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX1RSQURfU0lHTkFMUz15CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKK0NPTkZJR19YRlJNX1VTRVI9bQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgaXMgbm90IHNldAorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfSVBJUD1tCitDT05GSUdfTkVUX0lQR1JFPW0KKyMgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorQ09ORklHX0lORVRfVFVOTkVMPW0KK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEPXkKKworIworIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCisjCitDT05GSUdfVENQX0NPTkdfQklDPXkKK0NPTkZJR19UQ1BfQ09OR19XRVNUV09PRD1tCitDT05GSUdfVENQX0NPTkdfSFRDUD1tCisjIENPTkZJR19UQ1BfQ09OR19IU1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19IWUJMQSBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19WRUdBUyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD1tCisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFUENJPXkKKyMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9QQ0lfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU0lJTUFHRT15CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9RTEEyWFhYPXkKKyMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCitDT05GSUdfSUVFRTEzOTQ9bQorCisjCisjIFN1YnN5c3RlbSBPcHRpb25zCisjCisjIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfT1VJX0RCIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9FWFRSQV9DT05GSUdfUk9NUz15CitDT05GSUdfSUVFRTEzOTRfQ09ORklHX1JPTV9JUDEzOTQ9eQorIyBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIFRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDCisjCitDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQ9bQorCisjCisjIFByb3RvY29sIERyaXZlcnMKKyMKK0NPTkZJR19JRUVFMTM5NF9WSURFTzEzOTQ9bQorQ09ORklHX0lFRUUxMzk0X1NCUDI9bQorIyBDT05GSUdfSUVFRTEzOTRfU0JQMl9QSFlTX0RNQSBpcyBub3Qgc2V0CitDT05GSUdfSUVFRTEzOTRfRVRIMTM5ND1tCitDT05GSUdfSUVFRTEzOTRfRFYxMzk0PW0KK0NPTkZJR19JRUVFMTM5NF9SQVdJTz1tCitDT05GSUdfSUVFRTEzOTRfQ01QPW0KK0NPTkZJR19JRUVFMTM5NF9BTURUUD1tCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19EVU1NWT1tCisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CitDT05GSUdfUjgxNjk9eQorIyBDT05GSUdfUjgxNjlfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREJPRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX1ZSNDFYWD15CitDT05GSUdfU0VSSUFMX1ZSNDFYWF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfVlI0MVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfVEFOQkFDX1RCMDIxOSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorQ09ORklHX0dQSU9fVlI0MVhYPXkKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTcGVha3VwIGNvbnNvbGUgc3BlZWNoCisjCisjIENPTkZJR19TUEVBS1VQIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQj1tCisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9bQorIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPW0KKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0JMVUVUT09USF9UVFkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD1tCitDT05GSUdfVVNCX0hJRElOUFVUPXkKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR09URU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIFNOIERldmljZXMKKyMKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworQ09ORklHX1hGU19GUz15CisjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorQ09ORklHX1hGU19RVU9UQT15CisjIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX1hGU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPW0KK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19RVU9UQUNUTD15CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVNGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz1tCisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfQ1JPU1NDT01QSUxFPXkKK0NPTkZJR19DTURMSU5FPSJtZW09NjRNIGNvbnNvbGU9dHR5VlIwLDExNTIwMCBpcD1hbnkgcm9vdD0vZGV2L25mcyIKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCitDT05GSUdfS0VZUz15CitDT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVM9eQorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9bQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbnJ0Yy5jIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5ydGMuYwppbmRleCAyODhiZjUxLi43MTQxNmU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2dlbnJ0Yy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VucnRjLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vcnRjLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIAotc3RhdGljIHNwaW5sb2NrX3QgbWlwc19ydGNfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWlwc19ydGNfbG9jayk7CiAKIHVuc2lnbmVkIGludCBnZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCmluZGV4IDdlZWM3NTYuLjQ0Nzc1OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqIG1vdmVzIHRvIGFyY2ggaW5kZXBlbmRlbnQgbGFuZAogICovCiAKLXNwaW5sb2NrX3QgaTgyNTlBX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzcGlubG9ja190IERFRklORV9TUElOTE9DSyhpODI1OUFfbG9jayk7CiAKIHN0YXRpYyB2b2lkIGVuZF84MjU5QV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lyaXhpb2N0bC5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4aW9jdGwuYwppbmRleCA0Y2QzZDM4Li4zY2RjMjIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lyaXhpb2N0bC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeGlvY3RsLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9jdGwuaD4KQEAgLTMzLDcgKzM0LDcgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5cCA9IE5VTEw7CiAKLQlzcGluX2xvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlmaWxwID0gZmNoZWNrKGZkKTsKIAlpZihmaWxwICYmIGZpbHAtPnByaXZhdGVfZGF0YSkgewogCQl0dHlwID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIGZpbHAtPnByaXZhdGVfZGF0YTsKQEAgLTQxLDcgKzQyLDcgQEAKIAkJaWYodHR5cC0+bWFnaWMgIT0gVFRZX01BR0lDKQogCQkJdHR5cCA9TlVMTDsKIAl9Ci0Jc3Bpbl91bmxvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiB0dHlwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lyaXhzaWcuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCmluZGV4IDRjMTE0YWUuLmVmZjg5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jCkBAIC00NDAsMTggKzQ0MCw2IEBACiAJfSBzdHVmZjsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aW1lc3BlY3RvamlmZmllcyhzdHJ1Y3QgdGltZXNwZWMgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgc2VjID0gKHVuc2lnbmVkKSB2YWx1ZS0+dHZfc2VjOwotCWxvbmcgbnNlYyA9IHZhbHVlLT50dl9uc2VjOwotCi0JaWYgKHNlYyA+IChMT05HX01BWCAvIEhaKSkKLQkJcmV0dXJuIExPTkdfTUFYOwotCW5zZWMgKz0gMTAwMDAwMDAwMEwgLyBIWiAtIDE7Ci0JbnNlYyAvPSAxMDAwMDAwMDAwTCAvIEhaOwotCXJldHVybiBIWiAqIHNlYyArIG5zZWM7Ci19Ci0KIGFzbWxpbmthZ2UgaW50IGlyaXhfc2lncG9sbF9zeXModW5zaWduZWQgbG9uZyAqc2V0LCBzdHJ1Y3QgaXJpeDVfc2lnaW5mbyAqaW5mbywKIAkJCQlzdHJ1Y3QgdGltZXNwZWMgKnRwKQogewpAQCAtNDg5LDE0ICs0NzcsMTMgQEAKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWV4cGlyZSA9IHRpbWVzcGVjdG9qaWZmaWVzKHRwKSsodHAtPnR2X3NlY3x8dHAtPnR2X25zZWMpOworCQlleHBpcmUgPSB0aW1lc3BlY190b19qaWZmaWVzKHRwKSArICh0cC0+dHZfc2VjfHx0cC0+dHZfbnNlYyk7CiAJfQogCiAJd2hpbGUoMSkgewogCQlsb25nIHRtcCA9IDA7CiAKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXQoZXhwaXJlKTsKKwkJZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGV4cGlyZSk7CiAKIAkJZm9yIChpPTA7IGk8PTQ7IGkrKykKIAkJCXRtcCB8PSAoY3VycmVudC0+cGVuZGluZy5zaWduYWwuc2lnW2ldICYga3NldC5zaWdbaV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwppbmRleCA0NjEzMjE5Li5lY2U0NTY0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwpAQCAtNTQ2LDIwICs1NDYsMjAgQEAKIHN0cnVjdCBpcGNfcGVybTMyCiB7CiAJa2V5X3QgICAgCSAga2V5OwotICAgICAgICBjb21wYXRfdWlkX3QgIHVpZDsKLSAgICAgICAgY29tcGF0X2dpZF90ICBnaWQ7Ci0gICAgICAgIGNvbXBhdF91aWRfdCAgY3VpZDsKLSAgICAgICAgY29tcGF0X2dpZF90ICBjZ2lkOworICAgICAgICBfX2NvbXBhdF91aWRfdCAgdWlkOworICAgICAgICBfX2NvbXBhdF9naWRfdCAgZ2lkOworICAgICAgICBfX2NvbXBhdF91aWRfdCAgY3VpZDsKKyAgICAgICAgX19jb21wYXRfZ2lkX3QgIGNnaWQ7CiAgICAgICAgIGNvbXBhdF9tb2RlX3QJbW9kZTsKICAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNlcTsKIH07CiAKIHN0cnVjdCBpcGM2NF9wZXJtMzIgewogCWtleV90IGtleTsKLQljb21wYXRfdWlkX3QgdWlkOwotCWNvbXBhdF9naWRfdCBnaWQ7Ci0JY29tcGF0X3VpZF90IGN1aWQ7Ci0JY29tcGF0X2dpZF90IGNnaWQ7CisJX19jb21wYXRfdWlkX3QgdWlkOworCV9fY29tcGF0X2dpZF90IGdpZDsKKwlfX2NvbXBhdF91aWRfdCBjdWlkOworCV9fY29tcGF0X2dpZF90IGNnaWQ7CiAJY29tcGF0X21vZGVfdAltb2RlOwogCXVuc2lnbmVkIHNob3J0CXNlcTsKIAl1bnNpZ25lZCBzaG9ydCBfX3BhZDE7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3IyMzAwX2ZwdS5TIGIvYXJjaC9taXBzL2tlcm5lbC9yMjMwMF9mcHUuUwppbmRleCBmODNjMzFmLi5hYzY4ZTY4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3IyMzAwX2ZwdS5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcjIzMDBfZnB1LlMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIEVYKGEsYikJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yMjMwMF9zd2l0Y2guUyBiL2FyY2gvbWlwcy9rZXJuZWwvcjIzMDBfc3dpdGNoLlMKaW5kZXggZjEwMDE5Ni4uMGQ5YzRhMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yMjMwMF9zd2l0Y2guUworKysgYi9hcmNoL21pcHMva2VybmVsL3IyMzAwX3N3aXRjaC5TCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUyBiL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCmluZGV4IGFiYTY2NWIuLjFhMTRjNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KIAogCS5tYWNybwlFWCBpbnNuLCByZWcsIHNyYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwppbmRleCBlMDJiNzcyLi5kMmFmYmQxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgogI2luY2x1ZGUgPGFzbS9mcHJlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWJpdHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3I2MDAwX2ZwdS5TIGIvYXJjaC9taXBzL2tlcm5lbC9yNjAwMF9mcHUuUwppbmRleCBkOGQzYjEzLi40M2NkYTUzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I2MDAwX2ZwdS5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcjYwMDBfZnB1LlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KIAogCS5zZXQJbm9yZW9yZGVyCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKaW5kZXggMzQ0ZjJlMi4uMTdiNTAzMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAvKiBIaWdoZXN0IHN5c2NhbGwgdXNlZCBvZiBhbnkgc3lzY2FsbCBmbGF2b3VyICovCiAjZGVmaW5lIE1BWF9TWVNDQUxMX05PCV9fTlJfTzMyX0xpbnV4ICsgX19OUl9PMzJfTGludXhfc3lzY2FsbHMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKaW5kZXggMzJlZmI4OC4uZmZiMjJhMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrZnJhbWUuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c21pcHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCmluZGV4IGFlMmExMzEuLjIxZTNlMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaXBjLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vc2ltLmg+CiAjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jCmluZGV4IGYzYmYwZTQuLjRkZTE1NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jCkBAIC02MzIsMTAgKzYzMiw3IEBACiAJd3JpdGVfc2VxbG9ja19pcnEoJnh0aW1lX2xvY2spOwogCXh0aW1lLnR2X3NlYyA9IHZhbHVlOwogCXh0aW1lLnR2X25zZWMgPSAwOwotCXRpbWVfYWRqdXN0ID0gMDsJCQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMTAzNSw4ICsxMDMyLDcgQEAKIAogYXNtbGlua2FnZSBpbnQgaXJpeF9zZ2luYXAoaW50IHRpY2tzKQogewotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQodGlja3MpOworCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aWNrcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKaW5kZXggNjQ4YzgyMi4uMGRkMGRmN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCkBAIC0yMjMsMTAgKzIyMyw3IEBACiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JdGltZV9hZGp1c3QgPSAwOwkJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwpAQCAtNDQyLDcgKzQzOSw3IEBACiAJICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgogCSAqLwogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwotCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJgogCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA+PSA1MDAwMDAgLSAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMiAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliLTMyL21lbXNldC5TIGIvYXJjaC9taXBzL2xpYi0zMi9tZW1zZXQuUwppbmRleCBhZDlmZjQwLi4xOTgxNDg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliLTMyL21lbXNldC5TCisrKyBiL2FyY2gvbWlwcy9saWItMzIvbWVtc2V0LlMKQEAgLTcsNyArNyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAKICNkZWZpbmUgRVgoaW5zbixyZWcsYWRkcixoYW5kbGVyKQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItNjQvbWVtc2V0LlMgYi9hcmNoL21pcHMvbGliLTY0L21lbXNldC5TCmluZGV4IDI0MmYxOTcuLmUyYzQyYzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWItNjQvbWVtc2V0LlMKKysrIGIvYXJjaC9taXBzL2xpYi02NC9tZW1zZXQuUwpAQCAtNyw3ICs3LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KICNpbmNsdWRlIDxhc20vYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KIAogI2RlZmluZSBFWChpbnNuLHJlZyxhZGRyLGhhbmRsZXIpCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9kZWNfYW5kX2xvY2suYyBiL2FyY2gvbWlwcy9saWIvZGVjX2FuZF9sb2NrLmMKaW5kZXggZTQ0ZTk1Ny4uZmQ4MmM4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9kZWNfYW5kX2xvY2suYworKysgYi9hcmNoL21pcHMvbGliL2RlY19hbmRfbG9jay5jCkBAIC0yMCwxNCArMjAsNyBAQAogICogaGFzIGEgY21weGNoZywgYW5kIHdoZXJlIGF0b21pYy0+dmFsdWUgaXMgYW4gaW50IGhvbGRpbmcKICAqIHRoZSB2YWx1ZSBvZiB0aGUgYXRvbWljIChpLmUuIHRoZSBoaWdoIGJpdHMgYXJlbid0IHVzZWQKICAqIGZvciBhIGxvY2sgb3IgYW55dGhpbmcgbGlrZSB0aGF0KS4KLSAqCi0gKiBOLkIuIEFUT01JQ19ERUNfQU5EX0xPQ0sgZ2V0cyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvc3BpbmxvY2suaAotICogaWYgc3BpbmxvY2tzIGFyZSBlbXB0eSBhbmQgdGh1cyBhdG9taWNfZGVjX2FuZF9sb2NrIGlzIGRlZmluZWQKLSAqIHRvIGJlIGF0b21pY19kZWNfYW5kX3Rlc3QgLSBpbiB0aGF0IGNhc2Ugd2UgZG9uJ3QgbmVlZCBpdAotICogZGVmaW5lZCBoZXJlIGFzIHdlbGwuCiAgKi8KLQotI2lmbmRlZiBBVE9NSUNfREVDX0FORF9MT0NLCiBpbnQgX2F0b21pY19kZWNfYW5kX2xvY2soYXRvbWljX3QgKmF0b21pYywgc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlpbnQgY291bnRlcjsKQEAgLTUyLDQgKzQ1LDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChfYXRvbWljX2RlY19hbmRfbG9jayk7Ci0jZW5kaWYgLyogQVRPTUlDX0RFQ19BTkRfTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9tZW1jcHkuUyBiL2FyY2gvbWlwcy9saWIvbWVtY3B5LlMKaW5kZXggOTBlZThkNC4uYTc4ODY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9tZW1jcHkuUworKysgYi9hcmNoL21pcHMvbGliL21lbWNweS5TCkBAIC0xNCw3ICsxNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KIAogI2RlZmluZSBkc3QgYTAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvc3RybGVuX3VzZXIuUyBiL2FyY2gvbWlwcy9saWIvc3RybGVuX3VzZXIuUwppbmRleCAwNzY2MGU4Li5lY2E1NThkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cmxlbl91c2VyLlMKKysrIGIvYXJjaC9taXBzL2xpYi9zdHJsZW5fdXNlci5TCkBAIC03LDcgKzcsNyBAQAogICogQ29weXJpZ2h0IChjKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwogI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIEVYKGluc24scmVnLGFkZHIsaGFuZGxlcikJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TIGIvYXJjaC9taXBzL2xpYi9zdHJuY3B5X3VzZXIuUwppbmRleCAxNGJlZDE3Li5kMTZjNzZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TCisrKyBiL2FyY2gvbWlwcy9saWIvc3RybmNweV91c2VyLlMKQEAgLTcsNyArNyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogCiAjZGVmaW5lIEVYKGluc24scmVnLGFkZHIsaGFuZGxlcikJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL3N0cm5sZW5fdXNlci5TIGIvYXJjaC9taXBzL2xpYi9zdHJubGVuX3VzZXIuUwppbmRleCA2ZTdhOGVlLi5jMGVhMTUxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL3N0cm5sZW5fdXNlci5TCisrKyBiL2FyY2gvbWlwcy9saWIvc3Rybmxlbl91c2VyLlMKQEAgLTcsNyArNyw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICovCiAjaW5jbHVkZSA8YXNtL2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAKICNkZWZpbmUgRVgoaW5zbixyZWcsYWRkcixoYW5kbGVyKQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IGM1M2U0Y2IuLjgzZDgxYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQpAQCAtNDgsNiArNDgsNyBAQAogb2JqLSQoQ09ORklHX1NOSV9STTIwMF9QQ0kpCSs9IGZpeHVwLXNuaS5vIG9wcy1zbmkubwogb2JqLSQoQ09ORklHX1RBTkJBQ19UQjAyMTkpCSs9IGZpeHVwLXRiMDIxOS5vCiBvYmotJChDT05GSUdfVEFOQkFDX1RCMDIyNikJKz0gZml4dXAtdGIwMjI2Lm8KK29iai0kKENPTkZJR19UQU5CQUNfVEIwMjg3KQkrPSBmaXh1cC10YjAyODcubwogb2JqLSQoQ09ORklHX1RPU0hJQkFfSk1SMzkyNykJKz0gZml4dXAtam1yMzkyNy5vIHBjaS1qbXIzOTI3Lm8KIG9iai0kKENPTkZJR19UT1NISUJBX1JCVFg0OTI3KQkrPSBmaXh1cC1yYnR4NDkyNy5vIG9wcy10eDQ5Mjcubwogb2JqLSQoQ09ORklHX1ZJQ1RPUl9NUEMzMFgpCSs9IGZpeHVwLW1wYzMweC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDI4Ny5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyODcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDM2ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyODcuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogIGZpeHVwLXRiMDI4Ny5jLCBUaGUgVEFOQkFDIFRCMDI4NyBzcGVjaWZpYyBQQ0kgZml4dXBzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vdnI0MXh4L3RiMDI4Ny5oPgorCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJdW5zaWduZWQgY2hhciBidXM7CisJaW50IGlycSA9IC0xOworCisJYnVzID0gZGV2LT5idXMtPm51bWJlcjsKKwlpZiAoYnVzID09IDApIHsKKwkJc3dpdGNoIChzbG90KSB7CisJCWNhc2UgMTY6CisJCQlpcnEgPSBUQjAyODdfU001MDFfSVJROworCQkJYnJlYWs7CisJCWNhc2UgMTc6CisJCQlpcnEgPSBUQjAyODdfU0lMNjgwQV9JUlE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChidXMgPT0gMSkgeworCQlzd2l0Y2ggKFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSB7CisJCWNhc2UgMDoKKwkJCWlycSA9IFRCMDI4N19QQ0lfU0xPVF9JUlE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQlpcnEgPSBUQjAyODdfUlRMODExMF9JUlE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChidXMgPiAxKSB7CisJCWlycSA9IFRCMDI4N19QQ0lfU0xPVF9JUlE7CisJfQorCisJcmV0dXJuIGlycTsKK30KKworLyogRG8gcGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIGluaXRpYWxpemF0aW9uIGF0IHBjaV9lbmFibGVfZGV2aWNlKCkgdGltZSAqLworaW50IHBjaWJpb3NfcGxhdF9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKaW5kZXggOGMxYjk2Zi4uY2RkZjFjZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkgKiBSVEMgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQogCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB3aGVuIGEgc2Vjb25kIHN0YXJ0cy4KIAkgKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvS2NvbmZpZyBiL2FyY2gvcGFyaXNjL0tjb25maWcKaW5kZXggMWMyZDg3NC4uMGIwNzkyMiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvS2NvbmZpZworKysgYi9hcmNoL3BhcmlzYy9LY29uZmlnCkBAIC00OSw2ICs0OSwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9NYWtlZmlsZSBiL2FyY2gvcGFyaXNjL01ha2VmaWxlCmluZGV4IDA0MDNkMmYuLjNiMzM5YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL01ha2VmaWxlCisrKyBiL2FyY2gvcGFyaXNjL01ha2VmaWxlCkBAIC0xMDAsMTUgKzEwMCw3IEBACiAKIGluc3RhbGw6IGtlcm5lbF9pbnN0YWxsIG1vZHVsZXNfaW5zdGFsbAogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS1wYXJpc2Mvb2Zmc2V0cy5oCi0KLWFyY2gvcGFyaXNjL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLXBhcmlzYy9vZmZzZXRzLmg6IGFyY2gvcGFyaXNjL2tlcm5lbC9hc20tb2Zmc2V0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCi1DTEVBTl9GSUxFUwkrPSBsaWZpbWFnZSBpbmNsdWRlL2FzbS1wYXJpc2Mvb2Zmc2V0cy5oCitDTEVBTl9GSUxFUwkrPSBsaWZpbWFnZQogTVJQUk9QRVJfRklMRVMJKz0gcGFsby5jb25mCiAKIGRlZmluZSBhcmNoaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaHB1eC9nYXRlLlMgYi9hcmNoL3BhcmlzYy9ocHV4L2dhdGUuUwppbmRleCAyNjgwYTFjLi5hYWFmMzMwIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9ocHV4L2dhdGUuUworKysgYi9hcmNoL3BhcmlzYy9ocHV4L2dhdGUuUwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmx5Lmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2hwdXgvd3JhcHBlcnMuUyBiL2FyY2gvcGFyaXNjL2hwdXgvd3JhcHBlcnMuUwppbmRleCAxYWE5MzZkLi4wYjBjM2E2IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9ocHV4L3dyYXBwZXJzLlMKKysrIGIvYXJjaC9wYXJpc2MvaHB1eC93cmFwcGVycy5TCkBAIC0yNCw3ICsyNCw3IEBACiAjd2FybmluZyBQQTY0IHN1cHBvcnQgbmVlZHMgbW9yZSB3b3JrLi4uZGlkIGZpcnN0IGN1dAogI2VuZGlmCiAKLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJseS5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwppbmRleCBlZTU4ZDM3Li5iZTBmMDdmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwpAQCAtMjMsNyArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAvKiB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zc2liaWxpdGllcyB0byBhY3Qgb24gYW4gaW50ZXJydXB0aW9uOgogICogIC0gaGFuZGxlIGluIGFzc2VtYmx5IGFuZCB1c2Ugc2hhZG93ZWQgcmVnaXN0ZXJzIG9ubHkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaGVhZC5TCmluZGV4IGRkZjdlOTEuLjI4NDA1ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2hlYWQuUwpAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4JLyogZm9yIENPTkZJR19TTVAgKi8KIAotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Bzdy5oPgogI2luY2x1ZGUgPGFzbS9wZGMuaD4KIAkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDRmYzA0NTAuLjQ2Yjc1OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYwpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wZGMuaD4KICNpbmNsdWRlIDxhc20vcGRjX2NoYXNzaXMuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCmluZGV4IGMwN2RiOWQuLmYzNDI4ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogUFNXIGJpdHMgd2UgYWxsb3cgdGhlIGRlYnVnZ2VyIHRvIG1vZGlmeSAqLwogI2RlZmluZSBVU0VSX1BTV19CSVRTCShQU1dfTiB8IFBTV19WIHwgUFNXX0NCKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NpZ25hbC5jCmluZGV4IDU1ZDcxYzEuLjAyMjQ2NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2lnbmFsLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGwuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsLlMKaW5kZXggMzJlYTcwMS4uOGM3YTcxOCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGwuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbC5TCkBAIC03LDcgKzcsNyBAQAogICogc29ycnkgYWJvdXQgdGhlIHdhbGwsIHB1ZmZpbi4uCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9wc3cuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCmluZGV4IDZjZjc0MDcuLjdmZjY3ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYwpAQCAtMTg4LDEwICsxODgsNyBAQAogCQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwogCi0JCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCQludHBfY2xlYXIoKTsKIAl9CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL01ha2VmaWxlIGIvYXJjaC9wYXJpc2MvbGliL01ha2VmaWxlCmluZGV4IDdiZjcwNTYuLjVmMmU2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3BhcmlzYy9saWIvTWFrZWZpbGUKQEAgLTUsNSArNSwzIEBACiBsaWIteQk6PSBsdXNlcmNvcHkubyBiaXRvcHMubyBjaGVja3N1bS5vIGlvLm8gbWVtc2V0Lm8gZml4dXAubyBtZW1jcHkubwogCiBvYmoteQk6PSBpb21hcC5vCi0KLWxpYi0kKENPTkZJR19TTVApICs9IGRlYnVnbG9ja3MubwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2JpdG9wcy5jIGIvYXJjaC9wYXJpc2MvbGliL2JpdG9wcy5jCmluZGV4IDJkZTE4MmYuLjkwZjQwMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2xpYi9iaXRvcHMuYworKysgYi9hcmNoL3BhcmlzYy9saWIvYml0b3BzLmMKQEAgLTEzLDggKzEzLDggQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCi1zcGlubG9ja190IF9fYXRvbWljX2hhc2hbQVRPTUlDX0hBU0hfU0laRV0gX19sb2NrX2FsaWduZWQgPSB7Ci0JWzAgLi4uIChBVE9NSUNfSEFTSF9TSVpFLTEpXSAgPSBTUElOX0xPQ0tfVU5MT0NLRUQKK3Jhd19zcGlubG9ja190IF9fYXRvbWljX2hhc2hbQVRPTUlDX0hBU0hfU0laRV0gX19sb2NrX2FsaWduZWQgPSB7CisJWzAgLi4uIChBVE9NSUNfSEFTSF9TSVpFLTEpXSAgPSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2RlYnVnbG9ja3MuYyBiL2FyY2gvcGFyaXNjL2xpYi9kZWJ1Z2xvY2tzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMzNmZTYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wYXJpc2MvbGliL2RlYnVnbG9ja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKiAKLSAqICAgIERlYnVnZ2luZyB2ZXJzaW9ucyBvZiBTTVAgbG9ja2luZyBwcmltaXRpdmVzLgotICoKLSAqICAgIENvcHlyaWdodCAoQykgMjAwNCBUaGliYXV0IFZBUkVORSA8dmFyZW5ldEBwYXJpc2MtbGludXgub3JnPgotICoKLSAqICAgIFNvbWUgY29kZSBzdG9sbGVuIGZyb20gYWxwaGEgJiBzcGFyYzY0IDspCi0gKgotICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICoKLSAqICAgIFdlIHVzZSBwZGNfcHJpbnRmKCkgdGhyb3VnaG91dCB0aGUgZmlsZSBmb3IgYWxsIG91dHB1dCBtZXNzYWdlcywgdG8gYXZvaWQKLSAqICAgIGxvc2luZyBtZXNzYWdlcyBiZWNhdXNlIG9mIGRpc2FibGVkIGludGVycnVwdHMuIFNpbmNlIHdlJ3JlIHVzaW5nIHRoZXNlCi0gKiAgICBtZXNzYWdlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpdCBtYWtlcyBzZW5zZSBub3QgdG8gc2VuZCB0aGVtIHRvIHRoZQotICogICAgbGludXggY29uc29sZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgkvKiBpbl9pbnRlcnJ1cHQoKSAqLwotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgkvKiBpbl9pbnRlcnJ1cHQoKSAqLwotI2luY2x1ZGUgPGFzbS9wZGMuaD4KLQotI3VuZGVmIElOSVRfU1RVQ0sKLSNkZWZpbmUgSU5JVF9TVFVDSyAxTCA8PCAzMAotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0KLQotdm9pZCBfZGJnX3NwaW5fbG9jayhzcGlubG9ja190ICogbG9jaywgY29uc3QgY2hhciAqYmFzZV9maWxlLCBpbnQgbGluZV9ubykKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmE7Ci0JbG9uZyBzdHVjayA9IElOSVRfU1RVQ0s7Ci0Jdm9pZCAqaW5saW5lX3BjID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRlZCA9IGppZmZpZXM7Ci0JaW50IHByaW50ZWQgPSAwOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLXRyeV9hZ2FpbjoKLQotCS8qIERvIHRoZSBhY3R1YWwgbG9ja2luZyAqLwotCS8qIDxULUJvbmU+IGdnZzogd2UgY2FuJ3QgZ2V0IHN0dWNrIG9uIHRoZSBvdXR0ZXIgbG9vcD8KLQkgKiA8Z2dnPiBULUJvbmU6IFdlIGNhbiBoaXQgdGhlIG91dGVyIGxvb3AKLQkgKglhbG90IGlmIG11bHRpcGxlIENQVXMgYXJlIGNvbnN0YW50bHkgcmFjaW5nIGZvciBhIGxvY2sKLQkgKglhbmQgdGhlIGJhY2twbGFuZSBpcyBOT1QgZmFpciBhYm91dCB3aGljaCBDUFUgc2VlcwotCSAqCXRoZSB1cGRhdGUgZmlyc3QuIEJ1dCBpdCB3b24ndCBoYW5nIHNpbmNlIGV2ZXJ5IGZhaWxlZAotCSAqCWF0dGVtcHQgd2lsbCBkcm9wIHVzIGJhY2sgaW50byB0aGUgaW5uZXIgbG9vcCBhbmQKLQkgKglkZWNyZW1lbnQgYHN0dWNrJy4KLQkgKiA8Z2dnPiBLLWNsYXNzIGFuZCBzb21lIG9mIHRoZSBvdGhlcnMgYXJlIE5PVCBmYWlyIGluIHRoZSBIVwotCSAqIAlpbXBsZW1lbnRhdGlvbiBzbyB3ZSBjb3VsZCBzZWUgZmFsc2UgcG9zaXRpdmVzLgotCSAqIAlCdXQgZml4aW5nIHRoZSBsb2NrIGNvbnRlbnRpb24gaXMgZWFzaWVyIHRoYW4KLQkgKiAJZml4aW5nIHRoZSBIVyB0byBiZSBmYWlyLgotCSAqIDx0YXVzcT4gX19sZGN3KCkgcmV0dXJucyAxIGlmIHdlIGdldCB0aGUgbG9jazsgb3RoZXJ3aXNlIHdlCi0JICogCXNwaW4gdW50aWwgdGhlIHZhbHVlIG9mIHRoZSBsb2NrIGNoYW5nZXMsIG9yIHdlIHRpbWUgb3V0LgotCSAqLwotCW1iKCk7Ci0JYSA9IF9fbGRjd19hbGlnbihsb2NrKTsKLQl3aGlsZSAoc3R1Y2sgJiYgKF9fbGRjdyhhKSA9PSAwKSkKLQkJd2hpbGUgKCgqYSA9PSAwKSAmJiAtLXN0dWNrKTsKLQltYigpOwotCi0JaWYgKHVubGlrZWx5KHN0dWNrIDw9IDApKSB7Ci0JCXBkY19wcmludGYoCi0JCQkiJXM6JWQ6IHNwaW5fbG9jayglcy8lcCkgc3R1Y2sgaW4gJXMgYXQgJXAoJWQpIgotCQkJIiBvd25lZCBieSAlczolZCBpbiAlcyBhdCAlcCglZClcbiIsCi0JCQliYXNlX2ZpbGUsIGxpbmVfbm8sIGxvY2stPm1vZHVsZSwgbG9jaywKLQkJCWN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywgY3B1LAotCQkJbG9jay0+YmZpbGUsIGxvY2stPmJsaW5lLCBsb2NrLT50YXNrLT5jb21tLAotCQkJbG9jay0+cHJldmlvdXMsIGxvY2stPm9uY3B1KTsKLQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQlwcmludGVkID0gMTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JLyogRXhpdGluZy4gIEdvdCB0aGUgbG9jay4gICovCi0JbG9jay0+b25jcHUgPSBjcHU7Ci0JbG9jay0+cHJldmlvdXMgPSBpbmxpbmVfcGM7Ci0JbG9jay0+dGFzayA9IGN1cnJlbnQ7Ci0JbG9jay0+YmZpbGUgPSAoY2hhciAqKWJhc2VfZmlsZTsKLQlsb2NrLT5ibGluZSA9IGxpbmVfbm87Ci0KLQlpZiAodW5saWtlbHkocHJpbnRlZCkpIHsKLQkJcGRjX3ByaW50ZigKLQkJCSIlczolZDogc3Bpbl9sb2NrIGdyYWJiZWQgaW4gJXMgYXQgJXAoJWQpICVsZCB0aWNrc1xuIiwKLQkJCWJhc2VfZmlsZSwgbGluZV9ubywgY3VycmVudC0+Y29tbSwgaW5saW5lX3BjLAotCQkJY3B1LCBqaWZmaWVzIC0gc3RhcnRlZCk7Ci0JfQotfQotCi12b2lkIF9kYmdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKmJhc2VfZmlsZSwgaW50IGxpbmVfbm8pCi17Ci0JQ0hFQ0tfTE9DSyhsb2NrKTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmE7Ci0JbWIoKTsKLQlhID0gX19sZGN3X2FsaWduKGxvY2spOwotCWlmICh1bmxpa2VseSgoKmEgIT0gMCkgJiYgbG9jay0+YmFiYmxlKSkgewotCQlsb2NrLT5iYWJibGUtLTsKLQkJcGRjX3ByaW50ZigKLQkJCSIlczolZDogc3Bpbl91bmxvY2soJXM6JXApIG5vdCBsb2NrZWRcbiIsCi0JCQliYXNlX2ZpbGUsIGxpbmVfbm8sIGxvY2stPm1vZHVsZSwgbG9jayk7Ci0JfQotCSphID0gMTsJCi0JbWIoKTsKLX0KLQotaW50IF9kYmdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKiBsb2NrLCBjb25zdCBjaGFyICpiYXNlX2ZpbGUsIGludCBsaW5lX25vKQotewotCWludCByZXQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphOwotCW1iKCk7Ci0JYSA9IF9fbGRjd19hbGlnbihsb2NrKTsKLQlyZXQgPSAoX19sZGN3KGEpICE9IDApOwotCW1iKCk7Ci0JaWYgKHJldCkgewotCQlsb2NrLT5vbmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQkJbG9jay0+cHJldmlvdXMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0JCWxvY2stPnRhc2sgPSBjdXJyZW50OwotCX0gZWxzZSB7Ci0JCWxvY2stPmJmaWxlID0gKGNoYXIgKiliYXNlX2ZpbGU7Ci0JCWxvY2stPmJsaW5lID0gbGluZV9ubzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19TUElOTE9DSyAqLwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JXTE9DSwotCi0vKiBJbnRlcnJ1cHRzIHRyb3VibGUgZGV0YWlsZWQgZXhwbGFuYXRpb24sIHRoeCBHcmFudDoKLSAqCi0gKiBvIHdyaXRlciAod2FudHMgdG8gbW9kaWZ5IGRhdGEpIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIHJ3bG9jawotICogbyBIZSBnZXRzIHRoZSB3cml0ZSBsb2NrLgotICogbyBJbnRlcnVwdHMgYXJlIHN0aWxsIGVuYWJsZWQsIHdlIHRha2UgYW4gaW50ZXJydXB0IHdpdGggdGhlCi0gKiAgIHdyaXRlIHN0aWxsIGhvbGRpbmcgdGhlIGxvY2suCi0gKiBvIGludGVycnVwdCBoYW5kbGVyIHRyaWVzIHRvIGFjcXVpcmUgdGhlIHJ3bG9jayBmb3IgcmVhZC4KLSAqIG8gZGVhZGxvY2sgc2luY2UgdGhlIHdyaXRlciBjYW4ndCByZWxlYXNlIGl0IGF0IHRoaXMgcG9pbnQuCi0gKiAKLSAqIEluIGdlbmVyYWwsIGFueSB1c2Ugb2Ygc3BpbmxvY2tzIHRoYXQgY29tcGV0ZXMgYmV0d2VlbiAiYmFzZSIKLSAqIGxldmVsIGFuZCBpbnRlcnJ1cHQgbGV2ZWwgY29kZSB3aWxsIHJpc2sgZGVhZGxvY2suIEludGVycnVwdHMKLSAqIG5lZWQgdG8gYmUgZGlzYWJsZWQgaW4gdGhlIGJhc2UgbGV2ZWwgcm91dGluZXMgdG8gYXZvaWQgaXQuCi0gKiBPciBtb3JlIHByZWNpc2VseSwgb25seSB0aGUgSVJRIHRoZSBiYXNlIGxldmVsIHJvdXRpbmUKLSAqIGlzIGNvbXBldGluZyB3aXRoIGZvciB0aGUgbG9jay4gIEJ1dCBpdCdzIG1vcmUgZWZmaWNpZW50L2Zhc3RlcgotICogdG8ganVzdCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIG9uIHRoYXQgQ1BVIHRvIGd1YXJhbnRlZQotICogb25jZSBpdCBnZXRzIHRoZSBsb2NrIGl0IGNhbiByZWxlYXNlIGl0IHF1aWNrbHkgdG9vLgotICovCi0gCi12b2lkIF9kYmdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncsIGNvbnN0IGNoYXIgKmJmaWxlLCBpbnQgYmxpbmUpCi17Ci0Jdm9pZCAqaW5saW5lX3BjID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRlZCA9IGppZmZpZXM7Ci0JbG9uZyBzdHVjayA9IElOSVRfU1RVQ0s7Ci0JaW50IHByaW50ZWQgPSAwOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCi0JaWYodW5saWtlbHkoaW5faW50ZXJydXB0KCkpKSB7CS8qIGFjcXVpcmluZyB3cml0ZSBsb2NrIGluIGludGVycnVwdCBjb250ZXh0LCBiYWQgaWRlYSAqLwotCQlwZGNfcHJpbnRmKCJ3cml0ZV9sb2NrIGNhbGxlcjogJXM6JWQsIElSUXMgZW5hYmxlZCxcbiIsIGJmaWxlLCBibGluZSk7Ci0JCUJVRygpOwotCX0KLQotCS8qIE5vdGU6IGlmIGludGVycnVwdHMgYXJlIGRpc2FibGVkICh3aGljaCBpcyBtb3N0IGxpa2VseSksIHRoZSBwcmludGsKLQl3aWxsIG5ldmVyIHNob3cgb24gdGhlIGNvbnNvbGUuIFdlIG1pZ2h0IG5lZWQgYSBwb2xsaW5nIG1ldGhvZCB0byBmbHVzaAotCXRoZSBkbWVzZyBidWZmZXIgYW55aG93LiAqLwotCQotcmV0cnk6Ci0JX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKLQotCWlmKHJ3LT5jb3VudGVyICE9IDApIHsKLQkJLyogdGhpcyBiYXNpY2FsbHkgbmV2ZXIgaGFwcGVucyAqLwotCQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7Ci0JCQotCQlzdHVjay0tOwotCQlpZiAoKHVubGlrZWx5KHN0dWNrIDw9IDApKSAmJiAocnctPmNvdW50ZXIgPCAwKSkgewotCQkJcGRjX3ByaW50ZigKLQkJCQkiJXM6JWQ6IHdyaXRlX2xvY2sgc3R1Y2sgb24gd3JpdGVyIgotCQkJCSIgaW4gJXMgYXQgJXAoJWQpICVsZCB0aWNrc1xuIiwKLQkJCQliZmlsZSwgYmxpbmUsIGN1cnJlbnQtPmNvbW0sIGlubGluZV9wYywKLQkJCQljcHUsIGppZmZpZXMgLSBzdGFydGVkKTsKLQkJCXN0dWNrID0gSU5JVF9TVFVDSzsKLQkJCXByaW50ZWQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHVubGlrZWx5KHN0dWNrIDw9IDApKSB7Ci0JCQlwZGNfcHJpbnRmKAotCQkJCSIlczolZDogd3JpdGVfbG9jayBzdHVjayBvbiByZWFkZXIiCi0JCQkJIiBpbiAlcyBhdCAlcCglZCkgJWxkIHRpY2tzXG4iLAotCQkJCWJmaWxlLCBibGluZSwgY3VycmVudC0+Y29tbSwgaW5saW5lX3BjLAotCQkJCWNwdSwgamlmZmllcyAtIHN0YXJ0ZWQpOwotCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQkJcHJpbnRlZCA9IDE7Ci0JCX0KLQkJCi0JCXdoaWxlKHJ3LT5jb3VudGVyICE9IDApOwotCi0JCWdvdG8gcmV0cnk7Ci0JfQotCi0JLyogZ290IGl0LiAgbm93IGxlYXZlIHdpdGhvdXQgdW5sb2NraW5nICovCi0JcnctPmNvdW50ZXIgPSAtMTsgLyogcmVtZW1iZXIgd2UgYXJlIGxvY2tlZCAqLwotCi0JaWYgKHVubGlrZWx5KHByaW50ZWQpKSB7Ci0JCXBkY19wcmludGYoCi0JCQkiJXM6JWQ6IHdyaXRlX2xvY2sgZ3JhYmJlZCBpbiAlcyBhdCAlcCglZCkgJWxkIHRpY2tzXG4iLAotCQkJYmZpbGUsIGJsaW5lLCBjdXJyZW50LT5jb21tLCBpbmxpbmVfcGMsCi0JCQljcHUsIGppZmZpZXMgLSBzdGFydGVkKTsKLQl9Ci19Ci0KLWludCBfZGJnX3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3LCBjb25zdCBjaGFyICpiZmlsZSwgaW50IGJsaW5lKQotewotI2lmIDAKLQl2b2lkICppbmxpbmVfcGMgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLSNlbmRpZgotCQotCWlmKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkgewkvKiBhY3F1aXJpbmcgd3JpdGUgbG9jayBpbiBpbnRlcnJ1cHQgY29udGV4dCwgYmFkIGlkZWEgKi8KLQkJcGRjX3ByaW50Zigid3JpdGVfbG9jayBjYWxsZXI6ICVzOiVkLCBJUlFzIGVuYWJsZWQsXG4iLCBiZmlsZSwgYmxpbmUpOwotCQlCVUcoKTsKLQl9Ci0KLQkvKiBOb3RlOiBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAod2hpY2ggaXMgbW9zdCBsaWtlbHkpLCB0aGUgcHJpbnRrCi0Jd2lsbCBuZXZlciBzaG93IG9uIHRoZSBjb25zb2xlLiBXZSBtaWdodCBuZWVkIGEgcG9sbGluZyBtZXRob2QgdG8gZmx1c2gKLQl0aGUgZG1lc2cgYnVmZmVyIGFueWhvdy4gKi8KLQkKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwotCi0JaWYocnctPmNvdW50ZXIgIT0gMCkgewotCQkvKiB0aGlzIGJhc2ljYWxseSBuZXZlciBoYXBwZW5zICovCi0JCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZ290IGl0LiAgbm93IGxlYXZlIHdpdGhvdXQgdW5sb2NraW5nICovCi0JcnctPmNvdW50ZXIgPSAtMTsgLyogcmVtZW1iZXIgd2UgYXJlIGxvY2tlZCAqLwotI2lmIDAKLQlwZGNfcHJpbnRmKCIlczolZDogdHJ5IHdyaXRlX2xvY2sgZ3JhYmJlZCBpbiAlcyBhdCAlcCglZClcbiIsCi0JCSAgIGJmaWxlLCBibGluZSwgY3VycmVudC0+Y29tbSwgaW5saW5lX3BjLCBjcHUpOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgX2RiZ19yZWFkX2xvY2socndsb2NrX3QgKiBydywgY29uc3QgY2hhciAqYmZpbGUsIGludCBibGluZSkKLXsKLSNpZiAwCi0Jdm9pZCAqaW5saW5lX3BjID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRlZCA9IGppZmZpZXM7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsgCi0KLQlydy0+Y291bnRlcisrOwotI2lmIDAKLQlwZGNfcHJpbnRmKAotCQkiJXM6JWQ6IHJlYWRfbG9jayBncmFiYmVkIGluICVzIGF0ICVwKCVkKSAlbGQgdGlja3NcbiIsCi0JCWJmaWxlLCBibGluZSwgY3VycmVudC0+Y29tbSwgaW5saW5lX3BjLAotCQljcHUsIGppZmZpZXMgLSBzdGFydGVkKTsKLSNlbmRpZgotCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfUldMT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9saWIvZml4dXAuUyBiL2FyY2gvcGFyaXNjL2xpYi9maXh1cC5TCmluZGV4IDEzNGYwY2QuLjFiOTE2MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2xpYi9maXh1cC5TCisrKyBiL2FyY2gvcGFyaXNjL2xpYi9maXh1cC5TCkBAIC0yMCw3ICsyMCw3IEBACiAgKiBGaXh1cCByb3V0aW5lcyBmb3Iga2VybmVsIGV4Y2VwdGlvbiBoYW5kbGluZy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmx5Lmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMgYi9hcmNoL3BwYy84eHhfaW8vY3M0MjE4X3RkbS5jCmluZGV4IDg5ZmUwY2UuLjJjYTllYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMKKysrIGIvYXJjaC9wcGMvOHh4X2lvL2NzNDIxOF90ZG0uYwpAQCAtMTM4MCw3ICsxMzgwLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjczQyMThfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYmVlcF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKGNzX25vc291bmQsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihiZWVwX3RpbWVyLCBjc19ub3NvdW5kLCAwLCAwKTsKIH07CiAKIHN0YXRpYyB2b2lkIGNzX21rc291bmQodW5zaWduZWQgaW50IGh6LCB1bnNpZ25lZCBpbnQgdGlja3MpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9LY29uZmlnIGIvYXJjaC9wcGMvS2NvbmZpZwppbmRleCAzNmRlZTBmLi4zNDdlYTI4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9LY29uZmlnCisrKyBiL2FyY2gvcHBjL0tjb25maWcKQEAgLTQ3LDYgKzQ3LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKKwlib29sCisJZGVmYXVsdCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBtZW51ICJQcm9jZXNzb3IiCkBAIC0yNjEsNiArMjY1LDE1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgogCitjb25maWcgSE9UUExVR19DUFUKKwlib29sICJTdXBwb3J0IGZvciBlbmFibGluZy9kaXNhYmxpbmcgQ1BVcyIKKwlkZXBlbmRzIG9uIFNNUCAmJiBIT1RQTFVHICYmIEVYUEVSSU1FTlRBTCAmJiBQUENfUE1BQworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gYmUgYWJsZSB0byBkaXNhYmxlIGFuZCByZS1lbmFibGUgaW5kaXZpZHVhbAorCSAgQ1BVcyBhdCBydW50aW1lIG9uIFNNUCBtYWNoaW5lcy4KKworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKIHNvdXJjZSBhcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCiAKQEAgLTQ5NSwxMSArNTA4LDYgQEAKIAkgIE1QQzgyMSBQb3dlclBDLCBpbnRyb2R1Y2VkIGluIDE5OTggYW5kIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4KIAkgIHRoaW4tY2xpZW50IG1hY2hpbmVzLiAgU2F5IFkgdG8gc3VwcG9ydCBpdCBkaXJlY3RseS4KIAotCSAgQmUgYXdhcmUgdGhhdCBQQ0kgYnVzZXMgY2FuIG9ubHkgZnVuY3Rpb24gd2hlbiBTWVMgYm9hcmQgaXMgcGx1Z2dlZAotCSAgaW50byB0aGUgUElCIChQbGF0Zm9ybSBJTyBCb2FyZCkgYm9hcmQgZnJvbSBGcmVlc2NhbGUgd2hpY2ggcHJvdmlkZQotCSAgMyBQQ0kgc2xvdHMuICBUaGUgUElCcyBQQ0kgaW5pdGlhbGl6YXRpb24gaXMgdGhlIGJvb3Rsb2FkZXIncwotCSAgcmVzcG9uc2libGlsdHkuCi0KIGVuZGNob2ljZQogCiBjaG9pY2UKQEAgLTY3Niw2ICs2ODQsMTEgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEMgODM0eCBTWVMgZXZhbHVhdGlvbiBib2FyZC4KIAorCSAgQmUgYXdhcmUgdGhhdCBQQ0kgYnVzZXMgY2FuIG9ubHkgZnVuY3Rpb24gd2hlbiBTWVMgYm9hcmQgaXMgcGx1Z2dlZAorCSAgaW50byB0aGUgUElCIChQbGF0Zm9ybSBJTyBCb2FyZCkgYm9hcmQgZnJvbSBGcmVlc2NhbGUgd2hpY2ggcHJvdmlkZQorCSAgMyBQQ0kgc2xvdHMuICBUaGUgUElCcyBQQ0kgaW5pdGlhbGl6YXRpb24gaXMgdGhlIGJvb3Rsb2FkZXIncworCSAgcmVzcG9uc2libGlsdHkuCisKIGNvbmZpZyBFVjY0MzYwCiAJYm9vbCAiTWFydmVsbC1FVjY0MzYwQlAiCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvTWFrZWZpbGUgYi9hcmNoL3BwYy9NYWtlZmlsZQppbmRleCBkMWI2ZTZkLi42ZGQ3YjUwIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9NYWtlZmlsZQorKysgYi9hcmNoL3BwYy9NYWtlZmlsZQpAQCAtMjEsMTMgKzIxLDE0IEBACiBlbmRpZgogCiBMREZMQUdTX3ZtbGludXgJOj0gLVR0ZXh0ICQoS0VSTkVMTE9BRCkgLUJzdGF0aWMKLUNQUEZMQUdTCSs9IC1JYXJjaC8kKEFSQ0gpIC1JaW5jbHVkZTMKKyMgVGhlIC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUgaXMgdGVtcG9yYXJ5IHdoaWxlIHdlIGFyZSBtZXJnaW5nCitDUFBGTEFHUwkrPSAtSWFyY2gvJChBUkNIKSAtSWFyY2gvJChBUkNIKS9pbmNsdWRlCiBBRkxBR1MJCSs9IC1JYXJjaC8kKEFSQ0gpCiBDRkxBR1MJCSs9IC1JYXJjaC8kKEFSQ0gpIC1tc29mdC1mbG9hdCAtcGlwZSBcCiAJCS1mZml4ZWQtcjIgLW1tdWx0aXBsZQogQ1BQCQk9ICQoQ0MpIC1FICQoQ0ZMQUdTKQogIyBUZW1wb3JhcnkgaGFjayB1bnRpbCB3ZSBoYXZlIG1pZ3JhdGVkIHRvIGFzbS1wb3dlcnBjCi1MSU5VWElOQ0xVREUgICAgKz0gLUlpbmNsdWRlMworTElOVVhJTkNMVURFICAgICs9IC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUKIAogQ0hFQ0tGTEFHUwkrPSAtRF9fcG93ZXJwY19fCiAKQEAgLTEwMywyMSArMTA0LDE2IEBACiAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL3BwYy9ib290Ci0JJChRKXJtIC1yZiBpbmNsdWRlMworCSMgVGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBtaWdyYXRlZCB0byBhc20tcG93ZXJwYworCSQoUSlybSAtcmYgYXJjaC8kKEFSQ0gpL2luY2x1ZGUKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmggY2hlY2tiaW4KLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCitwcmVwYXJlOiBjaGVja2JpbgogCiAjIFRlbXBvcmFyeSBoYWNrIHVudGlsIHdlIGhhdmUgbWlncmF0ZWQgdG8gYXNtLXBvd2VycGMKLWluY2x1ZGUvYXNtOiBpbmNsdWRlMy9hc20KLWluY2x1ZGUzL2FzbToKLQkkKFEpaWYgWyAhIC1kIGluY2x1ZGUzIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZTM7IGZpCi0JJChRKWxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1wb3dlcnBjIGluY2x1ZGUzL2FzbQoraW5jbHVkZS9hc206IGFyY2gvJChBUkNIKS9pbmNsdWRlL2FzbQorYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtOgorCSQoUSlpZiBbICEgLWQgYXJjaC8kKEFSQ0gpL2luY2x1ZGUgXTsgdGhlbiBta2RpciAtcCBhcmNoLyQoQVJDSCkvaW5jbHVkZTsgZmkKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXBvd2VycGMgYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtCiAKICMgVXNlIHRoZSBmaWxlICcudG1wX2dhc19jaGVjaycgZm9yIGJpbnV0aWxzIHRlc3RzLCBhcyBnYXMgd29uJ3Qgb3V0cHV0CiAjIHRvIHN0ZG91dCBhbmQgdGhlc2UgY2hlY2tzIGFyZSBydW4gZXZlbiBvbiBpbnN0YWxsIHRhcmdldHMuCkBAIC0xNDMsNyArMTM5LDUgQEAKIAkJZmFsc2UgOyBcCiAJZmkKIAotQ0xFQU5fRklMRVMgKz0JaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmggXAotCQlhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMgXAotCQkkKFRPVVQpCitDTEVBTl9GSUxFUyArPSAkKFRPVVQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvY29tbW9uL25zMTY1NTAuYyBiL2FyY2gvcHBjL2Jvb3QvY29tbW9uL25zMTY1NTAuYwppbmRleCA5MDE3YzU0Li4yNjgxOGJiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9ib290L2NvbW1vbi9uczE2NTUwLmMKKysrIGIvYXJjaC9wcGMvYm9vdC9jb21tb24vbnMxNjU1MC5jCkBAIC0yMyw3ICsyMyw3IEBACiAKIHVuc2lnbmVkIGxvbmcgc2VyaWFsX2luaXQoaW50IGNoYW4sIHZvaWQgKmlnbm9yZWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjb21fcG9ydDsKKwl1bnNpZ25lZCBsb25nIGNvbV9wb3J0LCBiYXNlX2JhdWQ7CiAJdW5zaWduZWQgY2hhciBsY3IsIGRsbTsKIAogCS8qIFdlIG5lZWQgdG8gZmluZCBvdXQgd2hpY2ggdHlwZSBpbyB3ZSdyZSBleHBlY3RpbmcuICBJZiBpdCdzCkBAIC00Myw2ICs0Myw4IEBACiAKIAkvKiBIb3cgZmFyIGFwYXJ0IHRoZSByZWdpc3RlcnMgYXJlLiAqLwogCXNoaWZ0ID0gcnNfdGFibGVbY2hhbl0uaW9tZW1fcmVnX3NoaWZ0OworCS8qIEJhc2UgYmF1ZC4uICovCisJYmFzZV9iYXVkID0gcnNfdGFibGVbY2hhbl0uYmF1ZF9iYXNlOwogCQogCS8qIHNhdmUgdGhlIExDUiAqLwogCWxjciA9IGluYihjb21fcG9ydCArIChVQVJUX0xDUiA8PCBzaGlmdCkpOwpAQCAtNjIsOSArNjQsOSBAQAogCWVsc2UgewogCQkvKiBJbnB1dCBjbG9jay4gKi8KIAkJb3V0Yihjb21fcG9ydCArIChVQVJUX0RMTCA8PCBzaGlmdCksCi0JCSAgICAgKEJBU0VfQkFVRCAvIFNFUklBTF9CQVVEKSAmIDB4RkYpOworCQkgICAgIChiYXNlX2JhdWQgLyBTRVJJQUxfQkFVRCkgJiAweEZGKTsKIAkJb3V0Yihjb21fcG9ydCArIChVQVJUX0RMTSA8PCBzaGlmdCksCi0JCSAgICAgKEJBU0VfQkFVRCAvIFNFUklBTF9CQVVEKSA+PiA4KTsKKwkJICAgICAoYmFzZV9iYXVkIC8gU0VSSUFMX0JBVUQpID4+IDgpOwogCQkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCiAJCW91dGIoY29tX3BvcnQgKyAoVUFSVF9MQ1IgPDwgc2hpZnQpLCAweDAzKTsKIAkJLyogUlRTL0RUUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9jb21tb24vdXRpbC5TIGIvYXJjaC9wcGMvYm9vdC9jb21tb24vdXRpbC5TCmluZGV4IDQ3ZTY0MTQuLmM5NmM5ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3QvY29tbW9uL3V0aWwuUworKysgYi9hcmNoL3BwYy9ib290L2NvbW1vbi91dGlsLlMKQEAgLTI1Miw3ICsyNTIsNyBAQAogMToJZGNiZglyMCxyMwkJCSMgRmx1c2ggdGhlIGRhdGEgY2FjaGUKIAlpY2JpCXIwLHIzCQkJIyBJbnZhbGlkYXRlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZQogCWFkZGkJcjMscjMsMHgxMAkJIyBJbmNyZW1lbnQgYnkgb25lIGNhY2hlIGxpbmUKLQljbXBsd2kJY3IwLHIzLHI0CQkjIEFyZSB3ZSBhdCB0aGUgZW5kIHlldD8KKwljbXBsdwljcjAscjMscjQJCSMgQXJlIHdlIGF0IHRoZSBlbmQgeWV0PwogCWJsdAkxYgkJCSMgTm8sIGtlZXAgZmx1c2hpbmcgYW5kIGludmFsaWRhdGluZwogI2Vsc2UKIAkvKiBFbmFibGUsIGludmFsaWRhdGUgYW5kIHRoZW4gZGlzYWJsZSB0aGUgTDEgaWNhY2hlL2RjYWNoZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiMTQ1N2E4Li4xZmI5MmYxIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlCkBAIC0xNSw4ICsxNSw5IEBACiBvYmoteQkJCQk6PSBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gaWRsZS5vIHRpbWUubyBtaXNjLm8gXAogCQkJCQlwcm9jZXNzLm8gc2lnbmFsLm8gcHRyYWNlLm8gYWxpZ24ubyBcCiAJCQkJCXNlbWFwaG9yZS5vIHN5c2NhbGxzLm8gc2V0dXAubyBcCi0JCQkJCWNwdXRhYmxlLm8gcHBjX2h0YWIubyBwZXJmbW9uLm8KKwkJCQkJY3B1dGFibGUubyBwcGNfaHRhYi5vCiBvYmotJChDT05GSUdfNnh4KQkJKz0gbDJjci5vIGNwdV9zZXR1cF82eHgubworb2JqLSQoQ09ORklHX0U1MDApCQkrPSBwZXJmbW9uLm8KIG9iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzd3N1c3Aubwogb2JqLSQoQ09ORklHX1BPV0VSNCkJCSs9IGNwdV9zZXR1cF9wb3dlcjQubwogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubyBwcGNfa3N5bXMubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2NwdV9zZXR1cF82eHguUyBiL2FyY2gvcHBjL2tlcm5lbC9jcHVfc2V0dXBfNnh4LlMKaW5kZXggYmQwMzdjYS4uYmEzOTY0MyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2NwdV9zZXR1cF82eHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvY3B1X3NldHVwXzZ4eC5TCkBAIC0xMiwxMCArMTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBfR0xPQkFMKF9fc2V0dXBfY3B1XzYwMSkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3BwYy9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TCmluZGV4IGYyZWExYTkuLjdlNGZiYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtMTQsOCArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAKIF9HTE9CQUwoX185NzBfY3B1X3ByZWluaXQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvZG1hLW1hcHBpbmcuYyBiL2FyY2gvcHBjL2tlcm5lbC9kbWEtbWFwcGluZy5jCmluZGV4IGUwYzYzMWNmLi5iNTY2ZDk4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvZG1hLW1hcHBpbmcuYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAgKiBfX2RtYV9zeW5jX3BhZ2UoKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3lzdGVtcyB1c2luZyBoaWdobWVtLgogICogSW4gdGhpcyBjYXNlLCBlYWNoIHBhZ2Ugb2YgYSBidWZmZXIgbXVzdCBiZSBrbWFwcGVkL2t1bm1hcHBlZAogICogaW4gb3JkZXIgdG8gaGF2ZSBhIHZpcnR1YWwgYWRkcmVzcyBmb3IgX19kbWFfc3luYygpLiBUaGlzIG11c3QKLSAqIG5vdCBzbGVlcCBzbyBrbWFwX2F0bW9taWMoKS9rdW5tYXBfYXRvbWljKCkgYXJlIHVzZWQuCisgKiBub3Qgc2xlZXAgc28ga21hcF9hdG9taWMoKS9rdW5tYXBfYXRvbWljKCkgYXJlIHVzZWQuCiAgKgogICogTm90ZTogeWVzLCBpdCBpcyBwb3NzaWJsZSBhbmQgY29ycmVjdCB0byBoYXZlIGEgYnVmZmVyIGV4dGVuZAogICogYmV5b25kIHRoZSBmaXJzdCBwYWdlLgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUwppbmRleCBjYjgzMDQ1Li4wM2Q0ODg2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKICN1bmRlZiBTSE9XX1NZU0NBTExTCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvZnB1LlMgYi9hcmNoL3BwYy9rZXJuZWwvZnB1LlMKaW5kZXggNjE4OWIyNi4uNjY1ZDdkMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2ZwdS5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9mcHUuUwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyoKICAqIFRoaXMgdGFzayB3YW50cyB0byB1c2UgdGhlIEZQVSBub3cuCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9wcGMva2VybmVsL2hlYWQuUwppbmRleCBhOTMxZDc3Li4xOTYwZmI4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkLlMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNpZmRlZiBDT05GSUdfQVBVUwogI2luY2x1ZGUgPGFzbS9hbWlnYXBwYy5oPgpAQCAtMTAyMywyMyArMTAyMywyMSBAQAogICAgICAgICBhbmRjICAgIHI0LHI0LHIzCiAgICAgICAgIG10c3ByICAgU1BSTl9ISUQwLHI0CiAgICAgICAgIHN5bmMKLSAgICAgICAgYmwgICAgICBnZW1pbmlfcHJvbV9pbml0CiAgICAgICAgIGIgICAgICAgX19zZWNvbmRhcnlfc3RhcnQKICNlbmRpZiAvKiBDT05GSUdfR0VNSU5JICovCi0JLmdsb2JsCV9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZQotX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOgotCWxpCXIyNCwxCQkJLyogY3B1ICMgKi8KLQliCV9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZTk5Ci0JLmdsb2JsCV9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZTIKLV9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZTI6Ci0JbGkJcjI0LDIJCQkvKiBjcHUgIyAqLwotCWIJX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOTkKLQkuZ2xvYmwJX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlMwotX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlMzoKLQlsaQlyMjQsMwkJCS8qIGNwdSAjICovCi0JYglfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2U5OQotX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOTk6Ci0JLyogd2UgY29tZSBpbiBoZXJlIHdpdGggSVI9MCBhbmQgRFI9MSwgYW5kIERCQVQgMAorCisJLmdsb2JsCV9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMAorX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wOgorCS8qIE5CIHRoZSBlbnRyaWVzIGZvciBjcHVzIDAsIDEsIDIgbXVzdCBlYWNoIG9jY3VweSA4IGJ5dGVzLiAqLworCWxpCXIyNCwwCisJYgkxZgorCWxpCXIyNCwxCisJYgkxZgorCWxpCXIyNCwyCisJYgkxZgorCWxpCXIyNCwzCisxOgorCS8qIG9uIHBvd2Vyc3VyZ2UsIHdlIGNvbWUgaW4gaGVyZSB3aXRoIElSPTAgYW5kIERSPTEsIGFuZCBEQkFUIDAKIAkgICBzZXQgdG8gbWFwIHRoZSAweGYwMDAwMDAwIC0gMHhmZmZmZmZmZiByZWdpb24gKi8KIAltZm1zcglyMAogCXJsd2lubQlyMCxyMCwwLDI4LDI2CQkvKiBjbGVhciBEUiAoMHgxMCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzQ0eC5TIGIvYXJjaC9wcGMva2VybmVsL2hlYWRfNDR4LlMKaW5kZXggOWU2OGUzMi4uNTk5MjQ1YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2hlYWRfNDR4LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2hlYWRfNDR4LlMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSAiaGVhZF9ib29rZS5oIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzR4eC5TIGIvYXJjaC9wcGMva2VybmVsL2hlYWRfNHh4LlMKaW5kZXggMGE1ZTcyMy4uODU2MmI4MCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2hlYWRfNHh4LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2hlYWRfNHh4LlMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC8qIEFzIHdpdGggdGhlIG90aGVyIFBvd2VyUEMgcG9ydHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgd2hlbiBjb2RlCiAgKiBleGVjdXRpb24gYmVnaW5zIGhlcmUsIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGNvbnRhaW4gdmFsaWQsIHlldApAQCAtNDUzLDYgKzQ1Myw3IEBACiAjZWxzZQogCUNSSVRJQ0FMX0VYQ0VQVElPTigweDEwMjAsIFdEVEV4Y2VwdGlvbiwgVW5rbm93bkV4Y2VwdGlvbikKICNlbmRpZgorI2VuZGlmCiAKIC8qIDB4MTEwMCAtIERhdGEgVExCIE1pc3MgRXhjZXB0aW9uCiAgKiBBcyB0aGUgbmFtZSBpbXBsaWVzLCB0cmFuc2xhdGlvbiBpcyBub3QgaW4gdGhlIE1NVSwgc28gc2VhcmNoIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwppbmRleCBlYjE4Y2FkLi5jYjFhM2E1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogTWFjcm8gdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLiAqLwogI2lmZGVmIENPTkZJR184eHhfQ1BVNgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwppbmRleCA0MDI4ZjRjLi44ZTUyZTg0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlICJoZWFkX2Jvb2tlLmgiCiAKIC8qIEFzIHdpdGggdGhlIG90aGVyIFBvd2VyUEMgcG9ydHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgd2hlbiBjb2RlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaWRsZS5jIGIvYXJjaC9wcGMva2VybmVsL2lkbGUuYwppbmRleCA1MzU0N2I2Li5mYmEyOWM4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9pZGxlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zNSw2ICszNiw3IEBACiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQogewogCXZvaWQgKCpwb3dlcnNhdmUpKHZvaWQpOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlwb3dlcnNhdmUgPSBwcGNfbWQucG93ZXJfc2F2ZTsKIApAQCAtNDQsNyArNDYsNyBAQAogI2lmZGVmIENPTkZJR19TTVAKIAkJZWxzZSB7CiAJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQkJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCisJCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKQogCQkJCWJhcnJpZXIoKTsKIAkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAJCX0KQEAgLTUyLDYgKzU0LDggQEAKIAl9CiAJaWYgKG5lZWRfcmVzY2hlZCgpKQogCQlzY2hlZHVsZSgpOworCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKKwkJY3B1X2RpZSgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2lkbGVfNnh4LlMgYi9hcmNoL3BwYy9rZXJuZWwvaWRsZV82eHguUwppbmRleCAyNWQwMDljLi4xYTIxOTRjIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvaWRsZV82eHguUworKysgYi9hcmNoL3BwYy9rZXJuZWwvaWRsZV82eHguUwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI3VuZGVmIERFQlVHCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TIGIvYXJjaC9wcGMva2VybmVsL2lkbGVfcG93ZXI0LlMKaW5kZXggNzNhNThmZi4uY2MwZDUzNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2lkbGVfcG93ZXI0LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2lkbGVfcG93ZXI0LlMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICN1bmRlZiBERUJVRwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwppbmRleCBjZTcxYjRhLi45MGQ5MTdkIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BjaS5jIGIvYXJjaC9wcGMva2VybmVsL3BjaS5jCmluZGV4IDdiMzU4NmEuLjg1NGU0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKQEAgLTgwLDcgKzgwLDYgQEAKIAlpZiAoKGRldi0+Y2xhc3M+PjggPT0gUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQpKSB7CiAJCWRldi0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BTUQ7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsIFBDSV9WRU5ET1JfSURfQU1EKTsKLQkJcGNpX25hbWVfZGV2aWNlKGRldik7CiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVFJJREVOVCwJUENJX0FOWV9JRCwJCQlmaXh1cF9icm9rZW5fcGNuZXQzMik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3BwYy9rZXJuZWwvc21wLmMKaW5kZXggZTcwYjU4Ny4uNzI2ZmU3YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zbXAuYwpAQCAtNDUsNiArNDUsNyBAQAogY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXA7CiBpbnQgc21wX2h3X2luZGV4W05SX0NQVVNdOwogc3RydWN0IHRocmVhZF9pbmZvICpzZWNvbmRhcnlfdGk7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlX3Rhc2tzW05SX0NQVVNdOwogCiBFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKIEVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CkBAIC0yODYsNyArMjg3LDggQEAKIAogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IG51bV9jcHVzLCBpOworCWludCBudW1fY3B1cywgaSwgY3B1OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAogCS8qIEZpeHVwIGJvb3QgY3B1ICovCiAgICAgICAgIHNtcF9zdG9yZV9jcHVfaW5mbyhzbXBfcHJvY2Vzc29yX2lkKCkpOwpAQCAtMzA4LDYgKzMxMCwxNyBAQAogCiAJaWYgKHNtcF9vcHMtPnNwYWNlX3RpbWVycykKIAkJc21wX29wcy0+c3BhY2VfdGltZXJzKG51bV9jcHVzKTsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQljb250aW51ZTsKKwkJLyogY3JlYXRlIGEgcHJvY2VzcyBmb3IgdGhlIHByb2Nlc3NvciAqLworCQlwID0gZm9ya19pZGxlKGNwdSk7CisJCWlmIChJU19FUlIocCkpCisJCQlwYW5pYygiZmFpbGVkIGZvcmsgZm9yIENQVSAldTogJWxpIiwgY3B1LCBQVFJfRVJSKHApKTsKKwkJcC0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdTsKKwkJaWRsZV90YXNrc1tjcHVdID0gcDsKKwl9CiB9CiAKIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCkBAIC0zMzQsMTIgKzM0NywxNyBAQAogCXNldF9kZWModGJfdGlja3NfcGVyX2ppZmZ5KTsKIAljcHVfY2FsbGluX21hcFtjcHVdID0gMTsKIAotCXByaW50aygiQ1BVICVpIGRvbmUgY2FsbGluLi4uXG4iLCBjcHUpOworCXByaW50aygiQ1BVICVkIGRvbmUgY2FsbGluLi4uXG4iLCBjcHUpOwogCXNtcF9vcHMtPnNldHVwX2NwdShjcHUpOwotCXByaW50aygiQ1BVICVpIGRvbmUgc2V0dXAuLi5cbiIsIGNwdSk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXByaW50aygiQ1BVICVkIGRvbmUgc2V0dXAuLi5cbiIsIGNwdSk7CiAJc21wX29wcy0+dGFrZV90aW1lYmFzZSgpOwotCXByaW50aygiQ1BVICVpIGRvbmUgdGltZWJhc2UgdGFrZS4uLlxuIiwgY3B1KTsKKwlwcmludGsoIkNQVSAlZCBkb25lIHRpbWViYXNlIHRha2UuLi5cbiIsIGNwdSk7CisKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CisJY3B1X3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCWNwdV9pZGxlKCk7CiAJcmV0dXJuIDA7CkBAIC0zNDcsMTcgKzM2NSwxMSBAQAogCiBpbnQgX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJY2hhciBidWZbMzJdOwogCWludCBjOwogCi0JLyogY3JlYXRlIGEgcHJvY2VzcyBmb3IgdGhlIHByb2Nlc3NvciAqLwotCS8qIG9ubHkgcmVncy5tc3IgaXMgYWN0dWFsbHkgdXNlZCwgYW5kIDAgaXMgT0sgZm9yIGl0ICovCi0JcCA9IGZvcmtfaWRsZShjcHUpOwotCWlmIChJU19FUlIocCkpCi0JCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVICV1OiAlbGkiLCBjcHUsIFBUUl9FUlIocCkpOwotCXNlY29uZGFyeV90aSA9IHAtPnRocmVhZF9pbmZvOwotCXAtPnRocmVhZF9pbmZvLT5jcHUgPSBjcHU7CisJc2Vjb25kYXJ5X3RpID0gaWRsZV90YXNrc1tjcHVdLT50aHJlYWRfaW5mbzsKKwltYigpOwogCiAJLyoKIAkgKiBUaGVyZSB3YXMgYSBjYWNoZSBmbHVzaCBsb29wIGhlcmUgdG8gZmx1c2ggdGhlIGNhY2hlCkBAIC0zODksNyArNDAxLDExIEBACiAJcHJpbnRrKCJQcm9jZXNzb3IgJWQgZm91bmQuXG4iLCBjcHUpOwogCiAJc21wX29wcy0+Z2l2ZV90aW1lYmFzZSgpOwotCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CisKKwkvKiBXYWl0IHVudGlsIGNwdSBwdXRzIGl0c2VsZiBpbiB0aGUgb25saW5lIG1hcCAqLworCXdoaWxlICghY3B1X29ubGluZShjcHUpKQorCQljcHVfcmVsYXgoKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc3dzdXNwLlMgYi9hcmNoL3BwYy9rZXJuZWwvc3dzdXNwLlMKaW5kZXggNTUxNDhiYi4uNjk3NzNjYyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3N3c3VzcC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zd3N1c3AuUwpAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zeXNjYWxscy5jIGIvYXJjaC9wcGMva2VybmVsL3N5c2NhbGxzLmMKaW5kZXggMTI0MzEzYy4uMTI3ZjA0MCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3N5c2NhbGxzLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3N5c2NhbGxzLmMKQEAgLTQxLDEwICs0MSw2IEBACiAjaW5jbHVkZSA8YXNtL2lwYy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAotdm9pZAotY2hlY2tfYnVncyh2b2lkKQotewotfQogCiAvKgogICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCmluZGV4IGJmNGRkY2EuLmEzYzUyODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RpbWUuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCSAqIFdlIHNob3VsZCBoYXZlIGFuIHJ0YyBjYWxsIHRoYXQgb25seSBzZXRzIHRoZSBtaW51dGVzIGFuZAogCQkgKiBzZWNvbmRzIGxpa2Ugb24gSW50ZWwgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBub24gVVRDIGNsb2Nrcy4KIAkJICovCi0JCWlmICggcHBjX21kLnNldF9ydGNfdGltZSAmJiAodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJCWlmICggcHBjX21kLnNldF9ydGNfdGltZSAmJiBudHBfc3luY2VkKCkgJiYKIAkJICAgICB4dGltZS50dl9zZWMgLSBsYXN0X3J0Y191cGRhdGUgPj0gNjU5ICYmCiAJCSAgICAgYWJzKCh4dGltZS50dl9uc2VjIC8gMTAwMCkgLSAoMTAwMDAwMC0xMDAwMDAwL0haKSkgPCA1MDAwMDAvSFogJiYKIAkJICAgICBqaWZmaWVzIC0gd2FsbF9qaWZmaWVzID09IDEpIHsKQEAgLTI3MSwxMCArMjcxLDcgQEAKIAkgKi8KIAlsYXN0X3J0Y191cGRhdGUgPSBuZXdfc2VjIC0gNjU4OwogCi0JdGltZV9hZGp1c3QgPSAwOyAgICAgICAgICAgICAgICAvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCWNsb2NrX3dhc19zZXQoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKaW5kZXggZDg3NDIzZC4uOTYxZWRlOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKQEAgLTExOCw2ICsxMTgsMjggQEAKIAlpbmZvLnNpX2NvZGUgPSBjb2RlOwogCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKSBhZGRyOwogCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCAmaW5mbywgY3VycmVudCk7CisKKwkvKgorCSAqIEluaXQgZ2V0cyBubyBzaWduYWxzIHRoYXQgaXQgZG9lc24ndCBoYXZlIGEgaGFuZGxlciBmb3IuCisJICogVGhhdCdzIGFsbCB2ZXJ5IHdlbGwsIGJ1dCBpZiBpdCBoYXMgY2F1c2VkIGEgc3luY2hyb25vdXMKKwkgKiBleGNlcHRpb24gYW5kIHdlIGlnbm9yZSB0aGUgcmVzdWx0aW5nIHNpZ25hbCwgaXQgd2lsbCBqdXN0CisJICogZ2VuZXJhdGUgdGhlIHNhbWUgZXhjZXB0aW9uIG92ZXIgYW5kIG92ZXIgYWdhaW4gYW5kIHdlIGdldAorCSAqIG5vd2hlcmUuICBCZXR0ZXIgdG8ga2lsbCBpdCBhbmQgbGV0IHRoZSBrZXJuZWwgcGFuaWMuCisJICovCisJaWYgKGN1cnJlbnQtPnBpZCA9PSAxKSB7CisJCV9fc2lnaGFuZGxlcl90IGhhbmRsZXI7CisKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCWhhbmRsZXIgPSBjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bc2lnbnItMV0uc2Euc2FfaGFuZGxlcjsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJaWYgKGhhbmRsZXIgPT0gU0lHX0RGTCkgeworCQkJLyogaW5pdCBoYXMgZ2VuZXJhdGVkIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uCisJCQkgICBhbmQgaXQgZG9lc24ndCBoYXZlIGEgaGFuZGxlciBmb3IgdGhlIHNpZ25hbCAqLworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiaW5pdCBoYXMgZ2VuZXJhdGVkIHNpZ25hbCAlZCAiCisJCQkgICAgICAgImJ1dCBoYXMgbm8gaGFuZGxlciBmb3IgaXRcbiIsIHNpZ25yKTsKKwkJCWRvX2V4aXQoc2lnbnIpOworCQl9CisJfQogfQogCiAvKgpAQCAtODQ5LDEwICs4NzEsMTIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwogCisjaWZkZWYgQ09ORklHX0U1MDAKIHZvaWQgUGVyZm9ybWFuY2VNb25pdG9yRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXBlcmZfaXJxKHJlZ3MpOwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCiB2b2lkIENhY2hlTG9ja2luZ0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbGliL01ha2VmaWxlIGIvYXJjaC9wcGMvbGliL01ha2VmaWxlCmluZGV4IDFjMzgwZTYuLmYxZTFmYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3BwYy9saWIvTWFrZWZpbGUKQEAgLTQsNiArNCw1IEBACiAKIG9iai15CQkJOj0gY2hlY2tzdW0ubyBzdHJpbmcubyBzdHJjYXNlLm8gZGVjX2FuZF9sb2NrLm8gZGl2NjQubwogCi1vYmotJChDT05GSUdfU01QKQkrPSBsb2Nrcy5vCiBvYmotJChDT05GSUdfOHh4KQkrPSByaGVhcC5vCiBvYmotJChDT05GSUdfQ1BNMikJKz0gcmhlYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbGliL2RlY19hbmRfbG9jay5jIGIvYXJjaC9wcGMvbGliL2RlY19hbmRfbG9jay5jCmluZGV4IDRlZTg4ODAuLmIxOGYwZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2xpYi9kZWNfYW5kX2xvY2suYworKysgYi9hcmNoL3BwYy9saWIvZGVjX2FuZF9sb2NrLmMKQEAgLTExLDE0ICsxMSw3IEBACiAgKiBoYXMgYSBjbXB4Y2hnLCBhbmQgd2hlcmUgYXRvbWljLT52YWx1ZSBpcyBhbiBpbnQgaG9sZGluZwogICogdGhlIHZhbHVlIG9mIHRoZSBhdG9taWMgKGkuZS4gdGhlIGhpZ2ggYml0cyBhcmVuJ3QgdXNlZAogICogZm9yIGEgbG9jayBvciBhbnl0aGluZyBsaWtlIHRoYXQpLgotICoKLSAqIE4uQi4gQVRPTUlDX0RFQ19BTkRfTE9DSyBnZXRzIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9zcGlubG9jay5oCi0gKiBpZiBzcGlubG9ja3MgYXJlIGVtcHR5IGFuZCB0aHVzIGF0b21pY19kZWNfYW5kX2xvY2sgaXMgZGVmaW5lZAotICogdG8gYmUgYXRvbWljX2RlY19hbmRfdGVzdCAtIGluIHRoYXQgY2FzZSB3ZSBkb24ndCBuZWVkIGl0Ci0gKiBkZWZpbmVkIGhlcmUgYXMgd2VsbC4KICAqLwotCi0jaWZuZGVmIEFUT01JQ19ERUNfQU5EX0xPQ0sKIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQogewogCWludCBjb3VudGVyOwpAQCAtNDMsNCArMzYsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKLSNlbmRpZiAvKiBBVE9NSUNfREVDX0FORF9MT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9mYXVsdC5jIGIvYXJjaC9wcGMvbW0vZmF1bHQuYwppbmRleCA1N2Q5OTMwLi5lZTVlOWYyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcHBjL21tL2ZhdWx0LmMKQEAgLTI3OCwxMSArMjc4LDcgQEAKIAogCS8qIFVzZXIgbW9kZSBhY2Nlc3NlcyBjYXVzZSBhIFNJR1NFR1YgKi8KIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOwotCQlpbmZvLnNpX2Vycm5vID0gMDsKLQkJaW5mby5zaV9jb2RlID0gY29kZTsKLQkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopIGFkZHJlc3M7Ci0JCWZvcmNlX3NpZ19pbmZvKFNJR1NFR1YsICZpbmZvLCBjdXJyZW50KTsKKwkJX2V4Y2VwdGlvbihTSUdTRUdWLCByZWdzLCBjb2RlLCBhZGRyZXNzKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9oYXNodGFibGUuUyBiL2FyY2gvcHBjL21tL2hhc2h0YWJsZS5TCmluZGV4IGFiODMxMzIuLjNlYzg3YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL2hhc2h0YWJsZS5TCisrKyBiL2FyY2gvcHBjL21tL2hhc2h0YWJsZS5TCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaWZkZWYgQ09ORklHX1NNUAogCS5jb21tCW1tdV9oYXNoX2xvY2ssNApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lYm9ueS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lYm9ueS5jCmluZGV4IDBmZDM0NDIuLmQ2YjJiMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvZWJvbnkuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2Vib255LmMKQEAgLTkxLDE1ICs5MSwxMCBAQAogCSAqIG9uIFJldi4gQyBzaWxpY29uIHRoZW4gZXJyYXRhIGZvcmNlcyB1cyB0bwogCSAqIHVzZSB0aGUgaW50ZXJuYWwgY2xvY2suCiAJICovCi0Jc3dpdGNoIChQVlJfUkVWKG1mc3ByKFNQUk5fUFZSKSkpIHsKLQkJY2FzZSBQVlJfUkVWKFBWUl80NDBHUF9SQik6Ci0JCQlmcmVxID0gRUJPTllfNDQwR1BfUkJfU1lTQ0xLOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFZSX1JFVihQVlJfNDQwR1BfUkMxKToKLQkJZGVmYXVsdDoKLQkJCWZyZXEgPSBFQk9OWV80NDBHUF9SQ19TWVNDTEs7Ci0JCQlicmVhazsKLQl9CisJaWYgKHN0cmNtcChjdXJfY3B1X3NwZWNbMF0tPmNwdV9uYW1lLCAiNDQwR1AgUmV2LiBCIikgPT0gMCkKKwkJZnJlcSA9IEVCT05ZXzQ0MEdQX1JCX1NZU0NMSzsKKwllbHNlCisJCWZyZXEgPSBFQk9OWV80NDBHUF9SQ19TWVNDTEs7CiAKIAlpYm00NHhfY2FsaWJyYXRlX2RlY3IoZnJlcSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvaGRwdS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2hkcHUuYwppbmRleCBiNjU5ZDdiLi5mZjM3OTY4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvaGRwdS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9oZHB1LmMKQEAgLTU4LDcgKzU4LDcgQEAKIHN0YXRpYyB2b2lkIGhkcHVfc2V0X2wxcGUodm9pZCk7CiBzdGF0aWMgdm9pZCBoZHB1X2NwdXN0YXRlX3NldCh1bnNpZ25lZCBjaGFyIG5ld19zdGF0ZSk7CiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHNwaW5sb2NrX3QgdGltZWJhc2VfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZWJhc2VfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHRpbWViYXNlX3VwcGVyID0gMCwgdGltZWJhc2VfbG93ZXIgPSAwOwogZXh0ZXJuIGludCBzbXBfdGJfc3luY2hyb25pemVkOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc2xlZXAuUwppbmRleCAwMTZhNzQ2Li44ODQxOWM3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NsZWVwLlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjZGVmaW5lIE1BR0lDCTB4NGM2MTcyNzMJLyogJ0xhcnMnICovCiAKQEAgLTE2MSw2ICsxNjEsOCBAQAogCWFkZGkgcjMscjMsc2xlZXBfc3RvcmFnZUBsCiAJc3R3IHI1LDAocjMpCiAKKwkuZ2xvYmwJbG93X2NwdV9kaWUKK2xvd19jcHVfZGllOgogCS8qIEZsdXNoICYgZGlzYWJsZSBhbGwgY2FjaGVzICovCiAJYmwJZmx1c2hfZGlzYWJsZV9jYWNoZXMKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc21wLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYwppbmRleCA4ZTA0OWRhLi43OTRhMjM5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtNTUsOSArNTYsNyBAQAogICogUG93ZXJzdXJnZSAob2xkIHBvd2VybWFjIFNNUCkgc3VwcG9ydC4KICAqLwogCi1leHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2Uodm9pZCk7Ci1leHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UyKHZvaWQpOwkvKiBUZW1wb3JhcnkgaG9ycmlibGUgaGFjayAqLwotZXh0ZXJuIHZvaWQgX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlMyh2b2lkKTsJLyogVGVtcG9yYXJ5IGhvcnJpYmxlIGhhY2sgKi8KK2V4dGVybiB2b2lkIF9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMCh2b2lkKTsKIAogLyogQWRkcmVzc2VzIGZvciBwb3dlcnN1cmdlIHJlZ2lzdGVycyAqLwogI2RlZmluZSBIQU1NRVJIRUFEX0JBU0UJCTB4ZjgwMDAwMDAKQEAgLTExOSw3ICsxMTgsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBwcmlfdGJfaGksIHByaV90Yl9sbzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJpX3RiX3N0YW1wOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgY29yZTk5X2luaXRfY2FjaGVzKGludCBjcHUpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY29yZTk5X2luaXRfY2FjaGVzKGludCBjcHUpCiB7CiAJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9MMkNSKSkKIAkJcmV0dXJuOwpAQCAtMzQ2LDcgKzM0NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfcHN1cmdlX2tpY2tfY3B1KGludCBucikKIHsKLQl2b2lkICgqc3RhcnQpKHZvaWQpID0gX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBfX3BhKF9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMCkgKyBuciAqIDg7CiAJdW5zaWduZWQgbG9uZyBhOwogCiAJLyogbWF5IG5lZWQgdG8gZmx1c2ggaGVyZSBpZiBzZWNvbmRhcnkgYmF0cyBhcmVuJ3Qgc2V0dXAgKi8KQEAgLTM1NiwxNyArMzU1LDcgQEAKIAogCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX3BzdXJnZV9raWNrX2NwdSIsIDB4MzUzKTsKIAotCS8qIHNldHVwIGVudHJ5IHBvaW50IG9mIHNlY29uZGFyeSBwcm9jZXNzb3IgKi8KLQlzd2l0Y2ggKG5yKSB7Ci0JY2FzZSAyOgotCQlzdGFydCA9IF9fc2Vjb25kYXJ5X3N0YXJ0X3BzdXJnZTI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJc3RhcnQgPSBfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UzOwotCQlicmVhazsKLQl9Ci0KLQlvdXRfYmUzMihwc3VyZ2Vfc3RhcnQsIF9fcGEoc3RhcnQpKTsKKwlvdXRfYmUzMihwc3VyZ2Vfc3RhcnQsIHN0YXJ0KTsKIAltYigpOwogCiAJcHN1cmdlX3NldF9pcGkobnIpOwpAQCAtNTAwLDE0ICs0ODksMTQgQEAKIAlyZXR1cm4gbmNwdXM7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X2tpY2tfY3B1KGludCBucikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbXBfY29yZTk5X2tpY2tfY3B1KGludCBucikKIHsKIAl1bnNpZ25lZCBsb25nIHNhdmVfdmVjdG9yLCBuZXdfdmVjdG9yOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2ZWN0b3IKIAkJID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEtFUk5FTEJBU0UrMHgxMDApKTsKLQlpZiAobnIgPCAxIHx8IG5yID4gMykKKwlpZiAobnIgPCAwIHx8IG5yID4gMykKIAkJcmV0dXJuOwogCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX2NvcmU5OV9raWNrX2NwdSIsIDB4MzQ2KTsKIApAQCAtNTE4LDE5ICs1MDcsOSBAQAogCXNhdmVfdmVjdG9yID0gKnZlY3RvcjsKIAogCS8qIFNldHVwIGZha2UgcmVzZXQgdmVjdG9yIHRoYXQgZG9lcwkKLQkgKiAgIGIgX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlIC0gS0VSTkVMQkFTRQorCSAqICAgYiBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAgKyBucio4IC0gS0VSTkVMQkFTRQogCSAqLwotCXN3aXRjaChucikgewotCQljYXNlIDE6Ci0JCQluZXdfdmVjdG9yID0gKHVuc2lnbmVkIGxvbmcpX19zZWNvbmRhcnlfc3RhcnRfcHN1cmdlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW5ld192ZWN0b3IgPSAodW5zaWduZWQgbG9uZylfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCW5ld192ZWN0b3IgPSAodW5zaWduZWQgbG9uZylfX3NlY29uZGFyeV9zdGFydF9wc3VyZ2UzOwotCQkJYnJlYWs7Ci0JfQorCW5ld192ZWN0b3IgPSAodW5zaWduZWQgbG9uZykgX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wICsgbnIgKiA4OwogCSp2ZWN0b3IgPSAweDQ4MDAwMDAyICsgbmV3X3ZlY3RvciAtIEtFUk5FTEJBU0U7CiAKIAkvKiBmbHVzaCBkYXRhIGNhY2hlIGFuZCBpbnZhbCBpbnN0cnVjdGlvbiBjYWNoZSAqLwpAQCAtNTU0LDcgKzUzMyw3IEBACiAJaWYgKHBwY19tZC5wcm9ncmVzcykgcHBjX21kLnByb2dyZXNzKCJzbXBfY29yZTk5X2tpY2tfY3B1IGRvbmUiLCAweDM0Nyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X3NldHVwX2NwdShpbnQgY3B1X25yKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHNtcF9jb3JlOTlfc2V0dXBfY3B1KGludCBjcHVfbnIpCiB7CiAJLyogU2V0dXAgTDIvTDMgKi8KIAlpZiAoY3B1X25yICE9IDApCkBAIC02NjgsMyArNjQ3LDQ3IEBACiAJLmdpdmVfdGltZWJhc2UJPSBzbXBfY29yZTk5X2dpdmVfdGltZWJhc2UsCiAJLnRha2VfdGltZWJhc2UJPSBzbXBfY29yZTk5X3Rha2VfdGltZWJhc2UsCiB9OworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisKK2ludCBfX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOworCisJLyogWFhYIHJlc2V0IGNwdSBhZmZpbml0eSBoZXJlICovCisJb3BlbnBpY19zZXRfcHJpb3JpdHkoMHhmKTsKKwlhc20gdm9sYXRpbGUoIm10ZGVjICUwIiA6IDogInIiICgweDdmZmZmZmZmKSk7CisJbWIoKTsKKwl1ZGVsYXkoMjApOworCWFzbSB2b2xhdGlsZSgibXRkZWMgJTAiIDogOiAiciIgKDB4N2ZmZmZmZmYpKTsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgbG93X2NwdV9kaWUodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsgLyogaW4gcG1hY19zbGVlcC5TICovCitzdGF0aWMgaW50IGNwdV9kZWFkW05SX0NQVVNdOworCit2b2lkIGNwdV9kaWUodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWNwdV9kZWFkW3NtcF9wcm9jZXNzb3JfaWQoKV0gPSAxOworCW1iKCk7CisJbG93X2NwdV9kaWUoKTsKK30KKwordm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgdGltZW91dDsKKworCXRpbWVvdXQgPSAxMDAwOworCXdoaWxlICghY3B1X2RlYWRbY3B1XSkgeworCQlpZiAoLS10aW1lb3V0ID09IDApIHsKKwkJCXByaW50aygiQ1BVICV1IHJlZnVzZWQgdG8gZGllIVxuIiwgY3B1KTsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxKTsKKwl9CisJY3B1X2NhbGxpbl9tYXBbY3B1XSA9IDA7CisJY3B1X2RlYWRbY3B1XSA9IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL2NwYzcwMF9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi9jcGM3MDBfcGljLmMKaW5kZXggNzc0NzA5OC4uNzVmZThlYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL2NwYzcwMF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvY3BjNzAwX3BpYy5jCkBAIC05MCwxNCArOTAsMTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBjcGM3MDBfcGljID0gewotCSJDUEM3MDAgUElDIiwKLQlOVUxMLAotCU5VTEwsCi0JY3BjNzAwX3VubWFza19pcnEsCi0JY3BjNzAwX21hc2tfaXJxLAotCWNwYzcwMF9tYXNrX2FuZF9hY2tfaXJxLAotCU5VTEwsCi0JTlVMTAorCS50eXBlbmFtZSA9ICJDUEM3MDAgUElDIiwKKwkuZW5hYmxlID0gY3BjNzAwX3VubWFza19pcnEsCisJLmRpc2FibGUgPSBjcGM3MDBfbWFza19pcnEsCisJLmFjayA9IGNwYzcwMF9tYXNrX2FuZF9hY2tfaXJxLAogfTsKIAogX19pbml0IHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaTgyNTkuYyBiL2FyY2gvcHBjL3N5c2xpYi9pODI1OS5jCmluZGV4IGI5MzkxZTYuLjVjNzkwOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9pODI1OS5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9pODI1OS5jCkBAIC0xMjksMTQgKzEyOSwxMSBAQAogfQogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaTgyNTlfcGljID0gewotCSIgaTgyNTkgICAgIiwKLQlOVUxMLAotCU5VTEwsCi0JaTgyNTlfdW5tYXNrX2lycSwKLQlpODI1OV9tYXNrX2lycSwKLQlpODI1OV9tYXNrX2FuZF9hY2tfaXJxLAotCWk4MjU5X2VuZF9pcnEsCi0JTlVMTAorCS50eXBlbmFtZSA9ICIgaTgyNTkgICAgIiwKKwkuZW5hYmxlID0gaTgyNTlfdW5tYXNrX2lycSwKKwkuZGlzYWJsZSA9IGk4MjU5X21hc2tfaXJxLAorCS5hY2sgPSBpODI1OV9tYXNrX2FuZF9hY2tfaXJxLAorCS5lbmQgPSBpODI1OV9lbmRfaXJxLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwaWMxX2lvcmVzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL2libTQ0MGd4X2NvbW1vbi5jIGIvYXJjaC9wcGMvc3lzbGliL2libTQ0MGd4X2NvbW1vbi5jCmluZGV4IGQ0Nzc2YWYuLjBiYjkxOTggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9pYm00NDBneF9jb21tb24uYworKysgYi9hcmNoL3BwYy9zeXNsaWIvaWJtNDQwZ3hfY29tbW9uLmMKQEAgLTIzNiw5ICsyMzYsMTAgQEAKIAkvKiBEaXNhYmxlIEwyQyBvbiByZXYuQSwgcmV2LkIgYW5kIDgwME1IeiB2ZXJzaW9uIG9mIHJldi5DLAogCSAgIGVuYWJsZSBpdCBvbiBhbGwgb3RoZXIgcmV2aXNpb25zCiAJICovCi0JdTMyIHB2ciA9IG1mc3ByKFNQUk5fUFZSKTsKLQlpZiAocHZyID09IFBWUl80NDBHWF9SQSB8fCBwdnIgPT0gUFZSXzQ0MEdYX1JCIHx8Ci0JICAgIChwdnIgPT0gUFZSXzQ0MEdYX1JDICYmIHAtPmNwdSA+IDY2NzAwMDAwMCkpCisJaWYgKHN0cmNtcChjdXJfY3B1X3NwZWNbMF0tPmNwdV9uYW1lLCAiNDQwR1ggUmV2LiBBIikgPT0gMCB8fAorCQkJc3RyY21wKGN1cl9jcHVfc3BlY1swXS0+Y3B1X25hbWUsICI0NDBHWCBSZXYuIEIiKSA9PSAwCisJCQl8fCAoc3RyY21wKGN1cl9jcHVfc3BlY1swXS0+Y3B1X25hbWUsICI0NDBHWCBSZXYuIEMiKQorCQkJCT09IDAgJiYgcC0+Y3B1ID4gNjY3MDAwMDAwKSkKIAkJaWJtNDQwZ3hfbDJjX2Rpc2FibGUoKTsKIAllbHNlCiAJCWlibTQ0MGd4X2wyY19lbmFibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tcGMxMHhfY29tbW9uLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjMTB4X2NvbW1vbi5jCmluZGV4IDg3MDY1ZTIuLjNlMDM5NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGMxMHhfY29tbW9uLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL21wYzEweF9jb21tb24uYwpAQCAtMTQwLDEyICsxNDAsMTIgQEAKIAl9LAogCVtNUEMxMFhfVUFSVDBdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMCwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdF91YXJ0MCwKIAl9LAogCVtNUEMxMFhfVUFSVDFdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMSwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNMSwKIAkJLmRldi5wbGF0Zm9ybV9kYXRhID0gc2VyaWFsX3BsYXRfdWFydDEsCiAJfSwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jCmluZGV4IDVhYWYwZTUuLjk1YjNiOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCX0sCiAJW01QQzgzeHhfRFVBUlRdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMCwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LAogCVtNUEM4M3h4X1NFQzJdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCmluZGV4IDhhZjMyMmQuLmJiYzVhYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4NXh4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODV4eF9kZXZpY2VzLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCX0sCiAJW01QQzg1eHhfRFVBUlRdID0gewogCQkubmFtZSA9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCT0gMCwKKwkJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKIAl9LAogCVtNUEM4NXh4X1BFUkZNT05dID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL212NjR4NjAuYyBiL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwLmMKaW5kZXggNjI2MmIxMS4uODM5Zjg4NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL212NjR4NjAuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXY2NHg2MC5jCkBAIC0zMSw3ICszMSw3IEBACiAKIAogdTggbXY2NHg2MF9wY2lfZXhjbHVkZV9icmlkZ2UgPSAxOwotc3BpbmxvY2tfdAltdjY0eDYwX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitERUZJTkVfU1BJTkxPQ0sobXY2NHg2MF9sb2NrKTsKIAogc3RhdGljIHBoeXNfYWRkcl90IAltdjY0eDYwX2JyaWRnZV9wYmFzZTsKIHN0YXRpYyB2b2lkIAkJKm12NjR4NjBfYnJpZGdlX3ZiYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL29jcC5jIGIvYXJjaC9wcGMvc3lzbGliL29jcC5jCmluZGV4IGU1ZmQyYWU1Li45Y2NjZTQzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvb2NwLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29jcC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIH0KIAogc3RhdGljIGludAotb2NwX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlKQorb2NwX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBvY3BfZGV2aWNlICpvY3BfZGV2ID0gdG9fb2NwX2RldihkZXYpOwogCXN0cnVjdCBvY3BfZHJpdmVyICpvY3BfZHJ2ID0gdG9fb2NwX2RydihkZXYtPmRyaXZlcik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvb3Blbl9waWMyLmMgYi9hcmNoL3BwYy9zeXNsaWIvb3Blbl9waWMyLmMKaW5kZXggN2UyNzJjNS4uMmUwZWE5MiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljMi5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYzIuYwpAQCAtODIsMTMgKzgyLDExIEBACiBzdGF0aWMgdm9pZCBvcGVucGljMl9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpOwogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgb3Blbl9waWMyID0gewotCSIgT3BlblBJQzIgIiwKLQlOVUxMLAotCU5VTEwsCi0Jb3BlbnBpYzJfZW5hYmxlX2lycSwKLQlvcGVucGljMl9kaXNhYmxlX2lycSwKLQlvcGVucGljMl9hY2tfaXJxLAotCW9wZW5waWMyX2VuZF9pcnEsCisJLnR5cGVuYW1lID0gIiBPcGVuUElDMiAiLAorCS5lbmFibGUgPSBvcGVucGljMl9lbmFibGVfaXJxLAorCS5kaXNhYmxlID0gb3BlbnBpYzJfZGlzYWJsZV9pcnEsCisJLmFjayA9IG9wZW5waWMyX2Fja19pcnEsCisJLmVuZCA9IG9wZW5waWMyX2VuZF9pcnEsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzQwM19waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0MDNfcGljLmMKaW5kZXggMDZjYjBhZi4uY2U0ZDFkZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwYzQwM19waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNDAzX3BpYy5jCkBAIC0zNCwxMyArMzQsMTAgQEAKIHN0YXRpYyB2b2lkIHBwYzQwM19haWNfZGlzYWJsZV9hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpOwogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHBwYzQwM19haWMgPSB7Ci0JIjQwM0dDIEFJQyIsCi0JTlVMTCwKLQlOVUxMLAotCXBwYzQwM19haWNfZW5hYmxlLAotCXBwYzQwM19haWNfZGlzYWJsZSwKLQlwcGM0MDNfYWljX2Rpc2FibGVfYW5kX2FjaywKLQkwCisJLnR5cGVuYW1lID0gIjQwM0dDIEFJQyIsCisJLmVuYWJsZSA9IHBwYzQwM19haWNfZW5hYmxlLAorCS5kaXNhYmxlID0gcHBjNDAzX2FpY19kaXNhYmxlLAorCS5hY2sgPSBwcGM0MDNfYWljX2Rpc2FibGVfYW5kX2FjaywKIH07CiAKIGludApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3FzcGFuX3BjaS5jIGIvYXJjaC9wcGMvc3lzbGliL3FzcGFuX3BjaS5jCmluZGV4IDU3ZjRlZDUuLjA5NzBiNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9xc3Bhbl9wY2kuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcXNwYW5fcGNpLmMKQEAgLTk0LDcgKzk0LDcgQEAKICNkZWZpbmUgbWtfY29uZmlnX3R5cGUxKGJ1cywgZGV2LCBvZmZzZXQpIFwKIAlta19jb25maWdfYWRkcihidXMsIGRldiwgb2Zmc2V0KSB8IDE7CiAKLXN0YXRpYyBzcGlubG9ja190IHBjaWJpb3NfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGNpYmlvc19sb2NrKTsKIAogaW50IHFzcGFuX3BjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBjaGFyIGJ1cywgdW5zaWduZWQgY2hhciBkZXZfZm4sCiAJCQkJICB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgY2hhciAqdmFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3hpbGlueF9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi94aWxpbnhfcGljLmMKaW5kZXggZTBiZDY2Zi4uMmNiY2FkMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3hpbGlueF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIveGlsaW54X3BpYy5jCkBAIC03OSwxNCArNzksMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSB4aWxpbnhfaW50YyA9IHsKLQkiWGlsaW54IEludGVycnVwdCBDb250cm9sbGVyIiwKLQlOVUxMLAotCU5VTEwsCi0JeGlsaW54X2ludGNfZW5hYmxlLAotCXhpbGlueF9pbnRjX2Rpc2FibGUsCi0JeGlsaW54X2ludGNfZGlzYWJsZV9hbmRfYWNrLAotCXhpbGlueF9pbnRjX2VuZCwKLQkwCisJLnR5cGVuYW1lID0gIlhpbGlueCBJbnRlcnJ1cHQgQ29udHJvbGxlciIsCisJLmVuYWJsZSA9IHhpbGlueF9pbnRjX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHhpbGlueF9pbnRjX2Rpc2FibGUsCisJLmFjayA9IHhpbGlueF9pbnRjX2Rpc2FibGVfYW5kX2FjaywKKwkuZW5kID0geGlsaW54X2ludGNfZW5kLAogfTsKIAogaW50CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L0tjb25maWcgYi9hcmNoL3BwYzY0L0tjb25maWcKaW5kZXggMTNiMjYyZi4uZGVjYTY4YSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9LY29uZmlnCisrKyBiL2FyY2gvcHBjNjQvS2NvbmZpZwpAQCAtNDQsNiArNDQsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogIyBXZSBvcHRpbWlzdGljYWxseSBhbGxvY2F0ZSBsYXJnZXBhZ2VzIGZyb20gdGhlIFZNLCBzbyBtYWtlIHRoZSBsaW1pdAogIyBsYXJnZSBlbm91Z2ggKDE2TUIpLiBUaGlzIGJhZGx5IG5hbWVkIGNvbmZpZyBvcHRpb24gaXMgYWN0dWFsbHkKICMgbWF4IG9yZGVyICsgMQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9NYWtlZmlsZSBiL2FyY2gvcHBjNjQvTWFrZWZpbGUKaW5kZXggNjM1MGNjZS4uMTdkMmMxZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9NYWtlZmlsZQorKysgYi9hcmNoL3BwYzY0L01ha2VmaWxlCkBAIC00OSwxNCArNDksMTQgQEAKIAogZW5kaWYKIAotQ0hFQ0tGTEFHUwkrPSAtbTY0IC1EX19wb3dlcnBjX18KK0NIRUNLRkxBR1MJKz0gLW02NCAtRF9fcG93ZXJwY19fIC1EX19wb3dlcnBjNjRfXwogCiBMREZMQUdTCQk6PSAtbSBlbGY2NHBwYwogTERGTEFHU192bWxpbnV4CTo9IC1Cc3RhdGljIC1lICQoS0VSTkVMTE9BRCkgLVR0ZXh0ICQoS0VSTkVMTE9BRCkKIENGTEFHUwkJKz0gLW1zb2Z0LWZsb2F0IC1waXBlIC1tbWluaW1hbC10b2MgLW10cmFjZWJhY2s9bm9uZSBcCiAJCSAgIC1tY2FsbC1haXhkZXNjCiAjIFRlbXBvcmFyeSBoYWNrIHVudGlsIHdlIGhhdmUgbWlncmF0ZWQgdG8gYXNtLXBvd2VycGMKLUNQUEZMQUdTCSs9IC1JaW5jbHVkZTMKK0NQUEZMQUdTCSs9IC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUKIAogR0NDX1ZFUlNJT04gICAgIDo9ICQoY2FsbCBjYy12ZXJzaW9uKQogR0NDX0JST0tFTl9WRUMJOj0gJChzaGVsbCBpZiBbICQoR0NDX1ZFUlNJT04pIC1sdCAwNDAwIF0gOyB0aGVuIGVjaG8gInkiOyBmaSA7KQpAQCAtODksMTEgKzg5LDEyIEBACiAKIGJvb3QgOj0gYXJjaC9wcGM2NC9ib290CiAKLWJvb3R0YXJnZXQtJChDT05GSUdfUFBDX1BTRVJJRVMpIDo9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkCi1ib290dGFyZ2V0LSQoQ09ORklHX1BQQ19NQVBMRSkgOj0gekltYWdlIHpJbWFnZS5pbml0cmQKLWJvb3R0YXJnZXQtJChDT05GSUdfUFBDX0lTRVJJRVMpIDo9IHZtbGludXguc21pbml0cmQgdm1saW51eC5pbml0cmQgdm1saW51eC5zbQotYm9vdHRhcmdldC0kKENPTkZJR19QUENfQlBBKSA6PSB6SW1hZ2UgekltYWdlLmluaXRyZAotJChib290dGFyZ2V0LXkpOiB2bWxpbnV4Citib290dGFyZ2V0cy0kKENPTkZJR19QUENfUFNFUklFUykgKz0gekltYWdlIHpJbWFnZS5pbml0cmQKK2Jvb3R0YXJnZXRzLSQoQ09ORklHX1BQQ19QTUFDKSArPSB6SW1hZ2Uudm1vZGUgekltYWdlLmluaXRyZC52bW9kZQorYm9vdHRhcmdldHMtJChDT05GSUdfUFBDX01BUExFKSArPSB6SW1hZ2UgekltYWdlLmluaXRyZAorYm9vdHRhcmdldHMtJChDT05GSUdfUFBDX0lTRVJJRVMpICs9IHZtbGludXguc21pbml0cmQgdm1saW51eC5pbml0cmQgdm1saW51eC5zbQorYm9vdHRhcmdldHMtJChDT05GSUdfUFBDX0JQQSkgKz0gekltYWdlIHpJbWFnZS5pbml0cmQKKyQoYm9vdHRhcmdldHMteSk6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAogYm9vdGltYWdlLSQoQ09ORklHX1BQQ19QU0VSSUVTKSA6PSAkKGJvb3QpL3pJbWFnZQpAQCAtMTE0LDI3ICsxMTUsMjEgQEAKIAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKLQkkKFEpcm0gLXJmIGluY2x1ZGUzCisJIyBUZW1wb3JhcnkgaGFjayB1bnRpbCB3ZSBoYXZlIG1pZ3JhdGVkIHRvIGFzbS1wb3dlcnBjCisJJChRKXJtIC1yZiBhcmNoLyQoQVJDSCkvaW5jbHVkZQogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS1wcGM2NC9vZmZzZXRzLmgKLQotYXJjaC9wcGM2NC9rZXJuZWwvYXNtLW9mZnNldHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS1wcGM2NC9vZmZzZXRzLmg6IGFyY2gvcHBjNjQva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCiAKICMgVGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBtaWdyYXRlZCB0byBhc20tcG93ZXJwYwotaW5jbHVkZS9hc206IGluY2x1ZGUzL2FzbQotaW5jbHVkZTMvYXNtOgotCSQoUSlpZiBbICEgLWQgaW5jbHVkZTMgXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlMzsgZmk7Ci0JJChRKWxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1wb3dlcnBjIGluY2x1ZGUzL2FzbQoraW5jbHVkZS9hc206IGFyY2gvJChBUkNIKS9pbmNsdWRlL2FzbQorYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtOgorCSQoUSlpZiBbICEgLWQgYXJjaC8kKEFSQ0gpL2luY2x1ZGUgXTsgdGhlbiBta2RpciAtcCBhcmNoLyQoQVJDSCkvaW5jbHVkZTsgZmkKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXBvd2VycGMgYXJjaC8kKEFSQ0gpL2luY2x1ZGUvYXNtCiAKIGRlZmluZSBhcmNoaGVscAotICBlY2hvICAnKiB6SW1hZ2UgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvekltYWdlKScKLSAgZWNobyAgJyAgekltYWdlLmluaXRyZC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2Ugd2l0aCBpbml0cmQgYXR0YWNoZWQsJwotICBlY2hvICAnCQkgICBzb3VyY2VkIGZyb20gYXJjaC8kKEFSQ0gpL2Jvb3QvcmFtZGlzay5pbWFnZS5neicKLSAgZWNobyAgJwkJICAgKGFyY2gvJChBUkNIKS9ib290L3pJbWFnZS5pbml0cmQpJworICBlY2hvICAnICB6SW1hZ2Uudm1vZGUgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvJChBUkNIKS9ib290L3pJbWFnZS52bW9kZSknCisgIGVjaG8gICcgIHpJbWFnZS5pbml0cmQudm1vZGUgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSB3aXRoIGluaXRyZCBhdHRhY2hlZCwnCisgIGVjaG8gICcgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VkIGZyb20gYXJjaC8kKEFSQ0gpL2Jvb3QvcmFtZGlzay5pbWFnZS5neicKKyAgZWNobyAgJyAgICAgICAgICAgICAgICAgICAgICAgIChhcmNoLyQoQVJDSCkvYm9vdC96SW1hZ2UuaW5pdHJkLnZtb2RlKScKKyAgZWNobyAgJyAgekltYWdlICAgICAgICAgICAgICAtIHpJbWFnZSBmb3IgcFNlcmllcyBtYWNoaW5lcycKKyAgZWNobyAgJyAgekltYWdlLmluaXRyZCAgICAgICAtIHpJbWFnZSB3aXRoIGluaXRyZCBmb3IgcFNlcmllcyBtYWNoaW5lcycKIGVuZGVmCi0KLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXBwYzY0L29mZnNldHMuaApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9ib290L01ha2VmaWxlIGIvYXJjaC9wcGM2NC9ib290L01ha2VmaWxlCmluZGV4IDJjNWY1ZTcuLjMzZmRjODcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3BwYzY0L2Jvb3QvTWFrZWZpbGUKQEAgLTM3LDYgKzM3LDkgQEAKIHF1aWV0X2NtZF9ib290YXMgPSBCT09UQVMgICRACiAgICAgICBjbWRfYm9vdGFzID0gJChDUk9TUzMyQ0MpIC1XcCwtTUQsJChkZXBmaWxlKSAkKEJPT1RBRkxBR1MpIC1jIC1vICRAICQ8CiAKK3F1aWV0X2NtZF9ib290bGQgPSBCT09UTEQgICRACisgICAgICBjbWRfYm9vdGxkID0gJChDUk9TUzMyTEQpICQoQk9PVExGTEFHUykgLW8gJEAgJCgyKQorCiAkKHBhdHN1YnN0ICUuYywlLm8sICQoZmlsdGVyICUuYywgJChzcmMtYm9vdCkpKTogJS5vOiAlLmMKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYm9vdGNjKQogJChwYXRzdWJzdCAlLlMsJS5vLCAkKGZpbHRlciAlLlMsICQoc3JjLWJvb3QpKSk6ICUubzogJS5TCkBAIC01Myw3ICs1Niw3IEBACiBnei1zZWMgID0gJChmb3JlYWNoIHNlY3Rpb24sICQoMSksICQocGF0c3Vic3QgJSwkKG9iaikva2VybmVsLSUuZ3osICQoc2VjdGlvbikpKQogCiBob3N0cHJvZ3MteQkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrCi10YXJnZXRzIAkJKz0gekltYWdlIHpJbWFnZS5pbml0cmQgaW1hZ2VzaXplLmMgXAordGFyZ2V0cyAJCSs9IHpJbWFnZS52bW9kZSB6SW1hZ2UuaW5pdHJkLnZtb2RlIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIGltYWdlc2l6ZS5jIFwKIAkJCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKIAkJCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIHNyYy1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKIAkJCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIGd6LXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXApAQCAtNjMsNyArNjYsNyBAQAogcXVpZXRfY21kX3JhbWRpc2sgPSBSQU1ESVNLICRACiAgICAgICBjbWRfcmFtZGlzayA9ICQob2JqKS9hZGRSYW1EaXNrICQob2JqKS9yYW1kaXNrLmltYWdlLmd6ICQ8ICRACiAKLXF1aWV0X2NtZF9zdHJpcHZtID0gU1RSSVAgJEAKK3F1aWV0X2NtZF9zdHJpcHZtID0gU1RSSVAgICAkQAogICAgICAgY21kX3N0cmlwdm0gPSAkKFNUUklQKSAtcyAkPCAtbyAkQAogCiB2bWxpbnV4LnN0cmlwOiB2bWxpbnV4IEZPUkNFCkBAIC03MSwxMiArNzQsMjAgQEAKICQob2JqKS92bWxpbnV4LmluaXRyZDogdm1saW51eC5zdHJpcCAkKG9iaikvYWRkUmFtRGlzayAkKG9iaikvcmFtZGlzay5pbWFnZS5neiBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHJhbWRpc2spCiAKLWFkZHNlY3Rpb24gPSAkKENST1NTMzJPQkpDT1BZKSAkKDEpIFwKLQkJLS1hZGQtc2VjdGlvbj0ua2VybmVsOiQoc3RyaXAgJChwYXRzdWJzdCAkKG9iaikva2VybmVsLSUubywlLCAkKDEpKSk9JChwYXRzdWJzdCAlLm8sJS5neiwgJCgxKSkgXAotCQktLXNldC1zZWN0aW9uLWZsYWdzPS5rZXJuZWw6JChzdHJpcCAkKHBhdHN1YnN0ICQob2JqKS9rZXJuZWwtJS5vLCUsICQoMSkpKT0kKE9CSkNPUFlGTEFHUykKK3F1aWV0X2NtZF9hZGRzZWN0aW9uID0gQUREU0VDICAkQAorICAgICAgY21kX2FkZHNlY3Rpb24gPSAkKENST1NTMzJPQkpDT1BZKSAkQCBcCisJCS0tYWRkLXNlY3Rpb249Lmtlcm5lbDokKHN0cmlwICQocGF0c3Vic3QgJChvYmopL2tlcm5lbC0lLm8sJSwgJEApKT0kKHBhdHN1YnN0ICUubywlLmd6LCAkQCkgXAorCQktLXNldC1zZWN0aW9uLWZsYWdzPS5rZXJuZWw6JChzdHJpcCAkKHBhdHN1YnN0ICQob2JqKS9rZXJuZWwtJS5vLCUsICRAKSk9JChPQkpDT1BZRkxBR1MpCiAKLXF1aWV0X2NtZF9hZGRub3RlID0gQURETk9URSAkQCAKLSAgICAgIGNtZF9hZGRub3RlID0gJChDUk9TUzMyTEQpICQoQk9PVExGTEFHUykgLW8gJEAgJChvYmotYm9vdCkgJiYgJChvYmopL2FkZG5vdGUgJEAKK3F1aWV0X2NtZF9pbWFnZXNpemUgPSBHRU5TSVpFICRACisgICAgICBjbWRfaW1hZ2VzaXplID0gbHMgLWwgdm1saW51eC5zdHJpcCB8IFwKKwkJYXdrICd7cHJpbnRmICIvKiBnZW5lcmF0ZWQgLS0gZG8gbm90IGVkaXQhICovXG4iICJ1bnNpZ25lZCBsb25nIHZtbGludXhfZmlsZXNpemUgPSAlZDtcbiIsICQkNX0nIFwKKwkJPiAkKG9iaikvaW1hZ2VzaXplLmMgJiYgXAorCQkkKENST1NTX0NPTVBJTEUpbm0gLW4gdm1saW51eCB8IHRhaWwgLW4gMSB8IFwKKwkJYXdrICd7cHJpbnRmICJ1bnNpZ25lZCBsb25nIHZtbGludXhfbWVtc2l6ZSA9IDB4JXM7XG4iLCBzdWJzdHIoJCQxLDgpfScgPj4gJChvYmopL2ltYWdlc2l6ZS5jCisKK3F1aWV0X2NtZF9hZGRub3RlID0gQURETk9URSAkQAorICAgICAgY21kX2FkZG5vdGUgPSAkKG9iaikvYWRkbm90ZSAkQAogCiAkKGNhbGwgZ3otc2VjLCAkKHJlcXVpcmVkKSk6ICQob2JqKS9rZXJuZWwtJS5nejogJSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCkBAIC04NSwyOCArOTYsMzAgQEAKIAljcCAtZiAkKG9iaikvcmFtZGlzay5pbWFnZS5neiAkQAogCiAkKGNhbGwgc3JjLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKTogJChvYmopL2tlcm5lbC0lLmM6ICQob2JqKS9rZXJuZWwtJS5neiBGT1JDRQotCXRvdWNoICRACisJQHRvdWNoICRACiAKICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpOiAkKG9iaikva2VybmVsLSUubzogJChvYmopL2tlcm5lbC0lLmMgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYm9vdGNjKQotCSQoY2FsbCBhZGRzZWN0aW9uLCAkQCkKKwkkKGNhbGwgY21kLGFkZHNlY3Rpb24pCiAKLSQob2JqKS96SW1hZ2U6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkKLSQob2JqKS96SW1hZ2U6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkgJChvYmotYm9vdCkgJChvYmopL2FkZG5vdGUgRk9SQ0UKKyQob2JqKS96SW1hZ2Uudm1vZGU6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkKKyQob2JqKS96SW1hZ2Uudm1vZGU6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkgJChvYmotYm9vdCkgRk9SQ0UKKwkkKGNhbGwgY21kLGJvb3RsZCwkKG9iai1ib290KSkKKworJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGU6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpCiskKG9iaikvekltYWdlLmluaXRyZC52bW9kZTogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkgJChvYmotYm9vdCkgRk9SQ0UKKwkkKGNhbGwgY21kLGJvb3RsZCwkKG9iai1ib290KSkKKworJChvYmopL3pJbWFnZTogJChvYmopL3pJbWFnZS52bW9kZSAkKG9iaikvYWRkbm90ZSBGT1JDRQorCUBjcCAtZiAkPCAkQAogCSQoY2FsbCBpZl9jaGFuZ2VkLGFkZG5vdGUpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkOiBvYmotYm9vdCArPSAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKQotJChvYmopL3pJbWFnZS5pbml0cmQ6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpICQob2JqLWJvb3QpICQob2JqKS9hZGRub3RlIEZPUkNFCiskKG9iaikvekltYWdlLmluaXRyZDogJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGUgJChvYmopL2FkZG5vdGUgRk9SQ0UKKwlAY3AgLWYgJDwgJEAKIAkkKGNhbGwgaWZfY2hhbmdlZCxhZGRub3RlKQogCiAkKG9iaikvaW1hZ2VzaXplLmM6IHZtbGludXguc3RyaXAKLQlAZWNobyBHZW5lcmF0aW5nICRACi0JbHMgLWwgdm1saW51eC5zdHJpcCB8IFwKLQlhd2sgJ3twcmludGYgIi8qIGdlbmVyYXRlZCAtLSBkbyBub3QgZWRpdCEgKi9cbiIgXAotCQkidW5zaWduZWQgbG9uZyB2bWxpbnV4X2ZpbGVzaXplID0gJWQ7XG4iLCAkJDV9JyA+ICQob2JqKS9pbWFnZXNpemUuYwotCSQoQ1JPU1NfQ09NUElMRSlubSAtbiB2bWxpbnV4IHwgdGFpbCAtbiAxIHwgXAotCWF3ayAne3ByaW50ZiAidW5zaWduZWQgbG9uZyB2bWxpbnV4X21lbXNpemUgPSAweCVzO1xuIiwgc3Vic3RyKCQkMSw4KX0nIFwKLQkJPj4gJChvYmopL2ltYWdlc2l6ZS5jCisJJChjYWxsIGNtZCxpbWFnZXNpemUpCiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKEJPT1RJTUFHRSkKIAlzaCAteCAkKHNyY3RyZWUpLyQoc3JjKS9pbnN0YWxsLnNoICIkKEtFUk5FTFJFTEVBU0UpIiB2bWxpbnV4IFN5c3RlbS5tYXAgIiQoSU5TVEFMTF9QQVRIKSIgIiQoQk9PVElNQUdFKSIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvYm9vdC9tYWluLmMgYi9hcmNoL3BwYzY0L2Jvb3QvbWFpbi5jCmluZGV4IDk5ZTY4Y2YuLmY3ZWMxOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvYm9vdC9tYWluLmMKKysrIGIvYXJjaC9wcGM2NC9ib290L21haW4uYwpAQCAtMjMsNyArMjMsOCBAQAogCiAvKiBWYWx1ZSBwaWNrZWQgdG8gbWF0Y2ggdGhhdCB1c2VkIGJ5IHlhYm9vdCAqLwogI2RlZmluZSBQUk9HX1NUQVJUCTB4MDE0MDAwMDAKLSNkZWZpbmUgUkFNX0VORAkJKDI1Njw8MjApIC8vIEZpeG1lOiB1c2UgT0YgKi8KKyNkZWZpbmUgUkFNX0VORAkJKDUxMjw8MjApIC8vIEZpeG1lOiB1c2UgT0YgKi8KKyNkZWZpbmUJT05FX01CCQkweDEwMDAwMAogCiBzdGF0aWMgY2hhciAqYXZhaWxfcmFtOwogc3RhdGljIGNoYXIgKmJlZ2luX2F2YWlsLCAqZW5kX2F2YWlsOwpAQCAtMzIsNiArMzMsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBoZWFwX21heDsKIAogZXh0ZXJuIGNoYXIgX3N0YXJ0W107CitleHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfdm1saW51eF9zdGFydFtdOwogZXh0ZXJuIGNoYXIgX3ZtbGludXhfZW5kW107CiBleHRlcm4gY2hhciBfaW5pdHJkX3N0YXJ0W107CkBAIC01OCwxMyArNjAsMTMgQEAKIAogI3VuZGVmIERFQlVHCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsYWltX2Jhc2UgPSBQUk9HX1NUQVJUOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xhaW1fYmFzZTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdHJ5X2NsYWltKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwogCi0JZm9yKDsgY2xhaW1fYmFzZSA8IFJBTV9FTkQ7IGNsYWltX2Jhc2UgKz0gMHgxMDAwMDApIHsKKwlmb3IoOyBjbGFpbV9iYXNlIDwgUkFNX0VORDsgY2xhaW1fYmFzZSArPSBPTkVfTUIpIHsKICNpZmRlZiBERUJVRwogCQlwcmludGYoIiAgICB0cnlpbmc6IDB4JTA4bHhcblxyIiwgY2xhaW1fYmFzZSk7CiAjZW5kaWYKQEAgLTk1LDcgKzk3LDI2IEBACiAJaWYgKGdldHByb3AoY2hvc2VuX2hhbmRsZSwgInN0ZGluIiwgJnN0ZGluLCBzaXplb2Yoc3RkaW4pKSAhPSA0KQogCQlleGl0KCk7CiAKLQlwcmludGYoIlxuXHJ6SW1hZ2Ugc3RhcnRpbmc6IGxvYWRlZCBhdCAweCV4XG5cciIsICh1bnNpZ25lZClfc3RhcnQpOworCXByaW50ZigiXG5ccnpJbWFnZSBzdGFydGluZzogbG9hZGVkIGF0IDB4JWx4XG5cciIsICh1bnNpZ25lZCBsb25nKSBfc3RhcnQpOworCisJLyoKKwkgKiBUaGUgZmlyc3QgYXZhaWxhYmxlIGNsYWltX2Jhc2UgbXVzdCBiZSBhYm92ZSB0aGUgZW5kIG9mIHRoZQorCSAqIHRoZSBsb2FkZWQga2VybmVsIHdyYXBwZXIgZmlsZSAoX3N0YXJ0IHRvIF9lbmQgaW5jbHVkZXMgdGhlCisJICogaW5pdHJkIGltYWdlIGlmIGl0IGlzIHByZXNlbnQpIGFuZCByb3VuZGVkIHVwIHRvIGEgbmljZQorCSAqIDEgTUIgYm91bmRhcnkgZm9yIGdvb2QgbWVhc3VyZS4KKwkgKi8KKworCWNsYWltX2Jhc2UgPSBfQUxJR05fVVAoKHVuc2lnbmVkIGxvbmcpX2VuZCwgT05FX01CKTsKKworI2lmIGRlZmluZWQoUFJPR19TVEFSVCkKKwkvKgorCSAqIE1haW50YWluIGEgIm1hZ2ljIiBtaW5pbXVtIGFkZHJlc3MuIFRoaXMga2VlcHMgc29tZSBvbGRlcgorCSAqIGZpcm13YXJlIHBsYXRmb3JtcyBydW5uaW5nLgorCSAqLworCisJaWYgKGNsYWltX2Jhc2UgPCBQUk9HX1NUQVJUKQorCQljbGFpbV9iYXNlID0gUFJPR19TVEFSVDsKKyNlbmRpZgogCiAJLyoKIAkgKiBOb3cgd2UgdHJ5IHRvIGNsYWltIHNvbWUgbWVtb3J5IGZvciB0aGUga2VybmVsIGl0c2VsZgpAQCAtMTA1LDcgKzEyNiw3IEBACiAJICogc2l6ZS4uLiBJbiBwcmFjdGljZSB3ZSBhZGQgMU1iLCB0aGF0IGlzIGVub3VnaCwgYnV0IHdlIHNob3VsZCByZWFsbHkKIAkgKiBjb25zaWRlciBmaXhpbmcgdGhlIE1ha2VmaWxlIHRvIHB1dCBhIF9yYXdfIGtlcm5lbCBpbiB0aGVyZSAhCiAJICovCi0Jdm1saW51eF9tZW1zaXplICs9IDB4MTAwMDAwOworCXZtbGludXhfbWVtc2l6ZSArPSBPTkVfTUI7CiAJcHJpbnRmKCJBbGxvY2F0aW5nIDB4JWx4IGJ5dGVzIGZvciBrZXJuZWwgLi4uXG5cciIsIHZtbGludXhfbWVtc2l6ZSk7CiAJdm1saW51eC5hZGRyID0gdHJ5X2NsYWltKHZtbGludXhfbWVtc2l6ZSk7CiAJaWYgKHZtbGludXguYWRkciA9PSAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9icGFfaWljLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9icGFfaWljLmMKaW5kZXggYzhmM2RjMy4uMGFhYTg3OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvYnBhX2lpYy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2JwYV9paWMuYwpAQCAtMjA1LDYgKzIwNSwxOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAorCisvKiBVc2UgdGhlIGhpZ2hlc3QgaW50ZXJydXB0IHByaW9yaXRpZXMgZm9yIElQSSAqLworc3RhdGljIGlubGluZSBpbnQgaWljX2lwaV90b19pcnEoaW50IGlwaSkKK3sKKwlyZXR1cm4gSUlDX0lQSV9PRkZTRVQgKyBJSUNfTlVNX0lQSVMgLSAxIC0gaXBpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpaWNfaXJxX3RvX2lwaShpbnQgaXJxKQoreworCXJldHVybiBJSUNfTlVNX0lQSVMgLSAxIC0gKGlycSAtIElJQ19JUElfT0ZGU0VUKTsKK30KKwogdm9pZCBpaWNfc2V0dXBfY3B1KHZvaWQpCiB7CiAJb3V0X2JlNjQoJl9fZ2V0X2NwdV92YXIoaWljKS5yZWdzLT5wcmlvLCAweGZmKTsKQEAgLTIxMiwxOCArMjI0LDIwIEBACiAKIHZvaWQgaWljX2NhdXNlX0lQSShpbnQgY3B1LCBpbnQgbWVzZykKIHsKLQlvdXRfYmU2NCgmcGVyX2NwdShpaWMsIGNwdSkucmVncy0+Z2VuZXJhdGUsIG1lc2cpOworCW91dF9iZTY0KCZwZXJfY3B1KGlpYywgY3B1KS5yZWdzLT5nZW5lcmF0ZSwgKElJQ19OVU1fSVBJUyAtIDEgLSBtZXNnKSA8PCA0KTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGlpY19pcGlfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0KLQlzbXBfbWVzc2FnZV9yZWN2KGlycSAtIElJQ19JUElfT0ZGU0VULCByZWdzKTsKKwlzbXBfbWVzc2FnZV9yZWN2KGlpY19pcnFfdG9faXBpKGlycSksIHJlZ3MpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgaWljX3JlcXVlc3RfaXBpKGludCBpcnEsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdm9pZCBpaWNfcmVxdWVzdF9pcGkoaW50IGlwaSwgY29uc3QgY2hhciAqbmFtZSkKIHsKKwlpbnQgaXJxOworCisJaXJxID0gaWljX2lwaV90b19pcnEoaXBpKTsKIAkvKiBJUElzIGFyZSBtYXJrZWQgU0FfSU5URVJSVVBUIGFzIHRoZXkgbXVzdCBydW4gd2l0aCBpcnFzCiAJICogZGlzYWJsZWQgKi8KIAlnZXRfaXJxX2Rlc2MoaXJxKS0+aGFuZGxlciA9ICZpaWNfcGljOwpAQCAtMjMzLDEwICsyNDcsMTAgQEAKIAogdm9pZCBpaWNfcmVxdWVzdF9JUElzKHZvaWQpCiB7Ci0JaWljX3JlcXVlc3RfaXBpKElJQ19JUElfT0ZGU0VUICsgUFBDX01TR19DQUxMX0ZVTkNUSU9OLCAiSVBJLWNhbGwiKTsKLQlpaWNfcmVxdWVzdF9pcGkoSUlDX0lQSV9PRkZTRVQgKyBQUENfTVNHX1JFU0NIRURVTEUsICJJUEktcmVzY2hlZCIpOworCWlpY19yZXF1ZXN0X2lwaShQUENfTVNHX0NBTExfRlVOQ1RJT04sICJJUEktY2FsbCIpOworCWlpY19yZXF1ZXN0X2lwaShQUENfTVNHX1JFU0NIRURVTEUsICJJUEktcmVzY2hlZCIpOwogI2lmZGVmIENPTkZJR19ERUJVR0dFUgotCWlpY19yZXF1ZXN0X2lwaShJSUNfSVBJX09GRlNFVCArIFBQQ19NU0dfREVCVUdHRVJfQlJFQUssICJJUEktZGVidWciKTsKKwlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19ERUJVR0dFUl9CUkVBSywgIklQSS1kZWJ1ZyIpOwogI2VuZGlmIC8qIENPTkZJR19ERUJVR0dFUiAqLwogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUyBiL2FyY2gvcHBjNjQva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwppbmRleCAwNDgyYzA2Li4xZmI2NzNjNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvY3B1X3NldHVwX3Bvd2VyNC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtMTIsMTAgKzEyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogX0dMT0JBTChfXzk3MF9jcHVfcHJlaW5pdCkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2VlaC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvZWVoLmMKaW5kZXggYWY1MjcyZi4uYmE5M2ZkNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvZWVoLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvZWVoLmMKQEAgLTIwMiwxMCArMjAyLDkgQEAKIAl3aGlsZSAobikgewogCQlzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UgKnBpYXI7CiAJCXBpYXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UsIHJiX25vZGUpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiAlcyBhZGRyIHJhbmdlICVkIFslbHgtJWx4XTogJXMgJXNcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6ICVzIGFkZHIgcmFuZ2UgJWQgWyVseC0lbHhdOiAlc1xuIiwKIAkJICAgICAgIChwaWFyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImkvbyIgOiAibWVtIiwgY250LAotCQkgICAgICAgcGlhci0+YWRkcl9sbywgcGlhci0+YWRkcl9oaSwgcGNpX25hbWUocGlhci0+cGNpZGV2KSwKLQkJICAgICAgIHBjaV9wcmV0dHlfbmFtZShwaWFyLT5wY2lkZXYpKTsKKwkJICAgICAgIHBpYXItPmFkZHJfbG8sIHBpYXItPmFkZHJfaGksIHBjaV9uYW1lKHBpYXItPnBjaWRldikpOwogCQljbnQrKzsKIAkJbiA9IHJiX25leHQobik7CiAJfQpAQCAtMjU1LDIyICsyNTQsMjQgQEAKIHN0YXRpYyB2b2lkIF9fcGNpX2FkZHJfY2FjaGVfaW5zZXJ0X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisJc3RydWN0IHBjaV9kbiAqcGRuOwogCWludCBpOwogCWludCBpbnNlcnRlZCA9IDA7CiAKIAlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwogCWlmICghZG4pIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBubyBwY2kgZG4gZm91bmQgZm9yIGRldj0lcyAlc1xuIiwKLQkJCXBjaV9uYW1lKGRldiksIHBjaV9wcmV0dHlfbmFtZShkZXYpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBubyBwY2kgZG4gZm91bmQgZm9yIGRldj0lc1xuIiwKKwkJCXBjaV9uYW1lKGRldikpOwogCQlyZXR1cm47CiAJfQogCiAJLyogU2tpcCBhbnkgZGV2aWNlcyBmb3Igd2hpY2ggRUVIIGlzIG5vdCBlbmFibGVkLiAqLwotCWlmICghKGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkgfHwKLQkgICAgZG4tPmVlaF9tb2RlICYgRUVIX01PREVfTk9DSEVDSykgeworCXBkbiA9IGRuLT5kYXRhOworCWlmICghKHBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9TVVBQT1JURUQpIHx8CisJICAgIHBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9OT0NIRUNLKSB7CiAjaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBza2lwIGJ1aWxkaW5nIGFkZHJlc3MgY2FjaGUgZm9yPSVzICVzXG4iLAotCQkgICAgICAgcGNpX25hbWUoZGV2KSwgcGNpX3ByZXR0eV9uYW1lKGRldikpOworCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IHNraXAgYnVpbGRpbmcgYWRkcmVzcyBjYWNoZSBmb3I9JXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKICNlbmRpZgogCQlyZXR1cm47CiAJfQpAQCAtNDE2LDYgKzQxNyw3IEBACiBzdGF0aWMgaW50IHJlYWRfc2xvdF9yZXNldF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBpbnQgcmV0c1tdKQogewogCWludCB0b2tlbiwgb3V0cHV0czsKKwlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBkbi0+ZGF0YTsKIAogCWlmIChpYm1fcmVhZF9zbG90X3Jlc2V0X3N0YXRlMiAhPSBSVEFTX1VOS05PV05fU0VSVklDRSkgewogCQl0b2tlbiA9IGlibV9yZWFkX3Nsb3RfcmVzZXRfc3RhdGUyOwpAQCAtNDI1LDggKzQyNyw4IEBACiAJCW91dHB1dHMgPSAzOwogCX0KIAotCXJldHVybiBydGFzX2NhbGwodG9rZW4sIDMsIG91dHB1dHMsIHJldHMsIGRuLT5lZWhfY29uZmlnX2FkZHIsCi0JCQkgQlVJRF9ISShkbi0+cGhiLT5idWlkKSwgQlVJRF9MTyhkbi0+cGhiLT5idWlkKSk7CisJcmV0dXJuIHJ0YXNfY2FsbCh0b2tlbiwgMywgb3V0cHV0cywgcmV0cywgcGRuLT5lZWhfY29uZmlnX2FkZHIsCisJCQkgQlVJRF9ISShwZG4tPnBoYi0+YnVpZCksIEJVSURfTE8ocGRuLT5waGItPmJ1aWQpKTsKIH0KIAogLyoqCkBAIC00NDcsMTIgKzQ0OSwxMiBAQAogCSAqIGluIGxpZ2h0IG9mIHBvdGVudGlhbCBjb3JydXB0aW9uLCB3ZSBjYW4gdXNlIGl0IGhlcmUuCiAJICovCiAJaWYgKHBhbmljX29uX29vcHMpCi0JCXBhbmljKCJFRUg6IE1NSU8gZmFpbHVyZSAoJWQpIG9uIGRldmljZTolcyAlc1xuIiwgcmVzZXRfc3RhdGUsCi0JCSAgICAgIHBjaV9uYW1lKGRldiksIHBjaV9wcmV0dHlfbmFtZShkZXYpKTsKKwkJcGFuaWMoIkVFSDogTU1JTyBmYWlsdXJlICglZCkgb24gZGV2aWNlOiVzXG4iLCByZXNldF9zdGF0ZSwKKwkJICAgICAgcGNpX25hbWUoZGV2KSk7CiAJZWxzZSB7CiAJCV9fZ2V0X2NwdV92YXIoaWdub3JlZF9mYWlsdXJlcykrKzsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRUVIOiBJZ25vcmVkIE1NSU8gZmFpbHVyZSAoJWQpIG9uIGRldmljZTolcyAlc1xuIiwKLQkJICAgICAgIHJlc2V0X3N0YXRlLCBwY2lfbmFtZShkZXYpLCBwY2lfcHJldHR5X25hbWUoZGV2KSk7CisJCXByaW50ayhLRVJOX0lORk8gIkVFSDogSWdub3JlZCBNTUlPIGZhaWx1cmUgKCVkKSBvbiBkZXZpY2U6JXNcbiIsCisJCSAgICAgICByZXNldF9zdGF0ZSwgcGNpX25hbWUoZGV2KSk7CiAJfQogfQogCkBAIC00ODIsOCArNDg0LDggQEAKIAkJCWJyZWFrOwogCiAJCXByaW50ayhLRVJOX0lORk8gIkVFSDogTU1JTyBmYWlsdXJlICglZCksIG5vdGlmaXlpbmcgZGV2aWNlICIKLQkJICAgICAgICIlcyAlc1xuIiwgZXZlbnQtPnJlc2V0X3N0YXRlLAotCQkgICAgICAgcGNpX25hbWUoZXZlbnQtPmRldiksIHBjaV9wcmV0dHlfbmFtZShldmVudC0+ZGV2KSk7CisJCSAgICAgICAiJXNcbiIsIGV2ZW50LT5yZXNldF9zdGF0ZSwKKwkJICAgICAgIHBjaV9uYW1lKGV2ZW50LT5kZXYpKTsKIAogCQlhdG9taWNfc2V0KCZlZWhfZmFpbF9jb3VudCwgMCk7CiAJCW5vdGlmaWVyX2NhbGxfY2hhaW4gKCZlZWhfbm90aWZpZXJfY2hhaW4sCkBAIC01MzUsNiArNTM3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYywgcmVzZXRfc3RhdGU7CiAJc3RydWN0IGVlaF9ldmVudCAgKmV2ZW50OworCXN0cnVjdCBwY2lfZG4gKnBkbjsKIAogCV9fZ2V0X2NwdV92YXIodG90YWxfbW1pb19mZnMpKys7CiAKQEAgLTU0MywxNCArNTQ2LDE1IEBACiAKIAlpZiAoIWRuKQogCQlyZXR1cm4gMDsKKwlwZG4gPSBkbi0+ZGF0YTsKIAogCS8qIEFjY2VzcyB0byBJTyBCQVJzIG1pZ2h0IGdldCB0aGlzIGZhciBhbmQgc3RpbGwgbm90IHdhbnQgY2hlY2tpbmcuICovCi0JaWYgKCEoZG4tPmVlaF9tb2RlICYgRUVIX01PREVfU1VQUE9SVEVEKSB8fAotCSAgICBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9OT0NIRUNLKSB7CisJaWYgKCFwZG4tPmVlaF9jYXBhYmxlIHx8ICEocGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkgfHwKKwkgICAgcGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX05PQ0hFQ0spIHsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFkbi0+ZWVoX2NvbmZpZ19hZGRyKSB7CisJaWYgKCFwZG4tPmVlaF9jb25maWdfYWRkcikgewogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU1OCw3ICs1NjIsNyBAQAogCSAqIElmIHdlIGFscmVhZHkgaGF2ZSBhIHBlbmRpbmcgaXNvbGF0aW9uIGV2ZW50IGZvciB0aGlzCiAJICogc2xvdCwgd2Uga25vdyBpdCdzIGJhZCBhbHJlYWR5LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrLi4uCiAJICovCi0JaWYgKGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX0lTT0xBVEVEKSB7CisJaWYgKHBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9JU09MQVRFRCkgewogCQlhdG9taWNfaW5jKCZlZWhfZmFpbF9jb3VudCk7CiAJCWlmIChhdG9taWNfcmVhZCgmZWVoX2ZhaWxfY291bnQpID49IEVFSF9NQVhfRkFJTFMpIHsKIAkJCS8qIHJlLXJlYWQgdGhlIHNsb3QgcmVzZXQgc3RhdGUgKi8KQEAgLTU4Myw3ICs1ODcsNyBAQAogCX0KIAogCS8qIHByZXZlbnQgcmVwZWF0ZWQgcmVwb3J0cyBvZiB0aGlzIGZhaWx1cmUgKi8KLQlkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfSVNPTEFURUQ7CisJcGRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9JU09MQVRFRDsKIAogCXJlc2V0X3N0YXRlID0gcmV0c1swXTsKIApAQCAtNTkxLDkgKzU5NSw5IEBACiAJbWVtc2V0KHNsb3RfZXJyYnVmLCAwLCBlZWhfZXJyb3JfYnVmX3NpemUpOwogCiAJcmMgPSBydGFzX2NhbGwoaWJtX3Nsb3RfZXJyb3JfZGV0YWlsLAotCSAgICAgICAgICAgICAgIDgsIDEsIE5VTEwsIGRuLT5lZWhfY29uZmlnX2FkZHIsCi0JICAgICAgICAgICAgICAgQlVJRF9ISShkbi0+cGhiLT5idWlkKSwKLQkgICAgICAgICAgICAgICBCVUlEX0xPKGRuLT5waGItPmJ1aWQpLCBOVUxMLCAwLAorCSAgICAgICAgICAgICAgIDgsIDEsIE5VTEwsIHBkbi0+ZWVoX2NvbmZpZ19hZGRyLAorCSAgICAgICAgICAgICAgIEJVSURfSEkocGRuLT5waGItPmJ1aWQpLAorCSAgICAgICAgICAgICAgIEJVSURfTE8ocGRuLT5waGItPmJ1aWQpLCBOVUxMLCAwLAogCSAgICAgICAgICAgICAgIHZpcnRfdG9fcGh5cyhzbG90X2VycmJ1ZiksCiAJICAgICAgICAgICAgICAgZWVoX2Vycm9yX2J1Zl9zaXplLAogCSAgICAgICAgICAgICAgIDEgLyogVGVtcG9yYXJ5IEVycm9yICovKTsKQEAgLTY4MCw4ICs2ODQsOSBAQAogCXUzMiAqZGV2aWNlX2lkID0gKHUzMiAqKWdldF9wcm9wZXJ0eShkbiwgImRldmljZS1pZCIsIE5VTEwpOwogCXUzMiAqcmVnczsKIAlpbnQgZW5hYmxlOworCXN0cnVjdCBwY2lfZG4gKnBkbiA9IGRuLT5kYXRhOwogCi0JZG4tPmVlaF9tb2RlID0gMDsKKwlwZG4tPmVlaF9tb2RlID0gMDsKIAogCWlmIChzdGF0dXMgJiYgc3RyY21wKHN0YXR1cywgIm9rIikgIT0gMCkKIAkJcmV0dXJuIE5VTEw7CS8qIGlnbm9yZSBkZXZpY2VzIHdpdGggYmFkIHN0YXR1cyAqLwpAQCAtNjkyLDcgKzY5Nyw3IEBACiAKIAkvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrIG9uIFBDSSB0byBJU0EgYnJpZGdlcyAqLwogCWlmIChkbi0+dHlwZSAmJiAhc3RyY21wKGRuLT50eXBlLCAiaXNhIikpIHsKLQkJZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX05PQ0hFQ0s7CisJCXBkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfTk9DSEVDSzsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC03MDksNyArNzE0LDcgQEAKIAkJZW5hYmxlID0gMDsKIAogCWlmICghZW5hYmxlKQotCQlkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfTk9DSEVDSzsKKwkJcGRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9OT0NIRUNLOwogCiAJLyogT2suLi4gc2VlIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIEVFSC4gIFNvbWUgZG8sIHNvbWUgZG9uJ3QsCiAJICogYW5kIHRoZSBvbmx5IHdheSB0byBmaW5kIG91dCBpcyB0byBjaGVjayBlYWNoIGFuZCBldmVyeSBvbmUuICovCkBAIC03MjIsOCArNzI3LDggQEAKIAkJCQlFRUhfRU5BQkxFKTsKIAkJaWYgKHJldCA9PSAwKSB7CiAJCQllZWhfc3Vic3lzdGVtX2VuYWJsZWQgPSAxOwotCQkJZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX1NVUFBPUlRFRDsKLQkJCWRuLT5lZWhfY29uZmlnX2FkZHIgPSByZWdzWzBdOworCQkJcGRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9TVVBQT1JURUQ7CisJCQlwZG4tPmVlaF9jb25maWdfYWRkciA9IHJlZ3NbMF07CiAjaWZkZWYgREVCVUcKIAkJCXByaW50ayhLRVJOX0RFQlVHICJFRUg6ICVzOiBlZWggZW5hYmxlZFxuIiwgZG4tPmZ1bGxfbmFtZSk7CiAjZW5kaWYKQEAgLTczMSwxMCArNzM2LDExIEBACiAKIAkJCS8qIFRoaXMgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBFRUgsIGJ1dCBpdCBtYXkgaGF2ZSBhbgogCQkJICogRUVIIHBhcmVudCwgaW4gd2hpY2ggY2FzZSB3ZSBtYXJrIGl0IGFzIHN1cHBvcnRlZC4gKi8KLQkJCWlmIChkbi0+cGFyZW50ICYmIChkbi0+cGFyZW50LT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkpIHsKKwkJCWlmIChkbi0+cGFyZW50ICYmIGRuLT5wYXJlbnQtPmRhdGEKKwkJCSAgICAmJiAoUENJX0ROKGRuLT5wYXJlbnQpLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkpIHsKIAkJCQkvKiBQYXJlbnQgc3VwcG9ydHMgRUVILiAqLwotCQkJCWRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9TVVBQT1JURUQ7Ci0JCQkJZG4tPmVlaF9jb25maWdfYWRkciA9IGRuLT5wYXJlbnQtPmVlaF9jb25maWdfYWRkcjsKKwkJCQlwZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX1NVUFBPUlRFRDsKKwkJCQlwZG4tPmVlaF9jb25maWdfYWRkciA9IFBDSV9ETihkbi0+cGFyZW50KS0+ZWVoX2NvbmZpZ19hZGRyOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC03OTEsMTEgKzc5NywxMyBAQAogCWZvciAocGhiID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBjaSIpOyBwaGI7CiAJICAgICBwaGIgPSBvZl9maW5kX25vZGVfYnlfbmFtZShwaGIsICJwY2kiKSkgewogCQl1bnNpZ25lZCBsb25nIGJ1aWQ7CisJCXN0cnVjdCBwY2lfZG4gKnBjaTsKIAogCQlidWlkID0gZ2V0X3BoYl9idWlkKHBoYik7Ci0JCWlmIChidWlkID09IDApCisJCWlmIChidWlkID09IDAgfHwgcGhiLT5kYXRhID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQlwY2kgPSBwaGItPmRhdGE7CiAJCWluZm8uYnVpZF9sbyA9IEJVSURfTE8oYnVpZCk7CiAJCWluZm8uYnVpZF9oaSA9IEJVSURfSEkoYnVpZCk7CiAJCXRyYXZlcnNlX3BjaV9kZXZpY2VzKHBoYiwgZWFybHlfZW5hYmxlX2VlaCwgJmluZm8pOwpAQCAtODI0LDkgKzgzMiw5IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CiAJc3RydWN0IGVlaF9lYXJseV9lbmFibGVfaW5mbyBpbmZvOwogCi0JaWYgKCFkbikKKwlpZiAoIWRuIHx8ICFkbi0+ZGF0YSkKIAkJcmV0dXJuOwotCXBoYiA9IGRuLT5waGI7CisJcGhiID0gUENJX0ROKGRuKS0+cGhiOwogCWlmIChOVUxMID09IHBoYiB8fCAwID09IHBoYi0+YnVpZCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IEV4cGVjdGVkIGJ1aWQgYnV0IGZvdW5kIG5vbmVcbiIpOwogCQlyZXR1cm47CkBAIC04NTEsOCArODU5LDcgQEAKIAkJcmV0dXJuOwogCiAjaWZkZWYgREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiBhZGRpbmcgZGV2aWNlICVzICVzXG4iLCBwY2lfbmFtZShkZXYpLAotCSAgICAgICBwY2lfcHJldHR5X25hbWUoZGV2KSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVFSDogYWRkaW5nIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAjZW5kaWYKIAogCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UgKGRldik7CkBAIC04NzMsOCArODgwLDcgQEAKIAogCS8qIFVucmVnaXN0ZXIgdGhlIGRldmljZSB3aXRoIHRoZSBFRUgvUENJIGFkZHJlc3Mgc2VhcmNoIHN5c3RlbSAqLwogI2lmZGVmIERFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIkVFSDogcmVtb3ZlIGRldmljZSAlcyAlc1xuIiwgcGNpX25hbWUoZGV2KSwKLQkgICAgICAgcGNpX3ByZXR0eV9uYW1lKGRldikpOworCXByaW50ayhLRVJOX0RFQlVHICJFRUg6IHJlbW92ZSBkZXZpY2UgJXNcbiIsIHBjaV9uYW1lKGRldikpOwogI2VuZGlmCiAJcGNpX2FkZHJfY2FjaGVfcmVtb3ZlX2RldmljZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvcHBjNjQva2VybmVsL2VudHJ5LlMKaW5kZXggYmY5OWI0YS4uZDEzM2E0OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvaGVhZC5TCmluZGV4IGI0MzYyMDYuLjU4YzMxNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9oZWFkLlMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbWNmZy5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX1ZwZEluZm8uYyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfVnBkSW5mby5jCmluZGV4IGQxMWM3MzIuLjVkOTIxNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfVnBkSW5mby5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfVnBkSW5mby5jCkBAIC0yNjQsOCArMjY0LDUgQEAKIAlwcmludGsoIiVkLiBQQ0k6IEJ1cyUzZCwgRGV2aWNlJTNkLCBWZW5kb3IgJTA0WCBGcmFtZSUzZCwgQ2FyZCAlNHMgICIsCiAJCQljb3VudCwgYnVzLCBQQ0lfU0xPVChQY2lEZXYtPmRldmZuKSwgUGNpRGV2LT52ZW5kb3IsCiAJCQlmcmFtZSwgY2FyZCk7Ci0JaWYgKHBjaV9jbGFzc19uYW1lKFBjaURldi0+Y2xhc3MgPj4gOCkgPT0gMCkKLQkJcHJpbnRrKCIweCUwNFhcbiIsIChpbnQpKFBjaURldi0+Y2xhc3MgPj4gOCkpOwotCWVsc2UKLQkJcHJpbnRrKCIlc1xuIiwgcGNpX2NsYXNzX25hbWUoUGNpRGV2LT5jbGFzcyA+PiA4KSk7CisJcHJpbnRrKCIweCUwNFhcbiIsIChpbnQpKFBjaURldi0+Y2xhc3MgPj4gOCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZV9wb3dlcjQuUyBiL2FyY2gvcHBjNjQva2VybmVsL2lkbGVfcG93ZXI0LlMKaW5kZXggOTdlNGEyNi4uY2EwMmFmZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZV9wb3dlcjQuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlX3Bvd2VyNC5TCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjdW5kZWYgREVCVUcKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaW9tYXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL2lvbWFwLmMKaW5kZXggMTUzY2M4Yi4uNjE2MGM4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaW9tYXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9pb21hcC5jCkBAIC0yMiwxMyArMjIsMjMgQEAKIHsKIAlyZXR1cm4gcmVhZHcoYWRkcik7CiB9Cit1bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkMTZiZSh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIGluX2JlMTYoYWRkcik7Cit9CiB1bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkMzIodm9pZCBfX2lvbWVtICphZGRyKQogewogCXJldHVybiByZWFkbChhZGRyKTsKIH0KK3Vuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQzMmJlKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gaW5fYmUzMihhZGRyKTsKK30KIEVYUE9SVF9TWU1CT0woaW9yZWFkOCk7CiBFWFBPUlRfU1lNQk9MKGlvcmVhZDE2KTsKK0VYUE9SVF9TWU1CT0woaW9yZWFkMTZiZSk7CiBFWFBPUlRfU1lNQk9MKGlvcmVhZDMyKTsKK0VYUE9SVF9TWU1CT0woaW9yZWFkMzJiZSk7CiAKIHZvaWQgZmFzdGNhbGwgaW93cml0ZTgodTggdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CkBAIC0zOCwxMyArNDgsMjMgQEAKIHsKIAl3cml0ZXcodmFsLCBhZGRyKTsKIH0KK3ZvaWQgZmFzdGNhbGwgaW93cml0ZTE2YmUodTE2IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCW91dF9iZTE2KGFkZHIsIHZhbCk7Cit9CiB2b2lkIGZhc3RjYWxsIGlvd3JpdGUzMih1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJd3JpdGVsKHZhbCwgYWRkcik7CiB9Cit2b2lkIGZhc3RjYWxsIGlvd3JpdGUzMmJlKHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlvdXRfYmUzMihhZGRyLCB2YWwpOworfQogRVhQT1JUX1NZTUJPTChpb3dyaXRlOCk7CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGUxNik7CitFWFBPUlRfU1lNQk9MKGlvd3JpdGUxNmJlKTsKIEVYUE9SVF9TWU1CT0woaW93cml0ZTMyKTsKK0VYUE9SVF9TWU1CT0woaW93cml0ZTMyYmUpOwogCiAvKgogICogVGhlc2UgYXJlIHRoZSAicmVwZWF0IHJlYWQvd3JpdGUiIGZ1bmN0aW9ucy4gTm90ZSB0aGUKQEAgLTU2LDE1ICs3NiwxNSBAQAogICovCiB2b2lkIGlvcmVhZDhfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCV9pbnNiKCh1OCBfX2ZvcmNlICopIGFkZHIsIGRzdCwgY291bnQpOworCV9pbnNiKCh1OCBfX2lvbWVtICopIGFkZHIsIGRzdCwgY291bnQpOwogfQogdm9pZCBpb3JlYWQxNl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JX2luc3dfbnMoKHUxNiBfX2ZvcmNlICopIGFkZHIsIGRzdCwgY291bnQpOworCV9pbnN3X25zKCh1MTYgX19pb21lbSAqKSBhZGRyLCBkc3QsIGNvdW50KTsKIH0KIHZvaWQgaW9yZWFkMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCV9pbnNsX25zKCh1MzIgX19mb3JjZSAqKSBhZGRyLCBkc3QsIGNvdW50KTsKKwlfaW5zbF9ucygodTMyIF9faW9tZW0gKikgYWRkciwgZHN0LCBjb3VudCk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvcmVhZDhfcmVwKTsKIEVYUE9SVF9TWU1CT0woaW9yZWFkMTZfcmVwKTsKQEAgLTcyLDE1ICs5MiwxNSBAQAogCiB2b2lkIGlvd3JpdGU4X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlfb3V0c2IoKHU4IF9fZm9yY2UgKikgYWRkciwgc3JjLCBjb3VudCk7CisJX291dHNiKCh1OCBfX2lvbWVtICopIGFkZHIsIHNyYywgY291bnQpOwogfQogdm9pZCBpb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCV9vdXRzd19ucygodTE2IF9fZm9yY2UgKikgYWRkciwgc3JjLCBjb3VudCk7CisJX291dHN3X25zKCh1MTYgX19pb21lbSAqKSBhZGRyLCBzcmMsIGNvdW50KTsKIH0KIHZvaWQgaW93cml0ZTMyX3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlfb3V0c2xfbnMoKHUzMiBfX2ZvcmNlICopIGFkZHIsIHNyYywgY291bnQpOworCV9vdXRzbF9ucygodTMyIF9faW9tZW0gKikgYWRkciwgc3JjLCBjb3VudCk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGU4X3JlcCk7CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGUxNl9yZXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaW9tbXUuYyBiL2FyY2gvcHBjNjQva2VybmVsL2lvbW11LmMKaW5kZXggODQ1ZWViZC4uOTAzMmI2YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9pb21tdS5jCkBAIC00MzgsNyArNDM4LDggQEAKIAogdm9pZCBpb21tdV9mcmVlX3RhYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7Ci0Jc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkbi0+aW9tbXVfdGFibGU7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CisJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBwZG4tPmlvbW11X3RhYmxlOwogCXVuc2lnbmVkIGxvbmcgYml0bWFwX3N6LCBpOwogCXVuc2lnbmVkIGludCBvcmRlcjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGEzZDUxOTUuLjdlODBkNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGtwcm9iZV9zdGF0dXNfcHJldiwga3Byb2JlX3NhdmVkX21zcl9wcmV2Owogc3RhdGljIHN0cnVjdCBwdF9yZWdzIGpwcm9iZV9zYXZlZF9yZWdzOwogCi1pbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoraW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldCA9IDA7CiAJa3Byb2JlX29wY29kZV90IGluc24gPSAqcC0+YWRkcjsKQEAgLTY4LDI3ICs2OCwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYXJjaF9jb3B5X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9jb3B5X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogCXAtPm9wY29kZSA9ICpwLT5hZGRyOwogfQogCi12b2lkIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJKnAtPmFkZHIgPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OOwogCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgcC0+YWRkciwKIAkJCSAgICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyICsgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogfQogCi12b2lkIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJKnAtPmFkZHIgPSBwLT5vcGNvZGU7CiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyLAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKLXZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1cCgma3Byb2JlX211dGV4KTsKIAlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuKTsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXJlZ3MtPm1zciB8PSBNU1JfU0U7CiAKIAkvKiBzaW5nbGUgc3RlcCBpbmxpbmUgaWYgaXQgaXMgYSB0cmFwIHZhcmlhbnQgKi8KLQlpZiAoSVNfVFcoaW5zbikgfHwgSVNfVEQoaW5zbikgfHwgSVNfVFdJKGluc24pIHx8IElTX1RESShpbnNuKSkKKwlpZiAoaXNfdHJhcChpbnNuKSkKIAkJcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKIAllbHNlCiAJCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc247CkBAIC0xMjIsNyArMTIyLDggQEAKIAlrcHJvYmVfc2F2ZWRfbXNyID0ga3Byb2JlX3NhdmVkX21zcl9wcmV2OwogfQogCi12b2lkIGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKIApAQCAtMTUxLDcgKzE1Miw5IEBACiAJCSAgIERpc2FybSB0aGUgcHJvYmUgd2UganVzdCBoaXQsIGFuZCBpZ25vcmUgaXQuICovCiAJCXAgPSBnZXRfa3Byb2JlKGFkZHIpOwogCQlpZiAocCkgewotCQkJaWYgKGtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUykgeworCQkJa3Byb2JlX29wY29kZV90IGluc24gPSAqcC0+YWluc24uaW5zbjsKKwkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MgJiYKKwkJCQkJaXNfdHJhcChpbnNuKSkgewogCQkJCXJlZ3MtPm1zciAmPSB+TVNSX1NFOwogCQkJCXJlZ3MtPm1zciB8PSBrcHJvYmVfc2F2ZWRfbXNyOwogCQkJCXVubG9ja19rcHJvYmVzKCk7CkBAIC0xOTEsOCArMTk0LDcgQEAKIAkJCSAqIHRyYXAgdmFyaWFudCwgaXQgY291bGQgYmVsb25nIHRvIHNvbWVvbmUgZWxzZQogCQkJICovCiAJCQlrcHJvYmVfb3Bjb2RlX3QgY3VyX2luc24gPSAqYWRkcjsKLQkJCWlmIChJU19UVyhjdXJfaW5zbikgfHwgSVNfVEQoY3VyX2luc24pIHx8Ci0JCQkJCUlTX1RXSShjdXJfaW5zbikgfHwgSVNfVERJKGN1cl9pbnNuKSkKKwkJCWlmIChpc190cmFwKGN1cl9pbnNuKSkKIAkJICAgICAgIAkJZ290byBub19rcHJvYmU7CiAJCQkvKgogCQkJICogVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gd2FzIHJlbW92ZWQgcmlnaHQKQEAgLTI0NCw3ICsyNDYsNyBAQAogLyoKICAqIENhbGxlZCB3aGVuIHRoZSBwcm9iZSBhdCBrcmV0cHJvYmUgdHJhbXBvbGluZSBpcyBoaXQKICAqLwotaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogICAgICAgICBzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSA9IE5VTEw7CiAgICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtMzA4LDcgKzMxMCw3IEBACiAgKiBzaW5nbGUtc3RlcHBlZCBhIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcwogICogY29weSBpcyBwLT5haW5zbi5pbnNuLgogICovCi1zdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgaW5zbiA9ICpwLT5haW5zbi5pbnNuOwpAQCAtMzczLDggKzM3NSw4IEBACiAvKgogICogV3JhcHBlciByb3V0aW5lIHRvIGZvciBoYW5kbGluZyBleGNlcHRpb25zLgogICovCi1pbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCQkgICAgIHZvaWQgKmRhdGEpCitpbnQgX19rcHJvYmVzIGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOwogCWludCByZXQgPSBOT1RJRllfRE9ORTsKQEAgLTQwMiwxMSArNDA0LDExIEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCXByZWVtcHRfZW5hYmxlKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgX19rcHJvYmVzIHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CiAKQEAgLTQxOSwxNiArNDIxLDE2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQganByb2JlX3JldHVybih2b2lkKQordm9pZCBfX2twcm9iZXMganByb2JlX3JldHVybih2b2lkKQogewogCWFzbSB2b2xhdGlsZSgidHJhcCIgOjo6ICJtZW1vcnkiKTsKIH0KIAotdm9pZCBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKQordm9pZCBfX2twcm9iZXMganByb2JlX3JldHVybl9lbmQodm9pZCkKIHsKIH07CiAKLWludCBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgX19rcHJvYmVzIGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKgogCSAqIEZJWE1FIC0gd2Ugc2hvdWxkIGlkZWFsbHkgYmUgdmFsaWRhdGluZyB0aGF0IHdlIGdvdCBoZXJlICdjb3MKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3BjaS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfcGNpLmMKaW5kZXggNTM5OTM5OS4uNWE4YjRkOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfcGNpLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfcGNpLmMKQEAgLTQ0Nyw5ICs0NDcsOSBAQAogCSAqLwogCWlmICh1M19hZ3ApIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHUzX2FncC0+YXJjaF9kYXRhOwotCQlucC0+YnVzbm8gPSAweGYwOworCQlQQ0lfRE4obnApLT5idXNubyA9IDB4ZjA7CiAJCWZvciAobnAgPSBucC0+Y2hpbGQ7IG5wOyBucCA9IG5wLT5zaWJsaW5nKQotCQkJbnAtPmJ1c25vID0gMHhmMDsKKwkJCVBDSV9ETihucCktPmJ1c25vID0gMHhmMDsKIAl9CiAKIAkvKiBUZWxsIHBjaS5jIHRvIHVzZSB0aGUgY29tbW9uIHJlc291cmNlIGFsbG9jYXRpb24gbWVjYW5pc20gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL21pc2MuUyBiL2FyY2gvcHBjNjQva2VybmVsL21pc2MuUwppbmRleCA0NzRkZjBhLi5lNzI0MWFkIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWlzYy5TCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAKIAkudGV4dApAQCAtMTgzLDcgKzE4Myw3IEBACiAgKiAgIGZsdXNoIGFsbCBieXRlcyBmcm9tIHN0YXJ0IHRocm91Z2ggc3RvcC0xIGluY2x1c2l2ZQogICovCiAKLV9HTE9CQUwoX19mbHVzaF9pY2FjaGVfcmFuZ2UpCitfS1BST0JFKF9fZmx1c2hfaWNhY2hlX3JhbmdlKQogCiAvKgogICogRmx1c2ggdGhlIGRhdGEgY2FjaGUgdG8gbWVtb3J5IApAQCAtMjIzLDcgKzIyMyw3IEBACiAJYmRuegkyYgogCWlzeW5jCiAJYmxyCi0JCisJLnByZXZpb3VzIC50ZXh0CiAvKgogICogTGlrZSBhYm92ZSwgYnV0IG9ubHkgZG8gdGhlIEQtY2FjaGUuCiAgKgpAQCAtOTU3LDcgKzk1Nyw3IEBACiAJLmxsb25nIC5wcGNfZm9yawogCS5sbG9uZyAuc3lzX3JlYWQKIAkubGxvbmcgLnN5c193cml0ZQotCS5sbG9uZyAuc3lzMzJfb3BlbgkJLyogNSAqLworCS5sbG9uZyAuY29tcGF0X3N5c19vcGVuCQkvKiA1ICovCiAJLmxsb25nIC5zeXNfY2xvc2UKIAkubGxvbmcgLnN5czMyX3dhaXRwaWQKIAkubGxvbmcgLnN5czMyX2NyZWF0CkBAIC0xNDMxLDkgKzE0MzEsOSBAQAogCS5sbG9uZyAuc3lzX25pX3N5c2NhbGwJCS8qIDE5NSAtIDMyYml0IG9ubHkgc3RhdDY0ICovCiAJLmxsb25nIC5zeXNfbmlfc3lzY2FsbAkJLyogMzJiaXQgb25seSBsc3RhdDY0ICovCiAJLmxsb25nIC5zeXNfbmlfc3lzY2FsbAkJLyogMzJiaXQgb25seSBmc3RhdDY0ICovCi0JLmxsb25nIC5zeXNfbmlfc3lzY2FsbAkJLyogMzJiaXQgb25seSBwY2ljb25maWdfcmVhZCAqLwotCS5sbG9uZyAuc3lzX25pX3N5c2NhbGwJCS8qIDMyYml0IG9ubHkgcGNpY29uZmlnX3dyaXRlICovCi0JLmxsb25nIC5zeXNfbmlfc3lzY2FsbAkJLyogMzJiaXQgb25seSBwY2ljb25maWdfaW9iYXNlICovCisJLmxsb25nIC5zeXNfcGNpY29uZmlnX3JlYWQKKwkubGxvbmcgLnN5c19wY2ljb25maWdfd3JpdGUKKwkubGxvbmcgLnN5c19wY2ljb25maWdfaW9iYXNlCS8qIDIwMCAtIHBjaWNvbmZpZ19pb2Jhc2UgKi8KIAkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiByZXNlcnZlZCBmb3IgTWFjT25MaW51eCAqLwogCS5sbG9uZyAuc3lzX2dldGRlbnRzNjQKIAkubGxvbmcgLnN5c19waXZvdF9yb290CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX2lvbW11LmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX2lvbW11LmMKaW5kZXggOWQ1ZTFlNy4uZjBmZDdmYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19pb21tdS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfaW9tbXUuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJCQkJICAgICAgc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCiAJCQkJICAgICAgdW5zaWduZWQgaW50ICpkbWFfd2luZG93KQogewotCXRibC0+aXRfYnVzbm8gID0gZG4tPmJ1c3N1Ym5vOworCXRibC0+aXRfYnVzbm8gID0gUENJX0ROKGRuKS0+YnVzc3Vibm87CiAKIAkvKiBUT0RPOiBQYXJzZSBmaWVsZCBzaXplIHByb3BlcnRpZXMgcHJvcGVybHkuICovCiAJdGJsLT5pdF9zaXplICAgPSAoKCh1bnNpZ25lZCBsb25nKWRtYV93aW5kb3dbNF0gPDwgMzIpIHwKQEAgLTMxMSw2ICszMTEsNyBAQAogc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX3BTZXJpZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCAqcGRuOworCXN0cnVjdCBwY2lfZG4gKnBjaTsKIAlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKIAogCURCRygiaW9tbXVfYnVzX3NldHVwX3BTZXJpZXMsIGJ1cyAlcCwgYnVzLT5zZWxmICVwXG4iLCBidXMsIGJ1cy0+c2VsZik7CkBAIC0zMjUsNiArMzI2LDcgQEAKIAkgKi8KIAogCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisJcGNpID0gZG4tPmRhdGE7CiAKIAlpZiAoIWJ1cy0+c2VsZikgewogCQkvKiBSb290IGJ1cyAqLwpAQCAtMzQxLDE4ICszNDMsMTggQEAKIAkJCQkgKiBhbGx0b2dldGhlci4gVGhpcyBsZWF2ZXMgNzY4TUIgZm9yIHRoZSB3aW5kb3cuCiAJCQkJICovCiAJCQkJREJHKCJQSEIgaGFzIGlvLWhvbGUsIHJlc2VydmluZyAyNTZNQlxuIik7Ci0JCQkJZG4tPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMyA8PCAyODsKLQkJCQlkbi0+cGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID0gMSA8PCAyODsKKwkJCQlwY2ktPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMyA8PCAyODsKKwkJCQlwY2ktPnBoYi0+ZG1hX3dpbmRvd19iYXNlX2N1ciA9IDEgPDwgMjg7CiAJCQl9IGVsc2UgewogCQkJCS8qIDFHQiB3aW5kb3cgYnkgZGVmYXVsdCAqLwotCQkJCWRuLT5waGItPmRtYV93aW5kb3dfc2l6ZSA9IDEgPDwgMzA7Ci0JCQkJZG4tPnBoYi0+ZG1hX3dpbmRvd19iYXNlX2N1ciA9IDA7CisJCQkJcGNpLT5waGItPmRtYV93aW5kb3dfc2l6ZSA9IDEgPDwgMzA7CisJCQkJcGNpLT5waGItPmRtYV93aW5kb3dfYmFzZV9jdXIgPSAwOwogCQkJfQogCiAJCQl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMKTsKIAotCQkJaW9tbXVfdGFibGVfc2V0cGFybXMoZG4tPnBoYiwgZG4sIHRibCk7Ci0JCQlkbi0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CisJCQlpb21tdV90YWJsZV9zZXRwYXJtcyhwY2ktPnBoYiwgZG4sIHRibCk7CisJCQlwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwpOwogCQl9IGVsc2UgewogCQkJLyogRG8gYSAxMjhNQiB0YWJsZSBhdCByb290LiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBJREUKIAkJCSAqIGNvbnRyb2xsZXIgb24gc29tZSBTTVAtbW9kZSBQT1dFUjQgbWFjaGluZXMuIEl0CkBAIC0zNjMsMTYgKzM2NSwxNiBAQAogCQkJICogQWxsb2NhdGUgYXQgb2Zmc2V0IDEyOE1CIHRvIGF2b2lkIGhhdmluZyB0byBkZWFsCiAJCQkgKiB3aXRoIElTQSBob2xlczsgMTI4TUIgdGFibGUgZm9yIElERSBpcyBwbGVudHkuCiAJCQkgKi8KLQkJCWRuLT5waGItPmRtYV93aW5kb3dfc2l6ZSA9IDEgPDwgMjc7Ci0JCQlkbi0+cGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID0gMSA8PCAyNzsKKwkJCXBjaS0+cGhiLT5kbWFfd2luZG93X3NpemUgPSAxIDw8IDI3OworCQkJcGNpLT5waGItPmRtYV93aW5kb3dfYmFzZV9jdXIgPSAxIDw8IDI3OwogCiAJCQl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMKTsKIAotCQkJaW9tbXVfdGFibGVfc2V0cGFybXMoZG4tPnBoYiwgZG4sIHRibCk7Ci0JCQlkbi0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CisJCQlpb21tdV90YWJsZV9zZXRwYXJtcyhwY2ktPnBoYiwgZG4sIHRibCk7CisJCQlwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwpOwogCiAJCQkvKiBBbGwgY2hpbGQgYnVzZXMgaGF2ZSAyNTZNQiB0YWJsZXMgKi8KLQkJCWRuLT5waGItPmRtYV93aW5kb3dfc2l6ZSA9IDEgPDwgMjg7CisJCQlwY2ktPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMSA8PCAyODsKIAkJfQogCX0gZWxzZSB7CiAJCXBkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMtPnBhcmVudCk7CkBAIC0zODYsMTIgKzM4OCwxMiBAQAogCiAJCQl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMKTsKIAotCQkJaW9tbXVfdGFibGVfc2V0cGFybXMoZG4tPnBoYiwgZG4sIHRibCk7CisJCQlpb21tdV90YWJsZV9zZXRwYXJtcyhwY2ktPnBoYiwgZG4sIHRibCk7CiAKLQkJCWRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwkJCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBMb3dlciB0aGFuIGZpcnN0IGNoaWxkIG9yIHVuZGVyIHB5dGhvbiwgdXNlIHBhcmVudCB0YWJsZSAqLwotCQkJZG4tPmlvbW11X3RhYmxlID0gcGRuLT5pb21tdV90YWJsZTsKKwkJCXBjaS0+aW9tbXVfdGFibGUgPSBQQ0lfRE4ocGRuKS0+aW9tbXVfdGFibGU7CiAJCX0KIAl9CiB9CkBAIC00MDEsNiArNDAzLDcgQEAKIHsKIAlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCAqcGRuOworCXN0cnVjdCBwY2lfZG4gKnBwY2k7CiAJdW5zaWduZWQgaW50ICpkbWFfd2luZG93ID0gTlVMTDsKIAogCURCRygiaW9tbXVfYnVzX3NldHVwX3BTZXJpZXNMUCwgYnVzICVwLCBidXMtPnNlbGYgJXBcbiIsIGJ1cywgYnVzLT5zZWxmKTsKQEAgLTQxOSwyMiArNDIyLDI0IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXBkbi0+aW9tbXVfdGFibGUpIHsKKwlwcGNpID0gcGRuLT5kYXRhOworCWlmICghcHBjaS0+aW9tbXVfdGFibGUpIHsKIAkJLyogQnVzc3Vibm8gaGFzbid0IGJlZW4gY29waWVkIHlldC4KIAkJICogRG8gaXQgbm93IGJlY2F1c2UgaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhciBuZWVkcyBpdC4KIAkJICovCi0JCXBkbi0+YnVzc3Vibm8gPSBidXMtPm51bWJlcjsKKworCQlwcGNpLT5idXNzdWJubyA9IGJ1cy0+bnVtYmVyOwogCiAJCXRibCA9IChzdHJ1Y3QgaW9tbXVfdGFibGUgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLAogCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQotCQlpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHBkbi0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CisJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CiAKLQkJcGRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwkJcHBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CiAJfQogCiAJaWYgKHBkbiAhPSBkbikKLQkJZG4tPmlvbW11X3RhYmxlID0gcGRuLT5pb21tdV90YWJsZTsKKwkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSBwcGNpLT5pb21tdV90YWJsZTsKIH0KIAogCkBAIC00NDksMTEgKzQ1NCwxMSBAQAogCSAqLwogCW15ZG4gPSBkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwogCi0Jd2hpbGUgKGRuICYmIGRuLT5pb21tdV90YWJsZSA9PSBOVUxMKQorCXdoaWxlIChkbiAmJiBkbi0+ZGF0YSAmJiBQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9PSBOVUxMKQogCQlkbiA9IGRuLT5wYXJlbnQ7CiAKLQlpZiAoZG4pIHsKLQkJbXlkbi0+aW9tbXVfdGFibGUgPSBkbi0+aW9tbXVfdGFibGU7CisJaWYgKGRuICYmIGRuLT5kYXRhKSB7CisJCVBDSV9ETihteWRuKS0+aW9tbXVfdGFibGUgPSBQQ0lfRE4oZG4pLT5pb21tdV90YWJsZTsKIAl9IGVsc2UgewogCQlEQkcoImlvbW11X2Rldl9zZXR1cF9wU2VyaWVzLCBkZXYgJXAgKCVzKSBoYXMgbm8gaW9tbXUgdGFibGVcbiIsIGRldiwgZGV2LT5wcmV0dHlfbmFtZSk7CiAJfQpAQCAtNDYzLDEwICs0NjgsMTEgQEAKIHsKIAlpbnQgZXJyID0gTk9USUZZX09LOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBub2RlOworCXN0cnVjdCBwY2lfZG4gKnBjaSA9IG5wLT5kYXRhOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIFBTRVJJRVNfUkVDT05GSUdfUkVNT1ZFOgotCQlpZiAobnAtPmlvbW11X3RhYmxlICYmCisJCWlmIChwY2ktPmlvbW11X3RhYmxlICYmCiAJCSAgICBnZXRfcHJvcGVydHkobnAsICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpKQogCQkJaW9tbXVfZnJlZV90YWJsZShucCk7CiAJCWJyZWFrOwpAQCAtNDg2LDYgKzQ5Miw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwZG4sICpkbjsKIAlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKIAlpbnQgKmRtYV93aW5kb3cgPSBOVUxMOworCXN0cnVjdCBwY2lfZG4gKnBjaTsKIAogCURCRygiaW9tbXVfZGV2X3NldHVwX3BTZXJpZXNMUCwgZGV2ICVwICglcylcbiIsIGRldiwgZGV2LT5wcmV0dHlfbmFtZSk7CiAKQEAgLTQ5Nyw4ICs1MDQsMTAgQEAKIAkgKi8KIAlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwogCi0JZm9yIChwZG4gPSBkbjsgcGRuICYmICFwZG4tPmlvbW11X3RhYmxlOyBwZG4gPSBwZG4tPnBhcmVudCkgewotCQlkbWFfd2luZG93ID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShwZG4sICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpOworCWZvciAocGRuID0gZG47IHBkbiAmJiBwZG4tPmRhdGEgJiYgIVBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKKwkgICAgIHBkbiA9IHBkbi0+cGFyZW50KSB7CisJCWRtYV93aW5kb3cgPSAodW5zaWduZWQgaW50ICopCisJCQlnZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKIAkJaWYgKGRtYV93aW5kb3cpCiAJCQlicmVhazsKIAl9CkBAIC01MTUsMjAgKzUyNCwyMSBAQAogCQlEQkcoIkZvdW5kIERNQSB3aW5kb3csIGFsbG9jYXRpbmcgdGFibGVcbiIpOwogCX0KIAotCWlmICghcGRuLT5pb21tdV90YWJsZSkgeworCXBjaSA9IHBkbi0+ZGF0YTsKKwlpZiAoIXBjaS0+aW9tbXVfdGFibGUpIHsKIAkJLyogaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhciBuZWVkcyBidXNzdWJuby4gKi8KLQkJcGRuLT5idXNzdWJubyA9IHBkbi0+cGhiLT5idXMtPm51bWJlcjsKKwkJcGNpLT5idXNzdWJubyA9IHBjaS0+cGhiLT5idXMtPm51bWJlcjsKIAogCQl0YmwgPSAoc3RydWN0IGlvbW11X3RhYmxlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11X3RhYmxlKSwKIAkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAotCQlpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHBkbi0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CisJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocGNpLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKIAotCQlwZG4tPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwpOworCQlwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwpOwogCX0KIAogCWlmIChwZG4gIT0gZG4pCi0JCWRuLT5pb21tdV90YWJsZSA9IHBkbi0+aW9tbXVfdGFibGU7CisJCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gcGNpLT5pb21tdV90YWJsZTsKIH0KIAogc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX251bGwoc3RydWN0IHBjaV9idXMgKmIpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19yZWNvbmZpZy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19yZWNvbmZpZy5jCmluZGV4IGRjMmE2OWQuLjU4YzYxMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfcmVjb25maWcuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3JlY29uZmlnLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKLQlucCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpucCksIEdGUF9LRVJORUwpOworCW5wID0ga3phbGxvYyhzaXplb2YoKm5wKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFucCkKIAkJZ290byBvdXRfZXJyOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wY2kuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jCmluZGV4IGQwZDU1YzcuLjg0NDdkY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC04NCw3ICs4NSw2IEBACiAJaWYgKChkZXYtPmNsYXNzPj44ID09IFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUKSkgewogCQlkZXYtPnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQU1EOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfVkVORE9SX0lELCBQQ0lfVkVORE9SX0lEX0FNRCk7Ci0JCXBjaV9uYW1lX2RldmljZShkZXYpOwogCX0KIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9BTllfSUQsIGZpeHVwX2Jyb2tlbl9wY25ldDMyKTsKQEAgLTgzOCw5ICs4MzgsMTEgQEAKICAgICAgICAgKiBkZXZpY2UgdHJlZS4gIElmIHRoZXkgYXJlIHRoZW4gd2UgbmVlZCB0byBzY2FuIGFsbCB0aGUKICAgICAgICAgKiBmdW5jdGlvbnMgb2YgdGhpcyBzbG90LgogICAgICAgICAqLwotICAgICAgIGZvciAoZG4gPSBidXNkbi0+Y2hpbGQ7IGRuOyBkbiA9IGRuLT5zaWJsaW5nKQotICAgICAgICAgICAgICAgaWYgKChkbi0+ZGV2Zm4gPj4gMykgPT0gKGRldmZuID4+IDMpKQorICAgICAgIGZvciAoZG4gPSBidXNkbi0+Y2hpbGQ7IGRuOyBkbiA9IGRuLT5zaWJsaW5nKSB7CisJICAgICAgIHN0cnVjdCBwY2lfZG4gKnBkbiA9IGRuLT5kYXRhOworCSAgICAgICBpZiAocGRuICYmIChwZG4tPmRldmZuID4+IDMpID09IChkZXZmbiA+PiAzKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgfQogCiAgICAgICAgcmV0dXJuIDA7CiB9CkBAIC05ODMsMyArOTg1LDYyIEBACiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KKworCisjZGVmaW5lIElPQkFTRV9CUklER0VfTlVNQkVSCTAKKyNkZWZpbmUgSU9CQVNFX01FTU9SWQkJMQorI2RlZmluZSBJT0JBU0VfSU8JCTIKKyNkZWZpbmUgSU9CQVNFX0lTQV9JTwkJMworI2RlZmluZSBJT0JBU0VfSVNBX01FTQkJNAorCitsb25nIHN5c19wY2ljb25maWdfaW9iYXNlKGxvbmcgd2hpY2gsIHVuc2lnbmVkIGxvbmcgaW5fYnVzLAorCQkJICB1bnNpZ25lZCBsb25nIGluX2RldmZuKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhvc2Vfbm9kZTsKKworCS8qIEFyZ2ggISBQbGVhc2UgZm9yZ2l2ZSBtZSBmb3IgdGhhdCBoYWNrLCBidXQgdGhhdCdzIHRoZQorCSAqIHNpbXBsZXN0IHdheSB0byBnZXQgZXhpc3RpbmcgWEZyZWUgdG8gbm90IGxvY2t1cCBvbiBzb21lCisJICogRzUgbWFjaGluZXMuLi4gU28gd2hlbiBzb21ldGhpbmcgYXNrcyBmb3IgYnVzIDAgaW8gYmFzZQorCSAqIChidXMgMCBpcyBIVCByb290KSwgd2UgcmV0dXJuIHRoZSBBR1Agb25lIGluc3RlYWQuCisJICovCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKHN5c3RlbWNmZy0+cGxhdGZvcm0gPT0gUExBVEZPUk1fUE9XRVJNQUMgJiYKKwkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDNCIpKQorCQlpZiAoaW5fYnVzID09IDApCisJCQlpbl9idXMgPSAweGYwOworI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLworCisJLyogVGhhdCBzeXNjYWxsIGlzbid0IHF1aXRlIGNvbXBhdGlibGUgd2l0aCBQQ0kgZG9tYWlucywgYnV0IGl0J3MKKwkgKiB1c2VkIG9uIHByZS1kb21haW5zIHNldHVwLiBXZSByZXR1cm4gdGhlIGZpcnN0IG1hdGNoCisJICovCisKKwlmb3IgKGxuID0gcGNpX3Jvb3RfYnVzZXMubmV4dDsgbG4gIT0gJnBjaV9yb290X2J1c2VzOyBsbiA9IGxuLT5uZXh0KSB7CisJCWJ1cyA9IHBjaV9idXNfYihsbik7CisJCWlmIChpbl9idXMgPj0gYnVzLT5udW1iZXIgJiYgaW5fYnVzIDwgKGJ1cy0+bnVtYmVyICsgYnVzLT5zdWJvcmRpbmF0ZSkpCisJCQlicmVhazsKKwkJYnVzID0gTlVMTDsKKwl9CisJaWYgKGJ1cyA9PSBOVUxMIHx8IGJ1cy0+c3lzZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWhvc2Vfbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilidXMtPnN5c2RhdGE7CisJaG9zZSA9IFBDSV9ETihob3NlX25vZGUpLT5waGI7CisKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBJT0JBU0VfQlJJREdFX05VTUJFUjoKKwkJcmV0dXJuIChsb25nKWhvc2UtPmZpcnN0X2J1c25vOworCWNhc2UgSU9CQVNFX01FTU9SWToKKwkJcmV0dXJuIChsb25nKWhvc2UtPnBjaV9tZW1fb2Zmc2V0OworCWNhc2UgSU9CQVNFX0lPOgorCQlyZXR1cm4gKGxvbmcpaG9zZS0+aW9fYmFzZV9waHlzOworCWNhc2UgSU9CQVNFX0lTQV9JTzoKKwkJcmV0dXJuIChsb25nKWlzYV9pb19iYXNlOworCWNhc2UgSU9CQVNFX0lTQV9NRU06CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BjaS5oIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmgKaW5kZXggMjZiZTc4Yi4uNWViMmNjMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmgKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGNpLmgKQEAgLTM0LDcgKzM0LDYgQEAKIAogdm9pZCBwY2lfZGV2c19waGJfaW5pdCh2b2lkKTsKIHZvaWQgcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKmZldGNoX2Rldl9kbihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogLyogUENJIGFkZHJlc3MgY2FjaGUgbWFuYWdlbWVudCByb3V0aW5lcyAqLwogdm9pZCBwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcGNpX2RuLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wY2lfZG4uYwppbmRleCBlYzM0NTQ2Li5hODYzODlkIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wY2lfZG4uYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wY2lfZG4uYwpAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTQwLDE2ICs0MiwyNiBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiID0gZGF0YTsKIAlpbnQgKnR5cGUgPSAoaW50ICopZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLHBjaS1jb25maWctc3BhY2UtdHlwZSIsIE5VTEwpOwogCXUzMiAqcmVnczsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CiAKLQlkbi0+cGhiID0gcGhiOworCWlmIChwaGItPmlzX2R5bmFtaWMpCisJCXBkbiA9IGttYWxsb2Moc2l6ZW9mKCpwZG4pLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCXBkbiA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKCpwZG4pKTsKKwlpZiAocGRuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbXNldChwZG4sIDAsIHNpemVvZigqcGRuKSk7CisJZG4tPmRhdGEgPSBwZG47CisJcGRuLT5ub2RlID0gZG47CisJcGRuLT5waGIgPSBwaGI7CiAJcmVncyA9ICh1MzIgKilnZXRfcHJvcGVydHkoZG4sICJyZWciLCBOVUxMKTsKIAlpZiAocmVncykgewogCQkvKiBGaXJzdCByZWdpc3RlciBlbnRyeSBpcyBhZGRyICgwMEJCU1MwMCkgICovCi0JCWRuLT5idXNubyA9IChyZWdzWzBdID4+IDE2KSAmIDB4ZmY7Ci0JCWRuLT5kZXZmbiA9IChyZWdzWzBdID4+IDgpICYgMHhmZjsKKwkJcGRuLT5idXNubyA9IChyZWdzWzBdID4+IDE2KSAmIDB4ZmY7CisJCXBkbi0+ZGV2Zm4gPSAocmVnc1swXSA+PiA4KSAmIDB4ZmY7CiAJfQogCi0JZG4tPnBjaV9leHRfY29uZmlnX3NwYWNlID0gKHR5cGUgJiYgKnR5cGUgPT0gMSk7CisJcGRuLT5wY2lfZXh0X2NvbmZpZ19zcGFjZSA9ICh0eXBlICYmICp0eXBlID09IDEpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xMTIsMTAgKzEyNCwxNSBAQAogdm9pZCBfX2RldmluaXQgcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKiBkbiA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgcGhiLT5hcmNoX2RhdGE7CisJc3RydWN0IHBjaV9kbiAqcGRuOwogCiAJLyogUEhCIG5vZGVzIHRoZW1zZWx2ZXMgbXVzdCBub3QgbWF0Y2ggKi8KLQlkbi0+ZGV2Zm4gPSBkbi0+YnVzbm8gPSAtMTsKLQlkbi0+cGhiID0gcGhiOworCXVwZGF0ZV9kbl9wY2lfaW5mbyhkbiwgcGhiKTsKKwlwZG4gPSBkbi0+ZGF0YTsKKwlpZiAocGRuKSB7CisJCXBkbi0+ZGV2Zm4gPSBwZG4tPmJ1c25vID0gLTE7CisJCXBkbi0+cGhiID0gcGhiOworCX0KIAogCS8qIFVwZGF0ZSBkbi0+cGhiIHB0cnMgZm9yIG5ldyBwaGIgYW5kIGNoaWxkcmVuIGRldmljZXMgKi8KIAl0cmF2ZXJzZV9wY2lfZGV2aWNlcyhkbiwgdXBkYXRlX2RuX3BjaV9pbmZvLCBwaGIpOwpAQCAtMTIzLDE0ICsxNDAsMTcgQEAKIAogLyoKICAqIFRyYXZlcnNhbCBmdW5jIHRoYXQgbG9va3MgZm9yIGEgPGJ1c25vLGRldmZjbj4gdmFsdWUuCi0gKiBJZiBmb3VuZCwgdGhlIGRldmljZV9ub2RlIGlzIHJldHVybmVkICh0aHVzIHRlcm1pbmF0aW5nIHRoZSB0cmF2ZXJzYWwpLgorICogSWYgZm91bmQsIHRoZSBwY2lfZG4gaXMgcmV0dXJuZWQgKHRodXMgdGVybWluYXRpbmcgdGhlIHRyYXZlcnNhbCkuCiAgKi8KIHN0YXRpYyB2b2lkICppc19kZXZmbl9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHZvaWQgKmRhdGEpCiB7CiAJaW50IGJ1c25vID0gKCh1bnNpZ25lZCBsb25nKWRhdGEgPj4gOCkgJiAweGZmOwogCWludCBkZXZmbiA9ICgodW5zaWduZWQgbG9uZylkYXRhKSAmIDB4ZmY7CisJc3RydWN0IHBjaV9kbiAqcGNpID0gZG4tPmRhdGE7CiAKLQlyZXR1cm4gKChkZXZmbiA9PSBkbi0+ZGV2Zm4pICYmIChidXNubyA9PSBkbi0+YnVzbm8pKSA/IGRuIDogTlVMTDsKKwlpZiAocGNpICYmIChkZXZmbiA9PSBwY2ktPmRldmZuKSAmJiAoYnVzbm8gPT0gcGNpLT5idXNubykpCisJCXJldHVybiBkbjsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTE0OSwxMyArMTY5LDEwIEBACiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZldGNoX2Rldl9kbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb3JpZ19kbiA9IGRldi0+c3lzZGF0YTsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYiA9IG9yaWdfZG4tPnBoYjsgLyogYXNzdW1lIHNhbWUgcGhiIGFzIG9yaWdfZG4gKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoYl9kbjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCXVuc2lnbmVkIGxvbmcgc2VhcmNodmFsID0gKGRldi0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmRldmZuOwogCi0JcGhiX2RuID0gcGhiLT5hcmNoX2RhdGE7Ci0JZG4gPSB0cmF2ZXJzZV9wY2lfZGV2aWNlcyhwaGJfZG4sIGlzX2RldmZuX25vZGUsICh2b2lkICopc2VhcmNodmFsKTsKKwlkbiA9IHRyYXZlcnNlX3BjaV9kZXZpY2VzKG9yaWdfZG4sIGlzX2RldmZuX25vZGUsICh2b2lkICopc2VhcmNodmFsKTsKIAlpZiAoZG4pCiAJCWRldi0+c3lzZGF0YSA9IGRuOwogCXJldHVybiBkbjsKQEAgLTE2NSwxMSArMTgyLDEzIEBACiBzdGF0aWMgaW50IHBjaV9kbl9yZWNvbmZpZ19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqbm9kZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gbm9kZTsKKwlzdHJ1Y3QgcGNpX2RuICpwY2k7CiAJaW50IGVyciA9IE5PVElGWV9PSzsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBQU0VSSUVTX1JFQ09ORklHX0FERDoKLQkJdXBkYXRlX2RuX3BjaV9pbmZvKG5wLCBucC0+cGFyZW50LT5waGIpOworCQlwY2kgPSBucC0+cGFyZW50LT5kYXRhOworCQl1cGRhdGVfZG5fcGNpX2luZm8obnAsIHBjaS0+cGhiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gTk9USUZZX0RPTkU7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IGVmMGE2MmIuLjE0NjQ3ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BjaV9pb21tdS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaV9pb21tdS5jCkBAIC02Niw3ICs2Niw3IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCiAKICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLQlyZXR1cm4gUENJX0dFVF9ETihwZGV2KS0+aW9tbXVfdGFibGU7CisJcmV0dXJuIFBDSV9ETihQQ0lfR0VUX0ROKHBkZXYpKS0+aW9tbXVfdGFibGU7CiAjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfZmVhdHVyZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19mZWF0dXJlLmMKaW5kZXggOThlZDJiYy4uZWI0ZTZjMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19mZWF0dXJlLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19mZWF0dXJlLmMKQEAgLTY3NCw2ICs2NzQsNyBAQAogI2lmIDAgLyogRGlzYWJsZWQgZm9yIG5vdyAqLwogCXUzMgl1ZnJlcSwgZnJlcSwgdWNmZywgY2ZnOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpeF9ub2RlOworCXN0cnVjdCBwY2lfZG4gKnBkbjsKIAl1OCAgCXB4X2J1cywgcHhfZGV2Zm47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpweF9ob3NlOwogCkBAIC02ODcsOSArNjg4LDEwIEBACiAJCXByaW50aygiTm8gUENJLVggYnJpZGdlIGZvdW5kXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlweF9ob3NlID0gcGNpeF9ub2RlLT5waGI7Ci0JcHhfYnVzID0gcGNpeF9ub2RlLT5idXNubzsKLQlweF9kZXZmbiA9IHBjaXhfbm9kZS0+ZGV2Zm47CisJcGRuID0gcGNpeF9ub2RlLT5kYXRhOworCXB4X2hvc2UgPSBwZG4tPnBoYjsKKwlweF9idXMgPSBwZG4tPmJ1c25vOworCXB4X2RldmZuID0gcGRuLT5kZXZmbjsKIAkKIAllYXJseV9yZWFkX2NvbmZpZ19kd29yZChweF9ob3NlLCBweF9idXMsIHB4X2RldmZuLCAweGM0LCAmY2ZnKTsKIAllYXJseV9yZWFkX2NvbmZpZ19kd29yZChweF9ob3NlLCBweF9idXMsIHB4X2RldmZuLCAweGNjLCAmZnJlcSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3BjaS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19wY2kuYwppbmRleCA3MWZlOTExLi5kMzdiZmYyIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3BjaS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfcGNpLmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCWVsc2UKIAkJYnVzZG4gPSBob3NlLT5hcmNoX2RhdGE7CiAJZm9yIChkbiA9IGJ1c2RuLT5jaGlsZDsgZG47IGRuID0gZG4tPnNpYmxpbmcpCi0JCWlmIChkbi0+ZGV2Zm4gPT0gZGV2Zm4pCisJCWlmIChkbi0+ZGF0YSAmJiBQQ0lfRE4oZG4pLT5kZXZmbiA9PSBkZXZmbikKIAkJCWJyZWFrOwogCWlmIChkbiA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CkBAIC03NDYsOSArNzQ2LDkgQEAKIAkgKi8KIAlpZiAodTNfYWdwKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSB1M19hZ3AtPmFyY2hfZGF0YTsKLQkJbnAtPmJ1c25vID0gMHhmMDsKKwkJUENJX0ROKG5wKS0+YnVzbm8gPSAweGYwOwogCQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucDsgbnAgPSBucC0+c2libGluZykKLQkJCW5wLT5idXNubyA9IDB4ZjA7CisJCQlQQ0lfRE4obnApLT5idXNubyA9IDB4ZjA7CiAJfQogCiAJcG1hY19jaGVja19odF9saW5rKCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYy5jCmluZGV4IGNkZmVjNzQuLjYzZDk0ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BtYy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYy5jCkBAIC0yNiw3ICsyNiw3IEBACiAJbXRzcHIoU1BSTl9NTUNSMCwgbW1jcjApOwogfQogCi1zdGF0aWMgc3BpbmxvY2tfdCBwbWNfb3duZXJfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG1jX293bmVyX2xvY2spOwogc3RhdGljIHZvaWQgKnBtY19vd25lcl9jYWxsZXI7IC8qIG1vc3RseSBmb3IgZGVidWdnaW5nICovCiBwZXJmX2lycV90IHBlcmZfaXJxID0gZHVtbXlfcGVyZjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHJvbS5jCmluZGV4IDZhZDVhODQuLjcwMzVkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Byb20uYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTE3MzMsNiArMTczMyw3IEBACiAJa2ZyZWUobm9kZS0+aW50cnMpOwogCWtmcmVlKG5vZGUtPmFkZHJzKTsKIAlrZnJlZShub2RlLT5mdWxsX25hbWUpOworCWtmcmVlKG5vZGUtPmRhdGEpOwogCWtmcmVlKG5vZGUpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9ydGFzX3BjaS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcnRhc19wY2kuYwppbmRleCAxZGNjYWRhLi40YTk3MTliIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9ydGFzX3BjaS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3J0YXNfcGNpLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyBpbnQgaWJtX3JlYWRfcGNpX2NvbmZpZzsKIHN0YXRpYyBpbnQgaWJtX3dyaXRlX3BjaV9jb25maWc7CiAKLXN0YXRpYyBpbnQgY29uZmlnX2FjY2Vzc192YWxpZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBpbnQgd2hlcmUpCitzdGF0aWMgaW50IGNvbmZpZ19hY2Nlc3NfdmFsaWQoc3RydWN0IHBjaV9kbiAqZG4sIGludCB3aGVyZSkKIHsKIAlpZiAod2hlcmUgPCAyNTYpCiAJCXJldHVybiAxOwpAQCAtNzgsMTUgKzc4LDE3IEBACiAJaW50IHJldHVybnZhbCA9IC0xOwogCXVuc2lnbmVkIGxvbmcgYnVpZCwgYWRkcjsKIAlpbnQgcmV0OworCXN0cnVjdCBwY2lfZG4gKnBkbjsKIAotCWlmICghZG4pCisJaWYgKCFkbiB8fCAhZG4tPmRhdGEpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JaWYgKCFjb25maWdfYWNjZXNzX3ZhbGlkKGRuLCB3aGVyZSkpCisJcGRuID0gZG4tPmRhdGE7CisJaWYgKCFjb25maWdfYWNjZXNzX3ZhbGlkKHBkbiwgd2hlcmUpKQogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwogCi0JYWRkciA9ICgod2hlcmUgJiAweGYwMCkgPDwgMjApIHwgKGRuLT5idXNubyA8PCAxNikgfAotCQkoZG4tPmRldmZuIDw8IDgpIHwgKHdoZXJlICYgMHhmZik7Ci0JYnVpZCA9IGRuLT5waGItPmJ1aWQ7CisJYWRkciA9ICgod2hlcmUgJiAweGYwMCkgPDwgMjApIHwgKHBkbi0+YnVzbm8gPDwgMTYpIHwKKwkJKHBkbi0+ZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiAweGZmKTsKKwlidWlkID0gcGRuLT5waGItPmJ1aWQ7CiAJaWYgKGJ1aWQpIHsKIAkJcmV0ID0gcnRhc19jYWxsKGlibV9yZWFkX3BjaV9jb25maWcsIDQsIDIsICZyZXR1cm52YWwsCiAJCQkJYWRkciwgYnVpZCA+PiAzMiwgYnVpZCAmIDB4ZmZmZmZmZmYsIHNpemUpOwpAQCAtOTgsOCArMTAwLDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JaWYgKHJldHVybnZhbCA9PSBFRUhfSU9fRVJST1JfVkFMVUUoc2l6ZSkKLQkgICAgJiYgZWVoX2RuX2NoZWNrX2ZhaWx1cmUgKGRuLCBOVUxMKSkKKwlpZiAocmV0dXJudmFsID09IEVFSF9JT19FUlJPUl9WQUxVRShzaXplKSAmJgorCSAgICBlZWhfZG5fY2hlY2tfZmFpbHVyZSAoZG4sIE5VTEwpKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKQEAgLTExOCwyNCArMTIwLDI4IEBACiAKIAkvKiBTZWFyY2ggb25seSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIGJ1cyAqLwogCWZvciAoZG4gPSBidXNkbi0+Y2hpbGQ7IGRuOyBkbiA9IGRuLT5zaWJsaW5nKQotCQlpZiAoZG4tPmRldmZuID09IGRldmZuICYmIG9mX2RldmljZV9hdmFpbGFibGUoZG4pKQorCQlpZiAoZG4tPmRhdGEgJiYgUENJX0ROKGRuKS0+ZGV2Zm4gPT0gZGV2Zm4KKwkJICAgICYmIG9mX2RldmljZV9hdmFpbGFibGUoZG4pKQogCQkJcmV0dXJuIHJ0YXNfcmVhZF9jb25maWcoZG4sIHdoZXJlLCBzaXplLCB2YWwpOworCiAJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIH0KIAotc3RhdGljIGludCBydGFzX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQoraW50IHJ0YXNfd3JpdGVfY29uZmlnKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBidWlkLCBhZGRyOwogCWludCByZXQ7CisJc3RydWN0IHBjaV9kbiAqcGRuOwogCi0JaWYgKCFkbikKKwlpZiAoIWRuIHx8ICFkbi0+ZGF0YSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAoIWNvbmZpZ19hY2Nlc3NfdmFsaWQoZG4sIHdoZXJlKSkKKwlwZG4gPSBkbi0+ZGF0YTsKKwlpZiAoIWNvbmZpZ19hY2Nlc3NfdmFsaWQocGRuLCB3aGVyZSkpCiAJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAKLQlhZGRyID0gKCh3aGVyZSAmIDB4ZjAwKSA8PCAyMCkgfCAoZG4tPmJ1c25vIDw8IDE2KSB8Ci0JCShkbi0+ZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiAweGZmKTsKLQlidWlkID0gZG4tPnBoYi0+YnVpZDsKKwlhZGRyID0gKCh3aGVyZSAmIDB4ZjAwKSA8PCAyMCkgfCAocGRuLT5idXNubyA8PCAxNikgfAorCQkocGRuLT5kZXZmbiA8PCA4KSB8ICh3aGVyZSAmIDB4ZmYpOworCWJ1aWQgPSBwZG4tPnBoYi0+YnVpZDsKIAlpZiAoYnVpZCkgewogCQlyZXQgPSBydGFzX2NhbGwoaWJtX3dyaXRlX3BjaV9jb25maWcsIDUsIDEsIE5VTEwsIGFkZHIsIGJ1aWQgPj4gMzIsIGJ1aWQgJiAweGZmZmZmZmZmLCBzaXplLCAodWxvbmcpIHZhbCk7CiAJfSBlbHNlIHsKQEAgLTE2MSw3ICsxNjcsOCBAQAogCiAJLyogU2VhcmNoIG9ubHkgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSBidXMgKi8KIAlmb3IgKGRuID0gYnVzZG4tPmNoaWxkOyBkbjsgZG4gPSBkbi0+c2libGluZykKLQkJaWYgKGRuLT5kZXZmbiA9PSBkZXZmbiAmJiBvZl9kZXZpY2VfYXZhaWxhYmxlKGRuKSkKKwkJaWYgKGRuLT5kYXRhICYmIFBDSV9ETihkbiktPmRldmZuID09IGRldmZuCisJCSAgICAmJiBvZl9kZXZpY2VfYXZhaWxhYmxlKGRuKSkKIAkJCXJldHVybiBydGFzX3dyaXRlX2NvbmZpZyhkbiwgd2hlcmUsIHNpemUsIHZhbCk7CiAJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGQwYmI2OGEuLmJmYTg3OTFjIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMKQEAgLTEyODMsNyArMTI4Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CiAJLm5hbWUJPSAic2VyaWFsODI1MCIsCi0JLmlkCT0gMCwKKwkuaWQJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCiAJLmRldgk9IHsKIAkJLnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcG9ydHMsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3N5c19wcGMzMi5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMKaW5kZXggMjA2NjE5MC4uZTkzYzEzNCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMKQEAgLTcwOCw2MiArNzA4LDkgQEAKIAkJCQkgICBjb21wYXRfcHRyKHVidWYpKTsKIH0KIAotI2RlZmluZSBJT0JBU0VfQlJJREdFX05VTUJFUgkwCi0jZGVmaW5lIElPQkFTRV9NRU1PUlkJCTEKLSNkZWZpbmUgSU9CQVNFX0lPCQkyCi0jZGVmaW5lIElPQkFTRV9JU0FfSU8JCTMKLSNkZWZpbmUgSU9CQVNFX0lTQV9NRU0JCTQKLQogYXNtbGlua2FnZSBpbnQgc3lzMzJfcGNpY29uZmlnX2lvYmFzZSh1MzIgd2hpY2gsIHUzMiBpbl9idXMsIHUzMiBpbl9kZXZmbikKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxuOwotCXN0cnVjdCBwY2lfYnVzICpidXMgPSBOVUxMOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaG9zZV9ub2RlOwotCi0JLyogQXJnaCAhIFBsZWFzZSBmb3JnaXZlIG1lIGZvciB0aGF0IGhhY2ssIGJ1dCB0aGF0J3MgdGhlCi0JICogc2ltcGxlc3Qgd2F5IHRvIGdldCBleGlzdGluZyBYRnJlZSB0byBub3QgbG9ja3VwIG9uIHNvbWUKLQkgKiBHNSBtYWNoaW5lcy4uLiBTbyB3aGVuIHNvbWV0aGluZyBhc2tzIGZvciBidXMgMCBpbyBiYXNlCi0JICogKGJ1cyAwIGlzIEhUIHJvb3QpLCB3ZSByZXR1cm4gdGhlIEFHUCBvbmUgaW5zdGVhZC4KLQkgKi8KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLQlpZiAoc3lzdGVtY2ZnLT5wbGF0Zm9ybSA9PSBQTEFURk9STV9QT1dFUk1BQyAmJgotCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCi0JCWlmIChpbl9idXMgPT0gMCkKLQkJCWluX2J1cyA9IDB4ZjA7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCi0KLQkvKiBUaGF0IHN5c2NhbGwgaXNuJ3QgcXVpdGUgY29tcGF0aWJsZSB3aXRoIFBDSSBkb21haW5zLCBidXQgaXQncwotCSAqIHVzZWQgb24gcHJlLWRvbWFpbnMgc2V0dXAuIFdlIHJldHVybiB0aGUgZmlyc3QgbWF0Y2gKLQkgKi8KLQotCWZvciAobG4gPSBwY2lfcm9vdF9idXNlcy5uZXh0OyBsbiAhPSAmcGNpX3Jvb3RfYnVzZXM7IGxuID0gbG4tPm5leHQpIHsKLQkJYnVzID0gcGNpX2J1c19iKGxuKTsKLQkJaWYgKGluX2J1cyA+PSBidXMtPm51bWJlciAmJiBpbl9idXMgPCAoYnVzLT5udW1iZXIgKyBidXMtPnN1Ym9yZGluYXRlKSkKLQkJCWJyZWFrOwotCQlidXMgPSBOVUxMOwotCX0KLQlpZiAoYnVzID09IE5VTEwgfHwgYnVzLT5zeXNkYXRhID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaG9zZV9ub2RlID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKWJ1cy0+c3lzZGF0YTsKLQlob3NlID0gaG9zZV9ub2RlLT5waGI7Ci0KLQlzd2l0Y2ggKHdoaWNoKSB7Ci0JY2FzZSBJT0JBU0VfQlJJREdFX05VTUJFUjoKLQkJcmV0dXJuIChsb25nKWhvc2UtPmZpcnN0X2J1c25vOwotCWNhc2UgSU9CQVNFX01FTU9SWToKLQkJcmV0dXJuIChsb25nKWhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotCWNhc2UgSU9CQVNFX0lPOgotCQlyZXR1cm4gKGxvbmcpaG9zZS0+aW9fYmFzZV9waHlzOwotCWNhc2UgSU9CQVNFX0lTQV9JTzoKLQkJcmV0dXJuIChsb25nKWlzYV9pb19iYXNlOwotCWNhc2UgSU9CQVNFX0lTQV9NRU06Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLSNlbmRpZgkvKiBDT05GSUdfUENJICovCi0JcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBzeXNfcGNpY29uZmlnX2lvYmFzZSh3aGljaCwgaW5fYnVzLCBpbl9kZXZmbik7CiB9CiAKIApAQCAtODY3LDM3ICs4MTQsNiBAQAogCXJldHVybiBzeXNfbHNlZWsoZmQsIChpbnQpb2Zmc2V0LCBvcmlnaW4pOwogfQogCi0vKgotICogVGhpcyBpcyBqdXN0IGEgdmVyc2lvbiBmb3IgMzItYml0IGFwcGxpY2F0aW9ucyB3aGljaCBkb2VzCi0gKiBub3QgZm9yY2UgT19MQVJHRUZJTEUgb24uCi0gKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9vcGVuKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCi17Ci0JY2hhciAqIHRtcDsKLQlpbnQgZmQsIGVycm9yOwotCi0JdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7Ci0JZmQgPSBQVFJfRVJSKHRtcCk7Ci0JaWYgKCFJU19FUlIodG1wKSkgewotCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCXN0cnVjdCBmaWxlICogZiA9IGZpbHBfb3Blbih0bXAsIGZsYWdzLCBtb2RlKTsKLQkJCWVycm9yID0gUFRSX0VSUihmKTsKLQkJCWlmIChJU19FUlIoZikpCi0JCQkJZ290byBvdXRfZXJyb3I7Ci0JCQlmZF9pbnN0YWxsKGZkLCBmKTsKLQkJfQotb3V0OgotCQlwdXRuYW1lKHRtcCk7Ci0JfQotCXJldHVybiBmZDsKLQotb3V0X2Vycm9yOgotCXB1dF91bnVzZWRfZmQoZmQpOwotCWZkID0gZXJyb3I7Ci0JZ290byBvdXQ7Ci19Ci0KIC8qIE5vdGU6IGl0IGlzIG5lY2Vzc2FyeSB0byB0cmVhdCBidWZzaXogYXMgYW4gdW5zaWduZWQgaW50LAogICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjYXN0IHRvIGEgc2lnbmVkIGludCB0byBpbnN1cmUgdGhhdCB0aGUgCiAgKiBwcm9wZXIgY29udmVyc2lvbiAoc2lnbiBleHRlbnNpb24pIGJldHdlZW4gdGhlIHJlZ2lzdGVyIHJlcHJlc2VudGF0aW9uIG9mIGEgc2lnbmVkIGludCAobXNyIGluIDMyLWJpdCBtb2RlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzY2FsbHMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c2NhbGxzLmMKaW5kZXggYThjYmIyMC4uMDVmMTY2MyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzY2FsbHMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNjYWxscy5jCkBAIC00NiwxMCArNDYsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB3YWxsX2ppZmZpZXM7CiAKLXZvaWQKLWNoZWNrX2J1Z3Modm9pZCkKLXsKLX0KIAogLyoKICAqIHN5c19pcGMoKSBpcyB0aGUgZGUtbXVsdGlwbGV4ZXIgZm9yIHRoZSBTeXNWIElQQyBjYWxscy4uCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggOTFlZjk1Yy4uOTkzOWMyMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgICAqIFdlIHNob3VsZCBoYXZlIGFuIHJ0YyBjYWxsIHRoYXQgb25seSBzZXRzIHRoZSBtaW51dGVzIGFuZAogICAgICAgICAgKiBzZWNvbmRzIGxpa2Ugb24gSW50ZWwgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBub24gVVRDIGNsb2Nrcy4KICAgICAgICAgICovCi0gICAgICAgIGlmICggKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorICAgICAgICBpZiAobnRwX3N5bmNlZCgpICYmCiAgICAgICAgICAgICAgeHRpbWUudHZfc2VjIC0gbGFzdF9ydGNfdXBkYXRlID49IDY1OSAmJgogICAgICAgICAgICAgIGFicygoeHRpbWUudHZfbnNlYy8xMDAwKSAtICgxMDAwMDAwLTEwMDAwMDAvSFopKSA8IDUwMDAwMC9IWiAmJgogICAgICAgICAgICAgIGppZmZpZXMgLSB3YWxsX2ppZmZpZXMgPT0gMSkgewpAQCAtNDM1LDEwICs0MzUsNyBAQAogCSAqLwogCWxhc3RfcnRjX3VwZGF0ZSA9IG5ld19zZWMgLSA2NTg7CiAKLQl0aW1lX2FkanVzdCA9IDA7ICAgICAgICAgICAgICAgIC8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCiAJZGVsdGFfeHNlYyA9IG11bGhkdSggKHRiX2xhc3Rfc3RhbXAtZG9fZ3RvZC52YXJwLT50Yl9vcmlnX3N0YW1wKSwKIAkJCSAgICAgZG9fZ3RvZC52YXJwLT50Yl90b194cyApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggYThkNWU4My4uNzQ2N2FlNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0yMjAsNyArMjIxLDcgQEAKIAlfZXhjZXB0aW9uKFNJR1RSQVAsIHJlZ3MsIFRSQVBfQlJLUFQsIHJlZ3MtPm5pcCk7CiB9CiAKLXZvaWQgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBfX2twcm9iZXMgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJlZ3MtPm1zciAmPSB+TVNSX1NFOyAgLyogVHVybiBvZmYgJ3RyYWNlJyBiaXQgKi8KIApAQCAtMzk4LDcgKzM5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcHJvZ3JhbV9jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIF9fa3Byb2JlcyBwcm9ncmFtX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoZGVidWdnZXJfZmF1bHRfaGFuZGxlcihyZWdzKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdTNfaW9tbXUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3UzX2lvbW11LmMKaW5kZXggYjZlM2JjYS4uNDFlYTA5YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdTNfaW9tbXUuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC91M19pb21tdS5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwogCiAJaWYgKGRuKQotCQlkbi0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfdTM7CisJCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gJmlvbW11X3RhYmxlX3UzOwogfQogCiBzdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfdTMoc3RydWN0IHBjaV9idXMgKmJ1cykKQEAgLTI5MSw3ICsyOTEsNyBAQAogCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CiAKIAlpZiAoZG4pCi0JCWRuLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV91MzsKKwkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfdTM7CiB9CiAKIHN0YXRpYyB2b2lkIGlvbW11X2Rldl9zZXR1cF9udWxsKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvdWRiZy5jCmluZGV4IGVkNjc2NmUuLmQ0OWMzNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3VkYmcuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC91ZGJnLmMKQEAgLTE1OCwxNCArMTU4LDIwIEBACiAJLmluZGV4CT0gLTEsCiB9OwogCitzdGF0aWMgaW50IGVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQ7CisKIHZvaWQgX19pbml0IGRpc2FibGVfZWFybHlfcHJpbnRrKHZvaWQpCiB7CisJaWYgKCFlYXJseV9jb25zb2xlX2luaXRpYWxpemVkKQorCQlyZXR1cm47CiAJdW5yZWdpc3Rlcl9jb25zb2xlKCZ1ZGJnX2NvbnNvbGUpOworCWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgPSAwOwogfQogCiAvKiBjYWxsZWQgYnkgc2V0dXBfc3lzdGVtICovCiB2b2lkIHJlZ2lzdGVyX2Vhcmx5X3VkYmdfY29uc29sZSh2b2lkKQogeworCWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgPSAxOwogCXJlZ2lzdGVyX2NvbnNvbGUoJnVkYmdfY29uc29sZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9jYWNoZWZsdXNoLlMgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvY2FjaGVmbHVzaC5TCmluZGV4IDBlZDdlYTcuLmM4ZGI5OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9jYWNoZWZsdXNoLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2NhY2hlZmx1c2guUwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9kYXRhcGFnZS5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2RhdGFwYWdlLlMKaW5kZXggMjliNmJkMy4uNGY0ZWIwYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2RhdGFwYWdlLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL2RhdGFwYWdlLlMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvZ2V0dGltZW9mZGF5LlMgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvZ2V0dGltZW9mZGF5LlMKaW5kZXggMmI0OGJmMS4uMDdmMWMxYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi9nZXR0aW1lb2ZkYXkuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvZ2V0dGltZW9mZGF5LlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAJLnRleHQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9jYWNoZWZsdXNoLlMgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvNjQvY2FjaGVmbHVzaC5TCmluZGV4IGUwNzI1YjcuLmQ0YTBhZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9jYWNoZWZsdXNoLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2NhY2hlZmx1c2guUwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9kYXRhcGFnZS5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKaW5kZXggMThhZmQ5Ny4uZWQ2ZTU5OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMgYi9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKaW5kZXggZWQzZjk3MC4uZjZkZjgwMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzY0L2dldHRpbWVvZmRheS5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc282NC9nZXR0aW1lb2ZkYXkuUwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS50ZXh0CiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcHBjNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNDEwM2NjMS4uMDMwNjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNSw2ICsxNSw3IEBACiAJKigudGV4dCAudGV4dC4qKQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKKwlLUFJPQkVTX1RFWFQKIAkqKC5maXh1cCkKIAkuID0gQUxJR04oNDA5Nik7CiAJX2V0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbGliL2RlY19hbmRfbG9jay5jIGIvYXJjaC9wcGM2NC9saWIvZGVjX2FuZF9sb2NrLmMKaW5kZXggNmU4ZDg1OS4uN2I5ZDRkYSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9saWIvZGVjX2FuZF9sb2NrLmMKKysrIGIvYXJjaC9wcGM2NC9saWIvZGVjX2FuZF9sb2NrLmMKQEAgLTIwLDE0ICsyMCw3IEBACiAgKiBoYXMgYSBjbXB4Y2hnLCBhbmQgd2hlcmUgYXRvbWljLT52YWx1ZSBpcyBhbiBpbnQgaG9sZGluZwogICogdGhlIHZhbHVlIG9mIHRoZSBhdG9taWMgKGkuZS4gdGhlIGhpZ2ggYml0cyBhcmVuJ3QgdXNlZAogICogZm9yIGEgbG9jayBvciBhbnl0aGluZyBsaWtlIHRoYXQpLgotICoKLSAqIE4uQi4gQVRPTUlDX0RFQ19BTkRfTE9DSyBnZXRzIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9zcGlubG9jay5oCi0gKiBpZiBzcGlubG9ja3MgYXJlIGVtcHR5IGFuZCB0aHVzIGF0b21pY19kZWNfYW5kX2xvY2sgaXMgZGVmaW5lZAotICogdG8gYmUgYXRvbWljX2RlY19hbmRfdGVzdCAtIGluIHRoYXQgY2FzZSB3ZSBkb24ndCBuZWVkIGl0Ci0gKiBkZWZpbmVkIGhlcmUgYXMgd2VsbC4KICAqLwotCi0jaWZuZGVmIEFUT01JQ19ERUNfQU5EX0xPQ0sKIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQogewogCWludCBjb3VudGVyOwpAQCAtNTIsNCArNDUsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKLSNlbmRpZiAvKiBBVE9NSUNfREVDX0FORF9MT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2xpYi9sb2Nrcy5jIGIvYXJjaC9wcGM2NC9saWIvbG9ja3MuYwppbmRleCBlZjcwZWY5Li4wMzM2NDNhIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2xpYi9sb2Nrcy5jCisrKyBiL2FyY2gvcHBjNjQvbGliL2xvY2tzLmMKQEAgLTIzLDEyICsyMywxMiBAQAogLyogd2FpdGluZyBmb3IgYSBzcGlubG9jay4uLiAqLwogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19TUExQQVIpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKQogCi12b2lkIF9fc3Bpbl95aWVsZChzcGlubG9ja190ICpsb2NrKQordm9pZCBfX3NwaW5feWllbGQocmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgaW50IGxvY2tfdmFsdWUsIGhvbGRlcl9jcHUsIHlpZWxkX2NvdW50OwogCXN0cnVjdCBwYWNhX3N0cnVjdCAqaG9sZGVyX3BhY2E7CiAKLQlsb2NrX3ZhbHVlID0gbG9jay0+bG9jazsKKwlsb2NrX3ZhbHVlID0gbG9jay0+c2xvY2s7CiAJaWYgKGxvY2tfdmFsdWUgPT0gMCkKIAkJcmV0dXJuOwogCWhvbGRlcl9jcHUgPSBsb2NrX3ZhbHVlICYgMHhmZmZmOwpAQCAtMzgsNyArMzgsNyBAQAogCWlmICgoeWllbGRfY291bnQgJiAxKSA9PSAwKQogCQlyZXR1cm47CQkvKiB2aXJ0dWFsIGNwdSBpcyBjdXJyZW50bHkgcnVubmluZyAqLwogCXJtYigpOwotCWlmIChsb2NrLT5sb2NrICE9IGxvY2tfdmFsdWUpCisJaWYgKGxvY2stPnNsb2NrICE9IGxvY2tfdmFsdWUpCiAJCXJldHVybjsJCS8qIHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLwogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogCUh2Q2FsbDIoSHZDYWxsQmFzZVlpZWxkUHJvY2Vzc29yLCBIdkNhbGxfWWllbGRUb1Byb2MsCkBAIC01NCw3ICs1NCw3IEBACiAgKiBUaGlzIHR1cm5zIG91dCB0byBiZSB0aGUgc2FtZSBmb3IgcmVhZCBhbmQgd3JpdGUgbG9ja3MsIHNpbmNlCiAgKiB3ZSBvbmx5IGtub3cgdGhlIGhvbGRlciBpZiBpdCBpcyB3cml0ZS1sb2NrZWQuCiAgKi8KLXZvaWQgX19yd195aWVsZChyd2xvY2tfdCAqcncpCit2b2lkIF9fcndfeWllbGQocmF3X3J3bG9ja190ICpydykKIHsKIAlpbnQgbG9ja192YWx1ZTsKIAl1bnNpZ25lZCBpbnQgaG9sZGVyX2NwdSwgeWllbGRfY291bnQ7CkBAIC04Miw5ICs4Miw5IEBACiB9CiAjZW5kaWYKIAotdm9pZCBzcGluX3VubG9ja193YWl0KHNwaW5sb2NrX3QgKmxvY2spCit2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQocmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0Jd2hpbGUgKGxvY2stPmxvY2spIHsKKwl3aGlsZSAobG9jay0+c2xvY2spIHsKIAkJSE1UX2xvdygpOwogCQlpZiAoU0hBUkVEX1BST0NFU1NPUikKIAkJCV9fc3Bpbl95aWVsZChsb2NrKTsKQEAgLTkyLDQgKzkyLDQgQEAKIAlITVRfbWVkaXVtKCk7CiB9CiAKLUVYUE9SVF9TWU1CT0woc3Bpbl91bmxvY2tfd2FpdCk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9mYXVsdC5jIGIvYXJjaC9wcGM2NC9tbS9mYXVsdC5jCmluZGV4IDIwYjBmMzcuLjc3MmYwNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL3BwYzY0L21tL2ZhdWx0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTg0LDggKzg1LDggQEAKICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aGUgZmF1bHQgd2FzIGhhbmRsZWQsIG9yIHRoZSBzaWduYWwKICAqIG51bWJlciBpZiB0aGlzIGlzIGEga2VybmVsIGZhdWx0IHRoYXQgY2FuJ3QgYmUgaGFuZGxlZCBoZXJlLgogICovCi1pbnQgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK2ludCBfX2twcm9iZXMgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWE7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUyBiL2FyY2gvcHBjNjQvbW0vaGFzaF9sb3cuUwppbmRleCAzNWViNDllLi5lZTVhNWQzIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2hhc2hfbG93LlMKKysrIGIvYXJjaC9wcGM2NC9tbS9oYXNoX2xvdy5TCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9pbml0LmMgYi9hcmNoL3BwYzY0L21tL2luaXQuYwppbmRleCBhMTRhYjg3Li5jMjE1N2M5IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2luaXQuYworKysgYi9hcmNoL3BwYzY0L21tL2luaXQuYwpAQCAtNTU0LDEyICs1NTQsMTIgQEAKIAkgKiBwcmVzZW50LgogCSAqLwogCWZvciAoaT0wOyBpIDwgbG1iLm1lbW9yeS5jbnQ7IGkrKykKLQkJZnJlZV9ib290bWVtKGxtYl9zdGFydF9wZm4oJmxtYi5tZW1vcnksIGkpLAorCQlmcmVlX2Jvb3RtZW0obG1iLm1lbW9yeS5yZWdpb25baV0uYmFzZSwKIAkJCSAgICAgbG1iX3NpemVfYnl0ZXMoJmxtYi5tZW1vcnksIGkpKTsKIAogCS8qIHJlc2VydmUgdGhlIHNlY3Rpb25zIHdlJ3JlIGFscmVhZHkgdXNpbmcgKi8KIAlmb3IgKGk9MDsgaSA8IGxtYi5yZXNlcnZlZC5jbnQ7IGkrKykKLQkJcmVzZXJ2ZV9ib290bWVtKGxtYl9zdGFydF9wZm4oJmxtYi5yZXNlcnZlZCwgaSksCisJCXJlc2VydmVfYm9vdG1lbShsbWIucmVzZXJ2ZWQucmVnaW9uW2ldLmJhc2UsCiAJCQkJbG1iX3NpemVfYnl0ZXMoJmxtYi5yZXNlcnZlZCwgaSkpOwogCiAJZm9yIChpPTA7IGkgPCBsbWIubWVtb3J5LmNudDsgaSsrKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9tbS9zbGJfbG93LlMgYi9hcmNoL3BwYzY0L21tL3NsYl9sb3cuUwppbmRleCA2OThkNmI5Li5hM2EwM2RhIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL3NsYl9sb3cuUworKysgYi9hcmNoL3BwYzY0L21tL3NsYl9sb3cuUwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KIAogLyogdm9pZCBzbGJfYWxsb2NhdGUodW5zaWduZWQgbG9uZyBlYSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvTWFrZWZpbGUgYi9hcmNoL3MzOTAvTWFrZWZpbGUKaW5kZXggM2NkOGRkMi4uOThkYjMwNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogQUZMQUdTCQkrPSAtbTMxCiBVVFNfTUFDSElORQk6PSBzMzkwCiBTVEFDS19TSVpFCTo9IDgxOTIKK0NIRUNLRkxBR1MJKz0gLURfX3MzOTBfXwogZW5kaWYKIAogaWZkZWYgQ09ORklHX0FSQ0hfUzM5MFgKQEAgLTI4LDYgKzI5LDcgQEAKIEFGTEFHUwkJKz0gLW02NAogVVRTX01BQ0hJTkUJOj0gczM5MHgKIFNUQUNLX1NJWkUJOj0gMTYzODQKK0NIRUNLRkxBR1MJKz0gLURfX3MzOTBfXyAtRF9fczM5MHhfXwogZW5kaWYKIAogY2ZsYWdzLSQoQ09ORklHX01BUkNIX0c1KSAgICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWc1KQpAQCAtMTAwLDE2ICsxMDIsNiBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tJChBUkNIKS9vZmZzZXRzLmgKLQotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zOiBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBcCi0JCQkJICAgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0cy5oCi0KICMgRG9uJ3QgdXNlIHRhYnMgaW4gZWNobyBhcmd1bWVudHMKIGRlZmluZSBhcmNoaGVscAogICBlY2hvICAnKiBpbWFnZSAgICAgICAgICAgLSBLZXJuZWwgaW1hZ2UgZm9yIElQTCAoJChib290KS9pbWFnZSknCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggY2JlN2Q2YS4uNThmYzdmYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmluZGV4IGZiNzdiNzIuLmQwYzlmZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKaW5kZXggMjcxMGU2Ni4uNTU2NTRiNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKaW5kZXggOWE4MjYzYS4uYzlmZjA0MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggOGNhNDg1Ni4uMmZkNzVkYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTEzOSwxMCArMTM5LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3NwaW5sb2NrLmMgYi9hcmNoL3MzOTAvbGliL3NwaW5sb2NrLmMKaW5kZXggODg4YjU1OS4uMmRjMTRlOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9zcGlubG9jay5jCisrKyBiL2FyY2gvczM5MC9saWIvc3BpbmxvY2suYwpAQCAtMzYsNyArMzYsNyBAQAogfQogCiB2b2lkCi1fcmF3X3NwaW5fbG9ja193YWl0KHNwaW5sb2NrX3QgKmxwLCB1bnNpZ25lZCBpbnQgcGMpCitfcmF3X3NwaW5fbG9ja193YWl0KHJhd19zcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKQogewogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIEVYUE9SVF9TWU1CT0woX3Jhd19zcGluX2xvY2tfd2FpdCk7CiAKIGludAotX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkoc3BpbmxvY2tfdCAqbHAsIHVuc2lnbmVkIGludCBwYykKK19yYXdfc3Bpbl90cnlsb2NrX3JldHJ5KHJhd19zcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKQogewogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CiAKQEAgLTY3LDcgKzY3LDcgQEAKIEVYUE9SVF9TWU1CT0woX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkpOwogCiB2b2lkCi1fcmF3X3JlYWRfbG9ja193YWl0KHJ3bG9ja190ICpydykKK19yYXdfcmVhZF9sb2NrX3dhaXQocmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgb2xkOwogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CkBAIC04Niw3ICs4Niw3IEBACiBFWFBPUlRfU1lNQk9MKF9yYXdfcmVhZF9sb2NrX3dhaXQpOwogCiBpbnQKLV9yYXdfcmVhZF90cnlsb2NrX3JldHJ5KHJ3bG9ja190ICpydykKK19yYXdfcmVhZF90cnlsb2NrX3JldHJ5KHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IG9sZDsKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwpAQCAtMTAyLDcgKzEwMiw3IEBACiBFWFBPUlRfU1lNQk9MKF9yYXdfcmVhZF90cnlsb2NrX3JldHJ5KTsKIAogdm9pZAotX3Jhd193cml0ZV9sb2NrX3dhaXQocndsb2NrX3QgKnJ3KQorX3Jhd193cml0ZV9sb2NrX3dhaXQocmF3X3J3bG9ja190ICpydykKIHsKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwogCkBAIC0xMTksNyArMTE5LDcgQEAKIEVYUE9SVF9TWU1CT0woX3Jhd193cml0ZV9sb2NrX3dhaXQpOwogCiBpbnQKLV9yYXdfd3JpdGVfdHJ5bG9ja19yZXRyeShyd2xvY2tfdCAqcncpCitfcmF3X3dyaXRlX3RyeWxvY2tfcmV0cnkocmF3X3J3bG9ja190ICpydykKIHsKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3MuUyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5TCmluZGV4IGU4MDI5ZWYuLjg4ZmM5NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5TCisrKyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5TCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogICAgICAgICAudGV4dAogICAgICAgICAuYWxpZ24gNApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzNjQuUyBiL2FyY2gvczM5MC9saWIvdWFjY2VzczY0LlMKaW5kZXggMGNhNTY5Ny4uNTAyMTk3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzNjQuUworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3M2NC5TCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogICAgICAgICAudGV4dAogICAgICAgICAuYWxpZ24gNApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IGFkYzgxMDlmLi4zZTgwNGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0zNyw2ICszNywxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiU3lzdGVtIHR5cGUiCmRpZmYgLS1naXQgYS9hcmNoL3NoL01ha2VmaWxlIGIvYXJjaC9zaC9NYWtlZmlsZQppbmRleCBiNTYzNTYzLi4xOWYwMGQ1IDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTE1NSw3ICsxNTUsNyBAQAogcHJlcGFyZTogbWFrZXRvb2xzIGluY2x1ZGUvYXNtLXNoLy5jcHUgaW5jbHVkZS9hc20tc2gvLm1hY2gKIAogLlBIT05ZOiBtYWtldG9vbHMgRk9SQ0UKLW1ha2V0b29sczogaW5jbHVkZS9hc20tc2gvYXNtLW9mZnNldHMuaCBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBGT1JDRQorbWFrZXRvb2xzOiAgaW5jbHVkZS9saW51eC92ZXJzaW9uLmggRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcmNoL3NoL3Rvb2xzIGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oCiAKIGFsbDogekltYWdlCkBAIC0xNjgsMTQgKzE2OCw3IEBACiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS1zaC9tYWNodHlwZXMuaCBpbmNsdWRlL2FzbS1zaC9hc20tb2Zmc2V0cy5oCi0KLWFyY2gvc2gva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCSAgICAgIGluY2x1ZGUvYXNtLXNoLy5jcHUgaW5jbHVkZS9hc20tc2gvLm1hY2gKLQotaW5jbHVkZS9hc20tc2gvYXNtLW9mZnNldHMuaDogYXJjaC9zaC9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQorQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKIAogZGVmaW5lIGFyY2hoZWxwCiAJQGVjaG8gJyAgekltYWdlIAkgICAgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvc2gvYm9vdC96SW1hZ2UpJwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYWR4L2lycV9tYXNrcmVnLmMgYi9hcmNoL3NoL2JvYXJkcy9hZHgvaXJxX21hc2tyZWcuYwppbmRleCBjYTkxYmIwLi5jMDk3M2Y4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9hZHgvaXJxX21hc2tyZWcuYworKysgYi9hcmNoL3NoL2JvYXJkcy9hZHgvaXJxX21hc2tyZWcuYwpAQCAtMzcsMTMgKzM3LDEzIEBACiAKIC8qIGh3X2ludGVycnVwdF90eXBlICovCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1hc2tyZWdfaXJxX3R5cGUgPSB7Ci0JIiBNYXNrIFJlZ2lzdGVyIiwKLQlzdGFydHVwX21hc2tyZWdfaXJxLAotCXNodXRkb3duX21hc2tyZWdfaXJxLAotCWVuYWJsZV9tYXNrcmVnX2lycSwKLQlkaXNhYmxlX21hc2tyZWdfaXJxLAotCW1hc2tfYW5kX2Fja19tYXNrcmVnLAotCWVuZF9tYXNrcmVnX2lycQorCS50eXBlbmFtZSA9ICIgTWFzayBSZWdpc3RlciIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX21hc2tyZWdfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX21hc2tyZWdfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfbWFza3JlZ19pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX21hc2tyZWdfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfbWFza3JlZywKKwkuZW5kID0gZW5kX21hc2tyZWdfaXJxCiB9OwogCiAvKiBhY3R1YWwgaW1wbGVtZW50YXRpbiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYwppbmRleCA2OTcxNDRkLi5hOWZkZTc4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYwpAQCAtMzcsMTAgKzM3LDYgQEAKIHN0YXRpYyB1MzIgYmlnc3VyX2lvbWFwX2hpW0JJR1NVUl9JT01BUF9ISV9OTUFQXTsKIHN0YXRpYyB1OCBiaWdzdXJfaW9tYXBfaGlfc2hpZnRbQklHU1VSX0lPTUFQX0hJX05NQVBdOwogCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKSAgICAoKGEpPihiKT8oYSk6KGIpKQotI2VuZGlmCi0KIHZvaWQgYmlnc3VyX3BvcnRfbWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cywgdTMyIGFkZHIsIHU4IHNoaWZ0KQogewogCXUzMiBwb3J0LCBlbmRwb3J0ID0gYmFzZXBvcnQgKyBucG9ydHM7CkBAIC01Nyw3ICs1Myw3IEBACiAJICAgIAlhZGRyICs9ICgxPDwoQklHU1VSX0lPTUFQX0xPX1NISUZUKSk7CiAJfQogCi0JZm9yIChwb3J0ID0gTUFYKGJhc2Vwb3J0LCBCSUdTVVJfSU9NQVBfTE9fVEhSRVNIKSA7CisJZm9yIChwb3J0ID0gbWF4X3QodTMyLCBiYXNlcG9ydCwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCk7CiAJICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0hJX1RIUkVTSCA7CiAJICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfSElfU0hJRlQpKSB7CiAJICAgIAlwcl9kZWJ1ZygiICAgIG1hcGhpWzB4JXhdID0gMHglMDh4XG4iLCBwb3J0LCBhZGRyKTsKQEAgLTgwLDcgKzc2LDcgQEAKIAkJYmlnc3VyX2lvbWFwX2xvW3BvcnQ+PkJJR1NVUl9JT01BUF9MT19TSElGVF0gPSAwOwogCX0KIAotCWZvciAocG9ydCA9IE1BWChiYXNlcG9ydCwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCkgOworCWZvciAocG9ydCA9IG1heF90KHUzMiwgYmFzZXBvcnQsIEJJR1NVUl9JT01BUF9MT19USFJFU0gpOwogCSAgICAgcG9ydCA8IGVuZHBvcnQgJiYgcG9ydCA8IEJJR1NVUl9JT01BUF9ISV9USFJFU0ggOwogCSAgICAgcG9ydCArPSAoMTw8QklHU1VSX0lPTUFQX0hJX1NISUZUKSkgewogCQliaWdzdXJfaW9tYXBfaGlbcG9ydD4+QklHU1VSX0lPTUFQX0hJX1NISUZUXSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaXJxLmMKaW5kZXggYzE4OGZjMzIuLjZkZGJjYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaXJxLmMKQEAgLTIyOCwyMyArMjI4LDIzIEBACiAKIC8qIERlZmluZSB0aGUgSVJRIHN0cnVjdHVyZXMgZm9yIHRoZSBMMSBhbmQgTDIgSVJRIHR5cGVzICovCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGJpZ3N1cl9sMWlycV90eXBlID0gewotICAgICAgICAiQmlnU3VyLUNQTEQtTGV2ZWwxLUlSUSIsCi0gICAgICAgIHN0YXJ0dXBfYmlnc3VyX2lycSwKLSAgICAgICAgc2h1dGRvd25fYmlnc3VyX2lycSwKLSAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMWlycSwKLSAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDFpcnEsCi0gICAgICAgIG1hc2tfYW5kX2Fja19iaWdzdXIsCi0gICAgICAgIGVuZF9iaWdzdXJfaXJxCisJLnR5cGVuYW1lICA9ICJCaWdTdXItQ1BMRC1MZXZlbDEtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfYmlnc3VyX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9iaWdzdXJfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfYmlnc3VyX2wxaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9iaWdzdXJfbDFpcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19iaWdzdXIsCisJLmVuZCA9IGVuZF9iaWdzdXJfaXJxCiB9OwogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGJpZ3N1cl9sMmlycV90eXBlID0gewotICAgICAgICAiQmlnU3VyLUNQTEQtTGV2ZWwyLUlSUSIsCi0gICAgICAgIHN0YXJ0dXBfYmlnc3VyX2lycSwKLSAgICAgICAgc2h1dGRvd25fYmlnc3VyX2lycSwKLSAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMmlycSwKLSAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEsCi0gICAgICAgIG1hc2tfYW5kX2Fja19iaWdzdXIsCi0gICAgICAgIGVuZF9iaWdzdXJfaXJxCisJLnR5cGVuYW1lICA9ICJCaWdTdXItQ1BMRC1MZXZlbDItSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfYmlnc3VyX2lycSwKKwkuc2h1dGRvd24gID1zaHV0ZG93bl9iaWdzdXJfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfYmlnc3VyX2wyaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9iaWdzdXJfbDJpcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19iaWdzdXIsCisJLmVuZCA9IGVuZF9iaWdzdXJfaXJxCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9pcnEuYwppbmRleCBmYTZjZmU1Li5kMWRhMGQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9jcXJlZWsvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvY3FyZWVrL2lycS5jCkBAIC04MywxMyArODMsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBjcXJlZWtfaXJxX3R5cGUgPSB7Ci0JIkNxUkVFSy1JUlEiLAotCXN0YXJ0dXBfY3FyZWVrX2lycSwKLQlzaHV0ZG93bl9jcXJlZWtfaXJxLAotCWVuYWJsZV9jcXJlZWtfaXJxLAotCWRpc2FibGVfY3FyZWVrX2lycSwKLQltYXNrX2FuZF9hY2tfY3FyZWVrLAotCWVuZF9jcXJlZWtfaXJxCisJLnR5cGVuYW1lID0gIkNxUkVFSy1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9jcXJlZWtfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2NxcmVla19pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9jcXJlZWtfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9jcXJlZWtfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfY3FyZWVrLAorCS5lbmQgPSBlbmRfY3FyZWVrX2lycQogfTsKIAogaW50IGNxcmVla19oYXNfaWRlLCBjcXJlZWtfaGFzX2lzYTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hhcnAvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9oYXJwL2lycS5jCmluZGV4IGFjZDU4NDguLjUyZDBiYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hhcnAvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvaGFycC9pcnEuYwpAQCAtMzksMTMgKzM5LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaGFycF9pcnFfdHlwZSA9IHsKLQkiSGFycC1JUlEiLAotCXN0YXJ0dXBfaGFycF9pcnEsCi0Jc2h1dGRvd25faGFycF9pcnEsCi0JZW5hYmxlX2hhcnBfaXJxLAotCWRpc2FibGVfaGFycF9pcnEsCi0JbWFza19hbmRfYWNrX2hhcnAsCi0JZW5kX2hhcnBfaXJxCisJLnR5cGVuYW1lID0gIkhhcnAtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfaGFycF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25faGFycF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9oYXJwX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfaGFycF9pcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19oYXJwLAorCS5lbmQgPSBlbmRfaGFycF9pcnEKIH07CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaGFycF9pcnEodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9pcnEuYwppbmRleCAyM2FkYzZiLi43MTVlOGZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2lycS5jCkBAIC04NiwxMyArODYsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBvZF9pcnFfdHlwZSA9IHsKLQkiT3ZlcmRyaXZlLUlSUSIsCi0Jc3RhcnR1cF9vZF9pcnEsCi0Jc2h1dGRvd25fb2RfaXJxLAotCWVuYWJsZV9vZF9pcnEsCi0JZGlzYWJsZV9vZF9pcnEsCi0JbWFza19hbmRfYWNrX29kLAotCWVuZF9vZF9pcnEKKwkudHlwZW5hbWUgPSAiT3ZlcmRyaXZlLUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX29kX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9vZF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9vZF9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX29kX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX29kLAorCS5lbmQgPSBlbmRfb2RfaXJxCiB9OwogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX29kX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMKaW5kZXggYTc5MjFmNi4uZWQ0YzViNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jCkBAIC03NCwxMyArNzQsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBoczc3NTFydm9pcF9pcnFfdHlwZSA9IHsKLQkiSFM3NzUxUlZvSVAgSVJRIiwKLQlzdGFydHVwX2hzNzc1MXJ2b2lwX2lycSwKLQlzaHV0ZG93bl9oczc3NTFydm9pcF9pcnEsCi0JZW5hYmxlX2hzNzc1MXJ2b2lwX2lycSwKLQlkaXNhYmxlX2hzNzc1MXJ2b2lwX2lycSwKLQlhY2tfaHM3NzUxcnZvaXBfaXJxLAotCWVuZF9oczc3NTFydm9pcF9pcnEsCisJLnR5cGVuYW1lID0gICJIUzc3NTFSVm9JUCBJUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9oczc3NTFydm9pcF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25faHM3NzUxcnZvaXBfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfaHM3NzUxcnZvaXBfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9oczc3NTFydm9pcF9pcnEsCisJLmFjayA9IGFja19oczc3NTFydm9pcF9pcnEsCisJLmVuZCA9IGVuZF9oczc3NTFydm9pcF9pcnEsCiB9OwogCiBzdGF0aWMgdm9pZCBtYWtlX2hzNzc1MXJ2b2lwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCmluZGV4IDk1NzE3ZjQuLmQzNmM5MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKQEAgLTg4LDEzICs4OCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHJ0czc3NTFyMmRfaXJxX3R5cGUgPSB7Ci0JIlJUUzc3NTFSMkQgSVJRIiwKLQlzdGFydHVwX3J0czc3NTFyMmRfaXJxLAotCXNodXRkb3duX3J0czc3NTFyMmRfaXJxLAotCWVuYWJsZV9ydHM3NzUxcjJkX2lycSwKLQlkaXNhYmxlX3J0czc3NTFyMmRfaXJxLAotCWFja19ydHM3NzUxcjJkX2lycSwKLQllbmRfcnRzNzc1MXIyZF9pcnEsCisJLnR5cGVuYW1lID0gIlJUUzc3NTFSMkQgSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfcnRzNzc1MXIyZF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25fcnRzNzc1MXIyZF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9ydHM3NzUxcjJkX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfcnRzNzc1MXIyZF9pcnEsCisJLmFjayA9IGFja19ydHM3NzUxcjJkX2lycSwKKwkuZW5kID0gZW5kX3J0czc3NTFyMmRfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgbWFrZV9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL2lycS5jCmluZGV4IDU2NzVhNDEuLjdhMmViMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvaXJxLmMKQEAgLTM1LDEzICszNSwxMyBAQAogCiAvKiBod19pbnRlcnJ1cHRfdHlwZSAqLwogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBzeXN0ZW1oX2lycV90eXBlID0gewotCSIgU3lzdGVtSCBSZWdpc3RlciIsCi0Jc3RhcnR1cF9zeXN0ZW1oX2lycSwKLQlzaHV0ZG93bl9zeXN0ZW1oX2lycSwKLQllbmFibGVfc3lzdGVtaF9pcnEsCi0JZGlzYWJsZV9zeXN0ZW1oX2lycSwKLQltYXNrX2FuZF9hY2tfc3lzdGVtaCwKLQllbmRfc3lzdGVtaF9pcnEKKwkudHlwZW5hbWUgPSAiIFN5c3RlbUggUmVnaXN0ZXIiLAorCS5zdGFydHVwID0gc3RhcnR1cF9zeXN0ZW1oX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9zeXN0ZW1oX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX3N5c3RlbWhfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9zeXN0ZW1oX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX3N5c3RlbWgsCisJLmVuZCA9IGVuZF9zeXN0ZW1oX2lycQogfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3N5c3RlbWhfaXJxKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvaXJxLmMKaW5kZXggMTI5ODg4My4uMTM5NWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9pcnEuYwpAQCAtODMsMTMgKzgzLDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbWljcm9kZXZfaXJxX3R5cGUgPSB7Ci0JIk1pY3JvRGV2LUlSUSIsCi0Jc3RhcnR1cF9taWNyb2Rldl9pcnEsCi0Jc2h1dGRvd25fbWljcm9kZXZfaXJxLAotCWVuYWJsZV9taWNyb2Rldl9pcnEsCi0JZGlzYWJsZV9taWNyb2Rldl9pcnEsCi0JbWFza19hbmRfYWNrX21pY3JvZGV2LAotCWVuZF9taWNyb2Rldl9pcnEKKwkudHlwZW5hbWUgPSAiTWljcm9EZXYtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfbWljcm9kZXZfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX21pY3JvZGV2X2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX21pY3JvZGV2X2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfbWljcm9kZXZfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfbWljcm9kZXYsCisJLmVuZCA9IGVuZF9taWNyb2Rldl9pcnEKIH07CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWljcm9kZXZfaXJxKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjUvaW8uYyBiL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9pby5jCmluZGV4IDk5YWM3MDkuLjg0Y2IxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9pby5jCisrKyBiL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9pby5jCkBAIC00OCwxMCArNDgsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcJaGQ2NDQ2NV9pb21hcF9oaVtIRDY0NDY1X0lPTUFQX0hJX05NQVBdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIJaGQ2NDQ2NV9pb21hcF9oaV9zaGlmdFtIRDY0NDY1X0lPTUFQX0hJX05NQVBdOwogCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKSAgICAoKGEpPihiKT8oYSk6KGIpKQotI2VuZGlmCi0KICNkZWZpbmUgUE9SVDJBRERSKHgpIChzaF9tdi5tdl9pc2FfcG9ydDJhZGRyKHgpKQogCiB2b2lkIGhkNjQ0NjVfcG9ydF9tYXAodW5zaWduZWQgc2hvcnQgYmFzZXBvcnQsIHVuc2lnbmVkIGludCBucG9ydHMsCkBAIC03MSw3ICs2Nyw3IEBACiAJICAgIGFkZHIgKz0gKDE8PChIRDY0NDY1X0lPTUFQX0xPX1NISUZUKSk7CiAJfQogCi0JZm9yIChwb3J0ID0gTUFYKGJhc2Vwb3J0LCBIRDY0NDY1X0lPTUFQX0xPX1RIUkVTSCkgOworCWZvciAocG9ydCA9IG1heF90KHVuc2lnbmVkIGludCwgYmFzZXBvcnQsIEhENjQ0NjVfSU9NQVBfTE9fVEhSRVNIKTsKIAkgICAgIHBvcnQgPCBlbmRwb3J0ICYmIHBvcnQgPCBIRDY0NDY1X0lPTUFQX0hJX1RIUkVTSCA7CiAJICAgICBwb3J0ICs9ICgxPDxIRDY0NDY1X0lPTUFQX0hJX1NISUZUKSkgewogCSAgICBEUFJJTlRLKCIgICAgbWFwaGlbMHgleF0gPSAweCUwOGx4XG4iLCBwb3J0LCBhZGRyKTsKQEAgLTk1LDcgKzkxLDcgQEAKICAgICAJICAgIGhkNjQ0NjVfaW9tYXBfbG9bcG9ydD4+SEQ2NDQ2NV9JT01BUF9MT19TSElGVF0gPSAwOwogCX0KIAotCWZvciAocG9ydCA9IE1BWChiYXNlcG9ydCwgSEQ2NDQ2NV9JT01BUF9MT19USFJFU0gpIDsKKwlmb3IgKHBvcnQgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIGJhc2Vwb3J0LCBIRDY0NDY1X0lPTUFQX0xPX1RIUkVTSCk7CiAJICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgSEQ2NDQ2NV9JT01BUF9ISV9USFJFU0ggOwogCSAgICAgcG9ydCArPSAoMTw8SEQ2NDQ2NV9JT01BUF9ISV9TSElGVCkpIHsKICAgICAJICAgIGhkNjQ0NjVfaW9tYXBfaGlbcG9ydD4+SEQ2NDQ2NV9JT01BUF9ISV9TSElGVF0gPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jIGIvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCmluZGV4IDMwNzkyMzQuLjFiNmFjNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKQEAgLTg3LDEzICs4NywxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZveWFnZXJneF9pcnFfdHlwZSA9IHsKLQkiVk9ZQUdFUkdYLUlSUSIsCi0Jc3RhcnR1cF92b3lhZ2VyZ3hfaXJxLAotCXNodXRkb3duX3ZveWFnZXJneF9pcnEsCi0JZW5hYmxlX3ZveWFnZXJneF9pcnEsCi0JZGlzYWJsZV92b3lhZ2VyZ3hfaXJxLAotCW1hc2tfYW5kX2Fja192b3lhZ2VyZ3gsCi0JZW5kX3ZveWFnZXJneF9pcnEsCisJLnR5cGVuYW1lID0gIlZPWUFHRVJHWC1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF92b3lhZ2VyZ3hfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX3ZveWFnZXJneF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV92b3lhZ2VyZ3hfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV92b3lhZ2VyZ3hfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfdm95YWdlcmd4LAorCS5lbmQgPSBlbmRfdm95YWdlcmd4X2lycSwKIH07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB2b3lhZ2VyZ3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2ltYXNrLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2ltYXNrLmMKaW5kZXggZjc2OTAxZS4uYTk2M2QwMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pbWFzay5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnFfaW1hc2suYwpAQCAtNDYsMTMgKzQ2LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW1hc2tfaXJxX3R5cGUgPSB7Ci0JIlNSLklNQVNLIiwKLQlzdGFydHVwX2ltYXNrX2lycSwKLQlzaHV0ZG93bl9pbWFza19pcnEsCi0JZW5hYmxlX2ltYXNrX2lycSwKLQlkaXNhYmxlX2ltYXNrX2lycSwKLQltYXNrX2FuZF9hY2tfaW1hc2ssCi0JZW5kX2ltYXNrX2lycQorCS50eXBlbmFtZSA9ICJTUi5JTUFTSyIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2ltYXNrX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9pbWFza19pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9pbWFza19pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2ltYXNrX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX2ltYXNrLAorCS5lbmQgPSBlbmRfaW1hc2tfaXJxCiB9OwogCiB2b2lkIHN0YXRpYyBpbmxpbmUgc2V0X2ludGVycnVwdF9yZWdpc3RlcnMoaW50IGlwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnFfaXByLmMKaW5kZXggN2VhM2QyZC4uNzFmOTIwOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2lwci5jCkBAIC00OCwxMyArNDgsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcHJfaXJxX3R5cGUgPSB7Ci0JIklQUi1JUlEiLAotCXN0YXJ0dXBfaXByX2lycSwKLQlzaHV0ZG93bl9pcHJfaXJxLAotCWVuYWJsZV9pcHJfaXJxLAotCWRpc2FibGVfaXByX2lycSwKLQltYXNrX2FuZF9hY2tfaXByLAotCWVuZF9pcHJfaXJxCisJLnR5cGVuYW1lID0gIklQUi1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9pcHJfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2lwcl9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9pcHJfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9pcHJfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfaXByLAorCS5lbmQgPSBlbmRfaXByX2lycQogfTsKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHBpbnRfaXJxX3R5cGUgPSB7Ci0JIlBJTlQtSVJRIiwKLQlzdGFydHVwX3BpbnRfaXJxLAotCXNodXRkb3duX3BpbnRfaXJxLAotCWVuYWJsZV9waW50X2lycSwKLQlkaXNhYmxlX3BpbnRfaXJxLAotCW1hc2tfYW5kX2Fja19waW50LAotCWVuZF9waW50X2lycQorCS50eXBlbmFtZSA9ICJQSU5ULUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX3BpbnRfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX3BpbnRfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfcGludF9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX3BpbnRfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfcGludCwKKwkuZW5kID0gZW5kX3BpbnRfaXJxCiB9OwogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2lycV9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9pcnFfaW50YzIuYwppbmRleCAwOTllYmJmLi5mNmIxNmJhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2lycV9pbnRjMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvaXJxX2ludGMyLmMKQEAgLTQ4LDEzICs0OCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGludGMyX2lycV90eXBlID0gewotCSJJTlRDMi1JUlEiLAotCXN0YXJ0dXBfaW50YzJfaXJxLAotCXNodXRkb3duX2ludGMyX2lycSwKLQllbmFibGVfaW50YzJfaXJxLAotCWRpc2FibGVfaW50YzJfaXJxLAotCW1hc2tfYW5kX2Fja19pbnRjMiwKLQllbmRfaW50YzJfaXJxCisJLnR5cGVuYW1lID0gIklOVEMyLUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2ludGMyX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9pbnRjMl9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9pbnRjMl9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2ludGMyX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX2ludGMyLAorCS5lbmQgPSBlbmRfaW50YzJfaXJxCiB9OwogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCmluZGV4IGRmN2E5YjkuLjAyY2E2OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NoL2tlcm5lbC90aW1lLmMKQEAgLTIxNSwxMCArMjE1LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKIAljbG9ja193YXNfc2V0KCk7CiAKQEAgLTIzNCw3ICsyMzEsNyBAQAogICogdGltZXJfaW50ZXJydXB0KCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAogICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlkb190aW1lcihyZWdzKTsKICNpZm5kZWYgQ09ORklHX1NNUApAQCAtMjUyLDcgKzI0OSw3IEBACiAJICogUlRDIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKIAkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCiAJICovCi0JaWYgKCh0aW1lX3N0YXR1cyAmIFNUQV9VTlNZTkMpID09IDAgJiYKKwlpZiAobnRwX3N5bmNlZCgpICYmCiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKQEAgLTI4NSw3ICsyODIsNyBAQAogCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCiAJICovCiAJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0JZG9fdGltZXJfaW50ZXJydXB0KGlycSwgTlVMTCwgcmVncyk7CisJZG9fdGltZXJfaW50ZXJydXB0KGlycSwgcmVncyk7CiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9NYWtlZmlsZSBiL2FyY2gvc2g2NC9NYWtlZmlsZQppbmRleCBiNGZkOGUxLi4zOTA3MzczIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaDY0L01ha2VmaWxlCkBAIC03MywxMSArNzMsNyBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tJChBUkNIKS9hc20tb2Zmc2V0cy5oIGFyY2gvJChBUkNIKS9saWIvc3lzY2FsbHRhYi5oCi0KLWluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaDogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zIFwKLQkJCQkgICBpbmNsdWRlL2FzbSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaAotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKK3ByZXBhcmU6IGFyY2gvJChBUkNIKS9saWIvc3lzY2FsbHRhYi5oCiAKIGRlZmluZSBmaWxlY2hrX2dlbi1zeXNjYWxsdGFiCiAgICAgICAgKHNldCAtZTsgXApAQCAtMTA4LDcgKzEwNCw3IEBACiBhcmNoLyQoQVJDSCkvbGliL3N5c2NhbGx0YWIuaDogYXJjaC9zaDY0L2tlcm5lbC9zeXNjYWxscy5TCiAJJChjYWxsIGZpbGVjaGssZ2VuLXN5c2NhbGx0YWIpCiAKLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtLW9mZnNldHMuaCBhcmNoLyQoQVJDSCkvbGliL3N5c2NhbGx0YWIuaAorQ0xFQU5fRklMRVMgKz0gYXJjaC8kKEFSQ0gpL2xpYi9zeXNjYWxsdGFiLmgKIAogZGVmaW5lIGFyY2hoZWxwCiAJQGVjaG8gJyAgekltYWdlIAkgICAgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvc2g2NC9ib290L3pJbWFnZSknCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL2lycV9pbnRjLmMgYi9hcmNoL3NoNjQva2VybmVsL2lycV9pbnRjLmMKaW5kZXggNDNmODhmMy4uZmM5OWJmNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9rZXJuZWwvaXJxX2ludGMuYworKysgYi9hcmNoL3NoNjQva2VybmVsL2lycV9pbnRjLmMKQEAgLTEwNywxMyArMTA3LDEzIEBACiBzdGF0aWMgdm9pZCBlbmRfaW50Y19pcnEodW5zaWduZWQgaW50IGlycSk7CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW50Y19pcnFfdHlwZSA9IHsKLQkiSU5UQyIsCi0Jc3RhcnR1cF9pbnRjX2lycSwKLQlzaHV0ZG93bl9pbnRjX2lycSwKLQllbmFibGVfaW50Y19pcnEsCi0JZGlzYWJsZV9pbnRjX2lycSwKLQltYXNrX2FuZF9hY2tfaW50YywKLQllbmRfaW50Y19pcnEKKwkudHlwZW5hbWUgPSAiSU5UQyIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2ludGNfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2ludGNfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfaW50Y19pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2ludGNfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfaW50YywKKwkuZW5kID0gZW5kX2ludGNfaXJxCiB9OwogCiBzdGF0aWMgaW50IGlybG07CQkvKiBJUkwgbW9kZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3NoNjQva2VybmVsL3RpbWUuYwppbmRleCA2Yzg0ZGEzLi5mNGE2MmExIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NoNjQva2VybmVsL3RpbWUuYwpAQCAtMjQ3LDEwICsyNDcsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKIApAQCAtMzAzLDcgKzMwMCw3IEBACiAgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCiAgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljawogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50X2N0YzsKIAlhc20gKCJnZXRjb24gY3I2MiwgJTAiIDogIj1yIiAoY3VycmVudF9jdGMpKTsKQEAgLTMyOCw3ICszMjUsNyBAQAogCSAqIFJUQyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gU2V0X3J0Y19tbXNzKCkgaGFzIHRvIGJlCiAJICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgogCSAqLwotCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJgogCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA+PSA1MDAwMDAgLSAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMiAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CkBAIC0zNjEsNyArMzU4LDcgQEAKIAkgKiBsb2NhbGx5IGRpc2FibGVkLiAtYXJjYQogCSAqLwogCXdyaXRlX2xvY2soJnh0aW1lX2xvY2spOwotCWRvX3RpbWVyX2ludGVycnVwdChpcnEsIE5VTEwsIHJlZ3MpOworCWRvX3RpbWVyX2ludGVycnVwdChpcnEsIHJlZ3MpOwogCXdyaXRlX3VubG9jaygmeHRpbWVfbG9jayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggYWNhMDI4YS4uYWJhMDUzOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjExLDYgKzIxMSwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgU1VOX1BNCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvTWFrZWZpbGUKaW5kZXggN2IzYmJhZi4uZGVhNDhmNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL01ha2VmaWxlCkBAIC01OSwxNyArNTksNyBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotcHJlcGFyZTogaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oCi0KLWFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQotQ0xFQU5fRklMRVMgKz0JaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oCVwKLQkJYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCVwKLQkJYXJjaC8kKEFSQ0gpL2Jvb3QvU3lzdGVtLm1hcAorQ0xFQU5fRklMRVMgKz0gYXJjaC8kKEFSQ0gpL2Jvb3QvU3lzdGVtLm1hcAogCiAjIERvbid0IHVzZSB0YWJzIGluIGVjaG8gYXJndW1lbnRzLgogZGVmaW5lIGFyY2hoZWxwCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwppbmRleCBiNDQ4MTY2Li4wM2VjYjRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20va2dkYi5oPgogI2luY2x1ZGUgPGFzbS9jb250cmVncy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHNyLmg+CiAjaW5jbHVkZSA8YXNtL3ZhZGRycy5oPgogI2luY2x1ZGUgPGFzbS9tZW1yZWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCA1OTdkM2ZmLi4zNmE0MDY5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC04NDAsMTAgKzg0MCw3IEBACiAKIAl4dGltZS50dl9zZWMgPSB0di0+dHZfc2VjOwogCXh0aW1lLnR2X25zZWMgPSB0di0+dHZfbnNlYzsKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2Nsb3cuUyBiL2FyY2gvc3BhcmMva2VybmVsL3NjbG93LlMKaW5kZXggM2E4NjdmYy4uMTM2ZTM3YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2Nsb3cuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zY2xvdy5TCkBAIC03LDcgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3dpbm1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYwppbmRleCA1ZDk3NGEyLi5mODQ4MDkzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKQEAgLTExNCwxNyArMTE0LDcgQEAKIC8qIHVzZWQgYnkgdmFyaW91cyBkcml2ZXJzICovCiBFWFBPUlRfU1lNQk9MKHNwYXJjX2NwdV9tb2RlbCk7CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwogI2lmZGVmIENPTkZJR19TTVAKLUVYUE9SVF9TWU1CT0woX2RvX3NwaW5fbG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9kb19zcGluX3VubG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9zcGluX3RyeWxvY2spOwotRVhQT1JUX1NZTUJPTChfZG9fcmVhZF9sb2NrKTsKLUVYUE9SVF9TWU1CT0woX2RvX3JlYWRfdW5sb2NrKTsKLUVYUE9SVF9TWU1CT0woX2RvX3dyaXRlX2xvY2spOwotRVhQT1JUX1NZTUJPTChfZG9fd3JpdGVfdW5sb2NrKTsKLSNlbmRpZgotI2Vsc2UKIC8vIFhYWCBmaW5kIHdoYXQgdXNlcyAob3IgdXNlZCkgdGhlc2UuCiBFWFBPUlRfU1lNQk9MKF9fX3J3X3JlYWRfZW50ZXIpOwogRVhQT1JUX1NZTUJPTChfX19yd19yZWFkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCmluZGV4IDNiNzU5YWUuLmJjMDE1ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAKIAkvKiBEZXRlcm1pbmUgd2hlbiB0byB1cGRhdGUgdGhlIE1vc3RlayBjbG9jay4gKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewpAQCAtNTU0LDEwICs1NTQsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLwotCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7Ci0JdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKLQl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworCW50cF9jbGVhcigpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvbGliL01ha2VmaWxlCmluZGV4IDIyOTZmZjkuLmZhNTAwNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMvbGliL01ha2VmaWxlCkBAIC05LDUgKzksMyBAQAogCSBzdHJuY3B5X2Zyb21fdXNlci5vIGRpdmRpMy5vIHVkaXZkaTMubyBzdHJsZW5fdXNlci5vIFwKIAkgY29weV91c2VyLm8gbG9ja3MubyBhdG9taWMubyBhdG9taWMzMi5vIGJpdG9wcy5vIFwKIAkgbHNocmRpMy5vIGFzaGxkaTMubyByd3NlbS5vIG11bGRpMy5vIGJpdGV4dC5vCi0KLWxpYi0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0JZGVidWdsb2Nrcy5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9hdG9taWMzMi5jIGIvYXJjaC9zcGFyYy9saWIvYXRvbWljMzIuYwppbmRleCAxOTcyNGM1Li4yZTY0ZThjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2xpYi9hdG9taWMzMi5jCisrKyBiL2FyY2gvc3BhcmMvbGliL2F0b21pYzMyLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2Vsc2UgLyogU01QICovCiAKLXN0YXRpYyBzcGlubG9ja190IGR1bW15ID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhkdW1teSk7CiAjZGVmaW5lIEFUT01JQ19IQVNIX1NJWkUJMQogI2RlZmluZSBBVE9NSUNfSEFTSChhKQkJKCZkdW1teSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9saWIvZGVidWdsb2Nrcy5jIGIvYXJjaC9zcGFyYy9saWIvZGVidWdsb2Nrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjE4MjM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvbGliL2RlYnVnbG9ja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKiAkSWQ6IGRlYnVnbG9ja3MuYyx2IDEuMTEgMjAwMS8wOS8yMCAwMDozNTozMSBkYXZlbSBFeHAgJAotICogZGVidWdsb2Nrcy5jOiBEZWJ1Z2dpbmcgdmVyc2lvbnMgb2YgU01QIGxvY2tpbmcgcHJpbWl0aXZlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICogQ29weXJpZ2h0IChDKSAxOTk4LTk5IEFudG9uIEJsYW5jaGFyZCAoYW50b25AcHJvZ3NvYy51dHMuZWR1LmF1KQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4JLyogRm9yIE5SX0NQVVMgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGFzbS9wc3IuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLS8qIFNvbWUgbm90ZXMgb24gaG93IHRoZXNlIGRlYnVnZ2luZyByb3V0aW5lcyB3b3JrLiAgV2hlbiBhIGxvY2sgaXMgYWNxdWlyZWQKLSAqIGFuIGV4dHJhIGRlYnVnZ2luZyBtZW1iZXIgbG9jay0+b3duZXJfcGMgaXMgc2V0IHRvIHRoZSBjYWxsZXIgb2YgdGhlIGxvY2sKLSAqIGFjcXVpc2l0aW9uIHJvdXRpbmUuICBSaWdodCBiZWZvcmUgcmVsZWFzaW5nIGEgbG9jaywgdGhlIGRlYnVnZ2luZyBwcm9ncmFtCi0gKiBjb3VudGVyIGlzIGNsZWFyZWQgdG8gemVyby4KLSAqCi0gKiBGdXJ0aGVybW9yZSwgc2luY2UgUEMncyBhcmUgNCBieXRlIGFsaWduZWQgb24gU3BhcmMsIHdlIHN0dWZmIHRoZSBDUFUKLSAqIG51bWJlciBvZiB0aGUgb3duZXIgaW4gdGhlIGxvd2VzdCB0d28gYml0cy4KLSAqLwotCi0jZGVmaW5lIFNUT1JFX0NBTExFUihBKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUlaTcsICUwIiA6ICI9ciIgKEEpKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNob3coY2hhciAqc3RyLCBzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JcHJpbnRrKCIlcyglcCkgQ1BVIyVkIHN0dWNrIGF0ICUwOGx4LCBvd25lciBQQyglMDhseCk6Q1BVKCVseClcbiIsc3RyLAotCQlsb2NrLCBjcHUsIGNhbGxlciwgbG9jay0+b3duZXJfcGMgJiB+MywgbG9jay0+b3duZXJfcGMgJiAzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNob3dfcmVhZChjaGFyICpzdHIsIHJ3bG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JcHJpbnRrKCIlcyglcCkgQ1BVIyVkIHN0dWNrIGF0ICUwOGx4LCBvd25lciBQQyglMDhseCk6Q1BVKCVseClcbiIsIHN0ciwKLQkJbG9jaywgY3B1LCBjYWxsZXIsIGxvY2stPm93bmVyX3BjICYgfjMsIGxvY2stPm93bmVyX3BjICYgMyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3dyaXRlKGNoYXIgKnN0ciwgcndsb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaW50IGk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4bHgsIG93bmVyIFBDKCUwOGx4KTpDUFUoJWx4KSIsIHN0ciwKLQkJbG9jaywgY3B1LCBjYWxsZXIsIGxvY2stPm93bmVyX3BjICYgfjMsIGxvY2stPm93bmVyX3BjICYgMyk7Ci0KLQlmb3IoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCi0JCXByaW50aygiIHJlYWRlclslZF09JTA4bHgiLCBpLCBsb2NrLT5yZWFkZXJfcGNbaV0pOwotCi0JcHJpbnRrKCJcbiIpOwotfQotCi0jdW5kZWYgSU5JVF9TVFVDSwotI2RlZmluZSBJTklUX1NUVUNLIDEwMDAwMDAwMAotCi12b2lkIF9kb19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaywgY2hhciAqc3RyKQotewotCXVuc2lnbmVkIGxvbmcgY2FsbGVyOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQotCVNUT1JFX0NBTExFUihjYWxsZXIpOwotCi1hZ2FpbjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRzdHViIFslMV0sICUwIiA6ICI9ciIgKHZhbCkgOiAiciIgKCYobG9jay0+bG9jaykpKTsKLQlpZih2YWwpIHsKLQkJd2hpbGUobG9jay0+bG9jaykgewotCQkJaWYgKCEtLXN0dWNrKSB7Ci0JCQkJc2hvdyhzdHIsIGxvY2ssIGNhbGxlcik7Ci0JCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQkJfQotCQkJYmFycmllcigpOwotCQl9Ci0JCWdvdG8gYWdhaW47Ci0JfQotCWxvY2stPm93bmVyX3BjID0gKGNwdSAmIDMpIHwgKGNhbGxlciAmIH4zKTsKLX0KLQotaW50IF9zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBsb25nIGNhbGxlcjsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JU1RPUkVfQ0FMTEVSKGNhbGxlcik7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRzdHViIFslMV0sICUwIiA6ICI9ciIgKHZhbCkgOiAiciIgKCYobG9jay0+bG9jaykpKTsKLQlpZighdmFsKSB7Ci0JCS8qIFdlIGdvdCBpdCwgcmVjb3JkIG91ciBpZGVudGl0eSBmb3IgZGVidWdnaW5nLiAqLwotCQlsb2NrLT5vd25lcl9wYyA9IChjcHUgJiAzKSB8IChjYWxsZXIgJiB+Myk7Ci0JfQotCXJldHVybiB2YWwgPT0gMDsKLX0KLQotdm9pZCBfZG9fc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlsb2NrLT5vd25lcl9wYyA9IDA7Ci0JYmFycmllcigpOwotCWxvY2stPmxvY2sgPSAwOwotfQotCi12b2lkIF9kb19yZWFkX2xvY2socndsb2NrX3QgKnJ3LCBjaGFyICpzdHIpCi17Ci0JdW5zaWduZWQgbG9uZyBjYWxsZXI7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgc3R1Y2sgPSBJTklUX1NUVUNLOwotCi0JU1RPUkVfQ0FMTEVSKGNhbGxlcik7Ci0KLXdsb2NrX2FnYWluOgotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHN0dWIgWyUxICsgM10sICUwIiA6ICI9ciIgKHZhbCkgOiAiciIgKCYocnctPmxvY2spKSk7Ci0JaWYodmFsKSB7Ci0JCXdoaWxlKHJ3LT5sb2NrICYgMHhmZikgewotCQkJaWYgKCEtLXN0dWNrKSB7Ci0JCQkJc2hvd19yZWFkKHN0ciwgcncsIGNhbGxlcik7Ci0JCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQkJfQotCQkJYmFycmllcigpOwotCQl9Ci0JCWdvdG8gd2xvY2tfYWdhaW47Ci0JfQotCi0JcnctPnJlYWRlcl9wY1tjcHVdID0gY2FsbGVyOwotCWJhcnJpZXIoKTsKLQlydy0+bG9jaysrOwotfQotCi12b2lkIF9kb19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBsb25nIGNhbGxlcjsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBzdHVjayA9IElOSVRfU1RVQ0s7Ci0KLQlTVE9SRV9DQUxMRVIoY2FsbGVyKTsKLQotd2xvY2tfYWdhaW46Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkc3R1YiBbJTEgKyAzXSwgJTAiIDogIj1yIiAodmFsKSA6ICJyIiAoJihydy0+bG9jaykpKTsKLQlpZih2YWwpIHsKLQkJd2hpbGUocnctPmxvY2sgJiAweGZmKSB7Ci0JCQlpZiAoIS0tc3R1Y2spIHsKLQkJCQlzaG93X3JlYWQoc3RyLCBydywgY2FsbGVyKTsKLQkJCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCQl9Ci0JCQliYXJyaWVyKCk7Ci0JCX0KLQkJZ290byB3bG9ja19hZ2FpbjsKLQl9Ci0KLQlydy0+cmVhZGVyX3BjW2NwdV0gPSAwOwotCWJhcnJpZXIoKTsKLQlydy0+bG9jayAtPSAweDFmZjsKLX0KLQotdm9pZCBfZG9fd3JpdGVfbG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBsb25nIGNhbGxlcjsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBzdHVjayA9IElOSVRfU1RVQ0s7Ci0KLQlTVE9SRV9DQUxMRVIoY2FsbGVyKTsKLQotd2xvY2tfYWdhaW46Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkc3R1YiBbJTEgKyAzXSwgJTAiIDogIj1yIiAodmFsKSA6ICJyIiAoJihydy0+bG9jaykpKTsKLQlpZih2YWwpIHsKLXdsb2NrX3dhaXQ6Ci0JCXdoaWxlKHJ3LT5sb2NrKSB7Ci0JCQlpZiAoIS0tc3R1Y2spIHsKLQkJCQlzaG93X3dyaXRlKHN0ciwgcncsIGNhbGxlcik7Ci0JCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQkJfQotCQkJYmFycmllcigpOwotCQl9Ci0JCWdvdG8gd2xvY2tfYWdhaW47Ci0JfQotCi0JaWYgKHJ3LT5sb2NrICYgfjB4ZmYpIHsKLQkJKigoKHVuc2lnbmVkIGNoYXIgKikmcnctPmxvY2spKzMpID0gMDsKLQkJYmFycmllcigpOwotCQlnb3RvIHdsb2NrX3dhaXQ7Ci0JfQotCi0JYmFycmllcigpOwotCXJ3LT5vd25lcl9wYyA9IChjcHUgJiAzKSB8IChjYWxsZXIgJiB+Myk7Ci19Ci0KLXZvaWQgX2RvX3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCi17Ci0JcnctPm93bmVyX3BjID0gMDsKLQliYXJyaWVyKCk7Ci0JcnctPmxvY2sgPSAwOwotfQotCi0jZW5kaWYgLyogU01QICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2h5cGVyc3BhcmMuUyBiL2FyY2gvc3BhcmMvbW0vaHlwZXJzcGFyYy5TCmluZGV4IDU0YjhlNzYuLmEyMzFjY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaHlwZXJzcGFyYy5TCisrKyBiL2FyY2gvc3BhcmMvbW0vaHlwZXJzcGFyYy5TCkBAIC02LDcgKzYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wc3IuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vYXNpLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0c3JtbXUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3dpZnQuUyBiL2FyY2gvc3BhcmMvbW0vc3dpZnQuUwppbmRleCAyZGNhYTVhLi5jZDkwZjNmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3N3aWZ0LlMKKysrIGIvYXJjaC9zcGFyYy9tbS9zd2lmdC5TCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGFzbS9hc2kuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3Rzcm1tdS5oPgotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIAkuYWxpZ24JNApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS90c3VuYW1pLlMgYi9hcmNoL3NwYXJjL21tL3RzdW5hbWkuUwppbmRleCA4YWNkMTc4Li42OTdhZjYxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3RzdW5hbWkuUworKysgYi9hcmNoL3NwYXJjL21tL3RzdW5hbWkuUwpAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHNyLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3Zpa2luZy5TIGIvYXJjaC9zcGFyYy9tbS92aWtpbmcuUwppbmRleCBmNTg3MTJkLi4zY2JkNmRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3Zpa2luZy5TCisrKyBiL2FyY2gvc3BhcmMvbW0vdmlraW5nLlMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wc3IuaD4KLSNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vYXNpLmg+CiAjaW5jbHVkZSA8YXNtL214Y2MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L0tjb25maWcgYi9hcmNoL3NwYXJjNjQvS2NvbmZpZwppbmRleCA3M2VjNmFlLi4xZTlkODYzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjNjQvS2NvbmZpZwpAQCAtMjYsNiArMjYsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKwogY2hvaWNlCiAJcHJvbXB0ICJLZXJuZWwgcGFnZSBzaXplIgogCWRlZmF1bHQgU1BBUkM2NF9QQUdFX1NJWkVfOEtCCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNjMxMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxIEBACisvKiBEdW1teSBhc20tb2Zmc2V0cy5jIGZpbGUuIFJlcXVpcmVkIGJ5IGtidWlsZCBhbmQgcmVhZHkgdG8gYmUgdXNlZCAtIGhpbnQhICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGJiZjExZjguLjBkNjZkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKIC8qIFdlIGRvIG5vdCBoYXZlIGhhcmR3YXJlIHNpbmdsZS1zdGVwcGluZyBvbiBzcGFyYzY0LgogICogU28gd2UgaW1wbGVtZW50IHNvZnR3YXJlIHNpbmdsZS1zdGVwcGluZyB3aXRoIGJyZWFrcG9pbnQKQEAgLTM3LDMxICszOCwzMSBAQAogICogLSBNYXJrIHRoYXQgd2UgYXJlIG5vIGxvbmdlciBhY3RpdmVseSBpbiBhIGtwcm9iZS4KICAqLwogCi1pbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoraW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXJjaF9jb3B5X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9jb3B5X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXAtPmFpbnNuLmluc25bMF0gPSAqcC0+YWRkcjsKIAlwLT5haW5zbi5pbnNuWzFdID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTl8yOwogCXAtPm9wY29kZSA9ICpwLT5hZGRyOwogfQogCi12b2lkIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJKnAtPmFkZHIgPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OOwogCWZsdXNoaShwLT5hZGRyKTsKIH0KIAotdm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCSpwLT5hZGRyID0gcC0+b3Bjb2RlOwogCWZsdXNoaShwLT5hZGRyKTsKIH0KIAotdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogfQogCkBAIC0xMTEsNyArMTEyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBrcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3Byb2JlICpwOwogCXZvaWQgKmFkZHIgPSAodm9pZCAqKSByZWdzLT50cGM7CkBAIC0xOTEsOCArMTkyLDkgQEAKICAqIFRoZSBvcmlnaW5hbCBJTlNOIGxvY2F0aW9uIHdhcyBSRUFMX1BDLCBpdCBhY3R1YWxseQogICogZXhlY3V0ZWQgYXQgUEMgYW5kIHByb2R1Y2VkIGRlc3RpbmF0aW9uIGFkZHJlc3MgTlBDLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWxicmFuY2hfZml4dXAodTMyIGluc24sIHVuc2lnbmVkIGxvbmcgcmVhbF9wYywKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGMsIHVuc2lnbmVkIGxvbmcgbnBjKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIHJlbGJyYW5jaF9maXh1cCh1MzIgaW5zbiwgdW5zaWduZWQgbG9uZyByZWFsX3BjLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYywKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnBjKQogewogCS8qIEJyYW5jaCBub3QgdGFrZW4sIG5vIG1vZHMgbmVjZXNzYXJ5LiAgKi8KIAlpZiAobnBjID09IHBjICsgMHg0VUwpCkBAIC0yMTcsNyArMjE5LDggQEAKIC8qIElmIElOU04gaXMgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggd3JpdGVzIGl0J3MgUEMgbG9jYXRpb24KICAqIGludG8gYSBkZXN0aW5hdGlvbiByZWdpc3RlciwgZml4IHRoYXQgdXAuCiAgKi8KLXN0YXRpYyB2b2lkIHJldHBjX2ZpeHVwKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaW5zbiwgdW5zaWduZWQgbG9uZyByZWFsX3BjKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHJldHBjX2ZpeHVwKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaW5zbiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcmVhbF9wYykKIHsKIAl1bnNpZ25lZCBsb25nICpzbG90ID0gTlVMTDsKIApAQCAtMjU3LDcgKzI2MCw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRvIHJldHVybiBmcm9tIHRoZSBwb3N0LXNpbmdsZS1zdGVwCiAgKiBicmVha3BvaW50IHRyYXAuCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgaW5zbiA9IHAtPmFpbnNuLmluc25bMF07CiAKQEAgLTMxNSw4ICszMTgsOCBAQAogLyoKICAqIFdyYXBwZXIgcm91dGluZSB0byBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KICAqLwotaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJICAgICB2b2lkICpkYXRhKQoraW50IF9fa3Byb2JlcyBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKIAlzd2l0Y2ggKHZhbCkgewpAQCAtMzQ0LDcgKzM0Nyw4IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1hc21saW5rYWdlIHZvaWQga3Byb2JlX3RyYXAodW5zaWduZWQgbG9uZyB0cmFwX2xldmVsLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMga3Byb2JlX3RyYXAodW5zaWduZWQgbG9uZyB0cmFwX2xldmVsLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCUJVR19PTih0cmFwX2xldmVsICE9IDB4MTcwICYmIHRyYXBfbGV2ZWwgIT0gMHgxNzEpOwogCkBAIC0zNjgsNyArMzcyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHRfcmVncyAqanByb2JlX3NhdmVkX3JlZ3NfbG9jYXRpb247CiBzdGF0aWMgc3RydWN0IHNwYXJjX3N0YWNrZiBqcHJvYmVfc2F2ZWRfc3RhY2s7CiAKLWludCBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgX19rcHJvYmVzIHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CiAKQEAgLTM5MCw3ICszOTQsNyBAQAogCXJldHVybiAxOwogfQogCi12b2lkIGpwcm9iZV9yZXR1cm4odm9pZCkKK3ZvaWQgX19rcHJvYmVzIGpwcm9iZV9yZXR1cm4odm9pZCkKIHsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCkBAIC00MDMsNyArNDA3LDcgQEAKIAogZXh0ZXJuIHZvaWQgX19zaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKIAotaW50IGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXUzMiAqYWRkciA9ICh1MzIgKikgcmVncy0+dHBjOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwppbmRleCBlYzhiZjQwLi4yZmY3YzMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKQEAgLTM1OSwxMzQgKzM1OSwxNyBAQAogCXBidXMtPnJlc291cmNlWzFdID0gJnBibS0+bWVtX3NwYWNlOwogfQogCi1pbnQgcGNpX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCitzdHJ1Y3QgcmVzb3VyY2UgKnBjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcikKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwZGV2LT5idXMtPnN5c2RhdGE7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSAmcGRldi0+cmVzb3VyY2VbcmVzb3VyY2VdOwotCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QgPSBOVUxMOwogCi0JaWYgKCFwYm0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCiAJCXJvb3QgPSAmcGJtLT5pb19zcGFjZTsKLQllbHNlCisJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCXJvb3QgPSAmcGJtLT5tZW1fc3BhY2U7CiAKLQlwYm0tPnBhcmVudC0+cmVzb3VyY2VfYWRqdXN0KHBkZXYsIHJlcywgcm9vdCk7Ci0KLQlyZXR1cm4gcmVxdWVzdF9yZXNvdXJjZShyb290LCByZXMpOwotfQotCi0vKgotICogR2l2ZW4gdGhlIFBDSSBidXMgYSBkZXZpY2UgcmVzaWRlcyBvbiwgdHJ5IHRvCi0gKiBmaW5kIGFuIGFjY2VwdGFibGUgcmVzb3VyY2UgYWxsb2NhdGlvbiBmb3IgYQotICogc3BlY2lmaWMgZGV2aWNlIHJlc291cmNlLi4KLSAqLwotc3RhdGljIGludCBwY2lfYXNzaWduX2J1c19yZXNvdXJjZShjb25zdCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAotCXN0cnVjdCBwY2lfZGV2ICpkZXYsCi0Jc3RydWN0IHJlc291cmNlICpyZXMsCi0JdW5zaWduZWQgbG9uZyBzaXplLAotCXVuc2lnbmVkIGxvbmcgbWluLAotCWludCByZXNubykKLXsKLQl1bnNpZ25lZCBpbnQgdHlwZV9tYXNrOwotCWludCBpOwotCi0JdHlwZV9tYXNrID0gSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNOwotCWZvciAoaSA9IDAgOyBpIDwgNDsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqciA9IGJ1cy0+cmVzb3VyY2VbaV07Ci0JCWlmICghcikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHR5cGVfbWFzayBtdXN0IG1hdGNoICovCi0JCWlmICgocmVzLT5mbGFncyBeIHItPmZsYWdzKSAmIHR5cGVfbWFzaykKLQkJCWNvbnRpbnVlOwotCi0JCS8qIE9rLCB0cnkgaXQgb3V0Li4gKi8KLQkJaWYgKGFsbG9jYXRlX3Jlc291cmNlKHIsIHJlcywgc2l6ZSwgbWluLCAtMSwgc2l6ZSwgTlVMTCwgTlVMTCkgPCAwKQotCQkJY29udGludWU7Ci0KLQkJLyogUENJIGNvbmZpZyBzcGFjZSB1cGRhdGVkIGJ5IGNhbGxlci4gICovCi0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVCVVNZOwotfQotCi1pbnQgcGNpX2Fzc2lnbl9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc291cmNlKQotewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwotCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBjcC0+cGJtOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJnBkZXYtPnJlc291cmNlW3Jlc291cmNlXTsKLQl1bnNpZ25lZCBsb25nIG1pbiwgc2l6ZTsKLQlpbnQgZXJyOwotCi0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQltaW4gPSBwYm0tPmlvX3NwYWNlLnN0YXJ0ICsgMHg0MDBVTDsKLQllbHNlCi0JCW1pbiA9IHBibS0+bWVtX3NwYWNlLnN0YXJ0OwotCi0Jc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7Ci0KLQllcnIgPSBwY2lfYXNzaWduX2J1c19yZXNvdXJjZShwZGV2LT5idXMsIHBkZXYsIHJlcywgc2l6ZSwgbWluLCByZXNvdXJjZSk7Ci0KLQlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoIlBDSTogRmFpbGVkIHRvIGFsbG9jYXRlIHJlc291cmNlICVkIGZvciAlc1xuIiwKLQkJICAgICAgIHJlc291cmNlLCBwY2lfbmFtZShwZGV2KSk7Ci0JfSBlbHNlIHsKLQkJLyogVXBkYXRlIFBDSSBjb25maWcgc3BhY2UuICovCi0JCXBibS0+cGFyZW50LT5iYXNlX2FkZHJlc3NfdXBkYXRlKHBkZXYsIHJlc291cmNlKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBTb3J0IHJlc291cmNlcyBieSBhbGlnbm1lbnQgKi8KLXZvaWQgcGRldl9zb3J0X3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdCAqaGVhZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcjsKLQkJc3RydWN0IHJlc291cmNlX2xpc3QgKmxpc3QsICp0bXA7Ci0JCXVuc2lnbmVkIGxvbmcgcl9hbGlnbjsKLQotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0JCXJfYWxpZ24gPSByLT5lbmQgLSByLT5zdGFydDsKLQkJCi0JCWlmICghKHItPmZsYWdzKSB8fCByLT5wYXJlbnQpCi0JCQljb250aW51ZTsKLQkJaWYgKCFyX2FsaWduKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IElnbm9yZSBib2d1cyByZXNvdXJjZSAlZCAiCi0JCQkJCSAgICAiWyVseDolbHhdIG9mICVzXG4iLAotCQkJCQkgICAgaSwgci0+c3RhcnQsIHItPmVuZCwgcGNpX25hbWUoZGV2KSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlyX2FsaWduID0gKGkgPCBQQ0lfQlJJREdFX1JFU09VUkNFUykgPyByX2FsaWduICsgMSA6IHItPnN0YXJ0OwotCQlmb3IgKGxpc3QgPSBoZWFkOyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIGFsaWduID0gMDsKLQkJCXN0cnVjdCByZXNvdXJjZV9saXN0ICpsbiA9IGxpc3QtPm5leHQ7Ci0JCQlpbnQgaWR4OwotCi0JCQlpZiAobG4pIHsKLQkJCQlpZHggPSBsbi0+cmVzIC0gJmxuLT5kZXYtPnJlc291cmNlWzBdOwotCQkJCWFsaWduID0gKGlkeCA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKSA/Ci0JCQkJCWxuLT5yZXMtPmVuZCAtIGxuLT5yZXMtPnN0YXJ0ICsgMSA6Ci0JCQkJCWxuLT5yZXMtPnN0YXJ0OwotCQkJfQotCQkJaWYgKHJfYWxpZ24gPiBhbGlnbikgewotCQkJCXRtcCA9IGttYWxsb2Moc2l6ZW9mKCp0bXApLCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoIXRtcCkKLQkJCQkJcGFuaWMoInBkZXZfc29ydF9yZXNvdXJjZXMoKTogIgotCQkJCQkgICAgICAia21hbGxvYygpIGZhaWxlZCFcbiIpOwotCQkJCXRtcC0+bmV4dCA9IGxuOwotCQkJCXRtcC0+cmVzID0gcjsKLQkJCQl0bXAtPmRldiA9IGRldjsKLQkJCQlsaXN0LT5uZXh0ID0gdG1wOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorCXJldHVybiByb290OwogfQogCiB2b2lkIHBjaWJpb3NfdXBkYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKaW5kZXggOTFhYjQ2Ni4uNmVkMWVmMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogLyoweDMyKi8xNSwJCS8qIFBvd2VyIE1hbmFnZW1lbnQJCSovCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwc3ljaG9faW5vX3RvX3BpbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGlubykKK3N0YXRpYyBpbnQgcHN5Y2hvX2lub190b19waWwoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGludCBpbm8pCiB7CiAJaW50IHJldDsKIApAQCAtMzQ0LDkgKzM0NCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgcHN5Y2hvX2lycV9idWlsZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJCSAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJICAgIHVuc2lnbmVkIGludCBpbm8pCitzdGF0aWMgdW5zaWduZWQgaW50IHBzeWNob19pcnFfYnVpbGQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgaW5vKQogewogCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQ7CiAJdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwpAQCAtMTAyNCw3ICsxMDI0LDcgQEAKICNkZWZpbmUgUFNZQ0hPX0NFX0lOTwkJMHgyZgogI2RlZmluZSBQU1lDSE9fUENJRVJSX0FfSU5PCTB4MzAKICNkZWZpbmUgUFNZQ0hPX1BDSUVSUl9CX0lOTwkweDMxCi1zdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQorc3RhdGljIHZvaWQgcHN5Y2hvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9ICZwLT5wYm1fQTsgLyogYXJiaXRyYXJ5ICovCiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzOwpAQCAtMTA5MSwxNSArMTA5MSwxNSBAQAogfQogCiAvKiBQU1lDSE8gYm9vdCB0aW1lIHByb2JpbmcgYW5kIGluaXRpYWxpemF0aW9uLiAqLwotc3RhdGljIHZvaWQgX19pbml0IHBzeWNob19yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSAgc3RydWN0IHJlc291cmNlICpyZXMsCi0JCQkJCSAgc3RydWN0IHJlc291cmNlICpyb290KQorc3RhdGljIHZvaWQgcHN5Y2hvX3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QpCiB7CiAJcmVzLT5zdGFydCArPSByb290LT5zdGFydDsKIAlyZXMtPmVuZCArPSByb290LT5zdGFydDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBzeWNob19iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCitzdGF0aWMgdm9pZCBwc3ljaG9fYmFzZV9hZGRyZXNzX3VwZGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc291cmNlKQogewogCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBjcC0+cGJtOwpAQCAtMTE0NCw3ICsxMTQ0LDcgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCXU4ICphZGRyOwogCkBAIC0xMTYxLDggKzExNjEsOCBAQAogCXBjaV9jb25maWdfd3JpdGU4KGFkZHIsIDY0KTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBibV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBwYm1fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCisJCQkgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWUgPSBrbWFsbG9jKHNpemVvZigqY29va2llKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTExODksNyArMTE4OSw3IEBACiAJcGNpX3NldHVwX2J1c21hc3RlcmluZyhwYm0sIHBibS0+cGNpX2J1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwc3ljaG9fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCBwc3ljaG9fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcoJnAtPnBibV9CKTsKIAlwLT5wYm1fQi5pc182Nm1oel9jYXBhYmxlID0gMDsKQEAgLTEyMDQsNyArMTIwNCw3IEBACiAJcHN5Y2hvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX2lvbW11X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCBwc3ljaG9faW9tbXVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKIHsKIAlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSA9IHAtPnBibV9BLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgdHNiYmFzZSwgaTsKQEAgLTEzMjcsOCArMTMyNyw4IEBACiAJcHN5Y2hvX3dyaXRlKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lCX0RJQUcsIHRtcCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCQkJICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKIAljaGFyICpuYW1lID0gcGJtLT5uYW1lOwogCkBAIC0xNDgxLDcgKzE0ODEsNyBAQAogCiAjZGVmaW5lIFBTWUNIT19DT05GSUdTUEFDRQkweDAwMTAwMDAwMFVMCiAKLXZvaWQgX19pbml0IHBzeWNob19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBwc3ljaG9faW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKIHsKIAlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyBwcl9yZWdzWzNdOwogCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKaW5kZXggNTJiZjM0My4uMGVlNmJkNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCkBAIC01NTQsNyArNTU0LDcgQEAKIC8qMHgzMiovMTUsCQkvKiBQb3dlciBNYW5hZ2VtZW50CQkqLwogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2FicmVfaW5vX3RvX3BpbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGlubykKK3N0YXRpYyBpbnQgc2FicmVfaW5vX3RvX3BpbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGlubykKIHsKIAlpbnQgcmV0OwogCkBAIC02MTIsOSArNjEyLDkgQEAKIAlzYWJyZV9yZWFkKHN5bmNfcmVnKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgc2FicmVfaXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkJICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBpbm8pCitzdGF0aWMgdW5zaWduZWQgaW50IHNhYnJlX2lycV9idWlsZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaW5vKQogewogCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQ7CiAJdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICNkZWZpbmUgU0FCUkVfVUVfSU5PCQkweDJlCiAjZGVmaW5lIFNBQlJFX0NFX0lOTwkJMHgyZgogI2RlZmluZSBTQUJSRV9QQ0lFUlJfSU5PCTB4MzAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKK3N0YXRpYyB2b2lkIHNhYnJlX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9ICZwLT5wYm1fQTsgLyogYXJiaXRyYXJ5ICovCiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcGJtLT5jb250cm9sbGVyX3JlZ3M7CkBAIC0xMDU2LDkgKzEwNTYsOSBAQAogCXNhYnJlX3dyaXRlKGJhc2UgKyBTQUJSRV9QQ0lDVFJMLCB0bXApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfcmVzb3VyY2VfYWRqdXN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCQkgc3RydWN0IHJlc291cmNlICpyZXMsCi0JCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QpCitzdGF0aWMgdm9pZCBzYWJyZV9yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwZGV2LT5idXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBiYXNlOwpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAlyZXMtPmVuZCArPSBiYXNlOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfYmFzZV9hZGRyZXNzX3VwZGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc291cmNlKQorc3RhdGljIHZvaWQgc2FicmVfYmFzZV9hZGRyZXNzX3VwZGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc291cmNlKQogewogCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBjcC0+cGJtOwpAQCAtMTExOCw3ICsxMTE4LDcgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYXBiX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsIHN0cnVjdCBwY2lfYnVzICpzYWJyZV9idXMpCitzdGF0aWMgdm9pZCBhcGJfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IHBjaV9idXMgKnNhYnJlX2J1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIApAQCAtMTE4MSw3ICsxMTgxLDcgQEAKIAlyZXR1cm4gY29va2llOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCBzYWJyZV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKIHsKIAlzdGF0aWMgaW50IG9uY2U7CiAJc3RydWN0IHBjaV9idXMgKnNhYnJlX2J1cywgKnBidXM7CkBAIC0xMjYyLDkgKzEyNjIsOSBAQAogCXNhYnJlX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfaW9tbXVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkgICAgaW50IHRzYnNpemUsIHVuc2lnbmVkIGxvbmcgZHZtYV9vZmZzZXQsCi0JCQkJICAgIHUzMiBkbWFfbWFzaykKK3N0YXRpYyB2b2lkIHNhYnJlX2lvbW11X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCisJCQkgICAgIGludCB0c2JzaXplLCB1bnNpZ25lZCBsb25nIGR2bWFfb2Zmc2V0LAorCQkJICAgICB1MzIgZG1hX21hc2spCiB7CiAJc3RydWN0IHBjaV9pb21tdSAqaW9tbXUgPSBwLT5wYm1fQS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIHRzYmJhc2UsIGksIG9yZGVyOwpAQCAtMTM0NSw4ICsxMzQ1LDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCQkJICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKIAljaGFyICpuYW1lID0gcGJtLT5uYW1lOwogCXVuc2lnbmVkIGxvbmcgaWJhc2UgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT1NQQUNFOwpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAkJCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgaW50IHNhYnJlX25vZGUsIHUzMiBkbWFfYmVnaW4pCitzdGF0aWMgdm9pZCBzYWJyZV9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgaW50IHNhYnJlX25vZGUsIHUzMiBkbWFfYmVnaW4pCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCWNoYXIgbmFtZWJ1ZlsxMjhdOwpAQCAtMTU1Miw3ICsxNTUyLDcgQEAKIAl9CiB9CiAKLXZvaWQgX19pbml0IHNhYnJlX2luaXQoaW50IHBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBzYWJyZV9pbml0KGludCBwbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKIHsKIAlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyBwcl9yZWdzWzJdOwogCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2NoaXpvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYwppbmRleCA2YTE4MmJiLi4zMzEzODJlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAvKjB4M2YqLzAsCQkvKiBSZXNlcnZlZCBmb3IgTmV3TGluawkJKi8KIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNjaGl6b19pbm9fdG9fcGlsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5vKQorc3RhdGljIGludCBzY2hpem9faW5vX3RvX3BpbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGlubykKIHsKIAlpbnQgcmV0OwogCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogICogUENJIGJ1cyB1bml0cyBvZiB0aGUgc2FtZSBUb21hdGlsbG8uICBJIHN0aWxsIGhhdmUgbm90IHJlYWxseQogICogZmlndXJlZCB0aGlzIG91dC4uLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdG9tYXRpbGxvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQorc3RhdGljIHZvaWQgdG9tYXRpbGxvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKIAl1bnNpZ25lZCBpbnQgaXJxOwpAQCAtMTM1OSw3ICsxMzU5LDcgQEAKIAkJICAgICAoU0NISVpPX1NBRklSUUNUUkxfRU4gfCAoQlVTX0VSUk9SX1VOTUFQKSkpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NoaXpvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQorc3RhdGljIHZvaWQgc2NoaXpvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKIAl1bnNpZ25lZCBpbnQgaXJxOwpAQCAtMTUwNSw3ICsxNTA1LDcgQEAKIAkJICAgICAoU0NISVpPX1NBRklSUUNUUkxfRU4gfCAoQlVTX0VSUk9SX1VOTUFQKSkpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCXU4ICphZGRyOwogCkBAIC0xNTIyLDggKzE1MjIsOCBAQAogCXBjaV9jb25maWdfd3JpdGU4KGFkZHIsIDY0KTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBibV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBwYm1fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCisJCQkgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWUgPSBrbWFsbG9jKHNpemVvZigqY29va2llKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTE1NTAsOCArMTU1MCw4IEBACiAJcGNpX3NldHVwX2J1c21hc3RlcmluZyhwYm0sIHBibS0+cGNpX2J1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBfX3NjaGl6b19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkgICAgIGludCBjaGlwX3R5cGUpCitzdGF0aWMgdm9pZCBfX3NjaGl6b19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCSAgICAgIGludCBjaGlwX3R5cGUpCiB7CiAJaWYgKCFwLT5wYm1fQi5wcm9tX25vZGUgfHwgIXAtPnBibV9BLnByb21fbm9kZSkgewogCQlwcmludGsoIlBDSTogT25seSBvbmUgUENJIGJ1cyBtb2R1bGUgb2YgY29udHJvbGxlciBmb3VuZC5cbiIpOwpAQCAtMTU3NywxNyArMTU3NywxNyBAQAogCQlzY2hpem9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMocCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzY2hpem9fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCitzdGF0aWMgdm9pZCBzY2hpem9fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7CiAJX19zY2hpem9fc2Nhbl9idXMocCwgUEJNX0NISVBfVFlQRV9TQ0hJWk8pOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgdG9tYXRpbGxvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQorc3RhdGljIHZvaWQgdG9tYXRpbGxvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCV9fc2NoaXpvX3NjYW5fYnVzKHAsIFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNjaGl6b19iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCitzdGF0aWMgdm9pZCBzY2hpem9fYmFzZV9hZGRyZXNzX3VwZGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc291cmNlKQogewogCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBjcC0+cGJtOwpAQCAtMTYzMiw5ICsxNjMyLDkgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NoaXpvX3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQkJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QpCitzdGF0aWMgdm9pZCBzY2hpem9fcmVzb3VyY2VfYWRqdXN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKIHsKIAlyZXMtPnN0YXJ0ICs9IHJvb3QtPnN0YXJ0OwogCXJlcy0+ZW5kICs9IHJvb3QtPnN0YXJ0OwpAQCAtMTcwMiw4ICsxNzAyLDggQEAKIAkgICAgICAgcGJtLT5tZW1fc3BhY2Uuc3RhcnQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkJCSAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3N0YXRpYyB2b2lkIHBibV9yZWdpc3Rlcl90b3BsZXZlbF9yZXNvdXJjZXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCisJCQkJCSAgICBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJcGJtLT5pb19zcGFjZS5uYW1lID0gcGJtLT5tZW1fc3BhY2UubmFtZSA9IHBibS0+bmFtZTsKIApAQCAtMTkzMiw3ICsxOTMyLDcgQEAKICNkZWZpbmUgVE9NQVRJTExPX1BDSV9JT0NfVERJQUcJCSgweDIyNTBVTCkKICNkZWZpbmUgVE9NQVRJTExPX1BDSV9JT0NfRERJQUcJCSgweDIyOTBVTCkKIAotc3RhdGljIHZvaWQgX19pbml0IHNjaGl6b19wYm1faHdfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBzY2hpem9fcGJtX2h3X2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCXU2NCB0bXA7CiAKQEAgLTE5ODYsOSArMTk4Niw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NoaXpvX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCSAgIGludCBwcm9tX25vZGUsIHUzMiBwb3J0aWQsCi0JCQkJICAgaW50IGNoaXBfdHlwZSkKK3N0YXRpYyB2b2lkIHNjaGl6b19wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKKwkJCSAgICBpbnQgcHJvbV9ub2RlLCB1MzIgcG9ydGlkLAorCQkJICAgIGludCBjaGlwX3R5cGUpCiB7CiAJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcHJfcmVnc1s0XTsKIAl1bnNpZ25lZCBpbnQgYnVzcmFuZ2VbMl07CkBAIC0yMTQ1LDcgKzIxNDUsNyBAQAogCXJldHVybiAoeCA9PSB5KTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fc2NoaXpvX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUsIGludCBjaGlwX3R5cGUpCitzdGF0aWMgdm9pZCBfX3NjaGl6b19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lLCBpbnQgY2hpcF90eXBlKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwOwogCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OwpAQCAtMjIxMywxNyArMjIxMywxNyBAQAogCXNjaGl6b19wYm1faW5pdChwLCBub2RlLCBwb3J0aWQsIGNoaXBfdHlwZSk7CiB9CiAKLXZvaWQgX19pbml0IHNjaGl6b19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBzY2hpem9faW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKIHsKIAlfX3NjaGl6b19pbml0KG5vZGUsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfU0NISVpPKTsKIH0KIAotdm9pZCBfX2luaXQgc2NoaXpvX3BsdXNfaW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKK3ZvaWQgc2NoaXpvX3BsdXNfaW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKIHsKIAlfX3NjaGl6b19pbml0KG5vZGUsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfU0NISVpPX1BMVVMpOwogfQogCi12b2lkIF9faW5pdCB0b21hdGlsbG9faW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKK3ZvaWQgdG9tYXRpbGxvX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUpCiB7CiAJX19zY2hpem9faW5pdChub2RlLCBtb2RlbF9uYW1lLCBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDY2MjU1NDMuLjdkMTBiMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC02MDcsMTEgKzYwNyw2IEBACiAJc3RydWN0IHRocmVhZF9pbmZvICp0ID0gcC0+dGhyZWFkX2luZm87CiAJY2hhciAqY2hpbGRfdHJhcF9mcmFtZTsKIAotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCXAtPnRocmVhZC5zbXBfbG9ja19jb3VudCA9IDA7Ci0JcC0+dGhyZWFkLnNtcF9sb2NrX3BjID0gMDsKLSNlbmRpZgotCiAJLyogQ2FsY3VsYXRlIG9mZnNldCB0byBzdGFja19mcmFtZSAmIHB0X3JlZ3MgKi8KIAljaGlsZF90cmFwX2ZyYW1lID0gKChjaGFyICopdCkgKyAoVEhSRUFEX1NJWkUgLSAoVFJBQ0VSRUdfU1orU1RBQ0tGUkFNRV9TWikpOwogCW1lbWNweShjaGlsZF90cmFwX2ZyYW1lLCAoKChzdHJ1Y3Qgc3BhcmNfc3RhY2tmICopcmVncyktMSksIChUUkFDRVJFR19TWitTVEFDS0ZSQU1FX1NaKSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCmluZGV4IGQ4OWZjMjQuLmNiYjVlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCkBAIC0xMTUsMTcgKzExNSwxMiBAQAogCiAvKiB1c2VkIGJ5IHZhcmlvdXMgZHJpdmVycyAqLwogI2lmZGVmIENPTkZJR19TTVAKLSNpZm5kZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCiAvKiBPdXQgb2YgbGluZSBydy1sb2NraW5nIGltcGxlbWVudGF0aW9uLiAqLwogRVhQT1JUX1NZTUJPTChfX3JlYWRfbG9jayk7CiBFWFBPUlRfU1lNQk9MKF9fcmVhZF91bmxvY2spOwogRVhQT1JUX1NZTUJPTChfX3dyaXRlX2xvY2spOwogRVhQT1JUX1NZTUJPTChfX3dyaXRlX3VubG9jayk7CiBFWFBPUlRfU1lNQk9MKF9fd3JpdGVfdHJ5bG9jayk7Ci0vKiBPdXQgb2YgbGluZSBzcGluLWxvY2tpbmcgaW1wbGVtZW50YXRpb24uICovCi1FWFBPUlRfU1lNQk9MKF9yYXdfc3Bpbl9sb2NrKTsKLUVYUE9SVF9TWU1CT0woX3Jhd19zcGluX2xvY2tfZmxhZ3MpOwotI2VuZGlmCiAKIC8qIEhhcmQgSVJRIGxvY2tpbmcgKi8KIEVYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKQEAgLTQwMywxMiArMzk4LDMgQEAKIEVYUE9SVF9TWU1CT0woeG9yX3Zpc181KTsKIAogRVhQT1JUX1NZTUJPTChwcm9tX3BhbGV0dGUpOwotCi0vKiBtZW1vcnkgYmFycmllcnMgKi8KLUVYUE9SVF9TWU1CT0wobWIpOwotRVhQT1JUX1NZTUJPTChybWIpOwotRVhQT1JUX1NZTUJPTCh3bWIpOwotRVhQT1JUX1NZTUJPTChtZW1iYXJfc3RvcmVsb2FkKTsKLUVYUE9SVF9TWU1CT0wobWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKTsKLUVYUE9SVF9TWU1CT0wobWVtYmFyX3N0b3JlbG9hZF9sb2FkbG9hZCk7Ci1FWFBPUlRfU1lNQk9MKG1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N1bm9zX2lvY3RsMzIuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3Vub3NfaW9jdGwzMi5jCmluZGV4IDg3YzFhZWIuLjc2NTRiOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3Vub3NfaW9jdGwzMi5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3Vub3NfaW9jdGwzMi5jCkBAIC0xNTIsMTEgKzE1MiwxMiBAQAogCQlyZXQgPSBjb21wYXRfc3lzX2lvY3RsKGZkLCBTSU9DR0lGQ09ORiwgYXJnKTsKIAkJZ290byBvdXQ7CiAKLQljYXNlIF9JT1coJ2knLCAyMSwgc3RydWN0IGlmcmVxKTogLyogU0lPQ1NJRk1UVSAqLwotCQlyZXQgPSBzeXNfaW9jdGwoZmQsIFNJT0NTSUZNVFUsIGFyZyk7CisJY2FzZSBfSU9XKCdpJywgMjEsIHN0cnVjdCBpZnJlcTMyKToKKwkJcmV0ID0gY29tcGF0X3N5c19pb2N0bChmZCwgU0lPQ1NJRk1UVSwgYXJnKTsKIAkJZ290byBvdXQ7Ci0JY2FzZSBfSU9XUignaScsIDIyLCBzdHJ1Y3QgaWZyZXEpOiAvKiBTSU9DR0lGTVRVICovCi0JCXJldCA9IHN5c19pb2N0bChmZCwgU0lPQ0dJRk1UVSwgYXJnKTsKKworCWNhc2UgX0lPV1IoJ2knLCAyMiwgc3RydWN0IGlmcmVxMzIpOgorCQlyZXQgPSBjb21wYXRfc3lzX2lvY3RsKGZkLCBTSU9DR0lGTVRVLCBhcmcpOwogCQlnb3RvIG91dDsKIAogCWNhc2UgX0lPV1IoJ2knLCAyMywgc3RydWN0IGlmcmVxMzIpOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jCmluZGV4IDFkM2FhNTguLjdmNjIzOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYzMyLmMKQEAgLTEwMDIsMjkgKzEwMDIsNyBAQAogYXNtbGlua2FnZSBsb25nIHNwYXJjMzJfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCiAJCQkgICAgIGludCBmbGFncywgaW50IG1vZGUpCiB7Ci0JY2hhciAqIHRtcDsKLQlpbnQgZmQsIGVycm9yOwotCi0JdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7Ci0JZmQgPSBQVFJfRVJSKHRtcCk7Ci0JaWYgKCFJU19FUlIodG1wKSkgewotCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCXN0cnVjdCBmaWxlICogZiA9IGZpbHBfb3Blbih0bXAsIGZsYWdzLCBtb2RlKTsKLQkJCWVycm9yID0gUFRSX0VSUihmKTsKLQkJCWlmIChJU19FUlIoZikpCi0JCQkJZ290byBvdXRfZXJyb3I7Ci0JCQlmZF9pbnN0YWxsKGZkLCBmKTsKLQkJfQotb3V0OgotCQlwdXRuYW1lKHRtcCk7Ci0JfQotCXJldHVybiBmZDsKLQotb3V0X2Vycm9yOgotCXB1dF91bnVzZWRfZmQoZmQpOwotCWZkID0gZXJyb3I7Ci0JZ290byBvdXQ7CisJcmV0dXJuIGRvX3N5c19vcGVuKGZpbGVuYW1lLCBmbGFncywgbW9kZSk7CiB9CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCmluZGV4IDM2MmI5YzIuLjNmMDhhMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCkBAIC00NDksNyArNDQ5LDcgQEAKIAlzdGF0aWMgbG9uZyBsYXN0X3J0Y191cGRhdGU7CiAKIAkvKiBEZXRlcm1pbmUgd2hlbiB0byB1cGRhdGUgdGhlIE1vc3RlayBjbG9jay4gKi8KLQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCWlmIChudHBfc3luY2VkKCkgJiYKIAkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDk1MDQyM2QuLmY0N2QwYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE3LDYgKzE3LDcgQEAKICAgICAqKC50ZXh0KQogICAgIFNDSEVEX1RFWFQKICAgICBMT0NLX1RFWFQKKyAgICBLUFJPQkVTX1RFWFQKICAgICAqKC5nbnUud2FybmluZykKICAgfSA9MAogICBfZXRleHQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKaW5kZXggNjIwMWYxMC4uZDk2OGFlYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCkBAIC0xMiw5ICsxMiw4IEBACiAJIFUxbWVtY3B5Lm8gVTFjb3B5X2Zyb21fdXNlci5vIFUxY29weV90b191c2VyLm8gXAogCSBVM21lbWNweS5vIFUzY29weV9mcm9tX3VzZXIubyBVM2NvcHlfdG9fdXNlci5vIFUzcGF0Y2gubyBcCiAJIGNvcHlfaW5fdXNlci5vIHVzZXJfZml4dXAubyBtZW1tb3ZlLm8gXAotCSBtY291bnQubyBpcGNzdW0ubyByd3NlbS5vIHhvci5vIGZpbmRfYml0Lm8gZGVsYXkubyBtYi5vCisJIG1jb3VudC5vIGlwY3N1bS5vIHJ3c2VtLm8geG9yLm8gZmluZF9iaXQubyBkZWxheS5vCiAKLWxpYi0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0gZGVidWdsb2Nrcy5vCiBsaWItJChDT05GSUdfSEFWRV9ERUNfTE9DSykgKz0gZGVjX2FuZF9sb2NrLm8KIAogb2JqLXkgKz0gaW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWJ1Z2xvY2tzLmMgYi9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmMGI1NS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKiAkSWQ6IGRlYnVnbG9ja3MuYyx2IDEuOSAyMDAxLzExLzE3IDAwOjEwOjQ4IGRhdmVtIEV4cCAkCi0gKiBkZWJ1Z2xvY2tzLmM6IERlYnVnZ2luZyB2ZXJzaW9ucyBvZiBTTVAgbG9ja2luZyBwcmltaXRpdmVzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93IChjaGFyICpzdHIsIHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4eCwgb3duZXIgUEMoJTA4eCk6Q1BVKCV4KVxuIiwKLQkgICAgICAgc3RyLCBsb2NrLCBjcHUsICh1bnNpZ25lZCBpbnQpIGNhbGxlciwKLQkgICAgICAgbG9jay0+b3duZXJfcGMsIGxvY2stPm93bmVyX2NwdSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3JlYWQgKGNoYXIgKnN0ciwgcndsb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlwcmludGsoIiVzKCVwKSBDUFUjJWQgc3R1Y2sgYXQgJTA4eCwgd3JpdGVyIFBDKCUwOHgpOkNQVSgleClcbiIsCi0JICAgICAgIHN0ciwgbG9jaywgY3B1LCAodW5zaWduZWQgaW50KSBjYWxsZXIsCi0JICAgICAgIGxvY2stPndyaXRlcl9wYywgbG9jay0+d3JpdGVyX2NwdSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3dyaXRlIChjaGFyICpzdHIsIHJ3bG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBpOwotCi0JcHJpbnRrKCIlcyglcCkgQ1BVIyVkIHN0dWNrIGF0ICUwOHhcbiIsCi0JICAgICAgIHN0ciwgbG9jaywgY3B1LCAodW5zaWduZWQgaW50KSBjYWxsZXIpOwotCXByaW50aygiV3JpdGVyOiBQQyglMDh4KTpDUFUoJXgpXG4iLAotCSAgICAgICBsb2NrLT53cml0ZXJfcGMsIGxvY2stPndyaXRlcl9jcHUpOwotCXByaW50aygiUmVhZGVyczoiKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQotCQlpZiAobG9jay0+cmVhZGVyX3BjW2ldKQotCQkJcHJpbnRrKCIgJWRbJTA4eF0iLCBpLCBsb2NrLT5yZWFkZXJfcGNbaV0pOwotCXByaW50aygiXG4iKTsKLX0KLQotI3VuZGVmIElOSVRfU1RVQ0sKLSNkZWZpbmUgSU5JVF9TVFVDSyAxMDAwMDAwMDAKLQotdm9pZCBfZG9fc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCWludCBzaG93biA9IDA7Ci0KLWFnYWluOgotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHN0dWIgWyUxXSwgJTAiCi0JCQkgICAgIDogIj1yIiAodmFsKQotCQkJICAgICA6ICJyIiAoJihsb2NrLT5sb2NrKSkKLQkJCSAgICAgOiAibWVtb3J5Iik7Ci0JbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKCk7Ci0JaWYgKHZhbCkgewotCQl3aGlsZSAobG9jay0+bG9jaykgewotCQkJaWYgKCEtLXN0dWNrKSB7Ci0JCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQkJc2hvdyhzdHIsIGxvY2ssIGNhbGxlcik7Ci0JCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQkJfQotCQkJcm1iKCk7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9Ci0JbG9jay0+b3duZXJfcGMgPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCWxvY2stPm93bmVyX2NwdSA9IGNwdTsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfY291bnQrKzsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfcGMgPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCi0JcHV0X2NwdSgpOwotfQotCi1pbnQgX2RvX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkc3R1YiBbJTFdLCAlMCIKLQkJCSAgICAgOiAiPXIiICh2YWwpCi0JCQkgICAgIDogInIiICgmKGxvY2stPmxvY2spKQotCQkJICAgICA6ICJtZW1vcnkiKTsKLQltZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUoKTsKLQlpZiAoIXZhbCkgewotCQlsb2NrLT5vd25lcl9wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0JCWxvY2stPm93bmVyX2NwdSA9IGNwdTsKLQkJY3VycmVudC0+dGhyZWFkLnNtcF9sb2NrX2NvdW50Kys7Ci0JCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0JfQotCi0JcHV0X2NwdSgpOwotCi0JcmV0dXJuIHZhbCA9PSAwOwotfQotCi12b2lkIF9kb19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQotewotCWxvY2stPm93bmVyX3BjID0gMDsKLQlsb2NrLT5vd25lcl9jcHUgPSBOT19QUk9DX0lEOwotCW1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZSgpOwotCWxvY2stPmxvY2sgPSAwOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19jb3VudC0tOwotfQotCi0vKiBLZWVwIElOSVRfU1RVQ0sgdGhlIHNhbWUuLi4gKi8KLQotdm9pZCBfZG9fcmVhZF9sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgc3R1Y2sgPSBJTklUX1NUVUNLOwotCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0JaW50IHNob3duID0gMDsKLQotd2xvY2tfYWdhaW46Ci0JLyogV2FpdCBmb3IgYW55IHdyaXRlciB0byBnbyBhd2F5LiAgKi8KLQl3aGlsZSAoKChsb25nKShydy0+bG9jaykpIDwgMCkgewotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd19yZWFkKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJcm1iKCk7Ci0JfQotCS8qIFRyeSBvbmNlIHRvIGluY3JlbWVudCB0aGUgY291bnRlci4gICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCWxkeAkJWyUwXSwgJSVnMVxuIgotIglicmx6LGEscG4JJSVnMSwgMmZcbiIKLSIJIG1vdgkJMSwgJTBcbiIKLSIJYWRkCQklJWcxLCAxLCAlJWc3XG4iCi0iCWNhc3gJCVslMF0sICUlZzEsICUlZzdcbiIKLSIJc3ViCQklJWcxLCAlJWc3LCAlMFxuIgotIjI6Igk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0JbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKCk7Ci0JaWYgKHZhbCkKLQkJZ290byB3bG9ja19hZ2FpbjsKLQlydy0+cmVhZGVyX3BjW2NwdV0gPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19jb3VudCsrOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0KLQlwdXRfY3B1KCk7Ci19Ci0KLXZvaWQgX2RvX3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgc3R1Y2sgPSBJTklUX1NUVUNLOwotCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0JaW50IHNob3duID0gMDsKLQotCS8qIERyb3Agb3VyIGlkZW50aXR5IF9maXJzdF8uICovCi0JcnctPnJlYWRlcl9wY1tjcHVdID0gMDsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfY291bnQtLTsKLXJ1bmxvY2tfYWdhaW46Ci0JLyogU3BpbiB0cnlpbmcgdG8gZGVjcmVtZW50IHRoZSBjb3VudGVyIHVzaW5nIGNhc3guICAqLwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZFxuIgotIglsZHgJWyUwXSwgJSVnMVxuIgotIglzdWIJJSVnMSwgMSwgJSVnN1xuIgotIgljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIglzdWIJJSVnMSwgJSVnNywgJTBcbiIKLQk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0JaWYgKHZhbCkgewotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd19yZWFkKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJZ290byBydW5sb2NrX2FnYWluOwotCX0KLQotCXB1dF9jcHUoKTsKLX0KLQotdm9pZCBfZG9fd3JpdGVfbG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCWludCBzaG93biA9IDA7Ci0KLXdsb2NrX2FnYWluOgotCS8qIFNwaW4gd2hpbGUgdGhlcmUgaXMgYW5vdGhlciB3cml0ZXIuICovCi0Jd2hpbGUgKCgobG9uZylydy0+bG9jaykgPCAwKSB7Ci0JCWlmICghLS1zdHVjaykgewotCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQlzaG93X3dyaXRlKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJcm1iKCk7Ci0JfQotCi0JLyogVHJ5IHRvIGFjdWlyZSB0aGUgd3JpdGUgYml0LiAgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLSIJbW92CTEsICUlZzNcbiIKLSIJc2xseAklJWczLCA2MywgJSVnM1xuIgotIglsZHgJWyUwXSwgJSVnMVxuIgotIglicmx6LHBuCSUlZzEsIDFmXG4iCi0iCSBvcgklJWcxLCAlJWczLCAlJWc3XG4iCi0iCWNhc3gJWyUwXSwgJSVnMSwgJSVnN1xuIgotIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCi0iCWJhLHB0CSUleGNjLCAyZlxuIgotIgkgc3ViCSUlZzEsICUlZzcsICUwXG4iCi0iMToJbW92CTEsICUwXG4iCi0iMjoiCTogIj1yIiAodmFsKQotCTogIjAiICgmKHJ3LT5sb2NrKSkKLQk6ICJnMyIsICJnMSIsICJnNyIsICJtZW1vcnkiKTsKLQlpZiAodmFsKSB7Ci0JCS8qIFdlIGNvdWxkbid0IGdldCB0aGUgd3JpdGUgYml0LiAqLwotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd193cml0ZShzdHIsIHJ3LCBjYWxsZXIpOwotCQkJc3R1Y2sgPSBJTklUX1NUVUNLOwotCQl9Ci0JCWdvdG8gd2xvY2tfYWdhaW47Ci0JfQotCWlmICgocnctPmxvY2sgJiAoKDFVTDw8NjMpLTFVTCkpICE9IDBVTCkgewotCQkvKiBSZWFkZXJzIHN0aWxsIGFyb3VuZCwgZHJvcCB0aGUgd3JpdGUKLQkJICogbG9jaywgc3BpbiwgYW5kIHRyeSBhZ2Fpbi4KLQkJICovCi0JCWlmICghLS1zdHVjaykgewotCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQlzaG93X3dyaXRlKHN0ciwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCQltb3YJMSwgJSVnM1xuIgotIgkJc2xseAklJWczLCA2MywgJSVnM1xuIgotIjE6CQlsZHgJWyUwXSwgJSVnMVxuIgotIgkJYW5kbgklJWcxLCAlJWczLCAlJWc3XG4iCi0iCQljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJCWNtcAklJWcxLCAlJWc3XG4iCi0iCQltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCi0iCQlibmUscG4JJSV4Y2MsIDFiXG4iCi0iCQkgbm9wIgotCQk6IC8qIG5vIG91dHB1dHMgKi8KLQkJOiAiciIgKCYocnctPmxvY2spKQotCQk6ICJnMyIsICJnMSIsICJnNyIsICJjYyIsICJtZW1vcnkiKTsKLQkJd2hpbGUocnctPmxvY2sgIT0gMCkgewotCQkJaWYgKCEtLXN0dWNrKSB7Ci0JCQkJaWYgKHNob3duKysgPD0gMikKLQkJCQkJc2hvd193cml0ZShzdHIsIHJ3LCBjYWxsZXIpOwotCQkJCXN0dWNrID0gSU5JVF9TVFVDSzsKLQkJCX0KLQkJCXJtYigpOwotCQl9Ci0JCWdvdG8gd2xvY2tfYWdhaW47Ci0JfQotCi0JLyogV2UgaGF2ZSBpdCwgc2F5IHdobyB3ZSBhcmUuICovCi0JcnctPndyaXRlcl9wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0JcnctPndyaXRlcl9jcHUgPSBjcHU7Ci0JY3VycmVudC0+dGhyZWFkLnNtcF9sb2NrX2NvdW50Kys7Ci0JY3VycmVudC0+dGhyZWFkLnNtcF9sb2NrX3BjID0gKCh1bnNpZ25lZCBpbnQpY2FsbGVyKTsKLQotCXB1dF9jcHUoKTsKLX0KLQotdm9pZCBfZG9fd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydywgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHN0dWNrID0gSU5JVF9TVFVDSzsKLQlpbnQgc2hvd24gPSAwOwotCi0JLyogRHJvcCBvdXIgaWRlbnRpdHkgX2ZpcnN0XyAqLwotCXJ3LT53cml0ZXJfcGMgPSAwOwotCXJ3LT53cml0ZXJfY3B1ID0gTk9fUFJPQ19JRDsKLQljdXJyZW50LT50aHJlYWQuc21wX2xvY2tfY291bnQtLTsKLXdsb2NrX2FnYWluOgotCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZFxuIgotIgltb3YJMSwgJSVnM1xuIgotIglzbGx4CSUlZzMsIDYzLCAlJWczXG4iCi0iCWxkeAlbJTBdLCAlJWcxXG4iCi0iCWFuZG4JJSVnMSwgJSVnMywgJSVnN1xuIgotIgljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIglzdWIJJSVnMSwgJSVnNywgJTBcbiIKLQk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzMiLCAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0JaWYgKHZhbCkgewotCQlpZiAoIS0tc3R1Y2spIHsKLQkJCWlmIChzaG93bisrIDw9IDIpCi0JCQkJc2hvd193cml0ZSgid3JpdGVfdW5sb2NrIiwgcncsIGNhbGxlcik7Ci0JCQlzdHVjayA9IElOSVRfU1RVQ0s7Ci0JCX0KLQkJZ290byB3bG9ja19hZ2FpbjsKLQl9Ci19Ci0KLWludCBfZG9fd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IGNwdSA9IGdldF9jcHUoKTsKLQotCS8qIFRyeSB0byBhY3VpcmUgdGhlIHdyaXRlIGJpdC4gICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCW1vdgkxLCAlJWczXG4iCi0iCXNsbHgJJSVnMywgNjMsICUlZzNcbiIKLSIJbGR4CVslMF0sICUlZzFcbiIKLSIJYnJseixwbgklJWcxLCAxZlxuIgotIgkgb3IJJSVnMSwgJSVnMywgJSVnN1xuIgotIgljYXN4CVslMF0sICUlZzEsICUlZzdcbiIKLSIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIgliYSxwdAklJXhjYywgMmZcbiIKLSIJIHN1YgklJWcxLCAlJWc3LCAlMFxuIgotIjE6CW1vdgkxLCAlMFxuIgotIjI6Igk6ICI9ciIgKHZhbCkKLQk6ICIwIiAoJihydy0+bG9jaykpCi0JOiAiZzMiLCAiZzEiLCAiZzciLCAibWVtb3J5Iik7Ci0KLQlpZiAodmFsKSB7Ci0JCXB1dF9jcHUoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKChydy0+bG9jayAmICgoMVVMPDw2MyktMVVMKSkgIT0gMFVMKSB7Ci0JCS8qIFJlYWRlcnMgc3RpbGwgYXJvdW5kLCBkcm9wIHRoZSB3cml0ZQotCQkgKiBsb2NrLCByZXR1cm4gZmFpbHVyZS4KLQkJICovCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgkJbW92CTEsICUlZzNcbiIKLSIJCXNsbHgJJSVnMywgNjMsICUlZzNcbiIKLSIxOgkJbGR4CVslMF0sICUlZzFcbiIKLSIJCWFuZG4JJSVnMSwgJSVnMywgJSVnN1xuIgotIgkJY2FzeAlbJTBdLCAlJWcxLCAlJWc3XG4iCi0iCQljbXAJJSVnMSwgJSVnN1xuIgotIgkJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgotIgkJYm5lLHBuCSUleGNjLCAxYlxuIgotIgkJIG5vcCIKLQkJOiAvKiBubyBvdXRwdXRzICovCi0JCTogInIiICgmKHJ3LT5sb2NrKSkKLQkJOiAiZzMiLCAiZzEiLCAiZzciLCAiY2MiLCAibWVtb3J5Iik7Ci0KLQkJcHV0X2NwdSgpOwotCi0JCXJldHVybiAwOwotCX0KLQotCS8qIFdlIGhhdmUgaXQsIHNheSB3aG8gd2UgYXJlLiAqLwotCXJ3LT53cml0ZXJfcGMgPSAoKHVuc2lnbmVkIGludCljYWxsZXIpOwotCXJ3LT53cml0ZXJfY3B1ID0gY3B1OwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19jb3VudCsrOwotCWN1cnJlbnQtPnRocmVhZC5zbXBfbG9ja19wYyA9ICgodW5zaWduZWQgaW50KWNhbGxlcik7Ci0KLQlwdXRfY3B1KCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvbWIuUyBiL2FyY2gvc3BhcmM2NC9saWIvbWIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwNGY3NC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL21iLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBtYi5TOiBPdXQgb2YgbGluZSBtZW1vcnkgYmFycmllcnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKLSAqLwotCi0JLyogVGhlc2UgYXJlIGhlcmUgaW4gYW4gZWZmb3J0IHRvIG1vcmUgZnVsbHkgd29yayBhcm91bmQKLQkgKiBTcGl0ZmlyZSBFcnJhdGEgIzUxLiAgRXNzZW50aWFsbHksIGlmIGEgbWVtb3J5IGJhcnJpZXIKLQkgKiBvY2N1cnMgc29vbiBhZnRlciBhIG1pc3ByZWRpY3RlZCBicmFuY2gsIHRoZSBjaGlwIGNhbiBzdG9wCi0JICogZXhlY3V0aW5nIGluc3RydWN0aW9ucyB1bnRpbCBhIHRyYXAgb2NjdXJzLiAgVGhlcmVmb3JlLCBpZgotCSAqIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgY2hpcCBjYW4gaGFuZyBmb3JldmVyLgotCSAqCi0JICogSXQgdXNlZCB0byBiZSBiZWxpZXZlZCB0aGF0IHRoZSBtZW1vcnkgYmFycmllciBoYWQgdG8gYmUKLQkgKiByaWdodCBpbiB0aGUgZGVsYXkgc2xvdCwgYnV0IGEgY2FzZSBoYXMgYmVlbiB0cmFjZWQKLQkgKiByZWNlbnRseSB3aGVyZWluIHRoZSBtZW1vcnkgYmFycmllciB3YXMgb25lIGluc3RydWN0aW9uCi0JICogYWZ0ZXIgdGhlIGJyYW5jaCBkZWxheSBzbG90IGFuZCB0aGUgY2hpcCBzdGlsbCBodW5nLiAgVGhlCi0JICogb2ZmZW5kaW5nIHNlcXVlbmNlIHdhcyB0aGUgZm9sbG93aW5nIGluIHN5bV93YWtldXBfZG9uZSgpCi0JICogb2YgdGhlIHN5bTUzYzh4eF8yIGRyaXZlcjoKLQkgKgotCSAqCWNhbGwJc3ltX2NjYl9mcm9tX2RzYSwgMAotCSAqCSBtb3ZnZQklaWNjLCAwLCAlbDAKLQkgKglicnoscG4JJW8wLCAuTEwxMzAzCi0JICoJIG1vdgklbzAsICVsMgotCSAqCW1lbWJhcgkjTG9hZExvYWQKLQkgKgotCSAqIFRoZSBicmFuY2ggaGFzIHRvIGJlIG1pc3ByZWRpY3RlZCBmb3IgdGhlIGJ1ZyB0byBvY2N1ci4KLQkgKiBUaGVyZWZvcmUsIHdlIHB1dCB0aGUgbWVtb3J5IGJhcnJpZXIgZXhwbGljaXRseSBpbnRvIGEKLQkgKiAiYnJhbmNoIGFsd2F5cywgcHJlZGljdGVkIHRha2VuIiBkZWxheSBzbG90IHRvIGF2b2lkIHRoZQotCSAqIHByb2JsZW0gY2FzZS4KLQkgKi8KLQotCS50ZXh0Ci0KLTk5OglyZXRsCi0JIG5vcAotCi0JLmdsb2JsCW1iCi1tYjoJYmEscHQJJXhjYywgOTliCi0JIG1lbWJhcgkjTG9hZExvYWQgfCAjTG9hZFN0b3JlIHwgI1N0b3JlU3RvcmUgfCAjU3RvcmVMb2FkCi0JLnNpemUJbWIsIC4tbWIKLQotCS5nbG9ibAlybWIKLXJtYjoJYmEscHQJJXhjYywgOTliCi0JIG1lbWJhcgkjTG9hZExvYWQKLQkuc2l6ZQlybWIsIC4tcm1iCi0KLQkuZ2xvYmwJd21iCi13bWI6CWJhLHB0CSV4Y2MsIDk5YgotCSBtZW1iYXIJI1N0b3JlU3RvcmUKLQkuc2l6ZQl3bWIsIC4td21iCi0KLQkuZ2xvYmwJbWVtYmFyX3N0b3JlbG9hZAotbWVtYmFyX3N0b3JlbG9hZDoKLQliYSxwdAkleGNjLCA5OWIKLQkgbWVtYmFyCSNTdG9yZUxvYWQKLQkuc2l6ZQltZW1iYXJfc3RvcmVsb2FkLCAuLW1lbWJhcl9zdG9yZWxvYWQKLQotCS5nbG9ibAltZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUKLW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZToKLQliYSxwdAkleGNjLCA5OWIKLQkgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQotCS5zaXplCW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSwgLi1tZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUKLQotCS5nbG9ibAltZW1iYXJfc3RvcmVsb2FkX2xvYWRsb2FkCi1tZW1iYXJfc3RvcmVsb2FkX2xvYWRsb2FkOgotCWJhLHB0CSV4Y2MsIDk5YgotCSBtZW1iYXIJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZAotCS5zaXplCW1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQsIC4tbWVtYmFyX3N0b3JlbG9hZF9sb2FkbG9hZAotCi0JLmdsb2JsCW1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZQotbWVtYmFyX3N0b3Jlc3RvcmVfbG9hZHN0b3JlOgotCWJhLHB0CSV4Y2MsIDk5YgotCSBtZW1iYXIJI1N0b3JlU3RvcmUgfCAjTG9hZFN0b3JlCi0JLnNpemUJbWVtYmFyX3N0b3Jlc3RvcmVfbG9hZHN0b3JlLCAuLW1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMgYi9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYwppbmRleCA1MmU5Mzc1Li5kYjFlMzMxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTExNyw4ICsxMTgsOSBAQAogCXJldHVybiB0YWxseTsKIH0KIAotc3RhdGljIHZvaWQgdW5oYW5kbGVkX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgdW5oYW5kbGVkX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3MgPCBQQUdFX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIE5VTEwgIgpAQCAtMzA0LDcgKzMwNiw3IEBACiAJdW5oYW5kbGVkX2ZhdWx0IChhZGRyZXNzLCBjdXJyZW50LCByZWdzKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX3NwYXJjNjRfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQgX19rcHJvYmVzIGRvX3NwYXJjNjRfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCmluZGV4IDNmYmFmMzQuLmZkYjFlYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2hlYWQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0yNTAsNyArMjUxLDcgQEAKIAlwdXRfY3B1KCk7CiB9CiAKLXZvaWQgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQordm9pZCBfX2twcm9iZXMgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCS8qIENoZWV0YWggaGFzIGNvaGVyZW50IEktY2FjaGUuICovCiAJaWYgKHRsYl90eXBlID09IHNwaXRmaXJlKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vdWx0cmEuUyBiL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCmluZGV4IDhkZmE4MjUuLmIyZWU5YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCisrKyBiL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCkBAIC0xMTksNiArMTE5LDcgQEAKICNlbHNlCiAjZXJyb3IgdW5zdXBwb3J0ZWQgUEFHRV9TSVpFCiAjZW5kaWYKKwkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCiAJLmFsaWduCQkzMgogCS5nbG9ibAkJX19mbHVzaF9pY2FjaGVfcGFnZQogX19mbHVzaF9pY2FjaGVfcGFnZToJLyogJW8wID0gcGh5c19wYWdlICovCkBAIC0yMDEsNiArMjAyLDcgQEAKIAkgbm9wCiAjZW5kaWYgLyogRENBQ0hFX0FMSUFTSU5HX1BPU1NJQkxFICovCiAKKwkucHJldmlvdXMgLnRleHQKIAkuYWxpZ24JCTMyCiBfX3ByZWZpbGxfZHRsYjoKIAlyZHByCQklcHN0YXRlLCAlZzcKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2lvY3RsLmMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9pb2N0bC5jCmluZGV4IGNhYzBhMWMuLmJlMGEwNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2lvY3RsLmMKKysrIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvaW9jdGwuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0yOTMsMTYgKzI5NCwxOCBAQAogc3RhdGljIGlubGluZSBpbnQgc29sYXJpc19zb2NrbW9kKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdTMyIGFyZykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlubzsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCS8qIEkgd29uZGVyIHdoaWNoIG9mIHRoZXNlIHRlc3RzIGFyZSBzdXBlcmZsdW91cy4uLiAtLXBhdHJpayAqLwotCXNwaW5fbG9jaygmY3VycmVudC0+ZmlsZXMtPmZpbGVfbG9jayk7Ci0JaWYgKCEgY3VycmVudC0+ZmlsZXMtPmZkW2ZkXSB8fAotCSAgICAhIGN1cnJlbnQtPmZpbGVzLT5mZFtmZF0tPmZfZGVudHJ5IHx8Ci0JICAgICEgKGlubyA9IGN1cnJlbnQtPmZpbGVzLT5mZFtmZF0tPmZfZGVudHJ5LT5kX2lub2RlKSB8fAorCXJjdV9yZWFkX2xvY2soKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlpZiAoISBmZHQtPmZkW2ZkXSB8fAorCSAgICAhIGZkdC0+ZmRbZmRdLT5mX2RlbnRyeSB8fAorCSAgICAhIChpbm8gPSBmZHQtPmZkW2ZkXS0+Zl9kZW50cnktPmRfaW5vZGUpIHx8CiAJICAgICEgU19JU1NPQ0soaW5vLT5pX21vZGUpKSB7Ci0JCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiBUQkFERjsKIAl9Ci0Jc3Bpbl91bmxvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCQogCXN3aXRjaCAoY21kICYgMHhmZikgewogCWNhc2UgMTA5OiAvKiBTSV9TT0NLUEFSQU1TICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy90aW1vZC5jIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvdGltb2QuYwppbmRleCAwMjJjODBmLi5hYWFkMjljIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvc29sYXJpcy90aW1vZC5jCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL3RpbW9kLmMKQEAgLTE0Myw5ICsxNDMsMTEgQEAKIHN0YXRpYyB2b2lkIHRpbW9kX3dha2Vfc29ja2V0KHVuc2lnbmVkIGludCBmZCkKIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlTT0xEKCJ3YWtlaW5nIHNvY2tldCIpOwotCXNvY2sgPSBTT0NLRVRfSShjdXJyZW50LT5maWxlcy0+ZmRbZmRdLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJc29jayA9IFNPQ0tFVF9JKGZkdC0+ZmRbZmRdLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb2NrLT53YWl0KTsKIAlyZWFkX2xvY2soJnNvY2stPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAlpZiAoc29jay0+ZmFzeW5jX2xpc3QgJiYgIXRlc3RfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzb2NrLT5mbGFncykpCkBAIC0xNTcsOSArMTU5LDExIEBACiBzdGF0aWMgdm9pZCB0aW1vZF9xdWV1ZSh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBUX3ByaW1zZyAqaXQpCiB7CiAJc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICpzb2NrOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlTT0xEKCJxdWV1aW5nIHByaW1zZyIpOwotCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopY3VycmVudC0+ZmlsZXMtPmZkW2ZkXS0+cHJpdmF0ZV9kYXRhOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopZmR0LT5mZFtmZF0tPnByaXZhdGVfZGF0YTsKIAlpdC0+bmV4dCA9IHNvY2stPnBmaXJzdDsKIAlzb2NrLT5wZmlyc3QgPSBpdDsKIAlpZiAoIXNvY2stPnBsYXN0KQpAQCAtMTcxLDkgKzE3NSwxMSBAQAogc3RhdGljIHZvaWQgdGltb2RfcXVldWVfZW5kKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IFRfcHJpbXNnICppdCkKIHsKIAlzdHJ1Y3Qgc29sX3NvY2tldF9zdHJ1Y3QgKnNvY2s7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCVNPTEQoInF1ZXVpbmcgcHJpbXNnIGF0IGVuZCIpOwotCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopY3VycmVudC0+ZmlsZXMtPmZkW2ZkXS0+cHJpdmF0ZV9kYXRhOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopZmR0LT5mZFtmZF0tPnByaXZhdGVfZGF0YTsKIAlpdC0+bmV4dCA9IE5VTEw7CiAJaWYgKHNvY2stPnBsYXN0KQogCQlzb2NrLT5wbGFzdC0+bmV4dCA9IGl0OwpAQCAtMzQ0LDYgKzM1MCw3IEBACiAJY2hhciAqYnVmOwogCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAJc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICpzb2NrOwogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKIAlsb25nIGFyZ3NbNl07CkBAIC0zNTEsNyArMzU4LDkgQEAKIAkJKGludCAoKikoaW50LCB1bnNpZ25lZCBsb25nIF9fdXNlciAqKSlTWVMoc29ja2V0Y2FsbCk7CiAJaW50ICgqc3lzX3NlbmR0bykoaW50LCB2b2lkIF9fdXNlciAqLCBzaXplX3QsIHVuc2lnbmVkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIGludCkgPQogCQkoaW50ICgqKShpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCwgdW5zaWduZWQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgaW50KSlTWVMoc2VuZHRvKTsKLQlmaWxwID0gY3VycmVudC0+ZmlsZXMtPmZkW2ZkXTsKKworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCWZpbHAgPSBmZHQtPmZkW2ZkXTsKIAlpbm8gPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlzb2NrID0gKHN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKIAlTT0xEKCJlbnRyeSIpOwpAQCAtNjIwLDYgKzYyOSw3IEBACiAJaW50IG9sZGZsYWdzOwogCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAJc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICpzb2NrOwogCXN0cnVjdCBUX3VuaXRkYXRhX2luZCB1ZGk7CiAJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwpAQCAtNjMyLDcgKzY0Miw4IEBACiAJCiAJU09MRCgiZW50cnkiKTsKIAlTT0xERCgoIiV1ICVwICVkICVwICVwICVkICVwICVkXG4iLCBmZCwgY3RsX2J1ZiwgY3RsX21heGxlbiwgY3RsX2xlbiwgZGF0YV9idWYsIGRhdGFfbWF4bGVuLCBkYXRhX2xlbiwgKmZsYWdzX3ApKTsKLQlmaWxwID0gY3VycmVudC0+ZmlsZXMtPmZkW2ZkXTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlmaWxwID0gZmR0LT5mZFtmZF07CiAJaW5vID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJc29jayA9IChzdHJ1Y3Qgc29sX3NvY2tldF9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CiAJU09MREQoKCIlcCAlcFxuIiwgc29jay0+cGZpcnN0LCBzb2NrLT5wZmlyc3QgPyBzb2NrLT5wZmlyc3QtPm5leHQgOiBOVUxMKSk7CkBAIC04NDQsMTIgKzg1NSwxNCBAQAogCWludCBfX3VzZXIgKmZsZ3B0cjsKIAlpbnQgZmxhZ3M7CiAJaW50IGVycm9yID0gLUVCQURGOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlTT0xEKCJlbnRyeSIpOwogCWxvY2tfa2VybmVsKCk7CiAJaWYoZmQgPj0gTlJfT1BFTikgZ290byBvdXQ7CiAKLQlmaWxwID0gY3VycmVudC0+ZmlsZXMtPmZkW2ZkXTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlmaWxwID0gZmR0LT5mZFtmZF07CiAJaWYoIWZpbHApIGdvdG8gb3V0OwogCiAJaW5vID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CkBAIC05MTAsMTIgKzkyMywxNCBAQAogCXN0cnVjdCBzdHJidWYgY3RsLCBkYXQ7CiAJaW50IGZsYWdzID0gKGludCkgYXJnMzsKIAlpbnQgZXJyb3IgPSAtRUJBREY7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCVNPTEQoImVudHJ5Iik7CiAJbG9ja19rZXJuZWwoKTsKIAlpZihmZCA+PSBOUl9PUEVOKSBnb3RvIG91dDsKIAotCWZpbHAgPSBjdXJyZW50LT5maWxlcy0+ZmRbZmRdOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCWZpbHAgPSBmZHQtPmZkW2ZkXTsKIAlpZighZmlscCkgZ290byBvdXQ7CiAKIAlpbm8gPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IGIxNWY2MDQuLjE1NDgwM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUKKysrIGIvYXJjaC91bS9NYWtlZmlsZQpAQCAtMTAzLDcgKzEwMyw2IEBACiAKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKICQoc2hlbGwgbWtkaXIgLXAgJChBUkNIX0RJUikgJiYgbG4gLWZzbiAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL0tjb25maWcuJChTVUJBUkNIKSAkKEFSQ0hfRElSKS9LY29uZmlnLmFyY2gpCi1DTEVBTl9GSUxFUyArPSAkKEFSQ0hfRElSKS9LY29uZmlnLmFyY2gKIGVsc2UKICQoc2hlbGwgY2QgJChBUkNIX0RJUikgJiYgbG4gLXNmIEtjb25maWcuJChTVUJBUkNIKSBLY29uZmlnLmFyY2gpCiBlbmRpZgpAQCAtMTQ0LDE0ICsxNDMsMTQgQEAKICNUVCBvciBza2FzIG1ha2VmaWxlcyBhbmQgZG9uJ3QgY2xlYW4gc2thc19wdHJlZ3MuaC4KIENMRUFOX0ZJTEVTICs9IGxpbnV4IHguaSBnbW9uLm91dCAkKEFSQ0hfRElSKS9pbmNsdWRlL3VtbC1jb25maWcuaCBcCiAJJChHRU5fSEVBREVSUykgJChBUkNIX0RJUikvaW5jbHVkZS9za2FzX3B0cmVncy5oIFwKLQkkKEFSQ0hfRElSKS9pbmNsdWRlL3VzZXJfY29uc3RhbnRzLmgKKwkkKEFSQ0hfRElSKS9pbmNsdWRlL3VzZXJfY29uc3RhbnRzLmggJChBUkNIX0RJUikvS2NvbmZpZy5hcmNoCiAKIE1SUFJPUEVSX0ZJTEVTICs9ICQoU1lNTElOS19IRUFERVJTKSAkKEFSQ0hfU1lNTElOS1MpIFwKLQkkKGFkZHByZWZpeCAkKEFSQ0hfRElSKS9rZXJuZWwvLCQoS0VSTl9TWU1MSU5LUykpICQoQVJDSF9ESVIpL29zIFwKLQkkKEFSQ0hfRElSKS9LY29uZmlnLmFyY2gKKwkkKGFkZHByZWZpeCAkKEFSQ0hfRElSKS9rZXJuZWwvLCQoS0VSTl9TWU1MSU5LUykpICQoQVJDSF9ESVIpL29zCiAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKEFSQ0hfRElSKS91dGlsCisJJChRKSQoTUFLRSkgJChjbGVhbik9JChBUkNIX0RJUikvb3MtJChPUykvdXRpbAogCUBmaW5kIC4gXCggLW5hbWUgJyouYmInIC1vIC1uYW1lICcqLmJiZycgLW8gLW5hbWUgJyouZGEnIFwKIAkJLW8gLW5hbWUgJyouZ2NvdicgXCkgLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgogCkBAIC0xOTcsNiArMTk2LDIyIEBACiAJc2VkICdzLyBDT05GSUcvIFVNTF9DT05GSUcvJwogZW5kZWYKIAorZGVmaW5lIGZpbGVjaGtfZ2VuLWFzbS1vZmZzZXRzCisgICAgICAgIChzZXQgLWU7IFwKKyAgICAgICAgIGVjaG8gIiNpZm5kZWYgX19BU01fT0ZGU0VUU19IX18iOyBcCisgICAgICAgICBlY2hvICIjZGVmaW5lIF9fQVNNX09GRlNFVFNfSF9fIjsgXAorICAgICAgICAgZWNobyAiLyoiOyBcCisgICAgICAgICBlY2hvICIgKiBETyBOT1QgTU9ESUZZLiI7IFwKKyAgICAgICAgIGVjaG8gIiAqIjsgXAorICAgICAgICAgZWNobyAiICogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYXJjaC8kKEFSQ0gpL01ha2VmaWxlIjsgXAorICAgICAgICAgZWNobyAiICoiOyBcCisgICAgICAgICBlY2hvICIgKi8iOyBcCisgICAgICAgICBlY2hvICIiOyBcCisgICAgICAgICBzZWQgLW5lICIvXi0+L3tzOl4tPlwoW14gXSpcKSBbXCQkI10qXChbXiBdKlwpIFwoLipcKTojZGVmaW5lIFwxIFwyIC8qIFwzICovOjsgczotPjo6OyBwO30iOyBcCisgICAgICAgICBlY2hvICIiOyBcCisgICAgICAgICBlY2hvICIjZW5kaWYiICkKK2VuZGVmCisKICQoQVJDSF9ESVIpL2luY2x1ZGUvdW1sLWNvbmZpZy5oIDogaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCiAJJChjYWxsIGZpbGVjaGssdW1sY29uZmlnKQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLWkzODYgYi9hcmNoL3VtL01ha2VmaWxlLWkzODYKaW5kZXggYTc3N2U1Ny4uMWFiNDMxYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2CisrKyBiL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgpAQCAtMjcsNyArMjcsNyBAQAogZW5kaWYKIGVuZGlmCiAKLUNGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1VJChTVUJBUkNIKSAkKFNUVUJfQ0ZMQUdTKQorQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLVUkKFNVQkFSQ0gpCiAKIGlmbmVxICgkKENPTkZJR19HUFJPRikseSkKIEFSQ0hfQ0ZMQUdTICs9IC1EVU1fRkFTVENBTEwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0IGIvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKaW5kZXggYmFkZGI1ZC4uNDM2YWJiYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKKysrIGIvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKQEAgLTgsNiArOCw3IEBACiAjaXQncyBuZWVkZWQgZm9yIGhlYWRlcnMgdG8gd29yayEKIENGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1mbm8tYnVpbHRpbgogVVNFUl9DRkxBR1MgKz0gLWZuby1idWlsdGluCitDSEVDS0ZMQUdTICArPSAtbTY0CiAKIEVMRl9BUkNIIDo9IGkzODY6eDg2LTY0CiBFTEZfRk9STUFUIDo9IGVsZjY0LXg4Ni02NApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmggYi9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaAppbmRleCBkNzA1ZGFhLi4wYWE2MjA5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaApAQCAtMTIsMyArMTIsNCBAQAogREVGSU5FX1NUUihVTV9LRVJOX05PVElDRSwgS0VSTl9OT1RJQ0UpOwogREVGSU5FX1NUUihVTV9LRVJOX0lORk8sIEtFUk5fSU5GTyk7CiBERUZJTkVfU1RSKFVNX0tFUk5fREVCVUcsIEtFUk5fREVCVUcpOworREVGSU5FKEhPU1RfRUxGX0NMQVNTLCBFTEZfQ0xBU1MpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL21lbS5oIGIvYXJjaC91bS9pbmNsdWRlL21lbS5oCmluZGV4IDk5ZDNhZDQuLmU4ZmYwZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9tZW0uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbWVtLmgKQEAgLTEzLDcgKzEzLDE3IEBACiBleHRlcm4gaW50IGlzX3JlbWFwcGVkKHZvaWQgKnZpcnQpOwogZXh0ZXJuIGludCBwaHlzbWVtX3JlbW92ZV9tYXBwaW5nKHZvaWQgKnZpcnQpOwogZXh0ZXJuIHZvaWQgcGh5c21lbV9mb3JnZXRfZGVzY3JpcHRvcihpbnQgZmQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG9fcGh5cyh2b2lkICp2aXJ0KTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW1sX3BoeXNtZW07CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdG9fcGh5cyh2b2lkICp2aXJ0KQoreworCXJldHVybigoKHVuc2lnbmVkIGxvbmcpIHZpcnQpIC0gdW1sX3BoeXNtZW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnRvX3ZpcnQodW5zaWduZWQgbG9uZyBwaHlzKQoreworCXJldHVybigodm9pZCAqKSB1bWxfcGh5c21lbSArIHBoeXMpOworfQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3VtX3VhY2Nlc3MuaCBiL2FyY2gvdW0vaW5jbHVkZS91bV91YWNjZXNzLmgKaW5kZXggNmUzNDhjYi4uODRjMDg2OCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VtX3VhY2Nlc3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvdW1fdWFjY2Vzcy5oCkBAIC0yMCwxMyArMjAsNiBAQAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgXAogCUNIT09TRV9NT0RFX1BST0MoYWNjZXNzX29rX3R0LCBhY2Nlc3Nfb2tfc2thcywgdHlwZSwgYWRkciwgc2l6ZSkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIChDSE9PU0VfTU9ERV9QUk9DKHZlcmlmeV9hcmVhX3R0LCB2ZXJpZnlfYXJlYV9za2FzLCB0eXBlLCBhZGRyLAotCQkJCXNpemUpKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBpbnQgbikKIHsKIAlyZXR1cm4oQ0hPT1NFX01PREVfUFJPQyhjb3B5X2Zyb21fdXNlcl90dCwgY29weV9mcm9tX3VzZXJfc2thcywgdG8sCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC91bS9rZXJuZWwvYXNtLW9mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNhNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxIEBACisvKiBEdW1teSBmaWxlIHRvIG1ha2Uga2J1aWxkIGhhcHB5IC0gdW51c2VkISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCmluZGV4IDM5NDJhNWYuLjI1MTdlY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKQEAgLTE0NiwzNyArMTQ2LDggQEAKICAgfQogICBfZW5kID0gLjsKICAgUFJPVklERSAoZW5kID0gLik7Ci0gICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKworICBTVEFCU19ERUJVRworCisgIERXQVJGX0RFQlVHCiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwva3N5bXMuYwppbmRleCAzMmQzMDc2Li5hOTdhNzJlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKQEAgLTM0LDE0ICszNCw5IEBACiBFWFBPUlRfU1lNQk9MKGFyY2hfdmFsaWRhdGUpOwogRVhQT1JUX1NZTUJPTChnZXRfa21lbV9lbmQpOwogCi1FWFBPUlRfU1lNQk9MKHBhZ2VfdG9fcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBoeXNfdG9fcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGhpZ2hfcGh5c21lbSk7CiBFWFBPUlRfU1lNQk9MKGVtcHR5X3plcm9fcGFnZSk7CiBFWFBPUlRfU1lNQk9MKHVtX3ZpcnRfdG9fcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKF9fdmlydF90b19wYWdlKTsKLUVYUE9SVF9TWU1CT0wodG9fcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHRvX3ZpcnQpOwogRVhQT1JUX1NZTUJPTChtb2RlX3R0KTsKIEVYUE9SVF9TWU1CT0woaGFuZGxlX3BhZ2VfZmF1bHQpOwogRVhQT1JUX1NZTUJPTChmaW5kX2lvbWVtKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL21lbS5jIGIvYXJjaC91bS9rZXJuZWwvbWVtLmMKaW5kZXggNTU5N2JkMy4uNjRmYTA2MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvbWVtLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvbWVtLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZml4YWRkcl91c2VyX2luaXQoIHZvaWQpCiB7Ci0jaWYgQ09ORklHX0FSQ0hfUkVVU0VfSE9TVF9WU1lTQ0FMTF9BUkVBCisjaWZkZWYgQ09ORklHX0FSQ0hfUkVVU0VfSE9TVF9WU1lTQ0FMTF9BUkVBCiAJbG9uZyBzaXplID0gRklYQUREUl9VU0VSX0VORCAtIEZJWEFERFJfVVNFUl9TVEFSVDsKIAlwZ2RfdCAqcGdkOwogCXB1ZF90ICpwdWQ7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKaW5kZXggYTI0ZTNiNy4uZWE2NzBmYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYwpAQCAtMjQ4LDE2ICsyNDgsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzbWVtX3NpemU7CiAKLXZvaWQgKnRvX3ZpcnQodW5zaWduZWQgbG9uZyBwaHlzKQotewotCXJldHVybigodm9pZCAqKSB1bWxfcGh5c21lbSArIHBoeXMpOwotfQotCi11bnNpZ25lZCBsb25nIHRvX3BoeXModm9pZCAqdmlydCkKLXsKLQlyZXR1cm4oKCh1bnNpZ25lZCBsb25nKSB2aXJ0KSAtIHVtbF9waHlzbWVtKTsKLX0KLQogaW50IGluaXRfbWFwcyh1bnNpZ25lZCBsb25nIHBoeXNtZW0sIHVuc2lnbmVkIGxvbmcgaW9tZW0sIHVuc2lnbmVkIGxvbmcgaGlnaG1lbSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcCwgKm1hcDsKQEAgLTI5OCwzMSArMjg4LDYgQEAKIAlyZXR1cm4oMCk7CiB9CiAKLXN0cnVjdCBwYWdlICpwaHlzX3RvX3BhZ2UoY29uc3QgdW5zaWduZWQgbG9uZyBwaHlzKQotewotCXJldHVybigmbWVtX21hcFtwaHlzID4+IFBBR0VfU0hJRlRdKTsKLX0KLQotc3RydWN0IHBhZ2UgKl9fdmlydF90b19wYWdlKGNvbnN0IHVuc2lnbmVkIGxvbmcgdmlydCkKLXsKLQlyZXR1cm4oJm1lbV9tYXBbX19wYSh2aXJ0KSA+PiBQQUdFX1NISUZUXSk7Ci19Ci0KLXBoeXNfdCBwYWdlX3RvX3BoeXMoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuKChwYWdlIC0gbWVtX21hcCkgPDwgUEFHRV9TSElGVCk7Ci19Ci0KLXB0ZV90IG1rX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcGdwcm90X3QgcGdwcm90KQotewotCXB0ZV90IHB0ZTsKLQotCXB0ZV9zZXRfdmFsKHB0ZSwgcGFnZV90b19waHlzKHBhZ2UpLCBwZ3Byb3QpOwotCWlmKHB0ZV9wcmVzZW50KHB0ZSkpCi0JCXB0ZV9ta25ld3Byb3QocHRlX21rbmV3cGFnZShwdGUpKTsKLQlyZXR1cm4ocHRlKTsKLX0KLQogLyogQ2hhbmdlZCBkdXJpbmcgZWFybHkgYm9vdCAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcga21lbV90b3AgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvdWFjY2Vzcy1za2FzLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvdWFjY2Vzcy1za2FzLmgKaW5kZXggY2Q2YzI4MC4uNmVlM2YzOSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3VhY2Nlc3Mtc2thcy5oCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS91YWNjZXNzLXNrYXMuaApAQCAtMTgsMTggKzE4LDE4IEBACiAJICAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSA8PSBGSVhBRERSX1VTRVJfRU5EKSAmJiBcCiAJICAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSA+PSAodW5zaWduZWQgbG9uZykoYWRkcikpKSkKIAotc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5X2FyZWFfc2thcyhpbnQgdHlwZSwgY29uc3Qgdm9pZCAqIGFkZHIsCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfYXJlYV9za2FzKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4oYWNjZXNzX29rX3NrYXModHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVCk7CiB9CiAKLWV4dGVybiBpbnQgY29weV9mcm9tX3VzZXJfc2thcyh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBjb3B5X3RvX3VzZXJfc2thcyh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl9za2FzKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgY291bnQpOwotZXh0ZXJuIGludCBfX2NsZWFyX3VzZXJfc2thcyh2b2lkICptZW0sIGludCBsZW4pOwotZXh0ZXJuIGludCBjbGVhcl91c2VyX3NrYXModm9pZCAqbWVtLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgc3Rybmxlbl91c2VyX3NrYXMoY29uc3Qgdm9pZCAqc3RyLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgY29weV9mcm9tX3VzZXJfc2thcyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGludCBuKTsKK2V4dGVybiBpbnQgY29weV90b191c2VyX3NrYXModm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbik7CitleHRlcm4gaW50IHN0cm5jcHlfZnJvbV91c2VyX3NrYXMoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBpbnQgY291bnQpOworZXh0ZXJuIGludCBfX2NsZWFyX3VzZXJfc2thcyh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgY2xlYXJfdXNlcl9za2FzKHZvaWQgX191c2VyICptZW0sIGludCBsZW4pOworZXh0ZXJuIGludCBzdHJubGVuX3VzZXJfc2thcyhjb25zdCB2b2lkIF9fdXNlciAqc3RyLCBpbnQgbGVuKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RyYXBfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMKaW5kZXggYjVmYzg5Zi4uODdjYzZmZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMKQEAgLTU3LDcgKzU3LDggQEAKIAlpZihpc193cml0ZSAmJiAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpIAogCQlnb3RvIG91dDsKIAotICAgICAgICBpZighKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX0VYRUMpKSkKKwkvKiBEb24ndCByZXF1aXJlIFZNX1JFQUR8Vk1fRVhFQyBmb3Igd3JpdGUgZmF1bHRzISAqLworICAgICAgICBpZighaXNfd3JpdGUgJiYgISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDKSkpCiAgICAgICAgICAgICAgICAgZ290byBvdXQ7CiAKIAlkbyB7CkBAIC04NCw4ICs4NSw3IEBACiAJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcyk7CiAJfSB3aGlsZSghcHRlX3ByZXNlbnQoKnB0ZSkpOwogCWVyciA9IDA7Ci0JKnB0ZSA9IHB0ZV9ta3lvdW5nKCpwdGUpOwotCWlmKHB0ZV93cml0ZSgqcHRlKSkgKnB0ZSA9IHB0ZV9ta2RpcnR5KCpwdGUpOworCVdBUk5fT04oIXB0ZV95b3VuZygqcHRlKSB8fCAoaXNfd3JpdGUgJiYgIXB0ZV9kaXJ0eSgqcHRlKSkpOwogCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CiBvdXQ6CiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvdWFjY2Vzcy10dC5oIGIvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKaW5kZXggM2ZiYjVmZS4uYWE2ZGIzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8PSAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSkpICYmIFwKICAgICAgICAgICAodW5kZXJfdGFza19zaXplKGFkZHIsIHNpemUpIHx8IGlzX3N0YWNrKGFkZHIsIHNpemUpKSkpCiAKLXN0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9hcmVhX3R0KGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwKK3N0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9hcmVhX3R0KGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuKGFjY2Vzc19va190dCh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUKTsKQEAgLTUwLDEyICs1MCwxMiBAQAogZXh0ZXJuIGludCBfX2RvX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgbiwKIAkJCSAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIHZvaWQgKipmYXVsdF9jYXRjaGVyKTsKIAotZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcl90dCh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBjb3B5X3RvX3VzZXJfdHQodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKTsKLWV4dGVybiBpbnQgc3RybmNweV9mcm9tX3VzZXJfdHQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBjb3VudCk7Ci1leHRlcm4gaW50IF9fY2xlYXJfdXNlcl90dCh2b2lkICptZW0sIGludCBsZW4pOwotZXh0ZXJuIGludCBjbGVhcl91c2VyX3R0KHZvaWQgKm1lbSwgaW50IGxlbik7Ci1leHRlcm4gaW50IHN0cm5sZW5fdXNlcl90dChjb25zdCB2b2lkICpzdHIsIGludCBsZW4pOworZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcl90dCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGludCBuKTsKK2V4dGVybiBpbnQgY29weV90b191c2VyX3R0KHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOworZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl90dChjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGludCBjb3VudCk7CitleHRlcm4gaW50IF9fY2xlYXJfdXNlcl90dCh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgY2xlYXJfdXNlcl90dCh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc3Rybmxlbl91c2VyX3R0KGNvbnN0IHZvaWQgX191c2VyICpzdHIsIGludCBsZW4pOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCmluZGV4IGIwMzMyNmQuLmFmMTE5MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKQEAgLTkzLDE0ICs5MywxMCBAQAogICAgKiguYnNzKQogICAgKihDT01NT04pCiAgIH0KLSAgX2VuZCA9IC4gOworICBfZW5kID0gLjsKICAgUFJPVklERSAoZW5kID0gLik7Ci0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQorCisgIFNUQUJTX0RFQlVHCisKKyAgRFdBUkZfREVCVUcKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUgYi9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCmluZGV4IGQzYzE1NjAuLjdhMTY2MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQpAQCAtOSw2ICs5LDkgQEAKIFVTRVJfT0JKUyA6PSBhaW8ubyBlbGZfYXV4Lm8gZmlsZS5vIHByb2Nlc3MubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0dC5vIFwKIAl0dHkubwogCitlbGZfYXV4Lm86ICQoQVJDSF9ESVIpL2tlcm5lbC1vZmZzZXRzLmgKK0NGTEFHU19lbGZfYXV4Lm8gKz0gLUkkKG9ianRyZWUpL2FyY2gvdW0KKwogQ0ZMQUdTX3VzZXJfc3ltcy5vICs9IC1EU1VCQVJDSF8kKFNVQkFSQ0gpCiAKIEhBVkVfQUlPX0FCSSA6PSAkKHNoZWxsIFsgLXIgL3Vzci9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaCBdICYmIFwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZWxmX2F1eC5jIGIvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMKaW5kZXggNGNjYTNlOS4uMTM5OTUyMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMKQEAgLTEyLDggKzEyLDkgQEAKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAiZWxmX3VzZXIuaCIKICNpbmNsdWRlICJtZW1fdXNlci5oIgorI2luY2x1ZGUgPGtlcm5lbC1vZmZzZXRzLmg+CiAKLSNpZiBFTEZfQ0xBU1MgPT0gRUxGQ0xBU1MzMgorI2lmIEhPU1RfRUxGX0NMQVNTID09IEVMRkNMQVNTMzIKIHR5cGVkZWYgRWxmMzJfYXV4dl90IGVsZl9hdXh2X3Q7CiAjZWxzZQogdHlwZWRlZiBFbGY2NF9hdXh2X3QgZWxmX2F1eHZfdDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcyBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwppbmRleCAxN2YzMDViLi41OWExMjkxIDEwMDY0NAotLS0gYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKKysrIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCkBAIC05LDYgKzksMTEgQEAKIAogJChVU0VSX09CSlMpIDogY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKSBcCiAJJChDRkxBR1NfJChub3RkaXIgJEApKQorJChVU0VSX09CSlMpOiBjbWRfY2hlY2tzcmMgPQorJChVU0VSX09CSlMpOiBxdWlldF9jbWRfY2hlY2tzcmMgPQorJChVU0VSX09CSlMpOiBjbWRfZm9yY2VfY2hlY2tzcmMgPQorJChVU0VSX09CSlMpOiBxdWlldF9jbWRfZm9yY2VfY2hlY2tzcmMgPQorCiAKICMgVGhlIHN0dWJzIGFuZCB1bm1hcC5vIGNhbid0IHRyeSB0byBjYWxsIG1jb3VudCBvciB1cGRhdGUgYmFzaWMgYmxvY2sgZGF0YQogZGVmaW5lIHVucHJvZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5jIGIvYXJjaC91bS9zeXMtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5jCmluZGV4IDlmOGVjZDEuLmExMDcwYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYva2VybmVsLW9mZnNldHMuYworKysgYi9hcmNoL3VtL3N5cy1pMzg2L2tlcm5lbC1vZmZzZXRzLmMKQEAgLTIsNiArMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIFwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2tlcm5lbC1vZmZzZXRzLmMKaW5kZXggMjIwZTg3NS4uOTk4NTQxZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2tlcm5lbC1vZmZzZXRzLmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L2tlcm5lbC1vZmZzZXRzLmMKQEAgLTIsNiArMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIFwKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9NYWtlZmlsZSBiL2FyY2gvdjg1MC9NYWtlZmlsZQppbmRleCBiZjM4Y2EwLi44YmU5YWFjIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvTWFrZWZpbGUKKysrIGIvYXJjaC92ODUwL01ha2VmaWxlCkBAIC01MSwxNiArNTEsNCBAQAogCSQoT0JKQ09QWSkgJChPQkpDT1BZX0ZMQUdTX0JMT0IpIC0tcmVuYW1lLXNlY3Rpb24gLmRhdGE9LnJvb3QsYWxsb2MsbG9hZCxyZWFkb25seSxkYXRhLGNvbnRlbnRzICQ8IHJvb3RfZnNfaW1hZ2UubwogZW5kaWYKIAotCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1jb25zdHMuaAotCi0jIEdlbmVyYXRlIGNvbnN0YW50cyBmcm9tIEMgY29kZSBmb3IgdXNlIGJ5IGFzbSBmaWxlcwotYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tY29uc3RzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLQkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKLQotaW5jbHVkZS9hc20tJChBUkNIKS9hc20tY29uc3RzLmg6IGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLWNvbnN0cy5zCi0JJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQotCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbS1jb25zdHMuaCBcCi0JICAgICAgIGFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLWNvbnN0cy5zIFwKLQkgICAgICAgcm9vdF9mc19pbWFnZS5vCitDTEVBTl9GSUxFUyArPSByb290X2ZzX2ltYWdlLm8KZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvYXNtLWNvbnN0cy5jIGIvYXJjaC92ODUwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3Y4NTAva2VybmVsL2FzbS1jb25zdHMuYwpyZW5hbWUgdG8gYXJjaC92ODUwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3Y4NTAva2VybmVsL2VudHJ5LlMKaW5kZXggODk1ZTI3Yi4uZDk5MWU0NSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvZW50cnkuUwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAotI2luY2x1ZGUgPGFzbS9hc20tY29uc3RzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAogLyogTWFrZSBhIHNsaWdodGx5IG1vcmUgY29udmVuaWVudCBhbGlhcyBmb3IgQ19TWU1CT0xfTkFNRS4gICovCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL2lycS5jIGIvYXJjaC92ODUwL2tlcm5lbC9pcnEuYwppbmRleCAzMzZjYmYyLi45ZTg1OTY5IDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL2lycS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvaXJxLmMKQEAgLTY3LDEzICs2NywxMyBAQAogI2RlZmluZSBlbmRfbm9uZQllbmFibGVfbm9uZQogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbm9faXJxX3R5cGUgPSB7Ci0JIm5vbmUiLAotCXN0YXJ0dXBfbm9uZSwKLQlzaHV0ZG93bl9ub25lLAotCWVuYWJsZV9ub25lLAotCWRpc2FibGVfbm9uZSwKLQlhY2tfbm9uZSwKLQllbmRfbm9uZQorCS50eXBlbmFtZSA9ICJub25lIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfbm9uZSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9ub25lLAorCS5lbmFibGUgPSBlbmFibGVfbm9uZSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfbm9uZSwKKwkuYWNrID0gYWNrX25vbmUsCisJLmVuZCA9IGVuZF9ub25lCiB9OwogCiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlycV9lcnJfY291bnQsIHNwdXJpb3VzX2NvdW50OwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC92ODUwL2tlcm5lbC9zZXR1cC5jCmluZGV4IGFiZDQ4NDAuLjYyYmRiOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3NldHVwLmMKQEAgLTEzOCwxMyArMTM4LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbm1pX2lycV90eXBlID0gewotCSJOTUkiLAotCWlycV96ZXJvLAkJLyogc3RhcnR1cCAqLwotCWlycV9ub3AsCQkvKiBzaHV0ZG93biAqLwotCWlycV9ub3AsCQkvKiBlbmFibGUgKi8KLQlpcnFfbm9wLAkJLyogZGlzYWJsZSAqLwotCWlycV9ub3AsCQkvKiBhY2sgKi8KLQlubWlfZW5kLAkJLyogZW5kICovCisJLnR5cGVuYW1lID0gIk5NSSIsCisJLnN0YXJ0dXAgPSBpcnFfemVybywJCS8qIHN0YXJ0dXAgKi8KKwkuc2h1dGRvd24gPSBpcnFfbm9wLAkJLyogc2h1dGRvd24gKi8KKwkuZW5hYmxlID0gaXJxX25vcCwJCS8qIGVuYWJsZSAqLworCS5kaXNhYmxlID0gaXJxX25vcCwJCS8qIGRpc2FibGUgKi8KKwkuYWNrID0gaXJxX25vcCwJCS8qIGFjayAqLworCS5lbmQgPSBubWlfZW5kLAkJLyogZW5kICovCiB9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUSAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvc2ltLmMgYi9hcmNoL3Y4NTAva2VybmVsL3NpbS5jCmluZGV4IGUyY2M1NTguLjE3MDQ5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvc2ltLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC9zaW0uYwpAQCAtNzMsMTMgKzczLDEzIEBACiBzdGF0aWMgdW5zaWduZWQgaXJxX3plcm8gKHVuc2lnbmVkIGlycSkgeyByZXR1cm4gMDsgfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHNpbV9pcnFfdHlwZSA9IHsKLQkiSVJRIiwKLQlpcnFfemVybywJCS8qIHN0YXJ0dXAgKi8KLQlpcnFfbm9wLAkJLyogc2h1dGRvd24gKi8KLQlpcnFfbm9wLAkJLyogZW5hYmxlICovCi0JaXJxX25vcCwJCS8qIGRpc2FibGUgKi8KLQlpcnFfbm9wLAkJLyogYWNrICovCi0JaXJxX25vcCwJCS8qIGVuZCAqLworCS50eXBlbmFtZSA9ICJJUlEiLAorCS5zdGFydHVwID0gaXJxX3plcm8sCQkvKiBzdGFydHVwICovCisJLnNodXRkb3duID0gaXJxX25vcCwJCS8qIHNodXRkb3duICovCisJLmVuYWJsZSA9IGlycV9ub3AsCQkvKiBlbmFibGUgKi8KKwkuZGlzYWJsZSA9IGlycV9ub3AsCQkvKiBkaXNhYmxlICovCisJLmFjayA9IGlycV9ub3AsCQkvKiBhY2sgKi8KKwkuZW5kID0gaXJxX25vcCwJCS8qIGVuZCAqLwogfTsKIAogdm9pZCBfX2luaXQgbWFjaF9pbml0X2lycXMgKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3RpbWUuYyBiL2FyY2gvdjg1MC9rZXJuZWwvdGltZS5jCmluZGV4IGY3MjJhMjYuLmVhM2ZkODggMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvdGltZS5jCkBAIC02Niw3ICs2Niw3IEBACiAJICogQ01PUyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gU2V0X3J0Y19tbXNzKCkgaGFzIHRvIGJlCiAJICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgogCSAqLwotCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSA9PSAwICYmCisJaWYgKG50cF9zeW5jZWQoKSAmJgogCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKIAkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA+PSA1MDAwMDAgLSAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMiAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApIDw9IDUwMDAwMCArICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyKSB7CkBAIC0xNjksMTAgKzE2OSw3IEBACiAJeHRpbWUudHZfc2VjID0gdHYtPnR2X3NlYzsKIAl4dGltZS50dl9uc2VjID0gdHYtPnR2X25zZWM7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lICgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAKIAl3cml0ZV9zZXF1bmxvY2tfaXJxICgmeHRpbWVfbG9jayk7CiAJY2xvY2tfd2FzX3NldCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggNzVlNTJjNS4uZTYzMzIzZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC02NSw2ICs2NSwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCisJYm9vbAorCWRlZmF1bHQgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogCkBAIC0xNDgsNyArMTUyLDYgQEAKIAkgIHdpdGggbWFqb3IgMjAzIGFuZCBtaW5vcnMgMCB0byAzMSBmb3IgL2Rldi9jcHUvMC9jcHVpZCB0bwogCSAgL2Rldi9jcHUvMzEvY3B1aWQuCiAKLSMgZGlzYWJsZSBpdCBmb3Igb3B0ZXJvbiBvcHRpbWl6ZWQgYnVpbGRzIGJlY2F1c2UgaXQgcHVsbHMgaW4gQUNQSV9CT09UCiBjb25maWcgWDg2X0hUCiAJYm9vbAogCWRlcGVuZHMgb24gU01QICYmICFNSzgKQEAgLTQ0MSw2ICs0NDQsMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX1BFTkRJTkdfSVJRCisJYm9vbAorCWRlcGVuZHMgb24gR0VORVJJQ19IQVJESVJRUyAmJiBTTVAKKwlkZWZhdWx0IHkKKwogbWVudSAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIgogCiBzb3VyY2Uga2VybmVsL3Bvd2VyL0tjb25maWcKQEAgLTQ2NSw3ICs0NzMsNiBAQAogY29uZmlnIFBDSV9NTUNPTkZJRwogCWJvb2wgIlN1cHBvcnQgbW1jb25maWcgUENJIGNvbmZpZyBzcGFjZSBhY2Nlc3MiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgQUNQSQotCXNlbGVjdCBBQ1BJX0JPT1QKIAogY29uZmlnIFVOT1JERVJFRF9JTwogICAgICAgIGJvb2wgIlVub3JkZXJlZCBJTyBtYXBwaW5nIGFjY2VzcyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggNGM2ZWQ5Ni4uYTljZDQyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTg2LDE2ICs4Niw2IEBACiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1wcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldC5oCi0KLWFyY2gvJChBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuczogaW5jbHVkZS9hc20gaW5jbHVkZS9saW51eC92ZXJzaW9uLmggXAotCQkJCSAgIGluY2x1ZGUvY29uZmlnL01BUktFUgotCi1pbmNsdWRlL2FzbS0kKEFSQ0gpL29mZnNldC5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KLUNMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvb2Zmc2V0LmgKLQogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gICcqIGJ6SW1hZ2UJLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvYnpJbWFnZSknCiAgIGVjaG8gICcgIGluc3RhbGwJLSBJbnN0YWxsIGtlcm5lbCB1c2luZycKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUyBiL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUwppbmRleCBmZjU4YjI4Li4xMmVhMGI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L3NldHVwLlMKKysrIGIvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TCkBAIC04MSw3ICs4MSw3IEBACiAjIFRoaXMgaXMgdGhlIHNldHVwIGhlYWRlciwgYW5kIGl0IG11c3Qgc3RhcnQgYXQgJWNzOjIgKG9sZCAweDkwMjA6MikKIAogCQkuYXNjaWkJIkhkclMiCQkjIGhlYWRlciBzaWduYXR1cmUKLQkJLndvcmQJMHgwMjAzCQkjIGhlYWRlciB2ZXJzaW9uIG51bWJlciAoPj0gMHgwMTA1KQorCQkud29yZAkweDAyMDQJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCiAJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQogcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCiBzdGFydF9zeXNfc2VnOgkud29yZAlTWVNTRUcKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3QvdG9vbHMvYnVpbGQuYyBiL2FyY2gveDg2XzY0L2Jvb3QvdG9vbHMvYnVpbGQuYwppbmRleCAxOGI1YmFjLi5jNDRmNWUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMKKysrIGIvYXJjaC94ODZfNjQvYm9vdC90b29scy9idWlsZC5jCkBAIC0xNzgsNyArMTc4LDkgQEAKIAkJZGllKCJPdXRwdXQ6IHNlZWsgZmFpbGVkIik7CiAJYnVmWzBdID0gKHN5c19zaXplICYgMHhmZik7CiAJYnVmWzFdID0gKChzeXNfc2l6ZSA+PiA4KSAmIDB4ZmYpOwotCWlmICh3cml0ZSgxLCBidWYsIDIpICE9IDIpCisJYnVmWzJdID0gKChzeXNfc2l6ZSA+PiAxNikgJiAweGZmKTsKKwlidWZbM10gPSAoKHN5c19zaXplID4+IDI0KSAmIDB4ZmYpOworCWlmICh3cml0ZSgxLCBidWYsIDQpICE9IDQpCiAJCWRpZSgiV3JpdGUgb2YgaW1hZ2UgbGVuZ3RoIGZhaWxlZCIpOwogCiAJcmV0dXJuIDA7CQkJCQkgICAgLyogRXZlcnl0aGluZyBpcyBPSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvZGVmY29uZmlnIGIvYXJjaC94ODZfNjQvZGVmY29uZmlnCmluZGV4IGI5N2E2MWUuLmJmNTdlMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKQEAgLTEzNSw4ICsxMzUsNiBAQAogIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKICMKIENPTkZJR19BQ1BJPXkKLUNPTkZJR19BQ1BJX0JPT1Q9eQotQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQogQ09ORklHX0FDUElfQUM9eQogQ09ORklHX0FDUElfQkFUVEVSWT15CiBDT05GSUdfQUNQSV9CVVRUT049eQpAQCAtMTUxLDEwICsxNDksOCBAQAogQ09ORklHX0FDUElfVE9TSElCQT15CiBDT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0yMDAxCiAjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0JVUz15CiBDT05GSUdfQUNQSV9FQz15CiBDT05GSUdfQUNQSV9QT1dFUj15Ci1DT05GSUdfQUNQSV9QQ0k9eQogQ09ORklHX0FDUElfU1lTVEVNPXkKICMgQ09ORklHX0FDUElfQ09OVEFJTkVSIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2lvY3RsLmMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfaW9jdGwuYwppbmRleCBkMjU5ZjhhLi40MTk3NThmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfaW9jdGwuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfaW9jdGwuYwpAQCAtMjQsMTcgKzI0LDI2IEBACiBzdGF0aWMgaW50IHRpb2NnZGV2KHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsICB1bnNpZ25lZCBpbnQgX191c2VyICpwdHIpIAogeyAKIAotCXN0cnVjdCBmaWxlICpmaWxlID0gZmdldChmZCk7CisJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnJlYWxfdHR5OworCWludCBmcHV0X25lZWRlZCwgcmV0OwogCisJZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CiAJaWYgKCFmaWxlKQogCQlyZXR1cm4gLUVCQURGOworCisJcmV0ID0gLUVJTlZBTDsKIAlpZiAoZmlsZS0+Zl9vcC0+aW9jdGwgIT0gdHR5X2lvY3RsKQotCQlyZXR1cm4gLUVJTlZBTDsgCisJCWdvdG8gb3V0OwogCXJlYWxfdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICghcmVhbF90dHkpIAkKLQkJcmV0dXJuIC1FSU5WQUw7IAotCXJldHVybiBwdXRfdXNlcihuZXdfZW5jb2RlX2Rldih0dHlfZGV2bnVtKHJlYWxfdHR5KSksIHB0cik7IAorCQlnb3RvIG91dDsKKworCXJldCA9IHB1dF91c2VyKG5ld19lbmNvZGVfZGV2KHR0eV9kZXZudW0ocmVhbF90dHkpKSwgcHRyKTsgCisKK291dDoKKwlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwlyZXR1cm4gcmV0OwogfSAKIAogI2RlZmluZSBSVENfSVJRUF9SRUFEMzIJX0lPUigncCcsIDB4MGIsIHVuc2lnbmVkIGludCkJIC8qIFJlYWQgSVJRIHJhdGUgICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggYzQ1ZDZhMC4uNTI0NGY4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCkBAIC02LDcgKzYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgogI2luY2x1ZGUgPGFzbS9jYWxsaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2lhMzJfdW5pc3RkLmg+CQpAQCAtMzA3LDcgKzMwNyw3IEBACiAJLnF1YWQgc3R1YjMyX2ZvcmsKIAkucXVhZCBzeXNfcmVhZAogCS5xdWFkIHN5c193cml0ZQotCS5xdWFkIHN5czMyX29wZW4JCS8qIDUgKi8KKwkucXVhZCBjb21wYXRfc3lzX29wZW4JCS8qIDUgKi8KIAkucXVhZCBzeXNfY2xvc2UKIAkucXVhZCBzeXMzMl93YWl0cGlkCiAJLnF1YWQgc3lzX2NyZWF0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMKaW5kZXggYmU5OTZkMWIuLjA0ZDgwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMKQEAgLTk2OSwzMiArOTY5LDYgQEAKIAlyZXR1cm4gc3lzX2tpbGwocGlkLCBzaWcpOwogfQogIAotYXNtbGlua2FnZSBsb25nIHN5czMyX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKLXsKLQljaGFyICogdG1wOwotCWludCBmZCwgZXJyb3I7Ci0KLQkvKiBkb24ndCBmb3JjZSBPX0xBUkdFRklMRSAqLwotCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOwotCWZkID0gUFRSX0VSUih0bXApOwotCWlmICghSVNfRVJSKHRtcCkpIHsKLQkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQlzdHJ1Y3QgZmlsZSAqZiA9IGZpbHBfb3Blbih0bXAsIGZsYWdzLCBtb2RlKTsKLQkJCWVycm9yID0gUFRSX0VSUihmKTsKLQkJCWlmIChJU19FUlIoZikpIHsKLQkJCQlwdXRfdW51c2VkX2ZkKGZkKTsgCi0JCQkJZmQgPSBlcnJvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJZnNub3RpZnlfb3BlbihmLT5mX2RlbnRyeSk7Ci0JCQkJZmRfaW5zdGFsbChmZCwgZik7Ci0JCQl9Ci0JCX0KLQkJcHV0bmFtZSh0bXApOwotCX0KLQlyZXR1cm4gZmQ7Ci19Ci0KIGV4dGVybiBhc21saW5rYWdlIGxvbmcKIHN5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAogCQkgc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqdGltZXJfZXZlbnRfc3BlYywKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzY2FsbC5TIGIvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zeXNjYWxsLlMKaW5kZXggZTJhYWYzZC4uYjAyNDk2NWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzY2FsbC5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzY2FsbC5TCkBAIC0zLDcgKzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxhc20vaWEzMl91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KIAogCS50ZXh0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2VudGVyLlMgYi9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2VudGVyLlMKaW5kZXggOGZiOGUwZi4uNzFmM2RlNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zeXNlbnRlci5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzZW50ZXIuUwpAQCAtMyw3ICszLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2lhMzJfdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAJLnRleHQKIAkuc2VjdGlvbiAudGV4dC52c3lzY2FsbCwiYXgiCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYzMyZTE5OC4uMTU3OWJkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogb2JqLSQoQ09ORklHX1g4Nl9NQ0UpICAgICAgICAgKz0gbWNlLm8KIG9iai0kKENPTkZJR19YODZfTUNFX0lOVEVMKQkrPSBtY2VfaW50ZWwubwogb2JqLSQoQ09ORklHX01UUlIpCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9jcHUvbXRyci8KLW9iai0kKENPTkZJR19BQ1BJX0JPT1QpCQkrPSBhY3BpLworb2JqLSQoQ09ORklHX0FDUEkpCQkrPSBhY3BpLwogb2JqLSQoQ09ORklHX1g4Nl9NU1IpCQkrPSBtc3Iubwogb2JqLSQoQ09ORklHX01JQ1JPQ09ERSkJCSs9IG1pY3JvY29kZS5vCiBvYmotJChDT05GSUdfWDg2X0NQVUlEKQkJKz0gY3B1aWQubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQppbmRleCBkMmMyZWU1Li43ZGE5YWNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMSwzICsxLDMgQEAKLW9iai0kKENPTkZJR19BQ1BJX0JPT1QpCQk6PSBib290Lm8KLWJvb3QtJChDT05GSUdfQUNQSV9CT09UKQk6PSAuLi8uLi8uLi9pMzg2L2tlcm5lbC9hY3BpL2Jvb3Qubworb2JqLXkJCQk6PSBib290Lm8KK2Jvb3QteQkJCTo9IC4uLy4uLy4uL2kzODYva2VybmVsL2FjcGkvYm9vdC5vCiBvYmotJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gc2xlZXAubyB3YWtldXAubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3NsZWVwLmMKaW5kZXggN2EyNzVkZS4uMTQ4ZjZmNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvdy1MZXZlbCBTbGVlcCBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzcsMTEgKzc2LDEyIEBACiAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWFwcGVkIHBhZ2UgdGFibGUgYW5kIGNvcHkgdGhlIHdha2V1cCByb3V0aW5lIHRvCiAgKiBsb3cgbWVtb3J5LgogICovCi1pbnQgYWNwaV9zYXZlX3N0YXRlX21lbSAodm9pZCkKK2ludCBhY3BpX3NhdmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJaW5pdF9sb3dfbWFwcGluZygpOwogCi0JbWVtY3B5KCh2b2lkICopIGFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CisJbWVtY3B5KCh2b2lkICopYWNwaV93YWtldXBfYWRkcmVzcywgJndha2V1cF9zdGFydCwKKwkgICAgICAgJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KTsKIAlhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUoYWNwaV93YWtldXBfYWRkcmVzcyk7CiAKIAlyZXR1cm4gMDsKQEAgLTkwLDcgKzkwLDcgQEAKIC8qCiAgKiBhY3BpX3Jlc3RvcmVfc3RhdGUKICAqLwotdm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtICh2b2lkKQordm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJc2V0X3BnZChwZ2Rfb2Zmc2V0KGN1cnJlbnQtPm1tLCAwVUwpLCBsb3dfcHRyKTsKIAlmbHVzaF90bGJfYWxsKCk7CkBAIC0xMDgsNyArMTA4LDggQEAKIHsKIAlhY3BpX3dha2V1cF9hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYWxsb2NfYm9vdG1lbV9sb3coUEFHRV9TSVpFKTsKIAlpZiAoKCZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCkgPiBQQUdFX1NJWkUpCi0JCXByaW50ayhLRVJOX0NSSVQgIkFDUEk6IFdha2V1cCBjb2RlIHdheSB0b28gYmlnLCB3aWxsIGNyYXNoIG9uIGF0dGVtcHQgdG8gc3VzcGVuZFxuIik7CisJCXByaW50ayhLRVJOX0NSSVQKKwkJICAgICAgICJBQ1BJOiBXYWtldXAgY29kZSB3YXkgdG9vIGJpZywgd2lsbCBjcmFzaCBvbiBhdHRlbXB0IHRvIHN1c3BlbmRcbiIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NsZWVwX3NldHVwKGNoYXIgKnN0cikKQEAgLTEyNyw2ICsxMjgsOCBAQAogCiBfX3NldHVwKCJhY3BpX3NsZWVwPSIsIGFjcGlfc2xlZXBfc2V0dXApOwogCi0jZW5kaWYgLypDT05GSUdfQUNQSV9TTEVFUCovCisjZW5kaWYJCQkJLypDT05GSUdfQUNQSV9TTEVFUCAqLwogCi12b2lkIGFjcGlfcGNpX2xpbmtfZXhpdCh2b2lkKSB7fQordm9pZCBhY3BpX3BjaV9saW5rX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCmluZGV4IGI1NDhkZWEuLmJiMGFlMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYwpAQCAtODUsNyArODUsNyBAQAogCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsgCiAJCWlmICh0eXBlICYmIGVpLT50eXBlICE9IHR5cGUpIAogCQkJY29udGludWU7Ci0JCWlmIChlaS0+YWRkciA+PSBlbmQgfHwgZWktPmFkZHIgKyBlaS0+c2l6ZSA8IHN0YXJ0KSAKKwkJaWYgKGVpLT5hZGRyID49IGVuZCB8fCBlaS0+YWRkciArIGVpLT5zaXplIDw9IHN0YXJ0KQogCQkJY29udGludWU7IAogCQlyZXR1cm4gMTsgCiAJfSAKQEAgLTU2Nyw3ICs1NjcsNyBAQAogICovCiBfX2luaXQgdm9pZCBlODIwX3NldHVwX2dhcCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZ2Fwc3RhcnQsIGdhcHNpemU7CisJdW5zaWduZWQgbG9uZyBnYXBzdGFydCwgZ2Fwc2l6ZSwgcm91bmQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0OwogCWludCBpOwogCWludCBmb3VuZCA9IDA7CkBAIC02MDQsMTQgKzYwNCwxNCBAQAogCX0KIAogCS8qCi0JICogU3RhcnQgYWxsb2NhdGluZyBkeW5hbWljIFBDSSBtZW1vcnkgYSBiaXQgaW50byB0aGUgZ2FwLAotCSAqIGFsaWduZWQgdXAgdG8gdGhlIG5lYXJlc3QgbWVnYWJ5dGUuCi0JICoKLQkgKiBRdWVzdGlvbjogc2hvdWxkIHdlIHRyeSB0byBwYWQgaXQgdXAgYSBiaXQgKGRvIHNvbWV0aGluZwotCSAqIGxpa2UgIiArIChnYXBzaXplID4+IDMpIiBpbiB0aGVyZSB0b28/KS4gV2Ugbm93IGhhdmUgdGhlCi0JICogdGVjaG5vbG9neS4KKwkgKiBTZWUgaG93IG11Y2ggd2Ugd2FudCB0byByb3VuZCB1cDogc3RhcnQgb2ZmIHdpdGgKKwkgKiByb3VuZGluZyB0byB0aGUgbmV4dCAxTUIgYXJlYS4KIAkgKi8KLQlwY2lfbWVtX3N0YXJ0ID0gKGdhcHN0YXJ0ICsgMHhmZmZmZikgJiB+MHhmZmZmZjsKKwlyb3VuZCA9IDB4MTAwMDAwOworCXdoaWxlICgoZ2Fwc2l6ZSA+PiA0KSA+IHJvdW5kKQorCQlyb3VuZCArPSByb3VuZDsKKwkvKiBGdW4gd2l0aCB0d28ncyBjb21wbGVtZW50ICovCisJcGNpX21lbV9zdGFydCA9IChnYXBzdGFydCArIHJvdW5kKSAmIC1yb3VuZDsKIAogCXByaW50ayhLRVJOX0lORk8gIkFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCAlbHggKGdhcDogJWx4OiVseClcbiIsCiAJCXBjaV9tZW1fc3RhcnQsIGdhcHN0YXJ0LCBnYXBzaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKaW5kZXggMDk2ZDQ3MC4uMzYyMDUwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL2NhbGxpbmcuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KQEAgLTc4NCw4ICs3ODQsOSBAQAogCXJldAogCUNGSV9FTkRQUk9DCiAKLUVOVFJZKHBhZ2VfZmF1bHQpCitLUFJPQkVfRU5UUlkocGFnZV9mYXVsdCkKIAllcnJvcmVudHJ5IGRvX3BhZ2VfZmF1bHQKKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkoY29wcm9jZXNzb3JfZXJyb3IpCiAJemVyb2VudHJ5IGRvX2NvcHJvY2Vzc29yX2Vycm9yCkBAIC03OTcsMTMgKzc5OCwxNCBAQAogCXplcm9lbnRyeSBtYXRoX3N0YXRlX3Jlc3RvcmUKIAogCS8qIHJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCi1FTlRSWShkZWJ1ZykKK0tQUk9CRV9FTlRSWShkZWJ1ZykKIAlDRklfU1RBUlRQUk9DCiAJcHVzaHEgJDAKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAkJCiAJcGFyYW5vaWRlbnRyeSBkb19kZWJ1ZwogCWptcCBwYXJhbm9pZF9leGl0CiAJQ0ZJX0VORFBST0MKKwkucHJldmlvdXMgLnRleHQKIAogCS8qIHJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCQogRU5UUlkobm1pKQpAQCAtODU0LDggKzg1Niw5IEBACiAJam1wIHBhcmFub2lkX3VzZXJzcGFjZQogCUNGSV9FTkRQUk9DCiAKLUVOVFJZKGludDMpCitLUFJPQkVfRU5UUlkoaW50MykKIAl6ZXJvZW50cnkgZG9faW50MwkKKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkob3ZlcmZsb3cpCiAJemVyb2VudHJ5IGRvX292ZXJmbG93CkBAIC04OTIsOCArODk1LDkgQEAKIAlqbXAgcGFyYW5vaWRfZXhpdAogCUNGSV9FTkRQUk9DCiAKLUVOVFJZKGdlbmVyYWxfcHJvdGVjdGlvbikKK0tQUk9CRV9FTlRSWShnZW5lcmFsX3Byb3RlY3Rpb24pCiAJZXJyb3JlbnRyeSBkb19nZW5lcmFsX3Byb3RlY3Rpb24KKwkucHJldmlvdXMgLnRleHQKIAogRU5UUlkoYWxpZ25tZW50X2NoZWNrKQogCWVycm9yZW50cnkgZG9fYWxpZ25tZW50X2NoZWNrCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWMuYwppbmRleCAzMGM4NDNhLi5iMWMxNDRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vaXBpLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BQ1BJX0JVUykKKyNpZiBkZWZpbmVkKENPTkZJR19BQ1BJKQogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNlbmRpZgogCiAvKiB3aGljaCBsb2dpY2FsIENQVSBudW1iZXIgbWFwcyB0byB3aGljaCBDUFUgKHBoeXNpY2FsIEFQSUMgSUQpICovCi11OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07Cit1OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKIEVYUE9SVF9TWU1CT0woeDg2X2NwdV90b19hcGljaWQpOwogdTggeDg2X2NwdV90b19sb2dfYXBpY2lkW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKIApAQCAtNDcsNyArNDcsNyBAQAogCXU4IGNsdXN0ZXJfY250W05VTV9BUElDX0NMVVNURVJTXTsKIAlpbnQgbnVtX2NwdXMgPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQUNQSV9CVVMpCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkKIAkvKgogCSAqIFNvbWUgeDg2XzY0IG1hY2hpbmVzIHVzZSBwaHlzaWNhbCBBUElDIG1vZGUgcmVnYXJkbGVzcyBvZiBob3cgbWFueQogCSAqIHByb2NzL2NsdXN0ZXJzIGFyZSBwcmVzZW50ICh4ODZfNjQgRVM3MDAwIGlzIGFuIGV4YW1wbGUpLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jCmluZGV4IDk3MDNkYTcuLmY2NTIzZGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19jbHVzdGVyLmMKQEAgLTcyLDEwICs3MiwxNCBAQAogc3RhdGljIHZvaWQgY2x1c3Rlcl9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCiB7CiAJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKLQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKKwlpbnQgbWUgPSBnZXRfY3B1KCk7IC8qIEVuc3VyZSB3ZSBhcmUgbm90IHByZWVtcHRlZCB3aGVuIHdlIGNsZWFyICovCisKKwljcHVfY2xlYXIobWUsIG1hc2spOwogCiAJaWYgKCFjcHVzX2VtcHR5KG1hc2spKQogCQljbHVzdGVyX3NlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yKTsKKworCXB1dF9jcHUoKTsKIH0KIAogc3RhdGljIHZvaWQgY2x1c3Rlcl9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwppbmRleCBhZGM5NjI4Li42ZDU3ZGE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCkBAIC03OCw4ICs3OCwxOCBAQAogCiBzdGF0aWMgdm9pZCBmbGF0X3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKIHsKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJaWYgKCgobnVtX29ubGluZV9jcHVzKCkpIC0gMSkgPj0gMSkKIAkJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMQlVULCB2ZWN0b3IsQVBJQ19ERVNUX0xPR0lDQUwpOworI2Vsc2UKKwljcHVtYXNrX3QgYWxsYnV0bWUgPSBjcHVfb25saW5lX21hcDsKKwlpbnQgbWUgPSBnZXRfY3B1KCk7IC8qIEVuc3VyZSB3ZSBhcmUgbm90IHByZWVtcHRlZCB3aGVuIHdlIGNsZWFyICovCisJY3B1X2NsZWFyKG1lLCBhbGxidXRtZSk7CisKKwlpZiAoIWNwdXNfZW1wdHkoYWxsYnV0bWUpKQorCQlmbGF0X3NlbmRfSVBJX21hc2soYWxsYnV0bWUsIHZlY3Rvcik7CisJcHV0X2NwdSgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwppbmRleCBkMjA2ZDdlLi41ZjE1MjliIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAlzaG9ydCBhcGljLCBwaW4sIG5leHQ7CiB9IGlycV8yX3BpbltQSU5fTUFQX1NJWkVdOwogCi1pbnQgdmVjdG9yX2lycVtOUl9WRUNUT1JTXSA9IHsgWzAgLi4uIE5SX1ZFQ1RPUlMgLSAxXSA9IC0xfTsKK2ludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiBOUl9WRUNUT1JTIC0gMV0gPSAtMX07CiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKICNkZWZpbmUgdmVjdG9yX3RvX2lycSh2ZWN0b3IpIAlcCiAJKHBsYXRmb3JtX2xlZ2FjeV9pcnEodmVjdG9yKSA/IHZlY3RvciA6IHZlY3Rvcl9pcnFbdmVjdG9yXSkKQEAgLTc4LDYgKzc4LDU0IEBACiAjZGVmaW5lIHZlY3Rvcl90b19pcnEodmVjdG9yKQkodmVjdG9yKQogI2VuZGlmCiAKKyNkZWZpbmUgX19ET19BQ1RJT04oUiwgQUNUSU9OLCBGSU5BTCkJCQkJCVwKKwkJCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IHBpbjsJCQkJCQkJXAorCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5ID0gaXJxXzJfcGluICsgaXJxOwkJCVwKKwkJCQkJCQkJCVwKKwlmb3IgKDs7KSB7CQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IHJlZzsJCQkJCVwKKwkJcGluID0gZW50cnktPnBpbjsJCQkJCVwKKwkJaWYgKHBpbiA9PSAtMSkJCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCXJlZyA9IGlvX2FwaWNfcmVhZChlbnRyeS0+YXBpYywgMHgxMCArIFIgKyBwaW4qMik7CVwKKwkJcmVnIEFDVElPTjsJCQkJCQlcCisJCWlvX2FwaWNfbW9kaWZ5KGVudHJ5LT5hcGljLCByZWcpOwkJCVwKKwkJaWYgKCFlbnRyeS0+bmV4dCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJZW50cnkgPSBpcnFfMl9waW4gKyBlbnRyeS0+bmV4dDsJCQlcCisJfQkJCQkJCQkJXAorCUZJTkFMOwkJCQkJCQkJXAorfQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIHZvaWQgc2V0X2lvYXBpY19hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwljcHVtYXNrX3QgdG1wOworCisJY3B1c19hbmQodG1wLCBtYXNrLCBjcHVfb25saW5lX21hcCk7CisJaWYgKGNwdXNfZW1wdHkodG1wKSkKKwkJdG1wID0gVEFSR0VUX0NQVVM7CisKKwljcHVzX2FuZChtYXNrLCB0bXAsIENQVV9NQVNLX0FMTCk7CisKKwlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOworCisJLyoKKwkgKiBPbmx5IHRoZSBoaWdoIDggYml0cyBhcmUgdmFsaWQuCisJICovCisJZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlfX0RPX0FDVElPTigxLCA9IGRlc3QsICkKKwlzZXRfaXJxX2luZm8oaXJxLCBtYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKIC8qCiAgKiBUaGUgY29tbW9uIGNhc2UgaXMgMToxIElSUTwtPnBpbiBtYXBwaW5ncy4gU29tZXRpbWVzIHRoZXJlIGFyZQogICogc2hhcmVkIElTQS1zcGFjZSBJUlFzLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhlbS4gV2UgYXJlIHN1cGVyCkBAIC0xMDEsMjYgKzE0OSw2IEBACiAJZW50cnktPnBpbiA9IHBpbjsKIH0KIAotI2RlZmluZSBfX0RPX0FDVElPTihSLCBBQ1RJT04sIEZJTkFMKQkJCQkJXAotCQkJCQkJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgcGluOwkJCQkJCQlcCi0Jc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CQkJXAotCQkJCQkJCQkJXAotCWZvciAoOzspIHsJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgcmVnOwkJCQkJXAotCQlwaW4gPSBlbnRyeS0+cGluOwkJCQkJXAotCQlpZiAocGluID09IC0xKQkJCQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJcmVnID0gaW9fYXBpY19yZWFkKGVudHJ5LT5hcGljLCAweDEwICsgUiArIHBpbioyKTsJXAotCQlyZWcgQUNUSU9OOwkJCQkJCVwKLQkJaW9fYXBpY19tb2RpZnkoZW50cnktPmFwaWMsIHJlZyk7CQkJXAotCQlpZiAoIWVudHJ5LT5uZXh0KQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OwkJCVwKLQl9CQkJCQkJCQlcCi0JRklOQUw7CQkJCQkJCQlcCi19CiAKICNkZWZpbmUgRE9fQUNUSU9OKG5hbWUsUixBQ1RJT04sIEZJTkFMKQkJCQkJXAogCQkJCQkJCQkJXApAQCAtNjU1LDcgKzY4Myw3IEBACiB9CiAKIC8qIGlycV92ZWN0b3JzIGlzIGluZGV4ZWQgYnkgdGhlIHN1bSBvZiBhbGwgUlRFcyBpbiBhbGwgSS9PIEFQSUNzLiAqLwotdTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gPSB7IEZJUlNUX0RFVklDRV9WRUNUT1IgLCAwIH07Cit1OCBpcnFfdmVjdG9yW05SX0lSUV9WRUNUT1JTXSBfX3JlYWRfbW9zdGx5ID0geyBGSVJTVF9ERVZJQ0VfVkVDVE9SICwgMCB9OwogCiBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSkKIHsKQEAgLTc2Nyw2ICs3OTUsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAkJaW9fYXBpY193cml0ZShhcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7CiAJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMCkpOworCQlzZXRfbmF0aXZlX2lycV9pbmZvKGlycSwgVEFSR0VUX0NQVVMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCX0KIAl9CkBAIC0xMTM4LDkgKzExNjcsOSBAQAogCWNsZWFyX0lPX0FQSUMoKTsKIAogCS8qCi0JICogSWYgdGhlIGk4MjU1OSBpcyByb3V0ZWQgdGhyb3VnaCBhbiBJT0FQSUMKKwkgKiBJZiB0aGUgaTgyNTkgaXMgcm91dGVkIHRocm91Z2ggYW4gSU9BUElDCiAJICogUHV0IHRoYXQgSU9BUElDIGluIHZpcnR1YWwgd2lyZSBtb2RlCi0JICogc28gbGVnYWN5IGludGVycnVwcyBjYW4gYmUgZGVsaXZlcmVkLgorCSAqIHNvIGxlZ2FjeSBpbnRlcnJ1cHRzIGNhbiBiZSBkZWxpdmVyZWQuCiAJICovCiAJcGluID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOwogCWlmIChwaW4gIT0gLTEpIHsKQEAgLTEzMTQsNiArMTM0Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGFja19lZGdlX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKKwltb3ZlX2lycShpcnEpOwogCWlmICgoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX1BFTkRJTkcgfCBJUlFfRElTQUJMRUQpKQogCQkJCQk9PSAoSVJRX1BFTkRJTkcgfCBJUlFfRElTQUJMRUQpKQogCQltYXNrX0lPX0FQSUNfaXJxKGlycSk7CkBAIC0xMzQzLDI2ICsxMzczLDEwIEBACiAKIHN0YXRpYyB2b2lkIGVuZF9sZXZlbF9pb2FwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQogeworCW1vdmVfaXJxKGlycSk7CiAJYWNrX0FQSUNfaXJxKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGRlc3Q7Ci0KLQlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOwotCi0JLyoKLQkgKiBPbmx5IHRoZSBoaWdoIDggYml0cyBhcmUgdmFsaWQuCi0JICovCi0JZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlfX0RPX0FDVElPTigxLCA9IGRlc3QsICkKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9lZGdlX2lvYXBpY192ZWN0b3IodW5zaWduZWQgaW50IHZlY3RvcikKIHsKQEAgLTEzNzUsNiArMTM4OSw3IEBACiB7CiAJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKIAorCW1vdmVfbmF0aXZlX2lycSh2ZWN0b3IpOwogCWFja19lZGdlX2lvYXBpY19pcnEoaXJxKTsKIH0KIApAQCAtMTM4OSw2ICsxNDA0LDcgQEAKIHsKIAlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOwogCisJbW92ZV9uYXRpdmVfaXJxKHZlY3Rvcik7CiAJZW5kX2xldmVsX2lvYXBpY19pcnEoaXJxKTsKIH0KIApAQCAtMTQwNiwxNCArMTQyMiwxNyBAQAogCXVubWFza19JT19BUElDX2lycShpcnEpOwogfQogCisjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgc2V0X2lvYXBpY19hZmZpbml0eV92ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IsCiAJCQkJCWNwdW1hc2tfdCBjcHVfbWFzaykKIHsKIAlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOwogCisJc2V0X25hdGl2ZV9pcnFfaW5mbyh2ZWN0b3IsIGNwdV9tYXNrKTsKIAlzZXRfaW9hcGljX2FmZmluaXR5X2lycShpcnEsIGNwdV9tYXNrKTsKIH0KLSNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TTVAKKyNlbmRpZiAvLyBDT05GSUdfUENJX01TSQogCiAvKgogICogTGV2ZWwgYW5kIGVkZ2UgdHJpZ2dlcmVkIElPLUFQSUMgaW50ZXJydXB0cyBuZWVkIGRpZmZlcmVudCBoYW5kbGluZywKQEAgLTE0MjQsNyArMTQ0Myw3IEBACiAgKiByYWNlcy4KICAqLwogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgPSAiSU8tQVBJQy1lZGdlIiwKIAkuc3RhcnR1cCAJPSBzdGFydHVwX2VkZ2VfaW9hcGljLAogCS5zaHV0ZG93biAJPSBzaHV0ZG93bl9lZGdlX2lvYXBpYywKQEAgLTE0MzIsMTAgKzE0NTEsMTIgQEAKIAkuZGlzYWJsZSAJPSBkaXNhYmxlX2VkZ2VfaW9hcGljLAogCS5hY2sgCQk9IGFja19lZGdlX2lvYXBpYywKIAkuZW5kIAkJPSBlbmRfZWRnZV9pb2FwaWMsCisjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBzZXRfaW9hcGljX2FmZmluaXR5LAorI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19sZXZlbF90eXBlID0geworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpb2FwaWNfbGV2ZWxfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewogCS50eXBlbmFtZSA9ICJJTy1BUElDLWxldmVsIiwKIAkuc3RhcnR1cCAJPSBzdGFydHVwX2xldmVsX2lvYXBpYywKIAkuc2h1dGRvd24gCT0gc2h1dGRvd25fbGV2ZWxfaW9hcGljLApAQCAtMTQ0Myw3ICsxNDY0LDkgQEAKIAkuZGlzYWJsZSAJPSBkaXNhYmxlX2xldmVsX2lvYXBpYywKIAkuYWNrIAkJPSBtYXNrX2FuZF9hY2tfbGV2ZWxfaW9hcGljLAogCS5lbmQgCQk9IGVuZF9sZXZlbF9pb2FwaWMsCisjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBzZXRfaW9hcGljX2FmZmluaXR5LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9JT19BUElDX3RyYXBzKHZvaWQpCkBAIC0xNTA2LDcgKzE1MjksNyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaSkgeyAvKiBub3RoaW5nICovIH0KIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYXBpY19pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbGFwaWNfaXJxX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZW5hbWUgPSAibG9jYWwtQVBJQy1lZGdlIiwKIAkuc3RhcnR1cCA9IE5VTEwsIC8qIHN0YXJ0dXBfaXJxKCkgbm90IHVzZWQgZm9yIElSUTAgKi8KIAkuc2h1dGRvd24gPSBOVUxMLCAvKiBzaHV0ZG93bl9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLwpAQCAtMTg0MSw3ICsxODY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBJT0FQSUMgQ29uZmlndXJhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCiAjZGVmaW5lIElPX0FQSUNfTUFYX0lECQkweEZFCiAKQEAgLTE5MTgsMTIgKzE5NDEsMTMgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlpb19hcGljX3dyaXRlKGlvYXBpYywgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOwogCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyh1c2VfcGNpX3ZlY3RvcigpID8gIGVudHJ5LnZlY3RvciA6IGlycSwgVEFSR0VUX0NQVVMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAogCiAvKgpAQCAtMTkzMSw2ICsxOTU1LDcgQEAKICAqIHdlIG5lZWQgdG8gcmVwcm9ncmFtIHRoZSBpb3JlZHRibHMgdG8gY2F0ZXIgZm9yIHRoZSBjcHVzIHdoaWNoIGhhdmUgY29tZSBvbmxpbmUKICAqIHNvIG1hc2sgaW4gYWxsIGNhc2VzIHNob3VsZCBzaW1wbHkgYmUgVEFSR0VUX0NQVVMKICAqLworI2lmZGVmIENPTkZJR19TTVAKIHZvaWQgX19pbml0IHNldHVwX2lvYXBpY19kZXN0KHZvaWQpCiB7CiAJaW50IHBpbiwgaW9hcGljLCBpcnEsIGlycV9lbnRyeTsKQEAgLTE5NDksMyArMTk3NCw0IEBACiAKIAl9CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDVjNmRjNzAuLmRmMDhjNDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoraW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJLyogaW5zbjogbXVzdCBiZSBvbiBzcGVjaWFsIGV4ZWN1dGFibGUgcGFnZSBvbiB4ODZfNjQuICovCiAJdXAoJmtwcm9iZV9tdXRleCk7CkBAIC0xODksNyArMTg5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJczMyICpyaXBkaXNwOwogCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFKTsKQEAgLTIxNSwyMSArMjE1LDIxIEBACiAJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CiB9CiAKLXZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyLAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKLXZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit2b2lkIF9fa3Byb2JlcyBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAkqcC0+YWRkciA9IHAtPm9wY29kZTsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsCiAJCQkgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIH0KIAotdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVwKCZrcHJvYmVfbXV0ZXgpOwogCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJCWtwcm9iZV9zYXZlZF9yZmxhZ3MgJj0gfklGX01BU0s7CiB9CiAKLXN0YXRpYyB2b2lkIHByZXBhcmVfc2luZ2xlc3RlcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcmVncy0+ZWZsYWdzIHw9IFRGX01BU0s7CiAJcmVncy0+ZWZsYWdzICY9IH5JRl9NQVNLOwpAQCAtMjcyLDcgKzI3Miw4IEBACiAJCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc247CiB9CiAKLXZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgKnNhcmEgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcDsKICAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CkBAIC0yOTUsNyArMjk2LDcgQEAKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAzIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CiAgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2ggb3V0IHRoaXMgZnVuY3Rpb24uCiAgKi8KLWludCBrcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqcDsKIAlpbnQgcmV0ID0gMDsKQEAgLTMxMCw3ICszMTEsOCBAQAogCQkgICBEaXNhcm0gdGhlIHByb2JlIHdlIGp1c3QgaGl0LCBhbmQgaWdub3JlIGl0LiAqLwogCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKIAkJaWYgKHApIHsKLQkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MgJiYKKwkJCQkqcC0+YWluc24uaW5zbiA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CiAJCQkJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOwogCQkJCXJlZ3MtPmVmbGFncyB8PSBrcHJvYmVfc2F2ZWRfcmZsYWdzOwogCQkJCXVubG9ja19rcHJvYmVzKCk7CkBAIC0zNjAsNyArMzYyLDEwIEBACiAJCQkgKiBlaXRoZXIgYSBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludAogCQkJICogYXQgdGhpcyBhZGRyZXNzLiAgSW4gZWl0aGVyIGNhc2UsIG5vIGZ1cnRoZXIKIAkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlLgorCQkJICogQmFjayB1cCBvdmVyIHRoZSAobm93IG1pc3NpbmcpIGludDMgYW5kIHJ1bgorCQkJICogdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgogCQkJICovCisJCQlyZWdzLT5yaXAgPSAodW5zaWduZWQgbG9uZylhZGRyOwogCQkJcmV0ID0gMTsKIAkJfQogCQkvKiBOb3Qgb25lIG9mIG91cnM6IGxldCBrZXJuZWwgaGFuZGxlIGl0ICovCkBAIC0zOTksNyArNDA0LDcgQEAKIC8qCiAgKiBDYWxsZWQgd2hlbiB3ZSBoaXQgdGhlIHByb2JlIHBvaW50IGF0IGtyZXRwcm9iZV90cmFtcG9saW5lCiAgKi8KLWludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgX19rcHJvYmVzIHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKICAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkgPSBOVUxMOwogICAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTQ3OCw3ICs0ODMsNyBAQAogICogdGhhdCBpcyBhdG9wIHRoZSBzdGFjayBpcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIGNvcGllZCBpbnN0cnVjdGlvbi4KICAqIFdlIG5lZWQgdG8gbWFrZSBpdCB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgogICovCi1zdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19rcHJvYmVzIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyAqdG9zID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5yc3A7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3JpcCA9IDA7CkBAIC01MzYsNyArNTQxLDcgQEAKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAxIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CiAgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4gIEFuZCB3ZSBob2xkIGtwcm9iZSBsb2NrLgogICovCi1pbnQgcG9zdF9rcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgcG9zdF9rcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoIWtwcm9iZV9ydW5uaW5nKCkpCiAJCXJldHVybiAwOwpAQCAtNTcxLDcgKzU3Niw3IEBACiB9CiAKIC8qIEludGVycnVwdHMgZGlzYWJsZWQsIGtwcm9iZV9sb2NrIGhlbGQuICovCi1pbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpCitpbnQgX19rcHJvYmVzIGtwcm9iZV9mYXVsdF9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgdHJhcG5yKQogewogCWlmIChjdXJyZW50X2twcm9iZS0+ZmF1bHRfaGFuZGxlcgogCSAgICAmJiBjdXJyZW50X2twcm9iZS0+ZmF1bHRfaGFuZGxlcihjdXJyZW50X2twcm9iZSwgcmVncywgdHJhcG5yKSkKQEAgLTU5MCw4ICs1OTUsOCBAQAogLyoKICAqIFdyYXBwZXIgcm91dGluZSBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KICAqLwotaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJICAgICB2b2lkICpkYXRhKQoraW50IF9fa3Byb2JlcyBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKIAlzd2l0Y2ggKHZhbCkgewpAQCAtNjE5LDcgKzYyNCw3IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1pbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IF9fa3Byb2JlcyBzZXRqbXBfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGpwcm9iZSAqanAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGpwcm9iZSwga3ApOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTY0MCw3ICs2NDUsNyBAQAogCXJldHVybiAxOwogfQogCi12b2lkIGpwcm9iZV9yZXR1cm4odm9pZCkKK3ZvaWQgX19rcHJvYmVzIGpwcm9iZV9yZXR1cm4odm9pZCkKIHsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJYXNtIHZvbGF0aWxlICgiICAgICAgIHhjaGcgICAlJXJieCwlJXJzcCAgICAgXG4iCkBAIC02NTEsNyArNjU2LDcgQEAKIAkJICAgICAgKGpwcm9iZV9zYXZlZF9yc3ApOiJtZW1vcnkiKTsKIH0KIAotaW50IGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCBfX2twcm9iZXMgbG9uZ2ptcF9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXU4ICphZGRyID0gKHU4ICopIChyZWdzLT5yaXAgLSAxKTsKIAl1bnNpZ25lZCBsb25nIHN0YWNrX2FkZHIgPSAodW5zaWduZWQgbG9uZylqcHJvYmVfc2F2ZWRfcnNwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggNzljMzYyZC4uOGQ4ZWQ2YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCkBAIC03NCw3ICs3NCw3IEBACiBwaHlzaWRfbWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gUEhZU0lEX01BU0tfTk9ORTsKIAogLyogQUNQSSBNQURUIGVudHJ5IHBhcnNpbmcgZnVuY3Rpb25zICovCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiBleHRlcm4gc3RydWN0IGFjcGlfYm9vdF9mbGFncyBhY3BpX2Jvb3Q7CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiBleHRlcm4gaW50IGFjcGlfcGFyc2VfbGFwaWMgKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIpOwpAQCAtODQsNyArODQsNyBAQAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogZXh0ZXJuIGludCBhY3BpX3BhcnNlX2lvYXBpYyAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlcik7CiAjZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMqLwotI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCisjZW5kaWYgLypDT05GSUdfQUNQSSovCiAKIHU4IGJpb3NfY3B1X2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CiAKQEAgLTUxOSw4ICs1MTksNiBAQAogCXN0cnVjdCBpbnRlbF9tcF9mbG9hdGluZyAqbXBmID0gbXBmX2ZvdW5kOwogCiAJLyoKLSAJICogQUNQSSBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGVudGlyZSBTTVAgY29uZmlndXJhdGlvbiBvciBqdXN0IHRvIAotIAkgKiBlbnVtZXJhdGUvY29uZmlndXJlIHByb2Nlc3NvcnMgKENPTkZJR19BQ1BJX0JPT1QpLiAgTm90ZSB0aGF0IAogIAkgKiBBQ1BJIHN1cHBvcnRzIGJvdGggbG9naWNhbCAoZS5nLiBIeXBlci1UaHJlYWRpbmcpIGFuZCBwaHlzaWNhbCAKICAJICogcHJvY2Vzc29ycywgd2hlcmUgTVBTIG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwuCiAgCSAqLwpAQCAtNjczLDcgKzY3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBNUCBDb25maWd1cmF0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAKIHZvaWQgX19pbml0IG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MgKAogCXU2NAkJCWFkZHJlc3MpCkBAIC05MjksMTEgKzkyNyw5IEBACiAJaWYgKGFjcGlfaXJxX21vZGVsICE9IEFDUElfSVJRX01PREVMX0lPQVBJQykKIAkJcmV0dXJuIGdzaTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCiAJaWYgKGFjcGlfZmFkdC5zY2lfaW50ID09IGdzaSkKIAkJcmV0dXJuIGdzaTsKLSNlbmRpZgogCiAJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKIAlpZiAoaW9hcGljIDwgMCkgewpAQCAtOTczLDEzICs5NjksMTEgQEAKIAkJaWYgKGdzaSA8IE1BWF9HU0lfTlVNKSB7CiAJCQlpZiAoZ3NpID4gMTUpCiAJCQkJZ3NpID0gcGNpX2lycSsrOwotI2lmZGVmIENPTkZJR19BQ1BJX0JVUwogCQkJLyoKIAkJCSAqIERvbid0IGFzc2lnbiBJUlEgdXNlZCBieSBBQ1BJIFNDSQogCQkJICovCiAJCQlpZiAoZ3NpID09IGFjcGlfZmFkdC5zY2lfaW50KQogCQkJCWdzaSA9IHBjaV9pcnErKzsKLSNlbmRpZgogCQkJZ3NpX3RvX2lycVtpcnFdID0gZ3NpOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fRVJSICJHU0kgJXUgaXMgdG9vIGhpZ2hcbiIsIGdzaSk7CkBAIC05OTQsNCArOTg4LDQgQEAKIH0KIAogI2VuZGlmIC8qQ09ORklHX1g4Nl9JT19BUElDKi8KLSNlbmRpZiAvKkNPTkZJR19BQ1BJX0JPT1QqLworI2VuZGlmIC8qQ09ORklHX0FDUEkqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL25taS5jIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCmluZGV4IDY0YThlMDUuLmNhZjE2NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKQEAgLTQ2Myw2ICs0NjMsOCBAQAogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCiAJCXBlcl9jcHUobm1pX3RvdWNoLCBpKSA9IDE7CisKKyAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogfQogCiB2b2lkIG5taV93YXRjaGRvZ190aWNrIChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIHJlYXNvbikKQEAgLTUyMiwxNCArNTI0LDE0IEBACiAKIAlubWlfZW50ZXIoKTsKIAlhZGRfcGRhKF9fbm1pX2NvdW50LDEpOwotCWlmICghbm1pX2NhbGxiYWNrKHJlZ3MsIGNwdSkpCisJaWYgKCFyY3VfZGVyZWZlcmVuY2Uobm1pX2NhbGxiYWNrKShyZWdzLCBjcHUpKQogCQlkZWZhdWx0X2RvX25taShyZWdzKTsKIAlubWlfZXhpdCgpOwogfQogCiB2b2lkIHNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrX3QgY2FsbGJhY2spCiB7Ci0Jbm1pX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5taV9jYWxsYmFjaywgY2FsbGJhY2spOwogfQogCiB2b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzU3N2Y5ZC4uODY2MWY4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMTAsNiArMzEwLDcgQEAKIAogdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJcHJpbnRrKCJDUFUgJWQ6Iiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlfX3Nob3dfcmVncyhyZWdzKTsKIAlzaG93X3RyYWNlKCZyZWdzLT5yc3ApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYwppbmRleCAxMTZhNDkxLi45YWVjNTI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYwpAQCAtNjUsMTMgKzY1LDEzIEBACiAgKiBNYWNoaW5lIHNldHVwLi4KICAqLwogCi1zdHJ1Y3QgY3B1aW5mb194ODYgYm9vdF9jcHVfZGF0YTsKK3N0cnVjdCBjcHVpbmZvX3g4NiBib290X2NwdV9kYXRhIF9fcmVhZF9tb3N0bHk7CiAKIHVuc2lnbmVkIGxvbmcgbW11X2NyNF9mZWF0dXJlczsKIAogaW50IGFjcGlfZGlzYWJsZWQ7CiBFWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZWQpOwotI2lmZGVmCUNPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZglDT05GSUdfQUNQSQogZXh0ZXJuIGludCBfX2luaXRkYXRhIGFjcGlfaHQ7CiBleHRlcm4gYWNwaV9pbnRlcnJ1cHRfZmxhZ3MJYWNwaV9zY2lfZmxhZ3M7CiBpbnQgX19pbml0ZGF0YSBhY3BpX2ZvcmNlID0gMDsKQEAgLTI5NCw3ICsyOTQsNyBAQAogCQkJbWF4Y3B1cyA9IHNpbXBsZV9zdHJ0b3VsKGZyb20gKyA4LCBOVUxMLCAwKTsKIAkJfQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAJCS8qICJhY3BpPW9mZiIgZGlzYWJsZXMgYm90aCBBQ1BJIHRhYmxlIHBhcnNpbmcgYW5kIGludGVycHJldGVyIGluaXQgKi8KIAkJaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9b2ZmIiwgOCkpCiAJCQlkaXNhYmxlX2FjcGkoKTsKQEAgLTU2Niw3ICs1NjYsNyBAQAogCiAJaW5pdF9tZW1vcnlfbWFwcGluZygwLCAoZW5kX3Bmbl9tYXAgPDwgUEFHRV9TSElGVCkpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBBQ1BJIGJvb3QtdGltZSB0YWJsZSBwYXJzZXIgKGdldHMgdGhlIFJTRFAgYW5kIFNEVCkuCiAJICogQ2FsbCB0aGlzIGVhcmx5IGZvciBTUkFUIG5vZGUgc2V0dXAuCkBAIC02NTgsNyArNjU4LDcgQEAKIAogCWNoZWNrX2lvYXBpYygpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiAJLyoKIAkgKiBSZWFkIEFQSUMgYW5kIHNvbWUgb3RoZXIgZWFybHkgaW5mb3JtYXRpb24gZnJvbSBBQ1BJIHRhYmxlcy4KIAkgKi8KQEAgLTkyOSw3ICs5MjksNyBAQAogIAljLT54ODZfbnVtX2NvcmVzID0gaW50ZWxfbnVtX2NwdV9jb3JlcyhjKTsKIH0KIAotdm9pZCBfX2NwdWluaXQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAljaGFyICp2ID0gYy0+eDg2X3ZlbmRvcl9pZDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMKaW5kZXggMzQwODJjMS4uZTNmZmNhYyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jCkBAIC0zNiw3ICszNiw3IEBACiAKIGNoYXIgYm9vdF9jcHVfc3RhY2tbSVJRU1RBQ0tTSVpFXSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKLXVuc2lnbmVkIGxvbmcgX19zdXBwb3J0ZWRfcHRlX21hc2sgPSB+MFVMOwordW5zaWduZWQgbG9uZyBfX3N1cHBvcnRlZF9wdGVfbWFzayBfX3JlYWRfbW9zdGx5ID0gfjBVTDsKIHN0YXRpYyBpbnQgZG9fbm90X254IF9faW5pdGRhdGEgPSAwOwogCiAvKiBub2V4ZWM9b258b2ZmCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCBmYTI1ZTM5Li40ZmIzNGI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKQEAgLTYyLDEzICs2MiwxMyBAQAogLyogTnVtYmVyIG9mIHNpYmxpbmdzIHBlciBDUFUgcGFja2FnZSAqLwogaW50IHNtcF9udW1fc2libGluZ3MgPSAxOwogLyogUGFja2FnZSBJRCBvZiBlYWNoIGxvZ2ljYWwgQ1BVICovCi11OCBwaHlzX3Byb2NfaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwotdTggY3B1X2NvcmVfaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwordTggcGh5c19wcm9jX2lkW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwordTggY3B1X2NvcmVfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CiBFWFBPUlRfU1lNQk9MKHBoeXNfcHJvY19pZCk7CiBFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX2lkKTsKIAogLyogQml0bWFzayBvZiBjdXJyZW50bHkgb25saW5lIENQVXMgKi8KLWNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKK2NwdW1hc2tfdCBjcHVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5OwogCiBFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKIApAQCAtODgsOCArODgsOCBAQAogLyogU2V0IHdoZW4gdGhlIGlkbGVycyBhcmUgYWxsIGZvcmtlZCAqLwogaW50IHNtcF90aHJlYWRzX3JlYWR5OwogCi1jcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7Ci1jcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CitjcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CitjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX21hcCk7CiAKIC8qCkBAIC04OTQsMjMgKzg5NCw2IEBACiAJY3B1X3NldCgwLCBjcHVfY29yZV9tYXBbMF0pOwogfQogCi0vKgotICogSGFuZGxlIHVzZXIgY3B1cz0uLi4gcGFyYW1ldGVyLgotICovCi1zdGF0aWMgX19pbml0IHZvaWQgZW5mb3JjZV9tYXhfY3B1cyh1bnNpZ25lZCBtYXhfY3B1cykKLXsKLQlpbnQgaSwgazsKLQlrID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICghY3B1X3Bvc3NpYmxlKGkpKQotCQkJY29udGludWU7Ci0JCWlmICgrK2sgPiBtYXhfY3B1cykgewotCQkJY3B1X2NsZWFyKGksIGNwdV9wb3NzaWJsZV9tYXApOwotCQkJY3B1X2NsZWFyKGksIGNwdV9wcmVzZW50X21hcCk7Ci0JCX0KLQl9Ci19Ci0KICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qCiAgKiBjcHVfcG9zc2libGVfbWFwIHNob3VsZCBiZSBzdGF0aWMsIGl0IGNhbm5vdCBjaGFuZ2UgYXMgY3B1J3MKQEAgLTk5OSw4ICs5ODIsNiBAQAogCWN1cnJlbnRfY3B1X2RhdGEgPSBib290X2NwdV9kYXRhOwogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1ID0gMDsgIC8qIG5lZWRlZD8gKi8KIAotCWVuZm9yY2VfbWF4X2NwdXMobWF4X2NwdXMpOwotCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJcHJlZmlsbF9wb3NzaWJsZV9tYXAoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3N1c3BlbmRfYXNtLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZF9hc20uUwppbmRleCA1M2Y4ZTE2Li40ZDY1OWU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZF9hc20uUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZF9hc20uUwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiBFTlRSWShzd3N1c3BfYXJjaF9zdXNwZW5kKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwppbmRleCA2NmJmNmRkLi43YjZhYmUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKQEAgLTE3NiwxMCArMTc2LDcgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CiAKLQl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KLQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwotCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7Ci0JdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwludHBfY2xlYXIoKTsKIAogCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwogCWNsb2NrX3dhc19zZXQoKTsKQEAgLTQ3MSw3ICs0NjgsNyBAQAogICogb2ZmKSBpc24ndCBsaWtlbHkgdG8gZ28gYXdheSBtdWNoIHNvb25lciBhbnl3YXkuCiAgKi8KIAotCWlmICgofnRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgJiYgeHRpbWUudHZfc2VjID4gcnRjX3VwZGF0ZSAmJgorCWlmIChudHBfc3luY2VkKCkgJiYgeHRpbWUudHZfc2VjID4gcnRjX3VwZGF0ZSAmJgogCQlhYnMoeHRpbWUudHZfbnNlYyAtIDUwMDAwMDAwMCkgPD0gdGlja19uc2VjIC8gMikgewogCQlzZXRfcnRjX21tc3MoeHRpbWUudHZfc2VjKTsKIAkJcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyArIDY2MDsKQEAgLTEwNDEsNiArMTAzOCw3IEBACiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssZmxhZ3MpOwogCWppZmZpZXMgKz0gc2xlZXBfbGVuZ3RoOwogCXdhbGxfamlmZmllcyArPSBzbGVlcF9sZW5ndGg7CisJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDZlYWQ0MzMuLmYyMzhkNjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQxOSw4ICs0MjAsOSBAQAogCWRvX2V4aXQoU0lHU0VHVik7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsIAotCQkJICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsIHNpZ2luZm9fdCAqaW5mbykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBkb190cmFwKGludCB0cmFwbnIsIGludCBzaWduciwgY2hhciAqc3RyLAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsCisJCQkgICAgICBzaWdpbmZvX3QgKmluZm8pCiB7CiAJY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwogCkBAIC01MDQsNyArNTA2LDggQEAKIERPX0VSUk9SKDEyLCBTSUdCVVMsICAic3RhY2sgc2VnbWVudCIsIHN0YWNrX3NlZ21lbnQpCiBET19FUlJPUiggOCwgU0lHU0VHViwgImRvdWJsZSBmYXVsdCIsIGRvdWJsZV9mYXVsdCkKIAotYXNtbGlua2FnZSB2b2lkIGRvX2dlbmVyYWxfcHJvdGVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK2FzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICogcmVncywKKwkJCQkJCWxvbmcgZXJyb3JfY29kZSkKIHsKIAljb25kaXRpb25hbF9zdGkocmVncyk7CiAKQEAgLTYyMiw3ICs2MjUsNyBAQAogCQlpb19jaGVja19lcnJvcihyZWFzb24sIHJlZ3MpOwogfQogCi1hc21saW5rYWdlIHZvaWQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK2FzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlpZiAobm90aWZ5X2RpZShESUVfSU5UMywgImludDMiLCByZWdzLCBlcnJvcl9jb2RlLCAzLCBTSUdUUkFQKSA9PSBOT1RJRllfU1RPUCkgewogCQlyZXR1cm47CkBAIC02NTMsNyArNjU2LDggQEAKIH0KIAogLyogcnVucyBvbiBJU1Qgc3RhY2suICovCi1hc21saW5rYWdlIHZvaWQgZG9fZGVidWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCithc21saW5rYWdlIHZvaWQgX19rcHJvYmVzIGRvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICogcmVncywKKwkJCQkgICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBjb25kaXRpb247CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAyYTk0ZjliLi42ZGQ2NDJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMjEsNiArMjEsNyBAQAogCSooLnRleHQpCiAJU0NIRURfVEVYVAogCUxPQ0tfVEVYVAorCUtQUk9CRVNfVEVYVAogCSooLmZpeHVwKQogCSooLmdudS53YXJuaW5nKQogCX0gPSAweDkwOTAKQEAgLTE5MywyMCArMTk0LDcgQEAKICNlbmRpZgogCX0KIAotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICBTVEFCU19ERUJVRwogCi0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQorICBEV0FSRl9ERUJVRwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbGliL2NvcHlfdXNlci5TIGIvYXJjaC94ODZfNjQvbGliL2NvcHlfdXNlci5TCmluZGV4IGJkNTU2YzguLmRmYTM1OGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi9jb3B5X3VzZXIuUworKysgYi9hcmNoL3g4Nl82NC9saWIvY29weV91c2VyLlMKQEAgLTcsNyArNyw3IEBACiAjZGVmaW5lIEZJWF9BTElHTk1FTlQgMQogCQkKIAkjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KLQkjaW5jbHVkZSA8YXNtL29mZnNldC5oPgorCSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAkjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAJI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9nZXR1c2VyLlMgYi9hcmNoL3g4Nl82NC9saWIvZ2V0dXNlci5TCmluZGV4IGY4MGJhZmUuLjM4NDRkNWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi9nZXR1c2VyLlMKKysrIGIvYXJjaC94ODZfNjQvbGliL2dldHVzZXIuUwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAogCS50ZXh0CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvcHV0dXNlci5TIGIvYXJjaC94ODZfNjQvbGliL3B1dHVzZXIuUwppbmRleCA1ODI4YjgxLi43ZjU1OTM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvcHV0dXNlci5TCisrKyBiL2FyY2gveDg2XzY0L2xpYi9wdXR1c2VyLlMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vZmF1bHQuYyBiL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKaW5kZXggY2E5MTRjMy4uODE2NzMyZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgkJLyogRm9yIHVuYmxhbmtfc2NyZWVuKCkgKi8KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjk0LDcgKzI5NSw4IEBACiAgKgliaXQgMiA9PSAwIG1lYW5zIGtlcm5lbCwgMSBtZWFucyB1c2VyLW1vZGUKICAqICAgICAgYml0IDMgPT0gMSBtZWFucyBmYXVsdCB3YXMgYW4gaW5zdHJ1Y3Rpb24gZmV0Y2gKICAqLwotYXNtbGlua2FnZSB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK2FzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vbnVtYS5jIGIvYXJjaC94ODZfNjQvbW0vbnVtYS5jCmluZGV4IDZhMTU2ZjUuLjA0ZjdhMzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL251bWEuYworKysgYi9hcmNoL3g4Nl82NC9tbS9udW1hLmMKQEAgLTIyLDE0ICsyMiwxNCBAQAogI2RlZmluZSBEcHJpbnRrKHguLi4pCiAjZW5kaWYKIAotc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXTsKK3N0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKIGJvb3RtZW1fZGF0YV90IHBsYXRfbm9kZV9iZGF0YVtNQVhfTlVNTk9ERVNdOwogCiBpbnQgbWVtbm9kZV9zaGlmdDsKIHU4ICBtZW1ub2RlbWFwW05PREVNQVBTSVpFXTsKIAotdW5zaWduZWQgY2hhciBjcHVfdG9fbm9kZVtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBOVU1BX05PX05PREUgfTsKLWNwdW1hc2tfdCAgICAgbm9kZV90b19jcHVtYXNrW01BWF9OVU1OT0RFU107Cit1bnNpZ25lZCBjaGFyIGNwdV90b19ub2RlW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gTlVNQV9OT19OT0RFIH07CitjcHVtYXNrX3QgICAgIG5vZGVfdG9fY3B1bWFza1tNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7CiAKIGludCBudW1hX29mZiBfX2luaXRkYXRhOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUKaW5kZXggMzdjOTJlOC4uYmIzNGU1ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIG9iai15CQk6PSBpMzg2Lm8KIG9iai0kKENPTkZJR19QQ0lfRElSRUNUKSs9IGRpcmVjdC5vCiBvYmoteQkJKz0gZml4dXAubwotb2JqLSQoQ09ORklHX0FDUElfUENJKQkrPSBhY3BpLm8KK29iai0kKENPTkZJR19BQ1BJKQkrPSBhY3BpLm8KIG9iai15CQkJKz0gbGVnYWN5Lm8gaXJxLm8gY29tbW9uLm8KICMgbW1jb25maWcgaGFzIGEgNjRiaXQgc3BlY2lhbAogb2JqLSQoQ09ORklHX1BDSV9NTUNPTkZJRykgKz0gbW1jb25maWcubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlLUJVUyBiL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZS1CVVMKaW5kZXggMjkxOTg1Zi4uNGYwYzA1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlLUJVUworKysgYi9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUtQlVTCkBAIC04LDcgKzgsNyBAQAogb2JqLXkJCTo9IGkzODYubwogb2JqLSQoQ09ORklHX1BDSV9ESVJFQ1QpKz0gZGlyZWN0Lm8KIG9iai15CQkrPSBmaXh1cC5vCi1vYmotJChDT05GSUdfQUNQSV9QQ0kpCSs9IGFjcGkubworb2JqLSQoQ09ORklHX0FDUEkpCSs9IGFjcGkubwogb2JqLXkJCQkrPSBsZWdhY3kubyBpcnEubyBjb21tb24ubwogIyBtbWNvbmZpZyBoYXMgYSA2NGJpdCBzcGVjaWFsCiBvYmotJChDT05GSUdfUENJX01NQ09ORklHKSArPSBtbWNvbmZpZy5vCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL01ha2VmaWxlCmluZGV4IDI3ODQ3ZTQuLjY3ZWY0Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL01ha2VmaWxlCkBAIC02NiwxMyArNjYsNyBAQAogCiBhcmNoaW5jCQk6PSBpbmNsdWRlL2FzbS14dGVuc2EKIAotYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLnM6IFwKLQlhcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYyAkKGFyY2hpbmMpLy5wbGF0Zm9ybQotCi1pbmNsdWRlL2FzbS14dGVuc2Evb2Zmc2V0cy5oOiBhcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMucwotCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKLQotcHJlcGFyZTogJChhcmNoaW5jKS8ucGxhdGZvcm0gJChhcmNoaW5jKS9vZmZzZXRzLmgKK3ByZXBhcmU6ICQoYXJjaGluYykvLnBsYXRmb3JtCiAKICMgVXBkYXRlIG1hY2hpbmUgY3B1IGFuZCBwbGF0Zm9ybSBzeW1saW5rcyBpZiBzb21ldGhpbmcgd2hpY2ggYWZmZWN0cwogIyB0aGVtIGNoYW5nZWQuCkBAIC05NCw3ICs4OCw3IEBACiB6SW1hZ2UgekltYWdlLmluaXRyZDogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJEAKIAotQ0xFQU5fRklMRVMJKz0gYXJjaC94dGVuc2Evdm1saW51eC5sZHMgJChhcmNoaW5jKS9vZmZzZXQuaCBcCitDTEVBTl9GSUxFUwkrPSBhcmNoL3h0ZW5zYS92bWxpbnV4LmxkcyAgICAgICAgICAgICAgICAgICAgICBcCiAJCSAgICQoYXJjaGluYykvcGxhdGZvcm0gJChhcmNoaW5jKS94dGVuc2EvY29uZmlnIFwKIAkJICAgJChhcmNoaW5jKS8ucGxhdGZvcm0KIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2FsaWduLlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUwppbmRleCA3NGIxZTkwLi5hNDk1NjU3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCmluZGV4IGM2NGEwMWYuLjVjMDE4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCkBAIC0xNCw3ICsxNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNDA5OTcwMy4uYzgzYmIwZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KIAogZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCmluZGV4IGUwNzI4N2QuLjFhYzdkNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYwpAQCAtMTIyLDEwICsxMjIsNyBAQAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKIAotCXRpbWVfYWRqdXN0ID0gMDsgICAgICAgICAgICAgICAgLyogc3RvcCBhY3RpdmUgYWRqdGltZSgpICovCi0JdGltZV9zdGF0dXMgfD0gU1RBX1VOU1lOQzsKLQl0aW1lX21heGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOwotCXRpbWVfZXN0ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJbnRwX2NsZWFyKCk7CiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xODQsNyArMTgxLDcgQEAKIAkJbmV4dCArPSBDQ09VTlRfUEVSX0pJRkZZOwogCQlkb190aW1lciAocmVncyk7IC8qIExpbnV4IGhhbmRsZXIgaW4ga2VybmVsL3RpbWVyLmMgKi8KIAotCQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCQlpZiAobnRwX3N5bmNlZCgpICYmCiAJCSAgICB4dGltZS50dl9zZWMgLSBsYXN0X3J0Y191cGRhdGUgPj0gNjU5ICYmCiAJCSAgICBhYnMoKHh0aW1lLnR2X25zZWMvMTAwMCktKDEwMDAwMDAtMTAwMDAwMC9IWikpPDUwMDAwMDAvSFogJiYKIAkJICAgIGppZmZpZXMgLSB3YWxsX2ppZmZpZXMgPT0gMSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3ZlY3RvcnMuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC92ZWN0b3JzLlMKaW5kZXggODE4MDhmMC4uMGU3NDM5NyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3ZlY3RvcnMuUworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdmVjdG9ycy5TCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIuYyBiL2NyeXB0by9jaXBoZXIuYwppbmRleCAzZGY0N2Y5Li5kZmQ0YmNmIDEwMDY0NAotLS0gYS9jcnlwdG8vY2lwaGVyLmMKKysrIGIvY3J5cHRvL2NpcGhlci5jCkBAIC0xOTEsNiArMTkxLDggQEAKIAl1OCAqaXYgPSBkZXNjLT5pbmZvOwogCXVuc2lnbmVkIGludCBkb25lID0gMDsKIAorCW5ieXRlcyAtPSBic2l6ZTsKKwogCWRvIHsKIAkJeG9yKGl2LCBzcmMpOwogCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIGl2KTsKQEAgLTE5OCw3ICsyMDAsNyBAQAogCiAJCXNyYyArPSBic2l6ZTsKIAkJZHN0ICs9IGJzaXplOwotCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8IG5ieXRlcyk7CisJfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDw9IG5ieXRlcyk7CiAKIAlyZXR1cm4gZG9uZTsKIH0KQEAgLTIxOSw2ICsyMjEsOCBAQAogCXU4ICppdiA9IGRlc2MtPmluZm87CiAJdW5zaWduZWQgaW50IGRvbmUgPSAwOwogCisJbmJ5dGVzIC09IGJzaXplOworCiAJZG8gewogCQl1OCAqdG1wX2RzdCA9ICpkc3RfcDsKIApAQCAtMjMwLDcgKzIzNCw3IEBACiAKIAkJc3JjICs9IGJzaXplOwogCQlkc3QgKz0gYnNpemU7Ci0JfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDwgbmJ5dGVzKTsKKwl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPD0gbmJ5dGVzKTsKIAogCXJldHVybiBkb25lOwogfQpAQCAtMjQzLDEyICsyNDcsMTQgQEAKIAl2b2lkICgqZm4pKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOwogCXVuc2lnbmVkIGludCBkb25lID0gMDsKIAorCW5ieXRlcyAtPSBic2l6ZTsKKwogCWRvIHsKIAkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOwogCiAJCXNyYyArPSBic2l6ZTsKIAkJZHN0ICs9IGJzaXplOwotCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8IG5ieXRlcyk7CisJfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDw9IG5ieXRlcyk7CiAKIAlyZXR1cm4gZG9uZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDk2NjMxMzIuLjg2Yzg2NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kvCiBvYmotJChDT05GSUdfUEFSSVNDKQkJKz0gcGFyaXNjLwogb2JqLXkJCQkJKz0gdmlkZW8vCi1vYmotJChDT05GSUdfQUNQSV9CT09UKQkJKz0gYWNwaS8KK29iai0kKENPTkZJR19BQ1BJKQkJKz0gYWNwaS8KICMgUG5QIG11c3QgY29tZSBhZnRlciBBQ1BJIHNpbmNlIGl0IHdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIGNoZWNrIGlmIGFjcGkKICMgd2FzIHVzZWQgYW5kIGRvIG5vdGhpbmcgaWYgc28KIG9iai0kKENPTkZJR19QTlApCQkrPSBwbnAvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Fjb3JuL2Jsb2NrL2ZkMTc3Mi5jIGIvZHJpdmVycy9hY29ybi9ibG9jay9mZDE3NzIuYwppbmRleCBjMGEzN2Q5Li4wNDg1NDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Fjb3JuL2Jsb2NrL2ZkMTc3Mi5jCisrKyBiL2RyaXZlcnMvYWNvcm4vYmxvY2svZmQxNzcyLmMKQEAgLTM3NiwxOSArMzc2LDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbW90b3Jfb2ZmX3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihmZF9tb3Rvcl9vZmZfdGltZXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihtb3Rvcl9vZmZfdGltZXIsIGZkX21vdG9yX29mZl90aW1lciwgMCwgMCk7CiAKICNpZmRlZiBUUkFDS0JVRkZFUgotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJlYWR0cmFja190aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZmRfcmVhZHRyYWNrX2NoZWNrLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIocmVhZHRyYWNrX3RpbWVyLCBmZF9yZWFkdHJhY2tfY2hlY2ssIDAsIDApOwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0X3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihmZF90aW1lc19vdXQsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUih0aW1lb3V0X3RpbWVyLCBmZF90aW1lc19vdXQsIDAsIDApOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZmRfdGltZXIgPQotCVRJTUVSX0lOSVRJQUxJWkVSKGNoZWNrX2NoYW5nZSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGZkX3RpbWVyLCBjaGVja19jaGFuZ2UsIDAsIDApOwogCiAvKiBEQUc6IEhhdmVuJ3QgZ290IGEgY2x1ZSB3aGF0IHRoaXMgaXM/ICovCiBpbnQgc3RkbWFfaXNsb2NrZWQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggYmExMzg5Ni4uZmUxZTgxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTMsNyArMyw2IEBACiAjCiAKIG1lbnUgIkFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBNCiAJZGVwZW5kcyBvbiAhWDg2X1ZJU1dTCiAJZGVwZW5kcyBvbiAhSUE2NF9IUF9TSU0KIAlkZXBlbmRzIG9uIElBNjQgfHwgWDg2CkBAIC0xMSw2ICsxMCw4IEBACiBjb25maWcgQUNQSQogCWJvb2wgIkFDUEkgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIElBNjQgfHwgWDg2CisJc2VsZWN0IFBNCisJc2VsZWN0IFBDSQogCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQpAQCAtNDMsMjAgKzQ0LDEwIEBACiAKIGlmIEFDUEkKIAotY29uZmlnIEFDUElfQk9PVAotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIEFDUElfSU5URVJQUkVURVIKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWlmIEFDUElfSU5URVJQUkVURVIKLQogY29uZmlnIEFDUElfU0xFRVAKLQlib29sICJTbGVlcCBTdGF0ZXMgKEVYUEVSSU1FTlRBTCkiCisJYm9vbCAiU2xlZXAgU3RhdGVzIgogCWRlcGVuZHMgb24gWDg2ICYmICghU01QIHx8IFNVU1BFTkRfU01QKQotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBNCisJZGVwZW5kcyBvbiBQTQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgQUNQSSBzdXNwZW5kIHN0YXRlcy4gCkBAIC05MCwxNiArODEsMTYgQEAKIGNvbmZpZyBBQ1BJX0FDCiAJdHJpc3RhdGUgIkFDIEFkYXB0ZXIiCiAJZGVwZW5kcyBvbiBYODYKLQlkZWZhdWx0IG0KKwlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHRoZSBBQyBBZGFwdGVyIG9iamVjdCwgd2hpY2ggaW5kaWNhdGVzCi0JICB3aGV0aGVyIGEgc3lzdGVtIGlzIG9uIEFDLCBvciBub3QuICBUeXBpY2FsbHksIG9ubHkgbW9iaWxlIHN5c3RlbXMgCi0JICBoYXZlIHRoaXMgb2JqZWN0LCBzaW5jZSBkZXNrdG9wcyBhcmUgYWx3YXlzIG9uIEFDLgorCSAgd2hldGhlciBhIHN5c3RlbSBpcyBvbiBBQywgb3Igbm90LiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB0aGF0IGNhbgorCSAgc3dpdGNoIGJldHdlZW4gQS9DIGFuZCBiYXR0ZXJ5LCBzYXkgWS4KIAogY29uZmlnIEFDUElfQkFUVEVSWQogCXRyaXN0YXRlICJCYXR0ZXJ5IgogCWRlcGVuZHMgb24gWDg2Ci0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBiYXR0ZXJ5IGluZm9ybWF0aW9uIHRocm91Z2gKIAkgIC9wcm9jL2FjcGkvYmF0dGVyeS4gSWYgeW91IGhhdmUgYSBtb2JpbGUgc3lzdGVtIHdpdGggYSBiYXR0ZXJ5LCAKQEAgLTEwNywxOCArOTgsMTcgQEAKIAogY29uZmlnIEFDUElfQlVUVE9OCiAJdHJpc3RhdGUgIkJ1dHRvbiIKLQlkZWZhdWx0IG0KKwlkZWZhdWx0IHkKIAloZWxwCi0JICBUaGlzIGRyaXZlciByZWdpc3RlcnMgZm9yIGV2ZW50cyBiYXNlZCBvbiBidXR0b25zLCBzdWNoIGFzIHRoZQotCSAgcG93ZXIsIHNsZWVwLCBhbmQgbGlkIHN3aXRjaC4gIEluIHRoZSBmdXR1cmUsIGEgZGFlbW9uIHdpbGwgcmVhZAotCSAgL3Byb2MvYWNwaS9ldmVudCBhbmQgcGVyZm9ybSB1c2VyLWRlZmluZWQgYWN0aW9ucyBzdWNoIGFzIHNodXR0aW5nCi0JICBkb3duIHRoZSBzeXN0ZW0uICBVbnRpbCB0aGVuLCB5b3UgY2FuIGNhdCBpdCwgYW5kIHNlZSBvdXRwdXQgd2hlbgotCSAgYSBidXR0b24gaXMgcHJlc3NlZC4KKwkgIFRoaXMgZHJpdmVyIGhhbmRsZXMgZXZlbnRzIG9uIHRoZSBwb3dlciwgc2xlZXAgYW5kIGxpZCBidXR0b25zLgorCSAgQSBkYWVtb24gcmVhZHMgL3Byb2MvYWNwaS9ldmVudCBhbmQgcGVyZm9ybSB1c2VyLWRlZmluZWQgYWN0aW9ucworCSAgc3VjaCBhcyBzaHV0dGluZyBkb3duIHRoZSBzeXN0ZW0uICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IKKwkgIHNvZnR3YXJlIGNvbnRyb2xsZWQgcG93ZXJvZmYuCiAKIGNvbmZpZyBBQ1BJX1ZJREVPCiAJdHJpc3RhdGUgIlZpZGVvIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBYODYKKwlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIGRyaXZlciBpbXBsZW1lbnQgdGhlIEFDUEkgRXh0ZW5zaW9ucyBGb3IgRGlzcGxheSBBZGFwdGVycwogCSAgZm9yIGludGVncmF0ZWQgZ3JhcGhpY3MgZGV2aWNlcyBvbiBtb3RoZXJib2FyZCwgYXMgc3BlY2lmaWVkIGluCkBAIC0xMjksMTAgKzExOSw5IEBACiAJICBmb3IgeW91ciBpbnRlZ3JhdGVkIHZpZGVvIGRldmljZS4KIAogY29uZmlnIEFDUElfSE9US0VZCi0JdHJpc3RhdGUgIkdlbmVyaWMgSG90a2V5IgotCWRlcGVuZHMgb24gQUNQSV9JTlRFUlBSRVRFUgorCXRyaXN0YXRlICJHZW5lcmljIEhvdGtleSAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCisJZGVwZW5kcyBvbiBYODYKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBFeHBlcmltZW50YWwgY29uc29saWRhdGVkIGhvdGtleSBkcml2ZXIuCkBAIC0xNDAsMzEgKzEyOSwzMCBAQAogCiBjb25maWcgQUNQSV9GQU4KIAl0cmlzdGF0ZSAiRmFuIgotCWRlZmF1bHQgbQorCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgQUNQSSBmYW4gZGV2aWNlcywgYWxsb3dpbmcgdXNlci1tb2RlIAogCSAgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYmFzaWMgZmFuIGNvbnRyb2wgKG9uLCBvZmYsIHN0YXR1cykuCiAKIGNvbmZpZyBBQ1BJX1BST0NFU1NPUgogCXRyaXN0YXRlICJQcm9jZXNzb3IiCi0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW5zdGFsbHMgQUNQSSBhcyB0aGUgaWRsZSBoYW5kbGVyIGZvciBMaW51eCwgYW5kIHVzZXMKIAkgIEFDUEkgQzIgYW5kIEMzIHByb2Nlc3NvciBzdGF0ZXMgdG8gc2F2ZSBwb3dlciwgb24gc3lzdGVtcyB0aGF0Ci0JICBzdXBwb3J0IGl0LgorCSAgc3VwcG9ydCBpdC4gIEl0IGlzIHJlcXVpcmVkIGJ5IHNldmVyYWwgZmxhdm9ycyBvZiBjcHVmcmVxCisJICBQZXJmb3JtYW5jZS1zdGF0ZSBkcml2ZXJzLgogCiBjb25maWcgQUNQSV9IT1RQTFVHX0NQVQotCWJvb2wgIlByb2Nlc3NvciBIb3RwbHVnIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gQUNQSV9QUk9DRVNTT1IgJiYgSE9UUExVR19DUFUgJiYgRVhQRVJJTUVOVEFMCisJYm9vbAorCWRlcGVuZHMgb24gQUNQSV9QUk9DRVNTT1IgJiYgSE9UUExVR19DUFUKIAlzZWxlY3QgQUNQSV9DT05UQUlORVIKLQlkZWZhdWx0IG4KLQkgLS0taGVscC0tLQotCSBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0IHBoeXNpY2FsIENQVSBob3RwbHVnLgorCWRlZmF1bHQgeQogCiBjb25maWcgQUNQSV9USEVSTUFMCiAJdHJpc3RhdGUgIlRoZXJtYWwgWm9uZSIKIAlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SCi0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBBQ1BJIHRoZXJtYWwgem9uZXMuICBNb3N0IG1vYmlsZSBhbmQKIAkgIHNvbWUgZGVza3RvcCBzeXN0ZW1zIHN1cHBvcnQgQUNQSSB0aGVybWFsIHpvbmVzLiAgSXQgaXMgSElHSExZCkBAIC0xODAsNyArMTY4LDcgQEAKIGNvbmZpZyBBQ1BJX0FTVVMKICAgICAgICAgdHJpc3RhdGUgIkFTVVMvTWVkaW9uIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBYODYKLQlkZWZhdWx0IG0KKwlkZWZhdWx0IHkKICAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGV4dHJhIGZlYXR1cmVzIG9mIEFDUEktY29tcGF0aWJsZQogICAgICAgICAgIEFTVVMgbGFwdG9wcy4gQXMgc29tZSBvZiBNZWRpb24gbGFwdG9wcyBhcmUgbWFkZSBieSBBU1VTLCBpdCBtYXkgYWxzbwpAQCAtMjA5LDcgKzE5Nyw3IEBACiBjb25maWcgQUNQSV9JQk0KIAl0cmlzdGF0ZSAiSUJNIFRoaW5rUGFkIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBYODYKLQlkZWZhdWx0IG0KKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgTGludXggQUNQSSBkcml2ZXIgZm9yIHRoZSBJQk0gVGhpbmtQYWQgbGFwdG9wcy4gSXQgYWRkcwogCSAgc3VwcG9ydCBmb3IgRm4tRngga2V5IGNvbWJpbmF0aW9ucywgQmx1ZXRvb3RoIGNvbnRyb2wsIHZpZGVvCkBAIC0yMjIsNyArMjEwLDcgQEAKIGNvbmZpZyBBQ1BJX1RPU0hJQkEKIAl0cmlzdGF0ZSAiVG9zaGliYSBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gWDg2Ci0JZGVmYXVsdCBtCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBhY2Nlc3MgdG8gY2VydGFpbiBzeXN0ZW0gc2V0dGluZ3MKIAkgIG9uICJsZWdhY3kgZnJlZSIgVG9zaGliYSBsYXB0b3BzLiAgVGhlc2UgbGFwdG9wcyBjYW4gYmUgcmVjb2duaXplZCBieQpAQCAtMjYyLDggKzI1MCw3IEBACiAJICBFbnRlciB0aGUgZnVsbCBwYXRoIG5hbWUgdG8gdGhlIGZpbGUgd2ljaCBpbmNsdWRlcyB0aGUgQW1sQ29kZSBkZWNsYXJhdGlvbi4KIAogY29uZmlnIEFDUElfQkxBQ0tMSVNUX1lFQVIKLQlpbnQgIkRpc2FibGUgQUNQSSBmb3Igc3lzdGVtcyBiZWZvcmUgSmFuIDFzdCB0aGlzIHllYXIiCi0JZGVwZW5kcyBvbiBBQ1BJX0lOVEVSUFJFVEVSCisJaW50ICJEaXNhYmxlIEFDUEkgZm9yIHN5c3RlbXMgYmVmb3JlIEphbiAxc3QgdGhpcyB5ZWFyIiBpZiBYODYKIAlkZWZhdWx0IDAKIAloZWxwCiAJICBlbnRlciBhIDQtZGlnaXQgeWVhciwgZWcuIDIwMDEgdG8gZGlzYWJsZSBBQ1BJIGJ5IGRlZmF1bHQKQEAgLTI4MSwxMCArMjY4LDYgQEAKIAkgIG9mIHZlcmJvc2l0eS4gU2F5aW5nIFkgZW5hYmxlcyB0aGVzZSBzdGF0ZW1lbnRzLiBUaGlzIHdpbGwgaW5jcmVhc2UKIAkgIHlvdXIga2VybmVsIHNpemUgYnkgYXJvdW5kIDUwSy4KIAotY29uZmlnIEFDUElfQlVTCi0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgQUNQSV9FQwogCWJvb2wKIAlkZXBlbmRzIG9uIFg4NgpAQCAtMjk4LDEwICsyODEsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFDUElfUENJCi0JYm9vbAotCWRlZmF1bHQgUENJCi0KIGNvbmZpZyBBQ1BJX1NZU1RFTQogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTMwOSwxNCArMjg4LDExIEBACiAJICBUaGlzIGRyaXZlciB3aWxsIGVuYWJsZSB5b3VyIHN5c3RlbSB0byBzaHV0IGRvd24gdXNpbmcgQUNQSSwgYW5kCiAJICBkdW1wIHlvdXIgQUNQSSBEU0RUIHRhYmxlIHVzaW5nIC9wcm9jL2FjcGkvZHNkdC4KIAotZW5kaWYJIyBBQ1BJX0lOVEVSUFJFVEVSCi0KIGNvbmZpZyBYODZfUE1fVElNRVIKIAlib29sICJQb3dlciBNYW5hZ2VtZW50IFRpbWVyIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBYODYKLQlkZXBlbmRzIG9uIEFDUElfQk9PVCAmJiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uICFYODZfNjQKLQlkZWZhdWx0IG4KKwlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGUgUG93ZXIgTWFuYWdlbWVudCBUaW1lciBpcyBhdmFpbGFibGUgb24gYWxsIEFDUEktY2FwYWJsZSwKIAkgIGluIG1vc3QgY2FzZXMgZXZlbiBpZiBBQ1BJIGlzIHVudXNhYmxlIG9yIGJsYWNrbGlzdGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IGFkNjdlOGYuLmExODI0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTE1LDEzICsxNSwxMyBAQAogIwogIyBBQ1BJIEJvb3QtVGltZSBUYWJsZSBQYXJzaW5nCiAjCi1vYmotJChDT05GSUdfQUNQSV9CT09UKQkJKz0gdGFibGVzLm8KLW9iai0kKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKQkrPSBibGFja2xpc3Qubworb2JqLXkJCQkJKz0gdGFibGVzLm8KK29iai15CQkJCSs9IGJsYWNrbGlzdC5vCiAKICMKICMgQUNQSSBDb3JlIFN1YnN5c3RlbSAoSW50ZXJwcmV0ZXIpCiAjCi1vYmotJChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikJKz0gb3NsLm8gdXRpbHMubyBcCitvYmoteQkJCQkrPSBvc2wubyB1dGlscy5vIFwKIAkJCQkgICBkaXNwYXRjaGVyLyBldmVudHMvIGV4ZWN1dGVyLyBoYXJkd2FyZS8gXAogCQkJCSAgIG5hbWVzcGFjZS8gcGFyc2VyLyByZXNvdXJjZXMvIHRhYmxlcy8gXAogCQkJCSAgIHV0aWxpdGllcy8KQEAgLTM1LDggKzM1LDggQEAKIHByb2Nlc3Nvci1vYmpzCSs9IHByb2Nlc3Nvcl9wZXJmbGliLm8JCQkKIGVuZGlmCiAKLW9iai0kKENPTkZJR19BQ1BJX0JVUykJCSs9IHNsZWVwLwotb2JqLSQoQ09ORklHX0FDUElfQlVTKQkJKz0gYnVzLm8gZ2x1ZS5vCitvYmoteQkJCQkrPSBzbGVlcC8KK29iai15CQkJCSs9IGJ1cy5vIGdsdWUubwogb2JqLSQoQ09ORklHX0FDUElfQUMpIAkJKz0gYWMubwogb2JqLSQoQ09ORklHX0FDUElfQkFUVEVSWSkJKz0gYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQUNQSV9CVVRUT04pCSs9IGJ1dHRvbi5vCkBAIC00NCw3ICs0NCw3IEBACiBvYmotJChDT05GSUdfQUNQSV9GQU4pCQkrPSBmYW4ubwogb2JqLSQoQ09ORklHX0FDUElfVklERU8pCSs9IHZpZGVvLm8gCiBvYmotJChDT05GSUdfQUNQSV9IT1RLRVkpCSs9IGhvdGtleS5vCi1vYmotJChDT05GSUdfQUNQSV9QQ0kpCQkrPSBwY2lfcm9vdC5vIHBjaV9saW5rLm8gcGNpX2lycS5vIHBjaV9iaW5kLm8KK29iai15CQkJCSs9IHBjaV9yb290Lm8gcGNpX2xpbmsubyBwY2lfaXJxLm8gcGNpX2JpbmQubwogb2JqLSQoQ09ORklHX0FDUElfUE9XRVIpCSs9IHBvd2VyLm8KIG9iai0kKENPTkZJR19BQ1BJX1BST0NFU1NPUikJKz0gcHJvY2Vzc29yLm8KIG9iai0kKENPTkZJR19BQ1BJX0NPTlRBSU5FUikJKz0gY29udGFpbmVyLm8KQEAgLTU1LDUgKzU1LDUgQEAKIG9iai0kKENPTkZJR19BQ1BJX0FTVVMpCQkrPSBhc3VzX2FjcGkubwogb2JqLSQoQ09ORklHX0FDUElfSUJNKQkJKz0gaWJtX2FjcGkubwogb2JqLSQoQ09ORklHX0FDUElfVE9TSElCQSkJKz0gdG9zaGliYV9hY3BpLm8KLW9iai0kKENPTkZJR19BQ1BJX0JVUykJCSs9IHNjYW4ubyBtb3RoZXJib2FyZC5vCitvYmoteQkJCQkrPSBzY2FuLm8gbW90aGVyYm9hcmQubwogb2JqLSQoQ09ORklHX0FDUElfSE9UUExVR19NRU1PUlkpCSs9IGFjcGlfbWVtaG90cGx1Zy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWMuYyBiL2RyaXZlcnMvYWNwaS9hYy5jCmluZGV4IDIzYWI3NjEuLjc4MzliODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hYy5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBBQ1BJX0FDX0NPTVBPTkVOVAkJMHgwMDAyMDAwMAogI2RlZmluZSBBQ1BJX0FDX0NMQVNTCQkJImFjX2FkYXB0ZXIiCiAjZGVmaW5lIEFDUElfQUNfSElEIAkJCSJBQ1BJMDAwMyIKQEAgLTQ1LDQ3ICs0NCw0NSBAQAogI2RlZmluZSBBQ1BJX0FDX1NUQVRVU19VTktOT1dOCQkweEZGCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9BQ19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9hYyIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2FjIikKIAotTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0FDX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCBhY3BpX2FjX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2FjX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9hY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2FjX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX2FjX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYWNfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfQUNfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9BQ19DTEFTUywKLQkuaWRzID0JCUFDUElfQUNfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9hY19hZGQsCi0JCQkJLnJlbW92ZSA9CWFjcGlfYWNfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfQUNfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9BQ19DTEFTUywKKwkuaWRzID0gQUNQSV9BQ19ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfYWNfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9hY19yZW1vdmUsCisJCX0sCiB9OwogCiBzdHJ1Y3QgYWNwaV9hYyB7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKLQl1bnNpZ25lZCBsb25nCQlzdGF0ZTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYWNfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2FjX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfYWNfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUMgQWRhcHRlciBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX2FjX2dldF9zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfYWMJCSphYykKK3N0YXRpYyBpbnQgYWNwaV9hY19nZXRfc3RhdGUoc3RydWN0IGFjcGlfYWMgKmFjKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWNfZ2V0X3N0YXRlIik7CiAKQEAgLTk1LDI0ICs5MiwyMyBAQAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihhYy0+aGFuZGxlLCAiX1BTUiIsIE5VTEwsICZhYy0+c3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIHJlYWRpbmcgQUMgQWRhcHRlciBzdGF0ZVxuIikpOworCQkJCSAgIkVycm9yIHJlYWRpbmcgQUMgQWRhcHRlciBzdGF0ZVxuIikpOwogCQlhYy0+c3RhdGUgPSBBQ1BJX0FDX1NUQVRVU19VTktOT1dOOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQotCQorCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9hY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX2FjX2RpcjsKIAogc3RhdGljIGludCBhY3BpX2FjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfYWMJCSphYyA9IChzdHJ1Y3QgYWNwaV9hYyAqKSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfYWMgKmFjID0gKHN0cnVjdCBhY3BpX2FjICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19zZXFfc2hvdyIpOwogCkBAIC0xMzksMjMgKzEzNSwyMSBAQAogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQotCQorCiBzdGF0aWMgaW50IGFjcGlfYWNfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9hY19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfYWNfYWRkX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9hY19hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2FjX2FkZF9mcyIpOwogCiAJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IHByb2NfbWtkaXIoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQlhY3BpX2FjX2Rpcik7CisJCQkJCQkgICAgIGFjcGlfYWNfZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC0xNjMsMTEgKzE1NywxMSBAQAogCiAJLyogJ3N0YXRlJyBbUl0gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfQUNfRklMRV9TVEFURSwKLQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9BQ19GSUxFX1NUQVRFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9BQ19GSUxFX1NUQVRFKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9hY19mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTE3NywxNiArMTcxLDEyIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYWNfcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9hY19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19yZW1vdmVfZnMiKTsKIAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0FDX0ZJTEVfU1RBVEUsCi0JCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQUNfRklMRV9TVEFURSwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCiAJCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBhY3BpX2FjX2Rpcik7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gTlVMTDsKQEAgLTE5NSwxOSArMTg1LDE0IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBNb2RlbAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfYWNfbm90aWZ5ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWV2ZW50LAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfYWNfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX2FjCQkqYWMgPSAoc3RydWN0IGFjcGlfYWMgKikgZGF0YTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfYWMgKmFjID0gKHN0cnVjdCBhY3BpX2FjICopZGF0YTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2FjX25vdGlmeSIpOwogCkBAIC0yMjQsMjEgKzIwOSwxOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9hY19hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2FjX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9hYwkJKmFjID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9hYyAqYWMgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19hZGQiKTsKIApAQCAtMjY0LDE5ICsyNDYsMjAgQEAKIAkJZ290byBlbmQ7CiAKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoYWMtPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX2FjX25vdGlmeSwgYWMpOworCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwgYWNwaV9hY19ub3RpZnksCisJCQkJCSAgICAgYWMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkgICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdICglcylcbiIsIAotCQlhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCAKLQkJYWMtPnN0YXRlPyJvbi1saW5lIjoib2ZmLWxpbmUiKTsKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJXMpXG4iLAorCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCSAgICAgICBhYy0+c3RhdGUgPyAib24tbGluZSIgOiAib2ZmLWxpbmUiKTsKIAotZW5kOgorICAgICAgZW5kOgogCWlmIChyZXN1bHQpIHsKIAkJYWNwaV9hY19yZW1vdmVfZnMoZGV2aWNlKTsKIAkJa2ZyZWUoYWMpOwpAQCAtMjg1LDI3ICsyNjgsMjMgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2FjX3JlbW92ZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV9hY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9hYwkJKmFjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9hYyAqYWMgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9hY19yZW1vdmUiKTsKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWFjID0gKHN0cnVjdCBhY3BpX2FjICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlhYyA9IChzdHJ1Y3QgYWNwaV9hYyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGFjLT5oYW5kbGUsCi0JCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV9hY19ub3RpZnkpOworCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX2FjX25vdGlmeSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAogCWFjcGlfYWNfcmVtb3ZlX2ZzKGRldmljZSk7CiAKQEAgLTMxNCwxMSArMjkzLDkgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfYWNfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfYWNfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2FjX2luaXQiKTsKIApAQCAtMzM2LDkgKzMxMyw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9hY19leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfYWNfZXhpdCh2b2lkKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWNfZXhpdCIpOwogCkBAIC0zNDksNiArMzI0LDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX2FjX2luaXQpOwogbW9kdWxlX2V4aXQoYWNwaV9hY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwppbmRleCA3NzI4NWZmLi4wMWExYmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgQUNQSV9NRU1PUllfREVWSUNFX0NPTVBPTkVOVAkJMHgwODAwMDAwMFVMCiAjZGVmaW5lIEFDUElfTUVNT1JZX0RFVklDRV9DTEFTUwkJIm1lbW9yeSIKICNkZWZpbmUgQUNQSV9NRU1PUllfREVWSUNFX0hJRAkJCSJQTlAwQzgwIgpAQCAtNDEsOCArNDAsOCBAQAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfTUVNT1JZX0RFVklDRV9DT01QT05FTlQKIAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX21lbW9yeSIpCi1NT0RVTEVfQVVUSE9SKCJOYXZlZW4gQiBTIDxuYXZlZW4uYi5zQGludGVsLmNvbT4iKTsKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfbWVtb3J5IikKKyAgICBNT0RVTEVfQVVUSE9SKCJOYXZlZW4gQiBTIDxuYXZlZW4uYi5zQGludGVsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX01FTU9SWV9ERVZJQ0VfRFJJVkVSX05BTUUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCkBAIC01NiwzNCArNTUsMzMgQEAKICNkZWZpbmUgTUVNT1JZX1BPV0VSX09OX1NUQVRFCTEKICNkZWZpbmUgTUVNT1JZX1BPV0VSX09GRl9TVEFURQkyCiAKLXN0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX21lbW9yeV9kZXZpY2VfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX21lbW9yeV9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfbWVtb3J5X2RldmljZV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9NRU1PUllfREVWSUNFX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfTUVNT1JZX0RFVklDRV9DTEFTUywKLQkuaWRzID0JCUFDUElfTUVNT1JZX0RFVklDRV9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX21lbW9yeV9kZXZpY2VfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX21lbW9yeV9kZXZpY2VfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfTUVNT1JZX0RFVklDRV9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX01FTU9SWV9ERVZJQ0VfQ0xBU1MsCisJLmlkcyA9IEFDUElfTUVNT1JZX0RFVklDRV9ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfbWVtb3J5X2RldmljZV9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX21lbW9yeV9kZXZpY2VfcmVtb3ZlLAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSB7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwotCXVuc2lnbmVkIGludCBzdGF0ZTsJCS8qIFN0YXRlIG9mIHRoZSBtZW1vcnkgZGV2aWNlICovCisJdW5zaWduZWQgaW50IHN0YXRlOwkvKiBTdGF0ZSBvZiB0aGUgbWVtb3J5IGRldmljZSAqLwogCXVuc2lnbmVkIHNob3J0IGNhY2hlX2F0dHJpYnV0ZTsJLyogbWVtb3J5IGNhY2hlIGF0dHJpYnV0ZSAqLwotCXVuc2lnbmVkIHNob3J0IHJlYWRfd3JpdGVfYXR0cmlidXRlOy8qIG1lbW9yeSByZWFkL3dyaXRlIGF0dHJpYnV0ZSAqLwotCXU2NCBzdGFydF9hZGRyOwkvKiBNZW1vcnkgUmFuZ2Ugc3RhcnQgcGh5c2ljYWwgYWRkciAqLwotCXU2NCBlbmRfYWRkcjsJLyogTWVtb3J5IFJhbmdlIGVuZCBwaHlzaWNhbCBhZGRyICovCisJdW5zaWduZWQgc2hvcnQgcmVhZF93cml0ZV9hdHRyaWJ1dGU7CS8qIG1lbW9yeSByZWFkL3dyaXRlIGF0dHJpYnV0ZSAqLworCXU2NCBzdGFydF9hZGRyOwkJLyogTWVtb3J5IFJhbmdlIHN0YXJ0IHBoeXNpY2FsIGFkZHIgKi8KKwl1NjQgZW5kX2FkZHI7CQkvKiBNZW1vcnkgUmFuZ2UgZW5kIHBoeXNpY2FsIGFkZHIgKi8KIH07CiAKLQogc3RhdGljIGludAogYWNwaV9tZW1vcnlfZ2V0X2RldmljZV9yZXNvdXJjZXMoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzNjQ7CiAKQEAgLTk0LDE1ICs5MiwxNSBAQAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKikgYnVmZmVyLnBvaW50ZXI7CisJcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKilidWZmZXIucG9pbnRlcjsKIAlzdGF0dXMgPSBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXNvdXJjZSwgJmFkZHJlc3M2NCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWlmIChhZGRyZXNzNjQucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgewogCQkJLyogUG9wdWxhdGUgdGhlIHN0cnVjdHVyZSAqLwogCQkJbWVtX2RldmljZS0+Y2FjaGVfYXR0cmlidXRlID0KLQkJCQlhZGRyZXNzNjQuYXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGU7CisJCQkgICAgYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlOwogCQkJbWVtX2RldmljZS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPQotCQkJYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGU7CisJCQkgICAgYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGU7CiAJCQltZW1fZGV2aWNlLT5zdGFydF9hZGRyID0gYWRkcmVzczY0Lm1pbl9hZGRyZXNzX3JhbmdlOwogCQkJbWVtX2RldmljZS0+ZW5kX2FkZHIgPSBhZGRyZXNzNjQubWF4X2FkZHJlc3NfcmFuZ2U7CiAJCX0KQEAgLTExNCw3ICsxMTIsNyBAQAogCiBzdGF0aWMgaW50CiBhY3BpX21lbW9yeV9nZXRfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICoqbWVtX2RldmljZSkKKwkJICAgICAgIHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKiptZW1fZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSBwaGFuZGxlOwpAQCAtMTI4LDggKzEyNiw3IEBACiAKIAlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGhhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW4gYWNwaV9nZXRfcGFyZW50XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBpbiBhY3BpX2dldF9wYXJlbnRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCX0KIApAQCAtMTM3LDcgKzEzNCw3IEBACiAJc3RhdHVzID0gYWNwaV9idXNfZ2V0X2RldmljZShwaGFuZGxlLCAmcGRldmljZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW4gYWNwaV9idXNfZ2V0X2RldmljZVxuIikpOworCQkJCSAgIkVycm9yIGluIGFjcGlfYnVzX2dldF9kZXZpY2VcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCX0KIApAQCAtMTQ3LDIzICsxNDQsMjEgQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2J1c19hZGQoJmRldmljZSwgcGRldmljZSwgaGFuZGxlLCBBQ1BJX0JVU19UWVBFX0RFVklDRSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW4gYWNwaV9idXNfYWRkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBpbiBhY3BpX2J1c19hZGRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCSptZW1fZGV2aWNlID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWlmICghKCptZW1fZGV2aWNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlxuIGRyaXZlciBkYXRhIG5vdCBmb3VuZCIgKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiBkcml2ZXIgZGF0YSBub3QgZm91bmQiKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9tZW1vcnlfY2hlY2tfZGV2aWNlKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2NoZWNrX2RldmljZShzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlKQogewogCXVuc2lnbmVkIGxvbmcgY3VycmVudF9zdGF0dXM7CiAKQEAgLTE3MSwyMiArMTY2LDIxIEBACiAKIAkvKiBHZXQgZGV2aWNlIHByZXNlbnQvYWJzZW50IGluZm9ybWF0aW9uIGZyb20gdGhlIF9TVEEgKi8KIAlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfaW50ZWdlcihtZW1fZGV2aWNlLT5oYW5kbGUsICJfU1RBIiwKLQkJTlVMTCwgJmN1cnJlbnRfc3RhdHVzKSkpCisJCQkJCSAgICAgICBOVUxMLCAmY3VycmVudF9zdGF0dXMpKSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCS8qCiAJICogQ2hlY2sgZm9yIGRldmljZSBzdGF0dXMuIERldmljZSBzaG91bGQgYmUKIAkgKiBwcmVzZW50L2VuYWJsZWQvZnVuY3Rpb25pbmcuCiAJICovCiAJaWYgKCEoKGN1cnJlbnRfc3RhdHVzICYgQUNQSV9NRU1PUllfU1RBX1BSRVNFTlQpCi0JCSYmIChjdXJyZW50X3N0YXR1cyAmIEFDUElfTUVNT1JZX1NUQV9FTkFCTEVEKQotCQkmJiAoY3VycmVudF9zdGF0dXMgJiBBQ1BJX01FTU9SWV9TVEFfRlVOQ1RJT05BTCkpKQorCSAgICAgICYmIChjdXJyZW50X3N0YXR1cyAmIEFDUElfTUVNT1JZX1NUQV9FTkFCTEVEKQorCSAgICAgICYmIChjdXJyZW50X3N0YXR1cyAmIEFDUElfTUVNT1JZX1NUQV9GVU5DVElPTkFMKSkpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9tZW1vcnlfZW5hYmxlX2RldmljZShzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlKQorc3RhdGljIGludCBhY3BpX21lbW9yeV9lbmFibGVfZGV2aWNlKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UpCiB7CiAJaW50IHJlc3VsdDsKIApAQCAtMTk2LDcgKzE5MCw3IEBACiAJcmVzdWx0ID0gYWNwaV9tZW1vcnlfZ2V0X2RldmljZV9yZXNvdXJjZXMobWVtX2RldmljZSk7CiAJaWYgKHJlc3VsdCkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlxuZ2V0X2RldmljZV9yZXNvdXJjZXMgZmFpbGVkXG4iKSk7CisJCQkJICAiXG5nZXRfZGV2aWNlX3Jlc291cmNlcyBmYWlsZWRcbiIpKTsKIAkJbWVtX2RldmljZS0+c3RhdGUgPSBNRU1PUllfSU5WQUxJRF9TVEFURTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0yMDYsMTEgKzIwMCwxMCBAQAogCSAqIE5vdGU6IEFzc3VtZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MKIAkgKi8KIAlyZXN1bHQgPSBhZGRfbWVtb3J5KG1lbV9kZXZpY2UtPnN0YXJ0X2FkZHIsCi0JCQkobWVtX2RldmljZS0+ZW5kX2FkZHIgLSBtZW1fZGV2aWNlLT5zdGFydF9hZGRyKSArIDEsCi0JCQltZW1fZGV2aWNlLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSk7CisJCQkgICAgKG1lbV9kZXZpY2UtPmVuZF9hZGRyIC0gbWVtX2RldmljZS0+c3RhcnRfYWRkcikgKyAxLAorCQkJICAgIG1lbV9kZXZpY2UtPnJlYWRfd3JpdGVfYXR0cmlidXRlKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiXG5hZGRfbWVtb3J5IGZhaWxlZFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiXG5hZGRfbWVtb3J5IGZhaWxlZFxuIikpOwogCQltZW1fZGV2aWNlLT5zdGF0ZSA9IE1FTU9SWV9JTlZBTElEX1NUQVRFOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTIxOCwxMSArMjExLDEwIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludAotYWNwaV9tZW1vcnlfcG93ZXJkb3duX2RldmljZShzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICptZW1fZGV2aWNlKQorc3RhdGljIGludCBhY3BpX21lbW9yeV9wb3dlcmRvd25fZGV2aWNlKHN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CWFyZ19saXN0OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OwogCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKIAl1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RhdHVzOwogCkBAIC0yMzQsMTYgKzIyNiwxNiBAQAogCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CiAJYXJnLmludGVnZXIudmFsdWUgPSAxOwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KG1lbV9kZXZpY2UtPmhhbmRsZSwKLQkJCSJfRUowIiwgJmFyZ19saXN0LCBOVUxMKTsKKwkJCQkgICAgICAiX0VKMCIsICZhcmdfbGlzdCwgTlVMTCk7CiAJLyogUmV0dXJuIG9uIF9FSjAgZmFpbHVyZSAqLwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCJfRUowIGZhaWxlZC5cbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIl9FSjAgZmFpbGVkLlxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJLyogRXZhbHV0ZSBfU1RBIHRvIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgZGlzYWJsZWQgKi8KIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIobWVtX2RldmljZS0+aGFuZGxlLCAiX1NUQSIsCi0JCU5VTEwsICZjdXJyZW50X3N0YXR1cyk7CisJCQkJICAgICAgIE5VTEwsICZjdXJyZW50X3N0YXR1cyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKQEAgLTI1NCw4ICsyNDYsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9tZW1vcnlfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSkKIHsKIAlpbnQgcmVzdWx0OwogCXU2NCBzdGFydCA9IG1lbV9kZXZpY2UtPnN0YXJ0X2FkZHI7CkBAIC0yNzgsNyArMjY5LDcgQEAKIAlyZXN1bHQgPSBhY3BpX21lbW9yeV9wb3dlcmRvd25fZGV2aWNlKG1lbV9kZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkRldmljZSBQb3dlciBEb3duIGZhaWxlZC5cbiIpKTsKKwkJCQkgICJEZXZpY2UgUG93ZXIgRG93biBmYWlsZWQuXG4iKSk7CiAJCS8qIFNldCB0aGUgc3RhdHVzIG9mIHRoZSBkZXZpY2UgdG8gaW52YWxpZCAqLwogCQltZW1fZGV2aWNlLT5zdGF0ZSA9IE1FTU9SWV9JTlZBTElEX1NUQVRFOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMjg4LDggKzI3OSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfbWVtb3J5X2RldmljZV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX21lbW9yeV9kZXZpY2Vfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2U7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CkBAIC0yOTksMzcgKzI4OSwzNyBAQAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEFDUElfTk9USUZZX0JVU19DSEVDSzoKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlxuUmVjZWl2ZWQgQlVTIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlXG4iKSk7CisJCQkJICAiXG5SZWNlaXZlZCBCVVMgQ0hFQ0sgbm90aWZpY2F0aW9uIGZvciBkZXZpY2VcbiIpKTsKIAkJLyogRmFsbCBUaHJvdWdoICovCiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6CiAJCWlmIChldmVudCA9PSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0spCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiXG5SZWNlaXZlZCBERVZJQ0UgQ0hFQ0sgbm90aWZpY2F0aW9uIGZvciBkZXZpY2VcbiIpKTsKKwkJCQkJICAiXG5SZWNlaXZlZCBERVZJQ0UgQ0hFQ0sgbm90aWZpY2F0aW9uIGZvciBkZXZpY2VcbiIpKTsKIAkJaWYgKGFjcGlfbWVtb3J5X2dldF9kZXZpY2UoaGFuZGxlLCAmbWVtX2RldmljZSkpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIkVycm9yIGluIGZpbmRpbmcgZHJpdmVyIGRhdGFcbiIpKTsKKwkJCQkJICAiRXJyb3IgaW4gZmluZGluZyBkcml2ZXIgZGF0YVxuIikpOwogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KIAogCQlpZiAoIWFjcGlfbWVtb3J5X2NoZWNrX2RldmljZShtZW1fZGV2aWNlKSkgewogCQkJaWYgKGFjcGlfbWVtb3J5X2VuYWJsZV9kZXZpY2UobWVtX2RldmljZSkpCiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiRXJyb3IgaW4gYWNwaV9tZW1vcnlfZW5hYmxlX2RldmljZVxuIikpOworCQkJCQkJICAiRXJyb3IgaW4gYWNwaV9tZW1vcnlfZW5hYmxlX2RldmljZVxuIikpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVDoKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlxuUmVjZWl2ZWQgRUpFQ1QgUkVRVUVTVCBub3RpZmljYXRpb24gZm9yIGRldmljZVxuIikpOworCQkJCSAgIlxuUmVjZWl2ZWQgRUpFQ1QgUkVRVUVTVCBub3RpZmljYXRpb24gZm9yIGRldmljZVxuIikpOwogCiAJCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSkpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSJEZXZpY2UgZG9lc24ndCBleGlzdFxuIikpOworCQkJCQkgICJEZXZpY2UgZG9lc24ndCBleGlzdFxuIikpOwogCQkJYnJlYWs7CiAJCX0KIAkJbWVtX2RldmljZSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJaWYgKCFtZW1fZGV2aWNlKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiRHJpdmVyIERhdGEgaXMgTlVMTFxuIikpOworCQkJCQkgICJEcml2ZXIgRGF0YSBpcyBOVUxMXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0zMzcsMjYgKzMyNywyNSBAQAogCQkgKiBDdXJyZW50bHkgZGlzYWJsaW5nIG1lbW9yeSBkZXZpY2UgZnJvbSBrZXJuZWwgbW9kZQogCQkgKiBUQkQ6IENhbiBhbHNvIGJlIGRpc2FibGVkIGZyb20gdXNlciBtb2RlIHNjcmlwdHMKIAkJICogVEJEOiBDYW4gYWxzbyBiZSBkaXNhYmxlZCBieSBDYWxsYmFjayByZWdpc3RyYXRpb24KLQkJICogCXdpdGggZ2VuZXJpYyBzeXNmcyBkcml2ZXIKKwkJICogICAgICB3aXRoIGdlbmVyaWMgc3lzZnMgZHJpdmVyCiAJCSAqLwogCQlpZiAoYWNwaV9tZW1vcnlfZGlzYWJsZV9kZXZpY2UobWVtX2RldmljZSkpCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJFcnJvciBpbiBhY3BpX21lbW9yeV9kaXNhYmxlX2RldmljZVxuIikpOworCQkJCQkgICJFcnJvciBpbiBhY3BpX21lbW9yeV9kaXNhYmxlX2RldmljZVxuIikpOwogCQkvKgogCQkgKiBUQkQ6IEludm9rZSBhY3BpX2J1c19yZW1vdmUgdG8gY2xlYW51cCBkYXRhIHN0cnVjdHVyZXMKIAkJICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CisJCQkJICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotc3RhdGljIGludAotYWNwaV9tZW1vcnlfZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBhY3BpX21lbW9yeV9kZXZpY2UgKm1lbV9kZXZpY2UgPSBOVUxMOwpAQCAtMzkxLDggKzM4MCw3IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfbWVtb3J5X2RldmljZV9yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZSA9IE5VTEw7CiAKQEAgLTQwMSw3ICszODksNyBAQAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCW1lbV9kZXZpY2UgPSAoc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJbWVtX2RldmljZSA9IChzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWtmcmVlKG1lbV9kZXZpY2UpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwpAQCAtNDEwLDEyICszOTgsMTEgQEAKIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIG1lbW9yeSBkZXZpY2UKICAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1pc19tZW1vcnlfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBpc19tZW1vcnlfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAljaGFyICpoYXJkd2FyZV9pZDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqaW5mbzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImlzX21lbW9yeV9kZXZpY2UiKTsKQEAgLTQzMiw3ICs0MTksNyBAQAogCiAJaGFyZHdhcmVfaWQgPSBpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZTsKIAlpZiAoKGhhcmR3YXJlX2lkID09IE5VTEwpIHx8Ci0JCShzdHJjbXAoaGFyZHdhcmVfaWQsIEFDUElfTUVNT1JZX0RFVklDRV9ISUQpKSkKKwkgICAgKHN0cmNtcChoYXJkd2FyZV9pZCwgQUNQSV9NRU1PUllfREVWSUNFX0hJRCkpKQogCQlzdGF0dXMgPSBBRV9FUlJPUjsKIAogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CkBAIC00NDAsOCArNDI3LDggQEAKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX21lbW9yeV9yZWdpc3Rlcl9ub3RpZnlfaGFuZGxlciAoYWNwaV9oYW5kbGUgaGFuZGxlLAotCXUzMiBsZXZlbCwgdm9pZCAqY3R4dCwgdm9pZCAqKnJldHYpCithY3BpX21lbW9yeV9yZWdpc3Rlcl9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgIHUzMiBsZXZlbCwgdm9pZCAqY3R4dCwgdm9pZCAqKnJldHYpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC00NTIsMTAgKzQzOSwxMCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwkvKiBjb250aW51ZSAqLwogCiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGhhbmRsZSwgQUNQSV9TWVNURU1fTk9USUZZLAotCQkJYWNwaV9tZW1vcnlfZGV2aWNlX25vdGlmeSwgTlVMTCk7CisJCQkJCSAgICAgYWNwaV9tZW1vcnlfZGV2aWNlX25vdGlmeSwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsJLyogY29udGludWUgKi8KIAl9CiAKQEAgLTQ2Myw4ICs0NTAsOCBAQAogfQogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbWVtb3J5X2RlcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIgKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCSAgICAgICB1MzIgbGV2ZWwsIHZvaWQgKmN0eHQsIHZvaWQgKipyZXR2KQorYWNwaV9tZW1vcnlfZGVyZWdpc3Rlcl9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgICAgdTMyIGxldmVsLCB2b2lkICpjdHh0LCB2b2lkICoqcmV0dikKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKQEAgLTQ3NSwxOCArNDYyLDE4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CS8qIGNvbnRpbnVlICovCiAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihoYW5kbGUsCi0JCQlBQ1BJX1NZU1RFTV9OT1RJRlksIGFjcGlfbWVtb3J5X2RldmljZV9ub3RpZnkpOworCQkJCQkgICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkgICAgYWNwaV9tZW1vcnlfZGV2aWNlX25vdGlmeSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsJLyogY29udGludWUgKi8KIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfbWVtb3J5X2RldmljZV9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9tZW1vcnlfZGV2aWNlX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTQ5OSwyMSArNDg2LDIwIEBACiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCQlBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJYWNwaV9tZW1vcnlfcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIsCi0JCQkJTlVMTCwgTlVMTCk7CisJCQkJICAgICBBQ1BJX1VJTlQzMl9NQVgsCisJCQkJICAgICBhY3BpX21lbW9yeV9yZWdpc3Rlcl9ub3RpZnlfaGFuZGxlciwKKwkJCQkgICAgIE5VTEwsIE5VTEwpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZFxuIikpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkXG4iKSk7CiAJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX21lbW9yeV9kZXZpY2VfZHJpdmVyKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotICAgICAgICB9CisJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfbWVtb3J5X2RldmljZV9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfbWVtb3J5X2RldmljZV9leGl0KHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC01MjQsMTIgKzUxMCwxMiBAQAogCSAqIGhhbmRsZXMuCiAJICovCiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJQUNQSV9VSU5UMzJfTUFYLAotCQkJYWNwaV9tZW1vcnlfZGVyZWdpc3Rlcl9ub3RpZnlfaGFuZGxlciwKLQkJCU5VTEwsIE5VTEwpOworCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAorCQkJCSAgICAgYWNwaV9tZW1vcnlfZGVyZWdpc3Rlcl9ub3RpZnlfaGFuZGxlciwKKwkJCQkgICAgIE5VTEwsIE5VTEwpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWRcbiIpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWRcbiIpKTsKIAogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX21lbW9yeV9kZXZpY2VfZHJpdmVyKTsKIApAQCAtNTM4LDUgKzUyNCwzIEBACiAKIG1vZHVsZV9pbml0KGFjcGlfbWVtb3J5X2RldmljZV9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfbWVtb3J5X2RldmljZV9leGl0KTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKaW5kZXggYTU2MGIxZS4uZmVjODk1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwpAQCAtNjEsNyArNjEsNyBAQAogLyoKICAqIFNvbWUgZXZlbnRzIHdlIHVzZSwgc2FtZSBmb3IgYWxsIEFzdXMKICAqLwotI2RlZmluZSBCUl9VUCAgICAgICAweDEwICAgICAgCQkKKyNkZWZpbmUgQlJfVVAgICAgICAgMHgxMAogI2RlZmluZSBCUl9ET1dOICAgICAweDIwCiAKIC8qCkBAIC03NSw3ICs3NSw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9IT1RLX05BTUUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0KIHN0YXRpYyB1aWRfdCBhc3VzX3VpZDsKIHN0YXRpYyBnaWRfdCBhc3VzX2dpZDsKIG1vZHVsZV9wYXJhbShhc3VzX3VpZCwgdWludCwgMCk7CkBAIC04MywyNiArODIsMjUgQEAKIG1vZHVsZV9wYXJhbShhc3VzX2dpZCwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGdpZCwgIkdJRCBmb3IgZW50cmllcyBpbiAvcHJvYy9hY3BpL2FzdXMuXG4iKTsKIAotCiAvKiBGb3IgZWFjaCBtb2RlbCwgYWxsIGZlYXR1cmVzIGltcGxlbWVudGVkLCAKICAqIHRob3NlIG1hcmtlZCB3aXRoIFIgYXJlIHJlbGF0aXZlIHRvIEhPVEssIEEgZm9yIGFic29sdXRlICovCiBzdHJ1Y3QgbW9kZWxfZGF0YSB7Ci0JY2hhciAqbmFtZTsgICAgICAgICAgICAgIC8vbmFtZSBvZiB0aGUgbGFwdG9wX19fX19fX19fX19fX19fX0EKLQljaGFyICptdF9tbGVkOyAgICAgICAgICAgLy9tZXRob2QgdG8gaGFuZGxlIG1sZWRfX19fX19fX19fX19fUgotCWNoYXIgKm1sZWRfc3RhdHVzOyAgICAgICAvL25vZGUgdG8gaGFuZGxlIG1sZWQgcmVhZGluZ19fX19fX19BCi0JY2hhciAqbXRfd2xlZDsgICAgICAgICAgIC8vbWV0aG9kIHRvIGhhbmRsZSB3bGVkX19fX19fX19fX19fX1IKLQljaGFyICp3bGVkX3N0YXR1czsgICAgICAgLy9ub2RlIHRvIGhhbmRsZSB3bGVkIHJlYWRpbmdfX19fX19fQQotIAljaGFyICptdF90bGVkOyAgICAgICAgICAgLy9tZXRob2QgdG8gaGFuZGxlIHRsZWRfX19fX19fX19fX19fUgotIAljaGFyICp0bGVkX3N0YXR1czsgICAgICAgLy9ub2RlIHRvIGhhbmRsZSB0bGVkIHJlYWRpbmdfX19fX19fQQotCWNoYXIgKm10X2xjZF9zd2l0Y2g7ICAgICAvL21ldGhvZCB0byB0dXJuIExDRCBPTi9PRkZfX19fX19fX19BCi0JY2hhciAqbGNkX3N0YXR1czsgICAgICAgIC8vbm9kZSB0byByZWFkIExDRCBwYW5lbCBzdGF0ZV9fX19fX0EKLQljaGFyICpicmlnaHRuZXNzX3VwOyAgICAgLy9tZXRob2QgdG8gc2V0IGJyaWdodG5lc3MgdXBfX19fX19fQQotCWNoYXIgKmJyaWdodG5lc3NfZG93bjsgICAvL2d1ZXNzIHdoYXQgP19fX19fX19fX19fX19fX19fX19fX19BCi0JY2hhciAqYnJpZ2h0bmVzc19zZXQ7ICAgIC8vbWV0aG9kIHRvIHNldCBhYnNvbHV0ZSBicmlnaHRuZXNzX1IKLQljaGFyICpicmlnaHRuZXNzX2dldDsgICAgLy9tZXRob2QgdG8gZ2V0IGFic29sdXRlIGJyaWdodG5lc3NfUgotCWNoYXIgKmJyaWdodG5lc3Nfc3RhdHVzOyAvL25vZGUgdG8gZ2V0IGJyaWdodG5lc3NfX19fX19fX19fX19BCi0JY2hhciAqZGlzcGxheV9zZXQ7ICAgICAgIC8vbWV0aG9kIHRvIHNldCB2aWRlbyBvdXRwdXRfX19fX19fX1IKLQljaGFyICpkaXNwbGF5X2dldDsgICAgICAgLy9tZXRob2QgdG8gZ2V0IHZpZGVvIG91dHB1dF9fX19fX19fUgorCWNoYXIgKm5hbWU7CQkvL25hbWUgb2YgdGhlIGxhcHRvcF9fX19fX19fX19fX19fX19BCisJY2hhciAqbXRfbWxlZDsJCS8vbWV0aG9kIHRvIGhhbmRsZSBtbGVkX19fX19fX19fX19fX1IKKwljaGFyICptbGVkX3N0YXR1czsJLy9ub2RlIHRvIGhhbmRsZSBtbGVkIHJlYWRpbmdfX19fX19fQQorCWNoYXIgKm10X3dsZWQ7CQkvL21ldGhvZCB0byBoYW5kbGUgd2xlZF9fX19fX19fX19fX19SCisJY2hhciAqd2xlZF9zdGF0dXM7CS8vbm9kZSB0byBoYW5kbGUgd2xlZCByZWFkaW5nX19fX19fX0EKKwljaGFyICptdF90bGVkOwkJLy9tZXRob2QgdG8gaGFuZGxlIHRsZWRfX19fX19fX19fX19fUgorCWNoYXIgKnRsZWRfc3RhdHVzOwkvL25vZGUgdG8gaGFuZGxlIHRsZWQgcmVhZGluZ19fX19fX19BCisJY2hhciAqbXRfbGNkX3N3aXRjaDsJLy9tZXRob2QgdG8gdHVybiBMQ0QgT04vT0ZGX19fX19fX19fQQorCWNoYXIgKmxjZF9zdGF0dXM7CS8vbm9kZSB0byByZWFkIExDRCBwYW5lbCBzdGF0ZV9fX19fX0EKKwljaGFyICpicmlnaHRuZXNzX3VwOwkvL21ldGhvZCB0byBzZXQgYnJpZ2h0bmVzcyB1cF9fX19fX19BCisJY2hhciAqYnJpZ2h0bmVzc19kb3duOwkvL2d1ZXNzIHdoYXQgP19fX19fX19fX19fX19fX19fX19fX19BCisJY2hhciAqYnJpZ2h0bmVzc19zZXQ7CS8vbWV0aG9kIHRvIHNldCBhYnNvbHV0ZSBicmlnaHRuZXNzX1IKKwljaGFyICpicmlnaHRuZXNzX2dldDsJLy9tZXRob2QgdG8gZ2V0IGFic29sdXRlIGJyaWdodG5lc3NfUgorCWNoYXIgKmJyaWdodG5lc3Nfc3RhdHVzOwkvL25vZGUgdG8gZ2V0IGJyaWdodG5lc3NfX19fX19fX19fX19BCisJY2hhciAqZGlzcGxheV9zZXQ7CS8vbWV0aG9kIHRvIHNldCB2aWRlbyBvdXRwdXRfX19fX19fX1IKKwljaGFyICpkaXNwbGF5X2dldDsJLy9tZXRob2QgdG8gZ2V0IHZpZGVvIG91dHB1dF9fX19fX19fUgogfTsKIAogLyoKQEAgLTExMCwzNCArMTA4LDM0IEBACiAgKiBhYm91dCB0aGUgaG90ayBkZXZpY2UKICAqLwogc3RydWN0IGFzdXNfaG90ayB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7IC8vdGhlIGRldmljZSB3ZSBhcmUgaW4KLQlhY3BpX2hhbmRsZSBoYW5kbGU7ICAgICAgICAgLy90aGUgaGFuZGxlIG9mIHRoZSBob3RrIGRldmljZQotCWNoYXIgc3RhdHVzOyAgICAgICAgICAgICAgICAvL3N0YXR1cyBvZiB0aGUgaG90aywgZm9yIExFRHMsIC4uLgotCXN0cnVjdCBtb2RlbF9kYXRhICptZXRob2RzOyAvL21ldGhvZHMgYXZhaWxhYmxlIG9uIHRoZSBsYXB0b3AKLQl1OCBicmlnaHRuZXNzOyAgICAgICAgICAgICAgLy9icmlnaHRuZXNzIGxldmVsCisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CS8vdGhlIGRldmljZSB3ZSBhcmUgaW4KKwlhY3BpX2hhbmRsZSBoYW5kbGU7CS8vdGhlIGhhbmRsZSBvZiB0aGUgaG90ayBkZXZpY2UKKwljaGFyIHN0YXR1czsJCS8vc3RhdHVzIG9mIHRoZSBob3RrLCBmb3IgTEVEcywgLi4uCisJc3RydWN0IG1vZGVsX2RhdGEgKm1ldGhvZHM7CS8vbWV0aG9kcyBhdmFpbGFibGUgb24gdGhlIGxhcHRvcAorCXU4IGJyaWdodG5lc3M7CQkvL2JyaWdodG5lc3MgbGV2ZWwKIAllbnVtIHsKLQkJQTF4ID0gMCwgIC8vQTEzNDBELCBBMTMwMEYKLQkJQTJ4LCAgICAgIC8vQTI1MDBICi0JCUQxeCwgICAgICAvL0QxCi0JCUwyRCwgICAgICAvL0wyMDAwRAotCQlMM0MsICAgICAgLy9MMzgwMEMKLQkJTDNELCAgICAgIC8vTDM0MDBECi0JCUwzSCwgICAgICAvL0wzSCwgYnV0IGFsc28gTDIwMDBFCi0JCUw0UiwgICAgICAvL0w0NTAwUgotCQlMNXgsICAgICAgLy9MNTgwMEMgCi0JCUw4TCwgICAgICAvL0w4NDAwTAotCQlNMUEsICAgICAgLy9NMTMwMEEKLQkJTTJFLCAgICAgIC8vTTI0MDBFLCBMNDQwMEwKLQkJTTZOLCAgICAgIC8vTTY4MDBOCi0JCU02UiwgICAgICAvL002NzAwUgotCQlQMzAsCSAgLy9TYW1zdW5nIFAzMAotCQlTMXgsICAgICAgLy9TMTMwMEEsIGJ1dCBhbHNvIEwxNDAwQiBhbmQgTTI0MDBBIChMODRGKQotCQlTMngsICAgICAgLy9TMjAwIChKMSByZXBvcnRlZCksIFZpY3RvciBNUC1YUDcyMTAKLQkJeHhOLCAgICAgIC8vTTI0MDBOLCBNMzcwME4sIE01MjAwTiwgUzEzMDBOLCBTNTIwME4sIFcxT09PTgotCQkJICAvLyhDZW50cmlubykKKwkJQTF4ID0gMCwJLy9BMTM0MEQsIEExMzAwRgorCQlBMngsCQkvL0EyNTAwSAorCQlEMXgsCQkvL0QxCisJCUwyRCwJCS8vTDIwMDBECisJCUwzQywJCS8vTDM4MDBDCisJCUwzRCwJCS8vTDM0MDBECisJCUwzSCwJCS8vTDNILCBidXQgYWxzbyBMMjAwMEUKKwkJTDRSLAkJLy9MNDUwMFIKKwkJTDV4LAkJLy9MNTgwMEMgCisJCUw4TCwJCS8vTDg0MDBMCisJCU0xQSwJCS8vTTEzMDBBCisJCU0yRSwJCS8vTTI0MDBFLCBMNDQwMEwKKwkJTTZOLAkJLy9NNjgwME4KKwkJTTZSLAkJLy9NNjcwMFIKKwkJUDMwLAkJLy9TYW1zdW5nIFAzMAorCQlTMXgsCQkvL1MxMzAwQSwgYnV0IGFsc28gTDE0MDBCIGFuZCBNMjQwMEEgKEw4NEYpCisJCVMyeCwJCS8vUzIwMCAoSjEgcmVwb3J0ZWQpLCBWaWN0b3IgTVAtWFA3MjEwCisJCXh4TiwJCS8vTTI0MDBOLCBNMzcwME4sIE01MjAwTiwgUzEzMDBOLCBTNTIwME4sIFcxT09PTgorCQkvLyhDZW50cmlubykKIAkJRU5EX01PREVMCi0JfSBtb2RlbDsgICAgICAgICAgICAgIC8vTW9kZWxzIGN1cnJlbnRseSBzdXBwb3J0ZWQKLQl1MTYgZXZlbnRfY291bnRbMTI4XTsgLy9jb3VudCBmb3IgZWFjaCBldmVudCBUT0RPIG1ha2UgdGhpcyBiZXR0ZXIKKwl9IG1vZGVsOwkJLy9Nb2RlbHMgY3VycmVudGx5IHN1cHBvcnRlZAorCXUxNiBldmVudF9jb3VudFsxMjhdOwkvL2NvdW50IGZvciBlYWNoIGV2ZW50IFRPRE8gbWFrZSB0aGlzIGJldHRlcgogfTsKIAogLyogSGVyZSB3ZSBnbyAqLwpAQCAtMTUwLDcgKzE0OCw3IEBACiAjZGVmaW5lIHh4Tl9QUkVGSVggIlxcX1NCLlBDSTAuU0JSRy5FQzAuIgogCiBzdGF0aWMgc3RydWN0IG1vZGVsX2RhdGEgbW9kZWxfY29uZltFTkRfTU9ERUxdID0gewotICAgICAgICAvKgorCS8qCiAJICogVGhvc2UgcGF0aG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgSE9USyAvIEFUS0QgZGV2aWNlIDoKIAkgKiAgICAgICAtIG10X21sZWQKIAkgKiAgICAgICAtIG10X3dsZWQKQEAgLTE2NSwyMTUgKzE2MywxOTcgQEAKIAkgKi8KIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkExeCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm1sZWRfc3RhdHVzICAgICAgID0gIlxcTUFJTCIsCi0JCS5tdF9sY2Rfc3dpdGNoICAgICA9IEExeF9QUkVGSVggIl9RMTAiLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxCS0xJIiwKLQkJLmJyaWdodG5lc3NfdXAgICAgID0gQTF4X1BSRUZJWCAiX1EwRSIsCi0JCS5icmlnaHRuZXNzX2Rvd24gICA9IEExeF9QUkVGSVggIl9RMEYiCi0JfSwKKwkgLm5hbWUgPSAiQTF4IiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tbGVkX3N0YXR1cyA9ICJcXE1BSUwiLAorCSAubXRfbGNkX3N3aXRjaCA9IEExeF9QUkVGSVggIl9RMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJLTEkiLAorCSAuYnJpZ2h0bmVzc191cCA9IEExeF9QUkVGSVggIl9RMEUiLAorCSAuYnJpZ2h0bmVzc19kb3duID0gQTF4X1BSRUZJWCAiX1EwRiJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiQTJ4IiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIsCi0JCS53bGVkX3N0YXR1cyAgICAgICA9ICJcXFNHNjYiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSAiXFxRMTAiLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxCQU9GIiwKLQkJLmJyaWdodG5lc3Nfc2V0ICAgID0gIlNQTFYiLAotCQkuYnJpZ2h0bmVzc19nZXQgICAgPSAiR1BMViIsCi0JCS5kaXNwbGF5X3NldCAgICAgICA9ICJTRFNQIiwKLQkJLmRpc3BsYXlfZ2V0ICAgICAgID0gIlxcSU5GQiIKLQl9LAorCSAubmFtZSA9ICJBMngiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC53bGVkX3N0YXR1cyA9ICJcXFNHNjYiLAorCSAubXRfbGNkX3N3aXRjaCA9ICJcXFExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcQkFPRiIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkQxeCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIlxcUTBEIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcR1AxMSIsCi0JCS5icmlnaHRuZXNzX3VwICAgICA9ICJcXFEwQyIsCi0JCS5icmlnaHRuZXNzX2Rvd24gICA9ICJcXFEwQiIsCi0JCS5icmlnaHRuZXNzX3N0YXR1cyA9ICJcXEJMVkwiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiRDF4IiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gIlxcUTBEIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxHUDExIiwKKwkgLmJyaWdodG5lc3NfdXAgPSAiXFxRMEMiLAorCSAuYnJpZ2h0bmVzc19kb3duID0gIlxcUTBCIiwKKwkgLmJyaWdodG5lc3Nfc3RhdHVzID0gIlxcQkxWTCIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiTDJEIiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubWxlZF9zdGF0dXMgICAgICAgPSAiXFxTR1A2IiwKLQkJLm10X3dsZWQgICAgICAgICAgID0gIldMRUQiLAotCQkud2xlZF9zdGF0dXMgICAgICAgPSAiXFxSQ1AzIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIlxcUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcU0dQMCIsCi0JCS5icmlnaHRuZXNzX3VwICAgICA9ICJcXFEwRSIsCi0JCS5icmlnaHRuZXNzX2Rvd24gICA9ICJcXFEwRiIsCi0JCS5kaXNwbGF5X3NldCAgICAgICA9ICJTRFNQIiwKLQkJLmRpc3BsYXlfZ2V0ICAgICAgID0gIlxcSU5GQiIKLQl9LAorCSAubmFtZSA9ICJMMkQiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm1sZWRfc3RhdHVzID0gIlxcU0dQNiIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAud2xlZF9zdGF0dXMgPSAiXFxSQ1AzIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSAiXFxRMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXFNHUDAiLAorCSAuYnJpZ2h0bmVzc191cCA9ICJcXFEwRSIsCisJIC5icmlnaHRuZXNzX2Rvd24gPSAiXFxRMEYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkwzQyIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm10X3dsZWQgICAgICAgICAgID0gIldMRUQiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSBMM0NfUFJFRklYICJfUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcR0wzMiIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXF9TQi5QQ0kwLlBDSTEuVkdBQy5OTUFQIgotCX0sCisJIC5uYW1lID0gIkwzQyIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSBMM0NfUFJFRklYICJfUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxHTDMyIiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcX1NCLlBDSTAuUENJMS5WR0FDLk5NQVAifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkwzRCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm1sZWRfc3RhdHVzICAgICAgID0gIlxcTUFMRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIlxcUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcQktMRyIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiTDNEIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tbGVkX3N0YXR1cyA9ICJcXE1BTEQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSAiXFxRMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJLTEciLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJMM0giLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIkVISyIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXF9TQi5QQ0kwLlBNLlBCQyIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiTDNIIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9ICJFSEsiLAorCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlBNLlBCQyIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkw0UiIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm10X3dsZWQgICAgICAgICAgID0gIldMRUQiLAotCQkud2xlZF9zdGF0dXMgICAgICAgPSAiXFxfU0IuUENJMC5TQlJHLlNHMTMiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSB4eE5fUFJFRklYICJfUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcX1NCLlBDSTAuU0JTTS5TRU80IiwKLQkJLmJyaWdodG5lc3Nfc2V0ICAgID0gIlNQTFYiLAotCQkuYnJpZ2h0bmVzc19nZXQgICAgPSAiR1BMViIsIAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXF9TQi5QQ0kwLlAwUDEuVkdBLkdFVEQiCi0JfSwKKwkgLm5hbWUgPSAiTDRSIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAud2xlZF9zdGF0dXMgPSAiXFxfU0IuUENJMC5TQlJHLlNHMTMiLAorCSAubXRfbGNkX3N3aXRjaCA9IHh4Tl9QUkVGSVggIl9RMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXF9TQi5QQ0kwLlNCU00uU0VPNCIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXF9TQi5QQ0kwLlAwUDEuVkdBLkdFVEQifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIkw1eCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKKwkgLm5hbWUgPSAiTDV4IiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCiAvKiBXTEVEIHByZXNlbnQsIGJ1dCBub3QgY29udHJvbGxlZCBieSBBQ1BJICovCi0JCS5tdF90bGVkICAgICAgICAgICA9ICJUTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIlxcUTBEIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcQkFPRiIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm10X3RsZWQgPSAiVExFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gIlxcUTBEIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxCQU9GIiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcSU5GQiJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiTDhMIgorCSAubmFtZSA9ICJMOEwiCiAvKiBObyBmZWF0dXJlcywgYnV0IGF0IGxlYXN0IHN1cHBvcnQgdGhlIGhvdGtleXMgKi8KLQl9LAorCSB9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiTTFBIiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSBNMUFfUFJFRklYICJRMTAiLAotCQkubGNkX3N0YXR1cyAgICAgICAgPSAiXFxQTk9GIiwKLQkJLmJyaWdodG5lc3NfdXAgICAgID0gTTFBX1BSRUZJWCAiUTBFIiwKLQkJLmJyaWdodG5lc3NfZG93biAgID0gTTFBX1BSRUZJWCAiUTBGIiwKLQkJLmJyaWdodG5lc3Nfc3RhdHVzID0gIlxcQlJJVCIsCi0JCS5kaXNwbGF5X3NldCAgICAgICA9ICJTRFNQIiwKLQkJLmRpc3BsYXlfZ2V0ICAgICAgID0gIlxcSU5GQiIKLQl9LAorCSAubmFtZSA9ICJNMUEiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSBNMUFfUFJFRklYICJRMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXFBOT0YiLAorCSAuYnJpZ2h0bmVzc191cCA9IE0xQV9QUkVGSVggIlEwRSIsCisJIC5icmlnaHRuZXNzX2Rvd24gPSBNMUFfUFJFRklYICJRMEYiLAorCSAuYnJpZ2h0bmVzc19zdGF0dXMgPSAiXFxCUklUIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJNMkUiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gIlxcUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcR1AwNiIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXElORkIiCi0JfSwKKwkgLm5hbWUgPSAiTTJFIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9ICJcXFExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcR1AwNiIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXElORkIifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIk02TiIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm10X3dsZWQgICAgICAgICAgID0gIldMRUQiLAotCQkud2xlZF9zdGF0dXMgICAgICAgPSAiXFxfU0IuUENJMC5TQlJHLlNHMTMiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSB4eE5fUFJFRklYICJfUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcX1NCLkJLTFQiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKLQkJLmRpc3BsYXlfc2V0ICAgICAgID0gIlNEU1AiLAotCQkuZGlzcGxheV9nZXQgICAgICAgPSAiXFxTU1RFIgotCX0sCisJIC5uYW1lID0gIk02TiIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubXRfd2xlZCA9ICJXTEVEIiwKKwkgLndsZWRfc3RhdHVzID0gIlxcX1NCLlBDSTAuU0JSRy5TRzEzIiwKKwkgLm10X2xjZF9zd2l0Y2ggPSB4eE5fUFJFRklYICJfUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxfU0IuQktMVCIsCisJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXFNTVEUifSwKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJNNlIiLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0geHhOX1BSRUZJWCAiX1ExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXF9TQi5QQ0kwLlNCU00uU0VPNCIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXFNTVEUiCi0JfSwKLQorCSAubmFtZSA9ICJNNlIiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0geHhOX1BSRUZJWCAiX1ExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcX1NCLlBDSTAuU0JTTS5TRU80IiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViIsCisJIC5kaXNwbGF5X3NldCA9ICJTRFNQIiwKKwkgLmRpc3BsYXlfZ2V0ID0gIlxcU1NURSJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiUDMwIiwKLQkJLm10X3dsZWQgICAgICAgICAgID0gIldMRUQiLAotCQkubXRfbGNkX3N3aXRjaCAgICAgPSBQMzBfUFJFRklYICJfUTBFIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcQktMVCIsCi0JCS5icmlnaHRuZXNzX3VwICAgICA9IFAzMF9QUkVGSVggIl9RNjgiLAotCQkuYnJpZ2h0bmVzc19kb3duICAgPSBQMzBfUFJFRklYICJfUTY5IiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXEROWFQiCi0JfSwKKwkgLm5hbWUgPSAiUDMwIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gUDMwX1BSRUZJWCAiX1EwRSIsCisJIC5sY2Rfc3RhdHVzID0gIlxcQktMVCIsCisJIC5icmlnaHRuZXNzX3VwID0gUDMwX1BSRUZJWCAiX1E2OCIsCisJIC5icmlnaHRuZXNzX2Rvd24gPSBQMzBfUFJFRklYICJfUTY5IiwKKwkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAorCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCisJIC5kaXNwbGF5X2dldCA9ICJcXEROWFQifSwKIAogCXsKLQkJLm5hbWUgICAgICAgICAgICAgID0gIlMxeCIsCi0JCS5tdF9tbGVkICAgICAgICAgICA9ICJNTEVEIiwKLQkJLm1sZWRfc3RhdHVzICAgICAgID0gIlxcRU1MRSIsCi0JCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gUzF4X1BSRUZJWCAiUTEwIiAsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXFBOT0YiLAotCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCi0JCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIgotCX0sCisJIC5uYW1lID0gIlMxeCIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAorCSAubWxlZF9zdGF0dXMgPSAiXFxFTUxFIiwKKwkgLm10X3dsZWQgPSAiV0xFRCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gUzF4X1BSRUZJWCAiUTEwIiwKKwkgLmxjZF9zdGF0dXMgPSAiXFxQTk9GIiwKKwkgLmJyaWdodG5lc3Nfc2V0ID0gIlNQTFYiLAorCSAuYnJpZ2h0bmVzc19nZXQgPSAiR1BMViJ9LAogCiAJewotCQkubmFtZSAgICAgICAgICAgICAgPSAiUzJ4IiwKLQkJLm10X21sZWQgICAgICAgICAgID0gIk1MRUQiLAotCQkubWxlZF9zdGF0dXMgICAgICAgPSAiXFxNQUlMIiwKLQkJLm10X2xjZF9zd2l0Y2ggICAgID0gUzJ4X1BSRUZJWCAiX1ExMCIsCi0JCS5sY2Rfc3RhdHVzICAgICAgICA9ICJcXEJLTEkiLAotCQkuYnJpZ2h0bmVzc191cCAgICAgPSBTMnhfUFJFRklYICJfUTBCIiwKLQkJLmJyaWdodG5lc3NfZG93biAgID0gUzJ4X1BSRUZJWCAiX1EwQSIKLQl9LAorCSAubmFtZSA9ICJTMngiLAorCSAubXRfbWxlZCA9ICJNTEVEIiwKKwkgLm1sZWRfc3RhdHVzID0gIlxcTUFJTCIsCisJIC5tdF9sY2Rfc3dpdGNoID0gUzJ4X1BSRUZJWCAiX1ExMCIsCisJIC5sY2Rfc3RhdHVzID0gIlxcQktMSSIsCisJIC5icmlnaHRuZXNzX3VwID0gUzJ4X1BSRUZJWCAiX1EwQiIsCisJIC5icmlnaHRuZXNzX2Rvd24gPSBTMnhfUFJFRklYICJfUTBBIn0sCiAKIAl7Ci0JCS5uYW1lICAgICAgICAgICAgICA9ICJ4eE4iLAotCQkubXRfbWxlZCAgICAgICAgICAgPSAiTUxFRCIsCisJIC5uYW1lID0gInh4TiIsCisJIC5tdF9tbGVkID0gIk1MRUQiLAogLyogV0xFRCBwcmVzZW50LCBidXQgbm90IGNvbnRyb2xsZWQgYnkgQUNQSSAqLwotCQkubXRfbGNkX3N3aXRjaCAgICAgPSB4eE5fUFJFRklYICJfUTEwIiwKLQkJLmxjZF9zdGF0dXMgICAgICAgID0gIlxcQktMVCIsCi0JCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKLQkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAotCQkuZGlzcGxheV9zZXQgICAgICAgPSAiU0RTUCIsCi0JCS5kaXNwbGF5X2dldCAgICAgICA9ICJcXEFEVkciCi0JfQorCSAubXRfbGNkX3N3aXRjaCA9IHh4Tl9QUkVGSVggIl9RMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJLTFQiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxBRFZHIn0KIH07CiAKIC8qIHByb2NkaXIgd2UgdXNlICovCkBAIC0zOTUsMTMgKzM3NSwxMyBAQAogc3RhdGljIGludCBhc3VzX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYXN1c19ob3RrX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhc3VzX2hvdGtfZHJpdmVyID0gewotCS5uYW1lID0gCUFDUElfSE9US19OQU1FLAotCS5jbGFzcyA9IAlBQ1BJX0hPVEtfQ0xBU1MsCi0JLmlkcyA9IAkJQUNQSV9IT1RLX0hJRCwKLQkub3BzID0gCQl7Ci0JCQkJLmFkZCA9IAkJYXN1c19ob3RrX2FkZCwKLQkJCQkucmVtb3ZlID0gCWFzdXNfaG90a19yZW1vdmUsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9IT1RLX05BTUUsCisJLmNsYXNzID0gQUNQSV9IT1RLX0NMQVNTLAorCS5pZHMgPSBBQ1BJX0hPVEtfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhc3VzX2hvdGtfYWRkLAorCQkucmVtb3ZlID0gYXN1c19ob3RrX3JlbW92ZSwKKwkJfSwKIH07CiAKIC8qIApAQCAtNDIzLDExICs0MDMsMTAgQEAKIAlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwogCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKSBtZXRob2QsICZwYXJhbXMsIG91dHB1dCk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKW1ldGhvZCwgJnBhcmFtcywgb3V0cHV0KTsKIAlyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSyk7CiB9CiAKLQogc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgKnZhbCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OwpAQCAtNDM3LDcgKzQxNiw3IEBACiAJb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKIAlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKSBtZXRob2QsIE5VTEwsICZvdXRwdXQpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsIE5VTEwsICZvdXRwdXQpOwogCSp2YWwgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7CiAJcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spICYmIChvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpOwogfQpAQCAtNDQ5LDcgKzQyOCw3IEBACiAgKi8KIHN0YXRpYyBpbnQKIHByb2NfcmVhZF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAotCQl2b2lkICpkYXRhKQorCSAgICAgICB2b2lkICpkYXRhKQogewogCWludCBsZW4gPSAwOwogCWludCB0ZW1wOwpAQCAtNDYwLDcgKzQzOSw3IEBACiAJICovCiAKIAlsZW4gKz0gc3ByaW50ZihwYWdlLCBBQ1BJX0hPVEtfTkFNRSAiICIgQVNVU19BQ1BJX1ZFUlNJT04gIlxuIik7Ci0JbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIk1vZGVsIHJlZmVyZW5jZSAgICA6ICVzXG4iLCAKKwlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiTW9kZWwgcmVmZXJlbmNlICAgIDogJXNcbiIsCiAJCSAgICAgICBob3RrLT5tZXRob2RzLT5uYW1lKTsKIAkvKiAKIAkgKiBUaGUgU0ZVTiBtZXRob2QgcHJvYmFibHkgYWxsb3dzIHRoZSBvcmlnaW5hbCBkcml2ZXIgdG8gZ2V0IHRoZSBsaXN0IApAQCAtNDY5LDcgKzQ0OCw4IEBACiAJICogVGhlIHNpZ25pZmljYW5jZSBvZiBvdGhlcnMgaXMgeWV0IHRvIGJlIGZvdW5kLgogCSAqLwogCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIlNGVU4iLCAmdGVtcCkpCi0JCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJTRlVOIHZhbHVlICAgICAgICAgOiAweCUwNHhcbiIsIHRlbXApOworCQlsZW4gKz0KKwkJICAgIHNwcmludGYocGFnZSArIGxlbiwgIlNGVU4gdmFsdWUgICAgICAgICA6IDB4JTA0eFxuIiwgdGVtcCk7CiAJLyoKIAkgKiBBbm90aGVyIHZhbHVlIGZvciB1c2Vyc3BhY2U6IHRoZSBBU1lNIG1ldGhvZCByZXR1cm5zIDB4MDIgZm9yCiAJICogYmF0dGVyeSBsb3cgYW5kIDB4MDQgZm9yIGJhdHRlcnkgY3JpdGljYWwsIGl0cyByZWFkaW5ncyB0ZW5kIHRvIGJlCkBAIC00NzgsNyArNDU4LDggQEAKIAkgKiBzaWxlbnRseSBpZ25vcmVkLgogCSAqLwogCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIkFTWU0iLCAmdGVtcCkpCi0JCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJBU1lNIHZhbHVlICAgICAgICAgOiAweCUwNHhcbiIsIHRlbXApOworCQlsZW4gKz0KKwkJICAgIHNwcmludGYocGFnZSArIGxlbiwgIkFTWU0gdmFsdWUgICAgICAgICA6IDB4JTA0eFxuIiwgdGVtcCk7CiAJaWYgKGFzdXNfaW5mbykgewogCQlzbnByaW50ZihidWYsIDE2LCAiJWQiLCBhc3VzX2luZm8tPmxlbmd0aCk7CiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJEU0RUIGxlbmd0aCAgICAgICAgOiAlc1xuIiwgYnVmKTsKQEAgLTUwMSw3ICs0ODIsNiBAQAogCXJldHVybiBsZW47CiB9CiAKLQogLyoKICAqIC9wcm9jIGhhbmRsZXJzCiAgKiBXZSB3cml0ZSBvdXIgaW5mbyBpbiBwYWdlLCB3ZSBiZWdpbiBhdCBvZmZzZXQgb2ZmIGFuZCBjYW5ub3Qgd3JpdGUgbW9yZQpAQCAtNTEwLDggKzQ5MCw3IEBACiAgKi8KIAogLyogR2VuZXJpYyBMRUQgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50Ci1yZWFkX2xlZChjb25zdCBjaGFyICpsZWRuYW1lLCBpbnQgbGVkbWFzaykKK3N0YXRpYyBpbnQgcmVhZF9sZWQoY29uc3QgY2hhciAqbGVkbmFtZSwgaW50IGxlZG1hc2spCiB7CiAJaWYgKGxlZG5hbWUpIHsKIAkJaW50IGxlZF9zdGF0dXM7CkBAIC01MjUsNyArNTA0LDcgQEAKIAlyZXR1cm4gKGhvdGstPnN0YXR1cyAmIGxlZG1hc2spID8gMSA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2VfYXJnKGNvbnN0IGNoYXIgX191c2VyICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCAqdmFsKQorc3RhdGljIGludCBwYXJzZV9hcmcoY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCAqdmFsKQogewogCWNoYXIgc1szMl07CiAJaWYgKCFjb3VudCkKQEAgLTU0Miw4ICs1MjEsOCBAQAogCiAvKiBGSVhNRToga2lsbCBleHRyYW5lb3VzIGFyZ3Mgc28gaXQgY2FuIGJlIGNhbGxlZCBpbmRlcGVuZGVudGx5ICovCiBzdGF0aWMgaW50Ci13cml0ZV9sZWQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKLSAgICAgICAgICBjaGFyICpsZWRuYW1lLCBpbnQgbGVkbWFzaywgaW50IGludmVydCkKK3dyaXRlX2xlZChjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkgIGNoYXIgKmxlZG5hbWUsIGludCBsZWRtYXNrLCBpbnQgaW52ZXJ0KQogewogCWludCB2YWx1ZTsKIAlpbnQgbGVkX291dCA9IDA7CkBAIC01NTUsMTYgKzUzNCwxNiBAQAogCWhvdGstPnN0YXR1cyA9CiAJICAgIChsZWRfb3V0KSA/IChob3RrLT5zdGF0dXMgfCBsZWRtYXNrKSA6IChob3RrLT5zdGF0dXMgJiB+bGVkbWFzayk7CiAKLQlpZiAoaW52ZXJ0KSAvKiBpbnZlcnQgdGFyZ2V0IHZhbHVlICovCisJaWYgKGludmVydCkJCS8qIGludmVydCB0YXJnZXQgdmFsdWUgKi8KIAkJbGVkX291dCA9ICFsZWRfb3V0ICYgMHgxOwogCiAJaWYgKCF3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsIGxlZG5hbWUsIGxlZF9vdXQsIE5VTEwpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IExFRCAoJXMpIHdyaXRlIGZhaWxlZFxuIiwgbGVkbmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogTEVEICglcykgd3JpdGUgZmFpbGVkXG4iLAorCQkgICAgICAgbGVkbmFtZSk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLQogLyoKICAqIFByb2MgaGFuZGxlcnMgZm9yIE1MRUQKICAqLwpAQCAtNTcyLDEyICs1NTEsMTIgQEAKIHByb2NfcmVhZF9tbGVkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAogCSAgICAgICB2b2lkICpkYXRhKQogewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgcmVhZF9sZWQoaG90ay0+bWV0aG9kcy0+bWxlZF9zdGF0dXMsIE1MRURfT04pKTsKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsCisJCSAgICAgICByZWFkX2xlZChob3RrLT5tZXRob2RzLT5tbGVkX3N0YXR1cywgTUxFRF9PTikpOwogfQogCi0KIHN0YXRpYyBpbnQKLXByb2Nfd3JpdGVfbWxlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKK3Byb2Nfd3JpdGVfbWxlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIHdyaXRlX2xlZChidWZmZXIsIGNvdW50LCBob3RrLT5tZXRob2RzLT5tdF9tbGVkLCBNTEVEX09OLCAxKTsKQEAgLTU5MCwxMSArNTY5LDEyIEBACiBwcm9jX3JlYWRfd2xlZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKIAkgICAgICAgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIHJlYWRfbGVkKGhvdGstPm1ldGhvZHMtPndsZWRfc3RhdHVzLCBXTEVEX09OKSk7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLAorCQkgICAgICAgcmVhZF9sZWQoaG90ay0+bWV0aG9kcy0+d2xlZF9zdGF0dXMsIFdMRURfT04pKTsKIH0KIAogc3RhdGljIGludAotcHJvY193cml0ZV93bGVkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorcHJvY193cml0ZV93bGVkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKIAlyZXR1cm4gd3JpdGVfbGVkKGJ1ZmZlciwgY291bnQsIGhvdGstPm1ldGhvZHMtPm10X3dsZWQsIFdMRURfT04sIDApOwpAQCAtNjA3LDM1ICs1ODcsMzYgQEAKIHByb2NfcmVhZF90bGVkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAogCSAgICAgICB2b2lkICpkYXRhKQogewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgcmVhZF9sZWQoaG90ay0+bWV0aG9kcy0+dGxlZF9zdGF0dXMsIFRMRURfT04pKTsKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsCisJCSAgICAgICByZWFkX2xlZChob3RrLT5tZXRob2RzLT50bGVkX3N0YXR1cywgVExFRF9PTikpOwogfQogCiBzdGF0aWMgaW50Ci1wcm9jX3dyaXRlX3RsZWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCitwcm9jX3dyaXRlX3RsZWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCXJldHVybiB3cml0ZV9sZWQoYnVmZmVyLCBjb3VudCwgaG90ay0+bWV0aG9kcy0+bXRfdGxlZCwgVExFRF9PTiwgMCk7CiB9CiAKLQogc3RhdGljIGludCBnZXRfbGNkX3N0YXRlKHZvaWQpCiB7CiAJaW50IGxjZCA9IDA7CiAKIAlpZiAoaG90ay0+bW9kZWwgIT0gTDNIKSB7Ci0JLyogV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBhbnl0aGluZyBpZiB3ZSBhcmUgaGVyZSAqLworCQkvKiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFueXRoaW5nIGlmIHdlIGFyZSBoZXJlICovCiAJCWlmICghcmVhZF9hY3BpX2ludChOVUxMLCBob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzLCAmbGNkKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBMQ0Qgc3RhdHVzXG4iKTsKLQkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIExDRCBzdGF0dXNcbiIpOworCiAJCWlmIChob3RrLT5tb2RlbCA9PSBMMkQpCiAJCQlsY2QgPSB+bGNkOwotCX0gZWxzZSB7IC8qIEwzSCBhbmQgdGhlIGxpa2UgaGF2ZSB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5ICovCisJfSBlbHNlIHsJCS8qIEwzSCBhbmQgdGhlIGxpa2UgaGF2ZSB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5ICovCiAJCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CiAJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGlucHV0OwogCQl1bmlvbiBhY3BpX29iamVjdCBtdF9wYXJhbXNbMl07CiAJCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CiAJCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7Ci0JCQorCiAJCWlucHV0LmNvdW50ID0gMjsKIAkJaW5wdXQucG9pbnRlciA9IG10X3BhcmFtczsKIAkJLyogTm90ZTogdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHBhcnRseSBndWVzc2VkIHVwLCBidXQgCkBAIC02NDcsMTUgKzYyOCwxNyBAQAogCiAJCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CiAJCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7Ci0JCQotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzLCAmaW5wdXQsICZvdXRwdXQpOworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzLAorCQkJCQkgJmlucHV0LCAmb3V0cHV0KTsKIAkJaWYgKHN0YXR1cyAhPSBBRV9PSykKIAkJCXJldHVybiAtMTsKIAkJaWYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKIAkJCS8qIFRoYXQncyB3aGF0IHRoZSBBTUwgY29kZSBkb2VzICovCiAJCQlsY2QgPSBvdXRfb2JqLmludGVnZXIudmFsdWUgPj4gODsKIAl9Ci0JCisKIAlyZXR1cm4gKGxjZCAmIDEpOwogfQogCkBAIC02NjksMTAgKzY1MiwxMyBAQAogCQkvKiBzd2l0Y2ggKi8KIAkJaWYgKGhvdGstPm1vZGVsICE9IEwzSCkgewogCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5tdF9sY2Rfc3dpdGNoLAorCQkJICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsCisJCQkJCQkgaG90ay0+bWV0aG9kcy0+bXRfbGNkX3N3aXRjaCwKIAkJCQkJCSBOVUxMLCBOVUxMKTsKLQkJfSBlbHNlIHsgLyogTDNIIGFuZCB0aGUgbGlrZSBoYXZlIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgKi8KLQkJCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5tdF9sY2Rfc3dpdGNoLCAweDA3LCBOVUxMKSkKKwkJfSBlbHNlIHsJLyogTDNIIGFuZCB0aGUgbGlrZSBoYXZlIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgKi8KKwkJCWlmICghd3JpdGVfYWNwaV9pbnQKKwkJCSAgICAoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5tdF9sY2Rfc3dpdGNoLCAweDA3LAorCQkJICAgICBOVUxMKSkKIAkJCQlzdGF0dXMgPSBBRV9FUlJPUjsKIAkJCS8qIEwzSCdzIEFNTCBleGVjdXRlcyBFSEsgKDB4MDcpIHVwb24gRm4rRjcga2V5cHJlc3MsIAogCQkJICAgdGhlIGV4YWN0IGJlaGF2aW91ciBpcyBzaW11bGF0ZWQgaGVyZSAqLwpAQCAtNjkxLDMzICs2NzcsMzMgQEAKIAlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGdldF9sY2Rfc3RhdGUoKSk7CiB9CiAKLQogc3RhdGljIGludAotcHJvY193cml0ZV9sY2Qoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCitwcm9jX3dyaXRlX2xjZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJaW50IHZhbHVlOwotCQorCiAJY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKIAlpZiAoY291bnQgPiAwKQogCQlzZXRfbGNkX3N0YXRlKHZhbHVlKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKLQogc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Modm9pZCkKIHsKIAlpbnQgdmFsdWU7Ci0JCi0JaWYoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQpIHsgLyogU1BMVi9HUExWIGxhcHRvcCAqLwotCQlpZiAoIXJlYWRfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCwgCisKKwlpZiAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQpIHsJLyogU1BMVi9HUExWIGxhcHRvcCAqLworCQlpZiAoIXJlYWRfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCwKIAkJCQkgICAmdmFsdWUpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIGJyaWdodG5lc3NcbiIpOwotCX0gZWxzZSBpZiAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zdGF0dXMpIHsgLyogRm9yIEQxIGZvciBleGFtcGxlICovCi0JCWlmICghcmVhZF9hY3BpX2ludChOVUxMLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3N0YXR1cywgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBicmlnaHRuZXNzXG4iKTsKKwl9IGVsc2UgaWYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc3RhdHVzKSB7CS8qIEZvciBEMSBmb3IgZXhhbXBsZSAqLworCQlpZiAoIXJlYWRfYWNwaV9pbnQoTlVMTCwgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zdGF0dXMsCiAJCQkJICAgJnZhbHVlKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBicmlnaHRuZXNzXG4iKTsKLQl9IGVsc2UgLyogTm8gR1BMViBtZXRob2QgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIGJyaWdodG5lc3NcbiIpOworCX0gZWxzZQkJCS8qIE5vIEdQTFYgbWV0aG9kICovCiAJCXZhbHVlID0gaG90ay0+YnJpZ2h0bmVzczsKIAlyZXR1cm4gdmFsdWU7CiB9CkBAIC03MzAsMjMgKzcxNiwyNSBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CiAKIAkvKiBTUExWIGxhcHRvcCAqLwotCWlmKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc2V0KSB7Ci0JCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCwgCisJaWYgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc2V0KSB7CisJCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3NldCwKIAkJCQkgICAgdmFsdWUsIE5VTEwpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBFcnJvciBjaGFuZ2luZyBicmlnaHRuZXNzXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciBjaGFuZ2luZyBicmlnaHRuZXNzXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIE5vIFNQTFYgbWV0aG9kIGlmIHdlIGFyZSBoZXJlLCBhY3QgYXMgYXBwcm9wcmlhdGUgKi8KIAl2YWx1ZSAtPSByZWFkX2JyaWdodG5lc3MoKTsKIAl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCAodmFsdWUgPiAwKSA/IAotCQkJCQkgICAgICBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwIDogCisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsICh2YWx1ZSA+IDApID8KKwkJCQkJICAgICAgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cCA6CiAJCQkJCSAgICAgIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93biwKIAkJCQkJICAgICAgTlVMTCwgTlVMTCk7CiAJCSh2YWx1ZSA+IDApID8gdmFsdWUtLSA6IHZhbHVlKys7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7CiAJfQogCXJldHVybjsKIH0KQEAgLTc1OSw3ICs3NDcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1wcm9jX3dyaXRlX2JybihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKK3Byb2Nfd3JpdGVfYnJuKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKIAkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgdmFsdWU7CkBAIC03NjcsNyArNzU1LDcgQEAKIAljb3VudCA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOwogCWlmIChjb3VudCA+IDApIHsKIAkJdmFsdWUgPSAoMCA8IHZhbHVlKSA/ICgoMTUgPCB2YWx1ZSkgPyAxNSA6IHZhbHVlKSA6IDA7Ci0JCQkvKiAwIDw9IHZhbHVlIDw9IDE1ICovCisJCS8qIDAgPD0gdmFsdWUgPD0gMTUgKi8KIAkJc2V0X2JyaWdodG5lc3ModmFsdWUpOwogCX0gZWxzZSBpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyB1c2VyIGlucHV0XG4iKTsKQEAgLTc3OSw3ICs3NjcsNyBAQAogc3RhdGljIHZvaWQgc2V0X2Rpc3BsYXkoaW50IHZhbHVlKQogewogCS8qIG5vIHNhbml0eSBjaGVjayBuZWVkZWQgZm9yIG5vdyAqLwotCWlmICghd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCBob3RrLT5tZXRob2RzLT5kaXNwbGF5X3NldCwgCisJaWYgKCF3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsIGhvdGstPm1ldGhvZHMtPmRpc3BsYXlfc2V0LAogCQkJICAgIHZhbHVlLCBOVUxMKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXN1cyBBQ1BJOiBFcnJvciBzZXR0aW5nIGRpc3BsYXlcbiIpOwogCXJldHVybjsKQEAgLTc5MSwxMyArNzc5LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQKIHByb2NfcmVhZF9kaXNwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAotCSAgICAgIHZvaWQgKmRhdGEpCisJICAgICAgIHZvaWQgKmRhdGEpCiB7CiAJaW50IHZhbHVlID0gMDsKLQkKKwogCWlmICghcmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsIGhvdGstPm1ldGhvZHMtPmRpc3BsYXlfZ2V0LCAmdmFsdWUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgZGlzcGxheSBzdGF0dXNcbiIpOwotCXZhbHVlICY9IDB4MDc7IC8qIG5lZWRlZCBmb3Igc29tZSBtb2RlbHMsIHNob3VsZG4ndCBodXJ0IG90aGVycyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIGRpc3BsYXkgc3RhdHVzXG4iKTsKKwl2YWx1ZSAmPSAweDA3OwkJLyogbmVlZGVkIGZvciBzb21lIG1vZGVscywgc2hvdWxkbid0IGh1cnQgb3RoZXJzICovCiAJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLCB2YWx1ZSk7CiB9CiAKQEAgLTgwOCw4ICs3OTcsOCBAQAogICogc2ltdWx0YW5lb3VzbHksIHNvIGJlIHdhcm5lZC4gU2VlIHRoZSBhY3BpNGFzdXMgUkVBRE1FIGZvciBtb3JlIGluZm8uCiAgKi8KIHN0YXRpYyBpbnQKLXByb2Nfd3JpdGVfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3Byb2Nfd3JpdGVfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJaW50IHZhbHVlOwogCkBAIC04MjIsMTkgKzgxMSwxOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotCi10eXBlZGVmIGludCAocHJvY19yZWFkZnVuYykoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci10eXBlZGVmIGludCAocHJvY193cml0ZWZ1bmMpKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgaW50IChwcm9jX3JlYWRmdW5jKSAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKKwkJCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwordHlwZWRlZiBpbnQgKHByb2Nfd3JpdGVmdW5jKSAoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50Ci1fX2luaXQgYXN1c19wcm9jX2FkZChjaGFyICpuYW1lLCBwcm9jX3dyaXRlZnVuYyAqd3JpdGVmdW5jLAotCSAgICAgICAgICAgICBwcm9jX3JlYWRmdW5jICpyZWFkZnVuYywgbW9kZV90IG1vZGUsCi0JICAgICAgICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorX19pbml0IGFzdXNfcHJvY19hZGQoY2hhciAqbmFtZSwgcHJvY193cml0ZWZ1bmMgKiB3cml0ZWZ1bmMsCisJCSAgICAgcHJvY19yZWFkZnVuYyAqIHJlYWRmdW5jLCBtb2RlX3QgbW9kZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBtb2RlLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0JaWYoIXByb2MpIHsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBtb2RlLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJaWYgKCFwcm9jKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgVW5hYmxlIHRvIGNyZWF0ZSAlcyBmcyBlbnRyeVxuIiwgbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC04NTEsMTQgKzg0MCwxNCBAQAogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKIAltb2RlX3QgbW9kZTsKLQkKKwogCS8qCiAJICogSWYgcGFyYW1ldGVyIHVpZCBvciBnaWQgaXMgbm90IGNoYW5nZWQsIGtlZXAgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IKIAkgKiBvdXIgcHJvYyBlbnRyaWVzICgtcnctcnctcnctKSBlbHNlLCBpdCBtZWFucyB3ZSBjYXJlIGFib3V0IHNlY3VyaXR5LAogCSAqIGFuZCB0aGVuIHNldCB0byAtcnctcnctLS0tCiAJICovCiAKLQlpZiAoKGFzdXNfdWlkID09IDApICYmIChhc3VzX2dpZCA9PSAwKSl7CisJaWYgKChhc3VzX3VpZCA9PSAwKSAmJiAoYXN1c19naWQgPT0gMCkpIHsKIAkJbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VHTzsKIAl9IGVsc2UgewogCQltb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JV1VTUiB8IFNfSVdHUlA7CkBAIC04ODEsMTUgKzg3MCwxOCBAQAogCX0KIAogCWlmIChob3RrLT5tZXRob2RzLT5tdF93bGVkKSB7Ci0JCWFzdXNfcHJvY19hZGQoUFJPQ19XTEVELCAmcHJvY193cml0ZV93bGVkLCAmcHJvY19yZWFkX3dsZWQsIG1vZGUsIGRldmljZSk7CisJCWFzdXNfcHJvY19hZGQoUFJPQ19XTEVELCAmcHJvY193cml0ZV93bGVkLCAmcHJvY19yZWFkX3dsZWQsCisJCQkgICAgICBtb2RlLCBkZXZpY2UpOwogCX0KIAogCWlmIChob3RrLT5tZXRob2RzLT5tdF9tbGVkKSB7Ci0JCWFzdXNfcHJvY19hZGQoUFJPQ19NTEVELCAmcHJvY193cml0ZV9tbGVkLCAmcHJvY19yZWFkX21sZWQsIG1vZGUsIGRldmljZSk7CisJCWFzdXNfcHJvY19hZGQoUFJPQ19NTEVELCAmcHJvY193cml0ZV9tbGVkLCAmcHJvY19yZWFkX21sZWQsCisJCQkgICAgICBtb2RlLCBkZXZpY2UpOwogCX0KIAogCWlmIChob3RrLT5tZXRob2RzLT5tdF90bGVkKSB7Ci0JCWFzdXNfcHJvY19hZGQoUFJPQ19UTEVELCAmcHJvY193cml0ZV90bGVkLCAmcHJvY19yZWFkX3RsZWQsIG1vZGUsIGRldmljZSk7CisJCWFzdXNfcHJvY19hZGQoUFJPQ19UTEVELCAmcHJvY193cml0ZV90bGVkLCAmcHJvY19yZWFkX3RsZWQsCisJCQkgICAgICBtb2RlLCBkZXZpY2UpOwogCX0KIAogCS8qIApAQCAtODk3LDM1ICs4ODksNDAgQEAKIAkgKiBmcm9tIGtleWJvYXJkIAogCSAqLwogCWlmIChob3RrLT5tZXRob2RzLT5tdF9sY2Rfc3dpdGNoICYmIGhvdGstPm1ldGhvZHMtPmxjZF9zdGF0dXMpIHsKLQkJYXN1c19wcm9jX2FkZChQUk9DX0xDRCwgJnByb2Nfd3JpdGVfbGNkLCAmcHJvY19yZWFkX2xjZCwgbW9kZSwgZGV2aWNlKTsKKwkJYXN1c19wcm9jX2FkZChQUk9DX0xDRCwgJnByb2Nfd3JpdGVfbGNkLCAmcHJvY19yZWFkX2xjZCwgbW9kZSwKKwkJCSAgICAgIGRldmljZSk7CiAJfQotCQorCiAJaWYgKChob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZG93bikgfHwKIAkgICAgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0ICYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc2V0KSkgewotCQlhc3VzX3Byb2NfYWRkKFBST0NfQlJOLCAmcHJvY193cml0ZV9icm4sICZwcm9jX3JlYWRfYnJuLCBtb2RlLCBkZXZpY2UpOworCQlhc3VzX3Byb2NfYWRkKFBST0NfQlJOLCAmcHJvY193cml0ZV9icm4sICZwcm9jX3JlYWRfYnJuLCBtb2RlLAorCQkJICAgICAgZGV2aWNlKTsKIAl9CiAKIAlpZiAoaG90ay0+bWV0aG9kcy0+ZGlzcGxheV9zZXQpIHsKLQkJYXN1c19wcm9jX2FkZChQUk9DX0RJU1AsICZwcm9jX3dyaXRlX2Rpc3AsICZwcm9jX3JlYWRfZGlzcCwgbW9kZSwgZGV2aWNlKTsKKwkJYXN1c19wcm9jX2FkZChQUk9DX0RJU1AsICZwcm9jX3dyaXRlX2Rpc3AsICZwcm9jX3JlYWRfZGlzcCwKKwkJCSAgICAgIG1vZGUsIGRldmljZSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXN1c19ob3RrX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UqIGRldmljZSkKK3N0YXRpYyBpbnQgYXN1c19ob3RrX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpZihhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewotCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0lORk8sYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0lORk8sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJaWYgKGhvdGstPm1ldGhvZHMtPm10X3dsZWQpCi0JCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1dMRUQsYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19XTEVELCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCWlmIChob3RrLT5tZXRob2RzLT5tdF9tbGVkKQotCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19NTEVELGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfTUxFRCwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlpZiAoaG90ay0+bWV0aG9kcy0+bXRfdGxlZCkKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfVExFRCxhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1RMRUQsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJaWYgKGhvdGstPm1ldGhvZHMtPm10X2xjZF9zd2l0Y2ggJiYgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cykKIAkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfTENELCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0JCWlmICgoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cCAmJiBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24pIHx8Ci0JCSAgICAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQgJiYgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zZXQpKQorCQlpZiAoKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAKKwkJICAgICAmJiBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24pCisJCSAgICB8fCAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19nZXQKKwkJCSYmIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc2V0KSkKIAkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfQlJOLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCWlmIChob3RrLT5tZXRob2RzLT5kaXNwbGF5X3NldCkKIAkJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElTUCwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwpAQCAtOTMzLDE2ICs5MzAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBhc3VzX2hvdGtfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCS8qIFRPRE8gRmluZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIGV2ZW50cyBjb3VudC4qLworCS8qIFRPRE8gRmluZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIGV2ZW50cyBjb3VudC4gKi8KIAlpZiAoIWhvdGspCiAJCXJldHVybjsKIAogCWlmICgoZXZlbnQgJiB+KCh1MzIpIEJSX1VQKSkgPCAxNikgewogCQlob3RrLT5icmlnaHRuZXNzID0gKGV2ZW50ICYgfigodTMyKSBCUl9VUCkpOwotCX0gZWxzZSBpZiAoKGV2ZW50ICYgfigodTMyKSBCUl9ET1dOKSkgPCAxNiApIHsKKwl9IGVsc2UgaWYgKChldmVudCAmIH4oKHUzMikgQlJfRE9XTikpIDwgMTYpIHsKIAkJaG90ay0+YnJpZ2h0bmVzcyA9IChldmVudCAmIH4oKHUzMikgQlJfRE9XTikpOwogCX0KIApAQCAtOTc2LDcgKzk3Miw3IEBACiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIENvdWxkbid0IGdldCB0aGUgRFNEVCB0YWJsZSBoZWFkZXJcbiIpOwogCWVsc2UKLQkJYXN1c19pbmZvID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKSBkc2R0LnBvaW50ZXI7CisJCWFzdXNfaW5mbyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKilkc2R0LnBvaW50ZXI7CiAKIAkvKiBXZSBoYXZlIHRvIHdyaXRlIDAgb24gaW5pdCB0aGlzIGZhciBmb3IgYWxsIEFTVVMgbW9kZWxzICovCiAJaWYgKCF3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsICJJTklUIiwgMCwgJmJ1ZmZlcikpIHsKQEAgLTk4OCwxNSArOTg0LDE3IEBACiAJaWYgKCFyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIkJTVFMiLCAmYnN0c19yZXN1bHQpKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIEVycm9yIGNhbGxpbmcgQlNUU1xuIik7CiAJZWxzZSBpZiAoYnN0c19yZXN1bHQpCi0JCXByaW50ayhLRVJOX05PVElDRSAiICBCU1RTIGNhbGxlZCwgMHglMDJ4IHJldHVybmVkXG4iLCBic3RzX3Jlc3VsdCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiICBCU1RTIGNhbGxlZCwgMHglMDJ4IHJldHVybmVkXG4iLAorCQkgICAgICAgYnN0c19yZXN1bHQpOwogCiAJLyogU2Ftc3VuZyBQMzAgaGFzIGEgZGV2aWNlIHdpdGggYSB2YWxpZCBfSElEIHdob3NlIElOSVQgZG9lcyBub3QgCiAJICogcmV0dXJuIGFueXRoaW5nLiBDYXRjaCB0aGlzIG9uZSBhbmQgYW55IHNpbWlsYXIgaGVyZSAqLwogCWlmIChidWZmZXIucG9pbnRlciA9PSBOVUxMKSB7Ci0JCWlmIChhc3VzX2luZm8gJiYgLyogU2Ftc3VuZyBQMzAgKi8KKwkJaWYgKGFzdXNfaW5mbyAmJgkvKiBTYW1zdW5nIFAzMCAqLwogCQkgICAgc3RybmNtcChhc3VzX2luZm8tPm9lbV90YWJsZV9pZCwgIk9ERU0iLCA0KSA9PSAwKSB7CiAJCQlob3RrLT5tb2RlbCA9IFAzMDsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiICBTYW1zdW5nIFAzMCBkZXRlY3RlZCwgc3VwcG9ydGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX05PVElDRQorCQkJICAgICAgICIgIFNhbXN1bmcgUDMwIGRldGVjdGVkLCBzdXBwb3J0ZWRcbiIpOwogCQl9IGVsc2UgewogCQkJaG90ay0+bW9kZWwgPSBNMkU7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIG5vIHN0cmluZyByZXR1cm5lZCBieSBJTklUXG4iKTsKQEAgLTEwMDYsMTAgKzEwMDQsMTEgQEAKIAkJaG90ay0+bWV0aG9kcyA9ICZtb2RlbF9jb25mW2hvdGstPm1vZGVsXTsKIAkJcmV0dXJuIEFFX09LOwogCX0KLQkKLQltb2RlbCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKworCW1vZGVsID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CiAJaWYgKG1vZGVsLT50eXBlID09IEFDUElfVFlQRV9TVFJJTkcpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIgICVzIG1vZGVsIGRldGVjdGVkLCAiLCBtb2RlbC0+c3RyaW5nLnBvaW50ZXIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgJXMgbW9kZWwgZGV0ZWN0ZWQsICIsCisJCSAgICAgICBtb2RlbC0+c3RyaW5nLnBvaW50ZXIpOwogCX0KIAogCWhvdGstPm1vZGVsID0gRU5EX01PREVMOwpAQCAtMTAzNSw3ICsxMDM0LDcgQEAKIAkJIHN0cm5jbXAobW9kZWwtPnN0cmluZy5wb2ludGVyLCAiTTZOIiwgMykgPT0gMCB8fAogCQkgc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJTMU4iLCAzKSA9PSAwIHx8CiAJCSBzdHJuY21wKG1vZGVsLT5zdHJpbmcucG9pbnRlciwgIlM1TiIsIDMpID09IDAgfHwKLSAgICAgICAgICAgICAgICAgc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJXMU4iLCAzKSA9PSAwKQorCQkgc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJXMU4iLCAzKSA9PSAwKQogCQlob3RrLT5tb2RlbCA9IHh4TjsKIAllbHNlIGlmIChzdHJuY21wKG1vZGVsLT5zdHJpbmcucG9pbnRlciwgIk0xIiwgMikgPT0gMCkKIAkJaG90ay0+bW9kZWwgPSBNMUE7CkBAIC0xMDY5LDIxICsxMDY4LDIxIEBACiAKIAkvKiBTb3J0IG9mIHBlci1tb2RlbCBibGFja2xpc3QgKi8KIAlpZiAoc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJMMkIiLCAzKSA9PSAwKQotCQlob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzID0gTlVMTDsgCisJCWhvdGstPm1ldGhvZHMtPmxjZF9zdGF0dXMgPSBOVUxMOwogCS8qIEwyQiBpcyBzaW1pbGFyIGVub3VnaCB0byBMM0MgdG8gdXNlIGl0cyBzZXR0aW5ncywgd2l0aCB0aGlzIG9ubHkgCiAJICAgZXhjZXB0aW9uICovCiAJZWxzZSBpZiAoc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJTNU4iLCAzKSA9PSAwIHx8CiAJCSBzdHJuY21wKG1vZGVsLT5zdHJpbmcucG9pbnRlciwgIk01TiIsIDMpID09IDApCi0JCWhvdGstPm1ldGhvZHMtPm10X21sZWQgPSBOVUxMOyAKKwkJaG90ay0+bWV0aG9kcy0+bXRfbWxlZCA9IE5VTEw7CiAJLyogUzVOIGFuZCBNNU4gaGF2ZSBubyBNTEVEICovCiAJZWxzZSBpZiAoc3RybmNtcChtb2RlbC0+c3RyaW5nLnBvaW50ZXIsICJNMk4iLCAzKSA9PSAwIHx8CiAJCSBzdHJuY21wKG1vZGVsLT5zdHJpbmcucG9pbnRlciwgIlcxTiIsIDMpID09IDApCi0JCWhvdGstPm1ldGhvZHMtPm10X3dsZWQgPSAiV0xFRCI7IAorCQlob3RrLT5tZXRob2RzLT5tdF93bGVkID0gIldMRUQiOwogCS8qIE0yTiBhbmQgVzFOIGhhdmUgYSB1c2FibGUgV0xFRCAqLwogCWVsc2UgaWYgKGFzdXNfaW5mbykgewogCQlpZiAoc3RybmNtcChhc3VzX2luZm8tPm9lbV90YWJsZV9pZCwgIkwxIiwgMikgPT0gMCkKIAkJCWhvdGstPm1ldGhvZHMtPm1sZWRfc3RhdHVzID0gTlVMTDsKLQkvKiBTMTMwMEEgcmVwb3J0cyBMODRGLCBidXQgTDE0MDBCIHRvbywgYWNjb3VudCBmb3IgdGhhdCAqLworCQkvKiBTMTMwMEEgcmVwb3J0cyBMODRGLCBidXQgTDE0MDBCIHRvbywgYWNjb3VudCBmb3IgdGhhdCAqLwogCX0KIAogCWFjcGlfb3NfZnJlZShtb2RlbCk7CkBAIC0xMDkxLDcgKzEwOTAsNiBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdCBhc3VzX2hvdGtfY2hlY2sodm9pZCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTExMTAsNyArMTEwOCw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdCBhc3VzX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwpAQCAtMTEyMyw3ICsxMTIwLDcgQEAKIAkgICAgICAgQVNVU19BQ1BJX1ZFUlNJT04pOwogCiAJaG90ayA9Ci0JICAgIChzdHJ1Y3QgYXN1c19ob3RrICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX2hvdGspLCBHRlBfS0VSTkVMKTsKKwkgICAgKHN0cnVjdCBhc3VzX2hvdGsgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19ob3RrKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3RrKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoaG90aywgMCwgc2l6ZW9mKHN0cnVjdCBhc3VzX2hvdGspKTsKQEAgLTExMzQsNyArMTEzMSw2IEBACiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gaG90azsKIAlob3RrLT5kZXZpY2UgPSBkZXZpY2U7CiAKLQogCXJlc3VsdCA9IGFzdXNfaG90a19jaGVjaygpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwpAQCAtMTE1MywxNyArMTE0OSwyMiBAQAogCQlwcmludGsoS0VSTl9FUlIgIiAgRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIik7CiAKIAkvKiBGb3IgbGFwdG9wcyB3aXRob3V0IEdQTFY6IGluaXQgdGhlIGhvdGstPmJyaWdodG5lc3MgdmFsdWUgKi8KLQlpZiAoKCFob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2dldCkgJiYgKCFob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3N0YXR1cykgJiYKLQkgICAgKGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAgJiYgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19kb3duKSkgewotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24sCi0JCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCWlmICgoIWhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfZ2V0KQorCSAgICAmJiAoIWhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3Nfc3RhdHVzKQorCSAgICAmJiAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cAorCQkmJiBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24pKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX2Rvd24sCisJCQkJCSBOVUxMLCBOVUxMKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBFcnJvciBjaGFuZ2luZyBicmlnaHRuZXNzXG4iKTsKIAkJZWxzZSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBob3RrLT5tZXRob2RzLT5icmlnaHRuZXNzX3VwLAotCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsCisJCQkJCQkgaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc191cCwKKwkJCQkJCSBOVUxMLCBOVUxMKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIFN0cmFuZ2UsIGVycm9yIGNoYW5naW5nIiAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIFN0cmFuZ2UsIGVycm9yIGNoYW5naW5nIgogCQkJCSAgICAgICAiIGJyaWdodG5lc3NcbiIpOwogCQl9CiAJfQpAQCAtMTE3Niw3ICsxMTc3LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KIHN0YXRpYyBpbnQgYXN1c19ob3RrX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKQEAgLTExOTYsNyArMTE5Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQgYXN1c19hY3BpX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtMTIwNCw5ICsxMjAzLDkgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpeworCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewogCQlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWFzdXNfcHJvY19kaXIgPSBwcm9jX21rZGlyKFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFhc3VzX3Byb2NfZGlyKSB7CkBAIC0xMjI1LDcgKzEyMjQsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIF9fZXhpdCBhc3VzX2FjcGlfZXhpdCh2b2lkKQogewogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhc3VzX2hvdGtfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IGM1NWZlY2EuLjcwMmU4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgQUNQSV9CQVRURVJZX1ZBTFVFX1VOS05PV04gMHhGRkZGRkZGRgogCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9GT1JNQVRfQklGCSJOTk5OTk5OTk5TU1NTIgpAQCAtNTMsODcgKzUyLDg1IEBACiAjZGVmaW5lIEFDUElfQkFUVEVSWV9VTklUU19XQVRUUwkibVciCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9VTklUU19BTVBTCQkibUEiCiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JBVFRFUllfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfYmF0dGVyeSIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2JhdHRlcnkiKQogCi1NT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CisgICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfQkFUVEVSWV9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX2JhdHRlcnlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYmF0dGVyeV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9CQVRURVJZX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfQkFUVEVSWV9DTEFTUywKLQkuaWRzID0JCUFDUElfQkFUVEVSWV9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX2JhdHRlcnlfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX2JhdHRlcnlfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfQkFUVEVSWV9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX0JBVFRFUllfQ0xBU1MsCisJLmlkcyA9IEFDUElfQkFUVEVSWV9ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfYmF0dGVyeV9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX2JhdHRlcnlfcmVtb3ZlLAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfYmF0dGVyeV9zdGF0dXMgewotCWFjcGlfaW50ZWdlcgkJc3RhdGU7Ci0JYWNwaV9pbnRlZ2VyCQlwcmVzZW50X3JhdGU7Ci0JYWNwaV9pbnRlZ2VyCQlyZW1haW5pbmdfY2FwYWNpdHk7Ci0JYWNwaV9pbnRlZ2VyCQlwcmVzZW50X3ZvbHRhZ2U7CisJYWNwaV9pbnRlZ2VyIHN0YXRlOworCWFjcGlfaW50ZWdlciBwcmVzZW50X3JhdGU7CisJYWNwaV9pbnRlZ2VyIHJlbWFpbmluZ19jYXBhY2l0eTsKKwlhY3BpX2ludGVnZXIgcHJlc2VudF92b2x0YWdlOwogfTsKIAogc3RydWN0IGFjcGlfYmF0dGVyeV9pbmZvIHsKLQlhY3BpX2ludGVnZXIJCXBvd2VyX3VuaXQ7Ci0JYWNwaV9pbnRlZ2VyCQlkZXNpZ25fY2FwYWNpdHk7Ci0JYWNwaV9pbnRlZ2VyCQlsYXN0X2Z1bGxfY2FwYWNpdHk7Ci0JYWNwaV9pbnRlZ2VyCQliYXR0ZXJ5X3RlY2hub2xvZ3k7Ci0JYWNwaV9pbnRlZ2VyCQlkZXNpZ25fdm9sdGFnZTsKLQlhY3BpX2ludGVnZXIJCWRlc2lnbl9jYXBhY2l0eV93YXJuaW5nOwotCWFjcGlfaW50ZWdlcgkJZGVzaWduX2NhcGFjaXR5X2xvdzsKLQlhY3BpX2ludGVnZXIJCWJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMTsKLQlhY3BpX2ludGVnZXIJCWJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMjsKLQlhY3BpX3N0cmluZwkJbW9kZWxfbnVtYmVyOwotCWFjcGlfc3RyaW5nCQlzZXJpYWxfbnVtYmVyOwotCWFjcGlfc3RyaW5nCQliYXR0ZXJ5X3R5cGU7Ci0JYWNwaV9zdHJpbmcJCW9lbV9pbmZvOworCWFjcGlfaW50ZWdlciBwb3dlcl91bml0OworCWFjcGlfaW50ZWdlciBkZXNpZ25fY2FwYWNpdHk7CisJYWNwaV9pbnRlZ2VyIGxhc3RfZnVsbF9jYXBhY2l0eTsKKwlhY3BpX2ludGVnZXIgYmF0dGVyeV90ZWNobm9sb2d5OworCWFjcGlfaW50ZWdlciBkZXNpZ25fdm9sdGFnZTsKKwlhY3BpX2ludGVnZXIgZGVzaWduX2NhcGFjaXR5X3dhcm5pbmc7CisJYWNwaV9pbnRlZ2VyIGRlc2lnbl9jYXBhY2l0eV9sb3c7CisJYWNwaV9pbnRlZ2VyIGJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMTsKKwlhY3BpX2ludGVnZXIgYmF0dGVyeV9jYXBhY2l0eV9ncmFudWxhcml0eV8yOworCWFjcGlfc3RyaW5nIG1vZGVsX251bWJlcjsKKwlhY3BpX3N0cmluZyBzZXJpYWxfbnVtYmVyOworCWFjcGlfc3RyaW5nIGJhdHRlcnlfdHlwZTsKKwlhY3BpX3N0cmluZyBvZW1faW5mbzsKIH07CiAKIHN0cnVjdCBhY3BpX2JhdHRlcnlfZmxhZ3MgewotCXU4CQkJcHJlc2VudDoxOwkvKiBCYXkgb2NjdXBpZWQ/ICovCi0JdTgJCQlwb3dlcl91bml0OjE7CS8qIDA9d2F0dHMsIDE9YXBtcyAqLwotCXU4CQkJYWxhcm06MTsJLyogX0JUUCBwcmVzZW50PyAqLwotCXU4CQkJcmVzZXJ2ZWQ6NTsKKwl1OCBwcmVzZW50OjE7CQkvKiBCYXkgb2NjdXBpZWQ/ICovCisJdTggcG93ZXJfdW5pdDoxOwkvKiAwPXdhdHRzLCAxPWFwbXMgKi8KKwl1OCBhbGFybToxOwkJLyogX0JUUCBwcmVzZW50PyAqLworCXU4IHJlc2VydmVkOjU7CiB9OwogCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X3RyaXBzIHsKLQl1bnNpZ25lZCBsb25nCQl3YXJuaW5nOwotCXVuc2lnbmVkIGxvbmcJCWxvdzsKKwl1bnNpZ25lZCBsb25nIHdhcm5pbmc7CisJdW5zaWduZWQgbG9uZyBsb3c7CiB9OwogCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5IHsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2ZsYWdzIGZsYWdzOwogCXN0cnVjdCBhY3BpX2JhdHRlcnlfdHJpcHMgdHJpcHM7Ci0JdW5zaWduZWQgbG9uZwkJYWxhcm07CisJdW5zaWduZWQgbG9uZyBhbGFybTsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gKmluZm87CiB9OwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF0dGVyeSBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfZ2V0X2luZm8gKAotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnksCi0Jc3RydWN0IGFjcGlfYmF0dGVyeV9pbmZvICoqYmlmKQorYWNwaV9iYXR0ZXJ5X2dldF9pbmZvKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnksCisJCSAgICAgIHN0cnVjdCBhY3BpX2JhdHRlcnlfaW5mbyAqKmJpZikKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzIAkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJZm9ybWF0ID0ge3NpemVvZihBQ1BJX0JBVFRFUllfRk9STUFUX0JJRiksCi0JCQkJCQlBQ1BJX0JBVFRFUllfRk9STUFUX0JJRn07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWRhdGEgPSB7MCwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QJKnBhY2thZ2UgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgZm9ybWF0ID0geyBzaXplb2YoQUNQSV9CQVRURVJZX0ZPUk1BVF9CSUYpLAorCQlBQ1BJX0JBVFRFUllfRk9STUFUX0JJRgorCX07CisJc3RydWN0IGFjcGlfYnVmZmVyIGRhdGEgPSB7IDAsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfZ2V0X2luZm8iKTsKIApAQCAtMTQ4LDcgKzE0NSw3IEBACiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCXBhY2thZ2UgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAogCS8qIEV4dHJhY3QgUGFja2FnZSBEYXRhICovCiAKQEAgLTE3NCwyNyArMTcxLDI3IEBACiAJCWdvdG8gZW5kOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiAKIAlpZiAoIXJlc3VsdCkKLQkJKCpiaWYpID0gKHN0cnVjdCBhY3BpX2JhdHRlcnlfaW5mbyAqKSBkYXRhLnBvaW50ZXI7CisJCSgqYmlmKSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gKilkYXRhLnBvaW50ZXI7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAogc3RhdGljIGludAotYWNwaV9iYXR0ZXJ5X2dldF9zdGF0dXMgKAotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnksCi0Jc3RydWN0IGFjcGlfYmF0dGVyeV9zdGF0dXMgKipic3QpCithY3BpX2JhdHRlcnlfZ2V0X3N0YXR1cyhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5LAorCQkJc3RydWN0IGFjcGlfYmF0dGVyeV9zdGF0dXMgKipic3QpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cyAJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWZvcm1hdCA9IHtzaXplb2YoQUNQSV9CQVRURVJZX0ZPUk1BVF9CU1QpLAotCQkJCQkJQUNQSV9CQVRURVJZX0ZPUk1BVF9CU1R9OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglkYXRhID0gezAsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpwYWNrYWdlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGZvcm1hdCA9IHsgc2l6ZW9mKEFDUElfQkFUVEVSWV9GT1JNQVRfQlNUKSwKKwkJQUNQSV9CQVRURVJZX0ZPUk1BVF9CU1QKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBkYXRhID0geyAwLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2dldF9zdGF0dXMiKTsKIApAQCAtMjA5LDcgKzIwNiw3IEBACiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCXBhY2thZ2UgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAogCS8qIEV4dHJhY3QgUGFja2FnZSBEYXRhICovCiAKQEAgLTIzNSwyNCArMjMyLDIxIEBACiAJCWdvdG8gZW5kOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiAKIAlpZiAoIXJlc3VsdCkKLQkJKCpic3QpID0gKHN0cnVjdCBhY3BpX2JhdHRlcnlfc3RhdHVzICopIGRhdGEucG9pbnRlcjsKKwkJKCpic3QpID0gKHN0cnVjdCBhY3BpX2JhdHRlcnlfc3RhdHVzICopZGF0YS5wb2ludGVyOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogc3RhdGljIGludAotYWNwaV9iYXR0ZXJ5X3NldF9hbGFybSAoCi0Jc3RydWN0IGFjcGlfYmF0dGVyeQkqYmF0dGVyeSwKLQl1bnNpZ25lZCBsb25nCQlhbGFybSkKK2FjcGlfYmF0dGVyeV9zZXRfYWxhcm0oc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSwgdW5zaWduZWQgbG9uZyBhbGFybSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdfbGlzdCA9IHsxLCAmYXJnMH07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0geyAxLCAmYXJnMCB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X3NldF9hbGFybSIpOwogCkBAIC0yNzUsMTkgKzI2OSwxNiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2JhdHRlcnlfY2hlY2sgKAotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkpCitzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9jaGVjayhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCWFjcGlfaGFuZGxlCQloYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gKmJpZiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfY2hlY2siKTsKLQkKKwogCWlmICghYmF0dGVyeSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCkBAIC0zMzYsMTggKzMyNywxNyBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9iYXR0ZXJ5X2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfYmF0dGVyeV9kaXI7CiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZWFkX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKSBzZXEtPnByaXZhdGU7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopc2VxLT5wcml2YXRlOwogCXN0cnVjdCBhY3BpX2JhdHRlcnlfaW5mbyAqYmlmID0gTlVMTDsKLQljaGFyCQkJKnVuaXRzID0gIj8iOworCWNoYXIgKnVuaXRzID0gIj8iOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X3JlYWRfaW5mbyIpOwogCkBAIC0zNjksMTkgKzM1OSwyMSBAQAogCQlnb3RvIGVuZDsKIAl9CiAKLQl1bml0cyA9IGJpZi0+cG93ZXJfdW5pdCA/IEFDUElfQkFUVEVSWV9VTklUU19BTVBTIDogQUNQSV9CQVRURVJZX1VOSVRTX1dBVFRTOwotCQkJCQkKKwl1bml0cyA9CisJICAgIGJpZi0+CisJICAgIHBvd2VyX3VuaXQgPyBBQ1BJX0JBVFRFUllfVU5JVFNfQU1QUyA6IEFDUElfQkFUVEVSWV9VTklUU19XQVRUUzsKKwogCWlmIChiaWYtPmRlc2lnbl9jYXBhY2l0eSA9PSBBQ1BJX0JBVFRFUllfVkFMVUVfVU5LTk9XTikKIAkJc2VxX3ByaW50ZihzZXEsICJkZXNpZ24gY2FwYWNpdHk6ICAgICAgICAgdW5rbm93blxuIik7CiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiBjYXBhY2l0eTogICAgICAgICAlZCAlc2hcbiIsCi0JCQkodTMyKSBiaWYtPmRlc2lnbl9jYXBhY2l0eSwgdW5pdHMpOworCQkJICAgKHUzMikgYmlmLT5kZXNpZ25fY2FwYWNpdHksIHVuaXRzKTsKIAogCWlmIChiaWYtPmxhc3RfZnVsbF9jYXBhY2l0eSA9PSBBQ1BJX0JBVFRFUllfVkFMVUVfVU5LTk9XTikKIAkJc2VxX3ByaW50ZihzZXEsICJsYXN0IGZ1bGwgY2FwYWNpdHk6ICAgICAgdW5rbm93blxuIik7CiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgImxhc3QgZnVsbCBjYXBhY2l0eTogICAgICAlZCAlc2hcbiIsCi0JCQkodTMyKSBiaWYtPmxhc3RfZnVsbF9jYXBhY2l0eSwgdW5pdHMpOworCQkJICAgKHUzMikgYmlmLT5sYXN0X2Z1bGxfY2FwYWNpdHksIHVuaXRzKTsKIAogCXN3aXRjaCAoKHUzMikgYmlmLT5iYXR0ZXJ5X3RlY2hub2xvZ3kpIHsKIAljYXNlIDA6CkBAIC0zOTksMjYgKzM5MSwyMiBAQAogCQlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiB2b2x0YWdlOiAgICAgICAgICB1bmtub3duXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiZGVzaWduIHZvbHRhZ2U6ICAgICAgICAgICVkIG1WXG4iLAotCQkJKHUzMikgYmlmLT5kZXNpZ25fdm9sdGFnZSk7Ci0JCi0Jc2VxX3ByaW50ZihzZXEsICJkZXNpZ24gY2FwYWNpdHkgd2FybmluZzogJWQgJXNoXG4iLAotCQkodTMyKSBiaWYtPmRlc2lnbl9jYXBhY2l0eV93YXJuaW5nLCB1bml0cyk7Ci0Jc2VxX3ByaW50ZihzZXEsICJkZXNpZ24gY2FwYWNpdHkgbG93OiAgICAgJWQgJXNoXG4iLAotCQkodTMyKSBiaWYtPmRlc2lnbl9jYXBhY2l0eV9sb3csIHVuaXRzKTsKLQlzZXFfcHJpbnRmKHNlcSwgImNhcGFjaXR5IGdyYW51bGFyaXR5IDE6ICAlZCAlc2hcbiIsCi0JCSh1MzIpIGJpZi0+YmF0dGVyeV9jYXBhY2l0eV9ncmFudWxhcml0eV8xLCB1bml0cyk7Ci0Jc2VxX3ByaW50ZihzZXEsICJjYXBhY2l0eSBncmFudWxhcml0eSAyOiAgJWQgJXNoXG4iLAotCQkodTMyKSBiaWYtPmJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMiwgdW5pdHMpOwotCXNlcV9wcmludGYoc2VxLCAibW9kZWwgbnVtYmVyOiAgICAgICAgICAgICVzXG4iLAotCQliaWYtPm1vZGVsX251bWJlcik7Ci0Jc2VxX3ByaW50ZihzZXEsICJzZXJpYWwgbnVtYmVyOiAgICAgICAgICAgJXNcbiIsCi0JCWJpZi0+c2VyaWFsX251bWJlcik7Ci0Jc2VxX3ByaW50ZihzZXEsICJiYXR0ZXJ5IHR5cGU6ICAgICAgICAgICAgJXNcbiIsCi0JCWJpZi0+YmF0dGVyeV90eXBlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIk9FTSBpbmZvOiAgICAgICAgICAgICAgICAlc1xuIiwKLQkJYmlmLT5vZW1faW5mbyk7CisJCQkgICAodTMyKSBiaWYtPmRlc2lnbl92b2x0YWdlKTsKIAotZW5kOgorCXNlcV9wcmludGYoc2VxLCAiZGVzaWduIGNhcGFjaXR5IHdhcm5pbmc6ICVkICVzaFxuIiwKKwkJICAgKHUzMikgYmlmLT5kZXNpZ25fY2FwYWNpdHlfd2FybmluZywgdW5pdHMpOworCXNlcV9wcmludGYoc2VxLCAiZGVzaWduIGNhcGFjaXR5IGxvdzogICAgICVkICVzaFxuIiwKKwkJICAgKHUzMikgYmlmLT5kZXNpZ25fY2FwYWNpdHlfbG93LCB1bml0cyk7CisJc2VxX3ByaW50ZihzZXEsICJjYXBhY2l0eSBncmFudWxhcml0eSAxOiAgJWQgJXNoXG4iLAorCQkgICAodTMyKSBiaWYtPmJhdHRlcnlfY2FwYWNpdHlfZ3JhbnVsYXJpdHlfMSwgdW5pdHMpOworCXNlcV9wcmludGYoc2VxLCAiY2FwYWNpdHkgZ3JhbnVsYXJpdHkgMjogICVkICVzaFxuIiwKKwkJICAgKHUzMikgYmlmLT5iYXR0ZXJ5X2NhcGFjaXR5X2dyYW51bGFyaXR5XzIsIHVuaXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIm1vZGVsIG51bWJlcjogICAgICAgICAgICAlc1xuIiwgYmlmLT5tb2RlbF9udW1iZXIpOworCXNlcV9wcmludGYoc2VxLCAic2VyaWFsIG51bWJlcjogICAgICAgICAgICVzXG4iLCBiaWYtPnNlcmlhbF9udW1iZXIpOworCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeSB0eXBlOiAgICAgICAgICAgICVzXG4iLCBiaWYtPmJhdHRlcnlfdHlwZSk7CisJc2VxX3ByaW50ZihzZXEsICJPRU0gaW5mbzogICAgICAgICAgICAgICAgJXNcbiIsIGJpZi0+b2VtX2luZm8pOworCisgICAgICBlbmQ6CiAJa2ZyZWUoYmlmKTsKIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTQyOSwxNCArNDE3LDEyIEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfYmF0dGVyeV9yZWFkX2luZm8sIFBERShpbm9kZSktPmRhdGEpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9yZWFkX3N0YXRlIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVhZF9zdGF0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfYmF0dGVyeQkqYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopIHNlcS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKilzZXEtPnByaXZhdGU7CiAJc3RydWN0IGFjcGlfYmF0dGVyeV9zdGF0dXMgKmJzdCA9IE5VTEw7Ci0JY2hhcgkJCSp1bml0cyA9ICI/IjsKKwljaGFyICp1bml0cyA9ICI/IjsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9yZWFkX3N0YXRlIik7CiAKQEAgLTQ1Miw3ICs0MzgsOSBAQAogCiAJLyogQmF0dGVyeSBVbml0cyAqLwogCi0JdW5pdHMgPSBiYXR0ZXJ5LT5mbGFncy5wb3dlcl91bml0ID8gQUNQSV9CQVRURVJZX1VOSVRTX0FNUFMgOiBBQ1BJX0JBVFRFUllfVU5JVFNfV0FUVFM7CisJdW5pdHMgPQorCSAgICBiYXR0ZXJ5LT5mbGFncy4KKwkgICAgcG93ZXJfdW5pdCA/IEFDUElfQkFUVEVSWV9VTklUU19BTVBTIDogQUNQSV9CQVRURVJZX1VOSVRTX1dBVFRTOwogCiAJLyogQmF0dGVyeSBTdGF0dXMgKF9CU1QpICovCiAKQEAgLTQ2NywxMiArNDU1LDEyIEBACiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgImNhcGFjaXR5IHN0YXRlOiAgICAgICAgICBjcml0aWNhbFxuIik7CiAKLQlpZiAoKGJzdC0+c3RhdGUgJiAweDAxKSAmJiAoYnN0LT5zdGF0ZSAmIDB4MDIpKXsKLQkJc2VxX3ByaW50ZihzZXEsICJjaGFyZ2luZyBzdGF0ZTogICAgICAgICAgY2hhcmdpbmcvZGlzY2hhcmdpbmdcbiIpOwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkJhdHRlcnkgQ2hhcmdpbmcgYW5kIERpc2NoYXJnaW5nP1xuIikpOwotCX0KLQllbHNlIGlmIChic3QtPnN0YXRlICYgMHgwMSkKKwlpZiAoKGJzdC0+c3RhdGUgJiAweDAxKSAmJiAoYnN0LT5zdGF0ZSAmIDB4MDIpKSB7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgImNoYXJnaW5nIHN0YXRlOiAgICAgICAgICBjaGFyZ2luZy9kaXNjaGFyZ2luZ1xuIik7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQmF0dGVyeSBDaGFyZ2luZyBhbmQgRGlzY2hhcmdpbmc/XG4iKSk7CisJfSBlbHNlIGlmIChic3QtPnN0YXRlICYgMHgwMSkKIAkJc2VxX3ByaW50ZihzZXEsICJjaGFyZ2luZyBzdGF0ZTogICAgICAgICAgZGlzY2hhcmdpbmdcbiIpOwogCWVsc2UgaWYgKGJzdC0+c3RhdGUgJiAweDAyKQogCQlzZXFfcHJpbnRmKHNlcSwgImNoYXJnaW5nIHN0YXRlOiAgICAgICAgICBjaGFyZ2luZ1xuIik7CkBAIC00ODQsMjEgKzQ3MiwyMSBAQAogCQlzZXFfcHJpbnRmKHNlcSwgInByZXNlbnQgcmF0ZTogICAgICAgICAgICB1bmtub3duXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAicHJlc2VudCByYXRlOiAgICAgICAgICAgICVkICVzXG4iLAotCQkJKHUzMikgYnN0LT5wcmVzZW50X3JhdGUsIHVuaXRzKTsKKwkJCSAgICh1MzIpIGJzdC0+cHJlc2VudF9yYXRlLCB1bml0cyk7CiAKIAlpZiAoYnN0LT5yZW1haW5pbmdfY2FwYWNpdHkgPT0gQUNQSV9CQVRURVJZX1ZBTFVFX1VOS05PV04pCiAJCXNlcV9wcmludGYoc2VxLCAicmVtYWluaW5nIGNhcGFjaXR5OiAgICAgIHVua25vd25cbiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJyZW1haW5pbmcgY2FwYWNpdHk6ICAgICAgJWQgJXNoXG4iLAotCQkJKHUzMikgYnN0LT5yZW1haW5pbmdfY2FwYWNpdHksIHVuaXRzKTsKKwkJCSAgICh1MzIpIGJzdC0+cmVtYWluaW5nX2NhcGFjaXR5LCB1bml0cyk7CiAKIAlpZiAoYnN0LT5wcmVzZW50X3ZvbHRhZ2UgPT0gQUNQSV9CQVRURVJZX1ZBTFVFX1VOS05PV04pCiAJCXNlcV9wcmludGYoc2VxLCAicHJlc2VudCB2b2x0YWdlOiAgICAgICAgIHVua25vd25cbiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJwcmVzZW50IHZvbHRhZ2U6ICAgICAgICAgJWQgbVZcbiIsCi0JCQkodTMyKSBic3QtPnByZXNlbnRfdm9sdGFnZSk7CisJCQkgICAodTMyKSBic3QtPnByZXNlbnRfdm9sdGFnZSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlrZnJlZShic3QpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwpAQCAtNTA5LDEyICs0OTcsMTAgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9iYXR0ZXJ5X3JlYWRfc3RhdGUsIFBERShpbm9kZSktPmRhdGEpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9yZWFkX2FsYXJtIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVhZF9hbGFybShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKSBzZXEtPnByaXZhdGU7Ci0JY2hhcgkJCSp1bml0cyA9ICI/IjsKKwlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKilzZXEtPnByaXZhdGU7CisJY2hhciAqdW5pdHMgPSAiPyI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfcmVhZF9hbGFybSIpOwogCkBAIC01MjcsOCArNTEzLDEwIEBACiAJfQogCiAJLyogQmF0dGVyeSBVbml0cyAqLwotCQotCXVuaXRzID0gYmF0dGVyeS0+ZmxhZ3MucG93ZXJfdW5pdCA/IEFDUElfQkFUVEVSWV9VTklUU19BTVBTIDogQUNQSV9CQVRURVJZX1VOSVRTX1dBVFRTOworCisJdW5pdHMgPQorCSAgICBiYXR0ZXJ5LT5mbGFncy4KKwkgICAgcG93ZXJfdW5pdCA/IEFDUElfQkFUVEVSWV9VTklUU19BTVBTIDogQUNQSV9CQVRURVJZX1VOSVRTX1dBVFRTOwogCiAJLyogQmF0dGVyeSBBbGFybSAqLwogCkBAIC01MzgsMjIgKzUyNiwxOSBAQAogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICIlZCAlc2hcbiIsICh1MzIpIGJhdHRlcnktPmFsYXJtLCB1bml0cyk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIHNzaXplX3QKLWFjcGlfYmF0dGVyeV93cml0ZV9hbGFybSAoCi0Jc3RydWN0IGZpbGUJKmZpbGUsCi0JY29uc3QgY2hhcglfX3VzZXIgKmJ1ZmZlciwKLQlzaXplX3QJCWNvdW50LAotCWxvZmZfdAkJKnBwb3MpCithY3BpX2JhdHRlcnlfd3JpdGVfYWxhcm0oc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JY2hhcgkJCWFsYXJtX3N0cmluZ1sxMl0gPSB7J1wwJ307Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFjcGlfYmF0dGVyeQkqYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopbS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwljaGFyIGFsYXJtX3N0cmluZ1sxMl0gPSB7ICdcMCcgfTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKW0tPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfd3JpdGVfYWxhcm0iKTsKIApAQCAtNTY1LDExICs1NTAsMTEgQEAKIAogCWlmIChjb3B5X2Zyb21fdXNlcihhbGFybV9zdHJpbmcsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm5fVkFMVUUoLUVGQVVMVCk7Ci0JCisKIAlhbGFybV9zdHJpbmdbY291bnRdID0gJ1wwJzsKIAotCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9zZXRfYWxhcm0oYmF0dGVyeSwgCi0JCXNpbXBsZV9zdHJ0b3VsKGFsYXJtX3N0cmluZywgTlVMTCwgMCkpOworCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9zZXRfYWxhcm0oYmF0dGVyeSwKKwkJCQkJc2ltcGxlX3N0cnRvdWwoYWxhcm1fc3RyaW5nLCBOVUxMLCAwKSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKQEAgLTU4Miw0MSArNTY3LDM5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYmF0dGVyeV9pbmZvX29wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2JhdHRlcnlfaW5mb19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX2JhdHRlcnlfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9iYXR0ZXJ5X3N0YXRlX29wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2JhdHRlcnlfc3RhdGVfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9iYXR0ZXJ5X3N0YXRlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2JhdHRlcnlfYWxhcm1fb3BzID0gewotCS5vcGVuCQk9IGFjcGlfYmF0dGVyeV9hbGFybV9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS53cml0ZQkJPSBhY3BpX2JhdHRlcnlfd3JpdGVfYWxhcm0sCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfYmF0dGVyeV9hbGFybV9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gYWNwaV9iYXR0ZXJ5X3dyaXRlX2FsYXJtLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2FkZF9mcyIpOwogCiAJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IHByb2NfbWtkaXIoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQlhY3BpX2JhdHRlcnlfZGlyKTsKKwkJCQkJCSAgICAgYWNwaV9iYXR0ZXJ5X2Rpcik7CiAJCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpCiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpLT5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtNjI0LDI0ICs2MDcsMjQgQEAKIAogCS8qICdpbmZvJyBbUl0gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfQkFUVEVSWV9GSUxFX0lORk8sCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfQkFUVEVSWV9GSUxFX0lORk8pKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX0JBVFRFUllfRklMRV9JTkZPKSk7CiAJZWxzZSB7Ci0JCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9iYXR0ZXJ5X2luZm9fb3BzOyAKKwkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX2JhdHRlcnlfaW5mb19vcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAl9CiAKIAkvKiAnc3RhdHVzJyBbUl0gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfQkFUVEVSWV9GSUxFX1NUQVRVUywKLQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9CQVRURVJZX0ZJTEVfU1RBVFVTKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9CQVRURVJZX0ZJTEVfU1RBVFVTKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9iYXR0ZXJ5X3N0YXRlX29wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC02NTAsMTEgKzYzMywxMiBAQAogCiAJLyogJ2FsYXJtJyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9CQVRURVJZX0ZJTEVfQUxBUk0sCi0JCVNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX0JBVFRFUllfRklMRV9BTEFSTSkpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfQkFUVEVSWV9GSUxFX0FMQVJNKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9iYXR0ZXJ5X2FsYXJtX29wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC02NjQsMTAgKzY0OCw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9yZW1vdmVfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYmF0dGVyeV9yZW1vdmVfZnMiKTsKIApAQCAtNjg2LDE5ICs2NjcsMTQgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX2JhdHRlcnlfbm90aWZ5ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWV2ZW50LAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfYmF0dGVyeV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfYmF0dGVyeQkqYmF0dGVyeSA9IChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICopIGRhdGE7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKWRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X25vdGlmeSIpOwogCkBAIC03MTYsMjQgKzY5MiwyMSBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9iYXR0ZXJ5X2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5CSpiYXR0ZXJ5ID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2FkZCIpOwotCQorCiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIApAQCAtNzU2LDE5ICs3MjksMjAgQEAKIAkJZ290byBlbmQ7CiAKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoYmF0dGVyeS0+aGFuZGxlLAotCQlBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfYmF0dGVyeV9ub3RpZnksIGJhdHRlcnkpOworCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBhY3BpX2JhdHRlcnlfbm90aWZ5LCBiYXR0ZXJ5KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgU2xvdCBbJXNdIChiYXR0ZXJ5ICVzKVxuIiwKLQkJQUNQSV9CQVRURVJZX0RFVklDRV9OQU1FLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJZGV2aWNlLT5zdGF0dXMuYmF0dGVyeV9wcmVzZW50PyJwcmVzZW50IjoiYWJzZW50Iik7Ci0JCQotZW5kOgorCSAgICAgICBBQ1BJX0JBVFRFUllfREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCSAgICAgICBkZXZpY2UtPnN0YXR1cy5iYXR0ZXJ5X3ByZXNlbnQgPyAicHJlc2VudCIgOiAiYWJzZW50Iik7CisKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KSB7CiAJCWFjcGlfYmF0dGVyeV9yZW1vdmVfZnMoZGV2aWNlKTsKIAkJa2ZyZWUoYmF0dGVyeSk7CkBAIC03NzcsMjcgKzc1MSwyNCBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYmF0dGVyeV9yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2JhdHRlcnkJKmJhdHRlcnkgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQliYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWJhdHRlcnkgPSAoc3RydWN0IGFjcGlfYmF0dGVyeSAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGJhdHRlcnktPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX2JhdHRlcnlfbm90aWZ5KTsKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIGFjcGlfYmF0dGVyeV9ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKIAlhY3BpX2JhdHRlcnlfcmVtb3ZlX2ZzKGRldmljZSk7CiAKQEAgLTgwNiwxMSArNzc3LDkgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfYmF0dGVyeV9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9iYXR0ZXJ5X2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9iYXR0ZXJ5X2luaXQiKTsKIApAQCAtODI4LDkgKzc5Nyw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9iYXR0ZXJ5X2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9iYXR0ZXJ5X2V4aXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2JhdHRlcnlfZXhpdCIpOwogCkBAIC04NDEsNiArODA4LDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX2JhdHRlcnlfaW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX2JhdHRlcnlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMgYi9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKaW5kZXggNGMwMTBlNy4uOTgyNGY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYwpAQCAtMjYsNyArMjYsNiBAQAogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqLwogCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zNCw0OSArMzMsNDkgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKLWVudW0gYWNwaV9ibGFja2xpc3RfcHJlZGljYXRlcwotewotICAgICAgICBhbGxfdmVyc2lvbnMsCi0gICAgICAgIGxlc3NfdGhhbl9vcl9lcXVhbCwKLSAgICAgICAgZXF1YWwsCi0gICAgICAgIGdyZWF0ZXJfdGhhbl9vcl9lcXVhbCwKK2VudW0gYWNwaV9ibGFja2xpc3RfcHJlZGljYXRlcyB7CisJYWxsX3ZlcnNpb25zLAorCWxlc3NfdGhhbl9vcl9lcXVhbCwKKwllcXVhbCwKKwlncmVhdGVyX3RoYW5fb3JfZXF1YWwsCiB9OwogCi1zdHJ1Y3QgYWNwaV9ibGFja2xpc3RfaXRlbQotewotICAgICAgICBjaGFyICAgICAgICAgICAgb2VtX2lkWzddOwotICAgICAgICBjaGFyICAgICAgICAgICAgb2VtX3RhYmxlX2lkWzldOwotICAgICAgICB1MzIgICAgICAgICAgICAgb2VtX3JldmlzaW9uOwotICAgICAgICBhY3BpX3RhYmxlX3R5cGUgdGFibGU7Ci0gICAgICAgIGVudW0gYWNwaV9ibGFja2xpc3RfcHJlZGljYXRlcyBvZW1fcmV2aXNpb25fcHJlZGljYXRlOwotICAgICAgICBjaGFyICAgICAgICAgICAgKnJlYXNvbjsKLSAgICAgICAgdTMyICAgICAgICAgICAgIGlzX2NyaXRpY2FsX2Vycm9yOworc3RydWN0IGFjcGlfYmxhY2tsaXN0X2l0ZW0geworCWNoYXIgb2VtX2lkWzddOworCWNoYXIgb2VtX3RhYmxlX2lkWzldOworCXUzMiBvZW1fcmV2aXNpb247CisJYWNwaV90YWJsZV90eXBlIHRhYmxlOworCWVudW0gYWNwaV9ibGFja2xpc3RfcHJlZGljYXRlcyBvZW1fcmV2aXNpb25fcHJlZGljYXRlOworCWNoYXIgKnJlYXNvbjsKKwl1MzIgaXNfY3JpdGljYWxfZXJyb3I7CiB9OwogCiAvKgogICogUE9MSUNZOiBJZiAqYW55dGhpbmcqIGRvZXNuJ3Qgd29yaywgcHV0IGl0IG9uIHRoZSBibGFja2xpc3QuCiAgKgkgICBJZiB0aGV5IGFyZSBjcml0aWNhbCBlcnJvcnMsIG1hcmsgaXQgY3JpdGljYWwsIGFuZCBhYm9ydCBkcml2ZXIgbG9hZC4KICAqLwotc3RhdGljIHN0cnVjdCBhY3BpX2JsYWNrbGlzdF9pdGVtIGFjcGlfYmxhY2tsaXN0W10gX19pbml0ZGF0YSA9Ci17CitzdGF0aWMgc3RydWN0IGFjcGlfYmxhY2tsaXN0X2l0ZW0gYWNwaV9ibGFja2xpc3RbXSBfX2luaXRkYXRhID0gewogCS8qIENvbXBhcSBQcmVzYXJpbyAxNzAwICovCi0JeyJQVExURCAiLCAiICBEU0RUICAiLCAweDA2MDQwMDAwLCBBQ1BJX0RTRFQsIGxlc3NfdGhhbl9vcl9lcXVhbCwgIk11bHRpcGxlIHByb2JsZW1zIiwgMX0sCisJeyJQVExURCAiLCAiICBEU0RUICAiLCAweDA2MDQwMDAwLCBBQ1BJX0RTRFQsIGxlc3NfdGhhbl9vcl9lcXVhbCwKKwkgIk11bHRpcGxlIHByb2JsZW1zIiwgMX0sCiAJLyogU29ueSBGWDEyMCwgRlgxNDAsIEZYMTUwPyAqLwotCXsiU09OWSAgIiwgIlUwICAgICAgIiwgMHgyMDAxMDMxMywgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsICJBQ1BJIGRyaXZlciBwcm9ibGVtIiwgMX0sCisJeyJTT05ZICAiLCAiVTAgICAgICAiLCAweDIwMDEwMzEzLCBBQ1BJX0RTRFQsIGxlc3NfdGhhbl9vcl9lcXVhbCwKKwkgIkFDUEkgZHJpdmVyIHByb2JsZW0iLCAxfSwKIAkvKiBDb21wYXEgUHJlc2FyaW8gODAwLCBJbnN5ZGUgQklPUyAqLwotCXsiSU5UNDQwIiwgIlNZU0ZleHh4IiwgMHgwMDAwMTAwMSwgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsICJEb2VzIG5vdCB1c2UgX1JFRyB0byBwcm90ZWN0IEVDIE9wUmVnaW9ucyIsIDF9LAorCXsiSU5UNDQwIiwgIlNZU0ZleHh4IiwgMHgwMDAwMTAwMSwgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCisJICJEb2VzIG5vdCB1c2UgX1JFRyB0byBwcm90ZWN0IEVDIE9wUmVnaW9ucyIsIDF9LAogCS8qIElCTSA2MDBFIC0gX0FEUiBzaG91bGQgcmV0dXJuIDcsIGJ1dCBpdCByZXR1cm5zIDEgKi8KLQl7IklCTSAgICIsICJUUDYwMEUgICIsIDB4MDAwMDAxMDUsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLCAiSW5jb3JyZWN0IF9BRFIiLCAxfSwKLQl7IkFTVVNcMFwwIiwgIlAyQi1TICAgIiwgMCwgQUNQSV9EU0RULCBhbGxfdmVyc2lvbnMsICJCb2d1cyBQQ0kgcm91dGluZyIsIDF9LAorCXsiSUJNICAgIiwgIlRQNjAwRSAgIiwgMHgwMDAwMDEwNSwgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCisJICJJbmNvcnJlY3QgX0FEUiIsIDF9LAorCXsiQVNVU1wwXDAiLCAiUDJCLVMgICAiLCAwLCBBQ1BJX0RTRFQsIGFsbF92ZXJzaW9ucywKKwkgIkJvZ3VzIFBDSSByb3V0aW5nIiwgMX0sCiAKIAl7IiJ9CiB9OwogCi0KICNpZglDT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUgogCi1zdGF0aWMgaW50IF9faW5pdAotYmxhY2tsaXN0X2J5X3llYXIodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGJsYWNrbGlzdF9ieV95ZWFyKHZvaWQpCiB7CiAJaW50IHllYXI7CiAJY2hhciAqcyA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfREFURSk7CkBAIC05MiwzNiArOTEsMzggQEAKIAogCXMgKz0gMTsKIAotCXllYXIgPSBzaW1wbGVfc3RydG91bChzLE5VTEwsMCk7IAorCXllYXIgPSBzaW1wbGVfc3RydG91bChzLCBOVUxMLCAwKTsKIAotCWlmICh5ZWFyIDwgMTAwKSB7CQkvKiAyLWRpZ2l0IHllYXIgKi8KKwlpZiAoeWVhciA8IDEwMCkgewkvKiAyLWRpZ2l0IHllYXIgKi8KIAkJeWVhciArPSAxOTAwOwogCQlpZiAoeWVhciA8IDE5OTYpCS8qIG5vIGRhdGVzIDwgc3BlYyAxLjAgKi8KIAkJCXllYXIgKz0gMTAwOwogCX0KIAogCWlmICh5ZWFyIDwgQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQklPUyBhZ2UgKCVkKSBmYWlscyBjdXRvZmYgKCVkKSwgIiAKLQkJCSJhY3BpPWZvcmNlIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBBQ1BJXG4iLAotCQkJeWVhciwgQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVIpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJCSU9TIGFnZSAoJWQpIGZhaWxzIGN1dG9mZiAoJWQpLCAiCisJCSAgICAgICAiYWNwaT1mb3JjZSBpcyByZXF1aXJlZCB0byBlbmFibGUgQUNQSVxuIiwKKwkJICAgICAgIHllYXIsIENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGJsYWNrbGlzdF9ieV95ZWFyKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGJsYWNrbGlzdF9ieV95ZWFyKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAotaW50IF9faW5pdAotYWNwaV9ibGFja2xpc3RlZCh2b2lkKQoraW50IF9faW5pdCBhY3BpX2JsYWNrbGlzdGVkKHZvaWQpCiB7CiAJaW50IGkgPSAwOwogCWludCBibGFja2xpc3RlZCA9IDA7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXI7CiAKLQl3aGlsZSAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX2lkWzBdICE9ICdcMCcpCi0JewotCQlpZiAoYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5KGFjcGlfYmxhY2tsaXN0W2ldLnRhYmxlLCAmdGFibGVfaGVhZGVyKSkgeworCXdoaWxlIChhY3BpX2JsYWNrbGlzdFtpXS5vZW1faWRbMF0gIT0gJ1wwJykgeworCQlpZiAoYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5CisJCSAgICAoYWNwaV9ibGFja2xpc3RbaV0udGFibGUsICZ0YWJsZV9oZWFkZXIpKSB7CiAJCQlpKys7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTMxLDMzICsxMzIsNDMgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHN0cm5jbXAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3RhYmxlX2lkLCB0YWJsZV9oZWFkZXItPm9lbV90YWJsZV9pZCwgOCkpIHsKKwkJaWYgKHN0cm5jbXAKKwkJICAgIChhY3BpX2JsYWNrbGlzdFtpXS5vZW1fdGFibGVfaWQsIHRhYmxlX2hlYWRlci0+b2VtX3RhYmxlX2lkLAorCQkgICAgIDgpKSB7CiAJCQlpKys7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWlmICgoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uX3ByZWRpY2F0ZSA9PSBhbGxfdmVyc2lvbnMpCi0JCSAgICB8fCAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uX3ByZWRpY2F0ZSA9PSBsZXNzX3RoYW5fb3JfZXF1YWwKLQkJICAgICAgICAmJiB0YWJsZV9oZWFkZXItPm9lbV9yZXZpc2lvbiA8PSBhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pCi0JCSAgICB8fCAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uX3ByZWRpY2F0ZSA9PSBncmVhdGVyX3RoYW5fb3JfZXF1YWwKLQkJICAgICAgICAmJiB0YWJsZV9oZWFkZXItPm9lbV9yZXZpc2lvbiA+PSBhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pCisJCSAgICB8fCAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uX3ByZWRpY2F0ZSA9PQorCQkJbGVzc190aGFuX29yX2VxdWFsCisJCQkmJiB0YWJsZV9oZWFkZXItPm9lbV9yZXZpc2lvbiA8PQorCQkJYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uKQorCQkgICAgfHwgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0KKwkJCWdyZWF0ZXJfdGhhbl9vcl9lcXVhbAorCQkJJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPj0KKwkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbikKIAkJICAgIHx8IChhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb25fcHJlZGljYXRlID09IGVxdWFsCi0JCSAgICAgICAgJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPT0gYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uKSkgeworCQkJJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPT0KKwkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbikpIHsKIAotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVmVuZG9yIFwiJTYuNnNcIiBTeXN0ZW0gXCIlOC44c1wiICIKLQkJCQkiUmV2aXNpb24gMHgleCBoYXMgYSBrbm93biBBQ1BJIEJJT1MgcHJvYmxlbS5cbiIsCi0JCQkJYWNwaV9ibGFja2xpc3RbaV0ub2VtX2lkLAotCQkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV90YWJsZV9pZCwKLQkJCQlhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pOworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkJICAgICAgICJWZW5kb3IgXCIlNi42c1wiIFN5c3RlbSBcIiU4LjhzXCIgIgorCQkJICAgICAgICJSZXZpc2lvbiAweCV4IGhhcyBhIGtub3duIEFDUEkgQklPUyBwcm9ibGVtLlxuIiwKKwkJCSAgICAgICBhY3BpX2JsYWNrbGlzdFtpXS5vZW1faWQsCisJCQkgICAgICAgYWNwaV9ibGFja2xpc3RbaV0ub2VtX3RhYmxlX2lkLAorCQkJICAgICAgIGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbik7CiAKLQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlJlYXNvbjogJXMuIFRoaXMgaXMgYSAlcyBlcnJvclxuIiwKLQkJCQlhY3BpX2JsYWNrbGlzdFtpXS5yZWFzb24sCi0JCQkJKGFjcGlfYmxhY2tsaXN0W2ldLmlzX2NyaXRpY2FsX2Vycm9yID8gIm5vbi1yZWNvdmVyYWJsZSIgOiAicmVjb3ZlcmFibGUiKSk7CisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCQkgICAgICAgIlJlYXNvbjogJXMuIFRoaXMgaXMgYSAlcyBlcnJvclxuIiwKKwkJCSAgICAgICBhY3BpX2JsYWNrbGlzdFtpXS5yZWFzb24sCisJCQkgICAgICAgKGFjcGlfYmxhY2tsaXN0W2ldLgorCQkJCWlzX2NyaXRpY2FsX2Vycm9yID8gIm5vbi1yZWNvdmVyYWJsZSIgOgorCQkJCSJyZWNvdmVyYWJsZSIpKTsKIAogCQkJYmxhY2tsaXN0ZWQgPSBhY3BpX2JsYWNrbGlzdFtpXS5pc19jcml0aWNhbF9lcnJvcjsKIAkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJaSsrOwogCQl9CiAJfQpAQCAtMTY2LDQgKzE3NywzIEBACiAKIAlyZXR1cm4gYmxhY2tsaXN0ZWQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXMuYyBiL2RyaXZlcnMvYWNwaS9idXMuYwppbmRleCBkNzdjMjMwLi42YTRkYTQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMzYsMTkgKzM2LDE3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVU19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9idXMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2J1cyIpCiAjaWZkZWYJQ09ORklHX1g4NgogZXh0ZXJuIHZvaWQgX19pbml0IGFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcik7CiAjZW5kaWYKIAotRkFEVF9ERVNDUklQVE9SCQkJYWNwaV9mYWR0OworRkFEVF9ERVNDUklQVE9SIGFjcGlfZmFkdDsKIEVYUE9SVF9TWU1CT0woYWNwaV9mYWR0KTsKIAotc3RydWN0IGFjcGlfZGV2aWNlCQkqYWNwaV9yb290Owotc3RydWN0IHByb2NfZGlyX2VudHJ5CQkqYWNwaV9yb290X2RpcjsKK3N0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9yb290Oworc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX3Jvb3RfZGlyOwogRVhQT1JUX1NZTUJPTChhY3BpX3Jvb3RfZGlyKTsKIAogI2RlZmluZSBTVFJVQ1RfVE9fSU5UKHMpCSgqKChpbnQqKSZzKSkKQEAgLTU3LDEyICs1NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQKLWFjcGlfYnVzX2dldF9kZXZpY2UgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSoqZGV2aWNlKQoraW50IGFjcGlfYnVzX2dldF9kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKipkZXZpY2UpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZ2V0X2RldmljZSIpOwogCkBAIC03MSwyNCArNjYsMjMgQEAKIAogCS8qIFRCRDogU3VwcG9ydCBmaXhlZC1mZWF0dXJlIGRldmljZXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpX2J1c19kYXRhX2hhbmRsZXIsICh2b2lkKiopIGRldmljZSk7CisJc3RhdHVzID0gYWNwaV9nZXRfZGF0YShoYW5kbGUsIGFjcGlfYnVzX2RhdGFfaGFuZGxlciwgKHZvaWQgKiopZGV2aWNlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgISpkZXZpY2UpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiTm8gY29udGV4dCBmb3Igb2JqZWN0IFslcF1cbiIsCi0JCQloYW5kbGUpKTsKKwkJCQkgIGhhbmRsZSkpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2dldF9kZXZpY2UpOwogCi1pbnQKLWFjcGlfYnVzX2dldF9zdGF0dXMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQoraW50IGFjcGlfYnVzX2dldF9zdGF0dXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCXN0YSA9IDA7Ci0JCisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5zaWduZWQgbG9uZyBzdGEgPSAwOworCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZ2V0X3N0YXR1cyIpOwogCiAJaWYgKCFkZXZpY2UpCkBAIC05OCwxMCArOTIsMTEgQEAKIAkgKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQuCiAJICovCiAJaWYgKGRldmljZS0+ZmxhZ3MuZHluYW1pY19zdGF0dXMpIHsKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JCVNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpID0gKGludCkgc3RhOworCQlTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSA9IChpbnQpc3RhOwogCX0KIAogCS8qCkBAIC0xMTUsMzMgKzExMCwzMCBAQAogCiAJaWYgKGRldmljZS0+c3RhdHVzLmZ1bmN0aW9uYWwgJiYgIWRldmljZS0+c3RhdHVzLnByZXNlbnQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkRldmljZSBbJXNdIHN0YXR1cyBbJTA4eF06ICIKLQkJCSJmdW5jdGlvbmFsIGJ1dCBub3QgcHJlc2VudDsgc2V0dGluZyBwcmVzZW50XG4iLAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkLAotCQkJKHUzMikgU1RSVUNUX1RPX0lOVChkZXZpY2UtPnN0YXR1cykpOworCQkgICAgICAgImZ1bmN0aW9uYWwgYnV0IG5vdCBwcmVzZW50OyBzZXR0aW5nIHByZXNlbnRcbiIsCisJCSAgICAgICBkZXZpY2UtPnBucC5idXNfaWQsICh1MzIpIFNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpKTsKIAkJZGV2aWNlLT5zdGF0dXMucHJlc2VudCA9IDE7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIFslc10gc3RhdHVzIFslMDh4XVxuIiwgCi0JCWRldmljZS0+cG5wLmJ1c19pZCwgKHUzMikgU1RSVUNUX1RPX0lOVChkZXZpY2UtPnN0YXR1cykpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgWyVzXSBzdGF0dXMgWyUwOHhdXG4iLAorCQkJICBkZXZpY2UtPnBucC5idXNfaWQsCisJCQkgICh1MzIpIFNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2dldF9zdGF0dXMpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2dldF9zdGF0dXMpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXIgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50Ci1hY3BpX2J1c19nZXRfcG93ZXIgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JaW50CQkJKnN0YXRlKQoraW50IGFjcGlfYnVzX2dldF9wb3dlcihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqc3RhdGUpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nCQlwc2MgPSAwOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgcHNjID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2dldF9wb3dlciIpOwogCkBAIC0xNTcsMjAgKzE0OSwxOCBAQAogCQkJKnN0YXRlID0gZGV2aWNlLT5wYXJlbnQtPnBvd2VyLnN0YXRlOwogCQllbHNlCiAJCQkqc3RhdGUgPSBBQ1BJX1NUQVRFX0QwOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBHZXQgdGhlIGRldmljZSdzIHBvd2VyIHN0YXRlIGVpdGhlciBkaXJlY3RseSAodmlhIF9QU0MpIG9yIAogCQkgKiBpbmRpcmVjdGx5ICh2aWEgcG93ZXIgcmVzb3VyY2VzKS4KIAkJICovCiAJCWlmIChkZXZpY2UtPnBvd2VyLmZsYWdzLmV4cGxpY2l0X2dldCkgewotCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX1BTQyIsIAotCQkJCU5VTEwsICZwc2MpOworCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX1BTQyIsCisJCQkJCQkgICAgICAgTlVMTCwgJnBzYyk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCQkJZGV2aWNlLT5wb3dlci5zdGF0ZSA9IChpbnQpIHBzYzsKLQkJfQotCQllbHNlIGlmIChkZXZpY2UtPnBvd2VyLmZsYWdzLnBvd2VyX3Jlc291cmNlcykgeworCQkJZGV2aWNlLT5wb3dlci5zdGF0ZSA9IChpbnQpcHNjOworCQl9IGVsc2UgaWYgKGRldmljZS0+cG93ZXIuZmxhZ3MucG93ZXJfcmVzb3VyY2VzKSB7CiAJCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX2dldF9pbmZlcnJlZF9zdGF0ZShkZXZpY2UpOwogCQkJaWYgKHJlc3VsdCkKIAkJCQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKQEAgLTE4MCwyMiArMTcwLDE5IEBACiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIFslc10gcG93ZXIgc3RhdGUgaXMgRCVkXG4iLAotCQlkZXZpY2UtPnBucC5idXNfaWQsIGRldmljZS0+cG93ZXIuc3RhdGUpKTsKKwkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkLCBkZXZpY2UtPnBvd2VyLnN0YXRlKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9idXNfZ2V0X3Bvd2VyKTsKIAotCi1pbnQKLWFjcGlfYnVzX3NldF9wb3dlciAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlpbnQJCQlzdGF0ZSkKK2ludCBhY3BpX2J1c19zZXRfcG93ZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc3RhdGUpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOwotCWNoYXIJCQlvYmplY3RfbmFtZVs1XSA9IHsnXycsJ1AnLCdTJywnMCcrc3RhdGUsJ1wwJ307CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCWNoYXIgb2JqZWN0X25hbWVbNV0gPSB7ICdfJywgJ1AnLCAnUycsICcwJyArIHN0YXRlLCAnXDAnIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19zZXRfcG93ZXIiKTsKIApAQCAtMjA5LDcgKzE5Niw4IEBACiAJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCB0YXJnZXQgc3RhdGUgKi8KIAogCWlmICghZGV2aWNlLT5mbGFncy5wb3dlcl9tYW5hZ2VhYmxlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkRldmljZSBpcyBub3QgcG93ZXIgbWFuYWdlYWJsZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiRGV2aWNlIGlzIG5vdCBwb3dlciBtYW5hZ2VhYmxlXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAJLyoKQEAgLTIxOSwxNSArMjA3LDE4IEBACiAJaWYgKGRldmljZS0+cG93ZXIuc3RhdGUgPT0gQUNQSV9TVEFURV9VTktOT1dOKQogCQlhY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsICZkZXZpY2UtPnBvd2VyLnN0YXRlKTsKIAlpZiAoc3RhdGUgPT0gZGV2aWNlLT5wb3dlci5zdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgaXMgYWxyZWFkeSBhdCBEJWRcbiIsIHN0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBpcyBhbHJlYWR5IGF0IEQlZFxuIiwKKwkJCQkgIHN0YXRlKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAJaWYgKCFkZXZpY2UtPnBvd2VyLnN0YXRlc1tzdGF0ZV0uZmxhZ3MudmFsaWQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRCVkXG4iLCBzdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBEJWRcbiIsCisJCQkJICBzdGF0ZSkpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCWlmIChkZXZpY2UtPnBhcmVudCAmJiAoc3RhdGUgPCBkZXZpY2UtPnBhcmVudC0+cG93ZXIuc3RhdGUpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkNhbm5vdCBzZXQgZGV2aWNlIHRvIGEgaGlnaGVyLXBvd2VyZWQgc3RhdGUgdGhhbiBwYXJlbnRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIkNhbm5vdCBzZXQgZGV2aWNlIHRvIGEgaGlnaGVyLXBvd2VyZWQgc3RhdGUgdGhhbiBwYXJlbnRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIApAQCAtMjQ1LDE4ICsyMzYsMTcgQEAKIAkJCQlnb3RvIGVuZDsKIAkJfQogCQlpZiAoZGV2aWNlLT5wb3dlci5zdGF0ZXNbc3RhdGVdLmZsYWdzLmV4cGxpY2l0X3NldCkgewotCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlLT5oYW5kbGUsIAotCQkJCW9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLAorCQkJCQkJICAgICAgb2JqZWN0X25hbWUsIE5VTEwsIE5VTEwpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJCQlnb3RvIGVuZDsKIAkJCX0KIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQlpZiAoZGV2aWNlLT5wb3dlci5zdGF0ZXNbc3RhdGVdLmZsYWdzLmV4cGxpY2l0X3NldCkgewotCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlLT5oYW5kbGUsIAotCQkJCW9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLAorCQkJCQkJICAgICAgb2JqZWN0X25hbWUsIE5VTEwsIE5VTEwpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJCQlnb3RvIGVuZDsKQEAgLTI2OSwyMCArMjU5LDIxIEBACiAJCX0KIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJFcnJvciB0cmFuc2l0aW9uaW5nIGRldmljZSBbJXNdIHRvIEQlZFxuIiwKLQkJCWRldmljZS0+cG5wLmJ1c19pZCwgc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIkVycm9yIHRyYW5zaXRpb25pbmcgZGV2aWNlIFslc10gdG8gRCVkXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkLCBzdGF0ZSkpOwogCWVsc2UKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIFslc10gdHJhbnNpdGlvbmVkIHRvIEQlZFxuIiwKLQkJCWRldmljZS0+cG5wLmJ1c19pZCwgc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkRldmljZSBbJXNdIHRyYW5zaXRpb25lZCB0byBEJWRcbiIsCisJCQkJICBkZXZpY2UtPnBucC5idXNfaWQsIHN0YXRlKSk7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19zZXRfcG93ZXIpOwogCi0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI5MiwxNiArMjgzLDEyIEBACiBMSVNUX0hFQUQoYWNwaV9idXNfZXZlbnRfbGlzdCk7CiBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhY3BpX2J1c19ldmVudF9xdWV1ZSk7CiAKLWV4dGVybiBpbnQJCQlldmVudF9pc19vcGVuOworZXh0ZXJuIGludCBldmVudF9pc19vcGVuOwogCi1pbnQKLWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50ICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQl1OAkJCXR5cGUsCi0JaW50CQkJZGF0YSkKK2ludCBhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgdTggdHlwZSwgaW50IGRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfYnVzX2V2ZW50CSpldmVudCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOworCXN0cnVjdCBhY3BpX2J1c19ldmVudCAqZXZlbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQiKTsKIApAQCAtMzI5LDE0ICszMTYsMTMgQEAKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19nZW5lcmF0ZV9ldmVudCk7CiAKLWludAotYWNwaV9idXNfcmVjZWl2ZV9ldmVudCAoCi0Jc3RydWN0IGFjcGlfYnVzX2V2ZW50CSpldmVudCkKK2ludCBhY3BpX2J1c19yZWNlaXZlX2V2ZW50KHN0cnVjdCBhY3BpX2J1c19ldmVudCAqZXZlbnQpCiB7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOwotCXN0cnVjdCBhY3BpX2J1c19ldmVudAkqZW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBhY3BpX2J1c19ldmVudCAqZW50cnkgPSBOVUxMOwogCiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTM2MSw3ICszNDcsOCBAQAogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhY3BpX2J1c19ldmVudF9sb2NrLCBmbGFncyk7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KGFjcGlfYnVzX2V2ZW50X2xpc3QubmV4dCwgc3RydWN0IGFjcGlfYnVzX2V2ZW50LCBub2RlKTsKKwllbnRyeSA9CisJICAgIGxpc3RfZW50cnkoYWNwaV9idXNfZXZlbnRfbGlzdC5uZXh0LCBzdHJ1Y3QgYWNwaV9idXNfZXZlbnQsIG5vZGUpOwogCWlmIChlbnRyeSkKIAkJbGlzdF9kZWwoJmVudHJ5LT5ub2RlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY3BpX2J1c19ldmVudF9sb2NrLCBmbGFncyk7CkBAIC0zNzUsMTkgKzM2MiwxNyBAQAogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWNlaXZlX2V2ZW50KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWNlaXZlX2V2ZW50KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIEhhbmRsaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50Ci1hY3BpX2J1c19jaGVja19kZXZpY2UgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCSpzdGF0dXNfY2hhbmdlZCkKK2FjcGlfYnVzX2NoZWNrX2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50ICpzdGF0dXNfY2hhbmdlZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CiAJc3RydWN0IGFjcGlfZGV2aWNlX3N0YXR1cyBvbGRfc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfY2hlY2tfZGV2aWNlIik7CkBAIC00MjIsMTUgKzQwNywxNCBAQAogCiAJaWYgKHN0YXR1c19jaGFuZ2VkKQogCQkqc3RhdHVzX2NoYW5nZWQgPSAxOwotCQorCiAJLyoKIAkgKiBEZXZpY2UgSW5zZXJ0aW9uL1JlbW92YWwKIAkgKi8KIAlpZiAoKGRldmljZS0+c3RhdHVzLnByZXNlbnQpICYmICEob2xkX3N0YXR1cy5wcmVzZW50KSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgaW5zZXJ0aW9uIGRldGVjdGVkXG4iKSk7CiAJCS8qIFRCRDogSGFuZGxlIGRldmljZSBpbnNlcnRpb24gKi8KLQl9Ci0JZWxzZSBpZiAoIShkZXZpY2UtPnN0YXR1cy5wcmVzZW50KSAmJiAob2xkX3N0YXR1cy5wcmVzZW50KSkgeworCX0gZWxzZSBpZiAoIShkZXZpY2UtPnN0YXR1cy5wcmVzZW50KSAmJiAob2xkX3N0YXR1cy5wcmVzZW50KSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgcmVtb3ZhbCBkZXRlY3RlZFxuIikpOwogCQkvKiBUQkQ6IEhhbmRsZSBkZXZpY2UgcmVtb3ZhbCAqLwogCX0KQEAgLTQzOCwxMyArNDIyLDEwIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYnVzX2NoZWNrX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9idXNfY2hlY2tfc2NvcGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlpbnQJCQlzdGF0dXNfY2hhbmdlZCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHN0YXR1c19jaGFuZ2VkID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2NoZWNrX3Njb3BlIik7CiAKQEAgLTQ2NywyMCArNDQ4LDE1IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qKgogICogYWNwaV9idXNfbm90aWZ5CiAgKiAtLS0tLS0tLS0tLS0tLS0KICAqIENhbGxiYWNrIGZvciBhbGwgJ3N5c3RlbS1sZXZlbCcgZGV2aWNlIG5vdGlmaWNhdGlvbnMgKHZhbHVlcyAweDAwLTB4N0YpLgogICovCi1zdGF0aWMgdm9pZCAKLWFjcGlfYnVzX25vdGlmeSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX2J1c19ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqZGF0YSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19ub3RpZnkiKTsKIApAQCAtNDkwLDY0ICs0NjYsNzMgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAogCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCBCVVMgQ0hFQ0sgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwgCi0JCQlkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlJlY2VpdmVkIEJVUyBDSEVDSyBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCXJlc3VsdCA9IGFjcGlfYnVzX2NoZWNrX3Njb3BlKGRldmljZSk7CiAJCS8qIAogCQkgKiBUQkQ6IFdlJ2xsIG5lZWQgdG8gb3V0c291cmNlIGNlcnRhaW4gZXZlbnRzIHRvIG5vbi1BQ1BJCi0JCSAqCWRyaXZlcnMgdmlhIHRoZSBkZXZpY2UgbWFuYWdlciAoZGV2aWNlLmMpLgorCQkgKiAgICAgIGRyaXZlcnMgdmlhIHRoZSBkZXZpY2UgbWFuYWdlciAoZGV2aWNlLmMpLgogCQkgKi8KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVjZWl2ZWQgREVWSUNFIENIRUNLIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBERVZJQ0UgQ0hFQ0sgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwKKwkJCQkgIGRldmljZS0+cG5wLmJ1c19pZCkpOwogCQlyZXN1bHQgPSBhY3BpX2J1c19jaGVja19kZXZpY2UoZGV2aWNlLCBOVUxMKTsKIAkJLyogCiAJCSAqIFRCRDogV2UnbGwgbmVlZCB0byBvdXRzb3VyY2UgY2VydGFpbiBldmVudHMgdG8gbm9uLUFDUEkKLQkJICoJZHJpdmVycyB2aWEgdGhlIGRldmljZSBtYW5hZ2VyIChkZXZpY2UuYykuCisJCSAqICAgICAgZHJpdmVycyB2aWEgdGhlIGRldmljZSBtYW5hZ2VyIChkZXZpY2UuYykuCiAJCSAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX1dBS0U6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlY2VpdmVkIERFVklDRSBXQUtFIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBERVZJQ0UgV0FLRSBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCS8qIFRCRCAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVjZWl2ZWQgRUpFQ1QgUkVRVUVTVCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLCAKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVjZWl2ZWQgRUpFQ1QgUkVRVUVTVCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCS8qIFRCRCAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLX0xJR0hUOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCBERVZJQ0UgQ0hFQ0sgTElHSFQgbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwgCi0JCQlkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlJlY2VpdmVkIERFVklDRSBDSEVDSyBMSUdIVCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCS8qIFRCRDogRXhhY3RseSB3aGF0IGRvZXMgJ2xpZ2h0JyBtZWFuPyAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfRlJFUVVFTkNZX01JU01BVENIOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWNlaXZlZCBGUkVRVUVOQ1kgTUlTTUFUQ0ggbm90aWZpY2F0aW9uIGZvciBkZXZpY2UgWyVzXVxuIiwgCi0JCQlkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlJlY2VpdmVkIEZSRVFVRU5DWSBNSVNNQVRDSCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCS8qIFRCRCAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfQlVTX01PREVfTUlTTUFUQ0g6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlY2VpdmVkIEJVUyBNT0RFIE1JU01BVENIIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBCVVMgTU9ERSBNSVNNQVRDSCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCS8qIFRCRCAqLwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9OT1RJRllfUE9XRVJfRkFVTFQ6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlY2VpdmVkIFBPV0VSIEZBVUxUIG5vdGlmaWNhdGlvbiBmb3IgZGV2aWNlIFslc11cbiIsIAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCBQT1dFUiBGQVVMVCBub3RpZmljYXRpb24gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCS8qIFRCRCAqLwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlY2VpdmVkIHVua25vd24vdW5zdXBwb3J0ZWQgbm90aWZpY2F0aW9uIFslMDh4XVxuIiwgCi0JCQl0eXBlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJSZWNlaXZlZCB1bmtub3duL3Vuc3VwcG9ydGVkIG5vdGlmaWNhdGlvbiBbJTA4eF1cbiIsCisJCQkJICB0eXBlKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNTU4LDEzICs1NDMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24vQ2xlYW51cAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfYnVzX2luaXRfaXJxICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9idXNfaW5pdF9pcnEodm9pZCkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vYmplY3QJYXJnID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdfbGlzdCA9IHsxLCAmYXJnfTsKLQljaGFyCQkJKm1lc3NhZ2UgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZyA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmFyZyB9OworCWNoYXIgKm1lc3NhZ2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfaW5pdF9pcnEiKTsKIApAQCAtNjAxLDEyICs1ODUsMTAgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotdm9pZCBfX2luaXQKLWFjcGlfZWFybHlfaW5pdCAodm9pZCkKK3ZvaWQgX19pbml0IGFjcGlfZWFybHlfaW5pdCh2b2lkKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge3NpemVvZihhY3BpX2ZhZHQpLCAmYWNwaV9mYWR0fTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YoYWNwaV9mYWR0KSwgJmFjcGlfZmFkdCB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lYXJseV9pbml0Iik7CiAKQEAgLTYxOSwxMyArNjAxLDE1IEBACiAKIAlzdGF0dXMgPSBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBBQ1BJIEludGVycHJldGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBBQ1BJIEludGVycHJldGVyXG4iKTsKIAkJZ290byBlcnJvcjA7CiAJfQogCiAJc3RhdHVzID0gYWNwaV9sb2FkX3RhYmxlcygpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gbG9hZCB0aGUgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJVbmFibGUgdG8gbG9hZCB0aGUgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlc1xuIik7CiAJCWdvdG8gZXJyb3IwOwogCX0KIApAQCAtNjM3LDcgKzYyMSw2IEBACiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVuYWJsZSB0byBnZXQgdGhlIEZBRFRcbiIpOwogCQlnb3RvIGVycm9yMDsKIAl9Ci0KICNpZmRlZiBDT05GSUdfWDg2CiAJaWYgKCFhY3BpX2lvYXBpYykgewogCQlleHRlcm4gYWNwaV9pbnRlcnJ1cHRfZmxhZ3MgYWNwaV9zY2lfZmxhZ3M7CkBAIC02NDcsNyArNjMwLDggQEAKIAkJCWFjcGlfc2NpX2ZsYWdzLnRyaWdnZXIgPSAzOwogCiAJCS8qIFNldCBQSUMtbW9kZSBTQ0kgdHJpZ2dlciB0eXBlICovCi0JCWFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcihhY3BpX2ZhZHQuc2NpX2ludCwgYWNwaV9zY2lfZmxhZ3MudHJpZ2dlcik7CisJCWFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcihhY3BpX2ZhZHQuc2NpX2ludCwKKwkJCQkJIGFjcGlfc2NpX2ZsYWdzLnRyaWdnZXIpOwogCX0gZWxzZSB7CiAJCWV4dGVybiBpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpOwogCQkvKgpAQCAtNjU4LDcgKzY0MiwxMCBAQAogCX0KICNlbmRpZgogCi0Jc3RhdHVzID0gYWNwaV9lbmFibGVfc3Vic3lzdGVtKH4oQUNQSV9OT19IQVJEV0FSRV9JTklUIHwgQUNQSV9OT19BQ1BJX0VOQUJMRSkpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh+CisJCQkJICAoQUNQSV9OT19IQVJEV0FSRV9JTklUIHwKKwkJCQkgICBBQ1BJX05PX0FDUElfRU5BQkxFKSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVuYWJsZSB0byBlbmFibGUgQUNQSVxuIik7CiAJCWdvdG8gZXJyb3IwOwpAQCAtNjY2LDMwICs2NTMsMzIgQEAKIAogCXJldHVybl9WT0lEOwogCi1lcnJvcjA6CisgICAgICBlcnJvcjA6CiAJZGlzYWJsZV9hY3BpKCk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2J1c19pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9idXNfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCWV4dGVybiBhY3BpX3N0YXR1cwlhY3BpX29zX2luaXRpYWxpemUxKHZvaWQpOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWV4dGVybiBhY3BpX3N0YXR1cyBhY3BpX29zX2luaXRpYWxpemUxKHZvaWQpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfaW5pdCIpOwogCiAJc3RhdHVzID0gYWNwaV9vc19pbml0aWFsaXplMSgpOwogCi0Jc3RhdHVzID0gYWNwaV9lbmFibGVfc3Vic3lzdGVtKEFDUElfTk9fSEFSRFdBUkVfSU5JVCB8IEFDUElfTk9fQUNQSV9FTkFCTEUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZW5hYmxlX3N1YnN5c3RlbShBQ1BJX05PX0hBUkRXQVJFX0lOSVQgfCBBQ1BJX05PX0FDUElfRU5BQkxFKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIHN0YXJ0IHRoZSBBQ1BJIEludGVycHJldGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIlVuYWJsZSB0byBzdGFydCB0aGUgQUNQSSBJbnRlcnByZXRlclxuIik7CiAJCWdvdG8gZXJyb3IxOwogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBBQ1BJIE9TIG9iamVjdHNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCSAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgQUNQSSBPUyBvYmplY3RzXG4iKTsKIAkJZ290byBlcnJvcjE7CiAJfQogI2lmZGVmIENPTkZJR19BQ1BJX0VDCkBAIC03MjMsOSArNzEyLDEyIEBACiAJLyoKIAkgKiBSZWdpc3RlciB0aGUgZm9yIGFsbCBzdGFuZGFyZCBkZXZpY2Ugbm90aWZpY2F0aW9ucy4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwgQUNQSV9TWVNURU1fTk9USUZZLCAmYWNwaV9idXNfbm90aWZ5LCBOVUxMKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkmYWNwaV9idXNfbm90aWZ5LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGZvciBkZXZpY2Ugbm90aWZpY2F0aW9uc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJVbmFibGUgdG8gcmVnaXN0ZXIgZm9yIGRldmljZSBub3RpZmljYXRpb25zXG4iKTsKIAkJZ290byBlcnJvcjE7CiAJfQogCkBAIC03MzcsMjEgKzcyOSwyMCBAQAogCXJldHVybl9WQUxVRSgwKTsKIAogCS8qIE1pbWljIHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nICovCi1lcnJvcjE6CisgICAgICBlcnJvcjE6CiAJYWNwaV90ZXJtaW5hdGUoKTsKIAlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiB9CiAKLWRlY2xfc3Vic3lzKGFjcGksTlVMTCxOVUxMKTsKK2RlY2xfc3Vic3lzKGFjcGksIE5VTEwsIE5VTEwpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbml0Iik7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiU3Vic3lzdGVtIHJldmlzaW9uICUwOHhcbiIsCi0JCUFDUElfQ0FfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlN1YnN5c3RlbSByZXZpc2lvbiAlMDh4XG4iLCBBQ1BJX0NBX1ZFUlNJT04pOwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkludGVycHJldGVyIGRpc2FibGVkLlxuIik7CkBAIC03NjcsNyArNzU4LDggQEAKIAkJaWYgKCFQTV9JU19BQ1RJVkUoKSkKIAkJCXBtX2FjdGl2ZSA9IDE7CiAJCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkFQTSBpcyBhbHJlYWR5IGFjdGl2ZSwgZXhpdGluZ1xuIik7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJBUE0gaXMgYWxyZWFkeSBhY3RpdmUsIGV4aXRpbmdcbiIpOwogCQkJZGlzYWJsZV9hY3BpKCk7CiAJCQlyZXN1bHQgPSAtRU5PREVWOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKaW5kZXggODE2MmZkMC4uNGI2ZDlmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgQUNQSV9CVVRUT05fQ09NUE9ORU5UCQkweDAwMDgwMDAwCiAjZGVmaW5lIEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FCQkiQUNQSSBCdXR0b24gRHJpdmVyIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9DTEFTUwkJImJ1dHRvbiIKQEAgLTQyLDcgKzQxLDcgQEAKICNkZWZpbmUgQUNQSV9CVVRUT05fTk9USUZZX1NUQVRVUwkweDgwCiAKICNkZWZpbmUgQUNQSV9CVVRUT05fU1VCQ0xBU1NfUE9XRVIJInBvd2VyIgotI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfUE9XRVIJCSJQTlAwQzBDIgkKKyNkZWZpbmUgQUNQSV9CVVRUT05fSElEX1BPV0VSCQkiUE5QMEMwQyIKICNkZWZpbmUgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfUE9XRVIJIlBvd2VyIEJ1dHRvbiAoQ00pIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9QT1dFUkYJIlBvd2VyIEJ1dHRvbiAoRkYpIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSCQkweDAxCkBAIC02MSw2NSArNjAsNjUgQEAKICNkZWZpbmUgQUNQSV9CVVRUT05fVFlQRV9MSUQJCTB4MDUKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVVFRPTl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9idXR0b24iKQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9idXR0b24iKQogCi1NT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CisgICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2J1dHRvbl9yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX2J1dHRvbl9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBhY3BpX2J1dHRvbl9zdGF0ZV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2J1dHRvbl9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9CVVRUT05fRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9CVVRUT05fQ0xBU1MsCi0JLmlkcyA9CQkiQUNQSV9GUEIsQUNQSV9GU0IsUE5QMEMwRCxQTlAwQzBDLFBOUDBDMEUiLAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9idXR0b25fYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX2J1dHRvbl9yZW1vdmUsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9CVVRUT05fRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9CVVRUT05fQ0xBU1MsCisJLmlkcyA9ICJBQ1BJX0ZQQixBQ1BJX0ZTQixQTlAwQzBELFBOUDBDMEMsUE5QMEMwRSIsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfYnV0dG9uX2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfYnV0dG9uX3JlbW92ZSwKKwkJfSwKIH07CiAKIHN0cnVjdCBhY3BpX2J1dHRvbiB7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZTsJLyogRml4ZWQgYnV0dG9uIGtsdWRnZSAqLwotCXU4CQkJdHlwZTsKLQl1bnNpZ25lZCBsb25nCQlwdXNoZWQ7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwkvKiBGaXhlZCBidXR0b24ga2x1ZGdlICovCisJdTggdHlwZTsKKwl1bnNpZ25lZCBsb25nIHB1c2hlZDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYnV0dG9uX2luZm9fZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2J1dHRvbl9pbmZvX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfYnV0dG9uX2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfYnV0dG9uX3N0YXRlX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9idXR0b25fZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9idXR0b25fZGlyOwogCiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2luZm9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IChzdHJ1Y3QgYWNwaV9idXR0b24gKikgc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2luZm9fc2VxX3Nob3ciKTsKIAogCWlmICghYnV0dG9uIHx8ICFidXR0b24tPmRldmljZSkKIAkJcmV0dXJuX1ZBTFVFKDApOwogCi0Jc2VxX3ByaW50ZihzZXEsICJ0eXBlOiAgICAgICAgICAgICAgICAgICAgJXNcbiIsIAotCQlhY3BpX2RldmljZV9uYW1lKGJ1dHRvbi0+ZGV2aWNlKSk7CisJc2VxX3ByaW50ZihzZXEsICJ0eXBlOiAgICAgICAgICAgICAgICAgICAgJXNcbiIsCisJCSAgIGFjcGlfZGV2aWNlX25hbWUoYnV0dG9uLT5kZXZpY2UpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KQEAgLTEyOCwyNCArMTI3LDI0IEBACiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfYnV0dG9uX2luZm9fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQotCQorCiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3N0YXRlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSAoc3RydWN0IGFjcGlfYnV0dG9uICopIHNlcS0+cHJpdmF0ZTsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJCXN0YXRlOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKXNlcS0+cHJpdmF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX3N0YXRlX3NlcV9zaG93Iik7CiAKIAlpZiAoIWJ1dHRvbiB8fCAhYnV0dG9uLT5kZXZpY2UpCiAJCXJldHVybl9WQUxVRSgwKTsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihidXR0b24tPmhhbmRsZSwiX0xJRCIsTlVMTCwmc3RhdGUpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihidXR0b24tPmhhbmRsZSwgIl9MSUQiLCBOVUxMLCAmc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgIHVuc3VwcG9ydGVkXG4iKTsKLQl9Ci0JZWxzZXsKLQkJc2VxX3ByaW50ZihzZXEsICJzdGF0ZTogICAgICAlc1xuIiwgKHN0YXRlID8gIm9wZW4iIDogImNsb3NlZCIpKTsgCisJfSBlbHNlIHsKKwkJc2VxX3ByaW50ZihzZXEsICJzdGF0ZTogICAgICAlc1xuIiwKKwkJCSAgIChzdGF0ZSA/ICJvcGVuIiA6ICJjbG9zZWQiKSk7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwpAQCAtMTYwLDEyICsxNTksMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfc2xlZXBfZGlyOwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9saWRfZGlyOwogCi1zdGF0aWMgaW50Ci1hY3BpX2J1dHRvbl9hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1dHRvbl9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2FkZF9mcyIpOwogCkBAIC0xNzgsMjEgKzE3NSwyMSBAQAogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUjoKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgogCQlpZiAoIWFjcGlfcG93ZXJfZGlyKQotCQkJYWNwaV9wb3dlcl9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSLCAKLQkJCQlhY3BpX2J1dHRvbl9kaXIpOworCQkJYWNwaV9wb3dlcl9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSLAorCQkJCQkJICAgIGFjcGlfYnV0dG9uX2Rpcik7CiAJCWVudHJ5ID0gYWNwaV9wb3dlcl9kaXI7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUDoKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgogCQlpZiAoIWFjcGlfc2xlZXBfZGlyKQotCQkJYWNwaV9zbGVlcF9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX1NMRUVQLCAKLQkJCQlhY3BpX2J1dHRvbl9kaXIpOworCQkJYWNwaV9zbGVlcF9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX1NMRUVQLAorCQkJCQkJICAgIGFjcGlfYnV0dG9uX2Rpcik7CiAJCWVudHJ5ID0gYWNwaV9zbGVlcF9kaXI7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9MSUQ6CiAJCWlmICghYWNwaV9saWRfZGlyKQotCQkJYWNwaV9saWRfZGlyID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19MSUQsIAotCQkJCWFjcGlfYnV0dG9uX2Rpcik7CisJCQlhY3BpX2xpZF9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX1NVQkNMQVNTX0xJRCwKKwkJCQkJCSAgYWNwaV9idXR0b25fZGlyKTsKIAkJZW50cnkgPSBhY3BpX2xpZF9kaXI7CiAJCWJyZWFrOwogCX0KQEAgLTIwOCwxMSArMjA1LDExIEBACiAKIAkvKiAnaW5mbycgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX0lORk8sCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYnV0dG9uX2luZm9fZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0yMjIsMTEgKzIxOSwxMSBAQAogCS8qIHNob3cgbGlkIHN0YXRlIFtSXSAqLwogCWlmIChidXR0b24tPnR5cGUgPT0gQUNQSV9CVVRUT05fVFlQRV9MSUQpIHsKIAkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX1NUQVRFLAotCQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJaWYgKCFlbnRyeSkKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCQlBQ1BJX0JVVFRPTl9GSUxFX0lORk8pKTsKKwkJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCQkgIEFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOwogCQllbHNlIHsKIAkJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9idXR0b25fc3RhdGVfZm9wczsKIAkJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMjM3LDEyICsyMzQsOSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2J1dHRvbl9yZW1vdmVfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2J1dHRvbl9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX3JlbW92ZV9mcyIpOwogCkBAIC0yNTAsMzAgKzI0NCwyNSBAQAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlpZiAoYnV0dG9uLT50eXBlID09IEFDUElfQlVUVE9OX1RZUEVfTElEKQogCQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fRklMRV9TVEFURSwKLQkJCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX0lORk8sCi0JCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAKIAkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKS0+cGFyZW50KTsKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpLT5wYXJlbnQpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX2J1dHRvbl9ub3RpZnkgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JdTMyCQkJZXZlbnQsCi0Jdm9pZAkJCSpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9idXR0b25fbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKSBkYXRhOworCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKWRhdGE7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9ub3RpZnkiKTsKIApAQCAtMjgyLDI0ICsyNzEsMjIgQEAKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEFDUElfQlVUVE9OX05PVElGWV9TVEFUVVM6Ci0JCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGJ1dHRvbi0+ZGV2aWNlLCBldmVudCwgKytidXR0b24tPnB1c2hlZCk7CisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGJ1dHRvbi0+ZGV2aWNlLCBldmVudCwKKwkJCQkJKytidXR0b24tPnB1c2hlZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CisJCQkJICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCAoCi0Jdm9pZAkJCSpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCh2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKSBkYXRhOwotCQorCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKWRhdGE7CisKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQiKTsKIAogCWlmICghYnV0dG9uKQpAQCAtMzEwLDE0ICsyOTcsMTEgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfYnV0dG9uX2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfYnV0dG9uICpidXR0b24gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fYWRkIik7CiAKQEAgLTMzOSw0MiArMzIzLDM0IEBACiAJICovCiAJaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9QT1dFUikpIHsKIAkJYnV0dG9uLT50eXBlID0gQUNQSV9CVVRUT05fVFlQRV9QT1dFUjsKLQkJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwKLQkJCUFDUElfQlVUVE9OX0RFVklDRV9OQU1FX1BPV0VSKTsKLQkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLCAKKwkJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfUE9XRVIpOworCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsCiAJCQlBQ1BJX0JVVFRPTl9DTEFTUywgQUNQSV9CVVRUT05fU1VCQ0xBU1NfUE9XRVIpOwotCX0KLQllbHNlIGlmICghc3RyY21wKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ISURfUE9XRVJGKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX1BPV0VSRikpIHsKIAkJYnV0dG9uLT50eXBlID0gQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY7CiAJCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksCi0JCQlBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9QT1dFUkYpOwotCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsIAorCQkgICAgICAgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfUE9XRVJGKTsKKwkJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMvJXMiLAogCQkJQUNQSV9CVVRUT05fQ0xBU1MsIEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX1NMRUVQKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX1NMRUVQKSkgewogCQlidXR0b24tPnR5cGUgPSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQOwotCQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAotCQkJQUNQSV9CVVRUT05fREVWSUNFX05BTUVfU0xFRVApOwotCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsIAorCQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9TTEVFUCk7CisJCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgIiVzLyVzIiwKIAkJCUFDUElfQlVUVE9OX0NMQVNTLCBBQ1BJX0JVVFRPTl9TVUJDTEFTU19TTEVFUCk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9TTEVFUEYpKSB7CisJfSBlbHNlIGlmICghc3RyY21wKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGKSkgewogCQlidXR0b24tPnR5cGUgPSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQRjsKIAkJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwKLQkJCUFDUElfQlVUVE9OX0RFVklDRV9OQU1FX1NMRUVQRik7Ci0JCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgIiVzLyVzIiwgCisJCSAgICAgICBBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9TTEVFUEYpOworCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsCiAJCQlBQ1BJX0JVVFRPTl9DTEFTUywgQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVApOwotCX0KLQllbHNlIGlmICghc3RyY21wKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ISURfTElEKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX0xJRCkpIHsKIAkJYnV0dG9uLT50eXBlID0gQUNQSV9CVVRUT05fVFlQRV9MSUQ7Ci0JCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksCi0JCQlBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9MSUQpOwotCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsIAorCQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9MSUQpOworCQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICIlcy8lcyIsCiAJCQlBQ1BJX0JVVFRPTl9DTEFTUywgQUNQSV9CVVRUT05fU1VCQ0xBU1NfTElEKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlVuc3VwcG9ydGVkIGhpZCBbJXNdXG4iLAotCQkJYWNwaV9kZXZpY2VfaGlkKGRldmljZSkpKTsKKwkJCQkgIGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTM4NSw0NiArMzYxLDQ2IEBACiAKIAlzd2l0Y2ggKGJ1dHRvbi0+dHlwZSkgewogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6Ci0JCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyICgKLQkJCUFDUElfRVZFTlRfUE9XRVJfQlVUVE9OLAotCQkJYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkLAotCQkJYnV0dG9uKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUE9XRVJfQlVUVE9OLAorCQkJCQkJICAgICBhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQsCisJCQkJCQkgICAgIGJ1dHRvbik7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyICgKLQkJCUFDUElfRVZFTlRfU0xFRVBfQlVUVE9OLAotCQkJYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkLAotCQkJYnV0dG9uKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OLAorCQkJCQkJICAgICBhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQsCisJCQkJCQkgICAgIGJ1dHRvbik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlciAoCi0JCQlidXR0b24tPmhhbmRsZSwKLQkJCUFDUElfREVWSUNFX05PVElGWSwKLQkJCWFjcGlfYnV0dG9uX25vdGlmeSwKLQkJCWJ1dHRvbik7CisJCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihidXR0b24tPmhhbmRsZSwKKwkJCQkJCSAgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkJICAgICBhY3BpX2J1dHRvbl9ub3RpZnksCisJCQkJCQkgICAgIGJ1dHRvbik7CiAJCWJyZWFrOwogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkgICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KIAogCWlmIChkZXZpY2UtPndha2V1cC5mbGFncy52YWxpZCkgewogCQkvKiBCdXR0b24ncyBHUEUgaXMgcnVuLXdha2UgR1BFICovCi0JCWFjcGlfc2V0X2dwZV90eXBlKGRldmljZS0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJZGV2aWNlLT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTik7Ci0JCWFjcGlfZW5hYmxlX2dwZShkZXZpY2UtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCWRldmljZS0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CisJCWFjcGlfc2V0X2dwZV90eXBlKGRldmljZS0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJICBkZXZpY2UtPndha2V1cC5ncGVfbnVtYmVyLAorCQkJCSAgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTik7CisJCWFjcGlfZW5hYmxlX2dwZShkZXZpY2UtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCWRldmljZS0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CiAJCWRldmljZS0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPSAxOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdXG4iLCAKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc11cbiIsCisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlhY3BpX2J1dHRvbl9yZW1vdmVfZnMoZGV2aWNlKTsKIAkJa2ZyZWUoYnV0dG9uKTsKQEAgLTQzMywxMiArNDA5LDEwIEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9idXR0b25fcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCitzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJc3RydWN0IGFjcGlfYnV0dG9uICpidXR0b24gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fcmVtb3ZlIik7CiAKQEAgLTQ1MCwzNSArNDI0LDM2IEBACiAJLyogVW5yZWdpc3RlciBmb3IgZGV2aWNlIG5vdGlmaWNhdGlvbnMuICovCiAJc3dpdGNoIChidXR0b24tPnR5cGUpIHsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgotCQlzdGF0dXMgPSBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKAotCQkJQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04sIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUE9XRVJfQlVUVE9OLAorCQkJCQkJICAgIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIoCi0JCQlBQ1BJX0VWRU5UX1NMRUVQX0JVVFRPTiwgYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04sCisJCQkJCQkgICAgYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoYnV0dG9uLT5oYW5kbGUsCi0JCQlBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfYnV0dG9uX25vdGlmeSk7CisJCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkJICAgIGFjcGlfYnV0dG9uX25vdGlmeSk7CiAJCWJyZWFrOwogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKLQlhY3BpX2J1dHRvbl9yZW1vdmVfZnMoZGV2aWNlKTsJCisJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CiAKIAlrZnJlZShidXR0b24pOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2J1dHRvbl9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9idXR0b25faW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9pbml0Iik7CiAKQEAgLTQ5NSwxNSArNDcwLDEzIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9idXR0b25fZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2J1dHRvbl9leGl0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fZXhpdCIpOwogCiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfYnV0dG9uX2RyaXZlcik7CiAKLQlpZiAoYWNwaV9wb3dlcl9kaXIpIAorCWlmIChhY3BpX3Bvd2VyX2RpcikKIAkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fU1VCQ0xBU1NfUE9XRVIsIGFjcGlfYnV0dG9uX2Rpcik7CiAJaWYgKGFjcGlfc2xlZXBfZGlyKQogCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9TVUJDTEFTU19TTEVFUCwgYWNwaV9idXR0b25fZGlyKTsKQEAgLTUxNCw2ICs0ODcsNSBAQAogCXJldHVybl9WT0lEOwogfQogCi0KIG1vZHVsZV9pbml0KGFjcGlfYnV0dG9uX2luaXQpOwogbW9kdWxlX2V4aXQoYWNwaV9idXR0b25fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKaW5kZXggOTcwMTNkZC4uMTBkZDY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCisrKyBiL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYwpAQCAtNDQsOSArNDQsOSBAQAogCiAjZGVmaW5lIEFDUElfQ09OVEFJTkVSX0NPTVBPTkVOVAkweDAxMDAwMDAwCiAjZGVmaW5lIF9DT01QT05FTlQJCQlBQ1BJX0NPTlRBSU5FUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCQkoImFjcGlfY29udGFpbmVyIikKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfY29udGFpbmVyIikKIAotTU9EVUxFX0FVVEhPUigiQW5pbCBTIEtlc2hhdmFtdXJ0aHkiKTsKKyAgICBNT0RVTEVfQVVUSE9SKCJBbmlsIFMgS2VzaGF2YW11cnRoeSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfQ09OVEFJTkVSX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApAQCAtNTYsNDEgKzU2LDM4IEBACiBzdGF0aWMgaW50IGFjcGlfY29udGFpbmVyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfY29udGFpbmVyX2RyaXZlciA9IHsKLQkubmFtZSA9CQlBQ1BJX0NPTlRBSU5FUl9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX0NPTlRBSU5FUl9DTEFTUywKLQkuaWRzID0JCSJBQ1BJMDAwNCxQTlAwQTA1LFBOUDBBMDYiLAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9jb250YWluZXJfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX2NvbnRhaW5lcl9yZW1vdmUsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9DT05UQUlORVJfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9DT05UQUlORVJfQ0xBU1MsCisJLmlkcyA9ICJBQ1BJMDAwNCxQTlAwQTA1LFBOUDBBMDYiLAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2NvbnRhaW5lcl9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX2NvbnRhaW5lcl9yZW1vdmUsCisJCX0sCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50Ci1pc19kZXZpY2VfcHJlc2VudChhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgaW50IGlzX2RldmljZV9wcmVzZW50KGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlhY3BpX2hhbmRsZQkJdGVtcDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJc3RhOworCWFjcGlfaGFuZGxlIHRlbXA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgc3RhOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXNfZGV2aWNlX3ByZXNlbnQiKTsKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfU1RBIiwgJnRlbXApOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuX1ZBTFVFKDEpOyAvKiBfU1RBIG5vdCBmb3VuZCwgYXNzbXVlIGRldmljZSBwcmVzZW50ICovCisJCXJldHVybl9WQUxVRSgxKTsJLyogX1NUQSBub3QgZm91bmQsIGFzc211ZSBkZXZpY2UgcHJlc2VudCAqLwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9TVEEiLCBOVUxMLCAmc3RhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybl9WQUxVRSgwKTsgLyogRmlybXdhcmUgZXJyb3IgKi8KKwkJcmV0dXJuX1ZBTFVFKDApOwkvKiBGaXJtd2FyZSBlcnJvciAqLwogCiAJcmV0dXJuX1ZBTFVFKChzdGEgJiBBQ1BJX1NUQV9QUkVTRU5UKSA9PSBBQ1BJX1NUQV9QUkVTRU5UKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1hY3BpX2NvbnRhaW5lcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfY29udGFpbmVyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWNwaV9jb250YWluZXIgKmNvbnRhaW5lcjsKIApAQCAtMTAyLDI4ICs5OSwyNiBAQAogCX0KIAogCWNvbnRhaW5lciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2NvbnRhaW5lciksIEdGUF9LRVJORUwpOwotCWlmKCFjb250YWluZXIpCisJaWYgKCFjb250YWluZXIpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKLQkKKwogCW1lbXNldChjb250YWluZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9jb250YWluZXIpKTsKIAljb250YWluZXItPmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwogCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEFDUElfQ09OVEFJTkVSX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9DT05UQUlORVJfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGNvbnRhaW5lcjsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSA8JXM+IGJpZCA8JXM+XG4iLAlcCi0JCWFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKLQorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSA8JXM+IGJpZCA8JXM+XG4iLAorCQkJICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfY29udGFpbmVyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCitzdGF0aWMgaW50IGFjcGlfY29udGFpbmVyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2NvbnRhaW5lcgkqcGMgPSBOVUxMOwotCXBjID0gKHN0cnVjdCBhY3BpX2NvbnRhaW5lciopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9jb250YWluZXIgKnBjID0gTlVMTDsKKwlwYyA9IChzdHJ1Y3QgYWNwaV9jb250YWluZXIgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlpZiAocGMpCiAJCWtmcmVlKHBjKTsKQEAgLTEzMSw5ICsxMjYsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLQotc3RhdGljIGludAotY29udGFpbmVyX2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICoqZGV2aWNlLCBhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgaW50IGNvbnRhaW5lcl9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqKmRldmljZSwgYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCWFjcGlfaGFuZGxlIHBoYW5kbGU7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpwZGV2OwpAQCAtMTU4LDEwICsxNTEsOSBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgdm9pZAotY29udGFpbmVyX25vdGlmeV9jYihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgY29udGFpbmVyX25vdGlmeV9jYihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX2RldmljZQkJKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCWludCByZXN1bHQ7CiAJaW50IHByZXNlbnQ7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpAQCAtMTY5LDE0ICsxNjEsMTQgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJjb250YWluZXJfbm90aWZ5X2NiIik7CiAKIAlwcmVzZW50ID0gaXNfZGV2aWNlX3ByZXNlbnQoaGFuZGxlKTsKLQkKKwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgogCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKIAkJcHJpbnRrKCJDb250YWluZXIgZHJpdmVyIHJlY2VpdmVkICVzIGV2ZW50XG4iLAotCQkJKHR5cGUgPT0gQUNQSV9OT1RJRllfQlVTX0NIRUNLKT8KLQkJCSJBQ1BJX05PVElGWV9CVVNfQ0hFQ0siOiJBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0siKTsKKwkJICAgICAgICh0eXBlID09IEFDUElfTk9USUZZX0JVU19DSEVDSykgPworCQkgICAgICAgIkFDUElfTk9USUZZX0JVU19DSEVDSyIgOiAiQUNQSV9OT1RJRllfREVWSUNFX0NIRUNLIik7CiAJCXN0YXR1cyA9IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKTsKIAkJaWYgKHByZXNlbnQpIHsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZGV2aWNlKSB7CkBAIC0yMDcsMTUgKzE5OSwxMyBAQAogCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYihhY3BpX2hhbmRsZSBoYW5kbGUsCi0JdTMyIGx2bCwKLQl2b2lkICpjb250ZXh0LAotCXZvaWQgKipydikKKwkJCSAgICB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCiB7Ci0JY2hhciAJCQkJKmhpZCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIAkJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAJKmluZm87Ci0JYWNwaV9zdGF0dXMgCQkJc3RhdHVzOwotCWludCAJCQkJKmFjdGlvbiA9IGNvbnRleHQ7CisJY2hhciAqaGlkID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgKmFjdGlvbiA9IGNvbnRleHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJjb250YWluZXJfd2Fsa19uYW1lc3BhY2VfY2IiKTsKIApAQCAtMjMzLDY2ICsyMjMsNjAgQEAKIAl9CiAKIAlpZiAoc3RyY21wKGhpZCwgIkFDUEkwMDA0IikgJiYgc3RyY21wKGhpZCwgIlBOUDBBMDUiKSAmJgotCQkJc3RyY21wKGhpZCwgIlBOUDBBMDYiKSkgeworCSAgICBzdHJjbXAoaGlkLCAiUE5QMEEwNiIpKSB7CiAJCWdvdG8gZW5kOwogCX0KIAotCXN3aXRjaCgqYWN0aW9uKSB7CisJc3dpdGNoICgqYWN0aW9uKSB7CiAJY2FzZSBJTlNUQUxMX05PVElGWV9IQU5ETEVSOgogCQlhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLAotCQkJQUNQSV9TWVNURU1fTk9USUZZLAotCQkJY29udGFpbmVyX25vdGlmeV9jYiwKLQkJCU5VTEwpOworCQkJCQkgICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkgICAgY29udGFpbmVyX25vdGlmeV9jYiwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgVU5JTlNUQUxMX05PVElGWV9IQU5ETEVSOgogCQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihoYW5kbGUsCi0JCQlBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQljb250YWluZXJfbm90aWZ5X2NiKTsKKwkJCQkJICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkgICBjb250YWluZXJfbm90aWZ5X2NiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfY29udGFpbmVyX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfY29udGFpbmVyX2luaXQodm9pZCkKIHsKLQlpbnQJcmVzdWx0ID0gMDsKLQlpbnQJYWN0aW9uID0gSU5TVEFMTF9OT1RJRllfSEFORExFUjsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgYWN0aW9uID0gSU5TVEFMTF9OT1RJRllfSEFORExFUjsKIAogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9jb250YWluZXJfZHJpdmVyKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlyZXR1cm4ocmVzdWx0KTsKKwkJcmV0dXJuIChyZXN1bHQpOwogCX0KIAogCS8qIHJlZ2lzdGVyIG5vdGlmeSBoYW5kbGVyIHRvIGV2ZXJ5IGNvbnRhaW5lciBkZXZpY2UgKi8KIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsCi0JCQkJICAgICBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJCSAgICAgY29udGFpbmVyX3dhbGtfbmFtZXNwYWNlX2NiLAotCQkJCSAgICAgJmFjdGlvbiwgTlVMTCk7CisJCQkgICAgQUNQSV9ST09UX09CSkVDVCwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsCisJCQkgICAgY29udGFpbmVyX3dhbGtfbmFtZXNwYWNlX2NiLCAmYWN0aW9uLCBOVUxMKTsKIAotCXJldHVybigwKTsKKwlyZXR1cm4gKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfY29udGFpbmVyX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2NvbnRhaW5lcl9leGl0KHZvaWQpCiB7Ci0JaW50CQkJYWN0aW9uID0gVU5JTlNUQUxMX05PVElGWV9IQU5ETEVSOworCWludCBhY3Rpb24gPSBVTklOU1RBTExfTk9USUZZX0hBTkRMRVI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2NvbnRhaW5lcl9leGl0Iik7CiAKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsCi0JCQkJICAgICBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJCSAgICAgY29udGFpbmVyX3dhbGtfbmFtZXNwYWNlX2NiLAotCQkJCSAgICAgJmFjdGlvbiwgTlVMTCk7CisJCQkgICAgQUNQSV9ST09UX09CSkVDVCwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsCisJCQkgICAgY29udGFpbmVyX3dhbGtfbmFtZXNwYWNlX2NiLCAmYWN0aW9uLCBOVUxMKTsKIAogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NvbnRhaW5lcl9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGVidWcuYyBiL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCmluZGV4IDJjMGRhYzUuLjI2MzMyMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCkBAIC0xMiwxNyArMTIsMTQgQEAKICNpbmNsdWRlIDxhY3BpL2FjZ2xvYmFsLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImRlYnVnIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZGVidWciKQogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0RFQlVHX0xBWUVSCSJkZWJ1Z19sYXllciIKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9ERUJVR19MRVZFTAkiZGVidWdfbGV2ZWwiCi0KICNpZmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI2VuZGlmCi0KICNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWAotbW9kdWxlX3BhcmFtKGFjcGlfZGJnX2xheWVyLCB1aW50LCAwNDAwKTsKKyAgICBtb2R1bGVfcGFyYW0oYWNwaV9kYmdfbGF5ZXIsIHVpbnQsIDA0MDApOwogbW9kdWxlX3BhcmFtKGFjcGlfZGJnX2xldmVsLCB1aW50LCAwNDAwKTsKIAogc3RydWN0IGFjcGlfZGxheWVyIHsKQEAgLTM1LDggKzMyLDcgQEAKIH07CiAjZGVmaW5lIEFDUElfREVCVUdfSU5JVCh2KQl7IC5uYW1lID0gI3YsIC52YWx1ZSA9IHYgfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGxheWVyIGFjcGlfZGVidWdfbGF5ZXJzW10gPQoteworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RsYXllciBhY3BpX2RlYnVnX2xheWVyc1tdID0gewogCUFDUElfREVCVUdfSU5JVChBQ1BJX1VUSUxJVElFUyksCiAJQUNQSV9ERUJVR19JTklUKEFDUElfSEFSRFdBUkUpLAogCUFDUElfREVCVUdfSU5JVChBQ1BJX0VWRU5UUyksCkBAIC01Myw4ICs0OSw3IEBACiAJQUNQSV9ERUJVR19JTklUKEFDUElfVE9PTFMpLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RsZXZlbCBhY3BpX2RlYnVnX2xldmVsc1tdID0KLXsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kbGV2ZWwgYWNwaV9kZWJ1Z19sZXZlbHNbXSA9IHsKIAlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9MVl9FUlJPUiksCiAJQUNQSV9ERUJVR19JTklUKEFDUElfTFZfV0FSTiksCiAJQUNQSV9ERUJVR19JTklUKEFDUElfTFZfSU5JVCksCkBAIC04OCw4MSArODMsNzcgQEAKIAlBQ1BJX0RFQlVHX0lOSVQoQUNQSV9MVl9BTUxfRElTQVNTRU1CTEUpLAogCUFDUElfREVCVUdfSU5JVChBQ1BJX0xWX1ZFUkJPU0VfSU5GTyksCiAJQUNQSV9ERUJVR19JTklUKEFDUElfTFZfRlVMTF9UQUJMRVMpLAotCUFDUElfREVCVUdfSU5JVChBQ1BJX0xWX0VWRU5UUyksICAgICAgICAgICAgIAorCUFDUElfREVCVUdfSU5JVChBQ1BJX0xWX0VWRU5UUyksCiB9OwogCiBzdGF0aWMgaW50Ci1hY3BpX3N5c3RlbV9yZWFkX2RlYnVnICgKLQljaGFyCQkJKnBhZ2UsCi0JY2hhcgkJCSoqc3RhcnQsCi0Jb2ZmX3QJCQlvZmYsCi0JaW50IAkJCWNvdW50LAotCWludCAJCQkqZW9mLAotCXZvaWQJCQkqZGF0YSkKK2FjcGlfc3lzdGVtX3JlYWRfZGVidWcoY2hhciAqcGFnZSwKKwkJICAgICAgIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWNoYXIJCQkqcCA9IHBhZ2U7Ci0JaW50IAkJCXNpemUgPSAwOwotCXVuc2lnbmVkIGludAkJaTsKKwljaGFyICpwID0gcGFnZTsKKwlpbnQgc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAob2ZmICE9IDApCiAJCWdvdG8gZW5kOwogCiAJcCArPSBzcHJpbnRmKHAsICIlLTI1c1x0SGV4ICAgICAgICBTRVRcbiIsICJEZXNjcmlwdGlvbiIpOwogCi0Jc3dpdGNoICgodW5zaWduZWQgbG9uZykgZGF0YSkgeworCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpZGF0YSkgewogCWNhc2UgMDoKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNwaV9kZWJ1Z19sYXllcnMpOyBpKyspIHsKIAkJCXAgKz0gc3ByaW50ZihwLCAiJS0yNXNcdDB4JTA4bFggWyVjXVxuIiwKLQkJCQlhY3BpX2RlYnVnX2xheWVyc1tpXS5uYW1lLAotCQkJCWFjcGlfZGVidWdfbGF5ZXJzW2ldLnZhbHVlLAotCQkJCShhY3BpX2RiZ19sYXllciAmIGFjcGlfZGVidWdfbGF5ZXJzW2ldLnZhbHVlKSA/Ci0JCQkJJyonIDogJyAnKTsKKwkJCQkgICAgIGFjcGlfZGVidWdfbGF5ZXJzW2ldLm5hbWUsCisJCQkJICAgICBhY3BpX2RlYnVnX2xheWVyc1tpXS52YWx1ZSwKKwkJCQkgICAgIChhY3BpX2RiZ19sYXllciAmIGFjcGlfZGVidWdfbGF5ZXJzW2ldLgorCQkJCSAgICAgIHZhbHVlKSA/ICcqJyA6ICcgJyk7CiAJCX0KIAkJcCArPSBzcHJpbnRmKHAsICIlLTI1c1x0MHglMDhYIFslY11cbiIsICJBQ1BJX0FMTF9EUklWRVJTIiwKLQkJCUFDUElfQUxMX0RSSVZFUlMsCi0JCQkoYWNwaV9kYmdfbGF5ZXIgJiBBQ1BJX0FMTF9EUklWRVJTKSA9PSBBQ1BJX0FMTF9EUklWRVJTPwotCQkJJyonIDogKGFjcGlfZGJnX2xheWVyICYgQUNQSV9BTExfRFJJVkVSUykgPT0gMCA/Ci0JCQknICcgOiAnLScpOworCQkJICAgICBBQ1BJX0FMTF9EUklWRVJTLAorCQkJICAgICAoYWNwaV9kYmdfbGF5ZXIgJiBBQ1BJX0FMTF9EUklWRVJTKSA9PQorCQkJICAgICBBQ1BJX0FMTF9EUklWRVJTID8gJyonIDogKGFjcGlfZGJnX2xheWVyICYKKwkJCQkJCSAgICAgICBBQ1BJX0FMTF9EUklWRVJTKSA9PQorCQkJICAgICAwID8gJyAnIDogJy0nKTsKIAkJcCArPSBzcHJpbnRmKHAsCi0JCQkiLS1cbmRlYnVnX2xheWVyID0gMHglMDhYICgqID0gZW5hYmxlZCwgLSA9IHBhcnRpYWwpXG4iLAotCQkJYWNwaV9kYmdfbGF5ZXIpOworCQkJICAgICAiLS1cbmRlYnVnX2xheWVyID0gMHglMDhYICgqID0gZW5hYmxlZCwgLSA9IHBhcnRpYWwpXG4iLAorCQkJICAgICBhY3BpX2RiZ19sYXllcik7CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNwaV9kZWJ1Z19sZXZlbHMpOyBpKyspIHsKIAkJCXAgKz0gc3ByaW50ZihwLCAiJS0yNXNcdDB4JTA4bFggWyVjXVxuIiwKLQkJCQlhY3BpX2RlYnVnX2xldmVsc1tpXS5uYW1lLAotCQkJCWFjcGlfZGVidWdfbGV2ZWxzW2ldLnZhbHVlLAotCQkJCShhY3BpX2RiZ19sZXZlbCAmIGFjcGlfZGVidWdfbGV2ZWxzW2ldLnZhbHVlKSA/Ci0JCQkJJyonIDogJyAnKTsKKwkJCQkgICAgIGFjcGlfZGVidWdfbGV2ZWxzW2ldLm5hbWUsCisJCQkJICAgICBhY3BpX2RlYnVnX2xldmVsc1tpXS52YWx1ZSwKKwkJCQkgICAgIChhY3BpX2RiZ19sZXZlbCAmIGFjcGlfZGVidWdfbGV2ZWxzW2ldLgorCQkJCSAgICAgIHZhbHVlKSA/ICcqJyA6ICcgJyk7CiAJCX0KIAkJcCArPSBzcHJpbnRmKHAsICItLVxuZGVidWdfbGV2ZWwgPSAweCUwOFggKCogPSBlbmFibGVkKVxuIiwKLQkJCQlhY3BpX2RiZ19sZXZlbCk7CisJCQkgICAgIGFjcGlfZGJnX2xldmVsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcCArPSBzcHJpbnRmKHAsICJJbnZhbGlkIGRlYnVnIG9wdGlvblxuIik7CiAJCWJyZWFrOwogCX0KLQkKLWVuZDoKKworICAgICAgZW5kOgogCXNpemUgPSAocCAtIHBhZ2UpOwotCWlmIChzaXplIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisJaWYgKHNpemUgPD0gb2ZmICsgY291bnQpCisJCSplb2YgPSAxOwogCSpzdGFydCA9IHBhZ2UgKyBvZmY7CiAJc2l6ZSAtPSBvZmY7Ci0JaWYgKHNpemU+Y291bnQpIHNpemUgPSBjb3VudDsKLQlpZiAoc2l6ZTwwKSBzaXplID0gMDsKKwlpZiAoc2l6ZSA+IGNvdW50KQorCQlzaXplID0gY291bnQ7CisJaWYgKHNpemUgPCAwKQorCQlzaXplID0gMDsKIAogCXJldHVybiBzaXplOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfc3lzdGVtX3dyaXRlX2RlYnVnICgKLQlzdHJ1Y3QgZmlsZSAgICAgICAgICAgICAqZmlsZSwKLSAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgX191c2VyICpidWZmZXIsCi0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgY291bnQsCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhKQorYWNwaV9zeXN0ZW1fd3JpdGVfZGVidWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7Ci0JY2hhcgkJCWRlYnVnX3N0cmluZ1sxMl0gPSB7J1wwJ307CisJY2hhciBkZWJ1Z19zdHJpbmdbMTJdID0geyAnXDAnIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3N5c3RlbV93cml0ZV9kZWJ1ZyIpOwogCkBAIC0xNzQsNyArMTY1LDcgQEAKIAogCWRlYnVnX3N0cmluZ1tjb3VudF0gPSAnXDAnOwogCi0Jc3dpdGNoICgodW5zaWduZWQgbG9uZykgZGF0YSkgeworCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpZGF0YSkgewogCWNhc2UgMDoKIAkJYWNwaV9kYmdfbGF5ZXIgPSBzaW1wbGVfc3RydG91bChkZWJ1Z19zdHJpbmcsIE5VTEwsIDApOwogCQlicmVhazsKQEAgLTE5MCw5ICsxODEsOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2RlYnVnX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CiAJaW50IGVycm9yID0gMDsKLQljaGFyICogbmFtZTsKKwljaGFyICpuYW1lOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kZWJ1Z19pbml0Iik7CiAKQEAgLTIwMSw4ICsxOTIsMTAgQEAKIAogCS8qICdkZWJ1Z19sYXllcicgW1IvV10gKi8KIAluYW1lID0gQUNQSV9TWVNURU1fRklMRV9ERUJVR19MQVlFUjsKLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfcm9vdF9kaXIsCi0JCQkJICAgICAgIGFjcGlfc3lzdGVtX3JlYWRfZGVidWcsKHZvaWQgKikwKTsKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkobmFtZSwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgIGFjcGlfcm9vdF9kaXIsIGFjcGlfc3lzdGVtX3JlYWRfZGVidWcsCisJCQkJICAgKHZvaWQgKikwKTsKIAlpZiAoZW50cnkpCiAJCWVudHJ5LT53cml0ZV9wcm9jID0gYWNwaV9zeXN0ZW1fd3JpdGVfZGVidWc7CiAJZWxzZQpAQCAtMjEwLDE5ICsyMDMsMjEgQEAKIAogCS8qICdkZWJ1Z19sZXZlbCcgW1IvV10gKi8KIAluYW1lID0gQUNQSV9TWVNURU1fRklMRV9ERUJVR19MRVZFTDsKLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfcm9vdF9kaXIsCi0JCQkJICAgICAgIGFjcGlfc3lzdGVtX3JlYWRfZGVidWcsICh2b2lkICopMSk7Ci0JaWYgKGVudHJ5KSAKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkobmFtZSwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgIGFjcGlfcm9vdF9kaXIsIGFjcGlfc3lzdGVtX3JlYWRfZGVidWcsCisJCQkJICAgKHZvaWQgKikxKTsKKwlpZiAoZW50cnkpCiAJCWVudHJ5LT53cml0ZV9wcm9jID0gYWNwaV9zeXN0ZW1fd3JpdGVfZGVidWc7CiAJZWxzZQogCQlnb3RvIEVycm9yOwogCi0gRG9uZToKKyAgICAgIERvbmU6CiAJcmV0dXJuX1ZBTFVFKGVycm9yKTsKIAotIEVycm9yOgotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJICJVbmFibGUgdG8gY3JlYXRlICclcycgcHJvYyBmcyBlbnRyeVxuIiwgbmFtZSkpOworICAgICAgRXJyb3I6CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBwcm9jIGZzIGVudHJ5XG4iLCBuYW1lKSk7CiAKIAlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX0RFQlVHX0xFVkVMLCBhY3BpX3Jvb3RfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX0RFQlVHX0xBWUVSLCBhY3BpX3Jvb3RfZGlyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYwppbmRleCA4NDE5Mzk4Li4yMDIyYWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgpAQCAtNDksMTggKzQ4LDE0IEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc2ZpZWxkIikKK0FDUElfTU9EVUxFX05BTUUoImRzZmllbGQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKAotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8sCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpOwotCithY3BpX2RzX2dldF9maWVsZF9uYW1lcyhzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04Miw0MSArNzcsMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9idWZmZXJfZmllbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX2NyZWF0ZV9idWZmZXJfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc2Vjb25kX2Rlc2MgPSBOVUxMOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX2Rlc2MgPSBOVUxMOworCXUzMiBmbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2NyZWF0ZV9idWZmZXJfZmllbGQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2NyZWF0ZV9idWZmZXJfZmllbGQiKTsKIAogCS8qIEdldCB0aGUgbmFtZV9zdHJpbmcgYXJndW1lbnQgKi8KIAogCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0NSRUFURV9GSUVMRF9PUCkgewotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAzKTsKLQl9Ci0JZWxzZSB7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7CisJfSBlbHNlIHsKIAkJLyogQ3JlYXRlIEJpdC9CeXRlL1dvcmQvRHdvcmQgZmllbGQgKi8KIAotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAyKTsKKwkJYXJnID0gYWNwaV9wc19nZXRfYXJnKG9wLCAyKTsKIAl9CiAKIAlpZiAoIWFyZykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgewogCQlub2RlID0gd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZTsKIAkJc3RhdHVzID0gQUVfT0s7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIER1cmluZyB0aGUgbG9hZCBwaGFzZSwgd2Ugd2FudCB0byBlbnRlciB0aGUgbmFtZSBvZiB0aGUgZmllbGQgaW50bwogCQkgKiB0aGUgbmFtZXNwYWNlLiAgRHVyaW5nIHRoZSBleGVjdXRlIHBoYXNlICh3aGVuIHdlIGV2YWx1YXRlIHRoZSBzaXplCkBAIC0xMjQsMjEgKzExNCwyMiBAQAogCQkgKi8KIAkJaWYgKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9FWEVDVVRFKSB7CiAJCQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRTsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwKLQkJCQkJQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKKwkJCSAgICBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EOwogCQl9CiAKIAkJLyoKIAkJICogRW50ZXIgdGhlIG5hbWVfc3RyaW5nIGludG8gdGhlIG5hbWVzcGFjZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCQkgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLAotCQkJCSBmbGFncywgd2Fsa19zdGF0ZSwgJihub2RlKSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX05TRVJST1IgKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCisJCQkJICAgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBBQ1BJX1RZUEVfQU5ZLAorCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgZmxhZ3MsIHdhbGtfc3RhdGUsCisJCQkJICAgJihub2RlKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtMTUzLDkgKzE0NCw5IEBACiAJICogYW5kIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QuICBPdGhlcndpc2UsIHRoaXMgd2FzIGEgbG9va3VwCiAJICogb2YgYW4gZXhpc3Rpbmcgbm9kZSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdCBhZ2Fpbi4KIAkgKi8KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKG9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCkBAIC0xNjUsNyArMTU2LDcgQEAKIAogCS8qIENyZWF0ZSB0aGUgYnVmZmVyIGZpZWxkIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9CVUZGRVJfRklFTEQpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9CVUZGRVJfRklFTEQpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CkBAIC0xNzYsMjggKzE2NywyNiBAQAogCSAqIG9wY29kZSBhbmQgb3BlcmFuZHMgLS0gc2luY2UgdGhlIGJ1ZmZlciBhbmQgaW5kZXgKIAkgKiBvcGVyYW5kcyBtdXN0IGJlIGV2YWx1YXRlZC4KIAkgKi8KLQlzZWNvbmRfZGVzYyAgICAgICAgICAgICAgICAgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCXNlY29uZF9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKIAlzZWNvbmRfZGVzYy0+ZXh0cmEuYW1sX3N0YXJ0ID0gb3AtPm5hbWVkLmRhdGE7CiAJc2Vjb25kX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGggPSBvcC0+bmFtZWQubGVuZ3RoOwogCW9ial9kZXNjLT5idWZmZXJfZmllbGQubm9kZSA9IG5vZGU7CiAKIAkvKiBBdHRhY2ggY29uc3RydWN0ZWQgZmllbGQgZGVzY3JpcHRvcnMgdG8gcGFyZW50IG5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9CVUZGRVJfRklFTEQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9CVUZGRVJfRklFTEQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9maWVsZF9uYW1lcwpAQCAtMjE0LDE3ICsyMDMsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKAotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8sCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpCithY3BpX2RzX2dldF9maWVsZF9uYW1lcyhzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcG9zaXRpb247CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaW50ZWdlciBwb3NpdGlvbjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19nZXRfZmllbGRfbmFtZXMiLCBpbmZvKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19nZXRfZmllbGRfbmFtZXMiLCBpbmZvKTsKIAogCS8qIEZpcnN0IGZpZWxkIHN0YXJ0cyBhdCBiaXQgemVybyAqLwogCkBAIC0yNDMsMTggKzIyOSwxNiBAQAogCQljYXNlIEFNTF9JTlRfUkVTRVJWRURGSUVMRF9PUDoKIAogCQkJcG9zaXRpb24gPSAoYWNwaV9pbnRlZ2VyKSBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24KLQkJCQkJICsgKGFjcGlfaW50ZWdlcikgYXJnLT5jb21tb24udmFsdWUuc2l6ZTsKKwkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CiAKIAkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJCaXQgb2Zmc2V0IHdpdGhpbiBmaWVsZCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1NVUFBPUlQpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCQkJfQogCiAJCQlpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24gPSAodTMyKSBwb3NpdGlvbjsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfSU5UX0FDQ0VTU0ZJRUxEX09QOgogCiAJCQkvKgpAQCAtMjY2LDczICsyNTAsNzAgQEAKIAkJCSAqIEFDQ0VTU19UWVBFIGJpdHMKIAkJCSAqLwogCQkJaW5mby0+ZmllbGRfZmxhZ3MgPSAodTgpCi0JCQkJKChpbmZvLT5maWVsZF9mbGFncyAmIH4oQU1MX0ZJRUxEX0FDQ0VTU19UWVBFX01BU0spKSB8Ci0JCQkJKCh1OCkgKCh1MzIpIGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIgPj4gOCkpKTsKKwkJCSAgICAoKGluZm8tPgorCQkJICAgICAgZmllbGRfZmxhZ3MgJiB+KEFNTF9GSUVMRF9BQ0NFU1NfVFlQRV9NQVNLKSkgfAorCQkJICAgICAoKHU4KSAoKHUzMikgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciA+PiA4KSkpOwogCiAJCQlpbmZvLT5hdHRyaWJ1dGUgPSAodTgpIChhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfSU5UX05BTUVERklFTERfT1A6CiAKIAkJCS8qIExvb2t1cCB0aGUgbmFtZSAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkJICAoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLAotCQkJCQkgIGluZm8tPmZpZWxkX3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkJICBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKLQkJCQkJICB3YWxrX3N0YXRlLCAmaW5mby0+ZmllbGRfbm9kZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoKGNoYXIgKikgJmFyZy0+bmFtZWQubmFtZSwgc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCisJCQkJCQkoY2hhciAqKSZhcmctPm5hbWVkLm5hbWUsCisJCQkJCQlpbmZvLT5maWVsZF90eXBlLAorCQkJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCQkJQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCisJCQkJCQl3YWxrX3N0YXRlLCAmaW5mby0+ZmllbGRfbm9kZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKChjaGFyICopJmFyZy0+bmFtZWQubmFtZSwKKwkJCQkJCSAgICBzdGF0dXMpOwogCQkJCWlmIChzdGF0dXMgIT0gQUVfQUxSRUFEWV9FWElTVFMpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCQl9CiAKIAkJCQkvKiBBbHJlYWR5IGV4aXN0cywgaWdub3JlIGVycm9yICovCi0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJYXJnLT5jb21tb24ubm9kZSA9IGluZm8tPmZpZWxkX25vZGU7CiAJCQkJaW5mby0+ZmllbGRfYml0X2xlbmd0aCA9IGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CiAKIAkJCQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gb2JqZWN0IGZvciB0aGUgbmV3IEZpZWxkIE5vZGUgKi8KIAotCQkJCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZSAoaW5mbyk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQkJc3RhdHVzID0gYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKGluZm8pOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCQl9CiAJCQl9CiAKIAkJCS8qIEtlZXAgdHJhY2sgb2YgYml0IHBvc2l0aW9uIGZvciB0aGUgbmV4dCBmaWVsZCAqLwogCiAJCQlwb3NpdGlvbiA9IChhY3BpX2ludGVnZXIpIGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbgotCQkJCQkgKyAoYWNwaV9pbnRlZ2VyKSBhcmctPmNvbW1vbi52YWx1ZS5zaXplOworCQkJICAgICsgKGFjcGlfaW50ZWdlcikgYXJnLT5jb21tb24udmFsdWUuc2l6ZTsKIAogCQkJaWYgKHBvc2l0aW9uID4gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJIkZpZWxkIFslNC40c10gYml0IG9mZnNldCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIsCi0JCQkJCShjaGFyICopICZpbmZvLT5maWVsZF9ub2RlLT5uYW1lKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkZpZWxkIFslNC40c10gYml0IG9mZnNldCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIsIChjaGFyICopJmluZm8tPmZpZWxkX25vZGUtPm5hbWUpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAJCQl9CiAKIAkJCWluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiArPSBpbmZvLT5maWVsZF9iaXRfbGVuZ3RoOwogCQkJYnJlYWs7CiAKLQogCQlkZWZhdWx0OgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVhcbiIsCi0JCQkJYXJnLT5jb21tb24uYW1sX29wY29kZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIG9wY29kZSBpbiBmaWVsZCBsaXN0OiAlWFxuIiwKKwkJCQkJICBhcmctPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOwogCQl9CiAKIAkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX2ZpZWxkCkBAIC0zNDgsMjkgKzMyOSwyOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX2ZpZWxkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpyZWdpb25fbm9kZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19jcmVhdGVfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAgIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19jcmVhdGVfZmllbGQiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY3JlYXRlX2ZpZWxkIiwgb3ApOwogCiAJLyogRmlyc3QgYXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb3BfcmVnaW9uIChtdXN0IGFscmVhZHkgZXhpc3QpICovCiAKIAlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKIAlpZiAoIXJlZ2lvbl9ub2RlKSB7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5uYW1lLAotCQkJCSAgQUNQSV9UWVBFX1JFR0lPTiwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmcmVnaW9uX25vZGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBzdGF0dXMpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkgICBhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBBQ1BJX1RZUEVfUkVHSU9OLAorCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgIHdhbGtfc3RhdGUsICZyZWdpb25fbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTM4NSwxMiArMzY1LDExIEBACiAJaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDsKIAlpbmZvLnJlZ2lvbl9ub2RlID0gcmVnaW9uX25vZGU7CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcyAoJmluZm8sIHdhbGtfc3RhdGUsIGFyZy0+Y29tbW9uLm5leHQpOworCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cwpAQCAtNDA3LDM3ICszODYsMzQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfaW5pdF9maWVsZF9vYmplY3RzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcgPSBOVUxMOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXU4IHR5cGUgPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2luaXRfZmllbGRfb2JqZWN0cyIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19pbml0X2ZpZWxkX29iamVjdHMiLCBvcCk7CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewogCWNhc2UgQU1MX0ZJRUxEX09QOgotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAyKTsKKwkJYXJnID0gYWNwaV9wc19nZXRfYXJnKG9wLCAyKTsKIAkJdHlwZSA9IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfQkFOS19GSUVMRF9PUDoKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChvcCwgNCk7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgNCk7CiAJCXR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDsKIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9JTkRFWF9GSUVMRF9PUDoKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMyk7CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7CiAJCXR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCkBAIC00NDcsMTYgKzQyMywxOCBAQAogCQkvKiBJZ25vcmUgT0ZGU0VUIGFuZCBBQ0NFU1NBUyB0ZXJtcyBoZXJlICovCiAKIAkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FREZJRUxEX09QKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkJICAoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLAotCQkJCQkgIHR5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMSwKLQkJCQkJICBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfAotCQkJCQkgIEFDUElfTlNfRVJST1JfSUZfRk9VTkQsCi0JCQkJCSAgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCQkJKGNoYXIgKikmYXJnLT5uYW1lZC5uYW1lLAorCQkJCQkJdHlwZSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLAorCQkJCQkJQUNQSV9OU19OT19VUFNFQVJDSCB8CisJCQkJCQlBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSB8CisJCQkJCQlBQ1BJX05TX0VSUk9SX0lGX0ZPVU5ELAorCQkJCQkJd2Fsa19zdGF0ZSwgJm5vZGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUigoY2hhciAqKSZhcmctPm5hbWVkLm5hbWUsCisJCQkJCQkgICAgc3RhdHVzKTsKIAkJCQlpZiAoc3RhdHVzICE9IEFFX0FMUkVBRFlfRVhJU1RTKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCiAJCQkJLyogTmFtZSBhbHJlYWR5IGV4aXN0cywganVzdCBpZ25vcmUgdGhpcyBlcnJvciAqLwpAQCAtNDcyLDEwICs0NTAsOSBAQAogCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfYmFua19maWVsZApAQCAtNDkxLDQxICs0NjgsNDIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9iYW5rX2ZpZWxkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpyZWdpb25fbm9kZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19jcmVhdGVfYmFua19maWVsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmc7Ci0Jc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOworCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIGluZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfY3JlYXRlX2JhbmtfZmllbGQiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY3JlYXRlX2JhbmtfZmllbGQiLCBvcCk7CiAKIAkvKiBGaXJzdCBhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBvcF9yZWdpb24gKG11c3QgYWxyZWFkeSBleGlzdCkgKi8KIAogCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOwogCWlmICghcmVnaW9uX25vZGUpIHsKLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLm5hbWUsCi0JCQkJICBBQ1BJX1RZUEVfUkVHSU9OLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICZyZWdpb25fbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX05TRVJST1IgKGFyZy0+Y29tbW9uLnZhbHVlLm5hbWUsIHN0YXR1cyk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLm5hbWUsIEFDUElfVFlQRV9SRUdJT04sCisJCQkJICAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJICAgd2Fsa19zdGF0ZSwgJnJlZ2lvbl9ub2RlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKGFyZy0+Y29tbW9uLnZhbHVlLm5hbWUsIHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIFNlY29uZCBhcmcgaXMgdGhlIEJhbmsgUmVnaXN0ZXIgKEZpZWxkKSAobXVzdCBhbHJlYWR5IGV4aXN0KSAqLwogCiAJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAotCQkJICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJmluZm8ucmVnaXN0ZXJfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkgICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCisJCQkgICAmaW5mby5yZWdpc3Rlcl9ub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfTlNFUlJPUihhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFRoaXJkIGFyZyBpcyB0aGUgYmFua192YWx1ZSAqLwpAQCAtNTQzLDEyICs1MjEsMTEgQEAKIAlpbmZvLmZpZWxkX3R5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDsKIAlpbmZvLnJlZ2lvbl9ub2RlID0gcmVnaW9uX25vZGU7CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcyAoJmluZm8sIHdhbGtfc3RhdGUsIGFyZy0+Y29tbW9uLm5leHQpOworCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZApAQCAtNTY0LDM5ICs1NDEsNDAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcmVnaW9uX25vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfY3JlYXRlX2luZGV4X2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJCSAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKwlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyBpbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2NyZWF0ZV9pbmRleF9maWVsZCIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jcmVhdGVfaW5kZXhfZmllbGQiLCBvcCk7CiAKIAkvKiBGaXJzdCBhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIEluZGV4IHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCiAKIAlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAotCQkJICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJmluZm8ucmVnaXN0ZXJfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkgICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCisJCQkgICAmaW5mby5yZWdpc3Rlcl9ub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfTlNFUlJPUihhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFNlY29uZCBhcmcgaXMgdGhlIGRhdGEgcmVnaXN0ZXIgKG11c3QgYWxyZWFkeSBleGlzdCkgKi8KIAogCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0Jc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCSAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICZpbmZvLmRhdGFfcmVnaXN0ZXJfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkgICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCisJCQkgICAmaW5mby5kYXRhX3JlZ2lzdGVyX25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogTmV4dCBhcmcgaXMgdGhlIGZpZWxkIGZsYWdzICovCkBAIC02MDksOSArNTg3LDcgQEAKIAlpbmZvLmZpZWxkX3R5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ7CiAJaW5mby5yZWdpb25fbm9kZSA9IHJlZ2lvbl9ub2RlOwogCi0Jc3RhdHVzID0gYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKKwlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcygmaW5mbywgd2Fsa19zdGF0ZSwgYXJnLT5jb21tb24ubmV4dCk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYwppbmRleCBkNzc5MGRiLi44NjkzYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYwpAQCAtNDEsMjMgKzQxLDE3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNpbml0IikKK0FDUElfTU9EVUxFX05BTUUoImRzaW5pdCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQorYWNwaV9kc19pbml0X29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODAsMjYgKzc0LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX2RzX2luaXRfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICopIGNvbnRleHQ7CisJc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKmluZm8gPQorCSAgICAoc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKiljb250ZXh0OworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0KKwkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2hhbmRsZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19pbml0X29uZV9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfaW5pdF9vbmVfb2JqZWN0Iik7CiAKIAkvKgotCSAqIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gb2JqZWN0cyBvd25lZCBieSB0aGUgdGFibGUgdGhhdAorCSAqIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gTlMgbm9kZXMgb3duZWQgYnkgdGhlIHRhYmxlIHRoYXQKIAkgKiB3YXMganVzdCBsb2FkZWQKIAkgKi8KLQlpZiAoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfaGFuZGxlKS0+b3duZXJfaWQgIT0KLQkJCWluZm8tPnRhYmxlX2Rlc2MtPnRhYmxlX2lkKSB7CisJaWYgKG5vZGUtPm93bmVyX2lkICE9IGluZm8tPnRhYmxlX2Rlc2MtPm93bmVyX2lkKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KIApAQCAtMTA3LDMzICs5OCwzMSBAQAogCiAJLyogQW5kIGV2ZW4gdGhlbiwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIGZldyBvYmplY3QgdHlwZXMgKi8KIAotCXR5cGUgPSBhY3BpX25zX2dldF90eXBlIChvYmpfaGFuZGxlKTsKKwl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShvYmpfaGFuZGxlKTsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAotCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uIChvYmpfaGFuZGxlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlJlZ2lvbiAlcCBbJTQuNHNdIC0gSW5pdCBmYWlsdXJlLCAlc1xuIiwKLQkJCQlvYmpfaGFuZGxlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9oYW5kbGUpLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uKG9ial9oYW5kbGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlJlZ2lvbiAlcCBbJTQuNHNdIC0gSW5pdCBmYWlsdXJlLCAlc1xuIiwKKwkJCQkJICBvYmpfaGFuZGxlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfaGFuZGxlKSwKKwkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQl9CiAKIAkJaW5mby0+b3BfcmVnaW9uX2NvdW50Kys7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJaW5mby0+bWV0aG9kX2NvdW50Kys7Ci0KIAkJLyoKIAkJICogUHJpbnQgYSBkb3QgZm9yIGVhY2ggbWV0aG9kIHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gcHJpbnQKIAkJICogdGhlIGVudGlyZSBwYXRobmFtZQogCQkgKi8KIAkJaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX0lOSVRfTkFNRVMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwgIi4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULCAiLiIpKTsKIAkJfQogCiAJCS8qCkBAIC0xNDMsNDEgKzEzMiwzMiBAQAogCQkgKiBvbiBhIHBlci10YWJsZSBiYXNpcy4gQ3VycmVudGx5LCB3ZSBqdXN0IHVzZSBhIGdsb2JhbCBmb3IgdGhlIHdpZHRoLgogCQkgKi8KIAkJaWYgKGluZm8tPnRhYmxlX2Rlc2MtPnBvaW50ZXItPnJldmlzaW9uID09IDEpIHsKLQkJCSgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZSktPmZsYWdzIHw9IEFOT0JKX0RBVEFfV0lEVEhfMzI7CisJCQlub2RlLT5mbGFncyB8PSBBTk9CSl9EQVRBX1dJRFRIXzMyOwogCQl9CiAKIAkJLyoKIAkJICogQWx3YXlzIHBhcnNlIG1ldGhvZHMgdG8gZGV0ZWN0IGVycm9ycywgd2Ugd2lsbCBkZWxldGUKIAkJICogdGhlIHBhcnNlIHRyZWUgYmVsb3cKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZHNfcGFyc2VfbWV0aG9kIChvYmpfaGFuZGxlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIk1ldGhvZCAlcCBbJTQuNHNdIC0gcGFyc2UgZmFpbHVyZSwgJXNcbiIsCi0JCQkJb2JqX2hhbmRsZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfaGFuZGxlKSwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJc3RhdHVzID0gYWNwaV9kc19wYXJzZV9tZXRob2Qob2JqX2hhbmRsZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiXG4rTWV0aG9kICVwIFslNC40c10gLSBwYXJzZSBmYWlsdXJlLCAlc1xuIiwKKwkJCQkJICBvYmpfaGFuZGxlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfaGFuZGxlKSwKKwkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCiAJCQkvKiBUaGlzIHBhcnNlIGZhaWxlZCwgYnV0IHdlIHdpbGwgY29udGludWUgcGFyc2luZyBtb3JlIG1ldGhvZHMgKi8KLQotCQkJYnJlYWs7CiAJCX0KIAotCQkvKgotCQkgKiBEZWxldGUgdGhlIHBhcnNlIHRyZWUuICBXZSBzaW1wbHkgcmUtcGFyc2UgdGhlIG1ldGhvZAotCQkgKiBmb3IgZXZlcnkgZXhlY3V0aW9uIHNpbmNlIHRoZXJlIGlzbid0IG11Y2ggb3ZlcmhlYWQKLQkJICovCi0JCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlIChvYmpfaGFuZGxlKTsKLQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKLQkJCSgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZSktPm9iamVjdC0+bWV0aG9kLm93bmluZ19pZCk7CisJCWluZm8tPm1ldGhvZF9jb3VudCsrOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgogCiAJCWluZm8tPmRldmljZV9jb3VudCsrOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMTg5LDcgKzE2OSw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMKQEAgLTIwNSw0NSArMTg0LDQzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZSkKK2FjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKiB0YWJsZV9kZXNjLAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBzdGFydF9ub2RlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICAgICAgaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gaW5mbzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2luaXRpYWxpemVfb2JqZWN0cyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2luaXRpYWxpemVfb2JqZWN0cyIpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICIqKioqIFN0YXJ0aW5nIGluaXRpYWxpemF0aW9uIG9mIG5hbWVzcGFjZSBvYmplY3RzICoqKipcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULCAiUGFyc2luZyBhbGwgQ29udHJvbCBNZXRob2RzOiIpKTsKIAotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSIqKioqIFN0YXJ0aW5nIGluaXRpYWxpemF0aW9uIG9mIG5hbWVzcGFjZSBvYmplY3RzICoqKipcbiIpKTsKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwgIlBhcnNpbmcgYWxsIENvbnRyb2wgTWV0aG9kczoiKSk7Ci0KLQlpbmZvLm1ldGhvZF9jb3VudCAgID0gMDsKKwlpbmZvLm1ldGhvZF9jb3VudCA9IDA7CiAJaW5mby5vcF9yZWdpb25fY291bnQgPSAwOwotCWluZm8ub2JqZWN0X2NvdW50ICAgPSAwOwotCWluZm8uZGV2aWNlX2NvdW50ICAgPSAwOwotCWluZm8udGFibGVfZGVzYyAgICAgPSB0YWJsZV9kZXNjOworCWluZm8ub2JqZWN0X2NvdW50ID0gMDsKKwlpbmZvLmRldmljZV9jb3VudCA9IDA7CisJaW5mby50YWJsZV9kZXNjID0gdGFibGVfZGVzYzsKIAogCS8qIFdhbGsgZW50aXJlIG5hbWVzcGFjZSBmcm9tIHRoZSBzdXBwbGllZCByb290ICovCiAKLQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlIChBQ1BJX1RZUEVfQU5ZLCBzdGFydF9ub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCi0JCQkgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0LCAmaW5mbywgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZCwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIHN0YXJ0X25vZGUsIEFDUElfVUlOVDMyX01BWCwKKwkJCQkgICAgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0LCAmaW5mbywgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWQsICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwKLQkJIlxuVGFibGUgWyU0LjRzXShpZCAlNC40WCkgLSAlaGQgT2JqZWN0cyB3aXRoICVoZCBEZXZpY2VzICVoZCBNZXRob2RzICVoZCBSZWdpb25zXG4iLAotCQl0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUsIHRhYmxlX2Rlc2MtPnRhYmxlX2lkLCBpbmZvLm9iamVjdF9jb3VudCwKLQkJaW5mby5kZXZpY2VfY291bnQsIGluZm8ubWV0aG9kX2NvdW50LCBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiXG5UYWJsZSBbJTQuNHNdKGlkICU0LjRYKSAtICVoZCBPYmplY3RzIHdpdGggJWhkIERldmljZXMgJWhkIE1ldGhvZHMgJWhkIFJlZ2lvbnNcbiIsCisJCQkgICAgICB0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUsCisJCQkgICAgICB0YWJsZV9kZXNjLT5vd25lcl9pZCwgaW5mby5vYmplY3RfY291bnQsCisJCQkgICAgICBpbmZvLmRldmljZV9jb3VudCwgaW5mby5tZXRob2RfY291bnQsCisJCQkgICAgICBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSIlaGQgTWV0aG9kcywgJWhkIFJlZ2lvbnNcbiIsIGluZm8ubWV0aG9kX2NvdW50LCBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICIlaGQgTWV0aG9kcywgJWhkIFJlZ2lvbnNcbiIsIGluZm8ubWV0aG9kX2NvdW50LAorCQkJICBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYwppbmRleCA5ZmMzZjRjLi4zNmMxY2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKQEAgLTQxLDcgKzQxLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CkBAIC00OSw2NyArNDgsNTcgQEAKICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzbWV0aG9kIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZHNtZXRob2QiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3BhcnNlX21ldGhvZAogICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBNZXRob2Qgbm9kZQorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgIC0gTWV0aG9kIG5vZGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IENhbGwgdGhlIHBhcnNlciBhbmQgcGFyc2UgdGhlIEFNTCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqICAgICAgICAgICAgICBtZXRob2QuCisgKiBERVNDUklQVElPTjogUGFyc2UgdGhlIEFNTCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0aG9kLgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIHBhcnNlciBpcyBsb2NrZWQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19wYXJzZV9tZXRob2QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcGFyc2VfbWV0aG9kKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZDsKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19wYXJzZV9tZXRob2QiLCBvYmpfaGFuZGxlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19wYXJzZV9tZXRob2QiLCBub2RlKTsKIAogCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCiAKLQlpZiAoIW9ial9oYW5kbGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX0VOVFJZKTsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBQYXJzaW5nIFslNC40c10gKioqKiBuYW1lZF9vYmo9JXBcbiIsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2hhbmRsZSksIG9ial9oYW5kbGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiKioqKiBQYXJzaW5nIFslNC40c10gKioqKiBuYW1lZF9vYmo9JXBcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOwogCiAJLyogRXh0cmFjdCB0aGUgbWV0aG9kIG9iamVjdCBmcm9tIHRoZSBtZXRob2QgTm9kZSAqLwogCi0Jbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfaGFuZGxlOwotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9PQkpFQ1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwogCX0KIAogCS8qIENyZWF0ZSBhIG11dGV4IGZvciB0aGUgbWV0aG9kIGlmIHRoZXJlIGlzIGEgY29uY3VycmVuY3kgbGltaXQgKi8KIAogCWlmICgob2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSAhPSBBQ1BJX0lORklOSVRFX0NPTkNVUlJFTkNZKSAmJgotCQkoIW9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgewotCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3ksCi0JCQkJICAgb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSwKLQkJCQkgICAmb2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJICAgICghb2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CisJCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZShvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5LAorCQkJCQkJICBvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5LAorCQkJCQkJICAmb2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0xMTcsMTQgKzEwNiwxNCBAQAogCSAqIEFsbG9jYXRlIGEgbmV3IHBhcnNlciBvcCB0byBiZSB0aGUgcm9vdCBvZiB0aGUgcGFyc2VkCiAJICogbWV0aG9kIHRyZWUKIAkgKi8KLQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9NRVRIT0RfT1ApOworCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfTUVUSE9EX09QKTsKIAlpZiAoIW9wKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogSW5pdCBuZXcgb3Agd2l0aCB0aGUgbWV0aG9kIG5hbWUgYW5kIHBvaW50ZXIgYmFjayB0byB0aGUgTm9kZSAqLwogCi0JYWNwaV9wc19zZXRfbmFtZSAob3AsIG5vZGUtPm5hbWUuaW50ZWdlcik7CisJYWNwaV9wc19zZXRfbmFtZShvcCwgbm9kZS0+bmFtZS5pbnRlZ2VyKTsKIAlvcC0+Y29tbW9uLm5vZGUgPSBub2RlOwogCiAJLyoKQEAgLTEzMiwyMiArMTIxLDI3IEBACiAJICogb2JqZWN0cyAoc3VjaCBhcyBPcGVyYXRpb24gUmVnaW9ucykgY2FuIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZQogCSAqIGZpcnN0IHBhc3MgcGFyc2UuCiAJICovCi0Jb3duZXJfaWQgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkIChBQ1BJX09XTkVSX1RZUEVfTUVUSE9EKTsKLQlvYmpfZGVzYy0+bWV0aG9kLm93bmluZ19pZCA9IG93bmVyX2lkOworCXN0YXR1cyA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQoJm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQogCiAJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KIAotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlIChvd25lcl9pZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJd2Fsa19zdGF0ZSA9CisJICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUob2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICBOVUxMKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDI7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrICh3YWxrX3N0YXRlLCBvcCwgbm9kZSwKLQkJCSAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgTlVMTCwgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlICh3YWxrX3N0YXRlKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBvcCwgbm9kZSwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgTlVMTCwgMSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDI7CiAJfQogCiAJLyoKQEAgLTE1OSwyMCArMTUzLDMxIEBACiAJICogbWV0aG9kIHNvIHRoYXQgb3BlcmFuZHMgdG8gdGhlIG5hbWVkIG9iamVjdHMgY2FuIHRha2Ugb24gZHluYW1pYwogCSAqIHJ1bi10aW1lIHZhbHVlcy4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCAod2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDI7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCSIqKioqIFslNC40c10gUGFyc2VkICoqKiogbmFtZWRfb2JqPSVwIE9wPSVwXG4iLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9oYW5kbGUpLCBvYmpfaGFuZGxlLCBvcCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkgICIqKioqIFslNC40c10gUGFyc2VkICoqKiogbmFtZWRfb2JqPSVwIE9wPSVwXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUsIG9wKSk7CiAKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCS8qCisJICogRGVsZXRlIHRoZSBwYXJzZSB0cmVlLiBXZSBzaW1wbHkgcmUtcGFyc2UgdGhlIG1ldGhvZCBmb3IgZXZlcnkKKwkgKiBleGVjdXRpb24gc2luY2UgdGhlcmUgaXNuJ3QgbXVjaCBvdmVyaGVhZCAoY29tcGFyZWQgdG8ga2VlcGluZyBsb3RzCisJICogb2YgcGFyc2UgdHJlZXMgYXJvdW5kKQorCSAqLworCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlKG5vZGUpOworCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKworICAgICAgY2xlYW51cDI6CisJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKworICAgICAgY2xlYW51cDoKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24KQEAgLTE5MCwxOSArMTk1LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICptZXRob2Rfbm9kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjYWxsaW5nX21ldGhvZF9ub2RlKQorYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2FsbGluZ19tZXRob2Rfbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2JlZ2luX21ldGhvZF9leGVjdXRpb24iLCBtZXRob2Rfbm9kZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiIsIG1ldGhvZF9ub2RlKTsKIAogCWlmICghbWV0aG9kX25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX0VOVFJZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOworCX0KKworCS8qIFByZXZlbnQgd3JhcGFyb3VuZCBvZiB0aHJlYWQgY291bnQgKi8KKworCWlmIChvYmpfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCA9PSBBQ1BJX1VJTlQ4X01BWCkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1ldGhvZCByZWFjaGVkIG1heGltdW0gcmVlbnRyYW5jeSBsaW1pdCAoMjU1KVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX01FVEhPRF9MSU1JVCk7CiAJfQogCiAJLyoKQEAgLTIxOSw4ICsyMjgsOSBAQAogCQkgKiB0aHJlYWQgdGhhdCBpcyBtYWtpbmcgcmVjdXJzaXZlIG1ldGhvZCBjYWxscy4KIAkJICovCiAJCWlmIChtZXRob2Rfbm9kZSA9PSBjYWxsaW5nX21ldGhvZF9ub2RlKSB7Ci0JCQlpZiAob2JqX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQgPj0gb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX01FVEhPRF9MSU1JVCk7CisJCQlpZiAob2JqX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQgPj0KKwkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5KSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9NRVRIT0RfTElNSVQpOwogCQkJfQogCQl9CiAKQEAgLTIyOCw4ICsyMzgsMjEgQEAKIAkJICogR2V0IGEgdW5pdCBmcm9tIHRoZSBtZXRob2Qgc2VtYXBob3JlLiBUaGlzIHJlbGVhc2VzIHRoZQogCQkgKiBpbnRlcnByZXRlciBpZiB3ZSBibG9jawogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKG9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlLAotCQkJCSBBQ1BJX1dBSVRfRk9SRVZFUik7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZShvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSwKKwkJCQkJCSAgQUNQSV9XQUlUX0ZPUkVWRVIpOworCX0KKworCS8qCisJICogQWxsb2NhdGUgYW4gT3duZXIgSUQgZm9yIHRoaXMgbWV0aG9kLCBvbmx5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRocmVhZAorCSAqIHRvIGJlZ2luIGNvbmN1cnJlbnQgZXhlY3V0aW9uLiBXZSBvbmx5IG5lZWQgb25lIG93bmVyX2lkLCBldmVuIGlmIHRoZQorCSAqIG1ldGhvZCBpcyBpbnZva2VkIHJlY3Vyc2l2ZWx5LgorCSAqLworCWlmICghb2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKCZvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQogCX0KIAogCS8qCkBAIC0yMzcsMTAgKzI2MCw5IEBACiAJICogcmVlbnRlcmVkIG9uZSBtb3JlIHRpbWUgKGV2ZW4gaWYgaXQgaXMgdGhlIHNhbWUgdGhyZWFkKQogCSAqLwogCW9ial9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50Kys7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY2FsbF9jb250cm9sX21ldGhvZApAQCAtMjU2LDEwMSArMjc4LDk5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqdGhpc193YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQorYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkLAorCQkJICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKnRoaXNfd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGU7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqbmV4dF93YWxrX3N0YXRlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgaW5mbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICpuZXh0X3dhbGtfc3RhdGUgPSBOVUxMOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJdTMyIGk7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY2FsbF9jb250cm9sX21ldGhvZCIsIHRoaXNfd2Fsa19zdGF0ZSk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2NhbGxfY29udHJvbF9tZXRob2QiLCB0aGlzX3dhbGtfc3RhdGUpOwotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJFeGVjdXRlIG1ldGhvZCAlcCwgY3VycmVudHN0YXRlPSVwXG4iLAotCQl0aGlzX3dhbGtfc3RhdGUtPnByZXZfb3AsIHRoaXNfd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJFeGVjdXRlIG1ldGhvZCAlcCwgY3VycmVudHN0YXRlPSVwXG4iLAorCQkJICB0aGlzX3dhbGtfc3RhdGUtPnByZXZfb3AsIHRoaXNfd2Fsa19zdGF0ZSkpOwogCiAJLyoKIAkgKiBHZXQgdGhlIG5hbWVzcGFjZSBlbnRyeSBmb3IgdGhlIGNvbnRyb2wgbWV0aG9kIHdlIGFyZSBhYm91dCB0byBjYWxsCiAJICovCiAJbWV0aG9kX25vZGUgPSB0aGlzX3dhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX25vZGU7CiAJaWYgKCFtZXRob2Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05VTExfRU5UUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9FTlRSWSk7CiAJfQogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG1ldGhvZF9ub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChtZXRob2Rfbm9kZSk7CiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05VTExfT0JKRUNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKIAl9CiAKLQlvYmpfZGVzYy0+bWV0aG9kLm93bmluZ19pZCA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQgKEFDUElfT1dORVJfVFlQRV9NRVRIT0QpOwotCiAJLyogSW5pdCBmb3IgbmV3IG1ldGhvZCwgd2FpdCBvbiBjb25jdXJyZW5jeSBzZW1hcGhvcmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiAobWV0aG9kX25vZGUsIG9ial9kZXNjLAotCQkJICB0aGlzX3dhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24obWV0aG9kX25vZGUsIG9ial9kZXNjLAorCQkJCQkJdGhpc193YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlpZiAoIShvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfSU5URVJOQUxfT05MWSkpIHsKIAkJLyogMSkgUGFyc2U6IENyZWF0ZSBhIG5ldyB3YWxrIHN0YXRlIGZvciB0aGUgcHJlZW1wdGluZyB3YWxrICovCiAKLQkJbmV4dF93YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAob2JqX2Rlc2MtPm1ldGhvZC5vd25pbmdfaWQsCi0JCQkJICBvcCwgb2JqX2Rlc2MsIE5VTEwpOworCQluZXh0X3dhbGtfc3RhdGUgPQorCQkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBvcCwKKwkJCQkJICAgICAgb2JqX2Rlc2MsIE5VTEwpOwogCQlpZiAoIW5leHRfd2Fsa19zdGF0ZSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KIAotCQlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wICgpOworCQlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKCk7CiAJCWlmICghb3ApIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayAobmV4dF93YWxrX3N0YXRlLCBvcCwgbWV0aG9kX25vZGUsCi0JCQkJICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLAotCQkJCSAgTlVMTCwgMSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUgKG5leHRfd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayhuZXh0X3dhbGtfc3RhdGUsIG9wLCBtZXRob2Rfbm9kZSwKKwkJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLAorCQkJCQkgICAgICAgTlVMTCwgMSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZShuZXh0X3dhbGtfc3RhdGUpOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKIAkJLyogQmVnaW4gQU1MIHBhcnNlICovCiAKLQkJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKG5leHRfd2Fsa19zdGF0ZSk7Ci0JCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKG9wKTsKKwkJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwobmV4dF93YWxrX3N0YXRlKTsKKwkJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CiAJfQogCiAJLyogMikgRXhlY3V0ZTogQ3JlYXRlIGEgbmV3IHN0YXRlIGZvciB0aGUgcHJlZW1wdGluZyB3YWxrICovCiAKLQluZXh0X3dhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlIChvYmpfZGVzYy0+bWV0aG9kLm93bmluZ19pZCwKLQkJCSAgTlVMTCwgb2JqX2Rlc2MsIHRocmVhZCk7CisJbmV4dF93YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLAorCQkJCQkJICAgIE5VTEwsIG9ial9kZXNjLCB0aHJlYWQpOwogCWlmICghbmV4dF93YWxrX3N0YXRlKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAkvKgogCSAqIFRoZSByZXNvbHZlZCBhcmd1bWVudHMgd2VyZSBwdXQgb24gdGhlIHByZXZpb3VzIHdhbGsgc3RhdGUncyBvcGVyYW5kCi0JICogc3RhY2suICBPcGVyYW5kcyBvbiB0aGUgcHJldmlvdXMgd2FsayBzdGF0ZSBzdGFjayBhbHdheXMKLQkgKiBzdGFydCBhdCBpbmRleCAwLgotCSAqIE51bGwgdGVybWluYXRlIHRoZSBsaXN0IG9mIGFyZ3VtZW50cworCSAqIHN0YWNrLiBPcGVyYW5kcyBvbiB0aGUgcHJldmlvdXMgd2FsayBzdGF0ZSBzdGFjayBhbHdheXMKKwkgKiBzdGFydCBhdCBpbmRleCAwLiBBbHNvLCBudWxsIHRlcm1pbmF0ZSB0aGUgbGlzdCBvZiBhcmd1bWVudHMKIAkgKi8KLQl0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzIFt0aGlzX3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOworCXRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHNbdGhpc193YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKIAogCWluZm8ucGFyYW1ldGVycyA9ICZ0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCWluZm8ucGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsgKG5leHRfd2Fsa19zdGF0ZSwgTlVMTCwgbWV0aG9kX25vZGUsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsCi0JCQkgICZpbmZvLCAzKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKG5leHRfd2Fsa19zdGF0ZSwgTlVMTCwgbWV0aG9kX25vZGUsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsICZpbmZvLCAzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMzU5LDM5ICszNzksMzggQEAKIAkgKiAodGhleSB3ZXJlIGNvcGllZCB0byBuZXcgb2JqZWN0cykKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsgaSsrKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAodGhpc193YWxrX3N0YXRlLT5vcGVyYW5kcyBbaV0pOwotCQl0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzIFtpXSA9IE5VTEw7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKKwkJdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7CiAJfQogCiAJLyogQ2xlYXIgdGhlIG9wZXJhbmQgc3RhY2sgKi8KIAogCXRoaXNfd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiU3RhcnRpbmcgbmVzdGVkIGV4ZWN1dGlvbiwgbmV3c3RhdGU9JXBcbiIsIG5leHRfd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJTdGFydGluZyBuZXN0ZWQgZXhlY3V0aW9uLCBuZXdzdGF0ZT0lcFxuIiwKKwkJCSAgbmV4dF93YWxrX3N0YXRlKSk7CiAKIAlpZiAob2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX0lOVEVSTkFMX09OTFkpIHsKLQkJc3RhdHVzID0gb2JqX2Rlc2MtPm1ldGhvZC5pbXBsZW1lbnRhdGlvbiAobmV4dF93YWxrX3N0YXRlKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBvYmpfZGVzYy0+bWV0aG9kLmltcGxlbWVudGF0aW9uKG5leHRfd2Fsa19zdGF0ZSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAKKyAgICAgIGNsZWFudXA6CisJLyogRGVjcmVtZW50IHRoZSB0aHJlYWQgY291bnQgb24gdGhlIG1ldGhvZCBwYXJzZSB0cmVlICovCisKKwlpZiAobmV4dF93YWxrX3N0YXRlICYmIChuZXh0X3dhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSkgeworCQluZXh0X3dhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50LS07CisJfQogCiAJLyogT24gZXJyb3IsIHdlIG11c3QgZGVsZXRlIHRoZSBuZXcgd2FsayBzdGF0ZSAqLwogCi1jbGVhbnVwOgotCWlmIChuZXh0X3dhbGtfc3RhdGUgJiYgKG5leHRfd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpKSB7Ci0JCS8qIERlY3JlbWVudCB0aGUgdGhyZWFkIGNvdW50IG9uIHRoZSBtZXRob2QgcGFyc2UgdHJlZSAqLwotCi0JICAgbmV4dF93YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudC0tOwotCX0KLQkodm9pZCkgYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QgKG5leHRfd2Fsa19zdGF0ZSk7Ci0JYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAobmV4dF93YWxrX3N0YXRlKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QobmV4dF93YWxrX3N0YXRlKTsKKwlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKG5leHRfd2Fsa19zdGF0ZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kCkBAIC00MDcsMjUgKzQyNiwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYykKK2FjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kIiwgd2Fsa19zdGF0ZSk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QiLCB3YWxrX3N0YXRlKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiKioqKlJlc3RhcnQgWyU0LjRzXSBPcCAlcCByZXR1cm5fdmFsdWVfZnJvbV9jYWxsZWUgJXBcbiIsCisJCQkgIChjaGFyICopJndhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT5uYW1lLAorCQkJICB3YWxrX3N0YXRlLT5tZXRob2RfY2FsbF9vcCwgcmV0dXJuX2Rlc2MpKTsKIAotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSIqKioqUmVzdGFydCBbJTQuNHNdIE9wICVwIHJldHVybl92YWx1ZV9mcm9tX2NhbGxlZSAlcFxuIiwKLQkJKGNoYXIgKikgJndhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT5uYW1lLCB3YWxrX3N0YXRlLT5tZXRob2RfY2FsbF9vcCwKLQkJcmV0dXJuX2Rlc2MpKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiICAgIHJldHVybl9mcm9tX3RoaXNfbWV0aG9kX3VzZWQ/PSVYIHJlc19zdGFjayAlcCBXYWxrICVwXG4iLAotCQl3YWxrX3N0YXRlLT5yZXR1cm5fdXNlZCwKLQkJd2Fsa19zdGF0ZS0+cmVzdWx0cywgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICIgICAgcmV0dXJuX2Zyb21fdGhpc19tZXRob2RfdXNlZD89JVggcmVzX3N0YWNrICVwIFdhbGsgJXBcbiIsCisJCQkgIHdhbGtfc3RhdGUtPnJldHVybl91c2VkLAorCQkJICB3YWxrX3N0YXRlLT5yZXN1bHRzLCB3YWxrX3N0YXRlKSk7CiAKIAkvKiBEaWQgdGhlIGNhbGxlZCBtZXRob2QgcmV0dXJuIGEgdmFsdWU/ICovCiAKQEAgLTQzNSwxMCArNDUxLDEwIEBACiAJCWlmICh3YWxrX3N0YXRlLT5yZXR1cm5fdXNlZCkgewogCQkJLyogU2F2ZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHByZXZpb3VzIG1ldGhvZCAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wdXNoIChyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcHVzaChyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCiAJCQkvKgpAQCAtNDU2LDI2ICs0NzIsMjYgQEAKIAkJICogTk9URTogdGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIHRoZSBBU0wgbGFuZ3VhZ2UgZG9lcyBub3QgYWN0dWFsbHkKIAkJICogc3VwcG9ydCB0aGlzIGJlaGF2aW9yLgogCQkgKi8KLQkJZWxzZSBpZiAoIWFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuIChyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSwgRkFMU0UpKSB7CisJCWVsc2UgaWYgKCFhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybgorCQkJIChyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSwgRkFMU0UpKSB7CiAJCQkvKgogCQkJICogRGVsZXRlIHRoZSByZXR1cm4gdmFsdWUgaWYgaXQgd2lsbCBub3QgYmUgdXNlZCBieSB0aGUKIAkJCSAqIGNhbGxpbmcgbWV0aG9kCiAJCQkgKi8KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIFN0YXRlIG9mIHRoZSBtZXRob2QKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBUZXJtaW5hdGUgYSBjb250cm9sIG1ldGhvZC4gIERlbGV0ZSBldmVyeXRoaW5nIHRoYXQgdGhlIG1ldGhvZAogICogICAgICAgICAgICAgIGNyZWF0ZWQsIGRlbGV0ZSBhbGwgbG9jYWxzIGFuZCBhcmd1bWVudHMsIGFuZCBkZWxldGUgdGhlIHBhcnNlCkBAIC00ODMsNjMgKzQ5OSw1OSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3ZvaWQgYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICptZXRob2Rfbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCIsIHdhbGtfc3RhdGUpOwogCiAJaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIFRoZSBjdXJyZW50IG1ldGhvZCBvYmplY3Qgd2FzIHNhdmVkIGluIHRoZSB3YWxrIHN0YXRlICovCiAKIAlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIERlbGV0ZSBhbGwgYXJndW1lbnRzIGFuZCBsb2NhbHMgKi8KIAotCWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCAod2Fsa19zdGF0ZSk7CisJYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsKHdhbGtfc3RhdGUpOwogCiAJLyoKIAkgKiBMb2NrIHRoZSBwYXJzZXIgd2hpbGUgd2UgdGVybWluYXRlIHRoaXMgbWV0aG9kLgogCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgdGhyZWFkIGV4ZWN1dGluZyB0aGUgbWV0aG9kLAogCSAqIHdlIGhhdmUgYWRkaXRpb25hbCBjbGVhbnVwIHRvIHBlcmZvcm0KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX1BBUlNFUik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1BBUlNFUik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIFNpZ25hbCBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QgaWYgbmVjZXNzYXJ5ICovCiAKIAlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpIHsKLQkJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlICgKLQkJCQkgIHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlLCAxKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHNpZ25hbCBtZXRob2Qgc2VtYXBob3JlXG4iKSk7Ci0JCQlzdGF0dXMgPSBBRV9PSzsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkgICAgIHNlbWFwaG9yZSwgMSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3Qgc2lnbmFsIG1ldGhvZCBzZW1hcGhvcmVcbiIpKTsKIAogCQkJLyogSWdub3JlIGVycm9yIGFuZCBjb250aW51ZSBjbGVhbnVwICovCiAJCX0KIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiKioqIE5vdCBkZWxldGluZyBtZXRob2QgbmFtZXNwYWNlLCB0aGVyZSBhcmUgc3RpbGwgJWQgdGhyZWFkc1xuIiwKLQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50KSk7Ci0JfQorCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIioqKiBOb3QgZGVsZXRpbmcgbWV0aG9kIG5hbWVzcGFjZSwgdGhlcmUgYXJlIHN0aWxsICVkIHRocmVhZHNcbiIsCisJCQkJICB3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCSAgdGhyZWFkX2NvdW50KSk7CisJfSBlbHNlIHsJCS8qIFRoaXMgaXMgdGhlIGxhc3QgZXhlY3V0aW5nIHRocmVhZCAqLwogCi0JaWYgKCF3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCkgewogCQkvKgogCQkgKiBTdXBwb3J0IHRvIGR5bmFtaWNhbGx5IGNoYW5nZSBhIG1ldGhvZCBmcm9tIG5vdF9zZXJpYWxpemVkIHRvCiAJCSAqIFNlcmlhbGl6ZWQgaWYgaXQgYXBwZWFycyB0aGF0IHRoZSBtZXRob2QgaXMgd3JpdHRlbiBmb29saXNobHkgYW5kCkBAIC01NTEsMTAgKzU2MywxMSBAQAogCQkgKiBiZWZvcmUgY3JlYXRpbmcgdGhlIHN5bmNocm9uaXphdGlvbiBzZW1hcGhvcmUuCiAJCSAqLwogCQlpZiAoKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPT0gMSkgJiYKLQkJCSghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKDEsCi0JCQkJCSAxLAotCQkJCQkgJndhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKTsKKwkJICAgICghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CisJCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoMSwgMSwKKwkJCQkJCQkgICZ3YWxrX3N0YXRlLT4KKwkJCQkJCQkgIG1ldGhvZF9kZXNjLT5tZXRob2QuCisJCQkJCQkJICBzZW1hcGhvcmUpOwogCQl9CiAKIAkJLyoKQEAgLTU2OSwyOCArNTgyLDI3IEBACiAJCSAqIERlbGV0ZSBhbnkgbmFtZXNwYWNlIGVudHJpZXMgY3JlYXRlZCBpbW1lZGlhdGVseSB1bmRlcm5lYXRoCiAJCSAqIHRoZSBtZXRob2QKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQlpZiAobWV0aG9kX25vZGUtPmNoaWxkKSB7Ci0JCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSAobWV0aG9kX25vZGUpOworCQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUobWV0aG9kX25vZGUpOwogCQl9CiAKIAkJLyoKIAkJICogRGVsZXRlIGFueSBuYW1lc3BhY2UgZW50cmllcyBjcmVhdGVkIGFueXdoZXJlIGVsc2Ugd2l0aGluCiAJCSAqIHRoZSBuYW1lc3BhY2UKIAkJICovCi0JCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5vd25pbmdfaWQpOwotCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQkJfQorCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPgorCQkJCQkJICBtZXRob2Qub3duZXJfaWQpOworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZ3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkgb3duZXJfaWQpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfUEFSU0VSKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICBleGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9QQVJTRVIpOworCXJldHVybl9WT0lEOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCmluZGV4IGY3OTk4MzAuLjQwOTVjZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYwpAQCAtNDEsNDEgKzQxLDMyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNtdGhkYXQiKQorQUNQSV9NT0RVTEVfTkFNRSgiZHNtdGhkYXQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB2b2lkCi1hY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlKHUxNiBvcGNvZGUsCisJCQkJIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUodTE2IG9wY29kZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIGFjcGlfb2JqZWN0X3R5cGUKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlKHUxNiBvcGNvZGUsCisJCQkgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXQKQEAgLTk3LDQ1ICs4OCw0MSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3ZvaWQgYWNwaV9kc19tZXRob2RfZGF0YV9pbml0KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfaW5pdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfaW5pdCIpOwogCiAJLyogSW5pdCB0aGUgbWV0aG9kIGFyZ3VtZW50cyAqLwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTUVUSE9EX05VTV9BUkdTOyBpKyspIHsKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUsCisJCUFDUElfTU9WRV8zMl9UT18zMigmd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUsCiAJCQkJICAgTkFNRU9GX0FSR19OVEUpOwogCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0ubmFtZS5pbnRlZ2VyIHw9IChpIDw8IDI0KTsKLQkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmRlc2NyaXB0b3IgICA9IEFDUElfREVTQ19UWVBFX05BTUVEOwotCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0udHlwZSAgICAgICAgID0gQUNQSV9UWVBFX0FOWTsKLQkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmZsYWdzICAgICAgICA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgfAotCQkJCSAgQU5PQkpfTUVUSE9EX0FSRzsKKwkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmRlc2NyaXB0b3IgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKKwkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0uZmxhZ3MgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKKwkJICAgIEFOT0JKX01FVEhPRF9BUkc7CiAJfQogCiAJLyogSW5pdCB0aGUgbWV0aG9kIGxvY2FscyAqLwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTUVUSE9EX05VTV9MT0NBTFM7IGkrKykgewotCQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZ3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0ubmFtZSwKKwkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZ3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0ubmFtZSwKIAkJCQkgICBOQU1FT0ZfTE9DQUxfTlRFKTsKIAogCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0ubmFtZS5pbnRlZ2VyIHw9IChpIDw8IDI0KTsKLQkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLmRlc2NyaXB0b3IgID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7Ci0JCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS50eXBlICAgICAgICA9IEFDUElfVFlQRV9BTlk7Ci0JCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5mbGFncyAgICAgICA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgfAotCQkJCSBBTk9CSl9NRVRIT0RfTE9DQUw7CisJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5kZXNjcmlwdG9yID0KKwkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEOworCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0udHlwZSA9IEFDUElfVFlQRV9BTlk7CisJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5mbGFncyA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgfAorCQkgICAgQU5PQkpfTUVUSE9EX0xPQ0FMOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbApAQCAtMTQ5LDI2ICsxMzYsMjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit2b2lkIGFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJdTMyIGluZGV4OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCIpOwogCiAJLyogRGV0YWNoIHRoZSBsb2NhbHMgKi8KIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEFDUElfTUVUSE9EX05VTV9MT0NBTFM7IGluZGV4KyspIHsKIAkJaWYgKHdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF0ub2JqZWN0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiRGVsZXRpbmcgTG9jYWwlZD0lcFxuIiwKLQkJCQkJaW5kZXgsIHdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF0ub2JqZWN0KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJEZWxldGluZyBMb2NhbCVkPSVwXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIHdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF0uCisJCQkJCSAgb2JqZWN0KSk7CiAKIAkJCS8qIERldGFjaCBvYmplY3QgKGlmIHByZXNlbnQpIGFuZCByZW1vdmUgYSByZWZlcmVuY2UgKi8KIAotCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgmd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2luZGV4XSk7CisJCQlhY3BpX25zX2RldGFjaF9vYmplY3QoJndhbGtfc3RhdGUtPgorCQkJCQkgICAgICBsb2NhbF92YXJpYWJsZXNbaW5kZXhdKTsKIAkJfQogCX0KIApAQCAtMTc2LDE5ICsxNjIsMTkgQEAKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEFDUElfTUVUSE9EX05VTV9BUkdTOyBpbmRleCsrKSB7CiAJCWlmICh3YWxrX3N0YXRlLT5hcmd1bWVudHNbaW5kZXhdLm9iamVjdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkRlbGV0aW5nIEFyZyVkPSVwXG4iLAotCQkJCQlpbmRleCwgd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2luZGV4XS5vYmplY3QpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkRlbGV0aW5nIEFyZyVkPSVwXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIHdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpbmRleF0ub2JqZWN0KSk7CiAKIAkJCS8qIERldGFjaCBvYmplY3QgKGlmIHByZXNlbnQpIGFuZCByZW1vdmUgYSByZWZlcmVuY2UgKi8KIAotCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgmd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2luZGV4XSk7CisJCQlhY3BpX25zX2RldGFjaF9vYmplY3QoJndhbGtfc3RhdGUtPmFyZ3VtZW50c1tpbmRleF0pOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MKQEAgLTIwNiw0NyArMTkyLDQ0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGFyYW1fY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipwYXJhbXMsCisJCQkgICAgICB1MzIgbWF4X3BhcmFtX2NvdW50LAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGluZGV4ID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19tZXRob2RfZGF0YV9pbml0X2FyZ3MiLCBwYXJhbXMpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX21ldGhvZF9kYXRhX2luaXRfYXJncyIsIHBhcmFtcyk7CiAKIAlpZiAoIXBhcmFtcykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiTm8gcGFyYW0gbGlzdCBwYXNzZWQgdG8gbWV0aG9kXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiTm8gcGFyYW0gbGlzdCBwYXNzZWQgdG8gbWV0aG9kXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogQ29weSBwYXNzZWQgcGFyYW1ldGVycyBpbnRvIHRoZSBuZXcgbWV0aG9kIHN0YWNrIGZyYW1lICovCiAKIAl3aGlsZSAoKGluZGV4IDwgQUNQSV9NRVRIT0RfTlVNX0FSR1MpICYmCi0JCSAgIChpbmRleCA8IG1heF9wYXJhbV9jb3VudCkgICAgICAmJgotCQkJcGFyYW1zW2luZGV4XSkgeworCSAgICAgICAoaW5kZXggPCBtYXhfcGFyYW1fY291bnQpICYmIHBhcmFtc1tpbmRleF0pIHsKIAkJLyoKIAkJICogQSB2YWxpZCBwYXJhbWV0ZXIuCiAJCSAqIFN0b3JlIHRoZSBhcmd1bWVudCBpbiB0aGUgbWV0aG9kL3dhbGsgZGVzY3JpcHRvci4KIAkJICogRG8gbm90IGNvcHkgdGhlIGFyZyBpbiBvcmRlciB0byBpbXBsZW1lbnQgY2FsbCBieSByZWZlcmVuY2UKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlIChBTUxfQVJHX09QLCBpbmRleCwKLQkJCQkgcGFyYW1zW2luZGV4XSwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUoQU1MX0FSR19PUCwgaW5kZXgsCisJCQkJCQkgICAgICAgcGFyYW1zW2luZGV4XSwKKwkJCQkJCSAgICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCWluZGV4Kys7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVkIGFyZ3MgcGFzc2VkIHRvIG1ldGhvZFxuIiwgaW5kZXgpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlZCBhcmdzIHBhc3NlZCB0byBtZXRob2RcbiIsIGluZGV4KSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlCkBAIC0yNjMsMTQgKzI0NiwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqbm9kZSkKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUodTE2IG9wY29kZSwKKwkJCSAgICAgdTMyIGluZGV4LAorCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm5vZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX21ldGhvZF9kYXRhX2dldF9ub2RlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19tZXRob2RfZGF0YV9nZXRfbm9kZSIpOwogCiAJLyoKIAkgKiBNZXRob2QgTG9jYWxzIGFuZCBBcmd1bWVudHMgYXJlIHN1cHBvcnRlZApAQCAtMjc5LDEwICsyNjAsMTAgQEAKIAljYXNlIEFNTF9MT0NBTF9PUDoKIAogCQlpZiAoaW5kZXggPiBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJMb2NhbCBpbmRleCAlZCBpcyBpbnZhbGlkIChtYXggJWQpXG4iLAotCQkJCWluZGV4LCBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfSU5ERVgpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCQkJICBpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfSU5ERVgpOwogCQl9CiAKIAkJLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcHNldWRvLW5vZGUgKi8KQEAgLTI5MywxMCArMjc0LDEwIEBACiAJY2FzZSBBTUxfQVJHX09QOgogCiAJCWlmIChpbmRleCA+IEFDUElfTUVUSE9EX01BWF9BUkcpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKLQkJCQlpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0FSRykpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9JTkRFWCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCQkJICBpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0FSRykpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKIAkJfQogCiAJCS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBzZXVkby1ub2RlICovCkBAIC0zMDUsMTQgKzI4NiwxNCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiT3Bjb2RlICVkIGlzIGludmFsaWRcbiIsIG9wY29kZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfT1BDT0RFKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk9wY29kZSAlZCBpcyBpbnZhbGlkXG4iLAorCQkJCSAgb3Bjb2RlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX09QQ09ERSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZQpAQCAtMzMwLDI5ICszMTEsMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZSh1MTYgb3Bjb2RlLAorCQkJICAgICAgdTMyIGluZGV4LAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX3NldF92YWx1ZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX21ldGhvZF9kYXRhX3NldF92YWx1ZSIpOwotCi0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkibmV3X29iaiAlcCBPcGNvZGUgJVgsIFJlZnM9JWQgWyVzXVxuIiwgb2JqZWN0LAotCQlvcGNvZGUsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCwKLQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3QtPmNvbW1vbi50eXBlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIm5ld19vYmogJXAgT3Bjb2RlICVYLCBSZWZzPSVkIFslc11cbiIsIG9iamVjdCwKKwkJCSAgb3Bjb2RlLCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQsCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3QtPmNvbW1vbi50eXBlKSkpOwogCiAJLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMzYxLDE1ICszMzksMTQgQEAKIAkgKiByZWZlcmVuY2Ugc2VtYW50aWNzIG9mIEFDUEkgQ29udHJvbCBNZXRob2QgaW52b2NhdGlvbi4KIAkgKiAoU2VlIEFDUEkgc3BlY2lmaWNhdGlvbiAyLjBfYykKIAkgKi8KLQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9iamVjdCk7CisJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9iamVjdCk7CiAKIAkvKiBJbnN0YWxsIHRoZSBvYmplY3QgKi8KIAogCW5vZGUtPm9iamVjdCA9IG9iamVjdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUKQEAgLTM4NywzMiArMzY0LDMwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqZGVzdF9kZXNjKQorYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUodTE2IG9wY29kZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGVzdF9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9nZXRfdmFsdWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2dldF92YWx1ZSIpOwogCiAJLyogVmFsaWRhdGUgdGhlIG9iamVjdCBkZXNjcmlwdG9yICovCiAKIAlpZiAoIWRlc3RfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgb2JqZWN0IGRlc2NyaXB0b3IgcG9pbnRlclxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk51bGwgb2JqZWN0IGRlc2NyaXB0b3IgcG9pbnRlclxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBub2RlICovCkBAIC00MzMsOSArNDA4LDEwIEBACiAJCS8qIElmIHNsYWNrIGVuYWJsZWQsIGluaXQgdGhlIGxvY2FsX3gvYXJnX3ggdG8gYW4gSW50ZWdlciBvZiB2YWx1ZSB6ZXJvICovCiAKIAkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgewotCQkJb2JqZWN0ID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCQlvYmplY3QgPQorCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCQlpZiAoIW9iamVjdCkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCX0KIAogCQkJb2JqZWN0LT5pbnRlZ2VyLnZhbHVlID0gMDsKQEAgLTQ0NCwyNyArNDIwLDI5IEBACiAKIAkJLyogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGVycm9yICovCiAKLQkJZWxzZSBzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIEFNTF9BUkdfT1A6CisJCWVsc2UKKwkJCXN3aXRjaCAob3Bjb2RlKSB7CisJCQljYXNlIEFNTF9BUkdfT1A6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwKLQkJCQlpbmRleCwgbm9kZSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwKKwkJCQkJCSAgaW5kZXgsIG5vZGUpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfVU5JTklUSUFMSVpFRF9BUkcpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfVU5JTklUSUFMSVpFRF9BUkcpOwogCi0JCWNhc2UgQU1MX0xPQ0FMX09QOgorCQkJY2FzZSBBTUxfTE9DQUxfT1A6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJVbmluaXRpYWxpemVkIExvY2FsWyVkXSBhdCBub2RlICVwXG4iLAotCQkJCWluZGV4LCBub2RlKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIlVuaW5pdGlhbGl6ZWQgTG9jYWxbJWRdIGF0IG5vZGUgJXBcbiIsCisJCQkJCQkgIGluZGV4LCBub2RlKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfVU5JTklUSUFMSVpFRF9MT0NBTCk7CiAKLQkJZGVmYXVsdDoKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIk5vdCBBcmcvTG9jYWwgb3Bjb2RlOiAlWFxuIiwgb3Bjb2RlKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCX0KKwkJCWRlZmF1bHQ6CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOb3QgQXJnL0xvY2FsIG9wY29kZTogJVhcbiIsCisJCQkJCQkgICBvcGNvZGUpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKKwkJCX0KIAl9CiAKIAkvKgpAQCAtNDcyLDEyICs0NTAsMTEgQEAKIAkgKiBSZXR1cm4gYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdAogCSAqLwogCSpkZXN0X2Rlc2MgPSBvYmplY3Q7Ci0JYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmplY3QpOworCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmplY3QpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZQpAQCAtNDk0LDI5ICs0NzEsMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUodTE2IG9wY29kZSwKKwkJCQkgdTMyIGluZGV4LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSIpOwogCiAJLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogR2V0IHRoZSBhc3NvY2lhdGVkIG9iamVjdCAqLwogCi0Jb2JqZWN0ID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAKIAkvKgogCSAqIFVuZGVmaW5lIHRoZSBBcmcgb3IgTG9jYWwgYnkgc2V0dGluZyBpdHMgZGVzY3JpcHRvcgpAQCAtNTI2LDE5ICs0OTksMTggQEAKIAlub2RlLT5vYmplY3QgPSBOVUxMOwogCiAJaWYgKChvYmplY3QpICYmCi0JCShBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkpIHsKKwkgICAgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpKSB7CiAJCS8qCiAJCSAqIFRoZXJlIGlzIGEgdmFsaWQgb2JqZWN0LgogCQkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBieSBvbmUgdG8gYmFsYW5jZSB0aGUKIAkJICogaW5jcmVtZW50IHdoZW4gdGhlIG9iamVjdCB3YXMgc3RvcmVkLgogCQkgKi8KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmplY3QpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqZWN0KTsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbApAQCAtNTU3LDQwICs1MjksMzggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwodTE2IG9wY29kZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmN1cnJlbnRfb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbmV3X29ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpjdXJyZW50X29ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5ld19vYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX3N0b3JlX29iamVjdF90b19sb2NhbCIpOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPcGNvZGU9JVggSW5kZXg9JWQgT2JqPSVwXG4iLAotCQlvcGNvZGUsIGluZGV4LCBvYmpfZGVzYykpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX3N0b3JlX29iamVjdF90b19sb2NhbCIpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9wY29kZT0lWCBJbmRleD0lZCBPYmo9JXBcbiIsCisJCQkgIG9wY29kZSwgaW5kZXgsIG9ial9kZXNjKSk7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQljdXJyZW50X29ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwljdXJyZW50X29ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmIChjdXJyZW50X29ial9kZXNjID09IG9ial9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgYWxyZWFkeSBpbnN0YWxsZWQhXG4iLAotCQkJb2JqX2Rlc2MpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgYWxyZWFkeSBpbnN0YWxsZWQhXG4iLAorCQkJCSAgb2JqX2Rlc2MpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTYwMiw5ICs1NzIsMTEgQEAKIAkgKi8KIAluZXdfb2JqX2Rlc2MgPSBvYmpfZGVzYzsKIAlpZiAob2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPiAxKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QgKG9ial9kZXNjLCAmbmV3X29ial9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdChvYmpfZGVzYywgJm5ld19vYmpfZGVzYywKKwkJCQkJCSAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtNjMzLDQyICs2MDUsMzkgQEAKIAkJICovCiAJCWlmIChvcGNvZGUgPT0gQU1MX0FSR19PUCkgewogCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBvYmplY3QgaXMgdGhlIGNvcnJlY3QgdHlwZS4gIFRoaXMgbWF5IGJlCi0JCQkgKiBvdmVya2lsbCwgYnV0aXQgaXMgaGVyZSBiZWNhdXNlIHJlZmVyZW5jZXMgd2VyZSBOUyBub2RlcyBpbgotCQkJICogIHRoZSBwYXN0LiAgTm93IHRoZXkgYXJlIG9wZXJhbmQgb2JqZWN0cyBvZiB0eXBlIFJlZmVyZW5jZS4KLQkJCSAqLwotCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoY3VycmVudF9vYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSB3aGlsZSBzdG9yaW5nIHRvIG1ldGhvZCBhcmc6IFslc11cbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoY3VycmVudF9vYmpfZGVzYykpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCQl9Ci0KLQkJCS8qCiAJCQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIG9iamVjdCB0aGF0IGNhbWUgZnJvbSByZWZfb2YoKSwKIAkJCSAqIGRvIHRoZSBpbmRpcmVjdCBzdG9yZQogCQkJICovCi0JCQlpZiAoKGN1cnJlbnRfb2JqX2Rlc2MtPmNvbW1vbi50eXBlID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpICYmCi0JCQkJKGN1cnJlbnRfb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX1JFRl9PRl9PUCkpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJCQkJIkFyZyAoJXApIGlzIGFuIG9ial9yZWYoTm9kZSksIHN0b3JpbmcgaW4gbm9kZSAlcFxuIiwKLQkJCQkJCW5ld19vYmpfZGVzYywgY3VycmVudF9vYmpfZGVzYykpOworCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoY3VycmVudF9vYmpfZGVzYykgPT0KKwkJCSAgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkJCSAgICAmJiAoY3VycmVudF9vYmpfZGVzYy0+Y29tbW9uLnR5cGUgPT0KKwkJCQlBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmIChjdXJyZW50X29ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09CisJCQkJQU1MX1JFRl9PRl9PUCkpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICJBcmcgKCVwKSBpcyBhbiBvYmpfcmVmKE5vZGUpLCBzdG9yaW5nIGluIG5vZGUgJXBcbiIsCisJCQkJCQkgIG5ld19vYmpfZGVzYywKKwkJCQkJCSAgY3VycmVudF9vYmpfZGVzYykpOwogCiAJCQkJLyoKIAkJCQkgKiBTdG9yZSB0aGlzIG9iamVjdCB0byB0aGUgTm9kZSAocGVyZm9ybSB0aGUgaW5kaXJlY3Qgc3RvcmUpCiAJCQkJICogTk9URTogTm8gaW1wbGljaXQgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGFzIHBlciB0aGUgQUNQSQogCQkJCSAqIHNwZWNpZmljYXRpb24gcnVsZXMgb24gc3RvcmluZyB0byBMb2NhbHMvQXJncy4KIAkJCQkgKi8KLQkJCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlIChuZXdfb2JqX2Rlc2MsCi0JCQkJCQkgY3VycmVudF9vYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwgd2Fsa19zdGF0ZSwKLQkJCQkJCSBBQ1BJX05PX0lNUExJQ0lUX0NPTlZFUlNJT04pOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUobmV3X29ial9kZXNjLAorCQkJCQkJCQkgY3VycmVudF9vYmpfZGVzYy0+CisJCQkJCQkJCSByZWZlcmVuY2UuCisJCQkJCQkJCSBvYmplY3QsCisJCQkJCQkJCSB3YWxrX3N0YXRlLAorCQkJCQkJCQkgQUNQSV9OT19JTVBMSUNJVF9DT05WRVJTSU9OKTsKIAogCQkJCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgaWYgd2UgY29waWVkIHRoZSBvYmplY3QgYWJvdmUgKi8KIAogCQkJCWlmIChuZXdfb2JqX2Rlc2MgIT0gb2JqX2Rlc2MpIHsKLQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChuZXdfb2JqX2Rlc2MpOworCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobmV3X29ial9kZXNjKTsKIAkJCQl9Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAKQEAgLTY3Niw3ICs2NDUsNyBAQAogCQkgKiBEZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdAogCQkgKiBiZWZvcmUgc3RvcmluZyB0aGUgbmV3IG9uZQogCQkgKi8KLQkJYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUpOworCQlhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZShvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlKTsKIAl9CiAKIAkvKgpAQCAtNjg0LDE4ICs2NTMsMTkgQEAKIAkgKiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIEFyZyBvciBMb2NhbC4KIAkgKiAoaW5jcmVtZW50cyB0aGUgb2JqZWN0IHJlZmVyZW5jZSBjb3VudCBieSBvbmUpCiAJICovCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKG9wY29kZSwgaW5kZXgsIG5ld19vYmpfZGVzYywgd2Fsa19zdGF0ZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUob3Bjb2RlLCBpbmRleCwgbmV3X29ial9kZXNjLAorCQkJCQkgIHdhbGtfc3RhdGUpOwogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSBpZiB3ZSBjb3BpZWQgdGhlIG9iamVjdCBhYm92ZSAqLwogCiAJaWYgKG5ld19vYmpfZGVzYyAhPSBvYmpfZGVzYykgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG5ld19vYmpfZGVzYyk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShuZXdfb2JqX2Rlc2MpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzEyLDM5ICs2ODIsMzMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfb2JqZWN0X3R5cGUKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUodTE2IG9wY29kZSwKKwkJCSAgICAgdTMyIGluZGV4LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9nZXRfdHlwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUiKTsKIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9WQUxVRSAoKEFDUElfVFlQRV9OT1RfRk9VTkQpKTsKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZBTFVFKChBQ1BJX1RZUEVfTk9UX0ZPVU5EKSk7CiAJfQogCiAJLyogR2V0IHRoZSBvYmplY3QgKi8KIAotCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqZWN0ID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqZWN0KSB7CiAJCS8qIFVuaW5pdGlhbGl6ZWQgbG9jYWwvYXJnLCByZXR1cm4gVFlQRV9BTlkgKi8KIAotCQlyZXR1cm5fVkFMVUUgKEFDUElfVFlQRV9BTlkpOworCQlyZXR1cm5fVkFMVUUoQUNQSV9UWVBFX0FOWSk7CiAJfQogCiAJLyogR2V0IHRoZSBvYmplY3QgdHlwZSAqLwogCi0JcmV0dXJuX1ZBTFVFIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqZWN0KSk7CisJcmV0dXJuX1ZBTFVFKEFDUElfR0VUX09CSkVDVF9UWVBFKG9iamVjdCkpOwogfQogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKaW5kZXggYmZiYWU0ZS4uOGFjMGNkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNTAsMTQgKzQ5LDEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc29iamVjdCIpCitBQ1BJX01PRFVMRV9OQU1FKCJkc29iamVjdCIpCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjX3B0cik7Ci0KK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKTsKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NiwxNyArNzMsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjX3B0cikKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2J1aWxkX2ludGVybmFsX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0Iik7CiAKIAkqb2JqX2Rlc2NfcHRyID0gTlVMTDsKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKQEAgLTk2LDQwICs5MCw0NCBAQAogCQkgKiBPdGhlcndpc2UsIGdvIGFoZWFkIGFuZCBsb29rIGl0IHVwIG5vdwogCQkgKi8KIAkJaWYgKCFvcC0+Y29tbW9uLm5vZGUpIHsKLQkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAotCQkJCQkgIG9wLT5jb21tb24udmFsdWUuc3RyaW5nLAotCQkJCQkgIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkJICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKLQkJCQkJICBOVUxMLAotCQkJCQkgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKikgJihvcC0+Y29tbW9uLm5vZGUpKTsKKwkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCisJCQkJCQlvcC0+Y29tbW9uLnZhbHVlLnN0cmluZywKKwkJCQkJCUFDUElfVFlQRV9BTlksCisJCQkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJCQlBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfAorCQkJCQkJQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsCisJCQkJCQkoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopCisJCQkJCQkmKG9wLT5jb21tb24ubm9kZSkpOwogCi0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAob3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihvcC0+Y29tbW9uLnZhbHVlLnN0cmluZywKKwkJCQkJCSAgICBzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAJfQogCiAJLyogQ3JlYXRlIGFuZCBpbml0IHRoZSBpbnRlcm5hbCBBQ1BJIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKAotCQkJIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSktPm9iamVjdF90eXBlKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCgoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KKwkJCQkJCSAgIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+CisJCQkJCQkgIG9iamVjdF90eXBlKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICh3YWxrX3N0YXRlLCBvcCwgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAotCQkJICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCh3YWxrX3N0YXRlLCBvcCwgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJCQkmb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkqb2JqX2Rlc2NfcHRyID0gb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmoKQEAgLTE0NywyMCArMTQ1LDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2NfcHRyKQorYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkJICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkJICB1MzIgYnVmZmVyX2xlbmd0aCwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzY19wdHIpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmJ5dGVfbGlzdDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfbGlzdF9sZW5ndGggPSAwOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmJ5dGVfbGlzdDsKKwl1MzIgYnl0ZV9saXN0X2xlbmd0aCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqIik7CiAKIAlvYmpfZGVzYyA9ICpvYmpfZGVzY19wdHI7CiAJaWYgKG9ial9kZXNjKSB7CkBAIC0xNjgsMTQgKzE2MywxMyBAQAogCQkgKiBXZSBhcmUgZXZhbHVhdGluZyBhIE5hbWVkIGJ1ZmZlciBvYmplY3QgIk5hbWUgKHh4eHgsIEJ1ZmZlcikiLgogCQkgKiBUaGUgYnVmZmVyIG9iamVjdCBhbHJlYWR5IGV4aXN0cyAoZnJvbSB0aGUgTlMgbm9kZSkKIAkJICovCi0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIENyZWF0ZSBhIG5ldyBidWZmZXIgb2JqZWN0ICovCiAKLQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9CVUZGRVIpOworCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSKTsKIAkJKm9ial9kZXNjX3B0ciA9IG9ial9kZXNjOwogCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCX0KIApAQCAtMTg0LDE2ICsxNzgsMTcgQEAKIAkgKiBpbmRpdmlkdWFsIGJ5dGVzIG9yIGEgc3RyaW5nIGluaXRpYWxpemVyLiAgSW4gZWl0aGVyIGNhc2UsIGEKIAkgKiBieXRlX2xpc3QgYXBwZWFycyBpbiB0aGUgQU1MLgogCSAqLwotCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOyAgICAgICAgIC8qIHNraXAgZmlyc3QgYXJnICovCisJYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CS8qIHNraXAgZmlyc3QgYXJnICovCiAKIAlieXRlX2xpc3QgPSBhcmctPm5hbWVkLm5leHQ7CiAJaWYgKGJ5dGVfbGlzdCkgewogCQlpZiAoYnl0ZV9saXN0LT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX0JZVEVMSVNUX09QKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiRXhwZWN0aW5nIGJ5dGVsaXN0LCBnb3QgQU1MIG9wY29kZSAlWCBpbiBvcCAlcFxuIiwKLQkJCQlieXRlX2xpc3QtPmNvbW1vbi5hbWxfb3Bjb2RlLCBieXRlX2xpc3QpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkV4cGVjdGluZyBieXRlbGlzdCwgZ290IEFNTCBvcGNvZGUgJVggaW4gb3AgJXBcbiIsCisJCQkJCSAgYnl0ZV9saXN0LT5jb21tb24uYW1sX29wY29kZSwKKwkJCQkJICBieXRlX2xpc3QpKTsKIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQkJcmV0dXJuIChBRV9UWVBFKTsKIAkJfQogCkBAIC0yMTQsMzEgKzIwOSwyOSBAQAogCiAJaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoID09IDApIHsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gTlVMTDsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJCdWZmZXIgZGVmaW5lZCB3aXRoIHplcm8gbGVuZ3RoIGluIEFNTCwgY3JlYXRpbmdcbiIpKTsKLQl9Ci0JZWxzZSB7Ci0JCW9ial9kZXNjLT5idWZmZXIucG9pbnRlciA9IEFDUElfTUVNX0NBTExPQ0FURSAoCi0JCQkJICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiQnVmZmVyIGRlZmluZWQgd2l0aCB6ZXJvIGxlbmd0aCBpbiBBTUwsIGNyZWF0aW5nXG4iKSk7CisJfSBlbHNlIHsKKwkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0KKwkJICAgIEFDUElfTUVNX0NBTExPQ0FURShvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAJCWlmICghb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAob2JqX2Rlc2MpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQkvKiBJbml0aWFsaXplIGJ1ZmZlciBmcm9tIHRoZSBieXRlX2xpc3QgKGlmIHByZXNlbnQpICovCiAKIAkJaWYgKGJ5dGVfbGlzdCkgewotCQkJQUNQSV9NRU1DUFkgKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwgYnl0ZV9saXN0LT5uYW1lZC5kYXRhLAotCQkJCQkgIGJ5dGVfbGlzdF9sZW5ndGgpOworCQkJQUNQSV9NRU1DUFkob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAgICBieXRlX2xpc3QtPm5hbWVkLmRhdGEsIGJ5dGVfbGlzdF9sZW5ndGgpOwogCQl9CiAJfQogCiAJb2JqX2Rlc2MtPmJ1ZmZlci5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKLQlvcC0+Y29tbW9uLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2M7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqCkBAIC0yNTYsMjggKzI0OSwyNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmogKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2xlbmd0aCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2NfcHRyKQorYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCQkgICB1MzIgcGFja2FnZV9sZW5ndGgsCisJCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjX3B0cikKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmc7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcGFyZW50OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbGlzdF9sZW5ndGg7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjID0gTlVMTDsKKwl1MzIgcGFja2FnZV9saXN0X2xlbmd0aDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaiIpOwogCiAJLyogRmluZCB0aGUgcGFyZW50IG9mIGEgcG9zc2libHkgbmVzdGVkIHBhY2thZ2UgKi8KIAogCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwotCXdoaWxlICgocGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgICAgfHwKLQkJICAgKHBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSkgeworCXdoaWxlICgocGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKKwkgICAgICAgKHBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSkgewogCQlwYXJlbnQgPSBwYXJlbnQtPmNvbW1vbi5wYXJlbnQ7CiAJfQogCkBAIC0yODcsMTIgKzI3NywxMSBAQAogCQkgKiBXZSBhcmUgZXZhbHVhdGluZyBhIE5hbWVkIHBhY2thZ2Ugb2JqZWN0ICJOYW1lICh4eHh4LCBQYWNrYWdlKSIuCiAJCSAqIEdldCB0aGUgZXhpc3RpbmcgcGFja2FnZSBvYmplY3QgZnJvbSB0aGUgTlMgbm9kZQogCQkgKi8KLQl9Ci0JZWxzZSB7Ci0JCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfUEFDS0FHRSk7CisJfSBlbHNlIHsKKwkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1BBQ0tBR0UpOwogCQkqb2JqX2Rlc2NfcHRyID0gb2JqX2Rlc2M7CiAJCWlmICghb2JqX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJb2JqX2Rlc2MtPnBhY2thZ2Uubm9kZSA9IHBhcmVudC0+Y29tbW9uLm5vZGU7CkBAIC0zMjMsMTIgKzMxMiwxMyBAQAogCSAqIGluZGl2aWR1YWwgb2JqZWN0cykuIEFkZCBhbiBleHRyYSBwb2ludGVyIHNsb3Qgc28KIAkgKiB0aGF0IHRoZSBsaXN0IGlzIGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQuCiAJICovCi0Jb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJICgoYWNwaV9zaXplKSBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCArIDEpICogc2l6ZW9mICh2b2lkICopKTsKKwlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkgb2JqX2Rlc2MtPgorCQkJCQkJCSBwYWNrYWdlLmNvdW50ICsKKwkJCQkJCQkgMSkgKiBzaXplb2Yodm9pZCAqKSk7CiAKIAlpZiAoIW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKSB7Ci0JCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjIChvYmpfZGVzYyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKgpAQCAtMzQyLDExICszMzIsMTMgQEAKIAkJCS8qIE9iamVjdCAocGFja2FnZSBvciBidWZmZXIpIGlzIGFscmVhZHkgYnVpbHQgKi8KIAogCQkJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0gPQotCQkJCUFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFyZy0+Y29tbW9uLm5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKHdhbGtfc3RhdGUsIGFyZywKLQkJCQkJICZvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSk7CisJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LAorCQkJCQkgIGFyZy0+Y29tbW9uLm5vZGUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3Qod2Fsa19zdGF0ZSwgYXJnLAorCQkJCQkJCSAgICAgICAmb2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgICBwYWNrYWdlLgorCQkJCQkJCSAgICAgICBlbGVtZW50c1tpXSk7CiAJCX0KIAogCQlpKys7CkBAIC0zNTQsMTEgKzM0NiwxMCBAQAogCX0KIAogCW9ial9kZXNjLT5wYWNrYWdlLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCW9wLT5jb21tb24ubm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2M7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfbm9kZQpAQCAtMzc0LDU3ICszNjUsNTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9ub2RlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCithY3BpX2RzX2NyZWF0ZV9ub2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfY3JlYXRlX25vZGUiLCBvcCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY3JlYXRlX25vZGUiLCBvcCk7CiAKIAkvKgogCSAqIEJlY2F1c2Ugb2YgdGhlIGV4ZWN1dGlvbiBwYXNzIHRocm91Z2ggdGhlIG5vbi1jb250cm9sLW1ldGhvZAogCSAqIHBhcnRzIG9mIHRoZSB0YWJsZSwgd2UgY2FuIGFycml2ZSBoZXJlIHR3aWNlLiAgT25seSBpbml0CiAJICogdGhlIG5hbWVkIG9iamVjdCBub2RlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKIAkgKi8KLQlpZiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlpZiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJaWYgKCFvcC0+Y29tbW9uLnZhbHVlLmFyZykgewogCQkvKiBObyBhcmd1bWVudHMsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBCdWlsZCBhbiBpbnRlcm5hbCBvYmplY3QgZm9yIHRoZSBhcmd1bWVudChzKSAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLAotCQkJICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3Qod2Fsa19zdGF0ZSwgb3AtPmNvbW1vbi52YWx1ZS5hcmcsCisJCQkJCSAgICAgICAmb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBSZS10eXBlIHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIGl0cyBhcmd1bWVudCAqLwogCi0Jbm9kZS0+dHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYyk7CisJbm9kZS0+dHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKTsKIAogCS8qIEF0dGFjaCBvYmogdG8gbm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBvYmpfZGVzYywgbm9kZS0+dHlwZSk7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBub2RlLT50eXBlKTsKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLSNlbmRpZiAvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KLQorI2VuZGlmCQkJCS8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ0NCw1NSArNDMxLDUwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXRfb2JqX2Rlc2MpCithY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICAgdTE2IG9wY29kZSwKKwkJCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0X29ial9kZXNjKQogewotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKm9wX2luZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2luaXRfb2JqZWN0X2Zyb21fb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2luaXRfb2JqZWN0X2Zyb21fb3AiKTsKIAogCW9ial9kZXNjID0gKnJldF9vYmpfZGVzYzsKLQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wY29kZSk7CisJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7CiAJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CiAJCS8qIFVua25vd24gb3Bjb2RlICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOwogCX0KIAogCS8qIFBlcmZvcm0gcGVyLW9iamVjdCBpbml0aWFsaXphdGlvbiAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKIAkJLyoKIAkJICogRGVmZXIgZXZhbHVhdGlvbiBvZiBCdWZmZXIgdGVybV9hcmcgb3BlcmFuZAogCQkgKi8KLQkJb2JqX2Rlc2MtPmJ1ZmZlci5ub2RlICAgICA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQotCQkJCSAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQlvYmpfZGVzYy0+YnVmZmVyLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCQlvYmpfZGVzYy0+YnVmZmVyLmFtbF9zdGFydCA9IG9wLT5uYW1lZC5kYXRhOwogCQlvYmpfZGVzYy0+YnVmZmVyLmFtbF9sZW5ndGggPSBvcC0+bmFtZWQubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAogCQkvKgogCQkgKiBEZWZlciBldmFsdWF0aW9uIG9mIFBhY2thZ2UgdGVybV9hcmcgb3BlcmFuZAogCQkgKi8KLQkJb2JqX2Rlc2MtPnBhY2thZ2Uubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJCQkgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwkJb2JqX2Rlc2MtPnBhY2thZ2Uubm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAJCW9ial9kZXNjLT5wYWNrYWdlLmFtbF9zdGFydCA9IG9wLT5uYW1lZC5kYXRhOwogCQlvYmpfZGVzYy0+cGFja2FnZS5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKIAkJc3dpdGNoIChvcF9pbmZvLT50eXBlKSB7CkBAIC01MjUsNyArNTA3LDcgQEAKIAkJCQkvKiBUcnVuY2F0ZSB2YWx1ZSBpZiB3ZSBhcmUgZXhlY3V0aW5nIGZyb20gYSAzMi1iaXQgQUNQSSB0YWJsZSAqLwogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCQkJCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKG9ial9kZXNjKTsKKwkJCQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKG9ial9kZXNjKTsKICNlbmRpZgogCQkJCWJyZWFrOwogCkBAIC01MzYsMzMgKzUxOCwzNiBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWFxuIiwgb3Bjb2RlKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIlVua25vd24gY29uc3RhbnQgb3Bjb2RlICVYXG4iLAorCQkJCQkJICBvcGNvZGUpKTsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9UWVBFX0xJVEVSQUw6CiAKIAkJCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gb3AtPmNvbW1vbi52YWx1ZS5pbnRlZ2VyOworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKwkJCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUob2JqX2Rlc2MpOworI2VuZGlmCiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gSW50ZWdlciB0eXBlICVYXG4iLAotCQkJCW9wX2luZm8tPnR5cGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVua25vd24gSW50ZWdlciB0eXBlICVYXG4iLAorCQkJCQkgIG9wX2luZm8tPnR5cGUpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCW9ial9kZXNjLT5zdHJpbmcucG9pbnRlciA9IG9wLT5jb21tb24udmFsdWUuc3RyaW5nOwotCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIEFDUElfU1RSTEVOIChvcC0+Y29tbW9uLnZhbHVlLnN0cmluZyk7CisJCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoID0KKwkJICAgICh1MzIpIEFDUElfU1RSTEVOKG9wLT5jb21tb24udmFsdWUuc3RyaW5nKTsKIAogCQkvKgogCQkgKiBUaGUgc3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgQUNQSSB0YWJsZSwgZG9uJ3QgZXZlciB0cnkKQEAgLTU3MSwxMSArNTU2LDkgQEAKIAkJb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyB8PSBBT1BPQkpfU1RBVElDX1BPSU5URVI7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJc3dpdGNoIChvcF9pbmZvLT50eXBlKSB7CkBAIC01ODcsMTQgKzU3MCwxNyBAQAogCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgPSBvcGNvZGUgLSBBTUxfTE9DQUxfT1A7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfTE9DQUxfT1AsCi0JCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKLQkJCQkJIHdhbGtfc3RhdGUsCi0JCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKEFNTF9MT0NBTF9PUCwKKwkJCQkJCQkgICAgICBvYmpfZGVzYy0+CisJCQkJCQkJICAgICAgcmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJCQkgICAgICB3YWxrX3N0YXRlLAorCQkJCQkJCSAgICAgIChzdHJ1Y3QKKwkJCQkJCQkgICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCSAgICAgICAqKikmb2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgIHJlZmVyZW5jZS5vYmplY3QpOwogI2VuZGlmCiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5UOgogCiAJCQkvKiBTcGxpdCB0aGUgb3Bjb2RlIGludG8gYSBiYXNlIG9wY29kZSArIG9mZnNldCAqLwpAQCAtNjAzLDE0ICs1ODksMTggQEAKIAkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ID0gb3Bjb2RlIC0gQU1MX0FSR19PUDsKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKEFNTF9BUkdfT1AsCi0JCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKLQkJCQkJIHdhbGtfc3RhdGUsCi0JCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKEFNTF9BUkdfT1AsCisJCQkJCQkJICAgICAgb2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgIHJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCQkJICAgICAgd2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgICAoc3RydWN0CisJCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkgICAgICAgKiopJm9ial9kZXNjLT4KKwkJCQkJCQkgICAgICByZWZlcmVuY2Uub2JqZWN0KTsKICNlbmRpZgogCQkJYnJlYWs7CiAKLQkJZGVmYXVsdDogLyogT3RoZXIgbGl0ZXJhbHMsIGV0Yy4uICovCisJCWRlZmF1bHQ6CS8qIE90aGVyIGxpdGVyYWxzLCBldGMuLiAqLwogCiAJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKIAkJCQkvKiBOb2RlIHdhcyBzYXZlZCBpbiBPcCAqLwpAQCAtNjIzLDE3ICs2MTMsMTUgQEAKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVuaW1wbGVtZW50ZWQgZGF0YSB0eXBlOiAlWFxuIiwKLQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmltcGxlbWVudGVkIGRhdGEgdHlwZTogJVhcbiIsCisJCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKaW5kZXggYmExM2JjYS4uOTM5ZDE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCkBAIC00Miw3ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNTIsMjYgKzUxLDIxIEBACiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc29wY29kZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJkc29wY29kZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnNjb3BlX25vZGUsCisJCQkgIHUzMiBhbWxfbGVuZ3RoLCB1OCAqIGFtbF9zdGFydCk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzY29wZV9ub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29wY29kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpidWZmZXJfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvZmZzZXRfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpsZW5ndGhfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXN1bHRfZGVzYyk7Ci0KK2FjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQodTE2IGFtbF9vcGNvZGUsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2Zmc2V0X2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxlbmd0aF9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfZGVzYyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODksMjYgKzgzLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc2NvcGVfbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGgsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0KQorYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnNjb3BlX25vZGUsCisJCQkgIHUzMiBhbWxfbGVuZ3RoLCB1OCAqIGFtbF9zdGFydCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2V4ZWN1dGVfYXJndW1lbnRzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19leGVjdXRlX2FyZ3VtZW50cyIpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSBhIG5ldyBwYXJzZXIgb3AgdG8gYmUgdGhlIHJvb3Qgb2YgdGhlIHBhcnNlZCB0cmVlCiAJICovCi0Jb3AgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCk7CisJb3AgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfRVZBTF9TVUJUUkVFX09QKTsKIAlpZiAoIW9wKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogU2F2ZSB0aGUgTm9kZSBmb3IgdXNlIGluIGFjcGlfcHNfcGFyc2VfYW1sICovCkBAIC0xMTcsMTYgKzEwNywxNyBAQAogCiAJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHBhcnNlciBzdGF0ZSAqLwogCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKDAsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmICghd2Fsa19zdGF0ZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayAod2Fsa19zdGF0ZSwgb3AsIE5VTEwsIGFtbF9zdGFydCwKLQkJCSAgYW1sX2xlbmd0aCwgTlVMTCwgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlICh3YWxrX3N0YXRlKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBvcCwgTlVMTCwgYW1sX3N0YXJ0LAorCQkJCSAgICAgICBhbWxfbGVuZ3RoLCBOVUxMLCAxKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIE1hcmsgdGhpcyBwYXJzZSBhcyBhIGRlZmVycmVkIG9wY29kZSAqLwpAQCAtMTM2LDUwICsxMjcsNTEgQEAKIAogCS8qIFBhc3MxOiBQYXJzZSB0aGUgZW50aXJlIGRlY2xhcmF0aW9uICovCiAKLQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCAod2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIEdldCBhbmQgaW5pdCB0aGUgT3AgY3JlYXRlZCBhYm92ZSAqLwogCiAJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CiAKIAkvKiBFdmFsdWF0ZSB0aGUgZGVmZXJyZWQgYXJndW1lbnRzICovCiAKLQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfRVZBTF9TVUJUUkVFX09QKTsKKwlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1ApOwogCWlmICghb3ApIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAlvcC0+Y29tbW9uLm5vZGUgPSBzY29wZV9ub2RlOwogCiAJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHBhcnNlciBzdGF0ZSAqLwogCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKDAsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmICghd2Fsa19zdGF0ZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSBhbmQgYXJndW1lbnRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsgKHdhbGtfc3RhdGUsIG9wLCBOVUxMLCBhbWxfc3RhcnQsCi0JCQkgIGFtbF9sZW5ndGgsIE5VTEwsIDMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAod2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIE5VTEwsIGFtbF9zdGFydCwKKwkJCQkgICAgICAgYW1sX2xlbmd0aCwgTlVMTCwgMyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBNYXJrIHRoaXMgZXhlY3V0aW9uIGFzIGEgZGVmZXJyZWQgb3Bjb2RlICovCiAKIAl3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlID0gbm9kZTsKLQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCAod2Fsa19zdGF0ZSk7Ci0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAob3ApOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLX0KKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKIAorICAgICAgY2xlYW51cDoKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xOTUsMzggKzE4NywzNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQorYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpleHRyYV9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZXh0cmFfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMiLCBvYmpfZGVzYyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMiLCBvYmpfZGVzYyk7CiAKIAlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEdldCB0aGUgQU1MIHBvaW50ZXIgKG1ldGhvZCBvYmplY3QpIGFuZCBidWZmZXJfZmllbGQgbm9kZSAqLwogCi0JZXh0cmFfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKG9ial9kZXNjKTsKKwlleHRyYV9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChvYmpfZGVzYyk7CiAJbm9kZSA9IG9ial9kZXNjLT5idWZmZXJfZmllbGQubm9kZTsKIAotCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgbm9kZSwgTlVMTCkpOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbJTQuNHNdIGJ1ZmZlcl9maWVsZCBBcmcgSW5pdFxuIiwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSkpOworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIG5vZGUsIE5VTEwpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJbJTQuNHNdIGJ1ZmZlcl9maWVsZCBBcmcgSW5pdFxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKSk7CiAKIAkvKiBFeGVjdXRlIHRoZSBBTUwgY29kZSBmb3IgdGhlIHRlcm1fYXJnIGFyZ3VtZW50cyAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyAobm9kZSwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpLAotCQkJIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGgsIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMobm9kZSwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSksCisJCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGgsCisJCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cwpAQCAtMjQwLDQwICsyMzAsMzUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2dldF9idWZmZXJfYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9idWZmZXJfYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwogCiAJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBHZXQgdGhlIEJ1ZmZlciBub2RlICovCiAKIAlub2RlID0gb2JqX2Rlc2MtPmJ1ZmZlci5ub2RlOwogCWlmICghbm9kZSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJObyBwb2ludGVyIGJhY2sgdG8gTlMgbm9kZSBpbiBidWZmZXIgb2JqICVwXG4iLCBvYmpfZGVzYykpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gcG9pbnRlciBiYWNrIHRvIE5TIG5vZGUgaW4gYnVmZmVyIG9iaiAlcFxuIiwgb2JqX2Rlc2MpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkJ1ZmZlciBBcmcgSW5pdFxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkJ1ZmZlciBBcmcgSW5pdFxuIikpOwogCiAJLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKG5vZGUsIG5vZGUsCi0JCQkgb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoLCBvYmpfZGVzYy0+YnVmZmVyLmFtbF9zdGFydCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMobm9kZSwgbm9kZSwKKwkJCQkJICAgb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoLAorCQkJCQkgICBvYmpfZGVzYy0+YnVmZmVyLmFtbF9zdGFydCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMKQEAgLTI4Nyw0MCArMjcyLDM2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19nZXRfcGFja2FnZV9hcmd1bWVudHMiLCBvYmpfZGVzYyk7CiAKIAlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEdldCB0aGUgUGFja2FnZSBub2RlICovCiAKIAlub2RlID0gb2JqX2Rlc2MtPnBhY2thZ2Uubm9kZTsKIAlpZiAoIW5vZGUpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiTm8gcG9pbnRlciBiYWNrIHRvIE5TIG5vZGUgaW4gcGFja2FnZSAlcFxuIiwgb2JqX2Rlc2MpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIHBvaW50ZXIgYmFjayB0byBOUyBub2RlIGluIHBhY2thZ2UgJXBcbiIsCisJCQkJICAgb2JqX2Rlc2MpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlBhY2thZ2UgQXJnIEluaXRcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJQYWNrYWdlIEFyZyBJbml0XG4iKSk7CiAKIAkvKiBFeGVjdXRlIHRoZSBBTUwgY29kZSBmb3IgdGhlIHRlcm1fYXJnIGFyZ3VtZW50cyAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyAobm9kZSwgbm9kZSwKLQkJCSBvYmpfZGVzYy0+cGFja2FnZS5hbWxfbGVuZ3RoLCBvYmpfZGVzYy0+cGFja2FnZS5hbWxfc3RhcnQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIG5vZGUsCisJCQkJCSAgIG9ial9kZXNjLT5wYWNrYWdlLmFtbF9sZW5ndGgsCisJCQkJCSAgIG9ial9kZXNjLT5wYWNrYWdlLmFtbF9zdGFydCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMKQEAgLTMzNCw0NCArMzE1LDQzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpleHRyYV9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpleHRyYV9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2dldF9yZWdpb25fYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9yZWdpb25fYXJndW1lbnRzIiwgb2JqX2Rlc2MpOwogCiAJaWYgKG9ial9kZXNjLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKLQlleHRyYV9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqX2Rlc2MpOworCWV4dHJhX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9ial9kZXNjKTsKIAlpZiAoIWV4dHJhX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkvKiBHZXQgdGhlIFJlZ2lvbiBub2RlICovCiAKIAlub2RlID0gb2JqX2Rlc2MtPnJlZ2lvbi5ub2RlOwogCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX1JFR0lPTiwgbm9kZSwgTlVMTCkpOworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9SRUdJT04sIG5vZGUsIE5VTEwpKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbJTQuNHNdIG9wX3JlZ2lvbiBBcmcgSW5pdCBhdCBBTUwgJXBcbiIsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIlslNC40c10gb3BfcmVnaW9uIEFyZyBJbml0IGF0IEFNTCAlcFxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkJICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpKTsKIAogCS8qIEV4ZWN1dGUgdGhlIGFyZ3VtZW50IEFNTCAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyAobm9kZSwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpLAotCQkJIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGgsIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMobm9kZSwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSksCisJCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGgsCisJCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbgpAQCAtMzg0LDIzICszNjQsMTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbiAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG9ial9oYW5kbGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9ial9oYW5kbGUpOwogCiAJLyogTmFtZXNwYWNlIGlzIE5PVCBsb2NrZWQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24gKG9ial9kZXNjLCBGQUxTRSk7CisJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbihvYmpfZGVzYywgRkFMU0UpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkCkBAIC00MTksMzAgKzM5NSwyNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2Zmc2V0X2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbGVuZ3RoX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X2Rlc2MpCithY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkKHUxNiBhbWxfb3Bjb2RlLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9mZnNldF9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsZW5ndGhfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVzdWx0X2Rlc2MpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X2NvdW50OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmxhZ3M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyIG9mZnNldDsKKwl1MzIgYml0X29mZnNldDsKKwl1MzIgYml0X2NvdW50OworCXU4IGZpZWxkX2ZsYWdzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19pbml0X2J1ZmZlcl9maWVsZCIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19pbml0X2J1ZmZlcl9maWVsZCIsIG9ial9kZXNjKTsKIAogCS8qIEhvc3Qgb2JqZWN0IG11c3QgYmUgYSBCdWZmZXIgKi8KIAotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoYnVmZmVyX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVGFyZ2V0IG9mIENyZWF0ZSBGaWVsZCBpcyBub3QgYSBCdWZmZXIgb2JqZWN0IC0gJXNcbiIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChidWZmZXJfZGVzYykpKTsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoYnVmZmVyX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUYXJnZXQgb2YgQ3JlYXRlIEZpZWxkIGlzIG5vdCBhIEJ1ZmZlciBvYmplY3QgLSAlc1xuIiwKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoYnVmZmVyX2Rlc2MpKSk7CiAKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJZ290byBjbGVhbnVwOwpAQCAtNDUzLDExICs0MjYsMTEgQEAKIAkgKiBvdXQgYXMgYSBuYW1lX3N0cmluZywgYW5kIHNob3VsZCB0aGVyZWZvcmUgbm93IGJlIGEgTlMgbm9kZQogCSAqIGFmdGVyIHJlc29sdXRpb24gaW4gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKCkuCiAJICovCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAocmVzdWx0X2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXVxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoYW1sX29wY29kZSksCi0JCQkJYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChyZXN1bHRfZGVzYykpKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHJlc3VsdF9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiglcykgZGVzdGluYXRpb24gbm90IGEgTlMgTm9kZSBbJXNdXG4iLAorCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUoYW1sX29wY29kZSksCisJCQkJICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUocmVzdWx0X2Rlc2MpKSk7CiAKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJZ290byBjbGVhbnVwOwpAQCAtNDc1LDEzICs0NDgsMTMgQEAKIAogCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKIAkJYml0X29mZnNldCA9IG9mZnNldDsKLQkJYml0X2NvdW50ICA9ICh1MzIpIGxlbmd0aF9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCQliaXRfY291bnQgPSAodTMyKSBsZW5ndGhfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAogCQkvKiBNdXN0IGhhdmUgYSB2YWxpZCAoPjApIGJpdCBjb3VudCAqLwogCiAJCWlmIChiaXRfY291bnQgPT0gMCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkF0dGVtcHQgdG8gY3JlYXRlX2ZpZWxkIG9mIGxlbmd0aCAwXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJBdHRlbXB0IHRvIGNyZWF0ZV9maWVsZCBvZiBsZW5ndGggMFxuIikpOwogCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTQ5Miw3ICs0NjUsNyBAQAogCQkvKiBPZmZzZXQgaXMgaW4gYml0cywgRmllbGQgaXMgb25lIGJpdCAqLwogCiAJCWJpdF9vZmZzZXQgPSBvZmZzZXQ7Ci0JCWJpdF9jb3VudCAgPSAxOworCQliaXRfY291bnQgPSAxOwogCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKIAkJYnJlYWs7CiAKQEAgLTUwMSw3ICs0NzQsNyBAQAogCQkvKiBPZmZzZXQgaXMgaW4gYnl0ZXMsIGZpZWxkIGlzIG9uZSBieXRlICovCiAKIAkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7Ci0JCWJpdF9jb3VudCAgPSA4OworCQliaXRfY291bnQgPSA4OwogCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKIAkJYnJlYWs7CiAKQEAgLTUxMCw3ICs0ODMsNyBAQAogCQkvKiBPZmZzZXQgaXMgaW4gYnl0ZXMsIGZpZWxkIGlzIG9uZSB3b3JkICovCiAKIAkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7Ci0JCWJpdF9jb3VudCAgPSAxNjsKKwkJYml0X2NvdW50ID0gMTY7CiAJCWZpZWxkX2ZsYWdzID0gQU1MX0ZJRUxEX0FDQ0VTU19XT1JEOwogCQlicmVhazsKIApAQCAtNTE5LDcgKzQ5Miw3IEBACiAJCS8qIE9mZnNldCBpcyBpbiBieXRlcywgZmllbGQgaXMgb25lIGR3b3JkICovCiAKIAkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7Ci0JCWJpdF9jb3VudCAgPSAzMjsKKwkJYml0X2NvdW50ID0gMzI7CiAJCWZpZWxkX2ZsYWdzID0gQU1MX0ZJRUxEX0FDQ0VTU19EV09SRDsKIAkJYnJlYWs7CiAKQEAgLTUyOCwyOSArNTAxLDI5IEBACiAJCS8qIE9mZnNldCBpcyBpbiBieXRlcywgZmllbGQgaXMgb25lIHF3b3JkICovCiAKIAkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7Ci0JCWJpdF9jb3VudCAgPSA2NDsKKwkJYml0X2NvdW50ID0gNjQ7CiAJCWZpZWxkX2ZsYWdzID0gQU1MX0ZJRUxEX0FDQ0VTU19RV09SRDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVua25vd24gZmllbGQgY3JlYXRpb24gb3Bjb2RlICUwMnhcbiIsCi0JCQlhbWxfb3Bjb2RlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5rbm93biBmaWVsZCBjcmVhdGlvbiBvcGNvZGUgJTAyeFxuIiwKKwkJCQkgIGFtbF9vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBFbnRpcmUgZmllbGQgbXVzdCBmaXQgd2l0aGluIHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgYnVmZmVyICovCiAKLQlpZiAoKGJpdF9vZmZzZXQgKyBiaXRfY291bnQpID4KLQkJKDggKiAodTMyKSBidWZmZXJfZGVzYy0+YnVmZmVyLmxlbmd0aCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiRmllbGQgWyU0LjRzXSBzaXplICVkIGV4Y2VlZHMgQnVmZmVyIFslNC40c10gc2l6ZSAlZCAoYml0cylcbiIsCi0JCQkgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZXN1bHRfZGVzYyksCi0JCQkgYml0X29mZnNldCArIGJpdF9jb3VudCwKLQkJCSBhY3BpX3V0X2dldF9ub2RlX25hbWUgKGJ1ZmZlcl9kZXNjLT5idWZmZXIubm9kZSksCi0JCQkgOCAqICh1MzIpIGJ1ZmZlcl9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJaWYgKChiaXRfb2Zmc2V0ICsgYml0X2NvdW50KSA+ICg4ICogKHUzMikgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiRmllbGQgWyU0LjRzXSBzaXplICVkIGV4Y2VlZHMgQnVmZmVyIFslNC40c10gc2l6ZSAlZCAoYml0cylcbiIsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmVzdWx0X2Rlc2MpLAorCQkJCSAgYml0X29mZnNldCArIGJpdF9jb3VudCwKKwkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShidWZmZXJfZGVzYy0+YnVmZmVyLgorCQkJCQkJCW5vZGUpLAorCQkJCSAgOCAqICh1MzIpIGJ1ZmZlcl9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CVUZGRVJfTElNSVQ7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC01NjAsOSArNTMzLDkgQEAKIAkgKiBGb3IgZmllbGRfZmxhZ3MsIHVzZSBMT0NLX1JVTEUgPSAwIChOT19MT0NLKSwKIAkgKiBVUERBVEVfUlVMRSA9IDAgKFVQREFURV9QUkVTRVJWRSkKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCAob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLCAwLAotCQkJICBiaXRfb2Zmc2V0LCBiaXRfY291bnQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdChvYmpfZGVzYywgZmllbGRfZmxhZ3MsIDAsCisJCQkJCQkgIGJpdF9vZmZzZXQsIGJpdF9jb3VudCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTU3MSwzNSArNTQ0LDMzIEBACiAJLyogUmVmZXJlbmNlIGNvdW50IGZvciBidWZmZXJfZGVzYyBpbmhlcml0cyBvYmpfZGVzYyBjb3VudCAqLwogCiAJYnVmZmVyX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSAodTE2KQotCQkoYnVmZmVyX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgKyBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisJICAgIChidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCArCisJICAgICBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBBbHdheXMgZGVsZXRlIHRoZSBvcGVyYW5kcyAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvZmZzZXRfZGVzYyk7Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChidWZmZXJfZGVzYyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9mZnNldF9kZXNjKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYnVmZmVyX2Rlc2MpOwogCiAJaWYgKGFtbF9vcGNvZGUgPT0gQU1MX0NSRUFURV9GSUVMRF9PUCkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGxlbmd0aF9kZXNjKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGxlbmd0aF9kZXNjKTsKIAl9CiAKIAkvKiBPbiBmYWlsdXJlLCBkZWxldGUgdGhlIHJlc3VsdCBkZXNjcmlwdG9yICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmVzdWx0X2Rlc2MpOyAvKiBSZXN1bHQgZGVzY3JpcHRvciAqLwotCX0KLQllbHNlIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJlc3VsdF9kZXNjKTsJLyogUmVzdWx0IGRlc2NyaXB0b3IgKi8KKwl9IGVsc2UgewogCQkvKiBOb3cgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBhcmUgdmFsaWQgZm9yIHRoaXMgYnVmZmVyX2ZpZWxkICovCiAKIAkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcwpAQCAtNjE1LDI0ICs1ODYsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQorYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm5leHRfb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzIiwgb3ApOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzIiwgb3ApOwogCiAJLyoKIAkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggZmllbGRzIG9mIHRoZQogCSAqIGNyZWF0ZV94eHhfZmllbGQgZGVjbGFyYXRpb24KIAkgKi8KLQlub2RlID0gIG9wLT5jb21tb24ubm9kZTsKKwlub2RlID0gb3AtPmNvbW1vbi5ub2RlOwogCiAJLyogbmV4dF9vcCBwb2ludHMgdG8gdGhlIG9wIHRoYXQgaG9sZHMgdGhlIEJ1ZmZlciAqLwogCkBAIC02NDAsMzAgKzYwOCwzMiBAQAogCiAJLyogRXZhbHVhdGUvY3JlYXRlIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb3BlcmFuZHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzICh3YWxrX3N0YXRlLCBuZXh0X29wKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBuZXh0X29wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkvKiBSZXNvbHZlIHRoZSBvcGVyYW5kcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCi0JCQkgIEFDUElfV0FMS19PUEVSQU5EUywgd2Fsa19zdGF0ZSk7CisJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCQkJICBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOwogCi0JQUNQSV9EVU1QX09QRVJBTkRTIChBQ1BJX1dBTEtfT1BFUkFORFMsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCQkgIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcywgImFmdGVyIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOworCUFDUElfRFVNUF9PUEVSQU5EUyhBQ1BJX1dBTEtfT1BFUkFORFMsIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCSAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCQkgICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMsCisJCQkgICAiYWZ0ZXIgYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzIik7CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiKCVzKSBiYWQgb3BlcmFuZChzKSAoJVgpXG4iLAotCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksIHN0YXR1cykpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiKCVzKSBiYWQgb3BlcmFuZChzKSAoJVgpXG4iLAorCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi4KKwkJCQkJCQkgIGFtbF9vcGNvZGUpLCBzdGF0dXMpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIEJ1ZmZlciBGaWVsZCAqLwpAQCAtNjcxLDIyICs2NDEsMjUgQEAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9DUkVBVEVfRklFTERfT1ApIHsKIAkJLyogTk9URTogU2xpZ2h0bHkgZGlmZmVyZW50IG9wZXJhbmRzIGZvciB0aGlzIG9wY29kZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQgKG9wLT5jb21tb24uYW1sX29wY29kZSwgb2JqX2Rlc2MsCi0JCQkJIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLCB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXSwKLQkJCQkgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMl0sIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzNdKTsKLQl9Ci0JZWxzZSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkKG9wLT5jb21tb24uYW1sX29wY29kZSwgb2JqX2Rlc2MsCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXSwKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMl0sCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzNdKTsKKwl9IGVsc2UgewogCQkvKiBBbGwgb3RoZXIsIGNyZWF0ZV94eHhfZmllbGQgb3Bjb2RlcyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQgKG9wLT5jb21tb24uYW1sX29wY29kZSwgb2JqX2Rlc2MsCi0JCQkJIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLCB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXSwKLQkJCQkJCSAgTlVMTCwgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMl0pOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9ial9kZXNjLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0sIE5VTEwsCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzJdKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcwpAQCAtNzAyLDI1ICs2NzUsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQorYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZF9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dF9vcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZF9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2V2YWxfcmVnaW9uX29wZXJhbmRzIiwgb3ApOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2V2YWxfcmVnaW9uX29wZXJhbmRzIiwgb3ApOwogCiAJLyoKIAkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggZmllbGRzIG9mIHRoZQogCSAqIG9wX3JlZ2lvbiBkZWNsYXJhdGlvbgogCSAqLwotCW5vZGUgPSAgb3AtPmNvbW1vbi5ub2RlOworCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CiAKIAkvKiBuZXh0X29wIHBvaW50cyB0byB0aGUgb3AgdGhhdCBob2xkcyB0aGUgc3BhY2VfaUQgKi8KIApAQCAtNzMyLDI2ICs3MDIsMjYgQEAKIAogCS8qIEV2YWx1YXRlL2NyZWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgbmV4dF9vcCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgbmV4dF9vcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFJlc29sdmUgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBvcGVyYW5kcyB0byBudW1iZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKG9wLT5jb21tb24uYW1sX29wY29kZSwKLQkJCSBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCisJCQkJCSAgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9EVU1QX09QRVJBTkRTIChBQ1BJX1dBTEtfT1BFUkFORFMsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCQkgIDEsICJhZnRlciBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMiKTsKKwlBQ1BJX0RVTVBfT1BFUkFORFMoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQkJICAgMSwgImFmdGVyIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkvKgpAQCAtNzYxLDcgKzczMSw3IEBACiAJb3BlcmFuZF9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMV07CiAKIAlvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCA9ICh1MzIpIG9wZXJhbmRfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9wZXJhbmRfZGVzYyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRfZGVzYyk7CiAKIAkvKgogCSAqIEdldCB0aGUgYWRkcmVzcyBhbmQgc2F2ZSBpdApAQCAtNzcwLDIyICs3NDAsMjEgQEAKIAlvcGVyYW5kX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAyXTsKIAogCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkgIG9wZXJhbmRfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9wZXJhbmRfZGVzYyk7CisJICAgIG9wZXJhbmRfZGVzYy0+aW50ZWdlci52YWx1ZTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZF9kZXNjKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJyZ25fb2JqICVwIEFkZHIgJTguOFglOC44WCBMZW4gJVhcbiIsCi0JCW9ial9kZXNjLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyksCi0JCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAicmduX29iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLAorCQkJICBvYmpfZGVzYywKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyksCisJCQkgIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CiAKIAkvKiBOb3cgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBhcmUgdmFsaWQgZm9yIHRoaXMgb3ByZWdpb24gKi8KIAogCW9ial9kZXNjLT5yZWdpb24uZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzCkBAIC04MDIsNDYgKzc3MSw0NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYXJnX2Rlc2M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFyZ19kZXNjOworCXUzMiBsZW5ndGg7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzIik7CiAKIAkvKiBUaGUgZmlyc3Qgb3BlcmFuZCAoZm9yIGFsbCBvZiB0aGVzZSBkYXRhIG9iamVjdHMpIGlzIHRoZSBsZW5ndGggKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLCAxKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLCAxKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkgICYod2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtMV0pLAotCQkJICB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMod2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCQkgICYod2Fsa19zdGF0ZS0+CisJCQkJCSAgICBvcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLQorCQkJCQkJICAgICAxXSksIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBFeHRyYWN0IGxlbmd0aCBvcGVyYW5kICovCiAKLQlhcmdfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxXTsKKwlhcmdfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDFdOwogCWxlbmd0aCA9ICh1MzIpIGFyZ19kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCiAJLyogQ2xlYW51cCBmb3IgbGVuZ3RoIG9wZXJhbmQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3BvcCAoMSwgd2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcG9wKDEsIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGFyZ19kZXNjKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYXJnX2Rlc2MpOwogCiAJLyoKIAkgKiBDcmVhdGUgdGhlIGFjdHVhbCBkYXRhIG9iamVjdApAQCAtODQ5LDM3ICs4MTYsNDIgQEAKIAlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewogCWNhc2UgQU1MX0JVRkZFUl9PUDoKIAotCQlzdGF0dXMgPSBhY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmogKHdhbGtfc3RhdGUsIG9wLCBsZW5ndGgsICZvYmpfZGVzYyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmood2Fsa19zdGF0ZSwgb3AsIGxlbmd0aCwKKwkJCQkJCSAgICAgICZvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfUEFDS0FHRV9PUDoKIAljYXNlIEFNTF9WQVJfUEFDS0FHRV9PUDoKIAotCQlzdGF0dXMgPSBhY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqICh3YWxrX3N0YXRlLCBvcCwgbGVuZ3RoLCAmb2JqX2Rlc2MpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaih3YWxrX3N0YXRlLCBvcCwgbGVuZ3RoLAorCQkJCQkJICAgICAgICZvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX09QQ09ERSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX09QQ09ERSk7CiAJfQogCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkvKgogCQkgKiBSZXR1cm4gdGhlIG9iamVjdCBpbiB0aGUgd2Fsa19zdGF0ZSwgdW5sZXNzIHRoZSBwYXJlbnQgaXMgYSBwYWNrYWdlIC0KIAkJICogaW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIG9iamVjdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcGFyc2UgdHJlZQogCQkgKiBmb3IgdGhlIHBhY2thZ2UuCiAJCSAqLwogCQlpZiAoKCFvcC0+Y29tbW9uLnBhcmVudCkgfHwKLQkJCSgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9QQUNLQUdFX09QKSAmJgotCQkJIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1ZBUl9QQUNLQUdFX09QKSAmJgotCQkJIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX05BTUVfT1ApKSkgeworCQkgICAgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1BBQ0tBR0VfT1ApICYmCisJCSAgICAgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSAhPQorCQkgICAgICBBTUxfVkFSX1BBQ0tBR0VfT1ApCisJCSAgICAgJiYgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSAhPQorCQkJIEFNTF9OQU1FX09QKSkpIHsKIAkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBvYmpfZGVzYzsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfYmVnaW5fY29udHJvbF9vcApAQCAtODk1LDE5ICs4NjcsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfYmVnaW5fY29udHJvbF9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK2FjcGlfZHNfZXhlY19iZWdpbl9jb250cm9sX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpjb250cm9sX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqY29udHJvbF9zdGF0ZTsKIAorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfZXhlY19iZWdpbl9jb250cm9sX29wIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19leGVjX2JlZ2luX2NvbnRyb2xfb3AiKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBPcGNvZGU9JTIuMlggU3RhdGU9JXBcbiIsIG9wLAotCQlvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgT3Bjb2RlPSUyLjJYIFN0YXRlPSVwXG4iLCBvcCwKKwkJCSAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCB3YWxrX3N0YXRlKSk7CiAKIAlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewogCWNhc2UgQU1MX0lGX09QOgpAQCAtOTE4LDcgKzg4Nyw3IEBACiAJCSAqIGNvbnN0cnVjdHMuIFdlIG5lZWQgdG8gbWFuYWdlIHRoZXNlIGFzIGEgc3RhY2ssIGluIG9yZGVyCiAJCSAqIHRvIGhhbmRsZSBuZXN0aW5nLgogCQkgKi8KLQkJY29udHJvbF9zdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUgKCk7CisJCWNvbnRyb2xfc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlKCk7CiAJCWlmICghY29udHJvbF9zdGF0ZSkgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJYnJlYWs7CkBAIC05MjcsMTQgKzg5NiwxNiBAQAogCQkgKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgcHJlZGljYXRlIGZvciBtdWx0aXBsZSBleGVjdXRpb25zCiAJCSAqIG9mIGEgbG9vcAogCQkgKi8KLQkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0ID0gd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCAtIDE7Ci0JCWNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucGFja2FnZV9lbmQgPSB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKKwkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0ID0KKwkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgLSAxOworCQljb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0KKwkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kOwogCQljb250cm9sX3N0YXRlLT5jb250cm9sLm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKIAotCiAJCS8qIFB1c2ggdGhlIGNvbnRyb2wgc3RhdGUgb24gdGhpcyB3YWxrJ3MgY29udHJvbCBzdGFjayAqLwogCi0JCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlICgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSwgY29udHJvbF9zdGF0ZSk7CisJCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLAorCQkJCQkgICBjb250cm9sX3N0YXRlKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9FTFNFX09QOgpAQCAtOTU5LDcgKzkzMCw2IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXhlY19lbmRfY29udHJvbF9vcApAQCAtOTc1LDQ2ICs5NDUsNDIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCithY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUsCisJCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKmNvbnRyb2xfc3RhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpjb250cm9sX3N0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19leGVjX2VuZF9jb250cm9sX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2V4ZWNfZW5kX2NvbnRyb2xfb3AiKTsKIAogCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CiAJY2FzZSBBTUxfSUZfT1A6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJbSUZfT1BdIE9wPSVwXG4iLCBvcCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiW0lGX09QXSBPcD0lcFxuIiwgb3ApKTsKIAogCQkvKgogCQkgKiBTYXZlIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBpbiBjYXNlIHRoZXJlIGlzIGFuCiAJCSAqIEVMU0UgdG8gY29tZQogCQkgKi8KIAkJd2Fsa19zdGF0ZS0+bGFzdF9wcmVkaWNhdGUgPQotCQkJKHU4KSB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWU7CisJCSAgICAodTgpIHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZTsKIAogCQkvKgogCQkgKiBQb3AgdGhlIGNvbnRyb2wgc3RhdGUgdGhhdCB3YXMgY3JlYXRlZCBhdCB0aGUgc3RhcnQKIAkJICogb2YgdGhlIElGIGFuZCBmcmVlIGl0CiAJCSAqLwotCQljb250cm9sX3N0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpOwotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChjb250cm9sX3N0YXRlKTsKKwkJY29udHJvbF9zdGF0ZSA9CisJCSAgICBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShjb250cm9sX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0VMU0VfT1A6CiAKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX1dISUxFX09QOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiW1dISUxFX09QXSBPcD0lcFxuIiwgb3ApKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIltXSElMRV9PUF0gT3A9JXBcbiIsIG9wKSk7CiAKIAkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZSkgewogCQkJLyogUHJlZGljYXRlIHdhcyB0cnVlLCBnbyBiYWNrIGFuZCBldmFsdWF0ZSBpdCBhZ2FpbiEgKi8KQEAgLTEwMjIsMjIgKzk4OCwyNCBAQAogCQkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiW1dISUxFX09QXSB0ZXJtaW5hdGlvbiEgT3A9JXBcbiIsb3ApKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJbV0hJTEVfT1BdIHRlcm1pbmF0aW9uISBPcD0lcFxuIiwgb3ApKTsKIAogCQkvKiBQb3AgdGhpcyBjb250cm9sIHN0YXRlIGFuZCBmcmVlIGl0ICovCiAKLQkJY29udHJvbF9zdGF0ZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKTsKKwkJY29udHJvbF9zdGF0ZSA9CisJCSAgICBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKTsKIAotCQl3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZSA9IGNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuYW1sX3ByZWRpY2F0ZV9zdGFydDsKLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoY29udHJvbF9zdGF0ZSk7CisJCXdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0KKwkJICAgIGNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuYW1sX3ByZWRpY2F0ZV9zdGFydDsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShjb250cm9sX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX1JFVFVSTl9PUDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSJbUkVUVVJOX09QXSBPcD0lcCBBcmc9JXBcbiIsb3AsIG9wLT5jb21tb24udmFsdWUuYXJnKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiW1JFVFVSTl9PUF0gT3A9JXAgQXJnPSVwXG4iLCBvcCwKKwkJCQkgIG9wLT5jb21tb24udmFsdWUuYXJnKSk7CiAKIAkJLyoKIAkJICogT25lIG9wdGlvbmFsIG9wZXJhbmQgLS0gdGhlIHJldHVybiB2YWx1ZQpAQCAtMTA0NywxMiArMTAxNSwxNCBAQAogCQlpZiAob3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKIAkJCS8qIFNpbmNlIHdlIGhhdmUgYSByZWFsIFJldHVybigpLCBkZWxldGUgYW55IGltcGxpY2l0IHJldHVybiAqLwogCi0JCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybiAod2Fsa19zdGF0ZSk7CisJCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlKTsKIAogCQkJLyogUmV0dXJuIHN0YXRlbWVudCBoYXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCSAgICBvcC0+Y29tbW9uLnZhbHVlLmFyZyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCQl9CiAKQEAgLTEwNjEsOCArMTAzMSwxMCBAQAogCQkJICogYW4gYXJnIG9yIGxvY2FsKSwgcmVzb2x2ZSBpdCBub3cgYmVjYXVzZSBpdCBtYXkKIAkJCSAqIGNlYXNlIHRvIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZC4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgmd2Fsa19zdGF0ZS0+b3BlcmFuZHMgWzBdLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKCZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCQl9CiAKQEAgLTEwNzIsMTIgKzEwNDQsMTEgQEAKIAkJCSAqIGlzIHNldCB0byBhbnl0aGluZyBvdGhlciB0aGFuIHplcm8hCiAJCQkgKi8KIAkJCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoKHdhbGtfc3RhdGUtPnJlc3VsdHMpICYmCi0JCQkJICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm51bV9yZXN1bHRzID4gMCkpIHsKKwkJfSBlbHNlIGlmICgod2Fsa19zdGF0ZS0+cmVzdWx0cykgJiYKKwkJCSAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm51bV9yZXN1bHRzID4gMCkpIHsKIAkJCS8qIFNpbmNlIHdlIGhhdmUgYSByZWFsIFJldHVybigpLCBkZWxldGUgYW55IGltcGxpY2l0IHJldHVybiAqLwogCi0JCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybiAod2Fsa19zdGF0ZSk7CisJCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlKTsKIAogCQkJLyoKIAkJCSAqIFRoZSByZXR1cm4gdmFsdWUgaGFzIGNvbWUgZnJvbSBhIHByZXZpb3VzIGNhbGN1bGF0aW9uLgpAQCAtMTA4OCw2NyArMTA1OSw3OCBAQAogCQkJICoKIAkJCSAqIEFsbG93IHJlZmVyZW5jZXMgY3JlYXRlZCBieSB0aGUgSW5kZXggb3BlcmF0b3IgdG8gcmV0dXJuIHVuY2hhbmdlZC4KIAkJCSAqLwotCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHdhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMub2JqX2Rlc2NbMF0pID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpICYmCi0JCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjIFswXSkgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYKLQkJCQkoKHdhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMub2JqX2Rlc2MgWzBdKS0+cmVmZXJlbmNlLm9wY29kZSAhPSBBTUxfSU5ERVhfT1ApKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgmd2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzYyBbMF0sIHdhbGtfc3RhdGUpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFCisJCQkgICAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PQorCQkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkJICAgICYmCisJCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkgICAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PQorCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICgod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzY1swXSktPgorCQkJCXJlZmVyZW5jZS5vcGNvZGUgIT0gQU1MX0lOREVYX09QKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgICByZXN1bHRzLT5yZXN1bHRzLgorCQkJCQkJCSAgICAgb2JqX2Rlc2NbMF0sCisJCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJcmV0dXJuIChzdGF0dXMpOwogCQkJCX0KIAkJCX0KIAotCQkJd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgPSB3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjIFswXTsKLQkJfQotCQllbHNlIHsKKwkJCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0KKwkJCSAgICB3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdOworCQl9IGVsc2UgewogCQkJLyogTm8gcmV0dXJuIG9wZXJhbmQgKi8KIAogCQkJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykgewotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHMgWzBdKTsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+CisJCQkJCQkJIG9wZXJhbmRzWzBdKTsKIAkJCX0KIAotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHMgWzBdICAgID0gTlVMTDsKLQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAgICA9IDA7Ci0JCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyAgICAgPSBOVUxMOworCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOworCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKKwkJCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gTlVMTDsKIAkJfQogCi0KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiQ29tcGxldGVkIFJFVFVSTl9PUCBTdGF0ZT0lcCwgcmV0X3ZhbD0lcFxuIiwKLQkJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiQ29tcGxldGVkIFJFVFVSTl9PUCBTdGF0ZT0lcCwgcmV0X3ZhbD0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjKSk7CiAKIAkJLyogRW5kIHRoZSBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gcmlnaHQgbm93ICovCiAKIAkJc3RhdHVzID0gQUVfQ1RSTF9URVJNSU5BVEU7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9OT09QX09QOgogCiAJCS8qIEp1c3QgZG8gbm90aGluZyEgKi8KIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0JSRUFLX1BPSU5UX09QOgogCiAJCS8qIENhbGwgdXAgdG8gdGhlIE9TIHNlcnZpY2UgbGF5ZXIgdG8gaGFuZGxlIHRoaXMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbCAoQUNQSV9TSUdOQUxfQlJFQUtQT0lOVCwgIkV4ZWN1dGVkIEFNTCBCcmVha3BvaW50IG9wY29kZSIpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9vc19zaWduYWwoQUNQSV9TSUdOQUxfQlJFQUtQT0lOVCwKKwkJCQkgICAiRXhlY3V0ZWQgQU1MIEJyZWFrcG9pbnQgb3Bjb2RlIik7CiAKIAkJLyogSWYgYW5kIHdoZW4gaXQgcmV0dXJucywgYWxsIGRvbmUuICovCiAKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0JSRUFLX09QOgotCWNhc2UgQU1MX0NPTlRJTlVFX09QOiAvKiBBQ1BJIDIuMCAqLwotCisJY2FzZSBBTUxfQ09OVElOVUVfT1A6CS8qIEFDUEkgMi4wICovCiAKIAkJLyogUG9wIGFuZCBkZWxldGUgY29udHJvbCBzdGF0ZXMgdW50aWwgd2UgZmluZCBhIHdoaWxlICovCiAKIAkJd2hpbGUgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUgJiYKLQkJCQkod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5vcGNvZGUgIT0gQU1MX1dISUxFX09QKSkgewotCQkJY29udHJvbF9zdGF0ZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKTsKLQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKGNvbnRyb2xfc3RhdGUpOworCQkgICAgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wub3Bjb2RlICE9CisJCQlBTUxfV0hJTEVfT1ApKSB7CisJCQljb250cm9sX3N0YXRlID0KKwkJCSAgICBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT4KKwkJCQkJCSAgICAgIGNvbnRyb2xfc3RhdGUpOworCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShjb250cm9sX3N0YXRlKTsKIAkJfQogCiAJCS8qIE5vIHdoaWxlIGZvdW5kPyAqLwpAQCAtMTE1OSwyMyArMTE0MSwyMyBAQAogCiAJCS8qIFdhczogd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGUgPSB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5Db250cm9sLmFtbF9wcmVkaWNhdGVfc3RhcnQ7ICovCiAKLQkJd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGUgPSB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kOworCQl3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZSA9CisJCSAgICB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kOwogCiAJCS8qIFJldHVybiBzdGF0dXMgZGVwZW5kaW5nIG9uIG9wY29kZSAqLwogCiAJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JSRUFLX09QKSB7CiAJCQlzdGF0dXMgPSBBRV9DVFJMX0JSRUFLOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJc3RhdHVzID0gQUVfQ1RSTF9DT05USU5VRTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gY29udHJvbCBvcGNvZGU9JVggT3A9JXBcbiIsCi0JCQlvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5rbm93biBjb250cm9sIG9wY29kZT0lWCBPcD0lcFxuIiwKKwkJCQkgIG9wLT5jb21tb24uYW1sX29wY29kZSwgb3ApKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJYnJlYWs7CkBAIC0xMTgzLDQgKzExNjUsMyBAQAogCiAJcmV0dXJuIChzdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKaW5kZXggOTYxMzM0OS4uODNhZTFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KQEAgLTUxLDggKzUwLDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjZGVidWcuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHN1dGlscyIpCi0KK0FDUElfTU9EVUxFX05BTUUoImRzdXRpbHMiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY4LDEzICs2Niw5IEBACiAgKiAgICAgICAgICAgICAgcGFyZW50IG1ldGhvZCBleGl0cy4pCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4gKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit2b2lkIGFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2NsZWFyX2ltcGxpY2l0X3JldHVybiIpOwogCiAJLyoKIAkgKiBTbGFjayBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoaXMgZmVhdHVyZQpAQCAtODksMTYgKzgzLDE1IEBACiAJCSAqIGNvbXBsZXggc3RhdGVtZW50cywgdGhlIGltcGxpY2l0IHJldHVybiB2YWx1ZSBjYW4gYmUKIAkJICogYnViYmxlZCB1cCBzZXZlcmFsIGxldmVscy4KIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIlJlbW92aW5nIHJlZmVyZW5jZSBvbiBzdGFsZSBpbXBsaWNpdCByZXR1cm4gb2JqICVwXG4iLAotCQkJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIlJlbW92aW5nIHJlZmVyZW5jZSBvbiBzdGFsZSBpbXBsaWNpdCByZXR1cm4gb2JqICVwXG4iLAorCQkJCSAgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikpOwogCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaik7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKTsKIAkJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9IE5VTEw7CiAJfQogfQogCi0KICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTExOSwyNyArMTEyLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1OAotYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmZXJlbmNlKQorYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLCB1OCBhZGRfcmVmZXJlbmNlKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX2RvX2ltcGxpY2l0X3JldHVybiIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19kb19pbXBsaWNpdF9yZXR1cm4iKTsKIAogCS8qCiAJICogU2xhY2sgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUsIGFuZCB3ZSBtdXN0CiAJICogaGF2ZSBhIHZhbGlkIHJldHVybiBvYmplY3QKIAkgKi8KLQlpZiAoKCFhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHx8Ci0JCSghcmV0dXJuX2Rlc2MpKSB7CisJaWYgKCghYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB8fCAoIXJldHVybl9kZXNjKSkgewogCQlyZXR1cm4gKEZBTFNFKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSJSZXN1bHQgJXAgd2lsbCBiZSBpbXBsaWNpdGx5IHJldHVybmVkOyBQcmV2PSVwXG4iLAotCQkJcmV0dXJuX2Rlc2MsCi0JCQl3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIlJlc3VsdCAlcCB3aWxsIGJlIGltcGxpY2l0bHkgcmV0dXJuZWQ7IFByZXY9JXBcbiIsCisJCQkgIHJldHVybl9kZXNjLCB3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKSk7CiAKIAkvKgogCSAqIERlbGV0ZSBhbnkgInN0YWxlIiBpbXBsaWNpdCByZXR1cm4gdmFsdWUgZmlyc3QuIEhvd2V2ZXIsIGluCkBAIC0xNTEsMjAgKzEzOSwxOSBAQAogCQlpZiAod2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9PSByZXR1cm5fZGVzYykgewogCQkJcmV0dXJuIChUUlVFKTsKIAkJfQotCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybiAod2Fsa19zdGF0ZSk7CisJCWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuKHdhbGtfc3RhdGUpOwogCX0KIAogCS8qIFNhdmUgdGhlIGltcGxpY2l0IHJldHVybiB2YWx1ZSwgYWRkIGEgcmVmZXJlbmNlIGlmIHJlcXVlc3RlZCAqLwogCiAJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9IHJldHVybl9kZXNjOwogCWlmIChhZGRfcmVmZXJlbmNlKSB7Ci0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCX0KIAogCXJldHVybiAoVFJVRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pc19yZXN1bHRfdXNlZApAQCAtMTc5LDIwICsxNjYsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHU4Ci1hY3BpX2RzX2lzX3Jlc3VsdF91c2VkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19pc19yZXN1bHRfdXNlZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqIG9wLAorCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqcGFyZW50X2luZm87CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKnBhcmVudF9pbmZvOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19pc19yZXN1bHRfdXNlZCIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19pc19yZXN1bHRfdXNlZCIsIG9wKTsKIAogCS8qIE11c3QgaGF2ZSBib3RoIGFuIE9wIGFuZCBhIFJlc3VsdCBPYmplY3QgKi8KIAogCWlmICghb3ApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIE9wXG4iKSk7Ci0JCXJldHVybl9WQUxVRSAoVFJVRSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOdWxsIE9wXG4iKSk7CisJCXJldHVybl9WQUxVRShUUlVFKTsKIAl9CiAKIAkvKgpAQCAtMjA0LDcgKzE4OSw4IEBACiAJICogTk9URTogdGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIHRoZSBBU0wgbGFuZ3VhZ2UgZG9lcyBub3QgYWN0dWFsbHkKIAkgKiBzdXBwb3J0IHRoaXMgYmVoYXZpb3IuCiAJICovCi0JKHZvaWQpIGFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlLCBUUlVFKTsKKwkodm9pZClhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlLAorCQkJCQkgVFJVRSk7CiAKIAkvKgogCSAqIE5vdyBkZXRlcm1pbmUgaWYgdGhlIHBhcmVudCB3aWxsIHVzZSB0aGUgcmVzdWx0CkBAIC0yMTUsMjIgKzIwMSwyNCBAQAogCSAqIHZpYSBleGVjdXRlX2NvbnRyb2xfbWV0aG9kIGhhcyBhIHNjb3BlX29wIGFzIHRoZSBwYXJlbnQuCiAJICovCiAJaWYgKCghb3AtPmNvbW1vbi5wYXJlbnQpIHx8Ci0JCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1NDT1BFX09QKSkgeworCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9TQ09QRV9PUCkpIHsKIAkJLyogTm8gcGFyZW50LCB0aGUgcmV0dXJuIHZhbHVlIGNhbm5vdCBwb3NzaWJseSBiZSB1c2VkICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiQXQgTWV0aG9kIGxldmVsLCByZXN1bHQgb2YgWyVzXSBub3QgdXNlZFxuIiwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKSk7Ci0JCXJldHVybl9WQUxVRSAoRkFMU0UpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIkF0IE1ldGhvZCBsZXZlbCwgcmVzdWx0IG9mIFslc10gbm90IHVzZWRcbiIsCisJCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLgorCQkJCQkJCSAgYW1sX29wY29kZSkpKTsKKwkJcmV0dXJuX1ZBTFVFKEZBTFNFKTsKIAl9CiAKIAkvKiBHZXQgaW5mbyBvbiB0aGUgcGFyZW50LiBUaGUgcm9vdF9vcCBpcyBBTUxfU0NPUEUgKi8KIAotCXBhcmVudF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSk7CisJcGFyZW50X2luZm8gPQorCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCWlmIChwYXJlbnRfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVW5rbm93biBwYXJlbnQgb3Bjb2RlLiBPcD0lcFxuIiwgb3ApKTsKLQkJcmV0dXJuX1ZBTFVFIChGQUxTRSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5rbm93biBwYXJlbnQgb3Bjb2RlLiBPcD0lcFxuIiwgb3ApKTsKKwkJcmV0dXJuX1ZBTFVFKEZBTFNFKTsKIAl9CiAKIAkvKgpAQCAtMjU2LDggKzI0NCwxMCBAQAogCQkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyB0aGUgcHJlZGljYXRlIEFORCB0aGlzIGlzIHRoZSBwcmVkaWNhdGUgb3AsCiAJCQkgKiB3ZSB3aWxsIHVzZSB0aGUgcmV0dXJuIHZhbHVlCiAJCQkgKi8KLQkJCWlmICgod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09IEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKSAmJgotCQkJCSh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnByZWRpY2F0ZV9vcCA9PSBvcCkpIHsKKwkJCWlmICgod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09CisJCQkgICAgIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLgorCQkJCXByZWRpY2F0ZV9vcCA9PSBvcCkpIHsKIAkJCQlnb3RvIHJlc3VsdF91c2VkOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yNzEsNyArMjYxLDYgQEAKIAogCQlnb3RvIHJlc3VsdF9ub3RfdXNlZDsKIAotCiAJY2FzZSBBTUxfQ0xBU1NfQ1JFQVRFOgogCiAJCS8qCkBAIC0yODAsMTUgKzI2OSwxNiBAQAogCQkgKi8KIAkJZ290byByZXN1bHRfdXNlZDsKIAotCiAJY2FzZSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNUOgogCi0JCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApICAgICAgfHwKLQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0RBVEFfUkVHSU9OX09QKSB8fAotCQkJKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgICAgIHx8Ci0JCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkgfHwKLQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JVRkZFUl9PUCkgICAgICB8fAotCQkJKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCkpIHsKKwkJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgfHwKKwkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0RBVEFfUkVHSU9OX09QKQorCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkKKwkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCUFNTF9WQVJfUEFDS0FHRV9PUCkKKwkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JVRkZFUl9PUCkKKwkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCUFNTF9JTlRfRVZBTF9TVUJUUkVFX09QKSkgewogCQkJLyoKIAkJCSAqIFRoZXNlIG9wY29kZXMgYWxsb3cgdGVybV9hcmcocykgYXMgb3BlcmFuZHMgYW5kIHRoZXJlZm9yZQogCQkJICogdGhlIG9wZXJhbmRzIGNhbiBiZSBtZXRob2QgY2FsbHMuICBUaGUgcmVzdWx0IGlzIHVzZWQuCkBAIC0yOTgsNyArMjg4LDYgQEAKIAogCQlnb3RvIHJlc3VsdF9ub3RfdXNlZDsKIAotCiAJZGVmYXVsdDoKIAogCQkvKgpAQCAtMzA4LDI2ICsyOTcsMjUgQEAKIAkJZ290byByZXN1bHRfdXNlZDsKIAl9CiAKKyAgICAgIHJlc3VsdF91c2VkOgorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJSZXN1bHQgb2YgWyVzXSB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgorCQkJCQkJICBhbWxfb3Bjb2RlKSwgb3ApKTsKIAotcmVzdWx0X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSJSZXN1bHQgb2YgWyVzXSB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSksIG9wKSk7CisJcmV0dXJuX1ZBTFVFKFRSVUUpOwogCi0JcmV0dXJuX1ZBTFVFIChUUlVFKTsKKyAgICAgIHJlc3VsdF9ub3RfdXNlZDoKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiUmVzdWx0IG9mIFslc10gbm90IHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCisJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uCisJCQkJCQkgIGFtbF9vcGNvZGUpLCBvcCkpOwogCi0KLXJlc3VsdF9ub3RfdXNlZDoKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIlJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSksIG9wKSk7Ci0KLQlyZXR1cm5fVkFMVUUgKEZBTFNFKTsKKwlyZXR1cm5fVkFMVUUoRkFMU0UpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZApAQCAtMzQ2LDIwICszMzQsMTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19kZWxldGVfcmVzdWx0X2lmX25vdF91c2VkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9vYmosCisJCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19kZWxldGVfcmVzdWx0X2lmX25vdF91c2VkIiwgcmVzdWx0X29iaik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCIsIHJlc3VsdF9vYmopOwogCiAJaWYgKCFvcCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgT3BcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk51bGwgT3BcbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC0zNjcsMTkgKzM1MiwxOCBAQAogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlpZiAoIWFjcGlfZHNfaXNfcmVzdWx0X3VzZWQgKG9wLCB3YWxrX3N0YXRlKSkgeworCWlmICghYWNwaV9kc19pc19yZXN1bHRfdXNlZChvcCwgd2Fsa19zdGF0ZSkpIHsKIAkJLyogTXVzdCBwb3AgdGhlIHJlc3VsdCBzdGFjayAob2JqX2Rlc2Mgc2hvdWxkIGJlIGVxdWFsIHRvIHJlc3VsdF9vYmopICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcG9wICgmb2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJlc3VsdF9vYmopOworCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3AoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmVzdWx0X29iaik7CiAJCX0KIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMKQEAgLTM5NCwxNiArMzc4LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX3Jlc29sdmVfb3BlcmFuZHMiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19yZXNvbHZlX29wZXJhbmRzIiwgd2Fsa19zdGF0ZSk7CiAKIAkvKgogCSAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBlYWNoIG9mIHRoZSB2YWxpZCBvcGVyYW5kcwpAQCAtNDExLDE2ICszOTEsMTcgQEAKIAkgKiB0aGF0IHRoZSBhY3R1YWwgb2JqZWN0cyBhcmUgcGFzc2VkLCBub3QgY29waWVzIG9mIHRoZSBvYmplY3RzLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHM7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUgKCZ3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0sCisJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jbGVhcl9vcGVyYW5kcwpAQCAtNDMzLDE1ICs0MTQsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2RzX2NsZWFyX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQordm9pZCBhY3BpX2RzX2NsZWFyX29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2NsZWFyX29wZXJhbmRzIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY2xlYXJfb3BlcmFuZHMiLCB3YWxrX3N0YXRlKTsKIAogCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSBvbiBlYWNoIG9wZXJhbmQgb24gdGhlIHN0YWNrICovCiAKQEAgLTQ1MCw3ICs0MjcsNyBAQAogCQkgKiBSZW1vdmUgYSByZWZlcmVuY2UgdG8gYWxsIG9wZXJhbmRzLCBpbmNsdWRpbmcgYm90aAogCQkgKiAiQXJndW1lbnRzIiBhbmQgIlRhcmdldHMiLgogCQkgKi8KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CiAJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKIAl9CiAKQEAgLTQ1OSw3ICs0MzYsNiBAQAogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZApAQCAtNDc4LDM3ICs0NTQsMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9vcGVyYW5kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19pbmRleCkKK2FjcGlfZHNfY3JlYXRlX29wZXJhbmQoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcsIHUzMiBhcmdfaW5kZXgpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3N0cmluZzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuZ3RoOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudF9vcDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKLQlhY3BpX2ludGVycHJldGVyX21vZGUgICAgICAgICAgIGludGVycHJldGVyX21vZGU7Ci0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqb3BfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwljaGFyICpuYW1lX3N0cmluZzsKKwl1MzIgbmFtZV9sZW5ndGg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudF9vcDsKKwl1MTYgb3Bjb2RlOworCWFjcGlfaW50ZXJwcmV0ZXJfbW9kZSBpbnRlcnByZXRlcl9tb2RlOworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2NyZWF0ZV9vcGVyYW5kIiwgYXJnKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jcmVhdGVfb3BlcmFuZCIsIGFyZyk7CiAKIAkvKiBBIHZhbGlkIG5hbWUgbXVzdCBiZSBsb29rZWQgdXAgaW4gdGhlIG5hbWVzcGFjZSAqLwogCiAJaWYgKChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApICYmCi0JCShhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiR2V0dGluZyBhIG5hbWU6IEFyZz0lcFxuIiwgYXJnKSk7CisJICAgIChhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJHZXR0aW5nIGEgbmFtZTogQXJnPSVwXG4iLAorCQkJCSAgYXJnKSk7CiAKIAkJLyogR2V0IHRoZSBlbnRpcmUgbmFtZSBzdHJpbmcgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X25hbWVfc3RyaW5nIChBQ1BJX1RZUEVfQU5ZLCBhcmctPmNvbW1vbi52YWx1ZS5idWZmZXIsCi0JCQkJICAmbmFtZV9zdHJpbmcsICZuYW1lX2xlbmd0aCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2dldF9uYW1lX3N0cmluZyhBQ1BJX1RZUEVfQU5ZLAorCQkJCQkgICAgYXJnLT5jb21tb24udmFsdWUuYnVmZmVyLAorCQkJCQkgICAgJm5hbWVfc3RyaW5nLCAmbmFtZV9sZW5ndGgpOwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIEFsbCBwcmVmaXhlcyBoYXZlIGJlZW4gaGFuZGxlZCwgYW5kIHRoZSBuYW1lIGlzIGluIG5hbWVfc3RyaW5nICovCkBAIC01MjMsMTMgKzQ5OCwxNCBAQAogCQkgKiBhY3R1YWwgb3Bjb2RlIGV4aXN0cy4KIAkJICovCiAJCWlmICgod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgJiYKLQkJCSh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpICYmCi0JCQkoYXJnX2luZGV4ICE9IDApKSB7Ci0JCQlvYmpfZGVzYyA9IEFDUElfQ0FTVF9QVFIgKAotCQkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7CisJCSAgICAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKQorCQkgICAgJiYgKGFyZ19pbmRleCAhPSAwKSkgeworCQkJb2JqX2Rlc2MgPQorCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJICB3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKTsKIAkJCXN0YXR1cyA9IEFFX09LOwotCQl9Ci0JCWVsc2UgICAgLyogQWxsIG90aGVyIG9wY29kZXMgKi8geworCQl9IGVsc2UgewkvKiBBbGwgb3RoZXIgb3Bjb2RlcyAqLworCiAJCQkvKgogCQkJICogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbmFtZXNwYWNlICJjcmVhdGUiIG9wZXJhdGlvbgogCQkJICogdmVyc3VzIGEgImxvb2t1cCIgb3BlcmF0aW9uIChJTU9ERV9MT0FEX1BBU1MyIHZzLgpAQCAtNTM3LDQzICs1MTMsNTEgQEAKIAkJCSAqIG5hbWVzcGFjZSBvYmplY3RzIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGNvbnRyb2wgbWV0aG9kcy4KIAkJCSAqLwogCQkJcGFyZW50X29wID0gYXJnLT5jb21tb24ucGFyZW50OwotCQkJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQkJCWlmICgob3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNOT0RFKSAmJgotCQkJCShwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkgJiYKLQkJCQkocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfUkVHSU9OX09QKSAmJgotCQkJCShwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTkFNRVBBVEhfT1ApKSB7CisJCQlvcF9pbmZvID0KKwkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhwYXJlbnRfb3AtPmNvbW1vbi4KKwkJCQkJCSAgICBhbWxfb3Bjb2RlKTsKKwkJCWlmICgob3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNOT0RFKQorCQkJICAgICYmIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9CisJCQkJQU1MX0lOVF9NRVRIT0RDQUxMX09QKQorCQkJICAgICYmIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9SRUdJT05fT1ApCisJCQkgICAgJiYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0KKwkJCQlBTUxfSU5UX05BTUVQQVRIX09QKSkgewogCQkJCS8qIEVudGVyIG5hbWUgaW50byBuYW1lc3BhY2UgaWYgbm90IGZvdW5kICovCiAKIAkJCQlpbnRlcnByZXRlcl9tb2RlID0gQUNQSV9JTU9ERV9MT0FEX1BBU1MyOwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCS8qIFJldHVybiBhIGZhaWx1cmUgaWYgbmFtZSBub3QgZm91bmQgKi8KIAogCQkJCWludGVycHJldGVyX21vZGUgPSBBQ1BJX0lNT0RFX0VYRUNVVEU7CiAJCQl9CiAKLQkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBuYW1lX3N0cmluZywKLQkJCQkJIEFDUElfVFlQRV9BTlksIGludGVycHJldGVyX21vZGUsCi0JCQkJCSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKLQkJCQkJIHdhbGtfc3RhdGUsCi0JCQkJCSBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJm9ial9kZXNjKSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIG5hbWVfc3RyaW5nLAorCQkJCQkgICBBQ1BJX1RZUEVfQU5ZLCBpbnRlcnByZXRlcl9tb2RlLAorCQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfAorCQkJCQkgICBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgd2Fsa19zdGF0ZSwKKwkJCQkJICAgQUNQSV9DQVNUX0lORElSRUNUX1BUUihzdHJ1Y3QKKwkJCQkJCQkJICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCQkgICZvYmpfZGVzYykpOwogCQkJLyoKIAkJCSAqIFRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgcGFzcyB0aHJvdWdoIChpZ25vcmUpIGEgTk9UX0ZPVU5ECiAJCQkgKiBlcnJvciBpcyBmb3IgdGhlIGNvbmRfcmVmX29mIG9wY29kZS4KIAkJCSAqLwogCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKLQkJCQlpZiAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfQ09ORF9SRUZfT0ZfT1ApIHsKKwkJCQlpZiAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCSAgICBBTUxfQ09ORF9SRUZfT0ZfT1ApIHsKIAkJCQkJLyoKIAkJCQkJICogRm9yIHRoZSBDb25kaXRpb25hbCBSZWZlcmVuY2Ugb3AsIGl0J3MgT0sgaWYKIAkJCQkJICogdGhlIG5hbWUgaXMgbm90IGZvdW5kOyAgV2UganVzdCBuZWVkIGEgd2F5IHRvCiAJCQkJCSAqIGluZGljYXRlIHRoaXMgdG8gdGhlIGludGVycHJldGVyLCBzZXQgdGhlCiAJCQkJCSAqIG9iamVjdCB0byB0aGUgcm9vdAogCQkJCQkgKi8KLQkJCQkJb2JqX2Rlc2MgPSBBQ1BJX0NBU1RfUFRSICgKLQkJCQkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkJCQkJb2JqX2Rlc2MgPQorCQkJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbgorCQkJCQkJCSAgYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJCQkgIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CiAJCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCX0KLQkJCQllbHNlIHsKKwkJCQl9IGVsc2UgewogCQkJCQkvKgogCQkJCQkgKiBXZSBqdXN0IHBsYWluIGRpZG4ndCBmaW5kIGl0IC0tIHdoaWNoIGlzIGEKIAkJCQkJICogdmVyeSBzZXJpb3VzIGVycm9yIGF0IHRoaXMgcG9pbnQKQEAgLTU4MiwzMCArNTY2LDMwIEBACiAJCQkJfQogCQkJfQogCi0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAobmFtZV9zdHJpbmcsIHN0YXR1cyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKG5hbWVfc3RyaW5nLCBzdGF0dXMpOwogCQkJfQogCQl9CiAKIAkJLyogRnJlZSB0aGUgbmFtZXN0cmluZyBjcmVhdGVkIGFib3ZlICovCiAKLQkJQUNQSV9NRU1fRlJFRSAobmFtZV9zdHJpbmcpOworCQlBQ1BJX01FTV9GUkVFKG5hbWVfc3RyaW5nKTsKIAogCQkvKiBDaGVjayBzdGF0dXMgZnJvbSB0aGUgbG9va3VwICovCiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogUHV0IHRoZSByZXN1bHRpbmcgb2JqZWN0IG9udG8gdGhlIGN1cnJlbnQgb2JqZWN0IHN0YWNrICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcHVzaCAob2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3B1c2gob2JqX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9Ci0JCUFDUElfREVCVUdHRVJfRVhFQyAoYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdCAob2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKLQl9Ci0JZWxzZSB7CisJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0CisJCQkJICAgKG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CisJfSBlbHNlIHsKIAkJLyogQ2hlY2sgZm9yIG51bGwgbmFtZSBjYXNlICovCiAKIAkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgewpAQCAtNjE1LDc3ICs1OTksODMgQEAKIAkJCSAqIGluIHRoZSBvcmlnaW5hbCBBU0wuICBDcmVhdGUgYSBaZXJvIENvbnN0YW50IGZvciBhCiAJCQkgKiBwbGFjZWhvbGRlci4gIChTdG9yZSB0byBhIGNvbnN0YW50IGlzIGEgTm9vcC4pCiAJCQkgKi8KLQkJCW9wY29kZSA9IEFNTF9aRVJPX09QOyAgICAgICAvKiBIYXMgbm8gYXJndW1lbnRzISAqLworCQkJb3Bjb2RlID0gQU1MX1pFUk9fT1A7CS8qIEhhcyBubyBhcmd1bWVudHMhICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSJOdWxsIG5hbWVwYXRoOiBBcmc9JXBcbiIsIGFyZykpOwotCQl9Ci0JCWVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiTnVsbCBuYW1lcGF0aDogQXJnPSVwXG4iLCBhcmcpKTsKKwkJfSBlbHNlIHsKIAkJCW9wY29kZSA9IGFyZy0+Y29tbW9uLmFtbF9vcGNvZGU7CiAJCX0KIAogCQkvKiBHZXQgdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBhcmd1bWVudCAqLwogCi0JCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKTsKKwkJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7CiAJCWlmIChvcF9pbmZvLT5vYmplY3RfdHlwZSA9PSBBQ1BJX1RZUEVfSU5WQUxJRCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfSU1QTEVNRU5URUQpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CiAJCX0KIAogCQlpZiAob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX1JFVFZBTCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJIkFyZ3VtZW50IHByZXZpb3VzbHkgY3JlYXRlZCwgYWxyZWFkeSBzdGFja2VkIFxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiQXJndW1lbnQgcHJldmlvdXNseSBjcmVhdGVkLCBhbHJlYWR5IHN0YWNrZWQgXG4iKSk7CiAKLQkJCUFDUElfREVCVUdHRVJfRVhFQyAoYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdCAoCi0JCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDFdLCB3YWxrX3N0YXRlKSk7CisJCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdAorCQkJCQkgICAod2Fsa19zdGF0ZS0+CisJCQkJCSAgICBvcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLQorCQkJCQkJICAgICAxXSwgd2Fsa19zdGF0ZSkpOwogCiAJCQkvKgogCQkJICogVXNlIHZhbHVlIHRoYXQgd2FzIGFscmVhZHkgcHJldmlvdXNseSByZXR1cm5lZAogCQkJICogYnkgdGhlIGV2YWx1YXRpb24gb2YgdGhpcyBhcmd1bWVudAogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3BfZnJvbV9ib3R0b20gKCZvYmpfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfcmVzdWx0X3BvcF9mcm9tX2JvdHRvbSgmb2JqX2Rlc2MsCisJCQkJCQkJICAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkvKgogCQkJCSAqIE9ubHkgZXJyb3IgaXMgdW5kZXJmbG93LCBhbmQgdGhpcyBpbmRpY2F0ZXMKIAkJCQkgKiBhIG1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kIQogCQkJCSAqLwotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiTWlzc2luZyBvciBudWxsIG9wZXJhbmQsICVzXG4iLAotCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwKKwkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCisJCQkJCQkgIChzdGF0dXMpKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKiBDcmVhdGUgYW4gQUNQSV9JTlRFUk5BTF9PQkpFQ1QgZm9yIHRoZSBhcmd1bWVudCAqLwogCi0JCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAob3BfaW5mby0+b2JqZWN0X3R5cGUpOworCQkJb2JqX2Rlc2MgPQorCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChvcF9pbmZvLT4KKwkJCQkJCQkgICBvYmplY3RfdHlwZSk7CiAJCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQkJfQogCiAJCQkvKiBJbml0aWFsaXplIHRoZSBuZXcgb2JqZWN0ICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAoCi0JCQkJCSB3YWxrX3N0YXRlLCBhcmcsIG9wY29kZSwgJm9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAob2JqX2Rlc2MpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHdhbGtfc3RhdGUsIGFyZywgb3Bjb2RlLAorCQkJCQkJCSZvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIAogCQkvKiBQdXQgdGhlIG9wZXJhbmQgb2JqZWN0IG9uIHRoZSBvYmplY3Qgc3RhY2sgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX29ial9zdGFja19wdXNoIChvYmpfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcHVzaChvYmpfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGFjcGlfZGJfZGlzcGxheV9hcmd1bWVudF9vYmplY3QgKG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0CisJCQkJICAgKG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcwpAQCAtNzAyLDI5ICs2OTIsMjcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpmaXJzdF9hcmcpCithY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmZpcnN0X2FyZykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19jb3VudCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKwl1MzIgYXJnX2NvdW50ID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19jcmVhdGVfb3BlcmFuZHMiLCBmaXJzdF9hcmcpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NyZWF0ZV9vcGVyYW5kcyIsIGZpcnN0X2FyZyk7CiAKIAkvKiBGb3IgYWxsIGFyZ3VtZW50cyBpbiB0aGUgbGlzdC4uLiAqLwogCiAJYXJnID0gZmlyc3RfYXJnOwogCXdoaWxlIChhcmcpIHsKLQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCAod2Fsa19zdGF0ZSwgYXJnLCBhcmdfY291bnQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQod2Fsa19zdGF0ZSwgYXJnLCBhcmdfY291bnQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiQXJnICMlZCAoJXApIGRvbmUsIEFyZzE9JXBcbiIsCi0JCQlhcmdfY291bnQsIGFyZywgZmlyc3RfYXJnKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiQXJnICMlZCAoJXApIGRvbmUsIEFyZzE9JXBcbiIsIGFyZ19jb3VudCwKKwkJCQkgIGFyZywgZmlyc3RfYXJnKSk7CiAKIAkJLyogTW92ZSBvbiB0byBuZXh0IGFyZ3VtZW50LCBpZiBhbnkgKi8KIApAQCAtNzMyLDIwICs3MjAsMTcgQEAKIAkJYXJnX2NvdW50Kys7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCS8qCiAJICogV2UgbXVzdCB1bmRvIGV2ZXJ5dGhpbmcgZG9uZSBhYm92ZTsgbWVhbmluZyB0aGF0IHdlIG11c3QKIAkgKiBwb3AgZXZlcnl0aGluZyBvZmYgb2YgdGhlIG9wZXJhbmQgc3RhY2sgYW5kIGRlbGV0ZSB0aG9zZQogCSAqIG9iamVjdHMKIAkgKi8KLQkodm9pZCkgYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUgKGFyZ19jb3VudCwgd2Fsa19zdGF0ZSk7CisJKHZvaWQpYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUoYXJnX2NvdW50LCB3YWxrX3N0YXRlKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiV2hpbGUgY3JlYXRpbmcgQXJnICVkIC0gJXNcbiIsCi0JCShhcmdfY291bnQgKyAxKSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJXaGlsZSBjcmVhdGluZyBBcmcgJWQgLSAlc1xuIiwKKwkJCSAgKGFyZ19jb3VudCArIDEpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYwppbmRleCAxMGY3MTMxLi5lNTIyNzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCkBAIC00Miw3ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNTIsMjcgKzUxLDI2IEBACiAjaW5jbHVkZSA8YWNwaS9hY2RlYnVnLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc2FzbS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzd2V4ZWMiKQorQUNQSV9NT0RVTEVfTkFNRSgiZHN3ZXhlYyIpCiAKIC8qCiAgKiBEaXNwYXRjaCB0YWJsZSBmb3Igb3Bjb2RlIGNsYXNzZXMKICAqLwotc3RhdGljIEFDUElfRVhFQ1VURV9PUCAgICAgIGFjcGlfZ2JsX29wX3R5cGVfZGlzcGF0Y2ggW10gPSB7Ci0JCQkgIGFjcGlfZXhfb3Bjb2RlXzBBXzBUXzFSLAotCQkJICBhY3BpX2V4X29wY29kZV8xQV8wVF8wUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfMUFfMFRfMVIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSLAotCQkJICBhY3BpX2V4X29wY29kZV8xQV8xVF8xUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSLAotCQkJICBhY3BpX2V4X29wY29kZV8yQV8xVF8xUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIsCi0JCQkgIGFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSLAotCQkJICBhY3BpX2V4X29wY29kZV8zQV8xVF8xUiwKLQkJCSAgYWNwaV9leF9vcGNvZGVfNkFfMFRfMVJ9OwotCitzdGF0aWMgQUNQSV9FWEVDVVRFX09QIGFjcGlfZ2JsX29wX3R5cGVfZGlzcGF0Y2hbXSA9IHsKKwlhY3BpX2V4X29wY29kZV8wQV8wVF8xUiwKKwlhY3BpX2V4X29wY29kZV8xQV8wVF8wUiwKKwlhY3BpX2V4X29wY29kZV8xQV8wVF8xUiwKKwlhY3BpX2V4X29wY29kZV8xQV8xVF8wUiwKKwlhY3BpX2V4X29wY29kZV8xQV8xVF8xUiwKKwlhY3BpX2V4X29wY29kZV8yQV8wVF8wUiwKKwlhY3BpX2V4X29wY29kZV8yQV8wVF8xUiwKKwlhY3BpX2V4X29wY29kZV8yQV8xVF8xUiwKKwlhY3BpX2V4X29wY29kZV8yQV8yVF8xUiwKKwlhY3BpX2V4X29wY29kZV8zQV8wVF8wUiwKKwlhY3BpX2V4X29wY29kZV8zQV8xVF8xUiwKKwlhY3BpX2V4X29wY29kZV82QV8wVF8xUgorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODgsNjQgKzg2LDY0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXN1bHRfb2JqKSB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpsb2NhbF9vYmpfZGVzYyA9IE5VTEw7CithY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxvY2FsX29ial9kZXNjID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19nZXRfcHJlZGljYXRlX3ZhbHVlIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSIsIHdhbGtfc3RhdGUpOwogCiAJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID0gMDsKIAogCWlmIChyZXN1bHRfb2JqKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3BvcCAoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkNvdWxkIG5vdCBnZXQgcmVzdWx0IGZyb20gcHJlZGljYXRlIGV2YWx1YXRpb24sICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3AoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDb3VsZCBub3QgZ2V0IHJlc3VsdCBmcm9tIHByZWRpY2F0ZSBldmFsdWF0aW9uLCAlc1xuIiwKKwkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQotCX0KLQllbHNlIHsKLQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCAod2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+b3AsIDApOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCh3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5vcCwgMCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUgKCZ3YWxrX3N0YXRlLT5vcGVyYW5kcyBbMF0sIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLAorCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJb2JqX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kcyBbMF07CisJCW9ial9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAJfQogCiAJaWYgKCFvYmpfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJObyBwcmVkaWNhdGUgb2JqX2Rlc2M9JXAgU3RhdGU9JXBcbiIsCi0JCQlvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5vIHByZWRpY2F0ZSBvYmpfZGVzYz0lcCBTdGF0ZT0lcFxuIiwKKwkJCQkgIG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCiAJLyoKIAkgKiBSZXN1bHQgb2YgcHJlZGljYXRlIGV2YWx1YXRpb24gbXVzdCBiZSBhbiBJbnRlZ2VyCiAJICogb2JqZWN0LiBJbXBsaWNpdGx5IGNvbnZlcnQgdGhlIGFyZ3VtZW50IGlmIG5lY2Vzc2FyeS4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlciAob2JqX2Rlc2MsICZsb2NhbF9vYmpfZGVzYywgMTYpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvYmpfZGVzYywgJmxvY2FsX29ial9kZXNjLCAxNik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGxvY2FsX29ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJCYWQgcHJlZGljYXRlIChub3QgYW4gaW50ZWdlcikgb2JqX2Rlc2M9JXAgU3RhdGU9JXAgVHlwZT0lWFxuIiwKLQkJCW9ial9kZXNjLCB3YWxrX3N0YXRlLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSk7CisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGxvY2FsX29ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkJhZCBwcmVkaWNhdGUgKG5vdCBhbiBpbnRlZ2VyKSBvYmpfZGVzYz0lcCBTdGF0ZT0lcCBUeXBlPSVYXG4iLAorCQkJCSAgb2JqX2Rlc2MsIHdhbGtfc3RhdGUsCisJCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlnb3RvIGNsZWFudXA7CkBAIC0xNTMsNyArMTUxLDcgQEAKIAogCS8qIFRydW5jYXRlIHRoZSBwcmVkaWNhdGUgdG8gMzItYml0cyBpZiBuZWNlc3NhcnkgKi8KIAotCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKGxvY2FsX29ial9kZXNjKTsKKwlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKGxvY2FsX29ial9kZXNjKTsKIAogCS8qCiAJICogU2F2ZSB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgZXZhbHVhdGlvbiBvbgpAQCAtMTYxLDggKzE1OSw3IEBACiAJICovCiAJaWYgKGxvY2FsX29ial9kZXNjLT5pbnRlZ2VyLnZhbHVlKSB7CiAJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZSA9IFRSVUU7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFByZWRpY2F0ZSBpcyBGQUxTRSwgd2Ugd2lsbCBqdXN0IHRvc3MgdGhlCiAJCSAqIHJlc3Qgb2YgdGhlIHBhY2thZ2UKQEAgLTE3MSwzMCArMTY4LDMwIEBACiAJCXN0YXR1cyA9IEFFX0NUUkxfRkFMU0U7CiAJfQogCisgICAgICBjbGVhbnVwOgogCi1jbGVhbnVwOgorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkNvbXBsZXRlZCBhIHByZWRpY2F0ZSBldmFsPSVYIE9wPSVwXG4iLAorCQkJICB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUsCisJCQkgIHdhbGtfc3RhdGUtPm9wKSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiQ29tcGxldGVkIGEgcHJlZGljYXRlIGV2YWw9JVggT3A9JXBcbiIsCi0JCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZSwgd2Fsa19zdGF0ZS0+b3ApKTsKKwkvKiBCcmVhayB0byBkZWJ1Z2dlciB0byBkaXNwbGF5IHJlc3VsdCAqLwogCi0JIC8qIEJyZWFrIHRvIGRlYnVnZ2VyIHRvIGRpc3BsYXkgcmVzdWx0ICovCi0KLQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGFjcGlfZGJfZGlzcGxheV9yZXN1bHRfb2JqZWN0IChsb2NhbF9vYmpfZGVzYywgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdAorCQkJICAgKGxvY2FsX29ial9kZXNjLCB3YWxrX3N0YXRlKSk7CiAKIAkvKgogCSAqIERlbGV0ZSB0aGUgcHJlZGljYXRlIHJlc3VsdCBvYmplY3QgKHdlIGtub3cgdGhhdAogCSAqIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZSkKIAkgKi8KIAlpZiAobG9jYWxfb2JqX2Rlc2MgIT0gb2JqX2Rlc2MpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChsb2NhbF9vYmpfZGVzYyk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsb2NhbF9vYmpfZGVzYyk7CiAJfQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAKIAl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPSBBQ1BJX0NPTlRST0xfTk9STUFMOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2JlZ2luX29wCkBAIC0yMTEsMzggKzIwOCwzOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfYmVnaW5fb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKm91dF9vcCkKK2FjcGlfZHNfZXhlY19iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm91dF9vcCkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlX2NsYXNzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgb3Bjb2RlX2NsYXNzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImRzX2V4ZWNfYmVnaW5fb3AiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19leGVjX2JlZ2luX29wIiwgd2Fsa19zdGF0ZSk7CiAKIAlvcCA9IHdhbGtfc3RhdGUtPm9wOwogCWlmICghb3ApIHsKLQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcCAod2Fsa19zdGF0ZSwgb3V0X29wKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQlvcCA9ICpvdXRfb3A7CiAJCXdhbGtfc3RhdGUtPm9wID0gb3A7CiAJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKLQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KKwkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uYW1sX29wY29kZSk7CiAKLQkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCi0JCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZSksIG9wKSk7CisJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUod2Fsa19zdGF0ZS0+CisJCQkJCQkJCW9wX2luZm8tPgorCQkJCQkJCQlvYmplY3RfdHlwZSksCisJCQkJCSAgb3ApKTsKIAotCQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wb3AgKHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIAl9CkBAIC0yNTIsNyArMjUwLDcgQEAKIAkJCSpvdXRfb3AgPSBvcDsKIAkJfQogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCkBAIC0yNjEsMTkgKzI1OSwyMCBAQAogCSAqIFNhdmUgdGhpcyBrbm93bGVkZ2UgaW4gdGhlIGN1cnJlbnQgc2NvcGUgZGVzY3JpcHRvcgogCSAqLwogCWlmICgod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgJiYKLQkJKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQotCQkJQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkV4ZWMgcHJlZGljYXRlIE9wPSVwIFN0YXRlPSVwXG4iLAotCQkJCSAgb3AsIHdhbGtfc3RhdGUpKTsKKwkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQorCSAgICAgQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIkV4ZWMgcHJlZGljYXRlIE9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAotCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORzsKKwkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID0KKwkJICAgIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HOwogCiAJCS8qIFNhdmUgc3RhcnQgb2YgcHJlZGljYXRlICovCiAKIAkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wcmVkaWNhdGVfb3AgPSBvcDsKIAl9CiAKLQogCW9wY29kZV9jbGFzcyA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzOwogCiAJLyogV2Ugd2FudCB0byBzZW5kIG5hbWVwYXRocyB0byB0aGUgbG9hZCBjb2RlICovCkBAIC0yODgsMTUgKzI4NywxNCBAQAogCXN3aXRjaCAob3Bjb2RlX2NsYXNzKSB7CiAJY2FzZSBBTUxfQ0xBU1NfQ09OVFJPTDoKIAotCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoICh3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AgKHdhbGtfc3RhdGUsIG9wKTsKKwkJc3RhdHVzID0gYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3Aod2Fsa19zdGF0ZSwgb3ApOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNUOgogCiAJCWlmICh3YWxrX3N0YXRlLT53YWxrX3R5cGUgPT0gQUNQSV9XQUxLX01FVEhPRCkgewpAQCAtMzA2LDE1ICszMDQsMTQgQEAKIAkJCSAqIG9iamVjdCBpcyB0ZW1wb3JhcnkgYW5kIHdpbGwgYmUgZGVsZXRlZCB1cG9uIGNvbXBsZXRpb24gb2YKIAkJCSAqIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3AgKHdhbGtfc3RhdGUsIE5VTEwpOworCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcCh3YWxrX3N0YXRlLCBOVUxMKTsKIAkJfQogCiAJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgewotCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAod2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHdhbGtfc3RhdGUpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9DTEFTU19FWEVDVVRFOgogCWNhc2UgQU1MX0NMQVNTX0NSRUFURToKIApAQCAtMzIyLDIwICszMTksMTggQEAKIAkJICogTW9zdCBvcGVyYXRvcnMgd2l0aCBhcmd1bWVudHMuCiAJCSAqIFN0YXJ0IGEgbmV3IHJlc3VsdC9vcGVyYW5kIHN0YXRlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoICh3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCh3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAogCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbiAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfZW5kX29wCkBAIC0zNTAsMjggKzM0NSwyNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2VuZF9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZXhlY19lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2NsYXNzOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm5leHRfb3A7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqZmlyc3RfYXJnOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgb3BfdHlwZTsKKwl1MzIgb3BfY2xhc3M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHRfb3A7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmZpcnN0X2FyZzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19leGVjX2VuZF9vcCIsIHdhbGtfc3RhdGUpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19leGVjX2VuZF9vcCIsIHdhbGtfc3RhdGUpOwotCi0KLQlvcCAgICAgID0gd2Fsa19zdGF0ZS0+b3A7CisJb3AgPSB3YWxrX3N0YXRlLT5vcDsKIAlvcF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+dHlwZTsKIAlvcF9jbGFzcyA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzOwogCiAJaWYgKG9wX2NsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBvcGNvZGUgJVhcbiIsIG9wLT5jb21tb24uYW1sX29wY29kZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9JTVBMRU1FTlRFRCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmtub3duIG9wY29kZSAlWFxuIiwKKwkJCQkgIG9wLT5jb21tb24uYW1sX29wY29kZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0lNUExFTUVOVEVEKTsKIAl9CiAKIAlmaXJzdF9hcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKQEAgLTM4NCwyOSArMzc2LDMxIEBACiAKIAkvKiBDYWxsIGRlYnVnZ2VyIGZvciBzaW5nbGUgc3RlcCBzdXBwb3J0IChERUJVRyBidWlsZCBvbmx5KSAqLwogCi0JQUNQSV9ERUJVR0dFUl9FWEVDIChzdGF0dXMgPSBhY3BpX2RiX3NpbmdsZV9zdGVwICh3YWxrX3N0YXRlLCBvcCwgb3BfY2xhc3MpKTsKLQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHtyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7fSk7CisJQUNQSV9ERUJVR0dFUl9FWEVDKHN0YXR1cyA9CisJCQkgICBhY3BpX2RiX3NpbmdsZV9zdGVwKHdhbGtfc3RhdGUsIG9wLCBvcF9jbGFzcykpOworCUFDUElfREVCVUdHRVJfRVhFQyhpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCSAgIHJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpO30KKwkpIDsKIAogCS8qIERlY29kZSB0aGUgT3Bjb2RlIENsYXNzICovCiAKIAlzd2l0Y2ggKG9wX2NsYXNzKSB7Ci0JY2FzZSBBTUxfQ0xBU1NfQVJHVU1FTlQ6ICAgIC8qIGNvbnN0YW50cywgbGl0ZXJhbHMsIGV0Yy4gLSBkbyBub3RoaW5nICovCisJY2FzZSBBTUxfQ0xBU1NfQVJHVU1FTlQ6CS8qIGNvbnN0YW50cywgbGl0ZXJhbHMsIGV0Yy4gLSBkbyBub3RoaW5nICovCiAJCWJyZWFrOwogCi0KLQljYXNlIEFNTF9DTEFTU19FWEVDVVRFOiAgICAgLyogbW9zdCBvcGVyYXRvcnMgd2l0aCBhcmd1bWVudHMgKi8KKwljYXNlIEFNTF9DTEFTU19FWEVDVVRFOgkvKiBtb3N0IG9wZXJhdG9ycyB3aXRoIGFyZ3VtZW50cyAqLwogCiAJCS8qIEJ1aWxkIHJlc29sdmVkIG9wZXJhbmQgc3RhY2sgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgZmlyc3RfYXJnKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBmaXJzdF9hcmcpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCS8qIERvbmUgd2l0aCB0aGlzIHJlc3VsdCBzdGF0ZSAoTm93IHRoYXQgb3BlcmFuZCBzdGFjayBpcyBidWlsdCkgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3AgKHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIApAQCAtNDE3LDg2ICs0MTEsOTMgQEAKIAkJaWYgKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTk9fT1BFUkFORF9SRVNPTFZFKSkgewogCQkJLyogUmVzb2x2ZSBhbGwgb3BlcmFuZHMgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzICh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJCSAmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSwKLQkJCQkJIHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJCUFDUElfRFVNUF9PUEVSQU5EUyAoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpLAotCQkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMsICJhZnRlciBleF9yZXNvbHZlX29wZXJhbmRzIik7CisJCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMod2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCQkJCSAgJih3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgb3BlcmFuZHMKKwkJCQkJCQkgICAgW3dhbGtfc3RhdGUtPgorCQkJCQkJCSAgICAgbnVtX29wZXJhbmRzIC0gMV0pLAorCQkJCQkJCSAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0RVTVBfT1BFUkFORFMoQUNQSV9XQUxLX09QRVJBTkRTLAorCQkJCQkJICAgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCQkJICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUKKwkJCQkJCSAgICh3YWxrX3N0YXRlLT5vcGNvZGUpLAorCQkJCQkJICAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLAorCQkJCQkJICAgImFmdGVyIGV4X3Jlc29sdmVfb3BlcmFuZHMiKTsKIAkJCX0KIAkJfQogCi0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkvKgogCQkJICogRGlzcGF0Y2ggdGhlIHJlcXVlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIGludGVycHJldGVyIGhhbmRsZXIKIAkJCSAqIHJvdXRpbmUuICBUaGVyZSBpcyBvbmUgcm91dGluZSBwZXIgb3Bjb2RlICJ0eXBlIiBiYXNlZCB1cG9uIHRoZQogCQkJICogbnVtYmVyIG9mIG9wY29kZSBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlLgogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2dibF9vcF90eXBlX2Rpc3BhdGNoW29wX3R5cGVdICh3YWxrX3N0YXRlKTsKLQkJfQotCQllbHNlIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9nYmxfb3BfdHlwZV9kaXNwYXRjaFtvcF90eXBlXSAod2Fsa19zdGF0ZSk7CisJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogVHJlYXQgY29uc3RydWN0cyBvZiB0aGUgZm9ybSAiU3RvcmUobG9jYWxfeCxsb2NhbF94KSIgYXMgbm9vcHMgd2hlbiB0aGUKIAkJCSAqIExvY2FsIGlzIHVuaW5pdGlhbGl6ZWQuCiAJCQkgKi8KLQkJCWlmICAoKHN0YXR1cyA9PSBBRV9BTUxfVU5JTklUSUFMSVpFRF9MT0NBTCkgJiYKLQkJCQkod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9TVE9SRV9PUCkgJiYKLQkJCQkod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0tPmNvbW1vbi50eXBlID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpICYmCi0JCQkJKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5jb21tb24udHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSAmJgotCQkJCSh3YWxrX3N0YXRlLT5vcGVyYW5kc1swXS0+cmVmZXJlbmNlLm9wY29kZSA9PQotCQkJCSB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+cmVmZXJlbmNlLm9wY29kZSkgJiYKLQkJCQkod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0tPnJlZmVyZW5jZS5vZmZzZXQgPT0KLQkJCQkgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPnJlZmVyZW5jZS5vZmZzZXQpKSB7CisJCQlpZiAoKHN0YXR1cyA9PSBBRV9BTUxfVU5JTklUSUFMSVpFRF9MT0NBTCkgJiYKKwkJCSAgICAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9TVE9SRV9PUCkgJiYKKwkJCSAgICAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0tPmNvbW1vbi50eXBlID09CisJCQkgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5jb21tb24udHlwZSA9PQorCQkJCUFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5yZWZlcmVuY2Uub3Bjb2RlID09CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPnJlZmVyZW5jZS5vcGNvZGUpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5yZWZlcmVuY2Uub2Zmc2V0ID09CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPnJlZmVyZW5jZS5vZmZzZXQpKSB7CiAJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIlslc106IENvdWxkIG5vdCByZXNvbHZlIG9wZXJhbmRzLCAlc1xuIiwKLQkJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSksCi0JCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJfSBlbHNlIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiWyVzXTogQ291bGQgbm90IHJlc29sdmUgb3BlcmFuZHMsICVzXG4iLAorCQkJCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZQorCQkJCQkJICAod2Fsa19zdGF0ZS0+b3Bjb2RlKSwKKwkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCisJCQkJCQkgIChzdGF0dXMpKSk7CiAJCQl9CiAJCX0KIAogCQkvKiBBbHdheXMgZGVsZXRlIHRoZSBhcmd1bWVudCBvYmplY3RzIGFuZCBjbGVhciB0aGUgb3BlcmFuZCBzdGFjayAqLwogCi0JCWFjcGlfZHNfY2xlYXJfb3BlcmFuZHMgKHdhbGtfc3RhdGUpOworCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzKHdhbGtfc3RhdGUpOwogCiAJCS8qCiAJCSAqIElmIGEgcmVzdWx0IG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSBhYm92ZSwgcHVzaCBpdCBvbiB0aGUKIAkJICogY3VycmVudCByZXN1bHQgc3RhY2sKIAkJICovCi0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykgJiYKLQkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3B1c2ggKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX3Jlc3VsdF9wdXNoKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosCisJCQkJCQl3YWxrX3N0YXRlKTsKIAkJfQogCiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCiAJCXN3aXRjaCAob3BfdHlwZSkgewotCQljYXNlIEFNTF9UWVBFX0NPTlRST0w6ICAgIC8qIFR5cGUgMSBvcGNvZGUsIElGL0VMU0UvV0hJTEUvTk9PUCAqLworCQljYXNlIEFNTF9UWVBFX0NPTlRST0w6CS8qIFR5cGUgMSBvcGNvZGUsIElGL0VMU0UvV0hJTEUvTk9PUCAqLwogCiAJCQkvKiAxIE9wZXJhbmQsIDAgZXh0ZXJuYWxfcmVzdWx0LCAwIGludGVybmFsX3Jlc3VsdCAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3AgKHdhbGtfc3RhdGUsIG9wKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19lbmRfY29udHJvbF9vcCh3YWxrX3N0YXRlLCBvcCk7CiAKIAkJCS8qIE1ha2Ugc3VyZSB0byBwcm9wZXJseSBwb3AgdGhlIHJlc3VsdCBzdGFjayAqLwogCi0JCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3AgKHdhbGtfc3RhdGUpOwotCQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCQkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfVFlQRV9NRVRIT0RfQ0FMTDoKIAogCQkJLyoKQEAgLTUwNSwxNiArNTA2LDIyIEBACiAJCQkgKiBhIHJlZmVyZW5jZSB0byBpdC4KIAkJCSAqLwogCQkJaWYgKChvcC0+YXNsLnBhcmVudCkgJiYKLQkJCSAgICgob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09IEFNTF9QQUNLQUdFX09QKSB8fAotCQkJCShvcC0+YXNsLnBhcmVudC0+YXNsLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSkpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkJIk1ldGhvZCBSZWZlcmVuY2UgaW4gYSBQYWNrYWdlLCBPcD0lcFxuIiwgb3ApKTsKLQkJCQlvcC0+Y29tbW9uLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb3AtPmFzbC52YWx1ZS5hcmctPmFzbC5ub2RlLT5vYmplY3Q7Ci0JCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvcC0+YXNsLnZhbHVlLmFyZy0+YXNsLm5vZGUtPm9iamVjdCk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQkgICAgKChvcC0+YXNsLnBhcmVudC0+YXNsLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApCisJCQkgICAgIHx8IChvcC0+YXNsLnBhcmVudC0+YXNsLmFtbF9vcGNvZGUgPT0KKwkJCQkgQU1MX1ZBUl9QQUNLQUdFX09QKSkpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkJICAiTWV0aG9kIFJlZmVyZW5jZSBpbiBhIFBhY2thZ2UsIE9wPSVwXG4iLAorCQkJCQkJICBvcCkpOworCQkJCW9wLT5jb21tb24ubm9kZSA9CisJCQkJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wLT5hc2wudmFsdWUuCisJCQkJICAgIGFyZy0+YXNsLm5vZGUtPm9iamVjdDsKKwkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob3AtPmFzbC52YWx1ZS5hcmctPmFzbC4KKwkJCQkJCSAgICAgIG5vZGUtPm9iamVjdCk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCX0KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJNZXRob2QgaW52b2NhdGlvbiwgT3A9JXBcbiIsIG9wKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkgICJNZXRob2QgaW52b2NhdGlvbiwgT3A9JXBcbiIsIG9wKSk7CiAKIAkJCS8qCiAJCQkgKiAoQU1MX01FVEhPRENBTEwpIE9wLT5Bc2wuVmFsdWUuQXJnLT5Bc2wuTm9kZSBjb250YWlucwpAQCAtNTMxLDggKzUzOCw4IEBACiAJCQkvKgogCQkJICogR2V0IHRoZSBtZXRob2QncyBhcmd1bWVudHMgYW5kIHB1dCB0aGVtIG9uIHRoZSBvcGVyYW5kIHN0YWNrCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzICh3YWxrX3N0YXRlLCBuZXh0X29wKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsIG5leHRfb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTU0MSwxMSArNTQ4LDExIEBACiAJCQkgKiB3ZSBtdXN0IHJlc29sdmUgYWxsIGxvY2FsIHJlZmVyZW5jZXMgaGVyZSAoTG9jYWwgdmFyaWFibGVzLAogCQkJICogYXJndW1lbnRzIHRvICp0aGlzKiBtZXRob2QsIGV0Yy4pCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMod2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkvKiBPbiBlcnJvciwgY2xlYXIgYWxsIHJlc29sdmVkIG9wZXJhbmRzICovCiAKLQkJCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzICh3YWxrX3N0YXRlKTsKKwkJCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzKHdhbGtfc3RhdGUpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC01NTksMjcgKzU2NiwyOCBAQAogCQkJICogUmV0dXJuIG5vdzsgd2UgZG9uJ3Qgd2FudCB0byBkaXN0dXJiIGFueXRoaW5nLAogCQkJICogZXNwZWNpYWxseSB0aGUgb3BlcmFuZCBjb3VudCEKIAkJCSAqLwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAogCQljYXNlIEFNTF9UWVBFX0NSRUFURV9GSUVMRDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkiRXhlY3V0aW5nIGNyZWF0ZV9maWVsZCBCdWZmZXIvSW5kZXggT3A9JXBcbiIsIG9wKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIkV4ZWN1dGluZyBjcmVhdGVfZmllbGQgQnVmZmVyL0luZGV4IE9wPSVwXG4iLAorCQkJCQkgIG9wKSk7CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfZW5kX29wICh3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfZW5kX29wKHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG9wKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyh3YWxrX3N0YXRlLCBvcCk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkiRXhlY3V0aW5nIGNyZWF0ZV9vYmplY3QgKEJ1ZmZlci9QYWNrYWdlKSBPcD0lcFxuIiwgb3ApKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiRXhlY3V0aW5nIGNyZWF0ZV9vYmplY3QgKEJ1ZmZlci9QYWNrYWdlKSBPcD0lcFxuIiwKKwkJCQkJICBvcCkpOwogCiAJCQlzd2l0Y2ggKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSkgewogCQkJY2FzZSBBTUxfTkFNRV9PUDoKQEAgLTU4OCwxMyArNTk2LDE1IEBACiAJCQkJICogUHV0IHRoZSBOb2RlIG9uIHRoZSBvYmplY3Qgc3RhY2sgKENvbnRhaW5zIHRoZSBBQ1BJIE5hbWUKIAkJCQkgKiBvZiB0aGlzIG9iamVjdCkKIAkJCQkgKi8KLQkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9ICh2b2lkICopIG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZTsKKwkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9CisJCQkJICAgICh2b2lkICopb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5ub2RlOwogCQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDE7CiAKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9ub2RlICh3YWxrX3N0YXRlLAotCQkJCQkJIG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZSwKLQkJCQkJCSBvcC0+Y29tbW9uLnBhcmVudCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX25vZGUod2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgIG9wLT5jb21tb24ucGFyZW50LT4KKwkJCQkJCQkgICAgIGNvbW1vbi5ub2RlLAorCQkJCQkJCSAgICAgb3AtPmNvbW1vbi5wYXJlbnQpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTYwMywyMCArNjEzLDI2IEBACiAKIAkJCWNhc2UgQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1A6CiAKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG9wLAotCQkJCQkJIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5ub2RlKSk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzCisJCQkJICAgICh3YWxrX3N0YXRlLCBvcCwKKwkJCQkgICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChvcC0+Y29tbW9uLgorCQkJCQkJCQkgcGFyZW50LT5jb21tb24uCisJCQkJCQkJCSBub2RlKSk7CiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6CiAKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG9wLCBOVUxMKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMKKwkJCQkgICAgKHdhbGtfc3RhdGUsIG9wLCBOVUxMKTsKIAkJCQlicmVhazsKIAkJCX0KIAogCQkJLyogRG9uZSB3aXRoIHJlc3VsdCBzdGF0ZSAoTm93IHRoYXQgb3BlcmFuZCBzdGFjayBpcyBidWlsdCkgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KIApAQCAtNjI1LDU2ICs2NDEsNTggQEAKIAkJCSAqIGN1cnJlbnQgcmVzdWx0IHN0YWNrCiAJCQkgKi8KIAkJCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcHVzaCAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19yZXN1bHRfcHVzaCh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLAorCQkJCQkJCXdhbGtfc3RhdGUpOwogCQkJfQogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9UWVBFX05BTUVEX0ZJRUxEOgogCQljYXNlIEFNTF9UWVBFX05BTUVEX0NPTVBMRVg6CiAJCWNhc2UgQU1MX1RZUEVfTkFNRURfU0lNUExFOgogCQljYXNlIEFNTF9UWVBFX05BTUVEX05PX09CSjoKIAotCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9lbmRfb3AgKHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9lbmRfb3Aod2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlicmVhazsKIAkJCX0KIAogCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkJIkV4ZWN1dGluZyBvcF9yZWdpb24gQWRkcmVzcy9MZW5ndGggT3A9JXBcbiIsIG9wKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkJICAiRXhlY3V0aW5nIG9wX3JlZ2lvbiBBZGRyZXNzL0xlbmd0aCBPcD0lcFxuIiwKKwkJCQkJCSAgb3ApKTsKIAotCQkJCXN0YXR1cyA9IGFjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMgKHdhbGtfc3RhdGUsIG9wKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyh3YWxrX3N0YXRlLAorCQkJCQkJCQkgb3ApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3AgKHdhbGtfc3RhdGUpOworCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKIAkJCX0KIAogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFNTF9UWVBFX1VOREVGSU5FRDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuZGVmaW5lZCBvcGNvZGUgdHlwZSBPcD0lcFxuIiwgb3ApKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0lNUExFTUVOVEVEKTsKLQorCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiVW5kZWZpbmVkIG9wY29kZSB0eXBlIE9wPSVwXG4iLCBvcCkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CiAKIAkJY2FzZSBBTUxfVFlQRV9CT0dVUzoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJIkludGVybmFsIG9wY29kZT0lWCB0eXBlIE9wPSVwXG4iLAotCQkJCXdhbGtfc3RhdGUtPm9wY29kZSwgb3ApKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkludGVybmFsIG9wY29kZT0lWCB0eXBlIE9wPSVwXG4iLAorCQkJCQkgIHdhbGtfc3RhdGUtPm9wY29kZSwgb3ApKTsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuaW1wbGVtZW50ZWQgb3Bjb2RlLCBjbGFzcz0lWCB0eXBlPSVYIE9wY29kZT0lWCBPcD0lcFxuIiwKLQkJCQlvcF9jbGFzcywgb3BfdHlwZSwgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBvcCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiVW5pbXBsZW1lbnRlZCBvcGNvZGUsIGNsYXNzPSVYIHR5cGU9JVggT3Bjb2RlPSVYIE9wPSVwXG4iLAorCQkJCQkgIG9wX2NsYXNzLCBvcF90eXBlLAorCQkJCQkgIG9wLT5jb21tb24uYW1sX29wY29kZSwgb3ApKTsKIAogCQkJc3RhdHVzID0gQUVfTk9UX0lNUExFTUVOVEVEOwogCQkJYnJlYWs7CkBAIC02ODUsNTUgKzcwMyw1OCBAQAogCSAqIEFDUEkgMi4wIHN1cHBvcnQgZm9yIDY0LWJpdCBpbnRlZ2VyczogVHJ1bmNhdGUgbnVtZXJpYwogCSAqIHJlc3VsdCB2YWx1ZSBpZiB3ZSBhcmUgZXhlY3V0aW5nIGZyb20gYSAzMi1iaXQgQUNQSSB0YWJsZQogCSAqLwotCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopOworCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUod2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7CiAKIAkvKgogCSAqIENoZWNrIGlmIHdlIGp1c3QgY29tcGxldGVkIHRoZSBldmFsdWF0aW9uIG9mIGEKIAkgKiBjb25kaXRpb25hbCBwcmVkaWNhdGUKIAkgKi8KIAotCWlmICgoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSAmJgotCQkod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgJiYKLQkJKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQotCQkJQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkcpICYmCi0JCSh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnByZWRpY2F0ZV9vcCA9PSBvcCkpIHsKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlICh3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKwlpZiAoKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSAmJgorCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgJiYKKwkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQorCSAgICAgQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkcpICYmCisJICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnByZWRpY2F0ZV9vcCA9PSBvcCkpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSh3YWxrX3N0YXRlLAorCQkJCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7CiAJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBOVUxMOwogCX0KIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIEludm9rZSBleGNlcHRpb24gaGFuZGxlciBvbiBlcnJvciAqLwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJgotCQlhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciAmJgotCQkhKHN0YXR1cyAmIEFFX0NPREVfQ09OVFJPTCkpIHsKLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOwotCQlzdGF0dXMgPSBhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciAoc3RhdHVzLAotCQkJCSB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+bmFtZS5pbnRlZ2VyLCB3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQsIE5VTEwpOwotCQkodm9pZCkgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYKKwkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIgJiYgIShzdGF0dXMgJiBBRV9DT0RFX0NPTlRST0wpKSB7CisJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOworCQlzdGF0dXMgPSBhY3BpX2dibF9leGNlcHRpb25faGFuZGxlcihzdGF0dXMsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUtPgorCQkJCQkJICAgIG5hbWUuaW50ZWdlciwKKwkJCQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCwKKwkJCQkJCSAgICBOVUxMKTsKKwkJKHZvaWQpYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CiAJCS8qIEJyZWFrIHRvIGRlYnVnZ2VyIHRvIGRpc3BsYXkgcmVzdWx0ICovCiAKLQkJQUNQSV9ERUJVR0dFUl9FWEVDIChhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwKLQkJCQkgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QKKwkJCQkgICAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSkpOwogCiAJCS8qCiAJCSAqIERlbGV0ZSB0aGUgcmVzdWx0IG9wIGlmIGFuZCBvbmx5IGlmOgogCQkgKiBQYXJlbnQgd2lsbCBub3QgdXNlIHRoZSByZXN1bHQgLS0gc3VjaCBhcyBhbnkKIAkJICogbm9uLW5lc3RlZCB0eXBlMiBvcCBpbiBhIG1ldGhvZCAocGFyZW50IHdpbGwgYmUgbWV0aG9kKQogCQkgKi8KLQkJYWNwaV9kc19kZWxldGVfcmVzdWx0X2lmX25vdF91c2VkIChvcCwgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSk7CisJCWFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZChvcCwgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwKKwkJCQkJCSAgd2Fsa19zdGF0ZSk7CiAJfQotCiAjaWZkZWYgX1VOREVSX0RFVkVMT1BNRU5UCiAKIAlpZiAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9PSB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sX2VuZCkgewotCQlhY3BpX2RiX21ldGhvZF9lbmQgKHdhbGtfc3RhdGUpOworCQlhY3BpX2RiX21ldGhvZF9lbmQod2Fsa19zdGF0ZSk7CiAJfQogI2VuZGlmCiAKQEAgLTc0NSwxMiArNzY2LDEwIEBACiAKIAkvKiBPbiBlcnJvciwgZGlzcGxheSBtZXRob2QgbG9jYWxzL2FyZ3MgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV9kbV9kdW1wX21ldGhvZF9pbmZvIChzdGF0dXMsIHdhbGtfc3RhdGUsIG9wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9kbV9kdW1wX21ldGhvZF9pbmZvKHN0YXR1cywgd2Fsa19zdGF0ZSwgb3ApOwogCX0KICNlbmRpZgogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwppbmRleCBkMTE2MjAwLi40MTE3MzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNTAsMTMgKzQ5LDEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAotI2lmZGVmIF9BQ1BJX0FTTF9DT01QSUxFUgorI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCiAjaW5jbHVkZSA8YWNwaS9hY2Rpc2FzbS5oPgogI2VuZGlmCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImRzd2xvYWQiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJkc3dsb2FkIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03MCwzMiArNjgsMjkgQEAKICAqIERFU0NSSVBUSU9OOiBJbml0IHdhbGsgc3RhdGUgY2FsbGJhY2tzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9jYWxsYmFja3MgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlcikKK2FjcGlfZHNfaW5pdF9jYWxsYmFja3Moc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwgdTMyIHBhc3NfbnVtYmVyKQogewogCiAJc3dpdGNoIChwYXNzX251bWJlcikgewogCWNhc2UgMToKLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICAgPSBBQ1BJX1BBUlNFX0xPQURfUEFTUzEgfAotCQkJCSAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKKwkJICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CiAJCXdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2xvYWQxX2JlZ2luX29wOwogCQl3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2xvYWQxX2VuZF9vcDsKIAkJYnJlYWs7CiAKIAljYXNlIDI6Ci0JCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKLQkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8CisJCSAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9lbmRfb3A7CiAJCWJyZWFrOwogCiAJY2FzZSAzOgogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICB8PSBBQ1BJX1BBUlNFX0VYRUNVVEUgIHwKLQkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyB8PSBBQ1BJX1BBUlNFX0VYRUNVVEUgfAorCQkgICAgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKIAkJd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfZXhlY19iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19leGVjX2VuZF9vcDsKICNlbmRpZgpAQCAtMTA4LDcgKzEwMyw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMV9iZWdpbl9vcApAQCAtMTIzLDM3ICsxMTcsMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2xvYWQxX2JlZ2luX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvdXRfb3ApCithY3BpX2RzX2xvYWQxX2JlZ2luX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiogb3V0X29wKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBvYmplY3RfdHlwZTsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOworCWNoYXIgKnBhdGg7CisJdTMyIGZsYWdzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19sb2FkMV9iZWdpbl9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19sb2FkMV9iZWdpbl9vcCIpOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkgIHdhbGtfc3RhdGUpKTsKIAogCS8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gb3Bjb2RlcyB0aGF0IGhhdmUgYW4gYXNzb2NpYXRlZCBuYW1lICovCiAKIAlpZiAob3ApIHsKIAkJaWYgKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpKSB7Ci0jaWYgMAotCQkJaWYgKCh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfRVhFQ1VURSkgfHwKLQkJCQkod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0NPTlRST0wpKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJcblxuKioqRVhFQ1VUQUJMRSBPUENPREUgJXMqKipcblxuIiwKLQkJCQkJd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSk7Ci0JCQkJKm91dF9vcCA9IG9wOwotCQkJCXJldHVybiAoQUVfQ1RSTF9TS0lQKTsKLQkJCX0KLSNlbmRpZgogCQkJKm91dF9vcCA9IG9wOwogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KQEAgLTE2NiwxNCArMTQ5LDE1IEBACiAJCX0KIAl9CiAKLQlwYXRoID0gYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nICgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKKwlwYXRoID0gYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOwogCiAJLyogTWFwIHRoZSByYXcgb3Bjb2RlIGludG8gYW4gaW50ZXJuYWwgb2JqZWN0IHR5cGUgKi8KIAogCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIlN0YXRlPSVwIE9wPSVwIFslc11cbiIsIHdhbGtfc3RhdGUsIG9wLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG9iamVjdF90eXBlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJTdGF0ZT0lcCBPcD0lcCBbJXNdXG4iLCB3YWxrX3N0YXRlLCBvcCwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSkpOwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKIAljYXNlIEFNTF9TQ09QRV9PUDoKQEAgLTE4MywyMyArMTY3LDI3IEBACiAJCSAqIHRoYXQgd2UgY2FuIGFjdHVhbGx5IG9wZW4gdGhlIHNjb3BlIHRvIGVudGVyIG5ldyBuYW1lcyB1bmRlcm5lYXRoIGl0LgogCQkgKiBBbGxvdyBzZWFyY2gtdG8tcm9vdCBmb3Igc2luZ2xlIG5hbWVzZWdzLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAotCQkJCSAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOwotI2lmZGVmIF9BQ1BJX0FTTF9DT01QSUxFUgorCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCisJCQkJICAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJICAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisjaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKIAkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKIAkJCS8qCiAJCQkgKiBUYWJsZSBkaXNhc3NlbWJseToKIAkJCSAqIFRhcmdldCBvZiBTY29wZSgpIG5vdCBmb3VuZC4gIEdlbmVyYXRlIGFuIEV4dGVybmFsIGZvciBpdCwgYW5kCiAJCQkgKiBpbnNlcnQgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLgogCQkJICovCi0JCQlhY3BpX2RtX2FkZF90b19leHRlcm5hbF9saXN0IChwYXRoKTsKLQkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLCBvYmplY3RfdHlwZSwKLQkJCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCi0JCQkJCSAgIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQkJYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdChwYXRoKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwKKwkJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMSwKKwkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLAorCQkJCQkgICAmKG5vZGUpKTsKIAkJfQogI2VuZGlmCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX05TRVJST1IgKHBhdGgsIHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihwYXRoLCBzdGF0dXMpOwogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKQEAgLTIwOCw3ICsxOTYsNyBAQAogCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCiAJCSAqLwogCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEU6ICAgICAgICAgLyogU2NvcGUgICovCisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOgkvKiBTY29wZSAgKi8KIAkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgogCQljYXNlIEFDUElfVFlQRV9QT1dFUjoKIAkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgpAQCAtMjMyLDkgKzIyMCwxMCBAQAogCQkJICogYSB3YXJuaW5nCiAJCQkgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCQkiVHlwZSBvdmVycmlkZSAtIFslNC40c10gaGFkIGludmFsaWQgdHlwZSAoJXMpIGZvciBTY29wZSBvcGVyYXRvciwgY2hhbmdlZCB0byAoU2NvcGUpXG4iLAotCQkJCXBhdGgsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiVHlwZSBvdmVycmlkZSAtIFslNC40c10gaGFkIGludmFsaWQgdHlwZSAoJXMpIGZvciBTY29wZSBvcGVyYXRvciwgY2hhbmdlZCB0byAoU2NvcGUpXG4iLAorCQkJCQkgIHBhdGgsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7CiAKIAkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCQkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlID0gQUNQSV9UWVBFX0FOWTsKQEAgLTI0NCwxNSArMjMzLDEyIEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIHBhdGgpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSksIHBhdGgpKTsKIAogCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAogCQkvKgpAQCAtMjgxLDE1ICsyNjcsMTUgQEAKIAogCQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0g7CiAJCWlmICgod2Fsa19zdGF0ZS0+b3Bjb2RlICE9IEFNTF9TQ09QRV9PUCkgJiYKLQkJCSghKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9ERUZFUlJFRF9PUCkpKSB7CisJCSAgICAoISh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfREVGRVJSRURfT1ApKSkgewogCQkJZmxhZ3MgfD0gQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiWyVzXSBDYW5ub3QgYWxyZWFkeSBleGlzdFxuIiwKLQkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSkpKTsKLQkJfQotCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSJbJXNdIEJvdGggRmluZCBvciBDcmVhdGUgYWxsb3dlZFxuIiwKLQkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIlslc10gQ2Fubm90IGFscmVhZHkgZXhpc3RcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiWyVzXSBCb3RoIEZpbmQgb3IgQ3JlYXRlIGFsbG93ZWRcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSkpOwogCQl9CiAKIAkJLyoKQEAgLTI5OCwyMiArMjg0LDIzIEBACiAJCSAqIGludm9sdmUgYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlCiAJCSAqIHBhcnNlIHRyZWUgbGF0ZXIuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0xPQURfUEFTUzEsIGZsYWdzLCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAocGF0aCwgc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAorCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgZmxhZ3MsIHdhbGtfc3RhdGUsCisJCQkJICAgJihub2RlKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihwYXRoLCBzdGF0dXMpOwogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAJCWJyZWFrOwogCX0KIAotCiAJLyogQ29tbW9uIGV4aXQgKi8KIAogCWlmICghb3ApIHsKIAkJLyogQ3JlYXRlIGEgbmV3IG9wICovCiAKLQkJb3AgPSBhY3BpX3BzX2FsbG9jX29wICh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKIAkJaWYgKCFvcCkgewogCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQl9CkBAIC0zMjcsMTkgKzMxNCwxOCBAQAogCW9wLT5uYW1lZC5wYXRoID0gKHU4ICopIHBhdGg7CiAjZW5kaWYKIAotCiAJLyoKIAkgKiBQdXQgdGhlIE5vZGUgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlIHBhcnNlciB1c2VzLCBzbyB3ZQogCSAqIGNhbiBnZXQgaXQgYWdhaW4gcXVpY2tseSB3aGVuIHRoaXMgc2NvcGUgaXMgY2xvc2VkCiAJICovCiAJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKLQlhY3BpX3BzX2FwcGVuZF9hcmcgKGFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZSAoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wKTsKKwlhY3BpX3BzX2FwcGVuZF9hcmcoYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLAorCQkJICAgb3ApOwogCiAJKm91dF9vcCA9IG9wOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2VuZF9vcApAQCAtMzUzLDIwICszMzksMTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMV9lbmRfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2RzX2xvYWQxX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIG9iamVjdF90eXBlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX2xvYWQxX2VuZF9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19sb2FkMV9lbmRfb3AiKTsKIAogCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgU3RhdGU9JXBcbiIsIG9wLAorCQkJICB3YWxrX3N0YXRlKSk7CiAKIAkvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG9wY29kZXMgdGhhdCBoYXZlIGFuIGFzc29jaWF0ZWQgbmFtZSAqLwogCkBAIC0zODAsMjEgKzM2MywyMCBAQAogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9GSUVMRCkgewotCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9GSUVMRF9PUCAgICAgICAgIHx8Ci0JCQl3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1AgICAgfHwKLQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5ERVhfRklFTERfT1ApIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9maWVsZF9vYmplY3RzIChvcCwgd2Fsa19zdGF0ZSk7CisJCWlmICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0ZJRUxEX09QIHx8CisJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1AgfHwKKwkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5ERVhfRklFTERfT1ApIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9maWVsZF9vYmplY3RzKG9wLCB3YWxrX3N0YXRlKTsKIAkJfQogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0KIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKLQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfcmVnaW9uIChvcC0+bmFtZWQuZGF0YSwgb3AtPm5hbWVkLmxlbmd0aCwKLQkJCQkgICAoYWNwaV9hZHJfc3BhY2VfdHlwZSkKLQkJCQkJCSAoKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLnZhbHVlLmludGVnZXIpLAotCQkJCQkJIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3JlZ2lvbihvcC0+bmFtZWQuZGF0YSwgb3AtPm5hbWVkLmxlbmd0aCwKKwkJCQkJICAgICAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKQorCQkJCQkgICAgICAgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi4KKwkJCQkJCXZhbHVlLmludGVnZXIpLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAl9CkBAIC00MDQsOCArMzg2LDExIEBACiAJCS8qIEZvciBOYW1lIG9wY29kZSwgZ2V0IHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZSBhcmd1bWVudCAqLwogCiAJCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgewotCQkJb2JqZWN0X3R5cGUgPSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAotCQkJCShvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi5hbWxfb3Bjb2RlKSktPm9iamVjdF90eXBlOworCQkJb2JqZWN0X3R5cGUgPSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8oKG9wLT5jb21tb24uCisJCQkJCQkJCXZhbHVlLmFyZyktPgorCQkJCQkJCSAgICAgICBjb21tb24uCisJCQkJCQkJICAgICAgIGFtbF9vcGNvZGUpKS0+CisJCQkgICAgb2JqZWN0X3R5cGU7CiAJCQlvcC0+Y29tbW9uLm5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOwogCQl9CiAJfQpAQCAtNDE5LDIzICs0MDQsMjYgQEAKIAkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKIAkJICogYXJndW1lbnRzLikKIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkJIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCi0JCQl3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJMT0FESU5HLU1ldGhvZDogU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSwgb3AsIG9wLT5uYW1lZC5ub2RlKSk7CiAKLQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG9wLT5uYW1lZC5ub2RlKSkgewotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKSBvcC0+bmFtZWQubm9kZTsKKwkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7CisJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9ICh2b2lkICopb3AtPm5hbWVkLm5vZGU7CiAJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwogCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgb3AtPmNvbW1vbi52YWx1ZS5hcmcpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX21ldGhvZCAob3AtPm5hbWVkLmRhdGEsCi0JCQkJCQkgICBvcC0+bmFtZWQubGVuZ3RoLCB3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCSAgICBvcC0+Y29tbW9uLnZhbHVlLmFyZyk7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9tZXRob2Qob3AtPm5hbWVkLmRhdGEsCisJCQkJCQkJICAgICAgIG9wLT5uYW1lZC5sZW5ndGgsCisJCQkJCQkJICAgICAgIHdhbGtfc3RhdGUpOwogCQkJfQogCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOwogCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKIAotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmV0dXJuIChzdGF0dXMpOwogCQkJfQogCQl9CkBAIC00NDMsMTcgKzQzMSwxNyBAQAogCiAJLyogUG9wIHRoZSBzY29wZSBzdGFjayAqLwogCi0JaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKG9iamVjdF90eXBlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIiglcyk6IFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSksIG9wKSk7CisJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUob2JqZWN0X3R5cGUpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiKCVzKTogUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCisJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqZWN0X3R5cGUpLCBvcCkpOwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wICh3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDJfYmVnaW5fb3AKQEAgLTQ2OCwzMCArNDU2LDUzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMl9iZWdpbl9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKQorYWNwaV9kc19sb2FkMl9iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqIG91dF9vcCkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3B0cjsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CisJY2hhciAqYnVmZmVyX3B0cjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2xvYWQyX2JlZ2luX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19sb2FkMl9iZWdpbl9vcCIpOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkgIHdhbGtfc3RhdGUpKTsKIAogCWlmIChvcCkgeworCQlpZiAoKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCisJCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09CisJCSAgICAgQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORykpIHsKKwkJCS8qIFdlIGFyZSBleGVjdXRpbmcgYSB3aGlsZSBsb29wIG91dHNpZGUgb2YgYSBtZXRob2QgKi8KKworCQkJc3RhdHVzID0gYWNwaV9kc19leGVjX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCiAJCS8qIFdlIG9ubHkgY2FyZSBhYm91dCBOYW1lc3BhY2Ugb3Bjb2RlcyBoZXJlICovCiAKIAkJaWYgKCghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT1BDT0RFKSAmJgotCQkJICAod2Fsa19zdGF0ZS0+b3Bjb2RlICE9IEFNTF9JTlRfTkFNRVBBVEhfT1ApKSB8fAotCQkJKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCSAgICAgKHdhbGtfc3RhdGUtPm9wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSkgfHwKKwkJICAgICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSkpIHsKKyNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQorCQkJaWYgKCh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfRVhFQ1VURSkgfHwKKwkJCSAgICAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0NPTlRST0wpKSB7CisKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkJICAiQmVnaW4vRVhFQzogJXMgKGZsICU4LjhYKVxuIiwKKwkJCQkJCSAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwKKwkJCQkJCSAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MpKTsKKworCQkJCS8qIEV4ZWN1dGluZyBhIHR5cGUxIG9yIHR5cGUyIG9wY29kZSBvdXRzaWRlIG9mIGEgbWV0aG9kICovCisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2RzX2V4ZWNfYmVnaW5fb3Aod2Fsa19zdGF0ZSwgb3V0X29wKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKyNlbmRpZgorCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCiAJCS8qIEdldCB0aGUgbmFtZSB3ZSBhcmUgZ29pbmcgdG8gZW50ZXIgb3IgbG9va3VwIGluIHRoZSBuYW1lc3BhY2UgKi8KQEAgLTUwMywyOCArNTE0LDI3IEBACiAJCQlpZiAoIWJ1ZmZlcl9wdHIpIHsKIAkJCQkvKiBObyBuYW1lLCBqdXN0IGV4aXQgKi8KIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKiBHZXQgbmFtZSBmcm9tIHRoZSBvcCAqLwogCi0JCQlidWZmZXJfcHRyID0gKGNoYXIgKikgJm9wLT5uYW1lZC5uYW1lOworCQkJYnVmZmVyX3B0ciA9IChjaGFyICopJm9wLT5uYW1lZC5uYW1lOwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIEdldCB0aGUgbmFtZXN0cmluZyBmcm9tIHRoZSByYXcgQU1MICovCiAKLQkJYnVmZmVyX3B0ciA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSk7CisJCWJ1ZmZlcl9wdHIgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOwogCX0KIAogCS8qIE1hcCB0aGUgb3Bjb2RlIGludG8gYW4gaW50ZXJuYWwgb2JqZWN0IHR5cGUgKi8KIAogCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIlN0YXRlPSVwIE9wPSVwIFR5cGU9JVhcbiIsIHdhbGtfc3RhdGUsIG9wLCBvYmplY3RfdHlwZSkpOwotCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIlN0YXRlPSVwIE9wPSVwIFR5cGU9JVhcbiIsIHdhbGtfc3RhdGUsIG9wLAorCQkJICBvYmplY3RfdHlwZSkpOwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKIAljYXNlIEFNTF9GSUVMRF9PUDoKQEAgLTU0Miw5ICs1NTIsMTAgQEAKIAkJICogRG9uJ3QgZW50ZXIgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cAogCQkgKiBmb3IgdXNlIGxhdGVyLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsIG9iamVjdF90eXBlLAotCQkJCSAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCi0JCQkJICB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCisJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOwogCQlicmVhazsKIAogCWNhc2UgQU1MX1NDT1BFX09QOgpAQCAtNTU0LDI4ICs1NjUsMjggQEAKIAkJICogRG9uJ3QgZW50ZXIgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cAogCQkgKiBmb3IgdXNlIGxhdGVyLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsIG9iamVjdF90eXBlLAotCQkJCSAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCi0JCQkJICB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotI2lmZGVmIF9BQ1BJX0FTTF9DT01QSUxFUgorCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwKKwkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCiAJCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewogCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoYnVmZmVyX3B0ciwgc3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihidWZmZXJfcHRyLCBzdGF0dXMpOwogCQkJfQogI2Vsc2UKLQkJCUFDUElfUkVQT1JUX05TRVJST1IgKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7CisJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7CiAjZW5kaWYKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJCS8qCiAJCSAqIFdlIG11c3QgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcwogCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCiAJCSAqLwogCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEU6ICAgICAgICAgLyogU2NvcGUgKi8KKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEU6CS8qIFNjb3BlICovCiAJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CiAJCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKQEAgLTU5Niw5ICs2MDcsNyBAQAogCQkJICogIFNjb3BlIChERUIpIHsgLi4uIH0KIAkJCSAqLwogCi0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCi0JCQkJIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKLQkJCQlidWZmZXJfcHRyLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiVHlwZSBvdmVycmlkZSAtIFslNC40c10gaGFkIGludmFsaWQgdHlwZSAoJXMpIGZvciBTY29wZSBvcGVyYXRvciwgY2hhbmdlZCB0byAoU2NvcGUpXG4iLCBidWZmZXJfcHRyLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpKTsKIAogCQkJbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9BTlk7CiAJCQl3YWxrX3N0YXRlLT5zY29wZV9pbmZvLT5jb21tb24udmFsdWUgPSBBQ1BJX1RZUEVfQU5ZOwpAQCAtNjA4LDkgKzYxNyw3IEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdXG4iLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIGJ1ZmZlcl9wdHIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdXG4iLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSksIGJ1ZmZlcl9wdHIpKTsKIAogCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQpAQCAtNjI1LDE0ICs2MzIsMTYgQEAKIAogCQkJbm9kZSA9IG9wLT5jb21tb24ubm9kZTsKIAotCQkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKG9iamVjdF90eXBlKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaCAobm9kZSwgb2JqZWN0X3R5cGUsIHdhbGtfc3RhdGUpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUob2JqZWN0X3R5cGUpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoKG5vZGUsIG9iamVjdF90eXBlLAorCQkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIAogCQkJfQotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAKIAkJLyoKQEAgLTY1MSwyNCArNjYwLDI2IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19OT19VUFNFQVJDSCwKLQkJCQkgIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQkvKiBBZGQgbmV3IGVudHJ5IGludG8gbmFtZXNwYWNlICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCisJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMiwKKwkJCQkgICBBQ1BJX05TX05PX1VQU0VBUkNILCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9OU0VSUk9SIChidWZmZXJfcHRyLCBzdGF0dXMpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX05TRVJST1IoYnVmZmVyX3B0ciwgc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0KIAlpZiAoIW9wKSB7CiAJCS8qIENyZWF0ZSBhIG5ldyBvcCAqLwogCi0JCW9wID0gYWNwaV9wc19hbGxvY19vcCAod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJb3AgPSBhY3BpX3BzX2FsbG9jX29wKHdhbGtfc3RhdGUtPm9wY29kZSk7CiAJCWlmICghb3ApIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogSW5pdGlhbGl6ZSB0aGUgbmV3IG9wICovCkBAIC02NzYsOSArNjg3LDcgQEAKIAkJaWYgKG5vZGUpIHsKIAkJCW9wLT5uYW1lZC5uYW1lID0gbm9kZS0+bmFtZS5pbnRlZ2VyOwogCQl9Ci0JCWlmIChvdXRfb3ApIHsKLQkJCSpvdXRfb3AgPSBvcDsKLQkJfQorCQkqb3V0X29wID0gb3A7CiAJfQogCiAJLyoKQEAgLTY4NywxMCArNjk2LDkgQEAKIAkgKi8KIAlvcC0+Y29tbW9uLm5vZGUgPSBub2RlOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDJfZW5kX29wCkBAIC03MDQsMzkgKzcxMiw1NCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2xvYWQyX2VuZF9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfbG9hZDJfZW5kX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3A7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIG9iamVjdF90eXBlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5ld19ub2RlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOwogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJdTMyIGk7CiAjZW5kaWYKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX2xvYWQyX2VuZF9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2xvYWQyX2VuZF9vcCIpOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wY29kZSBbJXNdIE9wICVwIFN0YXRlICVwXG4iLAotCQkJd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwgb3AsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3Bjb2RlIFslc10gT3AgJXAgU3RhdGUgJXBcbiIsCisJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsIG9wLCB3YWxrX3N0YXRlKSk7CiAKLQkvKiBPbmx5IGludGVyZXN0ZWQgaW4gb3Bjb2RlcyB0aGF0IGhhdmUgbmFtZXNwYWNlIG9iamVjdHMgKi8KKwkvKiBDaGVjayBpZiBvcGNvZGUgaGFkIGFuIGFzc29jaWF0ZWQgbmFtZXNwYWNlIG9iamVjdCAqLwogCiAJaWYgKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNPQkpFQ1QpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKyNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQorCQkvKiBObyBuYW1lc3BhY2Ugb2JqZWN0LiBFeGVjdXRhYmxlIG9wY29kZT8gKi8KKworCQlpZiAoKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19FWEVDVVRFKSB8fAorCQkgICAgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiRW5kL0VYRUM6ICAgJXMgKGZsICU4LjhYKVxuIiwKKwkJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLAorCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzKSk7CisKKwkJCS8qIEV4ZWN1dGluZyBhIHR5cGUxIG9yIHR5cGUyIG9wY29kZSBvdXRzaWRlIG9mIGEgbWV0aG9kICovCisKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19lbmRfb3Aod2Fsa19zdGF0ZSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9TQ09QRV9PUCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSJFbmRpbmcgc2NvcGUgT3A9JXAgU3RhdGU9JXBcbiIsIG9wLCB3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiRW5kaW5nIHNjb3BlIE9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAl9CiAKLQogCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7CiAKIAkvKgpAQCAtNzQ5LDE4ICs3NzIsMTkgQEAKIAkgKiBQdXQgdGhlIE5vZGUgb24gdGhlIG9iamVjdCBzdGFjayAoQ29udGFpbnMgdGhlIEFDUEkgTmFtZSBvZgogCSAqIHRoaXMgb2JqZWN0KQogCSAqLwotCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gKHZvaWQgKikgbm9kZTsKKwl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9ICh2b2lkICopbm9kZTsKIAl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwogCiAJLyogUG9wIHRoZSBzY29wZSBzdGFjayAqLwogCi0JaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKG9iamVjdF90eXBlKSAmJgotCSAgIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0lOVF9NRVRIT0RDQUxMX09QKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCi0JCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG9iamVjdF90eXBlKSwgb3ApKTsKKwlpZiAoYWNwaV9uc19vcGVuc19zY29wZShvYmplY3RfdHlwZSkgJiYKKwkgICAgKG9wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX01FVEhPRENBTExfT1ApKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKKwkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSksIG9wKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wb3AgKHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCX0KQEAgLTc5Myw5ICs4MTcsMTAgQEAKIAkgKiBBTUxfVEhFUk1BTFpPTkUKIAkgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAotCQkiQ3JlYXRlLUxvYWQgWyVzXSBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLCB3YWxrX3N0YXRlLCBvcCwgbm9kZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJDcmVhdGUtTG9hZCBbJXNdIFN0YXRlPSVwIE9wPSVwIG5hbWVkX29iaj0lcFxuIiwKKwkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKKwkJCSAgd2Fsa19zdGF0ZSwgb3AsIG5vZGUpKTsKIAogCS8qIERlY29kZSB0aGUgb3Bjb2RlICovCiAKQEAgLTgxMCwyNyArODM1LDMyIEBACiAJCSAqIENyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIGJ1ZmZlciBhbmQgaW5kZXggbXVzdAogCQkgKiBiZSBldmFsdWF0ZWQgbGF0ZXIgZHVyaW5nIHRoZSBleGVjdXRpb24gcGhhc2UKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZCAob3AsIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9idWZmZXJfZmllbGQob3AsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCi0JIGNhc2UgQU1MX1RZUEVfTkFNRURfRklFTEQ6CisJY2FzZSBBTUxfVFlQRV9OQU1FRF9GSUVMRDoKIAogCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewogCQljYXNlIEFNTF9JTkRFWF9GSUVMRF9PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQgKG9wLCAoYWNwaV9oYW5kbGUpIGFyZy0+Y29tbW9uLm5vZGUsCi0JCQkJCSB3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQob3AsCisJCQkJCQkgICAgICAgKGFjcGlfaGFuZGxlKSBhcmctPgorCQkJCQkJICAgICAgIGNvbW1vbi5ub2RlLCB3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX0JBTktfRklFTERfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2JhbmtfZmllbGQgKG9wLCBhcmctPmNvbW1vbi5ub2RlLCB3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfYmFua19maWVsZChvcCwgYXJnLT5jb21tb24ubm9kZSwKKwkJCQkJCSAgICAgIHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfRklFTERfT1A6CiAKLQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2ZpZWxkIChvcCwgYXJnLT5jb21tb24ubm9kZSwgd2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfY3JlYXRlX2ZpZWxkKG9wLCBhcmctPmNvbW1vbi5ub2RlLAorCQkJCQkJIHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTgzOSw0MyArODY5LDQyIEBACiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9UWVBFX05BTUVEX1NJTVBMRToKIAotCSBjYXNlIEFNTF9UWVBFX05BTUVEX1NJTVBMRToKLQotCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAod2Fsa19zdGF0ZSwgYXJnKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBhcmcpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CiAJCWNhc2UgQU1MX1BST0NFU1NPUl9PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yICh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3Nvcih3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX1BPV0VSX1JFU19PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfcG93ZXJfcmVzb3VyY2UgKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfcG93ZXJfcmVzb3VyY2Uod2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9NVVRFWF9PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfbXV0ZXggKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfbXV0ZXgod2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9FVkVOVF9PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfZXZlbnQgKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfZXZlbnQod2Fsa19zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9EQVRBX1JFR0lPTl9PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uICh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbih3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX0FMSUFTX09QOgogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9hbGlhcyAod2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9hbGlhcyh3YWxrX3N0YXRlKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC04ODgsMTIgKzkxNywxMiBAQAogCQkvKiBEZWxldGUgb3BlcmFuZHMgKi8KIAogCQlmb3IgKGkgPSAxOyBpIDwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzOyBpKyspIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKIAkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKIAkJfQogCiAJCWJyZWFrOwotI2VuZGlmIC8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLworI2VuZGlmCQkJCS8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLwogCiAJY2FzZSBBTUxfVFlQRV9OQU1FRF9DT01QTEVYOgogCkBAIC05MDksOSArOTM4LDEwIEBACiAJCQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVnaW9uLCBpbml0aWFsaXplIGl0CiAJCQkgKiBOYW1lc3BhY2UgaXMgTk9UIGxvY2tlZCBhdCB0aGlzIHBvaW50LgogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uIChhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpLAotCQkJCQkgRkFMU0UpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uCisJCQkgICAgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSwgRkFMU0UpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJLyoKIAkJCQkgKiAgSWYgQUVfTk9UX0VYSVNUIGlzIHJldHVybmVkLCBpdCBpcyBub3QgZmF0YWwKIAkJCQkgKiAgYmVjYXVzZSBtYW55IHJlZ2lvbnMgZ2V0IGNyZWF0ZWQgYmVmb3JlIGEgaGFuZGxlcgpAQCAtOTIzLDEzICs5NTMsMTEgQEAKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfTkFNRV9PUDoKIAotCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSAod2Fsa19zdGF0ZSwgbm9kZSwgb3ApOworCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSh3YWxrX3N0YXRlLCBub2RlLCBvcCk7CiAJCQlicmVhazsKLSNlbmRpZiAvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KLQorI2VuZGlmCQkJCS8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLwogCiAJCWRlZmF1bHQ6CiAJCQkvKiBBbGwgTkFNRURfQ09NUExFWCBvcGNvZGVzIG11c3QgYmUgaGFuZGxlZCBhYm92ZSAqLwpAQCAtOTM4LDI3ICs5NjYsMjkgQEAKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfQ0xBU1NfSU5URVJOQUw6CiAKIAkJLyogY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOiAqLwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfQ0xBU1NfTUVUSE9EX0NBTEw6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkiUkVTT0xWSU5HLW1ldGhvZF9jYWxsOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCi0JCQl3YWxrX3N0YXRlLCBvcCwgbm9kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIlJFU09MVklORy1tZXRob2RfY2FsbDogU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSwgb3AsIG5vZGUpKTsKIAogCQkvKgogCQkgKiBMb29rdXAgdGhlIG1ldGhvZCBuYW1lIGFuZCBzYXZlIHRoZSBOb2RlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAotCQkJCSAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MyLAotCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCi0JCQkJICB3YWxrX3N0YXRlLCAmKG5ld19ub2RlKSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sCisJCQkJICAgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBBQ1BJX1RZUEVfQU5ZLAorCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMiwKKwkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfAorCQkJCSAgIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCB3YWxrX3N0YXRlLAorCQkJCSAgICYobmV3X25vZGUpKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKIAkJCS8qCiAJCQkgKiBNYWtlIHN1cmUgdGhhdCB3aGF0IHdlIGZvdW5kIGlzIGluZGVlZCBhIG1ldGhvZAogCQkJICogV2UgZGlkbid0IHNlYXJjaCBmb3IgYSBtZXRob2Qgb24gcHVycG9zZSwgdG8gc2VlIGlmIHRoZSBuYW1lCkBAIC05NzMsMjQgKzEwMDMsMjAgQEAKIAkJCSAqIHBhcnNlciB1c2VzLCBzbyB3ZSBjYW4gZ2V0IGl0IGFnYWluIGF0IHRoZSBlbmQgb2YgdGhpcyBzY29wZQogCQkJICovCiAJCQlvcC0+Y29tbW9uLm5vZGUgPSBuZXdfbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUFDUElfUkVQT1JUX05TRVJST1IgKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfUkVQT1JUX05TRVJST1IoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwogCQl9CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogUmVtb3ZlIHRoZSBOb2RlIHB1c2hlZCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgKi8KIAogCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKIAl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwppbmRleCAyMWY0NTQ4Li5kZWZlOTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKQEAgLTQxLDE0ICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc3dzY29wZSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImRzd3Njb3BlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MiwxNSArNTksMTEgQEAKICAqICAgICAgICAgICAgICByb290IHNjb3BlIG9iamVjdCAod2hpY2ggcmVtYWlucyBhdCB0aGUgc3RhY2sgdG9wLikKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQordm9pZCBhY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc2NvcGVfaW5mbzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19zY29wZV9zdGFja19jbGVhciIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19zY29wZV9zdGFja19jbGVhciIpOwogCiAJd2hpbGUgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8pIHsKIAkJLyogUG9wIGEgc2NvcGUgb2ZmIHRoZSBzdGFjayAqLwpAQCAtNzgsMTQgKzcxLDE0IEBACiAJCXNjb3BlX2luZm8gPSB3YWxrX3N0YXRlLT5zY29wZV9pbmZvOwogCQl3YWxrX3N0YXRlLT5zY29wZV9pbmZvID0gc2NvcGVfaW5mby0+c2NvcGUubmV4dDsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIlBvcHBlZCBvYmplY3QgdHlwZSAoJXMpXG4iLAotCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChzY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHNjb3BlX2luZm8pOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiUG9wcGVkIG9iamVjdCB0eXBlICglcylcbiIsCisJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoc2NvcGVfaW5mby0+Y29tbW9uLgorCQkJCQkJCXZhbHVlKSkpOworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHNjb3BlX2luZm8pOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gKQEAgLTEwMiw3NCArOTUsNzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2ggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc2NvcGVfaW5mbzsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpvbGRfc2NvcGVfaW5mbzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpvbGRfc2NvcGVfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX3Njb3BlX3N0YWNrX3B1c2giKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX3Njb3BlX3N0YWNrX3B1c2giKTsKIAogCWlmICghbm9kZSkgewogCQkvKiBJbnZhbGlkIHNjb3BlICAgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJkc19zY29wZV9zdGFja19wdXNoOiBudWxsIHNjb3BlIHBhc3NlZFxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImRzX3Njb3BlX3N0YWNrX3B1c2g6IG51bGwgc2NvcGUgcGFzc2VkXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgb2JqZWN0IHR5cGUgaXMgdmFsaWQgKi8KIAotCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAodHlwZSkpIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAotCQkJImRzX3Njb3BlX3N0YWNrX3B1c2g6IEludmFsaWQgb2JqZWN0IHR5cGU6IDB4JVhcbiIsIHR5cGUpKTsKKwlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUodHlwZSkpIHsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoImRzX3Njb3BlX3N0YWNrX3B1c2g6IEludmFsaWQgb2JqZWN0IHR5cGU6IDB4JVhcbiIsIHR5cGUpKTsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhIG5ldyBzY29wZSBvYmplY3QgKi8KIAotCXNjb3BlX2luZm8gPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlICgpOworCXNjb3BlX2luZm8gPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CiAJaWYgKCFzY29wZV9pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogSW5pdCBuZXcgc2NvcGUgb2JqZWN0ICovCiAKIAlzY29wZV9pbmZvLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfV1NDT1BFOwotCXNjb3BlX2luZm8tPnNjb3BlLm5vZGUgICAgICA9IG5vZGU7Ci0Jc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlICAgID0gKHUxNikgdHlwZTsKKwlzY29wZV9pbmZvLT5zY29wZS5ub2RlID0gbm9kZTsKKwlzY29wZV9pbmZvLT5jb21tb24udmFsdWUgPSAodTE2KSB0eXBlOwogCiAJd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgrKzsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJbJS4yZF0gUHVzaGVkIHNjb3BlICIsICh1MzIpIHdhbGtfc3RhdGUtPnNjb3BlX2RlcHRoKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiWyUuMmRdIFB1c2hlZCBzY29wZSAiLAorCQkJICAodTMyKSB3YWxrX3N0YXRlLT5zY29wZV9kZXB0aCkpOwogCiAJb2xkX3Njb3BlX2luZm8gPSB3YWxrX3N0YXRlLT5zY29wZV9pbmZvOwogCWlmIChvbGRfc2NvcGVfaW5mbykgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywKLQkJCSJbJTQuNHNdICglcykiLAotCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvbGRfc2NvcGVfaW5mby0+c2NvcGUubm9kZSksCi0JCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG9sZF9zY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywKLQkJCSJbXFxfX19dICglcykiLCAiUk9PVCIpKTsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywKKwkJCQkgICAgICAiWyU0LjRzXSAoJXMpIiwKKwkJCQkgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2xkX3Njb3BlX2luZm8tPgorCQkJCQkJCSAgICBzY29wZS5ub2RlKSwKKwkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUob2xkX3Njb3BlX2luZm8tPgorCQkJCQkJCSAgICBjb21tb24udmFsdWUpKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywgIltcXF9fX10gKCVzKSIsICJST09UIikpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FWEVDLAotCQkiLCBOZXcgc2NvcGUgLT4gWyU0LjRzXSAoJXMpXG4iLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHNjb3BlX2luZm8tPnNjb3BlLm5vZGUpLAotCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLAorCQkJICAgICAgIiwgTmV3IHNjb3BlIC0+IFslNC40c10gKCVzKVxuIiwKKwkJCSAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShzY29wZV9pbmZvLT5zY29wZS5ub2RlKSwKKwkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShzY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7CiAKIAkvKiBQdXNoIG5ldyBzY29wZSBvYmplY3Qgb250byBzdGFjayAqLwogCi0JYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZ3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBzY29wZV9pbmZvKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgc2NvcGVfaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcApAQCAtMTgyLDQ3ICsxNzEsNDEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19zY29wZV9zdGFja19wb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm87Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqbmV3X3Njb3BlX2luZm87CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqbmV3X3Njb3BlX2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19zY29wZV9zdGFja19wb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX3Njb3BlX3N0YWNrX3BvcCIpOwogCiAJLyoKIAkgKiBQb3Agc2NvcGUgaW5mbyBvYmplY3Qgb2ZmIHRoZSBzdGFjay4KIAkgKi8KLQlzY29wZV9pbmZvID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJndhbGtfc3RhdGUtPnNjb3BlX2luZm8pOworCXNjb3BlX2luZm8gPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5zY29wZV9pbmZvKTsKIAlpZiAoIXNjb3BlX2luZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVEFDS19VTkRFUkZMT1cpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKIAl9CiAKIAl3YWxrX3N0YXRlLT5zY29wZV9kZXB0aC0tOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJIlslLjJkXSBQb3BwZWQgc2NvcGUgWyU0LjRzXSAoJXMpLCBOZXcgc2NvcGUgLT4gIiwKLQkJKHUzMikgd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoc2NvcGVfaW5mby0+c2NvcGUubm9kZSksCi0JCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIlslLjJkXSBQb3BwZWQgc2NvcGUgWyU0LjRzXSAoJXMpLCBOZXcgc2NvcGUgLT4gIiwKKwkJCSAgKHUzMikgd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShzY29wZV9pbmZvLT5zY29wZS5ub2RlKSwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSkpKTsKIAogCW5ld19zY29wZV9pbmZvID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKIAlpZiAobmV3X3Njb3BlX2luZm8pIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VYRUMsCi0JCQkiWyU0LjRzXSAoJXMpXG4iLAotCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChuZXdfc2NvcGVfaW5mby0+c2NvcGUubm9kZSksCi0JCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG5ld19zY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywKLQkJCSJbXFxfX19dIChST09UKVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLAorCQkJCSAgICAgICJbJTQuNHNdICglcylcbiIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5ld19zY29wZV9pbmZvLT4KKwkJCQkJCQkgICAgc2NvcGUubm9kZSksCisJCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5ld19zY29wZV9pbmZvLT4KKwkJCQkJCQkgICAgY29tbW9uLnZhbHVlKSkpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsICJbXFxfX19dIChST09UKVxuIikpOwogCX0KIAotCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHNjb3BlX2luZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGVfaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYwppbmRleCA5Y2QzZGI2Li43ZDY4YTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKQEAgLTQxLDM3ICs0MSwyOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc3dzdGF0ZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJkc3dzdGF0ZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfaW5zZXJ0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfcmVzdWx0X2luc2VydCh2b2lkICpvYmplY3QsCisJCSAgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi12b2lkICoKLWFjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK3ZvaWQgKmFjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSh1MzIgaW5kZXgsCisJCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKICNlbmRpZgogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKQEAgLTkyLDM2ICs4MywzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdWx0X3JlbW92ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX3Jlc3VsdF9yZW1vdmUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKKwkJICAgICAgdTMyIGluZGV4LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX3Jlc3VsdF9yZW1vdmUiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfcmVzdWx0X3JlbW92ZSIpOwogCiAJc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwogCWlmICghc3RhdGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyByZXN1bHQgb2JqZWN0IHB1c2hlZCEgU3RhdGU9JXBcbiIsCi0JCQl3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7CiAJfQogCiAJaWYgKGluZGV4ID49IEFDUElfT0JKX01BWF9PUEVSQU5EKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkluZGV4IG91dCBvZiByYW5nZTogJVggU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJaW5kZXgsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW5kZXggb3V0IG9mIHJhbmdlOiAlWCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJICBpbmRleCwgd2Fsa19zdGF0ZSwKKwkJCQkgIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAJfQogCiAJLyogQ2hlY2sgZm9yIGEgdmFsaWQgcmVzdWx0IG9iamVjdCAqLwogCi0JaWYgKCFzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCwgSW5kZXg9JVhcbiIsCi0JCQl3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgaW5kZXgpKTsKKwlpZiAoIXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4XSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCwgSW5kZXg9JVhcbiIsCisJCQkJICB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywKKwkJCQkgIGluZGV4KSk7CiAJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiAJfQogCkBAIC0xMjksMTggKzExOSwyMCBAQAogCiAJc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMtLTsKIAotCSpvYmplY3QgPSBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdOwotCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtpbmRleF0gPSBOVUxMOworCSpvYmplY3QgPSBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleF07CisJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdID0gTlVMTDsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCSpvYmplY3QsICgqb2JqZWN0KSA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCpvYmplY3QpIDogIk5VTEwiLAotCQlpbmRleCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkgICpvYmplY3QsCisJCQkgICgqb2JqZWN0KSA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKm9iamVjdCkgOgorCQkJICAiTlVMTCIsIGluZGV4LCB3YWxrX3N0YXRlLAorCQkJICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwogCiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNTcsMTYgKzE0OSwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdWx0X3BvcCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19yZXN1bHRfcG9wKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiogb2JqZWN0LAorCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGluZGV4OwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCWFjcGlfbmF0aXZlX3VpbnQgaW5kZXg7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X3BvcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfcG9wIik7CiAKIAlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJaWYgKCFzdGF0ZSkgewpAQCAtMTc0LDggKzE2Myw5IEBACiAJfQogCiAJaWYgKCFzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlJlc3VsdCBzdGFjayBpcyBlbXB0eSEgU3RhdGU9JXBcbiIsCi0JCQl3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiUmVzdWx0IHN0YWNrIGlzIGVtcHR5ISBTdGF0ZT0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKQEAgLTE4NiwyNiArMTc2LDI3IEBACiAJZm9yIChpbmRleCA9IEFDUElfT0JKX05VTV9PUEVSQU5EUzsgaW5kZXg7IGluZGV4LS0pIHsKIAkJLyogQ2hlY2sgZm9yIGEgdmFsaWQgcmVzdWx0IG9iamVjdCAqLwogCi0JCWlmIChzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXggLTFdKSB7Ci0JCQkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4IC0xXTsKLQkJCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFtpbmRleCAtMV0gPSBOVUxMOworCQlpZiAoc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXggLSAxXSkgeworCQkJKm9iamVjdCA9IHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4IC0gMV07CisJCQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleCAtIDFdID0gTlVMTDsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJCSpvYmplY3QsCi0JCQkJKCpvYmplY3QpID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCkgOiAiTlVMTCIsCi0JCQkJKHUzMikgaW5kZXggLTEsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIk9iaj0lcCBbJXNdIEluZGV4PSVYIFN0YXRlPSVwIE51bT0lWFxuIiwKKwkJCQkJICAqb2JqZWN0LAorCQkJCQkgICgqb2JqZWN0KSA/CisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgqb2JqZWN0KQorCQkJCQkgIDogIk5VTEwiLCAodTMyKSBpbmRleCAtIDEsIHdhbGtfc3RhdGUsCisJCQkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkgICJObyByZXN1bHQgb2JqZWN0cyEgU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKIAlyZXR1cm4gKEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3BvcF9mcm9tX2JvdHRvbQpAQCAtMjIxLDM4ICsyMTIsMzcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wb3BfZnJvbV9ib3R0b20gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfcmVzdWx0X3BvcF9mcm9tX2JvdHRvbSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqIG9iamVjdCwKKwkJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGluZGV4OwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCWFjcGlfbmF0aXZlX3VpbnQgaW5kZXg7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X3BvcF9mcm9tX2JvdHRvbSIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tIik7CiAKIAlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJaWYgKCFzdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJXYXJuaW5nOiBObyByZXN1bHQgb2JqZWN0IHB1c2hlZCEgU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJXYXJuaW5nOiBObyByZXN1bHQgb2JqZWN0IHB1c2hlZCEgU3RhdGU9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAlpZiAoIXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm4gKEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpOwogCX0KIAogCS8qIFJlbW92ZSBCb3R0b20gZWxlbWVudCAqLwogCi0JKm9iamVjdCA9IHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjIFswXTsKKwkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbMF07CiAKIAkvKiBQdXNoIGVudGlyZSBzdGFjayBkb3duIG9uZSBlbGVtZW50ICovCiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0czsgaW5kZXgrKykgewotCQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4ICsgMV07CisJCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4XSA9CisJCSAgICBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleCArIDFdOwogCX0KIAogCXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLS07CkBAIC0yNjAsMjAgKzI1MCwyMSBAQAogCS8qIENoZWNrIGZvciBhIHZhbGlkIHJlc3VsdCBvYmplY3QgKi8KIAogCWlmICghKm9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVgsIEluZGV4PSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsICh1MzIpIGluZGV4KSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYIEluZGV4PSVYXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsCisJCQkJICAodTMyKSBpbmRleCkpOwogCQlyZXR1cm4gKEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSwgUmVzdWx0cz0lcCBTdGF0ZT0lcFxuIiwKLQkJKm9iamVjdCwgKCpvYmplY3QpID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCkgOiAiTlVMTCIsCi0JCXN0YXRlLCB3YWxrX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gUmVzdWx0cz0lcCBTdGF0ZT0lcFxuIiwKKwkJCSAgKm9iamVjdCwKKwkJCSAgKCpvYmplY3QpID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgqb2JqZWN0KSA6CisJCQkgICJOVUxMIiwgc3RhdGUsIHdhbGtfc3RhdGUpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3B1c2gKQEAgLTI4OCw0NyArMjc5LDUwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfcHVzaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX3Jlc3VsdF9wdXNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBvYmplY3QsCisJCSAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19yZXN1bHRfcHVzaCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfcHVzaCIpOwogCiAJc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwogCWlmICghc3RhdGUpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTm8gcmVzdWx0IHN0YWNrIGZyYW1lIGR1cmluZyBwdXNoXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gcmVzdWx0IHN0YWNrIGZyYW1lIGR1cmluZyBwdXNoXG4iKSk7CiAJCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKIAl9CiAKIAlpZiAoc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMgPT0gQUNQSV9PQkpfTlVNX09QRVJBTkRTKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlJlc3VsdCBzdGFjayBvdmVyZmxvdzogT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCW9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJSZXN1bHQgc3RhY2sgb3ZlcmZsb3c6IE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJICBvYmplY3QsIHdhbGtfc3RhdGUsCisJCQkJICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwogCQlyZXR1cm4gKEFFX1NUQUNLX09WRVJGTE9XKTsKIAl9CiAKIAlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCW9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKKwkJCQkgIG9iamVjdCwgd2Fsa19zdGF0ZSwKKwkJCQkgIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW3N0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzXSA9IG9iamVjdDsKKwlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0c10gPSBvYmplY3Q7CiAJc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMrKzsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCBOdW09JVggQ3VyPSVYXG4iLAotCQlvYmplY3QsIG9iamVjdCA/IGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIG9iamVjdCkgOiAiTlVMTCIsCi0JCXdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLCB3YWxrX3N0YXRlLT5jdXJyZW50X3Jlc3VsdCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwIE51bT0lWCBDdXI9JVhcbiIsCisJCQkgIG9iamVjdCwKKwkJCSAgb2JqZWN0ID8KKwkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCQkJCQkgICAgICAgb2JqZWN0KSA6ICJOVUxMIiwKKwkJCSAgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsCisJCQkgIHdhbGtfc3RhdGUtPmN1cnJlbnRfcmVzdWx0KSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoCkBAIC0zNDEsMzAgKzMzNSwyNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X3N0YWNrX3B1c2giKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX3Jlc3VsdF9zdGFja19wdXNoIik7CiAKLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoKTsKKwlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKIAlpZiAoIXN0YXRlKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1JFU1VMVDsKLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoJndhbGtfc3RhdGUtPnJlc3VsdHMsIHN0YXRlKTsKKwlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+cmVzdWx0cywgc3RhdGUpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlJlc3VsdHM9JXAgU3RhdGU9JXBcbiIsCi0JCXN0YXRlLCB3YWxrX3N0YXRlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmVzdWx0cz0lcCBTdGF0ZT0lcFxuIiwKKwkJCSAgc3RhdGUsIHdhbGtfc3RhdGUpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcApAQCAtMzc3LDM1ICszNjcsMzEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19yZXN1bHRfc3RhY2tfcG9wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX3Jlc3VsdF9zdGFja19wb3AiKTsKIAogCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KIAogCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRzID09IE5VTEwpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIlVuZGVyZmxvdyAtIFN0YXRlPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJVbmRlcmZsb3cgLSBTdGF0ZT0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCi0Jc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgmd2Fsa19zdGF0ZS0+cmVzdWx0cyk7CisJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5yZXN1bHRzKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJSZXN1bHQ9JXAgcmVtYWluaW5nX3Jlc3VsdHM9JVggU3RhdGU9JXBcbiIsCi0JCXN0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIlJlc3VsdD0lcCByZW1haW5pbmdfcmVzdWx0cz0lWCBTdGF0ZT0lcFxuIiwKKwkJCSAgc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLCB3YWxrX3N0YXRlKSk7CiAKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzdGF0ZSk7CisJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wdXNoCkBAIC00MjAsMzUgKzQwNiwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19vYmpfc3RhY2tfcHVzaCh2b2lkICpvYmplY3QsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX29ial9zdGFja19wdXNoIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX29ial9zdGFja19wdXNoIik7CiAKIAkvKiBDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3cgKi8KIAogCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPj0gQUNQSV9PQkpfTlVNX09QRVJBTkRTKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIm92ZXJmbG93ISBPYmo9JXAgU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCW9iamVjdCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAib3ZlcmZsb3chIE9iaj0lcCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJCSAgb2JqZWN0LCB3YWxrX3N0YXRlLAorCQkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAJCXJldHVybiAoQUVfU1RBQ0tfT1ZFUkZMT1cpOwogCX0KIAogCS8qIFB1dCB0aGUgb2JqZWN0IG9udG8gdGhlIHN0YWNrICovCiAKLQl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IG9iamVjdDsKKwl3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gb2JqZWN0OwogCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcysrOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkgIG9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqZWN0KSwKLQkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCSAgb2JqZWN0LAorCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKCh1bmlvbgorCQkJCQkJCWFjcGlfb3BlcmFuZF9vYmplY3QgKikKKwkJCQkJCSAgICAgICBvYmplY3QpLCB3YWxrX3N0YXRlLAorCQkJICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX3BvcApAQCAtNDY0LDM4ICs0NTAsMzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19wb3AgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wX2NvdW50LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2RzX29ial9zdGFja19wb3AodTMyIHBvcF9jb3VudCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfb2JqX3N0YWNrX3BvcCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJkc19vYmpfc3RhY2tfcG9wIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcG9wX2NvdW50OyBpKyspIHsKIAkJLyogQ2hlY2sgZm9yIHN0YWNrIHVuZGVyZmxvdyAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuZGVyZmxvdyEgQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCQlwb3BfY291bnQsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiVW5kZXJmbG93ISBDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJCQkgIHBvcF9jb3VudCwgd2Fsa19zdGF0ZSwKKwkJCQkJICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAkJCXJldHVybiAoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKIAkJfQogCiAJCS8qIEp1c3Qgc2V0IHRoZSBzdGFjayBlbnRyeSB0byBudWxsICovCiAKIAkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLS07Ci0JCXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKKwkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkNvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKIAkJCSAgcG9wX2NvdW50LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlCkBAIC01MTEsNDQgKzQ5NCw0MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUodTMyIHBvcF9jb3VudCwKKwkJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOworCXUzMiBpOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcG9wX2NvdW50OyBpKyspIHsKIAkJLyogQ2hlY2sgZm9yIHN0YWNrIHVuZGVyZmxvdyAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuZGVyZmxvdyEgQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCQlwb3BfY291bnQsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiVW5kZXJmbG93ISBDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJCQkgIHBvcF9jb3VudCwgd2Fsa19zdGF0ZSwKKwkJCQkJICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAkJCXJldHVybiAoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKIAkJfQogCiAJCS8qIFBvcCB0aGUgc3RhY2sgYW5kIGRlbGV0ZSBhbiBvYmplY3QgaWYgcHJlc2VudCBpbiB0aGlzIHN0YWNrIGVudHJ5ICovCiAKIAkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLS07Ci0JCW9ial9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc107CisJCW9ial9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXTsKIAkJaWYgKG9ial9kZXNjKSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdKTsKLQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT4KKwkJCQkJCSBvcGVyYW5kc1t3YWxrX3N0YXRlLT4KKwkJCQkJCQkgIG51bV9vcGVyYW5kc10pOworCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAogCQkJICBwb3BfY291bnQsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlCkBAIC01NjIsMjUgKzU0NCwyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgotYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCi0KK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUKKwkJCQkJCSAgICAgICAqdGhyZWFkKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSIpOwogCiAJaWYgKCF0aHJlYWQpIHsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgIkN1cnJlbnQgd2Fsa19zdGF0ZSAlcFxuIiwKLQkJdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiQ3VycmVudCB3YWxrX3N0YXRlICVwXG4iLAorCQkJICB0aHJlYWQtPndhbGtfc3RhdGVfbGlzdCkpOwogCiAJcmV0dXJuICh0aHJlYWQtPndhbGtfc3RhdGVfbGlzdCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUKQEAgLTU5NSwyMCArNTczLDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCithY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImRzX3B1c2hfd2Fsa19zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX3B1c2hfd2Fsa19zdGF0ZSIpOwogCi0KLQl3YWxrX3N0YXRlLT5uZXh0ICAgICAgPSB0aHJlYWQtPndhbGtfc3RhdGVfbGlzdDsKKwl3YWxrX3N0YXRlLT5uZXh0ID0gdGhyZWFkLT53YWxrX3N0YXRlX2xpc3Q7CiAJdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QgPSB3YWxrX3N0YXRlOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19wb3Bfd2Fsa19zdGF0ZQpAQCAtNjIzLDE1ICs1OTgsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICoKLWFjcGlfZHNfcG9wX3dhbGtfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCkKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfcG9wX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCiB7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZTsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfcG9wX3dhbGtfc3RhdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX3BvcF93YWxrX3N0YXRlIik7CiAKIAl3YWxrX3N0YXRlID0gdGhyZWFkLT53YWxrX3N0YXRlX2xpc3Q7CiAKQEAgLTY0NywxMCArNjE4LDkgQEAKIAkJICovCiAJfQogCi0JcmV0dXJuX1BUUiAod2Fsa19zdGF0ZSk7CisJcmV0dXJuX1BUUih3YWxrX3N0YXRlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlCkBAIC02NjcsNTcgKzYzNyw1NSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgotYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAoCi0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZCwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbXRoX2Rlc2MsCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKQorc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShhY3BpX293bmVyX2lkIG93bmVyX2lkLAorCQkJCQkJICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdAorCQkJCQkJICAqb3JpZ2luLAorCQkJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CisJCQkJCQkgICptdGhfZGVzYywKKwkJCQkJCSAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCisJCQkJCQkgICp0aHJlYWQpCiB7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2NyZWF0ZV93YWxrX3N0YXRlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfY3JlYXRlX3dhbGtfc3RhdGUiKTsKLQotCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfdXRfYWNxdWlyZV9mcm9tX2NhY2hlIChBQ1BJX01FTV9MSVNUX1dBTEspOworCXdhbGtfc3RhdGUgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUpKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCi0Jd2Fsa19zdGF0ZS0+ZGF0YV90eXBlICAgICAgID0gQUNQSV9ERVNDX1RZUEVfV0FMSzsKLQl3YWxrX3N0YXRlLT5vd25lcl9pZCAgICAgICAgPSBvd25lcl9pZDsKLQl3YWxrX3N0YXRlLT5vcmlnaW4gICAgICAgICAgPSBvcmlnaW47Ci0Jd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgICAgID0gbXRoX2Rlc2M7Ci0Jd2Fsa19zdGF0ZS0+dGhyZWFkICAgICAgICAgID0gdGhyZWFkOworCXdhbGtfc3RhdGUtPmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1dBTEs7CisJd2Fsa19zdGF0ZS0+b3duZXJfaWQgPSBvd25lcl9pZDsKKwl3YWxrX3N0YXRlLT5vcmlnaW4gPSBvcmlnaW47CisJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgPSBtdGhfZGVzYzsKKwl3YWxrX3N0YXRlLT50aHJlYWQgPSB0aHJlYWQ7CiAKIAl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc3RhcnRfb3AgPSBvcmlnaW47CiAKIAkvKiBJbml0IHRoZSBtZXRob2QgYXJncy9sb2NhbCAqLwogCiAjaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCi0JYWNwaV9kc19tZXRob2RfZGF0YV9pbml0ICh3YWxrX3N0YXRlKTsKKwlhY3BpX2RzX21ldGhvZF9kYXRhX2luaXQod2Fsa19zdGF0ZSk7CiAjZW5kaWYKIAogCS8qIENyZWF0ZSBhbiBpbml0aWFsIHJlc3VsdCBzdGFjayBlbnRyeSAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAod2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbGVhc2VfdG9fY2FjaGUgKEFDUElfTUVNX0xJU1RfV0FMSywgd2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2god2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfTUVNX0ZSRUUod2Fsa19zdGF0ZSk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCiAJLyogUHV0IHRoZSBuZXcgc3RhdGUgYXQgdGhlIGhlYWQgb2YgdGhlIHdhbGsgbGlzdCAqLwogCiAJaWYgKHRocmVhZCkgewotCQlhY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZSAod2Fsa19zdGF0ZSwgdGhyZWFkKTsKKwkJYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSwgdGhyZWFkKTsKIAl9CiAKLQlyZXR1cm5fUFRSICh3YWxrX3N0YXRlKTsKKwlyZXR1cm5fUFRSKHdhbGtfc3RhdGUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9hbWxfd2FsawpAQCAtNzM3LDcwICs3MDUsNzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfYW1sX3dhbGsgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aCwKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIpCithY3BpX2RzX2luaXRfYW1sX3dhbGsoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCSAgICAgIHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwKKwkJICAgICAgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8sIHU4IHBhc3NfbnVtYmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSA9ICZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGU7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqZXh0cmFfb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUgPSAmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpleHRyYV9vcDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2luaXRfYW1sX3dhbGsiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19pbml0X2FtbF93YWxrIik7Ci0KLQotCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgICAgPQotCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7CisJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9CisJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7CiAJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9lbmQgPQotCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kID0gYW1sX3N0YXJ0ICsgYW1sX2xlbmd0aDsKKwkgICAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQgPSBhbWxfc3RhcnQgKyBhbWxfbGVuZ3RoOwogCiAJLyogVGhlIG5leHRfb3Agb2YgdGhlIG5leHRfd2FsayB3aWxsIGJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZCAqLwogCiAJd2Fsa19zdGF0ZS0+bmV4dF9vcCA9IE5VTEw7CisJd2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPSBwYXNzX251bWJlcjsKIAogCWlmIChpbmZvKSB7CiAJCWlmIChpbmZvLT5wYXJhbWV0ZXJfdHlwZSA9PSBBQ1BJX1BBUkFNX0dQRSkgewotCQkJd2Fsa19zdGF0ZS0+Z3BlX2V2ZW50X2luZm8gPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbywKLQkJCQkJICAgaW5mby0+cGFyYW1ldGVycyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3YWxrX3N0YXRlLT5wYXJhbXMgICAgICAgICAgPSBpbmZvLT5wYXJhbWV0ZXJzOworCQkJd2Fsa19zdGF0ZS0+Z3BlX2V2ZW50X2luZm8gPQorCQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8sCisJCQkJCSAgaW5mby0+cGFyYW1ldGVycyk7CisJCX0gZWxzZSB7CisJCQl3YWxrX3N0YXRlLT5wYXJhbXMgPSBpbmZvLT5wYXJhbWV0ZXJzOwogCQkJd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjID0gJmluZm8tPnJldHVybl9vYmplY3Q7CiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3BzX2luaXRfc2NvcGUgKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUsIG9wKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3BzX2luaXRfc2NvcGUoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSwgb3ApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlpZiAobWV0aG9kX25vZGUpIHsKIAkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnN0YXJ0X25vZGUgPSBtZXRob2Rfbm9kZTsKLQkJd2Fsa19zdGF0ZS0+d2Fsa190eXBlICAgICAgICAgICAgPSBBQ1BJX1dBTEtfTUVUSE9EOwotCQl3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSAgICAgICAgICA9IG1ldGhvZF9ub2RlOwotCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYyAgICAgICAgICA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobWV0aG9kX25vZGUpOworCQl3YWxrX3N0YXRlLT53YWxrX3R5cGUgPSBBQ1BJX1dBTEtfTUVUSE9EOworCQl3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSA9IG1ldGhvZF9ub2RlOworCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYyA9CisJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QobWV0aG9kX25vZGUpOwogCiAJCS8qIFB1c2ggc3RhcnQgc2NvcGUgb24gc2NvcGUgc3RhY2sgYW5kIG1ha2UgaXQgY3VycmVudCAgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2ggKG1ldGhvZF9ub2RlLCBBQ1BJX1RZUEVfTUVUSE9ELCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoKG1ldGhvZF9ub2RlLCBBQ1BJX1RZUEVfTUVUSE9ELAorCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogSW5pdCB0aGUgbWV0aG9kIGFyZ3VtZW50cyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzICh3YWxrX3N0YXRlLT5wYXJhbXMsCi0JCQkJIEFDUElfTUVUSE9EX05VTV9BUkdTLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyh3YWxrX3N0YXRlLT5wYXJhbXMsCisJCQkJCQkgICAgICAgQUNQSV9NRVRIT0RfTlVNX0FSR1MsCisJCQkJCQkgICAgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogU2V0dXAgdGhlIGN1cnJlbnQgc2NvcGUuCiAJCSAqIEZpbmQgYSBOYW1lZCBPcCB0aGF0IGhhcyBhIG5hbWVzcGFjZSBub2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KQEAgLTgxNCwyNyArNzgyLDI3IEBACiAKIAkJaWYgKCFleHRyYV9vcCkgewogCQkJcGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlID0gTlVMTDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZSA9IGV4dHJhX29wLT5jb21tb24ubm9kZTsKIAkJfQogCiAJCWlmIChwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUpIHsKIAkJCS8qIFB1c2ggc3RhcnQgc2NvcGUgb24gc2NvcGUgc3RhY2sgYW5kIG1ha2UgaXQgY3VycmVudCAgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wdXNoIChwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUsCi0JCQkJCSAgcGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLT50eXBlLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaChwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUsCisJCQkJCQkgICAgIHBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZS0+CisJCQkJCQkgICAgIHR5cGUsIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfY2FsbGJhY2tzICh3YWxrX3N0YXRlLCBwYXNzX251bWJlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9jYWxsYmFja3Mod2Fsa19zdGF0ZSwgcGFzc19udW1iZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUKQEAgLTg0NywyOSArODE1LDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3ZvaWQgYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfZGVsZXRlX3dhbGtfc3RhdGUiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19kZWxldGVfd2Fsa19zdGF0ZSIsIHdhbGtfc3RhdGUpOwogCiAJaWYgKCF3YWxrX3N0YXRlKSB7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+ZGF0YV90eXBlICE9IEFDUElfREVTQ19UWVBFX1dBTEspIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlXG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVwIGlzIG5vdCBhIHZhbGlkIHdhbGsgc3RhdGVcbiIsCisJCQkJICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnNjb3BlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiJXAgd2FsayBzdGlsbCBoYXMgYSBzY29wZSBsaXN0XG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVwIHdhbGsgc3RpbGwgaGFzIGEgc2NvcGUgbGlzdFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAl9CiAKIAkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KQEAgLTg3OCw3ICs4NDQsNyBAQAogCQlzdGF0ZSA9IHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGU7CiAJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUgPSBzdGF0ZS0+Y29tbW9uLm5leHQ7CiAKLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc3RhdGUpOworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKIAl9CiAKIAkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgcGFyc2Ugc3RhdGVzICovCkBAIC04ODcsNyArODUzLDcgQEAKIAkJc3RhdGUgPSB3YWxrX3N0YXRlLT5zY29wZV9pbmZvOwogCQl3YWxrX3N0YXRlLT5zY29wZV9pbmZvID0gc3RhdGUtPmNvbW1vbi5uZXh0OwogCi0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHN0YXRlKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CiAJfQogCiAJLyogQWx3YXlzIG11c3QgZnJlZSBhbnkgc3RhY2tlZCByZXN1bHQgc3RhdGVzICovCkBAIC04OTYsNDEgKzg2MiwxMyBAQAogCQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJCXdhbGtfc3RhdGUtPnJlc3VsdHMgPSBzdGF0ZS0+Y29tbW9uLm5leHQ7CiAKLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc3RhdGUpOworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKIAl9CiAKLQlhY3BpX3V0X3JlbGVhc2VfdG9fY2FjaGUgKEFDUElfTUVNX0xJU1RfV0FMSywgd2Fsa19zdGF0ZSk7CisJQUNQSV9NRU1fRlJFRSh3YWxrX3N0YXRlKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFB1cmdlIHRoZSBnbG9iYWwgc3RhdGUgb2JqZWN0IGNhY2hlLiAgVXNlZCBkdXJpbmcgc3Vic3lzdGVtCi0gKiAgICAgICAgICAgICAgdGVybWluYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZV9jYWNoZSAoCi0Jdm9pZCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUiKTsKLQotCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZSAoQUNQSV9NRU1fTElTVF9XQUxLKTsKLQlyZXR1cm5fVk9JRDsKLX0KLSNlbmRpZgotCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05NDcsNTAgKzg4NSw1MyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfcmVzdWx0X2luc2VydCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZHNfcmVzdWx0X2luc2VydCh2b2lkICpvYmplY3QsCisJCSAgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19yZXN1bHRfaW5zZXJ0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX3Jlc3VsdF9pbnNlcnQiKTsKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAotCQkJd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9OT1RfRVhJU1QpOwogCX0KIAogCWlmIChpbmRleCA+PSBBQ1BJX09CSl9OVU1fT1BFUkFORFMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiSW5kZXggb3V0IG9mIHJhbmdlOiAlWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbmRleCBvdXQgb2YgcmFuZ2U6ICVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJICBpbmRleCwgb2JqZWN0LCB3YWxrX3N0YXRlLAorCQkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJOdWxsIE9iamVjdCEgSW5kZXg9JVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCWluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTnVsbCBPYmplY3QhIEluZGV4PSVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJICBpbmRleCwgb2JqZWN0LCB3YWxrX3N0YXRlLAorCQkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdID0gb2JqZWN0OworCXN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4XSA9IG9iamVjdDsKIAlzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cysrOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJIk9iaj0lcCBbJXNdIFN0YXRlPSVwIE51bT0lWCBDdXI9JVhcbiIsCi0JCW9iamVjdCwgb2JqZWN0ID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqZWN0KSA6ICJOVUxMIiwKLQkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsIHdhbGtfc3RhdGUtPmN1cnJlbnRfcmVzdWx0KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiT2JqPSVwIFslc10gU3RhdGU9JXAgTnVtPSVYIEN1cj0lWFxuIiwKKwkJCSAgb2JqZWN0LAorCQkJICBvYmplY3QgPworCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKCh1bmlvbgorCQkJCQkJCWFjcGlfb3BlcmFuZF9vYmplY3QgKikKKwkJCQkJCSAgICAgICBvYmplY3QpIDogIk5VTEwiLAorCQkJICB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywKKwkJCSAgd2Fsa19zdGF0ZS0+Y3VycmVudF9yZXN1bHQpKTsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwKQEAgLTEwMDQsMjkgKzk0NSwyNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwiLCB3YWxrX3N0YXRlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19vYmpfc3RhY2tfZGVsZXRlX2FsbCIsIHdhbGtfc3RhdGUpOwogCiAJLyogVGhlIHN0YWNrIHNpemUgaXMgY29uZmlndXJhYmxlLCBidXQgZml4ZWQgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX09CSl9OVU1fT1BFUkFORFM7IGkrKykgewogCQlpZiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKIAkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdApAQCAtMTA0MiwxOSArOTc4LDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqZWN0LAorCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX29ial9zdGFja19wb3Bfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX29ial9zdGFja19wb3Bfb2JqZWN0Iik7CiAKIAkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKIAlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTWlzc2luZyBvcGVyYW5kL3N0YWNrIGVtcHR5ISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTWlzc2luZyBvcGVyYW5kL3N0YWNrIGVtcHR5ISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAJCSpvYmplY3QgPSBOVUxMOwogCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKIAl9CkBAIC0xMDY1LDI3ICs5OTksMjYgQEAKIAogCS8qIENoZWNrIGZvciBhIHZhbGlkIG9wZXJhbmQgKi8KIAotCWlmICghd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJaWYgKCF3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAJCSpvYmplY3QgPSBOVUxMOwogCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKIAl9CiAKIAkvKiBHZXQgb3BlcmFuZCBhbmQgc2V0IHN0YWNrIGVudHJ5IHRvIG51bGwgKi8KIAotCSpvYmplY3QgPSB3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXTsKLQl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CisJKm9iamVjdCA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc107CisJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCSAgKm9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCksCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCSAgKm9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgqb2JqZWN0KSwKIAkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUKQEAgLTExMDEsMzAgKzEwMzQsMjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICoKLWFjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQordm9pZCAqYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlKHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2dldF92YWx1ZSIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX29ial9zdGFja19nZXRfdmFsdWUiLCB3YWxrX3N0YXRlKTsKIAogCS8qIENhbid0IGRvIGl0IGlmIHRoZSBzdGFjayBpcyBlbXB0eSAqLwogCiAJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIG9yIGlmIHRoZSBpbmRleCBpcyBwYXN0IHRoZSB0b3Agb2YgdGhlIHN0YWNrICovCiAKIAlpZiAoaW5kZXggPiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gKHUzMikgMSkpIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCi0JcmV0dXJuX1BUUiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbKGFjcGlfbmF0aXZlX3VpbnQpKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDEpIC0KLQkJCSAgaW5kZXhdKTsKKwlyZXR1cm5fUFRSKHdhbGtfc3RhdGUtPgorCQkgICBvcGVyYW5kc1soYWNwaV9uYXRpdmVfdWludCkgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDEpIC0KKwkJCSAgICBpbmRleF0pOwogfQogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjLmMgYi9kcml2ZXJzL2FjcGkvZWMuYwppbmRleCAxYWM1NzMxLi43ZTFhNDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZWMuYwpAQCAtMzgsMTMwICszOCwxMTIgQEAKICNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0VDX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX2VjIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9lYyIpCiAjZGVmaW5lIEFDUElfRUNfQ09NUE9ORU5UCQkweDAwMTAwMDAwCiAjZGVmaW5lIEFDUElfRUNfQ0xBU1MJCQkiZW1iZWRkZWRfY29udHJvbGxlciIKICNkZWZpbmUgQUNQSV9FQ19ISUQJCQkiUE5QMEMwOSIKICNkZWZpbmUgQUNQSV9FQ19EUklWRVJfTkFNRQkJIkFDUEkgRW1iZWRkZWQgQ29udHJvbGxlciBEcml2ZXIiCiAjZGVmaW5lIEFDUElfRUNfREVWSUNFX05BTUUJCSJFbWJlZGRlZCBDb250cm9sbGVyIgogI2RlZmluZSBBQ1BJX0VDX0ZJTEVfSU5GTwkJImluZm8iCi0KLQogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfT0JGCTB4MDEJLyogT3V0cHV0IGJ1ZmZlciBmdWxsICovCiAjZGVmaW5lIEFDUElfRUNfRkxBR19JQkYJMHgwMgkvKiBJbnB1dCBidWZmZXIgZnVsbCAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfQlVSU1QJMHgxMAkvKiBidXJzdCBtb2RlICovCiAjZGVmaW5lIEFDUElfRUNfRkxBR19TQ0kJMHgyMAkvKiBFQy1TQ0kgb2NjdXJyZWQgKi8KLQogI2RlZmluZSBBQ1BJX0VDX0VWRU5UX09CRgkweDAxCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLwogI2RlZmluZSBBQ1BJX0VDX0VWRU5UX0lCRQkweDAyCS8qIElucHV0IGJ1ZmZlciBlbXB0eSAqLwotCiAjZGVmaW5lIEFDUElfRUNfREVMQVkJCTUwCS8qIFdhaXQgNTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KICNkZWZpbmUgQUNQSV9FQ19VREVMQVlfR0xLCTEwMDAJLyogV2FpdCAxbXMgbWF4LiB0byBnZXQgZ2xvYmFsIGxvY2sgKi8KLQotI2RlZmluZSBBQ1BJX0VDX1VERUxBWSAgICAgICAgIDEwMCAgICAgLyogUG9sbCBAIDEwMHVzIGluY3JlbWVudHMgKi8KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVlfQ09VTlQgICAxMDAwICAgIC8qIFdhaXQgMTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KLQorI2RlZmluZSBBQ1BJX0VDX1VERUxBWSAgICAgICAgIDEwMAkvKiBQb2xsIEAgMTAwdXMgaW5jcmVtZW50cyAqLworI2RlZmluZSBBQ1BJX0VDX1VERUxBWV9DT1VOVCAgIDEwMDAJLyogV2FpdCAxMG1zIG1heC4gZHVyaW5nIEVDIG9wcyAqLwogI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfUkVBRAkweDgwCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9XUklURQkweDgxCiAjZGVmaW5lIEFDUElfRUNfQlVSU1RfRU5BQkxFCTB4ODIKICNkZWZpbmUgQUNQSV9FQ19CVVJTVF9ESVNBQkxFCTB4ODMKICNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1FVRVJZCTB4ODQKLQogI2RlZmluZSBFQ19QT0xMSU5HCQkweEZGCiAjZGVmaW5lIEVDX0JVUlNUCQkweDAwCi0KLQotc3RhdGljIGludCBhY3BpX2VjX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19zdGFydCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2VjX3N0b3AgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfYWRkICggc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfYWRkICggc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2VjX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX2VjX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19zdG9wKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9lY19kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9FQ19EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX0VDX0NMQVNTLAotCS5pZHMgPQkJQUNQSV9FQ19ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX2VjX3BvbGxpbmdfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX2VjX3JlbW92ZSwKLQkJCQkuc3RhcnQgPQlhY3BpX2VjX3N0YXJ0LAotCQkJCS5zdG9wID0JCWFjcGlfZWNfc3RvcCwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX0VDX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfRUNfQ0xBU1MsCisJLmlkcyA9IEFDUElfRUNfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2VjX3BvbGxpbmdfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9lY19yZW1vdmUsCisJCS5zdGFydCA9IGFjcGlfZWNfc3RhcnQsCisJCS5zdG9wID0gYWNwaV9lY19zdG9wLAorCQl9LAogfTsKIHVuaW9uIGFjcGlfZWMgewogCXN0cnVjdCB7Ci0JCXUzMgkJCQltb2RlOwotCQlhY3BpX2hhbmRsZQkJCWhhbmRsZTsKLQkJdW5zaWduZWQgbG9uZwkJCXVpZDsKLQkJdW5zaWduZWQgbG9uZwkJCWdwZV9iaXQ7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwlzdGF0dXNfYWRkcjsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWNvbW1hbmRfYWRkcjsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWRhdGFfYWRkcjsKLQkJdW5zaWduZWQgbG9uZwkJCWdsb2JhbF9sb2NrOworCQl1MzIgbW9kZTsKKwkJYWNwaV9oYW5kbGUgaGFuZGxlOworCQl1bnNpZ25lZCBsb25nIHVpZDsKKwkJdW5zaWduZWQgbG9uZyBncGVfYml0OworCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc3RhdHVzX2FkZHI7CisJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBjb21tYW5kX2FkZHI7CisJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBkYXRhX2FkZHI7CisJCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX2xvY2s7CiAJfSBjb21tb247CiAKIAlzdHJ1Y3QgewotCQl1MzIJCQkJbW9kZTsKLQkJYWNwaV9oYW5kbGUJCQloYW5kbGU7Ci0JCXVuc2lnbmVkIGxvbmcJCQl1aWQ7Ci0JCXVuc2lnbmVkIGxvbmcJCQlncGVfYml0OwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJc3RhdHVzX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwljb21tYW5kX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwlkYXRhX2FkZHI7Ci0JCXVuc2lnbmVkIGxvbmcJCQlnbG9iYWxfbG9jazsKLQkJdW5zaWduZWQgaW50CQkJZXhwZWN0X2V2ZW50OwotCQlhdG9taWNfdAkJCWxlYXZpbmdfYnVyc3Q7IC8qIDAgOiBObywgMSA6IFllcywgMjogYWJvcnQqLwotCQlhdG9taWNfdAkJCXBlbmRpbmdfZ3BlOwotCQlzdHJ1Y3Qgc2VtYXBob3JlCQlzZW07Ci0JCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0OwotCX1idXJzdDsKKwkJdTMyIG1vZGU7CisJCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwkJdW5zaWduZWQgbG9uZyB1aWQ7CisJCXVuc2lnbmVkIGxvbmcgZ3BlX2JpdDsKKwkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHN0YXR1c19hZGRyOworCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgY29tbWFuZF9hZGRyOworCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YV9hZGRyOworCQl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0X2V2ZW50OworCQlhdG9taWNfdCBsZWF2aW5nX2J1cnN0OwkvKiAwIDogTm8sIDEgOiBZZXMsIDI6IGFib3J0ICovCisJCWF0b21pY190IHBlbmRpbmdfZ3BlOworCQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwl9IGJ1cnN0OwogCiAJc3RydWN0IHsKLQkJdTMyCQkJCW1vZGU7Ci0JCWFjcGlfaGFuZGxlCQkJaGFuZGxlOwotCQl1bnNpZ25lZCBsb25nCQkJdWlkOwotCQl1bnNpZ25lZCBsb25nCQkJZ3BlX2JpdDsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCXN0YXR1c19hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJY29tbWFuZF9hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJZGF0YV9hZGRyOwotCQl1bnNpZ25lZCBsb25nCQkJZ2xvYmFsX2xvY2s7Ci0gICAgICAgCQlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIGxvY2s7Ci0JfXBvbGxpbmc7CisJCXUzMiBtb2RlOworCQlhY3BpX2hhbmRsZSBoYW5kbGU7CisJCXVuc2lnbmVkIGxvbmcgdWlkOworCQl1bnNpZ25lZCBsb25nIGdwZV9iaXQ7CisJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzdGF0dXNfYWRkcjsKKwkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGNvbW1hbmRfYWRkcjsKKwkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGRhdGFfYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBnbG9iYWxfbG9jazsKKwkJc3BpbmxvY2tfdCBsb2NrOworCX0gcG9sbGluZzsKIH07CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dhaXQgKCB1bmlvbiBhY3BpX2VjICplYywgdTggZXZlbnQpOyAKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KTsKIHN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfcmVhZCAoIHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKmRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3JlYWQoIHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKmRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfd3JpdGUgKCB1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfYnVyc3Rfd3JpdGUgKCB1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19xdWVyeSAoIHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKmRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3F1ZXJ5ICggdW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9wb2xsaW5nX3F1ZXJ5ICggdm9pZCAqZWNfY3h0KTsKLXN0YXRpYyB2b2lkIGFjcGlfZWNfZ3BlX2J1cnN0X3F1ZXJ5ICggdm9pZCAqZWNfY3h0KTsKLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfcG9sbGluZ19oYW5kbGVyICggdm9pZCAqZGF0YSk7Ci1zdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIgKCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpOworc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpOworc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOworc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3F1ZXJ5KHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKiBkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSk7CitzdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9wb2xsaW5nX3F1ZXJ5KHZvaWQgKmVjX2N4dCk7CitzdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9idXJzdF9xdWVyeSh2b2lkICplY19jeHQpOworc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9wb2xsaW5nX2hhbmRsZXIodm9pZCAqZGF0YSk7CitzdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIodm9pZCAqZGF0YSk7CiBzdGF0aWMgYWNwaV9zdGF0dXMgX19pbml0Ci1hY3BpX2Zha2VfZWNkdF9wb2xsaW5nX2NhbGxiYWNrICgKLQlhY3BpX2hhbmRsZQloYW5kbGUsCi0JdTMyCQlMZXZlbCwKLQl2b2lkCQkqY29udGV4dCwKLQl2b2lkCQkqKnJldHZhbCk7CithY3BpX2Zha2VfZWNkdF9wb2xsaW5nX2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCQl1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMgX19pbml0Ci1hY3BpX2Zha2VfZWNkdF9idXJzdF9jYWxsYmFjayAoCi0JYWNwaV9oYW5kbGUJaGFuZGxlLAotCXUzMgkJTGV2ZWwsCi0Jdm9pZAkJKmNvbnRleHQsCi0Jdm9pZAkJKipyZXR2YWwpOworYWNwaV9mYWtlX2VjZHRfYnVyc3RfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKTsKIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZWNfcG9sbGluZ19nZXRfcmVhbF9lY2R0KHZvaWQpOwotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZWNfYnVyc3RfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfcG9sbGluZ19nZXRfcmVhbF9lY2R0KHZvaWQpOworc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19idXJzdF9nZXRfcmVhbF9lY2R0KHZvaWQpOwogLyogSWYgd2UgZmluZCBhbiBFQyB2aWEgdGhlIEVDRFQsIHdlIG5lZWQgdG8ga2VlcCBhIHB0ciB0byBpdHMgY29udGV4dCAqLwotc3RhdGljIHVuaW9uIGFjcGlfZWMJKmVjX2VjZHQ7CitzdGF0aWMgdW5pb24gYWNwaV9lYyAqZWNfZWNkdDsKIAogLyogRXh0ZXJuYWwgaW50ZXJmYWNlcyB1c2UgZmlyc3QgRUMgb25seSwgc28gcmVtZW1iZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmZpcnN0X2VjOwpAQCAtMTczLDMwICsxNTUsMjQgQEAKIAogc3RhdGljIGlubGluZSB1MzIgYWNwaV9lY19yZWFkX3N0YXR1cyh1bmlvbiBhY3BpX2VjICplYykKIHsKLQl1MzIJc3RhdHVzID0gMDsKKwl1MzIgc3RhdHVzID0gMDsKIAogCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnN0YXR1cywgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfZWNfd2FpdCAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJZXZlbnQpCitzdGF0aWMgaW50IGFjcGlfZWNfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdTggZXZlbnQpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKSAKLQkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ193YWl0IChlYywgZXZlbnQpOworCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKKwkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ193YWl0KGVjLCBldmVudCk7CiAJZWxzZQotCQlyZXR1cm4gYWNwaV9lY19idXJzdF93YWl0IChlYywgZXZlbnQpOworCQlyZXR1cm4gYWNwaV9lY19idXJzdF93YWl0KGVjLCBldmVudCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfZWNfcG9sbGluZ193YWl0ICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTgJCQlldmVudCkKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KQogewotCXUzMgkJCWFjcGlfZWNfc3RhdHVzID0gMDsKLQl1MzIJCQlpID0gQUNQSV9FQ19VREVMQVlfQ09VTlQ7CisJdTMyIGFjcGlfZWNfc3RhdHVzID0gMDsKKwl1MzIgaSA9IEFDUElfRUNfVURFTEFZX0NPVU5UOwogCiAJaWYgKCFlYykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDUsMTkgKzE4MSwyMSBAQAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgogCQlkbyB7Ci0JCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZhY3BpX2VjX3N0YXR1cywgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOworCQkJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmYWNwaV9lY19zdGF0dXMsCisJCQkJCSAgICAgICAmZWMtPmNvbW1vbi5zdGF0dXNfYWRkcik7CiAJCQlpZiAoYWNwaV9lY19zdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfT0JGKQogCQkJCXJldHVybiAwOwogCQkJdWRlbGF5KEFDUElfRUNfVURFTEFZKTsKLQkJfSB3aGlsZSAoLS1pPjApOworCQl9IHdoaWxlICgtLWkgPiAwKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKIAkJZG8gewotCQkJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmYWNwaV9lY19zdGF0dXMsICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKKwkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLAorCQkJCQkgICAgICAgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOwogCQkJaWYgKCEoYWNwaV9lY19zdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkKIAkJCQlyZXR1cm4gMDsKIAkJCXVkZWxheShBQ1BJX0VDX1VERUxBWSk7Ci0JCX0gd2hpbGUgKC0taT4wKTsKKwkJfSB3aGlsZSAoLS1pID4gMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI3LDI1ICsyMDUsMzYgQEAKIH0KIHN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpCiB7Ci0JaW50CXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3dhaXQiKTsKIAogCWVjLT5idXJzdC5leHBlY3RfZXZlbnQgPSBldmVudDsKIAlzbXBfbWIoKTsKIAotCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGVjLT5idXJzdC53YWl0LAotCQkJCQkhZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCwKLQkJCQkJbXNlY3NfdG9famlmZmllcyhBQ1BJX0VDX0RFTEFZKSk7Ci0JCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6CisJCWlmIChhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIGV2ZW50KSB7CisJCQllYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID0gMDsKKwkJCXJldHVybl9WQUxVRSgwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6CisJCWlmICh+YWNwaV9lY19yZWFkX3N0YXR1cyhlYykgJiBldmVudCkgeworCQkJZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7CisJCQlyZXR1cm5fVkFMVUUoMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmVzdWx0ID0gd2FpdF9ldmVudF90aW1lb3V0KGVjLT5idXJzdC53YWl0LAorCQkJCSAgICAhZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCwKKwkJCQkgICAgbXNlY3NfdG9famlmZmllcyhBQ1BJX0VDX0RFTEFZKSk7CisKIAllYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID0gMDsKIAlzbXBfbWIoKTsKIAotCWlmIChyZXN1bHQgPCAwKXsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiIHJlc3VsdCAgPSAlZCAiLCByZXN1bHQpKTsKLQkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7Ci0JfQotCiAJLyoKIAkgKiBWZXJpZnkgdGhhdCB0aGUgZXZlbnQgaW4gcXVlc3Rpb24gaGFzIGFjdHVhbGx5IGhhcHBlbmVkIGJ5CiAJICogcXVlcnlpbmcgRUMgc3RhdHVzLiBEbyB0aGUgY2hlY2sgZXZlbiBpZiBvcGVyYXRpb24gdGltZWQtb3V0CkBAIC0yNjYsOTUgKzI1NSw2NSBAQAogCXJldHVybl9WQUxVRSgtRVRJTUUpOwogfQogCi0KLQotc3RhdGljIGludAotYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMpCitzdGF0aWMgaW50IGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZSh1bmlvbiBhY3BpX2VjICplYykKIHsKLQl1MzIJCQl0bXAgPSAwOwotCWludAkJCXN0YXR1cyA9IDA7CisJdTMyIHRtcCA9IDA7CisJaW50IHN0YXR1cyA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUiKTsKIAogCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwotCWlmIChzdGF0dXMgIT0gLUVJTlZBTCAmJgotCQkhKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpewotCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYgIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKSB7CisJCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBlbmQ7CisJCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQlVSU1RfRU5BQkxFLAorCQkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwogCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQkJaWYgKHN0YXR1cyl7Ci0JCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQlpZiAoc3RhdHVzKQogCQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQl9CiAJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnRtcCwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKLQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQkJaWYodG1wICE9IDB4OTAgKSB7LyogQnVyc3QgQUNLIGJ5dGUqLworCQlpZiAodG1wICE9IDB4OTApIHsJLyogQnVyc3QgQUNLIGJ5dGUgKi8KIAkJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAkJfQogCX0KIAotCWF0b21pY19zZXQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0ICwgMCk7CisJYXRvbWljX3NldCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QsIDApOwogCXJldHVybl9WQUxVRSgwKTsKKyAgICAgIGVuZDoKKwlwcmludGsoIkVycm9yIGluIGFjcGlfZWNfd2FpdFxuIik7CisJcmV0dXJuX1ZBTFVFKC0xKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMpCitzdGF0aWMgaW50IGFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSh1bmlvbiBhY3BpX2VjICplYykKIHsKLQlpbnQJCQlzdGF0dXMgPTA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUiKTsKIAotCWF0b21pY19zZXQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0ICwgMSk7Ci0Jc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7Ci0JaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmCi0JCShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKLQkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9ESVNBQkxFLCAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwotCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRkxBR19JQkYpOwotCQlpZiAoc3RhdHVzKXsKLQkJCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCItLS0tLS0tPndhaXQgZmFpbFxuIikpOwotCQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQl9Ci0JCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci0JCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwotCX0KLQorCWF0b21pY19zZXQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0LCAxKTsKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfZWNfcmVhZCAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJYWRkcmVzcywKLQl1MzIJCQkqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQogewotCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkgCisJaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQogCQlyZXR1cm4gYWNwaV9lY19wb2xsaW5nX3JlYWQoZWMsIGFkZHJlc3MsIGRhdGEpOwogCWVsc2UKIAkJcmV0dXJuIGFjcGlfZWNfYnVyc3RfcmVhZChlYywgYWRkcmVzcywgZGF0YSk7CiB9Ci1zdGF0aWMgaW50Ci1hY3BpX2VjX3dyaXRlICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTgJCQlhZGRyZXNzLAotCXU4CQkJZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY193cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKIHsKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpIAorCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ193cml0ZShlYywgYWRkcmVzcywgZGF0YSk7CiAJZWxzZQogCQlyZXR1cm4gYWNwaV9lY19idXJzdF93cml0ZShlYywgYWRkcmVzcywgZGF0YSk7CiB9Ci1zdGF0aWMgaW50Ci1hY3BpX2VjX3BvbGxpbmdfcmVhZCAoCi0JdW5pb24gYWNwaV9lYwkJKmVjLAotCXU4CQkJYWRkcmVzcywKLQl1MzIJCQkqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCWludAkJCXJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOwotCXUzMgkJCWdsayA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdTMyIGdsayA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3JlYWQiKTsKIApAQCAtMzcxLDcgKzMzMCw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOwogCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CisJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsCisJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKQEAgLTM4NCw5ICszNDQsOSBAQAogCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgZGF0YSwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlYWQgWyUwMnhdIGZyb20gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCSpkYXRhLCBhZGRyZXNzKSk7Ci0JCi1lbmQ6CisJCQkgICpkYXRhLCBhZGRyZXNzKSk7CisKKyAgICAgIGVuZDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKQEAgLTM5NSwxNyArMzU1LDEyIEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9lY19wb2xsaW5nX3dyaXRlICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTgJCQlhZGRyZXNzLAotCXU4CQkJZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBnbGsgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY193cml0ZSIpOwogCkBAIC00MjAsNyArMzc1LDggQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CiAKLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CisJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLAorCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CiAJcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CkBAIC00MzYsOSArMzkyLDkgQEAKIAkJZ290byBlbmQ7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJXcm90ZSBbJTAyeF0gdG8gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCWRhdGEsIGFkZHJlc3MpKTsKKwkJCSAgZGF0YSwgYWRkcmVzcykpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCkBAIC00NDcsMjEgKzQwMywxNiBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX2J1cnN0X3JlYWQgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1OAkJCWFkZHJlc3MsCi0JdTMyCQkJKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfcmVhZCh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICogZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXMgPSAwOwotCXUzMgkJCWdsazsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgZ2xrOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19yZWFkIik7CiAKIAlpZiAoIWVjIHx8ICFkYXRhKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLXJldHJ5OgogCSpkYXRhID0gMDsKIAogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKSB7CkBAIC00NzMsNjQgKzQyNCw0OSBAQAogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwogCWRvd24oJmVjLT5idXJzdC5zZW0pOwogCi0JaWYoYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKSkKLQkJZ290byBlbmQ7Ci0KLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUkVBRCwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKKwlhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpOwogCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAJaWYgKHN0YXR1cykgeworCQlwcmludGsoInJlYWQgRUMsIElCIG5vdCBlbXB0eVxuIik7CiAJCWdvdG8gZW5kOwogCX0KKwlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUkVBRCwKKwkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOworCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKCJyZWFkIEVDLCBJQiBub3QgZW1wdHlcbiIpOworCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0Jc3RhdHVzPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAoc3RhdHVzKXsKLQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygicmVhZCBFQywgT0Igbm90IGZ1bGxcbiIpOwogCQlnb3RvIGVuZDsKIAl9Ci0KIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlYWQgWyUwMnhdIGZyb20gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCSpkYXRhLCBhZGRyZXNzKSk7Ci0JCi1lbmQ6CisJCQkgICpkYXRhLCBhZGRyZXNzKSk7CisKKyAgICAgIGVuZDoKIAlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOwogCXVwKCZlYy0+YnVyc3Quc2VtKTsKIAogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIAotCWlmKGF0b21pY19yZWFkKCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCkgPT0gMil7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywiYWJvcnRlZCwgcmV0cnkgLi4uXG4iKSk7Ci0JCXdoaWxlKGF0b21pY19yZWFkKCZlYy0+YnVyc3QucGVuZGluZ19ncGUpKXsKLQkJCW1zbGVlcCgxKTsJCi0JCX0KLQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKLQkJZ290byByZXRyeTsKLQl9Ci0KIAlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2VjX2J1cnN0X3dyaXRlICgKLQl1bmlvbiBhY3BpX2VjCQkqZWMsCi0JdTgJCQlhZGRyZXNzLAotCXU4CQkJZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXMgPSAwOwotCXUzMgkJCWdsazsKLQl1MzIJCQl0bXA7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGdsazsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfd3JpdGUiKTsKIAogCWlmICghZWMpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLXJldHJ5OgorCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spIHsKIAkJc3RhdHVzID0gYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKEFDUElfRUNfVURFTEFZX0dMSywgJmdsayk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKQEAgLTU0MCw2OSArNDc2LDQzIEBACiAJV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7CiAJZG93bigmZWMtPmJ1cnN0LnNlbSk7CiAKLQlpZihhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpKQotCQlnb3RvIGVuZDsKKwlhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpOwogCi0Jc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7Ci0JaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmCi0JCSEoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSl7Ci0JCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQlVSU1RfRU5BQkxFLCAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwotCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gZW5kOwotCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ0bXAsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JCWlmKHRtcCAhPSAweDkwICkgLyogQnVyc3QgQUNLIGJ5dGUqLwotCQkJZ290byBlbmQ7Ci0JfQotCS8qTm93IHdlIGFyZSBpbiBidXJzdCBtb2RlKi8KLQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9XUklURSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCWlmIChzdGF0dXMpewotCQlnb3RvIGVuZDsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CisJfQorCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9XUklURSwKKwkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOworCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKCJ3cml0ZSBFQywgSUIgbm90IGVtcHR5XG4iKTsKIAl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwogCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChzdGF0dXMpewotCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCQlnb3RvIGVuZDsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CiAJfQogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgZGF0YSwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKLQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCWlmIChzdGF0dXMpCi0JCWdvdG8gZW5kOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiV3JvdGUgWyUwMnhdIHRvIGFkZHJlc3MgWyUwMnhdXG4iLAotCQlkYXRhLCBhZGRyZXNzKSk7CisJCQkgIGRhdGEsIGFkZHJlc3MpKTsKIAotZW5kOgogCWFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZShlYyk7CiAJdXAoJmVjLT5idXJzdC5zZW0pOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCi0JaWYoYXRvbWljX3JlYWQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0KSA9PSAyKXsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhYm9ydGVkLCByZXRyeSAuLi5cbiIpKTsKLQkJd2hpbGUoYXRvbWljX3JlYWQoJmVjLT5idXJzdC5wZW5kaW5nX2dwZSkpewotCQkJbXNsZWVwKDEpOwkKLQkJfQotCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotCQlnb3RvIHJldHJ5OwotCX0KLQogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCiAvKgogICogRXh0ZXJuYWxseSBjYWxsYWJsZSBFQyBhY2Nlc3MgZnVuY3Rpb25zLiBGb3Igbm93LCBhc3N1bWUgMSBFQyBvbmx5CiAgKi8KLWludAotZWNfcmVhZCh1OCBhZGRyLCB1OCAqdmFsKQoraW50IGVjX3JlYWQodTggYWRkciwgdTggKiB2YWwpCiB7CiAJdW5pb24gYWNwaV9lYyAqZWM7CiAJaW50IGVycjsKQEAgLTYxOCwxNCArNTI4LDEzIEBACiAJaWYgKCFlcnIpIHsKIAkJKnZhbCA9IHRlbXBfZGF0YTsKIAkJcmV0dXJuIDA7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJcmV0dXJuIGVycjsKIH0KKwogRVhQT1JUX1NZTUJPTChlY19yZWFkKTsKIAotaW50Ci1lY193cml0ZSh1OCBhZGRyLCB1OCB2YWwpCitpbnQgZWNfd3JpdGUodTggYWRkciwgdTggdmFsKQogewogCXVuaW9uIGFjcGlfZWMgKmVjOwogCWludCBlcnI7CkBAIC02MzksMjcgKzU0OCwyMiBAQAogCiAJcmV0dXJuIGVycjsKIH0KKwogRVhQT1JUX1NZTUJPTChlY193cml0ZSk7CiAKLXN0YXRpYyBpbnQKLWFjcGlfZWNfcXVlcnkgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1MzIJCQkqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSkKIHsKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpIAorCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ19xdWVyeShlYywgZGF0YSk7CiAJZWxzZQogCQlyZXR1cm4gYWNwaV9lY19idXJzdF9xdWVyeShlYywgZGF0YSk7CiB9Ci1zdGF0aWMgaW50Ci1hY3BpX2VjX3BvbGxpbmdfcXVlcnkgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1MzIJCQkqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3F1ZXJ5KHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKiBkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBnbGsgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19xdWVyeSIpOwogCkBAIC02ODEsNyArNTg1LDggQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOwogCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1FVRVJZLCAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOworCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwKKwkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwogCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwpAQCAtNjkwLDcgKzU5NSw3IEBACiAJaWYgKCEqZGF0YSkKIAkJcmVzdWx0ID0gLUVOT0RBVEE7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKQEAgLTY5OCwxMyArNjAzLDEwIEBACiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfYnVyc3RfcXVlcnkgKAotCXVuaW9uIGFjcGlfZWMJCSplYywKLQl1MzIJCQkqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXMgPSAwOwotCXUzMgkJCWdsazsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgZ2xrOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19xdWVyeSIpOwogCkBAIC03MTksNzAgKzYyMSw2NCBAQAogCX0KIAogCWRvd24oJmVjLT5idXJzdC5zZW0pOwotCWlmKGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZShlYykpCisKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygicXVlcnkgRUMsIElCIG5vdCBlbXB0eVxuIik7CiAJCWdvdG8gZW5kOworCX0KIAkvKgogCSAqIFF1ZXJ5IHRoZSBFQyB0byBmaW5kIG91dCB3aGljaCBfUXh4IG1ldGhvZCB3ZSBuZWVkIHRvIGV2YWx1YXRlLgogCSAqIE5vdGUgdGhhdCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHF1ZXJ5IGNhdXNlcyB0aGUgQUNQSV9FQ19TQ0kKIAkgKiBiaXQgdG8gYmUgY2xlYXJlZCAoYW5kIHRodXMgY2xlYXJpbmcgdGhlIGludGVycnVwdCBzb3VyY2UpLgogCSAqLwotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKKwlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksCisJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAoc3RhdHVzKXsKLQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygicXVlcnkgRUMsIE9CIG5vdCBmdWxsXG4iKTsKIAkJZ290byBlbmQ7CiAJfQogCiAJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCBkYXRhLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAJaWYgKCEqZGF0YSkKIAkJc3RhdHVzID0gLUVOT0RBVEE7CiAKLWVuZDoKLQlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOworICAgICAgZW5kOgogCXVwKCZlYy0+YnVyc3Quc2VtKTsKIAogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIAotCWlmKGF0b21pY19yZWFkKCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCkgPT0gMil7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywiYWJvcnRlZCwgcmV0cnkgLi4uXG4iKSk7Ci0JCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7Ci0JCXN0YXR1cyA9IC1FTk9EQVRBOwotCX0KIAlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiB1bmlvbiBhY3BpX2VjX3F1ZXJ5X2RhdGEgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JdTgJCQlkYXRhOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1OCBkYXRhOwogfTsKIAotc3RhdGljIHZvaWQKLWFjcGlfZWNfZ3BlX3F1ZXJ5ICgKLQl2b2lkCQkJKmVjX2N4dCkKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZ3BlX3F1ZXJ5KHZvaWQgKmVjX2N4dCkKIHsKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpIAorCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKIAkJYWNwaV9lY19ncGVfcG9sbGluZ19xdWVyeShlY19jeHQpOwogCWVsc2UKIAkJYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkoZWNfY3h0KTsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfZWNfZ3BlX3BvbGxpbmdfcXVlcnkgKAotCXZvaWQJCQkqZWNfY3h0KQorc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbGluZ19xdWVyeSh2b2lkICplY19jeHQpCiB7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gKHVuaW9uIGFjcGlfZWMgKikgZWNfY3h0OwotCXUzMgkJCXZhbHVlID0gMDsKLQl1bnNpZ25lZCBsb25nCQlmbGFncyA9IDA7Ci0Jc3RhdGljIGNoYXIJCW9iamVjdF9uYW1lWzVdID0geydfJywnUScsJzAnLCcwJywnXDAnfTsKLQljb25zdCBjaGFyCQloZXhbXSA9IHsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLAotCQkJCSAgICAgICAgICc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRid9OworCXVuaW9uIGFjcGlfZWMgKmVjID0gKHVuaW9uIGFjcGlfZWMgKillY19jeHQ7CisJdTMyIHZhbHVlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdGF0aWMgY2hhciBvYmplY3RfbmFtZVs1XSA9IHsgJ18nLCAnUScsICcwJywgJzAnLCAnXDAnIH07CisJY29uc3QgY2hhciBoZXhbXSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisJCSc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCisJfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfZ3BlX3F1ZXJ5Iik7CiAKQEAgLTgxMiwxOSArNzA4LDE4IEBACiAKIAlhY3BpX2V2YWx1YXRlX29iamVjdChlYy0+Y29tbW9uLmhhbmRsZSwgb2JqZWN0X25hbWUsIE5VTEwsIE5VTEwpOwogCi1lbmQ6CQorICAgICAgZW5kOgogCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiB9Ci1zdGF0aWMgdm9pZAotYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkgKAotCXZvaWQJCQkqZWNfY3h0KQorc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkodm9pZCAqZWNfY3h0KQogewotCXVuaW9uIGFjcGlfZWMJCSplYyA9ICh1bmlvbiBhY3BpX2VjICopIGVjX2N4dDsKLQl1MzIJCQl2YWx1ZTsKLQlpbnQJCQlyZXN1bHQgPSAtRU5PREFUQTsKLQlzdGF0aWMgY2hhcgkJb2JqZWN0X25hbWVbNV0gPSB7J18nLCdRJywnMCcsJzAnLCdcMCd9OwotCWNvbnN0IGNoYXIJCWhleFtdID0geycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsCi0JCQkJICAgICAgICAgJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307CisJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWVjX2N4dDsKKwl1MzIgdmFsdWU7CisJaW50IHJlc3VsdCA9IC1FTk9EQVRBOworCXN0YXRpYyBjaGFyIG9iamVjdF9uYW1lWzVdID0geyAnXycsICdRJywgJzAnLCAnMCcsICdcMCcgfTsKKwljb25zdCBjaGFyIGhleFtdID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKwkJJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKKwl9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19ncGVfcXVlcnkiKTsKIApAQCAtODQwLDI2ICs3MzUsMjIgQEAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFdmFsdWF0aW5nICVzXG4iLCBvYmplY3RfbmFtZSkpOwogCiAJYWNwaV9ldmFsdWF0ZV9vYmplY3QoZWMtPmNvbW1vbi5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKLWVuZDoJCisgICAgICBlbmQ6CiAJYXRvbWljX2RlYygmZWMtPmJ1cnN0LnBlbmRpbmdfZ3BlKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB1MzIKLWFjcGlfZWNfZ3BlX2hhbmRsZXIgKAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB1MzIgYWNwaV9lY19ncGVfaGFuZGxlcih2b2lkICpkYXRhKQogewotCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkgCisJaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQogCQlyZXR1cm4gYWNwaV9lY19ncGVfcG9sbGluZ19oYW5kbGVyKGRhdGEpOwogCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIoZGF0YSk7CQorCQlyZXR1cm4gYWNwaV9lY19ncGVfYnVyc3RfaGFuZGxlcihkYXRhKTsKIH0KLXN0YXRpYyB1MzIKLWFjcGlfZWNfZ3BlX3BvbGxpbmdfaGFuZGxlciAoCi0Jdm9pZAkJCSpkYXRhKQorc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9wb2xsaW5nX2hhbmRsZXIodm9pZCAqZGF0YSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gKHVuaW9uIGFjcGlfZWMgKikgZGF0YTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2VjICplYyA9ICh1bmlvbiBhY3BpX2VjICopZGF0YTsKIAogCWlmICghZWMpCiAJCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKQEAgLTg2Nyw2MSArNzU4LDQ5IEBACiAJYWNwaV9kaXNhYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfSVNSKTsKIAogCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAotCQlhY3BpX2VjX2dwZV9xdWVyeSwgZWMpOworCQkJCQkgICAgIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CiAKIAlpZiAoc3RhdHVzID09IEFFX09LKQogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKIAllbHNlCiAJCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIH0KLXN0YXRpYyB1MzIKLWFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIgKAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB1MzIgYWNwaV9lY19ncGVfYnVyc3RfaGFuZGxlcih2b2lkICpkYXRhKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1MzIJCQl2YWx1ZTsKLQl1bmlvbiBhY3BpX2VjCQkqZWMgPSAodW5pb24gYWNwaV9lYyAqKSBkYXRhOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiB2YWx1ZTsKKwl1bmlvbiBhY3BpX2VjICplYyA9ICh1bmlvbiBhY3BpX2VjICopZGF0YTsKIAogCWlmICghZWMpCiAJCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIAotCWFjcGlfZGlzYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0lTUik7Ci0KKwlhY3BpX2NsZWFyX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfSVNSKTsKIAl2YWx1ZSA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwogCi0JaWYoKHZhbHVlICYgQUNQSV9FQ19GTEFHX0lCRikgJiYKLQkJISh2YWx1ZSAmIEFDUElfRUNfRkxBR19CVVJTVCkgJiYKLQkJCShhdG9taWNfcmVhZCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QpID09IDApKSB7IAotCS8qCi0JICogdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgZGlzYWJsZXMgCi0JICogYnVyc3QgbW9kZSBmb3IgYW55IHJlYXNvbiBvdGhlciAKLQkgKiB0aGFuIHRoZSBidXJzdCBkaXNhYmxlIGNvbW1hbmQKLQkgKiB0byBwcm9jZXNzIGNyaXRpY2FsIGV2ZW50LgotCSAqLwotCQlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCAsIDIpOyAvKiBibG9jayBjdXJyZW50IHBlbmRpbmcgdHJhbnNhY3Rpb24KLQkJCQkJYW5kIHJldHJ5ICovCisJc3dpdGNoIChlYy0+YnVyc3QuZXhwZWN0X2V2ZW50KSB7CisJY2FzZSBBQ1BJX0VDX0VWRU5UX09CRjoKKwkJaWYgKCEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfT0JGKSkKKwkJCWJyZWFrOworCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6CisJCWlmICgodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkKKwkJCWJyZWFrOworCQllYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID0gMDsKIAkJd2FrZV91cCgmZWMtPmJ1cnN0LndhaXQpOwotCX1lbHNlIHsKLQkJaWYgKChlYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID09IEFDUElfRUNfRVZFTlRfT0JGICYmCi0JCQkJKHZhbHVlICYgQUNQSV9FQ19GTEFHX09CRikpIHx8Ci0JICAgIAkJCShlYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID09IEFDUElfRUNfRVZFTlRfSUJFICYmCi0JCQkJISh2YWx1ZSAmIEFDUElfRUNfRkxBR19JQkYpKSkgewotCQkJZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7Ci0JCQl3YWtlX3VwKCZlYy0+YnVyc3Qud2FpdCk7Ci0JCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKLQkJfQorCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKLQlpZiAodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfU0NJKXsKLQkJYXRvbWljX2FkZCgxLCAmZWMtPmJ1cnN0LnBlbmRpbmdfZ3BlKSA7CisJaWYgKHZhbHVlICYgQUNQSV9FQ19GTEFHX1NDSSkgeworCQlhdG9taWNfYWRkKDEsICZlYy0+YnVyc3QucGVuZGluZ19ncGUpOwogCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0dQRSwKLQkJCQkJCWFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJCQkJCQkgICAgIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CiAJCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPwotCQlBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7Ci0JfSAKKwkJICAgIEFDUElfSU5URVJSVVBUX0hBTkRMRUQgOiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKKwl9CiAJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9JU1IpOwogCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPwotCQlBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJICAgIEFDUElfSU5URVJSVVBUX0hBTkRMRUQgOiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTkyOSwzNyArODA4LDMxIEBACiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZWNfc3BhY2Vfc2V0dXAgKAotCWFjcGlfaGFuZGxlCQlyZWdpb25faGFuZGxlLAotCXUzMgkJCWZ1bmN0aW9uLAotCXZvaWQJCQkqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQJCQkqKnJldHVybl9jb250ZXh0KQorYWNwaV9lY19zcGFjZV9zZXR1cChhY3BpX2hhbmRsZSByZWdpb25faGFuZGxlLAorCQkgICAgdTMyIGZ1bmN0aW9uLCB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZXR1cm5fY29udGV4dCkKIHsKIAkvKgogCSAqIFRoZSBFQyBvYmplY3QgaXMgaW4gdGhlIGhhbmRsZXIgY29udGV4dCBhbmQgaXMgbmVlZGVkCiAJICogd2hlbiBjYWxsaW5nIHRoZSBhY3BpX2VjX3NwYWNlX2hhbmRsZXIuCiAJICovCi0JKnJldHVybl9jb250ZXh0ICA9IChmdW5jdGlvbiAhPSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSA/Ci0JCQkJCQloYW5kbGVyX2NvbnRleHQgOiBOVUxMOworCSpyZXR1cm5fY29udGV4dCA9IChmdW5jdGlvbiAhPSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSA/CisJICAgIGhhbmRsZXJfY29udGV4dCA6IE5VTEw7CiAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2VjX3NwYWNlX2hhbmRsZXIgKAotCXUzMgkJCWZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcwlhZGRyZXNzLAotCXUzMgkJCWJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIJCSp2YWx1ZSwKLQl2b2lkCQkJKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkCQkJKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9lY19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCSAgICAgIHUzMiBiaXRfd2lkdGgsCisJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gTlVMTDsKLQl1NjQJCQl0ZW1wID0gKnZhbHVlOwotCWFjcGlfaW50ZWdlcgkJZl92ID0gMDsKLQlpbnQgCQkJaSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXU2NCB0ZW1wID0gKnZhbHVlOworCWFjcGlfaW50ZWdlciBmX3YgPSAwOworCWludCBpID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfc3BhY2VfaGFuZGxlciIpOwogCkBAIC05NjcsMTcgKzg0MCwxOCBAQAogCQlyZXR1cm5fVkFMVUUoQUVfQkFEX1BBUkFNRVRFUik7CiAKIAlpZiAoYml0X3dpZHRoICE9IDggJiYgYWNwaV9zdHJpY3QpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggImFjcGlfZWNfc3BhY2VfaGFuZGxlcjogYml0X3dpZHRoIHNob3VsZCBiZSA4XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICJhY3BpX2VjX3NwYWNlX2hhbmRsZXI6IGJpdF93aWR0aCBzaG91bGQgYmUgOFxuIik7CiAJCXJldHVybl9WQUxVRShBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQllYyA9ICh1bmlvbiBhY3BpX2VjICopIGhhbmRsZXJfY29udGV4dDsKKwllYyA9ICh1bmlvbiBhY3BpX2VjICopaGFuZGxlcl9jb250ZXh0OwogCi1uZXh0X2J5dGU6CisgICAgICBuZXh0X2J5dGU6CiAJc3dpdGNoIChmdW5jdGlvbikgewogCWNhc2UgQUNQSV9SRUFEOgogCQl0ZW1wID0gMDsKLQkJcmVzdWx0ID0gYWNwaV9lY19yZWFkKGVjLCAodTgpIGFkZHJlc3MsICh1MzIgKikmdGVtcCk7CisJCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgKHU4KSBhZGRyZXNzLCAodTMyICopICYgdGVtcCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9XUklURToKIAkJcmVzdWx0ID0gYWNwaV9lY193cml0ZShlYywgKHU4KSBhZGRyZXNzLCAodTgpIHRlbXApOwpAQCAtMTAwNCw4ICs4NzgsNyBAQAogCQkqdmFsdWUgPSBmX3Y7CiAJfQogCi0JCQotb3V0OgorICAgICAgb3V0OgogCXN3aXRjaCAocmVzdWx0KSB7CiAJY2FzZSAtRUlOVkFMOgogCQlyZXR1cm5fVkFMVUUoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC0xMDIxLDE4ICs4OTQsMTUgQEAKIAl9CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSphY3BpX2VjX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfZWNfZGlyOwogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfcmVhZF9pbmZvIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX2VjX3JlYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXVuaW9uIGFjcGlfZWMJCSplYyA9ICh1bmlvbiBhY3BpX2VjICopIHNlcS0+cHJpdmF0ZTsKKwl1bmlvbiBhY3BpX2VjICplYyA9ICh1bmlvbiBhY3BpX2VjICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19yZWFkX2luZm8iKTsKIApAQCAtMTA0MCwxNCArOTEwLDE1IEBACiAJCWdvdG8gZW5kOwogCiAJc2VxX3ByaW50ZihzZXEsICJncGUgYml0OiAgICAgICAgICAgICAgICAgMHglMDJ4XG4iLAotCQkodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOworCQkgICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOwogCXNlcV9wcmludGYoc2VxLCAicG9ydHM6ICAgICAgICAgICAgICAgICAgIDB4JTAyeCwgMHglMDJ4XG4iLAotCQkodTMyKSBlYy0+Y29tbW9uLnN0YXR1c19hZGRyLmFkZHJlc3MsICh1MzIpIGVjLT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpOworCQkgICAodTMyKSBlYy0+Y29tbW9uLnN0YXR1c19hZGRyLmFkZHJlc3MsCisJCSAgICh1MzIpIGVjLT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpOwogCXNlcV9wcmludGYoc2VxLCAidXNlIGdsb2JhbCBsb2NrOiAgICAgICAgICVzXG4iLAotCQllYy0+Y29tbW9uLmdsb2JhbF9sb2NrPyJ5ZXMiOiJubyIpOworCQkgICBlYy0+Y29tbW9uLmdsb2JhbF9sb2NrID8gInllcyIgOiAibm8iKTsKIAlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC0xMDU3LDM0ICs5MjgsMzIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9lY19pbmZvX29wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2VjX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9lY19pbmZvX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZWNfYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19hZGRfZnMiKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJYWNwaV9lY19kaXIpOworCQkJCQkJICAgICBhY3BpX2VjX2Rpcik7CiAJCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpCiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0VDX0ZJTEVfSU5GTywgU19JUlVHTywKLQkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX0VDX0ZJTEVfSU5GTykpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfRUNfRklMRV9JTkZPKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9lY19pbmZvX29wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xMDk0LDEwICs5NjMsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZWNfcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcmVtb3ZlX2ZzIik7CiAKQEAgLTExMTAsMjAgKzk3NiwxNiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQotc3RhdGljIGludAotYWNwaV9lY19wb2xsaW5nX2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nCQl1aWQ7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgdWlkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19hZGQiKTsKIApAQCAtMTE0MywyNiArMTAwNSwzMSBAQAogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGVjOwogCiAJLyogVXNlIHRoZSBnbG9iYWwgbG9jayBmb3IgYWxsIEVDIHRyYW5zYWN0aW9ucz8gKi8KLQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR0xLIiwgTlVMTCwgJmVjLT5jb21tb24uZ2xvYmFsX2xvY2spOworCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HTEsiLCBOVUxMLAorCQkJICAgICAgJmVjLT5jb21tb24uZ2xvYmFsX2xvY2spOwogCiAJLyogSWYgb3VyIFVJRCBtYXRjaGVzIHRoZSBVSUQgZm9yIHRoZSBFQ0RULWVudW1lcmF0ZWQgRUMsCi0JICAgd2Ugbm93IGhhdmUgdGhlICpyZWFsKiBFQyBpbmZvLCBzbyBraWxsIHRoZSBtYWtlc2hpZnQgb25lLiovCisJICAgd2Ugbm93IGhhdmUgdGhlICpyZWFsKiBFQyBpbmZvLCBzbyBraWxsIHRoZSBtYWtlc2hpZnQgb25lLiAqLwogCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9VSUQiLCBOVUxMLCAmdWlkKTsKIAlpZiAoZWNfZWNkdCAmJiBlY19lY2R0LT5jb21tb24udWlkID09IHVpZCkgewogCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKLQkJCUFDUElfQURSX1NQQUNFX0VDLCAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKLQkKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsICZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKKwkJCQkJCSAgQUNQSV9BRFJfU1BBQ0VfRUMsCisJCQkJCQkgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOworCisJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAorCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAKIAkJa2ZyZWUoZWNfZWNkdCk7CiAJfQogCiAJLyogR2V0IEdQRSBiaXQgYXNzaWdubWVudCAoRUMgZXZlbnRzKS4gKi8KIAkvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgX0dQRSByZXR1cm5pbmcgYSBwYWNrYWdlICovCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlYy0+Y29tbW9uLmdwZV9iaXQpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HUEUiLCBOVUxMLAorCQkJCSAgJmVjLT5jb21tb24uZ3BlX2JpdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3Igb2J0YWluaW5nIEdQRSBiaXQgYXNzaWdubWVudFxuIikpOworCQkJCSAgIkVycm9yIG9idGFpbmluZyBHUEUgYml0IGFzc2lnbm1lbnRcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMTE3MiwyNiArMTAzOSwyNCBAQAogCQlnb3RvIGVuZDsKIAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdIChncGUgJWQpXG4iLAotCQlhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOworCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCSAgICAgICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOwogCiAJaWYgKCFmaXJzdF9lYykKIAkJZmlyc3RfZWMgPSBkZXZpY2U7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KQogCQlrZnJlZShlYyk7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfYnVyc3RfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nCQl1aWQ7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgdWlkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19hZGQiKTsKIApAQCAtMTIwNSwzNSArMTA3MCw0MCBAQAogCiAJZWMtPmNvbW1vbi5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKIAllYy0+Y29tbW9uLnVpZCA9IC0xOwotIAlhdG9taWNfc2V0KCZlYy0+YnVyc3QucGVuZGluZ19ncGUsIDApOwotIAlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCAsIDEpOwotIAlpbml0X01VVEVYKCZlYy0+YnVyc3Quc2VtKTsKLSAJaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPmJ1cnN0LndhaXQpOworCWF0b21pY19zZXQoJmVjLT5idXJzdC5wZW5kaW5nX2dwZSwgMCk7CisJYXRvbWljX3NldCgmZWMtPmJ1cnN0LmxlYXZpbmdfYnVyc3QsIDEpOworCWluaXRfTVVURVgoJmVjLT5idXJzdC5zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT5idXJzdC53YWl0KTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0VDX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9FQ19DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZWM7CiAKIAkvKiBVc2UgdGhlIGdsb2JhbCBsb2NrIGZvciBhbGwgRUMgdHJhbnNhY3Rpb25zPyAqLwotCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HTEsiLCBOVUxMLCAmZWMtPmNvbW1vbi5nbG9iYWxfbG9jayk7CisJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dMSyIsIE5VTEwsCisJCQkgICAgICAmZWMtPmNvbW1vbi5nbG9iYWxfbG9jayk7CiAKIAkvKiBJZiBvdXIgVUlEIG1hdGNoZXMgdGhlIFVJRCBmb3IgdGhlIEVDRFQtZW51bWVyYXRlZCBFQywKLQkgICB3ZSBub3cgaGF2ZSB0aGUgKnJlYWwqIEVDIGluZm8sIHNvIGtpbGwgdGhlIG1ha2VzaGlmdCBvbmUuKi8KKwkgICB3ZSBub3cgaGF2ZSB0aGUgKnJlYWwqIEVDIGluZm8sIHNvIGtpbGwgdGhlIG1ha2VzaGlmdCBvbmUuICovCiAJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX1VJRCIsIE5VTEwsICZ1aWQpOwogCWlmIChlY19lY2R0ICYmIGVjX2VjZHQtPmNvbW1vbi51aWQgPT0gdWlkKSB7CiAJCWFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihBQ1BJX1JPT1RfT0JKRUNULAotCQkJQUNQSV9BRFJfU1BBQ0VfRUMsICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOworCQkJCQkJICBBQ1BJX0FEUl9TUEFDRV9FQywKKwkJCQkJCSAgJmFjcGlfZWNfc3BhY2VfaGFuZGxlcik7CiAKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsICZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKKwkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJCQkJCSZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKIAogCQlrZnJlZShlY19lY2R0KTsKIAl9CiAKIAkvKiBHZXQgR1BFIGJpdCBhc3NpZ25tZW50IChFQyBldmVudHMpLiAqLwogCS8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBfR1BFIHJldHVybmluZyBhIHBhY2thZ2UgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR1BFIiwgTlVMTCwgJmVjLT5jb21tb24uZ3BlX2JpdCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dQRSIsIE5VTEwsCisJCQkJICAmZWMtPmNvbW1vbi5ncGVfYml0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciBvYnRhaW5pbmcgR1BFIGJpdCBhc3NpZ25tZW50XG4iKSk7CisJCQkJICAiRXJyb3Igb2J0YWluaW5nIEdQRSBiaXQgYXNzaWdubWVudFxuIikpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0xMjQyLDI3ICsxMTEyLDI0IEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAKKwlwcmludGsoImJ1cnN0LW1vZGUtZWMtMTAtQXVnXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKVxuIiwKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKKwkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKKwkgICAgICAgKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKIAogCWlmICghZmlyc3RfZWMpCiAJCWZpcnN0X2VjID0gZGV2aWNlOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkKIAkJa2ZyZWUoZWMpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9lY19yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfZWNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQl1bmlvbiBhY3BpX2VjCQkqZWMgPSBOVUxMOworCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcmVtb3ZlIik7CiAKQEAgLTEyNzgsMTMgKzExNDUsMTAgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2VjX2lvX3BvcnRzICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZQkqcmVzb3VyY2UsCi0Jdm9pZAkJCSpjb250ZXh0KQorYWNwaV9lY19pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gKHVuaW9uIGFjcGlfZWMgKikgY29udGV4dDsKKwl1bmlvbiBhY3BpX2VjICplYyA9ICh1bmlvbiBhY3BpX2VjICopY29udGV4dDsKIAlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmFkZHI7CiAKIAlpZiAocmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0lPKSB7CkBAIC0xMzEyLDEzICsxMTc2LDEwIEBACiAJcmV0dXJuIEFFX09LOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfc3RhcnQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2VjX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX2VjCQkqZWMgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfc3RhcnQiKTsKIApAQCAtMTMzNCw0OSArMTE5NSw1MCBAQAogCSAqIEdldCBJL08gcG9ydCBhZGRyZXNzZXMuIENvbnZlcnQgdG8gR0FTIGZvcm1hdC4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGVjLT5jb21tb24uaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQlhY3BpX2VjX2lvX3BvcnRzLCBlYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8IGVjLT5jb21tb24uY29tbWFuZF9hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCA9PSAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBnZXR0aW5nIEkvTyBwb3J0IGFkZHJlc3NlcyIpKTsKKwkJCQkgICAgIGFjcGlfZWNfaW9fcG9ydHMsIGVjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykKKwkgICAgfHwgZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIucmVnaXN0ZXJfYml0X3dpZHRoID09IDApIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFcnJvciBnZXR0aW5nIEkvTyBwb3J0IGFkZHJlc3NlcyIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAogCWVjLT5jb21tb24uc3RhdHVzX2FkZHIgPSBlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcjsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImdwZT0weCUwMngsIHBvcnRzPTB4JTJ4LDB4JTJ4XG4iLAotCQkodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQsICh1MzIpIGVjLT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCi0JCSh1MzIpIGVjLT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpKTsKLQorCQkJICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQsCisJCQkgICh1MzIpIGVjLT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCisJCQkgICh1MzIpIGVjLT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpKTsKIAogCS8qCiAJICogSW5zdGFsbCBHUEUgaGFuZGxlcgogCSAqLwogCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsCi0JCUFDUElfR1BFX0VER0VfVFJJR0dFUkVELCAmYWNwaV9lY19ncGVfaGFuZGxlciwgZWMpOworCQkJCQkgIEFDUElfR1BFX0VER0VfVFJJR0dFUkVELAorCQkJCQkgICZhY3BpX2VjX2dwZV9oYW5kbGVyLCBlYyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9Ci0JYWNwaV9zZXRfZ3BlX3R5cGUgKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKLQlhY3BpX2VuYWJsZV9ncGUgKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlhY3BpX3NldF9ncGVfdHlwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIgKGVjLT5jb21tb24uaGFuZGxlLAotCQkJQUNQSV9BRFJfU1BBQ0VfRUMsICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIsCi0JCQkmYWNwaV9lY19zcGFjZV9zZXR1cCwgZWMpOworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoZWMtPmNvbW1vbi5oYW5kbGUsCisJCQkJCQkgICAgQUNQSV9BRFJfU1BBQ0VfRUMsCisJCQkJCQkgICAgJmFjcGlfZWNfc3BhY2VfaGFuZGxlciwKKwkJCQkJCSAgICAmYWNwaV9lY19zcGFjZV9zZXR1cCwgZWMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsICZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKKwkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LAorCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAlyZXR1cm5fVkFMVUUoQUVfT0spOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfc3RvcCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV9lY19zdG9wKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYwkJKmVjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3N0b3AiKTsKIApAQCAtMTM4NiwxMSArMTI0OCwxNCBAQAogCWVjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCiAJc3RhdHVzID0gYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGVjLT5jb21tb24uaGFuZGxlLAotCQlBQ1BJX0FEUl9TUEFDRV9FQywgJmFjcGlfZWNfc3BhY2VfaGFuZGxlcik7CisJCQkJCQkgICBBQ1BJX0FEUl9TUEFDRV9FQywKKwkJCQkJCSAgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCi0Jc3RhdHVzID0gYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CisJc3RhdHVzID0KKwkgICAgYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LAorCQkJCSAgICAmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKQEAgLTEzOTgsMzIgKzEyNjMsMjYgQEAKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfY2FsbGJhY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQl1MzIJCUxldmVsLAotCXZvaWQJCSpjb250ZXh0LAotCXZvaWQJCSoqcmV0dmFsKQorYWNwaV9mYWtlX2VjZHRfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQogewogCiAJaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQogCQlyZXR1cm4gYWNwaV9mYWtlX2VjZHRfcG9sbGluZ19jYWxsYmFjayhoYW5kbGUsCi0JCQlMZXZlbCwgY29udGV4dCwgcmV0dmFsKTsKKwkJCQkJCSAgICAgICBMZXZlbCwgY29udGV4dCwgcmV0dmFsKTsKIAllbHNlCiAJCXJldHVybiBhY3BpX2Zha2VfZWNkdF9idXJzdF9jYWxsYmFjayhoYW5kbGUsCi0JCQlMZXZlbCwgY29udGV4dCwgcmV0dmFsKTsKKwkJCQkJCSAgICAgTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X3BvbGxpbmdfY2FsbGJhY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQl1MzIJCUxldmVsLAotCXZvaWQJCSpjb250ZXh0LAotCXZvaWQJCSoqcmV0dmFsKQorYWNwaV9mYWtlX2VjZHRfcG9sbGluZ19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQogewotCWFjcGlfc3RhdHVzCXN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJYWNwaV9lY19pb19wb3J0cywgZWNfZWNkdCk7CisJCQkJICAgICBhY3BpX2VjX2lvX3BvcnRzLCBlY19lY2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7CiAJZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkcjsKQEAgLTE0MzEsMzMgKzEyOTAsMzMgQEAKIAllY19lY2R0LT5jb21tb24udWlkID0gLTE7CiAJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9VSUQiLCBOVUxMLCAmZWNfZWNkdC0+Y29tbW9uLnVpZCk7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlY19lY2R0LT5jb21tb24uZ3BlX2JpdCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HUEUiLCBOVUxMLAorCQkJCSAgJmVjX2VjZHQtPmNvbW1vbi5ncGVfYml0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7CiAJc3Bpbl9sb2NrX2luaXQoJmVjX2VjZHQtPnBvbGxpbmcubG9jayk7CiAJZWNfZWNkdC0+Y29tbW9uLmdsb2JhbF9sb2NrID0gVFJVRTsKIAllY19lY2R0LT5jb21tb24uaGFuZGxlID0gaGFuZGxlOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggICJHUEU9MHglMDJ4LCBwb3J0cz0weCUyeCwgMHglMnhcbiIsCi0JCSh1MzIpIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCAodTMyKSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCi0JCSh1MzIpIGVjX2VjZHQtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkdQRT0weCUwMngsIHBvcnRzPTB4JTJ4LCAweCUyeFxuIiwKKwkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIuYWRkcmVzcywKKwkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKTsKIAogCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfYnVyc3RfY2FsbGJhY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQl1MzIJCUxldmVsLAotCXZvaWQJCSpjb250ZXh0LAotCXZvaWQJCSoqcmV0dmFsKQorYWNwaV9mYWtlX2VjZHRfYnVyc3RfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQogewotCWFjcGlfc3RhdHVzCXN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlpbml0X01VVEVYKCZlY19lY2R0LT5idXJzdC5zZW0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPmJ1cnN0LndhaXQpOwogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQlhY3BpX2VjX2lvX3BvcnRzLCBlY19lY2R0KTsKKwkJCQkgICAgIGFjcGlfZWNfaW9fcG9ydHMsIGVjX2VjZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKIAllY19lY2R0LT5jb21tb24uc3RhdHVzX2FkZHIgPSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyOwpAQCAtMTQ2NSwxNSArMTMyNCwxOCBAQAogCWVjX2VjZHQtPmNvbW1vbi51aWQgPSAtMTsKIAlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1VJRCIsIE5VTEwsICZlY19lY2R0LT5jb21tb24udWlkKTsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfR1BFIiwgTlVMTCwgJmVjX2VjZHQtPmNvbW1vbi5ncGVfYml0KTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsCisJCQkJICAmZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKIAllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPmNvbW1vbi5oYW5kbGUgPSBoYW5kbGU7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAgIkdQRT0weCUwMngsIHBvcnRzPTB4JTJ4LCAweCUyeFxuIiwKLQkJKHUzMikgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIuYWRkcmVzcywKLQkJKHUzMikgZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkci5hZGRyZXNzKTsKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiR1BFPTB4JTAyeCwgcG9ydHM9MHglMngsIDB4JTJ4XG4iLAorCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwKKwkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkci5hZGRyZXNzLAorCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpOwogCiAJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogfQpAQCAtMTQ4OCwxMSArMTM1MCwxMCBAQAogICogb3AgcmVnaW9uIChzaW5jZSBfUkVHIGlzbid0IGludm9rZWQgeWV0KS4gVGhlIGFzc3VtcHRpb24gaXMgdHJ1ZSBmb3IKICAqIGFsbCBzeXN0ZW1zIGZvdW5kLgogICovCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9lY19mYWtlX2VjZHQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfZmFrZV9lY2R0KHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMJc3RhdHVzOwotCWludAkJcmV0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHJldCA9IDA7CiAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiVHJ5IHRvIG1ha2UgYW4gZmFrZSBFQ0RUXG4iKTsKIApAQCAtMTUwMywxMCArMTM2NCw4IEBACiAJfQogCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfZGV2aWNlcyAoQUNQSV9FQ19ISUQsCi0JCQkJYWNwaV9mYWtlX2VjZHRfY2FsbGJhY2ssCi0JCQkJTlVMTCwKLQkJCQlOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX2dldF9kZXZpY2VzKEFDUElfRUNfSElELAorCQkJCSAgYWNwaV9mYWtlX2VjZHRfY2FsbGJhY2ssIE5VTEwsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlrZnJlZShlY19lY2R0KTsKIAkJZWNfZWNkdCA9IE5VTEw7CkBAIC0xNTE0LDEzICsxMzczLDEyIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCXJldHVybiAwOwotZXJyb3I6CisgICAgICBlcnJvcjoKIAlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDYW4ndCBtYWtlIGFuIGZha2UgRUNEVFxuIik7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfZWNfZ2V0X3JlYWxfZWNkdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19nZXRfcmVhbF9lY2R0KHZvaWQpCiB7CiAJaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQogCQlyZXR1cm4gYWNwaV9lY19wb2xsaW5nX2dldF9yZWFsX2VjZHQoKTsKQEAgLTE1MjgsMTQgKzEzODYsMTQgQEAKIAkJcmV0dXJuIGFjcGlfZWNfYnVyc3RfZ2V0X3JlYWxfZWNkdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9lY19wb2xsaW5nX2dldF9yZWFsX2VjZHQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfcG9sbGluZ19nZXRfcmVhbF9lY2R0KHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9lY2R0IAkqZWNkdF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywgCi0JCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopICZlY2R0X3B0cik7CisJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKKwkJCQkJIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopCisJCQkJCSAmZWNkdF9wdHIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE1NTgsMTMgKzE0MTYsMTQgQEAKIAllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPmNvbW1vbi51aWQgPSBlY2R0X3B0ci0+dWlkOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5lY19pZCwgJmVjX2VjZHQtPmNvbW1vbi5oYW5kbGUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+ZWNfaWQsICZlY19lY2R0LT5jb21tb24uaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBlcnJvcjsKIAl9CiAKIAlyZXR1cm4gMDsKLWVycm9yOgorICAgICAgZXJyb3I6CiAJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHVzZSBFQ0RUXG4iKTsKIAlrZnJlZShlY19lY2R0KTsKIAllY19lY2R0ID0gTlVMTDsKQEAgLTE1NzIsMTUgKzE0MzEsMTQgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9lY19idXJzdF9nZXRfcmVhbF9lY2R0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2J1cnN0X2dldF9yZWFsX2VjZHQodm9pZCkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgCSplY2R0X3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAqZWNkdF9wdHI7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9maXJtd2FyZV90YWJsZSgiRUNEVCIsIDEsIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAotCQkoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSAmZWNkdF9wdHIpOworCQkJCQkgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikKKwkJCQkJICZlY2R0X3B0cik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTU5NCw4ICsxNDUyLDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGVjX2VjZHQsIDAsIHNpemVvZih1bmlvbiBhY3BpX2VjKSk7CiAKLSAJaW5pdF9NVVRFWCgmZWNfZWNkdC0+YnVyc3Quc2VtKTsKLSAJaW5pdF93YWl0cXVldWVfaGVhZCgmZWNfZWNkdC0+YnVyc3Qud2FpdCk7CisJaW5pdF9NVVRFWCgmZWNfZWNkdC0+YnVyc3Quc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT5idXJzdC53YWl0KTsKIAllY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7CiAJZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7CiAJZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhOwpAQCAtMTYwNCwxMyArMTQ2MiwxNCBAQAogCWVjX2VjZHQtPmNvbW1vbi5nbG9iYWxfbG9jayA9IFRSVUU7CiAJZWNfZWNkdC0+Y29tbW9uLnVpZCA9IGVjZHRfcHRyLT51aWQ7CiAKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgZWNkdF9wdHItPmVjX2lkLCAmZWNfZWNkdC0+Y29tbW9uLmhhbmRsZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5lY19pZCwgJmVjX2VjZHQtPmNvbW1vbi5oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGVycm9yOwogCX0KIAogCXJldHVybiAwOwotZXJyb3I6CisgICAgICBlcnJvcjoKIAlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDb3VsZCBub3QgdXNlIEVDRFRcbiIpOwogCWtmcmVlKGVjX2VjZHQpOwogCWVjX2VjZHQgPSBOVUxMOwpAQCAtMTYxOSwxMSArMTQ3OCwxMCBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgYWNwaV9mYWtlX2VjZHRfZW5hYmxlZDsKLWludCBfX2luaXQKLWFjcGlfZWNfZWNkdF9wcm9iZSAodm9pZCkKK2ludCBfX2luaXQgYWNwaV9lY19lY2R0X3Byb2JlKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQlpbnQJCQlyZXQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCByZXQ7CiAKIAlyZXQgPSBhY3BpX2VjX2dldF9yZWFsX2VjZHQoKTsKIAkvKiBUcnkgdG8gbWFrZSBhIGZha2UgRUNEVCAqLwpAQCAtMTYzOCwyNiArMTQ5NiwyOCBAQAogCSAqIEluc3RhbGwgR1BFIGhhbmRsZXIKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCi0JCUFDUElfR1BFX0VER0VfVFJJR0dFUkVELCAmYWNwaV9lY19ncGVfaGFuZGxlciwKLQkJZWNfZWNkdCk7CisJCQkJCSAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQsCisJCQkJCSAgJmFjcGlfZWNfZ3BlX2hhbmRsZXIsIGVjX2VjZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGVycm9yOwogCX0KLQlhY3BpX3NldF9ncGVfdHlwZSAoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7Ci0JYWNwaV9lbmFibGVfZ3BlIChOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlhY3BpX3NldF9ncGVfdHlwZShOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAKLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIChBQ1BJX1JPT1RfT0JKRUNULAotCQkJQUNQSV9BRFJfU1BBQ0VfRUMsICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIsCi0JCQkmYWNwaV9lY19zcGFjZV9zZXR1cCwgZWNfZWNkdCk7CisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihBQ1BJX1JPT1RfT0JKRUNULAorCQkJCQkJICAgIEFDUElfQURSX1NQQUNFX0VDLAorCQkJCQkJICAgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIsCisJCQkJCQkgICAgJmFjcGlfZWNfc3BhY2Vfc2V0dXAsCisJCQkJCQkgICAgZWNfZWNkdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAotCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOworCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycm9yOgorICAgICAgZXJyb3I6CiAJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHVzZSBFQ0RUXG4iKTsKIAlrZnJlZShlY19lY2R0KTsKIAllY19lY2R0ID0gTlVMTDsKQEAgLTE2NjUsMTAgKzE1MjUsOSBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2luaXQiKTsKIApAQCAtMTY5Myw4ICsxNTUyLDcgQEAKIAogLyogRUMgZHJpdmVyIGN1cnJlbnRseSBub3QgdW5sb2FkYWJsZSAqLwogI2lmIDAKLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9lY19leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfZWNfZXhpdCh2b2lkKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfZXhpdCIpOwogCkBAIC0xNzA0LDcgKzE1NjIsNyBAQAogCiAJcmV0dXJuX1ZPSUQ7CiB9Ci0jZW5kaWYgLyogMCAqLworI2VuZGlmCQkJCS8qIDAgKi8KIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9mYWtlX2VjZHRfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtMTcyNyw4ICsxNTg1LDggQEAKIAkJYWNwaV9lY19wb2xsaW5nX21vZGUgPSBFQ19QT0xMSU5HOwogCQlhY3BpX2VjX2RyaXZlci5vcHMuYWRkID0gYWNwaV9lY19wb2xsaW5nX2FkZDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkVDICVzIG1vZGUuXG4iLAotCQlidXJzdCA/ICJidXJzdCI6ICJwb2xsaW5nIik7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkVDICVzIG1vZGUuXG4iLCBidXJzdCA/ICJidXJzdCIgOiAicG9sbGluZyIpOwogCXJldHVybiAwOwogfQorCiBfX3NldHVwKCJlY19idXJzdD0iLCBhY3BpX2VjX3NldF9wb2xsaW5nX21vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50LmMgYi9kcml2ZXJzL2FjcGkvZXZlbnQuYwppbmRleCA0M2M0OWY2Li5iZmE4Yjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnQuYwpAQCAtMTMsNDUgKzEzLDQwIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiZXZlbnQiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXZlbnQiKQogCiAvKiBHbG9iYWwgdmFycyBmb3IgaGFuZGxpbmcgZXZlbnQgcHJvYyBlbnRyeSAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhhY3BpX3N5c3RlbV9ldmVudF9sb2NrKTsKLWludAkJCQlldmVudF9pc19vcGVuID0gMDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkCQlhY3BpX2J1c19ldmVudF9saXN0OwotZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90CWFjcGlfYnVzX2V2ZW50X3F1ZXVlOworaW50IGV2ZW50X2lzX29wZW4gPSAwOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWNwaV9idXNfZXZlbnRfbGlzdDsKK2V4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBhY3BpX2J1c19ldmVudF9xdWV1ZTsKIAotc3RhdGljIGludAotYWNwaV9zeXN0ZW1fb3Blbl9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fb3Blbl9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzcGluX2xvY2tfaXJxICgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CiAKLQlpZihldmVudF9pc19vcGVuKQorCWlmIChldmVudF9pc19vcGVuKQogCQlnb3RvIG91dF9idXN5OwogCiAJZXZlbnRfaXNfb3BlbiA9IDE7CiAKLQlzcGluX3VubG9ja19pcnEgKCZhY3BpX3N5c3RlbV9ldmVudF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOwogCXJldHVybiAwOwogCi1vdXRfYnVzeToKLQlzcGluX3VubG9ja19pcnEgKCZhY3BpX3N5c3RlbV9ldmVudF9sb2NrKTsKKyAgICAgIG91dF9idXN5OgorCXNwaW5fdW5sb2NrX2lycSgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfc3lzdGVtX3JlYWRfZXZlbnQgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljaGFyCQkJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKnBwb3MpCithY3BpX3N5c3RlbV9yZWFkX2V2ZW50KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICogcHBvcykKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2J1c19ldmVudAlldmVudDsKLQlzdGF0aWMgY2hhcgkJc3RyW0FDUElfTUFYX1NUUklOR107Ci0Jc3RhdGljIGludAkJY2hhcnNfcmVtYWluaW5nID0gMDsKLQlzdGF0aWMgY2hhcgkJKnB0cjsKLQorCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2J1c19ldmVudCBldmVudDsKKwlzdGF0aWMgY2hhciBzdHJbQUNQSV9NQVhfU1RSSU5HXTsKKwlzdGF0aWMgaW50IGNoYXJzX3JlbWFpbmluZyA9IDA7CisJc3RhdGljIGNoYXIgKnB0cjsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3JlYWRfZXZlbnQiKTsKIApAQCAtNjcsMTAgKzYyLDEyIEBACiAJCQlyZXR1cm5fVkFMVUUoLUVJTyk7CiAJCX0KIAotCQljaGFyc19yZW1haW5pbmcgPSBzcHJpbnRmKHN0ciwgIiVzICVzICUwOHggJTA4eFxuIiwgCi0JCQlldmVudC5kZXZpY2VfY2xhc3M/ZXZlbnQuZGV2aWNlX2NsYXNzOiI8dW5rbm93bj4iLAotCQkJZXZlbnQuYnVzX2lkP2V2ZW50LmJ1c19pZDoiPHVua25vd24+IiwgCi0JCQlldmVudC50eXBlLCBldmVudC5kYXRhKTsKKwkJY2hhcnNfcmVtYWluaW5nID0gc3ByaW50ZihzdHIsICIlcyAlcyAlMDh4ICUwOHhcbiIsCisJCQkJCSAgZXZlbnQuZGV2aWNlX2NsYXNzID8gZXZlbnQuCisJCQkJCSAgZGV2aWNlX2NsYXNzIDogIjx1bmtub3duPiIsCisJCQkJCSAgZXZlbnQuYnVzX2lkID8gZXZlbnQuCisJCQkJCSAgYnVzX2lkIDogIjx1bmtub3duPiIsIGV2ZW50LnR5cGUsCisJCQkJCSAgZXZlbnQuZGF0YSk7CiAJCXB0ciA9IHN0cjsKIAl9CiAKQEAgLTg4LDE5ICs4NSwxNSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfc3lzdGVtX2Nsb3NlX2V2ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBhY3BpX3N5c3RlbV9jbG9zZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzcGluX2xvY2tfaXJxICgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CiAJZXZlbnRfaXNfb3BlbiA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxICgmYWNwaV9zeXN0ZW1fZXZlbnRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZhY3BpX3N5c3RlbV9ldmVudF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludAotYWNwaV9zeXN0ZW1fcG9sbF9ldmVudCgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JcG9sbF90YWJsZQkJKndhaXQpCitzdGF0aWMgdW5zaWduZWQgaW50IGFjcGlfc3lzdGVtX3BvbGxfZXZlbnQoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQogewogCXBvbGxfd2FpdChmaWxlLCAmYWNwaV9idXNfZXZlbnRfcXVldWUsIHdhaXQpOwogCWlmICghbGlzdF9lbXB0eSgmYWNwaV9idXNfZXZlbnRfbGlzdCkpCkBAIC0xMDksMTUgKzEwMiwxNSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9ldmVudF9vcHMgPSB7Ci0JLm9wZW4gPQkJYWNwaV9zeXN0ZW1fb3Blbl9ldmVudCwKLQkucmVhZCA9CQlhY3BpX3N5c3RlbV9yZWFkX2V2ZW50LAotCS5yZWxlYXNlID0JYWNwaV9zeXN0ZW1fY2xvc2VfZXZlbnQsCi0JLnBvbGwgPQkJYWNwaV9zeXN0ZW1fcG9sbF9ldmVudCwKKwkub3BlbiA9IGFjcGlfc3lzdGVtX29wZW5fZXZlbnQsCisJLnJlYWQgPSBhY3BpX3N5c3RlbV9yZWFkX2V2ZW50LAorCS5yZWxlYXNlID0gYWNwaV9zeXN0ZW1fY2xvc2VfZXZlbnQsCisJLnBvbGwgPSBhY3BpX3N5c3RlbV9wb2xsX2V2ZW50LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9ldmVudF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwogCWludCBlcnJvciA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2V2ZW50X2luaXQiKTsKQEAgLTEzMCw4ICsxMjMsOSBAQAogCWlmIChlbnRyeSkKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3N5c3RlbV9ldmVudF9vcHM7CiAJZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBwcm9jIGZzIGVudHJ5XG4iLCJldmVudCIgKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIHByb2MgZnMgZW50cnlcbiIsCisJCQkJICAiZXZlbnQiKSk7CiAJCWVycm9yID0gLUVGQVVMVDsKIAl9CiAJcmV0dXJuX1ZBTFVFKGVycm9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKaW5kZXggZGQzYTcyYS4uODQyZDFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKQEAgLTQ1LDE4ICs0NSwxMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldmV2ZW50IikKK0FDUElfTU9EVUxFX05BTUUoImV2ZXZlbnQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplKHZvaWQpOwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7Ci0KLXN0YXRpYyB1MzIKLWFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2ggKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotCitzdGF0aWMgdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2godTMyIGV2ZW50KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03MCwyMSArNjQsMTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHModm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9pbml0aWFsaXplX2V2ZW50cyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5pdGlhbGl6ZV9ldmVudHMiKTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIEFDUEkgdGFibGVzICovCiAKIAlpZiAoIWFjcGlfZ2JsX0RTRFQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgIk5vIEFDUEkgdGFibGVzIHByZXNlbnQhXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJObyBBQ1BJIHRhYmxlcyBwcmVzZW50IVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCS8qCkBAIC05MiwyNiArODIsMjIgQEAKIAkgKiBlbmFibGluZyBTQ0lzIHRvIHByZXZlbnQgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZyBiZWZvcmUgdGhlIGhhbmRsZXJzIGFyZQogCSAqIGluc3RhbGxlZC4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmaXhlZCBldmVudHMsICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5hYmxlIHRvIGluaXRpYWxpemUgZml4ZWQgZXZlbnRzLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V2X2dwZV9pbml0aWFsaXplICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgZ2VuZXJhbCBwdXJwb3NlIGV2ZW50cywgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2dwZV9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5hYmxlIHRvIGluaXRpYWxpemUgZ2VuZXJhbCBwdXJwb3NlIGV2ZW50cywgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMKQEAgLTEyNCw0MSArMTEwLDMyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMiKTsKIAogCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJVbmFibGUgdG8gaW5zdGFsbCBTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQgSGFuZGxlciwgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmFibGUgdG8gaW5zdGFsbCBTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQgSGFuZGxlciwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIHRoZSBHbG9iYWwgTG9jayAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSBHbG9iYWwgTG9jayBoYW5kbGVyLCAlc1xuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5hYmxlIHRvIGluaXRpYWxpemUgR2xvYmFsIExvY2sgaGFuZGxlciwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCWFjcGlfZ2JsX2V2ZW50c19pbml0aWFsaXplZCA9IFRSVUU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZQpAQCAtMTcxLDEzICsxNDgsMTAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSAoCi0Jdm9pZCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUodm9pZCkKIHsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgdGhhdCBrZWVwcyB0cmFjayBvZiBmaXhlZCBldmVudCBoYW5kbGVycwpAQCAtMTkwLDEwICsxNjQsMTEgQEAKIAkJLyogRW5hYmxlIHRoZSBmaXhlZCBldmVudCAqLwogCiAJCWlmIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLmVuYWJsZV9yZWdpc3Rlcl9pZCAhPSAweEZGKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoCi0JCQkJCSBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLmVuYWJsZV9yZWdpc3Rlcl9pZCwKLQkJCQkJIDAsIEFDUElfTVRYX0xPQ0spOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgorCQkJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsIDAsCisJCQkJCSAgICAgIEFDUElfTVRYX0xPQ0spOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJcmV0dXJuIChzdGF0dXMpOwogCQkJfQogCQl9CkBAIC0yMDIsNyArMTc3LDYgQEAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2ZpeGVkX2V2ZW50X2RldGVjdApAQCAtMjE1LDMxICsxODksMjcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKLWFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0ICgKLQl2b2lkKQordTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KHZvaWQpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfc3RhdHVzID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9zdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9lbmFibGU7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworCXUzMiBpbnRfc3RhdHVzID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJdTMyIGZpeGVkX3N0YXR1czsKKwl1MzIgZml4ZWRfZW5hYmxlOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZXZfZml4ZWRfZXZlbnRfZGV0ZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImV2X2ZpeGVkX2V2ZW50X2RldGVjdCIpOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBmaXhlZCBmZWF0dXJlIHN0YXR1cyBhbmQgZW5hYmxlIHJlZ2lzdGVycywgYXMgYWxsIHRoZSBjYXNlcwogCSAqIGRlcGVuZCBvbiB0aGVpciB2YWx1ZXMuICBJZ25vcmUgZXJyb3JzIGhlcmUuCiAJICovCi0JKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCSAmZml4ZWRfc3RhdHVzKTsKLQkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAotCQkJICZmaXhlZF9lbmFibGUpOworCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkgICAgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAmZml4ZWRfc3RhdHVzKTsKKwkodm9pZClhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJICAgIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgJmZpeGVkX2VuYWJsZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTlRFUlJVUFRTLAotCQkiRml4ZWQgRXZlbnQgQmxvY2s6IEVuYWJsZSAlMDhYIFN0YXR1cyAlMDhYXG4iLAotCQlmaXhlZF9lbmFibGUsIGZpeGVkX3N0YXR1cykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5URVJSVVBUUywKKwkJCSAgIkZpeGVkIEV2ZW50IEJsb2NrOiBFbmFibGUgJTA4WCBTdGF0dXMgJTA4WFxuIiwKKwkJCSAgZml4ZWRfZW5hYmxlLCBmaXhlZF9zdGF0dXMpKTsKIAogCS8qCiAJICogQ2hlY2sgZm9yIGFsbCBwb3NzaWJsZSBGaXhlZCBFdmVudHMgYW5kIGRpc3BhdGNoIHRob3NlIHRoYXQgYXJlIGFjdGl2ZQpAQCAtMjQ3LDE4ICsyMTcsMTkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fRklYRURfRVZFTlRTOyBpKyspIHsKIAkJLyogQm90aCB0aGUgc3RhdHVzIGFuZCBlbmFibGUgYml0cyBtdXN0IGJlIG9uIGZvciB0aGlzIGV2ZW50ICovCiAKLQkJaWYgKChmaXhlZF9zdGF0dXMgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLnN0YXR1c19iaXRfbWFzaykgJiYKLQkJCShmaXhlZF9lbmFibGUgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLmVuYWJsZV9iaXRfbWFzaykpIHsKKwkJaWYgKChmaXhlZF9zdGF0dXMgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgorCQkgICAgIHN0YXR1c19iaXRfbWFzaykKKwkJICAgICYmIChmaXhlZF9lbmFibGUgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgorCQkJZW5hYmxlX2JpdF9tYXNrKSkgewogCQkJLyogRm91bmQgYW4gYWN0aXZlIChzaWduYWxsZWQpIGV2ZW50ICovCiAKLQkJCWludF9zdGF0dXMgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCAoKHUzMikgaSk7CisJCQlpbnRfc3RhdHVzIHw9IGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2goKHUzMikgaSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gKGludF9zdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2gKQEAgLTI3MiwzOSArMjQzLDMyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHUzMgotYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkKK3N0YXRpYyB1MzIgYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCh1MzIgZXZlbnQpCiB7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBDbGVhciB0aGUgc3RhdHVzIGJpdCAqLwogCi0JKHZvaWQpIGFjcGlfc2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5zdGF0dXNfcmVnaXN0ZXJfaWQsCi0JCQkgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCSh2b2lkKWFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJCXN0YXR1c19yZWdpc3Rlcl9pZCwgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UndmUgZ290IGEgaGFuZGxlci4gIElmIG5vdCwgcmVwb3J0IGFuIGVycm9yLgogCSAqIFRoZSBldmVudCBpcyBkaXNhYmxlZCB0byBwcmV2ZW50IGZ1cnRoZXIgaW50ZXJydXB0cy4KIAkgKi8KIAlpZiAoTlVMTCA9PSBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlcikgewotCQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLmVuYWJsZV9yZWdpc3Rlcl9pZCwKLQkJCQkwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCSh2b2lkKWFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJCQllbmFibGVfcmVnaXN0ZXJfaWQsIDAsCisJCQkJCUFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoCi0JCQkoIk5vIGluc3RhbGxlZCBoYW5kbGVyIGZvciBmaXhlZCBldmVudCBbJTA4WF1cbiIsCi0JCQlldmVudCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIGluc3RhbGxlZCBoYW5kbGVyIGZvciBmaXhlZCBldmVudCBbJTA4WF1cbiIsIGV2ZW50KSk7CiAKIAkJcmV0dXJuIChBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJfQogCiAJLyogSW52b2tlIHRoZSBGaXhlZCBFdmVudCBoYW5kbGVyICovCiAKLQlyZXR1cm4gKChhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlcikoCi0JCQkgIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5jb250ZXh0KSk7CisJcmV0dXJuICgoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLgorCQkgaGFuZGxlcikgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5jb250ZXh0KSk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCmluZGV4IDA4MTEyMGIuLmIyZjIzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKQEAgLTQ2LDE0ICs0NiwxMCBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldmdwZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJldmdwZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCh2b2lkICpjb250ZXh0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OSwxNSArNjUsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3NldF9ncGVfdHlwZSAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKQorYWNwaV9ldl9zZXRfZ3BlX3R5cGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCB0eXBlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X3NldF9ncGVfdHlwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfc2V0X2dwZV90eXBlIik7CiAKIAkvKiBWYWxpZGF0ZSB0eXBlIGFuZCB1cGRhdGUgcmVnaXN0ZXIgZW5hYmxlIG1hc2tzICovCiAKQEAgLTg4LDIxICs4MCwyMCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBEaXNhYmxlIHRoZSBHUEUgaWYgY3VycmVudGx5IGVuYWJsZWQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAogCS8qIFR5cGUgd2FzIHZhbGlkYXRlZCBhYm92ZSAqLwogCi0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH5BQ1BJX0dQRV9UWVBFX01BU0s7IC8qIENsZWFyIHR5cGUgYml0cyAqLwotCWdwZV9ldmVudF9pbmZvLT5mbGFncyB8PSB0eXBlOyAgICAgICAgICAgICAgLyogSW5zZXJ0IHR5cGUgKi8KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH5BQ1BJX0dQRV9UWVBFX01BU0s7CS8qIENsZWFyIHR5cGUgYml0cyAqLworCWdwZV9ldmVudF9pbmZvLT5mbGFncyB8PSB0eXBlOwkvKiBJbnNlcnQgdHlwZSAqLworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MKQEAgLTExOCw1NyArMTA5LDU1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKQorYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCisJCQkJdTggdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICpncGVfcmVnaXN0ZXJfaW5mbzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdDsKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87CisJdTggcmVnaXN0ZXJfYml0OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzIik7CiAKIAlncGVfcmVnaXN0ZXJfaW5mbyA9IGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvOwogCWlmICghZ3BlX3JlZ2lzdGVyX2luZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAJcmVnaXN0ZXJfYml0ID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2JpdDsKIAogCS8qIDEpIERpc2FibGUgY2FzZS4gIFNpbXBseSBjbGVhciBhbGwgZW5hYmxlIGJpdHMgKi8KIAogCWlmICh0eXBlID09IEFDUElfR1BFX0RJU0FCTEUpIHsKLQkJQUNQSV9DTEVBUl9CSVQgKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsIHJlZ2lzdGVyX2JpdCk7Ci0JCUFDUElfQ0xFQVJfQklUIChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sIHJlZ2lzdGVyX2JpdCk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlBQ1BJX0NMRUFSX0JJVChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlLAorCQkJICAgICAgIHJlZ2lzdGVyX2JpdCk7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiAyKSBFbmFibGUgY2FzZS4gIFNldC9DbGVhciB0aGUgYXBwcm9wcmlhdGUgZW5hYmxlIGJpdHMgKi8KIAogCXN3aXRjaCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9NQVNLKSB7CiAJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0U6Ci0JCUFDUElfU0VUX0JJVCAgIChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlLCByZWdpc3Rlcl9iaXQpOwotCQlBQ1BJX0NMRUFSX0JJVCAoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9HUEVfVFlQRV9SVU5USU1FOgotCQlBQ1BJX0NMRUFSX0JJVCAoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwgcmVnaXN0ZXJfYml0KTsKLQkJQUNQSV9TRVRfQklUICAgKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwKKwkJCSAgICAgICByZWdpc3Rlcl9iaXQpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTjoKLQkJQUNQSV9TRVRfQklUICAgKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsIHJlZ2lzdGVyX2JpdCk7Ci0JCUFDUElfU0VUX0JJVCAgIChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sIHJlZ2lzdGVyX2JpdCk7CisJCUFDUElfU0VUX0JJVChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlLCByZWdpc3Rlcl9iaXQpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZW5hYmxlX2dwZQpAQCAtMTg0LDIxICsxNzMsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2VuYWJsZV9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfdG9faGFyZHdhcmUpCithY3BpX2V2X2VuYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkgICB1OCB3cml0ZV90b19oYXJkd2FyZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9lbmFibGVfZ3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9lbmFibGVfZ3BlIik7CiAKIAkvKiBNYWtlIHN1cmUgSFcgZW5hYmxlIG1hc2tzIGFyZSB1cGRhdGVkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzIChncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRU5BQkxFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9FTkFCTEUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBNYXJrIHdha2UtZW5hYmxlZCBvciBIVyBlbmFibGUsIG9yIGJvdGggKi8KQEAgLTIwNiw0MSArMTkzLDQwIEBACiAJc3dpdGNoIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX01BU0spIHsKIAljYXNlIEFDUElfR1BFX1RZUEVfV0FLRToKIAotCQlBQ1BJX1NFVF9CSVQgKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKKwkJQUNQSV9TRVRfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfR1BFX1RZUEVfV0FLRV9SVU46CiAKLQkJQUNQSV9TRVRfQklUIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CisJCUFDUElfU0VUX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CiAKIAkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwogCiAJY2FzZSBBQ1BJX0dQRV9UWVBFX1JVTlRJTUU6CiAKLQkJQUNQSV9TRVRfQklUIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKKwkJQUNQSV9TRVRfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfUlVOX0VOQUJMRUQpOwogCiAJCWlmICh3cml0ZV90b19oYXJkd2FyZSkgewogCQkJLyogQ2xlYXIgdGhlIEdQRSAob2Ygc3RhbGUgZXZlbnRzKSwgdGhlbiBlbmFibGUgaXQgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUgKGdwZV9ldmVudF9pbmZvKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAogCQkJLyogRW5hYmxlIHRoZSByZXF1ZXN0ZWQgcnVudGltZSBHUEUgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyAoZ3BlX2V2ZW50X2luZm8pOworCQkJc3RhdHVzID0gYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2Rpc2FibGVfZ3BlCkBAIC0yNTMsMzYgKzIzOSwzMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2Rpc2FibGVfZ3BlICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfZXZfZGlzYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2Rpc2FibGVfZ3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9kaXNhYmxlX2dwZSIpOwogCiAJaWYgKCEoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRU5BQkxFX01BU0spKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIE1ha2Ugc3VyZSBIVyBlbmFibGUgbWFza3MgYXJlIHVwZGF0ZWQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MgKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogTWFyayB3YWtlLWRpc2FibGVkIG9yIEhXIGRpc2FibGUsIG9yIGJvdGggKi8KIAogCXN3aXRjaCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9NQVNLKSB7CiAJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0U6Ci0JCUFDUElfQ0xFQVJfQklUIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfR1BFX1RZUEVfV0FLRV9SVU46Ci0JCUFDUElfQ0xFQVJfQklUIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKIAogCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCiAKQEAgLTI5MCwxOCArMjczLDE3IEBACiAKIAkJLyogRGlzYWJsZSB0aGUgcmVxdWVzdGVkIHJ1bnRpbWUgR1BFICovCiAKLQkJQUNQSV9DTEVBUl9CSVQgKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfUlVOX0VOQUJMRUQpOwotCQlzdGF0dXMgPSBhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnIChncGVfZXZlbnRfaW5mbyk7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfUlVOX0VOQUJMRUQpOworCQlzdGF0dXMgPSBhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKGdwZV9ldmVudF9pbmZvKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbwpAQCAtMzE5LDE4ICszMDEsMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqCi1hY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlcikKK3N0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICphY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJCQkJICAgICAgIHUzMiBncGVfbnVtYmVyKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jazsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBBIE5VTEwgZ3BlX2Jsb2NrIG1lYW5zIHVzZSB0aGUgRkFEVC1kZWZpbmVkIEdQRSBibG9jayhzKSAqLwogCkBAIC0zNDAsMTEgKzMxOCwxNCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9NQVhfR1BFX0JMT0NLUzsgaSsrKSB7CiAJCQlncGVfYmxvY2sgPSBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbaV07CiAJCQlpZiAoZ3BlX2Jsb2NrKSB7Ci0JCQkJaWYgKChncGVfbnVtYmVyID49IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpICYmCi0JCQkJCShncGVfbnVtYmVyIDwgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCi0JCQkJCQkoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgewotCQkJCQlyZXR1cm4gKCZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtCi0JCQkJCQlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXSk7CisJCQkJaWYgKChncGVfbnVtYmVyID49IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpCisJCQkJICAgICYmIChncGVfbnVtYmVyIDwKKwkJCQkJZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCisJCQkJCShncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7CisJCQkJCXJldHVybiAoJmdwZV9ibG9jay0+CisJCQkJCQlldmVudF9pbmZvW2dwZV9udW1iZXIgLQorCQkJCQkJCSAgIGdwZV9ibG9jay0+CisJCQkJCQkJICAgYmxvY2tfYmFzZV9udW1iZXJdKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM1NiwyMyArMzM3LDI1IEBACiAKIAkvKiBBIE5vbi1OVUxMIGdwZV9kZXZpY2UgbWVhbnMgdGhpcyBpcyBhIEdQRSBCbG9jayBEZXZpY2UgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgZ3BlX2RldmljZSk7Ci0JaWYgKCFvYmpfZGVzYyB8fAotCQkhb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spIHsKKwlvYmpfZGVzYyA9CisJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJZ3BlX2RldmljZSk7CisJaWYgKCFvYmpfZGVzYyB8fCAhb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spIHsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKIAlncGVfYmxvY2sgPSBvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jazsKIAogCWlmICgoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSAmJgotCQkoZ3BlX251bWJlciA8IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKyAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgewotCQlyZXR1cm4gKCZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXJdKTsKKwkgICAgKGdwZV9udW1iZXIgPAorCSAgICAgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7CisJCXJldHVybiAoJmdwZV9ibG9jay0+CisJCQlldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXSk7CiAJfQogCiAJcmV0dXJuIChOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dwZV9kZXRlY3QKQEAgLTM4NywyMiArMzcwLDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCi1hY3BpX2V2X2dwZV9kZXRlY3QgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9saXN0KQordTMyIGFjcGlfZXZfZ3BlX2RldGVjdChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9saXN0KQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3N0YXR1cyA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZF9zdGF0dXNfYnl0ZTsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICpncGVfcmVnaXN0ZXJfaW5mbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yZWc7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfcmVnOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jazsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBqOworCXUzMiBpbnRfc3RhdHVzID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJdTggZW5hYmxlZF9zdGF0dXNfYnl0ZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87CisJdTMyIHN0YXR1c19yZWc7CisJdTMyIGVuYWJsZV9yZWc7CisJdTMyIGZsYWdzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX25hdGl2ZV91aW50IGo7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImV2X2dwZV9kZXRlY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImV2X2dwZV9kZXRlY3QiKTsKIAogCS8qIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbm8gR1BFcyAqLwogCkBAIC00MTIsNyArMzkzLDcgQEAKIAogCS8qIEV4YW1pbmUgYWxsIEdQRSBibG9ja3MgYXR0YWNoZWQgdG8gdGhpcyBpbnRlcnJ1cHQgbGV2ZWwgKi8KIAotCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9JU1IpOworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCWdwZV9ibG9jayA9IGdwZV94cnVwdF9saXN0LT5ncGVfYmxvY2tfbGlzdF9oZWFkOwogCXdoaWxlIChncGVfYmxvY2spIHsKIAkJLyoKQEAgLTQyNywyMyArNDA4LDMwIEBACiAKIAkJCS8qIFJlYWQgdGhlIFN0YXR1cyBSZWdpc3RlciAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkIChBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgJnN0YXR1c19yZWcsCi0JCQkJCSAmZ3BlX3JlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZChBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwKKwkJCQkJCSAgICZzdGF0dXNfcmVnLAorCQkJCQkJICAgJmdwZV9yZWdpc3Rlcl9pbmZvLT4KKwkJCQkJCSAgIHN0YXR1c19hZGRyZXNzKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCiAJCQkvKiBSZWFkIHRoZSBFbmFibGUgUmVnaXN0ZXIgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsICZlbmFibGVfcmVnLAotCQkJCQkgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsCisJCQkJCQkgICAmZW5hYmxlX3JlZywKKwkJCQkJCSAgICZncGVfcmVnaXN0ZXJfaW5mby0+CisJCQkJCQkgICBlbmFibGVfYWRkcmVzcyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5URVJSVVBUUywKLQkJCQkiUmVhZCBHUEUgUmVnaXN0ZXIgYXQgR1BFJVg6IFN0YXR1cz0lMDJYLCBFbmFibGU9JTAyWFxuIiwKLQkJCQlncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyLCBzdGF0dXNfcmVnLCBlbmFibGVfcmVnKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOVEVSUlVQVFMsCisJCQkJCSAgIlJlYWQgR1BFIFJlZ2lzdGVyIGF0IEdQRSVYOiBTdGF0dXM9JTAyWCwgRW5hYmxlPSUwMlhcbiIsCisJCQkJCSAgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlciwKKwkJCQkJICBzdGF0dXNfcmVnLCBlbmFibGVfcmVnKSk7CiAKIAkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIGFjdGl2ZSBhdCBhbGwgaW4gdGhpcyByZWdpc3RlciAqLwogCkBAIC00NTksMTQgKzQ0NywyMSBAQAogCQkJZm9yIChqID0gMDsgaiA8IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOyBqKyspIHsKIAkJCQkvKiBFeGFtaW5lIG9uZSBHUEUgYml0ICovCiAKLQkJCQlpZiAoZW5hYmxlZF9zdGF0dXNfYnl0ZSAmIGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbal0pIHsKKwkJCQlpZiAoZW5hYmxlZF9zdGF0dXNfYnl0ZSAmCisJCQkJICAgIGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbal0pIHsKIAkJCQkJLyoKIAkJCQkJICogRm91bmQgYW4gYWN0aXZlIEdQRS4gRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIGEgaGFuZGxlcgogCQkJCQkgKiBvciBtZXRob2QuCiAJCQkJCSAqLwotCQkJCQlpbnRfc3RhdHVzIHw9IGFjcGlfZXZfZ3BlX2Rpc3BhdGNoICgKLQkJCQkJCSZncGVfYmxvY2stPmV2ZW50X2luZm9bKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXSwKLQkJCQkJCSh1MzIpIGogKyBncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKTsKKwkJCQkJaW50X3N0YXR1cyB8PQorCQkJCQkgICAgYWNwaV9ldl9ncGVfZGlzcGF0Y2goJmdwZV9ibG9jay0+CisJCQkJCQkJCSBldmVudF9pbmZvWyhpICoKKwkJCQkJCQkJCSAgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpCisJCQkJCQkJCQkgICAgKworCQkJCQkJCQkJICAgIGpdLAorCQkJCQkJCQkgKHUzMikgaiArCisJCQkJCQkJCSBncGVfcmVnaXN0ZXJfaW5mby0+CisJCQkJCQkJCSBiYXNlX2dwZV9udW1iZXIpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNDc0LDEzICs0NjksMTIgQEAKIAkJZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrLT5uZXh0OwogCX0KIAotdW5sb2NrX2FuZF9leGl0OgorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCi0JYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX0lTUik7CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gKGludF9zdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZApAQCAtNDk3LDQ1ICs0OTEsNDEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kKHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8gPSAodm9pZCAqKSBjb250ZXh0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciA9IDA7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICBsb2NhbF9ncGVfZXZlbnRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIGluZm87CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gKHZvaWQgKiljb250ZXh0OworCXUzMiBncGVfbnVtYmVyID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gbG9jYWxfZ3BlX2V2ZW50X2luZm87CisJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gaW5mbzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIE11c3QgcmV2YWxpZGF0ZSB0aGUgZ3BlX251bWJlci9ncGVfYmxvY2sgKi8KIAotCWlmICghYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQgKGdwZV9ldmVudF9pbmZvKSkgewotCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKCFhY3BpX2V2X3ZhbGlkX2dwZV9ldmVudChncGVfZXZlbnRfaW5mbykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIFNldCB0aGUgR1BFIGZsYWdzIGZvciByZXR1cm4gdG8gZW5hYmxlZCBzdGF0ZSAqLwogCi0JKHZvaWQpIGFjcGlfZXZfZW5hYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8sIEZBTFNFKTsKKwkodm9pZClhY3BpX2V2X2VuYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8sIEZBTFNFKTsKIAogCS8qCiAJICogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBHUEUgaW5mbyBmb3IgdGhpcyBsZXZlbCAtIHdlIGNvcHkgdGhlCiAJICogaW5mbyB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2l0aCByZW1vdmVfaGFuZGxlci9yZW1vdmVfYmxvY2suCiAJICovCi0JQUNQSV9NRU1DUFkgKCZsb2NhbF9ncGVfZXZlbnRfaW5mbywgZ3BlX2V2ZW50X2luZm8sCi0JCXNpemVvZiAoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKKwlBQ1BJX01FTUNQWSgmbG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CiAKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKQEAgLTU0NCw0NCArNTM0LDQwIEBACiAJICogdGltZSB0byBhdm9pZCByYWNlIHdpdGggZXZfZ3BlX2luc3RhbGxfaGFuZGxlcgogCSAqLwogCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQotCQkJQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EKSB7CisJICAgIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkgewogCQkvKgogCQkgKiBJbnZva2UgdGhlIEdQRSBNZXRob2QgKF9MeHgsIF9FeHgpIGkuZS4sIGV2YWx1YXRlIHRoZSBfTHh4L19FeHgKIAkJICogY29udHJvbCBtZXRob2QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIEdQRQogCQkgKi8KIAkJaW5mby5ub2RlID0gbG9jYWxfZ3BlX2V2ZW50X2luZm8uZGlzcGF0Y2gubWV0aG9kX25vZGU7Ci0JCWluZm8ucGFyYW1ldGVycyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiwgZ3BlX2V2ZW50X2luZm8pOworCQlpbmZvLnBhcmFtZXRlcnMgPQorCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICosIGdwZV9ldmVudF9pbmZvKTsKIAkJaW5mby5wYXJhbWV0ZXJfdHlwZSA9IEFDUElfUEFSQU1fR1BFOwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlICgmaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJIiVzIHdoaWxlIGV2YWx1YXRpbmcgbWV0aG9kIFslNC40c10gZm9yIEdQRVslMlhdXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLm1ldGhvZF9ub2RlKSwKLQkJCQlncGVfbnVtYmVyKSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKCZpbmZvKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIiVzIHdoaWxlIGV2YWx1YXRpbmcgbWV0aG9kIFslNC40c10gZm9yIEdQRVslMlhdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLm1ldGhvZF9ub2RlKSwgZ3BlX251bWJlcikpOwogCQl9CiAJfQogCiAJaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KLQkJCUFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgeworCSAgICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKIAkJLyoKIAkJICogR1BFIGlzIGxldmVsLXRyaWdnZXJlZCwgd2UgY2xlYXIgdGhlIEdQRSBzdGF0dXMgYml0IGFmdGVyCiAJCSAqIGhhbmRsaW5nIHRoZSBldmVudC4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlICgmbG9jYWxfZ3BlX2V2ZW50X2luZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKCZsb2NhbF9ncGVfZXZlbnRfaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KIAl9CiAKIAkvKiBFbmFibGUgdGhpcyBHUEUgKi8KIAotCSh2b2lkKSBhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnICgmbG9jYWxfZ3BlX2V2ZW50X2luZm8pOworCSh2b2lkKWFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcoJmxvY2FsX2dwZV9ldmVudF9pbmZvKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dwZV9kaXNwYXRjaApAQCAtNTk5LDM4ICs1ODUsMzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgotYWNwaV9ldl9ncGVfZGlzcGF0Y2ggKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlcikKK2FjcGlfZXZfZ3BlX2Rpc3BhdGNoKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTMyIGdwZV9udW1iZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZ3BlX2Rpc3BhdGNoIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9ncGVfZGlzcGF0Y2giKTsKIAogCS8qCiAJICogSWYgZWRnZS10cmlnZ2VyZWQsIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBub3cuICBOb3RlIHRoYXQKIAkgKiBsZXZlbC10cmlnZ2VyZWQgZXZlbnRzIGFyZSBjbGVhcmVkIGFmdGVyIHRoZSBHUEUgaXMgc2VydmljZWQuCiAJICovCiAJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09Ci0JCQlBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCkgewotCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKLQkJCXJldHVybl9WQUxVRSAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCSAgICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCkgeworCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKKwkJCXJldHVybl9WQUxVRShBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJCX0KIAl9CiAKIAkvKiBTYXZlIGN1cnJlbnQgc3lzdGVtIHN0YXRlICovCiAKIAlpZiAoYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nKSB7Ci0JCUFDUElfU0VUX0JJVCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9TWVNURU1fUlVOTklORyk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0NMRUFSX0JJVCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9TWVNURU1fUlVOTklORyk7CisJCUFDUElfU0VUX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1NZU1RFTV9SVU5OSU5HKTsKKwl9IGVsc2UgeworCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1NZU1RFTV9SVU5OSU5HKTsKIAl9CiAKIAkvKgpAQCAtNjQ3LDE5ICs2MjYsMTkgQEAKIAkJICogSW52b2tlIHRoZSBpbnN0YWxsZWQgaGFuZGxlciAoYXQgaW50ZXJydXB0IGxldmVsKQogCQkgKiBJZ25vcmUgcmV0dXJuIHN0YXR1cyBmb3Igbm93LiAgVEJEOiBsZWF2ZSBHUEUgZGlzYWJsZWQgb24gZXJyb3I/CiAJCSAqLwotCQkodm9pZCkgZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXItPmFkZHJlc3MgKAotCQkJCSAgZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXItPmNvbnRleHQpOworCQkodm9pZClncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlci0+YWRkcmVzcyhncGVfZXZlbnRfaW5mby0+CisJCQkJCQkJCWRpc3BhdGNoLgorCQkJCQkJCQloYW5kbGVyLT4KKwkJCQkJCQkJY29udGV4dCk7CiAKIAkJLyogSXQgaXMgbm93IHNhZmUgdG8gY2xlYXIgbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cy4gKi8KIAogCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KLQkJCQlBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKLQkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlIChncGVfZXZlbnRfaW5mbyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdXG4iLAotCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKLQkJCQlyZXR1cm5fVkFMVUUgKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwkJICAgIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgeworCQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKKwkJCQlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQkJfQogCQl9CiAJCWJyZWFrOwpAQCAtNjcwLDI0ICs2NDksMjEgQEAKIAkJICogRGlzYWJsZSBHUEUsIHNvIGl0IGRvZXNuJ3Qga2VlcCBmaXJpbmcgYmVmb3JlIHRoZSBtZXRob2QgaGFzIGEKIAkJICogY2hhbmNlIHRvIHJ1bi4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gZGlzYWJsZSBHUEVbJTJYXVxuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKLQkJCXJldHVybl9WQUxVRSAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGRpc2FibGUgR1BFWyUyWF1cbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBncGVfbnVtYmVyKSk7CisJCQlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQl9CiAKIAkJLyoKIAkJICogRXhlY3V0ZSB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGUgR1BFCiAJCSAqIE5PVEU6IExldmVsLXRyaWdnZXJlZCBHUEVzIGFyZSBjbGVhcmVkIGFmdGVyIHRoZSBtZXRob2QgY29tcGxldGVzLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uIChPU0RfUFJJT1JJVFlfR1BFLAotCQkJCSBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QsIGdwZV9ldmVudF9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gcXVldWUgaGFuZGxlciBmb3IgR1BFWyUyWF0gLSBldmVudCBkaXNhYmxlZFxuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKKwkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsCisJCQkJCQkgICAgIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCwKKwkJCQkJCSAgICAgZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gcXVldWUgaGFuZGxlciBmb3IgR1BFWyUyWF0gLSBldmVudCBkaXNhYmxlZFxuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKIAkJfQogCQlicmVhazsKIApAQCAtNjk1LDI4ICs2NzEsMjMgQEAKIAogCQkvKiBObyBoYW5kbGVyIG9yIG1ldGhvZCB0byBydW4hICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJhY3BpX2V2X2dwZV9kaXNwYXRjaDogTm8gaGFuZGxlciBvciBtZXRob2QgZm9yIEdQRVslMlhdLCBkaXNhYmxpbmcgZXZlbnRcbiIsCi0JCQlncGVfbnVtYmVyKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6IE5vIGhhbmRsZXIgb3IgbWV0aG9kIGZvciBHUEVbJTJYXSwgZGlzYWJsaW5nIGV2ZW50XG4iLCBncGVfbnVtYmVyKSk7CiAKIAkJLyoKIAkJICogRGlzYWJsZSB0aGUgR1BFLiAgVGhlIEdQRSB3aWxsIHJlbWFpbiBkaXNhYmxlZCB1bnRpbCB0aGUgQUNQSQogCQkgKiBDb3JlIFN1YnN5c3RlbSBpcyByZXN0YXJ0ZWQsIG9yIGEgaGFuZGxlciBpcyBpbnN0YWxsZWQuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlIChncGVfZXZlbnRfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGRpc2FibGUgR1BFWyUyWF1cbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBncGVfbnVtYmVyKSk7Ci0JCQlyZXR1cm5fVkFMVUUgKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBkaXNhYmxlIEdQRVslMlhdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgZ3BlX251bWJlcikpOworCQkJcmV0dXJuX1ZBTFVFKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fVkFMVUUgKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOworCXJldHVybl9WQUxVRShBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEKTsKIH0KIAotCiAjaWZkZWYgQUNQSV9HUEVfTk9USUZZX0NIRUNLCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVEJEOiBOT1QgVVNFRCwgUFJPVE9UWVBFIE9OTFkgQU5EIFdJTEwgUFJPQkFCTFkgQkUgUkVNT1ZFRApAQCAtNzM1LDM1ICs3MDYsMjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbykKK2FjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUiKTsKLQotCi0JaWYgKChncGVfZXZlbnRfaW5mbykgJiYgIC8qIE9ubHkgPjAgZm9yIF9MeHgvX0V4eCAqLwotCSAgICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfU1lTVEVNX01BU0spID09IEFDUElfR1BFX1NZU1RFTV9SVU5OSU5HKSkgLyogU3lzdGVtIHN0YXRlIGF0IEdQRSB0aW1lICovIHsKKwlpZiAoKGdwZV9ldmVudF9pbmZvKSAmJgkvKiBPbmx5ID4wIGZvciBfTHh4L19FeHggKi8KKwkgICAgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9TWVNURU1fTUFTSykgPT0gQUNQSV9HUEVfU1lTVEVNX1JVTk5JTkcpKSB7CS8qIFN5c3RlbSBzdGF0ZSBhdCBHUEUgdGltZSAqLwogCQkvKiBUaGlzIG11c3QgYmUgYSB3YWtlLW9ubHkgR1BFLCBkaXNhYmxlIGl0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8pOworCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAogCQkvKiBTZXQgR1BFIHRvIHdha2Utb25seS4gIERvIG5vdCBjaGFuZ2Ugd2FrZSBkaXNhYmxlZC9lbmFibGVkIHN0YXR1cyAqLwogCi0JCWFjcGlfZXZfc2V0X2dwZV90eXBlIChncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfVFlQRV9XQUtFKTsKKwkJYWNwaV9ldl9zZXRfZ3BlX3R5cGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX1RZUEVfV0FLRSk7CiAKLQkJQUNQSV9SRVBPUlRfSU5GTyAoKCJHUEUgJXAgd2FzIHVwZGF0ZWQgZnJvbSB3YWtlL3J1biB0byB3YWtlLW9ubHlcbiIsCi0JCQkJZ3BlX2V2ZW50X2luZm8pKTsKKwkJQUNQSV9SRVBPUlRfSU5GTygoIkdQRSAlcCB3YXMgdXBkYXRlZCBmcm9tIHdha2UvcnVuIHRvIHdha2Utb25seVxuIiwgZ3BlX2V2ZW50X2luZm8pKTsKIAogCQkvKiBUaGlzIHdhcyBhIHdha2Utb25seSBHUEUgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1dBS0VfT05MWV9HUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfV0FLRV9PTkxZX0dQRSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KICNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYwppbmRleCA4NDE4NmE3Li5iMzEyZWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCkBAIC00Niw0MSArNDYsMjkgQEAKICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZncGVibGsiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXZncGVibGsiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbyhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJIHUzMiBsZXZlbCwgdm9pZCAqb2JqX2Rlc2MsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2Rlc2MsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgIHUzMiBsZXZlbCwgdm9pZCAqaW5mbywgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKHUzMgorCQkJCQkJCSAgICAgICBpbnRlcnJ1cHRfbnVtYmVyKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKgotYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCk7CithY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdCk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0ICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHQpOworYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLAorCQkJICB1MzIgaW50ZXJydXB0X251bWJlcik7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X2xldmVsKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MgKAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7Ci0KK2FjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05NiwxNiArODQsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAotYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKQordTggYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKQogewotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9ibG9jazsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogTm8gbmVlZCBmb3Igc3BpbiBsb2NrIHNpbmNlIHdlIGFyZSBub3QgY2hhbmdpbmcgYW55IGxpc3QgZWxlbWVudHMgKi8KIApAQCAtMTE5LDcgKzEwMywxMCBAQAogCiAJCXdoaWxlIChncGVfYmxvY2spIHsKIAkJCWlmICgoJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1swXSA8PSBncGVfZXZlbnRfaW5mbykgJiYKLQkJCQkoJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1soKGFjcGlfc2l6ZSkgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCkgKiA4XSA+IGdwZV9ldmVudF9pbmZvKSkgeworCQkJICAgICgmZ3BlX2Jsb2NrLT4KKwkJCSAgICAgZXZlbnRfaW5mb1soKGFjcGlfc2l6ZSkgZ3BlX2Jsb2NrLT4KKwkJCQkJIHJlZ2lzdGVyX2NvdW50KSAqIDhdID4KKwkJCSAgICAgZ3BlX2V2ZW50X2luZm8pKSB7CiAJCQkJcmV0dXJuIChUUlVFKTsKIAkJCX0KIApAQCAtMTMyLDEzICsxMTksMTEgQEAKIAlyZXR1cm4gKEZBTFNFKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QKICAqCiAgKiBQQVJBTUVURVJTOiAgZ3BlX3dhbGtfY2FsbGJhY2sgICAtIFJvdXRpbmUgY2FsbGVkIGZvciBlYWNoIEdQRSBibG9jawotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBBQ1BJX05PVF9JU1Igb3IgQUNQSV9JU1IKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTQ2LDIwICsxMzEsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl93YWxrX2dwZV9saXN0ICgKLQlBQ1BJX0dQRV9DQUxMQkFDSyAgICAgICBncGVfd2Fsa19jYWxsYmFjaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9ldl93YWxrX2dwZV9saXN0KEFDUElfR1BFX0NBTExCQUNLIGdwZV93YWxrX2NhbGxiYWNrKQogewotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jazsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiBmbGFnczsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3dhbGtfZ3BlX2xpc3QiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl93YWxrX2dwZV9saXN0Iik7Ci0KLQotCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCiAJLyogV2FsayB0aGUgaW50ZXJydXB0IGxldmVsIGRlc2NyaXB0b3IgbGlzdCAqLwogCkBAIC0xNzEsOCArMTUyLDggQEAKIAkJd2hpbGUgKGdwZV9ibG9jaykgewogCQkJLyogT25lIGNhbGxiYWNrIHBlciBHUEUgYmxvY2sgKi8KIAotCQkJc3RhdHVzID0gZ3BlX3dhbGtfY2FsbGJhY2sgKGdwZV94cnVwdF9pbmZvLCBncGVfYmxvY2spOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gZ3BlX3dhbGtfY2FsbGJhY2soZ3BlX3hydXB0X2luZm8sIGdwZV9ibG9jayk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KIApAQCAtMTgyLDEyICsxNjMsMTEgQEAKIAkJZ3BlX3hydXB0X2luZm8gPSBncGVfeHJ1cHRfaW5mby0+bmV4dDsKIAl9CiAKLXVubG9ja19hbmRfZXhpdDoKLQlhY3BpX29zX3JlbGVhc2VfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMKQEAgLTIwMywxNyArMTgzLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spCithY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgajsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9uYXRpdmVfdWludCBpOworCWFjcGlfbmF0aXZlX3VpbnQgajsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2RlbGV0ZV9ncGVfaGFuZGxlcnMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2RlbGV0ZV9ncGVfaGFuZGxlcnMiKTsKIAogCS8qIEV4YW1pbmUgZWFjaCBHUEUgUmVnaXN0ZXIgd2l0aGluIHRoZSBibG9jayAqLwogCkBAIC0yMjEsMjEgKzE5OCwyMyBAQAogCQkvKiBOb3cgbG9vayBhdCB0aGUgaW5kaXZpZHVhbCBHUEVzIGluIHRoaXMgYnl0ZSByZWdpc3RlciAqLwogCiAJCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7Ci0JCQlncGVfZXZlbnRfaW5mbyA9ICZncGVfYmxvY2stPmV2ZW50X2luZm9bKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXTsKKwkJCWdwZV9ldmVudF9pbmZvID0KKwkJCSAgICAmZ3BlX2Jsb2NrLT4KKwkJCSAgICBldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal07CiAKIAkJCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KLQkJCQkJQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgewotCQkJCUFDUElfTUVNX0ZSRUUgKGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyKTsKKwkJCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CisJCQkJQUNQSV9NRU1fRlJFRShncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcik7CiAJCQkJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIgPSBOVUxMOwotCQkJCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsKKwkJCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0KKwkJCQkgICAgfkFDUElfR1BFX0RJU1BBVENIX01BU0s7CiAJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbwpAQCAtMjU5LDMwICsyMzgsMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9zYXZlX21ldGhvZF9pbmZvICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmpfZGVzYywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV9ldl9zYXZlX21ldGhvZF9pbmZvKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgdTMyIGxldmVsLCB2b2lkICpvYmpfZGVzYywgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2sgPSAodm9pZCAqKSBvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lW0FDUElfTkFNRV9TSVpFICsgMV07Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2sgPSAodm9pZCAqKW9ial9kZXNjOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwl1MzIgZ3BlX251bWJlcjsKKwljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkUgKyAxXTsKKwl1OCB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X3NhdmVfbWV0aG9kX2luZm8iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3NhdmVfbWV0aG9kX2luZm8iKTsKIAogCS8qCiAJICogX0x4eCBhbmQgX0V4eCBHUEUgbWV0aG9kIHN1cHBvcnQKIAkgKgogCSAqIDEpIEV4dHJhY3QgdGhlIG5hbWUgZnJvbSB0aGUgb2JqZWN0IGFuZCBjb252ZXJ0IHRvIGEgc3RyaW5nCiAJICovCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChuYW1lLAotCQkJICAgJigoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZSktPm5hbWUuaW50ZWdlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKG5hbWUsCisJCQkgICAmKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGUpLT5uYW1lLgorCQkJICAgaW50ZWdlcik7CiAJbmFtZVtBQ1BJX05BTUVfU0laRV0gPSAwOwogCiAJLyoKQEAgLTMwNCwzNCArMjc5LDM2IEBACiAJZGVmYXVsdDoKIAkJLyogVW5rbm93biBtZXRob2QgdHlwZSwganVzdCBpZ25vcmUgaXQhICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVW5rbm93biBHUEUgbWV0aG9kIHR5cGU6ICVzIChuYW1lIG5vdCBvZiBmb3JtIF9MeHggb3IgX0V4eClcbiIsCi0JCQluYW1lKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVua25vd24gR1BFIG1ldGhvZCB0eXBlOiAlcyAobmFtZSBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpXG4iLAorCQkJCSAgbmFtZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIENvbnZlcnQgdGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG5hbWUgdG8gdGhlIEdQRSBOdW1iZXIgKi8KIAotCWdwZV9udW1iZXIgPSBBQ1BJX1NUUlRPVUwgKCZuYW1lWzJdLCBOVUxMLCAxNik7CisJZ3BlX251bWJlciA9IEFDUElfU1RSVE9VTCgmbmFtZVsyXSwgTlVMTCwgMTYpOwogCWlmIChncGVfbnVtYmVyID09IEFDUElfVUlOVDMyX01BWCkgewogCQkvKiBDb252ZXJzaW9uIGZhaWxlZDsgaW52YWxpZCBtZXRob2QsIGp1c3QgaWdub3JlIGl0ICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQ291bGQgbm90IGV4dHJhY3QgR1BFIG51bWJlciBmcm9tIG5hbWU6ICVzIChuYW1lIGlzIG5vdCBvZiBmb3JtIF9MeHggb3IgX0V4eClcbiIsCi0JCQluYW1lKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkNvdWxkIG5vdCBleHRyYWN0IEdQRSBudW1iZXIgZnJvbSBuYW1lOiAlcyAobmFtZSBpcyBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpXG4iLAorCQkJCSAgbmFtZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyIGZvciB0aGlzIEdQRSBibG9jayAqLwogCiAJaWYgKChncGVfbnVtYmVyIDwgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikgfHwKLQkJKGdwZV9udW1iZXIgPj0gKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKyAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkpIHsKKwkgICAgKGdwZV9udW1iZXIgPj0KKwkgICAgIChncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsKKwkgICAgICAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkpIHsKIAkJLyoKIAkJICogTm90IHZhbGlkIGZvciB0aGlzIEdQRSBibG9jaywganVzdCBpZ25vcmUgaXQKIAkJICogSG93ZXZlciwgaXQgbWF5IGJlIHZhbGlkIGZvciBhIGRpZmZlcmVudCBHUEUgYmxvY2ssIHNpbmNlIEdQRTAgYW5kIEdQRTEKIAkJICogbWV0aG9kcyBib3RoIGFwcGVhciB1bmRlciBcX0dQRS4KIAkJICovCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCkBAIC0zMzksMjQgKzMxNiwyNSBAQAogCSAqIGZvciB1c2UgZHVyaW5nIGRpc3BhdGNoIG9mIHRoaXMgR1BFLiAgRGVmYXVsdCB0eXBlIGlzIFJVTlRJTUUsIGFsdGhvdWdoCiAJICogdGhpcyBtYXkgY2hhbmdlIHdoZW4gdGhlIF9QUlcgbWV0aG9kcyBhcmUgZXhlY3V0ZWQgbGF0ZXIuCiAJICovCi0JZ3BlX2V2ZW50X2luZm8gPSAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXTsKKwlncGVfZXZlbnRfaW5mbyA9CisJICAgICZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXJdOwogCiAJZ3BlX2V2ZW50X2luZm8tPmZsYWdzID0gKHU4KSAodHlwZSB8IEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCB8Ci0JCQkgICBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOworCQkJCSAgICAgIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CiAKLQlncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2gubWV0aG9kX25vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZTsKKwlncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2gubWV0aG9kX25vZGUgPQorCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlOwogCiAJLyogVXBkYXRlIGVuYWJsZSBtYXNrLCBidXQgZG9uJ3QgZW5hYmxlIHRoZSBIVyBHUEUgYXMgb2YgeWV0ICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2VuYWJsZV9ncGUgKGdwZV9ldmVudF9pbmZvLCBGQUxTRSk7CisJc3RhdHVzID0gYWNwaV9ldl9lbmFibGVfZ3BlKGdwZV9ldmVudF9pbmZvLCBGQUxTRSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELAotCQkiUmVnaXN0ZXJlZCBHUEUgbWV0aG9kICVzIGFzIEdQRSBudW1iZXIgMHglLjJYXG4iLAotCQluYW1lLCBncGVfbnVtYmVyKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCSAgIlJlZ2lzdGVyZWQgR1BFIG1ldGhvZCAlcyBhcyBHUEUgbnVtYmVyIDB4JS4yWFxuIiwKKwkJCSAgbmFtZSwgZ3BlX251bWJlcikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUKQEAgLTM3MywzNCArMzUxLDI5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm8sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSAgdTMyIGxldmVsLCB2b2lkICppbmZvLCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8gICAgICAgKmdwZV9pbmZvID0gKHZvaWQgKikgaW5mbzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpncGVfZGV2aWNlOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jazsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICp0YXJnZXRfZ3BlX2RldmljZTsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwa2dfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX3dhbGtfaW5mbyAqZ3BlX2luZm8gPSAodm9pZCAqKWluZm87CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2U7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGFyZ2V0X2dwZV9kZXZpY2U7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBrZ19kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXUzMiBncGVfbnVtYmVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X21hdGNoX3Byd19hbmRfZ3BlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9tYXRjaF9wcndfYW5kX2dwZSIpOwogCiAJLyogQ2hlY2sgZm9yIGEgX1BSVyBtZXRob2QgdW5kZXIgdGhpcyBkZXZpY2UgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChvYmpfaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJXLAotCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJnBrZ19kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qob2JqX2hhbmRsZSwgTUVUSE9EX05BTUVfX1BSVywKKwkJCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJnBrZ19kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJLyogSWdub3JlIGFsbCBlcnJvcnMgZnJvbSBfUFJXLCB3ZSBkb24ndCB3YW50IHRvIGFib3J0IHRoZSBzdWJzeXN0ZW0gKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBUaGUgcmV0dXJuZWQgX1BSVyBwYWNrYWdlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMgKi8KQEAgLTQyMCw3ICszOTMsNyBAQAogCSAqLwogCW9ial9kZXNjID0gcGtnX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMF07CiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJLyogVXNlIEZBRFQtZGVmaW5lZCBHUEUgZGV2aWNlIChmcm9tIGRlZmluaXRpb24gb2YgX1BSVykgKi8KIAogCQl0YXJnZXRfZ3BlX2RldmljZSA9IGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZTsKQEAgLTQyOCwyMiArNDAxLDIzIEBACiAJCS8qIEludGVnZXIgaXMgdGhlIEdQRSBudW1iZXIgaW4gdGhlIEZBRFQgZGVzY3JpYmVkIEdQRSBibG9ja3MgKi8KIAogCQlncGVfbnVtYmVyID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JfQotCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwl9IGVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewogCQkvKiBQYWNrYWdlIGNvbnRhaW5zIGEgR1BFIHJlZmVyZW5jZSBhbmQgR1BFIG51bWJlciB3aXRoaW4gYSBHUEUgYmxvY2sgKi8KIAogCQlpZiAoKG9ial9kZXNjLT5wYWNrYWdlLmNvdW50IDwgMikgfHwKLQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMF0pICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHx8Ci0JCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzFdKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXSkgIT0KKwkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzFdKSAhPQorCQkJQUNQSV9UWVBFX0lOVEVHRVIpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAogCQkvKiBHZXQgR1BFIGJsb2NrIHJlZmVyZW5jZSBhbmQgZGVjb2RlICovCiAKLQkJdGFyZ2V0X2dwZV9kZXZpY2UgPSBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXS0+cmVmZXJlbmNlLm5vZGU7CisJCXRhcmdldF9ncGVfZGV2aWNlID0KKwkJICAgIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzBdLT5yZWZlcmVuY2Uubm9kZTsKIAkJZ3BlX251bWJlciA9ICh1MzIpIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzFdLT5pbnRlZ2VyLnZhbHVlOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBVbmtub3duIHR5cGUsIGp1c3QgaWdub3JlIGl0ICovCiAKIAkJZ290byBjbGVhbnVwOwpAQCAtNDU4LDMxICs0MzIsMzcgQEAKIAkgKiAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIEdQRSBkZXZpY2UuCiAJICovCiAJaWYgKChncGVfZGV2aWNlID09IHRhcmdldF9ncGVfZGV2aWNlKSAmJgotCQkoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSAmJgotCQkoZ3BlX251bWJlciA8IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKyAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgewotCQlncGVfZXZlbnRfaW5mbyA9ICZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXJdOworCSAgICAoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSAmJgorCSAgICAoZ3BlX251bWJlciA8CisJICAgICBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKKwkJZ3BlX2V2ZW50X2luZm8gPQorCQkgICAgJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0KKwkJCQkJICAgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl07CiAKIAkJLyogTWFyayBHUEUgZm9yIFdBS0UtT05MWSBidXQgV0FLRV9ESVNBQkxFRCAqLwogCi0JCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+KEFDUElfR1BFX1dBS0VfRU5BQkxFRCB8IEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKLQkJc3RhdHVzID0gYWNwaV9ldl9zZXRfZ3BlX3R5cGUgKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9UWVBFX1dBS0UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPQorCQkgICAgfihBQ1BJX0dQRV9XQUtFX0VOQUJMRUQgfCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2X3NldF9ncGVfdHlwZShncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfVFlQRV9XQUtFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJc3RhdHVzID0gYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyAoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0RJU0FCTEUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhncGVfZXZlbnRfaW5mbywKKwkJCQkJCSAgICBBQ1BJX0dQRV9ESVNBQkxFKTsKIAl9CiAKLWNsZWFudXA6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChwa2dfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisgICAgICBjbGVhbnVwOgorCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwa2dfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dldF9ncGVfeHJ1cHRfYmxvY2sKICAqCi0gKiBQQVJBTUVURVJTOiAgaW50ZXJydXB0X2xldmVsICAgICAtIEludGVycnVwdCBmb3IgYSBHUEUgYmxvY2sKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcnJ1cHRfbnVtYmVyICAgICAtIEludGVycnVwdCBmb3IgYSBHUEUgYmxvY2sKICAqCiAgKiBSRVRVUk46ICAgICAgQSBHUEUgaW50ZXJydXB0IGJsb2NrCiAgKgpAQCAtNDkzLDI0ICs0NzMsMjIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKgotYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCkKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKHUzMgorCQkJCQkJCSAgICAgICBpbnRlcnJ1cHRfbnVtYmVyKQogewotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKm5leHRfZ3BlX3hydXB0OwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dF9ncGVfeHJ1cHQ7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGZsYWdzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZ2V0X2dwZV94cnVwdF9ibG9jayIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZ2V0X2dwZV94cnVwdF9ibG9jayIpOwogCiAJLyogTm8gbmVlZCBmb3IgbG9jayBzaW5jZSB3ZSBhcmUgbm90IGNoYW5naW5nIGFueSBsaXN0IGVsZW1lbnRzIGhlcmUgKi8KIAogCW5leHRfZ3BlX3hydXB0ID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKIAl3aGlsZSAobmV4dF9ncGVfeHJ1cHQpIHsKLQkJaWYgKG5leHRfZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbGV2ZWwgPT0gaW50ZXJydXB0X2xldmVsKSB7Ci0JCQlyZXR1cm5fUFRSIChuZXh0X2dwZV94cnVwdCk7CisJCWlmIChuZXh0X2dwZV94cnVwdC0+aW50ZXJydXB0X251bWJlciA9PSBpbnRlcnJ1cHRfbnVtYmVyKSB7CisJCQlyZXR1cm5fUFRSKG5leHRfZ3BlX3hydXB0KTsKIAkJfQogCiAJCW5leHRfZ3BlX3hydXB0ID0gbmV4dF9ncGVfeHJ1cHQtPm5leHQ7CkBAIC01MTgsMTYgKzQ5NiwxNiBAQAogCiAJLyogTm90IGZvdW5kLCBtdXN0IGFsbG9jYXRlIGEgbmV3IHhydXB0IGRlc2NyaXB0b3IgKi8KIAotCWdwZV94cnVwdCA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbykpOworCWdwZV94cnVwdCA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8pKTsKIAlpZiAoIWdwZV94cnVwdCkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKLQlncGVfeHJ1cHQtPmludGVycnVwdF9sZXZlbCA9IGludGVycnVwdF9sZXZlbDsKKwlncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPSBpbnRlcnJ1cHRfbnVtYmVyOwogCiAJLyogSW5zdGFsbCBuZXcgaW50ZXJydXB0IGRlc2NyaXB0b3Igd2l0aCBzcGluIGxvY2sgKi8KIAotCWFjcGlfb3NfYWNxdWlyZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKIAlpZiAoYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCkgewogCQluZXh0X2dwZV94cnVwdCA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CiAJCXdoaWxlIChuZXh0X2dwZV94cnVwdC0+bmV4dCkgewpAQCAtNTM2LDI5ICs1MTQsMjggQEAKIAogCQluZXh0X2dwZV94cnVwdC0+bmV4dCA9IGdwZV94cnVwdDsKIAkJZ3BlX3hydXB0LT5wcmV2aW91cyA9IG5leHRfZ3BlX3hydXB0OwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkID0gZ3BlX3hydXB0OwogCX0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKIAogCS8qIEluc3RhbGwgbmV3IGludGVycnVwdCBoYW5kbGVyIGlmIG5vdCBTQ0lfSU5UICovCiAKLQlpZiAoaW50ZXJydXB0X2xldmVsICE9IGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQpIHsKLQkJc3RhdHVzID0gYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyIChpbnRlcnJ1cHRfbGV2ZWwsCi0JCQkJIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIsIGdwZV94cnVwdCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgaW5zdGFsbCBHUEUgaW50ZXJydXB0IGhhbmRsZXIgYXQgbGV2ZWwgMHglWFxuIiwKLQkJCQlpbnRlcnJ1cHRfbGV2ZWwpKTsKLQkJCXJldHVybl9QVFIgKE5VTEwpOworCWlmIChpbnRlcnJ1cHRfbnVtYmVyICE9IGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQpIHsKKwkJc3RhdHVzID0gYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKGludGVycnVwdF9udW1iZXIsCisJCQkJCQkJICAgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlciwKKwkJCQkJCQkgICBncGVfeHJ1cHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkNvdWxkIG5vdCBpbnN0YWxsIEdQRSBpbnRlcnJ1cHQgaGFuZGxlciBhdCBsZXZlbCAweCVYXG4iLAorCQkJCQkgIGludGVycnVwdF9udW1iZXIpKTsKKwkJCXJldHVybl9QVFIoTlVMTCk7CiAJCX0KIAl9CiAKLQlyZXR1cm5fUFRSIChncGVfeHJ1cHQpOworCXJldHVybl9QVFIoZ3BlX3hydXB0KTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQKQEAgLTU3MywzMyArNTUwLDMxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdCAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0KQorYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0KHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBmbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2RlbGV0ZV9ncGVfeHJ1cHQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2RlbGV0ZV9ncGVfeHJ1cHQiKTsKIAogCS8qIFdlIG5ldmVyIHdhbnQgdG8gcmVtb3ZlIHRoZSBTQ0kgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAotCWlmIChncGVfeHJ1cHQtPmludGVycnVwdF9sZXZlbCA9PSBhY3BpX2dibF9GQURULT5zY2lfaW50KSB7CisJaWYgKGdwZV94cnVwdC0+aW50ZXJydXB0X251bWJlciA9PSBhY3BpX2dibF9GQURULT5zY2lfaW50KSB7CiAJCWdwZV94cnVwdC0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9IE5VTEw7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgKi8KIAotCXN0YXR1cyA9IGFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyIChncGVfeHJ1cHQtPmludGVycnVwdF9sZXZlbCwKLQkJCSAgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyKGdwZV94cnVwdC0+aW50ZXJydXB0X251bWJlciwKKwkJCQkJCSAgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFVubGluayB0aGUgaW50ZXJydXB0IGJsb2NrIHdpdGggbG9jayAqLwogCi0JYWNwaV9vc19hY3F1aXJlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCWlmIChncGVfeHJ1cHQtPnByZXZpb3VzKSB7CiAJCWdwZV94cnVwdC0+cHJldmlvdXMtPm5leHQgPSBncGVfeHJ1cHQtPm5leHQ7CiAJfQpAQCAtNjA3LDIxICs1ODIsMjAgQEAKIAlpZiAoZ3BlX3hydXB0LT5uZXh0KSB7CiAJCWdwZV94cnVwdC0+bmV4dC0+cHJldmlvdXMgPSBncGVfeHJ1cHQtPnByZXZpb3VzOwogCX0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKIAogCS8qIEZyZWUgdGhlIGJsb2NrICovCiAKLQlBQ1BJX01FTV9GUkVFIChncGVfeHJ1cHQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfTUVNX0ZSRUUoZ3BlX3hydXB0KTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2sKICAqCiAgKiBQQVJBTUVURVJTOiAgZ3BlX2Jsb2NrICAgICAgIC0gTmV3IEdQRSBibG9jawotICogICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCAtIExldmVsIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdQRSBibG9jaworICogICAgICAgICAgICAgIGludGVycnVwdF9udW1iZXIgLSBYcnVwdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBHUEUgYmxvY2sKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNjMwLDI0ICs2MDQsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X2xldmVsKQorYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLAorCQkJICB1MzIgaW50ZXJydXB0X251bWJlcikKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpuZXh0X2dwZV9ibG9jazsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfYmxvY2s7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHRfZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfYmxvY2s7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBmbGFnczsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luc3RhbGxfZ3BlX2Jsb2NrIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW5zdGFsbF9ncGVfYmxvY2siKTsKLQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlncGVfeHJ1cHRfYmxvY2sgPSBhY3BpX2V2X2dldF9ncGVfeHJ1cHRfYmxvY2sgKGludGVycnVwdF9sZXZlbCk7CisJZ3BlX3hydXB0X2Jsb2NrID0gYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKGludGVycnVwdF9udW1iZXIpOwogCWlmICghZ3BlX3hydXB0X2Jsb2NrKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC02NTUsNyArNjI3LDcgQEAKIAogCS8qIEluc3RhbGwgdGhlIG5ldyBibG9jayBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHdpdGggbG9jayAqLwogCi0JYWNwaV9vc19hY3F1aXJlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCWlmIChncGVfeHJ1cHRfYmxvY2stPmdwZV9ibG9ja19saXN0X2hlYWQpIHsKIAkJbmV4dF9ncGVfYmxvY2sgPSBncGVfeHJ1cHRfYmxvY2stPmdwZV9ibG9ja19saXN0X2hlYWQ7CiAJCXdoaWxlIChuZXh0X2dwZV9ibG9jay0+bmV4dCkgewpAQCAtNjY0LDIwICs2MzYsMTggQEAKIAogCQluZXh0X2dwZV9ibG9jay0+bmV4dCA9IGdwZV9ibG9jazsKIAkJZ3BlX2Jsb2NrLT5wcmV2aW91cyA9IG5leHRfZ3BlX2Jsb2NrOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQlncGVfeHJ1cHRfYmxvY2stPmdwZV9ibG9ja19saXN0X2hlYWQgPSBncGVfYmxvY2s7CiAJfQogCiAJZ3BlX2Jsb2NrLT54cnVwdF9ibG9jayA9IGdwZV94cnVwdF9ibG9jazsKLQlhY3BpX29zX3JlbGVhc2VfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKIAotdW5sb2NrX2FuZF9leGl0OgotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrCkBAIC02OTAsNjIgKzY2MCw1NyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sgKAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaykKK2FjcGlfc3RhdHVzIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZmxhZ3M7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX2dwZV9ibG9jayIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luc3RhbGxfZ3BlX2Jsb2NrIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRGlzYWJsZSBhbGwgR1BFcyBpbiB0aGlzIGJsb2NrICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrIChncGVfYmxvY2stPnhydXB0X2Jsb2NrLCBncGVfYmxvY2spOworCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2soZ3BlX2Jsb2NrLT54cnVwdF9ibG9jaywgZ3BlX2Jsb2NrKTsKIAogCWlmICghZ3BlX2Jsb2NrLT5wcmV2aW91cyAmJiAhZ3BlX2Jsb2NrLT5uZXh0KSB7CiAJCS8qIFRoaXMgaXMgdGhlIGxhc3QgZ3BlX2Jsb2NrIG9uIHRoaXMgaW50ZXJydXB0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0IChncGVfYmxvY2stPnhydXB0X2Jsb2NrKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQoZ3BlX2Jsb2NrLT54cnVwdF9ibG9jayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogUmVtb3ZlIHRoZSBibG9jayBvbiB0aGlzIGludGVycnVwdCB3aXRoIGxvY2sgKi8KIAotCQlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCQlpZiAoZ3BlX2Jsb2NrLT5wcmV2aW91cykgewogCQkJZ3BlX2Jsb2NrLT5wcmV2aW91cy0+bmV4dCA9IGdwZV9ibG9jay0+bmV4dDsKLQkJfQotCQllbHNlIHsKLQkJCWdwZV9ibG9jay0+eHJ1cHRfYmxvY2stPmdwZV9ibG9ja19saXN0X2hlYWQgPSBncGVfYmxvY2stPm5leHQ7CisJCX0gZWxzZSB7CisJCQlncGVfYmxvY2stPnhydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkID0KKwkJCSAgICBncGVfYmxvY2stPm5leHQ7CiAJCX0KIAogCQlpZiAoZ3BlX2Jsb2NrLT5uZXh0KSB7CiAJCQlncGVfYmxvY2stPm5leHQtPnByZXZpb3VzID0gZ3BlX2Jsb2NrLT5wcmV2aW91czsKIAkJfQotCQlhY3BpX29zX3JlbGVhc2VfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CiAJfQogCiAJLyogRnJlZSB0aGUgZ3BlX2Jsb2NrICovCiAKLQlBQ1BJX01FTV9GUkVFIChncGVfYmxvY2stPnJlZ2lzdGVyX2luZm8pOwotCUFDUElfTUVNX0ZSRUUgKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7Ci0JQUNQSV9NRU1fRlJFRSAoZ3BlX2Jsb2NrKTsKKwlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7CisJQUNQSV9NRU1fRlJFRShncGVfYmxvY2stPmV2ZW50X2luZm8pOworCUFDUElfTUVNX0ZSRUUoZ3BlX2Jsb2NrKTsKIAotdW5sb2NrX2FuZF9leGl0OgotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzCkBAIC03NTksNDMgKzcyNCw0MSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MgKAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaykKK2FjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQogewotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICAgKmdwZV9yZWdpc3Rlcl9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqdGhpc19ldmVudDsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICp0aGlzX3JlZ2lzdGVyOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGo7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8gPSBOVUxMOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICp0aGlzX2V2ZW50OworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICp0aGlzX3JlZ2lzdGVyOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX25hdGl2ZV91aW50IGo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyIpOwogCiAJLyogQWxsb2NhdGUgdGhlIEdQRSByZWdpc3RlciBpbmZvcm1hdGlvbiBibG9jayAqLwogCi0JZ3BlX3JlZ2lzdGVyX2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJICAoYWNwaV9zaXplKSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKLQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbykpOworCWdwZV9yZWdpc3Rlcl9pbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFKChhY3BpX3NpemUpIGdwZV9ibG9jay0+CisJCQkJCSAgICAgICByZWdpc3Rlcl9jb3VudCAqCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgICBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvKSk7CiAJaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIGdwZV9yZWdpc3Rlcl9pbmZvIHRhYmxlXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIGdwZV9yZWdpc3Rlcl9pbmZvIHRhYmxlXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qCiAJICogQWxsb2NhdGUgdGhlIEdQRSBldmVudF9pbmZvIGJsb2NrLiBUaGVyZSBhcmUgZWlnaHQgZGlzdGluY3QgR1BFcwogCSAqIHBlciByZWdpc3Rlci4gIEluaXRpYWxpemF0aW9uIHRvIHplcm9zIGlzIHN1ZmZpY2llbnQuCiAJICovCi0JZ3BlX2V2ZW50X2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUgKAotCQkJICAgKChhY3BpX3NpemUpIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKgotCQkJICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKLQkJCSAgIHNpemVvZiAoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKKwlncGVfZXZlbnRfaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkgZ3BlX2Jsb2NrLT4KKwkJCQkJICAgICByZWdpc3Rlcl9jb3VudCAqCisJCQkJCSAgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbykpOwogCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfZXZlbnRfaW5mbyB0YWJsZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX2V2ZW50X2luZm8gdGFibGVcbiIpKTsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQpAQCAtODAzLDcgKzc2Niw3IEBACiAJLyogU2F2ZSB0aGUgbmV3IEluZm8gYXJyYXlzIGluIHRoZSBHUEUgYmxvY2sgKi8KIAogCWdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyA9IGdwZV9yZWdpc3Rlcl9pbmZvOwotCWdwZV9ibG9jay0+ZXZlbnRfaW5mbyAgPSBncGVfZXZlbnRfaW5mbzsKKwlncGVfYmxvY2stPmV2ZW50X2luZm8gPSBncGVfZXZlbnRfaW5mbzsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgR1BFIFJlZ2lzdGVyIGFuZCBFdmVudCBzdHJ1Y3R1cmVzLiAgQSBnb2FsIG9mIHRoZXNlCkBAIC04MTIsMjkgKzc3NSwzNCBAQAogCSAqIGFuZCB0aGUgZW5hYmxlIHJlZ2lzdGVycyBvY2N1cHkgdGhlIHNlY29uZCBoYWxmLgogCSAqLwogCXRoaXNfcmVnaXN0ZXIgPSBncGVfcmVnaXN0ZXJfaW5mbzsKLQl0aGlzX2V2ZW50ICAgPSBncGVfZXZlbnRfaW5mbzsKKwl0aGlzX2V2ZW50ID0gZ3BlX2V2ZW50X2luZm87CiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7CiAJCS8qIEluaXQgdGhlIHJlZ2lzdGVyX2luZm8gZm9yIHRoaXMgR1BFIHJlZ2lzdGVyICg4IEdQRXMpICovCiAKLQkJdGhpc19yZWdpc3Rlci0+YmFzZV9ncGVfbnVtYmVyID0gKHU4KSAoZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCi0JCQkJICAgKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkpOworCQl0aGlzX3JlZ2lzdGVyLT5iYXNlX2dwZV9udW1iZXIgPQorCQkgICAgKHU4KSAoZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCisJCQkgIChpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpKTsKIAotCQlBQ1BJX1NUT1JFX0FERFJFU1MgKHRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3MsCi0JCQkJIChncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzcwotCQkJCSArIGkpKTsKKwkJQUNQSV9TVE9SRV9BRERSRVNTKHRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3MsCisJCQkJICAgKGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzICsgaSkpOwogCi0JCUFDUElfU1RPUkVfQUREUkVTUyAodGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MuYWRkcmVzcywKLQkJCQkgKGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzCi0JCQkJICsgaQotCQkJCSArIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQpKTsKKwkJQUNQSV9TVE9SRV9BRERSRVNTKHRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3MsCisJCQkJICAgKGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzCisJCQkJICAgICsgaSArIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQpKTsKIAotCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5hZGRyZXNzX3NwYWNlX2lkID0gZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQ7Ci0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQgPSBncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzc19zcGFjZV9pZDsKLQkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MucmVnaXN0ZXJfYml0X3dpZHRoID0gQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7Ci0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLnJlZ2lzdGVyX2JpdF93aWR0aCA9IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwotCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0gQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7Ci0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLnJlZ2lzdGVyX2JpdF9vZmZzZXQgPSBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKKwkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MuYWRkcmVzc19zcGFjZV9pZCA9CisJCSAgICBncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzc19zcGFjZV9pZDsKKwkJdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MuYWRkcmVzc19zcGFjZV9pZCA9CisJCSAgICBncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MuYWRkcmVzc19zcGFjZV9pZDsKKwkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MucmVnaXN0ZXJfYml0X3dpZHRoID0KKwkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOworCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5yZWdpc3Rlcl9iaXRfd2lkdGggPQorCQkgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7CisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLnJlZ2lzdGVyX2JpdF9vZmZzZXQgPQorCQkgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7CisJCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLnJlZ2lzdGVyX2JpdF9vZmZzZXQgPQorCQkgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7CiAKIAkJLyogSW5pdCB0aGUgZXZlbnRfaW5mbyBmb3IgZWFjaCBHUEUgd2l0aGluIHRoaXMgcmVnaXN0ZXIgKi8KIApAQCAtODQ5LDM2ICs4MTcsMzYgQEAKIAkJICogYXJlIGNsZWFyZWQgYnkgd3JpdGluZyBhICcxJywgd2hpbGUgZW5hYmxlIHJlZ2lzdGVycyBhcmUgY2xlYXJlZAogCQkgKiBieSB3cml0aW5nIGEgJzAnLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILCAweDAwLAotCQkJCSAmdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILCAweDAwLAorCQkJCQkJICZ0aGlzX3JlZ2lzdGVyLT4KKwkJCQkJCSBlbmFibGVfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILCAweEZGLAotCQkJCSAmdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILCAweEZGLAorCQkJCQkJICZ0aGlzX3JlZ2lzdGVyLT4KKwkJCQkJCSBzdGF0dXNfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKIAkJdGhpc19yZWdpc3RlcisrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAKLQotZXJyb3JfZXhpdDoKKyAgICAgIGVycm9yX2V4aXQ6CiAJaWYgKGdwZV9yZWdpc3Rlcl9pbmZvKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGdwZV9yZWdpc3Rlcl9pbmZvKTsKKwkJQUNQSV9NRU1fRlJFRShncGVfcmVnaXN0ZXJfaW5mbyk7CiAJfQogCWlmIChncGVfZXZlbnRfaW5mbykgewotCQlBQ1BJX01FTV9GUkVFIChncGVfZXZlbnRfaW5mbyk7CisJCUFDUElfTUVNX0ZSRUUoZ3BlX2V2ZW50X2luZm8pOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sKQEAgLTg4Nyw3ICs4NTUsNyBAQAogICogICAgICAgICAgICAgIGdwZV9ibG9ja19hZGRyZXNzICAgLSBBZGRyZXNzIGFuZCBzcGFjZV9pRAogICogICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50ICAgICAgLSBOdW1iZXIgb2YgR1BFIHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBibG9jawogICogICAgICAgICAgICAgIGdwZV9ibG9ja19iYXNlX251bWJlciAtIFN0YXJ0aW5nIEdQRSBudW1iZXIgZm9yIHRoZSBibG9jawotICogICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCAgICAgLSBIL1cgaW50ZXJydXB0IGZvciB0aGUgYmxvY2sKKyAqICAgICAgICAgICAgICBpbnRlcnJ1cHRfbnVtYmVyICAgIC0gSC9XIGludGVycnVwdCBmb3IgdGhlIGJsb2NrCiAgKiAgICAgICAgICAgICAgcmV0dXJuX2dwZV9ibG9jayAgICAtIFdoZXJlIHRoZSBuZXcgYmxvY2sgZGVzY3JpcHRvciBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTg5Nyw2OCArODY1LDY2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpncGVfZGV2aWNlLAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKmdwZV9ibG9ja19hZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfYmxvY2tfYmFzZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwsCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqKnJldHVybl9ncGVfYmxvY2spCithY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2UsCisJCQkgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpncGVfYmxvY2tfYWRkcmVzcywKKwkJCSB1MzIgcmVnaXN0ZXJfY291bnQsCisJCQkgdTggZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyLAorCQkJIHUzMiBpbnRlcnJ1cHRfbnVtYmVyLAorCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICoqcmV0dXJuX2dwZV9ibG9jaykKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgajsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2VfZ3BlX2NvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX2VuYWJsZWRfY291bnQ7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfZ3BlX3dhbGtfaW5mbyAgICAgICBncGVfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9uYXRpdmVfdWludCBqOworCXUzMiB3YWtlX2dwZV9jb3VudDsKKwl1MzIgZ3BlX2VuYWJsZWRfY291bnQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8gZ3BlX2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9jcmVhdGVfZ3BlX2Jsb2NrIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9jcmVhdGVfZ3BlX2Jsb2NrIik7CiAKIAlpZiAoIXJlZ2lzdGVyX2NvdW50KSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEFsbG9jYXRlIGEgbmV3IEdQRSBibG9jayAqLwogCi0JZ3BlX2Jsb2NrID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvKSk7CisJZ3BlX2Jsb2NrID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbykpOwogCWlmICghZ3BlX2Jsb2NrKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgbmV3IEdQRSBibG9jayAqLwogCiAJZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCA9IHJlZ2lzdGVyX2NvdW50OwogCWdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgPSBncGVfYmxvY2tfYmFzZV9udW1iZXI7Ci0JZ3BlX2Jsb2NrLT5ub2RlICAgICAgICAgICA9IGdwZV9kZXZpY2U7CisJZ3BlX2Jsb2NrLT5ub2RlID0gZ3BlX2RldmljZTsKIAotCUFDUElfTUVNQ1BZICgmZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLCBncGVfYmxvY2tfYWRkcmVzcywKLQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpKTsKKwlBQ1BJX01FTUNQWSgmZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLCBncGVfYmxvY2tfYWRkcmVzcywKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpKTsKIAogCS8qIENyZWF0ZSB0aGUgcmVnaXN0ZXJfaW5mbyBhbmQgZXZlbnRfaW5mbyBzdWItc3RydWN0dXJlcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzIChncGVfYmxvY2spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9NRU1fRlJFRSAoZ3BlX2Jsb2NrKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyhncGVfYmxvY2spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluc3RhbGwgdGhlIG5ldyBibG9jayBpbiB0aGUgZ2xvYmFsIGxpc3QocykgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2sgKGdwZV9ibG9jaywgaW50ZXJydXB0X2xldmVsKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGdwZV9ibG9jayk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrKGdwZV9ibG9jaywgaW50ZXJydXB0X251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfTUVNX0ZSRUUoZ3BlX2Jsb2NrKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRmluZCBhbGwgR1BFIG1ldGhvZHMgKF9MeHgsIF9FeHgpIGZvciB0aGlzIGJsb2NrICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIChBQ1BJX1RZUEVfTUVUSE9ELCBncGVfZGV2aWNlLAotCQkJICBBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssIGFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbywKLQkJCSAgZ3BlX2Jsb2NrLCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIGdwZV9kZXZpY2UsCisJCQkJCUFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX05PX1VOTE9DSywKKwkJCQkJYWNwaV9ldl9zYXZlX21ldGhvZF9pbmZvLCBncGVfYmxvY2ssCisJCQkJCU5VTEwpOwogCiAJLyoKIAkgKiBSdW50aW1lIG9wdGlvbjogU2hvdWxkIFdha2UgR1BFcyBiZSBlbmFibGVkIGF0IHJ1bnRpbWU/ICBUaGUgZGVmYXVsdApAQCAtOTc0LDkgKzk0MCwxMSBAQAogCQlncGVfaW5mby5ncGVfYmxvY2sgPSBncGVfYmxvY2s7CiAJCWdwZV9pbmZvLmdwZV9kZXZpY2UgPSBncGVfZGV2aWNlOwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJICBBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19VTkxPQ0ssIGFjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUsCi0JCQkJICAmZ3BlX2luZm8sIE5VTEwpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCQkgICBBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19VTkxPQ0ssCisJCQkJCSAgIGFjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUsICZncGVfaW5mbywKKwkJCQkJICAgTlVMTCk7CiAJfQogCiAJLyoKQEAgLTk5MSwxMCArOTU5LDE0IEBACiAJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKIAkJCS8qIEdldCB0aGUgaW5mbyBibG9jayBmb3IgdGhpcyBwYXJ0aWN1bGFyIEdQRSAqLwogCi0JCQlncGVfZXZlbnRfaW5mbyA9ICZncGVfYmxvY2stPmV2ZW50X2luZm9bKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXTsKKwkJCWdwZV9ldmVudF9pbmZvID0KKwkJCSAgICAmZ3BlX2Jsb2NrLT4KKwkJCSAgICBldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal07CiAKLQkJCWlmICgoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09IEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkgJiYKLQkJCQkgKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfUlVOVElNRSkpIHsKKwkJCWlmICgoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJCQkgICAgIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkKKwkJCSAgICAmJiAoZ3BlX2V2ZW50X2luZm8tPgorCQkJCWZsYWdzICYgQUNQSV9HUEVfVFlQRV9SVU5USU1FKSkgewogCQkJCWdwZV9lbmFibGVkX2NvdW50Kys7CiAJCQl9CiAKQEAgLTEwMDYsMjIgKzk3OCwyMiBAQAogCiAJLyogRHVtcCBpbmZvIGFib3V0IHRoaXMgR1BFIGJsb2NrICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAotCQkiR1BFICUwMlggdG8gJTAyWCBbJTQuNHNdICV1IHJlZ3Mgb24gaW50IDB4JVhcbiIsCi0JCSh1MzIpIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIsCi0JCSh1MzIpIChncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsKLQkJCQkoKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLTEpKSwKLQkJZ3BlX2RldmljZS0+bmFtZS5hc2NpaSwKLQkJZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCwKLQkJaW50ZXJydXB0X2xldmVsKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJICAiR1BFICUwMlggdG8gJTAyWCBbJTQuNHNdICV1IHJlZ3Mgb24gaW50IDB4JVhcbiIsCisJCQkgICh1MzIpIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIsCisJCQkgICh1MzIpIChncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsKKwkJCQkgKChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKKwkJCQkgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKSksCisJCQkgIGdwZV9kZXZpY2UtPm5hbWUuYXNjaWksIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQsCisJCQkgIGludGVycnVwdF9udW1iZXIpKTsKIAogCS8qIEVuYWJsZSBhbGwgdmFsaWQgR1BFcyBmb3VuZCBhYm92ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2sgKE5VTEwsIGdwZV9ibG9jayk7CisJc3RhdHVzID0gYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2soTlVMTCwgZ3BlX2Jsb2NrKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCi0JCQkiRm91bmQgJXUgV2FrZSwgRW5hYmxlZCAldSBSdW50aW1lIEdQRXMgaW4gdGhpcyBibG9ja1xuIiwKLQkJCXdha2VfZ3BlX2NvdW50LCBncGVfZW5hYmxlZF9jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwKKwkJCSAgIkZvdW5kICV1IFdha2UsIEVuYWJsZWQgJXUgUnVudGltZSBHUEVzIGluIHRoaXMgYmxvY2tcbiIsCisJCQkgIHdha2VfZ3BlX2NvdW50LCBncGVfZW5hYmxlZF9jb3VudCkpOwogCiAJLyogUmV0dXJuIHRoZSBuZXcgYmxvY2sgKi8KIApAQCAtMTAyOSwxMCArMTAwMSw5IEBACiAJCSgqcmV0dXJuX2dwZV9ibG9jaykgPSBncGVfYmxvY2s7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dwZV9pbml0aWFsaXplCkBAIC0xMDQ1LDIyICsxMDE2LDE4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZ3BlX2luaXRpYWxpemUgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V2X2dwZV9pbml0aWFsaXplKHZvaWQpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9jb3VudDAgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQxID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXJfbWF4ID0gMDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgcmVnaXN0ZXJfY291bnQwID0gMDsKKwl1MzIgcmVnaXN0ZXJfY291bnQxID0gMDsKKwl1MzIgZ3BlX251bWJlcl9tYXggPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2dwZV9pbml0aWFsaXplIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZ3BlX2luaXRpYWxpemUiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTA4OCwyOSArMTA1NSwyOSBAQAogCSAqIElmIEVJVEhFUiB0aGUgcmVnaXN0ZXIgbGVuZ3RoIE9SIHRoZSBibG9jayBhZGRyZXNzIGFyZSB6ZXJvLCB0aGVuIHRoYXQKIAkgKiBwYXJ0aWN1bGFyIGJsb2NrIGlzIG5vdCBzdXBwb3J0ZWQuCiAJICovCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmJgotCQlhY3BpX2dibF9GQURULT54Z3BlMF9ibGsuYWRkcmVzcykgeworCWlmIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiYgYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLmFkZHJlc3MpIHsKIAkJLyogR1BFIGJsb2NrIDAgZXhpc3RzIChoYXMgYm90aCBsZW5ndGggYW5kIGFkZHJlc3MgPiAwKSAqLwogCiAJCXJlZ2lzdGVyX2NvdW50MCA9ICh1MTYpIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gLyAyKTsKIAotCQlncGVfbnVtYmVyX21heCA9IChyZWdpc3Rlcl9jb3VudDAgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxOworCQlncGVfbnVtYmVyX21heCA9CisJCSAgICAocmVnaXN0ZXJfY291bnQwICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMTsKIAogCQkvKiBJbnN0YWxsIEdQRSBCbG9jayAwICovCiAKLQkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrIChhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCi0JCQkJICZhY3BpX2dibF9GQURULT54Z3BlMF9ibGssIHJlZ2lzdGVyX2NvdW50MCwgMCwKLQkJCQkgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1swXSk7CisJCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCQkgICZhY3BpX2dibF9GQURULT54Z3BlMF9ibGssCisJCQkJCQkgIHJlZ2lzdGVyX2NvdW50MCwgMCwKKwkJCQkJCSAgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwKKwkJCQkJCSAgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1swXSk7CiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiQ291bGQgbm90IGNyZWF0ZSBHUEUgQmxvY2sgMCwgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgY3JlYXRlIEdQRSBCbG9jayAwLCAlc1xuIiwKKwkJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJfQogCX0KIAotCWlmIChhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4gJiYKLQkJYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLmFkZHJlc3MpIHsKKwlpZiAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYmIGFjcGlfZ2JsX0ZBRFQtPnhncGUxX2Jsay5hZGRyZXNzKSB7CiAJCS8qIEdQRSBibG9jayAxIGV4aXN0cyAoaGFzIGJvdGggbGVuZ3RoIGFuZCBhZGRyZXNzID4gMCkgKi8KIAogCQlyZWdpc3Rlcl9jb3VudDEgPSAodTE2KSAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuIC8gMik7CkBAIC0xMTE4LDI5ICsxMDg1LDI2IEBACiAJCS8qIENoZWNrIGZvciBHUEUwL0dQRTEgb3ZlcmxhcCAoaWYgYm90aCBiYW5rcyBleGlzdCkgKi8KIAogCQlpZiAoKHJlZ2lzdGVyX2NvdW50MCkgJiYKLQkJCShncGVfbnVtYmVyX21heCA+PSBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJHUEUwIGJsb2NrIChHUEUgMCB0byAlZCkgb3ZlcmxhcHMgdGhlIEdQRTEgYmxvY2sgKEdQRSAlZCB0byAlZCkgLSBJZ25vcmluZyBHUEUxXG4iLAotCQkJCWdwZV9udW1iZXJfbWF4LCBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UsCi0JCQkJYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlICsKLQkJCQkoKHJlZ2lzdGVyX2NvdW50MSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSk7CisJCSAgICAoZ3BlX251bWJlcl9tYXggPj0gYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJHUEUwIGJsb2NrIChHUEUgMCB0byAlZCkgb3ZlcmxhcHMgdGhlIEdQRTEgYmxvY2sgKEdQRSAlZCB0byAlZCkgLSBJZ25vcmluZyBHUEUxXG4iLCBncGVfbnVtYmVyX21heCwgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLCBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UgKyAoKHJlZ2lzdGVyX2NvdW50MSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSk7CiAKIAkJCS8qIElnbm9yZSBHUEUxIGJsb2NrIGJ5IHNldHRpbmcgdGhlIHJlZ2lzdGVyIGNvdW50IHRvIHplcm8gKi8KIAogCQkJcmVnaXN0ZXJfY291bnQxID0gMDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIEluc3RhbGwgR1BFIEJsb2NrIDEgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrIChhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCi0JCQkJCSAmYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLCByZWdpc3Rlcl9jb3VudDEsCi0JCQkJCSBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UsCi0JCQkJCSBhY3BpX2dibF9GQURULT5zY2lfaW50LCAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzFdKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwKKwkJCQkJCSAgICAgJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywKKwkJCQkJCSAgICAgcmVnaXN0ZXJfY291bnQxLAorCQkJCQkJICAgICBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UsCisJCQkJCQkgICAgIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsCisJCQkJCQkgICAgICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3MKKwkJCQkJCSAgICAgWzFdKTsKIAotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJDb3VsZCBub3QgY3JlYXRlIEdQRSBCbG9jayAxLCAlc1xuIiwKLQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBjcmVhdGUgR1BFIEJsb2NrIDEsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQkJfQogCiAJCQkvKgpAQCAtMTE0OCw3ICsxMTEyLDcgQEAKIAkJCSAqIHNwYWNlLiBIb3dldmVyLCBHUEUwIGFsd2F5cyBzdGFydHMgYXQgR1BFIG51bWJlciB6ZXJvLgogCQkJICovCiAJCQlncGVfbnVtYmVyX21heCA9IGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSArCi0JCQkJCSAgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKTsKKwkJCSAgICAoKHJlZ2lzdGVyX2NvdW50MSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpOwogCQl9CiAJfQogCkBAIC0xMTU3LDggKzExMjEsOCBAQAogCWlmICgocmVnaXN0ZXJfY291bnQwICsgcmVnaXN0ZXJfY291bnQxKSA9PSAwKSB7CiAJCS8qIEdQRXMgYXJlIG5vdCByZXF1aXJlZCBieSBBQ1BJLCB0aGlzIGlzIE9LICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwKLQkJCQkiVGhlcmUgYXJlIG5vIEdQRSBibG9ja3MgZGVmaW5lZCBpbiB0aGUgRkFEVFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkJICAiVGhlcmUgYXJlIG5vIEdQRSBibG9ja3MgZGVmaW5lZCBpbiB0aGUgRkFEVFxuIikpOwogCQlzdGF0dXMgPSBBRV9PSzsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTExNjYsMTUgKzExMzAsMTIgQEAKIAkvKiBDaGVjayBmb3IgTWF4IEdQRSBudW1iZXIgb3V0LW9mLXJhbmdlICovCiAKIAlpZiAoZ3BlX251bWJlcl9tYXggPiBBQ1BJX0dQRV9NQVgpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWF4aW11bSBHUEUgbnVtYmVyIGZyb20gRkFEVCBpcyB0b28gbGFyZ2U6IDB4JVhcbiIsCi0JCQlncGVfbnVtYmVyX21heCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1heGltdW0gR1BFIG51bWJlciBmcm9tIEZBRFQgaXMgdG9vIGxhcmdlOiAweCVYXG4iLCBncGVfbnVtYmVyX21heCkpOwogCQlzdGF0dXMgPSBBRV9CQURfVkFMVUU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLWNsZWFudXA6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYwppbmRleCA2NTllOTA5Li43ZTU3Yjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKQEAgLTQ3LDEyICs0NywxMCBAQAogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldm1pc2MiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJldm1pc2MiKQogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICphY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tdID0KLXsKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tdID0gewogCSJCdXMgQ2hlY2siLAogCSJEZXZpY2UgQ2hlY2siLAogCSJEZXZpY2UgV2FrZSIsCkBAIC02NiwxOCArNjQsMTEgQEAKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2godm9pZCAqY29udGV4dCk7CiAKLXN0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCh2b2lkICpjb250ZXh0KTsKIAotc3RhdGljIHUzMgotYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQorc3RhdGljIHUzMiBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCAqY29udGV4dCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTMsOSArODQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX2V2X2lzX25vdGlmeV9vYmplY3QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCit1OCBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7CiAJc3dpdGNoIChub2RlLT50eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgpAQCAtMTEyLDcgKzEwMSw2IEBACiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QKQEAgLTEyOCwxOCArMTE2LDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV92YWx1ZSkKK2FjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlLAorCQkJICAgICB1MzIgbm90aWZ5X3ZhbHVlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqID0gTlVMTDsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpub3RpZnlfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqID0gTlVMTDsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKm5vdGlmeV9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCIpOwogCiAJLyoKIAkgKiBGb3IgdmFsdWUgMyAoRWplY3Rpb24gUmVxdWVzdCksIHNvbWUgZGV2aWNlIG1ldGhvZCBtYXkgbmVlZCB0byBiZSBydW4uCkBAIC0xNDgsMjIgKzEzMywyMiBAQAogCSAqIEZvciB2YWx1ZSAweDgwIChTdGF0dXMgQ2hhbmdlKSBvbiB0aGUgcG93ZXIgYnV0dG9uIG9yIHNsZWVwIGJ1dHRvbiwKIAkgKiAgIGluaXRpYXRlIHNvZnQtb2ZmIG9yIHNsZWVwIG9wZXJhdGlvbj8KIAkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiRGlzcGF0Y2hpbmcgTm90aWZ5KCVYKSBvbiBub2RlICVwXG4iLCBub3RpZnlfdmFsdWUsIG5vZGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJEaXNwYXRjaGluZyBOb3RpZnkoJVgpIG9uIG5vZGUgJXBcbiIsIG5vdGlmeV92YWx1ZSwKKwkJCSAgbm9kZSkpOwogCiAJaWYgKG5vdGlmeV92YWx1ZSA8PSA3KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJOb3RpZnkgdmFsdWU6ICVzXG4iLAotCQkJCWFjcGlfbm90aWZ5X3ZhbHVlX25hbWVzW25vdGlmeV92YWx1ZV0pKTsKLQl9Ci0JZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkiTm90aWZ5IHZhbHVlOiAweCUyLjJYICoqRGV2aWNlIFNwZWNpZmljKipcbiIsCi0JCQlub3RpZnlfdmFsdWUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm90aWZ5IHZhbHVlOiAlc1xuIiwKKwkJCQkgIGFjcGlfbm90aWZ5X3ZhbHVlX25hbWVzW25vdGlmeV92YWx1ZV0pKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiTm90aWZ5IHZhbHVlOiAweCUyLjJYICoqRGV2aWNlIFNwZWNpZmljKipcbiIsCisJCQkJICBub3RpZnlfdmFsdWUpKTsKIAl9CiAKIAkvKiBHZXQgdGhlIG5vdGlmeSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5TIE5vZGUgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAob2JqX2Rlc2MpIHsKIAkJLyogV2UgaGF2ZSB0aGUgbm90aWZ5IG9iamVjdCwgR2V0IHRoZSByaWdodCBoYW5kbGVyICovCiAKQEAgLTE3NCwxMCArMTU5LDExIEBACiAJCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgogCiAJCQlpZiAobm90aWZ5X3ZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpIHsKLQkJCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnk7CisJCQkJaGFuZGxlcl9vYmogPQorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5zeXN0ZW1fbm90aWZ5OworCQkJfSBlbHNlIHsKKwkJCQloYW5kbGVyX29iaiA9CisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnk7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMTg5LDIzICsxNzUsMjUgQEAKIAogCS8qIElmIHRoZXJlIGlzIGFueSBoYW5kbGVyIHRvIHJ1biwgc2NoZWR1bGUgdGhlIGRpc3BhdGNoZXIgKi8KIAotCWlmICgoYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyICYmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkpIHx8Ci0JCShhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgJiYgKG5vdGlmeV92YWx1ZSA+IEFDUElfTUFYX1NZU19OT1RJRlkpKSB8fAotCQloYW5kbGVyX29iaikgewotCQlub3RpZnlfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7CisJaWYgKChhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIKKwkgICAgICYmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkpCisJICAgIHx8IChhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIKKwkJJiYgKG5vdGlmeV92YWx1ZSA+IEFDUElfTUFYX1NZU19OT1RJRlkpKSB8fCBoYW5kbGVyX29iaikgeworCQlub3RpZnlfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKIAkJaWYgKCFub3RpZnlfaW5mbykgewogCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJbm90aWZ5X2luZm8tPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9OT1RJRlk7Ci0JCW5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSAgICAgID0gbm9kZTsKLQkJbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSAgICAgPSAodTE2KSBub3RpZnlfdmFsdWU7CisJCW5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSA9IG5vZGU7CisJCW5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUgPSAodTE2KSBub3RpZnlfdmFsdWU7CiAJCW5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iajsKIAotCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24gKE9TRF9QUklPUklUWV9ISUdILAotCQkJCSAgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2gsIG5vdGlmeV9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAobm90aWZ5X2luZm8pOworCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0hJR0gsCisJCQkJCQkgICAgIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoLAorCQkJCQkJICAgICBub3RpZnlfaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShub3RpZnlfaW5mbyk7CiAJCX0KIAl9CiAKQEAgLTIxNCwxNSArMjAyLDE1IEBACiAJCSAqIFRoZXJlIGlzIG5vIHBlci1kZXZpY2Ugbm90aWZ5IGhhbmRsZXIgZm9yIHRoaXMgZGV2aWNlLgogCQkgKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGEgcHJvYmxlbS4KIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkiTm8gbm90aWZ5IGhhbmRsZXIgZm9yIE5vdGlmeSglNC40cywgJVgpIG5vZGUgJXBcbiIsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpLCBub3RpZnlfdmFsdWUsIG5vZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIk5vIG5vdGlmeSBoYW5kbGVyIGZvciBOb3RpZnkoJTQuNHMsICVYKSBub2RlICVwXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub3RpZnlfdmFsdWUsCisJCQkJICBub2RlKSk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoCkBAIC0yMzYsMTggKzIyNCwxNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X25vdGlmeV9kaXNwYXRjaCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoKHZvaWQgKmNvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqbm90aWZ5X2luZm8gPSAodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICopIGNvbnRleHQ7Ci0JYWNwaV9ub3RpZnlfaGFuZGxlciAgICAgICAgICAgICBnbG9iYWxfaGFuZGxlciA9IE5VTEw7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ2xvYmFsX2NvbnRleHQgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqbm90aWZ5X2luZm8gPQorCSAgICAodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICopY29udGV4dDsKKwlhY3BpX25vdGlmeV9oYW5kbGVyIGdsb2JhbF9oYW5kbGVyID0gTlVMTDsKKwl2b2lkICpnbG9iYWxfY29udGV4dCA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIFdlIHdpbGwgaW52b2tlIGEgZ2xvYmFsIG5vdGlmeSBoYW5kbGVyIGlmIGluc3RhbGxlZC4KQEAgLTI2MSw4ICsyNDYsNyBAQAogCQkJZ2xvYmFsX2hhbmRsZXIgPSBhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXI7CiAJCQlnbG9iYWxfY29udGV4dCA9IGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuY29udGV4dDsKIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBHbG9iYWwgZHJpdmVyIG5vdGlmaWNhdGlvbiBoYW5kbGVyICovCiAKIAkJaWYgKGFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlcikgewpAQCAtMjc0LDI1ICsyNTgsMjQgQEAKIAkvKiBJbnZva2UgdGhlIHN5c3RlbSBoYW5kbGVyIGZpcnN0LCBpZiBwcmVzZW50ICovCiAKIAlpZiAoZ2xvYmFsX2hhbmRsZXIpIHsKLQkJZ2xvYmFsX2hhbmRsZXIgKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKLQkJCWdsb2JhbF9jb250ZXh0KTsKKwkJZ2xvYmFsX2hhbmRsZXIobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLAorCQkJICAgICAgIG5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUsIGdsb2JhbF9jb250ZXh0KTsKIAl9CiAKIAkvKiBOb3cgaW52b2tlIHRoZSBwZXItZGV2aWNlIGhhbmRsZXIsIGlmIHByZXNlbnQgKi8KIAogCWhhbmRsZXJfb2JqID0gbm90aWZ5X2luZm8tPm5vdGlmeS5oYW5kbGVyX29iajsKIAlpZiAoaGFuZGxlcl9vYmopIHsKLQkJaGFuZGxlcl9vYmotPm5vdGlmeS5oYW5kbGVyIChub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsCi0JCQlub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAotCQkJaGFuZGxlcl9vYmotPm5vdGlmeS5jb250ZXh0KTsKKwkJaGFuZGxlcl9vYmotPm5vdGlmeS5oYW5kbGVyKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwKKwkJCQkJICAgIG5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUsCisJCQkJCSAgICBoYW5kbGVyX29iai0+bm90aWZ5LmNvbnRleHQpOwogCX0KIAogCS8qIEFsbCBkb25lIHdpdGggdGhlIGluZm8gb2JqZWN0ICovCiAKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChub3RpZnlfaW5mbyk7CisJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShub3RpZnlfaW5mbyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQKQEAgLTMwNywyNyArMjkwLDI0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfZ2xvYmFsX2xvY2tfdGhyZWFkICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQodm9pZCAqY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qIFNpZ25hbCB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoZSBsb2NrICovCiAKIAlpZiAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50KSB7CiAJCS8qIFNlbmQgc3VmZmljaWVudCB1bml0cyB0byB0aGUgc2VtYXBob3JlICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlIChhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUsCi0JCQkJIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBzaWduYWwgR2xvYmFsIExvY2sgc2VtYXBob3JlXG4iKSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAorCQkJCQkgICAgIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3Qgc2lnbmFsIEdsb2JhbCBMb2NrIHNlbWFwaG9yZVxuIikpOwogCQl9CiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlcgpAQCAtMzQyLDIwICszMjIsMTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdTMyCi1hY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCitzdGF0aWMgdTMyIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlcih2b2lkICpjb250ZXh0KQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBGQUxTRTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXU4IGFjcXVpcmVkID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyoKIAkgKiBBdHRlbXB0IHRvIGdldCB0aGUgbG9jawogCSAqIElmIHdlIGRvbid0IGdldCBpdCBub3csIGl0IHdpbGwgYmUgbWFya2VkIHBlbmRpbmcgYW5kIHdlIHdpbGwKIAkgKiB0YWtlIGFub3RoZXIgaW50ZXJydXB0IHdoZW4gaXQgYmVjb21lcyBmcmVlLgogCSAqLwotCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyAoYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2ssIGFjcXVpcmVkKTsKKwlBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0soYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2ssIGFjcXVpcmVkKTsKIAlpZiAoYWNxdWlyZWQpIHsKIAkJLyogR290IHRoZSBsb2NrLCBub3cgd2FrZSBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciBpdCAqLwogCkBAIC0zNjMsMTEgKzM0MCwxMSBAQAogCiAJCS8qIFJ1biB0aGUgR2xvYmFsIExvY2sgdGhyZWFkIHdoaWNoIHdpbGwgc2lnbmFsIGFsbCB3YWl0aW5nIHRocmVhZHMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24gKE9TRF9QUklPUklUWV9ISUdILAotCQkJCSAgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQsIGNvbnRleHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgcXVldWUgR2xvYmFsIExvY2sgdGhyZWFkLCAlc1xuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9ISUdILAorCQkJCQkJICAgICBhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCwKKwkJCQkJCSAgICAgY29udGV4dCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgcXVldWUgR2xvYmFsIExvY2sgdGhyZWFkLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAogCQkJcmV0dXJuIChBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJCX0KQEAgLTM3Niw3ICszNTMsNiBAQAogCXJldHVybiAoQUNQSV9JTlRFUlJVUFRfSEFORExFRCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIKQEAgLTM4OSwxOSArMzY1LDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlciIpOwogCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IFRSVUU7Ci0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIgKEFDUElfRVZFTlRfR0xPQkFMLAotCQkJIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9HTE9CQUwsCisJCQkJCQkgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwKKwkJCQkJCSAgTlVMTCk7CiAKIAkvKgogCSAqIElmIHRoZSBnbG9iYWwgbG9jayBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBsYXRmb3JtLCB0aGUgYXR0ZW1wdApAQCAtNDExLDE0ICszODQsMTUgQEAKIAkgKiB3aXRoIGFuIGVycm9yLgogCSAqLwogCWlmIChzdGF0dXMgPT0gQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJObyByZXNwb25zZSBmcm9tIEdsb2JhbCBMb2NrIGhhcmR3YXJlLCBkaXNhYmxpbmcgbG9ja1xuIikpOworCiAJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQgPSBGQUxTRTsKIAkJc3RhdHVzID0gQUVfT0s7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrCkBAIC00MzEsMjIgKzQwNSwxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KQorYWNwaV9zdGF0dXMgYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrKHUxNiB0aW1lb3V0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IEZBTFNFOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXU4IGFjcXVpcmVkID0gRkFMU0U7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9hY3F1aXJlX2dsb2JhbF9sb2NrIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9hY3F1aXJlX2dsb2JhbF9sb2NrIik7CiAKICNpZm5kZWYgQUNQSV9BUFBMSUNBVElPTgogCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBnbG9iYWwgbG9jayAqLwogCiAJaWYgKCFhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50KSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fR0xPQkFMX0xPQ0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fR0xPQkFMX0xPQ0spOwogCX0KICNlbmRpZgogCkBAIC00NTksMzcgKzQyOSwzNyBAQAogCSAqIHdlIGFyZSBkb25lCiAJICovCiAJaWYgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIFdlIG11c3QgYWNxdWlyZSB0aGUgYWN0dWFsIGhhcmR3YXJlIGxvY2sgKi8KIAotCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyAoYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2ssIGFjcXVpcmVkKTsKKwlBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0soYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2ssIGFjcXVpcmVkKTsKIAlpZiAoYWNxdWlyZWQpIHsKLQkgICAvKiBXZSBnb3QgdGhlIGxvY2sgKi8KKwkJLyogV2UgZ290IHRoZSBsb2NrICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkFjcXVpcmVkIHRoZSBIVyBHbG9iYWwgTG9ja1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiQWNxdWlyZWQgdGhlIEhXIEdsb2JhbCBMb2NrXG4iKSk7CiAKIAkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBUUlVFOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgogCSAqIERpZCBub3QgZ2V0IHRoZSBsb2NrLiAgVGhlIHBlbmRpbmcgYml0IHdhcyBzZXQgYWJvdmUsIGFuZCB3ZSBtdXN0IG5vdwogCSAqIHdhaXQgdW50aWwgd2UgZ2V0IHRoZSBnbG9iYWwgbG9jayByZWxlYXNlZCBpbnRlcnJ1cHQuCiAJICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIldhaXRpbmcgZm9yIHRoZSBIVyBHbG9iYWwgTG9ja1xuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIldhaXRpbmcgZm9yIHRoZSBIVyBHbG9iYWwgTG9ja1xuIikpOwogCiAJLyoKIAkgKiBBY3F1aXJlIHRoZSBnbG9iYWwgbG9jayBzZW1hcGhvcmUgZmlyc3QuCiAJICogU2luY2UgdGhpcyB3YWl0IHdpbGwgYmxvY2ssIHdlIG11c3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAotCQkJICB0aW1lb3V0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAorCQkJCQkgICAgICAgdGltZW91dCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrCkBAIC01MDIsMjEgKzQ3MiwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sodm9pZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBGQUxTRTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXU4IHBlbmRpbmcgPSBGQUxTRTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X3JlbGVhc2VfZ2xvYmFsX2xvY2siKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3JlbGVhc2VfZ2xvYmFsX2xvY2siKTsKIAogCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50KSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcoKAotCQkJIkNhbm5vdCByZWxlYXNlIEhXIEdsb2JhbCBMb2NrLCBpdCBoYXMgbm90IGJlZW4gYWNxdWlyZWRcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfQUNRVUlSRUQpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiQ2Fubm90IHJlbGVhc2UgSFcgR2xvYmFsIExvY2ssIGl0IGhhcyBub3QgYmVlbiBhY3F1aXJlZFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0FDUVVJUkVEKTsKIAl9CiAKIAkvKiBPbmUgZmV3ZXIgdGhyZWFkIGhhcyB0aGUgZ2xvYmFsIGxvY2sgKi8KQEAgLTUyNSwxNCArNDkwLDE0IEBACiAJaWYgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgewogCQkvKiBUaGVyZSBhcmUgc3RpbGwgc29tZSB0aHJlYWRzIGhvbGRpbmcgdGhlIGxvY2ssIGNhbm5vdCByZWxlYXNlICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyoKIAkgKiBObyBtb3JlIHRocmVhZHMgaG9sZGluZyBsb2NrLCB3ZSBjYW4gZG8gdGhlIGFjdHVhbCBoYXJkd2FyZQogCSAqIHJlbGVhc2UKIAkgKi8KLQlBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0sgKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmdsb2JhbF9sb2NrLCBwZW5kaW5nKTsKKwlBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2ssIHBlbmRpbmcpOwogCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkID0gRkFMU0U7CiAKIAkvKgpAQCAtNTQwLDE0ICs1MDUsMTMgQEAKIAkgKiByZWdpc3RlcgogCSAqLwogCWlmIChwZW5kaW5nKSB7Ci0JCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19SRUxFQVNFLAotCQkJCSAxLCBBQ1BJX01UWF9MT0NLKTsKKwkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwKKwkJCQkJICAgMSwgQUNQSV9NVFhfTE9DSyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl90ZXJtaW5hdGUKQEAgLTU2MCwxNiArNTI0LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9ldl90ZXJtaW5hdGUgKAotCXZvaWQpCit2b2lkIGFjcGlfZXZfdGVybWluYXRlKHZvaWQpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl90ZXJtaW5hdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3Rlcm1pbmF0ZSIpOwogCiAJaWYgKGFjcGlfZ2JsX2V2ZW50c19pbml0aWFsaXplZCkgewogCQkvKgpAQCAtNTgwLDM4ICs1NDAsMzkgQEAKIAkJLyogRGlzYWJsZSBhbGwgZml4ZWQgZXZlbnRzICovCiAKIAkJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0ZJWEVEX0VWRU5UUzsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQgKCh1MzIpIGksIDApOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiQ291bGQgbm90IGRpc2FibGUgZml4ZWQgZXZlbnQgJWRcbiIsICh1MzIpIGkpKTsKKwkJCXN0YXR1cyA9IGFjcGlfZGlzYWJsZV9ldmVudCgodTMyKSBpLCAwKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJDb3VsZCBub3QgZGlzYWJsZSBmaXhlZCBldmVudCAlZFxuIiwKKwkJCQkJCSAgKHUzMikgaSkpOwogCQkJfQogCQl9CiAKIAkJLyogRGlzYWJsZSBhbGwgR1BFcyBpbiBhbGwgR1BFIGJsb2NrcyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdCAoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jaywgQUNQSV9OT1RfSVNSKTsKKwkJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2spOwogCiAJCS8qIFJlbW92ZSBTQ0kgaGFuZGxlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICgpOworCQlzdGF0dXMgPSBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlcigpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgcmVtb3ZlIFNDSSBoYW5kbGVyXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDb3VsZCBub3QgcmVtb3ZlIFNDSSBoYW5kbGVyXG4iKSk7CiAJCX0KIAl9CiAKIAkvKiBEZWFsbG9jYXRlIGFsbCBoYW5kbGVyIG9iamVjdHMgaW5zdGFsbGVkIHdpdGhpbiBHUEUgaW5mbyBzdHJ1Y3RzICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycywgQUNQSV9OT1RfSVNSKTsKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzKTsKIAogCS8qIFJldHVybiB0byBvcmlnaW5hbCBtb2RlIGlmIG5lY2Vzc2FyeSAqLwogCiAJaWYgKGFjcGlfZ2JsX29yaWdpbmFsX21vZGUgPT0gQUNQSV9TWVNfTU9ERV9MRUdBQ1kpIHsKLQkJc3RhdHVzID0gYWNwaV9kaXNhYmxlICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9XQVJOLCAiYWNwaV9kaXNhYmxlIGZhaWxlZFxuIikpOworCQlzdGF0dXMgPSBhY3BpX2Rpc2FibGUoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCSAgImFjcGlfZGlzYWJsZSBmYWlsZWRcbiIpKTsKIAkJfQogCX0KIAlyZXR1cm5fVk9JRDsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCmluZGV4IGExZDcyNzZjLi44NGZhZDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCkBAIC00MSwzOSArNDEsMzAgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnJlZ2lvbiIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV2cmVnaW9uIikKICNkZWZpbmUgQUNQSV9OVU1fREVGQVVMVF9TUEFDRVMgICAgIDQKLQotc3RhdGljIHU4ICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXNbQUNQSV9OVU1fREVGQVVMVF9TUEFDRVNdID0gewotCQkJIEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlksCi0JCQkgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPLAotCQkJIEFDUElfQURSX1NQQUNFX1BDSV9DT05GSUcsCi0JCQkgQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRX07CitzdGF0aWMgdTggYWNwaV9nYmxfZGVmYXVsdF9hZGRyZXNzX3NwYWNlc1tBQ1BJX05VTV9ERUZBVUxUX1NQQUNFU10gPSB7CisJQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSwKKwlBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8sCisJQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRywKKwlBQ1BJX0FEUl9TUEFDRV9EQVRBX1RBQkxFCit9OwogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9yZWdfcnVuICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworYWNwaV9ldl9yZWdfcnVuKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KK2FjcGlfZXZfaW5zdGFsbF9oYW5kbGVyKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTg3LDE5ICs3OCwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzICgKLQl2b2lkKSB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTEyMSw5ICsxMDksMTEgQEAKIAkgKiBTaW1pbGFyIGZvciBBRV9TQU1FX0hBTkRMRVIuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0RFRkFVTFRfU1BBQ0VTOyBpKyspIHsKLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIgKGFjcGlfZ2JsX3Jvb3Rfbm9kZSwKLQkJCQkgIGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXNbaV0sCi0JCQkJICBBQ1BJX0RFRkFVTFRfSEFORExFUiwgTlVMTCwgTlVMTCk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKGFjcGlfZ2JsX3Jvb3Rfbm9kZSwKKwkJCQkJCSAgICAgICBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzCisJCQkJCQkgICAgICAgW2ldLAorCQkJCQkJICAgICAgIEFDUElfREVGQVVMVF9IQU5ETEVSLAorCQkJCQkJICAgICAgIE5VTEwsIE5VTEwpOwogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIEFFX09LOgogCQljYXNlIEFFX1NBTUVfSEFORExFUjoKQEAgLTE0MCwxMiArMTMwLDExIEBACiAJCX0KIAl9CiAKLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucwpAQCAtMTU5LDIwICsxNDgsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucyh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTE4MiwxNSArMTY3LDE1IEBACiAJCS8qIFRCRDogTWFrZSBzdXJlIGhhbmRsZXIgaXMgdGhlIERFRkFVTFQgaGFuZGxlciwgb3RoZXJ3aXNlCiAJCSAqIF9SRUcgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBydW4uCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMgKGFjcGlfZ2JsX3Jvb3Rfbm9kZSwKLQkJCQkgIGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXNbaV0pOworCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMoYWNwaV9nYmxfcm9vdF9ub2RlLAorCQkJCQkJICAgICBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzCisJCQkJCQkgICAgIFtpXSk7CiAJfQogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QKQEAgLTIwNSwyNiArMTkwLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikKK2FjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosIHUzMiBmdW5jdGlvbikKIHsKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIGluZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFyYW1zWzNdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmoyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFyYW1zWzNdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2V4ZWN1dGVfcmVnX21ldGhvZCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2V4ZWN1dGVfcmVnX21ldGhvZCIpOwotCi0KLQlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKHJlZ2lvbl9vYmopOworCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKIAlpZiAoIXJlZ2lvbl9vYmoyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJaWYgKHJlZ2lvbl9vYmoyLT5leHRyYS5tZXRob2RfUkVHID09IE5VTEwpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyoKQEAgLTIzNywxMiArMjE4LDEyIEBACiAJICogICAgICAgICAgMCBmb3IgZGlzY29ubmVjdGluZyB0aGUgaGFuZGxlcgogCSAqICAgICAgICAgIFBhc3NlZCBhcyBhIHBhcmFtZXRlcgogCSAqLwotCXBhcmFtc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCXBhcmFtc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJaWYgKCFwYXJhbXNbMF0pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlwYXJhbXNbMV0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwlwYXJhbXNbMV0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCWlmICghcGFyYW1zWzFdKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMjYwLDE5ICsyNDEsMTggQEAKIAogCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcmV0dXJuIHZhbHVlICovCiAKLQlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lICgKLQkJCSAgIEFDUElfVFlQRV9NRVRIT0QsIGluZm8ubm9kZSwgTlVMTCkpOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlICgmaW5mbyk7CisJQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCisJCQkoQUNQSV9UWVBFX01FVEhPRCwgaW5mby5ub2RlLCBOVUxMKSk7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUoJmluZm8pOwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChwYXJhbXNbMV0pOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwYXJhbXNbMV0pOwogCi1jbGVhbnVwOgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocGFyYW1zWzBdKTsKKyAgICAgIGNsZWFudXA6CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHBhcmFtc1swXSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoCkBAIC0yOTEsNDAgKzI3MSwzOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSkKK2FjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkJICAgICAgIHUzMiBmdW5jdGlvbiwKKwkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgICB1MzIgYml0X3dpZHRoLCB2b2lkICp2YWx1ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czI7Ci0JYWNwaV9hZHJfc3BhY2VfaGFuZGxlciAgICAgICAgICBoYW5kbGVyOwotCWFjcGlfYWRyX3NwYWNlX3NldHVwICAgICAgICAgICAgcmVnaW9uX3NldHVwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqMjsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czI7CisJYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyOworCWFjcGlfYWRyX3NwYWNlX3NldHVwIHJlZ2lvbl9zZXR1cDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CisJdm9pZCAqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2giKTsKLQotCi0JcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChyZWdpb25fb2JqKTsKKwlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7CiAJaWYgKCFyZWdpb25fb2JqMikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24gKi8KIAogCWhhbmRsZXJfZGVzYyA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyOwogCWlmICghaGFuZGxlcl9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk5vIGhhbmRsZXIgZm9yIFJlZ2lvbiBbJTQuNHNdICglcCkgWyVzXVxuIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpLAotCQkJcmVnaW9uX29iaiwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyBoYW5kbGVyIGZvciBSZWdpb24gWyU0LjRzXSAoJXApIFslc11cbiIsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJCW5vZGUpLCByZWdpb25fb2JqLAorCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJCSAgc3BhY2VfaWQpKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAkvKgpAQCAtMzM5LDEwICszMTcsMTMgQEAKIAkJaWYgKCFyZWdpb25fc2V0dXApIHsKIAkJCS8qIE5vIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIGV4aXQgd2l0aCBlcnJvciAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiTm8gaW5pdCByb3V0aW5lIGZvciByZWdpb24oJXApIFslc11cbiIsCi0JCQkJcmVnaW9uX29iaiwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAorCQkJCQkgIHJlZ2lvbl9vYmosCisJCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+CisJCQkJCQkJCSAgcmVnaW9uLgorCQkJCQkJCQkgIHNwYWNlX2lkKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJCX0KIAogCQkvKgpAQCAtMzUwLDI1ICszMzEsMjkgQEAKIAkJICogc2V0dXAgd2lsbCBwb3RlbnRpYWxseSBleGVjdXRlIGNvbnRyb2wgbWV0aG9kcwogCQkgKiAoZS5nLiwgX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uKQogCQkgKi8KLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAotCQlzdGF0dXMgPSByZWdpb25fc2V0dXAgKHJlZ2lvbl9vYmosIEFDUElfUkVHSU9OX0FDVElWQVRFLAotCQkJCSAgaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQsICZyZWdpb25fY29udGV4dCk7CisJCXN0YXR1cyA9IHJlZ2lvbl9zZXR1cChyZWdpb25fb2JqLCBBQ1BJX1JFR0lPTl9BQ1RJVkFURSwKKwkJCQkgICAgICBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuY29udGV4dCwKKwkJCQkgICAgICAmcmVnaW9uX2NvbnRleHQpOwogCiAJCS8qIFJlLWVudGVyIHRoZSBpbnRlcnByZXRlciAqLwogCi0JCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMyKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMyKTsKKwkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwogCQl9CiAKIAkJLyogQ2hlY2sgZm9yIGZhaWx1cmUgb2YgdGhlIFJlZ2lvbiBTZXR1cCAqLwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiUmVnaW9uIEluaXQ6ICVzIFslc11cbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAotCQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiUmVnaW9uIEluaXQ6ICVzIFslc11cbiIsCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksCisJCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+CisJCQkJCQkJCSAgcmVnaW9uLgorCQkJCQkJCQkgIHNwYWNlX2lkKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKgpAQCAtMzgwLDE0ICszNjUsMTQgQEAKIAkJCWlmIChyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQpIHsKIAkJCQkvKiBUaGUgaGFuZGxlciBmb3IgdGhpcyByZWdpb24gd2FzIGFscmVhZHkgaW5zdGFsbGVkICovCiAKLQkJCQlBQ1BJX01FTV9GUkVFIChyZWdpb25fY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCQlBQ1BJX01FTV9GUkVFKHJlZ2lvbl9jb250ZXh0KTsKKwkJCX0gZWxzZSB7CiAJCQkJLyoKIAkJCQkgKiBTYXZlIHRoZSByZXR1cm5lZCBjb250ZXh0IGZvciB1c2UgaW4gYWxsIGFjY2Vzc2VzIHRvCiAJCQkJICogdGhpcyBwYXJ0aWN1bGFyIHJlZ2lvbgogCQkJCSAqLwotCQkJCXJlZ2lvbl9vYmoyLT5leHRyYS5yZWdpb25fY29udGV4dCA9IHJlZ2lvbl9jb250ZXh0OworCQkJCXJlZ2lvbl9vYmoyLT5leHRyYS5yZWdpb25fY29udGV4dCA9CisJCQkJICAgIHJlZ2lvbl9jb250ZXh0OwogCQkJfQogCQl9CiAJfQpAQCAtMzk2LDEzICszODEsMTYgQEAKIAogCWhhbmRsZXIgPSBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGFuZGxlcjsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkiSGFuZGxlciAlcCAoQCVwKSBBZGRyZXNzICU4LjhYJTguOFggWyVzXVxuIiwKLQkJJnJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyLT5hZGRyZXNzX3NwYWNlLCBoYW5kbGVyLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAotCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJIYW5kbGVyICVwIChAJXApIEFkZHJlc3MgJTguOFglOC44WCBbJXNdXG4iLAorCQkJICAmcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXItPmFkZHJlc3Nfc3BhY2UsIGhhbmRsZXIsCisJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJICBzcGFjZV9pZCkpKTsKIAotCWlmICghKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oZmxhZ3MgJiBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkpIHsKKwlpZiAoIQorCSAgICAoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLgorCSAgICAgaGZsYWdzICYgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpKSB7CiAJCS8qCiAJCSAqIEZvciBoYW5kbGVycyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IChzdXBwbGllZCkgaGFuZGxlcnMsIHdlIG11c3QKIAkJICogZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYmVjYXVzZSB0aGUgaGFuZGxlciAqbWlnaHQqIGJsb2NrIC0tIHdlIGRvbid0CkBAIC00MTMsMzEgKzQwMSwzMyBAQAogCiAJLyogQ2FsbCB0aGUgaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gaGFuZGxlciAoZnVuY3Rpb24sIGFkZHJlc3MsIGJpdF93aWR0aCwgdmFsdWUsCisJc3RhdHVzID0gaGFuZGxlcihmdW5jdGlvbiwgYWRkcmVzcywgYml0X3dpZHRoLCB2YWx1ZSwKIAkJCSBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuY29udGV4dCwKIAkJCSByZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJIYW5kbGVyIGZvciBbJXNdIHJldHVybmVkICVzXG4iLAotCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCksCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJIYW5kbGVyIGZvciBbJXNdIHJldHVybmVkICVzXG4iLAorCQkJCSAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCQkgICBzcGFjZV9pZCksCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlpZiAoIShoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGZsYWdzICYgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpKSB7CisJaWYgKCEKKwkgICAgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS4KKwkgICAgIGhmbGFncyAmIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSkgewogCQkvKgogCQkgKiBXZSBqdXN0IHJldHVybmVkIGZyb20gYSBub24tZGVmYXVsdCBoYW5kbGVyLCB3ZSBtdXN0IHJlLWVudGVyIHRoZQogCQkgKiBpbnRlcnByZXRlcgogCQkgKi8KLQkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1czIpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1czIpOworCQlzdGF0dXMyID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZXRhY2hfcmVnaW9uCkBAIC00NTMsMjMgKzQ0MywyMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9ldl9kZXRhY2hfcmVnaW9uKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmosCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25zX2lzX2xvY2tlZCkKK2FjcGlfZXZfZGV0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkgICAgICB1OCBhY3BpX25zX2lzX2xvY2tlZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqbGFzdF9vYmpfcHRyOwotCWFjcGlfYWRyX3NwYWNlX3NldHVwICAgICAgICAgICAgcmVnaW9uX3NldHVwOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqMjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbGFzdF9vYmpfcHRyOworCWFjcGlfYWRyX3NwYWNlX3NldHVwIHJlZ2lvbl9zZXR1cDsKKwl2b2lkICoqcmVnaW9uX2NvbnRleHQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZGV0YWNoX3JlZ2lvbiIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2RldGFjaF9yZWdpb24iKTsKLQotCi0JcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChyZWdpb25fb2JqKTsKKwlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7CiAJaWYgKCFyZWdpb25fb2JqMikgewogCQlyZXR1cm5fVk9JRDsKIAl9CkBAIC00OTMsMzQgKzQ4MCwzOSBAQAogCQkvKiBJcyB0aGlzIHRoZSBjb3JyZWN0IFJlZ2lvbj8gKi8KIAogCQlpZiAob2JqX2Rlc2MgPT0gcmVnaW9uX29iaikgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJIlJlbW92aW5nIFJlZ2lvbiAlcCBmcm9tIGFkZHJlc3MgaGFuZGxlciAlcFxuIiwKLQkJCQlyZWdpb25fb2JqLCBoYW5kbGVyX29iaikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCQkJICAiUmVtb3ZpbmcgUmVnaW9uICVwIGZyb20gYWRkcmVzcyBoYW5kbGVyICVwXG4iLAorCQkJCQkgIHJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqKSk7CiAKIAkJCS8qIFRoaXMgaXMgaXQsIHJlbW92ZSBpdCBmcm9tIHRoZSBoYW5kbGVyJ3MgbGlzdCAqLwogCiAJCQkqbGFzdF9vYmpfcHRyID0gb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0OwotCQkJb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0ID0gTlVMTDsgICAgICAgICAgIC8qIE11c3QgY2xlYXIgZmllbGQgKi8KKwkJCW9ial9kZXNjLT5yZWdpb24ubmV4dCA9IE5VTEw7CS8qIE11c3QgY2xlYXIgZmllbGQgKi8KIAogCQkJaWYgKGFjcGlfbnNfaXNfbG9ja2VkKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJcmV0dXJuX1ZPSUQ7CiAJCQkJfQogCQkJfQogCiAJCQkvKiBOb3cgc3RvcCByZWdpb24gYWNjZXNzZXMgYnkgZXhlY3V0aW5nIHRoZSBfUkVHIG1ldGhvZCAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZCAocmVnaW9uX29iaiwgMCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcyBmcm9tIHJlZ2lvbiBfUkVHLCBbJXNdXG4iLAotCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksCi0JCQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7CisJCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZChyZWdpb25fb2JqLCAwKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICIlcyBmcm9tIHJlZ2lvbiBfUkVHLCBbJXNdXG4iLAorCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwKKwkJCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUKKwkJCQkJCSAgKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCSAgIHNwYWNlX2lkKSkpOwogCQkJfQogCiAJCQlpZiAoYWNwaV9uc19pc19sb2NrZWQpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlyZXR1cm5fVk9JRDsKIAkJCQl9CiAJCQl9CkBAIC01MjgsMTUgKzUyMCwyMCBAQAogCQkJLyogQ2FsbCB0aGUgc2V0dXAgaGFuZGxlciB3aXRoIHRoZSBkZWFjdGl2YXRlIG5vdGlmaWNhdGlvbiAqLwogCiAJCQlyZWdpb25fc2V0dXAgPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zZXR1cDsKLQkJCXN0YXR1cyA9IHJlZ2lvbl9zZXR1cCAocmVnaW9uX29iaiwgQUNQSV9SRUdJT05fREVBQ1RJVkFURSwKLQkJCQkJICBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5jb250ZXh0LCByZWdpb25fY29udGV4dCk7CisJCQlzdGF0dXMgPQorCQkJICAgIHJlZ2lvbl9zZXR1cChyZWdpb25fb2JqLCBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFLAorCQkJCQkgaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuY29udGV4dCwKKwkJCQkJIHJlZ2lvbl9jb250ZXh0KTsKIAogCQkJLyogSW5pdCByb3V0aW5lIG1heSBmYWlsLCBKdXN0IGlnbm9yZSBlcnJvcnMgKi8KIAotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiJXMgZnJvbSByZWdpb24gaW5pdCwgWyVzXVxuIiwKLQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAotCQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIiVzIGZyb20gcmVnaW9uIGluaXQsIFslc11cbiIsCisJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAorCQkJCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZQorCQkJCQkJICAocmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJICAgc3BhY2VfaWQpKSk7CiAJCQl9CiAKIAkJCXJlZ2lvbl9vYmotPnJlZ2lvbi5mbGFncyAmPSB+KEFPUE9CSl9TRVRVUF9DT01QTEVURSk7CkBAIC01NTIsNyArNTQ5LDcgQEAKIAkJCSAqIHRoaXMgYmV0dGVyIGJlIHRoZSByZWdpb24ncyBoYW5kbGVyCiAJCQkgKi8KIAkJCXJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyID0gTlVMTDsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaGFuZGxlcl9vYmopOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKIAogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KQEAgLTU2NSwxNCArNTYyLDEzIEBACiAKIAkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIHJlZ2lvbiB3YXMgbm90IGluIHRoZSBoYW5kbGVyJ3MgcmVnaW9uIGxpc3QgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkiQ2Fubm90IHJlbW92ZSByZWdpb24gJXAgZnJvbSBhZGRyZXNzIGhhbmRsZXIgJXBcbiIsCi0JCXJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCSAgIkNhbm5vdCByZW1vdmUgcmVnaW9uICVwIGZyb20gYWRkcmVzcyBoYW5kbGVyICVwXG4iLAorCQkJICByZWdpb25fb2JqLCBoYW5kbGVyX29iaikpOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9hdHRhY2hfcmVnaW9uCkBAIC01ODksMjAgKzU4NSwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfYXR0YWNoX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbnNfaXNfbG9ja2VkKQorYWNwaV9ldl9hdHRhY2hfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkgICAgICB1OCBhY3BpX25zX2lzX2xvY2tlZCkKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9hdHRhY2hfcmVnaW9uIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfYXR0YWNoX3JlZ2lvbiIpOwogCi0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJIkFkZGluZyBSZWdpb24gWyU0LjRzXSAlcCB0byBhZGRyZXNzIGhhbmRsZXIgJXAgWyVzXVxuIiwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24ubm9kZSksCi0JCXJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqLAotCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJBZGRpbmcgUmVnaW9uIFslNC40c10gJXAgdG8gYWRkcmVzcyBoYW5kbGVyICVwIFslc11cbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZWdpb25fb2JqLT5yZWdpb24ubm9kZSksCisJCQkgIHJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqLAorCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkgIHNwYWNlX2lkKSkpOwogCiAJLyogTGluayB0aGlzIHJlZ2lvbiB0byB0aGUgZnJvbnQgb2YgdGhlIGhhbmRsZXIncyBsaXN0ICovCiAKQEAgLTYxMiwxNiArNjA3LDE1IEBACiAJLyogSW5zdGFsbCB0aGUgcmVnaW9uJ3MgaGFuZGxlciAqLwogCiAJaWYgKHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQUxSRUFEWV9FWElTVFMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOwogCX0KIAogCXJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyID0gaGFuZGxlcl9vYmo7Ci0JYWNwaV91dF9hZGRfcmVmZXJlbmNlIChoYW5kbGVyX29iaik7CisJYWNwaV91dF9hZGRfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIKQEAgLTY0MCwyMyArNjM0LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX2V2X2luc3RhbGxfaGFuZGxlcihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5leHRfaGFuZGxlcl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X2hhbmRsZXJfb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fTkFNRSgiZXZfaW5zdGFsbF9oYW5kbGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJldl9pbnN0YWxsX2hhbmRsZXIiKTsKLQotCi0JaGFuZGxlcl9vYmogPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICopIGNvbnRleHQ7CisJaGFuZGxlcl9vYmogPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKWNvbnRleHQ7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC02NjYsNyArNjU1LDcgQEAKIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKG9ial9oYW5kbGUpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CkBAIC02NzYsMTQgKzY2NSwxMyBAQAogCSAqIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzCiAJICovCiAJaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICYmCi0JCShub2RlLT50eXBlICE9IEFDUElfVFlQRV9SRUdJT04pICYmCi0JCShub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKKwkgICAgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1JFR0lPTikgJiYgKG5vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkgewogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgaW50ZXJuYWwgb2JqZWN0ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKCFvYmpfZGVzYykgewogCQkvKiBObyBvYmplY3QsIGp1c3QgZXhpdCAqLwogCkBAIC02OTIsMTggKzY4MCwyMiBAQAogCiAJLyogRGV2aWNlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnQgdGhhbiByZWdpb25zICovCiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfREVWSUNFKSB7CisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfREVWSUNFKSB7CiAJCS8qIENoZWNrIGlmIHRoaXMgRGV2aWNlIGFscmVhZHkgaGFzIGEgaGFuZGxlciBmb3IgdGhpcyBhZGRyZXNzIHNwYWNlICovCiAKIAkJbmV4dF9oYW5kbGVyX29iaiA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKIAkJd2hpbGUgKG5leHRfaGFuZGxlcl9vYmopIHsKIAkJCS8qIEZvdW5kIGEgaGFuZGxlciwgaXMgaXQgZm9yIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2U/ICovCiAKLQkJCWlmIChuZXh0X2hhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJCSJGb3VuZCBoYW5kbGVyIGZvciByZWdpb24gWyVzXSBpbiBkZXZpY2UgJXAoJXApIGhhbmRsZXIgJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCksCi0JCQkJCW9ial9kZXNjLCBuZXh0X2hhbmRsZXJfb2JqLCBoYW5kbGVyX29iaikpOworCQkJaWYgKG5leHRfaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0KKwkJCSAgICBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJCQkgICJGb3VuZCBoYW5kbGVyIGZvciByZWdpb24gWyVzXSBpbiBkZXZpY2UgJXAoJXApIGhhbmRsZXIgJXBcbiIsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lCisJCQkJCQkgIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS4KKwkJCQkJCSAgIHNwYWNlX2lkKSwgb2JqX2Rlc2MsCisJCQkJCQkgIG5leHRfaGFuZGxlcl9vYmosCisJCQkJCQkgIGhhbmRsZXJfb2JqKSk7CiAKIAkJCQkvKgogCQkJCSAqIFNpbmNlIHRoZSBvYmplY3Qgd2UgZm91bmQgaXQgb24gd2FzIGEgZGV2aWNlLCB0aGVuIGl0CkBAIC03NDQsMTUgKzczNiwxNCBAQAogCSAqCiAJICogRmlyc3QgZGlzY29ubmVjdCByZWdpb24gZm9yIGFueSBwcmV2aW91cyBoYW5kbGVyIChpZiBhbnkpCiAJICovCi0JYWNwaV9ldl9kZXRhY2hfcmVnaW9uIChvYmpfZGVzYywgRkFMU0UpOworCWFjcGlfZXZfZGV0YWNoX3JlZ2lvbihvYmpfZGVzYywgRkFMU0UpOwogCiAJLyogQ29ubmVjdCB0aGUgcmVnaW9uIHRvIHRoZSBuZXcgaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9hdHRhY2hfcmVnaW9uIChoYW5kbGVyX29iaiwgb2JqX2Rlc2MsIEZBTFNFKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2F0dGFjaF9yZWdpb24oaGFuZGxlcl9vYmosIG9ial9kZXNjLCBGQUxTRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyCkBAIC03NzEsMzIgKzc2MiwyNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfYWRyX3NwYWNlX3R5cGUgICAgICAgICAgICAgc3BhY2VfaWQsCi0JYWNwaV9hZHJfc3BhY2VfaGFuZGxlciAgICAgICAgICBoYW5kbGVyLAotCWFjcGlfYWRyX3NwYWNlX3NldHVwICAgICAgICAgICAgc2V0dXAsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJCSAgICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXIsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV9zZXR1cCBzZXR1cCwgdm9pZCAqY29udGV4dCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwl1MTYgZmxhZ3MgPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIiKTsKIAogCS8qCiAJICogVGhpcyByZWdpc3RyYXRpb24gaXMgdmFsaWQgZm9yIG9ubHkgdGhlIHR5cGVzIGJlbG93CiAJICogYW5kIHRoZSByb290LiAgVGhpcyBpcyB3aGVyZSB0aGUgZGVmYXVsdCBoYW5kbGVycwogCSAqIGdldCBwbGFjZWQuCiAJICovCi0JaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICAgICAmJgotCQkobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUFJPQ0VTU09SKSAgJiYKLQkJKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpICAgICYmCi0JCShub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKKwlpZiAoKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKKwkgICAgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgJiYKKwkgICAgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpICYmIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQpAQCAtODA3LDMyICs3OTMsMzIgQEAKIAkJc3dpdGNoIChzcGFjZV9pZCkgewogCQljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlk6CiAJCQloYW5kbGVyID0gYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXI7Ci0JCQlzZXR1cCAgID0gYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cDsKKwkJCXNldHVwID0gYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgogCQkJaGFuZGxlciA9IGFjcGlfZXhfc3lzdGVtX2lvX3NwYWNlX2hhbmRsZXI7Ci0JCQlzZXR1cCAgID0gYWNwaV9ldl9pb19zcGFjZV9yZWdpb25fc2V0dXA7CisJCQlzZXR1cCA9IGFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHOgogCQkJaGFuZGxlciA9IGFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgICA9IGFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXA7CisJCQlzZXR1cCA9IGFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXA7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQURSX1NQQUNFX0NNT1M6CiAJCQloYW5kbGVyID0gYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXI7Ci0JCQlzZXR1cCAgID0gYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cDsKKwkJCXNldHVwID0gYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfUENJX0JBUl9UQVJHRVQ6CiAJCQloYW5kbGVyID0gYWNwaV9leF9wY2lfYmFyX3NwYWNlX2hhbmRsZXI7Ci0JCQlzZXR1cCAgID0gYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cDsKKwkJCXNldHVwID0gYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRToKIAkJCWhhbmRsZXIgPSBhY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlcjsKLQkJCXNldHVwICAgPSBOVUxMOworCQkJc2V0dXAgPSBOVUxMOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTg0OSw3ICs4MzUsNyBAQAogCiAJLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmIChvYmpfZGVzYykgewogCQkvKgogCQkgKiBUaGUgYXR0YWNoZWQgZGV2aWNlIG9iamVjdCBhbHJlYWR5IGV4aXN0cy4KQEAgLTg2Myw3ICs4NDksOCBAQAogCQkJLyogU2FtZSBzcGFjZV9pZCBpbmRpY2F0ZXMgYSBoYW5kbGVyIGFscmVhZHkgaW5zdGFsbGVkICovCiAKIAkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBzcGFjZV9pZCkgewotCQkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyID09IGhhbmRsZXIpIHsKKwkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGFuZGxlciA9PQorCQkJCSAgICBoYW5kbGVyKSB7CiAJCQkJCS8qCiAJCQkJCSAqIEl0IGlzIChyZWxhdGl2ZWx5KSBPSyB0byBhdHRlbXB0IHRvIGluc3RhbGwgdGhlIFNBTUUKIAkJCQkJICogaGFuZGxlciB0d2ljZS4gVGhpcyBjYW4gZWFzaWx5IGhhcHBlbgpAQCAtODcxLDggKzg1OCw3IEBACiAJCQkJCSAqLwogCQkJCQlzdGF0dXMgPSBBRV9TQU1FX0hBTkRMRVI7CiAJCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJCX0KLQkJCQllbHNlIHsKKwkJCQl9IGVsc2UgewogCQkJCQkvKiBBIGhhbmRsZXIgaXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KIAogCQkJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKQEAgLTg4NCwyMSArODcwLDIwIEBACiAKIAkJCWhhbmRsZXJfb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dDsKIAkJfQotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCQkiQ3JlYXRpbmcgb2JqZWN0IG9uIERldmljZSAlcCB3aGlsZSBpbnN0YWxsaW5nIGhhbmRsZXJcbiIsIG5vZGUpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJCSAgIkNyZWF0aW5nIG9iamVjdCBvbiBEZXZpY2UgJXAgd2hpbGUgaW5zdGFsbGluZyBoYW5kbGVyXG4iLAorCQkJCSAgbm9kZSkpOwogCiAJCS8qIG9ial9kZXNjIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgb25lICovCiAKIAkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0FOWSkgewogCQkJdHlwZSA9IEFDUElfVFlQRV9ERVZJQ0U7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQl0eXBlID0gbm9kZS0+dHlwZTsKIAkJfQogCi0JCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICh0eXBlKTsKKwkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QodHlwZSk7CiAJCWlmICghb2JqX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtOTEwLDIxICs4OTUsMjEgQEAKIAogCQkvKiBBdHRhY2ggdGhlIG5ldyBvYmplY3QgdG8gdGhlIE5vZGUgKi8KIAotCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIG9ial9kZXNjLCB0eXBlKTsKKwkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCB0eXBlKTsKIAogCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJIkluc3RhbGxpbmcgYWRkcmVzcyBoYW5kbGVyIGZvciByZWdpb24gJXMoJVgpIG9uIERldmljZSAlNC40cyAlcCglcClcbiIsCi0JCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChzcGFjZV9pZCksIHNwYWNlX2lkLAotCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpLCBub2RlLCBvYmpfZGVzYykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJJbnN0YWxsaW5nIGFkZHJlc3MgaGFuZGxlciBmb3IgcmVnaW9uICVzKCVYKSBvbiBEZXZpY2UgJTQuNHMgJXAoJXApXG4iLAorCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksIHNwYWNlX2lkLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUsIG9ial9kZXNjKSk7CiAKIAkvKgogCSAqIEluc3RhbGwgdGhlIGhhbmRsZXIKQEAgLTkzMyw3ICs5MTgsOCBAQAogCSAqIEp1c3QgYWxsb2NhdGUgdGhlIG9iamVjdCBmb3IgdGhlIGhhbmRsZXIgYW5kIGxpbmsgaXQKIAkgKiBpbnRvIHRoZSBsaXN0LgogCSAqLwotCWhhbmRsZXJfb2JqID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTE9DQUxfQUREUkVTU19IQU5ETEVSKTsKKwloYW5kbGVyX29iaiA9CisJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfQUREUkVTU19IQU5ETEVSKTsKIAlpZiAoIWhhbmRsZXJfb2JqKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC05NDEsMTcgKzkyNywxNyBAQAogCiAJLyogSW5pdCBoYW5kbGVyIG9iaiAqLwogCi0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgID0gKHU4KSBzcGFjZV9pZDsKLQloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oZmxhZ3MgICAgPSBmbGFnczsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9ICh1OCkgc3BhY2VfaWQ7CisJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGZsYWdzID0gZmxhZ3M7CiAJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QgPSBOVUxMOwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGUgICAgICA9IG5vZGU7Ci0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGFuZGxlciAgID0gaGFuZGxlcjsKLQloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5jb250ZXh0ICAgPSBjb250ZXh0OwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNldHVwICAgICA9IHNldHVwOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGUgPSBub2RlOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPSBoYW5kbGVyOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQgPSBjb250ZXh0OworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNldHVwID0gc2V0dXA7CiAKIAkvKiBJbnN0YWxsIGF0IGhlYWQgb2YgRGV2aWNlLmFkZHJlc3Nfc3BhY2UgbGlzdCAqLwogCi0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dCAgICAgID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5leHQgPSBvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7CiAKIAkvKgogCSAqIFRoZSBEZXZpY2Ugb2JqZWN0IGlzIHRoZSBmaXJzdCByZWZlcmVuY2Ugb24gdGhlIGhhbmRsZXJfb2JqLgpAQCAtOTcxLDE1ICs5NTcsMTUgQEAKIAkgKiBJbiBlaXRoZXIgY2FzZSwgYmFjayB1cCBhbmQgc2VhcmNoIGRvd24gdGhlIHJlbWFpbmRlcgogCSAqIG9mIHRoZSBicmFuY2gKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIChBQ1BJX1RZUEVfQU5ZLCBub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCi0JCQkgIEFDUElfTlNfV0FMS19VTkxPQ0ssIGFjcGlfZXZfaW5zdGFsbF9oYW5kbGVyLAotCQkJICBoYW5kbGVyX29iaiwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCisJCQkJCUFDUElfTlNfV0FMS19VTkxPQ0ssCisJCQkJCWFjcGlfZXZfaW5zdGFsbF9oYW5kbGVyLCBoYW5kbGVyX29iaiwKKwkJCQkJTlVMTCk7CiAKLXVubG9ja19hbmRfZXhpdDoKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzCkBAIC05OTUsMTUgKzk4MSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkKQorYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyIpOwogCiAJLyoKIAkgKiBSdW4gYWxsIF9SRUcgbWV0aG9kcyBmb3IgYWxsIE9wZXJhdGlvbiBSZWdpb25zIGZvciB0aGlzCkBAIC0xMDEyLDE0ICs5OTUsMTMgQEAKIAkgKiBtdXN0IGJlIGluc3RhbGxlZCBmb3IgYWxsIHJlZ2lvbnMgb2YgdGhpcyBTcGFjZSBJRCBiZWZvcmUgd2UKIAkgKiBjYW4gcnVuIGFueSBfUkVHIG1ldGhvZHMpCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX0FOWSwgbm9kZSwgQUNQSV9VSU5UMzJfTUFYLAotCQkJICBBQ1BJX05TX1dBTEtfVU5MT0NLLCBhY3BpX2V2X3JlZ19ydW4sCi0JCQkgICZzcGFjZV9pZCwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCisJCQkJCUFDUElfTlNfV0FMS19VTkxPQ0ssIGFjcGlfZXZfcmVnX3J1biwKKwkJCQkJJnNwYWNlX2lkLCBOVUxMKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3JlZ19ydW4KQEAgLTEwMzEsMjMgKzEwMTMsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9yZWdfcnVuICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX2V2X3JlZ19ydW4oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0Jc3BhY2VfaWQgPSAqQUNQSV9DQVNUX1BUUiAoYWNwaV9hZHJfc3BhY2VfdHlwZSwgY29udGV4dCk7CisJc3BhY2VfaWQgPSAqQUNQSV9DQVNUX1BUUihhY3BpX2Fkcl9zcGFjZV90eXBlLCBjb250ZXh0KTsKIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKG9ial9oYW5kbGUpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CkBAIC0xMDU2LDE0ICsxMDM0LDEzIEBACiAJICogV2Ugb25seSBjYXJlIGFib3V0IHJlZ2lvbnMuYW5kIG9iamVjdHMKIAkgKiB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgYWRkcmVzcyBzcGFjZSBoYW5kbGVycwogCSAqLwotCWlmICgobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSAmJgotCQkobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CisJaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9SRUdJT04pICYmIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCiAJLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJLyogTm8gb2JqZWN0LCBqdXN0IGV4aXQgKi8KIApAQCAtMTA4MCw3ICsxMDU3LDYgQEAKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QgKG9ial9kZXNjLCAxKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZChvYmpfZGVzYywgMSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKaW5kZXggOTViYzA5Yy4uYTFiZDJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYwpAQCAtNDEsMTQgKzQxLDEyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnJnbmluaSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV2cmduaW5pIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NCwzNCArNjIsMzEgQEAKICAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHN5c3RlbV9tZW1vcnkgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpCithY3BpX2V2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCQkgICB1MzIgZnVuY3Rpb24sCisJCQkJICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX2Rlc2MgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBoYW5kbGU7Ci0Jc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgICAqbG9jYWxfcmVnaW9uX2NvbnRleHQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX2Rlc2MgPQorCSAgICAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKWhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCAqbG9jYWxfcmVnaW9uX2NvbnRleHQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAiKTsKIAogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCWlmICgqcmVnaW9uX2NvbnRleHQpIHsKLQkJCUFDUElfTUVNX0ZSRUUgKCpyZWdpb25fY29udGV4dCk7CisJCQlBQ1BJX01FTV9GUkVFKCpyZWdpb25fY29udGV4dCk7CiAJCQkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwogCQl9Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIENyZWF0ZSBhIG5ldyBjb250ZXh0ICovCiAKLQlsb2NhbF9yZWdpb25fY29udGV4dCA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCkpOworCWxvY2FsX3JlZ2lvbl9jb250ZXh0ID0KKwkgICAgQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCkpOwogCWlmICghKGxvY2FsX3JlZ2lvbl9jb250ZXh0KSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIFNhdmUgdGhlIHJlZ2lvbiBsZW5ndGggYW5kIGFkZHJlc3MgZm9yIHVzZSBpbiB0aGUgaGFuZGxlciAqLwpAQCAtMTAwLDEwICs5NSw5IEBACiAJbG9jYWxfcmVnaW9uX2NvbnRleHQtPmFkZHJlc3MgPSByZWdpb25fZGVzYy0+cmVnaW9uLmFkZHJlc3M7CiAKIAkqcmVnaW9uX2NvbnRleHQgPSBsb2NhbF9yZWdpb25fY29udGV4dDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwCkBAIC0xMjAsMjYgKzExNCwyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpCithY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pb19zcGFjZV9yZWdpb25fc2V0dXAiKTsKIAogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCSpyZWdpb25fY29udGV4dCA9IGhhbmRsZXJfY29udGV4dDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAKQEAgLTE1OCwyNCArMTQ3LDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJdTMyIGZ1bmN0aW9uLAorCQkJCXZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBwY2lfdmFsdWU7Ci0Jc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqcGNpX2lkID0gKnJlZ2lvbl9jb250ZXh0OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBjaV9yb290X25vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgKikgaGFuZGxlOwotCXN0cnVjdCBhY3BpX2RldmljZV9pZCAgICAgICAgICAgb2JqZWN0X2hJRDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2ludGVnZXIgcGNpX3ZhbHVlOworCXN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkID0gKnJlZ2lvbl9jb250ZXh0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGNpX3Jvb3Rfbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqID0KKwkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlX2lkIG9iamVjdF9oSUQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAiKTsKIAogCWhhbmRsZXJfb2JqID0gcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXI7CiAJaWYgKCFoYW5kbGVyX29iaikgewpAQCAtMTgzLDIwICsxNjksMjEgQEAKIAkJICogTm8gaW5zdGFsbGVkIGhhbmRsZXIuIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHRoZSBkaXNwYXRjaAogCQkgKiByb3V0aW5lIGNoZWNrcyBiZWZvcmUgd2UgZ2V0IGhlcmUsIGJ1dCB3ZSBjaGVjayBhZ2FpbiBqdXN0IGluIGNhc2UuCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJCSJBdHRlbXB0aW5nIHRvIGluaXQgYSByZWdpb24gJXAsIHdpdGggbm8gaGFuZGxlclxuIiwgcmVnaW9uX29iaikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJICAiQXR0ZW1wdGluZyB0byBpbml0IGEgcmVnaW9uICVwLCB3aXRoIG5vIGhhbmRsZXJcbiIsCisJCQkJICByZWdpb25fb2JqKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAogCSpyZWdpb25fY29udGV4dCA9IE5VTEw7CiAJaWYgKGZ1bmN0aW9uID09IEFDUElfUkVHSU9OX0RFQUNUSVZBVEUpIHsKIAkJaWYgKHBjaV9pZCkgewotCQkJQUNQSV9NRU1fRlJFRSAocGNpX2lkKTsKKwkJCUFDUElfTUVNX0ZSRUUocGNpX2lkKTsKIAkJfQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKTsKKwlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKTsKIAogCS8qCiAJICogR2V0IHRoZSBfU0VHIGFuZCBfQkJOIHZhbHVlcyBmcm9tIHRoZSBkZXZpY2UgdXBvbiB3aGljaCB0aGUgaGFuZGxlcgpAQCAtMjE2LDE4ICsyMDMsMjggQEAKIAogCQlwY2lfcm9vdF9ub2RlID0gcGFyZW50X25vZGU7CiAJCXdoaWxlIChwY2lfcm9vdF9ub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRCAocGNpX3Jvb3Rfbm9kZSwgJm9iamVjdF9oSUQpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJCS8qIEdvdCBhIHZhbGlkIF9ISUQsIGNoZWNrIGlmIHRoaXMgaXMgYSBQQ0kgcm9vdCAqLwotCi0JCQkJaWYgKCEoQUNQSV9TVFJOQ01QIChvYmplY3RfaElELnZhbHVlLCBQQ0lfUk9PVF9ISURfU1RSSU5HLAotCQkJCQkJICAgc2l6ZW9mIChQQ0lfUk9PVF9ISURfU1RSSU5HKSkpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfZXhlY3V0ZV9ISUQocGNpX3Jvb3Rfbm9kZSwgJm9iamVjdF9oSUQpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJLyoKKwkJCQkgKiBHb3QgYSB2YWxpZCBfSElEIHN0cmluZywgY2hlY2sgaWYgdGhpcyBpcyBhIFBDSSByb290LgorCQkJCSAqIE5ldyBmb3IgQUNQSSAzLjA6IGNoZWNrIGZvciBhIFBDSSBFeHByZXNzIHJvb3QgYWxzby4KKwkJCQkgKi8KKwkJCQlpZiAoIQorCQkJCSAgICAoQUNQSV9TVFJOQ01QCisJCQkJICAgICAob2JqZWN0X2hJRC52YWx1ZSwgUENJX1JPT1RfSElEX1NUUklORywKKwkJCQkgICAgICBzaXplb2YoUENJX1JPT1RfSElEX1NUUklORykpCisJCQkJICAgICB8fAorCQkJCSAgICAgIShBQ1BJX1NUUk5DTVAKKwkJCQkgICAgICAgKG9iamVjdF9oSUQudmFsdWUsCisJCQkJCVBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORywKKwkJCQkJc2l6ZW9mKFBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORykpKSkpCisJCQkJewogCQkJCQkvKiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgdGhpcyBQQ0kgcm9vdCBicmlkZ2UgKi8KIAotCQkJCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyICgoYWNwaV9oYW5kbGUpIHBjaV9yb290X25vZGUsCi0JCQkJCQkJICAgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRywKLQkJCQkJCQkgICBBQ1BJX0RFRkFVTFRfSEFORExFUiwgTlVMTCwgTlVMTCk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoKGFjcGlfaGFuZGxlKSBwY2lfcm9vdF9ub2RlLCBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHLCBBQ1BJX0RFRkFVTFRfSEFORExFUiwgTlVMTCwgTlVMTCk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQkJaWYgKHN0YXR1cyA9PSBBRV9TQU1FX0hBTkRMRVIpIHsKIAkJCQkJCQkvKgogCQkJCQkJCSAqIEl0IGlzIE9LIGlmIHRoZSBoYW5kbGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSByb290CkBAIC0yMzUsMjMgKzIzMiwxOSBAQAogCQkJCQkJCSAqIG5ldyBQQ0lfQ29uZmlnIG9wZXJhdGlvbiByZWdpb24sIGhvd2V2ZXIuCiAJCQkJCQkJICovCiAJCQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCQkJCQkiQ291bGQgbm90IGluc3RhbGwgcGNpX2NvbmZpZyBoYW5kbGVyIGZvciBSb290IEJyaWRnZSAlNC40cywgJXNcbiIsCi0JCQkJCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocGNpX3Jvb3Rfbm9kZSksIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBpbnN0YWxsIHBjaV9jb25maWcgaGFuZGxlciBmb3IgUm9vdCBCcmlkZ2UgJTQuNHMsICVzXG4iLCBhY3BpX3V0X2dldF9ub2RlX25hbWUocGNpX3Jvb3Rfbm9kZSksIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCi0JCQlwY2lfcm9vdF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHBjaV9yb290X25vZGUpOworCQkJcGNpX3Jvb3Rfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBjaV9yb290X25vZGUpOwogCQl9CiAKIAkJLyogUENJIHJvb3QgYnJpZGdlIG5vdCBmb3VuZCwgdXNlIG5hbWVzcGFjZSByb290IG5vZGUgKi8KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcGNpX3Jvb3Rfbm9kZSA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGU7CiAJfQogCkBAIC0yNjAsMTQgKzI1MywxNCBAQAogCSAqIChpbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciBjb3VsZCBoYXZlIGluaXRpYWxpemVkIGl0KQogCSAqLwogCWlmIChyZWdpb25fb2JqLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfU0VUVVBfQ09NUExFVEUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogUmVnaW9uIGlzIHN0aWxsIG5vdCBpbml0aWFsaXplZC4gQ3JlYXRlIGEgbmV3IGNvbnRleHQgKi8KIAotCXBjaV9pZCA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wY2lfaWQpKTsKKwlwY2lfaWQgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9pZCkpOwogCWlmICghcGNpX2lkKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyoKQEAgLTI3OSw0MCArMjcyLDQ1IEBACiAJICogR2V0IHRoZSBQQ0kgZGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXJzIGZyb20gdGhlIF9BRFIgb2JqZWN0CiAJICogY29udGFpbmVkIGluIHRoZSBwYXJlbnQncyBzY29wZS4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0IChNRVRIT0RfTkFNRV9fQURSLCBwYXJlbnRfbm9kZSwgJnBjaV92YWx1ZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChNRVRIT0RfTkFNRV9fQURSLCBwYXJlbnRfbm9kZSwKKwkJCQkJICAgICZwY2lfdmFsdWUpOwogCiAJLyoKIAkgKiBUaGUgZGVmYXVsdCBpcyB6ZXJvLCBhbmQgc2luY2UgdGhlIGFsbG9jYXRpb24gYWJvdmUgemVyb2VkCiAJICogdGhlIGRhdGEsIGp1c3QgZG8gbm90aGluZyBvbiBmYWlsdXJlLgogCSAqLwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJcGNpX2lkLT5kZXZpY2UgID0gQUNQSV9ISVdPUkQgKEFDUElfTE9EV09SRCAocGNpX3ZhbHVlKSk7Ci0JCXBjaV9pZC0+ZnVuY3Rpb24gPSBBQ1BJX0xPV09SRCAoQUNQSV9MT0RXT1JEIChwY2lfdmFsdWUpKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcGNpX2lkLT5kZXZpY2UgPSBBQ1BJX0hJV09SRChBQ1BJX0xPRFdPUkQocGNpX3ZhbHVlKSk7CisJCXBjaV9pZC0+ZnVuY3Rpb24gPSBBQ1BJX0xPV09SRChBQ1BJX0xPRFdPUkQocGNpX3ZhbHVlKSk7CiAJfQogCiAJLyogVGhlIFBDSSBzZWdtZW50IG51bWJlciBjb21lcyBmcm9tIHRoZSBfU0VHIG1ldGhvZCAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCAoTUVUSE9EX05BTUVfX1NFRywgcGNpX3Jvb3Rfbm9kZSwgJnBjaV92YWx1ZSk7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlwY2lfaWQtPnNlZ21lbnQgPSBBQ1BJX0xPV09SRCAocGNpX3ZhbHVlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19TRUcsIHBjaV9yb290X25vZGUsCisJCQkJCSAgICAmcGNpX3ZhbHVlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcGNpX2lkLT5zZWdtZW50ID0gQUNQSV9MT1dPUkQocGNpX3ZhbHVlKTsKIAl9CiAKIAkvKiBUaGUgUENJIGJ1cyBudW1iZXIgY29tZXMgZnJvbSB0aGUgX0JCTiBtZXRob2QgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QgKE1FVEhPRF9OQU1FX19CQk4sIHBjaV9yb290X25vZGUsICZwY2lfdmFsdWUpOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJcGNpX2lkLT5idXMgPSBBQ1BJX0xPV09SRCAocGNpX3ZhbHVlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19CQk4sIHBjaV9yb290X25vZGUsCisJCQkJCSAgICAmcGNpX3ZhbHVlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcGNpX2lkLT5idXMgPSBBQ1BJX0xPV09SRChwY2lfdmFsdWUpOwogCX0KIAogCS8qIENvbXBsZXRlIHRoaXMgZGV2aWNlJ3MgcGNpX2lkICovCiAKLQlhY3BpX29zX2Rlcml2ZV9wY2lfaWQgKHBjaV9yb290X25vZGUsIHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlLCAmcGNpX2lkKTsKKwlhY3BpX29zX2Rlcml2ZV9wY2lfaWQocGNpX3Jvb3Rfbm9kZSwgcmVnaW9uX29iai0+cmVnaW9uLm5vZGUsICZwY2lfaWQpOwogCiAJKnJlZ2lvbl9jb250ZXh0ID0gcGNpX2lkOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cApAQCAtMzMxLDE5ICszMjksMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3BjaV9iYXJfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpCithY3BpX2V2X3BjaV9iYXJfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cCIpOwogCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfY21vc19yZWdpb25fc2V0dXAKQEAgLTM2MiwxOSArMzU2LDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgIHUzMiBmdW5jdGlvbiwKKwkJCSAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X2Ntb3NfcmVnaW9uX3NldHVwIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY21vc19yZWdpb25fc2V0dXAiKTsKIAotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwCkBAIC0zOTEsMjYgKzM4MSwyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dCkKK2FjcGlfZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJldl9kZWZhdWx0X3JlZ2lvbl9zZXR1cCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAiKTsKIAogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCSpyZWdpb25fY29udGV4dCA9IGhhbmRsZXJfY29udGV4dDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24KQEAgLTQzNCwzNyArNDE5LDM0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbnNfbG9ja2VkKQorYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkJICB1OCBhY3BpX25zX2xvY2tlZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX29iajsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGU7Ci0JYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAqcmVnX25hbWVfcHRyID0gKGFjcGlfbmFtZSAqKSBNRVRIT0RfTkFNRV9fUkVHOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmoyOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsKKwlhY3BpX25hbWUgKnJlZ19uYW1lX3B0ciA9IChhY3BpX25hbWUgKikgTUVUSE9EX05BTUVfX1JFRzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJldl9pbml0aWFsaXplX3JlZ2lvbiIsIGFjcGlfbnNfbG9ja2VkKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJldl9pbml0aWFsaXplX3JlZ2lvbiIsIGFjcGlfbnNfbG9ja2VkKTsKIAogCWlmICghcmVnaW9uX29iaikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJaWYgKHJlZ2lvbl9vYmotPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9PQkpFQ1RfSU5JVElBTElaRUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCi0JcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChyZWdpb25fb2JqKTsKKwlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7CiAJaWYgKCFyZWdpb25fb2JqMikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAotCW5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpOworCW5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShyZWdpb25fb2JqLT5yZWdpb24ubm9kZSk7CiAJc3BhY2VfaWQgPSByZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQ7CiAKIAkvKiBTZXR1cCBkZWZhdWx0cyAqLwpAQCAtNDc2LDkgKzQ1OCw5IEBACiAKIAkvKiBGaW5kIGFueSAiX1JFRyIgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlZ2lvbiBkZWZpbml0aW9uICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX3NlYXJjaF9ub2RlICgqcmVnX25hbWVfcHRyLCBub2RlLAotCQkJICBBQ1BJX1RZUEVfTUVUSE9ELCAmbWV0aG9kX25vZGUpOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX25zX3NlYXJjaF9ub2RlKCpyZWdfbmFtZV9wdHIsIG5vZGUsCisJCQkJICAgICBBQ1BJX1RZUEVfTUVUSE9ELCAmbWV0aG9kX25vZGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkvKgogCQkgKiBUaGUgX1JFRyBtZXRob2QgaXMgb3B0aW9uYWwgYW5kIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBwZXIgcmVnaW9uCiAJCSAqIGRlZmluaXRpb24uICBUaGlzIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgaGFuZGxlciBpcyBhdHRhY2hlZApAQCAtNDk1LDcgKzQ3Nyw3IEBACiAJCS8qIENoZWNrIHRvIHNlZSBpZiBhIGhhbmRsZXIgZXhpc3RzICovCiAKIAkJaGFuZGxlcl9vYmogPSBOVUxMOwotCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCQlpZiAob2JqX2Rlc2MpIHsKIAkJCS8qIENhbiBvbmx5IGJlIGEgaGFuZGxlciBpZiB0aGUgb2JqZWN0IGV4aXN0cyAqLwogCkBAIC01MjMsMzcgKzUwNSw1MCBAQAogCQkJd2hpbGUgKGhhbmRsZXJfb2JqKSB7CiAJCQkJLyogSXMgdGhpcyBoYW5kbGVyIG9mIHRoZSBjb3JyZWN0IHR5cGU/ICovCiAKLQkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0gc3BhY2VfaWQpIHsKKwkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0KKwkJCQkgICAgc3BhY2VfaWQpIHsKIAkJCQkJLyogRm91bmQgY29ycmVjdCBoYW5kbGVyICovCiAKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJCQkiRm91bmQgaGFuZGxlciAlcCBmb3IgcmVnaW9uICVwIGluIG9iaiAlcFxuIiwKLQkJCQkJCWhhbmRsZXJfb2JqLCByZWdpb25fb2JqLCBvYmpfZGVzYykpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJCQkJCSAgIkZvdW5kIGhhbmRsZXIgJXAgZm9yIHJlZ2lvbiAlcCBpbiBvYmogJXBcbiIsCisJCQkJCQkJICBoYW5kbGVyX29iaiwKKwkJCQkJCQkgIHJlZ2lvbl9vYmosCisJCQkJCQkJICBvYmpfZGVzYykpOwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfZXZfYXR0YWNoX3JlZ2lvbiAoaGFuZGxlcl9vYmosIHJlZ2lvbl9vYmosCi0JCQkJCQkJIGFjcGlfbnNfbG9ja2VkKTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfZXZfYXR0YWNoX3JlZ2lvbihoYW5kbGVyX29iaiwKKwkJCQkJCQkJICByZWdpb25fb2JqLAorCQkJCQkJCQkgIGFjcGlfbnNfbG9ja2VkKTsKIAogCQkJCQkvKgogCQkJCQkgKiBUZWxsIGFsbCB1c2VycyB0aGF0IHRoaXMgcmVnaW9uIGlzIHVzYWJsZSBieSBydW5uaW5nIHRoZSBfUkVHCiAJCQkJCSAqIG1ldGhvZAogCQkJCQkgKi8KIAkJCQkJaWYgKGFjcGlfbnNfbG9ja2VkKSB7Ci0JCQkJCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCQkJc3RhdHVzID0KKwkJCQkJCSAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgKKwkJCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCSAgICAoc3RhdHVzKTsKIAkJCQkJCX0KIAkJCQkJfQogCi0JCQkJCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kIChyZWdpb25fb2JqLCAxKTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kCisJCQkJCSAgICAocmVnaW9uX29iaiwgMSk7CiAKIAkJCQkJaWYgKGFjcGlfbnNfbG9ja2VkKSB7Ci0JCQkJCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCQkJc3RhdHVzID0KKwkJCQkJCSAgICBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgKKwkJCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCSAgICAoc3RhdHVzKTsKIAkJCQkJCX0KIAkJCQkJfQogCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQkJCX0KIAogCQkJCS8qIFRyeSBuZXh0IGhhbmRsZXIgaW4gdGhlIGxpc3QgKi8KQEAgLTU2NiwxNSArNTYxLDE1IEBACiAJCSAqIFRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSBoYW5kbGVyIHdlIG5lZWQ7CiAJCSAqIFBvcCB1cCBvbmUgbGV2ZWwKIAkJICovCi0JCW5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSk7CisJCW5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKIAl9CiAKIAkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhpcyByZWdpb24gKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX09QUkVHSU9OLAotCQkiTm8gaGFuZGxlciBmb3IgcmVnaW9uX3R5cGUgJXMoJVgpIChyZWdpb25fb2JqICVwKVxuIiwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHNwYWNlX2lkKSwgc3BhY2VfaWQsIHJlZ2lvbl9vYmopKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiTm8gaGFuZGxlciBmb3IgcmVnaW9uX3R5cGUgJXMoJVgpIChyZWdpb25fb2JqICVwKVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLCBzcGFjZV9pZCwKKwkJCSAgcmVnaW9uX29iaikpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRVhJU1QpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKaW5kZXggZjMxMjNjMi4uMTQxODM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYwpAQCAtNDUsMTYgKzQ1LDExIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZzY2kiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXZzY2kiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB1MzIgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCitzdGF0aWMgdTMyIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIodm9pZCAqY29udGV4dCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksMTcgKzY0LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK3N0YXRpYyB1MzIgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcih2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9oYW5kbGVkID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7Ci0KKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2xpc3QgPSBjb250ZXh0OworCXUzMiBpbnRlcnJ1cHRfaGFuZGxlZCA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfc2NpX3hydXB0X2hhbmRsZXIiKTsKIAotCiAJLyoKIAkgKiBXZSBhcmUgZ3VhcmFudGVlZCBieSB0aGUgQUNQSSBDQSBpbml0aWFsaXphdGlvbi9zaHV0ZG93biBjb2RlIHRoYXQKIAkgKiBpZiB0aGlzIGludGVycnVwdCBoYW5kbGVyIGlzIGluc3RhbGxlZCwgQUNQSSBpcyBlbmFibGVkLgpAQCAtODksMTggKzgwLDE3IEBACiAJICogRml4ZWQgRXZlbnRzOgogCSAqIENoZWNrIGZvciBhbmQgZGlzcGF0Y2ggYW55IEZpeGVkIEV2ZW50cyB0aGF0IGhhdmUgb2NjdXJyZWQKIAkgKi8KLQlpbnRlcnJ1cHRfaGFuZGxlZCB8PSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2RldGVjdCAoKTsKKwlpbnRlcnJ1cHRfaGFuZGxlZCB8PSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2RldGVjdCgpOwogCiAJLyoKIAkgKiBHZW5lcmFsIFB1cnBvc2UgRXZlbnRzOgogCSAqIENoZWNrIGZvciBhbmQgZGlzcGF0Y2ggYW55IEdQRXMgdGhhdCBoYXZlIG9jY3VycmVkCiAJICovCi0JaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9ncGVfZGV0ZWN0IChncGVfeHJ1cHRfbGlzdCk7CisJaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9ncGVfZGV0ZWN0KGdwZV94cnVwdF9saXN0KTsKIAotCXJldHVybl9WQUxVRSAoaW50ZXJydXB0X2hhbmRsZWQpOworCXJldHVybl9WQUxVRShpbnRlcnJ1cHRfaGFuZGxlZCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcgpAQCAtMTEzLDE3ICsxMDMsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIgQUNQSV9TWVNURU1fWEZBQ0UKLWFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCit1MzIgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcih2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9oYW5kbGVkID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7Ci0KKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2xpc3QgPSBjb250ZXh0OworCXUzMiBpbnRlcnJ1cHRfaGFuZGxlZCA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZ3BlX3hydXB0X2hhbmRsZXIiKTsKIAotCiAJLyoKIAkgKiBXZSBhcmUgZ3VhcmFudGVlZCBieSB0aGUgQUNQSSBDQSBpbml0aWFsaXphdGlvbi9zaHV0ZG93biBjb2RlIHRoYXQKIAkgKiBpZiB0aGlzIGludGVycnVwdCBoYW5kbGVyIGlzIGluc3RhbGxlZCwgQUNQSSBpcyBlbmFibGVkLgpAQCAtMTMzLDEyICsxMTksMTEgQEAKIAkgKiBHUEVzOgogCSAqIENoZWNrIGZvciBhbmQgZGlzcGF0Y2ggYW55IEdQRXMgdGhhdCBoYXZlIG9jY3VycmVkCiAJICovCi0JaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9ncGVfZGV0ZWN0IChncGVfeHJ1cHRfbGlzdCk7CisJaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9ncGVfZGV0ZWN0KGdwZV94cnVwdF9saXN0KTsKIAotCXJldHVybl9WQUxVRSAoaW50ZXJydXB0X2hhbmRsZWQpOworCXJldHVybl9WQUxVRShpbnRlcnJ1cHRfaGFuZGxlZCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIKQEAgLTE1MSwyMiArMTM2LDE4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCi1hY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIgKAotCXZvaWQpCit1MzIgYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyKHZvaWQpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgc3RhdHVzID0gQUVfT0s7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX3NjaV9oYW5kbGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfaW5zdGFsbF9zY2lfaGFuZGxlciIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIgKCh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsCi0JCQkgICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyLCBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKCh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsCisJCQkJCQkgICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyLAorCQkJCQkJICAgYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlcgpAQCAtMTg2LDIyICsxNjcsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlcih2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV2X3JlbW92ZV9zY2lfaGFuZGxlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfcmVtb3ZlX3NjaV9oYW5kbGVyIik7CiAKIAkvKiBKdXN0IGxldCB0aGUgT1MgcmVtb3ZlIHRoZSBoYW5kbGVyIGFuZCBkaXNhYmxlIHRoZSBsZXZlbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIgKCh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnNjaV9pbnQsCi0JCQkgICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyKTsKKwlzdGF0dXMgPSBhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcigodTMyKSBhY3BpX2dibF9GQURULT5zY2lfaW50LAorCQkJCQkJICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCmluZGV4IDQwOTJkNDcuLjQzYjMzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCkBAIC00OSw4ICs0OSw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2eGZhY2UiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJldnhmYWNlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NCwyMSArNjMsMTYgQEAKICAqIERFU0NSSVBUSU9OOiBTYXZlcyB0aGUgcG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlciAoCi0JYWNwaV9leGNlcHRpb25faGFuZGxlciAgICAgICAgICBoYW5kbGVyKQorYWNwaV9zdGF0dXMgYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyKGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgaGFuZGxlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEb24ndCBhbGxvdyB0d28gaGFuZGxlcnMuICovCkBAIC05MiwxMiArODYsMTEgQEAKIAogCWFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyID0gaGFuZGxlcjsKIAotY2xlYW51cDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQorI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMTYsMjYgKzEwOSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCWFjcGlfZXZlbnRfaGFuZGxlciAgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIodTMyIGV2ZW50LAorCQkJCSBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEb24ndCBhbGxvdyB0d28gaGFuZGxlcnMuICovCkBAIC0xNTAsMjkgKzEzOSwyOSBAQAogCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyID0gaGFuZGxlcjsKIAlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uY29udGV4dCA9IGNvbnRleHQ7CiAKLQlzdGF0dXMgPSBhY3BpX2NsZWFyX2V2ZW50IChldmVudCk7CisJc3RhdHVzID0gYWNwaV9jbGVhcl9ldmVudChldmVudCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQlzdGF0dXMgPSBhY3BpX2VuYWJsZV9ldmVudCAoZXZlbnQsIDApOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgIkNvdWxkIG5vdCBlbmFibGUgZml4ZWQgZXZlbnQuXG4iKSk7CisJCXN0YXR1cyA9IGFjcGlfZW5hYmxlX2V2ZW50KGV2ZW50LCAwKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIkNvdWxkIG5vdCBlbmFibGUgZml4ZWQgZXZlbnQuXG4iKSk7CiAKIAkJLyogUmVtb3ZlIHRoZSBoYW5kbGVyICovCiAKIAkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIgPSBOVUxMOwogCQlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uY29udGV4dCA9IE5VTEw7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJIkVuYWJsZWQgZml4ZWQgZXZlbnQgJVgsIEhhbmRsZXI9JXBcbiIsIGV2ZW50LCBoYW5kbGVyKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkVuYWJsZWQgZml4ZWQgZXZlbnQgJVgsIEhhbmRsZXI9JXBcbiIsIGV2ZW50LAorCQkJCSAgaGFuZGxlcikpOwogCX0KIAotCi1jbGVhbnVwOgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgY2xlYW51cDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xODgsNDkgKzE3Nyw0NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICBoYW5kbGVyKQorYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcih1MzIgZXZlbnQsIGFjcGlfZXZlbnRfaGFuZGxlciBoYW5kbGVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRGlzYWJsZSB0aGUgZXZlbnQgYmVmb3JlIHJlbW92aW5nIHRoZSBoYW5kbGVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQgKGV2ZW50LCAwKTsKKwlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQoZXZlbnQsIDApOwogCiAJLyogQWx3YXlzIFJlbW92ZSB0aGUgaGFuZGxlciAqLwogCiAJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIgPSBOVUxMOwogCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5jb250ZXh0ID0gTlVMTDsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwKLQkJCSJDb3VsZCBub3Qgd3JpdGUgdG8gZml4ZWQgZXZlbnQgZW5hYmxlIHJlZ2lzdGVyLlxuIikpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIkRpc2FibGVkIGZpeGVkIGV2ZW50ICVYLlxuIiwgZXZlbnQpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIkNvdWxkIG5vdCB3cml0ZSB0byBmaXhlZCBldmVudCBlbmFibGUgcmVnaXN0ZXIuXG4iKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGlzYWJsZWQgZml4ZWQgZXZlbnQgJVguXG4iLAorCQkJCSAgZXZlbnQpKTsKIAl9CiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcik7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjUxLDM3ICsyMzYsMzIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl90eXBlLAotCWFjcGlfbm90aWZ5X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKKwkJCSAgICB1MzIgaGFuZGxlcl90eXBlLAorCQkJICAgIGFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpub3RpZnlfb2JqOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbm90aWZ5X29iajsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAotCWlmICgoIWRldmljZSkgIHx8Ci0JCSghaGFuZGxlcikgfHwKLQkJKGhhbmRsZXJfdHlwZSA+IEFDUElfTUFYX05PVElGWV9IQU5ETEVSX1RZUEUpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKCghZGV2aWNlKSB8fAorCSAgICAoIWhhbmRsZXIpIHx8IChoYW5kbGVyX3R5cGUgPiBBQ1BJX01BWF9OT1RJRllfSEFORExFUl9UWVBFKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChkZXZpY2UpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTI5NywyMSArMjc3LDIxIEBACiAJCS8qIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQgKi8KIAogCQlpZiAoKChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpICYmCi0JCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyKSAgICAgfHwKLQkJCSgoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSAmJgotCQkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlcikpIHsKKwkJICAgICBhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIpIHx8CisJCSAgICAoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKKwkJICAgICBhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIpKSB7CiAJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKIAkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgewotCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5ub2RlICA9IG5vZGU7CisJCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5Lm5vZGUgPSBub2RlOwogCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyID0gaGFuZGxlcjsKIAkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuY29udGV4dCA9IGNvbnRleHQ7CiAJCX0KIAogCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSB7Ci0JCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5Lm5vZGUgID0gbm9kZTsKKwkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkubm9kZSA9IG5vZGU7CiAJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBoYW5kbGVyOwogCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5jb250ZXh0ID0gY29udGV4dDsKIAkJfQpAQCAtMzI3LDI5ICszMDcsMjggQEAKIAllbHNlIHsKIAkJLyogTm90aWZpZXMgYWxsb3dlZCBvbiB0aGlzIG9iamVjdD8gKi8KIAotCQlpZiAoIWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdCAobm9kZSkpIHsKKwkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qobm9kZSkpIHsKIAkJCXN0YXR1cyA9IEFFX1RZUEU7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KIAotCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCQlpZiAob2JqX2Rlc2MpIHsKIAkJCS8qIE9iamVjdCBleGlzdHMgLSBtYWtlIHN1cmUgdGhlcmUncyBubyBoYW5kbGVyICovCiAKIAkJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKLQkJCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeSkgfHwKLQkJCQkoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKLQkJCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuZGV2aWNlX25vdGlmeSkpIHsKKwkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeSkgfHwKKwkJCSAgICAoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKKwkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuZGV2aWNlX25vdGlmeSkpIHsKIAkJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKIAkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIENyZWF0ZSBhIG5ldyBvYmplY3QgKi8KIAotCQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKG5vZGUtPnR5cGUpOworCQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3Qobm9kZS0+dHlwZSk7CiAJCQlpZiAoIW9ial9kZXNjKSB7CiAJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMzU3LDI1ICszMzYsMjcgQEAKIAogCQkJLyogQXR0YWNoIG5ldyBvYmplY3QgdG8gdGhlIE5vZGUgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChkZXZpY2UsIG9ial9kZXNjLCBub2RlLT50eXBlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KGRldmljZSwgb2JqX2Rlc2MsIG5vZGUtPnR5cGUpOwogCiAJCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCQl9CiAJCX0KIAogCQkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyICovCiAKLQkJbm90aWZ5X29iaiA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0xPQ0FMX05PVElGWSk7CisJCW5vdGlmeV9vYmogPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9OT1RJRlkpOwogCQlpZiAoIW5vdGlmeV9vYmopIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKLQkJbm90aWZ5X29iai0+bm90aWZ5Lm5vZGUgICA9IG5vZGU7CisJCW5vdGlmeV9vYmotPm5vdGlmeS5ub2RlID0gbm9kZTsKIAkJbm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgPSBoYW5kbGVyOwogCQlub3RpZnlfb2JqLT5ub3RpZnkuY29udGV4dCA9IGNvbnRleHQ7CiAKQEAgLTM5MCwxNyArMzcxLDE2IEBACiAJCWlmIChoYW5kbGVyX3R5cGUgPT0gQUNQSV9BTExfTk9USUZZKSB7CiAJCQkvKiBFeHRyYSByZWYgaWYgaW5zdGFsbGVkIGluIGJvdGggKi8KIAotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChub3RpZnlfb2JqKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShub3RpZnlfb2JqKTsKIAkJfQogCX0KIAotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcik7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00MjAsMzYgKzQwMCwzMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfdHlwZSwKLQlhY3BpX25vdGlmeV9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIpCithY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkgICB1MzIgaGFuZGxlcl90eXBlLCBhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbm90aWZ5X29iajsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5vdGlmeV9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCi0JaWYgKCghZGV2aWNlKSAgfHwKLQkJKCFoYW5kbGVyKSB8fAotCQkoaGFuZGxlcl90eXBlID4gQUNQSV9NQVhfTk9USUZZX0hBTkRMRVJfVFlQRSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwlpZiAoKCFkZXZpY2UpIHx8CisJICAgICghaGFuZGxlcikgfHwgKGhhbmRsZXJfdHlwZSA+IEFDUElfTUFYX05PVElGWV9IQU5ETEVSX1RZUEUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGRldmljZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGRldmljZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNDU4LDM0ICs0MzMsMzQgQEAKIAkvKiBSb290IE9iamVjdCAqLwogCiAJaWYgKGRldmljZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIgZm9yIFJPT1Qgb2JqZWN0LlxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIgZm9yIFJPT1Qgb2JqZWN0LlxuIikpOwogCiAJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKLQkJCSAgIWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgICAgICB8fAotCQkJKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCi0JCQkgICFhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIpKSB7CisJCSAgICAgIWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgfHwKKwkJICAgICgoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSAmJgorCQkgICAgICFhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIpKSB7CiAJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLwogCi0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCQlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOwotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLSAJCX0KKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KIAogCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSB7Ci0JCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5Lm5vZGUgID0gTlVMTDsKKwkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkubm9kZSA9IE5VTEw7CiAJCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIgPSBOVUxMOwogCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5jb250ZXh0ID0gTlVMTDsKIAkJfQogCiAJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpIHsKLQkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkubm9kZSAgPSBOVUxMOworCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5ub2RlID0gTlVMTDsKIAkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlciA9IE5VTEw7CiAJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmNvbnRleHQgPSBOVUxMOwogCQl9CkBAIC00OTYsMTQgKzQ3MSwxNCBAQAogCWVsc2UgewogCQkvKiBOb3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLwogCi0JCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0IChub2RlKSkgeworCQlpZiAoIWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdChub2RlKSkgewogCQkJc3RhdHVzID0gQUVfVFlQRTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKIAkJLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLwogCi0JCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJCWlmICghb2JqX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNTE0LDUzICs0ODksNTIgQEAKIAkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgewogCQkJbm90aWZ5X29iaiA9IG9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnk7CiAJCQlpZiAoKCFub3RpZnlfb2JqKSB8fAotCQkJCSAobm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgIT0gaGFuZGxlcikpIHsKKwkJCSAgICAobm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgIT0gaGFuZGxlcikpIHsKIAkJCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCQkJLyogTWFrZSBzdXJlIGFsbCBkZWZlcnJlZCB0YXNrcyBhcmUgY29tcGxldGVkICovCiAKLQkJCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAkJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7Ci0JCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotIAkJCX0KKwkJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CiAKIAkJCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLwogCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeSA9IE5VTEw7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG5vdGlmeV9vYmopOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG5vdGlmeV9vYmopOwogCQl9CiAKIAkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgewogCQkJbm90aWZ5X29iaiA9IG9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnk7CiAJCQlpZiAoKCFub3RpZnlfb2JqKSB8fAotCQkJCSAobm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgIT0gaGFuZGxlcikpIHsKKwkJCSAgICAobm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgIT0gaGFuZGxlcikpIHsKIAkJCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCQkJLyogTWFrZSBzdXJlIGFsbCBkZWZlcnJlZCB0YXNrcyBhcmUgY29tcGxldGVkICovCiAKLQkJCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAkJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7Ci0JCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotIAkJCX0KKwkJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CiAKIAkJCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLwogCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuZGV2aWNlX25vdGlmeSA9IE5VTEw7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG5vdGlmeV9vYmopOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG5vdGlmeV9vYmopOwogCQl9CiAJfQogCi0KLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01ODEsMzUgKzU1NSwzMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICBhZGRyZXNzLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCSB1MzIgZ3BlX251bWJlciwKKwkJCSB1MzIgdHlwZSwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MsIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87Ci0Jc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvICAgICAgICAqaGFuZGxlcjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvICpoYW5kbGVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZmxhZ3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICgoIWFkZHJlc3MpIHx8ICh0eXBlID4gQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwogCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNjE3LDQ5ICs1ODcsNDkgQEAKIAogCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzbid0IGEgaGFuZGxlciB0aGVyZSBhbHJlYWR5ICovCiAKLQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09IEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKKwlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJICAgIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKIAkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEFsbG9jYXRlIGFuZCBpbml0IGhhbmRsZXIgb2JqZWN0ICovCiAKLQloYW5kbGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbykpOworCWhhbmRsZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbykpOwogCWlmICghaGFuZGxlcikgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAotCWhhbmRsZXItPmFkZHJlc3MgICAgPSBhZGRyZXNzOwotCWhhbmRsZXItPmNvbnRleHQgICAgPSBjb250ZXh0OworCWhhbmRsZXItPmFkZHJlc3MgPSBhZGRyZXNzOworCWhhbmRsZXItPmNvbnRleHQgPSBjb250ZXh0OwogCWhhbmRsZXItPm1ldGhvZF9ub2RlID0gZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlOwogCiAJLyogRGlzYWJsZSB0aGUgR1BFIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBoYW5kbGVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlIChncGVfZXZlbnRfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKIAkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyICovCiAKLQlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CiAJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIgPSBoYW5kbGVyOwogCiAJLyogU2V0dXAgdXAgZGlzcGF0Y2ggZmxhZ3MgdG8gaW5kaWNhdGUgaGFuZGxlciAodnMuIG1ldGhvZCkgKi8KIAotCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+KEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSyB8IEFDUElfR1BFX0RJU1BBVENIX01BU0spOyAvKiBDbGVhciBiaXRzICovCisJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH4oQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSyk7CS8qIENsZWFyIGJpdHMgKi8KIAlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gKHU4KSAodHlwZSB8IEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpOwogCi0JYWNwaV9vc19yZWxlYXNlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CiAKLQotdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjc3LDMzICs2NDcsMzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9ncGVfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGFkZHJlc3MpCithY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJdTMyIGdwZV9udW1iZXIsIGFjcGlfZXZlbnRfaGFuZGxlciBhZGRyZXNzKQogewotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAgICAgICAgKmhhbmRsZXI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGZsYWdzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFhZGRyZXNzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCiAKLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvIChncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwogCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC03MTEsNyArNjc4LDggQEAKIAogCS8qIE1ha2Ugc3VyZSB0aGF0IGEgaGFuZGxlciBpcyBpbmRlZWQgaW5zdGFsbGVkICovCiAKLQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spICE9IEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKKwlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spICE9CisJICAgIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKIAkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CkBAIC03MjUsNDUgKzY5Myw0NCBAQAogCiAJLyogRGlzYWJsZSB0aGUgR1BFIGJlZm9yZSByZW1vdmluZyB0aGUgaGFuZGxlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCiAJLyogTWFrZSBzdXJlIGFsbCBkZWZlcnJlZCB0YXNrcyBhcmUgY29tcGxldGVkICovCiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7Ci0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotIAl9CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KIAogCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLwogCi0JYWNwaV9vc19hY3F1aXJlX2xvY2sgKGFjcGlfZ2JsX2dwZV9sb2NrLCBBQ1BJX05PVF9JU1IpOworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCWhhbmRsZXIgPSBncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcjsKIAogCS8qIFJlc3RvcmUgTWV0aG9kIG5vZGUgKGlmIGFueSksIHNldCBkaXNwYXRjaCBmbGFncyAqLwogCiAJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlID0gaGFuZGxlci0+bWV0aG9kX25vZGU7Ci0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH5BQ1BJX0dQRV9ESVNQQVRDSF9NQVNLOyAvKiBDbGVhciBiaXRzICovCisJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH5BQ1BJX0dQRV9ESVNQQVRDSF9NQVNLOwkvKiBDbGVhciBiaXRzICovCiAJaWYgKGhhbmRsZXItPm1ldGhvZF9ub2RlKSB7CiAJCWdwZV9ldmVudF9pbmZvLT5mbGFncyB8PSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0Q7CiAJfQotCWFjcGlfb3NfcmVsZWFzZV9sb2NrIChhY3BpX2dibF9ncGVfbG9jaywgQUNQSV9OT1RfSVNSKTsKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwogCiAJLyogTm93IHdlIGNhbiBmcmVlIHRoZSBoYW5kbGVyIG9iamVjdCAqLwogCi0JQUNQSV9NRU1fRlJFRSAoaGFuZGxlcik7CisJQUNQSV9NRU1fRlJFRShoYW5kbGVyKTsKIAotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzc5LDM1ICs3NDYsMzEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKHUxNiB0aW1lb3V0LCB1MzIgKiBoYW5kbGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlpZiAoIWhhbmRsZSkgewogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayAodGltZW91dCk7Ci0JYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOworCXN0YXR1cyA9IGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh0aW1lb3V0KTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlKys7CiAJCSpoYW5kbGUgPSBhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGU7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2spOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODIxLDE5ICs3ODQsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSkKK2FjcGlfc3RhdHVzIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayh1MzIgaGFuZGxlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKGhhbmRsZSAhPSBhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGUpIHsKIAkJcmV0dXJuIChBRV9OT1RfQUNRVUlSRUQpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAoKTsKKwlzdGF0dXMgPSBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwppbmRleCBmMzM3ZGMyLi44ODdmZjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCkBAIC00OCw4ICs0OCw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2eGZldm50IikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZmV2bnQiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyLDQ0ICs2MSwzOSBAQAogICogREVTQ1JJUFRJT046IFRyYW5zZmVycyB0aGUgc3lzdGVtIGludG8gQUNQSSBtb2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZSAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9lbmFibGUiKTsKLQotCi0JLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIEZBRFQqLworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBGQURUICovCiAKIAlpZiAoIWFjcGlfZ2JsX0ZBRFQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgIk5vIEZBRFQgaW5mb3JtYXRpb24gcHJlc2VudCFcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCiAJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBBQ1BJX1NZU19NT0RFX0FDUEkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwgIlN5c3RlbSBpcyBhbHJlYWR5IGluIEFDUEkgbW9kZVxuIikpOwotCX0KLQllbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJCSAgIlN5c3RlbSBpcyBhbHJlYWR5IGluIEFDUEkgbW9kZVxuIikpOworCX0gZWxzZSB7CiAJCS8qIFRyYW5zaXRpb24gdG8gQUNQSSBtb2RlICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZSAoQUNQSV9TWVNfTU9ERV9BQ1BJKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHRyYW5zaXRpb24gdG8gQUNQSSBtb2RlLlxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2h3X3NldF9tb2RlKEFDUElfU1lTX01PREVfQUNQSSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgdHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUuXG4iKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCi0JCQkiVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgc3VjY2Vzc2Z1bFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkJICAiVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgc3VjY2Vzc2Z1bFxuIikpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGUKQEAgLTExMiw0MyArMTA2LDM4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZGlzYWJsZSAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZSh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2Rpc2FibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZSIpOwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sICJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiTm8gRkFEVCBpbmZvcm1hdGlvbiBwcmVzZW50IVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gQUNQSV9TWVNfTU9ERV9MRUdBQ1kpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwKLQkJCSJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBsZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7Ci0JfQotCWVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkJICAiU3lzdGVtIGlzIGFscmVhZHkgaW4gbGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOworCX0gZWxzZSB7CiAJCS8qIFRyYW5zaXRpb24gdG8gTEVHQUNZIG1vZGUgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X3NldF9tb2RlIChBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CisJCXN0YXR1cyA9IGFjcGlfaHdfc2V0X21vZGUoQUNQSV9TWVNfTU9ERV9MRUdBQ1kpOwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgZXhpdCBBQ1BJIG1vZGUgdG8gbGVnYWN5IG1vZGUiKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ291bGQgbm90IGV4aXQgQUNQSSBtb2RlIHRvIGxlZ2FjeSBtb2RlIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULCAiQUNQSSBtb2RlIGRpc2FibGVkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwgIkFDUEkgbW9kZSBkaXNhYmxlZFxuIikpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZV9ldmVudApAQCAtMTYyLDUyICsxNTEsNTAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9lbmFibGVfZXZlbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgdmFsdWU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VuYWJsZV9ldmVudCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbmFibGVfZXZlbnQiKTsKIAogCS8qIERlY29kZSB0aGUgRml4ZWQgRXZlbnQgKi8KIAogCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgogCSAqIEVuYWJsZSB0aGUgcmVxdWVzdGVkIGZpeGVkIGV2ZW50IChieSB3cml0aW5nIGEgb25lIHRvIHRoZQogCSAqIGVuYWJsZSByZWdpc3RlciBiaXQpCiAJICovCi0Jc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLmVuYWJsZV9yZWdpc3Rlcl9pZCwKLQkJCSAxLCBBQ1BJX01UWF9MT0NLKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgMSwgQUNQSV9NVFhfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYXJkd2FyZSByZXNwb25kZWQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5lbmFibGVfcmVnaXN0ZXJfaWQsCi0JCQkgICZ2YWx1ZSwgQUNQSV9NVFhfTE9DSyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsICZ2YWx1ZSwgQUNQSV9NVFhfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCWlmICh2YWx1ZSAhPSAxKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkNvdWxkIG5vdCBlbmFibGUgJXMgZXZlbnRcbiIsIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUgKGV2ZW50KSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDb3VsZCBub3QgZW5hYmxlICVzIGV2ZW50XG4iLAorCQkJCSAgYWNwaV91dF9nZXRfZXZlbnRfbmFtZShldmVudCkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlX2V2ZW50KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ldmVudCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjIzLDQwICsyMTAsMzQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9zZXRfZ3BlX3R5cGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKQorYWNwaV9zdGF0dXMgYWNwaV9zZXRfZ3BlX3R5cGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHU4IHR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3NldF9ncGVfdHlwZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zZXRfZ3BlX3R5cGUiKTsKIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCiAKLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvIChncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwogCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCiAJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX01BU0spID09IHR5cGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogU2V0IHRoZSBuZXcgdHlwZSAod2lsbCBkaXNhYmxlIEdQRSBpZiBjdXJyZW50bHkgZW5hYmxlZCkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfc2V0X2dwZV90eXBlIChncGVfZXZlbnRfaW5mbywgdHlwZSk7CisJc3RhdHVzID0gYWNwaV9ldl9zZXRfZ3BlX3R5cGUoZ3BlX2V2ZW50X2luZm8sIHR5cGUpOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3NldF9ncGVfdHlwZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9zZXRfZ3BlX3R5cGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI3MywzMSArMjU0LDI1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZW5hYmxlX2dwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1MzIgZmxhZ3MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VuYWJsZV9ncGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX2dwZSIpOwogCiAJLyogVXNlIHNlbWFwaG9yZSBsb2NrIGlmIG5vdCBleGVjdXRpbmcgYXQgaW50ZXJydXB0IGxldmVsICovCiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FVkVOVFMpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KIAotCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8gKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CiAJaWYgKCFncGVfZXZlbnRfaW5mbykgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTMwNSwxNiArMjgwLDE2IEBACiAKIAkvKiBQZXJmb3JtIHRoZSBlbmFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfZW5hYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8sIFRSVUUpOworCXN0YXR1cyA9IGFjcGlfZXZfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbywgVFJVRSk7CiAKLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZ3BlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ncGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTMzMSw0NiArMzA2LDM5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZGlzYWJsZV9ncGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZGlzYWJsZV9ncGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZV9ncGUiKTsKIAogCS8qIFVzZSBzZW1hcGhvcmUgbG9jayBpZiBub3QgZXhlY3V0aW5nIGF0IGludGVycnVwdCBsZXZlbCAqLwogCiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCiAKLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvIChncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwogCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZSAoZ3BlX2V2ZW50X2luZm8pOworCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOwogCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlX2V2ZW50CkBAIC0zODQsNTAgKzM1Miw0OCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2Rpc2FibGVfZXZlbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZV9ldmVudCh1MzIgZXZlbnQsIHUzMiBmbGFncykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHZhbHVlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9kaXNhYmxlX2V2ZW50Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Rpc2FibGVfZXZlbnQiKTsKIAogCS8qIERlY29kZSB0aGUgRml4ZWQgRXZlbnQgKi8KIAogCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgogCSAqIERpc2FibGUgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAoYnkgd3JpdGluZyBhIHplcm8gdG8gdGhlCiAJICogZW5hYmxlIHJlZ2lzdGVyIGJpdCkKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uZW5hYmxlX3JlZ2lzdGVyX2lkLAotCQkJIDAsIEFDUElfTVRYX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAwLCBBQ1BJX01UWF9MT0NLKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLmVuYWJsZV9yZWdpc3Rlcl9pZCwKLQkJCSAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlpZiAodmFsdWUgIT0gMCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJDb3VsZCBub3QgZGlzYWJsZSAlcyBldmVudHNcbiIsIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUgKGV2ZW50KSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDb3VsZCBub3QgZGlzYWJsZSAlcyBldmVudHNcbiIsCisJCQkJICBhY3BpX3V0X2dldF9ldmVudF9uYW1lKGV2ZW50KSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlX2V2ZW50KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGVfZXZlbnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ0MSwzMyArNDA3LDMwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfY2xlYXJfZXZlbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpCithY3BpX3N0YXR1cyBhY3BpX2NsZWFyX2V2ZW50KHUzMiBldmVudCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9jbGVhcl9ldmVudCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9jbGVhcl9ldmVudCIpOwogCiAJLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLwogCiAJaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCiAJICogQ2xlYXIgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAoQnkgd3JpdGluZyBhIG9uZSB0byB0aGUKIAkgKiBzdGF0dXMgcmVnaXN0ZXIgYml0KQogCSAqLwotCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyIChhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS5zdGF0dXNfcmVnaXN0ZXJfaWQsCi0JCQkxLCBBQ1BJX01UWF9MT0NLKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCSAgICAgIHN0YXR1c19yZWdpc3Rlcl9pZCwgMSwgQUNQSV9NVFhfTE9DSyk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfY2xlYXJfZXZlbnQpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfY2xlYXJfZXZlbnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ4Myw0NiArNDQ2LDM5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfY2xlYXJfZ3BlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2NsZWFyX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9jbGVhcl9ncGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfY2xlYXJfZ3BlIik7CiAKIAkvKiBVc2Ugc2VtYXBob3JlIGxvY2sgaWYgbm90IGV4ZWN1dGluZyBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KIAogCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgewotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwogCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAotCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlIChncGVfZXZlbnRfaW5mbyk7CisJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOwogCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTUzOCwzNiArNDk0LDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2V2ZW50X3N0YXR1cyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLQlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgICpldmVudF9zdGF0dXMpCithY3BpX3N0YXR1cyBhY3BpX2dldF9ldmVudF9zdGF0dXModTMyIGV2ZW50LCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfZXZlbnRfc3RhdHVzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9ldmVudF9zdGF0dXMiKTsKIAogCWlmICghZXZlbnRfc3RhdHVzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCiAKIAlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAqLwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLnN0YXR1c19yZWdpc3Rlcl9pZCwKLQkJCSAgZXZlbnRfc3RhdHVzLCBBQ1BJX01UWF9MT0NLKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2dldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCSAgICAgIHN0YXR1c19yZWdpc3Rlcl9pZCwgZXZlbnRfc3RhdHVzLCBBQ1BJX01UWF9MT0NLKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9ncGVfc3RhdHVzCkBAIC01ODUsMzEgKzUzNiwyNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2dwZV9zdGF0dXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgICpldmVudF9zdGF0dXMpCithY3BpX2dldF9ncGVfc3RhdHVzKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCSAgICB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzLCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X2dwZV9zdGF0dXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2dwZV9zdGF0dXMiKTsKIAogCS8qIFVzZSBzZW1hcGhvcmUgbG9jayBpZiBub3QgZXhlY3V0aW5nIGF0IGludGVycnVwdCBsZXZlbCAqLwogCiAJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCiAKLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvIChncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwogCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC02MTcsMTYgKzU2MywxNSBAQAogCiAJLyogT2J0YWluIHN0YXR1cyBvbiB0aGUgcmVxdWVzdGVkIEdQRSBudW1iZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMgKGdwZV9ldmVudF9pbmZvLCBldmVudF9zdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMoZ3BlX2V2ZW50X2luZm8sIGV2ZW50X3N0YXR1cyk7CiAKLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVZFTlRTKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYzNSw3ICs1ODAsNyBAQAogICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIHBhcmVudCBHUEUgQmxvY2sgRGV2aWNlCiAgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2FkZHJlc3MgICAtIEFkZHJlc3MgYW5kIHNwYWNlX2lECiAgKiAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQgICAgICAtIE51bWJlciBvZiBHUEUgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIGJsb2NrCi0gKiAgICAgICAgICAgICAgaW50ZXJydXB0X2xldmVsICAgICAtIEgvVyBpbnRlcnJ1cHQgZm9yIHRoZSBibG9jaworICogICAgICAgICAgICAgIGludGVycnVwdF9udW1iZXIgICAgLSBIL1cgaW50ZXJydXB0IGZvciB0aGUgYmxvY2sKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNjQ0LDMzICs1ODksMjcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZ3BlX2Jsb2NrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqZ3BlX2Jsb2NrX2FkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9jb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCkKK2FjcGlfaW5zdGFsbF9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJICAgICAgIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCSAgICAgICB1MzIgcmVnaXN0ZXJfY291bnQsIHUzMiBpbnRlcnJ1cHRfbnVtYmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbnN0YWxsX2dwZV9ibG9jayIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5zdGFsbF9ncGVfYmxvY2siKTsKLQotCi0JaWYgKCghZ3BlX2RldmljZSkgICAgICB8fAotCQkoIWdwZV9ibG9ja19hZGRyZXNzKSB8fAotCQkoIXJlZ2lzdGVyX2NvdW50KSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoIWdwZV9kZXZpY2UpIHx8ICghZ3BlX2Jsb2NrX2FkZHJlc3MpIHx8ICghcmVnaXN0ZXJfY291bnQpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChncGVfZGV2aWNlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZ3BlX2RldmljZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtNjgwLDMxICs2MTksMzMgQEAKIAkgKiBGb3IgdXNlci1pbnN0YWxsZWQgR1BFIEJsb2NrIERldmljZXMsIHRoZSBncGVfYmxvY2tfYmFzZV9udW1iZXIKIAkgKiBpcyBhbHdheXMgemVybwogCSAqLwotCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayAobm9kZSwgZ3BlX2Jsb2NrX2FkZHJlc3MsIHJlZ2lzdGVyX2NvdW50LAotCQkJICAwLCBpbnRlcnJ1cHRfbGV2ZWwsICZncGVfYmxvY2spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sobm9kZSwgZ3BlX2Jsb2NrX2FkZHJlc3MsIHJlZ2lzdGVyX2NvdW50LCAwLAorCQkJCSAgICAgaW50ZXJydXB0X251bWJlciwgJmdwZV9ibG9jayk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEdldCB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJLyogTm8gb2JqZWN0LCBjcmVhdGUgYSBuZXcgb25lICovCiAKLQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9ERVZJQ0UpOworCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfREVWSUNFKTsKIAkJaWYgKCFvYmpfZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfREVWSUNFKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBvYmpfZGVzYywgQUNQSV9UWVBFX0RFVklDRSk7CiAKIAkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAJfQpAQCAtNzEzLDEzICs2NTQsMTIgQEAKIAogCW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrOwogCi0KLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9ibG9jayk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9ibG9jayk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzMzLDI4ICs2NzMsMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UpCithY3BpX3N0YXR1cyBhY3BpX3JlbW92ZV9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfcmVtb3ZlX2dwZV9ibG9jayIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrIik7CiAKIAlpZiAoIWdwZV9kZXZpY2UpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGdwZV9kZXZpY2UpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShncGVfZGV2aWNlKTsKIAlpZiAoIW5vZGUpIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC03NjIsMjIgKzY5OCwyMSBAQAogCiAJLyogR2V0IHRoZSBkZXZpY2Vfb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYyB8fAotCQkhb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX09CSkVDVCk7CisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYyB8fCAhb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKIAl9CiAKIAkvKiBEZWxldGUgdGhlIEdQRSBibG9jayAoYnV0IG5vdCB0aGUgZGV2aWNlX29iamVjdCkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayAob2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sob2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jayA9IE5VTEw7CiAJfQogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYwppbmRleCBkMDU4NTg3Li42ZjI4ZWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jCkBAIC00OSw4ICs0OSw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2eGZyZWduIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZnJlZ24iKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY3LDM2ICs2NiwzMSBAQAogICogREVTQ1JJUFRJT046IEluc3RhbGwgYSBoYW5kbGVyIGZvciBhbGwgb3BfcmVnaW9ucyBvZiBhIGdpdmVuIHNwYWNlX2lkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlciwKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHNldHVwLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKKwkJCQkgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLAorCQkJCSAgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlciwKKwkJCQkgICBhY3BpX2Fkcl9zcGFjZV9zZXR1cCBzZXR1cCwgdm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoIWRldmljZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChkZXZpY2UpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTEwNCwyMSArOTgsMjMgQEAKIAogCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIGFsbCBSZWdpb25zIGZvciB0aGlzIFNwYWNlIElEICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlciAobm9kZSwgc3BhY2VfaWQsIGhhbmRsZXIsIHNldHVwLCBjb250ZXh0KTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIobm9kZSwgc3BhY2VfaWQsIGhhbmRsZXIsIHNldHVwLAorCQkJCQkgIGNvbnRleHQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKIAkvKiBSdW4gYWxsIF9SRUcgbWV0aG9kcyBmb3IgdGhpcyBhZGRyZXNzIHNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMgKG5vZGUsIHNwYWNlX2lkKTsKKwlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMobm9kZSwgc3BhY2VfaWQpOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzNSwzNiArMTMxLDMzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlcikKK2FjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkJICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLAorCQkJCSAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmhhbmRsZXJfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmxhc3Rfb2JqX3B0cjsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmxhc3Rfb2JqX3B0cjsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghZGV2aWNlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGRldmljZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGRldmljZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMTcyLDcgKzE2NSw3IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhlIGludGVybmFsIG9iamVjdCBleGlzdHMgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0xODgsMTAgKzE4MSwxMSBAQAogCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0gc3BhY2VfaWQpIHsKIAkJCS8qIE1hdGNoZWQgc3BhY2VfaWQsIGZpcnN0IGRlcmVmZXJlbmNlIHRoaXMgaW4gdGhlIFJlZ2lvbnMgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJIlJlbW92aW5nIGFkZHJlc3MgaGFuZGxlciAlcCglcCkgZm9yIHJlZ2lvbiAlcyBvbiBEZXZpY2UgJXAoJXApXG4iLAotCQkJCWhhbmRsZXJfb2JqLCBoYW5kbGVyLCBhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAoc3BhY2VfaWQpLAotCQkJCW5vZGUsIG9ial9kZXNjKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJCQkgICJSZW1vdmluZyBhZGRyZXNzIGhhbmRsZXIgJXAoJXApIGZvciByZWdpb24gJXMgb24gRGV2aWNlICVwKCVwKVxuIiwKKwkJCQkJICBoYW5kbGVyX29iaiwgaGFuZGxlciwKKwkJCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksCisJCQkJCSAgbm9kZSwgb2JqX2Rlc2MpKTsKIAogCQkJcmVnaW9uX29iaiA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OwogCkBAIC0yMDUsMTMgKzE5OSwxNCBAQAogCQkJCSAqIFRoZSByZWdpb24gaXMganVzdCBpbmFjY2Vzc2libGUgYXMgaW5kaWNhdGVkIHRvCiAJCQkJICogdGhlIF9SRUcgbWV0aG9kCiAJCQkJICovCi0JCQkJYWNwaV9ldl9kZXRhY2hfcmVnaW9uIChyZWdpb25fb2JqLCBUUlVFKTsKKwkJCQlhY3BpX2V2X2RldGFjaF9yZWdpb24ocmVnaW9uX29iaiwgVFJVRSk7CiAKIAkJCQkvKgogCQkJCSAqIFdhbGsgdGhlIGxpc3Q6IEp1c3QgZ3JhYiB0aGUgaGVhZCBiZWNhdXNlIHRoZQogCQkJCSAqIGRldGFjaF9yZWdpb24gcmVtb3ZlZCB0aGUgcHJldmlvdXMgaGVhZC4KIAkJCQkgKi8KLQkJCQlyZWdpb25fb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7CisJCQkJcmVnaW9uX29iaiA9CisJCQkJICAgIGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OwogCiAJCQl9CiAKQEAgLTIyMSw3ICsyMTYsNyBAQAogCiAJCQkvKiBOb3cgd2UgY2FuIGRlbGV0ZSB0aGUgaGFuZGxlciBvYmplY3QgKi8KIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChoYW5kbGVyX29iaik7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaGFuZGxlcl9vYmopOwogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIApAQCAtMjMzLDE1ICsyMjgsMTYgQEAKIAogCS8qIFRoZSBoYW5kbGVyIGRvZXMgbm90IGV4aXN0ICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJIlVuYWJsZSB0byByZW1vdmUgYWRkcmVzcyBoYW5kbGVyICVwIGZvciAlcyglWCksIGRldl9ub2RlICVwLCBvYmogJXBcbiIsCi0JCWhhbmRsZXIsIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChzcGFjZV9pZCksIHNwYWNlX2lkLCBub2RlLCBvYmpfZGVzYykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJVbmFibGUgdG8gcmVtb3ZlIGFkZHJlc3MgaGFuZGxlciAlcCBmb3IgJXMoJVgpLCBkZXZfbm9kZSAlcCwgb2JqICVwXG4iLAorCQkJICBoYW5kbGVyLCBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksIHNwYWNlX2lkLAorCQkJICBub2RlLCBvYmpfZGVzYykpOwogCiAJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcik7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKaW5kZXggNzM0YjJmMi4uMWNlMzY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKQEAgLTQxLDcgKzQxLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CkBAIC01MCwxOCArNDksMTQgQEAKICNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGNvbmZpZyIpCitBQ1BJX01PRFVMRV9OQU1FKCJleGNvbmZpZyIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRkYl9oYW5kbGUpOwotCithY3BpX2V4X2FkZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLAorCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwKKwkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzksNjQgKzc0LDY3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWRkX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqZGRiX2hhbmRsZSkKK2FjcGlfZXhfYWRkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsCisJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAorCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZGJfaGFuZGxlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgdGFibGVfaW5mbzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9pbmZvOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfYWRkX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9hZGRfdGFibGUiKTsKIAogCS8qIENyZWF0ZSBhbiBvYmplY3QgdG8gYmUgdGhlIHRhYmxlIGhhbmRsZSAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotCUFDUElfTUVNU0VUICgmdGFibGVfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7Ci0KLQl0YWJsZV9pbmZvLnR5cGUgICAgICA9IEFDUElfVEFCTEVfU1NEVDsKLQl0YWJsZV9pbmZvLnBvaW50ZXIgICA9IHRhYmxlOwotCXRhYmxlX2luZm8ubGVuZ3RoICAgID0gKGFjcGlfc2l6ZSkgdGFibGUtPmxlbmd0aDsKLQl0YWJsZV9pbmZvLmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7Ci0KLQlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUgKCZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSAodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYywgcGFyZW50X25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJLyogVW5pbnN0YWxsIHRhYmxlIG9uIGVycm9yICovCi0KLQkJKHZvaWQpIGFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlICh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjKTsKLQkJZ290byBjbGVhbnVwOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbml0IHRoZSB0YWJsZSBoYW5kbGUgKi8KIAogCW9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID0gQU1MX0xPQURfT1A7Ci0Jb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPSB0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjOwogCSpkZGJfaGFuZGxlID0gb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAKKwkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCiAKLWNsZWFudXA6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfTUVNU0VUKCZ0YWJsZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCisJdGFibGVfaW5mby50eXBlID0gQUNQSV9UQUJMRV9TU0RUOworCXRhYmxlX2luZm8ucG9pbnRlciA9IHRhYmxlOworCXRhYmxlX2luZm8ubGVuZ3RoID0gKGFjcGlfc2l6ZSkgdGFibGUtPmxlbmd0aDsKKwl0YWJsZV9pbmZvLmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7CisKKwlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUoJnRhYmxlX2luZm8pOworCW9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gdGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYzsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSB7CisJCQkvKiBUYWJsZSBhbHJlYWR5IGV4aXN0cywganVzdCByZXR1cm4gdGhlIGhhbmRsZSAqLworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjLCBwYXJlbnRfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCS8qIFVuaW5zdGFsbCB0YWJsZSBvbiBlcnJvciAqLworCisJCSh2b2lkKWFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlKHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2MpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKworICAgICAgY2xlYW51cDoKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCSpkZGJfaGFuZGxlID0gTlVMTDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2xvYWRfdGFibGVfb3AKQEAgLTE1MSw1NiArMTQ5LDUzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX3RhYmxlX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYykKK2FjcGlfZXhfbG9hZF90YWJsZV9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJhbWV0ZXJfbm9kZSA9IE5VTEw7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGRiX2hhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmFtZXRlcl9ub2RlID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfbG9hZF90YWJsZV9vcCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfbG9hZF90YWJsZV9vcCIpOwogCiAjaWYgMAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlIHRhYmxlcyB0aGF0CiAJICogaXMgYWxyZWFkeSBsb2FkZWQuCiAJICovCi0Jc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX3RiX21hdGNoX3NpZ25hdHVyZShvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwgTlVMTCk7CiAJaWYgKHN0YXR1cyA9PSBBRV9PSykgewogCQkvKiBTaWduYXR1cmUgbWF0Y2hlZCAtLSBkb24ndCBhbGxvdyBvdmVycmlkZSAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQUxSRUFEWV9FWElTVFMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOwogCX0KICNlbmRpZgogCiAJLyogRmluZCB0aGUgQUNQSSB0YWJsZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9maW5kX3RhYmxlIChvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKLQkJCSAgIG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAotCQkJICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsICZ0YWJsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdGJfZmluZF90YWJsZShvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgb3BlcmFuZFsxXS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIG9wZXJhbmRbMl0tPnN0cmluZy5wb2ludGVyLCAmdGFibGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBUYWJsZSBub3QgZm91bmQsIHJldHVybiBhbiBJbnRlZ2VyPTAgYW5kIEFFX09LICovCiAKLQkJZGRiX2hhbmRsZSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlkZGJfaGFuZGxlID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFkZGJfaGFuZGxlKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCWRkYl9oYW5kbGUtPmludGVnZXIudmFsdWUgPSAwOwogCQkqcmV0dXJuX2Rlc2MgPSBkZGJfaGFuZGxlOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIERlZmF1bHQgbm9kZXMgKi8KQEAgLTIxNSwxMCArMjEwLDEyIEBACiAJCSAqIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcm9vdF9wYXRoX3N0cmluZy4gVGhpcyBpcyB0aGUKIAkJICogbG9jYXRpb24gd2l0aGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUgbG9hZGVkLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChvcGVyYW5kWzNdLT5zdHJpbmcucG9pbnRlciwgc3RhcnRfbm9kZSwKLQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJlbnRfbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChvcGVyYW5kWzNdLT5zdHJpbmcucG9pbnRlciwKKwkJCQkJICAgICBzdGFydF9ub2RlLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJCSAgICAgJnBhcmVudF9ub2RlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIApAQCAtMjI2LDcgKzIyMyw3IEBACiAKIAlpZiAob3BlcmFuZFs0XS0+c3RyaW5nLmxlbmd0aCA+IDApIHsKIAkJaWYgKChvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlclswXSAhPSAnXFwnKSAmJgotCQkJKG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyWzBdICE9ICdeJykpIHsKKwkJICAgIChvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlclswXSAhPSAnXicpKSB7CiAJCQkvKgogCQkJICogUGF0aCBpcyBub3QgYWJzb2x1dGUsIHNvIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG5vZGUKIAkJCSAqIHJlZmVyZW5jZWQgYnkgdGhlIHJvb3RfcGF0aF9zdHJpbmcgKG9yIHRoZSBOUyByb290IGlmIG9taXR0ZWQpCkBAIC0yMzYsMTggKzIzMywyMCBAQAogCiAJCS8qIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyX3BhdGhfc3RyaW5nICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlciwgc3RhcnRfbm9kZSwKLQkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCAmcGFyYW1ldGVyX25vZGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgob3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJCSAgICAgc3RhcnRfbm9kZSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkgICAgICZwYXJhbWV0ZXJfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBMb2FkIHRoZSB0YWJsZSBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlICh0YWJsZSwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZSwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogUGFyYW1ldGVyIERhdGEgKG9wdGlvbmFsKSAqLwpAQCAtMjU1LDIwICsyNTQsMjAgQEAKIAlpZiAocGFyYW1ldGVyX25vZGUpIHsKIAkJLyogU3RvcmUgdGhlIHBhcmFtZXRlciBkYXRhIGludG8gdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChvcGVyYW5kWzVdLAotCQkJCSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBwYXJhbWV0ZXJfbm9kZSksCi0JCQkJIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkodm9pZCkgYWNwaV9leF91bmxvYWRfdGFibGUgKGRkYl9oYW5kbGUpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKG9wZXJhbmRbNV0sCisJCQkJICAgICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJCSAgICAgcGFyYW1ldGVyX25vZGUpLAorCQkJCSAgICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkodm9pZClhY3BpX2V4X3VubG9hZF90YWJsZShkZGJfaGFuZGxlKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCiAJKnJldHVybl9kZXNjID0gZGRiX2hhbmRsZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfbG9hZF9vcApAQCAtMjg1LDM4ICsyODQsMzcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2xvYWRfb3AgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9sb2FkX29wKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXQsCisJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGRiX2hhbmRsZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpidWZmZXJfZGVzYyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfcHRyID0gTlVMTDsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3M7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICB0YWJsZV9oZWFkZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ1ZmZlcl9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX3B0ciA9IE5VTEw7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3M7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIHRhYmxlX2hlYWRlcjsKKwl1MzIgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9sb2FkX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9sb2FkX29wIik7CiAKIAkvKiBPYmplY3QgY2FuIGJlIGVpdGhlciBhbiBvcF9yZWdpb24gb3IgYSBGaWVsZCAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9SRUdJT046CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkxvYWQgZnJvbSBSZWdpb24gJXAgJXNcbiIsCi0JCQlvYmpfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkxvYWQgZnJvbSBSZWdpb24gJXAgJXNcbiIsCisJCQkJICBvYmpfZGVzYywKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKSk7CiAKIAkJLyoKIAkJICogSWYgdGhlIFJlZ2lvbiBBZGRyZXNzIGFuZCBMZW5ndGggaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGV2YWx1YXRlZCwKIAkJICogZXZhbHVhdGUgdGhlbSBub3cgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCiAJCSAqLwogCQlpZiAoIShvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzIChvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyhvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCkBAIC0zMjgsMTE2ICszMjYsMTI3IEBACiAKIAkJdGFibGVfaGVhZGVyLmxlbmd0aCA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCAob2JqX2Rlc2MsIEFDUElfUkVBRCwKLQkJCQkJICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGkgKyBhZGRyZXNzKSwgOCwKLQkJCQkJICAgKCh1OCAqKSAmdGFibGVfaGVhZGVyKSArIGkpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKG9ial9kZXNjLCBBQ1BJX1JFQUQsCisJCQkJCQkJICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJCQkgICAoaSArIGFkZHJlc3MpLCA4LAorCQkJCQkJCSAgICgodTggKikgJgorCQkJCQkJCSAgICB0YWJsZV9oZWFkZXIpICsgaSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCiAJCS8qIFNhbml0eSBjaGVjayB0aGUgdGFibGUgbGVuZ3RoICovCiAKLQkJaWYgKHRhYmxlX2hlYWRlci5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0hFQURFUik7CisJCWlmICh0YWJsZV9oZWFkZXIubGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfSEVBREVSKTsKIAkJfQogCiAJCS8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZW50aXJlIHRhYmxlICovCiAKLQkJdGFibGVfcHRyID0gQUNQSV9NRU1fQUxMT0NBVEUgKHRhYmxlX2hlYWRlci5sZW5ndGgpOworCQl0YWJsZV9wdHIgPSBBQ1BJX01FTV9BTExPQ0FURSh0YWJsZV9oZWFkZXIubGVuZ3RoKTsKIAkJaWYgKCF0YWJsZV9wdHIpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogR2V0IHRoZSBlbnRpcmUgdGFibGUgZnJvbSB0aGUgb3AgcmVnaW9uICovCiAKIAkJZm9yIChpID0gMDsgaSA8IHRhYmxlX2hlYWRlci5sZW5ndGg7IGkrKykgewotCQkJc3RhdHVzID0gYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoIChvYmpfZGVzYywgQUNQSV9SRUFELAotCQkJCQkgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAoaSArIGFkZHJlc3MpLCA4LAotCQkJCQkgICAoKHU4ICopIHRhYmxlX3B0ciArIGkpKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKG9ial9kZXNjLCBBQ1BJX1JFQUQsCisJCQkJCQkJICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJCQkgICAoaSArIGFkZHJlc3MpLCA4LAorCQkJCQkJCSAgICgodTggKikgdGFibGVfcHRyICsKKwkJCQkJCQkgICAgaSkpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiTG9hZCBmcm9tIEZpZWxkICVwICVzXG4iLAotCQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJMb2FkIGZyb20gRmllbGQgJXAgJXNcbiIsCisJCQkJICBvYmpfZGVzYywKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKSk7CiAKIAkJLyoKIAkJICogVGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgdGFibGUuCiAJCSAqIFJlYWQgdGhlIGVudGlyZSBmaWVsZCBhbmQgdGh1cyB0aGUgZW50aXJlIHRhYmxlLiAgQnVmZmVyIGlzCiAJCSAqIGFsbG9jYXRlZCBkdXJpbmcgdGhlIHJlYWQuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkICh3YWxrX3N0YXRlLCBvYmpfZGVzYywgJmJ1ZmZlcl9kZXNjKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZCh3YWxrX3N0YXRlLCBvYmpfZGVzYywKKwkJCQkJCSAmYnVmZmVyX2Rlc2MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJdGFibGVfcHRyID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLAotCQkJCSAgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKwkJdGFibGVfcHRyID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsCisJCQkJCSAgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKIAotCQkgLyogU2FuaXR5IGNoZWNrIHRoZSB0YWJsZSBsZW5ndGggKi8KKwkJLyogQWxsIGRvbmUgd2l0aCB0aGUgYnVmZmVyX2Rlc2MsIGRlbGV0ZSBpdCAqLwogCi0JCWlmICh0YWJsZV9wdHItPmxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfSEVBREVSKTsKKwkJYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gTlVMTDsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGJ1ZmZlcl9kZXNjKTsKKworCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHRhYmxlIGxlbmd0aCAqLworCisJCWlmICh0YWJsZV9wdHItPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCQlzdGF0dXMgPSBBRV9CQURfSEVBREVSOworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQogCiAJLyogVGhlIHRhYmxlIG11c3QgYmUgZWl0aGVyIGFuIFNTRFQgb3IgYSBQU0RUICovCiAKLQlpZiAoKCFBQ1BJX1NUUk5DTVAgKHRhYmxlX3B0ci0+c2lnbmF0dXJlLAotCQkJICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfUFNEVF0uc2lnbmF0dXJlLAotCQkJICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfUFNEVF0uc2lnX2xlbmd0aCkpICYmCi0JCSghQUNQSV9TVFJOQ01QICh0YWJsZV9wdHItPnNpZ25hdHVyZSwKLQkJCQkgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1NTRFRdLnNpZ25hdHVyZSwKLQkJCQkgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1NTRFRdLnNpZ19sZW5ndGgpKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJUYWJsZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgWyU0LjRzXSwgbXVzdCBiZSBTU0RUIG9yIFBTRFRcbiIsCi0JCQl0YWJsZV9wdHItPnNpZ25hdHVyZSkpOworCWlmICgoIUFDUElfU1RSTkNNUCh0YWJsZV9wdHItPnNpZ25hdHVyZSwKKwkJCSAgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9QU0RUXS5zaWduYXR1cmUsCisJCQkgICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfUFNEVF0uc2lnX2xlbmd0aCkpICYmCisJICAgICghQUNQSV9TVFJOQ01QKHRhYmxlX3B0ci0+c2lnbmF0dXJlLAorCQkJICAgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1NTRFRdLnNpZ25hdHVyZSwKKwkJCSAgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9TU0RUXS5zaWdfbGVuZ3RoKSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUYWJsZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgWyU0LjRzXSwgbXVzdCBiZSBTU0RUIG9yIFBTRFRcbiIsCisJCQkJICB0YWJsZV9wdHItPnNpZ25hdHVyZSkpOwogCQlzdGF0dXMgPSBBRV9CQURfU0lHTkFUVVJFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlIGludG8gdGhlIGxvY2FsIGRhdGEgc3RydWN0dXJlcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9hZGRfdGFibGUgKHRhYmxlX3B0ciwgYWNwaV9nYmxfcm9vdF9ub2RlLCAmZGRiX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7CisJc3RhdHVzID0gYWNwaV9leF9hZGRfdGFibGUodGFibGVfcHRyLCBhY3BpX2dibF9yb290X25vZGUsICZkZGJfaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJLyogT24gZXJyb3IsIHRhYmxlX3B0ciB3YXMgZGVhbGxvY2F0ZWQgYWJvdmUgKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTdG9yZSB0aGUgZGRiX2hhbmRsZSBpbnRvIHRoZSBUYXJnZXQgb3BlcmFuZCAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9zdG9yZSAoZGRiX2hhbmRsZSwgdGFyZ2V0LCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCSh2b2lkKSBhY3BpX2V4X3VubG9hZF90YWJsZSAoZGRiX2hhbmRsZSk7CisJc3RhdHVzID0gYWNwaV9leF9zdG9yZShkZGJfaGFuZGxlLCB0YXJnZXQsIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkodm9pZClhY3BpX2V4X3VubG9hZF90YWJsZShkZGJfaGFuZGxlKTsKKworCQkvKiB0YWJsZV9wdHIgd2FzIGRlYWxsb2NhdGVkIGFib3ZlICovCisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotCi0KLWNsZWFudXA6Ci0KLQlpZiAoYnVmZmVyX2Rlc2MpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChidWZmZXJfZGVzYyk7CisgICAgICBjbGVhbnVwOgorCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX01FTV9GUkVFKHRhYmxlX3B0cik7CiAJfQotCWVsc2UgewotCQlBQ1BJX01FTV9GUkVFICh0YWJsZV9wdHIpOwotCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF91bmxvYWRfdGFibGUKQEAgLTQ1MCwxNyArNDU5LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfdW5sb2FkX3RhYmxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZGJfaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9leF91bmxvYWRfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhYmxlX2Rlc2MgPSBkZGJfaGFuZGxlOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFibGVfZGVzYyA9IGRkYl9oYW5kbGU7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3VubG9hZF90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfdW5sb2FkX3RhYmxlIik7CiAKIAkvKgogCSAqIFZhbGlkYXRlIHRoZSBoYW5kbGUKQEAgLTQ2OSwyOCArNDc0LDI4IEBACiAJICogdmFsaWRhdGVkIGhlcmUuCiAJICovCiAJaWYgKCghZGRiX2hhbmRsZSkgfHwKLQkJKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoZGRiX2hhbmRsZSkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgfHwKLQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChkZGJfaGFuZGxlKSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGRkYl9oYW5kbGUpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHx8CisJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkZGJfaGFuZGxlKSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IHRoZSBhY3R1YWwgdGFibGUgZGVzY3JpcHRvciBmcm9tIHRoZSBkZGJfaGFuZGxlICovCiAKLQl0YWJsZV9pbmZvID0gKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKikgdGFibGVfZGVzYy0+cmVmZXJlbmNlLm9iamVjdDsKKwl0YWJsZV9pbmZvID0gKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKil0YWJsZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwogCiAJLyoKIAkgKiBEZWxldGUgdGhlIGVudGlyZSBuYW1lc3BhY2UgdW5kZXIgdGhpcyB0YWJsZSBOb2RlCiAJICogKE9mZnNldCBjb250YWlucyB0aGUgdGFibGVfaWQpCiAJICovCi0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICh0YWJsZV9pbmZvLT50YWJsZV9pZCk7CisJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKHRhYmxlX2luZm8tPm93bmVyX2lkKTsKKwlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJnRhYmxlX2luZm8tPm93bmVyX2lkKTsKIAogCS8qIERlbGV0ZSB0aGUgdGFibGUgaXRzZWxmICovCiAKLQkodm9pZCkgYWNwaV90Yl91bmluc3RhbGxfdGFibGUgKHRhYmxlX2luZm8tPmluc3RhbGxlZF9kZXNjKTsKKwkodm9pZClhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9pbmZvLT5pbnN0YWxsZWRfZGVzYyk7CiAKIAkvKiBEZWxldGUgdGhlIHRhYmxlIGRlc2NyaXB0b3IgKGRkYl9oYW5kbGUpICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHRhYmxlX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodGFibGVfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMKaW5kZXggOTc4NTZjNC4uMDRlNTE5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMKQEAgLTQxLDI0ICs0MSwxNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhjb252cnQiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhjb252cnQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB1MzIKLWFjcGlfZXhfY29udmVydF90b19hc2NpaSAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKLQorYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpKGFjcGlfaW50ZWdlciBpbnRlZ2VyLAorCQkJIHUxNiBiYXNlLCB1OCAqIHN0cmluZywgdTggbWF4X2xlbmd0aCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzYsMjkgKzY5LDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MsIHUzMiBmbGFncykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcmVzdWx0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOworCXU4ICpwb2ludGVyOworCWFjcGlfaW50ZWdlciByZXN1bHQ7CisJdTMyIGk7CisJdTMyIGNvdW50OworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9jb252ZXJ0X3RvX2ludGVnZXIiLCBvYmpfZGVzYyk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2NvbnZlcnRfdG9faW50ZWdlciIsIG9ial9kZXNjKTsKLQotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCS8qIE5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCiAKIAkJKnJlc3VsdF9kZXNjID0gb2JqX2Rlc2M7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKQEAgLTEwNiwxMSArOTUsMTEgQEAKIAkJLyogTm90ZTogVGFrZXMgYWR2YW50YWdlIG9mIGNvbW1vbiBidWZmZXIvc3RyaW5nIGZpZWxkcyAqLwogCiAJCXBvaW50ZXIgPSBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JCWNvdW50ICAgPSBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aDsKKwkJY291bnQgPSBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJLyoKQEAgLTEyNiw3ICsxMTUsNyBAQAogCiAJLyogU3RyaW5nIGNvbnZlcnNpb24gaXMgZGlmZmVyZW50IHRoYW4gQnVmZmVyIGNvbnZlcnNpb24gKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCS8qCkBAIC0xMzUsMTkgKzEyNCwxOCBAQAogCQkgKiBvZiBBQ1BJIDMuMCkgaXMgdGhhdCB0aGUgdG9faW50ZWdlcigpIG9wZXJhdG9yIGFsbG93cyBib3RoIGRlY2ltYWwKIAkJICogYW5kIGhleGFkZWNpbWFsIHN0cmluZ3MgKGhleCBwcmVmaXhlZCB3aXRoICIweCIpLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9zdHJ0b3VsNjQgKChjaGFyICopIHBvaW50ZXIsIGZsYWdzLCAmcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NCgoY2hhciAqKXBvaW50ZXIsIGZsYWdzLCAmcmVzdWx0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCS8qIENoZWNrIGZvciB6ZXJvLWxlbmd0aCBidWZmZXIgKi8KIAogCQlpZiAoIWNvdW50KSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CVUZGRVJfTElNSVQpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CVUZGRVJfTElNSVQpOwogCQl9CiAKIAkJLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGFuIGludGVnZXIncyB3b3J0aCBvZiBkYXRhICovCkBAIC0xNzAsNyArMTU4LDYgQEAKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJLyogTm8gb3RoZXIgdHlwZXMgY2FuIGdldCBoZXJlICovCiAJCWJyZWFrOwpAQCAtMTc4LDIwICsxNjUsMTkgQEAKIAogCS8qIENyZWF0ZSBhIG5ldyBpbnRlZ2VyICovCiAKLQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogU2F2ZSB0aGUgUmVzdWx0ICovCiAKIAlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHJlc3VsdDsKLQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlIChyZXR1cm5fZGVzYyk7CisJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShyZXR1cm5fZGVzYyk7CiAJKnJlc3VsdF9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyCkBAIC0yMDcsMjUgKzE5MywyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29udmVydF90b19idWZmZXIgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYykKK2FjcGlfZXhfY29udmVydF90b19idWZmZXIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXdfYnVmOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOworCXU4ICpuZXdfYnVmOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NvbnZlcnRfdG9fYnVmZmVyIiwgb2JqX2Rlc2MpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9jb252ZXJ0X3RvX2J1ZmZlciIsIG9ial9kZXNjKTsKLQotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKIAkJLyogTm8gY29udmVyc2lvbiBuZWNlc3NhcnkgKi8KIAogCQkqcmVzdWx0X2Rlc2MgPSBvYmpfZGVzYzsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Ci0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKQEAgLTIzMywyMCArMjE1LDIwIEBACiAJCSAqIENyZWF0ZSBhIG5ldyBCdWZmZXIgb2JqZWN0LgogCQkgKiBOZWVkIGVub3VnaCBzcGFjZSBmb3Igb25lIGludGVnZXIKIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCS8qIENvcHkgdGhlIGludGVnZXIgdG8gdGhlIGJ1ZmZlciwgTFNCIGZpcnN0ICovCiAKIAkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQkJQUNQSV9NRU1DUFkgKG5ld19idWYsCi0JCQkJICAmb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCi0JCQkJICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOworCQlBQ1BJX01FTUNQWShuZXdfYnVmLAorCQkJICAgICZvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSwKKwkJCSAgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCS8qCkBAIC0yNTgsMzIgKzI0MCwzMSBAQAogCQkgKiBBU0wvQU1MIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBudWxsIGJlaW5nIHRyYW5zZmVycmVkIHRvIHRoZSBuZXcKIAkJICogYnVmZmVyLgogCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0ICgKLQkJCQkgIChhY3BpX3NpemUpIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCgoYWNwaV9zaXplKQorCQkJCQkJCSAgIG9ial9kZXNjLT5zdHJpbmcuCisJCQkJCQkJICAgbGVuZ3RoICsgMSk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogQ29weSB0aGUgc3RyaW5nIHRvIHRoZSBidWZmZXIgKi8KIAogCQluZXdfYnVmID0gcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQlBQ1BJX1NUUk5DUFkgKChjaGFyICopIG5ld19idWYsIChjaGFyICopIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKKwkJQUNQSV9TVFJOQ1BZKChjaGFyICopbmV3X2J1ZiwgKGNoYXIgKilvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkgICAgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKIAl9CiAKIAkvKiBNYXJrIGJ1ZmZlciBpbml0aWFsaXplZCAqLwogCiAJcmV0dXJuX2Rlc2MtPmNvbW1vbi5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKIAkqcmVzdWx0X2Rlc2MgPSByZXR1cm5fZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY29udmVydF90b19hc2NpaQpAQCAtMzAwLDI0ICsyODEsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB1MzIKLWFjcGlfZXhfY29udmVydF90b19hc2NpaSAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3dpZHRoKQorYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpKGFjcGlfaW50ZWdlciBpbnRlZ2VyLAorCQkJIHUxNiBiYXNlLCB1OCAqIHN0cmluZywgdTggZGF0YV93aWR0aCkKIHsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGRpZ2l0OwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGo7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBrID0gMDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGhleF9sZW5ndGg7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBkZWNpbWFsX2xlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHJlc3NfemVyb3M7CisJYWNwaV9pbnRlZ2VyIGRpZ2l0OworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX25hdGl2ZV91aW50IGo7CisJYWNwaV9uYXRpdmVfdWludCBrID0gMDsKKwlhY3BpX25hdGl2ZV91aW50IGhleF9sZW5ndGg7CisJYWNwaV9uYXRpdmVfdWludCBkZWNpbWFsX2xlbmd0aDsKKwl1MzIgcmVtYWluZGVyOworCXU4IHN1cHJlc3NfemVyb3M7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlzd2l0Y2ggKGJhc2UpIHsKIAljYXNlIDEwOgpAQCAtMzM5LDcgKzMxNSw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXN1cHJlc3NfemVyb3MgPSBUUlVFOyAgICAvKiBObyBsZWFkaW5nIHplcm9zICovCisJCXN1cHJlc3NfemVyb3MgPSBUUlVFOwkvKiBObyBsZWFkaW5nIHplcm9zICovCiAJCXJlbWFpbmRlciA9IDA7CiAKIAkJZm9yIChpID0gZGVjaW1hbF9sZW5ndGg7IGkgPiAwOyBpLS0pIHsKQEAgLTM0Nyw3ICszMjMsOCBAQAogCiAJCQlkaWdpdCA9IGludGVnZXI7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQkJKHZvaWQpIGFjcGlfdXRfc2hvcnRfZGl2aWRlIChkaWdpdCwgMTAsICZkaWdpdCwgJnJlbWFpbmRlcik7CisJCQkJKHZvaWQpYWNwaV91dF9zaG9ydF9kaXZpZGUoZGlnaXQsIDEwLCAmZGlnaXQsCisJCQkJCQkJICAgJnJlbWFpbmRlcik7CiAJCQl9CiAKIAkJCS8qIEhhbmRsZSBsZWFkaW5nIHplcm9zICovCkBAIC0zNjcsMTEgKzM0NCwxMyBAQAogCiAJCS8qIGhleF9sZW5ndGg6IDIgYXNjaWkgaGV4IGNoYXJzIHBlciBkYXRhIGJ5dGUgKi8KIAotCQloZXhfbGVuZ3RoID0gQUNQSV9NVUxfMiAoZGF0YV93aWR0aCk7Ci0JCWZvciAoaSA9IDAsIGogPSAoaGV4X2xlbmd0aC0xKTsgaSA8IGhleF9sZW5ndGg7IGkrKywgai0tKSB7CisJCWhleF9sZW5ndGggPSAoYWNwaV9uYXRpdmVfdWludCkgQUNQSV9NVUxfMihkYXRhX3dpZHRoKTsKKwkJZm9yIChpID0gMCwgaiA9IChoZXhfbGVuZ3RoIC0gMSk7IGkgPCBoZXhfbGVuZ3RoOyBpKyssIGotLSkgewogCQkJLyogR2V0IG9uZSBoZXggZGlnaXQsIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGZpcnN0ICovCiAKLQkJCXN0cmluZ1trXSA9ICh1OCkgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhciAoaW50ZWdlciwgQUNQSV9NVUxfNCAoaikpOworCQkJc3RyaW5nW2tdID0KKwkJCSAgICAodTgpIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoaW50ZWdlciwKKwkJCQkJCQkgICBBQ1BJX01VTF80KGopKTsKIAkJCWsrKzsKIAkJfQogCQlicmVhazsKQEAgLTM4NywxNSArMzY2LDE0IEBACiAJICogRmluYWxseSwgbnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBsZW5ndGgKIAkgKi8KIAlpZiAoIWspIHsKLQkJc3RyaW5nIFswXSA9IEFDUElfQVNDSUlfWkVSTzsKKwkJc3RyaW5nWzBdID0gQUNQSV9BU0NJSV9aRVJPOwogCQlrID0gMTsKIAl9CiAKLQlzdHJpbmcgW2tdID0gMDsKKwlzdHJpbmdba10gPSAwOwogCXJldHVybiAoKHUzMikgayk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZwpAQCAtNDEyLDMwICszOTAsMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmVzdWx0X2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKQorYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiogcmVzdWx0X2Rlc2MsIHUzMiB0eXBlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5ld19idWY7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aCA9IDA7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gMTY7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSAnLCc7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2M7CisJdTggKm5ld19idWY7CisJdTMyIGk7CisJdTMyIHN0cmluZ19sZW5ndGggPSAwOworCXUxNiBiYXNlID0gMTY7CisJdTggc2VwYXJhdG9yID0gJywnOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NvbnZlcnRfdG9fc3RyaW5nIiwgb2JqX2Rlc2MpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9jb252ZXJ0X3RvX3N0cmluZyIsIG9ial9kZXNjKTsKLQotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKIAkJLyogTm8gY29udmVyc2lvbiBuZWNlc3NhcnkgKi8KIAogCQkqcmVzdWx0X2Rlc2MgPSBvYmpfZGVzYzsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Ci0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKQEAgLTQ1Miw3ICs0MjUsNyBAQAogCiAJCQkvKiBUd28gaGV4IHN0cmluZyBjaGFyYWN0ZXJzIGZvciBlYWNoIGludGVnZXIgYnl0ZSAqLwogCi0JCQlzdHJpbmdfbGVuZ3RoID0gQUNQSV9NVUxfMiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKwkJCXN0cmluZ19sZW5ndGggPSBBQ1BJX01VTF8yKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00NjAsMzEgKzQzMywzMyBAQAogCQkgKiBDcmVhdGUgYSBuZXcgU3RyaW5nCiAJCSAqIE5lZWQgZW5vdWdoIHNwYWNlIGZvciBvbmUgQVNDSUkgaW50ZWdlciAocGx1cyBudWxsIHRlcm1pbmF0b3IpCiAJCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QgKChhY3BpX3NpemUpIHN0cmluZ19sZW5ndGgpOworCQlyZXR1cm5fZGVzYyA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KChhY3BpX3NpemUpIHN0cmluZ19sZW5ndGgpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCW5ld19idWYgPSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CiAKIAkJLyogQ29udmVydCBpbnRlZ2VyIHRvIHN0cmluZyAqLwogCi0JCXN0cmluZ19sZW5ndGggPSBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBiYXNlLAotCQkJCSAgIG5ld19idWYsIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CisJCXN0cmluZ19sZW5ndGggPQorCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBiYXNlLAorCQkJCQkgICAgIG5ld19idWYsCisJCQkJCSAgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKIAogCQkvKiBOdWxsIHRlcm1pbmF0ZSBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLwogCiAJCXJldHVybl9kZXNjLT5zdHJpbmcubGVuZ3RoID0gc3RyaW5nX2xlbmd0aDsKLQkJbmV3X2J1ZiBbc3RyaW5nX2xlbmd0aF0gPSAwOworCQluZXdfYnVmW3N0cmluZ19sZW5ndGhdID0gMDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQkvKiBTZXR1cCBzdHJpbmcgbGVuZ3RoLCBiYXNlLCBhbmQgc2VwYXJhdG9yICovCiAKIAkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUw6IC8qIFVzZWQgYnkgdG9fZGVjaW1hbF9zdHJpbmcgKi8KKwkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTDoJLyogVXNlZCBieSB0b19kZWNpbWFsX3N0cmluZyAqLwogCQkJLyoKIAkJCSAqIEZyb20gQUNQSTogIklmIERhdGEgaXMgYSBidWZmZXIsIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZgogCQkJICogZGVjaW1hbCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iCkBAIC00OTgsMTEgKzQ3Myw5IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7IGkrKykgewogCQkJCWlmIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaV0gPj0gMTAwKSB7CiAJCQkJCXN0cmluZ19sZW5ndGggKz0gNDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2ldID49IDEwKSB7CisJCQkJfSBlbHNlIGlmIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaV0gPj0gMTApIHsKIAkJCQkJc3RyaW5nX2xlbmd0aCArPSAzOwotCQkJCX0KLQkJCQllbHNlIHsKKwkJCQl9IGVsc2UgewogCQkJCQlzdHJpbmdfbGVuZ3RoICs9IDI7CiAJCQkJfQogCQkJfQpAQCAtNTE4LDcgKzQ5MSw3IEBACiAJCQlzdHJpbmdfbGVuZ3RoID0gKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoICogMyk7CiAJCQlicmVhazsKIAotCQljYXNlIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVg6ICAgICAvKiBVc2VkIGJ5IHRvX2hleF9zdHJpbmcgKi8KKwkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfSEVYOgkvKiBVc2VkIGJ5IHRvX2hleF9zdHJpbmcgKi8KIAkJCS8qCiAJCQkgKiBGcm9tIEFDUEk6ICJJZiBEYXRhIGlzIGEgYnVmZmVyLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YKIAkJCSAqIGhleGFkZWNpbWFsIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiIKQEAgLTUyNyw3ICs1MDAsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJCX0KIAogCQkvKgpAQCAtNTM1LDE1ICs1MDgsMTYgQEAKIAkJICogKC0xIGJlY2F1c2Ugb2YgZXh0cmEgc2VwYXJhdG9yIGluY2x1ZGVkIGluIHN0cmluZ19sZW5ndGggZnJvbSBhYm92ZSkKIAkJICovCiAJCXN0cmluZ19sZW5ndGgtLTsKLQkJaWYgKHN0cmluZ19sZW5ndGggPiBBQ1BJX01BWF9TVFJJTkdfQ09OVkVSU0lPTikgLyogQUNQSSBsaW1pdCAqLyB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9TVFJJTkdfTElNSVQpOworCQlpZiAoc3RyaW5nX2xlbmd0aCA+IEFDUElfTUFYX1NUUklOR19DT05WRVJTSU9OKSB7CS8qIEFDUEkgbGltaXQgKi8KKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfU1RSSU5HX0xJTUlUKTsKIAkJfQogCiAJCS8qIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGFuZCBzdHJpbmcgYnVmZmVyICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgoYWNwaV9zaXplKSBzdHJpbmdfbGVuZ3RoKTsKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCgoYWNwaV9zaXplKSBzdHJpbmdfbGVuZ3RoKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQluZXdfYnVmID0gcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwpAQCAtNTUzLDEwICs1MjcsMTEgQEAKIAkJICogKHNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzKQogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOyBpKyspIHsKLQkJCW5ld19idWYgKz0gYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpICgKLQkJCQkJIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpXSwgYmFzZSwKLQkJCQkJIG5ld19idWYsIDEpOwotCQkJKm5ld19idWYrKyA9IHNlcGFyYXRvcjsgLyogZWFjaCBzZXBhcmF0ZWQgYnkgYSBjb21tYSBvciBzcGFjZSAqLworCQkJbmV3X2J1ZiArPSBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkoKGFjcGlfaW50ZWdlcikKKwkJCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlci4KKwkJCQkJCQkgICAgcG9pbnRlcltpXSwgYmFzZSwKKwkJCQkJCQkgICAgbmV3X2J1ZiwgMSk7CisJCQkqbmV3X2J1ZisrID0gc2VwYXJhdG9yOwkvKiBlYWNoIHNlcGFyYXRlZCBieSBhIGNvbW1hIG9yIHNwYWNlICovCiAJCX0KIAogCQkvKgpAQCAtNTY4LDE0ICs1NDMsMTMgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJKnJlc3VsdF9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9fdGFyZ2V0X3R5cGUKQEAgLTU5MiwxNyArNTY2LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uX3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X2NvbnZlcnRfdG9fdGFyZ2V0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSBkZXN0aW5hdGlvbl90eXBlLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYywKKwkJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9jb252ZXJ0X3RvX3RhcmdldF90eXBlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jb252ZXJ0X3RvX3RhcmdldF90eXBlIik7CiAKIAkvKiBEZWZhdWx0IGJlaGF2aW9yICovCiAKQEAgLTYxMiwxMCArNTgzLDEwIEBACiAJICogSWYgcmVxdWlyZWQgYnkgdGhlIHRhcmdldCwKIAkgKiBwZXJmb3JtIGltcGxpY2l0IGNvbnZlcnNpb24gb24gdGhlIHNvdXJjZSBiZWZvcmUgd2Ugc3RvcmUgaXQuCiAJICovCi0Jc3dpdGNoIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+b3BfaW5mby0+cnVudGltZV9hcmdzKSkgeworCXN3aXRjaCAoR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+b3BfaW5mby0+cnVudGltZV9hcmdzKSkgewogCWNhc2UgQVJHSV9TSU1QTEVfVEFSR0VUOgogCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6Ci0JY2FzZSBBUkdJX0lOVEVHRVJfUkVGOiAgICAgIC8qIEhhbmRsZXMgSW5jcmVtZW50LCBEZWNyZW1lbnQgY2FzZXMgKi8KKwljYXNlIEFSR0lfSU5URUdFUl9SRUY6CS8qIEhhbmRsZXMgSW5jcmVtZW50LCBEZWNyZW1lbnQgY2FzZXMgKi8KIAogCQlzd2l0Y2ggKGRlc3RpbmF0aW9uX3R5cGUpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgpAQCAtNjI3LDE3ICs1OTgsMTkgQEAKIAkJZGVmYXVsdDoKIAkJCS8qIE5vIGNvbnZlcnNpb24gYWxsb3dlZCBmb3IgdGhlc2UgdHlwZXMgKi8KIAotCQkJaWYgKGRlc3RpbmF0aW9uX3R5cGUgIT0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJCSJFeHBsaWNpdCBvcGVyYXRvciwgd2lsbCBzdG9yZSAoJXMpIG92ZXIgZXhpc3RpbmcgdHlwZSAoJXMpXG4iLAotCQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYyksCi0JCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoZGVzdGluYXRpb25fdHlwZSkpKTsKKwkJCWlmIChkZXN0aW5hdGlvbl90eXBlICE9CisJCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiRXhwbGljaXQgb3BlcmF0b3IsIHdpbGwgc3RvcmUgKCVzKSBvdmVyIGV4aXN0aW5nIHR5cGUgKCVzKVxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAoc291cmNlX2Rlc2MpLAorCQkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUKKwkJCQkJCSAgKGRlc3RpbmF0aW9uX3R5cGUpKSk7CiAJCQkJc3RhdHVzID0gQUVfVFlQRTsKIAkJCX0KIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBUkdJX1RBUkdFVFJFRjoKIAogCQlzd2l0Y2ggKGRlc3RpbmF0aW9uX3R5cGUpIHsKQEAgLTY0OSw1NSArNjIyLDU1IEBACiAJCQkgKiBUaGVzZSB0eXBlcyByZXF1aXJlIGFuIEludGVnZXIgb3BlcmFuZC4gIFdlIGNhbiBjb252ZXJ0CiAJCQkgKiBhIEJ1ZmZlciBvciBhIFN0cmluZyB0byBhbiBJbnRlZ2VyIGlmIG5lY2Vzc2FyeS4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKLQkJCQkJIDE2KTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIoc291cmNlX2Rlc2MsIHJlc3VsdF9kZXNjLAorCQkJCQkJICAgICAgIDE2KTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCQkJLyoKIAkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBTdHJpbmcuICBXZSBjYW4gY29udmVydCBhbgogCQkJICogSW50ZWdlciBvciBCdWZmZXIgaWYgbmVjZXNzYXJ5CiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcgKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKLQkJCQkJIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKKwkJCQkJCSAgICAgIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAJCQkvKgogCQkJICogVGhlIG9wZXJhbmQgbXVzdCBiZSBhIEJ1ZmZlci4gIFdlIGNhbiBjb252ZXJ0IGFuCiAJCQkgKiBJbnRlZ2VyIG9yIFN0cmluZyBpZiBuZWNlc3NhcnkKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlciAoc291cmNlX2Rlc2MsIHJlc3VsdF9kZXNjKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihzb3VyY2VfZGVzYywgcmVzdWx0X2Rlc2MpOwogCQkJYnJlYWs7CiAKLQogCQlkZWZhdWx0OgotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQmFkIGRlc3RpbmF0aW9uIHR5cGUgZHVyaW5nIGNvbnZlcnNpb246ICVYXG4iLAotCQkJCWRlc3RpbmF0aW9uX3R5cGUpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQmFkIGRlc3RpbmF0aW9uIHR5cGUgZHVyaW5nIGNvbnZlcnNpb246ICVYXG4iLCBkZXN0aW5hdGlvbl90eXBlKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBUkdJX1JFRkVSRU5DRToKIAkJLyoKIAkJICogY3JlYXRlX3h4eHhfZmllbGQgY2FzZXMgLSB3ZSBhcmUgc3RvcmluZyB0aGUgZmllbGQgb2JqZWN0IGludG8gdGhlIG5hbWUKIAkJICovCiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmtub3duIFRhcmdldCB0eXBlIElEIDB4JVggT3AgJXMgZGVzdF90eXBlICVzXG4iLAotCQkJR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPm9wX2luZm8tPnJ1bnRpbWVfYXJncyksCi0JCQl3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKGRlc3RpbmF0aW9uX3R5cGUpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5rbm93biBUYXJnZXQgdHlwZSBJRCAweCVYIE9wICVzIGRlc3RfdHlwZSAlc1xuIiwKKwkJCQkgIEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPm9wX2luZm8tPgorCQkJCQkJICAgICAgIHJ1bnRpbWVfYXJncyksCisJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKGRlc3RpbmF0aW9uX3R5cGUpKSk7CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQmFkIFRhcmdldCBUeXBlIChBUkdJKTogJVhcbiIsCi0JCQlHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+b3BfaW5mby0+cnVudGltZV9hcmdzKSkpCi0JCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJCYWQgVGFyZ2V0IFR5cGUgKEFSR0kpOiAlWFxuIiwKKwkJCQkgICBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5vcF9pbmZvLT4KKwkJCQkJCQlydW50aW1lX2FyZ3MpKSkKKwkJICAgIHN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAl9CiAKIAkvKgpAQCAtNzEwLDcgKzY4Myw1IEBACiAJCXN0YXR1cyA9IEFFX09LOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCmluZGV4IDgxMmNkY2IuLjkxYzQ5MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgpAQCAtNDksMTAgKzQ4LDggQEAKICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGNyZWF0ZSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4Y3JlYXRlIikKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NiwzMyArNjMsMzAgQEAKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgbmFtZWQgYWxpYXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfYWxpYXMgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9hbGlhcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnRhcmdldF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmFsaWFzX25vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGFyZ2V0X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFsaWFzX25vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9jcmVhdGVfYWxpYXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2NyZWF0ZV9hbGlhcyIpOwogCiAJLyogR2V0IHRoZSBzb3VyY2UvYWxpYXMgb3BlcmFuZHMgKGJvdGggbmFtZXNwYWNlIG5vZGVzKSAqLwogCi0JYWxpYXNfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl0YXJnZXRfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXTsKKwlhbGlhc19ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdGFyZ2V0X25vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKil3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXTsKIAogCWlmICgodGFyZ2V0X25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSB8fAotCQkodGFyZ2V0X25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykpIHsKKwkgICAgKHRhcmdldF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpKSB7CiAJCS8qCiAJCSAqIERlcmVmZXJlbmNlIGFuIGV4aXN0aW5nIGFsaWFzIHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEgY2hhaW4KIAkJICogb2YgYWxpYXNlcy4gIFdpdGggdGhpcyBjb2RlLCB3ZSBndWFyYW50ZWUgdGhhdCBhbiBhbGlhcyBpcwogCQkgKiBhbHdheXMgZXhhY3RseSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYXdheSBmcm9tIHRoZQogCQkgKiBhY3R1YWwgYWxpYXNlZCBuYW1lLgogCQkgKi8KLQkJdGFyZ2V0X25vZGUgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgdGFyZ2V0X25vZGUtPm9iamVjdCk7CisJCXRhcmdldF9ub2RlID0KKwkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJICB0YXJnZXRfbm9kZS0+b2JqZWN0KTsKIAl9CiAKIAkvKgpAQCAtMTE1LDcgKzEwOSw4IEBACiAJCSAqIHR5cGVzLCB0aGUgb2JqZWN0IGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkgdmlhIGEgU3RvcmUuCiAJCSAqLwogCQlhbGlhc19ub2RlLT50eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTOwotCQlhbGlhc19ub2RlLT5vYmplY3QgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCB0YXJnZXRfbm9kZSk7CisJCWFsaWFzX25vZGUtPm9iamVjdCA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHRhcmdldF9ub2RlKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CkBAIC0xMjYsNyArMTIxLDggQEAKIAkJICogdHlwZXMsIHRoZSBvYmplY3QgY2FuIGNoYW5nZSBkeW5hbWljYWxseSB2aWEgYSBTdG9yZS4KIAkJICovCiAJCWFsaWFzX25vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOwotCQlhbGlhc19ub2RlLT5vYmplY3QgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCB0YXJnZXRfbm9kZSk7CisJCWFsaWFzX25vZGUtPm9iamVjdCA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHRhcmdldF9ub2RlKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTM5LDE3ICsxMzUsMTggQEAKIAkJICogYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gcHJldmVudCBkZWxldGlvbiBvdXQgZnJvbSB1bmRlciBlaXRoZXIgdGhlCiAJCSAqIHRhcmdldCBub2RlIG9yIHRoZSBhbGlhcyBOb2RlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKGFsaWFzX25vZGUsCi0JCQkJIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAodGFyZ2V0X25vZGUpLCB0YXJnZXRfbm9kZS0+dHlwZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChhbGlhc19ub2RlLAorCQkJCQkgICAgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0CisJCQkJCSAgICAgICAodGFyZ2V0X25vZGUpLAorCQkJCQkgICAgICAgdGFyZ2V0X25vZGUtPnR5cGUpOwogCQlicmVhazsKIAl9CiAKIAkvKiBTaW5jZSBib3RoIG9wZXJhbmRzIGFyZSBOb2Rlcywgd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgdGhlbSAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX2V2ZW50CkBAIC0xNjIsMTggKzE1OSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9ldmVudCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX2V2ZW50KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY3JlYXRlX2V2ZW50Iik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfY3JlYXRlX2V2ZW50Iik7Ci0KLQotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfRVZFTlQpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9FVkVOVCk7CiAJaWYgKCFvYmpfZGVzYykgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTE4MywyNyArMTc2LDI3IEBACiAJICogQ3JlYXRlIHRoZSBhY3R1YWwgT1Mgc2VtYXBob3JlLCB3aXRoIHplcm8gaW5pdGlhbCB1bml0cyAtLSBtZWFuaW5nCiAJICogdGhhdCB0aGUgZXZlbnQgaXMgY3JlYXRlZCBpbiBhbiB1bnNpZ25hbGxlZCBzdGF0ZQogCSAqLwotCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSAoQUNQSV9OT19VTklUX0xJTUlULCAwLAotCQkJICZvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKEFDUElfTk9fVU5JVF9MSU1JVCwgMCwKKwkJCQkJICAmb2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBBdHRhY2ggb2JqZWN0IHRvIHRoZSBOb2RlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKLQkJCSBvYmpfZGVzYywgQUNQSV9UWVBFX0VWRU5UKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopd2Fsa19zdGF0ZS0+CisJCQkJICBvcGVyYW5kc1swXSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9FVkVOVCk7CiAKLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCS8qCiAJICogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IChvbiBlcnJvciwgd2lsbCBjYXVzZSBkZWxldGlvbgogCSAqIG9mIGJvdGggb2JqZWN0IGFuZCBzZW1hcGhvcmUgaWYgcHJlc2VudC4pCiAJICovCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfbXV0ZXgKQEAgLTIxOCwyMCArMjExLDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX211dGV4ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfbXV0ZXgoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2NyZWF0ZV9tdXRleCIsIEFDUElfV0FMS19PUEVSQU5EUyk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfY3JlYXRlX211dGV4IiwgQUNQSV9XQUxLX09QRVJBTkRTKTsKIAogCS8qIENyZWF0ZSB0aGUgbmV3IG11dGV4IG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9NVVRFWCk7CisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01VVEVYKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMjQyLDMwICsyMzEsMzAgQEAKIAkgKiBPbmUgdW5pdCBtYXggdG8gbWFrZSBpdCBhIG11dGV4LCB3aXRoIG9uZSBpbml0aWFsIHVuaXQgdG8gYWxsb3cKIAkgKiB0aGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgxLCAxLCAmb2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSgxLCAxLCAmb2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBJbml0IG9iamVjdCBhbmQgYXR0YWNoIHRvIE5TIG5vZGUgKi8KIAotCW9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID0gKHU4KSB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+aW50ZWdlci52YWx1ZTsKLQlvYmpfZGVzYy0+bXV0ZXgubm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwlvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCA9CisJICAgICh1OCkgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPmludGVnZXIudmFsdWU7CisJb2JqX2Rlc2MtPm11dGV4Lm5vZGUgPQorCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKil3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAob2JqX2Rlc2MtPm11dGV4Lm5vZGUsCi0JCQkgb2JqX2Rlc2MsIEFDUElfVFlQRV9NVVRFWCk7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG9ial9kZXNjLT5tdXRleC5ub2RlLAorCQkJCSAgICAgICBvYmpfZGVzYywgQUNQSV9UWVBFX01VVEVYKTsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAkvKgogCSAqIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAob24gZXJyb3IsIHdpbGwgY2F1c2UgZGVsZXRpb24KIAkgKiBvZiBib3RoIG9iamVjdCBhbmQgc2VtYXBob3JlIGlmIHByZXNlbnQuKQogCSAqLwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbgpAQCAtMjgyLDIwICsyNzEsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9yZWdpb24gKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGgsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fc3BhY2UsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfY3JlYXRlX3JlZ2lvbih1OCAqIGFtbF9zdGFydCwKKwkJICAgICAgdTMyIGFtbF9sZW5ndGgsCisJCSAgICAgIHU4IHJlZ2lvbl9zcGFjZSwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZ2lvbl9vYmoyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2NyZWF0ZV9yZWdpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2NyZWF0ZV9yZWdpb24iKTsKIAogCS8qIEdldCB0aGUgTmFtZXNwYWNlIE5vZGUgKi8KIApAQCAtMzA1LDggKzI5MCw4IEBACiAJICogSWYgdGhlIHJlZ2lvbiBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzIG5vZGUsCiAJICoganVzdCByZXR1cm4KIAkgKi8KLQlpZiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlpZiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyoKQEAgLTMxNCwxNyArMjk5LDE4IEBACiAJICogcmFuZ2UKIAkgKi8KIAlpZiAoKHJlZ2lvbl9zcGFjZSA+PSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMpICYmCi0JCShyZWdpb25fc3BhY2UgPCBBQ1BJX1VTRVJfUkVHSU9OX0JFR0lOKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIGFkZHJlc3Nfc3BhY2UgdHlwZSAlWFxuIiwgcmVnaW9uX3NwYWNlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfU1BBQ0VfSUQpOworCSAgICAocmVnaW9uX3NwYWNlIDwgQUNQSV9VU0VSX1JFR0lPTl9CRUdJTikpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGFkZHJlc3Nfc3BhY2UgdHlwZSAlWFxuIiwKKwkJCQkgICByZWdpb25fc3BhY2UpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1NQQUNFX0lEKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiUmVnaW9uIFR5cGUgLSAlcyAoJVgpXG4iLAotCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX3NwYWNlKSwgcmVnaW9uX3NwYWNlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELCAiUmVnaW9uIFR5cGUgLSAlcyAoJVgpXG4iLAorCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fc3BhY2UpLCByZWdpb25fc3BhY2UpKTsKIAogCS8qIENyZWF0ZSB0aGUgcmVnaW9uIGRlc2NyaXB0b3IgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfUkVHSU9OKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUkVHSU9OKTsKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMzM0LDcgKzMyMCw3IEBACiAJICogUmVtZW1iZXIgbG9jYXRpb24gaW4gQU1MIHN0cmVhbSBvZiBhZGRyZXNzICYgbGVuZ3RoCiAJICogb3BlcmFuZHMgc2luY2UgdGhleSBuZWVkIHRvIGJlIGV2YWx1YXRlZCBhdCBydW4gdGltZS4KIAkgKi8KLQlyZWdpb25fb2JqMiAgICAgICAgICAgICAgICAgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCXJlZ2lvbl9vYmoyID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKIAlyZWdpb25fb2JqMi0+ZXh0cmEuYW1sX3N0YXJ0ID0gYW1sX3N0YXJ0OwogCXJlZ2lvbl9vYmoyLT5leHRyYS5hbWxfbGVuZ3RoID0gYW1sX2xlbmd0aDsKIApAQCAtMzQzLDIyICszMjksMjAgQEAKIAlvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkID0gcmVnaW9uX3NwYWNlOwogCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9IDA7CiAJb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPSAwOwotCW9ial9kZXNjLT5yZWdpb24ubm9kZSAgID0gbm9kZTsKKwlvYmpfZGVzYy0+cmVnaW9uLm5vZGUgPSBub2RlOwogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHJlZ2lvbiBvYmplY3QgaW4gdGhlIHBhcmVudCBOb2RlICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfUkVHSU9OKTsKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9SRUdJT04pOwogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV90YWJsZV9yZWdpb24KQEAgLTM3MSwyMCArMzU1LDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iajI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9jcmVhdGVfdGFibGVfcmVnaW9uIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jcmVhdGVfdGFibGVfcmVnaW9uIik7CiAKIAkvKiBHZXQgdGhlIE5vZGUgZnJvbSB0aGUgb2JqZWN0IHN0YWNrICAqLwogCkBAIC0zOTQsNjYgKzM3NCw2NCBAQAogCSAqIElmIHRoZSByZWdpb24gb2JqZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhpcyBub2RlLAogCSAqIGp1c3QgcmV0dXJuCiAJICovCi0JaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEZpbmQgdGhlIEFDUEkgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZmluZF90YWJsZSAob3BlcmFuZFsxXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkgICBvcGVyYW5kWzJdLT5zdHJpbmcucG9pbnRlciwKLQkJCSAgIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLCAmdGFibGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZmluZF90YWJsZShvcGVyYW5kWzFdLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLCAmdGFibGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIHJlZ2lvbiBkZXNjcmlwdG9yICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX1JFR0lPTik7CisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1JFR0lPTik7CiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAotCXJlZ2lvbl9vYmoyICAgICAgICAgICAgICAgICAgICAgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCXJlZ2lvbl9vYmoyID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKIAlyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQgPSBOVUxMOwogCiAJLyogSW5pdCB0aGUgcmVnaW9uIGZyb20gdGhlIG9wZXJhbmRzICovCiAKIAlvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkID0gUkVHSU9OX0RBVEFfVEFCTEU7Ci0Jb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgQUNQSV9UT19JTlRFR0VSICh0YWJsZSk7CisJb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzID0KKwkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgQUNQSV9UT19JTlRFR0VSKHRhYmxlKTsKIAlvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCA9IHRhYmxlLT5sZW5ndGg7Ci0Jb2JqX2Rlc2MtPnJlZ2lvbi5ub2RlICAgPSBub2RlOwotCW9ial9kZXNjLT5yZWdpb24uZmxhZ3MgID0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJb2JqX2Rlc2MtPnJlZ2lvbi5ub2RlID0gbm9kZTsKKwlvYmpfZGVzYy0+cmVnaW9uLmZsYWdzID0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAKIAkvKiBJbnN0YWxsIHRoZSBuZXcgcmVnaW9uIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9SRUdJT04pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9SRUdJT04pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAob2JqX2Rlc2MsIEZBTFNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbihvYmpfZGVzYywgRkFMU0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzID09IEFFX05PVF9FWElTVCkgewogCQkJc3RhdHVzID0gQUVfT0s7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAl9CiAKIAlvYmpfZGVzYy0+cmVnaW9uLmZsYWdzIHw9IEFPUE9CSl9TRVRVUF9DT01QTEVURTsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yCkBAIC00NjgsNDMgKzQ0NiwzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3IgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Ioc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfY3JlYXRlX3Byb2Nlc3NvciIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NyZWF0ZV9wcm9jZXNzb3IiLCB3YWxrX3N0YXRlKTsKIAogCS8qIENyZWF0ZSB0aGUgcHJvY2Vzc29yIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9QUk9DRVNTT1IpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9QUk9DRVNTT1IpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzb3Igb2JqZWN0IGZyb20gdGhlIG9wZXJhbmRzICovCiAKLQlvYmpfZGVzYy0+cHJvY2Vzc29yLnByb2NfaWQgPSAodTgpICAgICAgICAgIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7Ci0Jb2JqX2Rlc2MtPnByb2Nlc3Nvci5hZGRyZXNzID0gKGFjcGlfaW9fYWRkcmVzcykgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKLQlvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCA9ICh1OCkgICAgICAgICAgIG9wZXJhbmRbM10tPmludGVnZXIudmFsdWU7CisJb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkID0gKHU4KSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5wcm9jZXNzb3IuYWRkcmVzcyA9CisJICAgIChhY3BpX2lvX2FkZHJlc3MpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CisJb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGggPSAodTgpIG9wZXJhbmRbM10tPmludGVnZXIudmFsdWU7CiAKIAkvKiBJbnN0YWxsIHRoZSBwcm9jZXNzb3Igb2JqZWN0IGluIHRoZSBwYXJlbnQgTm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb3BlcmFuZFswXSwKLQkJCSAgb2JqX2Rlc2MsIEFDUElfVFlQRV9QUk9DRVNTT1IpOworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdLAorCQkJCSAgICAgICBvYmpfZGVzYywgQUNQSV9UWVBFX1BST0NFU1NPUik7CiAKIAkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlCkBAIC01MTksNDMgKzQ5MywzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSIsIHdhbGtfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSIsIHdhbGtfc3RhdGUpOwogCiAJLyogQ3JlYXRlIHRoZSBwb3dlciByZXNvdXJjZSBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfUE9XRVIpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9QT1dFUik7CiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIHBvd2VyIG9iamVjdCBmcm9tIHRoZSBvcGVyYW5kcyAqLwogCiAJb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKLQlvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIgPSAodTE2KSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlciA9CisJICAgICh1MTYpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CiAKIAkvKiBJbnN0YWxsIHRoZSAgcG93ZXIgcmVzb3VyY2Ugb2JqZWN0IGluIHRoZSBwYXJlbnQgTm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb3BlcmFuZFswXSwKLQkJCSAgb2JqX2Rlc2MsIEFDUElfVFlQRV9QT1dFUik7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wZXJhbmRbMF0sCisJCQkJICAgICAgIG9ial9kZXNjLCBBQ1BJX1RZUEVfUE9XRVIpOwogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZApAQCAtNTcxLDI1ICs1NDEsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9tZXRob2QgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfY3JlYXRlX21ldGhvZCh1OCAqIGFtbF9zdGFydCwKKwkJICAgICAgdTMyIGFtbF9sZW5ndGgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfZmxhZ3M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4IG1ldGhvZF9mbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9jcmVhdGVfbWV0aG9kIiwgd2Fsa19zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfY3JlYXRlX21ldGhvZCIsIHdhbGtfc3RhdGUpOwogCiAJLyogQ3JlYXRlIGEgbmV3IG1ldGhvZCBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTUVUSE9EKTsKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTUVUSE9EKTsKIAlpZiAoIW9ial9kZXNjKSB7Ci0JICAgcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBTYXZlIHRoZSBtZXRob2QncyBBTUwgcG9pbnRlciBhbmQgbGVuZ3RoICAqLwpAQCAtNjAzLDggKzU2OSwxMCBAQAogCSAqLwogCW1ldGhvZF9mbGFncyA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKIAotCW9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzID0gKHU4KSAobWV0aG9kX2ZsYWdzICYgfkFNTF9NRVRIT0RfQVJHX0NPVU5UKTsKLQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50ID0gKHU4KSAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9BUkdfQ09VTlQpOworCW9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzID0KKwkgICAgKHU4KSAobWV0aG9kX2ZsYWdzICYgfkFNTF9NRVRIT0RfQVJHX0NPVU5UKTsKKwlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50ID0KKwkgICAgKHU4KSAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9BUkdfQ09VTlQpOwogCiAJLyoKIAkgKiBHZXQgdGhlIGNvbmN1cnJlbmN5IGNvdW50LiAgSWYgcmVxdWlyZWQsIGEgc2VtYXBob3JlIHdpbGwgYmUKQEAgLTYxMywzMiArNTgxLDI4IEBACiAJaWYgKGFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKIAkJb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSA9IDE7CiAJCW9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzIHw9IEFNTF9NRVRIT0RfU0VSSUFMSVpFRDsKLQl9Ci0JZWxzZSBpZiAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TRVJJQUxJWkVEKSB7CisJfSBlbHNlIGlmIChtZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX1NFUklBTElaRUQpIHsKIAkJLyoKIAkJICogQUNQSSAxLjA6IENvbmN1cnJlbmN5ID0gMQogCQkgKiBBQ1BJIDIuMDogQ29uY3VycmVuY3kgPSAoc3luY19sZXZlbCAoaW4gbWV0aG9kIGRlY2xhcmF0aW9uKSArIDEpCiAJCSAqLwogCQlvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5ID0gKHU4KQotCQkJCSAgKCgobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TWU5DSF9MRVZFTCkgPj4gNCkgKyAxKTsKLQl9Ci0JZWxzZSB7CisJCSAgICAoKChtZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX1NZTkNIX0xFVkVMKSA+PiA0KSArIDEpOworCX0gZWxzZSB7CiAJCW9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPSBBQ1BJX0lORklOSVRFX0NPTkNVUlJFTkNZOwogCX0KIAogCS8qIEF0dGFjaCB0aGUgbmV3IG9iamVjdCB0byB0aGUgbWV0aG9kIE5vZGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wZXJhbmRbMF0sCi0JCQkgIG9ial9kZXNjLCBBQ1BJX1RZUEVfTUVUSE9EKTsKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb3BlcmFuZFswXSwKKwkJCQkgICAgICAgb2JqX2Rlc2MsIEFDUElfVFlQRV9NRVRIT0QpOwogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCiAJLyogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIHRoZSBvcGVyYW5kICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9wZXJhbmRbMV0pOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFsxXSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCmluZGV4IDQwODUwMDYuLmJjMmZhOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKQEAgLTQxLDcgKzQxLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CkBAIC00OSwzNyArNDgsMjcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGR1bXAiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X3N0cmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9leF9vdXRfcG9pbnRlciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9leF9vdXRfaW50ZWdlciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX2V4X291dF9hZGRyZXNzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIHZhbHVlKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwotCitBQ1BJX01PRFVMRV9OQU1FKCJleGR1bXAiKQogCiAvKgogICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdXNlZCBmb3IgZGVidWcgb3V0cHV0IG9ubHkKICAqLwogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKyNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfc3RyaW5nKGNoYXIgKnRpdGxlLCBjaGFyICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3BvaW50ZXIoY2hhciAqdGl0bGUsIHZvaWQgKnZhbHVlKTsKKworc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfaW50ZWdlcihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKTsKKworc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfYWRkcmVzcyhjaGFyICp0aXRsZSwgYWNwaV9waHlzaWNhbF9hZGRyZXNzIHZhbHVlKTsKKworc3RhdGljIHZvaWQgYWNwaV9leF9kdW1wX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X2R1bXBfcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywgdTMyIGxldmVsLCB1MzIgaW5kZXgpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTQsMTQzICs4MywxNDAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2V4X2R1bXBfb3BlcmFuZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCkKK3ZvaWQgYWNwaV9leF9kdW1wX29wZXJhbmQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBkZXB0aCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCXUzMiBsZW5ndGg7CisJdTMyIGluZGV4OwogCisJQUNQSV9GVU5DVElPTl9OQU1FKCJleF9kdW1wX29wZXJhbmQiKQogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZXhfZHVtcF9vcGVyYW5kIikKLQotCi0JaWYgKCEoKEFDUElfTFZfRVhFQyAmIGFjcGlfZGJnX2xldmVsKSAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKKwkgICAgaWYgKCEKKwkJKChBQ1BJX0xWX0VYRUMgJiBhY3BpX2RiZ19sZXZlbCkKKwkJICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgewogCQlyZXR1cm47CiAJfQogCiAJaWYgKCFvYmpfZGVzYykgewogCQkvKiBUaGlzIGNvdWxkIGJlIGEgbnVsbCBlbGVtZW50IG9mIGEgcGFja2FnZSAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJOdWxsIE9iamVjdCBEZXNjcmlwdG9yXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk51bGwgT2JqZWN0IERlc2NyaXB0b3JcbiIpKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiJXAgaXMgYSBOUyBOb2RlOiAiLCBvYmpfZGVzYykpOwotCQlBQ1BJX0RVTVBfRU5UUlkgKG9ial9kZXNjLCBBQ1BJX0xWX0VYRUMpOworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiVwIE5hbWVzcGFjZSBOb2RlOiAiLAorCQkJCSAgb2JqX2Rlc2MpKTsKKwkJQUNQSV9EVU1QX0VOVFJZKG9ial9kZXNjLCBBQ1BJX0xWX0VYRUMpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSIlcCBpcyBub3QgYSBub2RlIG9yIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAotCQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAob2JqX2Rlc2MpKSk7Ci0JCUFDUElfRFVNUF9CVUZGRVIgKG9ial9kZXNjLCBzaXplb2YgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICIlcCBpcyBub3QgYSBub2RlIG9yIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAorCQkJCSAgb2JqX2Rlc2MsCisJCQkJICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKSk7CisJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBvYmpfZGVzYyBpcyBhIHZhbGlkIG9iamVjdCAqLwogCiAJaWYgKGRlcHRoID4gMCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiJSpzWyV1XSAlcCAiLAotCQkJZGVwdGgsICIgIiwgZGVwdGgsIG9ial9kZXNjKSk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiJXAgIiwgb2JqX2Rlc2MpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJSpzWyV1XSAlcCAiLAorCQkJCSAgZGVwdGgsICIgIiwgZGVwdGgsIG9ial9kZXNjKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJXAgIiwgb2JqX2Rlc2MpKTsKIAl9CiAKIAkvKiBEZWNvZGUgb2JqZWN0IHR5cGUgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCXN3aXRjaCAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpIHsKIAkJY2FzZSBBTUxfREVCVUdfT1A6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiUmVmZXJlbmNlOiBEZWJ1Z1xuIik7CisJCQlhY3BpX29zX3ByaW50ZigiUmVmZXJlbmNlOiBEZWJ1Z1xuIik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX05BTUVfT1A6CiAKLQkJCUFDUElfRFVNUF9QQVRITkFNRSAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsCi0JCQkJIlJlZmVyZW5jZTogTmFtZTogIiwgQUNQSV9MVl9JTkZPLCBfQ09NUE9ORU5UKTsKLQkJCUFDUElfRFVNUF9FTlRSWSAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsIEFDUElfTFZfSU5GTyk7CisJCQlBQ1BJX0RVTVBfUEFUSE5BTUUob2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsCisJCQkJCSAgICJSZWZlcmVuY2U6IE5hbWU6ICIsIEFDUElfTFZfSU5GTywKKwkJCQkJICAgX0NPTVBPTkVOVCk7CisJCQlBQ1BJX0RVTVBfRU5UUlkob2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsCisJCQkJCUFDUElfTFZfSU5GTyk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOREVYX09QOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlJlZmVyZW5jZTogSW5kZXggJXBcbiIsCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZTogSW5kZXggJXBcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfUkVGX09GX09QOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlJlZmVyZW5jZTogKHJlZl9vZikgJXBcbiIsCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZTogKHJlZl9vZikgJXBcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfQVJHX09QOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlJlZmVyZW5jZTogQXJnJWQiLAotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZWZlcmVuY2U6IEFyZyVkIiwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpOwogCi0JCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJCS8qIFZhbHVlIGlzIGFuIEludGVnZXIgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCisJCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPgorCQkJCQkJCQkgIGludGVnZXIuCisJCQkJCQkJCSAgdmFsdWUpKTsKIAkJCX0KIAotCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0xPQ0FMX09QOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlJlZmVyZW5jZTogTG9jYWwlZCIsCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpOworCQkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZTogTG9jYWwlZCIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KTsKIAotCQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAogCQkJCS8qIFZhbHVlIGlzIGFuIEludGVnZXIgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCisJCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPgorCQkJCQkJCQkgIGludGVnZXIuCisJCQkJCQkJCSAgdmFsdWUpKTsKIAkJCX0KIAotCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJSZWZlcmVuY2UuTm9kZS0+TmFtZSAlWFxuIiwKLQkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUtPm5hbWUuaW50ZWdlcik7CisJCQlhY3BpX29zX3ByaW50ZigiUmVmZXJlbmNlLk5vZGUtPk5hbWUgJVhcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uubm9kZS0+bmFtZS5pbnRlZ2VyKTsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAogCQkJLyogVW5rbm93biBvcGNvZGUgKi8KIAotCQkJYWNwaV9vc19wcmludGYgKCJVbmtub3duIFJlZmVyZW5jZSBvcGNvZGU9JVhcbiIsCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpOworCQkJYWNwaV9vc19wcmludGYoIlVua25vd24gUmVmZXJlbmNlIG9wY29kZT0lWFxuIiwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpOwogCQkJYnJlYWs7CiAKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiQnVmZmVyIGxlbiAlWCBAICVwIFxuIiwKLQkJCW9ial9kZXNjLT5idWZmZXIubGVuZ3RoLCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOworCQlhY3BpX29zX3ByaW50ZigiQnVmZmVyIGxlbiAlWCBAICVwIFxuIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCwKKwkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOwogCiAJCWxlbmd0aCA9IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOwogCQlpZiAobGVuZ3RoID4gNjQpIHsKQEAgLTI0MCwxNzggKzIyNiwxNjYgQEAKIAkJLyogRGVidWcgb25seSAtLSBkdW1wIHRoZSBidWZmZXIgY29udGVudHMgKi8KIAogCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIkJ1ZmZlciBDb250ZW50czogIik7CisJCQlhY3BpX29zX3ByaW50ZigiQnVmZmVyIENvbnRlbnRzOiAiKTsKIAogCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIgJTAyeCIsIG9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpbmRleF0pOworCQkJCWFjcGlfb3NfcHJpbnRmKCIgJTAyeCIsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaW5kZXhdKTsKIAkJCX0KLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiSW50ZWdlciAlOC44WCU4LjhYXG4iLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkpOworCQlhY3BpX29zX3ByaW50ZigiSW50ZWdlciAlOC44WCU4LjhYXG4iLAorCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlhY3BpX29zX3ByaW50ZiAoIlBhY2thZ2UgW0xlbiAlWF0gZWxlbWVudF9hcnJheSAlcFxuIiwKLQkJCW9ial9kZXNjLT5wYWNrYWdlLmNvdW50LCBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyk7CisJCWFjcGlfb3NfcHJpbnRmKCJQYWNrYWdlIFtMZW4gJVhdIGVsZW1lbnRfYXJyYXkgJXBcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQsCisJCQkgICAgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpOwogCiAJCS8qCiAJCSAqIElmIGVsZW1lbnRzIGV4aXN0LCBwYWNrYWdlIGVsZW1lbnQgcG9pbnRlciBpcyB2YWxpZCwKIAkJICogYW5kIGRlYnVnX2xldmVsIGV4Y2VlZHMgMSwgZHVtcCBwYWNrYWdlJ3MgZWxlbWVudHMuCiAJCSAqLwogCQlpZiAob2JqX2Rlc2MtPnBhY2thZ2UuY291bnQgJiYKLQkJCW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzICYmCi0JCQlhY3BpX2RiZ19sZXZlbCA+IDEpIHsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG9ial9kZXNjLT5wYWNrYWdlLmNvdW50OyBpbmRleCsrKSB7Ci0JCQkJYWNwaV9leF9kdW1wX29wZXJhbmQgKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XSwgZGVwdGgrMSk7CisJCSAgICBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyAmJiBhY3BpX2RiZ19sZXZlbCA+IDEpIHsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG9ial9kZXNjLT5wYWNrYWdlLmNvdW50OworCQkJICAgICBpbmRleCsrKSB7CisJCQkJYWNwaV9leF9kdW1wX29wZXJhbmQob2JqX2Rlc2MtPnBhY2thZ2UuCisJCQkJCQkgICAgIGVsZW1lbnRzW2luZGV4XSwKKwkJCQkJCSAgICAgZGVwdGggKyAxKTsKIAkJCX0KIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiUmVnaW9uICVzICglWCkiLAotCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQpLAotCQkJb2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCk7CisJCWFjcGlfb3NfcHJpbnRmKCJSZWdpb24gJXMgKCVYKSIsCisJCQkgICAgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUob2JqX2Rlc2MtPnJlZ2lvbi4KKwkJCQkJCSAgICAgICBzcGFjZV9pZCksCisJCQkgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCk7CiAKIAkJLyoKIAkJICogSWYgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBoYXZlIG5vdCBiZWVuIGV2YWx1YXRlZCwKIAkJICogZG9uJ3QgcHJpbnQgdGhlbS4KIAkJICovCiAJCWlmICghKG9ial9kZXNjLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKLQkJfQotCQllbHNlIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiIGJhc2UgJTguOFglOC44WCBMZW5ndGggJVhcbiIsCi0JCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAotCQkJCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQl9IGVsc2UgeworCQkJYWNwaV9vc19wcmludGYoIiBiYXNlICU4LjhYJTguOFggTGVuZ3RoICVYXG4iLAorCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPnJlZ2lvbi4KKwkJCQkJCQkgIGFkZHJlc3MpLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlhY3BpX29zX3ByaW50ZiAoIlN0cmluZyBsZW5ndGggJVggQCAlcCAiLAotCQkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgsCi0JCQlvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCQlhY3BpX29zX3ByaW50ZigiU3RyaW5nIGxlbmd0aCAlWCBAICVwICIsCisJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgsCisJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKIAotCQlhY3BpX3V0X3ByaW50X3N0cmluZyAob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCBBQ1BJX1VJTlQ4X01BWCk7Ci0JCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCBBQ1BJX1VJTlQ4X01BWCk7CisJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAotCQlhY3BpX29zX3ByaW50ZiAoImJhbmtfZmllbGRcbiIpOworCQlhY3BpX29zX3ByaW50ZigiYmFua19maWVsZFxuIik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAKLQkJYWNwaV9vc19wcmludGYgKAotCQkJInJlZ2lvbl9maWVsZDogQml0cz0lWCBhY2Nfd2lkdGg9JVggTG9jaz0lWCBVcGRhdGU9JVggYXQgYnl0ZT0lWCBiaXQ9JVggb2YgYmVsb3c6XG4iLAotCQkJb2JqX2Rlc2MtPmZpZWxkLmJpdF9sZW5ndGgsCi0JCQlvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQlvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfTE9DS19SVUxFX01BU0ssCi0JCQlvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSywKLQkJCW9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJb2JqX2Rlc2MtPmZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCQlhY3BpX29zX3ByaW50ZgorCQkgICAgKCJyZWdpb25fZmllbGQ6IEJpdHM9JVggYWNjX3dpZHRoPSVYIExvY2s9JVggVXBkYXRlPSVYIGF0IGJ5dGU9JVggYml0PSVYIG9mIGJlbG93OlxuIiwKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCSAgICAgb2JqX2Rlc2MtPmZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLLAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLLAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAotCQlhY3BpX2V4X2R1bXBfb3BlcmFuZCAob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmosIGRlcHRoKzEpOworCQlhY3BpX2V4X2R1bXBfb3BlcmFuZChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiwgZGVwdGggKyAxKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiaW5kZXhfZmllbGRcbiIpOworCQlhY3BpX29zX3ByaW50ZigiaW5kZXhfZmllbGRcbiIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCi0JCWFjcGlfb3NfcHJpbnRmICgKLQkJCSJidWZmZXJfZmllbGQ6ICVYIGJpdHMgYXQgYnl0ZSAlWCBiaXQgJVggb2YgXG4iLAotCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJYWNwaV9vc19wcmludGYoImJ1ZmZlcl9maWVsZDogJVggYml0cyBhdCBieXRlICVYIGJpdCAlWCBvZiBcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwogCiAJCWlmICghb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiKk5VTEwqIFxuIikpOwotCQl9Ci0JCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopICE9Ci0JCQkJIEFDUElfVFlQRV9CVUZGRVIpIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiKm5vdCBhIEJ1ZmZlciogXG4iKTsKLQkJfQotCQllbHNlIHsKLQkJCWFjcGlfZXhfZHVtcF9vcGVyYW5kIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmosIGRlcHRoKzEpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiKk5VTEwqIFxuIikpOworCQl9IGVsc2UKKwkJICAgIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopCisJCQkhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCQlhY3BpX29zX3ByaW50ZigiKm5vdCBhIEJ1ZmZlciogXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfZXhfZHVtcF9vcGVyYW5kKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiwKKwkJCQkJICAgICBkZXB0aCArIDEpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9FVkVOVDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIkV2ZW50XG4iKTsKKwkJYWNwaV9vc19wcmludGYoIkV2ZW50XG4iKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIk1ldGhvZCglWCkgQCAlcDolWFxuIiwKLQkJCW9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCi0JCQlvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKLQkJCW9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CisJCWFjcGlfb3NfcHJpbnRmKCJNZXRob2QoJVgpIEAgJXA6JVhcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCwKKwkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAKLQkJYWNwaV9vc19wcmludGYgKCJNdXRleFxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJNdXRleFxuIik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCJEZXZpY2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiRGV2aWNlXG4iKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiUG93ZXJcbiIpOworCQlhY3BpX29zX3ByaW50ZigiUG93ZXJcbiIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiUHJvY2Vzc29yXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIlByb2Nlc3NvclxuIik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9USEVSTUFMOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiVGhlcm1hbFxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJUaGVybWFsXG4iKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCS8qIFVua25vd24gVHlwZSAqLwogCi0JCWFjcGlfb3NfcHJpbnRmICgiVW5rbm93biBUeXBlICVYXG4iLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKTsKKwkJYWNwaV9vc19wcmludGYoIlVua25vd24gVHlwZSAlWFxuIiwKKwkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmRzCkBAIC00MjksMjAgKzQwMywxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9leF9kdW1wX29wZXJhbmRzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZHMsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlkZW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2xldmVscywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpub3RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIpCithY3BpX2V4X2R1bXBfb3BlcmFuZHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmRzLAorCQkgICAgICBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJICAgICAgY2hhciAqaWRlbnQsCisJCSAgICAgIHUzMiBudW1fbGV2ZWxzLAorCQkgICAgICBjaGFyICpub3RlLCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyKQogewotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImV4X2R1bXBfb3BlcmFuZHMiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZXhfZHVtcF9vcGVyYW5kcyIpOwogCiAJaWYgKCFpZGVudCkgewogCQlpZGVudCA9ICI/IjsKQEAgLTQ1Miw5ICs0MjEsOSBAQAogCQlub3RlID0gIj8iOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSIqKioqKioqKioqKioqIE9wZXJhbmQgU3RhY2sgQ29udGVudHMgKE9wY29kZSBbJXNdLCAlZCBPcGVyYW5kcylcbiIsCi0JCWlkZW50LCBudW1fbGV2ZWxzKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiKioqKioqKioqKioqKiBPcGVyYW5kIFN0YWNrIENvbnRlbnRzIChPcGNvZGUgWyVzXSwgJWQgT3BlcmFuZHMpXG4iLAorCQkJICBpZGVudCwgbnVtX2xldmVscykpOwogCiAJaWYgKG51bV9sZXZlbHMgPT0gMCkgewogCQludW1fbGV2ZWxzID0gMTsKQEAgLTQ2MywxNiArNDMyLDE1IEBACiAJLyogRHVtcCB0aGUgb3BlcmFuZCBzdGFjayBzdGFydGluZyBhdCB0aGUgdG9wICovCiAKIAlmb3IgKGkgPSAwOyBudW1fbGV2ZWxzID4gMDsgaS0tLCBudW1fbGV2ZWxzLS0pIHsKLQkJYWNwaV9leF9kdW1wX29wZXJhbmQgKG9wZXJhbmRzW2ldLCAwKTsKKwkJYWNwaV9leF9kdW1wX29wZXJhbmQob3BlcmFuZHNbaV0sIDApOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSIqKioqKioqKioqKioqIFN0YWNrIGR1bXAgZnJvbSAlcyglZCksICVzXG4iLAotCQltb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsIG5vdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICIqKioqKioqKioqKioqIE9wZXJhbmQgU3RhY2sgZHVtcCBmcm9tICVzKCVkKSwgJXNcbiIsCisJCQkgIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlciwgbm90ZSkpOwogCXJldHVybjsKIH0KIAotCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDg3LDQ0ICs0NTUsMzEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9leF9vdXRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSkKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpCiB7Ci0JYWNwaV9vc19wcmludGYgKCIlMjBzIDogJXNcbiIsIHRpdGxlLCB2YWx1ZSk7CisJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlc1xuIiwgdGl0bGUsIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X3BvaW50ZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKQorc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfcG9pbnRlcihjaGFyICp0aXRsZSwgdm9pZCAqdmFsdWUpCiB7Ci0JYWNwaV9vc19wcmludGYgKCIlMjBzIDogJXBcbiIsIHRpdGxlLCB2YWx1ZSk7CisJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlcFxuIiwgdGl0bGUsIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfZXhfb3V0X2ludGVnZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpCitzdGF0aWMgdm9pZCBhY3BpX2V4X291dF9pbnRlZ2VyKGNoYXIgKnRpdGxlLCB1MzIgdmFsdWUpCiB7Ci0JYWNwaV9vc19wcmludGYgKCIlMjBzIDogJVhcbiIsIHRpdGxlLCB2YWx1ZSk7CisJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlLjJYXG4iLCB0aXRsZSwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZAotYWNwaV9leF9vdXRfYWRkcmVzcyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICB2YWx1ZSkKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X2FkZHJlc3MoY2hhciAqdGl0bGUsIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyB2YWx1ZSkKIHsKIAogI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgotCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVwXG4iLCB0aXRsZSwgdmFsdWUpOworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXBcbiIsIHRpdGxlLCB2YWx1ZSk7CiAjZWxzZQotCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICU4LjhYJTguOFhcbiIsIHRpdGxlLCBBQ1BJX0ZPUk1BVF9VSU5UNjQgKHZhbHVlKSk7CisJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlOC44WCU4LjhYXG4iLCB0aXRsZSwgQUNQSV9GT1JNQVRfVUlOVDY0KHZhbHVlKSk7CiAjZW5kaWYKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfbm9kZQpAQCAtNTM2LDM4ICs0OTEsMTYxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF9kdW1wX25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK3ZvaWQgYWNwaV9leF9kdW1wX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIHUzMiBmbGFncykKIHsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlpZiAoIWZsYWdzKSB7Ci0JCWlmICghKChBQ1BJX0xWX09CSkVDVFMgJiBhY3BpX2RiZ19sZXZlbCkgJiYgKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpKSB7CisJCWlmICghCisJCSAgICAoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKQorCQkgICAgICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgewogCQkJcmV0dXJuOwogCQl9CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCIlMjBzIDogJTQuNHNcbiIsICAgICAiTmFtZSIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSkpOwotCWFjcGlfZXhfb3V0X3N0cmluZyAoIlR5cGUiLCAgICAgICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChub2RlLT50eXBlKSk7Ci0JYWNwaV9leF9vdXRfaW50ZWdlciAoIkZsYWdzIiwgICAgICAgICBub2RlLT5mbGFncyk7Ci0JYWNwaV9leF9vdXRfaW50ZWdlciAoIk93bmVyIElkIiwgICAgICBub2RlLT5vd25lcl9pZCk7Ci0JYWNwaV9leF9vdXRfaW50ZWdlciAoIlJlZmVyZW5jZSBDb3VudCIsIG5vZGUtPnJlZmVyZW5jZV9jb3VudCk7Ci0JYWNwaV9leF9vdXRfcG9pbnRlciAoIkF0dGFjaGVkIE9iamVjdCIsIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSkpOwotCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJjaGlsZF9saXN0IiwgICAgbm9kZS0+Y2hpbGQpOwotCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJuZXh0X3BlZXIiLCAgICAgbm9kZS0+cGVlcik7Ci0JYWNwaV9leF9vdXRfcG9pbnRlciAoIlBhcmVudCIsICAgICAgICBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSkpOworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNHNcbiIsICJOYW1lIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKTsKKwlhY3BpX2V4X291dF9zdHJpbmcoIlR5cGUiLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpOworCWFjcGlfZXhfb3V0X2ludGVnZXIoIkZsYWdzIiwgbm9kZS0+ZmxhZ3MpOworCWFjcGlfZXhfb3V0X2ludGVnZXIoIk93bmVyIElkIiwgbm9kZS0+b3duZXJfaWQpOworCWFjcGlfZXhfb3V0X2ludGVnZXIoIlJlZmVyZW5jZSBDb3VudCIsIG5vZGUtPnJlZmVyZW5jZV9jb3VudCk7CisJYWNwaV9leF9vdXRfcG9pbnRlcigiQXR0YWNoZWQgT2JqZWN0IiwKKwkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSkpOworCWFjcGlfZXhfb3V0X3BvaW50ZXIoImNoaWxkX2xpc3QiLCBub2RlLT5jaGlsZCk7CisJYWNwaV9leF9vdXRfcG9pbnRlcigibmV4dF9wZWVyIiwgbm9kZS0+cGVlcik7CisJYWNwaV9leF9vdXRfcG9pbnRlcigiUGFyZW50IiwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSkpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKKyAqCisgKiBERVNDUklQVElPTjogRHVtcHMgYSByZWZlcmVuY2Ugb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWNwaV9leF9kdW1wX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgcmV0X2J1ZjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgeworCQlhY3BpX29zX3ByaW50ZigiTmFtZWQgT2JqZWN0ICVwICIsIG9ial9kZXNjLT5yZWZlcmVuY2Uubm9kZSk7CisJCXJldF9idWYubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUsCisJCQkJCSAgICAgICAmcmV0X2J1Zik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV9vc19wcmludGYoIkNvdWxkIG5vdCBjb252ZXJ0IG5hbWUgdG8gcGF0aG5hbWVcbiIpOworCQl9IGVsc2UgeworCQkJYWNwaV9vc19wcmludGYoIiVzXG4iLCAoY2hhciAqKXJldF9idWYucG9pbnRlcik7CisJCQlBQ1BJX01FTV9GUkVFKHJldF9idWYucG9pbnRlcik7CisJCX0KKwl9IGVsc2UgaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSB7CisJCWFjcGlfb3NfcHJpbnRmKCJcblJlZmVyZW5jZWQgT2JqZWN0OiAlcFxuIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcGFja2FnZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIEluZGVudGF0aW9uIExldmVsCisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFBhY2thZ2UgaW5kZXggZm9yIHRoaXMgb2JqZWN0CisgKgorICogREVTQ1JJUFRJT046IER1bXBzIHRoZSBlbGVtZW50cyBvZiB0aGUgcGFja2FnZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCithY3BpX2V4X2R1bXBfcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywgdTMyIGxldmVsLCB1MzIgaW5kZXgpCit7CisJdTMyIGk7CisKKwkvKiBJbmRlbnRhdGlvbiBhbmQgaW5kZXggb3V0cHV0ICovCisKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7CisJCQlhY3BpX29zX3ByaW50ZigiICIpOworCQl9CisKKwkJYWNwaV9vc19wcmludGYoIlslLjJkXSAiLCBpbmRleCk7CisJfQorCisJYWNwaV9vc19wcmludGYoIiVwICIsIG9ial9kZXNjKTsKKworCS8qIE51bGwgcGFja2FnZSBlbGVtZW50cyBhcmUgYWxsb3dlZCAqLworCisJaWYgKCFvYmpfZGVzYykgeworCQlhY3BpX29zX3ByaW50ZigiW051bGwgT2JqZWN0XVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBQYWNrYWdlcyBtYXkgb25seSBjb250YWluIGEgZmV3IG9iamVjdCB0eXBlcyAqLworCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCWFjcGlfb3NfcHJpbnRmKCJbSW50ZWdlcl0gPSAlOC44WCU4LjhYXG4iLAorCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQlhY3BpX29zX3ByaW50ZigiW1N0cmluZ10gVmFsdWU6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGg7IGkrKykgeworCQkJYWNwaV9vc19wcmludGYoIiVjIiwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyW2ldKTsKKwkJfQorCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJYWNwaV9vc19wcmludGYoIltCdWZmZXJdIExlbmd0aCAlLjJYID0gIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CisJCWlmIChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCkgeworCQkJYWNwaV91dF9kdW1wX2J1ZmZlcigodTggKikgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCisJCQkJCSAgICBEQl9EV09SRF9ESVNQTEFZLCBfQ09NUE9ORU5UKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQlhY3BpX29zX3ByaW50ZigiW1BhY2thZ2VdIENvbnRhaW5zICVkIEVsZW1lbnRzOiBcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQpOworCisJCWZvciAoaSA9IDA7IGkgPCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7CisJCQlhY3BpX2V4X2R1bXBfcGFja2FnZShvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKKwkJCQkJICAgICBsZXZlbCArIDEsIGkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCWFjcGlfb3NfcHJpbnRmKCJbT2JqZWN0IFJlZmVyZW5jZV0gIik7CisJCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJYWNwaV9vc19wcmludGYoIltVbmtub3duIFR5cGVdICVYXG4iLAorCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSk7CisJCWJyZWFrOworCX0KK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCiAgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkgaWYgVFJVRQogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgbWVtYmVycyBvZiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgZ2l2ZW4uCkBAIC01NzUsMjAyICs2NTMsMjEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBmbGFncykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yIik7CiAKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCWlmICghZmxhZ3MpIHsKLQkJaWYgKCEoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKSAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKKwkJaWYgKCEKKwkJICAgICgoQUNQSV9MVl9PQkpFQ1RTICYgYWNwaV9kYmdfbGV2ZWwpCisJCSAgICAgJiYgKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpKSB7CiAJCQlyZXR1cm5fVk9JRDsKIAkJfQogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlhY3BpX2V4X2R1bXBfbm9kZSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjLCBmbGFncyk7Ci0JCWFjcGlfb3NfcHJpbnRmICgiXG5BdHRhY2hlZCBPYmplY3QgKCVwKTpcbiIsCi0JCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKS0+b2JqZWN0KTsKLQkJYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yICgKLQkJCSgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2MpLT5vYmplY3QsIGZsYWdzKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlhY3BpX2V4X2R1bXBfbm9kZSgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYywKKwkJCQkgIGZsYWdzKTsKKwkJYWNwaV9vc19wcmludGYoIlxuQXR0YWNoZWQgT2JqZWN0ICglcCk6XG4iLAorCQkJICAgICAgICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPgorCQkJICAgICAgIG9iamVjdCk7CisJCWFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcigoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCQlvYmpfZGVzYyktPm9iamVjdCwgZmxhZ3MpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewotCQlhY3BpX29zX3ByaW50ZiAoCi0JCQkiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcjogJXAgaXMgbm90IGFuIEFDUEkgb3BlcmFuZCBvYmplY3Q6IFslc11cbiIsCi0JCQlvYmpfZGVzYywgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChvYmpfZGVzYykpOworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJYWNwaV9vc19wcmludGYKKwkJICAgICgiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcjogJXAgaXMgbm90IGFuIEFDUEkgb3BlcmFuZCBvYmplY3Q6IFslc11cbiIsCisJCSAgICAgb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShvYmpfZGVzYykpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBDb21tb24gRmllbGRzICovCiAKLQlhY3BpX2V4X291dF9zdHJpbmcgKCJUeXBlIiwgICAgICAgICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpKTsKLQlhY3BpX2V4X291dF9pbnRlZ2VyICgiUmVmZXJlbmNlIENvdW50Iiwgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJGbGFncyIsICAgICAgICAgICBvYmpfZGVzYy0+Y29tbW9uLmZsYWdzKTsKKwlhY3BpX2V4X291dF9zdHJpbmcoIlR5cGUiLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSk7CisJYWNwaV9leF9vdXRfaW50ZWdlcigiUmVmZXJlbmNlIENvdW50IiwKKwkJCSAgICBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisJYWNwaV9leF9vdXRfaW50ZWdlcigiRmxhZ3MiLCBvYmpfZGVzYy0+Y29tbW9uLmZsYWdzKTsKIAogCS8qIE9iamVjdC1zcGVjaWZpYyBGaWVsZHMgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlhY3BpX29zX3ByaW50ZiAoIiUyMHMgOiAlOC44WCU4LjhYXG4iLCAiVmFsdWUiLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlOC44WCU4LjhYXG4iLCAiVmFsdWUiLAorCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJMZW5ndGgiLCAgICAgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiTGVuZ3RoIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwogCi0JCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVwICIsICJQb2ludGVyIiwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKLQkJYWNwaV91dF9wcmludF9zdHJpbmcgKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOwotCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXAgIiwgIlBvaW50ZXIiLAorCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisJCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOworCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiTGVuZ3RoIiwgICAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJQb2ludGVyIiwgICAgIG9ial9kZXNjLT5idWZmZXIucG9pbnRlcik7Ci0JCUFDUElfRFVNUF9CVUZGRVIgKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJMZW5ndGgiLCBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIlBvaW50ZXIiLCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOworCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiRmxhZ3MiLCAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5mbGFncyk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJDb3VudCIsICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkVsZW1lbnRzIiwgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJGbGFncyIsIG9ial9kZXNjLT5wYWNrYWdlLmZsYWdzKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiRWxlbWVudHMiLCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkVsZW1lbnQgTGlzdCIsIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKTsKIAogCQkvKiBEdW1wIHRoZSBwYWNrYWdlIGNvbnRlbnRzICovCiAKLQkJaWYgKG9ial9kZXNjLT5wYWNrYWdlLmNvdW50ID4gMCkgewotCQkJYWNwaV9vc19wcmludGYgKCJcblBhY2thZ2UgQ29udGVudHM6XG4iKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJbJS4zZF0gJXAiLCBpLCBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSk7Ci0JCQkJaWYgKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldKSB7Ci0JCQkJCWFjcGlfb3NfcHJpbnRmICgiICVzIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldKSk7Ci0JCQkJfQotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKLQkJCX0KLQkJfQorCQlhY3BpX29zX3ByaW50ZigiXG5QYWNrYWdlIENvbnRlbnRzOlxuIik7CisJCWFjcGlfZXhfZHVtcF9wYWNrYWdlKG9ial9kZXNjLCAwLCAwKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAotCQlhY3BpX2V4X291dF9wb2ludGVyICgiSGFuZGxlciIsICAgICBvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXIpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgic3lzdGVtX25vdGlmeSIsIG9ial9kZXNjLT5kZXZpY2Uuc3lzdGVtX25vdGlmeSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJkZXZpY2Vfbm90aWZ5Iiwgb2JqX2Rlc2MtPmRldmljZS5kZXZpY2Vfbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiSGFuZGxlciIsIG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcik7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInN5c3RlbV9ub3RpZnkiLAorCQkJCSAgICBvYmpfZGVzYy0+ZGV2aWNlLnN5c3RlbV9ub3RpZnkpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJkZXZpY2Vfbm90aWZ5IiwKKwkJCQkgICAgb2JqX2Rlc2MtPmRldmljZS5kZXZpY2Vfbm90aWZ5KTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0VWRU5UOgogCi0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJTZW1hcGhvcmUiLCAgIG9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJTZW1hcGhvcmUiLCBvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgicGFyYW1fY291bnQiLCBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIkNvbmN1cnJlbmN5Iiwgb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJTZW1hcGhvcmUiLCAgIG9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIm93bmluZ19pZCIsICAgb2JqX2Rlc2MtPm1ldGhvZC5vd25pbmdfaWQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiYW1sX2xlbmd0aCIsICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiYW1sX3N0YXJ0IiwgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoInBhcmFtX2NvdW50IiwKKwkJCQkgICAgb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIkNvbmN1cnJlbmN5IiwKKwkJCQkgICAgb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIlNlbWFwaG9yZSIsIG9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigib3duZXJfaWQiLCBvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiYW1sX2xlbmd0aCIsIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoImFtbF9zdGFydCIsIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0KTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX01VVEVYOgogCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJzeW5jX2xldmVsIiwgIG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIm93bmVyX3RocmVhZCIsIG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiYWNxdWlyZV9kZXB0aCIsIG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJTZW1hcGhvcmUiLCAgIG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJzeW5jX2xldmVsIiwgb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJvd25lcl90aHJlYWQiLAorCQkJCSAgICBvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiYWNxdWlyZV9kZXB0aCIsCisJCQkJICAgIG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIlNlbWFwaG9yZSIsIG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJzcGFjZV9pZCIsICAgIG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiRmxhZ3MiLCAgICAgICBvYmpfZGVzYy0+cmVnaW9uLmZsYWdzKTsKLQkJYWNwaV9leF9vdXRfYWRkcmVzcyAoIkFkZHJlc3MiLCAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIkxlbmd0aCIsICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiSGFuZGxlciIsICAgICBvYmpfZGVzYy0+cmVnaW9uLmhhbmRsZXIpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiTmV4dCIsICAgICAgICBvYmpfZGVzYy0+cmVnaW9uLm5leHQpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJzcGFjZV9pZCIsIG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJGbGFncyIsIG9ial9kZXNjLT5yZWdpb24uZmxhZ3MpOworCQlhY3BpX2V4X291dF9hZGRyZXNzKCJBZGRyZXNzIiwgb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiTGVuZ3RoIiwgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJIYW5kbGVyIiwgb2JqX2Rlc2MtPnJlZ2lvbi5oYW5kbGVyKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiTmV4dCIsIG9ial9kZXNjLT5yZWdpb24ubmV4dCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9QT1dFUjoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgic3lzdGVtX2xldmVsIiwgb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJyZXNvdXJjZV9vcmRlciIsIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlcik7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJzeXN0ZW1fbm90aWZ5Iiwgb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiZGV2aWNlX25vdGlmeSIsIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5kZXZpY2Vfbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigic3lzdGVtX2xldmVsIiwKKwkJCQkgICAgb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoInJlc291cmNlX29yZGVyIiwKKwkJCQkgICAgb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnJlc291cmNlX29yZGVyKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigic3lzdGVtX25vdGlmeSIsCisJCQkJICAgIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiZGV2aWNlX25vdGlmeSIsCisJCQkJICAgIG9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5kZXZpY2Vfbm90aWZ5KTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKIAotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiUHJvY2Vzc29yIElEIiwgb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoIkxlbmd0aCIsICAgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGgpOwotCQlhY3BpX2V4X291dF9hZGRyZXNzICgiQWRkcmVzcyIsICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBvYmpfZGVzYy0+cHJvY2Vzc29yLmFkZHJlc3MpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgic3lzdGVtX25vdGlmeSIsIG9ial9kZXNjLT5wcm9jZXNzb3Iuc3lzdGVtX25vdGlmeSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJkZXZpY2Vfbm90aWZ5Iiwgb2JqX2Rlc2MtPnByb2Nlc3Nvci5kZXZpY2Vfbm90aWZ5KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkhhbmRsZXIiLCAgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5oYW5kbGVyKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiUHJvY2Vzc29yIElEIiwKKwkJCQkgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigiTGVuZ3RoIiwgb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGgpOworCQlhY3BpX2V4X291dF9hZGRyZXNzKCJBZGRyZXNzIiwKKwkJCQkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgb2JqX2Rlc2MtPnByb2Nlc3Nvci4KKwkJCQkgICAgYWRkcmVzcyk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInN5c3RlbV9ub3RpZnkiLAorCQkJCSAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLnN5c3RlbV9ub3RpZnkpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJkZXZpY2Vfbm90aWZ5IiwKKwkJCQkgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5kZXZpY2Vfbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiSGFuZGxlciIsIG9ial9kZXNjLT5wcm9jZXNzb3IuaGFuZGxlcik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9USEVSTUFMOgogCi0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJzeXN0ZW1fbm90aWZ5Iiwgb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5zeXN0ZW1fbm90aWZ5KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoImRldmljZV9ub3RpZnkiLCBvYmpfZGVzYy0+dGhlcm1hbF96b25lLmRldmljZV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiSGFuZGxlciIsICAgICBvYmpfZGVzYy0+dGhlcm1hbF96b25lLmhhbmRsZXIpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJzeXN0ZW1fbm90aWZ5IiwKKwkJCQkgICAgb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5zeXN0ZW1fbm90aWZ5KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiZGV2aWNlX25vdGlmeSIsCisJCQkJICAgIG9ial9kZXNjLT50aGVybWFsX3pvbmUuZGV2aWNlX25vdGlmeSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkhhbmRsZXIiLCBvYmpfZGVzYy0+dGhlcm1hbF96b25lLmhhbmRsZXIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJmaWVsZF9mbGFncyIsIG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiYWNjZXNzX2J5dGVfd2lkdGgiLG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiYml0X2xlbmd0aCIsICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiZmxkX2JpdF9vZmZzZXQiLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyICgiYmFzZV9ieXRlX29mZnNldCIsIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJwYXJlbnRfbm9kZSIsIG9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoImZpZWxkX2ZsYWdzIiwKKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoImFjY2Vzc19ieXRlX3dpZHRoIiwKKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoImJpdF9sZW5ndGgiLAorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJmbGRfYml0X29mZnNldCIsCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJiYXNlX2J5dGVfb2Zmc2V0IiwKKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigicGFyZW50X25vZGUiLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpOwogCi0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyICgiYnVmZmVyX29iaiIsIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaik7CisJCQlhY3BpX2V4X291dF9wb2ludGVyKCJidWZmZXJfb2JqIiwKKwkJCQkJICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyICgicmVnaW9uX29iaiIsIG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqKTsKKwkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInJlZ2lvbl9vYmoiLAorCQkJCQkgICAgb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQkJCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJWYWx1ZSIsICAgb2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUpOwotCQkJYWNwaV9leF9vdXRfcG9pbnRlciAoInJlZ2lvbl9vYmoiLCBvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqKTsKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJiYW5rX29iaiIsIG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqKTsKKwkJCWFjcGlfZXhfb3V0X2ludGVnZXIoIlZhbHVlIiwKKwkJCQkJICAgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlKTsKKwkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInJlZ2lvbl9vYmoiLAorCQkJCQkgICAgb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaik7CisJCQlhY3BpX2V4X291dF9wb2ludGVyKCJiYW5rX29iaiIsCisJCQkJCSAgICBvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQkJCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJWYWx1ZSIsICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlKTsKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJJbmRleCIsICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaik7Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyICgiRGF0YSIsICAgIG9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaik7CisJCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJWYWx1ZSIsCisJCQkJCSAgICBvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUpOworCQkJYWNwaV9leF9vdXRfcG9pbnRlcigiSW5kZXgiLAorCQkJCQkgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaik7CisJCQlhY3BpX2V4X291dF9wb2ludGVyKCJEYXRhIiwKKwkJCQkJICAgIG9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtNzc5LDU2ICs4NjgsNTIgQEAKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJ0YXJnZXRfdHlwZSIsIG9ial9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpOwotCQlhY3BpX2V4X291dF9zdHJpbmcgKCJPcGNvZGUiLCAgICAgICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAotCQkJCSAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+bmFtZSk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIgKCJPZmZzZXQiLCAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIm9ial9kZXNjIiwgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiTm9kZSIsICAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiV2hlcmUiLCAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLndoZXJlKTsKKwkJYWNwaV9leF9vdXRfaW50ZWdlcigidGFyZ2V0X3R5cGUiLAorCQkJCSAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlKTsKKwkJYWNwaV9leF9vdXRfc3RyaW5nKCJPcGNvZGUiLAorCQkJCSAgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbworCQkJCSAgICAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+bmFtZSk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoIk9mZnNldCIsIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigib2JqX2Rlc2MiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIk5vZGUiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJXaGVyZSIsIG9ial9kZXNjLT5yZWZlcmVuY2Uud2hlcmUpOwogCi0JCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgewotCQkJYWNwaV9vc19wcmludGYgKCJcblJlZmVyZW5jZWQgT2JqZWN0OlxuIik7Ci0JCQlhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LCBmbGFncyk7Ci0JCX0KKwkJYWNwaV9leF9kdW1wX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9BRERSRVNTX0hBTkRMRVI6CiAKLQkJYWNwaV9leF9vdXRfaW50ZWdlciAoInNwYWNlX2lkIiwgICAgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiTmV4dCIsICAgICAgICBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5uZXh0KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoInJlZ2lvbl9saXN0Iiwgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiTm9kZSIsICAgICAgICBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5ub2RlKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlciAoIkNvbnRleHQiLCAgICAgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuY29udGV4dCk7CisJCWFjcGlfZXhfb3V0X2ludGVnZXIoInNwYWNlX2lkIiwKKwkJCQkgICAgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJOZXh0Iiwgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2UubmV4dCk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInJlZ2lvbl9saXN0IiwKKwkJCQkgICAgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJOb2RlIiwgb2JqX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uubm9kZSk7CisJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkNvbnRleHQiLCBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5jb250ZXh0KTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX05PVElGWToKIAotCQlhY3BpX2V4X291dF9wb2ludGVyICgiTm9kZSIsICAgICAgICBvYmpfZGVzYy0+bm90aWZ5Lm5vZGUpOwotCQlhY3BpX2V4X291dF9wb2ludGVyICgiQ29udGV4dCIsICAgICBvYmpfZGVzYy0+bm90aWZ5LmNvbnRleHQpOworCQlhY3BpX2V4X291dF9wb2ludGVyKCJOb2RlIiwgb2JqX2Rlc2MtPm5vdGlmeS5ub2RlKTsKKwkJYWNwaV9leF9vdXRfcG9pbnRlcigiQ29udGV4dCIsIG9ial9kZXNjLT5ub3RpZnkuY29udGV4dCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9BTElBUzoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVM6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfRVhUUkE6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfREFUQToKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmICgKLQkJCSJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yOiBEaXNwbGF5IG5vdCBpbXBsZW1lbnRlZCBmb3Igb2JqZWN0IHR5cGUgJXNcbiIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYykpOworCQlhY3BpX29zX3ByaW50ZgorCQkgICAgKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yOiBEaXNwbGF5IG5vdCBpbXBsZW1lbnRlZCBmb3Igb2JqZWN0IHR5cGUgJXNcbiIsCisJCSAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYykpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCmluZGV4IDIyYzhmYTQuLmFiMWJhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYwpAQCAtNDEsMTUgKzQxLDEyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhmaWVsZCIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4ZmllbGQiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY1LDY0ICs2Miw3MCBAQAogICogICAgICAgICAgICAgIEJ1ZmZlciwgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBmaWVsZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0X2J1ZmZlcl9kZXNjKQorYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldF9idWZmZXJfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpidWZmZXJfZGVzYzsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ1ZmZlcl9kZXNjOworCWFjcGlfc2l6ZSBsZW5ndGg7CisJdm9pZCAqYnVmZmVyOworCXU4IGxvY2tlZDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9yZWFkX2RhdGFfZnJvbV9maWVsZCIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9yZWFkX2RhdGFfZnJvbV9maWVsZCIsIG9ial9kZXNjKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKwlpZiAoIXJldF9idWZmZXJfZGVzYykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgewogCQkvKgogCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAogCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KIAkJICovCiAJCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKG9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9Ci0JfQotCWVsc2UgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQpICYmCi0JCQkgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU01CVVMpKSB7CisJfSBlbHNlCisJICAgIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQpCisJCSYmIChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkID09CisJCSAgICBBQ1BJX0FEUl9TUEFDRV9TTUJVUykpIHsKIAkJLyoKIAkJICogVGhpcyBpcyBhbiBTTUJ1cyByZWFkLiAgV2UgbXVzdCBjcmVhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YQogCQkgKiBhbmQgZGlyZWN0bHkgYWNjZXNzIHRoZSByZWdpb24gaGFuZGxlci4KIAkJICovCi0JCWJ1ZmZlcl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CisJCWJ1ZmZlcl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CiAJCWlmICghYnVmZmVyX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogTG9jayBlbnRpcmUgdHJhbnNhY3Rpb24gaWYgcmVxdWVzdGVkICovCiAKLQkJbG9ja2VkID0gYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKwkJbG9ja2VkID0KKwkJICAgIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkJZmllbGRfZmxhZ3MpOwogCiAJCS8qCiAJCSAqIFBlcmZvcm0gdGhlIHJlYWQuCiAJCSAqIE5vdGU6IFNtYnVzIHByb3RvY29sIHZhbHVlIGlzIHBhc3NlZCBpbiB1cHBlciAxNi1iaXRzIG9mIEZ1bmN0aW9uCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2FjY2Vzc19yZWdpb24gKG9ial9kZXNjLCAwLAotCQkJCSBBQ1BJX0NBU1RfUFRSIChhY3BpX2ludGVnZXIsIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlciksCi0JCQkJIEFDUElfUkVBRCB8IChvYmpfZGVzYy0+ZmllbGQuYXR0cmlidXRlIDw8IDE2KSk7Ci0JCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAobG9ja2VkKTsKKwkJc3RhdHVzID0gYWNwaV9leF9hY2Nlc3NfcmVnaW9uKG9ial9kZXNjLCAwLAorCQkJCQkgICAgICAgQUNQSV9DQVNUX1BUUihhY3BpX2ludGVnZXIsCisJCQkJCQkJICAgICBidWZmZXJfZGVzYy0+CisJCQkJCQkJICAgICBidWZmZXIucG9pbnRlciksCisJCQkJCSAgICAgICBBQ1BJX1JFQUQgfCAob2JqX2Rlc2MtPmZpZWxkLgorCQkJCQkJCSAgICBhdHRyaWJ1dGUgPDwgMTYpKTsKKwkJYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKGxvY2tlZCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEzNiwyMiArMTM5LDIyIEBACiAJICoKIAkgKiBOb3RlOiBGaWVsZC5sZW5ndGggaXMgaW4gYml0cy4KIAkgKi8KLQlsZW5ndGggPSAoYWNwaV9zaXplKSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKG9ial9kZXNjLT5maWVsZC5iaXRfbGVuZ3RoKTsKKwlsZW5ndGggPQorCSAgICAoYWNwaV9zaXplKSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmZpZWxkLmJpdF9sZW5ndGgpOwogCWlmIChsZW5ndGggPiBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpIHsKIAkJLyogRmllbGQgaXMgdG9vIGxhcmdlIGZvciBhbiBJbnRlZ2VyLCBjcmVhdGUgYSBCdWZmZXIgaW5zdGVhZCAqLwogCi0JCWJ1ZmZlcl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAobGVuZ3RoKTsKKwkJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGxlbmd0aCk7CiAJCWlmICghYnVmZmVyX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAJCWJ1ZmZlciA9IGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogRmllbGQgd2lsbCBmaXQgd2l0aGluIGFuIEludGVnZXIgKG5vcm1hbCBjYXNlKSAqLwogCi0JCWJ1ZmZlcl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWJ1ZmZlcl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFidWZmZXJfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQlsZW5ndGggPSBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGg7CkBAIC0xNTksMzcgKzE2MiwzNiBAQAogCQlidWZmZXIgPSAmYnVmZmVyX2Rlc2MtPmludGVnZXIudmFsdWU7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkiZmllbGRfcmVhZCBbVE9dOiAgT2JqICVwLCBUeXBlICVYLCBCdWYgJXAsIGJ5dGVfbGVuICVYXG4iLAotCQlvYmpfZGVzYywgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSwgYnVmZmVyLCAodTMyKSBsZW5ndGgpKTsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCSJmaWVsZF9yZWFkIFtGUk9NXTogYml0X2xlbiAlWCwgYml0X29mZiAlWCwgYnl0ZV9vZmYgJVhcbiIsCi0JCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgImZpZWxkX3JlYWQgW1RPXTogIE9iaiAlcCwgVHlwZSAlWCwgQnVmICVwLCBieXRlX2xlbiAlWFxuIiwKKwkJCSAgb2JqX2Rlc2MsIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSwgYnVmZmVyLAorCQkJICAodTMyKSBsZW5ndGgpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgImZpZWxkX3JlYWQgW0ZST01dOiBiaXRfbGVuICVYLCBiaXRfb2ZmICVYLCBieXRlX29mZiAlWFxuIiwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCkpOwogCiAJLyogTG9jayBlbnRpcmUgdHJhbnNhY3Rpb24gaWYgcmVxdWVzdGVkICovCiAKLQlsb2NrZWQgPSBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOworCWxvY2tlZCA9CisJICAgIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKIAogCS8qIFJlYWQgZnJvbSB0aGUgZmllbGQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkIChvYmpfZGVzYywgYnVmZmVyLCAodTMyKSBsZW5ndGgpOwotCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAobG9ja2VkKTsKKwlzdGF0dXMgPSBhY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZChvYmpfZGVzYywgYnVmZmVyLCAodTMyKSBsZW5ndGgpOworCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayhsb2NrZWQpOwogCi0KLWV4aXQ6Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGJ1ZmZlcl9kZXNjKTsKLQl9Ci0JZWxzZSBpZiAocmV0X2J1ZmZlcl9kZXNjKSB7CisgICAgICBleGl0OgorCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYnVmZmVyX2Rlc2MpOworCX0gZWxzZSB7CiAJCSpyZXRfYnVmZmVyX2Rlc2MgPSBidWZmZXJfZGVzYzsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkCkBAIC0yMDUsOTcgKzIwNyw5NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKQorYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2xlbmd0aDsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV3X2J1ZmZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpidWZmZXJfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGxlbmd0aDsKKwl1MzIgcmVxdWlyZWRfbGVuZ3RoOworCXZvaWQgKmJ1ZmZlcjsKKwl2b2lkICpuZXdfYnVmZmVyOworCXU4IGxvY2tlZDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF93cml0ZV9kYXRhX3RvX2ZpZWxkIiwgb2JqX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3dyaXRlX2RhdGFfdG9fZmllbGQiLCBvYmpfZGVzYyk7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFzb3VyY2VfZGVzYyB8fCAhb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgewogCQkvKgogCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAogCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KIAkJICovCiAJCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKG9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9Ci0JfQotCWVsc2UgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQpICYmCi0JCQkgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU01CVVMpKSB7CisJfSBlbHNlCisJICAgIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQpCisJCSYmIChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkID09CisJCSAgICBBQ1BJX0FEUl9TUEFDRV9TTUJVUykpIHsKIAkJLyoKIAkJICogVGhpcyBpcyBhbiBTTUJ1cyB3cml0ZS4gIFdlIHdpbGwgYnlwYXNzIHRoZSBlbnRpcmUgZmllbGQgbWVjaGFuaXNtCiAJCSAqIGFuZCBoYW5kb2ZmIHRoZSBidWZmZXIgZGlyZWN0bHkgdG8gdGhlIGhhbmRsZXIuCiAJCSAqCiAJCSAqIFNvdXJjZSBtdXN0IGJlIGEgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZSAoQUNQSV9TTUJVU19CVUZGRVJfU0laRSkuCiAJCSAqLwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTTUJ1cyB3cml0ZSByZXF1aXJlcyBCdWZmZXIsIGZvdW5kIHR5cGUgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJTTUJ1cyB3cml0ZSByZXF1aXJlcyBCdWZmZXIsIGZvdW5kIHR5cGUgJXNcbiIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAogCQlpZiAoc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGggPCBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJTTUJ1cyB3cml0ZSByZXF1aXJlcyBCdWZmZXIgb2YgbGVuZ3RoICVYLCBmb3VuZCBsZW5ndGggJVhcbiIsCi0JCQkJQUNQSV9TTUJVU19CVUZGRVJfU0laRSwgc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiU01CdXMgd3JpdGUgcmVxdWlyZXMgQnVmZmVyIG9mIGxlbmd0aCAlWCwgZm91bmQgbGVuZ3RoICVYXG4iLCBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFLCBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CVUZGRVJfTElNSVQpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CVUZGRVJfTElNSVQpOwogCQl9CiAKLQkJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0IChBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKKwkJYnVmZmVyX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKIAkJaWYgKCFidWZmZXJfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQlidWZmZXIgPSBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JCUFDUElfTUVNQ1BZIChidWZmZXIsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCUFDUElfU01CVVNfQlVGRkVSX1NJWkUpOworCQlBQ1BJX01FTUNQWShidWZmZXIsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCSAgICBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKIAogCQkvKiBMb2NrIGVudGlyZSB0cmFuc2FjdGlvbiBpZiByZXF1ZXN0ZWQgKi8KIAotCQlsb2NrZWQgPSBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOworCQlsb2NrZWQgPQorCQkgICAgYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCQlmaWVsZF9mbGFncyk7CiAKIAkJLyoKIAkJICogUGVyZm9ybSB0aGUgd3JpdGUgKHJldHVybnMgc3RhdHVzIGFuZCBwZXJoYXBzIGRhdGEgaW4gdGhlCiAJCSAqIHNhbWUgYnVmZmVyKQogCQkgKiBOb3RlOiBTTUJ1cyBwcm90b2NvbCB0eXBlIGlzIHBhc3NlZCBpbiB1cHBlciAxNi1iaXRzIG9mIEZ1bmN0aW9uLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9hY2Nlc3NfcmVnaW9uIChvYmpfZGVzYywgMCwKLQkJCQkgIChhY3BpX2ludGVnZXIgKikgYnVmZmVyLAotCQkJCSAgQUNQSV9XUklURSB8IChvYmpfZGVzYy0+ZmllbGQuYXR0cmlidXRlIDw8IDE2KSk7Ci0JCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAobG9ja2VkKTsKKwkJc3RhdHVzID0gYWNwaV9leF9hY2Nlc3NfcmVnaW9uKG9ial9kZXNjLCAwLAorCQkJCQkgICAgICAgKGFjcGlfaW50ZWdlciAqKSBidWZmZXIsCisJCQkJCSAgICAgICBBQ1BJX1dSSVRFIHwgKG9ial9kZXNjLT5maWVsZC4KKwkJCQkJCQkgICAgIGF0dHJpYnV0ZSA8PCAxNikpOworCQlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sobG9ja2VkKTsKIAogCQkqcmVzdWx0X2Rlc2MgPSBidWZmZXJfZGVzYzsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJYnVmZmVyID0gJnNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQlsZW5ndGggPSBzaXplb2YgKHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJbGVuZ3RoID0gc2l6ZW9mKHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CkBAIC0zMDksNyArMzEwLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQogCiAJLyoKQEAgLTMxOSwxNSArMzIwLDE1IEBACiAJICogdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KIAkgKi8KIAluZXdfYnVmZmVyID0gTlVMTDsKLQlyZXF1aXJlZF9sZW5ndGggPSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKAotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKKwlyZXF1aXJlZF9sZW5ndGggPQorCSAgICBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKIAogCWlmIChsZW5ndGggPCByZXF1aXJlZF9sZW5ndGgpIHsKIAkJLyogV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgYnVmZmVyICovCiAKLQkJbmV3X2J1ZmZlciA9IEFDUElfTUVNX0NBTExPQ0FURSAocmVxdWlyZWRfbGVuZ3RoKTsKKwkJbmV3X2J1ZmZlciA9IEFDUElfTUVNX0NBTExPQ0FURShyZXF1aXJlZF9sZW5ndGgpOwogCQlpZiAoIW5ld19idWZmZXIpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyoKQEAgLTMzNSw0MCArMzM2LDQyIEBACiAJCSAqIGF0IEJ5dGUgemVyby4gIEFsbCB1bnVzZWQgKHVwcGVyKSBieXRlcyBvZiB0aGUKIAkJICogYnVmZmVyIHdpbGwgYmUgMC4KIAkJICovCi0JCUFDUElfTUVNQ1BZICgoY2hhciAqKSBuZXdfYnVmZmVyLCAoY2hhciAqKSBidWZmZXIsIGxlbmd0aCk7CisJCUFDUElfTUVNQ1BZKChjaGFyICopbmV3X2J1ZmZlciwgKGNoYXIgKilidWZmZXIsIGxlbmd0aCk7CiAJCWJ1ZmZlciA9IG5ld19idWZmZXI7CiAJCWxlbmd0aCA9IHJlcXVpcmVkX2xlbmd0aDsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCSJmaWVsZF93cml0ZSBbRlJPTV06IE9iaiAlcCAoJXM6JVgpLCBCdWYgJXAsIGJ5dGVfbGVuICVYXG4iLAotCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSwKLQkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSwgYnVmZmVyLCBsZW5ndGgpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgImZpZWxkX3dyaXRlIFtGUk9NXTogT2JqICVwICglczolWCksIEJ1ZiAlcCwgYnl0ZV9sZW4gJVhcbiIsCisJCQkgIHNvdXJjZV9kZXNjLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCShzb3VyY2VfZGVzYykpLAorCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYyksIGJ1ZmZlciwgbGVuZ3RoKSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCSJmaWVsZF93cml0ZSBbVE9dOiAgT2JqICVwICglczolWCksIGJpdF9sZW4gJVgsIGJpdF9vZmYgJVgsIGJ5dGVfb2ZmICVYXG4iLAotCQlvYmpfZGVzYywgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSwKLQkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSwKLQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCW9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiZmllbGRfd3JpdGUgW1RPXTogIE9iaiAlcCAoJXM6JVgpLCBiaXRfbGVuICVYLCBiaXRfb2ZmICVYLCBieXRlX29mZiAlWFxuIiwKKwkJCSAgb2JqX2Rlc2MsCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpLAorCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyksCisJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKIAogCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLwogCi0JbG9ja2VkID0gYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKwlsb2NrZWQgPQorCSAgICBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CiAKIAkvKiBXcml0ZSB0byB0aGUgZmllbGQgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKG9ial9kZXNjLCBidWZmZXIsIGxlbmd0aCk7Ci0JYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrIChsb2NrZWQpOworCXN0YXR1cyA9IGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQob2JqX2Rlc2MsIGJ1ZmZlciwgbGVuZ3RoKTsKKwlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sobG9ja2VkKTsKIAogCS8qIEZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciBpZiB3ZSB1c2VkIG9uZSAqLwogCiAJaWYgKG5ld19idWZmZXIpIHsKLQkJQUNQSV9NRU1fRlJFRSAobmV3X2J1ZmZlcik7CisJCUFDUElfTUVNX0ZSRUUobmV3X2J1ZmZlcik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCmluZGV4IDNjMmY4OWUuLmJhNmUwODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYwpAQCAtNDEsMzYgKzQxLDI4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4ZmxkaW8iKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhmbGRpbyIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2ZpZWxkX2RhdHVtX2lvICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSk7CithY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICAgdTMyIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkgICAgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsIHUzMiByZWFkX3dyaXRlKTsKIAogc3RhdGljIHU4Ci1hY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKK2FjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3codW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIGFjcGlfaW50ZWdlciB2YWx1ZSk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9zZXR1cF9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwotCithY3BpX2V4X3NldHVwX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTg5LDI3ICs4MSwyNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3NldHVwX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkKK2FjcGlfZXhfc2V0dXBfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJnbl9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoImV4X3NldHVwX3JlZ2lvbiIsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJleF9zZXR1cF9yZWdpb24iLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CiAKIAlyZ25fZGVzYyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQucmVnaW9uX29iajsKIAogCS8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHJlZ2lvbiAqLwogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChyZ25fZGVzYykgIT0gQUNQSV9UWVBFX1JFR0lPTikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKVxuIiwKLQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChyZ25fZGVzYyksCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChyZ25fZGVzYykpKTsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUocmduX2Rlc2MpICE9IEFDUElfVFlQRV9SRUdJT04pIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJOZWVkZWQgUmVnaW9uLCBmb3VuZCB0eXBlICVYICglcylcbiIsCisJCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShyZ25fZGVzYyksCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHJnbl9kZXNjKSkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAl9CiAKIAkvKgpAQCAtMTE3LDI2ICsxMDcsMjUgQEAKIAkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KIAkgKi8KIAlpZiAoIShyZ25fZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMgKHJnbl9kZXNjKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKHJnbl9kZXNjKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCWlmIChyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NNQlVTKSB7CiAJCS8qIFNNQnVzIGhhcyBhIG5vbi1saW5lYXIgYWRkcmVzcyBzcGFjZSAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KLQogI2lmZGVmIEFDUElfVU5ERVJfREVWRUxPUE1FTlQKIAkvKgogCSAqIElmIHRoZSBGaWVsZCBhY2Nlc3MgaXMgYW55X2FjYywgd2UgY2FuIG5vdyBjb21wdXRlIHRoZSBvcHRpbWFsCiAJICogYWNjZXNzIChiZWNhdXNlIHdlIGtub3cga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJlbnQgcmVnaW9uKQogCSAqLwogCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xNDcsNTYgKzEzNiw2NCBAQAogCSAqIChSZWdpb24gbGVuZ3RoIGlzIHNwZWNpZmllZCBpbiBieXRlcykKIAkgKi8KIAlpZiAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKLQkJCSAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0ICsKLQkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKSB7CisJCQkJICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0ICsKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkgICAgICAgYWNjZXNzX2J5dGVfd2lkdGgpKSB7CiAJCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKIAkJCS8qCiAJCQkgKiBTbGFjayBtb2RlIG9ubHk6ICBXZSB3aWxsIGdvIGFoZWFkIGFuZCBhbGxvdyBhY2Nlc3MgdG8gdGhpcwogCQkJICogZmllbGQgaWYgaXQgaXMgd2l0aGluIHRoZSByZWdpb24gbGVuZ3RoIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKIAkJCSAqIGFjY2VzcyB3aWR0aCBib3VuZGFyeS4KIAkJCSAqLwotCQkJaWYgKEFDUElfUk9VTkRfVVAgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoLAotCQkJCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSA+PQotCQkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKwotCQkJCSAoYWNwaV9uYXRpdmVfdWludCkgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCArCi0JCQkJIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJaWYgKEFDUElfUk9VTkRfVVAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgsCisJCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkgPj0KKwkJCSAgICAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCSAgICAgKGFjcGlfbmF0aXZlX3VpbnQpIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkgICAgIGFjY2Vzc19ieXRlX3dpZHRoICsgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCX0KIAkJfQogCi0JCWlmIChyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCA8IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpIHsKKwkJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwKKwkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBhY2Nlc3NfdHlwZSAoYWNjX3dvcmQsIGV0Yy4pIGlzIHdpZGVyCiAJCQkgKiB0aGFuIHRoZSByZWdpb24gaXRzZWxmLiAgRm9yIGV4YW1wbGUsIGEgcmVnaW9uIG9mIGxlbmd0aCBvbmUKIAkJCSAqIGJ5dGUsIGFuZCBhIGZpZWxkIHdpdGggRHdvcmQgYWNjZXNzIHNwZWNpZmllZC4KIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkZpZWxkIFslNC40c10gYWNjZXNzIHdpZHRoICglZCBieXRlcykgdG9vIGxhcmdlIGZvciByZWdpb24gWyU0LjRzXSAobGVuZ3RoICVYKVxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSksCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksCi0JCQkJcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkZpZWxkIFslNC40c10gYWNjZXNzIHdpZHRoICglZCBieXRlcykgdG9vIGxhcmdlIGZvciByZWdpb24gWyU0LjRzXSAobGVuZ3RoICVYKVxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPgorCQkJCQkJCQljb21tb25fZmllbGQuCisJCQkJCQkJCW5vZGUpLAorCQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJnbl9kZXNjLT4KKwkJCQkJCQkJcmVnaW9uLm5vZGUpLAorCQkJCQkgIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CiAJCX0KIAogCQkvKgogCQkgKiBPZmZzZXQgcm91bmRlZCB1cCB0byBuZXh0IG11bHRpcGxlIG9mIGZpZWxkIHdpZHRoCiAJCSAqIGV4Y2VlZHMgcmVnaW9uIGxlbmd0aCwgaW5kaWNhdGUgYW4gZXJyb3IKIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkZpZWxkIFslNC40c10gQmFzZStPZmZzZXQrV2lkdGggJVgrJVgrJVggaXMgYmV5b25kIGVuZCBvZiByZWdpb24gWyU0LjRzXSAobGVuZ3RoICVYKVxuIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5ub2RlKSwKLQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCWZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLAotCQkJcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJGaWVsZCBbJTQuNHNdIEJhc2UrT2Zmc2V0K1dpZHRoICVYKyVYKyVYIGlzIGJleW9uZCBlbmQgb2YgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJCQlub2RlKSwKKwkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJCQkgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLAorCQkJCSAgcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9SRUdJT05fTElNSVQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lPTl9MSU1JVCk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjY2Vzc19yZWdpb24KQEAgLTIxNiwyNyArMjEzLDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9hY2Nlc3NfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pCithY3BpX2V4X2FjY2Vzc19yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJICAgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsIHUzMiBmdW5jdGlvbikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZ25fZGVzYzsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjOworCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfYWNjZXNzX3JlZ2lvbiIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfYWNjZXNzX3JlZ2lvbiIpOwogCiAJLyoKIAkgKiBFbnN1cmUgdGhhdCB0aGUgcmVnaW9uIG9wZXJhbmRzIGFyZSBmdWxseSBldmFsdWF0ZWQgYW5kIHZlcmlmeQogCSAqIHRoZSB2YWxpZGl0eSBvZiB0aGUgcmVxdWVzdAogCSAqLwotCXN0YXR1cyA9IGFjcGlfZXhfc2V0dXBfcmVnaW9uIChvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXhfc2V0dXBfcmVnaW9uKG9ial9kZXNjLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0yNDgsNTAgKzI0MSw1MyBAQAogCSAqLwogCXJnbl9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqOwogCWFkZHJlc3MgPSByZ25fZGVzYy0+cmVnaW9uLmFkZHJlc3MgKwotCQkJIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCi0JCQkgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQ7CisJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0OwogCiAJaWYgKChmdW5jdGlvbiAmIEFDUElfSU9fTUFTSykgPT0gQUNQSV9SRUFEKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwgIltSRUFEXSIpKTsKLQl9Ci0JZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwgIltXUklURV0iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELCAiW1JFQURdIikpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELCAiW1dSSVRFXSIpKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfQkZJRUxELAotCQkiIFJlZ2lvbiBbJXM6JVhdLCBXaWR0aCAlWCwgYnl0ZV9iYXNlICVYLCBPZmZzZXQgJVggYXQgJTguOFglOC44WFxuIiwKLQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQpLAotCQlyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkLAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCi0JCWZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfQkZJRUxELAorCQkJICAgICAgIiBSZWdpb24gWyVzOiVYXSwgV2lkdGggJVgsIGJ5dGVfYmFzZSAlWCwgT2Zmc2V0ICVYIGF0ICU4LjhYJTguOFhcbiIsCisJCQkgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZ25fZGVzYy0+cmVnaW9uLgorCQkJCQkJICAgICAgc3BhY2VfaWQpLAorCQkJICAgICAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCwKKwkJCSAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSkpOwogCiAJLyogSW52b2tlIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzX3NwYWNlL29wX3JlZ2lvbiBoYW5kbGVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2ggKHJnbl9kZXNjLCBmdW5jdGlvbiwKLQkJCSBhZGRyZXNzLAotCQkJIEFDUElfTVVMXzggKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpLCB2YWx1ZSk7CisJc3RhdHVzID0gYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKHJnbl9kZXNjLCBmdW5jdGlvbiwKKwkJCQkJCWFkZHJlc3MsCisJCQkJCQlBQ1BJX01VTF84KG9ial9kZXNjLT4KKwkJCQkJCQkgICBjb21tb25fZmllbGQuCisJCQkJCQkJICAgYWNjZXNzX2J5dGVfd2lkdGgpLAorCQkJCQkJdmFsdWUpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzID09IEFFX05PVF9JTVBMRU1FTlRFRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlJlZ2lvbiAlcyglWCkgbm90IGltcGxlbWVudGVkXG4iLAotCQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSwKLQkJCQlyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RhdHVzID09IEFFX05PVF9FWElTVCkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiUmVnaW9uICVzKCVYKSBoYXMgbm8gaGFuZGxlclxuIiwKLQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCksCi0JCQkJcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiUmVnaW9uICVzKCVYKSBub3QgaW1wbGVtZW50ZWRcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPgorCQkJCQkJCQkgIHJlZ2lvbi4KKwkJCQkJCQkJICBzcGFjZV9pZCksCisJCQkJCSAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOworCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBBRV9OT1RfRVhJU1QpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiUmVnaW9uICVzKCVYKSBoYXMgbm8gaGFuZGxlclxuIiwKKwkJCQkJICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPgorCQkJCQkJCQkgICByZWdpb24uCisJCQkJCQkJCSAgIHNwYWNlX2lkKSwKKwkJCQkJICAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cKQEAgLTMxMCw5ICszMDYsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHU4Ci1hY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKQorYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgYWNwaV9pbnRlZ2VyIHZhbHVlKQogewogCiAJaWYgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCA+PSBBQ1BJX0lOVEVHRVJfQklUX1NJWkUpIHsKQEAgLTMzNiw3ICszMzEsNiBAQAogCXJldHVybiAoRkFMU0UpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZmllbGRfZGF0dW1faW8KQEAgLTM1NiwxOCArMzUwLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfZmllbGRfZGF0dW1faW8gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKQorYWNwaV9leF9maWVsZF9kYXR1bV9pbyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJICAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgcmVhZF93cml0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGxvY2FsX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2ludGVnZXIgbG9jYWxfdmFsdWU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiZXhfZmllbGRfZGF0dW1faW8iLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiZXhfZmllbGRfZGF0dW1faW8iLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CiAKIAlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1JFQUQpIHsKIAkJaWYgKCF2YWx1ZSkgewpAQCAtMzkyLDE2ICszODIsMTYgQEAKIAkgKiBpbmRleF9maWVsZCAtIFdyaXRlIHRvIGFuIEluZGV4IFJlZ2lzdGVyLCB0aGVuIHJlYWQvd3JpdGUgZnJvbS90byBhCiAJICogICAgICAgICAgICAgICBEYXRhIFJlZ2lzdGVyCiAJICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAJCS8qCiAJCSAqIElmIHRoZSBidWZmZXJfZmllbGQgYXJndW1lbnRzIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSBldmFsdWF0ZWQsCiAJCSAqIGV2YWx1YXRlIHRoZW0gbm93IGFuZCBzYXZlIHRoZSByZXN1bHRzLgogCQkgKi8KIAkJaWYgKCEob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSkgewotCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyAob2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAJCX0KIApAQCAtNDEwLDQ3ICs0MDAsNTAgQEAKIAkJCSAqIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlIGJ1ZmZlci4KIAkJCSAqIExlbmd0aCBpcyB0aGUgZmllbGQgd2lkdGggaW4gYnl0ZXMuCiAJCQkgKi8KLQkJCUFDUElfTUVNQ1BZICh2YWx1ZSwKLQkJCQkob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIgKwotCQkJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKwotCQkJCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKLQkJfQotCQllbHNlIHsKKwkJCUFDUElfTUVNQ1BZKHZhbHVlLAorCQkJCSAgICAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLgorCQkJCSAgICBwb2ludGVyICsKKwkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCQkgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIHRhcmdldCBidWZmZXIuCiAJCQkgKiBMZW5ndGggaXMgdGhlIGZpZWxkIHdpZHRoIGluIGJ5dGVzLgogCQkJICovCi0JCQlBQ1BJX01FTUNQWSAoKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci5wb2ludGVyICsKLQkJCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKLQkJCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJCXZhbHVlLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKKwkJCUFDUElfTUVNQ1BZKChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIuCisJCQkJICAgIHBvaW50ZXIgKworCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKworCQkJCSAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwgdmFsdWUsCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOwogCQl9CiAKIAkJc3RhdHVzID0gQUVfT0s7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCiAJCS8qCiAJCSAqIEVuc3VyZSB0aGF0IHRoZSBiYW5rX3ZhbHVlIGlzIG5vdCBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mCiAJCSAqIHRoZSByZWdpc3RlcgogCQkgKi8KLQkJaWYgKGFjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cgKG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqLAotCQkJCSAgKGFjcGlfaW50ZWdlcikgb2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9SRUdJU1RFUl9MSU1JVCk7CisJCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqLAorCQkJCQkgICAgICAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+CisJCQkJCSAgICAgIGJhbmtfZmllbGQudmFsdWUpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKIAkJfQogCiAJCS8qCiAJCSAqIEZvciBiYW5rX2ZpZWxkcywgd2UgbXVzdCB3cml0ZSB0aGUgYmFua192YWx1ZSB0byB0aGUgYmFua19yZWdpc3RlcgogCQkgKiAoaXRzZWxmIGEgcmVnaW9uX2ZpZWxkKSBiZWZvcmUgd2UgY2FuIGFjY2VzcyB0aGUgZGF0YS4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqLAotCQkJCSAmb2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUsCi0JCQkJIHNpemVvZiAob2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUpKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9pbnNlcnRfaW50b19maWVsZChvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiwKKwkJCQkJICAgICAgJm9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlLAorCQkJCQkgICAgICBzaXplb2Yob2JqX2Rlc2MtPmJhbmtfZmllbGQuCisJCQkJCQkgICAgIHZhbHVlKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKgpAQCAtNDYwLDkwICs0NTMsOTIgQEAKIAogCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAkJLyoKIAkJICogRm9yIHNpbXBsZSByZWdpb25fZmllbGRzLCB3ZSBqdXN0IGRpcmVjdGx5IGFjY2VzcyB0aGUgb3duaW5nCiAJCSAqIE9wZXJhdGlvbiBSZWdpb24uCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2FjY2Vzc19yZWdpb24gKG9ial9kZXNjLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwgdmFsdWUsCi0JCQkJICByZWFkX3dyaXRlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJCSAgdmFsdWUsIHJlYWRfd3JpdGUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQogCQkvKgogCQkgKiBFbnN1cmUgdGhhdCB0aGUgaW5kZXhfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YKIAkJICogdGhlIHJlZ2lzdGVyCiAJCSAqLwotCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaiwKLQkJCQkgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSkpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKKwkJaWYgKGFjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaiwKKwkJCQkJICAgICAgKGFjcGlfaW50ZWdlcikgb2JqX2Rlc2MtPgorCQkJCQkgICAgICBpbmRleF9maWVsZC52YWx1ZSkpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfUkVHSVNURVJfTElNSVQpOwogCQl9CiAKIAkJLyogV3JpdGUgdGhlIGluZGV4IHZhbHVlIHRvIHRoZSBpbmRleF9yZWdpc3RlciAoaXRzZWxmIGEgcmVnaW9uX2ZpZWxkKSAqLwogCiAJCWZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0ICs9IG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJIldyaXRlIHRvIEluZGV4IFJlZ2lzdGVyOiBWYWx1ZSAlOC44WFxuIiwKLQkJCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkgICJXcml0ZSB0byBJbmRleCBSZWdpc3RlcjogVmFsdWUgJTguOFhcbiIsCisJCQkJICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpOwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCi0JCQkJICZmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJCQkgc2l6ZW9mIChmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkKG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCisJCQkJCSAgICAgICZmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCQkJICAgICAgc2l6ZW9mKGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJIkkvTyB0byBEYXRhIFJlZ2lzdGVyOiB2YWx1ZV9wdHIgJXBcbiIsCi0JCQkJdmFsdWUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiSS9PIHRvIERhdGEgUmVnaXN0ZXI6IHZhbHVlX3B0ciAlcFxuIiwKKwkJCQkgIHZhbHVlKSk7CiAKIAkJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7CiAJCQkvKiBSZWFkIHRoZSBkYXR1bSBmcm9tIHRoZSBkYXRhX3JlZ2lzdGVyICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkIChvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmosCi0JCQkJCSAgdmFsdWUsIHNpemVvZiAoYWNwaV9pbnRlZ2VyKSk7Ci0JCX0KLQkJZWxzZSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkKG9ial9kZXNjLT5pbmRleF9maWVsZC4KKwkJCQkJCSAgICAgICBkYXRhX29iaiwgdmFsdWUsCisJCQkJCQkgICAgICAgc2l6ZW9mKGFjcGlfaW50ZWdlcikpOworCQl9IGVsc2UgewogCQkJLyogV3JpdGUgdGhlIGRhdHVtIHRvIHRoZSBkYXRhX3JlZ2lzdGVyICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKG9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaiwKLQkJCQkJICB2YWx1ZSwgc2l6ZW9mIChhY3BpX2ludGVnZXIpKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9pbnNlcnRfaW50b19maWVsZChvYmpfZGVzYy0+aW5kZXhfZmllbGQuCisJCQkJCQkgICAgICBkYXRhX29iaiwgdmFsdWUsCisJCQkJCQkgICAgICBzaXplb2YoYWNwaV9pbnRlZ2VyKSk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiV3Jvbmcgb2JqZWN0IHR5cGUgaW4gZmllbGQgSS9PICVYXG4iLAotCQkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIldyb25nIG9iamVjdCB0eXBlIGluIGZpZWxkIEkvTyAlWFxuIiwKKwkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlicmVhazsKIAl9CiAKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCSJWYWx1ZSBSZWFkICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoKnZhbHVlKSwKLQkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJIlZhbHVlIFdyaXR0ZW4gJTguOFglOC44WCwgV2lkdGggJWRcbiIsCi0JCQkJQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAotCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJWYWx1ZSBSZWFkICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAorCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NCgqdmFsdWUpLAorCQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJWYWx1ZSBXcml0dGVuICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAorCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NCgqdmFsdWUpLAorCQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUKQEAgLTU2MCwxOSArNTU1LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIG1hc2ssCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBmaWVsZF92YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KQorYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICAgIGFjcGlfaW50ZWdlciBtYXNrLAorCQkJICAgICAgIGFjcGlfaW50ZWdlciBmaWVsZF92YWx1ZSwKKwkJCSAgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIG1lcmdlZF92YWx1ZTsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9pbnRlZ2VyIG1lcmdlZF92YWx1ZTsKKwlhY3BpX2ludGVnZXIgY3VycmVudF92YWx1ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJleF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlIiwgbWFzayk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSIsIG1hc2spOwogCiAJLyogU3RhcnQgd2l0aCB0aGUgbmV3IGJpdHMgICovCiAKQEAgLTU4MywyMiArNTc1LDI3IEBACiAJaWYgKG1hc2sgIT0gQUNQSV9JTlRFR0VSX01BWCkgewogCQkvKiBEZWNvZGUgdGhlIHVwZGF0ZSBydWxlICovCiAKLQkJc3dpdGNoIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX1VQREFURV9SVUxFX01BU0spIHsKKwkJc3dpdGNoIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSykgewogCQljYXNlIEFNTF9GSUVMRF9VUERBVEVfUFJFU0VSVkU6CiAJCQkvKgogCQkJICogQ2hlY2sgaWYgdXBkYXRlIHJ1bGUgbmVlZHMgdG8gYmUgYXBwbGllZCAobm90IGlmIG1hc2sgaXMgYWxsCiAJCQkgKiBvbmVzKSAgVGhlIGxlZnQgc2hpZnQgZHJvcHMgdGhlIGJpdHMgd2Ugd2FudCB0byBpZ25vcmUuCiAJCQkgKi8KLQkJCWlmICgofm1hc2sgPDwgKEFDUElfTVVMXzggKHNpemVvZiAobWFzaykpIC0KLQkJCQkJIEFDUElfTVVMXzggKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKSkgIT0gMCkgeworCQkJaWYgKCh+bWFzayA8PCAoQUNQSV9NVUxfOChzaXplb2YobWFzaykpIC0KKwkJCQkgICAgICAgQUNQSV9NVUxfOChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpKSAhPSAwKSB7CiAJCQkJLyoKIAkJCQkgKiBSZWFkIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBieXRlL3dvcmQvZHdvcmQgY29udGFpbmluZwogCQkJCSAqIHRoZSBmaWVsZCwgYW5kIG1lcmdlIHdpdGggdGhlIG5ldyBmaWVsZCB2YWx1ZS4KIAkJCQkgKi8KLQkJCQlzdGF0dXMgPSBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvIChvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJCQkgICZjdXJyZW50X3ZhbHVlLCBBQ1BJX1JFQUQpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfZmllbGRfZGF0dW1faW8ob2JqX2Rlc2MsCisJCQkJCQkJICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJCQkJICAgJmN1cnJlbnRfdmFsdWUsCisJCQkJCQkJICAgQUNQSV9SRUFEKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCiAJCQkJbWVyZ2VkX3ZhbHVlIHw9IChjdXJyZW50X3ZhbHVlICYgfm1hc2spOwpAQCAtNjIxLDMwICs2MTgsMzEgQEAKIAogCQlkZWZhdWx0OgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkid3JpdGVfd2l0aF91cGRhdGVfcnVsZTogVW5rbm93biB1cGRhdGVfcnVsZSBzZXR0aW5nOiAlWFxuIiwKLQkJCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9WQUxVRSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJ3cml0ZV93aXRoX3VwZGF0ZV9ydWxlOiBVbmtub3duIHVwZGF0ZV9ydWxlIHNldHRpbmc6ICVYXG4iLAorCQkJCQkgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICBmaWVsZF9mbGFncyAmCisJCQkJCSAgIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKIAkJfQogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJIk1hc2sgJTguOFglOC44WCwgZGF0dW1fb2Zmc2V0ICVYLCBXaWR0aCAlWCwgVmFsdWUgJTguOFglOC44WCwgbWVyZ2VkX3ZhbHVlICU4LjhYJTguOFhcbiIsCi0JCUFDUElfRk9STUFUX1VJTlQ2NCAobWFzayksCi0JCWZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGZpZWxkX3ZhbHVlKSwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChtZXJnZWRfdmFsdWUpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkgICJNYXNrICU4LjhYJTguOFgsIGRhdHVtX29mZnNldCAlWCwgV2lkdGggJVgsIFZhbHVlICU4LjhYJTguOFgsIG1lcmdlZF92YWx1ZSAlOC44WCU4LjhYXG4iLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQobWFzayksCisJCQkgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoZmllbGRfdmFsdWUpLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQobWVyZ2VkX3ZhbHVlKSkpOwogCiAJLyogV3JpdGUgdGhlIG1lcmdlZCB2YWx1ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyAob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJICAmbWVyZ2VkX3ZhbHVlLCBBQ1BJX1dSSVRFKTsKKwlzdGF0dXMgPSBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKG9ial9kZXNjLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCQkJJm1lcmdlZF92YWx1ZSwgQUNQSV9XUklURSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQKQEAgLTY2MCw1NCArNjU4LDU0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpCithY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmZlcl9sZW5ndGgpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICByYXdfZGF0dW07Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtZXJnZWRfZGF0dW07Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9vZmZzZXQgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX29mZnNldCA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfdGFpbF9iaXRzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW1fY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9jb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaW50ZWdlciByYXdfZGF0dW07CisJYWNwaV9pbnRlZ2VyIG1lcmdlZF9kYXR1bTsKKwl1MzIgZmllbGRfb2Zmc2V0ID0gMDsKKwl1MzIgYnVmZmVyX29mZnNldCA9IDA7CisJdTMyIGJ1ZmZlcl90YWlsX2JpdHM7CisJdTMyIGRhdHVtX2NvdW50OworCXUzMiBmaWVsZF9kYXR1bV9jb3VudDsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2V4dHJhY3RfZnJvbV9maWVsZCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZXh0cmFjdF9mcm9tX2ZpZWxkIik7CiAKIAkvKiBWYWxpZGF0ZSB0YXJnZXQgYnVmZmVyIGFuZCBjbGVhciBpdCAqLwogCi0JaWYgKGJ1ZmZlcl9sZW5ndGggPCBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKAotCQkJIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiRmllbGQgc2l6ZSAlWCAoYml0cykgaXMgdG9vIGxhcmdlIGZvciBidWZmZXIgKCVYKVxuIiwKLQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwgYnVmZmVyX2xlbmd0aCkpOworCWlmIChidWZmZXJfbGVuZ3RoIDwKKwkgICAgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJGaWVsZCBzaXplICVYIChiaXRzKSBpcyB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAoJVgpXG4iLAorCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJCSAgYnVmZmVyX2xlbmd0aCkpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQlVGRkVSX09WRVJGTE9XKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JVRkZFUl9PVkVSRkxPVyk7CiAJfQotCUFDUElfTUVNU0VUIChidWZmZXIsIDAsIGJ1ZmZlcl9sZW5ndGgpOworCUFDUElfTUVNU0VUKGJ1ZmZlciwgMCwgYnVmZmVyX2xlbmd0aCk7CiAKIAkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZGF0dW1zIChhY2Nlc3Mgd2lkdGggZGF0YSBpdGVtcykgKi8KIAotCWRhdHVtX2NvdW50ID0gQUNQSV9ST1VORF9VUF9UTyAoCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOwotCWZpZWxkX2RhdHVtX2NvdW50ID0gQUNQSV9ST1VORF9VUF9UTyAoCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKKwlkYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOworCWZpZWxkX2RhdHVtX2NvdW50ID0gQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKworCQkJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgICAgc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICAgIGFjY2Vzc19iaXRfd2lkdGgpOwogCiAJLyogUHJpbWluZyByZWFkIGZyb20gdGhlIGZpZWxkICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvIChvYmpfZGVzYywgZmllbGRfb2Zmc2V0LCAmcmF3X2RhdHVtLCBBQ1BJX1JFQUQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXhfZmllbGRfZGF0dW1faW8ob2JqX2Rlc2MsIGZpZWxkX29mZnNldCwgJnJhd19kYXR1bSwKKwkJCQkgICBBQ1BJX1JFQUQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9Ci0JbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtID4+IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKKwltZXJnZWRfZGF0dW0gPQorCSAgICByYXdfZGF0dW0gPj4gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OwogCiAJLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGQgKi8KIApAQCAtNzE1LDE3ICs3MTMsMTcgQEAKIAkJLyogR2V0IG5leHQgaW5wdXQgZGF0dW0gZnJvbSB0aGUgZmllbGQgKi8KIAogCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKLQkJc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyAob2JqX2Rlc2MsIGZpZWxkX29mZnNldCwKLQkJCQkgICZyYXdfZGF0dW0sIEFDUElfUkVBRCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyhvYmpfZGVzYywgZmllbGRfb2Zmc2V0LAorCQkJCQkJJnJhd19kYXR1bSwgQUNQSV9SRUFEKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIE1lcmdlIHdpdGggcHJldmlvdXMgZGF0dW0gaWYgbmVjZXNzYXJ5ICovCiAKIAkJbWVyZ2VkX2RhdHVtIHw9IHJhd19kYXR1bSA8PAotCQkJKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJICAgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAKIAkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKIAkJCWJyZWFrOwpAQCAtNzMzLDMyICs3MzEsMzIgQEAKIAogCQkvKiBXcml0ZSBtZXJnZWQgZGF0dW0gdG8gdGFyZ2V0IGJ1ZmZlciAqLwogCi0JCUFDUElfTUVNQ1BZICgoKGNoYXIgKikgYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsICZtZXJnZWRfZGF0dW0sCi0JCQlBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJCQkgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKKwkJQUNQSV9NRU1DUFkoKChjaGFyICopYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsICZtZXJnZWRfZGF0dW0sCisJCQkgICAgQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCQkgICAgIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CiAKIAkJYnVmZmVyX29mZnNldCArPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoOwotCQltZXJnZWRfZGF0dW0gPSByYXdfZGF0dW0gPj4gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OworCQltZXJnZWRfZGF0dW0gPQorCQkgICAgcmF3X2RhdHVtID4+IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKIAl9CiAKIAkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLwogCiAJYnVmZmVyX3RhaWxfYml0cyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCAlCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGg7CisJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKIAlpZiAoYnVmZmVyX3RhaWxfYml0cykgewotCQltZXJnZWRfZGF0dW0gJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUgKGJ1ZmZlcl90YWlsX2JpdHMpOworCQltZXJnZWRfZGF0dW0gJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUoYnVmZmVyX3RhaWxfYml0cyk7CiAJfQogCiAJLyogV3JpdGUgdGhlIGxhc3QgZGF0dW0gdG8gdGhlIGJ1ZmZlciAqLwogCi0JQUNQSV9NRU1DUFkgKCgoY2hhciAqKSBidWZmZXIpICsgYnVmZmVyX29mZnNldCwgJm1lcmdlZF9kYXR1bSwKLQkJQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKKwlBQ1BJX01FTUNQWSgoKGNoYXIgKilidWZmZXIpICsgYnVmZmVyX29mZnNldCwgJm1lcmdlZF9kYXR1bSwKKwkJICAgIEFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkgICAgIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQKQEAgLTc3NCw1MyArNzcyLDU0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9pbnNlcnRfaW50b19maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCkKK2FjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmZlcl9sZW5ndGgpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtYXNrOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX2RhdHVtOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcmF3X2RhdHVtID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX29mZnNldCA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfb2Zmc2V0ID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl90YWlsX2JpdHM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXR1bV9jb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2NvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9pbnRlZ2VyIG1hc2s7CisJYWNwaV9pbnRlZ2VyIG1lcmdlZF9kYXR1bTsKKwlhY3BpX2ludGVnZXIgcmF3X2RhdHVtID0gMDsKKwl1MzIgZmllbGRfb2Zmc2V0ID0gMDsKKwl1MzIgYnVmZmVyX29mZnNldCA9IDA7CisJdTMyIGJ1ZmZlcl90YWlsX2JpdHM7CisJdTMyIGRhdHVtX2NvdW50OworCXUzMiBmaWVsZF9kYXR1bV9jb3VudDsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2luc2VydF9pbnRvX2ZpZWxkIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9pbnNlcnRfaW50b19maWVsZCIpOwogCiAJLyogVmFsaWRhdGUgaW5wdXQgYnVmZmVyICovCiAKLQlpZiAoYnVmZmVyX2xlbmd0aCA8IEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyAoCi0JCQkgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJGaWVsZCBzaXplICVYIChiaXRzKSBpcyB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAoJVgpXG4iLAotCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLCBidWZmZXJfbGVuZ3RoKSk7CisJaWYgKGJ1ZmZlcl9sZW5ndGggPAorCSAgICBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkZpZWxkIHNpemUgJVggKGJpdHMpIGlzIHRvbyBsYXJnZSBmb3IgYnVmZmVyICglWClcbiIsCisJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkJICBidWZmZXJfbGVuZ3RoKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CVUZGRVJfT1ZFUkZMT1cpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQlVGRkVSX09WRVJGTE9XKTsKIAl9CiAKIAkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZGF0dW1zIChhY2Nlc3Mgd2lkdGggZGF0YSBpdGVtcykgKi8KIAotCW1hc2sgPSBBQ1BJX01BU0tfQklUU19CRUxPVyAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKLQlkYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8gKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKLQlmaWVsZF9kYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8gKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCArCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOworCW1hc2sgPQorCSAgICBBQ1BJX01BU0tfQklUU19CRUxPVyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCWRhdHVtX2NvdW50ID0KKwkgICAgQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7CisJZmllbGRfZGF0dW1fY291bnQgPQorCSAgICBBQ1BJX1JPVU5EX1VQX1RPKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCArCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKIAogCS8qIEdldCBpbml0aWFsIERhdHVtIGZyb20gdGhlIGlucHV0IGJ1ZmZlciAqLwogCi0JQUNQSV9NRU1DUFkgKCZyYXdfZGF0dW0sIGJ1ZmZlciwKLQkJQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKKwlBQ1BJX01FTUNQWSgmcmF3X2RhdHVtLCBidWZmZXIsCisJCSAgICBBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJICAgICBidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX29mZnNldCkpOwogCi0JbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtIDw8IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKKwltZXJnZWRfZGF0dW0gPQorCSAgICByYXdfZGF0dW0gPDwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OwogCiAJLyogV3JpdGUgdGhlIGVudGlyZSBmaWVsZCAqLwogCkBAIC04MjgsMTggKzgyNywxOSBAQAogCQkvKiBXcml0ZSBtZXJnZWQgZGF0dW0gdG8gdGhlIHRhcmdldCBmaWVsZCAqLwogCiAJCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKG9ial9kZXNjLCBtYXNrLAotCQkJCSBtZXJnZWRfZGF0dW0sIGZpZWxkX29mZnNldCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlKG9ial9kZXNjLCBtYXNrLAorCQkJCQkJCW1lcmdlZF9kYXR1bSwKKwkJCQkJCQlmaWVsZF9vZmZzZXQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogU3RhcnQgbmV3IG91dHB1dCBkYXR1bSBieSBtZXJnaW5nIHdpdGggcHJldmlvdXMgaW5wdXQgZGF0dW0gKi8KIAogCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKIAkJbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtID4+Ci0JCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0KLQkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCQkgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCisJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAkJbWFzayA9IEFDUElfSU5URUdFUl9NQVg7CiAKIAkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKQEAgLTg0OSwyOCArODQ5LDI4IEBACiAJCS8qIEdldCB0aGUgbmV4dCBpbnB1dCBkYXR1bSBmcm9tIHRoZSBidWZmZXIgKi8KIAogCQlidWZmZXJfb2Zmc2V0ICs9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGg7Ci0JCUFDUElfTUVNQ1BZICgmcmF3X2RhdHVtLCAoKGNoYXIgKikgYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsCi0JCQlBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJCQkgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKLQkJbWVyZ2VkX2RhdHVtIHw9IHJhd19kYXR1bSA8PCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7CisJCUFDUElfTUVNQ1BZKCZyYXdfZGF0dW0sICgoY2hhciAqKWJ1ZmZlcikgKyBidWZmZXJfb2Zmc2V0LAorCQkJICAgIEFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICAgICBidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX29mZnNldCkpOworCQltZXJnZWRfZGF0dW0gfD0KKwkJICAgIHJhd19kYXR1bSA8PCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7CiAJfQogCiAJLyogTWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gdGhlIGxhc3QgZGF0dW0gKi8KIAogCWJ1ZmZlcl90YWlsX2JpdHMgPSAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKLQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCkgJQotCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKKwkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpICUKKwkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOwogCWlmIChidWZmZXJfdGFpbF9iaXRzKSB7Ci0JCW1hc2sgJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUgKGJ1ZmZlcl90YWlsX2JpdHMpOworCQltYXNrICY9IEFDUElfTUFTS19CSVRTX0FCT1ZFKGJ1ZmZlcl90YWlsX2JpdHMpOwogCX0KIAogCS8qIFdyaXRlIHRoZSBsYXN0IGRhdHVtIHRvIHRoZSBmaWVsZCAqLwogCiAJbWVyZ2VkX2RhdHVtICY9IG1hc2s7Ci0Jc3RhdHVzID0gYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlIChvYmpfZGVzYywKLQkJCSBtYXNrLCBtZXJnZWRfZGF0dW0sIGZpZWxkX29mZnNldCk7CisJc3RhdHVzID0gYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlKG9ial9kZXNjLAorCQkJCQkJbWFzaywgbWVyZ2VkX2RhdHVtLAorCQkJCQkJZmllbGRfb2Zmc2V0KTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKaW5kZXggMDIyZjI4MS4uYTNmNGQ3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYwpAQCAtNDIsMTUgKzQyLDEyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG1pc2MiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleG1pc2MiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY2LDI3ICs2MywyMyBAQAogICogICAgICAgICAgICAgIENvbW1vbiBjb2RlIGZvciB0aGUgcmVmX29mX29wIGFuZCB0aGUgY29uZF9yZWZfb2Zfb3AuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9nZXRfb2JqZWN0X3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjLAorCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZmVyZW5jZV9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVmZXJlbmNlZF9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVmZXJlbmNlX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWZlcmVuY2VkX29iajsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9nZXRfb2JqZWN0X3JlZmVyZW5jZSIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9nZXRfb2JqZWN0X3JlZmVyZW5jZSIsIG9ial9kZXNjKTsKIAogCSpyZXR1cm5fZGVzYyA9IE5VTEw7CiAKLQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyoKQEAgLTEwNCwxMyArOTcsMTEgQEAKIAogCQlkZWZhdWx0OgogCi0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgaW4gZ2V0X3JlZmVyZW5jZSAlWFxuIiwKLQkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgaW4gZ2V0X3JlZmVyZW5jZSAlWFxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfREVTQ19UWVBFX05BTUVEOgogCiAJCS8qCkBAIC0xMTksMzQgKzExMCwzMiBAQAogCQlyZWZlcmVuY2VkX29iaiA9IG9ial9kZXNjOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSBpbiBnZXRfcmVmZXJlbmNlOiAlWFxuIiwKLQkJCQlBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgZGVzY3JpcHRvciB0eXBlIGluIGdldF9yZWZlcmVuY2U6ICVYXG4iLCBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKIAl9CiAKLQogCS8qIENyZWF0ZSBhIG5ldyByZWZlcmVuY2Ugb2JqZWN0ICovCiAKLQlyZWZlcmVuY2Vfb2JqID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKKwlyZWZlcmVuY2Vfb2JqID0KKwkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOwogCWlmICghcmVmZXJlbmNlX29iaikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCXJlZmVyZW5jZV9vYmotPnJlZmVyZW5jZS5vcGNvZGUgPSBBTUxfUkVGX09GX09QOwogCXJlZmVyZW5jZV9vYmotPnJlZmVyZW5jZS5vYmplY3QgPSByZWZlcmVuY2VkX29iajsKIAkqcmV0dXJuX2Rlc2MgPSByZWZlcmVuY2Vfb2JqOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCi0JCW9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksICpyZXR1cm5fZGVzYykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCisJCQkgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwKKwkJCSAgKnJldHVybl9kZXNjKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY29uY2F0X3RlbXBsYXRlCkBAIC0xNjMsNjMgKzE1Miw1OCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29uY2F0X3RlbXBsYXRlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvcGVyYW5kMCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvcGVyYW5kMSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqYWN0dWFsX3JldHVybl9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMCwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQxLAorCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmFjdHVhbF9yZXR1cm5fZGVzYywKKwkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV3X2J1ZjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbmRfdGFnMTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbmRfdGFnMjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDE7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgyOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOworCXU4ICpuZXdfYnVmOworCXU4ICplbmRfdGFnMTsKKwl1OCAqZW5kX3RhZzI7CisJYWNwaV9zaXplIGxlbmd0aDE7CisJYWNwaV9zaXplIGxlbmd0aDI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9jb25jYXRfdGVtcGxhdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2NvbmNhdF90ZW1wbGF0ZSIpOwogCiAJLyogRmluZCB0aGUgZW5kX3RhZ3MgaW4gZWFjaCByZXNvdXJjZSB0ZW1wbGF0ZSAqLwogCi0JZW5kX3RhZzEgPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnIChvcGVyYW5kMCk7Ci0JZW5kX3RhZzIgPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnIChvcGVyYW5kMSk7CisJZW5kX3RhZzEgPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnKG9wZXJhbmQwKTsKKwllbmRfdGFnMiA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDEpOwogCWlmICghZW5kX3RhZzEgfHwgIWVuZF90YWcyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAl9CiAKIAkvKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgZWFjaCBwYXJ0ICovCiAKLQlsZW5ndGgxID0gQUNQSV9QVFJfRElGRiAoZW5kX3RhZzEsIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlcik7Ci0JbGVuZ3RoMiA9IEFDUElfUFRSX0RJRkYgKGVuZF90YWcyLCBvcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIpICsKLQkJCSAgMjsgLyogU2l6ZSBvZiBFTkRfVEFHICovCisJbGVuZ3RoMSA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZzEsIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlcik7CisJbGVuZ3RoMiA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZzIsIG9wZXJhbmQxLT5idWZmZXIucG9pbnRlcikgKyAyOwkvKiBTaXplIG9mIEVORF9UQUcgKi8KIAogCS8qIENyZWF0ZSBhIG5ldyBidWZmZXIgb2JqZWN0IGZvciB0aGUgcmVzdWx0ICovCiAKLQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKGxlbmd0aDEgKyBsZW5ndGgyKTsKKwlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QobGVuZ3RoMSArIGxlbmd0aDIpOwogCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBDb3B5IHRoZSB0ZW1wbGF0ZXMgdG8gdGhlIG5ldyBkZXNjcmlwdG9yICovCiAKIAluZXdfYnVmID0gcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCUFDUElfTUVNQ1BZIChuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDEpOwotCUFDUElfTUVNQ1BZIChuZXdfYnVmICsgbGVuZ3RoMSwgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgyKTsKKwlBQ1BJX01FTUNQWShuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDEpOworCUFDUElfTUVNQ1BZKG5ld19idWYgKyBsZW5ndGgxLCBvcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDIpOwogCiAJLyogQ29tcHV0ZSB0aGUgbmV3IGNoZWNrc3VtICovCiAKIAluZXdfYnVmW3JldHVybl9kZXNjLT5idWZmZXIubGVuZ3RoIC0gMV0gPQotCQkJYWNwaV91dF9nZW5lcmF0ZV9jaGVja3N1bSAocmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCQkgICAocmV0dXJuX2Rlc2MtPmJ1ZmZlci5sZW5ndGggLSAxKSk7CisJICAgIGFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0ocmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAgICAgIChyZXR1cm5fZGVzYy0+YnVmZmVyLmxlbmd0aCAtIDEpKTsKIAogCS8qIFJldHVybiB0aGUgY29tcGxldGVkIHRlbXBsYXRlIGRlc2NyaXB0b3IgKi8KIAogCSphY3R1YWxfcmV0dXJuX2Rlc2MgPSByZXR1cm5fZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZG9fY29uY2F0ZW5hdGUKQEAgLTIzNiwyMSArMjIwLDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9kb19jb25jYXRlbmF0ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZDAsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZDEsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmFjdHVhbF9yZXR1cm5fZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9kb19jb25jYXRlbmF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMCwKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQxLAorCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmFjdHVhbF9yZXR1cm5fZGVzYywKKwkJICAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbG9jYWxfb3BlcmFuZDEgPSBvcGVyYW5kMTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYzsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXdfYnVmOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xlbmd0aDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsb2NhbF9vcGVyYW5kMSA9IG9wZXJhbmQxOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOworCWNoYXIgKm5ld19idWY7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc2l6ZSBuZXdfbGVuZ3RoOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZG9fY29uY2F0ZW5hdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RvX2NvbmNhdGVuYXRlIik7CiAKIAkvKgogCSAqIENvbnZlcnQgdGhlIHNlY29uZCBvcGVyYW5kIGlmIG5lY2Vzc2FyeS4gIFRoZSBmaXJzdCBvcGVyYW5kCkBAIC0yNTksMjcgKzI0MCwyOCBAQAogCSAqIGd1YXJhbnRlZWQgdG8gYmUgZWl0aGVyIEludGVnZXIvU3RyaW5nL0J1ZmZlciBieSB0aGUgb3BlcmFuZAogCSAqIHJlc29sdXRpb24gbWVjaGFuaXNtLgogCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmQwKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsIDE2KTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsIDE2KTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcgKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsCi0JCQkJIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsCisJCQkJCQkgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIgKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvbmNhdCAtIGludmFsaWQgb2JqIHR5cGU6ICVYXG4iLAotCQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kMCkpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb25jYXQgLSBpbnZhbGlkIG9iaiB0eXBlOiAlWFxuIiwKKwkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCX0KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjk2LDMyICsyNzgsMzMgQEAKIAkgKiAyKSBUd28gU3RyaW5ncyBjb25jYXRlbmF0ZWQgdG8gcHJvZHVjZSBhIG5ldyBTdHJpbmcKIAkgKiAzKSBUd28gQnVmZmVycyBjb25jYXRlbmF0ZWQgdG8gcHJvZHVjZSBhIG5ldyBCdWZmZXIKIAkgKi8KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kMCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkgewogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKIAkJLyogUmVzdWx0IG9mIHR3byBJbnRlZ2VycyBpcyBhIEJ1ZmZlciAqLwogCQkvKiBOZWVkIGVub3VnaCBidWZmZXIgc3BhY2UgZm9yIHR3byBpbnRlZ2VycyAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoCi0JCQkJICAgQUNQSV9NVUxfMiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKSk7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCgoYWNwaV9zaXplKQorCQkJCQkJCSAgIEFDUElfTVVMXzIKKwkJCQkJCQkgICAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKSk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCW5ld19idWYgPSAoY2hhciAqKSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisJCW5ld19idWYgPSAoY2hhciAqKXJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKIAogCQkvKiBDb3B5IHRoZSBmaXJzdCBpbnRlZ2VyLCBMU0IgZmlyc3QgKi8KIAotCQlBQ1BJX01FTUNQWSAobmV3X2J1ZiwKLQkJCQkgICZvcGVyYW5kMC0+aW50ZWdlci52YWx1ZSwKLQkJCQkgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CisJCUFDUElfTUVNQ1BZKG5ld19idWYsCisJCQkgICAgJm9wZXJhbmQwLT5pbnRlZ2VyLnZhbHVlLAorCQkJICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CiAKIAkJLyogQ29weSB0aGUgc2Vjb25kIGludGVnZXIgKExTQiBmaXJzdCkgYWZ0ZXIgdGhlIGZpcnN0ICovCiAKLQkJQUNQSV9NRU1DUFkgKG5ld19idWYgKyBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgsCi0JCQkJICAmbG9jYWxfb3BlcmFuZDEtPmludGVnZXIudmFsdWUsCi0JCQkJICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOworCQlBQ1BJX01FTUNQWShuZXdfYnVmICsgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoLAorCQkJICAgICZsb2NhbF9vcGVyYW5kMS0+aW50ZWdlci52YWx1ZSwKKwkJCSAgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKQEAgLTMyOSwxMyArMzEyLDEzIEBACiAJCS8qIFJlc3VsdCBvZiB0d28gU3RyaW5ncyBpcyBhIFN0cmluZyAqLwogCiAJCW5ld19sZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kMC0+c3RyaW5nLmxlbmd0aCArCi0JCQkJIChhY3BpX3NpemUpIGxvY2FsX29wZXJhbmQxLT5zdHJpbmcubGVuZ3RoOworCQkgICAgKGFjcGlfc2l6ZSkgbG9jYWxfb3BlcmFuZDEtPnN0cmluZy5sZW5ndGg7CiAJCWlmIChuZXdfbGVuZ3RoID4gQUNQSV9NQVhfU1RSSU5HX0NPTlZFUlNJT04pIHsKIAkJCXN0YXR1cyA9IEFFX0FNTF9TVFJJTkdfTElNSVQ7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QgKG5ld19sZW5ndGgpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QobmV3X2xlbmd0aCk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTM0NSw1NiArMzI4LDU2IEBACiAKIAkJLyogQ29uY2F0ZW5hdGUgdGhlIHN0cmluZ3MgKi8KIAotCQlBQ1BJX1NUUkNQWSAobmV3X2J1ZiwKLQkJCQkgIG9wZXJhbmQwLT5zdHJpbmcucG9pbnRlcik7Ci0JCUFDUElfU1RSQ1BZIChuZXdfYnVmICsgb3BlcmFuZDAtPnN0cmluZy5sZW5ndGgsCi0JCQkJICBsb2NhbF9vcGVyYW5kMS0+c3RyaW5nLnBvaW50ZXIpOworCQlBQ1BJX1NUUkNQWShuZXdfYnVmLCBvcGVyYW5kMC0+c3RyaW5nLnBvaW50ZXIpOworCQlBQ1BJX1NUUkNQWShuZXdfYnVmICsgb3BlcmFuZDAtPnN0cmluZy5sZW5ndGgsCisJCQkgICAgbG9jYWxfb3BlcmFuZDEtPnN0cmluZy5wb2ludGVyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKIAkJLyogUmVzdWx0IG9mIHR3byBCdWZmZXJzIGlzIGEgQnVmZmVyICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0ICgKLQkJCQkgICAoYWNwaV9zaXplKSBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aCArCi0JCQkJICAgKGFjcGlfc2l6ZSkgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5sZW5ndGgpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBvcGVyYW5kMC0+YnVmZmVyLgorCQkJCQkJCSAgIGxlbmd0aCArCisJCQkJCQkJICAgKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBsb2NhbF9vcGVyYW5kMS0+CisJCQkJCQkJICAgYnVmZmVyLmxlbmd0aCk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCW5ld19idWYgPSAoY2hhciAqKSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisJCW5ld19idWYgPSAoY2hhciAqKXJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKIAogCQkvKiBDb25jYXRlbmF0ZSB0aGUgYnVmZmVycyAqLwogCi0JCUFDUElfTUVNQ1BZIChuZXdfYnVmLAotCQkJCSAgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSAgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgpOwotCQlBQ1BJX01FTUNQWSAobmV3X2J1ZiArIG9wZXJhbmQwLT5idWZmZXIubGVuZ3RoLAotCQkJCSAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWShuZXdfYnVmLAorCQkJICAgIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlciwgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWShuZXdfYnVmICsgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgsCisJCQkgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAorCQkJICAgIGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCiAJCS8qIEludmFsaWQgb2JqZWN0IHR5cGUsIHNob3VsZCBub3QgaGFwcGVuIGhlcmUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb25jYXRlbmF0ZSAtIEludmFsaWQgb2JqZWN0IHR5cGU6ICVYXG4iLAotCQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kMCkpKTsKLQkJc3RhdHVzID1BRV9BTUxfSU5URVJOQUw7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ29uY2F0ZW5hdGUgLSBJbnZhbGlkIG9iamVjdCB0eXBlOiAlWFxuIiwKKwkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJKmFjdHVhbF9yZXR1cm5fZGVzYyA9IHJldHVybl9kZXNjOwogCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAlpZiAobG9jYWxfb3BlcmFuZDEgIT0gb3BlcmFuZDEpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChsb2NhbF9vcGVyYW5kMSk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsb2NhbF9vcGVyYW5kMSk7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX21hdGhfb3AKQEAgLTQxMiw2MiArMzk1LDQ5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX2ludGVnZXIKLWFjcGlfZXhfZG9fbWF0aF9vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyMCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIxKQorYWNwaV9leF9kb19tYXRoX29wKHUxNiBvcGNvZGUsIGFjcGlfaW50ZWdlciBpbnRlZ2VyMCwgYWNwaV9pbnRlZ2VyIGludGVnZXIxKQogewogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBTUxfQUREX09QOiAgICAgICAgICAgICAgICAvKiBBZGQgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCWNhc2UgQU1MX0FERF9PUDoJLyogQWRkIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwICsgaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9CSVRfQU5EX09QOiAgICAgICAgICAgIC8qIEFuZCAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCisJY2FzZSBBTUxfQklUX0FORF9PUDoJLyogQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwICYgaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9CSVRfTkFORF9PUDogICAgICAgICAgIC8qIE5BbmQgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCWNhc2UgQU1MX0JJVF9OQU5EX09QOgkvKiBOQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKH4oaW50ZWdlcjAgJiBpbnRlZ2VyMSkpOwogCi0KLQljYXNlIEFNTF9CSVRfT1JfT1A6ICAgICAgICAgICAgIC8qIE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKwljYXNlIEFNTF9CSVRfT1JfT1A6CS8qIE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwIHwgaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9CSVRfTk9SX09QOiAgICAgICAgICAgIC8qIE5PciAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCisJY2FzZSBBTUxfQklUX05PUl9PUDoJLyogTk9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKH4oaW50ZWdlcjAgfCBpbnRlZ2VyMSkpOwogCi0KLQljYXNlIEFNTF9CSVRfWE9SX09QOiAgICAgICAgICAgIC8qIFhPciAoSW50ZWdlcjAsIEludGVnZXIxLCBSZXN1bHQpICovCisJY2FzZSBBTUxfQklUX1hPUl9PUDoJLyogWE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KIAogCQlyZXR1cm4gKGludGVnZXIwIF4gaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9NVUxUSVBMWV9PUDogICAgICAgICAgIC8qIE11bHRpcGx5IChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKwljYXNlIEFNTF9NVUxUSVBMWV9PUDoJLyogTXVsdGlwbHkgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLwogCiAJCXJldHVybiAoaW50ZWdlcjAgKiBpbnRlZ2VyMSk7CiAKLQotCWNhc2UgQU1MX1NISUZUX0xFRlRfT1A6ICAgICAgICAgLyogc2hpZnRfbGVmdCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkqLworCWNhc2UgQU1MX1NISUZUX0xFRlRfT1A6CS8qIHNoaWZ0X2xlZnQgKE9wZXJhbmQsIHNoaWZ0X2NvdW50LCBSZXN1bHQpICovCiAKIAkJcmV0dXJuIChpbnRlZ2VyMCA8PCBpbnRlZ2VyMSk7CiAKLQotCWNhc2UgQU1MX1NISUZUX1JJR0hUX09QOiAgICAgICAgLyogc2hpZnRfcmlnaHQgKE9wZXJhbmQsIHNoaWZ0X2NvdW50LCBSZXN1bHQpICovCisJY2FzZSBBTUxfU0hJRlRfUklHSFRfT1A6CS8qIHNoaWZ0X3JpZ2h0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLwogCiAJCXJldHVybiAoaW50ZWdlcjAgPj4gaW50ZWdlcjEpOwogCi0KLQljYXNlIEFNTF9TVUJUUkFDVF9PUDogICAgICAgICAgIC8qIFN1YnRyYWN0IChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKwljYXNlIEFNTF9TVUJUUkFDVF9PUDoJLyogU3VidHJhY3QgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLwogCiAJCXJldHVybiAoaW50ZWdlcjAgLSBpbnRlZ2VyMSk7CiAKQEAgLTQ3Nyw3ICs0NDcsNiBAQAogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcApAQCAtNDk5LDI4ICs0NjgsMjQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyMCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIxLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfcmVzdWx0KQorYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AodTE2IG9wY29kZSwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMCwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMSwgdTggKiBsb2dpY2FsX3Jlc3VsdCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcmVzdWx0ID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTggbG9jYWxfcmVzdWx0ID0gRkFMU0U7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9kb19sb2dpY2FsX251bWVyaWNfb3AiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCIpOwogCiAJc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFNTF9MQU5EX09QOiAgICAgICAgICAgICAgIC8qIExBbmQgKEludGVnZXIwLCBJbnRlZ2VyMSkgKi8KKwljYXNlIEFNTF9MQU5EX09QOgkvKiBMQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEpICovCiAKIAkJaWYgKGludGVnZXIwICYmIGludGVnZXIxKSB7CiAJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBBTUxfTE9SX09QOiAgICAgICAgICAgICAgICAvKiBMT3IgKEludGVnZXIwLCBJbnRlZ2VyMSkgKi8KKwljYXNlIEFNTF9MT1JfT1A6CS8qIExPciAoSW50ZWdlcjAsIEludGVnZXIxKSAqLwogCiAJCWlmIChpbnRlZ2VyMCB8fCBpbnRlZ2VyMSkgewogCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKQEAgLTUzNSwxMCArNTAwLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGxvZ2ljYWwgcmVzdWx0IGFuZCBzdGF0dXMgKi8KIAogCSpsb2dpY2FsX3Jlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19sb2dpY2FsX29wCkBAIC01NjYsMjQgKzUzMCwyMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fbG9naWNhbF9vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZDAsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZDEsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9naWNhbF9yZXN1bHQpCithY3BpX2V4X2RvX2xvZ2ljYWxfb3AodTE2IG9wY29kZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCisJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQxLCB1OCAqIGxvZ2ljYWxfcmVzdWx0KQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxvY2FsX29wZXJhbmQxID0gb3BlcmFuZDE7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyMDsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIxOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDE7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3Jlc3VsdCA9IEZBTFNFOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsb2NhbF9vcGVyYW5kMSA9IG9wZXJhbmQxOworCWFjcGlfaW50ZWdlciBpbnRlZ2VyMDsKKwlhY3BpX2ludGVnZXIgaW50ZWdlcjE7CisJdTMyIGxlbmd0aDA7CisJdTMyIGxlbmd0aDE7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTggbG9jYWxfcmVzdWx0ID0gRkFMU0U7CisJaW50IGNvbXBhcmU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9kb19sb2dpY2FsX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kb19sb2dpY2FsX29wIik7CiAKIAkvKgogCSAqIENvbnZlcnQgdGhlIHNlY29uZCBvcGVyYW5kIGlmIG5lY2Vzc2FyeS4gIFRoZSBmaXJzdCBvcGVyYW5kCkBAIC01OTIsMTggKzU1MiwxOSBAQAogCSAqIGd1YXJhbnRlZWQgdG8gYmUgZWl0aGVyIEludGVnZXIvU3RyaW5nL0J1ZmZlciBieSB0aGUgb3BlcmFuZAogCSAqIHJlc29sdXRpb24gbWVjaGFuaXNtLgogCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmQwKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsIDE2KTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsIDE2KTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcgKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsCi0JCQkJIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsCisJCQkJCQkgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIgKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC02MTEsMTQgKzU3MiwxNCBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKgogCSAqIFR3byBjYXNlczogMSkgQm90aCBJbnRlZ2VycywgMikgQm90aCBTdHJpbmdzIG9yIEJ1ZmZlcnMKIAkgKi8KLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmQwKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJLyoKIAkJICogMSkgQm90aCBvcGVyYW5kcyBhcmUgb2YgdHlwZSBpbnRlZ2VyCiAJCSAqICAgIE5vdGU6IGxvY2FsX29wZXJhbmQxIG1heSBoYXZlIGNoYW5nZWQgYWJvdmUKQEAgLTYyNywyMSArNTg4LDIxIEBACiAJCWludGVnZXIxID0gbG9jYWxfb3BlcmFuZDEtPmludGVnZXIudmFsdWU7CiAKIAkJc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBBTUxfTEVRVUFMX09QOiAgICAgICAgICAgICAvKiBMRXF1YWwgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKwkJY2FzZSBBTUxfTEVRVUFMX09QOgkvKiBMRXF1YWwgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KIAogCQkJaWYgKGludGVnZXIwID09IGludGVnZXIxKSB7CiAJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKIAkJCX0KIAkJCWJyZWFrOwogCi0JCWNhc2UgQU1MX0xHUkVBVEVSX09QOiAgICAgICAgICAgLyogTEdyZWF0ZXIgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKwkJY2FzZSBBTUxfTEdSRUFURVJfT1A6CS8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCiAKIAkJCWlmIChpbnRlZ2VyMCA+IGludGVnZXIxKSB7CiAJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKIAkJCX0KIAkJCWJyZWFrOwogCi0JCWNhc2UgQU1MX0xMRVNTX09QOiAgICAgICAgICAgICAgLyogTExlc3MgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKwkJY2FzZSBBTUxfTExFU1NfT1A6CS8qIExMZXNzIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCiAKIAkJCWlmIChpbnRlZ2VyMCA8IGludGVnZXIxKSB7CiAJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKQEAgLTY1Miw4ICs2MTMsNyBAQAogCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQkJYnJlYWs7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogMikgQm90aCBvcGVyYW5kcyBhcmUgU3RyaW5ncyBvciBib3RoIGFyZSBCdWZmZXJzCiAJCSAqICAgIE5vdGU6IENvZGUgYmVsb3cgdGFrZXMgYWR2YW50YWdlIG9mIGNvbW1vbiBCdWZmZXIvU3RyaW5nCkBAIC02NjUsMzEgKzYyNSwzMSBAQAogCiAJCS8qIExleGljb2dyYXBoaWMgY29tcGFyZTogY29tcGFyZSB0aGUgZGF0YSBieXRlcyAqLwogCi0JCWNvbXBhcmUgPSBBQ1BJX01FTUNNUCAoKGNvbnN0IGNoYXIgKiApIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlciwKLQkJCQkgKGNvbnN0IGNoYXIgKiApIGxvY2FsX29wZXJhbmQxLT5idWZmZXIucG9pbnRlciwKLQkJCQkgKGxlbmd0aDAgPiBsZW5ndGgxKSA/IGxlbmd0aDEgOiBsZW5ndGgwKTsKKwkJY29tcGFyZSA9IEFDUElfTUVNQ01QKChjb25zdCBjaGFyICopb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAgICAgIChjb25zdCBjaGFyICopbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci4KKwkJCQkgICAgICBwb2ludGVyLAorCQkJCSAgICAgIChsZW5ndGgwID4gbGVuZ3RoMSkgPyBsZW5ndGgxIDogbGVuZ3RoMCk7CiAKIAkJc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBBTUxfTEVRVUFMX09QOiAgICAgICAgICAgICAvKiBMRXF1YWwgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKwkJY2FzZSBBTUxfTEVRVUFMX09QOgkvKiBMRXF1YWwgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KIAogCQkJLyogTGVuZ3RoIGFuZCBhbGwgYnl0ZXMgbXVzdCBiZSBlcXVhbCAqLwogCi0JCQlpZiAoKGxlbmd0aDAgPT0gbGVuZ3RoMSkgJiYKLQkJCQkoY29tcGFyZSA9PSAwKSkgeworCQkJaWYgKChsZW5ndGgwID09IGxlbmd0aDEpICYmIChjb21wYXJlID09IDApKSB7CiAJCQkJLyogTGVuZ3RoIGFuZCBhbGwgYnl0ZXMgbWF0Y2ggPT0+IFRSVUUgKi8KIAogCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CiAJCQl9CiAJCQlicmVhazsKIAotCQljYXNlIEFNTF9MR1JFQVRFUl9PUDogICAgICAgICAgIC8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisJCWNhc2UgQU1MX0xHUkVBVEVSX09QOgkvKiBMR3JlYXRlciAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwogCiAJCQlpZiAoY29tcGFyZSA+IDApIHsKIAkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwotCQkJCWdvdG8gY2xlYW51cDsgICAvKiBUUlVFICovCisJCQkJZ290byBjbGVhbnVwOwkvKiBUUlVFICovCiAJCQl9CiAJCQlpZiAoY29tcGFyZSA8IDApIHsKLQkJCQlnb3RvIGNsZWFudXA7ICAgLyogRkFMU0UgKi8KKwkJCQlnb3RvIGNsZWFudXA7CS8qIEZBTFNFICovCiAJCQl9CiAKIAkJCS8qIEJ5dGVzIG1hdGNoICh0byBzaG9ydGVzdCBsZW5ndGgpLCBjb21wYXJlIGxlbmd0aHMgKi8KQEAgLTY5OSwxNCArNjU5LDE0IEBACiAJCQl9CiAJCQlicmVhazsKIAotCQljYXNlIEFNTF9MTEVTU19PUDogICAgICAgICAgICAgIC8qIExMZXNzIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisJCWNhc2UgQU1MX0xMRVNTX09QOgkvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwogCiAJCQlpZiAoY29tcGFyZSA+IDApIHsKLQkJCQlnb3RvIGNsZWFudXA7ICAgLyogRkFMU0UgKi8KKwkJCQlnb3RvIGNsZWFudXA7CS8qIEZBTFNFICovCiAJCQl9CiAJCQlpZiAoY29tcGFyZSA8IDApIHsKIAkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwotCQkJCWdvdG8gY2xlYW51cDsgICAvKiBUUlVFICovCisJCQkJZ290byBjbGVhbnVwOwkvKiBUUlVFICovCiAJCQl9CiAKIAkJCS8qIEJ5dGVzIG1hdGNoICh0byBzaG9ydGVzdCBsZW5ndGgpLCBjb21wYXJlIGxlbmd0aHMgKi8KQEAgLTcyMiwxOCArNjgyLDE2IEBACiAJCX0KIAl9CiAKLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogTmV3IG9iamVjdCB3YXMgY3JlYXRlZCBpZiBpbXBsaWNpdCBjb252ZXJzaW9uIHBlcmZvcm1lZCAtIGRlbGV0ZSAqLwogCiAJaWYgKGxvY2FsX29wZXJhbmQxICE9IG9wZXJhbmQxKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAobG9jYWxfb3BlcmFuZDEpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobG9jYWxfb3BlcmFuZDEpOwogCX0KIAogCS8qIFJldHVybiB0aGUgbG9naWNhbCByZXN1bHQgYW5kIHN0YXR1cyAqLwogCiAJKmxvZ2ljYWxfcmVzdWx0ID0gbG9jYWxfcmVzdWx0OwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwppbmRleCBjM2NiNzE0Li5hYjQ3ZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKQEAgLTQyLDIwICs0MiwxNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4bXV0ZXgiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhtdXRleCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIHZvaWQKLWFjcGlfZXhfbGlua19tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKLQorYWNwaV9leF9saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICBzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksMTIgKzY1LDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2V4X3VubGlua19tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCit2b2lkIGFjcGlfZXhfdW5saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCA9IG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQ7Ci0KKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCA9IG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQ7CiAKIAlpZiAoIXRocmVhZCkgewogCQlyZXR1cm47CkBAIC04OCwxMyArODEsMTEgQEAKIAogCWlmIChvYmpfZGVzYy0+bXV0ZXgucHJldikgewogCQkob2JqX2Rlc2MtPm11dGV4LnByZXYpLT5tdXRleC5uZXh0ID0gb2JqX2Rlc2MtPm11dGV4Lm5leHQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdCA9IG9ial9kZXNjLT5tdXRleC5uZXh0OwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2xpbmtfbXV0ZXgKQEAgLTEwOSwxMiArMTAwLDEwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV9leF9saW5rX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCithY3BpX2V4X2xpbmtfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxpc3RfaGVhZDsKLQorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxpc3RfaGVhZDsKIAogCWxpc3RfaGVhZCA9IHRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdDsKIApAQCAtMTM0LDcgKzEyMyw2IEBACiAJdGhyZWFkLT5hY3F1aXJlZF9tdXRleF9saXN0ID0gb2JqX2Rlc2M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY3F1aXJlX211dGV4CkBAIC0xNTAsMjcgKzEzOCwyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWNxdWlyZV9tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGltZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X2FjcXVpcmVfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGltZV9kZXNjLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfYWNxdWlyZV9tdXRleCIsIG9ial9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9hY3F1aXJlX211dGV4Iiwgb2JqX2Rlc2MpOwogCiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogU2FuaXR5IGNoZWNrIC0tIHdlIG11c3QgaGF2ZSBhIHZhbGlkIHRocmVhZCBJRCAqLwogCiAJaWYgKCF3YWxrX3N0YXRlLT50aHJlYWQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ2Fubm90IGFjcXVpcmUgTXV0ZXggWyU0LjRzXSwgbnVsbCB0aHJlYWQgaW5mb1xuIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBudWxsIHRocmVhZCBpbmZvXG4iLCBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCX0KIAogCS8qCkBAIC0xNzgsMTAgKzE2Miw4IEBACiAJICogbXV0ZXguICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBzb21lIGRlYWRsb2NrIHByZXZlbnRpb24KIAkgKi8KIAlpZiAod2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPiBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBzeW5jX2xldmVsXG4iLAotCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTVVURVhfT1JERVIpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBzeW5jX2xldmVsXG4iLCBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfT1JERVIpOwogCX0KIAogCS8qIFN1cHBvcnQgZm9yIG11bHRpcGxlIGFjcXVpcmVzIGJ5IHRoZSBvd25pbmcgdGhyZWFkICovCkBAIC0xOTAsNDMgKzE3Miw0MyBAQAogCQkvKiBTcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrLCBhbGxvdyBhbGwgdGhyZWFkcyAqLwogCiAJCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkID09Ci0JCQkJd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpICAgICAgfHwKLQkJCShvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlID09Ci0JCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgeworCQkgICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSB8fAorCQkgICAgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0KKwkJICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpKSB7CiAJCQkvKgogCQkJICogVGhlIG11dGV4IGlzIGFscmVhZHkgb3duZWQgYnkgdGhpcyB0aHJlYWQsCiAJCQkgKiBqdXN0IGluY3JlbWVudCB0aGUgYWNxdWlzaXRpb24gZGVwdGgKIAkJCSAqLwogCQkJb2JqX2Rlc2MtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoKys7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAl9CiAKIAkvKiBBY3F1aXJlIHRoZSBtdXRleCwgd2FpdCBpZiBuZWNlc3NhcnkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX2FjcXVpcmVfbXV0ZXggKHRpbWVfZGVzYywgb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4KHRpbWVfZGVzYywgb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkvKiBJbmNsdWRlcyBmYWlsdXJlIGZyb20gYSB0aW1lb3V0IG9uIHRpbWVfZGVzYyAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSGF2ZSB0aGUgbXV0ZXg6IHVwZGF0ZSBtdXRleCBhbmQgd2FsayBpbmZvIGFuZCBzYXZlIHRoZSBzeW5jX2xldmVsICovCiAKLQlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkICAgICA9IHdhbGtfc3RhdGUtPnRocmVhZDsKKwlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gd2Fsa19zdGF0ZS0+dGhyZWFkOwogCW9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCA9IDE7Ci0Jb2JqX2Rlc2MtPm11dGV4Lm9yaWdpbmFsX3N5bmNfbGV2ZWwgPSB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbDsKKwlvYmpfZGVzYy0+bXV0ZXgub3JpZ2luYWxfc3luY19sZXZlbCA9CisJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsOwogCiAJd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPSBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbDsKIAogCS8qIExpbmsgdGhlIG11dGV4IHRvIHRoZSBjdXJyZW50IHRocmVhZCBmb3IgZm9yY2UtdW5sb2NrIGF0IG1ldGhvZCBleGl0ICovCiAKLQlhY3BpX2V4X2xpbmtfbXV0ZXggKG9ial9kZXNjLCB3YWxrX3N0YXRlLT50aHJlYWQpOworCWFjcGlfZXhfbGlua19tdXRleChvYmpfZGVzYywgd2Fsa19zdGF0ZS0+dGhyZWFkKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX211dGV4CkBAIC0yNDEsNDggKzIyMyw0MCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVsZWFzZV9tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfcmVsZWFzZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9yZWxlYXNlX211dGV4Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9yZWxlYXNlX211dGV4Iik7CiAKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBUaGUgbXV0ZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhY3F1aXJlZCBpbiBvcmRlciB0byByZWxlYXNlIGl0ICovCiAKIAlpZiAoIW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgbm90IGFjcXVpcmVkXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX01VVEVYX05PVF9BQ1FVSVJFRCk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgbm90IGFjcXVpcmVkXG4iLCBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfTk9UX0FDUVVJUkVEKTsKIAl9CiAKIAkvKiBTYW5pdHkgY2hlY2sgLS0gd2UgbXVzdCBoYXZlIGEgdmFsaWQgdGhyZWFkIElEICovCiAKIAlpZiAoIXdhbGtfc3RhdGUtPnRocmVhZCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBudWxsIHRocmVhZCBpbmZvXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBudWxsIHRocmVhZCBpbmZvXG4iLCBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCX0KIAogCS8qCiAJICogVGhlIE11dGV4IGlzIG93bmVkLCBidXQgdGhpcyB0aHJlYWQgbXVzdCBiZSB0aGUgb3duZXIuCiAJICogU3BlY2lhbCBjYXNlIGZvciBHbG9iYWwgTG9jaywgYW55IHRocmVhZCBjYW4gcmVsZWFzZQogCSAqLwotCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkICE9IHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSAmJgotCQkob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSAhPSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiVGhyZWFkICVYIGNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10gYWNxdWlyZWQgYnkgdGhyZWFkICVYXG4iLAotCQkJd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSwKLQkJCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT1RfT1dORVIpOworCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkICE9CisJICAgICB3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCkKKwkgICAgJiYgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgIT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlRocmVhZCAlWCBjYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdIGFjcXVpcmVkIGJ5IHRocmVhZCAlWFxuIiwgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSksIG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PVF9PV05FUik7CiAJfQogCiAJLyoKQEAgLTI5MCwxMCArMjY0LDggQEAKIAkgKiBlcXVhbCB0byB0aGUgY3VycmVudCBzeW5jIGxldmVsCiAJICovCiAJaWYgKG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID4gd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX01VVEVYX09SREVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX01VVEVYX09SREVSKTsKIAl9CiAKIAkvKiBNYXRjaCBtdWx0aXBsZSBBY3F1aXJlcyB3aXRoIG11bHRpcGxlIFJlbGVhc2VzICovCkBAIC0zMDIsMjYgKzI3NCwyNiBAQAogCWlmIChvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggIT0gMCkgewogCQkvKiBKdXN0IGRlY3JlbWVudCB0aGUgZGVwdGggYW5kIHJldHVybiAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIFVubGluayB0aGUgbXV0ZXggZnJvbSB0aGUgb3duZXIncyBsaXN0ICovCiAKLQlhY3BpX2V4X3VubGlua19tdXRleCAob2JqX2Rlc2MpOworCWFjcGlfZXhfdW5saW5rX211dGV4KG9ial9kZXNjKTsKIAogCS8qIFJlbGVhc2UgdGhlIG11dGV4ICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4IChvYmpfZGVzYyk7CisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fcmVsZWFzZV9tdXRleChvYmpfZGVzYyk7CiAKIAkvKiBVcGRhdGUgdGhlIG11dGV4IGFuZCB3YWxrIHN0YXRlLCByZXN0b3JlIHN5bmNfbGV2ZWwgYmVmb3JlIGFjcXVpcmUgKi8KIAogCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQgPSBOVUxMOwotCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0gb2JqX2Rlc2MtPm11dGV4Lm9yaWdpbmFsX3N5bmNfbGV2ZWw7CisJd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPQorCSAgICBvYmpfZGVzYy0+bXV0ZXgub3JpZ2luYWxfc3luY19sZXZlbDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMKQEAgLTMzNCwxNyArMzA2LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCit2b2lkIGFjcGlfZXhfcmVsZWFzZV9hbGxfbXV0ZXhlcyhzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpuZXh0ID0gdGhyZWFkLT5hY3F1aXJlZF9tdXRleF9saXN0OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRoaXM7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dCA9IHRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aGlzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIG93bmVkIG11dGV4ZXMsIHJlbGVhc2luZyBlYWNoIG9uZSAqLwogCkBAIC0zNTMsMTMgKzMyMSwxMyBAQAogCQluZXh0ID0gdGhpcy0+bXV0ZXgubmV4dDsKIAogCQl0aGlzLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCA9IDE7Ci0JCXRoaXMtPm11dGV4LnByZXYgICAgICAgICAgICAgPSBOVUxMOwotCQl0aGlzLT5tdXRleC5uZXh0ICAgICAgICAgICAgID0gTlVMTDsKKwkJdGhpcy0+bXV0ZXgucHJldiA9IE5VTEw7CisJCXRoaXMtPm11dGV4Lm5leHQgPSBOVUxMOwogCi0JCSAvKiBSZWxlYXNlIHRoZSBtdXRleCAqLworCQkvKiBSZWxlYXNlIHRoZSBtdXRleCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXggKHRoaXMpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgodGhpcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJY29udGludWU7CiAJCX0KIApAQCAtMzcyLDUgKzM0MCwzIEBACiAJCXRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0gdGhpcy0+bXV0ZXgub3JpZ2luYWxfc3luY19sZXZlbDsKIAl9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKaW5kZXggNjM5ZjBiZC4uMjM5ZDg0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCkBAIC00MiwyNiArNDIsMTggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG5hbWVzIikKK0FDUElfTU9EVUxFX05BTUUoImV4bmFtZXMiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyBjaGFyICoKLWFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2NvdW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25hbWVfc2Vncyk7CitzdGF0aWMgY2hhciAqYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyh1MzIgcHJlZml4X2NvdW50LCB1MzIgbnVtX25hbWVfc2Vncyk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9uYW1lX3NlZ21lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKippbl9hbWxfYWRkcmVzcywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3N0cmluZyk7Ci0KK2FjcGlfZXhfbmFtZV9zZWdtZW50KHU4ICoqIGluX2FtbF9hZGRyZXNzLCBjaGFyICpuYW1lX3N0cmluZyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzksMTcgKzcxLDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNoYXIgKgotYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfY291bnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbmFtZV9zZWdzKQorc3RhdGljIGNoYXIgKmFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcodTMyIHByZWZpeF9jb3VudCwgdTMyIG51bV9uYW1lX3NlZ3MpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmc7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9uZWVkZWQ7CisJY2hhciAqdGVtcF9wdHI7CisJY2hhciAqbmFtZV9zdHJpbmc7CisJdTMyIHNpemVfbmVlZGVkOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2FsbG9jYXRlX25hbWVfc3RyaW5nIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9hbGxvY2F0ZV9uYW1lX3N0cmluZyIpOwogCiAJLyoKIAkgKiBBbGxvdyByb29tIGZvciBhbGwgXCBhbmQgXiBwcmVmaXhlcywgYWxsIHNlZ21lbnRzIGFuZCBhIG11bHRpX25hbWVfcHJlZml4LgpAQCAtMTAwLDIwICs4OCwxOSBAQAogCQkvKiBTcGVjaWFsIGNhc2UgZm9yIHJvb3QgKi8KIAogCQlzaXplX25lZWRlZCA9IDEgKyAoQUNQSV9OQU1FX1NJWkUgKiBudW1fbmFtZV9zZWdzKSArIDIgKyAxOwotCX0KLQllbHNlIHsKLQkJc2l6ZV9uZWVkZWQgPSBwcmVmaXhfY291bnQgKyAoQUNQSV9OQU1FX1NJWkUgKiBudW1fbmFtZV9zZWdzKSArIDIgKyAxOworCX0gZWxzZSB7CisJCXNpemVfbmVlZGVkID0KKwkJICAgIHByZWZpeF9jb3VudCArIChBQ1BJX05BTUVfU0laRSAqIG51bV9uYW1lX3NlZ3MpICsgMiArIDE7CiAJfQogCiAJLyoKIAkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIG5hbWUuCiAJICogVGhpcyBidWZmZXIgbXVzdCBiZSBkZWxldGVkIGJ5IHRoZSBjYWxsZXIhCiAJICovCi0JbmFtZV9zdHJpbmcgPSBBQ1BJX01FTV9BTExPQ0FURSAoc2l6ZV9uZWVkZWQpOworCW5hbWVfc3RyaW5nID0gQUNQSV9NRU1fQUxMT0NBVEUoc2l6ZV9uZWVkZWQpOwogCWlmICghbmFtZV9zdHJpbmcpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJleF9hbGxvY2F0ZV9uYW1lX3N0cmluZzogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJWRcbiIsIHNpemVfbmVlZGVkKSk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImV4X2FsbG9jYXRlX25hbWVfc3RyaW5nOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlZFxuIiwgc2l6ZV9uZWVkZWQpKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAl0ZW1wX3B0ciA9IG5hbWVfc3RyaW5nOwpAQCAtMTIyLDIzICsxMDksMjAgQEAKIAogCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CiAJCSp0ZW1wX3B0cisrID0gQU1MX1JPT1RfUFJFRklYOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQl3aGlsZSAocHJlZml4X2NvdW50LS0pIHsKIAkJCSp0ZW1wX3B0cisrID0gQU1MX1BBUkVOVF9QUkVGSVg7CiAJCX0KIAl9CiAKLQogCS8qIFNldCB1cCBEdWFsIG9yIE11bHRpIHByZWZpeGVzIGlmIG5lZWRlZCAqLwogCiAJaWYgKG51bV9uYW1lX3NlZ3MgPiAyKSB7CiAJCS8qIFNldCB1cCBtdWx0aSBwcmVmaXhlcyAgICovCiAKIAkJKnRlbXBfcHRyKysgPSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A7Ci0JCSp0ZW1wX3B0cisrID0gKGNoYXIpIG51bV9uYW1lX3NlZ3M7Ci0JfQotCWVsc2UgaWYgKDIgPT0gbnVtX25hbWVfc2VncykgeworCQkqdGVtcF9wdHIrKyA9IChjaGFyKW51bV9uYW1lX3NlZ3M7CisJfSBlbHNlIGlmICgyID09IG51bV9uYW1lX3NlZ3MpIHsKIAkJLyogU2V0IHVwIGR1YWwgcHJlZml4ZXMgKi8KIAogCQkqdGVtcF9wdHIrKyA9IEFNTF9EVUFMX05BTUVfUFJFRklYOwpAQCAtMTUwLDcgKzEzNCw3IEBACiAJICovCiAJKnRlbXBfcHRyID0gMDsKIAotCXJldHVybl9QVFIgKG5hbWVfc3RyaW5nKTsKKwlyZXR1cm5fUFRSKG5hbWVfc3RyaW5nKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2NywxOSArMTUxLDE0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X25hbWVfc2VnbWVudCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmluX2FtbF9hZGRyZXNzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfZXhfbmFtZV9zZWdtZW50KHU4ICoqIGluX2FtbF9hZGRyZXNzLCBjaGFyICpuYW1lX3N0cmluZykKIHsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfYWRkcmVzcyA9ICh2b2lkICopICppbl9hbWxfYWRkcmVzczsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2J1Zls1XTsKKwljaGFyICphbWxfYWRkcmVzcyA9ICh2b2lkICopKmluX2FtbF9hZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiBpbmRleDsKKwljaGFyIGNoYXJfYnVmWzVdOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfbmFtZV9zZWdtZW50Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9uYW1lX3NlZ21lbnQiKTsKIAogCS8qCiAJICogSWYgZmlyc3QgY2hhcmFjdGVyIGlzIGEgZGlnaXQsIHRoZW4gd2Uga25vdyB0aGF0IHdlIGFyZW4ndCBsb29raW5nIGF0IGEKQEAgLTE4OCwyMCArMTY3LDIwIEBACiAJY2hhcl9idWZbMF0gPSAqYW1sX2FkZHJlc3M7CiAKIAlpZiAoJzAnIDw9IGNoYXJfYnVmWzBdICYmIGNoYXJfYnVmWzBdIDw9ICc5JykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgImxlYWRpbmcgZGlnaXQ6ICVjXG4iLCBjaGFyX2J1ZlswXSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0NUUkxfUEVORElORyk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJsZWFkaW5nIGRpZ2l0OiAlY1xuIiwKKwkJCQkgIGNoYXJfYnVmWzBdKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1BFTkRJTkcpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJCeXRlcyBmcm9tIHN0cmVhbTpcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsICJCeXRlcyBmcm9tIHN0cmVhbTpcbiIpKTsKIAogCWZvciAoaW5kZXggPSAwOwotCQkoaW5kZXggPCBBQ1BJX05BTUVfU0laRSkgJiYgKGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyYWN0ZXIgKCphbWxfYWRkcmVzcykpOwotCQlpbmRleCsrKSB7CisJICAgICAoaW5kZXggPCBBQ1BJX05BTUVfU0laRSkKKwkgICAgICYmIChhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcmFjdGVyKCphbWxfYWRkcmVzcykpOyBpbmRleCsrKSB7CiAJCWNoYXJfYnVmW2luZGV4XSA9ICphbWxfYWRkcmVzcysrOwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiJWNcbiIsIGNoYXJfYnVmW2luZGV4XSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsICIlY1xuIiwgY2hhcl9idWZbaW5kZXhdKSk7CiAJfQogCi0KIAkvKiBWYWxpZCBuYW1lIHNlZ21lbnQgICovCiAKIAlpZiAoaW5kZXggPT0gNCkgewpAQCAtMjEwLDQxICsxODksMzcgQEAKIAkJY2hhcl9idWZbNF0gPSAnXDAnOwogCiAJCWlmIChuYW1lX3N0cmluZykgewotCQkJQUNQSV9TVFJDQVQgKG5hbWVfc3RyaW5nLCBjaGFyX2J1Zik7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiQXBwZW5kZWQgdG8gLSAlcyBcbiIsIG5hbWVfc3RyaW5nKSk7CisJCQlBQ1BJX1NUUkNBVChuYW1lX3N0cmluZywgY2hhcl9idWYpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiQXBwZW5kZWQgdG8gLSAlcyBcbiIsIG5hbWVfc3RyaW5nKSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJObyBOYW1lIHN0cmluZyAtICVzIFxuIiwgY2hhcl9idWYpKTsKIAkJfQotCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJObyBOYW1lIHN0cmluZyAtICVzIFxuIiwgY2hhcl9idWYpKTsKLQkJfQotCX0KLQllbHNlIGlmIChpbmRleCA9PSAwKSB7CisJfSBlbHNlIGlmIChpbmRleCA9PSAwKSB7CiAJCS8qCiAJCSAqIEZpcnN0IGNoYXJhY3RlciB3YXMgbm90IGEgdmFsaWQgbmFtZSBjaGFyYWN0ZXIsCiAJCSAqIHNvIHdlIGFyZSBsb29raW5nIGF0IHNvbWV0aGluZyBvdGhlciB0aGFuIGEgbmFtZS4KIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkiTGVhZGluZyBjaGFyYWN0ZXIgaXMgbm90IGFscGhhOiAlMDJYaCAobm90IGEgbmFtZSlcbiIsCi0JCQljaGFyX2J1ZlswXSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiTGVhZGluZyBjaGFyYWN0ZXIgaXMgbm90IGFscGhhOiAlMDJYaCAobm90IGEgbmFtZSlcbiIsCisJCQkJICBjaGFyX2J1ZlswXSkpOwogCQlzdGF0dXMgPSBBRV9DVFJMX1BFTkRJTkc7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFNlZ21lbnQgc3RhcnRlZCB3aXRoIG9uZSBvciBtb3JlIHZhbGlkIGNoYXJhY3RlcnMsIGJ1dCBmZXdlciB0aGFuCiAJCSAqIHRoZSByZXF1aXJlZCA0CiAJCSAqLwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIkJhZCBjaGFyYWN0ZXIgJTAyeCBpbiBuYW1lLCBhdCAlcFxuIiwKLQkJCSphbWxfYWRkcmVzcywgYW1sX2FkZHJlc3MpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJCYWQgY2hhcmFjdGVyICUwMnggaW4gbmFtZSwgYXQgJXBcbiIsCisJCQkJICAqYW1sX2FkZHJlc3MsIGFtbF9hZGRyZXNzKSk7CiAJfQogCiAJKmluX2FtbF9hZGRyZXNzID0gKHU4ICopIGFtbF9hZGRyZXNzOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dldF9uYW1lX3N0cmluZwpAQCAtMjYzLDM3ICsyMzgsMzIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2dldF9uYW1lX3N0cmluZyAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBkYXRhX3R5cGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5fYW1sX2FkZHJlc3MsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dF9uYW1lX3N0cmluZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfbmFtZV9sZW5ndGgpCithY3BpX2V4X2dldF9uYW1lX3N0cmluZyhhY3BpX29iamVjdF90eXBlIGRhdGFfdHlwZSwKKwkJCXU4ICogaW5fYW1sX2FkZHJlc3MsCisJCQljaGFyICoqb3V0X25hbWVfc3RyaW5nLCB1MzIgKiBvdXRfbmFtZV9sZW5ndGgpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfYWRkcmVzcyA9IGluX2FtbF9hZGRyZXNzOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWdtZW50czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jb3VudCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfcHJlZml4ID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTggKmFtbF9hZGRyZXNzID0gaW5fYW1sX2FkZHJlc3M7CisJY2hhciAqbmFtZV9zdHJpbmcgPSBOVUxMOworCXUzMiBudW1fc2VnbWVudHM7CisJdTMyIHByZWZpeF9jb3VudCA9IDA7CisJdTggaGFzX3ByZWZpeCA9IEZBTFNFOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2dldF9uYW1lX3N0cmluZyIsIGFtbF9hZGRyZXNzKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfZ2V0X25hbWVfc3RyaW5nIiwgYW1sX2FkZHJlc3MpOwotCi0KLQlpZiAoQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCA9PSBkYXRhX3R5cGUgIHx8Ci0JCUFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEID09IGRhdGFfdHlwZSAgICB8fAotCQlBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQgPT0gZGF0YV90eXBlKSB7CisJaWYgKEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQgPT0gZGF0YV90eXBlIHx8CisJICAgIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEID09IGRhdGFfdHlwZSB8fAorCSAgICBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQgPT0gZGF0YV90eXBlKSB7CiAJCS8qIERpc2FsbG93IHByZWZpeGVzIGZvciB0eXBlcyBhc3NvY2lhdGVkIHdpdGggZmllbGRfdW5pdCBuYW1lcyAqLwogCi0JCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAoMCwgMSk7CisJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZygwLCAxKTsKIAkJaWYgKCFuYW1lX3N0cmluZykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKIAkJfQotCQllbHNlIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXhfbmFtZV9zZWdtZW50ICgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKLQkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBkYXRhX3R5cGUgaXMgbm90IGEgZmllbGQgbmFtZS4KIAkJICogRXhhbWluZSBmaXJzdCBjaGFyYWN0ZXIgb2YgbmFtZSBmb3Igcm9vdCBvciBwYXJlbnQgcHJlZml4IG9wZXJhdG9ycwpAQCAtMzAxLDggKzI3MSw5IEBACiAJCXN3aXRjaCAoKmFtbF9hZGRyZXNzKSB7CiAJCWNhc2UgQU1MX1JPT1RfUFJFRklYOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAicm9vdF9wcmVmaXgoXFwpIGF0ICVwXG4iLAotCQkJCWFtbF9hZGRyZXNzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsCisJCQkJCSAgInJvb3RfcHJlZml4KFxcKSBhdCAlcFxuIiwKKwkJCQkJICBhbWxfYWRkcmVzcykpOwogCiAJCQkvKgogCQkJICogUmVtZW1iZXIgdGhhdCB3ZSBoYXZlIGEgcm9vdF9wcmVmaXggLS0KQEAgLTMxMywxNCArMjg0LDE0IEBACiAJCQloYXNfcHJlZml4ID0gVFJVRTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfUEFSRU5UX1BSRUZJWDoKIAogCQkJLyogSW5jcmVtZW50IHBhc3QgcG9zc2libHkgbXVsdGlwbGUgcGFyZW50IHByZWZpeGVzICovCiAKIAkJCWRvIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAicGFyZW50X3ByZWZpeCAoXikgYXQgJXBcbiIsCi0JCQkJCWFtbF9hZGRyZXNzKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCQkJICAicGFyZW50X3ByZWZpeCAoXikgYXQgJXBcbiIsCisJCQkJCQkgIGFtbF9hZGRyZXNzKSk7CiAKIAkJCQlhbWxfYWRkcmVzcysrOwogCQkJCXByZWZpeF9jb3VudCsrOwpAQCAtMzMwLDcgKzMwMSw2IEBACiAJCQloYXNfcHJlZml4ID0gVFJVRTsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAogCQkJLyogTm90IGEgcHJlZml4IGNoYXJhY3RlciAqLwpAQCAtMzQzLDExICszMTMsMTMgQEAKIAkJc3dpdGNoICgqYW1sX2FkZHJlc3MpIHsKIAkJY2FzZSBBTUxfRFVBTF9OQU1FX1BSRUZJWDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgImR1YWxfbmFtZV9wcmVmaXggYXQgJXBcbiIsCi0JCQkJYW1sX2FkZHJlc3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCQkJICAiZHVhbF9uYW1lX3ByZWZpeCBhdCAlcFxuIiwKKwkJCQkJICBhbWxfYWRkcmVzcykpOwogCiAJCQlhbWxfYWRkcmVzcysrOwotCQkJbmFtZV9zdHJpbmcgPSBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nIChwcmVmaXhfY291bnQsIDIpOworCQkJbmFtZV9zdHJpbmcgPQorCQkJICAgIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcocHJlZml4X2NvdW50LCAyKTsKIAkJCWlmICghbmFtZV9zdHJpbmcpIHsKIAkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQkJYnJlYWs7CkBAIC0zNTcsMjQgKzMyOSwyOSBAQAogCiAJCQloYXNfcHJlZml4ID0gVFJVRTsKIAotCQkJc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfZXhfbmFtZV9zZWdtZW50ICgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9uYW1lX3NlZ21lbnQoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZyk7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsCisJCQkJCQkJIG5hbWVfc3RyaW5nKTsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJtdWx0aV9uYW1lX3ByZWZpeCBhdCAlcFxuIiwKLQkJCQlhbWxfYWRkcmVzcykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCQkgICJtdWx0aV9uYW1lX3ByZWZpeCBhdCAlcFxuIiwKKwkJCQkJICBhbWxfYWRkcmVzcykpOwogCiAJCQkvKiBGZXRjaCBjb3VudCBvZiBzZWdtZW50cyByZW1haW5pbmcgaW4gbmFtZSBwYXRoICovCiAKIAkJCWFtbF9hZGRyZXNzKys7CiAJCQludW1fc2VnbWVudHMgPSAqYW1sX2FkZHJlc3M7CiAKLQkJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAocHJlZml4X2NvdW50LCBudW1fc2VnbWVudHMpOworCQkJbmFtZV9zdHJpbmcgPQorCQkJICAgIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcocHJlZml4X2NvdW50LAorCQkJCQkJCSBudW1fc2VnbWVudHMpOwogCQkJaWYgKCFuYW1lX3N0cmluZykgewogCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQlicmVhazsKQEAgLTM4NiwyNyArMzYzLDI4IEBACiAJCQloYXNfcHJlZml4ID0gVFJVRTsKIAogCQkJd2hpbGUgKG51bV9zZWdtZW50cyAmJgotCQkJCQkoc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpKSA9PQotCQkJCQkJQUVfT0spIHsKKwkJCSAgICAgICAoc3RhdHVzID0KKwkJCQlhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsCisJCQkJCQkgICAgIG5hbWVfc3RyaW5nKSkgPT0gQUVfT0spIHsKIAkJCQludW1fc2VnbWVudHMtLTsKIAkJCX0KIAogCQkJYnJlYWs7CiAKLQogCQljYXNlIDA6CiAKIAkJCS8qIG51bGxfbmFtZSB2YWxpZCBhcyBvZiA4LTEyLTk4IEFTTC9BTUwgR3JhbW1hciBVcGRhdGUgKi8KIAogCQkJaWYgKHByZWZpeF9jb3VudCA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJCQkibmFtZV9zZWcgaXMgXCJcXFwiIGZvbGxvd2VkIGJ5IE5VTExcbiIpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICJuYW1lX3NlZyBpcyBcIlxcXCIgZm9sbG93ZWQgYnkgTlVMTFxuIikpOwogCQkJfQogCiAJCQkvKiBDb25zdW1lIHRoZSBOVUxMIGJ5dGUgKi8KIAogCQkJYW1sX2FkZHJlc3MrKzsKLQkJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAocHJlZml4X2NvdW50LCAwKTsKKwkJCW5hbWVfc3RyaW5nID0KKwkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMCk7CiAJCQlpZiAoIW5hbWVfc3RyaW5nKSB7CiAJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCWJyZWFrOwpAQCAtNDE0LDE4ICszOTIsMTkgQEAKIAogCQkJYnJlYWs7CiAKLQogCQlkZWZhdWx0OgogCiAJCQkvKiBOYW1lIHNlZ21lbnQgc3RyaW5nICovCiAKLQkJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyAocHJlZml4X2NvdW50LCAxKTsKKwkJCW5hbWVfc3RyaW5nID0KKwkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMSk7CiAJCQlpZiAoIW5hbWVfc3RyaW5nKSB7CiAJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X25hbWVfc2VnbWVudCAoJmFtbF9hZGRyZXNzLCBuYW1lX3N0cmluZyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfbmFtZV9zZWdtZW50KCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC00MzMsMTUgKzQxMiwyMCBAQAogCWlmIChBRV9DVFJMX1BFTkRJTkcgPT0gc3RhdHVzICYmIGhhc19wcmVmaXgpIHsKIAkJLyogUmFuIG91dCBvZiBzZWdtZW50cyBhZnRlciBwcm9jZXNzaW5nIGEgcHJlZml4ICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKAotCQkJKCJleF9kb19uYW1lOiBNYWxmb3JtZWQgTmFtZSBhdCAlcFxuIiwgbmFtZV9zdHJpbmcpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJleF9kb19uYW1lOiBNYWxmb3JtZWQgTmFtZSBhdCAlcFxuIiwKKwkJCQkgICBuYW1lX3N0cmluZykpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7CiAJfQogCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChuYW1lX3N0cmluZykgeworCQkJQUNQSV9NRU1fRlJFRShuYW1lX3N0cmluZyk7CisJCX0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCiAJKm91dF9uYW1lX3N0cmluZyA9IG5hbWVfc3RyaW5nOwogCSpvdXRfbmFtZV9sZW5ndGggPSAodTMyKSAoYW1sX2FkZHJlc3MgLSBpbl9hbWxfYWRkcmVzcyk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwppbmRleCBkYmRmODI2Li45N2UzNDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwpAQCAtNDIsNyArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CkBAIC01MCwxMCArNDksOCBAQAogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhvcGFyZzEiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnMSIpCiAKIC8qIQogICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCkBAIC03Niw3ICs3Myw2IEBACiAgKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKICAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgogISovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzBBXzBUXzFSCkBAIC04OCw1OSArODQsNTMgQEAKICAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wZXJhdG9yIHdpdGggbm8gb3BlcmFuZHMsIG9uZSByZXR1cm4gdmFsdWUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8wQV8wVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMEFfMFRfMVIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzBBXzBUXzFSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfVElNRVJfT1A6ICAgICAgLyogIFRpbWVyICgpICovCisJY2FzZSBBTUxfVElNRVJfT1A6CS8qICBUaW1lciAoKSAqLwogCiAJCS8qIENyZWF0ZSBhIHJldHVybiBvYmplY3Qgb2YgdHlwZSBJbnRlZ2VyICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQotCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IGFjcGlfb3NfZ2V0X3RpbWVyICgpOworI2lmIEFDUElfTUFDSElORV9XSURUSCAhPSAxNgorCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IGFjcGlfb3NfZ2V0X3RpbWVyKCk7CisjZW5kaWYKIAkJYnJlYWs7CiAKLQlkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiAgVW5rbm93biBvcGNvZGUgICovCisJZGVmYXVsdDoJCS8qICBVbmtub3duIG9wY29kZSAgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8wQV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8wQV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJYnJlYWs7CiAJfQogCi1jbGVhbnVwOgotCi0JaWYgKCF3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKLQl9CisgICAgICBjbGVhbnVwOgogCiAJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgfHwgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCX0gZWxzZSB7CisJCS8qIFNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLworCisJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMUFfMFRfMFIKQEAgLTE1NCw2OSArMTQ0LDU4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMUFfMFRfMFIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8wVF8wUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMUFfMFRfMFIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9SRUxFQVNFX09QOiAgICAvKiAgUmVsZWFzZSAobXV0ZXhfb2JqZWN0KSAqLworCWNhc2UgQU1MX1JFTEVBU0VfT1A6CS8qICBSZWxlYXNlIChtdXRleF9vYmplY3QpICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4IChvcGVyYW5kWzBdLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4KG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAorCWNhc2UgQU1MX1JFU0VUX09QOgkvKiAgUmVzZXQgKGV2ZW50X29iamVjdCkgKi8KIAotCWNhc2UgQU1MX1JFU0VUX09QOiAgICAgIC8qICBSZXNldCAoZXZlbnRfb2JqZWN0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50IChvcGVyYW5kWzBdKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fcmVzZXRfZXZlbnQob3BlcmFuZFswXSk7CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfU0lHTkFMX09QOgkvKiAgU2lnbmFsIChldmVudF9vYmplY3QpICovCiAKLQljYXNlIEFNTF9TSUdOQUxfT1A6ICAgICAvKiAgU2lnbmFsIChldmVudF9vYmplY3QpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fc2lnbmFsX2V2ZW50IChvcGVyYW5kWzBdKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fc2lnbmFsX2V2ZW50KG9wZXJhbmRbMF0pOwogCQlicmVhazsKIAorCWNhc2UgQU1MX1NMRUVQX09QOgkvKiAgU2xlZXAgKG1zZWNfdGltZSkgKi8KIAotCWNhc2UgQU1MX1NMRUVQX09QOiAgICAgIC8qICBTbGVlcCAobXNlY190aW1lKSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQgKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUpOworCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9kb19zdXNwZW5kKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUpOwogCQlicmVhazsKIAorCWNhc2UgQU1MX1NUQUxMX09QOgkvKiAgU3RhbGwgKHVzZWNfdGltZSkgKi8KIAotCWNhc2UgQU1MX1NUQUxMX09QOiAgICAgIC8qICBTdGFsbCAodXNlY190aW1lKSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX2RvX3N0YWxsICgodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N0YWxsKCh1MzIpIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUpOwogCQlicmVhazsKIAorCWNhc2UgQU1MX1VOTE9BRF9PUDoJLyogIFVubG9hZCAoSGFuZGxlKSAqLwogCi0JY2FzZSBBTUxfVU5MT0FEX09QOiAgICAgLyogIFVubG9hZCAoSGFuZGxlKSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfdW5sb2FkX3RhYmxlIChvcGVyYW5kWzBdKTsKKwkJc3RhdHVzID0gYWNwaV9leF91bmxvYWRfdGFibGUob3BlcmFuZFswXSk7CiAJCWJyZWFrOwogCisJZGVmYXVsdDoJCS8qICBVbmtub3duIG9wY29kZSAgKi8KIAotCWRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qICBVbmtub3duIG9wY29kZSAgKi8KLQotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8xQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8xQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSCkBAIC0yMzAsNDEgKzIwOSwzNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8xVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMFIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzFBXzFUXzBSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CiAJY2FzZSBBTUxfTE9BRF9PUDoKIAotCQlzdGF0dXMgPSBhY3BpX2V4X2xvYWRfb3AgKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2V4X2xvYWRfb3Aob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmtub3duIG9wY29kZSAqLworCWRlZmF1bHQ6CQkvKiBVbmtub3duIG9wY29kZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCXdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCisgICAgICBjbGVhbnVwOgogCi1jbGVhbnVwOgotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzFSCkBAIC0yNzgsMjMgKzI1MCwxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8xVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MyID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAzMjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBwb3dlcl9vZl90ZW47Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBkaWdpdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MyID0gTlVMTDsKKwl1MzIgdGVtcDMyOworCXUzMiBpOworCWFjcGlfaW50ZWdlciBwb3dlcl9vZl90ZW47CisJYWNwaV9pbnRlZ2VyIGRpZ2l0OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8xVF8xUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMUFfMVRfMVIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwogCkBAIC0zMDgsMjAgKzI3NiwxOSBAQAogCiAJCS8qIENyZWF0ZSBhIHJldHVybiBvYmplY3Qgb2YgdHlwZSBJbnRlZ2VyIGZvciB0aGVzZSBvcGNvZGVzICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAogCQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCQljYXNlIEFNTF9CSVRfTk9UX09QOiAgICAgICAgICAgIC8qIE5vdCAoT3BlcmFuZCwgUmVzdWx0KSAgKi8KKwkJY2FzZSBBTUxfQklUX05PVF9PUDoJLyogTm90IChPcGVyYW5kLCBSZXN1bHQpICAqLwogCiAJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IH5vcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwogCQkJYnJlYWs7CiAKLQotCQljYXNlIEFNTF9GSU5EX1NFVF9MRUZUX0JJVF9PUDogIC8qIGZpbmRfc2V0X2xlZnRfYml0IChPcGVyYW5kLCBSZXN1bHQpICovCisJCWNhc2UgQU1MX0ZJTkRfU0VUX0xFRlRfQklUX09QOgkvKiBmaW5kX3NldF9sZWZ0X2JpdCAoT3BlcmFuZCwgUmVzdWx0KSAqLwogCiAJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWU7CiAKQEAgLTMzMCwxNSArMjk3LDE0IEBACiAJCQkgKiBlbmRpYW4gdW5zaWduZWQgdmFsdWUsIHNvIHRoaXMgYm91bmRhcnkgY29uZGl0aW9uIGlzIHZhbGlkLgogCQkJICovCiAJCQlmb3IgKHRlbXAzMiA9IDA7IHJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlICYmCi0JCQkJCSAgIHRlbXAzMiA8IEFDUElfSU5URUdFUl9CSVRfU0laRTsgKyt0ZW1wMzIpIHsKKwkJCSAgICAgdGVtcDMyIDwgQUNQSV9JTlRFR0VSX0JJVF9TSVpFOyArK3RlbXAzMikgewogCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID4+PSAxOwogCQkJfQogCiAJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHRlbXAzMjsKIAkJCWJyZWFrOwogCi0KLQkJY2FzZSBBTUxfRklORF9TRVRfUklHSFRfQklUX09QOiAvKiBmaW5kX3NldF9yaWdodF9iaXQgKE9wZXJhbmQsIFJlc3VsdCkgKi8KKwkJY2FzZSBBTUxfRklORF9TRVRfUklHSFRfQklUX09QOgkvKiBmaW5kX3NldF9yaWdodF9iaXQgKE9wZXJhbmQsIFJlc3VsdCkgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwogCkBAIC0zNDcsMTggKzMxMywxNyBAQAogCQkJICogZW5kaWFuIHVuc2lnbmVkIHZhbHVlLCBzbyB0aGlzIGJvdW5kYXJ5IGNvbmRpdGlvbiBpcyB2YWxpZC4KIAkJCSAqLwogCQkJZm9yICh0ZW1wMzIgPSAwOyByZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSAmJgotCQkJCQkgICB0ZW1wMzIgPCBBQ1BJX0lOVEVHRVJfQklUX1NJWkU7ICsrdGVtcDMyKSB7CisJCQkgICAgIHRlbXAzMiA8IEFDUElfSU5URUdFUl9CSVRfU0laRTsgKyt0ZW1wMzIpIHsKIAkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA8PD0gMTsKIAkJCX0KIAogCQkJLyogU2luY2UgdGhlIGJpdCBwb3NpdGlvbiBpcyBvbmUtYmFzZWQsIHN1YnRyYWN0IGZyb20gMzMgKDY1KSAqLwogCiAJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHRlbXAzMiA9PSAwID8gMCA6Ci0JCQkJCSAgKEFDUElfSU5URUdFUl9CSVRfU0laRSArIDEpIC0gdGVtcDMyOworCQkJICAgIChBQ1BJX0lOVEVHRVJfQklUX1NJWkUgKyAxKSAtIHRlbXAzMjsKIAkJCWJyZWFrOwogCi0KLQkJY2FzZSBBTUxfRlJPTV9CQ0RfT1A6ICAgICAgICAgICAvKiBmcm9tX2JjZCAoQkNEVmFsdWUsIFJlc3VsdCkgKi8KKwkJY2FzZSBBTUxfRlJPTV9CQ0RfT1A6CS8qIGZyb21fYmNkIChCQ0RWYWx1ZSwgUmVzdWx0KSAqLwogCiAJCQkvKgogCQkJICogVGhlIDY0LWJpdCBBQ1BJIGludGVnZXIgY2FuIGhvbGQgMTYgNC1iaXQgQkNEIGNoYXJhY3RlcnMKQEAgLTM3MSw3ICszMzYsOSBAQAogCiAJCQkvKiBDb252ZXJ0IGVhY2ggQkNEIGRpZ2l0IChlYWNoIGlzIG9uZSBueWJibGUgd2lkZSkgKi8KIAotCQkJZm9yIChpID0gMDsgKGkgPCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCkgJiYgKGRpZ2l0ID4gMCk7IGkrKykgeworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgKGkgPCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCkgJiYgKGRpZ2l0ID4gMCk7CisJCQkgICAgIGkrKykgewogCQkJCS8qIEdldCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNC1iaXQgQkNEIGRpZ2l0ICovCiAKIAkJCQl0ZW1wMzIgPSAoKHUzMikgZGlnaXQpICYgMHhGOwpAQCAtMzc5LDkgKzM0Niw5IEBACiAJCQkJLyogQ2hlY2sgdGhlIHJhbmdlIG9mIHRoZSBkaWdpdCAqLwogCiAJCQkJaWYgKHRlbXAzMiA+IDkpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiQkNEIGRpZ2l0IHRvbyBsYXJnZSAobm90IGRlY2ltYWwpOiAweCVYXG4iLAotCQkJCQkJdGVtcDMyKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJICAiQkNEIGRpZ2l0IHRvbyBsYXJnZSAobm90IGRlY2ltYWwpOiAweCVYXG4iLAorCQkJCQkJCSAgdGVtcDMyKSk7CiAKIAkJCQkJc3RhdHVzID0gQUVfQU1MX05VTUVSSUNfT1ZFUkZMT1c7CiAJCQkJCWdvdG8gY2xlYW51cDsKQEAgLTM4OSw4ICszNTYsOCBAQAogCiAJCQkJLyogU3VtIHRoZSBkaWdpdCBpbnRvIHRoZSByZXN1bHQgd2l0aCB0aGUgY3VycmVudCBwb3dlciBvZiAxMCAqLwogCi0JCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgKz0gKCgoYWNwaV9pbnRlZ2VyKSB0ZW1wMzIpICoKLQkJCQkJCSBwb3dlcl9vZl90ZW4pOworCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlICs9CisJCQkJICAgICgoKGFjcGlfaW50ZWdlcikgdGVtcDMyKSAqIHBvd2VyX29mX3Rlbik7CiAKIAkJCQkvKiBTaGlmdCB0byBuZXh0IEJDRCBkaWdpdCAqLwogCkBAIC00MDIsNDUgKzM2OSw1MCBAQAogCQkJfQogCQkJYnJlYWs7CiAKLQotCQljYXNlIEFNTF9UT19CQ0RfT1A6ICAgICAgICAgICAgIC8qIHRvX2JjZCAoT3BlcmFuZCwgUmVzdWx0KSAqLworCQljYXNlIEFNTF9UT19CQ0RfT1A6CS8qIHRvX2JjZCAoT3BlcmFuZCwgUmVzdWx0KSAqLwogCiAJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IDA7CiAJCQlkaWdpdCA9IG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWU7CiAKIAkJCS8qIEVhY2ggQkNEIGRpZ2l0IGlzIG9uZSBueWJibGUgd2lkZSAqLwogCi0JCQlmb3IgKGkgPSAwOyAoaSA8IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoKSAmJiAoZGlnaXQgPiAwKTsgaSsrKSB7Ci0JCQkJKHZvaWQpIGFjcGlfdXRfc2hvcnRfZGl2aWRlIChkaWdpdCwgMTAsICZkaWdpdCwgJnRlbXAzMik7CisJCQlmb3IgKGkgPSAwOworCQkJICAgICAoaSA8IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoKSAmJiAoZGlnaXQgPiAwKTsKKwkJCSAgICAgaSsrKSB7CisJCQkJKHZvaWQpYWNwaV91dF9zaG9ydF9kaXZpZGUoZGlnaXQsIDEwLCAmZGlnaXQsCisJCQkJCQkJICAgJnRlbXAzMik7CiAKIAkJCQkvKgogCQkJCSAqIEluc2VydCB0aGUgQkNEIGRpZ2l0IHRoYXQgcmVzaWRlcyBpbiB0aGUKIAkJCQkgKiByZW1haW5kZXIgZnJvbSBhYm92ZQogCQkJCSAqLwotCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlIHw9ICgoKGFjcGlfaW50ZWdlcikgdGVtcDMyKSA8PAotCQkJCQkJICAgQUNQSV9NVUxfNCAoaSkpOworCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlIHw9CisJCQkJICAgICgoKGFjcGlfaW50ZWdlcikgdGVtcDMyKSA8PCBBQ1BJX01VTF80KGkpKTsKIAkJCX0KIAogCQkJLyogT3ZlcmZsb3cgaWYgdGhlcmUgaXMgYW55IGRhdGEgbGVmdCBpbiBEaWdpdCAqLwogCiAJCQlpZiAoZGlnaXQgPiAwKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJJbnRlZ2VyIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEJDRDogJTguOFglOC44WFxuIiwKLQkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJJbnRlZ2VyIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEJDRDogJTguOFglOC44WFxuIiwKKwkJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG9wZXJhbmQKKwkJCQkJCQkJICAgICBbMF0tPgorCQkJCQkJCQkgICAgIGludGVnZXIuCisJCQkJCQkJCSAgICAgdmFsdWUpKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX05VTUVSSUNfT1ZFUkZMT1c7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQogCQkJYnJlYWs7CiAKLQotCQljYXNlIEFNTF9DT05EX1JFRl9PRl9PUDogICAgICAgIC8qIGNvbmRfcmVmX29mIChzb3VyY2Vfb2JqZWN0LCBSZXN1bHQpICovCisJCWNhc2UgQU1MX0NPTkRfUkVGX09GX09QOgkvKiBjb25kX3JlZl9vZiAoc291cmNlX29iamVjdCwgUmVzdWx0KSAqLwogCiAJCQkvKgogCQkJICogVGhpcyBvcCBpcyBhIGxpdHRsZSBzdHJhbmdlIGJlY2F1c2UgdGhlIGludGVybmFsIHJldHVybiB2YWx1ZSBpcwogCQkJICogZGlmZmVyZW50IHRoYW4gdGhlIHJldHVybiB2YWx1ZSBzdG9yZWQgaW4gdGhlIHJlc3VsdCBkZXNjcmlwdG9yCiAJCQkgKiAoVGhlcmUgYXJlIHJlYWxseSB0d28gcmV0dXJuIHZhbHVlcykKIAkJCSAqLwotCQkJaWYgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdID09IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkgeworCQkJaWYgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wZXJhbmRbMF0gPT0KKwkJCSAgICBhY3BpX2dibF9yb290X25vZGUpIHsKIAkJCQkvKgogCQkJCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBuYW1lc3BhY2UsCiAJCQkJICogcmV0dXJuIEZBTFNFCkBAIC00NTEsMzggKzQyMywzOCBAQAogCiAJCQkvKiBHZXQgdGhlIG9iamVjdCByZWZlcmVuY2UsIHN0b3JlIGl0LCBhbmQgcmVtb3ZlIG91ciByZWZlcmVuY2UgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9leF9nZXRfb2JqZWN0X3JlZmVyZW5jZSAob3BlcmFuZFswXSwKLQkJCQkJICZyZXR1cm5fZGVzYzIsIHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYWNwaV9leF9nZXRfb2JqZWN0X3JlZmVyZW5jZShvcGVyYW5kWzBdLAorCQkJCQkJCSAgICAgICZyZXR1cm5fZGVzYzIsCisJCQkJCQkJICAgICAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKHJldHVybl9kZXNjMiwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjMik7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MyLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYzIpOwogCiAJCQkvKiBUaGUgb2JqZWN0IGV4aXN0cyBpbiB0aGUgbmFtZXNwYWNlLCByZXR1cm4gVFJVRSAqLwogCiAJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfSU5URUdFUl9NQVg7CiAJCQlnb3RvIGNsZWFudXA7CiAKLQogCQlkZWZhdWx0OgogCQkJLyogTm8gb3RoZXIgb3Bjb2RlcyBnZXQgaGVyZSAqLwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQotCWNhc2UgQU1MX1NUT1JFX09QOiAgICAgICAgICAgICAgLyogU3RvcmUgKFNvdXJjZSwgVGFyZ2V0KSAqLworCWNhc2UgQU1MX1NUT1JFX09QOgkvKiBTdG9yZSAoU291cmNlLCBUYXJnZXQpICovCiAKIAkJLyoKIAkJICogQSBzdG9yZSBvcGVyYW5kIGlzIHR5cGljYWxseSBhIG51bWJlciwgc3RyaW5nLCBidWZmZXIgb3IgbHZhbHVlCiAJCSAqIEJlIGNhcmVmdWwgYWJvdXQgZGVsZXRpbmcgdGhlIHNvdXJjZSBvYmplY3QsCiAJCSAqIHNpbmNlIHRoZSBvYmplY3QgaXRzZWxmIG1heSBoYXZlIGJlZW4gc3RvcmVkLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFN0b3JlIGFscmVhZHkgcHJvZHVjZWQgYSByZXR1cm4gb2JqZWN0ICovCkBAIC00OTUsOTIgKzQ2Nyw4NCBAQAogCQkJICogY2FuY2VsIG91dCwgYW5kIHdlIHNpbXBseSBkb24ndCBkbyBhbnl0aGluZy4KIAkJCSAqLwogCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IG9wZXJhbmRbMF07Ci0JCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7IC8qIFByZXZlbnQgZGVsZXRpb24gKi8KKwkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsJLyogUHJldmVudCBkZWxldGlvbiAqLwogCQl9Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAKKwkJLyoKKwkJICogQUNQSSAyLjAgT3Bjb2RlcworCQkgKi8KKwljYXNlIEFNTF9DT1BZX09QOgkvKiBDb3B5IChTb3VyY2UsIFRhcmdldCkgKi8KIAotCS8qCi0JICogQUNQSSAyLjAgT3Bjb2RlcwotCSAqLwotCWNhc2UgQU1MX0NPUFlfT1A6ICAgICAgICAgICAgICAgLyogQ29weSAoU291cmNlLCBUYXJnZXQpICovCi0KLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCSB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3Qob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJICAgIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAorCWNhc2UgQU1MX1RPX0RFQ1NUUklOR19PUDoJLyogdG9fZGVjaW1hbF9zdHJpbmcgKERhdGEsIFJlc3VsdCkgKi8KIAotCWNhc2UgQU1MX1RPX0RFQ1NUUklOR19PUDogICAgICAgLyogdG9fZGVjaW1hbF9zdHJpbmcgKERhdGEsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nIChvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsCi0JCQkJIEFDUElfRVhQTElDSVRfQ09OVkVSVF9ERUNJTUFMKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsCisJCQkJCQkgICBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTCk7CiAJCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7CiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9UT19IRVhTVFJJTkdfT1A6CS8qIHRvX2hleF9zdHJpbmcgKERhdGEsIFJlc3VsdCkgKi8KIAotCWNhc2UgQU1MX1RPX0hFWFNUUklOR19PUDogICAgICAgLyogdG9faGV4X3N0cmluZyAoRGF0YSwgUmVzdWx0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcgKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKLQkJCQkgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJICAgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWCk7CiAJCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7CiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9UT19CVUZGRVJfT1A6CS8qIHRvX2J1ZmZlciAoRGF0YSwgUmVzdWx0KSAqLwogCi0JY2FzZSBBTUxfVE9fQlVGRkVSX09QOiAgICAgICAgICAvKiB0b19idWZmZXIgKERhdGEsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyIChvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYyk7CiAJCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7CiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9UT19JTlRFR0VSX09QOgkvKiB0b19pbnRlZ2VyIChEYXRhLCBSZXN1bHQpICovCiAKLQljYXNlIEFNTF9UT19JTlRFR0VSX09QOiAgICAgICAgIC8qIHRvX2ludGVnZXIgKERhdGEsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlciAob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCSBBQ1BJX0FOWV9CQVNFKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJICAgIEFDUElfQU5ZX0JBU0UpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewogCQkJLyogTm8gY29udmVyc2lvbiBwZXJmb3JtZWQsIGFkZCByZWYgdG8gaGFuZGxlIHJldHVybiB2YWx1ZSAqLwotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCi0KLQljYXNlIEFNTF9TSElGVF9MRUZUX0JJVF9PUDogICAgIC8qIHNoaWZ0X2xlZnRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCi0JY2FzZSBBTUxfU0hJRlRfUklHSFRfQklUX09QOiAgICAvKiBzaGlmdF9yaWdodF9iaXQgKFNvdXJjZSwgYml0X251bSkgKi8KKwljYXNlIEFNTF9TSElGVF9MRUZUX0JJVF9PUDoJLyogc2hpZnRfbGVmdF9iaXQgKFNvdXJjZSwgYml0X251bSkgKi8KKwljYXNlIEFNTF9TSElGVF9SSUdIVF9CSVRfT1A6CS8qIHNoaWZ0X3JpZ2h0X2JpdCAoU291cmNlLCBiaXRfbnVtKSAqLwogCiAJCS8qIFRoZXNlIGFyZSB0d28gb2Jzb2xldGUgb3Bjb2RlcyAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIiVzIGlzIG9ic29sZXRlIGFuZCBub3QgaW1wbGVtZW50ZWRcbiIsCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVzIGlzIG9ic29sZXRlIGFuZCBub3QgaW1wbGVtZW50ZWRcbiIsCisJCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKSk7CiAJCXN0YXR1cyA9IEFFX1NVUFBPUlQ7CiAJCWdvdG8gY2xlYW51cDsKIAorCWRlZmF1bHQ6CQkvKiBVbmtub3duIG9wY29kZSAqLwogCi0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmtub3duIG9wY29kZSAqLwotCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzFBXzFUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCXdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzFBXzFUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkvKiBTdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGNvbXB1dGVkIGFib3ZlIGludG8gdGhlIHRhcmdldCBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYywgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOwogCX0KIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCWlmICghd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CkBAIC01ODgsMTQgKzU1MiwxMyBAQAogCiAJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSCkBAIC02MDgsMjggKzU3MSwyNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGVtcF9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRlbXBfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHR5cGU7CisJYWNwaV9pbnRlZ2VyIHZhbHVlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8wVF8xUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMUFfMFRfMVIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9MTk9UX09QOiAgICAgICAgICAgICAgIC8qIExOb3QgKE9wZXJhbmQpICovCisJY2FzZSBBTUxfTE5PVF9PUDoJLyogTE5vdCAoT3BlcmFuZCkgKi8KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTY0NCwxNSArNjAzLDE0IEBACiAJCX0KIAkJYnJlYWs7CiAKLQotCWNhc2UgQU1MX0RFQ1JFTUVOVF9PUDogICAgICAgICAgLyogRGVjcmVtZW50IChPcGVyYW5kKSAgKi8KLQljYXNlIEFNTF9JTkNSRU1FTlRfT1A6ICAgICAgICAgIC8qIEluY3JlbWVudCAoT3BlcmFuZCkgICovCisJY2FzZSBBTUxfREVDUkVNRU5UX09QOgkvKiBEZWNyZW1lbnQgKE9wZXJhbmQpICAqLworCWNhc2UgQU1MX0lOQ1JFTUVOVF9PUDoJLyogSW5jcmVtZW50IChPcGVyYW5kKSAgKi8KIAogCQkvKgogCQkgKiBDcmVhdGUgYSBuZXcgaW50ZWdlci4gIENhbid0IGp1c3QgZ2V0IHRoZSBiYXNlIGludGVnZXIgYW5kCiAJCSAqIGluY3JlbWVudCBpdCBiZWNhdXNlIGl0IG1heSBiZSBhbiBBcmcgb3IgRmllbGQuCiAJCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTY2MywxMCArNjIxLDExIEBACiAJCSAqIE5TIE5vZGUgb3IgYW4gaW50ZXJuYWwgb2JqZWN0LgogCQkgKi8KIAkJdGVtcF9kZXNjID0gb3BlcmFuZFswXTsKLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAodGVtcF9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUodGVtcF9kZXNjKSA9PQorCQkgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewogCQkJLyogSW50ZXJuYWwgcmVmZXJlbmNlIG9iamVjdCAtIHByZXZlbnQgZGVsZXRpb24gKi8KIAotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlICh0ZW1wX2Rlc2MpOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHRlbXBfZGVzYyk7CiAJCX0KIAogCQkvKgpAQCAtNjc2LDExICs2MzUsMTUgQEAKIAkJICogTk9URTogIFdlIHVzZSBMTk9UX09QIGhlcmUgaW4gb3JkZXIgdG8gZm9yY2UgcmVzb2x1dGlvbiBvZiB0aGUKIAkJICogcmVmZXJlbmNlIG9wZXJhbmQgdG8gYW4gYWN0dWFsIGludGVnZXIuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKEFNTF9MTk9UX09QLCAmdGVtcF9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlczogYmFkIG9wZXJhbmQocykgJXNcbiIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSksCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhBTUxfTE5PVF9PUCwgJnRlbXBfZGVzYywKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICIlczogYmFkIG9wZXJhbmQocykgJXNcbiIsCisJCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+CisJCQkJCQkJCSAgb3Bjb2RlKSwKKwkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTY5MCwyNSArNjUzLDI1IEBACiAJCSAqIFBlcmZvcm0gdGhlIGFjdHVhbCBpbmNyZW1lbnQgb3IgZGVjcmVtZW50CiAJCSAqLwogCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9JTkNSRU1FTlRfT1ApIHsKLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdGVtcF9kZXNjLT5pbnRlZ2VyLnZhbHVlICsxOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB0ZW1wX2Rlc2MtPmludGVnZXIudmFsdWUgLTE7CisJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9CisJCQkgICAgdGVtcF9kZXNjLT5pbnRlZ2VyLnZhbHVlICsgMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KKwkJCSAgICB0ZW1wX2Rlc2MtPmludGVnZXIudmFsdWUgLSAxOwogCQl9CiAKIAkJLyogRmluaXNoZWQgd2l0aCB0aGlzIEludGVnZXIgb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICh0ZW1wX2Rlc2MpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodGVtcF9kZXNjKTsKIAogCQkvKgogCQkgKiBTdG9yZSB0aGUgcmVzdWx0IGJhY2sgKGluZGlyZWN0bHkpIHRocm91Z2ggdGhlIG9yaWdpbmFsCiAJCSAqIFJlZmVyZW5jZSBvYmplY3QKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKHJldHVybl9kZXNjLCBvcGVyYW5kWzBdLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYywgb3BlcmFuZFswXSwgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0KLQljYXNlIEFNTF9UWVBFX09QOiAgICAgICAgICAgICAgIC8qIG9iamVjdF90eXBlIChzb3VyY2Vfb2JqZWN0KSAqLworCWNhc2UgQU1MX1RZUEVfT1A6CS8qIG9iamVjdF90eXBlIChzb3VyY2Vfb2JqZWN0KSAqLwogCiAJCS8qCiAJCSAqIE5vdGU6IFRoZSBvcGVyYW5kIGlzIG5vdCByZXNvbHZlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2Ugd2Ugd2FudCB0bwpAQCAtNzE5LDEzICs2ODIsMTUgQEAKIAogCQkvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIGJhc2Ugb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICh3YWxrX3N0YXRlLCBvcGVyYW5kWzBdLCAmdHlwZSwgTlVMTCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSh3YWxrX3N0YXRlLCBvcGVyYW5kWzBdLCAmdHlwZSwKKwkJCQkJICAgICBOVUxMKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAkJLyogQWxsb2NhdGUgYSBkZXNjcmlwdG9yIHRvIGhvbGQgdGhlIHR5cGUuICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC03MzQsOCArNjk5LDcgQEAKIAkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB0eXBlOwogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfU0laRV9PRl9PUDogICAgICAgICAgICAvKiBzaXplX29mIChzb3VyY2Vfb2JqZWN0KSAqLworCWNhc2UgQU1MX1NJWkVfT0ZfT1A6CS8qIHNpemVfb2YgKHNvdXJjZV9vYmplY3QpICovCiAKIAkJLyoKIAkJICogTm90ZTogVGhlIG9wZXJhbmQgaXMgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSB3YW50IHRvCkBAIC03NDQsOSArNzA4LDEwIEBACiAKIAkJLyogR2V0IHRoZSBiYXNlIG9iamVjdCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAod2Fsa19zdGF0ZSwKLQkJCQkgb3BlcmFuZFswXSwgJnR5cGUsICZ0ZW1wX2Rlc2MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSh3YWxrX3N0YXRlLAorCQkJCQkJICBvcGVyYW5kWzBdLCAmdHlwZSwKKwkJCQkJCSAgJnRlbXBfZGVzYyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKQEAgLTc3Nyw5ICs3NDIsOSBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJzaXplX29mIC0gT3BlcmFuZCBpcyBub3QgQnVmL0ludC9TdHIvUGtnIC0gZm91bmQgdHlwZSAlc1xuIiwKLQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJzaXplX29mIC0gT3BlcmFuZCBpcyBub3QgQnVmL0ludC9TdHIvUGtnIC0gZm91bmQgdHlwZSAlc1xuIiwKKwkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTc4OCw3ICs3NTMsNyBAQAogCQkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBzaXplIG9mIHRoZSBvYmplY3QsIGNyZWF0ZSBhIHJlc3VsdAogCQkgKiBvYmplY3QgdG8gaG9sZCB0aGUgdmFsdWUKIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwpAQCAtNzk3LDIyICs3NjIsMjMgQEAKIAkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB2YWx1ZTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9SRUZfT0ZfT1A6CS8qIHJlZl9vZiAoc291cmNlX29iamVjdCkgKi8KIAotCWNhc2UgQU1MX1JFRl9PRl9PUDogICAgICAgICAgICAgLyogcmVmX29mIChzb3VyY2Vfb2JqZWN0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2Uob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfREVSRUZfT0ZfT1A6ICAgICAgICAgICAvKiBkZXJlZl9vZiAob2JqX3JlZmVyZW5jZSB8IFN0cmluZykgKi8KKwljYXNlIEFNTF9ERVJFRl9PRl9PUDoJLyogZGVyZWZfb2YgKG9ial9yZWZlcmVuY2UgfCBTdHJpbmcpICovCiAKIAkJLyogQ2hlY2sgZm9yIGEgbWV0aG9kIGxvY2FsIG9yIGFyZ3VtZW50LCBvciBzdGFuZGFsb25lIFN0cmluZyAqLwogCi0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9wZXJhbmRbMF0pICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvcGVyYW5kWzBdKSkgeworCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9wZXJhbmRbMF0pICE9CisJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kWzBdKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCQkJCS8qCiAJCQkJICogVGhpcyBpcyBhIGRlcmVmX29mIChsb2NhbF94IHwgYXJnX3gpCkBAIC04MjUsMTEgKzc5MSwxMiBAQAogCiAJCQkJCS8qIFNldCBPcGVyYW5kWzBdIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwvYXJnICovCiAKLQkJCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKAotCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0LAotCQkJCQkJCSB3YWxrX3N0YXRlLCAmdGVtcF9kZXNjKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUKKwkJCQkJICAgIChvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlLAorCQkJCQkgICAgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCSAgICAgd2Fsa19zdGF0ZSwgJnRlbXBfZGVzYyk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQkJZ290byBjbGVhbnVwOwogCQkJCQl9CiAKQEAgLTgzNyw3ICs4MDQsNyBAQAogCQkJCQkgKiBEZWxldGUgb3VyIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgb2JqZWN0IGFuZAogCQkJCQkgKiBwb2ludCB0byB0aGUgb2JqZWN0IGp1c3QgcmV0cmlldmVkCiAJCQkJCSAqLwotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9wZXJhbmRbMF0pOworCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFswXSk7CiAJCQkJCW9wZXJhbmRbMF0gPSB0ZW1wX2Rlc2M7CiAJCQkJCWJyZWFrOwogCkBAIC04NDUsOCArODEyLDkgQEAKIAogCQkJCQkvKiBHZXQgdGhlIG9iamVjdCB0byB3aGljaCB0aGUgcmVmZXJlbmNlIHJlZmVycyAqLwogCi0JCQkJCXRlbXBfZGVzYyA9IG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7Ci0JCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob3BlcmFuZFswXSk7CisJCQkJCXRlbXBfZGVzYyA9CisJCQkJCSAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2JqZWN0OworCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFswXSk7CiAJCQkJCW9wZXJhbmRbMF0gPSB0ZW1wX2Rlc2M7CiAJCQkJCWJyZWFrOwogCkBAIC04NTcsNyArODI1LDYgQEAKIAkJCQl9CiAJCQkJYnJlYWs7CiAKLQogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCQkJLyoKQEAgLTg2OCwyMiArODM1LDI4IEBACiAJCQkJICogMikgRGVyZWZlcmVuY2UgdGhlIG5vZGUgdG8gYW4gYWN0dWFsIG9iamVjdC4gIENvdWxkIGJlIGEKIAkJCQkgKiAgICBGaWVsZCwgc28gd2UgbmVlZCB0byByZXNvbHZlIHRoZSBub2RlIHRvIGEgdmFsdWUuCiAJCQkJICovCi0JCQkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKLQkJCQkJCSB3YWxrX3N0YXRlLT5zY29wZV9pbmZvLT5zY29wZS5ub2RlLAotCQkJCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKLQkJCQkJCSBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSICgKLQkJCQkJCQkJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYykpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgob3BlcmFuZFswXS0+c3RyaW5nLgorCQkJCQkJCSAgICAgcG9pbnRlciwKKwkJCQkJCQkgICAgIHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgICAgc2NvcGVfaW5mby0+c2NvcGUuCisJCQkJCQkJICAgICBub2RlLAorCQkJCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJCSAgICAgQUNQSV9DQVNUX0lORElSRUNUX1BUUgorCQkJCQkJCSAgICAgKHN0cnVjdAorCQkJCQkJCSAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkJICAgICAgJnJldHVybl9kZXNjKSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCWdvdG8gY2xlYW51cDsKIAkJCQl9CiAKLQkJCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSAoCi0JCQkJCQkgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKAotCQkJCQkJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYyksCi0JCQkJCQkJCXdhbGtfc3RhdGUpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlCisJCQkJICAgIChBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCisJCQkJICAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYyksCisJCQkJICAgICB3YWxrX3N0YXRlKTsKIAkJCQlnb3RvIGNsZWFudXA7CiAKLQogCQkJZGVmYXVsdDoKIAogCQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CkBAIC04OTMsMTcgKzg2NiwyMCBAQAogCiAJCS8qIE9wZXJhbmRbMF0gbWF5IGhhdmUgY2hhbmdlZCBmcm9tIHRoZSBjb2RlIGFib3ZlICovCiAKLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob3BlcmFuZFswXSkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvcGVyYW5kWzBdKSA9PQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKG9iamVjdF9yZWZlcmVuY2UpCiAJCQkgKiBHZXQgdGhlIGFjdHVhbCBvYmplY3QgZnJvbSB0aGUgTm9kZSAoVGhpcyBpcyB0aGUgZGVyZWZlcmVuY2UpLgogCQkJICogVGhpcyBjYXNlIG1heSBvbmx5IGhhcHBlbiB3aGVuIGEgbG9jYWxfeCBvciBhcmdfeCBpcwogCQkJICogZGVyZWZlcmVuY2VkIGFib3ZlLgogCQkJICovCi0JCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCi0JCQkJCSAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wZXJhbmRbMF0pOwotCQl9Ci0JCWVsc2UgeworCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdAorCQkJCQkJCQkgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJCSAgICopCisJCQkJCQkJCSAgb3BlcmFuZFswXSk7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoaXMgbXVzdCBiZSBhIHJlZmVyZW5jZSBvYmplY3QgcHJvZHVjZWQgYnkgZWl0aGVyIHRoZQogCQkJICogSW5kZXgoKSBvciByZWZfb2YoKSBvcGVyYXRvcgpAQCAtOTE4LDcgKzg5NCw4IEBACiAJCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpIHsKIAkJCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKLQkJCQkJdGVtcF9kZXNjID0gb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9iamVjdDsKKwkJCQkJdGVtcF9kZXNjID0KKwkJCQkJICAgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7CiAKIAkJCQkJLyoKIAkJCQkJICogQ3JlYXRlIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zIG9uZSBlbGVtZW50IG9mIHRoZQpAQCAtOTI4LDcgKzkwNSw5IEBACiAJCQkJCSAqIHN1Yi1idWZmZXIgb2YgdGhlIG1haW4gYnVmZmVyLCBpdCBpcyBvbmx5IGEgcG9pbnRlciB0byBhCiAJCQkJCSAqIHNpbmdsZSBlbGVtZW50IChieXRlKSBvZiB0aGUgYnVmZmVyIQogCQkJCQkgKi8KLQkJCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJCQkJcmV0dXJuX2Rlc2MgPQorCQkJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0CisJCQkJCSAgICAoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQkJCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQkJCQlnb3RvIGNsZWFudXA7CkBAIC05NDAsNjYgKzkxOSw2MyBAQAogCQkJCQkgKiByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBpdHNlbGYuCiAJCQkJCSAqLwogCQkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9Ci0JCQkJCQl0ZW1wX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW29wZXJhbmRbMF0tPnJlZmVyZW5jZS5vZmZzZXRdOworCQkJCQkgICAgdGVtcF9kZXNjLT5idWZmZXIuCisJCQkJCSAgICBwb2ludGVyW29wZXJhbmRbMF0tPnJlZmVyZW5jZS4KKwkJCQkJCSAgICBvZmZzZXRdOwogCQkJCQlicmVhazsKIAotCiAJCQkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAogCQkJCQkvKgogCQkJCQkgKiBSZXR1cm4gdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBvZiB0aGUgcGFja2FnZS4gIFdlIG11c3QKIAkJCQkJICogYWRkIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdCwgaG93ZXZlci4KIAkJCQkJICovCi0JCQkJCXJldHVybl9kZXNjID0gKihvcGVyYW5kWzBdLT5yZWZlcmVuY2Uud2hlcmUpOwotCQkJCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogV2UgY2FuJ3QgcmV0dXJuIGEgTlVMTCBkZXJlZmVyZW5jZWQgdmFsdWUuICBUaGlzIGlzCi0JCQkJCQkgKiBhbiB1bmluaXRpYWxpemVkIHBhY2thZ2UgZWxlbWVudCBhbmQgaXMgdGh1cyBhCi0JCQkJCQkgKiBzZXZlcmUgZXJyb3IuCi0JCQkJCQkgKi8KLQkJCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSJOVUxMIHBhY2thZ2UgZWxlbWVudCBvYmogJXBcbiIsCi0JCQkJCQkJb3BlcmFuZFswXSkpOwotCQkJCQkJc3RhdHVzID0gQUVfQU1MX1VOSU5JVElBTElaRURfRUxFTUVOVDsKLQkJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQkJcmV0dXJuX2Rlc2MgPQorCQkJCQkgICAgKihvcGVyYW5kWzBdLT5yZWZlcmVuY2Uud2hlcmUpOworCQkJCQlpZiAocmV0dXJuX2Rlc2MpIHsKKwkJCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZQorCQkJCQkJICAgIChyZXR1cm5fZGVzYyk7CiAJCQkJCX0KIAotCQkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKIAkJCQkJYnJlYWs7CiAKLQogCQkJCWRlZmF1bHQ6CiAKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiVW5rbm93biBJbmRleCB0YXJnZXRfdHlwZSAlWCBpbiBvYmogJXBcbiIsCi0JCQkJCQlvcGVyYW5kWzBdLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsIG9wZXJhbmRbMF0pKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJVbmtub3duIEluZGV4IHRhcmdldF90eXBlICVYIGluIG9iaiAlcFxuIiwKKwkJCQkJCQkgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS4KKwkJCQkJCQkgIHRhcmdldF90eXBlLAorCQkJCQkJCSAgb3BlcmFuZFswXSkpOwogCQkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJfQogCQkJCWJyZWFrOwogCi0KIAkJCWNhc2UgQU1MX1JFRl9PRl9PUDoKIAogCQkJCXJldHVybl9kZXNjID0gb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9iamVjdDsKIAotCQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHJldHVybl9kZXNjKSA9PQotCQkJCQkJQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHJldHVybl9kZXNjKSA9PQorCQkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCi0JCQkJCXJldHVybl9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQkJCQkJCQkgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSByZXR1cm5fZGVzYyk7CisJCQkJCXJldHVybl9kZXNjID0KKwkJCQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0CisJCQkJCQkJCQkgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCQkJICopCisJCQkJCQkJCQlyZXR1cm5fZGVzYyk7CiAJCQkJfQogCiAJCQkJLyogQWRkIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QhICovCiAKLQkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQkJCWJyZWFrOwogCi0KIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJVbmtub3duIG9wY29kZSBpbiByZWYoJXApIC0gJVhcbiIsCi0JCQkJCW9wZXJhbmRbMF0sIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vcGNvZGUpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiVW5rbm93biBvcGNvZGUgaW4gcmVmKCVwKSAtICVYXG4iLAorCQkJCQkJICBvcGVyYW5kWzBdLAorCQkJCQkJICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCisJCQkJCQkgIG9wY29kZSkpOwogCiAJCQkJc3RhdHVzID0gQUVfVFlQRTsKIAkJCQlnb3RvIGNsZWFudXA7CkBAIC0xMDA3LDI1ICs5ODMsMjEgQEAKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8xQV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8xQV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCX0KIAogCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKaW5kZXggNzQyOTAzMi4uOGQ3MGM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKQEAgLTQxLDE3ICs0MSwxNCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG9wYXJnMiIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4b3BhcmcyIikKIAogLyohCiAgKiBOYW1pbmcgY29udmVudGlvbiBmb3IgQU1MIGludGVycHJldGVyIGV4ZWN1dGlvbiByb3V0aW5lcy4KQEAgLTc0LDggKzcxLDYgQEAKICAqIFRoZSBBY3BpRXhPcGNvZGUqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHZpYSB0aGUgRGlzcGF0Y2hlciBjb21wb25lbnQgd2l0aAogICogZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZHMuCiAhKi8KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8yQV8wVF8wUgpAQCAtOTAsMjkgKzg1LDI0IEBACiAgKiBBTExPQ0FUSU9OOiAgRGVsZXRlcyBib3RoIG9wZXJhbmRzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1MzIgdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzJBXzBUXzBSIiwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMkFfMFRfMFIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhhbWluZSB0aGUgb3Bjb2RlICovCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX05PVElGWV9PUDogICAgICAgICAvKiBOb3RpZnkgKG5vdGlmeV9vYmplY3QsIG5vdGlmeV92YWx1ZSkgKi8KKwljYXNlIEFNTF9OT1RJRllfT1A6CS8qIE5vdGlmeSAobm90aWZ5X29iamVjdCwgbm90aWZ5X3ZhbHVlKSAqLwogCiAJCS8qIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgbmFtZXNwYWNlIG5vZGUgKi8KIAotCQlub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wZXJhbmRbMF07CisJCW5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdOwogCiAJCS8qIFNlY29uZCB2YWx1ZSBpcyB0aGUgbm90aWZ5IHZhbHVlICovCiAKQEAgLTEyMCwxNSArMTEwLDE0IEBACiAKIAkJLyogQXJlIG5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3Q/ICovCiAKLQkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3QgKG5vZGUpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIlVuZXhwZWN0ZWQgbm90aWZ5IG9iamVjdCB0eXBlIFslc11cbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSkpKTsKKwkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qobm9kZSkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIlVuZXhwZWN0ZWQgbm90aWZ5IG9iamVjdCB0eXBlIFslc11cbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7CiAKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQlicmVhazsKIAkJfQotCiAjaWZkZWYgQUNQSV9HUEVfTk9USUZZX0NIRUNLCiAJCS8qCiAJCSAqIEdQRSBtZXRob2Qgd2FrZS9ub3RpZnkgY2hlY2suICBIZXJlLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHdlCkBAIC0xNDQsMTIgKzEzMywxNCBAQAogCQkgKiBJZiBhbGwgdGhyZWUgY2FzZXMgYXJlIHRydWUsIHRoaXMgaXMgYSB3YWtlLW9ubHkgR1BFIHRoYXQgc2hvdWxkCiAJCSAqIGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUuCiAJCSAqLwotCQlpZiAodmFsdWUgPT0gMikgICAgIC8qIGRldmljZV93YWtlICovIHsKLQkJCXN0YXR1cyA9IGFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUgKHdhbGtfc3RhdGUtPmdwZV9ldmVudF9pbmZvKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJaWYgKHZhbHVlID09IDIpIHsJLyogZGV2aWNlX3dha2UgKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9ldl9jaGVja19mb3Jfd2FrZV9vbmx5X2dwZSh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgZ3BlX2V2ZW50X2luZm8pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJLyogQUVfV0FLRV9PTkxZX0dQRSBvbmx5IGVycm9yLCBtZWFucyBpZ25vcmUgdGhpcyBub3RpZnkgKi8KIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKQogCQkJfQogCQl9CiAjZW5kaWYKQEAgLTE2MSwyMSArMTUyLDE4IEBACiAJCSAqIGZyb20gdGhpcyB0aHJlYWQgLS0gYmVjYXVzZSBoYW5kbGVycyBtYXkgaW4gdHVybiBydW4gb3RoZXIKIAkJICogY29udHJvbCBtZXRob2RzLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCAobm9kZSwgdmFsdWUpOworCQlzdGF0dXMgPSBhY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0KG5vZGUsIHZhbHVlKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfMkFfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJCXdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8yQV8yVF8xUgpAQCAtMTg5LDE5ICsxNzcsMTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8yQV8yVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjMSA9IE5VTEw7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MyID0gTlVMTDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzEgPSBOVUxMOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjMiA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8yQV8yVF8xUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMkFfMlRfMVIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhlY3V0ZSB0aGUgb3Bjb2RlICovCiAKQEAgLTIxMCwxMyArMTk0LDE1IEBACiAKIAkJLyogRGl2aWRlIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCBxdW90aWVudF9yZXN1bHQpICovCiAKLQkJcmV0dXJuX2Rlc2MxID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjMSA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjMSkgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJcmV0dXJuX2Rlc2MyID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjMiA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjMikgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwpAQCAtMjI0LDMzICsyMTAsMzEgQEAKIAogCQkvKiBRdW90aWVudCB0byByZXR1cm5fZGVzYzEsIHJlbWFpbmRlciB0byByZXR1cm5fZGVzYzIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2RpdmlkZSAob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgICZyZXR1cm5fZGVzYzEtPmludGVnZXIudmFsdWUsCi0JCQkJICAgJnJldHVybl9kZXNjMi0+aW50ZWdlci52YWx1ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9kaXZpZGUob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJJnJldHVybl9kZXNjMS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJJnJldHVybl9kZXNjMi0+aW50ZWdlci52YWx1ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8yVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFN0b3JlIHRoZSByZXN1bHRzIHRvIHRoZSB0YXJnZXQgcmVmZXJlbmNlIG9wZXJhbmRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYzIsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjMiwgb3BlcmFuZFsyXSwgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYzEsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjMSwgb3BlcmFuZFszXSwgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTI1OCwyNCArMjQyLDIyIEBACiAKIAl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2MxOwogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCS8qCiAJICogU2luY2UgdGhlIHJlbWFpbmRlciBpcyBub3QgcmV0dXJuZWQgaW5kaXJlY3RseSwgcmVtb3ZlIGEgcmVmZXJlbmNlIHRvCiAJICogaXQuIE9ubHkgdGhlIHF1b3RpZW50IGlzIHJldHVybmVkIGluZGlyZWN0bHkuCiAJICovCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYzIpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYzIpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkvKiBEZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjMSk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYzEpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8yQV8xVF8xUgpAQCAtMjg5LDQyICsyNzEsMzkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8yQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWFjcGlfaW50ZWdlciBpbmRleDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3NpemUgbGVuZ3RoOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8yQV8xVF8xUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMkFfMVRfMVIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhlY3V0ZSB0aGUgb3Bjb2RlICovCiAKIAlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTUFUSCkgewogCQkvKiBBbGwgc2ltcGxlIG1hdGggb3Bjb2RlcyAoYWRkLCBldGMuKSAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3BpX2V4X2RvX21hdGhfb3AgKHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCQkgIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCi0JCQkJICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlKTsKKwkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPQorCQkgICAgYWNwaV9leF9kb19tYXRoX29wKHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkgICAgICAgb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkgICAgICAgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSk7CiAJCWdvdG8gc3RvcmVfcmVzdWx0X3RvX3RhcmdldDsKIAl9CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01PRF9PUDogLyogTW9kIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfTU9EX09QOgkvKiBNb2QgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IChBQ1BJIDIuMCkgKi8KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTMzMiwyMSArMzExLDE4IEBACiAKIAkJLyogcmV0dXJuX2Rlc2Mgd2lsbCBjb250YWluIHRoZSByZW1haW5kZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2RpdmlkZSAob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgIE5VTEwsCi0JCQkJICAgJnJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJc3RhdHVzID0gYWNwaV91dF9kaXZpZGUob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJTlVMTCwgJnJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFNTF9DT05DQVRfT1A6CS8qIENvbmNhdGVuYXRlIChEYXRhMSwgRGF0YTIsIFJlc3VsdCkgKi8KIAotCWNhc2UgQU1MX0NPTkNBVF9PUDogLyogQ29uY2F0ZW5hdGUgKERhdGExLCBEYXRhMiwgUmVzdWx0KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fY29uY2F0ZW5hdGUgKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCi0JCQkJICZyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfZG9fY29uY2F0ZW5hdGUob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKKwkJCQkJCSZyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0KLQljYXNlIEFNTF9UT19TVFJJTkdfT1A6IC8qIHRvX3N0cmluZyAoQnVmZmVyLCBMZW5ndGgsIFJlc3VsdCkgKEFDUEkgMi4wKSAqLworCWNhc2UgQU1MX1RPX1NUUklOR19PUDoJLyogdG9fc3RyaW5nIChCdWZmZXIsIExlbmd0aCwgUmVzdWx0KSAoQUNQSSAyLjApICovCiAKIAkJLyoKIAkJICogSW5wdXQgb2JqZWN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBidWZmZXIgYXQgdGhpcyBwb2ludCAoaXQgbWF5IGhhdmUKQEAgLTM2NSw4ICszNDEsOCBAQAogCQkgKi8KIAkJbGVuZ3RoID0gMDsKIAkJd2hpbGUgKChsZW5ndGggPCBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSAmJgotCQkJICAgKGxlbmd0aCA8IG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUpICYmCi0JCQkgICAob3BlcmFuZFswXS0+YnVmZmVyLnBvaW50ZXJbbGVuZ3RoXSkpIHsKKwkJICAgICAgIChsZW5ndGggPCBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlKSAmJgorCQkgICAgICAgKG9wZXJhbmRbMF0tPmJ1ZmZlci5wb2ludGVyW2xlbmd0aF0pKSB7CiAJCQlsZW5ndGgrKzsKIAkJCWlmIChsZW5ndGggPiBBQ1BJX01BWF9TVFJJTkdfQ09OVkVSU0lPTikgewogCQkJCXN0YXR1cyA9IEFFX0FNTF9TVFJJTkdfTElNSVQ7CkBAIC0zNzYsMzMgKzM1MiwzMiBAQAogCiAJCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgKi8KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QgKGxlbmd0aCk7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChsZW5ndGgpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQkvKiBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgd2l0aCBubyB0cmFuc2Zvcm0uIE5VTEwgdGVybWluYXRlZCBhbHJlYWR5Ki8KKwkJLyogQ29weSB0aGUgcmF3IGJ1ZmZlciBkYXRhIHdpdGggbm8gdHJhbnNmb3JtLiBOVUxMIHRlcm1pbmF0ZWQgYWxyZWFkeSAqLwogCi0JCUFDUElfTUVNQ1BZIChyZXR1cm5fZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQlvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkocmV0dXJuX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJICAgIG9wZXJhbmRbMF0tPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgpOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfQ09OQ0FUX1JFU19PUDoKIAogCQkvKiBjb25jYXRlbmF0ZV9yZXNfdGVtcGxhdGUgKEJ1ZmZlciwgQnVmZmVyLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSAob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKLQkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9jb25jYXRfdGVtcGxhdGUob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKKwkJCQkJCSAmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAotCi0JY2FzZSBBTUxfSU5ERVhfT1A6ICAgICAgICAgICAgICAvKiBJbmRleCAoU291cmNlIEluZGV4IFJlc3VsdCkgKi8KKwljYXNlIEFNTF9JTkRFWF9PUDoJLyogSW5kZXggKFNvdXJjZSBJbmRleCBSZXN1bHQpICovCiAKIAkJLyogQ3JlYXRlIHRoZSBpbnRlcm5hbCByZXR1cm4gb2JqZWN0ICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOworCQlyZXR1cm5fZGVzYyA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTQxMiw3NiArMzg3LDc1IEBACiAKIAkJLyogQXQgdGhpcyBwb2ludCwgdGhlIFNvdXJjZSBvcGVyYW5kIGlzIGEgUGFja2FnZSwgQnVmZmVyLCBvciBTdHJpbmcgKi8KIAotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmRbMF0pID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kWzBdKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewogCQkJLyogT2JqZWN0IHRvIGJlIGluZGV4ZWQgaXMgYSBQYWNrYWdlICovCiAKIAkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkluZGV4IHZhbHVlICglWCU4LjhYKSBiZXlvbmQgcGFja2FnZSBlbmQgKCVYKVxuIiwKKwkJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZGV4KSwKKwkJCQkJCSAgb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9QQUNLQUdFX0xJTUlUOwogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KIAogCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9IEFDUElfVFlQRV9QQUNLQUdFOwotCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgICAgPSBvcGVyYW5kWzBdOwotCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSAgICAgPSAmb3BlcmFuZFswXS0+cGFja2FnZS5lbGVtZW50cyBbCi0JCQkJCSAgaW5kZXhdOwotCQl9Ci0JCWVsc2UgeworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPSBvcGVyYW5kWzBdOworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSA9CisJCQkgICAgJm9wZXJhbmRbMF0tPnBhY2thZ2UuZWxlbWVudHNbaW5kZXhdOworCQl9IGVsc2UgewogCQkJLyogT2JqZWN0IHRvIGJlIGluZGV4ZWQgaXMgYSBCdWZmZXIvU3RyaW5nICovCiAKIAkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIGVuZCBvZiBidWZmZXIgKCVYKVxuIiwKLQkJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChpbmRleCksIG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBlbmQgb2YgYnVmZmVyICglWClcbiIsCisJCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChpbmRleCksCisJCQkJCQkgIG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpKTsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOwogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KIAotCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9IEFDUElfVFlQRV9CVUZGRVJfRklFTEQ7Ci0JCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9iamVjdCAgICA9IG9wZXJhbmRbMF07CisJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlID0KKwkJCSAgICBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPSBvcGVyYW5kWzBdOwogCQl9CiAKIAkJLyoKIAkJICogQWRkIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgcGFja2FnZS9idWZmZXIvc3RyaW5nIGZvciB0aGUgbGlmZQogCQkgKiBvZiB0aGUgaW5kZXguCiAJCSAqLwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9wZXJhbmRbMF0pOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob3BlcmFuZFswXSk7CiAKIAkJLyogQ29tcGxldGUgdGhlIEluZGV4IHJlZmVyZW5jZSBvYmplY3QgKi8KIAotCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9wY29kZSAgICA9IEFNTF9JTkRFWF9PUDsKLQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgICAgPSAodTMyKSBpbmRleDsKKwkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPSBBTUxfSU5ERVhfT1A7CisJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ID0gKHUzMikgaW5kZXg7CiAKIAkJLyogU3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKIAogCQkvKiBSZXR1cm4gdGhlIHJlZmVyZW5jZSAqLwogCiAJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKIAkJZ290byBjbGVhbnVwOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzJBXzFUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8xVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJYnJlYWs7CiAJfQogCisgICAgICBzdG9yZV9yZXN1bHRfdG9fdGFyZ2V0OgogCi1zdG9yZV9yZXN1bHRfdG9fdGFyZ2V0OgotCi0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkvKgogCQkgKiBTdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKHdoaWNoIGlzIG5vdyBpbiByZXR1cm5fZGVzYykgaW50bwogCQkgKiB0aGUgVGFyZ2V0IGRlc2NyaXB0b3IuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYywgb3BlcmFuZFsyXSwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYywgb3BlcmFuZFsyXSwgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKQEAgLTQ5MCwxOSArNDY0LDE3IEBACiAJCX0KIAl9CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMFRfMVIKQEAgLTUxNSwyMyArNDg3LDE5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxfcmVzdWx0ID0gRkFMU0U7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXU4IGxvZ2ljYWxfcmVzdWx0ID0gRkFMU0U7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzJBXzBUXzFSIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoImV4X29wY29kZV8yQV8wVF8xUiIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBDcmVhdGUgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QgKi8KIAotCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfSU5URUdFUik7CisJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CkBAIC01NDIsNTAgKzUxMCw0OCBAQAogCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMX05VTUVSSUMpIHsKIAkJLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9udW1lcmljX29wICh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJICBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLCBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgJmxvZ2ljYWxfcmVzdWx0KTsKKwkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCQkJICAgICAgIG9wZXJhbmRbMF0tPmludGVnZXIuCisJCQkJCQkgICAgICAgdmFsdWUsCisJCQkJCQkgICAgICAgb3BlcmFuZFsxXS0+aW50ZWdlci4KKwkJCQkJCSAgICAgICB2YWx1ZSwgJmxvZ2ljYWxfcmVzdWx0KTsKIAkJZ290byBzdG9yZV9sb2dpY2FsX3Jlc3VsdDsKLQl9Ci0JZWxzZSBpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTCkgeworCX0gZWxzZSBpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTCkgewogCQkvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX29wICh3YWxrX3N0YXRlLT5vcGNvZGUsIG9wZXJhbmRbMF0sCi0JCQkJIG9wZXJhbmRbMV0sICZsb2dpY2FsX3Jlc3VsdCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCh3YWxrX3N0YXRlLT5vcGNvZGUsIG9wZXJhbmRbMF0sCisJCQkJCSAgICAgICBvcGVyYW5kWzFdLCAmbG9naWNhbF9yZXN1bHQpOwogCQlnb3RvIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OwogCX0KIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfQUNRVUlSRV9PUDogICAgICAgICAgICAvKiBBY3F1aXJlIChtdXRleF9vYmplY3QsIFRpbWVvdXQpICovCisJY2FzZSBBTUxfQUNRVUlSRV9PUDoJLyogQWNxdWlyZSAobXV0ZXhfb2JqZWN0LCBUaW1lb3V0KSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfYWNxdWlyZV9tdXRleCAob3BlcmFuZFsxXSwgb3BlcmFuZFswXSwgd2Fsa19zdGF0ZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgob3BlcmFuZFsxXSwgb3BlcmFuZFswXSwgd2Fsa19zdGF0ZSk7CiAJCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgewotCQkJbG9naWNhbF9yZXN1bHQgPSBUUlVFOyAgICAgIC8qIFRSVUUgPSBBY3F1aXJlIHRpbWVkIG91dCAqLworCQkJbG9naWNhbF9yZXN1bHQgPSBUUlVFOwkvKiBUUlVFID0gQWNxdWlyZSB0aW1lZCBvdXQgKi8KIAkJCXN0YXR1cyA9IEFFX09LOwogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBBTUxfV0FJVF9PUDoJLyogV2FpdCAoZXZlbnRfb2JqZWN0LCBUaW1lb3V0KSAqLwogCi0JY2FzZSBBTUxfV0FJVF9PUDogICAgICAgICAgICAgICAvKiBXYWl0IChldmVudF9vYmplY3QsIFRpbWVvdXQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9ldmVudCAob3BlcmFuZFsxXSwgb3BlcmFuZFswXSk7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQob3BlcmFuZFsxXSwgb3BlcmFuZFswXSk7CiAJCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgewotCQkJbG9naWNhbF9yZXN1bHQgPSBUUlVFOyAgICAgIC8qIFRSVUUsIFdhaXQgdGltZWQgb3V0ICovCisJCQlsb2dpY2FsX3Jlc3VsdCA9IFRSVUU7CS8qIFRSVUUsIFdhaXQgdGltZWQgb3V0ICovCiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8yQV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCi1zdG9yZV9sb2dpY2FsX3Jlc3VsdDoKKyAgICAgIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OgogCS8qCiAJICogU2V0IHJldHVybiB2YWx1ZSB0byBhY2NvcmRpbmcgdG8gbG9naWNhbF9yZXN1bHQuIGxvZ2ljYWwgVFJVRSAoYWxsIG9uZXMpCiAJICogRGVmYXVsdCBpcyBGQUxTRSAoemVybykKQEAgLTU5NiwxNiArNTYyLDEzIEBACiAKIAl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAKLQotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHJldHVybl9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzMuYwppbmRleCAyM2IwNjhhLi40ODMzNjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzMuYwpAQCAtNDIsMTYgKzQyLDEzIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhvcGFyZzMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnMyIpCiAKIC8qIQogICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCkBAIC03NCw4ICs3MSw2IEBACiAgKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKICAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgogISovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIKQEAgLTg3LDYxICs4Miw1MyBAQAogICogREVTQ1JJUFRJT046IEV4ZWN1dGUgVHJpYWRpYyBvcGVyYXRvciAoMyBvcGVyYW5kcykKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvICAgKmZhdGFsOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJc3RydWN0IGFjcGlfc2lnbmFsX2ZhdGFsX2luZm8gKmZhdGFsOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8wVF8wUiIsCi0JCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfM0FfMFRfMFIiLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9GQVRBTF9PUDogICAgICAgICAgLyogRmF0YWwgKGZhdGFsX3R5cGUgZmF0YWxfY29kZSBmYXRhbF9hcmcpICovCisJY2FzZSBBTUxfRkFUQUxfT1A6CS8qIEZhdGFsIChmYXRhbF90eXBlIGZhdGFsX2NvZGUgZmF0YWxfYXJnKSAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkiZmF0YWxfb3A6IFR5cGUgJVggQ29kZSAlWCBBcmcgJVggPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PFxuIiwKLQkJCSh1MzIpIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCi0JCQkodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAotCQkJKHUzMikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiZmF0YWxfb3A6IFR5cGUgJVggQ29kZSAlWCBBcmcgJVggPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PFxuIiwKKwkJCQkgICh1MzIpIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCisJCQkJICAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAorCQkJCSAgKHUzMikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZSkpOwogCi0JCWZhdGFsID0gQUNQSV9NRU1fQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfc2lnbmFsX2ZhdGFsX2luZm8pKTsKKwkJZmF0YWwgPQorCQkgICAgQUNQSV9NRU1fQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvKSk7CiAJCWlmIChmYXRhbCkgewotCQkJZmF0YWwtPnR5cGUgICAgID0gKHUzMikgb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKLQkJCWZhdGFsLT5jb2RlICAgICA9ICh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CisJCQlmYXRhbC0+dHlwZSA9ICh1MzIpIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWU7CisJCQlmYXRhbC0+Y29kZSA9ICh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CiAJCQlmYXRhbC0+YXJndW1lbnQgPSAodTMyKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwogCQl9CiAKIAkJLyogQWx3YXlzIHNpZ25hbCB0aGUgT1MhICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc19zaWduYWwgKEFDUElfU0lHTkFMX0ZBVEFMLCBmYXRhbCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsKEFDUElfU0lHTkFMX0ZBVEFMLCBmYXRhbCk7CiAKIAkJLyogTWlnaHQgcmV0dXJuIHdoaWxlIE9TIGlzIHNodXR0aW5nIGRvd24sIGp1c3QgY29udGludWUgKi8KIAotCQlBQ1BJX01FTV9GUkVFIChmYXRhbCk7CisJCUFDUElfTUVNX0ZSRUUoZmF0YWwpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV8zQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfM0FfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKKyAgICAgIGNsZWFudXA6CiAKLWNsZWFudXA6Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIKQEAgLTE1NCwzMSArMTQxLDI4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7CisJY2hhciAqYnVmZmVyID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2ludGVnZXIgaW5kZXg7CisJYWNwaV9zaXplIGxlbmd0aDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfM0FfMVRfMVIiLAotCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzNBXzFUXzFSIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfTUlEX09QOiAgICAvKiBNaWQgKFNvdXJjZVswXSwgSW5kZXhbMV0sIExlbmd0aFsyXSwgUmVzdWx0WzNdKSAqLworCWNhc2UgQU1MX01JRF9PUDoJLyogTWlkIChTb3VyY2VbMF0sIEluZGV4WzFdLCBMZW5ndGhbMl0sIFJlc3VsdFszXSkgKi8KIAogCQkvKgogCQkgKiBDcmVhdGUgdGhlIHJldHVybiBvYmplY3QuICBUaGUgU291cmNlIG9wZXJhbmQgaXMgZ3VhcmFudGVlZCB0byBiZQogCQkgKiBlaXRoZXIgYSBTdHJpbmcgb3IgYSBCdWZmZXIsIHNvIGp1c3QgdXNlIGl0cyB0eXBlLgogCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKAotCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmRbMF0pKTsKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkJCQkgICAob3BlcmFuZFswXSkpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0xOTMsNjcgKzE3Nyw5MiBAQAogCQkgKiBJZiB0aGUgaW5kZXggaXMgYmV5b25kIHRoZSBsZW5ndGggb2YgdGhlIFN0cmluZy9CdWZmZXIsIG9yIGlmIHRoZQogCQkgKiByZXF1ZXN0ZWQgbGVuZ3RoIGlzIHplcm8sIHJldHVybiBhIHplcm8tbGVuZ3RoIFN0cmluZy9CdWZmZXIKIAkJICovCi0JCWlmICgoaW5kZXggPCBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSAmJgotCQkJKGxlbmd0aCA+IDApKSB7Ci0JCQkvKiBUcnVuY2F0ZSByZXF1ZXN0IGlmIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgU3RyaW5nL0J1ZmZlciAqLworCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgeworCQkJbGVuZ3RoID0gMDsKKwkJfQogCi0JCQlpZiAoKGluZGV4ICsgbGVuZ3RoKSA+Ci0JCQkJb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgewotCQkJCWxlbmd0aCA9IChhY3BpX3NpemUpIG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGggLQotCQkJCQkJIChhY3BpX3NpemUpIGluZGV4OwotCQkJfQorCQkvKiBUcnVuY2F0ZSByZXF1ZXN0IGlmIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgU3RyaW5nL0J1ZmZlciAqLwogCi0JCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBTdHJpbmcvQnVmZmVyICovCisJCWVsc2UgaWYgKChpbmRleCArIGxlbmd0aCkgPiBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSB7CisJCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoIC0KKwkJCSAgICAoYWNwaV9zaXplKSBpbmRleDsKKwkJfQogCi0JCQlidWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKChhY3BpX3NpemUpIGxlbmd0aCArIDEpOworCQkvKiBTdHJpbmdzIGFsd2F5cyBoYXZlIGEgc3ViLXBvaW50ZXIsIG5vdCBzbyBmb3IgYnVmZmVycyAqLworCisJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCQkvKiBBbHdheXMgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgU3RyaW5nICovCisKKwkJCWJ1ZmZlciA9IEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKSBsZW5ndGggKyAxKTsKIAkJCWlmICghYnVmZmVyKSB7CiAJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KKwkJCWJyZWFrOwogCisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkJLyogSWYgdGhlIHJlcXVlc3RlZCBsZW5ndGggaXMgemVybywgZG9uJ3QgYWxsb2NhdGUgYSBidWZmZXIgKi8KKworCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBCdWZmZXIgKi8KKworCQkJCWJ1ZmZlciA9IEFDUElfTUVNX0NBTExPQ0FURShsZW5ndGgpOworCQkJCWlmICghYnVmZmVyKSB7CisJCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CS8qIFNob3VsZCBub3QgaGFwcGVuICovCisKKwkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpZiAobGVuZ3RoID4gMCkgewogCQkJLyogQ29weSB0aGUgcG9ydGlvbiByZXF1ZXN0ZWQgKi8KIAotCQkJQUNQSV9NRU1DUFkgKGJ1ZmZlciwgb3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIgKyBpbmRleCwKLQkJCQkJICBsZW5ndGgpOwotCi0JCQkvKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IFN0cmluZy9CdWZmZXIgKi8KLQotCQkJcmV0dXJuX2Rlc2MtPnN0cmluZy5wb2ludGVyID0gYnVmZmVyOwotCQkJcmV0dXJuX2Rlc2MtPnN0cmluZy5sZW5ndGggPSAodTMyKSBsZW5ndGg7CisJCQlBQ1BJX01FTUNQWShidWZmZXIsIG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyICsgaW5kZXgsCisJCQkJICAgIGxlbmd0aCk7CiAJCX0KIAorCQkvKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IFN0cmluZy9CdWZmZXIgKi8KKworCQlyZXR1cm5fZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBidWZmZXI7CisJCXJldHVybl9kZXNjLT5zdHJpbmcubGVuZ3RoID0gKHUzMikgbGVuZ3RoOworCiAJCS8qIE1hcmsgYnVmZmVyIGluaXRpYWxpemVkICovCiAKIAkJcmV0dXJuX2Rlc2MtPmJ1ZmZlci5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfM0FfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLAotCQkJCXdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogU3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUgdGFyZ2V0ICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYywgb3BlcmFuZFszXSwgd2Fsa19zdGF0ZSk7CisJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYywgb3BlcmFuZFszXSwgd2Fsa19zdGF0ZSk7CiAKLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChyZXR1cm5fZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8IHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKIAkvKiBTZXQgdGhlIHJldHVybiBvYmplY3QgYW5kIGV4aXQgKi8KIAotCWlmICghd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgeworCWVsc2UgewogCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCmluZGV4IDE3ZjgxZDQuLjVkZWU3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCkBAIC00MiwxNiArNDIsMTMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG9wYXJnNiIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4b3Bhcmc2IikKIAogLyohCiAgKiBOYW1pbmcgY29udmVudGlvbiBmb3IgQU1MIGludGVycHJldGVyIGV4ZWN1dGlvbiByb3V0aW5lcy4KQEAgLTc0LDE1ICs3MSwxMSBAQAogICogVGhlIEFjcGlFeE9wY29kZSogZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIHRoZSBEaXNwYXRjaGVyIGNvbXBvbmVudCB3aXRoCiAgKiBmdWxseSByZXNvbHZlZCBvcGVyYW5kcy4KICEqLwotCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB1OAotYWNwaV9leF9kb19tYXRjaCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9vcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwYWNrYWdlX29iaiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICptYXRjaF9vYmopOwotCithY3BpX2V4X2RvX21hdGNoKHUzMiBtYXRjaF9vcCwKKwkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhY2thZ2Vfb2JqLAorCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWF0Y2hfb2JqKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMDEsMTQgKzk0LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdTgKLWFjcGlfZXhfZG9fbWF0Y2ggKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbWF0Y2hfb2JqKQorYWNwaV9leF9kb19tYXRjaCh1MzIgbWF0Y2hfb3AsCisJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iaiwKKwkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1hdGNoX29iaikKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXU4IGxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKgogCSAqIE5vdGU6IFNpbmNlIHRoZSBwYWNrYWdlX29iai9tYXRjaF9vYmogb3JkZXJpbmcgaXMgb3Bwb3NpdGUgdG8gdGhhdCBvZgpAQCAtMTMzLDkgKzEyNCwxMCBAQAogCQkgKiBUcnVlIGlmIGVxdWFsOiAoUFtpXSA9PSBNKQogCQkgKiBDaGFuZ2UgdG86ICAgICAoTSA9PSBQW2ldKQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX29wIChBTUxfTEVRVUFMX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAotCQkJCSAmbG9naWNhbF9yZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xFUVVBTF9PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKKwkJCQkJICAmbG9naWNhbF9yZXN1bHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTQ2LDEyICsxMzgsMTMgQEAKIAkJICogVHJ1ZSBpZiBsZXNzIHRoYW4gb3IgZXF1YWw6IChQW2ldIDw9IE0pIChQW2ldIG5vdF9ncmVhdGVyIHRoYW4gTSkKIAkJICogQ2hhbmdlIHRvOiAgICAgICAgICAgICAgICAgIChNID49IFBbaV0pIChNIG5vdF9sZXNzIHRoYW4gUFtpXSkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCAoQU1MX0xMRVNTX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAotCQkJCSAmbG9naWNhbF9yZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xMRVNTX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAorCQkJCQkgICZsb2dpY2FsX3Jlc3VsdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KLQkJbG9naWNhbF9yZXN1bHQgPSAodTgpICFsb2dpY2FsX3Jlc3VsdDsKKwkJbG9naWNhbF9yZXN1bHQgPSAodTgpICEgbG9naWNhbF9yZXN1bHQ7CiAJCWJyZWFrOwogCiAJY2FzZSBNQVRDSF9NTFQ6CkBAIC0xNjAsOSArMTUzLDEwIEBACiAJCSAqIFRydWUgaWYgbGVzcyB0aGFuOiAoUFtpXSA8IE0pCiAJCSAqIENoYW5nZSB0bzogICAgICAgICAoTSA+IFBbaV0pCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKEFNTF9MR1JFQVRFUl9PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKLQkJCQkgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MR1JFQVRFUl9PUCwgbWF0Y2hfb2JqLAorCQkJCQkgIHBhY2thZ2Vfb2JqLCAmbG9naWNhbF9yZXN1bHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTczLDEyICsxNjcsMTMgQEAKIAkJICogVHJ1ZSBpZiBncmVhdGVyIHRoYW4gb3IgZXF1YWw6IChQW2ldID49IE0pIChQW2ldIG5vdF9sZXNzIHRoYW4gTSkKIAkJICogQ2hhbmdlIHRvOiAgICAgICAgICAgICAgICAgICAgIChNIDw9IFBbaV0pIChNIG5vdF9ncmVhdGVyIHRoYW4gUFtpXSkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCAoQU1MX0xHUkVBVEVSX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAotCQkJCSAmbG9naWNhbF9yZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xHUkVBVEVSX09QLCBtYXRjaF9vYmosCisJCQkJCSAgcGFja2FnZV9vYmosICZsb2dpY2FsX3Jlc3VsdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KLQkJbG9naWNhbF9yZXN1bHQgPSAodTgpIWxvZ2ljYWxfcmVzdWx0OworCQlsb2dpY2FsX3Jlc3VsdCA9ICh1OCkgISBsb2dpY2FsX3Jlc3VsdDsKIAkJYnJlYWs7CiAKIAljYXNlIE1BVENIX01HVDoKQEAgLTE4Nyw5ICsxODIsMTAgQEAKIAkJICogVHJ1ZSBpZiBncmVhdGVyIHRoYW46IChQW2ldID4gTSkKIAkJICogQ2hhbmdlIHRvOiAgICAgICAgICAgIChNIDwgUFtpXSkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCAoQU1MX0xMRVNTX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAotCQkJCSAmbG9naWNhbF9yZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xMRVNTX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAorCQkJCQkgICZsb2dpY2FsX3Jlc3VsdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAkJYnJlYWs7CkBAIC0yMDQsNyArMjAwLDYgQEAKIAlyZXR1cm4gbG9naWNhbF9yZXN1bHQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfNkFfMFRfMVIKQEAgLTIxNywyMCArMjEyLDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfNkFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aGlzX2VsZW1lbnQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfaW50ZWdlciBpbmRleDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aGlzX2VsZW1lbnQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzZBXzBUXzFSIiwKLQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoImV4X29wY29kZV82QV8wVF8xUiIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewogCWNhc2UgQU1MX01BVENIX09QOgpAQCAtMjQyLDggKzIzMyw5IEBACiAJCS8qIFZhbGlkYXRlIGJvdGggTWF0Y2ggVGVybSBPcGVyYXRvcnMgKE1UUiwgTUVRLCBldGMuKSAqLwogCiAJCWlmICgob3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSA+IE1BWF9NQVRDSF9PUEVSQVRPUikgfHwKLQkJCShvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlID4gTUFYX01BVENIX09QRVJBVE9SKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJNYXRjaCBvcGVyYXRvciBvdXQgb2YgcmFuZ2VcbiIpKTsKKwkJICAgIChvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlID4gTUFYX01BVENIX09QRVJBVE9SKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiTWF0Y2ggb3BlcmF0b3Igb3V0IG9mIHJhbmdlXG4iKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMjUyLDE2ICsyNDQsMTcgQEAKIAogCQlpbmRleCA9IG9wZXJhbmRbNV0tPmludGVnZXIudmFsdWU7CiAJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiSW5kZXggKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbmRleCAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCisJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZGV4KSwKKwkJCQkJICBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCS8qIENyZWF0ZSBhbiBpbnRlZ2VyIGZvciB0aGUgcmV0dXJuIHZhbHVlICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0yODMsNyArMjc2LDcgQEAKIAkJICogQUNQSV9JTlRFR0VSX01BWCAoT25lcykgKGl0cyBpbml0aWFsIHZhbHVlKSBpbmRpY2F0aW5nIHRoYXQgbm8KIAkJICogbWF0Y2ggd2FzIGZvdW5kLgogCQkgKi8KLQkJZm9yICggOyBpbmRleCA8IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQ7IGluZGV4KyspIHsKKwkJZm9yICg7IGluZGV4IDwgb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudDsgaW5kZXgrKykgewogCQkJLyogR2V0IHRoZSBjdXJyZW50IHBhY2thZ2UgZWxlbWVudCAqLwogCiAJCQl0aGlzX2VsZW1lbnQgPSBvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKQEAgLTI5OSwxMyArMjkyLDEzIEBACiAJCQkgKiAocHJvY2VlZCB0byBuZXh0IGl0ZXJhdGlvbiBvZiBlbmNsb3NpbmcgZm9yIGxvb3ApIHNpZ25pZmllcyBhCiAJCQkgKiBub24tbWF0Y2guCiAJCQkgKi8KLQkJCWlmICghYWNwaV9leF9kb19tYXRjaCAoKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkJICAgdGhpc19lbGVtZW50LCBvcGVyYW5kWzJdKSkgeworCQkJaWYgKCFhY3BpX2V4X2RvX21hdGNoKCh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCisJCQkJCSAgICAgIHRoaXNfZWxlbWVudCwgb3BlcmFuZFsyXSkpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJaWYgKCFhY3BpX2V4X2RvX21hdGNoICgodTMyKSBvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlLAotCQkJCQkgICB0aGlzX2VsZW1lbnQsIG9wZXJhbmRbNF0pKSB7CisJCQlpZiAoIWFjcGlfZXhfZG9fbWF0Y2goKHUzMikgb3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJICAgICAgdGhpc19lbGVtZW50LCBvcGVyYW5kWzRdKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQogCkBAIC0zMTYsMzEgKzMwOSwyNyBAQAogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9MT0FEX1RBQkxFX09QOgogCi0JCXN0YXR1cyA9IGFjcGlfZXhfbG9hZF90YWJsZV9vcCAod2Fsa19zdGF0ZSwgJnJldHVybl9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9leF9sb2FkX3RhYmxlX29wKHdhbGtfc3RhdGUsICZyZXR1cm5fZGVzYyk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV82QV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocmV0dXJuX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwppbmRleCBjOWUzYzY4Li43NDc2YzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCkBAIC00MiwzMiArNDIsMjQgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHByZXAiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhwcmVwIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgdTMyCi1hY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmxhZ3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0dXJuX2J5dGVfYWxpZ25tZW50KTsKLQorYWNwaV9leF9kZWNvZGVfZmllbGRfYWNjZXNzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgIHU4IGZpZWxkX2ZsYWdzLCB1MzIgKiByZXR1cm5fYnl0ZV9hbGlnbm1lbnQpOwogCiAjaWZkZWYgQUNQSV9VTkRFUl9ERVZFTE9QTUVOVAogCiBzdGF0aWMgdTMyCi1hY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfb2Zmc2V0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYml0X2xlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9sZW5ndGgpOworYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3ModTMyIGZpZWxkX2JpdF9vZmZzZXQsCisJCQl1MzIgZmllbGRfYml0X2xlbmd0aCwgdTMyIHJlZ2lvbl9sZW5ndGgpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTkyLDM5ICs4NCwzNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHUzMgotYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYml0X29mZnNldCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbGVuZ3RoKQorYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3ModTMyIGZpZWxkX2JpdF9vZmZzZXQsCisJCQl1MzIgZmllbGRfYml0X2xlbmd0aCwgdTMyIHJlZ2lvbl9sZW5ndGgpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9ieXRlX2xlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2J5dGVfb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYnl0ZV9lbmRfb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2J5dGVfd2lkdGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9zdGFydF9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9lbmRfb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bV9hY2Nlc3Nfd2lkdGggPSAweEZGRkZGRkZGOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bV9hY2Nlc3NlcyA9IDB4RkZGRkZGRkY7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlczsKKwl1MzIgZmllbGRfYnl0ZV9sZW5ndGg7CisJdTMyIGZpZWxkX2J5dGVfb2Zmc2V0OworCXUzMiBmaWVsZF9ieXRlX2VuZF9vZmZzZXQ7CisJdTMyIGFjY2Vzc19ieXRlX3dpZHRoOworCXUzMiBmaWVsZF9zdGFydF9vZmZzZXQ7CisJdTMyIGZpZWxkX2VuZF9vZmZzZXQ7CisJdTMyIG1pbmltdW1fYWNjZXNzX3dpZHRoID0gMHhGRkZGRkZGRjsKKwl1MzIgbWluaW11bV9hY2Nlc3NlcyA9IDB4RkZGRkZGRkY7CisJdTMyIGFjY2Vzc2VzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZ2VuZXJhdGVfYWNjZXNzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9nZW5lcmF0ZV9hY2Nlc3MiKTsKIAogCS8qIFJvdW5kIEZpZWxkIHN0YXJ0IG9mZnNldCBhbmQgbGVuZ3RoIHRvICJtaW5pbWFsIiBieXRlIGJvdW5kYXJpZXMgKi8KIAotCWZpZWxkX2J5dGVfb2Zmc2V0ICA9IEFDUElfRElWXzggKEFDUElfUk9VTkRfRE9XTiAoZmllbGRfYml0X29mZnNldCwgOCkpOwotCWZpZWxkX2J5dGVfZW5kX29mZnNldCA9IEFDUElfRElWXzggKEFDUElfUk9VTkRfVVAgKGZpZWxkX2JpdF9sZW5ndGggKwotCQkJICAgZmllbGRfYml0X29mZnNldCwgOCkpOwotCWZpZWxkX2J5dGVfbGVuZ3RoICA9IGZpZWxkX2J5dGVfZW5kX29mZnNldCAtIGZpZWxkX2J5dGVfb2Zmc2V0OworCWZpZWxkX2J5dGVfb2Zmc2V0ID0gQUNQSV9ESVZfOChBQ1BJX1JPVU5EX0RPV04oZmllbGRfYml0X29mZnNldCwgOCkpOworCWZpZWxkX2J5dGVfZW5kX29mZnNldCA9IEFDUElfRElWXzgoQUNQSV9ST1VORF9VUChmaWVsZF9iaXRfbGVuZ3RoICsKKwkJCQkJCQkgZmllbGRfYml0X29mZnNldCwgOCkpOworCWZpZWxkX2J5dGVfbGVuZ3RoID0gZmllbGRfYnl0ZV9lbmRfb2Zmc2V0IC0gZmllbGRfYnl0ZV9vZmZzZXQ7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkiQml0IGxlbmd0aCAlZCwgQml0IG9mZnNldCAlZFxuIiwKLQkJCWZpZWxkX2JpdF9sZW5ndGgsIGZpZWxkX2JpdF9vZmZzZXQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkJpdCBsZW5ndGggJWQsIEJpdCBvZmZzZXQgJWRcbiIsCisJCQkgIGZpZWxkX2JpdF9sZW5ndGgsIGZpZWxkX2JpdF9vZmZzZXQpKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSJCeXRlIExlbmd0aCAlZCwgQnl0ZSBPZmZzZXQgJWQsIEVuZCBPZmZzZXQgJWRcbiIsCi0JCQlmaWVsZF9ieXRlX2xlbmd0aCwgZmllbGRfYnl0ZV9vZmZzZXQsIGZpZWxkX2J5dGVfZW5kX29mZnNldCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiQnl0ZSBMZW5ndGggJWQsIEJ5dGUgT2Zmc2V0ICVkLCBFbmQgT2Zmc2V0ICVkXG4iLAorCQkJICBmaWVsZF9ieXRlX2xlbmd0aCwgZmllbGRfYnl0ZV9vZmZzZXQsCisJCQkgIGZpZWxkX2J5dGVfZW5kX29mZnNldCkpOwogCiAJLyoKIAkgKiBJdGVyYXRpdmUgc2VhcmNoIGZvciB0aGUgbWF4aW11bSBhY2Nlc3Mgd2lkdGggdGhhdCBpcyBib3RoIGFsaWduZWQKQEAgLTEzMiw3ICsxMjEsOCBAQAogCSAqCiAJICogU3RhcnQgYXQgYnl0ZV9hY2MgYW5kIHdvcmsgdXB3YXJkcyB0byBxd29yZF9hY2MgbWF4LiAoMSwyLDQsOCBieXRlcykKIAkgKi8KLQlmb3IgKGFjY2Vzc19ieXRlX3dpZHRoID0gMTsgYWNjZXNzX2J5dGVfd2lkdGggPD0gODsgYWNjZXNzX2J5dGVfd2lkdGggPDw9IDEpIHsKKwlmb3IgKGFjY2Vzc19ieXRlX3dpZHRoID0gMTsgYWNjZXNzX2J5dGVfd2lkdGggPD0gODsKKwkgICAgIGFjY2Vzc19ieXRlX3dpZHRoIDw8PSAxKSB7CiAJCS8qCiAJCSAqIDEpIFJvdW5kIGVuZCBvZmZzZXQgdXAgdG8gbmV4dCBhY2Nlc3MgYm91bmRhcnkgYW5kIG1ha2Ugc3VyZSB0aGF0CiAJCSAqICAgIHRoaXMgZG9lcyBub3QgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhcmVudCByZWdpb24uCkBAIC0xNDAsMzEgKzEzMCwzNyBAQAogCQkgKiAgICBhcmUgZG9uZS4gKFRoaXMgZG9lcyBub3Qgb3B0aW1pemUgZm9yIHRoZSBwZXJmZWN0bHkgYWxpZ25lZAogCQkgKiAgICBjYXNlIHlldCkuCiAJCSAqLwotCQlpZiAoQUNQSV9ST1VORF9VUCAoZmllbGRfYnl0ZV9lbmRfb2Zmc2V0LCBhY2Nlc3NfYnl0ZV93aWR0aCkgPD0gcmVnaW9uX2xlbmd0aCkgeworCQlpZiAoQUNQSV9ST1VORF9VUChmaWVsZF9ieXRlX2VuZF9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSA8PQorCQkgICAgcmVnaW9uX2xlbmd0aCkgewogCQkJZmllbGRfc3RhcnRfb2Zmc2V0ID0KLQkJCQlBQ1BJX1JPVU5EX0RPV04gKGZpZWxkX2J5dGVfb2Zmc2V0LCBhY2Nlc3NfYnl0ZV93aWR0aCkgLwotCQkJCWFjY2Vzc19ieXRlX3dpZHRoOworCQkJICAgIEFDUElfUk9VTkRfRE9XTihmaWVsZF9ieXRlX29mZnNldCwKKwkJCQkJICAgIGFjY2Vzc19ieXRlX3dpZHRoKSAvCisJCQkgICAgYWNjZXNzX2J5dGVfd2lkdGg7CiAKIAkJCWZpZWxkX2VuZF9vZmZzZXQgPQotCQkJCUFDUElfUk9VTkRfVVAgKChmaWVsZF9ieXRlX2xlbmd0aCArIGZpZWxkX2J5dGVfb2Zmc2V0KSwKLQkJCQkJYWNjZXNzX2J5dGVfd2lkdGgpIC8gYWNjZXNzX2J5dGVfd2lkdGg7CisJCQkgICAgQUNQSV9ST1VORF9VUCgoZmllbGRfYnl0ZV9sZW5ndGggKworCQkJCQkgICBmaWVsZF9ieXRlX29mZnNldCksCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpIC8KKwkJCSAgICBhY2Nlc3NfYnl0ZV93aWR0aDsKIAogCQkJYWNjZXNzZXMgPSBmaWVsZF9lbmRfb2Zmc2V0IC0gZmllbGRfc3RhcnRfb2Zmc2V0OwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCSJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIHdpdGhpbiByZWdpb25cbiIsIGFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJICAiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyB3aXRoaW4gcmVnaW9uXG4iLAorCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJIkZpZWxkIFN0YXJ0ICVkLCBGaWVsZCBFbmQgJWQgLS0gcmVxdWlyZXMgJWQgYWNjZXNzZXNcbiIsCi0JCQkJCWZpZWxkX3N0YXJ0X29mZnNldCwgZmllbGRfZW5kX29mZnNldCwgYWNjZXNzZXMpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJGaWVsZCBTdGFydCAlZCwgRmllbGQgRW5kICVkIC0tIHJlcXVpcmVzICVkIGFjY2Vzc2VzXG4iLAorCQkJCQkgIGZpZWxkX3N0YXJ0X29mZnNldCwgZmllbGRfZW5kX29mZnNldCwKKwkJCQkJICBhY2Nlc3NlcykpOwogCiAJCQkvKiBTaW5nbGUgYWNjZXNzIGlzIG9wdGltYWwgKi8KIAogCQkJaWYgKGFjY2Vzc2VzIDw9IDEpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCSJFbnRpcmUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggb25lIG9wZXJhdGlvbiBvZiBzaXplICVkXG4iLAotCQkJCQlhY2Nlc3NfYnl0ZV93aWR0aCkpOwotCQkJCXJldHVybl9WQUxVRSAoYWNjZXNzX2J5dGVfd2lkdGgpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkJICAiRW50aXJlIGZpZWxkIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIG9uZSBvcGVyYXRpb24gb2Ygc2l6ZSAlZFxuIiwKKwkJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCQlyZXR1cm5fVkFMVUUoYWNjZXNzX2J5dGVfd2lkdGgpOwogCQkJfQogCiAJCQkvKgpAQCAtMTcyLDMwICsxNjgsMzAgQEAKIAkJCSAqIHRyeSB0aGUgbmV4dCB3aWRlciBhY2Nlc3Mgb24gbmV4dCBpdGVyYXRpb24KIAkJCSAqLwogCQkJaWYgKGFjY2Vzc2VzIDwgbWluaW11bV9hY2Nlc3NlcykgewotCQkJCW1pbmltdW1fYWNjZXNzZXMgICA9IGFjY2Vzc2VzOworCQkJCW1pbmltdW1fYWNjZXNzZXMgPSBhY2Nlc3NlczsKIAkJCQltaW5pbXVtX2FjY2Vzc193aWR0aCA9IGFjY2Vzc19ieXRlX3dpZHRoOwogCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCSJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIE5PVCB3aXRoaW4gcmVnaW9uXG4iLCBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCSAgImFjY2Vzc193aWR0aCAlZCBlbmQgaXMgTk9UIHdpdGhpbiByZWdpb25cbiIsCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJCWlmIChhY2Nlc3NfYnl0ZV93aWR0aCA9PSAxKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCQkJIkZpZWxkIGdvZXMgYmV5b25kIGVuZC1vZi1yZWdpb24hXG4iKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCQkgICJGaWVsZCBnb2VzIGJleW9uZCBlbmQtb2YtcmVnaW9uIVxuIikpOwogCiAJCQkJLyogRmllbGQgZG9lcyBub3QgZml0IGluIHRoZSByZWdpb24gYXQgYWxsICovCiAKLQkJCQlyZXR1cm5fVkFMVUUgKDApOworCQkJCXJldHVybl9WQUxVRSgwKTsKIAkJCX0KIAogCQkJLyoKIAkJCSAqIFRoaXMgd2lkdGggZ29lcyBiZXlvbmQgdGhlIGVuZC1vZi1yZWdpb24sIGJhY2sgb2ZmIHRvCiAJCQkgKiBwcmV2aW91cyBhY2Nlc3MKIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCQkiQmFja2luZyBvZmYgdG8gcHJldmlvdXMgb3B0aW1hbCBhY2Nlc3Mgd2lkdGggb2YgJWRcbiIsCi0JCQkJCW1pbmltdW1fYWNjZXNzX3dpZHRoKSk7Ci0JCQlyZXR1cm5fVkFMVUUgKG1pbmltdW1fYWNjZXNzX3dpZHRoKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJCYWNraW5nIG9mZiB0byBwcmV2aW91cyBvcHRpbWFsIGFjY2VzcyB3aWR0aCBvZiAlZFxuIiwKKwkJCQkJICBtaW5pbXVtX2FjY2Vzc193aWR0aCkpOworCQkJcmV0dXJuX1ZBTFVFKG1pbmltdW1fYWNjZXNzX3dpZHRoKTsKIAkJfQogCX0KIApAQCAtMjAzLDEyICsxOTksMTEgQEAKIAkgKiBDb3VsZCBub3QgcmVhZC93cml0ZSBmaWVsZCB3aXRoIG9uZSBvcGVyYXRpb24sCiAJICoganVzdCB1c2UgbWF4IGFjY2VzcyB3aWR0aAogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSJDYW5ub3QgYWNjZXNzIGZpZWxkIGluIG9uZSBvcGVyYXRpb24sIHVzaW5nIHdpZHRoIDhcbiIpKTsKLQlyZXR1cm5fVkFMVUUgKDgpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiQ2Fubm90IGFjY2VzcyBmaWVsZCBpbiBvbmUgb3BlcmF0aW9uLCB1c2luZyB3aWR0aCA4XG4iKSk7CisJcmV0dXJuX1ZBTFVFKDgpOwogfQotI2VuZGlmIC8qIEFDUElfVU5ERVJfREVWRUxPUE1FTlQgKi8KLQorI2VuZGlmCQkJCS8qIEFDUElfVU5ERVJfREVWRUxPUE1FTlQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMjYsMTggKzIyMSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHUzMgotYWNwaV9leF9kZWNvZGVfZmllbGRfYWNjZXNzICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZsYWdzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldHVybl9ieXRlX2FsaWdubWVudCkKK2FjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2Vzcyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICB1OCBmaWVsZF9mbGFncywgdTMyICogcmV0dXJuX2J5dGVfYWxpZ25tZW50KQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9hbGlnbm1lbnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfbGVuZ3RoOworCXUzMiBhY2Nlc3M7CisJdTMyIGJ5dGVfYWxpZ25tZW50OworCXUzMiBiaXRfbGVuZ3RoOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyIpOwogCiAJYWNjZXNzID0gKGZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0FDQ0VTU19UWVBFX01BU0spOwogCkBAIC0yNDYsOSArMjM3LDEyIEBACiAKICNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCiAJCWJ5dGVfYWxpZ25tZW50ID0KLQkJCWFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJCTB4RkZGRkZGRkYgLyogVGVtcCB1bnRpbCB3ZSBwYXNzIHJlZ2lvbl9sZW5ndGggYXMgcGFyYW1ldGVyICovKTsKKwkJICAgIGFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJCQkgICAgMHhGRkZGRkZGRgorCQkJCQkgICAgLyogVGVtcCB1bnRpbCB3ZSBwYXNzIHJlZ2lvbl9sZW5ndGggYXMgcGFyYW1ldGVyICovCisJCQkJCSAgICApOwogCQliaXRfbGVuZ3RoID0gYnl0ZV9hbGlnbm1lbnQgKiA4OwogI2VuZGlmCiAKQEAgLTI1NywzNiArMjUxLDM1IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfRklFTERfQUNDRVNTX0JZVEU6Ci0JY2FzZSBBTUxfRklFTERfQUNDRVNTX0JVRkZFUjogICAvKiBBQ1BJIDIuMCAoU01CdXMgQnVmZmVyKSAqLworCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19CVUZGRVI6CS8qIEFDUEkgMi4wIChTTUJ1cyBCdWZmZXIpICovCiAJCWJ5dGVfYWxpZ25tZW50ID0gMTsKLQkJYml0X2xlbmd0aCAgICA9IDg7CisJCWJpdF9sZW5ndGggPSA4OwogCQlicmVhazsKIAogCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19XT1JEOgogCQlieXRlX2FsaWdubWVudCA9IDI7Ci0JCWJpdF9sZW5ndGggICAgPSAxNjsKKwkJYml0X2xlbmd0aCA9IDE2OwogCQlicmVhazsKIAogCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19EV09SRDoKIAkJYnl0ZV9hbGlnbm1lbnQgPSA0OwotCQliaXRfbGVuZ3RoICAgID0gMzI7CisJCWJpdF9sZW5ndGggPSAzMjsKIAkJYnJlYWs7CiAKLQljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfUVdPUkQ6ICAgIC8qIEFDUEkgMi4wICovCisJY2FzZSBBTUxfRklFTERfQUNDRVNTX1FXT1JEOgkvKiBBQ1BJIDIuMCAqLwogCQlieXRlX2FsaWdubWVudCA9IDg7Ci0JCWJpdF9sZW5ndGggICAgPSA2NDsKKwkJYml0X2xlbmd0aCA9IDY0OwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCS8qIEludmFsaWQgZmllbGQgYWNjZXNzIHR5cGUgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmtub3duIGZpZWxkIGFjY2VzcyB0eXBlICVYXG4iLAotCQkJYWNjZXNzKSk7Ci0JCXJldHVybl9WQUxVRSAoMCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5rbm93biBmaWVsZCBhY2Nlc3MgdHlwZSAlWFxuIiwgYWNjZXNzKSk7CisJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKSB7CisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKSB7CiAJCS8qCiAJCSAqIGJ1ZmZlcl9maWVsZCBhY2Nlc3MgY2FuIGJlIG9uIGFueSBieXRlIGJvdW5kYXJ5LCBzbyB0aGUKIAkJICogYnl0ZV9hbGlnbm1lbnQgaXMgYWx3YXlzIDEgYnl0ZSAtLSByZWdhcmRsZXNzIG9mIGFueSBieXRlX2FsaWdubWVudApAQCAtMjk2LDEwICsyODksOSBAQAogCX0KIAogCSpyZXR1cm5fYnl0ZV9hbGlnbm1lbnQgPSBieXRlX2FsaWdubWVudDsKLQlyZXR1cm5fVkFMVUUgKGJpdF9sZW5ndGgpOworCXJldHVybl9WQUxVRShiaXRfbGVuZ3RoKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdApAQCAtMzIyLDIwICszMTQsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFncywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2F0dHJpYnV0ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGgpCithY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCQkgdTggZmllbGRfZmxhZ3MsCisJCQkJIHU4IGZpZWxkX2F0dHJpYnV0ZSwKKwkJCQkgdTMyIGZpZWxkX2JpdF9wb3NpdGlvbiwgdTMyIGZpZWxkX2JpdF9sZW5ndGgpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfYml0X3dpZHRoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9hbGlnbm1lbnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWFyZXN0X2J5dGVfYWRkcmVzczsKKwl1MzIgYWNjZXNzX2JpdF93aWR0aDsKKwl1MzIgYnl0ZV9hbGlnbm1lbnQ7CisJdTMyIG5lYXJlc3RfYnl0ZV9hZGRyZXNzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QiKTsKIAogCS8qCiAJICogTm90ZTogdGhlIHN0cnVjdHVyZSBiZWluZyBpbml0aWFsaXplZCBpcyB0aGUKQEAgLTM2MSwxNiArMzQ5LDE2IEBACiAJICogRm9yIGFsbCBvdGhlciBhY2Nlc3MgdHlwZXMgKEJ5dGUsIFdvcmQsIER3b3JkLCBRd29yZCksIHRoZSBCaXR3aWR0aCBpcwogCSAqIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhcyB0aGUgYnl0ZV9hbGlnbm1lbnQuCiAJICovCi0JYWNjZXNzX2JpdF93aWR0aCA9IGFjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyAob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLAotCQkJICAmYnl0ZV9hbGlnbm1lbnQpOworCWFjY2Vzc19iaXRfd2lkdGggPSBhY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3Mob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLAorCQkJCQkJICAgICAgICZieXRlX2FsaWdubWVudCk7CiAJaWYgKCFhY2Nlc3NfYml0X3dpZHRoKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVkFMVUUpOwogCX0KIAogCS8qIFNldHVwIHdpZHRoIChhY2Nlc3MgZ3JhbnVsYXJpdHkpIGZpZWxkcyAqLwogCiAJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCA9ICh1OCkKLQkJCUFDUElfRElWXzggKGFjY2Vzc19iaXRfd2lkdGgpOyAgICAgICAgICAvKiAxLCAgMiwgIDQsICA4ICovCisJICAgIEFDUElfRElWXzgoYWNjZXNzX2JpdF93aWR0aCk7CS8qIDEsICAyLCAgNCwgIDggKi8KIAogCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCA9ICh1OCkgYWNjZXNzX2JpdF93aWR0aDsKIApAQCAtMzg1LDMwICszNzMsMzAgQEAKIAkgKiByZWdpb24gb3IgYnVmZmVyLgogCSAqLwogCW5lYXJlc3RfYnl0ZV9hZGRyZXNzID0KLQkJCUFDUElfUk9VTkRfQklUU19ET1dOX1RPX0JZVEVTIChmaWVsZF9iaXRfcG9zaXRpb24pOworCSAgICBBQ1BJX1JPVU5EX0JJVFNfRE9XTl9UT19CWVRFUyhmaWVsZF9iaXRfcG9zaXRpb24pOwogCW9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCA9ICh1MzIpCi0JCQlBQ1BJX1JPVU5EX0RPV04gKG5lYXJlc3RfYnl0ZV9hZGRyZXNzLCBieXRlX2FsaWdubWVudCk7CisJICAgIEFDUElfUk9VTkRfRE9XTihuZWFyZXN0X2J5dGVfYWRkcmVzcywgYnl0ZV9hbGlnbm1lbnQpOwogCiAJLyoKIAkgKiBzdGFydF9maWVsZF9iaXRfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJpdCBvZiB0aGUgZmllbGQgd2l0aGluCiAJICogYSBmaWVsZCBkYXR1bS4KIAkgKi8KIAlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQgPSAodTgpCi0JCShmaWVsZF9iaXRfcG9zaXRpb24gLSBBQ1BJX01VTF84IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKKwkgICAgKGZpZWxkX2JpdF9wb3NpdGlvbiAtCisJICAgICBBQ1BJX01VTF84KG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCkpOwogCiAJLyoKIAkgKiBEb2VzIHRoZSBlbnRpcmUgZmllbGQgZml0IHdpdGhpbiBhIHNpbmdsZSBmaWVsZCBhY2Nlc3MgZWxlbWVudD8gKGRhdHVtKQogCSAqIChpLmUuLCB3aXRob3V0IGNyb3NzaW5nIGEgZGF0dW0gYm91bmRhcnkpCiAJICovCi0JaWYgKChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQgKyBmaWVsZF9iaXRfbGVuZ3RoKSA8PQotCQkJKHUxNikgYWNjZXNzX2JpdF93aWR0aCkgeworCWlmICgob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0ICsKKwkgICAgIGZpZWxkX2JpdF9sZW5ndGgpIDw9ICh1MTYpIGFjY2Vzc19iaXRfd2lkdGgpIHsKIAkJb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyB8PSBBT1BPQkpfU0lOR0xFX0RBVFVNOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlCkBAIC00MjIsNTEgKzQxMCw0OSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUgKAotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8pCithY3BpX3N0YXR1cyBhY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8pCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXUzMiB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3ByZXBfZmllbGRfdmFsdWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3ByZXBfZmllbGRfdmFsdWUiKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoaW5mby0+ZmllbGRfdHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQpIHsKIAkJaWYgKCFpbmZvLT5yZWdpb25fbm9kZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIHJlZ2lvbl9ub2RlXG4iKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOdWxsIHJlZ2lvbl9ub2RlXG4iKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCQl9CiAKLQkJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKGluZm8tPnJlZ2lvbl9ub2RlKTsKKwkJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoaW5mby0+cmVnaW9uX25vZGUpOwogCQlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiTmVlZGVkIFJlZ2lvbiwgZm91bmQgdHlwZSAlWCAoJXMpXG4iLAotCQkJCXR5cGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKVxuIiwKKwkJCQkJICB0eXBlLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCX0KIAogCS8qIEFsbG9jYXRlIGEgbmV3IGZpZWxkIG9iamVjdCAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKGluZm8tPmZpZWxkX3R5cGUpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KGluZm8tPmZpZWxkX3R5cGUpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIGFyZWFzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBmaWVsZHMgKi8KIAogCW9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSA9IGluZm8tPmZpZWxkX25vZGU7Ci0Jc3RhdHVzID0gYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QgKG9ial9kZXNjLCBpbmZvLT5maWVsZF9mbGFncywKLQkJCSBpbmZvLT5hdHRyaWJ1dGUsIGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiwgaW5mby0+ZmllbGRfYml0X2xlbmd0aCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAob2JqX2Rlc2MpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3Qob2JqX2Rlc2MsIGluZm8tPmZpZWxkX2ZsYWdzLAorCQkJCQkJICBpbmZvLT5hdHRyaWJ1dGUsCisJCQkJCQkgIGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiwKKwkJCQkJCSAgaW5mby0+ZmllbGRfYml0X2xlbmd0aCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSBhcmVhcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBmaWVsZCB0eXBlICovCkBAIC00NzQsNzEgKzQ2MCw3MyBAQAogCXN3aXRjaCAoaW5mby0+ZmllbGRfdHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAotCQlvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaW9uX25vZGUpOworCQlvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiA9CisJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoaW5mby0+cmVnaW9uX25vZGUpOwogCiAJCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgY29udGFpbmVyICovCiAKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaik7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaik7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJInJlZ2lvbl9maWVsZDogYml0X29mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXBcbiIsCi0JCQlvYmpfZGVzYy0+ZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwgb2JqX2Rlc2MtPmZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCi0JCQlvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsIG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCSAgInJlZ2lvbl9maWVsZDogYml0X29mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXBcbiIsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCQkgIG9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAKLQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUgICA9IGluZm8tPmJhbmtfdmFsdWU7Ci0JCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAotCQkJCSBpbmZvLT5yZWdpb25fbm9kZSk7Ci0JCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQkJCQkgaW5mby0+cmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlID0gaW5mby0+YmFua192YWx1ZTsKKwkJb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiA9CisJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoaW5mby0+cmVnaW9uX25vZGUpOworCQlvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiA9CisJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoaW5mby0+cmVnaXN0ZXJfbm9kZSk7CiAKIAkJLyogQW4gYWRkaXRpb25hbCByZWZlcmVuY2UgZm9yIHRoZSBhdHRhY2hlZCBvYmplY3RzICovCiAKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqKTsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqKTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkiQmFuayBGaWVsZDogYml0X29mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXAsIGJhbmtfcmVnICVwXG4iLAotCQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCi0JCQlvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQlvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqLAotCQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmopKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiQmFuayBGaWVsZDogYml0X29mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXAsIGJhbmtfcmVnICVwXG4iLAorCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCQkgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICBvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqLAorCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmopKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAotCQkJCSBpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKLQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQkJCQkgaW5mby0+ZGF0YV9yZWdpc3Rlcl9ub2RlKTsKLQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlICA9ICh1MzIpCi0JCQkoaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uIC8gQUNQSV9NVUxfOCAoCi0JCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmogPQorCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lzdGVyX25vZGUpOworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmogPQorCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSA9ICh1MzIpCisJCSAgICAoaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uIC8KKwkJICAgICBBQ1BJX01VTF84KG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOwogCi0JCWlmICghb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqIHx8ICFvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOdWxsIEluZGV4IE9iamVjdCBkdXJpbmcgZmllbGQgcHJlcFxuIikpOwotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9ial9kZXNjKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKKwkJaWYgKCFvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmoKKwkJICAgIHx8ICFvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk51bGwgSW5kZXggT2JqZWN0IGR1cmluZyBmaWVsZCBwcmVwXG4iKSk7CisJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAkJfQogCiAJCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgYXR0YWNoZWQgb2JqZWN0cyAqLwogCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqKTsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaik7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkiaW5kZXhfZmllbGQ6IGJpdF9vZmYgJVgsIE9mZiAlWCwgVmFsdWUgJVgsIEdyYW4gJVgsIEluZGV4ICVwLCBEYXRhICVwXG4iLAotCQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSwKLQkJCW9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCi0JCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiaW5kZXhfZmllbGQ6IGJpdF9vZmYgJVgsIE9mZiAlWCwgVmFsdWUgJVgsIEdyYW4gJVgsIEluZGV4ICVwLCBEYXRhICVwXG4iLAorCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSwKKwkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCisJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTUwLDE1ICs1MzgsMTYgQEAKIAkgKiBTdG9yZSB0aGUgY29uc3RydWN0ZWQgZGVzY3JpcHRvciAob2JqX2Rlc2MpIGludG8gdGhlIHBhcmVudCBOb2RlLAogCSAqIHByZXNlcnZpbmcgdGhlIGN1cnJlbnQgdHlwZSBvZiB0aGF0IG5hbWVkX29iai4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKGluZm8tPmZpZWxkX25vZGUsIG9ial9kZXNjLAotCQkJICBhY3BpX25zX2dldF90eXBlIChpbmZvLT5maWVsZF9ub2RlKSk7CisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KGluZm8tPmZpZWxkX25vZGUsIG9ial9kZXNjLAorCQkJCSAgICAgICBhY3BpX25zX2dldF90eXBlKGluZm8tPmZpZWxkX25vZGUpKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwgIlNldCBuYW1lZF9vYmogJXAgWyU0LjRzXSwgb2JqX2Rlc2MgJXBcbiIsCi0JCQlpbmZvLT5maWVsZF9ub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKGluZm8tPmZpZWxkX25vZGUpLCBvYmpfZGVzYykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiU2V0IG5hbWVkX29iaiAlcCBbJTQuNHNdLCBvYmpfZGVzYyAlcFxuIiwKKwkJCSAgaW5mby0+ZmllbGRfbm9kZSwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGluZm8tPmZpZWxkX25vZGUpLCBvYmpfZGVzYykpOwogCiAJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwppbmRleCA3MjNhYWVmLi45YTJmNWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwpAQCAtNDIsMTQgKzQyLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlZ2lvbiIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4cmVnaW9uIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OCwyNyArNjUsMjMgQEAKICAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgU3lzdGVtIE1lbW9yeSBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpCithY3BpX2V4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCSAgICB1MzIgYml0X3dpZHRoLAorCQkJCSAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfYWRkcl9wdHIgPSBOVUxMOwotCXN0cnVjdCBhY3BpX21lbV9zcGFjZV9jb250ZXh0ICAgKm1lbV9pbmZvID0gcmVnaW9uX2NvbnRleHQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dfc2l6ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl2b2lkICpsb2dpY2FsX2FkZHJfcHRyID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCAqbWVtX2luZm8gPSByZWdpb25fY29udGV4dDsKKwl1MzIgbGVuZ3RoOworCWFjcGlfc2l6ZSB3aW5kb3dfc2l6ZTsKICNpZm5kZWYgQUNQSV9NSVNBTElHTkVEX1RSQU5TRkVSUwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyOworCXUzMiByZW1haW5kZXI7CiAjZW5kaWYKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlciIpOwogCiAJLyogVmFsaWRhdGUgYW5kIHRyYW5zbGF0ZSB0aGUgYml0IHdpZHRoICovCiAKQEAgLTExMCw5ICsxMDMsMTAgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgc3lzdGVtX21lbW9yeSB3aWR0aCAlZFxuIiwKLQkJCWJpdF93aWR0aCkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIHN5c3RlbV9tZW1vcnkgd2lkdGggJWRcbiIsCisJCQkJICBiaXRfd2lkdGgpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKIAl9CiAKICNpZm5kZWYgQUNQSV9NSVNBTElHTkVEX1RSQU5TRkVSUwpAQCAtMTIwLDkgKzExNCwxMCBAQAogCSAqIEhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgbm9uLWFsaWduZWQgZGF0YSB0cmFuc2ZlcnMsIHdlIG11c3QgdmVyaWZ5CiAJICogdGhlIHJlcXVlc3QuCiAJICovCi0JKHZvaWQpIGFjcGlfdXRfc2hvcnRfZGl2aWRlICgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzLCBsZW5ndGgsIE5VTEwsICZyZW1haW5kZXIpOworCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKChhY3BpX2ludGVnZXIpIGFkZHJlc3MsIGxlbmd0aCwgTlVMTCwKKwkJCQkgICAmcmVtYWluZGVyKTsKIAlpZiAocmVtYWluZGVyICE9IDApIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQUxJR05NRU5UKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9BTElHTk1FTlQpOwogCX0KICNlbmRpZgogCkBAIC0xMzIsOSArMTI3LDEwIEBACiAJICogICAgMikgQWRkcmVzcyBiZXlvbmQgdGhlIGN1cnJlbnQgbWFwcGluZz8KIAkgKi8KIAlpZiAoKGFkZHJlc3MgPCBtZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MpIHx8Ci0JCSgoKGFjcGlfaW50ZWdlcikgYWRkcmVzcyArIGxlbmd0aCkgPgotCQkJKChhY3BpX2ludGVnZXIpCi0JCQltZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgKyBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkpKSB7CisJICAgICgoKGFjcGlfaW50ZWdlcikgYWRkcmVzcyArIGxlbmd0aCkgPiAoKGFjcGlfaW50ZWdlcikKKwkJCQkJCSAgbWVtX2luZm8tPgorCQkJCQkJICBtYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyArCisJCQkJCQkgIG1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoKSkpIHsKIAkJLyoKIAkJICogVGhlIHJlcXVlc3QgY2Fubm90IGJlIHJlc29sdmVkIGJ5IHRoZSBjdXJyZW50IG1lbW9yeSBtYXBwaW5nOwogCQkgKiBEZWxldGUgdGhlIGV4aXN0aW5nIG1hcHBpbmcgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuCkBAIC0xNDIsOCArMTM4LDggQEAKIAkJaWYgKG1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoKSB7CiAJCQkvKiBWYWxpZCBtYXBwaW5nLCBkZWxldGUgaXQgKi8KIAotCQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKG1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzLAotCQkJCQkgICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCk7CisJCQlhY3BpX29zX3VubWFwX21lbW9yeShtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcywKKwkJCQkJICAgICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCk7CiAJCX0KIAogCQkvKgpAQCAtMTUxLDcgKzE0Nyw3IEBACiAJCSAqIGNvbnN0cmFpbiB0aGUgbWF4aW11bSBtYXBwaW5nIHNpemUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCiAJCSAqLwogCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpCi0JCQkoKG1lbV9pbmZvLT5hZGRyZXNzICsgbWVtX2luZm8tPmxlbmd0aCkgLSBhZGRyZXNzKTsKKwkJICAgICgobWVtX2luZm8tPmFkZHJlc3MgKyBtZW1faW5mby0+bGVuZ3RoKSAtIGFkZHJlc3MpOwogCiAJCWlmICh3aW5kb3dfc2l6ZSA+IEFDUElfU1lTTUVNX1JFR0lPTl9XSU5ET1dfU0laRSkgewogCQkJd2luZG93X3NpemUgPSBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkU7CkBAIC0xNTksMTQgKzE1NSwxNiBAQAogCiAJCS8qIENyZWF0ZSBhIG5ldyBtYXBwaW5nIHN0YXJ0aW5nIGF0IHRoZSBhZGRyZXNzIGdpdmVuICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLCB3aW5kb3dfc2l6ZSwKLQkJCQkgICh2b2lkICoqKSAmbWVtX2luZm8tPm1hcHBlZF9sb2dpY2FsX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWFxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLCAodTMyKSB3aW5kb3dfc2l6ZSkpOworCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgd2luZG93X3NpemUsCisJCQkJCSAgICAodm9pZCAqKikmbWVtX2luZm8tPgorCQkJCQkgICAgbWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWFxuIiwKKwkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCisJCQkJCSAgKHUzMikgd2luZG93X3NpemUpKTsKIAkJCW1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoID0gMDsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogU2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgbWFwcGluZyBzaXplICovCkBAIC0xODAsNDIgKzE3OCw0MSBAQAogCSAqIGFjY2VzcwogCSAqLwogCWxvZ2ljYWxfYWRkcl9wdHIgPSBtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyArCi0JCQkgICAoKGFjcGlfaW50ZWdlcikgYWRkcmVzcyAtCi0JCQkJCSAgKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKTsKKwkgICAgKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgLQorCSAgICAgKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkic3lzdGVtX21lbW9yeSAlZCAoJWQgd2lkdGgpIEFkZHJlc3M9JTguOFglOC44WFxuIiwKLQkJCWZ1bmN0aW9uLCBiaXRfd2lkdGgsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAic3lzdGVtX21lbW9yeSAlZCAoJWQgd2lkdGgpIEFkZHJlc3M9JTguOFglOC44WFxuIiwKKwkJCSAgZnVuY3Rpb24sIGJpdF93aWR0aCwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpKSk7CiAKLSAgIC8qCi0JKiBQZXJmb3JtIHRoZSBtZW1vcnkgcmVhZCBvciB3cml0ZQotCSoKLQkqIE5vdGU6IEZvciBtYWNoaW5lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IG5vbi1hbGlnbmVkIHRyYW5zZmVycywgdGhlIHRhcmdldAotCSogYWRkcmVzcyB3YXMgY2hlY2tlZCBmb3IgYWxpZ25tZW50IGFib3ZlLiAgV2UgZG8gbm90IGF0dGVtcHQgdG8gYnJlYWsgdGhlCi0JKiB0cmFuc2ZlciB1cCBpbnRvIHNtYWxsZXIgKGJ5dGUtc2l6ZSkgY2h1bmtzIGJlY2F1c2UgdGhlIEFNTCBzcGVjaWZpY2FsbHkKLQkqIGFza2VkIGZvciBhIHRyYW5zZmVyIHdpZHRoIHRoYXQgdGhlIGhhcmR3YXJlIG1heSByZXF1aXJlLgotCSovCisJLyoKKwkgKiBQZXJmb3JtIHRoZSBtZW1vcnkgcmVhZCBvciB3cml0ZQorCSAqCisJICogTm90ZTogRm9yIG1hY2hpbmVzIHRoYXQgZG8gbm90IHN1cHBvcnQgbm9uLWFsaWduZWQgdHJhbnNmZXJzLCB0aGUgdGFyZ2V0CisJICogYWRkcmVzcyB3YXMgY2hlY2tlZCBmb3IgYWxpZ25tZW50IGFib3ZlLiAgV2UgZG8gbm90IGF0dGVtcHQgdG8gYnJlYWsgdGhlCisJICogdHJhbnNmZXIgdXAgaW50byBzbWFsbGVyIChieXRlLXNpemUpIGNodW5rcyBiZWNhdXNlIHRoZSBBTUwgc3BlY2lmaWNhbGx5CisJICogYXNrZWQgZm9yIGEgdHJhbnNmZXIgd2lkdGggdGhhdCB0aGUgaGFyZHdhcmUgbWF5IHJlcXVpcmUuCisJICovCiAJc3dpdGNoIChmdW5jdGlvbikgewogCWNhc2UgQUNQSV9SRUFEOgogCiAJCSp2YWx1ZSA9IDA7CiAJCXN3aXRjaCAoYml0X3dpZHRoKSB7CiAJCWNhc2UgODoKLQkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpICooKHU4ICopIGxvZ2ljYWxfYWRkcl9wdHIpOworCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKiAoKHU4ICopIGxvZ2ljYWxfYWRkcl9wdHIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAxNjoKLQkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpICooKHUxNiAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpICogKCh1MTYgKikgbG9naWNhbF9hZGRyX3B0cik7CiAJCQlicmVhazsKIAogCQljYXNlIDMyOgotCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKigodTMyICopIGxvZ2ljYWxfYWRkcl9wdHIpOworCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKiAoKHUzMiAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKIAkJCWJyZWFrOwogCiAjaWYgQUNQSV9NQUNISU5FX1dJRFRIICE9IDE2CiAJCWNhc2UgNjQ6Ci0JCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSAqKCh1NjQgKikgbG9naWNhbF9hZGRyX3B0cik7CisJCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSAqICgodTY0ICopIGxvZ2ljYWxfYWRkcl9wdHIpOwogCQkJYnJlYWs7CiAjZW5kaWYKIAkJZGVmYXVsdDoKQEAgLTIyOCwyMCArMjI1LDIwIEBACiAKIAkJc3dpdGNoIChiaXRfd2lkdGgpIHsKIAkJY2FzZSA4OgotCQkJKih1OCAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHU4KSAqdmFsdWU7CisJCQkqKHU4ICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTgpICogdmFsdWU7CiAJCQlicmVhazsKIAogCQljYXNlIDE2OgotCQkJKih1MTYgKikgbG9naWNhbF9hZGRyX3B0ciA9ICh1MTYpICp2YWx1ZTsKKwkJCSoodTE2ICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTE2KSAqIHZhbHVlOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAzMjoKLQkJCSoodTMyICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTMyKSAqdmFsdWU7CisJCQkqKHUzMiAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHUzMikgKiB2YWx1ZTsKIAkJCWJyZWFrOwogCiAjaWYgQUNQSV9NQUNISU5FX1dJRFRIICE9IDE2CiAJCWNhc2UgNjQ6Ci0JCQkqKHU2NCAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHU2NCkgKnZhbHVlOworCQkJKih1NjQgKikgbG9naWNhbF9hZGRyX3B0ciA9ICh1NjQpICogdmFsdWU7CiAJCQlicmVhazsKICNlbmRpZgogCkBAIC0yNTYsMTAgKzI1Myw5IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyCkBAIC0yNzksMzkgKzI3NSwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX2lvX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCkKK2FjcGlfZXhfc3lzdGVtX2lvX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCXUzMiBiaXRfd2lkdGgsCisJCQkJYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkJdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzMjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgdmFsdWUzMjsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfc3lzdGVtX2lvX3NwYWNlX2hhbmRsZXIiKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCSJzeXN0ZW1faU8gJWQgKCVkIHdpZHRoKSBBZGRyZXNzPSU4LjhYJTguOFhcbiIsIGZ1bmN0aW9uLCBiaXRfd2lkdGgsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAic3lzdGVtX2lPICVkICglZCB3aWR0aCkgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAorCQkJICBmdW5jdGlvbiwgYml0X3dpZHRoLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpKTsKIAogCS8qIERlY29kZSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyICovCiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CiAKLQkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BvcnQgKChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsCi0JCQkJICZ2YWx1ZTMyLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICAmdmFsdWUzMiwgYml0X3dpZHRoKTsKIAkJKnZhbHVlID0gdmFsdWUzMjsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfV1JJVEU6CiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0ICgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAotCQkJCSAodTMyKSAqdmFsdWUsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICAgKHUzMikgKiB2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzE5LDEwICszMTEsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9wY2lfY29uZmlnX3NwYWNlX2hhbmRsZXIKQEAgLTM0MiwyMSArMzMzLDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9wY2lfY29uZmlnX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCkKK2FjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJIHUzMiBiaXRfd2lkdGgsCisJCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqcGNpX2lkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3JlZ2lzdGVyOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkOworCXUxNiBwY2lfcmVnaXN0ZXI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9wY2lfY29uZmlnX3NwYWNlX2hhbmRsZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlciIpOwogCiAJLyoKIAkgKiAgVGhlIGFyZ3VtZW50cyB0byBhY3BpX29zKFJlYWR8V3JpdGUpcGNpX2NvbmZpZ3VyYXRpb24gYXJlOgpAQCAtMzcwLDI2ICszNTcsMjYgQEAKIAkgKiAgVmFsdWUgLSBpbnB1dCB2YWx1ZSBmb3Igd3JpdGUsIG91dHB1dCBhZGRyZXNzIGZvciByZWFkCiAJICoKIAkgKi8KLQlwY2lfaWQgICAgICA9IChzdHJ1Y3QgYWNwaV9wY2lfaWQgKikgcmVnaW9uX2NvbnRleHQ7CisJcGNpX2lkID0gKHN0cnVjdCBhY3BpX3BjaV9pZCAqKXJlZ2lvbl9jb250ZXh0OwogCXBjaV9yZWdpc3RlciA9ICh1MTYpICh1MzIpIGFkZHJlc3M7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkicGNpX2NvbmZpZyAlZCAoJWQpIFNlZyglMDR4KSBCdXMoJTA0eCkgRGV2KCUwNHgpIEZ1bmMoJTA0eCkgUmVnKCUwNHgpXG4iLAotCQlmdW5jdGlvbiwgYml0X3dpZHRoLCBwY2lfaWQtPnNlZ21lbnQsIHBjaV9pZC0+YnVzLCBwY2lfaWQtPmRldmljZSwKLQkJcGNpX2lkLT5mdW5jdGlvbiwgcGNpX3JlZ2lzdGVyKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAicGNpX2NvbmZpZyAlZCAoJWQpIFNlZyglMDR4KSBCdXMoJTA0eCkgRGV2KCUwNHgpIEZ1bmMoJTA0eCkgUmVnKCUwNHgpXG4iLAorCQkJICBmdW5jdGlvbiwgYml0X3dpZHRoLCBwY2lfaWQtPnNlZ21lbnQsIHBjaV9pZC0+YnVzLAorCQkJICBwY2lfaWQtPmRldmljZSwgcGNpX2lkLT5mdW5jdGlvbiwgcGNpX3JlZ2lzdGVyKSk7CiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CiAKIAkJKnZhbHVlID0gMDsKLQkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uIChwY2lfaWQsIHBjaV9yZWdpc3RlciwKLQkJCQkgdmFsdWUsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIHBjaV9yZWdpc3RlciwKKwkJCQkJCQl2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfV1JJVEU6CiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbiAocGNpX2lkLCBwY2lfcmVnaXN0ZXIsCi0JCQkJICp2YWx1ZSwgYml0X3dpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIHBjaV9yZWdpc3RlciwKKwkJCQkJCQkgKnZhbHVlLCBiaXRfd2lkdGgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zOTgsMTAgKzM4NSw5IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2Ntb3Nfc3BhY2VfaGFuZGxlcgpAQCAtNDIxLDI0ICs0MDcsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2Ntb3Nfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KQorYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkgICB1MzIgYml0X3dpZHRoLAorCQkJICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jbW9zX3NwYWNlX2hhbmRsZXIiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9jbW9zX3NwYWNlX2hhbmRsZXIiKTsKLQotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyCkBAIC00NTgsMjQgKzQzOSwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpCithY3BpX2V4X3BjaV9iYXJfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgIHUzMiBiaXRfd2lkdGgsCisJCQkgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3BjaV9iYXJfc3BhY2VfaGFuZGxlciIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3BjaV9iYXJfc3BhY2VfaGFuZGxlciIpOwotCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kYXRhX3RhYmxlX3NwYWNlX2hhbmRsZXIKQEAgLTQ5NSwyNCArNDcxLDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9kYXRhX3RhYmxlX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCkKK2FjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJIHUzMiBiaXRfd2lkdGgsCisJCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3dpZHRoID0gQUNQSV9ESVZfOCAoYml0X3dpZHRoKTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9naWNhbF9hZGRyX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgYnl0ZV93aWR0aCA9IEFDUElfRElWXzgoYml0X3dpZHRoKTsKKwl1MzIgaTsKKwljaGFyICpsb2dpY2FsX2FkZHJfcHRyOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyIik7Ci0KLQotCWxvZ2ljYWxfYWRkcl9wdHIgPSBBQ1BJX1BIWVNBRERSX1RPX1BUUiAoYWRkcmVzcyk7CisJbG9naWNhbF9hZGRyX3B0ciA9IEFDUElfUEhZU0FERFJfVE9fUFRSKGFkZHJlc3MpOwogCiAJLyogUGVyZm9ybSB0aGUgbWVtb3J5IHJlYWQgb3Igd3JpdGUgKi8KIApAQCAtNTIwLDE3ICs0OTIsMTUgQEAKIAljYXNlIEFDUElfUkVBRDoKIAogCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZV93aWR0aDsgaSsrKSB7Ci0JCQkoKGNoYXIgKikgdmFsdWUpIFtpXSA9IGxvZ2ljYWxfYWRkcl9wdHJbaV07CisJCQkoKGNoYXIgKil2YWx1ZSlbaV0gPSBsb2dpY2FsX2FkZHJfcHRyW2ldOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCWRlZmF1bHQ6CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCmluZGV4IDIxZDVjNzQuLmZmNWQ4ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCkBAIC00Miw3ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KQEAgLTUwLDEwICs0OSw4IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc250ZSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4cmVzbnRlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04MCw0MSArNzcsMzcgQEAKICAqICAgICAgQUNQSV9UWVBFX1BBQ0tBR0UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipvYmplY3RfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCi0KK2FjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqb2JqZWN0X3B0ciwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIGVudHJ5X3R5cGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfb2JqZWN0X3R5cGUgZW50cnlfdHlwZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3Jlc29sdmVfbm9kZV90b192YWx1ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlIik7CiAKIAkvKgogCSAqIFRoZSBzdGFjayBwb2ludGVyIHBvaW50cyB0byBhIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIChOb2RlKS4gIEdldCB0aGUKIAkgKiBvYmplY3QgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgTm9kZS4KIAkgKi8KLQlub2RlICAgICAgID0gKm9iamVjdF9wdHI7Ci0Jc291cmNlX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwotCWVudHJ5X3R5cGUgPSBhY3BpX25zX2dldF90eXBlICgoYWNwaV9oYW5kbGUpIG5vZGUpOworCW5vZGUgPSAqb2JqZWN0X3B0cjsKKwlzb3VyY2VfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwllbnRyeV90eXBlID0gYWNwaV9uc19nZXRfdHlwZSgoYWNwaV9oYW5kbGUpIG5vZGUpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIkVudHJ5PSVwIHNvdXJjZV9kZXNjPSVwIFslc11cbiIsCi0JCSBub2RlLCBzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChlbnRyeV90eXBlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkVudHJ5PSVwIHNvdXJjZV9kZXNjPSVwIFslc11cbiIsCisJCQkgIG5vZGUsIHNvdXJjZV9kZXNjLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoZW50cnlfdHlwZSkpKTsKIAogCWlmICgoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHx8Ci0JCShlbnRyeV90eXBlID09IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpKSB7CisJICAgIChlbnRyeV90eXBlID09IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpKSB7CiAJCS8qIFRoZXJlIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLwogCi0JCW5vZGUgICAgICAgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgbm9kZS0+b2JqZWN0KTsKLQkJc291cmNlX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwotCQllbnRyeV90eXBlID0gYWNwaV9uc19nZXRfdHlwZSAoKGFjcGlfaGFuZGxlKSBub2RlKTsKKwkJbm9kZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIG5vZGUtPm9iamVjdCk7CisJCXNvdXJjZV9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCQllbnRyeV90eXBlID0gYWNwaV9uc19nZXRfdHlwZSgoYWNwaV9oYW5kbGUpIG5vZGUpOwogCQkqb2JqZWN0X3B0ciA9IG5vZGU7CiAJfQogCkBAIC0xMjQsMTQgKzExNywxNCBAQAogCSAqIDIpIE1ldGhvZCBsb2NhbHMgYW5kIGFyZ3VtZW50cyBoYXZlIGEgcHNldWRvLU5vZGUKIAkgKi8KIAlpZiAoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfREVWSUNFIHx8Ci0JCShub2RlLT5mbGFncyAmIChBTk9CSl9NRVRIT0RfQVJHIHwgQU5PQkpfTUVUSE9EX0xPQ0FMKSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJICAgIChub2RlLT5mbGFncyAmIChBTk9CSl9NRVRIT0RfQVJHIHwgQU5PQkpfTUVUSE9EX0xPQ0FMKSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAlpZiAoIXNvdXJjZV9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gb2JqZWN0IGF0dGFjaGVkIHRvIG5vZGUgJXBcbiIsCi0JCQlub2RlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIk5vIG9iamVjdCBhdHRhY2hlZCB0byBub2RlICVwXG4iLCBub2RlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCiAJLyoKQEAgLTE0MSw4MyArMTM0LDg5IEBACiAJc3dpdGNoIChlbnRyeV90eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJPYmplY3Qgbm90IGEgUGFja2FnZSwgdHlwZSAlc1xuIiwKLQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIk9iamVjdCBub3QgYSBQYWNrYWdlLCB0eXBlICVzXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAoc291cmNlX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyAoc291cmNlX2Rlc2MpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHNvdXJjZV9kZXNjKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkvKiBSZXR1cm4gYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCiAJCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJPYmplY3Qgbm90IGEgQnVmZmVyLCB0eXBlICVzXG4iLAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJPYmplY3Qgbm90IGEgQnVmZmVyLCB0eXBlICVzXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAoc291cmNlX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzIChzb3VyY2VfZGVzYyk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyhzb3VyY2VfZGVzYyk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9TVFJJTkcpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiT2JqZWN0IG5vdCBhIFN0cmluZywgdHlwZSAlc1xuIiwKLQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiT2JqZWN0IG5vdCBhIFN0cmluZywgdHlwZSAlc1xuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiT2JqZWN0IG5vdCBhIEludGVnZXIsIHR5cGUgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJPYmplY3Qgbm90IGEgSW50ZWdlciwgdHlwZSAlc1xuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJImZpZWxkX3JlYWQgTm9kZT0lcCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAotCQkJbm9kZSwgc291cmNlX2Rlc2MsIGVudHJ5X3R5cGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgImZpZWxkX3JlYWQgTm9kZT0lcCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAorCQkJCSAgbm9kZSwgc291cmNlX2Rlc2MsIGVudHJ5X3R5cGUpKTsKIAotCQlzdGF0dXMgPSBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkICh3YWxrX3N0YXRlLCBzb3VyY2VfZGVzYywgJm9ial9kZXNjKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgc291cmNlX2Rlc2MsCisJCQkJCQkgJm9ial9kZXNjKTsKIAkJYnJlYWs7CiAKLQkvKiBGb3IgdGhlc2Ugb2JqZWN0cywganVzdCByZXR1cm4gdGhlIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgTm9kZSAqLworCQkvKiBGb3IgdGhlc2Ugb2JqZWN0cywganVzdCByZXR1cm4gdGhlIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgTm9kZSAqLwogCiAJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgpAQCAtMjMwLDE5ICsyMjksMTggQEAKIAkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJYnJlYWs7CiAKLQkvKiBUWVBFX0FOWSBpcyB1bnR5cGVkLCBhbmQgdGh1cyB0aGVyZSBpcyBubyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGl0ICovCisJCS8qIFRZUEVfQU5ZIGlzIHVudHlwZWQsIGFuZCB0aHVzIHRoZXJlIGlzIG5vIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggaXQgKi8KIAogCWNhc2UgQUNQSV9UWVBFX0FOWToKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbnR5cGVkIGVudHJ5ICVwLCBubyBhdHRhY2hlZCBvYmplY3QhXG4iLAotCQkJbm9kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVudHlwZWQgZW50cnkgJXAsIG5vIGF0dGFjaGVkIG9iamVjdCFcbiIsCisJCQkJICBub2RlKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsgIC8qIENhbm5vdCBiZSBBRV9UWVBFICovCi0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwkvKiBDYW5ub3QgYmUgQUVfVFlQRSAqLwogCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCkBAIC0yNTMsMzkgKzI1MSwzNyBAQAogCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAJCQkvKiBObyBuYW1lZCByZWZlcmVuY2VzIGFyZSBhbGxvd2VkIGhlcmUgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKVxuIiwKLQkJCQlzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJVbnN1cHBvcnRlZCBSZWZlcmVuY2Ugb3Bjb2RlICVYICglcylcbiIsCisJCQkJCSAgc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUsCisJCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUoc291cmNlX2Rlc2MtPgorCQkJCQkJCQkgIHJlZmVyZW5jZS4KKwkJCQkJCQkJICBvcGNvZGUpKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKIAkJLyogRGVmYXVsdCBjYXNlIGlzIGZvciB1bmtub3duIHR5cGVzICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTm9kZSAlcCAtIFVua25vd24gb2JqZWN0IHR5cGUgJVhcbiIsCi0JCQlub2RlLCBlbnRyeV90eXBlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTm9kZSAlcCAtIFVua25vd24gb2JqZWN0IHR5cGUgJVhcbiIsCisJCQkJICBub2RlLCBlbnRyeV90eXBlKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCi0JfSAvKiBzd2l0Y2ggKGVudHJ5X3R5cGUpICovCi0KKwl9CQkJLyogc3dpdGNoIChlbnRyeV90eXBlKSAqLwogCiAJLyogUmV0dXJuIHRoZSBvYmplY3QgZGVzY3JpcHRvciAqLwogCi0JKm9iamVjdF9wdHIgPSAodm9pZCAqKSBvYmpfZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKm9iamVjdF9wdHIgPSAodm9pZCAqKW9ial9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKaW5kZXggM2RlNDU2Ny4uOTdlZWNiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKQEAgLTQyLDcgKzQyLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CkBAIC01MCwxNyArNDksMTMgQEAKICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc29sdiIpCitBQ1BJX01PRFVMRV9OQU1FKCJleHJlc29sdiIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCithY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCisJCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzgsMTkgKzczLDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9yZXNvbHZlX3RvX3ZhbHVlIiwgc3RhY2tfcHRyKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9yZXNvbHZlX3RvX3ZhbHVlIiwgc3RhY2tfcHRyKTsKIAogCWlmICghc3RhY2tfcHRyIHx8ICEqc3RhY2tfcHRyKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW50ZXJuYWwgLSBudWxsIHBvaW50ZXJcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnRlcm5hbCAtIG51bGwgcG9pbnRlclxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIAogCS8qCkBAIC05OCwxNSArOTAsMTYgQEAKIAkgKiAxKSBBIHZhbGlkIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIG9yCiAJICogMikgQSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAobmFtZWRfb2JqKQogCSAqLwotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKCpzdGFja19wdHIpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSAoc3RhY2tfcHRyLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoKnN0YWNrX3B0cikgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlKHN0YWNrX3B0ciwgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQlpZiAoISpzdGFja19wdHIpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW50ZXJuYWwgLSBudWxsIHBvaW50ZXJcbiIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW50ZXJuYWwgLSBudWxsIHBvaW50ZXJcbiIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJCX0KIAl9CiAKQEAgLTExNCwyMCArMTA3LDIwIEBACiAJICogT2JqZWN0IG9uIHRoZSBzdGFjayBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUoKQogCSAqIHdhcyBjYWxsZWQgKGkuZS4sIHdlIGNhbid0IHVzZSBhbiBfZWxzZV8gaGVyZS4pCiAJICovCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoKnN0YWNrX3B0cikgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAotCQkJCSAgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIHN0YWNrX3B0ciksCi0JCQkJICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoKnN0YWNrX3B0cikgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKKwkJCQkJCSAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJICAgc3RhY2tfcHRyKSwgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiUmVzb2x2ZWQgb2JqZWN0ICVwXG4iLCAqc3RhY2tfcHRyKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmVzb2x2ZWQgb2JqZWN0ICVwXG4iLCAqc3RhY2tfcHRyKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlCkBAIC0xNDMsMjUgKzEzNiwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCisJCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnN0YWNrX2Rlc2M7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9ub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0YWNrX2Rlc2M7CisJdm9pZCAqdGVtcF9ub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXUxNiBvcGNvZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9yZXNvbHZlX29iamVjdF90b192YWx1ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUiKTsKIAogCXN0YWNrX2Rlc2MgPSAqc3RhY2tfcHRyOwogCiAJLyogVGhpcyBpcyBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChzdGFja19kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc3RhY2tfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJb3Bjb2RlID0gc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm9wY29kZTsKQEAgLTE3NywxNCArMTY3LDEzIEBACiAKIAkJCS8qIERlbGV0ZSB0aGUgUmVmZXJlbmNlIE9iamVjdCAqLwogCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHN0YWNrX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHN0YWNrX2Rlc2MpOwogCiAJCQkvKiBSZXR1cm4gdGhlIG5hbWVzcGFjZSBub2RlICovCiAKIAkJCSgqc3RhY2tfcHRyKSA9IHRlbXBfbm9kZTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfTE9DQUxfT1A6CiAJCWNhc2UgQU1MX0FSR19PUDoKIApAQCAtMTkyLDI0ICsxODEsMjggQEAKIAkJCSAqIEdldCB0aGUgbG9jYWwgZnJvbSB0aGUgbWV0aG9kJ3Mgc3RhdGUgaW5mbwogCQkJICogTm90ZTogdGhpcyBpbmNyZW1lbnRzIHRoZSBsb2NhbCdzIG9iamVjdCByZWZlcmVuY2UgY291bnQKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKG9wY29kZSwKLQkJCQkJICBzdGFja19kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LCB3YWxrX3N0YXRlLCAmb2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlKG9wY29kZSwKKwkJCQkJCQkgICAgICAgc3RhY2tfZGVzYy0+CisJCQkJCQkJICAgICAgIHJlZmVyZW5jZS5vZmZzZXQsCisJCQkJCQkJICAgICAgIHdhbGtfc3RhdGUsCisJCQkJCQkJICAgICAgICZvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltBcmcvTG9jYWwgJVhdIHZhbHVlX29iaiBpcyAlcFxuIiwKLQkJCQlzdGFja19kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LCBvYmpfZGVzYykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkgICJbQXJnL0xvY2FsICVYXSB2YWx1ZV9vYmogaXMgJXBcbiIsCisJCQkJCSAgc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJICBvYmpfZGVzYykpOwogCiAJCQkvKgogCQkJICogTm93IHdlIGNhbiBkZWxldGUgdGhlIG9yaWdpbmFsIFJlZmVyZW5jZSBPYmplY3QgYW5kCiAJCQkgKiByZXBsYWNlIGl0IHdpdGggdGhlIHJlc29sdmVkIHZhbHVlCiAJCQkgKi8KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoc3RhY2tfZGVzYyk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RhY2tfZGVzYyk7CiAJCQkqc3RhY2tfcHRyID0gb2JqX2Rlc2M7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOREVYX09QOgogCiAJCQlzd2l0Y2ggKHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSkgewpAQCAtMjE4LDcgKzIxMSw2IEBACiAJCQkJLyogSnVzdCByZXR1cm4gLSBsZWF2ZSB0aGUgUmVmZXJlbmNlIG9uIHRoZSBzdGFjayAqLwogCQkJCWJyZWFrOwogCi0KIAkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKIAkJCQlvYmpfZGVzYyA9ICpzdGFja19kZXNjLT5yZWZlcmVuY2Uud2hlcmU7CkBAIC0yMjgsMzYgKzIyMCwzMSBAQAogCQkJCQkgKiAoaS5lLiwgZGVyZWZlcmVuY2UgdGhlIHBhY2thZ2UgaW5kZXgpCiAJCQkJCSAqIERlbGV0ZSB0aGUgcmVmIG9iamVjdCwgaW5jcmVtZW50IHRoZSByZXR1cm5lZCBvYmplY3QKIAkJCQkJICovCi0JCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoc3RhY2tfZGVzYyk7Ci0JCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RhY2tfZGVzYyk7CisJCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQkJCSpzdGFja19wdHIgPSBvYmpfZGVzYzsKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJfSBlbHNlIHsKIAkJCQkJLyoKIAkJCQkJICogQSBOVUxMIG9iamVjdCBkZXNjcmlwdG9yIG1lYW5zIGFuIHVuaXRpYWxpemVkIGVsZW1lbnQgb2YKIAkJCQkJICogdGhlIHBhY2thZ2UsIGNhbid0IGRlcmVmZXJlbmNlIGl0CiAJCQkJCSAqLwotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJBdHRlbXB0IHRvIGRlcmVmIGFuIEluZGV4IHRvIE5VTEwgcGtnIGVsZW1lbnQgSWR4PSVwXG4iLAotCQkJCQkJc3RhY2tfZGVzYykpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJCSAgIkF0dGVtcHQgdG8gZGVyZWYgYW4gSW5kZXggdG8gTlVMTCBwa2cgZWxlbWVudCBJZHg9JXBcbiIsCisJCQkJCQkJICBzdGFja19kZXNjKSk7CiAJCQkJCXN0YXR1cyA9IEFFX0FNTF9VTklOSVRJQUxJWkVEX0VMRU1FTlQ7CiAJCQkJfQogCQkJCWJyZWFrOwogCi0KIAkJCWRlZmF1bHQ6CiAKIAkJCQkvKiBJbnZhbGlkIHJlZmVyZW5jZSBvYmplY3QgKi8KIAotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkJCSJEdXJpbmcgcmVzb2x2ZSwgVW5rbm93biB0YXJnZXRfdHlwZSAlWCBpbiBJbmRleC9SZWZlcmVuY2Ugb2JqICVwXG4iLAotCQkJCQlzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsIHN0YWNrX2Rlc2MpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkR1cmluZyByZXNvbHZlLCBVbmtub3duIHRhcmdldF90eXBlICVYIGluIEluZGV4L1JlZmVyZW5jZSBvYmogJXBcbiIsIHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSwgc3RhY2tfZGVzYykpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfUkVGX09GX09QOgogCQljYXNlIEFNTF9ERUJVR19PUDoKIAkJY2FzZSBBTUxfTE9BRF9PUDoKQEAgLTI2Niw2MCArMjUzLDU4IEBACiAKIAkJCWJyZWFrOwogCi0JCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDogICAvKiBSZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKi8KKwkJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgkvKiBSZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKi8KIAogCQkJLyogR2V0IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgbmFtZXNwYWNlIG5vZGUgKi8KIAogCQkJKnN0YWNrX3B0ciA9IChzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZSktPm9iamVjdDsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAoKnN0YWNrX3B0cik7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHN0YWNrX2Rlc2MpOworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKCpzdGFja19wdHIpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHN0YWNrX2Rlc2MpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiRHVyaW5nIHJlc29sdmUsIFVua25vd24gUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpIGluICVwXG4iLAotCQkJCW9wY29kZSwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wY29kZSksIHN0YWNrX2Rlc2MpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiRHVyaW5nIHJlc29sdmUsIFVua25vd24gUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpIGluICVwXG4iLCBvcGNvZGUsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wY29kZSksIHN0YWNrX2Rlc2MpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAoc3RhY2tfZGVzYyk7CisJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMoc3RhY2tfZGVzYyk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCi0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzIChzdGFja19kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMoc3RhY2tfZGVzYyk7CiAJCWJyZWFrOwogCi0KLQkvKiBUaGVzZSBjYXNlcyBtYXkgbmV2ZXIgaGFwcGVuIGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLiAqLworCQkvKiBUaGVzZSBjYXNlcyBtYXkgbmV2ZXIgaGFwcGVuIGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLiAqLwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJmaWVsZF9yZWFkIHNvdXJjZV9kZXNjPSVwIFR5cGU9JVhcbiIsCi0JCQlzdGFja19kZXNjLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc3RhY2tfZGVzYykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgImZpZWxkX3JlYWQgc291cmNlX2Rlc2M9JXAgVHlwZT0lWFxuIiwKKwkJCQkgIHN0YWNrX2Rlc2MsCisJCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzdGFja19kZXNjKSkpOwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQgKHdhbGtfc3RhdGUsIHN0YWNrX2Rlc2MsICZvYmpfZGVzYyk7Ci0JCSpzdGFja19wdHIgPSAodm9pZCAqKSBvYmpfZGVzYzsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgc3RhY2tfZGVzYywKKwkJCQkJCSAmb2JqX2Rlc2MpOworCQkqc3RhY2tfcHRyID0gKHZvaWQgKilvYmpfZGVzYzsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX211bHRpcGxlCkBAIC0zMzcsNDIgKzMyMiw0NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvcGVyYW5kLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgKnJldHVybl90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYykKK2FjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQsCisJCQkgYWNwaV9vYmplY3RfdHlwZSAqIHJldHVybl90eXBlLAorCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyA9ICh2b2lkICopIG9wZXJhbmQ7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSAodm9pZCAqKW9wZXJhbmQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlIik7CiAKIAkvKiBPcGVyYW5kIGNhbiBiZSBlaXRoZXIgYSBuYW1lc3BhY2Ugbm9kZSBvciBhbiBvcGVyYW5kIGRlc2NyaXB0b3IgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CiAJCXR5cGUgPSBvYmpfZGVzYy0+Y29tbW9uLnR5cGU7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKLQkJdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2MpLT50eXBlOwotCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKTsKKwkJdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPnR5cGU7CisJCW9ial9kZXNjID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJCW9ial9kZXNjKTsKIAogCQkvKiBJZiB3ZSBoYWQgYW4gQWxpYXMgbm9kZSwgdXNlIHRoZSBhdHRhY2hlZCBvYmplY3QgZm9yIHR5cGUgaW5mbyAqLwogCiAJCWlmICh0eXBlID09IEFDUElfVFlQRV9MT0NBTF9BTElBUykgewotCQkJdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2Rlc2MpLT50eXBlOwotCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfZGVzYyk7CisJCQl0eXBlID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjKS0+dHlwZTsKKwkJCW9ial9kZXNjID0KKwkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdAorCQkJCQkJCSBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCQkJb2JqX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAogCS8qIElmIHR5cGUgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHJlZmVyZW5jZSwgd2UgYXJlIGRvbmUgKi8KQEAgLTM4Nyw3ICszNzQsNyBAQAogCSAqIG9mIHRoZSBvYmplY3RfdHlwZSBhbmQgc2l6ZV9vZiBvcGVyYXRvcnMpLiBUaGlzIG1lYW5zIHRyYXZlcnNpbmcKIAkgKiB0aGUgbGlzdCBvZiBwb3NzaWJseSBtYW55IG5lc3RlZCByZWZlcmVuY2VzLgogCSAqLwotCXdoaWxlIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKKwl3aGlsZSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKIAkJc3dpdGNoIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkgewogCQljYXNlIEFNTF9SRUZfT0ZfT1A6CiAKQEAgLTM5NywzMSArMzg0LDI5IEBACiAKIAkJCS8qIEFsbCAiUmVmZXJlbmNlcyIgcG9pbnQgdG8gYSBOUyBub2RlICovCiAKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG5vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLAotCQkJCQlub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKG5vZGUpKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlKSAhPQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwgbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG5vZGUpKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCQl9CiAKIAkJCS8qIEdldCB0aGUgYXR0YWNoZWQgb2JqZWN0ICovCiAKLQkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCQkJaWYgKCFvYmpfZGVzYykgewogCQkJCS8qIE5vIG9iamVjdCwgdXNlIHRoZSBOUyBub2RlIHR5cGUgKi8KIAotCQkJCXR5cGUgPSBhY3BpX25zX2dldF90eXBlIChub2RlKTsKKwkJCQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShub2RlKTsKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAKIAkJCS8qIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzICovCiAKIAkJCWlmIChvYmpfZGVzYyA9PSBvcGVyYW5kKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQ0lSQ1VMQVJfUkVGRVJFTkNFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSk7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQU1MX0lOREVYX09QOgogCiAJCQkvKiBHZXQgdGhlIHR5cGUgb2YgdGhpcyByZWZlcmVuY2UgKGluZGV4IGludG8gYW5vdGhlciBvYmplY3QpICovCkBAIC00NDIsMTIgKzQyNywxMSBAQAogCQkJaWYgKCFvYmpfZGVzYykgewogCQkJCS8qIE5VTEwgcGFja2FnZSBlbGVtZW50cyBhcmUgYWxsb3dlZCAqLwogCi0JCQkJdHlwZSA9IDA7IC8qIFVuaW5pdGlhbGl6ZWQgKi8KKwkJCQl0eXBlID0gMDsJLyogVW5pbml0aWFsaXplZCAqLwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgogCiAJCQkvKiBEZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlIHBvaW50ZXIgKi8KQEAgLTQ1Niw1MCArNDQwLDYxIEBACiAKIAkJCS8qIEFsbCAiUmVmZXJlbmNlcyIgcG9pbnQgdG8gYSBOUyBub2RlICovCiAKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG5vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLAotCQkJCQlub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKG5vZGUpKSk7Ci0JCQkgICByZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9CisJCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLCBub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUobm9kZSkpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAkJCX0KIAogCQkJLyogR2V0IHRoZSBhdHRhY2hlZCBvYmplY3QgKi8KIAotCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJCQlpZiAoIW9ial9kZXNjKSB7CiAJCQkJLyogTm8gb2JqZWN0LCB1c2UgdGhlIE5TIG5vZGUgdHlwZSAqLwogCi0JCQkJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKG5vZGUpOworCQkJCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKG5vZGUpOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAogCQkJLyogQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgKi8KIAogCQkJaWYgKG9ial9kZXNjID09IG9wZXJhbmQpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9DSVJDVUxBUl9SRUZFUkVOQ0UpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQ0lSQ1VMQVJfUkVGRVJFTkNFKTsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfTE9DQUxfT1A6CiAJCWNhc2UgQU1MX0FSR19PUDoKIAogCQkJaWYgKHJldHVybl9kZXNjKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJIG9ial9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LCB3YWxrX3N0YXRlLCAmb2JqX2Rlc2MpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlKG9ial9kZXNjLT4KKwkJCQkJCQkJICByZWZlcmVuY2UuCisJCQkJCQkJCSAgb3Bjb2RlLAorCQkJCQkJCQkgIG9ial9kZXNjLT4KKwkJCQkJCQkJICByZWZlcmVuY2UuCisJCQkJCQkJCSAgb2Zmc2V0LAorCQkJCQkJCQkgIHdhbGtfc3RhdGUsCisJCQkJCQkJCSAgJm9ial9kZXNjKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUsCi0JCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsIHdhbGtfc3RhdGUsICZub2RlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9ial9kZXNjLT4KKwkJCQkJCQkJIHJlZmVyZW5jZS4KKwkJCQkJCQkJIG9wY29kZSwKKwkJCQkJCQkJIG9ial9kZXNjLT4KKwkJCQkJCQkJIHJlZmVyZW5jZS4KKwkJCQkJCQkJIG9mZnNldCwKKwkJCQkJCQkJIHdhbGtfc3RhdGUsCisJCQkJCQkJCSAmbm9kZSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIAotCQkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwkJCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAkJCQlpZiAoIW9ial9kZXNjKSB7CiAJCQkJCXR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCQkJCQlnb3RvIGV4aXQ7CkBAIC01MDcsNyArNTAyLDYgQEAKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBTUxfREVCVUdfT1A6CiAKIAkJCS8qIFRoZSBEZWJ1ZyBPYmplY3QgaXMgb2YgdHlwZSAiZGVidWdfb2JqZWN0IiAqLwpAQCAtNTE1LDEzICs1MDksMTAgQEAKIAkJCXR5cGUgPSBBQ1BJX1RZUEVfREVCVUdfT0JKRUNUOwogCQkJZ290byBleGl0OwogCi0KIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLAotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogVW5rbm93biBSZWZlcmVuY2Ugc3VidHlwZSAlWFxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQl9CiAJfQogCkBAIC01MjksMTAgKzUyMCw5IEBACiAJICogTm93IHdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgYW4gb2JqZWN0IHRoYXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKIAkgKiB2aWEgdGhlIHJlZl9vZiBvciBJbmRleCBvcGVyYXRvcnMuCiAJICovCi0JdHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYyk7CisJdHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKTsKIAotCi1leGl0OgorICAgICAgZXhpdDoKIAkvKiBDb252ZXJ0IGludGVybmFsIHR5cGVzIHRvIGV4dGVybmFsIHR5cGVzICovCiAKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTU1OSw3ICs1NDksNSBAQAogCWlmIChyZXR1cm5fZGVzYykgewogCQkqcmV0dXJuX2Rlc2MgPSBvYmpfZGVzYzsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYwppbmRleCBkOGI0NzBlLi5mZjA2NGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKQEAgLTQyLDI0ICs0MiwxOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4cmVzb3AiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhyZXNvcCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NoZWNrX29iamVjdF90eXBlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGhpc190eXBlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCk7Ci0KK2FjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlX25lZWRlZCwKKwkJCSAgYWNwaV9vYmplY3RfdHlwZSB0aGlzX3R5cGUsIHZvaWQgKm9iamVjdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzYsMTMgKzcwLDEwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZV9uZWVkZWQsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0aGlzX3R5cGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KQorYWNwaV9leF9jaGVja19vYmplY3RfdHlwZShhY3BpX29iamVjdF90eXBlIHR5cGVfbmVlZGVkLAorCQkJICBhY3BpX29iamVjdF90eXBlIHRoaXNfdHlwZSwgdm9pZCAqb2JqZWN0KQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImV4X2NoZWNrX29iamVjdF90eXBlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoImV4X2NoZWNrX29iamVjdF90eXBlIik7CiAKIAlpZiAodHlwZV9uZWVkZWQgPT0gQUNQSV9UWVBFX0FOWSkgewogCQkvKiBBbGwgdHlwZXMgT0ssIHNvIHdlIGRvbid0IHBlcmZvcm0gYW55IHR5cGVjaGVja3MgKi8KQEAgLTk3LDE2ICs4OCwxNyBAQAogCQkgKiBzcGVjaWZpY2F0aW9uLCBhIHN0b3JlIHRvIGEgY29uc3RhbnQgaXMgYSBub29wLikKIAkJICovCiAJCWlmICgodGhpc190eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSAmJgotCQkJKCgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBvYmplY3QpLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfQU1MX0NPTlNUQU5UKSkgeworCQkgICAgKCgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW9iamVjdCktPmNvbW1vbi4KKwkJICAgICBmbGFncyAmIEFPUE9CSl9BTUxfQ09OU1RBTlQpKSB7CiAJCQlyZXR1cm4gKEFFX09LKTsKIAkJfQogCX0KIAogCWlmICh0eXBlX25lZWRlZCAhPSB0aGlzX3R5cGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTmVlZGVkIFslc10sIGZvdW5kIFslc10gJXBcbiIsCi0JCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGVfbmVlZGVkKSwKLQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodGhpc190eXBlKSwgb2JqZWN0KSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTmVlZGVkIFslc10sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZV9uZWVkZWQpLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRoaXNfdHlwZSksIG9iamVjdCkpOwogCiAJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQpAQCAtMTE0LDcgKzEwNiw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzCkBAIC0xMzcsNDEgKzEyOCwzNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHUxNiBvcGNvZGUsCisJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKiBzdGFja19wdHIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfbm9kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlczsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAgICpvcF9pbmZvOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19hcmdfdHlwZTsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X29wID0gMDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1OCBvYmplY3RfdHlwZTsKKwl2b2lkICp0ZW1wX25vZGU7CisJdTMyIGFyZ190eXBlczsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKKwl1MzIgdGhpc19hcmdfdHlwZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGVfbmVlZGVkOworCXUxNiB0YXJnZXRfb3AgPSAwOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoImV4X3Jlc29sdmVfb3BlcmFuZHMiLCBvcGNvZGUpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJleF9yZXNvbHZlX29wZXJhbmRzIiwgb3Bjb2RlKTsKLQotCi0Jb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpOworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwogCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfT1BDT0RFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfT1BDT0RFKTsKIAl9CiAKIAlhcmdfdHlwZXMgPSBvcF9pbmZvLT5ydW50aW1lX2FyZ3M7CiAJaWYgKGFyZ190eXBlcyA9PSBBUkdJX0lOVkFMSURfT1BDT0RFKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoInJlc29sdmVfb3BlcmFuZHM6ICVYIGlzIG5vdCBhIHZhbGlkIEFNTCBvcGNvZGVcbiIsCi0JCQlvcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJyZXNvbHZlX29wZXJhbmRzOiAlWCBpcyBub3QgYSB2YWxpZCBBTUwgb3Bjb2RlXG4iLCBvcGNvZGUpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCSJPcGNvZGUgJVggWyVzXSByZXF1aXJlZF9vcGVyYW5kX3R5cGVzPSU4LjhYIFxuIiwKLQkJb3Bjb2RlLCBvcF9pbmZvLT5uYW1lLCBhcmdfdHlwZXMpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJPcGNvZGUgJVggWyVzXSByZXF1aXJlZF9vcGVyYW5kX3R5cGVzPSU4LjhYIFxuIiwKKwkJCSAgb3Bjb2RlLCBvcF9pbmZvLT5uYW1lLCBhcmdfdHlwZXMpKTsKIAogCS8qCiAJICogTm9ybWFsIGV4aXQgaXMgd2l0aCAoYXJnX3R5cGVzID09IDApIGF0IGVuZCBvZiBhcmd1bWVudCBsaXN0LgpAQCAtMTgwLDEyICsxNjcsMTEgQEAKIAkgKiB0bykgdGhlIHJlcXVpcmVkIHR5cGU7IGlmIHN0YWNrIHVuZGVyZmxvd3M7IG9yIHVwb24KIAkgKiBmaW5kaW5nIGEgTlVMTCBzdGFjayBlbnRyeSAod2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4pLgogCSAqLwotCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKSkgeworCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRShhcmdfdHlwZXMpKSB7CiAJCWlmICghc3RhY2tfcHRyIHx8ICEqc3RhY2tfcHRyKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJyZXNvbHZlX29wZXJhbmRzOiBOdWxsIHN0YWNrIGVudHJ5IGF0ICVwXG4iLAotCQkJCXN0YWNrX3B0cikpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJyZXNvbHZlX29wZXJhbmRzOiBOdWxsIHN0YWNrIGVudHJ5IGF0ICVwXG4iLCBzdGFja19wdHIpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KIAogCQkvKiBFeHRyYWN0IHVzZWZ1bCBpdGVtcyAqLwpAQCAtMTk0LDM3ICsxODAsMzcgQEAKIAogCQkvKiBEZWNvZGUgdGhlIGRlc2NyaXB0b3IgdHlwZSAqLwogCi0JCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpIHsKKwkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7CiAJCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6CiAKIAkJCS8qIE5hbWVzcGFjZSBOb2RlICovCiAKLQkJCW9iamVjdF90eXBlID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmpfZGVzYyktPnR5cGU7CisJCQlvYmplY3RfdHlwZSA9CisJCQkgICAgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjKS0+dHlwZTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgogCiAJCQkvKiBBQ1BJIGludGVybmFsIG9iamVjdCAqLwogCi0JCQlvYmplY3RfdHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYyk7CisJCQlvYmplY3RfdHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKTsKIAogCQkJLyogQ2hlY2sgZm9yIGJhZCBhY3BpX29iamVjdF90eXBlICovCiAKLQkJCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAob2JqZWN0X3R5cGUpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJCYWQgb3BlcmFuZCBvYmplY3QgdHlwZSBbJVhdXG4iLAotCQkJCQlvYmplY3RfdHlwZSkpOworCQkJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKG9iamVjdF90eXBlKSkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJCYWQgb3BlcmFuZCBvYmplY3QgdHlwZSBbJVhdXG4iLAorCQkJCQkJICBvYmplY3RfdHlwZSkpOwogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CiAKIAkJCWlmIChvYmplY3RfdHlwZSA9PSAodTgpIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKIAkJCQkvKiBEZWNvZGUgdGhlIFJlZmVyZW5jZSAqLwogCi0JCQkJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpOworCQkJCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwogCQkJCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfT1BDT0RFKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfT1BDT0RFKTsKIAkJCQl9CiAKIAkJCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSB7CkBAIC0yMzgsNTEgKzIyNCw2MiBAQAogCQkJCWNhc2UgQU1MX1JFRl9PRl9PUDoKIAkJCQljYXNlIEFNTF9BUkdfT1A6CiAJCQkJY2FzZSBBTUxfTE9DQUxfT1A6Ci0JCQkJY2FzZSBBTUxfTE9BRF9PUDogLyogZGRiX2hhbmRsZSBmcm9tIExPQURfT1Agb3IgTE9BRF9UQUJMRV9PUCAqLwotCQkJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDogLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCisJCQkJY2FzZSBBTUxfTE9BRF9PUDoJLyogZGRiX2hhbmRsZSBmcm9tIExPQURfT1Agb3IgTE9BRF9UQUJMRV9PUCAqLworCQkJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoJLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCiAKLQkJCQkJQUNQSV9ERUJVR19PTkxZX01FTUJFUlMgKEFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJCQkiT3BlcmFuZCBpcyBhIFJlZmVyZW5jZSwgcmVmX29wY29kZSBbJXNdXG4iLAotCQkJCQkJKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpLT5uYW1lKSkpOworCQkJCQlBQ1BJX0RFQlVHX09OTFlfTUVNQkVSUyhBQ1BJX0RFQlVHX1BSSU5UCisJCQkJCQkJCSgoQUNQSV9EQl9FWEVDLAorCQkJCQkJCQkgICJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCByZWZfb3Bjb2RlIFslc11cbiIsCisJCQkJCQkJCSAgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvCisJCQkJCQkJCSAgIChvYmpfZGVzYy0+CisJCQkJCQkJCSAgICByZWZlcmVuY2UuCisJCQkJCQkJCSAgICBvcGNvZGUpKS0+CisJCQkJCQkJCSAgbmFtZSkpKTsKIAkJCQkJYnJlYWs7CiAKIAkJCQlkZWZhdWx0OgotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCBVbmtub3duIFJlZmVyZW5jZSBPcGNvZGUgJVggWyVzXVxuIiwKLQkJCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpLT5uYW1lKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJICAiT3BlcmFuZCBpcyBhIFJlZmVyZW5jZSwgVW5rbm93biBSZWZlcmVuY2UgT3Bjb2RlICVYIFslc11cbiIsCisJCQkJCQkJICBvYmpfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCSAgb3Bjb2RlLAorCQkJCQkJCSAgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvCisJCQkJCQkJICAgKG9ial9kZXNjLT5yZWZlcmVuY2UuCisJCQkJCQkJICAgIG9wY29kZSkpLT5uYW1lKSk7CiAKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAogCQkJLyogSW52YWxpZCBkZXNjcmlwdG9yICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiSW52YWxpZCBkZXNjcmlwdG9yICVwIFslc11cbiIsCi0JCQkJCW9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKG9ial9kZXNjKSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiSW52YWxpZCBkZXNjcmlwdG9yICVwIFslc11cbiIsCisJCQkJCSAgb2JqX2Rlc2MsCisJCQkJCSAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lCisJCQkJCSAgKG9ial9kZXNjKSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyogR2V0IG9uZSBhcmd1bWVudCB0eXBlLCBwb2ludCB0byB0aGUgbmV4dCAqLwogCi0JCXRoaXNfYXJnX3R5cGUgPSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKTsKLQkJSU5DUkVNRU5UX0FSR19MSVNUIChhcmdfdHlwZXMpOworCQl0aGlzX2FyZ190eXBlID0gR0VUX0NVUlJFTlRfQVJHX1RZUEUoYXJnX3R5cGVzKTsKKwkJSU5DUkVNRU5UX0FSR19MSVNUKGFyZ190eXBlcyk7CiAKIAkJLyoKIAkJICogSGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZQogCQkgKiByZXNvbHZlZCB0byBhIHZhbHVlCiAJCSAqLwogCQlzd2l0Y2ggKHRoaXNfYXJnX3R5cGUpIHsKLQkJY2FzZSBBUkdJX1JFRl9PUl9TVFJJTkc6ICAgICAgICAvKiBDYW4gYmUgYSBTdHJpbmcgb3IgUmVmZXJlbmNlICovCisJCWNhc2UgQVJHSV9SRUZfT1JfU1RSSU5HOgkvKiBDYW4gYmUgYSBTdHJpbmcgb3IgUmVmZXJlbmNlICovCiAKLQkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgJiYKLQkJCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfU1RSSU5HKSkgeworCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09CisJCQkgICAgIEFDUElfREVTQ19UWVBFX09QRVJBTkQpCisJCQkgICAgJiYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PQorCQkJCUFDUElfVFlQRV9TVFJJTkcpKSB7CiAJCQkJLyoKIAkJCQkgKiBTdHJpbmcgZm91bmQgLSB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBuYW1lZCBvYmplY3QgYW5kCiAJCQkJICogbXVzdCBiZSByZXNvbHZlZCB0byBhIG5vZGUKQEAgLTI5NiwzOSArMjkzLDQwIEBACiAJCQkgKi8KIAkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KIAotCQljYXNlIEFSR0lfUkVGRVJFTkNFOiAgICAgICAgICAgIC8qIFJlZmVyZW5jZXM6ICovCisJCWNhc2UgQVJHSV9SRUZFUkVOQ0U6CS8qIFJlZmVyZW5jZXM6ICovCiAJCWNhc2UgQVJHSV9JTlRFR0VSX1JFRjoKIAkJY2FzZSBBUkdJX09CSkVDVF9SRUY6CiAJCWNhc2UgQVJHSV9ERVZJQ0VfUkVGOgotCQljYXNlIEFSR0lfVEFSR0VUUkVGOiAgICAgLyogQWxsb3dzIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgYmVmb3JlIHN0b3JlICovCi0JCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6ICAvKiBObyBpbXBsaWNpdCBjb252ZXJzaW9uIGJlZm9yZSBzdG9yZSB0byB0YXJnZXQgKi8KLQkJY2FzZSBBUkdJX1NJTVBMRV9UQVJHRVQ6IC8qIE5hbWUsIExvY2FsLCBvciBBcmcgLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICAqLworCQljYXNlIEFSR0lfVEFSR0VUUkVGOgkvKiBBbGxvd3MgaW1wbGljaXQgY29udmVyc2lvbiBydWxlcyBiZWZvcmUgc3RvcmUgKi8KKwkJY2FzZSBBUkdJX0ZJWEVEX1RBUkdFVDoJLyogTm8gaW1wbGljaXQgY29udmVyc2lvbiBiZWZvcmUgc3RvcmUgdG8gdGFyZ2V0ICovCisJCWNhc2UgQVJHSV9TSU1QTEVfVEFSR0VUOgkvKiBOYW1lLCBMb2NhbCwgb3IgQXJnIC0gbm8gaW1wbGljaXQgY29udmVyc2lvbiAgKi8KIAogCQkJLyoKIAkJCSAqIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UKIAkJCSAqIEEgTmFtZXNwYWNlIE5vZGUgaXMgT0sgYXMtaXMKIAkJCSAqLwotCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCQkJZ290byBuZXh0X29wZXJhbmQ7CiAJCQl9CiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUgKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsCi0JCQkJCSAgb2JqZWN0X3R5cGUsIG9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwKKwkJCQkJCSAgICAgIG9iamVjdF90eXBlLCBvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAogCQkJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9OQU1FX09QKSB7CiAJCQkJLyogQ29udmVydCBhIG5hbWVkIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIG5hbWVkIG9iamVjdCAqLwogCiAJCQkJdGVtcF9ub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJCQkoKnN0YWNrX3B0cikgPSB0ZW1wX25vZGU7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCi0JCWNhc2UgQVJHSV9EQVRBUkVGT0JKOiAgLyogU3RvcmUgb3BlcmF0b3Igb25seSAqLworCQljYXNlIEFSR0lfREFUQVJFRk9CSjoJLyogU3RvcmUgb3BlcmF0b3Igb25seSAqLwogCiAJCQkvKgogCQkJICogV2UgZG9uJ3Qgd2FudCB0byByZXNvbHZlIGluZGV4X29wIHJlZmVyZW5jZSBvYmplY3RzIGR1cmluZwpAQCAtMzM3LDggKzMzNSwxMCBAQAogCQkJICogLS0gQWxsIG90aGVycyBtdXN0IGJlIHJlc29sdmVkIGJlbG93LgogCQkJICovCiAJCQlpZiAoKG9wY29kZSA9PSBBTUxfU1RPUkVfT1ApICYmCi0JCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFICgqc3RhY2tfcHRyKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSAmJgotCQkJCSgoKnN0YWNrX3B0ciktPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0lOREVYX09QKSkgeworCQkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqc3RhY2tfcHRyKSA9PQorCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICgoKnN0YWNrX3B0ciktPnJlZmVyZW5jZS5vcGNvZGUgPT0KKwkJCQlBTUxfSU5ERVhfT1ApKSB7CiAJCQkJZ290byBuZXh0X29wZXJhbmQ7CiAJCQl9CiAJCQlicmVhazsKQEAgLTM1MSw5ICszNTEsOSBAQAogCQkvKgogCQkgKiBSZXNvbHZlIHRoaXMgb2JqZWN0IHRvIGEgdmFsdWUKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoc3RhY2tfcHRyLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoc3RhY2tfcHRyLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIEdldCB0aGUgcmVzb2x2ZWQgb2JqZWN0ICovCkBAIC0zNjQsMTAgKzM2NCwxMCBAQAogCQkgKiBDaGVjayB0aGUgcmVzdWx0aW5nIG9iamVjdCAodmFsdWUpIHR5cGUKIAkJICovCiAJCXN3aXRjaCAodGhpc19hcmdfdHlwZSkgewotCQkvKgotCQkgKiBGb3IgdGhlIHNpbXBsZSBjYXNlcywgb25seSBvbmUgdHlwZSBvZiByZXNvbHZlZCBvYmplY3QKLQkJICogaXMgYWxsb3dlZAotCQkgKi8KKwkJCS8qCisJCQkgKiBGb3IgdGhlIHNpbXBsZSBjYXNlcywgb25seSBvbmUgdHlwZSBvZiByZXNvbHZlZCBvYmplY3QKKwkJCSAqIGlzIGFsbG93ZWQKKwkJCSAqLwogCQljYXNlIEFSR0lfTVVURVg6CiAKIAkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9NVVRFWCAqLwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJCQl0eXBlX25lZWRlZCA9IEFDUElfVFlQRV9FVkVOVDsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQVJHSV9QQUNLQUdFOiAgIC8qIFBhY2thZ2UgKi8KKwkJY2FzZSBBUkdJX1BBQ0tBR0U6CS8qIFBhY2thZ2UgKi8KIAogCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX1BBQ0tBR0UgKi8KIApAQCAtNDAzLDEwICs0MDMsOSBAQAogCQkJdHlwZV9uZWVkZWQgPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOwogCQkJYnJlYWs7CiAKLQotCQkvKgotCQkgKiBUaGUgbW9yZSBjb21wbGV4IGNhc2VzIGFsbG93IG11bHRpcGxlIHJlc29sdmVkIG9iamVjdCB0eXBlcwotCQkgKi8KKwkJCS8qCisJCQkgKiBUaGUgbW9yZSBjb21wbGV4IGNhc2VzIGFsbG93IG11bHRpcGxlIHJlc29sdmVkIG9iamVjdCB0eXBlcworCQkJICovCiAJCWNhc2UgQVJHSV9JTlRFR0VSOgogCiAJCQkvKgpAQCAtNDE0LDIxICs0MTMsMjcgQEAKIAkJCSAqIEJ1dCB3ZSBjYW4gaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBTVFJJTkcgb3IgQlVGRkVSCiAJCQkgKiBBa2EgLSAiSW1wbGljaXQgU291cmNlIE9wZXJhbmQgQ29udmVyc2lvbiIKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKG9ial9kZXNjLCBzdGFja19wdHIsIDE2KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob2JqX2Rlc2MsIHN0YWNrX3B0ciwgMTYpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkJICAob2JqX2Rlc2MpLAorCQkJCQkJCSAgb2JqX2Rlc2MpKTsKIAotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQkJfQogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlpZiAob2JqX2Rlc2MgIT0gKnN0YWNrX3B0cikgeworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9CVUZGRVI6CiAKIAkJCS8qCkBAIC00MzYsMjEgKzQ0MSwyNiBAQAogCQkJICogQnV0IHdlIGNhbiBpbXBsaWNpdGx5IGNvbnZlcnQgZnJvbSBhIFNUUklORyBvciBJTlRFR0VSCiAJCQkgKiBBa2EgLSAiSW1wbGljaXQgU291cmNlIE9wZXJhbmQgQ29udmVyc2lvbiIKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlciAob2JqX2Rlc2MsIHN0YWNrX3B0cik7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9ial9kZXNjLCBzdGFja19wdHIpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkJICAob2JqX2Rlc2MpLAorCQkJCQkJCSAgb2JqX2Rlc2MpKTsKIAotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQkJfQogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlpZiAob2JqX2Rlc2MgIT0gKnN0YWNrX3B0cikgeworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9TVFJJTkc6CiAKIAkJCS8qCkBAIC00NTgsNzUgKzQ2OCw4NiBAQAogCQkJICogQnV0IHdlIGNhbiBpbXBsaWNpdGx5IGNvbnZlcnQgZnJvbSBhIEJVRkZFUiBvciBJTlRFR0VSCiAJCQkgKiBBa2EgLSAiSW1wbGljaXQgU291cmNlIE9wZXJhbmQgQ29udmVyc2lvbiIKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyAob2JqX2Rlc2MsIHN0YWNrX3B0ciwKLQkJCQkJIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvYmpfZGVzYywgc3RhY2tfcHRyLAorCQkJCQkJCSAgIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkJICAob2JqX2Rlc2MpLAorCQkJCQkJCSAgb2JqX2Rlc2MpKTsKIAotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQkJfQogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlpZiAob2JqX2Rlc2MgIT0gKnN0YWNrX3B0cikgeworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9DT01QVVRFREFUQToKIAogCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgSU5URUdFUiwgU1RSSU5HIG9yIEJVRkZFUiAqLwogCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCQkJLyogVmFsaWQgb3BlcmFuZCAqLwotCQkJICAgYnJlYWs7CisJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KIAkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCi0KIAkJY2FzZSBBUkdJX0JVRkZFUl9PUl9TVFJJTkc6CiAKIAkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIFNUUklORyBvciBCVUZGRVIgKi8KIAotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCQkJLyogVmFsaWQgb3BlcmFuZCAqLwotCQkJICAgYnJlYWs7CisJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKIAkJCQkvKiBIaWdoZXN0IHByaW9yaXR5IGNvbnZlcnNpb24gaXMgdG8gdHlwZSBCdWZmZXIgKi8KIAotCQkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIgKG9ial9kZXNjLCBzdGFja19wdHIpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfY29udmVydF90b19idWZmZXIob2JqX2Rlc2MsCisJCQkJCQkJICAgICAgc3RhY2tfcHRyKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCisJCQkJaWYgKG9ial9kZXNjICE9ICpzdGFja19wdHIpIHsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KIAkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCi0KIAkJY2FzZSBBUkdJX0RBVEFPQkpFQ1Q6CiAJCQkvKgogCQkJICogQVJHSV9EQVRBT0JKRUNUIGlzIG9ubHkgdXNlZCBieSB0aGUgc2l6ZV9vZiBvcGVyYXRvci4KQEAgLTUzNSw3ICs1NTYsNyBAQAogCQkJICogVGhlIG9ubHkgcmVmZXJlbmNlIGFsbG93ZWQgaGVyZSBpcyBhIGRpcmVjdCByZWZlcmVuY2UgdG8KIAkJCSAqIGEgbmFtZXNwYWNlIG5vZGUuCiAJCQkgKi8KLQkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAJCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CkBAIC01NDUsMjAgKzU2NiwyMCBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkiTmVlZGVkIFtCdWZmZXIvU3RyaW5nL1BhY2thZ2UvUmVmZXJlbmNlXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWZlcmVuY2VdLCBmb3VuZCBbJXNdICVwXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KIAkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCi0KIAkJY2FzZSBBUkdJX0NPTVBMRVhPQko6CiAKIAkJCS8qIE5lZWQgYSBidWZmZXIgb3IgcGFja2FnZSBvciAoQUNQSSAyLjApIFN0cmluZyAqLwogCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgpAQCAtNTY3LDIwICs1ODgsMjAgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIk5lZWRlZCBbQnVmZmVyL1N0cmluZy9QYWNrYWdlXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZV0sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJCSAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQogCQljYXNlIEFSR0lfUkVHSU9OX09SX0ZJRUxEOgogCiAJCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBSRUdJT04gb3IgYSBGSUVMRCBpbiBhIHJlZ2lvbiAqLwogCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJCQljYXNlIEFDUElfVFlQRV9SRUdJT046CiAJCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgpAQCAtNTkwLDIwICs2MTEsMjAgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIk5lZWRlZCBbUmVnaW9uL3JlZ2lvbl9maWVsZF0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiTmVlZGVkIFtSZWdpb24vcmVnaW9uX2ZpZWxkXSwgZm91bmQgWyVzXSAlcFxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CiAJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAotCiAJCWNhc2UgQVJHSV9EQVRBUkVGT0JKOgogCiAJCQkvKiBVc2VkIGJ5IHRoZSBTdG9yZSgpIG9wZXJhdG9yIG9ubHkgKi8KIAotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CkBAIC02MzUsNDcgKzY1Niw0NiBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIk5lZWRlZCBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWYvRGRiXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJOZWVkZWQgSW50ZWdlci9CdWZmZXIvU3RyaW5nL1BhY2thZ2UvUmVmL0RkYl0sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJCSAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQogCQlkZWZhdWx0OgogCiAJCQkvKiBVbmtub3duIHR5cGUgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludGVybmFsIC0gVW5rbm93biBBUkdJIChyZXF1aXJlZCBvcGVyYW5kKSB0eXBlICVYXG4iLAotCQkJCXRoaXNfYXJnX3R5cGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkludGVybmFsIC0gVW5rbm93biBBUkdJIChyZXF1aXJlZCBvcGVyYW5kKSB0eXBlICVYXG4iLAorCQkJCQkgIHRoaXNfYXJnX3R5cGUpKTsKIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAkJfQogCiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIHJlc29sdmVkIHRvIHRoZQogCQkgKiByZXF1aXJlZCBvYmplY3QgdHlwZSAoU2ltcGxlIGNhc2VzIG9ubHkpLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9jaGVja19vYmplY3RfdHlwZSAodHlwZV9uZWVkZWQsCi0JCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN0YWNrX3B0ciksICpzdGFja19wdHIpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUodHlwZV9uZWVkZWQsCisJCQkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJCQkJICAgKCpzdGFja19wdHIpLCAqc3RhY2tfcHRyKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi1uZXh0X29wZXJhbmQ6CisJICAgICAgbmV4dF9vcGVyYW5kOgogCQkvKgogCQkgKiBJZiBtb3JlIG9wZXJhbmRzIG5lZWRlZCwgZGVjcmVtZW50IHN0YWNrX3B0ciB0byBwb2ludAogCQkgKiB0byBuZXh0IG9wZXJhbmQgb24gc3RhY2sKIAkJICovCi0JCWlmIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKSkgeworCQlpZiAoR0VUX0NVUlJFTlRfQVJHX1RZUEUoYXJnX3R5cGVzKSkgewogCQkJc3RhY2tfcHRyLS07CiAJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKaW5kZXggMjcyNWRiMC4uYTdkOGVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCkBAIC00Miw3ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KQEAgLTUwLDI0ICs0OSwxOCBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4c3RvcmUiKQorQUNQSV9NT0RVTEVfTkFNRSgiZXhzdG9yZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIHZvaWQKLWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworYWNwaV9leF9kb19kZWJ1Z19vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQl1MzIgbGV2ZWwsIHUzMiBpbmRleCk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdmFsX2Rlc2MsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04NCwxMzYgKzc3LDE0NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpCithY3BpX2V4X2RvX2RlYnVnX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCXUzMiBsZXZlbCwgdTMyIGluZGV4KQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwl1MzIgaTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9kb19kZWJ1Z19vYmplY3QiLCBzb3VyY2VfZGVzYyk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2RvX2RlYnVnX29iamVjdCIsIHNvdXJjZV9kZXNjKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlKnMiLAotCQlsZXZlbCwgIiAiKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiW0FDUEkgRGVidWddICUqcyIsCisJCQkgICAgICBsZXZlbCwgIiAiKSk7CiAKIAkvKiBEaXNwbGF5IGluZGV4IGZvciBwYWNrYWdlIG91dHB1dCBvbmx5ICovCiAKIAlpZiAoaW5kZXggPiAwKSB7Ci0JICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJICAgIiglLjJ1KSAiLCBpbmRleCAtMSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCisJCQkJICAgICAgIiglLjJ1KSAiLCBpbmRleCAtIDEpKTsKIAl9CiAKIAlpZiAoIXNvdXJjZV9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICI8TnVsbCBPYmplY3Q+XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIjxOdWxsIE9iamVjdD5cbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAiLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShzb3VyY2VfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlczogIiwKKwkJCQkgICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJICAgICAgKHNvdXJjZV9kZXNjKSkpOwogCi0JCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3QgKHNvdXJjZV9kZXNjKSkgewotCQkgICBBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULAotCQkJICAgIiVwLCBJbnZhbGlkIEludGVybmFsIE9iamVjdCFcbiIsIHNvdXJjZV9kZXNjKSk7Ci0JCSAgIHJldHVybl9WT0lEOworCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0KHNvdXJjZV9kZXNjKSkgeworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAorCQkJCQkgICAgICAiJXAsIEludmFsaWQgSW50ZXJuYWwgT2JqZWN0IVxuIiwKKwkJCQkJICAgICAgc291cmNlX2Rlc2MpKTsKKwkJCXJldHVybl9WT0lEOwogCQl9Ci0JfQotCWVsc2UgaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlczogJXBcbiIsCi0JCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgc291cmNlX2Rlc2MpLT50eXBlKSwKLQkJCXNvdXJjZV9kZXNjKSk7CisJfSBlbHNlIGlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoc291cmNlX2Rlc2MpID09CisJCSAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAlcFxuIiwKKwkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoKChzdHJ1Y3QKKwkJCQkJCQkgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJICAgICAgKilzb3VyY2VfZGVzYyktPgorCQkJCQkJCSAgICB0eXBlKSwKKwkJCQkgICAgICBzb3VyY2VfZGVzYykpOwogCQlyZXR1cm5fVk9JRDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCS8qIE91dHB1dCBjb3JyZWN0IGludGVnZXIgd2lkdGggKi8KIAogCQlpZiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAotCQkJCSh1MzIpIHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WCU4LjhYXG4iLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAorCQkJCQkgICAgICAodTMyKSBzb3VyY2VfZGVzYy0+aW50ZWdlci4KKwkJCQkJICAgICAgdmFsdWUpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkJICAgICAgIjB4JTguOFglOC44WFxuIiwKKwkJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KHNvdXJjZV9kZXNjLT4KKwkJCQkJCQkJIGludGVnZXIuCisJCQkJCQkJCSB2YWx1ZSkpKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0iLAotCQkJKHUzMikgc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKLQkJQUNQSV9EVU1QX0JVRkZFUiAoc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwgMzIpID8gc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGggOiAzMik7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdXG4iLAorCQkJCSAgICAgICh1MzIpIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJCUFDUElfRFVNUF9CVUZGRVIoc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAoc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGggPAorCQkJCSAgMzIpID8gc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGggOiAzMik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXSBcIiVzXCJcbiIsCi0JCQlzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCwgc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyKSk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIFwiJXNcIlxuIiwKKwkJCQkgICAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCwKKwkJCQkgICAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIpKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYIEVsZW1lbnRzXVxuIiwKLQkJCXNvdXJjZV9kZXNjLT5wYWNrYWdlLmNvdW50KSk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkgICAgICAiWzB4JS4yWCBFbGVtZW50c11cbiIsCisJCQkJICAgICAgc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQpKTsKIAogCQkvKiBPdXRwdXQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcGFja2FnZSAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7Ci0JCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0sCi0JCQkJbGV2ZWwrNCwgaSsxKTsKKwkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KHNvdXJjZV9kZXNjLT5wYWNrYWdlLgorCQkJCQkJZWxlbWVudHNbaV0sIGxldmVsICsgNCwgaSArIDEpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfSU5ERVhfT1ApIHsKLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbJXMsIDB4JVhdXG4iLAotCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSksCi0JCQkJc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpKTsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkJICAgICAgIlslcywgMHglWF1cbiIsCisJCQkJCSAgICAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lCisJCQkJCSAgICAgIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSksCisJCQkJCSAgICAgIHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbJXNdXG4iLAorCQkJCQkgICAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZQorCQkJCQkgICAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CiAJCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzXVxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7Ci0JCX0KLQogCiAJCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgewotCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpID09Ci0JCQkJCUFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJCQkJc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5vYmplY3QsCi0JCQkJCWxldmVsKzQsIDApOworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRQorCQkJICAgIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgPT0KKwkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KCgoc3RydWN0CisJCQkJCQkJICBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCQkJIHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuCisJCQkJCQkJIG9iamVjdCktPm9iamVjdCwKKwkJCQkJCQlsZXZlbCArIDQsIDApOworCQkJfSBlbHNlIHsKKwkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCW9iamVjdCwgbGV2ZWwgKyA0LCAwKTsKIAkJCX0KLQkJCWVsc2UgewotCQkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0IChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwgbGV2ZWwrNCwgMCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKSB7Ci0JCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uubm9kZSktPm9iamVjdCwKLQkJCQlsZXZlbCs0LCAwKTsKKwkJfSBlbHNlIGlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpIHsKKwkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT4KKwkJCQkJCW9iamVjdCwgbGV2ZWwgKyA0LCAwKTsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVwICVzXG4iLAotCQkJc291cmNlX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlcCAlc1xuIiwKKwkJCQkgICAgICBzb3VyY2VfZGVzYywKKwkJCQkgICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJICAgICAgKHNvdXJjZV9kZXNjKSkpOwogCQlicmVhazsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywgIlxuIikpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsICJcbiIpKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlCkBAIC0yMzUsNDIgKzIzOCw0MSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV9leF9zdG9yZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MsCisJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlZl9kZXNjID0gZGVzdF9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZl9kZXNjID0gZGVzdF9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X3N0b3JlIiwgZGVzdF9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZSIsIGRlc3RfZGVzYyk7CiAKIAkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCiAKIAlpZiAoIXNvdXJjZV9kZXNjIHx8ICFkZXN0X2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOdWxsIHBhcmFtZXRlclxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk51bGwgcGFyYW1ldGVyXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCiAJLyogZGVzdF9kZXNjIGNhbiBiZSBlaXRoZXIgYSBuYW1lc3BhY2Ugbm9kZSBvciBhbiBBQ1BJIG9iamVjdCAqLwogCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoZGVzdF9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZGVzdF9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCQkvKgogCQkgKiBEZXN0IGlzIGEgbmFtZXNwYWNlIG5vZGUsCiAJCSAqIFN0b3JpbmcgYW4gb2JqZWN0IGludG8gYSBOYW1lZCBub2RlLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSAoc291cmNlX2Rlc2MsCi0JCQkJIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBkZXN0X2Rlc2MsIHdhbGtfc3RhdGUsCi0JCQkJIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTik7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUoc291cmNlX2Rlc2MsCisJCQkJCQkgICAgICAoc3RydWN0CisJCQkJCQkgICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJICAgICAgZGVzdF9kZXNjLCB3YWxrX3N0YXRlLAorCQkJCQkJICAgICAgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIERlc3RpbmF0aW9uIG9iamVjdCBtdXN0IGJlIGEgUmVmZXJlbmNlIG9yIGEgQ29uc3RhbnQgb2JqZWN0ICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChkZXN0X2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkZXN0X2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCQlicmVhazsKIApAQCAtMjc5LDcgKzI4MSw3IEBACiAJCS8qIEFsbG93IHN0b3JlcyB0byBDb25zdGFudHMgLS0gYSBOb29wIGFzIHBlciBBQ1BJIHNwZWMgKi8KIAogCQlpZiAoZGVzdF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfQU1MX0NPTlNUQU5UKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAogCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCkBAIC0yODgsMTYgKzI5MCwxOCBAQAogCiAJCS8qIERlc3RpbmF0aW9uIGlzIG5vdCBhIFJlZmVyZW5jZSBvYmplY3QgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJUYXJnZXQgaXMgbm90IGEgUmVmZXJlbmNlIG9yIENvbnN0YW50IG9iamVjdCAtICVzIFslcF1cbiIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChkZXN0X2Rlc2MpLCBkZXN0X2Rlc2MpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUYXJnZXQgaXMgbm90IGEgUmVmZXJlbmNlIG9yIENvbnN0YW50IG9iamVjdCAtICVzIFslcF1cbiIsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGRlc3RfZGVzYyksCisJCQkJICBkZXN0X2Rlc2MpKTsKIAotCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkgKHNvdXJjZV9kZXNjKTsKLQkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZIChkZXN0X2Rlc2MpOwotCQlBQ1BJX0RVTVBfT1BFUkFORFMgKCZkZXN0X2Rlc2MsIEFDUElfSU1PREVfRVhFQ1VURSwgImV4X3N0b3JlIiwKLQkJCQkgIDIsICJUYXJnZXQgaXMgbm90IGEgUmVmZXJlbmNlIG9yIENvbnN0YW50IG9iamVjdCIpOworCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoc291cmNlX2Rlc2MpOworCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoZGVzdF9kZXNjKTsKKwkJQUNQSV9EVU1QX09QRVJBTkRTKCZkZXN0X2Rlc2MsIEFDUElfSU1PREVfRVhFQ1VURSwgImV4X3N0b3JlIiwKKwkJCQkgICAyLAorCQkJCSAgICJUYXJnZXQgaXMgbm90IGEgUmVmZXJlbmNlIG9yIENvbnN0YW50IG9iamVjdCIpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAl9CiAKIAkvKgpAQCAtMzE0LDU4ICszMTgsNTkgQEAKIAogCQkvKiBTdG9yaW5nIGFuIG9iamVjdCBpbnRvIGEgTmFtZSAiY29udGFpbmVyIiAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKHNvdXJjZV9kZXNjLAotCQkJCSByZWZfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKLQkJCQkgd2Fsa19zdGF0ZSwgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZShzb3VyY2VfZGVzYywKKwkJCQkJCSAgICAgIHJlZl9kZXNjLT5yZWZlcmVuY2UuCisJCQkJCQkgICAgICBvYmplY3QsIHdhbGtfc3RhdGUsCisJCQkJCQkgICAgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04pOwogCQlicmVhazsKIAotCiAJY2FzZSBBTUxfSU5ERVhfT1A6CiAKIAkJLyogU3RvcmluZyB0byBhbiBJbmRleCAocG9pbnRlciBpbnRvIGEgcGFja2FnZXIgb3IgYnVmZmVyKSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4IChzb3VyY2VfZGVzYywgcmVmX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXgoc291cmNlX2Rlc2MsIHJlZl9kZXNjLAorCQkJCQkJICB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0xPQ0FMX09QOgogCWNhc2UgQU1MX0FSR19PUDoKIAogCQkvKiBTdG9yZSB0byBhIG1ldGhvZCBsb2NhbC9hcmcgICovCiAKLQkJc3RhdHVzID0gYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwgKHJlZl9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCSByZWZfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwocmVmX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUsCisJCQkJCQkgIHJlZl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0LAorCQkJCQkJICBzb3VyY2VfZGVzYywgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9ERUJVR19PUDoKIAogCQkvKgogCQkgKiBTdG9yaW5nIHRvIHRoZSBEZWJ1ZyBvYmplY3QgY2F1c2VzIHRoZSB2YWx1ZSBzdG9yZWQgdG8gYmUKIAkJICogZGlzcGxheWVkIGFuZCBvdGhlcndpc2UgaGFzIG5vIGVmZmVjdCAtLSBzZWUgQUNQSSBTcGVjaWZpY2F0aW9uCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIioqKiogV3JpdGUgdG8gRGVidWcgT2JqZWN0OiBPYmplY3QgJXAgJXMgKioqKjpcblxuIiwKLQkJCXNvdXJjZV9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIioqKiogV3JpdGUgdG8gRGVidWcgT2JqZWN0OiBPYmplY3QgJXAgJXMgKioqKjpcblxuIiwKKwkJCQkgIHNvdXJjZV9kZXNjLAorCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYykpKTsKIAotCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MsIDAsIDApOworCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdChzb3VyY2VfZGVzYywgMCwgMCk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoImV4X3N0b3JlOiBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVhcbiIsCi0JCQlyZWZfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOwotCQlBQ1BJX0RVTVBfRU5UUlkgKHJlZl9kZXNjLCBBQ1BJX0xWX0VSUk9SKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJleF9zdG9yZTogVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlICVYXG4iLAorCQkJCSAgIHJlZl9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCUFDUElfRFVNUF9FTlRSWShyZWZfZGVzYywgQUNQSV9MVl9FUlJPUik7CiAKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXgKQEAgLTM4MSwyMCArMzg2LDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbmRleF9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmluZGV4X2Rlc2MsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbmV3X2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5ld19kZXNjOworCXU4IHZhbHVlID0gMDsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3N0b3JlX29iamVjdF90b19pbmRleCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4Iik7CiAKIAkvKgogCSAqIERlc3RpbmF0aW9uIG11c3QgYmUgYSByZWZlcmVuY2UgcG9pbnRlciwgYW5kCkBAIC00MTMsMTkgKzQxNSwyMCBAQAogCQkgKi8KIAkJb2JqX2Rlc2MgPSAqKGluZGV4X2Rlc2MtPnJlZmVyZW5jZS53aGVyZSk7CiAKLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoc291cmNlX2Rlc2MsICZuZXdfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3Qoc291cmNlX2Rlc2MsICZuZXdfZGVzYywKKwkJCQkJCSAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCWlmIChvYmpfZGVzYykgewogCQkJLyogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZSAqLwogCi0JCQlmb3IgKGkgPSAwOwotCQkJCSBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCi0JCQkJCQlpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsKLQkJCQkgaSsrKSB7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCQkJCSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLgorCQkJICAgICByZWZlcmVuY2VfY291bnQ7IGkrKykgeworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQl9CiAJCX0KIApAQCAtNDMzLDE2ICs0MzYsMTQgQEAKIAogCQkvKiBJbmNyZW1lbnQgcmVmIGNvdW50IGJ5IHRoZSByZWYgY291bnQgb2YgdGhlIHBhcmVudCBwYWNrYWdlLTEgKi8KIAotCQlmb3IgKGkgPSAxOwotCQkJIGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikKLQkJCQkJaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7Ci0JCQkgaSsrKSB7Ci0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKG5ld19kZXNjKTsKKwkJZm9yIChpID0gMTsgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLgorCQkgICAgIHJlZmVyZW5jZV9jb3VudDsgaSsrKSB7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UobmV3X2Rlc2MpOwogCQl9CiAKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAogCQkvKgpAQCAtNDYwLDE2ICs0NjEsMTYgQEAKIAkJICogYnkgdGhlIElOREVYX09QIGNvZGUuCiAJCSAqLwogCQlvYmpfZGVzYyA9IGluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7Ci0JCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAmJgotCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpICYmCisJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9TVFJJTkcpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAogCQkvKgogCQkgKiBUaGUgYXNzaWdubWVudCBvZiB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyB3aWxsIGJlIHNsaWdodGx5CiAJCSAqIGRpZmZlcmVudCBmb3IgZWFjaCBzb3VyY2UgdHlwZS4KIAkJICovCi0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgeworCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSkgewogCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCQkvKiBVc2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIGludGVnZXIgKi8KQEAgLTQ4OSwxMCArNDkwLDExIEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgaW52YWxpZCAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiU291cmNlIG11c3QgYmUgSW50ZWdlci9CdWZmZXIvU3RyaW5nIHR5cGUsIG5vdCAlc1xuIiwKLQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJTb3VyY2UgbXVzdCBiZSBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcgdHlwZSwgbm90ICVzXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAoc291cmNlX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAogCQkvKiBTdG9yZSB0aGUgc291cmNlIHZhbHVlIGludG8gdGhlIHRhcmdldCBidWZmZXIgYnl0ZSAqLwpAQCAtNTAwLDE4ICs1MDIsMTYgQEAKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2luZGV4X2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXRdID0gdmFsdWU7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJUYXJnZXQgaXMgbm90IGEgUGFja2FnZSBvciBidWZmZXJfZmllbGRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUYXJnZXQgaXMgbm90IGEgUGFja2FnZSBvciBidWZmZXJfZmllbGRcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUKQEAgLTUzOSw0MiArNTM5LDQwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRfY29udmVyc2lvbikKK2FjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICB1OCBpbXBsaWNpdF9jb252ZXJzaW9uKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbmV3X2Rlc2M7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfZGVzYzsKKwlhY3BpX29iamVjdF90eXBlIHRhcmdldF90eXBlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X3N0b3JlX29iamVjdF90b19ub2RlIiwgc291cmNlX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3N0b3JlX29iamVjdF90b19ub2RlIiwgc291cmNlX2Rlc2MpOwogCiAJLyogR2V0IGN1cnJlbnQgdHlwZSBvZiB0aGUgbm9kZSwgYW5kIG9iamVjdCBhdHRhY2hlZCB0byBOb2RlICovCiAKLQl0YXJnZXRfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKG5vZGUpOwotCXRhcmdldF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKKwl0YXJnZXRfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUobm9kZSk7CisJdGFyZ2V0X2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiU3RvcmluZyAlcCglcykgaW50byBub2RlICVwKCVzKVxuIiwKLQkJc291cmNlX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSwKLQkJCSAgbm9kZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0YXJnZXRfdHlwZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJTdG9yaW5nICVwKCVzKSBpbnRvIG5vZGUgJXAoJXMpXG4iLAorCQkJICBzb3VyY2VfZGVzYywKKwkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYyksIG5vZGUsCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0YXJnZXRfdHlwZSkpKTsKIAogCS8qCiAJICogUmVzb2x2ZSB0aGUgc291cmNlIG9iamVjdCB0byBhbiBhY3R1YWwgdmFsdWUKIAkgKiAoSWYgaXQgaXMgYSByZWZlcmVuY2Ugb2JqZWN0KQogCSAqLwotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vYmplY3QgKCZzb3VyY2VfZGVzYywgdGFyZ2V0X3R5cGUsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vYmplY3QoJnNvdXJjZV9kZXNjLCB0YXJnZXRfdHlwZSwgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIElmIG5vIGltcGxpY2l0IGNvbnZlcnNpb24sIGRyb3AgaW50byB0aGUgZGVmYXVsdCBjYXNlIGJlbG93ICovCiAKLQlpZiAoIWltcGxpY2l0X2NvbnZlcnNpb24pIHsKKwlpZiAoKCFpbXBsaWNpdF9jb252ZXJzaW9uKSB8fCAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9DT1BZX09QKSkgewogCQkvKiBGb3JjZSBleGVjdXRpb24gb2YgZGVmYXVsdCAobm8gaW1wbGljaXQgY29udmVyc2lvbikgKi8KIAogCQl0YXJnZXRfdHlwZSA9IEFDUElfVFlQRV9BTlk7CkBAIC01OTAsMTEgKzU4OCwxMCBAQAogCiAJCS8qIEZvciBmaWVsZHMsIGNvcHkgdGhlIHNvdXJjZSBkYXRhIHRvIHRoZSB0YXJnZXQgZmllbGQuICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkIChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCi0JCQkJICZ3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKwkJc3RhdHVzID0gYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkJCSAgICAgJndhbGtfc3RhdGUtPnJlc3VsdF9vYmopOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgpAQCAtNjA1LDEwICs2MDIsMTEgQEAKIAkJICoKIAkJICogQ29weSBhbmQvb3IgY29udmVydCB0aGUgc291cmNlIG9iamVjdCB0byBhIG5ldyB0YXJnZXQgb2JqZWN0CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKLQkJCQkgJm5ld19kZXNjLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0KHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkJCSAgICZuZXdfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQlpZiAobmV3X2Rlc2MgIT0gdGFyZ2V0X2Rlc2MpIHsKQEAgLTYyMSwzMCArNjE5LDMzIEBACiAJCQkgKiBoYXMgYmVlbiBwZXJmb3JtZWQgc3VjaCB0aGF0IHRoZSBub2RlL29iamVjdCB0eXBlIGhhcyBiZWVuCiAJCQkgKiBjaGFuZ2VkLgogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5vZGUsIG5ld19kZXNjLCBuZXdfZGVzYy0+Y29tbW9uLnR5cGUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgbmV3X2Rlc2MsCisJCQkJCQkgIG5ld19kZXNjLT5jb21tb24udHlwZSk7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIlN0b3JlICVzIGludG8gJXMgdmlhIENvbnZlcnQvQXR0YWNoXG4iLAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSwKLQkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChuZXdfZGVzYykpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiU3RvcmUgJXMgaW50byAlcyB2aWEgQ29udmVydC9BdHRhY2hcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgIChzb3VyY2VfZGVzYyksCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgIChuZXdfZGVzYykpKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIlN0b3JpbmcgJXMgKCVwKSBkaXJlY3RseSBpbnRvIG5vZGUgKCVwKSwgbm8gaW1wbGljaXQgY29udmVyc2lvblxuIiwKLQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSwgc291cmNlX2Rlc2MsIG5vZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlN0b3JpbmcgJXMgKCVwKSBkaXJlY3RseSBpbnRvIG5vZGUgKCVwKSB3aXRoIG5vIGltcGxpY2l0IGNvbnZlcnNpb25cbiIsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSwKKwkJCQkgIHNvdXJjZV9kZXNjLCBub2RlKSk7CiAKIAkJLyogTm8gY29udmVyc2lvbnMgZm9yIGFsbCBvdGhlciB0eXBlcy4gIEp1c3QgYXR0YWNoIHRoZSBzb3VyY2Ugb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBzb3VyY2VfZGVzYywKLQkJCQkgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBzb3VyY2VfZGVzYywKKwkJCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkJCSAgICAgICAoc291cmNlX2Rlc2MpKTsKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKaW5kZXggMTIwZjMwZS4uMzgyZjYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKQEAgLTQzLDE1ICs0MywxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhzdG9yZW4iKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleHN0b3JlbiIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjcsMTkgKzY0LDE1IEBACiAgKiAgICAgICAgICAgICAgaXQgYW5kIHJldHVybiB0aGUgYWN0dWFsIG9iamVjdCBpbiB0aGUgc291cmNlX2Rlc2NfcHRyLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc291cmNlX2Rlc2NfcHRyLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnNvdXJjZV9kZXNjX3B0ciwKKwkJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdGFyZ2V0X3R5cGUsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjID0gKnNvdXJjZV9kZXNjX3B0cjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjID0gKnNvdXJjZV9kZXNjX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3Jlc29sdmVfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9yZXNvbHZlX29iamVjdCIpOwogCiAJLyogRW5zdXJlIHdlIGhhdmUgYSBUYXJnZXQgdGhhdCBjYW4gYmUgc3RvcmVkIHRvICovCiAKQEAgLTEwMiwxMSArOTUsMTQgQEAKIAkJICogYXJlIGFsbCBlc3NlbnRpYWxseSB0aGUgc2FtZS4gIFRoaXMgY2FzZSBoYW5kbGVzIHRoZQogCQkgKiAiaW50ZXJjaGFuZ2VhYmxlIiB0eXBlcyBJbnRlZ2VyLCBTdHJpbmcsIGFuZCBCdWZmZXIuCiAJCSAqLwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgPT0KKwkJICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKIAkJCS8qIFJlc29sdmUgYSByZWZlcmVuY2Ugb2JqZWN0IGZpcnN0ICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAoc291cmNlX2Rlc2NfcHRyLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHNvdXJjZV9kZXNjX3B0ciwKKwkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTE5LDMxICsxMTUsMzIgQEAKIAogCQkvKiBNdXN0IGhhdmUgYSBJbnRlZ2VyLCBCdWZmZXIsIG9yIFN0cmluZyAqLwogCi0JCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgICAmJgotCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgICAgJiYKLQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9TVFJJTkcpICAgICYmCi0JCQkhKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpICYmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfTE9BRF9PUCkpKSB7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSAmJgorCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAmJgorCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSAmJgorCQkgICAgISgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09CisJCSAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkgICAgICAmJiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0xPQURfT1ApKSkgewogCQkJLyogQ29udmVyc2lvbiBzdWNjZXNzZnVsIGJ1dCBzdGlsbCBub3QgYSB2YWxpZCB0eXBlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDYW5ub3QgYXNzaWduIHR5cGUgJXMgdG8gJXMgKG11c3QgYmUgdHlwZSBJbnQvU3RyL0J1ZilcbiIsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodGFyZ2V0X3R5cGUpKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDYW5ub3QgYXNzaWduIHR5cGUgJXMgdG8gJXMgKG11c3QgYmUgdHlwZSBJbnQvU3RyL0J1ZilcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgIChzb3VyY2VfZGVzYyksCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRhcmdldF90eXBlKSkpOwogCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOgogCiAJCS8qIEFsaWFzZXMgYXJlIHJlc29sdmVkIGJ5IGFjcGlfZXhfcHJlcF9vcGVyYW5kcyAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlN0b3JlIGludG8gQWxpYXMgLSBzaG91bGQgbmV2ZXIgaGFwcGVuXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiU3RvcmUgaW50byBBbGlhcyAtIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAlkZWZhdWx0OgogCkBAIC0xNTQsMTAgKzE1MSw5IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QKQEAgLTE5NCwxOCArMTkwLDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm5ld19kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipuZXdfZGVzYywKKwkJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmFjdHVhbF9zcmNfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjdHVhbF9zcmNfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJleF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0Iiwgc291cmNlX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3N0b3JlX29iamVjdF90b19vYmplY3QiLCBzb3VyY2VfZGVzYyk7CiAKIAlhY3R1YWxfc3JjX2Rlc2MgPSBzb3VyY2VfZGVzYzsKIAlpZiAoIWRlc3RfZGVzYykgewpAQCAtMjE0LDExICsyMDcsMTQgQEAKIAkJICogcGFja2FnZSBlbGVtZW50KSwgc28gd2UgY2FuIHNpbXBseSBjb3B5IHRoZSBzb3VyY2Ugb2JqZWN0CiAJCSAqIGNyZWF0aW5nIGEgbmV3IGRlc3RpbmF0aW9uIG9iamVjdAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoYWN0dWFsX3NyY19kZXNjLCBuZXdfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QoYWN0dWFsX3NyY19kZXNjLCBuZXdfZGVzYywKKwkJCQkJCSAgICB3YWxrX3N0YXRlKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGRlc3RfZGVzYykpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9CisJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKGRlc3RfZGVzYykpIHsKIAkJLyoKIAkJICogVGhlIHNvdXJjZSB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBkZXN0aW5hdGlvbi4KIAkJICogUGVyZm9ybSB0aGUgImltcGxpY2l0IGNvbnZlcnNpb24iIG9mIHRoZSBzb3VyY2UgdG8gdGhlIGN1cnJlbnQgdHlwZQpAQCAtMjI4LDEwICsyMjQsMTMgQEAKIAkJICogT3RoZXJ3aXNlLCBhY3R1YWxfc3JjX2Rlc2MgaXMgYSB0ZW1wb3Jhcnkgb2JqZWN0IHRvIGhvbGQgdGhlCiAJCSAqIGNvbnZlcnRlZCBvYmplY3QuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fdGFyZ2V0X3R5cGUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChkZXN0X2Rlc2MpLAotCQkJCSAgc291cmNlX2Rlc2MsICZhY3R1YWxfc3JjX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fdGFyZ2V0X3R5cGUoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCSAgIChkZXN0X2Rlc2MpLCBzb3VyY2VfZGVzYywKKwkJCQkJCSAgICZhY3R1YWxfc3JjX2Rlc2MsCisJCQkJCQkgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCWlmIChzb3VyY2VfZGVzYyA9PSBhY3R1YWxfc3JjX2Rlc2MpIHsKQEAgLTI0MCw3ICsyMzksNyBAQAogCQkJICogbmV3IG9iamVjdC4KIAkJCSAqLwogCQkJKm5ld19kZXNjID0gc291cmNlX2Rlc2M7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAl9CiAKQEAgLTI0OCw0MiArMjQ3LDQyIEBACiAJICogV2Ugbm93IGhhdmUgdHdvIG9iamVjdHMgb2YgaWRlbnRpY2FsIHR5cGVzLCBhbmQgd2UgY2FuIHBlcmZvcm0gYQogCSAqIGNvcHkgb2YgdGhlICp2YWx1ZSogb2YgdGhlIHNvdXJjZSBvYmplY3QuCiAJICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoZGVzdF9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGVzdF9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKIAkJZGVzdF9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gYWN0dWFsX3NyY19kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCiAJCS8qIFRydW5jYXRlIHZhbHVlIGlmIHdlIGFyZSBleGVjdXRpbmcgZnJvbSBhIDMyLWJpdCBBQ1BJIHRhYmxlICovCiAKLQkJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZSAoZGVzdF9kZXNjKTsKKwkJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShkZXN0X2Rlc2MpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcgKGFjdHVhbF9zcmNfZGVzYywgZGVzdF9kZXNjKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyhhY3R1YWxfc3JjX2Rlc2MsIGRlc3RfZGVzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCi0JCS8qCi0JCSAqIE5vdGU6IFRoZXJlIGlzIGRpZmZlcmVudCBzdG9yZSBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIG9yaWdpbmFsCi0JCSAqIHNvdXJjZSB0eXBlCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIgKGFjdHVhbF9zcmNfZGVzYywgZGVzdF9kZXNjKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlcihhY3R1YWxfc3JjX2Rlc2MsIGRlc3RfZGVzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0IChhY3R1YWxfc3JjX2Rlc2MsICZkZXN0X2Rlc2MsCi0JCQkJIHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdChhY3R1YWxfc3JjX2Rlc2MsICZkZXN0X2Rlc2MsCisJCQkJCQkgICAgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJLyoKIAkJICogQWxsIG90aGVyIHR5cGVzIGNvbWUgaGVyZS4KIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1dBUk4sICJTdG9yZSBpbnRvIHR5cGUgJXMgbm90IGltcGxlbWVudGVkXG4iLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoZGVzdF9kZXNjKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiU3RvcmUgaW50byB0eXBlICVzIG5vdCBpbXBsZW1lbnRlZFxuIiwKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoZGVzdF9kZXNjKSkpOwogCiAJCXN0YXR1cyA9IEFFX05PVF9JTVBMRU1FTlRFRDsKIAkJYnJlYWs7CkBAIC0yOTIsMTEgKzI5MSw5IEBACiAJaWYgKGFjdHVhbF9zcmNfZGVzYyAhPSBzb3VyY2VfZGVzYykgewogCQkvKiBEZWxldGUgdGhlIGludGVybWVkaWF0ZSAodGVtcG9yYXJ5KSBzb3VyY2Ugb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChhY3R1YWxfc3JjX2Rlc2MpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYWN0dWFsX3NyY19kZXNjKTsKIAl9CiAKIAkqbmV3X2Rlc2MgPSBkZXN0X2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKaW5kZXggMTJkMTUyNy4uYzRmZjY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKQEAgLTQyLDE0ICs0MiwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhzdG9yb2IiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJleHN0b3JvYiIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjMsMTggKzYwLDE0IEBACiAgKiBERVNDUklQVElPTjogQ29weSBhIGJ1ZmZlciBvYmplY3QgdG8gYW5vdGhlciBidWZmZXIgb2JqZWN0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldF9kZXNjKQorYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKKwl1MzIgbGVuZ3RoOworCXU4ICpidWZmZXI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlciIsIHNvdXJjZV9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyIiwgc291cmNlX2Rlc2MpOwogCiAJLyogV2Uga25vdyB0aGF0IHNvdXJjZV9kZXNjIGlzIGEgYnVmZmVyIGJ5IG5vdyAqLwogCkBAIC04NiwxMCArNzksMTAgQEAKIAkgKiBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb2YgdGhlIHByb3BlciBsZW5ndGgKIAkgKi8KIAlpZiAoKHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoID09IDApIHx8Ci0JCSh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkgewotCQl0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPSBBQ1BJX01FTV9BTExPQ0FURSAobGVuZ3RoKTsKKwkgICAgKHRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSB7CisJCXRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciA9IEFDUElfTUVNX0FMTE9DQVRFKGxlbmd0aCk7CiAJCWlmICghdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCXRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoID0gbGVuZ3RoOwpAQCAtMTAwLDggKzkzLDkgQEAKIAlpZiAobGVuZ3RoIDw9IHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKSB7CiAJCS8qIENsZWFyIGV4aXN0aW5nIGJ1ZmZlciBhbmQgY29weSBpbiB0aGUgbmV3IG9uZSAqLwogCi0JCUFDUElfTUVNU0VUICh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIDAsIHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKTsKLQkJQUNQSV9NRU1DUFkgKHRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciwgYnVmZmVyLCBsZW5ndGgpOworCQlBQ1BJX01FTVNFVCh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIDAsCisJCQkgICAgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKIAogI2lmZGVmIEFDUElfT0JTT0xFVEVfQkVIQVZJT1IKIAkJLyoKQEAgLTEyNCwyNiArMTE4LDI0IEBACiAJCQl0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKIAkJfQogI2VuZGlmCi0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIFRydW5jYXRlIHRoZSBzb3VyY2UsIGNvcHkgb25seSB3aGF0IHdpbGwgZml0ICovCiAKLQkJQUNQSV9NRU1DUFkgKHRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciwgYnVmZmVyLAotCQkJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwKKwkJCSAgICB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCSJUcnVuY2F0aW5nIHNvdXJjZSBidWZmZXIgZnJvbSAlWCB0byAlWFxuIiwKLQkJCWxlbmd0aCwgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlRydW5jYXRpbmcgc291cmNlIGJ1ZmZlciBmcm9tICVYIHRvICVYXG4iLAorCQkJCSAgbGVuZ3RoLCB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwogCX0KIAogCS8qIENvcHkgZmxhZ3MgKi8KIAogCXRhcmdldF9kZXNjLT5idWZmZXIuZmxhZ3MgPSBzb3VyY2VfZGVzYy0+YnVmZmVyLmZsYWdzOwogCXRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJj0gfkFPUE9CSl9TVEFUSUNfUE9JTlRFUjsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZwpAQCAtMTU4LDE2ICsxNTAsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldF9kZXNjKQorYWNwaV9leF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKKwl1MzIgbGVuZ3RoOworCXU4ICpidWZmZXI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyIsIHNvdXJjZV9kZXNjKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nIiwgc291cmNlX2Rlc2MpOwogCiAJLyogV2Uga25vdyB0aGF0IHNvdXJjZV9kZXNjIGlzIGEgc3RyaW5nIGJ5IG5vdyAqLwogCkBAIC0xNzksNDEgKzE2OCwzOCBAQAogCSAqIHBvaW50ZXIgaXMgbm90IGEgc3RhdGljIHBvaW50ZXIgKHBhcnQgb2YgYW4gQUNQSSB0YWJsZSkKIAkgKi8KIAlpZiAoKGxlbmd0aCA8IHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoKSAmJgotCSAgICghKHRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSkgeworCSAgICAoISh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKIAkJLyoKIAkJICogU3RyaW5nIHdpbGwgZml0IGluIGV4aXN0aW5nIG5vbi1zdGF0aWMgYnVmZmVyLgogCQkgKiBDbGVhciBvbGQgc3RyaW5nIGFuZCBjb3B5IGluIHRoZSBuZXcgb25lCiAJCSAqLwotCQlBQ1BJX01FTVNFVCAodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCAwLAotCQkJKGFjcGlfc2l6ZSkgdGFyZ2V0X2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxKTsKLQkJQUNQSV9NRU1DUFkgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgYnVmZmVyLCBsZW5ndGgpOwotCX0KLQllbHNlIHsKKwkJQUNQSV9NRU1TRVQodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCAwLAorCQkJICAgIChhY3BpX3NpemUpIHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCUFDUElfTUVNQ1BZKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgYnVmZmVyLCBsZW5ndGgpOworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEZyZWUgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGVuIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlcgogCQkgKiBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgdmFsdWUKIAkJICovCiAJCWlmICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgJiYKLQkJICAgKCEodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpKSB7CisJCSAgICAoISh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKIAkJCS8qIE9ubHkgZnJlZSBpZiBub3QgYSBwb2ludGVyIGludG8gdGhlIERTRFQgKi8KIAotCQkJQUNQSV9NRU1fRlJFRSAodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKKwkJCUFDUElfTUVNX0ZSRUUodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKIAkJfQogCi0JCXRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciA9IEFDUElfTUVNX0NBTExPQ0FURSAoCi0JCQkJICAgKGFjcGlfc2l6ZSkgbGVuZ3RoICsgMSk7CisJCXRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciA9IEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKQorCQkJCQkJCQkgbGVuZ3RoICsgMSk7CiAJCWlmICghdGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCXRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJj0gfkFPUE9CSl9TVEFUSUNfUE9JTlRFUjsKLQkJQUNQSV9NRU1DUFkgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgYnVmZmVyLCBsZW5ndGgpOworCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKIAl9CiAKIAkvKiBTZXQgdGhlIG5ldyB0YXJnZXQgbGVuZ3RoICovCiAKIAl0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCA9IGxlbmd0aDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3lzdGVtLmMKaW5kZXggY2FmYTcwMi4uOGE4OGI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3lzdGVtLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3lzdGVtLmMKQEAgLTQyLDE0ICs0MiwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHN5c3RlbSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImV4c3lzdGVtIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NSw0OSArNjMsNDIgQEAKICAqICAgICAgICAgICAgICBpbnRlcnByZXRlciBpcyByZWxlYXNlZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCkKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfaGFuZGxlIHNlbWFwaG9yZSwgdTE2IHRpbWVvdXQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMyOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUgKHNlbWFwaG9yZSwgMSwgMCk7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9vc193YWl0X3NlbWFwaG9yZShzZW1hcGhvcmUsIDEsIDApOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlpZiAoc3RhdHVzID09IEFFX1RJTUUpIHsKIAkJLyogV2UgbXVzdCB3YWl0LCBzbyB1bmxvY2sgdGhlIGludGVycHJldGVyICovCiAKLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyICgpOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAotCQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlIChzZW1hcGhvcmUsIDEsIHRpbWVvdXQpOworCQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKHNlbWFwaG9yZSwgMSwgdGltZW91dCk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSIqKiogVGhyZWFkIGF3YWtlIGFmdGVyIGJsb2NraW5nLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiKioqIFRocmVhZCBhd2FrZSBhZnRlciBibG9ja2luZywgJXNcbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCiAJCS8qIFJlYWNxdWlyZSB0aGUgaW50ZXJwcmV0ZXIgKi8KIAotCQlzdGF0dXMyID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzMikpIHsKKwkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewogCQkJLyogUmVwb3J0IGZhdGFsIGVycm9yLCBjb3VsZCBub3QgYWNxdWlyZSBpbnRlcnByZXRlciAqLwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1czIpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N0YWxsCkBAIC0xMjUsMzUgKzExNiwyOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9kb19zdGFsbCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dfbG9uZykKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX2RvX3N0YWxsKHUzMiBob3dfbG9uZykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JaWYgKGhvd19sb25nID4gMjU1KSAvKiAyNTUgbWljcm9zZWNvbmRzICovIHsKKwlpZiAoaG93X2xvbmcgPiAyNTUpIHsJLyogMjU1IG1pY3Jvc2Vjb25kcyAqLwogCQkvKgogCQkgKiBMb25nZXIgdGhhbiAyNTUgdXNlYywgdGhpcyBpcyBhbiBlcnJvcgogCQkgKgogCQkgKiAoQUNQSSBzcGVjaWZpZXMgMTAwIHVzZWMgYXMgbWF4LCBidXQgdGhpcyBnaXZlcyBzb21lIHNsYWNrIGluCiAJCSAqIG9yZGVyIHRvIHN1cHBvcnQgZXhpc3RpbmcgQklPU3MpCiAJCSAqLwotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTdGFsbDogVGltZSBwYXJhbWV0ZXIgaXMgdG9vIGxhcmdlICglZClcbiIsCi0JCQlob3dfbG9uZykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlN0YWxsOiBUaW1lIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UgKCVkKVxuIiwKKwkJCQkgICBob3dfbG9uZykpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKLQl9Ci0JZWxzZSB7Ci0JCWFjcGlfb3Nfc3RhbGwgKGhvd19sb25nKTsKKwl9IGVsc2UgeworCQlhY3BpX29zX3N0YWxsKGhvd19sb25nKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZApAQCAtMTY3LDI5ICsxNTIsMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZCAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBob3dfbG9uZykKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQoYWNwaV9pbnRlZ2VyIGhvd19sb25nKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIFNpbmNlIHRoaXMgdGhyZWFkIHdpbGwgc2xlZXAsIHdlIG11c3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIgKi8KIAotCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAotCWFjcGlfb3Nfc2xlZXAgKGhvd19sb25nKTsKKwlhY3BpX29zX3NsZWVwKGhvd19sb25nKTsKIAogCS8qIEFuZCBub3cgd2UgbXVzdCBnZXQgdGhlIGludGVycHJldGVyIGFnYWluICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOworCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleApAQCAtMjA2LDMzICsxODYsMzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aW1lX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCithY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiB0aW1lX2Rlc2MsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBvYmpfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X3N5c3RlbV9hY3F1aXJlX211dGV4Iiwgb2JqX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3N5c3RlbV9hY3F1aXJlX211dGV4Iiwgb2JqX2Rlc2MpOwogCiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIGdvIGdldCB0aGUgZ2xvYmFsIGxvY2sgKi8KIAogCWlmIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlID09IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkgewotCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKCh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jaygodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSAob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSwKLQkJCSAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZShvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlLAorCQkJCQkgICAgICAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4CkBAIC0yNDgsMzIgKzIyNSwyNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X3N5c3RlbV9yZWxlYXNlX211dGV4Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fcmVsZWFzZV9tdXRleCIpOwogCiAJaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIHJlbGVhc2UgdGhlIGdsb2JhbCBsb2NrICovCiAKIAlpZiAob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpIHsKLQkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrICgpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jaygpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUsIDEpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSwgMSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fc2lnbmFsX2V2ZW50CkBAIC0yODcsMjQgKzI1OSwxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQorYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fc2lnbmFsX2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9zeXN0ZW1fc2lnbmFsX2V2ZW50Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fc2lnbmFsX2V2ZW50Iik7CiAKIAlpZiAob2JqX2Rlc2MpIHsKLQkJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlIChvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlLCAxKTsKKwkJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKG9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUsIDEpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50CkBAIC0zMjEsMjUgKzI4OCwyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRpbWVfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGltZV9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfc3lzdGVtX3dhaXRfZXZlbnQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3N5c3RlbV93YWl0X2V2ZW50Iik7CiAKIAlpZiAob2JqX2Rlc2MpIHsKLQkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKG9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUsCi0JCQkJICh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZShvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlLAorCQkJCQkJICAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIuCisJCQkJCQkgIHZhbHVlKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fcmVzZXRfZXZlbnQKQEAgLTM1MiwyNyArMzE3LDIzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYykKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9zZW1hcGhvcmU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdm9pZCAqdGVtcF9zZW1hcGhvcmU7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIFdlIGFyZSBnb2luZyB0byBzaW1wbHkgZGVsZXRlIHRoZSBleGlzdGluZyBzZW1hcGhvcmUgYW5kCiAJICogY3JlYXRlIGEgbmV3IG9uZSEKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKEFDUElfTk9fVU5JVF9MSU1JVCwgMCwgJnRlbXBfc2VtYXBob3JlKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCSh2b2lkKSBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUgKG9ial9kZXNjLT5ldmVudC5zZW1hcGhvcmUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZShBQ1BJX05PX1VOSVRfTElNSVQsIDAsICZ0ZW1wX3NlbWFwaG9yZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCSh2b2lkKWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKIAkJb2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSA9IHRlbXBfc2VtYXBob3JlOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKaW5kZXggNWM3ZWMwYy4uMWVlNzlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCkBAIC00Miw3ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAvKgogICogREVGSU5FX0FNTF9HTE9CQUxTIGlzIHRlc3RlZCBpbiBhbWxjb2RlLmgKICAqIHRvIGRldGVybWluZSB3aGV0aGVyIGNlcnRhaW4gZ2xvYmFsIG5hbWVzIHNob3VsZCBiZSAiZGVmaW5lZCIgb3Igb25seQpAQCAtNjUsMTUgKzY0LDEwIEBACiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXh1dGlscyIpCitBQ1BJX01PRFVMRV9OQU1FKCJleHV0aWxzIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdTMyCi1hY3BpX2V4X2RpZ2l0c19uZWVkZWQgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKTsKLQorc3RhdGljIHUzMiBhY3BpX2V4X2RpZ2l0c19uZWVkZWQoYWNwaV9pbnRlZ2VyIHZhbHVlLCB1MzIgYmFzZSk7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODksMjQgKzgzLDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2VudGVyX2ludGVycHJldGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZW50ZXJfaW50ZXJwcmV0ZXIiKTsKIAotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9FWEVDVVRFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBhY3F1aXJlIGludGVycHJldGVyIG11dGV4XG4iKSk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VYRUNVVEUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhY3F1aXJlIGludGVycHJldGVyIG11dGV4XG4iKSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcgpAQCAtMTI5LDI1ICsxMTksMjAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKAotCXZvaWQpCit2b2lkIGFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcih2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2V4aXRfaW50ZXJwcmV0ZXIiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9leGl0X2ludGVycHJldGVyIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfRVhFQ1VURSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgcmVsZWFzZSBpbnRlcnByZXRlciBtdXRleFxuIikpOworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FWEVDVVRFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgcmVsZWFzZSBpbnRlcnByZXRlciBtdXRleFxuIikpOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUKQEAgLTE2MSwyMCArMTQ2LDE3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCit2b2lkIGFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyoKIAkgKiBPYmplY3QgbXVzdCBiZSBhIHZhbGlkIG51bWJlciBhbmQgd2UgbXVzdCBiZSBleGVjdXRpbmcKIAkgKiBhIGNvbnRyb2wgbWV0aG9kCiAJICovCiAJaWYgKCghb2JqX2Rlc2MpIHx8Ci0JCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgeworCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgewogCQlyZXR1cm47CiAJfQogCkBAIC0xODcsNyArMTY5LDYgQEAKIAl9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrCkBAIC0yMDMsMzcgKzE4NCwzMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmxhZ3MpCit1OCBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sodTMyIGZpZWxkX2ZsYWdzKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gRkFMU0U7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTggbG9ja2VkID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfYWNxdWlyZV9nbG9iYWxfbG9jayIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfYWNxdWlyZV9nbG9iYWxfbG9jayIpOwogCiAJLyogT25seSBhdHRlbXB0IGxvY2sgaWYgdGhlIGFsd2F5c19sb2NrIGJpdCBpcyBzZXQgKi8KIAogCWlmIChmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSykgewogCQkvKiBXZSBzaG91bGQgYXR0ZW1wdCB0byBnZXQgdGhlIGxvY2ssIHdhaXQgZm9yZXZlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayAoQUNQSV9XQUlUX0ZPUkVWRVIpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayhBQ1BJX1dBSVRfRk9SRVZFUik7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJbG9ja2VkID0gVFJVRTsKLQkJfQotCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgYWNxdWlyZSBHbG9iYWwgTG9jaywgJXNcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDb3VsZCBub3QgYWNxdWlyZSBHbG9iYWwgTG9jaywgJXNcbiIsCisJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJfQogCX0KIAotCXJldHVybl9WQUxVRSAobG9ja2VkKTsKKwlyZXR1cm5fVkFMVUUobG9ja2VkKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sKQEAgLTI0NywzNCArMjIyLDI4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZF9ieV9tZSkKK3ZvaWQgYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKHU4IGxvY2tlZF9ieV9tZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJleF9yZWxlYXNlX2dsb2JhbF9sb2NrIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9yZWxlYXNlX2dsb2JhbF9sb2NrIik7CiAKIAkvKiBPbmx5IGF0dGVtcHQgdW5sb2NrIGlmIHRoZSBjYWxsZXIgbG9ja2VkIGl0ICovCiAKIAlpZiAobG9ja2VkX2J5X21lKSB7CiAJCS8qIE9LLCBub3cgcmVsZWFzZSB0aGUgbG9jayAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkvKiBSZXBvcnQgdGhlIGVycm9yLCBidXQgdGhlcmUgaXNuJ3QgbXVjaCBlbHNlIHdlIGNhbiBkbyAqLwogCi0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgcmVsZWFzZSBBQ1BJIEdsb2JhbCBMb2NrLCAlc1xuIiwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHJlbGVhc2UgQUNQSSBHbG9iYWwgTG9jaywgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCX0KIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RpZ2l0c19uZWVkZWQKQEAgLTI4OSwyMiArMjU4LDE3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHUzMgotYWNwaV9leF9kaWdpdHNfbmVlZGVkICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSkKK3N0YXRpYyB1MzIgYWNwaV9leF9kaWdpdHNfbmVlZGVkKGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIGJhc2UpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZGlnaXRzOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgY3VycmVudF92YWx1ZTsKKwl1MzIgbnVtX2RpZ2l0czsKKwlhY3BpX2ludGVnZXIgY3VycmVudF92YWx1ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImV4X2RpZ2l0c19uZWVkZWQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RpZ2l0c19uZWVkZWQiKTsKIAogCS8qIGFjcGlfaW50ZWdlciBpcyB1bnNpZ25lZCwgc28gd2UgZG9uJ3Qgd29ycnkgYWJvdXQgYSAnLScgcHJlZml4ICovCiAKIAlpZiAodmFsdWUgPT0gMCkgewotCQlyZXR1cm5fVkFMVUUgKDEpOworCQlyZXR1cm5fVkFMVUUoMSk7CiAJfQogCiAJY3VycmVudF92YWx1ZSA9IHZhbHVlOwpAQCAtMzEzLDE0ICsyNzcsMTQgQEAKIAkvKiBDb3VudCB0aGUgZGlnaXRzIGluIHRoZSByZXF1ZXN0ZWQgYmFzZSAqLwogCiAJd2hpbGUgKGN1cnJlbnRfdmFsdWUpIHsKLQkJKHZvaWQpIGFjcGlfdXRfc2hvcnRfZGl2aWRlIChjdXJyZW50X3ZhbHVlLCBiYXNlLCAmY3VycmVudF92YWx1ZSwgTlVMTCk7CisJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKGN1cnJlbnRfdmFsdWUsIGJhc2UsICZjdXJyZW50X3ZhbHVlLAorCQkJCQkgICBOVUxMKTsKIAkJbnVtX2RpZ2l0cysrOwogCX0KIAotCXJldHVybl9WQUxVRSAobnVtX2RpZ2l0cyk7CisJcmV0dXJuX1ZBTFVFKG51bV9kaWdpdHMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcKQEAgLTMzNCwzMiArMjk4LDI2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljX2lkLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9zdHJpbmcpCit2b2lkIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcodTMyIG51bWVyaWNfaWQsIGNoYXIgKm91dF9zdHJpbmcpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXNhX2lkOworCXUzMiBlaXNhX2lkOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogU3dhcCBJRCB0byBiaWctZW5kaWFuIHRvIGdldCBjb250aWd1b3VzIGJpdHMgKi8KIAotCWVpc2FfaWQgPSBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcCAobnVtZXJpY19pZCk7CisJZWlzYV9pZCA9IGFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwKG51bWVyaWNfaWQpOwogCi0Jb3V0X3N0cmluZ1swXSA9IChjaGFyKSAoJ0AnICsgKCgodW5zaWduZWQgbG9uZykgZWlzYV9pZCA+PiAyNikgJiAweDFmKSk7Ci0Jb3V0X3N0cmluZ1sxXSA9IChjaGFyKSAoJ0AnICsgKChlaXNhX2lkID4+IDIxKSAmIDB4MWYpKTsKLQlvdXRfc3RyaW5nWzJdID0gKGNoYXIpICgnQCcgKyAoKGVpc2FfaWQgPj4gMTYpICYgMHgxZikpOwotCW91dF9zdHJpbmdbM10gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgoYWNwaV9pbnRlZ2VyKSBlaXNhX2lkLCAxMik7Ci0Jb3V0X3N0cmluZ1s0XSA9IGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIgKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDgpOwotCW91dF9zdHJpbmdbNV0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgoYWNwaV9pbnRlZ2VyKSBlaXNhX2lkLCA0KTsKLQlvdXRfc3RyaW5nWzZdID0gYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhciAoKGFjcGlfaW50ZWdlcikgZWlzYV9pZCwgMCk7CisJb3V0X3N0cmluZ1swXSA9IChjaGFyKSgnQCcgKyAoKCh1bnNpZ25lZCBsb25nKWVpc2FfaWQgPj4gMjYpICYgMHgxZikpOworCW91dF9zdHJpbmdbMV0gPSAoY2hhcikoJ0AnICsgKChlaXNhX2lkID4+IDIxKSAmIDB4MWYpKTsKKwlvdXRfc3RyaW5nWzJdID0gKGNoYXIpKCdAJyArICgoZWlzYV9pZCA+PiAxNikgJiAweDFmKSk7CisJb3V0X3N0cmluZ1szXSA9IGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoKGFjcGlfaW50ZWdlcikgZWlzYV9pZCwgMTIpOworCW91dF9zdHJpbmdbNF0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDgpOworCW91dF9zdHJpbmdbNV0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDQpOworCW91dF9zdHJpbmdbNl0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDApOwogCW91dF9zdHJpbmdbN10gPSAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcKQEAgLTM2OSwzMCArMzI3LDI1IEBACiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUsIHN0cmluZwogICoKLSAqIERFU0NSSVBUT0lOOiBDb252ZXJ0IGEgbnVtYmVyIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbi4gQXNzdW1lcyBzdHJpbmcKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgbnVtYmVyIHRvIHN0cmluZyByZXByZXNlbnRhdGlvbi4gQXNzdW1lcyBzdHJpbmcKICAqICAgICAgICAgICAgICBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHN0cmluZy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX2V4X3Vuc2lnbmVkX2ludGVnZXJfdG9fc3RyaW5nICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9zdHJpbmcpCit2b2lkIGFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcoYWNwaV9pbnRlZ2VyIHZhbHVlLCBjaGFyICpvdXRfc3RyaW5nKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHNfbmVlZGVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyOworCXUzMiBjb3VudDsKKwl1MzIgZGlnaXRzX25lZWRlZDsKKwl1MzIgcmVtYWluZGVyOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JZGlnaXRzX25lZWRlZCA9IGFjcGlfZXhfZGlnaXRzX25lZWRlZCAodmFsdWUsIDEwKTsKKwlkaWdpdHNfbmVlZGVkID0gYWNwaV9leF9kaWdpdHNfbmVlZGVkKHZhbHVlLCAxMCk7CiAJb3V0X3N0cmluZ1tkaWdpdHNfbmVlZGVkXSA9IDA7CiAKIAlmb3IgKGNvdW50ID0gZGlnaXRzX25lZWRlZDsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAodmFsdWUsIDEwLCAmdmFsdWUsICZyZW1haW5kZXIpOwotCQlvdXRfc3RyaW5nW2NvdW50LTFdID0gKGNoYXIpICgnMCcgKyByZW1haW5kZXIpO1wKKwkJKHZvaWQpYWNwaV91dF9zaG9ydF9kaXZpZGUodmFsdWUsIDEwLCAmdmFsdWUsICZyZW1haW5kZXIpOworCQlvdXRfc3RyaW5nW2NvdW50IC0gMV0gPSAoY2hhcikoJzAnICsgcmVtYWluZGVyKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9mYW4uYyBiL2RyaXZlcnMvYWNwaS9mYW4uYwppbmRleCAxNDE5MmVlLi5lODE2NWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZmFuLmMKKysrIGIvZHJpdmVycy9hY3BpL2Zhbi5jCkBAIC0zNCw1MiArMzQsNDUgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIEFDUElfRkFOX0NPTVBPTkVOVAkJMHgwMDIwMDAwMAogI2RlZmluZSBBQ1BJX0ZBTl9DTEFTUwkJCSJmYW4iCi0jZGVmaW5lIEFDUElfRkFOX0hJRAkJCSJQTlAwQzBCIgogI2RlZmluZSBBQ1BJX0ZBTl9EUklWRVJfTkFNRQkJIkFDUEkgRmFuIERyaXZlciIKLSNkZWZpbmUgQUNQSV9GQU5fREVWSUNFX05BTUUJCSJGYW4iCiAjZGVmaW5lIEFDUElfRkFOX0ZJTEVfU1RBVEUJCSJzdGF0ZSIKLSNkZWZpbmUgQUNQSV9GQU5fTk9USUZZX1NUQVRVUwkJMHg4MAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfRkFOX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX2ZhbiIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2ZhbiIpCiAKLU1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKKyAgICBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9GQU5fRFJJVkVSX05BTUUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IGFjcGlfZmFuX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2Zhbl9yZW1vdmUgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfZmFuX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfZmFuX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZmFuX2RyaXZlciA9IHsKLQkubmFtZSA9CQlBQ1BJX0ZBTl9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX0ZBTl9DTEFTUywKLQkuaWRzID0JCUFDUElfRkFOX0hJRCwKLQkub3BzID0JCXsKLQkJCQkuYWRkID0JCWFjcGlfZmFuX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9mYW5fcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfRkFOX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfRkFOX0NMQVNTLAorCS5pZHMgPSAiUE5QMEMwQiIsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfZmFuX2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfZmFuX3JlbW92ZSwKKwkJfSwKIH07CiAKIHN0cnVjdCBhY3BpX2ZhbiB7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CiB9OwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9mYW5fZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9mYW5fZGlyOwogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZmFuX3JlYWRfc3RhdGUgKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfZmFuX3JlYWRfc3RhdGUoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9mYW4JCSpmYW4gPSBzZXEtPnByaXZhdGU7Ci0JaW50CQkJc3RhdGUgPSAwOworCXN0cnVjdCBhY3BpX2ZhbiAqZmFuID0gc2VxLT5wcml2YXRlOworCWludCBzdGF0ZSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Zhbl9yZWFkX3N0YXRlIik7CiAKQEAgLTg4LDcgKzgxLDcgQEAKIAkJCXNlcV9wcmludGYoc2VxLCAic3RhdHVzOiAgICAgICAgICAgICAgICAgIEVSUk9SXG4iKTsKIAkJZWxzZQogCQkJc2VxX3ByaW50ZihzZXEsICJzdGF0dXM6ICAgICAgICAgICAgICAgICAgJXNcbiIsCi0JCQkJICAgICAhc3RhdGU/Im9uIjoib2ZmIik7CisJCQkJICAgIXN0YXRlID8gIm9uIiA6ICJvZmYiKTsKIAl9CiAJcmV0dXJuX1ZBTFVFKDApOwogfQpAQCAtOTksMjkgKzkyLDI2IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX2Zhbl93cml0ZV9zdGF0ZSAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9mYW5fd3JpdGVfc3RhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBzZXFfZmlsZQkJKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX2ZhbgkJKmZhbiA9IChzdHJ1Y3QgYWNwaV9mYW4gKikgbS0+cHJpdmF0ZTsKLQljaGFyCQkJc3RhdGVfc3RyaW5nWzEyXSA9IHsnXDAnfTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX2ZhbiAqZmFuID0gKHN0cnVjdCBhY3BpX2ZhbiAqKW0tPnByaXZhdGU7CisJY2hhciBzdGF0ZV9zdHJpbmdbMTJdID0geyAnXDAnIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Zhbl93cml0ZV9zdGF0ZSIpOwogCiAJaWYgKCFmYW4gfHwgKGNvdW50ID4gc2l6ZW9mKHN0YXRlX3N0cmluZykgLSAxKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQorCiAJaWYgKGNvcHlfZnJvbV91c2VyKHN0YXRlX3N0cmluZywgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKLQkKKwogCXN0YXRlX3N0cmluZ1tjb3VudF0gPSAnXDAnOwotCQotCXJlc3VsdCA9IGFjcGlfYnVzX3NldF9wb3dlcihmYW4tPmhhbmRsZSwgCi0JCXNpbXBsZV9zdHJ0b3VsKHN0YXRlX3N0cmluZywgTlVMTCwgMCkpOworCisJcmVzdWx0ID0gYWNwaV9idXNfc2V0X3Bvd2VyKGZhbi0+aGFuZGxlLAorCQkJCSAgICBzaW1wbGVfc3RydG91bChzdGF0ZV9zdHJpbmcsIE5VTEwsIDApKTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIApAQCAtMTI5LDE5ICsxMTksMTcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9mYW5fc3RhdGVfb3BzID0gewotCS5vcGVuCQk9IGFjcGlfZmFuX3N0YXRlX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfZmFuX3dyaXRlX3N0YXRlLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX2Zhbl9zdGF0ZV9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gYWNwaV9mYW5fd3JpdGVfc3RhdGUsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGludAotYWNwaV9mYW5fYWRkX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9mYW5fYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fYWRkX2ZzIik7CiAKQEAgLTE1MCw3ICsxMzgsNyBAQAogCiAJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IHByb2NfbWtkaXIoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQlhY3BpX2Zhbl9kaXIpOworCQkJCQkJICAgICBhY3BpX2Zhbl9kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKS0+b3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTE1OCwxMSArMTQ2LDEyIEBACiAKIAkvKiAnc3RhdHVzJyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9GQU5fRklMRV9TVEFURSwKLQkJU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfRkFOX0ZJTEVfU1RBVEUpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX0ZBTl9GSUxFX1NUQVRFKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9mYW5fc3RhdGVfb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTE3MiwxNiArMTYxLDEyIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfZmFuX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZmFuX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Zhbl9yZW1vdmVfZnMiKTsKIAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0ZBTl9GSUxFX1NUQVRFLAotCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0ZBTl9GSUxFX1NUQVRFLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBhY3BpX2Zhbl9kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQpAQCAtMTg5LDE4ICsxNzQsMTUgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQKLWFjcGlfZmFuX2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZmFuX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2ZhbgkJKmZhbiA9IE5VTEw7Ci0JaW50CQkJc3RhdGUgPSAwOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2ZhbiAqZmFuID0gTlVMTDsKKwlpbnQgc3RhdGUgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5fYWRkIik7CiAKQEAgLTIxMywxNCArMTk1LDE0IEBACiAJbWVtc2V0KGZhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2ZhbikpOwogCiAJZmFuLT5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKLQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0ZBTl9ERVZJQ0VfTkFNRSk7CisJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgIkZhbiIpOwogCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX0ZBTl9DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZmFuOwogCiAJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3Bvd2VyKGZhbi0+aGFuZGxlLCAmc3RhdGUpOwogCWlmIChyZXN1bHQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZWFkaW5nIHBvd2VyIHN0YXRlXG4iKSk7CisJCQkJICAiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKQEAgLTIyOSwzMCArMjExLDI2IEBACiAJCWdvdG8gZW5kOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVzKVxuIiwKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJIWRldmljZS0+cG93ZXIuc3RhdGU/Im9uIjoib2ZmIik7CisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgICFkZXZpY2UtPnBvd2VyLnN0YXRlID8gIm9uIiA6ICJvZmYiKTsKIAotZW5kOgorICAgICAgZW5kOgogCWlmIChyZXN1bHQpCiAJCWtmcmVlKGZhbik7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX2Zhbl9yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfZmFuX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IGFjcGlfZmFuCQkqZmFuID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9mYW4gKmZhbiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Zhbl9yZW1vdmUiKTsKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWZhbiA9IChzdHJ1Y3QgYWNwaV9mYW4gKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWZhbiA9IChzdHJ1Y3QgYWNwaV9mYW4gKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlhY3BpX2Zhbl9yZW1vdmVfZnMoZGV2aWNlKTsKIApAQCAtMjYxLDExICsyMzksOSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9mYW5faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZmFuX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9mYW5faW5pdCIpOwogCkBAIC0yODMsOSArMjU5LDcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIHZvaWQgX19leGl0Ci1hY3BpX2Zhbl9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfZmFuX2V4aXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2Zhbl9leGl0Iik7CiAKQEAgLTI5Niw3ICsyNzAsNSBAQAogCXJldHVybl9WT0lEOwogfQogCi0KIG1vZHVsZV9pbml0KGFjcGlfZmFuX2luaXQpOwogbW9kdWxlX2V4aXQoYWNwaV9mYW5fZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDc3MGNmYzguLmUzNmM1ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMjksNyArMjksOCBAQAogCQlkb3duX3dyaXRlKCZidXNfdHlwZV9zZW0pOwogCQlsaXN0X2FkZF90YWlsKCZ0eXBlLT5saXN0LCAmYnVzX3R5cGVfbGlzdCk7CiAJCXVwX3dyaXRlKCZidXNfdHlwZV9zZW0pOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiYnVzIHR5cGUgJXMgcmVnaXN0ZXJlZFxuIiwgdHlwZS0+YnVzLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggImJ1cyB0eXBlICVzIHJlZ2lzdGVyZWRcbiIsCisJCSAgICAgICB0eXBlLT5idXMtPm5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC00NSw3ICs0Niw4IEBACiAJCWRvd25fd3JpdGUoJmJ1c190eXBlX3NlbSk7CiAJCWxpc3RfZGVsX2luaXQoJnR5cGUtPmxpc3QpOwogCQl1cF93cml0ZSgmYnVzX3R5cGVfc2VtKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkFDUEkgYnVzIHR5cGUgJXMgdW5yZWdpc3RlcmVkXG4iLCB0eXBlLT5idXMtPm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiQUNQSSBidXMgdHlwZSAlcyB1bnJlZ2lzdGVyZWRcbiIsCisJCSAgICAgICB0eXBlLT5idXMtPm5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNjgsOSArMTcwLDYgQEAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBNRVRIT0RfTkFNRV9fU0VHLCBOVUxMLCAmc2VnKTsKIAlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewogCQkvKiBBc3N1bWUgc2VnID0gMCAqLwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAotCQkgICAgICAgIkFzc3VtZSByb290IGJyaWRnZSBbJXNdIHNlZ21lbnQgaXMgMFxuIiwKLQkJICAgICAgIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOwogCQlzdGF0dXMgPSBBRV9PSzsKIAkJc2VnID0gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKaW5kZXggYjUxMDAxZS4uMWJiMzQ2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwpAQCAtNDIsMTMgKzQyLDEwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImh3YWNwaSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImh3YWNwaSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MiwzNiArNTksMzAgQEAKICAqICAgICAgICAgICAgICB0aGUgRkFEVC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19pbml0aWFsaXplICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9od19pbml0aWFsaXplKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfaW5pdGlhbGl6ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfaW5pdGlhbGl6ZSIpOwogCiAJLyogV2UgbXVzdCBoYXZlIHRoZSBBQ1BJIHRhYmxlcyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSAqLwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gRkFEVCBpcyBwcmVzZW50XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJObyBGQURUIGlzIHByZXNlbnRcbiIpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKIAkvKiBTYW5pdHkgY2hlY2sgdGhlIEZBRFQgZm9yIHZhbGlkIHZhbHVlcyAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9mYWR0ICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfZmFkdCgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19zZXRfbW9kZQpAQCAtMTA0LDI0ICs5NSwyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X3NldF9tb2RlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpCithY3BpX3N0YXR1cyBhY3BpX2h3X3NldF9tb2RlKHUzMiBtb2RlKQogewogCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHJ5OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfc2V0X21vZGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19zZXRfbW9kZSIpOwogCiAJLyoKIAkgKiBBQ1BJIDIuMCBjbGFyaWZpZWQgdGhhdCBpZiBTTUlfQ01EIGluIEZBRFQgaXMgemVybywKIAkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RlIHRyYW5zaXRpb24uCiAJICovCiAJaWYgKCFhY3BpX2dibF9GQURULT5zbWlfY21kKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk5vIFNNSV9DTUQgaW4gRkFEVCwgbW9kZSB0cmFuc2l0aW9uIGZhaWxlZC5cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gU01JX0NNRCBpbiBGQURULCBtb2RlIHRyYW5zaXRpb24gZmFpbGVkLlxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwogCX0KIAogCS8qCkBAIC0xMzIsOSArMTIwLDggQEAKIAkgKiB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KIAkgKi8KIAlpZiAoIWFjcGlfZ2JsX0ZBRFQtPmFjcGlfZW5hYmxlICYmICFhY3BpX2dibF9GQURULT5hY3BpX2Rpc2FibGUpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJObyBBQ1BJIG1vZGUgdHJhbnNpdGlvbiBzdXBwb3J0ZWQgaW4gdGhpcyBzeXN0ZW0gKGVuYWJsZS9kaXNhYmxlIGJvdGggemVybylcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJc3dpdGNoIChtb2RlKSB7CkBAIC0xNDIsOSArMTI5LDExIEBACiAKIAkJLyogQklPUyBzaG91bGQgaGF2ZSBkaXNhYmxlZCBBTEwgZml4ZWQgYW5kIEdQIGV2ZW50cyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKLQkJCQkgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPmFjcGlfZW5hYmxlLCA4KTsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIkF0dGVtcHRpbmcgdG8gZW5hYmxlIEFDUEkgbW9kZVxuIikpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKKwkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPmFjcGlfZW5hYmxlLAorCQkJCQkgICAgOCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJBdHRlbXB0aW5nIHRvIGVuYWJsZSBBQ1BJIG1vZGVcbiIpKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfU1lTX01PREVfTEVHQUNZOgpAQCAtMTUzLDIwICsxNDIsMjEgQEAKIAkJICogQklPUyBzaG91bGQgY2xlYXIgYWxsIGZpeGVkIHN0YXR1cyBiaXRzIGFuZCByZXN0b3JlIGZpeGVkIGV2ZW50CiAJCSAqIGVuYWJsZSBiaXRzIHRvIGRlZmF1bHQKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKLQkJCQkgKHUzMikgYWNwaV9nYmxfRkFEVC0+YWNwaV9kaXNhYmxlLCA4KTsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCQkgIkF0dGVtcHRpbmcgdG8gZW5hYmxlIExlZ2FjeSAobm9uLUFDUEkpIG1vZGVcbiIpKTsKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCisJCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULT5hY3BpX2Rpc2FibGUsCisJCQkJCSAgICA4KTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkF0dGVtcHRpbmcgdG8gZW5hYmxlIExlZ2FjeSAobm9uLUFDUEkpIG1vZGVcbiIpKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3Qgd3JpdGUgbW9kZSBjaGFuZ2UsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3Qgd3JpdGUgbW9kZSBjaGFuZ2UsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0xNzYsMTkgKzE2NiwxOSBAQAogCXJldHJ5ID0gMzAwMDsKIAl3aGlsZSAocmV0cnkpIHsKIAkJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBtb2RlKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiTW9kZSAlWCBzdWNjZXNzZnVsbHkgZW5hYmxlZFxuIiwKLQkJCQltb2RlKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiTW9kZSAlWCBzdWNjZXNzZnVsbHkgZW5hYmxlZFxuIiwKKwkJCQkJICBtb2RlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAJCWFjcGlfb3Nfc3RhbGwoMTAwMCk7CiAJCXJldHJ5LS07CiAJfQogCi0JQUNQSV9SRVBPUlRfRVJST1IgKCgiSGFyZHdhcmUgbmV2ZXIgY2hhbmdlZCBtb2Rlc1xuIikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOworCUFDUElfUkVQT1JUX0VSUk9SKCgiSGFyZHdhcmUgbmV2ZXIgY2hhbmdlZCBtb2Rlc1xuIikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19nZXRfbW9kZQpAQCAtMjAyLDM0ICsxOTIsMzAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKLWFjcGlfaHdfZ2V0X21vZGUgKAotCXZvaWQpCit1MzIgYWNwaV9od19nZXRfbW9kZSh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiB2YWx1ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X2dldF9tb2RlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19nZXRfbW9kZSIpOwogCiAJLyoKIAkgKiBBQ1BJIDIuMCBjbGFyaWZpZWQgdGhhdCBpZiBTTUlfQ01EIGluIEZBRFQgaXMgemVybywKIAkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RlIHRyYW5zaXRpb24uCiAJICovCiAJaWYgKCFhY3BpX2dibF9GQURULT5zbWlfY21kKSB7Ci0JCXJldHVybl9WQUxVRSAoQUNQSV9TWVNfTU9ERV9BQ1BJKTsKKwkJcmV0dXJuX1ZBTFVFKEFDUElfU1lTX01PREVfQUNQSSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1NDSV9FTkFCTEUsICZ2YWx1ZSwgQUNQSV9NVFhfTE9DSyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fVkFMVUUgKEFDUElfU1lTX01PREVfTEVHQUNZKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFLCAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fVkFMVUUoQUNQSV9TWVNfTU9ERV9MRUdBQ1kpOwogCX0KIAogCWlmICh2YWx1ZSkgewotCQlyZXR1cm5fVkFMVUUgKEFDUElfU1lTX01PREVfQUNQSSk7Ci0JfQotCWVsc2UgewotCQlyZXR1cm5fVkFMVUUgKEFDUElfU1lTX01PREVfTEVHQUNZKTsKKwkJcmV0dXJuX1ZBTFVFKEFDUElfU1lTX01PREVfQUNQSSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuX1ZBTFVFKEFDUElfU1lTX01PREVfTEVHQUNZKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCmluZGV4IDhkYWVhYmIuLjVjOGU1ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCkBAIC00NiwxNSArNDYsMTIgQEAKICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJod2dwZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJod2dwZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwotCithY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJCQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcxLDE1ICs2OCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKQorYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gICAqZ3BlX3JlZ2lzdGVyX2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIEdldCB0aGUgaW5mbyBibG9jayBmb3IgdGhlIGVudGlyZSBHUEUgcmVnaXN0ZXIgKi8KIApAQCAtOTAsMTMgKzg0LDEyIEBACiAKIAkvKiBXcml0ZSB0aGUgZW50aXJlIEdQRSAocnVudGltZSkgZW5hYmxlIHJlZ2lzdGVyICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwgZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLAotCQkJICAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sCisJCQkJCSAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfY2xlYXJfZ3BlCkBAIC0xMDksMjcgKzEwMiwyMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2NsZWFyX2dwZSAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqIGdwZV9ldmVudF9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qCiAJICogV3JpdGUgYSBvbmUgdG8gdGhlIGFwcHJvcHJpYXRlIGJpdCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvCiAJICogY2xlYXIgdGhpcyBHUEUuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDgsIGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9iaXQsCi0JCQkgICZncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mby0+c3RhdHVzX2FkZHJlc3MpOworCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9iaXQsCisJCQkJCSAmZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm8tPgorCQkJCQkgc3RhdHVzX2FkZHJlc3MpOwogCiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19nZXRfZ3BlX3N0YXR1cwpAQCAtMTQ1LDE5ICsxMzQsMTYgQEAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9od19nZXRfZ3BlX3N0YXR1cyAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8sCi0JYWNwaV9ldmVudF9zdGF0dXMgICAgICAgICAgICAgICAqZXZlbnRfc3RhdHVzKQorYWNwaV9od19nZXRfZ3BlX3N0YXR1cyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqIGdwZV9ldmVudF9pbmZvLAorCQkgICAgICAgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9ieXRlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYml0OwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICAgKmdwZV9yZWdpc3Rlcl9pbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgbG9jYWxfZXZlbnRfc3RhdHVzID0gMDsKKwl1MzIgaW5fYnl0ZTsKKwl1OCByZWdpc3Rlcl9iaXQ7CisJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2V2ZW50X3N0YXR1cyBsb2NhbF9ldmVudF9zdGF0dXMgPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKCFldmVudF9zdGF0dXMpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTE4NSw4ICsxNzEsMTAgQEAKIAogCS8qIEdQRSBjdXJyZW50bHkgYWN0aXZlIChzdGF0dXMgYml0ID09IDEpPyAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoOCwgJmluX2J5dGUsICZncGVfcmVnaXN0ZXJfaW5mby0+c3RhdHVzX2FkZHJlc3MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZpbl9ieXRlLAorCQkJCSAgICZncGVfcmVnaXN0ZXJfaW5mby0+c3RhdHVzX2FkZHJlc3MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKQEAgLTE5OCwxMiArMTg2LDEwIEBACiAKIAkoKmV2ZW50X3N0YXR1cykgPSBsb2NhbF9ldmVudF9zdGF0dXM7CiAKLQotdW5sb2NrX2FuZF9leGl0OgorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCXJldHVybiAoc3RhdHVzKTsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjE5LDIyICsyMDUsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spCithY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICogZ3BlX3hydXB0X2luZm8sCisJCQkgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICogZ3BlX2Jsb2NrKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qIEV4YW1pbmUgZWFjaCBHUEUgUmVnaXN0ZXIgd2l0aGluIHRoZSBibG9jayAqLwogCiAJZm9yIChpID0gMDsgaSA8IGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7IGkrKykgewogCQkvKiBEaXNhYmxlIGFsbCBHUEVzIGluIHRoaXMgcmVnaXN0ZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwgMHgwMCwKLQkJCQkgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfYWRkcmVzcyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgMHgwMCwKKwkJCQkJCSAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgorCQkJCQkJIGVuYWJsZV9hZGRyZXNzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAl9CkBAIC0yNDIsNyArMjI3LDYgQEAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrCkBAIC0yNTcsMjIgKzI0MSwyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spCithY3BpX2h3X2NsZWFyX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9pbmZvLAorCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKiBncGVfYmxvY2spCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJdTMyIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7CiAJCS8qIENsZWFyIHN0YXR1cyBvbiBhbGwgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDgsIDB4RkYsCi0JCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uc3RhdHVzX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIDB4RkYsCisJCQkJCQkgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS4KKwkJCQkJCSBzdGF0dXNfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAJfQpAQCAtMjgwLDcgKzI2Myw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jawpAQCAtMjk2LDEzICsyNzgsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKQorYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKiBncGVfeHJ1cHRfaW5mbywKKwkJCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKiBncGVfYmxvY2spCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJdTMyIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogTk9URTogYXNzdW1lcyB0aGF0IGFsbCBHUEVzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgKi8KIApAQCAtMzE1LDkgKzI5NSwxMyBAQAogCiAJCS8qIEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LCBncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2Zvcl9ydW4sCi0JCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LAorCQkJCQkgICAgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgorCQkJCQkgICAgZW5hYmxlX2Zvcl9ydW4sCisJCQkJCSAgICAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgorCQkJCQkgICAgZW5hYmxlX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCX0KQEAgLTMyNSw3ICszMDksNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jawpAQCAtMzQxLDEzICszMjQsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKQorYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KIApAQCAtMzU4LDEwICszMzksMTIgQEAKIAogCQkvKiBFbmFibGUgYWxsICJ3YWtlIiBHUEVzIGluIHRoaXMgcmVnaXN0ZXIgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwKLQkJCQkgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3Jfd2FrZSwKLQkJCQkgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfYWRkcmVzcyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwKKwkJCQkJCSBncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uCisJCQkJCQkgZW5hYmxlX2Zvcl93YWtlLAorCQkJCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uCisJCQkJCQkgZW5hYmxlX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCX0KQEAgLTM2OSwxMiArMzUyLDExIEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgIC0gQUNQSV9OT1RfSVNSIG9yIEFDUElfSVNSCisgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zODIsMjcgKzM2NCwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXModm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19kaXNhYmxlX2FsbF9ncGVzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfZGlzYWJsZV9hbGxfZ3BlcyIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKGFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2ssIGZsYWdzKTsKLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrKTsKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19jbGVhcl9ncGVfYmxvY2spOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcwogICoKLSAqIFBBUkFNRVRFUlM6ICBGbGFncyAgICAgICAgICAgLSBBQ1BJX05PVF9JU1Igb3IgQUNQSV9JU1IKKyAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQxMCwyNiArMzg3LDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJod19lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcyIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgIC0gQUNQSV9OT1RfSVNSIG9yIEFDUElfSVNSCisgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00MzcsMTcgKzQwOSwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXModm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19lbmFibGVfYWxsX3dha2V1cF9ncGVzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcyIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKGFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2ssIGZsYWdzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2spOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKaW5kZXggNmQ5ZTRlYi4uNTM2YTdhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwpAQCAtNTAsOCArNTAsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImh3cmVncyIpCi0KK0FDUElfTU9EVUxFX05BTUUoImh3cmVncyIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjUsNTcgKzY0LDUyIEBACiAgKiAgICAgICAgICAgICAgVEhJUyBGVU5DVElPTiBNVVNUIEJFIENBTExFRCBXSVRIIElOVEVSUlVQVFMgRElTQUJMRUQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXModTMyIGZsYWdzKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X2NsZWFyX2FjcGlfc3RhdHVzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfY2xlYXJfYWNwaV9zdGF0dXMiKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJBYm91dCB0byB3cml0ZSAlMDRYIHRvICUwNFhcbiIsCi0JCUFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTLAotCQkodTE2KSBhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrLmFkZHJlc3MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLCAiQWJvdXQgdG8gd3JpdGUgJTA0WCB0byAlMDRYXG4iLAorCQkJICBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUywKKwkJCSAgKHUxNikgYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSk7CiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfSEFSRFdBUkUpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCi0JCQkgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCUFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCiAJLyogQ2xlYXIgdGhlIGZpeGVkIGV2ZW50cyAqLwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykgewotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTLAotCQkJCSAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUywKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCX0KIAogCS8qIENsZWFyIHRoZSBHUEUgQml0cyBpbiBhbGwgR1BFIHJlZ2lzdGVycyBpbiBhbGwgR1BFIGJsb2NrcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0IChhY3BpX2h3X2NsZWFyX2dwZV9ibG9jaywgQUNQSV9JU1IpOworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2NsZWFyX2dwZV9ibG9jayk7CiAKLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YQpAQCAtMTMyLDUzICsxMjYsNDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9zbGVlcF90eXBlX2RhdGEgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfc3RhdGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2xlZXBfdHlwZV9hLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNsZWVwX3R5cGVfYikKK2FjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSh1OCBzbGVlcF9zdGF0ZSwgdTggKiBzbGVlcF90eXBlX2EsIHU4ICogc2xlZXBfdHlwZV9iKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICBpbmZvOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNsZWVwX3N0YXRlX25hbWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gaW5mbzsKKwljaGFyICpzbGVlcF9zdGF0ZV9uYW1lOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEiKTsKIAogCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgKi8KIAotCWlmICgoc2xlZXBfc3RhdGUgPiBBQ1BJX1NfU1RBVEVTX01BWCkgfHwKLQkJIXNsZWVwX3R5cGVfYSB8fCAhc2xlZXBfdHlwZV9iKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKChzbGVlcF9zdGF0ZSA+IEFDUElfU19TVEFURVNfTUFYKSB8fCAhc2xlZXBfdHlwZV9hIHx8ICFzbGVlcF90eXBlX2IpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEV2YWx1YXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgdGhpcyBzdGF0ZSAqLwogCiAJaW5mby5wYXJhbWV0ZXJzID0gTlVMTDsKIAlpbmZvLnJldHVybl9vYmplY3QgPSBOVUxMOwotCXNsZWVwX3N0YXRlX25hbWUgPSAoY2hhciAqKSBhY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tzbGVlcF9zdGF0ZV07CisJc2xlZXBfc3RhdGVfbmFtZSA9IChjaGFyICopYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdOwogCi0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lIChzbGVlcF9zdGF0ZV9uYW1lLCAmaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIiVzIHdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXVxuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgc2xlZXBfc3RhdGVfbmFtZSkpOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZShzbGVlcF9zdGF0ZV9uYW1lLCAmaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICIlcyB3aGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc11cbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwKKwkJCQkgIHNsZWVwX3N0YXRlX25hbWUpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIE11c3QgaGF2ZSBhIHJldHVybiBvYmplY3QgKi8KIAogCWlmICghaW5mby5yZXR1cm5fb2JqZWN0KSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk5vIFNsZWVwIFN0YXRlIG9iamVjdCByZXR1cm5lZCBmcm9tIFslc11cbiIsCi0JCQlzbGVlcF9zdGF0ZV9uYW1lKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gU2xlZXAgU3RhdGUgb2JqZWN0IHJldHVybmVkIGZyb20gWyVzXVxuIiwKKwkJCQkgICBzbGVlcF9zdGF0ZV9uYW1lKSk7CiAJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAl9CiAKIAkvKiBJdCBtdXN0IGJlIG9mIHR5cGUgUGFja2FnZSAqLwogCi0JZWxzZSBpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU2xlZXAgU3RhdGUgcmV0dXJuIG9iamVjdCBpcyBub3QgYSBQYWNrYWdlXG4iKSk7CisJZWxzZSBpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby5yZXR1cm5fb2JqZWN0KSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlNsZWVwIFN0YXRlIHJldHVybiBvYmplY3QgaXMgbm90IGEgUGFja2FnZVxuIikpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCX0KIApAQCAtMTkwLDQ1ICsxNzksNDEgQEAKIAkgKiBvbmUgcGVyIHNsZWVwIHR5cGUgKEEvQikuCiAJICovCiAJZWxzZSBpZiAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmNvdW50IDwgMikgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJIlNsZWVwIFN0YXRlIHJldHVybiBwYWNrYWdlIGRvZXMgbm90IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiU2xlZXAgU3RhdGUgcmV0dXJuIHBhY2thZ2UgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHNcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX05PX09QRVJBTkQ7CiAJfQogCiAJLyogVGhlIGZpcnN0IHR3byBlbGVtZW50cyBtdXN0IGJvdGggYmUgb2YgdHlwZSBJbnRlZ2VyICovCiAKLQllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkKLQkJCSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgfHwKLQkJCSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkKLQkJCQkhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBlbGVtZW50cyBhcmUgbm90IGJvdGggSW50ZWdlcnMgKCVzLCAlcylcbiIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKSkpOworCWVsc2UgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pCisJCSAgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHx8CisJCSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKQorCQkgICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlNsZWVwIFN0YXRlIHJldHVybiBwYWNrYWdlIGVsZW1lbnRzIGFyZSBub3QgYm90aCBJbnRlZ2VycyAoJXMsICVzKVxuIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogVmFsaWQgX1N4XyBwYWNrYWdlIHNpemUsIHR5cGUsIGFuZCB2YWx1ZSAqLwogCiAJCSpzbGVlcF90eXBlX2EgPSAodTgpCi0JCQkoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKS0+aW50ZWdlci52YWx1ZTsKKwkJICAgIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLT5pbnRlZ2VyLnZhbHVlOwogCQkqc2xlZXBfdHlwZV9iID0gKHU4KQotCQkJKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSktPmludGVnZXIudmFsdWU7CisJCSAgICAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKS0+aW50ZWdlci52YWx1ZTsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIiVzIFdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXSwgYmFkIFNsZWVwIG9iamVjdCAlcCB0eXBlICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAotCQkJc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LAotCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0KSkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVzIFdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXSwgYmFkIFNsZWVwIG9iamVjdCAlcCB0eXBlICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksCisJCQkJICBzbGVlcF9zdGF0ZV9uYW1lLCBpbmZvLnJldHVybl9vYmplY3QsCisJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8uCisJCQkJCQkJICAgICAgIHJldHVybl9vYmplY3QpKSk7CiAJfQogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChpbmZvLnJldHVybl9vYmplY3QpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby5yZXR1cm5fb2JqZWN0KTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI0MiwyMiArMjI3LDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKgotYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQpCitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8odTMyIHJlZ2lzdGVyX2lkKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSAoImh3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJod19nZXRfYml0X3JlZ2lzdGVyX2luZm8iKTsKIAogCWlmIChyZWdpc3Rlcl9pZCA+IEFDUElfQklUUkVHX01BWCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYml0X3JlZ2lzdGVyIElEOiAlWFxuIiwgcmVnaXN0ZXJfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIGJpdF9yZWdpc3RlciBJRDogJVhcbiIsCisJCQkJICByZWdpc3Rlcl9pZCkpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAogCXJldHVybiAoJmFjcGlfZ2JsX2JpdF9yZWdpc3Rlcl9pbmZvW3JlZ2lzdGVyX2lkXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfcmVnaXN0ZXIKQEAgLTI3Myw1OSArMjU2LDU2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3JlZ2lzdGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldHVybl92YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgKiByZXR1cm5fdmFsdWUsIHUzMiBmbGFncykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX3ZhbHVlID0gMDsKLQlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAgICpiaXRfcmVnX2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKwlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYml0X3JlZ19pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3JlZ2lzdGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9yZWdpc3RlciIpOwogCiAJLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgQUNQSSBSZWdpc3RlciAqLwogCi0JYml0X3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKHJlZ2lzdGVyX2lkKTsKKwliaXRfcmVnX2luZm8gPSBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyhyZWdpc3Rlcl9pZCk7CiAJaWYgKCFiaXRfcmVnX2luZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWlmIChmbGFncyAmIEFDUElfTVRYX0xPQ0spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIFJlYWQgZnJvbSB0aGUgcmVnaXN0ZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyLCAmcmVnaXN0ZXJfdmFsdWUpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkgICAgICAgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsCisJCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7CiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKIAl9CiAKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCS8qIE5vcm1hbGl6ZSB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZCAqLwogCi0JCXJlZ2lzdGVyX3ZhbHVlID0gKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKQotCQkJCSAgID4+IGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKKwkJcmVnaXN0ZXJfdmFsdWUgPQorCQkgICAgKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKQorCQkgICAgID4+IGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKIAogCQkqcmV0dXJuX3ZhbHVlID0gcmVnaXN0ZXJfdmFsdWU7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJSZWFkIHZhbHVlICU4LjhYIHJlZ2lzdGVyICVYXG4iLAotCQkJCXJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlcikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLCAiUmVhZCB2YWx1ZSAlOC44WCByZWdpc3RlciAlWFxuIiwKKwkJCQkgIHJlZ2lzdGVyX3ZhbHVlLAorCQkJCSAgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIpKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3JlZ2lzdGVyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9yZWdpc3Rlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzQyLDQwICszMjIsMzYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9zZXRfcmVnaXN0ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV9zdGF0dXMgYWNwaV9zZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUsIHUzMiBmbGFncykKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX3ZhbHVlID0gMDsKLQlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAgICpiaXRfcmVnX2luZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKwlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYml0X3JlZ19pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJhY3BpX3NldF9yZWdpc3RlciIsIHJlZ2lzdGVyX2lkKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJhY3BpX3NldF9yZWdpc3RlciIsIHJlZ2lzdGVyX2lkKTsKIAogCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIEFDUEkgUmVnaXN0ZXIgKi8KIAotCWJpdF9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvIChyZWdpc3Rlcl9pZCk7CisJYml0X3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8ocmVnaXN0ZXJfaWQpOwogCWlmICghYml0X3JlZ19pbmZvKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkJhZCBBQ1BJIEhXIHJlZ2lzdGVyX2lkOiAlWFxuIiwgcmVnaXN0ZXJfaWQpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJCYWQgQUNQSSBIVyByZWdpc3Rlcl9pZDogJVhcbiIsCisJCQkJICAgcmVnaXN0ZXJfaWQpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWlmIChmbGFncyAmIEFDUElfTVRYX0xPQ0spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEFsd2F5cyBkbyBhIHJlZ2lzdGVyIHJlYWQgZmlyc3Qgc28gd2UgY2FuIGluc2VydCB0aGUgbmV3IGJpdHMgICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyLCAmcmVnaXN0ZXJfdmFsdWUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJICAgICAgIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyLAorCQkJCSAgICAgICAmcmVnaXN0ZXJfdmFsdWUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKQEAgLTM5NSwyNiArMzcxLDMwIEBACiAJCSAqIGluZm9ybWF0aW9uIGlzIHRoZSBzaW5nbGUgYml0IHdlJ3JlIGludGVyZXN0ZWQgaW4sIGFsbCBvdGhlcnMgc2hvdWxkCiAJCSAqIGJlIHdyaXR0ZW4gYXMgMCBzbyB0aGV5IHdpbGwgYmUgbGVmdCB1bmNoYW5nZWQuCiAJCSAqLwotCQl2YWx1ZSA9IEFDUElfUkVHSVNURVJfUFJFUEFSRV9CSVRTICh2YWx1ZSwKLQkJCQkgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKKwkJdmFsdWUgPSBBQ1BJX1JFR0lTVEVSX1BSRVBBUkVfQklUUyh2YWx1ZSwKKwkJCQkJCSAgIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLAorCQkJCQkJICAgYml0X3JlZ19pbmZvLT4KKwkJCQkJCSAgIGFjY2Vzc19iaXRfbWFzayk7CiAJCWlmICh2YWx1ZSkgewotCQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICh1MTYpIHZhbHVlKTsKKwkJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCQkJQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJCSh1MTYpIHZhbHVlKTsKIAkJCXJlZ2lzdGVyX3ZhbHVlID0gMDsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEU6CiAKLQkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUgKHJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKLQkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOworCQlBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRShyZWdpc3Rlcl92YWx1ZSwKKwkJCQkJICAgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLAorCQkJCQkgICB2YWx1ZSk7CiAKLQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgKHUxNikgcmVnaXN0ZXJfdmFsdWUpOworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkJQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJKHUxNikgcmVnaXN0ZXJfdmFsdWUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MOgogCiAJCS8qCkBAIC00MjIsNjUgKzQwMiw3MyBAQAogCQkgKiBOb3RlIHRoYXQgYXQgdGhpcyBsZXZlbCwgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgYWN0dWFsbHkgVFdPCiAJCSAqIHJlZ2lzdGVycyAoQSBhbmQgQiAtIGFuZCBCIG1heSBub3QgZXhpc3QpIGlzIGFic3RyYWN0ZWQuCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlBNMSBjb250cm9sOiBSZWFkICVYXG4iLCByZWdpc3Rlcl92YWx1ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLCAiUE0xIGNvbnRyb2w6IFJlYWQgJVhcbiIsCisJCQkJICByZWdpc3Rlcl92YWx1ZSkpOwogCi0JCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFIChyZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCi0JCQkJYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssIHZhbHVlKTsKKwkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUocmVnaXN0ZXJfdmFsdWUsCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLAorCQkJCQkgICBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywKKwkJCQkJICAgdmFsdWUpOwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJKHUxNikgcmVnaXN0ZXJfdmFsdWUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgogCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsICZyZWdpc3Rlcl92YWx1ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQkgICAgICAgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwKKwkJCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlBNMiBjb250cm9sOiBSZWFkICVYIGZyb20gJTguOFglOC44WFxuIiwKLQkJCXJlZ2lzdGVyX3ZhbHVlLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0ICgKLQkJCQlhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGsuYWRkcmVzcykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywKKwkJCQkgICJQTTIgY29udHJvbDogUmVhZCAlWCBmcm9tICU4LjhYJTguOFhcbiIsCisJCQkJICByZWdpc3Rlcl92YWx1ZSwKKwkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhY3BpX2dibF9GQURULT4KKwkJCQkJCSAgICAgeHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CiAKLQkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUgKHJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKLQkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOworCQlBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRShyZWdpc3Rlcl92YWx1ZSwKKwkJCQkJICAgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLAorCQkJCQkgICB2YWx1ZSk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJBYm91dCB0byB3cml0ZSAlNC40WCB0byAlOC44WCU4LjhYXG4iLAotCQkJcmVnaXN0ZXJfdmFsdWUsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKAotCQkJCWFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAorCQkJCSAgIkFib3V0IHRvIHdyaXRlICU0LjRYIHRvICU4LjhYJTguOFhcbiIsCisJCQkJICByZWdpc3Rlcl92YWx1ZSwKKwkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhY3BpX2dibF9GQURULT4KKwkJCQkJCSAgICAgeHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsICh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MLAorCQkJCQkJKHU4KSAocmVnaXN0ZXJfdmFsdWUpKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAotCi11bmxvY2tfYW5kX2V4aXQ6CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAKIAlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKIAl9CiAKIAkvKiBOb3JtYWxpemUgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgKi8KIAotCUFDUElfREVCVUdfRVhFQyAocmVnaXN0ZXJfdmFsdWUgPQotCQkoKHJlZ2lzdGVyX3ZhbHVlICYgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spID4+Ci0JCQliaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbikpOworCUFDUElfREVCVUdfRVhFQyhyZWdpc3Rlcl92YWx1ZSA9CisJCQkoKHJlZ2lzdGVyX3ZhbHVlICYgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spID4+CisJCQkgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24pKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLCAiU2V0IGJpdHM6ICU4LjhYIGFjdHVhbCAlOC44WCByZWdpc3RlciAlWFxuIiwKLQkJCXZhbHVlLCByZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywKKwkJCSAgIlNldCBiaXRzOiAlOC44WCBhY3R1YWwgJTguOFggcmVnaXN0ZXIgJVhcbiIsIHZhbHVlLAorCQkJICByZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9zZXRfcmVnaXN0ZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfc2V0X3JlZ2lzdGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ5OCwxMDMgKzQ4NiwxMDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2xvY2ssCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXR1cm5fdmFsdWUpCithY3BpX2h3X3JlZ2lzdGVyX3JlYWQodTggdXNlX2xvY2ssIHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUxID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IDA7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTMyIHZhbHVlMSA9IDA7CisJdTMyIHZhbHVlMiA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiaHdfcmVnaXN0ZXJfcmVhZCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfcmVnaXN0ZXJfcmVhZCIpOwogCiAJaWYgKEFDUElfTVRYX0xPQ0sgPT0gdXNlX2xvY2spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCXN3aXRjaCAocmVnaXN0ZXJfaWQpIHsKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzogICAgICAgICAgIC8qIDE2LWJpdCBhY2Nlc3MgKi8KKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzoJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKDE2LCAmdmFsdWUxLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTEsCisJCQkJCSAgICZhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIFBNMUIgaXMgb3B0aW9uYWwgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICgxNiwgJnZhbHVlMiwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGspOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgxNiwgJnZhbHVlMiwKKwkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGspOwogCQl2YWx1ZTEgfD0gdmFsdWUyOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFOgkvKiAxNi1iaXQgYWNjZXNzICovCiAKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRTogICAgICAgICAgIC8qIDE2LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICgxNiwgJnZhbHVlMSwgJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTEsICZhY3BpX2dibF94cG0xYV9lbmFibGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKIAkJLyogUE0xQiBpcyBvcHRpb25hbCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKDE2LCAmdmFsdWUyLCAmYWNwaV9nYmxfeHBtMWJfZW5hYmxlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTIsICZhY3BpX2dibF94cG0xYl9lbmFibGUpOwogCQl2YWx1ZTEgfD0gdmFsdWUyOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTDoJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MOiAgICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoMTYsICZ2YWx1ZTEsICZhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgxNiwgJnZhbHVlMSwKKwkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGspOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoMTYsICZ2YWx1ZTIsICZhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTIsCisJCQkJCSAgICZhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrKTsKIAkJdmFsdWUxIHw9IHZhbHVlMjsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0w6CS8qIDgtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOiAgICAgICAgICAvKiA4LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICg4LCAmdmFsdWUxLCAmYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnZhbHVlMSwKKwkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsayk7CiAJCWJyZWFrOwogCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNX1RJTUVSOgkvKiAzMi1iaXQgYWNjZXNzICovCiAKLQljYXNlIEFDUElfUkVHSVNURVJfUE1fVElNRVI6ICAgICAgICAgICAgIC8qIDMyLWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkICgzMiwgJnZhbHVlMSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMzIsICZ2YWx1ZTEsCisJCQkJCSAgICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1NNSV9DT01NQU5EX0JMT0NLOiAgICAvKiA4LWJpdCBhY2Nlc3MgKi8KKwljYXNlIEFDUElfUkVHSVNURVJfU01JX0NPTU1BTkRfQkxPQ0s6CS8qIDgtYml0IGFjY2VzcyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wb3J0IChhY3BpX2dibF9GQURULT5zbWlfY21kLCAmdmFsdWUxLCA4KTsKKwkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BvcnQoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwgJnZhbHVlMSwgOCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIFJlZ2lzdGVyIElEOiAlWFxuIiwKLQkJCXJlZ2lzdGVyX2lkKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmtub3duIFJlZ2lzdGVyIElEOiAlWFxuIiwKKwkJCQkgIHJlZ2lzdGVyX2lkKSk7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWJyZWFrOwogCX0KIAotdW5sb2NrX2FuZF9leGl0OgorICAgICAgdW5sb2NrX2FuZF9leGl0OgogCWlmIChBQ1BJX01UWF9MT0NLID09IHVzZV9sb2NrKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKIAl9CiAKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCSpyZXR1cm5fdmFsdWUgPSB2YWx1ZTE7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19yZWdpc3Rlcl93cml0ZQpAQCAtNjEwLDEwOSArNjAyLDExMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2h3X3JlZ2lzdGVyX3dyaXRlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9sb2NrLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKK2FjcGlfc3RhdHVzIGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUodTggdXNlX2xvY2ssIHUzMiByZWdpc3Rlcl9pZCwgdTMyIHZhbHVlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImh3X3JlZ2lzdGVyX3dyaXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19yZWdpc3Rlcl93cml0ZSIpOwogCiAJaWYgKEFDUElfTVRYX0xPQ0sgPT0gdXNlX2xvY2spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCXN3aXRjaCAocmVnaXN0ZXJfaWQpIHsKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzogICAgICAgICAgIC8qIDE2LWJpdCBhY2Nlc3MgKi8KKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzoJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgxNiwgdmFsdWUsICZhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAorCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGspOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAKIAkJLyogUE0xQiBpcyBvcHRpb25hbCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgxNiwgdmFsdWUsICZhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRToJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEU6ICAgICAgICAgICAvKiAxNi1iaXQgYWNjZXNzKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfeHBtMWFfZW5hYmxlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLCAmYWNwaV9nYmxfeHBtMWFfZW5hYmxlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCS8qIFBNMUIgaXMgb3B0aW9uYWwgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfeHBtMWJfZW5hYmxlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSk7CiAJCWJyZWFrOwogCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MOgkvKiAxNi1iaXQgYWNjZXNzICovCiAKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0w6ICAgICAgICAgIC8qIDE2LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgxNiwgdmFsdWUsICZhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrKTsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MOgkvKiAxNi1iaXQgYWNjZXNzICovCiAKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MOiAgICAgICAgIC8qIDE2LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoMTYsIHZhbHVlLCAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsayk7CiAJCWJyZWFrOwogCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTDoJLyogMTYtYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTDogICAgICAgICAvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGspOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAorCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGspOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTDoJLyogOC1iaXQgYWNjZXNzICovCiAKLQljYXNlIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0w6ICAgICAgICAgIC8qIDgtYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LCB2YWx1ZSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsayk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGspOwogCQlicmVhazsKIAorCWNhc2UgQUNQSV9SRUdJU1RFUl9QTV9USU1FUjoJLyogMzItYml0IGFjY2VzcyAqLwogCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNX1RJTUVSOiAgICAgICAgICAgICAvKiAzMi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUgKDMyLCB2YWx1ZSwgJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDMyLCB2YWx1ZSwKKwkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CiAJCWJyZWFrOwogCi0KLQljYXNlIEFDUElfUkVHSVNURVJfU01JX0NPTU1BTkRfQkxPQ0s6ICAgIC8qIDgtYml0IGFjY2VzcyAqLworCWNhc2UgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSzoJLyogOC1iaXQgYWNjZXNzICovCiAKIAkJLyogU01JX0NNRCBpcyBjdXJyZW50bHkgYWx3YXlzIGluIElPIHNwYWNlICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0IChhY3BpX2dibF9GQURULT5zbWlfY21kLCB2YWx1ZSwgOCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULT5zbWlfY21kLCB2YWx1ZSwgOCk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlicmVhazsKIAl9CiAKLXVubG9ja19hbmRfZXhpdDoKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoQUNQSV9NVFhfTE9DSyA9PSB1c2VfbG9jaykgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9IQVJEV0FSRSk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZApAQCAtNzI4LDE3ICs3MjMsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2xvd19sZXZlbF9yZWFkICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKnJlZykKK2FjcGlfaHdfbG93X2xldmVsX3JlYWQodTMyIHdpZHRoLCB1MzIgKiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpCiB7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXU2NCBhZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiaHdfbG93X2xldmVsX3JlYWQiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiaHdfbG93X2xldmVsX3JlYWQiKTsKIAogCS8qCiAJICogTXVzdCBoYXZlIGEgdmFsaWQgcG9pbnRlciB0byBhIEdBUyBzdHJ1Y3R1cmUsIGFuZApAQCAtNzUxLDcgKzc0MSw3IEBACiAKIAkvKiBHZXQgYSBsb2NhbCBjb3B5IG9mIHRoZSBhZGRyZXNzLiAgSGFuZGxlcyBwb3NzaWJsZSBhbGlnbm1lbnQgaXNzdWVzICovCiAKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZhZGRyZXNzLCAmcmVnLT5hZGRyZXNzKTsKKwlBQ1BJX01PVkVfNjRfVE9fNjQoJmFkZHJlc3MsICZyZWctPmFkZHJlc3MpOwogCWlmICghYWRkcmVzcykgewogCQlyZXR1cm4gKEFFX09LKTsKIAl9CkBAIC03NjQsMzUgKzc1NCwzMiBAQAogCXN3aXRjaCAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSB7CiAJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgogCi0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9tZW1vcnkgKAotCQkJCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhZGRyZXNzLAotCQkJCSB2YWx1ZSwgd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFkZHJlc3MsCisJCQkJCSAgICAgdmFsdWUsIHdpZHRoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgogCi0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wb3J0ICgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAotCQkJCSB2YWx1ZSwgd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICB2YWx1ZSwgd2lkdGgpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiVW5zdXBwb3J0ZWQgYWRkcmVzcyBzcGFjZTogJVhcbiIsIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYXG4iLAorCQkJCSAgcmVnLT5hZGRyZXNzX3NwYWNlX2lkKSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sCi0JCSJSZWFkOiAgJTguOFggd2lkdGggJTJkIGZyb20gJTguOFglOC44WCAoJXMpXG4iLAotCQkqdmFsdWUsIHdpZHRoLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAotCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCisJCQkgICJSZWFkOiAgJTguOFggd2lkdGggJTJkIGZyb20gJTguOFglOC44WCAoJXMpXG4iLAorCQkJICAqdmFsdWUsIHdpZHRoLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlCkBAIC04MDgsMTcgKzc5NSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqcmVnKQorYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUodTMyIHdpZHRoLCB1MzIgdmFsdWUsIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqIHJlZykKIHsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdTY0IGFkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJod19sb3dfbGV2ZWxfd3JpdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiaHdfbG93X2xldmVsX3dyaXRlIik7CiAKIAkvKgogCSAqIE11c3QgaGF2ZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBHQVMgc3RydWN0dXJlLCBhbmQKQEAgLTgzMSw3ICs4MTMsNyBAQAogCiAJLyogR2V0IGEgbG9jYWwgY29weSBvZiB0aGUgYWRkcmVzcy4gIEhhbmRsZXMgcG9zc2libGUgYWxpZ25tZW50IGlzc3VlcyAqLwogCi0JQUNQSV9NT1ZFXzY0X1RPXzY0ICgmYWRkcmVzcywgJnJlZy0+YWRkcmVzcyk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZhZGRyZXNzLCAmcmVnLT5hZGRyZXNzKTsKIAlpZiAoIWFkZHJlc3MpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQpAQCAtODQzLDMwICs4MjUsMjggQEAKIAlzd2l0Y2ggKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkgewogCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWToKIAotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX21lbW9yeSAoCi0JCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFkZHJlc3MsCi0JCQkJIHZhbHVlLCB3aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFkZHJlc3MsCisJCQkJCSAgICAgIHZhbHVlLCB3aWR0aCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKIAotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsCi0JCQkJIHZhbHVlLCB3aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICAgdmFsdWUsIHdpZHRoKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYXG4iLCByZWctPmFkZHJlc3Nfc3BhY2VfaWQpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWFxuIiwKKwkJCQkgIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lPLAotCQkiV3JvdGU6ICU4LjhYIHdpZHRoICUyZCAgIHRvICU4LjhYJTguOFggKCVzKVxuIiwKLQkJdmFsdWUsIHdpZHRoLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAotCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCisJCQkgICJXcm90ZTogJTguOFggd2lkdGggJTJkICAgdG8gJTguOFglOC44WCAoJXMpXG4iLAorCQkJICB2YWx1ZSwgd2lkdGgsCisJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOwogCiAJcmV0dXJuIChzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKaW5kZXggNDE1ZDM0Mi4uMzQ1MTkwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCkBAIC00Niw4ICs0Niw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJod3NsZWVwIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiaHdzbGVlcCIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjEsMzAgKzYwLDI1IEBACiAgKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IgKAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbF9hZGRyZXNzKQorYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5c2ljYWxfYWRkcmVzcykKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yIik7CiAKIAkvKiBTZXQgdGhlIHZlY3RvciAqLwogCiAJaWYgKGFjcGlfZ2JsX2NvbW1vbl9mQUNTLnZlY3Rvcl93aWR0aCA9PSAzMikgewotCQkqKEFDUElfQ0FTVF9QVFIgKHUzMiwgYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpCi0JCQkJPSAodTMyKSBwaHlzaWNhbF9hZGRyZXNzOwotCX0KLQllbHNlIHsKLQkJKmFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IKLQkJCQk9IHBoeXNpY2FsX2FkZHJlc3M7CisJCSooQUNQSV9DQVNUX1BUUgorCQkgICh1MzIsIGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IpKQorCQkgICAgPSAodTMyKSBwaHlzaWNhbF9hZGRyZXNzOworCX0gZWxzZSB7CisJCSphY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gcGh5c2ljYWxfYWRkcmVzczsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IKQEAgLTEwMSwzMyArOTUsMzEgQEAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciAoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICpwaHlzaWNhbF9hZGRyZXNzKQorYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgKiBwaHlzaWNhbF9hZGRyZXNzKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IiKTsKIAogCWlmICghcGh5c2ljYWxfYWRkcmVzcykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogR2V0IHRoZSB2ZWN0b3IgKi8KIAogCWlmIChhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPT0gMzIpIHsKIAkJKnBoeXNpY2FsX2FkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJKihBQ1BJX0NBU1RfUFRSICh1MzIsIGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IpKTsKLQl9Ci0JZWxzZSB7CisJCSAgICAqCisJCSAgICAoQUNQSV9DQVNUX1BUUgorCQkgICAgICh1MzIsIGFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IpKTsKKwl9IGVsc2UgewogCQkqcGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkqYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKKwkJICAgICphY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAKQEAgLTE0MywyNSArMTM1LDIyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX3N0YXRlKQorYWNwaV9zdGF0dXMgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKHU4IHNsZWVwX3N0YXRlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgICAgIGFyZ19saXN0OwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICBhcmc7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwIik7CiAKIAkvKgogCSAqIF9QU1cgbWV0aG9kcyBjb3VsZCBiZSBydW4gaGVyZSB0byBlbmFibGUgd2FrZS1vbiBrZXlib2FyZCwgTEFOLCBldGMuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhIChzbGVlcF9zdGF0ZSwKLQkJCSAgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYSwgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKHNsZWVwX3N0YXRlLAorCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2EsCisJCQkJCSAgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFNldHVwIHBhcmFtZXRlciBvYmplY3QgKi8KQEAgLTE3NCwxNCArMTYzLDE0IEBACiAKIAkvKiBSdW4gdGhlIF9QVFMgYW5kIF9HVFMgbWV0aG9kcyAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19QVFMsICZhcmdfbGlzdCwgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fUFRTLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fR1RTLCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX0dUUywgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgYXJndW1lbnQgdG8gX1NTVCAqLwpAQCAtMjAyLDIyICsxOTEsMjEgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX0lORElDQVRPUl9PRkY7IC8qIERlZmF1bHQgaXMgb2ZmICovCisJCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfSU5ESUNBVE9SX09GRjsJLyogRGVmYXVsdCBpcyBvZmYgKi8KIAkJYnJlYWs7CiAJfQogCiAJLyogU2V0IHRoZSBzeXN0ZW0gaW5kaWNhdG9ycyB0byBzaG93IHRoZSBkZXNpcmVkIHNsZWVwIHN0YXRlLiAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCSBBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUKQEAgLTIzMSw4MCArMjE5LDgyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgYXNtbGlua2FnZQotYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9zdGF0ZSkKK2FjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSh1OCBzbGVlcF9zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNMUFjb250cm9sOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE0xQmNvbnRyb2w7Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAqc2xlZXBfdHlwZV9yZWdfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAgICpzbGVlcF9lbmFibGVfcmVnX2luZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl92YWx1ZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgUE0xQWNvbnRyb2w7CisJdTMyIFBNMUJjb250cm9sOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF90eXBlX3JlZ19pbmZvOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF9lbmFibGVfcmVnX2luZm87CisJdTMyIGluX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZW50ZXJfc2xlZXBfc3RhdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW50ZXJfc2xlZXBfc3RhdGUiKTsKIAogCWlmICgoYWNwaV9nYmxfc2xlZXBfdHlwZV9hID4gQUNQSV9TTEVFUF9UWVBFX01BWCkgfHwKLQkJKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA+IEFDUElfU0xFRVBfVFlQRV9NQVgpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlNsZWVwIHZhbHVlcyBvdXQgb2YgcmFuZ2U6IEE9JVggQj0lWFxuIiwKLQkJCWFjcGlfZ2JsX3NsZWVwX3R5cGVfYSwgYWNwaV9nYmxfc2xlZXBfdHlwZV9iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOworCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iID4gQUNQSV9TTEVFUF9UWVBFX01BWCkpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJTbGVlcCB2YWx1ZXMgb3V0IG9mIHJhbmdlOiBBPSVYIEI9JVhcbiIsCisJCQkJICAgYWNwaV9nYmxfc2xlZXBfdHlwZV9hLAorCQkJCSAgIGFjcGlfZ2JsX3NsZWVwX3R5cGVfYikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVkFMVUUpOwogCX0KIAotCXNsZWVwX3R5cGVfcmVnX2luZm8gPSBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAoQUNQSV9CSVRSRUdfU0xFRVBfVFlQRV9BKTsKLQlzbGVlcF9lbmFibGVfcmVnX2luZm8gPSBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAoQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFKTsKKwlzbGVlcF90eXBlX3JlZ19pbmZvID0KKwkgICAgYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8oQUNQSV9CSVRSRUdfU0xFRVBfVFlQRV9BKTsKKwlzbGVlcF9lbmFibGVfcmVnX2luZm8gPQorCSAgICBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyhBQ1BJX0JJVFJFR19TTEVFUF9FTkFCTEUpOwogCiAJLyogQ2xlYXIgd2FrZSBzdGF0dXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENsZWFyIGFsbCBmaXhlZCBhbmQgZ2VuZXJhbCBwdXJwb3NlIHN0YXR1cyBiaXRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzIChBQ1BJX01UWF9ET19OT1RfTE9DSyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyhBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogMSkgRGlzYWJsZS9DbGVhciBhbGwgR1BFcwogCSAqIDIpIEVuYWJsZSBhbGwgd2FrZXVwIEdQRXMKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMgKEFDUElfSVNSKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCWFjcGlfZ2JsX3N5c3RlbV9hd2FrZV9hbmRfcnVubmluZyA9IEZBTFNFOwogCi0Jc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzIChBQ1BJX0lTUik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFBNMUEgY29udHJvbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAmUE0xQWNvbnRyb2wpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkgICAgICAgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgJlBNMUFjb250cm9sKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCi0JCSJFbnRlcmluZyBzbGVlcCBzdGF0ZSBbUyVkXVxuIiwgc2xlZXBfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkgICJFbnRlcmluZyBzbGVlcCBzdGF0ZSBbUyVkXVxuIiwgc2xlZXBfc3RhdGUpKTsKIAogCS8qIENsZWFyIFNMUF9FTiBhbmQgU0xQX1RZUCBmaWVsZHMgKi8KIAogCVBNMUFjb250cm9sICY9IH4oc2xlZXBfdHlwZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrIHwKLQkJCSAgIHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKKwkJCSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CiAJUE0xQmNvbnRyb2wgPSBQTTFBY29udHJvbDsKIAogCS8qIEluc2VydCBTTFBfVFlQIGJpdHMgKi8KIAotCVBNMUFjb250cm9sIHw9IChhY3BpX2dibF9zbGVlcF90eXBlX2EgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKLQlQTTFCY29udHJvbCB8PSAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7CisJUE0xQWNvbnRyb2wgfD0KKwkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT5iaXRfcG9zaXRpb24pOworCVBNMUJjb250cm9sIHw9CisJICAgIChhY3BpX2dibF9zbGVlcF90eXBlX2IgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKIAogCS8qCiAJICogV2Ugc3BsaXQgdGhlIHdyaXRlcyBvZiBTTFBfVFlQIGFuZCBTTFBfRU4gdG8gd29ya2Fyb3VuZApAQCAtMzEzLDE2ICszMDMsMTggQEAKIAogCS8qIFdyaXRlICMxOiBmaWxsIGluIFNMUF9UWVAgZGF0YSAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsIFBNMUFjb250cm9sKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwKKwkJCQkJUE0xQWNvbnRyb2wpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwgUE0xQmNvbnRyb2wpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCUFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLAorCQkJCQlQTTFCY29udHJvbCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEluc2VydCBTTFBfRU5BQkxFIGJpdCAqLwpAQCAtMzMyLDE4ICszMjQsMjAgQEAKIAogCS8qIFdyaXRlICMyOiBTTFBfVFlQICsgU0xQX0VOICovCiAKLQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSAoKTsKKwlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsIFBNMUFjb250cm9sKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCQlBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwKKwkJCQkJUE0xQWNvbnRyb2wpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwgUE0xQmNvbnRyb2wpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCUFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLAorCQkJCQlQTTFCY29udHJvbCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCWlmIChzbGVlcF9zdGF0ZSA+IEFDUElfU1RBVEVfUzMpIHsKQEAgLTM1OCwzMyArMzUyLDM0IEBACiAJCSAqIHN0aWxsIHJlYWQgdGhlIHJpZ2h0IHZhbHVlLiBJZGVhbGx5LCB0aGlzIGJsb2NrIHdvdWxkIGdvCiAJCSAqIGF3YXkgZW50aXJlbHkuCiAJCSAqLwotCQlhY3BpX29zX3N0YWxsICgxMDAwMDAwMCk7CisJCWFjcGlfb3Nfc3RhbGwoMTAwMDAwMDApOwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAotCQkJCSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJCUFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCQkJCQlzbGVlcF9lbmFibGVfcmVnX2luZm8tPgorCQkJCQkJYWNjZXNzX2JpdF9tYXNrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIFdhaXQgdW50aWwgd2UgZW50ZXIgc2xlZXAgc3RhdGUgKi8KIAogCWRvIHsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsCi0JCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsICZpbl92YWx1ZSwKKwkJCQkJICAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyogU3BpbiB1bnRpbCB3ZSB3YWtlICovCiAKIAl9IHdoaWxlICghaW5fdmFsdWUpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzk5LDYwICszOTQsNTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cyBhc21saW5rYWdlCi1hY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcyAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3Modm9pZCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3ZhbHVlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXUzMiBpbl92YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMgKEFDUElfTVRYX0RPX05PVF9MT0NLKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKIAkgKiAxKSBEaXNhYmxlL0NsZWFyIGFsbCBHUEVzCiAJICogMikgRW5hYmxlIGFsbCB3YWtldXAgR1BFcwogCSAqLwotCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcyAoQUNQSV9JU1IpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAJYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gRkFMU0U7CiAKLQlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMgKEFDUElfSVNSKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9GTFVTSF9DUFVfQ0FDSEUgKCk7CisJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKIAotCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKLQkJCSAodTMyKSBhY3BpX2dibF9GQURULT5TNGJpb3NfcmVxLCA4KTsKKwlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKKwkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+UzRiaW9zX3JlcSwgOCk7CiAKIAlkbyB7CiAJCWFjcGlfb3Nfc3RhbGwoMTAwMCk7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLAotCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsCisJCQkJCSAgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0gd2hpbGUgKCFpbl92YWx1ZSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ2Nyw1NSArNDU5LDYyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbGVhdmVfc2xlZXBfc3RhdGUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX2xlYXZlX3NsZWVwX3N0YXRlKHU4IHNsZWVwX3N0YXRlKQogewotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICAgICAgICAgYXJnX2xpc3Q7Ci0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICBhcmc7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAqc2xlZXBfdHlwZV9yZWdfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAgICpzbGVlcF9lbmFibGVfcmVnX2luZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTTFBY29udHJvbDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNMUJjb250cm9sOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKnNsZWVwX3R5cGVfcmVnX2luZm87CisJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKnNsZWVwX2VuYWJsZV9yZWdfaW5mbzsKKwl1MzIgUE0xQWNvbnRyb2w7CisJdTMyIFBNMUJjb250cm9sOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSIpOwogCiAJLyoKIAkgKiBTZXQgU0xQX1RZUEUgYW5kIFNMUF9FTiB0byBzdGF0ZSBTMC4KIAkgKiBUaGlzIGlzIHVuY2xlYXIgZnJvbSB0aGUgQUNQSSBTcGVjLCBidXQgaXQgaXMgcmVxdWlyZWQKIAkgKiBieSBzb21lIG1hY2hpbmVzLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSAoQUNQSV9TVEFURV9TMCwKLQkJCSAgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYSwgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYik7Ci0JaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlzbGVlcF90eXBlX3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8gKEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSk7Ci0JCXNsZWVwX2VuYWJsZV9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvIChBQ1BJX0JJVFJFR19TTEVFUF9FTkFCTEUpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShBQ1BJX1NUQVRFX1MwLAorCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2EsCisJCQkJCSAgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNsZWVwX3R5cGVfcmVnX2luZm8gPQorCQkgICAgYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8oQUNQSV9CSVRSRUdfU0xFRVBfVFlQRV9BKTsKKwkJc2xlZXBfZW5hYmxlX3JlZ19pbmZvID0KKwkJICAgIGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKEFDUElfQklUUkVHX1NMRUVQX0VOQUJMRSk7CiAKIAkJLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgUE0xQSBjb250cm9sICovCiAKLQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCQkgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgJlBNMUFjb250cm9sKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCSAgICAgICBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkgICAgICAgJlBNMUFjb250cm9sKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkvKiBDbGVhciBTTFBfRU4gYW5kIFNMUF9UWVAgZmllbGRzICovCiAKIAkJCVBNMUFjb250cm9sICY9IH4oc2xlZXBfdHlwZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrIHwKLQkJCQkJICAgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spOworCQkJCQkgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT4KKwkJCQkJIGFjY2Vzc19iaXRfbWFzayk7CiAJCQlQTTFCY29udHJvbCA9IFBNMUFjb250cm9sOwogCiAJCQkvKiBJbnNlcnQgU0xQX1RZUCBiaXRzICovCiAKLQkJCVBNMUFjb250cm9sIHw9IChhY3BpX2dibF9zbGVlcF90eXBlX2EgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKLQkJCVBNMUJjb250cm9sIHw9IChhY3BpX2dibF9zbGVlcF90eXBlX2IgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKKwkJCVBNMUFjb250cm9sIHw9CisJCQkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT4KKwkJCSAgICAgYml0X3Bvc2l0aW9uKTsKKwkJCVBNMUJjb250cm9sIHw9CisJCQkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT4KKwkJCSAgICAgYml0X3Bvc2l0aW9uKTsKIAogCQkJLyogSnVzdCBpZ25vcmUgYW55IGVycm9ycyAqLwogCi0JCQkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJCSAgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsIFBNMUFjb250cm9sKTsKLQkJCSh2b2lkKSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCQkJICBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwgUE0xQmNvbnRyb2wpOworCQkJKHZvaWQpYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCQkJCSAgICAgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsCisJCQkJCQkgICAgIFBNMUFjb250cm9sKTsKKwkJCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkJCQkgICAgIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLAorCQkJCQkJICAgICBQTTFCY29udHJvbCk7CiAJCX0KIAl9CiAKQEAgLTUzMiwyMyArNTMxLDIzIEBACiAJLyogSWdub3JlIGFueSBlcnJvcnMgZnJvbSB0aGVzZSBtZXRob2RzICovCiAKIAlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1dBS0lORzsKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCiAJYXJnLmludGVnZXIudmFsdWUgPSBzbGVlcF9zdGF0ZTsKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX0JGUywgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9CRlMgZmFpbGVkLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19CRlMsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNZXRob2QgX0JGUyBmYWlsZWQsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19XQUssICZhcmdfbGlzdCwgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfV0FLIGZhaWxlZCwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fV0FLLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTWV0aG9kIF9XQUsgZmFpbGVkLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAkvKiBUQkQ6IF9XQUsgInNvbWV0aW1lcyIgcmV0dXJucyBzdHVmZiAtIGRvIHdlIHdhbnQgdG8gbG9vayBhdCBpdD8gKi8KIApAQCAtNTU3LDMzICs1NTYsMzUgQEAKIAkgKiAxKSBEaXNhYmxlL0NsZWFyIGFsbCBHUEVzCiAJICogMikgRW5hYmxlIGFsbCBydW50aW1lIEdQRXMKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMgKEFDUElfTk9UX0lTUik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgPSBUUlVFOwogCi0Jc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcyAoQUNQSV9OT1RfSVNSKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEVuYWJsZSBwb3dlciBidXR0b24gKi8KIAotCSh2b2lkKSBhY3BpX3NldF9yZWdpc3RlcigKLQkJCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9FVkVOVF9QT1dFUl9CVVRUT05dLmVuYWJsZV9yZWdpc3Rlcl9pZCwKLQkJCTEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkodm9pZCkKKwkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mbworCQkJICAgICAgW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5lbmFibGVfcmVnaXN0ZXJfaWQsIDEsCisJCQkgICAgICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAKLQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoCi0JCQlhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5zdGF0dXNfcmVnaXN0ZXJfaWQsCi0JCQkxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJKHZvaWQpCisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm8KKwkJCSAgICAgIFtBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLCAxLAorCQkJICAgICAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XT1JLSU5HOwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYwppbmRleCA0OWQ3YjM5Li5hZmY2ZGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKQEAgLTQ2LDggKzQ2LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImh3dGltZXIiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJod3RpbWVyIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYwLDI5ICs1OSwyMyBAQAogICogREVTQ1JJUFRJT046IE9idGFpbnMgcmVzb2x1dGlvbiBvZiB0aGUgQUNQSSBQTSBUaW1lciAoMjQgb3IgMzIgYml0cykuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlc29sdXRpb24pCithY3BpX3N0YXR1cyBhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uKHUzMiAqIHJlc29sdXRpb24pCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24iKTsKIAogCWlmICghcmVzb2x1dGlvbikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJaWYgKDAgPT0gYWNwaV9nYmxfRkFEVC0+dG1yX3ZhbF9leHQpIHsKIAkJKnJlc29sdXRpb24gPSAyNDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJKnJlc29sdXRpb24gPSAzMjsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGltZXIKQEAgLTk1LDI2ICs4OCwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90aW1lciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGlja3MpCithY3BpX3N0YXR1cyBhY3BpX2dldF90aW1lcih1MzIgKiB0aWNrcykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF90aW1lciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfdGltZXIiKTsKIAogCWlmICghdGlja3MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3JlYWQgKDMyLCB0aWNrcywgJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDMyLCB0aWNrcywgJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGltZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RpbWVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE0NiwyMSArMTM1LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfdGltZXJfZHVyYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfdGlja3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfdGlja3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGltZV9lbGFwc2VkKQorYWNwaV9nZXRfdGltZXJfZHVyYXRpb24odTMyIHN0YXJ0X3RpY2tzLCB1MzIgZW5kX3RpY2tzLCB1MzIgKiB0aW1lX2VsYXBzZWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV90aWNrczsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHF1b3RpZW50OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZGVsdGFfdGlja3M7CisJYWNwaV9pbnRlZ2VyIHF1b3RpZW50OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfdGltZXJfZHVyYXRpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uIik7CiAKIAlpZiAoIXRpbWVfZWxhcHNlZCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKQEAgLTE2OSwyMiArMTUzLDIyIEBACiAJICovCiAJaWYgKHN0YXJ0X3RpY2tzIDwgZW5kX3RpY2tzKSB7CiAJCWRlbHRhX3RpY2tzID0gZW5kX3RpY2tzIC0gc3RhcnRfdGlja3M7Ci0JfQotCWVsc2UgaWYgKHN0YXJ0X3RpY2tzID4gZW5kX3RpY2tzKSB7CisJfSBlbHNlIGlmIChzdGFydF90aWNrcyA+IGVuZF90aWNrcykgewogCQlpZiAoMCA9PSBhY3BpX2dibF9GQURULT50bXJfdmFsX2V4dCkgewogCQkJLyogMjQtYml0IFRpbWVyICovCiAKLQkJCWRlbHRhX3RpY2tzID0gKCgoMHgwMEZGRkZGRiAtIHN0YXJ0X3RpY2tzKSArIGVuZF90aWNrcykgJiAweDAwRkZGRkZGKTsKLQkJfQotCQllbHNlIHsKKwkJCWRlbHRhX3RpY2tzID0KKwkJCSAgICAoKCgweDAwRkZGRkZGIC0gc3RhcnRfdGlja3MpICsKKwkJCSAgICAgIGVuZF90aWNrcykgJiAweDAwRkZGRkZGKTsKKwkJfSBlbHNlIHsKIAkJCS8qIDMyLWJpdCBUaW1lciAqLwogCiAJCQlkZWx0YV90aWNrcyA9ICgweEZGRkZGRkZGIC0gc3RhcnRfdGlja3MpICsgZW5kX3RpY2tzOwogCQl9Ci0JfQotCWVsc2UgLyogc3RhcnRfdGlja3MgPT0gZW5kX3RpY2tzICovIHsKKwl9IGVsc2UgewkJLyogc3RhcnRfdGlja3MgPT0gZW5kX3RpY2tzICovCisKIAkJKnRpbWVfZWxhcHNlZCA9IDA7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCkBAIC0xOTIsMTIgKzE3NiwxMSBAQAogCSAqCiAJICogdGltZV9lbGFwc2VkID0gKGRlbHRhX3RpY2tzICogMTAwMDAwMCkgLyBQTV9USU1FUl9GUkVRVUVOQ1k7CiAJICovCi0Jc3RhdHVzID0gYWNwaV91dF9zaG9ydF9kaXZpZGUgKCgodTY0KSBkZWx0YV90aWNrcykgKiAxMDAwMDAwLAotCQkJIFBNX1RJTUVSX0ZSRVFVRU5DWSwgJnF1b3RpZW50LCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoKHU2NCkgZGVsdGFfdGlja3MpICogMTAwMDAwMCwKKwkJCQkgICAgICBQTV9USU1FUl9GUkVRVUVOQ1ksICZxdW90aWVudCwgTlVMTCk7CiAKIAkqdGltZV9lbGFwc2VkID0gKHUzMikgcXVvdGllbnQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiBFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hvdGtleS5jIGIvZHJpdmVycy9hY3BpL2hvdGtleS5jCmluZGV4IDFmNzZhNDAuLjJlMmU0MDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaG90a2V5LmMKKysrIGIvZHJpdmVycy9hY3BpL2hvdGtleS5jCkBAIC02Miw3ICs2Miw3IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgICAgIEFDUElfSE9US0VZX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9ob3RrZXkiKQogCi1NT0RVTEVfQVVUSE9SKCJsdW1pbmcueXVAaW50ZWwuY29tIik7CisgICAgTU9EVUxFX0FVVEhPUigibHVtaW5nLnl1QGludGVsLmNvbSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfSE9US19OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApAQCAtMTgwLDggKzE4MCw4IEBACiBzdGF0aWMgaW50IGhvdGtleV9wb2xsX2NvbmZpZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKIHN0YXRpYyBpbnQgaG90a2V5X3BvbGxpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgdW5pb24gYWNwaV9ob3RrZXkgKmdldF9ob3RrZXlfYnlfZXZlbnQoc3RydWN0Ci0JCQkgICAgICBhY3BpX2hvdGtleV9saXN0Ci0JCQkgICAgICAqaG90a2V5X2xpc3QsIGludCBldmVudCk7CisJCQkJCSAgICAgIGFjcGlfaG90a2V5X2xpc3QKKwkJCQkJICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpOwogCiAvKiBldmVudCBiYXNlZCBjb25maWcgKi8KIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9jb25maWdfZm9wcyA9IHsKQEAgLTI0Niw3ICsyNDYsNyBAQAogc3RhdGljIGNoYXIgKmZvcm1hdF9yZXN1bHQodW5pb24gYWNwaV9vYmplY3QgKm9iamVjdCkKIHsKIAljaGFyICpidWYgPSBOVUxMOwotCQorCiAJYnVmID0gKGNoYXIgKilrbWFsbG9jKFJFU1VMVF9TVFJfTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmKQogCQltZW1zZXQoYnVmLCAwLCBSRVNVTFRfU1RSX0xFTik7CkBAIC0yNTYsNyArMjU2LDcgQEAKIAkvKiBOb3csIGp1c3Qgc3VwcG9ydCBpbnRlZ2VyIHR5cGUgKi8KIAlpZiAob2JqZWN0LT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKQogCQlzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAodTMyKSBvYmplY3QtPmludGVnZXIudmFsdWUpOwotZG9fZmFpbDoKKyAgICAgIGRvX2ZhaWw6CiAJcmV0dXJuIChidWYpOwogfQogCkBAIC0yNjgsOSArMjY4LDkgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9wb2xsaW5nX3NlcV9zaG93Iik7CiAKLQlpZiAocG9sbF9ob3RrZXktPnBvbGxfcmVzdWx0KXsKKwlpZiAocG9sbF9ob3RrZXktPnBvbGxfcmVzdWx0KSB7CiAJCWJ1ZiA9IGZvcm1hdF9yZXN1bHQocG9sbF9ob3RrZXktPnBvbGxfcmVzdWx0KTsKLQkJaWYoYnVmKQorCQlpZiAoYnVmKQogCQkJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1Zik7CiAJCWtmcmVlKGJ1Zik7CiAJfQpAQCAtMjk5LDcgKzI5OSw3IEBACiAJCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQogCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKIAkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVAotCQkgICAgJiYga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9PSBldmVudCl7CisJCSAgICAmJiBrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtID09IGV2ZW50KSB7CiAJCQl2YWwgPSBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bTsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNDMsNyArMzQzLDcgQEAKIHN0YXRpYyBpbnQgY3JlYXRlX3BvbGxpbmdfcHJvYyh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKLQljaGFyICBwcm9jX25hbWVbODBdOworCWNoYXIgcHJvY19uYW1lWzgwXTsKIAltb2RlX3QgbW9kZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImNyZWF0ZV9wb2xsaW5nX3Byb2MiKTsKQEAgLTM1MSw4ICszNTEsOCBAQAogCiAJc3ByaW50Zihwcm9jX25hbWUsICIlZCIsIGRldmljZS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKIAkvKgotCXN0cmNhdChwcm9jX25hbWUsIGRldmljZS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOwotCSovCisJICAgc3RyY2F0KHByb2NfbmFtZSwgZGV2aWNlLT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7CisJICovCiAJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSwgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKIAogCWlmICghcHJvYykgewpAQCAtNDE1LDUwICs0MTUsNTAgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQgIGhvdGtleV91cGRhdGUodW5pb24gYWNwaV9ob3RrZXkgKmtleSkKK3N0YXRpYyBpbnQgaG90a2V5X3VwZGF0ZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfdXBkYXRlIik7CiAKIAlsaXN0X2Zvcl9lYWNoKGVudHJpZXMsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICp0bXA9CisJCXVuaW9uIGFjcGlfaG90a2V5ICp0bXAgPQogCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKIAkJaWYgKHRtcC0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09CiAJCSAgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSkgewogCQkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVCkgewogCQkJCWZyZWVfaG90a2V5X2J1ZmZlcih0bXApOwogCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUgPQotCQkJICAgIAkJa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZTsKKwkJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZTsKIAkJCQl0bXAtPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtID0KLQkJCSAgICAJCWtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW07CisJCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW07CiAJCQkJdG1wLT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSA9Ci0JCQkgICAgCQlrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlOworCQkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlOwogCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QgPQotCQkJICAgIAkJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZDsKKwkJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZDsKIAkJCQlrZnJlZShrZXkpOwogCQkJfSBlbHNlIHsKIAkJCQkvKgotCQkJCWNoYXIgIHByb2NfbmFtZVs4MF07CisJCQkJICAgY2hhciAgcHJvY19uYW1lWzgwXTsKIAotCQkJCXNwcmludGYocHJvY19uYW1lLCAiJWQiLCB0bXAtPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSk7Ci0JCQkJc3RyY2F0KHByb2NfbmFtZSwgdG1wLT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7Ci0JCQkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19uYW1lLGhvdGtleV9wcm9jX2Rpcik7Ci0JCQkJKi8KKwkJCQkgICBzcHJpbnRmKHByb2NfbmFtZSwgIiVkIiwgdG1wLT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pOworCQkJCSAgIHN0cmNhdChwcm9jX25hbWUsIHRtcC0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOworCQkJCSAgIHJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSxob3RrZXlfcHJvY19kaXIpOworCQkJCSAqLwogCQkJCWZyZWVfcG9sbF9ob3RrZXlfYnVmZmVyKHRtcCk7CiAJCQkJdG1wLT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSA9Ci0JCQkJCWtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGU7CisJCQkJICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGU7CiAJCQkJdG1wLT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCA9Ci0JCQkJCWtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2Q7CisJCQkJICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2Q7CiAJCQkJdG1wLT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlID0KLQkJCQkJa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlOworCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGU7CiAJCQkJdG1wLT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kID0KLQkJCQkJa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kOworCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2Q7CiAJCQkJdG1wLT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCA9Ci0JCQkJCWtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQ7CisJCQkJICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQ7CiAJCQkJLyoKLQkJCQljcmVhdGVfcG9sbGluZ19wcm9jKHRtcCk7Ci0JCQkJKi8KKwkJCQkgICBjcmVhdGVfcG9sbGluZ19wcm9jKHRtcCk7CisJCQkJICovCiAJCQkJa2ZyZWUoa2V5KTsKIAkJCX0KIAkJCXJldHVybl9WQUxVRSgwKTsKQEAgLTQ4MywyNyArNDgzLDI1IEBACiAJCQkJCQkgICBhY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlcik7CiAJCWZyZWVfaG90a2V5X2J1ZmZlcihrZXkpOwogCX0gZWxzZSB7Ci0JCWNoYXIgIHByb2NfbmFtZVs4MF07CisJCWNoYXIgcHJvY19uYW1lWzgwXTsKIAogCQlzcHJpbnRmKHByb2NfbmFtZSwgIiVkIiwga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pOwogCQkvKgotCQlzdHJjYXQocHJvY19uYW1lLCBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKLQkJKi8KLQkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19uYW1lLGhvdGtleV9wcm9jX2Rpcik7CisJCSAgIHN0cmNhdChwcm9jX25hbWUsIGtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOworCQkgKi8KKwkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19uYW1lLCBob3RrZXlfcHJvY19kaXIpOwogCQlmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcihrZXkpOwogCX0KIAlrZnJlZShrZXkpOwogCXJldHVybl9WT0lEOwogfQogCi1zdGF0aWMgdm9pZAotZnJlZV9ob3RrZXlfYnVmZmVyKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCitzdGF0aWMgdm9pZCBmcmVlX2hvdGtleV9idWZmZXIodW5pb24gYWNwaV9ob3RrZXkgKmtleSkKIHsKIAlrZnJlZShrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kKTsKIH0KIAotc3RhdGljIHZvaWQKLWZyZWVfcG9sbF9ob3RrZXlfYnVmZmVyKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCitzdGF0aWMgdm9pZCBmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcih1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQogewogCWtmcmVlKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCk7CiAJa2ZyZWUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7CkBAIC01MTMsMTUgKzUxMSwxNSBAQAogaW5pdF9ob3RrZXlfZGV2aWNlKHVuaW9uIGFjcGlfaG90a2V5ICprZXksIGNoYXIgKmJ1c19zdHIsIGNoYXIgKmFjdGlvbl9zdHIsCiAJCSAgIGNoYXIgKm1ldGhvZCwgaW50IHN0ZF9udW0sIGludCBleHRlcm5hbF9udW0pCiB7Ci0JYWNwaV9oYW5kbGUJdG1wX2hhbmRsZTsKKwlhY3BpX2hhbmRsZSB0bXBfaGFuZGxlOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaW5pdF9ob3RrZXlfZGV2aWNlIik7CiAKLQlpZihzdGRfbnVtIDwgMCB8fCBJU19QT0xMKHN0ZF9udW0pIHx8ICFrZXkgKQorCWlmIChzdGRfbnVtIDwgMCB8fCBJU19QT0xMKHN0ZF9udW0pIHx8ICFrZXkpCiAJCWdvdG8gZG9fZmFpbDsKIAotCWlmKCFidXNfc3RyIHx8ICFhY3Rpb25fc3RyIHx8ICFtZXRob2QpCisJaWYgKCFidXNfc3RyIHx8ICFhY3Rpb25fc3RyIHx8ICFtZXRob2QpCiAJCWdvdG8gZG9fZmFpbDsKIAogCWtleS0+bGluay5ob3RrZXlfdHlwZSA9IEFDUElfSE9US0VZX0VWRU5UOwpAQCAtNTI5LDE5ICs1MjcsMjIgQEAKIAlrZXktPmV2ZW50X2hvdGtleS5mbGFnID0gMDsKIAlrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kID0gbWV0aG9kOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsYnVzX3N0ciwgJihrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlKSk7Ci0JaWYoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGJ1c19zdHIsICYoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJZ290byBkb19mYWlsOwogCWtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPSBleHRlcm5hbF9udW07Ci0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsYWN0aW9uX3N0ciwgJihrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlKSk7Ci0JaWYoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGFjdGlvbl9zdHIsCisJCQkgICAgJihrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlnb3RvIGRvX2ZhaWw7CiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJbWV0aG9kLCAmdG1wX2hhbmRsZSk7CisJCQkJIG1ldGhvZCwgJnRtcF9oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJZ290byBkb19mYWlsOwogCXJldHVybl9WQUxVRShBRV9PSyk7Ci1kb19mYWlsOgorICAgICAgZG9fZmFpbDoKIAlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiB9CiAKQEAgLTU1MiwxNCArNTUzLDE0IEBACiAJCQljaGFyICphY3Rpb25fc3RyLCBjaGFyICphY3Rpb25fbWV0aG9kLCBpbnQgc3RkX251bSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX2hhbmRsZQl0bXBfaGFuZGxlOworCWFjcGlfaGFuZGxlIHRtcF9oYW5kbGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpbml0X3BvbGxfaG90a2V5X2RldmljZSIpOwogCi0JaWYoc3RkX251bSA8IDAgfHwgSVNfRVZFTlQoc3RkX251bSkgfHwgIWtleSkKKwlpZiAoc3RkX251bSA8IDAgfHwgSVNfRVZFTlQoc3RkX251bSkgfHwgIWtleSkKIAkJZ290byBkb19mYWlsOwogCi0JaWYoIXBvbGxfc3RyIHx8ICFwb2xsX21ldGhvZCB8fCAhYWN0aW9uX3N0ciB8fCAhYWN0aW9uX21ldGhvZCkKKwlpZiAoIXBvbGxfc3RyIHx8ICFwb2xsX21ldGhvZCB8fCAhYWN0aW9uX3N0ciB8fCAhYWN0aW9uX21ldGhvZCkKIAkJZ290byBkb19mYWlsOwogCiAJa2V5LT5saW5rLmhvdGtleV90eXBlID0gQUNQSV9IT1RLRVlfUE9MTElORzsKQEAgLTU2OCwzMCArNTY5LDMyIEBACiAJa2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCA9IHBvbGxfbWV0aG9kOwogCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IGFjdGlvbl9tZXRob2Q7CiAKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCxwb2xsX3N0ciwgJihrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlKSk7Ci0JaWYoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIHBvbGxfc3RyLCAmKGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gZG9fZmFpbDsKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSwKLQkJCQlwb2xsX21ldGhvZCwgJnRtcF9oYW5kbGUpOwotICAgICAgICBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0gICAgICAgCQlnb3RvIGRvX2ZhaWw7Ci0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsYWN0aW9uX3N0ciwgJihrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUpKTsKKwkJCQkgcG9sbF9tZXRob2QsICZ0bXBfaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCWdvdG8gZG9fZmFpbDsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2dldF9oYW5kbGUoTlVMTCwgYWN0aW9uX3N0ciwKKwkJCSAgICAmKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJZ290byBkb19mYWlsOwogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJYWN0aW9uX21ldGhvZCwgJnRtcF9oYW5kbGUpOworCQkJCSBhY3Rpb25fbWV0aG9kLCAmdG1wX2hhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlnb3RvIGRvX2ZhaWw7CiAJa2V5LT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCA9CiAJICAgICh1bmlvbiBhY3BpX29iamVjdCAqKWttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIWtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQpCisJaWYgKCFrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0KQogCQlnb3RvIGRvX2ZhaWw7CiAJcmV0dXJuX1ZBTFVFKEFFX09LKTsKLWRvX2ZhaWw6CisgICAgICBkb19mYWlsOgogCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIH0KIAotCiBzdGF0aWMgaW50IGhvdGtleV9vcGVuX2NvbmZpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfb3Blbl9jb25maWciKTsKQEAgLTY3OSw4ICs2ODIsOSBAQAogCiAJc3NjYW5mKGNvbmZpZ19yZWNvcmQsICIlZCIsIGNtZCk7CiAKLQlpZigqY21kID09IDEpewotCQlpZihzc2NhbmYoY29uZmlnX3JlY29yZCwgIiVkOiVkIiwgY21kLCBpbnRlcm5hbF9ldmVudF9udW0pIT0yKQorCWlmICgqY21kID09IDEpIHsKKwkJaWYgKHNzY2FuZihjb25maWdfcmVjb3JkLCAiJWQ6JWQiLCBjbWQsIGludGVybmFsX2V2ZW50X251bSkgIT0KKwkJICAgIDIpCiAJCQlnb3RvIGRvX2ZhaWw7CiAJCWVsc2UKIAkJCXJldHVybiAoNik7CkBAIC02OTQsOCArNjk4LDggQEAKIAkJZ290byBkb19mYWlsOwogCiAJY291bnQgPSB0bXAxIC0gdG1wOwotCSpidXNfaGFuZGxlID0gKGNoYXIgKikga21hbGxvYyhjb3VudCsxLCBHRlBfS0VSTkVMKTsKLQlpZighKmJ1c19oYW5kbGUpCisJKmJ1c19oYW5kbGUgPSAoY2hhciAqKWttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpidXNfaGFuZGxlKQogCQlnb3RvIGRvX2ZhaWw7CiAJc3RybmNweSgqYnVzX2hhbmRsZSwgdG1wLCBjb3VudCk7CiAJKigqYnVzX2hhbmRsZSArIGNvdW50KSA9IDA7CkBAIC03MDYsOCArNzEwLDggQEAKIAlpZiAoIXRtcDEpCiAJCWdvdG8gZG9fZmFpbDsKIAljb3VudCA9IHRtcDEgLSB0bXA7Ci0JKmJ1c19tZXRob2QgPSAoY2hhciAqKSBrbWFsbG9jKGNvdW50KzEsIEdGUF9LRVJORUwpOwotCWlmKCEqYnVzX21ldGhvZCkKKwkqYnVzX21ldGhvZCA9IChjaGFyICopa21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOworCWlmICghKmJ1c19tZXRob2QpCiAJCWdvdG8gZG9fZmFpbDsKIAlzdHJuY3B5KCpidXNfbWV0aG9kLCB0bXAsIGNvdW50KTsKIAkqKCpidXNfbWV0aG9kICsgY291bnQpID0gMDsKQEAgLTcxOCw3ICs3MjIsNyBAQAogCWlmICghdG1wMSkKIAkJZ290byBkb19mYWlsOwogCWNvdW50ID0gdG1wMSAtIHRtcDsKLQkqYWN0aW9uX2hhbmRsZSA9IChjaGFyICopIGttYWxsb2MoY291bnQrMSwgR0ZQX0tFUk5FTCk7CisJKmFjdGlvbl9oYW5kbGUgPSAoY2hhciAqKWttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKIAlzdHJuY3B5KCphY3Rpb25faGFuZGxlLCB0bXAsIGNvdW50KTsKIAkqKCphY3Rpb25faGFuZGxlICsgY291bnQpID0gMDsKIApAQCAtNzI4LDE3ICs3MzIsMTggQEAKIAlpZiAoIXRtcDEpCiAJCWdvdG8gZG9fZmFpbDsKIAljb3VudCA9IHRtcDEgLSB0bXA7Ci0JKm1ldGhvZCA9IChjaGFyICopIGttYWxsb2MoY291bnQrMSwgR0ZQX0tFUk5FTCk7Ci0JaWYoISptZXRob2QpCisJKm1ldGhvZCA9IChjaGFyICopa21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOworCWlmICghKm1ldGhvZCkKIAkJZ290byBkb19mYWlsOwogCXN0cm5jcHkoKm1ldGhvZCwgdG1wLCBjb3VudCk7CiAJKigqbWV0aG9kICsgY291bnQpID0gMDsKIAotCWlmKHNzY2FuZih0bXAxICsgMSwgIiVkOiVkIiwgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pPD0wKQorCWlmIChzc2NhbmYodG1wMSArIDEsICIlZDolZCIsIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtKSA8PQorCSAgICAwKQogCQlnb3RvIGRvX2ZhaWw7CiAKIAlyZXR1cm5fVkFMVUUoNik7Ci1kb19mYWlsOgorICAgICAgZG9fZmFpbDoKIAlyZXR1cm5fVkFMVUUoLTEpOwogfQogCkBAIC03NTgsOCArNzYzLDggQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoKCJob3RrZXlfd3JpdGVfY29uZmlnIikpOwogCi0JY29uZmlnX3JlY29yZCA9IChjaGFyICopIGttYWxsb2MoY291bnQrMSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIWNvbmZpZ19yZWNvcmQpCisJY29uZmlnX3JlY29yZCA9IChjaGFyICopa21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOworCWlmICghY29uZmlnX3JlY29yZCkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGNvbmZpZ19yZWNvcmQsIGJ1ZmZlciwgY291bnQpKSB7CkBAIC03NzcsMTAgKzc4MiwxMCBAQAogCQkJJm1ldGhvZCwgJmludGVybmFsX2V2ZW50X251bSwgJmV4dGVybmFsX2V2ZW50X251bSk7CiAKIAlrZnJlZShjb25maWdfcmVjb3JkKTsKLQlpZihJU19PVEhFUlMoaW50ZXJuYWxfZXZlbnRfbnVtKSkKKwlpZiAoSVNfT1RIRVJTKGludGVybmFsX2V2ZW50X251bSkpCiAJCWdvdG8gZG9fZmFpbDsKIAlpZiAocmV0ICE9IDYpIHsKLWRvX2ZhaWw6CQorCSAgICAgIGRvX2ZhaWw6CiAJCWtmcmVlKGJ1c19oYW5kbGUpOwogCQlrZnJlZShidXNfbWV0aG9kKTsKIAkJa2ZyZWUoYWN0aW9uX2hhbmRsZSk7CkBAIC03OTEsMTQgKzc5NiwxNCBAQAogCX0KIAogCWtleSA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfaG90a2V5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIWtleSkKKwlpZiAoIWtleSkKIAkJZ290byBkb19mYWlsOwogCW1lbXNldChrZXksIDAsIHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSkpOwotCWlmKGNtZCA9PSAxKSB7CisJaWYgKGNtZCA9PSAxKSB7CiAJCXVuaW9uIGFjcGlfaG90a2V5ICp0bXAgPSBOVUxMOwogCQl0bXAgPSBnZXRfaG90a2V5X2J5X2V2ZW50KCZnbG9iYWxfaG90a2V5X2xpc3QsCi0JCQkJaW50ZXJuYWxfZXZlbnRfbnVtKTsKLQkJaWYoIXRtcCkKKwkJCQkJICBpbnRlcm5hbF9ldmVudF9udW0pOworCQlpZiAoIXRtcCkKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGtleSIpKTsKIAkJZWxzZQogCQkJbWVtY3B5KGtleSwgdG1wLCBzaXplb2YodW5pb24gYWNwaV9ob3RrZXkpKTsKQEAgLTgwNywxNSArODEyLDE2IEBACiAJaWYgKElTX0VWRU5UKGludGVybmFsX2V2ZW50X251bSkpIHsKIAkJa2ZyZWUoYnVzX21ldGhvZCk7CiAJCXJldCA9IGluaXRfaG90a2V5X2RldmljZShrZXksIGJ1c19oYW5kbGUsIGFjdGlvbl9oYW5kbGUsIG1ldGhvZCwKLQkJCQkgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pOworCQkJCQkgaW50ZXJuYWxfZXZlbnRfbnVtLAorCQkJCQkgZXh0ZXJuYWxfZXZlbnRfbnVtKTsKIAl9IGVsc2UKIAkJcmV0ID0gaW5pdF9wb2xsX2hvdGtleV9kZXZpY2Uoa2V5LCBidXNfaGFuZGxlLCBidXNfbWV0aG9kLAotCQkJCSAgICAgIGFjdGlvbl9oYW5kbGUsIG1ldGhvZCwKLQkJCQkgICAgICBpbnRlcm5hbF9ldmVudF9udW0pOworCQkJCQkgICAgICBhY3Rpb25faGFuZGxlLCBtZXRob2QsCisJCQkJCSAgICAgIGludGVybmFsX2V2ZW50X251bSk7CiAJaWYgKHJldCkgewogCQlrZnJlZShidXNfaGFuZGxlKTsKIAkJa2ZyZWUoYWN0aW9uX2hhbmRsZSk7Ci0JCWlmKElTX0VWRU5UKGludGVybmFsX2V2ZW50X251bSkpCisJCWlmIChJU19FVkVOVChpbnRlcm5hbF9ldmVudF9udW0pKQogCQkJZnJlZV9ob3RrZXlfYnVmZmVyKGtleSk7CiAJCWVsc2UKIAkJCWZyZWVfcG9sbF9ob3RrZXlfYnVmZmVyKGtleSk7CkBAIC04MjQsMTMgKzgzMCwxNCBAQAogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJfQogCi1jb250X2NtZDoKKyAgICAgIGNvbnRfY21kOgogCWtmcmVlKGJ1c19oYW5kbGUpOwogCWtmcmVlKGFjdGlvbl9oYW5kbGUpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIDA6Ci0JCWlmKGdldF9ob3RrZXlfYnlfZXZlbnQoJmdsb2JhbF9ob3RrZXlfbGlzdCxrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSkpCisJCWlmIChnZXRfaG90a2V5X2J5X2V2ZW50CisJCSAgICAoJmdsb2JhbF9ob3RrZXlfbGlzdCwga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pKQogCQkJZ290byBmYWlsX291dDsKIAkJZWxzZQogCQkJaG90a2V5X2FkZChrZXkpOwpAQCAtODM5LDcgKzg0Niw3IEBACiAJCWhvdGtleV9yZW1vdmUoa2V5KTsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlpZihob3RrZXlfdXBkYXRlKGtleSkpCisJCWlmIChob3RrZXlfdXBkYXRlKGtleSkpCiAJCQlnb3RvIGZhaWxfb3V0OwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODQ3LDggKzg1NCw4IEBACiAJCWJyZWFrOwogCX0KIAlyZXR1cm5fVkFMVUUoY291bnQpOwotZmFpbF9vdXQ6Ci0JaWYoSVNfRVZFTlQoaW50ZXJuYWxfZXZlbnRfbnVtKSkKKyAgICAgIGZhaWxfb3V0OgorCWlmIChJU19FVkVOVChpbnRlcm5hbF9ldmVudF9udW0pKQogCQlmcmVlX2hvdGtleV9idWZmZXIoa2V5KTsKIAllbHNlCiAJCWZyZWVfcG9sbF9ob3RrZXlfYnVmZmVyKGtleSk7CkBAIC04ODIsNyArODg5LDggQEAKIAlyZXR1cm5fVkFMVUUoc3RhdHVzID09IEFFX09LKTsKIH0KIAotc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCB1bmlvbiBhY3BpX29iamVjdCAqdmFsKQorc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLAorCQkJIHVuaW9uIGFjcGlfb2JqZWN0ICp2YWwpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKIAl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOwpAQCAtODkzLDcgKzkwMSw3IEBACiAJb3V0cHV0LnBvaW50ZXIgPSAmb3V0X29iajsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsIE5VTEwsICZvdXRwdXQpOwotCWlmKHZhbCl7CisJaWYgKHZhbCkgewogCQl2YWwtPmludGVnZXIudmFsdWUgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7CiAJCXZhbC0+dHlwZSA9IG91dF9vYmoudHlwZTsKIAl9IGVsc2UKQEAgLTkwMyw4ICs5MTEsOCBAQAogfQogCiBzdGF0aWMgdW5pb24gYWNwaV9ob3RrZXkgKmdldF9ob3RrZXlfYnlfZXZlbnQoc3RydWN0Ci0JCQkgICAgICBhY3BpX2hvdGtleV9saXN0Ci0JCQkgICAgICAqaG90a2V5X2xpc3QsIGludCBldmVudCkKKwkJCQkJICAgICAgYWNwaV9ob3RrZXlfbGlzdAorCQkJCQkgICAgICAqaG90a2V5X2xpc3QsIGludCBldmVudCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwogCkBAIC05MTIsMTAgKzkyMCwxMCBAQAogCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KIAkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CiAJCWlmIChrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9PSBldmVudCkgewotCQkJcmV0dXJuKGtleSk7CisJCQlyZXR1cm4gKGtleSk7CiAJCX0KIAl9Ci0JcmV0dXJuKE5VTEwpOworCXJldHVybiAoTlVMTCk7CiB9CiAKIC8qCkBAIC05MzIsMTUgKzk0MCwxNSBAQAogewogCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CiAJY2hhciAqYXJnOwotCWludCBldmVudCxtZXRob2RfdHlwZSx0eXBlLCB2YWx1ZTsKKwlpbnQgZXZlbnQsIG1ldGhvZF90eXBlLCB0eXBlLCB2YWx1ZTsKIAl1bmlvbiBhY3BpX2hvdGtleSAqa2V5OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X2V4ZWN0ZV9hbWxfbWV0aG9kIik7CiAKLQlhcmcgPSAoY2hhciAqKSBrbWFsbG9jKGNvdW50KzEsIEdGUF9LRVJORUwpOwotCWlmKCFhcmcpCisJYXJnID0gKGNoYXIgKilrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcmcpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKLQlhcmdbY291bnRdPTA7CisJYXJnW2NvdW50XSA9IDA7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoYXJnLCBidWZmZXIsIGNvdW50KSkgewogCQlrZnJlZShhcmcpOwpAQCAtOTQ4LDcgKzk1Niw4IEBACiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAl9CiAKLQlpZiAoc3NjYW5mKGFyZywgIiVkOiVkOiVkOiVkIiwgJmV2ZW50LCAmbWV0aG9kX3R5cGUsICZ0eXBlLCAmdmFsdWUpICE9IDQpIHsKKwlpZiAoc3NjYW5mKGFyZywgIiVkOiVkOiVkOiVkIiwgJmV2ZW50LCAmbWV0aG9kX3R5cGUsICZ0eXBlLCAmdmFsdWUpICE9CisJICAgIDQpIHsKIAkJa2ZyZWUoYXJnKTsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYXJndW1lbnQgMyIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwpAQCAtOTU2LDE5ICs5NjUsMjEgQEAKIAlrZnJlZShhcmcpOwogCWlmICh0eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCWtleSA9IGdldF9ob3RrZXlfYnlfZXZlbnQoaG90a2V5X2xpc3QsIGV2ZW50KTsKLQkJaWYoIWtleSkKKwkJaWYgKCFrZXkpCiAJCQlnb3RvIGRvX2ZhaWw7CiAJCWlmIChJU19FVkVOVChldmVudCkpCiAJCQl3cml0ZV9hY3BpX2ludChrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCQlrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kLCB2YWx1ZSwgTlVMTCk7CisJCQkJICAgICAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QsIHZhbHVlLAorCQkJCSAgICAgICBOVUxMKTsKIAkJZWxzZSBpZiAoSVNfUE9MTChldmVudCkpIHsKLQkJCWlmICggbWV0aG9kX3R5cGUgPT0gUE9MTF9NRVRIT0QgKQorCQkJaWYgKG1ldGhvZF90eXBlID09IFBPTExfTUVUSE9EKQogCQkJCXJlYWRfYWNwaV9pbnQoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSwKLQkJCQkJa2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCwKLQkJCQkJa2V5LT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCk7Ci0JCQllbHNlIGlmICggbWV0aG9kX3R5cGUgPT0gQUNUSU9OX01FVEhPRCApCisJCQkJCSAgICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QsCisJCQkJCSAgICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQpOworCQkJZWxzZSBpZiAobWV0aG9kX3R5cGUgPT0gQUNUSU9OX01FVEhPRCkKIAkJCQl3cml0ZV9hY3BpX2ludChrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwgdmFsdWUsIE5VTEwpOworCQkJCQkgICAgICAga2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLAorCQkJCQkgICAgICAgdmFsdWUsIE5VTEwpOwogCQkJZWxzZQogCQkJCWdvdG8gZG9fZmFpbDsKIApAQCAtOTc4LDcgKzk4OSw3IEBACiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAl9CiAJcmV0dXJuX1ZBTFVFKGNvdW50KTsKLWRvX2ZhaWw6CisgICAgICBkb19mYWlsOgogCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAogfQpAQCAtMTA3NCwxNSArMTA4NSwxNSBAQAogCiAJcmV0dXJuICgwKTsKIAotZG9fZmFpbDU6CisgICAgICBkb19mYWlsNToKIAlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfSU5GTywgaG90a2V5X3Byb2NfZGlyKTsKLWRvX2ZhaWw0OgorICAgICAgZG9fZmFpbDQ6CiAJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0FDVElPTiwgaG90a2V5X3Byb2NfZGlyKTsKLWRvX2ZhaWwzOgorICAgICAgZG9fZmFpbDM6CiAJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BMX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKLWRvX2ZhaWwyOgorICAgICAgZG9fZmFpbDI6CiAJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0VWX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKLWRvX2ZhaWwxOgorICAgICAgZG9fZmFpbDE6CiAJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BST0MsIGFjcGlfcm9vdF9kaXIpOwogCXJldHVybiAoLUVOT0RFVik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jCmluZGV4IGFkODVlMTAuLjVjYzA5MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jCkBAIC0yLDcgKzIsNyBAQAogICogIGlibV9hY3BpLmMgLSBJQk0gVGhpbmtQYWQgQUNQSSBFeHRyYXMKICAqCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNCBCb3Jpc2xhdiBEZWlhbm92CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAdXNlcnMuc2YubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNywzOCArMTcsNjIgQEAKICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICoKKyAqLworCisjZGVmaW5lIElCTV9WRVJTSU9OICIwLjEyYSIKKworLyoKICAqICBDaGFuZ2Vsb2c6Ci0gKgotICogIDIwMDQtMDgtMDkJMC4xCWluaXRpYWwgcmVsZWFzZSwgc3VwcG9ydCBmb3IgWCBzZXJpZXMKLSAqICAyMDA0LTA4LTE0CTAuMglzdXBwb3J0IGZvciBUIHNlcmllcywgWDIwCi0gKgkJCWJsdWV0b290aCBlbmFibGUvZGlzYWJsZQotICoJCQlob3RrZXkgZXZlbnRzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAqCQkJcmVtb3ZlZCBmYW4gY29udHJvbCwgY3VycmVudGx5IHVzZWxlc3MKLSAqICAyMDA0LTA4LTE3CTAuMwlzdXBwb3J0IGZvciBSNDAKLSAqCQkJbGNkIG9mZiwgYnJpZ2h0bmVzcyBjb250cm9sCi0gKgkJCXRoaW5rbGlnaHQgb24vb2ZmCi0gKiAgMjAwNC0wOS0xNgkwLjQJc3VwcG9ydCBmb3IgbW9kdWxlIHBhcmFtZXRlcnMKLSAqCQkJaG90a2V5IG1hc2sgY2FuIGJlIHByZWZpeGVkIGJ5IDB4Ci0gKgkJCXZpZGVvIG91dHB1dCBzd2l0Y2hpbmcKLSAqCQkJdmlkZW8gZXhwYW5zaW9uIGNvbnRyb2wKLSAqCQkJdWx0cmFiYXkgZWplY3Qgc3VwcG9ydAotICoJCQlyZW1vdmVkIGxjZCBicmlnaHRuZXNzL29uL29mZiBjb250cm9sLCBkaWRuJ3Qgd29yaworICogIAorICogIDIwMDUtMDgtMTcgIDAuMTIJZml4IGNvbXBpbGF0aW9uIG9uIDIuNi4xMy1yYyBrZXJuZWxzCisgKiAgMjAwNS0wMy0xNwkwLjExCXN1cHBvcnQgZm9yIDYwMGUsIDc3MHgKKyAqCQkJICAgIHRoYW5rcyB0byBKYW1pZSBMZW50aW4gPGxlbnRpbmpAZGlhbC5waXBleC5jb20+CisgKgkJCXN1cHBvcnQgZm9yIDc3MGUsIEc0MQorICoJCQlHNDAgYW5kIEc0MSBkb24ndCBoYXZlIGEgdGhpbmtsaWdodAorICoJCQl0ZW1wZXJhdHVyZXMgbm8gbG9uZ2VyIGV4cGVyaW1lbnRhbAorICoJCQlleHBlcmltZW50YWwgYnJpZ2h0bmVzcyBjb250cm9sCisgKgkJCWV4cGVyaW1lbnRhbCB2b2x1bWUgY29udHJvbAorICoJCQlleHBlcmltZW50YWwgZmFuIGVuYWJsZS9kaXNhYmxlCisgKiAgMjAwNS0wMS0xNgkwLjEwCWZpeCBtb2R1bGUgbG9hZGluZyBvbiBSMzAsIFIzMSAKKyAqICAyMDA1LTAxLTE2CTAuOQlzdXBwb3J0IGZvciA1NzAsIFIzMCwgUjMxCisgKgkJCXVsdHJhYmF5IHN1cHBvcnQgb24gQTIycCwgQTN4CisgKgkJCWxpbWl0IGFyZyBmb3IgY21vcywgbGVkLCBiZWVwLCBkcm9wIGV4cGVyaW1lbnRhbCBzdGF0dXMKKyAqCQkJbW9yZSBjYXBhYmxlIGxlZCBjb250cm9sIG9uIEEyMWUsIEEyMnAsIFQyMC0yMiwgWDIwCisgKgkJCWV4cGVyaW1lbnRhbCB0ZW1wZXJhdHVyZXMgYW5kIGZhbiBzcGVlZAorICoJCQlleHBlcmltZW50YWwgZW1iZWRkZWQgY29udHJvbGxlciByZWdpc3RlciBkdW1wCisgKgkJCW1hcmsgbW9yZSBmdW5jdGlvbnMgYXMgX19pbml0LCBkcm9wIGluY29ycmVjdCBfX2V4aXQKKyAqCQkJdXNlIE1PRFVMRV9WRVJTSU9OCisgKgkJCSAgICB0aGFua3MgdG8gSGVucmlrIEJyaXggQW5kZXJzZW4gPGJyaXhAZ2VudG9vLm9yZz4KKyAqCQkJZml4IHBhcmFtZXRlciBwYXNzaW5nIG9uIG1vZHVsZSBsb2FkaW5nCisgKgkJCSAgICB0aGFua3MgdG8gUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgorICoJCQkgICAgdGhhbmtzIHRvIEppbSBSYWRmb3JkIDxyYWRmb3JkQGJsYWNrYmVhbi5vcmc+CisgKiAgMjAwNC0xMS0wOAkwLjgJZml4IGluaXQgZXJyb3IgY2FzZSwgZG9uJ3QgcmV0dXJuIGZyb20gYSBtYWNybworICoJCQkgICAgdGhhbmtzIHRvIENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPgorICogIDIwMDQtMTAtMjMJMC43CWZpeCBtb2R1bGUgbG9hZGluZyBvbiBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwCisgKgkJCWZpeCBsZWQgY29udHJvbCBvbiBBMjFlCisgKiAgMjAwNC0xMC0xOQkwLjYJdXNlIGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigpIHRvIGNsYWltIEhLRVkgZGV2aWNlCiAgKiAgMjAwNC0xMC0xOAkwLjUJdGhpbmtsaWdodCBzdXBwb3J0IG9uIEEyMWUsIEc0MCwgUjMyLCBUMjAsIFQyMSwgWDIwCiAgKgkJCXByb2MgZmlsZSBmb3JtYXQgY2hhbmdlZAogICoJCQl2aWRlb19zd2l0Y2ggY29tbWFuZAogICoJCQlleHBlcmltZW50YWwgY21vcyBjb250cm9sCiAgKgkJCWV4cGVyaW1lbnRhbCBsZWQgY29udHJvbAogICoJCQlleHBlcmltZW50YWwgYWNwaSBzb3VuZHMKLSAqICAyMDA0LTEwLTE5CTAuNgl1c2UgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCkgdG8gY2xhaW0gSEtFWSBkZXZpY2UKLSAqICAyMDA0LTEwLTIzCTAuNwlmaXggbW9kdWxlIGxvYWRpbmcgb24gQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMAotICoJCQlmaXggTEVEIGNvbnRyb2wgb24gQTIxZQotICogIDIwMDQtMTEtMDgJMC44CWZpeCBpbml0IGVycm9yIGNhc2UsIGRvbid0IHJldHVybiBmcm9tIGEgbWFjcm8KLSAqCQkJCXRoYW5rcyB0byBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4KKyAqICAyMDA0LTA5LTE2CTAuNAlzdXBwb3J0IGZvciBtb2R1bGUgcGFyYW1ldGVycworICoJCQlob3RrZXkgbWFzayBjYW4gYmUgcHJlZml4ZWQgYnkgMHgKKyAqCQkJdmlkZW8gb3V0cHV0IHN3aXRjaGluZworICoJCQl2aWRlbyBleHBhbnNpb24gY29udHJvbAorICoJCQl1bHRyYWJheSBlamVjdCBzdXBwb3J0CisgKgkJCXJlbW92ZWQgbGNkIGJyaWdodG5lc3Mvb24vb2ZmIGNvbnRyb2wsIGRpZG4ndCB3b3JrCisgKiAgMjAwNC0wOC0xNwkwLjMJc3VwcG9ydCBmb3IgUjQwCisgKgkJCWxjZCBvZmYsIGJyaWdodG5lc3MgY29udHJvbAorICoJCQl0aGlua2xpZ2h0IG9uL29mZgorICogIDIwMDQtMDgtMTQJMC4yCXN1cHBvcnQgZm9yIFQgc2VyaWVzLCBYMjAKKyAqCQkJYmx1ZXRvb3RoIGVuYWJsZS9kaXNhYmxlCisgKgkJCWhvdGtleSBldmVudHMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICoJCQlyZW1vdmVkIGZhbiBjb250cm9sLCBjdXJyZW50bHkgdXNlbGVzcworICogIDIwMDQtMDgtMDkJMC4xCWluaXRpYWwgcmVsZWFzZSwgc3VwcG9ydCBmb3IgWCBzZXJpZXMKICAqLwogCi0jZGVmaW5lIElCTV9WRVJTSU9OICIwLjgiCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC02NCw2ICs4OCwxMSBAQAogI2RlZmluZSBJQk1fRklMRSAiaWJtX2FjcGkiCiAjZGVmaW5lIElCTV9VUkwgImh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvIgogCitNT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oSUJNX0RFU0MpOworTU9EVUxFX1ZFUlNJT04oSUJNX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCiAjZGVmaW5lIElCTV9ESVIgSUJNX05BTUUKIAogI2RlZmluZSBJQk1fTE9HIElCTV9GSUxFICI6ICIKQEAgLTg0LDU0ICsxMTMsMTIyIEBACiAjZGVmaW5lIElCTV9IQU5ETEUob2JqZWN0LCBwYXJlbnQsIHBhdGhzLi4uKQkJCVwKIAlzdGF0aWMgYWNwaV9oYW5kbGUgIG9iamVjdCMjX2hhbmRsZTsJCQlcCiAJc3RhdGljIGFjcGlfaGFuZGxlICpvYmplY3QjI19wYXJlbnQgPSAmcGFyZW50IyNfaGFuZGxlOwlcCisJc3RhdGljIGNoYXIgICAgICAgICpvYmplY3QjI19wYXRoOwkJCVwKIAlzdGF0aWMgY2hhciAgICAgICAgKm9iamVjdCMjX3BhdGhzW10gPSB7IHBhdGhzIH0KIAotSUJNX0hBTkRMRShlYywgcm9vdCwKLQkgICAiXFxfU0IuUENJMC5JU0EuRUMiLCAgICAvKiBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwICovCi0JICAgIlxcX1NCLlBDSTAuTFBDLkVDIiwgICAgLyogYWxsIG90aGVycyAqLwotKTsKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1vZGVscyBhcmUgc3VwcG9ydGVkIHRvIHZhcmlvdXMgZGVncmVlczoKKyAqCisgKiA1NzAsIDYwMGUsIDYwMHgsIDc3MGUsIDc3MHgKKyAqIEEyMG0sIEEyMWUsIEEyMW0sIEEyMXAsIEEyMnAsIEEzMCwgQTMwcCwgQTMxLCBBMzFwCisgKiBHNDAsIEc0MQorICogUjMwLCBSMzEsIFIzMiwgUjQwLCBSNDBlLCBSNTAsIFI1MGUsIFI1MHAsIFI1MQorICogVDIwLCBUMjEsIFQyMiwgVDIzLCBUMzAsIFQ0MCwgVDQwcCwgVDQxLCBUNDFwLCBUNDIsIFQ0MnAsIFQ0MworICogWDIwLCBYMjEsIFgyMiwgWDIzLCBYMjQsIFgzMCwgWDMxLCBYNDAKKyAqCisgKiBUaGUgZm9sbG93aW5nIG1vZGVscyBoYXZlIG5vIHN1cHBvcnRlZCBmZWF0dXJlczoKKyAqCisgKiAyNDAsIDI0MHgsIGkxNDAwCisgKgorICogU3RpbGwgbWlzc2luZyBEU0RUcyBmb3IgdGhlIGZvbGxvd2luZyBtb2RlbHM6CisgKgorICogQTIwcCwgQTIyZSwgQTIybQorICogUjUyCisgKiBTMzEKKyAqIFQ0M3AKKyAqLwogCi1JQk1fSEFORExFKHZpZCwgcm9vdCwgCi0JICAgIlxcX1NCLlBDSTAuVklEIiwgICAgICAgLyogQTIxZSwgRzQwLCBYMzAsIFg0MCAqLwotCSAgICJcXF9TQi5QQ0kwLkFHUC5WSUQiLCAgIC8qIGFsbCBvdGhlcnMgKi8KLSk7CitJQk1fSEFORExFKGVjLCByb290LCAiXFxfU0IuUENJMC5JU0EuRUMwIiwJLyogMjQwLCAyNDB4ICovCisJICAgIlxcX1NCLlBDSS5JU0EuRUMiLAkvKiA1NzAgKi8KKwkgICAiXFxfU0IuUENJMC5JU0EwLkVDMCIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICJcXF9TQi5QQ0kwLklTQS5FQyIsCS8qIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KKwkgICAiXFxfU0IuUENJMC5BRDRTLkVDMCIsCS8qIGkxNDAwLCBSMzAgKi8KKwkgICAiXFxfU0IuUENJMC5JQ0gzLkVDMCIsCS8qIFIzMSAqLworCSAgICJcXF9TQi5QQ0kwLkxQQy5FQyIsCS8qIGFsbCBvdGhlcnMgKi8KKyAgICApOwogCi1JQk1fSEFORExFKGNtb3MsIHJvb3QsCi0JICAgIlxcVUNNUyIsICAgICAgICAgICAgICAgLyogUjUwLCBSNTBwLCBSNTEsIFQ0eCwgWDMxLCBYNDAgKi8KLQkgICAiXFxDTU9TIiwgICAgICAgICAgICAgICAvKiBBM3gsIEc0MCwgUjMyLCBUMjMsIFQzMCwgWDIyLCBYMjQsIFgzMCAqLwotCSAgICJcXENNUyIsICAgICAgICAgICAgICAgIC8qIFI0MCwgUjQwZSAqLwotKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwICovCitJQk1fSEFORExFKHZpZCwgcm9vdCwgIlxcX1NCLlBDSS5BR1AuVkdBIiwJLyogNTcwICovCisJICAgIlxcX1NCLlBDSTAuQUdQMC5WSUQwIiwJLyogNjAwZS94LCA3NzB4ICovCisJICAgIlxcX1NCLlBDSTAuVklEMCIsCS8qIDc3MGUgKi8KKwkgICAiXFxfU0IuUENJMC5WSUQiLAkvKiBBMjFlLCBHNHgsIFI1MGUsIFgzMCwgWDQwICovCisJICAgIlxcX1NCLlBDSTAuQUdQLlZJRCIsCS8qIGFsbCBvdGhlcnMgKi8KKyAgICApOwkJCQkvKiBSMzAsIFIzMSAqLwogCi1JQk1fSEFORExFKGRvY2ssIHJvb3QsCi0JICAgIlxcX1NCLkdEQ0siLCAgICAgICAgICAgLyogWDMwLCBYMzEsIFg0MCAqLwotCSAgICJcXF9TQi5QQ0kwLkRPQ0siLCAgICAgIC8qIEEyMnAsIFQyMCwgVDIxLCBYMjAgKi8KLQkgICAiXFxfU0IuUENJMC5QQ0kxLkRPQ0siLCAvKiBhbGwgb3RoZXJzICovCi0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEyMWUsIEc0MCwgUjMyLCBSNDAsIFI0MGUgKi8KK0lCTV9IQU5ETEUodmlkMiwgcm9vdCwgIlxcX1NCLlBDSTAuQUdQQi5WSUQiKTsJLyogRzQxICovCiAKLUlCTV9IQU5ETEUoYmF5LCByb290LAotCSAgICJcXF9TQi5QQ0kwLklERTAuU0NORC5NU1RSIik7ICAgICAgLyogYWxsIGV4Y2VwdCBBMjFlICovCi1JQk1fSEFORExFKGJheWVqLCByb290LAotCSAgICJcXF9TQi5QQ0kwLklERTAuU0NORC5NU1RSLl9FSjAiKTsgLyogYWxsIGV4Y2VwdCBBMngsIEEzeCAqLworSUJNX0hBTkRMRShjbW9zLCByb290LCAiXFxVQ01TIiwJLyogUjUwLCBSNTBlLCBSNTBwLCBSNTEsIFQ0eCwgWDMxLCBYNDAgKi8KKwkgICAiXFxDTU9TIiwJCS8qIEEzeCwgRzR4LCBSMzIsIFQyMywgVDMwLCBYMjItMjQsIFgzMCAqLworCSAgICJcXENNUyIsCQkvKiBSNDAsIFI0MGUgKi8KKyAgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCiAKLUlCTV9IQU5ETEUobGdodCwgcm9vdCwgIlxcTEdIVCIpOyAgLyogQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMCAqLwotSUJNX0hBTkRMRShoa2V5LCBlYywgICAiSEtFWSIpOyAgICAvKiBhbGwgKi8KLUlCTV9IQU5ETEUobGVkLCAgZWMsICAgIkxFRCIpOyAgICAgLyogYWxsIGV4Y2VwdCBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwICovCi1JQk1fSEFORExFKHN5c2wsIGVjLCAgICJTWVNMIik7ICAgIC8qIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAgKi8KLUlCTV9IQU5ETEUoYmxlZCwgZWMsICAgIkJMRUQiKTsgICAgLyogQTIycCwgVDIwLCBUMjEsIFgyMCAqLwotSUJNX0hBTkRMRShiZWVwLCBlYywgICAiQkVFUCIpOyAgICAvKiBhbGwgbW9kZWxzICovCitJQk1fSEFORExFKGRvY2ssIHJvb3QsICJcXF9TQi5HRENLIiwJLyogWDMwLCBYMzEsIFg0MCAqLworCSAgICJcXF9TQi5QQ0kwLkRPQ0siLAkvKiA2MDBlL3gsNzcwZSw3NzB4LEEyeG0vcCxUMjAtMjIsWDIwLTIxICovCisJICAgIlxcX1NCLlBDSTAuUENJMS5ET0NLIiwJLyogYWxsIG90aGVycyAqLworCSAgICJcXF9TQi5QQ0kuSVNBLlNMQ0UiLAkvKiA1NzAgKi8KKyAgICApOwkJCQkvKiBBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDAsUjQwZSxSNTBlICovCisKK0lCTV9IQU5ETEUoYmF5LCByb290LCAiXFxfU0IuUENJLklERS5TRUNOLk1BU1QiLAkvKiA1NzAgKi8KKwkgICAiXFxfU0IuUENJMC5JREUwLklERVMuSURTTSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICJcXF9TQi5QQ0kwLklERTAuU0NORC5NU1RSIiwJLyogYWxsIG90aGVycyAqLworICAgICk7CQkJCS8qIEEyMWUsIFIzMCwgUjMxICovCisKK0lCTV9IQU5ETEUoYmF5X2VqLCBiYXksICJfRUozIiwJLyogNjAwZS94LCBBMnhtL3AsIEEzeCAqLworCSAgICJfRUowIiwJCS8qIGFsbCBvdGhlcnMgKi8KKyAgICApOwkJCQkvKiA1NzAsQTIxZSxHNHgsUjMwLFIzMSxSMzIsUjQwZSxSNTBlICovCisKK0lCTV9IQU5ETEUoYmF5Miwgcm9vdCwgIlxcX1NCLlBDSTAuSURFMC5QUklNLlNMQVYiLAkvKiBBM3gsIFIzMiAqLworCSAgICJcXF9TQi5QQ0kwLklERTAuSURFUC5JRFBTIiwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisgICAgKTsJCQkJLyogYWxsIG90aGVycyAqLworCitJQk1fSEFORExFKGJheTJfZWosIGJheTIsICJfRUozIiwJLyogNjAwZS94LCA3NzBlLCBBM3ggKi8KKwkgICAiX0VKMCIsCQkvKiA3NzB4ICovCisgICAgKTsJCQkJLyogYWxsIG90aGVycyAqLworCisvKiBkb24ndCBsaXN0IG90aGVyIGFsdGVybmF0aXZlcyBhcyB3ZSBpbnN0YWxsIGEgbm90aWZ5IGhhbmRsZXIgb24gdGhlIDU3MCAqLworSUJNX0hBTkRMRShwY2ksIHJvb3QsICJcXF9TQi5QQ0kiKTsJLyogNTcwICovCisKK0lCTV9IQU5ETEUoaGtleSwgZWMsICJcXF9TQi5IS0VZIiwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJICAgIl5IS0VZIiwJCS8qIFIzMCwgUjMxICovCisJICAgIkhLRVkiLAkJLyogYWxsIG90aGVycyAqLworICAgICk7CQkJCS8qIDU3MCAqLworCitJQk1fSEFORExFKGxnaHQsIHJvb3QsICJcXExHSFQiKTsJLyogQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLworSUJNX0hBTkRMRShsZWRiLCBlYywgIkxFREIiKTsJLyogRzR4ICovCisKK0lCTV9IQU5ETEUobGVkLCBlYywgIlNMRUQiLAkvKiA1NzAgKi8KKwkgICAiU1lTTCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KKwkgICAiTEVEIiwJCS8qIGFsbCBvdGhlcnMgKi8KKyAgICApOwkJCQkvKiBSMzAsIFIzMSAqLworCitJQk1fSEFORExFKGJlZXAsIGVjLCAiQkVFUCIpOwkvKiBhbGwgZXhjZXB0IFIzMCwgUjMxICovCitJQk1fSEFORExFKGVjcmQsIGVjLCAiRUNSRCIpOwkvKiA1NzAgKi8KK0lCTV9IQU5ETEUoZWN3ciwgZWMsICJFQ1dSIik7CS8qIDU3MCAqLworSUJNX0hBTkRMRShmYW5zLCBlYywgIkZBTlMiKTsJLyogWDMxLCBYNDAgKi8KKworSUJNX0hBTkRMRShnZmFuLCBlYywgIkdGQU4iLAkvKiA1NzAgKi8KKwkgICAiXFxGU1BEIiwJCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworICAgICk7CQkJCS8qIGFsbCBvdGhlcnMgKi8KKworSUJNX0hBTkRMRShzZmFuLCBlYywgIlNGQU4iLAkvKiA1NzAgKi8KKwkgICAiSkZOUyIsCQkvKiA3NzB4LUpMICovCisgICAgKTsJCQkJLyogYWxsIG90aGVycyAqLworCisjZGVmaW5lIElCTV9IS0VZX0hJRAkiSUJNMDA2OCIKKyNkZWZpbmUgSUJNX1BDSV9ISUQJIlBOUDBBMDMiCiAKIHN0cnVjdCBpYm1fc3RydWN0IHsKIAljaGFyICpuYW1lOworCWNoYXIgcGFyYW1bMzJdOwogCiAJY2hhciAqaGlkOwogCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOwotCQotCWludCAgKCppbml0KSAgIChzdHJ1Y3QgaWJtX3N0cnVjdCAqKTsKLQlpbnQgICgqcmVhZCkgICAoc3RydWN0IGlibV9zdHJ1Y3QgKiwgY2hhciAqKTsKLQlpbnQgICgqd3JpdGUpICAoc3RydWN0IGlibV9zdHJ1Y3QgKiwgY2hhciAqKTsKLQl2b2lkICgqZXhpdCkgICAoc3RydWN0IGlibV9zdHJ1Y3QgKik7CiAKLQl2b2lkICgqbm90aWZ5KSAoc3RydWN0IGlibV9zdHJ1Y3QgKiwgdTMyKTsJCisJaW50ICgqaW5pdCkgKHZvaWQpOworCWludCAoKnJlYWQpIChjaGFyICopOworCWludCAoKndyaXRlKSAoY2hhciAqKTsKKwl2b2lkICgqZXhpdCkgKHZvaWQpOworCisJdm9pZCAoKm5vdGlmeSkgKHN0cnVjdCBpYm1fc3RydWN0ICosIHUzMik7CiAJYWNwaV9oYW5kbGUgKmhhbmRsZTsKIAlpbnQgdHlwZTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKQEAgLTE0MSwxNyArMjM4LDYgQEAKIAlpbnQgaW5pdF9jYWxsZWQ7CiAJaW50IG5vdGlmeV9pbnN0YWxsZWQ7CiAKLQlpbnQgc3VwcG9ydGVkOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCWludCBzdGF0dXM7Ci0JCQlpbnQgbWFzazsKLQkJfSBob3RrZXk7Ci0JCXN0cnVjdCB7Ci0JCQlpbnQgYXV0b3N3aXRjaDsKLQkJfSB2aWRlbzsKLQl9IHN0YXRlOwotCiAJaW50IGV4cGVyaW1lbnRhbDsKIH07CiAKQEAgLTE2NSwxNSArMjUxLDE1IEBACiAJCSAgICAgIHZvaWQgKnJlcywgY2hhciAqbWV0aG9kLCBjaGFyICpmbXQsIC4uLikKIHsKIAljaGFyICpmbXQwID0gZm10OwotICAgICAgICBzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlwYXJhbXM7Ci0gICAgICAgIHVuaW9uIGFjcGlfb2JqZWN0CWluX29ianNbSUJNX01BWF9BQ1BJX0FSR1NdOwotICAgICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIJcmVzdWx0OwotICAgICAgICB1bmlvbiBhY3BpX29iamVjdAlvdXRfb2JqOwotICAgICAgICBhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXZhX2xpc3QJCQlhcDsKLQljaGFyCQkJcmVzX3R5cGU7Ci0JaW50CQkJc3VjY2VzczsKLQlpbnQJCQlxdWlldDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tJQk1fTUFYX0FDUElfQVJHU107CisJc3RydWN0IGFjcGlfYnVmZmVyIHJlc3VsdCwgKnJlc3VsdHA7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdmFfbGlzdCBhcDsKKwljaGFyIHJlc190eXBlOworCWludCBzdWNjZXNzOworCWludCBxdWlldDsKIAogCWlmICghKmZtdCkgewogCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCB3aXRoIGVtcHR5IGZvcm1hdFxuIik7CkBAIC0xOTksNyArMjg1LDcgQEAKIAkJCWluX29ianNbcGFyYW1zLmNvdW50XS5pbnRlZ2VyLnZhbHVlID0gdmFfYXJnKGFwLCBpbnQpOwogCQkJaW5fb2Jqc1twYXJhbXMuY291bnQrK10udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwogCQkJYnJlYWs7Ci0JCS8qIGFkZCBtb3JlIHR5cGVzIGFzIG5lZWRlZCAqLworCQkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCAiCiAJCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIGMpOwpAQCAtMjA4LDIxICsyOTQsMjUgQEAKIAl9CiAJdmFfZW5kKGFwKTsKIAotCXJlc3VsdC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7Ci0JcmVzdWx0LnBvaW50ZXIgPSAmb3V0X29iajsKKwlpZiAocmVzX3R5cGUgIT0gJ3YnKSB7CisJCXJlc3VsdC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CisJCXJlc3VsdC5wb2ludGVyID0gJm91dF9vYmo7CisJCXJlc3VsdHAgPSAmcmVzdWx0OworCX0gZWxzZQorCQlyZXN1bHRwID0gTlVMTDsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgbWV0aG9kLCAmcGFyYW1zLCAmcmVzdWx0KTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG1ldGhvZCwgJnBhcmFtcywgcmVzdWx0cCk7CiAKIAlzd2l0Y2ggKHJlc190eXBlKSB7Ci0JY2FzZSAnZCc6CS8qIGludCAqLworCWNhc2UgJ2QnOgkJLyogaW50ICovCiAJCWlmIChyZXMpCiAJCQkqKGludCAqKXJlcyA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKIAkJc3VjY2VzcyA9IHN0YXR1cyA9PSBBRV9PSyAmJiBvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVI7CiAJCWJyZWFrOwotCWNhc2UgJ3YnOgkvKiB2b2lkICovCisJY2FzZSAndic6CQkvKiB2b2lkICovCiAJCXN1Y2Nlc3MgPSBzdGF0dXMgPT0gQUVfT0s7CiAJCWJyZWFrOwotCS8qIGFkZCBtb3JlIHR5cGVzIGFzIG5lZWRlZCAqLworCQkvKiBhZGQgbW9yZSB0eXBlcyBhcyBuZWVkZWQgKi8KIAlkZWZhdWx0OgogCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCAiCiAJCSAgICAgICAid2l0aCBpbnZhbGlkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJ1xuIiwgcmVzX3R5cGUpOwpAQCAtMjYyLDcgKzM1Miw3IEBACiAJcmV0dXJuIHN0YXJ0OwogfQogCi1zdGF0aWMgaW50IGRyaXZlcl9pbml0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgaW50IGRyaXZlcl9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKElCTV9JTkZPICIlcyB2JXNcbiIsIElCTV9ERVNDLCBJQk1fVkVSU0lPTik7CiAJcHJpbnRrKElCTV9JTkZPICIlc1xuIiwgSUJNX1VSTCk7CkBAIC0yNzAsNyArMzYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcml2ZXJfcmVhZChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpwKQorc3RhdGljIGludCBkcml2ZXJfcmVhZChjaGFyICpwKQogewogCWludCBsZW4gPSAwOwogCkBAIC0yODAsNjcgKzM3MCw3NCBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgaG90a2V5X2dldChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBpbnQgKnN0YXR1cywgaW50ICptYXNrKQorc3RhdGljIGludCBob3RrZXlfc3VwcG9ydGVkOworc3RhdGljIGludCBob3RrZXlfbWFza19zdXBwb3J0ZWQ7CitzdGF0aWMgaW50IGhvdGtleV9vcmlnX3N0YXR1czsKK3N0YXRpYyBpbnQgaG90a2V5X29yaWdfbWFzazsKKworc3RhdGljIGludCBob3RrZXlfZ2V0KGludCAqc3RhdHVzLCBpbnQgKm1hc2spCiB7CiAJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBzdGF0dXMsICJESEtDIiwgImQiKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKGlibS0+c3VwcG9ydGVkKSB7Ci0JCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgbWFzaywgIkRIS04iLCAicWQiKSkKLQkJCXJldHVybiAtRUlPOwotCX0gZWxzZSB7Ci0JCSptYXNrID0gaWJtLT5zdGF0ZS5ob3RrZXkubWFzazsKLQl9Ci0JcmV0dXJuIDA7CisJCXJldHVybiAwOworCisJaWYgKGhvdGtleV9tYXNrX3N1cHBvcnRlZCkKKwkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBtYXNrLCAiREhLTiIsICJkIikpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGhvdGtleV9zZXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgaW50IHN0YXR1cywgaW50IG1hc2spCitzdGF0aWMgaW50IGhvdGtleV9zZXQoaW50IHN0YXR1cywgaW50IG1hc2spCiB7CiAJaW50IGk7CiAKIAlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJNSEtDIiwgInZkIiwgc3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoIWlibS0+c3VwcG9ydGVkKQogCQlyZXR1cm4gMDsKIAotCWZvciAoaT0wOyBpPDMyOyBpKyspIHsKLQkJaW50IGJpdCA9ICgoMSA8PCBpKSAmIG1hc2spICE9IDA7Ci0JCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIk1IS00iLCAidmRkIiwgaSsxLCBiaXQpKQotCQkJcmV0dXJuIC1FSU87CisJaWYgKGhvdGtleV9tYXNrX3N1cHBvcnRlZCkKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCWludCBiaXQgPSAoKDEgPDwgaSkgJiBtYXNrKSAhPSAwOworCQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLAorCQkJCQlOVUxMLCAiTUhLTSIsICJ2ZGQiLCBpICsgMSwgYml0KSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X2luaXQodm9pZCkKK3sKKwkvKiBob3RrZXkgbm90IHN1cHBvcnRlZCBvbiA1NzAgKi8KKwlob3RrZXlfc3VwcG9ydGVkID0gaGtleV9oYW5kbGUgIT0gTlVMTDsKKworCWlmIChob3RrZXlfc3VwcG9ydGVkKSB7CisJCS8qIG1hc2sgbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLAorCQkgICBBMzAsIFIzMCwgUjMxLCBUMjAtMjIsIFgyMC0yMSwgWDIyLTI0ICovCisJCWhvdGtleV9tYXNrX3N1cHBvcnRlZCA9CisJCSAgICBhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiREhLTiIsICJxdiIpOworCisJCWlmICghaG90a2V5X2dldCgmaG90a2V5X29yaWdfc3RhdHVzLCAmaG90a2V5X29yaWdfbWFzaykpCisJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBob3RrZXlfaW5pdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQotewotCWludCByZXQ7Ci0KLQlpYm0tPnN1cHBvcnRlZCA9IDE7Ci0JcmV0ID0gaG90a2V5X2dldChpYm0sCi0JCQkgJmlibS0+c3RhdGUuaG90a2V5LnN0YXR1cywKLQkJCSAmaWJtLT5zdGF0ZS5ob3RrZXkubWFzayk7Ci0JaWYgKHJldCA8IDApIHsKLQkJLyogbWFzayBub3Qgc3VwcG9ydGVkIG9uIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAsIFgyMiwgWDI0ICovCi0JCWlibS0+c3VwcG9ydGVkID0gMDsKLQkJcmV0ID0gaG90a2V5X2dldChpYm0sCi0JCQkJICZpYm0tPnN0YXRlLmhvdGtleS5zdGF0dXMsCi0JCQkJICZpYm0tPnN0YXRlLmhvdGtleS5tYXNrKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQkKLQotc3RhdGljIGludCBob3RrZXlfcmVhZChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpwKQorc3RhdGljIGludCBob3RrZXlfcmVhZChjaGFyICpwKQogewogCWludCBzdGF0dXMsIG1hc2s7CiAJaW50IGxlbiA9IDA7CiAKLQlpZiAoaG90a2V5X2dldChpYm0sICZzdGF0dXMsICZtYXNrKSA8IDApCisJaWYgKCFob3RrZXlfc3VwcG9ydGVkKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmICghaG90a2V5X2dldCgmc3RhdHVzLCAmbWFzaykpCiAJCXJldHVybiAtRUlPOwogCiAJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAwKSk7Ci0JaWYgKGlibS0+c3VwcG9ydGVkKSB7CisJaWYgKGhvdGtleV9tYXNrX3N1cHBvcnRlZCkgewogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibWFzazpcdFx0MHglMDR4XG4iLCBtYXNrKTsKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwKIAkJCSAgICAgICAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGUsIHJlc2V0LCA8bWFzaz5cbiIpOwpAQCAtMzUyLDIzICs0NDksMjYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGhvdGtleV93cml0ZShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpidWYpCitzdGF0aWMgaW50IGhvdGtleV93cml0ZShjaGFyICpidWYpCiB7CiAJaW50IHN0YXR1cywgbWFzazsKIAljaGFyICpjbWQ7CiAJaW50IGRvX2NtZCA9IDA7CiAKLQlpZiAoaG90a2V5X2dldChpYm0sICZzdGF0dXMsICZtYXNrKSA8IDApCisJaWYgKCFob3RrZXlfc3VwcG9ydGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICghaG90a2V5X2dldCgmc3RhdHVzLCAmbWFzaykpCisJCXJldHVybiAtRUlPOworCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKIAkJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7CiAJCQlzdGF0dXMgPSAxOwogCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgPT0gMCkgewogCQkJc3RhdHVzID0gMDsKIAkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAicmVzZXQiKSA9PSAwKSB7Ci0JCQlzdGF0dXMgPSBpYm0tPnN0YXRlLmhvdGtleS5zdGF0dXM7Ci0JCQltYXNrICAgPSBpYm0tPnN0YXRlLmhvdGtleS5tYXNrOworCQkJc3RhdHVzID0gaG90a2V5X29yaWdfc3RhdHVzOworCQkJbWFzayA9IGhvdGtleV9vcmlnX21hc2s7CiAJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgIjB4JXgiLCAmbWFzaykgPT0gMSkgewogCQkJLyogbWFzayBzZXQgKi8KIAkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiJXgiLCAmbWFzaykgPT0gMSkgewpAQCAtMzc4LDE1ICs0NzgsMTYgQEAKIAkJZG9fY21kID0gMTsKIAl9CiAKLQlpZiAoZG9fY21kICYmIGhvdGtleV9zZXQoaWJtLCBzdGF0dXMsIG1hc2spIDwgMCkKKwlpZiAoZG9fY21kICYmICFob3RrZXlfc2V0KHN0YXR1cywgbWFzaykpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7Ci19CQorfQogCi1zdGF0aWMgdm9pZCBob3RrZXlfZXhpdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIHZvaWQgaG90a2V5X2V4aXQodm9pZCkKIHsKLQlob3RrZXlfc2V0KGlibSwgaWJtLT5zdGF0ZS5ob3RrZXkuc3RhdHVzLCBpYm0tPnN0YXRlLmhvdGtleS5tYXNrKTsKKwlpZiAoaG90a2V5X3N1cHBvcnRlZCkKKwkJaG90a2V5X3NldChob3RrZXlfb3JpZ19zdGF0dXMsIGhvdGtleV9vcmlnX21hc2spOwogfQogCiBzdGF0aWMgdm9pZCBob3RrZXlfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCkKQEAgLTM5OCwzMyArNDk5LDM4IEBACiAJZWxzZSB7CiAJCXByaW50ayhJQk1fRVJSICJ1bmtub3duIGhvdGtleSBldmVudCAlZFxuIiwgZXZlbnQpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDApOwotCX0JCisJfQogfQogCi1zdGF0aWMgaW50IGJsdWV0b290aF9pbml0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgaW50IGJsdWV0b290aF9zdXBwb3J0ZWQ7CisKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX2luaXQodm9pZCkKIHsKLQkvKiBibHVldG9vdGggbm90IHN1cHBvcnRlZCBvbiBBMjFlLCBHNDAsIFQyMCwgVDIxLCBYMjAgKi8KLQlpYm0tPnN1cHBvcnRlZCA9IGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJHQkRDIiwgInF2Iik7CisJLyogYmx1ZXRvb3RoIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkgICBHNHgsIFIzMCwgUjMxLCBSNDBlLCBSNTBlLCBUMjAtMjIsIFgyMC0yMSAqLworCWJsdWV0b290aF9zdXBwb3J0ZWQgPSBoa2V5X2hhbmRsZSAmJgorCSAgICBhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiR0JEQyIsICJxdiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3N0YXR1cyhzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCBibHVldG9vdGhfc3RhdHVzKHZvaWQpCiB7CiAJaW50IHN0YXR1czsKIAotCWlmICghaWJtLT5zdXBwb3J0ZWQgfHwgIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHQkRDIiwgImQiKSkKKwlpZiAoIWJsdWV0b290aF9zdXBwb3J0ZWQgfHwKKwkgICAgIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHQkRDIiwgImQiKSkKIAkJc3RhdHVzID0gMDsKIAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKLQlpbnQgc3RhdHVzID0gYmx1ZXRvb3RoX3N0YXR1cyhpYm0pOworCWludCBzdGF0dXMgPSBibHVldG9vdGhfc3RhdHVzKCk7CiAKLQlpZiAoIWlibS0+c3VwcG9ydGVkKQorCWlmICghYmx1ZXRvb3RoX3N1cHBvcnRlZCkKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CiAJZWxzZSBpZiAoIShzdGF0dXMgJiAxKSkKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IGluc3RhbGxlZFxuIik7CkBAIC00MzYsMTQgKzU0MiwxNCBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX3dyaXRlKGNoYXIgKmJ1ZikKIHsKLQlpbnQgc3RhdHVzID0gYmx1ZXRvb3RoX3N0YXR1cyhpYm0pOworCWludCBzdGF0dXMgPSBibHVldG9vdGhfc3RhdHVzKCk7CiAJY2hhciAqY21kOwogCWludCBkb19jbWQgPSAwOwogCi0JaWYgKCFpYm0tPnN1cHBvcnRlZCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFibHVldG9vdGhfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CiAJCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgPT0gMCkgewpAQCAtNDU2LDY0ICs1NjIsMTY2IEBACiAJfQogCiAJaWYgKGRvX2NtZCAmJiAhYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIlNCREMiLCAidmQiLCBzdGF0dXMpKQotCSAgICByZXR1cm4gLUVJTzsKKwkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWRlb19pbml0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCitzdGF0aWMgaW50IHZpZGVvX3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgdmlkZW9fb3JpZ19hdXRvc3c7CisKKyNkZWZpbmUgVklERU9fNTcwIDEKKyNkZWZpbmUgVklERU9fNzcwIDIKKyNkZWZpbmUgVklERU9fTkVXIDMKKworc3RhdGljIGludCB2aWRlb19pbml0KHZvaWQpCiB7Ci0JaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsCi0JCQkmaWJtLT5zdGF0ZS52aWRlby5hdXRvc3dpdGNoLCAiXlZERUUiLCAiZCIpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpbnQgaXZnYTsKKworCWlmICh2aWQyX2hhbmRsZSAmJiBhY3BpX2V2YWxmKE5VTEwsICZpdmdhLCAiXFxJVkdBIiwgImQiKSAmJiBpdmdhKQorCQkvKiBHNDEsIGFzc3VtZSBJVkdBIGRvZXNuJ3QgY2hhbmdlICovCisJCXZpZF9oYW5kbGUgPSB2aWQyX2hhbmRsZTsKKworCWlmICghdmlkX2hhbmRsZSkKKwkJLyogdmlkZW8gc3dpdGNoaW5nIG5vdCBzdXBwb3J0ZWQgb24gUjMwLCBSMzEgKi8KKwkJdmlkZW9fc3VwcG9ydGVkID0gMDsKKwllbHNlIGlmIChhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZ2aWRlb19vcmlnX2F1dG9zdywgIlNXSVQiLCAicWQiKSkKKwkJLyogNTcwICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IFZJREVPXzU3MDsKKwllbHNlIGlmIChhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZ2aWRlb19vcmlnX2F1dG9zdywgIl5WQURMIiwgInFkIikpCisJCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQl2aWRlb19zdXBwb3J0ZWQgPSBWSURFT183NzA7CisJZWxzZQorCQkvKiBhbGwgb3RoZXJzICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IFZJREVPX05FVzsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGVvX3N0YXR1cyhzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCB2aWRlb19zdGF0dXModm9pZCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgaTsKIAotCWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDEpOwotCWlmIChhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RDIiwgImQiKSkKLQkJc3RhdHVzIHw9IDB4MDIgKiBpOworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNTcwKSB7CisJCWlmIChhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxfU0IuUEhTIiwgImRkIiwgMHg4NykpCisJCQlzdGF0dXMgPSBpICYgMzsKKwl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT183NzApIHsKKwkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQorCQkJc3RhdHVzIHw9IDB4MDEgKiBpOworCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCisJCQlzdGF0dXMgfD0gMHgwMiAqIGk7CisJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXKSB7CisJCWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDEpOworCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCisJCQlzdGF0dXMgfD0gMHgwMiAqIGk7CiAKLQlhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAwKTsKLQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNETCIsICJkIikpCi0JCXN0YXR1cyB8PSAweDAxICogaTsKLQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNERCIsICJkIikpCi0JCXN0YXR1cyB8PSAweDA4ICogaTsKLQotCWlmIChhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZpLCAiXlZERUUiLCAiZCIpKQotCQlzdGF0dXMgfD0gMHgxMCAqIChpICYgMSk7CisJCWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDApOworCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNETCIsICJkIikpCisJCQlzdGF0dXMgfD0gMHgwMSAqIGk7CisJCWlmIChhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0REIiwgImQiKSkKKwkJCXN0YXR1cyB8PSAweDA4ICogaTsKKwl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IHZpZGVvX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3KHZvaWQpCiB7Ci0JaW50IHN0YXR1cyA9IHZpZGVvX3N0YXR1cyhpYm0pOworCWludCBhdXRvc3cgPSAwOworCisJaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT181NzApCisJCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJmF1dG9zdywgIlNXSVQiLCAiZCIpOworCWVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT183NzAgfHwgdmlkZW9fc3VwcG9ydGVkID09IFZJREVPX05FVykKKwkJYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmYXV0b3N3LCAiXlZERUUiLCAiZCIpOworCisJcmV0dXJuIGF1dG9zdyAmIDE7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fcmVhZChjaGFyICpwKQoreworCWludCBzdGF0dXMgPSB2aWRlb19zdGF0dXMoKTsKKwlpbnQgYXV0b3N3ID0gdmlkZW9fYXV0b3N3KCk7CiAJaW50IGxlbiA9IDA7CiAKKwlpZiAoIXZpZGVvX3N1cHBvcnRlZCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOwogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsY2Q6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMCkpOwogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjcnQ6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMSkpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJkdmk6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMykpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJhdXRvOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDQpKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsY2RfZW5hYmxlLCBsY2RfZGlzYWJsZSwgIgotCQkgICAgICAgImNydF9lbmFibGUsIGNydF9kaXNhYmxlXG4iKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRkdmlfZW5hYmxlLCBkdmlfZGlzYWJsZSwgIgotCQkgICAgICAgImF1dG9fZW5hYmxlLCBhdXRvX2Rpc2FibGVcbiIpOworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiZHZpOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDMpKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiYXV0bzpcdFx0JXNcbiIsIGVuYWJsZWQoYXV0b3N3LCAwKSk7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGNkX2VuYWJsZSwgbGNkX2Rpc2FibGVcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGNydF9lbmFibGUsIGNydF9kaXNhYmxlXG4iKTsKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPX05FVykKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZHZpX2VuYWJsZSwgZHZpX2Rpc2FibGVcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGF1dG9fZW5hYmxlLCBhdXRvX2Rpc2FibGVcbiIpOwogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHZpZGVvX3N3aXRjaCwgZXhwYW5kX3RvZ2dsZVxuIik7CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IHZpZGVvX3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgdmlkZW9fc3dpdGNoKHZvaWQpCit7CisJaW50IGF1dG9zdyA9IHZpZGVvX2F1dG9zdygpOworCWludCByZXQ7CisKKwlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAxKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0ID0gdmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzU3MCA/CisJICAgIGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNiIsICJ2IikgOgorCSAgICBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWU1dUIiwgInYiKTsKKwlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgYXV0b3N3KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fZXhwYW5kKHZvaWQpCit7CisJaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT181NzApCisJCXJldHVybiBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIl9RMTciLCAidiIpOworCWVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT183NzApCisJCXJldHVybiBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWRVhQIiwgInYiKTsKKwllbHNlCisJCXJldHVybiBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZFWFAiLCAidiIpOworfQorCitzdGF0aWMgaW50IHZpZGVvX3N3aXRjaDIoaW50IHN0YXR1cykKK3sKKwlpbnQgcmV0OworCisJaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT181NzApIHsKKwkJcmV0ID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLAorCQkJCSAiXFxfU0IuUEhTMiIsICJ2ZGQiLCAweDhiLCBzdGF0dXMgfCAweDgwKTsKKwl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT183NzApIHsKKwkJaW50IGF1dG9zdyA9IHZpZGVvX2F1dG9zdygpOworCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAxKSkKKwkJCXJldHVybiAtRUlPOworCisJCXJldCA9IGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwKKwkJCQkgIkFTV1QiLCAidmRkIiwgc3RhdHVzICogMHgxMDAsIDApOworCisJCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCBhdXRvc3cpOworCX0gZWxzZSB7CisJCXJldCA9IGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDB4ODApICYmCisJCSAgICBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZTRFMiLCAidmRkIiwgc3RhdHVzLCAxKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpZGVvX3dyaXRlKGNoYXIgKmJ1ZikKIHsKIAljaGFyICpjbWQ7CiAJaW50IGVuYWJsZSwgZGlzYWJsZSwgc3RhdHVzOwogCisJaWYgKCF2aWRlb19zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJZW5hYmxlID0gZGlzYWJsZSA9IDA7CiAKIAl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewpAQCAtNTI1LDkgKzczMywxMSBAQAogCQkJZW5hYmxlIHw9IDB4MDI7CiAJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImNydF9kaXNhYmxlIikgPT0gMCkgewogCQkJZGlzYWJsZSB8PSAweDAyOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkdmlfZW5hYmxlIikgPT0gMCkgeworCQl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT19ORVcgJiYKKwkJCSAgIHN0cmxlbmNtcChjbWQsICJkdmlfZW5hYmxlIikgPT0gMCkgewogCQkJZW5hYmxlIHw9IDB4MDg7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImR2aV9kaXNhYmxlIikgPT0gMCkgeworCQl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT19ORVcgJiYKKwkJCSAgIHN0cmxlbmNtcChjbWQsICJkdmlfZGlzYWJsZSIpID09IDApIHsKIAkJCWRpc2FibGUgfD0gMHgwODsKIAkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiYXV0b19lbmFibGUiKSA9PSAwKSB7CiAJCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAxKSkKQEAgLTUzNiw3MSArNzQ2LDc1IEBACiAJCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAwKSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAidmlkZW9fc3dpdGNoIikgPT0gMCkgewotCQkJaW50IGF1dG9zd2l0Y2g7Ci0JCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJmF1dG9zd2l0Y2gsICJeVkRFRSIsICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAxKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiVlNXVCIsICJ2IikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLAotCQkJCQlhdXRvc3dpdGNoKSkKKwkJCWlmICghdmlkZW9fc3dpdGNoKCkpCiAJCQkJcmV0dXJuIC1FSU87CiAJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImV4cGFuZF90b2dnbGUiKSA9PSAwKSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVkVYUCIsICJ2IikpCisJCQlpZiAoIXZpZGVvX2V4cGFuZCgpKQogCQkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChlbmFibGUgfHwgZGlzYWJsZSkgewotCQlzdGF0dXMgPSAodmlkZW9fc3RhdHVzKGlibSkgJiAweDBmICYgfmRpc2FibGUpIHwgZW5hYmxlOwotCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDB4ODApKQotCQkJcmV0dXJuIC1FSU87Ci0JCWlmICghYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWU0RTIiwgInZkZCIsIHN0YXR1cywgMSkpCisJCXN0YXR1cyA9ICh2aWRlb19zdGF0dXMoKSAmIDB4MGYgJiB+ZGlzYWJsZSkgfCBlbmFibGU7CisJCWlmICghdmlkZW9fc3dpdGNoMihzdGF0dXMpKQogCQkJcmV0dXJuIC1FSU87CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZpZGVvX2V4aXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyB2b2lkIHZpZGVvX2V4aXQodm9pZCkKIHsKLQlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwKLQkJICAgaWJtLT5zdGF0ZS52aWRlby5hdXRvc3dpdGNoKTsKKwlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgdmlkZW9fb3JpZ19hdXRvc3cpOwogfQogCi1zdGF0aWMgaW50IGxpZ2h0X2luaXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgbGlnaHRfc3VwcG9ydGVkOworc3RhdGljIGludCBsaWdodF9zdGF0dXNfc3VwcG9ydGVkOworCitzdGF0aWMgaW50IGxpZ2h0X2luaXQodm9pZCkKIHsKLQkvKiBrYmx0IG5vdCBzdXBwb3J0ZWQgb24gRzQwLCBSMzIsIFgyMCAqLwotCWlibS0+c3VwcG9ydGVkID0gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJLQkxUIiwgInF2Iik7CisJLyogbGlnaHQgbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgRzR4LCBSMzAsIFIzMSAqLworCWxpZ2h0X3N1cHBvcnRlZCA9IChjbW9zX2hhbmRsZSB8fCBsZ2h0X2hhbmRsZSkgJiYgIWxlZGJfaGFuZGxlOworCisJaWYgKGxpZ2h0X3N1cHBvcnRlZCkKKwkJLyogbGlnaHQgc3RhdHVzIG5vdCBzdXBwb3J0ZWQgb24KKwkJICAgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEc0eCwgUjMwLCBSMzEsIFIzMiwgWDIwICovCisJCWxpZ2h0X3N0YXR1c19zdXBwb3J0ZWQgPSBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwKKwkJCQkJCSAgICAiS0JMVCIsICJxdiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbGlnaHRfcmVhZChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpwKQorc3RhdGljIGludCBsaWdodF9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlpZiAoaWJtLT5zdXBwb3J0ZWQpIHsKKwlpZiAoIWxpZ2h0X3N1cHBvcnRlZCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwl9IGVsc2UgaWYgKCFsaWdodF9zdGF0dXNfc3VwcG9ydGVkKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVua25vd25cbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwl9IGVsc2UgewogCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmc3RhdHVzLCAiS0JMVCIsICJkIikpCiAJCQlyZXR1cm4gLUVJTzsKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIG9ub2ZmKHN0YXR1cywgMCkpOwotCX0gZWxzZQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bmtub3duXG4iKTsKLQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdG9uLCBvZmZcbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwl9CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGxpZ2h0X3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbGlnaHRfd3JpdGUoY2hhciAqYnVmKQogewogCWludCBjbW9zX2NtZCwgbGdodF9jbWQ7CiAJY2hhciAqY21kOwogCWludCBzdWNjZXNzOwotCQorCisJaWYgKCFsaWdodF9zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKIAkJaWYgKHN0cmxlbmNtcChjbWQsICJvbiIpID09IDApIHsKIAkJCWNtb3NfY21kID0gMHgwYzsKQEAgLTYxMCwxMCArODI0LDEwIEBACiAJCQlsZ2h0X2NtZCA9IDA7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQorCiAJCXN1Y2Nlc3MgPSBjbW9zX2hhbmRsZSA/Ci0JCQlhY3BpX2V2YWxmKGNtb3NfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBjbW9zX2NtZCkgOgotCQkJYWNwaV9ldmFsZihsZ2h0X2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgbGdodF9jbWQpOworCQkgICAgYWNwaV9ldmFsZihjbW9zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgY21vc19jbWQpIDoKKwkJICAgIGFjcGlfZXZhbGYobGdodF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGxnaHRfY21kKTsKIAkJaWYgKCFzdWNjZXNzKQogCQkJcmV0dXJuIC1FSU87CiAJfQpAQCAtNjMzLDcgKzg0Nyw3IEBACiAKICNkZWZpbmUgZG9ja19kb2NrZWQoKSAoX3N0YShkb2NrX2hhbmRsZSkgJiAxKQogCi1zdGF0aWMgaW50IGRvY2tfcmVhZChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpwKQorc3RhdGljIGludCBkb2NrX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKIAlpbnQgZG9ja2VkID0gZG9ja19kb2NrZWQoKTsKQEAgLTY1MCwxOCArODY0LDE3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBkb2NrX3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgZG9ja193cml0ZShjaGFyICpidWYpCiB7CiAJY2hhciAqY21kOwogCiAJaWYgKCFkb2NrX2RvY2tlZCgpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewogCQlpZiAoc3RybGVuY21wKGNtZCwgInVuZG9jayIpID09IDApIHsKLQkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAwKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9FSjAiLCAidmQiLCAxKSkKKwkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAwKSB8fAorCQkJICAgICFhY3BpX2V2YWxmKGRvY2tfaGFuZGxlLCBOVUxMLCAiX0VKMCIsICJ2ZCIsIDEpKQogCQkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkb2NrIikgPT0gMCkgewogCQkJaWYgKCFhY3BpX2V2YWxmKGRvY2tfaGFuZGxlLCBOVUxMLCAiX0RDSyIsICJ2ZCIsIDEpKQpAQCAtNjcxLDkwICs4ODQsMTMxIEBACiAJfQogCiAJcmV0dXJuIDA7Ci19CQorfQogCiBzdGF0aWMgdm9pZCBkb2NrX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCiB7CiAJaW50IGRvY2tlZCA9IGRvY2tfZG9ja2VkKCk7CisJaW50IHBjaSA9IGlibS0+aGlkICYmIHN0cnN0cihpYm0tPmhpZCwgSUJNX1BDSV9ISUQpOwogCi0JaWYgKGV2ZW50ID09IDMgJiYgZG9ja2VkKQotCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDEpOyAvKiBidXR0b24gKi8KKwlpZiAoZXZlbnQgPT0gMSAmJiAhcGNpKQkvKiA1NzAgKi8KKwkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAxKTsJLyogYnV0dG9uICovCisJZWxzZSBpZiAoZXZlbnQgPT0gMSAmJiBwY2kpCS8qIDU3MCAqLworCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDMpOwkvKiBkb2NrICovCisJZWxzZSBpZiAoZXZlbnQgPT0gMyAmJiBkb2NrZWQpCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMSk7CS8qIGJ1dHRvbiAqLwogCWVsc2UgaWYgKGV2ZW50ID09IDMgJiYgIWRvY2tlZCkKLQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAyKTsgLyogdW5kb2NrICovCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMik7CS8qIHVuZG9jayAqLwogCWVsc2UgaWYgKGV2ZW50ID09IDAgJiYgZG9ja2VkKQotCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDMpOyAvKiBkb2NrICovCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMyk7CS8qIGRvY2sgKi8KIAllbHNlIHsKIAkJcHJpbnRrKElCTV9FUlIgInVua25vd24gZG9jayBldmVudCAlZCwgc3RhdHVzICVkXG4iLAogCQkgICAgICAgZXZlbnQsIF9zdGEoZG9ja19oYW5kbGUpKTsKLQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsgLyogdW5rbm93biAqLworCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDApOwkvKiB1bmtub3duICovCiAJfQogfQogCi0jZGVmaW5lIGJheV9vY2N1cGllZCgpIChfc3RhKGJheV9oYW5kbGUpICYgMSkKK3N0YXRpYyBpbnQgYmF5X3N0YXR1c19zdXBwb3J0ZWQ7CitzdGF0aWMgaW50IGJheV9zdGF0dXMyX3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgYmF5X2VqZWN0X3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgYmF5X2VqZWN0Ml9zdXBwb3J0ZWQ7CiAKLXN0YXRpYyBpbnQgYmF5X2luaXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgYmF5X2luaXQodm9pZCkKIHsKLQkvKiBiYXkgbm90IHN1cHBvcnRlZCBvbiBBMjFlLCBBMjJwLCBBMzEsIEEzMXAsIEc0MCwgUjMyLCBSNDBlICovCi0JaWJtLT5zdXBwb3J0ZWQgPSBiYXlfaGFuZGxlICYmIGJheWVqX2hhbmRsZSAmJgotCQlhY3BpX2V2YWxmKGJheV9oYW5kbGUsIE5VTEwsICJfU1RBIiwgInF2Iik7CisJYmF5X3N0YXR1c19zdXBwb3J0ZWQgPSBiYXlfaGFuZGxlICYmCisJICAgIGFjcGlfZXZhbGYoYmF5X2hhbmRsZSwgTlVMTCwgIl9TVEEiLCAicXYiKTsKKwliYXlfc3RhdHVzMl9zdXBwb3J0ZWQgPSBiYXkyX2hhbmRsZSAmJgorCSAgICBhY3BpX2V2YWxmKGJheTJfaGFuZGxlLCBOVUxMLCAiX1NUQSIsICJxdiIpOworCisJYmF5X2VqZWN0X3N1cHBvcnRlZCA9IGJheV9oYW5kbGUgJiYgYmF5X2VqX2hhbmRsZSAmJgorCSAgICAoc3RybGVuY21wKGJheV9lal9wYXRoLCAiX0VKMCIpID09IDAgfHwgZXhwZXJpbWVudGFsKTsKKwliYXlfZWplY3QyX3N1cHBvcnRlZCA9IGJheTJfaGFuZGxlICYmIGJheTJfZWpfaGFuZGxlICYmCisJICAgIChzdHJsZW5jbXAoYmF5Ml9lal9wYXRoLCAiX0VKMCIpID09IDAgfHwgZXhwZXJpbWVudGFsKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJheV9yZWFkKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKnApCisjZGVmaW5lIGJheV9vY2N1cGllZChiKSAoX3N0YShiIyNfaGFuZGxlKSAmIDEpCisKK3N0YXRpYyBpbnQgYmF5X3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKLQlpbnQgb2NjdXBpZWQgPSBiYXlfb2NjdXBpZWQoKTsKLQkKLQlpZiAoIWlibS0+c3VwcG9ydGVkKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQllbHNlIGlmICghb2NjdXBpZWQpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVub2NjdXBpZWRcbiIpOwotCWVsc2UgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRvY2N1cGllZFxuIik7CisJaW50IG9jY3VwaWVkID0gYmF5X29jY3VwaWVkKGJheSk7CisJaW50IG9jY3VwaWVkMiA9IGJheV9vY2N1cGllZChiYXkyKTsKKwlpbnQgZWplY3QsIGVqZWN0MjsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLCBiYXlfc3RhdHVzX3N1cHBvcnRlZCA/CisJCSAgICAgICAob2NjdXBpZWQgPyAib2NjdXBpZWQiIDogInVub2NjdXBpZWQiKSA6CisJCSAgICAgICAibm90IHN1cHBvcnRlZCIpOworCWlmIChiYXlfc3RhdHVzMl9zdXBwb3J0ZWQpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXMyOlx0JXNcbiIsIG9jY3VwaWVkMiA/CisJCQkgICAgICAgIm9jY3VwaWVkIiA6ICJ1bm9jY3VwaWVkIik7CisKKwllamVjdCA9IGJheV9lamVjdF9zdXBwb3J0ZWQgJiYgb2NjdXBpZWQ7CisJZWplY3QyID0gYmF5X2VqZWN0Ml9zdXBwb3J0ZWQgJiYgb2NjdXBpZWQyOworCisJaWYgKGVqZWN0ICYmIGVqZWN0MikKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZWplY3QsIGVqZWN0MlxuIik7CisJZWxzZSBpZiAoZWplY3QpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0XG4iKTsKLQl9CisJZWxzZSBpZiAoZWplY3QyKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdDJcbiIpOwogCiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBiYXlfd3JpdGUoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqYnVmKQorc3RhdGljIGludCBiYXlfd3JpdGUoY2hhciAqYnVmKQogewogCWNoYXIgKmNtZDsKIAorCWlmICghYmF5X2VqZWN0X3N1cHBvcnRlZCAmJiAhYmF5X2VqZWN0Ml9zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJlamVjdCIpID09IDApIHsKLQkJCWlmICghaWJtLT5zdXBwb3J0ZWQgfHwKLQkJCSAgICAhYWNwaV9ldmFsZihiYXlfaGFuZGxlLCBOVUxMLCAiX0VKMCIsICJ2ZCIsIDEpKQorCQlpZiAoYmF5X2VqZWN0X3N1cHBvcnRlZCAmJiBzdHJsZW5jbXAoY21kLCAiZWplY3QiKSA9PSAwKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoYmF5X2VqX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgMSkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAoYmF5X2VqZWN0Ml9zdXBwb3J0ZWQgJiYKKwkJCSAgIHN0cmxlbmNtcChjbWQsICJlamVjdDIiKSA9PSAwKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoYmF5Ml9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQogCQkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwotfQkKK30KIAogc3RhdGljIHZvaWQgYmF5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCiB7CiAJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsKIH0KIAotc3RhdGljIGludCBjbW9zX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK3N0YXRpYyBpbnQgY21vc19yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7CiAKLQkvKiBjbW9zIG5vdCBzdXBwb3J0ZWQgb24gQTIxZSwgQTIycCwgVDIwLCBUMjEsIFgyMCAqLworCS8qIGNtb3Mgbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLAorCSAgIFIzMCwgUjMxLCBUMjAtMjIsIFgyMC0yMSAqLwogCWlmICghY21vc19oYW5kbGUpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwogCWVsc2UgewogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQ8aW50PlxuIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDxjbWQ+ICg8Y21kPiBpcyAwLTIxKVxuIik7CiAJfQogCiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBjbW9zX3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgY21vc19ldmFsKGludCBjbW9zX2NtZCkKK3sKKwlpZiAoY21vc19oYW5kbGUpCisJCXJldHVybiBhY3BpX2V2YWxmKGNtb3NfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBjbW9zX2NtZCk7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbW9zX3dyaXRlKGNoYXIgKmJ1ZikKIHsKIAljaGFyICpjbWQ7CiAJaW50IGNtb3NfY21kOwpAQCAtNzYzLDE4MyArMTAxNyw2NDQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmNtb3NfY21kKSA9PSAxKSB7CisJCWlmIChzc2NhbmYoY21kLCAiJXUiLCAmY21vc19jbWQpID09IDEgJiYKKwkJICAgIGNtb3NfY21kID49IDAgJiYgY21vc19jbWQgPD0gMjEpIHsKIAkJCS8qIGNtb3NfY21kIHNldCAqLwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICghYWNwaV9ldmFsZihjbW9zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgY21vc19jbWQpKQorCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlyZXR1cm4gMDsKLX0JCi0JCQotc3RhdGljIGludCBsZWRfcmVhZChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCBjaGFyICpwKQorfQorCitzdGF0aWMgaW50IGxlZF9zdXBwb3J0ZWQ7CisKKyNkZWZpbmUgTEVEXzU3MCAxCisjZGVmaW5lIExFRF9PTEQgMgorI2RlZmluZSBMRURfTkVXIDMKKworc3RhdGljIGludCBsZWRfaW5pdCh2b2lkKQoreworCWlmICghbGVkX2hhbmRsZSkKKwkJLyogbGVkIG5vdCBzdXBwb3J0ZWQgb24gUjMwLCBSMzEgKi8KKwkJbGVkX3N1cHBvcnRlZCA9IDA7CisJZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU0xFRCIpID09IDApCisJCS8qIDU3MCAqLworCQlsZWRfc3VwcG9ydGVkID0gTEVEXzU3MDsKKwllbHNlIGlmIChzdHJsZW5jbXAobGVkX3BhdGgsICJTWVNMIikgPT0gMCkKKwkJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCisJCWxlZF9zdXBwb3J0ZWQgPSBMRURfT0xEOworCWVsc2UKKwkJLyogYWxsIG90aGVycyAqLworCQlsZWRfc3VwcG9ydGVkID0gTEVEX05FVzsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIGxlZF9zdGF0dXMocykgKChzKSA9PSAwID8gIm9mZiIgOiAoKHMpID09IDEgPyAib24iIDogImJsaW5raW5nIikpCisKK3N0YXRpYyBpbnQgbGVkX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKIAorCWlmICghbGVkX3N1cHBvcnRlZCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKKworCWlmIChsZWRfc3VwcG9ydGVkID09IExFRF81NzApIHsKKwkJLyogNTcwICovCisJCWludCBpLCBzdGF0dXM7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmICghYWNwaV9ldmFsZihlY19oYW5kbGUsCisJCQkJCSZzdGF0dXMsICJHTEVEIiwgImRkIiwgMSA8PCBpKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZDpcdFx0JXNcbiIsCisJCQkJICAgICAgIGksIGxlZF9zdGF0dXMoc3RhdHVzKSk7CisJCX0KKwl9CisKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQiCi0JCSAgICAgICAiPGludD4gb24sIDxpbnQ+IG9mZiwgPGludD4gYmxpbmtcbiIpOworCQkgICAgICAgIjxsZWQ+IG9uLCA8bGVkPiBvZmYsIDxsZWQ+IGJsaW5rICg8bGVkPiBpcyAwLTcpXG4iKTsKIAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgbGVkX3dyaXRlKHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIGNoYXIgKmJ1ZikKKy8qIG9mZiwgb24sIGJsaW5rICovCitzdGF0aWMgY29uc3QgaW50IGxlZF9zbGVkX2FyZzFbXSA9IHsgMCwgMSwgMyB9Oworc3RhdGljIGNvbnN0IGludCBsZWRfZXhwX2hsYmxbXSA9IHsgMCwgMCwgMSB9OwkvKiBsZWQjICogKi8KK3N0YXRpYyBjb25zdCBpbnQgbGVkX2V4cF9obGNsW10gPSB7IDAsIDEsIDEgfTsJLyogbGVkIyAqICovCitzdGF0aWMgY29uc3QgaW50IGxlZF9sZWRfYXJnMVtdID0geyAwLCAweDgwLCAweGMwIH07CisKKyNkZWZpbmUgRUNfSExDTCAweDBjCisjZGVmaW5lIEVDX0hMQkwgMHgwZAorI2RlZmluZSBFQ19ITE1TIDB4MGUKKworc3RhdGljIGludCBsZWRfd3JpdGUoY2hhciAqYnVmKQogewogCWNoYXIgKmNtZDsKLQl1bnNpZ25lZCBpbnQgbGVkOwotCWludCBsZWRfY21kLCBzeXNsX2NtZCwgYmxlZF9hLCBibGVkX2I7CisJaW50IGxlZCwgaW5kLCByZXQ7CisKKwlpZiAoIWxlZF9zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PREVWOwogCiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHNzY2FuZihjbWQsICIldSIsICZsZWQpICE9IDEpCisJCWlmIChzc2NhbmYoY21kLCAiJWQiLCAmbGVkKSAhPSAxIHx8IGxlZCA8IDAgfHwgbGVkID4gNykKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChzdHJzdHIoY21kLCAiYmxpbmsiKSkgewotCQkJbGVkX2NtZCA9IDB4YzA7Ci0JCQlzeXNsX2NtZCA9IDI7Ci0JCQlibGVkX2EgPSAyOwotCQkJYmxlZF9iID0gMTsKKwkJaWYgKHN0cnN0cihjbWQsICJvZmYiKSkgeworCQkJaW5kID0gMDsKIAkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAib24iKSkgewotCQkJbGVkX2NtZCA9IDB4ODA7Ci0JCQlzeXNsX2NtZCA9IDE7Ci0JCQlibGVkX2EgPSAyOwotCQkJYmxlZF9iID0gMDsKLQkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAib2ZmIikpIHsKLQkJCWxlZF9jbWQgPSBzeXNsX2NtZCA9IGJsZWRfYSA9IGJsZWRfYiA9IDA7CisJCQlpbmQgPSAxOworCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJibGluayIpKSB7CisJCQlpbmQgPSAyOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwotCQkKLQkJaWYgKGxlZF9oYW5kbGUpIHsKKworCQlpZiAobGVkX3N1cHBvcnRlZCA9PSBMRURfNTcwKSB7CisJCQkvKiA1NzAgKi8KKwkJCWxlZCA9IDEgPDwgbGVkOwogCQkJaWYgKCFhY3BpX2V2YWxmKGxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAotCQkJCQlsZWQsIGxlZF9jbWQpKQorCQkJCQlsZWQsIGxlZF9zbGVkX2FyZzFbaW5kXSkpCiAJCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAobGVkIDwgMikgewotCQkJaWYgKGFjcGlfZXZhbGYoc3lzbF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAotCQkJCSAgICAgICBsZWQsIHN5c2xfY21kKSkKKwkJfSBlbHNlIGlmIChsZWRfc3VwcG9ydGVkID09IExFRF9PTEQpIHsKKwkJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMCAqLworCQkJbGVkID0gMSA8PCBsZWQ7CisJCQlyZXQgPSBlY193cml0ZShFQ19ITE1TLCBsZWQpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCA9CisJCQkJICAgIGVjX3dyaXRlKEVDX0hMQkwsIGxlZCAqIGxlZF9leHBfaGxibFtpbmRdKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXQgPQorCQkJCSAgICBlY193cml0ZShFQ19ITENMLCBsZWQgKiBsZWRfZXhwX2hsY2xbaW5kXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJLyogYWxsIG90aGVycyAqLworCQkJaWYgKCFhY3BpX2V2YWxmKGxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAorCQkJCQlsZWQsIGxlZF9sZWRfYXJnMVtpbmRdKSkKIAkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlIGlmIChsZWQgPT0gMiAmJiBibGVkX2hhbmRsZSkgewotCQkJaWYgKGFjcGlfZXZhbGYoYmxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAotCQkJCSAgICAgICBibGVkX2EsIGJsZWRfYikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKLX0JCi0JCQotc3RhdGljIGludCBiZWVwX3JlYWQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqcCkKK30KKworc3RhdGljIGludCBiZWVwX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKIAotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDxpbnQ+XG4iKTsKKwlpZiAoIWJlZXBfaGFuZGxlKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0PGNtZD4gKDxjbWQ+IGlzIDAtMTcpXG4iKTsKKwl9CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGJlZXBfd3JpdGUoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgY2hhciAqYnVmKQorc3RhdGljIGludCBiZWVwX3dyaXRlKGNoYXIgKmJ1ZikKIHsKIAljaGFyICpjbWQ7CiAJaW50IGJlZXBfY21kOwogCisJaWYgKCFiZWVwX2hhbmRsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmJlZXBfY21kKSA9PSAxKSB7CisJCWlmIChzc2NhbmYoY21kLCAiJXUiLCAmYmVlcF9jbWQpID09IDEgJiYKKwkJICAgIGJlZXBfY21kID49IDAgJiYgYmVlcF9jbWQgPD0gMTcpIHsKIAkJCS8qIGJlZXBfY21kIHNldCAqLwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmICghYWNwaV9ldmFsZihiZWVwX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgYmVlcF9jbWQpKQorCQlpZiAoIWFjcGlfZXZhbGYoYmVlcF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLCBiZWVwX2NtZCwgMCkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlyZXR1cm4gMDsKLX0JCi0JCQorfQorCitzdGF0aWMgaW50IGFjcGlfZWNfcmVhZChpbnQgaSwgdTggKiBwKQoreworCWludCB2OworCisJaWYgKGVjcmRfaGFuZGxlKSB7CisJCWlmICghYWNwaV9ldmFsZihlY3JkX2hhbmRsZSwgJnYsIE5VTEwsICJkZCIsIGkpKQorCQkJcmV0dXJuIDA7CisJCSpwID0gdjsKKwl9IGVsc2UgeworCQlpZiAoZWNfcmVhZChpLCBwKSA8IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3dyaXRlKGludCBpLCB1OCB2KQoreworCWlmIChlY3dyX2hhbmRsZSkgeworCQlpZiAoIWFjcGlfZXZhbGYoZWN3cl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLCBpLCB2KSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChlY193cml0ZShpLCB2KSA8IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0aGVybWFsX3RtcF9zdXBwb3J0ZWQ7CitzdGF0aWMgaW50IHRoZXJtYWxfdXBkdF9zdXBwb3J0ZWQ7CisKK3N0YXRpYyBpbnQgdGhlcm1hbF9pbml0KHZvaWQpCit7CisJLyogdGVtcGVyYXR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCBHNHgsIFIzMCwgUjMxLCBSMzIgKi8KKwl0aGVybWFsX3RtcF9zdXBwb3J0ZWQgPSBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlRNUDciLCAicXYiKTsKKworCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCXRoZXJtYWxfdXBkdF9zdXBwb3J0ZWQgPSBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAicXYiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRoZXJtYWxfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCisJaWYgKCF0aGVybWFsX3RtcF9zdXBwb3J0ZWQpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJ0ZW1wZXJhdHVyZXM6XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJaW50IGksIHQ7CisJCWNoYXIgdG1waVtdID0gIlRNUGkiOworCQlzOCB0bXBbOF07CisKKwkJaWYgKHRoZXJtYWxfdXBkdF9zdXBwb3J0ZWQpCisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVVBEVCIsICJ2IikpCisJCQkJcmV0dXJuIC1FSU87CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJdG1waVszXSA9ICcwJyArIGk7CisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmdCwgdG1waSwgImQiKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmICh0aGVybWFsX3VwZHRfc3VwcG9ydGVkKQorCQkJCXRtcFtpXSA9ICh0IC0gMjczMiArIDUpIC8gMTA7CisJCQllbHNlCisJCQkJdG1wW2ldID0gdDsKKwkJfQorCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sCisJCQkgICAgICAgInRlbXBlcmF0dXJlczpcdCVkICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkJICAgICAgIHRtcFswXSwgdG1wWzFdLCB0bXBbMl0sIHRtcFszXSwKKwkJCSAgICAgICB0bXBbNF0sIHRtcFs1XSwgdG1wWzZdLCB0bXBbN10pOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB1OCBlY2R1bXBfcmVnc1syNTZdOworCitzdGF0aWMgaW50IGVjZHVtcF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IGksIGo7CisJdTggdjsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJFQyAgICAgICIKKwkJICAgICAgICIgKzAwICswMSArMDIgKzAzICswNCArMDUgKzA2ICswNyIKKwkJICAgICAgICIgKzA4ICswOSArMGEgKzBiICswYyArMGQgKzBlICswZlxuIik7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSAxNikgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiRUMgMHglMDJ4OiIsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJaWYgKCFhY3BpX2VjX3JlYWQoaSArIGosICZ2KSkKKwkJCQlicmVhazsKKwkJCWlmICh2ICE9IGVjZHVtcF9yZWdzW2kgKyBqXSkKKwkJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiIColMDJ4Iiwgdik7CisJCQllbHNlCisJCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAgJTAyeCIsIHYpOworCQkJZWNkdW1wX3JlZ3NbaSArIGpdID0gdjsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiXG4iKTsKKwkJaWYgKGogIT0gMTYpCisJCQlicmVhazsKKwl9CisKKwkvKiBUaGVzZSBhcmUgd2F5IHRvbyBkYW5nZXJvdXMgdG8gYWR2ZXJ0aXNlIG9wZW5seS4uLiAqLworI2lmIDAKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQweDxvZmZzZXQ+IDB4PHZhbHVlPiIKKwkJICAgICAgICIgKDxvZmZzZXQ+IGlzIDAwLWZmLCA8dmFsdWU+IGlzIDAwLWZmKVxuIik7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0MHg8b2Zmc2V0PiA8dmFsdWU+ICAiCisJCSAgICAgICAiICg8b2Zmc2V0PiBpcyAwMC1mZiwgPHZhbHVlPiBpcyAwLTI1NSlcbiIpOworI2VuZGlmCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBlY2R1bXBfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKwlpbnQgaSwgdjsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzc2NhbmYoY21kLCAiMHgleCAweCV4IiwgJmksICZ2KSA9PSAyKSB7CisJCQkvKiBpIGFuZCB2IHNldCAqLworCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICIweCV4ICV1IiwgJmksICZ2KSA9PSAyKSB7CisJCQkvKiBpIGFuZCB2IHNldCAqLworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaSA+PSAwICYmIGkgPCAyNTYgJiYgdiA+PSAwICYmIHYgPCAyNTYpIHsKKwkJCWlmICghYWNwaV9lY193cml0ZShpLCB2KSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicmlnaHRuZXNzX29mZnNldCA9IDB4MzE7CisKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJdTggbGV2ZWw7CisKKwlpZiAoIWFjcGlfZWNfcmVhZChicmlnaHRuZXNzX29mZnNldCwgJmxldmVsKSkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdHVucmVhZGFibGVcbiIpOworCX0gZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0JWRcbiIsIGxldmVsICYgMHg3KTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd25cbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgorCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC03KVxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworI2RlZmluZSBCUklHSFRORVNTX1VQCTQKKyNkZWZpbmUgQlJJR0hUTkVTU19ET1dOCTUKKworc3RhdGljIGludCBicmlnaHRuZXNzX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwlpbnQgY21vc19jbWQsIGluYywgaTsKKwl1OCBsZXZlbDsKKwlpbnQgbmV3X2xldmVsOworCWNoYXIgKmNtZDsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmICghYWNwaV9lY19yZWFkKGJyaWdodG5lc3Nfb2Zmc2V0LCAmbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU87CisJCWxldmVsICY9IDc7CisKKwkJaWYgKHN0cmxlbmNtcChjbWQsICJ1cCIpID09IDApIHsKKwkJCW5ld19sZXZlbCA9IGxldmVsID09IDcgPyA3IDogbGV2ZWwgKyAxOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkb3duIikgPT0gMCkgeworCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gMCA/IDAgOiBsZXZlbCAtIDE7CisJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJm5ld19sZXZlbCkgPT0gMSAmJgorCQkJICAgbmV3X2xldmVsID49IDAgJiYgbmV3X2xldmVsIDw9IDcpIHsKKwkJCS8qIG5ld19sZXZlbCBzZXQgKi8KKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljbW9zX2NtZCA9IG5ld19sZXZlbCA+IGxldmVsID8gQlJJR0hUTkVTU19VUCA6IEJSSUdIVE5FU1NfRE9XTjsKKwkJaW5jID0gbmV3X2xldmVsID4gbGV2ZWwgPyAxIDogLTE7CisJCWZvciAoaSA9IGxldmVsOyBpICE9IG5ld19sZXZlbDsgaSArPSBpbmMpIHsKKwkJCWlmICghY21vc19ldmFsKGNtb3NfY21kKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmICghYWNwaV9lY193cml0ZShicmlnaHRuZXNzX29mZnNldCwgaSArIGluYykpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b2x1bWVfb2Zmc2V0ID0gMHgzMDsKKworc3RhdGljIGludCB2b2x1bWVfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCXU4IGxldmVsOworCisJaWYgKCFhY3BpX2VjX3JlYWQodm9sdW1lX29mZnNldCwgJmxldmVsKSkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdHVucmVhZGFibGVcbiIpOworCX0gZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0JWRcbiIsIGxldmVsICYgMHhmKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm11dGU6XHRcdCVzXG4iLCBvbm9mZihsZXZlbCwgNikpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHR1cCwgZG93biwgbXV0ZVxuIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxldmVsIDxsZXZlbD4iCisJCQkgICAgICAgIiAoPGxldmVsPiBpcyAwLTE1KVxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworI2RlZmluZSBWT0xVTUVfRE9XTgkwCisjZGVmaW5lIFZPTFVNRV9VUAkxCisjZGVmaW5lIFZPTFVNRV9NVVRFCTIKKworc3RhdGljIGludCB2b2x1bWVfd3JpdGUoY2hhciAqYnVmKQoreworCWludCBjbW9zX2NtZCwgaW5jLCBpOworCXU4IGxldmVsLCBtdXRlOworCWludCBuZXdfbGV2ZWwsIG5ld19tdXRlOworCWNoYXIgKmNtZDsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmICghYWNwaV9lY19yZWFkKHZvbHVtZV9vZmZzZXQsICZsZXZlbCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJbmV3X211dGUgPSBtdXRlID0gbGV2ZWwgJiAweDQwOworCQluZXdfbGV2ZWwgPSBsZXZlbCA9IGxldmVsICYgMHhmOworCisJCWlmIChzdHJsZW5jbXAoY21kLCAidXAiKSA9PSAwKSB7CisJCQlpZiAobXV0ZSkKKwkJCQluZXdfbXV0ZSA9IDA7CisJCQllbHNlCisJCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gMTUgPyAxNSA6IGxldmVsICsgMTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZG93biIpID09IDApIHsKKwkJCWlmIChtdXRlKQorCQkJCW5ld19tdXRlID0gMDsKKwkJCWVsc2UKKwkJCQluZXdfbGV2ZWwgPSBsZXZlbCA9PSAwID8gMCA6IGxldmVsIC0gMTsKKwkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAibGV2ZWwgJWQiLCAmbmV3X2xldmVsKSA9PSAxICYmCisJCQkgICBuZXdfbGV2ZWwgPj0gMCAmJiBuZXdfbGV2ZWwgPD0gMTUpIHsKKwkJCS8qIG5ld19sZXZlbCBzZXQgKi8KKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAibXV0ZSIpID09IDApIHsKKwkJCW5ld19tdXRlID0gMHg0MDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAobmV3X2xldmVsICE9IGxldmVsKSB7CS8qIG11dGUgZG9lc24ndCBjaGFuZ2UgKi8KKwkJCWNtb3NfY21kID0gbmV3X2xldmVsID4gbGV2ZWwgPyBWT0xVTUVfVVAgOiBWT0xVTUVfRE9XTjsKKwkJCWluYyA9IG5ld19sZXZlbCA+IGxldmVsID8gMSA6IC0xOworCisJCQlpZiAobXV0ZSAmJiAoIWNtb3NfZXZhbChjbW9zX2NtZCkgfHwKKwkJCQkgICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGxldmVsKSkpCisJCQkJcmV0dXJuIC1FSU87CisKKwkJCWZvciAoaSA9IGxldmVsOyBpICE9IG5ld19sZXZlbDsgaSArPSBpbmMpCisJCQkJaWYgKCFjbW9zX2V2YWwoY21vc19jbWQpIHx8CisJCQkJICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGkgKyBpbmMpKQorCQkJCQlyZXR1cm4gLUVJTzsKKworCQkJaWYgKG11dGUgJiYgKCFjbW9zX2V2YWwoVk9MVU1FX01VVEUpIHx8CisJCQkJICAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LAorCQkJCQkJICAgIG5ld19sZXZlbCArIG11dGUpKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChuZXdfbXV0ZSAhPSBtdXRlKSB7CS8qIGxldmVsIGRvZXNuJ3QgY2hhbmdlICovCisJCQljbW9zX2NtZCA9IG5ld19tdXRlID8gVk9MVU1FX01VVEUgOiBWT0xVTUVfVVA7CisKKwkJCWlmICghY21vc19ldmFsKGNtb3NfY21kKSB8fAorCQkJICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGxldmVsICsgbmV3X211dGUpKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3N0YXR1c19vZmZzZXQgPSAweDJmOworc3RhdGljIGludCBmYW5fcnBtX29mZnNldCA9IDB4ODQ7CisKK3N0YXRpYyBpbnQgZmFuX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgczsKKwl1OCBsbywgaGksIHN0YXR1czsKKworCWlmIChnZmFuX2hhbmRsZSkgeworCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlpZiAoIWFjcGlfZXZhbGYoZ2Zhbl9oYW5kbGUsICZzLCBOVUxMLCAiZCIpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHQlZFxuIiwgcyk7CisJfSBlbHNlIHsKKwkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlpZiAoIWFjcGlfZWNfcmVhZChmYW5fc3RhdHVzX29mZnNldCwgJnN0YXR1cykpCisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bnJlYWRhYmxlXG4iKTsKKwkJZWxzZQorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCisJCQkJICAgICAgIGVuYWJsZWQoc3RhdHVzLCA3KSk7CisKKwkJaWYgKCFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQsICZsbykgfHwKKwkJICAgICFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQgKyAxLCAmaGkpKQorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInNwZWVkOlx0XHR1bnJlYWRhYmxlXG4iKTsKKwkJZWxzZQorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInNwZWVkOlx0XHQlZFxuIiwKKwkJCQkgICAgICAgKGhpIDw8IDgpICsgbG8pOworCX0KKworCWlmIChzZmFuX2hhbmRsZSkKKwkJLyogNTcwLCA3NzB4LUpMICovCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxldmVsIDxsZXZlbD4iCisJCQkgICAgICAgIiAoPGxldmVsPiBpcyAwLTcpXG4iKTsKKwlpZiAoIWdmYW5faGFuZGxlKQorCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVuYWJsZSwgZGlzYWJsZVxuIik7CisJaWYgKGZhbnNfaGFuZGxlKQorCQkvKiBYMzEsIFg0MCAqLworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRzcGVlZCA8c3BlZWQ+IgorCQkJICAgICAgICIgKDxzcGVlZD4gaXMgMC02NTUzNSlcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKwlpbnQgbGV2ZWwsIHNwZWVkOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHNmYW5faGFuZGxlICYmCisJCSAgICBzc2NhbmYoY21kLCAibGV2ZWwgJWQiLCAmbGV2ZWwpID09IDEgJiYKKwkJICAgIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNykgeworCQkJLyogNTcwLCA3NzB4LUpMICovCisJCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGxldmVsKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIGlmICghZ2Zhbl9oYW5kbGUgJiYgc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKKwkJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgMHg4MCkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAoIWdmYW5faGFuZGxlICYmIHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgPT0gMCkgeworCQkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCAweDAwKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIGlmIChmYW5zX2hhbmRsZSAmJgorCQkJICAgc3NjYW5mKGNtZCwgInNwZWVkICVkIiwgJnNwZWVkKSA9PSAxICYmCisJCQkgICBzcGVlZCA+PSAwICYmIHNwZWVkIDw9IDY1NTM1KSB7CisJCQkvKiBYMzEsIFg0MCAqLworCQkJaWYgKCFhY3BpX2V2YWxmKGZhbnNfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkZCIsCisJCQkJCXNwZWVkLCBzcGVlZCwgc3BlZWQpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgaWJtc1tdID0gewogCXsKLQkJLm5hbWUJPSAiZHJpdmVyIiwKLQkJLmluaXQJPSBkcml2ZXJfaW5pdCwKLQkJLnJlYWQJPSBkcml2ZXJfcmVhZCwKLQl9LAorCSAubmFtZSA9ICJkcml2ZXIiLAorCSAuaW5pdCA9IGRyaXZlcl9pbml0LAorCSAucmVhZCA9IGRyaXZlcl9yZWFkLAorCSB9LAogCXsKLQkJLm5hbWUJPSAiaG90a2V5IiwKLQkJLmhpZAk9ICJJQk0wMDY4IiwKLQkJLmluaXQJPSBob3RrZXlfaW5pdCwKLQkJLnJlYWQJPSBob3RrZXlfcmVhZCwKLQkJLndyaXRlCT0gaG90a2V5X3dyaXRlLAotCQkuZXhpdAk9IGhvdGtleV9leGl0LAotCQkubm90aWZ5CT0gaG90a2V5X25vdGlmeSwKLQkJLmhhbmRsZQk9ICZoa2V5X2hhbmRsZSwKLQkJLnR5cGUJPSBBQ1BJX0RFVklDRV9OT1RJRlksCi0JfSwKKwkgLm5hbWUgPSAiaG90a2V5IiwKKwkgLmhpZCA9IElCTV9IS0VZX0hJRCwKKwkgLmluaXQgPSBob3RrZXlfaW5pdCwKKwkgLnJlYWQgPSBob3RrZXlfcmVhZCwKKwkgLndyaXRlID0gaG90a2V5X3dyaXRlLAorCSAuZXhpdCA9IGhvdGtleV9leGl0LAorCSAubm90aWZ5ID0gaG90a2V5X25vdGlmeSwKKwkgLmhhbmRsZSA9ICZoa2V5X2hhbmRsZSwKKwkgLnR5cGUgPSBBQ1BJX0RFVklDRV9OT1RJRlksCisJIH0sCiAJewotCQkubmFtZQk9ICJibHVldG9vdGgiLAotCQkuaW5pdAk9IGJsdWV0b290aF9pbml0LAotCQkucmVhZAk9IGJsdWV0b290aF9yZWFkLAotCQkud3JpdGUJPSBibHVldG9vdGhfd3JpdGUsCi0JfSwKKwkgLm5hbWUgPSAiYmx1ZXRvb3RoIiwKKwkgLmluaXQgPSBibHVldG9vdGhfaW5pdCwKKwkgLnJlYWQgPSBibHVldG9vdGhfcmVhZCwKKwkgLndyaXRlID0gYmx1ZXRvb3RoX3dyaXRlLAorCSB9LAogCXsKLQkJLm5hbWUJPSAidmlkZW8iLAotCQkuaW5pdAk9IHZpZGVvX2luaXQsCi0JCS5yZWFkCT0gdmlkZW9fcmVhZCwKLQkJLndyaXRlCT0gdmlkZW9fd3JpdGUsCi0JCS5leGl0CT0gdmlkZW9fZXhpdCwKLQl9LAorCSAubmFtZSA9ICJ2aWRlbyIsCisJIC5pbml0ID0gdmlkZW9faW5pdCwKKwkgLnJlYWQgPSB2aWRlb19yZWFkLAorCSAud3JpdGUgPSB2aWRlb193cml0ZSwKKwkgLmV4aXQgPSB2aWRlb19leGl0LAorCSB9LAogCXsKLQkJLm5hbWUJPSAibGlnaHQiLAotCQkuaW5pdAk9IGxpZ2h0X2luaXQsCi0JCS5yZWFkCT0gbGlnaHRfcmVhZCwKLQkJLndyaXRlCT0gbGlnaHRfd3JpdGUsCi0JfSwKKwkgLm5hbWUgPSAibGlnaHQiLAorCSAuaW5pdCA9IGxpZ2h0X2luaXQsCisJIC5yZWFkID0gbGlnaHRfcmVhZCwKKwkgLndyaXRlID0gbGlnaHRfd3JpdGUsCisJIH0sCiAJewotCQkubmFtZQk9ICJkb2NrIiwKLQkJLnJlYWQJPSBkb2NrX3JlYWQsCi0JCS53cml0ZQk9IGRvY2tfd3JpdGUsCi0JCS5ub3RpZnkJPSBkb2NrX25vdGlmeSwKLQkJLmhhbmRsZQk9ICZkb2NrX2hhbmRsZSwKLQkJLnR5cGUJPSBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JfSwKKwkgLm5hbWUgPSAiZG9jayIsCisJIC5yZWFkID0gZG9ja19yZWFkLAorCSAud3JpdGUgPSBkb2NrX3dyaXRlLAorCSAubm90aWZ5ID0gZG9ja19ub3RpZnksCisJIC5oYW5kbGUgPSAmZG9ja19oYW5kbGUsCisJIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAorCSB9LAogCXsKLQkJLm5hbWUJPSAiYmF5IiwKLQkJLmluaXQJPSBiYXlfaW5pdCwKLQkJLnJlYWQJPSBiYXlfcmVhZCwKLQkJLndyaXRlCT0gYmF5X3dyaXRlLAotCQkubm90aWZ5CT0gYmF5X25vdGlmeSwKLQkJLmhhbmRsZQk9ICZiYXlfaGFuZGxlLAotCQkudHlwZQk9IEFDUElfU1lTVEVNX05PVElGWSwKLQl9LAorCSAubmFtZSA9ICJkb2NrIiwKKwkgLmhpZCA9IElCTV9QQ0lfSElELAorCSAubm90aWZ5ID0gZG9ja19ub3RpZnksCisJIC5oYW5kbGUgPSAmcGNpX2hhbmRsZSwKKwkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCisJIH0sCiAJewotCQkubmFtZQk9ICJjbW9zIiwKLQkJLnJlYWQJPSBjbW9zX3JlYWQsCi0JCS53cml0ZQk9IGNtb3Nfd3JpdGUsCi0JCS5leHBlcmltZW50YWwgPSAxLAotCX0sCisJIC5uYW1lID0gImJheSIsCisJIC5pbml0ID0gYmF5X2luaXQsCisJIC5yZWFkID0gYmF5X3JlYWQsCisJIC53cml0ZSA9IGJheV93cml0ZSwKKwkgLm5vdGlmeSA9IGJheV9ub3RpZnksCisJIC5oYW5kbGUgPSAmYmF5X2hhbmRsZSwKKwkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCisJIH0sCiAJewotCQkubmFtZQk9ICJsZWQiLAotCQkucmVhZAk9IGxlZF9yZWFkLAotCQkud3JpdGUJPSBsZWRfd3JpdGUsCi0JCS5leHBlcmltZW50YWwgPSAxLAotCX0sCisJIC5uYW1lID0gImNtb3MiLAorCSAucmVhZCA9IGNtb3NfcmVhZCwKKwkgLndyaXRlID0gY21vc193cml0ZSwKKwkgfSwKIAl7Ci0JCS5uYW1lCT0gImJlZXAiLAotCQkucmVhZAk9IGJlZXBfcmVhZCwKLQkJLndyaXRlCT0gYmVlcF93cml0ZSwKLQkJLmV4cGVyaW1lbnRhbCA9IDEsCi0JfSwKKwkgLm5hbWUgPSAibGVkIiwKKwkgLmluaXQgPSBsZWRfaW5pdCwKKwkgLnJlYWQgPSBsZWRfcmVhZCwKKwkgLndyaXRlID0gbGVkX3dyaXRlLAorCSB9LAorCXsKKwkgLm5hbWUgPSAiYmVlcCIsCisJIC5yZWFkID0gYmVlcF9yZWFkLAorCSAud3JpdGUgPSBiZWVwX3dyaXRlLAorCSB9LAorCXsKKwkgLm5hbWUgPSAidGhlcm1hbCIsCisJIC5pbml0ID0gdGhlcm1hbF9pbml0LAorCSAucmVhZCA9IHRoZXJtYWxfcmVhZCwKKwkgfSwKKwl7CisJIC5uYW1lID0gImVjZHVtcCIsCisJIC5yZWFkID0gZWNkdW1wX3JlYWQsCisJIC53cml0ZSA9IGVjZHVtcF93cml0ZSwKKwkgLmV4cGVyaW1lbnRhbCA9IDEsCisJIH0sCisJeworCSAubmFtZSA9ICJicmlnaHRuZXNzIiwKKwkgLnJlYWQgPSBicmlnaHRuZXNzX3JlYWQsCisJIC53cml0ZSA9IGJyaWdodG5lc3Nfd3JpdGUsCisJIC5leHBlcmltZW50YWwgPSAxLAorCSB9LAorCXsKKwkgLm5hbWUgPSAidm9sdW1lIiwKKwkgLnJlYWQgPSB2b2x1bWVfcmVhZCwKKwkgLndyaXRlID0gdm9sdW1lX3dyaXRlLAorCSAuZXhwZXJpbWVudGFsID0gMSwKKwkgfSwKKwl7CisJIC5uYW1lID0gImZhbiIsCisJIC5yZWFkID0gZmFuX3JlYWQsCisJIC53cml0ZSA9IGZhbl93cml0ZSwKKwkgLmV4cGVyaW1lbnRhbCA9IDEsCisJIH0sCiB9OwotI2RlZmluZSBOVU1fSUJNUyAoc2l6ZW9mKGlibXMpL3NpemVvZihpYm1zWzBdKSkKIAogc3RhdGljIGludCBkaXNwYXRjaF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCiAJCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IChzdHJ1Y3QgaWJtX3N0cnVjdCAqKWRhdGE7CiAJaW50IGxlbjsKLQkKKwogCWlmICghaWJtIHx8ICFpYm0tPnJlYWQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGVuID0gaWJtLT5yZWFkKGlibSwgcGFnZSk7CisJbGVuID0gaWJtLT5yZWFkKHBhZ2UpOwogCWlmIChsZW4gPCAwKQogCQlyZXR1cm4gbGVuOwogCkBAIC05NTUsNyArMTY3MCw3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBkaXNwYXRjaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCitzdGF0aWMgaW50IGRpc3BhdGNoX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIHVzZXJidWYsCiAJCQkgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IChzdHJ1Y3QgaWJtX3N0cnVjdCAqKWRhdGE7CkBAIC05NjksMjAgKzE2ODQsMjAgQEAKIAlpZiAoIWtlcm5idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihrZXJuYnVmLCB1c2VyYnVmLCBjb3VudCkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIoa2VybmJ1ZiwgdXNlcmJ1ZiwgY291bnQpKSB7CiAJCWtmcmVlKGtlcm5idWYpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlrZXJuYnVmW2NvdW50XSA9IDA7CiAJc3RyY2F0KGtlcm5idWYsICIsIik7Ci0JcmV0ID0gaWJtLT53cml0ZShpYm0sIGtlcm5idWYpOworCXJldCA9IGlibS0+d3JpdGUoa2VybmJ1Zik7CiAJaWYgKHJldCA9PSAwKQogCQlyZXQgPSBjb3VudDsKIAogCWtmcmVlKGtlcm5idWYpOwogCi0gICAgICAgIHJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgZGlzcGF0Y2hfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQpAQCAtOTk1LDcgKzE3MTAsNyBAQAogCWlibS0+bm90aWZ5KGlibSwgZXZlbnQpOwogfQogCi1zdGF0aWMgaW50IHNldHVwX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWludCByZXQ7CkBAIC0xMDIwLDE3ICsxNzM1LDE1IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlibS0+bm90aWZ5X2luc3RhbGxlZCA9IDE7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpYm1hY3BpX2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IF9faW5pdCBpYm1fZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQogewogCWludCByZXQ7CiAKQEAgLTEwNDMsNyArMTc1Niw3IEBACiAJbWVtc2V0KGlibS0+ZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZHJpdmVyKSk7CiAJc3ByaW50ZihpYm0tPmRyaXZlci0+bmFtZSwgIiVzLyVzIiwgSUJNX05BTUUsIGlibS0+bmFtZSk7CiAJaWJtLT5kcml2ZXItPmlkcyA9IGlibS0+aGlkOwotCWlibS0+ZHJpdmVyLT5vcHMuYWRkID0gJmlibWFjcGlfZGV2aWNlX2FkZDsKKwlpYm0tPmRyaXZlci0+b3BzLmFkZCA9ICZpYm1fZGV2aWNlX2FkZDsKIAogCXJldCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihpYm0tPmRyaXZlcik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTEwNTUsNyArMTc2OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpYm1faW5pdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQorc3RhdGljIGludCBfX2luaXQgaWJtX2luaXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CkBAIC0xMDcxLDMxICsxNzg0LDM0IEBACiAJfQogCiAJaWYgKGlibS0+aW5pdCkgewotCQlyZXQgPSBpYm0tPmluaXQoaWJtKTsKKwkJcmV0ID0gaWJtLT5pbml0KCk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXJldHVybiByZXQ7CiAJCWlibS0+aW5pdF9jYWxsZWQgPSAxOwogCX0KIAotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoaWJtLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQkJICBwcm9jX2Rpcik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5ICVzXG4iLCBpYm0tPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JaWJtLT5wcm9jX2NyZWF0ZWQgPSAxOwotCQotCWVudHJ5LT5kYXRhID0gaWJtOwotCWlmIChpYm0tPnJlYWQpCisJaWYgKGlibS0+cmVhZCkgeworCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGlibS0+bmFtZSwKKwkJCQkJICBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJCSAgcHJvY19kaXIpOworCQlpZiAoIWVudHJ5KSB7CisJCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5ICVzXG4iLAorCQkJICAgICAgIGlibS0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJZW50cnktPmRhdGEgPSBpYm07CiAJCWVudHJ5LT5yZWFkX3Byb2MgPSAmZGlzcGF0Y2hfcmVhZDsKLQlpZiAoaWJtLT53cml0ZSkKLQkJZW50cnktPndyaXRlX3Byb2MgPSAmZGlzcGF0Y2hfd3JpdGU7CisJCWlmIChpYm0tPndyaXRlKQorCQkJZW50cnktPndyaXRlX3Byb2MgPSAmZGlzcGF0Y2hfd3JpdGU7CisJCWlibS0+cHJvY19jcmVhdGVkID0gMTsKKwl9CiAKIAlpZiAoaWJtLT5ub3RpZnkpIHsKIAkJcmV0ID0gc2V0dXBfbm90aWZ5KGlibSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKKwkJaWJtLT5ub3RpZnlfaW5zdGFsbGVkID0gMTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMTEsNyArMTgyNyw3IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KGlibS0+bmFtZSwgcHJvY19kaXIpOwogCiAJaWYgKGlibS0+aW5pdF9jYWxsZWQgJiYgaWJtLT5leGl0KQotCQlpYm0tPmV4aXQoaWJtKTsKKwkJaWJtLT5leGl0KCk7CiAKIAlpZiAoaWJtLT5kcml2ZXJfcmVnaXN0ZXJlZCkgewogCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcihpYm0tPmRyaXZlcik7CkBAIC0xMTE5LDYwICsxODM1LDY2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGlibV9oYW5kbGVfaW5pdChjaGFyICpuYW1lLAotCQkJICAgYWNwaV9oYW5kbGUgKmhhbmRsZSwgYWNwaV9oYW5kbGUgcGFyZW50LAotCQkJICAgY2hhciAqKnBhdGhzLCBpbnQgbnVtX3BhdGhzLCBpbnQgcmVxdWlyZWQpCitzdGF0aWMgdm9pZCBfX2luaXQgaWJtX2hhbmRsZV9pbml0KGNoYXIgKm5hbWUsCisJCQkJICAgYWNwaV9oYW5kbGUgKiBoYW5kbGUsIGFjcGlfaGFuZGxlIHBhcmVudCwKKwkJCQkgICBjaGFyICoqcGF0aHMsIGludCBudW1fcGF0aHMsIGNoYXIgKipwYXRoKQogewogCWludCBpOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCWZvciAoaT0wOyBpPG51bV9wYXRoczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7CiAJCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShwYXJlbnQsIHBhdGhzW2ldLCBoYW5kbGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCQlyZXR1cm4gMDsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkqcGF0aCA9IHBhdGhzW2ldOworCQkJcmV0dXJuOworCQl9CiAJfQotCQorCiAJKmhhbmRsZSA9IE5VTEw7Ci0KLQlpZiAocmVxdWlyZWQpIHsKLQkJcHJpbnRrKElCTV9FUlIgIiVzIG9iamVjdCBub3QgZm91bmRcbiIsIG5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgSUJNX0hBTkRMRV9JTklUKG9iamVjdCwgcmVxdWlyZWQpCQkJCVwKKyNkZWZpbmUgSUJNX0hBTkRMRV9JTklUKG9iamVjdCkJCQkJCQlcCiAJaWJtX2hhbmRsZV9pbml0KCNvYmplY3QsICZvYmplY3QjI19oYW5kbGUsICpvYmplY3QjI19wYXJlbnQsCVwKLQkJb2JqZWN0IyNfcGF0aHMsIHNpemVvZihvYmplY3QjI19wYXRocykvc2l6ZW9mKGNoYXIqKSwgcmVxdWlyZWQpCi0KKwkJb2JqZWN0IyNfcGF0aHMsIEFSUkFZX1NJWkUob2JqZWN0IyNfcGF0aHMpLCAmb2JqZWN0IyNfcGF0aCkKIAogc3RhdGljIGludCBzZXRfaWJtX3BhcmFtKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JY2hhciBhcmdfd2l0aF9jb21tYVszMl07CiAKLQlpZiAoc3RybGVuKHZhbCkgPiAzMCkKLQkJcmV0dXJuIC1FTk9TUEM7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJtcyk7IGkrKykKKwkJaWYgKHN0cmNtcChpYm1zW2ldLm5hbWUsIGtwLT5uYW1lKSA9PSAwICYmIGlibXNbaV0ud3JpdGUpIHsKKwkJCWlmIChzdHJsZW4odmFsKSA+IHNpemVvZihpYm1zW2ldLnBhcmFtKSAtIDIpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlzdHJjcHkoaWJtc1tpXS5wYXJhbSwgdmFsKTsKKwkJCXN0cmNhdChpYm1zW2ldLnBhcmFtLCAiLCIpOworCQkJcmV0dXJuIDA7CisJCX0KIAotCXN0cmNweShhcmdfd2l0aF9jb21tYSwgdmFsKTsKLQlzdHJjYXQoYXJnX3dpdGhfY29tbWEsICIsIik7Ci0KLQlmb3IgKGk9MDsgaTxOVU1fSUJNUzsgaSsrKQotCQlpZiAoc3RyY21wKGlibXNbaV0ubmFtZSwga3AtPm5hbWUpID09IDApCi0JCQlyZXR1cm4gaWJtc1tpXS53cml0ZSgmaWJtc1tpXSwgYXJnX3dpdGhfY29tbWEpOwotCUJVRygpOwogCXJldHVybiAtRUlOVkFMOwogfQogCiAjZGVmaW5lIElCTV9QQVJBTShmZWF0dXJlKSBcCiAJbW9kdWxlX3BhcmFtX2NhbGwoZmVhdHVyZSwgc2V0X2libV9wYXJhbSwgTlVMTCwgTlVMTCwgMCkKIAorSUJNX1BBUkFNKGhvdGtleSk7CitJQk1fUEFSQU0oYmx1ZXRvb3RoKTsKK0lCTV9QQVJBTSh2aWRlbyk7CitJQk1fUEFSQU0obGlnaHQpOworSUJNX1BBUkFNKGRvY2spOworSUJNX1BBUkFNKGJheSk7CitJQk1fUEFSQU0oY21vcyk7CitJQk1fUEFSQU0obGVkKTsKK0lCTV9QQVJBTShiZWVwKTsKK0lCTV9QQVJBTShlY2R1bXApOworSUJNX1BBUkFNKGJyaWdodG5lc3MpOworSUJNX1BBUkFNKHZvbHVtZSk7CitJQk1fUEFSQU0oZmFuKTsKKwogc3RhdGljIHZvaWQgYWNwaV9pYm1fZXhpdCh2b2lkKQogewogCWludCBpOwogCi0JZm9yIChpPU5VTV9JQk1TLTE7IGk+PTA7IGktLSkKKwlmb3IgKGkgPSBBUlJBWV9TSVpFKGlibXMpIC0gMTsgaSA+PSAwOyBpLS0pCiAJCWlibV9leGl0KCZpYm1zW2ldKTsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KElCTV9ESVIsIGFjcGlfcm9vdF9kaXIpOwpAQCAtMTE4NSwzMCArMTkwNyw0MCBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCl7Ci0JCXByaW50ayhJQk1fRVJSICJVc2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsJCisJaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKSB7CisJCXByaW50ayhJQk1fRVJSICJ1c2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JLyogdGhlc2UgaGFuZGxlcyBhcmUgcmVxdWlyZWQgKi8KLQlpZiAoSUJNX0hBTkRMRV9JTklUKGVjLAkgIDEpIDwgMCB8fAotCSAgICBJQk1fSEFORExFX0lOSVQoaGtleSwgMSkgPCAwIHx8Ci0JICAgIElCTV9IQU5ETEVfSU5JVCh2aWQsICAxKSA8IDAgfHwKLQkgICAgSUJNX0hBTkRMRV9JTklUKGJlZXAsIDEpIDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiB0aGVzZSBoYW5kbGVzIGhhdmUgYWx0ZXJuYXRpdmVzICovCi0JSUJNX0hBTkRMRV9JTklUKGxnaHQsIDApOwotCWlmIChJQk1fSEFORExFX0lOSVQoY21vcywgIWxnaHRfaGFuZGxlKSA8IDApCisJLyogZWMgaXMgcmVxdWlyZWQgYmVjYXVzZSBtYW55IG90aGVyIGhhbmRsZXMgYXJlIHJlbGF0aXZlIHRvIGl0ICovCisJSUJNX0hBTkRMRV9JTklUKGVjKTsKKwlpZiAoIWVjX2hhbmRsZSkgeworCQlwcmludGsoSUJNX0VSUiAiZWMgb2JqZWN0IG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwotCUlCTV9IQU5ETEVfSU5JVChzeXNsLCAwKTsKLQlpZiAoSUJNX0hBTkRMRV9JTklUKGxlZCwgIXN5c2xfaGFuZGxlKSA8IDApCi0JCXJldHVybiAtRU5PREVWOworCX0KIAogCS8qIHRoZXNlIGhhbmRsZXMgYXJlIG5vdCByZXF1aXJlZCAqLwotCUlCTV9IQU5ETEVfSU5JVChkb2NrLCAgMCk7Ci0JSUJNX0hBTkRMRV9JTklUKGJheSwgICAwKTsKLQlJQk1fSEFORExFX0lOSVQoYmF5ZWosIDApOwotCUlCTV9IQU5ETEVfSU5JVChibGVkLCAgMCk7CisJSUJNX0hBTkRMRV9JTklUKHZpZCk7CisJSUJNX0hBTkRMRV9JTklUKHZpZDIpOworCUlCTV9IQU5ETEVfSU5JVChsZWRiKTsKKwlJQk1fSEFORExFX0lOSVQobGVkKTsKKwlJQk1fSEFORExFX0lOSVQoaGtleSk7CisJSUJNX0hBTkRMRV9JTklUKGxnaHQpOworCUlCTV9IQU5ETEVfSU5JVChjbW9zKTsKKwlJQk1fSEFORExFX0lOSVQoZG9jayk7CisJSUJNX0hBTkRMRV9JTklUKHBjaSk7CisJSUJNX0hBTkRMRV9JTklUKGJheSk7CisJaWYgKGJheV9oYW5kbGUpCisJCUlCTV9IQU5ETEVfSU5JVChiYXlfZWopOworCUlCTV9IQU5ETEVfSU5JVChiYXkyKTsKKwlpZiAoYmF5Ml9oYW5kbGUpCisJCUlCTV9IQU5ETEVfSU5JVChiYXkyX2VqKTsKKwlJQk1fSEFORExFX0lOSVQoYmVlcCk7CisJSUJNX0hBTkRMRV9JTklUKGVjcmQpOworCUlCTV9IQU5ETEVfSU5JVChlY3dyKTsKKwlJQk1fSEFORExFX0lOSVQoZmFucyk7CisJSUJNX0hBTkRMRV9JTklUKGdmYW4pOworCUlCTV9IQU5ETEVfSU5JVChzZmFuKTsKIAogCXByb2NfZGlyID0gcHJvY19ta2RpcihJQk1fRElSLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoIXByb2NfZGlyKSB7CkBAIC0xMjE2LDkgKzE5NDgsMTEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXByb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwotCQotCWZvciAoaT0wOyBpPE5VTV9JQk1TOyBpKyspIHsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlibXMpOyBpKyspIHsKIAkJcmV0ID0gaWJtX2luaXQoJmlibXNbaV0pOworCQlpZiAocmV0ID49IDAgJiYgKmlibXNbaV0ucGFyYW0pCisJCQlyZXQgPSBpYm1zW2ldLndyaXRlKGlibXNbaV0ucGFyYW0pOwogCQlpZiAocmV0IDwgMCkgewogCQkJYWNwaV9pYm1fZXhpdCgpOwogCQkJcmV0dXJuIHJldDsKQEAgLTEyMzAsMTcgKzE5NjQsMyBAQAogCiBtb2R1bGVfaW5pdChhY3BpX2libV9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfaWJtX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oSUJNX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1JQk1fUEFSQU0oaG90a2V5KTsKLUlCTV9QQVJBTShibHVldG9vdGgpOwotSUJNX1BBUkFNKHZpZGVvKTsKLUlCTV9QQVJBTShsaWdodCk7Ci1JQk1fUEFSQU0oZG9jayk7Ci1JQk1fUEFSQU0oYmF5KTsKLUlCTV9QQVJBTShjbW9zKTsKLUlCTV9QQVJBTShsZWQpOwotSUJNX1BBUkFNKGJlZXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMgYi9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYwppbmRleCA2MWVhNzA3Li5lOTI4ZThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYworKysgYi9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYwpAQCAtMzAsMTIgKzMwLDExIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9tb3RoZXJib2FyZCIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX21vdGhlcmJvYXJkIikKIAogLyogRGVsbCB1c2UgUE5QMEMwMSBpbnN0ZWFkIG9mIFBOUDBDMDIgKi8KICNkZWZpbmUgQUNQSV9NQl9ISUQxCQkJIlBOUDBDMDEiCiAjZGVmaW5lIEFDUElfTUJfSElEMgkJCSJQTlAwQzAyIgotCiAvKioKICAqIERvZXNuJ3QgY2FyZSBhYm91dCBsZWdhY3kgSU8gcG9ydHMsIG9ubHkgSU8gcG9ydHMgYmV5b25kIDB4MTAwMCBhcmUgcmVzZXJ2ZWQKICAqIERvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZmFpbHVyZSBvZiAncmVxdWVzdF9yZWdpb24nLCBzaW5jZSBvdGhlciBtYXkgcmVzZXJ2ZSAKQEAgLTQ0LDE1ICs0MywxMiBAQAogI2RlZmluZSBJU19SRVNFUlZFRF9BRERSKGJhc2UsIGxlbikgXAogCSgoKGxlbikgPiAwKSAmJiAoKGJhc2UpID4gMCkgJiYgKChiYXNlKSArIChsZW4pIDwgSU9fU1BBQ0VfTElNSVQpIFwKIAkmJiAoKGJhc2UpICsgKGxlbikgPiBQQ0lCSU9TX01JTl9JTykpCi0KIC8qCiAgKiBDbGVhcmluZyB0aGUgZmxhZyAoSU9SRVNPVVJDRV9CVVNZKSBhbGxvd3MgZHJpdmVycyB0byB1c2UKICAqIHRoZSBpbyBwb3J0cyBpZiB0aGV5IHJlYWxseSBrbm93IHRoZXkgY2FuIHVzZSBpdCwgd2hpbGUKICAqIHN0aWxsIHByZXZlbnRpbmcgaG90cGx1ZyBQQ0kgZGV2aWNlcyBmcm9tIHVzaW5nIGl0LiAKICAqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMgKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsIHZvaWQgKmRhdGEpCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9yZXNlcnZlX2lvX3JhbmdlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVxdWVzdGVkX3JlcyA9IE5VTEw7CiAKQEAgLTYzLDIyICs1OSwzMiBAQAogCiAJCWlmIChpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MgIT0gaW9fcmVzLT5tYXhfYmFzZV9hZGRyZXNzKQogCQkJcmV0dXJuX1ZBTFVFKEFFX09LKTsKLQkJaWYgKElTX1JFU0VSVkVEX0FERFIoaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzLCBpb19yZXMtPnJhbmdlX2xlbmd0aCkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCi0JCQkJaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzLCAKLQkJCQlpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MgKyBpb19yZXMtPnJhbmdlX2xlbmd0aCkpOwotCQkJcmVxdWVzdGVkX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcywgCi0JCQkJaW9fcmVzLT5yYW5nZV9sZW5ndGgsICJtb3RoZXJib2FyZCIpOworCQlpZiAoSVNfUkVTRVJWRURfQUREUgorCQkgICAgKGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcywgaW9fcmVzLT5yYW5nZV9sZW5ndGgpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCisJCQkJCSAgaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzLAorCQkJCQkgIGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcyArCisJCQkJCSAgaW9fcmVzLT5yYW5nZV9sZW5ndGgpKTsKKwkJCXJlcXVlc3RlZF9yZXMgPQorCQkJICAgIHJlcXVlc3RfcmVnaW9uKGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcywKKwkJCQkJICAgaW9fcmVzLT5yYW5nZV9sZW5ndGgsICJtb3RoZXJib2FyZCIpOwogCQl9CiAJfSBlbHNlIGlmIChyZXMtPmlkID09IEFDUElfUlNUWVBFX0ZJWEVEX0lPKSB7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICpmaXhlZF9pb19yZXMgPSAmcmVzLT5kYXRhLmZpeGVkX2lvOworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqZml4ZWRfaW9fcmVzID0KKwkJICAgICZyZXMtPmRhdGEuZml4ZWRfaW87CiAKLQkJaWYgKElTX1JFU0VSVkVEX0FERFIoZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MsIGZpeGVkX2lvX3Jlcy0+cmFuZ2VfbGVuZ3RoKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTW90aGVyYm9hcmQgcmVzb3VyY2VzIDB4JTA4eCAtIDB4JTA4eFxuIiwKLQkJCQlmaXhlZF9pb19yZXMtPmJhc2VfYWRkcmVzcywgCi0JCQkJZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MgKyBmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCkpOwotCQkJcmVxdWVzdGVkX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzLCAKLQkJCQlmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCwgIm1vdGhlcmJvYXJkIik7CisJCWlmIChJU19SRVNFUlZFRF9BRERSCisJCSAgICAoZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MsIGZpeGVkX2lvX3Jlcy0+cmFuZ2VfbGVuZ3RoKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJNb3RoZXJib2FyZCByZXNvdXJjZXMgMHglMDh4IC0gMHglMDh4XG4iLAorCQkJCQkgIGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzLAorCQkJCQkgIGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzICsKKwkJCQkJICBmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCkpOworCQkJcmVxdWVzdGVkX3JlcyA9CisJCQkgICAgcmVxdWVzdF9yZWdpb24oZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MsCisJCQkJCSAgIGZpeGVkX2lvX3Jlcy0+cmFuZ2VfbGVuZ3RoLAorCQkJCQkgICAibW90aGVyYm9hcmQiKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIE1lbW9yeSBtYXBwZWQgSU8/ICovCkBAIC04OSw3MiArOTUsNzAgQEAKIAlyZXR1cm5fVkFMVUUoQUVfT0spOwogfQogCi1zdGF0aWMgaW50IGFjcGlfbW90aGVyYm9hcmRfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9tb3RoZXJib2FyZF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwotCWFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIAotCQlhY3BpX3Jlc2VydmVfaW9fcmFuZ2VzLCBOVUxMKTsKKwlhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJICAgIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9tb3RoZXJib2FyZF9kcml2ZXIxID0gewotCS5uYW1lID0JCSJtb3RoZXJib2FyZCIsCi0JLmNsYXNzID0JIiIsCi0JLmlkcyA9CQlBQ1BJX01CX0hJRDEsCi0JLm9wcyA9CXsKLQkJLmFkZCA9CQlhY3BpX21vdGhlcmJvYXJkX2FkZCwKLQl9LAorCS5uYW1lID0gIm1vdGhlcmJvYXJkIiwKKwkuY2xhc3MgPSAiIiwKKwkuaWRzID0gQUNQSV9NQl9ISUQxLAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX21vdGhlcmJvYXJkX2FkZCwKKwkJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9tb3RoZXJib2FyZF9kcml2ZXIyID0gewotCS5uYW1lID0JCSJtb3RoZXJib2FyZCIsCi0JLmNsYXNzID0JIiIsCi0JLmlkcyA9CQlBQ1BJX01CX0hJRDIsCi0JLm9wcyA9CXsKLQkJLmFkZCA9CQlhY3BpX21vdGhlcmJvYXJkX2FkZCwKLQl9LAorCS5uYW1lID0gIm1vdGhlcmJvYXJkIiwKKwkuY2xhc3MgPSAiIiwKKwkuaWRzID0gQUNQSV9NQl9ISUQyLAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX21vdGhlcmJvYXJkX2FkZCwKKwkJfSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdAotYWNwaV9yZXNlcnZlX3Jlc291cmNlcyAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3Jlc2VydmVfcmVzb3VyY2VzKHZvaWQpCiB7CiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikKLQkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzLCAKLQkJCWFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuLCAiUE0xYV9FVlRfQkxLIik7CisJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcywKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiwgIlBNMWFfRVZUX0JMSyIpOwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikKIAkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzLAotCQkJYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sICJQTTFiX0VWVF9CTEsiKTsKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiwgIlBNMWJfRVZUX0JMSyIpOwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTFfY250X2xlbikKLQkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsay5hZGRyZXNzLCAKLQkJCWFjcGlfZ2JsX0ZBRFQtPnBtMV9jbnRfbGVuLCAiUE0xYV9DTlRfQkxLIik7CisJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGsuYWRkcmVzcywKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfY250X2xlbiwgIlBNMWFfQ05UX0JMSyIpOwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTFfY250X2xlbikKLQkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2Jsay5hZGRyZXNzLCAKLQkJCWFjcGlfZ2JsX0ZBRFQtPnBtMV9jbnRfbGVuLCAiUE0xYl9DTlRfQkxLIik7CisJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGsuYWRkcmVzcywKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfY250X2xlbiwgIlBNMWJfQ05UX0JMSyIpOwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuID09IDQpCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MsCi0JCQk0LCAiUE1fVE1SIik7CisJCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MsIDQsICJQTV9UTVIiKTsKIAogCWlmIChhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTJfY250X2xlbikKIAkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MsCi0JCQlhY3BpX2dibF9GQURULT5wbTJfY250X2xlbiwgIlBNMl9DTlRfQkxLIik7CisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4sICJQTTJfQ05UX0JMSyIpOwogCiAJLyogTGVuZ3RoIG9mIEdQRSBibG9ja3MgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBtdWx0aXBsZSBvZiAyICovCiAKIAlpZiAoYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuICYmCi0JCQkhKGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmIDB4MSkpCisJICAgICEoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuICYgMHgxKSkKIAkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLmFkZHJlc3MsCi0JCQlhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4sICJHUEUwX0JMSyIpOworCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiwgIkdQRTBfQkxLIik7CiAKIAlpZiAoYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYmCi0JCQkhKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmIDB4MSkpCisJICAgICEoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYgMHgxKSkKIAkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLmFkZHJlc3MsCi0JCQlhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4sICJHUEUxX0JMSyIpOworCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiwgIkdQRTFfQkxLIik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfbW90aGVyYm9hcmRfaW5pdCh2b2lkKQpAQCAtMTY2LDcgKzE3MCw3IEBACiAJICogVGhpcyBtb2R1bGUgbXVzdCBydW4gYWZ0ZXIgc2Nhbi5jCiAJICovCiAJaWYgKCFhY3BpX2Rpc2FibGVkKQotCQlhY3BpX3Jlc2VydmVfcmVzb3VyY2VzICgpOworCQlhY3BpX3Jlc2VydmVfcmVzb3VyY2VzKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYwppbmRleCBlY2U3YTlkLi5lZGZiZTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCkBAIC00MSwxNiArNDEsMTMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNhY2Nlc3MiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc2FjY2VzcyIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjUsMjQgKzYyLDE5IEBACiAgKiBNVVRFWDogICAgICAgTG9ja3MgbmFtZXNwYWNlIGZvciBlbnRpcmUgZXhlY3V0aW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfcm9vdF9pbml0aWFsaXplICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9uc19yb290X2luaXRpYWxpemUodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMgKmluaXRfdmFsID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqbmV3X25vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IE5VTEw7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RyaW5nIHZhbCA9IE5VTEw7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19yb290X2luaXRpYWxpemUiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19yb290X2luaXRpYWxpemUiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTAyLDI0ICs5NCwyNiBAQAogCiAJLyogRW50ZXIgdGhlIHByZS1kZWZpbmVkIG5hbWVzIGluIHRoZSBuYW1lIHRhYmxlICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiRW50ZXJpbmcgcHJlZGVmaW5lZCBlbnRyaWVzIGludG8gbmFtZXNwYWNlXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRW50ZXJpbmcgcHJlZGVmaW5lZCBlbnRyaWVzIGludG8gbmFtZXNwYWNlXG4iKSk7CiAKIAlmb3IgKGluaXRfdmFsID0gYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXM7IGluaXRfdmFsLT5uYW1lOyBpbml0X3ZhbCsrKSB7CiAJCS8qIF9PU0kgaXMgb3B0aW9uYWwgZm9yIG5vdywgd2lsbCBiZSBwZXJtYW5lbnQgbGF0ZXIgKi8KIAotCQlpZiAoIUFDUElfU1RSQ01QIChpbml0X3ZhbC0+bmFtZSwgIl9PU0kiKSAmJiAhYWNwaV9nYmxfY3JlYXRlX29zaV9tZXRob2QpIHsKKwkJaWYgKCFBQ1BJX1NUUkNNUChpbml0X3ZhbC0+bmFtZSwgIl9PU0kiKQorCQkgICAgJiYgIWFjcGlfZ2JsX2NyZWF0ZV9vc2lfbWV0aG9kKSB7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwIChOVUxMLCBpbml0X3ZhbC0+bmFtZSwgaW5pdF92YWwtPnR5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkJICBOVUxMLCAmbmV3X25vZGUpOworCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cChOVUxMLCBpbml0X3ZhbC0+bmFtZSwgaW5pdF92YWwtPnR5cGUsCisJCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMiwKKwkJCQkJQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwgJm5ld19ub2RlKTsKIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpIHx8ICghbmV3X25vZGUpKSAvKiBNdXN0IGJlIG9uIHNhbWUgbGluZSBmb3IgY29kZSBjb252ZXJ0ZXIgKi8gewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkNvdWxkIG5vdCBjcmVhdGUgcHJlZGVmaW5lZCBuYW1lICVzLCAlc1xuIiwKLQkJCQlpbml0X3ZhbC0+bmFtZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAoIW5ld19ub2RlKSkgewkvKiBNdXN0IGJlIG9uIHNhbWUgbGluZSBmb3IgY29kZSBjb252ZXJ0ZXIgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkNvdWxkIG5vdCBjcmVhdGUgcHJlZGVmaW5lZCBuYW1lICVzLCAlc1xuIiwKKwkJCQkJICBpbml0X3ZhbC0+bmFtZSwKKwkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQl9CiAKIAkJLyoKQEAgLTEyOCwxMSArMTIyLDExIEBACiAJCSAqIGluaXRpYWwgdmFsdWUsIGNyZWF0ZSB0aGUgaW5pdGlhbCB2YWx1ZS4KIAkJICovCiAJCWlmIChpbml0X3ZhbC0+dmFsKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX29zX3ByZWRlZmluZWRfb3ZlcnJpZGUgKGluaXRfdmFsLCAmdmFsKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkNvdWxkIG5vdCBvdmVycmlkZSBwcmVkZWZpbmVkICVzXG4iLAotCQkJCQlpbml0X3ZhbC0+bmFtZSkpOworCQkJc3RhdHVzID0gYWNwaV9vc19wcmVkZWZpbmVkX292ZXJyaWRlKGluaXRfdmFsLCAmdmFsKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkgICJDb3VsZCBub3Qgb3ZlcnJpZGUgcHJlZGVmaW5lZCAlc1xuIiwKKwkJCQkJCSAgaW5pdF92YWwtPm5hbWUpKTsKIAkJCX0KIAogCQkJaWYgKCF2YWwpIHsKQEAgLTE0Myw3ICsxMzcsOCBAQAogCQkJICogRW50cnkgcmVxdWVzdHMgYW4gaW5pdGlhbCB2YWx1ZSwgYWxsb2NhdGUgYQogCQkJICogZGVzY3JpcHRvciBmb3IgaXQuCiAJCQkgKi8KLQkJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChpbml0X3ZhbC0+dHlwZSk7CisJCQlvYmpfZGVzYyA9CisJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KGluaXRfdmFsLT50eXBlKTsKIAkJCWlmICghb2JqX2Rlc2MpIHsKIAkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0xNTYsNTUgKzE1MSw2MiBAQAogCQkJICovCiAJCQlzd2l0Y2ggKGluaXRfdmFsLT50eXBlKSB7CiAJCQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6Ci0JCQkJb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCA9ICh1OCkgQUNQSV9UT19JTlRFR0VSICh2YWwpOworCQkJCW9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQgPQorCQkJCSAgICAodTgpIEFDUElfVE9fSU5URUdFUih2YWwpOwogCQkJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAKLSNpZiBkZWZpbmVkIChfQUNQSV9BU0xfQ09NUElMRVIpIHx8IGRlZmluZWQgKF9BQ1BJX0RVTVBfQXBwKQorI2lmIGRlZmluZWQgKEFDUElfQVNMX0NPTVBJTEVSKQogCi0JCQkJLyoKLQkJCQkgKiBpX2FTTCBDb21waWxlciBjaGVhdHMgYnkgcHV0dGluZyBwYXJhbWV0ZXIgY291bnQKLQkJCQkgKiBpbiB0aGUgb3duZXJfaUQKLQkJCQkgKi8KLQkJCQluZXdfbm9kZS0+b3duZXJfaWQgPSBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50OworCQkJCS8qIHNhdmUgdGhlIHBhcmFtZXRlciBjb3VudCBmb3IgdGhlIGlfYVNMIGNvbXBpbGVyICovCisKKwkJCQluZXdfbm9kZS0+dmFsdWUgPSBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50OwogI2Vsc2UKIAkJCQkvKiBNYXJrIHRoaXMgYXMgYSB2ZXJ5IFNQRUNJQUwgbWV0aG9kICovCiAKLQkJCQlvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyA9IEFNTF9NRVRIT0RfSU5URVJOQUxfT05MWTsKLQkJCQlvYmpfZGVzYy0+bWV0aG9kLmltcGxlbWVudGF0aW9uID0gYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb247CisJCQkJb2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgPQorCQkJCSAgICBBTUxfTUVUSE9EX0lOVEVSTkFMX09OTFk7CisKKyNpZm5kZWYgQUNQSV9EVU1QX0FQUAorCQkJCW9ial9kZXNjLT5tZXRob2QuaW1wbGVtZW50YXRpb24gPQorCQkJCSAgICBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbjsKKyNlbmRpZgogI2VuZGlmCiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKLQkJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfVE9fSU5URUdFUiAodmFsKTsKKwkJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfVE9fSU5URUdFUih2YWwpOwogCQkJCWJyZWFrOwogCi0KIAkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQkJCS8qCiAJCQkJICogQnVpbGQgYW4gb2JqZWN0IGFyb3VuZCB0aGUgc3RhdGljIHN0cmluZwogCQkJCSAqLwotCQkJCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoID0gKHUzMikgQUNQSV9TVFJMRU4gKHZhbCk7CisJCQkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPQorCQkJCSAgICAodTMyKSBBQ1BJX1NUUkxFTih2YWwpOwogCQkJCW9ial9kZXNjLT5zdHJpbmcucG9pbnRlciA9IHZhbDsKIAkJCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9TVEFUSUNfUE9JTlRFUjsKIAkJCQlicmVhazsKIAotCiAJCQljYXNlIEFDUElfVFlQRV9NVVRFWDoKIAogCQkJCW9ial9kZXNjLT5tdXRleC5ub2RlID0gbmV3X25vZGU7Ci0JCQkJb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPSAodTgpIChBQ1BJX1RPX0lOVEVHRVIgKHZhbCkgLSAxKTsKKwkJCQlvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCA9CisJCQkJICAgICh1OCkgKEFDUElfVE9fSU5URUdFUih2YWwpIC0gMSk7CiAKLQkJCQlpZiAoQUNQSV9TVFJDTVAgKGluaXRfdmFsLT5uYW1lLCAiX0dMXyIpID09IDApIHsKKwkJCQlpZiAoQUNQSV9TVFJDTVAoaW5pdF92YWwtPm5hbWUsICJfR0xfIikgPT0gMCkgewogCQkJCQkvKgogCQkJCQkgKiBDcmVhdGUgYSBjb3VudGluZyBzZW1hcGhvcmUgZm9yIHRoZQogCQkJCQkgKiBnbG9iYWwgbG9jawogCQkJCQkgKi8KLQkJCQkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlIChBQ1BJX05PX1VOSVRfTElNSVQsCi0JCQkJCQkJIDEsICZvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUKKwkJCQkJICAgIChBQ1BJX05PX1VOSVRfTElNSVQsIDEsCisJCQkJCSAgICAgJm9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZQorCQkJCQkJICAgIChvYmpfZGVzYyk7CiAJCQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCQkJfQogCkBAIC0yMTIsNTYgKzIxNCw1OCBAQAogCQkJCQkgKiBXZSBqdXN0IGNyZWF0ZWQgdGhlIG11dGV4IGZvciB0aGUKIAkJCQkJICogZ2xvYmFsIGxvY2ssIHNhdmUgaXQKIAkJCQkJICovCi0JCQkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSA9IG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmU7Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUgPQorCQkJCQkgICAgb2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZTsKKwkJCQl9IGVsc2UgewogCQkJCQkvKiBDcmVhdGUgYSBtdXRleCAqLwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSAoMSwgMSwKLQkJCQkJCQkgICAmb2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoMSwgMSwKKwkJCQkJCQkJCSAgJm9ial9kZXNjLT4KKwkJCQkJCQkJCSAgbXV0ZXguCisJCQkJCQkJCQkgIHNlbWFwaG9yZSk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlCisJCQkJCQkgICAgKG9ial9kZXNjKTsKIAkJCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwogCi0KIAkJCWRlZmF1bHQ6CiAKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJVbnN1cHBvcnRlZCBpbml0aWFsIHR5cGUgdmFsdWUgJVhcbiIsCi0JCQkJCWluaXRfdmFsLT50eXBlKSk7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbnN1cHBvcnRlZCBpbml0aWFsIHR5cGUgdmFsdWUgJVhcbiIsIGluaXRfdmFsLT50eXBlKSk7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJCQlvYmpfZGVzYyA9IE5VTEw7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCS8qIFN0b3JlIHBvaW50ZXIgdG8gdmFsdWUgZGVzY3JpcHRvciBpbiB0aGUgTm9kZSAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QgKG5ld19ub2RlLCBvYmpfZGVzYywKLQkJCQkJIEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpOworCQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5ld19ub2RlLCBvYmpfZGVzYywKKwkJCQkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJCQkJICAgICAgIChvYmpfZGVzYykpOwogCiAJCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCQl9CiAJfQogCi0KLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCiAJLyogU2F2ZSBhIGhhbmRsZSB0byAiX0dQRSIsIGl0IGlzIGFsd2F5cyBwcmVzZW50ICovCiAKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAoIlxcX0dQRSIsIE5VTEwsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkJICAmYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCgiXFxfR1BFIiwgTlVMTCwKKwkJCQkJICAgICBBQ1BJX05TX05PX1VQU0VBUkNILAorCQkJCQkgICAgICZhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvb2t1cApAQCAtMjg2LDYyICsyOTAsNTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvb2t1cCAoCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc2NvcGVfaW5mbywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpCithY3BpX25zX2xvb2t1cCh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm8sCisJICAgICAgIGNoYXIgKnBhdGhuYW1lLAorCSAgICAgICBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJICAgICAgIGFjcGlfaW50ZXJwcmV0ZXJfbW9kZSBpbnRlcnByZXRlcl9tb2RlLAorCSAgICAgICB1MzIgZmxhZ3MsCisJICAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJICAgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCA9IHBhdGhuYW1lOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnByZWZpeF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmN1cnJlbnRfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqdGhpc19ub2RlID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWdtZW50czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYXJhdHM7Ci0JYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZTsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfdG9fY2hlY2tfZm9yOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGhpc19zZWFyY2hfdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9wYXJlbnRfZmxhZyA9IEFDUElfTlNfU0VBUkNIX1BBUkVOVDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2ZsYWdzID0gZmxhZ3MgJiB+KEFDUElfTlNfRVJST1JfSUZfRk9VTkQgfAotCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJY2hhciAqcGF0aCA9IHBhdGhuYW1lOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY3VycmVudF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGhpc19ub2RlID0gTlVMTDsKKwl1MzIgbnVtX3NlZ21lbnRzOworCXUzMiBudW1fY2FyYXRzOworCWFjcGlfbmFtZSBzaW1wbGVfbmFtZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGVfdG9fY2hlY2tfZm9yOworCWFjcGlfb2JqZWN0X3R5cGUgdGhpc19zZWFyY2hfdHlwZTsKKwl1MzIgc2VhcmNoX3BhcmVudF9mbGFnID0gQUNQSV9OU19TRUFSQ0hfUEFSRU5UOworCXUzMiBsb2NhbF9mbGFncyA9IGZsYWdzICYgfihBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EIHwKKwkJCQkgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2xvb2t1cCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfbG9va3VwIik7CiAKIAlpZiAoIXJldHVybl9ub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlhY3BpX2dibF9uc19sb29rdXBfY291bnQrKzsKIAkqcmV0dXJuX25vZGUgPSBBQ1BJX0VOVFJZX05PVF9GT1VORDsKIAogCWlmICghYWNwaV9nYmxfcm9vdF9ub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTkFNRVNQQUNFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX05BTUVTUEFDRSk7CiAJfQogCiAJLyoKIAkgKiBHZXQgdGhlIHByZWZpeCBzY29wZS4KIAkgKiBBIG51bGwgc2NvcGUgbWVhbnMgdXNlIHRoZSByb290IHNjb3BlCiAJICovCi0JaWYgKCghc2NvcGVfaW5mbykgfHwKLQkJKCFzY29wZV9pbmZvLT5zY29wZS5ub2RlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCSJOdWxsIHNjb3BlIHByZWZpeCwgdXNpbmcgcm9vdCBub2RlICglcClcbiIsCi0JCQlhY3BpX2dibF9yb290X25vZGUpKTsKKwlpZiAoKCFzY29wZV9pbmZvKSB8fCAoIXNjb3BlX2luZm8tPnNjb3BlLm5vZGUpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJICAiTnVsbCBzY29wZSBwcmVmaXgsIHVzaW5nIHJvb3Qgbm9kZSAoJXApXG4iLAorCQkJCSAgYWNwaV9nYmxfcm9vdF9ub2RlKSk7CiAKIAkJcHJlZml4X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXByZWZpeF9ub2RlID0gc2NvcGVfaW5mby0+c2NvcGUubm9kZTsKLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAocHJlZml4X25vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19sb29rdXA6ICVwIGlzIG5vdCBhIG5hbWVzcGFjZSBub2RlIFslc11cbiIsCi0JCQkJCXByZWZpeF9ub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKHByZWZpeF9ub2RlKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHByZWZpeF9ub2RlKSAhPQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfbG9va3VwOiAlcCBpcyBub3QgYSBuYW1lc3BhY2Ugbm9kZSBbJXNdXG4iLCBwcmVmaXhfbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHByZWZpeF9ub2RlKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KIAogCQkvKgpAQCAtMzQ5LDkgKzM0OCw5IEBACiAJCSAqIERldmljZS9NZXRob2QsIGV0Yy4pICBJdCBjb3VsZCBiZSBhIFBhY2thZ2Ugb3Igb3RoZXIgb2JqZWN0IG5vZGUuCiAJCSAqIEJhY2t1cCB1cCB0aGUgdHJlZSB0byBmaW5kIHRoZSBjb250YWluaW5nIHNjb3BlIG5vZGUuCiAJCSAqLwotCQl3aGlsZSAoIWFjcGlfbnNfb3BlbnNfc2NvcGUgKHByZWZpeF9ub2RlLT50eXBlKSAmJgotCQkJCXByZWZpeF9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9BTlkpIHsKLQkJCXByZWZpeF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHByZWZpeF9ub2RlKTsKKwkJd2hpbGUgKCFhY3BpX25zX29wZW5zX3Njb3BlKHByZWZpeF9ub2RlLT50eXBlKSAmJgorCQkgICAgICAgcHJlZml4X25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgeworCQkJcHJlZml4X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwcmVmaXhfbm9kZSk7CiAJCX0KIAl9CiAKQEAgLTM2NiwxMyArMzY1LDEzIEBACiAJCS8qIEEgTnVsbCBuYW1lX3BhdGggaXMgYWxsb3dlZCBhbmQgcmVmZXJzIHRvIHRoZSByb290ICovCiAKIAkJbnVtX3NlZ21lbnRzID0gMDsKLQkJdGhpc19ub2RlICAgID0gYWNwaV9nYmxfcm9vdF9ub2RlOwotCQlwYXRoICAgICA9ICIiOworCQl0aGlzX25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJCXBhdGggPSAiIjsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCSJOdWxsIFBhdGhuYW1lIChaZXJvIHNlZ21lbnRzKSwgRmxhZ3M9JVhcbiIsIGZsYWdzKSk7Ci0JfQotCWVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCSAgIk51bGwgUGF0aG5hbWUgKFplcm8gc2VnbWVudHMpLCBGbGFncz0lWFxuIiwKKwkJCQkgIGZsYWdzKSk7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogTmFtZSBwb2ludGVyIGlzIHZhbGlkIChhbmQgbXVzdCBiZSBpbiBpbnRlcm5hbCBuYW1lIGZvcm1hdCkKIAkJICoKQEAgLTM5NiwxNSArMzk1LDE2IEBACiAKIAkJCXBhdGgrKzsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkJIlBhdGggaXMgYWJzb2x1dGUgZnJvbSByb290IFslcF1cbiIsIHRoaXNfbm9kZSkpOwotCQl9Ci0JCWVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiUGF0aCBpcyBhYnNvbHV0ZSBmcm9tIHJvb3QgWyVwXVxuIiwKKwkJCQkJICB0aGlzX25vZGUpKTsKKwkJfSBlbHNlIHsKIAkJCS8qIFBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2NvcGUsIHN0YXJ0IHRoZXJlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJTZWFyY2hpbmcgcmVsYXRpdmUgdG8gcHJlZml4IHNjb3BlIFslNC40c10gKCVwKVxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHByZWZpeF9ub2RlKSwgcHJlZml4X25vZGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlNlYXJjaGluZyByZWxhdGl2ZSB0byBwcmVmaXggc2NvcGUgWyU0LjRzXSAoJXApXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwcmVmaXhfbm9kZSksCisJCQkJCSAgcHJlZml4X25vZGUpKTsKIAogCQkJLyoKIAkJCSAqIEhhbmRsZSBtdWx0aXBsZSBQYXJlbnQgUHJlZml4ZXMgKGNhcmF0KSBieSBqdXN0IGdldHRpbmcKQEAgLTQyNSwyMCArNDI1LDIwIEBACiAJCQkJLyogQmFja3VwIHRvIHRoZSBwYXJlbnQgbm9kZSAqLwogCiAJCQkJbnVtX2NhcmF0cysrOwotCQkJCXRoaXNfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICh0aGlzX25vZGUpOworCQkJCXRoaXNfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHRoaXNfbm9kZSk7CiAJCQkJaWYgKCF0aGlzX25vZGUpIHsKIAkJCQkJLyogQ3VycmVudCBzY29wZSBoYXMgbm8gcGFyZW50IHNjb3BlICovCiAKLQkJCQkJQUNQSV9SRVBPUlRfRVJST1IgKAotCQkJCQkJKCJBQ1BJIHBhdGggaGFzIHRvbyBtYW55IHBhcmVudCBwcmVmaXhlcyAoXikgLSByZWFjaGVkIGJleW9uZCByb290IG5vZGVcbiIpKTsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRk9VTkQpOworCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkFDUEkgcGF0aCBoYXMgdG9vIG1hbnkgcGFyZW50IHByZWZpeGVzICheKSAtIHJlYWNoZWQgYmV5b25kIHJvb3Qgbm9kZVxuIikpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIAkJCQl9CiAJCQl9CiAKIAkJCWlmIChzZWFyY2hfcGFyZW50X2ZsYWcgPT0gQUNQSV9OU19OT19VUFNFQVJDSCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCQkiU2VhcmNoIHNjb3BlIGlzIFslNC40c10sIHBhdGggaGFzICVkIGNhcmF0KHMpXG4iLAotCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHRoaXNfbm9kZSksIG51bV9jYXJhdHMpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkJICAiU2VhcmNoIHNjb3BlIGlzIFslNC40c10sIHBhdGggaGFzICVkIGNhcmF0KHMpXG4iLAorCQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUKKwkJCQkJCSAgKHRoaXNfbm9kZSksIG51bV9jYXJhdHMpKTsKIAkJCX0KIAkJfQogCkBAIC00NjQsOSArNDY0LDkgQEAKIAkJCW51bV9zZWdtZW50cyA9IDA7CiAJCQl0eXBlID0gdGhpc19ub2RlLT50eXBlOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiUHJlZml4LW9ubHkgUGF0aG5hbWUgKFplcm8gbmFtZSBzZWdtZW50cyksIEZsYWdzPSVYXG4iLAotCQkJCWZsYWdzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJQcmVmaXgtb25seSBQYXRobmFtZSAoWmVybyBuYW1lIHNlZ21lbnRzKSwgRmxhZ3M9JVhcbiIsCisJCQkJCSAgZmxhZ3MpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX0RVQUxfTkFNRV9QUkVGSVg6CkBAIC00ODAsOCArNDgwLDkgQEAKIAkJCW51bV9zZWdtZW50cyA9IDI7CiAJCQlwYXRoKys7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJEdWFsIFBhdGhuYW1lICgyIHNlZ21lbnRzLCBGbGFncz0lWClcbiIsIGZsYWdzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJEdWFsIFBhdGhuYW1lICgyIHNlZ21lbnRzLCBGbGFncz0lWClcbiIsCisJCQkJCSAgZmxhZ3MpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQU1MX01VTFRJX05BTUVfUFJFRklYX09QOgpAQCAtNDkzLDEyICs0OTQsMTIgQEAKIAkJCS8qIEV4dHJhY3Qgc2VnbWVudCBjb3VudCwgcG9pbnQgdG8gZmlyc3QgbmFtZSBzZWdtZW50ICovCiAKIAkJCXBhdGgrKzsKLQkJCW51bV9zZWdtZW50cyA9ICh1MzIpICh1OCkgKnBhdGg7CisJCQludW1fc2VnbWVudHMgPSAodTMyKSAodTgpICogcGF0aDsKIAkJCXBhdGgrKzsKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkJIk11bHRpIFBhdGhuYW1lICglZCBTZWdtZW50cywgRmxhZ3M9JVgpIFxuIiwKLQkJCQludW1fc2VnbWVudHMsIGZsYWdzKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJNdWx0aSBQYXRobmFtZSAoJWQgU2VnbWVudHMsIEZsYWdzPSVYKSBcbiIsCisJCQkJCSAgbnVtX3NlZ21lbnRzLCBmbGFncykpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTUwOCwxNSArNTA5LDE1IEBACiAJCQkgKi8KIAkJCW51bV9zZWdtZW50cyA9IDE7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJTaW1wbGUgUGF0aG5hbWUgKDEgc2VnbWVudCwgRmxhZ3M9JVgpXG4iLCBmbGFncykpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiU2ltcGxlIFBhdGhuYW1lICgxIHNlZ21lbnQsIEZsYWdzPSVYKVxuIiwKKwkJCQkJICBmbGFncykpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUgKG51bV9zZWdtZW50cywgcGF0aCkpOworCQlBQ1BJX0RFQlVHX0VYRUMoYWNwaV9uc19wcmludF9wYXRobmFtZShudW1fc2VnbWVudHMsIHBhdGgpKTsKIAl9CiAKLQogCS8qCiAJICogU2VhcmNoIG5hbWVzcGFjZSBmb3IgZWFjaCBzZWdtZW50IG9mIHRoZSBuYW1lLiAgTG9vcCB0aHJvdWdoIGFuZAogCSAqIHZlcmlmeSAob3IgYWRkIHRvIHRoZSBuYW1lc3BhY2UpIGVhY2ggbmFtZSBzZWdtZW50LgpAQCAtNTQwLDcgKzU0MSw3IEBACiAJCQkgKiByZXF1ZXN0ZWQgaXQgQU5EIHdlIGhhdmUgYSBzaW5nbGUsIG5vbi1mdWxseS1xdWFsaWZpZWQgbmFtZV9zZWcKIAkJCSAqLwogCQkJaWYgKChzZWFyY2hfcGFyZW50X2ZsYWcgIT0gQUNQSV9OU19OT19VUFNFQVJDSCkgJiYKLQkJCQkoZmxhZ3MgJiBBQ1BJX05TX1NFQVJDSF9QQVJFTlQpKSB7CisJCQkgICAgKGZsYWdzICYgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKSkgewogCQkJCWxvY2FsX2ZsYWdzIHw9IEFDUElfTlNfU0VBUkNIX1BBUkVOVDsKIAkJCX0KIApAQCAtNTUzLDI0ICs1NTQsMjggQEAKIAogCQkvKiBFeHRyYWN0IG9uZSBBQ1BJIG5hbWUgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHBhdGhuYW1lICovCiAKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmc2ltcGxlX25hbWUsIHBhdGgpOworCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnNpbXBsZV9uYW1lLCBwYXRoKTsKIAogCQkvKiBUcnkgdG8gZmluZCB0aGUgc2luZ2xlICg0IGNoYXJhY3RlcikgQUNQSSBuYW1lICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfYW5kX2VudGVyIChzaW1wbGVfbmFtZSwgd2Fsa19zdGF0ZSwgY3VycmVudF9ub2RlLAotCQkJCSBpbnRlcnByZXRlcl9tb2RlLCB0aGlzX3NlYXJjaF90eXBlLCBsb2NhbF9mbGFncywgJnRoaXNfbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcihzaW1wbGVfbmFtZSwgd2Fsa19zdGF0ZSwKKwkJCQkJICAgICBjdXJyZW50X25vZGUsIGludGVycHJldGVyX21vZGUsCisJCQkJCSAgICAgdGhpc19zZWFyY2hfdHlwZSwgbG9jYWxfZmxhZ3MsCisJCQkJCSAgICAgJnRoaXNfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKIAkJCQkvKiBOYW1lIG5vdCBmb3VuZCBpbiBBQ1BJIG5hbWVzcGFjZSAqLwogCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkJCSJOYW1lIFslNC40c10gbm90IGZvdW5kIGluIHNjb3BlIFslNC40c10gJXBcbiIsCi0JCQkJCShjaGFyICopICZzaW1wbGVfbmFtZSwgKGNoYXIgKikgJmN1cnJlbnRfbm9kZS0+bmFtZSwKLQkJCQkJY3VycmVudF9ub2RlKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJCSAgIk5hbWUgWyU0LjRzXSBub3QgZm91bmQgaW4gc2NvcGUgWyU0LjRzXSAlcFxuIiwKKwkJCQkJCSAgKGNoYXIgKikmc2ltcGxlX25hbWUsCisJCQkJCQkgIChjaGFyICopJmN1cnJlbnRfbm9kZS0+bmFtZSwKKwkJCQkJCSAgY3VycmVudF9ub2RlKSk7CiAJCQl9CiAKIAkJCSpyZXR1cm5fbm9kZSA9IHRoaXNfbm9kZTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKIAkJLyoKQEAgLTU4NiwxOSArNTkxLDE2IEBACiAJCSAqCiAJCSAqIFRoZW4gd2UgaGF2ZSBhIHR5cGUgbWlzbWF0Y2guICBKdXN0IHdhcm4gYW5kIGlnbm9yZSBpdC4KIAkJICovCi0JCWlmICgobnVtX3NlZ21lbnRzICAgICAgID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0JCQkodHlwZV90b19jaGVja19mb3IgICE9IEFDUElfVFlQRV9BTlkpICAgICAgICAgICAgICAgICAgICYmCi0JCQkodHlwZV90b19jaGVja19mb3IgICE9IEFDUElfVFlQRV9MT0NBTF9BTElBUykgICAgICAgICAgICYmCi0JCQkodHlwZV90b19jaGVja19mb3IgICE9IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpICAgICYmCi0JCQkodHlwZV90b19jaGVja19mb3IgICE9IEFDUElfVFlQRV9MT0NBTF9TQ09QRSkgICAgICAgICAgICYmCi0JCQkodGhpc19ub2RlLT50eXBlICAgICE9IEFDUElfVFlQRV9BTlkpICAgICAgICAgICAgICAgICAgICYmCi0JCQkodGhpc19ub2RlLT50eXBlICAgICE9IHR5cGVfdG9fY2hlY2tfZm9yKSkgeworCQlpZiAoKG51bV9zZWdtZW50cyA9PSAwKSAmJgorCQkgICAgKHR5cGVfdG9fY2hlY2tfZm9yICE9IEFDUElfVFlQRV9BTlkpICYmCisJCSAgICAodHlwZV90b19jaGVja19mb3IgIT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSAmJgorCQkgICAgKHR5cGVfdG9fY2hlY2tfZm9yICE9IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpICYmCisJCSAgICAodHlwZV90b19jaGVja19mb3IgIT0gQUNQSV9UWVBFX0xPQ0FMX1NDT1BFKSAmJgorCQkgICAgKHRoaXNfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSAmJgorCQkgICAgKHRoaXNfbm9kZS0+dHlwZSAhPSB0eXBlX3RvX2NoZWNrX2ZvcikpIHsKIAkJCS8qIENvbXBsYWluIGFib3V0IGEgdHlwZSBtaXNtYXRjaCAqLwogCi0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgKLQkJCQkoIm5zX2xvb2t1cDogVHlwZSBtaXNtYXRjaCBvbiAlNC40cyAoJXMpLCBzZWFyY2hpbmcgZm9yICglcylcbiIsCi0JCQkJKGNoYXIgKikgJnNpbXBsZV9uYW1lLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHRoaXNfbm9kZS0+dHlwZSksCi0JCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlX3RvX2NoZWNrX2ZvcikpKTsKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJuc19sb29rdXA6IFR5cGUgbWlzbWF0Y2ggb24gJTQuNHMgKCVzKSwgc2VhcmNoaW5nIGZvciAoJXMpXG4iLCAoY2hhciAqKSZzaW1wbGVfbmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRoaXNfbm9kZS0+dHlwZSksIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlX3RvX2NoZWNrX2ZvcikpKTsKIAkJfQogCiAJCS8qCkBAIC02MjQsMTUgKzYyNiwxNiBAQAogCQkgKiBJZiBlbnRyeSBpcyBhIHR5cGUgd2hpY2ggb3BlbnMgYSBzY29wZSwgcHVzaCB0aGUgbmV3IHNjb3BlIG9uIHRoZQogCQkgKiBzY29wZSBzdGFjay4KIAkJICovCi0JCWlmIChhY3BpX25zX29wZW5zX3Njb3BlICh0eXBlKSkgewotCQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wdXNoICh0aGlzX25vZGUsIHR5cGUsIHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUodHlwZSkpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoKHRoaXNfbm9kZSwgdHlwZSwKKwkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCX0KIAogCSpyZXR1cm5fbm9kZSA9IHRoaXNfbm9kZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCmluZGV4IDU2NTNhMTkuLmNjN2E4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCkBAIC00MSwyMCArNDEsMTQgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2FsbG9jIikKK0FDUElfTU9EVUxFX05BTUUoIm5zYWxsb2MiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkCi1hY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwotCitzdGF0aWMgdm9pZCBhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2Uoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY4LDMxICs2MiwyNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfY3JlYXRlX25vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2NyZWF0ZV9ub2RlKHUzMiBuYW1lKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19jcmVhdGVfbm9kZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2NyZWF0ZV9ub2RlIik7Ci0KLQotCW5vZGUgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpKTsKKwlub2RlID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSkpOwogCWlmICghbm9kZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKLQlBQ1BJX01FTV9UUkFDS0lORyAoYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfTlNOT0RFXS50b3RhbF9hbGxvY2F0ZWQrKyk7CisJQUNQSV9NRU1fVFJBQ0tJTkcoYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9hbGxvY2F0ZWQrKyk7CiAKLQlub2RlLT5uYW1lLmludGVnZXIgICA9IG5hbWU7CisJbm9kZS0+bmFtZS5pbnRlZ2VyID0gbmFtZTsKIAlub2RlLT5yZWZlcmVuY2VfY291bnQgPSAxOwotCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRSAobm9kZSwgQUNQSV9ERVNDX1RZUEVfTkFNRUQpOworCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShub2RlLCBBQ1BJX0RFU0NfVFlQRV9OQU1FRCk7CiAKLQlyZXR1cm5fUFRSIChub2RlKTsKKwlyZXR1cm5fUFRSKG5vZGUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX25vZGUKQEAgLTEwNSwxOSArOTQsMTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2RlbGV0ZV9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQordm9pZCBhY3BpX25zX2RlbGV0ZV9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnByZXZfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpuZXh0X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmV2X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19kZWxldGVfbm9kZSIsIG5vZGUpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJuc19kZWxldGVfbm9kZSIsIG5vZGUpOwotCi0KLQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChub2RlKTsKKwlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpOwogCiAJcHJldl9ub2RlID0gTlVMTDsKIAluZXh0X25vZGUgPSBwYXJlbnRfbm9kZS0+Y2hpbGQ7CkBAIC0xMzYsMzIgKzEyMSwyOSBAQAogCQlpZiAobmV4dF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKIAkJCXByZXZfbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBOb2RlIGlzIGZpcnN0IGNoaWxkIChoYXMgbm8gcHJldmlvdXMgcGVlcikgKi8KIAogCQlpZiAobmV4dF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKIAkJCS8qIE5vIHBlZXJzIGF0IGFsbCAqLwogCiAJCQlwYXJlbnRfbm9kZS0+Y2hpbGQgPSBOVUxMOwotCQl9Ci0JCWVsc2UgeyAgIC8qIExpbmsgcGVlciBsaXN0IHRvIHBhcmVudCAqLworCQl9IGVsc2UgewkvKiBMaW5rIHBlZXIgbGlzdCB0byBwYXJlbnQgKi8KIAogCQkJcGFyZW50X25vZGUtPmNoaWxkID0gbmV4dF9ub2RlLT5wZWVyOwogCQl9CiAJfQogCi0JQUNQSV9NRU1fVFJBQ0tJTkcgKGFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX05TTk9ERV0udG90YWxfZnJlZWQrKyk7CisJQUNQSV9NRU1fVFJBQ0tJTkcoYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9mcmVlZCsrKTsKIAogCS8qCiAJICogRGV0YWNoIGFuIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUgdGhlbiBkZWxldGUgdGhlIG5vZGUKIAkgKi8KLQlhY3BpX25zX2RldGFjaF9vYmplY3QgKG5vZGUpOwotCUFDUElfTUVNX0ZSRUUgKG5vZGUpOworCWFjcGlfbnNfZGV0YWNoX29iamVjdChub2RlKTsKKwlBQ1BJX01FTV9GUkVFKG5vZGUpOwogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5zdGFsbF9ub2RlCkBAIC0xNzYsMzAgKzE1OCwyMCBAQAogICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYSBuZXcgbmFtZXNwYWNlIG5vZGUgYW5kIGluc3RhbGwgaXQgYW1vbmdzdAogICogICAgICAgICAgICAgIGl0cyBwZWVycy4KICAqCi0gKiAgICAgICAgICAgICAgTm90ZTogQ3VycmVudCBuYW1lc3BhY2UgbG9va3VwIGlzIGxpbmVhciBzZWFyY2guICBIb3dldmVyLCB0aGUKLSAqICAgICAgICAgICAgICBub2RlcyBhcmUgbGlua2VkIGluIGFscGhhYmV0aWNhbCBvcmRlciB0byAxKSBwdXQgYWxsIHJlc2VydmVkCi0gKiAgICAgICAgICAgICAgbmFtZXMgKHN0YXJ0IHdpdGggdW5kZXJzY29yZSkgZmlyc3QsIGFuZCB0byAyKSBtYWtlIGEgcmVhZGFibGUKLSAqICAgICAgICAgICAgICBuYW1lc3BhY2UgZHVtcC4KKyAqICAgICAgICAgICAgICBOb3RlOiBDdXJyZW50IG5hbWVzcGFjZSBsb29rdXAgaXMgbGluZWFyIHNlYXJjaC4gVGhpcyBhcHBlYXJzCisgKiAgICAgICAgICAgICAgdG8gYmUgc3VmZmljaWVudCBhcyBuYW1lc3BhY2Ugc2VhcmNoZXMgY29uc3VtZSBvbmx5IGEgc21hbGwKKyAqICAgICAgICAgICAgICBmcmFjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIEFDUEkgc3Vic3lzdGVtLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfbnNfaW5zdGFsbF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLCAgIC8qIFBhcmVudCAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsICAgICAgICAgIC8qIE5ldyBDaGlsZCovCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKQordm9pZCBhY3BpX25zX2luc3RhbGxfbm9kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCS8qIFBhcmVudCAqLworCQkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwJLyogTmV3IENoaWxkICovCisJCQkgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKIHsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyX2lkID0gMDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlOwotI2lmZGVmIEFDUElfQUxQSEFCRVRJQ19OQU1FU1BBQ0UKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkID0gMDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZTsKIAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnByZXZpb3VzX2NoaWxkX25vZGU7Ci0jZW5kaWYKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2luc3RhbGxfbm9kZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfaW5zdGFsbF9ub2RlIik7CiAKIAkvKgogCSAqIEdldCB0aGUgb3duZXIgSUQgZnJvbSB0aGUgV2FsayBzdGF0ZQpAQCAtMjE3LDU5ICsxODksNyBAQAogCQlwYXJlbnRfbm9kZS0+Y2hpbGQgPSBub2RlOwogCQlub2RlLT5mbGFncyB8PSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwogCQlub2RlLT5wZWVyID0gcGFyZW50X25vZGU7Ci0JfQotCWVsc2UgewotI2lmZGVmIEFDUElfQUxQSEFCRVRJQ19OQU1FU1BBQ0UKLQkJLyoKLQkJICogV2FsayB0aGUgbGlzdCB3aGlsc3Qgc2VhcmNoaW5nIGZvciB0aGUgY29ycmVjdAotCQkgKiBhbHBoYWJldGljIHBsYWNlbWVudC4KLQkJICovCi0JCXByZXZpb3VzX2NoaWxkX25vZGUgPSBOVUxMOwotCQl3aGlsZSAoYWNwaV9uc19jb21wYXJlX25hbWVzIChhY3BpX3V0X2dldF9ub2RlX25hbWUgKGNoaWxkX25vZGUpLAotCQkJCSBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpKSA8IDApIHsKLQkJCWlmIChjaGlsZF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKLQkJCQkvKiBMYXN0IHBlZXI7ICBDbGVhciBlbmQtb2YtbGlzdCBmbGFnICovCi0KLQkJCQljaGlsZF9ub2RlLT5mbGFncyAmPSB+QU5PQkpfRU5EX09GX1BFRVJfTElTVDsKLQotCQkJCS8qIFRoaXMgbm9kZSBpcyB0aGUgbmV3IHBlZXIgdG8gdGhlIGNoaWxkIG5vZGUgKi8KLQotCQkJCWNoaWxkX25vZGUtPnBlZXIgPSBub2RlOwotCi0JCQkJLyogVGhpcyBub2RlIGlzIHRoZSBuZXcgZW5kLW9mLWxpc3QgKi8KLQotCQkJCW5vZGUtPmZsYWdzIHw9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7Ci0JCQkJbm9kZS0+cGVlciA9IHBhcmVudF9ub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBHZXQgbmV4dCBwZWVyICovCi0KLQkJCXByZXZpb3VzX2NoaWxkX25vZGUgPSBjaGlsZF9ub2RlOwotCQkJY2hpbGRfbm9kZSA9IGNoaWxkX25vZGUtPnBlZXI7Ci0JCX0KLQotCQkvKiBEaWQgdGhlIG5vZGUgZ2V0IGluc2VydGVkIGF0IHRoZSBlbmQtb2YtbGlzdD8gKi8KLQotCQlpZiAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7Ci0JCQkvKgotCQkJICogTG9vcCBhYm92ZSB0ZXJtaW5hdGVkIHdpdGhvdXQgcmVhY2hpbmcgdGhlIGVuZC1vZi1saXN0LgotCQkJICogSW5zZXJ0IHRoZSBuZXcgbm9kZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotCQkJICovCi0JCQlpZiAocHJldmlvdXNfY2hpbGRfbm9kZSkgewotCQkJCS8qIEluc2VydCBub2RlIGFscGhhYmV0aWNhbGx5ICovCi0KLQkJCQlub2RlLT5wZWVyID0gY2hpbGRfbm9kZTsKLQkJCQlwcmV2aW91c19jaGlsZF9ub2RlLT5wZWVyID0gbm9kZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIEluc2VydCBub2RlIGFscGhhYmV0aWNhbGx5IGF0IHN0YXJ0IG9mIGxpc3QgKi8KLQotCQkJCW5vZGUtPnBlZXIgPSBjaGlsZF9ub2RlOwotCQkJCXBhcmVudF9ub2RlLT5jaGlsZCA9IG5vZGU7Ci0JCQl9Ci0JCX0KLSNlbHNlCisJfSBlbHNlIHsKIAkJd2hpbGUgKCEoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSkgewogCQkJY2hpbGRfbm9kZSA9IGNoaWxkX25vZGUtPnBlZXI7CiAJCX0KQEAgLTI3OSw5ICsxOTksOCBAQAogCQkvKiBDbGVhciBlbmQtb2YtbGlzdCBmbGFnICovCiAKIAkJY2hpbGRfbm9kZS0+ZmxhZ3MgJj0gfkFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7Ci0JCW5vZGUtPmZsYWdzICAgICB8PSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOworCQlub2RlLT5mbGFncyB8PSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwogCQlub2RlLT5wZWVyID0gcGFyZW50X25vZGU7Ci0jZW5kaWYKIAl9CiAKIAkvKiBJbml0IHRoZSBuZXcgZW50cnkgKi8KQEAgLTI4OSwyNCArMjA4LDI1IEBACiAJbm9kZS0+b3duZXJfaWQgPSBvd25lcl9pZDsKIAlub2RlLT50eXBlID0gKHU4KSB0eXBlOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCSIlNC40cyAoJXMpIFtOb2RlICVwIE93bmVyICVYXSBhZGRlZCB0byAlNC40cyAoJXMpIFtOb2RlICVwXVxuIiwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChub2RlLT50eXBlKSwgbm9kZSwgb3duZXJfaWQsCi0JCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocGFyZW50X25vZGUpLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHBhcmVudF9ub2RlLT50eXBlKSwKLQkJcGFyZW50X25vZGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiJTQuNHMgKCVzKSBbTm9kZSAlcCBPd25lciAlWF0gYWRkZWQgdG8gJTQuNHMgKCVzKSBbTm9kZSAlcF1cbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpLCBub2RlLCBvd25lcl9pZCwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBhcmVudF9ub2RlKSwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHBhcmVudF9ub2RlLT50eXBlKSwKKwkJCSAgcGFyZW50X25vZGUpKTsKIAogCS8qCiAJICogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQocykgb2YgYWxsIHBhcmVudHMgdXAgdG8KIAkgKiB0aGUgcm9vdCEKIAkgKi8KLQl3aGlsZSAoKG5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKG5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSkgIT0gTlVMTCkgewogCQlub2RlLT5yZWZlcmVuY2VfY291bnQrKzsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbgpAQCAtMzIwLDE4ICsyNDAsMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2RlbGV0ZV9jaGlsZHJlbiAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUpCit2b2lkIGFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5leHRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1OCBmbGFnczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJuc19kZWxldGVfY2hpbGRyZW4iLCBwYXJlbnRfbm9kZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZGVsZXRlX2NoaWxkcmVuIiwgcGFyZW50X25vZGUpOwogCiAJaWYgKCFwYXJlbnRfbm9kZSkgewogCQlyZXR1cm5fVk9JRDsKQEAgLTM1MCw0OCArMjY2LDQ4IEBACiAJZG8gewogCQkvKiBHZXQgdGhlIHRoaW5ncyB3ZSBuZWVkICovCiAKLQkJbmV4dF9ub2RlICAgPSBjaGlsZF9ub2RlLT5wZWVyOwotCQlmbGFncyAgICAgICA9IGNoaWxkX25vZGUtPmZsYWdzOworCQluZXh0X25vZGUgPSBjaGlsZF9ub2RlLT5wZWVyOworCQlmbGFncyA9IGNoaWxkX25vZGUtPmZsYWdzOwogCiAJCS8qIEdyYW5kY2hpbGRyZW4gc2hvdWxkIGhhdmUgYWxsIGJlZW4gZGVsZXRlZCBhbHJlYWR5ICovCiAKIAkJaWYgKGNoaWxkX25vZGUtPmNoaWxkKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkZvdW5kIGEgZ3JhbmRjaGlsZCEgUD0lcCBDPSVwXG4iLAotCQkJCXBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJGb3VuZCBhIGdyYW5kY2hpbGQhIFA9JXAgQz0lcFxuIiwKKwkJCQkJICBwYXJlbnRfbm9kZSwgY2hpbGRfbm9kZSkpOwogCQl9CiAKIAkJLyogTm93IHdlIGNhbiBmcmVlIHRoaXMgY2hpbGQgb2JqZWN0ICovCiAKLQkJQUNQSV9NRU1fVFJBQ0tJTkcgKGFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX05TTk9ERV0udG90YWxfZnJlZWQrKyk7CisJCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfZnJlZWQrKyk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJPYmplY3QgJXAsIFJlbWFpbmluZyAlWFxuIiwKLQkJCWNoaWxkX25vZGUsIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIk9iamVjdCAlcCwgUmVtYWluaW5nICVYXG4iLCBjaGlsZF9ub2RlLAorCQkJCSAgYWNwaV9nYmxfY3VycmVudF9ub2RlX2NvdW50KSk7CiAKIAkJLyoKIAkJICogRGV0YWNoIGFuIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUsIHRoZW4gZnJlZSB0aGUgY2hpbGQgbm9kZQogCQkgKi8KLQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0IChjaGlsZF9ub2RlKTsKKwkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOwogCiAJCS8qCiAJCSAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50KHMpIG9mIGFsbCBwYXJlbnRzIHVwIHRvCiAJCSAqIHRoZSByb290ISAoY291bnRzIHdlcmUgaW5jcmVtZW50ZWQgd2hlbiB0aGUgbm9kZSB3YXMgY3JlYXRlZCkKIAkJICovCiAJCW5vZGUgPSBjaGlsZF9ub2RlOwotCQl3aGlsZSAoKG5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSkpICE9IE5VTEwpIHsKKwkJd2hpbGUgKChub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSkpICE9IE5VTEwpIHsKIAkJCW5vZGUtPnJlZmVyZW5jZV9jb3VudC0tOwogCQl9CiAKIAkJLyogVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHJlZmVyZW5jZSByZW1haW5pbmcgb24gdGhpcyBub2RlICovCiAKIAkJaWYgKGNoaWxkX25vZGUtPnJlZmVyZW5jZV9jb3VudCAhPSAxKSB7Ci0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCi0JCQkJIkV4aXN0aW5nIHJlZmVyZW5jZXMgKCVkKSBvbiBub2RlIGJlaW5nIGRlbGV0ZWQgKCVwKVxuIiwKLQkJCQljaGlsZF9ub2RlLT5yZWZlcmVuY2VfY291bnQsIGNoaWxkX25vZGUpKTsKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJFeGlzdGluZyByZWZlcmVuY2VzICglZCkgb24gbm9kZSBiZWluZyBkZWxldGVkICglcClcbiIsIGNoaWxkX25vZGUtPnJlZmVyZW5jZV9jb3VudCwgY2hpbGRfbm9kZSkpOwogCQl9CiAKIAkJLyogTm93IHdlIGNhbiBkZWxldGUgdGhlIG5vZGUgKi8KIAotCQlBQ1BJX01FTV9GUkVFIChjaGlsZF9ub2RlKTsKKwkJQUNQSV9NRU1fRlJFRShjaGlsZF9ub2RlKTsKIAogCQkvKiBBbmQgbW92ZSBvbiB0byB0aGUgbmV4dCBjaGlsZCBpbiB0aGUgbGlzdCAqLwogCkBAIC0zOTksNyArMzE1LDYgQEAKIAogCX0gd2hpbGUgKCEoZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSk7CiAKLQogCS8qIENsZWFyIHRoZSBwYXJlbnQncyBjaGlsZCBwb2ludGVyICovCiAKIAlwYXJlbnRfbm9kZS0+Y2hpbGQgPSBOVUxMOwpAQCAtNDA3LDcgKzMyMiw2IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUKQEAgLTQyMSwxNiArMzM1LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlKQordm9pZCBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGRfbm9kZSA9IE5VTEw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDE7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGUgPSBOVUxMOworCXUzMiBsZXZlbCA9IDE7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSIpOwogCiAJaWYgKCFwYXJlbnRfbm9kZSkgewogCQlyZXR1cm5fVk9JRDsKQEAgLTQ0MywxNiArMzUzLDE3IEBACiAJd2hpbGUgKGxldmVsID4gMCkgewogCQkvKiBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGlzIHNjb3BlIChOVUxMIGlmIG5vbmUpICovCiAKLQkJY2hpbGRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfbm9kZSAoQUNQSV9UWVBFX0FOWSwgcGFyZW50X25vZGUsCi0JCQkJIGNoaWxkX25vZGUpOworCQljaGlsZF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF9ub2RlKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLAorCQkJCQkJICAgY2hpbGRfbm9kZSk7CiAJCWlmIChjaGlsZF9ub2RlKSB7CiAJCQkvKiBGb3VuZCBhIGNoaWxkIG5vZGUgLSBkZXRhY2ggYW55IGF0dGFjaGVkIG9iamVjdCAqLwogCi0JCQlhY3BpX25zX2RldGFjaF9vYmplY3QgKGNoaWxkX25vZGUpOworCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOwogCiAJCQkvKiBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIGFueSBjaGlsZHJlbiAqLwogCi0JCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgeworCQkJaWYgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQorCQkJICAgIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgewogCQkJCS8qCiAJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgbm9kZSwKIAkJCQkgKiB2aXNpdCB0aGUgbm9kZQpAQCAtNDYxLDggKzM3Miw3IEBACiAJCQkJcGFyZW50X25vZGUgPSBjaGlsZF9ub2RlOwogCQkJCWNoaWxkX25vZGUgPSBOVUxMOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIE5vIG1vcmUgY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQgbm9kZS4KIAkJCSAqIE1vdmUgdXAgdG8gdGhlIGdyYW5kcGFyZW50LgpAQCAtNDczLDcgKzM4Myw3IEBACiAJCQkgKiBOb3cgZGVsZXRlIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQKIAkJCSAqIGFsbCBhdCB0aGUgc2FtZSB0aW1lLgogCQkJICovCi0JCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbiAocGFyZW50X25vZGUpOworCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4ocGFyZW50X25vZGUpOwogCiAJCQkvKiBOZXcgImxhc3QgY2hpbGQiIGlzIHRoaXMgcGFyZW50IG5vZGUgKi8KIApAQCAtNDgxLDE0ICszOTEsMTMgQEAKIAogCQkJLyogTW92ZSB1cCB0aGUgdHJlZSB0byB0aGUgZ3JhbmRwYXJlbnQgKi8KIAotCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAocGFyZW50X25vZGUpOworCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7CiAJCX0KIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UKQEAgLTUwNCwxNiArNDEzLDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKK3N0YXRpYyB2b2lkIGFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICp0aGlzX25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0aGlzX25vZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50KHMpIG9mIHRoaXMgbm9kZSBhbmQgYWxsCkBAIC01MjMsNyArNDI4LDcgQEAKIAl3aGlsZSAodGhpc19ub2RlKSB7CiAJCS8qIFByZXBhcmUgdG8gbW92ZSB1cCB0byBwYXJlbnQgKi8KIAotCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICh0aGlzX25vZGUpOworCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHRoaXNfbm9kZSk7CiAKIAkJLyogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhpcyBub2RlICovCiAKQEAgLTUzNCwxNSArNDM5LDE0IEBACiAJCWlmICghdGhpc19ub2RlLT5yZWZlcmVuY2VfY291bnQpIHsKIAkJCS8qIERlbGV0ZSBhbGwgY2hpbGRyZW4gYW5kIGRlbGV0ZSB0aGUgbm9kZSAqLwogCi0JCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbiAodGhpc19ub2RlKTsKLQkJCWFjcGlfbnNfZGVsZXRlX25vZGUgKHRoaXNfbm9kZSk7CisJCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbih0aGlzX25vZGUpOworCQkJYWNwaV9uc19kZWxldGVfbm9kZSh0aGlzX25vZGUpOwogCQl9CiAKIAkJdGhpc19ub2RlID0gcGFyZW50X25vZGU7CiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcgpAQCAtNTU3LDIzICs0NjEsMjMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQpCit2b2lkIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX293bmVyX2lkIG93bmVyX2lkKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGVsZXRpb25fbm9kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZWxldGlvbl9ub2RlOworCXUzMiBsZXZlbDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigibnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciIsIG93bmVyX2lkKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgibnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciIsIG93bmVyX2lkKTsKKwlpZiAob3duZXJfaWQgPT0gMCkgeworCQlyZXR1cm5fVk9JRDsKKwl9CiAKLQotCXBhcmVudF9ub2RlICAgPSBhY3BpX2dibF9yb290X25vZGU7Ci0JY2hpbGRfbm9kZSAgICA9IE5VTEw7CisJcGFyZW50X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJY2hpbGRfbm9kZSA9IE5VTEw7CiAJZGVsZXRpb25fbm9kZSA9IE5VTEw7Ci0JbGV2ZWwgICAgICAgICA9IDE7CisJbGV2ZWwgPSAxOwogCiAJLyoKIAkgKiBUcmF2ZXJzZSB0aGUgdHJlZSBvZiBub2RlcyB1bnRpbCB3ZSBidWJibGUgYmFjayB1cApAQCAtNTg0LDEwICs0ODgsMTIgQEAKIAkJICogR2V0IHRoZSBuZXh0IGNoaWxkIG9mIHRoaXMgcGFyZW50IG5vZGUuIFdoZW4gY2hpbGRfbm9kZSBpcyBOVUxMLAogCQkgKiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIHBhcmVudCBpcyByZXR1cm5lZAogCQkgKi8KLQkJY2hpbGRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfbm9kZSAoQUNQSV9UWVBFX0FOWSwgcGFyZW50X25vZGUsIGNoaWxkX25vZGUpOworCQljaGlsZF9ub2RlID0KKwkJICAgIGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKKwkJCQkJICBjaGlsZF9ub2RlKTsKIAogCQlpZiAoZGVsZXRpb25fbm9kZSkgewotCQkJYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlIChkZWxldGlvbl9ub2RlKTsKKwkJCWFjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZShkZWxldGlvbl9ub2RlKTsKIAkJCWRlbGV0aW9uX25vZGUgPSBOVUxMOwogCQl9CiAKQEAgLTU5NSwxMiArNTAxLDEzIEBACiAJCQlpZiAoY2hpbGRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKIAkJCQkvKiBGb3VuZCBhIG1hdGNoaW5nIGNoaWxkIG5vZGUgLSBkZXRhY2ggYW55IGF0dGFjaGVkIG9iamVjdCAqLwogCi0JCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0IChjaGlsZF9ub2RlKTsKKwkJCQlhY3BpX25zX2RldGFjaF9vYmplY3QoY2hpbGRfbm9kZSk7CiAJCQl9CiAKIAkJCS8qIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgYW55IGNoaWxkcmVuICovCiAKLQkJCWlmIChhY3BpX25zX2dldF9uZXh0X25vZGUgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7CisJCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlCisJCQkgICAgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hpbGQgb2YgdGhpcyBub2RlLAogCQkJCSAqIHZpc2l0IHRoZSBub2RlCkBAIC02MDgsMTIgKzUxNSwxMCBAQAogCQkJCWxldmVsKys7CiAJCQkJcGFyZW50X25vZGUgPSBjaGlsZF9ub2RlOwogCQkJCWNoaWxkX25vZGUgPSBOVUxMOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKKwkJCX0gZWxzZSBpZiAoY2hpbGRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKIAkJCQlkZWxldGlvbl9ub2RlID0gY2hpbGRfbm9kZTsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBObyBtb3JlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50IG5vZGUuCiAJCQkgKiBNb3ZlIHVwIHRvIHRoZSBncmFuZHBhcmVudC4KQEAgLTYzMSw2MiArNTM2LDkgQEAKIAogCQkJLyogTW92ZSB1cCB0aGUgdHJlZSB0byB0aGUgZ3JhbmRwYXJlbnQgKi8KIAotCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAocGFyZW50X25vZGUpOworCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7CiAJCX0KIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KLQotCi0jaWZkZWYgQUNQSV9BTFBIQUJFVElDX05BTUVTUEFDRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19jb21wYXJlX25hbWVzCi0gKgotICogUEFSQU1FVEVSUzogIE5hbWUxICAgICAgICAgICAtIEZpcnN0IG5hbWUgdG8gY29tcGFyZQotICogICAgICAgICAgICAgIE5hbWUyICAgICAgICAgICAtIFNlY29uZCBuYW1lIHRvIGNvbXBhcmUKLSAqCi0gKiBSRVRVUk46ICAgICAgdmFsdWUgZnJvbSBzdHJuY21wCi0gKgotICogREVTQ1JJUFRJT046IENvbXBhcmUgdHdvIEFDUEkgbmFtZXMuICBOYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIGFuCi0gKiAgICAgICAgICAgICAgdW5kZXJzY29yZSBhcmUgZm9yY2VkIHRvIGJlIGFscGhhYmV0aWNhbGx5IGZpcnN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludAotYWNwaV9uc19jb21wYXJlX25hbWVzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMikKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUxW0FDUElfTkFNRV9TSVpFXTsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUyW0FDUElfTkFNRV9TSVpFXTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqOwotCi0KLQkvKgotCSAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAidW5kZXJzY29yZSIgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciBzbwotCSAqIHRoYXQgYWxsIG5hbWVzIHRoYXQgYXJlIHByZWZpeGVkIHdpdGggdW5kZXJzY29yZShzKSBhcmUgYWxwaGFiZXRpY2FsbHkKLQkgKiBmaXJzdC4KLQkgKgotCSAqIFJldmVyc2UgdGhlIG5hbWUgYnl0ZXdpc2Ugc28gd2UgY2FuIGp1c3QgZG8gYSAzMi1iaXQgY29tcGFyZSBpbnN0ZWFkCi0JICogb2YgYSBzdHJuY21wLgotCSAqLwotCWZvciAoaSA9IDAsIGo9IChBQ1BJX05BTUVfU0laRSAtIDEpOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKywgai0tKSB7Ci0JCXJldmVyc2VkX25hbWUxW2pdID0gbmFtZTFbaV07Ci0JCWlmIChuYW1lMVtpXSA9PSAnXycpIHsKLQkJCXJldmVyc2VkX25hbWUxW2pdID0gJyonOwotCQl9Ci0KLQkJcmV2ZXJzZWRfbmFtZTJbal0gPSBuYW1lMltpXTsKLQkJaWYgKG5hbWUyW2ldID09ICdfJykgewotCQkJcmV2ZXJzZWRfbmFtZTJbal0gPSAnKic7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKCooaW50ICopIHJldmVyc2VkX25hbWUxIC0gKihpbnQgKikgcmV2ZXJzZWRfbmFtZTIpOwotfQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKaW5kZXggNmMyYWVmMC4uOWZhZjFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCkBAIC00MSwzMSArNDEsMjIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNkdW1wIikKK0FDUElfTU9EVUxFX05BTUUoIm5zZHVtcCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCi12b2lkCi1hY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyh2b2lkKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2R1bXBfb25lX2RldmljZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKK2FjcGlfbnNfZHVtcF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogI2VuZGlmCiAKLQogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODAsMzYgKzcxLDM4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19wcmludF9wYXRobmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VnbWVudHMsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUpCit2b2lkIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUodTMyIG51bV9zZWdtZW50cywgY2hhciAqcGF0aG5hbWUpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FICgibnNfcHJpbnRfcGF0aG5hbWUiKTsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX3ByaW50X3BhdGhuYW1lIik7CiAKLQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfTkFNRVMpIHx8ICEoYWNwaV9kYmdfbGF5ZXIgJiBBQ1BJX05BTUVTUEFDRSkpIHsKKwlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfTkFNRVMpCisJICAgIHx8ICEoYWNwaV9kYmdfbGF5ZXIgJiBBQ1BJX05BTUVTUEFDRSkpIHsKIAkJcmV0dXJuOwogCX0KIAogCS8qIFByaW50IHRoZSBlbnRpcmUgbmFtZSAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICJbIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICJbIikpOwogCiAJd2hpbGUgKG51bV9zZWdtZW50cykgewotCQlhY3BpX29zX3ByaW50ZiAoIiU0LjRzIiwgcGF0aG5hbWUpOwotCQlwYXRobmFtZSArPSBBQ1BJX05BTUVfU0laRTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJQUNQSV9JU19QUklOVChwYXRobmFtZVtpXSkgPworCQkJICAgIGFjcGlfb3NfcHJpbnRmKCIlYyIsIHBhdGhuYW1lW2ldKSA6CisJCQkgICAgYWNwaV9vc19wcmludGYoIj8iKTsKKwkJfQogCisJCXBhdGhuYW1lICs9IEFDUElfTkFNRV9TSVpFOwogCQludW1fc2VnbWVudHMtLTsKIAkJaWYgKG51bV9zZWdtZW50cykgewotCQkJYWNwaV9vc19wcmludGYgKCIuIik7CisJCQlhY3BpX29zX3ByaW50ZigiLiIpOwogCQl9CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCJdXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiXVxuIik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3BhdGhuYW1lCkBAIC0xMjcsMTUgKzEyMCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9uc19kdW1wX3BhdGhuYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptc2csCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCkKK2FjcGlfbnNfZHVtcF9wYXRobmFtZShhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm1zZywgdTMyIGxldmVsLCB1MzIgY29tcG9uZW50KQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2R1bXBfcGF0aG5hbWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2R1bXBfcGF0aG5hbWUiKTsKIAogCS8qIERvIHRoaXMgb25seSBpZiB0aGUgcmVxdWVzdGVkIGRlYnVnIGxldmVsIGFuZCBjb21wb25lbnQgYXJlIGVuYWJsZWQgKi8KIApAQCAtMTQ1LDEyICsxMzMsMTEgQEAKIAogCS8qIENvbnZlcnQgaGFuZGxlIHRvIGEgZnVsbCBwYXRobmFtZSBhbmQgcHJpbnQgaXQgKHdpdGggc3VwcGxpZWQgbWVzc2FnZSkgKi8KIAotCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZSAoaGFuZGxlLCBtc2cpOwotCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoaGFuZGxlLCBtc2cpOworCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0CkBAIC0xNjgsMjQgKzE1NSwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX25zX2R1bXBfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgKmluZm8gPSAoc3RydWN0IGFjcGlfd2Fsa19pbmZvICopIGNvbnRleHQ7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqdGhpc19ub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjID0gTlVMTDsKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIG9ial90eXBlOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2R1bXA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV93YWxrX2luZm8gKiljb250ZXh0OworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0aGlzX25vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOworCWFjcGlfb2JqZWN0X3R5cGUgb2JqX3R5cGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCXUzMiBieXRlc190b19kdW1wOworCXUzMiBkYmdfbGV2ZWw7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoIm5zX2R1bXBfb25lX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJuc19kdW1wX29uZV9vYmplY3QiKTsKIAogCS8qIElzIG91dHB1dCBlbmFibGVkPyAqLwogCkBAIC0xOTQsMTkzICsxNzYsMjE1IEBACiAJfQogCiAJaWYgKCFvYmpfaGFuZGxlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJOdWxsIG9iamVjdCBoYW5kbGVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTnVsbCBvYmplY3QgaGFuZGxlXG4iKSk7CiAJCXJldHVybiAoQUVfT0spOwogCX0KIAotCXRoaXNfbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKKwl0aGlzX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKIAl0eXBlID0gdGhpc19ub2RlLT50eXBlOwogCiAJLyogQ2hlY2sgaWYgdGhlIG93bmVyIG1hdGNoZXMgKi8KIAotCWlmICgoaW5mby0+b3duZXJfaWQgIT0gQUNQSV9VSU5UMzJfTUFYKSAmJgotCQkoaW5mby0+b3duZXJfaWQgIT0gdGhpc19ub2RlLT5vd25lcl9pZCkpIHsKKwlpZiAoKGluZm8tPm93bmVyX2lkICE9IEFDUElfT1dORVJfSURfTUFYKSAmJgorCSAgICAoaW5mby0+b3duZXJfaWQgIT0gdGhpc19ub2RlLT5vd25lcl9pZCkpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCi0JLyogSW5kZW50IHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBsZXZlbCAqLworCWlmICghKGluZm8tPmRpc3BsYXlfdHlwZSAmIEFDUElfRElTUExBWV9TSE9SVCkpIHsKKwkJLyogSW5kZW50IHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBsZXZlbCAqLwogCi0JYWNwaV9vc19wcmludGYgKCIlMmQlKnMiLCAodTMyKSBsZXZlbCAtIDEsIChpbnQpIGxldmVsICogMiwgIiAiKTsKKwkJYWNwaV9vc19wcmludGYoIiUyZCUqcyIsICh1MzIpIGxldmVsIC0gMSwgKGludClsZXZlbCAqIDIsICIgIik7CiAKLQkvKiBDaGVjayB0aGUgbm9kZSB0eXBlIGFuZCBuYW1lICovCisJCS8qIENoZWNrIHRoZSBub2RlIHR5cGUgYW5kIG5hbWUgKi8KIAotCWlmICh0eXBlID4gQUNQSV9UWVBFX0xPQ0FMX01BWCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkludmFsaWQgQUNQSSBUeXBlICUwOFhcbiIsIHR5cGUpKTsKLQl9CisJCWlmICh0eXBlID4gQUNQSV9UWVBFX0xPQ0FMX01BWCkgeworCQkJQUNQSV9SRVBPUlRfV0FSTklORygoIkludmFsaWQgQUNQSSBUeXBlICUwOFhcbiIsIHR5cGUpKTsKKwkJfQogCi0JaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSAodGhpc19ub2RlLT5uYW1lLmludGVnZXIpKSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW52YWxpZCBBQ1BJIE5hbWUgJTA4WFxuIiwKLQkJCXRoaXNfbm9kZS0+bmFtZS5pbnRlZ2VyKSk7CisJCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUodGhpc19ub2RlLT5uYW1lLmludGVnZXIpKSB7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW52YWxpZCBBQ1BJIE5hbWUgJTA4WFxuIiwKKwkJCQkJICAgICB0aGlzX25vZGUtPm5hbWUuaW50ZWdlcikpOworCQl9CisKKwkJYWNwaV9vc19wcmludGYoIiU0LjRzIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHRoaXNfbm9kZSkpOwogCX0KIAogCS8qCiAJICogTm93IHdlIGNhbiBwcmludCBvdXQgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbgogCSAqLwotCWFjcGlfb3NfcHJpbnRmICgiJTQuNHMgJS0xMnMgJXAgIiwKLQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAodGhpc19ub2RlKSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwgdGhpc19ub2RlKTsKKwlhY3BpX29zX3ByaW50ZigiICUtMTJzICVwICIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSwgdGhpc19ub2RlKTsKIAogCWRiZ19sZXZlbCA9IGFjcGlfZGJnX2xldmVsOwogCWFjcGlfZGJnX2xldmVsID0gMDsKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAodGhpc19ub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCh0aGlzX25vZGUpOwogCWFjcGlfZGJnX2xldmVsID0gZGJnX2xldmVsOwogCi0Jc3dpdGNoIChpbmZvLT5kaXNwbGF5X3R5cGUpIHsKKwlzd2l0Y2ggKGluZm8tPmRpc3BsYXlfdHlwZSAmIEFDUElfRElTUExBWV9NQVNLKSB7CiAJY2FzZSBBQ1BJX0RJU1BMQVlfU1VNTUFSWToKIAogCQlpZiAoIW9ial9kZXNjKSB7CiAJCQkvKiBObyBhdHRhY2hlZCBvYmplY3QsIHdlIGFyZSBkb25lICovCiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIAogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIklEICVYIExlbiAlLjRYIEFkZHIgJXBcbiIsCi0JCQkJb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkLCBvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCwKLQkJCQkoY2hhciAqKSBvYmpfZGVzYy0+cHJvY2Vzc29yLmFkZHJlc3MpOworCQkJYWNwaV9vc19wcmludGYoIklEICVYIExlbiAlLjRYIEFkZHIgJXBcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGgsCisJCQkJICAgICAgIChjaGFyICopb2JqX2Rlc2MtPnByb2Nlc3Nvci5hZGRyZXNzKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIk5vdGlmeSBPYmplY3Q6ICVwXG4iLCBvYmpfZGVzYyk7CisJCQlhY3BpX29zX3ByaW50ZigiTm90aWZ5IE9iamVjdDogJXBcbiIsIG9ial9kZXNjKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIkFyZ3MgJVggTGVuICUuNFggQW1sICVwXG4iLAotCQkJCSh1MzIpIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCi0JCQkJb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCk7CisJCQlhY3BpX29zX3ByaW50ZigiQXJncyAlWCBMZW4gJS40WCBBbWwgJXBcbiIsCisJCQkJICAgICAgICh1MzIpIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIj0gJTguOFglOC44WFxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCQlhY3BpX29zX3ByaW50ZigiPSAlOC44WCU4LjhYXG4iLAorCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIuCisJCQkJCQkJICB2YWx1ZSkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCiAJCQlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJFbGVtZW50cyAlLjJYXG4iLAotCQkJCQlvYmpfZGVzYy0+cGFja2FnZS5jb3VudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIltMZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiRWxlbWVudHMgJS4yWFxuIiwKKwkJCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaV9vc19wcmludGYoIltMZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCQlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJMZW4gJS4yWCIsCi0JCQkJCQkgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkJCWFjcGlfb3NfcHJpbnRmKCJMZW4gJS4yWCIsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAKIAkJCQkvKiBEdW1wIHNvbWUgb2YgdGhlIGJ1ZmZlciAqLwogCiAJCQkJaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoID4gMCkgewotCQkJCQlhY3BpX29zX3ByaW50ZiAoIiA9Iik7Ci0JCQkJCWZvciAoaSA9IDA7IChpIDwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggJiYgaSA8IDEyKTsgaSsrKSB7Ci0JCQkJCQlhY3BpX29zX3ByaW50ZiAoIiAlLjJoWCIsIG9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpXSk7CisJCQkJCWFjcGlfb3NfcHJpbnRmKCIgPSIpOworCQkJCQlmb3IgKGkgPSAwOworCQkJCQkgICAgIChpIDwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgKKwkJCQkJICAgICAgJiYgaSA8IDEyKTsgaSsrKSB7CisJCQkJCQlhY3BpX29zX3ByaW50ZigiICUuMmhYIiwKKwkJCQkJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci4KKwkJCQkJCQkgICAgICAgcG9pbnRlcltpXSk7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCJbTGVuZ3RoIG5vdCB5ZXQgZXZhbHVhdGVkXVxuIik7CisJCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmKCJbTGVuZ3RoIG5vdCB5ZXQgZXZhbHVhdGVkXVxuIik7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQkJYWNwaV9vc19wcmludGYgKCJMZW4gJS4yWCAiLCBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCk7Ci0JCQlhY3BpX3V0X3ByaW50X3N0cmluZyAob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCAzMik7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJCQlhY3BpX29zX3ByaW50ZigiTGVuICUuMlggIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOworCQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCAzMik7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlslc10iLAotCQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSk7CisJCQlhY3BpX29zX3ByaW50ZigiWyVzXSIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKG9ial9kZXNjLT5yZWdpb24uCisJCQkJCQkJICAgICAgIHNwYWNlX2lkKSk7CiAJCQlpZiAob2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIgQWRkciAlOC44WCU4LjhYIExlbiAlLjRYXG4iLAotCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyksCi0JCQkJCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiIFtBZGRyZXNzL0xlbmd0aCBub3QgeWV0IGV2YWx1YXRlZF1cbiIpOworCQkJCWFjcGlfb3NfcHJpbnRmKCIgQWRkciAlOC44WCU4LjhYIExlbiAlLjRYXG4iLAorCQkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT4KKwkJCQkJCQkJICByZWdpb24uCisJCQkJCQkJCSAgYWRkcmVzcyksCisJCQkJCSAgICAgICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmCisJCQkJICAgICgiIFtBZGRyZXNzL0xlbmd0aCBub3QgeWV0IGV2YWx1YXRlZF1cbiIpOwogCQkJfQogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiWyVzXVxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCJbJXNdXG4iLAorCQkJCSAgICAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICAgIHJlZmVyZW5jZS4KKwkJCQkJCQkgICAgICAgb3Bjb2RlKSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAogCQkJaWYgKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiAmJgotCQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iai0+YnVmZmVyLm5vZGUpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIkJ1ZiBbJTQuNHNdIiwKLQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmotPmJ1ZmZlci5ub2RlKSk7CisJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqLT5idWZmZXIubm9kZSkgeworCQkJCWFjcGlfb3NfcHJpbnRmKCJCdWYgWyU0LjRzXSIsCisJCQkJCSAgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPgorCQkJCQkJCQkgICAgIGJ1ZmZlcl9maWVsZC4KKwkJCQkJCQkJICAgICBidWZmZXJfb2JqLT4KKwkJCQkJCQkJICAgICBidWZmZXIuCisJCQkJCQkJCSAgICAgbm9kZSkpOwogCQkJfQogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiUmduIFslNC40c10iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqLT5yZWdpb24ubm9kZSkpOworCQkJYWNwaV9vc19wcmludGYoIlJnbiBbJTQuNHNdIiwKKwkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC4KKwkJCQkJCQkgICAgIHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCQkgICAgIG5vZGUpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJSZ24gWyU0LjRzXSBCbmsgWyU0LjRzXSIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKSwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqLT5jb21tb25fZmllbGQubm9kZSkpOworCQkJYWNwaV9vc19wcmludGYoIlJnbiBbJTQuNHNdIEJuayBbJTQuNHNdIiwKKwkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC4KKwkJCQkJCQkgICAgIHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCQkgICAgIG5vZGUpLAorCQkJCSAgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgYmFua19maWVsZC4KKwkJCQkJCQkgICAgIGJhbmtfb2JqLT4KKwkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC4KKwkJCQkJCQkgICAgIG5vZGUpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiSWR4IFslNC40c10gRGF0IFslNC40c10iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iai0+Y29tbW9uX2ZpZWxkLm5vZGUpLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqLT5jb21tb25fZmllbGQubm9kZSkpOworCQkJYWNwaV9vc19wcmludGYoIklkeCBbJTQuNHNdIERhdCBbJTQuNHNdIiwKKwkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkgICAgIGluZGV4X2ZpZWxkLgorCQkJCQkJCSAgICAgaW5kZXhfb2JqLT4KKwkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC5ub2RlKSwKKwkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KKwkJCQkJCQkgICAgIGluZGV4X2ZpZWxkLgorCQkJCQkJCSAgICAgZGF0YV9vYmotPgorCQkJCQkJCSAgICAgY29tbW9uX2ZpZWxkLgorCQkJCQkJCSAgICAgbm9kZSkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9BTElBUzoKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOgogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlRhcmdldCAlNC40cyAoJXApXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MpLCBvYmpfZGVzYyk7CisJCQlhY3BpX29zX3ByaW50ZigiVGFyZ2V0ICU0LjRzICglcClcbiIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYyksCisJCQkJICAgICAgIG9ial9kZXNjKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiT2JqZWN0ICVwXG4iLCBvYmpfZGVzYyk7CisJCQlhY3BpX29zX3ByaW50ZigiT2JqZWN0ICVwXG4iLCBvYmpfZGVzYyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0zOTIsMTEgKzM5NiwxNSBAQAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQkJYWNwaV9vc19wcmludGYgKCIgT2ZmICUuM1ggTGVuICUuMlggQWNjICUuMmhkXG4iLAotCQkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKiA4KQotCQkJCQkrIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CisJCQlhY3BpX29zX3ByaW50ZigiIE9mZiAlLjNYIExlbiAlLjJYIEFjYyAlLjJoZFxuIiwKKwkJCQkgICAgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCWJhc2VfYnl0ZV9vZmZzZXQgKiA4KQorCQkJCSAgICAgICArCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJICAgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkgICAgICAgYWNjZXNzX2J5dGVfd2lkdGgpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTQwNCw1NiArNDEyLDU1IEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9ESVNQTEFZX09CSkVDVFM6CiAKLQkJYWNwaV9vc19wcmludGYgKCJPOiVwIiwgb2JqX2Rlc2MpOworCQlhY3BpX29zX3ByaW50ZigiTzolcCIsIG9ial9kZXNjKTsKIAkJaWYgKCFvYmpfZGVzYykgewogCQkJLyogTm8gYXR0YWNoZWQgb2JqZWN0LCB3ZSBhcmUgZG9uZSAqLwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIoUiVkKSIsIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKKwkJYWNwaV9vc19wcmludGYoIihSJWQpIiwgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKIAkJCS8qIE5hbWUgaXMgYSBNZXRob2QgYW5kIGl0cyBBTUwgb2Zmc2V0L2xlbmd0aCBhcmUgc2V0ICovCiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiIE06JXAtJVhcbiIsIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAotCQkJCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CisJCQlhY3BpX29zX3ByaW50ZigiIE06JXAtJVhcbiIsIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQkJYWNwaV9vc19wcmludGYgKCIgSTolOC44WDguOCVYXG4iLAotCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCQlhY3BpX29zX3ByaW50ZigiIEk6JTguOFg4LjglWFxuIiwKKwkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5pbnRlZ2VyLgorCQkJCQkJCSAgdmFsdWUpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQkJYWNwaV9vc19wcmludGYgKCIgUzolcC0lWFxuIiwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJCQkgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgUzolcC0lWFxuIiwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgICBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiIEI6JXAtJVhcbiIsIG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCQkJICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CisJCQlhY3BpX29zX3ByaW50ZigiIEI6JXAtJVhcbiIsIG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAotCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYgKCJcbiIpOworCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00NjMsNjEgKzQ3MCw1OCBAQAogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKLQogCS8qIElmIHRoZXJlIGlzIGFuIGF0dGFjaGVkIG9iamVjdCwgZGlzcGxheSBpdCAqLwogCi0JZGJnX2xldmVsICAgID0gYWNwaV9kYmdfbGV2ZWw7CisJZGJnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7CiAJYWNwaV9kYmdfbGV2ZWwgPSAwOwotCW9ial9kZXNjICAgICA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAodGhpc19ub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCh0aGlzX25vZGUpOwogCWFjcGlfZGJnX2xldmVsID0gZGJnX2xldmVsOwogCiAJLyogRHVtcCBhdHRhY2hlZCBvYmplY3RzICovCiAKIAl3aGlsZSAob2JqX2Rlc2MpIHsKIAkJb2JqX3R5cGUgPSBBQ1BJX1RZUEVfSU5WQUxJRDsKLQkJYWNwaV9vc19wcmludGYgKCIgICAgICBBdHRhY2hlZCBPYmplY3QgJXA6ICIsIG9ial9kZXNjKTsKKwkJYWNwaV9vc19wcmludGYoIkF0dGFjaGVkIE9iamVjdCAlcDogIiwgb2JqX2Rlc2MpOwogCiAJCS8qIERlY29kZSB0aGUgdHlwZSBvZiBhdHRhY2hlZCBvYmplY3QgYW5kIGR1bXAgdGhlIGNvbnRlbnRzICovCiAKLQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSkgeworCQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKIAotCQkJYWNwaV9vc19wcmludGYgKCIoUHRyIHRvIE5vZGUpXG4iKTsKLQkJCWJ5dGVzX3RvX2R1bXAgPSBzaXplb2YgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIoUHRyIHRvIE5vZGUpXG4iKTsKKwkJCWJ5dGVzX3RvX2R1bXAgPSBzaXplb2Yoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpOworCQkJQUNQSV9EVU1QX0JVRkZFUihvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9ERVNDX1RZUEVfT1BFUkFORDoKIAotCQkJb2JqX3R5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpOworCQkJb2JqX3R5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7CiAKIAkJCWlmIChvYmpfdHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIihQdHIgdG8gQUNQSSBPYmplY3QgdHlwZSAlWCBbVU5LTk9XTl0pXG4iLAotCQkJCQlvYmpfdHlwZSk7CisJCQkJYWNwaV9vc19wcmludGYKKwkJCQkgICAgKCIoUHRyIHRvIEFDUEkgT2JqZWN0IHR5cGUgJVggW1VOS05PV05dKVxuIiwKKwkJCQkgICAgIG9ial90eXBlKTsKIAkJCQlieXRlc190b19kdW1wID0gMzI7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmCisJCQkJICAgICgiKFB0ciB0byBBQ1BJIE9iamVjdCB0eXBlICVYIFslc10pXG4iLAorCQkJCSAgICAgb2JqX3R5cGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmpfdHlwZSkpOworCQkJCWJ5dGVzX3RvX2R1bXAgPQorCQkJCSAgICBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCk7CiAJCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIihQdHIgdG8gQUNQSSBPYmplY3QgdHlwZSAlcywgJVgpXG4iLAotCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG9ial90eXBlKSwgb2JqX3R5cGUpOwotCQkJCWJ5dGVzX3RvX2R1bXAgPSBzaXplb2YgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpOwotCQkJfQotCQkJYnJlYWs7CiAKKwkJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIGJ5dGVzX3RvX2R1bXApOworCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAotCQkJYWNwaV9vc19wcmludGYgKAotCQkJCSIoU3RyaW5nIG9yIEJ1ZmZlciBwdHIgLSBub3QgYW4gb2JqZWN0IGRlc2NyaXB0b3IpIFslc11cbiIsCi0JCQkJYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChvYmpfZGVzYykpOwotCQkJYnl0ZXNfdG9fZHVtcCA9IDE2OwogCQkJYnJlYWs7CiAJCX0KIAotCQlBQ1BJX0RVTVBfQlVGRkVSIChvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7Ci0KIAkJLyogSWYgdmFsdWUgaXMgTk9UIGFuIGludGVybmFsIG9iamVjdCwgd2UgYXJlIGRvbmUgKi8KIAotCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPQorCQkgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKQEAgLTUyNSw1MSArNTI5LDU2IEBACiAJCSAqIFZhbGlkIG9iamVjdCwgZ2V0IHRoZSBwb2ludGVyIHRvIG5leHQgbGV2ZWwsIGlmIGFueQogCQkgKi8KIAkJc3dpdGNoIChvYmpfdHlwZSkgewotCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCQlvYmpfZGVzYyA9ICh2b2lkICopIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcjsKLQkJCWJyZWFrOwotCiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQkJCW9ial9kZXNjID0gKHZvaWQgKikgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQkJYnJlYWs7CisJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwkJCS8qCisJCQkgKiBOT1RFOiB0YWtlcyBhZHZhbnRhZ2Ugb2YgY29tbW9uIGZpZWxkcyBiZXR3ZWVuIHN0cmluZy9idWZmZXIKKwkJCSAqLworCQkJYnl0ZXNfdG9fZHVtcCA9IG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoOworCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5zdHJpbmcucG9pbnRlcjsKKwkJCWFjcGlfb3NfcHJpbnRmKCIoQnVmZmVyL1N0cmluZyBwb2ludGVyICVwIGxlbmd0aCAlWClcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLCBieXRlc190b19kdW1wKTsKKwkJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIGJ5dGVzX3RvX2R1bXApOworCQkJZ290byBjbGVhbnVwOwogCiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQkJCW9ial9kZXNjID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqOworCQkJb2JqX2Rlc2MgPQorCQkJICAgICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC4KKwkJCSAgICBidWZmZXJfb2JqOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKLQkJCW9ial9kZXNjID0gKHZvaWQgKikgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHM7CisJCQlvYmpfZGVzYyA9ICh2b2lkICopb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHM7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6Ci0JCQlvYmpfZGVzYyA9ICh2b2lkICopIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0OworCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0OwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKSBvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iajsKKwkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iajsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6Ci0JCQlvYmpfZGVzYyA9ICh2b2lkICopIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmo7CisJCQlvYmpfZGVzYyA9ICh2b2lkICopb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iajsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKSBvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqOworCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmo7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKLQkJb2JqX3R5cGUgPSBBQ1BJX1RZUEVfSU5WQUxJRDsgIC8qIFRlcm1pbmF0ZSBsb29wIGFmdGVyIG5leHQgcGFzcyAqLworCQlvYmpfdHlwZSA9IEFDUElfVFlQRV9JTlZBTElEOwkvKiBUZXJtaW5hdGUgbG9vcCBhZnRlciBuZXh0IHBhc3MgKi8KIAl9CiAKLWNsZWFudXA6Ci0JYWNwaV9vc19wcmludGYgKCJcbiIpOworICAgICAgY2xlYW51cDoKKwlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTkxLDI5ICs2MDAsMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfZHVtcF9vYmplY3RzICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3R5cGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVwdGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcl9pZCwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSkKK2FjcGlfbnNfZHVtcF9vYmplY3RzKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgICB1OCBkaXNwbGF5X3R5cGUsCisJCSAgICAgdTMyIG1heF9kZXB0aCwKKwkJICAgICBhY3BpX293bmVyX2lkIG93bmVyX2lkLCBhY3BpX2hhbmRsZSBzdGFydF9oYW5kbGUpCiB7Ci0Jc3RydWN0IGFjcGlfd2Fsa19pbmZvICAgICAgICAgICBpbmZvOworCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyBpbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaW5mby5kZWJ1Z19sZXZlbCA9IEFDUElfTFZfVEFCTEVTOwogCWluZm8ub3duZXJfaWQgPSBvd25lcl9pZDsKIAlpbmZvLmRpc3BsYXlfdHlwZSA9IGRpc3BsYXlfdHlwZTsKIAotCSh2b2lkKSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICh0eXBlLCBzdGFydF9oYW5kbGUsIG1heF9kZXB0aCwKLQkJCSBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLCBhY3BpX25zX2R1bXBfb25lX29iamVjdCwKLQkJCSAodm9pZCAqKSAmaW5mbywgTlVMTCk7CisJKHZvaWQpYWNwaV9uc193YWxrX25hbWVzcGFjZSh0eXBlLCBzdGFydF9oYW5kbGUsIG1heF9kZXB0aCwKKwkJCQkgICAgIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssCisJCQkJICAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdCwgKHZvaWQgKikmaW5mbywKKwkJCQkgICAgIE5VTEwpOwogfQotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCi0KKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyOCwyNiArNjMzLDIwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9uc19kdW1wX2VudHJ5ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2xldmVsKQordm9pZCBhY3BpX25zX2R1bXBfZW50cnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZGVidWdfbGV2ZWwpCiB7Ci0Jc3RydWN0IGFjcGlfd2Fsa19pbmZvICAgICAgICAgICBpbmZvOworCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyBpbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaW5mby5kZWJ1Z19sZXZlbCA9IGRlYnVnX2xldmVsOwotCWluZm8ub3duZXJfaWQgPSBBQ1BJX1VJTlQzMl9NQVg7CisJaW5mby5vd25lcl9pZCA9IEFDUElfT1dORVJfSURfTUFYOwogCWluZm8uZGlzcGxheV90eXBlID0gQUNQSV9ESVNQTEFZX1NVTU1BUlk7CiAKLQkodm9pZCkgYWNwaV9uc19kdW1wX29uZV9vYmplY3QgKGhhbmRsZSwgMSwgJmluZm8sIE5VTEwpOworCSh2b2lkKWFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0KGhhbmRsZSwgMSwgJmluZm8sIE5VTEwpOwogfQogCi0KLSNpZmRlZiBfQUNQSV9BU0xfQ09NUElMRVIKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3RhYmxlcwpAQCAtNjYzLDIzICs2NjIsMTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2R1bXBfdGFibGVzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9iYXNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoKQordm9pZCBhY3BpX25zX2R1bXBfdGFibGVzKGFjcGlfaGFuZGxlIHNlYXJjaF9iYXNlLCB1MzIgbWF4X2RlcHRoKQogewotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX2hhbmRsZSA9IHNlYXJjaF9iYXNlOworCWFjcGlfaGFuZGxlIHNlYXJjaF9oYW5kbGUgPSBzZWFyY2hfYmFzZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2R1bXBfdGFibGVzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kdW1wX3RhYmxlcyIpOwogCiAJaWYgKCFhY3BpX2dibF9yb290X25vZGUpIHsKIAkJLyoKIAkJICogSWYgdGhlIG5hbWUgc3BhY2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLAogCQkgKiB0aGVyZSBpcyBub3RoaW5nIHRvIGR1bXAuCiAJCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJuYW1lc3BhY2Ugbm90IGluaXRpYWxpemVkIVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCQkgICJuYW1lc3BhY2Ugbm90IGluaXRpYWxpemVkIVxuIikpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKQEAgLTY4NywxMiArNjgyLDEyIEBACiAJCS8qIEVudGlyZSBuYW1lc3BhY2UgKi8KIAogCQlzZWFyY2hfaGFuZGxlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJcXFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywgIlxcXG4iKSk7CiAJfQogCi0JYWNwaV9uc19kdW1wX29iamVjdHMgKEFDUElfVFlQRV9BTlksIEFDUElfRElTUExBWV9PQkpFQ1RTLCBtYXhfZGVwdGgsCi0JCQlBQ1BJX1VJTlQzMl9NQVgsIHNlYXJjaF9oYW5kbGUpOworCWFjcGlfbnNfZHVtcF9vYmplY3RzKEFDUElfVFlQRV9BTlksIEFDUElfRElTUExBWV9PQkpFQ1RTLCBtYXhfZGVwdGgsCisJCQkgICAgIEFDUElfT1dORVJfSURfTUFYLCBzZWFyY2hfaGFuZGxlKTsKIAlyZXR1cm5fVk9JRDsKIH0KLSNlbmRpZgkvKiBfQUNQSV9BU0xfQ09NUElMRVIgKi8KLSNlbmRpZgkvKiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpICovCisjZW5kaWYJCQkJLyogX0FDUElfQVNMX0NPTVBJTEVSICovCisjZW5kaWYJCQkJLyogZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCmluZGV4IDI3YzRmN2MuLjU1ZGU4ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKQEAgLTQxLDIwICs0MSwxNSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCi0KIC8qIFRCRDogVGhpcyBlbnRpcmUgbW9kdWxlIGlzIGFwcGFyZW50bHkgb2Jzb2xldGUgYW5kIHNob3VsZCBiZSByZW1vdmVkICovCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNkdW1wZHYiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc2R1bXBkdiIpCiAjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCi0KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlCkBAIC03MCw0NCArNjUsMzkgQEAKICAqICAgICAgICAgICAgICBUaGlzIHByb2NlZHVyZSBpcyBhIHVzZXJfZnVuY3Rpb24gY2FsbGVkIGJ5IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2R1bXBfb25lX2RldmljZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKQorYWNwaV9uc19kdW1wX29uZV9kZXZpY2UoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgIGJ1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAgICAgICAgICppbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgaTsKIAorCUFDUElfRlVOQ1RJT05fTkFNRSgibnNfZHVtcF9vbmVfZGV2aWNlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJuc19kdW1wX29uZV9kZXZpY2UiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV9uc19kdW1wX29uZV9vYmplY3QgKG9ial9oYW5kbGUsIGxldmVsLCBjb250ZXh0LCByZXR1cm5fdmFsdWUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0KG9ial9oYW5kbGUsIGxldmVsLCBjb250ZXh0LCByZXR1cm5fdmFsdWUpOwogCiAJYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOwotCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvIChvYmpfaGFuZGxlLCAmYnVmZmVyKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8ob2JqX2hhbmRsZSwgJmJ1ZmZlcik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWluZm8gPSBidWZmZXIucG9pbnRlcjsKIAkJZm9yIChpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9UQUJMRVMsICIgIikpOworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfVEFCTEVTLCAiICIpKTsKIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9UQUJMRVMsCi0JCQkiICAgIEhJRDogJXMsIEFEUjogJTguOFglOC44WCwgU3RhdHVzOiAlWFxuIiwKLQkJCWluZm8tPmhhcmR3YXJlX2lkLnZhbHVlLCBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGluZm8tPmFkZHJlc3MpLAotCQkJaW5mby0+Y3VycmVudF9zdGF0dXMpKTsKLQkJQUNQSV9NRU1fRlJFRSAoaW5mbyk7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX1RBQkxFUywKKwkJCQkgICAgICAiICAgIEhJRDogJXMsIEFEUjogJTguOFglOC44WCwgU3RhdHVzOiAlWFxuIiwKKwkJCQkgICAgICBpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZSwKKwkJCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5mby0+YWRkcmVzcyksCisJCQkJICAgICAgaW5mby0+Y3VycmVudF9zdGF0dXMpKTsKKwkJQUNQSV9NRU1fRlJFRShpbmZvKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcwpAQCAtMTIwLDE2ICsxMTAsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICgKLQl2b2lkKQordm9pZCBhY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzKHZvaWQpCiB7Ci0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzeXNfYnVzX2hhbmRsZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX2hhbmRsZSBzeXNfYnVzX2hhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoIm5zX2R1bXBfcm9vdF9kZXZpY2VzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2R1bXBfcm9vdF9kZXZpY2VzIik7CiAKIAkvKiBPbmx5IGR1bXAgdGhlIHRhYmxlIGlmIHRyYWNpbmcgaXMgZW5hYmxlZCAqLwogCkBAIC0xMzgsMTkgKzEyNCwxNyBAQAogCX0KIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBBQ1BJX05TX1NZU1RFTV9CVVMsICZzeXNfYnVzX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm47CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLAotCQkiRGlzcGxheSBvZiBhbGwgZGV2aWNlcyBpbiB0aGUgbmFtZXNwYWNlOlxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAorCQkJICAiRGlzcGxheSBvZiBhbGwgZGV2aWNlcyBpbiB0aGUgbmFtZXNwYWNlOlxuIikpOwogCi0Jc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX0RFVklDRSwgc3lzX2J1c19oYW5kbGUsCi0JCQkgQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAotCQkJIGFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlLCBOVUxMLCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIHN5c19idXNfaGFuZGxlLAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssCisJCQkJCWFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlLCBOVUxMLCBOVUxMKTsKIH0KIAogI2VuZGlmCiAjZW5kaWYKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYwppbmRleCAxYWU4OWExLi4wMTkxYzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKQEAgLTQyLDI2ICs0MiwxOSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNldmFsIikKK0FDUElfTU9EVUxFX05BTUUoIm5zZXZhbCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOworYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9vYmplY3RfdmFsdWUgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOwotCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04NSw0OCArNzgsNDQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQorYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShjaGFyICpwYXRobmFtZSwgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSA9IE5VTEw7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc2NvcGVfaW5mbzsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9wYXRoID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUgPSBOVUxMOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbzsKKwljaGFyICppbnRlcm5hbF9wYXRoID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2V2YWx1YXRlX3JlbGF0aXZlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19ldmFsdWF0ZV9yZWxhdGl2ZSIpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBvYmplY3QgaGFuZGxlCiAJICovCiAJaWYgKCFpbmZvIHx8ICFpbmZvLT5ub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBCdWlsZCBhbiBpbnRlcm5hbCBuYW1lIHN0cmluZyBmb3IgdGhlIG1ldGhvZCAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lIChwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZShwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzY29wZV9pbmZvID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoKTsKKwlzY29wZV9pbmZvID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOwogCWlmICghc2NvcGVfaW5mbykgewogCQlnb3RvIGNsZWFudXAxOwogCX0KIAogCS8qIEdldCB0aGUgcHJlZml4IGhhbmRsZSBhbmQgTm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCWluZm8tPm5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoaW5mby0+bm9kZSk7CisJaW5mby0+bm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGluZm8tPm5vZGUpOwogCWlmICghaW5mby0+bm9kZSkgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTEzNCwzOSArMTIzLDM4IEBACiAJLyogTG9va3VwIHRoZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgKi8KIAogCXNjb3BlX2luZm8tPnNjb3BlLm5vZGUgPSBpbmZvLT5ub2RlOwotCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwIChzY29wZV9pbmZvLCBpbnRlcm5hbF9wYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwKLQkJCSAmbm9kZSk7CisJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoc2NvcGVfaW5mbywgaW50ZXJuYWxfcGF0aCwgQUNQSV9UWVBFX0FOWSwKKwkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsIE5VTEwsCisJCQkJJm5vZGUpOwogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICJPYmplY3QgWyVzXSBub3QgZm91bmQgWyVzXVxuIiwKLQkJCXBhdGhuYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywgIk9iamVjdCBbJXNdIG5vdCBmb3VuZCBbJXNdXG4iLAorCQkJCSAgcGF0aG5hbWUsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlIGhhdmUgYSBoYW5kbGUgdG8gdGhlIG9iamVjdCwgd2UgY2FuIGF0dGVtcHQgdG8gZXZhbHVhdGUgaXQuCiAJICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLAotCQlwYXRobmFtZSwgbm9kZSwgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLAorCQkJICBwYXRobmFtZSwgbm9kZSwgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKSk7CiAKIAlpbmZvLT5ub2RlID0gbm9kZTsKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoaW5mbyk7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUoaW5mbyk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywgIioqKiBDb21wbGV0ZWQgZXZhbCBvZiBvYmplY3QgJXMgKioqXG4iLAotCQlwYXRobmFtZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkgICIqKiogQ29tcGxldGVkIGV2YWwgb2Ygb2JqZWN0ICVzICoqKlxuIiwgcGF0aG5hbWUpKTsKIAotY2xlYW51cDoKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChzY29wZV9pbmZvKTsKKyAgICAgIGNsZWFudXA6CisJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZV9pbmZvKTsKIAotY2xlYW51cDE6Ci0JQUNQSV9NRU1fRlJFRSAoaW50ZXJuYWxfcGF0aCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworICAgICAgY2xlYW51cDE6CisJQUNQSV9NRU1fRlJFRShpbnRlcm5hbF9wYXRoKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUKQEAgLTE4OSw2OCArMTc3LDYzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQorYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lKGNoYXIgKnBhdGhuYW1lLCBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9wYXRoID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJY2hhciAqaW50ZXJuYWxfcGF0aCA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19ldmFsdWF0ZV9ieV9uYW1lIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19ldmFsdWF0ZV9ieV9uYW1lIik7CiAKIAkvKiBCdWlsZCBhbiBpbnRlcm5hbCBuYW1lIHN0cmluZyBmb3IgdGhlIG1ldGhvZCAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lIChwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZShwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogTG9va3VwIHRoZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwIChOVUxMLCBpbnRlcm5hbF9wYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwKLQkJCSAmaW5mby0+bm9kZSk7CisJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoTlVMTCwgaW50ZXJuYWxfcGF0aCwgQUNQSV9UWVBFX0FOWSwKKwkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsIE5VTEwsCisJCQkJJmluZm8tPm5vZGUpOwogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCQkiT2JqZWN0IGF0IFslc10gd2FzIG5vdCBmb3VuZCwgc3RhdHVzPSUuNFhcbiIsCi0JCQlwYXRobmFtZSwgc3RhdHVzKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJICAiT2JqZWN0IGF0IFslc10gd2FzIG5vdCBmb3VuZCwgc3RhdHVzPSUuNFhcbiIsCisJCQkJICBwYXRobmFtZSwgc3RhdHVzKSk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlIGhhdmUgYSBoYW5kbGUgdG8gdGhlIG9iamVjdCwgd2UgY2FuIGF0dGVtcHQgdG8gZXZhbHVhdGUgaXQuCiAJICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLAotCQlwYXRobmFtZSwgaW5mby0+bm9kZSwgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5ub2RlKSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLAorCQkJICBwYXRobmFtZSwgaW5mby0+bm9kZSwKKwkJCSAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPm5vZGUpKSk7CiAKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoaW5mbyk7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUoaW5mbyk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywgIioqKiBDb21wbGV0ZWQgZXZhbCBvZiBvYmplY3QgJXMgKioqXG4iLAotCQlwYXRobmFtZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkgICIqKiogQ29tcGxldGVkIGV2YWwgb2Ygb2JqZWN0ICVzICoqKlxuIiwgcGF0aG5hbWUpKTsKIAotCi1jbGVhbnVwOgorICAgICAgY2xlYW51cDoKIAogCS8qIENsZWFudXAgKi8KIAogCWlmIChpbnRlcm5hbF9wYXRoKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGludGVybmFsX3BhdGgpOworCQlBQ1BJX01FTV9GUkVFKGludGVybmFsX3BhdGgpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZQpAQCAtMjc1LDI2ICsyNTgsMjIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pCithY3BpX3N0YXR1cyBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19ldmFsdWF0ZV9ieV9oYW5kbGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2V2YWx1YXRlX2J5X2hhbmRsZSIpOwogCiAJLyogQ2hlY2sgaWYgbmFtZXNwYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCiAKIAlpZiAoIWFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX05BTUVTUEFDRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19OQU1FU1BBQ0UpOwogCX0KIAogCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCiAKIAlpZiAoIWluZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIHJldHVybiB2YWx1ZSB0byBhbiBpbnZhbGlkIG9iamVjdCAqLwpAQCAtMzAzLDIzICsyODIsMjUgQEAKIAogCS8qIEdldCB0aGUgcHJlZml4IGhhbmRsZSBhbmQgTm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlpbmZvLT5ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGluZm8tPm5vZGUpOworCWluZm8tPm5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShpbmZvLT5ub2RlKTsKIAlpZiAoIWluZm8tPm5vZGUpIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgogCSAqIEZvciBhIG1ldGhvZCBhbGlhcywgd2UgbXVzdCBncmFiIHRoZSBhY3R1YWwgbWV0aG9kIG5vZGUgc28gdGhhdCBwcm9wZXIKIAkgKiBzY29waW5nIGNvbnRleHQgd2lsbCBiZSBlc3RhYmxpc2hlZCBiZWZvcmUgZXhlY3V0aW9uLgogCSAqLwotCWlmIChhY3BpX25zX2dldF90eXBlIChpbmZvLT5ub2RlKSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7Ci0JCWluZm8tPm5vZGUgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgaW5mby0+bm9kZS0+b2JqZWN0KTsKKwlpZiAoYWNwaV9uc19nZXRfdHlwZShpbmZvLT5ub2RlKSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7CisJCWluZm8tPm5vZGUgPQorCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkgIGluZm8tPm5vZGUtPm9iamVjdCk7CiAJfQogCiAJLyoKQEAgLTMyOSwxNyArMzEwLDE2IEBACiAJICoKIAkgKiBJbiBib3RoIGNhc2VzLCB0aGUgbmFtZXNwYWNlIGlzIHVubG9ja2VkIGJ5IHRoZSBhY3BpX25zKiBwcm9jZWR1cmUKIAkgKi8KLQlpZiAoYWNwaV9uc19nZXRfdHlwZSAoaW5mby0+bm9kZSkgPT0gQUNQSV9UWVBFX01FVEhPRCkgeworCWlmIChhY3BpX25zX2dldF90eXBlKGluZm8tPm5vZGUpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKIAkJLyoKIAkJICogQ2FzZSAxKSBXZSBoYXZlIGFuIGFjdHVhbCBjb250cm9sIG1ldGhvZCB0byBleGVjdXRlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKGluZm8pOwotCX0KLQllbHNlIHsKKwkJc3RhdHVzID0gYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kKGluZm8pOworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIENhc2UgMikgT2JqZWN0IGlzIE5PVCBhIG1ldGhvZCwganVzdCByZXR1cm4gaXRzIGN1cnJlbnQgdmFsdWUKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZSAoaW5mbyk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X29iamVjdF92YWx1ZShpbmZvKTsKIAl9CiAKIAkvKgpAQCAtMzU1LDE2ICszMzUsMTYgQEAKIAkgKiBOYW1lc3BhY2Ugd2FzIHVubG9ja2VkIGJ5IHRoZSBoYW5kbGluZyBhY3BpX25zKiBmdW5jdGlvbiwgc28gd2UKIAkgKiBqdXN0IHJldHVybgogCSAqLwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QKICAqCiAgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgogICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIE1ldGhvZCBvYmplY3QKICAqICAgICAgICAgICAgICAgICAgUGFyYW1ldGVycyAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiBQYXJhbXMgaXRzZWxmIG1heSBiZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG5vIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZC4KQEAgLTM4MywzMSArMzYzLDI5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbykKK2FjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kIik7CiAKIAkvKiBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgKi8KIAotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5ub2RlKTsKLQlpZiAoIW9ial9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gYXR0YWNoZWQgbWV0aG9kIG9iamVjdFxuIikpOworCWluZm8tPm9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPm5vZGUpOworCWlmICghaW5mby0+b2JqX2Rlc2MpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyBhdHRhY2hlZCBtZXRob2Qgb2JqZWN0XG4iKSk7CiAKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX09CSkVDVCk7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwogCX0KIAotCUFDUElfRFVNUF9QQVRITkFNRSAoaW5mby0+bm9kZSwgIkV4ZWN1dGUgTWV0aG9kOiIsCi0JCUFDUElfTFZfSU5GTywgX0NPTVBPTkVOVCk7CisJQUNQSV9EVU1QX1BBVEhOQU1FKGluZm8tPm5vZGUsICJFeGVjdXRlIE1ldGhvZDoiLAorCQkJICAgQUNQSV9MVl9JTkZPLCBfQ09NUE9ORU5UKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJNZXRob2QgYXQgQU1MIGFkZHJlc3MgJXAgTGVuZ3RoICVYXG4iLAotCQlvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCArIDEsIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCAtIDEpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJNZXRob2QgYXQgQU1MIGFkZHJlc3MgJXAgTGVuZ3RoICVYXG4iLAorCQkJICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCArIDEsCisJCQkgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCAtIDEpKTsKIAogCS8qCiAJICogVW5sb2NrIHRoZSBuYW1lc3BhY2UgYmVmb3JlIGV4ZWN1dGlvbi4gIFRoaXMgYWxsb3dzIG5hbWVzcGFjZSBhY2Nlc3MKQEAgLTQxNiwyNyArMzk0LDI2IEBACiAJICogaW50ZXJwcmV0ZXIgbG9ja3MgdG8gZW5zdXJlIHRoYXQgbm8gdGhyZWFkIGlzIHVzaW5nIHRoZSBwb3J0aW9uIG9mIHRoZQogCSAqIG5hbWVzcGFjZSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQuCiAJICovCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgogCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCB2aWEgdGhlIGludGVycHJldGVyLiAgVGhlIGludGVycHJldGVyIGlzIGxvY2tlZAogCSAqIGhlcmUgYmVmb3JlIGNhbGxpbmcgaW50byB0aGUgQU1MIHBhcnNlcgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3BzeF9leGVjdXRlIChpbmZvKTsKLQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKCk7CisJc3RhdHVzID0gYWNwaV9wc19leGVjdXRlX21ldGhvZChpbmZvKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUKQEAgLTQ1NCwxNiArNDMxLDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9vYmplY3RfdmFsdWUgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcmVzb2x2ZWRfbm9kZSA9IGluZm8tPm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlc29sdmVkX25vZGUgPSBpbmZvLT5ub2RlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZ2V0X29iamVjdF92YWx1ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZ2V0X29iamVjdF92YWx1ZSIpOwogCiAJLyoKIAkgKiBPYmplY3RzIHJlcXVpcmUgYWRkaXRpb25hbCByZXNvbHV0aW9uIHN0ZXBzIChlLmcuLCB0aGUgTm9kZSBtYXkgYmUgYQpAQCAtNDg2LDMyICs0NTksMzMgQEAKIAkgKgogCSAqIFdlIG11c3QgcmVsZWFzZSB0aGUgbmFtZXNwYWNlIGxvY2sgYmVmb3JlIGVudGVyaW5nIHRoZSBpbnRlcHJldGVyLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlICgmcmVzb2x2ZWRfbm9kZSwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSgmcmVzb2x2ZWRfbm9kZSwgTlVMTCk7CiAJCS8qCiAJCSAqIElmIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKCkgc3VjY2VlZGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdhcyBwbGFjZWQKIAkJICogaW4gcmVzb2x2ZWRfbm9kZS4KIAkJICovCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKKwkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXN0YXR1cyA9IEFFX0NUUkxfUkVUVVJOX1ZBTFVFOwogCQkJaW5mby0+cmV0dXJuX29iamVjdCA9IEFDUElfQ0FTVF9QVFIKLQkJCQkJICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCByZXNvbHZlZF9ub2RlKTsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLCAiUmV0dXJuaW5nIG9iamVjdCAlcCBbJXNdXG4iLAotCQkJCWluZm8tPnJldHVybl9vYmplY3QsCi0JCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby0+cmV0dXJuX29iamVjdCkpKTsKKwkJCSAgICAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgcmVzb2x2ZWRfbm9kZSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJSZXR1cm5pbmcgb2JqZWN0ICVwIFslc11cbiIsCisJCQkJCSAgaW5mby0+cmV0dXJuX29iamVjdCwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8tPgorCQkJCQkJCQkgICAgICAgcmV0dXJuX29iamVjdCkpKTsKIAkJfQogCX0KIAogCS8qIE5hbWVzcGFjZSBpcyB1bmxvY2tlZCAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYwppbmRleCAzNjI4MDJhLi4wYTA4ZDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKQEAgLTQxLDMxICs0MSwyMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zaW5pdCIpCitBQ1BJX01PRFVMRV9OQU1FKCJuc2luaXQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfaW5pdF9vbmVfb2JqZWN0KGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KK2FjcGlfbnNfaW5pdF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODAsNTIgKzcxLDQ4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9uc19pbml0aWFsaXplX29iamVjdHModm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAgICAgIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvIGluZm87CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19pbml0aWFsaXplX29iamVjdHMiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19pbml0aWFsaXplX29iamVjdHMiKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSIqKioqIFN0YXJ0aW5nIGluaXRpYWxpemF0aW9uIG9mIG5hbWVzcGFjZSBvYmplY3RzICoqKipcbiIpKTsKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwKLQkJIkNvbXBsZXRpbmcgUmVnaW9uL0ZpZWxkL0J1ZmZlci9QYWNrYWdlIGluaXRpYWxpemF0aW9uOiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKKwkJCSAgICAgICJDb21wbGV0aW5nIFJlZ2lvbi9GaWVsZC9CdWZmZXIvUGFja2FnZSBpbml0aWFsaXphdGlvbjoiKSk7CiAKIAkvKiBTZXQgYWxsIGluaXQgaW5mbyB0byB6ZXJvICovCiAKLQlBQ1BJX01FTVNFVCAoJmluZm8sIDAsIHNpemVvZiAoc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8pKTsKKwlBQ1BJX01FTVNFVCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvKSk7CiAKIAkvKiBXYWxrIGVudGlyZSBuYW1lc3BhY2UgZnJvbSB0aGUgc3VwcGxpZWQgcm9vdCAqLwogCi0Jc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZSAoQUNQSV9UWVBFX0FOWSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCSAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX25zX2luaXRfb25lX29iamVjdCwKLQkJCSAgJmluZm8sIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWQhICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX25zX2luaXRfb25lX29iamVjdCwKKwkJCQkgICAgICZpbmZvLCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9JTklULAotCQkiXG5Jbml0aWFsaXplZCAlaGQvJWhkIFJlZ2lvbnMgJWhkLyVoZCBGaWVsZHMgJWhkLyVoZCBCdWZmZXJzICVoZC8laGQgUGFja2FnZXMgKCVoZCBub2RlcylcbiIsCi0JCWluZm8ub3BfcmVnaW9uX2luaXQsIGluZm8ub3BfcmVnaW9uX2NvdW50LAotCQlpbmZvLmZpZWxkX2luaXQsICAgIGluZm8uZmllbGRfY291bnQsCi0JCWluZm8uYnVmZmVyX2luaXQsICAgaW5mby5idWZmZXJfY291bnQsCi0JCWluZm8ucGFja2FnZV9pbml0LCAgaW5mby5wYWNrYWdlX2NvdW50LCBpbmZvLm9iamVjdF9jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiXG5Jbml0aWFsaXplZCAlaGQvJWhkIFJlZ2lvbnMgJWhkLyVoZCBGaWVsZHMgJWhkLyVoZCBCdWZmZXJzICVoZC8laGQgUGFja2FnZXMgKCVoZCBub2RlcylcbiIsCisJCQkgICAgICBpbmZvLm9wX3JlZ2lvbl9pbml0LCBpbmZvLm9wX3JlZ2lvbl9jb3VudCwKKwkJCSAgICAgIGluZm8uZmllbGRfaW5pdCwgaW5mby5maWVsZF9jb3VudCwKKwkJCSAgICAgIGluZm8uYnVmZmVyX2luaXQsIGluZm8uYnVmZmVyX2NvdW50LAorCQkJICAgICAgaW5mby5wYWNrYWdlX2luaXQsIGluZm8ucGFja2FnZV9jb3VudCwKKwkJCSAgICAgIGluZm8ub2JqZWN0X2NvdW50KSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJIiVoZCBDb250cm9sIE1ldGhvZHMgZm91bmRcbiIsIGluZm8ubWV0aG9kX2NvdW50KSk7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCi0JCSIlaGQgT3AgUmVnaW9ucyBmb3VuZFxuIiwgaW5mby5vcF9yZWdpb25fY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiJWhkIENvbnRyb2wgTWV0aG9kcyBmb3VuZFxuIiwgaW5mby5tZXRob2RfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiJWhkIE9wIFJlZ2lvbnMgZm91bmRcbiIsIGluZm8ub3BfcmVnaW9uX2NvdW50KSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5pdGlhbGl6ZV9kZXZpY2VzCkBAIC0xNDIsMTYgKzEyOSwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfbnNfaW5pdGlhbGl6ZV9kZXZpY2VzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAgICBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvIGluZm87CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19pbml0aWFsaXplX2RldmljZXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luaXRpYWxpemVfZGV2aWNlcyIpOwogCiAJLyogSW5pdCBjb3VudGVycyAqLwogCkBAIC0xNTksMzQgKzE0MiwzNCBAQAogCWluZm8ubnVtX1NUQSA9IDA7CiAJaW5mby5udW1fSU5JID0gMDsKIAotCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9JTklULAotCQkiRXhlY3V0aW5nIGFsbCBEZXZpY2UgX1NUQSBhbmRfSU5JIG1ldGhvZHM6IikpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiRXhlY3V0aW5nIGFsbCBEZXZpY2UgX1NUQSBhbmRfSU5JIG1ldGhvZHM6IikpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBXYWxrIG5hbWVzcGFjZSBmb3IgYWxsIG9iamVjdHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkgIEFDUElfVUlOVDMyX01BWCwgVFJVRSwgYWNwaV9uc19pbml0X29uZV9kZXZpY2UsICZpbmZvLCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkJCUFDUElfVUlOVDMyX01BWCwgVFJVRSwKKwkJCQkJYWNwaV9uc19pbml0X29uZV9kZXZpY2UsICZpbmZvLCBOVUxMKTsKIAotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkISAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAid2Fsa19uYW1lc3BhY2UgZmFpbGVkISAlc1xuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsCi0JCSJcbiVoZCBEZXZpY2VzIGZvdW5kIGNvbnRhaW5pbmc6ICVoZCBfU1RBLCAlaGQgX0lOSSBtZXRob2RzXG4iLAotCQlpbmZvLmRldmljZV9jb3VudCwgaW5mby5udW1fU1RBLCBpbmZvLm51bV9JTkkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAorCQkJICAgICAgIlxuJWhkIERldmljZXMgZm91bmQgY29udGFpbmluZzogJWhkIF9TVEEsICVoZCBfSU5JIG1ldGhvZHNcbiIsCisJCQkgICAgICBpbmZvLmRldmljZV9jb3VudCwgaW5mby5udW1fU1RBLCBpbmZvLm51bV9JTkkpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luaXRfb25lX29iamVjdApAQCAtMjA4LDI4ICsxOTEsMjUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19pbml0X29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfbnNfaW5pdF9vbmVfb2JqZWN0KGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICAgICAgKmluZm8gPSAoc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKikgY29udGV4dDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAqaW5mbyA9CisJICAgIChzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyAqKWNvbnRleHQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUgPQorCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJuc19pbml0X29uZV9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgibnNfaW5pdF9vbmVfb2JqZWN0Iik7CiAKIAlpbmZvLT5vYmplY3RfY291bnQrKzsKIAogCS8qIEFuZCBldmVuIHRoZW4sIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYSBmZXcgb2JqZWN0IHR5cGVzICovCiAKLQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZSAob2JqX2hhbmRsZSk7Ci0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOworCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKG9ial9oYW5kbGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQpAQCAtMjY5LDggKzI0OSw4IEBACiAJLyoKIAkgKiBNdXN0IGxvY2sgdGhlIGludGVycHJldGVyIGJlZm9yZSBleGVjdXRpbmcgQU1MIGNvZGUKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKQEAgLTI4MiwyNSArMjYyLDI1IEBACiAJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCiAJCWluZm8tPm9wX3JlZ2lvbl9pbml0Kys7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMgKG9ial9kZXNjKTsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyhvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCiAJCWluZm8tPmZpZWxkX2luaXQrKzsKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyAob2JqX2Rlc2MpOworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKIAkJaW5mby0+YnVmZmVyX2luaXQrKzsKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAob2JqX2Rlc2MpOworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKG9ial9kZXNjKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCiAJCWluZm8tPnBhY2thZ2VfaW5pdCsrOwotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyAob2JqX2Rlc2MpOworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyhvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTMwOCwxMiArMjg4LDEzIEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0VSUk9SLCAiXG4iKSk7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgZXhlY3V0ZSBhcmd1bWVudHMgZm9yIFslNC40c10gKCVzKSwgJXNcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwKLQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVJST1IsICJcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDb3VsZCBub3QgZXhlY3V0ZSBhcmd1bWVudHMgZm9yIFslNC40c10gKCVzKSwgJXNcbiIsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksCisJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAogCS8qCkBAIC0zMjEsMTggKzMwMiwxNyBAQAogCSAqIHBhdGhuYW1lCiAJICovCiAJaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX0lOSVRfTkFNRVMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9JTklULCAiLiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwgIi4iKSk7CiAJfQogCiAJLyoKIAkgKiBXZSBpZ25vcmUgZXJyb3JzIGZyb20gYWJvdmUsIGFuZCBhbHdheXMgcmV0dXJuIE9LLCBzaW5jZSB3ZSBkb24ndCB3YW50CiAJICogdG8gYWJvcnQgdGhlIHdhbGsgb24gYW55IHNpbmdsZSBlcnJvci4KIAkgKi8KLQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKCk7CisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbml0X29uZV9kZXZpY2UKQEAgLTM0OCw0MSArMzI4LDM3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfbnNfaW5pdF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvICAgKmluZm8gPSAoc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAqKSBjb250ZXh0OwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgcGluZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvICppbmZvID0KKwkgICAgKHN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gKiljb250ZXh0OworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIHBpbmZvOworCXUzMiBmbGFnczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19pbml0X29uZV9kZXZpY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luaXRfb25lX2RldmljZSIpOwogCiAJcGluZm8ucGFyYW1ldGVycyA9IE5VTEw7CiAJcGluZm8ucGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CiAKLQlwaW5mby5ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKG9ial9oYW5kbGUpOworCXBpbmZvLm5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKIAlpZiAoIXBpbmZvLm5vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCiAJICogV2Ugd2lsbCBydW4gX1NUQS9fSU5JIG9uIERldmljZXMsIFByb2Nlc3NvcnMgYW5kIHRoZXJtYWxfem9uZXMgb25seQogCSAqLwotCWlmICgocGluZm8ubm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSAgICAgICYmCi0JCShwaW5mby5ub2RlLT50eXBlICE9IEFDUElfVFlQRV9QUk9DRVNTT1IpICAgJiYKLQkJKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCWlmICgocGluZm8ubm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSAmJgorCSAgICAocGluZm8ubm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUFJPQ0VTU09SKSAmJgorCSAgICAocGluZm8ubm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfVEhFUk1BTCkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAlpZiAoKGFjcGlfZGJnX2xldmVsIDw9IEFDUElfTFZfQUxMX0VYQ0VQVElPTlMpICYmCi0JCSghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTkZPKSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsICIuIikpOworCSAgICAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5GTykpKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICIuIikpOwogCX0KIAogCWluZm8tPmRldmljZV9jb3VudCsrOwpAQCAtMzkwLDIwICszNjYsMjAgQEAKIAkvKgogCSAqIFJ1biBfU1RBIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gcnVuIF9JTkkgb24gdGhlIGRldmljZS4KIAkgKi8KLQlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lIChBQ1BJX1RZUEVfTUVUSE9ELAotCQkJICAgcGluZm8ubm9kZSwgTUVUSE9EX05BTUVfX1NUQSkpOwotCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEgKHBpbmZvLm5vZGUsICZmbGFncyk7CisJQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lKEFDUElfVFlQRV9NRVRIT0QsCisJCQkJCQkgICAgICBwaW5mby5ub2RlLAorCQkJCQkJICAgICAgTUVUSE9EX05BTUVfX1NUQSkpOworCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEocGluZm8ubm9kZSwgJmZsYWdzKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHBpbmZvLm5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSkgewogCQkJLyogSWdub3JlIGVycm9yIGFuZCBtb3ZlIG9uIHRvIG5leHQgZGV2aWNlICovCiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCiAJCS8qIF9TVEEgaXMgbm90IHJlcXVpcmVkIGZvciBQcm9jZXNzb3Igb3IgdGhlcm1hbF96b25lIG9iamVjdHMgKi8KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaW5mby0+bnVtX1NUQSsrOwogCiAJCWlmICghKGZsYWdzICYgMHgwMSkpIHsKQEAgLTQxNiwzMiArMzkyLDM0IEBACiAJLyoKIAkgKiBUaGUgZGV2aWNlIGlzIHByZXNlbnQuIFJ1biBfSU5JLgogCSAqLwotCUFDUElfREVCVUdfRVhFQyAoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKEFDUElfVFlQRV9NRVRIT0QsCi0JCQkgICBwaW5mby5ub2RlLCBNRVRIT0RfTkFNRV9fSU5JKSk7Ci0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoTUVUSE9EX05BTUVfX0lOSSwgJnBpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lKEFDUElfVFlQRV9NRVRIT0QsCisJCQkJCQkgICAgICBwaW5mby5ub2RlLAorCQkJCQkJICAgICAgTUVUSE9EX05BTUVfX0lOSSkpOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUoTUVUSE9EX05BTUVfX0lOSSwgJnBpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJLyogTm8gX0lOSSAoQUVfTk9UX0ZPVU5EKSBtZWFucyBkZXZpY2UgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb24gKi8KIAogCQlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewogCQkJLyogSWdub3JlIGVycm9yIGFuZCBtb3ZlIG9uIHRvIG5leHQgZGV2aWNlICovCiAKICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotCQkJY2hhciAgICAgICAgICAgICAgICAqc2NvcGVfbmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lIChwaW5mby5ub2RlKTsKKwkJCWNoYXIgKnNjb3BlX25hbWUgPQorCQkJICAgIGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKHBpbmZvLm5vZGUpOwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9XQVJOLCAiJXMuX0lOSSBmYWlsZWQ6ICVzXG4iLAotCQkJCQlzY29wZV9uYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIiVzLl9JTkkgZmFpbGVkOiAlc1xuIiwKKwkJCQkJICBzY29wZV9uYW1lLAorCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKLQkJCUFDUElfTUVNX0ZSRUUgKHNjb3BlX25hbWUpOworCQkJQUNQSV9NRU1fRlJFRShzY29wZV9uYW1lKTsKICNlbmRpZgogCQl9CiAKIAkJc3RhdHVzID0gQUVfT0s7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIERlbGV0ZSBhbnkgcmV0dXJuIG9iamVjdCAoZXNwZWNpYWxseSBpZiBpbXBsaWNpdF9yZXR1cm4gaXMgZW5hYmxlZCkgKi8KIAogCQlpZiAocGluZm8ucmV0dXJuX29iamVjdCkgewotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChwaW5mby5yZXR1cm5fb2JqZWN0KTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwaW5mby5yZXR1cm5fb2JqZWN0KTsKIAkJfQogCiAJCS8qIENvdW50IG9mIHN1Y2Nlc3NmdWwgSU5JcyAqLwpAQCAtNDUyLDggKzQzMCw5IEBACiAJaWYgKGFjcGlfZ2JsX2luaXRfaGFuZGxlcikgewogCQkvKiBFeHRlcm5hbCBpbml0aWFsaXphdGlvbiBoYW5kbGVyIGlzIHByZXNlbnQsIGNhbGwgaXQgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2dibF9pbml0X2hhbmRsZXIgKHBpbmZvLm5vZGUsIEFDUElfSU5JVF9ERVZJQ0VfSU5JKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZ2JsX2luaXRfaGFuZGxlcihwaW5mby5ub2RlLCBBQ1BJX0lOSVRfREVWSUNFX0lOSSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKaW5kZXggMzRlNDk3MC4uYzI4ODQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCkBAIC00MSwzMiArNDEsMjIgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNsb2FkIikKK0FDUElfTU9EVUxFX05BTUUoIm5zbG9hZCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKTsKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgotYWNwaV9zdGF0dXMKLWFjcGlfbnNfdW5sb2FkX25hbWVzcGFjZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworYWNwaV9zdGF0dXMgYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19kZWxldGVfc3VidHJlZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUpOworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfbnNfZGVsZXRlX3N1YnRyZWUoYWNwaV9oYW5kbGUgc3RhcnRfaGFuZGxlKTsKICNlbmRpZgogCi0KICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgyLDQwICs3MiwzOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9hZF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQorYWNwaV9uc19sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MsCisJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2xvYWRfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2xvYWRfdGFibGUiKTsKIAogCS8qIENoZWNrIGlmIHRhYmxlIGNvbnRhaW5zIHZhbGlkIEFNTCAobXVzdCBiZSBEU0RULCBQU0RULCBTU0RULCBldGMuKSAqLwogCi0JaWYgKCEoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV9kZXNjLT50eXBlXS5mbGFncyAmIEFDUElfVEFCTEVfRVhFQ1VUQUJMRSkpIHsKKwlpZiAoIQorCSAgICAoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV9kZXNjLT50eXBlXS4KKwkgICAgIGZsYWdzICYgQUNQSV9UQUJMRV9FWEVDVVRBQkxFKSkgewogCQkvKiBKdXN0IGlnbm9yZSB0aGlzIHRhYmxlICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogQ2hlY2sgdmFsaWRpdHkgb2YgdGhlIEFNTCBzdGFydCBhbmQgbGVuZ3RoICovCiAKIAlpZiAoIXRhYmxlX2Rlc2MtPmFtbF9zdGFydCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgQU1MIHBvaW50ZXJcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk51bGwgQU1MIHBvaW50ZXJcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJBTUwgYmxvY2sgYXQgJXBcbiIsCi0JCXRhYmxlX2Rlc2MtPmFtbF9zdGFydCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkFNTCBibG9jayBhdCAlcFxuIiwKKwkJCSAgdGFibGVfZGVzYy0+YW1sX3N0YXJ0KSk7CiAKIAkvKiBJZ25vcmUgdGFibGUgaWYgdGhlcmUgaXMgbm8gQU1MIGNvbnRhaW5lZCB3aXRoaW4gKi8KIAogCWlmICghdGFibGVfZGVzYy0+YW1sX2xlbmd0aCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIlplcm8tbGVuZ3RoIEFNTCBibG9jayBpbiB0YWJsZSBbJTQuNHNdXG4iLAotCQkJdGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiWmVyby1sZW5ndGggQU1MIGJsb2NrIGluIHRhYmxlIFslNC40c11cbiIsCisJCQkJICAgICB0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgpAQCAtMTI3LDE5ICsxMTYsMTkgQEAKIAkgKiB0byBhbm90aGVyIGNvbnRyb2wgbWV0aG9kLCB3ZSBjYW4ndCBjb250aW51ZSBwYXJzaW5nCiAJICogYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGFyZ3VtZW50cyB0byBwYXJzZSBuZXh0IQogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSIqKioqIExvYWRpbmcgdGFibGUgaW50byBuYW1lc3BhY2UgKioqKlxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIioqKiogTG9hZGluZyB0YWJsZSBpbnRvIG5hbWVzcGFjZSAqKioqXG4iKSk7CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfbnNfcGFyc2VfdGFibGUgKHRhYmxlX2Rlc2MsIG5vZGUtPmNoaWxkKTsKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXN0YXR1cyA9IGFjcGlfbnNfcGFyc2VfdGFibGUodGFibGVfZGVzYywgbm9kZS0+Y2hpbGQpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCi0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0xNDgsMTggKzEzNywxNyBAQAogCSAqIGp1c3QtaW4tdGltZSBwYXJzaW5nLCB3ZSBkZWxldGUgdGhlIGNvbnRyb2wgbWV0aG9kCiAJICogcGFyc2UgdHJlZXMuCiAJICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIioqKiogQmVnaW4gVGFibGUgTWV0aG9kIFBhcnNpbmcgYW5kIE9iamVjdCBJbml0aWFsaXphdGlvbiAqKioqXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiKioqKiBCZWdpbiBUYWJsZSBNZXRob2QgUGFyc2luZyBhbmQgT2JqZWN0IEluaXRpYWxpemF0aW9uICoqKipcbiIpKTsKIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzICh0YWJsZV9kZXNjLCBub2RlKTsKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyh0YWJsZV9kZXNjLCBub2RlKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSIqKioqIENvbXBsZXRlZCBUYWJsZSBNZXRob2QgUGFyc2luZyBhbmQgT2JqZWN0IEluaXRpYWxpemF0aW9uICoqKipcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICIqKioqIENvbXBsZXRlZCBUYWJsZSBNZXRob2QgUGFyc2luZyBhbmQgT2JqZWN0IEluaXRpYWxpemF0aW9uICoqKipcbiIpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZQpAQCAtMTc0LDIxICsxNjIsMTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUpCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7CisJdTMyIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19sb2FkX3RhYmxlX2J5X3R5cGUiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19sb2FkX3RhYmxlX2J5X3R5cGUiKTsKLQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9UQUJMRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTk4LDcgKzE4Miw3IEBACiAJc3dpdGNoICh0YWJsZV90eXBlKSB7CiAJY2FzZSBBQ1BJX1RBQkxFX0RTRFQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIkxvYWRpbmcgRFNEVFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJOYW1lc3BhY2UgbG9hZDogRFNEVFxuIikpOwogCiAJCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX0RTRFRdLm5leHQ7CiAKQEAgLTIxMCwzMCArMTk0LDMzIEBACiAKIAkJLyogTm93IGxvYWQgdGhlIHNpbmdsZSBEU0RUICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlICh0YWJsZV9kZXNjLCBhY3BpX2dibF9yb290X25vZGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9kZXNjLCBhY3BpX2dibF9yb290X25vZGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSA9IFRSVUU7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UQUJMRV9TU0RUOgorCWNhc2UgQUNQSV9UQUJMRV9QU0RUOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJMb2FkaW5nICVkIFNTRFRzXG4iLAotCQkJYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9TU0RUXS5jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiTmFtZXNwYWNlIGxvYWQ6ICVkIFNTRFQgb3IgUFNEVHNcbiIsCisJCQkJICBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5jb3VudCkpOwogCiAJCS8qCi0JCSAqIFRyYXZlcnNlIGxpc3Qgb2YgU1NEVCB0YWJsZXMKKwkJICogVHJhdmVyc2UgbGlzdCBvZiBTU0RUIG9yIFBTRFQgdGFibGVzCiAJCSAqLwotCQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9TU0RUXS5uZXh0OwotCQlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9TU0RUXS5jb3VudDsgaSsrKSB7CisJCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0OworCQlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0uY291bnQ7IGkrKykgewogCQkJLyoKLQkJCSAqIE9ubHkgYXR0ZW1wdCB0byBsb2FkIHRhYmxlIGlmIGl0IGlzIG5vdAorCQkJICogT25seSBhdHRlbXB0IHRvIGxvYWQgdGFibGUgaW50byBuYW1lc3BhY2UgaWYgaXQgaXMgbm90CiAJCQkgKiBhbHJlYWR5IGxvYWRlZCEKIAkJCSAqLwogCQkJaWYgKCF0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UpIHsKLQkJCQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUgKHRhYmxlX2Rlc2MsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9kZXNjLAorCQkJCQkJICAgICAgIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtMjQ0LDQ2ICsyMzEsMTYgQEAKIAkJfQogCQlicmVhazsKIAotCi0JY2FzZSBBQ1BJX1RBQkxFX1BTRFQ6Ci0KLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIkxvYWRpbmcgJWQgUFNEVHNcbiIsCi0JCQlhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX1BTRFRdLmNvdW50KSk7Ci0KLQkJLyoKLQkJICogVHJhdmVyc2UgbGlzdCBvZiBQU0RUIHRhYmxlcwotCQkgKi8KLQkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfUFNEVF0ubmV4dDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9QU0RUXS5jb3VudDsgaSsrKSB7Ci0JCQkvKiBPbmx5IGF0dGVtcHQgdG8gbG9hZCB0YWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2FkZWQhICovCi0KLQkJCWlmICghdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlKSB7Ci0JCQkJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlICh0YWJsZV9kZXNjLCBhY3BpX2dibF9yb290X25vZGUpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlID0gVFJVRTsKLQkJCX0KLQotCQkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQogCWRlZmF1bHQ6CiAJCXN0YXR1cyA9IEFFX1NVUFBPUlQ7CiAJCWJyZWFrOwogCX0KIAotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfVEFCTEVTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9sb2FkX25hbWVzcGFjZQpAQCAtMjk3LDQ1ICsyNTQsNDAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19sb2FkX25hbWVzcGFjZSAoCi0Jdm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfbnNfbG9hZF9uYW1lc3BhY2Uodm9pZCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2xvYWRfbmFtZV9zcGFjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9sb2FkX25hbWVfc3BhY2UiKTsKIAogCS8qIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgYSBEU0RUIGluc3RhbGxlZCAqLwogCiAJaWYgKGFjcGlfZ2JsX0RTRFQgPT0gTlVMTCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkRTRFQgaXMgbm90IGluIG1lbW9yeVxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkRTRFQgaXMgbm90IGluIG1lbW9yeVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCS8qCiAJICogTG9hZCB0aGUgbmFtZXNwYWNlLiAgVGhlIERTRFQgaXMgcmVxdWlyZWQsCiAJICogYnV0IHRoZSBTU0RUIGFuZCBQU0RUIHRhYmxlcyBhcmUgb3B0aW9uYWwuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUgKEFDUElfVEFCTEVfRFNEVCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoQUNQSV9UQUJMRV9EU0RUKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSWdub3JlIGV4Y2VwdGlvbnMgZnJvbSB0aGVzZSAqLwogCi0JKHZvaWQpIGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlIChBQ1BJX1RBQkxFX1NTRFQpOwotCSh2b2lkKSBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoQUNQSV9UQUJMRV9QU0RUKTsKKwkodm9pZClhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX1NTRFQpOworCSh2b2lkKWFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKEFDUElfVEFCTEVfUFNEVCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfSU5JVCwKLQkJIkFDUEkgTmFtZXNwYWNlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYXQgcm9vdCAlcFxuIiwKLQkJYWNwaV9nYmxfcm9vdF9ub2RlKSk7CisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKKwkJCSAgICAgICJBQ1BJIE5hbWVzcGFjZSBzdWNjZXNzZnVsbHkgbG9hZGVkIGF0IHJvb3QgJXBcbiIsCisJCQkgICAgICBhY3BpX2dibF9yb290X25vZGUpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAjaWZkZWYgQUNQSV9GVVRVUkVfSU1QTEVNRU5UQVRJT04KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzUzLDI0ICszMDUsMjAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZGVsZXRlX3N1YnRyZWUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfbnNfZGVsZXRlX3N1YnRyZWUoYWNwaV9oYW5kbGUgc3RhcnRfaGFuZGxlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgY2hpbGRfaGFuZGxlOwotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2hhbmRsZTsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG5leHRfY2hpbGRfaGFuZGxlOwotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZHVtbXk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgY2hpbGRfaGFuZGxlOworCWFjcGlfaGFuZGxlIHBhcmVudF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgbmV4dF9jaGlsZF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgZHVtbXk7CisJdTMyIGxldmVsOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZGVsZXRlX3N1YnRyZWUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2RlbGV0ZV9zdWJ0cmVlIik7CiAKIAlwYXJlbnRfaGFuZGxlID0gc3RhcnRfaGFuZGxlOwogCWNoaWxkX2hhbmRsZSA9IE5VTEw7Ci0JbGV2ZWwgICAgICAgID0gMTsKKwlsZXZlbCA9IDE7CiAKIAkvKgogCSAqIFRyYXZlcnNlIHRoZSB0cmVlIG9mIG9iamVjdHMgdW50aWwgd2UgYnViYmxlIGJhY2sgdXAKQEAgLTM3OSwxOCArMzI3LDE5IEBACiAJd2hpbGUgKGxldmVsID4gMCkgewogCQkvKiBBdHRlbXB0IHRvIGdldCB0aGUgbmV4dCBvYmplY3QgaW4gdGhpcyBzY29wZSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZ2V0X25leHRfb2JqZWN0IChBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfaGFuZGxlLAotCQkJCSAgY2hpbGRfaGFuZGxlLCAmbmV4dF9jaGlsZF9oYW5kbGUpOworCQlzdGF0dXMgPSBhY3BpX2dldF9uZXh0X29iamVjdChBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfaGFuZGxlLAorCQkJCQkgICAgICBjaGlsZF9oYW5kbGUsICZuZXh0X2NoaWxkX2hhbmRsZSk7CiAKIAkJY2hpbGRfaGFuZGxlID0gbmV4dF9jaGlsZF9oYW5kbGU7CiAKIAkJLyogRGlkIHdlIGdldCBhIG5ldyBvYmplY3Q/ICovCiAKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCS8qIENoZWNrIGlmIHRoaXMgb2JqZWN0IGhhcyBhbnkgY2hpbGRyZW4gKi8KIAotCQkJaWYgKEFDUElfU1VDQ0VTUyAoYWNwaV9nZXRfbmV4dF9vYmplY3QgKEFDUElfVFlQRV9BTlksIGNoaWxkX2hhbmRsZSwKLQkJCQkJIE5VTEwsICZkdW1teSkpKSB7CisJCQlpZiAoQUNQSV9TVUNDRVNTCisJCQkgICAgKGFjcGlfZ2V0X25leHRfb2JqZWN0CisJCQkgICAgIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9oYW5kbGUsIE5VTEwsICZkdW1teSkpKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hpbGQgb2YgdGhpcyBvYmplY3QsCiAJCQkJICogdmlzaXQgdGhlIG9iamVjdApAQCAtMzk5LDggKzM0OCw3IEBACiAJCQkJcGFyZW50X2hhbmRsZSA9IGNoaWxkX2hhbmRsZTsKIAkJCQljaGlsZF9oYW5kbGUgPSBOVUxMOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIE5vIG1vcmUgY2hpbGRyZW4gaW4gdGhpcyBvYmplY3QsIGdvIGJhY2sgdXAgdG8KIAkJCSAqIHRoZSBvYmplY3QncyBwYXJlbnQKQEAgLTQwOSwyNCArMzU3LDIzIEBACiAKIAkJCS8qIERlbGV0ZSBhbGwgY2hpbGRyZW4gbm93ICovCiAKLQkJCWFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuIChjaGlsZF9oYW5kbGUpOworCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4oY2hpbGRfaGFuZGxlKTsKIAogCQkJY2hpbGRfaGFuZGxlID0gcGFyZW50X2hhbmRsZTsKLQkJCXN0YXR1cyA9IGFjcGlfZ2V0X3BhcmVudCAocGFyZW50X2hhbmRsZSwgJnBhcmVudF9oYW5kbGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGFjcGlfZ2V0X3BhcmVudChwYXJlbnRfaGFuZGxlLCAmcGFyZW50X2hhbmRsZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCX0KIAogCS8qIE5vdyBkZWxldGUgdGhlIHN0YXJ0aW5nIG9iamVjdCwgYW5kIHdlIGFyZSBkb25lICovCiAKLQlhY3BpX25zX2RlbGV0ZV9ub2RlIChjaGlsZF9oYW5kbGUpOworCWFjcGlfbnNfZGVsZXRlX25vZGUoY2hpbGRfaGFuZGxlKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiAgRlVOQ1RJT046ICAgICAgIGFjcGlfbnNfdW5sb2FkX25hbWVfc3BhY2UKQEAgLTQ0MSwzMiArMzg4LDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfdW5sb2FkX25hbWVzcGFjZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpCithY3BpX3N0YXR1cyBhY3BpX25zX3VubG9hZF9uYW1lc3BhY2UoYWNwaV9oYW5kbGUgaGFuZGxlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX3VubG9hZF9uYW1lX3NwYWNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc191bmxvYWRfbmFtZV9zcGFjZSIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghYWNwaV9nYmxfcm9vdF9ub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTkFNRVNQQUNFKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX05BTUVTUEFDRSk7CiAJfQogCiAJaWYgKCFoYW5kbGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgcmVhbCB3b3JrICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlIChoYW5kbGUpOworCXN0YXR1cyA9IGFjcGlfbnNfZGVsZXRlX3N1YnRyZWUoaGFuZGxlKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KICNlbmRpZgogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKaW5kZXggZDhjZTdlMy4uZDVlOGRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKQEAgLTQxLDIzICs0MSwxNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zbmFtZXMiKQorQUNQSV9NT0RVTEVfTkFNRSgibnNuYW1lcyIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIHZvaWQKLWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9idWZmZXIpOwotCithY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgYWNwaV9zaXplIHNpemUsIGNoYXIgKm5hbWVfYnVmZmVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03NSwxNyArNjksMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfYnVmZmVyKQorYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfc2l6ZSBzaXplLCBjaGFyICpuYW1lX2J1ZmZlcikKIHsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlOworCWFjcGlfc2l6ZSBpbmRleDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoIm5zX2J1aWxkX2V4dGVybmFsX3BhdGgiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgibnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCIpOwogCiAJLyogU3BlY2lhbCBjYXNlIGZvciByb290ICovCiAKQEAgLTEwNiw4ICs5Niw4IEBACiAKIAkJLyogUHV0IHRoZSBuYW1lIGludG8gdGhlIGJ1ZmZlciAqLwogCi0JCUFDUElfTU9WRV8zMl9UT18zMiAoKG5hbWVfYnVmZmVyICsgaW5kZXgpLCAmcGFyZW50X25vZGUtPm5hbWUpOwotCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChwYXJlbnRfbm9kZSk7CisJCUFDUElfTU9WRV8zMl9UT18zMigobmFtZV9idWZmZXIgKyBpbmRleCksICZwYXJlbnRfbm9kZS0+bmFtZSk7CisJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwogCiAJCS8qIFByZWZpeCBuYW1lIHdpdGggdGhlIHBhdGggc2VwYXJhdG9yICovCiAKQEAgLTEyMCwxNSArMTEwLDE0IEBACiAJbmFtZV9idWZmZXJbaW5kZXhdID0gQU1MX1JPT1RfUFJFRklYOwogCiAJaWYgKGluZGV4ICE9IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQ291bGQgbm90IGNvbnN0cnVjdCBwYXRobmFtZTsgaW5kZXg9JVgsIHNpemU9JVgsIFBhdGg9JXNcbiIsCi0JCQkodTMyKSBpbmRleCwgKHUzMikgc2l6ZSwgJm5hbWVfYnVmZmVyW3NpemVdKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGQgbm90IGNvbnN0cnVjdCBwYXRobmFtZTsgaW5kZXg9JVgsIHNpemU9JVgsIFBhdGg9JXNcbiIsCisJCQkJICAodTMyKSBpbmRleCwgKHUzMikgc2l6ZSwgJm5hbWVfYnVmZmVyW3NpemVdKSk7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNDQsMzcgKzEzMywzMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNoYXIgKgotYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCitjaGFyICphY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX2J1ZmZlcjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisJY2hhciAqbmFtZV9idWZmZXI7CisJYWNwaV9zaXplIHNpemU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgibnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lIiwgbm9kZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lIiwgbm9kZSk7CiAKIAkvKiBDYWxjdWxhdGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgYmFzZWQgb24gZGVwdGggYmVsb3cgcm9vdCAqLwogCi0Jc2l6ZSA9IGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCAobm9kZSk7CisJc2l6ZSA9IGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aChub2RlKTsKIAogCS8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGJlIHJldHVybmVkIHRvIGNhbGxlciAqLwogCi0JbmFtZV9idWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemUpOworCW5hbWVfYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemUpOwogCWlmICghbmFtZV9idWZmZXIpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgibnNfZ2V0X3RhYmxlX3BhdGhuYW1lOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpKTsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfZ2V0X3RhYmxlX3BhdGhuYW1lOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBCdWlsZCB0aGUgcGF0aCBpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciAqLwogCi0JYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoIChub2RlLCBzaXplLCBuYW1lX2J1ZmZlcik7Ci0JcmV0dXJuX1BUUiAobmFtZV9idWZmZXIpOworCWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChub2RlLCBzaXplLCBuYW1lX2J1ZmZlcik7CisJcmV0dXJuX1BUUihuYW1lX2J1ZmZlcik7CiB9CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgKQEAgLTE4NywxNiArMTcxLDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zaXplCi1hY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCithY3BpX3NpemUgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQogewotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpuZXh0X25vZGU7CisJYWNwaV9zaXplIHNpemU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qCiAJICogQ29tcHV0ZSBsZW5ndGggb2YgcGF0aG5hbWUgYXMgNSAqIG51bWJlciBvZiBuYW1lIHNlZ21lbnRzLgpAQCAtMjA3LDE3ICsxODcsMTYgQEAKIAogCXdoaWxlIChuZXh0X25vZGUgJiYgKG5leHRfbm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CiAJCXNpemUgKz0gQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIOwotCQluZXh0X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobmV4dF9ub2RlKTsKKwkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobmV4dF9ub2RlKTsKIAl9CiAKIAlpZiAoIXNpemUpIHsKLQkJc2l6ZSA9IDE7ICAgICAgIC8qIFJvb3Qgbm9kZSBjYXNlICovCisJCXNpemUgPSAxOwkvKiBSb290IG5vZGUgY2FzZSAqLwogCX0KIAotCXJldHVybiAoc2l6ZSArIDEpOyAgLyogKzEgZm9yIG51bGwgc3RyaW5nIHRlcm1pbmF0b3IgKi8KKwlyZXR1cm4gKHNpemUgKyAxKTsJLyogKzEgZm9yIG51bGwgc3RyaW5nIHRlcm1pbmF0b3IgKi8KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZQpAQCAtMjMzLDQxICsyMTIsMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmJ1ZmZlcikKK2FjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGFjcGlfaGFuZGxlIHRhcmdldF9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX3NpemU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc2l6ZSByZXF1aXJlZF9zaXplOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoIm5zX2hhbmRsZV90b19wYXRobmFtZSIsIHRhcmdldF9oYW5kbGUpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJuc19oYW5kbGVfdG9fcGF0aG5hbWUiLCB0YXJnZXRfaGFuZGxlKTsKLQotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlICh0YXJnZXRfaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUodGFyZ2V0X2hhbmRsZSk7CiAJaWYgKCFub2RlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgc2l6ZSByZXF1aXJlZCBmb3IgdGhlIGNhbGxlciBidWZmZXIgKi8KIAotCXJlcXVpcmVkX3NpemUgPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKG5vZGUpOworCXJlcXVpcmVkX3NpemUgPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgobm9kZSk7CiAKIAkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChidWZmZXIsIHJlcXVpcmVkX3NpemUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCByZXF1aXJlZF9zaXplKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogQnVpbGQgdGhlIHBhdGggaW4gdGhlIGNhbGxlciBidWZmZXIgKi8KIAotCWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aCAobm9kZSwgcmVxdWlyZWRfc2l6ZSwgYnVmZmVyLT5wb2ludGVyKTsKKwlhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgobm9kZSwgcmVxdWlyZWRfc2l6ZSwgYnVmZmVyLT5wb2ludGVyKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICIlcyBbJVhdIFxuIiwKLQkJKGNoYXIgKikgYnVmZmVyLT5wb2ludGVyLCAodTMyKSByZXF1aXJlZF9zaXplKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJXMgWyVYXSBcbiIsCisJCQkgIChjaGFyICopYnVmZmVyLT5wb2ludGVyLCAodTMyKSByZXF1aXJlZF9zaXplKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKaW5kZXggMjcyNThjMS4uZmM5YmU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYwpAQCAtNDIsMTQgKzQyLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNvYmplY3QiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc29iamVjdCIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzEsMjAgKzY4LDE1IEBACiAgKiBNVVRFWDogICAgICAgQXNzdW1lcyBuYW1lc3BhY2UgaXMgbG9ja2VkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfbnNfYXR0YWNoX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKQorYWNwaV9uc19hdHRhY2hfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpsYXN0X29ial9kZXNjOwotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxhc3Rfb2JqX2Rlc2M7CisJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZSA9IEFDUElfVFlQRV9BTlk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19hdHRhY2hfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19hdHRhY2hfb2JqZWN0Iik7CiAKIAkvKgogCSAqIFBhcmFtZXRlciB2YWxpZGF0aW9uCkBAIC05Miw0MCArODQsMzkgQEAKIAlpZiAoIW5vZGUpIHsKIAkJLyogSW52YWxpZCBoYW5kbGUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG5hbWVkX29iaiBoYW5kbGVcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG5hbWVkX29iaiBoYW5kbGVcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWlmICghb2JqZWN0ICYmIChBQ1BJX1RZUEVfQU5ZICE9IHR5cGUpKSB7CiAJCS8qIE51bGwgb2JqZWN0ICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG9iamVjdCwgYnV0IHR5cGUgbm90IEFDUElfVFlQRV9BTllcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG9iamVjdCwgYnV0IHR5cGUgbm90IEFDUElfVFlQRV9BTllcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG5vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCQkvKiBOb3QgYSBuYW1lIGhhbmRsZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIm5zX2F0dGFjaF9vYmplY3Q6IEludmFsaWQgaGFuZGxlICVwIFslc11cbiIsCi0JCQkJbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChub2RlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIm5zX2F0dGFjaF9vYmplY3Q6IEludmFsaWQgaGFuZGxlICVwIFslc11cbiIsCisJCQkJICAgbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG5vZGUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBDaGVjayBpZiB0aGlzIG9iamVjdCBpcyBhbHJlYWR5IGF0dGFjaGVkICovCiAKIAlpZiAobm9kZS0+b2JqZWN0ID09IG9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIk9iaiAlcCBhbHJlYWR5IGluc3RhbGxlZCBpbiBuYW1lX29iaiAlcFxuIiwKLQkJCW9iamVjdCwgbm9kZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiT2JqICVwIGFscmVhZHkgaW5zdGFsbGVkIGluIG5hbWVfb2JqICVwXG4iLAorCQkJCSAgb2JqZWN0LCBub2RlKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogSWYgbnVsbCBvYmplY3QsIHdlIHdpbGwganVzdCBpbnN0YWxsIGl0ICovCiAKIAlpZiAoIW9iamVjdCkgewotCQlvYmpfZGVzYyAgID0gTlVMTDsKKwkJb2JqX2Rlc2MgPSBOVUxMOwogCQlvYmplY3RfdHlwZSA9IEFDUElfVFlQRV9BTlk7CiAJfQogCkBAIC0xMzMsMTQgKzEyNCwxNCBAQAogCSAqIElmIHRoZSBzb3VyY2Ugb2JqZWN0IGlzIGEgbmFtZXNwYWNlIE5vZGUgd2l0aCBhbiBhdHRhY2hlZCBvYmplY3QsCiAJICogd2Ugd2lsbCB1c2UgdGhhdCAoYXR0YWNoZWQpIG9iamVjdAogCSAqLwotCWVsc2UgaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpICYmCi0JCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9iamVjdCktPm9iamVjdCkgeworCWVsc2UgaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgJiYKKwkJICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmplY3QpLT5vYmplY3QpIHsKIAkJLyoKIAkJICogVmFsdWUgcGFzc2VkIGlzIGEgbmFtZSBoYW5kbGUgYW5kIHRoYXQgbmFtZSBoYXMgYQogCQkgKiBub24tbnVsbCB2YWx1ZS4gIFVzZSB0aGF0IG5hbWUncyB2YWx1ZSBhbmQgdHlwZS4KIAkJICovCi0JCW9ial9kZXNjICAgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9iamVjdCktPm9iamVjdDsKLQkJb2JqZWN0X3R5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9iamVjdCktPnR5cGU7CisJCW9ial9kZXNjID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdCktPm9iamVjdDsKKwkJb2JqZWN0X3R5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqZWN0KS0+dHlwZTsKIAl9CiAKIAkvKgpAQCAtMTQ4LDIwICsxMzksMjAgQEAKIAkgKiBpdCBmaXJzdAogCSAqLwogCWVsc2UgewotCQlvYmpfZGVzYyA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgKikgb2JqZWN0OworCQlvYmpfZGVzYyA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopb2JqZWN0OwogCiAJCS8qIFVzZSB0aGUgZ2l2ZW4gdHlwZSAqLwogCiAJCW9iamVjdF90eXBlID0gdHlwZTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiSW5zdGFsbGluZyAlcCBpbnRvIE5vZGUgJXAgWyU0LjRzXVxuIiwKLQkJb2JqX2Rlc2MsIG5vZGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJJbnN0YWxsaW5nICVwIGludG8gTm9kZSAlcCBbJTQuNHNdXG4iLAorCQkJICBvYmpfZGVzYywgbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKSk7CiAKIAkvKiBEZXRhY2ggYW4gZXhpc3RpbmcgYXR0YWNoZWQgb2JqZWN0IGlmIHByZXNlbnQgKi8KIAogCWlmIChub2RlLT5vYmplY3QpIHsKLQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0IChub2RlKTsKKwkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KG5vZGUpOwogCX0KIAogCWlmIChvYmpfZGVzYykgewpAQCAtMTY5LDcgKzE2MCw3IEBACiAJCSAqIE11c3QgaW5jcmVtZW50IHRoZSBuZXcgdmFsdWUncyByZWZlcmVuY2UgY291bnQKIAkJICogKGlmIGl0IGlzIGFuIGludGVybmFsIG9iamVjdCkKIAkJICovCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCiAJCS8qCiAJCSAqIEhhbmRsZSBvYmplY3RzIHdpdGggbXVsdGlwbGUgZGVzY3JpcHRvcnMgLSB3YWxrCkBAIC0xODUsMTMgKzE3NiwxMiBAQAogCQlsYXN0X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPSBub2RlLT5vYmplY3Q7CiAJfQogCi0Jbm9kZS0+dHlwZSAgICAgPSAodTgpIG9iamVjdF90eXBlOwotCW5vZGUtPm9iamVjdCAgID0gb2JqX2Rlc2M7CisJbm9kZS0+dHlwZSA9ICh1OCkgb2JqZWN0X3R5cGU7CisJbm9kZS0+b2JqZWN0ID0gb2JqX2Rlc2M7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGV0YWNoX29iamVjdApAQCAtMjA2LDMwICsxOTYsMjcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2RldGFjaF9vYmplY3QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCit2b2lkIGFjcGlfbnNfZGV0YWNoX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2RldGFjaF9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2RldGFjaF9vYmplY3QiKTsKIAogCW9ial9kZXNjID0gbm9kZS0+b2JqZWN0OwogCiAJaWYgKCFvYmpfZGVzYyB8fAotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKKwkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogQ2xlYXIgdGhlIGVudHJ5IGluIGFsbCBjYXNlcyAqLwogCiAJbm9kZS0+b2JqZWN0ID0gTlVMTDsKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKIAkJbm9kZS0+b2JqZWN0ID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKIAkJaWYgKG5vZGUtPm9iamVjdCAmJgotCQkgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG5vZGUtPm9iamVjdCkgIT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CisJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUobm9kZS0+b2JqZWN0KSAhPQorCQkgICAgIEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgewogCQkJbm9kZS0+b2JqZWN0ID0gbm9kZS0+b2JqZWN0LT5jb21tb24ubmV4dF9vYmplY3Q7CiAJCX0KIAl9CkBAIC0yMzgsMTYgKzIyNSwxNSBAQAogCiAJbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9BTlk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywgIk5vZGUgJXAgWyU0LjRzXSBPYmplY3QgJXBcbiIsCi0JCW5vZGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSAobm9kZSksIG9ial9kZXNjKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywgIk5vZGUgJXAgWyU0LjRzXSBPYmplY3QgJXBcbiIsCisJCQkgIG5vZGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgb2JqX2Rlc2MpKTsKIAogCS8qIFJlbW92ZSBvbmUgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QgKGFuZCBhbGwgc3Vib2JqZWN0cykgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0CkBAIC0yNjEsMjkgKzI0NywyOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKgotYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHN0cnVjdAorCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCSAgICAgICAqbm9kZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoIm5zX2dldF9hdHRhY2hlZF9vYmplY3QiLCBub2RlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19nZXRfYXR0YWNoZWRfb2JqZWN0Iiwgbm9kZSk7CiAKIAlpZiAoIW5vZGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgIk51bGwgTm9kZSBwdHJcbiIpKTsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIk51bGwgTm9kZSBwdHJcbiIpKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAlpZiAoIW5vZGUtPm9iamVjdCB8fAotCQkJKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG5vZGUtPm9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgJiYKLQkJCSAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChub2RlLT5vYmplY3QpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSkgIHx8Ci0JCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAobm9kZS0+b2JqZWN0KSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJICAgICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUtPm9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkgICAgICYmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZS0+b2JqZWN0KSAhPQorCQkgQUNQSV9ERVNDX1RZUEVfTkFNRUQpKQorCSAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUobm9kZS0+b2JqZWN0KSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKLQlyZXR1cm5fUFRSIChub2RlLT5vYmplY3QpOworCXJldHVybl9QVFIobm9kZS0+b2JqZWN0KTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0CkBAIC0yOTcsMjQgKzI4MiwyMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKgotYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpCit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHVuaW9uCisJCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJCSpvYmpfZGVzYykKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoIm5zX2dldF9zZWNvbmRhcnlfb2JqZWN0Iiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19nZXRfc2Vjb25kYXJ5X29iamVjdCIsIG9ial9kZXNjKTsKIAotCi0JaWYgKCghb2JqX2Rlc2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgfHwKLQkJKCFvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0JCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCkgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCWlmICgoIW9ial9kZXNjKSB8fAorCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSB8fAorCSAgICAoIW9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QpIHx8CisJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0KSA9PQorCSAgICAgQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCi0JcmV0dXJuX1BUUiAob2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCk7CisJcmV0dXJuX1BUUihvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0KTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2F0dGFjaF9kYXRhCkBAIC0zMzAsMjMgKzMxNCwyMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfYXR0YWNoX2RhdGEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCithY3BpX25zX2F0dGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnByZXZfb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGF0YV9kZXNjOwotCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcHJldl9vYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkYXRhX2Rlc2M7CiAKIAkvKiBXZSBvbmx5IGFsbG93IG9uZSBhdHRhY2htZW50IHBlciBoYW5kbGVyICovCiAKIAlwcmV2X29ial9kZXNjID0gTlVMTDsKIAlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKIAl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgotCQkJKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKKwkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCisJCSAgICAob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgewogCQkJcmV0dXJuIChBRV9BTFJFQURZX0VYSVNUUyk7CiAJCX0KIApAQCAtMzU2LDcgKzMzNyw3IEBACiAKIAkvKiBDcmVhdGUgYW4gaW50ZXJuYWwgb2JqZWN0IGZvciB0aGUgZGF0YSAqLwogCi0JZGF0YV9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX1RZUEVfTE9DQUxfREFUQSk7CisJZGF0YV9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9EQVRBKTsKIAlpZiAoIWRhdGFfZGVzYykgewogCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CiAJfQpAQCAtMzY4LDE1ICszNDksMTMgQEAKIAogCWlmIChwcmV2X29ial9kZXNjKSB7CiAJCXByZXZfb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCA9IGRhdGFfZGVzYzsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJbm9kZS0+b2JqZWN0ID0gZGF0YV9kZXNjOwogCX0KIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGV0YWNoX2RhdGEKQEAgLTM5MiwyNyArMzcxLDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19kZXRhY2hfZGF0YSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX29iamVjdF9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIpCithY3BpX25zX2RldGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlcikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwcmV2X29ial9kZXNjOwotCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcHJldl9vYmpfZGVzYzsKIAogCXByZXZfb2JqX2Rlc2MgPSBOVUxMOwogCW9ial9kZXNjID0gbm9kZS0+b2JqZWN0OwogCXdoaWxlIChvYmpfZGVzYykgewotCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCi0JCQkob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgeworCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgJiYKKwkJICAgIChvYmpfZGVzYy0+ZGF0YS5oYW5kbGVyID09IGhhbmRsZXIpKSB7CiAJCQlpZiAocHJldl9vYmpfZGVzYykgewotCQkJCXByZXZfb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCQlwcmV2X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPQorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCQkJfSBlbHNlIHsKIAkJCQlub2RlLT5vYmplY3QgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OwogCQkJfQogCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQlyZXR1cm4gKEFFX09LKTsKIAkJfQogCkBAIC00MjMsNyArNDAwLDYgQEAKIAlyZXR1cm4gKEFFX05PVF9GT1VORCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YQpAQCAtNDQwLDE4ICs0MTYsMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqZGF0YSkKK2FjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlLAorCQkJICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKipkYXRhKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKIAlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKIAl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgotCQkJKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKKwkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCisJCSAgICAob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgewogCQkJKmRhdGEgPSBvYmpfZGVzYy0+ZGF0YS5wb2ludGVyOwogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KQEAgLTQ2MSw1ICs0MzQsMyBAQAogCiAJcmV0dXJuIChBRV9OT1RfRk9VTkQpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMKaW5kZXggYTBlMTNlOC4uNDMzNDQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMKQEAgLTQxLDE2ICs0MSwxMyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNwYXJzZSIpCi0KK0FDUElfTU9EVUxFX05BTUUoIm5zcGFyc2UiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY0LDU0ICs2MSw1MCBAQAogICogREVTQ1JJUFRJT046IFBlcmZvcm0gb25lIGNvbXBsZXRlIHBhcnNlIG9mIGFuIEFDUEkvQU1MIHRhYmxlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjKQorYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UodTggcGFzc19udW1iZXIsIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKiB0YWJsZV9kZXNjKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcnNlX3Jvb3Q7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyc2Vfcm9vdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX29uZV9jb21wbGV0ZV9wYXJzZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfb25lX2NvbXBsZXRlX3BhcnNlIik7CiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KIAotCXBhcnNlX3Jvb3QgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCAoKTsKKwlwYXJzZV9yb290ID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKIAlpZiAoIXBhcnNlX3Jvb3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgd2FsayBzdGF0ZSAqLwogCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKHRhYmxlX2Rlc2MtPnRhYmxlX2lkLAotCQkJICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUodGFibGVfZGVzYy0+b3duZXJfaWQsCisJCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJYWNwaV9wc19mcmVlX29wIChwYXJzZV9yb290KTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlhY3BpX3BzX2ZyZWVfb3AocGFyc2Vfcm9vdCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayAod2Fsa19zdGF0ZSwgcGFyc2Vfcm9vdCwgTlVMTCwKLQkJCSAgdGFibGVfZGVzYy0+YW1sX3N0YXJ0LCB0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoLAotCQkJICBOVUxMLCBwYXNzX251bWJlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlICh3YWxrX3N0YXRlKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBwYXJzZV9yb290LCBOVUxMLAorCQkJCSAgICAgICB0YWJsZV9kZXNjLT5hbWxfc3RhcnQsCisJCQkJICAgICAgIHRhYmxlX2Rlc2MtPmFtbF9sZW5ndGgsIE5VTEwsCisJCQkJICAgICAgIHBhc3NfbnVtYmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogUGFyc2UgdGhlIEFNTCAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICIqUEFSU0UqIHBhc3MgJWQgcGFyc2VcbiIsIHBhc3NfbnVtYmVyKSk7Ci0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqUEFSU0UqIHBhc3MgJWQgcGFyc2VcbiIsCisJCQkgIHBhc3NfbnVtYmVyKSk7CisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CiAKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChwYXJzZV9yb290KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShwYXJzZV9yb290KTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3BhcnNlX3RhYmxlCkBAIC0xMjYsMTUgKzExOSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfcGFyc2VfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZSkKK2FjcGlfbnNfcGFyc2VfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywKKwkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX3BhcnNlX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19wYXJzZV90YWJsZSIpOwogCiAJLyoKIAkgKiBBTUwgUGFyc2UsIHBhc3MgMQpAQCAtMTQ2LDkgKzEzNiwxMCBAQAogCSAqIHRvIHNlcnZpY2UgdGhlIGVudGlyZSBwYXJzZS4gIFRoZSBzZWNvbmQgcGFzcyBvZiB0aGUgcGFyc2UgdGhlbgogCSAqIHBlcmZvcm1zIGFub3RoZXIgY29tcGxldGUgcGFyc2Ugb2YgdGhlIEFNTC4uCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKDEsIHRhYmxlX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMVxuIikpOworCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKDEsIHRhYmxlX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTYwLDEyICsxNTEsMTEgQEAKIAkgKiBvdmVyaGVhZCBvZiB0aGlzIGlzIGNvbXBlbnNhdGVkIGZvciBieSB0aGUgZmFjdCB0aGF0IHRoZQogCSAqIHBhcnNlIG9iamVjdHMgYXJlIGFsbCBjYWNoZWQuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKDIsIHRhYmxlX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMlxuIikpOworCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKDIsIHRhYmxlX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCmluZGV4IGFmOGFhYTkuLjUwYTNjYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKQEAgLTQxLDIzICs0MSwxOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zc2VhcmNoIikKK0FDUElfTU9EVUxFX05BTUUoIm5zc2VhcmNoIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9uYW1lLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipyZXR1cm5fbm9kZSk7Ci0KK2FjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlKHUzMiB0YXJnZXRfbmFtZSwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODcsMzAgKzgyLDI4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19zZWFyY2hfbm9kZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0dXJuX25vZGUpCithY3BpX25zX3NlYXJjaF9ub2RlKHUzMiB0YXJnZXRfbmFtZSwKKwkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpuZXh0X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX3NlYXJjaF9ub2RlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19zZWFyY2hfbm9kZSIpOwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKIAlpZiAoQUNQSV9MVl9OQU1FUyAmIGFjcGlfZGJnX2xldmVsKSB7Ci0JCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAqc2NvcGVfbmFtZTsKKwkJY2hhciAqc2NvcGVfbmFtZTsKIAotCQlzY29wZV9uYW1lID0gYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUgKG5vZGUpOworCQlzY29wZV9uYW1lID0gYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUobm9kZSk7CiAJCWlmIChzY29wZV9uYW1lKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCQkiU2VhcmNoaW5nICVzICglcCkgRm9yIFslNC40c10gKCVzKVxuIiwKLQkJCQlzY29wZV9uYW1lLCBub2RlLCAoY2hhciAqKSAmdGFyZ2V0X25hbWUsCi0JCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiU2VhcmNoaW5nICVzICglcCkgRm9yIFslNC40c10gKCVzKVxuIiwKKwkJCQkJICBzY29wZV9uYW1lLCBub2RlLAorCQkJCQkgIChjaGFyICopJnRhcmdldF9uYW1lLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwogCi0JCQlBQ1BJX01FTV9GUkVFIChzY29wZV9uYW1lKTsKKwkJCUFDUElfTUVNX0ZSRUUoc2NvcGVfbmFtZSk7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTEyNiwyMCArMTE5LDI2IEBACiAJCWlmIChuZXh0X25vZGUtPm5hbWUuaW50ZWdlciA9PSB0YXJnZXRfbmFtZSkgewogCQkJLyogUmVzb2x2ZSBhIGNvbnRyb2wgbWV0aG9kIGFsaWFzIGlmIGFueSAqLwogCi0JCQlpZiAoYWNwaV9uc19nZXRfdHlwZSAobmV4dF9ub2RlKSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7Ci0JCQkJbmV4dF9ub2RlID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIG5leHRfbm9kZS0+b2JqZWN0KTsKKwkJCWlmIChhY3BpX25zX2dldF90eXBlKG5leHRfbm9kZSkgPT0KKwkJCSAgICBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7CisJCQkJbmV4dF9ub2RlID0KKwkJCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkJCSAgbmV4dF9ub2RlLT5vYmplY3QpOwogCQkJfQogCiAJCQkvKgogCQkJICogRm91bmQgbWF0Y2hpbmcgZW50cnkuCiAJCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLAotCQkJCSJOYW1lIFslNC40c10gKCVzKSAlcCBmb3VuZCBpbiBzY29wZSBbJTQuNHNdICVwXG4iLAotCQkJCShjaGFyICopICZ0YXJnZXRfbmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChuZXh0X25vZGUtPnR5cGUpLAotCQkJCW5leHRfbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwgbm9kZSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiTmFtZSBbJTQuNHNdICglcykgJXAgZm91bmQgaW4gc2NvcGUgWyU0LjRzXSAlcFxuIiwKKwkJCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSwKKwkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUobmV4dF9ub2RlLT4KKwkJCQkJCQkJdHlwZSksCisJCQkJCSAgbmV4dF9ub2RlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOwogCiAJCQkqcmV0dXJuX25vZGUgPSBuZXh0X25vZGU7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAogCQkvKgpAQCAtMTU5LDE1ICsxNTgsMTQgQEAKIAogCS8qIFNlYXJjaGVkIGVudGlyZSBuYW1lc3BhY2UgbGV2ZWwsIG5vdCBmb3VuZCAqLwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTkFNRVMsCi0JCSJOYW1lIFslNC40c10gKCVzKSBub3QgZm91bmQgaW4gc2VhcmNoIGluIHNjb3BlIFslNC40c10gJXAgZmlyc3QgY2hpbGQgJXBcbiIsCi0JCShjaGFyICopICZ0YXJnZXRfbmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwgbm9kZSwgbm9kZS0+Y2hpbGQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiTmFtZSBbJTQuNHNdICglcykgbm90IGZvdW5kIGluIHNlYXJjaCBpbiBzY29wZSBbJTQuNHNdICVwIGZpcnN0IGNoaWxkICVwXG4iLAorCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUsIG5vZGUtPmNoaWxkKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9GT1VORCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUKQEAgLTE5NCw0MyArMTkyLDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9uYW1lLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipyZXR1cm5fbm9kZSkKK2FjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlKHUzMiB0YXJnZXRfbmFtZSwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfc2VhcmNoX3BhcmVudF90cmVlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfc2VhcmNoX3BhcmVudF90cmVlIik7Ci0KLQotCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKG5vZGUpOworCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSk7CiAKIAkvKgogCSAqIElmIHRoZXJlIGlzIG5vIHBhcmVudCAoaS5lLiwgd2UgYXJlIGF0IHRoZSByb290KSBvciB0eXBlIGlzICJsb2NhbCIsCiAJICogd2Ugd29uJ3QgYmUgc2VhcmNoaW5nIHRoZSBwYXJlbnQgdHJlZS4KIAkgKi8KIAlpZiAoIXBhcmVudF9ub2RlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX05BTUVTLCAiWyU0LjRzXSBoYXMgbm8gcGFyZW50XG4iLAotCQkJKGNoYXIgKikgJnRhcmdldF9uYW1lKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0ZPVU5EKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywgIlslNC40c10gaGFzIG5vIHBhcmVudFxuIiwKKwkJCQkgIChjaGFyICopJnRhcmdldF9uYW1lKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwogCX0KIAotCWlmIChhY3BpX25zX2xvY2FsICh0eXBlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCSJbJTQuNHNdIHR5cGUgWyVzXSBtdXN0IGJlIGxvY2FsIHRvIHRoaXMgc2NvcGUgKG5vIHBhcmVudCBzZWFyY2gpXG4iLAotCQkJKGNoYXIgKikgJnRhcmdldF9uYW1lLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0ZPVU5EKTsKKwlpZiAoYWNwaV9uc19sb2NhbCh0eXBlKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCSAgIlslNC40c10gdHlwZSBbJXNdIG11c3QgYmUgbG9jYWwgdG8gdGhpcyBzY29wZSAobm8gcGFyZW50IHNlYXJjaClcbiIsCisJCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSwKKwkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIAl9CiAKIAkvKiBTZWFyY2ggdGhlIHBhcmVudCB0cmVlICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJIlNlYXJjaGluZyBwYXJlbnQgWyU0LjRzXSBmb3IgWyU0LjRzXVxuIiwKLQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChwYXJlbnRfbm9kZSksIChjaGFyICopICZ0YXJnZXRfbmFtZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkgICJTZWFyY2hpbmcgcGFyZW50IFslNC40c10gZm9yIFslNC40c11cbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwYXJlbnRfbm9kZSksCisJCQkgIChjaGFyICopJnRhcmdldF9uYW1lKSk7CiAKIAkvKgogCSAqIFNlYXJjaCBwYXJlbnRzIHVudGlsIHRhcmdldCBpcyBmb3VuZCBvciB3ZSBoYXZlIGJhY2tlZCB1cCB0byB0aGUgcm9vdApAQCAtMjQxLDI1ICsyMzgsMjQgQEAKIAkJICogb2JqZWN0IHR5cGUgYXQgdGhpcyBwb2ludCwgd2Ugb25seSBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2Ugb2YKIAkJICogdGhlIGFjdHVhbCBuYW1lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiAgVHlwZWNoZWNraW5nIGNvbWVzIGxhdGVyLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSAodGFyZ2V0X25hbWUsIHBhcmVudF9ub2RlLAotCQkJCSAgQUNQSV9UWVBFX0FOWSwgcmV0dXJuX25vZGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX25vZGUodGFyZ2V0X25hbWUsIHBhcmVudF9ub2RlLAorCQkJCQkgICAgIEFDUElfVFlQRV9BTlksIHJldHVybl9ub2RlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qCiAJCSAqIE5vdCBmb3VuZCBoZXJlLCBnbyB1cCBhbm90aGVyIGxldmVsCiAJCSAqICh1bnRpbCB3ZSByZWFjaCB0aGUgcm9vdCkKIAkJICovCi0JCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHBhcmVudF9ub2RlKTsKKwkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7CiAJfQogCiAJLyogTm90IGZvdW5kIGluIHBhcmVudCB0cmVlICovCiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9GT1VORCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19zZWFyY2hfYW5kX2VudGVyCkBAIC0yODYsNTIgKzI4Miw0NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbmFtZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipyZXR1cm5fbm9kZSkKK2FjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcih1MzIgdGFyZ2V0X25hbWUsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5ld19ub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV3X25vZGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19zZWFyY2hfYW5kX2VudGVyIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19zZWFyY2hfYW5kX2VudGVyIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFub2RlIHx8ICF0YXJnZXRfbmFtZSB8fCAhcmV0dXJuX25vZGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBwYXJhbTogTm9kZSAlcCBOYW1lICVYIHJldHVybl9ub2RlICVwXG4iLAotCQkJbm9kZSwgdGFyZ2V0X25hbWUsIHJldHVybl9ub2RlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTnVsbCBwYXJhbTogTm9kZSAlcCBOYW1lICVYIHJldHVybl9ub2RlICVwXG4iLAorCQkJCSAgbm9kZSwgdGFyZ2V0X25hbWUsIHJldHVybl9ub2RlKSk7CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgibnNfc2VhcmNoX2FuZF9lbnRlcjogTnVsbCBwYXJhbWV0ZXJcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19zZWFyY2hfYW5kX2VudGVyOiBOdWxsIHBhcmFtZXRlclxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogTmFtZSBtdXN0IGNvbnNpc3Qgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgKi8KIAotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKHRhcmdldF9uYW1lKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19zZWFyY2hfYW5kX2VudGVyOiBCYWQgY2hhcmFjdGVyIGluIEFDUEkgTmFtZTogJVhcbiIsCi0JCQl0YXJnZXRfbmFtZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9DSEFSQUNURVIpOworCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUodGFyZ2V0X25hbWUpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfc2VhcmNoX2FuZF9lbnRlcjogQmFkIGNoYXJhY3RlciBpbiBBQ1BJIE5hbWU6ICVYXG4iLCB0YXJnZXRfbmFtZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0NIQVJBQ1RFUik7CiAJfQogCiAJLyogVHJ5IHRvIGZpbmQgdGhlIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBsZXZlbCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciAqLwogCiAJKnJldHVybl9ub2RlID0gQUNQSV9FTlRSWV9OT1RfRk9VTkQ7Ci0Jc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSAodGFyZ2V0X25hbWUsIG5vZGUsIHR5cGUsIHJldHVybl9ub2RlKTsKKwlzdGF0dXMgPSBhY3BpX25zX3NlYXJjaF9ub2RlKHRhcmdldF9uYW1lLCBub2RlLCB0eXBlLCByZXR1cm5fbm9kZSk7CiAJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKIAkJLyoKIAkJICogSWYgd2UgZm91bmQgaXQgQU5EIHRoZSByZXF1ZXN0IHNwZWNpZmllcyB0aGF0IGEgZmluZCBpcyBhbiBlcnJvciwKIAkJICogcmV0dXJuIHRoZSBlcnJvcgogCQkgKi8KLQkJaWYgKChzdGF0dXMgPT0gQUVfT0spICYmCi0JCQkoZmxhZ3MgJiBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EKSkgeworCQlpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKGZsYWdzICYgQUNQSV9OU19FUlJPUl9JRl9GT1VORCkpIHsKIAkJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOwogCQl9CiAKQEAgLTMzOSw3ICszMjksNyBAQAogCQkgKiBFaXRoZXIgZm91bmQgaXQgb3IgdGhlcmUgd2FzIGFuIGVycm9yCiAJCSAqIC0tIGZpbmlzaGVkIGVpdGhlciB3YXkKIAkJICovCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTM1MSwxNCArMzQxLDE2IEBACiAJICogYW5kIGR1cmluZyB0aGUgZXhlY3V0aW9uIHBoYXNlLgogCSAqLwogCWlmICgoaW50ZXJwcmV0ZXJfbW9kZSAhPSBBQ1BJX0lNT0RFX0xPQURfUEFTUzEpICYmCi0JCShmbGFncyAmIEFDUElfTlNfU0VBUkNIX1BBUkVOVCkpIHsKKwkgICAgKGZsYWdzICYgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKSkgewogCQkvKgogCQkgKiBOb3QgZm91bmQgYXQgdGhpcyBsZXZlbCAtIHNlYXJjaCBwYXJlbnQgdHJlZSBhY2NvcmRpbmcgdG8gdGhlCiAJCSAqIEFDUEkgc3BlY2lmaWNhdGlvbgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUgKHRhcmdldF9uYW1lLCBub2RlLCB0eXBlLCByZXR1cm5fbm9kZSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlKHRhcmdldF9uYW1lLCBub2RlLCB0eXBlLAorCQkJCQkgICAgICAgcmV0dXJuX25vZGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0zNjYsMjUgKzM1OCwyNCBAQAogCSAqIEluIGV4ZWN1dGUgbW9kZSwganVzdCBzZWFyY2gsIG5ldmVyIGFkZCBuYW1lcy4gIEV4aXQgbm93LgogCSAqLwogCWlmIChpbnRlcnByZXRlcl9tb2RlID09IEFDUElfSU1PREVfRVhFQ1VURSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9OQU1FUywKLQkJCSIlNC40cyBOb3QgZm91bmQgaW4gJXAgW05vdCBhZGRpbmddXG4iLAotCQkJKGNoYXIgKikgJnRhcmdldF9uYW1lLCBub2RlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJICAiJTQuNHMgTm90IGZvdW5kIGluICVwIFtOb3QgYWRkaW5nXVxuIiwKKwkJCQkgIChjaGFyICopJnRhcmdldF9uYW1lLCBub2RlKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfRk9VTkQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIG5ldyBuYW1lZCBvYmplY3QgKi8KIAotCW5ld19ub2RlID0gYWNwaV9uc19jcmVhdGVfbm9kZSAodGFyZ2V0X25hbWUpOworCW5ld19ub2RlID0gYWNwaV9uc19jcmVhdGVfbm9kZSh0YXJnZXRfbmFtZSk7CiAJaWYgKCFuZXdfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIEluc3RhbGwgdGhlIG5ldyBvYmplY3QgaW50byB0aGUgcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlbiAqLwogCi0JYWNwaV9uc19pbnN0YWxsX25vZGUgKHdhbGtfc3RhdGUsIG5vZGUsIG5ld19ub2RlLCB0eXBlKTsKKwlhY3BpX25zX2luc3RhbGxfbm9kZSh3YWxrX3N0YXRlLCBub2RlLCBuZXdfbm9kZSwgdHlwZSk7CiAJKnJldHVybl9ub2RlID0gbmV3X25vZGU7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCmluZGV4IGM1M2I4MmUuLmViZWMwMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCkBAIC00MiwyOCArNDIsMjEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zdXRpbHMiKQorQUNQSV9NT0RVTEVfTkFNRSgibnN1dGlscyIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHU4Ci1hY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCk7CitzdGF0aWMgdTggYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcihjaGFyIHNlcCk7CiAKICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwotYWNwaV9uYW1lCi1hY3BpX25zX2ZpbmRfcGFyZW50X25hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGVfdG9fc2VhcmNoKTsKK2FjcGlfbmFtZSBhY3BpX25zX2ZpbmRfcGFyZW50X25hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGVfdG9fc2VhcmNoKTsKICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yCkBAIC04MSw1MSArNzQsNDUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfcmVwb3J0X2Vycm9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWUsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzKQorYWNwaV9uc19yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsCisJCSAgICAgdTMyIGxpbmVfbnVtYmVyLAorCQkgICAgIHUzMiBjb21wb25lbnRfaWQsCisJCSAgICAgY2hhciAqaW50ZXJuYWxfbmFtZSwgYWNwaV9zdGF0dXMgbG9va3VwX3N0YXR1cykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJY2hhciAqbmFtZSA9IE5VTEw7CiAKLQotCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGQ6ICoqKiBFcnJvcjogTG9va2luZyB1cCAiLAotCQltb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIEVycm9yOiBMb29raW5nIHVwICIsCisJCSAgICAgICBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogCiAJaWYgKGxvb2t1cF9zdGF0dXMgPT0gQUVfQkFEX0NIQVJBQ1RFUikgewogCQkvKiBUaGVyZSBpcyBhIG5vbi1hc2NpaSBjaGFyYWN0ZXIgaW4gdGhlIG5hbWUgKi8KIAotCQlhY3BpX29zX3ByaW50ZiAoIlsweCU0LjRYXSAoTk9OLUFTQ0lJKVxuIiwKLQkJCSooQUNQSV9DQVNUX1BUUiAodTMyLCBpbnRlcm5hbF9uYW1lKSkpOwotCX0KLQllbHNlIHsKKwkJYWNwaV9vc19wcmludGYoIlsweCU0LjRYXSAoTk9OLUFTQ0lJKVxuIiwKKwkJCSAgICAgICAqKEFDUElfQ0FTVF9QVFIodTMyLCBpbnRlcm5hbF9uYW1lKSkpOworCX0gZWxzZSB7CiAJCS8qIENvbnZlcnQgcGF0aCB0byBleHRlcm5hbCBmb3JtYXQgKi8KIAotCQlzdGF0dXMgPSBhY3BpX25zX2V4dGVybmFsaXplX25hbWUgKEFDUElfVUlOVDMyX01BWCwKLQkJCQkgaW50ZXJuYWxfbmFtZSwgTlVMTCwgJm5hbWUpOworCQlzdGF0dXMgPSBhY3BpX25zX2V4dGVybmFsaXplX25hbWUoQUNQSV9VSU5UMzJfTUFYLAorCQkJCQkJICBpbnRlcm5hbF9uYW1lLCBOVUxMLCAmbmFtZSk7CiAKIAkJLyogUHJpbnQgdGFyZ2V0IG5hbWUgKi8KIAotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlslc10iLCBuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWFjcGlfb3NfcHJpbnRmICgiW0NPVUxEIE5PVCBFWFRFUk5BTElaRSBOQU1FXSIpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCJbJXNdIiwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQlhY3BpX29zX3ByaW50ZigiW0NPVUxEIE5PVCBFWFRFUk5BTElaRSBOQU1FXSIpOwogCQl9CiAKIAkJaWYgKG5hbWUpIHsKLQkJCUFDUElfTUVNX0ZSRUUgKG5hbWUpOworCQkJQUNQSV9NRU1fRlJFRShuYW1lKTsKIAkJfQogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiIGluIG5hbWVzcGFjZSwgJXNcbiIsCi0JCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAobG9va3VwX3N0YXR1cykpOworCWFjcGlfb3NfcHJpbnRmKCIgaW4gbmFtZXNwYWNlLCAlc1xuIiwKKwkJICAgICAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihsb29rdXBfc3RhdHVzKSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19yZXBvcnRfbWV0aG9kX2Vycm9yCkBAIC0xNDUsMzQgKzEzMiwzMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9uc19yZXBvcnRfbWV0aG9kX2Vycm9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcHJlZml4X25vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9zdGF0dXMpCithY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsCisJCQkgICAgdTMyIGxpbmVfbnVtYmVyLAorCQkJICAgIHUzMiBjb21wb25lbnRfaWQsCisJCQkgICAgY2hhciAqbWVzc2FnZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCQkgICAgY2hhciAqcGF0aCwgYWNwaV9zdGF0dXMgbWV0aG9kX3N0YXR1cykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlID0gcHJlZml4X25vZGU7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUgPSBwcmVmaXhfbm9kZTsKIAogCWlmIChwYXRoKSB7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAocGF0aCwgcHJlZml4X25vZGUsCi0JCQkJIEFDUElfTlNfTk9fVVBTRUFSQ0gsICZub2RlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJYWNwaV9vc19wcmludGYgKCJyZXBvcnRfbWV0aG9kX2Vycm9yOiBDb3VsZCBub3QgZ2V0IG5vZGVcbiIpOworCQlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgocGF0aCwgcHJlZml4X25vZGUsCisJCQkJCQkgIEFDUElfTlNfTk9fVVBTRUFSQ0gsICZub2RlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgicmVwb3J0X21ldGhvZF9lcnJvcjogQ291bGQgbm90IGdldCBub2RlXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGQ6ICoqKiBFcnJvcjogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKLQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUgKG5vZGUsIG1lc3NhZ2UpOwotCWFjcGlfb3NfcHJpbnRmICgiLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChtZXRob2Rfc3RhdHVzKSk7CisJYWNwaV9vc19wcmludGYoIiU4cy0lMDRkOiAqKiogRXJyb3I6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CisJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKG5vZGUsIG1lc3NhZ2UpOworCWFjcGlfb3NfcHJpbnRmKCIsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24obWV0aG9kX3N0YXR1cykpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZQpAQCAtMTg2LDE2ICsxNzAsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlKQorYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCBjaGFyICptZXNzYWdlKQogewotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgYnVmZmVyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlpZiAoIW5vZGUpIHsKLQkJYWNwaV9vc19wcmludGYgKCJbTlVMTCBOQU1FXSIpOworCQlhY3BpX29zX3ByaW50ZigiW05VTEwgTkFNRV0iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjAzLDE4ICsxODQsMTcgQEAKIAogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKIAotCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lIChub2RlLCAmYnVmZmVyKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUobm9kZSwgJmJ1ZmZlcik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWlmIChtZXNzYWdlKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiVzICIsIG1lc3NhZ2UpOworCQkJYWNwaV9vc19wcmludGYoIiVzICIsIG1lc3NhZ2UpOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCJbJXNdIChOb2RlICVwKSIsIChjaGFyICopIGJ1ZmZlci5wb2ludGVyLCBub2RlKTsKLQkJQUNQSV9NRU1fRlJFRSAoYnVmZmVyLnBvaW50ZXIpOworCQlhY3BpX29zX3ByaW50ZigiWyVzXSAoTm9kZSAlcCkiLCAoY2hhciAqKWJ1ZmZlci5wb2ludGVyLCBub2RlKTsKKwkJQUNQSV9NRU1fRlJFRShidWZmZXIucG9pbnRlcik7CiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgKQEAgLTIyNywxNSArMjA3LDEyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KQordTggYWNwaV9uc192YWxpZF9yb290X3ByZWZpeChjaGFyIHByZWZpeCkKIHsKIAogCXJldHVybiAoKHU4KSAocHJlZml4ID09ICdcXCcpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yCkBAIC0yNDgsMTUgKzIyNSwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1OAotYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXApCitzdGF0aWMgdTggYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcihjaGFyIHNlcCkKIHsKIAogCXJldHVybiAoKHU4KSAoc2VwID09ICcuJykpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3R5cGUKQEAgLTI2OSwyMiArMjQzLDE4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9uc19nZXRfdHlwZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKK2FjcGlfb2JqZWN0X3R5cGUgYWNwaV9uc19nZXRfdHlwZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIG5vZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX2dldF90eXBlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19nZXRfdHlwZSIpOwogCiAJaWYgKCFub2RlKSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgibnNfZ2V0X3R5cGU6IE51bGwgTm9kZSBpbnB1dCBwb2ludGVyXG4iKSk7Ci0JCXJldHVybl9WQUxVRSAoQUNQSV9UWVBFX0FOWSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJuc19nZXRfdHlwZTogTnVsbCBOb2RlIGlucHV0IHBvaW50ZXJcbiIpKTsKKwkJcmV0dXJuX1ZBTFVFKEFDUElfVFlQRV9BTlkpOwogCX0KIAotCXJldHVybl9WQUxVRSAoKGFjcGlfb2JqZWN0X3R5cGUpIG5vZGUtPnR5cGUpOworCXJldHVybl9WQUxVRSgoYWNwaV9vYmplY3RfdHlwZSkgbm9kZS0+dHlwZSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb2NhbApAQCAtMjk4LDI0ICsyNjgsMjAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKLWFjcGlfbnNfbG9jYWwgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSkKK3UzMiBhY3BpX25zX2xvY2FsKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfbG9jYWwiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19sb2NhbCIpOwogCi0KLQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKHR5cGUpKSB7CisJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7CiAJCS8qIFR5cGUgY29kZSBvdXQgb2YgcmFuZ2UgICovCiAKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJuc19sb2NhbDogSW52YWxpZCBPYmplY3QgVHlwZVxuIikpOwotCQlyZXR1cm5fVkFMVUUgKEFDUElfTlNfTk9STUFMKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIm5zX2xvY2FsOiBJbnZhbGlkIE9iamVjdCBUeXBlXG4iKSk7CisJCXJldHVybl9WQUxVRShBQ1BJX05TX05PUk1BTCk7CiAJfQogCi0JcmV0dXJuX1ZBTFVFICgodTMyKSBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW3R5cGVdICYgQUNQSV9OU19MT0NBTCk7CisJcmV0dXJuX1ZBTFVFKCh1MzIpIGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbdHlwZV0gJiBBQ1BJX05TX0xPQ0FMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aApAQCAtMzMwLDE2ICsyOTYsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aCAoCi0Jc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICAgICAqaW5mbykKK3ZvaWQgYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGgoc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICppbmZvKQogewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRfZXh0ZXJuYWxfY2hhcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJY2hhciAqbmV4dF9leHRlcm5hbF9jaGFyOworCXUzMiBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJbmV4dF9leHRlcm5hbF9jaGFyID0gaW5mby0+ZXh0ZXJuYWxfbmFtZTsKIAlpbmZvLT5udW1fY2FyYXRzID0gMDsKQEAgLTM1MywxMSArMzE1LDEwIEBACiAJICoKIAkgKiBzdHJsZW4oKSArIDEgY292ZXJzIHRoZSBmaXJzdCBuYW1lX3NlZywgd2hpY2ggaGFzIG5vIHBhdGggc2VwYXJhdG9yCiAJICovCi0JaWYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKG5leHRfZXh0ZXJuYWxfY2hhclswXSkpIHsKKwlpZiAoYWNwaV9uc192YWxpZF9yb290X3ByZWZpeChuZXh0X2V4dGVybmFsX2NoYXJbMF0pKSB7CiAJCWluZm8tPmZ1bGx5X3F1YWxpZmllZCA9IFRSVUU7CiAJCW5leHRfZXh0ZXJuYWxfY2hhcisrOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBIYW5kbGUgQ2FyYXQgcHJlZml4ZXMKIAkJICovCkBAIC0zNzUsMTkgKzMzNiwxOCBAQAogCWlmICgqbmV4dF9leHRlcm5hbF9jaGFyKSB7CiAJCWluZm8tPm51bV9zZWdtZW50cyA9IDE7CiAJCWZvciAoaSA9IDA7IG5leHRfZXh0ZXJuYWxfY2hhcltpXTsgaSsrKSB7Ci0JCQlpZiAoYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAobmV4dF9leHRlcm5hbF9jaGFyW2ldKSkgeworCQkJaWYgKGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IobmV4dF9leHRlcm5hbF9jaGFyW2ldKSkgewogCQkJCWluZm8tPm51bV9zZWdtZW50cysrOwogCQkJfQogCQl9CiAJfQogCiAJaW5mby0+bGVuZ3RoID0gKEFDUElfTkFNRV9TSVpFICogaW5mby0+bnVtX3NlZ21lbnRzKSArCi0JCQkgIDQgKyBpbmZvLT5udW1fY2FyYXRzOworCSAgICA0ICsgaW5mby0+bnVtX2NhcmF0czsKIAogCWluZm8tPm5leHRfZXh0ZXJuYWxfY2hhciA9IG5leHRfZXh0ZXJuYWxfY2hhcjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUKQEAgLTQwMSwxOSArMzYxLDE1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfYnVpbGRfaW50ZXJuYWxfbmFtZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICAgICAqaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfbnNfYnVpbGRfaW50ZXJuYWxfbmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VnbWVudHMgPSBpbmZvLT5udW1fc2VnbWVudHM7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfbmFtZSA9IGluZm8tPmludGVybmFsX25hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfbmFtZSA9IGluZm8tPm5leHRfZXh0ZXJuYWxfY2hhcjsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBOVUxMOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwl1MzIgbnVtX3NlZ21lbnRzID0gaW5mby0+bnVtX3NlZ21lbnRzOworCWNoYXIgKmludGVybmFsX25hbWUgPSBpbmZvLT5pbnRlcm5hbF9uYW1lOworCWNoYXIgKmV4dGVybmFsX25hbWUgPSBpbmZvLT5uZXh0X2V4dGVybmFsX2NoYXI7CisJY2hhciAqcmVzdWx0ID0gTlVMTDsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJuc19idWlsZF9pbnRlcm5hbF9uYW1lIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19idWlsZF9pbnRlcm5hbF9uYW1lIik7CiAKIAkvKiBTZXR1cCB0aGUgY29ycmVjdCBwcmVmaXhlcywgY291bnRzLCBhbmQgcG9pbnRlcnMgKi8KIApAQCAtNDIyLDE4ICszNzgsMTUgQEAKIAogCQlpZiAobnVtX3NlZ21lbnRzIDw9IDEpIHsKIAkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWzFdOwotCQl9Ci0JCWVsc2UgaWYgKG51bV9zZWdtZW50cyA9PSAyKSB7CisJCX0gZWxzZSBpZiAobnVtX3NlZ21lbnRzID09IDIpIHsKIAkJCWludGVybmFsX25hbWVbMV0gPSBBTUxfRFVBTF9OQU1FX1BSRUZJWDsKIAkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWzJdOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJaW50ZXJuYWxfbmFtZVsxXSA9IEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDsKLQkJCWludGVybmFsX25hbWVbMl0gPSAoY2hhcikgbnVtX3NlZ21lbnRzOworCQkJaW50ZXJuYWxfbmFtZVsyXSA9IChjaGFyKW51bV9zZWdtZW50czsKIAkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWzNdOwogCQl9Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE5vdCBmdWxseSBxdWFsaWZpZWQuCiAJCSAqIEhhbmRsZSBDYXJhdHMgZmlyc3QsIHRoZW4gYXBwZW5kIHRoZSBuYW1lIHNlZ21lbnRzCkBAIC00NDcsMTUgKzQwMCwxNCBAQAogCiAJCWlmIChudW1fc2VnbWVudHMgPD0gMSkgewogCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbaV07Ci0JCX0KLQkJZWxzZSBpZiAobnVtX3NlZ21lbnRzID09IDIpIHsKKwkJfSBlbHNlIGlmIChudW1fc2VnbWVudHMgPT0gMikgewogCQkJaW50ZXJuYWxfbmFtZVtpXSA9IEFNTF9EVUFMX05BTUVfUFJFRklYOwotCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbKGFjcGlfbmF0aXZlX3VpbnQpIChpKzEpXTsKLQkJfQotCQllbHNlIHsKKwkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KSAoaSArIDEpXTsKKwkJfSBlbHNlIHsKIAkJCWludGVybmFsX25hbWVbaV0gPSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A7Ci0JCQlpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KSAoaSsxKV0gPSAoY2hhcikgbnVtX3NlZ21lbnRzOwotCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbKGFjcGlfbmF0aXZlX3VpbnQpIChpKzIpXTsKKwkJCWludGVybmFsX25hbWVbKGFjcGlfbmF0aXZlX3VpbnQpIChpICsgMSldID0KKwkJCSAgICAoY2hhciludW1fc2VnbWVudHM7CisJCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsoYWNwaV9uYXRpdmVfdWludCkgKGkgKyAyKV07CiAJCX0KIAl9CiAKQEAgLTQ2MywyNSArNDE1LDI1IEBACiAKIAlmb3IgKDsgbnVtX3NlZ21lbnRzOyBudW1fc2VnbWVudHMtLSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKykgewotCQkJaWYgKGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKCpleHRlcm5hbF9uYW1lKSB8fAotCQkJICAgKCpleHRlcm5hbF9uYW1lID09IDApKSB7CisJCQlpZiAoYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcigqZXh0ZXJuYWxfbmFtZSkgfHwKKwkJCSAgICAoKmV4dGVybmFsX25hbWUgPT0gMCkpIHsKIAkJCQkvKiBQYWQgdGhlIHNlZ21lbnQgd2l0aCB1bmRlcnNjb3JlKHMpIGlmIHNlZ21lbnQgaXMgc2hvcnQgKi8KIAogCQkJCXJlc3VsdFtpXSA9ICdfJzsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKiBDb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gdXBwZXJjYXNlIGFuZCBzYXZlIGl0ICovCiAKLQkJCQlyZXN1bHRbaV0gPSAoY2hhcikgQUNQSV9UT1VQUEVSICgoaW50KSAqZXh0ZXJuYWxfbmFtZSk7CisJCQkJcmVzdWx0W2ldID0KKwkJCQkgICAgKGNoYXIpQUNQSV9UT1VQUEVSKChpbnQpKmV4dGVybmFsX25hbWUpOwogCQkJCWV4dGVybmFsX25hbWUrKzsKIAkJCX0KIAkJfQogCiAJCS8qIE5vdyB3ZSBtdXN0IGhhdmUgYSBwYXRoIHNlcGFyYXRvciwgb3IgdGhlIHBhdGhuYW1lIGlzIGJhZCAqLwogCi0JCWlmICghYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoKmV4dGVybmFsX25hbWUpICYmCi0JCQkoKmV4dGVybmFsX25hbWUgIT0gMCkpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCWlmICghYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcigqZXh0ZXJuYWxfbmFtZSkgJiYKKwkJICAgICgqZXh0ZXJuYWxfbmFtZSAhPSAwKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCQl9CiAKIAkJLyogTW92ZSBvbiB0aGUgbmV4dCBzZWdtZW50ICovCkBAIC00OTUsMTggKzQ0NywxNyBAQAogCSpyZXN1bHQgPSAwOwogCiAJaWYgKGluZm8tPmZ1bGx5X3F1YWxpZmllZCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiUmV0dXJuaW5nIFslcF0gKGFicykgXCJcXCVzXCJcbiIsCi0JCQlpbnRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lKSk7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiUmV0dXJuaW5nIFslcF0gKHJlbCkgXCIlc1wiXG4iLAotCQkJaW50ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiUmV0dXJuaW5nIFslcF0gKGFicykgXCJcXCVzXCJcbiIsCisJCQkJICBpbnRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmV0dXJuaW5nIFslcF0gKHJlbCkgXCIlc1wiXG4iLAorCQkJCSAgaW50ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSkpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lCkBAIC01MjIsNTEgKzQ3Myw0MyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlcm5hbF9uYW1lLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipjb252ZXJ0ZWRfbmFtZSkKK2FjcGlfc3RhdHVzIGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZShjaGFyICpleHRlcm5hbF9uYW1lLCBjaGFyICoqY29udmVydGVkX25hbWUpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfbmFtZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gICAgIGluZm87Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJY2hhciAqaW50ZXJuYWxfbmFtZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19pbnRlcm5hbGl6ZV9uYW1lIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfaW50ZXJuYWxpemVfbmFtZSIpOwotCi0KLQlpZiAoKCFleHRlcm5hbF9uYW1lKSAgICAgfHwKLQkJKCpleHRlcm5hbF9uYW1lID09IDApIHx8Ci0JCSghY29udmVydGVkX25hbWUpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKCghZXh0ZXJuYWxfbmFtZSkgfHwgKCpleHRlcm5hbF9uYW1lID09IDApIHx8ICghY29udmVydGVkX25hbWUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IGludGVybmFsIG5hbWUgKi8KIAogCWluZm8uZXh0ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0JYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGggKCZpbmZvKTsKKwlhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aCgmaW5mbyk7CiAKIAkvKiBXZSBuZWVkIGEgc2VnbWVudCB0byBzdG9yZSB0aGUgaW50ZXJuYWwgIG5hbWUgKi8KIAotCWludGVybmFsX25hbWUgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKGluZm8ubGVuZ3RoKTsKKwlpbnRlcm5hbF9uYW1lID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGluZm8ubGVuZ3RoKTsKIAlpZiAoIWludGVybmFsX25hbWUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBCdWlsZCB0aGUgbmFtZSAqLwogCiAJaW5mby5pbnRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKLQlzdGF0dXMgPSBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUgKCZpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGludGVybmFsX25hbWUpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9uc19idWlsZF9pbnRlcm5hbF9uYW1lKCZpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9NRU1fRlJFRShpbnRlcm5hbF9uYW1lKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJKmNvbnZlcnRlZF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXh0ZXJuYWxpemVfbmFtZQpAQCAtNTg1LDI3ICs1MjgsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V4dGVybmFsaXplX25hbWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfbmFtZV9sZW5ndGgsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb252ZXJ0ZWRfbmFtZV9sZW5ndGgsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmNvbnZlcnRlZF9uYW1lKQorYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lKHUzMiBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKKwkJCSBjaGFyICppbnRlcm5hbF9uYW1lLAorCQkJIHUzMiAqIGNvbnZlcnRlZF9uYW1lX2xlbmd0aCwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKQogewotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgbmFtZXNfaW5kZXggPSAwOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgbnVtX3NlZ21lbnRzID0gMDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIHJlcXVpcmVkX2xlbmd0aDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIHByZWZpeF9sZW5ndGggPSAwOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaSA9IDA7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBqID0gMDsKKwlhY3BpX25hdGl2ZV91aW50IG5hbWVzX2luZGV4ID0gMDsKKwlhY3BpX25hdGl2ZV91aW50IG51bV9zZWdtZW50cyA9IDA7CisJYWNwaV9uYXRpdmVfdWludCByZXF1aXJlZF9sZW5ndGg7CisJYWNwaV9uYXRpdmVfdWludCBwcmVmaXhfbGVuZ3RoID0gMDsKKwlhY3BpX25hdGl2ZV91aW50IGkgPSAwOworCWFjcGlfbmF0aXZlX3VpbnQgaiA9IDA7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19leHRlcm5hbGl6ZV9uYW1lIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZXh0ZXJuYWxpemVfbmFtZSIpOwotCi0KLQlpZiAoIWludGVybmFsX25hbWVfbGVuZ3RoICAgfHwKLQkJIWludGVybmFsX25hbWUgICAgICAgICAgfHwKLQkJIWNvbnZlcnRlZF9uYW1lKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKCFpbnRlcm5hbF9uYW1lX2xlbmd0aCB8fCAhaW50ZXJuYWxfbmFtZSB8fCAhY29udmVydGVkX25hbWUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCkBAIC02MjAsOCArNTU3LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGludGVybmFsX25hbWVfbGVuZ3RoOyBpKyspIHsKIAkJCWlmIChpbnRlcm5hbF9uYW1lW2ldID09ICdeJykgewogCQkJCXByZWZpeF9sZW5ndGggPSBpICsgMTsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNjQ4LDcgKzU4NCw4IEBACiAKIAkJCW5hbWVzX2luZGV4ID0gcHJlZml4X2xlbmd0aCArIDI7CiAJCQludW1fc2VnbWVudHMgPSAoYWNwaV9uYXRpdmVfdWludCkgKHU4KQotCQkJCQkgICBpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KSAocHJlZml4X2xlbmd0aCArIDEpXTsKKwkJCSAgICBpbnRlcm5hbF9uYW1lWyhhY3BpX25hdGl2ZV91aW50KQorCQkJCQkgIChwcmVmaXhfbGVuZ3RoICsgMSldOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfRFVBTF9OQU1FX1BSRUZJWDoKQEAgLTY4MywyMyArNjIwLDIzIEBACiAJICogcHVuY3R1YXRpb24gKCcuJykgYmV0d2VlbiBvYmplY3QgbmFtZXMsIHBsdXMgdGhlIE5VTEwgdGVybWluYXRvci4KIAkgKi8KIAlyZXF1aXJlZF9sZW5ndGggPSBwcmVmaXhfbGVuZ3RoICsgKDQgKiBudW1fc2VnbWVudHMpICsKLQkJCSAgICgobnVtX3NlZ21lbnRzID4gMCkgPyAobnVtX3NlZ21lbnRzIC0gMSkgOiAwKSArIDE7CisJICAgICgobnVtX3NlZ21lbnRzID4gMCkgPyAobnVtX3NlZ21lbnRzIC0gMSkgOiAwKSArIDE7CiAKIAkvKgogCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBzdGlsbCBpbiBib3VuZHMuICBJZiBub3QsIHRoZXJlJ3MgYSBwcm9ibGVtCiAJICogd2l0aCBpbnRlcm5hbF9uYW1lIChpbnZhbGlkIGZvcm1hdCkuCiAJICovCiAJaWYgKHJlcXVpcmVkX2xlbmd0aCA+IGludGVybmFsX25hbWVfbGVuZ3RoKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIm5zX2V4dGVybmFsaXplX25hbWU6IEludmFsaWQgaW50ZXJuYWwgbmFtZVxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVRITkFNRSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfZXh0ZXJuYWxpemVfbmFtZTogSW52YWxpZCBpbnRlcm5hbCBuYW1lXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFUSE5BTUUpOwogCX0KIAogCS8qCiAJICogQnVpbGQgY29udmVydGVkX25hbWUKIAkgKi8KLQkqY29udmVydGVkX25hbWUgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHJlcXVpcmVkX2xlbmd0aCk7CisJKmNvbnZlcnRlZF9uYW1lID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHJlcXVpcmVkX2xlbmd0aCk7CiAJaWYgKCEoKmNvbnZlcnRlZF9uYW1lKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCWogPSAwOwpAQCAtNzI1LDEwICs2NjIsOSBAQAogCQkqY29udmVydGVkX25hbWVfbGVuZ3RoID0gKHUzMikgcmVxdWlyZWRfbGVuZ3RoOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUKQEAgLTc0NSwxMyArNjgxLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKQorc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4KQEAgLTc2NiwxNCArNjk5LDEzIEBACiAKIAkvKiBXZSBjYW4gYXQgbGVhc3QgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlIGhhbmRsZSAqLwogCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoaGFuZGxlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoaGFuZGxlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAotCXJldHVybiAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIGhhbmRsZSk7CisJcmV0dXJuICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiloYW5kbGUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUKQEAgLTc4NiwxOCArNzE4LDE0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9oYW5kbGUKLWFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICpub2RlKQorYWNwaV9oYW5kbGUgYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKIHsKIAotCiAJLyoKIAkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIG5vdzsKIAkgKi8KIAlyZXR1cm4gKChhY3BpX2hhbmRsZSkgbm9kZSk7CiAKLQogLyogRXhhbXBsZSBmdXR1cmUgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAlpZiAoIU5vZGUpCkBAIC04MTAsMTIgKzczOCwxMCBAQAogCQlyZXR1cm4gKEFDUElfUk9PVF9PQkpFQ1QpOwogCX0KIAotCiAJcmV0dXJuICgoYWNwaV9oYW5kbGUpIE5vZGUpOwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3Rlcm1pbmF0ZQpAQCAtODI4LDQyICs3NTQsMzcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX25zX3Rlcm1pbmF0ZSAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV9uc190ZXJtaW5hdGUodm9pZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX3Rlcm1pbmF0ZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfdGVybWluYXRlIik7CiAKIAkvKgogCSAqIDEpIEZyZWUgdGhlIGVudGlyZSBuYW1lc3BhY2UgLS0gYWxsIG5vZGVzIGFuZCBvYmplY3RzCiAJICoKIAkgKiBEZWxldGUgYWxsIG9iamVjdCBkZXNjcmlwdG9ycyBhdHRhY2hlZCB0byBuYW1lcHNhY2Ugbm9kZXMKIAkgKi8KLQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSAoYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZShhY3BpX2dibF9yb290X25vZGUpOwogCiAJLyogRGV0YWNoIGFueSBvYmplY3RzIGF0dGFjaGVkIHRvIHRoZSByb290ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChhY3BpX2dibF9yb290X25vZGUpOwogCWlmIChvYmpfZGVzYykgewotCQlhY3BpX25zX2RldGFjaF9vYmplY3QgKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCWFjcGlfbnNfZGV0YWNoX29iamVjdChhY3BpX2dibF9yb290X25vZGUpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJOYW1lc3BhY2UgZnJlZWRcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJOYW1lc3BhY2UgZnJlZWRcbiIpKTsKIAogCS8qCiAJICogMikgTm93IHdlIGNhbiBkZWxldGUgdGhlIEFDUEkgdGFibGVzCiAJICovCi0JYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyAoKTsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiQUNQSSBUYWJsZXMgZnJlZWRcbiIpKTsKKwlhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzKCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQUNQSSBUYWJsZXMgZnJlZWRcbiIpKTsKIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfb3BlbnNfc2NvcGUKQEAgLTg3NSwyNCArNzk2LDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCi1hY3BpX25zX29wZW5zX3Njb3BlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpCit1MzIgYWNwaV9uc19vcGVuc19zY29wZShhY3BpX29iamVjdF90eXBlIHR5cGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJuc19vcGVuc19zY29wZSIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJuc19vcGVuc19zY29wZSIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSk7CiAKLQotCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAodHlwZSkpIHsKKwlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUodHlwZSkpIHsKIAkJLyogdHlwZSBjb2RlIG91dCBvZiByYW5nZSAgKi8KIAotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIm5zX29wZW5zX3Njb3BlOiBJbnZhbGlkIE9iamVjdCBUeXBlICVYXG4iLCB0eXBlKSk7Ci0JCXJldHVybl9WQUxVRSAoQUNQSV9OU19OT1JNQUwpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfb3BlbnNfc2NvcGU6IEludmFsaWQgT2JqZWN0IFR5cGUgJVhcbiIsCisJCQkJICAgICB0eXBlKSk7CisJCXJldHVybl9WQUxVRShBQ1BJX05TX05PUk1BTCk7CiAJfQogCi0JcmV0dXJuX1ZBTFVFICgoKHUzMikgYWNwaV9nYmxfbnNfcHJvcGVydGllc1t0eXBlXSkgJiBBQ1BJX05TX05FV1NDT1BFKTsKKwlyZXR1cm5fVkFMVUUoKCh1MzIpIGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbdHlwZV0pICYgQUNQSV9OU19ORVdTQ09QRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoCkBAIC05MTYsMzMgKzgzNCwyOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipyZXR1cm5fbm9kZSkKK2FjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChjaGFyICpwYXRobmFtZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSwKKwkJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICBzY29wZV9pbmZvOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX3BhdGggPSBOVUxMOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSBzY29wZV9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwljaGFyICppbnRlcm5hbF9wYXRoID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJuc19nZXRfbm9kZV9ieV9wYXRoIiwgcGF0aG5hbWUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoIm5zX2dldF9ub2RlX2J5X3BhdGgiLCBwYXRobmFtZSk7CiAKIAlpZiAocGF0aG5hbWUpIHsKIAkJLyogQ29udmVydCBwYXRoIHRvIGludGVybmFsIHJlcHJlc2VudGF0aW9uICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lIChwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZShwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCiAJLyogTXVzdCBsb2NrIG5hbWVzcGFjZSBkdXJpbmcgbG9va3VwICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCkBAIC05NTIsMjUgKzg2NiwyNSBAQAogCiAJLyogTG9va3VwIHRoZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICgmc2NvcGVfaW5mbywgaW50ZXJuYWxfcGF0aCwKLQkJCSBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkgKGZsYWdzIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUpLAotCQkJIE5VTEwsIHJldHVybl9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICIlcywgJXNcbiIsCi0JCQkJaW50ZXJuYWxfcGF0aCwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoJnNjb3BlX2luZm8sIGludGVybmFsX3BhdGgsCisJCQkJQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCShmbGFncyB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFKSwKKwkJCQlOVUxMLCByZXR1cm5fbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzLCAlc1xuIiwKKwkJCQkgIGludGVybmFsX3BhdGgsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAKLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCWlmIChpbnRlcm5hbF9wYXRoKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGludGVybmFsX3BhdGgpOworCQlBQ1BJX01FTV9GUkVFKGludGVybmFsX3BhdGgpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGFyZW50X25vZGUKQEAgLTk4MywxMiArODk3LDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfcGFyZW50X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCSAgICAqbm9kZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKCFub2RlKSB7CiAJCXJldHVybiAoTlVMTCk7CkBAIC0xMDA2LDcgKzkxOCw2IEBACiAJcmV0dXJuIChub2RlLT5wZWVyKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUKQEAgLTEwMjEsOSArOTMyLDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqCi1hY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKHN0cnVjdAorCQkJCQkJCWFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkqbm9kZSkKIHsKIAogCS8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LCByZXR1cm4gTlVMTCAqLwpAQCAtMTAzNyw3ICs5NDgsNiBAQAogCXJldHVybiAobm9kZS0+cGVlcik7CiB9CiAKLQogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEwNTMsMzggKzk2MywzNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfbmFtZQotYWNwaV9uc19maW5kX3BhcmVudF9uYW1lICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlKQorYWNwaV9uYW1lIGFjcGlfbnNfZmluZF9wYXJlbnRfbmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGNoaWxkX25vZGUpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgibnNfZmluZF9wYXJlbnRfbmFtZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZmluZF9wYXJlbnRfbmFtZSIpOwogCiAJaWYgKGNoaWxkX25vZGUpIHsKIAkJLyogVmFsaWQgZW50cnkuICBHZXQgdGhlIHBhcmVudCBOb2RlICovCiAKLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAoY2hpbGRfbm9kZSk7CisJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUoY2hpbGRfbm9kZSk7CiAJCWlmIChwYXJlbnRfbm9kZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCQkiUGFyZW50IG9mICVwIFslNC40c10gaXMgJXAgWyU0LjRzXVxuIiwKLQkJCQljaGlsZF9ub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKGNoaWxkX25vZGUpLAotCQkJCXBhcmVudF9ub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKHBhcmVudF9ub2RlKSkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkgICJQYXJlbnQgb2YgJXAgWyU0LjRzXSBpcyAlcCBbJTQuNHNdXG4iLAorCQkJCQkgIGNoaWxkX25vZGUsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGNoaWxkX25vZGUpLAorCQkJCQkgIHBhcmVudF9ub2RlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwYXJlbnRfbm9kZSkpKTsKIAogCQkJaWYgKHBhcmVudF9ub2RlLT5uYW1lLmludGVnZXIpIHsKLQkJCQlyZXR1cm5fVkFMVUUgKChhY3BpX25hbWUpIHBhcmVudF9ub2RlLT5uYW1lLmludGVnZXIpOworCQkJCXJldHVybl9WQUxVRSgoYWNwaV9uYW1lKSBwYXJlbnRfbm9kZS0+bmFtZS4KKwkJCQkJICAgICBpbnRlZ2VyKTsKIAkJCX0KIAkJfQogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiVW5hYmxlIHRvIGZpbmQgcGFyZW50IG9mICVwICglNC40cylcbiIsCi0JCQljaGlsZF9ub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKGNoaWxkX25vZGUpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJVbmFibGUgdG8gZmluZCBwYXJlbnQgb2YgJXAgKCU0LjRzKVxuIiwKKwkJCQkgIGNoaWxkX25vZGUsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoY2hpbGRfbm9kZSkpKTsKIAl9CiAKLQlyZXR1cm5fVkFMVUUgKEFDUElfVU5LTk9XTl9OQU1FKTsKKwlyZXR1cm5fVkFMVUUoQUNQSV9VTktOT1dOX05BTUUpOwogfQogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKaW5kZXggZjlhNzI3Ny4uNWYxNjRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCkBAIC00MSwxNCArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3dhbGsiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc3dhbGsiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY4LDE4ICs2NSwxNSBAQAogICogICAgICAgICAgICAgIHdpdGhpbiBTY29wZSBpcyByZXR1cm5lZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqCi1hY3BpX25zX2dldF9uZXh0X25vZGUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnRfbm9kZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlKQorc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfbm9kZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpwYXJlbnRfbm9kZSwKKwkJCQkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCSAgKmNoaWxkX25vZGUpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbmV4dF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV4dF9ub2RlID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmICghY2hpbGRfbm9kZSkgewogCQkvKiBJdCdzIHJlYWxseSB0aGUgcGFyZW50J3MgX3Njb3BlXyB0aGF0IHdlIHdhbnQgKi8KQEAgLTkyLDcgKzg2LDcgQEAKIAllbHNlIHsKIAkJLyogU3RhcnQgc2VhcmNoIGF0IHRoZSBORVhUIG5vZGUgKi8KIAotCQluZXh0X25vZGUgPSBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUgKGNoaWxkX25vZGUpOworCQluZXh0X25vZGUgPSBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUoY2hpbGRfbm9kZSk7CiAJfQogCiAJLyogSWYgYW55IHR5cGUgaXMgT0ssIHdlIGFyZSBkb25lICovCkBAIC0xMTQsNyArMTA4LDcgQEAKIAogCQkvKiBPdGhlcndpc2UsIG1vdmUgb24gdG8gdGhlIG5leHQgbm9kZSAqLwogCi0JCW5leHRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAobmV4dF9ub2RlKTsKKwkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKG5leHRfbm9kZSk7CiAJfQogCiAJLyogTm90IGZvdW5kICovCkBAIC0xMjIsNyArMTE2LDYgQEAKIAlyZXR1cm4gKE5VTEwpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UKQEAgLTE1NCwyNSArMTQ3LDIxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc193YWxrX25hbWVzcGFjZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubG9ja19iZWZvcmVfY2FsbGJhY2ssCi0JYWNwaV93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfbnNfd2Fsa19uYW1lc3BhY2UoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgICAgYWNwaV9oYW5kbGUgc3RhcnRfbm9kZSwKKwkJICAgICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICAgICB1OCB1bmxvY2tfYmVmb3JlX2NhbGxiYWNrLAorCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgbXV0ZXhfc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGU7Ci0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBjaGlsZF90eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc3RhdHVzIG11dGV4X3N0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisJYWNwaV9vYmplY3RfdHlwZSBjaGlsZF90eXBlOworCXUzMiBsZXZlbDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm5zX3dhbGtfbmFtZXNwYWNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc193YWxrX25hbWVzcGFjZSIpOwogCiAJLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgbmFtZXNwYWNlIFJvb3QgTm9kZSAqLwogCkBAIC0xODMsOSArMTcyLDkgQEAKIAkvKiBOdWxsIGNoaWxkIG1lYW5zICJnZXQgZmlyc3Qgbm9kZSIgKi8KIAogCXBhcmVudF9ub2RlID0gc3RhcnRfbm9kZTsKLQljaGlsZF9ub2RlICA9IE5VTEw7Ci0JY2hpbGRfdHlwZSAgPSBBQ1BJX1RZUEVfQU5ZOwotCWxldmVsICAgICAgID0gMTsKKwljaGlsZF9ub2RlID0gTlVMTDsKKwljaGlsZF90eXBlID0gQUNQSV9UWVBFX0FOWTsKKwlsZXZlbCA9IDE7CiAKIAkvKgogCSAqIFRyYXZlcnNlIHRoZSB0cmVlIG9mIG5vZGVzIHVudGlsIHdlIGJ1YmJsZSBiYWNrIHVwIHRvIHdoZXJlIHdlCkBAIC0xOTYsNyArMTg1LDkgQEAKIAkJLyogR2V0IHRoZSBuZXh0IG5vZGUgaW4gdGhpcyBzY29wZS4gIE51bGwgaWYgbm90IGZvdW5kICovCiAKIAkJc3RhdHVzID0gQUVfT0s7Ci0JCWNoaWxkX25vZGUgPSBhY3BpX25zX2dldF9uZXh0X25vZGUgKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKTsKKwkJY2hpbGRfbm9kZSA9CisJCSAgICBhY3BpX25zX2dldF9uZXh0X25vZGUoQUNQSV9UWVBFX0FOWSwgcGFyZW50X25vZGUsCisJCQkJCSAgY2hpbGRfbm9kZSk7CiAJCWlmIChjaGlsZF9ub2RlKSB7CiAJCQkvKgogCQkJICogRm91bmQgbm9kZSwgR2V0IHRoZSB0eXBlIGlmIHdlIGFyZSBub3QKQEAgLTIxMiwxOSArMjAzLDI1IEBACiAJCQkJICogY2FsbGJhY2sgZnVuY3Rpb24KIAkJCQkgKi8KIAkJCQlpZiAodW5sb2NrX2JlZm9yZV9jYWxsYmFjaykgewotCQkJCQltdXRleF9zdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKG11dGV4X3N0YXR1cykpIHsKLQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAobXV0ZXhfc3RhdHVzKTsKKwkJCQkJbXV0ZXhfc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfdXRfcmVsZWFzZV9tdXRleAorCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUobXV0ZXhfc3RhdHVzKSkgeworCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJCQkgICAgKG11dGV4X3N0YXR1cyk7CiAJCQkJCX0KIAkJCQl9CiAKLQkJCQlzdGF0dXMgPSB1c2VyX2Z1bmN0aW9uIChjaGlsZF9ub2RlLCBsZXZlbCwKLQkJCQkJCSBjb250ZXh0LCByZXR1cm5fdmFsdWUpOworCQkJCXN0YXR1cyA9IHVzZXJfZnVuY3Rpb24oY2hpbGRfbm9kZSwgbGV2ZWwsCisJCQkJCQkgICAgICAgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKIAogCQkJCWlmICh1bmxvY2tfYmVmb3JlX2NhbGxiYWNrKSB7Ci0JCQkJCW11dGV4X3N0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAobXV0ZXhfc3RhdHVzKSkgewotCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChtdXRleF9zdGF0dXMpOworCQkJCQltdXRleF9zdGF0dXMgPQorCQkJCQkgICAgYWNwaV91dF9hY3F1aXJlX211dGV4CisJCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShtdXRleF9zdGF0dXMpKSB7CisJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKKwkJCQkJCSAgICAobXV0ZXhfc3RhdHVzKTsKIAkJCQkJfQogCQkJCX0KIApAQCAtMjM5LDEzICsyMzYsMTMgQEAKIAogCQkJCQkvKiBFeGl0IG5vdywgd2l0aCBPSyBzdGF0dXMgKi8KIAotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAogCQkJCWRlZmF1bHQ6CiAKIAkJCQkJLyogQWxsIG90aGVycyBhcmUgdmFsaWQgZXhjZXB0aW9ucyAqLwogCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCQkJfQogCkBAIC0yNTgsNyArMjU1LDggQEAKIAkJCSAqIG1heGltdW0gZGVwdGggaGFzIGJlZW4gcmVhY2hlZC4KIAkJCSAqLwogCQkJaWYgKChsZXZlbCA8IG1heF9kZXB0aCkgJiYgKHN0YXR1cyAhPSBBRV9DVFJMX0RFUFRIKSkgewotCQkJCWlmIChhY3BpX25zX2dldF9uZXh0X25vZGUgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7CisJCQkJaWYgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQorCQkJCSAgICAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfbm9kZSwgTlVMTCkpIHsKIAkJCQkJLyoKIAkJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMKIAkJCQkJICogbm9kZSwgdmlzaXQgdGhlIG9uZGUKQEAgLTI2OCw4ICsyNjYsNyBAQAogCQkJCQljaGlsZF9ub2RlID0gTlVMTDsKIAkJCQl9CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogTm8gbW9yZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQogCQkJICogZmFpbGVkKSwgZ28gYmFjayB1cHdhcmRzIGluIHRoZSBuYW1lc3BhY2UgdHJlZSB0bwpAQCAtMjc3LDEzICsyNzQsMTEgQEAKIAkJCSAqLwogCQkJbGV2ZWwtLTsKIAkJCWNoaWxkX25vZGUgPSBwYXJlbnRfbm9kZTsKLQkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKHBhcmVudF9ub2RlKTsKKwkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwogCQl9CiAJfQogCiAJLyogQ29tcGxldGUgd2Fsaywgbm90IHRlcm1pbmF0ZWQgYnkgdXNlciBmdW5jdGlvbiAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKaW5kZXggMTJlYTIwMi4uYzA3YjA0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYwpAQCAtNDgsMTAgKzQ4LDggQEAKICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnN4ZmV2YWwiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJuc3hmZXZhbCIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzMsMjcgKzcxLDIzIEBACiAgKiAgICAgICAgICAgICAgYmUgdmFsaWQgKG5vbi1udWxsKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICAgICAgICAgKmV4dGVybmFsX3BhcmFtcywKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXR1cm5fYnVmZmVyLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgcmV0dXJuX3R5cGUpCithY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICBhY3BpX3N0cmluZyBwYXRobmFtZSwKKwkJCSAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpleHRlcm5hbF9wYXJhbXMsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9idWZmZXIsCisJCQkgICBhY3BpX29iamVjdF90eXBlIHJldHVybl90eXBlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdF9mcmVlID0gRkFMU0U7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4IG11c3RfZnJlZSA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkIik7CiAKIAkvKiBSZXR1cm4gYnVmZmVyIG11c3QgYmUgdmFsaWQgKi8KIAogCWlmICghcmV0dXJuX2J1ZmZlcikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJaWYgKHJldHVybl9idWZmZXItPmxlbmd0aCA9PSBBQ1BJX0FMTE9DQVRFX0JVRkZFUikgewpAQCAtMTAyLDUxICs5Niw1MiBAQAogCiAJLyogRXZhbHVhdGUgdGhlIG9iamVjdCAqLwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgcGF0aG5hbWUsIGV4dGVybmFsX3BhcmFtcywgcmV0dXJuX2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBwYXRobmFtZSwgZXh0ZXJuYWxfcGFyYW1zLAorCQkJCSByZXR1cm5fYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogVHlwZSBBTlkgbWVhbnMgImRvbid0IGNhcmUiICovCiAKIAlpZiAocmV0dXJuX3R5cGUgPT0gQUNQSV9UWVBFX0FOWSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAlpZiAocmV0dXJuX2J1ZmZlci0+bGVuZ3RoID09IDApIHsKIAkJLyogRXJyb3IgYmVjYXVzZSBjYWxsZXIgc3BlY2lmaWNhbGx5IGFza2VkIGZvciBhIHJldHVybiB2YWx1ZSAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk5vIHJldHVybiB2YWx1ZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTm8gcmV0dXJuIHZhbHVlXG4iKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OVUxMX09CSkVDVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CiAJfQogCiAJLyogRXhhbWluZSB0aGUgb2JqZWN0IHR5cGUgcmV0dXJuZWQgZnJvbSBldmFsdWF0ZV9vYmplY3QgKi8KIAotCWlmICgoKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJldHVybl9idWZmZXItPnBvaW50ZXIpLT50eXBlID09IHJldHVybl90eXBlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCWlmICgoKHVuaW9uIGFjcGlfb2JqZWN0ICopcmV0dXJuX2J1ZmZlci0+cG9pbnRlciktPnR5cGUgPT0gcmV0dXJuX3R5cGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBSZXR1cm4gb2JqZWN0IHR5cGUgZG9lcyBub3QgbWF0Y2ggcmVxdWVzdGVkIHR5cGUgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkiSW5jb3JyZWN0IHJldHVybiB0eXBlIFslc10gcmVxdWVzdGVkIFslc11cbiIsCi0JCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoKCh1bmlvbiBhY3BpX29iamVjdCAqKSByZXR1cm5fYnVmZmVyLT5wb2ludGVyKS0+dHlwZSksCi0JCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAocmV0dXJuX3R5cGUpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCSAgIkluY29ycmVjdCByZXR1cm4gdHlwZSBbJXNdIHJlcXVlc3RlZCBbJXNdXG4iLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoKCh1bmlvbiBhY3BpX29iamVjdCAqKQorCQkJCQkJIHJldHVybl9idWZmZXItPnBvaW50ZXIpLT50eXBlKSwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHJldHVybl90eXBlKSkpOwogCiAJaWYgKG11c3RfZnJlZSkgewogCQkvKiBDYWxsZXIgdXNlZCBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgZnJlZSB0aGUgcmV0dXJuIGJ1ZmZlciAqLwogCi0JCWFjcGlfb3NfZnJlZSAocmV0dXJuX2J1ZmZlci0+cG9pbnRlcik7CisJCWFjcGlfb3NfZnJlZShyZXR1cm5fYnVmZmVyLT5wb2ludGVyKTsKIAkJcmV0dXJuX2J1ZmZlci0+cG9pbnRlciA9IE5VTEw7CiAJfQogCiAJcmV0dXJuX2J1ZmZlci0+bGVuZ3RoID0gMDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE2OSwyMSArMTY0LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldmFsdWF0ZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgICAgICAgICAqZXh0ZXJuYWxfcGFyYW1zLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldHVybl9idWZmZXIpCithY3BpX2V2YWx1YXRlX29iamVjdChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCSAgICAgYWNwaV9zdHJpbmcgcGF0aG5hbWUsCisJCSAgICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmV4dGVybmFsX3BhcmFtcywKKwkJICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9idWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMyOwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgaW5mbzsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zcGFjZV9uZWVkZWQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMyOworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJYWNwaV9zaXplIGJ1ZmZlcl9zcGFjZV9uZWVkZWQ7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2V2YWx1YXRlX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ldmFsdWF0ZV9vYmplY3QiKTsKIAogCWluZm8ubm9kZSA9IGhhbmRsZTsKIAlpbmZvLnBhcmFtZXRlcnMgPSBOVUxMOwpAQCAtMjAwLDExICsxOTIsMTEgQEAKIAkJICogQWxsb2NhdGUgYSBuZXcgcGFyYW1ldGVyIGJsb2NrIGZvciB0aGUgaW50ZXJuYWwgb2JqZWN0cwogCQkgKiBBZGQgMSB0byBjb3VudCB0byBhbGxvdyBmb3IgbnVsbCB0ZXJtaW5hdGVkIGludGVybmFsIGxpc3QKIAkJICovCi0JCWluZm8ucGFyYW1ldGVycyA9IEFDUElfTUVNX0NBTExPQ0FURSAoCi0JCQkJICgoYWNwaV9zaXplKSBleHRlcm5hbF9wYXJhbXMtPmNvdW50ICsgMSkgKgotCQkJCSBzaXplb2YgKHZvaWQgKikpOworCQlpbmZvLnBhcmFtZXRlcnMgPSBBQ1BJX01FTV9DQUxMT0NBVEUoKChhY3BpX3NpemUpCisJCQkJCQkgICAgICBleHRlcm5hbF9wYXJhbXMtPmNvdW50ICsKKwkJCQkJCSAgICAgIDEpICogc2l6ZW9mKHZvaWQgKikpOwogCQlpZiAoIWluZm8ucGFyYW1ldGVycykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQkvKgpAQCAtMjEyLDQ4ICsyMDQsNDcgQEAKIAkJICogaW50ZXJuYWwgb2JqZWN0CiAJCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgZXh0ZXJuYWxfcGFyYW1zLT5jb3VudDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0ICgmZXh0ZXJuYWxfcGFyYW1zLT5wb2ludGVyW2ldLAotCQkJCQkgICZpbmZvLnBhcmFtZXRlcnNbaV0pOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0IChpbmZvLnBhcmFtZXRlcnMpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCgmZXh0ZXJuYWxfcGFyYW1zLT4KKwkJCQkJCQkgICAgcG9pbnRlcltpXSwKKwkJCQkJCQkgICAgJmluZm8uCisJCQkJCQkJICAgIHBhcmFtZXRlcnNbaV0pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QoaW5mby4KKwkJCQkJCQkJICAgIHBhcmFtZXRlcnMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCQl9CiAJCWluZm8ucGFyYW1ldGVyc1tleHRlcm5hbF9wYXJhbXMtPmNvdW50XSA9IE5VTEw7CiAJfQogCi0KIAkvKgogCSAqIFRocmVlIG1ham9yIGNhc2VzOgogCSAqIDEpIEZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZQogCSAqIDIpIE5vIGhhbmRsZSwgbm90IGZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZSAoZXJyb3IpCiAJICogMykgVmFsaWQgaGFuZGxlCiAJICovCi0JaWYgKChwYXRobmFtZSkgJiYKLQkJKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKHBhdGhuYW1lWzBdKSkpIHsKKwlpZiAoKHBhdGhuYW1lKSAmJiAoYWNwaV9uc192YWxpZF9yb290X3ByZWZpeChwYXRobmFtZVswXSkpKSB7CiAJCS8qCiAJCSAqICBUaGUgcGF0aCBpcyBmdWxseSBxdWFsaWZpZWQsIGp1c3QgZXZhbHVhdGUgYnkgbmFtZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lIChwYXRobmFtZSwgJmluZm8pOwotCX0KLQllbHNlIGlmICghaGFuZGxlKSB7CisJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZShwYXRobmFtZSwgJmluZm8pOworCX0gZWxzZSBpZiAoIWhhbmRsZSkgewogCQkvKgogCQkgKiBBIGhhbmRsZSBpcyBvcHRpb25hbCBpZmYgYSBmdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUKIAkJICogaXMgc3BlY2lmaWVkLiAgU2luY2Ugd2UndmUgYWxyZWFkeSBoYW5kbGVkIGZ1bGx5CiAJCSAqIHF1YWxpZmllZCBuYW1lcyBhYm92ZSwgdGhpcyBpcyBhbiBlcnJvcgogCQkgKi8KIAkJaWYgKCFwYXRobmFtZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkJvdGggSGFuZGxlIGFuZCBQYXRobmFtZSBhcmUgTlVMTFxuIikpOwotCQl9Ci0JCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkhhbmRsZSBpcyBOVUxMIGFuZCBQYXRobmFtZSBpcyByZWxhdGl2ZVxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQm90aCBIYW5kbGUgYW5kIFBhdGhuYW1lIGFyZSBOVUxMXG4iKSk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJIYW5kbGUgaXMgTlVMTCBhbmQgUGF0aG5hbWUgaXMgcmVsYXRpdmVcbiIpKTsKIAkJfQogCiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFdlIGdldCBoZXJlIGlmIHdlIGhhdmUgYSBoYW5kbGUgLS0gYW5kIGlmIHdlIGhhdmUgYQogCQkgKiBwYXRobmFtZSBpdCBpcyByZWxhdGl2ZS4gIFRoZSBoYW5kbGUgd2lsbCBiZSB2YWxpZGF0ZWQKQEAgLTI2NCwxNyArMjU1LDE1IEBACiAJCQkgKiBUaGUgbnVsbCBwYXRobmFtZSBjYXNlIG1lYW5zIHRoZSBoYW5kbGUgaXMgZm9yCiAJCQkgKiB0aGUgYWN0dWFsIG9iamVjdCB0byBiZSBldmFsdWF0ZWQKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUgKCZpbmZvKTsKLQkJfQotCQllbHNlIHsKLQkJICAgLyoKLQkJCSogQm90aCBhIEhhbmRsZSBhbmQgYSByZWxhdGl2ZSBQYXRobmFtZQotCQkJKi8KLQkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKHBhdGhuYW1lLCAmaW5mbyk7CisJCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSgmaW5mbyk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQm90aCBhIEhhbmRsZSBhbmQgYSByZWxhdGl2ZSBQYXRobmFtZQorCQkJICovCisJCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlKHBhdGhuYW1lLCAmaW5mbyk7CiAJCX0KIAl9CiAKLQogCS8qCiAJICogSWYgd2UgYXJlIGV4cGVjdGluZyBhIHJldHVybiB2YWx1ZSwgYW5kIGFsbCB3ZW50IHdlbGwgYWJvdmUsCiAJICogY29weSB0aGUgcmV0dXJuIHZhbHVlIHRvIGFuIGV4dGVybmFsIG9iamVjdC4KQEAgLTI4Miw5ICsyNzEsOSBAQAogCWlmIChyZXR1cm5fYnVmZmVyKSB7CiAJCWlmICghaW5mby5yZXR1cm5fb2JqZWN0KSB7CiAJCQlyZXR1cm5fYnVmZmVyLT5sZW5ndGggPSAwOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoaW5mby5yZXR1cm5fb2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQl9IGVsc2UgeworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbmZvLnJldHVybl9vYmplY3QpID09CisJCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAkJCQkvKgogCQkJCSAqIElmIHdlIHJlY2VpdmVkIGEgTlMgTm9kZSBhcyBhIHJldHVybiBvYmplY3QsIHRoaXMgbWVhbnMgdGhhdAogCQkJCSAqIHRoZSBvYmplY3Qgd2UgYXJlIGV2YWx1YXRpbmcgaGFzIG5vdGhpbmcgaW50ZXJlc3RpbmcgdG8KQEAgLTI5NCwzNyArMjgzLDQzIEBACiAJCQkJICogc3VwcG9ydCBmb3IgdmFyaW91cyB0eXBlcyBhdCBhIGxhdGVyIGRhdGUgaWYgbmVjZXNzYXJ5LgogCQkJCSAqLwogCQkJCXN0YXR1cyA9IEFFX1RZUEU7Ci0JCQkJaW5mby5yZXR1cm5fb2JqZWN0ID0gTlVMTDsgIC8qIE5vIG5lZWQgdG8gZGVsZXRlIGEgTlMgTm9kZSAqLworCQkJCWluZm8ucmV0dXJuX29iamVjdCA9IE5VTEw7CS8qIE5vIG5lZWQgdG8gZGVsZXRlIGEgTlMgTm9kZSAqLwogCQkJCXJldHVybl9idWZmZXItPmxlbmd0aCA9IDA7CiAJCQl9CiAKLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJCS8qCiAJCQkJICogRmluZCBvdXQgaG93IGxhcmdlIGEgYnVmZmVyIGlzIG5lZWRlZAogCQkJCSAqIHRvIGNvbnRhaW4gdGhlIHJldHVybmVkIG9iamVjdAogCQkJCSAqLwotCQkJCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X29iamVjdF9zaXplIChpbmZvLnJldHVybl9vYmplY3QsCi0JCQkJCQkgICAmYnVmZmVyX3NwYWNlX25lZWRlZCk7Ci0JCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF9zaXplKGluZm8ucmV0dXJuX29iamVjdCwKKwkJCQkJCQkgICAgJmJ1ZmZlcl9zcGFjZV9uZWVkZWQpOworCQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJCQkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQkJCQkJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAocmV0dXJuX2J1ZmZlciwKLQkJCQkJCQkgIGJ1ZmZlcl9zcGFjZV9uZWVkZWQpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyCisJCQkJCSAgICAocmV0dXJuX2J1ZmZlciwKKwkJCQkJICAgICBidWZmZXJfc3BhY2VfbmVlZGVkKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCQkvKgogCQkJCQkJICogQ2FsbGVyJ3MgYnVmZmVyIGlzIHRvbyBzbWFsbCBvciBhIG5ldyBvbmUgY2FuJ3QgYmUgYWxsb2NhdGVkCiAJCQkJCQkgKi8KLQkJCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJCQkJIk5lZWRlZCBidWZmZXIgc2l6ZSAlWCwgJXNcbiIsCi0JCQkJCQkJKHUzMikgYnVmZmVyX3NwYWNlX25lZWRlZCwKLQkJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKKwkJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJCQkJICAiTmVlZGVkIGJ1ZmZlciBzaXplICVYLCAlc1xuIiwKKwkJCQkJCQkJICAodTMyKQorCQkJCQkJCQkgIGJ1ZmZlcl9zcGFjZV9uZWVkZWQsCisJCQkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCisJCQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQkJfSBlbHNlIHsKIAkJCQkJCS8qCiAJCQkJCQkgKiAgV2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBvYmplY3QsIGJ1aWxkIGl0CiAJCQkJCQkgKi8KLQkJCQkJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QgKGluZm8ucmV0dXJuX29iamVjdCwKLQkJCQkJCQkJICByZXR1cm5fYnVmZmVyKTsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdAorCQkJCQkJICAgIChpbmZvLnJldHVybl9vYmplY3QsCisJCQkJCQkgICAgIHJldHVybl9idWZmZXIpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMzM2LDE0ICszMzEsMTQgQEAKIAkJICogRGVsZXRlIHRoZSBpbnRlcm5hbCByZXR1cm4gb2JqZWN0LiAgTk9URTogSW50ZXJwcmV0ZXIKIAkJICogbXVzdCBiZSBsb2NrZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24uCiAJCSAqLwotCQlzdGF0dXMyID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzMikpIHsKKwkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMyKSkgewogCQkJLyoKIAkJCSAqIERlbGV0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdC4gKE9yIGF0IGxlYXN0CiAJCQkgKiBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBieSBvbmUpCiAJCQkgKi8KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaW5mby5yZXR1cm5fb2JqZWN0KTsKLQkJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLnJldHVybl9vYmplY3QpOworCQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJCX0KIAl9CiAKQEAgLTM1MywxMyArMzQ4LDEzIEBACiAJaWYgKGluZm8ucGFyYW1ldGVycykgewogCQkvKiBGcmVlIHRoZSBhbGxvY2F0ZWQgcGFyYW1ldGVyIGJsb2NrICovCiAKLQkJYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QgKGluZm8ucGFyYW1ldGVycyk7CisJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KGluZm8ucGFyYW1ldGVycyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX29iamVjdCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9vYmplY3QpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM5MiwyNiArMzg3LDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV93YWxrX25hbWVzcGFjZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2JqZWN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLAotCWFjcGlfd2Fsa19jYWxsYmFjayAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpCithY3BpX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgIGFjcGlfaGFuZGxlIHN0YXJ0X29iamVjdCwKKwkJICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICBhY3BpX3dhbGtfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwKKwkJICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV93YWxrX25hbWVzcGFjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV93YWxrX25hbWVzcGFjZSIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAotCWlmICgodHlwZSA+IEFDUElfVFlQRV9FWFRFUk5BTF9NQVgpIHx8Ci0JCSghbWF4X2RlcHRoKSAgICAgICAgICAgICAgICAgICAgfHwKLQkJKCF1c2VyX2Z1bmN0aW9uKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgodHlwZSA+IEFDUElfVFlQRV9FWFRFUk5BTF9NQVgpIHx8ICghbWF4X2RlcHRoKSB8fCAoIXVzZXJfZnVuY3Rpb24pKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgpAQCAtNDIwLDIwICs0MDksMjAgQEAKIAkgKiB0byB0aGUgdXNlciBmdW5jdGlvbiAtIHNpbmNlIHRoaXMgZnVuY3Rpb24KIAkgKiBtdXN0IGJlIGFsbG93ZWQgdG8gbWFrZSBBY3BpIGNhbGxzIGl0c2VsZi4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKHR5cGUsIHN0YXJ0X29iamVjdCwgbWF4X2RlcHRoLAotCQkJICBBQ1BJX05TX1dBTEtfVU5MT0NLLAotCQkJICB1c2VyX2Z1bmN0aW9uLCBjb250ZXh0LCByZXR1cm5fdmFsdWUpOworCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UodHlwZSwgc3RhcnRfb2JqZWN0LCBtYXhfZGVwdGgsCisJCQkJCUFDUElfTlNfV0FMS19VTkxPQ0ssCisJCQkJCXVzZXJfZnVuY3Rpb24sIGNvbnRleHQsIHJldHVybl92YWx1ZSk7CiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV93YWxrX25hbWVzcGFjZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV93YWxrX25hbWVzcGFjZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDUwLDI5ICs0MzksMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjayhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJICAgIHUzMiBuZXN0aW5nX2xldmVsLAorCQkJICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7Ci0Jc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbyAgICAqaW5mbyA9IGNvbnRleHQ7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotCXN0cnVjdCBhY3BpX2RldmljZV9pZCAgICAgICAgICAgaGlkOworCXN0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8gKmluZm8gPSBjb250ZXh0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGFjcGlfZGV2aWNlX2lkIGhpZDsKIAlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGk7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIApAQCAtNDgyLDggKzQ2OCw4IEBACiAKIAkvKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgZGV2aWNlIGlzIHByZXNlbnQgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEgKG5vZGUsICZmbGFncyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEobm9kZSwgJmZsYWdzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKIAl9CiAKQEAgLTQ5Niw0NCArNDgyLDQzIEBACiAJLyogRmlsdGVyIGJhc2VkIG9uIGRldmljZSBISUQgJiBDSUQgKi8KIAogCWlmIChpbmZvLT5oaWQgIT0gTlVMTCkgewotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfSElEIChub2RlLCAmaGlkKTsKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRChub2RlLCAmaGlkKTsKIAkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKIAkJCXJldHVybiAoQUVfT0spOwotCQl9Ci0JCWVsc2UgaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQl9IGVsc2UgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKEFFX0NUUkxfREVQVEgpOwogCQl9CiAKLQkJaWYgKEFDUElfU1RSTkNNUCAoaGlkLnZhbHVlLCBpbmZvLT5oaWQsIHNpemVvZiAoaGlkLnZhbHVlKSkgIT0gMCkgeworCQlpZiAoQUNQSV9TVFJOQ01QKGhpZC52YWx1ZSwgaW5mby0+aGlkLCBzaXplb2YoaGlkLnZhbHVlKSkgIT0gMCkgewogCQkJLyogR2V0IHRoZSBsaXN0IG9mIENvbXBhdGlibGUgSURzICovCiAKLQkJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9DSUQgKG5vZGUsICZjaWQpOworCQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0NJRChub2RlLCAmY2lkKTsKIAkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CiAJCQkJcmV0dXJuIChBRV9PSyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCX0gZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlyZXR1cm4gKEFFX0NUUkxfREVQVEgpOwogCQkJfQogCiAJCQkvKiBXYWxrIHRoZSBDSUQgbGlzdCAqLwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgY2lkLT5jb3VudDsgaSsrKSB7Ci0JCQkJaWYgKEFDUElfU1RSTkNNUCAoY2lkLT5pZFtpXS52YWx1ZSwgaW5mby0+aGlkLAotCQkJCQkJIHNpemVvZiAoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCkpICE9IDApIHsKLQkJCQkJQUNQSV9NRU1fRlJFRSAoY2lkKTsKKwkJCQlpZiAoQUNQSV9TVFJOQ01QKGNpZC0+aWRbaV0udmFsdWUsIGluZm8tPmhpZCwKKwkJCQkJCSBzaXplb2Yoc3RydWN0CisJCQkJCQkJYWNwaV9jb21wYXRpYmxlX2lkKSkgIT0KKwkJCQkgICAgMCkgeworCQkJCQlBQ1BJX01FTV9GUkVFKGNpZCk7CiAJCQkJCXJldHVybiAoQUVfT0spOwogCQkJCX0KIAkJCX0KLQkJCUFDUElfTUVNX0ZSRUUgKGNpZCk7CisJCQlBQ1BJX01FTV9GUkVFKGNpZCk7CiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBpbmZvLT51c2VyX2Z1bmN0aW9uIChvYmpfaGFuZGxlLCBuZXN0aW5nX2xldmVsLCBpbmZvLT5jb250ZXh0LAotCQkJIHJldHVybl92YWx1ZSk7CisJc3RhdHVzID0gaW5mby0+dXNlcl9mdW5jdGlvbihvYmpfaGFuZGxlLCBuZXN0aW5nX2xldmVsLCBpbmZvLT5jb250ZXh0LAorCQkJCSAgICAgcmV0dXJuX3ZhbHVlKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZGV2aWNlcwpAQCAtNTYwLDMyICs1NDUsMjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9kZXZpY2VzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpISUQsCi0JYWNwaV93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSkKK2FjcGlfZ2V0X2RldmljZXMoY2hhciAqSElELAorCQkgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8gICAgaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbyBpbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfZGV2aWNlcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfZGV2aWNlcyIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmICghdXNlcl9mdW5jdGlvbikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyoKIAkgKiBXZSdyZSBnb2luZyB0byBjYWxsIHRoZWlyIGNhbGxiYWNrIGZyb20gT1VSIGNhbGxiYWNrLCBzbyB3ZSBuZWVkCiAJICogdG8ga25vdyB3aGF0IGl0IGlzLCBhbmQgdGhlaXIgY29udGV4dCBwYXJhbWV0ZXIuCiAJICovCi0JaW5mby5jb250ZXh0ICAgICAgPSBjb250ZXh0OworCWluZm8uY29udGV4dCA9IGNvbnRleHQ7CiAJaW5mby51c2VyX2Z1bmN0aW9uID0gdXNlcl9mdW5jdGlvbjsKLQlpbmZvLmhpZCAgICAgICAgICA9IEhJRDsKKwlpbmZvLmhpZCA9IEhJRDsKIAogCS8qCiAJICogTG9jayB0aGUgbmFtZXNwYWNlIGFyb3VuZCB0aGUgd2Fsay4KQEAgLTU5MywyMiArNTc0LDIyIEBACiAJICogdG8gdGhlIHVzZXIgZnVuY3Rpb24gLSBzaW5jZSB0aGlzIGZ1bmN0aW9uCiAJICogbXVzdCBiZSBhbGxvd2VkIHRvIG1ha2UgQWNwaSBjYWxscyBpdHNlbGYuCiAJICovCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIChBQ1BJX1RZUEVfREVWSUNFLAotCQkJICAgQUNQSV9ST09UX09CSkVDVCwgQUNQSV9VSU5UMzJfTUFYLAotCQkJICAgQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCSAgIGFjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjaywgJmluZm8sCi0JCQkgICByZXR1cm5fdmFsdWUpOworCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwKKwkJCQkJQUNQSV9ST09UX09CSkVDVCwgQUNQSV9VSU5UMzJfTUFYLAorCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLAorCQkJCQlhY3BpX25zX2dldF9kZXZpY2VfY2FsbGJhY2ssICZpbmZvLAorCQkJCQlyZXR1cm5fdmFsdWUpOwogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RldmljZXMpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RldmljZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyNSw0NCArNjA2LDM4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9hdHRhY2hfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQorYWNwaV9hdHRhY2hfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCi0JaWYgKCFvYmpfaGFuZGxlIHx8Ci0JCSFoYW5kbGVyICAgIHx8Ci0JCSFkYXRhKSB7CisJaWYgKCFvYmpfaGFuZGxlIHx8ICFoYW5kbGVyIHx8ICFkYXRhKSB7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAob2JqX2hhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9kYXRhIChub2RlLCBoYW5kbGVyLCBkYXRhKTsKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9kYXRhKG5vZGUsIGhhbmRsZXIsIGRhdGEpOwogCi11bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kZXRhY2hfZGF0YQpAQCAtNjc3LDQyICs2NTIsMzcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RldGFjaF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyKQorYWNwaV9kZXRhY2hfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlpZiAoIW9ial9oYW5kbGUgfHwKLQkJIWhhbmRsZXIpIHsKKwlpZiAoIW9ial9oYW5kbGUgfHwgIWhhbmRsZXIpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCiAJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAotCXN0YXR1cyA9IGFjcGlfbnNfZGV0YWNoX2RhdGEgKG5vZGUsIGhhbmRsZXIpOworCXN0YXR1cyA9IGFjcGlfbnNfZGV0YWNoX2RhdGEobm9kZSwgaGFuZGxlcik7CiAKLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9kYXRhCkBAIC03MjgsNDEgKzY5OCwzMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQlhY3BpX29iamVjdF9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmRhdGEpCithY3BpX2dldF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlpZiAoIW9ial9oYW5kbGUgfHwKLQkJIWhhbmRsZXIgICAgfHwKLQkJIWRhdGEpIHsKKwlpZiAoIW9ial9oYW5kbGUgfHwgIWhhbmRsZXIgfHwgIWRhdGEpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCiAJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChvYmpfaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAotCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEgKG5vZGUsIGhhbmRsZXIsIGRhdGEpOworCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEobm9kZSwgaGFuZGxlciwgZGF0YSk7CiAKLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKaW5kZXggOGQwOTc5MS4uNmI1ZjhkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYwpAQCAtNDcsMTAgKzQ3LDggQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3hmbmFtZSIpCi0KK0FDUElfTU9EVUxFX05BTUUoIm5zeGZuYW1lIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY5LDIwICs2NywxNSBAQAogICogICAgICAgICAgICAgIG5hbWVzcGFjZSBoYW5kbGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2hhbmRsZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsCi0JYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICpyZXRfaGFuZGxlKQorYWNwaV9nZXRfaGFuZGxlKGFjcGlfaGFuZGxlIHBhcmVudCwKKwkJYWNwaV9zdHJpbmcgcGF0aG5hbWUsIGFjcGlfaGFuZGxlICogcmV0X2hhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwcmVmaXhfbm9kZSA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUgPSBOVUxMOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogUGFyYW1ldGVyIFZhbGlkYXRpb24gKi8KIApAQCAtOTMsNDUgKzg2LDQ3IEBACiAJLyogQ29udmVydCBhIHBhcmVudCBoYW5kbGUgdG8gYSBwcmVmaXggbm9kZSAqLwogCiAJaWYgKHBhcmVudCkgewotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKLQkJcHJlZml4X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAocGFyZW50KTsKKwkJcHJlZml4X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShwYXJlbnQpOwogCQlpZiAoIXByZWZpeF9ub2RlKSB7Ci0JCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIFNwZWNpYWwgY2FzZSBmb3Igcm9vdCwgc2luY2Ugd2UgY2FuJ3Qgc2VhcmNoIGZvciBpdCAqLwogCi0JaWYgKEFDUElfU1RSQ01QIChwYXRobmFtZSwgQUNQSV9OU19ST09UX1BBVEgpID09IDApIHsKLQkJKnJldF9oYW5kbGUgPSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlIChhY3BpX2dibF9yb290X25vZGUpOworCWlmIChBQ1BJX1NUUkNNUChwYXRobmFtZSwgQUNQSV9OU19ST09UX1BBVEgpID09IDApIHsKKwkJKnJldF9oYW5kbGUgPQorCQkgICAgYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShhY3BpX2dibF9yb290X25vZGUpOwogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKIAkvKgogCSAqICBGaW5kIHRoZSBOb2RlIGFuZCBjb252ZXJ0IHRvIGEgaGFuZGxlCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChwYXRobmFtZSwgcHJlZml4X25vZGUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkgICZub2RlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgocGF0aG5hbWUsIHByZWZpeF9ub2RlLCBBQ1BJX05TX05PX1VQU0VBUkNILAorCQkJCSAgICAgJm5vZGUpOwogCiAJKnJldF9oYW5kbGUgPSBOVUxMOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJKnJldF9oYW5kbGUgPSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlIChub2RlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJKnJldF9oYW5kbGUgPSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKG5vZGUpOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfaGFuZGxlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9oYW5kbGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTUwLDE0ICsxNDUsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9uYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfdHlwZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIpCithY3BpX2dldF9uYW1lKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIG5hbWVfdHlwZSwgc3RydWN0IGFjcGlfYnVmZmVyICogYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC0xNjUsMTUgKzE1NiwxNSBAQAogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyIChidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCiAJaWYgKG5hbWVfdHlwZSA9PSBBQ1BJX0ZVTExfUEFUSE5BTUUpIHsKIAkJLyogR2V0IHRoZSBmdWxsIHBhdGhuYW1lIChGcm9tIHRoZSBuYW1lc3BhY2Ugcm9vdCkgKi8KIAotCQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAoaGFuZGxlLCBidWZmZXIpOworCQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShoYW5kbGUsIGJ1ZmZlcik7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKQEAgLTE4MSwxMiArMTcyLDEyIEBACiAJICogV2FudHMgdGhlIHNpbmdsZSBzZWdtZW50IEFDUEkgbmFtZS4KIAkgKiBWYWxpZGF0ZSBoYW5kbGUgYW5kIGNvbnZlcnQgdG8gYSBuYW1lc3BhY2UgTm9kZQogCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKGhhbmRsZSk7CisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7CiAJaWYgKCFub2RlKSB7CiAJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMTk0LDI2ICsxODUsMjUgQEAKIAogCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKGJ1ZmZlciwgQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihidWZmZXIsIEFDUElfUEFUSF9TRUdNRU5UX0xFTkdUSCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEp1c3QgY29weSB0aGUgQUNQSSBuYW1lIGZyb20gdGhlIE5vZGUgYW5kIHplcm8gdGVybWluYXRlIGl0ICovCiAKLQlBQ1BJX1NUUk5DUFkgKGJ1ZmZlci0+cG9pbnRlciwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSwKLQkJCSBBQ1BJX05BTUVfU0laRSk7Ci0JKChjaGFyICopIGJ1ZmZlci0+cG9pbnRlcikgW0FDUElfTkFNRV9TSVpFXSA9IDA7CisJQUNQSV9TVFJOQ1BZKGJ1ZmZlci0+cG9pbnRlciwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkgICAgIEFDUElfTkFNRV9TSVpFKTsKKwkoKGNoYXIgKilidWZmZXItPnBvaW50ZXIpW0FDUElfTkFNRV9TSVpFXSA9IDA7CiAJc3RhdHVzID0gQUVfT0s7CiAKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAotdW5sb2NrX2FuZF9leGl0OgotCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25hbWUpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25hbWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjMxLDE3ICsyMjEsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9vYmplY3RfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqYnVmZmVyKQorYWNwaV9nZXRfb2JqZWN0X2luZm8oYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAgICAgICAgICppbmZvOwotCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICAgICAgICAgKnJldHVybl9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqcmV0dXJuX2luZm87CiAJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdCA9IE5VTEw7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplOwotCisJYWNwaV9zaXplIHNpemU7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC0yNDksMzcgKzIzNiwzNyBAQAogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyIChidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0JaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOworCWluZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZV9pbmZvKSk7CiAJaWYgKCFpbmZvKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChoYW5kbGUpOworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShoYW5kbGUpOwogCWlmICghbm9kZSkgewotCQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIEluaXQgcmV0dXJuIHN0cnVjdHVyZSAqLwogCi0Jc2l6ZSA9IHNpemVvZiAoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pOwogCi0JaW5mby0+dHlwZSAgPSBub2RlLT50eXBlOwotCWluZm8tPm5hbWUgID0gbm9kZS0+bmFtZS5pbnRlZ2VyOworCWluZm8tPnR5cGUgPSBub2RlLT50eXBlOworCWluZm8tPm5hbWUgPSBub2RlLT5uYW1lLmludGVnZXI7CiAJaW5mby0+dmFsaWQgPSAwOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjk3LDczICsyODQsNzMgQEAKIAogCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX0hJRCBtZXRob2QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfSElEIChub2RlLCAmaW5mby0+aGFyZHdhcmVfaWQpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9ISUQobm9kZSwgJmluZm8tPmhhcmR3YXJlX2lkKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX0hJRDsKIAkJfQogCiAJCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fVUlEIG1ldGhvZCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9VSUQgKG5vZGUsICZpbmZvLT51bmlxdWVfaWQpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9VSUQobm9kZSwgJmluZm8tPnVuaXF1ZV9pZCk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9VSUQ7CiAJCX0KIAogCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX0NJRCBtZXRob2QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfQ0lEIChub2RlLCAmY2lkX2xpc3QpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9DSUQobm9kZSwgJmNpZF9saXN0KTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlzaXplICs9ICgoYWNwaV9zaXplKSBjaWRfbGlzdC0+Y291bnQgLSAxKSAqCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQpOworCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkKTsKIAkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfQ0lEOwogCQl9CiAKIAkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9TVEEgbWV0aG9kICovCiAKLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQSAobm9kZSwgJmluZm8tPmN1cnJlbnRfc3RhdHVzKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKG5vZGUsICZpbmZvLT5jdXJyZW50X3N0YXR1cyk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9TVEE7CiAJCX0KIAogCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX0FEUiBtZXRob2QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0IChNRVRIT0RfTkFNRV9fQURSLCBub2RlLAotCQkJCSAgJmluZm8tPmFkZHJlc3MpOwotCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoTUVUSE9EX05BTUVfX0FEUiwgbm9kZSwKKwkJCQkJCQkgJmluZm8tPmFkZHJlc3MpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfQURSOwogCQl9CiAKIAkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9zeF9kIG1ldGhvZHMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfc3hkcyAobm9kZSwgaW5mby0+aGlnaGVzdF9kc3RhdGVzKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfc3hkcyhub2RlLCBpbmZvLT5oaWdoZXN0X2RzdGF0ZXMpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfU1hEUzsKIAkJfQogCX0KIAogCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCBzaXplKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFBvcHVsYXRlIHRoZSByZXR1cm4gYnVmZmVyICovCiAKIAlyZXR1cm5faW5mbyA9IGJ1ZmZlci0+cG9pbnRlcjsKLQlBQ1BJX01FTUNQWSAocmV0dXJuX2luZm8sIGluZm8sIHNpemVvZiAoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pKTsKKwlBQ1BJX01FTUNQWShyZXR1cm5faW5mbywgaW5mbywgc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZV9pbmZvKSk7CiAKIAlpZiAoY2lkX2xpc3QpIHsKLQkJQUNQSV9NRU1DUFkgKCZyZXR1cm5faW5mby0+Y29tcGF0aWJpbGl0eV9pZCwgY2lkX2xpc3QsIGNpZF9saXN0LT5zaXplKTsKKwkJQUNQSV9NRU1DUFkoJnJldHVybl9pbmZvLT5jb21wYXRpYmlsaXR5X2lkLCBjaWRfbGlzdCwKKwkJCSAgICBjaWRfbGlzdC0+c2l6ZSk7CiAJfQogCi0KLWNsZWFudXA6Ci0JQUNQSV9NRU1fRlJFRSAoaW5mbyk7CisgICAgICBjbGVhbnVwOgorCUFDUElfTUVNX0ZSRUUoaW5mbyk7CiAJaWYgKGNpZF9saXN0KSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGNpZF9saXN0KTsKKwkJQUNQSV9NRU1fRlJFRShjaWRfbGlzdCk7CiAJfQogCXJldHVybiAoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfb2JqZWN0X2luZm8pOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X29iamVjdF9pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMKaW5kZXggMzYzZTFmNi4uMDg1NmQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMKQEAgLTQ3LDkgKzQ3LDggQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3hmb2JqIikKK0FDUElfTU9EVUxFX05BTUUoIm5zeGZvYmoiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYzLDE1ICs2MiwxMCBAQAogICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSB0eXBlIGFzc29jaWF0ZCB3aXRoIGEgcGFydGljdWxhciBoYW5kbGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdHlwZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAqcmV0X3R5cGUpCithY3BpX3N0YXR1cyBhY3BpX2dldF90eXBlKGFjcGlfaGFuZGxlIGhhbmRsZSwgYWNwaV9vYmplY3RfdHlwZSAqIHJldF90eXBlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLwogCkBAIC04OCwyNyArODIsMjYgQEAKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKLQkJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJKnJldF90eXBlID0gbm9kZS0+dHlwZTsKIAotCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfdHlwZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdHlwZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTI0LDE0ICsxMTcsMTAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfcGFyZW50ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICpyZXRfaGFuZGxlKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfcGFyZW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgYWNwaV9oYW5kbGUgKiByZXRfaGFuZGxlKQogewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlpZiAoIXJldF9oYW5kbGUpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTE0MywxNCArMTMyLDE0IEBACiAJCXJldHVybiAoQUVfTlVMTF9FTlRSWSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KIAogCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KIAotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAoaGFuZGxlKTsKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0xNTksMjIgKzE0OCwyMSBAQAogCS8qIEdldCB0aGUgcGFyZW50IGVudHJ5ICovCiAKIAkqcmV0X2hhbmRsZSA9Ci0JCWFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUgKGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlIChub2RlKSk7CisJICAgIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSkpOwogCiAJLyogUmV0dXJuIGV4Y2VwdGlvbiBpZiBwYXJlbnQgaXMgbnVsbCAqLwogCi0JaWYgKCFhY3BpX25zX2dldF9wYXJlbnRfbm9kZSAobm9kZSkpIHsKKwlpZiAoIWFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpKSB7CiAJCXN0YXR1cyA9IEFFX05VTExfRU5UUlk7CiAJfQogCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAKLXVubG9ja19hbmRfZXhpdDoKLQotCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wYXJlbnQpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3BhcmVudCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTk1LDE3ICsxODMsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9uZXh0X29iamVjdCAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgcGFyZW50LAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgY2hpbGQsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqcmV0X2hhbmRsZSkKK2FjcGlfZ2V0X25leHRfb2JqZWN0KGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgICBhY3BpX2hhbmRsZSBwYXJlbnQsCisJCSAgICAgYWNwaV9oYW5kbGUgY2hpbGQsIGFjcGlfaGFuZGxlICogcmV0X2hhbmRsZSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlID0gTlVMTDsKLQorCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlID0gTlVMTDsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKQEAgLTIxMyw4ICsxOTgsOCBAQAogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKQEAgLTIyMywxNyArMjA4LDE2IEBACiAJaWYgKCFjaGlsZCkgewogCQkvKiBTdGFydCBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3BlY2lmaWVkIHNjb3BlICovCiAKLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSAocGFyZW50KTsKKwkJcGFyZW50X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShwYXJlbnQpOwogCQlpZiAoIXBhcmVudF9ub2RlKSB7CiAJCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogTm9uLW51bGwgaGFuZGxlLCBpZ25vcmUgdGhlIHBhcmVudCAqLwogCQkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCiAKLQkJY2hpbGRfbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlIChjaGlsZCk7CisJCWNoaWxkX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShjaGlsZCk7CiAJCWlmICghY2hpbGRfbm9kZSkgewogCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwpAQCAtMjQyLDIwICsyMjYsMTkgQEAKIAogCS8qIEludGVybmFsIGZ1bmN0aW9uIGRvZXMgdGhlIHJlYWwgd29yayAqLwogCi0Jbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfbm9kZSAodHlwZSwgcGFyZW50X25vZGUsIGNoaWxkX25vZGUpOworCW5vZGUgPSBhY3BpX25zX2dldF9uZXh0X25vZGUodHlwZSwgcGFyZW50X25vZGUsIGNoaWxkX25vZGUpOwogCWlmICghbm9kZSkgewogCQlzdGF0dXMgPSBBRV9OT1RfRk9VTkQ7CiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCWlmIChyZXRfaGFuZGxlKSB7Ci0JCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZSAobm9kZSk7CisJCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShub2RlKTsKIAl9CiAKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKIAotdW5sb2NrX2FuZF9leGl0OgotCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9udW1hLmMgYi9kcml2ZXJzL2FjcGkvbnVtYS5jCmluZGV4IGE4MjgzNGIuLjY0Yjk4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9udW1hLmMKKysrIGIvZHJpdmVycy9hY3BpL251bWEuYwpAQCAtMzQsMTYgKzM0LDE4IEBACiAKICNkZWZpbmUgQUNQSV9OVU1BCTB4ODAwMDAwMDAKICNkZWZpbmUgX0NPTVBPTkVOVAlBQ1BJX05VTUEKLQlBQ1BJX01PRFVMRV9OQU1FICgibnVtYSIpCitBQ1BJX01PRFVMRV9OQU1FKCJudW1hIikKIAotZXh0ZXJuIGludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseSAoZW51bSBhY3BpX3RhYmxlX2lkIGlkLCB1bnNpZ25lZCBsb25nIG1hZHRfc2l6ZSwgaW50IGVudHJ5X2lkLCBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOworZXh0ZXJuIGludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShlbnVtIGFjcGlfdGFibGVfaWQgaWQsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG1hZHRfc2l6ZSwKKwkJCQkJICAgICAgIGludCBlbnRyeV9pZCwKKwkJCQkJICAgICAgIGFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOwogCi12b2lkIF9faW5pdAotYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5ICgKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlcgkqaGVhZGVyKQordm9pZCBfX2luaXQgYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5KGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyKQogewogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5Iik7CisJQUNQSV9GVU5DVElPTl9OQU1FKCJhY3BpX3RhYmxlX3ByaW50X3NyYXRfZW50cnkiKTsKIAogCWlmICghaGVhZGVyKQogCQlyZXR1cm47CkBAIC01Miw0OCArNTQsNTUgQEAKIAogCWNhc2UgQUNQSV9TUkFUX1BST0NFU1NPUl9BRkZJTklUWToKICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotCXsKLQkJc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkqKSBoZWFkZXI7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlNSQVQgUHJvY2Vzc29yIChpZFsweCUwMnhdIGVpZFsweCUwMnhdKSBpbiBwcm94aW1pdHkgZG9tYWluICVkICVzXG4iLAotCQkgICAgICAgcC0+YXBpY19pZCwgcC0+bHNhcGljX2VpZCwgcC0+cHJveGltaXR5X2RvbWFpbiwKLQkJICAgICAgIHAtPmZsYWdzLmVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKTsKLQl9Ci0jZW5kaWYgLyogQUNQSV9ERUJVR19PVVRQVVQgKi8KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICopaGVhZGVyOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJTUkFUIFByb2Nlc3NvciAoaWRbMHglMDJ4XSBlaWRbMHglMDJ4XSkgaW4gcHJveGltaXR5IGRvbWFpbiAlZCAlc1xuIiwKKwkJCQkJICBwLT5hcGljX2lkLCBwLT5sc2FwaWNfZWlkLAorCQkJCQkgIHAtPnByb3hpbWl0eV9kb21haW4sCisJCQkJCSAgcC0+ZmxhZ3MuCisJCQkJCSAgZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKKwkJfQorI2VuZGlmCQkJCS8qIEFDUElfREVCVUdfT1VUUFVUICovCiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1NSQVRfTUVNT1JZX0FGRklOSVRZOgogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0JewotCQlzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSopIGhlYWRlcjsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU1JBVCBNZW1vcnkgKDB4JTA4eCUwOHggbGVuZ3RoIDB4JTA4eCUwOHggdHlwZSAweCV4KSBpbiBwcm94aW1pdHkgZG9tYWluICVkICVzJXNcbiIsCi0JCSAgICAgICBwLT5iYXNlX2FkZHJfaGksIHAtPmJhc2VfYWRkcl9sbywgcC0+bGVuZ3RoX2hpLCBwLT5sZW5ndGhfbG8sCi0JCSAgICAgICBwLT5tZW1vcnlfdHlwZSwgcC0+cHJveGltaXR5X2RvbWFpbiwKLQkJICAgICAgIHAtPmZsYWdzLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgICAgICAgcC0+ZmxhZ3MuaG90X3BsdWdnYWJsZSA/ICIgaG90LXBsdWdnYWJsZSIgOiAiIikpOwotCX0KLSNlbmRpZiAvKiBBQ1BJX0RFQlVHX09VVFBVVCAqLworCQl7CisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKiloZWFkZXI7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIlNSQVQgTWVtb3J5ICgweCUwOHglMDh4IGxlbmd0aCAweCUwOHglMDh4IHR5cGUgMHgleCkgaW4gcHJveGltaXR5IGRvbWFpbiAlZCAlcyVzXG4iLAorCQkJCQkgIHAtPmJhc2VfYWRkcl9oaSwgcC0+YmFzZV9hZGRyX2xvLAorCQkJCQkgIHAtPmxlbmd0aF9oaSwgcC0+bGVuZ3RoX2xvLAorCQkJCQkgIHAtPm1lbW9yeV90eXBlLCBwLT5wcm94aW1pdHlfZG9tYWluLAorCQkJCQkgIHAtPmZsYWdzLgorCQkJCQkgIGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCQkJCQkgIHAtPmZsYWdzLgorCQkJCQkgIGhvdF9wbHVnZ2FibGUgPyAiIGhvdC1wbHVnZ2FibGUiIDoKKwkJCQkJICAiIikpOworCQl9CisjZW5kaWYJCQkJLyogQUNQSV9ERUJVR19PVVRQVVQgKi8KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiRm91bmQgdW5zdXBwb3J0ZWQgU1JBVCBlbnRyeSAodHlwZSA9IDB4JXgpXG4iLAotCQkJaGVhZGVyLT50eXBlKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICJGb3VuZCB1bnN1cHBvcnRlZCBTUkFUIGVudHJ5ICh0eXBlID0gMHgleClcbiIsCisJCSAgICAgICBoZWFkZXItPnR5cGUpOwogCQlicmVhazsKIAl9CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2Vfc2xpdCAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2Vfc2xpdCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3NsaXQJKnNsaXQ7Ci0JdTMyCQkJbG9jYWxpdGllczsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0ICpzbGl0OworCXUzMiBsb2NhbGl0aWVzOwogCiAJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc2xpdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0ICopIF9fdmEocGh5c19hZGRyKTsKKwlzbGl0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NsaXQgKilfX3ZhKHBoeXNfYWRkcik7CiAKIAkvKiBkb3duY2FzdCBqdXN0IGZvciAlbGx1IHZzICVsdSBmb3IgaTM4Ni9pYTY0ICAqLwogCWxvY2FsaXRpZXMgPSAodTMyKSBzbGl0LT5sb2NhbGl0aWVzOwpAQCAtMTAzLDE1ICsxMTIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9wcm9jZXNzb3JfYWZmaW5pdHkgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsCi0JY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX3Byb2Nlc3Nvcl9hZmZpbml0eShhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqcHJvY2Vzc29yX2FmZmluaXR5OwogCi0JcHJvY2Vzc29yX2FmZmluaXR5ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSopIGhlYWRlcjsKKwlwcm9jZXNzb3JfYWZmaW5pdHkgPSAoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICopaGVhZGVyOwogCWlmICghcHJvY2Vzc29yX2FmZmluaXR5KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTIzLDE1ICsxMzAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9tZW1vcnlfYWZmaW5pdHkgKAotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsCi0JY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX21lbW9yeV9hZmZpbml0eShhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqbWVtb3J5X2FmZmluaXR5OwogCi0JbWVtb3J5X2FmZmluaXR5ID0gKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSopIGhlYWRlcjsKKwltZW1vcnlfYWZmaW5pdHkgPSAoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICopaGVhZGVyOwogCWlmICghbWVtb3J5X2FmZmluaXR5KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTQzLDM2ICsxNDgsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9zcmF0ICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9zcmF0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfc3JhdAkqc3JhdDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICpzcmF0OwogCiAJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3JhdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICopIF9fdmEocGh5c19hZGRyKTsKKwlzcmF0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQgKilfX3ZhKHBoeXNfYWRkcik7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiBpbnQgX19pbml0Ci1hY3BpX3RhYmxlX3BhcnNlX3NyYXQgKAotCWVudW0gYWNwaV9zcmF0X2VudHJ5X2lkCWlkLAotCWFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyCWhhbmRsZXIsCi0JdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQorYWNwaV90YWJsZV9wYXJzZV9zcmF0KGVudW0gYWNwaV9zcmF0X2VudHJ5X2lkIGlkLAorCQkgICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCiB7Ci0JcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoQUNQSV9TUkFULCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfc3JhdCksCi0JCQkJCSAgICBpZCwgaGFuZGxlciwgbWF4X2VudHJpZXMpOworCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfU1JBVCwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0KSwgaWQsCisJCQkJCSAgICBoYW5kbGVyLCBtYXhfZW50cmllcyk7CiB9CiAKLQotaW50IF9faW5pdAotYWNwaV9udW1hX2luaXQodm9pZCkKK2ludCBfX2luaXQgYWNwaV9udW1hX2luaXQodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQ7CisJaW50IHJlc3VsdDsKIAogCS8qIFNSQVQ6IFN0YXRpYyBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZSAqLwogCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TUkFULCBhY3BpX3BhcnNlX3NyYXQpOwpAQCAtMTgxLDkgKzE4MCw3IEBACiAJCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJX1NSQVRfUFJPQ0VTU09SX0FGRklOSVRZLAogCQkJCQkgICAgICAgYWNwaV9wYXJzZV9wcm9jZXNzb3JfYWZmaW5pdHksCiAJCQkJCSAgICAgICBOUl9DUFVTKTsKLQkJcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZV9zcmF0KEFDUElfU1JBVF9NRU1PUllfQUZGSU5JVFksCi0JCQkJCSAgICAgICBhY3BpX3BhcnNlX21lbW9yeV9hZmZpbml0eSwKLQkJCQkJICAgICAgIE5SX05PREVfTUVNQkxLUyk7CS8vIElBNjQgc3BlY2lmaWMKKwkJcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZV9zcmF0KEFDUElfU1JBVF9NRU1PUllfQUZGSU5JVFksIGFjcGlfcGFyc2VfbWVtb3J5X2FmZmluaXR5LCBOUl9OT0RFX01FTUJMS1MpOwkvLyBJQTY0IHNwZWNpZmljCiAJfQogCiAJLyogU0xJVDogU3lzdGVtIExvY2FsaXR5IEluZm9ybWF0aW9uIFRhYmxlICovCkBAIC0xOTMsOCArMTkwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1hY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaCkKK2ludCBhY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaCkKIHsKIAl1bnNpZ25lZCBsb25nIHB4bTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC0yMDcsNyArMjAzLDggQEAKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQkJcmV0dXJuIChpbnQpcHhtOwogCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGhhbmRsZSk7Ci0JfSB3aGlsZShBQ1BJX1NVQ0NFU1Moc3RhdHVzKSk7CisJfSB3aGlsZSAoQUNQSV9TVUNDRVNTKHN0YXR1cykpOwogCXJldHVybiAtMTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2dldF9weG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IDBkMTFkNmUuLmQ1MjhjNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTQ1LDE2ICs0NSwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX09TX1NFUlZJQ0VTCi1BQ1BJX01PRFVMRV9OQU1FCSgib3NsIikKLQorQUNQSV9NT0RVTEVfTkFNRSgib3NsIikKICNkZWZpbmUgUFJFRklYCQkiQUNQSTogIgotCi1zdHJ1Y3QgYWNwaV9vc19kcGMKLXsKLSAgICBhY3BpX29zZF9leGVjX2NhbGxiYWNrICBmdW5jdGlvbjsKLSAgICB2b2lkCQkgICAgKmNvbnRleHQ7CitzdHJ1Y3QgYWNwaV9vc19kcGMgeworCWFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sgZnVuY3Rpb247CisJdm9pZCAqY29udGV4dDsKIH07CiAKICNpZmRlZiBDT05GSUdfQUNQSV9DVVNUT01fRFNEVApAQCAtNjksNyArNjUsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX2luX2RlYnVnZ2VyKTsKIAogZXh0ZXJuIGNoYXIgbGluZV9idWZbODBdOwotI2VuZGlmIC8qRU5BQkxFX0RFQlVHR0VSKi8KKyNlbmRpZgkJCQkvKkVOQUJMRV9ERUJVR0dFUiAqLwogCiBpbnQgYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCA9IFRSVUU7CiBFWFBPUlRfU1lNQk9MKGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpOwpAQCAtNzksMzMgKzc1LDI5IEBACiBzdGF0aWMgdm9pZCAqYWNwaV9pcnFfY29udGV4dDsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlkX3dxOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19pbml0aWFsaXplKHZvaWQpCithY3BpX3N0YXR1cyBhY3BpX29zX2luaXRpYWxpemUodm9pZCkKIHsKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX2luaXRpYWxpemUxKHZvaWQpCithY3BpX3N0YXR1cyBhY3BpX29zX2luaXRpYWxpemUxKHZvaWQpCiB7CiAJLyoKIAkgKiBJbml0aWFsaXplIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcywgYXMgd2UnbGwgbmVlZCB0byBhY2Nlc3MKIAkgKiBpdCB3aGlsZSB3YWxraW5nIHRoZSBuYW1lc3BhY2UgKGJ1cyAwIGFuZCByb290IGJyaWRnZXMgdy8gX0JCTnMpLgogCSAqLwotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQogCWlmICghcmF3X3BjaV9vcHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQWNjZXNzIHRvIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHVuYXZhaWxhYmxlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkgICAgICAgIkFjY2VzcyB0byBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB1bmF2YWlsYWJsZVxuIik7CiAJCXJldHVybiBBRV9OVUxMX0VOVFJZOwogCX0KLSNlbmRpZgogCWthY3BpZF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrYWNwaWQiKTsKIAlCVUdfT04oIWthY3BpZF93cSk7CiAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3Rlcm1pbmF0ZSh2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9vc190ZXJtaW5hdGUodm9pZCkKIHsKIAlpZiAoYWNwaV9pcnFfaGFuZGxlcikgewogCQlhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcihhY3BpX2lycV9pcnEsCkBAIC0xMTcsMjEgKzEwOSwyMCBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotdm9pZAotYWNwaV9vc19wcmludGYoY29uc3QgY2hhciAqZm10LC4uLikKK3ZvaWQgYWNwaV9vc19wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAJYWNwaV9vc192cHJpbnRmKGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3NfcHJpbnRmKTsKIAotdm9pZAotYWNwaV9vc192cHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQordm9pZCBhY3BpX29zX3ZwcmludGYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCiB7CiAJc3RhdGljIGNoYXIgYnVmZmVyWzUxMl07Ci0JCisKIAl2c3ByaW50ZihidWZmZXIsIGZtdCwgYXJncyk7CiAKICNpZmRlZiBFTkFCTEVfREVCVUdHRVIKQEAgLTE0Niw4ICsxMzcsNyBAQAogfQogCiBleHRlcm4gaW50IGFjcGlfaW5fcmVzdW1lOwotdm9pZCAqCi1hY3BpX29zX2FsbG9jYXRlKGFjcGlfc2l6ZSBzaXplKQordm9pZCAqYWNwaV9vc19hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSkKIHsKIAlpZiAoYWNwaV9pbl9yZXN1bWUpCiAJCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwpAQCAtMTU1LDMxICsxNDUsMzIgQEAKIAkJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiB9CiAKLXZvaWQKLWFjcGlfb3NfZnJlZSh2b2lkICpwdHIpCit2b2lkIGFjcGlfb3NfZnJlZSh2b2lkICpwdHIpCiB7CiAJa2ZyZWUocHRyKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX2ZyZWUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKHUzMiBmbGFncywgc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcikKK2FjcGlfc3RhdHVzIGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcih1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHIpCiB7CiAJaWYgKGVmaV9lbmFibGVkKSB7CiAJCWFkZHItPnBvaW50ZXJfdHlwZSA9IEFDUElfUEhZU0lDQUxfUE9JTlRFUjsKIAkJaWYgKGVmaS5hY3BpMjApCiAJCQlhZGRyLT5wb2ludGVyLnBoeXNpY2FsID0KLQkJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSB2aXJ0X3RvX3BoeXMoZWZpLmFjcGkyMCk7CisJCQkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgdmlydF90b19waHlzKGVmaS5hY3BpMjApOwogCQllbHNlIGlmIChlZmkuYWNwaSkKIAkJCWFkZHItPnBvaW50ZXIucGh5c2ljYWwgPQotCQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHZpcnRfdG9fcGh5cyhlZmkuYWNwaSk7CisJCQkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgdmlydF90b19waHlzKGVmaS5hY3BpKTsKIAkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJTeXN0ZW0gZGVzY3JpcHRpb24gdGFibGVzIG5vdCBmb3VuZFxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCQkgICAgICAgIlN5c3RlbSBkZXNjcmlwdGlvbiB0YWJsZXMgbm90IGZvdW5kXG4iKTsKIAkJCXJldHVybiBBRV9OT1RfRk9VTkQ7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZmluZF9yb290X3BvaW50ZXIoZmxhZ3MsIGFkZHIpKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiU3lzdGVtIGRlc2NyaXB0aW9uIHRhYmxlcyBub3QgZm91bmRcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkJICAgICAgICJTeXN0ZW0gZGVzY3JpcHRpb24gdGFibGVzIG5vdCBmb3VuZFxuIik7CiAJCQlyZXR1cm4gQUVfTk9UX0ZPVU5EOwogCQl9CiAJfQpAQCAtMTg4LDExICsxNzksMTIgQEAKIH0KIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfbWFwX21lbW9yeShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5cywgYWNwaV9zaXplIHNpemUsIHZvaWQgX19pb21lbSAqKnZpcnQpCithY3BpX29zX21hcF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXMsIGFjcGlfc2l6ZSBzaXplLAorCQkgICB2b2lkIF9faW9tZW0gKiogdmlydCkKIHsKIAlpZiAoZWZpX2VuYWJsZWQpIHsKIAkJaWYgKEVGSV9NRU1PUllfV0IgJiBlZmlfbWVtX2F0dHJpYnV0ZXMocGh5cykpIHsKLQkJCSp2aXJ0ID0gKHZvaWQgX19pb21lbSAqKSBwaHlzX3RvX3ZpcnQocGh5cyk7CisJCQkqdmlydCA9ICh2b2lkIF9faW9tZW0gKilwaHlzX3RvX3ZpcnQocGh5cyk7CiAJCX0gZWxzZSB7CiAJCQkqdmlydCA9IGlvcmVtYXAocGh5cywgc2l6ZSk7CiAJCX0KQEAgLTIwMiw5ICsxOTQsOSBAQAogCQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAJCX0KIAkJLyoKLQkgCSAqIGlvcmVtYXAgY2hlY2tzIHRvIGVuc3VyZSB0aGlzIGlzIGluIHJlc2VydmVkIHNwYWNlCi0JIAkgKi8KLQkJKnZpcnQgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBwaHlzLCBzaXplKTsKKwkJICogaW9yZW1hcCBjaGVja3MgdG8gZW5zdXJlIHRoaXMgaXMgaW4gcmVzZXJ2ZWQgc3BhY2UKKwkJICovCisJCSp2aXJ0ID0gaW9yZW1hcCgodW5zaWduZWQgbG9uZylwaHlzLCBzaXplKTsKIAl9CiAKIAlpZiAoISp2aXJ0KQpAQCAtMjEzLDE3ICsyMDUsMTYgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXZvaWQKLWFjcGlfb3NfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqdmlydCwgYWNwaV9zaXplIHNpemUpCit2b2lkIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqIHZpcnQsIGFjcGlfc2l6ZSBzaXplKQogewogCWlvdW5tYXAodmlydCk7CiB9CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfb3NfZ2V0X3BoeXNpY2FsX2FkZHJlc3Modm9pZCAqdmlydCwgYWNwaV9waHlzaWNhbF9hZGRyZXNzICpwaHlzKQorYWNwaV9vc19nZXRfcGh5c2ljYWxfYWRkcmVzcyh2b2lkICp2aXJ0LCBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgKiBwaHlzKQogewotCWlmKCFwaHlzIHx8ICF2aXJ0KQorCWlmICghcGh5cyB8fCAhdmlydCkKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAKIAkqcGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTsKQEAgLTIzNywxNiArMjI4LDE2IEBACiBzdGF0aWMgY2hhciBhY3BpX29zX25hbWVbQUNQSV9NQVhfT1ZFUlJJREVfTEVOXTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfcHJlZGVmaW5lZF9vdmVycmlkZSAoY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAqaW5pdF92YWwsCi0JCSAgICAgICAgICAgICBhY3BpX3N0cmluZyAqbmV3X3ZhbCkKK2FjcGlfb3NfcHJlZGVmaW5lZF9vdmVycmlkZShjb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICppbml0X3ZhbCwKKwkJCSAgICBhY3BpX3N0cmluZyAqIG5ld192YWwpCiB7CiAJaWYgKCFpbml0X3ZhbCB8fCAhbmV3X3ZhbCkKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAKIAkqbmV3X3ZhbCA9IE5VTEw7Ci0JaWYgKCFtZW1jbXAgKGluaXRfdmFsLT5uYW1lLCAiX09TXyIsIDQpICYmIHN0cmxlbihhY3BpX29zX25hbWUpKSB7CisJaWYgKCFtZW1jbXAoaW5pdF92YWwtPm5hbWUsICJfT1NfIiwgNCkgJiYgc3RybGVuKGFjcGlfb3NfbmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIk92ZXJyaWRpbmcgX09TIGRlZmluaXRpb24gdG8gJyVzJ1xuIiwKLQkJCWFjcGlfb3NfbmFtZSk7CisJCSAgICAgICBhY3BpX29zX25hbWUpOwogCQkqbmV3X3ZhbCA9IGFjcGlfb3NfbmFtZTsKIAl9CiAKQEAgLTI1NCwxNSArMjQ1LDE1IEBACiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3RhYmxlX292ZXJyaWRlIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmV4aXN0aW5nX3RhYmxlLAotCQkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqbmV3X3RhYmxlKQorYWNwaV9vc190YWJsZV9vdmVycmlkZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiBleGlzdGluZ190YWJsZSwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKiBuZXdfdGFibGUpCiB7CiAJaWYgKCFleGlzdGluZ190YWJsZSB8fCAhbmV3X3RhYmxlKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAogI2lmZGVmIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUCiAJaWYgKHN0cm5jbXAoZXhpc3RpbmdfdGFibGUtPnNpZ25hdHVyZSwgIkRTRFQiLCA0KSA9PSAwKQotCQkqbmV3X3RhYmxlID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciopQW1sQ29kZTsKKwkJKm5ld190YWJsZSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKilBbWxDb2RlOwogCWVsc2UKIAkJKm5ld190YWJsZSA9IE5VTEw7CiAjZWxzZQpAQCAtMjcxLDE0ICsyNjIsMTQgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdAotYWNwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBhY3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJldHVybiAoKmFjcGlfaXJxX2hhbmRsZXIpKGFjcGlfaXJxX2NvbnRleHQpID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKKwlyZXR1cm4gKCphY3BpX2lycV9oYW5kbGVyKSAoYWNwaV9pcnFfY29udGV4dCkgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfQogCiBhY3BpX3N0YXR1cwotYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKHUzMiBnc2ksIGFjcGlfb3NkX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKK2FjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlcih1MzIgZ3NpLCBhY3BpX29zZF9oYW5kbGVyIGhhbmRsZXIsCisJCQkJICB2b2lkICpjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBpcnE7CiAKQEAgLTMwNSw4ICsyOTYsNyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotYWNwaV9zdGF0dXMKLWFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyKHUzMiBpcnEsIGFjcGlfb3NkX2hhbmRsZXIgaGFuZGxlcikKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyKHUzMiBpcnEsIGFjcGlfb3NkX2hhbmRsZXIgaGFuZGxlcikKIHsKIAlpZiAoaXJxKSB7CiAJCWZyZWVfaXJxKGlycSwgYWNwaV9pcnEpOwpAQCAtMzIxLDE2ICszMTEsMTUgQEAKICAqIFJ1bm5pbmcgaW4gaW50ZXJwcmV0ZXIgdGhyZWFkIGNvbnRleHQsIHNhZmUgdG8gc2xlZXAKICAqLwogCi12b2lkCi1hY3BpX29zX3NsZWVwKGFjcGlfaW50ZWdlciBtcykKK3ZvaWQgYWNwaV9vc19zbGVlcChhY3BpX2ludGVnZXIgbXMpCiB7CiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dCgoKHNpZ25lZCBsb25nKSBtcyAqIEhaKSAvIDEwMDApOworCXNjaGVkdWxlX3RpbWVvdXQoKChzaWduZWQgbG9uZyltcyAqIEhaKSAvIDEwMDApOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3Nfc2xlZXApOwogCi12b2lkCi1hY3BpX29zX3N0YWxsKHUzMiB1cykKK3ZvaWQgYWNwaV9vc19zdGFsbCh1MzIgdXMpCiB7CiAJd2hpbGUgKHVzKSB7CiAJCXUzMiBkZWxheSA9IDEwMDA7CkBAIC0zNDIsNiArMzMxLDcgQEAKIAkJdXMgLT0gZGVsYXk7CiAJfQogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3Nfc3RhbGwpOwogCiAvKgpAQCAtMzQ5LDggKzMzOSw3IEBACiAgKiBSZXR1cm5zIDY0LWJpdCBmcmVlLXJ1bm5pbmcsIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lcgogICogd2l0aCAxMDBucyBncmFudWxhcml0eQogICovCi11NjQKLWFjcGlfb3NfZ2V0X3RpbWVyICh2b2lkKQordTY0IGFjcGlfb3NfZ2V0X3RpbWVyKHZvaWQpCiB7CiAJc3RhdGljIHU2NCB0OwogCkBAIC0zNjcsMjcgKzM1NiwyMiBAQAogCXJldHVybiArK3Q7CiB9CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3JlYWRfcG9ydCgKLQlhY3BpX2lvX2FkZHJlc3MJcG9ydCwKLQl1MzIJCSp2YWx1ZSwKLQl1MzIJCXdpZHRoKQorYWNwaV9zdGF0dXMgYWNwaV9vc19yZWFkX3BvcnQoYWNwaV9pb19hZGRyZXNzIHBvcnQsIHUzMiAqIHZhbHVlLCB1MzIgd2lkdGgpCiB7CiAJdTMyIGR1bW15OwogCiAJaWYgKCF2YWx1ZSkKIAkJdmFsdWUgPSAmZHVtbXk7CiAKLQlzd2l0Y2ggKHdpZHRoKQotCXsKKwlzd2l0Y2ggKHdpZHRoKSB7CiAJY2FzZSA4OgotCQkqKHU4KikgIHZhbHVlID0gaW5iKHBvcnQpOworCQkqKHU4ICopIHZhbHVlID0gaW5iKHBvcnQpOwogCQlicmVhazsKIAljYXNlIDE2OgotCQkqKHUxNiopIHZhbHVlID0gaW53KHBvcnQpOworCQkqKHUxNiAqKSB2YWx1ZSA9IGludyhwb3J0KTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJKih1MzIqKSB2YWx1ZSA9IGlubChwb3J0KTsKKwkJKih1MzIgKikgdmFsdWUgPSBpbmwocG9ydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtMzk1LDE2ICszNzksMTIgQEAKIAogCXJldHVybiBBRV9PSzsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX29zX3JlYWRfcG9ydCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3dyaXRlX3BvcnQoCi0JYWNwaV9pb19hZGRyZXNzCXBvcnQsCi0JdTMyCQl2YWx1ZSwKLQl1MzIJCXdpZHRoKQorYWNwaV9zdGF0dXMgYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfaW9fYWRkcmVzcyBwb3J0LCB1MzIgdmFsdWUsIHUzMiB3aWR0aCkKIHsKLQlzd2l0Y2ggKHdpZHRoKQotCXsKKwlzd2l0Y2ggKHdpZHRoKSB7CiAJY2FzZSA4OgogCQlvdXRiKHZhbHVlLCBwb3J0KTsKIAkJYnJlYWs7CkBAIC00MjAsNDAgKzQwMCwzOCBAQAogCiAJcmV0dXJuIEFFX09LOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3Nfd3JpdGVfcG9ydCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3JlYWRfbWVtb3J5KAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcwlwaHlzX2FkZHIsCi0JdTMyCQkJKnZhbHVlLAotCXUzMgkJCXdpZHRoKQorYWNwaV9vc19yZWFkX21lbW9yeShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5c19hZGRyLCB1MzIgKiB2YWx1ZSwgdTMyIHdpZHRoKQogewotCXUzMgkJCWR1bW15OwotCXZvaWQgX19pb21lbQkJKnZpcnRfYWRkcjsKLQlpbnQJCQlpb21lbSA9IDA7CisJdTMyIGR1bW15OworCXZvaWQgX19pb21lbSAqdmlydF9hZGRyOworCWludCBpb21lbSA9IDA7CiAKIAlpZiAoZWZpX2VuYWJsZWQpIHsKIAkJaWYgKEVGSV9NRU1PUllfV0IgJiBlZmlfbWVtX2F0dHJpYnV0ZXMocGh5c19hZGRyKSkgewogCQkJLyogSEFDSyBBTEVSVCEgV2UgY2FuIHVzZSByZWFkYi93L2wgb24gcmVhbCBtZW1vcnkgdG9vLi4gKi8KLQkJCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisJCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAJCX0gZWxzZSB7CiAJCQlpb21lbSA9IDE7CiAJCQl2aXJ0X2FkZHIgPSBpb3JlbWFwKHBoeXNfYWRkciwgd2lkdGgpOwogCQl9CiAJfSBlbHNlCi0JCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisJCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKilwaHlzX3RvX3ZpcnQocGh5c19hZGRyKTsKIAlpZiAoIXZhbHVlKQogCQl2YWx1ZSA9ICZkdW1teTsKIAogCXN3aXRjaCAod2lkdGgpIHsKIAljYXNlIDg6Ci0JCSoodTgqKSB2YWx1ZSA9IHJlYWRiKHZpcnRfYWRkcik7CisJCSoodTggKikgdmFsdWUgPSByZWFkYih2aXJ0X2FkZHIpOwogCQlicmVhazsKIAljYXNlIDE2OgotCQkqKHUxNiopIHZhbHVlID0gcmVhZHcodmlydF9hZGRyKTsKKwkJKih1MTYgKikgdmFsdWUgPSByZWFkdyh2aXJ0X2FkZHIpOwogCQlicmVhazsKIAljYXNlIDMyOgotCQkqKHUzMiopIHZhbHVlID0gcmVhZGwodmlydF9hZGRyKTsKKwkJKih1MzIgKikgdmFsdWUgPSByZWFkbCh2aXJ0X2FkZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKQEAgLTQ2OCwyNCArNDQ2LDIxIEBACiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3dyaXRlX21lbW9yeSgKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MJcGh5c19hZGRyLAotCXUzMgkJCXZhbHVlLAotCXUzMgkJCXdpZHRoKQorYWNwaV9vc193cml0ZV9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNfYWRkciwgdTMyIHZhbHVlLCB1MzIgd2lkdGgpCiB7Ci0Jdm9pZCBfX2lvbWVtCQkqdmlydF9hZGRyOwotCWludAkJCWlvbWVtID0gMDsKKwl2b2lkIF9faW9tZW0gKnZpcnRfYWRkcjsKKwlpbnQgaW9tZW0gPSAwOwogCiAJaWYgKGVmaV9lbmFibGVkKSB7CiAJCWlmIChFRklfTUVNT1JZX1dCICYgZWZpX21lbV9hdHRyaWJ1dGVzKHBoeXNfYWRkcikpIHsKIAkJCS8qIEhBQ0sgQUxFUlQhIFdlIGNhbiB1c2Ugd3JpdGViL3cvbCBvbiByZWFsIG1lbW9yeSB0b28gKi8KLQkJCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisJCQl2aXJ0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAJCX0gZWxzZSB7CiAJCQlpb21lbSA9IDE7CiAJCQl2aXJ0X2FkZHIgPSBpb3JlbWFwKHBoeXNfYWRkciwgd2lkdGgpOwogCQl9CiAJfSBlbHNlCi0JCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisJCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKilwaHlzX3RvX3ZpcnQocGh5c19hZGRyKTsKIAogCXN3aXRjaCAod2lkdGgpIHsKIAljYXNlIDg6CkBAIC01MDcsMTAgKzQ4Miw5IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi0jaWZkZWYgQ09ORklHX0FDUElfUENJCi0KIGFjcGlfc3RhdHVzCi1hY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24gKHN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkLCB1MzIgcmVnLCB2b2lkICp2YWx1ZSwgdTMyIHdpZHRoKQorYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uKHN0cnVjdCBhY3BpX3BjaV9pZCAqIHBjaV9pZCwgdTMyIHJlZywKKwkJCSAgICAgICB2b2lkICp2YWx1ZSwgdTMyIHdpZHRoKQogewogCWludCByZXN1bHQsIHNpemU7CiAKQEAgLTUzNCwxNSArNTA4LDE3IEBACiAJQlVHX09OKCFyYXdfcGNpX29wcyk7CiAKIAlyZXN1bHQgPSByYXdfcGNpX29wcy0+cmVhZChwY2lfaWQtPnNlZ21lbnQsIHBjaV9pZC0+YnVzLAotCQkJCVBDSV9ERVZGTihwY2lfaWQtPmRldmljZSwgcGNpX2lkLT5mdW5jdGlvbiksCi0JCQkJcmVnLCBzaXplLCB2YWx1ZSk7CisJCQkJICAgUENJX0RFVkZOKHBjaV9pZC0+ZGV2aWNlLCBwY2lfaWQtPmZ1bmN0aW9uKSwKKwkJCQkgICByZWcsIHNpemUsIHZhbHVlKTsKIAogCXJldHVybiAocmVzdWx0ID8gQUVfRVJST1IgOiBBRV9PSyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKHN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkLCB1MzIgcmVnLCBhY3BpX2ludGVnZXIgdmFsdWUsIHUzMiB3aWR0aCkKK2FjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24oc3RydWN0IGFjcGlfcGNpX2lkICogcGNpX2lkLCB1MzIgcmVnLAorCQkJCWFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIHdpZHRoKQogewogCWludCByZXN1bHQsIHNpemU7CiAKQEAgLTU2Myw1NiArNTM5LDYyIEBACiAJQlVHX09OKCFyYXdfcGNpX29wcyk7CiAKIAlyZXN1bHQgPSByYXdfcGNpX29wcy0+d3JpdGUocGNpX2lkLT5zZWdtZW50LCBwY2lfaWQtPmJ1cywKLQkJCQlQQ0lfREVWRk4ocGNpX2lkLT5kZXZpY2UsIHBjaV9pZC0+ZnVuY3Rpb24pLAotCQkJCXJlZywgc2l6ZSwgdmFsdWUpOworCQkJCSAgICBQQ0lfREVWRk4ocGNpX2lkLT5kZXZpY2UsIHBjaV9pZC0+ZnVuY3Rpb24pLAorCQkJCSAgICByZWcsIHNpemUsIHZhbHVlKTsKIAogCXJldHVybiAocmVzdWx0ID8gQUVfRVJST1IgOiBBRV9PSyk7CiB9CiAKIC8qIFRPRE86IENoYW5nZSBjb2RlIHRvIHRha2UgYWR2YW50YWdlIG9mIGRyaXZlciBtb2RlbCBtb3JlICovCi1zdGF0aWMgdm9pZAotYWNwaV9vc19kZXJpdmVfcGNpX2lkXzIgKAotCWFjcGlfaGFuZGxlCQlyaGFuZGxlLCAgICAgICAgLyogdXBwZXIgYm91bmQgICovCi0JYWNwaV9oYW5kbGUJCWNoYW5kbGUsICAgICAgICAvKiBjdXJyZW50IG5vZGUgKi8KLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJKippZCwKLQlpbnQJCQkqaXNfYnJpZGdlLAotCXU4CQkJKmJ1c19udW1iZXIpCitzdGF0aWMgdm9pZCBhY3BpX29zX2Rlcml2ZV9wY2lfaWRfMihhY3BpX2hhbmRsZSByaGFuZGxlLAkvKiB1cHBlciBib3VuZCAgKi8KKwkJCQkgICAgYWNwaV9oYW5kbGUgY2hhbmRsZSwJLyogY3VycmVudCBub2RlICovCisJCQkJICAgIHN0cnVjdCBhY3BpX3BjaV9pZCAqKmlkLAorCQkJCSAgICBpbnQgKmlzX2JyaWRnZSwgdTggKiBidXNfbnVtYmVyKQogewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0Jc3RydWN0IGFjcGlfcGNpX2lkCSpwY2lfaWQgPSAqaWQ7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKLQl1bnNpZ25lZCBsb25nCQl0ZW1wOwotCWFjcGlfb2JqZWN0X3R5cGUJdHlwZTsKLQl1OAkJCXR1ODsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IGFjcGlfcGNpX2lkICpwY2lfaWQgPSAqaWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJdTggdHU4OwogCiAJYWNwaV9nZXRfcGFyZW50KGNoYW5kbGUsICZoYW5kbGUpOwogCWlmIChoYW5kbGUgIT0gcmhhbmRsZSkgewotCQlhY3BpX29zX2Rlcml2ZV9wY2lfaWRfMihyaGFuZGxlLCBoYW5kbGUsICZwY2lfaWQsIGlzX2JyaWRnZSwgYnVzX251bWJlcik7CisJCWFjcGlfb3NfZGVyaXZlX3BjaV9pZF8yKHJoYW5kbGUsIGhhbmRsZSwgJnBjaV9pZCwgaXNfYnJpZGdlLAorCQkJCQlidXNfbnVtYmVyKTsKIAogCQlzdGF0dXMgPSBhY3BpX2dldF90eXBlKGhhbmRsZSwgJnR5cGUpOwotCQlpZiAoIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgfHwgKHR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgKQorCQlpZiAoKEFDUElfRkFJTFVSRShzdGF0dXMpKSB8fCAodHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSkKIAkJCXJldHVybjsKIAotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQURSLCBOVUxMLCAmdGVtcCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQURSLCBOVUxMLAorCQkJCQkgICZ0ZW1wKTsKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlwY2lfaWQtPmRldmljZSAgPSBBQ1BJX0hJV09SRCAoQUNQSV9MT0RXT1JEICh0ZW1wKSk7Ci0JCQlwY2lfaWQtPmZ1bmN0aW9uID0gQUNQSV9MT1dPUkQgKEFDUElfTE9EV09SRCAodGVtcCkpOworCQkJcGNpX2lkLT5kZXZpY2UgPSBBQ1BJX0hJV09SRChBQ1BJX0xPRFdPUkQodGVtcCkpOworCQkJcGNpX2lkLT5mdW5jdGlvbiA9IEFDUElfTE9XT1JEKEFDUElfTE9EV09SRCh0ZW1wKSk7CiAKIAkJCWlmICgqaXNfYnJpZGdlKQogCQkJCXBjaV9pZC0+YnVzID0gKmJ1c19udW1iZXI7CiAKIAkJCS8qIGFueSBuaWNlciB3YXkgdG8gZ2V0IGJ1cyBudW1iZXIgb2YgYnJpZGdlID8gKi8KLQkJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIDB4MGUsICZ0dTgsIDgpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmCi0JCQkgICAgKCh0dTggJiAweDdmKSA9PSAxIHx8ICh0dTggJiAweDdmKSA9PSAyKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIDB4MTgsICZ0dTgsIDgpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24ocGNpX2lkLCAweDBlLCAmdHU4LAorCQkJCQkJCSAgIDgpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpCisJCQkgICAgJiYgKCh0dTggJiAweDdmKSA9PSAxIHx8ICh0dTggJiAweDdmKSA9PSAyKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIDB4MTgsCisJCQkJCQkJCSAgICZ0dTgsIDgpOwogCQkJCWlmICghQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCQkJLyogQ2VydGFpbmx5IGJyb2tlbi4uLiAgRklYIE1FICovCiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJKmlzX2JyaWRnZSA9IDE7CiAJCQkJcGNpX2lkLT5idXMgPSB0dTg7Ci0JCQkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uKHBjaV9pZCwgMHgxOSwgJnR1OCwgOCk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uKHBjaV9pZCwgMHgxOSwKKwkJCQkJCQkJICAgJnR1OCwgOCk7CiAJCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkJCSpidXNfbnVtYmVyID0gdHU4OwogCQkJCX0KQEAgLTYyMiwxMSArNjA0LDkgQEAKIAl9CiB9CiAKLXZvaWQKLWFjcGlfb3NfZGVyaXZlX3BjaV9pZCAoCi0JYWNwaV9oYW5kbGUJCXJoYW5kbGUsICAgICAgICAvKiB1cHBlciBib3VuZCAgKi8KLQlhY3BpX2hhbmRsZQkJY2hhbmRsZSwgICAgICAgIC8qIGN1cnJlbnQgbm9kZSAqLwotCXN0cnVjdCBhY3BpX3BjaV9pZAkqKmlkKQordm9pZCBhY3BpX29zX2Rlcml2ZV9wY2lfaWQoYWNwaV9oYW5kbGUgcmhhbmRsZSwJLyogdXBwZXIgYm91bmQgICovCisJCQkgICBhY3BpX2hhbmRsZSBjaGFuZGxlLAkvKiBjdXJyZW50IG5vZGUgKi8KKwkJCSAgIHN0cnVjdCBhY3BpX3BjaV9pZCAqKmlkKQogewogCWludCBpc19icmlkZ2UgPSAxOwogCXU4IGJ1c19udW1iZXIgPSAoKmlkKS0+YnVzOwpAQCAtNjM0LDQ5ICs2MTQsMTUgQEAKIAlhY3BpX29zX2Rlcml2ZV9wY2lfaWRfMihyaGFuZGxlLCBjaGFuZGxlLCBpZCwgJmlzX2JyaWRnZSwgJmJ1c19udW1iZXIpOwogfQogCi0jZWxzZSAvKiFDT05GSUdfQUNQSV9QQ0kqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbiAoCi0Jc3RydWN0IGFjcGlfcGNpX2lkCSpwY2lfaWQsCi0JdTMyCQkJcmVnLAotCWFjcGlfaW50ZWdlcgkJdmFsdWUsCi0JdTMyCQkJd2lkdGgpCitzdGF0aWMgdm9pZCBhY3BpX29zX2V4ZWN1dGVfZGVmZXJyZWQodm9pZCAqY29udGV4dCkKIHsKLQlyZXR1cm4gQUVfU1VQUE9SVDsKLX0KKwlzdHJ1Y3QgYWNwaV9vc19kcGMgKmRwYyA9IE5VTEw7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24gKAotCXN0cnVjdCBhY3BpX3BjaV9pZAkqcGNpX2lkLAotCXUzMgkJCXJlZywKLQl2b2lkCQkJKnZhbHVlLAotCXUzMgkJCXdpZHRoKQotewotCXJldHVybiBBRV9TVVBQT1JUOwotfQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm9zX2V4ZWN1dGVfZGVmZXJyZWQiKTsKIAotdm9pZAotYWNwaV9vc19kZXJpdmVfcGNpX2lkICgKLQlhY3BpX2hhbmRsZQkJcmhhbmRsZSwgICAgICAgIC8qIHVwcGVyIGJvdW5kICAqLwotCWFjcGlfaGFuZGxlCQljaGFuZGxlLCAgICAgICAgLyogY3VycmVudCBub2RlICovCi0Jc3RydWN0IGFjcGlfcGNpX2lkCSoqaWQpCi17Ci19Ci0KLSNlbmRpZiAvKkNPTkZJR19BQ1BJX1BDSSovCi0KLXN0YXRpYyB2b2lkCi1hY3BpX29zX2V4ZWN1dGVfZGVmZXJyZWQgKAotCXZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfb3NfZHBjCSpkcGMgPSBOVUxMOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX2V4ZWN1dGVfZGVmZXJyZWQiKTsKLQotCWRwYyA9IChzdHJ1Y3QgYWNwaV9vc19kcGMgKikgY29udGV4dDsKKwlkcGMgPSAoc3RydWN0IGFjcGlfb3NfZHBjICopY29udGV4dDsKIAlpZiAoIWRwYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgKE5VTEwpIGNvbnRleHQuXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIChOVUxMKSBjb250ZXh0LlxuIikpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKQEAgLTY4OCwyMSArNjM0LDIxIEBACiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oCi0JdTMyCQkJcHJpb3JpdHksCi0JYWNwaV9vc2RfZXhlY19jYWxsYmFjawlmdW5jdGlvbiwKLQl2b2lkCQkJKmNvbnRleHQpCithY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24odTMyIHByaW9yaXR5LAorCQkJICAgIGFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9vc19kcGMJKmRwYzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKnRhc2s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfb3NfZHBjICpkcGM7CisJc3RydWN0IHdvcmtfc3RydWN0ICp0YXNrOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX3F1ZXVlX2Zvcl9leGVjdXRpb24iKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19xdWV1ZV9mb3JfZXhlY3V0aW9uIik7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiU2NoZWR1bGluZyBmdW5jdGlvbiBbJXAoJXApXSBmb3IgZGVmZXJyZWQgZXhlY3V0aW9uLlxuIiwgZnVuY3Rpb24sIGNvbnRleHQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICJTY2hlZHVsaW5nIGZ1bmN0aW9uIFslcCglcCldIGZvciBkZWZlcnJlZCBleGVjdXRpb24uXG4iLAorCQkJICBmdW5jdGlvbiwgY29udGV4dCkpOwogCiAJaWYgKCFmdW5jdGlvbikKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZS9pbml0aWFsaXplIERQQyBzdHJ1Y3R1cmUuICBOb3RlIHRoYXQgdGhpcyBtZW1vcnkgd2lsbCBiZQpAQCAtNzE1LDE0NiArNjYxLDk0IEBACiAJICogZnJvbSB0aGUgc2FtZSBtZW1vcnkuCiAJICovCiAKLQlkcGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vc19kcGMpK3NpemVvZihzdHJ1Y3Qgd29ya19zdHJ1Y3QpLCBHRlBfQVRPTUlDKTsKKwlkcGMgPQorCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vc19kcGMpICsgc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCksCisJCSAgICBHRlBfQVRPTUlDKTsKIAlpZiAoIWRwYykKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAogCWRwYy0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKIAlkcGMtPmNvbnRleHQgPSBjb250ZXh0OwogCi0JdGFzayA9ICh2b2lkICopKGRwYysxKTsKLQlJTklUX1dPUksodGFzaywgYWNwaV9vc19leGVjdXRlX2RlZmVycmVkLCAodm9pZCopZHBjKTsKKwl0YXNrID0gKHZvaWQgKikoZHBjICsgMSk7CisJSU5JVF9XT1JLKHRhc2ssIGFjcGlfb3NfZXhlY3V0ZV9kZWZlcnJlZCwgKHZvaWQgKilkcGMpOwogCiAJaWYgKCFxdWV1ZV93b3JrKGthY3BpZF93cSwgdGFzaykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJDYWxsIHRvIHF1ZXVlX3dvcmsoKSBmYWlsZWQuXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ2FsbCB0byBxdWV1ZV93b3JrKCkgZmFpbGVkLlxuIikpOwogCQlrZnJlZShkcGMpOwogCQlzdGF0dXMgPSBBRV9FUlJPUjsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKTsKIAotdm9pZAotYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSgKLQl2b2lkICpjb250ZXh0KQordm9pZCBhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKHZvaWQgKmNvbnRleHQpCiB7CiAJZmx1c2hfd29ya3F1ZXVlKGthY3BpZF93cSk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSk7CiAKIC8qCiAgKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBhIHNwaW5sb2NrIGFuZCBpbml0aWFsaXplIGl0LgogICovCi1hY3BpX3N0YXR1cwotYWNwaV9vc19jcmVhdGVfbG9jayAoCi0JYWNwaV9oYW5kbGUJKm91dF9oYW5kbGUpCithY3BpX3N0YXR1cyBhY3BpX29zX2NyZWF0ZV9sb2NrKGFjcGlfaGFuZGxlICogb3V0X2hhbmRsZSkKIHsKIAlzcGlubG9ja190ICpsb2NrX3B0cjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19jcmVhdGVfbG9jayIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm9zX2NyZWF0ZV9sb2NrIik7CiAKIAlsb2NrX3B0ciA9IGFjcGlfb3NfYWxsb2NhdGUoc2l6ZW9mKHNwaW5sb2NrX3QpKTsKIAogCXNwaW5fbG9ja19pbml0KGxvY2tfcHRyKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiQ3JlYXRpbmcgc3BpbmxvY2tbJXBdLlxuIiwgbG9ja19wdHIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLCAiQ3JlYXRpbmcgc3BpbmxvY2tbJXBdLlxuIiwgbG9ja19wdHIpKTsKIAogCSpvdXRfaGFuZGxlID0gbG9ja19wdHI7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qCiAgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGEgc3BpbmxvY2suCiAgKi8KLXZvaWQKLWFjcGlfb3NfZGVsZXRlX2xvY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSkKK3ZvaWQgYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX2NyZWF0ZV9sb2NrIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgib3NfY3JlYXRlX2xvY2siKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiRGVsZXRpbmcgc3BpbmxvY2tbJXBdLlxuIiwgaGFuZGxlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwgIkRlbGV0aW5nIHNwaW5sb2NrWyVwXS5cbiIsIGhhbmRsZSkpOwogCiAJYWNwaV9vc19mcmVlKGhhbmRsZSk7CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotLyoKLSAqIEFjcXVpcmUgYSBzcGlubG9jay4KLSAqCi0gKiBoYW5kbGUgaXMgYSBwb2ludGVyIHRvIHRoZSBzcGlubG9ja190LgotICogZmxhZ3MgaXMgKm5vdCogdGhlIHJlc3VsdCBvZiBzYXZlX2ZsYWdzIC0gaXQgaXMgYW4gQUNQSS1zcGVjaWZpYyBmbGFnIHZhcmlhYmxlCi0gKiAgIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGF0IGludGVycnVwdCBsZXZlbC4KLSAqLwotdm9pZAotYWNwaV9vc19hY3F1aXJlX2xvY2sgKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQl1MzIJCWZsYWdzKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJvc19hY3F1aXJlX2xvY2siKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiQWNxdWlyaW5nIHNwaW5sb2NrWyVwXSBmcm9tICVzIGxldmVsXG4iLCBoYW5kbGUsCi0JCSgoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpID8gIm5vbi1pbnRlcnJ1cHQiIDogImludGVycnVwdCIpKSk7Ci0KLQlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpCi0JCUFDUElfRElTQUJMRV9JUlFTKCk7Ci0KLQlzcGluX2xvY2soKHNwaW5sb2NrX3QgKiloYW5kbGUpOwotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLQotLyoKLSAqIFJlbGVhc2UgYSBzcGlubG9jay4gU2VlIGFib3ZlLgotICovCi12b2lkCi1hY3BpX29zX3JlbGVhc2VfbG9jayAoCi0JYWNwaV9oYW5kbGUJaGFuZGxlLAotCXUzMgkJZmxhZ3MpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX3JlbGVhc2VfbG9jayIpOwotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJSZWxlYXNpbmcgc3BpbmxvY2tbJXBdIGZyb20gJXMgbGV2ZWxcbiIsIGhhbmRsZSwKLQkJKChmbGFncyAmIEFDUElfTk9UX0lTUikgPyAibm9uLWludGVycnVwdCIgOiAiaW50ZXJydXB0IikpKTsKLQotCXNwaW5fdW5sb2NrKChzcGlubG9ja190ICopaGFuZGxlKTsKLQotCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikKLQkJQUNQSV9FTkFCTEVfSVJRUygpOwotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLQogYWNwaV9zdGF0dXMKLWFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSgKLQl1MzIJCW1heF91bml0cywKLQl1MzIJCWluaXRpYWxfdW5pdHMsCi0JYWNwaV9oYW5kbGUJKmhhbmRsZSkKK2FjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSh1MzIgbWF4X3VuaXRzLCB1MzIgaW5pdGlhbF91bml0cywgYWNwaV9oYW5kbGUgKiBoYW5kbGUpCiB7Ci0Jc3RydWN0IHNlbWFwaG9yZQkqc2VtID0gTlVMTDsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gPSBOVUxMOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX2NyZWF0ZV9zZW1hcGhvcmUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19jcmVhdGVfc2VtYXBob3JlIik7CiAKIAlzZW0gPSBhY3BpX29zX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3Qgc2VtYXBob3JlKSk7CiAJaWYgKCFzZW0pCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJbWVtc2V0KHNlbSwgMCwgc2l6ZW9mKHN0cnVjdCBzZW1hcGhvcmUpKTsKIAogCXNlbWFfaW5pdChzZW0sIGluaXRpYWxfdW5pdHMpOwogCi0JKmhhbmRsZSA9IChhY3BpX2hhbmRsZSopc2VtOworCSpoYW5kbGUgPSAoYWNwaV9oYW5kbGUgKikgc2VtOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJDcmVhdGluZyBzZW1hcGhvcmVbJXB8JWRdLlxuIiwgKmhhbmRsZSwgaW5pdGlhbF91bml0cykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsICJDcmVhdGluZyBzZW1hcGhvcmVbJXB8JWRdLlxuIiwKKwkJCSAgKmhhbmRsZSwgaW5pdGlhbF91bml0cykpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUpOwogCiAvKgogICogVE9ETzogQSBiZXR0ZXIgd2F5IHRvIGRlbGV0ZSBzZW1hcGhvcmVzPyAgTGludXggZG9lc24ndCBoYXZlIGEKQEAgLTg2MywyNSArNzU3LDI0IEBACiAgKiB3ZSBhdCBsZWFzdCBjaGVjayBmb3IgYmxvY2tlZCB0aHJlYWRzIGFuZCBzaWduYWwvY2FuY2VsIHRoZW0/CiAgKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZSgKLQlhY3BpX2hhbmRsZQloYW5kbGUpCithY3BpX3N0YXR1cyBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUoYWNwaV9oYW5kbGUgaGFuZGxlKQogewotCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlKikgaGFuZGxlOworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlICopaGFuZGxlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX2RlbGV0ZV9zZW1hcGhvcmUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19kZWxldGVfc2VtYXBob3JlIik7CiAKIAlpZiAoIXNlbSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJEZWxldGluZyBzZW1hcGhvcmVbJXBdLlxuIiwgaGFuZGxlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwgIkRlbGV0aW5nIHNlbWFwaG9yZVslcF0uXG4iLCBoYW5kbGUpKTsKIAotCWFjcGlfb3NfZnJlZShzZW0pOyBzZW0gPSAgTlVMTDsKKwlhY3BpX29zX2ZyZWUoc2VtKTsKKwlzZW0gPSBOVUxMOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUpOwogCiAvKgogICogVE9ETzogVGhlIGtlcm5lbCBkb2Vzbid0IGhhdmUgYSAnZG93bl90aW1lb3V0JyBmdW5jdGlvbiAtLSBoYWQgdG8KQEAgLTg5MiwzMSArNzg1LDI3IEBACiAgKgogICogVE9ETzogU3VwcG9ydCBmb3IgdW5pdHMgPiAxPwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9vc193YWl0X3NlbWFwaG9yZSgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCXVuaXRzLAotCXUxNgkJCXRpbWVvdXQpCithY3BpX3N0YXR1cyBhY3BpX29zX3dhaXRfc2VtYXBob3JlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHVuaXRzLCB1MTYgdGltZW91dCkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IHNlbWFwaG9yZQkqc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUqKWhhbmRsZTsKLQlpbnQJCQlyZXQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlICopaGFuZGxlOworCWludCByZXQgPSAwOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX3dhaXRfc2VtYXBob3JlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgib3Nfd2FpdF9zZW1hcGhvcmUiKTsKIAogCWlmICghc2VtIHx8ICh1bml0cyA8IDEpKQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAKIAlpZiAodW5pdHMgPiAxKQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1NVUFBPUlQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwgIldhaXRpbmcgZm9yIHNlbWFwaG9yZVslcHwlZHwlZF1cbiIsIGhhbmRsZSwgdW5pdHMsIHRpbWVvdXQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLCAiV2FpdGluZyBmb3Igc2VtYXBob3JlWyVwfCVkfCVkXVxuIiwKKwkJCSAgaGFuZGxlLCB1bml0cywgdGltZW91dCkpOwogCiAJaWYgKGluX2F0b21pYygpKQogCQl0aW1lb3V0ID0gMDsKIAotCXN3aXRjaCAodGltZW91dCkKLQl7CisJc3dpdGNoICh0aW1lb3V0KSB7CiAJCS8qCiAJCSAqIE5vIFdhaXQ6CiAJCSAqIC0tLS0tLS0tCkBAIC05MjQsOCArODEzLDggQEAKIAkJICogYWNxdWlyZSB0aGUgc2VtYXBob3JlIGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgcmV0dXJuIEFFX1RJTUUKIAkJICogKGEuay5hLiAnd291bGQgYmxvY2snKS4KIAkJICovCi0JCWNhc2UgMDoKLQkJaWYoZG93bl90cnlsb2NrKHNlbSkpCisJY2FzZSAwOgorCQlpZiAoZG93bl90cnlsb2NrKHNlbSkpCiAJCQlzdGF0dXMgPSBBRV9USU1FOwogCQlicmVhazsKIApAQCAtOTMzLDcgKzgyMiw3IEBACiAJCSAqIFdhaXQgSW5kZWZpbml0ZWx5OgogCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0KIAkJICovCi0JCWNhc2UgQUNQSV9XQUlUX0ZPUkVWRVI6CisJY2FzZSBBQ1BJX1dBSVRfRk9SRVZFUjoKIAkJZG93bihzZW0pOwogCQlicmVhazsKIApAQCAtOTQxLDExICs4MzAsMTEgQEAKIAkJICogV2FpdCB3LyBUaW1lb3V0OgogCQkgKiAtLS0tLS0tLS0tLS0tLS0tCiAJCSAqLwotCQlkZWZhdWx0OgorCWRlZmF1bHQ6CiAJCS8vIFRPRE86IEEgYmV0dGVyIHRpbWVvdXQgYWxnb3JpdGhtPwogCQl7CiAJCQlpbnQgaSA9IDA7Ci0JCQlzdGF0aWMgY29uc3QgaW50IHF1YW50dW1fbXMgPSAxMDAwL0haOworCQkJc3RhdGljIGNvbnN0IGludCBxdWFudHVtX21zID0gMTAwMCAvIEhaOwogCiAJCQlyZXQgPSBkb3duX3RyeWxvY2soc2VtKTsKIAkJCWZvciAoaSA9IHRpbWVvdXQ7IChpID4gMCAmJiByZXQgPCAwKTsgaSAtPSBxdWFudHVtX21zKSB7CkBAIC05NTMsNyArODQyLDcgQEAKIAkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCQkJCXJldCA9IGRvd25fdHJ5bG9jayhzZW0pOwogCQkJfQotCQorCiAJCQlpZiAocmV0ICE9IDApCiAJCQkJc3RhdHVzID0gQUVfVElNRTsKIAkJfQpAQCAtOTYxLDQ3ICs4NTAsNDggQEAKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJGYWlsZWQgdG8gYWNxdWlyZSBzZW1hcGhvcmVbJXB8JWR8JWRdLCAlc1xuIiwgCi0JCQloYW5kbGUsIHVuaXRzLCB0aW1lb3V0LCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJBY3F1aXJlZCBzZW1hcGhvcmVbJXB8JWR8JWRdXG4iLCBoYW5kbGUsIHVuaXRzLCB0aW1lb3V0KSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiRmFpbGVkIHRvIGFjcXVpcmUgc2VtYXBob3JlWyVwfCVkfCVkXSwgJXNcbiIsCisJCQkJICBoYW5kbGUsIHVuaXRzLCB0aW1lb3V0LAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLAorCQkJCSAgIkFjcXVpcmVkIHNlbWFwaG9yZVslcHwlZHwlZF1cbiIsIGhhbmRsZSwKKwkJCQkgIHVuaXRzLCB0aW1lb3V0KSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX29zX3dhaXRfc2VtYXBob3JlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX29zX3dhaXRfc2VtYXBob3JlKTsKIAogLyoKICAqIFRPRE86IFN1cHBvcnQgZm9yIHVuaXRzID4gMT8KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSgKLSAgICBhY3BpX2hhbmRsZSAJICAgIGhhbmRsZSwKLSAgICB1MzIgCQkgICAgdW5pdHMpCithY3BpX3N0YXR1cyBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdW5pdHMpCiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSAqc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUgKikgaGFuZGxlOworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSA9IChzdHJ1Y3Qgc2VtYXBob3JlICopaGFuZGxlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoIm9zX3NpZ25hbF9zZW1hcGhvcmUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19zaWduYWxfc2VtYXBob3JlIik7CiAKIAlpZiAoIXNlbSB8fCAodW5pdHMgPCAxKSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCiAJaWYgKHVuaXRzID4gMSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJTaWduYWxpbmcgc2VtYXBob3JlWyVwfCVkXVxuIiwgaGFuZGxlLCB1bml0cykpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsICJTaWduYWxpbmcgc2VtYXBob3JlWyVwfCVkXVxuIiwgaGFuZGxlLAorCQkJICB1bml0cykpOwogCiAJdXAoc2VtKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi11MzIKLWFjcGlfb3NfZ2V0X2xpbmUoY2hhciAqYnVmZmVyKQordTMyIGFjcGlfb3NfZ2V0X2xpbmUoY2hhciAqYnVmZmVyKQogewogCiAjaWZkZWYgRU5BQkxFX0RFQlVHR0VSCkBAIC0xMDE4LDIyICs5MDgsMjEgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKiBBc3N1bWVzIG5vIHVucmVhZGFibGUgaG9sZXMgaW5iZXR3ZWVuICovCi11OAotYWNwaV9vc19yZWFkYWJsZSh2b2lkICpwdHIsIGFjcGlfc2l6ZSBsZW4pCit1OCBhY3BpX29zX3JlYWRhYmxlKHZvaWQgKnB0ciwgYWNwaV9zaXplIGxlbikKIHsKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIAorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKIAljaGFyIHRtcDsKLQlyZXR1cm4gIV9fZ2V0X3VzZXIodG1wLCAoY2hhciBfX3VzZXIgKilwdHIpICYmICFfX2dldF91c2VyKHRtcCwgKGNoYXIgX191c2VyICopcHRyICsgbGVuIC0gMSk7CisJcmV0dXJuICFfX2dldF91c2VyKHRtcCwgKGNoYXIgX191c2VyICopcHRyKQorCSAgICAmJiAhX19nZXRfdXNlcih0bXAsIChjaGFyIF9fdXNlciAqKXB0ciArIGxlbiAtIDEpOwogI2VuZGlmCiAJcmV0dXJuIDE7CiB9CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdTgKLWFjcGlfb3Nfd3JpdGFibGUodm9pZCAqcHRyLCBhY3BpX3NpemUgbGVuKQordTggYWNwaV9vc193cml0YWJsZSh2b2lkICpwdHIsIGFjcGlfc2l6ZSBsZW4pCiB7CiAJLyogY291bGQgZG8gZHVtbXkgd3JpdGUgKHJhY3kpIG9yIGEga2VybmVsIHBhZ2UgdGFibGUgbG9va3VwLgogCSAgIFRoZSBsYXRlciBtYXkgYmUgZGlmZmljdWx0IGF0IGVhcmx5IGJvb3Qgd2hlbiBrbWFwIGRvZXNuJ3Qgd29yayB5ZXQuICovCkBAIC0xMDQxLDggKzkzMCw3IEBACiB9CiAjZW5kaWYKIAotdTMyCi1hY3BpX29zX2dldF90aHJlYWRfaWQgKHZvaWQpCit1MzIgYWNwaV9vc19nZXRfdGhyZWFkX2lkKHZvaWQpCiB7CiAJaWYgKCFpbl9hdG9taWMoKSkKIAkJcmV0dXJuIGN1cnJlbnQtPnBpZDsKQEAgLTEwNTAsMTMgKzkzOCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3NpZ25hbCAoCi0gICAgdTMyCQlmdW5jdGlvbiwKLSAgICB2b2lkCSppbmZvKQorYWNwaV9zdGF0dXMgYWNwaV9vc19zaWduYWwodTMyIGZ1bmN0aW9uLCB2b2lkICppbmZvKQogewotCXN3aXRjaCAoZnVuY3Rpb24pCi0JeworCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfU0lHTkFMX0ZBVEFMOgogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJGYXRhbCBvcGNvZGUgZXhlY3V0ZWRcbiIpOwogCQlicmVhazsKQEAgLTEwNzYsMTMgKzk2MCwxMyBAQAogCiAJcmV0dXJuIEFFX09LOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfb3Nfc2lnbmFsKTsKIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfb3NfbmFtZV9zZXR1cChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX29zX25hbWVfc2V0dXAoY2hhciAqc3RyKQogewogCWNoYXIgKnAgPSBhY3BpX29zX25hbWU7Ci0JaW50IGNvdW50ID0gQUNQSV9NQVhfT1ZFUlJJREVfTEVOLTE7CisJaW50IGNvdW50ID0gQUNQSV9NQVhfT1ZFUlJJREVfTEVOIC0gMTsKIAogCWlmICghc3RyIHx8ICEqc3RyKQogCQlyZXR1cm4gMDsKQEAgLTEwOTgsNyArOTgyLDcgQEAKIAkqcCA9IDA7CiAKIAlyZXR1cm4gMTsKLQkJCisKIH0KIAogX19zZXR1cCgiYWNwaV9vc19uYW1lPSIsIGFjcGlfb3NfbmFtZV9zZXR1cCk7CkBAIC0xMTA4LDE2ICs5OTIsMTUgQEAKICAqIGVtcHR5IHN0cmluZyBkaXNhYmxlcyBfT1NJCiAgKiBUQkQgYWRkaXRpb25hbCBzdHJpbmcgYWRkcyB0byBfT1NJCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX29zaV9zZXR1cChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX29zaV9zZXR1cChjaGFyICpzdHIpCiB7CiAJaWYgKHN0ciA9PSBOVUxMIHx8ICpzdHIgPT0gJ1wwJykgewogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiX09TSSBtZXRob2QgZGlzYWJsZWRcbiIpOwogCQlhY3BpX2dibF9jcmVhdGVfb3NpX21ldGhvZCA9IEZBTFNFOwotCX0gZWxzZQotCXsKKwl9IGVsc2UgewogCQkvKiBUQkQgKi8KLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiX09TSSBhZGRpdGlvbmFsIHN0cmluZyBpZ25vcmVkIC0tICVzXG4iLCBzdHIpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJfT1NJIGFkZGl0aW9uYWwgc3RyaW5nIGlnbm9yZWQgLS0gJXNcbiIsCisJCSAgICAgICBzdHIpOwogCX0KIAogCXJldHVybiAxOwpAQCAtMTEyNiw4ICsxMDA5LDcgQEAKIF9fc2V0dXAoImFjcGlfb3NpPSIsIGFjcGlfb3NpX3NldHVwKTsKIAogLyogZW5hYmxlIHNlcmlhbGl6YXRpb24gdG8gY29tYmF0IEFFX0FMUkVBRFlfRVhJU1RTIGVycm9ycyAqLwotc3RhdGljIGludCBfX2luaXQKLWFjcGlfc2VyaWFsaXplX3NldHVwKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfc2VyaWFsaXplX3NldHVwKGNoYXIgKnN0cikKIHsKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAic2VyaWFsaXplIGVuYWJsZWRcbiIpOwogCkBAIC0xMTQ3LDggKzEwMjksNyBAQAogICogUnVuLXRpbWUgZXZlbnRzIG9uIHRoZSBzYW1lIEdQRSB0aGlzIGZsYWcgaXMgYXZhaWxhYmxlCiAgKiB0byB0ZWxsIExpbnV4IHRvIGtlZXAgdGhlIHdha2UtdGltZSBHUEVzIGVuYWJsZWQgYXQgcnVuLXRpbWUuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3dha2VfZ3Blc19hbHdheXNfb25fc2V0dXAoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uX3NldHVwKGNoYXIgKnN0cikKIHsKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAid2FrZSBHUEVzIG5vdCBkaXNhYmxlZFxuIik7CiAKQEAgLTExNTksOCArMTA0MCw3IEBACiAKIF9fc2V0dXAoImFjcGlfd2FrZV9ncGVzX2Fsd2F5c19vbiIsIGFjcGlfd2FrZV9ncGVzX2Fsd2F5c19vbl9zZXR1cCk7CiAKLWludCBfX2luaXQKLWFjcGlfaG90a2V5X3NldHVwKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfaG90a2V5X3NldHVwKGNoYXIgKnN0cikKIHsKIAlhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkID0gRkFMU0U7CiAJcmV0dXJuIDE7CkBAIC0xMTc0LDUgKzEwNTQsMTMyIEBACiAgKi8KIHVuc2lnbmVkIGludCBtYXhfY3N0YXRlID0gQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOwogCi0KIEVYUE9SVF9TWU1CT0wobWF4X2NzdGF0ZSk7CisKKy8qCisgKiBBY3F1aXJlIGEgc3BpbmxvY2suCisgKgorICogaGFuZGxlIGlzIGEgcG9pbnRlciB0byB0aGUgc3BpbmxvY2tfdC4KKyAqIGZsYWdzIGlzICpub3QqIHRoZSByZXN1bHQgb2Ygc2F2ZV9mbGFncyAtIGl0IGlzIGFuIEFDUEktc3BlY2lmaWMgZmxhZyB2YXJpYWJsZQorICogICB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBhdCBpbnRlcnJ1cHQgbGV2ZWwuCisgKi8KKwordW5zaWduZWQgbG9uZyBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgoc3BpbmxvY2tfdCAqKSBoYW5kbGUsIGZsYWdzKTsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8qCisgKiBSZWxlYXNlIGEgc3BpbmxvY2suIFNlZSBhYm92ZS4KKyAqLworCit2b2lkIGFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopIGhhbmRsZSwgZmxhZ3MpOworfQorCisjaWZuZGVmIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlCisgKgorICogUEFSQU1FVEVSUzogIENhY2hlTmFtZSAgICAgICAtIEFzY2lpIG5hbWUgZm9yIHRoZSBjYWNoZQorICogICAgICAgICAgICAgIE9iamVjdFNpemUgICAgICAtIFNpemUgb2YgZWFjaCBjYWNoZWQgb2JqZWN0CisgKiAgICAgICAgICAgICAgTWF4RGVwdGggICAgICAgIC0gTWF4aW11bSBkZXB0aCBvZiB0aGUgY2FjaGUgKGluIG9iamVjdHMpCisgKiAgICAgICAgICAgICAgUmV0dXJuQ2FjaGUgICAgIC0gV2hlcmUgdGhlIG5ldyBjYWNoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGNhY2hlIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX29zX2NyZWF0ZV9jYWNoZShjaGFyICpuYW1lLCB1MTYgc2l6ZSwgdTE2IGRlcHRoLCBhY3BpX2NhY2hlX3QgKiogY2FjaGUpCit7CisJKmNhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUobmFtZSwgc2l6ZSwgMCwgMCwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIEFFX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX3B1cmdlX2NhY2hlCisgKgorICogUEFSQU1FVEVSUzogIENhY2hlICAgICAgICAgICAtIEhhbmRsZSB0byBjYWNoZSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEZyZWUgYWxsIG9iamVjdHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgY2FjaGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2NhY2hlX3QgKiBjYWNoZSkKK3sKKwkodm9pZClrbWVtX2NhY2hlX3NocmluayhjYWNoZSk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfZGVsZXRlX2NhY2hlCisgKgorICogUEFSQU1FVEVSUzogIENhY2hlICAgICAgICAgICAtIEhhbmRsZSB0byBjYWNoZSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEZyZWUgYWxsIG9iamVjdHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgY2FjaGUgYW5kIGRlbGV0ZSB0aGUKKyAqICAgICAgICAgICAgICBjYWNoZSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9jYWNoZV90ICogY2FjaGUpCit7CisJKHZvaWQpa21lbV9jYWNoZV9kZXN0cm95KGNhY2hlKTsKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19yZWxlYXNlX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAtIEhhbmRsZSB0byBjYWNoZSBvYmplY3QKKyAqICAgICAgICAgICAgICBPYmplY3QgICAgICAtIFRoZSBvYmplY3QgdG8gYmUgcmVsZWFzZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlLiAgSWYgY2FjaGUgaXMgZnVsbCwKKyAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2NhY2hlX3QgKiBjYWNoZSwgdm9pZCAqb2JqZWN0KQoreworCWttZW1fY2FjaGVfZnJlZShjYWNoZSwgb2JqZWN0KTsKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19hY3F1aXJlX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgUmV0dXJuT2JqZWN0ICAgIC0gV2hlcmUgdGhlIG9iamVjdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FjaGUuICBJZiBjYWNoZSBpcyBlbXB0eSwKKyAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICphY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfY2FjaGVfdCAqIGNhY2hlKQoreworCXZvaWQgKm9iamVjdCA9IGttZW1fY2FjaGVfYWxsb2MoY2FjaGUsIEdGUF9LRVJORUwpOworCVdBUk5fT04oIW9iamVjdCk7CisJcmV0dXJuIG9iamVjdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL3BhcnNlci9NYWtlZmlsZQppbmRleCBiYmRkMjg2Li5kYjI0ZWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBhbGwgTGludXggQUNQSSBpbnRlcnByZXRlciBzdWJkaXJlY3RvcmllcwogIwogCi1vYmoteSA6PSBwc2FyZ3MubyAgICBwc3BhcnNlLm8gIHBzdHJlZS5vICAgcHN3YWxrLm8gIFwKK29iai15IDo9IHBzYXJncy5vICAgIHBzcGFyc2UubyAgcHNsb29wLm8gcHN0cmVlLm8gICBwc3dhbGsubyAgXAogCSBwc29wY29kZS5vICBwc3Njb3BlLm8gIHBzdXRpbHMubyAgcHN4ZmFjZS5vCiAKIEVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKaW5kZXggYjdhYzY4Yy4uNTg1ODE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCkBAIC00MSwyNSArNDEsMjAgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzYXJncyIpCitBQ1BJX01PRFVMRV9OQU1FKCJwc2FyZ3MiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB1MzIKLWFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSk7CithY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpOwogCi1zdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfbmV4dF9maWVsZCAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKLQorc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9uZXh0X2ZpZWxkKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlCisJCQkJCQkgICAgICAgKnBhcnNlcl9zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzUsNDkgKzcwLDQzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdTMyCi1hY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCithY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkX2xlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisJdTMyIGVuY29kZWRfbGVuZ3RoOworCXUzMiBsZW5ndGggPSAwOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCIpOwotCi0KLQllbmNvZGVkX2xlbmd0aCA9ICh1MzIpIEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpOworCWVuY29kZWRfbGVuZ3RoID0gKHUzMikgQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKTsKIAlwYXJzZXJfc3RhdGUtPmFtbCsrOwogCi0Jc3dpdGNoIChlbmNvZGVkX2xlbmd0aCA+PiA2KSAvKiBiaXRzIDYtNyBjb250YWluIGVuY29kaW5nIHNjaGVtZSAqLyB7Ci0JY2FzZSAwOiAvKiAxLWJ5dGUgZW5jb2RpbmcgKGJpdHMgMC01KSAqLworCXN3aXRjaCAoZW5jb2RlZF9sZW5ndGggPj4gNikgewkvKiBiaXRzIDYtNyBjb250YWluIGVuY29kaW5nIHNjaGVtZSAqLworCWNhc2UgMDoJCS8qIDEtYnl0ZSBlbmNvZGluZyAoYml0cyAwLTUpICovCiAKIAkJbGVuZ3RoID0gKGVuY29kZWRfbGVuZ3RoICYgMHgzRik7CiAJCWJyZWFrOwogCisJY2FzZSAxOgkJLyogMi1ieXRlIGVuY29kaW5nIChuZXh0IGJ5dGUgKyBiaXRzIDAtMykgKi8KIAotCWNhc2UgMTogLyogMi1ieXRlIGVuY29kaW5nIChuZXh0IGJ5dGUgKyBiaXRzIDAtMykgKi8KLQotCQlsZW5ndGggPSAoKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDA0KSB8Ci0JCQkJIChlbmNvZGVkX2xlbmd0aCAmIDB4MEYpKTsKKwkJbGVuZ3RoID0gKChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDA0KSB8CisJCQkgIChlbmNvZGVkX2xlbmd0aCAmIDB4MEYpKTsKIAkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKIAkJYnJlYWs7CiAKKwljYXNlIDI6CQkvKiAzLWJ5dGUgZW5jb2RpbmcgKG5leHQgMiBieXRlcyArIGJpdHMgMC0zKSAqLwogCi0JY2FzZSAyOiAvKiAzLWJ5dGUgZW5jb2RpbmcgKG5leHQgMiBieXRlcyArIGJpdHMgMC0zKSAqLwotCi0JCWxlbmd0aCA9ICgoQUNQSV9HRVQ4IChwYXJzZXJfc3RhdGUtPmFtbCArIDEpIDw8IDEyKSB8Ci0JCQkJICAoQUNQSV9HRVQ4IChwYXJzZXJfc3RhdGUtPmFtbCkgICAgPDwgMDQpIHwKLQkJCQkgIChlbmNvZGVkX2xlbmd0aCAmIDB4MEYpKTsKKwkJbGVuZ3RoID0gKChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwgKyAxKSA8PCAxMikgfAorCQkJICAoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCAwNCkgfAorCQkJICAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sICs9IDI7CiAJCWJyZWFrOwogCisJY2FzZSAzOgkJLyogNC1ieXRlIGVuY29kaW5nIChuZXh0IDMgYnl0ZXMgKyBiaXRzIDAtMykgKi8KIAotCWNhc2UgMzogLyogNC1ieXRlIGVuY29kaW5nIChuZXh0IDMgYnl0ZXMgKyBiaXRzIDAtMykgKi8KLQotCQlsZW5ndGggPSAoKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwgKyAyKSA8PCAyMCkgfAotCQkJCSAgKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwgKyAxKSA8PCAxMikgfAotCQkJCSAgKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpICAgIDw8IDA0KSB8Ci0JCQkJICAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7CisJCWxlbmd0aCA9ICgoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sICsgMikgPDwgMjApIHwKKwkJCSAgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCArIDEpIDw8IDEyKSB8CisJCQkgIChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDA0KSB8CisJCQkgIChlbmNvZGVkX2xlbmd0aCAmIDB4MEYpKTsKIAkJcGFyc2VyX3N0YXRlLT5hbWwgKz0gMzsKIAkJYnJlYWs7CiAKQEAgLTEyNywxMCArMTE2LDkgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuX1ZBTFVFIChsZW5ndGgpOworCXJldHVybl9WQUxVRShsZW5ndGgpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQKQEAgLTE0NCwyNSArMTMyLDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTggKgotYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZCAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQordTggKmFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgbGVuZ3RoOworCXU4ICpzdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOworCWFjcGlfbmF0aXZlX3VpbnQgbGVuZ3RoOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfcGFja2FnZV9lbmQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX2dldF9uZXh0X3BhY2thZ2VfZW5kIik7CiAKIAkvKiBGdW5jdGlvbiBiZWxvdyBjaGFuZ2VzIHBhcnNlcl9zdGF0ZS0+QW1sICovCiAKLQlsZW5ndGggPSAoYWNwaV9uYXRpdmVfdWludCkgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCAocGFyc2VyX3N0YXRlKTsKKwlsZW5ndGggPQorCSAgICAoYWNwaV9uYXRpdmVfdWludCkgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChwYXJzZXJfc3RhdGUpOwogCi0JcmV0dXJuX1BUUiAoc3RhcnQgKyBsZW5ndGgpOyAvKiBlbmQgb2YgcGFja2FnZSAqLworCXJldHVybl9QVFIoc3RhcnQgKyBsZW5ndGgpOwkvKiBlbmQgb2YgcGFja2FnZSAqLwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZwpAQCAtMTc4LDIwICsxNjIsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jaGFyICoKLWFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQorY2hhciAqYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbmQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKKwl1OCAqc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKKwl1OCAqZW5kID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc19nZXRfbmV4dF9uYW1lc3RyaW5nIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9uYW1lc3RyaW5nIik7CiAKIAkvKiBIYW5kbGUgbXVsdGlwbGUgcHJlZml4IGNoYXJhY3RlcnMgKi8KIAotCXdoaWxlIChhY3BpX3BzX2lzX3ByZWZpeF9jaGFyIChBQ1BJX0dFVDggKGVuZCkpKSB7CisJd2hpbGUgKGFjcGlfcHNfaXNfcHJlZml4X2NoYXIoQUNQSV9HRVQ4KGVuZCkpKSB7CiAJCS8qIEluY2x1ZGUgcHJlZml4ICdcXCcgb3IgJ14nICovCiAKIAkJZW5kKys7CkBAIC0xOTksNyArMTc5LDcgQEAKIAogCS8qIERlY29kZSB0aGUgcGF0aCAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVDggKGVuZCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUOChlbmQpKSB7CiAJY2FzZSAwOgogCiAJCS8qIG51bGxfbmFtZSAqLwpAQCAtMjIxLDcgKzIwMSw3IEBACiAKIAkJLyogTXVsdGlwbGUgbmFtZSBzZWdtZW50cywgNCBjaGFycyBlYWNoICovCiAKLQkJZW5kICs9IDIgKyAoKGFjcGlfc2l6ZSkgQUNQSV9HRVQ4IChlbmQgKyAxKSAqIEFDUElfTkFNRV9TSVpFKTsKKwkJZW5kICs9IDIgKyAoKGFjcGlfc2l6ZSkgQUNQSV9HRVQ4KGVuZCArIDEpICogQUNQSV9OQU1FX1NJWkUpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0yMzIsMTEgKzIxMiwxMCBAQAogCQlicmVhazsKIAl9CiAKLQlwYXJzZXJfc3RhdGUtPmFtbCA9ICh1OCopIGVuZDsKLQlyZXR1cm5fUFRSICgoY2hhciAqKSBzdGFydCk7CisJcGFyc2VyX3N0YXRlLT5hbWwgPSAodTggKikgZW5kOworCXJldHVybl9QVFIoKGNoYXIgKilzdGFydCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aApAQCAtMjU5LDI0ICsyMzgsMjAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCkKK2FjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZywgdTggbWV0aG9kX2NhbGwpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuYW1lX29wOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbWV0aG9kX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgIHNjb3BlX2luZm87CisJY2hhciAqcGF0aDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmFtZV9vcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptZXRob2RfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgc2NvcGVfaW5mbzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX2dldF9uZXh0X25hbWVwYXRoIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfbmFtZXBhdGgiKTsKLQotCi0JcGF0aCA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAocGFyc2VyX3N0YXRlKTsKKwlwYXRoID0gYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHBhcnNlcl9zdGF0ZSk7CiAKIAkvKiBOdWxsIHBhdGggY2FzZSBpcyBhbGxvd2VkICovCiAKQEAgLTI5Niw0OSArMjcxLDUwIEBACiAJCSAqIHBhcmVudCB0cmVlLCBidXQgZG9uJ3Qgb3BlbiBhIG5ldyBzY29wZSAtLSB3ZSBqdXN0IHdhbnQgdG8gbG9va3VwIHRoZQogCQkgKiBvYmplY3QgIChNVVNUIEJFIG1vZGUgRVhFQ1VURSB0byBwZXJmb3JtIHVwc2VhcmNoKQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKCZzY29wZV9pbmZvLCBwYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJCSBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAotCQkJCSBOVUxMLCAmbm9kZSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykgJiYgbWV0aG9kX2NhbGwpIHsKKwkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoJnNjb3BlX2luZm8sIHBhdGgsIEFDUElfVFlQRV9BTlksCisJCQkJCUFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkJQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKKwkJCQkJQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsICZub2RlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIG1ldGhvZF9jYWxsKSB7CiAJCQlpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CiAJCQkJLyogVGhpcyBuYW1lIGlzIGFjdHVhbGx5IGEgY29udHJvbCBtZXRob2QgaW52b2NhdGlvbiAqLwogCi0JCQkJbWV0aG9kX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkJCQkiQ29udHJvbCBNZXRob2QgLSAlcCBEZXNjICVwIFBhdGg9JXBcbiIsCi0JCQkJCW5vZGUsIG1ldGhvZF9kZXNjLCBwYXRoKSk7CisJCQkJbWV0aG9kX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgRGVzYyAlcCBQYXRoPSVwXG4iLAorCQkJCQkJICBub2RlLCBtZXRob2RfZGVzYywgcGF0aCkpOwogCi0JCQkJbmFtZV9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfTkFNRVBBVEhfT1ApOworCQkJCW5hbWVfb3AgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfTkFNRVBBVEhfT1ApOwogCQkJCWlmICghbmFtZV9vcCkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQkJCX0KIAogCQkJCS8qIENoYW5nZSBhcmcgaW50byBhIE1FVEhPRCBDQUxMIGFuZCBhdHRhY2ggbmFtZSB0byBpdCAqLwogCi0JCQkJYWNwaV9wc19pbml0X29wIChhcmcsIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCk7CisJCQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9NRVRIT0RDQUxMX09QKTsKIAkJCQluYW1lX29wLT5jb21tb24udmFsdWUubmFtZSA9IHBhdGg7CiAKIAkJCQkvKiBQb2ludCBNRVRIT0RDQUxML05BTUUgdG8gdGhlIE1FVEhPRCBOb2RlICovCiAKIAkJCQluYW1lX29wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JCQkJYWNwaV9wc19hcHBlbmRfYXJnIChhcmcsIG5hbWVfb3ApOworCQkJCWFjcGlfcHNfYXBwZW5kX2FyZyhhcmcsIG5hbWVfb3ApOwogCiAJCQkJaWYgKCFtZXRob2RfZGVzYykgewotCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCQkJInBzX2dldF9uZXh0X25hbWVwYXRoOiBDb250cm9sIE1ldGhvZCAlcCBoYXMgbm8gYXR0YWNoZWQgb2JqZWN0XG4iLAotCQkJCQkJbm9kZSkpOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CisJCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgicHNfZ2V0X25leHRfbmFtZXBhdGg6IENvbnRyb2wgTWV0aG9kICVwIGhhcyBubyBhdHRhY2hlZCBvYmplY3RcbiIsIG5vZGUpKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCQkJfQogCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCQkJCSJDb250cm9sIE1ldGhvZCAtICVwIEFyZ3MgJVhcbiIsCi0JCQkJCW5vZGUsIG1ldGhvZF9kZXNjLT5tZXRob2QucGFyYW1fY291bnQpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCQkJICAiQ29udHJvbCBNZXRob2QgLSAlcCBBcmdzICVYXG4iLAorCQkJCQkJICBub2RlLAorCQkJCQkJICBtZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkJICBwYXJhbV9jb3VudCkpOwogCiAJCQkJLyogR2V0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGV4cGVjdCAqLwogCi0JCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gbWV0aG9kX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPQorCQkJCSAgICBtZXRob2RfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50OworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9CiAKIAkJCS8qCkBAIC0zNDgsMjUgKzMyNCwyNiBAQAogCQkJICovCiAJCX0KIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJLyoKIAkJCSAqIDEpIEFueSBlcnJvciBvdGhlciB0aGFuIE5PVF9GT1VORCBpcyBhbHdheXMgc2V2ZXJlCiAJCQkgKiAyKSBOT1RfRk9VTkQgaXMgb25seSBpbXBvcnRhbnQgaWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZC4KIAkJCSAqIDMpIElmIGV4ZWN1dGluZyBhIGNvbmRfcmVmX29mIG9wY29kZSwgTk9UX0ZPVU5EIGlzIG9rLgogCQkJICovCi0JCQlpZiAoKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX01PREVfTUFTSykgPT0gQUNQSV9QQVJTRV9FWEVDVVRFKSAmJgotCQkJCShzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0JCQkJKHdhbGtfc3RhdGUtPm9wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfQ09ORF9SRUZfT0ZfT1ApKSB8fAorCQkJaWYgKCgoKHdhbGtfc3RhdGUtPgorCQkJICAgICAgIHBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09CisJCQkgICAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpICYmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKQorCQkJICAgICAmJiAod2Fsa19zdGF0ZS0+b3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9CisJCQkJIEFNTF9DT05EX1JFRl9PRl9PUCkpCisJCQkgICAgfHwgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpKSB7CisJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihwYXRoLCBzdGF0dXMpOwogCi0JCQkJKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAocGF0aCwgc3RhdHVzKTsKKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoInNlYXJjaF9ub2RlICVwIHN0YXJ0X25vZGUgJXAgcmV0dXJuX25vZGUgJXBcbiIsCisJCQkJICAgICBzY29wZV9pbmZvLnNjb3BlLm5vZGUsCisJCQkJICAgICBwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUsIG5vZGUpOwogCi0JCQkJYWNwaV9vc19wcmludGYgKCJzZWFyY2hfbm9kZSAlcCBzdGFydF9ub2RlICVwIHJldHVybl9ub2RlICVwXG4iLAotCQkJCQlzY29wZV9pbmZvLnNjb3BlLm5vZGUsIHBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZSwgbm9kZSk7Ci0KLQotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogV2UgZ290IGEgTk9UX0ZPVU5EIGR1cmluZyB0YWJsZSBsb2FkIG9yIHdlIGVuY291bnRlcmVkCiAJCQkJICogYSBjb25kX3JlZl9vZih4KSB3aGVyZSB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0LgpAQCAtMzgxLDEzICszNTgsMTIgQEAKIAkgKiBSZWdhcmRsZXNzIG9mIHN1Y2Nlc3MvZmFpbHVyZSBhYm92ZSwKIAkgKiBKdXN0IGluaXRpYWxpemUgdGhlIE9wIHdpdGggdGhlIHBhdGhuYW1lLgogCSAqLwotCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKKwlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKIAlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcKQEAgLTQwMyw4NyArMzc5LDgxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZykKK2FjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZyhzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAorCQkJICAgIHUzMiBhcmdfdHlwZSwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZykKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgicHNfZ2V0X25leHRfc2ltcGxlX2FyZyIsIGFyZ190eXBlKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJwc19nZXRfbmV4dF9zaW1wbGVfYXJnIiwgYXJnX3R5cGUpOwogCiAJc3dpdGNoIChhcmdfdHlwZSkgewogCWNhc2UgQVJHUF9CWVRFREFUQToKIAotCQlhY3BpX3BzX2luaXRfb3AgKGFyZywgQU1MX0JZVEVfT1ApOwotCQlhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID0gKHUzMikgQUNQSV9HRVQ4IChwYXJzZXJfc3RhdGUtPmFtbCk7CisJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9CWVRFX09QKTsKKwkJYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciA9ICh1MzIpIEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sKys7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfV09SRERBVEE6CiAKLQkJYWNwaV9wc19pbml0X29wIChhcmcsIEFNTF9XT1JEX09QKTsKKwkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX1dPUkRfT1ApOwogCiAJCS8qIEdldCAyIGJ5dGVzIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KIAotCQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBwYXJzZXJfc3RhdGUtPmFtbCk7CisJCUFDUElfTU9WRV8xNl9UT18zMigmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwKKwkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbCk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sICs9IDI7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfRFdPUkREQVRBOgogCi0JCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfRFdPUkRfT1ApOworCQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfRFdPUkRfT1ApOwogCiAJCS8qIEdldCA0IGJ5dGVzIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KIAotCQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBwYXJzZXJfc3RhdGUtPmFtbCk7CisJCUFDUElfTU9WRV8zMl9UT18zMigmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwKKwkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbCk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sICs9IDQ7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfUVdPUkREQVRBOgogCi0JCWFjcGlfcHNfaW5pdF9vcCAoYXJnLCBBTUxfUVdPUkRfT1ApOworCQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfUVdPUkRfT1ApOwogCiAJCS8qIEdldCA4IGJ5dGVzIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KIAotCQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBwYXJzZXJfc3RhdGUtPmFtbCk7CisJCUFDUElfTU9WRV82NF9UT182NCgmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwKKwkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbCk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sICs9IDg7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFSR1BfQ0hBUkxJU1Q6CiAKLQkJYWNwaV9wc19pbml0X29wIChhcmcsIEFNTF9TVFJJTkdfT1ApOwotCQlhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcgPSAoY2hhciAqKSBwYXJzZXJfc3RhdGUtPmFtbDsKKwkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX1NUUklOR19PUCk7CisJCWFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZyA9IChjaGFyICopcGFyc2VyX3N0YXRlLT5hbWw7CiAKLQkJd2hpbGUgKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpICE9ICdcMCcpIHsKKwkJd2hpbGUgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgIT0gJ1wwJykgewogCQkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKIAkJfQogCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX05BTUU6CiAJY2FzZSBBUkdQX05BTUVTVFJJTkc6CiAKLQkJYWNwaV9wc19pbml0X29wIChhcmcsIEFNTF9JTlRfTkFNRVBBVEhfT1ApOwotCQlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0gYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nIChwYXJzZXJfc3RhdGUpOworCQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKKwkJYXJnLT5jb21tb24udmFsdWUubmFtZSA9CisJCSAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcocGFyc2VyX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBhcmdfdHlwZSAlWFxuIiwgYXJnX3R5cGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGFyZ190eXBlICVYXG4iLCBhcmdfdHlwZSkpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X2ZpZWxkCkBAIC00OTYsMjQgKzQ2NiwyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9uZXh0X2ZpZWxkICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCitzdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X25leHRfZmllbGQoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUKKwkJCQkJCSAgICAgICAqcGFyc2VyX3N0YXRlKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29mZnNldCA9ICh1MzIpCi0JCQkgIEFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+YW1sLAotCQkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqZmllbGQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOworCXUzMiBhbWxfb2Zmc2V0ID0gKHUzMikKKwkgICAgQUNQSV9QVFJfRElGRihwYXJzZXJfc3RhdGUtPmFtbCwKKwkJCSAgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaWVsZDsKKwl1MTYgb3Bjb2RlOworCXUzMiBuYW1lOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfZmllbGQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX2dldF9uZXh0X2ZpZWxkIik7CiAKIAkvKiBEZXRlcm1pbmUgZmllbGQgdHlwZSAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSkgeworCXN3aXRjaCAoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSkgewogCWRlZmF1bHQ6CiAKIAkJb3Bjb2RlID0gQU1MX0lOVF9OQU1FREZJRUxEX09QOwpAQCAtNTM0LDkgKzUwMSw5IEBACiAKIAkvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBvcCAqLwogCi0JZmllbGQgPSBhY3BpX3BzX2FsbG9jX29wIChvcGNvZGUpOworCWZpZWxkID0gYWNwaV9wc19hbGxvY19vcChvcGNvZGUpOwogCWlmICghZmllbGQpIHsKLQkJcmV0dXJuX1BUUiAoTlVMTCk7CisJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCiAJZmllbGQtPmNvbW1vbi5hbWxfb2Zmc2V0ID0gYW1sX29mZnNldDsKQEAgLTU0OCwzMyArNTE1LDM0IEBACiAKIAkJLyogR2V0IHRoZSA0LWNoYXJhY3RlciBuYW1lICovCiAKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmbmFtZSwgcGFyc2VyX3N0YXRlLT5hbWwpOwotCQlhY3BpX3BzX3NldF9uYW1lIChmaWVsZCwgbmFtZSk7CisJCUFDUElfTU9WRV8zMl9UT18zMigmbmFtZSwgcGFyc2VyX3N0YXRlLT5hbWwpOworCQlhY3BpX3BzX3NldF9uYW1lKGZpZWxkLCBuYW1lKTsKIAkJcGFyc2VyX3N0YXRlLT5hbWwgKz0gQUNQSV9OQU1FX1NJWkU7CiAKIAkJLyogR2V0IHRoZSBsZW5ndGggd2hpY2ggaXMgZW5jb2RlZCBhcyBhIHBhY2thZ2UgbGVuZ3RoICovCiAKLQkJZmllbGQtPmNvbW1vbi52YWx1ZS5zaXplID0gYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCAocGFyc2VyX3N0YXRlKTsKKwkJZmllbGQtPmNvbW1vbi52YWx1ZS5zaXplID0KKwkJICAgIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgocGFyc2VyX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX0lOVF9SRVNFUlZFREZJRUxEX09QOgogCiAJCS8qIEdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIGVuY29kZWQgYXMgYSBwYWNrYWdlIGxlbmd0aCAqLwogCi0JCWZpZWxkLT5jb21tb24udmFsdWUuc2l6ZSA9IGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKHBhcnNlcl9zdGF0ZSk7CisJCWZpZWxkLT5jb21tb24udmFsdWUuc2l6ZSA9CisJCSAgICBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHBhcnNlcl9zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9JTlRfQUNDRVNTRklFTERfT1A6CiAKIAkJLyoKIAkJICogR2V0IGFjY2Vzc190eXBlIGFuZCBhY2Nlc3NfYXR0cmliIGFuZCBtZXJnZSBpbnRvIHRoZSBmaWVsZCBPcAogCQkgKiBhY2Nlc3NfdHlwZSBpcyBmaXJzdCBvcGVyYW5kLCBhY2Nlc3NfYXR0cmlidXRlIGlzIHNlY29uZAogCQkgKi8KLQkJZmllbGQtPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID0gKEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDgpOworCQlmaWVsZC0+Y29tbW9uLnZhbHVlLmludGVnZXIgPQorCQkgICAgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgPDwgOCk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sKys7Ci0JCWZpZWxkLT5jb21tb24udmFsdWUuaW50ZWdlciB8PSBBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwkJZmllbGQtPmNvbW1vbi52YWx1ZS5pbnRlZ2VyIHw9IEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCk7CiAJCXBhcnNlcl9zdGF0ZS0+YW1sKys7CiAJCWJyZWFrOwogCkBAIC01ODQsMTAgKzU1Miw5IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9QVFIgKGZpZWxkKTsKKwlyZXR1cm5fUFRSKGZpZWxkKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X2FyZwpAQCAtNjA1LDIxICs1NzIsMTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2dldF9uZXh0X2FyZyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqcmV0dXJuX2FyZykKK2FjcGlfcHNfZ2V0X25leHRfYXJnKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJICAgICB1MzIgYXJnX3R5cGUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqcmV0dXJuX2FyZykKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnByZXYgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmZpZWxkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vib3A7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJldiA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmZpZWxkOworCXUzMiBzdWJvcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJwc19nZXRfbmV4dF9hcmciLCBwYXJzZXJfc3RhdGUpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2dldF9uZXh0X2FyZyIsIHBhcnNlcl9zdGF0ZSk7CiAKIAlzd2l0Y2ggKGFyZ190eXBlKSB7CiAJY2FzZSBBUkdQX0JZVEVEQVRBOgpAQCAtNjMxLDM3ICs1OTQsMzUgQEAKIAogCQkvKiBDb25zdGFudHMsIHN0cmluZ3MsIGFuZCBuYW1lc3RyaW5ncyBhcmUgYWxsIHRoZSBzYW1lIHNpemUgKi8KIAotCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wIChBTUxfQllURV9PUCk7CisJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0JZVEVfT1ApOwogCQlpZiAoIWFyZykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KLQkJYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnIChwYXJzZXJfc3RhdGUsIGFyZ190eXBlLCBhcmcpOworCQlhY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcocGFyc2VyX3N0YXRlLCBhcmdfdHlwZSwgYXJnKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9QS0dMRU5HVEg6CiAKIAkJLyogUGFja2FnZSBsZW5ndGgsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAotCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kIChwYXJzZXJfc3RhdGUpOworCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZChwYXJzZXJfc3RhdGUpOwogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX0ZJRUxETElTVDoKIAogCQlpZiAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKIAkJCS8qIE5vbi1lbXB0eSBsaXN0ICovCiAKIAkJCXdoaWxlIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgewotCQkJCWZpZWxkID0gYWNwaV9wc19nZXRfbmV4dF9maWVsZCAocGFyc2VyX3N0YXRlKTsKKwkJCQlmaWVsZCA9IGFjcGlfcHNfZ2V0X25leHRfZmllbGQocGFyc2VyX3N0YXRlKTsKIAkJCQlpZiAoIWZpZWxkKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCQkJfQogCiAJCQkJaWYgKHByZXYpIHsKIAkJCQkJcHJldi0+Y29tbW9uLm5leHQgPSBmaWVsZDsKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJfSBlbHNlIHsKIAkJCQkJYXJnID0gZmllbGQ7CiAJCQkJfQogCQkJCXByZXYgPSBmaWVsZDsKQEAgLTY3MywyMSArNjM0LDIxIEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9CWVRFTElTVDoKIAogCQlpZiAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKIAkJCS8qIE5vbi1lbXB0eSBsaXN0ICovCiAKLQkJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfQllURUxJU1RfT1ApOworCQkJYXJnID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX0JZVEVMSVNUX09QKTsKIAkJCWlmICghYXJnKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQkJfQogCiAJCQkvKiBGaWxsIGluIGJ5dGVsaXN0IGRhdGEgKi8KIAogCQkJYXJnLT5jb21tb24udmFsdWUuc2l6ZSA9ICh1MzIpCi0JCQkJQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5wa2dfZW5kLCBwYXJzZXJfc3RhdGUtPmFtbCk7CisJCQkgICAgQUNQSV9QVFJfRElGRihwYXJzZXJfc3RhdGUtPnBrZ19lbmQsCisJCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWwpOwogCQkJYXJnLT5uYW1lZC5kYXRhID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAKIAkJCS8qIFNraXAgdG8gRW5kIG9mIGJ5dGUgZGF0YSAqLwpAQCAtNjk2LDMyICs2NTcsMzEgQEAKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBUkdQX1RBUkdFVDoKIAljYXNlIEFSR1BfU1VQRVJOQU1FOgogCWNhc2UgQVJHUF9TSU1QTEVOQU1FOgogCi0JCXN1Ym9wID0gYWNwaV9wc19wZWVrX29wY29kZSAocGFyc2VyX3N0YXRlKTsKLQkJaWYgKHN1Ym9wID09IDAgICAgICAgICAgICAgICAgICB8fAotCQkJYWNwaV9wc19pc19sZWFkaW5nX2NoYXIgKHN1Ym9wKSB8fAotCQkJYWNwaV9wc19pc19wcmVmaXhfY2hhciAoc3Vib3ApKSB7CisJCXN1Ym9wID0gYWNwaV9wc19wZWVrX29wY29kZShwYXJzZXJfc3RhdGUpOworCQlpZiAoc3Vib3AgPT0gMCB8fAorCQkgICAgYWNwaV9wc19pc19sZWFkaW5nX2NoYXIoc3Vib3ApIHx8CisJCSAgICBhY3BpX3BzX2lzX3ByZWZpeF9jaGFyKHN1Ym9wKSkgewogCQkJLyogbnVsbF9uYW1lIG9yIG5hbWVfc3RyaW5nICovCiAKLQkJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfTkFNRVBBVEhfT1ApOworCQkJYXJnID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX05BTUVQQVRIX09QKTsKIAkJCWlmICghYXJnKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsIGFyZywgMCk7Ci0JCX0KLQkJZWxzZSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgod2Fsa19zdGF0ZSwgcGFyc2VyX3N0YXRlLAorCQkJCQkJICAgICAgYXJnLCAwKTsKKwkJfSBlbHNlIHsKIAkJCS8qIFNpbmdsZSBjb21wbGV4IGFyZ3VtZW50LCBub3RoaW5nIHJldHVybmVkICovCiAKIAkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDE7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9EQVRBT0JKOgogCWNhc2UgQVJHUF9URVJNQVJHOgogCkBAIC03MzAsNyArNjkwLDYgQEAKIAkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQVJHUF9EQVRBT0JKTElTVDoKIAljYXNlIEFSR1BfVEVSTUxJU1Q6CiAJY2FzZSBBUkdQX09CSkxJU1Q6CkBAIC03NDIsMTQgKzcwMSwxMyBAQAogCQl9CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgYXJnX3R5cGU6ICVYXG4iLCBhcmdfdHlwZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgYXJnX3R5cGU6ICVYXG4iLCBhcmdfdHlwZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlicmVhazsKIAl9CiAKIAkqcmV0dXJuX2FyZyA9IGFyZzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzbG9vcC5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2xvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODhkMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2xvb3AuYwpAQCAtMCwwICsxLDg3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBwc2xvb3AgLSBNYWluIEFNTCBwYXJzZSBsb29wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisvKgorICogUGFyc2UgdGhlIEFNTCBhbmQgYnVpbGQgYW4gb3BlcmF0aW9uIHRyZWUgYXMgbW9zdCBpbnRlcnByZXRlcnMsCisgKiBsaWtlIFBlcmwsIGRvLiAgUGFyc2luZyBpcyBkb25lIGJ5IGhhbmQgcmF0aGVyIHRoYW4gd2l0aCBhIFlBQ0MKKyAqIGdlbmVyYXRlZCBwYXJzZXIgdG8gdGlnaHRseSBjb25zdHJhaW4gc3RhY2sgYW5kIGR5bmFtaWMgbWVtb3J5CisgKiB1c2FnZS4gIEF0IHRoZSBzYW1lIHRpbWUsIHBhcnNpbmcgaXMga2VwdCBmbGV4aWJsZSBhbmQgdGhlIGNvZGUKKyAqIGZhaXJseSBjb21wYWN0IGJ5IHBhcnNpbmcgYmFzZWQgb24gYSBsaXN0IG9mIEFNTCBvcGNvZGUKKyAqIHRlbXBsYXRlcyBpbiBhbWxfb3BfaW5mb1tdCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KKyNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CisjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgorQUNQSV9NT0RVTEVfTkFNRSgicHNsb29wIikKKworc3RhdGljIHUzMiBhY3BpX2dibF9kZXB0aCA9IDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfbG9vcAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUGFyc2UgQU1MIChwb2ludGVkIHRvIGJ5IHRoZSBjdXJyZW50IHBhcnNlciBzdGF0ZSkgYW5kIHJldHVybgorICogICAgICAgICAgICAgIGEgdHJlZSBvZiBvcHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9wc19wYXJzZV9sb29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzMjsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AgPSBOVUxMOwkvKiBjdXJyZW50IG9wICovCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZV9vcCA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZTsKKwl1OCAqYW1sX29wX3N0YXJ0ID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19wYXJzZV9sb29wIiwgd2Fsa19zdGF0ZSk7CisKKwlpZiAod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9PSBOVUxMKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlwYXJzZXJfc3RhdGUgPSAmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlOworCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IDA7CisKKyNpZiAoIWRlZmluZWQgKEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTikgJiYgIWRlZmluZWQgKEFDUElfQ09OU1RBTlRfRVZBTF9PTkxZKSkKKworCWlmICh3YWxrX3N0YXRlLT53YWxrX3R5cGUgJiBBQ1BJX1dBTEtfTUVUSE9EX1JFU1RBUlQpIHsKKwkJLyogV2UgYXJlIHJlc3RhcnRpbmcgYSBwcmVlbXB0ZWQgY29udHJvbCBtZXRob2QgKi8KKworCQlpZiAoYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHBhcnNlcl9zdGF0ZSkpIHsKKwkJCS8qCisJCQkgKiBXZSBtdXN0IGNoZWNrIGlmIGEgcHJlZGljYXRlIHRvIGFuIElGIG9yIFdISUxFIHN0YXRlbWVudAorCQkJICogd2FzIGp1c3QgY29tcGxldGVkCisJCQkgKi8KKwkJCWlmICgocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3ApICYmCisJCQkgICAgKChwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5vcC0+Y29tbW9uLgorCQkJICAgICAgYW1sX29wY29kZSA9PSBBTUxfSUZfT1ApCisJCQkgICAgIHx8IChwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5vcC0+Y29tbW9uLgorCQkJCSBhbWxfb3Bjb2RlID09IEFNTF9XSElMRV9PUCkpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQorCQkJCUFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKSkgeworCQkJCS8qCisJCQkJICogQSBwcmVkaWNhdGUgd2FzIGp1c3QgY29tcGxldGVkLCBnZXQgdGhlIHZhbHVlIG9mIHRoZQorCQkJCSAqIHByZWRpY2F0ZSBhbmQgYnJhbmNoIGJhc2VkIG9uIHRoYXQgdmFsdWUKKwkJCQkgKi8KKwkJCQl3YWxrX3N0YXRlLT5vcCA9IE5VTEw7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlKHdhbGtfc3RhdGUsCisJCQkJCQkJCUFDUElfVE9fUE9JTlRFUgorCQkJCQkJCQkoVFJVRSkpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKQorCQkJCSAgICAmJiAoKHN0YXR1cyAmIEFFX0NPREVfTUFTSykgIT0KKwkJCQkJQUVfQ09ERV9DT05UUk9MKSkgeworCQkJCQlpZiAoc3RhdHVzID09IEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpIHsKKwkJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCQkJCSAgIkludm9rZWQgbWV0aG9kIGRpZCBub3QgcmV0dXJuIGEgdmFsdWUsICVzXG4iLAorCQkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgorCQkJCQkJCQkgIChzdGF0dXMpKSk7CisKKwkJCQkJfQorCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJCSAgImdldF9wcmVkaWNhdGUgRmFpbGVkLCAlc1xuIiwKKwkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgorCQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAorCQkJCQkJCSAgICAgc3RhdHVzKTsKKwkJCX0KKworCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCSAgIlBvcHBlZCBzY29wZSwgT3A9JXBcbiIsIG9wKSk7CisJCX0gZWxzZSBpZiAod2Fsa19zdGF0ZS0+cHJldl9vcCkgeworCQkJLyogV2Ugd2VyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIG9wICovCisKKwkJCW9wID0gd2Fsa19zdGF0ZS0+cHJldl9vcDsKKwkJCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IHdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBJdGVyYXRpdmUgcGFyc2luZyBsb29wLCB3aGlsZSB0aGVyZSBpcyBtb3JlIEFNTCB0byBwcm9jZXNzOiAqLworCisJd2hpbGUgKChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+YW1sX2VuZCkgfHwgKG9wKSkgeworCQlhbWxfb3Bfc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKKwkJaWYgKCFvcCkgeworCQkJLyogR2V0IHRoZSBuZXh0IG9wY29kZSBmcm9tIHRoZSBBTUwgc3RyZWFtICovCisKKwkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPQorCQkJICAgICh1MzIpIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5hbWwsCisJCQkJCQlwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CisJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBhY3BpX3BzX3BlZWtfb3Bjb2RlKHBhcnNlcl9zdGF0ZSk7CisKKwkJCS8qCisJCQkgKiBGaXJzdCBjdXQgdG8gZGV0ZXJtaW5lIHdoYXQgd2UgaGF2ZSBmb3VuZDoKKwkJCSAqIDEpIEEgdmFsaWQgQU1MIG9wY29kZQorCQkJICogMikgQSBuYW1lIHN0cmluZworCQkJICogMykgQW4gdW5rbm93bi9pbnZhbGlkIG9wY29kZQorCQkJICovCisJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KKwkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQkJc3dpdGNoICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcykgeworCQkJY2FzZSBBTUxfQ0xBU1NfQVNDSUk6CisJCQljYXNlIEFNTF9DTEFTU19QUkVGSVg6CisJCQkJLyoKKwkJCQkgKiBTdGFydHMgd2l0aCBhIHZhbGlkIHByZWZpeCBvciBBU0NJSSBjaGFyLCB0aGlzIGlzIGEgbmFtZQorCQkJCSAqIHN0cmluZy4gIENvbnZlcnQgdGhlIGJhcmUgbmFtZSBzdHJpbmcgdG8gYSBuYW1lcGF0aC4KKwkJCQkgKi8KKwkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBBTUxfSU5UX05BTUVQQVRIX09QOworCQkJCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IEFSR1BfTkFNRVNUUklORzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBTUxfQ0xBU1NfVU5LTk9XTjoKKworCQkJCS8qIFRoZSBvcGNvZGUgaXMgdW5yZWNvZ25pemVkLiAgSnVzdCBza2lwIHVua25vd24gb3Bjb2RlcyAqLworCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkZvdW5kIHVua25vd24gb3Bjb2RlICVYIGF0IEFNTCBhZGRyZXNzICVwIG9mZnNldCAlWCwgaWdub3JpbmdcbiIsCisJCQkJCQkgIHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWwsCisJCQkJCQkgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQpKTsKKworCQkJCUFDUElfRFVNUF9CVUZGRVIocGFyc2VyX3N0YXRlLT5hbWwsIDEyOCk7CisKKwkJCQkvKiBBc3N1bWUgb25lLWJ5dGUgYmFkIG9wY29kZSAqLworCisJCQkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKKwkJCQljb250aW51ZTsKKworCQkJZGVmYXVsdDoKKworCQkJCS8qIEZvdW5kIG9wY29kZSBpbmZvLCB0aGlzIGlzIGEgbm9ybWFsIG9wY29kZSAqLworCisJCQkJcGFyc2VyX3N0YXRlLT5hbWwgKz0KKwkJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5wYXJzZV9hcmdzOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDcmVhdGUgT3Agc3RydWN0dXJlIGFuZCBhcHBlbmQgdG8gcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLworCisJCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKKwkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBwcmVfb3AgaWYgbmVjZXNzYXJ5ICovCisKKwkJCQlpZiAoIXByZV9vcCkgeworCQkJCQlwcmVfb3AgPQorCQkJCQkgICAgYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgIG9wY29kZSk7CisJCQkJCWlmICghcHJlX29wKSB7CisJCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlwcmVfb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBOVUxMOworCQkJCXByZV9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPSB3YWxrX3N0YXRlLT5vcGNvZGU7CisKKwkJCQkvKgorCQkJCSAqIEdldCBhbmQgYXBwZW5kIGFyZ3VtZW50cyB1bnRpbCB3ZSBmaW5kIHRoZSBub2RlIHRoYXQgY29udGFpbnMKKwkJCQkgKiB0aGUgbmFtZSAodGhlIHR5cGUgQVJHUF9OQU1FKS4KKwkJCQkgKi8KKwkJCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUKKwkJCQkgICAgICAgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykKKwkJCQkgICAgICAgJiYKKwkJCQkgICAgICAgKEdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJCSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICE9IEFSR1BfTkFNRSkpIHsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfYXJnKHdhbGtfc3RhdGUsCisJCQkJCQkJCSBwYXJzZXJfc3RhdGUsCisJCQkJCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRQorCQkJCQkJCQkgKHdhbGtfc3RhdGUtPgorCQkJCQkJCQkgIGFyZ190eXBlcyksCisJCQkJCQkJCSAmYXJnKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJCX0KKworCQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcocHJlX29wLCBhcmcpOworCQkJCQlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgYXJnX3R5cGVzKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGZvdW5kIGEgTkFNRSBhbmQgZGlkbid0IHJ1biBvdXQgb2YKKwkJCQkgKiBhcmd1bWVudHMKKwkJCQkgKi8KKwkJCQlpZiAoIUdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJICAgICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpKSB7CisJCQkJCXN0YXR1cyA9IEFFX0FNTF9OT19PUEVSQU5EOworCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJfQorCisJCQkJLyogV2Uga25vdyB0aGF0IHRoaXMgYXJnIGlzIGEgbmFtZSwgbW92ZSB0byBuZXh0IGFyZyAqLworCisJCQkJSU5DUkVNRU5UX0FSR19MSVNUKHdhbGtfc3RhdGUtPmFyZ190eXBlcyk7CisKKwkJCQkvKgorCQkJCSAqIEZpbmQgdGhlIG9iamVjdC4gIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bworCQkJCSAqIHRoZSBuYW1lc3BhY2Ugb3Igc2ltcGx5IGxvb2sgaXQgdXAKKwkJCQkgKi8KKwkJCQl3YWxrX3N0YXRlLT5vcCA9IE5VTEw7CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUsCisJCQkJCQkJCSAgICAmb3ApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJCSAgIkR1cmluZyBuYW1lIGxvb2t1cC9jYXRhbG9nLCAlc1xuIiwKKwkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgorCQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCX0KKworCQkJCWlmICghb3ApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAorCQkJCQkJCSAgICAgc3RhdHVzKTsKKwkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCX0KKworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJfQorCisJCQkJYWNwaV9wc19hcHBlbmRfYXJnKG9wLAorCQkJCQkJICAgcHJlX29wLT5jb21tb24udmFsdWUuYXJnKTsKKwkJCQlhY3BpX2dibF9kZXB0aCsrOworCisJCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7CisJCQkJCS8qCisJCQkJCSAqIERlZmVyIGZpbmFsIHBhcnNpbmcgb2YgYW4gb3BlcmF0aW9uX3JlZ2lvbiBib2R5LAorCQkJCQkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MKKwkJCQkJICogdG8gcGFyc2UgaXQgY29ycmVjdGx5IChpLmUuLCB0aGVyZSBtYXkgYmUgbWV0aG9kCisJCQkJCSAqIGNhbGxzIHdpdGhpbiB0aGUgdGVybV9hcmcgZWxlbWVudHMgb2YgdGhlIGJvZHkuKQorCQkJCQkgKgorCQkJCQkgKiBIb3dldmVyLCB3ZSBtdXN0IGNvbnRpbnVlIHBhcnNpbmcgYmVjYXVzZQorCQkJCQkgKiB0aGUgb3ByZWdpb24gaXMgbm90IGEgc3RhbmRhbG9uZSBwYWNrYWdlIC0tCisJCQkJCSAqIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGVuZCBpcyBhdCB0aGlzIHBvaW50LgorCQkJCQkgKgorCQkJCQkgKiAoTGVuZ3RoIGlzIHVua25vd24gdW50aWwgcGFyc2Ugb2YgdGhlIGJvZHkgY29tcGxldGUpCisJCQkJCSAqLworCQkJCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKKwkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBOb3QgYSBuYW1lZCBvcGNvZGUsIGp1c3QgYWxsb2NhdGUgT3AgYW5kIGFwcGVuZCB0byBwYXJlbnQgKi8KKworCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQkJCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQkJCWlmICghb3ApIHsKKwkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJfQorCisJCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0NSRUFURSkgeworCQkJCQkvKgorCQkJCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbgorCQkJCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5CisJCQkJCSAqLworCQkJCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKKwkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9IDA7CisJCQkJfQorCisJCQkJYWNwaV9wc19hcHBlbmRfYXJnKGFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZQorCQkJCQkJICAgKHBhcnNlcl9zdGF0ZSksIG9wKTsKKworCQkJCWlmICgod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSkgeworCQkJCQkvKgorCQkJCQkgKiBGaW5kIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bworCQkJCQkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCisJCQkJCSAqLworCQkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOworCisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICB3YWxrX3N0YXRlLT4KKwkJCQkJICAgIGRlc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSwKKwkJCQkJCQkJJm9wKTsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLAorCQkJCQkJCQkgICAgIG9wLAorCQkJCQkJCQkgICAgIHN0YXR1cyk7CisJCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CisJCQkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQkJfQorCisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlvcC0+Y29tbW9uLmFtbF9vZmZzZXQgPSB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0OworCisJCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mbykgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCQkgICJPcGNvZGUgJTQuNFggWyVzXSBPcCAlcCBBbWwgJXAgYW1sX29mZnNldCAlNS41WFxuIiwKKwkJCQkJCSAgKHUzMikgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLCBvcCwKKwkJCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWwsCisJCQkJCQkgIG9wLT5jb21tb24uYW1sX29mZnNldCkpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogU3RhcnQgYXJnX2NvdW50IGF0IHplcm8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZQorCQkgKiBhbnkgYXJncyB5ZXQKKwkJICovCisJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisKKwkJLyogQXJlIHRoZXJlIGFueSBhcmd1bWVudHMgdGhhdCBtdXN0IGJlIHByb2Nlc3NlZD8gKi8KKworCQlpZiAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSB7CisJCQkvKiBHZXQgYXJndW1lbnRzICovCisKKwkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJCQljYXNlIEFNTF9CWVRFX09QOgkvKiBBTUxfQllURURBVEFfQVJHICovCisJCQljYXNlIEFNTF9XT1JEX09QOgkvKiBBTUxfV09SRERBVEFfQVJHICovCisJCQljYXNlIEFNTF9EV09SRF9PUDoJLyogQU1MX0RXT1JEQVRBX0FSRyAqLworCQkJY2FzZSBBTUxfUVdPUkRfT1A6CS8qIEFNTF9RV09SREFUQV9BUkcgKi8KKwkJCWNhc2UgQU1MX1NUUklOR19PUDoJLyogQU1MX0FTQ0lJQ0hBUkxJU1RfQVJHICovCisKKwkJCQkvKiBGaWxsIGluIGNvbnN0YW50IG9yIHN0cmluZyBhcmd1bWVudCBkaXJlY3RseSAqLworCisJCQkJYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnKHBhcnNlcl9zdGF0ZSwKKwkJCQkJCQkgICAgR0VUX0NVUlJFTlRfQVJHX1RZUEUKKwkJCQkJCQkgICAgKHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgICAgYXJnX3R5cGVzKSwgb3ApOworCQkJCWJyZWFrOworCisJCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6CS8qIEFNTF9OQU1FU1RSSU5HX0FSRyAqLworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCh3YWxrX3N0YXRlLAorCQkJCQkJCSAgICAgIHBhcnNlcl9zdGF0ZSwgb3AsCisJCQkJCQkJICAgICAgMSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQl9CisKKwkJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qCisJCQkJICogT3AgaXMgbm90IGEgY29uc3RhbnQgb3Igc3RyaW5nLCBhcHBlbmQgZWFjaCBhcmd1bWVudAorCQkJCSAqIHRvIHRoZSBPcAorCQkJCSAqLworCQkJCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRQorCQkJCSAgICAgICAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKQorCQkJCSAgICAgICAmJiAhd2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7CisJCQkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKQorCQkJCQkgICAgQUNQSV9QVFJfRElGRihwYXJzZXJfc3RhdGUtPmFtbCwKKwkJCQkJCQkgIHBhcnNlcl9zdGF0ZS0+CisJCQkJCQkJICBhbWxfc3RhcnQpOworCisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX3BzX2dldF9uZXh0X2FyZyh3YWxrX3N0YXRlLAorCQkJCQkJCQkgcGFyc2VyX3N0YXRlLAorCQkJCQkJCQkgR0VUX0NVUlJFTlRfQVJHX1RZUEUKKwkJCQkJCQkJICh3YWxrX3N0YXRlLT4KKwkJCQkJCQkJICBhcmdfdHlwZXMpLAorCQkJCQkJCQkgJmFyZyk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCQl9CisKKwkJCQkJaWYgKGFyZykgeworCQkJCQkJYXJnLT5jb21tb24uYW1sX29mZnNldCA9CisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+YW1sX29mZnNldDsKKwkJCQkJCWFjcGlfcHNfYXBwZW5kX2FyZyhvcCwgYXJnKTsKKwkJCQkJfQorCQkJCQlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgYXJnX3R5cGVzKTsKKwkJCQl9CisKKwkJCQkvKiBTcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGNlcnRhaW4gb3Bjb2RlcyAqLworCisJCQkJLyogVEJEIChyZW1vdmUpOiBUZW1wb3JhcnkgbWVjaGFuaXNtIHRvIGRpc2FibGUgdGhpcyBjb2RlIGlmIG5lZWRlZCAqLworCisjaWZkZWYgQUNQSV9FTkFCTEVfTU9EVUxFX0xFVkVMX0NPREUKKworCQkJCWlmICgod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0KKwkJCQkgICAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSkKKwkJCQkgICAgJiYKKwkJCQkgICAgKCh3YWxrX3N0YXRlLT4KKwkJCQkgICAgICBwYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfRElTQVNTRU1CTEUpID09CisJCQkJICAgICAwKSkgeworCQkJCQkvKgorCQkJCQkgKiBXZSB3YW50IHRvIHNraXAgSWYvRWxzZS9XaGlsZSBjb25zdHJ1Y3RzIGR1cmluZyBQYXNzMQorCQkJCQkgKiBiZWNhdXNlIHdlIHdhbnQgdG8gYWN0dWFsbHkgY29uZGl0aW9uYWxseSBleGVjdXRlIHRoZQorCQkJCQkgKiBjb2RlIGR1cmluZyBQYXNzMi4KKwkJCQkJICoKKwkJCQkJICogRXhjZXB0IGZvciBkaXNhc3NlbWJseSwgd2hlcmUgd2UgYWx3YXlzIHdhbnQgdG8KKwkJCQkJICogd2FsayB0aGUgSWYvRWxzZS9XaGlsZSBwYWNrYWdlcworCQkJCQkgKi8KKwkJCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwkJCQkJY2FzZSBBTUxfSUZfT1A6CisJCQkJCWNhc2UgQU1MX0VMU0VfT1A6CisJCQkJCWNhc2UgQU1MX1dISUxFX09QOgorCisJCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCQkJCQkgICJQYXNzMTogU2tpcHBpbmcgYW4gSWYvRWxzZS9XaGlsZSBib2R5XG4iKSk7CisKKwkJCQkJCS8qIFNraXAgYm9keSBvZiBpZi9lbHNlL3doaWxlIGluIHBhc3MgMSAqLworCisJCQkJCQlwYXJzZXJfc3RhdGUtPmFtbCA9CisJCQkJCQkgICAgcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCQkJCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJCQkJY2FzZSBBTUxfTUVUSE9EX09QOgorCisJCQkJCS8qCisJCQkJCSAqIFNraXAgcGFyc2luZyBvZiBjb250cm9sIG1ldGhvZAorCQkJCQkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MKKwkJCQkJICogdG8gcGFyc2UgaXQgY29ycmVjdGx5LgorCQkJCQkgKgorCQkJCQkgKiBTYXZlIHRoZSBsZW5ndGggYW5kIGFkZHJlc3Mgb2YgdGhlIGJvZHkKKwkJCQkJICovCisJCQkJCW9wLT5uYW1lZC5kYXRhID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJCQkJCW9wLT5uYW1lZC5sZW5ndGggPQorCQkJCQkgICAgKHUzMikgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCAtCisJCQkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbCk7CisKKwkJCQkJLyogU2tpcCBib2R5IG9mIG1ldGhvZCAqLworCisJCQkJCXBhcnNlcl9zdGF0ZS0+YW1sID0KKwkJCQkJICAgIHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKKwkJCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFNTF9CVUZGRVJfT1A6CisJCQkJY2FzZSBBTUxfUEFDS0FHRV9PUDoKKwkJCQljYXNlIEFNTF9WQVJfUEFDS0FHRV9PUDoKKworCQkJCQlpZiAoKG9wLT5jb21tb24ucGFyZW50KSAmJgorCQkJCQkgICAgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uCisJCQkJCSAgICAgYW1sX29wY29kZSA9PSBBTUxfTkFNRV9PUCkKKwkJCQkJICAgICYmICh3YWxrX3N0YXRlLT5wYXNzX251bWJlciA8PQorCQkJCQkJQUNQSV9JTU9ERV9MT0FEX1BBU1MyKSkgeworCQkJCQkJLyoKKwkJCQkJCSAqIFNraXAgcGFyc2luZyBvZiBCdWZmZXJzIGFuZCBQYWNrYWdlcworCQkJCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCisJCQkJCQkgKiB0byBwYXJzZSB0aGVtIGNvcnJlY3RseS4KKwkJCQkJCSAqLworCQkJCQkJb3AtPm5hbWVkLmRhdGEgPSBhbWxfb3Bfc3RhcnQ7CisJCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0KKwkJCQkJCSAgICAodTMyKSAocGFyc2VyX3N0YXRlLT4KKwkJCQkJCQkgICBwa2dfZW5kIC0KKwkJCQkJCQkgICBhbWxfb3Bfc3RhcnQpOworCisJCQkJCQkvKiBTa2lwIGJvZHkgKi8KKworCQkJCQkJcGFyc2VyX3N0YXRlLT5hbWwgPQorCQkJCQkJICAgIHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKKwkJCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFNTF9XSElMRV9PUDoKKworCQkJCQlpZiAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgeworCQkJCQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+CisJCQkJCQkgICAgY29udHJvbC5wYWNrYWdlX2VuZCA9CisJCQkJCQkgICAgcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKworCQkJCQkvKiBObyBhY3Rpb24gZm9yIGFsbCBvdGhlciBvcGNvZGVzICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIGZvciBhcmd1bWVudHMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZCAqLworCisJCWlmICh3YWxrX3N0YXRlLT5hcmdfY291bnQpIHsKKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgYXJndW1lbnRzIChjb21wbGV4IG9uZXMpLCBwdXNoIE9wIGFuZAorCQkJICogcHJlcGFyZSBmb3IgYXJndW1lbnQKKwkJCSAqLworCQkJc3RhdHVzID0gYWNwaV9wc19wdXNoX3Njb3BlKHBhcnNlcl9zdGF0ZSwgb3AsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQl9CisJCQlvcCA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAtLSBPcCBpcyBjb21wbGV0ZSwKKwkJICogcHJlcGFyZSBmb3IgbmV4dAorCQkgKi8KKwkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKKwkJCWlmIChhY3BpX2dibF9kZXB0aCkgeworCQkJCWFjcGlfZ2JsX2RlcHRoLS07CisJCQl9CisKKwkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgeworCQkJCS8qCisJCQkJICogU2tpcCBwYXJzaW5nIG9mIGNvbnRyb2wgbWV0aG9kIG9yIG9wcmVnaW9uIGJvZHksCisJCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCisJCQkJICogdG8gcGFyc2UgdGhlbSBjb3JyZWN0bHkuCisJCQkJICoKKwkJCQkgKiBDb21wbGV0ZWQgcGFyc2luZyBhbiBvcF9yZWdpb24gZGVjbGFyYXRpb24sIHdlIG5vdworCQkJCSAqIGtub3cgdGhlIGxlbmd0aC4KKwkJCQkgKi8KKwkJCQlvcC0+bmFtZWQubGVuZ3RoID0KKwkJCQkgICAgKHUzMikgKHBhcnNlcl9zdGF0ZS0+YW1sIC0gb3AtPm5hbWVkLmRhdGEpOworCQkJfQorCQl9CisKKwkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0NSRUFURSkgeworCQkJLyoKKwkJCSAqIEJhY2t1cCB0byBiZWdpbm5pbmcgb2YgY3JlYXRlX3hYWGZpZWxkIGRlY2xhcmF0aW9uICgxIGZvcgorCQkJICogT3Bjb2RlKQorCQkJICoKKwkJCSAqIGJvZHlfbGVuZ3RoIGlzIHVua25vd24gdW50aWwgd2UgcGFyc2UgdGhlIGJvZHkKKwkJCSAqLworCQkJb3AtPm5hbWVkLmxlbmd0aCA9CisJCQkgICAgKHUzMikgKHBhcnNlcl9zdGF0ZS0+YW1sIC0gb3AtPm5hbWVkLmRhdGEpOworCQl9CisKKwkJLyogVGhpcyBvcCBjb21wbGV0ZSwgbm90aWZ5IHRoZSBkaXNwYXRjaGVyICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSB7CisJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOworCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOworCisJCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CisJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJfQorCQl9CisKKwkgICAgICBjbG9zZV90aGlzX29wOgorCQkvKgorCQkgKiBGaW5pc2hlZCBvbmUgYXJndW1lbnQgb2YgdGhlIGNvbnRhaW5pbmcgc2NvcGUKKwkJICovCisJCXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudC0tOworCisJCS8qIEZpbmlzaGVkIHdpdGggcHJlX29wICovCisKKwkJaWYgKHByZV9vcCkgeworCQkJYWNwaV9wc19mcmVlX29wKHByZV9vcCk7CisJCQlwcmVfb3AgPSBOVUxMOworCQl9CisKKwkJLyogQ2xvc2UgdGhpcyBPcCAod2lsbCByZXN1bHQgaW4gcGFyc2Ugc3VidHJlZSBkZWxldGlvbikgKi8KKworCQlzdGF0dXMyID0gYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsIG9wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQl9CisJCW9wID0gTlVMTDsKKworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIEFFX09LOgorCQkJYnJlYWs7CisKKwkJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgorCisJCQkvKiBXZSBhcmUgYWJvdXQgdG8gdHJhbnNmZXIgdG8gYSBjYWxsZWQgbWV0aG9kLiAqLworCisJCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7CisJCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisJCWNhc2UgQUVfQ1RSTF9FTkQ6CisKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwkJCWlmIChvcCkgeworCQkJCXdhbGtfc3RhdGUtPm9wID0gb3A7CisJCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uCisJCQkJCQkJICAgIGFtbF9vcGNvZGUpOworCQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsCisJCQkJCQkJICAgICBzdGF0dXMpOworCisJCQkJc3RhdHVzMiA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCBvcCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CisJCQkJfQorCQkJCW9wID0gTlVMTDsKKwkJCX0KKwkJCXN0YXR1cyA9IEFFX09LOworCQkJYnJlYWs7CisKKwkJY2FzZSBBRV9DVFJMX0JSRUFLOgorCQljYXNlIEFFX0NUUkxfQ09OVElOVUU6CisKKwkJCS8qIFBvcCBvZmYgc2NvcGVzIHVudGlsIHdlIGZpbmQgdGhlIFdoaWxlICovCisKKwkJCXdoaWxlICghb3AgfHwgKG9wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfV0hJTEVfT1ApKSB7CisJCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCisJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQkJfQorCisJCQkvKiBDbG9zZSB0aGlzIGl0ZXJhdGlvbiBvZiB0aGUgV2hpbGUgbG9vcCAqLworCisJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOworCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKKwkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKworCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7CisKKwkJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCX0KKwkJCW9wID0gTlVMTDsKKworCQkJc3RhdHVzID0gQUVfT0s7CisJCQlicmVhazsKKworCQljYXNlIEFFX0NUUkxfVEVSTUlOQVRFOgorCisJCQlzdGF0dXMgPSBBRV9PSzsKKworCQkJLyogQ2xlYW4gdXAgKi8KKwkJCWRvIHsKKwkJCQlpZiAob3ApIHsKKwkJCQkJc3RhdHVzMiA9CisJCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICAgICBvcCk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKKwkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwkJCX0gd2hpbGUgKG9wKTsKKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisKKwkJZGVmYXVsdDoJLyogQWxsIG90aGVyIG5vbi1BRV9PSyBzdGF0dXMgKi8KKworCQkJZG8geworCQkJCWlmIChvcCkgeworCQkJCQlzdGF0dXMyID0KKwkJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLAorCQkJCQkJCQkgICAgIG9wKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJCQl9CisJCQkJfQorCQkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAorCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKworCQkJfSB3aGlsZSAob3ApOworCisJCQkvKgorCQkJICogVEJEOiBDbGVhbnVwIHBhcnNlIG9wcyBvbiBlcnJvcgorCQkJICovCisjaWYgMAorCQkJaWYgKG9wID09IE5VTEwpIHsKKwkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKKwkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisJCQl9CisjZW5kaWYKKwkJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBvcDsKKwkJCXdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+YXJnX3R5cGVzOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBUaGlzIHNjb3BlIGNvbXBsZXRlPyAqLworCisJCWlmIChhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUocGFyc2VyX3N0YXRlKSkgeworCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCSAgIlBvcHBlZCBzY29wZSwgT3A9JXBcbiIsIG9wKSk7CisJCX0gZWxzZSB7CisJCQlvcCA9IE5VTEw7CisJCX0KKworCX0JCQkvKiB3aGlsZSBwYXJzZXJfc3RhdGUtPkFtbCAqLworCisJLyoKKwkgKiBDb21wbGV0ZSB0aGUgbGFzdCBPcCAoaWYgbm90IGNvbXBsZXRlZCksIGFuZCBjbGVhciB0aGUgc2NvcGUgc3RhY2suCisJICogSXQgaXMgZWFzaWx5IHBvc3NpYmxlIHRvIGVuZCBhbiBBTUwgInBhY2thZ2UiIHdpdGggYW4gdW5ib3VuZGVkIG51bWJlcgorCSAqIG9mIG9wZW4gc2NvcGVzIChzdWNoIGFzIHdoZW4gc2V2ZXJhbCBBU0wgYmxvY2tzIGFyZSBjbG9zZWQgd2l0aAorCSAqIHNlcXVlbnRpYWwgY2xvc2luZyBicmFjZXMpLiAgV2Ugd2FudCB0byB0ZXJtaW5hdGUgZWFjaCBvbmUgY2xlYW5seS4KKwkgKi8KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiQU1MIHBhY2thZ2UgY29tcGxldGUgYXQgT3AgJXBcbiIsCisJCQkgIG9wKSk7CisJZG8geworCQlpZiAob3ApIHsKKwkJCWlmICh3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkgeworCQkJCXdhbGtfc3RhdGUtPm9wID0gb3A7CisJCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uCisJCQkJCQkJICAgIGFtbF9vcGNvZGUpOworCQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsCisJCQkJCQkJICAgICBzdGF0dXMpOworCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CisJCQkJCXN0YXR1cyA9IEFFX09LOworCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7CisJCQkJfQorCisJCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RFUk1JTkFURSkgeworCQkJCQlzdGF0dXMgPSBBRV9PSzsKKworCQkJCQkvKiBDbGVhbiB1cCAqLworCQkJCQlkbyB7CisJCQkJCQlpZiAob3ApIHsKKwkJCQkJCQlzdGF0dXMyID0KKwkJCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wCisJCQkJCQkJICAgICh3YWxrX3N0YXRlLCBvcCk7CisJCQkJCQkJaWYgKEFDUElfRkFJTFVSRQorCQkJCQkJCSAgICAoc3RhdHVzMikpIHsKKwkJCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJCQkJCSAgICAoc3RhdHVzMik7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsCisJCQkJCQkJCSAgJm9wLAorCQkJCQkJCQkgICZ3YWxrX3N0YXRlLT4KKwkJCQkJCQkJICBhcmdfdHlwZXMsCisJCQkJCQkJCSAgJndhbGtfc3RhdGUtPgorCQkJCQkJCQkgIGFyZ19jb3VudCk7CisKKwkJCQkJfSB3aGlsZSAob3ApOworCisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCS8qIEZpcnN0IGVycm9yIGlzIG1vc3QgaW1wb3J0YW50ICovCisKKwkJCQkJKHZvaWQpCisJCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICAgICBvcCk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKwkJCX0KKworCQkJc3RhdHVzMiA9IGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCBvcCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJfQorCQl9CisKKwkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKworCX0gd2hpbGUgKG9wKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCmluZGV4IDU3NDQ2NzMuLjIyOWFlODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKQEAgLTQxLDE2ICs0MSwxMyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2Fjb3Bjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc29wY29kZSIpCi0KK0FDUElfTU9EVUxFX05BTUUoInBzb3Bjb2RlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02Miw3ICs1OSw2IEBACiAgKiAgICAgICAgICAgICAgdGhlIG9wZXJhbmQgdHlwZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAvKgogICogU3VtbWFyeSBvZiBvcGNvZGUgdHlwZXMvZmxhZ3MKICAqCkBAIC0xODAsMTU2ICsxNzYsNDY4IEBACiAJQU1MX0NSRUFURV9RV09SRF9GSUVMRF9PUAogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KIC8qCiAgKiBNYXN0ZXIgT3Bjb2RlIGluZm9ybWF0aW9uIHRhYmxlLiAgQSBzdW1tYXJ5IG9mIGV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCBlYWNoCiAgKiBvcGNvZGUsIGFsbCBpbiBvbmUgcGxhY2UuCiAgKi8KLWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgICBhY3BpX2dibF9hbWxfb3BfaW5mb1tBTUxfTlVNX09QQ09ERVNdID0KLXsKK2NvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvIGFjcGlfZ2JsX2FtbF9vcF9pbmZvW0FNTF9OVU1fT1BDT0RFU10gPSB7CiAvKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAqLwogLyogSW5kZXggICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgIFBhcnNlciBBcmdzICAgICAgICAgICAgICAgSW50ZXJwcmV0ZXIgQXJncyAgICAgICAgICAgICAgICBPYmplY3RUeXBlICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgRmxhZ3MgKi8KIAotLyogMDAgKi8gQUNQSV9PUCAoIlplcm8iLCAgICAgICAgICAgICAgIEFSR1BfWkVST19PUCwgICAgICAgICAgICAgIEFSR0lfWkVST19PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfSU5URUdFUiwgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0NPTlNUQU5ULCAgICAgICAgQU1MX0NPTlNUQU5UKSwKLS8qIDAxICovIEFDUElfT1AgKCJPbmUiLCAgICAgICAgICAgICAgICBBUkdQX09ORV9PUCwgICAgICAgICAgICAgICBBUkdJX09ORV9PUCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9DT05TVEFOVCwgICAgICAgIEFNTF9DT05TVEFOVCksCi0vKiAwMiAqLyBBQ1BJX09QICgiQWxpYXMiLCAgICAgICAgICAgICAgQVJHUF9BTElBU19PUCwgICAgICAgICAgICAgQVJHSV9BTElBU19PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9BTElBUywgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfU0lNUExFLCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDAzICovIEFDUElfT1AgKCJOYW1lIiwgICAgICAgICAgICAgICBBUkdQX05BTUVfT1AsICAgICAgICAgICAgICBBUkdJX05BTUVfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9DT01QTEVYLCAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogMDQgKi8gQUNQSV9PUCAoIkJ5dGVDb25zdCIsICAgICAgICAgIEFSR1BfQllURV9PUCwgICAgICAgICAgICAgIEFSR0lfQllURV9PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfSU5URUdFUiwgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xJVEVSQUwsICAgICAgICAgQU1MX0NPTlNUQU5UKSwKLS8qIDA1ICovIEFDUElfT1AgKCJXb3JkQ29uc3QiLCAgICAgICAgICBBUkdQX1dPUkRfT1AsICAgICAgICAgICAgICBBUkdJX1dPUkRfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MSVRFUkFMLCAgICAgICAgIEFNTF9DT05TVEFOVCksCi0vKiAwNiAqLyBBQ1BJX09QICgiRHdvcmRDb25zdCIsICAgICAgICAgQVJHUF9EV09SRF9PUCwgICAgICAgICAgICAgQVJHSV9EV09SRF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9JTlRFR0VSLCAgICAgICAgICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTElURVJBTCwgICAgICAgICBBTUxfQ09OU1RBTlQpLAotLyogMDcgKi8gQUNQSV9PUCAoIlN0cmluZyIsICAgICAgICAgICAgIEFSR1BfU1RSSU5HX09QLCAgICAgICAgICAgIEFSR0lfU1RSSU5HX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfU1RSSU5HLCAgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xJVEVSQUwsICAgICAgICAgQU1MX0NPTlNUQU5UKSwKLS8qIDA4ICovIEFDUElfT1AgKCJTY29wZSIsICAgICAgICAgICAgICBBUkdQX1NDT1BFX09QLCAgICAgICAgICAgICBBUkdJX1NDT1BFX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9OT19PQkosICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogMDkgKi8gQUNQSV9PUCAoIkJ1ZmZlciIsICAgICAgICAgICAgIEFSR1BfQlVGRkVSX09QLCAgICAgICAgICAgIEFSR0lfQlVGRkVSX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQlVGRkVSLCAgICAgICAgICAgIEFNTF9DTEFTU19DUkVBVEUsICAgICAgICAgIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1QsICAgQU1MX0hBU19BUkdTIHwgQU1MX0RFRkVSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDBBICovIEFDUElfT1AgKCJQYWNrYWdlIiwgICAgICAgICAgICBBUkdQX1BBQ0tBR0VfT1AsICAgICAgICAgICBBUkdJX1BBQ0tBR0VfT1AsICAgICAgICAgICAgQUNQSV9UWVBFX1BBQ0tBR0UsICAgICAgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfT0JKRUNULCAgIEFNTF9IQVNfQVJHUyB8IEFNTF9ERUZFUiB8IEFNTF9DT05TVEFOVCksCi0vKiAwQiAqLyBBQ1BJX09QICgiTWV0aG9kIiwgICAgICAgICAgICAgQVJHUF9NRVRIT0RfT1AsICAgICAgICAgICAgQVJHSV9NRVRIT0RfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9NRVRIT0QsICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfQ09NUExFWCwgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEIHwgQU1MX0RFRkVSKSwKLS8qIDBDICovIEFDUElfT1AgKCJMb2NhbDAiLCAgICAgICAgICAgICBBUkdQX0xPQ0FMMCwgICAgICAgICAgICAgICBBUkdJX0xPQ0FMMCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgIDApLAotLyogMEQgKi8gQUNQSV9PUCAoIkxvY2FsMSIsICAgICAgICAgICAgIEFSR1BfTE9DQUwxLCAgICAgICAgICAgICAgIEFSR0lfTE9DQUwxLCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAgMCksCi0vKiAwRSAqLyBBQ1BJX09QICgiTG9jYWwyIiwgICAgICAgICAgICAgQVJHUF9MT0NBTDIsICAgICAgICAgICAgICAgQVJHSV9MT0NBTDIsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsICAwKSwKLS8qIDBGICovIEFDUElfT1AgKCJMb2NhbDMiLCAgICAgICAgICAgICBBUkdQX0xPQ0FMMywgICAgICAgICAgICAgICBBUkdJX0xPQ0FMMywgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgIDApLAotLyogMTAgKi8gQUNQSV9PUCAoIkxvY2FsNCIsICAgICAgICAgICAgIEFSR1BfTE9DQUw0LCAgICAgICAgICAgICAgIEFSR0lfTE9DQUw0LCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAgMCksCi0vKiAxMSAqLyBBQ1BJX09QICgiTG9jYWw1IiwgICAgICAgICAgICAgQVJHUF9MT0NBTDUsICAgICAgICAgICAgICAgQVJHSV9MT0NBTDUsICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsICAwKSwKLS8qIDEyICovIEFDUElfT1AgKCJMb2NhbDYiLCAgICAgICAgICAgICBBUkdQX0xPQ0FMNiwgICAgICAgICAgICAgICBBUkdJX0xPQ0FMNiwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgIDApLAotLyogMTMgKi8gQUNQSV9PUCAoIkxvY2FsNyIsICAgICAgICAgICAgIEFSR1BfTE9DQUw3LCAgICAgICAgICAgICAgIEFSR0lfTE9DQUw3LCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAgMCksCi0vKiAxNCAqLyBBQ1BJX09QICgiQXJnMCIsICAgICAgICAgICAgICAgQVJHUF9BUkcwLCAgICAgICAgICAgICAgICAgQVJHSV9BUkcwLCAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDE1ICovIEFDUElfT1AgKCJBcmcxIiwgICAgICAgICAgICAgICBBUkdQX0FSRzEsICAgICAgICAgICAgICAgICBBUkdJX0FSRzEsICAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMTYgKi8gQUNQSV9PUCAoIkFyZzIiLCAgICAgICAgICAgICAgIEFSR1BfQVJHMiwgICAgICAgICAgICAgICAgIEFSR0lfQVJHMiwgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxNyAqLyBBQ1BJX09QICgiQXJnMyIsICAgICAgICAgICAgICAgQVJHUF9BUkczLCAgICAgICAgICAgICAgICAgQVJHSV9BUkczLCAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDE4ICovIEFDUElfT1AgKCJBcmc0IiwgICAgICAgICAgICAgICBBUkdQX0FSRzQsICAgICAgICAgICAgICAgICBBUkdJX0FSRzQsICAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMTkgKi8gQUNQSV9PUCAoIkFyZzUiLCAgICAgICAgICAgICAgIEFSR1BfQVJHNSwgICAgICAgICAgICAgICAgIEFSR0lfQVJHNSwgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxQSAqLyBBQ1BJX09QICgiQXJnNiIsICAgICAgICAgICAgICAgQVJHUF9BUkc2LCAgICAgICAgICAgICAgICAgQVJHSV9BUkc2LCAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDFCICovIEFDUElfT1AgKCJTdG9yZSIsICAgICAgICAgICAgICBBUkdQX1NUT1JFX09QLCAgICAgICAgICAgICBBUkdJX1NUT1JFX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSKSwKLS8qIDFDICovIEFDUElfT1AgKCJSZWZPZiIsICAgICAgICAgICAgICBBUkdQX1JFRl9PRl9PUCwgICAgICAgICAgICBBUkdJX1JFRl9PRl9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSKSwKLS8qIDFEICovIEFDUElfT1AgKCJBZGQiLCAgICAgICAgICAgICAgICBBUkdQX0FERF9PUCwgICAgICAgICAgICAgICBBUkdJX0FERF9PUCwgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMUUgKi8gQUNQSV9PUCAoIkNvbmNhdGVuYXRlIiwgICAgICAgIEFSR1BfQ09OQ0FUX09QLCAgICAgICAgICAgIEFSR0lfQ09OQ0FUX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMUYgKi8gQUNQSV9PUCAoIlN1YnRyYWN0IiwgICAgICAgICAgIEFSR1BfU1VCVFJBQ1RfT1AsICAgICAgICAgIEFSR0lfU1VCVFJBQ1RfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyMCAqLyBBQ1BJX09QICgiSW5jcmVtZW50IiwgICAgICAgICAgQVJHUF9JTkNSRU1FTlRfT1AsICAgICAgICAgQVJHSV9JTkNSRU1FTlRfT1AsICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyMSAqLyBBQ1BJX09QICgiRGVjcmVtZW50IiwgICAgICAgICAgQVJHUF9ERUNSRU1FTlRfT1AsICAgICAgICAgQVJHSV9ERUNSRU1FTlRfT1AsICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyMiAqLyBBQ1BJX09QICgiTXVsdGlwbHkiLCAgICAgICAgICAgQVJHUF9NVUxUSVBMWV9PUCwgICAgICAgICAgQVJHSV9NVUxUSVBMWV9PUCwgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDIzICovIEFDUElfT1AgKCJEaXZpZGUiLCAgICAgICAgICAgICBBUkdQX0RJVklERV9PUCwgICAgICAgICAgICBBUkdJX0RJVklERV9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzJUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzJUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI0ICovIEFDUElfT1AgKCJTaGlmdExlZnQiLCAgICAgICAgICBBUkdQX1NISUZUX0xFRlRfT1AsICAgICAgICBBUkdJX1NISUZUX0xFRlRfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjUgKi8gQUNQSV9PUCAoIlNoaWZ0UmlnaHQiLCAgICAgICAgIEFSR1BfU0hJRlRfUklHSFRfT1AsICAgICAgIEFSR0lfU0hJRlRfUklHSFRfT1AsICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyNiAqLyBBQ1BJX09QICgiQW5kIiwgICAgICAgICAgICAgICAgQVJHUF9CSVRfQU5EX09QLCAgICAgICAgICAgQVJHSV9CSVRfQU5EX09QLCAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI3ICovIEFDUElfT1AgKCJOQW5kIiwgICAgICAgICAgICAgICBBUkdQX0JJVF9OQU5EX09QLCAgICAgICAgICBBUkdJX0JJVF9OQU5EX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjggKi8gQUNQSV9PUCAoIk9yIiwgICAgICAgICAgICAgICAgIEFSR1BfQklUX09SX09QLCAgICAgICAgICAgIEFSR0lfQklUX09SX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyOSAqLyBBQ1BJX09QICgiTk9yIiwgICAgICAgICAgICAgICAgQVJHUF9CSVRfTk9SX09QLCAgICAgICAgICAgQVJHSV9CSVRfTk9SX09QLCAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJBICovIEFDUElfT1AgKCJYT3IiLCAgICAgICAgICAgICAgICBBUkdQX0JJVF9YT1JfT1AsICAgICAgICAgICBBUkdJX0JJVF9YT1JfT1AsICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMkIgKi8gQUNQSV9PUCAoIk5vdCIsICAgICAgICAgICAgICAgIEFSR1BfQklUX05PVF9PUCwgICAgICAgICAgIEFSR0lfQklUX05PVF9PUCwgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMkMgKi8gQUNQSV9PUCAoIkZpbmRTZXRMZWZ0Qml0IiwgICAgIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AsIEFSR0lfRklORF9TRVRfTEVGVF9CSVRfT1AsICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMkQgKi8gQUNQSV9PUCAoIkZpbmRTZXRSaWdodEJpdCIsICAgIEFSR1BfRklORF9TRVRfUklHSFRfQklUX09QLEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QLCBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMkUgKi8gQUNQSV9PUCAoIkRlcmVmT2YiLCAgICAgICAgICAgIEFSR1BfREVSRUZfT0ZfT1AsICAgICAgICAgIEFSR0lfREVSRUZfT0ZfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAotLyogMkYgKi8gQUNQSV9PUCAoIk5vdGlmeSIsICAgICAgICAgICAgIEFSR1BfTk9USUZZX09QLCAgICAgICAgICAgIEFSR0lfTk9USUZZX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMFIpLAotLyogMzAgKi8gQUNQSV9PUCAoIlNpemVPZiIsICAgICAgICAgICAgIEFSR1BfU0laRV9PRl9PUCwgICAgICAgICAgIEFSR0lfU0laRV9PRl9PUCwgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgfCBBTUxfTk9fT1BFUkFORF9SRVNPTFZFKSwKLS8qIDMxICovIEFDUElfT1AgKCJJbmRleCIsICAgICAgICAgICAgICBBUkdQX0lOREVYX09QLCAgICAgICAgICAgICBBUkdJX0lOREVYX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSKSwKLS8qIDMyICovIEFDUElfT1AgKCJNYXRjaCIsICAgICAgICAgICAgICBBUkdQX01BVENIX09QLCAgICAgICAgICAgICBBUkdJX01BVENIX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzZBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzZBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDMzICovIEFDUElfT1AgKCJDcmVhdGVEV29yZEZpZWxkIiwgICBBUkdQX0NSRUFURV9EV09SRF9GSUVMRF9PUCxBUkdJX0NSRUFURV9EV09SRF9GSUVMRF9PUCwgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfRklFTEQsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfCBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDM0ICovIEFDUElfT1AgKCJDcmVhdGVXb3JkRmllbGQiLCAgICBBUkdQX0NSRUFURV9XT1JEX0ZJRUxEX09QLCBBUkdJX0NSRUFURV9XT1JEX0ZJRUxEX09QLCAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfRklFTEQsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfCBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDM1ICovIEFDUElfT1AgKCJDcmVhdGVCeXRlRmllbGQiLCAgICBBUkdQX0NSRUFURV9CWVRFX0ZJRUxEX09QLCBBUkdJX0NSRUFURV9CWVRFX0ZJRUxEX09QLCAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfRklFTEQsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfCBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDM2ICovIEFDUElfT1AgKCJDcmVhdGVCaXRGaWVsZCIsICAgICBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AsICBBUkdJX0NSRUFURV9CSVRfRklFTERfT1AsICAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgICAgICBBTUxfQ0xBU1NfQ1JFQVRFLCAgICAgICAgICBBTUxfVFlQRV9DUkVBVEVfRklFTEQsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfCBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDM3ICovIEFDUElfT1AgKCJPYmplY3RUeXBlIiwgICAgICAgICBBUkdQX1RZUEVfT1AsICAgICAgICAgICAgICBBUkdJX1RZUEVfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX05PX09QRVJBTkRfUkVTT0xWRSksCi0vKiAzOCAqLyBBQ1BJX09QICgiTEFuZCIsICAgICAgICAgICAgICAgQVJHUF9MQU5EX09QLCAgICAgICAgICAgICAgQVJHSV9MQU5EX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMX05VTUVSSUMgfCBBTUxfQ09OU1RBTlQpLAotLyogMzkgKi8gQUNQSV9PUCAoIkxPciIsICAgICAgICAgICAgICAgIEFSR1BfTE9SX09QLCAgICAgICAgICAgICAgIEFSR0lfTE9SX09QLCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTF9OVU1FUklDIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDNBICovIEFDUElfT1AgKCJMTm90IiwgICAgICAgICAgICAgICBBUkdQX0xOT1RfT1AsICAgICAgICAgICAgICBBUkdJX0xOT1RfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDNCICovIEFDUElfT1AgKCJMRXF1YWwiLCAgICAgICAgICAgICBBUkdQX0xFUVVBTF9PUCwgICAgICAgICAgICBBUkdJX0xFUVVBTF9PUCwgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfRVhFQ1VURSwgICAgICAgICBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLCAgIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAotLyogM0MgKi8gQUNQSV9PUCAoIkxHcmVhdGVyIiwgICAgICAgICAgIEFSR1BfTEdSRUFURVJfT1AsICAgICAgICAgIEFSR0lfTEdSRUFURVJfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCi0vKiAzRCAqLyBBQ1BJX09QICgiTExlc3MiLCAgICAgICAgICAgICAgQVJHUF9MTEVTU19PUCwgICAgICAgICAgICAgQVJHSV9MTEVTU19PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDNFICovIEFDUElfT1AgKCJJZiIsICAgICAgICAgICAgICAgICBBUkdQX0lGX09QLCAgICAgICAgICAgICAgICBBUkdJX0lGX09QLCAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIEFNTF9IQVNfQVJHUyksCi0vKiAzRiAqLyBBQ1BJX09QICgiRWxzZSIsICAgICAgICAgICAgICAgQVJHUF9FTFNFX09QLCAgICAgICAgICAgICAgQVJHSV9FTFNFX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0NPTlRST0wsICAgICAgICAgQU1MX1RZUEVfQ09OVFJPTCwgICAgICAgICBBTUxfSEFTX0FSR1MpLAotLyogNDAgKi8gQUNQSV9PUCAoIldoaWxlIiwgICAgICAgICAgICAgIEFSR1BfV0hJTEVfT1AsICAgICAgICAgICAgIEFSR0lfV0hJTEVfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19DT05UUk9MLCAgICAgICAgIEFNTF9UWVBFX0NPTlRST0wsICAgICAgICAgQU1MX0hBU19BUkdTKSwKLS8qIDQxICovIEFDUElfT1AgKCJOb29wIiwgICAgICAgICAgICAgICBBUkdQX05PT1BfT1AsICAgICAgICAgICAgICBBUkdJX05PT1BfT1AsICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIDApLAotLyogNDIgKi8gQUNQSV9PUCAoIlJldHVybiIsICAgICAgICAgICAgIEFSR1BfUkVUVVJOX09QLCAgICAgICAgICAgIEFSR0lfUkVUVVJOX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19DT05UUk9MLCAgICAgICAgIEFNTF9UWVBFX0NPTlRST0wsICAgICAgICAgQU1MX0hBU19BUkdTKSwKLS8qIDQzICovIEFDUElfT1AgKCJCcmVhayIsICAgICAgICAgICAgICBBUkdQX0JSRUFLX09QLCAgICAgICAgICAgICBBUkdJX0JSRUFLX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfQ09OVFJPTCwgICAgICAgICBBTUxfVFlQRV9DT05UUk9MLCAgICAgICAgIDApLAotLyogNDQgKi8gQUNQSV9PUCAoIkJyZWFrUG9pbnQiLCAgICAgICAgIEFSR1BfQlJFQUtfUE9JTlRfT1AsICAgICAgIEFSR0lfQlJFQUtfUE9JTlRfT1AsICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19DT05UUk9MLCAgICAgICAgIEFNTF9UWVBFX0NPTlRST0wsICAgICAgICAgMCksCi0vKiA0NSAqLyBBQ1BJX09QICgiT25lcyIsICAgICAgICAgICAgICAgQVJHUF9PTkVTX09QLCAgICAgICAgICAgICAgQVJHSV9PTkVTX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9JTlRFR0VSLCAgICAgICAgICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfQ09OU1RBTlQsICAgICAgICBBTUxfQ09OU1RBTlQpLAorLyogMDAgKi8gQUNQSV9PUCgiWmVybyIsIEFSR1BfWkVST19PUCwgQVJHSV9aRVJPX09QLCBBQ1BJX1RZUEVfSU5URUdFUiwKKwkJCSBBTUxfQ0xBU1NfQVJHVU1FTlQsIEFNTF9UWVBFX0NPTlNUQU5ULCBBTUxfQ09OU1RBTlQpLAorLyogMDEgKi8gQUNQSV9PUCgiT25lIiwgQVJHUF9PTkVfT1AsIEFSR0lfT05FX09QLCBBQ1BJX1RZUEVfSU5URUdFUiwKKwkJCSBBTUxfQ0xBU1NfQVJHVU1FTlQsIEFNTF9UWVBFX0NPTlNUQU5ULCBBTUxfQ09OU1RBTlQpLAorLyogMDIgKi8gQUNQSV9PUCgiQWxpYXMiLCBBUkdQX0FMSUFTX09QLCBBUkdJX0FMSUFTX09QLAorCQkJIEFDUElfVFlQRV9MT0NBTF9BTElBUywgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDAzICovIEFDUElfT1AoIk5hbWUiLCBBUkdQX05BTUVfT1AsIEFSR0lfTkFNRV9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9DT01QTEVYLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiAwNCAqLyBBQ1BJX09QKCJCeXRlQ29uc3QiLCBBUkdQX0JZVEVfT1AsIEFSR0lfQllURV9PUCwKKwkJCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCisvKiAwNSAqLyBBQ1BJX09QKCJXb3JkQ29uc3QiLCBBUkdQX1dPUkRfT1AsIEFSR0lfV09SRF9PUCwKKwkJCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCisvKiAwNiAqLyBBQ1BJX09QKCJEd29yZENvbnN0IiwgQVJHUF9EV09SRF9PUCwgQVJHSV9EV09SRF9PUCwKKwkJCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCisvKiAwNyAqLyBBQ1BJX09QKCJTdHJpbmciLCBBUkdQX1NUUklOR19PUCwgQVJHSV9TVFJJTkdfT1AsCisJCQkgQUNQSV9UWVBFX1NUUklORywgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCisvKiAwOCAqLyBBQ1BJX09QKCJTY29wZSIsIEFSR1BfU0NPUEVfT1AsIEFSR0lfU0NPUEVfT1AsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkJIEFNTF9UWVBFX05BTUVEX05PX09CSiwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogMDkgKi8gQUNQSV9PUCgiQnVmZmVyIiwgQVJHUF9CVUZGRVJfT1AsIEFSR0lfQlVGRkVSX09QLAorCQkJIEFDUElfVFlQRV9CVUZGRVIsIEFNTF9DTEFTU19DUkVBVEUsCisJCQkgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMEEgKi8gQUNQSV9PUCgiUGFja2FnZSIsIEFSR1BfUEFDS0FHRV9PUCwgQVJHSV9QQUNLQUdFX09QLAorCQkJIEFDUElfVFlQRV9QQUNLQUdFLCBBTUxfQ0xBU1NfQ1JFQVRFLAorCQkJIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1QsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX0RFRkVSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDBCICovIEFDUElfT1AoIk1ldGhvZCIsIEFSR1BfTUVUSE9EX09QLCBBUkdJX01FVEhPRF9PUCwKKwkJCSBBQ1BJX1RZUEVfTUVUSE9ELCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkJIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEIHwgQU1MX0RFRkVSKSwKKy8qIDBDICovIEFDUElfT1AoIkxvY2FsMCIsIEFSR1BfTE9DQUwwLCBBUkdJX0xPQ0FMMCwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsIDApLAorLyogMEQgKi8gQUNQSV9PUCgiTG9jYWwxIiwgQVJHUF9MT0NBTDEsIEFSR0lfTE9DQUwxLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAwRSAqLyBBQ1BJX09QKCJMb2NhbDIiLCBBUkdQX0xPQ0FMMiwgQVJHSV9MT0NBTDIsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAwKSwKKy8qIDBGICovIEFDUElfT1AoIkxvY2FsMyIsIEFSR1BfTE9DQUwzLCBBUkdJX0xPQ0FMMywKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsIDApLAorLyogMTAgKi8gQUNQSV9PUCgiTG9jYWw0IiwgQVJHUF9MT0NBTDQsIEFSR0lfTE9DQUw0LAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxMSAqLyBBQ1BJX09QKCJMb2NhbDUiLCBBUkdQX0xPQ0FMNSwgQVJHSV9MT0NBTDUsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFLCAwKSwKKy8qIDEyICovIEFDUElfT1AoIkxvY2FsNiIsIEFSR1BfTE9DQUw2LCBBUkdJX0xPQ0FMNiwKKwkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEUsIDApLAorLyogMTMgKi8gQUNQSV9PUCgiTG9jYWw3IiwgQVJHUF9MT0NBTDcsIEFSR0lfTE9DQUw3LAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxNCAqLyBBQ1BJX09QKCJBcmcwIiwgQVJHUF9BUkcwLCBBUkdJX0FSRzAsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxNSAqLyBBQ1BJX09QKCJBcmcxIiwgQVJHUF9BUkcxLCBBUkdJX0FSRzEsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxNiAqLyBBQ1BJX09QKCJBcmcyIiwgQVJHUF9BUkcyLCBBUkdJX0FSRzIsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxNyAqLyBBQ1BJX09QKCJBcmczIiwgQVJHUF9BUkczLCBBUkdJX0FSRzMsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxOCAqLyBBQ1BJX09QKCJBcmc0IiwgQVJHUF9BUkc0LCBBUkdJX0FSRzQsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxOSAqLyBBQ1BJX09QKCJBcmc1IiwgQVJHUF9BUkc1LCBBUkdJX0FSRzUsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxQSAqLyBBQ1BJX09QKCJBcmc2IiwgQVJHUF9BUkc2LCBBUkdJX0FSRzYsCisJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxQiAqLyBBQ1BJX09QKCJTdG9yZSIsIEFSR1BfU1RPUkVfT1AsIEFSR0lfU1RPUkVfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIpLAorLyogMUMgKi8gQUNQSV9PUCgiUmVmT2YiLCBBUkdQX1JFRl9PRl9PUCwgQVJHSV9SRUZfT0ZfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAorLyogMUQgKi8gQUNQSV9PUCgiQWRkIiwgQVJHUF9BRERfT1AsIEFSR0lfQUREX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMUUgKi8gQUNQSV9PUCgiQ29uY2F0ZW5hdGUiLCBBUkdQX0NPTkNBVF9PUCwgQVJHSV9DT05DQVRfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAxRiAqLyBBQ1BJX09QKCJTdWJ0cmFjdCIsIEFSR1BfU1VCVFJBQ1RfT1AsIEFSR0lfU1VCVFJBQ1RfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDIwICovIEFDUElfT1AoIkluY3JlbWVudCIsIEFSR1BfSU5DUkVNRU5UX09QLCBBUkdJX0lOQ1JFTUVOVF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDIxICovIEFDUElfT1AoIkRlY3JlbWVudCIsIEFSR1BfREVDUkVNRU5UX09QLCBBUkdJX0RFQ1JFTUVOVF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDIyICovIEFDUElfT1AoIk11bHRpcGx5IiwgQVJHUF9NVUxUSVBMWV9PUCwgQVJHSV9NVUxUSVBMWV9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMjMgKi8gQUNQSV9PUCgiRGl2aWRlIiwgQVJHUF9ESVZJREVfT1AsIEFSR0lfRElWSURFX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMlRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMlRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMjQgKi8gQUNQSV9PUCgiU2hpZnRMZWZ0IiwgQVJHUF9TSElGVF9MRUZUX09QLCBBUkdJX1NISUZUX0xFRlRfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI1ICovIEFDUElfT1AoIlNoaWZ0UmlnaHQiLCBBUkdQX1NISUZUX1JJR0hUX09QLCBBUkdJX1NISUZUX1JJR0hUX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyNiAqLyBBQ1BJX09QKCJBbmQiLCBBUkdQX0JJVF9BTkRfT1AsIEFSR0lfQklUX0FORF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI3ICovIEFDUElfT1AoIk5BbmQiLCBBUkdQX0JJVF9OQU5EX09QLCBBUkdJX0JJVF9OQU5EX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyOCAqLyBBQ1BJX09QKCJPciIsIEFSR1BfQklUX09SX09QLCBBUkdJX0JJVF9PUl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI5ICovIEFDUElfT1AoIk5PciIsIEFSR1BfQklUX05PUl9PUCwgQVJHSV9CSVRfTk9SX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMkEgKi8gQUNQSV9PUCgiWE9yIiwgQVJHUF9CSVRfWE9SX09QLCBBUkdJX0JJVF9YT1JfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyQiAqLyBBQ1BJX09QKCJOb3QiLCBBUkdQX0JJVF9OT1RfT1AsIEFSR0lfQklUX05PVF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyQyAqLyBBQ1BJX09QKCJGaW5kU2V0TGVmdEJpdCIsIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AsCisJCQkgQVJHSV9GSU5EX1NFVF9MRUZUX0JJVF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyRCAqLyBBQ1BJX09QKCJGaW5kU2V0UmlnaHRCaXQiLCBBUkdQX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCwKKwkJCSBBUkdJX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyRSAqLyBBQ1BJX09QKCJEZXJlZk9mIiwgQVJHUF9ERVJFRl9PRl9PUCwgQVJHSV9ERVJFRl9PRl9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiksCisvKiAyRiAqLyBBQ1BJX09QKCJOb3RpZnkiLCBBUkdQX05PVElGWV9PUCwgQVJHSV9OT1RJRllfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8wVF8wUiwgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMFIpLAorLyogMzAgKi8gQUNQSV9PUCgiU2l6ZU9mIiwgQVJHUF9TSVpFX09GX09QLCBBUkdJX1NJWkVfT0ZfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9OT19PUEVSQU5EX1JFU09MVkUpLAorLyogMzEgKi8gQUNQSV9PUCgiSW5kZXgiLCBBUkdQX0lOREVYX09QLCBBUkdJX0lOREVYX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSKSwKKy8qIDMyICovIEFDUElfT1AoIk1hdGNoIiwgQVJHUF9NQVRDSF9PUCwgQVJHSV9NQVRDSF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ182QV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ182QV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAzMyAqLyBBQ1BJX09QKCJDcmVhdGVEV29yZEZpZWxkIiwgQVJHUF9DUkVBVEVfRFdPUkRfRklFTERfT1AsCisJCQkgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgQU1MX0NMQVNTX0NSRUFURSwKKwkJCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCQkgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCisvKiAzNCAqLyBBQ1BJX09QKCJDcmVhdGVXb3JkRmllbGQiLCBBUkdQX0NSRUFURV9XT1JEX0ZJRUxEX09QLAorCQkJIEFSR0lfQ1JFQVRFX1dPUkRfRklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgQU1MX0NMQVNTX0NSRUFURSwKKwkJCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCQkgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCisvKiAzNSAqLyBBQ1BJX09QKCJDcmVhdGVCeXRlRmllbGQiLCBBUkdQX0NSRUFURV9CWVRFX0ZJRUxEX09QLAorCQkJIEFSR0lfQ1JFQVRFX0JZVEVfRklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgQU1MX0NMQVNTX0NSRUFURSwKKwkJCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCQkgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCisvKiAzNiAqLyBBQ1BJX09QKCJDcmVhdGVCaXRGaWVsZCIsIEFSR1BfQ1JFQVRFX0JJVF9GSUVMRF9PUCwKKwkJCSBBUkdJX0NSRUFURV9CSVRfRklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgQU1MX0NMQVNTX0NSRUFURSwKKwkJCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCQkgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCisvKiAzNyAqLyBBQ1BJX09QKCJPYmplY3RUeXBlIiwgQVJHUF9UWVBFX09QLCBBUkdJX1RZUEVfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9OT19PUEVSQU5EX1JFU09MVkUpLAorLyogMzggKi8gQUNQSV9PUCgiTEFuZCIsIEFSR1BfTEFORF9PUCwgQVJHSV9MQU5EX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUxfTlVNRVJJQyB8CisJCQkgQU1MX0NPTlNUQU5UKSwKKy8qIDM5ICovIEFDUElfT1AoIkxPciIsIEFSR1BfTE9SX09QLCBBUkdJX0xPUl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMX05VTUVSSUMgfAorCQkJIEFNTF9DT05TVEFOVCksCisvKiAzQSAqLyBBQ1BJX09QKCJMTm90IiwgQVJHUF9MTk9UX09QLCBBUkdJX0xOT1RfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogM0IgKi8gQUNQSV9PUCgiTEVxdWFsIiwgQVJHUF9MRVFVQUxfT1AsIEFSR0lfTEVRVUFMX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMFRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCisvKiAzQyAqLyBBQ1BJX09QKCJMR3JlYXRlciIsIEFSR1BfTEdSRUFURVJfT1AsIEFSR0lfTEdSRUFURVJfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDNEICovIEFDUElfT1AoIkxMZXNzIiwgQVJHUF9MTEVTU19PUCwgQVJHSV9MTEVTU19PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiB8IEFNTF9MT0dJQ0FMIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDNFICovIEFDUElfT1AoIklmIiwgQVJHUF9JRl9PUCwgQVJHSV9JRl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgQU1MX0hBU19BUkdTKSwKKy8qIDNGICovIEFDUElfT1AoIkVsc2UiLCBBUkdQX0VMU0VfT1AsIEFSR0lfRUxTRV9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgQU1MX0hBU19BUkdTKSwKKy8qIDQwICovIEFDUElfT1AoIldoaWxlIiwgQVJHUF9XSElMRV9PUCwgQVJHSV9XSElMRV9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgQU1MX0hBU19BUkdTKSwKKy8qIDQxICovIEFDUElfT1AoIk5vb3AiLCBBUkdQX05PT1BfT1AsIEFSR0lfTk9PUF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgMCksCisvKiA0MiAqLyBBQ1BJX09QKCJSZXR1cm4iLCBBUkdQX1JFVFVSTl9PUCwgQVJHSV9SRVRVUk5fT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0NPTlRST0wsCisJCQkgQU1MX1RZUEVfQ09OVFJPTCwgQU1MX0hBU19BUkdTKSwKKy8qIDQzICovIEFDUElfT1AoIkJyZWFrIiwgQVJHUF9CUkVBS19PUCwgQVJHSV9CUkVBS19PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgMCksCisvKiA0NCAqLyBBQ1BJX09QKCJCcmVha1BvaW50IiwgQVJHUF9CUkVBS19QT0lOVF9PUCwgQVJHSV9CUkVBS19QT0lOVF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgMCksCisvKiA0NSAqLyBBQ1BJX09QKCJPbmVzIiwgQVJHUF9PTkVTX09QLCBBUkdJX09ORVNfT1AsIEFDUElfVFlQRV9JTlRFR0VSLAorCQkJIEFNTF9DTEFTU19BUkdVTUVOVCwgQU1MX1RZUEVfQ09OU1RBTlQsIEFNTF9DT05TVEFOVCksCiAKIC8qIFByZWZpeGVkIG9wY29kZXMgKFR3by1ieXRlIG9wY29kZXMgd2l0aCBhIHByZWZpeCBvcCkgKi8KIAotLyogNDYgKi8gQUNQSV9PUCAoIk11dGV4IiwgICAgICAgICAgICAgIEFSR1BfTVVURVhfT1AsICAgICAgICAgICAgIEFSR0lfTVVURVhfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfTVVURVgsICAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA0NyAqLyBBQ1BJX09QICgiRXZlbnQiLCAgICAgICAgICAgICAgQVJHUF9FVkVOVF9PUCwgICAgICAgICAgICAgQVJHSV9FVkVOVF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9FVkVOVCwgICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfU0lNUExFLCAgICBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEICksCi0vKiA0OCAqLyBBQ1BJX09QICgiQ29uZFJlZk9mIiwgICAgICAgICAgQVJHUF9DT05EX1JFRl9PRl9PUCwgICAgICAgQVJHSV9DT05EX1JFRl9PRl9PUCwgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCi0vKiA0OSAqLyBBQ1BJX09QICgiQ3JlYXRlRmllbGQiLCAgICAgICAgQVJHUF9DUkVBVEVfRklFTERfT1AsICAgICAgQVJHSV9DUkVBVEVfRklFTERfT1AsICAgICAgIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwgQU1MX0RFRkVSIHwgQU1MX0ZJRUxEIHwgQU1MX0NSRUFURSksCi0vKiA0QSAqLyBBQ1BJX09QICgiTG9hZCIsICAgICAgICAgICAgICAgQVJHUF9MT0FEX09QLCAgICAgICAgICAgICAgQVJHSV9MT0FEX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8xVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8xVF8wUiksCi0vKiA0QiAqLyBBQ1BJX09QICgiU3RhbGwiLCAgICAgICAgICAgICAgQVJHUF9TVEFMTF9PUCwgICAgICAgICAgICAgQVJHSV9TVEFMTF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA0QyAqLyBBQ1BJX09QICgiU2xlZXAiLCAgICAgICAgICAgICAgQVJHUF9TTEVFUF9PUCwgICAgICAgICAgICAgQVJHSV9TTEVFUF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA0RCAqLyBBQ1BJX09QICgiQWNxdWlyZSIsICAgICAgICAgICAgQVJHUF9BQ1FVSVJFX09QLCAgICAgICAgICAgQVJHSV9BQ1FVSVJFX09QLCAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiksCi0vKiA0RSAqLyBBQ1BJX09QICgiU2lnbmFsIiwgICAgICAgICAgICAgQVJHUF9TSUdOQUxfT1AsICAgICAgICAgICAgQVJHSV9TSUdOQUxfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA0RiAqLyBBQ1BJX09QICgiV2FpdCIsICAgICAgICAgICAgICAgQVJHUF9XQUlUX09QLCAgICAgICAgICAgICAgQVJHSV9XQUlUX09QLCAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiksCi0vKiA1MCAqLyBBQ1BJX09QICgiUmVzZXQiLCAgICAgICAgICAgICAgQVJHUF9SRVNFVF9PUCwgICAgICAgICAgICAgQVJHSV9SRVNFVF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA1MSAqLyBBQ1BJX09QICgiUmVsZWFzZSIsICAgICAgICAgICAgQVJHUF9SRUxFQVNFX09QLCAgICAgICAgICAgQVJHSV9SRUxFQVNFX09QLCAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA1MiAqLyBBQ1BJX09QICgiRnJvbUJDRCIsICAgICAgICAgICAgQVJHUF9GUk9NX0JDRF9PUCwgICAgICAgICAgQVJHSV9GUk9NX0JDRF9PUCwgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiA1MyAqLyBBQ1BJX09QICgiVG9CQ0QiLCAgICAgICAgICAgICAgQVJHUF9UT19CQ0RfT1AsICAgICAgICAgICAgQVJHSV9UT19CQ0RfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiA1NCAqLyBBQ1BJX09QICgiVW5sb2FkIiwgICAgICAgICAgICAgQVJHUF9VTkxPQURfT1AsICAgICAgICAgICAgQVJHSV9VTkxPQURfT1AsICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgICBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA1NSAqLyBBQ1BJX09QICgiUmV2aXNpb24iLCAgICAgICAgICAgQVJHUF9SRVZJU0lPTl9PUCwgICAgICAgICAgQVJHSV9SRVZJU0lPTl9PUCwgICAgICAgICAgIEFDUElfVFlQRV9JTlRFR0VSLCAgICAgICAgICAgQU1MX0NMQVNTX0FSR1VNRU5ULCAgICAgICAgQU1MX1RZUEVfQ09OU1RBTlQsICAgICAgICAwKSwKLS8qIDU2ICovIEFDUElfT1AgKCJEZWJ1ZyIsICAgICAgICAgICAgICBBUkdQX0RFQlVHX09QLCAgICAgICAgICAgICBBUkdJX0RFQlVHX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9DT05TVEFOVCwgICAgICAgIDApLAotLyogNTcgKi8gQUNQSV9PUCAoIkZhdGFsIiwgICAgICAgICAgICAgIEFSR1BfRkFUQUxfT1AsICAgICAgICAgICAgIEFSR0lfRkFUQUxfT1AsICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfM0FfMFRfMFIsICAgQU1MX0ZMQUdTX0VYRUNfM0FfMFRfMFIpLAotLyogNTggKi8gQUNQSV9PUCAoIk9wZXJhdGlvblJlZ2lvbiIsICAgIEFSR1BfUkVHSU9OX09QLCAgICAgICAgICAgIEFSR0lfUkVHSU9OX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfUkVHSU9OLCAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCi0vKiA1OSAqLyBBQ1BJX09QICgiRmllbGQiLCAgICAgICAgICAgICAgQVJHUF9GSUVMRF9PUCwgICAgICAgICAgICAgQVJHSV9GSUVMRF9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfRklFTEQsICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfRklFTEQpLAotLyogNUEgKi8gQUNQSV9PUCAoIkRldmljZSIsICAgICAgICAgICAgIEFSR1BfREVWSUNFX09QLCAgICAgICAgICAgIEFSR0lfREVWSUNFX09QLCAgICAgICAgICAgICBBQ1BJX1RZUEVfREVWSUNFLCAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX05PX09CSiwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA1QiAqLyBBQ1BJX09QICgiUHJvY2Vzc29yIiwgICAgICAgICAgQVJHUF9QUk9DRVNTT1JfT1AsICAgICAgICAgQVJHSV9QUk9DRVNTT1JfT1AsICAgICAgICAgIEFDUElfVFlQRV9QUk9DRVNTT1IsICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfU0lNUExFLCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDVDICovIEFDUElfT1AgKCJQb3dlclJlc291cmNlIiwgICAgICBBUkdQX1BPV0VSX1JFU19PUCwgICAgICAgICBBUkdJX1BPV0VSX1JFU19PUCwgICAgICAgICAgQUNQSV9UWVBFX1BPV0VSLCAgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogNUQgKi8gQUNQSV9PUCAoIlRoZXJtYWxab25lIiwgICAgICAgIEFSR1BfVEhFUk1BTF9aT05FX09QLCAgICAgIEFSR0lfVEhFUk1BTF9aT05FX09QLCAgICAgICBBQ1BJX1RZUEVfVEhFUk1BTCwgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX05PX09CSiwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA1RSAqLyBBQ1BJX09QICgiSW5kZXhGaWVsZCIsICAgICAgICAgQVJHUF9JTkRFWF9GSUVMRF9PUCwgICAgICAgQVJHSV9JTkRFWF9GSUVMRF9PUCwgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfRklFTEQsICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfRklFTEQpLAotLyogNUYgKi8gQUNQSV9PUCAoIkJhbmtGaWVsZCIsICAgICAgICAgIEFSR1BfQkFOS19GSUVMRF9PUCwgICAgICAgIEFSR0lfQkFOS19GSUVMRF9PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsICAgIEFNTF9UWVBFX05BTUVEX0ZJRUxELCAgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX0ZJRUxEKSwKKy8qIDQ2ICovIEFDUElfT1AoIk11dGV4IiwgQVJHUF9NVVRFWF9PUCwgQVJHSV9NVVRFWF9PUCwgQUNQSV9UWVBFX01VVEVYLAorCQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNDcgKi8gQUNQSV9PUCgiRXZlbnQiLCBBUkdQX0VWRU5UX09QLCBBUkdJX0VWRU5UX09QLCBBQ1BJX1RZUEVfRVZFTlQsCisJCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfU0lNUExFLAorCQkJIEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNDggKi8gQUNQSV9PUCgiQ29uZFJlZk9mIiwgQVJHUF9DT05EX1JFRl9PRl9PUCwgQVJHSV9DT05EX1JFRl9PRl9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCisvKiA0OSAqLyBBQ1BJX09QKCJDcmVhdGVGaWVsZCIsIEFSR1BfQ1JFQVRFX0ZJRUxEX09QLAorCQkJIEFSR0lfQ1JFQVRFX0ZJRUxEX09QLCBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELAorCQkJIEFNTF9DTEFTU19DUkVBVEUsIEFNTF9UWVBFX0NSRUFURV9GSUVMRCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKKwkJCSBBTUxfREVGRVIgfCBBTUxfRklFTEQgfCBBTUxfQ1JFQVRFKSwKKy8qIDRBICovIEFDUElfT1AoIkxvYWQiLCBBUkdQX0xPQURfT1AsIEFSR0lfTE9BRF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8wUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8wUiksCisvKiA0QiAqLyBBQ1BJX09QKCJTdGFsbCIsIEFSR1BfU1RBTExfT1AsIEFSR0lfU1RBTExfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNEMgKi8gQUNQSV9PUCgiU2xlZXAiLCBBUkdQX1NMRUVQX09QLCBBUkdJX1NMRUVQX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzBSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDREICovIEFDUElfT1AoIkFjcXVpcmUiLCBBUkdQX0FDUVVJUkVfT1AsIEFSR0lfQUNRVUlSRV9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLCBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiksCisvKiA0RSAqLyBBQ1BJX09QKCJTaWduYWwiLCBBUkdQX1NJR05BTF9PUCwgQVJHSV9TSUdOQUxfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNEYgKi8gQUNQSV9PUCgiV2FpdCIsIEFSR1BfV0FJVF9PUCwgQVJHSV9XQUlUX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSKSwKKy8qIDUwICovIEFDUElfT1AoIlJlc2V0IiwgQVJHUF9SRVNFVF9PUCwgQVJHSV9SRVNFVF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCisvKiA1MSAqLyBBQ1BJX09QKCJSZWxlYXNlIiwgQVJHUF9SRUxFQVNFX09QLCBBUkdJX1JFTEVBU0VfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNTIgKi8gQUNQSV9PUCgiRnJvbUJDRCIsIEFSR1BfRlJPTV9CQ0RfT1AsIEFSR0lfRlJPTV9CQ0RfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA1MyAqLyBBQ1BJX09QKCJUb0JDRCIsIEFSR1BfVE9fQkNEX09QLCBBUkdJX1RPX0JDRF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA1NCAqLyBBQ1BJX09QKCJVbmxvYWQiLCBBUkdQX1VOTE9BRF9PUCwgQVJHSV9VTkxPQURfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNTUgKi8gQUNQSV9PUCgiUmV2aXNpb24iLCBBUkdQX1JFVklTSU9OX09QLCBBUkdJX1JFVklTSU9OX09QLAorCQkJIEFDUElfVFlQRV9JTlRFR0VSLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCQkgQU1MX1RZUEVfQ09OU1RBTlQsIDApLAorLyogNTYgKi8gQUNQSV9PUCgiRGVidWciLCBBUkdQX0RFQlVHX09QLCBBUkdJX0RFQlVHX09QLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9DT05TVEFOVCwgMCksCisvKiA1NyAqLyBBQ1BJX09QKCJGYXRhbCIsIEFSR1BfRkFUQUxfT1AsIEFSR0lfRkFUQUxfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfM0FfMFRfMFIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfM0FfMFRfMFIpLAorLyogNTggKi8gQUNQSV9PUCgiT3BlcmF0aW9uUmVnaW9uIiwgQVJHUF9SRUdJT05fT1AsIEFSR0lfUkVHSU9OX09QLAorCQkJIEFDUElfVFlQRV9SRUdJT04sIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCQkgQU1MX1RZUEVfTkFNRURfQ09NUExFWCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQgfCBBTUxfREVGRVIpLAorLyogNTkgKi8gQUNQSV9PUCgiRmllbGQiLCBBUkdQX0ZJRUxEX09QLCBBUkdJX0ZJRUxEX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX0ZJRUxEKSwKKy8qIDVBICovIEFDUElfT1AoIkRldmljZSIsIEFSR1BfREVWSUNFX09QLCBBUkdJX0RFVklDRV9PUCwKKwkJCSBBQ1BJX1RZUEVfREVWSUNFLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkJIEFNTF9UWVBFX05BTUVEX05PX09CSiwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNUIgKi8gQUNQSV9PUCgiUHJvY2Vzc29yIiwgQVJHUF9QUk9DRVNTT1JfT1AsIEFSR0lfUFJPQ0VTU09SX09QLAorCQkJIEFDUElfVFlQRV9QUk9DRVNTT1IsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCQkgQU1MX1RZUEVfTkFNRURfU0lNUExFLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiA1QyAqLyBBQ1BJX09QKCJQb3dlclJlc291cmNlIiwgQVJHUF9QT1dFUl9SRVNfT1AsIEFSR0lfUE9XRVJfUkVTX09QLAorCQkJIEFDUElfVFlQRV9QT1dFUiwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDVEICovIEFDUElfT1AoIlRoZXJtYWxab25lIiwgQVJHUF9USEVSTUFMX1pPTkVfT1AsCisJCQkgQVJHSV9USEVSTUFMX1pPTkVfT1AsIEFDUElfVFlQRV9USEVSTUFMLAorCQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX05PX09CSiwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNUUgKi8gQUNQSV9PUCgiSW5kZXhGaWVsZCIsIEFSR1BfSU5ERVhfRklFTERfT1AsIEFSR0lfSU5ERVhfRklFTERfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9GSUVMRCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9GSUVMRCksCisvKiA1RiAqLyBBQ1BJX09QKCJCYW5rRmllbGQiLCBBUkdQX0JBTktfRklFTERfT1AsIEFSR0lfQkFOS19GSUVMRF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkJIEFNTF9UWVBFX05BTUVEX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCQkgQU1MX0ZJRUxEKSwKIAogLyogSW50ZXJuYWwgb3Bjb2RlcyB0aGF0IG1hcCB0byBpbnZhbGlkIEFNTCBvcGNvZGVzICovCiAKLS8qIDYwICovIEFDUElfT1AgKCJMTm90RXF1YWwiLCAgICAgICAgICBBUkdQX0xOT1RFUVVBTF9PUCwgICAgICAgICBBUkdJX0xOT1RFUVVBTF9PUCwgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfSU5URVJOQUwsICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9DT05TVEFOVCksCi0vKiA2MSAqLyBBQ1BJX09QICgiTExlc3NFcXVhbCIsICAgICAgICAgQVJHUF9MTEVTU0VRVUFMX09QLCAgICAgICAgQVJHSV9MTEVTU0VRVUFMX09QLCAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0lOVEVSTkFMLCAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAotLyogNjIgKi8gQUNQSV9PUCAoIkxHcmVhdGVyRXF1YWwiLCAgICAgIEFSR1BfTEdSRUFURVJFUVVBTF9PUCwgICAgIEFSR0lfTEdSRUFURVJFUVVBTF9PUCwgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19JTlRFUk5BTCwgICAgICAgIEFNTF9UWVBFX0JPR1VTLCAgICAgICAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDYzICovIEFDUElfT1AgKCItTmFtZVBhdGgtIiwgICAgICAgICBBUkdQX05BTUVQQVRIX09QLCAgICAgICAgICBBUkdJX05BTUVQQVRIX09QLCAgICAgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MSVRFUkFMLCAgICAgICAgIEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgKSwKLS8qIDY0ICovIEFDUElfT1AgKCItTWV0aG9kQ2FsbC0iLCAgICAgICBBUkdQX01FVEhPRENBTExfT1AsICAgICAgICBBUkdJX01FVEhPRENBTExfT1AsICAgICAgICAgQUNQSV9UWVBFX01FVEhPRCwgICAgICAgICAgICBBTUxfQ0xBU1NfTUVUSE9EX0NBTEwsICAgICBBTUxfVFlQRV9NRVRIT0RfQ0FMTCwgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUpLAotLyogNjUgKi8gQUNQSV9PUCAoIi1CeXRlTGlzdC0iLCAgICAgICAgIEFSR1BfQllURUxJU1RfT1AsICAgICAgICAgIEFSR0lfQllURUxJU1RfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19BUkdVTUVOVCwgICAgICAgIEFNTF9UWVBFX0xJVEVSQUwsICAgICAgICAgMCksCi0vKiA2NiAqLyBBQ1BJX09QICgiLVJlc2VydmVkRmllbGQtIiwgICAgQVJHUF9SRVNFUlZFREZJRUxEX09QLCAgICAgQVJHSV9SRVNFUlZFREZJRUxEX09QLCAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0lOVEVSTkFMLCAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICAwKSwKLS8qIDY3ICovIEFDUElfT1AgKCItTmFtZWRGaWVsZC0iLCAgICAgICBBUkdQX05BTUVERklFTERfT1AsICAgICAgICBBUkdJX05BTUVERklFTERfT1AsICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfSU5URVJOQUwsICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUgfCBBTUxfTkFNRUQgKSwKLS8qIDY4ICovIEFDUElfT1AgKCItQWNjZXNzRmllbGQtIiwgICAgICBBUkdQX0FDQ0VTU0ZJRUxEX09QLCAgICAgICBBUkdJX0FDQ0VTU0ZJRUxEX09QLCAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfSU5URVJOQUwsICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIDApLAotLyogNjkgKi8gQUNQSV9PUCAoIi1TdGF0aWNTdHJpbmciLCAgICAgIEFSR1BfU1RBVElDU1RSSU5HX09QLCAgICAgIEFSR0lfU1RBVElDU1RSSU5HX09QLCAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19JTlRFUk5BTCwgICAgICAgIEFNTF9UWVBFX0JPR1VTLCAgICAgICAgICAgMCksCi0vKiA2QSAqLyBBQ1BJX09QICgiLVJldHVybiBWYWx1ZS0iLCAgICAgQVJHX05PTkUsICAgICAgICAgICAgICAgICAgQVJHX05PTkUsICAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX1JFVFVSTl9WQUxVRSwgICAgQU1MX1RZUEVfUkVUVVJOLCAgICAgICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfSEFTX1JFVFZBTCksCi0vKiA2QiAqLyBBQ1BJX09QICgiLVVOS05PV05fT1AtIiwgICAgICAgQVJHX05PTkUsICAgICAgICAgICAgICAgICAgQVJHX05PTkUsICAgICAgICAgICAgICAgICAgIEFDUElfVFlQRV9JTlZBTElELCAgICAgICAgICAgQU1MX0NMQVNTX1VOS05PV04sICAgICAgICAgQU1MX1RZUEVfQk9HVVMsICAgICAgICAgICBBTUxfSEFTX0FSR1MpLAotLyogNkMgKi8gQUNQSV9PUCAoIi1BU0NJSV9PTkxZLSIsICAgICAgIEFSR19OT05FLCAgICAgICAgICAgICAgICAgIEFSR19OT05FLCAgICAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19BU0NJSSwgICAgICAgICAgIEFNTF9UWVBFX0JPR1VTLCAgICAgICAgICAgQU1MX0hBU19BUkdTKSwKLS8qIDZEICovIEFDUElfT1AgKCItUFJFRklYX09OTFktIiwgICAgICBBUkdfTk9ORSwgICAgICAgICAgICAgICAgICBBUkdfTk9ORSwgICAgICAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfUFJFRklYLCAgICAgICAgICBBTUxfVFlQRV9CT0dVUywgICAgICAgICAgIEFNTF9IQVNfQVJHUyksCisvKiA2MCAqLyBBQ1BJX09QKCJMTm90RXF1YWwiLCBBUkdQX0xOT1RFUVVBTF9PUCwgQVJHSV9MTk9URVFVQUxfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0lOVEVSTkFMLAorCQkJIEFNTF9UWVBFX0JPR1VTLCBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAorLyogNjEgKi8gQUNQSV9PUCgiTExlc3NFcXVhbCIsIEFSR1BfTExFU1NFUVVBTF9PUCwgQVJHSV9MTEVTU0VRVUFMX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19JTlRFUk5BTCwKKwkJCSBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDYyICovIEFDUElfT1AoIkxHcmVhdGVyRXF1YWwiLCBBUkdQX0xHUkVBVEVSRVFVQUxfT1AsCisJCQkgQVJHSV9MR1JFQVRFUkVRVUFMX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDYzICovIEFDUElfT1AoIi1OYW1lUGF0aC0iLCBBUkdQX05BTUVQQVRIX09QLCBBUkdJX05BTUVQQVRIX09QLAorCQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKKy8qIDY0ICovIEFDUElfT1AoIi1NZXRob2RDYWxsLSIsIEFSR1BfTUVUSE9EQ0FMTF9PUCwgQVJHSV9NRVRIT0RDQUxMX09QLAorCQkJIEFDUElfVFlQRV9NRVRIT0QsIEFNTF9DTEFTU19NRVRIT0RfQ0FMTCwKKwkJCSBBTUxfVFlQRV9NRVRIT0RfQ0FMTCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKKy8qIDY1ICovIEFDUElfT1AoIi1CeXRlTGlzdC0iLCBBUkdQX0JZVEVMSVNUX09QLCBBUkdJX0JZVEVMSVNUX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCAwKSwKKy8qIDY2ICovIEFDUElfT1AoIi1SZXNlcnZlZEZpZWxkLSIsIEFSR1BfUkVTRVJWRURGSUVMRF9PUCwKKwkJCSBBUkdJX1JFU0VSVkVERklFTERfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0lOVEVSTkFMLCBBTUxfVFlQRV9CT0dVUywgMCksCisvKiA2NyAqLyBBQ1BJX09QKCItTmFtZWRGaWVsZC0iLCBBUkdQX05BTUVERklFTERfT1AsIEFSR0lfTkFNRURGSUVMRF9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfSU5URVJOQUwsCisJCQkgQU1MX1RZUEVfQk9HVVMsCisJCQkgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiA2OCAqLyBBQ1BJX09QKCItQWNjZXNzRmllbGQtIiwgQVJHUF9BQ0NFU1NGSUVMRF9PUCwKKwkJCSBBUkdJX0FDQ0VTU0ZJRUxEX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsIDApLAorLyogNjkgKi8gQUNQSV9PUCgiLVN0YXRpY1N0cmluZyIsIEFSR1BfU1RBVElDU1RSSU5HX09QLAorCQkJIEFSR0lfU1RBVElDU1RSSU5HX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsIDApLAorLyogNkEgKi8gQUNQSV9PUCgiLVJldHVybiBWYWx1ZS0iLCBBUkdfTk9ORSwgQVJHX05PTkUsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX1JFVFVSTl9WQUxVRSwgQU1MX1RZUEVfUkVUVVJOLAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9IQVNfUkVUVkFMKSwKKy8qIDZCICovIEFDUElfT1AoIi1VTktOT1dOX09QLSIsIEFSR19OT05FLCBBUkdfTk9ORSwgQUNQSV9UWVBFX0lOVkFMSUQsCisJCQkgQU1MX0NMQVNTX1VOS05PV04sIEFNTF9UWVBFX0JPR1VTLCBBTUxfSEFTX0FSR1MpLAorLyogNkMgKi8gQUNQSV9PUCgiLUFTQ0lJX09OTFktIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19BU0NJSSwgQU1MX1RZUEVfQk9HVVMsIEFNTF9IQVNfQVJHUyksCisvKiA2RCAqLyBBQ1BJX09QKCItUFJFRklYX09OTFktIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19QUkVGSVgsIEFNTF9UWVBFX0JPR1VTLCBBTUxfSEFTX0FSR1MpLAogCiAvKiBBQ1BJIDIuMCBvcGNvZGVzICovCiAKLS8qIDZFICovIEFDUElfT1AgKCJRd29yZENvbnN0IiwgICAgICAgICBBUkdQX1FXT1JEX09QLCAgICAgICAgICAgICBBUkdJX1FXT1JEX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgICBBTUxfQ0xBU1NfQVJHVU1FTlQsICAgICAgICBBTUxfVFlQRV9MSVRFUkFMLCAgICAgICAgIEFNTF9DT05TVEFOVCksCi0vKiA2RiAqLyBBQ1BJX09QICgiUGFja2FnZSAvKlZhciovIiwgICAgQVJHUF9WQVJfUEFDS0FHRV9PUCwgICAgICAgQVJHSV9WQVJfUEFDS0FHRV9PUCwgICAgICAgIEFDUElfVFlQRV9QQUNLQUdFLCAgICAgICAgICAgQU1MX0NMQVNTX0NSRUFURSwgICAgICAgICAgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwgICBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIpLAotLyogNzAgKi8gQUNQSV9PUCAoIkNvbmNhdGVuYXRlUmVzVGVtcGxhdGUiLCBBUkdQX0NPTkNBVF9SRVNfT1AsICAgIEFSR0lfQ09OQ0FUX1JFU19PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzEgKi8gQUNQSV9PUCAoIk1vZCIsICAgICAgICAgICAgICAgIEFSR1BfTU9EX09QLCAgICAgICAgICAgICAgIEFSR0lfTU9EX09QLCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzIgKi8gQUNQSV9PUCAoIkNyZWF0ZVFXb3JkRmllbGQiLCAgIEFSR1BfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QLEFSR0lfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QLCBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCAgICAgIEFNTF9DTEFTU19DUkVBVEUsICAgICAgICAgIEFNTF9UWVBFX0NSRUFURV9GSUVMRCwgICAgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8IEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAotLyogNzMgKi8gQUNQSV9PUCAoIlRvQnVmZmVyIiwgICAgICAgICAgIEFSR1BfVE9fQlVGRkVSX09QLCAgICAgICAgIEFSR0lfVE9fQlVGRkVSX09QLCAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzQgKi8gQUNQSV9PUCAoIlRvRGVjaW1hbFN0cmluZyIsICAgIEFSR1BfVE9fREVDX1NUUl9PUCwgICAgICAgIEFSR0lfVE9fREVDX1NUUl9PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzUgKi8gQUNQSV9PUCAoIlRvSGV4U3RyaW5nIiwgICAgICAgIEFSR1BfVE9fSEVYX1NUUl9PUCwgICAgICAgIEFSR0lfVE9fSEVYX1NUUl9PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzYgKi8gQUNQSV9PUCAoIlRvSW50ZWdlciIsICAgICAgICAgIEFSR1BfVE9fSU5URUdFUl9PUCwgICAgICAgIEFSR0lfVE9fSU5URUdFUl9PUCwgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzcgKi8gQUNQSV9PUCAoIlRvU3RyaW5nIiwgICAgICAgICAgIEFSR1BfVE9fU1RSSU5HX09QLCAgICAgICAgIEFSR0lfVE9fU1RSSU5HX09QLCAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzggKi8gQUNQSV9PUCAoIkNvcHlPYmplY3QiLCAgICAgICAgIEFSR1BfQ09QWV9PUCwgICAgICAgICAgICAgIEFSR0lfQ09QWV9PUCwgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIpLAotLyogNzkgKi8gQUNQSV9PUCAoIk1pZCIsICAgICAgICAgICAgICAgIEFSR1BfTUlEX09QLCAgICAgICAgICAgICAgIEFSR0lfTUlEX09QLCAgICAgICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19FWEVDVVRFLCAgICAgICAgIEFNTF9UWVBFX0VYRUNfM0FfMVRfMVIsICAgQU1MX0ZMQUdTX0VYRUNfM0FfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogN0EgKi8gQUNQSV9PUCAoIkNvbnRpbnVlIiwgICAgICAgICAgIEFSR1BfQ09OVElOVUVfT1AsICAgICAgICAgIEFSR0lfQ09OVElOVUVfT1AsICAgICAgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgIEFNTF9DTEFTU19DT05UUk9MLCAgICAgICAgIEFNTF9UWVBFX0NPTlRST0wsICAgICAgICAgMCksCi0vKiA3QiAqLyBBQ1BJX09QICgiTG9hZFRhYmxlIiwgICAgICAgICAgQVJHUF9MT0FEX1RBQkxFX09QLCAgICAgICAgQVJHSV9MT0FEX1RBQkxFX09QLCAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ182QV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ182QV8wVF8xUiksCi0vKiA3QyAqLyBBQ1BJX09QICgiRGF0YVRhYmxlUmVnaW9uIiwgICAgQVJHUF9EQVRBX1JFR0lPTl9PUCwgICAgICAgQVJHSV9EQVRBX1JFR0lPTl9PUCwgICAgICAgIEFDUElfVFlQRV9SRUdJT04sICAgICAgICAgICAgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgICAgQU1MX1RZUEVfTkFNRURfU0lNUExFLCAgICBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDdEICovIEFDUElfT1AgKCJbRXZhbFN1YlRyZWVdIiwgICAgICBBUkdQX1NDT1BFX09QLCAgICAgICAgICAgICBBUkdJX1NDT1BFX09QLCAgICAgICAgICAgICAgQUNQSV9UWVBFX0FOWSwgICAgICAgICAgICAgICBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCAgICBBTUxfVFlQRV9OQU1FRF9OT19PQkosICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9OU05PREUpLAorLyogNkUgKi8gQUNQSV9PUCgiUXdvcmRDb25zdCIsIEFSR1BfUVdPUkRfT1AsIEFSR0lfUVdPUkRfT1AsCisJCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAorCS8qIDZGICovIEFDUElfT1AoIlBhY2thZ2UiLCAvKiBWYXIgKi8gQVJHUF9WQVJfUEFDS0FHRV9PUCwKKwkJCSBBUkdJX1ZBUl9QQUNLQUdFX09QLCBBQ1BJX1RZUEVfUEFDS0FHRSwKKwkJCSBBTUxfQ0xBU1NfQ1JFQVRFLCBBTUxfVFlQRV9DUkVBVEVfT0JKRUNULAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9ERUZFUiksCisvKiA3MCAqLyBBQ1BJX09QKCJDb25jYXRlbmF0ZVJlc1RlbXBsYXRlIiwgQVJHUF9DT05DQVRfUkVTX09QLAorCQkJIEFSR0lfQ09OQ0FUX1JFU19PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3MSAqLyBBQ1BJX09QKCJNb2QiLCBBUkdQX01PRF9PUCwgQVJHSV9NT0RfT1AsIEFDUElfVFlQRV9BTlksCisJCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzIgKi8gQUNQSV9PUCgiQ3JlYXRlUVdvcmRGaWVsZCIsIEFSR1BfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QLAorCQkJIEFSR0lfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QLAorCQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAorCQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogNzMgKi8gQUNQSV9PUCgiVG9CdWZmZXIiLCBBUkdQX1RPX0JVRkZFUl9PUCwgQVJHSV9UT19CVUZGRVJfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3NCAqLyBBQ1BJX09QKCJUb0RlY2ltYWxTdHJpbmciLCBBUkdQX1RPX0RFQ19TVFJfT1AsCisJCQkgQVJHSV9UT19ERUNfU1RSX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDc1ICovIEFDUElfT1AoIlRvSGV4U3RyaW5nIiwgQVJHUF9UT19IRVhfU1RSX09QLCBBUkdJX1RPX0hFWF9TVFJfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3NiAqLyBBQ1BJX09QKCJUb0ludGVnZXIiLCBBUkdQX1RPX0lOVEVHRVJfT1AsIEFSR0lfVE9fSU5URUdFUl9PUCwKKwkJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLAorCQkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDc3ICovIEFDUElfT1AoIlRvU3RyaW5nIiwgQVJHUF9UT19TVFJJTkdfT1AsIEFSR0lfVE9fU1RSSU5HX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzggKi8gQUNQSV9PUCgiQ29weU9iamVjdCIsIEFSR1BfQ09QWV9PUCwgQVJHSV9DT1BZX09QLAorCQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSKSwKKy8qIDc5ICovIEFDUElfT1AoIk1pZCIsIEFSR1BfTUlEX09QLCBBUkdJX01JRF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18zQV8xVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18zQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3QSAqLyBBQ1BJX09QKCJDb250aW51ZSIsIEFSR1BfQ09OVElOVUVfT1AsIEFSR0lfQ09OVElOVUVfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAorLyogN0IgKi8gQUNQSV9PUCgiTG9hZFRhYmxlIiwgQVJHUF9MT0FEX1RBQkxFX09QLCBBUkdJX0xPQURfVEFCTEVfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCQkgQU1MX1RZUEVfRVhFQ182QV8wVF8xUiwgQU1MX0ZMQUdTX0VYRUNfNkFfMFRfMVIpLAorLyogN0MgKi8gQUNQSV9PUCgiRGF0YVRhYmxlUmVnaW9uIiwgQVJHUF9EQVRBX1JFR0lPTl9PUCwKKwkJCSBBUkdJX0RBVEFfUkVHSU9OX09QLCBBQ1BJX1RZUEVfUkVHSU9OLAorCQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogN0QgKi8gQUNQSV9PUCgiW0V2YWxTdWJUcmVlXSIsIEFSR1BfU0NPUEVfT1AsIEFSR0lfU0NPUEVfT1AsCisJCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCisJCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJCSBBTUxfTlNOT0RFKSwKIAogLyogQUNQSSAzLjAgb3Bjb2RlcyAqLwogCi0vKiA3RSAqLyBBQ1BJX09QICgiVGltZXIiLCAgICAgICAgICAgICAgQVJHUF9USU1FUl9PUCwgICAgICAgICAgICAgQVJHSV9USU1FUl9PUCwgICAgICAgICAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICAgQU1MX0NMQVNTX0VYRUNVVEUsICAgICAgICAgQU1MX1RZUEVfRVhFQ18wQV8wVF8xUiwgICBBTUxfRkxBR1NfRVhFQ18wQV8wVF8xUikKKy8qIDdFICovIEFDUElfT1AoIlRpbWVyIiwgQVJHUF9USU1FUl9PUCwgQVJHSV9USU1FUl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18wQV8wVF8xUiwKKwkJCSBBTUxfRkxBR1NfRVhFQ18wQV8wVF8xUikKIAogLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwogfTsKQEAgLTMzOCw3MyArNjQ2LDcwIEBACiAgKiBUaGlzIHRhYmxlIGlzIGRpcmVjdGx5IGluZGV4ZWQgYnkgdGhlIG9wY29kZXMsIGFuZCByZXR1cm5zIGFuCiAgKiBpbmRleCBpbnRvIHRoZSB0YWJsZSBhYm92ZQogICovCi1zdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfc2hvcnRfb3BfaW5kZXhbMjU2XSA9Ci17CitzdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfc2hvcnRfb3BfaW5kZXhbMjU2XSA9IHsKIC8qICAgICAgICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAqLwogLyogICAgICAgICAgICAgIDggICAgIDkgICAgIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICovCi0vKiAweDAwICovCTB4MDAsIDB4MDEsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4MDIsIF9VTkssCi0vKiAweDA4ICovCTB4MDMsIF9VTkssIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4NkUsIF9VTkssCi0vKiAweDEwICovCTB4MDgsIDB4MDksIDB4MGEsIDB4NkYsIDB4MGIsIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDE4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDIwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDI4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4NjMsIF9QRlgsIF9QRlgsCi0vKiAweDMwICovCTB4NjcsIDB4NjYsIDB4NjgsIDB4NjUsIDB4NjksIDB4NjQsIDB4NkEsIDB4N0QsCi0vKiAweDM4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDQwICovCV9VTkssIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsCi0vKiAweDQ4ICovCV9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsCi0vKiAweDUwICovCV9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsCi0vKiAweDU4ICovCV9BU0MsIF9BU0MsIF9BU0MsIF9VTkssIF9QRlgsIF9VTkssIF9QRlgsIF9BU0MsCi0vKiAweDYwICovCTB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCi0vKiAweDY4ICovCTB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIF9VTkssCi0vKiAweDcwICovCTB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsCi0vKiAweDc4ICovCTB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsCi0vKiAweDgwICovCTB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4NzAsIDB4NzEsIDB4MmYsIDB4MzAsCi0vKiAweDg4ICovCTB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4NzIsCi0vKiAweDkwICovCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4NzMsIDB4NzQsCi0vKiAweDk4ICovCTB4NzUsIDB4NzYsIF9VTkssIF9VTkssIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsCi0vKiAweEEwICovCTB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NjAsIDB4NjEsCi0vKiAweEE4ICovCTB4NjIsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEIwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEI4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEMwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEM4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4NDQsIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEQwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEQ4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEUwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEU4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEYwICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweEY4ICovCV9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4NDUsCisvKiAweDAwICovIDB4MDAsIDB4MDEsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4MDIsIF9VTkssCisvKiAweDA4ICovIDB4MDMsIF9VTkssIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4NkUsIF9VTkssCisvKiAweDEwICovIDB4MDgsIDB4MDksIDB4MGEsIDB4NkYsIDB4MGIsIF9VTkssIF9VTkssIF9VTkssCisvKiAweDE4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDIwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDI4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4NjMsIF9QRlgsIF9QRlgsCisvKiAweDMwICovIDB4NjcsIDB4NjYsIDB4NjgsIDB4NjUsIDB4NjksIDB4NjQsIDB4NkEsIDB4N0QsCisvKiAweDM4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDQwICovIF9VTkssIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsCisvKiAweDQ4ICovIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsCisvKiAweDUwICovIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsIF9BU0MsCisvKiAweDU4ICovIF9BU0MsIF9BU0MsIF9BU0MsIF9VTkssIF9QRlgsIF9VTkssIF9QRlgsIF9BU0MsCisvKiAweDYwICovIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCisvKiAweDY4ICovIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIF9VTkssCisvKiAweDcwICovIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsCisvKiAweDc4ICovIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsCisvKiAweDgwICovIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4NzAsIDB4NzEsIDB4MmYsIDB4MzAsCisvKiAweDg4ICovIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4NzIsCisvKiAweDkwICovIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4NzMsIDB4NzQsCisvKiAweDk4ICovIDB4NzUsIDB4NzYsIF9VTkssIF9VTkssIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsCisvKiAweEEwICovIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NjAsIDB4NjEsCisvKiAweEE4ICovIDB4NjIsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEIwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEI4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEMwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEM4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4NDQsIF9VTkssIF9VTkssIF9VTkssCisvKiAweEQwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEQ4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEUwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEU4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEYwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweEY4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4NDUsCiB9OwogCiAvKgogICogVGhpcyB0YWJsZSBpcyBpbmRleGVkIGJ5IHRoZSBzZWNvbmQgb3Bjb2RlIG9mIHRoZSBleHRlbmRlZCBvcGNvZGUKICAqIHBhaXIuICBJdCByZXR1cm5zIGFuIGluZGV4IGludG8gdGhlIG9wY29kZSB0YWJsZSAoYWNwaV9nYmxfYW1sX29wX2luZm8pCiAgKi8KLXN0YXRpYyBjb25zdCB1OCBhY3BpX2dibF9sb25nX29wX2luZGV4W05VTV9FWFRFTkRFRF9PUENPREVdID0KLXsKK3N0YXRpYyBjb25zdCB1OCBhY3BpX2dibF9sb25nX29wX2luZGV4W05VTV9FWFRFTkRFRF9PUENPREVdID0gewogLyogICAgICAgICAgICAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICovCiAvKiAgICAgICAgICAgICAgOCAgICAgOSAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgKi8KLS8qIDB4MDAgKi8JX1VOSywgMHg0NiwgMHg0NywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4MDggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4MTAgKi8JX1VOSywgX1VOSywgMHg0OCwgMHg0OSwgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4MTggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgMHg3QiwKLS8qIDB4MjAgKi8JMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgMHg1MSwKLS8qIDB4MjggKi8JMHg1MiwgMHg1MywgMHg1NCwgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4MzAgKi8JMHg1NSwgMHg1NiwgMHg1NywgMHg3ZSwgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4MzggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NDAgKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NDggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NTAgKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NTggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NjAgKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NjggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NzAgKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4NzggKi8JX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKLS8qIDB4ODAgKi8JMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwKLS8qIDB4ODggKi8JMHg3QywKKy8qIDB4MDAgKi8gX1VOSywgMHg0NiwgMHg0NywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4MDggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4MTAgKi8gX1VOSywgX1VOSywgMHg0OCwgMHg0OSwgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4MTggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgMHg3QiwKKy8qIDB4MjAgKi8gMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgMHg1MSwKKy8qIDB4MjggKi8gMHg1MiwgMHg1MywgMHg1NCwgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4MzAgKi8gMHg1NSwgMHg1NiwgMHg1NywgMHg3ZSwgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4MzggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NDAgKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NDggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NTAgKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NTggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NjAgKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NjggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NzAgKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4NzggKi8gX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywgX1VOSywKKy8qIDB4ODAgKi8gMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwKKy8qIDB4ODggKi8gMHg3QywKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KQEAgLTQxOCw0OCArNzIzLDM2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKgotYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKQorY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKmFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHUxNiBvcGNvZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FICgicHNfZ2V0X29wY29kZV9pbmZvIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInBzX2dldF9vcGNvZGVfaW5mbyIpOwogCiAJLyoKIAkgKiBEZXRlY3Qgbm9ybWFsIDgtYml0IG9wY29kZSBvciBleHRlbmRlZCAxNi1iaXQgb3Bjb2RlCiAJICovCi0Jc3dpdGNoICgodTgpIChvcGNvZGUgPj4gOCkpIHsKLQljYXNlIDA6Ci0KKwlpZiAoIShvcGNvZGUgJiAweEZGMDApKSB7CiAJCS8qIFNpbXBsZSAoOC1iaXQpIG9wY29kZTogMC0yNTUsIGNhbid0IGluZGV4IGJleW9uZCB0YWJsZSAgKi8KIAotCQlyZXR1cm4gKCZhY3BpX2dibF9hbWxfb3BfaW5mbyBbYWNwaV9nYmxfc2hvcnRfb3BfaW5kZXggWyh1OCkgb3Bjb2RlXV0pOwotCi0JY2FzZSBBTUxfRVhUT1A6Ci0KLQkJLyogRXh0ZW5kZWQgKDE2LWJpdCwgcHJlZml4K29wY29kZSkgb3Bjb2RlICovCi0KLQkJaWYgKCgodTgpIG9wY29kZSkgPD0gTUFYX0VYVEVOREVEX09QQ09ERSkgewotCQkJcmV0dXJuICgmYWNwaV9nYmxfYW1sX29wX2luZm8gW2FjcGlfZ2JsX2xvbmdfb3BfaW5kZXggWyh1OCkgb3Bjb2RlXV0pOwotCQl9Ci0KLQkJLyogRWxzZSBmYWxsIHRocm91Z2ggdG8gZXJyb3IgY2FzZSBiZWxvdyAqLwotCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCi0KLQlkZWZhdWx0OgotCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVua25vd24gQU1MIG9wY29kZSBbJTQuNFhdXG4iLCBvcGNvZGUpKTsKLQkJYnJlYWs7CisJCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvCisJCQlbYWNwaV9nYmxfc2hvcnRfb3BfaW5kZXhbKHU4KSBvcGNvZGVdXSk7CiAJfQogCisJaWYgKCgob3Bjb2RlICYgMHhGRjAwKSA9PSBBTUxfRVhURU5ERURfT1BDT0RFKSAmJgorCSAgICAoKCh1OCkgb3Bjb2RlKSA8PSBNQVhfRVhURU5ERURfT1BDT0RFKSkgeworCQkvKiBWYWxpZCBleHRlbmRlZCAoMTYtYml0KSBvcGNvZGUgKi8KIAotCS8qIERlZmF1bHQgaXMgInVua25vd24gb3Bjb2RlIiAqLworCQlyZXR1cm4gKCZhY3BpX2dibF9hbWxfb3BfaW5mbworCQkJW2FjcGlfZ2JsX2xvbmdfb3BfaW5kZXhbKHU4KSBvcGNvZGVdXSk7CisJfQogCi0JcmV0dXJuICgmYWNwaV9nYmxfYW1sX29wX2luZm8gW19VTktdKTsKKwkvKiBVbmtub3duIEFNTCBvcGNvZGUgKi8KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkgICJVbmtub3duIEFNTCBvcGNvZGUgWyU0LjRYXVxuIiwgb3Bjb2RlKSk7CisKKwlyZXR1cm4gKCZhY3BpX2dibF9hbWxfb3BfaW5mb1tfVU5LXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUKQEAgLTQ3MywxNiArNzY2LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY2hhciAqCi1hY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpCitjaGFyICphY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh1MTYgb3Bjb2RlKQogewogI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdfT1VUUFVUKQogCi0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqb3A7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wOwogCi0KLQlvcCA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpOworCW9wID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKIAogCS8qIEFsd2F5cyBndWFyYW50ZWVkIHRvIHJldHVybiBhIHZhbGlkIHBvaW50ZXIgKi8KIApAQCAtNDkzLDQgKzc4MywzIEBACiAKICNlbmRpZgogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jCmluZGV4IGJiZmRjMWEuLjc2ZDRkNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAvKgogICogUGFyc2UgdGhlIEFNTCBhbmQgYnVpbGQgYW4gb3BlcmF0aW9uIHRyZWUgYXMgbW9zdCBpbnRlcnByZXRlcnMsCiAgKiBsaWtlIFBlcmwsIGRvLiAgUGFyc2luZyBpcyBkb25lIGJ5IGhhbmQgcmF0aGVyIHRoYW4gd2l0aCBhIFlBQ0MKQEAgLTU5LDI4ICs1OCw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzcGFyc2UiKQotCi0KLXN0YXRpYyB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlcHRoID0gMDsKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcHNfcGFyc2VfbG9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK0FDUElfTU9EVUxFX05BTUUoInBzcGFyc2UiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTkzLDEwICs3MSw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IG9wY29kZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11MzIKLWFjcGlfcHNfZ2V0X29wY29kZV9zaXplICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSkKK3UzMiBhY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSh1MzIgb3Bjb2RlKQogewogCiAJLyogRXh0ZW5kZWQgKDItYnl0ZSkgb3Bjb2RlIGlmID4gMjU1ICovCkBAIC0xMTAsNyArODUsNiBAQAogCXJldHVybiAoMSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19wZWVrX29wY29kZQpAQCAtMTIzLDI4ICs5NywyNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUxNgotYWNwaV9wc19wZWVrX29wY29kZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQordTE2IGFjcGlfcHNfcGVla19vcGNvZGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKiBwYXJzZXJfc3RhdGUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlOwotCisJdTggKmFtbDsKKwl1MTYgb3Bjb2RlOwogCiAJYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0Jb3Bjb2RlID0gKHUxNikgQUNQSV9HRVQ4IChhbWwpOworCW9wY29kZSA9ICh1MTYpIEFDUElfR0VUOChhbWwpOwogCi0JaWYgKG9wY29kZSA9PSBBTUxfRVhUT1ApIHsKLQkJLyogRXh0ZW5kZWQgb3Bjb2RlICovCisJaWYgKG9wY29kZSA9PSBBTUxfRVhURU5ERURfT1BfUFJFRklYKSB7CisJCS8qIEV4dGVuZGVkIG9wY29kZSwgZ2V0IHRoZSBzZWNvbmQgb3Bjb2RlIGJ5dGUgKi8KIAogCQlhbWwrKzsKLQkJb3Bjb2RlID0gKHUxNikgKChvcGNvZGUgPDwgOCkgfCBBQ1BJX0dFVDggKGFtbCkpOworCQlvcGNvZGUgPSAodTE2KSAoKG9wY29kZSA8PCA4KSB8IEFDUElfR0VUOChhbWwpKTsKIAl9CiAKIAlyZXR1cm4gKG9wY29kZSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wCkBAIC0xNTIsNDcgKzEyMiw1NCBAQAogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgU3RhdGUKICAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0byBjb21wbGV0ZQogICoKLSAqIFJFVFVSTjogICAgICBOb25lLgorICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIGFueSBjbGVhbnVwIGF0IHRoZSBjb21wbGV0aW9uIG9mIGFuIE9wLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCithY3BpX3N0YXR1cworYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkJIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogb3ApCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcHJldjsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0OwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKnBhcmVudF9pbmZvOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnJlcGxhY2VtZW50X29wID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJldjsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dDsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqcGFyZW50X2luZm87CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnJlcGxhY2VtZW50X29wID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJwc19jb21wbGV0ZV90aGlzX29wIiwgb3ApOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2NvbXBsZXRlX3RoaXNfb3AiLCBvcCk7CiAKIAkvKiBDaGVjayBmb3IgbnVsbCBPcCwgY2FuIGhhcHBlbiBpZiBBTUwgY29kZSBpcyBjb3JydXB0ICovCiAKIAlpZiAoIW9wKSB7Ci0JCXJldHVybl9WT0lEOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwkvKiBPSyBmb3Igbm93ICovCiAJfQogCiAJLyogRGVsZXRlIHRoaXMgb3AgYW5kIHRoZSBzdWJ0cmVlIGJlbG93IGl0IGlmIGFza2VkIHRvICovCiAKLQlpZiAoKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfVFJFRV9NQVNLKSAhPSBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFKSB8fAotCQkgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19BUkdVTUVOVCkpIHsKLQkJcmV0dXJuX1ZPSUQ7CisJaWYgKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX1RSRUVfTUFTSykgIT0KKwkgICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUUpCisJICAgIHx8ICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQVJHVU1FTlQpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogTWFrZSBzdXJlIHRoYXQgd2Ugb25seSBkZWxldGUgdGhpcyBzdWJ0cmVlICovCiAKIAlpZiAob3AtPmNvbW1vbi5wYXJlbnQpIHsKKwkJcHJldiA9IG9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnOworCQlpZiAoIXByZXYpIHsKKwkJCS8qIE5vdGhpbmcgbW9yZSB0byBkbyAqLworCisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwogCQkvKgogCQkgKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIG9wZXJhdG9yIGFuZCBpdHMgc3VidHJlZQogCQkgKiB3aXRoIGEgcmV0dXJuIHZhbHVlIG9wIChwbGFjZWhvbGRlciBvcCkKIAkJICovCi0JCXBhcmVudF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSk7CisJCXBhcmVudF9pbmZvID0KKwkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uCisJCQkJCSAgICBhbWxfb3Bjb2RlKTsKIAogCQlzd2l0Y2ggKHBhcmVudF9pbmZvLT5jbGFzcykgewogCQljYXNlIEFNTF9DTEFTU19DT05UUk9MOgpAQCAtMjA0LDkgKzE4MSwxMCBAQAogCQkJICogVGhlc2Ugb3Bjb2RlcyBjb250YWluIHRlcm1fYXJnIG9wZXJhbmRzLiBUaGUgY3VycmVudAogCQkJICogb3AgbXVzdCBiZSByZXBsYWNlZCBieSBhIHBsYWNlaG9sZGVyIHJldHVybiBvcAogCQkJICovCi0JCQlyZXBsYWNlbWVudF9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AgKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKKwkJCXJlcGxhY2VtZW50X29wID0KKwkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKIAkJCWlmICghcmVwbGFjZW1lbnRfb3ApIHsKLQkJCQlnb3RvIGNsZWFudXA7CisJCQkJZ290byBhbGxvY2F0ZV9lcnJvcjsKIAkJCX0KIAkJCWJyZWFrOwogCkBAIC0yMTYsOTEgKzE5NCwxMTcgQEAKIAkJCSAqIFRoZXNlIG9wY29kZXMgY29udGFpbiB0ZXJtX2FyZyBvcGVyYW5kcy4gVGhlIGN1cnJlbnQKIAkJCSAqIG9wIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBwbGFjZWhvbGRlciByZXR1cm4gb3AKIAkJCSAqLwotCQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgICAgICB8fAotCQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0RBVEFfUkVHSU9OX09QKSB8fAotCQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JVRkZFUl9PUCkgICAgICB8fAotCQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApICAgICB8fAotCQkJCShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSkgewotCQkJCXJlcGxhY2VtZW50X29wID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApOworCQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCSAgICAgQU1MX1JFR0lPTl9PUCkKKwkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJQU1MX0RBVEFfUkVHSU9OX09QKQorCQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCQlBTUxfQlVGRkVSX09QKQorCQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCQlBTUxfUEFDS0FHRV9PUCkKKwkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJQU1MX1ZBUl9QQUNLQUdFX09QKSkgeworCQkJCXJlcGxhY2VtZW50X29wID0KKwkJCQkgICAgYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCk7CiAJCQkJaWYgKCFyZXBsYWNlbWVudF9vcCkgewotCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJCWdvdG8gYWxsb2NhdGVfZXJyb3I7CiAJCQkJfQotCQkJfQotCi0JCQlpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfTkFNRV9PUCkgJiYKLQkJCQkod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBhY3BpX2RzX2V4ZWNfYmVnaW5fb3ApKSB7Ci0JCQkJaWYgKChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JVRkZFUl9PUCkgfHwKLQkJCQkJKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKLQkJCQkJKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfVkFSX1BBQ0tBR0VfT1ApKSB7Ci0JCQkJCXJlcGxhY2VtZW50X29wID0gYWNwaV9wc19hbGxvY19vcCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJIEFNTF9OQU1FX09QKQorCQkJCSYmICh3YWxrX3N0YXRlLT5wYXNzX251bWJlciA8PQorCQkJCSAgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIpKSB7CisJCQkJaWYgKChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JVRkZFUl9PUCkKKwkJCQkgICAgfHwgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkKKwkJCQkgICAgfHwgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCQlBTUxfVkFSX1BBQ0tBR0VfT1ApKSB7CisJCQkJCXJlcGxhY2VtZW50X29wID0KKwkJCQkJICAgIGFjcGlfcHNfYWxsb2Nfb3Aob3AtPmNvbW1vbi4KKwkJCQkJCQkgICAgIGFtbF9vcGNvZGUpOwogCQkJCQlpZiAoIXJlcGxhY2VtZW50X29wKSB7Ci0JCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJCQlnb3RvIGFsbG9jYXRlX2Vycm9yOwogCQkJCQl9CiAKLQkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmRhdGEgPSBvcC0+bmFtZWQuZGF0YTsKLQkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmxlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7CisJCQkJCXJlcGxhY2VtZW50X29wLT5uYW1lZC5kYXRhID0KKwkJCQkJICAgIG9wLT5uYW1lZC5kYXRhOworCQkJCQlyZXBsYWNlbWVudF9vcC0+bmFtZWQubGVuZ3RoID0KKwkJCQkJICAgIG9wLT5uYW1lZC5sZW5ndGg7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXJlcGxhY2VtZW50X29wID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApOworCisJCQlyZXBsYWNlbWVudF9vcCA9CisJCQkgICAgYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCk7CiAJCQlpZiAoIXJlcGxhY2VtZW50X29wKSB7Ci0JCQkJZ290byBjbGVhbnVwOworCQkJCWdvdG8gYWxsb2NhdGVfZXJyb3I7CiAJCQl9CiAJCX0KIAogCQkvKiBXZSBtdXN0IHVubGluayB0aGlzIG9wIGZyb20gdGhlIHBhcmVudCB0cmVlICovCiAKLQkJcHJldiA9IG9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnOwogCQlpZiAocHJldiA9PSBvcCkgewogCQkJLyogVGhpcyBvcCBpcyB0aGUgZmlyc3QgaW4gdGhlIGxpc3QgKi8KIAogCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5wYXJlbnQgICAgICAgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnZhbHVlLmFyZyAgICA9IE5VTEw7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5ub2RlICAgICAgICAgPSBvcC0+Y29tbW9uLm5vZGU7Ci0JCQkJb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi52YWx1ZS5hcmcgPSByZXBsYWNlbWVudF9vcDsKLQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5leHQgICAgICAgICA9IG9wLT5jb21tb24ubmV4dDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnID0gb3AtPmNvbW1vbi5uZXh0OworCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ucGFyZW50ID0KKwkJCQkgICAgb3AtPmNvbW1vbi5wYXJlbnQ7CisJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBOVUxMOworCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubm9kZSA9IG9wLT5jb21tb24ubm9kZTsKKwkJCQlvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZyA9CisJCQkJICAgIHJlcGxhY2VtZW50X29wOworCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubmV4dCA9IG9wLT5jb21tb24ubmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi52YWx1ZS5hcmcgPQorCQkJCSAgICBvcC0+Y29tbW9uLm5leHQ7CiAJCQl9CiAJCX0KIAogCQkvKiBTZWFyY2ggdGhlIHBhcmVudCBsaXN0ICovCiAKLQkJZWxzZSB3aGlsZSAocHJldikgewotCQkJLyogVHJhdmVyc2UgYWxsIHNpYmxpbmdzIGluIHRoZSBwYXJlbnQncyBhcmd1bWVudCBsaXN0ICovCisJCWVsc2UKKwkJCXdoaWxlIChwcmV2KSB7CisJCQkJLyogVHJhdmVyc2UgYWxsIHNpYmxpbmdzIGluIHRoZSBwYXJlbnQncyBhcmd1bWVudCBsaXN0ICovCiAKLQkJCW5leHQgPSBwcmV2LT5jb21tb24ubmV4dDsKLQkJCWlmIChuZXh0ID09IG9wKSB7Ci0JCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7Ci0JCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ucGFyZW50ICAgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQkJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBOVUxMOwotCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5vZGUgICAgID0gb3AtPmNvbW1vbi5ub2RlOwotCQkJCQlwcmV2LT5jb21tb24ubmV4dCAgICAgICAgICAgICAgID0gcmVwbGFjZW1lbnRfb3A7Ci0JCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubmV4dCAgICAgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JCQkJCW5leHQgPSBOVUxMOworCQkJCW5leHQgPSBwcmV2LT5jb21tb24ubmV4dDsKKwkJCQlpZiAobmV4dCA9PSBvcCkgeworCQkJCQlpZiAocmVwbGFjZW1lbnRfb3ApIHsKKwkJCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ucGFyZW50ID0KKwkJCQkJCSAgICBvcC0+Y29tbW9uLnBhcmVudDsKKwkJCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24udmFsdWUuCisJCQkJCQkgICAgYXJnID0gTlVMTDsKKwkJCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubm9kZSA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5ub2RlOworCQkJCQkJcHJldi0+Y29tbW9uLm5leHQgPQorCQkJCQkJICAgIHJlcGxhY2VtZW50X29wOworCQkJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5uZXh0ID0KKwkJCQkJCSAgICBvcC0+Y29tbW9uLm5leHQ7CisJCQkJCQluZXh0ID0gTlVMTDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0KKwkJCQkJCSAgICBvcC0+Y29tbW9uLm5leHQ7CisJCQkJCQluZXh0ID0gTlVMTDsKKwkJCQkJfQogCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJldi0+Y29tbW9uLm5leHQgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JCQkJCW5leHQgPSBOVUxMOwotCQkJCX0KKwkJCQlwcmV2ID0gbmV4dDsKIAkJCX0KLQkJCXByZXYgPSBuZXh0OwotCQl9CiAJfQogCi0KLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCiAJLyogTm93IHdlIGNhbiBhY3R1YWxseSBkZWxldGUgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IE9wICovCiAKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlIChvcCk7Ci0JcmV0dXJuX1ZPSUQ7Ci19CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAorICAgICAgYWxsb2NhdGVfZXJyb3I6CisKKwkvKiBBbHdheXMgZGVsZXRlIHRoZSBzdWJ0cmVlLCBldmVuIG9uIGVycm9yICovCisKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zMTcsMTggKzMyMSwxNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfc3RhdHVzKQorYWNwaV9zdGF0dXMKK2FjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSBhY3BpX3N0YXR1cyBjYWxsYmFja19zdGF0dXMpCiB7Ci0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9DVFJMX1BFTkRJTkc7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfbmV4dF9wYXJzZV9zdGF0ZSIsIG9wKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19uZXh0X3BhcnNlX3N0YXRlIiwgb3ApOwogCiAJc3dpdGNoIChjYWxsYmFja19zdGF0dXMpIHsKIAljYXNlIEFFX0NUUkxfVEVSTUlOQVRFOgpAQCAtMzQxLDcgKzM0Miw2IEBACiAJCXN0YXR1cyA9IEFFX0NUUkxfVEVSTUlOQVRFOwogCQlicmVhazsKIAotCiAJY2FzZSBBRV9DVFJMX0JSRUFLOgogCiAJCXBhcnNlcl9zdGF0ZS0+YW1sID0gd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGU7CkBAIC0zNTEsNyArMzUxLDYgQEAKIAogCWNhc2UgQUVfQ1RSTF9DT05USU5VRToKIAotCiAJCXBhcnNlcl9zdGF0ZS0+YW1sID0gd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGU7CiAJCXN0YXR1cyA9IEFFX0NUUkxfQ09OVElOVUU7CiAJCWJyZWFrOwpAQCAtMzc1LDEwICszNzQsOSBAQAogCQkgKiBQcmVkaWNhdGUgb2YgYW4gSUYgd2FzIHRydWUsIGFuZCB3ZSBhcmUgYXQgdGhlIG1hdGNoaW5nIEVMU0UuCiAJCSAqIEp1c3QgY2xvc2Ugb3V0IHRoaXMgcGFja2FnZQogCQkgKi8KLQkJcGFyc2VyX3N0YXRlLT5hbWwgPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kIChwYXJzZXJfc3RhdGUpOworCQlwYXJzZXJfc3RhdGUtPmFtbCA9IGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQocGFyc2VyX3N0YXRlKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUVfQ1RSTF9GQUxTRToKIAogCQkvKgpAQCAtMzk2LDcgKzM5NCw2IEBACiAJCXN0YXR1cyA9IEFFX0NUUkxfRU5EOwogCQlicmVhazsKIAotCiAJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgogCiAJCS8qIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wgKi8KQEAgLTQwNCwxNCArNDAxLDE1IEBACiAJCXN0YXR1cyA9IEFFX0NUUkxfVFJBTlNGRVI7CiAJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBvcDsKIAkJd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfb3AgPSBvcDsKLQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfbm9kZSA9IChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi5ub2RlOworCQl3YWxrX3N0YXRlLT5tZXRob2RfY2FsbF9ub2RlID0KKwkJICAgIChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi5ub2RlOwogCiAJCS8qIFdpbGwgcmV0dXJuIHZhbHVlIChpZiBhbnkpIGJlIHVzZWQgYnkgdGhlIGNhbGxlcj8gKi8KIAotCQl3YWxrX3N0YXRlLT5yZXR1cm5fdXNlZCA9IGFjcGlfZHNfaXNfcmVzdWx0X3VzZWQgKG9wLCB3YWxrX3N0YXRlKTsKKwkJd2Fsa19zdGF0ZS0+cmV0dXJuX3VzZWQgPQorCQkgICAgYWNwaV9kc19pc19yZXN1bHRfdXNlZChvcCwgd2Fsa19zdGF0ZSk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCiAJCXN0YXR1cyA9IGNhbGxiYWNrX3N0YXR1czsKQEAgLTQyMSw2NjcgKzQxOSw5IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3BhcnNlX2xvb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBhcnNlIEFNTCAocG9pbnRlZCB0byBieSB0aGUgY3VycmVudCBwYXJzZXIgc3RhdGUpIGFuZCByZXR1cm4KLSAqICAgICAgICAgICAgICBhIHRyZWUgb2Ygb3BzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wc19wYXJzZV9sb29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AgPSBOVUxMOyAgICAgLyogY3VycmVudCBvcCAqLwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZyA9IE5VTEw7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcHJlX29wID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX29wX3N0YXJ0ID0gTlVMTDsKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJwc19wYXJzZV9sb29wIiwgd2Fsa19zdGF0ZSk7Ci0KLQlpZiAod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayA9PSBOVUxMKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKLQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOwotCi0jaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCi0KLQlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlICYgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUKSB7Ci0JCS8qIFdlIGFyZSByZXN0YXJ0aW5nIGEgcHJlZW1wdGVkIGNvbnRyb2wgbWV0aG9kICovCi0KLQkJaWYgKGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZSAocGFyc2VyX3N0YXRlKSkgewotCQkJLyoKLQkJCSAqIFdlIG11c3QgY2hlY2sgaWYgYSBwcmVkaWNhdGUgdG8gYW4gSUYgb3IgV0hJTEUgc3RhdGVtZW50Ci0JCQkgKiB3YXMganVzdCBjb21wbGV0ZWQKLQkJCSAqLwotCQkJaWYgKChwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5vcCkgJiYKLQkJCSAgICgocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JRl9PUCkgfHwKLQkJCQkocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9XSElMRV9PUCkpICYmCi0JCQkJKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCi0JCQkJKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQotCQkJCQlBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORykpIHsKLQkJCQkvKgotCQkJCSAqIEEgcHJlZGljYXRlIHdhcyBqdXN0IGNvbXBsZXRlZCwgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQkJCQkgKiBwcmVkaWNhdGUgYW5kIGJyYW5jaCBiYXNlZCBvbiB0aGF0IHZhbHVlCi0JCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOwotCQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAod2Fsa19zdGF0ZSwgQUNQSV9UT19QT0lOVEVSIChUUlVFKSk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJgotCQkJCQkoKHN0YXR1cyAmIEFFX0NPREVfTUFTSykgIT0gQUVfQ09ERV9DT05UUk9MKSkgewotCQkJCQlpZiAoc3RhdHVzID09IEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpIHsKLQkJCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSJJbnZva2VkIG1ldGhvZCBkaWQgbm90IHJldHVybiBhIHZhbHVlLCAlc1xuIiwKLQkJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQotCQkJCQl9Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJImdldF9wcmVkaWNhdGUgRmFpbGVkLCAlc1xuIiwKLQkJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlICh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKLQkJCX0KLQotCQkJYWNwaV9wc19wb3Bfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgJm9wLAotCQkJCSZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsICJQb3BwZWQgc2NvcGUsIE9wPSVwXG4iLCBvcCkpOwotCQl9Ci0JCWVsc2UgaWYgKHdhbGtfc3RhdGUtPnByZXZfb3ApIHsKLQkJCS8qIFdlIHdlcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBvcCAqLwotCi0JCQlvcCA9IHdhbGtfc3RhdGUtPnByZXZfb3A7Ci0JCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlczsKLQkJfQotCX0KLSNlbmRpZgotCi0JLyogSXRlcmF0aXZlIHBhcnNpbmcgbG9vcCwgd2hpbGUgdGhlcmUgaXMgbW9yZSBBTUwgdG8gcHJvY2VzczogKi8KLQotCXdoaWxlICgocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPmFtbF9lbmQpIHx8IChvcCkpIHsKLQkJYW1sX29wX3N0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JCWlmICghb3ApIHsKLQkJCS8qIEdldCB0aGUgbmV4dCBvcGNvZGUgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLwotCi0JCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0gKHUzMikgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOwotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlICAgPSBhY3BpX3BzX3BlZWtfb3Bjb2RlIChwYXJzZXJfc3RhdGUpOwotCi0JCQkvKgotCQkJICogRmlyc3QgY3V0IHRvIGRldGVybWluZSB3aGF0IHdlIGhhdmUgZm91bmQ6Ci0JCQkgKiAxKSBBIHZhbGlkIEFNTCBvcGNvZGUKLQkJCSAqIDIpIEEgbmFtZSBzdHJpbmcKLQkJCSAqIDMpIEFuIHVua25vd24vaW52YWxpZCBvcGNvZGUKLQkJCSAqLwotCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvICh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQkJc3dpdGNoICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcykgewotCQkJY2FzZSBBTUxfQ0xBU1NfQVNDSUk6Ci0JCQljYXNlIEFNTF9DTEFTU19QUkVGSVg6Ci0JCQkJLyoKLQkJCQkgKiBTdGFydHMgd2l0aCBhIHZhbGlkIHByZWZpeCBvciBBU0NJSSBjaGFyLCB0aGlzIGlzIGEgbmFtZQotCQkJCSAqIHN0cmluZy4gIENvbnZlcnQgdGhlIGJhcmUgbmFtZSBzdHJpbmcgdG8gYSBuYW1lcGF0aC4KLQkJCQkgKi8KLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBBTUxfSU5UX05BTUVQQVRIX09QOwotCQkJCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IEFSR1BfTkFNRVNUUklORzsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBTUxfQ0xBU1NfVU5LTk9XTjoKLQotCQkJCS8qIFRoZSBvcGNvZGUgaXMgdW5yZWNvZ25pemVkLiAgSnVzdCBza2lwIHVua25vd24gb3Bjb2RlcyAqLwotCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJGb3VuZCB1bmtub3duIG9wY29kZSAlWCBhdCBBTUwgYWRkcmVzcyAlcCBvZmZzZXQgJVgsIGlnbm9yaW5nXG4iLAotCQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUsIHBhcnNlcl9zdGF0ZS0+YW1sLCB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0KSk7Ci0KLQkJCQlBQ1BJX0RVTVBfQlVGRkVSIChwYXJzZXJfc3RhdGUtPmFtbCwgMTI4KTsKLQotCQkJCS8qIEFzc3VtZSBvbmUtYnl0ZSBiYWQgb3Bjb2RlICovCi0KLQkJCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwotCQkJCWNvbnRpbnVlOwotCi0JCQlkZWZhdWx0OgotCi0JCQkJLyogRm91bmQgb3Bjb2RlIGluZm8sIHRoaXMgaXMgYSBub3JtYWwgb3Bjb2RlICovCi0KLQkJCQlwYXJzZXJfc3RhdGUtPmFtbCArPSBhY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQkJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5wYXJzZV9hcmdzOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBDcmVhdGUgT3Agc3RydWN0dXJlIGFuZCBhcHBlbmQgdG8gcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLwotCi0JCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKLQkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBwcmVfb3AgaWYgbmVjZXNzYXJ5ICovCi0KLQkJCQlpZiAoIXByZV9vcCkgewotCQkJCQlwcmVfb3AgPSBhY3BpX3BzX2FsbG9jX29wICh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQkJCQlpZiAoIXByZV9vcCkgewotCQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHJlX29wLT5jb21tb24udmFsdWUuYXJnID0gTlVMTDsKLQkJCQlwcmVfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gd2Fsa19zdGF0ZS0+b3Bjb2RlOwotCi0JCQkJLyoKLQkJCQkgKiBHZXQgYW5kIGFwcGVuZCBhcmd1bWVudHMgdW50aWwgd2UgZmluZCB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zCi0JCQkJICogdGhlIG5hbWUgKHRoZSB0eXBlIEFSR1BfTkFNRSkuCi0JCQkJICovCi0JCQkJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICYmCi0JCQkJCSAgKEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICE9IEFSR1BfTkFNRSkpIHsKLQkJCQkJc3RhdHVzID0gYWNwaV9wc19nZXRfbmV4dF9hcmcgKHdhbGtfc3RhdGUsIHBhcnNlcl9zdGF0ZSwKLQkJCQkJCQkgR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPmFyZ190eXBlcyksICZhcmcpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJCX0KLQotCQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcgKHByZV9vcCwgYXJnKTsKLQkJCQkJSU5DUkVNRU5UX0FSR19MSVNUICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogTWFrZSBzdXJlIHRoYXQgd2UgZm91bmQgYSBOQU1FIGFuZCBkaWRuJ3QgcnVuIG91dCBvZgotCQkJCSAqIGFyZ3VtZW50cwotCQkJCSAqLwotCQkJCWlmICghR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykpIHsKLQkJCQkJc3RhdHVzID0gQUVfQU1MX05PX09QRVJBTkQ7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQkvKiBXZSBrbm93IHRoYXQgdGhpcyBhcmcgaXMgYSBuYW1lLCBtb3ZlIHRvIG5leHQgYXJnICovCi0KLQkJCQlJTkNSRU1FTlRfQVJHX0xJU1QgKHdhbGtfc3RhdGUtPmFyZ190eXBlcyk7Ci0KLQkJCQkvKgotCQkJCSAqIEZpbmQgdGhlIG9iamVjdC4gIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bwotCQkJCSAqIHRoZSBuYW1lc3BhY2Ugb3Igc2ltcGx5IGxvb2sgaXQgdXAKLQkJCQkgKi8KLQkJCQl3YWxrX3N0YXRlLT5vcCA9IE5VTEw7Ci0KLQkJCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrICh3YWxrX3N0YXRlLCAmb3ApOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiRHVyaW5nIG5hbWUgbG9va3VwL2NhdGFsb2csICVzXG4iLAotCQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQlpZiAoIW9wKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcgKG9wLCBwcmVfb3AtPmNvbW1vbi52YWx1ZS5hcmcpOwotCQkJCWFjcGlfZ2JsX2RlcHRoKys7Ci0KLQkJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKLQkJCQkJLyoKLQkJCQkJICogRGVmZXIgZmluYWwgcGFyc2luZyBvZiBhbiBvcGVyYXRpb25fcmVnaW9uIGJvZHksCi0JCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcwotCQkJCQkgKiB0byBwYXJzZSBpdCBjb3JyZWN0bHkgKGkuZS4sIHRoZXJlIG1heSBiZSBtZXRob2QKLQkJCQkJICogY2FsbHMgd2l0aGluIHRoZSB0ZXJtX2FyZyBlbGVtZW50cyBvZiB0aGUgYm9keS4pCi0JCQkJCSAqCi0JCQkJCSAqIEhvd2V2ZXIsIHdlIG11c3QgY29udGludWUgcGFyc2luZyBiZWNhdXNlCi0JCQkJCSAqIHRoZSBvcHJlZ2lvbiBpcyBub3QgYSBzdGFuZGFsb25lIHBhY2thZ2UgLS0KLQkJCQkJICogd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgZW5kIGlzIGF0IHRoaXMgcG9pbnQuCi0JCQkJCSAqCi0JCQkJCSAqIChMZW5ndGggaXMgdW5rbm93biB1bnRpbCBwYXJzZSBvZiB0aGUgYm9keSBjb21wbGV0ZSkKLQkJCQkJICovCi0JCQkJCW9wLT5uYW1lZC5kYXRhICAgID0gYW1sX29wX3N0YXJ0OwotCQkJCQlvcC0+bmFtZWQubGVuZ3RoICA9IDA7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm90IGEgbmFtZWQgb3Bjb2RlLCBqdXN0IGFsbG9jYXRlIE9wIGFuZCBhcHBlbmQgdG8gcGFyZW50ICovCi0KLQkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKHdhbGtfc3RhdGUtPm9wY29kZSk7Ci0JCQkJb3AgPSBhY3BpX3BzX2FsbG9jX29wICh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQkJCWlmICghb3ApIHsKLQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0NSRUFURSkgewotCQkJCQkvKgotCQkJCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbgotCQkJCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5Ci0JCQkJCSAqLwotCQkJCQlvcC0+bmFtZWQuZGF0YSAgICA9IGFtbF9vcF9zdGFydDsKLQkJCQkJb3AtPm5hbWVkLmxlbmd0aCAgPSAwOwotCQkJCX0KLQotCQkJCWFjcGlfcHNfYXBwZW5kX2FyZyAoYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlIChwYXJzZXJfc3RhdGUpLCBvcCk7Ci0KLQkJCQlpZiAoKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkpIHsKLQkJCQkJLyoKLQkJCQkJICogRmluZCB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KLQkJCQkJICogdGhlIG5hbWVzcGFjZSBvciBzaW1wbHkgbG9vayBpdCB1cAotCQkJCQkgKi8KLQkJCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKLQotCQkJCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrICh3YWxrX3N0YXRlLCAmb3ApOwotCQkJCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCQkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgewotCQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJCX0KLQotCQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCW9wLT5jb21tb24uYW1sX29mZnNldCA9IHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQ7Ci0KLQkJCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCQkJCSJPcGNvZGUgJTQuNFggWyVzXSBPcCAlcCBBbWwgJXAgYW1sX29mZnNldCAlNS41WFxuIiwKLQkJCQkJICh1MzIpIG9wLT5jb21tb24uYW1sX29wY29kZSwgd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwKLQkJCQkJIG9wLCBwYXJzZXJfc3RhdGUtPmFtbCwgb3AtPmNvbW1vbi5hbWxfb2Zmc2V0KSk7Ci0JCQl9Ci0JCX0KLQotCi0JCS8qCi0JCSAqIFN0YXJ0IGFyZ19jb3VudCBhdCB6ZXJvIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhcmUKLQkJICogYW55IGFyZ3MgeWV0Ci0JCSAqLwotCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOwotCi0JCS8qIEFyZSB0aGVyZSBhbnkgYXJndW1lbnRzIHRoYXQgbXVzdCBiZSBwcm9jZXNzZWQ/ICovCi0KLQkJaWYgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgewotCQkJLyogR2V0IGFyZ3VtZW50cyAqLwotCi0JCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewotCQkJY2FzZSBBTUxfQllURV9PUDogICAgICAgLyogQU1MX0JZVEVEQVRBX0FSRyAqLwotCQkJY2FzZSBBTUxfV09SRF9PUDogICAgICAgLyogQU1MX1dPUkREQVRBX0FSRyAqLwotCQkJY2FzZSBBTUxfRFdPUkRfT1A6ICAgICAgLyogQU1MX0RXT1JEQVRBX0FSRyAqLwotCQkJY2FzZSBBTUxfUVdPUkRfT1A6ICAgICAgLyogQU1MX1FXT1JEQVRBX0FSRyAqLwotCQkJY2FzZSBBTUxfU1RSSU5HX09QOiAgICAgLyogQU1MX0FTQ0lJQ0hBUkxJU1RfQVJHICovCi0KLQkJCQkvKiBGaWxsIGluIGNvbnN0YW50IG9yIHN0cmluZyBhcmd1bWVudCBkaXJlY3RseSAqLwotCi0JCQkJYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnIChwYXJzZXJfc3RhdGUsCi0JCQkJCUdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLCBvcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDogICAvKiBBTUxfTkFNRVNUUklOR19BUkcgKi8KLQotCQkJCXN0YXR1cyA9IGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGggKHdhbGtfc3RhdGUsIHBhcnNlcl9zdGF0ZSwgb3AsIDEpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCX0KLQotCQkJCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0KLQkJCQkvKgotCQkJCSAqIE9wIGlzIG5vdCBhIGNvbnN0YW50IG9yIHN0cmluZywgYXBwZW5kIGVhY2ggYXJndW1lbnQKLQkJCQkgKiB0byB0aGUgT3AKLQkJCQkgKi8KLQkJCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgJiYKLQkJCQkJCSF3YWxrX3N0YXRlLT5hcmdfY291bnQpIHsKLQkJCQkJd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9ICh1MzIpCi0JCQkJCQlBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwgcGFyc2VyX3N0YXRlLT5hbWxfc3RhcnQpOwotCi0JCQkJCXN0YXR1cyA9IGFjcGlfcHNfZ2V0X25leHRfYXJnICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsCi0JCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLAotCQkJCQkJCSAmYXJnKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGFyZykgewotCQkJCQkJYXJnLT5jb21tb24uYW1sX29mZnNldCA9IHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQ7Ci0JCQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcgKG9wLCBhcmcpOwotCQkJCQl9Ci0JCQkJCUlOQ1JFTUVOVF9BUkdfTElTVCAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKLQkJCQl9Ci0KLQkJCQkvKiBTcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGNlcnRhaW4gb3Bjb2RlcyAqLwotCi0JCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQkJCQljYXNlIEFNTF9NRVRIT0RfT1A6Ci0KLQkJCQkJLyoKLQkJCQkJICogU2tpcCBwYXJzaW5nIG9mIGNvbnRyb2wgbWV0aG9kCi0JCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcwotCQkJCQkgKiB0byBwYXJzZSBpdCBjb3JyZWN0bHkuCi0JCQkJCSAqCi0JCQkJCSAqIFNhdmUgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBvZiB0aGUgYm9keQotCQkJCQkgKi8KLQkJCQkJb3AtPm5hbWVkLmRhdGEgICA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCAtCi0JCQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwotCi0JCQkJCS8qIFNraXAgYm9keSBvZiBtZXRob2QgKi8KLQotCQkJCQlwYXJzZXJfc3RhdGUtPmFtbCAgID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwotCQkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQU1MX0JVRkZFUl9PUDoKLQkJCQljYXNlIEFNTF9QQUNLQUdFX09QOgotCQkJCWNhc2UgQU1MX1ZBUl9QQUNLQUdFX09QOgotCi0JCQkJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQpICYmCi0JCQkJCQkob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9OQU1FX09QKSAmJgotCQkJCQkJKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgIT0gYWNwaV9kc19leGVjX2JlZ2luX29wKSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIFNraXAgcGFyc2luZyBvZiBCdWZmZXJzIGFuZCBQYWNrYWdlcwotCQkJCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCi0JCQkJCQkgKiB0byBwYXJzZSB0aGVtIGNvcnJlY3RseS4KLQkJCQkJCSAqLwotCQkJCQkJb3AtPm5hbWVkLmRhdGEgICA9IGFtbF9vcF9zdGFydDsKLQkJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0KLQkJCQkJCQkJICAgYW1sX29wX3N0YXJ0KTsKLQotCQkJCQkJLyogU2tpcCBib2R5ICovCi0KLQkJCQkJCXBhcnNlcl9zdGF0ZS0+YW1sICAgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JCQkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBTUxfV0hJTEVfT1A6Ci0KLQkJCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpIHsKLQkJCQkJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucGFja2FnZV9lbmQgPQotCQkJCQkJCXBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0KLQkJCQkJLyogTm8gYWN0aW9uIGZvciBhbGwgb3RoZXIgb3Bjb2RlcyAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgYXJndW1lbnRzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQgKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7Ci0JCQkvKgotCQkJICogVGhlcmUgYXJlIGFyZ3VtZW50cyAoY29tcGxleCBvbmVzKSwgcHVzaCBPcCBhbmQKLQkJCSAqIHByZXBhcmUgZm9yIGFyZ3VtZW50Ci0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcHNfcHVzaF9zY29wZSAocGFyc2VyX3N0YXRlLCBvcCwKLQkJCQkJIHdhbGtfc3RhdGUtPmFyZ190eXBlcywgd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQl9Ci0JCQlvcCA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIEFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAtLSBPcCBpcyBjb21wbGV0ZSwKLQkJICogcHJlcGFyZSBmb3IgbmV4dAotCQkgKi8KLQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKLQkJCWlmIChhY3BpX2dibF9kZXB0aCkgewotCQkJCWFjcGlfZ2JsX2RlcHRoLS07Ci0JCQl9Ci0KLQkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgewotCQkJCS8qCi0JCQkJICogU2tpcCBwYXJzaW5nIG9mIGNvbnRyb2wgbWV0aG9kIG9yIG9wcmVnaW9uIGJvZHksCi0JCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCi0JCQkJICogdG8gcGFyc2UgdGhlbSBjb3JyZWN0bHkuCi0JCQkJICoKLQkJCQkgKiBDb21wbGV0ZWQgcGFyc2luZyBhbiBvcF9yZWdpb24gZGVjbGFyYXRpb24sIHdlIG5vdwotCQkJCSAqIGtub3cgdGhlIGxlbmd0aC4KLQkJCQkgKi8KLQkJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikgKHBhcnNlcl9zdGF0ZS0+YW1sIC0gb3AtPm5hbWVkLmRhdGEpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0NSRUFURSkgewotCQkJLyoKLQkJCSAqIEJhY2t1cCB0byBiZWdpbm5pbmcgb2YgY3JlYXRlX3hYWGZpZWxkIGRlY2xhcmF0aW9uICgxIGZvcgotCQkJICogT3Bjb2RlKQotCQkJICoKLQkJCSAqIGJvZHlfbGVuZ3RoIGlzIHVua25vd24gdW50aWwgd2UgcGFyc2UgdGhlIGJvZHkKLQkJCSAqLwotCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKLQkJfQotCi0JCS8qIFRoaXMgb3AgY29tcGxldGUsIG5vdGlmeSB0aGUgZGlzcGF0Y2hlciAqLwotCi0JCWlmICh3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkgewotCQkJd2Fsa19zdGF0ZS0+b3AgICAgPSBvcDsKLQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKLQotCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICh3YWxrX3N0YXRlKTsKLQkJCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7Ci0JCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgewotCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCX0KLQkJfQotCi0KLWNsb3NlX3RoaXNfb3A6Ci0JCS8qCi0JCSAqIEZpbmlzaGVkIG9uZSBhcmd1bWVudCBvZiB0aGUgY29udGFpbmluZyBzY29wZQotCQkgKi8KLQkJcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50LS07Ci0KLQkJLyogQ2xvc2UgdGhpcyBPcCAod2lsbCByZXN1bHQgaW4gcGFyc2Ugc3VidHJlZSBkZWxldGlvbikgKi8KLQotCQlhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKHdhbGtfc3RhdGUsIG9wKTsKLQkJb3AgPSBOVUxMOwotCQlpZiAocHJlX29wKSB7Ci0JCQlhY3BpX3BzX2ZyZWVfb3AgKHByZV9vcCk7Ci0JCQlwcmVfb3AgPSBOVUxMOwotCQl9Ci0KLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBBRV9PSzoKLQkJCWJyZWFrOwotCi0KLQkJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgotCi0JCQkvKiBXZSBhcmUgYWJvdXQgdG8gdHJhbnNmZXIgdG8gYSBjYWxsZWQgbWV0aG9kLiAqLwotCi0JCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQotCi0JCWNhc2UgQUVfQ1RSTF9FTkQ6Ci0KLQkJCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLCAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQotCQkJaWYgKG9wKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+b3AgICAgPSBvcDsKLQkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSk7Ci0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICh3YWxrX3N0YXRlKTsKLQkJCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCi0JCQkJYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQkJb3AgPSBOVUxMOwotCQkJfQotCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUVfQ1RSTF9CUkVBSzoKLQkJY2FzZSBBRV9DVFJMX0NPTlRJTlVFOgotCi0JCQkvKiBQb3Agb2ZmIHNjb3BlcyB1bnRpbCB3ZSBmaW5kIHRoZSBXaGlsZSAqLwotCi0JCQl3aGlsZSAoIW9wIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1dISUxFX09QKSkgewotCQkJCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0JCQl9Ci0KLQkJCS8qIENsb3NlIHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBXaGlsZSBsb29wICovCi0KLQkJCXdhbGtfc3RhdGUtPm9wICAgID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSk7Ci0JCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0KLQkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayAod2Fsa19zdGF0ZSk7Ci0JCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCi0JCQlhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKHdhbGtfc3RhdGUsIG9wKTsKLQkJCW9wID0gTlVMTDsKLQotCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUVfQ1RSTF9URVJNSU5BVEU6Ci0KLQkJCXN0YXR1cyA9IEFFX09LOwotCi0JCQkvKiBDbGVhbiB1cCAqLwotCQkJZG8gewotCQkJCWlmIChvcCkgewotCQkJCQlhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKHdhbGtfc3RhdGUsIG9wKTsKLQkJCQl9Ci0JCQkJYWNwaV9wc19wb3Bfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgJm9wLAotCQkJCQkmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLCAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQotCQkJfSB3aGlsZSAob3ApOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0KLQotCQlkZWZhdWx0OiAgLyogQWxsIG90aGVyIG5vbi1BRV9PSyBzdGF0dXMgKi8KLQotCQkJZG8gewotCQkJCWlmIChvcCkgewotCQkJCQlhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AgKHdhbGtfc3RhdGUsIG9wKTsKLQkJCQl9Ci0JCQkJYWNwaV9wc19wb3Bfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgJm9wLAotCQkJCQkmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLCAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQotCQkJfSB3aGlsZSAob3ApOwotCi0KLQkJCS8qCi0JCQkgKiBUQkQ6IENsZWFudXAgcGFyc2Ugb3BzIG9uIGVycm9yCi0JCQkgKi8KLSNpZiAwCi0JCQlpZiAob3AgPT0gTlVMTCkgewotCQkJCWFjcGlfcHNfcG9wX3Njb3BlIChwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0JCQl9Ci0jZW5kaWYKLQkJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBvcDsKLQkJCXdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+YXJnX3R5cGVzOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotCQl9Ci0KLQkJLyogVGhpcyBzY29wZSBjb21wbGV0ZT8gKi8KLQotCQlpZiAoYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlIChwYXJzZXJfc3RhdGUpKSB7Ci0JCQlhY3BpX3BzX3BvcF9zY29wZSAocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgIlBvcHBlZCBzY29wZSwgT3A9JXBcbiIsIG9wKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvcCA9IE5VTEw7Ci0JCX0KLQotCX0gLyogd2hpbGUgcGFyc2VyX3N0YXRlLT5BbWwgKi8KLQotCi0JLyoKLQkgKiBDb21wbGV0ZSB0aGUgbGFzdCBPcCAoaWYgbm90IGNvbXBsZXRlZCksIGFuZCBjbGVhciB0aGUgc2NvcGUgc3RhY2suCi0JICogSXQgaXMgZWFzaWx5IHBvc3NpYmxlIHRvIGVuZCBhbiBBTUwgInBhY2thZ2UiIHdpdGggYW4gdW5ib3VuZGVkIG51bWJlcgotCSAqIG9mIG9wZW4gc2NvcGVzIChzdWNoIGFzIHdoZW4gc2V2ZXJhbCBBU0wgYmxvY2tzIGFyZSBjbG9zZWQgd2l0aAotCSAqIHNlcXVlbnRpYWwgY2xvc2luZyBicmFjZXMpLiAgV2Ugd2FudCB0byB0ZXJtaW5hdGUgZWFjaCBvbmUgY2xlYW5seS4KLQkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgIkFNTCBwYWNrYWdlIGNvbXBsZXRlIGF0IE9wICVwXG4iLCBvcCkpOwotCWRvIHsKLQkJaWYgKG9wKSB7Ci0JCQlpZiAod2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJCQl3YWxrX3N0YXRlLT5vcCAgICA9IG9wOwotCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0KLQkJCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgKHdhbGtfc3RhdGUpOwotCQkJCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfVEVSTUlOQVRFKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX09LOwotCi0JCQkJCS8qIENsZWFuIHVwICovCi0JCQkJCWRvIHsKLQkJCQkJCWlmIChvcCkgewotCQkJCQkJCWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAod2Fsa19zdGF0ZSwgb3ApOwotCQkJCQkJfQotCi0JCQkJCQlhY3BpX3BzX3BvcF9zY29wZSAocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJCQkJJndhbGtfc3RhdGUtPmFyZ190eXBlcywgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJCQkJfSB3aGlsZSAob3ApOwotCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCQllbHNlIGlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQkJYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAod2Fsa19zdGF0ZSwgb3ApOwotCQl9Ci0KLQkJYWNwaV9wc19wb3Bfc2NvcGUgKHBhcnNlcl9zdGF0ZSwgJm9wLCAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQl9IHdoaWxlIChvcCk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9hbWwKQEAgLTEwOTUsMzQgKzQzNSwyOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3BzX3BhcnNlX2FtbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfcHNfcGFyc2VfYW1sKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVfc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZDsKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICpwcmV2X3dhbGtfbGlzdCA9IGFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0OwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKnByZXZpb3VzX3dhbGtfc3RhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkOworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqcHJldl93YWxrX2xpc3QgPSBhY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdDsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICpwcmV2aW91c193YWxrX3N0YXRlOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfcGFyc2VfYW1sIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfcGFyc2VfYW1sIik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwKLQkJIkVudGVyZWQgd2l0aCB3YWxrX3N0YXRlPSVwIEFtbD0lcCBzaXplPSVYXG4iLAotCQl3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sLAotCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sX3NpemUpKTsKLQorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkgICJFbnRlcmVkIHdpdGggd2Fsa19zdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKKwkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwKKwkJCSAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9zaXplKSk7CiAKIAkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdGhyZWFkIHN0YXRlICovCiAKLQl0aHJlYWQgPSBhY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUgKCk7CisJdGhyZWFkID0gYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlKCk7CiAJaWYgKCF0aHJlYWQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAl3YWxrX3N0YXRlLT50aHJlYWQgPSB0aHJlYWQ7Ci0JYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUgKHdhbGtfc3RhdGUsIHRocmVhZCk7CisJYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSwgdGhyZWFkKTsKIAogCS8qCiAJICogVGhpcyBnbG9iYWwgYWxsb3dzIHRoZSBBTUwgZGVidWdnZXIgdG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBjdXJyZW50bHkKQEAgLTExMzQsMTMwICs0NjksMTM2IEBACiAJICogRXhlY3V0ZSB0aGUgd2FsayBsb29wIGFzIGxvbmcgYXMgdGhlcmUgaXMgYSB2YWxpZCBXYWxrIFN0YXRlLiAgVGhpcwogCSAqIGhhbmRsZXMgbmVzdGVkIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb25zIHdpdGhvdXQgcmVjdXJzaW9uLgogCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiU3RhdGU9JXBcbiIsIHdhbGtfc3RhdGUpKTsKIAogCXN0YXR1cyA9IEFFX09LOwogCXdoaWxlICh3YWxrX3N0YXRlKSB7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkvKgogCQkJICogVGhlIHBhcnNlX2xvb3AgZXhlY3V0ZXMgQU1MIHVudGlsIHRoZSBtZXRob2QgdGVybWluYXRlcwogCQkJICogb3IgY2FsbHMgYW5vdGhlciBtZXRob2QuCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfbG9vcCAod2Fsa19zdGF0ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2xvb3Aod2Fsa19zdGF0ZSk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwKLQkJCSJDb21wbGV0ZWQgb25lIGNhbGwgdG8gd2FsayBsb29wLCAlcyBTdGF0ZT0lcFxuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCSAgIkNvbXBsZXRlZCBvbmUgY2FsbCB0byB3YWxrIGxvb3AsICVzIFN0YXRlPSVwXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIHdhbGtfc3RhdGUpKTsKIAogCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfVFJBTlNGRVIpIHsKIAkJCS8qCiAJCQkgKiBBIG1ldGhvZCBjYWxsIHdhcyBkZXRlY3RlZC4KIAkJCSAqIFRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIGNhbGxlZCBjb250cm9sIG1ldGhvZAogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2QgKHRocmVhZCwgd2Fsa19zdGF0ZSwgTlVMTCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfY2FsbF9jb250cm9sX21ldGhvZCh0aHJlYWQsIHdhbGtfc3RhdGUsCisJCQkJCQkJTlVMTCk7CiAKIAkJCS8qCiAJCQkgKiBJZiB0aGUgdHJhbnNmZXIgdG8gdGhlIG5ldyBtZXRob2QgbWV0aG9kIGNhbGwgd29ya2VkLCBhIG5ldyB3YWxrCiAJCQkgKiBzdGF0ZSB3YXMgY3JlYXRlZCAtLSBnZXQgaXQKIAkJCSAqLwotCQkJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSAodGhyZWFkKTsKKwkJCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUodGhyZWFkKTsKIAkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RFUk1JTkFURSkgeworCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RFUk1JTkFURSkgewogCQkJc3RhdHVzID0gQUVfT0s7Ci0JCX0KLQkJZWxzZSBpZiAoKHN0YXR1cyAhPSBBRV9PSykgJiYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSkgewotCQkJQUNQSV9SRVBPUlRfTUVUSE9EX0VSUk9SICgiTWV0aG9kIGV4ZWN1dGlvbiBmYWlsZWQiLAotCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLCBOVUxMLCBzdGF0dXMpOworCQl9IGVsc2UgaWYgKChzdGF0dXMgIT0gQUVfT0spICYmICh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYykpIHsKKwkJCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUigiTWV0aG9kIGV4ZWN1dGlvbiBmYWlsZWQiLAorCQkJCQkJIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLCBOVUxMLAorCQkJCQkJIHN0YXR1cyk7CisKKwkJCS8qIEVuc3VyZSBwcm9wZXIgY2xlYW51cCAqLworCisJCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyB8PSBBQ1BJX1BBUlNFX0VYRUNVVEU7CiAKIAkJCS8qIENoZWNrIGZvciBwb3NzaWJsZSBtdWx0aS10aHJlYWQgcmVlbnRyYW5jeSBwcm9ibGVtICovCiAKIAkJCWlmICgoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSAmJgotCQkJCSghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CisJCQkgICAgKCF3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSkpIHsKIAkJCQkvKgogCQkJCSAqIFRoaXMgbWV0aG9kIGlzIG1hcmtlZCBub3Rfc2VyaWFsaXplZCwgYnV0IGl0IHRyaWVkIHRvIGNyZWF0ZQogCQkJCSAqIGEgbmFtZWQgb2JqZWN0LCBjYXVzaW5nIHRoZSBzZWNvbmQgdGhyZWFkIGVudHJhbmNlIHRvIGZhaWwuCiAJCQkJICogV2Ugd2lsbCB3b3JrYXJvdW5kIHRoaXMgYnkgbWFya2luZyB0aGUgbWV0aG9kIHBlcm1hbmVudGx5CiAJCQkJICogYXMgU2VyaWFsaXplZC4KIAkJCQkgKi8KLQkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyB8PSBBTUxfTUVUSE9EX1NFUklBTElaRUQ7CisJCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgfD0KKwkJCQkgICAgQU1MX01FVEhPRF9TRVJJQUxJWkVEOwogCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPSAxOwogCQkJfQogCQl9CiAKLQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSB7Ci0JCQkvKiBEZWNyZW1lbnQgdGhlIHRocmVhZCBjb3VudCBvbiB0aGUgbWV0aG9kIHBhcnNlIHRyZWUgKi8KLQotCQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50KSB7Ci0JCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQtLTsKLQkJCX0KLQkJfQotCiAJCS8qIFdlIGFyZSBkb25lIHdpdGggdGhpcyB3YWxrLCBtb3ZlIG9uIHRvIHRoZSBwYXJlbnQgaWYgYW55ICovCiAKLQkJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfcG9wX3dhbGtfc3RhdGUgKHRocmVhZCk7CisJCXdhbGtfc3RhdGUgPSBhY3BpX2RzX3BvcF93YWxrX3N0YXRlKHRocmVhZCk7CiAKIAkJLyogUmVzZXQgdGhlIGN1cnJlbnQgc2NvcGUgdG8gdGhlIGJlZ2lubmluZyBvZiBzY29wZSBzdGFjayAqLwogCi0JCWFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIgKHdhbGtfc3RhdGUpOworCQlhY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyKHdhbGtfc3RhdGUpOwogCiAJCS8qCiAJCSAqIElmIHdlIGp1c3QgcmV0dXJuZWQgZnJvbSB0aGUgZXhlY3V0aW9uIG9mIGEgY29udHJvbCBtZXRob2QsCiAJCSAqIHRoZXJlJ3MgbG90cyBvZiBjbGVhbnVwIHRvIGRvCiAJCSAqLwotCQlpZiAoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09IEFDUElfUEFSU0VfRVhFQ1VURSkgewotCQkJdGVybWluYXRlX3N0YXR1cyA9IGFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kICh3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHRlcm1pbmF0ZV9zdGF0dXMpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkJIkNvdWxkIG5vdCB0ZXJtaW5hdGUgY29udHJvbCBtZXRob2QgcHJvcGVybHlcbiIpKTsKKwkJaWYgKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSA9PQorCQkgICAgQUNQSV9QQVJTRV9FWEVDVVRFKSB7CisJCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpIHsKKwkJCQkvKiBEZWNyZW1lbnQgdGhlIHRocmVhZCBjb3VudCBvbiB0aGUgbWV0aG9kIHBhcnNlIHRyZWUgKi8KIAotCQkJCS8qIElnbm9yZSBlcnJvciBhbmQgY29udGludWUgKi8KKwkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudC0tOwogCQkJfQorCisJCQlhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCh3YWxrX3N0YXRlKTsKIAkJfQogCiAJCS8qIERlbGV0ZSB0aGlzIHdhbGsgc3RhdGUgYW5kIGFsbCBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KIAotCQlhY3BpX3BzX2NsZWFudXBfc2NvcGUgKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOworCQlhY3BpX3BzX2NsZWFudXBfc2NvcGUoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSk7CiAKIAkJcHJldmlvdXNfd2Fsa19zdGF0ZSA9IHdhbGtfc3RhdGU7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCQkicmV0dXJuX3ZhbHVlPSVwLCBpbXBsaWNpdF92YWx1ZT0lcCBTdGF0ZT0lcFxuIiwKLQkJCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjLCB3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqLCB3YWxrX3N0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJICAicmV0dXJuX3ZhbHVlPSVwLCBpbXBsaWNpdF92YWx1ZT0lcCBTdGF0ZT0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjLAorCQkJCSAgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiwgd2Fsa19zdGF0ZSkpOwogCiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgcmVzdGFydGVkIGEgcHJlZW1wdGVkIHdhbGsgKi8KIAotCQl3YWxrX3N0YXRlID0gYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlICh0aHJlYWQpOworCQl3YWxrX3N0YXRlID0gYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlKHRocmVhZCk7CiAJCWlmICh3YWxrX3N0YXRlKSB7Ci0JCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCQkvKgogCQkJCSAqIFRoZXJlIGlzIGFub3RoZXIgd2FsayBzdGF0ZSwgcmVzdGFydCBpdC4KIAkJCQkgKiBJZiB0aGUgbWV0aG9kIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZCBieSB0aGUgcGFyZW50LAogCQkJCSAqIFRoZSBvYmplY3QgaXMgZGVsZXRlZAogCQkJCSAqLwogCQkJCWlmICghcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MpIHsKLQkJCQkJc3RhdHVzID0gYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kICh3YWxrX3N0YXRlLAotCQkJCQkJCSBwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKTsKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QKKwkJCQkJICAgICh3YWxrX3N0YXRlLAorCQkJCQkgICAgIHByZXZpb3VzX3dhbGtfc3RhdGUtPgorCQkJCQkgICAgIGltcGxpY2l0X3JldHVybl9vYmopOworCQkJCX0gZWxzZSB7CiAJCQkJCS8qCiAJCQkJCSAqIFdlIGhhdmUgYSB2YWxpZCByZXR1cm4gdmFsdWUsIGRlbGV0ZSBhbnkgaW1wbGljaXQKIAkJCQkJICogcmV0dXJuIHZhbHVlLgogCQkJCQkgKi8KLQkJCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4gKHByZXZpb3VzX3dhbGtfc3RhdGUpOworCQkJCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybgorCQkJCQkgICAgKHByZXZpb3VzX3dhbGtfc3RhdGUpOwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZCAod2Fsa19zdGF0ZSwKLQkJCQkJCQkgcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MpOworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kCisJCQkJCSAgICAod2Fsa19zdGF0ZSwKKwkJCQkJICAgICBwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyk7CiAJCQkJfQotCQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJCQkJd2Fsa19zdGF0ZS0+d2Fsa190eXBlIHw9IEFDUElfV0FMS19NRVRIT0RfUkVTVEFSVDsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkJd2Fsa19zdGF0ZS0+d2Fsa190eXBlIHw9CisJCQkJCSAgICBBQ1BJX1dBTEtfTUVUSE9EX1JFU1RBUlQ7CiAJCQkJfQotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCS8qIE9uIGVycm9yLCBkZWxldGUgYW55IHJldHVybiBvYmplY3QgKi8KIAotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MpOworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwcmV2aW91c193YWxrX3N0YXRlLT4KKwkJCQkJCQkgcmV0dXJuX2Rlc2MpOwogCQkJfQogCQl9CiAKQEAgLTEyNjgsMzcgKzYwOSwzNiBAQAogCQllbHNlIGlmIChwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpIHsKIAkJCWlmIChwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKSB7CiAJCQkJKihwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpID0KLQkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iajsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSAvKiBOVUxMIGlmIG5vIHJldHVybiB2YWx1ZSAqLworCQkJCSAgICBwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOVUxMIGlmIG5vIHJldHVybiB2YWx1ZSAqLwogCiAJCQkJKihwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpID0KLQkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2M7CisJCQkJICAgIHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKSB7CiAJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCBpdCwgbXVzdCBkZWxldGUgaXQgKi8KIAotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAocHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MpOworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwcmV2aW91c193YWxrX3N0YXRlLT4KKwkJCQkJCQkgcmV0dXJuX2Rlc2MpOwogCQkJfQogCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKIAkJCQkvKiBDYWxsZXIgZG9lc24ndCB3YW50IGl0LCBtdXN0IGRlbGV0ZSBpdCAqLwogCi0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKTsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocHJldmlvdXNfd2Fsa19zdGF0ZS0+CisJCQkJCQkJIGltcGxpY2l0X3JldHVybl9vYmopOwogCQkJfQogCQl9CiAKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAocHJldmlvdXNfd2Fsa19zdGF0ZSk7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUocHJldmlvdXNfd2Fsa19zdGF0ZSk7CiAJfQogCiAJLyogTm9ybWFsIGV4aXQgKi8KIAotCWFjcGlfZXhfcmVsZWFzZV9hbGxfbXV0ZXhlcyAodGhyZWFkKTsKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIChBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUsIHRocmVhZCkpOworCWFjcGlfZXhfcmVsZWFzZV9hbGxfbXV0ZXhlcyh0aHJlYWQpOworCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoQUNQSV9DQVNUX1BUUgorCQkJCSAgICAgKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSwgdGhyZWFkKSk7CiAJYWNwaV9nYmxfY3VycmVudF93YWxrX2xpc3QgPSBwcmV2X3dhbGtfbGlzdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwppbmRleCA4ZGNkMWIxLi4xYzk1M2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwpAQCAtNDEsMTMgKzQxLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzc2NvcGUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJwc3Njb3BlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MCwxNiArNTgsMTMgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgcGFyZW50IG9mIGN1cnJlbnQgb3AgYmVpbmcgcGFyc2VkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlCisJCQkJCQkgICpwYXJzZXJfc3RhdGUpCiB7CiAKIAlyZXR1cm4gKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUKQEAgLTg0LDE3ICs3OSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKK3U4IGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqIHBhcnNlcl9zdGF0ZSkKIHsKIAogCXJldHVybiAoKHU4KQotCQkJKChwYXJzZXJfc3RhdGUtPmFtbCA+PSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kIHx8Ci0JCQkgIXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCkpKTsKKwkJKChwYXJzZXJfc3RhdGUtPmFtbCA+PSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kCisJCSAgfHwgIXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCkpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2luaXRfc2NvcGUKQEAgLTEwOSwzNCArMTAxLDMwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19pbml0X3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdF9vcCkKK2FjcGlfcHNfaW5pdF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqIHBhcnNlcl9zdGF0ZSwKKwkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiByb290X29wKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGU7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfaW5pdF9zY29wZSIsIHJvb3Rfb3ApOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJwc19pbml0X3Njb3BlIiwgcm9vdF9vcCk7Ci0KLQotCXNjb3BlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoKTsKKwlzY29wZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKIAlpZiAoIXNjb3BlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc2NvcGUtPmNvbW1vbi5kYXRhX3R5cGUgICAgID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUlBTQ09QRTsKLQlzY29wZS0+cGFyc2Vfc2NvcGUub3AgICAgICAgPSByb290X29wOworCXNjb3BlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUlBTQ09QRTsKKwlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSByb290X29wOwogCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQgPSBBQ1BJX1ZBUl9BUkdTOwotCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kICA9IHBhcnNlcl9zdGF0ZS0+YW1sX2VuZDsKLQlzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZCAgPSBwYXJzZXJfc3RhdGUtPmFtbF9lbmQ7CisJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBwYXJzZXJfc3RhdGUtPmFtbF9lbmQ7CisJc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQgPSBwYXJzZXJfc3RhdGUtPmFtbF9lbmQ7CiAKLQlwYXJzZXJfc3RhdGUtPnNjb3BlICAgICAgICAgPSBzY29wZTsKLQlwYXJzZXJfc3RhdGUtPnN0YXJ0X29wICAgICAgPSByb290X29wOworCXBhcnNlcl9zdGF0ZS0+c2NvcGUgPSBzY29wZTsKKwlwYXJzZXJfc3RhdGUtPnN0YXJ0X29wID0gcm9vdF9vcDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19wdXNoX3Njb3BlCkBAIC0xNTMsNDggKzE0MSw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcHNfcHVzaF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nX2FyZ3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfY291bnQpCithY3BpX3BzX3B1c2hfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICB1MzIgcmVtYWluaW5nX2FyZ3MsIHUzMiBhcmdfY291bnQpCiB7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc2NvcGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19wdXNoX3Njb3BlIiwgb3ApOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJwc19wdXNoX3Njb3BlIiwgb3ApOwotCi0KLQlzY29wZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7CisJc2NvcGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CiAJaWYgKCFzY29wZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAotCXNjb3BlLT5jb21tb24uZGF0YV90eXBlICAgID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUFNDT1BFOwotCXNjb3BlLT5wYXJzZV9zY29wZS5vcCAgICAgID0gb3A7CisJc2NvcGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QU0NPUEU7CisJc2NvcGUtPnBhcnNlX3Njb3BlLm9wID0gb3A7CiAJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0ID0gcmVtYWluaW5nX2FyZ3M7CiAJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCA9IGFyZ19jb3VudDsKIAlzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZCA9IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKIAogCS8qIFB1c2ggb250byBzY29wZSBzdGFjayAqLwogCi0JYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlLCBzY29wZSk7CisJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUsIHNjb3BlKTsKIAogCWlmIChhcmdfY291bnQgPT0gQUNQSV9WQVJfQVJHUykgewogCQkvKiBNdWx0aXBsZSBhcmd1bWVudHMgKi8KIAogCQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCA9IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogU2luZ2xlIGFyZ3VtZW50ICovCiAKLQkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBBQ1BJX1RPX1BPSU5URVIgKEFDUElfTUFYX1BUUik7CisJCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gQUNQSV9UT19QT0lOVEVSKEFDUElfTUFYX1BUUik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3BvcF9zY29wZQpAQCAtMjEyLDQ4ICsxOTQsNDEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfcHNfcG9wX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ19saXN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ19jb3VudCkKK2FjcGlfcHNfcG9wX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCwgdTMyICogYXJnX2xpc3QsIHUzMiAqIGFyZ19jb3VudCkKIHsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzY29wZSA9IHBhcnNlcl9zdGF0ZS0+c2NvcGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZSA9IHBhcnNlcl9zdGF0ZS0+c2NvcGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc19wb3Bfc2NvcGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX3BvcF9zY29wZSIpOwogCiAJLyogT25seSBwb3AgdGhlIHNjb3BlIGlmIHRoZXJlIGlzIGluIGZhY3QgYSBuZXh0IHNjb3BlICovCiAKIAlpZiAoc2NvcGUtPmNvbW1vbi5uZXh0KSB7Ci0JCXNjb3BlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOworCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOwogCiAJCS8qIHJldHVybiB0byBwYXJzaW5nIHByZXZpb3VzIG9wICovCiAKLQkJKm9wICAgICAgICAgICAgICAgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5vcDsKLQkJKmFyZ19saXN0ICAgICAgICAgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfbGlzdDsKLQkJKmFyZ19jb3VudCAgICAgICAgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQ7CisJCSpvcCA9IHNjb3BlLT5wYXJzZV9zY29wZS5vcDsKKwkJKmFyZ19saXN0ID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0OworCQkqYXJnX2NvdW50ID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudDsKIAkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kID0gc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQ7CiAKIAkJLyogQWxsIGRvbmUgd2l0aCB0aGlzIHNjb3BlIHN0YXRlIHN0cnVjdHVyZSAqLwogCi0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHNjb3BlKTsKLQl9Ci0JZWxzZSB7CisJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGUpOworCX0gZWxzZSB7CiAJCS8qIGVtcHR5IHBhcnNlIHN0YWNrLCBwcmVwYXJlIHRvIGZldGNoIG5leHQgb3Bjb2RlICovCiAKLQkJKm9wICAgICAgID0gTlVMTDsKKwkJKm9wID0gTlVMTDsKIAkJKmFyZ19saXN0ID0gMDsKIAkJKmFyZ19jb3VudCA9IDA7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCSJQb3BwZWQgT3AgJXAgQXJncyAlWFxuIiwgKm9wLCAqYXJnX2NvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIlBvcHBlZCBPcCAlcCBBcmdzICVYXG4iLCAqb3AsICphcmdfY291bnQpKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NsZWFudXBfc2NvcGUKQEAgLTI2NywxNSArMjQyLDExIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9wc19jbGVhbnVwX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCit2b2lkIGFjcGlfcHNfY2xlYW51cF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgicHNfY2xlYW51cF9zY29wZSIsIHBhcnNlcl9zdGF0ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfY2xlYW51cF9zY29wZSIsIHBhcnNlcl9zdGF0ZSk7CiAKIAlpZiAoIXBhcnNlcl9zdGF0ZSkgewogCQlyZXR1cm5fVk9JRDsKQEAgLTI4NCwxMCArMjU1LDkgQEAKIAkvKiBEZWxldGUgYW55dGhpbmcgb24gdGhlIHNjb3BlIHN0YWNrICovCiAKIAl3aGlsZSAocGFyc2VyX3N0YXRlLT5zY29wZSkgewotCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlKTsKLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc2NvcGUpOworCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHNjb3BlKTsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKaW5kZXggZDVhYWZlNy4uZjBlNzU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCkBAIC00MSwyMyArNDEsMTggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHN0cmVlIikKK0FDUElfTU9EVUxFX05BTUUoInBzdHJlZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9jaGlsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2NoaWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9hcmcKQEAgLTcxLDIxICs2NiwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2FyZyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmduKQordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUzMiBhcmduKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZyA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqb3BfaW5mbzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoaXMgb3Bjb2RlICovCiAKLQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSk7CisJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uYW1sX29wY29kZSk7CiAJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CiAJCS8qIEludmFsaWQgb3Bjb2RlIG9yIEFTQ0lJIGNoYXJhY3RlciAqLwogCkBAIC0xMTEsNyArMTAxLDYgQEAKIAlyZXR1cm4gKGFyZyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19hcHBlbmRfYXJnCkBAIC0xMjYsMTYgKzExNSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9wc19hcHBlbmRfYXJnICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpCithY3BpX3BzX2FwcGVuZF9hcmcodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnByZXZfYXJnOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKm9wX2luZm87CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXZfYXJnOworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKCFvcCkgewogCQlyZXR1cm47CkBAIC0xNDMsMTIgKzEyOCwxMSBAQAogCiAJLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhpcyBvcGNvZGUgKi8KIAotCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKKwlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKIAlpZiAob3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKIAkJLyogSW52YWxpZCBvcGNvZGUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJwc19hcHBlbmRfYXJnOiBJbnZhbGlkIEFNTCBPcGNvZGU6IDB4JTIuMlhcbiIsCi0JCQlvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJwc19hcHBlbmRfYXJnOiBJbnZhbGlkIEFNTCBPcGNvZGU6IDB4JTIuMlhcbiIsIG9wLT5jb21tb24uYW1sX29wY29kZSkpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNzAsOCArMTU0LDcgQEAKIAkJCXByZXZfYXJnID0gcHJldl9hcmctPmNvbW1vbi5uZXh0OwogCQl9CiAJCXByZXZfYXJnLT5jb21tb24ubmV4dCA9IGFyZzsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogTm8gYXJndW1lbnQgbGlzdCwgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBhcmd1bWVudCAqLwogCiAJCW9wLT5jb21tb24udmFsdWUuYXJnID0gYXJnOwpAQCAtMTg1LDcgKzE2OCw2IEBACiAJfQogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMDEsMTggKzE4MywxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2RlcHRoX25leHQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9kZXB0aF9uZXh0KHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcmlnaW4sCisJCQkJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcGFyZW50OwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dCA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKCFvcCkgewogCQlyZXR1cm4gKE5VTEwpOwpAQCAtMjIwLDcgKzE5OCw3IEBACiAKIAkvKiBMb29rIGZvciBhbiBhcmd1bWVudCBvciBjaGlsZCAqLwogCi0JbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDApOworCW5leHQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDApOwogCWlmIChuZXh0KSB7CiAJCXJldHVybiAobmV4dCk7CiAJfQpAQCAtMjM3LDcgKzIxNSw3IEBACiAJcGFyZW50ID0gb3AtPmNvbW1vbi5wYXJlbnQ7CiAKIAl3aGlsZSAocGFyZW50KSB7Ci0JCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyAocGFyZW50LCAwKTsKKwkJYXJnID0gYWNwaV9wc19nZXRfYXJnKHBhcmVudCwgMCk7CiAJCXdoaWxlIChhcmcgJiYgKGFyZyAhPSBvcmlnaW4pICYmIChhcmcgIT0gb3ApKSB7CiAJCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwogCQl9CkBAIC0yNjEsNyArMjM5LDYgQEAKIAlyZXR1cm4gKG5leHQpOwogfQogCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNzUsMTUgKzI1MiwxMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZ2V0X2NoaWxkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9jaGlsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqY2hpbGQgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpjaGlsZCA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewogCWNhc2UgQU1MX1NDT1BFX09QOgpAQCAtMjkyLDEwICsyNjUsOSBAQAogCWNhc2UgQU1MX1RIRVJNQUxfWk9ORV9PUDoKIAljYXNlIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUDoKIAotCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDApOworCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9CVUZGRVJfT1A6CiAJY2FzZSBBTUxfUEFDS0FHRV9PUDoKIAljYXNlIEFNTF9NRVRIT0RfT1A6CkBAIC0zMDMsMjQgKzI3NSwyMSBAQAogCWNhc2UgQU1MX1dISUxFX09QOgogCWNhc2UgQU1MX0ZJRUxEX09QOgogCi0JCWNoaWxkID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMSk7CisJCWNoaWxkID0gYWNwaV9wc19nZXRfYXJnKG9wLCAxKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQU1MX1BPV0VSX1JFU19PUDoKIAljYXNlIEFNTF9JTkRFWF9GSUVMRF9PUDoKIAotCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDIpOworCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFNTF9QUk9DRVNTT1JfT1A6CiAJY2FzZSBBTUxfQkFOS19GSUVMRF9PUDoKIAotCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDMpOworCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCQkvKiBBbGwgb3RoZXJzIGhhdmUgbm8gY2hpbGRyZW4gKi8KIAkJYnJlYWs7CkBAIC0zMzAsNSArMjk5LDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQorI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKaW5kZXggYTEwZjg4Ny4uMjA3NWVmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKQEAgLTQxLDE0ICs0MSwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc3V0aWxzIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicHN1dGlscyIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjEsMTUgKzU5LDExIEBACiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgU2NvcGUgYW5kIGFzc29jaWF0ZWQgbmFtZXBhdGggb3Agd2l0aCB0aGUgcm9vdCBuYW1lCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AgKAotCXZvaWQpCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19jcmVhdGVfc2NvcGVfb3Aodm9pZCkKIHsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzY29wZV9vcDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqc2NvcGVfb3A7CiAKLQotCXNjb3BlX29wID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX1NDT1BFX09QKTsKKwlzY29wZV9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX1NDT1BFX09QKTsKIAlpZiAoIXNjb3BlX29wKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQpAQCAtNzgsNyArNzIsNiBAQAogCXJldHVybiAoc2NvcGVfb3ApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfaW5pdF9vcApAQCAtOTIsMjMgKzg1LDE5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9wc19pbml0X29wICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSkKK3ZvaWQgYWNwaV9wc19pbml0X29wKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdTE2IG9wY29kZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJb3AtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI7CiAJb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gb3Bjb2RlOwogCi0JQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTIChBQ1BJX1NUUk5DUFkgKG9wLT5jb21tb24uYW1sX29wX25hbWUsCi0JCQkoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wY29kZSkpLT5uYW1lLAotCQkJCXNpemVvZiAob3AtPmNvbW1vbi5hbWxfb3BfbmFtZSkpKTsKKwlBQ1BJX0RJU0FTTV9PTkxZX01FTUJFUlMoQUNQSV9TVFJOQ1BZKG9wLT5jb21tb24uYW1sX29wX25hbWUsCisJCQkJCSAgICAgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbworCQkJCQkgICAgICAgKG9wY29kZSkpLT5uYW1lLAorCQkJCQkgICAgICBzaXplb2Yob3AtPmNvbW1vbi5hbWxfb3BfbmFtZSkpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2FsbG9jX29wCkBAIC0xMjMsMjkgKzExMiwyMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0KgotYWNwaV9wc19hbGxvY19vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19hbGxvY19vcCh1MTYgb3Bjb2RlKQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICAgKm9wX2luZm87Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IEFDUElfUEFSU0VPUF9HRU5FUklDOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKKwl1OCBmbGFncyA9IEFDUElfUEFSU0VPUF9HRU5FUklDOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0Jb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcGNvZGUpOworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwogCiAJLyogRGV0ZXJtaW5lIHR5cGUgb2YgcGFyc2Vfb3AgcmVxdWlyZWQgKi8KIAogCWlmIChvcF9pbmZvLT5mbGFncyAmIEFNTF9ERUZFUikgewogCQlmbGFncyA9IEFDUElfUEFSU0VPUF9ERUZFUlJFRDsKLQl9Ci0JZWxzZSBpZiAob3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKKwl9IGVsc2UgaWYgKG9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CiAJCWZsYWdzID0gQUNQSV9QQVJTRU9QX05BTUVEOwotCX0KLQllbHNlIGlmIChvcGNvZGUgPT0gQU1MX0lOVF9CWVRFTElTVF9PUCkgeworCX0gZWxzZSBpZiAob3Bjb2RlID09IEFNTF9JTlRfQllURUxJU1RfT1ApIHsKIAkJZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfQllURUxJU1Q7CiAJfQogCkBAIC0xNTQsMjUgKzEzNywyNSBAQAogCWlmIChmbGFncyA9PSBBQ1BJX1BBUlNFT1BfR0VORVJJQykgewogCQkvKiBUaGUgZ2VuZXJpYyBvcCAoZGVmYXVsdCkgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbiAoMTYgdG8gMSkgKi8KIAotCQlvcCA9IGFjcGlfdXRfYWNxdWlyZV9mcm9tX2NhY2hlIChBQ1BJX01FTV9MSVNUX1BTTk9ERSk7Ci0JfQotCWVsc2UgeworCQlvcCA9IGFjcGlfb3NfYWNxdWlyZV9vYmplY3QoYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJCW1lbXNldChvcCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24pKTsKKwl9IGVsc2UgewogCQkvKiBFeHRlbmRlZCBwYXJzZW9wICovCiAKLQkJb3AgPSBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoQUNQSV9NRU1fTElTVF9QU05PREVfRVhUKTsKKwkJb3AgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKKwkJbWVtc2V0KG9wLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKSk7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgT3AgKi8KIAogCWlmIChvcCkgewotCQlhY3BpX3BzX2luaXRfb3AgKG9wLCBvcGNvZGUpOworCQlhY3BpX3BzX2luaXRfb3Aob3AsIG9wY29kZSk7CiAJCW9wLT5jb21tb24uZmxhZ3MgPSBmbGFnczsKIAl9CiAKIAlyZXR1cm4gKG9wKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2ZyZWVfb3AKQEAgLTE4Niw1MyArMTY5LDIyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV9wc19mcmVlX29wICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK3ZvaWQgYWNwaV9wc19mcmVlX29wKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJwc19mcmVlX29wIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInBzX2ZyZWVfb3AiKTsKIAogCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlIHJldHZhbCBvcDogJXBcbiIsIG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlIHJldHZhbCBvcDogJXBcbiIsCisJCQkJICBvcCkpOwogCX0KIAogCWlmIChvcC0+Y29tbW9uLmZsYWdzICYgQUNQSV9QQVJTRU9QX0dFTkVSSUMpIHsKLQkJYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlIChBQ1BJX01FTV9MSVNUX1BTTk9ERSwgb3ApOwotCX0KLQllbHNlIHsKLQkJYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlIChBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFQsIG9wKTsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2NhY2hlLCBvcCk7CisJfSBlbHNlIHsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSwgb3ApOwogCX0KIH0KIAotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2RlbGV0ZV9wYXJzZV9jYWNoZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRnJlZSBhbGwgb2JqZWN0cyB0aGF0IGFyZSBvbiB0aGUgcGFyc2UgY2FjaGUgbGlzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3BzX2RlbGV0ZV9wYXJzZV9jYWNoZSAoCi0Jdm9pZCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZGVsZXRlX3BhcnNlX2NhY2hlIik7Ci0KLQotCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfY2FjaGUgKEFDUElfTUVNX0xJU1RfUFNOT0RFKTsKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlIChBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFQpOwotCXJldHVybl9WT0lEOwotfQotI2VuZGlmCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgVXRpbGl0eSBmdW5jdGlvbnMKQEAgLTI0MSwzNiArMTkzLDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKgogICogSXMgImMiIGEgbmFtZXN0cmluZyBsZWFkIGNoYXJhY3Rlcj8KICAqLwotdTgKLWFjcGlfcHNfaXNfbGVhZGluZ19jaGFyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpCit1OCBhY3BpX3BzX2lzX2xlYWRpbmdfY2hhcih1MzIgYykKIHsKIAlyZXR1cm4gKCh1OCkgKGMgPT0gJ18nIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKTsKIH0KIAotCiAvKgogICogSXMgImMiIGEgbmFtZXN0cmluZyBwcmVmaXggY2hhcmFjdGVyPwogICovCi11OAotYWNwaV9wc19pc19wcmVmaXhfY2hhciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKQordTggYWNwaV9wc19pc19wcmVmaXhfY2hhcih1MzIgYykKIHsKIAlyZXR1cm4gKCh1OCkgKGMgPT0gJ1xcJyB8fCBjID09ICdeJykpOwogfQogCi0KIC8qCiAgKiBHZXQgb3AncyBuYW1lICg0LWJ5dGUgbmFtZSBzZWdtZW50KSBvciAwIGlmIHVubmFtZWQKICAqLwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi11MzIKLWFjcGlfcHNfZ2V0X25hbWUgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQordTMyIGFjcGlfcHNfZ2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKIHsKIAogCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwpAQCAtMjgzLDE2ICsyMjYsMTIgQEAKIAogCXJldHVybiAob3AtPm5hbWVkLm5hbWUpOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qCiAgKiBTZXQgb3AncyBuYW1lCiAgKi8KLXZvaWQKLWFjcGlfcHNfc2V0X25hbWUgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKK3ZvaWQgYWNwaV9wc19zZXRfbmFtZSh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUzMiBuYW1lKQogewogCiAJLyogVGhlICJnZW5lcmljIiBvYmplY3QgaGFzIG5vIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0ICovCkBAIC0zMDMsNCArMjQyLDMgQEAKIAogCW9wLT5uYW1lZC5uYW1lID0gbmFtZTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKaW5kZXggOWQyMGNiMi4uMDhmMjMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCkBAIC00MSwxMyArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHN3YWxrIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicHN3YWxrIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MCwxOCArNTgsMTMgQEAKICAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSBwb3J0aW9uIG9mIG9yIGFuIGVudGlyZSBwYXJzZSB0cmVlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnN1YnRyZWVfcm9vdCkKK3ZvaWQgYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqc3VidHJlZV9yb290KQogewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wID0gc3VidHJlZV9yb290OwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm5leHQgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudCA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wID0gc3VidHJlZV9yb290OworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0ID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50ID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJwc19kZWxldGVfcGFyc2VfdHJlZSIsIHN1YnRyZWVfcm9vdCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfZGVsZXRlX3BhcnNlX3RyZWUiLCBzdWJ0cmVlX3Jvb3QpOwogCiAJLyogVmlzaXQgYWxsIG5vZGVzIGluIHRoZSBzdWJ0cmVlICovCiAKQEAgLTgxLDcgKzc0LDcgQEAKIAkJaWYgKG9wICE9IHBhcmVudCkgewogCQkJLyogTG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgb2YgdGhlIGN1cnJlbnQgb3AgKi8KIAotCQkJbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyAob3AsIDApOworCQkJbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7CiAJCQlpZiAobmV4dCkgewogCQkJCS8qIFN0aWxsIGdvaW5nIGRvd253YXJkIGluIHRyZWUgKE9wIGlzIG5vdCBjb21wbGV0ZWQgeWV0KSAqLwogCkBAIC05NSw3ICs4OCw3IEBACiAJCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7CiAJCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwogCi0JCWFjcGlfcHNfZnJlZV9vcCAob3ApOworCQlhY3BpX3BzX2ZyZWVfb3Aob3ApOwogCiAJCS8qIElmIHdlIGFyZSBiYWNrIHRvIHRoZSBzdGFydGluZyBwb2ludCwgdGhlIHdhbGsgaXMgY29tcGxldGUuICovCiAKQEAgLTEwNCw4ICs5Nyw3IEBACiAJCX0KIAkJaWYgKG5leHQpIHsKIAkJCW9wID0gbmV4dDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCW9wID0gcGFyZW50OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYwppbmRleCBkYmE4OTM2Li40ZGNiZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYwpAQCAtNDEsMjQgKzQxLDI3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHN4ZmFjZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJwc3hmYWNlIikKIAorLyogTG9jYWwgUHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9wYXNzKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvLCB1MTYgYWN0aW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc3hfZXhlY3V0ZQorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QKICAqCiAgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgogICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIE1ldGhvZCBvYmplY3QKICAqICAgICAgICAgICAgICAgICAgUGFyYW1ldGVycyAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiBQYXJhbXMgaXRzZWxmIG1heSBiZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG5vIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZC4KQEAgLTY3LDYgKzcwLDcgQEAKICAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGUgIC0gVHlwZSBvZiBQYXJhbWV0ZXIgbGlzdAogICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIgICAgIC0gUGFyc2Ugb3IgZXhlY3V0ZSBwYXNzCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTc0LDE1OCArNzgsNjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9wc3hfZXhlY3V0ZSAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2Qoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wOwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZXhlY3V0ZV9tZXRob2QiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc3hfZXhlY3V0ZSIpOwotCi0KLQkvKiBWYWxpZGF0ZSB0aGUgTm9kZSBhbmQgZ2V0IHRoZSBhdHRhY2hlZCBvYmplY3QgKi8KKwkvKiBWYWxpZGF0ZSB0aGUgSW5mbyBhbmQgbWV0aG9kIE5vZGUgKi8KIAogCWlmICghaW5mbyB8fCAhaW5mby0+bm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05VTExfRU5UUlkpOwotCX0KLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5ub2RlKTsKLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTlVMTF9PQkpFQ1QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9FTlRSWSk7CiAJfQogCiAJLyogSW5pdCBmb3IgbmV3IG1ldGhvZCwgd2FpdCBvbiBjb25jdXJyZW5jeSBzZW1hcGhvcmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiAoaW5mby0+bm9kZSwgb2JqX2Rlc2MsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihpbmZvLT5ub2RlLCBpbmZvLT5vYmpfZGVzYywgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCWlmICgoaW5mby0+cGFyYW1ldGVyX3R5cGUgPT0gQUNQSV9QQVJBTV9BUkdTKSAmJgotCQkoaW5mby0+cGFyYW1ldGVycykpIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciAib3ducyIgdGhlIHBhcmFtZXRlcnMsIHNvIGdpdmUgZWFjaCBvbmUgYW4gZXh0cmEKLQkJICogcmVmZXJlbmNlCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAoaW5mby0+cGFyYW1ldGVyc1tpXSk7Ci0JCX0KLQl9CisJLyoKKwkgKiBUaGUgY2FsbGVyICJvd25zIiB0aGUgcGFyYW1ldGVycywgc28gZ2l2ZSBlYWNoIG9uZSBhbiBleHRyYQorCSAqIHJlZmVyZW5jZQorCSAqLworCWFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KGluZm8sIFJFRl9JTkNSRU1FTlQpOwogCiAJLyoKIAkgKiAxKSBQZXJmb3JtIHRoZSBmaXJzdCBwYXNzIHBhcnNlIG9mIHRoZSBtZXRob2QgdG8gZW50ZXIgYW55Ci0JICogbmFtZWQgb2JqZWN0cyB0aGF0IGl0IGNyZWF0ZXMgaW50byB0aGUgbmFtZXNwYWNlCisJICogICAgbmFtZWQgb2JqZWN0cyB0aGF0IGl0IGNyZWF0ZXMgaW50byB0aGUgbmFtZXNwYWNlCiAJICovCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCi0JCSIqKioqIEJlZ2luIE1ldGhvZCBQYXJzZSAqKioqIEVudHJ5PSVwIG9iaj0lcFxuIiwKLQkJaW5mby0+bm9kZSwgb2JqX2Rlc2MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiKioqKiBCZWdpbiBNZXRob2QgUGFyc2UgKioqKiBFbnRyeT0lcCBvYmo9JXBcbiIsCisJCQkgIGluZm8tPm5vZGUsIGluZm8tPm9ial9kZXNjKSk7CiAKLQkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KLQotCW9wID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AgKCk7Ci0JaWYgKCFvcCkgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDE7CisJaW5mby0+cGFzc19udW1iZXIgPSAxOworCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9wYXNzKGluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyoKLQkgKiBHZXQgYSBuZXcgb3duZXJfaWQgZm9yIG9iamVjdHMgY3JlYXRlZCBieSB0aGlzIG1ldGhvZC4gTmFtZXNwYWNlCi0JICogb2JqZWN0cyAoc3VjaCBhcyBPcGVyYXRpb24gUmVnaW9ucykgY2FuIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZQotCSAqIGZpcnN0IHBhc3MgcGFyc2UuCisJICogMikgRXhlY3V0ZSB0aGUgbWV0aG9kLiBQZXJmb3JtcyBzZWNvbmQgcGFzcyBwYXJzZSBzaW11bHRhbmVvdXNseQogCSAqLwotCW9ial9kZXNjLT5tZXRob2Qub3duaW5nX2lkID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCAoQUNQSV9PV05FUl9UWVBFX01FVEhPRCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIioqKiogQmVnaW4gTWV0aG9kIEV4ZWN1dGlvbiAqKioqIEVudHJ5PSVwIG9iaj0lcFxuIiwKKwkJCSAgaW5mby0+bm9kZSwgaW5mby0+b2JqX2Rlc2MpKTsKIAotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCisJaW5mby0+cGFzc19udW1iZXIgPSAzOworCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9wYXNzKGluZm8pOwogCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKG9ial9kZXNjLT5tZXRob2Qub3duaW5nX2lkLAotCQkJICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwMjsKLQl9CisgICAgICBjbGVhbnVwOgorCS8qIFRha2UgYXdheSB0aGUgZXh0cmEgcmVmZXJlbmNlIHRoYXQgd2UgZ2F2ZSB0aGUgcGFyYW1ldGVycyBhYm92ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrICh3YWxrX3N0YXRlLCBvcCwgaW5mby0+bm9kZSwKLQkJCSAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgTlVMTCwgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXAzOwotCX0KKwlhY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChpbmZvLCBSRUZfREVDUkVNRU5UKTsKIAotCS8qIFBhcnNlIHRoZSBBTUwgKi8KKwkvKiBFeGl0IG5vdyBpZiBlcnJvciBhYm92ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKG9wKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDE7IC8qIFdhbGsgc3RhdGUgaXMgYWxyZWFkeSBkZWxldGVkICovCi0JfQotCi0JLyoKLQkgKiAyKSBFeGVjdXRlIHRoZSBtZXRob2QuICBQZXJmb3JtcyBzZWNvbmQgcGFzcyBwYXJzZSBzaW11bHRhbmVvdXNseQotCSAqLwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAotCQkiKioqKiBCZWdpbiBNZXRob2QgRXhlY3V0aW9uICoqKiogRW50cnk9JXAgb2JqPSVwXG4iLAotCQlpbmZvLT5ub2RlLCBvYmpfZGVzYykpOwotCi0JLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCi0KLQlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wICgpOwotCWlmICghb3ApIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXAxOwotCX0KLQotCS8qIEluaXQgbmV3IG9wIHdpdGggdGhlIG1ldGhvZCBuYW1lIGFuZCBwb2ludGVyIGJhY2sgdG8gdGhlIE5TIG5vZGUgKi8KLQotCWFjcGlfcHNfc2V0X25hbWUgKG9wLCBpbmZvLT5ub2RlLT5uYW1lLmludGVnZXIpOwotCW9wLT5jb21tb24ubm9kZSA9IGluZm8tPm5vZGU7Ci0KLQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgd2FsayBzdGF0ZSAqLwotCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUgKDAsIE5VTEwsIE5VTEwsIE5VTEwpOwotCWlmICghd2Fsa19zdGF0ZSkgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDI7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrICh3YWxrX3N0YXRlLCBvcCwgaW5mby0+bm9kZSwKLQkJCSAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgaW5mbywgMyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXAzOwotCX0KLQotCS8qIFRoZSB3YWxrIG9mIHRoZSBwYXJzZSB0cmVlIGlzIHdoZXJlIHdlIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIG1ldGhvZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwotCWdvdG8gY2xlYW51cDI7IC8qIFdhbGsgc3RhdGUgYWxyZWFkeSBkZWxldGVkICovCi0KLQotY2xlYW51cDM6Ci0JYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAod2Fsa19zdGF0ZSk7Ci0KLWNsZWFudXAyOgotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKG9wKTsKLQotY2xlYW51cDE6Ci0JaWYgKChpbmZvLT5wYXJhbWV0ZXJfdHlwZSA9PSBBQ1BJX1BBUkFNX0FSR1MpICYmCi0JCShpbmZvLT5wYXJhbWV0ZXJzKSkgewotCQkvKiBUYWtlIGF3YXkgdGhlIGV4dHJhIHJlZmVyZW5jZSB0aGF0IHdlIGdhdmUgdGhlIHBhcmFtZXRlcnMgYWJvdmUgKi8KLQotCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKLQkJCS8qIElnbm9yZSBlcnJvcnMsIGp1c3QgZG8gdGhlbSBhbGwgKi8KLQotCQkJKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAotCQkJCQkgaW5mby0+cGFyYW1ldGVyc1tpXSwgUkVGX0RFQ1JFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTIzMywxNCArMTQ0LDEwNCBAQAogCSAqIGEgY29udHJvbCBleGNlcHRpb24gY29kZQogCSAqLwogCWlmIChpbmZvLT5yZXR1cm5fb2JqZWN0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiTWV0aG9kIHJldHVybmVkIG9ial9kZXNjPSVwXG4iLAotCQkJaW5mby0+cmV0dXJuX29iamVjdCkpOwotCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkgKGluZm8tPnJldHVybl9vYmplY3QpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCSAgIk1ldGhvZCByZXR1cm5lZCBvYmpfZGVzYz0lcFxuIiwKKwkJCQkgIGluZm8tPnJldHVybl9vYmplY3QpKTsKKwkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZKGluZm8tPnJldHVybl9vYmplY3QpOwogCiAJCXN0YXR1cyA9IEFFX0NUUkxfUkVUVVJOX1ZBTFVFOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3QKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gU2VlIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzZWQ6IHBhcmFtZXRlcl90eXBlIGFuZCBQYXJhbWV0ZXJzKQorICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIEFkZCBvciBSZW1vdmUgcmVmZXJlbmNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGUgcmVmZXJlbmNlIGNvdW50IG9uIGFsbCBtZXRob2QgcGFyYW1ldGVyIG9iamVjdHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgdm9pZAorYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8sIHUxNiBhY3Rpb24pCit7CisJYWNwaV9uYXRpdmVfdWludCBpOworCisJaWYgKChpbmZvLT5wYXJhbWV0ZXJfdHlwZSA9PSBBQ1BJX1BBUkFNX0FSR1MpICYmIChpbmZvLT5wYXJhbWV0ZXJzKSkgeworCQkvKiBVcGRhdGUgcmVmZXJlbmNlIGNvdW50IGZvciBlYWNoIHBhcmFtZXRlciAqLworCisJCWZvciAoaSA9IDA7IGluZm8tPnBhcmFtZXRlcnNbaV07IGkrKykgeworCQkJLyogSWdub3JlIGVycm9ycywganVzdCBkbyB0aGVtIGFsbCAqLworCisJCQkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKGluZm8tPgorCQkJCQkJCSAgICAgIHBhcmFtZXRlcnNbaV0sCisJCQkJCQkJICAgICAgYWN0aW9uKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19leGVjdXRlX3Bhc3MKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gU2VlIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzZWQ6IHBhc3NfbnVtYmVyLCBOb2RlLCBhbmQgb2JqX2Rlc2MpCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTaW5nbGUgQU1MIHBhc3M6IFBhcnNlIG9yIEV4ZWN1dGUgYSBjb250cm9sIG1ldGhvZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19leGVjdXRlX3Bhc3MiKTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdCBhIFJvb3QgTm9kZSAqLworCisJb3AgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCgpOworCWlmICghb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KKworCXdhbGtfc3RhdGUgPQorCSAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKGluZm8tPm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQsIE5VTEwsCisJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKCF3YWxrX3N0YXRlKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBvcCwgaW5mby0+bm9kZSwKKwkJCQkgICAgICAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCisJCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKKwkJCQkgICAgICAgaW5mby0+cGFzc19udW1iZXIgPT0gMSA/IE5VTEwgOiBpbmZvLAorCQkJCSAgICAgICBpbmZvLT5wYXNzX251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBQYXJzZSB0aGUgQU1MICovCisKKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKworCS8qIFdhbGsgc3RhdGUgd2FzIGRlbGV0ZWQgYnkgcGFyc2VfYW1sICovCisKKyAgICAgIGNsZWFudXA6CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYyBiL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jCmluZGV4IDUxNDhmM2MuLjJhNzE4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jCkBAIC0zNSwyMiArMzUsMTcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJwY2lfYmluZCIpCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfYmluZCIpCiAKIHN0cnVjdCBhY3BpX3BjaV9kYXRhIHsKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJaWQ7Ci0Jc3RydWN0IHBjaV9idXMJCSpidXM7Ci0Jc3RydWN0IHBjaV9kZXYJCSpkZXY7CisJc3RydWN0IGFjcGlfcGNpX2lkIGlkOworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKIH07CiAKLQotdm9pZAotYWNwaV9wY2lfZGF0YV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWZ1bmN0aW9uLAotCXZvaWQJCQkqY29udGV4dCkKK3N0YXRpYyB2b2lkIGFjcGlfcGNpX2RhdGFfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmdW5jdGlvbiwKKwkJCQkgIHZvaWQgKmNvbnRleHQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfZGF0YV9oYW5kbGVyIik7CiAKQEAgLTU5LDcgKzU0LDYgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioKICAqIGFjcGlfZ2V0X3BjaV9pZAogICogLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NywxNSArNjEsMTIgQEAKICAqIHRvIHJlc29sdmUgUENJIGluZm9ybWF0aW9uIGZvciBBQ1BJLVBDSSBkZXZpY2VzIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZS4KICAqIFRoaXMgdHlwaWNhbGx5IG9jY3VycyB3aGVuIHJlc29sdmluZyBQQ0kgb3BlcmF0aW9uIHJlZ2lvbiBpbmZvcm1hdGlvbi4KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3BjaV9pZCAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQJKmlkKQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfcGNpX2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX2RhdGEJKmRhdGEgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wY2lfZGF0YSAqZGF0YSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9wY2lfaWQiKTsKIApAQCAtODQsNTIgKzc1LDUwIEBACiAKIAlyZXN1bHQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCSJJbnZhbGlkIEFDUEkgQnVzIGNvbnRleHQgZm9yIGRldmljZSAlc1xuIiwKLQkJCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCBBQ1BJIEJ1cyBjb250ZXh0IGZvciBkZXZpY2UgJXNcbiIsCisJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2dldF9kYXRhKGhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLCAodm9pZCoqKSAmZGF0YSk7CisJc3RhdHVzID0gYWNwaV9nZXRfZGF0YShoYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwgKHZvaWQgKiopJmRhdGEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZGF0YSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCSJJbnZhbGlkIEFDUEktUENJIGNvbnRleHQgZm9yIGRldmljZSAlc1xuIiwKLQkJCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCBBQ1BJLVBDSSBjb250ZXh0IGZvciBkZXZpY2UgJXNcbiIsCisJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkqaWQgPSBkYXRhLT5pZDsKLQkKLQkvKgotCWlkLT5zZWdtZW50ID0gZGF0YS0+aWQuc2VnbWVudDsKLQlpZC0+YnVzID0gZGF0YS0+aWQuYnVzOwotCWlkLT5kZXZpY2UgPSBkYXRhLT5pZC5kZXZpY2U7Ci0JaWQtPmZ1bmN0aW9uID0gZGF0YS0+aWQuZnVuY3Rpb247Ci0JKi8KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCi0JCSJEZXZpY2UgJXMgaGFzIFBDSSBhZGRyZXNzICUwMng6JTAyeDolMDJ4LiUwMnhcbiIsIAotCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgaWQtPnNlZ21lbnQsIGlkLT5idXMsIAotCQlpZC0+ZGV2aWNlLCBpZC0+ZnVuY3Rpb24pKTsKKwkvKgorCSAgIGlkLT5zZWdtZW50ID0gZGF0YS0+aWQuc2VnbWVudDsKKwkgICBpZC0+YnVzID0gZGF0YS0+aWQuYnVzOworCSAgIGlkLT5kZXZpY2UgPSBkYXRhLT5pZC5kZXZpY2U7CisJICAgaWQtPmZ1bmN0aW9uID0gZGF0YS0+aWQuZnVuY3Rpb247CisJICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJEZXZpY2UgJXMgaGFzIFBDSSBhZGRyZXNzICUwMng6JTAyeDolMDJ4LiUwMnhcbiIsCisJCQkgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBpZC0+c2VnbWVudCwgaWQtPmJ1cywKKwkJCSAgaWQtPmRldmljZSwgaWQtPmZ1bmN0aW9uKSk7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3BjaV9pZCk7CiAKLQkKLWludAotYWNwaV9wY2lfYmluZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitpbnQgYWNwaV9wY2lfYmluZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wY2lfZGF0YQkqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX2RhdGEJKnBkYXRhID0gTlVMTDsKLQljaGFyCQkJKnBhdGhuYW1lID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0gezAsIE5VTEx9OwotCWFjcGlfaGFuZGxlCQloYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBwY2lfZGV2CQkqZGV2OwotCXN0cnVjdCBwY2lfYnVzIAkJKmJ1czsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wY2lfZGF0YSAqZGF0YSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGNpX2RhdGEgKnBkYXRhID0gTlVMTDsKKwljaGFyICpwYXRobmFtZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfYmluZCIpOwogCkBAIC0xMzcsMzQgKzEyNiwzNCBAQAogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKIAlwYXRobmFtZSA9IGttYWxsb2MoQUNQSV9QQVRITkFNRV9NQVgsIEdGUF9LRVJORUwpOwotCWlmKCFwYXRobmFtZSkKKwlpZiAoIXBhdGhuYW1lKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAJbWVtc2V0KHBhdGhuYW1lLCAwLCBBQ1BJX1BBVEhOQU1FX01BWCk7CiAJYnVmZmVyLmxlbmd0aCA9IEFDUElfUEFUSE5BTUVfTUFYOwogCWJ1ZmZlci5wb2ludGVyID0gcGF0aG5hbWU7CiAKIAlkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcGNpX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpewotCQlrZnJlZSAocGF0aG5hbWUpOworCWlmICghZGF0YSkgeworCQlrZnJlZShwYXRobmFtZSk7CiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAl9CiAJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfZGF0YSkpOwogCiAJYWNwaV9nZXRfbmFtZShkZXZpY2UtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJCaW5kaW5nIFBDSSBkZXZpY2UgWyVzXS4uLlxuIiwgCi0JCXBhdGhuYW1lKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQmluZGluZyBQQ0kgZGV2aWNlIFslc10uLi5cbiIsCisJCQkgIHBhdGhuYW1lKSk7CiAKIAkvKiAKIAkgKiBTZWdtZW50ICYgQnVzCiAJICogLS0tLS0tLS0tLS0tLQogCSAqIFRoZXNlIGFyZSBvYnRhaW5lZCB2aWEgdGhlIHBhcmVudCBkZXZpY2UncyBBQ1BJLVBDSSBjb250ZXh0LgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoZGV2aWNlLT5wYXJlbnQtPmhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLCAKLQkJKHZvaWQqKikgJnBkYXRhKTsKKwlzdGF0dXMgPSBhY3BpX2dldF9kYXRhKGRldmljZS0+cGFyZW50LT5oYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwKKwkJCSAgICAgICAodm9pZCAqKikmcGRhdGEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhcGRhdGEgfHwgIXBkYXRhLT5idXMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiSW52YWxpZCBBQ1BJLVBDSSBjb250ZXh0IGZvciBwYXJlbnQgZGV2aWNlICVzXG4iLAotCQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZS0+cGFyZW50KSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkludmFsaWQgQUNQSS1QQ0kgY29udGV4dCBmb3IgcGFyZW50IGRldmljZSAlc1xuIiwKKwkJCQkgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UtPnBhcmVudCkpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMTgxLDggKzE3MCw4IEBACiAJZGF0YS0+aWQuZnVuY3Rpb24gPSBkZXZpY2UtPnBucC5idXNfYWRkcmVzcyAmIDB4RkZGRjsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIi4uLnRvICUwMng6JTAyeDolMDJ4LiUwMnhcbiIsCi0JCWRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywgZGF0YS0+aWQuZGV2aWNlLCAKLQkJZGF0YS0+aWQuZnVuY3Rpb24pKTsKKwkJCSAgZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLCBkYXRhLT5pZC5kZXZpY2UsCisJCQkgIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CiAKIAkvKgogCSAqIFRCRDogU3VwcG9ydCBzbG90IGRldmljZXMgKGUuZy4gZnVuY3Rpb249MHhGRkZGKS4KQEAgLTIwMiwyNSArMTkxLDI1IEBACiAJaWYgKGJ1cykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKIAkJCWlmIChkZXYtPmRldmZuID09IFBDSV9ERVZGTihkYXRhLT5pZC5kZXZpY2UsCi0JCQkJCQlkYXRhLT5pZC5mdW5jdGlvbikpIHsKKwkJCQkJCSAgICBkYXRhLT5pZC5mdW5jdGlvbikpIHsKIAkJCQlkYXRhLT5kZXYgPSBkZXY7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CiAJaWYgKCFkYXRhLT5kZXYpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCSJEZXZpY2UgJTAyeDolMDJ4OiUwMnguJTAyeCBub3QgcHJlc2VudCBpbiBQQ0kgbmFtZXNwYWNlXG4iLAotCQkJZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLCAKLQkJCWRhdGEtPmlkLmRldmljZSwgZGF0YS0+aWQuZnVuY3Rpb24pKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IG5vdCBwcmVzZW50IGluIFBDSSBuYW1lc3BhY2VcbiIsCisJCQkJICBkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMsCisJCQkJICBkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KIAlpZiAoIWRhdGEtPmRldi0+YnVzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IGhhcyBpbnZhbGlkICdidXMnIGZpZWxkXG4iLAotCQkJZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLCAKLQkJCWRhdGEtPmlkLmRldmljZSwgZGF0YS0+aWQuZnVuY3Rpb24pKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJEZXZpY2UgJTAyeDolMDJ4OiUwMnguJTAyeCBoYXMgaW52YWxpZCAnYnVzJyBmaWVsZFxuIiwKKwkJCQkgIGRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywKKwkJCQkgIGRhdGEtPmlkLmRldmljZSwgZGF0YS0+aWQuZnVuY3Rpb24pKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMjMyLDEwICsyMjEsMTAgQEAKIAkgKiBmYWNpbGl0YXRlIGNhbGxiYWNrcyBmb3IgYWxsIG9mIGl0cyBjaGlsZHJlbi4KIAkgKi8KIAlpZiAoZGF0YS0+ZGV2LT5zdWJvcmRpbmF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sIAotCQkJIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IGlzIGEgUENJIGJyaWRnZVxuIiwKLQkJCWRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywgCi0JCQlkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJEZXZpY2UgJTAyeDolMDJ4OiUwMnguJTAyeCBpcyBhIFBDSSBicmlkZ2VcbiIsCisJCQkJICBkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMsCisJCQkJICBkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CiAJCWRhdGEtPmJ1cyA9IGRhdGEtPmRldi0+c3Vib3JkaW5hdGU7CiAJCWRldmljZS0+b3BzLmJpbmQgPSBhY3BpX3BjaV9iaW5kOwogCQlkZXZpY2UtPm9wcy51bmJpbmQgPSBhY3BpX3BjaV91bmJpbmQ7CkBAIC0yNDksOCArMjM4LDggQEAKIAlzdGF0dXMgPSBhY3BpX2F0dGFjaF9kYXRhKGRldmljZS0+aGFuZGxlLCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIsIGRhdGEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBhdHRhY2ggQUNQSS1QQ0kgY29udGV4dCB0byBkZXZpY2UgJXNcbiIsCi0JCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOworCQkJCSAgIlVuYWJsZSB0byBhdHRhY2ggQUNQSS1QQ0kgY29udGV4dCB0byBkZXZpY2UgJXNcbiIsCisJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0yNjcsMTUgKzI1NiwxNSBAQAogCSAqLwogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX1BSVCwgJmhhbmRsZSk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCWlmIChkYXRhLT5idXMpCQkJCSAgICAvKiBQQ0ktUENJIGJyaWRnZSAqLwotCQkJYWNwaV9wY2lfaXJxX2FkZF9wcnQoZGV2aWNlLT5oYW5kbGUsIGRhdGEtPmlkLnNlZ21lbnQsIAotCQkJCWRhdGEtPmJ1cy0+bnVtYmVyKTsKLQkJZWxzZQkJCQkgICAgIC8qIG5vbi1icmlkZ2UgUENJIGRldmljZSAqLworCQlpZiAoZGF0YS0+YnVzKQkvKiBQQ0ktUENJIGJyaWRnZSAqLwogCQkJYWNwaV9wY2lfaXJxX2FkZF9wcnQoZGV2aWNlLT5oYW5kbGUsIGRhdGEtPmlkLnNlZ21lbnQsCi0JCQkJZGF0YS0+aWQuYnVzKTsKKwkJCQkJICAgICBkYXRhLT5idXMtPm51bWJlcik7CisJCWVsc2UJCS8qIG5vbi1icmlkZ2UgUENJIGRldmljZSAqLworCQkJYWNwaV9wY2lfaXJxX2FkZF9wcnQoZGV2aWNlLT5oYW5kbGUsIGRhdGEtPmlkLnNlZ21lbnQsCisJCQkJCSAgICAgZGF0YS0+aWQuYnVzKTsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlrZnJlZShwYXRobmFtZSk7CiAJaWYgKHJlc3VsdCkKIAkJa2ZyZWUoZGF0YSk7CkBAIC0yODMsMjIgKzI3MiwyMSBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1pbnQgYWNwaV9wY2lfdW5iaW5kKAotCXN0cnVjdCBhY3BpX2RldmljZSAgICAgICpkZXZpY2UpCitpbnQgYWNwaV9wY2lfdW5iaW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcGNpX2RhdGEgICAgKmRhdGEgPSBOVUxMOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgYnVmZmVyID0gezAsIE5VTEx9OworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpkYXRhID0gTlVMTDsKKwljaGFyICpwYXRobmFtZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfdW5iaW5kIik7CiAKIAlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5wYXJlbnQpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXBhdGhuYW1lID0gKGNoYXIgKikga21hbGxvYyhBQ1BJX1BBVEhOQU1FX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYoIXBhdGhuYW1lKQorCXBhdGhuYW1lID0gKGNoYXIgKilrbWFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhdGhuYW1lKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAJbWVtc2V0KHBhdGhuYW1lLCAwLCBBQ1BJX1BBVEhOQU1FX01BWCk7CiAKQEAgLTMwNiwxNCArMjk0LDE2IEBACiAJYnVmZmVyLnBvaW50ZXIgPSBwYXRobmFtZTsKIAlhY3BpX2dldF9uYW1lKGRldmljZS0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlVuYmluZGluZyBQQ0kgZGV2aWNlIFslc10uLi5cbiIsCi0JCXBhdGhuYW1lKSk7CisJCQkgIHBhdGhuYW1lKSk7CiAJa2ZyZWUocGF0aG5hbWUpOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfZGF0YShkZXZpY2UtPmhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLCAodm9pZCoqKSZkYXRhKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2dldF9kYXRhKGRldmljZS0+aGFuZGxlLCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIsCisJCQkgICh2b2lkICoqKSZkYXRhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gZ2V0IGRhdGEgZnJvbSBkZXZpY2UgJXNcbiIsCi0JCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOworCQkJCSAgIlVuYWJsZSB0byBnZXQgZGF0YSBmcm9tIGRldmljZSAlc1xuIiwKKwkJCQkgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTMyMSw4ICszMTEsOCBAQAogCXN0YXR1cyA9IGFjcGlfZGV0YWNoX2RhdGEoZGV2aWNlLT5oYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGRldGFjaCBkYXRhIGZyb20gZGV2aWNlICVzXG4iLAotCQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKKwkJCQkgICJVbmFibGUgdG8gZGV0YWNoIGRhdGEgZnJvbSBkZXZpY2UgJXNcbiIsCisJCQkJICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSkpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0zMzEsMzkgKzMyMSwzNyBAQAogCX0KIAlrZnJlZShkYXRhKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1pbnQgCi1hY3BpX3BjaV9iaW5kX3Jvb3QgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCXN0cnVjdCBhY3BpX3BjaV9pZAkqaWQsCi0Jc3RydWN0IHBjaV9idXMJCSpidXMpIAoraW50CithY3BpX3BjaV9iaW5kX3Jvb3Qoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCSAgIHN0cnVjdCBhY3BpX3BjaV9pZCAqaWQsIHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcGNpX2RhdGEJKmRhdGEgPSBOVUxMOwotCWNoYXIJCQkqcGF0aG5hbWUgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7MCwgTlVMTH07CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfcGNpX2RhdGEgKmRhdGEgPSBOVUxMOworCWNoYXIgKnBhdGhuYW1lID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAwLCBOVUxMIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9iaW5kX3Jvb3QiKTsKIAogCXBhdGhuYW1lID0gKGNoYXIgKilrbWFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZighcGF0aG5hbWUpCisJaWYgKCFwYXRobmFtZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCW1lbXNldChwYXRobmFtZSwgMCwgQUNQSV9QQVRITkFNRV9NQVgpOwogCiAJYnVmZmVyLmxlbmd0aCA9IEFDUElfUEFUSE5BTUVfTUFYOwogCWJ1ZmZlci5wb2ludGVyID0gcGF0aG5hbWU7CiAKLQlpZiAoIWRldmljZSB8fCAhaWQgfHwgIWJ1cyl7CisJaWYgKCFkZXZpY2UgfHwgIWlkIHx8ICFidXMpIHsKIAkJa2ZyZWUocGF0aG5hbWUpOwogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJfQogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKXsKKwlpZiAoIWRhdGEpIHsKIAkJa2ZyZWUocGF0aG5hbWUpOwogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAJfQpAQCAtMzc3LDE4ICszNjUsMTggQEAKIAlhY3BpX2dldF9uYW1lKGRldmljZS0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQmluZGluZyBQQ0kgcm9vdCBicmlkZ2UgWyVzXSB0byAiCi0JCSIlMDJ4OiUwMnhcbiIsIHBhdGhuYW1lLCBpZC0+c2VnbWVudCwgaWQtPmJ1cykpOworCQkJICAiJTAyeDolMDJ4XG4iLCBwYXRobmFtZSwgaWQtPnNlZ21lbnQsIGlkLT5idXMpKTsKIAogCXN0YXR1cyA9IGFjcGlfYXR0YWNoX2RhdGEoZGV2aWNlLT5oYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwgZGF0YSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGF0dGFjaCBBQ1BJLVBDSSBjb250ZXh0IHRvIGRldmljZSAlc1xuIiwKLQkJCXBhdGhuYW1lKSk7CisJCQkJICAiVW5hYmxlIHRvIGF0dGFjaCBBQ1BJLVBDSSBjb250ZXh0IHRvIGRldmljZSAlc1xuIiwKKwkJCQkgIHBhdGhuYW1lKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCWtmcmVlKHBhdGhuYW1lKTsKIAlpZiAocmVzdWx0ICE9IDApCiAJCWtmcmVlKGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggYmI5NzNkMi4uMDk1NjdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC0zOCwyNiArMzgsMjIgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJwY2lfaXJxIikKK0FDUElfTU9EVUxFX05BTUUoInBjaV9pcnEiKQogCi1zdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2xpc3QJYWNwaV9wcnQ7CitzdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2xpc3QgYWNwaV9wcnQ7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFjcGlfcHJ0X2xvY2spOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgIFBDSSBJUlEgUm91dGluZyBUYWJsZSAoUFJUKSBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICoKLWFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeSAoCi0JaW50CQkJc2VnbWVudCwKLQlpbnQJCQlidXMsCi0JaW50CQkJZGV2aWNlLAotCWludAkJCXBpbikKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeShpbnQgc2VnbWVudCwKKwkJCQkJCQkgIGludCBidXMsCisJCQkJCQkJICBpbnQgZGV2aWNlLCBpbnQgcGluKQogewotCXN0cnVjdCBsaXN0X2hlYWQJKm5vZGUgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BydF9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfaXJxX2ZpbmRfcHJ0X2VudHJ5Iik7CiAKQEAgLTcyLDEwICs2OCwxMCBAQAogCXNwaW5fbG9jaygmYWNwaV9wcnRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaChub2RlLCAmYWNwaV9wcnQuZW50cmllcykgewogCQllbnRyeSA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGFjcGlfcHJ0X2VudHJ5LCBub2RlKTsKLQkJaWYgKChzZWdtZW50ID09IGVudHJ5LT5pZC5zZWdtZW50KSAKLQkJCSYmIChidXMgPT0gZW50cnktPmlkLmJ1cykgCi0JCQkmJiAoZGV2aWNlID09IGVudHJ5LT5pZC5kZXZpY2UpCi0JCQkmJiAocGluID09IGVudHJ5LT5waW4pKSB7CisJCWlmICgoc2VnbWVudCA9PSBlbnRyeS0+aWQuc2VnbWVudCkKKwkJICAgICYmIChidXMgPT0gZW50cnktPmlkLmJ1cykKKwkJICAgICYmIChkZXZpY2UgPT0gZW50cnktPmlkLmRldmljZSkKKwkJICAgICYmIChwaW4gPT0gZW50cnktPnBpbikpIHsKIAkJCXNwaW5fdW5sb2NrKCZhY3BpX3BydF9sb2NrKTsKIAkJCXJldHVybl9QVFIoZW50cnkpOwogCQl9CkBAIC04NSwxNSArODEsMTEgQEAKIAlyZXR1cm5fUFRSKE5VTEwpOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfcGNpX2lycV9hZGRfZW50cnkgKAotCWFjcGlfaGFuZGxlCQkJaGFuZGxlLAotCWludAkJCQlzZWdtZW50LAotCWludAkJCQlidXMsCi0Jc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUJKnBydCkKK2FjcGlfcGNpX2lycV9hZGRfZW50cnkoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgICAgaW50IHNlZ21lbnQsIGludCBidXMsIHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnQpCiB7Ci0Jc3RydWN0IGFjcGlfcHJ0X2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9pcnFfYWRkX2VudHJ5Iik7CiAKQEAgLTEzOSw5ICsxMzEsMTAgQEAKIAkJZW50cnktPmxpbmsuaW5kZXggPSBwcnQtPnNvdXJjZV9pbmRleDsKIAogCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lORk8sCi0JCSIgICAgICAlMDJYOiUwMlg6JTAyWFslY10gLT4gJXNbJWRdXG4iLCAKLQkJZW50cnktPmlkLnNlZ21lbnQsIGVudHJ5LT5pZC5idXMsIGVudHJ5LT5pZC5kZXZpY2UsIAotCQkoJ0EnICsgZW50cnktPnBpbiksIHBydC0+c291cmNlLCBlbnRyeS0+bGluay5pbmRleCkpOworCQkJICAgICAgIiAgICAgICUwMlg6JTAyWDolMDJYWyVjXSAtPiAlc1slZF1cbiIsCisJCQkgICAgICBlbnRyeS0+aWQuc2VnbWVudCwgZW50cnktPmlkLmJ1cywKKwkJCSAgICAgIGVudHJ5LT5pZC5kZXZpY2UsICgnQScgKyBlbnRyeS0+cGluKSwgcHJ0LT5zb3VyY2UsCisJCQkgICAgICBlbnRyeS0+bGluay5pbmRleCkpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX3BydF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bm9kZSwgJmFjcGlfcHJ0LmVudHJpZXMpOwpAQCAtMTUxLDM4ICsxNDQsMjkgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIHZvaWQKLWFjcGlfcGNpX2lycV9kZWxfZW50cnkgKAotCWludAkJCQlzZWdtZW50LAotCWludAkJCQlidXMsCi0Jc3RydWN0IGFjcGlfcHJ0X2VudHJ5CQkqZW50cnkpCithY3BpX3BjaV9pcnFfZGVsX2VudHJ5KGludCBzZWdtZW50LCBpbnQgYnVzLCBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5KQogewotCWlmIChzZWdtZW50ID09IGVudHJ5LT5pZC5zZWdtZW50ICYmIGJ1cyA9PSBlbnRyeS0+aWQuYnVzKXsKKwlpZiAoc2VnbWVudCA9PSBlbnRyeS0+aWQuc2VnbWVudCAmJiBidXMgPT0gZW50cnktPmlkLmJ1cykgewogCQlhY3BpX3BydC5jb3VudC0tOwogCQlsaXN0X2RlbCgmZW50cnktPm5vZGUpOwogCQlrZnJlZShlbnRyeSk7CiAJfQogfQogCi0KLWludAotYWNwaV9wY2lfaXJxX2FkZF9wcnQgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JaW50CQkJc2VnbWVudCwKLQlpbnQJCQlidXMpCitpbnQgYWNwaV9wY2lfaXJxX2FkZF9wcnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc2VnbWVudCwgaW50IGJ1cykKIHsKLQlhY3BpX3N0YXR1cwkJCXN0YXR1cyA9IEFFX09LOwotCWNoYXIJCQkJKnBhdGhuYW1lID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJCWJ1ZmZlciA9IHswLCBOVUxMfTsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZQkqcHJ0ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZQkqZW50cnkgPSBOVUxMOwotCXN0YXRpYyBpbnQJCQlmaXJzdF90aW1lID0gMTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwljaGFyICpwYXRobmFtZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnQgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICplbnRyeSA9IE5VTEw7CisJc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2lycV9hZGRfcHJ0Iik7CiAKLQlwYXRobmFtZSA9IChjaGFyICopIGttYWxsb2MoQUNQSV9QQVRITkFNRV9NQVgsIEdGUF9LRVJORUwpOwotCWlmKCFwYXRobmFtZSkKKwlwYXRobmFtZSA9IChjaGFyICopa21hbGxvYyhBQ1BJX1BBVEhOQU1FX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXRobmFtZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCW1lbXNldChwYXRobmFtZSwgMCwgQUNQSV9QQVRITkFNRV9NQVgpOwogCkBAIC0yMDIsNyArMTg2LDcgQEAKIAlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIAogCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJOiBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgWyVzLl9QUlRdXG4iLAotCQlwYXRobmFtZSk7CisJICAgICAgIHBhdGhuYW1lKTsKIAogCS8qIAogCSAqIEV2YWx1YXRlIHRoaXMgX1BSVCBhbmQgYWRkIGl0cyBlbnRyaWVzIHRvIG91ciBnbG9iYWwgbGlzdCAoYWNwaV9wcnQpLgpAQCAtMjE0LDEyICsxOTgsMTIgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZShoYW5kbGUsICZidWZmZXIpOwogCWlmIChzdGF0dXMgIT0gQUVfQlVGRkVSX09WRVJGTE9XKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIF9QUlQgWyVzXVxuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJcHJ0ID0ga21hbGxvYyhidWZmZXIubGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBydCl7CisJaWYgKCFwcnQpIHsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCX0KIAltZW1zZXQocHJ0LCAwLCBidWZmZXIubGVuZ3RoKTsKQEAgLTIyOCw3ICsyMTIsNyBAQAogCXN0YXR1cyA9IGFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKGhhbmRsZSwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIF9QUlQgWyVzXVxuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CkBAIC0yMzgsNyArMjIyLDcgQEAKIAl3aGlsZSAoZW50cnkgJiYgKGVudHJ5LT5sZW5ndGggPiAwKSkgewogCQlhY3BpX3BjaV9pcnFfYWRkX2VudHJ5KGhhbmRsZSwgc2VnbWVudCwgYnVzLCBlbnRyeSk7CiAJCWVudHJ5ID0gKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICopCi0JCQkoKHVuc2lnbmVkIGxvbmcpIGVudHJ5ICsgZW50cnktPmxlbmd0aCk7CisJCSAgICAoKHVuc2lnbmVkIGxvbmcpZW50cnkgKyBlbnRyeS0+bGVuZ3RoKTsKIAl9CiAKIAlrZnJlZShwcnQpOwpAQCAtMjQ2LDE4ICsyMzAsMTggQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXZvaWQKLWFjcGlfcGNpX2lycV9kZWxfcHJ0IChpbnQgc2VnbWVudCwgaW50IGJ1cykKK3ZvaWQgYWNwaV9wY2lfaXJxX2RlbF9wcnQoaW50IHNlZ21lbnQsIGludCBidXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKm5vZGUgPSBOVUxMLCAqbiA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICAgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlID0gTlVMTCwgKm4gPSBOVUxMOworCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnkgPSBOVUxMOwogCi0JaWYgKCFhY3BpX3BydC5jb3VudCkgICAgeworCWlmICghYWNwaV9wcnQuY291bnQpIHsKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJOiBEZWxldGUgUENJIEludGVycnVwdCBSb3V0aW5nIFRhYmxlIGZvciAleDoleFxuIiwKLQkJc2VnbWVudCwgYnVzKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiQUNQSTogRGVsZXRlIFBDSSBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBmb3IgJXg6JXhcbiIsIHNlZ21lbnQsCisJICAgICAgIGJ1cyk7CiAJc3Bpbl9sb2NrKCZhY3BpX3BydF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbiwgJmFjcGlfcHJ0LmVudHJpZXMpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX3BydF9lbnRyeSwgbm9kZSk7CkBAIC0yNjYsMjYgKzI1MCwyNyBAQAogCX0KIAlzcGluX3VubG9jaygmYWNwaV9wcnRfbG9jayk7CiB9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSSBJbnRlcnJ1cHQgUm91dGluZyBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdHlwZWRlZiBpbnQgKCppcnFfbG9va3VwX2Z1bmMpKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqLCBpbnQgKiwgaW50ICosIGNoYXIgKiopOwordHlwZWRlZiBpbnQgKCppcnFfbG9va3VwX2Z1bmMpIChzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKiwgaW50ICosIGludCAqLCBjaGFyICoqKTsKIAogc3RhdGljIGludAogYWNwaV9wY2lfYWxsb2NhdGVfaXJxKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnksCi0JaW50CSplZGdlX2xldmVsLAotCWludAkqYWN0aXZlX2hpZ2hfbG93LAotCWNoYXIJKipsaW5rKQorCQkgICAgICBpbnQgKmVkZ2VfbGV2ZWwsIGludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbGluaykKIHsKLQlpbnQJaXJxOworCWludCBpcnE7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9hbGxvY2F0ZV9pcnEiKTsKIAogCWlmIChlbnRyeS0+bGluay5oYW5kbGUpIHsKIAkJaXJxID0gYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEoZW50cnktPmxpbmsuaGFuZGxlLAotCQkJZW50cnktPmxpbmsuaW5kZXgsIGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdywgbGluayk7CisJCQkJCQkgZW50cnktPmxpbmsuaW5kZXgsIGVkZ2VfbGV2ZWwsCisJCQkJCQkgYWN0aXZlX2hpZ2hfbG93LCBsaW5rKTsKIAkJaWYgKGlycSA8IDApIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgSVJRIGxpbmsgcm91dGluZyBlbnRyeVxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkgICJJbnZhbGlkIElSUSBsaW5rIHJvdXRpbmcgZW50cnlcbiIpKTsKIAkJCXJldHVybl9WQUxVRSgtMSk7CiAJCX0KIAl9IGVsc2UgewpAQCAtMzAwLDExICsyODUsOSBAQAogCiBzdGF0aWMgaW50CiBhY3BpX3BjaV9mcmVlX2lycShzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5LAotCWludAkqZWRnZV9sZXZlbCwKLQlpbnQJKmFjdGl2ZV9oaWdoX2xvdywKLQljaGFyCSoqbGluaykKKwkJICBpbnQgKmVkZ2VfbGV2ZWwsIGludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbGluaykKIHsKLQlpbnQJaXJxOworCWludCBpcnE7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9mcmVlX2lycSIpOwogCWlmIChlbnRyeS0+bGluay5oYW5kbGUpIHsKQEAgLTMxNCwzOCArMjk3LDM2IEBACiAJfQogCXJldHVybl9WQUxVRShpcnEpOwogfQorCiAvKgogICogYWNwaV9wY2lfaXJxX2xvb2t1cAogICogc3VjY2VzczogcmV0dXJuIElSUSA+PSAwCiAgKiBmYWlsdXJlOiByZXR1cm4gLTEKICAqLwogc3RhdGljIGludAotYWNwaV9wY2lfaXJxX2xvb2t1cCAoCi0Jc3RydWN0IHBjaV9idXMJCSpidXMsCi0JaW50CQkJZGV2aWNlLAotCWludAkJCXBpbiwKLQlpbnQJCQkqZWRnZV9sZXZlbCwKLQlpbnQJCQkqYWN0aXZlX2hpZ2hfbG93LAotCWNoYXIJCQkqKmxpbmssCi0JaXJxX2xvb2t1cF9mdW5jCQlmdW5jKQorYWNwaV9wY2lfaXJxX2xvb2t1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkgICAgaW50IGRldmljZSwKKwkJICAgIGludCBwaW4sCisJCSAgICBpbnQgKmVkZ2VfbGV2ZWwsCisJCSAgICBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKmxpbmssIGlycV9sb29rdXBfZnVuYyBmdW5jKQogewotCXN0cnVjdCBhY3BpX3BydF9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnkgPSBOVUxMOwogCWludCBzZWdtZW50ID0gcGNpX2RvbWFpbl9ucihidXMpOwogCWludCBidXNfbnIgPSBidXMtPm51bWJlcjsKIAlpbnQgcmV0OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfaXJxX2xvb2t1cCIpOwogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJIlNlYXJjaGluZyBmb3IgUFJUIGVudHJ5IGZvciAlMDJ4OiUwMng6JTAyeFslY11cbiIsIAotCQlzZWdtZW50LCBidXNfbnIsIGRldmljZSwgKCdBJyArIHBpbikpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJTZWFyY2hpbmcgZm9yIFBSVCBlbnRyeSBmb3IgJTAyeDolMDJ4OiUwMnhbJWNdXG4iLAorCQkJICBzZWdtZW50LCBidXNfbnIsIGRldmljZSwgKCdBJyArIHBpbikpKTsKIAotCWVudHJ5ID0gYWNwaV9wY2lfaXJxX2ZpbmRfcHJ0X2VudHJ5KHNlZ21lbnQsIGJ1c19uciwgZGV2aWNlLCBwaW4pOyAKKwllbnRyeSA9IGFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeShzZWdtZW50LCBidXNfbnIsIGRldmljZSwgcGluKTsKIAlpZiAoIWVudHJ5KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlBSVCBlbnRyeSBub3QgZm91bmRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9Ci0JCisKIAlyZXQgPSBmdW5jKGVudHJ5LCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3csIGxpbmspOwogCXJldHVybl9WQUxVRShyZXQpOwogfQpAQCAtMzU2LDE3ICszMzcsMTQgQEAKICAqIGZhaWx1cmU6IHJldHVybiA8IDAKICAqLwogc3RhdGljIGludAotYWNwaV9wY2lfaXJxX2Rlcml2ZSAoCi0Jc3RydWN0IHBjaV9kZXYJCSpkZXYsCi0JaW50CQkJcGluLAotCWludAkJCSplZGdlX2xldmVsLAotCWludAkJCSphY3RpdmVfaGlnaF9sb3csCi0JY2hhcgkJCSoqbGluaywKLQlpcnFfbG9va3VwX2Z1bmMJCWZ1bmMpCithY3BpX3BjaV9pcnFfZGVyaXZlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCSAgICBpbnQgcGluLAorCQkgICAgaW50ICplZGdlX2xldmVsLAorCQkgICAgaW50ICphY3RpdmVfaGlnaF9sb3csIGNoYXIgKipsaW5rLCBpcnFfbG9va3VwX2Z1bmMgZnVuYykKIHsKLQlzdHJ1Y3QgcGNpX2RldgkJKmJyaWRnZSA9IGRldjsKLQlpbnQJCQlpcnEgPSAtMTsKLQl1OAkJCWJyaWRnZV9waW4gPSAwOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXY7CisJaW50IGlycSA9IC0xOworCXU4IGJyaWRnZV9waW4gPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfaXJxX2Rlcml2ZSIpOwogCkBAIC0zODMsMjggKzM2MSwzMyBAQAogCiAJCWlmICgoYnJpZGdlLT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMpIHsKIAkJCS8qIFBDIGNhcmQgaGFzIHRoZSBzYW1lIElSUSBhcyBpdHMgY2FyZGJyaWRnZSAqLwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYnJpZGdlLCBQQ0lfSU5URVJSVVBUX1BJTiwgJmJyaWRnZV9waW4pOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYnJpZGdlLCBQQ0lfSU5URVJSVVBUX1BJTiwKKwkJCQkJICAgICAmYnJpZGdlX3Bpbik7CiAJCQlpZiAoIWJyaWRnZV9waW4pIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sIAotCQkJCQkiTm8gaW50ZXJydXB0IHBpbiBjb25maWd1cmVkIGZvciBkZXZpY2UgJXNcbiIsIHBjaV9uYW1lKGJyaWRnZSkpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCQkgICJObyBpbnRlcnJ1cHQgcGluIGNvbmZpZ3VyZWQgZm9yIGRldmljZSAlc1xuIiwKKwkJCQkJCSAgcGNpX25hbWUoYnJpZGdlKSkpOwogCQkJCXJldHVybl9WQUxVRSgtMSk7CiAJCQl9CiAJCQkvKiBQaW4gaXMgZnJvbSAwIHRvIDMgKi8KLQkJCWJyaWRnZV9waW4gLS07CisJCQlicmlkZ2VfcGluLS07CiAJCQlwaW4gPSBicmlkZ2VfcGluOwogCQl9CiAKIAkJaXJxID0gYWNwaV9wY2lfaXJxX2xvb2t1cChicmlkZ2UtPmJ1cywgUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksCi0JCQlwaW4sIGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdywgbGluaywgZnVuYyk7CisJCQkJCSAgcGluLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3csCisJCQkJCSAgbGluaywgZnVuYyk7CiAJfQogCiAJaWYgKGlycSA8IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiVW5hYmxlIHRvIGRlcml2ZSBJUlEgZm9yIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiVW5hYmxlIHRvIGRlcml2ZSBJUlEgZm9yIGRldmljZSAlc1xuIiwKKwkJCQkgIHBjaV9uYW1lKGRldikpKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXJpdmUgSVJRICVkIGZvciBkZXZpY2UgJXMgZnJvbSAlc1xuIiwKLQkJaXJxLCBwY2lfbmFtZShkZXYpLCBwY2lfbmFtZShicmlkZ2UpKSk7CisJCQkgIGlycSwgcGNpX25hbWUoZGV2KSwgcGNpX25hbWUoYnJpZGdlKSkpOwogCiAJcmV0dXJuX1ZBTFVFKGlycSk7CiB9CkBAIC00MTUsMzAgKzM5OCwzMiBAQAogICogZmFpbHVyZTogcmV0dXJuIDwgMAogICovCiAKLWludAotYWNwaV9wY2lfaXJxX2VuYWJsZSAoCi0Jc3RydWN0IHBjaV9kZXYJCSpkZXYpCitpbnQgYWNwaV9wY2lfaXJxX2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludAkJCWlycSA9IDA7Ci0JdTgJCQlwaW4gPSAwOwotCWludAkJCWVkZ2VfbGV2ZWwgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQlpbnQJCQlhY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7Ci0JY2hhcgkJCSpsaW5rID0gTlVMTDsKKwlpbnQgaXJxID0gMDsKKwl1OCBwaW4gPSAwOworCWludCBlZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisJaW50IGFjdGl2ZV9oaWdoX2xvdyA9IEFDUElfQUNUSVZFX0xPVzsKKwljaGFyICpsaW5rID0gTlVMTDsKKwlpbnQgcmM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9pcnFfZW5hYmxlIik7CiAKIAlpZiAoIWRldikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQorCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CiAJaWYgKCFwaW4pIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gaW50ZXJydXB0IHBpbiBjb25maWd1cmVkIGZvciBkZXZpY2UgJXNcbiIsIHBjaV9uYW1lKGRldikpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIk5vIGludGVycnVwdCBwaW4gY29uZmlndXJlZCBmb3IgZGV2aWNlICVzXG4iLAorCQkJCSAgcGNpX25hbWUoZGV2KSkpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCXBpbi0tOwogCiAJaWYgKCFkZXYtPmJ1cykgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCAoTlVMTCkgJ2J1cycgZmllbGRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIChOVUxMKSAnYnVzJyBmaWVsZFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCkBAIC00NDYsNjkgKzQzMSw3NiBAQAogCSAqIEZpcnN0IHdlIGNoZWNrIHRoZSBQQ0kgSVJRIHJvdXRpbmcgdGFibGUgKFBSVCkgZm9yIGFuIElSUS4gIFBSVAogCSAqIHZhbHVlcyBvdmVycmlkZSBhbnkgQklPUy1hc3NpZ25lZCBJUlFzIHNldCBkdXJpbmcgYm9vdC4KIAkgKi8KLSAJaXJxID0gYWNwaV9wY2lfaXJxX2xvb2t1cChkZXYtPmJ1cywgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiwKLQkJJmVkZ2VfbGV2ZWwsICZhY3RpdmVfaGlnaF9sb3csICZsaW5rLCBhY3BpX3BjaV9hbGxvY2F0ZV9pcnEpOworCWlycSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCisJCQkJICAmZWRnZV9sZXZlbCwgJmFjdGl2ZV9oaWdoX2xvdywgJmxpbmssCisJCQkJICBhY3BpX3BjaV9hbGxvY2F0ZV9pcnEpOwogCiAJLyoKIAkgKiBJZiBubyBQUlQgZW50cnkgd2FzIGZvdW5kLCB3ZSdsbCB0cnkgdG8gZGVyaXZlIGFuIElSUSBmcm9tIHRoZQogCSAqIGRldmljZSdzIHBhcmVudCBicmlkZ2UuCiAJICovCiAJaWYgKGlycSA8IDApCi0gCQlpcnEgPSBhY3BpX3BjaV9pcnFfZGVyaXZlKGRldiwgcGluLCAmZWRnZV9sZXZlbCwKLQkJCSZhY3RpdmVfaGlnaF9sb3csICZsaW5rLCBhY3BpX3BjaV9hbGxvY2F0ZV9pcnEpOwotIAorCQlpcnEgPSBhY3BpX3BjaV9pcnFfZGVyaXZlKGRldiwgcGluLCAmZWRnZV9sZXZlbCwKKwkJCQkJICAmYWN0aXZlX2hpZ2hfbG93LCAmbGluaywKKwkJCQkJICBhY3BpX3BjaV9hbGxvY2F0ZV9pcnEpOworCiAJLyoKIAkgKiBObyBJUlEga25vd24gdG8gdGhlIEFDUEkgc3Vic3lzdGVtIC0gbWF5YmUgdGhlIEJJT1MgLyAKIAkgKiBkcml2ZXIgcmVwb3J0ZWQgb25lLCB0aGVuIHVzZSBpdC4gRXhpdCBpbiBhbnkgY2FzZS4KIAkgKi8KIAlpZiAoaXJxIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiUENJIEludGVycnVwdCAlc1slY106IG5vIEdTSSIsCi0JCQlwY2lfbmFtZShkZXYpLCAoJ0EnICsgcGluKSk7CisJCSAgICAgICBwY2lfbmFtZShkZXYpLCAoJ0EnICsgcGluKSk7CiAJCS8qIEludGVycnVwdCBMaW5lIHZhbHVlcyBhYm92ZSAweEYgYXJlIGZvcmJpZGRlbiAqLwogCQlpZiAoZGV2LT5pcnEgPiAwICYmIChkZXYtPmlycSA8PSAweEYpKSB7CiAJCQlwcmludGsoIiAtIHVzaW5nIElSUSAlZFxuIiwgZGV2LT5pcnEpOwotCQkJYWNwaV9yZWdpc3Rlcl9nc2koZGV2LT5pcnEsIEFDUElfTEVWRUxfU0VOU0lUSVZFLCBBQ1BJX0FDVElWRV9MT1cpOworCQkJYWNwaV9yZWdpc3Rlcl9nc2koZGV2LT5pcnEsIEFDUElfTEVWRUxfU0VOU0lUSVZFLAorCQkJCQkgIEFDUElfQUNUSVZFX0xPVyk7CiAJCQlyZXR1cm5fVkFMVUUoMCk7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlwcmludGsoIlxuIik7CiAJCQlyZXR1cm5fVkFMVUUoMCk7CiAJCX0KLSAJfQorCX0KIAotCWRldi0+aXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCXJjID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlBDSSBJbnRlcnJ1cHQgJXNbJWNdOiBmYWlsZWQgIgorCQkgICAgICAgInRvIHJlZ2lzdGVyIEdTSVxuIiwgcGNpX25hbWUoZGV2KSwgKCdBJyArIHBpbikpOworCQlyZXR1cm5fVkFMVUUocmMpOworCX0KKwlkZXYtPmlycSA9IHJjOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBDSSBJbnRlcnJ1cHQgJXNbJWNdIC0+ICIsCi0JCXBjaV9uYW1lKGRldiksICdBJyArIHBpbik7CisJICAgICAgIHBjaV9uYW1lKGRldiksICdBJyArIHBpbik7CiAKIAlpZiAobGluaykKIAkJcHJpbnRrKCJMaW5rIFslc10gLT4gIiwgbGluayk7CiAKIAlwcmludGsoIkdTSSAldSAoJXMsICVzKSAtPiBJUlEgJWRcbiIsIGlycSwKLQkJKGVkZ2VfbGV2ZWwgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpID8gImxldmVsIiA6ICJlZGdlIiwKLQkJKGFjdGl2ZV9oaWdoX2xvdyA9PSBBQ1BJX0FDVElWRV9MT1cpID8gImxvdyIgOiAiaGlnaCIsCi0JCWRldi0+aXJxKTsKKwkgICAgICAgKGVkZ2VfbGV2ZWwgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpID8gImxldmVsIiA6ICJlZGdlIiwKKwkgICAgICAgKGFjdGl2ZV9oaWdoX2xvdyA9PSBBQ1BJX0FDVElWRV9MT1cpID8gImxvdyIgOiAiaGlnaCIsIGRldi0+aXJxKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3BjaV9pcnFfZW5hYmxlKTsKIAotCiAvKiBGSVhNRTogaW1wbGVtZW50IHg4Ni94ODZfNjQgdmVyc2lvbiAqLwotdm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgYWNwaV91bnJlZ2lzdGVyX2dzaSh1MzIgaSkge30KLQotdm9pZAotYWNwaV9wY2lfaXJxX2Rpc2FibGUgKAotCXN0cnVjdCBwY2lfZGV2CQkqZGV2KQordm9pZCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIGFjcGlfdW5yZWdpc3Rlcl9nc2kodTMyIGkpCiB7Ci0JaW50CQkJZ3NpID0gMDsKLQl1OAkJCXBpbiA9IDA7Ci0JaW50CQkJZWRnZV9sZXZlbCA9IEFDUElfTEVWRUxfU0VOU0lUSVZFOwotCWludAkJCWFjdGl2ZV9oaWdoX2xvdyA9IEFDUElfQUNUSVZFX0xPVzsKK30KKwordm9pZCBhY3BpX3BjaV9pcnFfZGlzYWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBnc2kgPSAwOworCXU4IHBpbiA9IDA7CisJaW50IGVkZ2VfbGV2ZWwgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKwlpbnQgYWN0aXZlX2hpZ2hfbG93ID0gQUNQSV9BQ1RJVkVfTE9XOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfaXJxX2Rpc2FibGUiKTsKIAotCWlmICghZGV2KQorCWlmICghZGV2IHx8ICFkZXYtPmJ1cykKIAkJcmV0dXJuX1ZPSUQ7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKQEAgLTUxNiwyMSArNTA4LDIwIEBACiAJCXJldHVybl9WT0lEOwogCXBpbi0tOwogCi0JaWYgKCFkZXYtPmJ1cykKLQkJcmV0dXJuX1ZPSUQ7Ci0KIAkvKgogCSAqIEZpcnN0IHdlIGNoZWNrIHRoZSBQQ0kgSVJRIHJvdXRpbmcgdGFibGUgKFBSVCkgZm9yIGFuIElSUS4KIAkgKi8KLSAJZ3NpID0gYWNwaV9wY2lfaXJxX2xvb2t1cChkZXYtPmJ1cywgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiwKLQkJCSZlZGdlX2xldmVsLCAmYWN0aXZlX2hpZ2hfbG93LCBOVUxMLCBhY3BpX3BjaV9mcmVlX2lycSk7CisJZ3NpID0gYWNwaV9wY2lfaXJxX2xvb2t1cChkZXYtPmJ1cywgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiwKKwkJCQkgICZlZGdlX2xldmVsLCAmYWN0aXZlX2hpZ2hfbG93LCBOVUxMLAorCQkJCSAgYWNwaV9wY2lfZnJlZV9pcnEpOwogCS8qCiAJICogSWYgbm8gUFJUIGVudHJ5IHdhcyBmb3VuZCwgd2UnbGwgdHJ5IHRvIGRlcml2ZSBhbiBJUlEgZnJvbSB0aGUKIAkgKiBkZXZpY2UncyBwYXJlbnQgYnJpZGdlLgogCSAqLwogCWlmIChnc2kgPCAwKQotIAkJZ3NpID0gYWNwaV9wY2lfaXJxX2Rlcml2ZShkZXYsIHBpbiwKLQkJCSZlZGdlX2xldmVsLCAmYWN0aXZlX2hpZ2hfbG93LCBOVUxMLCBhY3BpX3BjaV9mcmVlX2lycSk7CisJCWdzaSA9IGFjcGlfcGNpX2lycV9kZXJpdmUoZGV2LCBwaW4sCisJCQkJCSAgJmVkZ2VfbGV2ZWwsICZhY3RpdmVfaGlnaF9sb3csIE5VTEwsCisJCQkJCSAgYWNwaV9wY2lfZnJlZV9pcnEpOwogCWlmIChnc2kgPCAwKQogCQlyZXR1cm5fVk9JRDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwppbmRleCA4MzRjMmNlLi44MjI5MmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwpAQCAtNDIsMzAgKzQyLDI2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgicGNpX2xpbmsiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfbGluayIpCiAjZGVmaW5lIEFDUElfUENJX0xJTktfQ0xBU1MJCSJwY2lfaXJxX3JvdXRpbmciCiAjZGVmaW5lIEFDUElfUENJX0xJTktfSElECQkiUE5QMEMwRiIKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19EUklWRVJfTkFNRQkiQUNQSSBQQ0kgSW50ZXJydXB0IExpbmsgRHJpdmVyIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0RFVklDRV9OQU1FCSJQQ0kgSW50ZXJydXB0IExpbmsiCiAjZGVmaW5lIEFDUElfUENJX0xJTktfRklMRV9JTkZPCQkiaW5mbyIKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19GSUxFX1NUQVRVUwkic3RhdGUiCi0KICNkZWZpbmUgQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEUgMTYKLQotc3RhdGljIGludCBhY3BpX3BjaV9saW5rX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX3BjaV9saW5rX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX3BjaV9saW5rX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX2xpbmtfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfUENJX0xJTktfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0JQUNQSV9QQ0lfTElOS19DTEFTUywKLQkuaWRzID0JCUFDUElfUENJX0xJTktfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPSAgICBhY3BpX3BjaV9saW5rX2FkZCwKLQkJCQkucmVtb3ZlID0gYWNwaV9wY2lfbGlua19yZW1vdmUsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9QQ0lfTElOS19EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1BDSV9MSU5LX0NMQVNTLAorCS5pZHMgPSBBQ1BJX1BDSV9MSU5LX0hJRCwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9wY2lfbGlua19hZGQsCisJCS5yZW1vdmUgPSBhY3BpX3BjaV9saW5rX3JlbW92ZSwKKwkJfSwKIH07CiAKIC8qCkBAIC03MywzMSArNjksMzAgQEAKICAqIGxhdGVyIGV2ZW4gdGhlIGxpbmsgaXMgZGlzYWJsZS4gSW5zdGVhZCwgd2UganVzdCByZXBpY2sgdGhlIGFjdGl2ZSBpcnEKICAqLwogc3RydWN0IGFjcGlfcGNpX2xpbmtfaXJxIHsKLQl1OAkJCWFjdGl2ZTsJCQkvKiBDdXJyZW50IElSUSAqLwotCXU4CQkJZWRnZV9sZXZlbDsJCS8qIEFsbCBJUlFzICovCi0JdTgJCQlhY3RpdmVfaGlnaF9sb3c7CS8qIEFsbCBJUlFzICovCi0JdTgJCQlyZXNvdXJjZV90eXBlOwotCXU4CQkJcG9zc2libGVfY291bnQ7Ci0JdTgJCQlwb3NzaWJsZVtBQ1BJX1BDSV9MSU5LX01BWF9QT1NTSUJMRV07Ci0JdTgJCQlpbml0aWFsaXplZDoxOwotCXU4CQkJcmVzZXJ2ZWQ6NzsKKwl1OCBhY3RpdmU7CQkvKiBDdXJyZW50IElSUSAqLworCXU4IGVkZ2VfbGV2ZWw7CQkvKiBBbGwgSVJRcyAqLworCXU4IGFjdGl2ZV9oaWdoX2xvdzsJLyogQWxsIElSUXMgKi8KKwl1OCByZXNvdXJjZV90eXBlOworCXU4IHBvc3NpYmxlX2NvdW50OworCXU4IHBvc3NpYmxlW0FDUElfUENJX0xJTktfTUFYX1BPU1NJQkxFXTsKKwl1OCBpbml0aWFsaXplZDoxOworCXU4IHJlc2VydmVkOjc7CiB9OwogCiBzdHJ1Y3QgYWNwaV9wY2lfbGluayB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlOwotCWFjcGlfaGFuZGxlCQloYW5kbGU7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAlzdHJ1Y3QgYWNwaV9wY2lfbGlua19pcnEgaXJxOwotCWludAkJCXJlZmNudDsKKwlpbnQgcmVmY250OwogfTsKIAogc3RhdGljIHN0cnVjdCB7Ci0JaW50CQkJY291bnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAllbnRyaWVzOwotfQkJCQlhY3BpX2xpbms7CisJaW50IGNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKK30gYWNwaV9saW5rOwogREVDTEFSRV9NVVRFWChhY3BpX2xpbmtfbG9jayk7CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kgTGluayBEZXZpY2UgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEwNiwxMiArMTAxLDEwIEBACiAgKiBzZXQgY29udGV4dCAobGluaykgcG9zc2libGUgbGlzdCBmcm9tIHJlc291cmNlIGxpc3QKICAqLwogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BjaV9saW5rX2NoZWNrX3Bvc3NpYmxlICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZQkqcmVzb3VyY2UsCi0Jdm9pZAkJCSpjb250ZXh0KQorYWNwaV9wY2lfbGlua19jaGVja19wb3NzaWJsZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKikgY29udGV4dDsKLQl1MzIJCQlpID0gMDsKKwlzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluayA9IChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqKWNvbnRleHQ7CisJdTMyIGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19jaGVja19wb3NzaWJsZSIpOwogCkBAIC0xMTksNjEgKzExMiw2OCBAQAogCWNhc2UgQUNQSV9SU1RZUEVfU1RBUlRfRFBGOgogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCWNhc2UgQUNQSV9SU1RZUEVfSVJROgotCXsKLQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICpwID0gJnJlc291cmNlLT5kYXRhLmlycTsKLQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiQmxhbmsgSVJRIHJlc291cmNlXG4iKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0JCWZvciAoaSA9IDA7IChpPHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzICYmIGk8QUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEUpOyBpKyspIHsKLQkJCWlmICghcC0+aW50ZXJydXB0c1tpXSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgSVJRICVkXG4iLCBwLT5pbnRlcnJ1cHRzW2ldKSk7Ci0JCQkJY29udGludWU7CisJCXsKKwkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5pcnE7CisJCQlpZiAoIXAgfHwgIXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJICAiQmxhbmsgSVJRIHJlc291cmNlXG4iKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCX0KLQkJCWxpbmstPmlycS5wb3NzaWJsZVtpXSA9IHAtPmludGVycnVwdHNbaV07Ci0JCQlsaW5rLT5pcnEucG9zc2libGVfY291bnQrKzsKKwkJCWZvciAoaSA9IDA7CisJCQkgICAgIChpIDwgcC0+bnVtYmVyX29mX2ludGVycnVwdHMKKwkJCSAgICAgICYmIGkgPCBBQ1BJX1BDSV9MSU5LX01BWF9QT1NTSUJMRSk7IGkrKykgeworCQkJCWlmICghcC0+aW50ZXJydXB0c1tpXSkgeworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCQkJICAiSW52YWxpZCBJUlEgJWRcbiIsCisJCQkJCQkJICBwLT5pbnRlcnJ1cHRzW2ldKSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlsaW5rLT5pcnEucG9zc2libGVbaV0gPSBwLT5pbnRlcnJ1cHRzW2ldOworCQkJCWxpbmstPmlycS5wb3NzaWJsZV9jb3VudCsrOworCQkJfQorCQkJbGluay0+aXJxLmVkZ2VfbGV2ZWwgPSBwLT5lZGdlX2xldmVsOworCQkJbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdyA9IHAtPmFjdGl2ZV9oaWdoX2xvdzsKKwkJCWxpbmstPmlycS5yZXNvdXJjZV90eXBlID0gQUNQSV9SU1RZUEVfSVJROworCQkJYnJlYWs7CiAJCX0KLQkJbGluay0+aXJxLmVkZ2VfbGV2ZWwgPSBwLT5lZGdlX2xldmVsOwotCQlsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93ID0gcC0+YWN0aXZlX2hpZ2hfbG93OwotCQlsaW5rLT5pcnEucmVzb3VyY2VfdHlwZSA9IEFDUElfUlNUWVBFX0lSUTsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKLQl7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKnAgPSAmcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxOwotCQlpZiAoIXAgfHwgIXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sIAotCQkJCSJCbGFuayBFWFQgSVJRIHJlc291cmNlXG4iKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0JCWZvciAoaSA9IDA7IChpPHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzICYmIGk8QUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEUpOyBpKyspIHsKLQkJCWlmICghcC0+aW50ZXJydXB0c1tpXSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgSVJRICVkXG4iLCBwLT5pbnRlcnJ1cHRzW2ldKSk7Ci0JCQkJY29udGludWU7CisJCXsKKwkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKnAgPQorCQkJICAgICZyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnE7CisJCQlpZiAoIXAgfHwgIXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJICAiQmxhbmsgRVhUIElSUSByZXNvdXJjZVxuIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9Ci0JCQlsaW5rLT5pcnEucG9zc2libGVbaV0gPSBwLT5pbnRlcnJ1cHRzW2ldOwotCQkJbGluay0+aXJxLnBvc3NpYmxlX2NvdW50Kys7CisJCQlmb3IgKGkgPSAwOworCQkJICAgICAoaSA8IHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzCisJCQkgICAgICAmJiBpIDwgQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEUpOyBpKyspIHsKKwkJCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJCSAgIkludmFsaWQgSVJRICVkXG4iLAorCQkJCQkJCSAgcC0+aW50ZXJydXB0c1tpXSkpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJbGluay0+aXJxLnBvc3NpYmxlW2ldID0gcC0+aW50ZXJydXB0c1tpXTsKKwkJCQlsaW5rLT5pcnEucG9zc2libGVfY291bnQrKzsKKwkJCX0KKwkJCWxpbmstPmlycS5lZGdlX2xldmVsID0gcC0+ZWRnZV9sZXZlbDsKKwkJCWxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3cgPSBwLT5hY3RpdmVfaGlnaF9sb3c7CisJCQlsaW5rLT5pcnEucmVzb3VyY2VfdHlwZSA9IEFDUElfUlNUWVBFX0VYVF9JUlE7CisJCQlicmVhazsKIAkJfQotCQlsaW5rLT5pcnEuZWRnZV9sZXZlbCA9IHAtPmVkZ2VfbGV2ZWw7Ci0JCWxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3cgPSBwLT5hY3RpdmVfaGlnaF9sb3c7Ci0JCWxpbmstPmlycS5yZXNvdXJjZV90eXBlID0gQUNQSV9SU1RZUEVfRVhUX0lSUTsKLQkJYnJlYWs7Ci0JfQogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJIlJlc291cmNlIGlzIG5vdCBhbiBJUlEgZW50cnlcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJSZXNvdXJjZSBpcyBub3QgYW4gSVJRIGVudHJ5XG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfVEVSTUlOQVRFKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX2dldF9wb3NzaWJsZSAoCi0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmspCitzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfZ2V0X3Bvc3NpYmxlKHN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19nZXRfcG9zc2libGUiKTsKIApAQCAtMTgxLDYyICsxODEsNjAgQEAKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCiAJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhsaW5rLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCi0JCQlhY3BpX3BjaV9saW5rX2NoZWNrX3Bvc3NpYmxlLCBsaW5rKTsKKwkJCQkgICAgIGFjcGlfcGNpX2xpbmtfY2hlY2tfcG9zc2libGUsIGxpbmspOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZXZhbHVhdGluZyBfUFJTXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sIAotCQkiRm91bmQgJWQgcG9zc2libGUgSVJRc1xuIiwgbGluay0+aXJxLnBvc3NpYmxlX2NvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRm91bmQgJWQgcG9zc2libGUgSVJRc1xuIiwKKwkJCSAgbGluay0+aXJxLnBvc3NpYmxlX2NvdW50KSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BjaV9saW5rX2NoZWNrX2N1cnJlbnQgKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlCSpyZXNvdXJjZSwKLQl2b2lkCQkJKmNvbnRleHQpCithY3BpX3BjaV9saW5rX2NoZWNrX2N1cnJlbnQoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQogewotCWludAkJCSppcnEgPSAoaW50ICopIGNvbnRleHQ7CisJaW50ICppcnEgPSAoaW50ICopY29udGV4dDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfY2hlY2tfY3VycmVudCIpOwogCiAJc3dpdGNoIChyZXNvdXJjZS0+aWQpIHsKIAljYXNlIEFDUElfUlNUWVBFX0lSUToKLQl7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5pcnE7Ci0JCWlmICghcCB8fCAhcC0+bnVtYmVyX29mX2ludGVycnVwdHMpIHsKLQkJCS8qCi0JCQkgKiBJUlEgZGVzY3JpcHRvcnMgbWF5IGhhdmUgbm8gSVJRIyBiaXRzIHNldCwKLQkJCSAqIHBhcnRpY3VsYXJseSB0aG9zZSB0aG9zZSB3LyBfU1RBIGRpc2FibGVkCi0JCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkiQmxhbmsgSVJRIHJlc291cmNlXG4iKSk7IAotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJeworCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICpwID0gJnJlc291cmNlLT5kYXRhLmlycTsKKwkJCWlmICghcCB8fCAhcC0+bnVtYmVyX29mX2ludGVycnVwdHMpIHsKKwkJCQkvKgorCQkJCSAqIElSUSBkZXNjcmlwdG9ycyBtYXkgaGF2ZSBubyBJUlEjIGJpdHMgc2V0LAorCQkJCSAqIHBhcnRpY3VsYXJseSB0aG9zZSB0aG9zZSB3LyBfU1RBIGRpc2FibGVkCisJCQkJICovCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiQmxhbmsgSVJRIHJlc291cmNlXG4iKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJCX0KKwkJCSppcnEgPSBwLT5pbnRlcnJ1cHRzWzBdOworCQkJYnJlYWs7CiAJCX0KLQkJKmlycSA9IHAtPmludGVycnVwdHNbMF07Ci0JCWJyZWFrOwotCX0KIAljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICpwID0gJnJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycTsKLQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgewotCQkJLyoKLQkJCSAqIGV4dGVuZGVkIElSUSBkZXNjcmlwdG9ycyBtdXN0Ci0JCQkgKiByZXR1cm4gYXQgbGVhc3QgMSBJUlEKLQkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAotCQkJCSJCbGFuayBFWFQgSVJRIHJlc291cmNlXG4iKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl7CisJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICpwID0KKwkJCSAgICAmcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxOworCQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgeworCQkJCS8qCisJCQkJICogZXh0ZW5kZWQgSVJRIGRlc2NyaXB0b3JzIG11c3QKKwkJCQkgKiByZXR1cm4gYXQgbGVhc3QgMSBJUlEKKwkJCQkgKi8KKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCQkgICJCbGFuayBFWFQgSVJRIHJlc291cmNlXG4iKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJCX0KKwkJCSppcnEgPSBwLT5pbnRlcnJ1cHRzWzBdOworCQkJYnJlYWs7CiAJCX0KLQkJKmlycSA9IHAtPmludGVycnVwdHNbMF07Ci0JCWJyZWFrOwotCX0KIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlJlc291cmNlIGlzbid0IGFuIElSUVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiUmVzb3VyY2UgaXNuJ3QgYW4gSVJRXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1RFUk1JTkFURSk7CkBAIC0yNDksMTMgKzI0NywxMSBAQAogICogMCAtIHN1Y2Nlc3MKICAqICEwIC0gZmFpbHVyZQogICovCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX2dldF9jdXJyZW50ICgKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluawkqbGluaykKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19nZXRfY3VycmVudChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluaykKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQlpcnEgPSAwOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWludCBpcnEgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19nZXRfY3VycmVudCIpOwogCkBAIC0yNjksNyArMjY1LDggQEAKIAkJLyogUXVlcnkgX1NUQSwgc2V0IGxpbmstPmRldmljZS0+c3RhdHVzICovCiAJCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9zdGF0dXMobGluay0+ZGV2aWNlKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlVuYWJsZSB0byByZWFkIHN0YXR1c1xuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiVW5hYmxlIHRvIHJlYWQgc3RhdHVzXG4iKSk7CiAJCQlnb3RvIGVuZDsKIAkJfQogCkBAIC0yODQsNyArMjgxLDcgQEAKIAkgKi8KIAogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMobGluay0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQkJYWNwaV9wY2lfbGlua19jaGVja19jdXJyZW50LCAmaXJxKTsKKwkJCQkgICAgIGFjcGlfcGNpX2xpbmtfY2hlY2tfY3VycmVudCwgJmlycSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIF9DUlNcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKQEAgLTMwMCw1OCArMjk3LDYxIEBACiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJMaW5rIGF0IElSUSAlZCBcbiIsIGxpbmstPmlycS5hY3RpdmUpKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX3NldCAoCi0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmssCi0JaW50CQkJaXJxKQorc3RhdGljIGludCBhY3BpX3BjaV9saW5rX3NldChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluaywgaW50IGlycSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZQlyZXM7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlCWVuZDsKLQl9ICAgICpyZXNvdXJjZTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0gezAsIE5VTEx9OworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSByZXM7CisJCXN0cnVjdCBhY3BpX3Jlc291cmNlIGVuZDsKKwl9ICpyZXNvdXJjZTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAwLCBOVUxMIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX3NldCIpOwogCiAJaWYgKCFsaW5rIHx8ICFpcnEpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXJlc291cmNlID0ga21hbGxvYyggc2l6ZW9mKCpyZXNvdXJjZSkrMSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIXJlc291cmNlKQorCXJlc291cmNlID0ga21hbGxvYyhzaXplb2YoKnJlc291cmNlKSArIDEsIEdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAotCW1lbXNldChyZXNvdXJjZSwgMCwgc2l6ZW9mKCpyZXNvdXJjZSkrMSk7Ci0JYnVmZmVyLmxlbmd0aCA9IHNpemVvZigqcmVzb3VyY2UpICsxOworCW1lbXNldChyZXNvdXJjZSwgMCwgc2l6ZW9mKCpyZXNvdXJjZSkgKyAxKTsKKwlidWZmZXIubGVuZ3RoID0gc2l6ZW9mKCpyZXNvdXJjZSkgKyAxOwogCWJ1ZmZlci5wb2ludGVyID0gcmVzb3VyY2U7CiAKLQlzd2l0Y2gobGluay0+aXJxLnJlc291cmNlX3R5cGUpIHsKKwlzd2l0Y2ggKGxpbmstPmlycS5yZXNvdXJjZV90eXBlKSB7CiAJY2FzZSBBQ1BJX1JTVFlQRV9JUlE6CiAJCXJlc291cmNlLT5yZXMuaWQgPSBBQ1BJX1JTVFlQRV9JUlE7CiAJCXJlc291cmNlLT5yZXMubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5lZGdlX2xldmVsID0gbGluay0+aXJxLmVkZ2VfbGV2ZWw7Ci0JCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93ID0gbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdzsKKwkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgPQorCQkgICAgbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdzsKIAkJaWYgKGxpbmstPmlycS5lZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUpCi0JCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX0VYQ0xVU0lWRTsKKwkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9CisJCQkgICAgQUNQSV9FWENMVVNJVkU7CiAJCWVsc2UKIAkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9IEFDUElfU0hBUkVEOwogCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID0gMTsKIAkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5pbnRlcnJ1cHRzWzBdID0gaXJxOwogCQlicmVhazsKLQkgICAKKwogCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKIAkJcmVzb3VyY2UtPnJlcy5pZCA9IEFDUElfUlNUWVBFX0VYVF9JUlE7CiAJCXJlc291cmNlLT5yZXMubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKLQkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciA9IEFDUElfQ09OU1VNRVI7Ci0JCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCA9IGxpbmstPmlycS5lZGdlX2xldmVsOwotCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdyA9IGxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3c7CisJCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIgPQorCQkgICAgQUNQSV9DT05TVU1FUjsKKwkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsID0KKwkJICAgIGxpbmstPmlycS5lZGdlX2xldmVsOworCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdyA9CisJCSAgICBsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93OwogCQlpZiAobGluay0+aXJxLmVkZ2VfbGV2ZWwgPT0gQUNQSV9FREdFX1NFTlNJVElWRSkKLQkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9IEFDUElfRVhDTFVTSVZFOworCQkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0KKwkJCSAgICBBQ1BJX0VYQ0xVU0lWRTsKIAkJZWxzZQogCQkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9TSEFSRUQ7CiAJCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSAxOwpAQCAtMzg0LDkgKzM4NCw5IEBACiAJfQogCWlmICghbGluay0+ZGV2aWNlLT5zdGF0dXMuZW5hYmxlZCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAotCQkJIiVzIFslc10gZGlzYWJsZWQgYW5kIHJlZmVyZW5jZWQsIEJJT1MgYnVnLlxuIiwKLQkJCWFjcGlfZGV2aWNlX25hbWUobGluay0+ZGV2aWNlKSwKLQkJCWFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpKTsKKwkJICAgICAgICIlcyBbJXNdIGRpc2FibGVkIGFuZCByZWZlcmVuY2VkLCBCSU9TIGJ1Zy5cbiIsCisJCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGxpbmstPmRldmljZSksCisJCSAgICAgICBhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSk7CiAJfQogCiAJLyogUXVlcnkgX0NSUywgc2V0IGxpbmstPmlycS5hY3RpdmUgKi8KQEAgLTQwNCwyMiArNDA0LDIwIEBACiAJCSAqIHBvbGljeTogd2hlbiBfQ1JTIGRvZXNuJ3QgcmV0dXJuIHdoYXQgd2UganVzdCBfU1JTCiAJCSAqIGFzc3VtZSBfU1JTIHdvcmtlZCBhbmQgb3ZlcnJpZGUgX0NSUyB2YWx1ZS4KIAkJICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYIAotCQkJIiVzIFslc10gQklPUyByZXBvcnRlZCBJUlEgJWQsIHVzaW5nIElSUSAlZFxuIiwKLQkJCWFjcGlfZGV2aWNlX25hbWUobGluay0+ZGV2aWNlKSwKLQkJCWFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpLAotCQkJbGluay0+aXJxLmFjdGl2ZSwgaXJxKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICIlcyBbJXNdIEJJT1MgcmVwb3J0ZWQgSVJRICVkLCB1c2luZyBJUlEgJWRcbiIsCisJCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGxpbmstPmRldmljZSksCisJCSAgICAgICBhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSwgbGluay0+aXJxLmFjdGl2ZSwgaXJxKTsKIAkJbGluay0+aXJxLmFjdGl2ZSA9IGlycTsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJTZXQgSVJRICVkXG4iLCBsaW5rLT5pcnEuYWN0aXZlKSk7Ci0JCi1lbmQ6CisKKyAgICAgIGVuZDoKIAlrZnJlZShyZXNvdXJjZSk7CiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kgTGluayBJUlEgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ2OSw4ICs0NjcsOCBAQAogCVBJUlFfUEVOQUxUWV9JU0FfQUxXQVlTLAkvKiBJUlEwIHRpbWVyICovCiAJUElSUV9QRU5BTFRZX0lTQV9BTFdBWVMsCS8qIElSUTEga2V5Ym9hcmQgKi8KIAlQSVJRX1BFTkFMVFlfSVNBX0FMV0FZUywJLyogSVJRMiBjYXNjYWRlICovCi0JUElSUV9QRU5BTFRZX0lTQV9UWVBJQ0FMLAkvKiBJUlEzCXNlcmlhbCAqLwotCVBJUlFfUEVOQUxUWV9JU0FfVFlQSUNBTCwJLyogSVJRNAlzZXJpYWwgKi8KKwlQSVJRX1BFTkFMVFlfSVNBX1RZUElDQUwsCS8qIElSUTMgc2VyaWFsICovCisJUElSUV9QRU5BTFRZX0lTQV9UWVBJQ0FMLAkvKiBJUlE0IHNlcmlhbCAqLwogCVBJUlFfUEVOQUxUWV9JU0FfVFlQSUNBTCwJLyogSVJRNSBzb21ldGltZXMgU291bmRCbGFzdGVyICovCiAJUElSUV9QRU5BTFRZX0lTQV9UWVBJQ0FMLAkvKiBJUlE2ICovCiAJUElSUV9QRU5BTFRZX0lTQV9UWVBJQ0FMLAkvKiBJUlE3IHBhcmFsbGVsLCBzcHVyaW91cyAqLwpAQCAtNDgyLDE1ICs0ODAsMTQgQEAKIAlQSVJRX1BFTkFMVFlfSVNBX1VTRUQsCS8qIElSUTEzIGZwZSwgc29tZXRpbWVzICovCiAJUElSUV9QRU5BTFRZX0lTQV9VU0VELAkvKiBJUlExNCBpZGUwICovCiAJUElSUV9QRU5BTFRZX0lTQV9VU0VELAkvKiBJUlExNSBpZGUxICovCi0JCQkvKiA+SVJRMTUgKi8KKwkvKiA+SVJRMTUgKi8KIH07CiAKLWludCBfX2luaXQKLWFjcGlfaXJxX3BlbmFsdHlfaW5pdCh2b2lkKQoraW50IF9faW5pdCBhY3BpX2lycV9wZW5hbHR5X2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSpub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluayAgICAqbGluayA9IE5VTEw7Ci0JaW50CQkJaSA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmsgPSBOVUxMOworCWludCBpID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaXJxX3BlbmFsdHlfaW5pdCIpOwogCkBAIC01MDEsNyArNDk4LDggQEAKIAogCQlsaW5rID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9wY2lfbGluaywgbm9kZSk7CiAJCWlmICghbGluaykgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgbGluayBjb250ZXh0XG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIGxpbmsgY29udGV4dFxuIikpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNTEwLDE1ICs1MDgsMjAgQEAKIAkJICogdXNlZnVsIGZvciBicmVha2luZyB0aWVzLgogCQkgKi8KIAkJaWYgKGxpbmstPmlycS5wb3NzaWJsZV9jb3VudCkgewotCQkJaW50IHBlbmFsdHkgPSBQSVJRX1BFTkFMVFlfUENJX1BPU1NJQkxFIC8gbGluay0+aXJxLnBvc3NpYmxlX2NvdW50OworCQkJaW50IHBlbmFsdHkgPQorCQkJICAgIFBJUlFfUEVOQUxUWV9QQ0lfUE9TU0lCTEUgLworCQkJICAgIGxpbmstPmlycS5wb3NzaWJsZV9jb3VudDsKIAogCQkJZm9yIChpID0gMDsgaSA8IGxpbmstPmlycS5wb3NzaWJsZV9jb3VudDsgaSsrKSB7CiAJCQkJaWYgKGxpbmstPmlycS5wb3NzaWJsZVtpXSA8IEFDUElfTUFYX0lTQV9JUlEpCi0JCQkJCWFjcGlfaXJxX3BlbmFsdHlbbGluay0+aXJxLnBvc3NpYmxlW2ldXSArPSBwZW5hbHR5OworCQkJCQlhY3BpX2lycV9wZW5hbHR5W2xpbmstPmlycS4KKwkJCQkJCQkgcG9zc2libGVbaV1dICs9CisJCQkJCSAgICBwZW5hbHR5OwogCQkJfQogCiAJCX0gZWxzZSBpZiAobGluay0+aXJxLmFjdGl2ZSkgewotCQkJYWNwaV9pcnFfcGVuYWx0eVtsaW5rLT5pcnEuYWN0aXZlXSArPSBQSVJRX1BFTkFMVFlfUENJX1BPU1NJQkxFOworCQkJYWNwaV9pcnFfcGVuYWx0eVtsaW5rLT5pcnEuYWN0aXZlXSArPQorCQkJICAgIFBJUlFfUEVOQUxUWV9QQ0lfUE9TU0lCTEU7CiAJCX0KIAl9CiAJLyogQWRkIGEgcGVuYWx0eSBmb3IgdGhlIFNDSSAqLwpAQCAtNTI5LDExICs1MzIsMTAgQEAKIAogc3RhdGljIGludCBhY3BpX2lycV9iYWxhbmNlOwkvKiAwOiBzdGF0aWMsIDE6IGJhbGFuY2UgKi8KIAotc3RhdGljIGludCBhY3BpX3BjaV9saW5rX2FsbG9jYXRlKAotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rKQorc3RhdGljIGludCBhY3BpX3BjaV9saW5rX2FsbG9jYXRlKHN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rKQogewotCWludAkJCWlycTsKLQlpbnQJCQlpOworCWludCBpcnE7CisJaW50IGk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX2FsbG9jYXRlIik7CiAKQEAgLTU1Nyw3ICs1NTksNyBAQAogCWlmIChpID09IGxpbmstPmlycS5wb3NzaWJsZV9jb3VudCkgewogCQlpZiAoYWNwaV9zdHJpY3QpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiX0NSUyAlZCBub3QgZm91bmQiCi0JCQkJIiBpbiBfUFJTXG4iLCBsaW5rLT5pcnEuYWN0aXZlKTsKKwkJCSAgICAgICAiIGluIF9QUlNcbiIsIGxpbmstPmlycS5hY3RpdmUpOwogCQlsaW5rLT5pcnEuYWN0aXZlID0gMDsKIAl9CiAKQEAgLTU3NiwyMyArNTc4LDI1IEBACiAJCSAqIHRoZSB1c2Ugb2YgSVJRcyA5LCAxMCwgMTEsIGFuZCA+MTUuCiAJCSAqLwogCQlmb3IgKGkgPSAobGluay0+aXJxLnBvc3NpYmxlX2NvdW50IC0gMSk7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoYWNwaV9pcnFfcGVuYWx0eVtpcnFdID4gYWNwaV9pcnFfcGVuYWx0eVtsaW5rLT5pcnEucG9zc2libGVbaV1dKQorCQkJaWYgKGFjcGlfaXJxX3BlbmFsdHlbaXJxXSA+CisJCQkgICAgYWNwaV9pcnFfcGVuYWx0eVtsaW5rLT5pcnEucG9zc2libGVbaV1dKQogCQkJCWlycSA9IGxpbmstPmlycS5wb3NzaWJsZVtpXTsKIAkJfQogCX0KIAogCS8qIEF0dGVtcHQgdG8gZW5hYmxlIHRoZSBsaW5rIGRldmljZSBhdCB0aGlzIElSUS4gKi8KIAlpZiAoYWNwaV9wY2lfbGlua19zZXQobGluaywgaXJxKSkgewotCQlwcmludGsoUFJFRklYICJVbmFibGUgdG8gc2V0IElSUSBmb3IgJXMgWyVzXSAobGlrZWx5IGJ1Z2d5IEFDUEkgQklPUykuXG4iCi0JCQkJIlRyeSBwY2k9bm9hY3BpIG9yIGFjcGk9b2ZmXG4iLAotCQkJYWNwaV9kZXZpY2VfbmFtZShsaW5rLT5kZXZpY2UpLAotCQkJYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpOworCQlwcmludGsoUFJFRklYCisJCSAgICAgICAiVW5hYmxlIHRvIHNldCBJUlEgZm9yICVzIFslc10gKGxpa2VseSBidWdneSBBQ1BJIEJJT1MpLlxuIgorCQkgICAgICAgIlRyeSBwY2k9bm9hY3BpIG9yIGFjcGk9b2ZmXG4iLAorCQkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShsaW5rLT5kZXZpY2UpLAorCQkgICAgICAgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfSBlbHNlIHsKIAkJYWNwaV9pcnFfcGVuYWx0eVtsaW5rLT5pcnEuYWN0aXZlXSArPSBQSVJRX1BFTkFMVFlfUENJX1VTSU5HOwotCQlwcmludGsoUFJFRklYICIlcyBbJXNdIGVuYWJsZWQgYXQgSVJRICVkXG4iLCAKLQkJCWFjcGlfZGV2aWNlX25hbWUobGluay0+ZGV2aWNlKSwKLQkJCWFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpLCBsaW5rLT5pcnEuYWN0aXZlKTsKKwkJcHJpbnRrKFBSRUZJWCAiJXMgWyVzXSBlbmFibGVkIGF0IElSUSAlZFxuIiwKKwkJICAgICAgIGFjcGlfZGV2aWNlX25hbWUobGluay0+ZGV2aWNlKSwKKwkJICAgICAgIGFjcGlfZGV2aWNlX2JpZChsaW5rLT5kZXZpY2UpLCBsaW5rLT5pcnEuYWN0aXZlKTsKIAl9CiAKIAlsaW5rLT5pcnEuaW5pdGlhbGl6ZWQgPSAxOwpAQCAtNjA3LDE2ICs2MTEsMTMgQEAKICAqLwogCiBpbnQKLWFjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCWluZGV4LAotCWludAkJCSplZGdlX2xldmVsLAotCWludAkJCSphY3RpdmVfaGlnaF9sb3csCi0JY2hhcgkJCSoqbmFtZSkKK2FjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgIGludCBpbmRleCwKKwkJCSAgIGludCAqZWRnZV9sZXZlbCwgaW50ICphY3RpdmVfaGlnaF9sb3csIGNoYXIgKipuYW1lKQogewotCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmsgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEiKTsKIApAQCAtNjI2LDcgKzYyNyw3IEBACiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQogCi0JbGluayA9IChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJbGluayA9IChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpZiAoIWxpbmspIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgbGluayBjb250ZXh0XG4iKSk7CiAJCXJldHVybl9WQUxVRSgtMSk7CkBAIC02NDMsMjAgKzY0NCwyNCBAQAogCQl1cCgmYWNwaV9saW5rX2xvY2spOwogCQlyZXR1cm5fVkFMVUUoLTEpOwogCX0KLQkgICAKKwogCWlmICghbGluay0+aXJxLmFjdGl2ZSkgewogCQl1cCgmYWNwaV9saW5rX2xvY2spOwogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTGluayBhY3RpdmUgSVJRIGlzIDAhXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQotCWxpbmstPnJlZmNudCArKzsKKwlsaW5rLT5yZWZjbnQrKzsKIAl1cCgmYWNwaV9saW5rX2xvY2spOwogCi0JaWYgKGVkZ2VfbGV2ZWwpICplZGdlX2xldmVsID0gbGluay0+aXJxLmVkZ2VfbGV2ZWw7Ci0JaWYgKGFjdGl2ZV9oaWdoX2xvdykgKmFjdGl2ZV9oaWdoX2xvdyA9IGxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3c7Ci0JaWYgKG5hbWUpICpuYW1lID0gYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSk7CisJaWYgKGVkZ2VfbGV2ZWwpCisJCSplZGdlX2xldmVsID0gbGluay0+aXJxLmVkZ2VfbGV2ZWw7CisJaWYgKGFjdGl2ZV9oaWdoX2xvdykKKwkJKmFjdGl2ZV9oaWdoX2xvdyA9IGxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3c7CisJaWYgKG5hbWUpCisJCSpuYW1lID0gYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSk7CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkiTGluayAlcyBpcyByZWZlcmVuY2VkXG4iLCBhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSkpOworCQkJICAiTGluayAlcyBpcyByZWZlcmVuY2VkXG4iLAorCQkJICBhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSkpOwogCXJldHVybl9WQUxVRShsaW5rLT5pcnEuYWN0aXZlKTsKIH0KIApAQCAtNjY0LDEyICs2NjksMTEgQEAKICAqIFdlIGRvbid0IGNoYW5nZSBsaW5rJ3MgaXJxIGluZm9ybWF0aW9uIGhlcmUuICBBZnRlciBpdCBpcyByZWVuYWJsZWQsIHdlCiAgKiBjb250aW51ZSB1c2UgdGhlIGluZm8KICAqLwotaW50Ci1hY3BpX3BjaV9saW5rX2ZyZWVfaXJxKGFjcGlfaGFuZGxlIGhhbmRsZSkKK2ludCBhY3BpX3BjaV9saW5rX2ZyZWVfaXJxKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmsgPSBOVUxMOwotCWFjcGlfc3RhdHVzCQlyZXN1bHQ7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rID0gTlVMTDsKKwlhY3BpX3N0YXR1cyByZXN1bHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX2ZyZWVfaXJxIik7CiAKQEAgLTY3OSw3ICs2ODMsNyBAQAogCQlyZXR1cm5fVkFMVUUoLTEpOwogCX0KIAotCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJaWYgKCFsaW5rKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGxpbmsgY29udGV4dFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLTEpOwpAQCAtNjkxLDcgKzY5NSw2IEBACiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJMaW5rIGlzbid0IGluaXRpYWxpemVkXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQotCiAjaWZkZWYJRlVUVVJFX1VTRQogCS8qCiAJICogVGhlIExpbmsgcmVmZXJlbmNlIGNvdW50IGFsbG93cyB1cyB0byBfRElTYWJsZSBhbiB1bnVzZWQgbGluawpAQCAtNzAyLDEwICs3MDUsMTEgQEAKIAkgKiB0byBwcmV2ZW50IGR1cGxpY2F0ZSBhY3BpX3BjaV9saW5rX3NldCgpCiAJICogd2hpY2ggd291bGQgaGFybSBzb21lIHN5c3RlbXMKIAkgKi8KLQlsaW5rLT5yZWZjbnQgLS07CisJbGluay0+cmVmY250LS07CiAjZW5kaWYKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCSJMaW5rICVzIGlzIGRlcmVmZXJlbmNlZFxuIiwgYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSkpKTsKKwkJCSAgIkxpbmsgJXMgaXMgZGVyZWZlcmVuY2VkXG4iLAorCQkJICBhY3BpX2RldmljZV9iaWQobGluay0+ZGV2aWNlKSkpOwogCiAJaWYgKGxpbmstPnJlZmNudCA9PSAwKSB7CiAJCWFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGxpbmstPmhhbmRsZSwgIl9ESVMiLCAwLCBOVUxMKTsKQEAgLTcxMywxOCArNzE3LDE3IEBACiAJdXAoJmFjcGlfbGlua19sb2NrKTsKIAlyZXR1cm5fVkFMVUUobGluay0+aXJxLmFjdGl2ZSk7CiB9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfcGNpX2xpbmsJKmxpbmsgPSBOVUxMOwotCWludAkJCWkgPSAwOwotCWludAkJCWZvdW5kID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluayA9IE5VTEw7CisJaW50IGkgPSAwOworCWludCBmb3VuZCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX2FkZCIpOwogCkBAIC03NTEsMTMgKzc1NCwxMiBAQAogCWFjcGlfcGNpX2xpbmtfZ2V0X2N1cnJlbnQobGluayk7CiAKIAlwcmludGsoUFJFRklYICIlcyBbJXNdIChJUlFzIiwgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAotCQlhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CisJICAgICAgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKIAlmb3IgKGkgPSAwOyBpIDwgbGluay0+aXJxLnBvc3NpYmxlX2NvdW50OyBpKyspIHsKIAkJaWYgKGxpbmstPmlycS5hY3RpdmUgPT0gbGluay0+aXJxLnBvc3NpYmxlW2ldKSB7CiAJCQlwcmludGsoIiAqJWQiLCBsaW5rLT5pcnEucG9zc2libGVbaV0pOwogCQkJZm91bmQgPSAxOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwcmludGsoIiAlZCIsIGxpbmstPmlycS5wb3NzaWJsZVtpXSk7CiAJfQogCkBAIC03NjYsNyArNzY4LDcgQEAKIAlpZiAoIWZvdW5kKQogCQlwcmludGsoIiAqJWQiLCBsaW5rLT5pcnEuYWN0aXZlKTsKIAotCWlmKCFsaW5rLT5kZXZpY2UtPnN0YXR1cy5lbmFibGVkKQorCWlmICghbGluay0+ZGV2aWNlLT5zdGF0dXMuZW5hYmxlZCkKIAkJcHJpbnRrKCIsIGRpc2FibGVkLiIpOwogCiAJcHJpbnRrKCJcbiIpOwpAQCAtNzc1LDcgKzc3Nyw3IEBACiAJbGlzdF9hZGRfdGFpbCgmbGluay0+bm9kZSwgJmFjcGlfbGluay5lbnRyaWVzKTsKIAlhY3BpX2xpbmsuY291bnQrKzsKIAotZW5kOgorICAgICAgZW5kOgogCS8qIGRpc2FibGUgYWxsIGxpbmtzIC0tIHRvIGJlIGFjdGl2YXRlZCBvbiB1c2UgKi8KIAlhY3BpX3V0X2V2YWx1YXRlX29iamVjdChsaW5rLT5oYW5kbGUsICJfRElTIiwgMCwgTlVMTCk7CiAJdXAoJmFjcGlfbGlua19sb2NrKTsKQEAgLTc4Niw5ICs3ODgsNyBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX3Jlc3VtZSgKLQlzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluaykKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19yZXN1bWUoc3RydWN0IGFjcGlfcGNpX2xpbmsgKmxpbmspCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfbGlua19yZXN1bWUiKTsKIApAQCAtODAzLDEyICs4MDMsMTAgQEAKICAqIGFmdGVyIGV2ZXJ5IGRldmljZSBjYWxscyBwY2lfZGlzYWJsZV9kZXZpY2UgaW4gLnJlc3VtZS4KICAqLwogaW50IGFjcGlfaW5fcmVzdW1lOwotc3RhdGljIGludAotaXJxcm91dGVyX3Jlc3VtZSgKLQlzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQorc3RhdGljIGludCBpcnFyb3V0ZXJfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKm5vZGUgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3BjaV9saW5rICAgICpsaW5rID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wY2lfbGluayAqbGluayA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpcnFyb3V0ZXJfcmVzdW1lIik7CiAKQEAgLTgxNyw3ICs4MTUsNyBAQAogCQlsaW5rID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9wY2lfbGluaywgbm9kZSk7CiAJCWlmICghbGluaykgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiSW52YWxpZCBsaW5rIGNvbnRleHRcbiIpKTsKKwkJCQkJICAiSW52YWxpZCBsaW5rIGNvbnRleHRcbiIpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWFjcGlfcGNpX2xpbmtfcmVzdW1lKGxpbmspOwpAQCAtODI2LDExICs4MjQsNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3BjaV9saW5rX3JlbW92ZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewogCXN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rID0gTlVMTDsKIApAQCAtODM5LDcgKzgzMyw3IEBACiAJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JbGluayA9IChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJbGluayA9IChzdHJ1Y3QgYWNwaV9wY2lfbGluayAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWRvd24oJmFjcGlfbGlua19sb2NrKTsKIAlsaXN0X2RlbCgmbGluay0+bm9kZSk7CkBAIC04NjEsMTQgKzg1NSwxNCBAQAogCQlpbnQgcmV0dmFsOwogCQlpbnQgaXJxOwogCi0JCXJldHZhbCA9IGdldF9vcHRpb24oJnN0ciwmaXJxKTsKKwkJcmV0dmFsID0gZ2V0X29wdGlvbigmc3RyLCAmaXJxKTsKIAogCQlpZiAoIXJldHZhbCkKIAkJCWJyZWFrOwkvKiBubyBudW1iZXIgZm91bmQgKi8KIAogCQlpZiAoaXJxIDwgMCkKIAkJCWNvbnRpbnVlOwotCQkKKwogCQlpZiAoaXJxID49IEFDUElfTUFYX0lSUVMpCiAJCQljb250aW51ZTsKIApAQCAtOTA3LDYgKzkwMSw3IEBACiB7CiAJcmV0dXJuIGFjcGlfaXJxX3BlbmFsdHlfdXBkYXRlKHN0ciwgMSk7CiB9CisKIF9fc2V0dXAoImFjcGlfaXJxX2lzYT0iLCBhY3BpX2lycV9pc2EpOwogCiAvKgpAQCAtOTE4LDYgKzkxMyw3IEBACiB7CiAJcmV0dXJuIGFjcGlfaXJxX3BlbmFsdHlfdXBkYXRlKHN0ciwgMCk7CiB9CisKIF9fc2V0dXAoImFjcGlfaXJxX3BjaT0iLCBhY3BpX2lycV9wY2kpOwogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2lycV9ub2JhbGFuY2Vfc2V0KGNoYXIgKnN0cikKQEAgLTkyNSw2ICs5MjEsNyBAQAogCWFjcGlfaXJxX2JhbGFuY2UgPSAwOwogCXJldHVybiAxOwogfQorCiBfX3NldHVwKCJhY3BpX2lycV9ub2JhbGFuY2UiLCBhY3BpX2lycV9ub2JhbGFuY2Vfc2V0KTsKIAogaW50IF9faW5pdCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpCkBAIC05MzIsMjIgKzkyOSwyMCBAQAogCWFjcGlfaXJxX2JhbGFuY2UgPSAxOwogCXJldHVybiAxOwogfQotX19zZXR1cCgiYWNwaV9pcnFfYmFsYW5jZSIsIGFjcGlfaXJxX2JhbGFuY2Vfc2V0KTsKIAorX19zZXR1cCgiYWNwaV9pcnFfYmFsYW5jZSIsIGFjcGlfaXJxX2JhbGFuY2Vfc2V0KTsKIAogLyogRklYTUU6IHdlIHdpbGwgcmVtb3ZlIHRoaXMgaW50ZXJmYWNlIGFmdGVyIGFsbCBkcml2ZXJzIGNhbGwgcGNpX2Rpc2FibGVfZGV2aWNlICovCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpcnFyb3V0ZXJfc3lzZGV2X2NsYXNzID0gewotICAgICAgICBzZXRfa3NldF9uYW1lKCJpcnFyb3V0ZXIiKSwKLSAgICAgICAgLnJlc3VtZSA9IGlycXJvdXRlcl9yZXN1bWUsCisJc2V0X2tzZXRfbmFtZSgiaXJxcm91dGVyIiksCisJLnJlc3VtZSA9IGlycXJvdXRlcl9yZXN1bWUsCiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfaXJxcm91dGVyID0gewotCS5pZCAgICAgPSAwLAotCS5jbHMgICAgPSAmaXJxcm91dGVyX3N5c2Rldl9jbGFzcywKKwkuaWQgPSAwLAorCS5jbHMgPSAmaXJxcm91dGVyX3N5c2Rldl9jbGFzcywKIH07CiAKLQogc3RhdGljIGludCBfX2luaXQgaXJxcm91dGVyX2luaXRfc3lzZnModm9pZCkKIHsKIAlpbnQgZXJyb3I7CkBAIC05NjIsMTIgKzk1NywxMSBAQAogCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX2lycXJvdXRlcik7CiAKIAlyZXR1cm5fVkFMVUUoZXJyb3IpOwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KIAogZGV2aWNlX2luaXRjYWxsKGlycXJvdXRlcl9pbml0X3N5c2ZzKTsKIAotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjaV9saW5rX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjaV9saW5rX2luaXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX2luaXQiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCA1ZDJmNzdmLi4wZmQ5OTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtMzUsMzUgKzM1LDMyIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgicGNpX3Jvb3QiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfcm9vdCIpCiAjZGVmaW5lIEFDUElfUENJX1JPT1RfQ0xBU1MJCSJwY2lfYnJpZGdlIgogI2RlZmluZSBBQ1BJX1BDSV9ST09UX0hJRAkJIlBOUDBBMDMiCiAjZGVmaW5lIEFDUElfUENJX1JPT1RfRFJJVkVSX05BTUUJIkFDUEkgUENJIFJvb3QgQnJpZGdlIERyaXZlciIKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9ERVZJQ0VfTkFNRQkiUENJIFJvb3QgQnJpZGdlIgotCi1zdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX3BjaV9yb290X3N0YXJ0IChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wY2lfcm9vdF9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9QQ0lfUk9PVF9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX1BDSV9ST09UX0NMQVNTLAotCS5pZHMgPQkJQUNQSV9QQ0lfUk9PVF9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9ICAgIGFjcGlfcGNpX3Jvb3RfYWRkLAotCQkJCS5yZW1vdmUgPSBhY3BpX3BjaV9yb290X3JlbW92ZSwKLQkJCQkuc3RhcnQgPSAgYWNwaV9wY2lfcm9vdF9zdGFydCwKLQkJCX0sCisJLm5hbWUgPSBBQ1BJX1BDSV9ST09UX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfUENJX1JPT1RfQ0xBU1MsCisJLmlkcyA9IEFDUElfUENJX1JPT1RfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX3BjaV9yb290X2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlLAorCQkuc3RhcnQgPSBhY3BpX3BjaV9yb290X3N0YXJ0LAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfcGNpX3Jvb3QgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlOwotCXN0cnVjdCBhY3BpX3BjaV9pZAlpZDsKLQlzdHJ1Y3QgcGNpX2J1cwkJKmJ1czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBhY3BpX3BjaV9pZCBpZDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogfTsKIAogc3RhdGljIExJU1RfSEVBRChhY3BpX3BjaV9yb290cyk7CkBAIC05Miw2ICs4OSw3IEBACiAKIAlyZXR1cm4gbjsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3BjaV9yZWdpc3Rlcl9kcml2ZXIpOwogCiB2b2lkIGFjcGlfcGNpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX3BjaV9kcml2ZXIgKmRyaXZlcikKQEAgLTExNSwxMCArMTEzLDExIEBACiAJCWRyaXZlci0+cmVtb3ZlKHJvb3QtPmhhbmRsZSk7CiAJfQogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfcGNpX3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1nZXRfcm9vdF9icmlkZ2VfYnVzbnJfY2FsbGJhY2sgKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqZGF0YSkKK2dldF9yb290X2JyaWRnZV9idXNucl9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmRhdGEpCiB7CiAJaW50ICpidXNuciA9IChpbnQgKilkYXRhOwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzOwpAQCAtMTI5LDIwICsxMjgsMjEgQEAKIAkJcmV0dXJuIEFFX09LOwogCiAJYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQocmVzb3VyY2UsICZhZGRyZXNzKTsKLQlpZiAoKGFkZHJlc3MuYWRkcmVzc19sZW5ndGggPiAwKSAmJiAKLQkgICAoYWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfQlVTX05VTUJFUl9SQU5HRSkpCisJaWYgKChhZGRyZXNzLmFkZHJlc3NfbGVuZ3RoID4gMCkgJiYKKwkgICAgKGFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0JVU19OVU1CRVJfUkFOR0UpKQogCQkqYnVzbnIgPSBhZGRyZXNzLm1pbl9hZGRyZXNzX3JhbmdlOwogCiAJcmV0dXJuIEFFX09LOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgCi10cnlfZ2V0X3Jvb3RfYnJpZGdlX2J1c25yKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpidXNudW0pCitzdGF0aWMgYWNwaV9zdGF0dXMgdHJ5X2dldF9yb290X2JyaWRnZV9idXNucihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqYnVzbnVtKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCSpidXNudW0gPSAtMTsKLQlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywgZ2V0X3Jvb3RfYnJpZGdlX2J1c25yX2NhbGxiYWNrLCBidXNudW0pOworCXN0YXR1cyA9CisJICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJCWdldF9yb290X2JyaWRnZV9idXNucl9jYWxsYmFjaywgYnVzbnVtKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7CiAJLyogQ2hlY2sgaWYgd2UgcmVhbGx5IGdldCBhIGJ1cyBudW1iZXIgZnJvbSBfQ1JTICovCkBAIC0xNTEsMTYgKzE1MSwxNCBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGludAotYWNwaV9wY2lfcm9vdF9hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3BjaV9yb290X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX3BjaV9yb290CSpyb290ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm9vdAkqdG1wOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQl1bnNpZ25lZCBsb25nCQl2YWx1ZSA9IDA7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QgPSBOVUxMOworCXN0cnVjdCBhY3BpX3BjaV9yb290ICp0bXA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX3Jvb3RfYWRkIik7CiAKQEAgLTE4OCwxNSArMTg2LDE1IEBACiAJICogLS0tLS0tLQogCSAqIE9idGFpbmVkIHZpYSBfU0VHLCBpZiBleGlzdHMsIG90aGVyd2lzZSBhc3N1bWVkIHRvIGJlIHplcm8gKDApLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihyb290LT5oYW5kbGUsIE1FVEhPRF9OQU1FX19TRUcsIE5VTEwsIAotCQkmdmFsdWUpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihyb290LT5oYW5kbGUsIE1FVEhPRF9OQU1FX19TRUcsIE5VTEwsCisJCQkJICAgICAgICZ2YWx1ZSk7CiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIEFFX09LOgogCQlyb290LT5pZC5zZWdtZW50ID0gKHUxNikgdmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgQUVfTk9UX0ZPVU5EOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sIAotCQkJIkFzc3VtaW5nIHNlZ21lbnQgMCAobm8gX1NFRylcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkFzc3VtaW5nIHNlZ21lbnQgMCAobm8gX1NFRylcbiIpKTsKIAkJcm9vdC0+aWQuc2VnbWVudCA9IDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMTAsOCArMjA4LDggQEAKIAkgKiAtLS0KIAkgKiBPYnRhaW5lZCB2aWEgX0JCTiwgaWYgZXhpc3RzLCBvdGhlcndpc2UgYXNzdW1lZCB0byBiZSB6ZXJvICgwKS4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIocm9vdC0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQkJOLCBOVUxMLCAKLQkJJnZhbHVlKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIocm9vdC0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQkJOLCBOVUxMLAorCQkJCSAgICAgICAmdmFsdWUpOwogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBBRV9PSzoKIAkJcm9vdC0+aWQuYnVzID0gKHUxNikgdmFsdWU7CkBAIC0yMjksMTggKzIyNywxOSBAQAogCS8qIFNvbWUgc3lzdGVtcyBoYXZlIHdyb25nIF9CQk4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmFjcGlfcGNpX3Jvb3RzLCBub2RlKSB7CiAJCWlmICgodG1wLT5pZC5zZWdtZW50ID09IHJvb3QtPmlkLnNlZ21lbnQpCi0JCQkJJiYgKHRtcC0+aWQuYnVzID09IHJvb3QtPmlkLmJ1cykpIHsKKwkJICAgICYmICh0bXAtPmlkLmJ1cyA9PSByb290LT5pZC5idXMpKSB7CiAJCQlpbnQgYnVzID0gMDsKIAkJCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkJIldyb25nIF9CQk4gdmFsdWUsIHBsZWFzZSByZWJvb3QgYW5kIHVzaW5nIG9wdGlvbiAncGNpPW5vYWNwaSdcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIldyb25nIF9CQk4gdmFsdWUsIHBsZWFzZSByZWJvb3QgYW5kIHVzaW5nIG9wdGlvbiAncGNpPW5vYWNwaSdcbiIpKTsKIAogCQkJc3RhdHVzID0gdHJ5X2dldF9yb290X2JyaWRnZV9idXNucihyb290LT5oYW5kbGUsICZidXMpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJCWJyZWFrOwogCQkJaWYgKGJ1cyAhPSByb290LT5pZC5idXMpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUENJIF9DUlMgJWQgb3ZlcnJpZGVzIF9CQk4gMFxuIiwgYnVzKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJCSAgICAgICAiUENJIF9DUlMgJWQgb3ZlcnJpZGVzIF9CQk4gMFxuIiwgYnVzKTsKIAkJCQlyb290LT5pZC5idXMgPSBidXM7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI1OCwxMiArMjU3LDEyIEBACiAJICogVEJEOiBOZWVkIFBDSSBpbnRlcmZhY2UgZm9yIGVudW1lcmF0aW9uL2NvbmZpZ3VyYXRpb24gb2Ygcm9vdHMuCiAJICovCiAKLSAJLyogVEJEOiBMb2NraW5nICovCi0gCWxpc3RfYWRkX3RhaWwoJnJvb3QtPm5vZGUsICZhY3BpX3BjaV9yb290cyk7CisJLyogVEJEOiBMb2NraW5nICovCisJbGlzdF9hZGRfdGFpbCgmcm9vdC0+bm9kZSwgJmFjcGlfcGNpX3Jvb3RzKTsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdICglMDR4OiUwMngpXG4iLCAKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJcm9vdC0+aWQuc2VnbWVudCwgcm9vdC0+aWQuYnVzKTsKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJTA0eDolMDJ4KVxuIiwKKwkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKKwkgICAgICAgcm9vdC0+aWQuc2VnbWVudCwgcm9vdC0+aWQuYnVzKTsKIAogCS8qCiAJICogU2NhbiB0aGUgUm9vdCBCcmlkZ2UKQEAgLTI3NCw5ICsyNzMsOSBAQAogCSAqLwogCXJvb3QtPmJ1cyA9IHBjaV9hY3BpX3NjYW5fcm9vdChkZXZpY2UsIHJvb3QtPmlkLnNlZ21lbnQsIHJvb3QtPmlkLmJ1cyk7CiAJaWYgKCFyb290LT5idXMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiQnVzICUwNHg6JTAyeCBub3QgcHJlc2VudCBpbiBQQ0kgbmFtZXNwYWNlXG4iLCAKLQkJCXJvb3QtPmlkLnNlZ21lbnQsIHJvb3QtPmlkLmJ1cykpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkJ1cyAlMDR4OiUwMnggbm90IHByZXNlbnQgaW4gUENJIG5hbWVzcGFjZVxuIiwKKwkJCQkgIHJvb3QtPmlkLnNlZ21lbnQsIHJvb3QtPmlkLmJ1cykpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0yOTgsOSArMjk3LDkgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocm9vdC0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJULCAmaGFuZGxlKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCXJlc3VsdCA9IGFjcGlfcGNpX2lycV9hZGRfcHJ0KHJvb3QtPmhhbmRsZSwgcm9vdC0+aWQuc2VnbWVudCwKLQkJCXJvb3QtPmlkLmJ1cyk7CisJCQkJCSAgICAgIHJvb3QtPmlkLmJ1cyk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KSB7CiAJCWlmICghbGlzdF9lbXB0eSgmcm9vdC0+bm9kZSkpCiAJCQlsaXN0X2RlbCgmcm9vdC0+bm9kZSk7CkBAIC0zMTAsMTEgKzMwOSw5IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfcGNpX3Jvb3Rfc3RhcnQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3BjaV9yb290X3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBhY3BpX3BjaV9yb290CSpyb290OworCXN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfcm9vdF9zdGFydCIpOwogCkBAIC0zMjcsMjcgKzMyNCwyMyBAQAogCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9wY2lfcm9vdF9yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm9vdAkqcm9vdCA9IE5VTEw7CisJc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfcm9vdF9yZW1vdmUiKTsKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXJvb3QgPSAoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXJvb3QgPSAoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlrZnJlZShyb290KTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjaV9yb290X2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjaV9yb290X2luaXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9yb290X2luaXQiKTsKIApAQCAtMzU1LDggKzM0OCw4IEBACiAJCXJldHVybl9WQUxVRSgwKTsKIAogCS8qIERFQlVHOgotCWFjcGlfZGJnX2xheWVyID0gQUNQSV9QQ0lfQ09NUE9ORU5UOwotCWFjcGlfZGJnX2xldmVsID0gMHhGRkZGRkZGRjsKKwkgICBhY3BpX2RiZ19sYXllciA9IEFDUElfUENJX0NPTVBPTkVOVDsKKwkgICBhY3BpX2RiZ19sZXZlbCA9IDB4RkZGRkZGRkY7CiAJICovCiAKIAlpZiAoYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3BjaV9yb290X2RyaXZlcikgPCAwKQpAQCAtMzY2LDQgKzM1OSwzIEBACiB9CiAKIHN1YnN5c19pbml0Y2FsbChhY3BpX3BjaV9yb290X2luaXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcG93ZXIuYyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCmluZGV4IDM3M2EzYTkuLjYyYTU1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wb3dlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCkBAIC00NCwxMCArNDQsOCBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QT1dFUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUJCSgiYWNwaV9wb3dlciIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfcG93ZXIiKQogI2RlZmluZSBBQ1BJX1BPV0VSX0NPTVBPTkVOVAkJMHgwMDgwMDAwMAogI2RlZmluZSBBQ1BJX1BPV0VSX0NMQVNTCQkicG93ZXJfcmVzb3VyY2UiCiAjZGVmaW5lIEFDUElfUE9XRVJfRFJJVkVSX05BTUUJCSJBQ1BJIFBvd2VyIFJlc291cmNlIERyaXZlciIKQEAgLTU3LDM4ICs1NSwzNiBAQAogI2RlZmluZSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09GRgkweDAwCiAjZGVmaW5lIEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT04JMHgwMQogI2RlZmluZSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX1VOS05PV04gMHhGRgotCi1zdGF0aWMgaW50IGFjcGlfcG93ZXJfYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3Bvd2VyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wb3dlcl9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9QT1dFUl9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX1BPV0VSX0NMQVNTLAotCS5pZHMgPQkJQUNQSV9QT1dFUl9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX3Bvd2VyX2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9wb3dlcl9yZW1vdmUsCi0JCQl9LAorCS5uYW1lID0gQUNQSV9QT1dFUl9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1BPV0VSX0NMQVNTLAorCS5pZHMgPSBBQ1BJX1BPV0VSX0hJRCwKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9wb3dlcl9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX3Bvd2VyX3JlbW92ZSwKKwkJfSwKIH07CiAKLXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlCi17Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZTsKLQlhY3BpX2J1c19pZAkJbmFtZTsKLQl1MzIJCQlzeXN0ZW1fbGV2ZWw7Ci0JdTMyCQkJb3JkZXI7Ci0JaW50CQkJc3RhdGU7Ci0JaW50CQkJcmVmZXJlbmNlczsKK3N0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlIHsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJYWNwaV9idXNfaWQgbmFtZTsKKwl1MzIgc3lzdGVtX2xldmVsOworCXUzMiBvcmRlcjsKKwlpbnQgc3RhdGU7CisJaW50IHJlZmVyZW5jZXM7CiB9OwogCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZAkJYWNwaV9wb3dlcl9yZXNvdXJjZV9saXN0Oworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgYWNwaV9wb3dlcl9yZXNvdXJjZV9saXN0OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Bvd2VyX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9wb3dlcl9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3Bvd2VyX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTYsMTIgKzkyLDExIEBACiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50Ci1hY3BpX3Bvd2VyX2dldF9jb250ZXh0ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICoqcmVzb3VyY2UpCithY3BpX3Bvd2VyX2dldF9jb250ZXh0KGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICoqcmVzb3VyY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9nZXRfY29udGV4dCIpOwogCkBAIC0xMTEsMjQgKzEwNiwyMSBAQAogCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKTsKIAlpZiAocmVzdWx0KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkVycm9yIGdldHRpbmcgY29udGV4dCBbJXBdXG4iLAotCQkJaGFuZGxlKSk7CisJCQkJICBoYW5kbGUpKTsKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAJfQogCi0JKnJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwkqcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJaWYgKCFyZXNvdXJjZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfZ2V0X3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfZ2V0X3N0YXRlKHN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICpyZXNvdXJjZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5zaWduZWQgbG9uZwkJc3RhID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bnNpZ25lZCBsb25nIHN0YSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX2dldF9zdGF0ZSIpOwogCkBAIC0xNDUsMjAgKzEzNywxNiBAQAogCQlyZXNvdXJjZS0+c3RhdGUgPSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09GRjsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gaXMgJXNcbiIsCi0JCXJlc291cmNlLT5uYW1lLCByZXNvdXJjZS0+c3RhdGU/Im9uIjoib2ZmIikpOworCQkJICByZXNvdXJjZS0+bmFtZSwgcmVzb3VyY2UtPnN0YXRlID8gIm9uIiA6ICJvZmYiKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wb3dlcl9nZXRfbGlzdF9zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJKmxpc3QsCi0JaW50CQkJKnN0YXRlKQorc3RhdGljIGludCBhY3BpX3Bvd2VyX2dldF9saXN0X3N0YXRlKHN0cnVjdCBhY3BpX2hhbmRsZV9saXN0ICpsaXN0LCBpbnQgKnN0YXRlKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKLQl1MzIJCQlpID0gMDsKKwl1MzIgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX2dldF9saXN0X3N0YXRlIik7CiAKQEAgLTE2Nyw3ICsxNTUsNyBAQAogCiAJLyogVGhlIHN0YXRlIG9mIHRoZSBsaXN0IGlzICdvbicgSUZGIGFsbCByZXNvdXJjZXMgYXJlICdvbicuICovCiAKLQlmb3IgKGk9MDsgaTxsaXN0LT5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxpc3QtPmNvdW50OyBpKyspIHsKIAkJcmVzdWx0ID0gYWNwaV9wb3dlcl9nZXRfY29udGV4dChsaXN0LT5oYW5kbGVzW2ldLCAmcmVzb3VyY2UpOwogCQlpZiAocmVzdWx0KQogCQkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CkBAIC0xODIsMTkgKzE3MCwxNiBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIGxpc3QgaXMgJXNcbiIsCi0JCSpzdGF0ZT8ib24iOiJvZmYiKSk7CisJCQkgICpzdGF0ZSA/ICJvbiIgOiAib2ZmIikpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wb3dlcl9vbiAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSkKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9vbihhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9vbiIpOwpAQCAtMjA1LDEwICsxOTAsMTAgQEAKIAogCXJlc291cmNlLT5yZWZlcmVuY2VzKys7CiAKLQlpZiAoKHJlc291cmNlLT5yZWZlcmVuY2VzID4gMSkgCi0JCXx8IChyZXNvdXJjZS0+c3RhdGUgPT0gQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9PTikpIHsKKwlpZiAoKHJlc291cmNlLT5yZWZlcmVuY2VzID4gMSkKKwkgICAgfHwgKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09OKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIGFscmVhZHkgb25cbiIsCi0JCQlyZXNvdXJjZS0+bmFtZSkpOworCQkJCSAgcmVzb3VyY2UtPm5hbWUpKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwogCX0KIApAQCAtMjI5LDE5ICsyMTQsMTYgQEAKIAlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9EMDsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gdHVybmVkIG9uXG4iLAotCQlyZXNvdXJjZS0+bmFtZSkpOworCQkJICByZXNvdXJjZS0+bmFtZSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfb2ZmX2RldmljZSAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSkKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9vZmZfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX29mZl9kZXZpY2UiKTsKQEAgLTI1NCwxNSArMjM2LDE1IEBACiAJCXJlc291cmNlLT5yZWZlcmVuY2VzLS07CiAKIAlpZiAocmVzb3VyY2UtPnJlZmVyZW5jZXMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCSJSZXNvdXJjZSBbJXNdIGlzIHN0aWxsIGluIHVzZSwgZGVyZWZlcmVuY2luZ1xuIiwKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVzb3VyY2UgWyVzXSBpcyBzdGlsbCBpbiB1c2UsIGRlcmVmZXJlbmNpbmdcbiIsCisJCQkJICBkZXZpY2UtPnBucC5idXNfaWQpKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwogCX0KIAogCWlmIChyZXNvdXJjZS0+c3RhdGUgPT0gQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9PRkYpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVzb3VyY2UgWyVzXSBhbHJlYWR5IG9mZlxuIiwKLQkJCWRldmljZS0+cG5wLmJ1c19pZCkpOworCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKQEAgLTI4Myw3ICsyNjUsNyBAQAogCWRldmljZS0+cG93ZXIuc3RhdGUgPSBBQ1BJX1NUQVRFX0QzOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVzb3VyY2UgWyVzXSB0dXJuZWQgb2ZmXG4iLAotCQlyZXNvdXJjZS0+bmFtZSkpOworCQkJICByZXNvdXJjZS0+bmFtZSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQpAQCAtMjkzLDEzICsyNzUsMTMgQEAKICAqIDEuIFBvd2VyIG9uIHRoZSBwb3dlciByZXNvdXJjZXMgcmVxdWlyZWQgZm9yIHRoZSB3YWtldXAgZGV2aWNlIAogICogMi4gRW5hYmxlIF9QU1cgKHBvd2VyIHN0YXRlIHdha2UpIGZvciB0aGUgZGV2aWNlIGlmIHByZXNlbnQKICAqLwotaW50IGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KQoraW50IGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYpCiB7Ci0JdW5pb24gYWNwaV9vYmplY3QgCQlhcmcgPSB7QUNQSV9UWVBFX0lOVEVHRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CWFyZ19saXN0ID0gezEsICZhcmd9OwotCWFjcGlfc3RhdHVzCQkJc3RhdHVzID0gQUVfT0s7Ci0JaW50CQkJCQlpOwotCWludCAJCQkJCXJldCA9IDA7CisJdW5pb24gYWNwaV9vYmplY3QgYXJnID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0geyAxLCAmYXJnIH07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJaW50IGk7CisJaW50IHJldCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyIik7CiAJaWYgKCFkZXYgfHwgIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkKQpAQCAtMzEwLDggKzI5Miw4IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+d2FrZXVwLnJlc291cmNlcy5jb3VudDsgaSsrKSB7CiAJCXJldCA9IGFjcGlfcG93ZXJfb24oZGV2LT53YWtldXAucmVzb3VyY2VzLmhhbmRsZXNbaV0pOwogCQlpZiAocmV0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCQkiRXJyb3IgdHJhbnNpdGlvbiBwb3dlciBzdGF0ZVxuIikpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiRXJyb3IgdHJhbnNpdGlvbiBwb3dlciBzdGF0ZVxuIikpOwogCQkJZGV2LT53YWtldXAuZmxhZ3MudmFsaWQgPSAwOwogCQkJcmV0dXJuX1ZBTFVFKC0xKTsKIAkJfQpAQCAtMzMzLDIwICszMTUsMjAgQEAKICAqIDEuIERpc2FibGUgX1BTVyAocG93ZXIgc3RhdGUgd2FrZSkKICAqIDIuIFNodXRkb3duIGRvd24gdGhlIHBvd2VyIHJlc291cmNlcwogICovCi1pbnQgYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KQoraW50IGFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KQogewotCXVuaW9uIGFjcGlfb2JqZWN0IAkJYXJnID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdfbGlzdCA9IHsxLCAmYXJnfTsKLQlhY3BpX3N0YXR1cwkJCXN0YXR1cyA9IEFFX09LOwotCWludAkJCQkJaTsKLQlpbnQgCQkJCQlyZXQgPSAwOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZyA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmFyZyB9OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWludCBpOworCWludCByZXQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIiKTsKIAogCWlmICghZGV2IHx8ICFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAotCWFyZy5pbnRlZ2VyLnZhbHVlID0gMDsJCisJYXJnLmludGVnZXIudmFsdWUgPSAwOwogCS8qIEV4ZWN1dGUgUFNXICovCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2LT5oYW5kbGUsICJfUFNXIiwgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpKSB7CkBAIC0zNTksOCArMzQxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT53YWtldXAucmVzb3VyY2VzLmNvdW50OyBpKyspIHsKIAkJcmV0ID0gYWNwaV9wb3dlcl9vZmZfZGV2aWNlKGRldi0+d2FrZXVwLnJlc291cmNlcy5oYW5kbGVzW2ldKTsKIAkJaWYgKHJldCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkJIkVycm9yIHRyYW5zaXRpb24gcG93ZXIgc3RhdGVcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkVycm9yIHRyYW5zaXRpb24gcG93ZXIgc3RhdGVcbiIpKTsKIAkJCWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkID0gMDsKIAkJCXJldHVybl9WQUxVRSgtMSk7CiAJCX0KQEAgLTM3MywxNCArMzU1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBQb3dlciBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQKLWFjcGlfcG93ZXJfZ2V0X2luZmVycmVkX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK2ludCBhY3BpX3Bvd2VyX2dldF9pbmZlcnJlZF9zdGF0ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0CSpsaXN0ID0gTlVMTDsKLQlpbnQJCQlsaXN0X3N0YXRlID0gMDsKLQlpbnQJCQlpID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqbGlzdCA9IE5VTEw7CisJaW50IGxpc3Rfc3RhdGUgPSAwOworCWludCBpID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcG93ZXJfZ2V0X2luZmVycmVkX3N0YXRlIik7CiAKQEAgLTM5Myw3ICszNzMsNyBAQAogCSAqIFdlIGtub3cgYSBkZXZpY2UncyBpbmZlcnJlZCBwb3dlciBzdGF0ZSB3aGVuIGFsbCB0aGUgcmVzb3VyY2VzCiAJICogcmVxdWlyZWQgZm9yIGEgZ2l2ZW4gRC1zdGF0ZSBhcmUgJ29uJy4KIAkgKi8KLQlmb3IgKGk9QUNQSV9TVEFURV9EMDsgaTxBQ1BJX1NUQVRFX0QzOyBpKyspIHsKKwlmb3IgKGkgPSBBQ1BJX1NUQVRFX0QwOyBpIDwgQUNQSV9TVEFURV9EMzsgaSsrKSB7CiAJCWxpc3QgPSAmZGV2aWNlLT5wb3dlci5zdGF0ZXNbaV0ucmVzb3VyY2VzOwogCQlpZiAobGlzdC0+Y291bnQgPCAxKQogCQkJY29udGludWU7CkBAIC00MTMsMjMgKzM5MywyMCBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1pbnQKLWFjcGlfcG93ZXJfdHJhbnNpdGlvbiAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJc3RhdGUpCitpbnQgYWNwaV9wb3dlcl90cmFuc2l0aW9uKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAkqY2wgPSBOVUxMOwkvKiBDdXJyZW50IFJlc291cmNlcyAqLwotCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0CSp0bCA9IE5VTEw7CS8qIFRhcmdldCBSZXNvdXJjZXMgKi8KLQlpbnQJCQlpID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqY2wgPSBOVUxMOwkvKiBDdXJyZW50IFJlc291cmNlcyAqLworCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0ICp0bCA9IE5VTEw7CS8qIFRhcmdldCBSZXNvdXJjZXMgKi8KKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX3RyYW5zaXRpb24iKTsKIAogCWlmICghZGV2aWNlIHx8IChzdGF0ZSA8IEFDUElfU1RBVEVfRDApIHx8IChzdGF0ZSA+IEFDUElfU1RBVEVfRDMpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlpZiAoKGRldmljZS0+cG93ZXIuc3RhdGUgPCBBQ1BJX1NUQVRFX0QwKSB8fCAoZGV2aWNlLT5wb3dlci5zdGF0ZSA+IEFDUElfU1RBVEVfRDMpKQorCWlmICgoZGV2aWNlLT5wb3dlci5zdGF0ZSA8IEFDUElfU1RBVEVfRDApCisJICAgIHx8IChkZXZpY2UtPnBvd2VyLnN0YXRlID4gQUNQSV9TVEFURV9EMykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCWNsID0gJmRldmljZS0+cG93ZXIuc3RhdGVzW2RldmljZS0+cG93ZXIuc3RhdGVdLnJlc291cmNlczsKQEAgLTQ0OCw3ICs0MjUsNyBAQAogCSAqIEZpcnN0IHdlIHJlZmVyZW5jZSBhbGwgcG93ZXIgcmVzb3VyY2VzIHJlcXVpcmVkIGluIHRoZSB0YXJnZXQgbGlzdAogCSAqIChlLmcuIHNvIHRoZSBkZXZpY2UgZG9lc24ndCBsb3NlIHBvd2VyIHdoaWxlIHRyYW5zaXRpb25pbmcpLgogCSAqLwotCWZvciAoaT0wOyBpPHRsLT5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHRsLT5jb3VudDsgaSsrKSB7CiAJCXJlc3VsdCA9IGFjcGlfcG93ZXJfb24odGwtPmhhbmRsZXNbaV0pOwogCQlpZiAocmVzdWx0KQogCQkJZ290byBlbmQ7CkBAIC00NTcsNyArNDM0LDcgQEAKIAkvKgogCSAqIFRoZW4gd2UgZGVyZWZlcmVuY2UgYWxsIHBvd2VyIHJlc291cmNlcyB1c2VkIGluIHRoZSBjdXJyZW50IGxpc3QuCiAJICovCi0JZm9yIChpPTA7IGk8Y2wtPmNvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgY2wtPmNvdW50OyBpKyspIHsKIAkJcmVzdWx0ID0gYWNwaV9wb3dlcl9vZmZfZGV2aWNlKGNsLT5oYW5kbGVzW2ldKTsKIAkJaWYgKHJlc3VsdCkKIAkJCWdvdG8gZW5kOwpAQCAtNDY1LDIxICs0NDIsMjAgQEAKIAogCS8qIFdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlIHN0YXRlIHRpbGwgYWxsIGFib3ZlIG9wZXJhdGlvbnMgc3VjY2VlZCAqLwogCWRldmljZS0+cG93ZXIuc3RhdGUgPSBzdGF0ZTsKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sIAotCQkJIkVycm9yIHRyYW5zaXRpb25pbmcgZGV2aWNlIFslc10gdG8gRCVkXG4iLAotCQkJZGV2aWNlLT5wbnAuYnVzX2lkLCBzdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiRXJyb3IgdHJhbnNpdGlvbmluZyBkZXZpY2UgWyVzXSB0byBEJWRcbiIsCisJCQkJICBkZXZpY2UtPnBucC5idXNfaWQsIHN0YXRlKSk7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfcG93ZXJfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9wb3dlcl9kaXI7CiAKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewpAQCAtNTA2LDEzICs0ODIsMTIgQEAKIAl9CiAKIAlzZXFfcHJpbnRmKHNlcSwgInN5c3RlbSBsZXZlbDogICAgICAgICAgICBTJWRcbiIKLQkJCSJvcmRlcjogICAgICAgICAgICAgICAgICAgJWRcbiIKLQkJCSJyZWZlcmVuY2UgY291bnQ6ICAgICAgICAgJWRcbiIsCi0JCQlyZXNvdXJjZS0+c3lzdGVtX2xldmVsLAotCQkJcmVzb3VyY2UtPm9yZGVyLAotCQkJcmVzb3VyY2UtPnJlZmVyZW5jZXMpOworCQkgICAib3JkZXI6ICAgICAgICAgICAgICAgICAgICVkXG4iCisJCSAgICJyZWZlcmVuY2UgY291bnQ6ICAgICAgICAgJWRcbiIsCisJCSAgIHJlc291cmNlLT5zeXN0ZW1fbGV2ZWwsCisJCSAgIHJlc291cmNlLT5vcmRlciwgcmVzb3VyY2UtPnJlZmVyZW5jZXMpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC01MjEsMTEgKzQ5Niw5IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfcG93ZXJfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3Bvd2VyX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9hZGRfZnMiKTsKIApAQCAtNTM0LDE4ICs1MDcsMTggQEAKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJYWNwaV9wb3dlcl9kaXIpOworCQkJCQkJICAgICBhY3BpX3Bvd2VyX2Rpcik7CiAJCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpCiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCiAJLyogJ3N0YXR1cycgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1BPV0VSX0ZJTEVfU1RBVFVTLAotCQlTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX1BPV0VSX0ZJTEVfU1RBVFVTKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9QT1dFUl9GSUxFX1NUQVRVUykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfcG93ZXJfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC01NTQsMTAgKzUyNyw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcG93ZXJfcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wb3dlcl9yZW1vdmVfZnMiKTsKIApAQCAtNTcxLDIwICs1NDEsMTcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV9wb3dlcl9hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3Bvd2VyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFjcGlfb2JqZWN0OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7c2l6ZW9mKGFjcGlfb2JqZWN0KSwgJmFjcGlfb2JqZWN0fTsKKwl1bmlvbiBhY3BpX29iamVjdCBhY3BpX29iamVjdDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YoYWNwaV9vYmplY3QpLCAmYWNwaV9vYmplY3QgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcG93ZXJfYWRkIik7CiAKQEAgLTYzMCwyMiArNTk3LDE4IEBACiAJcmVzdWx0ID0gYWNwaV9wb3dlcl9hZGRfZnMoZGV2aWNlKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKLQkKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJXMpXG4iLCBhY3BpX2RldmljZV9uYW1lKGRldmljZSksCi0JCWFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCByZXNvdXJjZS0+c3RhdGU/Im9uIjoib2ZmIik7CiAKLWVuZDoKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJXMpXG4iLCBhY3BpX2RldmljZV9uYW1lKGRldmljZSksCisJICAgICAgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCByZXNvdXJjZS0+c3RhdGUgPyAib24iIDogIm9mZiIpOworCisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkKIAkJa2ZyZWUocmVzb3VyY2UpOwotCQorCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wb3dlcl9yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwogCkBAIC02NTQsNyArNjE3LDcgQEAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAlhY3BpX3Bvd2VyX3JlbW92ZV9mcyhkZXZpY2UpOwogCkBAIC02NjMsMTAgKzYyNiw5IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfcG93ZXJfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcG93ZXJfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Bvd2VyX2luaXQiKTsKIApAQCAtNjg5LDQgKzY1MSwzIEBACiB9CiAKIHN1YnN5c19pbml0Y2FsbChhY3BpX3Bvd2VyX2luaXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IGQ1NmE0MzkuLjQyMTc5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC01OCw3ICs1OCw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCi0KICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCTB4MDEwMDAwMDAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MJCSJwcm9jZXNzb3IiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FCSJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCkBAIC03NSw1OSArNzQsNTMgQEAKICNkZWZpbmUgQUNQSV9TVEFfUFJFU0VOVCAweDAwMDAwMDAxCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfcHJvY2Vzc29yIikKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKIAotTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLQotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc3RhcnQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3Jfbm90aWZ5ICggYWNwaV9oYW5kbGUJaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3Jfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKTsKIHN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5pdChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcF9jcHUpOwogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9oYW5kbGVfZWplY3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wcm9jZXNzb3JfZHJpdmVyID0gewotCS5uYW1lID0JCUFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfUFJPQ0VTU09SX0NMQVNTLAotCS5pZHMgPQkJQUNQSV9QUk9DRVNTT1JfSElELAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9wcm9jZXNzb3JfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX3Byb2Nlc3Nvcl9yZW1vdmUsCi0JCQkJLnN0YXJ0CT0gCWFjcGlfcHJvY2Vzc29yX3N0YXJ0LAotCQkJfSwKKwkubmFtZSA9IEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IEFDUElfUFJPQ0VTU09SX0NMQVNTLAorCS5pZHMgPSBBQ1BJX1BST0NFU1NPUl9ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfcHJvY2Vzc29yX2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfcHJvY2Vzc29yX3JlbW92ZSwKKwkJLnN0YXJ0ID0gYWNwaV9wcm9jZXNzb3Jfc3RhcnQsCisJCX0sCiB9OwogCiAjZGVmaW5lIElOU1RBTExfTk9USUZZX0hBTkRMRVIJCTEKICNkZWZpbmUgVU5JTlNUQUxMX05PVElGWV9IQU5ETEVSCTIKIAotCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl9pbmZvX2ZvcHMgPSB7Ci0JLm9wZW4gCQk9IGFjcGlfcHJvY2Vzc29yX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9wcm9jZXNzb3JfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotCi1zdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByb2Nlc3NvcnNbTlJfQ1BVU107CitzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByb2Nlc3NvcnNbTlJfQ1BVU107CiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZXJyYXRhIGVycmF0YTsKIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJhdGEgSGFuZGxpbmcKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2VycmF0YV9waWl4NCAoCi0Jc3RydWN0IHBjaV9kZXYJCSpkZXYpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2VycmF0YV9waWl4NChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXU4CQkJcmV2ID0gMDsKLQl1OAkJCXZhbHVlMSA9IDA7Ci0JdTgJCQl2YWx1ZTIgPSAwOworCXU4IHJldiA9IDA7CisJdTggdmFsdWUxID0gMDsKKwl1OCB2YWx1ZTIgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZXJyYXRhX3BpaXg0Iik7CiAKQEAgLTE4OCw4ICsxODEsOCBAQAogCQkgKiBETUEgYWN0aXZpdHkuCiAJCSAqLwogCQlkZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQkJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCLAorCQkJCSAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CiAJCWlmIChkZXYpIHsKIAkJCWVycmF0YS5waWl4NC5ibWlzeCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDQpOwogCQkJcGNpX2Rldl9wdXQoZGV2KTsKQEAgLTIwNSw4ICsxOTgsOCBAQAogCQkgKiBkZXZpY2VzIHdvbid0IG9wZXJhdGUgd2VsbCBpZiBmYXN0IERNQSBpcyBkaXNhYmxlZC4KIAkJICovCiAJCWRldiA9IHBjaV9nZXRfc3Vic3lzKFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMCwKLQkJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOworCQkJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzAsCisJCQkJICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKIAkJaWYgKGRldikgewogCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDc2LCAmdmFsdWUxKTsKIAkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg3NywgJnZhbHVlMik7CkBAIC0yMjAsMjEgKzIxMywxOCBAQAogCiAJaWYgKGVycmF0YS5waWl4NC5ibWlzeCkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIkJ1cyBtYXN0ZXIgYWN0aXZpdHkgZGV0ZWN0aW9uIChCTS1JREUpIGVycmF0dW0gZW5hYmxlZFxuIikpOworCQkJCSAgIkJ1cyBtYXN0ZXIgYWN0aXZpdHkgZGV0ZWN0aW9uIChCTS1JREUpIGVycmF0dW0gZW5hYmxlZFxuIikpOwogCWlmIChlcnJhdGEucGlpeDQuZmRtYSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlR5cGUtRiBETUEgbGl2ZWxvY2sgZXJyYXR1bSAoQzMgZGlzYWJsZWQpXG4iKSk7CisJCQkJICAiVHlwZS1GIERNQSBsaXZlbG9jayBlcnJhdHVtIChDMyBkaXNhYmxlZClcbiIpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1pbnQKLWFjcGlfcHJvY2Vzc29yX2VycmF0YSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZXJyYXRhKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgcGNpX2RldgkJKmRldiA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9lcnJhdGEiKTsKIApAQCAtMjQ1LDcgKzIzNSw4IEBACiAJICogUElJWDQKIAkgKi8KIAlkZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBQQ0lfQU5ZX0lELAorCQkJICAgICBQQ0lfQU5ZX0lELCBOVUxMKTsKIAlpZiAoZGV2KSB7CiAJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2VycmF0YV9waWl4NChkZXYpOwogCQlwY2lfZGV2X3B1dChkZXYpOwpAQCAtMjU0LDcgKzI0NSw2IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbiBBQ1BJIHByb2Nlc3NvciBmdWNudGlvbnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjUsMTMgKzI1NSwxMyBAQAogICovCiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCQkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkY19pbikKKwkJCSAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXUzMgkJCWFyZzBfYnVmWzNdOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJbm9fb2JqZWN0ID0gezEsICZhcmcwfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAkqcGRjOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiBhcmcwX2J1ZlszXTsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfQlVGRkVSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3Qgbm9fb2JqZWN0ID0geyAxLCAmYXJnMCB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjIik7CiAKQEAgLTI4NiwyMSArMjc2LDIxIEBACiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QREMiLCBwZGMsIE5VTEwpOwogCiAJaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgJiYgKHBkY19pbikpCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkVycm9yIGV2YWx1YXRpbmcgX1BEQywgdXNpbmcgbGVnYWN5IHBlcmYuIGNvbnRyb2wuLi5cbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkVycm9yIGV2YWx1YXRpbmcgX1BEQywgdXNpbmcgbGVnYWN5IHBlcmYuIGNvbnRyb2wuLi5cbiIpKTsKIAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqYWNwaV9wcm9jZXNzb3JfZGlyID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfcHJvY2Vzc29yX2RpciA9IE5VTEw7CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfaW5mb19zZXFfc2hvdyIpOwogCkBAIC0zMDgsNDAgKzI5OCwzNyBAQAogCQlnb3RvIGVuZDsKIAogCXNlcV9wcmludGYoc2VxLCAicHJvY2Vzc29yIGlkOiAgICAgICAgICAgICVkXG4iCi0JCQkiYWNwaSBpZDogICAgICAgICAgICAgICAgICVkXG4iCi0JCQkiYnVzIG1hc3RlcmluZyBjb250cm9sOiAgICVzXG4iCi0JCQkicG93ZXIgbWFuYWdlbWVudDogICAgICAgICVzXG4iCi0JCQkidGhyb3R0bGluZyBjb250cm9sOiAgICAgICVzXG4iCi0JCQkibGltaXQgaW50ZXJmYWNlOiAgICAgICAgICVzXG4iLAotCQkJcHItPmlkLAotCQkJcHItPmFjcGlfaWQsCi0JCQlwci0+ZmxhZ3MuYm1fY29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKLQkJCXByLT5mbGFncy5wb3dlciA/ICJ5ZXMiIDogIm5vIiwKLQkJCXByLT5mbGFncy50aHJvdHRsaW5nID8gInllcyIgOiAibm8iLAotCQkJcHItPmZsYWdzLmxpbWl0ID8gInllcyIgOiAibm8iKTsKKwkJICAgImFjcGkgaWQ6ICAgICAgICAgICAgICAgICAlZFxuIgorCQkgICAiYnVzIG1hc3RlcmluZyBjb250cm9sOiAgICVzXG4iCisJCSAgICJwb3dlciBtYW5hZ2VtZW50OiAgICAgICAgJXNcbiIKKwkJICAgInRocm90dGxpbmcgY29udHJvbDogICAgICAlc1xuIgorCQkgICAibGltaXQgaW50ZXJmYWNlOiAgICAgICAgICVzXG4iLAorCQkgICBwci0+aWQsCisJCSAgIHByLT5hY3BpX2lkLAorCQkgICBwci0+ZmxhZ3MuYm1fY29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgcHItPmZsYWdzLnBvd2VyID8gInllcyIgOiAibm8iLAorCQkgICBwci0+ZmxhZ3MudGhyb3R0bGluZyA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgcHItPmZsYWdzLmxpbWl0ID8gInllcyIgOiAibm8iKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfcHJvY2Vzc29yX2luZm9fc2VxX3Nob3csCi0JCQkJCQlQREUoaW5vZGUpLT5kYXRhKTsKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2FkZF9mcyIpOwogCiAJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IHByb2NfbWtkaXIoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQlhY3BpX3Byb2Nlc3Nvcl9kaXIpOworCQkJCQkJICAgICBhY3BpX3Byb2Nlc3Nvcl9kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KQEAgLTM0OSwxMSArMzM2LDExIEBACiAKIAkvKiAnaW5mbycgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX0lORk8sCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfUFJPQ0VTU09SX0ZJTEVfSU5GTykpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfUFJPQ0VTU09SX0ZJTEVfSU5GTykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfcHJvY2Vzc29yX2luZm9fZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0zNjIsMTEgKzM0OSwxMiBAQAogCiAJLyogJ3Rocm90dGxpbmcnIFtSL1ddICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX1RIUk9UVExJTkcsCi0JCVNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX1BST0NFU1NPUl9GSUxFX1RIUk9UVExJTkcpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX1BST0NFU1NPUl9GSUxFX1RIUk9UVExJTkcpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2ZvcHM7CiAJCWVudHJ5LT5wcm9jX2ZvcHMtPndyaXRlID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfdGhyb3R0bGluZzsKQEAgLTM3NiwxMSArMzY0LDEyIEBACiAKIAkvKiAnbGltaXQnIFtSL1ddICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX0xJTUlULAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9QUk9DRVNTT1JfRklMRV9MSU1JVCkpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfUFJPQ0VTU09SX0ZJTEVfTElNSVQpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Byb2Nlc3Nvcl9saW1pdF9mb3BzOwogCQllbnRyeS0+cHJvY19mb3BzLT53cml0ZSA9IGFjcGlfcHJvY2Vzc29yX3dyaXRlX2xpbWl0OwpAQCAtMzkxLDE4ICszODAsMTcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3JlbW92ZV9mcyIpOwogCiAJaWYgKGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfSU5GTyxhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfSU5GTywKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9USFJPVFRMSU5HLAotCQkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX0xJTUlULGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9MSU1JVCwKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIGFjcGlfcHJvY2Vzc29yX2Rpcik7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gTlVMTDsKIAl9CkBAIC00NDYsMTUgKzQzNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfZ2V0X2luZm8gKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0JdW5pb24gYWNwaV9vYmplY3QJb2JqZWN0ID0gezB9OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7c2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgJm9iamVjdH07Ci0JdTgJCQljcHVfaW5kZXg7Ci0Jc3RhdGljIGludAkJY3B1MF9pbml0aWFsaXplZDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXVuaW9uIGFjcGlfb2JqZWN0IG9iamVjdCA9IHsgMCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksICZvYmplY3QgfTsKKwl1OCBjcHVfaW5kZXg7CisJc3RhdGljIGludCBjcHUwX2luaXRpYWxpemVkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X2luZm8iKTsKIApAQCAtNDczLDExICs0NTksMTAgQEAKIAlpZiAoYWNwaV9mYWR0LlYxX3BtMl9jbnRfYmxrICYmIGFjcGlfZmFkdC5wbTJfY250X2xlbikgewogCQlwci0+ZmxhZ3MuYm1fY29udHJvbCA9IDE7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJCdXMgbWFzdGVyaW5nIGFyYml0cmF0aW9uIGNvbnRyb2wgcHJlc2VudFxuIikpOwotCX0KLQllbHNlCisJCQkJICAiQnVzIG1hc3RlcmluZyBhcmJpdHJhdGlvbiBjb250cm9sIHByZXNlbnRcbiIpKTsKKwl9IGVsc2UKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIk5vIGJ1cyBtYXN0ZXJpbmcgYXJiaXRyYXRpb24gY29udHJvbFxuIikpOworCQkJCSAgIk5vIGJ1cyBtYXN0ZXJpbmcgYXJiaXRyYXRpb24gY29udHJvbFxuIikpOwogCiAJLyoKIAkgKiBFdmFsdXRlIHRoZSBwcm9jZXNzb3Igb2JqZWN0LiAgTm90ZSB0aGF0IGl0IGlzIGNvbW1vbiBvbiBTTVAgdG8KQEAgLTQ4Nyw1MCArNDcyLDUxIEBACiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgTlVMTCwgTlVMTCwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgZXZhbHVhdGluZyBwcm9jZXNzb3Igb2JqZWN0XG4iKSk7CisJCQkJICAiRXJyb3IgZXZhbHVhdGluZyBwcm9jZXNzb3Igb2JqZWN0XG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAkvKgogCSAqIFRCRDogU3luY2ggcHJvY2Vzc29yIElEICh2aWEgTEFQSUMvTFNBUElDIHN0cnVjdHVyZXMpIG9uIFNNUC4KLQkgKgk+Pj4gJ2FjcGlfZ2V0X3Byb2Nlc3Nvcl9pZChhY3BpX2lkLCAmaWQpJyBpbiBhcmNoL3h4eC9hY3BpLmMKKwkgKiAgICAgID4+PiAnYWNwaV9nZXRfcHJvY2Vzc29yX2lkKGFjcGlfaWQsICZpZCknIGluIGFyY2gveHh4L2FjcGkuYwogCSAqLwogCXByLT5hY3BpX2lkID0gb2JqZWN0LnByb2Nlc3Nvci5wcm9jX2lkOwogCiAJY3B1X2luZGV4ID0gY29udmVydF9hY3BpaWRfdG9fY3B1KHByLT5hY3BpX2lkKTsKIAotICAJLyogSGFuZGxlIFVQIHN5c3RlbSBydW5uaW5nIFNNUCBrZXJuZWwsIHdpdGggbm8gTEFQSUMgaW4gTUFEVCAqLwotICAJaWYgKCAhY3B1MF9pbml0aWFsaXplZCAmJiAoY3B1X2luZGV4ID09IDB4ZmYpICYmCi0gIAkJICAgICAgIAkobnVtX29ubGluZV9jcHVzKCkgPT0gMSkpIHsKLSAgIAkJY3B1X2luZGV4ID0gMDsKLSAgIAl9CisJLyogSGFuZGxlIFVQIHN5c3RlbSBydW5uaW5nIFNNUCBrZXJuZWwsIHdpdGggbm8gTEFQSUMgaW4gTUFEVCAqLworCWlmICghY3B1MF9pbml0aWFsaXplZCAmJiAoY3B1X2luZGV4ID09IDB4ZmYpICYmCisJICAgIChudW1fb25saW5lX2NwdXMoKSA9PSAxKSkgeworCQljcHVfaW5kZXggPSAwOworCX0KIAotICAgCWNwdTBfaW5pdGlhbGl6ZWQgPSAxOworCWNwdTBfaW5pdGlhbGl6ZWQgPSAxOwogCi0gICAJcHItPmlkID0gY3B1X2luZGV4OworCXByLT5pZCA9IGNwdV9pbmRleDsKIAotICAJLyoKLSAgCSAqICBFeHRyYSBQcm9jZXNzb3Igb2JqZWN0cyBtYXkgYmUgZW51bWVyYXRlZCBvbiBNUCBzeXN0ZW1zIHdpdGgKLSAgCSAqICBsZXNzIHRoYW4gdGhlIG1heCAjIG9mIENQVXMuIFRoZXkgc2hvdWxkIGJlIGlnbm9yZWQgX2lmZgotICAJICogIHRoZXkgYXJlIHBoeXNpY2FsbHkgbm90IHByZXNlbnQuCi0gIAkgKi8KLSAgIAlpZiAoY3B1X2luZGV4ID49ICBOUl9DUFVTKSB7Ci0gICAJCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQocHItPmhhbmRsZSwgJnByLT5pZCkpKSB7Ci0gICAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotICAgCQkJCSJFcnJvciBnZXR0aW5nIGNwdWluZGV4IGZvciBhY3BpaWQgMHgleFxuIiwKLSAgIAkJCQlwci0+YWNwaV9pZCkpOwotICAgCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotICAgCQl9Ci0gICAgCX0KKwkvKgorCSAqICBFeHRyYSBQcm9jZXNzb3Igb2JqZWN0cyBtYXkgYmUgZW51bWVyYXRlZCBvbiBNUCBzeXN0ZW1zIHdpdGgKKwkgKiAgbGVzcyB0aGFuIHRoZSBtYXggIyBvZiBDUFVzLiBUaGV5IHNob3VsZCBiZSBpZ25vcmVkIF9pZmYKKwkgKiAgdGhleSBhcmUgcGh5c2ljYWxseSBub3QgcHJlc2VudC4KKwkgKi8KKwlpZiAoY3B1X2luZGV4ID49IE5SX0NQVVMpIHsKKwkJaWYgKEFDUElfRkFJTFVSRQorCQkgICAgKGFjcGlfcHJvY2Vzc29yX2hvdGFkZF9pbml0KHByLT5oYW5kbGUsICZwci0+aWQpKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiRXJyb3IgZ2V0dGluZyBjcHVpbmRleCBmb3IgYWNwaWlkIDB4JXhcbiIsCisJCQkJCSAgcHItPmFjcGlfaWQpKTsKKwkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKKwkJfQorCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlByb2Nlc3NvciBbJWQ6JWRdXG4iLCBwci0+aWQsCi0JCXByLT5hY3BpX2lkKSk7CisJCQkgIHByLT5hY3BpX2lkKSk7CiAKIAlpZiAoIW9iamVjdC5wcm9jZXNzb3IucGJsa19hZGRyZXNzKQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyBQQkxLIChOVUxMIGFkZHJlc3MpXG4iKSk7CiAJZWxzZSBpZiAob2JqZWN0LnByb2Nlc3Nvci5wYmxrX2xlbmd0aCAhPSA2KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBQQkxLIGxlbmd0aCBbJWRdXG4iLAotCQkJb2JqZWN0LnByb2Nlc3Nvci5wYmxrX2xlbmd0aCkpOworCQkJCSAgb2JqZWN0LnByb2Nlc3Nvci5wYmxrX2xlbmd0aCkpOwogCWVsc2UgewogCQlwci0+dGhyb3R0bGluZy5hZGRyZXNzID0gb2JqZWN0LnByb2Nlc3Nvci5wYmxrX2FkZHJlc3M7CiAJCXByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0ID0gYWNwaV9mYWR0LmR1dHlfb2Zmc2V0OwpAQCAtNTU3LDEzICs1NDMsMTEgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX3N0YXJ0KAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByOworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zdGFydCIpOwogCkBAIC01ODQsMzYgKzU2OCwzMCBAQAogCQlnb3RvIGVuZDsKIAogCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihwci0+aGFuZGxlLCBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCWFjcGlfcHJvY2Vzc29yX25vdGlmeSwgcHIpOworCQkJCQkgICAgIGFjcGlfcHJvY2Vzc29yX25vdGlmeSwgcHIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIGluc3RhbGxpbmcgZGV2aWNlIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBkZXZpY2Ugbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAl9CiAKIAlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0KHByLCBkZXZpY2UpOwogCiAJaWYgKHByLT5mbGFncy50aHJvdHRsaW5nKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdIChzdXBwb3J0cyIsCi0JCQlhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKKwkJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpOwogCQlwcmludGsoIiAlZCB0aHJvdHRsaW5nIHN0YXRlcyIsIHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50KTsKIAkJcHJpbnRrKCIpXG4iKTsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLQotc3RhdGljIHZvaWQKLWFjcGlfcHJvY2Vzc29yX25vdGlmeSAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQlldmVudCwKLQl2b2lkCQkJKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKikgZGF0YTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilkYXRhOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX25vdGlmeSIpOwogCkBAIC02MjcsNyArNjA1LDcgQEAKIAljYXNlIEFDUElfUFJPQ0VTU09SX05PVElGWV9QRVJGT1JNQU5DRToKIAkJYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHByKTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBldmVudCwKLQkJCXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdCk7CisJCQkJCXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9QUk9DRVNTT1JfTk9USUZZX1BPV0VSOgogCQlhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQocHIpOwpAQCAtNjM1LDE5ICs2MTMsMTYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKKwkJCQkgICJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2FkZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2FkZCIpOwogCkBAIC02NjcsMjEgKzY0MiwxNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9yZW1vdmUgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWlmIChwci0+aWQgPj0gTlJfQ1BVUykgewogCQlrZnJlZShwcik7CkBAIC02OTYsMTAgKzY2NywxMCBAQAogCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2V4aXQocHIsIGRldmljZSk7CiAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihwci0+aGFuZGxlLCBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCWFjcGlfcHJvY2Vzc29yX25vdGlmeSk7CisJCQkJCSAgICBhY3BpX3Byb2Nlc3Nvcl9ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCQkJICAiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAl9CiAKIAlhY3BpX3Byb2Nlc3Nvcl9yZW1vdmVfZnMoZGV2aWNlKTsKQEAgLTcxOCwzMyArNjg5LDI4IEBACiAKIHN0YXRpYyBpbnQgaXNfcHJvY2Vzc29yX3ByZXNlbnQoYWNwaV9oYW5kbGUgaGFuZGxlKTsKIAotc3RhdGljIGludAotaXNfcHJvY2Vzc29yX3ByZXNlbnQoCi0JYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGludCBpc19wcm9jZXNzb3JfcHJlc2VudChhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JYWNwaV9zdGF0dXMgCQlzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwkJc3RhID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBzdGEgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXNfcHJvY2Vzc29yX3ByZXNlbnQiKTsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgJnN0YSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICEoc3RhICYgQUNQSV9TVEFfUFJFU0VOVCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJQcm9jZXNzb3IgRGV2aWNlIGlzIG5vdCBwcmVzZW50XG4iKSk7CisJCQkJICAiUHJvY2Vzc29yIERldmljZSBpcyBub3QgcHJlc2VudFxuIikpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCXJldHVybl9WQUxVRSgxKTsKIH0KIAotCiBzdGF0aWMKLWludCBhY3BpX3Byb2Nlc3Nvcl9kZXZpY2VfYWRkKAotCWFjcGlfaGFuZGxlCWhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKipkZXZpY2UpCitpbnQgYWNwaV9wcm9jZXNzb3JfZGV2aWNlX2FkZChhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RldmljZSAqKmRldmljZSkKIHsKLQlhY3BpX2hhbmRsZQkJcGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgCSpwZGV2OwotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHI7CisJYWNwaV9oYW5kbGUgcGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2RldmljZV9hZGQiKTsKIApAQCAtNzY2LDIxICs3MzIsMTcgQEAKIAlpZiAoIXByKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKLQlpZiAoKHByLT5pZCA+PTApICYmIChwci0+aWQgPCBOUl9DUFVTKSkgeworCWlmICgocHItPmlkID49IDApICYmIChwci0+aWQgPCBOUl9DUFVTKSkgewogCQlrb2JqZWN0X2hvdHBsdWcoJigqZGV2aWNlKS0+a29iaiwgS09CSl9PTkxJTkUpOwogCX0KIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIHZvaWQKLWFjcGlfcHJvY2Vzc29yX2hvdHBsdWdfbm90aWZ5ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWV2ZW50LAotCXZvaWQJCQkqZGF0YSkKK2FjcGlfcHJvY2Vzc29yX2hvdHBsdWdfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHI7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCWludCByZXN1bHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnX25vdGlmeSIpOwpAQCAtNzg5LDggKzc1MSw4IEBACiAJY2FzZSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0s6CiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6CiAJCXByaW50aygiUHJvY2Vzc29yIGRyaXZlciByZWNlaXZlZCAlcyBldmVudFxuIiwKLQkJCShldmVudD09QUNQSV9OT1RJRllfQlVTX0NIRUNLKT8KLQkJCSJBQ1BJX05PVElGWV9CVVNfQ0hFQ0siOiJBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0siKTsKKwkJICAgICAgIChldmVudCA9PSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0spID8KKwkJICAgICAgICJBQ1BJX05PVElGWV9CVVNfQ0hFQ0siIDogIkFDUElfTk9USUZZX0RFVklDRV9DSEVDSyIpOwogCiAJCWlmICghaXNfcHJvY2Vzc29yX3ByZXNlbnQoaGFuZGxlKSkKIAkJCWJyZWFrOwpAQCAtNzk5LDE0ICs3NjEsMTQgQEAKIAkJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2RldmljZV9hZGQoaGFuZGxlLCAmZGV2aWNlKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIlVuYWJsZSB0byBhZGQgdGhlIGRldmljZVxuIikpOworCQkJCQkJICAiVW5hYmxlIHRvIGFkZCB0aGUgZGV2aWNlXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCiAJCXByID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCQlpZiAoIXByKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJEcml2ZXIgZGF0YSBpcyBOVUxMXG4iKSk7CisJCQkJCSAgIkRyaXZlciBkYXRhIGlzIE5VTExcbiIpKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTgxNiwyNCArNzc4LDI3IEBACiAJCX0KIAogCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9zdGFydChkZXZpY2UpOwotCQlpZiAoKCFyZXN1bHQpICYmICgocHItPmlkID49MCkgJiYgKHByLT5pZCA8IE5SX0NQVVMpKSkgeworCQlpZiAoKCFyZXN1bHQpICYmICgocHItPmlkID49IDApICYmIChwci0+aWQgPCBOUl9DUFVTKSkpIHsKIAkJCWtvYmplY3RfaG90cGx1ZygmZGV2aWNlLT5rb2JqLCBLT0JKX09OTElORSk7CiAJCX0gZWxzZSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJEZXZpY2UgWyVzXSBmYWlsZWQgdG8gc3RhcnRcbiIsCi0JCQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKKwkJCQkJICAiRGV2aWNlIFslc10gZmFpbGVkIHRvIHN0YXJ0XG4iLAorCQkJCQkgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKSk7CiAJCX0KLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sInJlY2VpdmVkIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1RcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgInJlY2VpdmVkIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1RcbiIpKTsKIAogCQlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCJEZXZpY2UgZG9uJ3QgZXhpc3QsIGRyb3BwaW5nIEVKRUNUXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJEZXZpY2UgZG9uJ3QgZXhpc3QsIGRyb3BwaW5nIEVKRUNUXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCQlwciA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJaWYgKCFwcikgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiRHJpdmVyIGRhdGEgaXMgTlVMTCwgZHJvcHBpbmcgRUpFQ1RcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkRyaXZlciBkYXRhIGlzIE5VTEwsIGRyb3BwaW5nIEVKRUNUXG4iKSk7CiAJCQlyZXR1cm5fVk9JRDsKIAkJfQogCkBAIC04NDIsNyArODA3LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKKwkJCQkgICJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CiAJCWJyZWFrOwogCX0KIApAQCAtODUxLDQ1ICs4MTYsMzkgQEAKIAogc3RhdGljIGFjcGlfc3RhdHVzCiBwcm9jZXNzb3Jfd2Fsa19uYW1lc3BhY2VfY2IoYWNwaV9oYW5kbGUgaGFuZGxlLAotCXUzMiBsdmwsCi0Jdm9pZCAqY29udGV4dCwKLQl2b2lkICoqcnYpCisJCQkgICAgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQogewotCWFjcGlfc3RhdHVzIAkJCXN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50ICphY3Rpb24gPSBjb250ZXh0OwotCWFjcGlfb2JqZWN0X3R5cGUJdHlwZSA9IDA7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlID0gMDsKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X3R5cGUoaGFuZGxlLCAmdHlwZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4oQUVfT0spOworCQlyZXR1cm4gKEFFX09LKTsKIAogCWlmICh0eXBlICE9IEFDUElfVFlQRV9QUk9DRVNTT1IpCi0JCXJldHVybihBRV9PSyk7CisJCXJldHVybiAoQUVfT0spOwogCi0Jc3dpdGNoKCphY3Rpb24pIHsKKwlzd2l0Y2ggKCphY3Rpb24pIHsKIAljYXNlIElOU1RBTExfTk9USUZZX0hBTkRMRVI6CiAJCWFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihoYW5kbGUsCi0JCQlBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQlhY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnX25vdGlmeSwKLQkJCU5VTEwpOworCQkJCQkgICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkgICAgYWNwaV9wcm9jZXNzb3JfaG90cGx1Z19ub3RpZnksCisJCQkJCSAgICBOVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBVTklOU1RBTExfTk9USUZZX0hBTkRMRVI6CiAJCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGhhbmRsZSwKLQkJCUFDUElfU1lTVEVNX05PVElGWSwKLQkJCWFjcGlfcHJvY2Vzc29yX2hvdHBsdWdfbm90aWZ5KTsKKwkJCQkJICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkgICBhY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnX25vdGlmeSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAotCXJldHVybihBRV9PSyk7CisJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5pdCgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCSpwX2NwdSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5pdChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcF9jcHUpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQiKTsKIApAQCAtOTA4LDU3ICs4NjcsNDcgQEAKIAlyZXR1cm5fVkFMVUUoQUVfT0spOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2hhbmRsZV9lamVjdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9oYW5kbGVfZWplY3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpZiAoY3B1X29ubGluZShwci0+aWQpKSB7Ci0JCXJldHVybigtRUlOVkFMKTsKKwkJcmV0dXJuICgtRUlOVkFMKTsKIAl9CiAJYXJjaF91bnJlZ2lzdGVyX2NwdShwci0+aWQpOwogCWFjcGlfdW5tYXBfbHNhcGljKHByLT5pZCk7Ci0JcmV0dXJuKDApOworCXJldHVybiAoMCk7CiB9CiAjZWxzZQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5pdCgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCSpwX2NwdSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5pdChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcF9jcHUpCiB7CiAJcmV0dXJuIEFFX0VSUk9SOwogfQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfaGFuZGxlX2VqZWN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2hhbmRsZV9lamVjdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCXJldHVybigtRUlOVkFMKTsKKwlyZXR1cm4gKC1FSU5WQUwpOwogfQogI2VuZGlmCiAKLQogc3RhdGljCiB2b2lkIGFjcGlfcHJvY2Vzc29yX2luc3RhbGxfaG90cGx1Z19ub3RpZnkodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQogCWludCBhY3Rpb24gPSBJTlNUQUxMX05PVElGWV9IQU5ETEVSOwogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwKLQkJCQkgICAgIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJICAgICBBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJICAgICBwcm9jZXNzb3Jfd2Fsa19uYW1lc3BhY2VfY2IsCi0JCQkJICAgICAmYWN0aW9uLCBOVUxMKTsKKwkJCSAgICBBQ1BJX1JPT1RfT0JKRUNULAorCQkJICAgIEFDUElfVUlOVDMyX01BWCwKKwkJCSAgICBwcm9jZXNzb3Jfd2Fsa19uYW1lc3BhY2VfY2IsICZhY3Rpb24sIE5VTEwpOwogI2VuZGlmCiB9CiAKLQogc3RhdGljCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3VuaW5zdGFsbF9ob3RwbHVnX25vdGlmeSh2b2lkKQogewogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCiAJaW50IGFjdGlvbiA9IFVOSU5TVEFMTF9OT1RJRllfSEFORExFUjsKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsCi0JCQkJICAgICBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJCSAgICAgcHJvY2Vzc29yX3dhbGtfbmFtZXNwYWNlX2NiLAotCQkJCSAgICAgJmFjdGlvbiwgTlVMTCk7CisJCQkgICAgQUNQSV9ST09UX09CSkVDVCwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsCisJCQkgICAgcHJvY2Vzc29yX3dhbGtfbmFtZXNwYWNlX2NiLCAmYWN0aW9uLCBOVUxMKTsKICNlbmRpZgogfQogCkBAIC05NjgsMTAgKzkxNyw5IEBACiAgKiBBQ1BJLCBidXQgbmVlZHMgc3ltYm9scyBmcm9tIHRoaXMgZHJpdmVyCiAgKi8KIAotc3RhdGljIGludCBfX2luaXQKLWFjcGlfcHJvY2Vzc29yX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3Byb2Nlc3Nvcl9pbml0KHZvaWQpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2luaXQiKTsKIApAQCAtOTk4LDkgKzk0Niw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9wcm9jZXNzb3JfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3Byb2Nlc3Nvcl9leGl0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZXhpdCIpOwogCkBAIC0xMDE3LDcgKzk2Myw2IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogbW9kdWxlX2luaXQoYWNwaV9wcm9jZXNzb3JfaW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX3Byb2Nlc3Nvcl9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCAyYzA0NzQwLi4yNmEzYTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtNDgsMTUgKzQ4LDEyIEBACiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTICAgICAgICAgICAgInByb2Nlc3NvciIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUgICAgICAiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUgICAgICAgICAgICAgICAgKCJhY3BpX3Byb2Nlc3NvciIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRklMRV9QT1dFUgkicG93ZXIiCi0KICNkZWZpbmUgVVNfVE9fUE1fVElNRVJfVElDS1ModCkJCSgodCAqIChQTV9USU1FUl9GUkVRVUVOQ1kvMTAwMCkpIC8gMTAwMCkKICNkZWZpbmUgQzJfT1ZFUkhFQUQJCQk0CS8qIDF1cyAoMy41NzkgdGlja3MgcGVyIHVzKSAqLwogI2RlZmluZSBDM19PVkVSSEVBRAkJCTQJLyogMXVzICgzLjU3OSB0aWNrcyBwZXIgdXMpICovCi0KLXN0YXRpYyB2b2lkICgqcG1faWRsZV9zYXZlKSh2b2lkKTsKK3N0YXRpYyB2b2lkICgqcG1faWRsZV9zYXZlKSAodm9pZCk7CiBtb2R1bGVfcGFyYW0obWF4X2NzdGF0ZSwgdWludCwgMDY0NCk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbm9jc3QgPSAwOwpAQCAtNjksNyArNjYsOCBAQAogICogMTAwIEhaOiAweDAwMDAwMDBGOiA0IGppZmZpZXMgPSA0MG1zCiAgKiByZWR1Y2UgaGlzdG9yeSBmb3IgbW9yZSBhZ2dyZXNzaXZlIGVudHJ5IGludG8gQzMKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBibV9oaXN0b3J5ID0gKEhaID49IDgwMCA/IDB4RkZGRkZGRkYgOiAoKDFVIDw8IChIWiAvIDI1KSkgLSAxKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGJtX2hpc3RvcnkgPQorICAgIChIWiA+PSA4MDAgPyAweEZGRkZGRkZGIDogKCgxVSA8PCAoSFogLyAyNSkpIC0gMSkpOwogbW9kdWxlX3BhcmFtKGJtX2hpc3RvcnksIHVpbnQsIDA2NDQpOwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXIgTWFuYWdlbWVudApAQCAtODcsMzQgKzg1LDM2IEBACiAJCXJldHVybiAwOwogCiAJcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiJXMgZGV0ZWN0ZWQgLSBsaW1pdGluZyB0byBDJWxkIG1heF9jc3RhdGUuIgotCQkiIE92ZXJyaWRlIHdpdGggXCJwcm9jZXNzb3IubWF4X2NzdGF0ZT0lZFwiXG4iLCBpZC0+aWRlbnQsCi0JCShsb25nKWlkLT5kcml2ZXJfZGF0YSwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSICsgMSk7CisJICAgICAgICIgT3ZlcnJpZGUgd2l0aCBcInByb2Nlc3Nvci5tYXhfY3N0YXRlPSVkXCJcbiIsIGlkLT5pZGVudCwKKwkgICAgICAgKGxvbmcpaWQtPmRyaXZlcl9kYXRhLCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgKyAxKTsKIAogCW1heF9jc3RhdGUgPSAobG9uZylpZC0+ZHJpdmVyX2RhdGE7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBwcm9jZXNzb3JfcG93ZXJfZG1pX3RhYmxlW10gPSB7Ci0JeyBzZXRfbWF4X2NzdGF0ZSwgIklCTSBUaGlua1BhZCBSNDBlIiwgewotCSAgRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiSUJNIiksCi0JICBETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiMVNFVDYwV1ciKSB9LCAodm9pZCopMX0sCi0JeyBzZXRfbWF4X2NzdGF0ZSwgIk1lZGlvbiA0MTcwMCIsIHsKLQkgIERNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAotCSAgRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sIlIwMS1BMUoiKSB9LCAodm9pZCopMX0sCi0JeyBzZXRfbWF4X2NzdGF0ZSwgIkNsZXZvIDU2MDBEIiwgewotCSAgRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCi0JICBETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiU0hFODQ1TTAuODZDLjAwMTMuRC4wMzAyMTMxMzA3IikgfSwKLQkgICh2b2lkKikyfSwKKwl7c2V0X21heF9jc3RhdGUsICJJQk0gVGhpbmtQYWQgUjQwZSIsIHsKKwkJCQkJICAgICAgIERNSV9NQVRDSChETUlfQklPU19WRU5ET1IsCisJCQkJCQkJICJJQk0iKSwKKwkJCQkJICAgICAgIERNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLAorCQkJCQkJCSAiMVNFVDYwV1ciKX0sCisJICh2b2lkICopMX0sCisJe3NldF9tYXhfY3N0YXRlLCAiTWVkaW9uIDQxNzAwIiwgeworCQkJCQkgIERNSV9NQVRDSChETUlfQklPU19WRU5ET1IsCisJCQkJCQkgICAgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJCQkgIERNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLAorCQkJCQkJICAgICJSMDEtQTFKIil9LCAodm9pZCAqKTF9LAorCXtzZXRfbWF4X2NzdGF0ZSwgIkNsZXZvIDU2MDBEIiwgeworCQkJCQkgRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwKKwkJCQkJCSAgICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCQkJIERNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLAorCQkJCQkJICAgIlNIRTg0NU0wLjg2Qy4wMDEzLkQuMDMwMjEzMTMwNyIpfSwKKwkgKHZvaWQgKikyfSwKIAl7fSwKIH07CiAKLQotc3RhdGljIGlubGluZSB1MzIKLXRpY2tzX2VsYXBzZWQgKAotCXUzMgkJCXQxLAotCXUzMgkJCXQyKQorc3RhdGljIGlubGluZSB1MzIgdGlja3NfZWxhcHNlZCh1MzIgdDEsIHUzMiB0MikKIHsKIAlpZiAodDIgPj0gdDEpCiAJCXJldHVybiAodDIgLSB0MSk7CkBAIC0xMjQsMTMgKzEyNCwxMSBAQAogCQlyZXR1cm4gKCgweEZGRkZGRkZGIC0gdDEpICsgdDIpOwogfQogCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3Byb2Nlc3Nvcl9wb3dlcl9hY3RpdmF0ZSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciwKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggICpuZXcpCithY3BpX3Byb2Nlc3Nvcl9wb3dlcl9hY3RpdmF0ZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJICAgICAgc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpuZXcpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICAqb2xkOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqb2xkOwogCiAJaWYgKCFwciB8fCAhbmV3KQogCQlyZXR1cm47CkBAIC0xMzksNyArMTM3LDcgQEAKIAogCWlmIChvbGQpCiAJCW9sZC0+cHJvbW90aW9uLmNvdW50ID0gMDsKLSAJbmV3LT5kZW1vdGlvbi5jb3VudCA9IDA7CisJbmV3LT5kZW1vdGlvbi5jb3VudCA9IDA7CiAKIAkvKiBDbGVhbnVwIGZyb20gb2xkIHN0YXRlLiAqLwogCWlmIChvbGQpIHsKQEAgLTE0Nyw3ICsxNDUsOCBAQAogCQljYXNlIEFDUElfU1RBVEVfQzM6CiAJCQkvKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgcmVsb2FkICovCiAJCQlpZiAobmV3LT50eXBlICE9IEFDUElfU1RBVEVfQzMgJiYgcHItPmZsYWdzLmJtX2NoZWNrKQotCQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDAsCisJCQkJCQkgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTU3LDcgKzE1Niw4IEBACiAJY2FzZSBBQ1BJX1NUQVRFX0MzOgogCQkvKiBFbmFibGUgYnVzIG1hc3RlciByZWxvYWQgKi8KIAkJaWYgKG9sZC0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MzICYmIHByLT5mbGFncy5ibV9jaGVjaykKLQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCwgMSwKKwkJCQkJICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTY2LDE3ICsxNjYsMTUgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyBhdG9taWNfdCBjM19jcHVfY291bnQ7CiAKLXN0YXRpYyBhdG9taWNfdCAJYzNfY3B1X2NvdW50OwotCi0KLXN0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX2lkbGUgKHZvaWQpCitzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IE5VTEw7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpuZXh0X3N0YXRlID0gTlVMTDsKLQlpbnQJCQlzbGVlcF90aWNrcyA9IDA7Ci0JdTMyCQkJdDEsIHQyID0gMDsKKwlpbnQgc2xlZXBfdGlja3MgPSAwOworCXUzMiB0MSwgdDIgPSAwOwogCiAJcHIgPSBwcm9jZXNzb3JzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCWlmICghcHIpCkBAIC0yMDgsOCArMjA2LDggQEAKIAkgKiBmb3IgZGVtb3Rpb24uCiAJICovCiAJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgewotCQl1MzIJCWJtX3N0YXR1cyA9IDA7Ci0JCXVuc2lnbmVkIGxvbmcJZGlmZiA9IGppZmZpZXMgLSBwci0+cG93ZXIuYm1fY2hlY2tfdGltZXN0YW1wOworCQl1MzIgYm1fc3RhdHVzID0gMDsKKwkJdW5zaWduZWQgbG9uZyBkaWZmID0gamlmZmllcyAtIHByLT5wb3dlci5ibV9jaGVja190aW1lc3RhbXA7CiAKIAkJaWYgKGRpZmYgPiAzMikKIAkJCWRpZmYgPSAzMjsKQEAgLTIyMywxMSArMjIxLDExIEBACiAJCX0KIAogCQlhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1NUQVRVUywKLQkJCSZibV9zdGF0dXMsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCQkgICZibV9zdGF0dXMsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJaWYgKGJtX3N0YXR1cykgewogCQkJcHItPnBvd2VyLmJtX2FjdGl2aXR5Kys7CiAJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1NUQVRVUywKLQkJCQkxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQkJCSAgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQl9CiAJCS8qCiAJCSAqIFBJSVg0IEVycmF0dW0gIzE4OiBOb3RlIHRoYXQgQk1fU1RTIGRvZXNuJ3QgYWx3YXlzIHJlZmxlY3QKQEAgLTIzNiw3ICsyMzQsNyBAQAogCQkgKi8KIAkJZWxzZSBpZiAoZXJyYXRhLnBpaXg0LmJtaXN4KSB7CiAJCQlpZiAoKGluYl9wKGVycmF0YS5waWl4NC5ibWlzeCArIDB4MDIpICYgMHgwMSkKLQkJCQl8fCAoaW5iX3AoZXJyYXRhLnBpaXg0LmJtaXN4ICsgMHgwQSkgJiAweDAxKSkKKwkJCSAgICB8fCAoaW5iX3AoZXJyYXRhLnBpaXg0LmJtaXN4ICsgMHgwQSkgJiAweDAxKSkKIAkJCQlwci0+cG93ZXIuYm1fYWN0aXZpdHkrKzsKIAkJfQogCkBAIC0yODEsNyArMjc5LDcgQEAKIAkJZWxzZQogCQkJc2FmZV9oYWx0KCk7CiAJCS8qCi0gICAgICAgICAgICAgICAgICogVEJEOiBDYW4ndCBnZXQgdGltZSBkdXJhdGlvbiB3aGlsZSBpbiBDMSwgYXMgcmVzdW1lcworCQkgKiBUQkQ6IENhbid0IGdldCB0aW1lIGR1cmF0aW9uIHdoaWxlIGluIEMxLCBhcyByZXN1bWVzCiAJCSAqICAgICAgZ28gdG8gYW4gSVNSIHJhdGhlciB0aGFuIGhlcmUuICBOZWVkIHRvIGluc3RydW1lbnQKIAkJICogICAgICBiYXNlIGludGVycnVwdCBoYW5kbGVyLgogCQkgKi8KQEAgLTMwMCwyNiArMjk4LDI3IEBACiAJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJLyogQ29tcHV0ZSB0aW1lICh0aWNrcykgdGhhdCB3ZSB3ZXJlIGFjdHVhbGx5IGFzbGVlcCAqLwotCQlzbGVlcF90aWNrcyA9IHRpY2tzX2VsYXBzZWQodDEsIHQyKSAtIGN4LT5sYXRlbmN5X3RpY2tzIC0gQzJfT1ZFUkhFQUQ7CisJCXNsZWVwX3RpY2tzID0KKwkJICAgIHRpY2tzX2VsYXBzZWQodDEsIHQyKSAtIGN4LT5sYXRlbmN5X3RpY2tzIC0gQzJfT1ZFUkhFQUQ7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1NUQVRFX0MzOgotCQkKKwogCQlpZiAocHItPmZsYWdzLmJtX2NoZWNrKSB7CiAJCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJmMzX2NwdV9jb3VudCkgPT0KLQkJCQkJbnVtX29ubGluZV9jcHVzKCkpIHsKKwkJCSAgICBudW1fb25saW5lX2NwdXMoKSkgewogCQkJCS8qCiAJCQkJICogQWxsIENQVXMgYXJlIHRyeWluZyB0byBnbyB0byBDMwogCQkJCSAqIERpc2FibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbgogCQkJCSAqLwogCQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAxLAotCQkJCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQkJCQkgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIFNNUCB3aXRoIG5vIHNoYXJlZCBjYWNoZS4uLiBJbnZhbGlkYXRlIGNhY2hlICAqLwogCQkJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKIAkJfQotCQkKKwogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCiAJCXQxID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMzICovCkBAIC0zMzEsMTMgKzMzMCwxNSBAQAogCQlpZiAocHItPmZsYWdzLmJtX2NoZWNrKSB7CiAJCQkvKiBFbmFibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLwogCQkJYXRvbWljX2RlYygmYzNfY3B1X2NvdW50KTsKLQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMCwKKwkJCQkJICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCX0KIAogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCS8qIENvbXB1dGUgdGltZSAodGlja3MpIHRoYXQgd2Ugd2VyZSBhY3R1YWxseSBhc2xlZXAgKi8KLQkJc2xlZXBfdGlja3MgPSB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMzX09WRVJIRUFEOworCQlzbGVlcF90aWNrcyA9CisJCSAgICB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMzX09WRVJIRUFEOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zNTksMTUgKzM2MCwxOCBAQAogCSAgICAoKGN4LT5wcm9tb3Rpb24uc3RhdGUgLSBwci0+cG93ZXIuc3RhdGVzKSA8PSBtYXhfY3N0YXRlKSkgewogCQlpZiAoc2xlZXBfdGlja3MgPiBjeC0+cHJvbW90aW9uLnRocmVzaG9sZC50aWNrcykgewogCQkJY3gtPnByb21vdGlvbi5jb3VudCsrOwotIAkJCWN4LT5kZW1vdGlvbi5jb3VudCA9IDA7Ci0JCQlpZiAoY3gtPnByb21vdGlvbi5jb3VudCA+PSBjeC0+cHJvbW90aW9uLnRocmVzaG9sZC5jb3VudCkgeworCQkJY3gtPmRlbW90aW9uLmNvdW50ID0gMDsKKwkJCWlmIChjeC0+cHJvbW90aW9uLmNvdW50ID49CisJCQkgICAgY3gtPnByb21vdGlvbi50aHJlc2hvbGQuY291bnQpIHsKIAkJCQlpZiAocHItPmZsYWdzLmJtX2NoZWNrKSB7Ci0JCQkJCWlmICghKHByLT5wb3dlci5ibV9hY3Rpdml0eSAmIGN4LT5wcm9tb3Rpb24udGhyZXNob2xkLmJtKSkgewotCQkJCQkJbmV4dF9zdGF0ZSA9IGN4LT5wcm9tb3Rpb24uc3RhdGU7CisJCQkJCWlmICghCisJCQkJCSAgICAocHItPnBvd2VyLmJtX2FjdGl2aXR5ICYgY3gtPgorCQkJCQkgICAgIHByb21vdGlvbi50aHJlc2hvbGQuYm0pKSB7CisJCQkJCQluZXh0X3N0YXRlID0KKwkJCQkJCSAgICBjeC0+cHJvbW90aW9uLnN0YXRlOwogCQkJCQkJZ290byBlbmQ7CiAJCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJfSBlbHNlIHsKIAkJCQkJbmV4dF9zdGF0ZSA9IGN4LT5wcm9tb3Rpb24uc3RhdGU7CiAJCQkJCWdvdG8gZW5kOwogCQkJCX0KQEAgLTM5Miw3ICszOTYsNyBAQAogCQl9CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJLyoKIAkgKiBEZW1vdGUgaWYgY3VycmVudCBzdGF0ZSBleGNlZWRzIG1heF9jc3RhdGUKIAkgKi8KQEAgLTQxMiw3ICs0MTYsNyBAQAogCiAJcmV0dXJuOwogCi0gZWFzeV9vdXQ6CisgICAgICBlYXN5X291dDoKIAkvKiBkbyBDMSBpbnN0ZWFkIG9mIGJ1c3kgbG9vcCAqLwogCWlmIChwbV9pZGxlX3NhdmUpCiAJCXBtX2lkbGVfc2F2ZSgpOwpAQCAtNDIxLDEwICs0MjUsNyBAQAogCXJldHVybjsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9zZXRfcG93ZXJfcG9saWN5ICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfcG93ZXJfcG9saWN5KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IHN0YXRlX2lzX3NldCA9IDA7CkBAIC00MzIsNyArNDMzLDcgQEAKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmhpZ2hlciA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeDsKIAotIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfcG93ZXJfcG9saWN5Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfc2V0X3Bvd2VyX3BvbGljeSIpOwogCiAJaWYgKCFwcikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwpAQCAtNDQ3LDcgKzQ0OCw3IEBACiAJICovCiAKIAkvKiBzdGFydHVwIHN0YXRlICovCi0JZm9yIChpPTE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgewogCQljeCA9ICZwci0+cG93ZXIuc3RhdGVzW2ldOwogCQlpZiAoIWN4LT52YWxpZCkKIAkJCWNvbnRpbnVlOwpAQCAtNDU2LDEzICs0NTcsMTMgQEAKIAkJCXByLT5wb3dlci5zdGF0ZSA9IGN4OwogCQlzdGF0ZV9pc19zZXQrKzsKIAkJYnJlYWs7Ci0gCX0KKwl9CiAKIAlpZiAoIXN0YXRlX2lzX3NldCkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCiAJLyogZGVtb3Rpb24gKi8KLQlmb3IgKGk9MTsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKSB7CiAJCWN4ID0gJnByLT5wb3dlci5zdGF0ZXNbaV07CiAJCWlmICghY3gtPnZhbGlkKQogCQkJY29udGludWU7CkBAIC00ODUsNyArNDg2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChoaWdoZXIpIHsKLQkJCWN4LT5wcm9tb3Rpb24uc3RhdGUgID0gaGlnaGVyOworCQkJY3gtPnByb21vdGlvbi5zdGF0ZSA9IGhpZ2hlcjsKIAkJCWN4LT5wcm9tb3Rpb24udGhyZXNob2xkLnRpY2tzID0gY3gtPmxhdGVuY3lfdGlja3M7CiAJCQlpZiAoY3gtPnR5cGUgPj0gQUNQSV9TVEFURV9DMikKIAkJCQljeC0+cHJvbW90aW9uLnRocmVzaG9sZC5jb3VudCA9IDQ7CkBAIC00OTgsMTEgKzQ5OSwxMCBAQAogCQloaWdoZXIgPSBjeDsKIAl9CiAKLSAJcmV0dXJuX1ZBTFVFKDApOworCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2ZhZHQgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2ZhZHQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpbnQgaTsKIApAQCAtNTQzLDE1ICs1NDMsMTQgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaW50IGk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCi0JCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLCAKKwkJbWVtc2V0KCYocHItPnBvd2VyLnN0YXRlc1tpXSksIDAsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4KSk7CiAKIAkvKiBpZiBpbmZvIGlzIG9idGFpbmVkIGZyb20gcGJsay9mYWR0LCB0eXBlIGVxdWFscyBzdGF0ZSAqLwpAQCAtNTY3LDE0ICs1NjYsMTMgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2NzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwotCWFjcGlfaW50ZWdlcgkJY291bnQ7Ci0JaW50CQkJaTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQl1bmlvbiBhY3BpX29iamVjdAkqY3N0OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJYWNwaV9pbnRlZ2VyIGNvdW50OworCWludCBpOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKmNzdDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2NzdCIpOwogCkBAIC01ODMsMjAgKzU4MSwyMSBAQAogCiAJcHItPnBvd2VyLmNvdW50ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCi0JCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLCAKKwkJbWVtc2V0KCYocHItPnBvd2VyLnN0YXRlc1tpXSksIDAsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4KSk7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX0NTVCIsIE5VTEwsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyBfQ1NULCBnaXZpbmcgdXBcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotIAl9CisJfQogCi0JY3N0ID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCWNzdCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCiAJLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAyIGVsZW1lbnRzICovCiAJaWYgKCFjc3QgfHwgKGNzdC0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgfHwgY3N0LT5wYWNrYWdlLmNvdW50IDwgMikgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAibm90IGVub3VnaCBlbGVtZW50cyBpbiBfQ1NUXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAibm90IGVub3VnaCBlbGVtZW50cyBpbiBfQ1NUXG4iKSk7CiAJCXN0YXR1cyA9IC1FRkFVTFQ7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTYwNSwxNSArNjA0LDE5IEBACiAKIAkvKiBWYWxpZGF0ZSBudW1iZXIgb2YgcG93ZXIgc3RhdGVzLiAqLwogCWlmIChjb3VudCA8IDEgfHwgY291bnQgIT0gY3N0LT5wYWNrYWdlLmNvdW50IC0gMSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiY291bnQgZ2l2ZW4gYnkgX0NTVCBpcyBub3QgdmFsaWRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJjb3VudCBnaXZlbiBieSBfQ1NUIGlzIG5vdCB2YWxpZFxuIikpOwogCQlzdGF0dXMgPSAtRUZBVUxUOwogCQlnb3RvIGVuZDsKIAl9CiAKIAkvKiBXZSBzdXBwb3J0IHVwIHRvIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUi4gKi8KIAlpZiAoY291bnQgPiBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTGltaXRpbmcgbnVtYmVyIG9mIHBvd2VyIHN0YXRlcyB0byBtYXggKCVkKVxuIiwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGxlYXNlIGluY3JlYXNlIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUiBpZiBuZWVkZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkxpbWl0aW5nIG51bWJlciBvZiBwb3dlciBzdGF0ZXMgdG8gbWF4ICglZClcbiIsCisJCSAgICAgICBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiUGxlYXNlIGluY3JlYXNlIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUiBpZiBuZWVkZWQuXG4iKTsKIAkJY291bnQgPSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7CiAJfQogCkBAIC02MjgsMjkgKzYzMSwyOSBAQAogCiAJCW1lbXNldCgmY3gsIDAsIHNpemVvZihjeCkpOwogCi0JCWVsZW1lbnQgPSAodW5pb24gYWNwaV9vYmplY3QgKikgJihjc3QtPnBhY2thZ2UuZWxlbWVudHNbaV0pOworCQllbGVtZW50ID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopJihjc3QtPnBhY2thZ2UuZWxlbWVudHNbaV0pOwogCQlpZiAoZWxlbWVudC0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChlbGVtZW50LT5wYWNrYWdlLmNvdW50ICE9IDQpCiAJCQljb250aW51ZTsKIAotCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgJihlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzBdKTsKKwkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopJihlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzBdKTsKIAogCQlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCiAJCQljb250aW51ZTsKIAotCQlyZWcgPSAoc3RydWN0IGFjcGlfcG93ZXJfcmVnaXN0ZXIgKikgb2JqLT5idWZmZXIucG9pbnRlcjsKKwkJcmVnID0gKHN0cnVjdCBhY3BpX3Bvd2VyX3JlZ2lzdGVyICopb2JqLT5idWZmZXIucG9pbnRlcjsKIAogCQlpZiAocmVnLT5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8gJiYKLQkJCShyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkKKwkJICAgIChyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkKIAkJCWNvbnRpbnVlOwogCiAJCWN4LmFkZHJlc3MgPSAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkgPwotCQkJMCA6IHJlZy0+YWRkcmVzczsKKwkJICAgIDAgOiByZWctPmFkZHJlc3M7CiAKIAkJLyogVGhlcmUgc2hvdWxkIGJlIGFuIGVhc3kgd2F5IHRvIGV4dHJhY3QgYW4gaW50ZWdlci4uLiAqLwotCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgJihlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzFdKTsKKwkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopJihlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzFdKTsKIAkJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikKIAkJCWNvbnRpbnVlOwogCkBAIC02NjAsMTcgKzY2MywxNiBAQAogCQkgICAgKHJlZy0+c3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgoY3gudHlwZSA8IEFDUElfU1RBVEVfQzEpIHx8Ci0JCSAgICAoY3gudHlwZSA+IEFDUElfU1RBVEVfQzMpKQorCQlpZiAoKGN4LnR5cGUgPCBBQ1BJX1NUQVRFX0MxKSB8fCAoY3gudHlwZSA+IEFDUElfU1RBVEVfQzMpKQogCQkJY29udGludWU7CiAKLQkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopICYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1syXSk7CisJCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1syXSk7CiAJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpCiAJCQljb250aW51ZTsKIAogCQljeC5sYXRlbmN5ID0gb2JqLT5pbnRlZ2VyLnZhbHVlOwogCi0JCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSAmKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbM10pOworCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikmKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbM10pOwogCQlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKQogCQkJY29udGludWU7CiAKQEAgLTY4MCwxOSArNjgyLDE5IEBACiAJCW1lbWNweSgmKHByLT5wb3dlci5zdGF0ZXNbcHItPnBvd2VyLmNvdW50XSksICZjeCwgc2l6ZW9mKGN4KSk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgJWQgcG93ZXIgc3RhdGVzXG4iLCBwci0+cG93ZXIuY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCAlZCBwb3dlciBzdGF0ZXNcbiIsCisJCQkgIHByLT5wb3dlci5jb3VudCkpOwogCiAJLyogVmFsaWRhdGUgbnVtYmVyIG9mIHBvd2VyIHN0YXRlcyBkaXNjb3ZlcmVkICovCiAJaWYgKHByLT5wb3dlci5jb3VudCA8IDIpCiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKLQogc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5X2MyKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX3ZlcmlmeV9jMiIpOwpAQCAtNzA2LDggKzcwOCw3IEBACiAJICovCiAJZWxzZSBpZiAoY3gtPmxhdGVuY3kgPiBBQ1BJX1BST0NFU1NPUl9NQVhfQzJfTEFURU5DWSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAibGF0ZW5jeSB0b28gbGFyZ2UgWyVkXVxuIiwKLQkJCQkgIGN4LT5sYXRlbmN5KSk7CisJCQkJICAibGF0ZW5jeSB0b28gbGFyZ2UgWyVkXVxuIiwgY3gtPmxhdGVuY3kpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC03MjEsMTAgKzcyMiw4IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQotc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5X2MzKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCkKK3N0YXRpYyB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeV9jMyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCQkgICBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4KQogewogCXN0YXRpYyBpbnQgYm1fY2hlY2tfZmxhZzsKIApAQCAtNzM5LDggKzczOCw3IEBACiAJICovCiAJZWxzZSBpZiAoY3gtPmxhdGVuY3kgPiBBQ1BJX1BST0NFU1NPUl9NQVhfQzNfTEFURU5DWSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAibGF0ZW5jeSB0b28gbGFyZ2UgWyVkXVxuIiwKLQkJCQkgIGN4LT5sYXRlbmN5KSk7CisJCQkJICAibGF0ZW5jeSB0b28gbGFyZ2UgWyVkXVxuIiwgY3gtPmxhdGVuY3kpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC03NTMsNyArNzUxLDcgQEAKIAkgKi8KIAllbHNlIGlmIChlcnJhdGEucGlpeDQuZmRtYSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiQzMgbm90IHN1cHBvcnRlZCBvbiBQSUlYNCB3aXRoIFR5cGUtRiBETUFcbiIpKTsKKwkJCQkgICJDMyBub3Qgc3VwcG9ydGVkIG9uIFBJSVg0IHdpdGggVHlwZS1GIERNQVxuIikpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKQEAgLTc3MCw3ICs3NjgsNyBAQAogCQkvKiBidXMgbWFzdGVyaW5nIGNvbnRyb2wgaXMgbmVjZXNzYXJ5ICovCiAJCWlmICghcHItPmZsYWdzLmJtX2NvbnRyb2wpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIkMzIHN1cHBvcnQgcmVxdWlyZXMgYnVzIG1hc3RlcmluZyBjb250cm9sXG4iKSk7CisJCQkJCSAgIkMzIHN1cHBvcnQgcmVxdWlyZXMgYnVzIG1hc3RlcmluZyBjb250cm9sXG4iKSk7CiAJCQlyZXR1cm5fVk9JRDsKIAkJfQogCX0gZWxzZSB7CkBAIC03ODAsMTIgKzc3OCwxMiBAQAogCQkgKi8KIAkJaWYgKGFjcGlfZmFkdC53Yl9pbnZkICE9IDEpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIkNhY2hlIGludmFsaWRhdGlvbiBzaG91bGQgd29yayBwcm9wZXJseSIKLQkJCSAgIiBmb3IgQzMgdG8gYmUgZW5hYmxlZCBvbiBTTVAgc3lzdGVtc1xuIikpOworCQkJCQkgICJDYWNoZSBpbnZhbGlkYXRpb24gc2hvdWxkIHdvcmsgcHJvcGVybHkiCisJCQkJCSAgIiBmb3IgQzMgdG8gYmUgZW5hYmxlZCBvbiBTTVAgc3lzdGVtc1xuIikpOwogCQkJcmV0dXJuX1ZPSUQ7CiAJCX0KIAkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsCi0JCQkJMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJCSAgMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCX0KIAogCS8qCkBAIC04MDAsMTMgKzc5OCwxMiBAQAogCXJldHVybl9WT0lEOwogfQogCi0KIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IHdvcmtpbmcgPSAwOwogCi0JZm9yIChpPTE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgewogCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gJnByLT5wb3dlci5zdGF0ZXNbaV07CiAKIAkJc3dpdGNoIChjeC0+dHlwZSkgewpAQCAtODMwLDggKzgyNyw3IEBACiAJcmV0dXJuICh3b3JraW5nKTsKIH0KIAotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mbyAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwcikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm8oc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmVzdWx0OwpAQCAtODc0LDE2ICs4NzAsMTYgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLWludCBhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitpbnQgYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0gCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQiKTsKIAogCWlmICghcHIpCi0gCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWlmICggbm9jc3QpIHsKKwlpZiAobm9jc3QpIHsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIApAQCAtODkyLDcgKzg4OCw3IEBACiAKIAkvKiBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgaWRsZSBsb29wICovCiAJcG1faWRsZSA9IHBtX2lkbGVfc2F2ZTsKLQlzeW5jaHJvbml6ZV9zY2hlZCgpOyAgLyogUmVsaWVzIG9uIGludGVycnVwdHMgZm9yY2luZyBleGl0IGZyb20gaWRsZS4gKi8KKwlzeW5jaHJvbml6ZV9zY2hlZCgpOwkvKiBSZWxpZXMgb24gaW50ZXJydXB0cyBmb3JjaW5nIGV4aXQgZnJvbSBpZGxlLiAqLwogCiAJcHItPmZsYWdzLnBvd2VyID0gMDsKIAlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mbyhwcik7CkBAIC05MDYsOCArOTAyLDggQEAKIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopc2VxLT5wcml2YXRlOwotCXVuc2lnbmVkIGludAkJaTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3Bvd2VyX3NlcV9zaG93Iik7CiAKQEAgLTkxNSwxNyArOTExLDE3IEBACiAJCWdvdG8gZW5kOwogCiAJc2VxX3ByaW50ZihzZXEsICJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgQyV6ZFxuIgotCQkJIm1heF9jc3RhdGU6ICAgICAgICAgICAgICBDJWRcbiIKLQkJCSJidXMgbWFzdGVyIGFjdGl2aXR5OiAgICAgJTA4eFxuIiwKLQkJCXByLT5wb3dlci5zdGF0ZSA/IHByLT5wb3dlci5zdGF0ZSAtIHByLT5wb3dlci5zdGF0ZXMgOiAwLAotCQkJbWF4X2NzdGF0ZSwKLQkJCSh1bnNpZ25lZClwci0+cG93ZXIuYm1fYWN0aXZpdHkpOworCQkgICAibWF4X2NzdGF0ZTogICAgICAgICAgICAgIEMlZFxuIgorCQkgICAiYnVzIG1hc3RlciBhY3Rpdml0eTogICAgICUwOHhcbiIsCisJCSAgIHByLT5wb3dlci5zdGF0ZSA/IHByLT5wb3dlci5zdGF0ZSAtIHByLT5wb3dlci5zdGF0ZXMgOiAwLAorCQkgICBtYXhfY3N0YXRlLCAodW5zaWduZWQpcHItPnBvd2VyLmJtX2FjdGl2aXR5KTsKIAogCXNlcV9wdXRzKHNlcSwgInN0YXRlczpcbiIpOwogCiAJZm9yIChpID0gMTsgaSA8PSBwci0+cG93ZXIuY291bnQ7IGkrKykgewogCQlzZXFfcHJpbnRmKHNlcSwgIiAgICVjQyVkOiAgICAgICAgICAgICAgICAgICIsCi0JCQkoJnByLT5wb3dlci5zdGF0ZXNbaV0gPT0gcHItPnBvd2VyLnN0YXRlPycqJzonICcpLCBpKTsKKwkJCSAgICgmcHItPnBvd2VyLnN0YXRlc1tpXSA9PQorCQkJICAgIHByLT5wb3dlci5zdGF0ZSA/ICcqJyA6ICcgJyksIGkpOwogCiAJCWlmICghcHItPnBvd2VyLnN0YXRlc1tpXS52YWxpZCkgewogCQkJc2VxX3B1dHMoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKQEAgLTk0OSw0NSArOTQ1LDQ2IEBACiAKIAkJaWYgKHByLT5wb3dlci5zdGF0ZXNbaV0ucHJvbW90aW9uLnN0YXRlKQogCQkJc2VxX3ByaW50ZihzZXEsICJwcm9tb3Rpb25bQyV6ZF0gIiwKLQkJCQkocHItPnBvd2VyLnN0YXRlc1tpXS5wcm9tb3Rpb24uc3RhdGUgLQotCQkJCSBwci0+cG93ZXIuc3RhdGVzKSk7CisJCQkJICAgKHByLT5wb3dlci5zdGF0ZXNbaV0ucHJvbW90aW9uLnN0YXRlIC0KKwkJCQkgICAgcHItPnBvd2VyLnN0YXRlcykpOwogCQllbHNlCiAJCQlzZXFfcHV0cyhzZXEsICJwcm9tb3Rpb25bLS1dICIpOwogCiAJCWlmIChwci0+cG93ZXIuc3RhdGVzW2ldLmRlbW90aW9uLnN0YXRlKQogCQkJc2VxX3ByaW50ZihzZXEsICJkZW1vdGlvbltDJXpkXSAiLAotCQkJCShwci0+cG93ZXIuc3RhdGVzW2ldLmRlbW90aW9uLnN0YXRlIC0KLQkJCQkgcHItPnBvd2VyLnN0YXRlcykpOworCQkJCSAgIChwci0+cG93ZXIuc3RhdGVzW2ldLmRlbW90aW9uLnN0YXRlIC0KKwkJCQkgICAgcHItPnBvd2VyLnN0YXRlcykpOwogCQllbHNlCiAJCQlzZXFfcHV0cyhzZXEsICJkZW1vdGlvblstLV0gIik7CiAKIAkJc2VxX3ByaW50ZihzZXEsICJsYXRlbmN5WyUwM2RdIHVzYWdlWyUwOGRdXG4iLAotCQkJcHItPnBvd2VyLnN0YXRlc1tpXS5sYXRlbmN5LAotCQkJcHItPnBvd2VyLnN0YXRlc1tpXS51c2FnZSk7CisJCQkgICBwci0+cG93ZXIuc3RhdGVzW2ldLmxhdGVuY3ksCisJCQkgICBwci0+cG93ZXIuc3RhdGVzW2ldLnVzYWdlKTsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9wcm9jZXNzb3JfcG93ZXJfc2VxX3Nob3csCi0JCQkJCQlQREUoaW5vZGUpLT5kYXRhKTsKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9mb3BzID0gewotCS5vcGVuIAkJPSBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitpbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0Jc3RhdGljIGludAkJZmlyc3RfcnVuID0gMDsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQiKTsKQEAgLTk5NSw3ICs5OTIsOSBAQAogCWlmICghZmlyc3RfcnVuKSB7CiAJCWRtaV9jaGVja19zeXN0ZW0ocHJvY2Vzc29yX3Bvd2VyX2RtaV90YWJsZSk7CiAJCWlmIChtYXhfY3N0YXRlIDwgQUNQSV9DX1NUQVRFU19NQVgpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFDUEk6IHByb2Nlc3NvciBsaW1pdGVkIHRvIG1heCBDLXN0YXRlICVkXG4iLCBtYXhfY3N0YXRlKTsKKwkJCXByaW50ayhLRVJOX05PVElDRQorCQkJICAgICAgICJBQ1BJOiBwcm9jZXNzb3IgbGltaXRlZCB0byBtYXggQy1zdGF0ZSAlZFxuIiwKKwkJCSAgICAgICBtYXhfY3N0YXRlKTsKIAkJZmlyc3RfcnVuKys7CiAJfQogCkBAIC0xMDAzLDcgKzEwMDIsOCBAQAogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKIAlpZiAoYWNwaV9mYWR0LmNzdF9jbnQgJiYgIW5vY3N0KSB7Ci0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2ZhZHQuc21pX2NtZCwgYWNwaV9mYWR0LmNzdF9jbnQsIDgpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZmFkdC5zbWlfY21kLCBhY3BpX2ZhZHQuY3N0X2NudCwgOCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCQkJICAiTm90aWZ5aW5nIEJJT1Mgb2YgX0NTVCBhYmlsaXR5IGZhaWxlZFxuIikpOwpAQCAtMTAyMyw3ICsxMDIzLDggQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkNQVSVkIChwb3dlciBzdGF0ZXM6IiwgcHItPmlkKTsKIAkJZm9yIChpID0gMTsgaSA8PSBwci0+cG93ZXIuY291bnQ7IGkrKykKIAkJCWlmIChwci0+cG93ZXIuc3RhdGVzW2ldLnZhbGlkKQotCQkJCXByaW50aygiIEMlZFtDJWRdIiwgaSwgcHItPnBvd2VyLnN0YXRlc1tpXS50eXBlKTsKKwkJCQlwcmludGsoIiBDJWRbQyVkXSIsIGksCisJCQkJICAgICAgIHByLT5wb3dlci5zdGF0ZXNbaV0udHlwZSk7CiAJCXByaW50aygiKVxuIik7CiAKIAkJaWYgKHByLT5pZCA9PSAwKSB7CkBAIC0xMDM0LDExICsxMDM1LDExIEBACiAKIAkvKiAncG93ZXInIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9QT1dFUiwKLQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9QUk9DRVNTT1JfRklMRV9QT1dFUikpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfUFJPQ0VTU09SX0ZJTEVfUE9XRVIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTEwNTAsMTQgKzEwNTEsMTYgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLWludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoraW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2V4aXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3Bvd2VyX2V4aXQiKTsKIAogCXByLT5mbGFncy5wb3dlcl9zZXR1cF9kb25lID0gMDsKIAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfRklMRV9QT1dFUixhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfUE9XRVIsCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAKIAkvKiBVbnJlZ2lzdGVyIHRoZSBpZGxlIGhhbmRsZXIgd2hlbiBwcm9jZXNzb3IgIzAgaXMgcmVtb3ZlZC4gKi8KIAlpZiAocHItPmlkID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKaW5kZXggMWYwZDYyNS4uMjJjN2JiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqCiAgKi8KIAotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNDIsMTQgKzQxLDEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CiAKLQogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQJMHgwMTAwMDAwMAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DTEFTUwkJInByb2Nlc3NvciIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUJIkFDUEkgUHJvY2Vzc29yIERyaXZlciIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRklMRV9QRVJGT1JNQU5DRQkicGVyZm9ybWFuY2UiCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX3Byb2Nlc3NvciIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKIAogc3RhdGljIERFQ0xBUkVfTVVURVgocGVyZm9ybWFuY2Vfc2VtKTsKIApAQCAtNjksOCArNjYsNyBAQAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfc3RhdHVzID0gMDsKIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQl1bnNpZ25lZCBsb25nIGV2ZW50LAotCXZvaWQgKmRhdGEpCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBkYXRhOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CkBAIC04NSw3ICs4MSw3IEBACiAJaWYgKCFwciB8fCAhcHItPnBlcmZvcm1hbmNlKQogCQlnb3RvIG91dDsKIAotCXBwYyA9ICh1bnNpZ25lZCBpbnQpIHByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdDsKKwlwcGMgPSAodW5zaWduZWQgaW50KXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdDsKIAlpZiAoIXBwYykKIAkJZ290byBvdXQ7CiAKQEAgLTkzLDI2ICs4OSwyMyBAQAogCQlnb3RvIG91dDsKIAogCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAwLAotCQlwci0+cGVyZm9ybWFuY2UtPnN0YXRlc1twcGNdLmNvcmVfZnJlcXVlbmN5ICogMTAwMCk7CisJCQkJICAgICBwci0+cGVyZm9ybWFuY2UtPnN0YXRlc1twcGNdLgorCQkJCSAgICAgY29yZV9mcmVxdWVuY3kgKiAxMDAwKTsKIAotIG91dDoKKyAgICAgIG91dDoKIAl1cCgmcGVyZm9ybWFuY2Vfc2VtKTsKIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWNwaV9wcGNfbm90aWZpZXJfYmxvY2sgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBhY3BpX3Byb2Nlc3Nvcl9wcGNfbm90aWZpZXIsCiB9OwogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2dldF9wbGF0Zm9ybV9saW1pdCAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yKglwcikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3BsYXRmb3JtX2xpbWl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJcHBjID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgcHBjID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wbGF0Zm9ybV9saW1pdCIpOwogCkBAIC0xMjgsMTkgKzEyMSwxNyBAQAogCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKQogCQlhY3BpX3Byb2Nlc3Nvcl9wcGNfc3RhdHVzIHw9IFBQQ19JTl9VU0U7CiAKLQlpZihBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkVycm9yIGV2YWx1YXRpbmcgX1BQQ1xuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JcHItPnBlcmZvcm1hbmNlX3BsYXRmb3JtX2xpbWl0ID0gKGludCkgcHBjOworCXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdCA9IChpbnQpcHBjOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLWludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK2ludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpbnQgcmV0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3BsYXRmb3JtX2xpbWl0KHByKTsKIAlpZiAocmV0IDwgMCkKQEAgLTE0OSw0NCArMTQwLDQ0IEBACiAJCXJldHVybiBjcHVmcmVxX3VwZGF0ZV9wb2xpY3kocHItPmlkKTsKIH0KIAotCi12b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19pbml0KHZvaWQpIHsKLQlpZiAoIWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJmFjcGlfcHBjX25vdGlmaWVyX2Jsb2NrLCBDUFVGUkVRX1BPTElDWV9OT1RJRklFUikpCit2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19pbml0KHZvaWQpCit7CisJaWYgKCFjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyCisJICAgICgmYWNwaV9wcGNfbm90aWZpZXJfYmxvY2ssIENQVUZSRVFfUE9MSUNZX05PVElGSUVSKSkKIAkJYWNwaV9wcm9jZXNzb3JfcHBjX3N0YXR1cyB8PSBQUENfUkVHSVNURVJFRDsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICJXYXJuaW5nOiBQcm9jZXNzb3IgUGxhdGZvcm0gTGltaXQgbm90IHN1cHBvcnRlZC5cbiIpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIldhcm5pbmc6IFByb2Nlc3NvciBQbGF0Zm9ybSBMaW1pdCBub3Qgc3VwcG9ydGVkLlxuIik7CiB9CiAKLQotdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKSB7Cit2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19leGl0KHZvaWQpCit7CiAJaWYgKGFjcGlfcHJvY2Vzc29yX3BwY19zdGF0dXMgJiBQUENfUkVHSVNURVJFRCkKLQkJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZhY3BpX3BwY19ub3RpZmllcl9ibG9jaywgQ1BVRlJFUV9QT0xJQ1lfTk9USUZJRVIpOworCQljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJmFjcGlfcHBjX25vdGlmaWVyX2Jsb2NrLAorCQkJCQkgICAgQ1BVRlJFUV9QT0xJQ1lfTk9USUZJRVIpOwogCiAJYWNwaV9wcm9jZXNzb3JfcHBjX3N0YXR1cyAmPSB+UFBDX1JFR0lTVEVSRUQ7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfZ2V0X3BlcmZvcm1hbmNlX2NvbnRyb2wgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9jb250cm9sKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQl1bmlvbiBhY3BpX29iamVjdAkqcGN0ID0gTlVMTDsKLQl1bmlvbiBhY3BpX29iamVjdAlvYmogPSB7MH07CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpwY3QgPSBOVUxMOworCXVuaW9uIGFjcGlfb2JqZWN0IG9iaiA9IHsgMCB9OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3BlcmZvcm1hbmNlX2NvbnRyb2wiKTsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsICJfUENUIiwgTlVMTCwgJmJ1ZmZlcik7Ci0JaWYoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkVycm9yIGV2YWx1YXRpbmcgX1BDVFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JcGN0ID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCXBjdCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCWlmICghcGN0IHx8IChwY3QtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpCi0JCXx8IChwY3QtPnBhY2thZ2UuY291bnQgIT0gMikpIHsKKwkgICAgfHwgKHBjdC0+cGFja2FnZS5jb3VudCAhPSAyKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfUENUIGRhdGFcbiIpKTsKIAkJcmVzdWx0ID0gLUVGQVVMVDsKIAkJZ290byBlbmQ7CkBAIC0xOTksMTUgKzE5MCwxNSBAQAogCW9iaiA9IHBjdC0+cGFja2FnZS5lbGVtZW50c1swXTsKIAogCWlmICgob2JqLnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKLQkJfHwgKG9iai5idWZmZXIubGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlcikpCi0JCXx8IChvYmouYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkpIHsKKwkgICAgfHwgKG9iai5idWZmZXIubGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlcikpCisJICAgIHx8IChvYmouYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJJbnZhbGlkIF9QQ1QgZGF0YSAoY29udHJvbF9yZWdpc3RlcilcbiIpKTsKKwkJCQkgICJJbnZhbGlkIF9QQ1QgZGF0YSAoY29udHJvbF9yZWdpc3RlcilcbiIpKTsKIAkJcmVzdWx0ID0gLUVGQVVMVDsKIAkJZ290byBlbmQ7CiAJfQotCW1lbWNweSgmcHItPnBlcmZvcm1hbmNlLT5jb250cm9sX3JlZ2lzdGVyLCBvYmouYnVmZmVyLnBvaW50ZXIsIHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKTsKLQorCW1lbWNweSgmcHItPnBlcmZvcm1hbmNlLT5jb250cm9sX3JlZ2lzdGVyLCBvYmouYnVmZmVyLnBvaW50ZXIsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIpKTsKIAogCS8qCiAJICogc3RhdHVzX3JlZ2lzdGVyCkBAIC0yMTYsNDQgKzIwNyw0MiBAQAogCW9iaiA9IHBjdC0+cGFja2FnZS5lbGVtZW50c1sxXTsKIAogCWlmICgob2JqLnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKLQkJfHwgKG9iai5idWZmZXIubGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlcikpCi0JCXx8IChvYmouYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkpIHsKKwkgICAgfHwgKG9iai5idWZmZXIubGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlcikpCisJICAgIHx8IChvYmouYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJJbnZhbGlkIF9QQ1QgZGF0YSAoc3RhdHVzX3JlZ2lzdGVyKVxuIikpOworCQkJCSAgIkludmFsaWQgX1BDVCBkYXRhIChzdGF0dXNfcmVnaXN0ZXIpXG4iKSk7CiAJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJCWdvdG8gZW5kOwogCX0KIAotCW1lbWNweSgmcHItPnBlcmZvcm1hbmNlLT5zdGF0dXNfcmVnaXN0ZXIsIG9iai5idWZmZXIucG9pbnRlciwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlcikpOworCW1lbWNweSgmcHItPnBlcmZvcm1hbmNlLT5zdGF0dXNfcmVnaXN0ZXIsIG9iai5idWZmZXIucG9pbnRlciwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjdF9yZWdpc3RlcikpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9zdGF0ZXMgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9zdGF0ZXMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJZm9ybWF0ID0ge3NpemVvZigiTk5OTk5OIiksICJOTk5OTk4ifTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJc3RhdGUgPSB7MCwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QgCSpwc3MgPSBOVUxMOwotCWludAkJCWk7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgZm9ybWF0ID0geyBzaXplb2YoIk5OTk5OTiIpLCAiTk5OTk5OIiB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBzdGF0ZSA9IHsgMCwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpwc3MgPSBOVUxMOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X3BlcmZvcm1hbmNlX3N0YXRlcyIpOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QU1MiLCBOVUxMLCAmYnVmZmVyKTsKLQlpZihBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgZXZhbHVhdGluZyBfUFNTXG4iKSk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlwc3MgPSAodW5pb24gYWNwaV9vYmplY3QgKikgYnVmZmVyLnBvaW50ZXI7CisJcHNzID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CiAJaWYgKCFwc3MgfHwgKHBzcy0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgX1BTUyBkYXRhXG4iKSk7CiAJCXJlc3VsdCA9IC1FRkFVTFQ7CkBAIC0yNjEsMTAgKzI1MCwxMiBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kICVkIHBlcmZvcm1hbmNlIHN0YXRlc1xuIiwKLQkJcHNzLT5wYWNrYWdlLmNvdW50KSk7CisJCQkgIHBzcy0+cGFja2FnZS5jb3VudCkpOwogCiAJcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudCA9IHBzcy0+cGFja2FnZS5jb3VudDsKLQlwci0+cGVyZm9ybWFuY2UtPnN0YXRlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9weCkgKiBwc3MtPnBhY2thZ2UuY291bnQsIEdGUF9LRVJORUwpOworCXByLT5wZXJmb3JtYW5jZS0+c3RhdGVzID0KKwkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3B4KSAqIHBzcy0+cGFja2FnZS5jb3VudCwKKwkJICAgIEdGUF9LRVJORUwpOwogCWlmICghcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXMpIHsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBlbmQ7CkBAIC0yODAsNDYgKzI3MSw0NCBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFeHRyYWN0aW5nIHN0YXRlICVkXG4iLCBpKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9leHRyYWN0X3BhY2thZ2UoJihwc3MtPnBhY2thZ2UuZWxlbWVudHNbaV0pLAotCQkJJmZvcm1hdCwgJnN0YXRlKTsKKwkJCQkJICAgICAgJmZvcm1hdCwgJnN0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfUFNTIGRhdGFcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkludmFsaWQgX1BTUyBkYXRhXG4iKSk7CiAJCQlyZXN1bHQgPSAtRUZBVUxUOwogCQkJa2ZyZWUocHItPnBlcmZvcm1hbmNlLT5zdGF0ZXMpOwogCQkJZ290byBlbmQ7CiAJCX0KIAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiU3RhdGUgWyVkXTogY29yZV9mcmVxdWVuY3lbJWRdIHBvd2VyWyVkXSB0cmFuc2l0aW9uX2xhdGVuY3lbJWRdIGJ1c19tYXN0ZXJfbGF0ZW5jeVslZF0gY29udHJvbFsweCV4XSBzdGF0dXNbMHgleF1cbiIsCi0JCQlpLAotCQkJKHUzMikgcHgtPmNvcmVfZnJlcXVlbmN5LAotCQkJKHUzMikgcHgtPnBvd2VyLAotCQkJKHUzMikgcHgtPnRyYW5zaXRpb25fbGF0ZW5jeSwKLQkJCSh1MzIpIHB4LT5idXNfbWFzdGVyX2xhdGVuY3ksCi0JCQkodTMyKSBweC0+Y29udHJvbCwKLQkJCSh1MzIpIHB4LT5zdGF0dXMpKTsKKwkJCQkgICJTdGF0ZSBbJWRdOiBjb3JlX2ZyZXF1ZW5jeVslZF0gcG93ZXJbJWRdIHRyYW5zaXRpb25fbGF0ZW5jeVslZF0gYnVzX21hc3Rlcl9sYXRlbmN5WyVkXSBjb250cm9sWzB4JXhdIHN0YXR1c1sweCV4XVxuIiwKKwkJCQkgIGksCisJCQkJICAodTMyKSBweC0+Y29yZV9mcmVxdWVuY3ksCisJCQkJICAodTMyKSBweC0+cG93ZXIsCisJCQkJICAodTMyKSBweC0+dHJhbnNpdGlvbl9sYXRlbmN5LAorCQkJCSAgKHUzMikgcHgtPmJ1c19tYXN0ZXJfbGF0ZW5jeSwKKwkJCQkgICh1MzIpIHB4LT5jb250cm9sLCAodTMyKSBweC0+c3RhdHVzKSk7CiAKIAkJaWYgKCFweC0+Y29yZV9mcmVxdWVuY3kpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIF9QU1MgZGF0YTogZnJlcSBpcyB6ZXJvXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIF9QU1MgZGF0YTogZnJlcSBpcyB6ZXJvXG4iKSk7CiAJCQlyZXN1bHQgPSAtRUZBVUxUOwogCQkJa2ZyZWUocHItPnBlcmZvcm1hbmNlLT5zdGF0ZXMpOwogCQkJZ290byBlbmQ7CiAJCX0KIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfZ2V0X3BlcmZvcm1hbmNlX2luZm8gKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9pbmZvIik7CiAKQEAgLTMzMSw3ICszMjAsNyBAQAogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShwci0+aGFuZGxlLCAiX1BDVCIsICZoYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiQUNQSS1iYXNlZCBwcm9jZXNzb3IgcGVyZm9ybWFuY2UgY29udHJvbCB1bmF2YWlsYWJsZVxuIikpOworCQkJCSAgIkFDUEktYmFzZWQgcHJvY2Vzc29yIHBlcmZvcm1hbmNlIGNvbnRyb2wgdW5hdmFpbGFibGVcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIApAQCAtMzUwLDEwICszMzksMTAgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotaW50IGFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oc3RydWN0IG1vZHVsZSAqY2FsbGluZ19tb2R1bGUpIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXN0YXRpYyBpbnQJCWlzX2RvbmUgPSAwOworaW50IGFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oc3RydWN0IG1vZHVsZSAqY2FsbGluZ19tb2R1bGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0YXRpYyBpbnQgaXNfZG9uZSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tIik7CiAKQEAgLTM3MSw4ICszNjAsNyBAQAogCWlmIChpc19kb25lID4gMCkgewogCQltb2R1bGVfcHV0KGNhbGxpbmdfbW9kdWxlKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwotCX0KLQllbHNlIGlmIChpc19kb25lIDwgMCkgeworCX0gZWxzZSBpZiAoaXNfZG9uZSA8IDApIHsKIAkJbW9kdWxlX3B1dChjYWxsaW5nX21vZHVsZSk7CiAJCXJldHVybl9WQUxVRShpc19kb25lKTsKIAl9CkBAIC0zODAsMjggKzM2OCwzMCBAQAogCWlzX2RvbmUgPSAtRUlPOwogCiAJLyogQ2FuJ3Qgd3JpdGUgcHN0YXRlX2NudCB0byBzbWlfY21kIGlmIGVpdGhlciB2YWx1ZSBpcyB6ZXJvICovCi0JaWYgKCghYWNwaV9mYWR0LnNtaV9jbWQpIHx8Ci0JICAgICghYWNwaV9mYWR0LnBzdGF0ZV9jbnQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJObyBTTUkgcG9ydCBvciBwc3RhdGVfY250XG4iKSk7CisJaWYgKCghYWNwaV9mYWR0LnNtaV9jbWQpIHx8ICghYWNwaV9mYWR0LnBzdGF0ZV9jbnQpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vIFNNSSBwb3J0IG9yIHBzdGF0ZV9jbnRcbiIpKTsKIAkJbW9kdWxlX3B1dChjYWxsaW5nX21vZHVsZSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJXcml0aW5nIHBzdGF0ZV9jbnQgWzB4JXhdIHRvIHNtaV9jbWQgWzB4JXhdXG4iLCBhY3BpX2ZhZHQucHN0YXRlX2NudCwgYWNwaV9mYWR0LnNtaV9jbWQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJXcml0aW5nIHBzdGF0ZV9jbnQgWzB4JXhdIHRvIHNtaV9jbWQgWzB4JXhdXG4iLAorCQkJICBhY3BpX2ZhZHQucHN0YXRlX2NudCwgYWNwaV9mYWR0LnNtaV9jbWQpKTsKIAogCS8qIEZBRFQgdjEgZG9lc24ndCBzdXBwb3J0IHBzdGF0ZV9jbnQsIG1hbnkgQklPUyB2ZW5kb3JzIHVzZQogCSAqIGl0IGFueXdheSwgc28gd2UgbmVlZCB0byBzdXBwb3J0IGl0Li4uICovCiAJaWYgKGFjcGlfZmFkdF9pc192MSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJVc2luZyB2MS4wIEZBRFQgcmVzZXJ2ZWQgdmFsdWUgZm9yIHBzdGF0ZV9jbnRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIlVzaW5nIHYxLjAgRkFEVCByZXNlcnZlZCB2YWx1ZSBmb3IgcHN0YXRlX2NudFxuIikpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoYWNwaV9mYWR0LnNtaV9jbWQsCi0JCQkJICAgICAodTMyKSBhY3BpX2ZhZHQucHN0YXRlX2NudCwgOCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2ZhZHQuc21pX2NtZCwKKwkJCQkgICAgKHUzMikgYWNwaV9mYWR0LnBzdGF0ZV9jbnQsIDgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAogCQkJCSAgIkZhaWxlZCB0byB3cml0ZSBwc3RhdGVfY250IFsweCV4XSB0byAiCi0JCQkJICAic21pX2NtZCBbMHgleF1cbiIsIGFjcGlfZmFkdC5wc3RhdGVfY250LCBhY3BpX2ZhZHQuc21pX2NtZCkpOworCQkJCSAgInNtaV9jbWQgWzB4JXhdXG4iLCBhY3BpX2ZhZHQucHN0YXRlX2NudCwKKwkJCQkgIGFjcGlfZmFkdC5zbWlfY21kKSk7CiAJCW1vZHVsZV9wdXQoY2FsbGluZ19tb2R1bGUpOwogCQlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIAl9CkBAIC00MTUsMjQgKzQwNSwyNCBAQAogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKTsKIAogI2lmZGVmIENPTkZJR19YODZfQUNQSV9DUFVGUkVRX1BST0NfSU5URgogLyogL3Byb2MvYWNwaS9wcm9jZXNzb3IvLi4vcGVyZm9ybWFuY2UgaW50ZXJmYWNlIChERVBSRUNBVEVEKSAqLwogCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3BlcmZfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl9wZXJmX2ZvcHMgPSB7Ci0JLm9wZW4gCQk9IGFjcGlfcHJvY2Vzc29yX3BlcmZfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV9wcm9jZXNzb3JfcGVyZl9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9wZXJmX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilzZXEtPnByaXZhdGU7Ci0JaW50CQkJaTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgaTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3BlcmZfc2VxX3Nob3ciKTsKIApAQCAtNDQ1LDQyICs0MzUsNDAgQEAKIAl9CiAKIAlzZXFfcHJpbnRmKHNlcSwgInN0YXRlIGNvdW50OiAgICAgICAgICAgICAlZFxuIgotCQkJImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBQJWRcbiIsCi0JCQlwci0+cGVyZm9ybWFuY2UtPnN0YXRlX2NvdW50LAotCQkJcHItPnBlcmZvcm1hbmNlLT5zdGF0ZSk7CisJCSAgICJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgUCVkXG4iLAorCQkgICBwci0+cGVyZm9ybWFuY2UtPnN0YXRlX2NvdW50LCBwci0+cGVyZm9ybWFuY2UtPnN0YXRlKTsKIAogCXNlcV9wdXRzKHNlcSwgInN0YXRlczpcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBwci0+cGVyZm9ybWFuY2UtPnN0YXRlX2NvdW50OyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICAgJWNQJWQ6ICAgICAgICAgICAgICAgICAgJWQgTUh6LCAlZCBtVywgJWQgdVNcbiIsCi0JCQkoaSA9PSBwci0+cGVyZm9ybWFuY2UtPnN0YXRlPycqJzonICcpLCBpLAotCQkJKHUzMikgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCi0JCQkodTMyKSBwci0+cGVyZm9ybWFuY2UtPnN0YXRlc1tpXS5wb3dlciwKLQkJCSh1MzIpIHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSk7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIiAgICVjUCVkOiAgICAgICAgICAgICAgICAgICVkIE1IeiwgJWQgbVcsICVkIHVTXG4iLAorCQkJICAgKGkgPT0gcHItPnBlcmZvcm1hbmNlLT5zdGF0ZSA/ICcqJyA6ICcgJyksIGksCisJCQkgICAodTMyKSBwci0+cGVyZm9ybWFuY2UtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwKKwkJCSAgICh1MzIpIHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzW2ldLnBvd2VyLAorCQkJICAgKHUzMikgcHItPnBlcmZvcm1hbmNlLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5KTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9wZXJmX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfcHJvY2Vzc29yX3BlcmZfc2VxX3Nob3csCi0JCQkJCQlQREUoaW5vZGUpLT5kYXRhKTsKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcGVyZm9ybWFuY2UgKAotICAgICAgICBzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0gICAgICAgIGNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotICAgICAgICBzaXplX3QJCQljb3VudCwKLSAgICAgICAgbG9mZl90CQkJKmRhdGEpCithY3BpX3Byb2Nlc3Nvcl93cml0ZV9wZXJmb3JtYW5jZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBzZXFfZmlsZQkJKm0gPSAoc3RydWN0IHNlcV9maWxlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKSBtLT5wcml2YXRlOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKiltLT5wcml2YXRlOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZjsKLQljaGFyCQkJc3RhdGVfc3RyaW5nWzEyXSA9IHsnXDAnfTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBuZXdfc3RhdGUgPSAwOwotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgIHBvbGljeTsKKwljaGFyIHN0YXRlX3N0cmluZ1sxMl0gPSB7ICdcMCcgfTsKKwl1bnNpZ25lZCBpbnQgbmV3X3N0YXRlID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgcG9saWN5OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcGVyZm9ybWFuY2UiKTsKIApAQCAtNTEzLDEyICs1MDEsMTAgQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgdm9pZAotYWNwaV9jcHVmcmVxX2FkZF9maWxlICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIHZvaWQgYWNwaV9jcHVmcmVxX2FkZF9maWxlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfY3B1ZnJlcV9hZGRmaWxlIik7CiAKQEAgLTUyNywxMSArNTEzLDEyIEBACiAKIAkvKiBhZGQgZmlsZSAncGVyZm9ybWFuY2UnIFtSL1ddICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1BST0NFU1NPUl9GSUxFX1BFUkZPUk1BTkNFLAotCQkgIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJCQkJICBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCi0JCQlBQ1BJX1BST0NFU1NPUl9GSUxFX1BFUkZPUk1BTkNFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9QUk9DRVNTT1JfRklMRV9QRVJGT1JNQU5DRSkpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfcHJvY2Vzc29yX3BlcmZfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9wZXJmb3JtYW5jZTsKQEAgLTU0MSwxMSArNTI4LDkgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotc3RhdGljIHZvaWQKLWFjcGlfY3B1ZnJlcV9yZW1vdmVfZmlsZSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3N0YXRpYyB2b2lkIGFjcGlfY3B1ZnJlcV9yZW1vdmVfZmlsZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2NwdWZyZXFfYWRkZmlsZSIpOwogCkBAIC01NTQsMjEgKzUzOSwyNSBAQAogCiAJLyogcmVtb3ZlIGZpbGUgJ3BlcmZvcm1hbmNlJyAqLwogCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfUEVSRk9STUFOQ0UsCi0JCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAogI2Vsc2UKLXN0YXRpYyB2b2lkIGFjcGlfY3B1ZnJlcV9hZGRfZmlsZSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikgeyByZXR1cm47IH0KLXN0YXRpYyB2b2lkIGFjcGlfY3B1ZnJlcV9yZW1vdmVfZmlsZSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikgeyByZXR1cm47IH0KLSNlbmRpZiAvKiBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYgKi8KLQorc3RhdGljIHZvaWQgYWNwaV9jcHVmcmVxX2FkZF9maWxlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgYWNwaV9jcHVmcmVxX3JlbW92ZV9maWxlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJcmV0dXJuOworfQorI2VuZGlmCQkJCS8qIENPTkZJR19YODZfQUNQSV9DUFVGUkVRX1BST0NfSU5URiAqLwogCiBpbnQKLWFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKiBwZXJmb3JtYW5jZSwKLQl1bnNpZ25lZCBpbnQgY3B1KQorYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2Uoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCisJCQkJICAgICpwZXJmb3JtYW5jZSwgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOwogCkBAIC02MDMsMTMgKzU5MiwxMiBAQAogCXVwKCZwZXJmb3JtYW5jZV9zZW0pOwogCXJldHVybl9WQUxVRSgwKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSk7CiAKLQogdm9pZAotYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICogcGVyZm9ybWFuY2UsCi0JdW5zaWduZWQgaW50IGNwdSkKK2FjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2Uoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCisJCQkJICAgICAgKnBlcmZvcm1hbmNlLCB1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CiAKQEAgLTYzMiw0ICs2MjAsNSBAQAogCiAJcmV0dXJuX1ZPSUQ7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCmluZGV4IDEyYmQ5ODAuLjM3NTI4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCkBAIC00MywyMCArNDMsMTYgQEAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MgICAgICAgICAgICAicHJvY2Vzc29yIgogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSAgICAgICJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgICAgIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSAgICAgICAgICAgICAgICAoImFjcGlfcHJvY2Vzc29yIikKLQorQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9wcm9jZXNzb3IiKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGltaXQgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50Ci1hY3BpX3Byb2Nlc3Nvcl9hcHBseV9saW1pdCAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yKiAJcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2FwcGx5X2xpbWl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQl1MTYJCQlweCA9IDA7Ci0JdTE2CQkJdHggPSAwOworCWludCByZXN1bHQgPSAwOworCXUxNiBweCA9IDA7CisJdTE2IHR4ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2FwcGx5X2xpbWl0Iik7CiAKQEAgLTgwLDE5ICs3NiwxNyBAQAogCXByLT5saW1pdC5zdGF0ZS5weCA9IHB4OwogCXByLT5saW1pdC5zdGF0ZS50eCA9IHR4OwogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUHJvY2Vzc29yIFslZF0gbGltaXQgc2V0IHRvIChQJWQ6VCVkKVxuIiwKLQkJcHItPmlkLAotCQlwci0+bGltaXQuc3RhdGUucHgsCi0JCXByLT5saW1pdC5zdGF0ZS50eCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIlByb2Nlc3NvciBbJWRdIGxpbWl0IHNldCB0byAoUCVkOlQlZClcbiIsIHByLT5pZCwKKwkJCSAgcHItPmxpbWl0LnN0YXRlLnB4LCBwci0+bGltaXQuc3RhdGUudHgpKTsKIAotZW5kOgorICAgICAgZW5kOgogCWlmIChyZXN1bHQpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmFibGUgdG8gc2V0IGxpbWl0XG4iKSk7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiAKIC8qIElmIGEgcGFzc2l2ZSBjb29saW5nIHNpdHVhdGlvbiBpcyBkZXRlY3RlZCwgcHJpbWFyaWx5IENQVWZyZXEgaXMgdXNlZCwgYXMgaXQKQEAgLTEwNCw3ICs5OCw2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1tOUl9DUFVTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWNwaV90aGVybWFsX2NwdWZyZXFfaXNfaW5pdCA9IDA7CiAKLQogc3RhdGljIGludCBjcHVfaGFzX2NwdWZyZXEodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgcG9saWN5OwpAQCAtMTE1LDcgKzEwOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbmNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWlmICghY3B1X2hhc19jcHVmcmVxKGNwdSkpCkBAIC0xMzAsNyArMTIyLDYgQEAKIAlyZXR1cm4gLUVSQU5HRTsKIH0KIAotCiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9jcHVmcmVxX2RlY3JlYXNlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaWYgKCFjcHVfaGFzX2NwdWZyZXEoY3B1KSkKQEAgLTE0NSwxMSArMTM2LDggQEAKIAlyZXR1cm4gLUVSQU5HRTsKIH0KIAotCi1zdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyKAotCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JdW5zaWduZWQgbG9uZyBldmVudCwKLQl2b2lkICpkYXRhKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCQkgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IGRhdGE7CiAJdW5zaWduZWQgbG9uZyBtYXhfZnJlcSA9IDA7CkBAIC0xNTcsNjggKzE0NSw3NCBAQAogCWlmIChldmVudCAhPSBDUFVGUkVRX0FESlVTVCkKIAkJZ290byBvdXQ7CiAKLQltYXhfZnJlcSA9IChwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgKiAoMTAwIC0gY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW3BvbGljeS0+Y3B1XSkpIC8gMTAwOworCW1heF9mcmVxID0KKwkgICAgKHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSAqCisJICAgICAoMTAwIC0gY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW3BvbGljeS0+Y3B1XSkpIC8gMTAwOwogCiAJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIDAsIG1heF9mcmVxKTsKIAotIG91dDoKKyAgICAgIG91dDoKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrID0gewogCS5ub3RpZmllcl9jYWxsID0gYWNwaV90aGVybWFsX2NwdWZyZXFfbm90aWZpZXIsCiB9OwogCi0KLXZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5pdCh2b2lkKSB7Cit2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2luaXQodm9pZCkKK3sKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpPE5SX0NQVVM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQogCQljcHVmcmVxX3RoZXJtYWxfcmVkdWN0aW9uX3BjdGdbaV0gPSAwOwogCi0JaSA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJmFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLCBDUFVGUkVRX1BPTElDWV9OT1RJRklFUik7CisJaSA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJmFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAorCQkJCSAgICAgIENQVUZSRVFfUE9MSUNZX05PVElGSUVSKTsKIAlpZiAoIWkpCiAJCWFjcGlfdGhlcm1hbF9jcHVmcmVxX2lzX2luaXQgPSAxOwogfQogCi12b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2V4aXQodm9pZCkgewordm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KHZvaWQpCit7CiAJaWYgKGFjcGlfdGhlcm1hbF9jcHVmcmVxX2lzX2luaXQpCi0JCWNwdWZyZXFfdW5yZWdpc3Rlcl9ub3RpZmllcigmYWNwaV90aGVybWFsX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssIENQVUZSRVFfUE9MSUNZX05PVElGSUVSKTsKKwkJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyCisJCSAgICAoJmFjcGlfdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAorCQkgICAgIENQVUZSRVFfUE9MSUNZX05PVElGSUVSKTsKIAogCWFjcGlfdGhlcm1hbF9jcHVmcmVxX2lzX2luaXQgPSAwOwogfQogCi0jZWxzZSAvKiAhIENPTkZJR19DUFVfRlJFUSAqLworI2Vsc2UJCQkJLyogISBDT05GSUdfQ1BVX0ZSRVEgKi8KIAotc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbmNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9jcHVmcmVxX2RlY3JlYXNlKHVuc2lnbmVkIGludCBjcHUpIHsgcmV0dXJuIC1FTk9ERVY7IH0KLQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbmNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAtRU5PREVWOworfQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9kZWNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAtRU5PREVWOworfQogCiAjZW5kaWYKIAotCi1pbnQKLWFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWludAkJCXR5cGUpCitpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3RoZXJtYWxfbGltaXQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKLQlpbnQJCQl0eCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCWludCB0eCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdCIpOwogCiAJaWYgKCh0eXBlIDwgQUNQSV9QUk9DRVNTT1JfTElNSVRfTk9ORSkKLQkJfHwgKHR5cGUgPiBBQ1BJX1BST0NFU1NPUl9MSU1JVF9ERUNSRU1FTlQpKQorCSAgICB8fCAodHlwZSA+IEFDUElfUFJPQ0VTU09SX0xJTUlUX0RFQ1JFTUVOVCkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAogCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIAotCXByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWlmICghcHIpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIApAQCAtMjUwLDEyICsyNDQsMTIgQEAKIAkJCWdvdG8gZW5kOwogCQllbHNlIGlmIChyZXN1bHQgPT0gLUVSQU5HRSkKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJIkF0IG1heGltdW0gcGVyZm9ybWFuY2Ugc3RhdGVcbiIpKTsKKwkJCQkJICAiQXQgbWF4aW11bSBwZXJmb3JtYW5jZSBzdGF0ZVxuIikpOwogCiAJCWlmIChwci0+ZmxhZ3MudGhyb3R0bGluZykgewogCQkJaWYgKHR4ID09IChwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCAtIDEpKQogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJIkF0IG1heGltdW0gdGhyb3R0bGluZyBzdGF0ZVxuIikpOworCQkJCQkJICAiQXQgbWF4aW11bSB0aHJvdHRsaW5nIHN0YXRlXG4iKSk7CiAJCQllbHNlCiAJCQkJdHgrKzsKIAkJfQpAQCAtMjY3LDcgKzI2MSw3IEBACiAJCWlmIChwci0+ZmxhZ3MudGhyb3R0bGluZykgewogCQkJaWYgKHR4ID09IDApCiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkiQXQgbWluaW11bSB0aHJvdHRsaW5nIHN0YXRlXG4iKSk7CisJCQkJCQkgICJBdCBtaW5pbXVtIHRocm90dGxpbmcgc3RhdGVcbiIpKTsKIAkJCWVsc2UgewogCQkJCXR4LS07CiAJCQkJZ290byBlbmQ7CkBAIC0yNzcsMTIgKzI3MSwxMiBAQAogCQlyZXN1bHQgPSBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9kZWNyZWFzZShwci0+aWQpOwogCQlpZiAocmVzdWx0ID09IC1FUkFOR0UpCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSJBdCBtaW5pbXVtIHBlcmZvcm1hbmNlIHN0YXRlXG4iKSk7CisJCQkJCSAgIkF0IG1pbmltdW0gcGVyZm9ybWFuY2Ugc3RhdGVcbiIpKTsKIAogCQlicmVhazsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocHItPmZsYWdzLnRocm90dGxpbmcpIHsKIAkJcHItPmxpbWl0LnRoZXJtYWwucHggPSAwOwogCQlwci0+bGltaXQudGhlcm1hbC50eCA9IHR4OwpAQCAtMjkzLDE4ICsyODcsMTQgQEAKIAkJCQkJICAiVW5hYmxlIHRvIHNldCB0aGVybWFsIGxpbWl0XG4iKSk7CiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiVGhlcm1hbCBsaW1pdCBub3cgKFAlZDpUJWQpXG4iLAotCQkJCSAgcHItPmxpbWl0LnRoZXJtYWwucHgsCi0JCQkJICBwci0+bGltaXQudGhlcm1hbC50eCkpOworCQkJCSAgcHItPmxpbWl0LnRoZXJtYWwucHgsIHByLT5saW1pdC50aGVybWFsLnR4KSk7CiAJfSBlbHNlCiAJCXJlc3VsdCA9IDA7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1pbnQKLWFjcGlfcHJvY2Vzc29yX2dldF9saW1pdF9pbmZvICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQoraW50IGFjcGlfcHJvY2Vzc29yX2dldF9saW1pdF9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X2xpbWl0X2luZm8iKTsKIApAQCAtMzE3LDEyICszMDcsMTEgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogLyogL3Byb2MgaW50ZXJmYWNlICovCiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfbGltaXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2xpbWl0X3NlcV9zaG93Iik7CiAKQEAgLTMzNSwzNCArMzI0LDMyIEBACiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJhY3RpdmUgbGltaXQ6ICAgICAgICAgICAgUCVkOlQlZFxuIgotCQkJInVzZXIgbGltaXQ6ICAgICAgICAgICAgICBQJWQ6VCVkXG4iCi0JCQkidGhlcm1hbCBsaW1pdDogICAgICAgICAgIFAlZDpUJWRcbiIsCi0JCQlwci0+bGltaXQuc3RhdGUucHgsIHByLT5saW1pdC5zdGF0ZS50eCwKLQkJCXByLT5saW1pdC51c2VyLnB4LCBwci0+bGltaXQudXNlci50eCwKLQkJCXByLT5saW1pdC50aGVybWFsLnB4LCBwci0+bGltaXQudGhlcm1hbC50eCk7CisJCSAgICJ1c2VyIGxpbWl0OiAgICAgICAgICAgICAgUCVkOlQlZFxuIgorCQkgICAidGhlcm1hbCBsaW1pdDogICAgICAgICAgIFAlZDpUJWRcbiIsCisJCSAgIHByLT5saW1pdC5zdGF0ZS5weCwgcHItPmxpbWl0LnN0YXRlLnR4LAorCQkgICBwci0+bGltaXQudXNlci5weCwgcHItPmxpbWl0LnVzZXIudHgsCisJCSAgIHByLT5saW1pdC50aGVybWFsLnB4LCBwci0+bGltaXQudGhlcm1hbC50eCk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfbGltaXRfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9wcm9jZXNzb3JfbGltaXRfc2VxX3Nob3csCi0JCQkJCQlQREUoaW5vZGUpLT5kYXRhKTsKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zc2l6ZV90IGFjcGlfcHJvY2Vzc29yX3dyaXRlX2xpbWl0ICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY29uc3QgY2hhcgkJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKmRhdGEpCitzc2l6ZV90IGFjcGlfcHJvY2Vzc29yX3dyaXRlX2xpbWl0KHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLSAgICAgICAgc3RydWN0IHNlcV9maWxlIAkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKiltLT5wcml2YXRlOwotCWNoYXIJCQlsaW1pdF9zdHJpbmdbMjVdID0geydcMCd9OwotCWludAkJCXB4ID0gMDsKLQlpbnQJCQl0eCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKW0tPnByaXZhdGU7CisJY2hhciBsaW1pdF9zdHJpbmdbMjVdID0geyAnXDAnIH07CisJaW50IHB4ID0gMDsKKwlpbnQgdHggPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3Jfd3JpdGVfbGltaXQiKTsKIApAQCAtMzk2LDExICszODMsOSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLQogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl9saW1pdF9mb3BzID0gewotCS5vcGVuIAkJPSBhY3BpX3Byb2Nlc3Nvcl9saW1pdF9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3Byb2Nlc3Nvcl9saW1pdF9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwppbmRleCBiZTlmNTY5Li43NGE1MmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwpAQCAtNDMsMjEgKzQzLDE3IEBACiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTICAgICAgICAgICAgInByb2Nlc3NvciIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUgICAgICAiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUgICAgICAgICAgICAgICAgKCJhY3BpX3Byb2Nlc3NvciIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm90dGxpbmcgQ29udHJvbAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmcgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7Ci0JaW50CQkJc3RhdGUgPSAwOwotCXUzMgkJCXZhbHVlID0gMDsKLQl1MzIJCQlkdXR5X21hc2sgPSAwOwotCXUzMgkJCWR1dHlfdmFsdWUgPSAwOworCWludCBzdGF0ZSA9IDA7CisJdTMyIHZhbHVlID0gMDsKKwl1MzIgZHV0eV9tYXNrID0gMDsKKwl1MzIgZHV0eV92YWx1ZSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyIpOwogCkBAIC04Niw3ICs4Miw3IEBACiAJCWR1dHlfdmFsdWUgPj49IHByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0OwogCiAJCWlmIChkdXR5X3ZhbHVlKQotCQkJc3RhdGUgPSBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudC1kdXR5X3ZhbHVlOworCQkJc3RhdGUgPSBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCAtIGR1dHlfdmFsdWU7CiAJfQogCiAJcHItPnRocm90dGxpbmcuc3RhdGUgPSBzdGF0ZTsKQEAgLTk0LDIwICs5MCwxNyBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJIlRocm90dGxpbmcgc3RhdGUgaXMgVCVkICglZCUlIHRocm90dGxpbmcgYXBwbGllZClcbiIsCi0JCXN0YXRlLCBwci0+dGhyb3R0bGluZy5zdGF0ZXNbc3RhdGVdLnBlcmZvcm1hbmNlKSk7CisJCQkgICJUaHJvdHRsaW5nIHN0YXRlIGlzIFQlZCAoJWQlJSB0aHJvdHRsaW5nIGFwcGxpZWQpXG4iLAorCQkJICBzdGF0ZSwgcHItPnRocm90dGxpbmcuc3RhdGVzW3N0YXRlXS5wZXJmb3JtYW5jZSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLWludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyAoCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yCSpwciwKLQlpbnQJCQlzdGF0ZSkKK2ludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIGR1dHlfbWFzayA9IDA7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgZHV0eV92YWx1ZSA9IDA7CisJdTMyIHZhbHVlID0gMDsKKwl1MzIgZHV0eV9tYXNrID0gMDsKKwl1MzIgZHV0eV92YWx1ZSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyIpOwogCkBAIC0xNjgsMjggKzE2MSwyNiBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJIlRocm90dGxpbmcgc3RhdGUgc2V0IHRvIFQlZCAoJWQlJSlcbiIsIHN0YXRlLAotCQkocHItPnRocm90dGxpbmcuc3RhdGVzW3N0YXRlXS5wZXJmb3JtYW5jZT9wci0+dGhyb3R0bGluZy5zdGF0ZXNbc3RhdGVdLnBlcmZvcm1hbmNlLzEwOjApKSk7CisJCQkgICJUaHJvdHRsaW5nIHN0YXRlIHNldCB0byBUJWQgKCVkJSUpXG4iLCBzdGF0ZSwKKwkJCSAgKHByLT50aHJvdHRsaW5nLnN0YXRlc1tzdGF0ZV0ucGVyZm9ybWFuY2UgPyBwci0+CisJCQkgICB0aHJvdHRsaW5nLnN0YXRlc1tzdGF0ZV0ucGVyZm9ybWFuY2UgLyAxMCA6IDApKSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotaW50Ci1hY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19pbmZvICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByKQoraW50IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nX2luZm8oc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWludAkJCXN0ZXAgPSAwOwotCWludAkJCWkgPSAwOworCWludCByZXN1bHQgPSAwOworCWludCBzdGVwID0gMDsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19pbmZvIik7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCSJwYmxrX2FkZHJlc3NbMHglMDh4XSBkdXR5X29mZnNldFslZF0gZHV0eV93aWR0aFslZF1cbiIsCi0JCXByLT50aHJvdHRsaW5nLmFkZHJlc3MsCi0JCXByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0LAotCQlwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoKSk7CisJCQkgICJwYmxrX2FkZHJlc3NbMHglMDh4XSBkdXR5X29mZnNldFslZF0gZHV0eV93aWR0aFslZF1cbiIsCisJCQkgIHByLT50aHJvdHRsaW5nLmFkZHJlc3MsCisJCQkgIHByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0LAorCQkJICBwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoKSk7CiAKIAlpZiAoIXByKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CkBAIC0xOTksMTQgKzE5MCwxMiBAQAogCWlmICghcHItPnRocm90dGxpbmcuYWRkcmVzcykgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyB0aHJvdHRsaW5nIHJlZ2lzdGVyXG4iKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKLQl9Ci0JZWxzZSBpZiAoIXByLT50aHJvdHRsaW5nLmR1dHlfd2lkdGgpIHsKKwl9IGVsc2UgaWYgKCFwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vIHRocm90dGxpbmcgc3RhdGVzXG4iKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAJLyogVEJEOiBTdXBwb3J0IGR1dHlfY3ljbGUgdmFsdWVzIHRoYXQgc3BhbiBiaXQgNC4gKi8KLQllbHNlIGlmICgocHItPnRocm90dGxpbmcuZHV0eV9vZmZzZXQKLQkJKyBwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoKSA+IDQpIHsKKwllbHNlIGlmICgocHItPnRocm90dGxpbmcuZHV0eV9vZmZzZXQgKyBwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoKSA+IDQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiZHV0eV9jeWNsZSBzcGFucyBiaXQgNFxuIikpOwogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQpAQCAtMjE4LDcgKzIwNyw3IEBACiAJICovCiAJaWYgKGVycmF0YS5waWl4NC50aHJvdHRsZSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVGhyb3R0bGluZyBub3Qgc3VwcG9ydGVkIG9uIFBJSVg0IEEtIG9yIEItc3RlcFxuIikpOworCQkJCSAgIlRocm90dGxpbmcgbm90IHN1cHBvcnRlZCBvbiBQSUlYNCBBLSBvciBCLXN0ZXBcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKDApOwogCX0KIApAQCAtMjMyLDEzICsyMjEsMTMgQEAKIAogCXN0ZXAgPSAoMTAwMCAvIHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50KTsKIAotCWZvciAoaT0wOyBpPHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQ7IGkrKykgewogCQlwci0+dGhyb3R0bGluZy5zdGF0ZXNbaV0ucGVyZm9ybWFuY2UgPSBzdGVwICogaTsKIAkJcHItPnRocm90dGxpbmcuc3RhdGVzW2ldLnBvd2VyID0gc3RlcCAqIGk7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgJWQgdGhyb3R0bGluZyBzdGF0ZXNcbiIsCi0JCXByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50KSk7CisJCQkgIHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50KSk7CiAKIAlwci0+ZmxhZ3MudGhyb3R0bGluZyA9IDE7CiAKQEAgLTI1MywyOCArMjQyLDI5IEBACiAJCWdvdG8gZW5kOwogCiAJaWYgKHByLT50aHJvdHRsaW5nLnN0YXRlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRpc2FibGluZyB0aHJvdHRsaW5nICh3YXMgVCVkKVxuIiwKLQkJCXByLT50aHJvdHRsaW5nLnN0YXRlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJEaXNhYmxpbmcgdGhyb3R0bGluZyAod2FzIFQlZClcbiIsCisJCQkJICBwci0+dGhyb3R0bGluZy5zdGF0ZSkpOwogCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhwciwgMCk7CiAJCWlmIChyZXN1bHQpCiAJCQlnb3RvIGVuZDsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KQogCQlwci0+ZmxhZ3MudGhyb3R0bGluZyA9IDA7CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCiAvKiBwcm9jIGludGVyZmFjZSAqLwogCi1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkJICAgICAgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopc2VxLT5wcml2YXRlOwotCWludAkJCWkgPSAwOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKilzZXEtPnByaXZhdGU7CisJaW50IGkgPSAwOworCWludCByZXN1bHQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19zZXFfc2hvdyIpOwogCkBAIC0yODksNDEgKzI3OSw0MSBAQAogCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nKHByKTsKIAogCWlmIChyZXN1bHQpIHsKLQkJc2VxX3B1dHMoc2VxLCAiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IHRocm90dGxpbmcgc3RhdGUuXG4iKTsKKwkJc2VxX3B1dHMoc2VxLAorCQkJICJDb3VsZCBub3QgZGV0ZXJtaW5lIGN1cnJlbnQgdGhyb3R0bGluZyBzdGF0ZS5cbiIpOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlzZXFfcHJpbnRmKHNlcSwgInN0YXRlIGNvdW50OiAgICAgICAgICAgICAlZFxuIgotCQkJImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBUJWRcbiIsCi0JCQlwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCwKLQkJCXByLT50aHJvdHRsaW5nLnN0YXRlKTsKKwkJICAgImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBUJWRcbiIsCisJCSAgIHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50LCBwci0+dGhyb3R0bGluZy5zdGF0ZSk7CiAKIAlzZXFfcHV0cyhzZXEsICJzdGF0ZXM6XG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQ7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgICAlY1QlZDogICAgICAgICAgICAgICAgICAlMDJkJSVcbiIsCi0JCQkoaSA9PSBwci0+dGhyb3R0bGluZy5zdGF0ZT8nKic6JyAnKSwgaSwKLQkJCShwci0+dGhyb3R0bGluZy5zdGF0ZXNbaV0ucGVyZm9ybWFuY2U/cHItPnRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlLzEwOjApKTsKKwkJCSAgIChpID09IHByLT50aHJvdHRsaW5nLnN0YXRlID8gJyonIDogJyAnKSwgaSwKKwkJCSAgIChwci0+dGhyb3R0bGluZy5zdGF0ZXNbaV0ucGVyZm9ybWFuY2UgPyBwci0+CisJCQkgICAgdGhyb3R0bGluZy5zdGF0ZXNbaV0ucGVyZm9ybWFuY2UgLyAxMCA6IDApKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX3NlcV9zaG93LAotCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nICgKLSAgICAgICAgc3RydWN0IGZpbGUJCSpmaWxlLAotICAgICAgICBjb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLSAgICAgICAgc2l6ZV90CQkJY291bnQsCi0gICAgICAgIGxvZmZfdAkJCSpkYXRhKQorc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nKHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotICAgICAgICBzdHJ1Y3Qgc2VxX2ZpbGUgCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKW0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0YXRlX3N0cmluZ1sxMl0gPSB7J1wwJ307CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqKW0tPnByaXZhdGU7CisJY2hhciBzdGF0ZV9zdHJpbmdbMTJdID0geyAnXDAnIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nIik7CiAKQEAgLTMzNiw3ICszMjYsOCBAQAogCXN0YXRlX3N0cmluZ1tjb3VudF0gPSAnXDAnOwogCiAJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcocHIsCi0JCXNpbXBsZV9zdHJ0b3VsKHN0YXRlX3N0cmluZywgTlVMTCwgMCkpOworCQkJCQkgICAgICAgc2ltcGxlX3N0cnRvdWwoc3RhdGVfc3RyaW5nLAorCQkJCQkJCSAgICAgIE5VTEwsIDApKTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIApAQCAtMzQ0LDggKzMzNSw4IEBACiB9CiAKIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19mb3BzID0gewotCS5vcGVuIAkJPSBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYwppbmRleCA1NWQyNjQ3Li4yM2I1NGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKQEAgLTQxLDEzICs0MSwxODUgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc2FkZHIiKQorQUNQSV9NT0RVTEVfTkFNRSgicnNhZGRyIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQKK2FjcGlfcnNfZGVjb2RlX2dlbmVyYWxfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSwgdTggZmxhZ3MpOworCitzdGF0aWMgdTggYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZGVjb2RlX3NwZWNpZmljX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UsIHU4IGZsYWdzKTsKKworc3RhdGljIHU4IGFjcGlfcnNfZW5jb2RlX3NwZWNpZmljX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBBZGRyZXNzIHJlc291cmNlIGRhdGEgc3RydWN0CisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEFjdHVhbCBmbGFnIGJ5dGUKKyAqCisgKiBSRVRVUk46ICAgICAgRGVjb2RlZCBmbGFnIGJpdHMgaW4gcmVzb3VyY2Ugc3RydWN0CisgKgorICogREVTQ1JJUFRJT046IERlY29kZSBhIGdlbmVyYWwgZmxhZyBieXRlIHRvIGFuIGFkZHJlc3MgcmVzb3VyY2Ugc3RydWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZGVjb2RlX2dlbmVyYWxfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSwgdTggZmxhZ3MpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogUHJvZHVjZXIgLyBDb25zdW1lciAtIGZsYWcgYml0WzBdICovCisKKwlyZXNvdXJjZS0+YWRkcmVzcy5wcm9kdWNlcl9jb25zdW1lciA9ICh1MzIpIChmbGFncyAmIDB4MDEpOworCisJLyogRGVjb2RlIChfREVDKSAtIGZsYWcgYml0WzFdICovCisKKwlyZXNvdXJjZS0+YWRkcmVzcy5kZWNvZGUgPSAodTMyKSAoKGZsYWdzID4+IDEpICYgMHgwMSk7CisKKwkvKiBNaW4gQWRkcmVzcyBGaXhlZCAoX01JRikgLSBmbGFnIGJpdFsyXSAqLworCisJcmVzb3VyY2UtPmFkZHJlc3MubWluX2FkZHJlc3NfZml4ZWQgPSAodTMyKSAoKGZsYWdzID4+IDIpICYgMHgwMSk7CisKKwkvKiBNYXggQWRkcmVzcyBGaXhlZCAoX01BRikgLSBmbGFnIGJpdFszXSAqLworCisJcmVzb3VyY2UtPmFkZHJlc3MubWF4X2FkZHJlc3NfZml4ZWQgPSAodTMyKSAoKGZsYWdzID4+IDMpICYgMHgwMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZW5jb2RlX2dlbmVyYWxfZmxhZ3MKKyAqCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIEFkZHJlc3MgcmVzb3VyY2UgZGF0YSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46ICAgICAgRW5jb2RlZCBnZW5lcmFsIGZsYWcgYnl0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBDb25zdHJ1Y3QgYSBnZW5lcmFsIGZsYWcgYnl0ZSBmcm9tIGFuIGFkZHJlc3MgcmVzb3VyY2Ugc3RydWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4IGFjcGlfcnNfZW5jb2RlX2dlbmVyYWxfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSkKK3sKKwl1OCBmbGFnczsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIFByb2R1Y2VyIC8gQ29uc3VtZXIgLSBmbGFnIGJpdFswXSAqLworCisJZmxhZ3MgPSAodTgpIChyZXNvdXJjZS0+YWRkcmVzcy5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOworCisJLyogRGVjb2RlIChfREVDKSAtIGZsYWcgYml0WzFdICovCisKKwlmbGFncyB8PSAodTgpICgocmVzb3VyY2UtPmFkZHJlc3MuZGVjb2RlICYgMHgwMSkgPDwgMSk7CisKKwkvKiBNaW4gQWRkcmVzcyBGaXhlZCAoX01JRikgLSBmbGFnIGJpdFsyXSAqLworCisJZmxhZ3MgfD0gKHU4KSAoKHJlc291cmNlLT5hZGRyZXNzLm1pbl9hZGRyZXNzX2ZpeGVkICYgMHgwMSkgPDwgMik7CisKKwkvKiBNYXggQWRkcmVzcyBGaXhlZCAoX01BRikgLSBmbGFnIGJpdFszXSAqLworCisJZmxhZ3MgfD0gKHU4KSAoKHJlc291cmNlLT5hZGRyZXNzLm1heF9hZGRyZXNzX2ZpeGVkICYgMHgwMSkgPDwgMyk7CisKKwlyZXR1cm4gKGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19kZWNvZGVfc3BlY2lmaWNfZmxhZ3MKKyAqCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIEFkZHJlc3MgcmVzb3VyY2UgZGF0YSBzdHJ1Y3QKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gQWN0dWFsIGZsYWcgYnl0ZQorICoKKyAqIFJFVFVSTjogICAgICBEZWNvZGVkIGZsYWcgYml0cyBpbiBhdHRyaWJ1dGUgc3RydWN0CisgKgorICogREVTQ1JJUFRJT046IERlY29kZSBhIHR5cGUtc3BlY2lmaWMgZmxhZyBieXRlIHRvIGFuIGF0dHJpYnV0ZSBzdHJ1Y3QuCisgKiAgICAgICAgICAgICAgVHlwZS1zcGVjaWZpYyBmbGFncyBhcmUgb25seSBkZWZpbmVkIGZvciB0aGUgTWVtb3J5IGFuZCBJTworICogICAgICAgICAgICAgIHJlc291cmNlIHR5cGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlLCB1OCBmbGFncykKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAocmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgeworCQkvKiBXcml0ZSBTdGF0dXMgKF9SVykgLSBmbGFnIGJpdFswXSAqLworCisJCXJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPQorCQkgICAgKHUxNikgKGZsYWdzICYgMHgwMSk7CisKKwkJLyogTWVtb3J5IEF0dHJpYnV0ZXMgKF9NRU0pIC0gZmxhZyBiaXRzWzI6MV0gKi8KKworCQlyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSA9CisJCSAgICAodTE2KSAoKGZsYWdzID4+IDEpICYgMHgwMyk7CisJfSBlbHNlIGlmIChyZXNvdXJjZS0+YWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfSU9fUkFOR0UpIHsKKwkJLyogUmFuZ2VzIChfUk5HKSAtIGZsYWcgYml0c1sxOjBdICovCisKKwkJcmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSA9CisJCSAgICAodTE2KSAoZmxhZ3MgJiAweDAzKTsKKworCQkvKiBUcmFuc2xhdGlvbnMgKF9UVFAgYW5kIF9UUlMpIC0gZmxhZyBiaXRzWzU6NF0gKi8KKworCQlyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID0KKwkJICAgICh1MTYpICgoZmxhZ3MgPj4gNCkgJiAweDAzKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZW5jb2RlX3NwZWNpZmljX2ZsYWdzCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBBZGRyZXNzIHJlc291cmNlIGRhdGEgc3RydWN0CisgKgorICogUkVUVVJOOiAgICAgIEVuY29kZWQgdHlwZS1zcGVjaWZpYyBmbGFnIGJ5dGUKKyAqCisgKiBERVNDUklQVElPTjogQ29uc3RydWN0IGEgdHlwZS1zcGVjaWZpYyBmbGFnIGJ5dGUgZnJvbSBhbiBhdHRyaWJ1dGUgc3RydWN0LgorICogICAgICAgICAgICAgIFR5cGUtc3BlY2lmaWMgZmxhZ3MgYXJlIG9ubHkgZGVmaW5lZCBmb3IgdGhlIE1lbW9yeSBhbmQgSU8KKyAqICAgICAgICAgICAgICByZXNvdXJjZSB0eXBlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTggYWNwaV9yc19lbmNvZGVfc3BlY2lmaWNfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSkKK3sKKwl1OCBmbGFncyA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAocmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgeworCQkvKiBXcml0ZSBTdGF0dXMgKF9SVykgLSBmbGFnIGJpdFswXSAqLworCisJCWZsYWdzID0gKHU4KQorCQkgICAgKHJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5tZW1vcnkuCisJCSAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGUgJiAweDAxKTsKKworCQkvKiBNZW1vcnkgQXR0cmlidXRlcyAoX01FTSkgLSBmbGFnIGJpdHNbMjoxXSAqLworCisJCWZsYWdzIHw9ICh1OCkKKwkJICAgICgocmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLm1lbW9yeS4KKwkJICAgICAgY2FjaGVfYXR0cmlidXRlICYgMHgwMykgPDwgMSk7CisJfSBlbHNlIGlmIChyZXNvdXJjZS0+YWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfSU9fUkFOR0UpIHsKKwkJLyogUmFuZ2VzIChfUk5HKSAtIGZsYWcgYml0c1sxOjBdICovCisKKwkJZmxhZ3MgPSAodTgpCisJCSAgICAocmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSAmIDB4MDMpOworCisJCS8qIFRyYW5zbGF0aW9ucyAoX1RUUCBhbmQgX1RSUykgLSBmbGFnIGJpdHNbNTo0XSAqLworCisJCWZsYWdzIHw9ICh1OCkKKwkJICAgICgocmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLmlvLgorCQkgICAgICB0cmFuc2xhdGlvbl9hdHRyaWJ1dGUgJiAweDAzKSA8PCA0KTsKKwl9CisKKwlyZXR1cm4gKGZsYWdzKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03MSwzNCArMjQzLDMwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMTZfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfYWRkcmVzczE2X3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpOworCXUzMiBpbmRleDsKKwl1MTYgdGVtcDE2OworCXU4IHRlbXA4OworCXU4ICp0ZW1wX3B0cjsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfYWRkcmVzczE2X3Jlc291cmNlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfYWRkcmVzczE2X3Jlc291cmNlIik7Ci0KLQotCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwkvKiBHZXQgdGhlIERlc2NyaXB0b3IgTGVuZ3RoIGZpZWxkICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkvKiBWYWxpZGF0ZSBtaW5pbXVtIGRlc2NyaXB0b3IgbGVuZ3RoICovCiAKIAlpZiAodGVtcDE2IDwgMTMpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CiAJfQogCiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKQEAgLTExMiw3ICsyODAsNyBAQAogCS8qIFZhbHVlcyAwLTIgYW5kIDB4QzAtMHhGRiBhcmUgdmFsaWQgKi8KIAogCWlmICgodGVtcDggPiAyKSAmJiAodGVtcDggPCAweEMwKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CiAJfQogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwpAQCAtMTIwLDczICsyODgsNDEgQEAKIAkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLwogCiAJYnVmZmVyICs9IDE7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0JLyogUHJvZHVjZXIgLyBDb25zdW1lciAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucHJvZHVjZXJfY29uc3VtZXIgPSB0ZW1wOCAmIDB4MDE7Ci0KLQkvKiBEZWNvZGUgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmRlY29kZSA9ICh0ZW1wOCA+PiAxKSAmIDB4MDE7Ci0KLQkvKiBNaW4gQWRkcmVzcyBGaXhlZCAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMikgJiAweDAxOwotCi0JLyogTWF4IEFkZHJlc3MgRml4ZWQgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKKwlhY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzKCZvdXRwdXRfc3RydWN0LT5kYXRhLCAqYnVmZmVyKTsKIAogCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCiAKIAlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQlpZiAoQUNQSV9NRU1PUllfUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSkgewotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID0KLQkJCQkodTE2KSAodGVtcDggJiAweDAxKTsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICgodGVtcDggPj4gMSkgJiAweDAzKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChBQ1BJX0lPX1JBTkdFID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUpIHsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICh0ZW1wOCAmIDB4MDMpOwotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuYXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA9Ci0JCQkJKHUxNikgKCh0ZW1wOCA+PiA0KSAmIDB4MDMpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogQlVTX05VTUJFUl9SQU5HRSA9PSBBZGRyZXNzMTYuRGF0YS0+cmVzb3VyY2VfdHlwZSAqLwotCQkJLyogTm90aGluZyBuZWVkcyB0byBiZSBmaWxsZWQgaW4gKi8KLQkJfQotCX0KKwlhY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncygmb3V0cHV0X3N0cnVjdC0+ZGF0YSwgKmJ1ZmZlcik7CiAKIAkvKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtNykgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmdyYW51bGFyaXR5LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7CiAKIAkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDgtOSkgKi8KIAogCWJ1ZmZlciArPSAyOwotCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfcmFuZ2UsCisJCQkgICBidWZmZXIpOwogCiAJLyogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAxMC0xMSkgKi8KIAogCWJ1ZmZlciArPSAyOwotCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfcmFuZ2UsCisJCQkgICBidWZmZXIpOwogCiAJLyogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAxMi0xMykgKi8KIAogCWJ1ZmZlciArPSAyOwotCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LAotCQlidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYuCisJCQkgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKIAogCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMTQtMTUpICovCiAKIAlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkgKi8KIApAQCAtMjA1LDggKzM0MSw4IEBACiAJaWYgKCpieXRlc19jb25zdW1lZCA+ICgxNiArIDEpKSB7CiAJCS8qIERlcmVmZXJlbmNlIHRoZSBJbmRleCAqLwogCi0JCXRlbXA4ID0gKmJ1ZmZlcjsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gKHUzMikgdGVtcDg7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5pbmRleCA9CisJCSAgICAodTMyKSAqIGJ1ZmZlcjsKIAogCQkvKiBQb2ludCB0byB0aGUgU3RyaW5nICovCiAKQEAgLTIxNSwyOCArMzUxLDI3IEBACiAJCS8qIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlICovCiAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQotCQkJCShjaGFyICopKCh1OCAqIClvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOworCQkgICAgKGNoYXIgKikoKHU4ICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKIAkJdGVtcF9wdHIgPSAodTggKikKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQkgICAgb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKLQkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLworCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCiAJCWluZGV4ID0gMDsKLQotCQl3aGlsZSAoMHgwMCAhPSAqYnVmZmVyKSB7CisJCXdoaWxlICgqYnVmZmVyKSB7CiAJCQkqdGVtcF9wdHIgPSAqYnVmZmVyOwogCi0JCQl0ZW1wX3B0ciArPSAxOwotCQkJYnVmZmVyICs9IDE7Ci0JCQlpbmRleCArPSAxOworCQkJdGVtcF9wdHIrKzsKKwkJCWJ1ZmZlcisrOworCQkJaW5kZXgrKzsKIAkJfQogCi0JCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLworCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgYW5kIHNldCB0aGUgc3RyaW5nIGxlbmd0aCAqLwogCi0JCSp0ZW1wX3B0ciA9IDB4MDA7Ci0KLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSBpbmRleCArIDE7CisJCSp0ZW1wX3B0ciA9IDA7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0KKwkJICAgIGluZGV4ICsgMTsKIAogCQkvKgogCQkgKiBJbiBvcmRlciBmb3IgdGhlIHN0cnVjdF9zaXplIHRvIGZhbGwgb24gYSAzMi1iaXQgYm91bmRhcnksCkBAIC0yNDQsMTAgKzM3OSw5IEBACiAJCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KIAkJICovCiAJCXRlbXA4ID0gKHU4KSAoaW5kZXggKyAxKTsKLQkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7Ci0JfQotCWVsc2UgewotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAweDAwOworCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOworCX0gZWxzZSB7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5pbmRleCA9IDA7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gMDsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOwogCX0KQEAgLTI1OSwxMCArMzkzLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3MxNl9zdHJlYW0KQEAgLTI4MCwyNCArNDEzLDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMTZfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfYWRkcmVzczE2X3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX2ZpZWxkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wb2ludGVyID0gTlVMTDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9ieXRlczsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTggKmxlbmd0aF9maWVsZDsKKwlhY3BpX3NpemUgYWN0dWFsX2J5dGVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfYWRkcmVzczE2X3N0cmVhbSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3MxNl9zdHJlYW0iKTsKKwkvKiBTZXQgdGhlIERlc2NyaXB0b3IgVHlwZSBmaWVsZCAqLwogCi0KLQkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KLQotCSpidWZmZXIgPSAweDg4OworCSpidWZmZXIgPSBBQ1BJX1JERVNDX1RZUEVfV09SRF9BRERSRVNTX1NQQUNFOwogCWJ1ZmZlciArPSAxOwogCiAJLyogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLwpAQCAtMzA3LDk4ICs0MzQsNzQgQEAKIAogCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUgJiAweDAzKTsKLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlICYgMHgwMyk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7Ci0KLQl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmRlY29kZSAmIDB4MDEpIDw8IDE7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5taW5fYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDI7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDM7Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9IGFjcGlfcnNfZW5jb2RlX2dlbmVyYWxfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncyAqLwogCi0JdGVtcDggPSAwOwotCi0JaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlKSB7Ci0JCXRlbXA4ID0gKHU4KQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlICYKLQkJCSAweDAxKTsKLQotCQl0ZW1wOCB8PQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMykgPDwgMTsKLQl9Ci0JZWxzZSBpZiAoQUNQSV9JT19SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSkgewotCQl0ZW1wOCA9ICh1OCkKLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMyk7Ci0JCXRlbXA4IHw9Ci0JCQkobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgJgotCQkJIDB4MDMpIDw8IDQ7Ci0JfQotCi0JKmJ1ZmZlciA9IHRlbXA4OworCSpidWZmZXIgPSBhY3BpX3JzX2VuY29kZV9zcGVjaWZpY19mbGFncygmbGlua2VkX2xpc3QtPmRhdGEpOwogCWJ1ZmZlciArPSAxOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5ICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSk7CisJQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSk7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfcmFuZ2UpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19yYW5nZSk7CisJQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWF4X2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsCi0JCSZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LgorCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgpOworCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCiAKLQlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0KLQkJKmJ1ZmZlciA9IHRlbXA4OworCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKKwkJKmJ1ZmZlciA9CisJCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAJCWJ1ZmZlciArPSAxOwogCi0JCXRlbXBfcG9pbnRlciA9IChjaGFyICopIGJ1ZmZlcjsKKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyAqLwogCi0JCS8qIENvcHkgdGhlIHN0cmluZyAqLwotCi0JCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCi0JCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJQUNQSV9TVFJDUFkoKGNoYXIgKilidWZmZXIsCisJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfcHRyKTsKIAogCQkvKgotCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0aW5nICsgb25lIGZvciB0aGUKKwkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKyBvbmUgZm9yIHRoZQogCQkgKiB0ZXJtaW5hdGluZyBudWxsCiAJCSAqLwotCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkoQUNQSV9TVFJMRU4gKAotCQkJCSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CisJCWJ1ZmZlciArPQorCQkgICAgKGFjcGlfc2l6ZSkgKEFDUElfU1RSTEVOCisJCQkJIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLgorCQkJCSAgc3RyaW5nX3B0cikgKyAxKTsKIAl9CiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JYWN0dWFsX2J5dGVzID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJYWN0dWFsX2J5dGVzID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAkqYnl0ZXNfY29uc3VtZWQgPSBhY3R1YWxfYnl0ZXM7CiAKIAkvKgpAQCAtNDA2LDExICs1MDksMTAgQEAKIAkgKiBtaW51cyB0aGUgaGVhZGVyIHNpemUgKDMgYnl0ZXMpCiAJICovCiAJYWN0dWFsX2J5dGVzIC09IDM7Ci0JQUNQSV9NT1ZFX1NJWkVfVE9fMTYgKGxlbmd0aF9maWVsZCwgJmFjdHVhbF9ieXRlcyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJQUNQSV9NT1ZFX1NJWkVfVE9fMTYobGVuZ3RoX2ZpZWxkLCAmYWN0dWFsX2J5dGVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlCkBAIC00MzMsMzYgKzUzNSwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2FkZHJlc3MzMl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3Q9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCXUxNiB0ZW1wMTY7CisJdTggdGVtcDg7CisJdTggKnRlbXBfcHRyOworCXUzMiBpbmRleDsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfYWRkcmVzczMyX3Jlc291cmNlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfYWRkcmVzczMyX3Jlc291cmNlIik7Ci0KLQotCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIpOwotCi0JLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCS8qIEdldCB0aGUgRGVzY3JpcHRvciBMZW5ndGggZmllbGQgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCS8qIFZhbGlkYXRlIG1pbmltdW0gZGVzY3JpcHRvciBsZW5ndGggKi8KIAogCWlmICh0ZW1wMTYgPCAyMykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKIAl9CiAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwpAQCAtNDc2LDcgKzU3Miw3IEBACiAJLyogVmFsdWVzIDAtMiBhbmQgMHhDMC0weEZGIGFyZSB2YWxpZCAqLwogCiAJaWYgKCh0ZW1wOCA+IDIpICYmICh0ZW1wOCA8IDB4QzApKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKIAl9CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlID0gdGVtcDg7CkBAIC00ODQsNzQgKzU4MCw0MSBAQAogCS8qIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpICovCiAKIAlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkvKiBQcm9kdWNlciAvIENvbnN1bWVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5wcm9kdWNlcl9jb25zdW1lciA9IHRlbXA4ICYgMHgwMTsKLQotCS8qIERlY29kZSAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuZGVjb2RlID0gKHRlbXA4ID4+IDEpICYgMHgwMTsKLQotCS8qIE1pbiBBZGRyZXNzIEZpeGVkICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAyKSAmIDB4MDE7Ci0KLQkvKiBNYXggQWRkcmVzcyBGaXhlZCAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMykgJiAweDAxOworCWFjcGlfcnNfZGVjb2RlX2dlbmVyYWxfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwogCiAJLyogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkgKi8KIAogCWJ1ZmZlciArPSAxOwotCXRlbXA4ID0gKmJ1ZmZlcjsKLQotCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlKSB7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICh0ZW1wOCAmIDB4MDEpOwotCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlID0KLQkJCQkodTE2KSAoKHRlbXA4ID4+IDEpICYgMHgwMyk7Ci0JfQotCWVsc2UgewotCQlpZiAoQUNQSV9JT19SQU5HRSA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlKSB7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlID0KLQkJCQkodTE2KSAodGVtcDggJiAweDAzKTsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICgodGVtcDggPj4gNCkgJiAweDAzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIEJVU19OVU1CRVJfUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+RGF0YS5BZGRyZXNzMzIucmVzb3VyY2VfdHlwZSAqLwotCQkJLyogTm90aGluZyBuZWVkcyB0byBiZSBmaWxsZWQgaW4gKi8KLQkJfQotCX0KKwlhY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncygmb3V0cHV0X3N0cnVjdC0+ZGF0YSwgKmJ1ZmZlcik7CiAKIAkvKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtOSkgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5LCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7CiAKIAkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDEwLTEzKSAqLwogCiAJYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19yYW5nZSwKKwkJCSAgIGJ1ZmZlcik7CiAKIAkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTE3KSAqLwogCiAJYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWF4X2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19yYW5nZSwKKwkJCSAgIGJ1ZmZlcik7CiAKIAkvKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDE4LTIxKSAqLwogCiAJYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsCi0JCWJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi4KKwkJCSAgIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LCBidWZmZXIpOwogCiAJLyogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAyMi0yNSkgKi8KIAogCWJ1ZmZlciArPSA0OwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfbGVuZ3RoLCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgsCisJCQkgICBidWZmZXIpOwogCiAJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KSAqLwogCkBAIC01NjgsOSArNjMxLDggQEAKIAlpZiAoKmJ5dGVzX2NvbnN1bWVkID4gKDI2ICsgMSkpIHsKIAkJLyogRGVyZWZlcmVuY2UgdGhlIEluZGV4ICovCiAKLQkJdGVtcDggPSAqYnVmZmVyOwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPQotCQkJCSh1MzIpIHRlbXA4OworCQkgICAgKHUzMikgKiBidWZmZXI7CiAKIAkJLyogUG9pbnQgdG8gdGhlIFN0cmluZyAqLwogCkBAIC01NzksMjYgKzY0MSwyNyBAQAogCQkvKiBQb2ludCB0aGUgU3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZSAqLwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KLQkJCQkoY2hhciAqKSgodTggKilvdXRwdXRfc3RydWN0ICsgc3RydWN0X3NpemUpOworCQkgICAgKGNoYXIgKikoKHU4ICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKIAkJdGVtcF9wdHIgPSAodTggKikKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQkgICAgb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKLQkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLworCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCiAJCWluZGV4ID0gMDsKLQkJd2hpbGUgKDB4MDAgIT0gKmJ1ZmZlcikgeworCQl3aGlsZSAoKmJ1ZmZlcikgewogCQkJKnRlbXBfcHRyID0gKmJ1ZmZlcjsKIAotCQkJdGVtcF9wdHIgKz0gMTsKLQkJCWJ1ZmZlciArPSAxOwotCQkJaW5kZXggKz0gMTsKKwkJCXRlbXBfcHRyKys7CisJCQlidWZmZXIrKzsKKwkJCWluZGV4Kys7CiAJCX0KIAotCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgKi8KKwkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsIGFuZCBzZXQgdGhlIHN0cmluZyBsZW5ndGggKi8KIAotCQkqdGVtcF9wdHIgPSAweDAwOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKKwkJKnRlbXBfcHRyID0gMDsKKwkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQorCQkgICAgaW5kZXggKyAxOwogCiAJCS8qCiAJCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKQEAgLTYwNiwxMCArNjY5LDkgQEAKIAkJICogc3RydWN0X3NpemUgdG8gdGhlIG5leHQgMzItYml0IGJvdW5kYXJ5LgogCQkgKi8KIAkJdGVtcDggPSAodTgpIChpbmRleCArIDEpOwotCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKLQl9Ci0JZWxzZSB7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5pbmRleCA9IDB4MDA7CisJCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CisJfSBlbHNlIHsKKwkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMDsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSAwOwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CiAJfQpAQCAtNjIxLDEwICs2ODMsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYWRkcmVzczMyX3N0cmVhbQpAQCAtNjQyLDEzNiArNzAzLDEwNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczMyX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfZmllbGQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wODsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3BvaW50ZXI7CisJdTggKmJ1ZmZlcjsKKwl1MTYgKmxlbmd0aF9maWVsZDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3MzMl9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3MzMl9zdHJlYW0iKTsKIAogCWJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwogCi0JLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisJLyogU2V0IHRoZSBEZXNjcmlwdG9yIFR5cGUgZmllbGQgKi8KIAotCSpidWZmZXIgPSAweDg3OworCSpidWZmZXIgPSBBQ1BJX1JERVNDX1RZUEVfRFdPUkRfQUREUkVTU19TUEFDRTsKIAlidWZmZXIgKz0gMTsKIAotCS8qIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KIAotCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIgKHUxNiwgYnVmZmVyKTsKKwlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSKHUxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3R5cGUgJiAweDAzKTsKLQotCSpidWZmZXIgPSB0ZW1wODsKKwkqYnVmZmVyID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3R5cGUgJiAweDAzKTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgZ2VuZXJhbCBmbGFncyAqLwogCi0JdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKLQl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmRlY29kZSAmIDB4MDEpIDw8IDE7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDI7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDM7Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9IGFjcGlfcnNfZW5jb2RlX2dlbmVyYWxfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncyAqLwogCi0JdGVtcDggPSAwOwotCi0JaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlKSB7Ci0JCXRlbXA4ID0gKHU4KQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlICYKLQkJCTB4MDEpOwotCi0JCXRlbXA4IHw9Ci0JCQkobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlICYKLQkJCSAweDAzKSA8PCAxOwotCX0KLQllbHNlIGlmIChBQ1BJX0lPX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV90eXBlKSB7Ci0JCXRlbXA4ID0gKHU4KQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlICYKLQkJCSAweDAzKTsKLQkJdGVtcDggfD0KLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMykgPDwgNDsKLQl9Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9IGFjcGlfcnNfZW5jb2RlX3NwZWNpZmljX2ZsYWdzKCZsaW5rZWRfbGlzdC0+ZGF0YSk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5KTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5KTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19yYW5nZSk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX3JhbmdlKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0ICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwKLQkJJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuCisJCQkgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KIAotCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewotCQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5pbmRleDsKLQotCQkqYnVmZmVyID0gdGVtcDg7CisJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgeworCQkqYnVmZmVyID0KKwkJICAgICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5pbmRleDsKIAkJYnVmZmVyICs9IDE7CiAKLQkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOworCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nICovCiAKLQkJLyogQ29weSB0aGUgc3RyaW5nICovCi0KLQkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwKLQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCUFDUElfU1RSQ1BZKChjaGFyICopYnVmZmVyLAorCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0cik7CiAKIAkJLyoKLQkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCisJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICsgb25lIGZvciB0aGUKIAkJICogIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAoCi0JCQkJIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKKwkJYnVmZmVyICs9CisJCSAgICAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4KKwkJCQkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuCisJCQkJICBzdHJpbmdfcHRyKSArIDEpOwogCX0KIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCiAJLyoKIAkgKiBTZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICogIG1pbnVzIHRoZSBoZWFkZXIgc2l6ZSAoMyBieXRlcykKKwkgKiBtaW51cyB0aGUgaGVhZGVyIHNpemUgKDMgYnl0ZXMpCiAJICovCiAJKmxlbmd0aF9maWVsZCA9ICh1MTYpICgqYnl0ZXNfY29uc3VtZWQgLSAzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYWRkcmVzczY0X3Jlc291cmNlCkBAIC03OTQsMzggKzgyNCwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczY0X3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3B0cjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJdTE2IHRlbXAxNjsKKwl1OCB0ZW1wODsKKwl1OCByZXNvdXJjZV90eXBlOworCXU4ICp0ZW1wX3B0cjsKKwl1MzIgaW5kZXg7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0KKwkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KTsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3M2NF9yZXNvdXJjZSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3M2NF9yZXNvdXJjZSIpOworCS8qIEdldCB0aGUgRGVzY3JpcHRvciBUeXBlICovCiAKLQotCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpOwogCXJlc291cmNlX3R5cGUgPSAqYnVmZmVyOwogCi0JLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCS8qIEdldCB0aGUgRGVzY3JpcHRvciBMZW5ndGggZmllbGQgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCS8qIFZhbGlkYXRlIG1pbmltdW0gZGVzY3JpcHRvciBsZW5ndGggKi8KIAogCWlmICh0ZW1wMTYgPCA0MykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKIAl9CiAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwpAQCAtODM5LDcgKzg2Niw3IEBACiAJLyogVmFsdWVzIDAtMiBhbmQgMHhDMC0weEZGIGFyZSB2YWxpZCAqLwogCiAJaWYgKCh0ZW1wOCA+IDIpICYmICh0ZW1wOCA8IDB4QzApKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKIAl9CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlID0gdGVtcDg7CkBAIC04NDcsNDggKzg3NCwxMiBAQAogCS8qIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpICovCiAKIAlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkvKiBQcm9kdWNlciAvIENvbnN1bWVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5wcm9kdWNlcl9jb25zdW1lciA9IHRlbXA4ICYgMHgwMTsKLQotCS8qIERlY29kZSAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuZGVjb2RlID0gKHRlbXA4ID4+IDEpICYgMHgwMTsKLQotCS8qIE1pbiBBZGRyZXNzIEZpeGVkICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAyKSAmIDB4MDE7Ci0KLQkvKiBNYXggQWRkcmVzcyBGaXhlZCAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMykgJiAweDAxOworCWFjcGlfcnNfZGVjb2RlX2dlbmVyYWxfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwogCiAJLyogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkgKi8KIAogCWJ1ZmZlciArPSAxOwotCXRlbXA4ID0gKmJ1ZmZlcjsKLQotCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlKSB7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICh0ZW1wOCAmIDB4MDEpOwotCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlID0KLQkJCQkodTE2KSAoKHRlbXA4ID4+IDEpICYgMHgwMyk7Ci0JfQotCWVsc2UgewotCQlpZiAoQUNQSV9JT19SQU5HRSA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlKSB7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlID0KLQkJCQkodTE2KSAodGVtcDggJiAweDAzKTsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPQotCQkJCSh1MTYpICgodGVtcDggPj4gNCkgJiAweDAzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIEJVU19OVU1CRVJfUkFOR0UgPT0gb3V0cHV0X3N0cnVjdC0+RGF0YS5BZGRyZXNzNjQucmVzb3VyY2VfdHlwZSAqLwotCQkJLyogTm90aGluZyBuZWVkcyB0byBiZSBmaWxsZWQgaW4gKi8KLQkJfQotCX0KKwlhY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncygmb3V0cHV0X3N0cnVjdC0+ZGF0YSwgKmJ1ZmZlcik7CiAKIAlpZiAocmVzb3VyY2VfdHlwZSA9PSBBQ1BJX1JERVNDX1RZUEVfRVhURU5ERURfQUREUkVTU19TUEFDRSkgewogCQkvKiBNb3ZlIHBhc3QgcmV2aXNpb25faWQgYW5kIFJlc2VydmVkIGJ5dGUgKi8KQEAgLTg5OSwzMCArODkwLDMzIEBACiAJLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTEzKSBvciAoQnl0ZXMgOC0xNSkgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5LCBidWZmZXIpOworCUFDUElfTU9WRV82NF9UT182NCgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7CiAKIAkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTIxKSBvciAoQnl0ZXMgMTYtMjMpICovCiAKIAlidWZmZXIgKz0gODsKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfNjRfVE9fNjQoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX3JhbmdlLAorCQkJICAgYnVmZmVyKTsKIAogCS8qIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMjItMjkpIG9yIChCeXRlcyAyNC0zMSkgKi8KIAogCWJ1ZmZlciArPSA4OwotCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOworCUFDUElfTU9WRV82NF9UT182NCgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfcmFuZ2UsCisJCQkgICBidWZmZXIpOwogCiAJLyogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAzMC0zNykgb3IgKEJ5dGVzIDMyLTM5KSAqLwogCiAJYnVmZmVyICs9IDg7Ci0JQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsCi0JCWJ1ZmZlcik7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC4KKwkJCSAgIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LCBidWZmZXIpOwogCiAJLyogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAzOC00NSkgb3IgKEJ5dGVzIDQwLTQ3KSAqLwogCiAJYnVmZmVyICs9IDg7Ci0JQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCwKKwkJCSAgIGJ1ZmZlcik7CiAKLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAweDAwOworCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5pbmRleCA9IDA7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSAwOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0gTlVMTDsKIApAQCAtOTMwLDExICs5MjQsOSBAQAogCQkvKiBHZXQgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGUgKEJ5dGVzIDQ4LTU1KSAqLwogCiAJCWJ1ZmZlciArPSA4OwotCQlBQ1BJX01PVkVfNjRfVE9fNjQgKAotCQkJJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcywKLQkJCWJ1ZmZlcik7Ci0JfQotCWVsc2UgeworCQlBQ1BJX01PVkVfNjRfVE9fNjQoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LgorCQkJCSAgIHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcywgYnVmZmVyKTsKKwl9IGVsc2UgewogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMgPSAwOwogCiAJCS8qIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkgKi8KQEAgLTk1NCw5ICs5NDYsOCBAQAogCQlpZiAoKmJ5dGVzX2NvbnN1bWVkID4gKDQ2ICsgMSkpIHsKIAkJCS8qIERlcmVmZXJlbmNlIHRoZSBJbmRleCAqLwogCi0JCQl0ZW1wOCA9ICpidWZmZXI7CiAJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPQotCQkJCQkodTMyKSB0ZW1wODsKKwkJCSAgICAodTMyKSAqIGJ1ZmZlcjsKIAogCQkJLyogUG9pbnQgdG8gdGhlIFN0cmluZyAqLwogCkBAIC05NjQsMjkgKzk1NSwzMSBAQAogCiAJCQkvKiBQb2ludCB0aGUgU3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZSAqLwogCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9Ci0JCQkJCShjaGFyICopKCh1OCAqKW91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0ciA9CisJCQkgICAgKGNoYXIgKikoKHU4ICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKIAkJCXRlbXBfcHRyID0gKHU4ICopCi0JCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CisJCQkgICAgb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHI7CiAKLQkJCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KKwkJCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCiAKIAkJCWluZGV4ID0gMDsKLQkJCXdoaWxlICgweDAwICE9ICpidWZmZXIpIHsKKwkJCXdoaWxlICgqYnVmZmVyKSB7CiAJCQkJKnRlbXBfcHRyID0gKmJ1ZmZlcjsKIAotCQkJCXRlbXBfcHRyICs9IDE7Ci0JCQkJYnVmZmVyICs9IDE7Ci0JCQkJaW5kZXggKz0gMTsKKwkJCQl0ZW1wX3B0cisrOworCQkJCWJ1ZmZlcisrOworCQkJCWluZGV4Kys7CiAJCQl9CiAKIAkJCS8qCi0JCQkgKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwKKwkJCSAqIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCBhbmQgc2V0IHRoZSBzdHJpbmcgbGVuZ3RoCiAJCQkgKi8KLQkJCSp0ZW1wX3B0ciA9IDB4MDA7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9Ci0JCQkJaW5kZXggKyAxOworCQkJKnRlbXBfcHRyID0gMDsKKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOwogCiAJCQkvKgogCQkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LApAQCAtOTk0LDcgKzk4Nyw3IEBACiAJCQkgKiBzdHJ1Y3Rfc2l6ZSB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkuCiAJCQkgKi8KIAkJCXRlbXA4ID0gKHU4KSAoaW5kZXggKyAxKTsKLQkJCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOworCQkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKIAkJfQogCX0KIApAQCAtMTAwNSwxMCArOTk4LDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0KQEAgLTEwMjYsMTMyICsxMDE4LDEwMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczY0X3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfZmllbGQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wODsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3BvaW50ZXI7CisJdTggKmJ1ZmZlcjsKKwl1MTYgKmxlbmd0aF9maWVsZDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2FkZHJlc3M2NF9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3M2NF9zdHJlYW0iKTsKIAogCWJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwogCi0JLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisJLyogU2V0IHRoZSBEZXNjcmlwdG9yIFR5cGUgZmllbGQgKi8KIAotCSpidWZmZXIgPSAweDhBOworCSpidWZmZXIgPSBBQ1BJX1JERVNDX1RZUEVfUVdPUkRfQUREUkVTU19TUEFDRTsKIAlidWZmZXIgKz0gMTsKIAotCS8qIFNldCBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLworCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KIAotCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIgKHUxNiwgYnVmZmVyKTsKKwlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSKHUxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3R5cGUgJiAweDAzKTsKLQotCSpidWZmZXIgPSB0ZW1wODsKKwkqYnVmZmVyID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3R5cGUgJiAweDAzKTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgZ2VuZXJhbCBmbGFncyAqLwogCi0JdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKLQl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmRlY29kZSAmIDB4MDEpIDw8IDE7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDI7Ci0JdGVtcDggfD0gKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19maXhlZCAmIDB4MDEpIDw8IDM7Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9IGFjcGlfcnNfZW5jb2RlX2dlbmVyYWxfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgdHlwZSBzcGVjaWZpYyBmbGFncyAqLwogCi0JdGVtcDggPSAwOwotCi0JaWYgKEFDUElfTUVNT1JZX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlKSB7Ci0JCXRlbXA4ID0gKHU4KQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlICYKLQkJCTB4MDEpOwotCi0JCXRlbXA4IHw9Ci0JCQkobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlICYKLQkJCSAweDAzKSA8PCAxOwotCX0KLQllbHNlIGlmIChBQ1BJX0lPX1JBTkdFID09IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV90eXBlKSB7Ci0JCXRlbXA4ID0gKHU4KQotCQkJKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlICYKLQkJCSAweDAzKTsKLQkJdGVtcDggfD0KLQkJCShsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSAmCi0JCQkgMHgwMykgPDwgNDsKLQl9Ci0KLQkqYnVmZmVyID0gdGVtcDg7CisJKmJ1ZmZlciA9IGFjcGlfcnNfZW5jb2RlX3NwZWNpZmljX2ZsYWdzKCZsaW5rZWRfbGlzdC0+ZGF0YSk7CiAJYnVmZmVyICs9IDE7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkgKi8KIAotCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5KTsKKwlBQ1BJX01PVkVfNjRfVE9fNjQoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5KTsKIAlidWZmZXIgKz0gODsKIAogCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtICovCiAKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZSk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA4OwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KIAotCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlKTsKKwlBQ1BJX01PVkVfNjRfVE9fNjQoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDg7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0ICovCiAKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwKLQkJJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuCisJCQkgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CiAJYnVmZmVyICs9IDg7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoICovCiAKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCk7CisJQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCk7CiAJYnVmZmVyICs9IDg7CiAKIAkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KIAotCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewotCQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5pbmRleDsKLQotCQkqYnVmZmVyID0gdGVtcDg7CisJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgeworCQkqYnVmZmVyID0KKwkJICAgICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5pbmRleDsKIAkJYnVmZmVyICs9IDE7CiAKLQkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOworCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nICovCiAKLQkJLyogQ29weSB0aGUgc3RyaW5nICovCi0KLQkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwKLQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCUFDUElfU1RSQ1BZKChjaGFyICopYnVmZmVyLAorCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0cik7CiAKIAkJLyoKLQkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCisJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICsgb25lIGZvciB0aGUKIAkJICogdGVybWluYXRpbmcgbnVsbAogCQkgKi8KLQkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOICgKLQkJCQkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0KKwkJICAgIChhY3BpX3NpemUpIChBQ1BJX1NUUkxFTgorCQkJCSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KKwkJCQkgIHN0cmluZ19wdHIpICsgMSk7CiAJfQogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAKIAkvKgogCSAqIFNldCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKIAkgKiBtaW51cyB0aGUgaGVhZGVyIHNpemUgKDMgYnl0ZXMpCiAJICovCiAJKmxlbmd0aF9maWVsZCA9ICh1MTYpICgqYnl0ZXNfY29uc3VtZWQgLSAzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYwppbmRleCA5ODE3NmYyLi4zNzhmNTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKQEAgLTQxLDE1ICs0MSwxMyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc2NhbGMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJyc2NhbGMiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY2LDE5ICs2NCwxNSBAQAogICogICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkYXRhLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnNpemVfbmVlZGVkKQorYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSAgICAgICBhY3BpX3NpemUgKiBzaXplX25lZWRlZCkKIHsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRfc2l6ZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKKwlhY3BpX3NpemUgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQgPSAwOworCWFjcGlfc2l6ZSBzZWdtZW50X3NpemU7CisJdTggZG9uZSA9IEZBTFNFOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aCIpOwogCiAJd2hpbGUgKCFkb25lKSB7CiAJCS8qIEluaXQgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBzaXplIHRvIGFkZCB0byB0aGUgdG90YWwuICovCkBAIC0xNDUsMTEgKzEzOSwxMSBAQAogCQkJICovCiAJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aCA+IDcpIHsKIAkJCQlzZWdtZW50X3NpemUgPSAzOwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCXNlZ21lbnRfc2l6ZSA9IDE7CiAJCQl9Ci0JCQlzZWdtZW50X3NpemUgKz0gbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsKKwkJCXNlZ21lbnRfc2l6ZSArPQorCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0VORF9UQUc6CkBAIC0xOTQsOSArMTg4LDExIEBACiAJCQkgKi8KIAkJCXNlZ21lbnRfc2l6ZSA9IDE2OwogCi0JCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7CisJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfcHRyKSB7CiAJCQkJc2VnbWVudF9zaXplICs9Ci0JCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS4KKwkJCQkgICAgc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjExLDkgKzIwNywxMSBAQAogCQkJICovCiAJCQlzZWdtZW50X3NpemUgPSAyNjsKIAotCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgeworCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuCisJCQkgICAgc3RyaW5nX3B0cikgewogCQkJCXNlZ21lbnRfc2l6ZSArPQotCQkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuCisJCQkJICAgIHN0cmluZ19sZW5ndGg7CiAJCQkJc2VnbWVudF9zaXplKys7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIyNyw5ICsyMjUsMTEgQEAKIAkJCSAqLwogCQkJc2VnbWVudF9zaXplID0gNDY7CiAKLQkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpIHsKKwkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHIpIHsKIAkJCQlzZWdtZW50X3NpemUgKz0KLQkJCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoOworCQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgorCQkJCSAgICBzdHJpbmdfbGVuZ3RoOwogCQkJCXNlZ21lbnRfc2l6ZSsrOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yNDQsMTEgKzI0NCwxNCBAQAogCQkJICogUmVzb3VyY2UgU291cmNlICsgMSBmb3IgdGhlIG51bGwuCiAJCQkgKi8KIAkJCXNlZ21lbnRfc2l6ZSA9IDkgKyAoKChhY3BpX3NpemUpCi0JCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzIC0gMSkgKiA0KTsKKwkJCQkJICAgICBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuCisJCQkJCSAgICAgbnVtYmVyX29mX2ludGVycnVwdHMgLSAxKSAqIDQpOwogCi0JCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSB7CisJCQlpZiAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS4KKwkJCSAgICBzdHJpbmdfcHRyKSB7CiAJCQkJc2VnbWVudF9zaXplICs9Ci0JCQkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKKwkJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgorCQkJCSAgICByZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjU3LDkgKzI2MCw5IEBACiAKIAkJCS8qIElmIHdlIGdldCBoZXJlLCBldmVyeXRoaW5nIGlzIG91dCBvZiBzeW5jLCBleGl0IHdpdGggZXJyb3IgKi8KIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKIAotCQl9IC8qIHN3aXRjaCAobGlua2VkX2xpc3QtPklkKSAqLworCQl9CQkvKiBzd2l0Y2ggKGxpbmtlZF9saXN0LT5JZCkgKi8KIAogCQkvKiBVcGRhdGUgdGhlIHRvdGFsICovCiAKQEAgLTI2NywxNyArMjcwLDE2IEBACiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0ICovCiAKLQkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQgKHN0cnVjdCBhY3BpX3Jlc291cmNlLAotCQkJCSAgbGlua2VkX2xpc3QsIGxpbmtlZF9saXN0LT5sZW5ndGgpOworCQlsaW5rZWRfbGlzdCA9IEFDUElfUFRSX0FERChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKKwkJCQkJICAgbGlua2VkX2xpc3QsIGxpbmtlZF9saXN0LT5sZW5ndGgpOwogCX0KIAogCS8qIFRoaXMgaXMgdGhlIGRhdGEgdGhlIGNhbGxlciBuZWVkcyAqLwogCiAJKnNpemVfbmVlZGVkID0gYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9saXN0X2xlbmd0aApAQCAtMjk3LDMyICsyOTksMjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9saXN0X2xlbmd0aCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzaXplX25lZWRlZCkKK2FjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJdTMyIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsIGFjcGlfc2l6ZSAqIHNpemVfbmVlZGVkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcGFyc2VkID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9pbnRlcnJ1cHRzID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaGFubmVscyA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19jb25zdW1lZDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wODsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9ieXRlczsKKwl1MzIgYnVmZmVyX3NpemUgPSAwOworCXUzMiBieXRlc19wYXJzZWQgPSAwOworCXU4IG51bWJlcl9vZl9pbnRlcnJ1cHRzID0gMDsKKwl1OCBudW1iZXJfb2ZfY2hhbm5lbHMgPSAwOworCXU4IHJlc291cmNlX3R5cGU7CisJdTMyIHN0cnVjdHVyZV9zaXplOworCXUzMiBieXRlc19jb25zdW1lZDsKKwl1OCAqYnVmZmVyOworCXU4IHRlbXA4OworCXUxNiB0ZW1wMTY7CisJdTggaW5kZXg7CisJdTggYWRkaXRpb25hbF9ieXRlczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2dldF9saXN0X2xlbmd0aCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X2xpc3RfbGVuZ3RoIik7CiAKIAl3aGlsZSAoYnl0ZXNfcGFyc2VkIDwgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCkgewogCQkvKiBUaGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gaXMgdGhlIHJlc291cmNlIHR5cGUgKi8KIAotCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSAoKmJ5dGVfc3RyZWFtX2J1ZmZlcik7CisJCXJlc291cmNlX3R5cGUgPSBhY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlKCpieXRlX3N0cmVhbV9idWZmZXIpOwogCiAJCXN3aXRjaCAocmVzb3VyY2VfdHlwZSkgewogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMjQ6CkBAIC0zMzEsMTAgKzMyOSwxMCBAQAogCQkJICovCiAJCQlieXRlc19jb25zdW1lZCA9IDEyOwogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9MQVJHRV9WRU5ET1I6CiAJCQkvKgogCQkJICogVmVuZG9yIERlZmluZWQgUmVzb3VyY2UKQEAgLTM0MiwzOCArMzQwLDM5IEBACiAJCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAJCQkrK2J1ZmZlcjsKIAotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAKIAkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLwogCi0JCQl0ZW1wMTYgPSAodTE2KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXAxNik7CisJCQl0ZW1wMTYgPSAodTE2KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDE2KTsKIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSArCi0JCQkJCSAgICh0ZW1wMTYgKiBzaXplb2YgKHU4KSk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSArCisJCQkgICAgKHRlbXAxNiAqIHNpemVvZih1OCkpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMzI6CiAJCQkvKgogCQkJICogMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZQogCQkJICovCiAJCQlieXRlc19jb25zdW1lZCA9IDIwOwogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMik7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9GSVhFRF9NRU1PUllfMzI6CiAJCQkvKgogCQkJICogMzItQml0IEZpeGVkIE1lbW9yeSBSZXNvdXJjZQogCQkJICovCiAJCQlieXRlc19jb25zdW1lZCA9IDEyOwogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0CisJCQkJCQkgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX0FERFJFU1NfU1BBQ0U6CiAJCQkvKgogCQkJICogNjQtQml0IEFkZHJlc3MgUmVzb3VyY2UKQEAgLTM4MSwxMyArMzgwLDE0IEBACiAJCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAKIAkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0CisJCQkJCQkgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9RV09SRF9BRERSRVNTX1NQQUNFOgogCQkJLyoKIAkJCSAqIDY0LUJpdCBBZGRyZXNzIFJlc291cmNlCkBAIC0zOTUsNyArMzk1LDcgQEAKIAkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKIAogCQkJKytidWZmZXI7Ci0JCQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCQkJYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwogCkBAIC00MDksMjAgKzQwOSwxOSBAQAogCQkJICovCiAJCQlpZiAoNDMgPCB0ZW1wMTYpIHsKIAkJCQl0ZW1wOCA9ICh1OCkgKHRlbXAxNiAtIDQ0KTsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQl0ZW1wOCA9IDA7CiAJCQl9CiAKIAkJCS8qIEVuc3VyZSBhIDY0LWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLwogCi0JCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b182NF9iSVRTICh0ZW1wOCk7CisJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b182NF9iSVRTKHRlbXA4KTsKIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSArCi0JCQkJCSAgICh0ZW1wOCAqIHNpemVvZiAodTgpKTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpCisJCQkgICAgKyAodGVtcDggKiBzaXplb2YodTgpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRFdPUkRfQUREUkVTU19TUEFDRToKIAkJCS8qCiAJCQkgKiAzMi1CaXQgQWRkcmVzcyBSZXNvdXJjZQpAQCAtNDMwLDcgKzQyOSw3IEBACiAJCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAKIAkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIApAQCAtNDQ0LDIwICs0NDMsMTkgQEAKIAkJCSAqLwogCQkJaWYgKDIzIDwgdGVtcDE2KSB7CiAJCQkJdGVtcDggPSAodTgpICh0ZW1wMTYgLSAyNCk7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJdGVtcDggPSAwOwogCQkJfQogCiAJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KIAotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOworCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CiAKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMikgKwotCQkJCQkgICAodGVtcDggKiBzaXplb2YgKHU4KSk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKQorCQkJICAgICsgKHRlbXA4ICogc2l6ZW9mKHU4KSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX1dPUkRfQUREUkVTU19TUEFDRToKIAkJCS8qCiAJCQkgKiAxNi1CaXQgQWRkcmVzcyBSZXNvdXJjZQpAQCAtNDY1LDcgKzQ2Myw3IEBACiAJCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAKIAkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIApAQCAtNDc5LDIwICs0NzcsMTkgQEAKIAkJCSAqLwogCQkJaWYgKDEzIDwgdGVtcDE2KSB7CiAJCQkJdGVtcDggPSAodTgpICh0ZW1wMTYgLSAxNCk7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJdGVtcDggPSAwOwogCQkJfQogCiAJCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KIAotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDgpOworCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CiAKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNikgKwotCQkJCQkgICAodGVtcDggKiBzaXplb2YgKHU4KSk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KQorCQkJICAgICsgKHRlbXA4ICogc2l6ZW9mKHU4KSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX1hSVVBUOgogCQkJLyoKIAkJCSAqIEV4dGVuZGVkIElSUQpAQCAtNTAwLDcgKzQ5Nyw3IEBACiAJCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CiAKIAkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIApAQCAtNTI3LDIxICs1MjQsMjAgQEAKIAkJCSAqLwogCQkJaWYgKDkgKyBhZGRpdGlvbmFsX2J5dGVzIDwgdGVtcDE2KSB7CiAJCQkJdGVtcDggPSAodTgpICh0ZW1wMTYgLSAoOSArIGFkZGl0aW9uYWxfYnl0ZXMpKTsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQl0ZW1wOCA9IDA7CiAJCQl9CiAKIAkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLwogCi0JCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTICh0ZW1wOCk7CisJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSkgKwotCQkJCQkgICAoYWRkaXRpb25hbF9ieXRlcyAqIHNpemVvZiAodTgpKSArCi0JCQkJCSAgICh0ZW1wOCAqIHNpemVvZiAodTgpKTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKSArCisJCQkgICAgKGFkZGl0aW9uYWxfYnl0ZXMgKiBzaXplb2YodTgpKSArCisJCQkgICAgKHRlbXA4ICogc2l6ZW9mKHU4KSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lSUV9GT1JNQVQ6CiAJCQkvKgogCQkJICogSVJRIFJlc291cmNlLgpAQCAtNTUwLDEwICs1NDYsOSBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCQkJdGVtcDggPSAqYnVmZmVyOwogCi0JCQlpZih0ZW1wOCAmIDB4MDEpIHsKKwkJCWlmICh0ZW1wOCAmIDB4MDEpIHsKIAkJCQlieXRlc19jb25zdW1lZCA9IDQ7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJYnl0ZXNfY29uc3VtZWQgPSAzOwogCQkJfQogCkBAIC01NjMsNyArNTU4LDcgQEAKIAogCQkJLyogTG9vayBhdCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0ICovCiAKLQkJCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxNjsgaW5kZXgrKykgewogCQkJCWlmICh0ZW1wMTYgJiAweDEpIHsKQEAgLTU3MywxMSArNTY4LDExIEBACiAJCQkJdGVtcDE2ID4+PSAxOwogCQkJfQogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbykgKwotCQkJCQkgICAobnVtYmVyX29mX2ludGVycnVwdHMgKiBzaXplb2YgKHUzMikpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKSArCisJCQkgICAgKG51bWJlcl9vZl9pbnRlcnJ1cHRzICogc2l6ZW9mKHUzMikpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9ETUFfRk9STUFUOgogCQkJLyoKIAkJCSAqIERNQSBSZXNvdXJjZQpAQCAtNTkzLDE5ICs1ODgsMTkgQEAKIAogCQkJdGVtcDggPSAqYnVmZmVyOwogCi0JCQlmb3IoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHsKLQkJCQlpZih0ZW1wOCAmIDB4MSkgeworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgeworCQkJCWlmICh0ZW1wOCAmIDB4MSkgewogCQkJCQkrK251bWJlcl9vZl9jaGFubmVsczsKIAkJCQl9CiAKIAkJCQl0ZW1wOCA+Pj0gMTsKIAkJCX0KIAotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKSArCi0JCQkJCSAgIChudW1iZXJfb2ZfY2hhbm5lbHMgKiBzaXplb2YgKHUzMikpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSkgKworCQkJICAgIChudW1iZXJfb2ZfY2hhbm5lbHMgKiBzaXplb2YodTMyKSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX1NUQVJUX0RFUEVOREVOVDoKIAkJCS8qCiAJCQkgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCkBAIC02MTQsMTcgKzYwOSwxNyBAQAogCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCQkJdGVtcDggPSAqYnVmZmVyOwogCi0JCQlpZih0ZW1wOCAmIDB4MDEpIHsKKwkJCWlmICh0ZW1wOCAmIDB4MDEpIHsKIAkJCQlieXRlc19jb25zdW1lZCA9IDI7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJYnl0ZXNfY29uc3VtZWQgPSAxOwogCQkJfQogCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYpOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdAorCQkJCQkJIGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRU5EX0RFUEVOREVOVDoKIAkJCS8qCiAJCQkgKiBFbmQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZQpAQCAtNjMzLDI1ICs2MjgsMjQgQEAKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9SRVNPVVJDRV9MRU5HVEg7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lPX1BPUlQ6CiAJCQkvKgogCQkJICogSU8gUG9ydCBSZXNvdXJjZQogCQkJICovCiAJCQlieXRlc19jb25zdW1lZCA9IDg7Ci0JCQlzdHJ1Y3R1cmVfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyk7CisJCQlzdHJ1Y3R1cmVfc2l6ZSA9CisJCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9GSVhFRF9JT19QT1JUOgogCQkJLyoKIAkJCSAqIEZpeGVkIElPIFBvcnQgUmVzb3VyY2UKIAkJCSAqLwogCQkJYnl0ZXNfY29uc3VtZWQgPSA0OwotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8pOworCQkJc3RydWN0dXJlX3NpemUgPQorCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfU01BTExfVkVORE9SOgogCQkJLyoKIAkJCSAqIFZlbmRvciBTcGVjaWZpYyBSZXNvdXJjZQpAQCAtNjY0LDEyICs2NTgsMTIgQEAKIAogCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCiAKLQkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKwotCQkJCQkgICAodGVtcDggKiBzaXplb2YgKHU4KSk7CisJCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKKwkJCXN0cnVjdHVyZV9zaXplID0KKwkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpICsKKwkJCSAgICAodGVtcDggKiBzaXplb2YodTgpKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRzoKIAkJCS8qCiAJCQkgKiBFbmQgVGFnCkBAIC02NzksMTggKzY3MywxNyBAQAogCQkJYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCA9IGJ5dGVzX3BhcnNlZDsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAkJCS8qCiAJCQkgKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywKIAkJCSAqIGV4aXQgd2l0aCBhbiBlcnJvcgogCQkJICovCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOwogCQl9CiAKIAkJLyogVXBkYXRlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50ZXIgKi8KIAotCQlidWZmZXJfc2l6ZSArPSAodTMyKSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUgKHN0cnVjdHVyZV9zaXplKTsKKwkJYnVmZmVyX3NpemUgKz0gKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFKHN0cnVjdHVyZV9zaXplKTsKIAkJYnl0ZXNfcGFyc2VkICs9IGJ5dGVzX2NvbnN1bWVkOwogCiAJCS8qIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gcG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2UgKi8KQEAgLTcwMSwxMCArNjk0LDkgQEAKIAkvKiBUaGlzIGlzIHRoZSBkYXRhIHRoZSBjYWxsZXIgbmVlZHMgKi8KIAogCSpzaXplX25lZWRlZCA9IGJ1ZmZlcl9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoCkBAIC03MjMsMjIgKzcxNSwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmplY3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NpemVfbmVlZGVkKQorYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhY2thZ2Vfb2JqZWN0LAorCQkJCSAgICAgYWNwaV9zaXplICogYnVmZmVyX3NpemVfbmVlZGVkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2VsZW1lbnRzOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9zaXplX25lZWRlZCA9IDA7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnRvcF9vYmplY3RfbGlzdDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2VfZWxlbWVudDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3ViX29iamVjdF9saXN0OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9mb3VuZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2luZGV4OworCXUzMiBudW1iZXJfb2ZfZWxlbWVudHM7CisJYWNwaV9zaXplIHRlbXBfc2l6ZV9uZWVkZWQgPSAwOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKip0b3Bfb2JqZWN0X2xpc3Q7CisJdTMyIGluZGV4OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhY2thZ2VfZWxlbWVudDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX29iamVjdF9saXN0OworCXU4IG5hbWVfZm91bmQ7CisJdTMyIHRhYmxlX2luZGV4OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCIpOwogCiAJbnVtYmVyX29mX2VsZW1lbnRzID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7CiAKQEAgLTc2OSw1MyArNzU4LDUxIEBACiAKIAkJbmFtZV9mb3VuZCA9IEZBTFNFOwogCi0JCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8IDQgJiYgIW5hbWVfZm91bmQ7IHRhYmxlX2luZGV4KyspIHsKKwkJZm9yICh0YWJsZV9pbmRleCA9IDA7IHRhYmxlX2luZGV4IDwgNCAmJiAhbmFtZV9mb3VuZDsKKwkJICAgICB0YWJsZV9pbmRleCsrKSB7CiAJCQlpZiAoKEFDUElfVFlQRV9TVFJJTkcgPT0KLQkJCQkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpKSB8fAotCi0JCQkJKChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFID09Ci0JCQkJCUFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSkgJiYKLQotCQkJCQkoKCpzdWJfb2JqZWN0X2xpc3QpLT5yZWZlcmVuY2Uub3Bjb2RlID09Ci0JCQkJCQlBTUxfSU5UX05BTUVQQVRIX09QKSkpIHsKKwkJCSAgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnN1Yl9vYmplY3RfbGlzdCkpCisJCQkgICAgfHwKKwkJCSAgICAoKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UgPT0KKwkJCSAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKCpzdWJfb2JqZWN0X2xpc3QpKQorCQkJICAgICAmJiAoKCpzdWJfb2JqZWN0X2xpc3QpLT5yZWZlcmVuY2Uub3Bjb2RlID09CisJCQkJIEFNTF9JTlRfTkFNRVBBVEhfT1ApKSkgewogCQkJCW5hbWVfZm91bmQgPSBUUlVFOwotCQkJfQotCQkJZWxzZSB7CisJCQl9IGVsc2UgewogCQkJCS8qIExvb2sgYXQgdGhlIG5leHQgZWxlbWVudCAqLwogCiAJCQkJc3ViX29iamVjdF9saXN0Kys7CiAJCQl9CiAJCX0KIAotCQl0ZW1wX3NpemVfbmVlZGVkICs9IChzaXplb2YgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKSAtIDQpOworCQl0ZW1wX3NpemVfbmVlZGVkICs9IChzaXplb2Yoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpIC0gNCk7CiAKIAkJLyogV2FzIGEgU3RyaW5nIHR5cGUgZm91bmQ/ICovCiAKIAkJaWYgKG5hbWVfZm91bmQpIHsKLQkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkgPT0gQUNQSV9UWVBFX1NUUklORykgeworCQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKCpzdWJfb2JqZWN0X2xpc3QpID09CisJCQkgICAgQUNQSV9UWVBFX1NUUklORykgewogCQkJCS8qCiAJCQkJICogVGhlIGxlbmd0aCBTdHJpbmcuTGVuZ3RoIGZpZWxkIGRvZXMgbm90IGluY2x1ZGUgdGhlCiAJCQkJICogdGVybWluYXRpbmcgTlVMTCwgYWRkIDEKIAkJCQkgKi8KIAkJCQl0ZW1wX3NpemVfbmVlZGVkICs9ICgoYWNwaV9zaXplKQotCQkJCQkoKnN1Yl9vYmplY3RfbGlzdCktPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJCQkJCSAgICAgKCpzdWJfb2JqZWN0X2xpc3QpLT5zdHJpbmcuCisJCQkJCQkgICAgIGxlbmd0aCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wX3NpemVfbmVlZGVkICs9IGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCgoKnN1Yl9vYmplY3RfbGlzdCktPnJlZmVyZW5jZS5ub2RlKTsKIAkJCX0KLQkJCWVsc2UgewotCQkJCXRlbXBfc2l6ZV9uZWVkZWQgKz0gYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoICgKLQkJCQkJCSAgICgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLm5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIElmIG5vIG5hbWUgd2FzIGZvdW5kLCB0aGVuIHRoaXMgaXMgYSBOVUxMLCB3aGljaCBpcwogCQkJICogdHJhbnNsYXRlZCBhcyBhIHUzMiB6ZXJvLgogCQkJICovCi0JCQl0ZW1wX3NpemVfbmVlZGVkICs9IHNpemVvZiAodTMyKTsKKwkJCXRlbXBfc2l6ZV9uZWVkZWQgKz0gc2l6ZW9mKHUzMik7CiAJCX0KIAogCQkvKiBSb3VuZCB1cCB0aGUgc2l6ZSBzaW5jZSBlYWNoIGVsZW1lbnQgbXVzdCBiZSBhbGlnbmVkICovCiAKLQkJdGVtcF9zaXplX25lZWRlZCA9IEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyAodGVtcF9zaXplX25lZWRlZCk7CisJCXRlbXBfc2l6ZV9uZWVkZWQgPSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFModGVtcF9zaXplX25lZWRlZCk7CiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqLwogCkBAIC04MjYsNiArODEzLDcgQEAKIAkgKiBBZGRpbmcgYW4gZXh0cmEgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlc3NlbnRpYWxseSBhCiAJICogTlVMTCB0ZXJtaW5hdG9yCiAJICovCi0JKmJ1ZmZlcl9zaXplX25lZWRlZCA9IHRlbXBfc2l6ZV9uZWVkZWQgKyBzaXplb2YgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnVmZmVyX3NpemVfbmVlZGVkID0KKwkgICAgdGVtcF9zaXplX25lZWRlZCArIHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwppbmRleCA4ZTBlYWUwLi4wOTExNTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCkBAIC00MSwxNSArNDEsMTMgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNjcmVhdGUiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJyc2NyZWF0ZSIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjgsMjQgKzY2LDIwIEBACiAgKiAgICAgICAgICAgICAgb2YgZGV2aWNlIHJlc291cmNlcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpCithY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQogewogCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fc3RhcnQ7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3NpemVfbmVlZGVkID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGg7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICpieXRlX3N0cmVhbV9zdGFydDsKKwlhY3BpX3NpemUgbGlzdF9zaXplX25lZWRlZCA9IDA7CisJdTMyIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGg7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19jcmVhdGVfcmVzb3VyY2VfbGlzdCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2NyZWF0ZV9yZXNvdXJjZV9saXN0Iik7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJieXRlX3N0cmVhbV9idWZmZXIgPSAlcFxuIiwKLQkJYnl0ZV9zdHJlYW1fYnVmZmVyKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiYnl0ZV9zdHJlYW1fYnVmZmVyID0gJXBcbiIsCisJCQkgIGJ5dGVfc3RyZWFtX2J1ZmZlcikpOwogCiAJLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCiAKQEAgLTk2LDM2ICs5MCwzOSBAQAogCSAqIFBhc3MgdGhlIGJ5dGVfc3RyZWFtX2J1ZmZlciBpbnRvIGEgbW9kdWxlIHRoYXQgY2FuIGNhbGN1bGF0ZQogCSAqIHRoZSBidWZmZXIgc2l6ZSBuZWVkZWQgZm9yIHRoZSBsaW5rZWQgbGlzdAogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoIChieXRlX3N0cmVhbV9zdGFydCwgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKLQkJCSAmbGlzdF9zaXplX25lZWRlZCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgoYnl0ZV9zdHJlYW1fc3RhcnQsCisJCQkJICAgIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCisJCQkJICAgICZsaXN0X3NpemVfbmVlZGVkKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJTdGF0dXM9JVggbGlzdF9zaXplX25lZWRlZD0lWFxuIiwKLQkJc3RhdHVzLCAodTMyKSBsaXN0X3NpemVfbmVlZGVkKSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU3RhdHVzPSVYIGxpc3Rfc2l6ZV9uZWVkZWQ9JVhcbiIsCisJCQkgIHN0YXR1cywgKHUzMikgbGlzdF9zaXplX25lZWRlZCkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChvdXRwdXRfYnVmZmVyLCBsaXN0X3NpemVfbmVlZGVkKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKG91dHB1dF9idWZmZXIsIGxpc3Rfc2l6ZV9uZWVkZWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEbyB0aGUgY29udmVyc2lvbiAqLwogCi0Jc3RhdHVzID0gYWNwaV9yc19ieXRlX3N0cmVhbV90b19saXN0IChieXRlX3N0cmVhbV9zdGFydCwgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKLQkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9yc19ieXRlX3N0cmVhbV90b19saXN0KGJ5dGVfc3RyZWFtX3N0YXJ0LAorCQkJCQlieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLAorCQkJCQlvdXRwdXRfYnVmZmVyLT5wb2ludGVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAotCQkJb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAib3V0cHV0X2J1ZmZlciAlcCBMZW5ndGggJVhcbiIsCisJCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUKQEAgLTE0OCw0NCArMTQ1LDQxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqZWN0LAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpCithY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKKwkJCQkgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqdG9wX29iamVjdF9saXN0OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdWJfb2JqZWN0X2xpc3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZV9uZWVkZWQgPSAwOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2VsZW1lbnRzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0Jc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgICAqdXNlcl9wcnQ7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgIHBhdGhfYnVmZmVyOworCXU4ICpidWZmZXI7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRvcF9vYmplY3RfbGlzdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX29iamVjdF9saXN0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc2l6ZSBidWZmZXJfc2l6ZV9uZWVkZWQgPSAwOworCXUzMiBudW1iZXJfb2ZfZWxlbWVudHM7CisJdTMyIGluZGV4OworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICp1c2VyX3BydDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIHBhdGhfYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUiKTsKIAogCS8qIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZSAqLwogCiAJLyogR2V0IHRoZSByZXF1aXJlZCBidWZmZXIgbGVuZ3RoICovCiAKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGggKHBhY2thZ2Vfb2JqZWN0LAotCQkJICZidWZmZXJfc2l6ZV9uZWVkZWQpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aChwYWNrYWdlX29iamVjdCwKKwkJCQkJCSAgICAgICZidWZmZXJfc2l6ZV9uZWVkZWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiYnVmZmVyX3NpemVfbmVlZGVkID0gJVhcbiIsCi0JCSh1MzIpIGJ1ZmZlcl9zaXplX25lZWRlZCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImJ1ZmZlcl9zaXplX25lZWRlZCA9ICVYXG4iLAorCQkJICAodTMyKSBidWZmZXJfc2l6ZV9uZWVkZWQpKTsKIAogCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKG91dHB1dF9idWZmZXIsIGJ1ZmZlcl9zaXplX25lZWRlZCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBidWZmZXJfc2l6ZV9uZWVkZWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTkzLDEwICsxODcsMTAgQEAKIAkgKiBzaG91bGQgYmUgYSBwYWNrYWdlIHRoYXQgaW4gdHVybiBjb250YWlucyBhbgogCSAqIGFjcGlfaW50ZWdlciBBZGRyZXNzLCBhIHU4IFBpbiwgYSBOYW1lIGFuZCBhIHU4IHNvdXJjZV9pbmRleC4KIAkgKi8KLQl0b3Bfb2JqZWN0X2xpc3QgID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CisJdG9wX29iamVjdF9saXN0ID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CiAJbnVtYmVyX29mX2VsZW1lbnRzID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JYnVmZmVyICAgICAgICAgICA9IG91dHB1dF9idWZmZXItPnBvaW50ZXI7Ci0JdXNlcl9wcnQgICAgICAgICA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOworCWJ1ZmZlciA9IG91dHB1dF9idWZmZXItPnBvaW50ZXI7CisJdXNlcl9wcnQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVyX29mX2VsZW1lbnRzOyBpbmRleCsrKSB7CiAJCS8qCkBAIC0yMDYsMzEgKzIwMCwzNCBAQAogCQkgKiBiZSB6ZXJvIGJlY2F1c2Ugd2UgY2xlYXJlZCB0aGUgcmV0dXJuIGJ1ZmZlciBlYXJsaWVyCiAJCSAqLwogCQlidWZmZXIgKz0gdXNlcl9wcnQtPmxlbmd0aDsKLQkJdXNlcl9wcnQgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKKwkJdXNlcl9wcnQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOwogCiAJCS8qCiAJCSAqIEZpbGwgaW4gdGhlIExlbmd0aCBmaWVsZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGF0IHRoaXMgcG9pbnQuCiAJCSAqIFRoZSBtaW51cyBmb3VyIGlzIHRvIHN1YnRyYWN0IHRoZSBzaXplIG9mIHRoZSB1OCBTb3VyY2VbNF0gbWVtYmVyCiAJCSAqIGJlY2F1c2UgaXQgaXMgYWRkZWQgYmVsb3cuCiAJCSAqLwotCQl1c2VyX3BydC0+bGVuZ3RoID0gKHNpemVvZiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpIC0gNCk7CisJCXVzZXJfcHJ0LT5sZW5ndGggPSAoc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKSAtIDQpOwogCiAJCS8qIEVhY2ggZWxlbWVudCBvZiB0aGUgdG9wLWxldmVsIHBhY2thZ2UgbXVzdCBhbHNvIGJlIGEgcGFja2FnZSAqLwogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnRvcF9vYmplY3RfbGlzdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSIoUFJUWyVYXSkgTmVlZCBzdWItcGFja2FnZSwgZm91bmQgJXNcbiIsCi0JCQkJaW5kZXgsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKCp0b3Bfb2JqZWN0X2xpc3QpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnRvcF9vYmplY3RfbGlzdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIihQUlRbJVhdKSBOZWVkIHN1Yi1wYWNrYWdlLCBmb3VuZCAlc1xuIiwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgKCp0b3Bfb2JqZWN0X2xpc3QpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIAogCQkvKiBFYWNoIHN1Yi1wYWNrYWdlIG11c3QgYmUgb2YgbGVuZ3RoIDQgKi8KIAogCQlpZiAoKCp0b3Bfb2JqZWN0X2xpc3QpLT5wYWNrYWdlLmNvdW50ICE9IDQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSIoUFJUWyVYXSkgTmVlZCBwYWNrYWdlIG9mIGxlbmd0aCA0LCBmb3VuZCBsZW5ndGggJWRcbiIsCi0JCQkJaW5kZXgsICgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5jb3VudCkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfUEFDS0FHRV9MSU1JVCk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICIoUFJUWyVYXSkgTmVlZCBwYWNrYWdlIG9mIGxlbmd0aCA0LCBmb3VuZCBsZW5ndGggJWRcbiIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgKCp0b3Bfb2JqZWN0X2xpc3QpLT5wYWNrYWdlLmNvdW50KSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1BBQ0tBR0VfTElNSVQpOwogCQl9CiAKIAkJLyoKQEAgLTI0Myw0MCArMjQwLDQzIEBACiAJCS8qIDEpIEZpcnN0IHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5BZGRyZXNzICovCiAKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbMF07Ci0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5hZGRyZXNzID0gb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiKFBSVFslWF0uQWRkcmVzcykgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKLQkJCQlpbmRleCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIihQUlRbJVhdLkFkZHJlc3MpIE5lZWQgSW50ZWdlciwgZm91bmQgJXNcbiIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgIChvYmpfZGVzYykpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7CiAJCX0KIAogCQkvKiAyKSBTZWNvbmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULlBpbiAqLwogCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzFdOwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCQl1c2VyX3BydC0+cGluID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiKFBSVFslWF0uUGluKSBOZWVkIEludGVnZXIsIGZvdW5kICVzXG4iLAotCQkJCWluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiKFBSVFslWF0uUGluKSBOZWVkIEludGVnZXIsIGZvdW5kICVzXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAob2JqX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQl9CiAKIAkJLyogMykgVGhpcmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9uYW1lICovCiAKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbMl07Ci0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgeworCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSIoUFJUWyVYXS5Tb3VyY2UpIE5lZWQgbmFtZSwgZm91bmQgcmVmZXJlbmNlIG9wICVYXG4iLAotCQkJCQlpbmRleCwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiKFBSVFslWF0uU291cmNlKSBOZWVkIG5hbWUsIGZvdW5kIHJlZmVyZW5jZSBvcCAlWFxuIiwKKwkJCQkJCSAgaW5kZXgsCisJCQkJCQkgIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJCX0KIAogCQkJbm9kZSA9IG9ial9kZXNjLT5yZWZlcmVuY2Uubm9kZTsKQEAgLTI4NCwyMSArMjg0LDIzIEBACiAJCQkvKiBVc2UgKnJlbWFpbmluZyogbGVuZ3RoIG9mIHRoZSBidWZmZXIgYXMgbWF4IGZvciBwYXRobmFtZSAqLwogCiAJCQlwYXRoX2J1ZmZlci5sZW5ndGggPSBvdXRwdXRfYnVmZmVyLT5sZW5ndGggLQotCQkJCQkgICAodTMyKSAoKHU4ICopIHVzZXJfcHJ0LT5zb3VyY2UgLQotCQkJCQkgICAodTggKikgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CisJCQkgICAgKHUzMikgKCh1OCAqKSB1c2VyX3BydC0+c291cmNlIC0KKwkJCQkgICAodTggKikgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CiAJCQlwYXRoX2J1ZmZlci5wb2ludGVyID0gdXNlcl9wcnQtPnNvdXJjZTsKIAotCQkJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUgKChhY3BpX2hhbmRsZSkgbm9kZSwgJnBhdGhfYnVmZmVyKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoKGFjcGlfaGFuZGxlKSBub2RlLAorCQkJCQkJICAgICAgICZwYXRoX2J1ZmZlcik7CiAKIAkJCS8qICsxIHRvIGluY2x1ZGUgbnVsbCB0ZXJtaW5hdG9yICovCiAKLQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gKHUzMikgQUNQSV9TVFJMRU4gKHVzZXJfcHJ0LT5zb3VyY2UpICsgMTsKKwkJCXVzZXJfcHJ0LT5sZW5ndGggKz0KKwkJCSAgICAodTMyKSBBQ1BJX1NUUkxFTih1c2VyX3BydC0+c291cmNlKSArIDE7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQkJQUNQSV9TVFJDUFkgKHVzZXJfcHJ0LT5zb3VyY2UsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisJCQlBQ1BJX1NUUkNQWSh1c2VyX3BydC0+c291cmNlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOwogCiAJCQkvKgogCQkJICogQWRkIHRvIHRoZSBMZW5ndGggZmllbGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCkBAIC0zMDcsNyArMzA5LDYgQEAKIAkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCQkJLyoKIAkJCSAqIElmIHRoaXMgaXMgYSBudW1iZXIsIHRoZW4gdGhlIFNvdXJjZSBOYW1lIGlzIE5VTEwsIHNpbmNlIHRoZQpAQCAtMzE1LDMzICszMTYsMzYgQEAKIAkJCSAqCiAJCQkgKiBBZGQgdG8gdGhlIExlbmd0aCBmaWVsZCB0aGUgbGVuZ3RoIG9mIHRoZSB1MzIgTlVMTAogCQkJICovCi0JCQl1c2VyX3BydC0+bGVuZ3RoICs9IHNpemVvZiAodTMyKTsKKwkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gc2l6ZW9mKHUzMik7CiAJCQlicmVhazsKIAotCiAJCWRlZmF1bHQ6CiAKLQkJICAgQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkgICAiKFBSVFslWF0uU291cmNlKSBOZWVkIFJlZi9TdHJpbmcvSW50ZWdlciwgZm91bmQgJXNcbiIsCi0JCQkJaW5kZXgsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSkpOwotCQkgICByZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIihQUlRbJVhdLlNvdXJjZSkgTmVlZCBSZWYvU3RyaW5nL0ludGVnZXIsIGZvdW5kICVzXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAob2JqX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQl9CiAKIAkJLyogTm93IGFsaWduIHRoZSBjdXJyZW50IGxlbmd0aCAqLwogCi0JCXVzZXJfcHJ0LT5sZW5ndGggPSAodTMyKSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMgKHVzZXJfcHJ0LT5sZW5ndGgpOworCQl1c2VyX3BydC0+bGVuZ3RoID0KKwkJICAgICh1MzIpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyh1c2VyX3BydC0+bGVuZ3RoKTsKIAogCQkvKiA0KSBGb3VydGggc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9pbmRleCAqLwogCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzNdOwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCQl1c2VyX3BydC0+c291cmNlX2luZGV4ID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiKFBSVFslWF0uc291cmNlX2luZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzXG4iLAotCQkJCWluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiKFBSVFslWF0uc291cmNlX2luZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAob2JqX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQl9CiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCBpbiB0aGUgdG9wIGxldmVsIHBhY2thZ2UgKi8KQEAgLTM0OSwxMiArMzUzLDExIEBACiAJCXRvcF9vYmplY3RfbGlzdCsrOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJvdXRwdXRfYnVmZmVyICVwIExlbmd0aCAlWFxuIiwKLQkJCW91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAorCQkJICBvdXRwdXRfYnVmZmVyLT5wb2ludGVyLCAodTMyKSBvdXRwdXRfYnVmZmVyLT5sZW5ndGgpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY3JlYXRlX2J5dGVfc3RyZWFtCkBAIC0zNzQsMTkgKzM3NywxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX2J5dGVfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdF9idWZmZXIsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqb3V0cHV0X2J1ZmZlcikKK2FjcGlfcnNfY3JlYXRlX2J5dGVfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dF9idWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9zaXplX25lZWRlZCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc2l6ZSBieXRlX3N0cmVhbV9zaXplX25lZWRlZCA9IDA7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19jcmVhdGVfYnl0ZV9zdHJlYW0iKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19jcmVhdGVfYnl0ZV9zdHJlYW0iKTsKLQotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgImxpbmtlZF9saXN0X2J1ZmZlciA9ICVwXG4iLAotCQlsaW5rZWRfbGlzdF9idWZmZXIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJsaW5rZWRfbGlzdF9idWZmZXIgPSAlcFxuIiwKKwkJCSAgbGlua2VkX2xpc3RfYnVmZmVyKSk7CiAKIAkvKgogCSAqIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZQpAQCAtMzk0LDMyICszOTQsMzUgQEAKIAkgKiBQYXNzIHRoZSBsaW5rZWRfbGlzdF9idWZmZXIgaW50byBhIG1vZHVsZSB0aGF0IGNhbGN1bGF0ZXMKIAkgKiB0aGUgYnVmZmVyIHNpemUgbmVlZGVkIGZvciB0aGUgYnl0ZSBzdHJlYW0uCiAJICovCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoIChsaW5rZWRfbGlzdF9idWZmZXIsCi0JCQkgJmJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGgobGlua2VkX2xpc3RfYnVmZmVyLAorCQkJCQkJJmJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJieXRlX3N0cmVhbV9zaXplX25lZWRlZD0lWCwgJXNcbiIsCi0JCSh1MzIpIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJieXRlX3N0cmVhbV9zaXplX25lZWRlZD0lWCwgJXNcbiIsCisJCQkgICh1MzIpIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLAorCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyIChvdXRwdXRfYnVmZmVyLCBieXRlX3N0cmVhbV9zaXplX25lZWRlZCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBieXRlX3N0cmVhbV9zaXplX25lZWRlZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIERvIHRoZSBjb252ZXJzaW9uICovCiAKLQlzdGF0dXMgPSBhY3BpX3JzX2xpc3RfdG9fYnl0ZV9zdHJlYW0gKGxpbmtlZF9saXN0X2J1ZmZlciwgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQsCi0JCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfcnNfbGlzdF90b19ieXRlX3N0cmVhbShsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkJCWJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLAorCQkJCQlvdXRwdXRfYnVmZmVyLT5wb2ludGVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAotCQkJb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAib3V0cHV0X2J1ZmZlciAlcCBMZW5ndGggJVhcbiIsCisJCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCmluZGV4IDE5MzVkYWIuLjc1YmQzNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwpAQCAtNDEsNjkgKzQxLDQwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNkdW1wIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2lycSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczE2ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9hZGRyZXNzMzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3M2NCAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZG1hICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9pbyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZXh0ZW5kZWRfaXJxICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9maXhlZF9pbyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX21lbW9yeTI0ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9tZW1vcnkzMiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQorQUNQSV9NT0RVTEVfTkFNRSgicnNkdW1wIikKIAogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9pcnEodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3MxNih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzczMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzNjQodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2RtYSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfaW8odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZml4ZWRfaW8odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9tZW1vcnkyNCh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfbWVtb3J5MzIodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfaXJxCkBAIC0xMTYsMzkgKzg3LDM3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9pcnEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfaXJxKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgICAgICAgICppcnFfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKikgZGF0YTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKmlycV9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqKWRhdGE7CisJdTggaW5kZXggPSAwOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlhY3BpX29zX3ByaW50ZigiSVJRIFJlc291cmNlXG4iKTsKIAorCWFjcGlfb3NfcHJpbnRmKCIgICVzIFRyaWdnZXJlZFxuIiwKKwkJICAgICAgIEFDUElfTEVWRUxfU0VOU0lUSVZFID09CisJCSAgICAgICBpcnFfZGF0YS0+ZWRnZV9sZXZlbCA/ICJMZXZlbCIgOiAiRWRnZSIpOwogCi0JYWNwaV9vc19wcmludGYgKCJJUlEgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFjdGl2ZSAlc1xuIiwKKwkJICAgICAgIEFDUElfQUNUSVZFX0xPVyA9PQorCQkgICAgICAgaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/ICJMb3ciIDogIkhpZ2giKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICAlcyBUcmlnZ2VyZWRcbiIsCi0JCUFDUElfTEVWRUxfU0VOU0lUSVZFID09IGlycV9kYXRhLT5lZGdlX2xldmVsID8gIkxldmVsIiA6ICJFZGdlIik7CisJYWNwaV9vc19wcmludGYoIiAgJXNcbiIsCisJCSAgICAgICBBQ1BJX1NIQVJFRCA9PQorCQkgICAgICAgaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPyAiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBY3RpdmUgJXNcbiIsCi0JCUFDUElfQUNUSVZFX0xPVyA9PSBpcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8gIkxvdyIgOiAiSGlnaCIpOwotCi0JYWNwaV9vc19wcmludGYgKCIgICVzXG4iLAotCQlBQ1BJX1NIQVJFRCA9PSBpcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/ICJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOwotCi0JYWNwaV9vc19wcmludGYgKCIgICVYIEludGVycnVwdHMgKCAiLCBpcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHMpOworCWFjcGlfb3NfcHJpbnRmKCIgICVYIEludGVycnVwdHMgKCAiLCBpcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHMpOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpbmRleCsrKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiJVggIiwgaXJxX2RhdGEtPmludGVycnVwdHNbaW5kZXhdKTsKKwkJYWNwaV9vc19wcmludGYoIiVYICIsIGlycV9kYXRhLT5pbnRlcnJ1cHRzW2luZGV4XSk7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCIpXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiKVxuIik7CiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9kbWEKQEAgLTE2MSw3NSArMTMwLDY5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9kbWEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZG1hKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgICAgICAgICpkbWFfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgKikgZGF0YTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgKmRtYV9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSAqKWRhdGE7CisJdTggaW5kZXggPSAwOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JYWNwaV9vc19wcmludGYgKCJETUEgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCJETUEgUmVzb3VyY2VcbiIpOwogCiAJc3dpdGNoIChkbWFfZGF0YS0+dHlwZSkgewogCWNhc2UgQUNQSV9DT01QQVRJQklMSVRZOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgQ29tcGF0aWJpbGl0eSBtb2RlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgQ29tcGF0aWJpbGl0eSBtb2RlXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9BOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBBXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBBXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9COgotCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBCXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBCXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9GOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBGXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBGXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlhY3BpX29zX3ByaW50ZiAoIiAgSW52YWxpZCBETUEgdHlwZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIEludmFsaWQgRE1BIHR5cGVcbiIpOwogCQlicmVhazsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgJXNCdXMgTWFzdGVyXG4iLAotCQlBQ1BJX0JVU19NQVNURVIgPT0gZG1hX2RhdGEtPmJ1c19tYXN0ZXIgPyAiIiA6ICJOb3QgYSAiKTsKLQorCWFjcGlfb3NfcHJpbnRmKCIgICVzQnVzIE1hc3RlclxuIiwKKwkJICAgICAgIEFDUElfQlVTX01BU1RFUiA9PSBkbWFfZGF0YS0+YnVzX21hc3RlciA/ICIiIDogIk5vdCBhICIpOwogCiAJc3dpdGNoIChkbWFfZGF0YS0+dHJhbnNmZXIpIHsKIAljYXNlIEFDUElfVFJBTlNGRVJfODoKLQkJYWNwaV9vc19wcmludGYgKCIgIDgtYml0IG9ubHkgdHJhbnNmZXJcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICA4LWJpdCBvbmx5IHRyYW5zZmVyXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFJBTlNGRVJfOF8xNjoKLQkJYWNwaV9vc19wcmludGYgKCIgIDggYW5kIDE2LWJpdCB0cmFuc2ZlclxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIDggYW5kIDE2LWJpdCB0cmFuc2ZlclxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RSQU5TRkVSXzE2OgotCQlhY3BpX29zX3ByaW50ZiAoIiAgMTYgYml0IG9ubHkgdHJhbnNmZXJcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICAxNiBiaXQgb25seSB0cmFuc2ZlclxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYgKCIgIEludmFsaWQgdHJhbnNmZXIgcHJlZmVyZW5jZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIEludmFsaWQgdHJhbnNmZXIgcHJlZmVyZW5jZVxuIik7CiAJCWJyZWFrOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiICBOdW1iZXIgb2YgQ2hhbm5lbHM6ICVYICggIiwKLQkJZG1hX2RhdGEtPm51bWJlcl9vZl9jaGFubmVscyk7CisJYWNwaV9vc19wcmludGYoIiAgTnVtYmVyIG9mIENoYW5uZWxzOiAlWCAoICIsCisJCSAgICAgICBkbWFfZGF0YS0+bnVtYmVyX29mX2NoYW5uZWxzKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGRtYV9kYXRhLT5udW1iZXJfb2ZfY2hhbm5lbHM7IGluZGV4KyspIHsKLQkJYWNwaV9vc19wcmludGYgKCIlWCAiLCBkbWFfZGF0YS0+Y2hhbm5lbHNbaW5kZXhdKTsKKwkJYWNwaV9vc19wcmludGYoIiVYICIsIGRtYV9kYXRhLT5jaGFubmVsc1tpbmRleF0pOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiKVxuIik7CisJYWNwaV9vc19wcmludGYoIilcbiIpOwogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucwpAQCAtMjQyLDU4ICsyMDUsNTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2Zucyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmICpzZGZfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgKnNkZl9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZiAqKWRhdGE7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlhY3BpX29zX3ByaW50ZiAoIlN0YXJ0IERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCJTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlXG4iKTsKIAogCXN3aXRjaCAoc2RmX2RhdGEtPmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpIHsKIAljYXNlIEFDUElfR09PRF9DT05GSUdVUkFUSU9OOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgR29vZCBjb25maWd1cmF0aW9uXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgR29vZCBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgQWNjZXB0YWJsZSBjb25maWd1cmF0aW9uXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgQWNjZXB0YWJsZSBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfU1VCX09QVElNQUxfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYgKCIgIFN1Yi1vcHRpbWFsIGNvbmZpZ3VyYXRpb25cbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBTdWItb3B0aW1hbCBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlhY3BpX29zX3ByaW50ZiAoIiAgSW52YWxpZCBjb21wYXRpYmlsaXR5IHByaW9yaXR5XG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgSW52YWxpZCBjb21wYXRpYmlsaXR5IHByaW9yaXR5XG4iKTsKIAkJYnJlYWs7CiAJfQogCi0Jc3dpdGNoKHNkZl9kYXRhLT5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzKSB7CisJc3dpdGNoIChzZGZfZGF0YS0+cGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewogCWNhc2UgQUNQSV9HT09EX0NPTkZJR1VSQVRJT046Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBHb29kIGNvbmZpZ3VyYXRpb25cbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBHb29kIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT046Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBBY2NlcHRhYmxlIGNvbmZpZ3VyYXRpb25cbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBBY2NlcHRhYmxlIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TVUJfT1BUSU1BTF9DT05GSUdVUkFUSU9OOgotCQlhY3BpX29zX3ByaW50ZiAoIiAgU3ViLW9wdGltYWwgY29uZmlndXJhdGlvblxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFN1Yi1vcHRpbWFsIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBJbnZhbGlkIHBlcmZvcm1hbmNlIHJvYnVzdG5lc3MgcHJlZmVyZW5jZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIEludmFsaWQgcGVyZm9ybWFuY2Ugcm9idXN0bmVzcyBwcmVmZXJlbmNlXG4iKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9pbwpAQCAtMzA2LDMzICsyNjUsMzAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2lvICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2lvKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAgICAgICAgICppb19kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8gKmlvX2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8gKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlhY3BpX29zX3ByaW50ZigiSW8gUmVzb3VyY2VcbiIpOwogCisJYWNwaV9vc19wcmludGYoIiAgJWQgYml0IGRlY29kZVxuIiwKKwkJICAgICAgIEFDUElfREVDT0RFXzE2ID09IGlvX2RhdGEtPmlvX2RlY29kZSA/IDE2IDogMTApOwogCi0JYWNwaV9vc19wcmludGYgKCJJbyBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAorCQkgICAgICAgaW9fZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgJWQgYml0IGRlY29kZVxuIiwKLQkJQUNQSV9ERUNPREVfMTYgPT0gaW9fZGF0YS0+aW9fZGVjb2RlID8gMTYgOiAxMCk7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAorCQkgICAgICAgaW9fZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLCBpb19kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKKwlhY3BpX29zX3ByaW50ZigiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIGlvX2RhdGEtPmFsaWdubWVudCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLCBpb19kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIGlvX2RhdGEtPmFsaWdubWVudCk7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgTGVuZ3RoOiAlMDhYXG4iLCBpb19kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIExlbmd0aDogJTA4WFxuIiwgaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfZml4ZWRfaW8KQEAgLTM0NSwyNSArMzAxLDIyIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9maXhlZF9pbyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9maXhlZF9pbyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gICAqZml4ZWRfaW9fZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqKSBkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICpmaXhlZF9pb19kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICopZGF0YTsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIkZpeGVkIElvIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFgiLAorCQkgICAgICAgZml4ZWRfaW9fZGF0YS0+YmFzZV9hZGRyZXNzKTsKIAotCi0JYWNwaV9vc19wcmludGYgKCJGaXhlZCBJbyBSZXNvdXJjZVxuIik7Ci0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGJhc2UgYWRkcmVzczogJTA4WCIsIGZpeGVkX2lvX2RhdGEtPmJhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYIiwgZml4ZWRfaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBsZW5ndGg6ICUwOFgiLCBmaXhlZF9pb19kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMKQEAgLTM3NiwzMCArMzI5LDI2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgICAgICp2ZW5kb3JfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgKikgZGF0YTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgKnZlbmRvcl9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciAqKWRhdGE7CisJdTE2IGluZGV4ID0gMDsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIlZlbmRvciBTcGVjaWZpYyBSZXNvdXJjZVxuIik7CiAKLQotCWFjcGlfb3NfcHJpbnRmICgiVmVuZG9yIFNwZWNpZmljIFJlc291cmNlXG4iKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBMZW5ndGg6ICUwOFhcbiIsIHZlbmRvcl9kYXRhLT5sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmKCIgIExlbmd0aDogJTA4WFxuIiwgdmVuZG9yX2RhdGEtPmxlbmd0aCk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZW5kb3JfZGF0YS0+bGVuZ3RoOyBpbmRleCsrKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBCeXRlICVYOiAlMDhYXG4iLAotCQkJaW5kZXgsIHZlbmRvcl9kYXRhLT5yZXNlcnZlZFtpbmRleF0pOworCQlhY3BpX29zX3ByaW50ZigiICBCeXRlICVYOiAlMDhYXG4iLAorCQkJICAgICAgIGluZGV4LCB2ZW5kb3JfZGF0YS0+cmVzZXJ2ZWRbaW5kZXhdKTsKIAl9CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX21lbW9yeTI0CkBAIC00MTIsMzcgKzM2MSwzMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfbWVtb3J5MjQgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfbWVtb3J5MjQodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0ICAgICAgKm1lbW9yeTI0X2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCAqbWVtb3J5MjRfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCAqKWRhdGE7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCWFjcGlfb3NfcHJpbnRmKCIyNC1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKIAorCWFjcGlfb3NfcHJpbnRmKCIgIFJlYWQlc1xuIiwKKwkJICAgICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJICAgICAgIG1lbW9yeTI0X2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KKwkJICAgICAgICIvV3JpdGUiIDogIiBvbmx5Iik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIjI0LUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKKwkJICAgICAgIG1lbW9yeTI0X2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJlYWQlc1xuIiwKLQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJbWVtb3J5MjRfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJIi9Xcml0ZSIgOiAiIG9ubHkiKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCisJCSAgICAgICBtZW1vcnkyNF9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsCi0JCW1lbW9yeTI0X2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFsaWdubWVudDogJTA4WFxuIiwgbWVtb3J5MjRfZGF0YS0+YWxpZ25tZW50KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCi0JCW1lbW9yeTI0X2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwgbWVtb3J5MjRfZGF0YS0+YWxpZ25tZW50KTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLCBtZW1vcnkyNF9kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9tZW1vcnkzMgpAQCAtNDU1LDM3ICs0MDAsMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX21lbW9yeTMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX21lbW9yeTMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiAgICAgICptZW1vcnkzMl9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIgKm1lbW9yeTMyX2RhdGEgPQorCSAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIgKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlhY3BpX29zX3ByaW50ZigiMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7CiAKKwlhY3BpX29zX3ByaW50ZigiICBSZWFkJXNcbiIsCisJCSAgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09CisJCSAgICAgICBtZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCSAgICAgICAiL1dyaXRlIiA6ICIgb25seSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIzMi1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsCisJCSAgICAgICBtZW1vcnkzMl9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSZWFkJXNcbiIsCi0JCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCW1lbW9yeTMyX2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSIvV3JpdGUiIDogIiBvbmx5Iik7CisJYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAorCQkgICAgICAgbWVtb3J5MzJfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQltZW1vcnkzMl9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKKwlhY3BpX29zX3ByaW50ZigiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTMyX2RhdGEtPmFsaWdubWVudCk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAotCQltZW1vcnkzMl9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTMyX2RhdGEtPmFsaWdubWVudCk7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLCBtZW1vcnkzMl9kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwgbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIKQEAgLTQ5OCwzMyArNDM5LDI5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAgICAgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICAgICpmaXhlZF9tZW1vcnkzMl9kYXRhID0KLQkJCSAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiAqKSBkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICpmaXhlZF9tZW1vcnkzMl9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICopZGF0YTsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIjMyLUJpdCBGaXhlZCBMb2NhdGlvbiBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwogCisJYWNwaV9vc19wcmludGYoIiAgUmVhZCVzXG4iLAorCQkgICAgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkgICAgICAgZml4ZWRfbWVtb3J5MzJfZGF0YS0+CisJCSAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIjMyLUJpdCBGaXhlZCBMb2NhdGlvbiBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIGJhc2UgYWRkcmVzczogJTA4WFxuIiwKKwkJICAgICAgIGZpeGVkX21lbW9yeTMyX2RhdGEtPnJhbmdlX2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmVhZCVzXG4iLAotCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQlmaXhlZF9tZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7Ci0KLQlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgYmFzZSBhZGRyZXNzOiAlMDhYXG4iLAotCQlmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9iYXNlX2FkZHJlc3MpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwKLQkJZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsCisJCSAgICAgICBmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9hZGRyZXNzMTYKQEAgLTUzNywxMzQgKzQ3NCwxMzYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzMTYodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqYWRkcmVzczE2X2RhdGEgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICphZGRyZXNzMTZfZGF0YSA9CisJICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKilkYXRhOwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JYWNwaV9vc19wcmludGYgKCIxNi1CaXQgQWRkcmVzcyBTcGFjZSBSZXNvdXJjZVxuIik7Ci0JYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6ICIpOworCWFjcGlfb3NfcHJpbnRmKCIxNi1CaXQgQWRkcmVzcyBTcGFjZSBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogIik7CiAKIAlzd2l0Y2ggKGFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV90eXBlKSB7CiAJY2FzZSBBQ1BJX01FTU9SWV9SQU5HRToKIAotCQlhY3BpX29zX3ByaW50ZiAoIk1lbW9yeSBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJNZW1vcnkgUmFuZ2VcbiIpOwogCiAJCXN3aXRjaCAoYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9QUkVGRVRDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKLQkJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCQlhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAorCQkJICAgICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KKwkJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS4KKwkJCSAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0lPX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmICgiSS9PIFJhbmdlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIkkvTyBSYW5nZVxuIik7CiAKIAkJc3dpdGNoIChhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfRU5USVJFX1JBTkdFOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgcmFuZ2UgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgcmFuZ2UgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAotCQkJQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCQlhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/Ci0JCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCisJCQkgICAgICAgQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KKwkJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLgorCQkJICAgICAgIHRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/ICJTcGFyc2UiIDogIkRlbnNlIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCJCdXMgTnVtYmVyIFJhbmdlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIkJ1cyBOdW1iZXIgUmFuZ2VcbiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAKLQkJYWNwaV9vc19wcmludGYgKCIweCUyLjJYXG4iLCBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CisJCWFjcGlfb3NfcHJpbnRmKCIweCUyLjJYXG4iLCBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMTZfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlICVzXG4iLAorCQkgICAgICAgQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMTZfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkgICAgICAgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgICVzIGRlY29kZVxuIiwKLQkJQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MxNl9kYXRhLT5kZWNvZGUgPwotCQkJIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOworCWFjcGlfb3NfcHJpbnRmKCIgICVzIGRlY29kZVxuIiwKKwkJICAgICAgIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMTZfZGF0YS0+ZGVjb2RlID8KKwkJICAgICAgICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCQkiIiA6ICJub3QiKTsKKwlhY3BpX29zX3ByaW50ZigiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKKwkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPworCQkgICAgICAgIiIgOiAibm90Iik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMTZfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPwotCQkJIiIgOiAibm90Iik7CisJYWNwaV9vc19wcmludGYoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCisJCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KKwkJICAgICAgICIiIDogIm5vdCIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEdyYW51bGFyaXR5OiAlMDhYXG4iLAotCQlhZGRyZXNzMTZfZGF0YS0+Z3JhbnVsYXJpdHkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEdyYW51bGFyaXR5OiAlMDhYXG4iLCBhZGRyZXNzMTZfZGF0YS0+Z3JhbnVsYXJpdHkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlMDhYXG4iLAotCQlhZGRyZXNzMTZfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlMDhYXG4iLAorCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKLQkJYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKKwkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICUwOFhcbiIsCi0JCWFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJYWNwaV9vc19wcmludGYoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICUwOFhcbiIsCisJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgTGVuZ3RoOiAlMDhYXG4iLAotCQlhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc19sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgTGVuZ3RoOiAlMDhYXG4iLAorCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKIAogCWlmICgweEZGICE9IGFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQlhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKKwkJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCWFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCisJCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2FkZHJlc3MzMgpAQCAtNjc3LDEzNCArNjE2LDEzNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczMyICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3MzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICphZGRyZXNzMzJfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKmFkZHJlc3MzMl9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqKWRhdGE7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlhY3BpX29zX3ByaW50ZiAoIjMyLUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiMzItQml0IEFkZHJlc3MgU3BhY2UgUmVzb3VyY2VcbiIpOwogCiAJc3dpdGNoIChhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2VfdHlwZSkgewogCWNhc2UgQUNQSV9NRU1PUllfUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IE1lbW9yeSBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IE1lbW9yeSBSYW5nZVxuIik7CiAKIAkJc3dpdGNoIChhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAotCQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJCWFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCQkiL1dyaXRlIiA6ICIgT25seSIpOworCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBSZWFkJXNcbiIsCisJCQkgICAgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LgorCQkJICAgICAgIHJlYWRfd3JpdGVfYXR0cmlidXRlID8gIi9Xcml0ZSIgOiAiIE9ubHkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfSU9fUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IElvIFJhbmdlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogSW8gUmFuZ2VcbiIpOwogCiAJCXN3aXRjaCAoYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAotCQkJQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCQlhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/Ci0JCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCisJCQkgICAgICAgQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KKwkJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLmlvLgorCQkJICAgICAgIHRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/ICJTcGFyc2UiIDogIkRlbnNlIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IEJ1cyBOdW1iZXIgUmFuZ2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBCdXMgTnVtYmVyIFJhbmdlXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLAotCQkJYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3R5cGUpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLAorCQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV90eXBlKTsKIAkJYnJlYWs7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQlBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3MzMl9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/Ci0JCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CisJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgJXNcbiIsCisJCSAgICAgICBBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3MzMl9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCSAgICAgICAiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgJXMgZGVjb2RlXG4iLAotCQlBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczMyX2RhdGEtPmRlY29kZSA/Ci0JCQkiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CisJYWNwaV9vc19wcmludGYoIiAgJXMgZGVjb2RlXG4iLAorCQkgICAgICAgQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MzMl9kYXRhLT5kZWNvZGUgPworCQkgICAgICAgIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KLQkJCSIiIDogIm5vdCAiKTsKKwlhY3BpX29zX3ByaW50ZigiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKKwkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPworCQkgICAgICAgIiIgOiAibm90ICIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJCSIiIDogIm5vdCAiKTsKKwlhY3BpX29zX3ByaW50ZigiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKKwkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPworCQkgICAgICAgIiIgOiAibm90ICIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEdyYW51bGFyaXR5OiAlMDhYXG4iLAotCQlhZGRyZXNzMzJfZGF0YS0+Z3JhbnVsYXJpdHkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEdyYW51bGFyaXR5OiAlMDhYXG4iLCBhZGRyZXNzMzJfZGF0YS0+Z3JhbnVsYXJpdHkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlMDhYXG4iLAotCQlhZGRyZXNzMzJfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlMDhYXG4iLAorCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPm1pbl9hZGRyZXNzX3JhbmdlKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKLQkJYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKTsKKwlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKKwkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICUwOFhcbiIsCi0JCWFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJYWNwaV9vc19wcmludGYoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICUwOFhcbiIsCisJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgTGVuZ3RoOiAlMDhYXG4iLAotCQlhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc19sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgTGVuZ3RoOiAlMDhYXG4iLAorCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPmFkZHJlc3NfbGVuZ3RoKTsKIAotCWlmKDB4RkYgIT0gYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKLQkJCWFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCWlmICgweEZGICE9IGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKKwkJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCWFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCisJCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2FkZHJlc3M2NApAQCAtODE3LDEzNyArNzU4LDE0MiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczY0ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3M2NCh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICphZGRyZXNzNjRfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgKikgZGF0YTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgKmFkZHJlc3M2NF9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqKWRhdGE7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlhY3BpX29zX3ByaW50ZiAoIjY0LUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKKwlhY3BpX29zX3ByaW50ZigiNjQtQml0IEFkZHJlc3MgU3BhY2UgUmVzb3VyY2VcbiIpOwogCiAJc3dpdGNoIChhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2VfdHlwZSkgewogCWNhc2UgQUNQSV9NRU1PUllfUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IE1lbW9yeSBSYW5nZVxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IE1lbW9yeSBSYW5nZVxuIik7CiAKIAkJc3dpdGNoIChhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAotCQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJCWFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCQkiL1dyaXRlIiA6ICIgT25seSIpOworCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBSZWFkJXNcbiIsCisJCQkgICAgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkJICAgICAgIGFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LgorCQkJICAgICAgIHJlYWRfd3JpdGVfYXR0cmlidXRlID8gIi9Xcml0ZSIgOiAiIE9ubHkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfSU9fUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IElvIFJhbmdlXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgVHlwZTogSW8gUmFuZ2VcbiIpOwogCiAJCXN3aXRjaCAoYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAotCQkJQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCQlhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/Ci0JCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKKwkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCisJCQkgICAgICAgQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KKwkJCSAgICAgICBhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLmlvLgorCQkJICAgICAgIHRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/ICJTcGFyc2UiIDogIkRlbnNlIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CiAKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFR5cGU6IEJ1cyBOdW1iZXIgUmFuZ2VcbiIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBCdXMgTnVtYmVyIFJhbmdlXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLAotCQkJYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3R5cGUpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLAorCQkJICAgICAgIGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV90eXBlKTsKIAkJYnJlYWs7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQlBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3M2NF9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/Ci0JCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CisJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgJXNcbiIsCisJCSAgICAgICBBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3M2NF9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCSAgICAgICAiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgJXMgZGVjb2RlXG4iLAotCQlBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczY0X2RhdGEtPmRlY29kZSA/Ci0JCQkiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CisJYWNwaV9vc19wcmludGYoIiAgJXMgZGVjb2RlXG4iLAorCQkgICAgICAgQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3M2NF9kYXRhLT5kZWNvZGUgPworCQkgICAgICAgIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KLQkJCSIiIDogIm5vdCAiKTsKKwlhY3BpX29zX3ByaW50ZigiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKKwkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPworCQkgICAgICAgIiIgOiAibm90ICIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIE1heCBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJCSIiIDogIm5vdCAiKTsKKwlhY3BpX29zX3ByaW50ZigiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKKwkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPworCQkgICAgICAgIiIgOiAibm90ICIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEdyYW51bGFyaXR5OiAlOC44WCU4LjhYXG4iLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5ncmFudWxhcml0eSkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEdyYW51bGFyaXR5OiAlOC44WCU4LjhYXG4iLAorCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT5ncmFudWxhcml0eSkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlOC44WCU4LjhYXG4iLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlOC44WCU4LjhYXG4iLAorCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWF4OiAlOC44WCU4LjhYXG4iLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgcmFuZ2UgbWF4OiAlOC44WCU4LjhYXG4iLAorCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlOC44WCU4LjhYXG4iLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlOC44WCU4LjhYXG4iLAorCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT4KKwkJCQkJICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgTGVuZ3RoOiAlOC44WCU4LjhYXG4iLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX2xlbmd0aCkpOworCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgTGVuZ3RoOiAlOC44WCU4LjhYXG4iLAorCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT5hZGRyZXNzX2xlbmd0aCkpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWMgQXR0cmlidXRlczogJTguOFglOC44WFxuIiwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+dHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzKSk7CisJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYyBBdHRyaWJ1dGVzOiAlOC44WCU4LjhYXG4iLAorCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT4KKwkJCQkJICB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMpKTsKIAogCWlmICgweEZGICE9IGFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKLQkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQlhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKKwkJCSAgICAgICBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCWFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCisJCQkgICAgICAgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycQpAQCAtOTYwLDU1ICs5MDYsNTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgICAgKmV4dF9pcnFfZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICopIGRhdGE7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqZXh0X2lycV9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKilkYXRhOworCXU4IGluZGV4ID0gMDsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJYWNwaV9vc19wcmludGYoIkV4dGVuZGVkIElSUSBSZXNvdXJjZVxuIik7CiAKKwlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSAlc1xuIiwKKwkJICAgICAgIEFDUElfQ09OU1VNRVIgPT0gZXh0X2lycV9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CisJCSAgICAgICAiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIkV4dGVuZGVkIElSUSBSZXNvdXJjZVxuIik7CisJYWNwaV9vc19wcmludGYoIiAgJXNcbiIsCisJCSAgICAgICBBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBleHRfaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPworCQkgICAgICAgIkxldmVsIiA6ICJFZGdlIik7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCUFDUElfQ09OU1VNRVIgPT0gZXh0X2lycV9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/Ci0JCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CisJYWNwaV9vc19wcmludGYoIiAgQWN0aXZlICVzXG4iLAorCQkgICAgICAgQUNQSV9BQ1RJVkVfTE9XID09IGV4dF9pcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8KKwkJICAgICAgICJsb3ciIDogImhpZ2giKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICAlc1xuIiwKLQkJQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0gZXh0X2lycV9kYXRhLT5lZGdlX2xldmVsID8KLQkJCSJMZXZlbCIgOiAiRWRnZSIpOworCWFjcGlfb3NfcHJpbnRmKCIgICVzXG4iLAorCQkgICAgICAgQUNQSV9TSEFSRUQgPT0gZXh0X2lycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8KKwkJICAgICAgICJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIEFjdGl2ZSAlc1xuIiwKLQkJQUNQSV9BQ1RJVkVfTE9XID09IGV4dF9pcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8KLQkJCSJsb3ciIDogImhpZ2giKTsKLQotCWFjcGlfb3NfcHJpbnRmICgiICAlc1xuIiwKLQkJQUNQSV9TSEFSRUQgPT0gZXh0X2lycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8KLQkJCSJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOwotCi0JYWNwaV9vc19wcmludGYgKCIgIEludGVycnVwdHMgOiAlWCAoICIsIGV4dF9pcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHMpOworCWFjcGlfb3NfcHJpbnRmKCIgIEludGVycnVwdHMgOiAlWCAoICIsCisJCSAgICAgICBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGV4dF9pcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHM7IGluZGV4KyspIHsKLQkJYWNwaV9vc19wcmludGYgKCIlWCAiLCBleHRfaXJxX2RhdGEtPmludGVycnVwdHNbaW5kZXhdKTsKKwkJYWNwaV9vc19wcmludGYoIiVYICIsIGV4dF9pcnFfZGF0YS0+aW50ZXJydXB0c1tpbmRleF0pOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiKVxuIik7CisJYWNwaV9vc19wcmludGYoIilcbiIpOwogCi0JaWYoMHhGRiAhPSBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWCIsCi0JCQlleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJaWYgKDB4RkYgIT0gZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKKwkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWCIsCisJCQkgICAgICAgZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOwogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2U6ICVzIiwKLQkJCWV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBTb3VyY2U6ICVzIiwKKwkJCSAgICAgICBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX3Jlc291cmNlX2xpc3QKQEAgLTEwMjEsOTIgKzk2NCw5MSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0ICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgKnJlc291cmNlKQordm9pZCBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IEZBTFNFOworCXU4IGNvdW50ID0gMDsKKwl1OCBkb25lID0gRkFMU0U7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlpZiAoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX1JFU09VUkNFUyAmJiBfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpIHsKIAkJd2hpbGUgKCFkb25lKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlJlc291cmNlIHN0cnVjdHVyZSAlWC5cbiIsIGNvdW50KyspOworCQkJYWNwaV9vc19wcmludGYoIlJlc291cmNlIHN0cnVjdHVyZSAlWC5cbiIsIGNvdW50KyspOwogCiAJCQlzd2l0Y2ggKHJlc291cmNlLT5pZCkgewogCQkJY2FzZSBBQ1BJX1JTVFlQRV9JUlE6Ci0JCQkJYWNwaV9yc19kdW1wX2lycSAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfaXJxKCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfRE1BOgotCQkJCWFjcGlfcnNfZHVtcF9kbWEgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX2RtYSgmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX1NUQVJUX0RQRjoKLQkJCQlhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucyAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucygmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0VORF9EUEY6Ci0JCQkJYWNwaV9vc19wcmludGYgKCJlbmRfZGVwZW5kZW50X2Z1bmN0aW9ucyBSZXNvdXJjZVxuIik7Ci0JCQkJLyogYWNwaV9yc19kdW1wX2VuZF9kZXBlbmRlbnRfZnVuY3Rpb25zIChSZXNvdXJjZS0+RGF0YSk7Ki8KKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoImVuZF9kZXBlbmRlbnRfZnVuY3Rpb25zIFJlc291cmNlXG4iKTsKKwkJCQkvKiBhY3BpX3JzX2R1bXBfZW5kX2RlcGVuZGVudF9mdW5jdGlvbnMgKFJlc291cmNlLT5EYXRhKTsgKi8KIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9JTzoKLQkJCQlhY3BpX3JzX2R1bXBfaW8gKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX2lvKCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfSU86Ci0JCQkJYWNwaV9yc19kdW1wX2ZpeGVkX2lvICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9maXhlZF9pbygmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX1ZFTkRPUjoKLQkJCQlhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfVEFHOgotCQkJCS8qcnNfZHVtcF9lbmRfdGFnIChSZXNvdXJjZS0+RGF0YSk7Ki8KLQkJCQlhY3BpX29zX3ByaW50ZiAoImVuZF90YWcgUmVzb3VyY2VcbiIpOworCQkJCS8qcnNfZHVtcF9lbmRfdGFnIChSZXNvdXJjZS0+RGF0YSk7ICovCisJCQkJYWNwaV9vc19wcmludGYoImVuZF90YWcgUmVzb3VyY2VcbiIpOwogCQkJCWRvbmUgPSBUUlVFOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX01FTTI0OgotCQkJCWFjcGlfcnNfZHVtcF9tZW1vcnkyNCAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfbWVtb3J5MjQoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9NRU0zMjoKLQkJCQlhY3BpX3JzX2R1bXBfbWVtb3J5MzIgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX21lbW9yeTMyKCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfTUVNMzI6Ci0JCQkJYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMigmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKLQkJCQlhY3BpX3JzX2R1bXBfYWRkcmVzczE2ICgmcmVzb3VyY2UtPmRhdGEpOworCQkJCWFjcGlfcnNfZHVtcF9hZGRyZXNzMTYoJnJlc291cmNlLT5kYXRhKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI6Ci0JCQkJYWNwaV9yc19kdW1wX2FkZHJlc3MzMiAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfYWRkcmVzczMyKCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzY0OgotCQkJCWFjcGlfcnNfZHVtcF9hZGRyZXNzNjQgKCZyZXNvdXJjZS0+ZGF0YSk7CisJCQkJYWNwaV9yc19kdW1wX2FkZHJlc3M2NCgmcmVzb3VyY2UtPmRhdGEpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JCQkJYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSAoJnJlc291cmNlLT5kYXRhKTsKKwkJCQlhY3BpX3JzX2R1bXBfZXh0ZW5kZWRfaXJxKCZyZXNvdXJjZS0+ZGF0YSk7CiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJYWNwaV9vc19wcmludGYgKCJJbnZhbGlkIHJlc291cmNlIHR5cGVcbiIpOworCQkJCWFjcGlfb3NfcHJpbnRmKCJJbnZhbGlkIHJlc291cmNlIHR5cGVcbiIpOwogCQkJCWJyZWFrOwogCiAJCQl9CiAKLQkJCXJlc291cmNlID0gQUNQSV9QVFJfQUREIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2UsIHJlc291cmNlLT5sZW5ndGgpOworCQkJcmVzb3VyY2UgPQorCQkJICAgIEFDUElfUFRSX0FERChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2UsCisJCQkJCSByZXNvdXJjZS0+bGVuZ3RoKTsKIAkJfQogCX0KIApAQCAtMTEyNSwzNiArMTA2NywzOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfcnNfZHVtcF9pcnFfbGlzdCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcm91dGVfdGFibGUpCit2b2lkIGFjcGlfcnNfZHVtcF9pcnFfbGlzdCh1OCAqIHJvdXRlX3RhYmxlKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJvdXRlX3RhYmxlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IEZBTFNFOwotCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICAgKnBydF9lbGVtZW50OworCXU4ICpidWZmZXIgPSByb3V0ZV90YWJsZTsKKwl1OCBjb3VudCA9IDA7CisJdTggZG9uZSA9IEZBTFNFOworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnRfZWxlbWVudDsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmIChhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfUkVTT1VSQ0VTICYmIF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikgewotCQlwcnRfZWxlbWVudCA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOworCQlwcnRfZWxlbWVudCA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOwogCiAJCXdoaWxlICghZG9uZSkgewotCQkJYWNwaV9vc19wcmludGYgKCJQQ0kgSVJRIFJvdXRpbmcgVGFibGUgc3RydWN0dXJlICVYLlxuIiwgY291bnQrKyk7CisJCQlhY3BpX29zX3ByaW50ZigiUENJIElSUSBSb3V0aW5nIFRhYmxlIHN0cnVjdHVyZSAlWC5cbiIsCisJCQkJICAgICAgIGNvdW50KyspOwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzczogJTguOFglOC44WFxuIiwKLQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKHBydF9lbGVtZW50LT5hZGRyZXNzKSk7CisJCQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzOiAlOC44WCU4LjhYXG4iLAorCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQocHJ0X2VsZW1lbnQtPgorCQkJCQkJCSAgYWRkcmVzcykpOwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIiAgUGluOiAlWFxuIiwgcHJ0X2VsZW1lbnQtPnBpbik7CisJCQlhY3BpX29zX3ByaW50ZigiICBQaW46ICVYXG4iLCBwcnRfZWxlbWVudC0+cGluKTsKIAotCQkJYWNwaV9vc19wcmludGYgKCIgIFNvdXJjZTogJXNcbiIsIHBydF9lbGVtZW50LT5zb3VyY2UpOworCQkJYWNwaV9vc19wcmludGYoIiAgU291cmNlOiAlc1xuIiwgcHJ0X2VsZW1lbnQtPnNvdXJjZSk7CiAKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBzb3VyY2VfaW5kZXg6ICVYXG4iLCBwcnRfZWxlbWVudC0+c291cmNlX2luZGV4KTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgIHNvdXJjZV9pbmRleDogJVhcbiIsCisJCQkJICAgICAgIHBydF9lbGVtZW50LT5zb3VyY2VfaW5kZXgpOwogCiAJCQlidWZmZXIgKz0gcHJ0X2VsZW1lbnQtPmxlbmd0aDsKLQkJCXBydF9lbGVtZW50ID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsIGJ1ZmZlcik7CisJCQlwcnRfZWxlbWVudCA9CisJCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwKKwkJCQkJICBidWZmZXIpOwogCQkJaWYgKDAgPT0gcHJ0X2VsZW1lbnQtPmxlbmd0aCkgewogCQkJCWRvbmUgPSBUUlVFOwogCQkJfQpAQCAtMTE2NSw0ICsxMTA5LDMgQEAKIH0KIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKaW5kZXggMjNhNGQxNC4uZDUzYmJlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKQEAgLTQxLDEzICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzaW8iKQotCitBQ1BJX01PRFVMRV9OQU1FKCJyc2lvIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OSwyNCArNjcsMTggQEAKICAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaW9fcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfaW9fcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCSAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCi0JCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKTsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfaW9fcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2lvX3Jlc291cmNlIik7CiAKIAkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudCAqLwogCkBAIC0xMDQsMTQgKzk2LDE0IEBACiAJLyogQ2hlY2sgbWluX2Jhc2UgQWRkcmVzcyAqLwogCiAJYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5taW5fYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCiAJLyogQ2hlY2sgbWF4X2Jhc2UgQWRkcmVzcyAqLwogCiAJYnVmZmVyICs9IDI7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5tYXhfYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCkBAIC0xMzYsMTAgKzEyOCw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZQpAQCAtMTYyLDIyICsxNTMsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX2lvX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2ZpeGVkX2lvX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8pOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9pb19yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZml4ZWRfaW9fcmVzb3VyY2UiKTsKIAogCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50ICovCiAKQEAgLTE4OCw3ICsxNzUsNyBAQAogCS8qIENoZWNrIFJhbmdlIEJhc2UgQWRkcmVzcyAqLwogCiAJYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9pby5iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKQEAgLTIwNiwxMCArMTkzLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2lvX3N0cmVhbQpAQCAtMjI3LDE4ICsyMTMsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2lvX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2lvX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19pb19zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2lvX3N0cmVhbSIpOwogCiAJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCiAKQEAgLTI1NiwxNCArMjM4LDE0IEBACiAKIAl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5pby5taW5fYmFzZV9hZGRyZXNzOwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOworCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcyAqLwogCiAJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuaW8ubWF4X2Jhc2VfYWRkcmVzczsKIAotCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQgKi8KQEAgLTI4MiwxMSArMjY0LDEwIEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZml4ZWRfaW9fc3RyZWFtCkBAIC0zMDQsMTggKzI4NSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfaW9fc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfZml4ZWRfaW9fc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfaW9fc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19maXhlZF9pb19zdHJlYW0iKTsKIAogCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwogCkBAIC0zMjcsNyArMzA0LDcgQEAKIAogCXRlbXAxNiA9ICh1MTYpIGxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX2lvLmJhc2VfYWRkcmVzczsKIAotCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCkBAIC0zMzksMTEgKzMxNiwxMCBAQAogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RtYV9yZXNvdXJjZQpAQCAtMzY2LDIzICszNDIsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2RtYV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19kbWFfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCSAgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCSAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEpOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXU4IHRlbXA4ID0gMDsKKwl1OCBpbmRleDsKKwl1OCBpOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19kbWFfcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2RtYV9yZXNvdXJjZSIpOwogCiAJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KIApAQCAtNDIyLDkgKzM5Myw5IEBACiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEudHJhbnNmZXIgPSB0ZW1wOCAmIDB4MDM7CiAKIAlpZiAoMHgwMyA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS50cmFuc2ZlcikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJJbnZhbGlkIERNQS5UcmFuc2ZlciBwcmVmZXJlbmNlICgzKVxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9EQVRBKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIERNQS5UcmFuc2ZlciBwcmVmZXJlbmNlICgzKVxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCX0KIAogCS8qIEdldCBidXMgbWFzdGVyIHByZWZlcmVuY2UgKEJpdFsyXSkgKi8KQEAgLTQ0MiwxMCArNDEzLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RtYV9zdHJlYW0KQEAgLTQ2MywxOSArNDMzLDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19kbWFfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCkKK2FjcGlfcnNfZG1hX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJdTggaW5kZXg7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19kbWFfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19kbWFfc3RyZWFtIik7CiAKIAkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KIApAQCAtNDg2LDggKzQ1Miw3IEBACiAJLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgQ2hhbm5lbHMgYW5kIHNldCB0aGUgbWFzayBiaXRzICovCiAKIAlmb3IgKGluZGV4ID0gMDsKLQkJIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuZG1hLm51bWJlcl9vZl9jaGFubmVsczsKLQkJIGluZGV4KyspIHsKKwkgICAgIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuZG1hLm51bWJlcl9vZl9jaGFubmVsczsgaW5kZXgrKykgewogCQl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5kbWEuY2hhbm5lbHNbaW5kZXhdOwogCQl0ZW1wOCB8PSAweDEgPDwgdGVtcDE2OwogCX0KQEAgLTUwNiw3ICs0NzEsNiBAQAogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCmluZGV4IDhhMmI2MzAuLjU2MDQzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKQEAgLTQxLDEzICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzaXJxIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicnNpcnEiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY5LDI2ICs2NywyMCBAQAogICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlIHN0cmVhbS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV9yc19pcnFfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfaXJxX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCi0JCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSk7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCXU4IGluZGV4OworCXU4IGk7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2lycV9yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfaXJxX3Jlc291cmNlIik7CiAKIAkvKgogCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZGVzY3JpcHRvcgpAQCAtMTAxLDcgKzkzLDcgQEAKIAkvKiBQb2ludCB0byB0aGUgMTYtYml0cyBvZiBCeXRlcyAxIGFuZCAyICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IDA7CiAKQEAgLTEzMiwxNCArMTI0LDE4IEBACiAJCS8qIENoZWNrIGZvciBIRSwgTEwgaW50ZXJydXB0cyAqLwogCiAJCXN3aXRjaCAodGVtcDggJiAweDA5KSB7Ci0JCWNhc2UgMHgwMTogLyogSEUgKi8KLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPSBBQ1BJX0VER0VfU0VOU0lUSVZFOwotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93ID0gQUNQSV9BQ1RJVkVfSElHSDsKKwkJY2FzZSAweDAxOgkvKiBIRSAqLworCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuZWRnZV9sZXZlbCA9CisJCQkgICAgQUNQSV9FREdFX1NFTlNJVElWRTsKKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyA9CisJCQkgICAgQUNQSV9BQ1RJVkVfSElHSDsKIAkJCWJyZWFrOwogCi0JCWNhc2UgMHgwODogLyogTEwgKi8KLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyA9IEFDUElfQUNUSVZFX0xPVzsKKwkJY2FzZSAweDA4OgkvKiBMTCAqLworCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuZWRnZV9sZXZlbCA9CisJCQkgICAgQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgPQorCQkJICAgIEFDUElfQUNUSVZFX0xPVzsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC0xNDgsMTcgKzE0NCwxNiBAQAogCQkJICogYXJlIGFsbG93ZWQgKEFDUEkgc3BlYywgc2VjdGlvbiAiSVJRIEZvcm1hdCIpCiAJCQkgKiBzbyAweDAwIGFuZCAweDA5IGFyZSBpbGxlZ2FsLgogCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiSW52YWxpZCBpbnRlcnJ1cHQgcG9sYXJpdHkvdHJpZ2dlciBpbiByZXNvdXJjZSBsaXN0LCAlWFxuIiwKLQkJCQl0ZW1wOCkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIGludGVycnVwdCBwb2xhcml0eS90cmlnZ2VyIGluIHJlc291cmNlIGxpc3QsICVYXG4iLAorCQkJCQkgIHRlbXA4KSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQl9CiAKIAkJLyogQ2hlY2sgZm9yIHNoYXJhYmxlICovCiAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEFzc3VtZSBFZGdlIFNlbnNpdGl2ZSwgQWN0aXZlIEhpZ2gsIE5vbi1TaGFyYWJsZQogCQkgKiBwZXIgQUNQSSBTcGVjaWZpY2F0aW9uCkBAIC0xNzUsMTAgKzE3MCw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19pcnFfc3RyZWFtCkBAIC0xOTYsMzIgKzE5MCwyNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2lycV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElScWluZm9fYnl0ZV9uZWVkZWQ7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwl1OCBpbmRleDsKKwl1OCBJUnFpbmZvX2J5dGVfbmVlZGVkOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfaXJxX3N0cmVhbSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfaXJxX3N0cmVhbSIpOwogCiAJLyoKIAkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgYmFzZWQgdXBvbiB3aGV0aGVyIGEgdGhpcmQgYnl0ZSBpcwogCSAqIG5lZWRlZCB0byBjb250YWluIHRoZSBJUlEgSW5mb3JtYXRpb24uCiAJICovCiAJaWYgKEFDUElfRURHRV9TRU5TSVRJVkUgPT0gbGlua2VkX2xpc3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgJiYKLQkJQUNQSV9BQ1RJVkVfSElHSCA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93ICYmCi0JCUFDUElfRVhDTFVTSVZFID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlKSB7CisJICAgIEFDUElfQUNUSVZFX0hJR0ggPT0gbGlua2VkX2xpc3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyAmJgorCSAgICBBQ1BJX0VYQ0xVU0lWRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSkgewogCQkqYnVmZmVyID0gMHgyMjsKIAkJSVJxaW5mb19ieXRlX25lZWRlZCA9IEZBTFNFOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkqYnVmZmVyID0gMHgyMzsKIAkJSVJxaW5mb19ieXRlX25lZWRlZCA9IFRSVUU7CiAJfQpAQCAtMjMxLDE0ICsyMjAsMTMgQEAKIAogCS8qIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGludGVycnVwdHMgYW5kIHNldCB0aGUgbWFzayBiaXRzICovCiAKLQlmb3IoaW5kZXggPSAwOwotCQlpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0czsKLQkJaW5kZXgrKykgeworCWZvciAoaW5kZXggPSAwOworCSAgICAgaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHM7IGluZGV4KyspIHsKIAkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmlycS5pbnRlcnJ1cHRzW2luZGV4XTsKIAkJdGVtcDE2IHw9IDB4MSA8PCB0ZW1wODsKIAl9CiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBTZXQgdGhlIElSUSBJbmZvIGJ5dGUgaWYgbmVlZGVkLiAqLwpAQCAtMjQ2LDEzICsyMzQsMTIgQEAKIAlpZiAoSVJxaW5mb19ieXRlX25lZWRlZCkgewogCQl0ZW1wOCA9IDA7CiAJCXRlbXA4ID0gKHU4KSAoKGxpbmtlZF9saXN0LT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlICYKLQkJCQkgMHgwMSkgPDwgNCk7CisJCQkgICAgICAgMHgwMSkgPDwgNCk7CiAKIAkJaWYgKEFDUElfTEVWRUxfU0VOU0lUSVZFID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5lZGdlX2xldmVsICYmCi0JCQlBQ1BJX0FDVElWRV9MT1cgPT0gbGlua2VkX2xpc3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdykgeworCQkgICAgQUNQSV9BQ1RJVkVfTE9XID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cpIHsKIAkJCXRlbXA4IHw9IDB4MDg7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQl0ZW1wOCB8PSAweDAxOwogCQl9CiAKQEAgLTI2MiwxMSArMjQ5LDEwIEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlCkBAIC0yODksMzQgKzI3NSwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKTsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CisJdTggKnRlbXBfcHRyOworCXU4IGluZGV4OworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9CisJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlIik7Ci0KLQotCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwkvKiBHZXQgdGhlIERlc2NyaXB0b3IgTGVuZ3RoIGZpZWxkICovCiAKIAlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkvKiBWYWxpZGF0ZSBtaW5pbXVtIGRlc2NyaXB0b3IgbGVuZ3RoICovCiAKIAlpZiAodGVtcDE2IDwgNikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKIAl9CiAKIAkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwpAQCAtMzM4LDcgKzMyMCw3IEBACiAJICogLSBFZGdlL0xldmVsIGFyZSBkZWZpbmVkIG9wcG9zaXRlIGluIHRoZSB0YWJsZSB2cyB0aGUgaGVhZGVycwogCSAqLwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmVkZ2VfbGV2ZWwgPQotCQkodGVtcDggJiAweDIpID8gQUNQSV9FREdFX1NFTlNJVElWRSA6IEFDUElfTEVWRUxfU0VOU0lUSVZFOworCSAgICAodGVtcDggJiAweDIpID8gQUNQSV9FREdFX1NFTlNJVElWRSA6IEFDUElfTEVWRUxfU0VOU0lUSVZFOwogCiAJLyogQ2hlY2sgSW50ZXJydXB0IFBvbGFyaXR5ICovCiAKQEAgLTM1Niw3ICszMzgsNyBAQAogCS8qIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgSVJRICovCiAKIAlpZiAodGVtcDggPCAxKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOwogCX0KIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID0gdGVtcDg7CkBAIC0zNzQsOCArMzU2LDggQEAKIAkvKiBDeWNsZSB0aHJvdWdoIGV2ZXJ5IElSUSBpbiB0aGUgdGFibGUgKi8KIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRlbXA4OyBpbmRleCsrKSB7Ci0JCUFDUElfTU9WRV8zMl9UT18zMiAoCi0JCQkmb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1tpbmRleF0sIGJ1ZmZlcik7CisJCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuCisJCQkJICAgaW50ZXJydXB0c1tpbmRleF0sIGJ1ZmZlcik7CiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgSVJRICovCiAKQEAgLTM5MywxMiArMzc1LDEzIEBACiAJICogd2UgYWRkIDEgdG8gdGhlIGxlbmd0aC4KIAkgKi8KIAlpZiAoKmJ5dGVzX2NvbnN1bWVkID4KLQkJKChhY3BpX3NpemUpIG91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzICogNCkgKwotCQkoNSArIDEpKSB7CisJICAgICgoYWNwaV9zaXplKSBvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyAqCisJICAgICA0KSArICg1ICsgMSkpIHsKIAkJLyogRGVyZWZlcmVuY2UgdGhlIEluZGV4ICovCiAKIAkJdGVtcDggPSAqYnVmZmVyOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPSAodTMyKSB0ZW1wODsKKwkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLmluZGV4ID0KKwkJICAgICh1MzIpIHRlbXA4OwogCiAJCS8qIFBvaW50IHRvIHRoZSBTdHJpbmcgKi8KIApAQCAtNDA3LDE1ICszOTAsMTUgQEAKIAkJLyogUG9pbnQgdGhlIFN0cmluZyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCiAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQotCQkJCShjaGFyICopKChjaGFyICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CisJCSAgICAoY2hhciAqKSgoY2hhciAqKW91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKIAkJdGVtcF9wdHIgPSAodTggKikKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQkgICAgb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CiAKIAkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCiAJCWluZGV4ID0gMDsKLQkJd2hpbGUgKDB4MDAgIT0gKmJ1ZmZlcikgeworCQl3aGlsZSAoKmJ1ZmZlcikgewogCQkJKnRlbXBfcHRyID0gKmJ1ZmZlcjsKIAogCQkJdGVtcF9wdHIgKz0gMTsKQEAgLTQyNSw4ICs0MDgsOSBAQAogCiAJCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLwogCi0JCSp0ZW1wX3B0ciA9IDB4MDA7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOworCQkqdGVtcF9wdHIgPSAwOworCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9CisJCSAgICBpbmRleCArIDE7CiAKIAkJLyoKIAkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LApAQCAtNDM0LDEyICs0MTgsMTMgQEAKIAkJICogc3RydWN0X3NpemUgdG8gdGhlIG5leHQgMzItYml0IGJvdW5kYXJ5LgogCQkgKi8KIAkJdGVtcDggPSAodTgpIChpbmRleCArIDEpOwotCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKLQl9Ci0JZWxzZSB7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5pbmRleCA9IDB4MDA7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOworCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOworCX0gZWxzZSB7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5pbmRleCA9IDA7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0KKwkJICAgIDA7CisJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KKwkJICAgIE5VTEw7CiAJfQogCiAJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCkBAIC00NDksMTAgKzQzNCw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19leHRlbmRlZF9pcnFfc3RyZWFtCkBAIC00NzAsMzUgKzQ1NCwzMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZXh0ZW5kZWRfaXJxX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF9maWVsZDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcG9pbnRlciA9IE5VTEw7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXUxNiAqbGVuZ3RoX2ZpZWxkOworCXU4IHRlbXA4ID0gMDsKKwl1OCBpbmRleDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2V4dGVuZGVkX2lycV9zdHJlYW0iKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19leHRlbmRlZF9pcnFfc3RyZWFtIik7CisJLyogU2V0IHRoZSBEZXNjcmlwdG9yIFR5cGUgZmllbGQgKi8KIAotCi0JLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCi0KLQkqYnVmZmVyID0gMHg4OTsKKwkqYnVmZmVyID0gQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX1hSVVBUOwogCWJ1ZmZlciArPSAxOwogCi0JLyogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisJLyogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlciAqLwogCi0JbGVuZ3RoX2ZpZWxkID0gQUNQSV9DQVNUX1BUUiAodTE2LCBidWZmZXIpOworCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIodTE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBJbnRlcnJ1cHQgdmVjdG9yIGZsYWdzICovCiAKLQl0ZW1wOCA9ICh1OCkobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7Ci0JdGVtcDggfD0gKChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuc2hhcmVkX2V4Y2x1c2l2ZSAmIDB4MDEpIDw8IDMpOworCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7CisJdGVtcDggfD0KKwkgICAgKChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuc2hhcmVkX2V4Y2x1c2l2ZSAmIDB4MDEpIDw8IDMpOwogCiAJLyoKIAkgKiBTZXQgdGhlIEludGVycnVwdCBNb2RlCkBAIC01MjcsNDMgKzUwNyw0NiBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0czsKLQkJIGluZGV4KyspIHsKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCi0JCQkJICAmbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbaW5kZXhdKTsKKwlmb3IgKGluZGV4ID0gMDsKKwkgICAgIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOworCSAgICAgaW5kZXgrKykgeworCQlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLAorCQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuCisJCQkJICAgaW50ZXJydXB0c1tpbmRleF0pOwogCQlidWZmZXIgKz0gNDsKIAl9CiAKIAkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KIAogCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewotCQkqYnVmZmVyID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLmluZGV4OworCQkqYnVmZmVyID0KKwkJICAgICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5pbmRleDsKIAkJYnVmZmVyICs9IDE7CiAKLQkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOwotCiAJCS8qIENvcHkgdGhlIHN0cmluZyAqLwogCi0JCUFDUElfU1RSQ1BZICh0ZW1wX3BvaW50ZXIsCi0JCQlsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQlBQ1BJX1NUUkNQWSgoY2hhciAqKWJ1ZmZlciwKKwkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLgorCQkJICAgIHN0cmluZ19wdHIpOwogCiAJCS8qCi0JCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQorCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyArIG9uZSBmb3IgdGhlCiAJCSAqIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4gKAotCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0KKwkJICAgIChhY3BpX3NpemUpIChBQ1BJX1NUUkxFTgorCQkJCSAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgorCQkJCSAgcmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CiAJfQogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KIAotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAKIAkvKgogCSAqIFNldCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKIAkgKiBtaW51cyB0aGUgaGVhZGVyIHNpemUgKDMgYnl0ZXMpCiAJICovCiAJKmxlbmd0aF9maWVsZCA9ICh1MTYpICgqYnl0ZXNfY29uc3VtZWQgLSAzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYwppbmRleCBkYjdiY2I0Li4xMDNlYjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKQEAgLTQxLDEzICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzbGlzdCIpCi0KK0FDUElfTU9EVUxFX05BTUUoInJzbGlzdCIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjEsMTQgKzU5LDEwIEBACiAgKiAgICAgICAgICAgICAgYSByZXNvdXJjZSBkZXNjcmlwdG9yLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4Ci1hY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3N0YXJ0X2J5dGUpCit1OCBhY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlKHU4IHJlc291cmNlX3N0YXJ0X2J5dGUpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBzbWFsbCBvciBsYXJnZSByZXNvdXJjZSAqLwogCkBAIC03OSwxNCArNzMsMTIgQEAKIAogCQlyZXR1cm4gKCh1OCkgKHJlc291cmNlX3N0YXJ0X2J5dGUgJiBBQ1BJX1JERVNDX1NNQUxMX01BU0spKTsKIAotCiAJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTEFSR0U6CiAKIAkJLyogTGFyZ2UgUmVzb3VyY2UgVHlwZSAtLSBBbGwgYml0cyBhcmUgdmFsaWQgKi8KIAogCQlyZXR1cm4gKHJlc291cmNlX3N0YXJ0X2J5dGUpOwogCi0KIAlkZWZhdWx0OgogCQkvKiBJbnZhbGlkIHR5cGUgKi8KIAkJYnJlYWs7CkBAIC05NSw3ICs4Nyw2IEBACiAJcmV0dXJuICgweEZGKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2J5dGVfc3RyZWFtX3RvX2xpc3QKQEAgLTExMywxNzYgKzEwNCwxODkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2J5dGVfc3RyZWFtX3RvX2xpc3QgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0X2J1ZmZlcikKK2FjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgICB1MzIgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwgdTggKiBvdXRwdXRfYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcGFyc2VkID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGUgPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfdGFnX3Byb2Nlc3NlZCA9IEZBTFNFOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKnJlc291cmNlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3NpemUgYnl0ZXNfcGFyc2VkID0gMDsKKwl1OCByZXNvdXJjZV90eXBlID0gMDsKKwlhY3BpX3NpemUgYnl0ZXNfY29uc3VtZWQgPSAwOworCXU4ICpidWZmZXIgPSBvdXRwdXRfYnVmZmVyOworCWFjcGlfc2l6ZSBzdHJ1Y3R1cmVfc2l6ZSA9IDA7CisJdTggZW5kX3RhZ19wcm9jZXNzZWQgPSBGQUxTRTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2J5dGVfc3RyZWFtX3RvX2xpc3QiKTsKIAotCi0Jd2hpbGUgKGJ5dGVzX3BhcnNlZCA8IGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGggJiYKLQkJCSFlbmRfdGFnX3Byb2Nlc3NlZCkgeworCXdoaWxlIChieXRlc19wYXJzZWQgPCBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoICYmICFlbmRfdGFnX3Byb2Nlc3NlZCkgewogCQkvKiBUaGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gaXMgdGhlIHJlc291cmNlIHR5cGUgKi8KIAotCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSAoKmJ5dGVfc3RyZWFtX2J1ZmZlcik7CisJCXJlc291cmNlX3R5cGUgPSBhY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlKCpieXRlX3N0cmVhbV9idWZmZXIpOwogCiAJCXN3aXRjaCAocmVzb3VyY2VfdHlwZSkgewogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMjQ6CiAJCQkvKgogCQkJICogMjQtQml0IE1lbW9yeSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX21lbW9yeTI0X3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX21lbW9yeTI0X3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICAgJmJ1ZmZlciwKKwkJCQkJCQkgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9MQVJHRV9WRU5ET1I6CiAJCQkvKgogCQkJICogVmVuZG9yIERlZmluZWQgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfdmVuZG9yX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAmYnVmZmVyLAorCQkJCQkJCSAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMzI6CiAJCQkvKgogCQkJICogMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICAgICZidWZmZXIsCisJCQkJCQkJICAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0ZJWEVEX01FTU9SWV8zMjoKIAkJCS8qCiAJCQkgKiAzMi1CaXQgRml4ZWQgTWVtb3J5IFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICAgICZieXRlc19jb25zdW1lZCwKKwkJCQkJCQkgICAgJmJ1ZmZlciwKKwkJCQkJCQkgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfUVdPUkRfQUREUkVTU19TUEFDRToKIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRVhURU5ERURfQUREUkVTU19TUEFDRToKIAkJCS8qCiAJCQkgKiA2NC1CaXQgQWRkcmVzcyBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzNjRfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICAgICZidWZmZXIsCisJCQkJCQkJICAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0RXT1JEX0FERFJFU1NfU1BBQ0U6CiAJCQkvKgogCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMzJfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICAmYnVmZmVyLAorCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9XT1JEX0FERFJFU1NfU1BBQ0U6CiAJCQkvKgogCQkJICogMTYtQml0IEFkZHJlc3MgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMTZfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczE2X3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICAmYnVmZmVyLAorCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9YUlVQVDoKIAkJCS8qCiAJCQkgKiBFeHRlbmRlZCBJUlEKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19leHRlbmRlZF9pcnFfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19leHRlbmRlZF9pcnFfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgJmJ1ZmZlciwKKwkJCQkJCQkgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lSUV9GT1JNQVQ6CiAJCQkvKgogCQkJICogSVJRIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfaXJxX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2lycV9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkgICAgICAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsCisJCQkJCQkgICAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9ETUFfRk9STUFUOgogCQkJLyoKIAkJCSAqIERNQSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2RtYV9yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc19kbWFfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJICAgICAgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLAorCQkJCQkJICAgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfU1RBUlRfREVQRU5ERU5UOgogCQkJLyoKIAkJCSAqIFN0YXJ0IERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZQorCQkJICAgIChieXRlX3N0cmVhbV9idWZmZXIsICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwKKwkJCSAgICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRU5EX0RFUEVOREVOVDoKIAkJCS8qCiAJCQkgKiBFbmQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICAgICZidWZmZXIsCisJCQkJCQkJICAgICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lPX1BPUlQ6CiAJCQkvKgogCQkJICogSU8gUG9ydCBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2lvX3Jlc291cmNlIChieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsICZzdHJ1Y3R1cmVfc2l6ZSk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2lvX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkJCSAgICAgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLAorCQkJCQkJICAgICAmc3RydWN0dXJlX3NpemUpOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfUkRFU0NfVFlQRV9GSVhFRF9JT19QT1JUOgogCQkJLyoKIAkJCSAqIEZpeGVkIElPIFBvcnQgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICAgJmJ5dGVzX2NvbnN1bWVkLAorCQkJCQkJCSAgICZidWZmZXIsCisJCQkJCQkJICAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfU01BTExfVkVORE9SOgogCQkJLyoKIAkJCSAqIFZlbmRvciBTcGVjaWZpYyBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX3ZlbmRvcl9yZXNvdXJjZSAoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLCAmc3RydWN0dXJlX3NpemUpOworCQkJc3RhdHVzID0gYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCQkJCSAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICZidWZmZXIsCisJCQkJCQkJICZzdHJ1Y3R1cmVfc2l6ZSk7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VORF9UQUc6CiAJCQkvKgogCQkJICogRW5kIFRhZwogCQkJICovCiAJCQllbmRfdGFnX3Byb2Nlc3NlZCA9IFRSVUU7Ci0JCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF90YWdfcmVzb3VyY2UgKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwgJnN0cnVjdHVyZV9zaXplKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQsCisJCQkJCQkJICAmYnVmZmVyLAorCQkJCQkJCSAgJnN0cnVjdHVyZV9zaXplKTsKIAkJCWJyZWFrOwogCi0KIAkJZGVmYXVsdDoKIAkJCS8qCiAJCQkgKiBJbnZhbGlkL1Vua25vd24gcmVzb3VyY2UgdHlwZQpAQCAtMjkxLDggKzI5NSw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjb3VudGVyICovCkBAIC0zMDUsMjEgKzMwOSwyMSBAQAogCiAJCS8qIFNldCB0aGUgQnVmZmVyIHRvIHRoZSBuZXh0IHN0cnVjdHVyZSAqLwogCi0JCXJlc291cmNlID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlcik7Ci0JCXJlc291cmNlLT5sZW5ndGggPSAodTMyKSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUgKHJlc291cmNlLT5sZW5ndGgpOwotCQlidWZmZXIgKz0gQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFIChzdHJ1Y3R1cmVfc2l6ZSk7CisJCXJlc291cmNlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgYnVmZmVyKTsKKwkJcmVzb3VyY2UtPmxlbmd0aCA9CisJCSAgICAodTMyKSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUocmVzb3VyY2UtPmxlbmd0aCk7CisJCWJ1ZmZlciArPSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUoc3RydWN0dXJlX3NpemUpOwogCX0KIAogCS8qIENoZWNrIHRoZSByZWFzb24gZm9yIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3AgKi8KIAogCWlmICghZW5kX3RhZ19wcm9jZXNzZWQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2xpc3RfdG9fYnl0ZV9zdHJlYW0KQEAgLTM0MiwxOSArMzQ2LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dF9idWZmZXIpCithY3BpX3JzX2xpc3RfdG9fYnl0ZV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgIGFjcGlfc2l6ZSBieXRlX3N0cmVhbV9zaXplX25lZWRlZCwKKwkJCSAgICB1OCAqIG91dHB1dF9idWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gb3V0cHV0X2J1ZmZlcjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTggKmJ1ZmZlciA9IG91dHB1dF9idWZmZXI7CisJYWNwaV9zaXplIGJ5dGVzX2NvbnN1bWVkID0gMDsKKwl1OCBkb25lID0gRkFMU0U7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19saXN0X3RvX2J5dGVfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19saXN0X3RvX2J5dGVfc3RyZWFtIik7CiAKIAl3aGlsZSAoIWRvbmUpIHsKIAkJc3dpdGNoIChsaW5rZWRfbGlzdC0+aWQpIHsKQEAgLTM2Miw1OCArMzYzLDcyIEBACiAJCQkvKgogCQkJICogSVJRIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfaXJxX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfaXJxX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJICAgICAgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0RNQToKIAkJCS8qCiAJCQkgKiBETUEgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19kbWFfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19kbWFfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkgICAgICAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfU1RBUlRfRFBGOgogCQkJLyoKIAkJCSAqIFN0YXJ0IERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbSAobGlua2VkX2xpc3QsCi0JCQkJCSAgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0obGlua2VkX2xpc3QsCisJCQkJCQkJCSAmYnVmZmVyLAorCQkJCQkJCQkgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfRU5EX0RQRjoKIAkJCS8qCiAJCQkgKiBFbmQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbSAobGlua2VkX2xpc3QsCi0JCQkJCSAgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtKGxpbmtlZF9saXN0LAorCQkJCQkJCSAgICAgICAmYnVmZmVyLAorCQkJCQkJCSAgICAgICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9JTzoKIAkJCS8qCiAJCQkgKiBJTyBQb3J0IFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfaW9fc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc19pb19zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCSAgICAgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX0lPOgogCQkJLyoKIAkJCSAqIEZpeGVkIElPIFBvcnQgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19maXhlZF9pb19zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX2ZpeGVkX2lvX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9WRU5ET1I6CiAJCQkvKgogCQkJICogVmVuZG9yIERlZmluZWQgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc192ZW5kb3Jfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9yc192ZW5kb3Jfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfVEFHOgogCQkJLyoKIAkJCSAqIEVuZCBUYWcKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19lbmRfdGFnX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfZW5kX3RhZ19zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkgICAmYnl0ZXNfY29uc3VtZWQpOwogCiAJCQkvKiBBbiBFbmQgVGFnIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBSZXNvdXJjZSBUZW1wbGF0ZSAqLwogCkBAIC00MjQsNTUgKzQzOSw2MCBAQAogCQkJLyoKIAkJCSAqIDI0LUJpdCBNZW1vcnkgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX21lbW9yeTI0X3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9NRU0zMjoKIAkJCS8qCiAJCQkgKiAzMi1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkJCSAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfTUVNMzI6CiAJCQkvKgogCQkJICogMzItQml0IEZpeGVkIE1lbW9yeSBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCQkgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKIAkJCS8qCiAJCQkgKiAxNi1CaXQgQWRkcmVzcyBEZXNjcmlwdG9yIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczE2X3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMTZfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAorCQkJCQkJCSAgJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzMyOgogCQkJLyoKIAkJCSAqIDMyLUJpdCBBZGRyZXNzIERlc2NyaXB0b3IgUmVzb3VyY2UKIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMzJfc3RyZWFtIChsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKLQkJCQkJICZieXRlc19jb25zdW1lZCk7CisJCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQ6CiAJCQkvKgogCQkJICogNjQtQml0IEFkZHJlc3MgRGVzY3JpcHRvciBSZXNvdXJjZQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkgJmJ5dGVzX2NvbnN1bWVkKTsKKwkJCXN0YXR1cyA9IGFjcGlfcnNfYWRkcmVzczY0X3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKKwkJCQkJCQkgICZieXRlc19jb25zdW1lZCk7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6CiAJCQkvKgogCQkJICogRXh0ZW5kZWQgSVJRIFJlc291cmNlCiAJCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3N0cmVhbSAobGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCSAmYnl0ZXNfY29uc3VtZWQpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCisJCQkJCQkJJmJ5dGVzX2NvbnN1bWVkKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC00ODAsMTUgKzUwMCwxNSBAQAogCQkJICogSWYgd2UgZ2V0IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb3V0IG9mIHN5bmMsCiAJCQkgKiBzbyBleGl0IHdpdGggYW4gZXJyb3IKIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdFxuIiwKLQkJCQlsaW5rZWRfbGlzdC0+aWQpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdFxuIiwKKwkJCQkJICBsaW5rZWRfbGlzdC0+aWQpKTsKIAkJCXN0YXR1cyA9IEFFX0JBRF9EQVRBOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKiBTZXQgdGhlIEJ1ZmZlciB0byBwb2ludCB0byB0aGUgb3BlbiBieXRlICovCkBAIC00OTcsMTAgKzUxNyw5IEBACiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0ICovCiAKLQkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQgKHN0cnVjdCBhY3BpX3Jlc291cmNlLAotCQkJCSAgbGlua2VkX2xpc3QsIGxpbmtlZF9saXN0LT5sZW5ndGgpOworCQlsaW5rZWRfbGlzdCA9IEFDUElfUFRSX0FERChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwKKwkJCQkJICAgbGlua2VkX2xpc3QsIGxpbmtlZF9saXN0LT5sZW5ndGgpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYwppbmRleCA5MWQwMjA3Li5kYWJhMWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCkBAIC00MSwxMyArNDEsMTEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc21lbW9yeSIpCi0KK0FDUElfTU9EVUxFX05BTUUoInJzbWVtb3J5IikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OSwzMCArNjcsMjUgQEAKICAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MjRfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfbWVtb3J5MjRfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCk7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9CisJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0KTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTI0X3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19tZW1vcnkyNF9yZXNvdXJjZSIpOwogCiAJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLwogCiAJYnVmZmVyICs9IDE7CiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJKmJ5dGVzX2NvbnN1bWVkID0gKGFjcGlfc2l6ZSkgdGVtcDE2ICsgMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX01FTTI0OwpAQCAtMTA1LDI1ICs5OCwyNSBAQAogCiAJLyogR2V0IG1pbl9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNSkgKi8KIAotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0Lm1pbl9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKIAkvKiBHZXQgbWF4X2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNi03KSAqLwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCWJ1ZmZlciArPSAyOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQubWF4X2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAogCS8qIEdldCBBbGlnbm1lbnQgKEJ5dGVzIDgtOSkgKi8KIAotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0LmFsaWdubWVudCA9IHRlbXAxNjsKIAogCS8qIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDEwLTExKSAqLwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOworCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQucmFuZ2VfbGVuZ3RoID0gdGVtcDE2OwogCiAJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCkBAIC0xMzMsMTAgKzEyNiw5IEBACiAJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0KQEAgLTE1NCwxOCArMTQ2LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkyNF9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX21lbW9yeTI0X3N0cmVhbSIpOwogCiAJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCiAKQEAgLTE3NSw3ICsxNjMsNyBAQAogCS8qIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljICovCiAKIAl0ZW1wMTYgPSAweDA5OwotCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLwpAQCAtMTg2LDMxICsxNzQsMzIgQEAKIAogCS8qIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MgKi8KIAotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWluX2Jhc2VfYWRkcmVzcyk7CisJQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5taW5fYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KIAotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWF4X2Jhc2VfYWRkcmVzcyk7CisJQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5tYXhfYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQgKi8KIAotCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQuYWxpZ25tZW50KTsKKwlBQ1BJX01PVkVfMzJfVE9fMTYoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQuYWxpZ25tZW50KTsKIAlidWZmZXIgKz0gMjsKIAogCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCk7CisJQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCk7CiAJYnVmZmVyICs9IDI7CiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UKQEAgLTIzMywyOCArMjIyLDI0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAotCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMik7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9CisJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyKTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSIpOwogCiAJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLwogCiAJYnVmZmVyICs9IDE7CiAKLQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJKmJ5dGVzX2NvbnN1bWVkID0gKGFjcGlfc2l6ZSkgdGVtcDE2ICsgMzsKIApAQCAtMjc5LDIyICsyNjQsMjQgQEAKIAogCS8qIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTcpICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1pbl9iYXNlX2FkZHJlc3MsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1pbl9iYXNlX2FkZHJlc3MsCisJCQkgICBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogR2V0IG1heF9iYXNlX2FkZHJlc3MgKEJ5dGVzIDgtMTEpICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1heF9iYXNlX2FkZHJlc3MsIGJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1heF9iYXNlX2FkZHJlc3MsCisJCQkgICBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogR2V0IEFsaWdubWVudCAoQnl0ZXMgMTItMTUpICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLmFsaWdubWVudCwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50LCBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgMTYtMTkpICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLnJhbmdlX2xlbmd0aCwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoLCBidWZmZXIpOwogCiAJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCiAKQEAgLTMwMywxMCArMjkwLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlCkBAIC0zMjksMjcgKzMxNSwyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIpOworCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPQorCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UiKTsKIAogCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KIAogCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKKwlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKIAogCWJ1ZmZlciArPSAyOwogCSpieXRlc19jb25zdW1lZCA9IChhY3BpX3NpemUpIHRlbXAxNiArIDM7CkBAIC0zNjQsMTMgKzM0NiwxNCBAQAogCiAJLyogR2V0IHJhbmdlX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KSAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9iYXNlX2FkZHJlc3MsCi0JCWJ1ZmZlcik7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLgorCQkJICAgcmFuZ2VfYmFzZV9hZGRyZXNzLCBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgOC0xMSkgKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoLCBidWZmZXIpOworCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgsCisJCQkgICBidWZmZXIpOwogCiAJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCiAKQEAgLTM3OSwxMCArMzYyLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbQpAQCAtNDAwLDE4ICszODIsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTMyX3JhbmdlX3N0cmVhbSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtIik7CiAKIAkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KIApAQCAtNDIyLDcgKzQwMCw3IEBACiAKIAl0ZW1wMTYgPSAweDExOwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOworCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlICovCkBAIC00MzMsMzEgKzQxMSwzMiBAQAogCiAJLyogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcyAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLm1pbl9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcyAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLAorCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLm1heF9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSBiYXNlIGFsaWdubWVudCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5hbGlnbm1lbnQpOworCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5hbGlnbm1lbnQpOwogCWJ1ZmZlciArPSA0OwogCiAJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KIAotCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKKwlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0KQEAgLTQ3NSwxOCArNDU0LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOworCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKKwl1MTYgdGVtcDE2ID0gMDsKKwl1OCB0ZW1wOCA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9tZW1vcnkzMl9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbSIpOwogCiAJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCiAKQEAgLTQ5NywzMCArNDcyLDMxIEBACiAKIAl0ZW1wMTYgPSAweDA5OwogCi0JQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOworCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCiAJLyogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlICovCiAKLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlICYgMHgwMSk7CisJdGVtcDggPQorCSAgICAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOwogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAogCS8qIFNldCB0aGUgUmFuZ2UgYmFzZSBhZGRyZXNzICovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwKLQkJJmxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2Jhc2VfYWRkcmVzcyk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKKwkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi4KKwkJCSAgIHJhbmdlX2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDQ7CiAKIAkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCi0JCSZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgpOworCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCisJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKIAlidWZmZXIgKz0gNDsKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCmluZGV4IGExZjE3NDEuLjdhOGEzNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYwpAQCAtNDEsMTMgKzQxLDExIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnNtaXNjIikKLQorQUNQSV9NT0RVTEVfTkFNRSgicnNtaXNjIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OSwyMCArNjcsMTUgQEAKICAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19lbmRfdGFnX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9SRVNPVVJDRV9MRU5HVEg7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9IEFDUElfUkVTT1VSQ0VfTEVOR1RIOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX3RhZ19yZXNvdXJjZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZW5kX3RhZ19yZXNvdXJjZSIpOwogCiAJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyBzdGF0aWMgKi8KIApAQCAtOTksMTAgKzkyLDkgQEAKIAkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwogCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuZF90YWdfc3RyZWFtCkBAIC0xMjAsMTcgKzExMiwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX3RhZ19zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19lbmRfdGFnX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCSAgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTggdGVtcDggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX3RhZ19zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2VuZF90YWdfc3RyZWFtIik7CiAKIAkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KIApAQCAtMTQ4LDExICsxMzYsMTAgQEAKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UKQEAgLTE3NSwyMyArMTYyLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfdmVuZG9yX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCi0JCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcik7CisJdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7CisJdTE2IHRlbXAxNiA9IDA7CisJdTggdGVtcDggPSAwOworCXU4IGluZGV4OworCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9CisJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcik7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc192ZW5kb3JfcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3ZlbmRvcl9yZXNvdXJjZSIpOwogCiAJLyogRGVyZWZlcmVuY2UgdGhlIERlc2NyaXB0b3IgdG8gZmluZCBpZiB0aGlzIGlzIGEgbGFyZ2Ugb3Igc21hbGwgaXRlbS4gKi8KIApAQCAtMjA0LDcgKzE4Nyw3IEBACiAKIAkJLyogRGVyZWZlcmVuY2UgKi8KIAotCQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CisJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwogCiAJCS8qIENhbGN1bGF0ZSBieXRlcyBjb25zdW1lZCAqLwogCkBAIC0yMTMsMTEgKzE5NiwxMCBAQAogCQkvKiBQb2ludCB0byB0aGUgZmlyc3QgdmVuZG9yIGJ5dGUgKi8KIAogCQlidWZmZXIgKz0gMjsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogU21hbGwgSXRlbSwgZGVyZWZlcmVuY2UgdGhlIHNpemUgKi8KIAotCQl0ZW1wMTYgPSAodTgpKCpidWZmZXIgJiAweDA3KTsKKwkJdGVtcDE2ID0gKHU4KSAoKmJ1ZmZlciAmIDB4MDcpOwogCiAJCS8qIENhbGN1bGF0ZSBieXRlcyBjb25zdW1lZCAqLwogCkBAIC0yNDEsNyArMjIzLDcgQEAKIAkgKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgdmVuZG9yIHN0cmluZyBhbmQgZXhwYW5kIHRoZQogCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KIAkgKi8KLQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXAxNik7CisJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXAxNik7CiAKIAkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KIApAQCAtMjUwLDEwICsyMzIsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfdmVuZG9yX3N0cmVhbQpAQCAtMjcxLDIzICsyNTIsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX3ZlbmRvcl9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc192ZW5kb3Jfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOworCXUxNiB0ZW1wMTYgPSAwOworCXU4IHRlbXA4ID0gMDsKKwl1OCBpbmRleDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3ZlbmRvcl9zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3ZlbmRvcl9zdHJlYW0iKTsKIAogCS8qIERlcmVmZXJlbmNlIHRoZSBsZW5ndGggdG8gZmluZCBpZiB0aGlzIGlzIGEgbGFyZ2Ugb3Igc21hbGwgaXRlbS4gKi8KIAotCWlmKGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGggPiA3KSB7CisJaWYgKGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGggPiA3KSB7CiAJCS8qIExhcmdlIEl0ZW0sIFNldCB0aGUgZGVzY3JpcHRvciBmaWVsZCBhbmQgbGVuZ3RoIGJ5dGVzICovCiAKIAkJKmJ1ZmZlciA9IDB4ODQ7CkBAIC0yOTUsMTAgKzI3Miw5IEBACiAKIAkJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsKIAotCQlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CisJCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwogCQlidWZmZXIgKz0gMjsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogU21hbGwgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkICovCiAKIAkJdGVtcDggPSAweDcwOwpAQCAtMzEwLDcgKzI4Niw4IEBACiAKIAkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBWZW5kb3IgU3BlY2lmaWMgZmllbGRzICovCiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoOyBpbmRleCsrKSB7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsKKwkgICAgIGluZGV4KyspIHsKIAkJdGVtcDggPSBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMucmVzZXJ2ZWRbaW5kZXhdOwogCiAJCSpidWZmZXIgPSB0ZW1wODsKQEAgLTMxOSwxMSArMjk2LDEwIEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZQpAQCAtMzQ2LDIxICszMjIsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKK2FjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwKKwkJCQkgIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKLQkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKKwl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwl1OCB0ZW1wOCA9IDA7CisJYWNwaV9zaXplIHN0cnVjdF9zaXplID0KKwkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UiKTsKIAogCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIGZvdW5kIGluIHRoZSBkZXNjcmlwdG9yIChCaXRzOjAtMSkgKi8KIApAQCAtMzc4LDI2ICszNTEsMjcgQEAKIAogCQkvKiBDaGVjayBDb21wYXRpYmlsaXR5IHByaW9yaXR5ICovCiAKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSA9IHRlbXA4ICYgMHgwMzsKKwkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSA9CisJCSAgICB0ZW1wOCAmIDB4MDM7CiAKIAkJaWYgKDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFKTsKIAkJfQogCiAJCS8qIENoZWNrIFBlcmZvcm1hbmNlL1JvYnVzdG5lc3MgcHJlZmVyZW5jZSAqLwogCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MgPSAodGVtcDggPj4gMikgJiAweDAzOworCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID0KKwkJICAgICh0ZW1wOCA+PiAyKSAmIDB4MDM7CiAKIAkJaWYgKDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFKTsKIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5ID0KLQkJCUFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOworCQkgICAgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT047CiAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyA9Ci0JCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKKwkJICAgIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOwogCX0KIAogCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwpAQCAtNDA3LDEwICszODEsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UKQEAgLTQzMywxOCArNDA2LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKQorYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfUkVTT1VSQ0VfTEVOR1RIOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKKwlhY3BpX3NpemUgc3RydWN0X3NpemUgPSBBQ1BJX1JFU09VUkNFX0xFTkdUSDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSIpOwogCiAJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyBzdGF0aWMgKi8KIApAQCAtNDYxLDEwICs0MzAsOSBAQAogCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCiAKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0KQEAgLTQ4MywzOSArNDUxLDM1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpCithY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKKwl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTggdGVtcDggPSAwOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtIik7CiAKIAkvKgogCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHNldCBiYXNlZCB1cG9uIHdoZXRoZXIgYSBieXRlIGlzIG5lZWRlZAogCSAqIHRvIGNvbnRhaW4gUHJpb3JpdHkgZGF0YS4KIAkgKi8KIAlpZiAoQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT04gPT0KLQkJCWxpbmtlZF9saXN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5ICYmCi0JCUFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OID09Ci0JCQlsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgeworCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSAmJgorCSAgICBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTiA9PQorCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewogCQkqYnVmZmVyID0gMHgzMDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJKmJ1ZmZlciA9IDB4MzE7CiAJCWJ1ZmZlciArPSAxOwogCiAJCS8qIFNldCB0aGUgUHJpb3JpdHkgQnl0ZSBEZWZpbml0aW9uICovCiAKIAkJdGVtcDggPSAwOwotCQl0ZW1wOCA9ICh1OCkgKChsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyAmCi0JCQkJICAgMHgwMykgPDwgMik7Ci0JCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSAmCi0JCQkJICAgMHgwMyk7CisJCXRlbXA4ID0KKwkJICAgICh1OCkgKChsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYuCisJCQkgICBwZXJmb3JtYW5jZV9yb2J1c3RuZXNzICYgMHgwMykgPDwgMik7CisJCXRlbXA4IHw9CisJCSAgICAobGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgJiAweDAzKTsKIAkJKmJ1ZmZlciA9IHRlbXA4OwogCX0KIApAQCAtNTIzLDExICs0ODcsMTAgQEAKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0KQEAgLTU0NSwxNiArNTA4LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKQorYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7CisJdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0iKTsKIAogCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwogCkBAIC01NjMsNyArNTIyLDYgQEAKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKaW5kZXggNzAwY2Y3ZC4uNDQ0Njc3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKQEAgLTQxLDE1ICs0MSwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzdXRpbHMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJyc3V0aWxzIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02OCw0MiArNjUsMzYgQEAKICAqICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYWxsZXJzIGJ1ZmZlciBpcyB1bmRlZmluZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19nZXRfcHJ0X21ldGhvZF9kYXRhIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19nZXRfcHJ0X21ldGhvZF9kYXRhIik7CiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKIAkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlQsCi0JCQkgQUNQSV9CVFlQRV9QQUNLQUdFLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTUVUSE9EX05BTUVfX1BSVCwKKwkJCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKIAkgKiBDcmVhdGUgYSByZXNvdXJjZSBsaW5rZWQgbGlzdCBmcm9tIHRoZSBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcwogCSAqIGJhY2sgZnJvbSB0aGUgX0NSUyBtZXRob2QgZXhlY3V0aW9uLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlIChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUob2JqX2Rlc2MsIHJldF9idWZmZXIpOwogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X2Nyc19tZXRob2RfZGF0YQpAQCAtMTIzLDI1ICsxMTQsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZ2V0X2Nyc19tZXRob2RfZGF0YSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X2Nyc19tZXRob2RfZGF0YSIpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtMTQ5LDE1ICsxMzYsMTQgQEAKIAkgKiBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcyBiYWNrIGZyb20gdGhlIF9DUlMgbWV0aG9kCiAJICogZXhlY3V0aW9uLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QgKG9ial9kZXNjLCByZXRfYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KG9ial9kZXNjLCByZXRfYnVmZmVyKTsKIAogCS8qIG9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgZXZhbHVhdGVfb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEKQEAgLTE3OCwyNSArMTY0LDIxIEBACiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X3Byc19tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfcnNfZ2V0X3Byc19tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19nZXRfcHJzX21ldGhvZF9kYXRhIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19nZXRfcHJzX21ldGhvZF9kYXRhIik7CiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKIAkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCi0JCQkgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLAorCQkJCQkgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0yMDQsMTUgKzE4NiwxNCBAQAogCSAqIGJ5dGUgc3RyZWFtIGJ1ZmZlciB0aGF0IGNvbWVzIGJhY2sgZnJvbSB0aGUgX0NSUyBtZXRob2QKIAkgKiBleGVjdXRpb24uCiAJICovCi0Jc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdCAob2JqX2Rlc2MsIHJldF9idWZmZXIpOworCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3Qob2JqX2Rlc2MsIHJldF9idWZmZXIpOwogCiAJLyogb24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjM0LDI1ICsyMTUsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKQorYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJY2hhciAqcGF0aCwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2dldF9tZXRob2RfZGF0YSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X21ldGhvZF9kYXRhIik7CiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKIAkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIHBhdGgsIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgcGF0aCwgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCkBAIC0yNjAsMTIgKzIzOCwxMiBAQAogCSAqIGJ5dGUgc3RyZWFtIGJ1ZmZlciB0aGF0IGNvbWVzIGJhY2sgZnJvbSB0aGUgbWV0aG9kCiAJICogZXhlY3V0aW9uLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QgKG9ial9kZXNjLCByZXRfYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KG9ial9kZXNjLCByZXRfYnVmZmVyKTsKIAogCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgZXZhbHVhdGVfb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4NywxOCArMjY1LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICppbl9idWZmZXIpCithY3BpX3JzX3NldF9zcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKmluX2J1ZmZlcikKIHsKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgIGluZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFyYW1zWzJdOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgYnVmZmVyOworCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFyYW1zWzJdOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfc2V0X3Nyc19tZXRob2RfZGF0YSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfc2V0X3Nyc19tZXRob2RfZGF0YSIpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCkBAIC0zMTAsMjQgKzI4NCwyNCBAQAogCSAqIENvbnZlcnQgdGhlIGxpbmtlZCBsaXN0IGludG8gYSBieXRlIHN0cmVhbQogCSAqLwogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKLQlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbSAoaW5fYnVmZmVyLT5wb2ludGVyLCAmYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbShpbl9idWZmZXItPnBvaW50ZXIsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbml0IHRoZSBwYXJhbSBvYmplY3QgKi8KIAotCXBhcmFtc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0JVRkZFUik7CisJcGFyYW1zWzBdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9CVUZGRVIpOwogCWlmICghcGFyYW1zWzBdKSB7Ci0JCWFjcGlfb3NfZnJlZSAoYnVmZmVyLnBvaW50ZXIpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIFNldCB1cCB0aGUgcGFyYW1ldGVyIG9iamVjdCAqLwogCi0JcGFyYW1zWzBdLT5idWZmZXIubGVuZ3RoICA9ICh1MzIpIGJ1ZmZlci5sZW5ndGg7CisJcGFyYW1zWzBdLT5idWZmZXIubGVuZ3RoID0gKHUzMikgYnVmZmVyLmxlbmd0aDsKIAlwYXJhbXNbMF0tPmJ1ZmZlci5wb2ludGVyID0gYnVmZmVyLnBvaW50ZXI7Ci0JcGFyYW1zWzBdLT5jb21tb24uZmxhZ3MgICA9IEFPUE9CSl9EQVRBX1ZBTElEOworCXBhcmFtc1swXS0+Y29tbW9uLmZsYWdzID0gQU9QT0JKX0RBVEFfVkFMSUQ7CiAJcGFyYW1zWzFdID0gTlVMTDsKIAogCWluZm8ubm9kZSA9IGhhbmRsZTsKQEAgLTMzNiwxOCArMzEwLDE3IEBACiAKIAkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoTUVUSE9EX05BTUVfX1NSUywgJmluZm8pOwotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlKE1FVEhPRF9OQU1FX19TUlMsICZpbmZvKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyogRGVsZXRlIGFueSByZXR1cm4gb2JqZWN0IChlc3BlY2lhbGx5IGlmIGltcGxpY2l0X3JldHVybiBpcyBlbmFibGVkKSAqLwogCiAJCWlmIChpbmZvLnJldHVybl9vYmplY3QpIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaW5mby5yZXR1cm5fb2JqZWN0KTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLnJldHVybl9vYmplY3QpOwogCQl9CiAJfQogCiAJLyogQ2xlYW4gdXAgYW5kIHJldHVybiB0aGUgc3RhdHVzIGZyb20gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAqLwogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChwYXJhbXNbMF0pOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGFyYW1zWzBdKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYwppbmRleCA4M2M5NDRiLi5lZTVhNWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYwpAQCAtNDcsMTAgKzQ3LDkgQEAKICNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJyc3hmYWNlIikKK0FDUElfTU9EVUxFX05BTUUoInJzeGZhY2UiKQogCiAvKiBMb2NhbCBtYWNyb3MgZm9yIDE2LDMyLWJpdCB0byA2NC1iaXQgY29udmVyc2lvbiAqLwotCiAjZGVmaW5lIEFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBmaWVsZCkgICgob3V0KS0+ZmllbGQgPSAoaW4pLT5maWVsZCkKICNkZWZpbmUgQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBpbikgICAgICAgICAgICAgICAgICAgICAgXAogCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCByZXNvdXJjZV90eXBlKTsgICAgICAgICAgICAgXApAQCAtNjUsOCArNjQsNiBAQAogCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7IFwKIAlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc19sZW5ndGgpOyAgICAgICAgICAgIFwKIAlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2Vfc291cmNlKTsKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZQpAQCAtODksMTcgKzg2LDEzIEBACiAgKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpbmRpY2F0ZWQgYnkgdGhlIHBhc3NlZCBkZXZpY2VfaGFuZGxlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9pcnFfcm91dGluZ190YWJsZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX2dldF9pcnFfcm91dGluZ190YWJsZShhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlICIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUgIik7CiAKIAkvKgogCSAqIE11c3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSBhbmQgYnVmZmVyLCBTbyB3ZSBoYXZlIHRvIGhhdmUgYSBoYW5kbGUKQEAgLTEwOCwxOSArMTAxLDE4IEBACiAJICogd2UnbGwgYmUgcmV0dXJuaW5nIHRoZSBuZWVkZWQgYnVmZmVyIHNpemUsIHNvIGtlZXAgZ29pbmcuCiAJICovCiAJaWYgKCFkZXZpY2VfaGFuZGxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAocmV0X2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIocmV0X2J1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YSAoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YShkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcwpAQCAtMTQ2LDE1ICsxMzgsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpCithY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyIpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciwgU28gd2UgaGF2ZSB0byBoYXZlIGEgaGFuZGxlCkBAIC0xNjMsMTkgKzE1MiwxOSBAQAogCSAqIHdlJ2xsIGJlIHJldHVybmluZyB0aGUgbmVlZGVkIGJ1ZmZlciBzaXplLCBzbyBrZWVwIGdvaW5nLgogCSAqLwogCWlmICghZGV2aWNlX2hhbmRsZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIgKHJldF9idWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHJldF9idWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEgKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjAwLDE1ICsxODksMTIgQEAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZV9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyIpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciwgU28gd2UgaGF2ZSB0byBoYXZlIGEgaGFuZGxlCkBAIC0yMTcsMjAgKzIwMywyMCBAQAogCSAqIHdlJ2xsIGJlIHJldHVybmluZyB0aGUgbmVlZGVkIGJ1ZmZlciBzaXplLCBzbyBrZWVwIGdvaW5nLgogCSAqLwogCWlmICghZGV2aWNlX2hhbmRsZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIgKHJldF9idWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHJldF9idWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEgKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyk7Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMpOworI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNTIsMzcgKzIzOCwzMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfd2Fsa19yZXNvdXJjZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQlBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0sgICAgIHVzZXJfZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQorYWNwaV93YWxrX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkgICAgY2hhciAqcGF0aCwKKwkJICAgIEFDUElfV0FMS19SRVNPVVJDRV9DQUxMQkFDSyB1c2VyX2Z1bmN0aW9uLCB2b2lkICpjb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICAgICBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgICAgICpyZXNvdXJjZTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICAgICAqYnVmZmVyX2VuZDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKmJ1ZmZlcl9lbmQ7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3dhbGtfcmVzb3VyY2VzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3dhbGtfcmVzb3VyY2VzIik7CiAKIAlpZiAoIWRldmljZV9oYW5kbGUgfHwKLQkJKEFDUElfU1RSTkNNUCAocGF0aCwgTUVUSE9EX05BTUVfX0NSUywgc2l6ZW9mIChNRVRIT0RfTkFNRV9fQ1JTKSkgJiYKLQkJIEFDUElfU1RSTkNNUCAocGF0aCwgTUVUSE9EX05BTUVfX1BSUywgc2l6ZW9mIChNRVRIT0RfTkFNRV9fUFJTKSkpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJICAgIChBQ1BJX1NUUk5DTVAocGF0aCwgTUVUSE9EX05BTUVfX0NSUywgc2l6ZW9mKE1FVEhPRF9OQU1FX19DUlMpKSAmJgorCSAgICAgQUNQSV9TVFJOQ01QKHBhdGgsIE1FVEhPRF9OQU1FX19QUlMsIHNpemVvZihNRVRIT0RfTkFNRV9fUFJTKSkpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9tZXRob2RfZGF0YSAoZGV2aWNlX2hhbmRsZSwgcGF0aCwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgcGF0aCwgJmJ1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFNldHVwIHBvaW50ZXJzICovCiAKLQlyZXNvdXJjZSAgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKikgYnVmZmVyLnBvaW50ZXI7Ci0JYnVmZmVyX2VuZCA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3Jlc291cmNlLAotCQkJICAoKHU4ICopIGJ1ZmZlci5wb2ludGVyICsgYnVmZmVyLmxlbmd0aCkpOworCXJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlICopYnVmZmVyLnBvaW50ZXI7CisJYnVmZmVyX2VuZCA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsCisJCQkJICAgKCh1OCAqKSBidWZmZXIucG9pbnRlciArIGJ1ZmZlci5sZW5ndGgpKTsKIAogCS8qIFdhbGsgdGhlIHJlc291cmNlIGxpc3QgKi8KIApAQCAtMjkxLDcgKzI3Myw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXN0YXR1cyA9IHVzZXJfZnVuY3Rpb24gKHJlc291cmNlLCBjb250ZXh0KTsKKwkJc3RhdHVzID0gdXNlcl9mdW5jdGlvbihyZXNvdXJjZSwgY29udGV4dCk7CiAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBBRV9PSzoKQEAgLTMxOCw3ICszMDAsNyBAQAogCiAJCS8qIEdldCB0aGUgbmV4dCByZXNvdXJjZSBkZXNjcmlwdG9yICovCiAKLQkJcmVzb3VyY2UgPSBBQ1BJX05FWFRfUkVTT1VSQ0UgKHJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBBQ1BJX05FWFRfUkVTT1VSQ0UocmVzb3VyY2UpOwogCiAJCS8qIENoZWNrIGZvciBlbmQtb2YtYnVmZmVyICovCiAKQEAgLTMyNywxMyArMzA5LDEzIEBACiAJCX0KIAl9CiAKLWNsZWFudXA6CisgICAgICBjbGVhbnVwOgogCi0JYWNwaV9vc19mcmVlIChidWZmZXIucG9pbnRlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfd2Fsa19yZXNvdXJjZXMpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfd2Fsa19yZXNvdXJjZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM1NCwzMCArMzM2LDI1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICppbl9idWZmZXIpCithY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICppbl9idWZmZXIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzIik7CiAKIAkvKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciAqLwogCi0JaWYgKCghZGV2aWNlX2hhbmRsZSkgICAgICB8fAotCQkoIWluX2J1ZmZlcikgICAgICAgICAgfHwKLQkJKCFpbl9idWZmZXItPnBvaW50ZXIpIHx8Ci0JCSghaW5fYnVmZmVyLT5sZW5ndGgpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKCghZGV2aWNlX2hhbmRsZSkgfHwKKwkgICAgKCFpbl9idWZmZXIpIHx8ICghaW5fYnVmZmVyLT5wb2ludGVyKSB8fCAoIWluX2J1ZmZlci0+bGVuZ3RoKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhIChkZXZpY2VfaGFuZGxlLCBpbl9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3JzX3NldF9zcnNfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgaW5fYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM5OCw0MSArMzc1LDM4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQgKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgICAgICpyZXNvdXJjZSwKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgICAgICAqb3V0KQorYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICpvdXQpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICAgICAgKmFkZHJlc3MxNjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgICAgICAqYWRkcmVzczMyOwotCisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICphZGRyZXNzMTY7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICphZGRyZXNzMzI7CiAKIAlzd2l0Y2ggKHJlc291cmNlLT5pZCkgewogCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzE2OgogCi0JCWFkZHJlc3MxNiA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKikgJnJlc291cmNlLT5kYXRhOwotCQlBQ1BJX0NPUFlfQUREUkVTUyAob3V0LCBhZGRyZXNzMTYpOworCQlhZGRyZXNzMTYgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICopJnJlc291cmNlLT5kYXRhOworCQlBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGFkZHJlc3MxNik7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MzMjoKIAotCQlhZGRyZXNzMzIgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICopICZyZXNvdXJjZS0+ZGF0YTsKLQkJQUNQSV9DT1BZX0FERFJFU1MgKG91dCwgYWRkcmVzczMyKTsKKwkJYWRkcmVzczMyID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqKSZyZXNvdXJjZS0+ZGF0YTsKKwkJQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBhZGRyZXNzMzIpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQ6CiAKIAkJLyogU2ltcGxlIGNvcHkgZm9yIDY0IGJpdCBzb3VyY2UgKi8KIAotCQlBQ1BJX01FTUNQWSAob3V0LCAmcmVzb3VyY2UtPmRhdGEsIHNpemVvZiAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSk7CisJCUFDUElfTUVNQ1BZKG91dCwgJnJlc291cmNlLT5kYXRhLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJcmV0dXJuIChBRV9PSyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggY2JjZGEzMC4uYzZkYjU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC05LDE0ICs5LDEwIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CS8qIGZvciBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nKCkgKi8KIAotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfQlVTX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJzY2FuIikKLQorQUNQSV9NT0RVTEVfTkFNRSgic2NhbiIpCiAjZGVmaW5lIFNUUlVDVF9UT19JTlQocykJKCooKGludCopJnMpKQotCi1leHRlcm4gc3RydWN0IGFjcGlfZGV2aWNlCQkqYWNwaV9yb290OwotCitleHRlcm4gc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX3Jvb3Q7CiAKICNkZWZpbmUgQUNQSV9CVVNfQ0xBU1MJCQkic3lzdGVtX2J1cyIKICNkZWZpbmUgQUNQSV9CVVNfSElECQkJIkFDUElfQlVTIgpAQCAtMjcsMTMgKzIzLDExIEBACiBERUZJTkVfU1BJTkxPQ0soYWNwaV9kZXZpY2VfbG9jayk7CiBMSVNUX0hFQUQoYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpOwogCi1zdGF0aWMgaW50Ci1hY3BpX2J1c190cmltKHN0cnVjdCBhY3BpX2RldmljZQkqc3RhcnQsCi0JCWludCBybWRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfYnVzX3RyaW0oc3RydWN0IGFjcGlfZGV2aWNlICpzdGFydCwgaW50IHJtZGV2aWNlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqIGtvYmopCitzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihrb2JqLHN0cnVjdCBhY3BpX2RldmljZSxrb2JqKTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGtvYmopOwogCWlmIChkZXYtPnBucC5jaWRfbGlzdCkKIAkJa2ZyZWUoZGV2LT5wbnAuY2lkX2xpc3QpOwogCWtmcmVlKGRldik7CkBAIC00MSwzNCArMzUsMzQgQEAKIAogc3RydWN0IGFjcGlfZGV2aWNlX2F0dHJpYnV0ZSB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBhY3BpX2RldmljZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisJIHNzaXplX3QoKnNob3cpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgY2hhciAqKTsKKwkgc3NpemVfdCgqc3RvcmUpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwogfTsKIAogdHlwZWRlZiB2b2lkIGFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBrb2JqZWN0ICosCi0JCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqKTsKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKik7CiAKIHN0YXRpYyB2b2lkIHNldHVwX3N5c19mc19kZXZpY2VfZmlsZXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYsCi0JCWFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzICpmdW5jKTsKKwkJCQkgICAgICBhY3BpX2RldmljZV9zeXNmc19maWxlcyAqIGZ1bmMpOwogCiAjZGVmaW5lIGNyZWF0ZV9zeXNmc19kZXZpY2VfZmlsZXMoZGV2KQlcCiAJc2V0dXBfc3lzX2ZzX2RldmljZV9maWxlcyhkZXYsIChhY3BpX2RldmljZV9zeXNmc19maWxlcyAqKSZzeXNmc19jcmVhdGVfZmlsZSkKICNkZWZpbmUgcmVtb3ZlX3N5c2ZzX2RldmljZV9maWxlcyhkZXYpCVwKIAlzZXR1cF9zeXNfZnNfZGV2aWNlX2ZpbGVzKGRldiwgKGFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzICopJnN5c2ZzX3JlbW92ZV9maWxlKQogCi0KICNkZWZpbmUgdG9fYWNwaV9kZXZpY2UobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBhY3BpX2RldmljZSwga29iaikKICNkZWZpbmUgdG9faGFuZGxlX2F0dHIobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBhY3BpX2RldmljZV9hdHRyaWJ1dGUsIGF0dHIpOwogCiBzdGF0aWMgc3NpemVfdCBhY3BpX2RldmljZV9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKKwkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IHRvX2FjcGlfZGV2aWNlKGtvYmopOwogCXN0cnVjdCBhY3BpX2RldmljZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZSA9IHRvX2hhbmRsZV9hdHRyKGF0dHIpOwogCXJldHVybiBhdHRyaWJ1dGUtPnNob3cgPyBhdHRyaWJ1dGUtPnNob3coZGV2aWNlLCBidWYpIDogLUVJTzsKIH0KIHN0YXRpYyBzc2l6ZV90IGFjcGlfZGV2aWNlX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKKwkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IHRvX2FjcGlfZGV2aWNlKGtvYmopOwogCXN0cnVjdCBhY3BpX2RldmljZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZSA9IHRvX2hhbmRsZV9hdHRyKGF0dHIpOwpAQCAtNzYsMTMgKzcwLDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGFjcGlfZGV2aWNlX3N5c2ZzX29wcyA9IHsKLQkuc2hvdwk9IGFjcGlfZGV2aWNlX2F0dHJfc2hvdywKLQkuc3RvcmUJPSBhY3BpX2RldmljZV9hdHRyX3N0b3JlLAorCS5zaG93ID0gYWNwaV9kZXZpY2VfYXR0cl9zaG93LAorCS5zdG9yZSA9IGFjcGlfZGV2aWNlX2F0dHJfc3RvcmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9hY3BpX25zID0gewotCS5zeXNmc19vcHMJPSAmYWNwaV9kZXZpY2Vfc3lzZnNfb3BzLAotCS5yZWxlYXNlCT0gYWNwaV9kZXZpY2VfcmVsZWFzZSwKKwkuc3lzZnNfb3BzID0gJmFjcGlfZGV2aWNlX3N5c2ZzX29wcywKKwkucmVsZWFzZSA9IGFjcGlfZGV2aWNlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgaW50IG5hbWVzcGFjZV9ob3RwbHVnKHN0cnVjdCBrc2V0ICprc2V0LCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKQEAgLTExMCwxNiArMTA0LDE2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGtzZXQgYWNwaV9uYW1lc3BhY2Vfa3NldCA9IHsKLQkua29iagkJPSB7IAotCQkubmFtZSA9ICJuYW1lc3BhY2UiLAotCX0sCisJLmtvYmogPSB7CisJCSAubmFtZSA9ICJuYW1lc3BhY2UiLAorCQkgfSwKIAkuc3Vic3lzID0gJmFjcGlfc3Vic3lzLAotCS5rdHlwZQk9ICZrdHlwZV9hY3BpX25zLAorCS5rdHlwZSA9ICZrdHlwZV9hY3BpX25zLAogCS5ob3RwbHVnX29wcyA9ICZuYW1lc3BhY2VfaG90cGx1Z19vcHMsCiB9OwogCi0KLXN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgc3RydWN0IGFjcGlfZGV2aWNlICogcGFyZW50KQorc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50KQogewogCS8qCiAJICogTGlua2FnZQpAQCAtMTM0LDE0ICsxMjgsMTQgQEAKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCWlmIChkZXZpY2UtPnBhcmVudCkgewogCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPm5vZGUsICZkZXZpY2UtPnBhcmVudC0+Y2hpbGRyZW4pOwotCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmdfbGlzdCwmZGV2aWNlLT5wYXJlbnQtPmdfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+Z19saXN0LCAmZGV2aWNlLT5wYXJlbnQtPmdfbGlzdCk7CiAJfSBlbHNlCi0JCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+Z19saXN0LCZhY3BpX2RldmljZV9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5nX2xpc3QsICZhY3BpX2RldmljZV9saXN0KTsKIAlpZiAoZGV2aWNlLT53YWtldXAuZmxhZ3MudmFsaWQpCi0JCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+d2FrZXVwX2xpc3QsJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT53YWtldXBfbGlzdCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KTsKIAlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAKLQlzdHJsY3B5KGRldmljZS0+a29iai5uYW1lLGRldmljZS0+cG5wLmJ1c19pZCxLT0JKX05BTUVfTEVOKTsKKwlzdHJsY3B5KGRldmljZS0+a29iai5uYW1lLCBkZXZpY2UtPnBucC5idXNfaWQsIEtPQkpfTkFNRV9MRU4pOwogCWlmIChwYXJlbnQpCiAJCWRldmljZS0+a29iai5wYXJlbnQgPSAmcGFyZW50LT5rb2JqOwogCWRldmljZS0+a29iai5rdHlwZSA9ICZrdHlwZV9hY3BpX25zOwpAQCAtMTUwLDEwICsxNDQsNyBAQAogCWNyZWF0ZV9zeXNmc19kZXZpY2VfZmlsZXMoZGV2aWNlKTsKIH0KIAotc3RhdGljIGludAotYWNwaV9kZXZpY2VfdW5yZWdpc3RlciAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsIAotCWludAkJCXR5cGUpCitzdGF0aWMgaW50IGFjcGlfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJaWYgKGRldmljZS0+cGFyZW50KSB7CkBAIC0xNzIsMTEgKzE2Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLWFjcGlfYnVzX2RhdGFfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQl1MzIJCQlmdW5jdGlvbiwKLQl2b2lkCQkJKmNvbnRleHQpCit2b2lkIGFjcGlfYnVzX2RhdGFfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmdW5jdGlvbiwgdm9pZCAqY29udGV4dCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19kYXRhX2hhbmRsZXIiKTsKIApAQCAtMTg1LDEzICsxNzIsMTEgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotc3RhdGljIGludAotYWNwaV9idXNfZ2V0X3Bvd2VyX2ZsYWdzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9idXNfZ2V0X3Bvd2VyX2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZSA9IE5VTEw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOworCXUzMiBpID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2dldF9wb3dlcl9mbGFncyIpOwogCkBAIC0yMTAsMTEgKzE5NSwxMSBAQAogCSAqLwogCWZvciAoaSA9IEFDUElfU1RBVEVfRDA7IGkgPD0gQUNQSV9TVEFURV9EMzsgaSsrKSB7CiAJCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSAqcHMgPSAmZGV2aWNlLT5wb3dlci5zdGF0ZXNbaV07Ci0JCWNoYXIJCW9iamVjdF9uYW1lWzVdID0geydfJywnUCcsJ1InLCcwJytpLCdcMCd9OworCQljaGFyIG9iamVjdF9uYW1lWzVdID0geyAnXycsICdQJywgJ1InLCAnMCcgKyBpLCAnXDAnIH07CiAKIAkJLyogRXZhbHVhdGUgIl9QUngiIHRvIHNlIGlmIHBvd2VyIHJlc291cmNlcyBhcmUgcmVmZXJlbmNlZCAqLwogCQlhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZShkZXZpY2UtPmhhbmRsZSwgb2JqZWN0X25hbWUsIE5VTEwsCi0JCQkmcHMtPnJlc291cmNlcyk7CisJCQkJCSZwcy0+cmVzb3VyY2VzKTsKIAkJaWYgKHBzLT5yZXNvdXJjZXMuY291bnQpIHsKIAkJCWRldmljZS0+cG93ZXIuZmxhZ3MucG93ZXJfcmVzb3VyY2VzID0gMTsKIAkJCXBzLT5mbGFncy52YWxpZCA9IDE7CkBAIC0yMzIsNyArMjE3LDcgQEAKIAkJaWYgKHBzLT5yZXNvdXJjZXMuY291bnQgfHwgcHMtPmZsYWdzLmV4cGxpY2l0X3NldCkKIAkJCXBzLT5mbGFncy52YWxpZCA9IDE7CiAKLQkJcHMtPnBvd2VyID0gLTE7CQkvKiBVbmtub3duIC0gZHJpdmVyIGFzc2lnbmVkICovCisJCXBzLT5wb3dlciA9IC0xOwkvKiBVbmtub3duIC0gZHJpdmVyIGFzc2lnbmVkICovCiAJCXBzLT5sYXRlbmN5ID0gLTE7CS8qIFVua25vd24gLSBkcml2ZXIgYXNzaWduZWQgKi8KIAl9CiAKQEAgLTI0OSwxMyArMjM0LDEwIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1pbnQKLWFjcGlfbWF0Y2hfaWRzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQljaGFyCQkJKmlkcykKK2ludCBhY3BpX21hdGNoX2lkcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgY2hhciAqaWRzKQogewogCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAogCWlmIChkZXZpY2UtPmZsYWdzLmhhcmR3YXJlX2lkKQogCQlpZiAoc3Ryc3RyKGlkcywgZGV2aWNlLT5wbnAuaGFyZHdhcmVfaWQpKQpAQCAtMjY2LDI3ICsyNDgsMjUgQEAKIAkJaW50IGk7CiAKIAkJLyogY29tcGFyZSBtdWx0aXBsZSBfQ0lEIGVudHJpZXMgYWdhaW5zdCBkcml2ZXIgaWRzICovCi0JCWZvciAoaSA9IDA7IGkgPCBjaWRfbGlzdC0+Y291bnQ7IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgY2lkX2xpc3QtPmNvdW50OyBpKyspIHsKIAkJCWlmIChzdHJzdHIoaWRzLCBjaWRfbGlzdC0+aWRbaV0udmFsdWUpKQogCQkJCWdvdG8gRG9uZTsKIAkJfQogCX0KIAllcnJvciA9IC1FTk9FTlQ7CiAKLSBEb25lOgorICAgICAgRG9uZToKIAlpZiAoYnVmZmVyLnBvaW50ZXIpCiAJCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiAJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfYnVzX2V4dHJhY3Rfd2FrZXVwX2RldmljZV9wb3dlcl9wYWNrYWdlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQl1bmlvbiBhY3BpX29iamVjdAkqcGFja2FnZSkKK2FjcGlfYnVzX2V4dHJhY3Rfd2FrZXVwX2RldmljZV9wb3dlcl9wYWNrYWdlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgIHVuaW9uIGFjcGlfb2JqZWN0ICpwYWNrYWdlKQogewotCWludCAJIGkgPSAwOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplbGVtZW50ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisJdW5pb24gYWNwaV9vYmplY3QgKmVsZW1lbnQgPSBOVUxMOwogCiAJaWYgKCFkZXZpY2UgfHwgIXBhY2thZ2UgfHwgKHBhY2thZ2UtPnBhY2thZ2UuY291bnQgPCAyKSkKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CkBAIC0yOTYsMTQgKzI3NiwxNyBAQAogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAlpZiAoZWxlbWVudC0+dHlwZSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewogCQlpZiAoKGVsZW1lbnQtPnBhY2thZ2UuY291bnQgPCAyKSB8fAotCQkJKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB8fAotCQkJKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMV0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikpCisJCSAgICAoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9CisJCSAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJICAgIHx8IChlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzFdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpKQogCQkJcmV0dXJuIEFFX0JBRF9EQVRBOwotCQlkZXZpY2UtPndha2V1cC5ncGVfZGV2aWNlID0gZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1swXS5yZWZlcmVuY2UuaGFuZGxlOwotCQlkZXZpY2UtPndha2V1cC5ncGVfbnVtYmVyID0gKHUzMillbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzFdLmludGVnZXIudmFsdWU7Ci0JfWVsc2UgaWYgKGVsZW1lbnQtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJZGV2aWNlLT53YWtldXAuZ3BlX2RldmljZSA9CisJCSAgICBlbGVtZW50LT5wYWNrYWdlLmVsZW1lbnRzWzBdLnJlZmVyZW5jZS5oYW5kbGU7CisJCWRldmljZS0+d2FrZXVwLmdwZV9udW1iZXIgPQorCQkgICAgKHUzMikgZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXS5pbnRlZ2VyLnZhbHVlOworCX0gZWxzZSBpZiAoZWxlbWVudC0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQlkZXZpY2UtPndha2V1cC5ncGVfbnVtYmVyID0gZWxlbWVudC0+aW50ZWdlci52YWx1ZTsKLQl9ZWxzZQorCX0gZWxzZQogCQlyZXR1cm4gQUVfQkFEX0RBVEE7CiAKIAllbGVtZW50ID0gJihwYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzWzFdKTsKQEAgLTMxNiw5ICsyOTksOSBAQAogCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwogCX0KIAlkZXZpY2UtPndha2V1cC5yZXNvdXJjZXMuY291bnQgPSBwYWNrYWdlLT5wYWNrYWdlLmNvdW50IC0gMjsKLQlmb3IgKGk9MDsgaSA8IGRldmljZS0+d2FrZXVwLnJlc291cmNlcy5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRldmljZS0+d2FrZXVwLnJlc291cmNlcy5jb3VudDsgaSsrKSB7CiAJCWVsZW1lbnQgPSAmKHBhY2thZ2UtPnBhY2thZ2UuZWxlbWVudHNbaSArIDJdKTsKLQkJaWYgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0FOWSApIHsKKwkJaWYgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgewogCQkJcmV0dXJuIEFFX0JBRF9EQVRBOwogCQl9CiAKQEAgLTMyOCwxMyArMzExLDExIEBACiAJcmV0dXJuIEFFX09LOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2J1c19nZXRfd2FrZXVwX2RldmljZV9mbGFncyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX2dldF93YWtldXBfZGV2aWNlX2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QJKnBhY2thZ2UgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19nZXRfd2FrZXVwX2ZsYWdzIik7CiAKQEAgLTM0NSwyMSArMzI2LDIyIEBACiAJCWdvdG8gZW5kOwogCX0KIAotCXBhY2thZ2UgPSAodW5pb24gYWNwaV9vYmplY3QgKikgYnVmZmVyLnBvaW50ZXI7CisJcGFja2FnZSA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCXN0YXR1cyA9IGFjcGlfYnVzX2V4dHJhY3Rfd2FrZXVwX2RldmljZV9wb3dlcl9wYWNrYWdlKGRldmljZSwgcGFja2FnZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJFcnJvciBleHRyYWN0aW5nIF9QUlcgcGFja2FnZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkVycm9yIGV4dHJhY3RpbmcgX1BSVyBwYWNrYWdlXG4iKSk7CiAJCWdvdG8gZW5kOwogCX0KIAogCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CiAKIAlkZXZpY2UtPndha2V1cC5mbGFncy52YWxpZCA9IDE7Ci0JLyogUG93ZXIgYnV0dG9uLCBMaWQgc3dpdGNoIGFsd2F5cyBlbmFibGUgd2FrZXVwKi8KKwkvKiBQb3dlciBidXR0b24sIExpZCBzd2l0Y2ggYWx3YXlzIGVuYWJsZSB3YWtldXAgKi8KIAlpZiAoIWFjcGlfbWF0Y2hfaWRzKGRldmljZSwgIlBOUDBDMEQsUE5QMEMwQyxQTlAwQzBFIikpCiAJCWRldmljZS0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlID0gMTsKIAotZW5kOgorICAgICAgZW5kOgogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJZGV2aWNlLT5mbGFncy53YWtlX2NhcGFibGUgPSAwOwogCXJldHVybl9WQUxVRSgwKTsKQEAgLTM2OCw4ICszNTAsOCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJQUNQSSBob3RwbHVnIHN5c2ZzIGRldmljZSBmaWxlIHN1cHBvcnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBhY3BpX2VqZWN0X3N0b3JlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCAKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3QgYWNwaV9lamVjdF9zdG9yZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiAKICNkZWZpbmUgQUNQSV9ERVZJQ0VfQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpIFwKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2VfYXR0cmlidXRlIGFjcGlfZGV2aWNlX2F0dHJfIyNfbmFtZSA9IFwKQEAgLTM4MywxMiArMzY1LDExIEBACiAgKiBAZnVuYzoJZnVuY3Rpb24gcG9pbnRlciB0byBjcmVhdGUgb3IgZGVzdHJveSB0aGUgZGV2aWNlIGZpbGUKICAqLwogc3RhdGljIHZvaWQKLXNldHVwX3N5c19mc19kZXZpY2VfZmlsZXMgKAotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2LAotCWFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzICpmdW5jKQorc2V0dXBfc3lzX2ZzX2RldmljZV9maWxlcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwKKwkJCSAgYWNwaV9kZXZpY2Vfc3lzZnNfZmlsZXMgKiBmdW5jKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXM7Ci0JYWNwaV9oYW5kbGUJCXRlbXAgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSB0ZW1wID0gTlVMTDsKIAogCS8qCiAJICogSWYgZGV2aWNlIGhhcyBfRUowLCAnZWplY3QnIGZpbGUgaXMgY3JlYXRlZCB0aGF0IGlzIHVzZWQgdG8gdHJpZ2dlcgpAQCAtMzk2LDExICszNzcsMTAgQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2LT5oYW5kbGUsICJfRUowIiwgJnRlbXApOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKLQkJKCooZnVuYykpKCZkZXYtPmtvYmosJmFjcGlfZGV2aWNlX2F0dHJfZWplY3QuYXR0cik7CisJCSgqKGZ1bmMpKSAoJmRldi0+a29iaiwgJmFjcGlfZGV2aWNlX2F0dHJfZWplY3QuYXR0cik7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfZWplY3Rfb3BlcmF0aW9uKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGxvY2thYmxlKQorc3RhdGljIGludCBhY3BpX2VqZWN0X29wZXJhdGlvbihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBsb2NrYWJsZSkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKIAl1bmlvbiBhY3BpX29iamVjdCBhcmc7CkBAIC00MjksMjcgKzQwOSwyNSBAQAogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX0VKMCIsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybigtRU5PREVWKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKIAl9CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuICgwKTsKIH0KIAotCiBzdGF0aWMgc3NpemVfdAogYWNwaV9lamVjdF9zdG9yZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50CXJlc3VsdDsKLQlpbnQJcmV0ID0gY291bnQ7Ci0JaW50CWlzbG9ja2FibGU7Ci0JYWNwaV9zdGF0dXMJc3RhdHVzOwotCWFjcGlfaGFuZGxlCWhhbmRsZTsKLQlhY3BpX29iamVjdF90eXBlCXR5cGUgPSAwOworCWludCByZXN1bHQ7CisJaW50IHJldCA9IGNvdW50OworCWludCBpc2xvY2thYmxlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlID0gMDsKIAogCWlmICgoIWNvdW50KSB8fCAoYnVmWzBdICE9ICcxJykpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCiAjaWZuZGVmIEZPUkNFX0VKRUNUCiAJaWYgKGRldmljZS0+ZHJpdmVyID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0RFVjsKQEAgLTQ1Nyw3ICs0MzUsNyBAQAogCX0KICNlbmRpZgogCXN0YXR1cyA9IGFjcGlfZ2V0X3R5cGUoZGV2aWNlLT5oYW5kbGUsICZ0eXBlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgKCFkZXZpY2UtPmZsYWdzLmVqZWN0YWJsZSkgKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICghZGV2aWNlLT5mbGFncy5lamVjdGFibGUpKSB7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTQ3NiwxOCArNDU0LDE1IEBACiAJaWYgKHJlc3VsdCkgewogCQlyZXQgPSAtRUJVU1k7CiAJfQotZXJyOgorICAgICAgZXJyOgogCXJldHVybiByZXQ7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQKLWFjcGlfYnVzX2dldF9wZXJmX2ZsYWdzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9idXNfZ2V0X3BlcmZfZmxhZ3Moc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJZGV2aWNlLT5wZXJmb3JtYW5jZS5zdGF0ZSA9IEFDUElfU1RBVEVfVU5LTk9XTjsKIAlyZXR1cm4gMDsKQEAgLTUwMCw3ICs0NzUsNiBAQAogc3RhdGljIExJU1RfSEVBRChhY3BpX2J1c19kcml2ZXJzKTsKIHN0YXRpYyBERUNMQVJFX01VVEVYKGFjcGlfYnVzX2RyaXZlcnNfbG9jayk7CiAKLQogLyoqCiAgKiBhY3BpX2J1c19tYXRjaCAKICAqIC0tLS0tLS0tLS0tLS0tCkBAIC01MDgsMTYgKzQ4MiwxMyBAQAogICogbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGRyaXZlcidzIGNyaXRlcmlhLgogICovCiBzdGF0aWMgaW50Ci1hY3BpX2J1c19tYXRjaCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0Jc3RydWN0IGFjcGlfZHJpdmVyCSpkcml2ZXIpCithY3BpX2J1c19tYXRjaChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCiB7CiAJaWYgKGRyaXZlciAmJiBkcml2ZXItPm9wcy5tYXRjaCkKIAkJcmV0dXJuIGRyaXZlci0+b3BzLm1hdGNoKGRldmljZSwgZHJpdmVyKTsKIAlyZXR1cm4gYWNwaV9tYXRjaF9pZHMoZGV2aWNlLCBkcml2ZXItPmlkcyk7CiB9CiAKLQogLyoqCiAgKiBhY3BpX2J1c19kcml2ZXJfaW5pdCAKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MjUsMTEgKzQ5Niw5IEBACiAgKiBkcml2ZXIgaXMgYm91bmQgdG8gYSBkZXZpY2UuICBJbnZva2VzIHRoZSBkcml2ZXIncyBhZGQoKSBhbmQgc3RhcnQoKSBvcHMuCiAgKi8KIHN0YXRpYyBpbnQKLWFjcGlfYnVzX2RyaXZlcl9pbml0ICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwgCi0Jc3RydWN0IGFjcGlfZHJpdmVyCSpkcml2ZXIpCithY3BpX2J1c19kcml2ZXJfaW5pdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2RyaXZlcl9pbml0Iik7CiAKQEAgLTU1MywxMyArNTIyLDEyIEBACiAJICogdXBvbiBwb3NzaWJsZSBjb25maWd1cmF0aW9uIGFuZCBjdXJyZW50bHkgYWxsb2NhdGVkIHJlc291cmNlcy4KIAkgKi8KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRyaXZlciBzdWNjZXNzZnVsbHkgYm91bmQgdG8gZGV2aWNlXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRHJpdmVyIHN1Y2Nlc3NmdWxseSBib3VuZCB0byBkZXZpY2VcbiIpKTsKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLWludAotYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0ICgKLQkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKQEAgLTU3OCwxNiArNTQ2LDE3IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9kcml2ZXJfYXR0YWNoKHN0cnVjdCBhY3BpX2RyaXZlciAqIGRydikKK3N0YXRpYyBpbnQgYWNwaV9kcml2ZXJfYXR0YWNoKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAJaW50IGNvdW50ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZHJpdmVyX2F0dGFjaCIpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgZ19saXN0KTsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPQorCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgZ19saXN0KTsKIAogCQlpZiAoZGV2LT5kcml2ZXIgfHwgIWRldi0+c3RhdHVzLnByZXNlbnQpCiAJCQljb250aW51ZTsKQEAgLTU5OCw3ICs1NjcsOCBAQAogCQkJCWFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXYpOwogCQkJCWF0b21pY19pbmMoJmRydi0+cmVmZXJlbmNlcyk7CiAJCQkJY291bnQrKzsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBkcml2ZXIgWyVzXSBmb3IgZGV2aWNlIFslc11cbiIsCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiRm91bmQgZHJpdmVyIFslc10gZm9yIGRldmljZSBbJXNdXG4iLAogCQkJCQkJICBkcnYtPm5hbWUsIGRldi0+cG5wLmJ1c19pZCkpOwogCQkJfQogCQl9CkBAIC02MDgsMjAgKzU3OCwyMSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9kcml2ZXJfZGV0YWNoKHN0cnVjdCBhY3BpX2RyaXZlciAqIGRydikKK3N0YXRpYyBpbnQgYWNwaV9kcml2ZXJfZGV0YWNoKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2RyaXZlcl9kZXRhY2giKTsKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsbmV4dCwmYWNwaV9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSxzdHJ1Y3QgYWNwaV9kZXZpY2UsZ19saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfZGV2aWNlX2xpc3QpIHsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPQorCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgZ19saXN0KTsKIAogCQlpZiAoZGV2LT5kcml2ZXIgPT0gZHJ2KSB7CiAJCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCQlpZiAoZHJ2LT5vcHMucmVtb3ZlKQotCQkJCWRydi0+b3BzLnJlbW92ZShkZXYsQUNQSV9CVVNfUkVNT1ZBTF9OT1JNQUwpOworCQkJCWRydi0+b3BzLnJlbW92ZShkZXYsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKIAkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCQlkZXYtPmRyaXZlciA9IE5VTEw7CiAJCQlkZXYtPmRyaXZlcl9kYXRhID0gTlVMTDsKQEAgLTY0MCw5ICs2MTEsNyBAQAogICogbnVtYmVyIG9mIGRldmljZXMgdGhhdCB3ZXJlIGNsYWltZWQgYnkgdGhlIGRyaXZlciwgb3IgYSBuZWdhdGl2ZQogICogZXJyb3Igc3RhdHVzIGZvciBmYWlsdXJlLgogICovCi1pbnQKLWFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciAoCi0Jc3RydWN0IGFjcGlfZHJpdmVyCSpkcml2ZXIpCitpbnQgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKQogewogCWludCBjb3VudDsKIApAQCAtNjYxLDggKzYzMCw4IEBACiAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcik7CiAKIC8qKgogICogYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIgCkBAIC02NzAsOSArNjM5LDcgQEAKICAqIFVucmVnaXN0ZXJzIGEgZHJpdmVyIHdpdGggdGhlIEFDUEkgYnVzLiAgU2VhcmNoZXMgdGhlIG5hbWVzcGFjZSBmb3IgYWxsCiAgKiBkZXZpY2VzIHRoYXQgbWF0Y2ggdGhlIGRyaXZlcidzIGNyaXRlcmlhIGFuZCB1bmJpbmRzLgogICovCi1pbnQKLWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyICgKLQlzdHJ1Y3QgYWNwaV9kcml2ZXIJKmRyaXZlcikKK2ludCBhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC02ODUsMTEgKzY1MiwxMiBAQAogCQkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAkJCWxpc3RfZGVsX2luaXQoJmRyaXZlci0+bm9kZSk7CiAJCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCX0gCi0JfSBlbHNlIAorCQl9CisJfSBlbHNlCiAJCWVycm9yID0gLUVJTlZBTDsKIAlyZXR1cm5fVkFMVUUoZXJyb3IpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogLyoqCkBAIC02OTgsMTggKzY2NiwxNyBAQAogICogUGFyc2VzIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgZHJpdmVycyBsb29raW5nIGZvciBhIGRyaXZlciBhcHBsaWNhYmxlIGZvcgogICogdGhlIHNwZWNpZmllZCBkZXZpY2UuCiAgKi8KLXN0YXRpYyBpbnQKLWFjcGlfYnVzX2ZpbmRfZHJpdmVyICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9idXNfZmluZF9kcml2ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSogbm9kZSwgKm5leHQ7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19maW5kX2RyaXZlciIpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSxuZXh0LCZhY3BpX2J1c19kcml2ZXJzKSB7Ci0JCXN0cnVjdCBhY3BpX2RyaXZlciAqIGRyaXZlciA9IGNvbnRhaW5lcl9vZihub2RlLHN0cnVjdCBhY3BpX2RyaXZlcixub2RlKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfYnVzX2RyaXZlcnMpIHsKKwkJc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIgPQorCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RyaXZlciwgbm9kZSk7CiAKIAkJYXRvbWljX2luYygmZHJpdmVyLT5yZWZlcmVuY2VzKTsKIAkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwpAQCAtNzIzLDIxICs2OTAsMTggQEAKIAl9CiAJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCi0gRG9uZToKKyAgICAgIERvbmU6CiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBFbnVtZXJhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCAKLWFjcGlfYnVzX2dldF9mbGFncyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX2dldF9mbGFncyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9oYW5kbGUJCXRlbXAgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfaGFuZGxlIHRlbXAgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfZ2V0X2ZsYWdzIik7CiAKQEAgLTc4OCwxMSArNzUyLDEyIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX2RldmljZV9nZXRfYnVzaWQoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKQorc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfZ2V0X2J1c2lkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJCSAgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKIHsKLQljaGFyCQkJYnVzX2lkWzVdID0geyc/JywwfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge3NpemVvZihidXNfaWQpLCBidXNfaWR9OwotCWludAkJCWkgPSAwOworCWNoYXIgYnVzX2lkWzVdID0geyAnPycsIDAgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YoYnVzX2lkKSwgYnVzX2lkIH07CisJaW50IGkgPSAwOwogCiAJLyoKIAkgKiBCdXMgSUQKQEAgLTgyNCwyMSArNzg5LDIyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhY3BpX2RldmljZV9zZXRfaWQoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBwYXJlbnQsCi0JCQkgICAgICAgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKK3N0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3NldF9pZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgIGludCB0eXBlKQogewotCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvCSppbmZvOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCWNoYXIJCQkqaGlkID0gTlVMTDsKLQljaGFyCQkJKnVpZCA9IE5VTEw7CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwljaGFyICpoaWQgPSBOVUxMOworCWNoYXIgKnVpZCA9IE5VTEw7CiAJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdCA9IE5VTEw7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDUElfQlVTX1RZUEVfREVWSUNFOgogCQlzdGF0dXMgPSBhY3BpX2dldF9vYmplY3RfaW5mbyhoYW5kbGUsICZidWZmZXIpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXByaW50aygiJXM6IEVycm9yIHJlYWRpbmcgZGV2aWNlIGluZm9cbiIsX19GVU5DVElPTl9fKTsKKwkJCXByaW50aygiJXM6IEVycm9yIHJlYWRpbmcgZGV2aWNlIGluZm9cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtOTA0LDcgKzg3MCw3IEBACiAJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKIH0KIAotc3RhdGljIGludCBhY3BpX2RldmljZV9zZXRfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIGludCB0eXBlKQorc3RhdGljIGludCBhY3BpX2RldmljZV9zZXRfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC05MTYsMTAgKzg4MiwxMCBAQAogCSAqIHRvIGJlIGNhcmVmdWwgd2l0aCBmaXhlZC1mZWF0dXJlIGRldmljZXMgYXMgdGhleSBhbGwgYXR0YWNoIHRvIHRoZQogCSAqIHJvb3Qgb2JqZWN0LgogCSAqLwotCWlmICh0eXBlICE9IEFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OICYmIAorCWlmICh0eXBlICE9IEFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OICYmCiAJICAgIHR5cGUgIT0gQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT04pIHsKIAkJc3RhdHVzID0gYWNwaV9hdHRhY2hfZGF0YShkZXZpY2UtPmhhbmRsZSwKLQkJCWFjcGlfYnVzX2RhdGFfaGFuZGxlciwgZGV2aWNlKTsKKwkJCQkJICBhY3BpX2J1c19kYXRhX2hhbmRsZXIsIGRldmljZSk7CiAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlwcmludGsoIkVycm9yIGF0dGFjaGluZyBkZXZpY2UgZGF0YVxuIik7CkBAIC05MjksMTIgKzg5NSwxMyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX2dldF9kZWJ1Z19pbmZvKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKK3N0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX2dldF9kZWJ1Z19pbmZvKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgICBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKQogewogI2lmZGVmIENPTkZJR19BQ1BJX0RFQlVHX09VVFBVVAotCWNoYXIJCSp0eXBlX3N0cmluZyA9IE5VTEw7Ci0JY2hhcgkJbmFtZVs4MF0gPSB7Jz8nLCdcMCd9OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7c2l6ZW9mKG5hbWUpLCBuYW1lfTsKKwljaGFyICp0eXBlX3N0cmluZyA9IE5VTEw7CisJY2hhciBuYW1lWzgwXSA9IHsgJz8nLCAnXDAnIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKG5hbWUpLCBuYW1lIH07CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDUElfQlVTX1RZUEVfREVWSUNFOgpAQCAtOTY4LDE4ICs5MzUsMTQgQEAKIAl9CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiRm91bmQgJXMgJXMgWyVwXVxuIiwgdHlwZV9zdHJpbmcsIG5hbWUsIGhhbmRsZSk7Ci0jZW5kaWYgLypDT05GSUdfQUNQSV9ERUJVR19PVVRQVVQqLworI2VuZGlmCQkJCS8qQ09ORklHX0FDUElfREVCVUdfT1VUUFVUICovCiB9CiAKLQotc3RhdGljIGludAotYWNwaV9idXNfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwKLQlpbnQgcm1kZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwgaW50IHJtZGV2aWNlKQogewotCWludCAJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2RyaXZlcgkqZHJpdmVyOwotCQorCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOworCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfcmVtb3ZlIik7CiAKIAlpZiAoIWRldikKQEAgLTEwMTIsMjIgKzk3NSwxOCBAQAogCQlpZiAoKGRldi0+cGFyZW50KSAmJiAoZGV2LT5wYXJlbnQtPm9wcy51bmJpbmQpKQogCQkJZGV2LT5wYXJlbnQtPm9wcy51bmJpbmQoZGV2KTsKIAl9Ci0JCisKIAlhY3BpX2RldmljZV91bnJlZ2lzdGVyKGRldiwgQUNQSV9CVVNfUkVNT1ZBTF9FSkVDVCk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIGludAotYWNwaV9hZGRfc2luZ2xlX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSoqY2hpbGQsCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpwYXJlbnQsCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlpbnQJCQl0eXBlKQorYWNwaV9hZGRfc2luZ2xlX29iamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCwKKwkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LCBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWRkX3NpbmdsZV9vYmplY3QiKTsKIApAQCAtMTA0NCw3ICsxMDAzLDcgQEAKIAlkZXZpY2UtPmhhbmRsZSA9IGhhbmRsZTsKIAlkZXZpY2UtPnBhcmVudCA9IHBhcmVudDsKIAotCWFjcGlfZGV2aWNlX2dldF9idXNpZChkZXZpY2UsaGFuZGxlLHR5cGUpOworCWFjcGlfZGV2aWNlX2dldF9idXNpZChkZXZpY2UsIGhhbmRsZSwgdHlwZSk7CiAKIAkvKgogCSAqIEZsYWdzCkBAIC0xMDkyLDcgKzEwNTEsNyBAQAogCSAqIEhhcmR3YXJlIElELCBVbmlxdWUgSUQsICYgQnVzIEFkZHJlc3MKIAkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCi0JYWNwaV9kZXZpY2Vfc2V0X2lkKGRldmljZSxwYXJlbnQsaGFuZGxlLHR5cGUpOworCWFjcGlfZGV2aWNlX3NldF9pZChkZXZpY2UsIHBhcmVudCwgaGFuZGxlLCB0eXBlKTsKIAogCS8qCiAJICogUG93ZXIgTWFuYWdlbWVudApAQCAtMTEwNCw3ICsxMDYzLDcgQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotIAkvKgorCS8qCiAJICogV2FrZXVwIGRldmljZSBtYW5hZ2VtZW50CiAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwpAQCAtMTEyNCwxMiArMTA4MywxMiBAQAogCQkJZ290byBlbmQ7CiAJfQogCi0JaWYgKChyZXN1bHQgPSBhY3BpX2RldmljZV9zZXRfY29udGV4dChkZXZpY2UsdHlwZSkpKQorCWlmICgocmVzdWx0ID0gYWNwaV9kZXZpY2Vfc2V0X2NvbnRleHQoZGV2aWNlLCB0eXBlKSkpCiAJCWdvdG8gZW5kOwogCi0JYWNwaV9kZXZpY2VfZ2V0X2RlYnVnX2luZm8oZGV2aWNlLGhhbmRsZSx0eXBlKTsKKwlhY3BpX2RldmljZV9nZXRfZGVidWdfaW5mbyhkZXZpY2UsIGhhbmRsZSwgdHlwZSk7CiAKLQlhY3BpX2RldmljZV9yZWdpc3RlcihkZXZpY2UscGFyZW50KTsKKwlhY3BpX2RldmljZV9yZWdpc3RlcihkZXZpY2UsIHBhcmVudCk7CiAKIAkvKgogCSAqIEJpbmQgX0FEUi1CYXNlZCBEZXZpY2VzCkBAIC0xMTU0LDcgKzExMTMsNyBAQAogCSAqLwogCXJlc3VsdCA9IGFjcGlfYnVzX2ZpbmRfZHJpdmVyKGRldmljZSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAoIXJlc3VsdCkKIAkJKmNoaWxkID0gZGV2aWNlOwogCWVsc2UgewpAQCAtMTE2NiwxNyArMTEyNSwxNSBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi0KLXN0YXRpYyBpbnQgYWNwaV9idXNfc2NhbiAoc3RydWN0IGFjcGlfZGV2aWNlCSpzdGFydCwKLQkJc3RydWN0IGFjcGlfYnVzX29wcyAqb3BzKQorc3RhdGljIGludCBhY3BpX2J1c19zY2FuKHN0cnVjdCBhY3BpX2RldmljZSAqc3RhcnQsIHN0cnVjdCBhY3BpX2J1c19vcHMgKm9wcykKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2RldmljZQkqY2hpbGQgPSBOVUxMOwotCWFjcGlfaGFuZGxlCQlwaGFuZGxlID0gTlVMTDsKLQlhY3BpX2hhbmRsZQkJY2hhbmRsZSA9IE5VTEw7Ci0JYWNwaV9vYmplY3RfdHlwZQl0eXBlID0gMDsKLQl1MzIJCQlsZXZlbCA9IDE7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZSAqY2hpbGQgPSBOVUxMOworCWFjcGlfaGFuZGxlIHBoYW5kbGUgPSBOVUxMOworCWFjcGlfaGFuZGxlIGNoYW5kbGUgPSBOVUxMOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZSA9IDA7CisJdTMyIGxldmVsID0gMTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX3NjYW4iKTsKIApAQCAtMTE4NSw3ICsxMTQyLDcgQEAKIAogCXBhcmVudCA9IHN0YXJ0OwogCXBoYW5kbGUgPSBzdGFydC0+aGFuZGxlOwotCQorCiAJLyoKIAkgKiBQYXJzZSB0aHJvdWdoIHRoZSBBQ1BJIG5hbWVzcGFjZSwgaWRlbnRpZnkgYWxsICdkZXZpY2VzJywgYW5kCiAJICogY3JlYXRlIGEgbmV3ICdzdHJ1Y3QgYWNwaV9kZXZpY2UnIGZvciBlYWNoLgpAQCAtMTE5Myw3ICsxMTUwLDcgQEAKIAl3aGlsZSAoKGxldmVsID4gMCkgJiYgcGFyZW50KSB7CiAKIAkJc3RhdHVzID0gYWNwaV9nZXRfbmV4dF9vYmplY3QoQUNQSV9UWVBFX0FOWSwgcGhhbmRsZSwKLQkJCWNoYW5kbGUsICZjaGFuZGxlKTsKKwkJCQkJICAgICAgY2hhbmRsZSwgJmNoYW5kbGUpOwogCiAJCS8qCiAJCSAqIElmIHRoaXMgc2NvcGUgaXMgZXhoYXVzdGVkIHRoZW4gbW92ZSBvdXIgd2F5IGJhY2sgdXAuCkBAIC0xMjQzLDEyICsxMjAwLDEyIEBACiAKIAkJaWYgKG9wcy0+YWNwaV9vcF9hZGQpCiAJCQlzdGF0dXMgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZjaGlsZCwgcGFyZW50LAotCQkJCQljaGFuZGxlLCB0eXBlKTsKLQkJIGVsc2UKKwkJCQkJCQljaGFuZGxlLCB0eXBlKTsKKwkJZWxzZQogCQkJc3RhdHVzID0gYWNwaV9idXNfZ2V0X2RldmljZShjaGFuZGxlLCAmY2hpbGQpOwogCi0JCSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQkgY29udGludWU7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCWNvbnRpbnVlOwogCiAJCWlmIChvcHMtPmFjcGlfb3Bfc3RhcnQpIHsKIAkJCXN0YXR1cyA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChjaGlsZCk7CkBAIC0xMjY0LDcgKzEyMjEsNyBAQAogCQkgKiB3aGljaCB3aWxsIGJlIGVudW1lcmF0ZWQgd2hlbiB0aGUgcGFyZW50IGlzIGluc2VydGVkKS4KIAkJICoKIAkJICogVEJEOiBOZWVkIG5vdGlmaWNhdGlvbnMgYW5kIG90aGVyIGRldGVjdGlvbiBtZWNoYW5pc21zCi0JCSAqCWluIHBsYWNlIGJlZm9yZSB3ZSBjYW4gZnVsbHkgaW1wbGVtZW50IHRoaXMuCisJCSAqICAgICAgaW4gcGxhY2UgYmVmb3JlIHdlIGNhbiBmdWxseSBpbXBsZW1lbnQgdGhpcy4KIAkJICovCiAJCWlmIChjaGlsZC0+c3RhdHVzLnByZXNlbnQpIHsKIAkJCXN0YXR1cyA9IGFjcGlfZ2V0X25leHRfb2JqZWN0KEFDUElfVFlQRV9BTlksIGNoYW5kbGUsCkBAIC0xMjgyLDExICsxMjM5LDggQEAKIH0KIAogaW50Ci1hY3BpX2J1c19hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqKmNoaWxkLAotCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50LAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JaW50CQkJdHlwZSkKK2FjcGlfYnVzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCwKKwkgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LCBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IGFjcGlfYnVzX29wcyBvcHM7CkBAIC0xMzAxLDExICsxMjU1LDEwIEBACiAJfQogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2FkZCk7CiAKLWludAotYWNwaV9idXNfc3RhcnQgKAotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoraW50IGFjcGlfYnVzX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IGFjcGlfYnVzX29wcyBvcHM7CkBAIC0xMzIzLDI2ICsxMjc2LDI1IEBACiAJfQogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3N0YXJ0KTsKIAotc3RhdGljIGludAotYWNwaV9idXNfdHJpbShzdHJ1Y3QgYWNwaV9kZXZpY2UJKnN0YXJ0LAotCQlpbnQgcm1kZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfYnVzX3RyaW0oc3RydWN0IGFjcGlfZGV2aWNlICpzdGFydCwgaW50IHJtZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpwYXJlbnQsICpjaGlsZDsKLQlhY3BpX2hhbmRsZQkJcGhhbmRsZSwgY2hhbmRsZTsKLQlhY3BpX29iamVjdF90eXBlCXR5cGU7Ci0JdTMyCQkJbGV2ZWwgPSAxOwotCWludAkJCWVyciA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LCAqY2hpbGQ7CisJYWNwaV9oYW5kbGUgcGhhbmRsZSwgY2hhbmRsZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJdTMyIGxldmVsID0gMTsKKwlpbnQgZXJyID0gMDsKIAotCXBhcmVudCAgPSBzdGFydDsKKwlwYXJlbnQgPSBzdGFydDsKIAlwaGFuZGxlID0gc3RhcnQtPmhhbmRsZTsKIAljaGlsZCA9IGNoYW5kbGUgPSBOVUxMOwogCiAJd2hpbGUgKChsZXZlbCA+IDApICYmIHBhcmVudCAmJiAoIWVycikpIHsKIAkJc3RhdHVzID0gYWNwaV9nZXRfbmV4dF9vYmplY3QoQUNQSV9UWVBFX0FOWSwgcGhhbmRsZSwKLQkJCWNoYW5kbGUsICZjaGFuZGxlKTsKKwkJCQkJICAgICAgY2hhbmRsZSwgJmNoYW5kbGUpOwogCiAJCS8qCiAJCSAqIElmIHRoaXMgc2NvcGUgaXMgZXhoYXVzdGVkIHRoZW4gbW92ZSBvdXIgd2F5IGJhY2sgdXAuCkBAIC0xMzgxLDEyICsxMzMzLDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludAotYWNwaV9idXNfc2Nhbl9maXhlZCAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpyb290KQorc3RhdGljIGludCBhY3BpX2J1c19zY2FuX2ZpeGVkKHN0cnVjdCBhY3BpX2RldmljZSAqcm9vdCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19zY2FuX2ZpeGVkIik7CiAKQEAgLTEzOTgsMTQgKzEzNDgsMTYgQEAKIAkgKi8KIAlpZiAoYWNwaV9mYWR0LnB3cl9idXR0b24gPT0gMCkgewogCQlyZXN1bHQgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZkZXZpY2UsIGFjcGlfcm9vdCwKLQkJCU5VTEwsIEFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OKTsKKwkJCQkJCU5VTEwsCisJCQkJCQlBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTik7CiAJCWlmICghcmVzdWx0KQogCQkJcmVzdWx0ID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGRldmljZSk7CiAJfQogCiAJaWYgKGFjcGlfZmFkdC5zbGVlcF9idXR0b24gPT0gMCkgewogCQlyZXN1bHQgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZkZXZpY2UsIGFjcGlfcm9vdCwKLQkJCU5VTEwsIEFDUElfQlVTX1RZUEVfU0xFRVBfQlVUVE9OKTsKKwkJCQkJCU5VTEwsCisJCQkJCQlBQ1BJX0JVU19UWVBFX1NMRUVQX0JVVFRPTik7CiAJCWlmICghcmVzdWx0KQogCQkJcmVzdWx0ID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGRldmljZSk7CiAJfQpAQCAtMTQxMyw3ICsxMzY1LDYgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NjYW5faW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CkBAIC0xNDMwLDcgKzEzODEsNyBAQAogCSAqIENyZWF0ZSB0aGUgcm9vdCBkZXZpY2UgaW4gdGhlIGJ1cydzIGRldmljZSB0cmVlCiAJICovCiAJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmYWNwaV9yb290LCBOVUxMLCBBQ1BJX1JPT1RfT0JKRUNULAotCQlBQ1BJX0JVU19UWVBFX1NZU1RFTSk7CisJCQkJCUFDUElfQlVTX1RZUEVfU1lTVEVNKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIERvbmU7CiAKQEAgLTE0NTAsNyArMTQwMSw3IEBACiAJaWYgKHJlc3VsdCkKIAkJYWNwaV9kZXZpY2VfdW5yZWdpc3RlcihhY3BpX3Jvb3QsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKIAotIERvbmU6CisgICAgICBEb25lOgogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYwppbmRleCA3MjQ5YmEyLi5hZWU1MGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAogc3RhdGljIHN0cnVjdCBwbV9vcHMgYWNwaV9wbV9vcHM7CiAKLWV4dGVybiB2b2lkIGRvX3N1c3BlbmRfbG93bGV2ZWxfczRiaW9zKHZvaWQpOwogZXh0ZXJuIHZvaWQgZG9fc3VzcGVuZF9sb3dsZXZlbCh2b2lkKTsKIAogc3RhdGljIHUzMiBhY3BpX3N1c3BlbmRfc3RhdGVzW10gPSB7CkBAIC05OCw4ICs5Nyw2IEBACiAJY2FzZSBQTV9TVVNQRU5EX0RJU0s6CiAJCWlmIChhY3BpX3BtX29wcy5wbV9kaXNrX21vZGUgPT0gUE1fRElTS19QTEFURk9STSkKIAkJCXN0YXR1cyA9IGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUoYWNwaV9zdGF0ZSk7Ci0JCWVsc2UKLQkJCWRvX3N1c3BlbmRfbG93bGV2ZWxfczRiaW9zKCk7CiAJCWJyZWFrOwogCWNhc2UgUE1fU1VTUEVORF9NQVg6CiAJCWFjcGlfcG93ZXJfb2ZmKCk7CkBAIC0yMDYsMTEgKzIwMyw2IEBACiAJCQlwcmludGsoIiBTJWQiLCBpKTsKIAkJfQogCQlpZiAoaSA9PSBBQ1BJX1NUQVRFX1M0KSB7Ci0JCQlpZiAoYWNwaV9nYmxfRkFDUy0+UzRiaW9zX2YpIHsKLQkJCQlzbGVlcF9zdGF0ZXNbaV0gPSAxOwotCQkJCXByaW50aygiIFM0YmlvcyIpOwotCQkJCWFjcGlfcG1fb3BzLnBtX2Rpc2tfbW9kZSA9IFBNX0RJU0tfRklSTVdBUkU7Ci0JCQl9CiAJCQlpZiAoc2xlZXBfc3RhdGVzW2ldKQogCQkJCWFjcGlfcG1fb3BzLnBtX2Rpc2tfbW9kZSA9IFBNX0RJU0tfUExBVEZPUk07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKaW5kZXggZjkzZDJlZS4uYWY3OTM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKQEAgLTIxLDkgKzIxLDcgQEAKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAogCS8qIGRvIHdlIGhhdmUgYSB3YWtldXAgYWRkcmVzcyBmb3IgUzIgYW5kIFMzPyAqLwotCS8qIEhlcmUsIHdlIHN1cHBvcnQgb25seSBTNEJJT1MsIHRob3NlIHdlIHNldCB0aGUgd2FrZXVwIGFkZHJlc3MgKi8KLQkvKiBTNE9TIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBub3cgdmlhIHN3c3VzcC4uICovCi0JaWYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMyB8fCBhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzQpIHsKKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKSB7CiAJCWlmICghYWNwaV93YWtldXBfYWRkcmVzcykgewogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTk1LDQgKzkzLDQgQEAKIAogbGF0ZV9pbml0Y2FsbChhY3BpX3Bvd2Vyb2ZmX2luaXQpOwogCi0jZW5kaWYgLyogQ09ORklHX1BNICovCisjZW5kaWYJCQkJLyogQ09ORklHX1BNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYwppbmRleCAxYmU5OWYwLi40Njk2YTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKQEAgLTEzLDI5ICsxMywxOCBAQAogCiAjaW5jbHVkZSAic2xlZXAuaCIKIAotI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKLSNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9TTEVFUAkJInNsZWVwIgotI2VuZGlmCi0KLSNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9BTEFSTQkJImFsYXJtIgotI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX1dBS0VVUF9ERVZJQ0UgICAid2FrZXVwIgotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJzbGVlcCIpCi0KK0FDUElfTU9EVUxFX05BTUUoInNsZWVwIikKICNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCi0KIHN0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fc2xlZXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlpbnQJCQlpOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fc2xlZXBfc2VxX3Nob3ciKTsKIAogCWZvciAoaSA9IDA7IGkgPD0gQUNQSV9TVEFURV9TNTsgaSsrKSB7CiAJCWlmIChzbGVlcF9zdGF0ZXNbaV0pIHsKLQkJCXNlcV9wcmludGYoc2VxLCJTJWQgIiwgaSk7Ci0JCQlpZiAoaSA9PSBBQ1BJX1NUQVRFX1M0ICYmIGFjcGlfZ2JsX0ZBQ1MtPlM0Ymlvc19mKQotCQkJCXNlcV9wcmludGYoc2VxLCAiUzRiaW9zICIpOworCQkJc2VxX3ByaW50ZihzZXEsICJTJWQgIiwgaSk7CiAJCX0KIAl9CiAKQEAgLTUwLDI0ICszOSwyMSBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV9zeXN0ZW1fd3JpdGVfc2xlZXAgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyIF9fdXNlcgkqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9zeXN0ZW1fd3JpdGVfc2xlZXAoc3RydWN0IGZpbGUgKmZpbGUsCisJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCWNoYXIJc3RyWzEyXTsKLQl1MzIJc3RhdGUgPSAwOwotCWludAllcnJvciA9IDA7CisJY2hhciBzdHJbMTJdOworCXUzMiBzdGF0ZSA9IDA7CisJaW50IGVycm9yID0gMDsKIAogCWlmIChjb3VudCA+IHNpemVvZihzdHIpIC0gMSkKIAkJZ290byBEb25lOwotCW1lbXNldChzdHIsMCxzaXplb2Yoc3RyKSk7CisJbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOwogCWlmIChjb3B5X2Zyb21fdXNlcihzdHIsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIENoZWNrIGZvciBTNCBiaW9zIHJlcXVlc3QgKi8KLQlpZiAoIXN0cmNtcChzdHIsIjRiIikpIHsKKwlpZiAoIXN0cmNtcChzdHIsICI0YiIpKSB7CiAJCWVycm9yID0gYWNwaV9zdXNwZW5kKDQpOwogCQlnb3RvIERvbmU7CiAJfQpAQCAtNzksMTcgKzY1LDE3IEBACiAJfQogI2VuZGlmCiAJZXJyb3IgPSBhY3BpX3N1c3BlbmQoc3RhdGUpOwotIERvbmU6CisgICAgICBEb25lOgogCXJldHVybiBlcnJvciA/IGVycm9yIDogY291bnQ7CiB9Ci0jZW5kaWYJLyogQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUCAqLworI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAgKi8KIAogc3RhdGljIGludCBhY3BpX3N5c3RlbV9hbGFybV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXUzMgkJCXNlYywgbWluLCBocjsKLQl1MzIJCQlkYXksIG1vLCB5cjsKLQl1bnNpZ25lZCBjaGFyCQlydGNfY29udHJvbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyAJCWZsYWdzOworCXUzMiBzZWMsIG1pbiwgaHI7CisJdTMyIGRheSwgbW8sIHlyOworCXVuc2lnbmVkIGNoYXIgcnRjX2NvbnRyb2wgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3N5c3RlbV9hbGFybV9zZXFfc2hvdyIpOwogCkBAIC0xMDUsMTMgKzkxLDE0IEBACiAJCS8qIEFDUEkgc3BlYzogb25seSBsb3cgNiBpdHMgc2hvdWxkIGJlIGNhcmVkICovCiAJCWRheSA9IENNT1NfUkVBRChhY3BpX2dibF9GQURULT5kYXlfYWxybSkgJiAweDNGOwogCWVsc2UKLQkJZGF5ID0gIENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKKwkJZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOwogCWlmIChhY3BpX2dibF9GQURULT5tb25fYWxybSkKIAkJbW8gPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC0+bW9uX2Fscm0pOwogCWVsc2UKIAkJbW8gPSBDTU9TX1JFQUQoUlRDX01PTlRIKTsKIAlpZiAoYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSkKLQkJeXIgPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSkgKiAxMDAgKyBDTU9TX1JFQUQoUlRDX1lFQVIpOworCQl5ciA9IENNT1NfUkVBRChhY3BpX2dibF9GQURULT5jZW50dXJ5KSAqIDEwMCArCisJCSAgICBDTU9TX1JFQUQoUlRDX1lFQVIpOwogCWVsc2UKIAkJeXIgPSBDTU9TX1JFQUQoUlRDX1lFQVIpOwogCkBAIC0xMjYsMzMgKzExMywzMyBAQAogCQlCQ0RfVE9fQklOKHlyKTsKIAl9CiAKLQkvKiB3ZSdyZSB0cnVzdGluZyB0aGUgRkFEVCAoc2VlIGFib3ZlKSovCisJLyogd2UncmUgdHJ1c3RpbmcgdGhlIEZBRFQgKHNlZSBhYm92ZSkgKi8KIAlpZiAoIWFjcGlfZ2JsX0ZBRFQtPmNlbnR1cnkpCi0JLyogSWYgd2UncmUgbm90IHRydXN0aW5nIHRoZSBGQURULCB3ZSBzaG91bGQgYXQgbGVhc3QgbWFrZSBpdAotCSAqIHJpZ2h0IGZvciBfdGhpc18gY2VudHVyeS4uLiBlaG0sIHdoYXQgaXMgX3RoaXNfIGNlbnR1cnk/Ci0JICoKLQkgKiBUQkQ6Ci0JICogIEFTQVA6IGZpbmQgcGllY2Ugb2YgY29kZSBpbiB0aGUga2VybmVsLCBlLmcuIHN0YXIgdHJhY2tlciBkcml2ZXIsCi0JICogICAgICAgIHdoaWNoIHdlIGNhbiB0cnVzdCB0byBkZXRlcm1pbmUgdGhlIGNlbnR1cnkgY29ycmVjdGx5LiBBdG9tCi0JICogICAgICAgIHdhdGNoIGRyaXZlciB3b3VsZCBiZSBuaWNlLCB0b28uLi4KLQkgKgotCSAqICBpZiB0aGF0IGhhcyBub3QgaGFwcGVuZWQsIGNoYW5nZSBmb3IgZmlyc3QgcmVsZWFzZSBpbiAyMDUwOgotIAkgKiAgICAgICAgaWYgKHlyPDUwKQotCSAqICAgICAgICAgICAgICAgIHlyICs9IDIxMDA7Ci0JICogICAgICAgIGVsc2UKLQkgKiAgICAgICAgICAgICAgICB5ciArPSAyMDAwOyAgIC8vIGN1cnJlbnQgbGluZSBvZiBjb2RlCi0JICoKLQkgKiAgaWYgdGhhdCBoYXMgbm90IGhhcHBlbmVkIGVpdGhlciwgcGxlYXNlIGRvIG9uIDIwOTkvMTIvMzE6MjM6NTk6NTkKLQkgKiAgICAgICAgcy8yMDAwLzIxMDAKLQkgKgotCSAqLworCQkvKiBJZiB3ZSdyZSBub3QgdHJ1c3RpbmcgdGhlIEZBRFQsIHdlIHNob3VsZCBhdCBsZWFzdCBtYWtlIGl0CisJCSAqIHJpZ2h0IGZvciBfdGhpc18gY2VudHVyeS4uLiBlaG0sIHdoYXQgaXMgX3RoaXNfIGNlbnR1cnk/CisJCSAqCisJCSAqIFRCRDoKKwkJICogIEFTQVA6IGZpbmQgcGllY2Ugb2YgY29kZSBpbiB0aGUga2VybmVsLCBlLmcuIHN0YXIgdHJhY2tlciBkcml2ZXIsCisJCSAqICAgICAgICB3aGljaCB3ZSBjYW4gdHJ1c3QgdG8gZGV0ZXJtaW5lIHRoZSBjZW50dXJ5IGNvcnJlY3RseS4gQXRvbQorCQkgKiAgICAgICAgd2F0Y2ggZHJpdmVyIHdvdWxkIGJlIG5pY2UsIHRvby4uLgorCQkgKgorCQkgKiAgaWYgdGhhdCBoYXMgbm90IGhhcHBlbmVkLCBjaGFuZ2UgZm9yIGZpcnN0IHJlbGVhc2UgaW4gMjA1MDoKKwkJICogICAgICAgIGlmICh5cjw1MCkKKwkJICogICAgICAgICAgICAgICAgeXIgKz0gMjEwMDsKKwkJICogICAgICAgIGVsc2UKKwkJICogICAgICAgICAgICAgICAgeXIgKz0gMjAwMDsgICAvLyBjdXJyZW50IGxpbmUgb2YgY29kZQorCQkgKgorCQkgKiAgaWYgdGhhdCBoYXMgbm90IGhhcHBlbmVkIGVpdGhlciwgcGxlYXNlIGRvIG9uIDIwOTkvMTIvMzE6MjM6NTk6NTkKKwkJICogICAgICAgIHMvMjAwMC8yMTAwCisJCSAqCisJCSAqLwogCQl5ciArPSAyMDAwOwogCi0Jc2VxX3ByaW50ZihzZXEsIiU0LjR1LSIsIHlyKTsKLQkobW8gPiAxMikgID8gc2VxX3B1dHMoc2VxLCAiKiotIikgIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydS0iLCBtbyk7Ci0JKGRheSA+IDMxKSA/IHNlcV9wdXRzKHNlcSwgIioqICIpICA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnUgIiwgZGF5KTsKLQkoaHIgPiAyMykgID8gc2VxX3B1dHMoc2VxLCAiKio6IikgIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydToiLCBocik7Ci0JKG1pbiA+IDU5KSA/IHNlcV9wdXRzKHNlcSwgIioqOiIpICA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnU6IiwgbWluKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiU0LjR1LSIsIHlyKTsKKwkobW8gPiAxMikgPyBzZXFfcHV0cyhzZXEsICIqKi0iKSA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnUtIiwgbW8pOworCShkYXkgPiAzMSkgPyBzZXFfcHV0cyhzZXEsICIqKiAiKSA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnUgIiwgZGF5KTsKKwkoaHIgPiAyMykgPyBzZXFfcHV0cyhzZXEsICIqKjoiKSA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnU6IiwgaHIpOworCShtaW4gPiA1OSkgPyBzZXFfcHV0cyhzZXEsICIqKjoiKSA6IHNlcV9wcmludGYoc2VxLCAiJTIuMnU6IiwgbWluKTsKIAkoc2VjID4gNTkpID8gc2VxX3B1dHMoc2VxLCAiKipcbiIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydVxuIiwgc2VjKTsKIAogCXJldHVybiAwOwpAQCAtMTYzLDE1ICsxNTAsMTEgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9zeXN0ZW1fYWxhcm1fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi0KLXN0YXRpYyBpbnQKLWdldF9kYXRlX2ZpZWxkICgKLQljaGFyCQkJKipwLAotCXUzMgkJCSp2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X2RhdGVfZmllbGQoY2hhciAqKnAsIHUzMiAqIHZhbHVlKQogewotCWNoYXIJCQkqbmV4dCA9IE5VTEw7Ci0JY2hhcgkJCSpzdHJpbmdfZW5kID0gTlVMTDsKLQlpbnQJCQlyZXN1bHQgPSAtRUlOVkFMOworCWNoYXIgKm5leHQgPSBOVUxMOworCWNoYXIgKnN0cmluZ19lbmQgPSBOVUxMOworCWludCByZXN1bHQgPSAtRUlOVkFMOwogCiAJLyoKIAkgKiBUcnkgdG8gZmluZCBkZWxpbWV0ZXIsIG9ubHkgdG8gaW5zZXJ0IG51bGwuICBUaGUgZW5kIG9mIHRoZQpAQCAtMTkzLDI2ICsxNzYsMjIgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV93cml0ZV9hbGFybSAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIgX191c2VyCSpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKnBwb3MpCithY3BpX3N5c3RlbV93cml0ZV9hbGFybShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQljaGFyCQkJYWxhcm1fc3RyaW5nWzMwXSA9IHsnXDAnfTsKLQljaGFyCQkJKnAgPSBhbGFybV9zdHJpbmc7Ci0JdTMyCQkJc2VjLCBtaW4sIGhyLCBkYXksIG1vLCB5cjsKLQlpbnQJCQlhZGp1c3QgPSAwOwotCXVuc2lnbmVkIGNoYXIJCXJ0Y19jb250cm9sID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKwljaGFyIGFsYXJtX3N0cmluZ1szMF0gPSB7ICdcMCcgfTsKKwljaGFyICpwID0gYWxhcm1fc3RyaW5nOworCXUzMiBzZWMsIG1pbiwgaHIsIGRheSwgbW8sIHlyOworCWludCBhZGp1c3QgPSAwOworCXVuc2lnbmVkIGNoYXIgcnRjX2NvbnRyb2wgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fd3JpdGVfYWxhcm0iKTsKIAogCWlmIChjb3VudCA+IHNpemVvZihhbGFybV9zdHJpbmcpIC0gMSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQorCiAJaWYgKGNvcHlfZnJvbV91c2VyKGFsYXJtX3N0cmluZywgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKIApAQCAtMjcxLDEwICsyNTAsMTAgQEAKIAl9CiAKIAlpZiAoYWRqdXN0KSB7Ci0JCXlyICArPSBDTU9TX1JFQUQoUlRDX1lFQVIpOwotCQltbyAgKz0gQ01PU19SRUFEKFJUQ19NT05USCk7CisJCXlyICs9IENNT1NfUkVBRChSVENfWUVBUik7CisJCW1vICs9IENNT1NfUkVBRChSVENfTU9OVEgpOwogCQlkYXkgKz0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOwotCQlociAgKz0gQ01PU19SRUFEKFJUQ19IT1VSUyk7CisJCWhyICs9IENNT1NfUkVBRChSVENfSE9VUlMpOwogCQltaW4gKz0gQ01PU19SRUFEKFJUQ19NSU5VVEVTKTsKIAkJc2VjICs9IENNT1NfUkVBRChSVENfU0VDT05EUyk7CiAJfQpAQCAtMzQzLDcgKzMyMiw3IEBACiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPm1vbl9hbHJtKQogCQlDTU9TX1dSSVRFKG1vLCBhY3BpX2dibF9GQURULT5tb25fYWxybSk7CiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPmNlbnR1cnkpCi0JCUNNT1NfV1JJVEUoeXIvMTAwLCBhY3BpX2dibF9GQURULT5jZW50dXJ5KTsKKwkJQ01PU19XUklURSh5ciAvIDEwMCwgYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSk7CiAJLyogZW5hYmxlIHRoZSBydGMgYWxhcm0gaW50ZXJydXB0ICovCiAJcnRjX2NvbnRyb2wgfD0gUlRDX0FJRTsKIAlDTU9TX1dSSVRFKHJ0Y19jb250cm9sLCBSVENfQ09OVFJPTCk7CkBAIC0zNTcsMzUgKzMzNiwzMyBAQAogCSpwcG9zICs9IGNvdW50OwogCiAJcmVzdWx0ID0gMDsKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUocmVzdWx0ID8gcmVzdWx0IDogY291bnQpOwogfQogCi1leHRlcm4gc3RydWN0IGxpc3RfaGVhZAlhY3BpX3dha2V1cF9kZXZpY2VfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFjcGlfd2FrZXVwX2RldmljZV9saXN0OwogZXh0ZXJuIHNwaW5sb2NrX3QgYWNwaV9kZXZpY2VfbG9jazsKIAogc3RhdGljIGludAogYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIkRldmljZQlTbGVlcCBzdGF0ZQlTdGF0dXNcbiIpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPQorCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOwogCiAJCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCiAJCQljb250aW51ZTsKIAkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQlpZiAoZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UpCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiU0cwklNGQJCSU4c1xuIiwKLQkJCQlkZXYtPnBucC5idXNfaWQsICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlLAotCQkJCWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPyAiKmVuYWJsZWQiIDogIipkaXNhYmxlZCIpOwotCQllbHNlCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiU0cwklNGQJCSU4c1xuIiwKLQkJCQlkZXYtPnBucC5idXNfaWQsICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlLAotCQkJCWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlNHMJJTRkCQklcyU4c1xuIiwKKwkJCSAgIGRldi0+cG5wLmJ1c19pZCwKKwkJCSAgICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlLAorCQkJICAgZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgPyAiKiIgOiAiIiwKKwkJCSAgIGRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwpAQCAtMzkzLDE5ICszNzAsMTggQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfc3lzdGVtX3dyaXRlX3dha2V1cF9kZXZpY2UgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyIF9fdXNlcgkqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV9zeXN0ZW1fd3JpdGVfd2FrZXVwX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIG5vZGUsICogbmV4dDsKLQljaGFyCQlzdHJidWZbNV07Ci0JY2hhcgkJc3RyWzVdID0gIiI7Ci0JaW50IAkJbGVuID0gY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CisJY2hhciBzdHJidWZbNV07CisJY2hhciBzdHJbNV0gPSAiIjsKKwlpbnQgbGVuID0gY291bnQ7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpmb3VuZF9kZXYgPSBOVUxMOwogCi0JaWYgKGxlbiA+IDQpIGxlbiA9IDQ7CisJaWYgKGxlbiA+IDQpCisJCWxlbiA9IDQ7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoc3RyYnVmLCBidWZmZXIsIGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDE0LDI4ICszOTAsMzYgQEAKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KKwkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKIAkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghc3RybmNtcChkZXYtPnBucC5idXNfaWQsIHN0ciwgNCkpIHsKLQkJCWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPSBkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gMDoxOworCQkJZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA9CisJCQkgICAgZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA/IDAgOiAxOwogCQkJZm91bmRfZGV2ID0gZGV2OwogCQkJYnJlYWs7CiAJCX0KIAl9CiAJaWYgKGZvdW5kX2RldikgewogCQlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwKLQkJCQlzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKKwkJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkJICAgICAgIHN0cnVjdAorCQkJCQkJCSAgICAgICBhY3BpX2RldmljZSwKKwkJCQkJCQkgICAgICAgd2FrZXVwX2xpc3QpOwogCiAJCQlpZiAoKGRldiAhPSBmb3VuZF9kZXYpICYmCi0JCQkJKGRldi0+d2FrZXVwLmdwZV9udW1iZXIgPT0gZm91bmRfZGV2LT53YWtldXAuZ3BlX251bWJlcikgJiYKLQkJCQkoZGV2LT53YWtldXAuZ3BlX2RldmljZSA9PSBmb3VuZF9kZXYtPndha2V1cC5ncGVfZGV2aWNlKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6ICclcycgYW5kICclcycgaGF2ZSB0aGUgc2FtZSBHUEUsICIKLQkJCQkJImNhbid0IGRpc2FibGUvZW5hYmxlIG9uZSBzZXBlcmF0ZWx5XG4iLAotCQkJCQlkZXYtPnBucC5idXNfaWQsIGZvdW5kX2Rldi0+cG5wLmJ1c19pZCk7Ci0JCQkJZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA9IGZvdW5kX2Rldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQ7CisJCQkgICAgKGRldi0+d2FrZXVwLmdwZV9udW1iZXIgPT0KKwkJCSAgICAgZm91bmRfZGV2LT53YWtldXAuZ3BlX251bWJlcikKKwkJCSAgICAmJiAoZGV2LT53YWtldXAuZ3BlX2RldmljZSA9PQorCQkJCWZvdW5kX2Rldi0+d2FrZXVwLmdwZV9kZXZpY2UpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiQUNQSTogJyVzJyBhbmQgJyVzJyBoYXZlIHRoZSBzYW1lIEdQRSwgIgorCQkJCSAgICAgICAiY2FuJ3QgZGlzYWJsZS9lbmFibGUgb25lIHNlcGVyYXRlbHlcbiIsCisJCQkJICAgICAgIGRldi0+cG5wLmJ1c19pZCwgZm91bmRfZGV2LT5wbnAuYnVzX2lkKTsKKwkJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0KKwkJCQkgICAgZm91bmRfZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZDsKIAkJCX0KIAkJfQogCX0KQEAgLTQ0NiwzNyArNDMwLDM3IEBACiBzdGF0aWMgaW50CiBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2Vfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX3NlcV9zaG93LAorCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2VfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfc3lzdGVtX3dyaXRlX3dha2V1cF9kZXZpY2UsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2Vfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IGFjcGlfc3lzdGVtX3dyaXRlX3dha2V1cF9kZXZpY2UsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX3NsZWVwX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9zeXN0ZW1fc2xlZXBfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkud3JpdGUJCT0gYWNwaV9zeXN0ZW1fd3JpdGVfc2xlZXAsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfc3lzdGVtX3NsZWVwX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3N5c3RlbV93cml0ZV9zbGVlcCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwotI2VuZGlmCS8qIENPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQICovCiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX2FsYXJtX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV9zeXN0ZW1fYWxhcm1fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkud3JpdGUJCT0gYWNwaV9zeXN0ZW1fd3JpdGVfYWxhcm0sCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfc3lzdGVtX2FsYXJtX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3N5c3RlbV93cml0ZV9hbGFybSwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi0KLXN0YXRpYyB1MzIgcnRjX2hhbmRsZXIodm9pZCAqIGNvbnRleHQpCitzdGF0aWMgdTMyIHJ0Y19oYW5kbGVyKHZvaWQgKmNvbnRleHQpCiB7CiAJYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1JUQyk7CiAJYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKQEAgLTQ4NiwyOCArNDcwLDMxIEBACiAKIHN0YXRpYyBpbnQgYWNwaV9zbGVlcF9wcm9jX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKLSAKKwogI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKLQkvKiAnc2xlZXAnIFtSL1ddKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfU0xFRVAsCi0JCQkJICBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9yb290X2Rpcik7CisJLyogJ3NsZWVwJyBbUi9XXSAqLworCWVudHJ5ID0KKwkgICAgY3JlYXRlX3Byb2NfZW50cnkoInNsZWVwIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgYWNwaV9yb290X2Rpcik7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfc3lzdGVtX3NsZWVwX2ZvcHM7CiAjZW5kaWYKIAogCS8qICdhbGFybScgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfQUxBUk0sCi0JCVNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX3Jvb3RfZGlyKTsKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJhbGFybSIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICAgIGFjcGlfcm9vdF9kaXIpOwogCWlmIChlbnRyeSkKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3N5c3RlbV9hbGFybV9mb3BzOwogCi0JLyogJ3dha2V1cCBkZXZpY2UnIFtSL1ddKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfV0FLRVVQX0RFVklDRSwKLQkJCQkgIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX3Jvb3RfZGlyKTsKKwkvKiAnd2FrZXVwIGRldmljZScgW1IvV10gKi8KKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJ3YWtldXAiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgICBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoZW50cnkpCiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9mb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKaW5kZXggZDliMTk5OS4uNDEzNGVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYwpAQCAtMTIsOSArMTIsOSBAQAogI2luY2x1ZGUgInNsZWVwLmgiCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoIndha2V1cF9kZXZpY2VzIikKK0FDUElfTU9EVUxFX05BTUUoIndha2V1cF9kZXZpY2VzIikKIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQJYWNwaV93YWtldXBfZGV2aWNlX2xpc3Q7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhY3BpX3dha2V1cF9kZXZpY2VfbGlzdDsKIGV4dGVybiBzcGlubG9ja190IGFjcGlfZGV2aWNlX2xvY2s7CiAKICNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUApAQCAtMjUsMjIgKzI1LDIxIEBACiAgKiBpcyBoaWdoZXIgdGhhbiByZXF1ZXN0ZWQgc2xlZXAgbGV2ZWwKICAqLwogCi12b2lkCi1hY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAoCi0JdTgJCXNsZWVwX3N0YXRlKQordm9pZCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAodTggc2xlZXBfc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIG5vZGUsICogbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcCIpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLCAKLQkJCXN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOwotCQkKLQkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCB8fCAKLQkJCSFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkIHx8Ci0JCQkoc2xlZXBfc3RhdGUgPiAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSkpCisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAorCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKKworCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkIHx8CisJCSAgICAhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCB8fAorCQkgICAgKHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpKQogCQkJY29udGludWU7CiAKIAkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwpAQCAtNTUsMTEgKzU0LDkgQEAKICAqCUBzbGVlcF9zdGF0ZToJQUNQSSBzdGF0ZQogICogRW5hYmxlIGFsbCB3YWt1cCBkZXZpY2VzJ3MgR1BFCiAgKi8KLXZvaWQKLWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UoCi0JdTgJCXNsZWVwX3N0YXRlKQordm9pZCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKHU4IHNsZWVwX3N0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAkvKiAKIAkgKiBDYXV0aW9uOiB0aGlzIHJvdXRpbmUgbXVzdCBiZSBpbnZva2VkIHdoZW4gaW50ZXJydXB0IGlzIGRpc2FibGVkIApAQCAtNjgsMzMgKzY1LDM1IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZSIpOwogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgCi0JCQlzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobm9kZSwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UsCisJCQkJCQkgICAgICAgd2FrZXVwX2xpc3QpOwogCiAJCS8qIElmIHVzZXJzIHdhbnQgdG8gZGlzYWJsZSBydW4td2FrZSBHUEUsCiAJCSAqIHdlIG9ubHkgZGlzYWJsZSBpdCBmb3Igd2FrZSBhbmQgbGVhdmUgaXQgZm9yIHJ1bnRpbWUKIAkJICovCiAJCWlmIChkZXYtPndha2V1cC5mbGFncy5ydW5fd2FrZSAmJiAhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCkgewogCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQkJYWNwaV9zZXRfZ3BlX3R5cGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwgCi0JCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKKwkJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJCSAgZGV2LT53YWtldXAuZ3BlX251bWJlciwKKwkJCQkJICBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOwogCQkJLyogUmUtZW5hYmxlIGl0LCBzaW5jZSBzZXRfZ3BlX3R5cGUgd2lsbCBkaXNhYmxlIGl0ICovCi0JCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwgCi0JCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9JU1IpOworCQkJYWNwaV9lbmFibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfSVNSKTsKIAkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQgfHwKLQkJCSFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkIHx8Ci0JCQkoc2xlZXBfc3RhdGUgPiAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSkpCisJCSAgICAhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCB8fAorCQkgICAgKHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpKQogCQkJY29udGludWU7CiAKIAkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCQkvKiBydW4td2FrZSBHUEUgaGFzIGJlZW4gZW5hYmxlZCAqLwogCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKQotCQkJYWNwaV9lbmFibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfSVNSKTsKKwkJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX0lTUik7CiAJCWRldi0+d2FrZXVwLnN0YXRlLmFjdGl2ZSA9IDE7CiAJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJfQpAQCAtMTA2LDQzICsxMDUsNDMgQEAKICAqCUBzbGVlcF9zdGF0ZToJQUNQSSBzdGF0ZQogICogRGlzYWJsZSBhbGwgd2FrdXAgZGV2aWNlcydzIEdQRSBhbmQgd2FrZXVwIGNhcGFiaWxpdHkKICAqLwotdm9pZAotYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2UgKAotCXU4CQlzbGVlcF9zdGF0ZSkKK3ZvaWQgYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2UodTggc2xlZXBfc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIG5vZGUsICogbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlIik7CiAKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIAotCQkJc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAorCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKIAogCQlpZiAoZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgJiYgIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQpIHsKIAkJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOworCQkJYWNwaV9zZXRfZ3BlX3R5cGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAorCQkJCQkgIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOwogCQkJLyogUmUtZW5hYmxlIGl0LCBzaW5jZSBzZXRfZ3BlX3R5cGUgd2lsbCBkaXNhYmxlIGl0ICovCi0JCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwgCi0JCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9OT1RfSVNSKTsKKwkJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOwogCQkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCB8fCAKLQkJCSFkZXYtPndha2V1cC5zdGF0ZS5hY3RpdmUgfHwKLQkJCShzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlKSkKKwkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCB8fAorCQkgICAgIWRldi0+d2FrZXVwLnN0YXRlLmFjdGl2ZSB8fAorCQkgICAgKHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpKQogCQkJY29udGludWU7CiAKIAkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCQlhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihkZXYpOwogCQkvKiBOZXZlciBkaXNhYmxlIHJ1bi13YWtlIEdQRSAqLwogCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKSB7Ci0JCQlhY3BpX2Rpc2FibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7Ci0JCQlhY3BpX2NsZWFyX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLCAKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOworCQkJYWNwaV9kaXNhYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQkgZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9OT1RfSVNSKTsKKwkJCWFjcGlfY2xlYXJfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJICAgICAgIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CiAJCX0KIAkJZGV2LT53YWtldXAuc3RhdGUuYWN0aXZlID0gMDsKIAkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKQEAgLTE1Miw3ICsxNTEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3dha2V1cF9kZXZpY2VfaW5pdCh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CkBAIC0xNjAsMTYgKzE1OSwxOCBAQAogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLCAKLQkJCXN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOwotCQkKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobm9kZSwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UsCisJCQkJCQkgICAgICAgd2FrZXVwX2xpc3QpOworCiAJCS8qIEluIGNhc2UgdXNlciBkb2Vzbid0IGxvYWQgYnV0dG9uIGRyaXZlciAqLwogCQlpZiAoZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgJiYgIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQpIHsKIAkJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOwotCQkJYWNwaV9lbmFibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIAotCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CisJCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQkgIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsCisJCQkJCSAgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTik7CisJCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9OT1RfSVNSKTsKIAkJCWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPSAxOwogCQkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAkJfQpAQCAtMTkzLDE3ICsxOTQsMTkgQEAKICAqLwogdm9pZCBhY3BpX3dha2V1cF9ncGVfcG93ZXJvZmZfcHJlcGFyZSh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiA9IGNvbnRhaW5lcl9vZihub2RlLAotCQkJc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAorCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKIAogCQkvKiBUaGUgR1BFIGNhbiB3YWtldXAgc3lzdGVtIGZyb20gUzUsIGRvbid0IHRvdWNoIGl0ICovCi0JCWlmICgodTMyKWRldi0+d2FrZXVwLnNsZWVwX3N0YXRlID09IEFDUElfU1RBVEVfUzUpCisJCWlmICgodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1M1KQogCQkJY29udGludWU7CiAJCS8qIGFjcGlfc2V0X2dwZV90eXBlIHdpbGwgYXV0b21hdGljYWxseSBkaXNhYmxlIEdQRSAqLwogCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAotCQkJZGV2LT53YWtldXAuZ3BlX251bWJlciwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKKwkJCQkgIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsCisJCQkJICBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYwppbmRleCA4OTI1YTZjLi5lNDMwOGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c3RlbS5jCkBAIC0zMCwxMCArMzAsOCBAQAogCiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX3N5c3RlbSIpCi0KK0FDUElfTU9EVUxFX05BTUUoImFjcGlfc3lzdGVtIikKICNkZWZpbmUgQUNQSV9TWVNURU1fQ0xBU1MJCSJzeXN0ZW0iCiAjZGVmaW5lIEFDUElfU1lTVEVNX0RSSVZFUl9OQU1FCQkiQUNQSSBTeXN0ZW0gRHJpdmVyIgogI2RlZmluZSBBQ1BJX1NZU1RFTV9ERVZJQ0VfTkFNRQkJIlN5c3RlbSIKQEAgLTQxLDE1ICszOSwxMyBAQAogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0VWRU5UCQkiZXZlbnQiCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfRFNEVAkJImRzZHQiCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfRkFEVAkJImZhZHQiCi0KLWV4dGVybiBGQURUX0RFU0NSSVBUT1IJCWFjcGlfZmFkdDsKK2V4dGVybiBGQURUX0RFU0NSSVBUT1IgYWNwaV9mYWR0OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQKLWFjcGlfc3lzdGVtX3JlYWRfaW5mbyAoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fcmVhZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fcmVhZF9pbmZvIik7CiAKQEAgLTYzLDI4ICs1OSwyNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9pbmZvX29wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3N5c3RlbV9pbmZvX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfc3lzdGVtX2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IGFjcGlfc3lzdGVtX3JlYWRfZHNkdCAoc3RydWN0IGZpbGUqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCopOworc3RhdGljIHNzaXplX3QgYWNwaV9zeXN0ZW1fcmVhZF9kc2R0KHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwKKwkJCQkgICAgIGxvZmZfdCAqKTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fZHNkdF9vcHMgPSB7Ci0JLnJlYWQgPQkJCWFjcGlfc3lzdGVtX3JlYWRfZHNkdCwKKwkucmVhZCA9IGFjcGlfc3lzdGVtX3JlYWRfZHNkdCwKIH07CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV9yZWFkX2RzZHQgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljaGFyCQkJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKnBwb3MpCithY3BpX3N5c3RlbV9yZWFkX2RzZHQoc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglkc2R0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQlzc2l6ZV90CQkJcmVzOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2J1ZmZlciBkc2R0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXNzaXplX3QgcmVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fcmVhZF9kc2R0Iik7CiAKQEAgLTk5LDIzICs5MywyMCBAQAogCXJldHVybl9WQUxVRShyZXMpOwogfQogCi0KLXN0YXRpYyBzc2l6ZV90IGFjcGlfc3lzdGVtX3JlYWRfZmFkdCAoc3RydWN0IGZpbGUqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCopOworc3RhdGljIHNzaXplX3QgYWNwaV9zeXN0ZW1fcmVhZF9mYWR0KHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwKKwkJCQkgICAgIGxvZmZfdCAqKTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fZmFkdF9vcHMgPSB7Ci0JLnJlYWQgPQkJCWFjcGlfc3lzdGVtX3JlYWRfZmFkdCwKKwkucmVhZCA9IGFjcGlfc3lzdGVtX3JlYWRfZmFkdCwKIH07CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV9yZWFkX2ZhZHQgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljaGFyCQkJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKnBwb3MpCithY3BpX3N5c3RlbV9yZWFkX2ZhZHQoc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglmYWR0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQlzc2l6ZV90CQkJcmVzOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2J1ZmZlciBmYWR0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXNzaXplX3QgcmVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fcmVhZF9mYWR0Iik7CiAKQEAgLTEzMCwxMiArMTIxLDExIEBACiAJcmV0dXJuX1ZBTFVFKHJlcyk7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9zeXN0ZW1faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfc3lzdGVtX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CiAJaW50IGVycm9yID0gMDsKLQljaGFyICogbmFtZTsKKwljaGFyICpuYW1lOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1faW5pdCIpOwogCkBAIC0xNDQsOCArMTM0LDcgQEAKIAogCS8qICdpbmZvJyBbUl0gKi8KIAluYW1lID0gQUNQSV9TWVNURU1fRklMRV9JTkZPOwotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwKLQkJU19JUlVHTywgYWNwaV9yb290X2Rpcik7CisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lSVUdPLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoIWVudHJ5KQogCQlnb3RvIEVycm9yOwogCWVsc2UgewpAQCAtMTU3LDcgKzE0Niw3IEBACiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lSVVNSLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoZW50cnkpCiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9zeXN0ZW1fZHNkdF9vcHM7Ci0JZWxzZSAKKwllbHNlCiAJCWdvdG8gRXJyb3I7CiAKIAkvKiAnZmFkdCcgW1JdICovCkBAIC0xNjgsMTIgKzE1NywxMiBAQAogCWVsc2UKIAkJZ290byBFcnJvcjsKIAotIERvbmU6CisgICAgICBEb25lOgogCXJldHVybl9WQUxVRShlcnJvcik7CiAKLSBFcnJvcjoKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCSAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIHByb2MgZnMgZW50cnlcbiIsIG5hbWUpKTsKKyAgICAgIEVycm9yOgorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgcHJvYyBmcyBlbnRyeVxuIiwgbmFtZSkpOwogCiAJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9GQURULCBhY3BpX3Jvb3RfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX0RTRFQsIGFjcGlfcm9vdF9kaXIpOwpAQCAtMTgzLDUgKzE3Miw0IEBACiAJZ290byBEb25lOwogfQogCi0KIHN1YnN5c19pbml0Y2FsbChhY3BpX3N5c3RlbV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwppbmRleCBmYjY0YmQ1Li5hMmJmMjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCkBAIC00MCwyNSArNDAsMjUgQEAKICNkZWZpbmUgQUNQSV9NQVhfVEFCTEVTCQkyNTYKIAogc3RhdGljIGNoYXIgKmFjcGlfdGFibGVfc2lnbmF0dXJlc1tBQ1BJX1RBQkxFX0NPVU5UXSA9IHsKLQlbQUNQSV9UQUJMRV9VTktOT1dOXQk9ICI/Pz8/IiwKLQlbQUNQSV9BUElDXQkJPSAiQVBJQyIsCi0JW0FDUElfQk9PVF0JCT0gIkJPT1QiLAotCVtBQ1BJX0RCR1BdCQk9ICJEQkdQIiwKLQlbQUNQSV9EU0RUXQkJPSAiRFNEVCIsCi0JW0FDUElfRUNEVF0JCT0gIkVDRFQiLAotCVtBQ1BJX0VURFRdCQk9ICJFVERUIiwKLQlbQUNQSV9GQURUXQkJPSAiRkFDUCIsCi0JW0FDUElfRkFDU10JCT0gIkZBQ1MiLAotCVtBQ1BJX09FTVhdCQk9ICJPRU0iLAotCVtBQ1BJX1BTRFRdCQk9ICJQU0RUIiwKLQlbQUNQSV9TQlNUXQkJPSAiU0JTVCIsCi0JW0FDUElfU0xJVF0JCT0gIlNMSVQiLAotCVtBQ1BJX1NQQ1JdCQk9ICJTUENSIiwKLQlbQUNQSV9TUkFUXQkJPSAiU1JBVCIsCi0JW0FDUElfU1NEVF0JCT0gIlNTRFQiLAotCVtBQ1BJX1NQTUldCQk9ICJTUE1JIiwKLQlbQUNQSV9IUEVUXQkJPSAiSFBFVCIsCi0JW0FDUElfTUNGR10JCT0gIk1DRkciLAorCVtBQ1BJX1RBQkxFX1VOS05PV05dID0gIj8/Pz8iLAorCVtBQ1BJX0FQSUNdID0gIkFQSUMiLAorCVtBQ1BJX0JPT1RdID0gIkJPT1QiLAorCVtBQ1BJX0RCR1BdID0gIkRCR1AiLAorCVtBQ1BJX0RTRFRdID0gIkRTRFQiLAorCVtBQ1BJX0VDRFRdID0gIkVDRFQiLAorCVtBQ1BJX0VURFRdID0gIkVURFQiLAorCVtBQ1BJX0ZBRFRdID0gIkZBQ1AiLAorCVtBQ1BJX0ZBQ1NdID0gIkZBQ1MiLAorCVtBQ1BJX09FTVhdID0gIk9FTSIsCisJW0FDUElfUFNEVF0gPSAiUFNEVCIsCisJW0FDUElfU0JTVF0gPSAiU0JTVCIsCisJW0FDUElfU0xJVF0gPSAiU0xJVCIsCisJW0FDUElfU1BDUl0gPSAiU1BDUiIsCisJW0FDUElfU1JBVF0gPSAiU1JBVCIsCisJW0FDUElfU1NEVF0gPSAiU1NEVCIsCisJW0FDUElfU1BNSV0gPSAiU1BNSSIsCisJW0FDUElfSFBFVF0gPSAiSFBFVCIsCisJW0FDUElfTUNGR10gPSAiTUNGRyIsCiB9OwogCiBzdGF0aWMgY2hhciAqbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbXSA9IHsgImRmbCIsICJoaWdoIiwgInJlcyIsICJsb3ciIH07CkBAIC02Niw1MiArNjYsNDQgQEAKIAogLyogU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RUL1hTRFQpICovCiBzdHJ1Y3QgYWNwaV90YWJsZV9zZHQgewotCXVuc2lnbmVkIGxvbmcJCXBhOwotCWVudW0gYWNwaV90YWJsZV9pZAlpZDsKLQl1bnNpZ25lZCBsb25nCQlzaXplOworCXVuc2lnbmVkIGxvbmcgcGE7CisJZW51bSBhY3BpX3RhYmxlX2lkIGlkOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwkJc2R0X3BhOwkJLyogUGh5c2ljYWwgQWRkcmVzcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJCXNkdF9jb3VudDsJLyogVGFibGUgY291bnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNkdF9wYTsJLyogUGh5c2ljYWwgQWRkcmVzcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2R0X2NvdW50OwkvKiBUYWJsZSBjb3VudCAqLwogCi1zdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfc2R0CXNkdF9lbnRyeVtBQ1BJX01BWF9UQUJMRVNdOworc3RhdGljIHN0cnVjdCBhY3BpX3RhYmxlX3NkdCBzZHRfZW50cnlbQUNQSV9NQVhfVEFCTEVTXTsKIAotdm9pZAotYWNwaV90YWJsZV9wcmludCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIsCi0JdW5zaWduZWQgbG9uZwkJcGh5c19hZGRyKQordm9pZCBhY3BpX3RhYmxlX3ByaW50KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKIHsKLQljaGFyCQkJKm5hbWUgPSBOVUxMOworCWNoYXIgKm5hbWUgPSBOVUxMOwogCiAJaWYgKCFoZWFkZXIpCiAJCXJldHVybjsKIAogCS8qIFNvbWUgdGFibGUgc2lnbmF0dXJlcyBhcmVuJ3QgZ29vZCB0YWJsZSBuYW1lcyAqLwogCi0JaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPnNpZ25hdHVyZSwKLQkJYWNwaV90YWJsZV9zaWduYXR1cmVzW0FDUElfQVBJQ10sCi0JCXNpemVvZihoZWFkZXItPnNpZ25hdHVyZSkpKSB7CisJaWYgKCFzdHJuY21wKChjaGFyICopJmhlYWRlci0+c2lnbmF0dXJlLAorCQkgICAgIGFjcGlfdGFibGVfc2lnbmF0dXJlc1tBQ1BJX0FQSUNdLAorCQkgICAgIHNpemVvZihoZWFkZXItPnNpZ25hdHVyZSkpKSB7CiAJCW5hbWUgPSAiTUFEVCI7Ci0JfQotCWVsc2UgaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPnNpZ25hdHVyZSwKLQkJYWNwaV90YWJsZV9zaWduYXR1cmVzW0FDUElfRkFEVF0sCi0JCXNpemVvZihoZWFkZXItPnNpZ25hdHVyZSkpKSB7CisJfSBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKSZoZWFkZXItPnNpZ25hdHVyZSwKKwkJCSAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbQUNQSV9GQURUXSwKKwkJCSAgICBzaXplb2YoaGVhZGVyLT5zaWduYXR1cmUpKSkgewogCQluYW1lID0gIkZBRFQiOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCW5hbWUgPSBoZWFkZXItPnNpZ25hdHVyZTsKIAotCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAiJS40cyAodiUzLjNkICU2LjZzICU4LjhzIDB4JTA4eCAlLjRzIDB4JTA4eCkgQCAweCVwXG4iLAotCQluYW1lLCBoZWFkZXItPnJldmlzaW9uLCBoZWFkZXItPm9lbV9pZCwKLQkJaGVhZGVyLT5vZW1fdGFibGVfaWQsIGhlYWRlci0+b2VtX3JldmlzaW9uLAotCQloZWFkZXItPmFzbF9jb21waWxlcl9pZCwgaGVhZGVyLT5hc2xfY29tcGlsZXJfcmV2aXNpb24sCi0JCSh2b2lkICopIHBoeXNfYWRkcik7CisJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYCisJICAgICAgICIlLjRzICh2JTMuM2QgJTYuNnMgJTguOHMgMHglMDh4ICUuNHMgMHglMDh4KSBAIDB4JXBcbiIsIG5hbWUsCisJICAgICAgIGhlYWRlci0+cmV2aXNpb24sIGhlYWRlci0+b2VtX2lkLCBoZWFkZXItPm9lbV90YWJsZV9pZCwKKwkgICAgICAgaGVhZGVyLT5vZW1fcmV2aXNpb24sIGhlYWRlci0+YXNsX2NvbXBpbGVyX2lkLAorCSAgICAgICBoZWFkZXItPmFzbF9jb21waWxlcl9yZXZpc2lvbiwgKHZvaWQgKilwaHlzX2FkZHIpOwogfQogCi0KLXZvaWQKLWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeSAoCi0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJKmhlYWRlcikKK3ZvaWQgYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyKQogewogCWlmICghaGVhZGVyKQogCQlyZXR1cm47CkBAIC0xMTksMTEzICsxMTEsMTI3IEBACiAJc3dpdGNoIChoZWFkZXItPnR5cGUpIHsKIAogCWNhc2UgQUNQSV9NQURUX0xBUElDOgotCXsKLQkJc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljKikgaGVhZGVyOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTEFQSUMgKGFjcGlfaWRbMHglMDJ4XSBsYXBpY19pZFsweCUwMnhdICVzKVxuIiwKLQkJCXAtPmFjcGlfaWQsIHAtPmlkLCBwLT5mbGFncy5lbmFibGVkPyJlbmFibGVkIjoiZGlzYWJsZWQiKTsKLQl9CisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKiloZWFkZXI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJMQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxhcGljX2lkWzB4JTAyeF0gJXMpXG4iLAorCQkJICAgICAgIHAtPmFjcGlfaWQsIHAtPmlkLAorCQkJICAgICAgIHAtPmZsYWdzLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9NQURUX0lPQVBJQzoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljKikgaGVhZGVyOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSU9BUElDIChpZFsweCUwMnhdIGFkZHJlc3NbMHglMDh4XSBnc2lfYmFzZVslZF0pXG4iLAotCQkJcC0+aWQsIHAtPmFkZHJlc3MsIHAtPmdsb2JhbF9pcnFfYmFzZSk7Ci0JfQorCQl7CisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9pb2FwaWMgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9pb2FwaWMgKiloZWFkZXI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJJT0FQSUMgKGlkWzB4JTAyeF0gYWRkcmVzc1sweCUwOHhdIGdzaV9iYXNlWyVkXSlcbiIsCisJCQkgICAgICAgcC0+aWQsIHAtPmFkZHJlc3MsIHAtPmdsb2JhbF9pcnFfYmFzZSk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUFEVF9JTlRfU1JDX09WUjoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIklOVF9TUkNfT1ZSIChidXMgJWQgYnVzX2lycSAlZCBnbG9iYWxfaXJxICVkICVzICVzKVxuIiwKLQkJCXAtPmJ1cywgcC0+YnVzX2lycSwgcC0+Z2xvYmFsX2lycSwKLQkJCW1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKLQkJCW1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbcC0+ZmxhZ3MudHJpZ2dlcl0pOwotCQlpZihwLT5mbGFncy5yZXNlcnZlZCkKLQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJJTlRfU1JDX09WUiB1bmV4cGVjdGVkIHJlc2VydmVkIGZsYWdzOiAweCV4XG4iLAotCQkJCXAtPmZsYWdzLnJlc2VydmVkKTsKKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciAqKWhlYWRlcjsKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkgICAgICAgIklOVF9TUkNfT1ZSIChidXMgJWQgYnVzX2lycSAlZCBnbG9iYWxfaXJxICVkICVzICVzKVxuIiwKKwkJCSAgICAgICBwLT5idXMsIHAtPmJ1c19pcnEsIHAtPmdsb2JhbF9pcnEsCisJCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbcC0+ZmxhZ3MudHJpZ2dlcl0pOworCQkJaWYgKHAtPmZsYWdzLnJlc2VydmVkKQorCQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkJICAgICAgICJJTlRfU1JDX09WUiB1bmV4cGVjdGVkIHJlc2VydmVkIGZsYWdzOiAweCV4XG4iLAorCQkJCSAgICAgICBwLT5mbGFncy5yZXNlcnZlZCk7CiAKLQl9CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUFEVF9OTUlfU1JDOgotCXsKLQkJc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIk5NSV9TUkMgKCVzICVzIGdsb2JhbF9pcnEgJWQpXG4iLAotCQkJbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAotCQkJbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltwLT5mbGFncy50cmlnZ2VyXSwgcC0+Z2xvYmFsX2lycSk7Ci0JfQorCQl7CisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqKWhlYWRlcjsKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkgICAgICAgIk5NSV9TUkMgKCVzICVzIGdsb2JhbF9pcnEgJWQpXG4iLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdLAorCQkJICAgICAgIHAtPmdsb2JhbF9pcnEpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX01BRFRfTEFQSUNfTk1JOgotCXsKLQkJc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkqKSBoZWFkZXI7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJMQVBJQ19OTUkgKGFjcGlfaWRbMHglMDJ4XSAlcyAlcyBsaW50WzB4JXhdKVxuIiwKLQkJCXAtPmFjcGlfaWQsCi0JCQltcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5mbGFncy5wb2xhcml0eV0sCi0JCQltcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdLCBwLT5saW50KTsKLQl9CisJCXsKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqKWhlYWRlcjsKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCQkgICAgICAgIkxBUElDX05NSSAoYWNwaV9pZFsweCUwMnhdICVzICVzIGxpbnRbMHgleF0pXG4iLAorCQkJICAgICAgIHAtPmFjcGlfaWQsCisJCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbcC0+ZmxhZ3MudHJpZ2dlcl0sCisJCQkgICAgICAgcC0+bGludCk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUFEVF9MQVBJQ19BRERSX09WUjoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpwID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciopIGhlYWRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkxBUElDX0FERFJfT1ZSIChhZGRyZXNzWyVwXSlcbiIsCi0JCQkodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcC0+YWRkcmVzcyk7Ci0JfQorCQl7CisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICopaGVhZGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiTEFQSUNfQUREUl9PVlIgKGFkZHJlc3NbJXBdKVxuIiwKKwkJCSAgICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXAtPmFkZHJlc3MpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX01BRFRfSU9TQVBJQzoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKnAgPQotCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMqKSBoZWFkZXI7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJJT1NBUElDIChpZFsweCV4XSBhZGRyZXNzWyVwXSBnc2lfYmFzZVslZF0pXG4iLAotCQkJcC0+aWQsICh2b2lkICopICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyZXNzLCBwLT5nbG9iYWxfaXJxX2Jhc2UpOwotCX0KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKiloZWFkZXI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJICAgICAgICJJT1NBUElDIChpZFsweCV4XSBhZGRyZXNzWyVwXSBnc2lfYmFzZVslZF0pXG4iLAorCQkJICAgICAgIHAtPmlkLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXAtPmFkZHJlc3MsCisJCQkgICAgICAgcC0+Z2xvYmFsX2lycV9iYXNlKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9NQURUX0xTQVBJQzoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfbHNhcGljKikgaGVhZGVyOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTFNBUElDIChhY3BpX2lkWzB4JTAyeF0gbHNhcGljX2lkWzB4JTAyeF0gbHNhcGljX2VpZFsweCUwMnhdICVzKVxuIiwKLQkJCXAtPmFjcGlfaWQsIHAtPmlkLCBwLT5laWQsIHAtPmZsYWdzLmVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOwotCX0KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfbHNhcGljICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbHNhcGljICopaGVhZGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiTFNBUElDIChhY3BpX2lkWzB4JTAyeF0gbHNhcGljX2lkWzB4JTAyeF0gbHNhcGljX2VpZFsweCUwMnhdICVzKVxuIiwKKwkJCSAgICAgICBwLT5hY3BpX2lkLCBwLT5pZCwgcC0+ZWlkLAorCQkJICAgICAgIHAtPmZsYWdzLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9NQURUX1BMQVRfSU5UX1NSQzoKLQl7Ci0JCXN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyAqcCA9Ci0JCQkoc3RydWN0IGFjcGlfdGFibGVfcGxhdF9pbnRfc3JjKikgaGVhZGVyOwotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUExBVF9JTlRfU1JDICglcyAlcyB0eXBlWzB4JXhdIGlkWzB4JTA0eF0gZWlkWzB4JXhdIGlvc2FwaWNfdmVjdG9yWzB4JXhdIGdsb2JhbF9pcnFbMHgleF1cbiIsCi0JCQltcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5mbGFncy5wb2xhcml0eV0sCi0JCQltcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdLAotCQkJcC0+dHlwZSwgcC0+aWQsIHAtPmVpZCwgcC0+aW9zYXBpY192ZWN0b3IsIHAtPmdsb2JhbF9pcnEpOwotCX0KKwkJeworCQkJc3RydWN0IGFjcGlfdGFibGVfcGxhdF9pbnRfc3JjICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfcGxhdF9pbnRfc3JjICopaGVhZGVyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiUExBVF9JTlRfU1JDICglcyAlcyB0eXBlWzB4JXhdIGlkWzB4JTA0eF0gZWlkWzB4JXhdIGlvc2FwaWNfdmVjdG9yWzB4JXhdIGdsb2JhbF9pcnFbMHgleF1cbiIsCisJCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbcC0+ZmxhZ3MudHJpZ2dlcl0sCisJCQkgICAgICAgcC0+dHlwZSwgcC0+aWQsIHAtPmVpZCwgcC0+aW9zYXBpY192ZWN0b3IsCisJCQkgICAgICAgcC0+Z2xvYmFsX2lycSk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiRm91bmQgdW5zdXBwb3J0ZWQgTUFEVCBlbnRyeSAodHlwZSA9IDB4JXgpXG4iLAotCQkJaGVhZGVyLT50eXBlKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICJGb3VuZCB1bnN1cHBvcnRlZCBNQURUIGVudHJ5ICh0eXBlID0gMHgleClcbiIsCisJCSAgICAgICBoZWFkZXItPnR5cGUpOwogCQlicmVhazsKIAl9CiB9CiAKLQogc3RhdGljIGludAotYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtICgKLQl2b2lkCQkJKnRhYmxlX3BvaW50ZXIsCi0JdW5zaWduZWQgbG9uZwkJbGVuZ3RoKQorYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKHZvaWQgKnRhYmxlX3BvaW50ZXIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQogewotCXU4CQkJKnAgPSAodTggKikgdGFibGVfcG9pbnRlcjsKLQl1bnNpZ25lZCBsb25nCQlyZW1haW5zID0gbGVuZ3RoOwotCXVuc2lnbmVkIGxvbmcJCXN1bSA9IDA7CisJdTggKnAgPSAodTggKikgdGFibGVfcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIHJlbWFpbnMgPSBsZW5ndGg7CisJdW5zaWduZWQgbG9uZyBzdW0gPSAwOwogCiAJaWYgKCFwIHx8ICFsZW5ndGgpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQxLDkgKzI0Nyw4IEBACiAgKiBmb3IgYWNwaV9ibGFja2xpc3RlZCgpLCBhY3BpX3RhYmxlX2dldF9zZHQoKQogICovCiBpbnQgX19pbml0Ci1hY3BpX2dldF90YWJsZV9oZWFkZXJfZWFybHkgKAotCWVudW0gYWNwaV90YWJsZV9pZAlpZCwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKipoZWFkZXIpCithY3BpX2dldF90YWJsZV9oZWFkZXJfZWFybHkoZW51bSBhY3BpX3RhYmxlX2lkIGlkLAorCQkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKmhlYWRlcikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAllbnVtIGFjcGlfdGFibGVfaWQgdGVtcF9pZDsKQEAgLTI2MCw3ICsyNjUsNyBAQAogCQlpZiAoc2R0X2VudHJ5W2ldLmlkICE9IHRlbXBfaWQpCiAJCQljb250aW51ZTsKIAkJKmhlYWRlciA9ICh2b2lkICopCi0JCQlfX2FjcGlfbWFwX3RhYmxlKHNkdF9lbnRyeVtpXS5wYSwgc2R0X2VudHJ5W2ldLnNpemUpOworCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsIHNkdF9lbnRyeVtpXS5zaXplKTsKIAkJaWYgKCEqaGVhZGVyKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCAlc1xuIiwKIAkJCSAgICAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbdGVtcF9pZF0pOwpAQCAtMjc3LDE0ICsyODIsMTcgQEAKIAogCS8qIE1hcCB0aGUgRFNEVCBoZWFkZXIgdmlhIHRoZSBwb2ludGVyIGluIHRoZSBGQURUICovCiAJaWYgKGlkID09IEFDUElfRFNEVCkgewotCQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopICpoZWFkZXI7CisJCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqZmFkdCA9CisJCSAgICAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopKmhlYWRlcjsKIAogCQlpZiAoZmFkdC0+cmV2aXNpb24gPT0gMyAmJiBmYWR0LT5YZHNkdCkgewotCQkJKmhlYWRlciA9ICh2b2lkICopIF9fYWNwaV9tYXBfdGFibGUoZmFkdC0+WGRzZHQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJCSpoZWFkZXIgPSAodm9pZCAqKV9fYWNwaV9tYXBfdGFibGUoZmFkdC0+WGRzZHQsCisJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCQkgIGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJCX0gZWxzZSBpZiAoZmFkdC0+VjFfZHNkdCkgewotCQkJKmhlYWRlciA9ICh2b2lkICopIF9fYWNwaV9tYXBfdGFibGUoZmFkdC0+VjFfZHNkdCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQkJKmhlYWRlciA9ICh2b2lkICopX19hY3BpX21hcF90YWJsZShmYWR0LT5WMV9kc2R0LAorCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkJICBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQl9IGVsc2UKIAkJCSpoZWFkZXIgPSBOVUxMOwogCkBAIC0yOTYsMjEgKzMwNCwxOSBAQAogCiAJcmV0dXJuIDA7CiB9Ci0JIAogCiBpbnQgX19pbml0Ci1hY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5ICgKLQllbnVtIGFjcGlfdGFibGVfaWQJaWQsCi0JdW5zaWduZWQgbG9uZwkJbWFkdF9zaXplLAotCWludAkJCWVudHJ5X2lkLAotCWFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyCWhhbmRsZXIsCi0JdW5zaWduZWQgaW50CQltYXhfZW50cmllcykKK2FjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoZW51bSBhY3BpX3RhYmxlX2lkIGlkLAorCQkJICAgICB1bnNpZ25lZCBsb25nIG1hZHRfc2l6ZSwKKwkJCSAgICAgaW50IGVudHJ5X2lkLAorCQkJICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLAorCQkJICAgICB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCiB7Ci0Jdm9pZAkJCSptYWR0ID0gTlVMTDsKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlcgkqZW50cnk7Ci0JdW5zaWduZWQgaW50CQljb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJbWFkdF9lbmQ7Ci0JdW5zaWduZWQgaW50CQlpOworCXZvaWQgKm1hZHQgPSBOVUxMOworCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICplbnRyeTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFkdF9lbmQ7CisJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIWhhbmRsZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzIxLDcgKzMyNyw3IEBACiAJCWlmIChzZHRfZW50cnlbaV0uaWQgIT0gaWQpCiAJCQljb250aW51ZTsKIAkJbWFkdCA9ICh2b2lkICopCi0JCQlfX2FjcGlfbWFwX3RhYmxlKHNkdF9lbnRyeVtpXS5wYSwgc2R0X2VudHJ5W2ldLnNpemUpOworCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsIHNkdF9lbnRyeVtpXS5zaXplKTsKIAkJaWYgKCFtYWR0KSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCAlc1xuIiwKIAkJCSAgICAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbaWRdKTsKQEAgLTMzNiwyMSArMzQyLDIyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW1hZHRfZW5kID0gKHVuc2lnbmVkIGxvbmcpIG1hZHQgKyBzZHRfZW50cnlbaV0uc2l6ZTsKKwltYWR0X2VuZCA9ICh1bnNpZ25lZCBsb25nKW1hZHQgKyBzZHRfZW50cnlbaV0uc2l6ZTsKIAogCS8qIFBhcnNlIGFsbCBlbnRyaWVzIGxvb2tpbmcgZm9yIGEgbWF0Y2guICovCiAKIAllbnRyeSA9IChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKQotCQkoKHVuc2lnbmVkIGxvbmcpIG1hZHQgKyBtYWR0X3NpemUpOworCSAgICAoKHVuc2lnbmVkIGxvbmcpbWFkdCArIG1hZHRfc2l6ZSk7CiAKLQl3aGlsZSAoKCh1bnNpZ25lZCBsb25nKSBlbnRyeSkgKyBzaXplb2YoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIpIDwgbWFkdF9lbmQpIHsKLQkJaWYgKGVudHJ5LT50eXBlID09IGVudHJ5X2lkICYmCi0JCSAgICAoIW1heF9lbnRyaWVzIHx8IGNvdW50KysgPCBtYXhfZW50cmllcykpCisJd2hpbGUgKCgodW5zaWduZWQgbG9uZyllbnRyeSkgKyBzaXplb2YoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIpIDwKKwkgICAgICAgbWFkdF9lbmQpIHsKKwkJaWYgKGVudHJ5LT50eXBlID09IGVudHJ5X2lkCisJCSAgICAmJiAoIW1heF9lbnRyaWVzIHx8IGNvdW50KysgPCBtYXhfZW50cmllcykpCiAJCQlpZiAoaGFuZGxlcihlbnRyeSwgbWFkdF9lbmQpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCiAJCWVudHJ5ID0gKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICopCi0JCQkoKHVuc2lnbmVkIGxvbmcpIGVudHJ5ICsgZW50cnktPmxlbmd0aCk7CisJCSAgICAoKHVuc2lnbmVkIGxvbmcpZW50cnkgKyBlbnRyeS0+bGVuZ3RoKTsKIAl9CiAJaWYgKG1heF9lbnRyaWVzICYmIGNvdW50ID4gbWF4X2VudHJpZXMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlslczoweCUwMnhdIGlnbm9yZWQgJWkgZW50cmllcyBvZiAiCkBAIC0zNjEsMjUgKzM2OCwxOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotCiBpbnQgX19pbml0Ci1hY3BpX3RhYmxlX3BhcnNlX21hZHQgKAotCWVudW0gYWNwaV9tYWR0X2VudHJ5X2lkCWlkLAotCWFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyCWhhbmRsZXIsCi0JdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQorYWNwaV90YWJsZV9wYXJzZV9tYWR0KGVudW0gYWNwaV9tYWR0X2VudHJ5X2lkIGlkLAorCQkgICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCiB7Ci0JcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoQUNQSV9BUElDLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfbWFkdCksCi0JCQkJCSAgICBpZCwgaGFuZGxlciwgbWF4X2VudHJpZXMpOworCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfQVBJQywKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0KSwgaWQsCisJCQkJCSAgICBoYW5kbGVyLCBtYXhfZW50cmllcyk7CiB9CiAKLQotaW50IF9faW5pdAotYWNwaV90YWJsZV9wYXJzZSAoCi0JZW51bSBhY3BpX3RhYmxlX2lkCWlkLAotCWFjcGlfdGFibGVfaGFuZGxlcgloYW5kbGVyKQoraW50IF9faW5pdCBhY3BpX3RhYmxlX3BhcnNlKGVudW0gYWNwaV90YWJsZV9pZCBpZCwgYWNwaV90YWJsZV9oYW5kbGVyIGhhbmRsZXIpCiB7Ci0JaW50CQkJY291bnQgPSAwOwotCXVuc2lnbmVkIGludAkJaSA9IDA7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CiAKIAlpZiAoIWhhbmRsZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkyLDIwICszOTMsMTggQEAKIAkJCWhhbmRsZXIoc2R0X2VudHJ5W2ldLnBhLCBzZHRfZW50cnlbaV0uc2l6ZSk7CiAKIAkJZWxzZQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIiVkIGR1cGxpY2F0ZSAlcyB0YWJsZSBpZ25vcmVkLlxuIiwKLQkJCQljb3VudCwgYWNwaV90YWJsZV9zaWduYXR1cmVzW2lkXSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICIlZCBkdXBsaWNhdGUgJXMgdGFibGUgaWdub3JlZC5cbiIsIGNvdW50LAorCQkJICAgICAgIGFjcGlfdGFibGVfc2lnbmF0dXJlc1tpZF0pOwogCX0KIAogCXJldHVybiBjb3VudDsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV90YWJsZV9nZXRfc2R0ICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwCSpyc2RwKQorc3RhdGljIGludCBfX2luaXQgYWNwaV90YWJsZV9nZXRfc2R0KHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKnJzZHApCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOwotCXVuc2lnbmVkIGludAkJaSwgaWQgPSAwOworCXVuc2lnbmVkIGludCBpLCBpZCA9IDA7CiAKIAlpZiAoIXJzZHApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDEzLDI0ICs0MTIsMjUgQEAKIAkvKiBGaXJzdCBjaGVjayBYU0RUIChidXQgb25seSBvbiBBQ1BJIDIuMC1jb21wYXRpYmxlIHN5c3RlbXMpICovCiAKIAlpZiAoKHJzZHAtPnJldmlzaW9uID49IDIpICYmCi0JCSgoKHN0cnVjdCBhY3BpMjBfdGFibGVfcnNkcCopcnNkcCktPnhzZHRfYWRkcmVzcykpIHsKLQkJCQotCQlzdHJ1Y3QgYWNwaV90YWJsZV94c2R0CSptYXBwZWRfeHNkdCA9IE5VTEw7CisJICAgICgoKHN0cnVjdCBhY3BpMjBfdGFibGVfcnNkcCAqKXJzZHApLT54c2R0X2FkZHJlc3MpKSB7CiAKLQkJc2R0X3BhID0gKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAqKXJzZHApLT54c2R0X2FkZHJlc3M7CisJCXN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKm1hcHBlZF94c2R0ID0gTlVMTDsKKworCQlzZHRfcGEgPSAoKHN0cnVjdCBhY3BpMjBfdGFibGVfcnNkcCAqKXJzZHApLT54c2R0X2FkZHJlc3M7CiAKIAkJLyogbWFwIGluIGp1c3QgdGhlIGhlYWRlciAqLwogCQloZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopCi0JCQlfX2FjcGlfbWFwX3RhYmxlKHNkdF9wYSwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfcGEsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAogCQlpZiAoIWhlYWRlcikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgWFNEVCBoZWFkZXJcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAiVW5hYmxlIHRvIG1hcCBYU0RUIGhlYWRlclxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCS8qIHJlbWFwIGluIHRoZSBlbnRpcmUgdGFibGUgYmVmb3JlIHByb2Nlc3NpbmcgKi8KIAkJbWFwcGVkX3hzZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfeHNkdCAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfcGEsIGhlYWRlci0+bGVuZ3RoKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBoZWFkZXItPmxlbmd0aCk7CiAJCWlmICghbWFwcGVkX3hzZHQpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIFhTRFRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC00MzgsNyArNDM4LDggQEAKIAkJaGVhZGVyID0gJm1hcHBlZF94c2R0LT5oZWFkZXI7CiAKIAkJaWYgKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsICJYU0RUIiwgNCkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJYU0RUIHNpZ25hdHVyZSBpbmNvcnJlY3RcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAiWFNEVCBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKQEAgLTQ0NywzNiArNDQ4LDM5IEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCi0JCXNkdF9jb3VudCA9IChoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSA+PiAzOworCQlzZHRfY291bnQgPQorCQkgICAgKGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpID4+IDM7CiAJCWlmIChzZHRfY291bnQgPiBBQ1BJX01BWF9UQUJMRVMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJUcnVuY2F0ZWQgJWx1IFhTRFQgZW50cmllc1xuIiwKLQkJCQkoc2R0X2NvdW50IC0gQUNQSV9NQVhfVEFCTEVTKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJUcnVuY2F0ZWQgJWx1IFhTRFQgZW50cmllc1xuIiwKKwkJCSAgICAgICAoc2R0X2NvdW50IC0gQUNQSV9NQVhfVEFCTEVTKSk7CiAJCQlzZHRfY291bnQgPSBBQ1BJX01BWF9UQUJMRVM7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgc2R0X2NvdW50OyBpKyspCi0JCQlzZHRfZW50cnlbaV0ucGEgPSAodW5zaWduZWQgbG9uZykgbWFwcGVkX3hzZHQtPmVudHJ5W2ldOworCQkJc2R0X2VudHJ5W2ldLnBhID0gKHVuc2lnbmVkIGxvbmcpbWFwcGVkX3hzZHQtPmVudHJ5W2ldOwogCX0KIAogCS8qIFRoZW4gY2hlY2sgUlNEVCAqLwogCiAJZWxzZSBpZiAocnNkcC0+cnNkdF9hZGRyZXNzKSB7CiAKLQkJc3RydWN0IGFjcGlfdGFibGVfcnNkdAkqbWFwcGVkX3JzZHQgPSBOVUxMOworCQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICptYXBwZWRfcnNkdCA9IE5VTEw7CiAKIAkJc2R0X3BhID0gcnNkcC0+cnNkdF9hZGRyZXNzOwogCiAJCS8qIG1hcCBpbiBqdXN0IHRoZSBoZWFkZXIgKi8KIAkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfcGEsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJCWlmICghaGVhZGVyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBSU0RUIGhlYWRlclxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJVbmFibGUgdG8gbWFwIFJTRFQgaGVhZGVyXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKIAkJLyogcmVtYXAgaW4gdGhlIGVudGlyZSB0YWJsZSBiZWZvcmUgcHJvY2Vzc2luZyAqLwogCQltYXBwZWRfcnNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICopCi0JCQlfX2FjcGlfbWFwX3RhYmxlKHNkdF9wYSwgaGVhZGVyLT5sZW5ndGgpOworCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfcGEsIGhlYWRlci0+bGVuZ3RoKTsKIAkJaWYgKCFtYXBwZWRfcnNkdCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgUlNEVFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ4NCw3ICs0ODgsOCBAQAogCQloZWFkZXIgPSAmbWFwcGVkX3JzZHQtPmhlYWRlcjsKIAogCQlpZiAoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgIlJTRFQiLCA0KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlJTRFQgc2lnbmF0dXJlIGluY29ycmVjdFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJSU0RUIHNpZ25hdHVyZSBpbmNvcnJlY3RcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApAQCAtNDkzLDE5ICs0OTgsMjIgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKLQkJc2R0X2NvdW50ID0gKGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpID4+IDI7CisJCXNkdF9jb3VudCA9CisJCSAgICAoaGVhZGVyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgPj4gMjsKIAkJaWYgKHNkdF9jb3VudCA+IEFDUElfTUFYX1RBQkxFUykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlRydW5jYXRlZCAlbHUgUlNEVCBlbnRyaWVzXG4iLAotCQkJCShzZHRfY291bnQgLSBBQ1BJX01BWF9UQUJMRVMpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQkgICAgICAgIlRydW5jYXRlZCAlbHUgUlNEVCBlbnRyaWVzXG4iLAorCQkJICAgICAgIChzZHRfY291bnQgLSBBQ1BJX01BWF9UQUJMRVMpKTsKIAkJCXNkdF9jb3VudCA9IEFDUElfTUFYX1RBQkxFUzsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBzZHRfY291bnQ7IGkrKykKLQkJCXNkdF9lbnRyeVtpXS5wYSA9ICh1bnNpZ25lZCBsb25nKSBtYXBwZWRfcnNkdC0+ZW50cnlbaV07CisJCQlzZHRfZW50cnlbaV0ucGEgPSAodW5zaWduZWQgbG9uZyltYXBwZWRfcnNkdC0+ZW50cnlbaV07CiAJfQogCiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJObyBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKFJTRFQvWFNEVCkgc3BlY2lmaWVkIGluIFJTRFBcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkgICAgICAgIk5vIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoUlNEVC9YU0RUKSBzcGVjaWZpZWQgaW4gUlNEUFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNTE1LDE4ICs1MjMsMTcgQEAKIAogCQkvKiBtYXAgaW4ganVzdCB0aGUgaGVhZGVyICovCiAJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKLQkJCV9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLAotCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlpZiAoIWhlYWRlcikKIAkJCWNvbnRpbnVlOwogCiAJCS8qIHJlbWFwIGluIHRoZSBlbnRpcmUgdGFibGUgYmVmb3JlIHByb2Nlc3NpbmcgKi8KIAkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsCi0JCQkJaGVhZGVyLT5sZW5ndGgpOworCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsIGhlYWRlci0+bGVuZ3RoKTsKIAkJaWYgKCFoZWFkZXIpCiAJCQljb250aW51ZTsKLQkgICAgICAgICAgICAgICAKKwogCQlhY3BpX3RhYmxlX3ByaW50KGhlYWRlciwgc2R0X2VudHJ5W2ldLnBhKTsKIAogCQlpZiAoYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKGhlYWRlciwgaGVhZGVyLT5sZW5ndGgpKSB7CkBAIC01MzcsOSArNTQ0LDkgQEAKIAkJc2R0X2VudHJ5W2ldLnNpemUgPSBoZWFkZXItPmxlbmd0aDsKIAogCQlmb3IgKGlkID0gMDsgaWQgPCBBQ1BJX1RBQkxFX0NPVU5UOyBpZCsrKSB7Ci0JCQlpZiAoIXN0cm5jbXAoKGNoYXIgKikgJmhlYWRlci0+c2lnbmF0dXJlLAotCQkJCWFjcGlfdGFibGVfc2lnbmF0dXJlc1tpZF0sCi0JCQkJc2l6ZW9mKGhlYWRlci0+c2lnbmF0dXJlKSkpIHsKKwkJCWlmICghc3RybmNtcCgoY2hhciAqKSZoZWFkZXItPnNpZ25hdHVyZSwKKwkJCQkgICAgIGFjcGlfdGFibGVfc2lnbmF0dXJlc1tpZF0sCisJCQkJICAgICBzaXplb2YoaGVhZGVyLT5zaWduYXR1cmUpKSkgewogCQkJCXNkdF9lbnRyeVtpXS5pZCA9IGlkOwogCQkJfQogCQl9CkBAIC01NTEsNyArNTU4LDcgQEAKIAkgKiBhZ2FpbnN0LiBVbmZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBrbm93IHRoZSBwaHlzX2FkZHIsIHNvIGp1c3QKIAkgKiBwcmludCAwLiBNYXliZSBubyBvbmUgd2lsbCBub3RpY2UuCiAJICovCi0JaWYoIWFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseShBQ1BJX0RTRFQsICZoZWFkZXIpKQorCWlmICghYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5KEFDUElfRFNEVCwgJmhlYWRlcikpCiAJCWFjcGlfdGFibGVfcHJpbnQoaGVhZGVyLCAwKTsKIAogCXJldHVybiAwOwpAQCAtNTY2LDEyICs1NzMsMTEgQEAKICAqIHJlc3VsdDogc2R0X2VudHJ5W10gaXMgaW5pdGlhbGl6ZWQKICAqLwogCi1pbnQgX19pbml0Ci1hY3BpX3RhYmxlX2luaXQgKHZvaWQpCitpbnQgX19pbml0IGFjcGlfdGFibGVfaW5pdCh2b2lkKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3JzZHAJKnJzZHAgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcJCXJzZHBfcGh5cyA9IDA7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHJzZHBfcGh5cyA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAkvKiBMb2NhdGUgYW5kIG1hcCB0aGUgUm9vdCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKFJTRFApICovCiAKQEAgLTU4MSwxOSArNTg3LDI1IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJzZHAgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqKSBfX3ZhKHJzZHBfcGh5cyk7CisJcnNkcCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICopX192YShyc2RwX3BoeXMpOwogCWlmICghcnNkcCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBSU0RQXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJSU0RQICh2JTMuM2QgJTYuNnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgQCAweCVwXG4iLAotCQlyc2RwLT5yZXZpc2lvbiwgcnNkcC0+b2VtX2lkLCAodm9pZCAqKSByc2RwX3BoeXMpOworCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWAorCSAgICAgICAiUlNEUCAodiUzLjNkICU2LjZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIEAgMHglcFxuIiwKKwkgICAgICAgcnNkcC0+cmV2aXNpb24sIHJzZHAtPm9lbV9pZCwgKHZvaWQgKilyc2RwX3BoeXMpOwogCiAJaWYgKHJzZHAtPnJldmlzaW9uIDwgMikKLQkJcmVzdWx0ID0gYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKHJzZHAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwKSk7CisJCXJlc3VsdCA9CisJCSAgICBhY3BpX3RhYmxlX2NvbXB1dGVfY2hlY2tzdW0ocnNkcCwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwKSk7CiAJZWxzZQotCQlyZXN1bHQgPSBhY3BpX3RhYmxlX2NvbXB1dGVfY2hlY2tzdW0ocnNkcCwgKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKilyc2RwKS0+bGVuZ3RoKTsKKwkJcmVzdWx0ID0KKwkJICAgIGFjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bShyc2RwLAorCQkJCQkJKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKikKKwkJCQkJCSByc2RwKS0+bGVuZ3RoKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiICA+Pj4gRVJST1I6IEludmFsaWQgY2hlY2tzdW1cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCmluZGV4IDkyZTBjMzEuLmEwMzkzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKQEAgLTQ2LDI4ICs0NiwyMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiY29udnJ0IikKK0FDUElfTU9EVUxFX05BTUUoInRiY29udnJ0IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQKK2FjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3Moc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpuZXdfZ2FzX3N0cnVjdCwKKwkJCSAgICAgdTggcmVnaXN0ZXJfYml0X3dpZHRoLAorCQkJICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcyk7CiAKIHN0YXRpYyB2b2lkCi1hY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpuZXdfZ2FzX3N0cnVjdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdF93aWR0aCwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MpOworYWNwaV90Yl9jb252ZXJ0X2ZhZHQxKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKKwkJICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxICpvcmlnaW5hbF9mYWR0KTsKIAogc3RhdGljIHZvaWQKLWFjcGlfdGJfY29udmVydF9mYWR0MSAoCi0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpsb2NhbF9mYWR0LAotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSAgICAqb3JpZ2luYWxfZmFkdCk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3RiX2NvbnZlcnRfZmFkdDIgKAotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqbG9jYWxfZmFkdCwKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKm9yaWdpbmFsX2ZhZHQpOwotCithY3BpX3RiX2NvbnZlcnRfZmFkdDIoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpsb2NhbF9mYWR0LAorCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKm9yaWdpbmFsX2ZhZHQpOwogCiB1OCBhY3BpX2ZhZHRfaXNfdjE7CiBFWFBPUlRfU1lNQk9MKGFjcGlfZmFkdF9pc192MSk7CkBAIC04NywyMSArODEsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgotYWNwaV90Yl9nZXRfdGFibGVfY291bnQgKAotCXN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgICAgICAgICAgKlJTRFAsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqUlNEVCkKK2FjcGlfdGJfZ2V0X3RhYmxlX2NvdW50KHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKlJTRFAsCisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKlJTRFQpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3NpemU7CisJdTMyIHBvaW50ZXJfc2l6ZTsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJLyogUlNEVCBwb2ludGVycyBhcmUgMzIgYml0cywgWFNEVCBwb2ludGVycyBhcmUgNjQgYml0cyAqLwogCi0KLQlpZiAoUlNEUC0+cmV2aXNpb24gPCAyKSB7Ci0JCXBvaW50ZXJfc2l6ZSA9IHNpemVvZiAodTMyKTsKLQl9Ci0JZWxzZSB7Ci0JCXBvaW50ZXJfc2l6ZSA9IHNpemVvZiAodTY0KTsKKwlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7CisJCXBvaW50ZXJfc2l6ZSA9IHNpemVvZih1MzIpOworCX0gZWxzZSB7CisJCXBvaW50ZXJfc2l6ZSA9IHNpemVvZih1NjQpOwogCX0KIAogCS8qCkBAIC0xMTAsMTAgKzEwMiwxMCBAQAogCSAqIHBvaW50ZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFJTRFQvWFNEVC4gIFRoZSBzaXplIG9mIHRoZSBwb2ludGVycwogCSAqIGlzIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQuCiAJICovCi0JcmV0dXJuICgoUlNEVC0+bGVuZ3RoIC0gc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSAvIHBvaW50ZXJfc2l6ZSk7CisJcmV0dXJuICgoUlNEVC0+bGVuZ3RoIC0KKwkJIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSAvIHBvaW50ZXJfc2l6ZSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQKQEAgLTEyNiw2NCArMTE4LDY1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfY29udmVydF90b194c2R0ICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQorYWNwaV9zdGF0dXMgYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX3NpemU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCVhTRFRfREVTQ1JJUFRPUiAgICAgICAgICpuZXdfdGFibGU7CisJYWNwaV9zaXplIHRhYmxlX3NpemU7CisJdTMyIGk7CisJWFNEVF9ERVNDUklQVE9SICpuZXdfdGFibGU7CiAKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBDb21wdXRlIHNpemUgb2YgdGhlIGNvbnZlcnRlZCBYU0RUICovCiAKLQl0YWJsZV9zaXplID0gKChhY3BpX3NpemUpIGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQgKiBzaXplb2YgKHU2NCkpICsKLQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOworCXRhYmxlX3NpemUgPSAoKGFjcGlfc2l6ZSkgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCAqIHNpemVvZih1NjQpKSArCisJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOwogCiAJLyogQWxsb2NhdGUgYW4gWFNEVCAqLwogCi0JbmV3X3RhYmxlID0gQUNQSV9NRU1fQ0FMTE9DQVRFICh0YWJsZV9zaXplKTsKKwluZXdfdGFibGUgPSBBQ1BJX01FTV9DQUxMT0NBVEUodGFibGVfc2l6ZSk7CiAJaWYgKCFuZXdfdGFibGUpIHsKIAkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCX0KIAogCS8qIENvcHkgdGhlIGhlYWRlciBhbmQgc2V0IHRoZSBsZW5ndGggKi8KIAotCUFDUElfTUVNQ1BZIChuZXdfdGFibGUsIHRhYmxlX2luZm8tPnBvaW50ZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJQUNQSV9NRU1DUFkobmV3X3RhYmxlLCB0YWJsZV9pbmZvLT5wb2ludGVyLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCW5ld190YWJsZS0+bGVuZ3RoID0gKHUzMikgdGFibGVfc2l6ZTsKIAogCS8qIENvcHkgdGhlIHRhYmxlIHBvaW50ZXJzICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA8IDIpIHsKLQkJCUFDUElfU1RPUkVfQUREUkVTUyAobmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0sCi0JCQkJKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCByc2R0X2Rlc2NyaXB0b3JfcmV2MSwKLQkJCQkJdGFibGVfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV0pOwotCQl9Ci0JCWVsc2UgeworCQkvKiBSU0RUIHBvaW50ZXJzIGFyZSAzMiBiaXRzLCBYU0RUIHBvaW50ZXJzIGFyZSA2NCBiaXRzICovCisKKwkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgeworCQkJQUNQSV9TVE9SRV9BRERSRVNTKG5ld190YWJsZS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldLAorCQkJCQkgICAoQUNQSV9DQVNUX1BUUgorCQkJCQkgICAgKHN0cnVjdCByc2R0X2Rlc2NyaXB0b3JfcmV2MSwKKwkJCQkJICAgICB0YWJsZV9pbmZvLT5wb2ludGVyKSktPgorCQkJCQkgICB0YWJsZV9vZmZzZXRfZW50cnlbaV0pOworCQl9IGVsc2UgewogCQkJbmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0gPQotCQkJCShBQ1BJX0NBU1RfUFRSIChYU0RUX0RFU0NSSVBUT1IsCi0JCQkJCXRhYmxlX2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOworCQkJICAgIChBQ1BJX0NBU1RfUFRSKFhTRFRfREVTQ1JJUFRPUiwKKwkJCQkJICAgdGFibGVfaW5mby0+cG9pbnRlcikpLT4KKwkJCSAgICB0YWJsZV9vZmZzZXRfZW50cnlbaV07CiAJCX0KIAl9CiAKIAkvKiBEZWxldGUgdGhlIG9yaWdpbmFsIHRhYmxlIChlaXRoZXIgbWFwcGVkIG9yIGluIGEgYnVmZmVyKSAqLwogCi0JYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlICh0YWJsZV9pbmZvKTsKKwlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUodGFibGVfaW5mbyk7CiAKIAkvKiBQb2ludCB0aGUgdGFibGUgZGVzY3JpcHRvciB0byB0aGUgbmV3IHRhYmxlICovCiAKLQl0YWJsZV9pbmZvLT5wb2ludGVyICAgICA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgbmV3X3RhYmxlKTsKLQl0YWJsZV9pbmZvLT5sZW5ndGggICAgICA9IHRhYmxlX3NpemU7Ci0JdGFibGVfaW5mby0+YWxsb2NhdGlvbiAgPSBBQ1BJX01FTV9BTExPQ0FURUQ7CisJdGFibGVfaW5mby0+cG9pbnRlciA9CisJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLCBuZXdfdGFibGUpOworCXRhYmxlX2luZm8tPmxlbmd0aCA9IHRhYmxlX3NpemU7CisJdGFibGVfaW5mby0+YWxsb2NhdGlvbiA9IEFDUElfTUVNX0FMTE9DQVRFRDsKIAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MKQEAgLTE5OSwyMSArMTkyLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqbmV3X2dhc19zdHJ1Y3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9iaXRfd2lkdGgsCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzKQorYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyhzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKm5ld19nYXNfc3RydWN0LAorCQkJICAgICB1OCByZWdpc3Rlcl9iaXRfd2lkdGgsCisJCQkgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzKQogewogCi0JQUNQSV9TVE9SRV9BRERSRVNTIChuZXdfZ2FzX3N0cnVjdC0+YWRkcmVzcywgYWRkcmVzcyk7CisJQUNQSV9TVE9SRV9BRERSRVNTKG5ld19nYXNfc3RydWN0LT5hZGRyZXNzLCBhZGRyZXNzKTsKIAogCW5ld19nYXNfc3RydWN0LT5hZGRyZXNzX3NwYWNlX2lkID0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOwogCW5ld19nYXNfc3RydWN0LT5yZWdpc3Rlcl9iaXRfd2lkdGggPSByZWdpc3Rlcl9iaXRfd2lkdGg7CiAJbmV3X2dhc19zdHJ1Y3QtPnJlZ2lzdGVyX2JpdF9vZmZzZXQgPSAwOwotCW5ld19nYXNfc3RydWN0LT5hY2Nlc3Nfd2lkdGggICAgPSAwOworCW5ld19nYXNfc3RydWN0LT5hY2Nlc3Nfd2lkdGggPSAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY29udmVydF9mYWR0MQpAQCAtMjI4LDkgKzIxOSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQxICgKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQsCi0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxICAgICpvcmlnaW5hbF9mYWR0KQorYWNwaV90Yl9jb252ZXJ0X2ZhZHQxKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKKwkJICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxICpvcmlnaW5hbF9mYWR0KQogewogCiAJLyogQUNQSSAxLjAgRkFDUyAqLwpAQCAtMjQzLDEyICsyMzMsMTQgQEAKIAkgKiBUaGUgMi4wIHRhYmxlIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgMS4wIHRhYmxlLCBzbyB0aGUgZW50aXJlIDEuMAogCSAqIHRhYmxlIGNhbiBiZSBjb3BpZWQgZmlyc3QsIHRoZW4gZXhwYW5kIHNvbWUgZmllbGRzIHRvIDY0IGJpdHMuCiAJICovCi0JQUNQSV9NRU1DUFkgKGxvY2FsX2ZhZHQsIG9yaWdpbmFsX2ZhZHQsIHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxKSk7CisJQUNQSV9NRU1DUFkobG9jYWxfZmFkdCwgb3JpZ2luYWxfZmFkdCwKKwkJICAgIHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEpKTsKIAogCS8qIENvbnZlcnQgdGFibGUgcG9pbnRlcnMgdG8gNjQtYml0IGZpZWxkcyAqLwogCi0JQUNQSV9TVE9SRV9BRERSRVNTIChsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCwgbG9jYWxfZmFkdC0+VjFfZmlybXdhcmVfY3RybCk7Ci0JQUNQSV9TVE9SRV9BRERSRVNTIChsb2NhbF9mYWR0LT5YZHNkdCwgbG9jYWxfZmFkdC0+VjFfZHNkdCk7CisJQUNQSV9TVE9SRV9BRERSRVNTKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsLAorCQkJICAgbG9jYWxfZmFkdC0+VjFfZmlybXdhcmVfY3RybCk7CisJQUNQSV9TVE9SRV9BRERSRVNTKGxvY2FsX2ZhZHQtPlhkc2R0LCBsb2NhbF9mYWR0LT5WMV9kc2R0KTsKIAogCS8qCiAJICogU3lzdGVtIEludGVycnVwdCBNb2RlbCBpc24ndCB1c2VkIGluIEFDUEkgMi4wCkBAIC0yODMsMTcgKzI3NSwxNyBAQAogCSAqIEl0IHByaW1hcmlseSBhZGRzIHRoZSBGQURUIHJlc2V0IG1lY2hhbmlzbS4KIAkgKi8KIAlpZiAoKG9yaWdpbmFsX2ZhZHQtPnJldmlzaW9uID09IDIpICYmCi0JCShvcmlnaW5hbF9mYWR0LT5sZW5ndGggPT0gc2l6ZW9mIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjJfbWludXMpKSkgeworCSAgICAob3JpZ2luYWxfZmFkdC0+bGVuZ3RoID09CisJICAgICBzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzKSkpIHsKIAkJLyoKIAkJICogR3JhYiB0aGUgZW50aXJlIGdlbmVyaWMgYWRkcmVzcyBzdHJ1Y3QsIHBsdXMgdGhlIDEtYnl0ZSByZXNldCB2YWx1ZQogCQkgKiB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MuCiAJCSAqLwotCQlBQ1BJX01FTUNQWSAoJmxvY2FsX2ZhZHQtPnJlc2V0X3JlZ2lzdGVyLAotCQkJJihBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjJfbWludXMsCi0JCQkJb3JpZ2luYWxfZmFkdCkpLT5yZXNldF9yZWdpc3RlciwKLSAgCQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpICsgMSk7Ci0JfQotCWVsc2UgeworCQlBQ1BJX01FTUNQWSgmbG9jYWxfZmFkdC0+cmVzZXRfcmVnaXN0ZXIsCisJCQkgICAgJihBQ1BJX0NBU1RfUFRSKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cywKKwkJCQkJICAgIG9yaWdpbmFsX2ZhZHQpKS0+cmVzZXRfcmVnaXN0ZXIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykgKyAxKTsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBTaW5jZSB0aGVyZSBpc24ndCBhbnkgZXF1aXZhbGVuY2UgaW4gMS4wIGFuZCBzaW5jZSBpdCBpcyBoaWdobHkKIAkJICogbGlrZWx5IHRoYXQgYSAxLjAgc3lzdGVtIGhhcyBsZWdhY3kgc3VwcG9ydC4KQEAgLTMwNCw0MyArMjk2LDYwIEBACiAJLyoKIAkgKiBDb252ZXJ0IHRoZSBWMS4wIGJsb2NrIGFkZHJlc3NlcyB0byBWMi4wIEdBUyBzdHJ1Y3R1cmVzCiAJICovCi0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGssIGxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX3BtMWFfZXZ0X2Jsayk7Ci0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGssIGxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX3BtMWJfZXZ0X2Jsayk7Ci0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFhX2NudF9ibGssIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX3BtMWFfY250X2Jsayk7Ci0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFiX2NudF9ibGssIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX3BtMWJfY250X2Jsayk7Ci0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTJfY250X2JsaywgbG9jYWxfZmFkdC0+cG0yX2NudF9sZW4sCi0JCQkgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpICAgbG9jYWxfZmFkdC0+VjFfcG0yX2NudF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG1fdG1yX2JsaywgbG9jYWxfZmFkdC0+cG1fdG1fbGVuLAotCQkJICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAgIGxvY2FsX2ZhZHQtPlYxX3BtX3Rtcl9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54Z3BlMF9ibGssIDAsCi0JCQkgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpICAgbG9jYWxfZmFkdC0+VjFfZ3BlMF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54Z3BlMV9ibGssIDAsCi0JCQkgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpICAgbG9jYWxfZmFkdC0+VjFfZ3BlMV9ibGspOworCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGssCisJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgorCQkJCSAgICAgVjFfcG0xYV9ldnRfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLAorCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KKwkJCQkgICAgIFYxX3BtMWJfZXZ0X2Jsayk7CisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWFfY250X2JsaywKKwkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAorCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+CisJCQkJICAgICBWMV9wbTFhX2NudF9ibGspOworCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFiX2NudF9ibGssCisJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgorCQkJCSAgICAgVjFfcG0xYl9jbnRfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssCisJCQkJICAgICBsb2NhbF9mYWR0LT5wbTJfY250X2xlbiwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgorCQkJCSAgICAgVjFfcG0yX2NudF9ibGspOworCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLAorCQkJCSAgICAgbG9jYWxfZmFkdC0+cG1fdG1fbGVuLAorCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+CisJCQkJICAgICBWMV9wbV90bXJfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54Z3BlMF9ibGssIDAsCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KKwkJCQkgICAgIFYxX2dwZTBfYmxrKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54Z3BlMV9ibGssIDAsCisJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KKwkJCQkgICAgIFYxX2dwZTFfYmxrKTsKIAogCS8qIENyZWF0ZSBzZXBhcmF0ZSBHQVMgc3RydWN0cyBmb3IgdGhlIFBNMSBFbmFibGUgcmVnaXN0ZXJzICovCiAKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAotCQkgKHU4KSBBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiksCi0JCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCi0JCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCisJCQkJICAgICAodTgpIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkgICAgIHBtMV9ldnRfbGVuKSwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJICAgICAobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKKwkJCQkgICAgICBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwogCiAJLyogUE0xQiBpcyBvcHRpb25hbDsgbGVhdmUgbnVsbCBpZiBub3QgcHJlc2VudCAqLwogCiAJaWYgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWJfZW5hYmxlLAotCQkJICh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyArCi0JCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7CisJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSwKKwkJCQkJICAgICAodTgpIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkJICAgICBwbTFfZXZ0X2xlbiksCisJCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJICAgICAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay4KKwkJCQkJICAgICAgYWRkcmVzcyArCisJCQkJCSAgICAgIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkJIHBtMV9ldnRfbGVuKSkpOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NvbnZlcnRfZmFkdDIKQEAgLTM1NiwxNCArMzY1LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQyICgKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKmxvY2FsX2ZhZHQsCi0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpvcmlnaW5hbF9mYWR0KQorYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKKwkJICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpvcmlnaW5hbF9mYWR0KQogewogCiAJLyogV2UgaGF2ZSBhbiBBQ1BJIDIuMCBGQURUIGJ1dCB3ZSBtdXN0IGNvcHkgaXQgdG8gb3VyIGxvY2FsIGJ1ZmZlciAqLwogCi0JQUNQSV9NRU1DUFkgKGxvY2FsX2ZhZHQsIG9yaWdpbmFsX2ZhZHQsIHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSk7CisJQUNQSV9NRU1DUFkobG9jYWxfZmFkdCwgb3JpZ2luYWxfZmFkdCwKKwkJICAgIHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpKTsKIAogCS8qCiAJICogIlgiIGZpZWxkcyBhcmUgb3B0aW9uYWwgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgVjEuMCBmaWVsZHMsIHNvCkBAIC0zNzEsODYgKzM4MCw5OSBAQAogCSAqIGlzIHplcm8uCiAJICovCiAJaWYgKCEobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwpKSB7Ci0JCUFDUElfU1RPUkVfQUREUkVTUyAobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwsCi0JCQlsb2NhbF9mYWR0LT5WMV9maXJtd2FyZV9jdHJsKTsKKwkJQUNQSV9TVE9SRV9BRERSRVNTKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsLAorCQkJCSAgIGxvY2FsX2ZhZHQtPlYxX2Zpcm13YXJlX2N0cmwpOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPlhkc2R0KSkgewotCQlBQ1BJX1NUT1JFX0FERFJFU1MgKGxvY2FsX2ZhZHQtPlhkc2R0LCBsb2NhbF9mYWR0LT5WMV9kc2R0KTsKKwkJQUNQSV9TVE9SRV9BRERSRVNTKGxvY2FsX2ZhZHQtPlhkc2R0LCBsb2NhbF9mYWR0LT5WMV9kc2R0KTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCi0JCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFhX2V2dF9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLAorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG0xYV9ldnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCi0JCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFiX2V2dF9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLAorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG0xYl9ldnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sCi0JCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFhX2NudF9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLAorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG0xYV9jbnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sCi0JCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFiX2NudF9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLAorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAorCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG0xYl9jbnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0yX2NudF9ibGsuYWRkcmVzcykpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTJfY250X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMl9jbnRfbGVuLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0yX2NudF9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssCisJCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0yX2NudF9sZW4sCisJCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9wbTJfY250X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzcykpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG1fdG1fbGVuLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG1fdG1yX2Jsayk7CisJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLAorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtX3RtX2xlbiwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX3BtX3Rtcl9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhncGUwX2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eGdwZTBfYmxrLAotCQkJMCwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfZ3BlMF9ibGspOworCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54Z3BlMF9ibGssCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX2dwZTBfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54Z3BlMV9ibGsuYWRkcmVzcykpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhncGUxX2JsaywKLQkJCTAsIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX2dwZTFfYmxrKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eGdwZTFfYmxrLAorCQkJCQkgICAgIDAsCisJCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9ncGUxX2Jsayk7CiAJfQogCiAJLyogQ3JlYXRlIHNlcGFyYXRlIEdBUyBzdHJ1Y3RzIGZvciB0aGUgUE0xIEVuYWJsZSByZWdpc3RlcnMgKi8KIAotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCi0JCSh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCi0JCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKKwlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCisJCQkJICAgICAodTgpIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+CisJCQkJCQkgICAgIHBtMV9ldnRfbGVuKSwKKwkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJICAgICAobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKKwkJCQkgICAgICBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwogCiAJYWNwaV9nYmxfeHBtMWFfZW5hYmxlLmFkZHJlc3Nfc3BhY2VfaWQgPQotCQlsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7CisJICAgIGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKIAogCS8qIFBNMUIgaXMgb3B0aW9uYWw7IGxlYXZlIG51bGwgaWYgbm90IHByZXNlbnQgKi8KIAogCWlmIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFiX2VuYWJsZSwKLQkJCSh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzICsKLQkJCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWJfZW5hYmxlLAorCQkJCQkgICAgICh1OCkgQUNQSV9ESVZfMihhY3BpX2dibF9GQURULT4KKwkJCQkJCQkgICAgIHBtMV9ldnRfbGVuKSwKKwkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkgICAgIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLgorCQkJCQkgICAgICBhZGRyZXNzICsKKwkJCQkJICAgICAgQUNQSV9ESVZfMihhY3BpX2dibF9GQURULT4KKwkJCQkJCQkgcG0xX2V2dF9sZW4pKSk7CiAKIAkJYWNwaV9nYmxfeHBtMWJfZW5hYmxlLmFkZHJlc3Nfc3BhY2VfaWQgPQotCQkJbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOworCQkgICAgbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdApAQCAtNDY3LDgzICs0ODksNzYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCh2b2lkKQogewotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqbG9jYWxfZmFkdDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgKnRhYmxlX2Rlc2M7CisJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpsb2NhbF9mYWR0OworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9jb252ZXJ0X3RhYmxlX2ZhZHQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2NvbnZlcnRfdGFibGVfZmFkdCIpOwogCiAJLyoKIAkgKiBhY3BpX2dibF9GQURUIGlzIHZhbGlkLiBWYWxpZGF0ZSB0aGUgRkFEVCBsZW5ndGguIFRoZSB0YWJsZSBtdXN0IGJlCiAJICogYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgdmVyc2lvbiAxLjAgRkFEVAogCSAqLwotCWlmIChhY3BpX2dibF9GQURULT5sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSkpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiRkFEVCBpcyBpbnZhbGlkLCB0b28gc2hvcnQ6IDB4JVhcbiIsCi0JCQlhY3BpX2dibF9GQURULT5sZW5ndGgpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7CisJaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiRkFEVCBpcyBpbnZhbGlkLCB0b28gc2hvcnQ6IDB4JVhcbiIsCisJCQkJICAgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7CiAJfQogCiAJLyogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgQUNQSSAyLjAoKykgRkFEVCAqLwogCi0JbG9jYWxfZmFkdCA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpKTsKKwlsb2NhbF9mYWR0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpKTsKIAlpZiAoIWxvY2FsX2ZhZHQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAlpZiAoYWNwaV9nYmxfRkFEVC0+cmV2aXNpb24gPj0gRkFEVDJfUkVWSVNJT05fSUQpIHsKLQkJaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSkgeworCQlpZiAoYWNwaV9nYmxfRkFEVC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MikpIHsKIAkJCS8qIExlbmd0aCBpcyB0b28gc2hvcnQgdG8gYmUgYSBWMi4wIHRhYmxlICovCiAKLQkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKLQkJCQkiSW5jb25zaXN0ZW50IEZBRFQgbGVuZ3RoICgweCVYKSBhbmQgcmV2aXNpb24gKDB4JVgpLCB1c2luZyBGQURUIFYxLjAgcG9ydGlvbiBvZiB0YWJsZVxuIiwKLQkJCQlhY3BpX2dibF9GQURULT5sZW5ndGgsIGFjcGlfZ2JsX0ZBRFQtPnJldmlzaW9uKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW5jb25zaXN0ZW50IEZBRFQgbGVuZ3RoICgweCVYKSBhbmQgcmV2aXNpb24gKDB4JVgpLCB1c2luZyBGQURUIFYxLjAgcG9ydGlvbiBvZiB0YWJsZVxuIiwgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLCBhY3BpX2dibF9GQURULT5yZXZpc2lvbikpOwogCi0JCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDEgKGxvY2FsX2ZhZHQsICh2b2lkICopIGFjcGlfZ2JsX0ZBRFQpOwotCQl9Ci0JCWVsc2UgeworCQkJYWNwaV90Yl9jb252ZXJ0X2ZhZHQxKGxvY2FsX2ZhZHQsCisJCQkJCSAgICAgICh2b2lkICopYWNwaV9nYmxfRkFEVCk7CisJCX0gZWxzZSB7CiAJCQkvKiBWYWxpZCBWMi4wIHRhYmxlICovCiAKLQkJCWFjcGlfdGJfY29udmVydF9mYWR0MiAobG9jYWxfZmFkdCwgYWNwaV9nYmxfRkFEVCk7CisJCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDIobG9jYWxfZmFkdCwgYWNwaV9nYmxfRkFEVCk7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogVmFsaWQgVjEuMCB0YWJsZSAqLwogCi0JCWFjcGlfdGJfY29udmVydF9mYWR0MSAobG9jYWxfZmFkdCwgKHZvaWQgKikgYWNwaV9nYmxfRkFEVCk7CisJCWFjcGlfdGJfY29udmVydF9mYWR0MShsb2NhbF9mYWR0LCAodm9pZCAqKWFjcGlfZ2JsX0ZBRFQpOwogCX0KIAogCS8qIEdsb2JhbCBGQURUIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGUgbmV3IGNvbW1vbiBWMi4wIEZBRFQgKi8KIAogCWFjcGlfZ2JsX0ZBRFQgPSBsb2NhbF9mYWR0OwotCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA9IHNpemVvZiAoRkFEVF9ERVNDUklQVE9SKTsKKwlhY3BpX2dibF9GQURULT5sZW5ndGggPSBzaXplb2YoRkFEVF9ERVNDUklQVE9SKTsKIAogCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHRhYmxlICovCiAKIAl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9GQURUXS5uZXh0OwotCWFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZSAodGFibGVfZGVzYyk7CisJYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlKHRhYmxlX2Rlc2MpOwogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlICovCiAKLQl0YWJsZV9kZXNjLT5wb2ludGVyICAgICA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgYWNwaV9nYmxfRkFEVCk7Ci0JdGFibGVfZGVzYy0+YWxsb2NhdGlvbiAgPSBBQ1BJX01FTV9BTExPQ0FURUQ7Ci0JdGFibGVfZGVzYy0+bGVuZ3RoICAgICAgPSBzaXplb2YgKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Mik7CisJdGFibGVfZGVzYy0+cG9pbnRlciA9CisJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLCBhY3BpX2dibF9GQURUKTsKKwl0YWJsZV9kZXNjLT5hbGxvY2F0aW9uID0gQUNQSV9NRU1fQUxMT0NBVEVEOworCXRhYmxlX2Rlc2MtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIpOwogCiAJLyogRHVtcCB0aGUgZW50aXJlIEZBRFQgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywKLQkJIkhleCBkdW1wIG9mIGNvbW1vbiBpbnRlcm5hbCBGQURULCBzaXplICVkICglWClcbiIsCi0JCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCwgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7Ci0JQUNQSV9EVU1QX0JVRkZFUiAoKHU4ICopIChhY3BpX2dibF9GQURUKSwgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCSAgIkhleCBkdW1wIG9mIGNvbW1vbiBpbnRlcm5hbCBGQURULCBzaXplICVkICglWClcbiIsCisJCQkgIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCwgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7CisJQUNQSV9EVU1QX0JVRkZFUigodTggKikgKGFjcGlfZ2JsX0ZBRFQpLCBhY3BpX2dibF9GQURULT5sZW5ndGgpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzCkBAIC01NTcsMjYgKzU3MiwyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQorYWNwaV9zdGF0dXMgYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2J1aWxkX2NvbW1vbl9mYWNzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9idWlsZF9jb21tb25fZmFjcyIpOwogCiAJLyogQWJzb2x1dGUgbWluaW11bSBsZW5ndGggaXMgMjQsIGJ1dCB0aGUgQUNQSSBzcGVjIHNheXMgNjQgKi8KIAogCWlmIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCAyNCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIEZBQ1MgdGFibGUgbGVuZ3RoOiAweCVYXG4iLAotCQkJYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgRkFDUyB0YWJsZSBsZW5ndGg6IDB4JVhcbiIsCisJCQkJICAgYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7CiAJfQogCiAJaWYgKGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCA8IDY0KSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKLQkJCSJGQUNTIGlzIHNob3J0ZXIgdGhhbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGFsbG93czogMHglWCwgdXNpbmcgYW55d2F5XG4iLAotCQkJYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJGQUNTIGlzIHNob3J0ZXIgdGhhbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGFsbG93czogMHglWCwgdXNpbmcgYW55d2F5XG4iLCBhY3BpX2dibF9GQUNTLT5sZW5ndGgpKTsKIAl9CiAKIAkvKiBDb3B5IGZpZWxkcyB0byB0aGUgbmV3IEZBQ1MgKi8KQEAgLTU4NCwyMiArNTk0LDIyIEBACiAJYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2sgPSAmKGFjcGlfZ2JsX0ZBQ1MtPmdsb2JhbF9sb2NrKTsKIAogCWlmICgoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPCAyKSB8fAotCQkoYWNwaV9nYmxfRkFDUy0+bGVuZ3RoIDwgMzIpIHx8Ci0JCSghKGFjcGlfZ2JsX0ZBQ1MtPnhmaXJtd2FyZV93YWtpbmdfdmVjdG9yKSkpIHsKKwkgICAgKGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCA8IDMyKSB8fAorCSAgICAoIShhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpKSB7CiAJCS8qIEFDUEkgMS4wIEZBQ1Mgb3Igc2hvcnQgdGFibGUgb3Igb3B0aW9uYWwgWF8gZmllbGQgaXMgemVybyAqLwogCi0JCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IgPSBBQ1BJX0NBU1RfUFRSICh1NjQsCi0JCQkJJihhY3BpX2dibF9GQUNTLT5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7CisJCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IgPSBBQ1BJX0NBU1RfUFRSKHU2NCwKKwkJCQkJCQkJCSAgICAmCisJCQkJCQkJCQkgICAgKGFjcGlfZ2JsX0ZBQ1MtPgorCQkJCQkJCQkJICAgICBmaXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7CiAJCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLnZlY3Rvcl93aWR0aCA9IDMyOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBBQ1BJIDIuMCBGQUNTIHdpdGggdmFsaWQgWF8gZmllbGQgKi8KIAotCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gJmFjcGlfZ2JsX0ZBQ1MtPnhmaXJtd2FyZV93YWtpbmdfdmVjdG9yOworCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0KKwkJICAgICZhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKIAkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MudmVjdG9yX3dpZHRoID0gNjQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKaW5kZXggNGFiMmFhZC4uNmFjZDVhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYwpAQCAtNDEsMjcgKzQxLDIxIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJnZXQiKQorQUNQSV9NT0RVTEVfTkFNRSgidGJnZXQiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X3RoaXNfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGhpc190YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl90YWJsZV9vdmVycmlkZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwotCithY3BpX3RiX3RhYmxlX292ZXJyaWRlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzgsMzcgKzcyLDM0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfdGJfZ2V0X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCSAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgIGhlYWRlcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2dldF90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3RhYmxlIik7CiAKIAkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKGFkZHJlc3MsICZoZWFkZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlcihhZGRyZXNzLCAmaGVhZGVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IHRoZSBlbnRpcmUgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkgKGFkZHJlc3MsICZoZWFkZXIsIHRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIChzaXplICVYKSwgJXNcbiIsCi0JCQloZWFkZXIubGVuZ3RoLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoYWRkcmVzcywgJmhlYWRlciwgdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIChzaXplICVYKSwgJXNcbiIsCisJCQkJICAgaGVhZGVyLmxlbmd0aCwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlcgpAQCAtMTI3LDE2ICsxMTgsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqcmV0dXJuX2hlYWRlcikKK2FjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlcihzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkJIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqcmV0dXJuX2hlYWRlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfZ2V0X3RhYmxlX2hlYWRlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3RhYmxlX2hlYWRlciIpOwogCiAJLyoKIAkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbApAQCAtMTQ4LDQ2ICsxMzYsNDIgQEAKIAogCQkvKiBQb2ludGVyIG1hdGNoZXMgcHJvY2Vzc29yIG1vZGUsIGNvcHkgdGhlIGhlYWRlciAqLwogCi0JCUFDUElfTUVNQ1BZIChyZXR1cm5faGVhZGVyLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsCi0JCQlzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlBQ1BJX01FTUNQWShyZXR1cm5faGVhZGVyLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX0xPR01PREVfUEhZU1BUUjoKIAotCQkvKiBDcmVhdGUgYSBsb2dpY2FsIGFkZHJlc3MgZm9yIHRoZSBwaHlzaWNhbCBwb2ludGVyKi8KKwkJLyogQ3JlYXRlIGEgbG9naWNhbCBhZGRyZXNzIGZvciB0aGUgcGh5c2ljYWwgcG9pbnRlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKLQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpLCAodm9pZCAqKSAmaGVhZGVyKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciksCisJCQkJCSAgICAodm9pZCAqKSZoZWFkZXIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCiAJCS8qIENvcHkgaGVhZGVyIGFuZCBkZWxldGUgbWFwcGluZyAqLwogCi0JCUFDUElfTUVNQ1BZIChyZXR1cm5faGVhZGVyLCBoZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCWFjcGlfb3NfdW5tYXBfbWVtb3J5IChoZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCUFDUElfTUVNQ1BZKHJldHVybl9oZWFkZXIsIGhlYWRlciwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIGFkZHJlc3MgZmxhZ3MgJVhcbiIsCi0JCQlhZGRyZXNzLT5wb2ludGVyX3R5cGUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGFkZHJlc3MgZmxhZ3MgJVhcbiIsCisJCQkJICAgYWRkcmVzcy0+cG9pbnRlcl90eXBlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJUYWJsZSBTaWduYXR1cmU6IFslNC40c11cbiIsCi0JCXJldHVybl9oZWFkZXItPnNpZ25hdHVyZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLCAiVGFibGUgU2lnbmF0dXJlOiBbJTQuNHNdXG4iLAorCQkJICByZXR1cm5faGVhZGVyLT5zaWduYXR1cmUpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfdGFibGVfYm9keQpAQCAtMjA5LDM3ICsxOTMsMzMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9ib2R5ICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQorYWNwaV90Yl9nZXRfdGFibGVfYm9keShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2dldF90YWJsZV9ib2R5Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9nZXRfdGFibGVfYm9keSIpOwogCiAJaWYgKCF0YWJsZV9pbmZvIHx8ICFhZGRyZXNzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBBdHRlbXB0IHRhYmxlIG92ZXJyaWRlLiAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl90YWJsZV9vdmVycmlkZSAoaGVhZGVyLCB0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV90Yl90YWJsZV9vdmVycmlkZShoZWFkZXIsIHRhYmxlX2luZm8pOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkvKiBUYWJsZSB3YXMgb3ZlcnJpZGRlbiBieSB0aGUgaG9zdCBPUyAqLwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogTm8gb3ZlcnJpZGUsIGdldCB0aGUgb3JpZ2luYWwgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RoaXNfdGFibGUgKGFkZHJlc3MsIGhlYWRlciwgdGFibGVfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RoaXNfdGFibGUoYWRkcmVzcywgaGVhZGVyLCB0YWJsZV9pbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3RhYmxlX292ZXJyaWRlCkBAIC0yNTUsNjEgKzIzNSw1NyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX3RhYmxlX292ZXJyaWRlICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfdGJfdGFibGVfb3ZlcnJpZGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKm5ld190YWJsZTsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgIGFkZHJlc3M7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpuZXdfdGFibGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BvaW50ZXIgYWRkcmVzczsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX3RhYmxlX292ZXJyaWRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl90YWJsZV9vdmVycmlkZSIpOwogCiAJLyoKIAkgKiBUaGUgT1NMIHdpbGwgZXhhbWluZSB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hldGhlciB0byBvdmVycmlkZSB0aGlzCiAJICogdGFibGUuICBJZiBpdCBkZWNpZGVzIHRvIG92ZXJyaWRlLCBhIHRhYmxlIHdpbGwgYmUgcmV0dXJuZWQgaW4gbmV3X3RhYmxlLAogCSAqIHdoaWNoIHdlIHdpbGwgdGhlbiBjb3B5LgogCSAqLwotCXN0YXR1cyA9IGFjcGlfb3NfdGFibGVfb3ZlcnJpZGUgKGhlYWRlciwgJm5ld190YWJsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfb3NfdGFibGVfb3ZlcnJpZGUoaGVhZGVyLCAmbmV3X3RhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJLyogU29tZSBzZXZlcmUgZXJyb3IgZnJvbSB0aGUgT1NMLCBidXQgd2UgYmFzaWNhbGx5IGlnbm9yZSBpdCAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBvdmVycmlkZSBBQ1BJIHRhYmxlLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IG92ZXJyaWRlIEFDUEkgdGFibGUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCWlmICghbmV3X3RhYmxlKSB7CiAJCS8qIE5vIHRhYmxlIG92ZXJyaWRlICovCiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCiAJLyoKIAkgKiBXZSBoYXZlIGEgbmV3IHRhYmxlIHRvIG92ZXJyaWRlIHRoZSBvbGQgb25lLiAgR2V0IGEgY29weSBvZgogCSAqIHRoZSBuZXcgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBuZXcgdGFibGUgaGFzIGEgbG9naWNhbCBwb2ludGVyLgogCSAqLwotCWFkZHJlc3MucG9pbnRlcl90eXBlICAgID0gQUNQSV9MT0dJQ0FMX1BPSU5URVIgfCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORzsKKwlhZGRyZXNzLnBvaW50ZXJfdHlwZSA9IEFDUElfTE9HSUNBTF9QT0lOVEVSIHwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkc7CiAJYWRkcmVzcy5wb2ludGVyLmxvZ2ljYWwgPSBuZXdfdGFibGU7CiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90aGlzX3RhYmxlICgmYWRkcmVzcywgbmV3X3RhYmxlLCB0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBjb3B5IG92ZXJyaWRlIEFDUEkgdGFibGUsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90aGlzX3RhYmxlKCZhZGRyZXNzLCBuZXdfdGFibGUsIHRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBjb3B5IG92ZXJyaWRlIEFDUEkgdGFibGUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENvcHkgdGhlIHRhYmxlIGluZm8gKi8KIAotCUFDUElfUkVQT1JUX0lORk8gKCgiVGFibGUgWyU0LjRzXSByZXBsYWNlZCBieSBob3N0IE9TXG4iLAotCQl0YWJsZV9pbmZvLT5wb2ludGVyLT5zaWduYXR1cmUpKTsKKwlBQ1BJX1JFUE9SVF9JTkZPKCgiVGFibGUgWyU0LjRzXSByZXBsYWNlZCBieSBob3N0IE9TXG4iLAorCQkJICB0YWJsZV9pbmZvLT5wb2ludGVyLT5zaWduYXR1cmUpKTsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfdGhpc190YWJsZQpAQCAtMzI5LDE4ICszMDUsMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGhpc190YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfdGJfZ2V0X3RoaXNfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpmdWxsX3RhYmxlID0gTlVMTDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb247Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmZ1bGxfdGFibGUgPSBOVUxMOworCXU4IGFsbG9jYXRpb247CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfdGhpc190YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3RoaXNfdGFibGUiKTsKIAogCS8qCiAJICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwKQEAgLTM1MiwzOCArMzI1LDMzIEBACiAKIAkJLyogUG9pbnRlciBtYXRjaGVzIHByb2Nlc3NvciBtb2RlLCBjb3B5IHRoZSB0YWJsZSB0byBhIG5ldyBidWZmZXIgKi8KIAotCQlmdWxsX3RhYmxlID0gQUNQSV9NRU1fQUxMT0NBVEUgKGhlYWRlci0+bGVuZ3RoKTsKKwkJZnVsbF90YWJsZSA9IEFDUElfTUVNX0FMTE9DQVRFKGhlYWRlci0+bGVuZ3RoKTsKIAkJaWYgKCFmdWxsX3RhYmxlKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgdGFibGUgbWVtb3J5IGZvciBbJTQuNHNdIGxlbmd0aCAlWFxuIiwKLQkJCQloZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5sZW5ndGgpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGFsbG9jYXRlIHRhYmxlIG1lbW9yeSBmb3IgWyU0LjRzXSBsZW5ndGggJVhcbiIsIGhlYWRlci0+c2lnbmF0dXJlLCBoZWFkZXItPmxlbmd0aCkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAogCQkvKiBDb3B5IHRoZSBlbnRpcmUgdGFibGUgKGluY2x1ZGluZyBoZWFkZXIpIHRvIHRoZSBsb2NhbCBidWZmZXIgKi8KIAotCQlBQ1BJX01FTUNQWSAoZnVsbF90YWJsZSwgYWRkcmVzcy0+cG9pbnRlci5sb2dpY2FsLCBoZWFkZXItPmxlbmd0aCk7CisJCUFDUElfTUVNQ1BZKGZ1bGxfdGFibGUsIGFkZHJlc3MtPnBvaW50ZXIubG9naWNhbCwKKwkJCSAgICBoZWFkZXItPmxlbmd0aCk7CiAKIAkJLyogU2F2ZSBhbGxvY2F0aW9uIHR5cGUgKi8KIAogCQlhbGxvY2F0aW9uID0gQUNQSV9NRU1fQUxMT0NBVEVEOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX0xPR01PREVfUEhZU1BUUjoKIAogCQkvKgogCQkgKiBKdXN0IG1hcCB0aGUgdGFibGUncyBwaHlzaWNhbCBtZW1vcnkKIAkJICogaW50byBvdXIgYWRkcmVzcyBzcGFjZS4KIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKLQkJCQkgKGFjcGlfc2l6ZSkgaGVhZGVyLT5sZW5ndGgsICh2b2lkICopICZmdWxsX3RhYmxlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgZm9yIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLAotCQkJCWhlYWRlci0+c2lnbmF0dXJlLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCksCi0JCQkJaGVhZGVyLT5sZW5ndGgpKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCisJCQkJCSAgICAoYWNwaV9zaXplKSBoZWFkZXItPmxlbmd0aCwKKwkJCQkJICAgICh2b2lkICopJmZ1bGxfdGFibGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IG1hcCBtZW1vcnkgZm9yIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYXG4iLCBoZWFkZXItPnNpZ25hdHVyZSwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLCBoZWFkZXItPmxlbmd0aCkpOwogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKQEAgLTM5MiwxMiArMzYwLDExIEBACiAJCWFsbG9jYXRpb24gPSBBQ1BJX01FTV9NQVBQRUQ7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhZGRyZXNzIGZsYWdzICVYXG4iLAotCQkJYWRkcmVzcy0+cG9pbnRlcl90eXBlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFkZHJlc3MgZmxhZ3MgJVhcbiIsCisJCQkJICBhZGRyZXNzLT5wb2ludGVyX3R5cGUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qCkBAIC00MDUsMTAgKzM3MiwxMCBAQAogCSAqIGV2ZW4gdGhlIG9uZXMgd2hvc2Ugc2lnbmF0dXJlIHdlIGRvbid0IHJlY29nbml6ZQogCSAqLwogCWlmICh0YWJsZV9pbmZvLT50eXBlICE9IEFDUElfVEFCTEVfRkFDUykgewotCQlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSAoZnVsbF90YWJsZSk7CisJCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKGZ1bGxfdGFibGUpOwogCiAjaWYgKCFBQ1BJX0NIRUNLU1VNX0FCT1JUKQotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJLyogSWdub3JlIHRoZSBlcnJvciBpZiBjb25maWd1cmF0aW9uIHNheXMgc28gKi8KIAogCQkJc3RhdHVzID0gQUVfT0s7CkBAIC00MTgsMTkgKzM4NSwxOSBAQAogCiAJLyogUmV0dXJuIHZhbHVlcyAqLwogCi0JdGFibGVfaW5mby0+cG9pbnRlciAgICAgPSBmdWxsX3RhYmxlOwotCXRhYmxlX2luZm8tPmxlbmd0aCAgICAgID0gKGFjcGlfc2l6ZSkgaGVhZGVyLT5sZW5ndGg7Ci0JdGFibGVfaW5mby0+YWxsb2NhdGlvbiAgPSBhbGxvY2F0aW9uOworCXRhYmxlX2luZm8tPnBvaW50ZXIgPSBmdWxsX3RhYmxlOworCXRhYmxlX2luZm8tPmxlbmd0aCA9IChhY3BpX3NpemUpIGhlYWRlci0+bGVuZ3RoOworCXRhYmxlX2luZm8tPmFsbG9jYXRpb24gPSBhbGxvY2F0aW9uOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIkZvdW5kIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCwgbWFwcGVkL2NvcGllZCB0byAlcFxuIiwKLQkJZnVsbF90YWJsZS0+c2lnbmF0dXJlLAotCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLCBmdWxsX3RhYmxlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRm91bmQgdGFibGUgWyU0LjRzXSBhdCAlOC44WCU4LjhYLCBtYXBwZWQvY29waWVkIHRvICVwXG4iLAorCQkJICBmdWxsX3RhYmxlLT5zaWduYXR1cmUsCisJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsKSwKKwkJCSAgZnVsbF90YWJsZSkpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3RhYmxlX3B0cgpAQCAtNDQ3LDI0ICs0MTQsMjAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9wdHIgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZV9wdHJfbG9jKQorYWNwaV90Yl9nZXRfdGFibGVfcHRyKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAorCQkgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKnRhYmxlX3B0cl9sb2MpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2dldF90YWJsZV9wdHIiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZV9wdHIiKTsKIAogCWlmICghYWNwaV9nYmxfRFNEVCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKIAlpZiAodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgpAQCAtNDc2LDE1ICs0MzksMTYgQEAKIAogCQkqdGFibGVfcHRyX2xvYyA9IE5VTEw7CiAJCWlmIChhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0KSB7Ci0JCQkqdGFibGVfcHRyX2xvYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLm5leHQtPnBvaW50ZXI7CisJCQkqdGFibGVfcHRyX2xvYyA9CisJCQkgICAgYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dC0+cG9pbnRlcjsKIAkJfQotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgaW5zdGFuY2Ugb3V0IG9mIHJhbmdlICovCiAKIAlpZiAoaW5zdGFuY2UgPiBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5jb3VudCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAogCS8qIFdhbGsgdGhlIGxpc3QgdG8gZ2V0IHRoZSBkZXNpcmVkIHRhYmxlCkBAIC01MDMsNiArNDY3LDUgQEAKIAogCSp0YWJsZV9wdHJfbG9jID0gdGFibGVfZGVzYy0+cG9pbnRlcjsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYwppbmRleCBlZWE1YjhjLi44ZDcyMzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCkBAIC00MSwyNyArNDEsMjEgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YmdldGFsbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJ0YmdldGFsbCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAorCQkJICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQorYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCQkgICAgYWNwaV9zdHJpbmcgc2lnbmF0dXJlLAorCQkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc3LDU4ICs3MSw1NCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pCithY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCQkgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICBoZWFkZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfcHJpbWFyeV90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3ByaW1hcnlfdGFibGUiKTsKIAogCS8qIElnbm9yZSBhIE5VTEwgYWRkcmVzcyBpbiB0aGUgUlNEVCAqLwogCiAJaWYgKCFhZGRyZXNzLT5wb2ludGVyLnZhbHVlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEdldCB0aGUgaGVhZGVyIGluIG9yZGVyIHRvIGdldCBzaWduYXR1cmUgYW5kIHRhYmxlIHNpemUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlciAoYWRkcmVzcywgJmhlYWRlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyKGFkZHJlc3MsICZoZWFkZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDbGVhciB0aGUgdGFibGVfaW5mbyAqLwogCi0JQUNQSV9NRU1TRVQgKHRhYmxlX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCUFDUElfTUVNU0VUKHRhYmxlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CiAKIAkvKgogCSAqIENoZWNrIHRoZSB0YWJsZSBzaWduYXR1cmUgYW5kIG1ha2Ugc3VyZSBpdCBpcyByZWNvZ25pemVkLgogCSAqIEFsc28gY2hlY2tzIHRoZSBoZWFkZXIgY2hlY2tzdW0KIAkgKi8KIAl0YWJsZV9pbmZvLT5wb2ludGVyID0gJmhlYWRlcjsKLQlzdGF0dXMgPSBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSAodGFibGVfaW5mbywgQUNQSV9UQUJMRV9QUklNQVJZKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSh0YWJsZV9pbmZvLCBBQ1BJX1RBQkxFX1BSSU1BUlkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgdGhlIGVudGlyZSB0YWJsZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keSAoYWRkcmVzcywgJmhlYWRlciwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keShhZGRyZXNzLCAmaGVhZGVyLCB0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSAodGFibGVfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSh0YWJsZV9pbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUKQEAgLTE0MywzMiArMTMzLDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQorYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCQkgICAgYWNwaV9zdHJpbmcgc2lnbmF0dXJlLAorCQkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICBoZWFkZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgidGJfZ2V0X3NlY29uZGFyeV90YWJsZSIsIHNpZ25hdHVyZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigidGJfZ2V0X3NlY29uZGFyeV90YWJsZSIsIHNpZ25hdHVyZSk7CiAKIAkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBtYXRjaCB0aGUgc2lnbmF0dXJlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKGFkZHJlc3MsICZoZWFkZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2hlYWRlcihhZGRyZXNzLCAmaGVhZGVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogU2lnbmF0dXJlIG11c3QgbWF0Y2ggcmVxdWVzdCAqLwogCi0JaWYgKEFDUElfU1RSTkNNUCAoaGVhZGVyLnNpZ25hdHVyZSwgc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJJbmNvcnJlY3QgdGFibGUgc2lnbmF0dXJlIC0gd2FudGVkIFslc10gZm91bmQgWyU0LjRzXVxuIiwKLQkJCXNpZ25hdHVyZSwgaGVhZGVyLnNpZ25hdHVyZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9TSUdOQVRVUkUpOworCWlmIChBQ1BJX1NUUk5DTVAoaGVhZGVyLnNpZ25hdHVyZSwgc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbmNvcnJlY3QgdGFibGUgc2lnbmF0dXJlIC0gd2FudGVkIFslc10gZm91bmQgWyU0LjRzXVxuIiwgc2lnbmF0dXJlLCBoZWFkZXIuc2lnbmF0dXJlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfU0lHTkFUVVJFKTsKIAl9CiAKIAkvKgpAQCAtMTc2LDI1ICsxNjEsMjQgQEAKIAkgKiBBbHNvIGNoZWNrcyB0aGUgaGVhZGVyIGNoZWNrc3VtCiAJICovCiAJdGFibGVfaW5mby0+cG9pbnRlciA9ICZoZWFkZXI7Ci0Jc3RhdHVzID0gYWNwaV90Yl9yZWNvZ25pemVfdGFibGUgKHRhYmxlX2luZm8sIEFDUElfVEFCTEVfU0VDT05EQVJZKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSh0YWJsZV9pbmZvLCBBQ1BJX1RBQkxFX1NFQ09OREFSWSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEdldCB0aGUgZW50aXJlIHRhYmxlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5IChhZGRyZXNzLCAmaGVhZGVyLCB0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5KGFkZHJlc3MsICZoZWFkZXIsIHRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbnN0YWxsIHRoZSB0YWJsZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlICh0YWJsZV9pbmZvKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlKHRhYmxlX2luZm8pOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcwpAQCAtMjE0LDIzICsxOTgsMTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfcmVxdWlyZWRfdGFibGVzICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV90Yl9nZXRfcmVxdWlyZWRfdGFibGVzKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICB0YWJsZV9pbmZvOwotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgaTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87CisJc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2dldF9yZXF1aXJlZF90YWJsZXMiKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIlZCBBQ1BJIHRhYmxlcyBpbiBSU0RUXG4iLAorCQkJICBhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50KSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiJWQgQUNQSSB0YWJsZXMgaW4gUlNEVFxuIiwKLQkJYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCkpOwotCi0KLQlhZGRyZXNzLnBvaW50ZXJfdHlwZSAgPSBhY3BpX2dibF90YWJsZV9mbGFncyB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOworCWFkZHJlc3MucG9pbnRlcl90eXBlID0gYWNwaV9nYmxfdGFibGVfZmxhZ3MgfCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORzsKIAogCS8qCiAJICogTG9vcCB0aHJvdWdoIGFsbCB0YWJsZSBwb2ludGVycyBmb3VuZCBpbiBSU0RULgpAQCAtMjQzLDg0ICsyMjMsNzkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsgaSsrKSB7CiAJCS8qIEdldCB0aGUgdGFibGUgYWRkcmVzcyBmcm9tIHRoZSBjb21tb24gaW50ZXJuYWwgWFNEVCAqLwogCi0JCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9Ci0JCQkJICBhY3BpX2dibF9YU0RULT50YWJsZV9vZmZzZXRfZW50cnlbaV07CisJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX1hTRFQtPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKIAogCQkvKgogCQkgKiBHZXQgdGhlIHRhYmxlcyBuZWVkZWQgYnkgdGhpcyBzdWJzeXN0ZW0gKEZBRFQgYW5kIGFueSBTU0RUcykuCiAJCSAqIE5PVEU6IEFsbCBvdGhlciB0YWJsZXMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCBhdCB0aGlzIHRpbWUuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgmYWRkcmVzcywgJnRhYmxlX2luZm8pOworCQlzdGF0dXMgPSBhY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlKCZhZGRyZXNzLCAmdGFibGVfaW5mbyk7CiAJCWlmICgoc3RhdHVzICE9IEFFX09LKSAmJiAoc3RhdHVzICE9IEFFX1RBQkxFX05PVF9TVVBQT1JURUQpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIiVzLCB3aGlsZSBnZXR0aW5nIHRhYmxlIGF0ICU4LjhYJTguOFhcbiIsCi0JCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAotCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOworCQkJQUNQSV9SRVBPUlRfV0FSTklORygoIiVzLCB3aGlsZSBnZXR0aW5nIHRhYmxlIGF0ICU4LjhYJTguOFhcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOwogCQl9CiAJfQogCiAJLyogV2UgbXVzdCBoYXZlIGEgRkFEVCB0byBjb250aW51ZSAqLwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk5vIEZBRFQgcHJlc2VudCBpbiBSU0RUL1hTRFRcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gRkFEVCBwcmVzZW50IGluIFJTRFQvWFNEVFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAogCS8qCiAJICogQ29udmVydCB0aGUgRkFEVCB0byBhIGNvbW1vbiBmb3JtYXQuICBUaGlzIGFsbG93cyBlYXJsaWVyIHJldmlzaW9ucyBvZgogCSAqIHRoZSB0YWJsZSB0byBjb2V4aXN0IHdpdGggbmV3ZXIgdmVyc2lvbnMsIHVzaW5nIGNvbW1vbiBhY2Nlc3MgY29kZS4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiQ291bGQgbm90IGNvbnZlcnQgRkFEVCB0byBpbnRlcm5hbCBjb21tb24gZm9ybWF0XG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBjb252ZXJ0IEZBRFQgdG8gaW50ZXJuYWwgY29tbW9uIGZvcm1hdFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQgdGhlIEZBQ1MgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpICovCiAKIAlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9GQURULT54ZmlybXdhcmVfY3RybDsKIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoJmFkZHJlc3MsIEZBQ1NfU0lHLCAmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgZ2V0L2luc3RhbGwgdGhlIEZBQ1MsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUoJmFkZHJlc3MsIEZBQ1NfU0lHLCAmdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGdldC9pbnN0YWxsIHRoZSBGQUNTLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgogCSAqIENyZWF0ZSB0aGUgY29tbW9uIEZBQ1MgcG9pbnRlciB0YWJsZQogCSAqIChDb250YWlucyBwb2ludGVycyB0byB0aGUgb3JpZ2luYWwgdGFibGUpCiAJICovCi0Jc3RhdHVzID0gYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcyAoJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MoJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBHZXQvaW5zdGFsbCB0aGUgRFNEVCAoUG9pbnRlZCB0byBieSB0aGUgRkFEVCkgKi8KIAogCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX0ZBRFQtPlhkc2R0OwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgmYWRkcmVzcywgRFNEVF9TSUcsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBnZXQvaW5zdGFsbCB0aGUgRFNEVFxuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlKCZhZGRyZXNzLCBEU0RUX1NJRywgJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBnZXQvaW5zdGFsbCB0aGUgRFNEVFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTZXQgSW50ZWdlciBXaWR0aCAoMzIvNjQpIGJhc2VkIHVwb24gRFNEVCByZXZpc2lvbiAqLwogCi0JYWNwaV91dF9zZXRfaW50ZWdlcl93aWR0aCAoYWNwaV9nYmxfRFNEVC0+cmV2aXNpb24pOworCWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgoYWNwaV9nYmxfRFNEVC0+cmV2aXNpb24pOwogCiAJLyogRHVtcCB0aGUgZW50aXJlIERTRFQgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywKLQkJIkhleCBkdW1wIG9mIGVudGlyZSBEU0RULCBzaXplICVkICgweCVYKSwgSW50ZWdlciB3aWR0aCA9ICVkXG4iLAotCQlhY3BpX2dibF9EU0RULT5sZW5ndGgsIGFjcGlfZ2JsX0RTRFQtPmxlbmd0aCwgYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpKTsKLQlBQ1BJX0RVTVBfQlVGRkVSICgodTggKikgYWNwaV9nYmxfRFNEVCwgYWNwaV9nYmxfRFNEVC0+bGVuZ3RoKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCSAgIkhleCBkdW1wIG9mIGVudGlyZSBEU0RULCBzaXplICVkICgweCVYKSwgSW50ZWdlciB3aWR0aCA9ICVkXG4iLAorCQkJICBhY3BpX2dibF9EU0RULT5sZW5ndGgsIGFjcGlfZ2JsX0RTRFQtPmxlbmd0aCwKKwkJCSAgYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpKTsKKwlBQ1BJX0RVTVBfQlVGRkVSKCh1OCAqKSBhY3BpX2dibF9EU0RULCBhY3BpX2dibF9EU0RULT5sZW5ndGgpOwogCiAJLyogQWx3YXlzIGRlbGV0ZSB0aGUgUlNEUCBtYXBwaW5nLCB3ZSBhcmUgZG9uZSB3aXRoIGl0ICovCiAKLQlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSAoQUNQSV9UQUJMRV9SU0RQKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUoQUNQSV9UQUJMRV9SU0RQKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKaW5kZXggNjI5YjY0Yy4uMTBkYjg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYwpAQCAtNDEsMjIgKzQxLDE2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJpbnN0YWwiKQorQUNQSV9NT0RVTEVfTkFNRSgidGJpbnN0YWwiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3R5cGUpOwotCithY3BpX3RiX21hdGNoX3NpZ25hdHVyZShjaGFyICpzaWduYXR1cmUsCisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvLCB1OCBzZWFyY2hfdHlwZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzQsMTYgKzY4LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKQorYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUoY2hhciAqc2lnbmF0dXJlLAorCQkJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTggc2VhcmNoX3R5cGUpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX21hdGNoX3NpZ25hdHVyZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfbWF0Y2hfc2lnbmF0dXJlIik7CiAKIAkvKiBTZWFyY2ggZm9yIGEgc2lnbmF0dXJlIG1hdGNoIGFtb25nIHRoZSBrbm93biB0YWJsZSB0eXBlcyAqLwogCkBAIC05MiwzMCArODIsMzAgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKCFBQ1BJX1NUUk5DTVAgKHNpZ25hdHVyZSwgYWNwaV9nYmxfdGFibGVfZGF0YVtpXS5zaWduYXR1cmUsCi0JCQkJICAgYWNwaV9nYmxfdGFibGVfZGF0YVtpXS5zaWdfbGVuZ3RoKSkgeworCQlpZiAoIUFDUElfU1RSTkNNUChzaWduYXR1cmUsIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnbmF0dXJlLAorCQkJCSAgYWNwaV9nYmxfdGFibGVfZGF0YVtpXS5zaWdfbGVuZ3RoKSkgewogCQkJLyogRm91bmQgYSBzaWduYXR1cmUgbWF0Y2gsIHJldHVybiBpbmRleCBpZiByZXF1ZXN0ZWQgKi8KIAogCQkJaWYgKHRhYmxlX2luZm8pIHsKIAkJCQl0YWJsZV9pbmZvLT50eXBlID0gKHU4KSBpOwogCQkJfQogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJCSJUYWJsZSBbJTQuNHNdIGlzIGFuIEFDUEkgdGFibGUgY29uc3VtZWQgYnkgdGhlIGNvcmUgc3Vic3lzdGVtXG4iLAotCQkJCShjaGFyICopIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnbmF0dXJlKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIlRhYmxlIFslNC40c10gaXMgYW4gQUNQSSB0YWJsZSBjb25zdW1lZCBieSB0aGUgY29yZSBzdWJzeXN0ZW1cbiIsCisJCQkJCSAgKGNoYXIgKilhY3BpX2dibF90YWJsZV9kYXRhW2ldLgorCQkJCQkgIHNpZ25hdHVyZSkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiVGFibGUgWyU0LjRzXSBpcyBub3QgYW4gQUNQSSB0YWJsZSBjb25zdW1lZCBieSB0aGUgY29yZSBzdWJzeXN0ZW0gLSBpZ25vcmVkXG4iLAotCQkoY2hhciAqKSBzaWduYXR1cmUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJUYWJsZSBbJTQuNHNdIGlzIG5vdCBhbiBBQ1BJIHRhYmxlIGNvbnN1bWVkIGJ5IHRoZSBjb3JlIHN1YnN5c3RlbSAtIGlnbm9yZWRcbiIsCisJCQkgIChjaGFyICopc2lnbmF0dXJlKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RBQkxFX05PVF9TVVBQT1JURUQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UQUJMRV9OT1RfU1VQUE9SVEVEKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luc3RhbGxfdGFibGUKQEAgLTEyNCw0NiArMTE0LDUyIEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBMb2FkIGFuZCB2YWxpZGF0ZSBhbGwgdGFibGVzIG90aGVyIHRoYW4gdGhlIFJTRFQuICBUaGUgUlNEVCBtdXN0Ci0gKiAgICAgICAgICAgICAgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHZhbGlkYXRlZC4KLSAqICAgICAgICAgICAgICBJbnN0YWxsIHRoZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3RzLgorICogREVTQ1JJUFRJT046IEluc3RhbGwgdGhlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfaW5zdGFsbF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfdGJfaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9pbnN0YWxsX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9pbnN0YWxsX3RhYmxlIik7CiAKIAkvKiBMb2NrIHRhYmxlcyB3aGlsZSBpbnN0YWxsaW5nICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX1RBQkxFUyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgYWNxdWlyZSB0YWJsZSBtdXRleCBmb3IgWyU0LjRzXSwgJXNcbiIsCi0JCQl0YWJsZV9pbmZvLT5wb2ludGVyLT5zaWduYXR1cmUsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGFjcXVpcmUgdGFibGUgbXV0ZXgsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogSWdub3JlIGEgdGFibGUgdGhhdCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRm9yIGV4YW1wbGUsIHNvbWUgQklPUworCSAqIEFTTCBjb2RlIHdpbGwgcmVwZWF0ZWRseSBhdHRlbXB0IHRvIGxvYWQgdGhlIHNhbWUgU1NEVC4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3RiX2lzX3RhYmxlX2luc3RhbGxlZCh0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvciAodGFibGVfaW5mby0+dHlwZSwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgaW5zdGFsbCBBQ1BJIHRhYmxlIFslNC40c10sICVzXG4iLAotCQkJdGFibGVfaW5mby0+cG9pbnRlci0+c2lnbmF0dXJlLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcih0YWJsZV9pbmZvLT50eXBlLCB0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgaW5zdGFsbCB0YWJsZSBbJTQuNHNdLCAlc1xuIiwKKwkJCQkgICB0YWJsZV9pbmZvLT5wb2ludGVyLT5zaWduYXR1cmUsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiJXMgbG9jYXRlZCBhdCAlcFxuIiwKLQkJYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV9pbmZvLT50eXBlXS5uYW1lLCB0YWJsZV9pbmZvLT5wb2ludGVyKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiJXMgbG9jYXRlZCBhdCAlcFxuIiwKKwkJCSAgYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV9pbmZvLT50eXBlXS5uYW1lLAorCQkJICB0YWJsZV9pbmZvLT5wb2ludGVyKSk7CiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9UQUJMRVMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3JlY29nbml6ZV90YWJsZQpAQCAtMTg2LDIyICsxODIsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX3JlY29nbml6ZV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKQorYWNwaV90Yl9yZWNvZ25pemVfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTggc2VhcmNoX3R5cGUpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX3JlY29nbml6ZV90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfcmVjb2duaXplX3RhYmxlIik7CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgdGFibGUgcG9pbnRlciAqLwogCi0JdGFibGVfaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKSB0YWJsZV9pbmZvLT5wb2ludGVyOworCXRhYmxlX2hlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKil0YWJsZV9pbmZvLT5wb2ludGVyOwogCWlmICghdGFibGVfaGVhZGVyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgpAQCAtMjEyLDI1ICsyMDQsMjQgQEAKIAkgKiBUaGlzIGNhbiBiZSBhbnkgb25lIG9mIG1hbnkgdmFsaWQgQUNQSSB0YWJsZXMsIGl0IGp1c3QgaXNuJ3Qgb25lIG9mCiAJICogdGhlIHRhYmxlcyB0aGF0IGlzIGNvbnN1bWVkIGJ5IHRoZSBjb3JlIHN1YnN5c3RlbQogCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwKLQkJCSB0YWJsZV9pbmZvLCBzZWFyY2hfdHlwZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUodGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCisJCQkJCSB0YWJsZV9pbmZvLCBzZWFyY2hfdHlwZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyICh0YWJsZV9oZWFkZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyKHRhYmxlX2hlYWRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFJldHVybiB0aGUgdGFibGUgdHlwZSBhbmQgbGVuZ3RoIHZpYSB0aGUgaW5mbyBzdHJ1Y3QgKi8KIAogCXRhYmxlX2luZm8tPmxlbmd0aCA9IChhY3BpX3NpemUpIHRhYmxlX2hlYWRlci0+bGVuZ3RoOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yCkBAIC0yNDUsMjIgKzIzNiwyNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKK2FjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAorCQkJICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9saXN0ICAgICAgICAgICpsaXN0X2hlYWQ7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9saXN0ICpsaXN0X2hlYWQ7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgidGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yIiwgdGFibGVfdHlwZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yIiwgdGFibGVfdHlwZSk7CiAKIAkvKiBBbGxvY2F0ZSBhIGRlc2NyaXB0b3IgZm9yIHRoaXMgdGFibGUgKi8KIAotCXRhYmxlX2Rlc2MgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCXRhYmxlX2Rlc2MgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKIAlpZiAoIXRhYmxlX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwkvKiBHZXQgYSBuZXcgb3duZXIgSUQgZm9yIHRoZSB0YWJsZSAqLworCisJc3RhdHVzID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCgmdGFibGVfZGVzYy0+b3duZXJfaWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJbnN0YWxsIHRoZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgKi8KQEAgLTI3MiwxNCArMjY4LDE0IEBACiAJICogaW5jbHVkZXMgbW9zdCBBQ1BJIHRhYmxlcyBzdWNoIGFzIHRoZSBEU0RULiAgMikgTXVsdGlwbGUgaW5zdGFuY2VzIG9mCiAJICogdGhlIHRhYmxlIGFyZSBhbGxvd2VkLiAgVGhpcyBpbmNsdWRlcyBTU0RUIGFuZCBQU0RUcy4KIAkgKi8KLQlpZiAoQUNQSV9JU19TSU5HTEVfVEFCTEUgKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfdHlwZV0uZmxhZ3MpKSB7CisJaWYgKEFDUElfSVNfU0lOR0xFX1RBQkxFKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfdHlwZV0uZmxhZ3MpKSB7CiAJCS8qCiAJCSAqIE9ubHkgb25lIHRhYmxlIGFsbG93ZWQsIGFuZCBhIHRhYmxlIGhhcyBhbHJlYWQgYmVlbiBpbnN0YWxsZWQKIAkJICogYXQgdGhpcyBsb2NhdGlvbiwgc28gcmV0dXJuIGFuIGVycm9yLgogCQkgKi8KIAkJaWYgKGxpc3RfaGVhZC0+bmV4dCkgewotCQkJQUNQSV9NRU1fRlJFRSAodGFibGVfZGVzYyk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FMUkVBRFlfRVhJU1RTKTsKKwkJCUFDUElfTUVNX0ZSRUUodGFibGVfZGVzYyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOwogCQl9CiAKIAkJdGFibGVfZGVzYy0+bmV4dCA9IGxpc3RfaGVhZC0+bmV4dDsKQEAgLTI5MCw4ICsyODYsNyBAQAogCQl9CiAKIAkJbGlzdF9oZWFkLT5jb3VudCsrOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBMaW5rIHRoZSBuZXcgdGFibGUgaW4gdG8gdGhlIGxpc3Qgb2YgdGFibGVzIG9mIHRoaXMgdHlwZS4KIAkJICogSW5zZXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIG9yZGVyIElTIElNUE9SVEFOVC4KQEAgLTMwMiw4ICsyOTcsNyBAQAogCiAJCWlmICghbGlzdF9oZWFkLT5uZXh0KSB7CiAJCQlsaXN0X2hlYWQtPm5leHQgPSB0YWJsZV9kZXNjOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJdGFibGVfZGVzYy0+bmV4dCA9IGxpc3RfaGVhZC0+bmV4dDsKIAogCQkJd2hpbGUgKHRhYmxlX2Rlc2MtPm5leHQtPm5leHQpIHsKQEAgLTMxOCwxNSArMzEyLDE0IEBACiAKIAkvKiBGaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlIGRlc2NyaXB0b3IgKi8KIAotCXRhYmxlX2Rlc2MtPnR5cGUgICAgICAgICAgICAgICAgPSAodTgpIHRhYmxlX3R5cGU7Ci0JdGFibGVfZGVzYy0+cG9pbnRlciAgICAgICAgICAgICA9IHRhYmxlX2luZm8tPnBvaW50ZXI7Ci0JdGFibGVfZGVzYy0+bGVuZ3RoICAgICAgICAgICAgICA9IHRhYmxlX2luZm8tPmxlbmd0aDsKLQl0YWJsZV9kZXNjLT5hbGxvY2F0aW9uICAgICAgICAgID0gdGFibGVfaW5mby0+YWxsb2NhdGlvbjsKLQl0YWJsZV9kZXNjLT5hbWxfc3RhcnQgICAgICAgICAgID0gKHU4ICopICh0YWJsZV9kZXNjLT5wb2ludGVyICsgMSksCi0JdGFibGVfZGVzYy0+YW1sX2xlbmd0aCAgICAgICAgICA9ICh1MzIpICh0YWJsZV9kZXNjLT5sZW5ndGggLQotCQkJICh1MzIpIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JdGFibGVfZGVzYy0+dGFibGVfaWQgICAgICAgICAgICA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQgKAotCQkJIEFDUElfT1dORVJfVFlQRV9UQUJMRSk7CisJdGFibGVfZGVzYy0+dHlwZSA9ICh1OCkgdGFibGVfdHlwZTsKKwl0YWJsZV9kZXNjLT5wb2ludGVyID0gdGFibGVfaW5mby0+cG9pbnRlcjsKKwl0YWJsZV9kZXNjLT5sZW5ndGggPSB0YWJsZV9pbmZvLT5sZW5ndGg7CisJdGFibGVfZGVzYy0+YWxsb2NhdGlvbiA9IHRhYmxlX2luZm8tPmFsbG9jYXRpb247CisJdGFibGVfZGVzYy0+YW1sX3N0YXJ0ID0gKHU4ICopICh0YWJsZV9kZXNjLT5wb2ludGVyICsgMSksCisJICAgIHRhYmxlX2Rlc2MtPmFtbF9sZW5ndGggPSAodTMyKSAodGFibGVfZGVzYy0+bGVuZ3RoIC0KKwkJCQkJICAgICh1MzIpIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAl0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UgPSBGQUxTRTsKIAogCS8qCkBAIC0zMzQsMTggKzMyNywxOCBAQAogCSAqIG5ld2x5IGluc3RhbGxlZCB0YWJsZQogCSAqLwogCWlmIChhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmdsb2JhbF9wdHIpIHsKLQkJKihhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmdsb2JhbF9wdHIpID0gdGFibGVfaW5mby0+cG9pbnRlcjsKKwkJKihhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmdsb2JhbF9wdHIpID0KKwkJICAgIHRhYmxlX2luZm8tPnBvaW50ZXI7CiAJfQogCiAJLyogUmV0dXJuIERhdGEgKi8KIAotCXRhYmxlX2luZm8tPnRhYmxlX2lkICAgICAgICA9IHRhYmxlX2Rlc2MtPnRhYmxlX2lkOwotCXRhYmxlX2luZm8tPmluc3RhbGxlZF9kZXNjICA9IHRhYmxlX2Rlc2M7CisJdGFibGVfaW5mby0+b3duZXJfaWQgPSB0YWJsZV9kZXNjLT5vd25lcl9pZDsKKwl0YWJsZV9pbmZvLT5pbnN0YWxsZWRfZGVzYyA9IHRhYmxlX2Rlc2M7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMKQEAgLTM1OCwyMyArMzUxLDE5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV90Yl9kZWxldGVfYWxsX3RhYmxlcyh2b2lkKQogewotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdHlwZTsKLQorCWFjcGlfdGFibGVfdHlwZSB0eXBlOwogCiAJLyoKIAkgKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEFDUEkgdGFibGVzCiAJICogTWVtb3J5IGNhbiBlaXRoZXIgYmUgbWFwcGVkIG9yIGFsbG9jYXRlZAogCSAqLwogCWZvciAodHlwZSA9IDA7IHR5cGUgPCBOVU1fQUNQSV9UQUJMRV9UWVBFUzsgdHlwZSsrKSB7Ci0JCWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlICh0eXBlKTsKKwkJYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUodHlwZSk7CiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlCkBAIC0zODgsMjMgKzM3NywxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHR5cGUpCit2b2lkIGFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlKGFjcGlfdGFibGVfdHlwZSB0eXBlKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKKwl1MzIgY291bnQ7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgidGJfZGVsZXRlX3RhYmxlc19ieV90eXBlIiwgdHlwZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidGJfZGVsZXRlX3RhYmxlc19ieV90eXBlIiwgdHlwZSk7CiAKIAlpZiAodHlwZSA+IEFDUElfVEFCTEVfTUFYKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfVEFCTEVTKSkpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpKSkgewogCQlyZXR1cm47CiAJfQogCkBAIC00NDIsMjEgKzQyNywyMCBAQAogCSAqIDEpIEdldCB0aGUgaGVhZCBvZiB0aGUgbGlzdAogCSAqLwogCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0eXBlXS5uZXh0OwotCWNvdW50ICAgICA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3R5cGVdLmNvdW50OworCWNvdW50ID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdHlwZV0uY291bnQ7CiAKIAkvKgogCSAqIDIpIFdhbGsgdGhlIGVudGlyZSBsaXN0LCBkZWxldGluZyBib3RoIHRoZSBhbGxvY2F0ZWQgdGFibGVzCiAJICogICAgYW5kIHRoZSB0YWJsZSBkZXNjcmlwdG9ycwogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXRhYmxlX2Rlc2MgPSBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSAodGFibGVfZGVzYyk7CisJCXRhYmxlX2Rlc2MgPSBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9kZXNjKTsKIAl9CiAKLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9UQUJMRVMpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZQpAQCAtNDcwLDE1ICs0NTQsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MpCit2b2lkIGFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKQogewogCiAJLyogTXVzdCBoYXZlIGEgdmFsaWQgdGFibGUgZGVzY3JpcHRvciBhbmQgcG9pbnRlciAqLwogCi0JaWYgKCghdGFibGVfZGVzYykgfHwKLQkJICghdGFibGVfZGVzYy0+cG9pbnRlcikpIHsKKwlpZiAoKCF0YWJsZV9kZXNjKSB8fCAoIXRhYmxlX2Rlc2MtPnBvaW50ZXIpKSB7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ5MCwxMiArNDcxLDEyIEBACiAKIAljYXNlIEFDUElfTUVNX0FMTE9DQVRFRDoKIAotCQlBQ1BJX01FTV9GUkVFICh0YWJsZV9kZXNjLT5wb2ludGVyKTsKKwkJQUNQSV9NRU1fRlJFRSh0YWJsZV9kZXNjLT5wb2ludGVyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUVNX01BUFBFRDoKIAotCQlhY3BpX29zX3VubWFwX21lbW9yeSAodGFibGVfZGVzYy0+cG9pbnRlciwgdGFibGVfZGVzYy0+bGVuZ3RoKTsKKwkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfZGVzYy0+cG9pbnRlciwgdGFibGVfZGVzYy0+bGVuZ3RoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTAzLDcgKzQ4NCw2IEBACiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlCkBAIC01MTgsMjYgKzQ5OCwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKgotYWNwaV90Yl91bmluc3RhbGxfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MpCitzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICphY3BpX3RiX3VuaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjCisJCQkJCQkqdGFibGVfZGVzYykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICpuZXh0X2Rlc2M7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqbmV4dF9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInRiX3VuaW5zdGFsbF90YWJsZSIsIHRhYmxlX2Rlc2MpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInRiX3VuaW5zdGFsbF90YWJsZSIsIHRhYmxlX2Rlc2MpOwogCiAJaWYgKCF0YWJsZV9kZXNjKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIFVubGluayB0aGUgZGVzY3JpcHRvciBmcm9tIHRoZSBkb3VibHkgbGlua2VkIGxpc3QgKi8KIAogCWlmICh0YWJsZV9kZXNjLT5wcmV2KSB7CiAJCXRhYmxlX2Rlc2MtPnByZXYtPm5leHQgPSB0YWJsZV9kZXNjLT5uZXh0OwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBJcyBmaXJzdCBvbiBsaXN0LCB1cGRhdGUgbGlzdCBoZWFkICovCiAKIAkJYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfZGVzYy0+dHlwZV0ubmV4dCA9IHRhYmxlX2Rlc2MtPm5leHQ7CkBAIC01NDksMTYgKzUyNSwxNCBAQAogCiAJLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIHRhYmxlIGl0c2VsZiAqLwogCi0JYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlICh0YWJsZV9kZXNjKTsKKwlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUodGFibGVfZGVzYyk7CiAKIAkvKiBGcmVlIHRoZSB0YWJsZSBkZXNjcmlwdG9yICovCiAKIAluZXh0X2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OwotCUFDUElfTUVNX0ZSRUUgKHRhYmxlX2Rlc2MpOworCUFDUElfTUVNX0ZSRUUodGFibGVfZGVzYyk7CiAKIAkvKiBSZXR1cm4gcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yICovCiAKLQlyZXR1cm5fUFRSIChuZXh0X2Rlc2MpOworCXJldHVybl9QVFIobmV4dF9kZXNjKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwppbmRleCBiN2ZmZTM5Li5hZDAyNTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKQEAgLTQxLDE0ICs0MSwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRicnNkdCIpCi0KK0FDUElfTU9EVUxFX05BTUUoInRicnNkdCIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjEsMTggKzU4LDEzIEBACiAgKiBERVNDUklQVElPTjogTG9hZCBhbmQgdmFsaWRhdGUgdGhlIFJTRFAgKHB0cikgYW5kIFJTRFQgKHRhYmxlKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZlcmlmeV9yc2RwICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzKQorYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfcnNkcChzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgdGFibGVfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICAgICAgICAgICpyc2RwOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHJzZHBfZGVzY3JpcHRvciAqcnNkcDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX3ZlcmlmeV9yc2RwIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl92ZXJpZnlfcnNkcCIpOwogCiAJc3dpdGNoIChhZGRyZXNzLT5wb2ludGVyX3R5cGUpIHsKIAljYXNlIEFDUElfTE9HSUNBTF9QT0lOVEVSOgpAQCAtODQsNzMgKzc2LDUzIEBACiAJCS8qCiAJCSAqIE9idGFpbiBhY2Nlc3MgdG8gdGhlIFJTRFAgc3RydWN0dXJlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCi0JCQkJIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksCi0JCQkJCQkgICAodm9pZCAqKSAmcnNkcCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksCisJCQkJCSAgICAodm9pZCAqKSZyc2RwKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqICBUaGUgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdAotCSAqLwotCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIHJzZHAsIFJTRFBfU0lHLCBzaXplb2YgKFJTRFBfU0lHKS0xKSAhPSAwKSB7Ci0JCS8qIE5vcGUsIEJBRCBTaWduYXR1cmUgKi8KKwkvKiBWZXJpZnkgUlNEUCBzaWduYXR1cmUgYW5kIGNoZWNrc3VtICovCiAKLQkJc3RhdHVzID0gQUVfQkFEX1NJR05BVFVSRTsKKwlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAocnNkcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQkvKiBDaGVjayB0aGUgc3RhbmRhcmQgY2hlY2tzdW0gKi8KLQotCWlmIChhY3BpX3RiX2NoZWNrc3VtIChyc2RwLCBBQ1BJX1JTRFBfQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9DSEVDS1NVTTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIENoZWNrIGV4dGVuZGVkIGNoZWNrc3VtIGlmIHRhYmxlIHZlcnNpb24gPj0gMiAqLwotCi0JaWYgKHJzZHAtPnJldmlzaW9uID49IDIpIHsKLQkJaWYgKGFjcGlfdGJfY2hlY2tzdW0gKHJzZHAsIEFDUElfUlNEUF9YQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSB7Ci0JCQlzdGF0dXMgPSBBRV9CQURfQ0hFQ0tTVU07Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQl9Ci0KIAkvKiBUaGUgUlNEUCBzdXBwbGllZCBpcyBPSyAqLwogCi0JdGFibGVfaW5mby5wb2ludGVyICAgICA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgcnNkcCk7Ci0JdGFibGVfaW5mby5sZW5ndGggICAgICA9IHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7Ci0JdGFibGVfaW5mby5hbGxvY2F0aW9uICA9IEFDUElfTUVNX01BUFBFRDsKKwl0YWJsZV9pbmZvLnBvaW50ZXIgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgcnNkcCk7CisJdGFibGVfaW5mby5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7CisJdGFibGVfaW5mby5hbGxvY2F0aW9uID0gQUNQSV9NRU1fTUFQUEVEOwogCiAJLyogU2F2ZSB0aGUgdGFibGUgcG9pbnRlcnMgYW5kIGFsbG9jYXRpb24gaW5mbyAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IgKEFDUElfVEFCTEVfUlNEUCwgJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcihBQ1BJX1RBQkxFX1JTRFAsICZ0YWJsZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFNhdmUgdGhlIFJTRFAgaW4gYSBnbG9iYWwgZm9yIGVhc3kgYWNjZXNzICovCiAKLQlhY3BpX2dibF9SU0RQID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciwgdGFibGVfaW5mby5wb2ludGVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7Ci0KKwlhY3BpX2dibF9SU0RQID0KKwkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLCB0YWJsZV9pbmZvLnBvaW50ZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCiAJLyogRXJyb3IgZXhpdCAqLwotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAKIAlpZiAoYWNwaV9nYmxfdGFibGVfZmxhZ3MgJiBBQ1BJX1BIWVNJQ0FMX1BPSU5URVIpIHsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHJzZHAsIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvcikpOworCQlhY3BpX29zX3VubWFwX21lbW9yeShyc2RwLCBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvcikpOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzCkBAIC0xNTksMzUgKzEzMSwzNSBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lLCBBZGRyZXNzCiAgKgotICogREVTQ1JJUFRJT046IEV4dHJhY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIFJTRFQgb3IgWFNEVCwgZGVwZW5kaW5nIG9uIHRoZQotICogICAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIFJTRFAKKyAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBhZGRyZXNzIG9mIGVpdGhlciB0aGUgUlNEVCBvciBYU0RULCBkZXBlbmRpbmcgb24gdGhlCisgKiAgICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgUlNEUCBhbmQgd2hldGhlciB0aGUgWFNEVCBwb2ludGVyIGlzIHZhbGlkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICpvdXRfYWRkcmVzcykKK3ZvaWQgYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzKHN0cnVjdCBhY3BpX3BvaW50ZXIgKm91dF9hZGRyZXNzKQogewogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKKwlvdXRfYWRkcmVzcy0+cG9pbnRlcl90eXBlID0KKwkgICAgYWNwaV9nYmxfdGFibGVfZmxhZ3MgfCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORzsKIAotCW91dF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPSBhY3BpX2dibF90YWJsZV9mbGFncyB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOworCS8qIFVzZSBYU0RUIGlmIGl0IGlzIHByZXNlbnQgKi8KIAotCS8qCi0JICogRm9yIFJTRFAgcmV2aXNpb24gMCBvciAxLCB3ZSB1c2UgdGhlIFJTRFQuCi0JICogRm9yIFJTRFAgcmV2aXNpb24gMiAoYW5kIGFib3ZlKSwgd2UgdXNlIHRoZSBYU0RUCi0JICovCi0JaWYgKGFjcGlfZ2JsX1JTRFAtPnJldmlzaW9uIDwgMikgewotCQlvdXRfYWRkcmVzcy0+cG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX1JTRFAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzczsKLQl9Ci0JZWxzZSB7CisJaWYgKChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA+PSAyKSAmJgorCSAgICBhY3BpX2dibF9SU0RQLT54c2R0X3BoeXNpY2FsX2FkZHJlc3MpIHsKIAkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPQotCQkJYWNwaV9nYmxfUlNEUC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOworCQkgICAgYWNwaV9nYmxfUlNEUC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOworCQlhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPSBBQ1BJX1RBQkxFX1RZUEVfWFNEVDsKKwl9IGVsc2UgeworCQkvKiBObyBYU0RULCB1c2UgdGhlIFJTRFQgKi8KKworCQlvdXRfYWRkcmVzcy0+cG9pbnRlci52YWx1ZSA9CisJCSAgICBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3M7CisJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9IEFDUElfVEFCTEVfVFlQRV9SU0RUOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZhbGlkYXRlX3JzZHQKQEAgLTIwMCw1MCArMTcyLDQzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmFsaWRhdGVfcnNkdCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfcHRyKQorYWNwaV9zdGF0dXMgYWNwaV90Yl92YWxpZGF0ZV9yc2R0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKQogewotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fbWF0Y2g7CisJaW50IG5vX21hdGNoOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ0Yl92YWxpZGF0ZV9yc2R0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInRiX3ZhbGlkYXRlX3JzZHQiKTsKIAogCS8qCi0JICogRm9yIFJTRFAgcmV2aXNpb24gMCBvciAxLCB3ZSB1c2UgdGhlIFJTRFQuCi0JICogRm9yIFJTRFAgcmV2aXNpb24gMiBhbmQgYWJvdmUsIHdlIHVzZSB0aGUgWFNEVAorCSAqIFNlYXJjaCBmb3IgYXBwcm9wcmlhdGUgc2lnbmF0dXJlLCBSU0RUIG9yIFhTRFQKIAkgKi8KLQlpZiAoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPCAyKSB7Ci0JCW5vX21hdGNoID0gQUNQSV9TVFJOQ01QICgoY2hhciAqKSB0YWJsZV9wdHIsIFJTRFRfU0lHLAotCQkJCSAgc2l6ZW9mIChSU0RUX1NJRykgLTEpOwotCX0KLQllbHNlIHsKLQkJbm9fbWF0Y2ggPSBBQ1BJX1NUUk5DTVAgKChjaGFyICopIHRhYmxlX3B0ciwgWFNEVF9TSUcsCi0JCQkJICBzaXplb2YgKFhTRFRfU0lHKSAtMSk7CisJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgeworCQlub19tYXRjaCA9IEFDUElfU1RSTkNNUCgoY2hhciAqKXRhYmxlX3B0ciwgUlNEVF9TSUcsCisJCQkJCXNpemVvZihSU0RUX1NJRykgLSAxKTsKKwl9IGVsc2UgeworCQlub19tYXRjaCA9IEFDUElfU1RSTkNNUCgoY2hhciAqKXRhYmxlX3B0ciwgWFNEVF9TSUcsCisJCQkJCXNpemVvZihYU0RUX1NJRykgLSAxKTsKIAl9CiAKIAlpZiAobm9fbWF0Y2gpIHsKIAkJLyogSW52YWxpZCBSU0RUIG9yIFhTRFQgc2lnbmF0dXJlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKLQkJCSJJbnZhbGlkIHNpZ25hdHVyZSB3aGVyZSBSU0RQIGluZGljYXRlcyBSU0RUL1hTRFQgc2hvdWxkIGJlIGxvY2F0ZWRcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIHNpZ25hdHVyZSB3aGVyZSBSU0RQIGluZGljYXRlcyBSU0RUL1hTRFQgc2hvdWxkIGJlIGxvY2F0ZWRcbiIpKTsKIAotCQlBQ1BJX0RVTVBfQlVGRkVSIChhY3BpX2dibF9SU0RQLCAyMCk7CisJCUFDUElfRFVNUF9CVUZGRVIoYWNwaV9nYmxfUlNEUCwgMjApOwogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJSU0RUL1hTRFQgc2lnbmF0dXJlIGF0ICVYICglcCkgaXMgaW52YWxpZFxuIiwKLQkJCWFjcGlfZ2JsX1JTRFAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzcywKLQkJCSh2b2lkICopIChhY3BpX25hdGl2ZV91aW50KSBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3MpKTsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVJST1IsCisJCQkJICAgICAgIlJTRFQvWFNEVCBzaWduYXR1cmUgYXQgJVggKCVwKSBpcyBpbnZhbGlkXG4iLAorCQkJCSAgICAgIGFjcGlfZ2JsX1JTRFAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzcywKKwkJCQkgICAgICAodm9pZCAqKShhY3BpX25hdGl2ZV91aW50KSBhY3BpX2dibF9SU0RQLT4KKwkJCQkgICAgICByc2R0X3BoeXNpY2FsX2FkZHJlc3MpKTsKIAotCQlpZiAoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPCAyKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJMb29raW5nIGZvciBSU0RUIChSU0RQLT5SZXYgPCAyKVxuIikpCi0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJMb29raW5nIGZvciBYU0RUIChSU0RQLT5SZXYgPj0gMilcbiIpKQorCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkxvb2tpbmcgZm9yIFJTRFRcbiIpKQorCQl9IGVsc2UgeworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJMb29raW5nIGZvciBYU0RUXG4iKSkKIAkJfQogCi0JCUFDUElfRFVNUF9CVUZGRVIgKChjaGFyICopIHRhYmxlX3B0ciwgNDgpOworCQlBQ1BJX0RVTVBfQlVGRkVSKChjaGFyICopdGFibGVfcHRyLCA0OCk7CiAKIAkJcmV0dXJuIChBRV9CQURfU0lHTkFUVVJFKTsKIAl9CkBAIC0yNTEsNyArMjE2LDYgQEAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90YWJsZV9yc2R0CkBAIC0yNjQsNjYgKzIyOCw2MSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9yc2R0ICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV90Yl9nZXRfdGFibGVfcnNkdCh2b2lkKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgdGFibGVfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgIGFkZHJlc3M7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9nZXRfdGFibGVfcnNkdCIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3RhYmxlX3JzZHQiKTsKIAogCS8qIEdldCB0aGUgUlNEVC9YU0RUIHZpYSB0aGUgUlNEUCAqLwogCi0JYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzICgmYWRkcmVzcyk7CisJYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzKCZhZGRyZXNzKTsKIAogCXRhYmxlX2luZm8udHlwZSA9IEFDUElfVEFCTEVfWFNEVDsKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZSAoJmFkZHJlc3MsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IGdldCB0aGUgUlNEVC9YU0RULCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlKCZhZGRyZXNzLCAmdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGQgbm90IGdldCB0aGUgUlNEVC9YU0RULCAlc1xuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkiUlNEUCBsb2NhdGVkIGF0ICVwLCBwb2ludHMgdG8gUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYIFxuIiwKLQkJYWNwaV9nYmxfUlNEUCwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzLnBvaW50ZXIudmFsdWUpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiUlNEUCBsb2NhdGVkIGF0ICVwLCBwb2ludHMgdG8gUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYIFxuIiwKKwkJCSAgYWNwaV9nYmxfUlNEUCwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MucG9pbnRlci52YWx1ZSkpKTsKIAogCS8qIENoZWNrIHRoZSBSU0RUIG9yIFhTRFQgc2lnbmF0dXJlICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3JzZHQgKHRhYmxlX2luZm8ucG9pbnRlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl92YWxpZGF0ZV9yc2R0KHRhYmxlX2luZm8ucG9pbnRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIHRhYmxlcyBkZWZpbmVkIGluIHRoZSBSU0RUIG9yIFhTRFQgKi8KIAotCWFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQgPSBhY3BpX3RiX2dldF90YWJsZV9jb3VudCAoYWNwaV9nYmxfUlNEUCwKLQkJCSAgdGFibGVfaW5mby5wb2ludGVyKTsKKwlhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50ID0gYWNwaV90Yl9nZXRfdGFibGVfY291bnQoYWNwaV9nYmxfUlNEUCwKKwkJCQkJCQkgICAgdGFibGVfaW5mby5wb2ludGVyKTsKIAogCS8qIENvbnZlcnQgYW5kL29yIGNvcHkgdG8gYW4gWFNEVCBzdHJ1Y3R1cmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfY29udmVydF90b194c2R0ICgmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQoJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBTYXZlIHRoZSB0YWJsZSBwb2ludGVycyBhbmQgYWxsb2NhdGlvbiBpbmZvICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvciAoQUNQSV9UQUJMRV9YU0RULCAmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IoQUNQSV9UQUJMRV9YU0RULCAmdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCWFjcGlfZ2JsX1hTRFQgPSBBQ1BJX0NBU1RfUFRSIChYU0RUX0RFU0NSSVBUT1IsIHRhYmxlX2luZm8ucG9pbnRlcik7CisJYWNwaV9nYmxfWFNEVCA9IEFDUElfQ0FTVF9QVFIoWFNEVF9ERVNDUklQVE9SLCB0YWJsZV9pbmZvLnBvaW50ZXIpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIlhTRFQgbG9jYXRlZCBhdCAlcFxuIiwgYWNwaV9nYmxfWFNEVCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJYU0RUIGxvY2F0ZWQgYXQgJXBcbiIsIGFjcGlfZ2JsX1hTRFQpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCmluZGV4IGU2OWQwMWQuLjRiMmZiYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCkBAIC00MSwyMyArNDEsODQgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YnV0aWxzIikKK0FDUElfTU9EVUxFX05BTUUoInRidXRpbHMiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogYWNwaV9zdGF0dXMKLWFjcGlfdGJfaGFuZGxlX3RvX29iamVjdCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9pZCwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICoqdGFibGVfZGVzYyk7CithY3BpX3RiX2hhbmRsZV90b19vYmplY3QodTE2IHRhYmxlX2lkLCBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICoqdGFibGVfZGVzYyk7CiAjZW5kaWYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pc190YWJsZV9pbnN0YWxsZWQKKyAqCisgKiBQQVJBTUVURVJTOiAgbmV3X3RhYmxlX2Rlc2MgICAgICAtIERlc2NyaXB0b3IgZm9yIG5ldyB0YWJsZSBiZWluZyBpbnN0YWxsZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIC0gQUVfQUxSRUFEWV9FWElTVFMgaWYgdGhlIHRhYmxlIGlzIGFscmVhZHkgaW5zdGFsbGVkCisgKgorICogREVTQ1JJUFRJT046IERldGVybWluZSBpZiBhbiBBQ1BJIHRhYmxlIGlzIGFscmVhZHkgaW5zdGFsbGVkCisgKgorICogTVVURVg6ICAgICAgIFRhYmxlIGRhdGEgc3RydWN0dXJlcyBzaG91bGQgYmUgbG9ja2VkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV90Yl9pc190YWJsZV9pbnN0YWxsZWQoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqbmV3X3RhYmxlX2Rlc2MpCit7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2lzX3RhYmxlX2luc3RhbGxlZCIpOworCisJLyogR2V0IHRoZSBsaXN0IGRlc2NyaXB0b3IgYW5kIGZpcnN0IHRhYmxlIGRlc2NyaXB0b3IgKi8KKworCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tuZXdfdGFibGVfZGVzYy0+dHlwZV0ubmV4dDsKKworCS8qIEV4YW1pbmUgYWxsIGluc3RhbGxlZCB0YWJsZXMgb2YgdGhpcyB0eXBlICovCisKKwl3aGlsZSAodGFibGVfZGVzYykgeworCQkvKgorCQkgKiBJZiB0aGUgdGFibGUgbGVuZ3RocyBtYXRjaCwgcGVyZm9ybSBhIGZ1bGwgYnl0ZXdpc2UgY29tcGFyZS4gVGhpcworCQkgKiBtZWFucyB0aGF0IHdlIHdpbGwgYWxsb3cgdGFibGVzIHdpdGggZHVwbGljYXRlIG9lbV90YWJsZV9pZChzKSwgYXMKKwkJICogbG9uZyBhcyB0aGUgdGFibGVzIGFyZSBkaWZmZXJlbnQgaW4gc29tZSB3YXkuCisJCSAqCisJCSAqIENoZWNraW5nIGlmIHRoZSB0YWJsZSBoYXMgYmVlbiBsb2FkZWQgaW50byB0aGUgbmFtZXNwYWNlIG1lYW5zIHRoYXQKKwkJICogd2UgZG9uJ3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSB0YWJsZXMgZHVyaW5nIHRoZSBpbml0aWFsIGluc3RhbGxhdGlvbgorCQkgKiBvZiB0YWJsZXMgd2l0aGluIHRoZSBSU0RUL1hTRFQuCisJCSAqLworCQlpZiAoKHRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSkgJiYKKwkJICAgICh0YWJsZV9kZXNjLT5wb2ludGVyLT5sZW5ndGggPT0KKwkJICAgICBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoKQorCQkgICAgJiYKKwkJICAgICghQUNQSV9NRU1DTVAKKwkJICAgICAoKGNvbnN0IGNoYXIgKil0YWJsZV9kZXNjLT5wb2ludGVyLAorCQkgICAgICAoY29uc3QgY2hhciAqKW5ld190YWJsZV9kZXNjLT5wb2ludGVyLAorCQkgICAgICAoYWNwaV9zaXplKSBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoKSkpIHsKKwkJCS8qIE1hdGNoOiB0aGlzIHRhYmxlIGlzIGFscmVhZHkgaW5zdGFsbGVkICovCisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAorCQkJCQkgICJUYWJsZSBbJTQuNHNdIGFscmVhZHkgaW5zdGFsbGVkOiBSZXYgJVggb2VtX3RhYmxlX2lkIFslOC44c11cbiIsCisJCQkJCSAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSwKKwkJCQkJICBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+cmV2aXNpb24sCisJCQkJCSAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPgorCQkJCQkgIG9lbV90YWJsZV9pZCkpOworCisJCQluZXdfdGFibGVfZGVzYy0+b3duZXJfaWQgPSB0YWJsZV9kZXNjLT5vd25lcl9pZDsKKwkJCW5ld190YWJsZV9kZXNjLT5pbnN0YWxsZWRfZGVzYyA9IHRhYmxlX2Rlc2M7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTFJFQURZX0VYSVNUUyk7CisJCX0KKworCQkvKiBHZXQgbmV4dCB0YWJsZSBvbiB0aGUgbGlzdCAqLworCisJCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODAsNTcgKzE0MSw1NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpCithY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlcihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcikKIHsKLQlhY3BpX25hbWUgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZTsKKwlhY3BpX25hbWUgc2lnbmF0dXJlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ0Yl92YWxpZGF0ZV90YWJsZV9oZWFkZXIiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgidGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyIik7CiAKIAkvKiBWZXJpZnkgdGhhdCB0aGlzIGlzIGEgdmFsaWQgYWRkcmVzcyAqLwogCi0JaWYgKCFhY3BpX29zX3JlYWRhYmxlICh0YWJsZV9oZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQ2Fubm90IHJlYWQgdGFibGUgaGVhZGVyIGF0ICVwXG4iLCB0YWJsZV9oZWFkZXIpKTsKKwlpZiAoIWFjcGlfb3NfcmVhZGFibGUodGFibGVfaGVhZGVyLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJDYW5ub3QgcmVhZCB0YWJsZSBoZWFkZXIgYXQgJXBcbiIsCisJCQkJICB0YWJsZV9oZWFkZXIpKTsKIAogCQlyZXR1cm4gKEFFX0JBRF9BRERSRVNTKTsKIAl9CiAKIAkvKiBFbnN1cmUgdGhhdCB0aGUgc2lnbmF0dXJlIGlzIDQgQVNDSUkgY2hhcmFjdGVycyAqLwogCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmc2lnbmF0dXJlLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7Ci0JaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSAoc2lnbmF0dXJlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJUYWJsZSBzaWduYXR1cmUgYXQgJXAgWyVwXSBoYXMgaW52YWxpZCBjaGFyYWN0ZXJzXG4iLAotCQkJdGFibGVfaGVhZGVyLCAmc2lnbmF0dXJlKSk7CisJQUNQSV9NT1ZFXzMyX1RPXzMyKCZzaWduYXR1cmUsIHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlKTsKKwlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHNpZ25hdHVyZSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUYWJsZSBzaWduYXR1cmUgYXQgJXAgWyVwXSBoYXMgaW52YWxpZCBjaGFyYWN0ZXJzXG4iLAorCQkJCSAgdGFibGVfaGVhZGVyLCAmc2lnbmF0dXJlKSk7CiAKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJJbnZhbGlkIHRhYmxlIHNpZ25hdHVyZSBmb3VuZDogWyU0LjRzXVxuIiwKLQkJCShjaGFyICopICZzaWduYXR1cmUpKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIkludmFsaWQgdGFibGUgc2lnbmF0dXJlIGZvdW5kOiBbJTQuNHNdXG4iLAorCQkJCSAgICAgKGNoYXIgKikmc2lnbmF0dXJlKSk7CiAKLQkJQUNQSV9EVU1QX0JVRkZFUiAodGFibGVfaGVhZGVyLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlBQ1BJX0RVTVBfQlVGRkVSKHRhYmxlX2hlYWRlciwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCQlyZXR1cm4gKEFFX0JBRF9TSUdOQVRVUkUpOwogCX0KIAogCS8qIFZhbGlkYXRlIHRoZSB0YWJsZSBsZW5ndGggKi8KIAotCWlmICh0YWJsZV9oZWFkZXItPmxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJJbnZhbGlkIGxlbmd0aCBpbiB0YWJsZSBoZWFkZXIgJXAgbmFtZSAlNC40c1xuIiwKLQkJCXRhYmxlX2hlYWRlciwgKGNoYXIgKikgJnNpZ25hdHVyZSkpOworCWlmICh0YWJsZV9oZWFkZXItPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSW52YWxpZCBsZW5ndGggaW4gdGFibGUgaGVhZGVyICVwIG5hbWUgJTQuNHNcbiIsCisJCQkJICB0YWJsZV9oZWFkZXIsIChjaGFyICopJnNpZ25hdHVyZSkpOwogCi0JCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgiSW52YWxpZCB0YWJsZSBoZWFkZXIgbGVuZ3RoICgweCVYKSBmb3VuZFxuIiwKLQkJCSh1MzIpIHRhYmxlX2hlYWRlci0+bGVuZ3RoKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIHRhYmxlIGhlYWRlciBsZW5ndGggKDB4JVgpIGZvdW5kXG4iLCAodTMyKSB0YWJsZV9oZWFkZXItPmxlbmd0aCkpOwogCi0JCUFDUElfRFVNUF9CVUZGRVIgKHRhYmxlX2hlYWRlciwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJQUNQSV9EVU1QX0JVRkZFUih0YWJsZV9oZWFkZXIsCisJCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJcmV0dXJuIChBRV9CQURfSEVBREVSKTsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bQpAQCAtMTQ1LDM3ICsyMDQsMzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyKQorYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICogdGFibGVfaGVhZGVyKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW07Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwl1OCBjaGVja3N1bTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtIik7CiAKIAkvKiBDb21wdXRlIHRoZSBjaGVja3N1bSBvbiB0aGUgdGFibGUgKi8KIAotCWNoZWNrc3VtID0gYWNwaV90Yl9jaGVja3N1bSAodGFibGVfaGVhZGVyLCB0YWJsZV9oZWFkZXItPmxlbmd0aCk7CisJY2hlY2tzdW0gPQorCSAgICBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHRhYmxlX2hlYWRlciwgdGFibGVfaGVhZGVyLT5sZW5ndGgpOwogCiAJLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24gKi8KIAogCWlmIChjaGVja3N1bSkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCi0JCQkiSW52YWxpZCBjaGVja3N1bSBpbiB0YWJsZSBbJTQuNHNdICglMDJYLCBzdW0gJTAyWCBpcyBub3QgemVybylcbiIsCi0JCQl0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwgKHUzMikgdGFibGVfaGVhZGVyLT5jaGVja3N1bSwKLQkJCSh1MzIpIGNoZWNrc3VtKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gKCUwMlgsIHN1bSAlMDJYIGlzIG5vdCB6ZXJvKVxuIiwgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsICh1MzIpIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sICh1MzIpIGNoZWNrc3VtKSk7CiAKIAkJc3RhdHVzID0gQUVfQkFEX0NIRUNLU1VNOwogCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9jaGVja3N1bQorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0KICAqCiAgKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgICAgICAtIEJ1ZmZlciB0byBjaGVja3N1bQogICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBidWZmZXIKQEAgLTE4NiwxNSArMjM5LDExIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdGJfY2hlY2tzdW0gKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkKK3U4IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odm9pZCAqYnVmZmVyLCB1MzIgbGVuZ3RoKQogewotCWNvbnN0IHU4ICAgICAgICAgICAgICAgICAgICAgICAgKmxpbWl0OwotCWNvbnN0IHU4ICAgICAgICAgICAgICAgICAgICAgICAgKnJvdmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtID0gMDsKLQorCWNvbnN0IHU4ICpsaW1pdDsKKwljb25zdCB1OCAqcm92ZXI7CisJdTggc3VtID0gMDsKIAogCWlmIChidWZmZXIgJiYgbGVuZ3RoKSB7CiAJCS8qICBCdWZmZXIgYW5kIExlbmd0aCBhcmUgdmFsaWQgICAqLwpAQCAtMjA4LDcgKzI1Nyw2IEBACiAJcmV0dXJuIChzdW0pOwogfQogCi0KICNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMjQsMTYgKzI3MiwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfaGFuZGxlX3RvX29iamVjdCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9pZCwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICoqcmV0dXJuX3RhYmxlX2Rlc2MpCithY3BpX3RiX2hhbmRsZV90b19vYmplY3QodTE2IHRhYmxlX2lkLAorCQkJIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKiogcmV0dXJuX3RhYmxlX2Rlc2MpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7CisJdTMyIGk7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIAotCi0JQUNQSV9GVU5DVElPTl9OQU1FICgidGJfaGFuZGxlX3RvX29iamVjdCIpOwotCisJQUNQSV9GVU5DVElPTl9OQU1FKCJ0Yl9oYW5kbGVfdG9fb2JqZWN0Iik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9UQUJMRV9NQVg7IGkrKykgewogCQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dDsKQEAgLTI0Nyw5ICsyOTIsOCBAQAogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJ0YWJsZV9pZD0lWCBkb2VzIG5vdCBleGlzdFxuIiwgdGFibGVfaWQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAidGFibGVfaWQ9JVggZG9lcyBub3QgZXhpc3RcbiIsCisJCQkgIHRhYmxlX2lkKSk7CiAJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIH0KICNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKaW5kZXggMGMwYjkwOC4uM2Y5NmE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKQEAgLTQ4LDEwICs0OCw4IEBACiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRieGZhY2UiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJ0YnhmYWNlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NSwyNSArNjMsMjAgQEAKICAqICAgICAgICAgICAgICBwcm92aWRlZCBSU0RUCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbG9hZF90YWJsZXMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2xvYWRfdGFibGVzKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICByc2RwX2FkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfcG9pbnRlciByc2RwX2FkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9sb2FkX3RhYmxlcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9sb2FkX3RhYmxlcyIpOwogCiAJLyogR2V0IHRoZSBSU0RQICovCiAKLQlzdGF0dXMgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIgKEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAotCQkJICAmcnNkcF9hZGRyZXNzKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBnZXQgUlNEUCwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIoQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCisJCQkJCSAgJnJzZHBfYWRkcmVzcyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGdldCBSU0RQLCAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC05MSw1NCArODQsNDcgQEAKIAogCWFjcGlfZ2JsX3RhYmxlX2ZsYWdzID0gcnNkcF9hZGRyZXNzLnBvaW50ZXJfdHlwZTsKIAotCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3JzZHAgKCZyc2RwX2FkZHJlc3MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogUlNEUCBGYWlsZWQgdmFsaWRhdGlvbjogJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV9yc2RwKCZyc2RwX2FkZHJlc3MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IFJTRFAgRmFpbGVkIHZhbGlkYXRpb246ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCiAJLyogR2V0IHRoZSBSU0RUIHZpYSB0aGUgUlNEUCAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcnNkdCAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIFJTRFQ6ICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcnNkdCgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIFJTRFQ6ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCiAJLyogTm93IGdldCB0aGUgdGFibGVzIG5lZWRlZCBieSB0aGlzIHN1YnN5c3RlbSAoRkFEVCwgRFNEVCwgZXRjLikgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoCi0JCQkiYWNwaV9sb2FkX3RhYmxlczogRXJyb3IgZ2V0dGluZyByZXF1aXJlZCB0YWJsZXMgKERTRFQvRkFEVC9GQUNTKTogJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2xvYWRfdGFibGVzOiBFcnJvciBnZXR0aW5nIHJlcXVpcmVkIHRhYmxlcyAoRFNEVC9GQURUL0ZBQ1MpOiAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWRcbiIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsICJBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWRcbiIpKTsKIAogCS8qIExvYWQgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSB0YWJsZXMgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF9uYW1lc3BhY2UgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgbG9hZCBuYW1lc3BhY2U6ICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJc3RhdHVzID0gYWNwaV9uc19sb2FkX25hbWVzcGFjZSgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIG5hbWVzcGFjZTogJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCisgICAgICBlcnJvcl9leGl0OgorCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGxvYWQgdGFibGVzOiAlc1xuIiwKKwkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKLWVycm9yX2V4aXQ6Ci0JQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGxvYWQgdGFibGVzOiAlc1xuIiwKLQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1Niw0MCArMTQyLDQ5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfbG9hZF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfcHRyKQorYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgdGFibGVfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgIGFkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2xvYWRfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfbG9hZF90YWJsZSIpOwogCiAJaWYgKCF0YWJsZV9wdHIpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIENvcHkgdGhlIHRhYmxlIHRvIGEgbG9jYWwgYnVmZmVyICovCiAKLQlhZGRyZXNzLnBvaW50ZXJfdHlwZSAgICA9IEFDUElfTE9HSUNBTF9QT0lOVEVSIHwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkc7CisJYWRkcmVzcy5wb2ludGVyX3R5cGUgPSBBQ1BJX0xPR0lDQUxfUE9JTlRFUiB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOwogCWFkZHJlc3MucG9pbnRlci5sb2dpY2FsID0gdGFibGVfcHRyOwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keSAoJmFkZHJlc3MsIHRhYmxlX3B0ciwgJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoJmFkZHJlc3MsIHRhYmxlX3B0ciwgJnRhYmxlX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBDaGVjayBzaWduYXR1cmUgZm9yIGEgdmFsaWQgdGFibGUgdHlwZSAqLworCisJc3RhdHVzID0gYWNwaV90Yl9yZWNvZ25pemVfdGFibGUoJnRhYmxlX2luZm8sIEFDUElfVEFCTEVfQUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlIGludG8gdGhlIGxvY2FsIGRhdGEgc3RydWN0dXJlcyAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlICgmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSgmdGFibGVfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgPT0gQUVfQUxSRUFEWV9FWElTVFMpIHsKKwkJCS8qIFRhYmxlIGFscmVhZHkgZXhpc3RzLCBubyBlcnJvciAqLworCisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfQorCiAJCS8qIEZyZWUgdGFibGUgYWxsb2NhdGVkIGJ5IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkgKi8KIAotCQlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUgKCZ0YWJsZV9pbmZvKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUoJnRhYmxlX2luZm8pOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBDb252ZXJ0IHRoZSB0YWJsZSB0byBjb21tb24gZm9ybWF0IGlmIG5lY2Vzc2FyeSAqLwpAQCAtMTk3LDMxICsxOTIsMzIgQEAKIAlzd2l0Y2ggKHRhYmxlX2luZm8udHlwZSkgewogCWNhc2UgQUNQSV9UQUJMRV9GQURUOgogCi0JCXN0YXR1cyA9IGFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0ICgpOworCQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCgpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UQUJMRV9GQUNTOgogCi0JCXN0YXR1cyA9IGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MgKCZ0YWJsZV9pbmZvKTsKKwkJc3RhdHVzID0gYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcygmdGFibGVfaW5mbyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJLyogTG9hZCB0YWJsZSBpbnRvIG5hbWVzcGFjZSBpZiBpdCBjb250YWlucyBleGVjdXRhYmxlIEFNTCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSAodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYywgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjLAorCQkJCSAgICAgICBhY3BpX2dibF9yb290X25vZGUpOwogCQlicmVhazsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCS8qIFVuaW5zdGFsbCB0YWJsZSBhbmQgZnJlZSB0aGUgYnVmZmVyICovCiAKLQkJKHZvaWQpIGFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlICh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjKTsKKwkJKHZvaWQpYWNwaV90Yl91bmluc3RhbGxfdGFibGUodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYyk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdW5sb2FkX3RhYmxlCkBAIC0yMzQsMjAgKzIzMCwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3VubG9hZF90YWJsZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKQorYWNwaV9zdGF0dXMgYWNwaV91bmxvYWRfdGFibGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV91bmxvYWRfdGFibGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdW5sb2FkX3RhYmxlIik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogRmluZCBhbGwgdGFibGVzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSAqLwpAQCAtMjYwLDE4ICsyNTIsMTcgQEAKIAkJICogIlNjb3BlIiBvcGVyYXRvci4gIFRodXMsIHdlIG5lZWQgdG8gdHJhY2sgb3duZXJzaGlwIGJ5IGFuIElELCBub3QKIAkJICogc2ltcGx5IGEgcG9zaXRpb24gd2l0aGluIHRoZSBoaWVyYXJjaHkKIAkJICovCi0JCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciAodGFibGVfZGVzYy0+dGFibGVfaWQpOwotCisJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih0YWJsZV9kZXNjLT5vd25lcl9pZCk7CisJCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmdGFibGVfZGVzYy0+b3duZXJfaWQpOwogCQl0YWJsZV9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKIAl9CiAKIAkvKiBEZWxldGUgKG9yIHVubWFwKSBhbGwgdGFibGVzIG9mIHRoaXMgdHlwZSAqLwogCi0JYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUgKHRhYmxlX3R5cGUpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlKHRhYmxlX3R5cGUpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGFibGVfaGVhZGVyCkBAIC0yOTQsNTQgKzI4NSw0OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RhYmxlX2hlYWRlciAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqb3V0X3RhYmxlX2hlYWRlcikKK2FjcGlfZ2V0X3RhYmxlX2hlYWRlcihhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKKwkJICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKm91dF90YWJsZV9oZWFkZXIpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGJsX3B0cjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRibF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfdGFibGVfaGVhZGVyIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9nZXRfdGFibGVfaGVhZGVyIik7Ci0KLQotCWlmICgoaW5zdGFuY2UgPT0gMCkgICAgICAgICAgICAgICAgIHx8Ci0JCSh0YWJsZV90eXBlID09IEFDUElfVEFCTEVfUlNEUCkgfHwKLQkJKCFvdXRfdGFibGVfaGVhZGVyKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgoaW5zdGFuY2UgPT0gMCkgfHwKKwkgICAgKHRhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9SU0RQKSB8fCAoIW91dF90YWJsZV9oZWFkZXIpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBDaGVjayB0aGUgdGFibGUgdHlwZSBhbmQgaW5zdGFuY2UgKi8KIAotCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSAgIHx8Ci0JCShBQ1BJX0lTX1NJTkdMRV9UQUJMRSAoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5mbGFncykgJiYKLQkJIGluc3RhbmNlID4gMSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKKwlpZiAoKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX01BWCkgfHwKKwkgICAgKEFDUElfSVNfU0lOR0xFX1RBQkxFKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfdHlwZV0uZmxhZ3MpICYmCisJICAgICBpbnN0YW5jZSA+IDEpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBlbnRpcmUgdGFibGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3B0ciAodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9wdHIodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgTlVMTCBwb2ludGVyIGlmIHRoZSB0YWJsZSBpcyBub3QgbG9hZGVkICovCiAKIAlpZiAodGJsX3B0ciA9PSBOVUxMKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJLyogQ29weSB0aGUgaGVhZGVyIHRvIHRoZSBjYWxsZXIncyBidWZmZXIgKi8KIAotCUFDUElfTUVNQ1BZICgodm9pZCAqKSBvdXRfdGFibGVfaGVhZGVyLCAodm9pZCAqKSB0YmxfcHRyLAotCQlzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCUFDUElfTUVNQ1BZKCh2b2lkICopb3V0X3RhYmxlX2hlYWRlciwgKHZvaWQgKil0YmxfcHRyLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzY3LDQzICszNTMsMzkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF90YWJsZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfZ2V0X3RhYmxlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAorCSAgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YmxfcHRyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfbGVuZ3RoOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGJsX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9zaXplIHRhYmxlX2xlbmd0aDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfZ2V0X3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF90YWJsZSIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmIChpbnN0YW5jZSA9PSAwKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAocmV0X2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIocmV0X2J1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENoZWNrIHRoZSB0YWJsZSB0eXBlIGFuZCBpbnN0YW5jZSAqLwogCi0JaWYgKCh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9NQVgpICAgfHwKLQkJKEFDUElfSVNfU0lOR0xFX1RBQkxFIChhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmZsYWdzKSAmJgotCQkgaW5zdGFuY2UgPiAxKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSB8fAorCSAgICAoQUNQSV9JU19TSU5HTEVfVEFCTEUoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5mbGFncykgJiYKKwkgICAgIGluc3RhbmNlID4gMSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGVudGlyZSB0YWJsZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcHRyICh0YWJsZV90eXBlLCBpbnN0YW5jZSwgJnRibF9wdHIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX3B0cih0YWJsZV90eXBlLCBpbnN0YW5jZSwgJnRibF9wdHIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtNDExLDcgKzM5Myw3IEBACiAJICogdGFibGUgaXMgbm90IGxvYWRlZC4KIAkgKi8KIAlpZiAodGJsX3B0ciA9PSBOVUxMKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQogCiAJLyogR2V0IHRoZSB0YWJsZSBsZW5ndGggKi8KQEAgLTQxOSwyMyArNDAxLDIyIEBACiAJaWYgKHRhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9SU0RQKSB7CiAJCS8qIFJTRCBQVFIgaXMgdGhlIG9ubHkgInRhYmxlIiB3aXRob3V0IGEgaGVhZGVyICovCiAKLQkJdGFibGVfbGVuZ3RoID0gc2l6ZW9mIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKTsKLQl9Ci0JZWxzZSB7CisJCXRhYmxlX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKTsKKwl9IGVsc2UgewogCQl0YWJsZV9sZW5ndGggPSAoYWNwaV9zaXplKSB0YmxfcHRyLT5sZW5ndGg7CiAJfQogCiAJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAocmV0X2J1ZmZlciwgdGFibGVfbGVuZ3RoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKHJldF9idWZmZXIsIHRhYmxlX2xlbmd0aCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENvcHkgdGhlIHRhYmxlIHRvIHRoZSBidWZmZXIgKi8KIAotCUFDUElfTUVNQ1BZICgodm9pZCAqKSByZXRfYnVmZmVyLT5wb2ludGVyLCAodm9pZCAqKSB0YmxfcHRyLCB0YWJsZV9sZW5ndGgpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCUFDUElfTUVNQ1BZKCh2b2lkICopcmV0X2J1ZmZlci0+cG9pbnRlciwgKHZvaWQgKil0YmxfcHRyLCB0YWJsZV9sZW5ndGgpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RhYmxlKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKaW5kZXggZGMzYzNmNi4uM2I4YTdlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwpAQCAtNDYsMjIgKzQ2LDU2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJ4ZnJvb3QiKQorQUNQSV9NT0RVTEVfTkFNRSgidGJ4ZnJvb3QiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9maW5kX3JzZHAgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX3RiX2ZpbmRfcnNkcChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvLCB1MzIgZmxhZ3MpOwogCi1zdGF0aWMgdTggKgotYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnRfYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CitzdGF0aWMgdTggKmFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodTggKiBzdGFydF9hZGRyZXNzLCB1MzIgbGVuZ3RoKTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl92YWxpZGF0ZV9yc2RwCisgKgorICogUEFSQU1FVEVSUzogIFJzZHAgICAgICAgIC0gUG9pbnRlciB0byB1bnZhbGlkYXRlZCBSU0RQCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB0aGUgUlNEUCAocHRyKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICpyc2RwKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0CisJICovCisJaWYgKEFDUElfU1RSTkNNUCgoY2hhciAqKXJzZHAsIFJTRFBfU0lHLCBzaXplb2YoUlNEUF9TSUcpIC0gMSkgIT0gMCkgeworCQkvKiBOb3BlLCBCQUQgU2lnbmF0dXJlICovCisKKwkJcmV0dXJuIChBRV9CQURfU0lHTkFUVVJFKTsKKwl9CisKKwkvKiBDaGVjayB0aGUgc3RhbmRhcmQgY2hlY2tzdW0gKi8KKworCWlmIChhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHJzZHAsIEFDUElfUlNEUF9DSEVDS1NVTV9MRU5HVEgpICE9IDApIHsKKwkJcmV0dXJuIChBRV9CQURfQ0hFQ0tTVU0pOworCX0KKworCS8qIENoZWNrIGV4dGVuZGVkIGNoZWNrc3VtIGlmIHRhYmxlIHZlcnNpb24gPj0gMiAqLworCisJaWYgKChyc2RwLT5yZXZpc2lvbiA+PSAyKSAmJgorCSAgICAoYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bShyc2RwLCBBQ1BJX1JTRFBfWENIRUNLU1VNX0xFTkdUSCkgIT0KKwkgICAgIDApKSB7CisJCXJldHVybiAoQUVfQkFEX0NIRUNLU1VNKTsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC04MCwyOCArMTE0LDI0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9maW5kX3RhYmxlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2VtX2lkLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9lbV90YWJsZV9pZCwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGVfcHRyKQorYWNwaV90Yl9maW5kX3RhYmxlKGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgY2hhciAqb2VtX2lkLAorCQkgICBjaGFyICpvZW1fdGFibGVfaWQsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKiB0YWJsZV9wdHIpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9maW5kX3RhYmxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9maW5kX3RhYmxlIik7CiAKIAkvKiBWYWxpZGF0ZSBzdHJpbmcgbGVuZ3RocyAqLwogCi0JaWYgKChBQ1BJX1NUUkxFTiAoc2lnbmF0dXJlKSAgPiBBQ1BJX05BTUVfU0laRSkgfHwKLQkJKEFDUElfU1RSTEVOIChvZW1faWQpICAgICA+IHNpemVvZiAodGFibGUtPm9lbV9pZCkpIHx8Ci0JCShBQ1BJX1NUUkxFTiAob2VtX3RhYmxlX2lkKSA+IHNpemVvZiAodGFibGUtPm9lbV90YWJsZV9pZCkpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1NUUklOR19MSU1JVCk7CisJaWYgKChBQ1BJX1NUUkxFTihzaWduYXR1cmUpID4gQUNQSV9OQU1FX1NJWkUpIHx8CisJICAgIChBQ1BJX1NUUkxFTihvZW1faWQpID4gc2l6ZW9mKHRhYmxlLT5vZW1faWQpKSB8fAorCSAgICAoQUNQSV9TVFJMRU4ob2VtX3RhYmxlX2lkKSA+IHNpemVvZih0YWJsZS0+b2VtX3RhYmxlX2lkKSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9TVFJJTkdfTElNSVQpOwogCX0KIAotCWlmICghQUNQSV9TVFJOQ01QIChzaWduYXR1cmUsIERTRFRfU0lHLCBBQ1BJX05BTUVfU0laRSkpIHsKKwlpZiAoIUFDUElfU1RSTkNNUChzaWduYXR1cmUsIERTRFRfU0lHLCBBQ1BJX05BTUVfU0laRSkpIHsKIAkJLyoKIAkJICogVGhlIERTRFQgcG9pbnRlciBpcyBjb250YWluZWQgaW4gdGhlIEZBRFQsIG5vdCB0aGUgUlNEVC4KIAkJICogVGhpcyBjb2RlIHNob3VsZCBzdWZmaWNlLCBiZWNhdXNlIHRoZSBvbmx5IGNvZGUgdGhhdCB3b3VsZCBwZXJmb3JtCkBAIC0xMTAsNDAgKzE0MCwzNiBAQAogCQkgKiBJZiB0aGlzIGJlY29tZXMgaW5zdWZmaWNpZW50LCB0aGUgRkFEVCB3aWxsIGhhdmUgdG8gYmUgZm91bmQgZmlyc3QuCiAJCSAqLwogCQlpZiAoIWFjcGlfZ2JsX0RTRFQpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fQUNQSV9UQUJMRVMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAkJfQogCQl0YWJsZSA9IGFjcGlfZ2JsX0RTRFQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIEZpbmQgdGhlIHRhYmxlICovCiAKLQkJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUgKHNpZ25hdHVyZSwgMSwKLQkJCQkgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsICZ0YWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoc2lnbmF0dXJlLCAxLAorCQkJCQkJIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAorCQkJCQkJICZ0YWJsZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKiBDaGVjayBvZW1faWQgYW5kIG9lbV90YWJsZV9pZCAqLwogCi0JaWYgKChvZW1faWRbMF0gJiYgQUNQSV9TVFJOQ01QICgKLQkJCSAgIG9lbV9pZCwgdGFibGUtPm9lbV9pZCwKLQkJCSAgIHNpemVvZiAodGFibGUtPm9lbV9pZCkpKSB8fAotCi0JCShvZW1fdGFibGVfaWRbMF0gJiYgQUNQSV9TVFJOQ01QICgKLQkJCQkgICBvZW1fdGFibGVfaWQsIHRhYmxlLT5vZW1fdGFibGVfaWQsCi0JCQkJICAgc2l6ZW9mICh0YWJsZS0+b2VtX3RhYmxlX2lkKSkpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05BTUVfTk9UX0ZPVU5EKTsKKwlpZiAoKG9lbV9pZFswXSAmJiBBQ1BJX1NUUk5DTVAob2VtX2lkLCB0YWJsZS0+b2VtX2lkLAorCQkJCSAgICAgICBzaXplb2YodGFibGUtPm9lbV9pZCkpKSB8fAorCSAgICAob2VtX3RhYmxlX2lkWzBdICYmIEFDUElfU1RSTkNNUChvZW1fdGFibGVfaWQsIHRhYmxlLT5vZW1fdGFibGVfaWQsCisJCQkJCSAgICAgc2l6ZW9mKHRhYmxlLT5vZW1fdGFibGVfaWQpKSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OQU1FX05PVF9GT1VORCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLCAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwKLQkJdGFibGUtPnNpZ25hdHVyZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLCAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwKKwkJCSAgdGFibGUtPnNpZ25hdHVyZSkpOwogCiAJKnRhYmxlX3B0ciA9IHRhYmxlOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZmlybXdhcmVfdGFibGUKQEAgLTE2NCwzNCArMTkwLDI4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZmlybXdhcmVfdGFibGUgKAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGVfcG9pbnRlcikKK2FjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKGFjcGlfc3RyaW5nIHNpZ25hdHVyZSwKKwkJCXUzMiBpbnN0YW5jZSwKKwkJCXUzMiBmbGFncywgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcG9pbnRlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgIGFkZHJlc3M7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICpyc2R0X2luZm87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9jb3VudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8gPSBOVUxMOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnJzZHRfaW5mbzsKKwl1MzIgdGFibGVfY291bnQ7CisJdTMyIGk7CisJdTMyIGo7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9maXJtd2FyZV90YWJsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfZmlybXdhcmVfdGFibGUiKTsKIAogCS8qCiAJICogRW5zdXJlIHRoYXQgYXQgbGVhc3QgdGhlIHRhYmxlIG1hbmFnZXIgaXMgaW5pdGlhbGl6ZWQuICBXZSBkb24ndAogCSAqIHJlcXVpcmUgdGhhdCB0aGUgZW50aXJlIEFDUEkgc3Vic3lzdGVtIGlzIHVwIGZvciB0aGlzIGludGVyZmFjZS4KIAkgKiBJZiB3ZSBoYXZlIGEgYnVmZmVyLCB3ZSBtdXN0IGhhdmUgYSBsZW5ndGggdG9vCiAJICovCi0JaWYgKChpbnN0YW5jZSA9PSAwKSAgICAgfHwKLQkJKCFzaWduYXR1cmUpICAgICAgICB8fAotCQkoIXRhYmxlX3BvaW50ZXIpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7CisJaWYgKChpbnN0YW5jZSA9PSAwKSB8fCAoIXNpZ25hdHVyZSkgfHwgKCF0YWJsZV9wb2ludGVyKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIFJTRFAgKi8KQEAgLTE5OSw0OCArMjE5LDQxIEBACiAJaWYgKCFhY3BpX2dibF9SU0RQKSB7CiAJCS8qIEdldCB0aGUgUlNEUCAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlciAoZmxhZ3MsICZhZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIlJTRFAgbm90IGZvdW5kXG4iKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJc3RhdHVzID0gYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKGZsYWdzLCAmYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUlNEUCBub3QgZm91bmRcbiIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJCX0KIAogCQkvKiBNYXAgYW5kIHZhbGlkYXRlIHRoZSBSU0RQICovCiAKIAkJaWYgKChmbGFncyAmIEFDUElfTUVNT1JZX01PREUpID09IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MucG9pbnRlci5waHlzaWNhbCwKLQkJCQkJIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksICh2b2lkICopICZhY3BpX2dibF9SU0RQKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcy5wb2ludGVyLnBoeXNpY2FsLAorCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgICByc2RwX2Rlc2NyaXB0b3IpLAorCQkJCQkJICAgICh2b2lkICopJmFjcGlfZ2JsX1JTRFApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlhY3BpX2dibF9SU0RQID0gYWRkcmVzcy5wb2ludGVyLmxvZ2ljYWw7CiAJCX0KIAotCQkvKiBUaGUgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLworCQkvKiBUaGUgUkRTUCBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0ICovCiAKLQkJaWYgKEFDUElfU1RSTkNNUCAoKGNoYXIgKikgYWNwaV9nYmxfUlNEUCwgUlNEUF9TSUcsCi0JCQkJc2l6ZW9mIChSU0RQX1NJRyktMSkgIT0gMCkgewotCQkJLyogTm9wZSwgQkFEIFNpZ25hdHVyZSAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9TSUdOQVRVUkUpOwotCQl9Ci0KLQkJaWYgKGFjcGlfdGJfY2hlY2tzdW0gKGFjcGlfZ2JsX1JTRFAsIEFDUElfUlNEUF9DSEVDS1NVTV9MRU5HVEgpICE9IDApIHsKLQkJCS8qIE5vcGUsIEJBRCBDaGVja3N1bSAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9DSEVDS1NVTSk7CisJCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfcnNkcChhY3BpX2dibF9SU0RQKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEdldCB0aGUgUlNEVCBhZGRyZXNzIHZpYSB0aGUgUlNEUCAqLwogCi0JYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzICgmYWRkcmVzcyk7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJIlJTRFAgbG9jYXRlZCBhdCAlcCwgUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYIFxuIiwKLQkJYWNwaV9nYmxfUlNEUCwKLQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzLnBvaW50ZXIudmFsdWUpKSk7CisJYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzKCZhZGRyZXNzKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJSU0RQIGxvY2F0ZWQgYXQgJXAsIFJTRFQgcGh5c2ljYWw9JTguOFglOC44WCBcbiIsCisJCQkgIGFjcGlfZ2JsX1JTRFAsCisJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLnBvaW50ZXIudmFsdWUpKSk7CiAKIAkvKiBJbnNlcnQgcHJvY2Vzc29yX21vZGUgZmxhZ3MgKi8KIApAQCAtMjQ4LDMwICsyNjEsMzAgQEAKIAogCS8qIEdldCBhbmQgdmFsaWRhdGUgdGhlIFJTRFQgKi8KIAotCXJzZHRfaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisJcnNkdF9pbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CiAJaWYgKCFyc2R0X2luZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZSAoJmFkZHJlc3MsIHJzZHRfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlKCZhZGRyZXNzLCByc2R0X2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV90Yl92YWxpZGF0ZV9yc2R0IChyc2R0X2luZm8tPnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3JzZHQocnNkdF9pbmZvLT5wb2ludGVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIEFsbG9jYXRlIGEgc2NyYXRjaCB0YWJsZSBoZWFkZXIgYW5kIHRhYmxlIGRlc2NyaXB0b3IgKi8KIAotCWhlYWRlciA9IEFDUElfTUVNX0FMTE9DQVRFIChzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCWhlYWRlciA9IEFDUElfTUVNX0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAlpZiAoIWhlYWRlcikgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQl0YWJsZV9pbmZvID0gQUNQSV9NRU1fQUxMT0NBVEUgKHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCXRhYmxlX2luZm8gPSBBQ1BJX01FTV9BTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCWlmICghdGFibGVfaW5mbykgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI3OSw3ICsyOTIsOCBAQAogCiAJLyogR2V0IHRoZSBudW1iZXIgb2YgdGFibGUgcG9pbnRlcnMgd2l0aGluIHRoZSBSU0RUICovCiAKLQl0YWJsZV9jb3VudCA9IGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50IChhY3BpX2dibF9SU0RQLCByc2R0X2luZm8tPnBvaW50ZXIpOworCXRhYmxlX2NvdW50ID0KKwkgICAgYWNwaV90Yl9nZXRfdGFibGVfY291bnQoYWNwaV9nYmxfUlNEUCwgcnNkdF9pbmZvLT5wb2ludGVyKTsKIAlhZGRyZXNzLnBvaW50ZXJfdHlwZSA9IGFjcGlfZ2JsX3RhYmxlX2ZsYWdzIHwgZmxhZ3M7CiAKIAkvKgpAQCAtMjg3LDM1ICszMDEsNDIgQEAKIAkgKiByZXF1ZXN0ZWQgdGFibGUKIAkgKi8KIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHRhYmxlX2NvdW50OyBpKyspIHsKLQkJLyogR2V0IHRoZSBuZXh0IHRhYmxlIHBvaW50ZXIsIGhhbmRsZSBSU0RUIHZzLiBYU0RUICovCi0KLQkJaWYgKGFjcGlfZ2JsX1JTRFAtPnJldmlzaW9uIDwgMikgewotCQkJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0gKEFDUElfQ0FTVF9QVFIgKAotCQkJCVJTRFRfREVTQ1JJUFRPUiwgcnNkdF9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKLQkJfQotCQllbHNlIHsKLQkJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IChBQ1BJX0NBU1RfUFRSICgKLQkJCQlYU0RUX0RFU0NSSVBUT1IsIHJzZHRfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV07CisJCS8qCisJCSAqIEdldCB0aGUgbmV4dCB0YWJsZSBwb2ludGVyLCBoYW5kbGUgUlNEVCB2cy4gWFNEVAorCQkgKiBSU0RUIHBvaW50ZXJzIGFyZSAzMiBiaXRzLCBYU0RUIHBvaW50ZXJzIGFyZSA2NCBiaXRzCisJCSAqLworCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7CisJCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPQorCQkJICAgIChBQ1BJX0NBU1RfUFRSCisJCQkgICAgIChSU0RUX0RFU0NSSVBUT1IsCisJCQkgICAgICByc2R0X2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOworCQl9IGVsc2UgeworCQkJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0KKwkJCSAgICAoQUNQSV9DQVNUX1BUUgorCQkJICAgICAoWFNEVF9ERVNDUklQVE9SLAorCQkJICAgICAgcnNkdF9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKIAkJfQogCiAJCS8qIEdldCB0aGUgdGFibGUgaGVhZGVyICovCiAKLQkJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyICgmYWRkcmVzcywgaGVhZGVyKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoJmFkZHJlc3MsIGhlYWRlcik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKIAkJLyogQ29tcGFyZSB0YWJsZSBzaWduYXR1cmVzIGFuZCB0YWJsZSBpbnN0YW5jZSAqLwogCi0JCWlmICghQUNQSV9TVFJOQ01QIChoZWFkZXItPnNpZ25hdHVyZSwgc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkpIHsKKwkJaWYgKCFBQ1BJX1NUUk5DTVAoaGVhZGVyLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpKSB7CiAJCQkvKiBBbiBpbnN0YW5jZSBvZiB0aGUgdGFibGUgd2FzIGZvdW5kICovCiAKIAkJCWorKzsKIAkJCWlmIChqID49IGluc3RhbmNlKSB7CiAJCQkJLyogRm91bmQgdGhlIGNvcnJlY3QgaW5zdGFuY2UsIGdldCB0aGUgZW50aXJlIHRhYmxlICovCiAKLQkJCQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5ICgmYWRkcmVzcywgaGVhZGVyLCB0YWJsZV9pbmZvKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV90Yl9nZXRfdGFibGVfYm9keSgmYWRkcmVzcywgaGVhZGVyLAorCQkJCQkJCSAgIHRhYmxlX2luZm8pOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJfQogCkBAIC0zMjksMjIgKzM1MCwyMyBAQAogCiAJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCi0KLWNsZWFudXA6Ci0JYWNwaV9vc191bm1hcF9tZW1vcnkgKHJzZHRfaW5mby0+cG9pbnRlciwKLQkJKGFjcGlfc2l6ZSkgcnNkdF9pbmZvLT5wb2ludGVyLT5sZW5ndGgpOwotCUFDUElfTUVNX0ZSRUUgKHJzZHRfaW5mbyk7CisgICAgICBjbGVhbnVwOgorCWlmIChyc2R0X2luZm8tPnBvaW50ZXIpIHsKKwkJYWNwaV9vc191bm1hcF9tZW1vcnkocnNkdF9pbmZvLT5wb2ludGVyLAorCQkJCSAgICAgKGFjcGlfc2l6ZSkgcnNkdF9pbmZvLT5wb2ludGVyLT5sZW5ndGgpOworCX0KKwlBQ1BJX01FTV9GUkVFKHJzZHRfaW5mbyk7CiAKIAlpZiAoaGVhZGVyKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKGhlYWRlcik7CisJCUFDUElfTUVNX0ZSRUUoaGVhZGVyKTsKIAl9CiAJaWYgKHRhYmxlX2luZm8pIHsKLQkJQUNQSV9NRU1fRlJFRSAodGFibGVfaW5mbyk7CisJCUFDUElfTUVNX0ZSRUUodGFibGVfaW5mbyk7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfZmlybXdhcmVfdGFibGUpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKTsKIAogLyogVEJEOiBNb3ZlIHRvIGEgbmV3IGZpbGUgKi8KIApAQCAtMzYzLDM1ICszODUsMjkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9maW5kX3Jvb3RfcG9pbnRlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICpyc2RwX2FkZHJlc3MpCithY3BpX3N0YXR1cyBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKHUzMiBmbGFncywgc3RydWN0IGFjcGlfcG9pbnRlciAqcnNkcF9hZGRyZXNzKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgdGFibGVfaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9maW5kX3Jvb3RfcG9pbnRlciIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9maW5kX3Jvb3RfcG9pbnRlciIpOwogCiAJLyogR2V0IHRoZSBSU0RQICovCiAKLQlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfcnNkcCAoJnRhYmxlX2luZm8sIGZsYWdzKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlJTRFAgc3RydWN0dXJlIG5vdCBmb3VuZCwgJXMgRmxhZ3M9JVhcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGZsYWdzKSk7CisJc3RhdHVzID0gYWNwaV90Yl9maW5kX3JzZHAoJnRhYmxlX2luZm8sIGZsYWdzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJSU0RQIHN0cnVjdHVyZSBub3QgZm91bmQsICVzIEZsYWdzPSVYXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGZsYWdzKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCiAJcnNkcF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPSBBQ1BJX1BIWVNJQ0FMX1BPSU5URVI7CiAJcnNkcF9hZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsID0gdGFibGVfaW5mby5waHlzaWNhbF9hZGRyZXNzOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcApAQCAtNDA1LDY4ICs0MjEsNDUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdTggKgotYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnRfYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkKK3N0YXRpYyB1OCAqYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCh1OCAqIHN0YXJ0X2FkZHJlc3MsIHUzMiBsZW5ndGgpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVtX3JvdmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVuZF9hZGRyZXNzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW07CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICptZW1fcm92ZXI7CisJdTggKmVuZF9hZGRyZXNzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwIik7CiAKIAllbmRfYWRkcmVzcyA9IHN0YXJ0X2FkZHJlc3MgKyBsZW5ndGg7CiAKIAkvKiBTZWFyY2ggZnJvbSBnaXZlbiBzdGFydCBhZGRyZXNzIGZvciB0aGUgcmVxdWVzdGVkIGxlbmd0aCAqLwogCiAJZm9yIChtZW1fcm92ZXIgPSBzdGFydF9hZGRyZXNzOyBtZW1fcm92ZXIgPCBlbmRfYWRkcmVzczsKLQkJIG1lbV9yb3ZlciArPSBBQ1BJX1JTRFBfU0NBTl9TVEVQKSB7Ci0JCS8qIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0ICovCisJICAgICBtZW1fcm92ZXIgKz0gQUNQSV9SU0RQX1NDQU5fU1RFUCkgeworCQkvKiBUaGUgUlNEUCBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0ICovCiAKLQkJaWYgKEFDUElfU1RSTkNNUCAoKGNoYXIgKikgbWVtX3JvdmVyLAotCQkJCVJTRFBfU0lHLCBzaXplb2YgKFJTRFBfU0lHKSAtIDEpICE9IDApIHsKLQkJCS8qIE5vIHNpZ25hdHVyZSBtYXRjaCwga2VlcCBsb29raW5nICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoQUNQSV9DQVNUX1BUUgorCQkJCQkgIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLCBtZW1fcm92ZXIpKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKiBTaWcgYW5kIGNoZWNrc3VtIHZhbGlkLCB3ZSBoYXZlIGZvdW5kIGEgcmVhbCBSU0RQICovCiAKLQkJCWNvbnRpbnVlOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJSU0RQIGxvY2F0ZWQgYXQgcGh5c2ljYWwgYWRkcmVzcyAlcFxuIiwKKwkJCQkJICBtZW1fcm92ZXIpKTsKKwkJCXJldHVybl9QVFIobWVtX3JvdmVyKTsKIAkJfQogCi0JCS8qIFNpZ25hdHVyZSBtYXRjaGVzLCBjaGVjayB0aGUgYXBwcm9wcmlhdGUgY2hlY2tzdW0gKi8KLQotCQlpZiAoKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IsIG1lbV9yb3ZlcikpLT5yZXZpc2lvbiA8IDIpIHsKLQkJCS8qIEFDUEkgdmVyc2lvbiAxLjAgKi8KLQotCQkJY2hlY2tzdW0gPSBhY3BpX3RiX2NoZWNrc3VtIChtZW1fcm92ZXIsIEFDUElfUlNEUF9DSEVDS1NVTV9MRU5HVEgpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogUG9zdCBBQ1BJIDEuMCwgdXNlIGV4dGVuZGVkX2NoZWNrc3VtICovCi0KLQkJCWNoZWNrc3VtID0gYWNwaV90Yl9jaGVja3N1bSAobWVtX3JvdmVyLCBBQ1BJX1JTRFBfWENIRUNLU1VNX0xFTkdUSCk7Ci0JCX0KLQotCQlpZiAoY2hlY2tzdW0gPT0gMCkgewotCQkJLyogQ2hlY2tzdW0gdmFsaWQsIHdlIGhhdmUgZm91bmQgYSB2YWxpZCBSU0RQICovCi0KLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJIlJTRFAgbG9jYXRlZCBhdCBwaHlzaWNhbCBhZGRyZXNzICVwXG4iLCBtZW1fcm92ZXIpKTsKLQkJCXJldHVybl9QVFIgKG1lbV9yb3Zlcik7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAotCQkJIkZvdW5kIGFuIFJTRFAgYXQgcGh5c2ljYWwgYWRkcmVzcyAlcCwgYnV0IGl0IGhhcyBhIGJhZCBjaGVja3N1bVxuIiwKLQkJCW1lbV9yb3ZlcikpOworCQkvKiBObyBzaWcgbWF0Y2ggb3IgYmFkIGNoZWNrc3VtLCBrZWVwIHNlYXJjaGluZyAqLwogCX0KIAogCS8qIFNlYXJjaGVkIGVudGlyZSBibG9jaywgbm8gUlNEUCB3YXMgZm91bmQgKi8KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSJTZWFyY2hlZCBlbnRpcmUgYmxvY2ssIG5vIHZhbGlkIFJTRFAgd2FzIGZvdW5kLlxuIikpOwotCXJldHVybl9QVFIgKE5VTEwpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIlNlYXJjaGVkIGVudGlyZSBibG9jayBmcm9tICVwLCB2YWxpZCBSU0RQIHdhcyBub3QgZm91bmRcbiIsCisJCQkgIHN0YXJ0X2FkZHJlc3MpKTsKKwlyZXR1cm5fUFRSKE5VTEwpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZmluZF9yc2RwCkBAIC00OTAsMTggKzQ4MywxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2ZpbmRfcnNkcCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQorYWNwaV90Yl9maW5kX3JzZHAoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTMyIGZsYWdzKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhYmxlX3B0cjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZW1fcm92ZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbF9hZGRyZXNzOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXU4ICp0YWJsZV9wdHI7CisJdTggKm1lbV9yb3ZlcjsKKwl1MzIgcGh5c2ljYWxfYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9maW5kX3JzZHAiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2ZpbmRfcnNkcCIpOwogCiAJLyoKIAkgKiBTY2FuIHN1cHBvcnRzIGVpdGhlciBsb2dpY2FsIGFkZHJlc3Npbmcgb3IgcGh5c2ljYWwgYWRkcmVzc2luZwpAQCAtNTA5LDIzICs0OTgsMjUgQEAKIAlpZiAoKGZsYWdzICYgQUNQSV9NRU1PUllfTU9ERSkgPT0gQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcpIHsKIAkJLyogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEV4dGVuZGVkIEJJT1MgRGF0YSBBcmVhIChFQkRBKSAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoCi0JCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sCi0JCQkJIEFDUElfRUJEQV9QVFJfTEVOR1RILCAodm9pZCAqKSAmdGFibGVfcHRyKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCi0JCQkJQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwgQUNQSV9FQkRBX1BUUl9MRU5HVEgpKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLAorCQkJCQkgICAgQUNQSV9FQkRBX1BUUl9MRU5HVEgsCisJCQkJCSAgICAodm9pZCAqKSZ0YWJsZV9wdHIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCisJCQkJCSAgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKKwkJCQkJICBBQ1BJX0VCREFfUFRSX0xFTkdUSCkpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCUFDUElfTU9WRV8xNl9UT18zMiAoJnBoeXNpY2FsX2FkZHJlc3MsIHRhYmxlX3B0cik7CisJCUFDUElfTU9WRV8xNl9UT18zMigmcGh5c2ljYWxfYWRkcmVzcywgdGFibGVfcHRyKTsKIAogCQkvKiBDb252ZXJ0IHNlZ21lbnQgcGFydCB0byBwaHlzaWNhbCBhZGRyZXNzICovCiAKIAkJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHRhYmxlX3B0ciwgQUNQSV9FQkRBX1BUUl9MRU5HVEgpOworCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfRUJEQV9QVFJfTEVOR1RIKTsKIAogCQkvKiBFQkRBIHByZXNlbnQ/ICovCiAKQEAgLTUzNCw1OSArNTI1LDY3IEBACiAJCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEYSBpcyByZXF1aXJlZCB0byBiZSBhCiAJCQkgKiAgICAgbWluaW11bSBvZiAxX2sgbGVuZ3RoKQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKAotCQkJCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzcywKLQkJCQkJIEFDUElfRUJEQV9XSU5ET1dfU0laRSwgKHZvaWQgKikgJnRhYmxlX3B0cik7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAotCQkJCQlwaHlzaWNhbF9hZGRyZXNzLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpKTsKKwkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkJICAgIHBoeXNpY2FsX2FkZHJlc3MsCisJCQkJCQkgICAgQUNQSV9FQkRBX1dJTkRPV19TSVpFLAorCQkJCQkJICAgICh2b2lkICopJnRhYmxlX3B0cik7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkJICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKKwkJCQkJCSAgcGh5c2ljYWxfYWRkcmVzcywKKwkJCQkJCSAgQUNQSV9FQkRBX1dJTkRPV19TSVpFKSk7CiAKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CiAKLQkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKHRhYmxlX3B0ciwKLQkJCQkJICBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwotCQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHRhYmxlX3B0ciwgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKKwkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodGFibGVfcHRyLAorCQkJCQkJCQkgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKKwkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKIAogCQkJaWYgKG1lbV9yb3ZlcikgewotCQkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCQkJCXBoeXNpY2FsX2FkZHJlc3MgKz0gQUNQSV9QVFJfRElGRiAobWVtX3JvdmVyLCB0YWJsZV9wdHIpOworCQkJCXBoeXNpY2FsX2FkZHJlc3MgKz0KKwkJCQkgICAgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsIHRhYmxlX3B0cik7CiAKIAkJCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0KLQkJCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQkJfQogCQl9CiAKIAkJLyoKIAkJICogMikgU2VhcmNoIHVwcGVyIG1lbW9yeTogMTYtYnl0ZSBib3VuZGFyaWVzIGluIEUwMDAwaC1GRkZGRmgKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoCi0JCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKLQkJCQkgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFLCAodm9pZCAqKSAmdGFibGVfcHRyKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCisJCQkJCSAgICBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUsCisJCQkJCSAgICAodm9pZCAqKSZ0YWJsZV9wdHIpOwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAotCQkJCUFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKKwkJCQkJICBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCisJCQkJCSAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKSk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAodGFibGVfcHRyLCBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwotCQlhY3BpX29zX3VubWFwX21lbW9yeSAodGFibGVfcHRyLCBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOworCQltZW1fcm92ZXIgPQorCQkgICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCh0YWJsZV9wdHIsCisJCQkJCQkgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKKwkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfcHRyLCBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwogCiAJCWlmIChtZW1fcm92ZXIpIHsKLQkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJCS8qIFJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLwogCiAJCQlwaHlzaWNhbF9hZGRyZXNzID0KLQkJCQlBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgKyBBQ1BJX1BUUl9ESUZGIChtZW1fcm92ZXIsIHRhYmxlX3B0cik7CisJCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsCisJCQkJCQkJCSAgICAgdGFibGVfcHRyKTsKIAogCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcGh5c2ljYWxfYWRkcmVzczsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAJfQogCkBAIC01OTYsOCArNTk1LDggQEAKIAllbHNlIHsKIAkJLyogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEVCREEgKi8KIAotCQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZwaHlzaWNhbF9hZGRyZXNzLCBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OKTsKLQkJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsgICAgIC8qIENvbnZlcnQgc2VnbWVudCB0byBwaHlzaWNhbCBhZGRyZXNzICovCisJCUFDUElfTU9WRV8xNl9UT18zMigmcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1BUUl9MT0NBVElPTik7CisJCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7CS8qIENvbnZlcnQgc2VnbWVudCB0byBwaHlzaWNhbCBhZGRyZXNzICovCiAKIAkJLyogRUJEQSBwcmVzZW50PyAqLwogCkBAIC02MDYsMzQgKzYwNSwzOCBAQAogCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYSBtaW5pbXVtIG9mCiAJCQkgKiAgICAgMV9rIGxlbmd0aCkKIAkJCSAqLwotCQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCi0JCQkJCSAgQUNQSV9QSFlTQUREUl9UT19QVFIgKHBoeXNpY2FsX2FkZHJlc3MpLAotCQkJCQkgIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisJCQltZW1fcm92ZXIgPQorCQkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAoQUNQSV9QSFlTQUREUl9UT19QVFIKKwkJCQkJCQkgKHBoeXNpY2FsX2FkZHJlc3MpLAorCQkJCQkJCSBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwogCQkJaWYgKG1lbV9yb3ZlcikgewotCQkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCQkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPSBBQ1BJX1RPX0lOVEVHRVIgKG1lbV9yb3Zlcik7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CisJCQkJICAgIEFDUElfVE9fSU5URUdFUihtZW1fcm92ZXIpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9CiAJCX0KIAogCQkvKiAyKSBTZWFyY2ggdXBwZXIgbWVtb3J5OiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gRTAwMDBoLUZGRkZGaCAqLwogCi0JCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAotCQkJCSAgQUNQSV9QSFlTQUREUl9UT19QVFIgKEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSksCi0JCQkJICBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOworCQltZW1fcm92ZXIgPQorCQkgICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcChBQ1BJX1BIWVNBRERSX1RPX1BUUgorCQkJCQkJIChBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UpLAorCQkJCQkJIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CiAJCWlmIChtZW1fcm92ZXIpIHsKIAkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9IEFDUElfVE9fSU5URUdFUiAobWVtX3JvdmVyKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CisJCQkgICAgQUNQSV9UT19JTlRFR0VSKG1lbV9yb3Zlcik7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCQl9CiAJfQogCi0JLyogUlNEUCBzaWduYXR1cmUgd2FzIG5vdCBmb3VuZCAqLworCS8qIEEgdmFsaWQgUlNEUCB3YXMgbm90IGZvdW5kICovCiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9GT1VORCk7CisJQUNQSV9SRVBPUlRfRVJST1IoKCJObyB2YWxpZCBSU0RQIHdhcyBmb3VuZFxuIikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwogfQogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RoZXJtYWwuYyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKaW5kZXggNzljM2E2OC4uYTI0ODQ3YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtNzAsOSArNzAsOSBAQAogI2RlZmluZSBDRUxTSVVTX1RPX0tFTFZJTih0KQkoKHQrMjczKSoxMCkKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1RIRVJNQUxfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfdGhlcm1hbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3RoZXJtYWwiKQogCi1NT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CisgICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfVEhFUk1BTF9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTgwLDE0MyArODAsMTQ1IEBACiBtb2R1bGVfcGFyYW0odHpwLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0enAsICJUaGVybWFsIHpvbmUgcG9sbGluZyBmcmVxdWVuY3ksIGluIDEvMTAgc2Vjb25kcy5cbiIpOwogCi0KLXN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdHJpcF9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cyAoc3RydWN0IGZpbGUqLGNvbnN0IGNoYXIgX191c2VyICosc2l6ZV90LGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cyhzdHJ1Y3QgZmlsZSAqLAorCQkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCisJCQkJCSAgICAgIGxvZmZfdCAqKTsKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgc3NpemVfdCBhY3BpX3RoZXJtYWxfd3JpdGVfY29vbGluZ19tb2RlIChzdHJ1Y3QgZmlsZSosY29uc3QgY2hhciBfX3VzZXIgKixzaXplX3QsbG9mZl90ICopOworc3RhdGljIHNzaXplX3QgYWNwaV90aGVybWFsX3dyaXRlX2Nvb2xpbmdfbW9kZShzdHJ1Y3QgZmlsZSAqLAorCQkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LAorCQkJCQkgICAgICAgbG9mZl90ICopOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcG9sbGluZ19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IGFjcGlfdGhlcm1hbF93cml0ZV9wb2xsaW5nKHN0cnVjdCBmaWxlKixjb25zdCBjaGFyIF9fdXNlciAqLHNpemVfdCxsb2ZmX3QgKik7CitzdGF0aWMgc3NpemVfdCBhY3BpX3RoZXJtYWxfd3JpdGVfcG9sbGluZyhzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLAorCQkJCQkgIHNpemVfdCwgbG9mZl90ICopOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdGhlcm1hbF9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJQUNQSV9USEVSTUFMX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9CUFDUElfVEhFUk1BTF9DTEFTUywKLQkuaWRzID0JCUFDUElfVEhFUk1BTF9ISUQsCi0JLm9wcyA9CQl7Ci0JCQkJLmFkZCA9CQlhY3BpX3RoZXJtYWxfYWRkLAotCQkJCS5yZW1vdmUgPQlhY3BpX3RoZXJtYWxfcmVtb3ZlLAotCQkJfSwKKwkubmFtZSA9IEFDUElfVEhFUk1BTF9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1RIRVJNQUxfQ0xBU1MsCisJLmlkcyA9IEFDUElfVEhFUk1BTF9ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfdGhlcm1hbF9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX3RoZXJtYWxfcmVtb3ZlLAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfdGhlcm1hbF9zdGF0ZSB7Ci0JdTgJCQljcml0aWNhbDoxOwotCXU4CQkJaG90OjE7Ci0JdTgJCQlwYXNzaXZlOjE7Ci0JdTgJCQlhY3RpdmU6MTsKLQl1OAkJCXJlc2VydmVkOjQ7Ci0JaW50CQkJYWN0aXZlX2luZGV4OworCXU4IGNyaXRpY2FsOjE7CisJdTggaG90OjE7CisJdTggcGFzc2l2ZToxOworCXU4IGFjdGl2ZToxOworCXU4IHJlc2VydmVkOjQ7CisJaW50IGFjdGl2ZV9pbmRleDsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGVfZmxhZ3MgewotCXU4CQkJdmFsaWQ6MTsKLQl1OAkJCWVuYWJsZWQ6MTsKLQl1OAkJCXJlc2VydmVkOjY7CisJdTggdmFsaWQ6MTsKKwl1OCBlbmFibGVkOjE7CisJdTggcmVzZXJ2ZWQ6NjsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfY3JpdGljYWwgewogCXN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGVfZmxhZ3MgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcGVyYXR1cmU7CisJdW5zaWduZWQgbG9uZyB0ZW1wZXJhdHVyZTsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfaG90IHsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX3N0YXRlX2ZsYWdzIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcJCXRlbXBlcmF0dXJlOworCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CiB9OwogCiBzdHJ1Y3QgYWNwaV90aGVybWFsX3Bhc3NpdmUgewogCXN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGVfZmxhZ3MgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcGVyYXR1cmU7Ci0JdW5zaWduZWQgbG9uZwkJdGMxOwotCXVuc2lnbmVkIGxvbmcJCXRjMjsKLQl1bnNpZ25lZCBsb25nCQl0c3A7Ci0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJZGV2aWNlczsKKwl1bnNpZ25lZCBsb25nIHRlbXBlcmF0dXJlOworCXVuc2lnbmVkIGxvbmcgdGMxOworCXVuc2lnbmVkIGxvbmcgdGMyOworCXVuc2lnbmVkIGxvbmcgdHNwOworCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0IGRldmljZXM7CiB9OwogCiBzdHJ1Y3QgYWNwaV90aGVybWFsX2FjdGl2ZSB7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF9zdGF0ZV9mbGFncyBmbGFnczsKLQl1bnNpZ25lZCBsb25nCQl0ZW1wZXJhdHVyZTsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAlkZXZpY2VzOworCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgZGV2aWNlczsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWxfdHJpcHMgewogCXN0cnVjdCBhY3BpX3RoZXJtYWxfY3JpdGljYWwgY3JpdGljYWw7Ci0Jc3RydWN0IGFjcGlfdGhlcm1hbF9ob3QJaG90OworCXN0cnVjdCBhY3BpX3RoZXJtYWxfaG90IGhvdDsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX3Bhc3NpdmUgcGFzc2l2ZTsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX2FjdGl2ZSBhY3RpdmVbQUNQSV9USEVSTUFMX01BWF9BQ1RJVkVdOwogfTsKIAogc3RydWN0IGFjcGlfdGhlcm1hbF9mbGFncyB7Ci0JdTgJCQljb29saW5nX21vZGU6MTsJCS8qIF9TQ1AgKi8KLQl1OAkJCWRldmljZXM6MTsJCS8qIF9UWkQgKi8KLQl1OAkJCXJlc2VydmVkOjY7CisJdTggY29vbGluZ19tb2RlOjE7CS8qIF9TQ1AgKi8KKwl1OCBkZXZpY2VzOjE7CQkvKiBfVFpEICovCisJdTggcmVzZXJ2ZWQ6NjsKIH07CiAKIHN0cnVjdCBhY3BpX3RoZXJtYWwgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JYWNwaV9idXNfaWQJCW5hbWU7Ci0JdW5zaWduZWQgbG9uZwkJdGVtcGVyYXR1cmU7Ci0JdW5zaWduZWQgbG9uZwkJbGFzdF90ZW1wZXJhdHVyZTsKLQl1bnNpZ25lZCBsb25nCQlwb2xsaW5nX2ZyZXF1ZW5jeTsKLQl1OAkJCWNvb2xpbmdfbW9kZTsKLQl2b2xhdGlsZSB1OAkJem9tYmllOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX2J1c19pZCBuYW1lOworCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CisJdW5zaWduZWQgbG9uZyBsYXN0X3RlbXBlcmF0dXJlOworCXVuc2lnbmVkIGxvbmcgcG9sbGluZ19mcmVxdWVuY3k7CisJdTggY29vbGluZ19tb2RlOworCXZvbGF0aWxlIHU4IHpvbWJpZTsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsX2ZsYWdzIGZsYWdzOwogCXN0cnVjdCBhY3BpX3RoZXJtYWxfc3RhdGUgc3RhdGU7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF90cmlwcyB0cmlwczsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAlkZXZpY2VzOwotCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0IGRldmljZXM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfc3RhdGVfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3RoZXJtYWxfc3RhdGVfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV90aGVybWFsX3N0YXRlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfdGVtcF9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfdHJpcF9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdGhlcm1hbF90cmlwX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cywKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV90aGVybWFsX3RyaXBfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IGFjcGlfdGhlcm1hbF93cml0ZV90cmlwX3BvaW50cywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3RoZXJtYWxfY29vbGluZ19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdGhlcm1hbF9jb29saW5nX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGFjcGlfdGhlcm1hbF93cml0ZV9jb29saW5nX21vZGUsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdGhlcm1hbF9jb29saW5nX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3RoZXJtYWxfd3JpdGVfY29vbGluZ19tb2RlLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdGhlcm1hbF9wb2xsaW5nX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV90aGVybWFsX3BvbGxpbmdfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkud3JpdGUJCT0gYWNwaV90aGVybWFsX3dyaXRlX3BvbGxpbmcsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdGhlcm1hbF9wb2xsaW5nX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3RoZXJtYWxfd3JpdGVfcG9sbGluZywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVybWFsIFpvbmUgTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludAotYWNwaV90aGVybWFsX2dldF90ZW1wZXJhdHVyZSAoCi0Jc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2dldF90ZW1wZXJhdHVyZSIpOwogCkBAIC0yMjUsNDEgKzIyNywzOSBAQAogCiAJdHotPmxhc3RfdGVtcGVyYXR1cmUgPSB0ei0+dGVtcGVyYXR1cmU7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UTVAiLCBOVUxMLCAmdHotPnRlbXBlcmF0dXJlKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UTVAiLCBOVUxMLCAmdHotPnRlbXBlcmF0dXJlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlRlbXBlcmF0dXJlIGlzICVsdSBkS1xuIiwgdHotPnRlbXBlcmF0dXJlKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiVGVtcGVyYXR1cmUgaXMgJWx1IGRLXG4iLAorCQkJICB0ei0+dGVtcGVyYXR1cmUpKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfZ2V0X3BvbGxpbmdfZnJlcXVlbmN5ICgKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eikKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2dldF9wb2xsaW5nX2ZyZXF1ZW5jeShzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfZ2V0X3BvbGxpbmdfZnJlcXVlbmN5Iik7CiAKIAlpZiAoIXR6KQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UWlAiLCBOVUxMLCAmdHotPnBvbGxpbmdfZnJlcXVlbmN5KTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9UWlAiLCBOVUxMLAorCQkJCSAgJnR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJQb2xsaW5nIGZyZXF1ZW5jeSBpcyAlbHUgZFNcbiIsIHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlBvbGxpbmcgZnJlcXVlbmN5IGlzICVsdSBkU1xuIiwKKwkJCSAgdHotPnBvbGxpbmdfZnJlcXVlbmN5KSk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX3NldF9wb2xsaW5nICgKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiwKLQlpbnQJCQlzZWNvbmRzKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc2V0X3BvbGxpbmcoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHosIGludCBzZWNvbmRzKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9zZXRfcG9sbGluZyIpOwogCkBAIC0yNjgsMjEgKzI2OCwxOSBAQAogCiAJdHotPnBvbGxpbmdfZnJlcXVlbmN5ID0gc2Vjb25kcyAqIDEwOwkvKiBDb252ZXJ0IHZhbHVlIHRvIGRlY2ktc2Vjb25kcyAqLwogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUG9sbGluZyBmcmVxdWVuY3kgc2V0IHRvICVsdSBzZWNvbmRzXG4iLCB0ei0+cG9sbGluZ19mcmVxdWVuY3kpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJQb2xsaW5nIGZyZXF1ZW5jeSBzZXQgdG8gJWx1IHNlY29uZHNcbiIsCisJCQkgIHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSkpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9zZXRfY29vbGluZ19tb2RlICgKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiwKLQlpbnQJCQltb2RlKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc2V0X2Nvb2xpbmdfbW9kZShzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiwgaW50IG1vZGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0lOVEVHRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CWFyZ19saXN0ID0gezEsICZhcmcwfTsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0geyAxLCAmYXJnMCB9OworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfc2V0X2Nvb2xpbmdfbW9kZSIpOwogCkBAIC0zMDMsMTkgKzMwMSwxNiBAQAogCiAJdHotPmNvb2xpbmdfbW9kZSA9IG1vZGU7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJDb29saW5nIG1vZGUgWyVzXVxuIiwgCi0JCW1vZGU/InBhc3NpdmUiOiJhY3RpdmUiKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQ29vbGluZyBtb2RlIFslc11cbiIsCisJCQkgIG1vZGUgPyAicGFzc2l2ZSIgOiAiYWN0aXZlIikpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9nZXRfdHJpcF9wb2ludHMgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfZ2V0X3RyaXBfcG9pbnRzKHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQlpID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfZ2V0X3RyaXBfcG9pbnRzIik7CiAKQEAgLTMyNCwxMTEgKzMxOSwxMjggQEAKIAogCS8qIENyaXRpY2FsIFNodXRkb3duIChyZXF1aXJlZCkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX0NSVCIsIE5VTEwsIAotCQkmdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9DUlQiLCBOVUxMLAorCQkJCSAgICAgICAmdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJdHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLnZhbGlkID0gMDsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk5vIGNyaXRpY2FsIHRocmVzaG9sZFxuIikpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCA9IDE7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIGNyaXRpY2FsIHRocmVzaG9sZCBbJWx1XVxuIiwgdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJGb3VuZCBjcml0aWNhbCB0aHJlc2hvbGQgWyVsdV1cbiIsCisJCQkJICB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpKTsKIAl9CiAKIAkvKiBDcml0aWNhbCBTbGVlcCAob3B0aW9uYWwpICovCiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmhhbmRsZSwgIl9IT1QiLCBOVUxMLCAmdHotPnRyaXBzLmhvdC50ZW1wZXJhdHVyZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfSE9UIiwgTlVMTCwKKwkJCQkgICZ0ei0+dHJpcHMuaG90LnRlbXBlcmF0dXJlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCA9IDA7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vIGhvdCB0aHJlc2hvbGRcbiIpKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCA9IDE7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIGhvdCB0aHJlc2hvbGQgWyVsdV1cbiIsIHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgaG90IHRocmVzaG9sZCBbJWx1XVxuIiwKKwkJCQkgIHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKIAl9CiAKIAkvKiBQYXNzaXZlOiBQcm9jZXNzb3JzIChvcHRpb25hbCkgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1BTViIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfUFNWIiwgTlVMTCwKKwkJCQkgICZ0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMDsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gcGFzc2l2ZSB0aHJlc2hvbGRcbiIpKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAxOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1RDMSIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50YzEpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfVEMxIiwgTlVMTCwKKwkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudGMxKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1RDMiIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50YzIpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfVEMyIiwgTlVMTCwKKwkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudGMyKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCAiX1RTUCIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50c3ApOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsICJfVFNQIiwgTlVMTCwKKwkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudHNwKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKHR6LT5oYW5kbGUsICJfUFNMIiwgTlVMTCwgJnR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmhhbmRsZSwgIl9QU0wiLCBOVUxMLAorCQkJCQkgICAgJnR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDA7CiAKIAkJaWYgKCF0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgcGFzc2l2ZSB0aHJlc2hvbGRcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJICAiSW52YWxpZCBwYXNzaXZlIHRocmVzaG9sZFxuIikpOwogCQllbHNlCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBwYXNzaXZlIHRocmVzaG9sZCBbJWx1XVxuIiwgdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRm91bmQgcGFzc2l2ZSB0aHJlc2hvbGQgWyVsdV1cbiIsCisJCQkJCSAgdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpKTsKIAl9CiAKIAkvKiBBY3RpdmU6IEZhbnMsIGV0Yy4gKG9wdGlvbmFsKSAqLwogCi0JZm9yIChpPTA7IGk8QUNQSV9USEVSTUFMX01BWF9BQ1RJVkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKSB7CiAKLQkJY2hhciBuYW1lWzVdID0geydfJywnQScsJ0MnLCgnMCcraSksJ1wwJ307CisJCWNoYXIgbmFtZVs1XSA9IHsgJ18nLCAnQScsICdDJywgKCcwJyArIGkpLCAnXDAnIH07CiAKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5oYW5kbGUsIG5hbWUsIE5VTEwsICZ0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+aGFuZGxlLCBuYW1lLCBOVUxMLAorCQkJCQkgICZ0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJYnJlYWs7CiAKIAkJbmFtZVsyXSA9ICdMJzsKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmhhbmRsZSwgbmFtZSwgTlVMTCwgJnR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSh0ei0+aGFuZGxlLCBuYW1lLCBOVUxMLAorCQkJCQkgICAgJnR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcyk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDE7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBhY3RpdmUgdGhyZXNob2xkIFslZF06WyVsdV1cbiIsIGksIHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpKTsKLQkJfQotCQllbHNlCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhY3RpdmUgdGhyZXNob2xkIFslZF1cbiIsIGkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRm91bmQgYWN0aXZlIHRocmVzaG9sZCBbJWRdOlslbHVdXG4iLAorCQkJCQkgIGksIHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpKTsKKwkJfSBlbHNlCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIGFjdGl2ZSB0aHJlc2hvbGQgWyVkXVxuIiwKKwkJCQkJICBpKSk7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9nZXRfZGV2aWNlcyAoCi0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHopCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9nZXRfZGV2aWNlcyhzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfZ2V0X2RldmljZXMiKTsKIAogCWlmICghdHopCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKHR6LT5oYW5kbGUsICJfVFpEIiwgTlVMTCwgJnR6LT5kZXZpY2VzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSh0ei0+aGFuZGxlLCAiX1RaRCIsIE5VTEwsICZ0ei0+ZGV2aWNlcyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX2NhbGxfdXNlcm1vZGUgKAotCWNoYXIJCQkqcGF0aCkKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NhbGxfdXNlcm1vZGUoY2hhciAqcGF0aCkKIHsKLQljaGFyCQkJKmFyZ3ZbMl0gPSB7TlVMTCwgTlVMTH07Ci0JY2hhcgkJCSplbnZwWzNdID0ge05VTEwsIE5VTEwsIE5VTEx9OworCWNoYXIgKmFyZ3ZbMl0gPSB7IE5VTEwsIE5VTEwgfTsKKwljaGFyICplbnZwWzNdID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfY2FsbF91c2VybW9kZSIpOwogCkBAIC00NDAsMTkgKzQ1MiwxNiBAQAogCS8qIG1pbmltYWwgY29tbWFuZCBlbnZpcm9ubWVudCAqLwogCWVudnBbMF0gPSAiSE9NRT0vIjsKIAllbnZwWzFdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOwotCQorCiAJY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCAwKTsKIAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfY3JpdGljYWwgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3JpdGljYWwoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2NyaXRpY2FsIik7CiAKQEAgLTQ2MiwyOSArNDcxLDI4IEBACiAJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiQ3JpdGljYWwgdHJpcCBwb2ludFxuIikpOwogCQl0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCA9IDE7Ci0JfQotCWVsc2UgaWYgKHR6LT50cmlwcy5jcml0aWNhbC5mbGFncy5lbmFibGVkKQorCX0gZWxzZSBpZiAodHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLmVuYWJsZWQpCiAJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy5lbmFibGVkID0gMDsKIAogCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9kZXZpY2UodHotPmhhbmRsZSwgJmRldmljZSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiQ3JpdGljYWwgdGVtcGVyYXR1cmUgcmVhY2hlZCAoJWxkIEMpLCBzaHV0dGluZyBkb3duLlxuIiwgS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7Ci0JYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBBQ1BJX1RIRVJNQUxfTk9USUZZX0NSSVRJQ0FMLCB0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCk7CisJcHJpbnRrKEtFUk5fRU1FUkcKKwkgICAgICAgIkNyaXRpY2FsIHRlbXBlcmF0dXJlIHJlYWNoZWQgKCVsZCBDKSwgc2h1dHRpbmcgZG93bi5cbiIsCisJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50ZW1wZXJhdHVyZSkpOworCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgQUNQSV9USEVSTUFMX05PVElGWV9DUklUSUNBTCwKKwkJCQl0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCk7CiAKIAlhY3BpX3RoZXJtYWxfY2FsbF91c2VybW9kZShBQ1BJX1RIRVJNQUxfUEFUSF9QT1dFUk9GRik7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX2hvdCAoCi0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHopCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9ob3Qoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2hvdCIpOwogCkBAIC00OTQsMzAgKzUwMiwyNyBAQAogCWlmICh0ei0+dGVtcGVyYXR1cmUgPj0gdHotPnRyaXBzLmhvdC50ZW1wZXJhdHVyZSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJIb3QgdHJpcCBwb2ludFxuIikpOwogCQl0ei0+dHJpcHMuaG90LmZsYWdzLmVuYWJsZWQgPSAxOwotCX0KLQllbHNlIGlmICh0ei0+dHJpcHMuaG90LmZsYWdzLmVuYWJsZWQpCisJfSBlbHNlIGlmICh0ei0+dHJpcHMuaG90LmZsYWdzLmVuYWJsZWQpCiAJCXR6LT50cmlwcy5ob3QuZmxhZ3MuZW5hYmxlZCA9IDA7CiAKIAlyZXN1bHQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKHR6LT5oYW5kbGUsICZkZXZpY2UpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybl9WQUxVRShyZXN1bHQpOwogCi0JYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBBQ1BJX1RIRVJNQUxfTk9USUZZX0hPVCwgdHotPnRyaXBzLmhvdC5mbGFncy5lbmFibGVkKTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIEFDUElfVEhFUk1BTF9OT1RJRllfSE9ULAorCQkJCXR6LT50cmlwcy5ob3QuZmxhZ3MuZW5hYmxlZCk7CiAKIAkvKiBUQkQ6IENhbGwgdXNlci1tb2RlICJzbGVlcChTNCkiIGZ1bmN0aW9uICovCiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX3Bhc3NpdmUgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcGFzc2l2ZShzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBhY3BpX3RoZXJtYWxfcGFzc2l2ZSAqcGFzc2l2ZSA9IE5VTEw7Ci0JaW50CQkJdHJlbmQgPSAwOwotCWludAkJCWkgPSAwOworCWludCB0cmVuZCA9IDA7CisJaW50IGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3Bhc3NpdmUiKTsKIApAQCAtNTM0LDI1ICs1MzksMjkgQEAKIAkgKiBhY2NvcmRpbmdseS4gIE5vdGUgdGhhdCB3ZSBhc3N1bWUgc3ltbWV0cnkuCiAJICovCiAJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSBwYXNzaXZlLT50ZW1wZXJhdHVyZSkgewotCQl0cmVuZCA9IChwYXNzaXZlLT50YzEgKiAodHotPnRlbXBlcmF0dXJlIC0gdHotPmxhc3RfdGVtcGVyYXR1cmUpKSArIChwYXNzaXZlLT50YzIgKiAodHotPnRlbXBlcmF0dXJlIC0gcGFzc2l2ZS0+dGVtcGVyYXR1cmUpKTsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAKLQkJCSJ0cmVuZFslZF09KHRjMVslbHVdKih0bXBbJWx1XS1sYXN0WyVsdV0pKSsodGMyWyVsdV0qKHRtcFslbHVdLXBzdlslbHVdKSlcbiIsIAotCQkJdHJlbmQsIHBhc3NpdmUtPnRjMSwgdHotPnRlbXBlcmF0dXJlLCAKLQkJCXR6LT5sYXN0X3RlbXBlcmF0dXJlLCBwYXNzaXZlLT50YzIsIAotCQkJdHotPnRlbXBlcmF0dXJlLCBwYXNzaXZlLT50ZW1wZXJhdHVyZSkpOworCQl0cmVuZCA9CisJCSAgICAocGFzc2l2ZS0+dGMxICogKHR6LT50ZW1wZXJhdHVyZSAtIHR6LT5sYXN0X3RlbXBlcmF0dXJlKSkgKworCQkgICAgKHBhc3NpdmUtPnRjMiAqICh0ei0+dGVtcGVyYXR1cmUgLSBwYXNzaXZlLT50ZW1wZXJhdHVyZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAidHJlbmRbJWRdPSh0YzFbJWx1XSoodG1wWyVsdV0tbGFzdFslbHVdKSkrKHRjMlslbHVdKih0bXBbJWx1XS1wc3ZbJWx1XSkpXG4iLAorCQkJCSAgdHJlbmQsIHBhc3NpdmUtPnRjMSwgdHotPnRlbXBlcmF0dXJlLAorCQkJCSAgdHotPmxhc3RfdGVtcGVyYXR1cmUsIHBhc3NpdmUtPnRjMiwKKwkJCQkgIHR6LT50ZW1wZXJhdHVyZSwgcGFzc2l2ZS0+dGVtcGVyYXR1cmUpKTsKIAkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MuZW5hYmxlZCA9IDE7CiAJCS8qIEhlYXRpbmcgdXA/ICovCiAJCWlmICh0cmVuZCA+IDApCi0JCQlmb3IgKGk9MDsgaTxwYXNzaXZlLT5kZXZpY2VzLmNvdW50OyBpKyspCi0JCQkJYWNwaV9wcm9jZXNzb3Jfc2V0X3RoZXJtYWxfbGltaXQoCi0JCQkJCXBhc3NpdmUtPmRldmljZXMuaGFuZGxlc1tpXSwgCi0JCQkJCUFDUElfUFJPQ0VTU09SX0xJTUlUX0lOQ1JFTUVOVCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgcGFzc2l2ZS0+ZGV2aWNlcy5jb3VudDsgaSsrKQorCQkJCWFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KHBhc3NpdmUtPgorCQkJCQkJCQkgZGV2aWNlcy4KKwkJCQkJCQkJIGhhbmRsZXNbaV0sCisJCQkJCQkJCSBBQ1BJX1BST0NFU1NPUl9MSU1JVF9JTkNSRU1FTlQpOwogCQkvKiBDb29saW5nIG9mZj8gKi8KIAkJZWxzZSBpZiAodHJlbmQgPCAwKQotCQkJZm9yIChpPTA7IGk8cGFzc2l2ZS0+ZGV2aWNlcy5jb3VudDsgaSsrKQotCQkJCWFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KAotCQkJCQlwYXNzaXZlLT5kZXZpY2VzLmhhbmRsZXNbaV0sIAotCQkJCQlBQ1BJX1BST0NFU1NPUl9MSU1JVF9ERUNSRU1FTlQpOworCQkJZm9yIChpID0gMDsgaSA8IHBhc3NpdmUtPmRldmljZXMuY291bnQ7IGkrKykKKwkJCQlhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdChwYXNzaXZlLT4KKwkJCQkJCQkJIGRldmljZXMuCisJCQkJCQkJCSBoYW5kbGVzW2ldLAorCQkJCQkJCQkgQUNQSV9QUk9DRVNTT1JfTElNSVRfREVDUkVNRU5UKTsKIAl9CiAKIAkvKgpAQCAtNTYzLDM3ICs1NzIsMzUgQEAKIAkgKiBhc3N1bWUgc3ltbWV0cnkuCiAJICovCiAJZWxzZSBpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MuZW5hYmxlZCkgewotCQlmb3IgKGk9MDsgaTxwYXNzaXZlLT5kZXZpY2VzLmNvdW50OyBpKyspCi0JCQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdCgKLQkJCQlwYXNzaXZlLT5kZXZpY2VzLmhhbmRsZXNbaV0sIAotCQkJCUFDUElfUFJPQ0VTU09SX0xJTUlUX0RFQ1JFTUVOVCk7CisJCWZvciAoaSA9IDA7IGkgPCBwYXNzaXZlLT5kZXZpY2VzLmNvdW50OyBpKyspCisJCQlyZXN1bHQgPQorCQkJICAgIGFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KHBhc3NpdmUtPmRldmljZXMuCisJCQkJCQkJICAgICBoYW5kbGVzW2ldLAorCQkJCQkJCSAgICAgQUNQSV9QUk9DRVNTT1JfTElNSVRfREVDUkVNRU5UKTsKIAkJaWYgKHJlc3VsdCA9PSAxKSB7CiAJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy5lbmFibGVkID0gMDsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgCi0JCQkJIkRpc2FibGluZyBwYXNzaXZlIGNvb2xpbmcgKHpvbmUgaXMgY29vbClcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRGlzYWJsaW5nIHBhc3NpdmUgY29vbGluZyAoem9uZSBpcyBjb29sKVxuIikpOwogCQl9CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdGhlcm1hbF9hY3RpdmUgKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWN0aXZlKHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF9hY3RpdmUgKmFjdGl2ZSA9IE5VTEw7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgaSA9IDA7Ci0JaW50CQkJaiA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJbWF4dGVtcCA9IDA7CisJaW50IGkgPSAwOworCWludCBqID0gMDsKKwl1bnNpZ25lZCBsb25nIG1heHRlbXAgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2FjdGl2ZSIpOwogCiAJaWYgKCF0eikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JZm9yIChpPTA7IGk8QUNQSV9USEVSTUFMX01BWF9BQ1RJVkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKSB7CiAKIAkJYWN0aXZlID0gJih0ei0+dHJpcHMuYWN0aXZlW2ldKTsKIAkJaWYgKCFhY3RpdmUgfHwgIWFjdGl2ZS0+ZmxhZ3MudmFsaWQpCkBAIC02MDcsMTYgKzYxNCwyNyBAQAogCQkgKi8KIAkJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSBhY3RpdmUtPnRlbXBlcmF0dXJlKSB7CiAJCQlpZiAoYWN0aXZlLT50ZW1wZXJhdHVyZSA+IG1heHRlbXApCi0JCQkJdHotPnN0YXRlLmFjdGl2ZV9pbmRleCA9IGksIG1heHRlbXAgPSBhY3RpdmUtPnRlbXBlcmF0dXJlOworCQkJCXR6LT5zdGF0ZS5hY3RpdmVfaW5kZXggPSBpLCBtYXh0ZW1wID0KKwkJCQkgICAgYWN0aXZlLT50ZW1wZXJhdHVyZTsKIAkJCWlmICghYWN0aXZlLT5mbGFncy5lbmFibGVkKSB7CiAJCQkJZm9yIChqID0gMDsgaiA8IGFjdGl2ZS0+ZGV2aWNlcy5jb3VudDsgaisrKSB7Ci0JCQkJCXJlc3VsdCA9IGFjcGlfYnVzX3NldF9wb3dlcihhY3RpdmUtPmRldmljZXMuaGFuZGxlc1tqXSwgQUNQSV9TVEFURV9EMCk7CisJCQkJCXJlc3VsdCA9CisJCQkJCSAgICBhY3BpX2J1c19zZXRfcG93ZXIoYWN0aXZlLT5kZXZpY2VzLgorCQkJCQkJCSAgICAgICBoYW5kbGVzW2pdLAorCQkJCQkJCSAgICAgICBBQ1BJX1NUQVRFX0QwKTsKIAkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiVW5hYmxlIHRvIHR1cm4gY29vbGluZyBkZXZpY2UgWyVwXSAnb24nXG4iLCBhY3RpdmUtPmRldmljZXMuaGFuZGxlc1tqXSkpOworCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJCQkgICJVbmFibGUgdG8gdHVybiBjb29saW5nIGRldmljZSBbJXBdICdvbidcbiIsCisJCQkJCQkJCSAgYWN0aXZlLT4KKwkJCQkJCQkJICBkZXZpY2VzLgorCQkJCQkJCQkgIGhhbmRsZXNbal0pKTsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAJCQkJCWFjdGl2ZS0+ZmxhZ3MuZW5hYmxlZCA9IDE7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkNvb2xpbmcgZGV2aWNlIFslcF0gbm93ICdvbidcbiIsIGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdKSk7CisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJCQkgICJDb29saW5nIGRldmljZSBbJXBdIG5vdyAnb24nXG4iLAorCQkJCQkJCSAgYWN0aXZlLT5kZXZpY2VzLgorCQkJCQkJCSAgaGFuZGxlc1tqXSkpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNjI4LDEzICs2NDYsMjEgQEAKIAkJICovCiAJCWVsc2UgaWYgKGFjdGl2ZS0+ZmxhZ3MuZW5hYmxlZCkgewogCQkJZm9yIChqID0gMDsgaiA8IGFjdGl2ZS0+ZGV2aWNlcy5jb3VudDsgaisrKSB7Ci0JCQkJcmVzdWx0ID0gYWNwaV9idXNfc2V0X3Bvd2VyKGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdLCBBQ1BJX1NUQVRFX0QzKTsKKwkJCQlyZXN1bHQgPQorCQkJCSAgICBhY3BpX2J1c19zZXRfcG93ZXIoYWN0aXZlLT5kZXZpY2VzLgorCQkJCQkJICAgICAgIGhhbmRsZXNbal0sCisJCQkJCQkgICAgICAgQUNQSV9TVEFURV9EMyk7CiAJCQkJaWYgKHJlc3VsdCkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJVbmFibGUgdG8gdHVybiBjb29saW5nIGRldmljZSBbJXBdICdvZmYnXG4iLCBhY3RpdmUtPmRldmljZXMuaGFuZGxlc1tqXSkpOworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCQkJICAiVW5hYmxlIHRvIHR1cm4gY29vbGluZyBkZXZpY2UgWyVwXSAnb2ZmJ1xuIiwKKwkJCQkJCQkgIGFjdGl2ZS0+ZGV2aWNlcy4KKwkJCQkJCQkgIGhhbmRsZXNbal0pKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWFjdGl2ZS0+ZmxhZ3MuZW5hYmxlZCA9IDA7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQ29vbGluZyBkZXZpY2UgWyVwXSBub3cgJ29mZidcbiIsIGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiQ29vbGluZyBkZXZpY2UgWyVwXSBub3cgJ29mZidcbiIsCisJCQkJCQkgIGFjdGl2ZS0+ZGV2aWNlcy5oYW5kbGVzW2pdKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC02NDIsMjggKzY2OCwyMiBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAorc3RhdGljIHZvaWQgYWNwaV90aGVybWFsX2NoZWNrKHZvaWQgKmNvbnRleHQpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3RoZXJtYWxfY2hlY2sgKHZvaWQgKmNvbnRleHQpOwotCi1zdGF0aWMgdm9pZAotYWNwaV90aGVybWFsX3J1biAoCi0JdW5zaWduZWQgbG9uZwkJZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfdGhlcm1hbF9ydW4odW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilkYXRhOwogCWlmICghdHotPnpvbWJpZSkKLQkJYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsICAKLQkJCWFjcGlfdGhlcm1hbF9jaGVjaywgKHZvaWQgKikgZGF0YSk7CisJCWFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAorCQkJCQkgICAgYWNwaV90aGVybWFsX2NoZWNrLCAodm9pZCAqKWRhdGEpOwogfQogCi0KLXN0YXRpYyB2b2lkCi1hY3BpX3RoZXJtYWxfY2hlY2sgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV90aGVybWFsX2NoZWNrKHZvaWQgKmRhdGEpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopIGRhdGE7Ci0JdW5zaWduZWQgbG9uZwkJc2xlZXBfdGltZSA9IDA7Ci0JaW50CQkJaSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBzbGVlcF90aW1lID0gMDsKKwlpbnQgaSA9IDA7CiAJc3RydWN0IGFjcGlfdGhlcm1hbF9zdGF0ZSBzdGF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9jaGVjayIpOwpAQCAtNjc4LDkgKzY5OCw5IEBACiAJcmVzdWx0ID0gYWNwaV90aGVybWFsX2dldF90ZW1wZXJhdHVyZSh0eik7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZPSUQ7Ci0JCisKIAltZW1zZXQoJnR6LT5zdGF0ZSwgMCwgc2l6ZW9mKHR6LT5zdGF0ZSkpOwotCQorCiAJLyoKIAkgKiBDaGVjayBUcmlwIFBvaW50cwogCSAqIC0tLS0tLS0tLS0tLS0tLS0tCkBAIC02OTAsMTQgKzcxMCwxOCBAQAogCSAqIGluZGl2aWR1YWwgcG9saWN5IGRlY2lkZXMgd2hlbiBpdCBpcyBleGl0ZWQgKGUuZy4gaHlzdGVyZXNpcykuCiAJICovCiAJaWYgKHR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCkKLQkJc3RhdGUuY3JpdGljYWwgfD0gKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpOworCQlzdGF0ZS5jcml0aWNhbCB8PQorCQkgICAgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpOwogCWlmICh0ei0+dHJpcHMuaG90LmZsYWdzLnZhbGlkKQogCQlzdGF0ZS5ob3QgfD0gKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuaG90LnRlbXBlcmF0dXJlKTsKIAlpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQpCi0JCXN0YXRlLnBhc3NpdmUgfD0gKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7Ci0JZm9yIChpPTA7IGk8QUNQSV9USEVSTUFMX01BWF9BQ1RJVkU7IGkrKykKKwkJc3RhdGUucGFzc2l2ZSB8PQorCQkgICAgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7CisJZm9yIChpID0gMDsgaSA8IEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFOyBpKyspCiAJCWlmICh0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKQotCQkJc3RhdGUuYWN0aXZlIHw9ICh0ei0+dGVtcGVyYXR1cmUgPj0gdHotPnRyaXBzLmFjdGl2ZVtpXS50ZW1wZXJhdHVyZSk7CisJCQlzdGF0ZS5hY3RpdmUgfD0KKwkJCSAgICAodHotPnRlbXBlcmF0dXJlID49CisJCQkgICAgIHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpOwogCiAJLyoKIAkgKiBJbnZva2UgUG9saWN5CkBAIC03MjYsNyArNzUwLDcgQEAKIAkJdHotPnN0YXRlLmhvdCA9IDE7CiAJaWYgKHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLmVuYWJsZWQpCiAJCXR6LT5zdGF0ZS5wYXNzaXZlID0gMTsKLQlmb3IgKGk9MDsgaTxBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRTsgaSsrKQogCQlpZiAodHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy5lbmFibGVkKQogCQkJdHotPnN0YXRlLmFjdGl2ZSA9IDE7CiAKQEAgLTc0NCw4ICs3NjgsOCBAQAogCWVsc2UgaWYgKHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSA+IDApCiAJCXNsZWVwX3RpbWUgPSB0ei0+cG9sbGluZ19mcmVxdWVuY3kgKiAxMDA7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIlczogdGVtcGVyYXR1cmVbJWx1XSBzbGVlcFslbHVdXG4iLCAKLQkJdHotPm5hbWUsIHR6LT50ZW1wZXJhdHVyZSwgc2xlZXBfdGltZSkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzOiB0ZW1wZXJhdHVyZVslbHVdIHNsZWVwWyVsdV1cbiIsCisJCQkgIHR6LT5uYW1lLCB0ei0+dGVtcGVyYXR1cmUsIHNsZWVwX3RpbWUpKTsKIAogCS8qCiAJICogU2NoZWR1bGUgTmV4dCBQb2xsCkBAIC03NTQsMTIgKzc3OCwxMSBAQAogCWlmICghc2xlZXBfdGltZSkgewogCQlpZiAodGltZXJfcGVuZGluZygmKHR6LT50aW1lcikpKQogCQkJZGVsX3RpbWVyKCYodHotPnRpbWVyKSk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWlmICh0aW1lcl9wZW5kaW5nKCYodHotPnRpbWVyKSkpCiAJCQltb2RfdGltZXIoJih0ei0+dGltZXIpLCAoSFogKiBzbGVlcF90aW1lKSAvIDEwMDApOwogCQllbHNlIHsKLQkJCXR6LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHR6OworCQkJdHotPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl0ejsKIAkJCXR6LT50aW1lci5mdW5jdGlvbiA9IGFjcGlfdGhlcm1hbF9ydW47CiAJCQl0ei0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogKiBzbGVlcF90aW1lKSAvIDEwMDA7CiAJCQlhZGRfdGltZXIoJih0ei0+dGltZXIpKTsKQEAgLTc2OSwxNiArNzkyLDE1IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSphY3BpX3RoZXJtYWxfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV90aGVybWFsX2RpcjsKIAogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc3RhdGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfc3RhdGVfc2VxX3Nob3ciKTsKIApAQCAtNzg3LDcgKzgwOSw4IEBACiAKIAlzZXFfcHV0cyhzZXEsICJzdGF0ZTogICAgICAgICAgICAgICAgICAgIik7CiAKLQlpZiAoIXR6LT5zdGF0ZS5jcml0aWNhbCAmJiAhdHotPnN0YXRlLmhvdCAmJiAhdHotPnN0YXRlLnBhc3NpdmUgJiYgIXR6LT5zdGF0ZS5hY3RpdmUpCisJaWYgKCF0ei0+c3RhdGUuY3JpdGljYWwgJiYgIXR6LT5zdGF0ZS5ob3QgJiYgIXR6LT5zdGF0ZS5wYXNzaXZlCisJICAgICYmICF0ei0+c3RhdGUuYWN0aXZlKQogCQlzZXFfcHV0cyhzZXEsICJva1xuIik7CiAJZWxzZSB7CiAJCWlmICh0ei0+c3RhdGUuY3JpdGljYWwpCkBAIC04MDEsNyArODI0LDcgQEAKIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKIAl9CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKQEAgLTgxMCwxMSArODMzLDEwIEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfdGhlcm1hbF9zdGF0ZV9zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdGVtcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3RlbXBfc2VxX3Nob3ciKTsKIApAQCAtODI1LDEwICs4NDcsMTAgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCXNlcV9wcmludGYoc2VxLCAidGVtcGVyYXR1cmU6ICAgICAgICAgICAgICVsZCBDXG4iLCAKLQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7CisJc2VxX3ByaW50ZihzZXEsICJ0ZW1wZXJhdHVyZTogICAgICAgICAgICAgJWxkIENcbiIsCisJCSAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50ZW1wZXJhdHVyZSkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC04MzcsMTIgKzg1OSwxMSBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3RoZXJtYWxfdGVtcF9zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdHJpcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7Ci0JaW50CQkJaSA9IDA7Ci0JaW50CQkJaiA9IDA7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgaSA9IDA7CisJaW50IGogPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3RyaXBfc2VxX3Nob3ciKTsKIApAQCAtODUxLDIxICs4NzIsMjIgQEAKIAogCWlmICh0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MudmFsaWQpCiAJCXNlcV9wcmludGYoc2VxLCAiY3JpdGljYWwgKFM1KTogICAgICAgICAgICVsZCBDXG4iLAotCQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKSk7CisJCQkgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpKTsKIAogCWlmICh0ei0+dHJpcHMuaG90LmZsYWdzLnZhbGlkKQogCQlzZXFfcHJpbnRmKHNlcSwgImhvdCAoUzQpOiAgICAgICAgICAgICAgICAlbGQgQ1xuIiwKLQkJCUtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKKwkJCSAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpKTsKIAogCWlmICh0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgewotCQlzZXFfcHJpbnRmKHNlcSwgInBhc3NpdmU6ICAgICAgICAgICAgICAgICAlbGQgQzogdGMxPSVsdSB0YzI9JWx1IHRzcD0lbHUgZGV2aWNlcz0iLAotCQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpLAotCQkJdHotPnRyaXBzLnBhc3NpdmUudGMxLAotCQkJdHotPnRyaXBzLnBhc3NpdmUudGMyLCAKLQkJCXR6LT50cmlwcy5wYXNzaXZlLnRzcCk7Ci0JCWZvciAoaj0wOyBqPHR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMuY291bnQ7IGorKykgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJwYXNzaXZlOiAgICAgICAgICAgICAgICAgJWxkIEM6IHRjMT0lbHUgdGMyPSVsdSB0c3A9JWx1IGRldmljZXM9IiwKKwkJCSAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5wYXNzaXZlLnRlbXBlcmF0dXJlKSwKKwkJCSAgIHR6LT50cmlwcy5wYXNzaXZlLnRjMSwgdHotPnRyaXBzLnBhc3NpdmUudGMyLAorCQkJICAgdHotPnRyaXBzLnBhc3NpdmUudHNwKTsKKwkJZm9yIChqID0gMDsgaiA8IHR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMuY291bnQ7IGorKykgewogCi0JCQlzZXFfcHJpbnRmKHNlcSwgIjB4JXAgIiwgdHotPnRyaXBzLnBhc3NpdmUuZGV2aWNlcy5oYW5kbGVzW2pdKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiMHglcCAiLAorCQkJCSAgIHR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMuaGFuZGxlc1tqXSk7CiAJCX0KIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKIAl9CkBAIC04NzQsMTQgKzg5NiwxNSBAQAogCQlpZiAoISh0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKSkKIAkJCWJyZWFrOwogCQlzZXFfcHJpbnRmKHNlcSwgImFjdGl2ZVslZF06ICAgICAgICAgICAgICAgJWxkIEM6IGRldmljZXM9IiwKLQkJCWksIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpKTsKLQkJZm9yIChqID0gMDsgaiA8IHR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcy5jb3VudDsgaisrKSAKKwkJCSAgIGksCisJCQkgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKSk7CisJCWZvciAoaiA9IDA7IGogPCB0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMuY291bnQ7IGorKykKIAkJCXNlcV9wcmludGYoc2VxLCAiMHglcCAiLAotCQkJCXR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcy5oYW5kbGVzW2pdKTsKKwkJCQkgICB0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMuaGFuZGxlc1tqXSk7CiAJCXNlcV9wdXRzKHNlcSwgIlxuIik7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC04OTEsMzAgKzkxNCwyOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV90aGVybWFsX3dyaXRlX3RyaXBfcG9pbnRzICgKLSAgICAgICAgc3RydWN0IGZpbGUJCSpmaWxlLAotICAgICAgICBjb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLSAgICAgICAgc2l6ZV90CQkJY291bnQsCi0gICAgICAgIGxvZmZfdAkJCSpwcG9zKQorYWNwaV90aGVybWFsX3dyaXRlX3RyaXBfcG9pbnRzKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopbS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKiltLT5wcml2YXRlOwogCi0JY2hhcgkJCSpsaW1pdF9zdHJpbmc7IAotCWludAkJCW51bSwgY3JpdGljYWwsIGhvdCwgcGFzc2l2ZTsKLQlpbnQJCQkqYWN0aXZlOyAKLQlpbnQJCQlpID0gMDsKKwljaGFyICpsaW1pdF9zdHJpbmc7CisJaW50IG51bSwgY3JpdGljYWwsIGhvdCwgcGFzc2l2ZTsKKwlpbnQgKmFjdGl2ZTsKKwlpbnQgaSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfd3JpdGVfdHJpcF9wb2ludHMiKTsKIAogCWxpbWl0X3N0cmluZyA9IGttYWxsb2MoQUNQSV9USEVSTUFMX01BWF9MSU1JVF9TVFJfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZighbGltaXRfc3RyaW5nKQorCWlmICghbGltaXRfc3RyaW5nKQogCQlyZXR1cm5fVkFMVUUoLUVOT01FTSk7CiAKIAltZW1zZXQobGltaXRfc3RyaW5nLCAwLCBBQ1BJX1RIRVJNQUxfTUFYX0xJTUlUX1NUUl9MRU4pOwogCi0JYWN0aXZlID0ga21hbGxvYyhBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRSAqc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOwotCWlmKCFhY3RpdmUpCisJYWN0aXZlID0ga21hbGxvYyhBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRSAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjdGl2ZSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9NRU0pOwogCiAJaWYgKCF0eiB8fCAoY291bnQgPiBBQ1BJX1RIRVJNQUxfTUFYX0xJTUlUX1NUUl9MRU4gLSAxKSkgewpAQCAtOTIyLDIwICs5NDMsMjEgQEAKIAkJY291bnQgPSAtRUlOVkFMOwogCQlnb3RvIGVuZDsKIAl9Ci0JCisKIAlpZiAoY29weV9mcm9tX3VzZXIobGltaXRfc3RyaW5nLCBidWZmZXIsIGNvdW50KSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBkYXRhXG4iKSk7CiAJCWNvdW50ID0gLUVGQVVMVDsKIAkJZ290byBlbmQ7CiAJfQotCQorCiAJbGltaXRfc3RyaW5nW2NvdW50XSA9ICdcMCc7CiAKIAludW0gPSBzc2NhbmYobGltaXRfc3RyaW5nLCAiJWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQ6JWQiLAotCQkJCSZjcml0aWNhbCwgJmhvdCwgJnBhc3NpdmUsCi0JCQkJJmFjdGl2ZVswXSwgJmFjdGl2ZVsxXSwgJmFjdGl2ZVsyXSwgJmFjdGl2ZVszXSwgJmFjdGl2ZVs0XSwKLQkJCQkmYWN0aXZlWzVdLCAmYWN0aXZlWzZdLCAmYWN0aXZlWzddLCAmYWN0aXZlWzhdLCAmYWN0aXZlWzldKTsKLQlpZighKG51bSA+PTUgJiYgbnVtIDwgKEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFICsgMykpKSB7CisJCSAgICAgJmNyaXRpY2FsLCAmaG90LCAmcGFzc2l2ZSwKKwkJICAgICAmYWN0aXZlWzBdLCAmYWN0aXZlWzFdLCAmYWN0aXZlWzJdLCAmYWN0aXZlWzNdLCAmYWN0aXZlWzRdLAorCQkgICAgICZhY3RpdmVbNV0sICZhY3RpdmVbNl0sICZhY3RpdmVbN10sICZhY3RpdmVbOF0sCisJCSAgICAgJmFjdGl2ZVs5XSk7CisJaWYgKCEobnVtID49IDUgJiYgbnVtIDwgKEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFICsgMykpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgZm9ybWF0XG4iKSk7CiAJCWNvdW50ID0gLUVJTlZBTDsKIAkJZ290byBlbmQ7CkBAIC05NDksMTcgKzk3MSwxNiBAQAogCQkJYnJlYWs7CiAJCXR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUgPSBDRUxTSVVTX1RPX0tFTFZJTihhY3RpdmVbaV0pOwogCX0KLQkKLWVuZDoKKworICAgICAgZW5kOgogCWtmcmVlKGFjdGl2ZSk7CiAJa2ZyZWUobGltaXRfc3RyaW5nKTsKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi0KIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfY29vbGluZ19zZXFfc2hvdyIpOwogCkBAIC05NzAsMzMgKzk5MSwzMSBAQAogCQlzZXFfcHV0cyhzZXEsICI8c2V0dGluZyBub3Qgc3VwcG9ydGVkPlxuIik7CiAJfQogCi0JaWYgKCB0ei0+Y29vbGluZ19tb2RlID09IEFDUElfVEhFUk1BTF9NT0RFX0NSSVRJQ0FMICkKKwlpZiAodHotPmNvb2xpbmdfbW9kZSA9PSBBQ1BJX1RIRVJNQUxfTU9ERV9DUklUSUNBTCkKIAkJc2VxX3ByaW50ZihzZXEsICJjb29saW5nIG1vZGU6CWNyaXRpY2FsXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiY29vbGluZyBtb2RlOgklc1xuIiwKLQkJCXR6LT5jb29saW5nX21vZGU/InBhc3NpdmUiOiJhY3RpdmUiKTsKKwkJCSAgIHR6LT5jb29saW5nX21vZGUgPyAicGFzc2l2ZSIgOiAiYWN0aXZlIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV90aGVybWFsX2Nvb2xpbmdfc2VxX3Nob3csCi0JCQkJCQkJUERFKGlub2RlKS0+ZGF0YSk7CisJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfdGhlcm1hbF93cml0ZV9jb29saW5nX21vZGUgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLQlzaXplX3QJCQljb3VudCwKLQlsb2ZmX3QJCQkqcHBvcykKK2FjcGlfdGhlcm1hbF93cml0ZV9jb29saW5nX21vZGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewotCXN0cnVjdCBzZXFfZmlsZQkJKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKiltLT5wcml2YXRlOwotCWludAkJCXJlc3VsdCA9IDA7Ci0JY2hhcgkJCW1vZGVfc3RyaW5nWzEyXSA9IHsnXDAnfTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKiltLT5wcml2YXRlOworCWludCByZXN1bHQgPSAwOworCWNoYXIgbW9kZV9zdHJpbmdbMTJdID0geyAnXDAnIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfd3JpdGVfY29vbGluZ19tb2RlIik7CiAKQEAgLTEwMDgsMTEgKzEwMjcsMTIgQEAKIAogCWlmIChjb3B5X2Zyb21fdXNlcihtb2RlX3N0cmluZywgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKLQkKKwogCW1vZGVfc3RyaW5nW2NvdW50XSA9ICdcMCc7Ci0JCi0JcmVzdWx0ID0gYWNwaV90aGVybWFsX3NldF9jb29saW5nX21vZGUodHosIAotCQlzaW1wbGVfc3RydG91bChtb2RlX3N0cmluZywgTlVMTCwgMCkpOworCisJcmVzdWx0ID0gYWNwaV90aGVybWFsX3NldF9jb29saW5nX21vZGUodHosCisJCQkJCSAgICAgICBzaW1wbGVfc3RydG91bChtb2RlX3N0cmluZywgTlVMTCwKKwkJCQkJCQkgICAgICAwKSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiAKQEAgLTEwMjEsMTAgKzEwNDEsOSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLQogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcG9sbGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKXNlcS0+cHJpdmF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9wb2xsaW5nX3NlcV9zaG93Iik7CiAKQEAgLTEwMzcsNDMgKzEwNTYsNDEgQEAKIAl9CiAKIAlzZXFfcHJpbnRmKHNlcSwgInBvbGxpbmcgZnJlcXVlbmN5OiAgICAgICAlbHUgc2Vjb25kc1xuIiwKLQkJKHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSAvIDEwKSk7CisJCSAgICh0ei0+cG9sbGluZ19mcmVxdWVuY3kgLyAxMCkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9wb2xsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfdGhlcm1hbF9wb2xsaW5nX3NlcV9zaG93LAotCQkJCQkJCVBERShpbm9kZSktPmRhdGEpOworCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1hY3BpX3RoZXJtYWxfd3JpdGVfcG9sbGluZyAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpwcG9zKQorYWNwaV90aGVybWFsX3dyaXRlX3BvbGxpbmcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWNwaV90aGVybWFsCSp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopbS0+cHJpdmF0ZTsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWNoYXIJCQlwb2xsaW5nX3N0cmluZ1sxMl0gPSB7J1wwJ307Ci0JaW50CQkJc2Vjb25kcyA9IDA7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopbS0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwljaGFyIHBvbGxpbmdfc3RyaW5nWzEyXSA9IHsgJ1wwJyB9OworCWludCBzZWNvbmRzID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF93cml0ZV9wb2xsaW5nIik7CiAKIAlpZiAoIXR6IHx8IChjb3VudCA+IHNpemVvZihwb2xsaW5nX3N0cmluZykgLSAxKSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCQorCiAJaWYgKGNvcHlfZnJvbV91c2VyKHBvbGxpbmdfc3RyaW5nLCBidWZmZXIsIGNvdW50KSkKIAkJcmV0dXJuX1ZBTFVFKC1FRkFVTFQpOwotCQorCiAJcG9sbGluZ19zdHJpbmdbY291bnRdID0gJ1wwJzsKIAogCXNlY29uZHMgPSBzaW1wbGVfc3RydG91bChwb2xsaW5nX3N0cmluZywgTlVMTCwgMCk7Ci0JCisKIAlyZXN1bHQgPSBhY3BpX3RoZXJtYWxfc2V0X3BvbGxpbmcodHosIHNlY29uZHMpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybl9WQUxVRShyZXN1bHQpOwpAQCAtMTA4MywxOCArMTEwMCwxNSBAQAogCXJldHVybl9WQUxVRShjb3VudCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfYWRkX2ZzIik7CiAKIAlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCWFjcGlfdGhlcm1hbF9kaXIpOworCQkJCQkJICAgICBhY3BpX3RoZXJtYWxfZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC0xMTAyLDExICsxMTE2LDExIEBACiAKIAkvKiAnc3RhdGUnIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9USEVSTUFMX0ZJTEVfU1RBVEUsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfVEhFUk1BTF9GSUxFX1NUQVRFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9USEVSTUFMX0ZJTEVfU1RBVEUpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3RoZXJtYWxfc3RhdGVfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xMTE1LDExICsxMTI5LDExIEBACiAKIAkvKiAndGVtcGVyYXR1cmUnIFtSXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9USEVSTUFMX0ZJTEVfVEVNUEVSQVRVUkUsCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfVEhFUk1BTF9GSUxFX1RFTVBFUkFUVVJFKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9USEVSTUFMX0ZJTEVfVEVNUEVSQVRVUkUpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3RoZXJtYWxfdGVtcF9mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTExMjgsMTEgKzExNDIsMTIgQEAKIAogCS8qICd0cmlwX3BvaW50cycgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfVEhFUk1BTF9GSUxFX1RSSVBfUE9JTlRTLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9USEVSTUFMX0ZJTEVfVFJJUF9QT0lOVFMpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICclcycgZnMgZW50cnlcbiIsCisJCQkJICBBQ1BJX1RIRVJNQUxfRklMRV9UUklQX1BPSU5UUykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdGhlcm1hbF90cmlwX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTE0MSwxMSArMTE1NiwxMiBAQAogCiAJLyogJ2Nvb2xpbmdfbW9kZScgW1IvV10gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfVEhFUk1BTF9GSUxFX0NPT0xJTkdfTU9ERSwKLQkJU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfVEhFUk1BTF9GSUxFX0NPT0xJTkdfTU9ERSkpOworCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKKwkJCQkgIEFDUElfVEhFUk1BTF9GSUxFX0NPT0xJTkdfTU9ERSkpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdGhlcm1hbF9jb29saW5nX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTE1NCwxMSArMTE3MCwxMiBAQAogCiAJLyogJ3BvbGxpbmdfZnJlcXVlbmN5JyBbUi9XXSAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoQUNQSV9USEVSTUFMX0ZJTEVfUE9MTElOR19GUkVRLAotCQlTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCSAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJQUNQSV9USEVSTUFMX0ZJTEVfUE9MTElOR19GUkVRKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAorCQkJCSAgQUNQSV9USEVSTUFMX0ZJTEVfUE9MTElOR19GUkVRKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV90aGVybWFsX3BvbGxpbmdfZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC0xMTY4LDEwICsxMTg1LDcgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQotc3RhdGljIGludAotYWNwaV90aGVybWFsX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX3JlbW92ZV9mcyIpOwogCkBAIC0xMTkzLDE5ICsxMjA3LDE0IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZAotYWNwaV90aGVybWFsX25vdGlmeSAoCi0JYWNwaV9oYW5kbGUgCQloYW5kbGUsCi0JdTMyIAkJCWV2ZW50LAotCXZvaWQgCQkJKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3RoZXJtYWxfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKikgZGF0YTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKWRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX25vdGlmeSIpOwogCkBAIC0xMjMxLDE5ICsxMjQwLDE2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KSk7CisJCQkJICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfZ2V0X2luZm8gKAotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6KQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfZ2V0X2luZm8oc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9nZXRfaW5mbyIpOwogCkBAIC0xMjYyLDIwICsxMjY4LDI0IEBACiAKIAkvKiBTZXQgdGhlIGNvb2xpbmcgbW9kZSBbX1NDUF0gdG8gYWN0aXZlIGNvb2xpbmcgKGRlZmF1bHQpICovCiAJcmVzdWx0ID0gYWNwaV90aGVybWFsX3NldF9jb29saW5nX21vZGUodHosIEFDUElfVEhFUk1BTF9NT0RFX0FDVElWRSk7Ci0JaWYgKCFyZXN1bHQpIAorCWlmICghcmVzdWx0KQogCQl0ei0+ZmxhZ3MuY29vbGluZ19tb2RlID0gMTsKLQllbHNlIHsgCisJZWxzZSB7CiAJCS8qIE9oLHdlIGhhdmUgbm90IF9TQ1AgbWV0aG9kLgotCQkgICBHZW5lcmFsbHkgc2hvdyBjb29saW5nX21vZGUgYnkgX0FDeCwgX1BTVixzcGVjIDEyLjIqLworCQkgICBHZW5lcmFsbHkgc2hvdyBjb29saW5nX21vZGUgYnkgX0FDeCwgX1BTVixzcGVjIDEyLjIgKi8KIAkJdHotPmZsYWdzLmNvb2xpbmdfbW9kZSA9IDA7Ci0JCWlmICggdHotPnRyaXBzLmFjdGl2ZVswXS5mbGFncy52YWxpZCAmJiB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCApIHsKLQkJCWlmICggdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUgPiB0ei0+dHJpcHMuYWN0aXZlWzBdLnRlbXBlcmF0dXJlICkKKwkJaWYgKHR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MudmFsaWQKKwkJICAgICYmIHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkKSB7CisJCQlpZiAodHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUgPgorCQkJICAgIHR6LT50cmlwcy5hY3RpdmVbMF0udGVtcGVyYXR1cmUpCiAJCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX0FDVElWRTsKLQkJCWVsc2UgCisJCQllbHNlCiAJCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX1BBU1NJVkU7Ci0JCX0gZWxzZSBpZiAoICF0ei0+dHJpcHMuYWN0aXZlWzBdLmZsYWdzLnZhbGlkICYmIHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkICkgeworCQl9IGVsc2UgaWYgKCF0ei0+dHJpcHMuYWN0aXZlWzBdLmZsYWdzLnZhbGlkCisJCQkgICAmJiB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgewogCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX1BBU1NJVkU7Ci0JCX0gZWxzZSBpZiAoIHR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MudmFsaWQgJiYgIXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkICkgeworCQl9IGVsc2UgaWYgKHR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MudmFsaWQKKwkJCSAgICYmICF0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgewogCQkJdHotPmNvb2xpbmdfbW9kZSA9IEFDUElfVEhFUk1BTF9NT0RFX0FDVElWRTsKIAkJfSBlbHNlIHsKIAkJCS8qIF9BQ3ggYW5kIF9QU1YgYXJlIG9wdGlvbmFsLCBidXQgX0NSVCBpcyByZXF1aXJlZCAqLwpAQCAtMTI5NywxNCArMTMwNywxMSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfYWRkICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgCQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3RoZXJtYWwJKnR6ID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfYWRkIik7CiAKQEAgLTEzMzUsMTkgKzEzNDIsMjAgQEAKIAlhY3BpX3RoZXJtYWxfY2hlY2sodHopOwogCiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKHR6LT5oYW5kbGUsCi0JCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV90aGVybWFsX25vdGlmeSwgdHopOworCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBhY3BpX3RoZXJtYWxfbm90aWZ5LCB0eik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVsZCBDKVxuIiwKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7CisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHR6LT50ZW1wZXJhdHVyZSkpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlhY3BpX3RoZXJtYWxfcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKHR6KTsKQEAgLTEzNTYsMjEgKzEzNjQsMTcgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAotCi1zdGF0aWMgaW50Ci1hY3BpX3RoZXJtYWxfcmVtb3ZlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlpbnQJCQl0eXBlKQorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfdGhlcm1hbAkqdHogPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGhlcm1hbF9yZW1vdmUiKTsKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXR6ID0gKHN0cnVjdCBhY3BpX3RoZXJtYWwgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKIAkvKiBhdm9pZCB0aW1lciBhZGRpbmcgbmV3IGRlZmVyIHRhc2sgKi8KIAl0ei0+em9tYmllID0gMTsKQEAgLTEzODIsMTkgKzEzODYsMTkgQEAKIAlkZWxfdGltZXJfc3luYygmKHR6LT50aW1lcikpOwogCiAJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIodHotPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX3RoZXJtYWxfbm90aWZ5KTsKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIGFjcGlfdGhlcm1hbF9ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKIAkvKiBUZXJtaW5hdGUgcG9saWN5ICovCi0JaWYgKHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkCi0JCSYmIHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLmVuYWJsZWQpIHsKKwlpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgJiYgdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MuZW5hYmxlZCkgewogCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy5lbmFibGVkID0gMDsKIAkJYWNwaV90aGVybWFsX3Bhc3NpdmUodHopOwogCX0KIAlpZiAodHotPnRyaXBzLmFjdGl2ZVswXS5mbGFncy52YWxpZAotCQkmJiB0ei0+dHJpcHMuYWN0aXZlWzBdLmZsYWdzLmVuYWJsZWQpIHsKKwkgICAgJiYgdHotPnRyaXBzLmFjdGl2ZVswXS5mbGFncy5lbmFibGVkKSB7CiAJCXR6LT50cmlwcy5hY3RpdmVbMF0uZmxhZ3MuZW5hYmxlZCA9IDA7CiAJCWFjcGlfdGhlcm1hbF9hY3RpdmUodHopOwogCX0KQEAgLTE0MDUsMTEgKzE0MDksOSBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdAotYWNwaV90aGVybWFsX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3RoZXJtYWxfaW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3RoZXJtYWxfaW5pdCIpOwogCkBAIC0xNDI3LDkgKzE0MjksNyBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfdGhlcm1hbF9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFjcGlfdGhlcm1hbF9leGl0KHZvaWQpCiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV90aGVybWFsX2V4aXQiKTsKIApAQCAtMTQ0MCw2ICsxNDQwLDUgQEAKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX3RoZXJtYWxfaW5pdCk7CiBtb2R1bGVfZXhpdChhY3BpX3RoZXJtYWxfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKaW5kZXggNzNiMWQ4YS4uN2ZlMGI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYwpAQCAtMTAwLDggKzEwMCw3IEBACiAvKiB1dGlsaXR5CiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gdm9pZAotX3NldF9iaXQodTMyKiB3b3JkLCB1MzIgbWFzaywgaW50IHZhbHVlKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfc2V0X2JpdCh1MzIgKiB3b3JkLCB1MzIgbWFzaywgaW50IHZhbHVlKQogewogCSp3b3JkID0gKCp3b3JkICYgfm1hc2spIHwgKG1hc2sgKiB2YWx1ZSk7CiB9CkBAIC0xMDksMzUgKzEwOCwzMiBAQAogLyogYWNwaSBpbnRlcmZhY2Ugd3JhcHBlcnMKICAqLwogCi1zdGF0aWMgaW50Ci1pc192YWxpZF9hY3BpX3BhdGgoY29uc3QgY2hhciogbWV0aG9kTmFtZSkKK3N0YXRpYyBpbnQgaXNfdmFsaWRfYWNwaV9wYXRoKGNvbnN0IGNoYXIgKm1ldGhvZE5hbWUpCiB7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAoY2hhciopbWV0aG9kTmFtZSwgJmhhbmRsZSk7CisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIChjaGFyICopbWV0aG9kTmFtZSwgJmhhbmRsZSk7CiAJcmV0dXJuICFBQ1BJX0ZBSUxVUkUoc3RhdHVzKTsKIH0KIAotc3RhdGljIGludAotd3JpdGVfYWNwaV9pbnQoY29uc3QgY2hhciogbWV0aG9kTmFtZSwgaW50IHZhbCkKK3N0YXRpYyBpbnQgd3JpdGVfYWNwaV9pbnQoY29uc3QgY2hhciAqbWV0aG9kTmFtZSwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CiAJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1sxXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlwYXJhbXMuY291bnQgPSBzaXplb2YoaW5fb2Jqcykvc2l6ZW9mKGluX29ianNbMF0pOworCXBhcmFtcy5jb3VudCA9IHNpemVvZihpbl9vYmpzKSAvIHNpemVvZihpbl9vYmpzWzBdKTsKIAlwYXJhbXMucG9pbnRlciA9IGluX29ianM7CiAJaW5fb2Jqc1swXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CiAJaW5fb2Jqc1swXS5pbnRlZ2VyLnZhbHVlID0gdmFsOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKGNoYXIqKW1ldGhvZE5hbWUsICZwYXJhbXMsIE5VTEwpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIChjaGFyICopbWV0aG9kTmFtZSwgJnBhcmFtcywgTlVMTCk7CiAJcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spOwogfQogCiAjaWYgMAotc3RhdGljIGludAotcmVhZF9hY3BpX2ludChjb25zdCBjaGFyKiBtZXRob2ROYW1lLCBpbnQqIHBWYWwpCitzdGF0aWMgaW50IHJlYWRfYWNwaV9pbnQoY29uc3QgY2hhciAqbWV0aG9kTmFtZSwgaW50ICpwVmFsKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHRzOwogCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmpzWzFdOwpAQCAtMTQ2LDI1ICsxNDIsMjQgQEAKIAlyZXN1bHRzLmxlbmd0aCA9IHNpemVvZihvdXRfb2Jqcyk7CiAJcmVzdWx0cy5wb2ludGVyID0gb3V0X29ianM7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCgwLCAoY2hhciopbWV0aG9kTmFtZSwgMCwgJnJlc3VsdHMpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KDAsIChjaGFyICopbWV0aG9kTmFtZSwgMCwgJnJlc3VsdHMpOwogCSpwVmFsID0gb3V0X29ianNbMF0uaW50ZWdlci52YWx1ZTsKIAogCXJldHVybiAoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29ianNbMF0udHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUik7CiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IGNoYXIqCQltZXRob2RfaGNpIC8qPSAwKi87CitzdGF0aWMgY29uc3QgY2hhciAqbWV0aG9kX2hjaSAvKj0gMCovIDsKIAogLyogUGVyZm9ybSBhIHJhdyBIQ0kgY2FsbC4gIEhlcmUgd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnB1dCBvciBvdXRwdXQgYnVmZmVyCiAgKiBmb3JtYXQuCiAgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotaGNpX3Jhdyhjb25zdCB1MzIgaW5bSENJX1dPUkRTXSwgdTMyIG91dFtIQ0lfV09SRFNdKQorc3RhdGljIGFjcGlfc3RhdHVzIGhjaV9yYXcoY29uc3QgdTMyIGluW0hDSV9XT1JEU10sIHUzMiBvdXRbSENJX1dPUkRTXSkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CiAJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tIQ0lfV09SRFNdOwogCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHRzOwotCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmpzW0hDSV9XT1JEUysxXTsKKwl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2Jqc1tIQ0lfV09SRFMgKyAxXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50IGk7CiAKQEAgLTE3OCw4ICsxNzMsOCBAQAogCXJlc3VsdHMubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmpzKTsKIAlyZXN1bHRzLnBvaW50ZXIgPSBvdXRfb2JqczsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIChjaGFyKiltZXRob2RfaGNpLCAmcGFyYW1zLAotCQkmcmVzdWx0cyk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKGNoYXIgKiltZXRob2RfaGNpLCAmcGFyYW1zLAorCQkJCSAgICAgICZyZXN1bHRzKTsKIAlpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmpzLT5wYWNrYWdlLmNvdW50IDw9IEhDSV9XT1JEUykpIHsKIAkJZm9yIChpID0gMDsgaSA8IG91dF9vYmpzLT5wYWNrYWdlLmNvdW50OyArK2kpIHsKIAkJCW91dFtpXSA9IG91dF9vYmpzLT5wYWNrYWdlLmVsZW1lbnRzW2ldLmludGVnZXIudmFsdWU7CkBAIC0xOTUsOCArMTkwLDcgQEAKICAqIG1heSBiZSB1c2VmdWwgKHN1Y2ggYXMgIm5vdCBzdXBwb3J0ZWQiKS4KICAqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWhjaV93cml0ZTEodTMyIHJlZywgdTMyIGluMSwgdTMyKiByZXN1bHQpCitzdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3dyaXRlMSh1MzIgcmVnLCB1MzIgaW4xLCB1MzIgKiByZXN1bHQpCiB7CiAJdTMyIGluW0hDSV9XT1JEU10gPSB7IEhDSV9TRVQsIHJlZywgaW4xLCAwLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwpAQCAtMjA1LDggKzE5OSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzCi1oY2lfcmVhZDEodTMyIHJlZywgdTMyKiBvdXQxLCB1MzIqIHJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmVhZDEodTMyIHJlZywgdTMyICogb3V0MSwgdTMyICogcmVzdWx0KQogewogCXUzMiBpbltIQ0lfV09SRFNdID0geyBIQ0lfR0VULCByZWcsIDAsIDAsIDAsIDAgfTsKIAl1MzIgb3V0W0hDSV9XT1JEU107CkBAIC0yMTYsMjYgKzIwOSwyNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkqCXRvc2hpYmFfcHJvY19kaXIgLyo9IDAqLzsKLXN0YXRpYyBpbnQJCQlmb3JjZV9mYW47Ci1zdGF0aWMgaW50CQkJbGFzdF9rZXlfZXZlbnQ7Ci1zdGF0aWMgaW50CQkJa2V5X2V2ZW50X3ZhbGlkOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdG9zaGliYV9wcm9jX2RpciAvKj0gMCovIDsKK3N0YXRpYyBpbnQgZm9yY2VfZmFuOworc3RhdGljIGludCBsYXN0X2tleV9ldmVudDsKK3N0YXRpYyBpbnQga2V5X2V2ZW50X3ZhbGlkOwogCi10eXBlZGVmIHN0cnVjdCBfUHJvY0l0ZW0KLXsKLQljb25zdCBjaGFyKiBuYW1lOwotCWNoYXIqICgqcmVhZF9mdW5jKShjaGFyKik7Ci0JdW5zaWduZWQgbG9uZyAoKndyaXRlX2Z1bmMpKGNvbnN0IGNoYXIqLCB1bnNpZ25lZCBsb25nKTsKK3R5cGVkZWYgc3RydWN0IF9Qcm9jSXRlbSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICooKnJlYWRfZnVuYykgKGNoYXIgKik7CisJdW5zaWduZWQgbG9uZyAoKndyaXRlX2Z1bmMpIChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwogfSBQcm9jSXRlbTsKIAogLyogcHJvYyBmaWxlIGhhbmRsZXJzCiAgKi8KIAogc3RhdGljIGludAotZGlzcGF0Y2hfcmVhZChjaGFyKiBwYWdlLCBjaGFyKiogc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQqIGVvZiwKLQlQcm9jSXRlbSogaXRlbSkKK2Rpc3BhdGNoX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCisJICAgICAgUHJvY0l0ZW0gKiBpdGVtKQogewotCWNoYXIqIHAgPSBwYWdlOworCWNoYXIgKnAgPSBwYWdlOwogCWludCBsZW47CiAKIAlpZiAob2ZmID09IDApCkBAIC0yNDMsMzMgKzIzNSwzNSBAQAogCiAJLyogSVNTVUU6IEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIGNvZGUgKi8KIAlsZW4gPSAocCAtIHBhZ2UpOwotCWlmIChsZW4gPD0gb2ZmK2NvdW50KSAqZW9mID0gMTsKKwlpZiAobGVuIDw9IG9mZiArIGNvdW50KQorCQkqZW9mID0gMTsKIAkqc3RhcnQgPSBwYWdlICsgb2ZmOwogCWxlbiAtPSBvZmY7Ci0JaWYgKGxlbj5jb3VudCkgbGVuID0gY291bnQ7Ci0JaWYgKGxlbjwwKSBsZW4gPSAwOworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CiAJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGludAotZGlzcGF0Y2hfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAotCXVuc2lnbmVkIGxvbmcgY291bnQsIFByb2NJdGVtKiBpdGVtKQorZGlzcGF0Y2hfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBQcm9jSXRlbSAqIGl0ZW0pCiB7CiAJaW50IHJlc3VsdDsKLQljaGFyKiB0bXBfYnVmZmVyOworCWNoYXIgKnRtcF9idWZmZXI7CiAKIAkvKiBBcmcgYnVmZmVyIHBvaW50cyB0byB1c2Vyc3BhY2UgbWVtb3J5LCB3aGljaCBjYW4ndCBiZSBhY2Nlc3NlZAogCSAqIGRpcmVjdGx5LiAgU2luY2Ugd2UncmUgbWFraW5nIGEgY29weSwgemVyby10ZXJtaW5hdGUgdGhlCiAJICogZGVzdGluYXRpb24gc28gdGhhdCBzc2NhbmYgY2FuIGJlIHVzZWQgb24gaXQgc2FmZWx5LgogCSAqLwogCXRtcF9idWZmZXIgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYoIXRtcF9idWZmZXIpCisJaWYgKCF0bXBfYnVmZmVyKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcih0bXBfYnVmZmVyLCBidWZmZXIsIGNvdW50KSkgewogCQlyZXN1bHQgPSAtRUZBVUxUOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQl0bXBfYnVmZmVyW2NvdW50XSA9IDA7CiAJCXJlc3VsdCA9IGl0ZW0tPndyaXRlX2Z1bmModG1wX2J1ZmZlciwgY291bnQpOwogCX0KQEAgLTI3Nyw4ICsyNzEsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyKgotcmVhZF9sY2QoY2hhciogcCkKK3N0YXRpYyBjaGFyICpyZWFkX2xjZChjaGFyICpwKQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKQEAgLTI4OCw3ICsyODEsNyBAQAogCQl2YWx1ZSA9IHZhbHVlID4+IEhDSV9MQ0RfQlJJR0hUTkVTU19TSElGVDsKIAkJcCArPSBzcHJpbnRmKHAsICJicmlnaHRuZXNzOiAgICAgICAgICAgICAgJWRcbiIsIHZhbHVlKTsKIAkJcCArPSBzcHJpbnRmKHAsICJicmlnaHRuZXNzX2xldmVsczogICAgICAgJWRcbiIsCi0JCQlIQ0lfTENEX0JSSUdIVE5FU1NfTEVWRUxTKTsKKwkJCSAgICAgSENJX0xDRF9CUklHSFRORVNTX0xFVkVMUyk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKE1ZX0VSUiAiRXJyb3IgcmVhZGluZyBMQ0QgYnJpZ2h0bmVzc1xuIik7CiAJfQpAQCAtMjk2LDE0ICsyODksMTMgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXdyaXRlX2xjZChjb25zdCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9sY2QoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWludCB2YWx1ZTsKIAl1MzIgaGNpX3Jlc3VsdDsKIAogCWlmIChzc2NhbmYoYnVmZmVyLCAiIGJyaWdodG5lc3MgOiAlaSIsICZ2YWx1ZSkgPT0gMSAmJgotCQkJdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpIHsKKwkgICAgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpIHsKIAkJdmFsdWUgPSB2YWx1ZSA8PCBIQ0lfTENEX0JSSUdIVE5FU1NfU0hJRlQ7CiAJCWhjaV93cml0ZTEoSENJX0xDRF9CUklHSFRORVNTLCB2YWx1ZSwgJmhjaV9yZXN1bHQpOwogCQlpZiAoaGNpX3Jlc3VsdCAhPSBIQ0lfU1VDQ0VTUykKQEAgLTMxNSw4ICszMDcsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGNoYXIqCi1yZWFkX3ZpZGVvKGNoYXIqIHApCitzdGF0aWMgY2hhciAqcmVhZF92aWRlbyhjaGFyICpwKQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKQEAgLTMyNSw3ICszMTYsNyBAQAogCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7CiAJCWludCBpc19sY2QgPSAodmFsdWUgJiBIQ0lfVklERU9fT1VUX0xDRCkgPyAxIDogMDsKIAkJaW50IGlzX2NydCA9ICh2YWx1ZSAmIEhDSV9WSURFT19PVVRfQ1JUKSA/IDEgOiAwOwotCQlpbnQgaXNfdHYgID0gKHZhbHVlICYgSENJX1ZJREVPX09VVF9UViApID8gMSA6IDA7CisJCWludCBpc190diA9ICh2YWx1ZSAmIEhDSV9WSURFT19PVVRfVFYpID8gMSA6IDA7CiAJCXAgKz0gc3ByaW50ZihwLCAibGNkX291dDogICAgICAgICAgICAgICAgICVkXG4iLCBpc19sY2QpOwogCQlwICs9IHNwcmludGYocCwgImNydF9vdXQ6ICAgICAgICAgICAgICAgICAlZFxuIiwgaXNfY3J0KTsKIAkJcCArPSBzcHJpbnRmKHAsICJ0dl9vdXQ6ICAgICAgICAgICAgICAgICAgJWRcbiIsIGlzX3R2KTsKQEAgLTMzNiw4ICszMjcsNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotd3JpdGVfdmlkZW8oY29uc3QgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgd3JpdGVfdmlkZW8oY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWludCB2YWx1ZTsKIAlpbnQgcmVtYWluID0gY291bnQ7CkBAIC0zNjMsNyArMzUzLDcgQEAKIAkJCSsrYnVmZmVyOwogCQkJLS1yZW1haW47CiAJCX0KLQkJd2hpbGUgKHJlbWFpbiAmJiAqKGJ1ZmZlci0xKSAhPSAnOycpOworCQl3aGlsZSAocmVtYWluICYmICooYnVmZmVyIC0gMSkgIT0gJzsnKTsKIAl9CiAKIAloY2lfcmVhZDEoSENJX1ZJREVPX09VVCwgJnZpZGVvX291dCwgJmhjaV9yZXN1bHQpOwpAQCAtMzg2LDggKzM3Niw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgY2hhcioKLXJlYWRfZmFuKGNoYXIqIHApCitzdGF0aWMgY2hhciAqcmVhZF9mYW4oY2hhciAqcCkKIHsKIAl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmFsdWU7CkBAIC00MDMsMTQgKzM5MiwxMyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotd3JpdGVfZmFuKGNvbnN0IGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX2Zhbihjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJaW50IHZhbHVlOwogCXUzMiBoY2lfcmVzdWx0OwogCiAJaWYgKHNzY2FuZihidWZmZXIsICIgZm9yY2Vfb24gOiAlaSIsICZ2YWx1ZSkgPT0gMSAmJgotCQkJdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxKSB7CisJICAgIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMSkgewogCQloY2lfd3JpdGUxKEhDSV9GQU4sIHZhbHVlLCAmaGNpX3Jlc3VsdCk7CiAJCWlmIChoY2lfcmVzdWx0ICE9IEhDSV9TVUNDRVNTKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00MjMsOCArNDExLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBjaGFyKgotcmVhZF9rZXlzKGNoYXIqIHApCitzdGF0aWMgY2hhciAqcmVhZF9rZXlzKGNoYXIgKnApCiB7CiAJdTMyIGhjaV9yZXN1bHQ7CiAJdTMyIHZhbHVlOwpAQCAtNDUxLDE3ICs0MzgsMTUgQEAKIAlwICs9IHNwcmludGYocCwgImhvdGtleV9yZWFkeTogICAgICAgICAgICAlZFxuIiwga2V5X2V2ZW50X3ZhbGlkKTsKIAlwICs9IHNwcmludGYocCwgImhvdGtleTogICAgICAgICAgICAgICAgICAweCUwNHhcbiIsIGxhc3Rfa2V5X2V2ZW50KTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotd3JpdGVfa2V5cyhjb25zdCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9rZXlzKGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlpbnQgdmFsdWU7CiAKLQlpZiAoc3NjYW5mKGJ1ZmZlciwgIiBob3RrZXlfcmVhZHkgOiAlaSIsICZ2YWx1ZSkgPT0gMSAmJgotCQkJdmFsdWUgPT0gMCkgeworCWlmIChzc2NhbmYoYnVmZmVyLCAiIGhvdGtleV9yZWFkeSA6ICVpIiwgJnZhbHVlKSA9PSAxICYmIHZhbHVlID09IDApIHsKIAkJa2V5X2V2ZW50X3ZhbGlkID0gMDsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ3MCwxMiArNDU1LDExIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgY2hhcioKLXJlYWRfdmVyc2lvbihjaGFyKiBwKQorc3RhdGljIGNoYXIgKnJlYWRfdmVyc2lvbihjaGFyICpwKQogewogCXAgKz0gc3ByaW50ZihwLCAiZHJpdmVyOiAgICAgICAgICAgICAgICAgICVzXG4iLCBUT1NISUJBX0FDUElfVkVSU0lPTik7CiAJcCArPSBzcHJpbnRmKHAsICJwcm9jX2ludGVyZmFjZTogICAgICAgICAgJWRcbiIsCi0JCVBST0NfSU5URVJGQUNFX1ZFUlNJT04pOworCQkgICAgIFBST0NfSU5URVJGQUNFX1ZFUlNJT04pOwogCXJldHVybiBwOwogfQogCkBAIC00ODQsNDggKzQ2OCw0NSBAQAogCiAjZGVmaW5lIFBST0NfVE9TSElCQQkJInRvc2hpYmEiCiAKLXN0YXRpYyBQcm9jSXRlbSBwcm9jX2l0ZW1zW10gPQotewotCXsgImxjZCIJCSwgcmVhZF9sY2QJLCB3cml0ZV9sY2QJfSwKLQl7ICJ2aWRlbyIJLCByZWFkX3ZpZGVvCSwgd3JpdGVfdmlkZW8JfSwKLQl7ICJmYW4iCQksIHJlYWRfZmFuCSwgd3JpdGVfZmFuCX0sCi0JeyAia2V5cyIJLCByZWFkX2tleXMJLCB3cml0ZV9rZXlzCX0sCi0JeyAidmVyc2lvbiIJLCByZWFkX3ZlcnNpb24JLCBOVUxMCQl9LAotCXsgTlVMTCB9CitzdGF0aWMgUHJvY0l0ZW0gcHJvY19pdGVtc1tdID0geworCXsibGNkIiwgcmVhZF9sY2QsIHdyaXRlX2xjZH0sCisJeyJ2aWRlbyIsIHJlYWRfdmlkZW8sIHdyaXRlX3ZpZGVvfSwKKwl7ImZhbiIsIHJlYWRfZmFuLCB3cml0ZV9mYW59LAorCXsia2V5cyIsIHJlYWRfa2V5cywgd3JpdGVfa2V5c30sCisJeyJ2ZXJzaW9uIiwgcmVhZF92ZXJzaW9uLCBOVUxMfSwKKwl7TlVMTH0KIH07CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFkZF9kZXZpY2Uodm9pZCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgYWRkX2RldmljZSh2b2lkKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSogcHJvYzsKLQlQcm9jSXRlbSogaXRlbTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisJUHJvY0l0ZW0gKml0ZW07CiAKLQlmb3IgKGl0ZW0gPSBwcm9jX2l0ZW1zOyBpdGVtLT5uYW1lOyArK2l0ZW0pCi0JeworCWZvciAoaXRlbSA9IHByb2NfaXRlbXM7IGl0ZW0tPm5hbWU7ICsraXRlbSkgewogCQlwcm9jID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShpdGVtLT5uYW1lLAotCQkJU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAotCQkJdG9zaGliYV9wcm9jX2RpciwgKHJlYWRfcHJvY190KilkaXNwYXRjaF9yZWFkLCBpdGVtKTsKKwkJCQkJICAgICAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCQkgICAgICB0b3NoaWJhX3Byb2NfZGlyLAorCQkJCQkgICAgICAocmVhZF9wcm9jX3QgKikgZGlzcGF0Y2hfcmVhZCwKKwkJCQkJICAgICAgaXRlbSk7CiAJCWlmIChwcm9jKQogCQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJaWYgKHByb2MgJiYgaXRlbS0+d3JpdGVfZnVuYykKLQkJCXByb2MtPndyaXRlX3Byb2MgPSAod3JpdGVfcHJvY190KilkaXNwYXRjaF93cml0ZTsKKwkJCXByb2MtPndyaXRlX3Byb2MgPSAod3JpdGVfcHJvY190ICopIGRpc3BhdGNoX3dyaXRlOwogCX0KIAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIF9fZXhpdAotcmVtb3ZlX2RldmljZSh2b2lkKQorc3RhdGljIGFjcGlfc3RhdHVzIF9fZXhpdCByZW1vdmVfZGV2aWNlKHZvaWQpCiB7Ci0JUHJvY0l0ZW0qIGl0ZW07CisJUHJvY0l0ZW0gKml0ZW07CiAKIAlmb3IgKGl0ZW0gPSBwcm9jX2l0ZW1zOyBpdGVtLT5uYW1lOyArK2l0ZW0pCiAJCXJlbW92ZV9wcm9jX2VudHJ5KGl0ZW0tPm5hbWUsIHRvc2hpYmFfcHJvY19kaXIpOwogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLXRvc2hpYmFfYWNwaV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB0b3NoaWJhX2FjcGlfaW5pdCh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXUzMiBoY2lfcmVzdWx0OwpAQCAtNTMzLDkgKzUxNCw5IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKXsKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKIAkJcHJpbnRrKE1ZX0lORk8gIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCS8qIHNpbXBsZSBkZXZpY2UgZGV0ZWN0aW9uOiBsb29rIGZvciBIQ0kgbWV0aG9kICovCiAJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChNRVRIT0RfSENJXzEpKQpAQCAtNTQ2LDcgKzUyNyw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcHJpbnRrKE1ZX0lORk8gIlRvc2hpYmEgTGFwdG9wIEFDUEkgRXh0cmFzIHZlcnNpb24gJXNcbiIsCi0JCVRPU0hJQkFfQUNQSV9WRVJTSU9OKTsKKwkgICAgICAgVE9TSElCQV9BQ1BJX1ZFUlNJT04pOwogCXByaW50ayhNWV9JTkZPICIgICAgSENJIG1ldGhvZDogJXNcbiIsIG1ldGhvZF9oY2kpOwogCiAJZm9yY2VfZmFuID0gMDsKQEAgLTU2OCw4ICs1NDksNyBAQAogCXJldHVybiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpID8gMCA6IC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotdG9zaGliYV9hY3BpX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCB0b3NoaWJhX2FjcGlfZXhpdCh2b2lkKQogewogCXJlbW92ZV9kZXZpY2UoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvTWFrZWZpbGUKaW5kZXggOTM5YzQ0Ny4uZTg3MTA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL01ha2VmaWxlCkBAIC0zLDYgKzMsNiBAQAogIwogCiBvYmoteSA6PSB1dGFsbG9jLm8gIHV0ZGVidWcubyAgIHV0ZXZhbC5vICAgIHV0aW5pdC5vICB1dG1pc2MubyAgICB1dHhmYWNlLm8gXAotCSB1dGNvcHkubyAgIHV0ZGVsZXRlLm8gIHV0Z2xvYmFsLm8gIHV0bWF0aC5vICB1dG9iamVjdC5vCisJIHV0Y29weS5vICAgdXRkZWxldGUubyAgdXRnbG9iYWwubyAgdXRtYXRoLm8gIHV0b2JqZWN0Lm8gdXRzdGF0ZS5vIHV0bXV0ZXgubyB1dG9iamVjdC5vIHV0Y2FjaGUubwogCiBFWFRSQV9DRkxBR1MgKz0gJChBQ1BJX0NGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKaW5kZXggYzRlN2Y5OC4uMDY4NDUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTW9kdWxlIE5hbWU6IHV0YWxsb2MgLSBsb2NhbCBjYWNoZSBhbmQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqIE1vZHVsZSBOYW1lOiB1dGFsbG9jIC0gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQxLDIzMiArNDEsMTM0IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRhbGxvYyIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGFsbG9jIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCiAjaWZkZWYJQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgotYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFjcGlfdXRfZmluZF9hbGxvY2F0aW9uKHZvaWQgKmFsbG9jYXRpb24pOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKK2FjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFkZHJlc3MsCisJCQkgYWNwaV9zaXplIHNpemUsCisJCQkgdTggYWxsb2NfdHlwZSwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7Ci0jZW5kaWYJLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbGVhc2VfdG9fY2FjaGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlzdF9pZCAgICAgICAgICAgICAtIE1lbW9yeSBsaXN0L2NhY2hlIElECi0gKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAtIFRoZSBvYmplY3QgdG8gYmUgcmVsZWFzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlLiAgSWYgY2FjaGUgaXMgZnVsbCwKLSAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9yZWxlYXNlX3RvX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KQotewotCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICAgICAgICAgKmNhY2hlX2luZm87Ci0KLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWNhY2hlX2luZm8gPSAmYWNwaV9nYmxfbWVtb3J5X2xpc3RzW2xpc3RfaWRdOwotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi0KLQkvKiBJZiB3YWxrIGNhY2hlIGlzIGZ1bGwsIGp1c3QgZnJlZSB0aGlzIHdhbGxrc3RhdGUgb2JqZWN0ICovCi0KLQlpZiAoY2FjaGVfaW5mby0+Y2FjaGVfZGVwdGggPj0gY2FjaGVfaW5mby0+bWF4X2NhY2hlX2RlcHRoKSB7Ci0JCUFDUElfTUVNX0ZSRUUgKG9iamVjdCk7Ci0JCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT50b3RhbF9mcmVlZCsrKTsKLQl9Ci0KLQkvKiBPdGhlcndpc2UgcHV0IHRoaXMgb2JqZWN0IGJhY2sgaW50byB0aGUgY2FjaGUgKi8KLQotCWVsc2UgewotCQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX0NBQ0hFUykpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBNYXJrIHRoZSBvYmplY3QgYXMgY2FjaGVkICovCi0KLQkJQUNQSV9NRU1TRVQgKG9iamVjdCwgMHhDQSwgY2FjaGVfaW5mby0+b2JqZWN0X3NpemUpOwotCQlBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCwgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEKTsKLQotCQkvKiBQdXQgdGhlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgY2FjaGUgbGlzdCAqLwotCi0JCSogKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsCi0JCQkmKCgoY2hhciAqKSBvYmplY3QpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKSA9IGNhY2hlX2luZm8tPmxpc3RfaGVhZDsKLQkJY2FjaGVfaW5mby0+bGlzdF9oZWFkID0gb2JqZWN0OwotCQljYWNoZV9pbmZvLT5jYWNoZV9kZXB0aCsrOwotCi0JCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0NBQ0hFUyk7Ci0JfQotCi0jZWxzZQotCi0JLyogT2JqZWN0IGNhY2hlIGlzIGRpc2FibGVkOyBqdXN0IGZyZWUgdGhlIG9iamVjdCAqLwotCi0JQUNQSV9NRU1fRlJFRSAob2JqZWN0KTsKLQlBQ1BJX01FTV9UUkFDS0lORyAoY2FjaGVfaW5mby0+dG90YWxfZnJlZWQrKyk7Ci0jZW5kaWYKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaXN0X2lkICAgICAgICAgICAgIC0gTWVtb3J5IGxpc3QgSUQKLSAqCi0gKiBSRVRVUk46ICAgICAgQSByZXF1ZXN0ZWQgb2JqZWN0LiAgTlVMTCBpZiB0aGUgb2JqZWN0IGNvdWxkIG5vdCBiZQotICogICAgICAgICAgICAgIGFsbG9jYXRlZC4KLSAqCi0gKiBERVNDUklQVElPTjogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FjaGUuICBJZiBjYWNoZSBpcyBlbXB0eSwKLSAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICoKLWFjcGlfdXRfYWNxdWlyZV9mcm9tX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQpCi17Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgICAgICAgICAqY2FjaGVfaW5mbzsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3Q7Ci0KLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoInV0X2FjcXVpcmVfZnJvbV9jYWNoZSIpOwotCi0KLQljYWNoZV9pbmZvID0gJmFjcGlfZ2JsX21lbW9yeV9saXN0c1tsaXN0X2lkXTsKLQotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotCi0JaWYgKEFDUElfRkFJTFVSRSAoYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9DQUNIRVMpKSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT5jYWNoZV9yZXF1ZXN0cysrKTsKLQotCS8qIENoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLwotCi0JaWYgKGNhY2hlX2luZm8tPmxpc3RfaGVhZCkgewotCQkvKiBUaGVyZSBpcyBhbiBvYmplY3QgYXZhaWxhYmxlLCB1c2UgaXQgKi8KLQotCQlvYmplY3QgPSBjYWNoZV9pbmZvLT5saXN0X2hlYWQ7Ci0JCWNhY2hlX2luZm8tPmxpc3RfaGVhZCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwKLQkJCQkgJigoKGNoYXIgKikgb2JqZWN0KVtjYWNoZV9pbmZvLT5saW5rX29mZnNldF0pKSk7Ci0KLQkJQUNQSV9NRU1fVFJBQ0tJTkcgKGNhY2hlX2luZm8tPmNhY2hlX2hpdHMrKyk7Ci0JCWNhY2hlX2luZm8tPmNhY2hlX2RlcHRoLS07CithY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqYWRkcmVzcywKKwkJCSAgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CisjZW5kaWYJCQkJLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmplY3QgJXAgZnJvbSAlc1xuIiwKLQkJCW9iamVjdCwgYWNwaV9nYmxfbWVtb3J5X2xpc3RzW2xpc3RfaWRdLmxpc3RfbmFtZSkpOworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NyZWF0ZV9saXN0KGNoYXIgKmxpc3RfbmFtZSwKKwkJICAgIHUxNiBvYmplY3Rfc2l6ZSwgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKipyZXR1cm5fY2FjaGUpOwogI2VuZGlmCiAKLQkJaWYgKEFDUElfRkFJTFVSRSAoYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9DQUNIRVMpKSkgewotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCi0JCS8qIENsZWFyICh6ZXJvKSB0aGUgcHJldmlvdXNseSB1c2VkIE9iamVjdCAqLwotCi0JCUFDUElfTUVNU0VUIChvYmplY3QsIDAsIGNhY2hlX2luZm8tPm9iamVjdF9zaXplKTsKLQl9Ci0KLQllbHNlIHsKLQkJLyogVGhlIGNhY2hlIGlzIGVtcHR5LCBjcmVhdGUgYSBuZXcgb2JqZWN0ICovCi0KLQkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX01FTV9DQUxMT0NBVEUgKi8KLQotCQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0NBQ0hFUykpKSB7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9Ci0KLQkJb2JqZWN0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChjYWNoZV9pbmZvLT5vYmplY3Rfc2l6ZSk7Ci0JCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT50b3RhbF9hbGxvY2F0ZWQrKyk7Ci0JfQotCi0jZWxzZQotCi0JLyogT2JqZWN0IGNhY2hlIGlzIGRpc2FibGVkOyBqdXN0IGFsbG9jYXRlIHRoZSBvYmplY3QgKi8KLQotCW9iamVjdCA9IEFDUElfTUVNX0NBTExPQ0FURSAoY2FjaGVfaW5mby0+b2JqZWN0X3NpemUpOwotCUFDUElfTUVNX1RSQUNLSU5HIChjYWNoZV9pbmZvLT50b3RhbF9hbGxvY2F0ZWQrKyk7Ci0jZW5kaWYKLQotCXJldHVybiAob2JqZWN0KTsKLX0KLQotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfY2FjaGVzCiAgKgotICogUEFSQU1FVEVSUzogIGxpc3RfaWQgICAgICAgICAtIE1lbW9yeSBsaXN0IElECisgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBOb25lCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEZyZWUgYWxsIG9iamVjdHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgY2FjaGUuCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGFsbCBsb2NhbCBjYWNoZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQpCithY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9jYWNoZXModm9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAgICAgICAgICpjYWNoZV9pbmZvOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisJLyogTWVtb3J5IGFsbG9jYXRpb24gbGlzdHMgKi8KIAotCi0JY2FjaGVfaW5mbyA9ICZhY3BpX2dibF9tZW1vcnlfbGlzdHNbbGlzdF9pZF07Ci0Jd2hpbGUgKGNhY2hlX2luZm8tPmxpc3RfaGVhZCkgewotCQkvKiBEZWxldGUgb25lIGNhY2hlZCBzdGF0ZSBvYmplY3QgKi8KLQotCQluZXh0ID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLAotCQkJCSAmKCgoY2hhciAqKSBjYWNoZV9pbmZvLT5saXN0X2hlYWQpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKTsKLQkJQUNQSV9NRU1fRlJFRSAoY2FjaGVfaW5mby0+bGlzdF9oZWFkKTsKLQotCQljYWNoZV9pbmZvLT5saXN0X2hlYWQgPSBuZXh0OwotCQljYWNoZV9pbmZvLT5jYWNoZV9kZXB0aC0tOworCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX2xpc3QoIkFjcGktR2xvYmFsIiwgMCwgJmFjcGlfZ2JsX2dsb2JhbF9saXN0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOwogCX0KLX0KKworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfY3JlYXRlX2xpc3QoIkFjcGktTmFtZXNwYWNlIiwKKwkJCQlzaXplb2Yoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpLAorCQkJCSZhY3BpX2dibF9uc19ub2RlX2xpc3QpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQogI2VuZGlmCiAKKwkvKiBPYmplY3QgQ2FjaGVzLCBmb3IgZnJlcXVlbnRseSB1c2VkIG9iamVjdHMgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJhY3BpX3N0YXRlIiwgc2l6ZW9mKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSksCisJCQkJIEFDUElfTUFYX1NUQVRFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfc3RhdGVfY2FjaGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoImFjcGlfcGFyc2UiLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiksCisJCQkJIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiYWNwaV9wYXJzZV9leHQiLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKSwKKwkJCQkgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEgsCisJCQkJICZhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiYWNwaV9vcGVyYW5kIiwKKwkJCQkgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpLAorCQkJCSBBQ1BJX01BWF9PQkpFQ1RfQ0FDSEVfREVQVEgsCisJCQkJICZhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9jYWNoZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHVyZ2UgYW5kIGRlbGV0ZSBhbGwgbG9jYWwgY2FjaGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfY2FjaGVzKHZvaWQpCit7CisKKwkodm9pZClhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CisJYWNwaV9nYmxfc3RhdGVfY2FjaGUgPSBOVUxMOworCisJKHZvaWQpYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSk7CisJYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSA9IE5VTEw7CisKKwkodm9pZClhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2dibF9wc19ub2RlX2NhY2hlKTsKKwlhY3BpX2dibF9wc19ub2RlX2NhY2hlID0gTlVMTDsKKworCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKKwlhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSA9IE5VTEw7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yODAsOSArMTgyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF92YWxpZGF0ZV9idWZmZXIgKAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmJ1ZmZlcikKK2FjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKIHsKIAogCS8qIE9idmlvdXNseSwgdGhlIHN0cnVjdHVyZSBwb2ludGVyIG11c3QgYmUgdmFsaWQgKi8KQEAgLTI5Myw5ICsxOTMsOSBAQAogCiAJLyogU3BlY2lhbCBzZW1hbnRpY3MgZm9yIHRoZSBsZW5ndGggKi8KIAotCWlmICgoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9OT19CVUZGRVIpICAgICAgICAgICAgICB8fAotCQkoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9CVUZGRVIpICAgICAgICB8fAotCQkoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVIpKSB7CisJaWYgKChidWZmZXItPmxlbmd0aCA9PSBBQ1BJX05PX0JVRkZFUikgfHwKKwkgICAgKGJ1ZmZlci0+bGVuZ3RoID09IEFDUElfQUxMT0NBVEVfQlVGRkVSKSB8fAorCSAgICAoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVIpKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KIApAQCAtMzA4LDcgKzIwOCw2IEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcgpAQCAtMzI0LDEyICsyMjMsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyICgKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpidWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9sZW5ndGgpCithY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlciwKKwkJCSAgYWNwaV9zaXplIHJlcXVpcmVkX2xlbmd0aCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlzd2l0Y2ggKGJ1ZmZlci0+bGVuZ3RoKSB7CiAJY2FzZSBBQ1BJX05PX0JVRkZFUjoKQEAgLTMzOSwzMyArMjM2LDMwIEBACiAJCXN0YXR1cyA9IEFFX0JVRkZFUl9PVkVSRkxPVzsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9BTExPQ0FURV9CVUZGRVI6CiAKIAkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyICovCiAKLQkJYnVmZmVyLT5wb2ludGVyID0gYWNwaV9vc19hbGxvY2F0ZSAocmVxdWlyZWRfbGVuZ3RoKTsKKwkJYnVmZmVyLT5wb2ludGVyID0gYWNwaV9vc19hbGxvY2F0ZShyZXF1aXJlZF9sZW5ndGgpOwogCQlpZiAoIWJ1ZmZlci0+cG9pbnRlcikgewogCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogQ2xlYXIgdGhlIGJ1ZmZlciAqLwogCi0JCUFDUElfTUVNU0VUIChidWZmZXItPnBvaW50ZXIsIDAsIHJlcXVpcmVkX2xlbmd0aCk7CisJCUFDUElfTUVNU0VUKGJ1ZmZlci0+cG9pbnRlciwgMCwgcmVxdWlyZWRfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI6CiAKIAkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIHdpdGggbG9jYWwgaW50ZXJmYWNlIHRvIGFsbG93IHRyYWNraW5nICovCiAKLQkJYnVmZmVyLT5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChyZXF1aXJlZF9sZW5ndGgpOworCQlidWZmZXItPnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUocmVxdWlyZWRfbGVuZ3RoKTsKIAkJaWYgKCFidWZmZXItPnBvaW50ZXIpIHsKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAogCQkvKiBFeGlzdGluZyBidWZmZXI6IFZhbGlkYXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KQEAgLTM3Nyw3ICsyNzEsNyBAQAogCiAJCS8qIENsZWFyIHRoZSBidWZmZXIgKi8KIAotCQlBQ1BJX01FTVNFVCAoYnVmZmVyLT5wb2ludGVyLCAwLCByZXF1aXJlZF9sZW5ndGgpOworCQlBQ1BJX01FTVNFVChidWZmZXItPnBvaW50ZXIsIDAsIHJlcXVpcmVkX2xlbmd0aCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzg1LDcgKzI3OSw2IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGUKQEAgLTQwMSw0MSArMjk0LDM0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX3V0X2FsbG9jYXRlICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGUoYWNwaV9zaXplIHNpemUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NhdGlvbjsKKwl2b2lkICphbGxvY2F0aW9uOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInV0X2FsbG9jYXRlIiwgc2l6ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidXRfYWxsb2NhdGUiLCBzaXplKTsKIAogCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KIAogCWlmICghc2l6ZSkgewotCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfYWxsb2NhdGU6IEF0dGVtcHQgdG8gYWxsb2NhdGUgemVybyBieXRlc1xuIikpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCisJCQkJICAgKCJ1dF9hbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzXG4iKSk7CiAJCXNpemUgPSAxOwogCX0KIAotCWFsbG9jYXRpb24gPSBhY3BpX29zX2FsbG9jYXRlIChzaXplKTsKKwlhbGxvY2F0aW9uID0gYWNwaV9vc19hbGxvY2F0ZShzaXplKTsKIAlpZiAoIWFsbG9jYXRpb24pIHsKIAkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KIAotCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfYWxsb2NhdGU6IENvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLCAodTMyKSBzaXplKSk7CisJCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKKwkJCQkgICAoInV0X2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKKwkJCQkgICAgKHUzMikgc2l6ZSkpOwogCi0JCXJldHVybl9QVFIgKE5VTEwpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCXJldHVybl9QVFIgKGFsbG9jYXRpb24pOworCXJldHVybl9QVFIoYWxsb2NhdGlvbik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jYWxsb2NhdGUKQEAgLTQ1MSw0MyArMzM3LDM2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX3V0X2NhbGxvY2F0ZSAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCit2b2lkICphY3BpX3V0X2NhbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSkKIHsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uOworCXZvaWQgKmFsbG9jYXRpb247CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgidXRfY2FsbG9jYXRlIiwgc2l6ZSk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidXRfY2FsbG9jYXRlIiwgc2l6ZSk7CiAKIAkvKiBDaGVjayBmb3IgYW4gaW5hZHZlcnRlbnQgc2l6ZSBvZiB6ZXJvIGJ5dGVzICovCiAKIAlpZiAoIXNpemUpIHsKLQkJX0FDUElfUkVQT1JUX0VSUk9SIChtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKLQkJCQkoInV0X2NhbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzXG4iKSk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCisJCQkJICAgKCJ1dF9jYWxsb2NhdGU6IEF0dGVtcHQgdG8gYWxsb2NhdGUgemVybyBieXRlc1xuIikpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAotCWFsbG9jYXRpb24gPSBhY3BpX29zX2FsbG9jYXRlIChzaXplKTsKKwlhbGxvY2F0aW9uID0gYWNwaV9vc19hbGxvY2F0ZShzaXplKTsKIAlpZiAoIWFsbG9jYXRpb24pIHsKIAkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KIAotCQlfQUNQSV9SRVBPUlRfRVJST1IgKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAotCQkJCSgidXRfY2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwgKHUzMikgc2l6ZSkpOwotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgidXRfY2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKKwkJCQkgICAgKHUzMikgc2l6ZSkpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIENsZWFyIHRoZSBtZW1vcnkgYmxvY2sgKi8KIAotCUFDUElfTUVNU0VUIChhbGxvY2F0aW9uLCAwLCBzaXplKTsKLQlyZXR1cm5fUFRSIChhbGxvY2F0aW9uKTsKKwlBQ1BJX01FTVNFVChhbGxvY2F0aW9uLCAwLCBzaXplKTsKKwlyZXR1cm5fUFRSKGFsbG9jYXRpb24pOwogfQogCi0KICNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwogLyoKICAqIFRoZXNlIHByb2NlZHVyZXMgYXJlIHVzZWQgZm9yIHRyYWNraW5nIG1lbW9yeSBsZWFrcyBpbiB0aGUgc3Vic3lzdGVtLCBhbmQKQEAgLTUwMCw2ICszNzksMzkgQEAKICAqIG9jY3VycyBpbiB0aGUgYm9keSBvZiBhY3BpX3V0X2ZyZWUuCiAgKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfbGlzdAorICoKKyAqIFBBUkFNRVRFUlM6ICBjYWNoZV9uYW1lICAgICAgLSBBc2NpaSBuYW1lIGZvciB0aGUgY2FjaGUKKyAqICAgICAgICAgICAgICBvYmplY3Rfc2l6ZSAgICAgLSBTaXplIG9mIGVhY2ggY2FjaGVkIG9iamVjdAorICogICAgICAgICAgICAgIHJldHVybl9jYWNoZSAgICAtIFdoZXJlIHRoZSBuZXcgY2FjaGUgb2JqZWN0IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBsb2NhbCBtZW1vcnkgbGlzdCBmb3IgdHJhY2tpbmcgcHVycG9zZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY3JlYXRlX2xpc3QoY2hhciAqbGlzdF9uYW1lLAorCQkgICAgdTE2IG9iamVjdF9zaXplLCBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqKnJldHVybl9jYWNoZSkKK3sKKwlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqY2FjaGU7CisKKwljYWNoZSA9IGFjcGlfb3NfYWxsb2NhdGUoc2l6ZW9mKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0KSk7CisJaWYgKCFjYWNoZSkgeworCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJfQorCisJQUNQSV9NRU1TRVQoY2FjaGUsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOworCisJY2FjaGUtPmxpc3RfbmFtZSA9IGxpc3RfbmFtZTsKKwljYWNoZS0+b2JqZWN0X3NpemUgPSBvYmplY3Rfc2l6ZTsKKworCSpyZXR1cm5fY2FjaGUgPSBjYWNoZTsKKwlyZXR1cm4gKEFFX09LKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01MTYsMzcgKzQyOCwzMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgKgotYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2sgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCisJCQkJIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFsbG9jYXRpb247CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlhbGxvY2F0aW9uID0gYWNwaV91dF9hbGxvY2F0ZSAoc2l6ZSArIHNpemVvZiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksCi0JCQkgIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKKwlhbGxvY2F0aW9uID0KKwkgICAgYWNwaV91dF9hbGxvY2F0ZShzaXplICsgc2l6ZW9mKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLAorCQkJICAgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF90cmFja19hbGxvY2F0aW9uIChBQ1BJX01FTV9MSVNUX0dMT0JBTCwgYWxsb2NhdGlvbiwgc2l6ZSwKLQkJCSAgQUNQSV9NRU1fTUFMTE9DLCBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlhY3BpX29zX2ZyZWUgKGFsbG9jYXRpb24pOworCXN0YXR1cyA9IGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbihhbGxvY2F0aW9uLCBzaXplLAorCQkJCQkgIEFDUElfTUVNX01BTExPQywgY29tcG9uZW50LCBtb2R1bGUsCisJCQkJCSAgbGluZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfb3NfZnJlZShhbGxvY2F0aW9uKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9HTE9CQUxdLnRvdGFsX2FsbG9jYXRlZCsrOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX0dMT0JBTF0uY3VycmVudF90b3RhbF9zaXplICs9ICh1MzIpIHNpemU7CisJYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPnRvdGFsX2FsbG9jYXRlZCsrOworCWFjcGlfZ2JsX2dsb2JhbF9saXN0LT5jdXJyZW50X3RvdGFsX3NpemUgKz0gKHUzMikgc2l6ZTsKIAotCXJldHVybiAoKHZvaWQgKikgJmFsbG9jYXRpb24tPnVzZXJfc3BhY2UpOworCXJldHVybiAoKHZvaWQgKikmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrCkBAIC01NjIsNDEgKzQ3MCwzOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgKgotYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKK3ZvaWQgKmFjcGlfdXRfY2FsbG9jYXRlX2FuZF90cmFjayhhY3BpX3NpemUgc2l6ZSwKKwkJCQkgIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbjsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFsbG9jYXRpb247CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlhbGxvY2F0aW9uID0gYWNwaV91dF9jYWxsb2NhdGUgKHNpemUgKyBzaXplb2YgKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLAotCQkJICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CisJYWxsb2NhdGlvbiA9CisJICAgIGFjcGlfdXRfY2FsbG9jYXRlKHNpemUgKyBzaXplb2Yoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciksCisJCQkgICAgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CiAJCS8qIFJlcG9ydCBhbGxvY2F0aW9uIGVycm9yICovCiAKLQkJX0FDUElfUkVQT1JUX0VSUk9SIChtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKLQkJCQkoInV0X2NhbGxvY2F0ZTogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsICh1MzIpIHNpemUpKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgidXRfY2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKKwkJCQkgICAgKHUzMikgc2l6ZSkpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoQUNQSV9NRU1fTElTVF9HTE9CQUwsIGFsbG9jYXRpb24sIHNpemUsCi0JCQkgICBBQ1BJX01FTV9DQUxMT0MsIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCWFjcGlfb3NfZnJlZSAoYWxsb2NhdGlvbik7CisJc3RhdHVzID0gYWNwaV91dF90cmFja19hbGxvY2F0aW9uKGFsbG9jYXRpb24sIHNpemUsCisJCQkJCSAgQUNQSV9NRU1fQ0FMTE9DLCBjb21wb25lbnQsIG1vZHVsZSwKKwkJCQkJICBsaW5lKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9vc19mcmVlKGFsbG9jYXRpb24pOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX0dMT0JBTF0udG90YWxfYWxsb2NhdGVkKys7Ci0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfR0xPQkFMXS5jdXJyZW50X3RvdGFsX3NpemUgKz0gKHUzMikgc2l6ZTsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdC0+dG90YWxfYWxsb2NhdGVkKys7CisJYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPmN1cnJlbnRfdG90YWxfc2l6ZSArPSAodTMyKSBzaXplOwogCi0JcmV0dXJuICgodm9pZCAqKSAmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSk7CisJcmV0dXJuICgodm9pZCAqKSZhbGxvY2F0aW9uLT51c2VyX3NwYWNlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2ZyZWVfYW5kX3RyYWNrCkBAIC02MTMsNTMgKzUxOCw0NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9mcmVlX2FuZF90cmFjayAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NhdGlvbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQorYWNwaV91dF9mcmVlX2FuZF90cmFjayh2b2lkICphbGxvY2F0aW9uLCB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQogewotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmRlYnVnX2Jsb2NrOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZGVidWdfYmxvY2s7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2ZyZWUiLCBhbGxvY2F0aW9uKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9mcmVlIiwgYWxsb2NhdGlvbik7CiAKIAlpZiAoTlVMTCA9PSBhbGxvY2F0aW9uKSB7Ci0JCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkoImFjcGlfdXRfZnJlZTogQXR0ZW1wdCB0byBkZWxldGUgYSBOVUxMIGFkZHJlc3NcbiIpKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgiYWNwaV91dF9mcmVlOiBBdHRlbXB0IHRvIGRlbGV0ZSBhIE5VTEwgYWRkcmVzc1xuIikpOwogCiAJCXJldHVybl9WT0lEOwogCX0KIAotCWRlYnVnX2Jsb2NrID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrLAotCQkJICAoKChjaGFyICopIGFsbG9jYXRpb24pIC0gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSkpOworCWRlYnVnX2Jsb2NrID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2ssCisJCQkJICAgICgoKGNoYXIgKilhbGxvY2F0aW9uKSAtCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlcikpKTsKIAotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX0dMT0JBTF0udG90YWxfZnJlZWQrKzsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9HTE9CQUxdLmN1cnJlbnRfdG90YWxfc2l6ZSAtPSBkZWJ1Z19ibG9jay0+c2l6ZTsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdC0+dG90YWxfZnJlZWQrKzsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdC0+Y3VycmVudF90b3RhbF9zaXplIC09IGRlYnVnX2Jsb2NrLT5zaXplOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoQUNQSV9NRU1fTElTVF9HTE9CQUwsIGRlYnVnX2Jsb2NrLAotCQkJICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBmcmVlIG1lbW9yeSwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uKGRlYnVnX2Jsb2NrLAorCQkJCQkgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJDb3VsZCBub3QgZnJlZSBtZW1vcnksICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKLQlhY3BpX29zX2ZyZWUgKGRlYnVnX2Jsb2NrKTsKKwlhY3BpX29zX2ZyZWUoZGVidWdfYmxvY2spOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBmcmVlZFxuIiwgYWxsb2NhdGlvbikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBmcmVlZFxuIiwgYWxsb2NhdGlvbikpOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9maW5kX2FsbG9jYXRpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgbGlzdF9pZCAgICAgICAgICAgICAgICAgLSBNZW1vcnkgbGlzdCB0byBzZWFyY2gKLSAqICAgICAgICAgICAgICBBbGxvY2F0aW9uICAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeQorICogUEFSQU1FVEVSUzogIEFsbG9jYXRpb24gICAgICAgICAgICAgIC0gQWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgKgogICogUkVUVVJOOiAgICAgIEEgbGlzdCBlbGVtZW50IGlmIGZvdW5kOyBOVUxMIG90aGVyd2lzZS4KICAqCkBAIC02NjcsMjIgKzU2NSwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgotYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY2F0aW9uKQorc3RhdGljIHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqYWNwaV91dF9maW5kX2FsbG9jYXRpb24odm9pZCAqYWxsb2NhdGlvbikKIHsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICplbGVtZW50OworCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZWxlbWVudDsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWlmIChsaXN0X2lkID4gQUNQSV9NRU1fTElTVF9NQVgpIHsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQllbGVtZW50ID0gYWNwaV9nYmxfbWVtb3J5X2xpc3RzW2xpc3RfaWRdLmxpc3RfaGVhZDsKKwllbGVtZW50ID0gYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPmxpc3RfaGVhZDsKIAogCS8qIFNlYXJjaCBmb3IgdGhlIGFkZHJlc3MuICovCiAKQEAgLTY5NywxMyArNTg2LDExIEBACiAJcmV0dXJuIChOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgbGlzdF9pZCAgICAgICAgICAgICAtIE1lbW9yeSBsaXN0IHRvIHNlYXJjaAotICogICAgICAgICAgICAgIEFsbG9jYXRpb24gICAgICAgICAgLSBBZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkKKyAqIFBBUkFNRVRFUlM6ICBBbGxvY2F0aW9uICAgICAgICAgIC0gQWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgKiAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgICAtIFNpemUgb2YgdGhlIGFsbG9jYXRpb24KICAqICAgICAgICAgICAgICBhbGxvY190eXBlICAgICAgICAgIC0gTUVNX01BTExPQyBvciBNRU1fQ0FMTE9DCiAgKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgpAQCAtNzE3LDY0ICs2MDQsNTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF90cmFja19hbGxvY2F0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCi0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWxsb2NhdGlvbiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCithY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphbGxvY2F0aW9uLAorCQkJIGFjcGlfc2l6ZSBzaXplLAorCQkJIHU4IGFsbG9jX3R5cGUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgICAgICAgICAqbWVtX2xpc3Q7Ci0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqZWxlbWVudDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICptZW1fbGlzdDsKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmVsZW1lbnQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfdHJhY2tfYWxsb2NhdGlvbiIsIGFsbG9jYXRpb24pOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF90cmFja19hbGxvY2F0aW9uIiwgYWxsb2NhdGlvbik7Ci0KLQotCWlmIChsaXN0X2lkID4gQUNQSV9NRU1fTElTVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQltZW1fbGlzdCA9ICZhY3BpX2dibF9tZW1vcnlfbGlzdHNbbGlzdF9pZF07Ci0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4IChBQ1BJX01UWF9NRU1PUlkpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCW1lbV9saXN0ID0gYWNwaV9nYmxfZ2xvYmFsX2xpc3Q7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX01FTU9SWSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogU2VhcmNoIGxpc3QgZm9yIHRoaXMgYWRkcmVzcyB0byBtYWtlIHN1cmUgaXQgaXMgbm90IGFscmVhZHkgb24gdGhlIGxpc3QuCiAJICogVGhpcyB3aWxsIGNhdGNoIHNldmVyYWwga2luZHMgb2YgcHJvYmxlbXMuCiAJICovCi0KLQllbGVtZW50ID0gYWNwaV91dF9maW5kX2FsbG9jYXRpb24gKGxpc3RfaWQsIGFsbG9jYXRpb24pOworCWVsZW1lbnQgPSBhY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbihhbGxvY2F0aW9uKTsKIAlpZiAoZWxlbWVudCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAotCQkJInV0X3RyYWNrX2FsbG9jYXRpb246IEFsbG9jYXRpb24gYWxyZWFkeSBwcmVzZW50IGluIGxpc3QhICglcClcbiIsCi0JCQlhbGxvY2F0aW9uKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgidXRfdHJhY2tfYWxsb2NhdGlvbjogQWxsb2NhdGlvbiBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdCEgKCVwKVxuIiwgYWxsb2NhdGlvbikpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiRWxlbWVudCAlcCBBZGRyZXNzICVwXG4iLAotCQkJZWxlbWVudCwgYWxsb2NhdGlvbikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRWxlbWVudCAlcCBBZGRyZXNzICVwXG4iLAorCQkJCSAgZWxlbWVudCwgYWxsb2NhdGlvbikpOwogCiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEZpbGwgaW4gdGhlIGluc3RhbmNlIGRhdGEuICovCiAKLQlhbGxvY2F0aW9uLT5zaXplICAgICAgPSAodTMyKSBzaXplOworCWFsbG9jYXRpb24tPnNpemUgPSAodTMyKSBzaXplOwogCWFsbG9jYXRpb24tPmFsbG9jX3R5cGUgPSBhbGxvY190eXBlOwogCWFsbG9jYXRpb24tPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQlhbGxvY2F0aW9uLT5saW5lICAgICAgPSBsaW5lOworCWFsbG9jYXRpb24tPmxpbmUgPSBsaW5lOwogCi0JQUNQSV9TVFJOQ1BZIChhbGxvY2F0aW9uLT5tb2R1bGUsIG1vZHVsZSwgQUNQSV9NQVhfTU9EVUxFX05BTUUpOwotCWFsbG9jYXRpb24tPm1vZHVsZVtBQ1BJX01BWF9NT0RVTEVfTkFNRS0xXSA9IDA7CisJQUNQSV9TVFJOQ1BZKGFsbG9jYXRpb24tPm1vZHVsZSwgbW9kdWxlLCBBQ1BJX01BWF9NT0RVTEVfTkFNRSk7CisJYWxsb2NhdGlvbi0+bW9kdWxlW0FDUElfTUFYX01PRFVMRV9OQU1FIC0gMV0gPSAwOwogCiAJLyogSW5zZXJ0IGF0IGxpc3QgaGVhZCAqLwogCiAJaWYgKG1lbV9saXN0LT5saXN0X2hlYWQpIHsKLQkJKChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKikobWVtX2xpc3QtPmxpc3RfaGVhZCkpLT5wcmV2aW91cyA9IGFsbG9jYXRpb247CisJCSgoc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICopKG1lbV9saXN0LT5saXN0X2hlYWQpKS0+CisJCSAgICBwcmV2aW91cyA9IGFsbG9jYXRpb247CiAJfQogCiAJYWxsb2NhdGlvbi0+bmV4dCA9IG1lbV9saXN0LT5saXN0X2hlYWQ7CkBAIC03ODIsMTkgKzY1NiwxNiBAQAogCiAJbWVtX2xpc3QtPmxpc3RfaGVhZCA9IGFsbG9jYXRpb247CiAKLQotdW5sb2NrX2FuZF9leGl0OgotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX01FTU9SWSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbgogICoKLSAqIFBBUkFNRVRFUlM6ICBsaXN0X2lkICAgICAgICAgICAgIC0gTWVtb3J5IGxpc3QgdG8gc2VhcmNoCi0gKiAgICAgICAgICAgICAgQWxsb2NhdGlvbiAgICAgICAgICAtIEFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeQorICogUEFSQU1FVEVSUzogIEFsbG9jYXRpb24gICAgICAgICAgLSBBZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkKICAqICAgICAgICAgICAgICBDb21wb25lbnQgICAgICAgICAgIC0gQ29tcG9uZW50IHR5cGUgb2YgY2FsbGVyCiAgKiAgICAgICAgICAgICAgTW9kdWxlICAgICAgICAgICAgICAtIFNvdXJjZSBmaWxlIG5hbWUgb2YgY2FsbGVyCiAgKiAgICAgICAgICAgICAgTGluZSAgICAgICAgICAgICAgICAtIExpbmUgbnVtYmVyIG9mIGNhbGxlcgpAQCAtODA2LDQ1ICs2NzcsMzQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFsbG9jYXRpb24sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKK2FjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphbGxvY2F0aW9uLAorCQkJICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQogewotCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICAgICAgICAgKm1lbV9saXN0OwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICptZW1fbGlzdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9yZW1vdmVfYWxsb2NhdGlvbiIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3JlbW92ZV9hbGxvY2F0aW9uIik7Ci0KLQotCWlmIChsaXN0X2lkID4gQUNQSV9NRU1fTElTVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQltZW1fbGlzdCA9ICZhY3BpX2dibF9tZW1vcnlfbGlzdHNbbGlzdF9pZF07CisJbWVtX2xpc3QgPSBhY3BpX2dibF9nbG9iYWxfbGlzdDsKIAlpZiAoTlVMTCA9PSBtZW1fbGlzdC0+bGlzdF9oZWFkKSB7CiAJCS8qIE5vIGFsbG9jYXRpb25zISAqLwogCi0JCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkoInV0X3JlbW92ZV9hbGxvY2F0aW9uOiBFbXB0eSBhbGxvY2F0aW9uIGxpc3QsIG5vdGhpbmcgdG8gZnJlZSFcbiIpKTsKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQkJCSAgICgidXRfcmVtb3ZlX2FsbG9jYXRpb246IEVtcHR5IGFsbG9jYXRpb24gbGlzdCwgbm90aGluZyB0byBmcmVlIVxuIikpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogVW5saW5rICovCiAKIAlpZiAoYWxsb2NhdGlvbi0+cHJldmlvdXMpIHsKIAkJKGFsbG9jYXRpb24tPnByZXZpb3VzKS0+bmV4dCA9IGFsbG9jYXRpb24tPm5leHQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCW1lbV9saXN0LT5saXN0X2hlYWQgPSBhbGxvY2F0aW9uLT5uZXh0OwogCX0KIApAQCAtODU0LDE2ICs3MTQsMTUgQEAKIAogCS8qIE1hcmsgdGhlIHNlZ21lbnQgYXMgZGVsZXRlZCAqLwogCi0JQUNQSV9NRU1TRVQgKCZhbGxvY2F0aW9uLT51c2VyX3NwYWNlLCAweEVBLCBhbGxvY2F0aW9uLT5zaXplKTsKKwlBQ1BJX01FTVNFVCgmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSwgMHhFQSwgYWxsb2NhdGlvbi0+c2l6ZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkZyZWVpbmcgc2l6ZSAwJVhcbiIsCi0JCWFsbG9jYXRpb24tPnNpemUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZWluZyBzaXplIDAlWFxuIiwKKwkJCSAgYWxsb2NhdGlvbi0+c2l6ZSkpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9NRU1PUlkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvCkBAIC04NzcsMTUgKzczNiwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvICgKLQl2b2lkKQordm9pZCBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvKHZvaWQpCiB7CiAvKgogCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICAgICAgICAgKm1lbV9saXN0OwogKi8KIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9kdW1wX2FsbG9jYXRpb25faW5mbyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2R1bXBfYWxsb2NhdGlvbl9pbmZvIik7CiAKIC8qCiAJQUNQSV9ERUJVR19QUklOVCAoVFJBQ0VfQUxMT0NBVElPTlMgfCBUUkFDRV9UQUJMRVMsCkBAIC04OTgsNyArNzU1LDYgQEAKIAkJCSAgbWVtX2xpc3QtPm1heF9jb25jdXJyZW50X2NvdW50LAogCQkJICBST1VORF9VUF9UT18xSyAobWVtX2xpc3QtPm1heF9jb25jdXJyZW50X3NpemUpKSk7CiAKLQogCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAogCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIlRvdGFsIChhbGwpIGludGVybmFsIG9iamVjdHMiLAogCQkJICBydW5uaW5nX29iamVjdF9jb3VudCwKQEAgLTkwOSw3ICs3NjUsNiBAQAogCQkJICBydW5uaW5nX2FsbG9jX2NvdW50LAogCQkJICBST1VORF9VUF9UT18xSyAocnVubmluZ19hbGxvY19zaXplKSkpOwogCi0KIAlBQ1BJX0RFQlVHX1BSSU5UIChUUkFDRV9BTExPQ0FUSU9OUyB8IFRSQUNFX1RBQkxFUywKIAkJCSAgKCIlMzBzOiAlNGQgKCUzZCBLYilcbiIsICJDdXJyZW50IE5vZGVzIiwKIAkJCSAgYWNwaV9nYmxfY3VycmVudF9ub2RlX2NvdW50LApAQCAtOTIzLDggKzc3OCw3IEBACiAqLwogCXJldHVybl9WT0lEOwogfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTM5LDg0ICs3OTMsODcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSkKK3ZvaWQgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zKHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICplbGVtZW50OwotCXVuaW9uIGFjcGlfZGVzY3JpcHRvciAgICAgICAgICAgKmRlc2NyaXB0b3I7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fb3V0c3RhbmRpbmcgPSAwOworCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZWxlbWVudDsKKwl1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3I7CisJdTMyIG51bV9vdXRzdGFuZGluZyA9IDA7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9kdW1wX2FsbG9jYXRpb25zIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kdW1wX2FsbG9jYXRpb25zIik7CiAKIAkvKgogCSAqIFdhbGsgdGhlIGFsbG9jYXRpb24gbGlzdC4KIAkgKi8KLQlpZiAoQUNQSV9GQUlMVVJFIChhY3BpX3V0X2FjcXVpcmVfbXV0ZXggKEFDUElfTVRYX01FTU9SWSkpKSB7CisJaWYgKEFDUElfRkFJTFVSRShhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKSkpIHsKIAkJcmV0dXJuOwogCX0KIAotCWVsZW1lbnQgPSBhY3BpX2dibF9tZW1vcnlfbGlzdHNbMF0ubGlzdF9oZWFkOworCWVsZW1lbnQgPSBhY3BpX2dibF9nbG9iYWxfbGlzdC0+bGlzdF9oZWFkOwogCXdoaWxlIChlbGVtZW50KSB7CiAJCWlmICgoZWxlbWVudC0+Y29tcG9uZW50ICYgY29tcG9uZW50KSAmJgotCQkJKChtb2R1bGUgPT0gTlVMTCkgfHwgKDAgPT0gQUNQSV9TVFJDTVAgKG1vZHVsZSwgZWxlbWVudC0+bW9kdWxlKSkpKSB7CisJCSAgICAoKG1vZHVsZSA9PSBOVUxMKQorCQkgICAgIHx8ICgwID09IEFDUElfU1RSQ01QKG1vZHVsZSwgZWxlbWVudC0+bW9kdWxlKSkpKSB7CiAJCQkvKiBJZ25vcmUgYWxsb2NhdGVkIG9iamVjdHMgdGhhdCBhcmUgaW4gYSBjYWNoZSAqLwogCi0JCQlkZXNjcmlwdG9yID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9kZXNjcmlwdG9yLCAmZWxlbWVudC0+dXNlcl9zcGFjZSk7CisJCQlkZXNjcmlwdG9yID0KKwkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfZGVzY3JpcHRvciwKKwkJCQkJICAmZWxlbWVudC0+dXNlcl9zcGFjZSk7CiAJCQlpZiAoZGVzY3JpcHRvci0+ZGVzY3JpcHRvcl9pZCAhPSBBQ1BJX0RFU0NfVFlQRV9DQUNIRUQpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiVwIExlbiAlMDRYICU5LjlzLSVkIFslc10gIiwKLQkJCQkJZGVzY3JpcHRvciwgZWxlbWVudC0+c2l6ZSwgZWxlbWVudC0+bW9kdWxlLAotCQkJCQllbGVtZW50LT5saW5lLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGRlc2NyaXB0b3IpKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiJXAgTGVuICUwNFggJTkuOXMtJWQgWyVzXSAiLAorCQkJCQkgICAgICAgZGVzY3JpcHRvciwgZWxlbWVudC0+c2l6ZSwKKwkJCQkJICAgICAgIGVsZW1lbnQtPm1vZHVsZSwgZWxlbWVudC0+bGluZSwKKwkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQorCQkJCQkgICAgICAgKGRlc2NyaXB0b3IpKTsKIAogCQkJCS8qIE1vc3Qgb2YgdGhlIGVsZW1lbnRzIHdpbGwgYmUgT3BlcmFuZCBvYmplY3RzLiAqLwogCi0JCQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGRlc2NyaXB0b3IpKSB7CisJCQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZGVzY3JpcHRvcikpIHsKIAkJCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmICgiJTEyLjEycyBSJWhkIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoZGVzY3JpcHRvci0+b2JqZWN0LmNvbW1vbi50eXBlKSwKLQkJCQkJCWRlc2NyaXB0b3ItPm9iamVjdC5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKKwkJCQkJYWNwaV9vc19wcmludGYoIiUxMi4xMnMgUiVoZCIsCisJCQkJCQkgICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCisJCQkJCQkgICAgICAgKGRlc2NyaXB0b3ItPm9iamVjdC4KKwkJCQkJCQljb21tb24udHlwZSksCisJCQkJCQkgICAgICAgZGVzY3JpcHRvci0+b2JqZWN0LgorCQkJCQkJICAgICAgIGNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfUEFSU0VSOgotCQkJCQlhY3BpX29zX3ByaW50ZiAoImFtbF9vcGNvZGUgJTA0aFgiLAotCQkJCQkJZGVzY3JpcHRvci0+b3AuYXNsLmFtbF9vcGNvZGUpOworCQkJCQlhY3BpX29zX3ByaW50ZigiYW1sX29wY29kZSAlMDRoWCIsCisJCQkJCQkgICAgICAgZGVzY3JpcHRvci0+b3AuYXNsLgorCQkJCQkJICAgICAgIGFtbF9vcGNvZGUpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmICgiJTQuNHMiLAotCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lICgmZGVzY3JpcHRvci0+bm9kZSkpOworCQkJCQlhY3BpX29zX3ByaW50ZigiJTQuNHMiLAorCQkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZQorCQkJCQkJICAgICAgICgmZGVzY3JpcHRvci0+bm9kZSkpOwogCQkJCQlicmVhazsKIAogCQkJCWRlZmF1bHQ6CiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJCWFjcGlfb3NfcHJpbnRmICggIlxuIik7CisJCQkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCQkJbnVtX291dHN0YW5kaW5nKys7CiAJCQl9CiAJCX0KIAkJZWxlbWVudCA9IGVsZW1lbnQtPm5leHQ7CiAJfQogCi0JKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKIAogCS8qIFByaW50IHN1bW1hcnkgKi8KIAogCWlmICghbnVtX291dHN0YW5kaW5nKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIk5vIG91dHN0YW5kaW5nIGFsbG9jYXRpb25zLlxuIikpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiJWQoJVgpIE91dHN0YW5kaW5nIGFsbG9jYXRpb25zXG4iLAotCQkJbnVtX291dHN0YW5kaW5nLCBudW1fb3V0c3RhbmRpbmcpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyBvdXRzdGFuZGluZyBhbGxvY2F0aW9ucy5cbiIpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVkKCVYKSBPdXRzdGFuZGluZyBhbGxvY2F0aW9uc1xuIiwKKwkJCQkgIG51bV9vdXRzdGFuZGluZywgbnVtX291dHN0YW5kaW5nKSk7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLSNlbmRpZiAgLyogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TICovCi0KKyNlbmRpZgkJCQkvKiAjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjYWNoZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNDg2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjYWNoZS5jCkBAIC0wLDAgKzEsMzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHV0Y2FjaGUgLSBsb2NhbCBjYWNoZSBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRjYWNoZSIpCisKKyNpZmRlZiBBQ1BJX1VTRV9MT0NBTF9DQUNIRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19jcmVhdGVfY2FjaGUKKyAqCisgKiBQQVJBTUVURVJTOiAgY2FjaGVfbmFtZSAgICAgIC0gQXNjaWkgbmFtZSBmb3IgdGhlIGNhY2hlCisgKiAgICAgICAgICAgICAgb2JqZWN0X3NpemUgICAgIC0gU2l6ZSBvZiBlYWNoIGNhY2hlZCBvYmplY3QKKyAqICAgICAgICAgICAgICBtYXhfZGVwdGggICAgICAgLSBNYXhpbXVtIGRlcHRoIG9mIHRoZSBjYWNoZSAoaW4gb2JqZWN0cykKKyAqICAgICAgICAgICAgICByZXR1cm5fY2FjaGUgICAgLSBXaGVyZSB0aGUgbmV3IGNhY2hlIG9iamVjdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgY2FjaGUgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX29zX2NyZWF0ZV9jYWNoZShjaGFyICpjYWNoZV9uYW1lLAorCQkgICAgIHUxNiBvYmplY3Rfc2l6ZSwKKwkJICAgICB1MTYgbWF4X2RlcHRoLCBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqKnJldHVybl9jYWNoZSkKK3sKKwlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqY2FjaGU7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoIWNhY2hlX25hbWUgfHwgIXJldHVybl9jYWNoZSB8fCAob2JqZWN0X3NpemUgPCAxNikpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGNhY2hlIG9iamVjdCAqLworCisJY2FjaGUgPSBhY3BpX29zX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOworCWlmICghY2FjaGUpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCS8qIFBvcHVsYXRlIHRoZSBjYWNoZSBvYmplY3QgYW5kIHJldHVybiBpdCAqLworCisJQUNQSV9NRU1TRVQoY2FjaGUsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOworCWNhY2hlLT5saW5rX29mZnNldCA9IDg7CisJY2FjaGUtPmxpc3RfbmFtZSA9IGNhY2hlX25hbWU7CisJY2FjaGUtPm9iamVjdF9zaXplID0gb2JqZWN0X3NpemU7CisJY2FjaGUtPm1heF9kZXB0aCA9IG1heF9kZXB0aDsKKworCSpyZXR1cm5fY2FjaGUgPSBjYWNoZTsKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19wdXJnZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcHVyZ2VfY2FjaGUoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKiBjYWNoZSkKK3sKKwljaGFyICpuZXh0OworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJaWYgKCFjYWNoZSkgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIFdhbGsgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBpbiB0aGlzIGNhY2hlICovCisKKwl3aGlsZSAoY2FjaGUtPmxpc3RfaGVhZCkgeworCQkvKiBEZWxldGUgYW5kIHVubGluayBvbmUgY2FjaGVkIHN0YXRlIG9iamVjdCAqLworCisJCW5leHQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoY2hhciwKKwkJCQkJCSYoKChjaGFyICopY2FjaGUtPgorCQkJCQkJICAgbGlzdF9oZWFkKVtjYWNoZS0+CisJCQkJCQkJICAgICAgbGlua19vZmZzZXRdKSkpOworCQlBQ1BJX01FTV9GUkVFKGNhY2hlLT5saXN0X2hlYWQpOworCisJCWNhY2hlLT5saXN0X2hlYWQgPSBuZXh0OworCQljYWNoZS0+Y3VycmVudF9kZXB0aC0tOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2RlbGV0ZV9jYWNoZQorICoKKyAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlIGFuZCBkZWxldGUgdGhlCisgKiAgICAgICAgICAgICAgY2FjaGUgb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfZGVsZXRlX2NhY2hlKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICogY2FjaGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogUHVyZ2UgYWxsIG9iamVjdHMgaW4gdGhlIGNhY2hlICovCisKKwlzdGF0dXMgPSBhY3BpX29zX3B1cmdlX2NhY2hlKGNhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBjYWNoZSBvYmplY3QgKi8KKworCWFjcGlfb3NfZnJlZShjYWNoZSk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfcmVsZWFzZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgQ2FjaGUgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgLSBUaGUgb2JqZWN0IHRvIGJlIHJlbGVhc2VkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVsZWFzZSBhbiBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBjYWNoZS4gIElmIGNhY2hlIGlzIGZ1bGwsCisgKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBkZWxldGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX29zX3JlbGVhc2Vfb2JqZWN0KHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICogY2FjaGUsIHZvaWQgKm9iamVjdCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoIWNhY2hlIHx8ICFvYmplY3QpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBJZiBjYWNoZSBpcyBmdWxsLCBqdXN0IGZyZWUgdGhpcyBvYmplY3QgKi8KKworCWlmIChjYWNoZS0+Y3VycmVudF9kZXB0aCA+PSBjYWNoZS0+bWF4X2RlcHRoKSB7CisJCUFDUElfTUVNX0ZSRUUob2JqZWN0KTsKKwkJQUNQSV9NRU1fVFJBQ0tJTkcoY2FjaGUtPnRvdGFsX2ZyZWVkKyspOworCX0KKworCS8qIE90aGVyd2lzZSBwdXQgdGhpcyBvYmplY3QgYmFjayBpbnRvIHRoZSBjYWNoZSAqLworCisJZWxzZSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCisJCS8qIE1hcmsgdGhlIG9iamVjdCBhcyBjYWNoZWQgKi8KKworCQlBQ1BJX01FTVNFVChvYmplY3QsIDB4Q0EsIGNhY2hlLT5vYmplY3Rfc2l6ZSk7CisJCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QsIEFDUElfREVTQ19UWVBFX0NBQ0hFRCk7CisKKwkJLyogUHV0IHRoZSBvYmplY3QgYXQgdGhlIGhlYWQgb2YgdGhlIGNhY2hlIGxpc3QgKi8KKworCQkqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoY2hhciwKKwkJCQkJICYoKChjaGFyICopb2JqZWN0KVtjYWNoZS0+CisJCQkJCQkJICAgIGxpbmtfb2Zmc2V0XSkpKSA9CisJCSAgICBjYWNoZS0+bGlzdF9oZWFkOworCQljYWNoZS0+bGlzdF9oZWFkID0gb2JqZWN0OworCQljYWNoZS0+Y3VycmVudF9kZXB0aCsrOworCisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2FjcXVpcmVfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIENhY2hlICAgICAgICAgICAtIEhhbmRsZSB0byBjYWNoZSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgdGhlIGFjcXVpcmVkIG9iamVjdC4gIE5VTEwgb24gZXJyb3IKKyAqCisgKiBERVNDUklQVElPTjogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FjaGUuICBJZiBjYWNoZSBpcyBlbXB0eSwKKyAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICphY3BpX29zX2FjcXVpcmVfb2JqZWN0KHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICpjYWNoZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdm9pZCAqb2JqZWN0OworCisJQUNQSV9GVU5DVElPTl9OQU1FKCJvc19hY3F1aXJlX29iamVjdCIpOworCisJaWYgKCFjYWNoZSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT5yZXF1ZXN0cysrKTsKKworCS8qIENoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLworCisJaWYgKGNhY2hlLT5saXN0X2hlYWQpIHsKKwkJLyogVGhlcmUgaXMgYW4gb2JqZWN0IGF2YWlsYWJsZSwgdXNlIGl0ICovCisKKwkJb2JqZWN0ID0gY2FjaGUtPmxpc3RfaGVhZDsKKwkJY2FjaGUtPmxpc3RfaGVhZCA9ICooQUNQSV9DQVNUX0lORElSRUNUX1BUUihjaGFyLAorCQkJCQkJCSAgICAmKCgoY2hhciAqKQorCQkJCQkJCSAgICAgICBvYmplY3QpW2NhY2hlLT4KKwkJCQkJCQkJICAgICAgIGxpbmtfb2Zmc2V0XSkpKTsKKworCQljYWNoZS0+Y3VycmVudF9kZXB0aC0tOworCisJCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT5oaXRzKyspOworCQlBQ1BJX01FTV9UUkFDS0lORyhBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICAgIk9iamVjdCAlcCBmcm9tICVzIGNhY2hlXG4iLAorCQkJCQkJICAgIG9iamVjdCwgY2FjaGUtPmxpc3RfbmFtZSkpKTsKKworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJLyogQ2xlYXIgKHplcm8pIHRoZSBwcmV2aW91c2x5IHVzZWQgT2JqZWN0ICovCisKKwkJQUNQSV9NRU1TRVQob2JqZWN0LCAwLCBjYWNoZS0+b2JqZWN0X3NpemUpOworCX0gZWxzZSB7CisJCS8qIFRoZSBjYWNoZSBpcyBlbXB0eSwgY3JlYXRlIGEgbmV3IG9iamVjdCAqLworCisJCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT50b3RhbF9hbGxvY2F0ZWQrKyk7CisKKwkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX01FTV9DQUxMT0NBVEUgKi8KKworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJb2JqZWN0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGNhY2hlLT5vYmplY3Rfc2l6ZSk7CisJCWlmICghb2JqZWN0KSB7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJfQorCisJcmV0dXJuIChvYmplY3QpOworfQorI2VuZGlmCQkJCS8qIEFDUElfVVNFX0xPQ0FMX0NBQ0hFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwppbmRleCAxMWU4ODQ5Li41NDQyYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKQEAgLTQxLDU5ICs0MSw0NiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRjb3B5IikKK0FDUElfTU9EVUxFX05BTUUoInV0Y29weSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKKwkJCQl1OCAqIGRhdGFfc3BhY2UsIGFjcGlfc2l6ZSAqIGJ1ZmZlcl9zcGFjZV91c2VkKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3BhY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NwYWNlX3VzZWQpOworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50KHU4IG9iamVjdF90eXBlLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsCisJCQkJICB2b2lkICpjb250ZXh0KTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJICB1OCAqIGJ1ZmZlciwgYWNwaV9zaXplICogc3BhY2VfdXNlZCk7CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnNwYWNlX3VzZWQpOworYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSh1bmlvbiBhY3BpX29iamVjdCAqdXNlcl9vYmosCisJCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmopOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqdXNlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmopOworYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MpOworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50KHU4IG9iamVjdF90eXBlLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsCisJCQkJICB2b2lkICpjb250ZXh0KTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9vYmosCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmosCisJCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMTYsMTcgKzEwMywxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3BhY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyX3NwYWNlX3VzZWQpCithY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQl1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXU4ICogZGF0YV9zcGFjZSwgYWNwaV9zaXplICogYnVmZmVyX3NwYWNlX3VzZWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSIpOwogCiAJKmJ1ZmZlcl9zcGFjZV91c2VkID0gMDsKIApAQCAtMTM1LDU0ICsxMTgsNTQgQEAKIAkgKiBwYWNrYWdlIGVsZW1lbnQpCiAJICovCiAJaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogQWx3YXlzIGNsZWFyIHRoZSBleHRlcm5hbCBvYmplY3QgKi8KIAotCUFDUElfTUVNU0VUIChleHRlcm5hbF9vYmplY3QsIDAsIHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwlBQ1BJX01FTVNFVChleHRlcm5hbF9vYmplY3QsIDAsIHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwogCiAJLyoKIAkgKiBJbiBnZW5lcmFsLCB0aGUgZXh0ZXJuYWwgb2JqZWN0IHdpbGwgYmUgdGhlIHNhbWUgdHlwZSBhcwogCSAqIHRoZSBpbnRlcm5hbCBvYmplY3QKIAkgKi8KLQlleHRlcm5hbF9vYmplY3QtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KTsKKwlleHRlcm5hbF9vYmplY3QtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpOwogCiAJLyogSG93ZXZlciwgb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGV4dGVybmFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGludGVybmFsX29iamVjdCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCkpIHsKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciA9IChjaGFyICopIGRhdGFfc3BhY2U7CisJCWV4dGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIgPSAoY2hhciAqKWRhdGFfc3BhY2U7CiAJCWV4dGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCA9IGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aDsKLQkJKmJ1ZmZlcl9zcGFjZV91c2VkID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoCi0JCQkJICAgKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoKGFjcGlfc2l6ZSkKKwkJCQkJCQkJICBpbnRlcm5hbF9vYmplY3QtPgorCQkJCQkJCQkgIHN0cmluZy4KKwkJCQkJCQkJICBsZW5ndGggKyAxKTsKIAotCQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgZGF0YV9zcGFjZSwKLQkJCSh2b2lkICopIGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCi0JCQkoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJQUNQSV9NRU1DUFkoKHZvaWQgKilkYXRhX3NwYWNlLAorCQkJICAgICh2b2lkICopaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICAoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQlleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyID0gZGF0YV9zcGFjZTsKIAkJZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoID0gaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwotCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKLQkJCQkgICBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGgpOworCQkqYnVmZmVyX3NwYWNlX3VzZWQgPQorCQkgICAgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChpbnRlcm5hbF9vYmplY3QtPnN0cmluZy4KKwkJCQkJCSBsZW5ndGgpOwogCi0JCUFDUElfTUVNQ1BZICgodm9pZCAqKSBkYXRhX3NwYWNlLAotCQkJKHZvaWQgKikgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKLQkJCWludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CisJCUFDUElfTUVNQ1BZKCh2b2lkICopZGF0YV9zcGFjZSwKKwkJCSAgICAodm9pZCAqKWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CiAKIAkJZXh0ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlID0gaW50ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCS8qCkBAIC0xOTksNDEgKzE4Miw0MSBAQAogCQkJICogdG8gb2JqZWN0IGNvbnRhaW5pbmcgYSBoYW5kbGUgdG8gYW4gQUNQSSBuYW1lZCBvYmplY3QuCiAJCQkgKi8KIAkJCWV4dGVybmFsX29iamVjdC0+dHlwZSA9IEFDUElfVFlQRV9BTlk7Ci0JCQlleHRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5oYW5kbGUgPSBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlOworCQkJZXh0ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuaGFuZGxlID0KKwkJCSAgICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKIAotCQlleHRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5wcm9jX2lkICAgID0gaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucHJvY19pZDsKLQkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19hZGRyZXNzID0gaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IuYWRkcmVzczsKLQkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19sZW5ndGggPSBpbnRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5sZW5ndGg7CisJCWV4dGVybmFsX29iamVjdC0+cHJvY2Vzc29yLnByb2NfaWQgPQorCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucHJvY19pZDsKKwkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19hZGRyZXNzID0KKwkJICAgIGludGVybmFsX29iamVjdC0+cHJvY2Vzc29yLmFkZHJlc3M7CisJCWV4dGVybmFsX29iamVjdC0+cHJvY2Vzc29yLnBibGtfbGVuZ3RoID0KKwkJICAgIGludGVybmFsX29iamVjdC0+cHJvY2Vzc29yLmxlbmd0aDsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgogCiAJCWV4dGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsID0KLQkJCQkgICBpbnRlcm5hbF9vYmplY3QtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbDsKKwkJICAgIGludGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsOwogCiAJCWV4dGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIgPQotCQkJCSAgIGludGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXI7CisJCSAgICBpbnRlcm5hbF9vYmplY3QtPnBvd2VyX3Jlc291cmNlLnJlc291cmNlX29yZGVyOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJLyoKIAkJICogVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBleHRlcm5hbCBvYmplY3QgdHlwZQogCQkgKi8KLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQKQEAgLTI0NywyNSArMjMwLDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQodTggb2JqZWN0X3R5cGUsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAorCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSwKKwkJCQkgIHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAgICAgICAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX3BrZ19pbmZvICopIGNvbnRleHQ7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3BhY2U7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2luZGV4OwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3Q7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfcGtnX2luZm8gKmluZm8gPSAoc3RydWN0IGFjcGlfcGtnX2luZm8gKiljb250ZXh0OworCWFjcGlfc2l6ZSBvYmplY3Rfc3BhY2U7CisJdTMyIHRoaXNfaW5kZXg7CisJdW5pb24gYWNwaV9vYmplY3QgKnRhcmdldF9vYmplY3Q7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQl0aGlzX2luZGV4ICAgPSBzdGF0ZS0+cGtnLmluZGV4OworCXRoaXNfaW5kZXggPSBzdGF0ZS0+cGtnLmluZGV4OwogCXRhcmdldF9vYmplY3QgPSAodW5pb24gYWNwaV9vYmplY3QgKikKLQkJJigodW5pb24gYWNwaV9vYmplY3QgKikoc3RhdGUtPnBrZy5kZXN0X29iamVjdCkpLT5wYWNrYWdlLmVsZW1lbnRzW3RoaXNfaW5kZXhdOworCSAgICAmKCh1bmlvbiBhY3BpX29iamVjdCAqKShzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0KSktPnBhY2thZ2UuCisJICAgIGVsZW1lbnRzW3RoaXNfaW5kZXhdOwogCiAJc3dpdGNoIChvYmplY3RfdHlwZSkgewogCWNhc2UgQUNQSV9DT1BZX1RZUEVfU0lNUExFOgpAQCAtMjczLDIzICsyNTQsMjQgQEAKIAkJLyoKIAkJICogVGhpcyBpcyBhIHNpbXBsZSBvciBudWxsIG9iamVjdAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSAoc291cmNlX29iamVjdCwKLQkJCQkgIHRhcmdldF9vYmplY3QsIGluZm8tPmZyZWVfc3BhY2UsICZvYmplY3Rfc3BhY2UpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUoc291cmNlX29iamVjdCwKKwkJCQkJCQkgdGFyZ2V0X29iamVjdCwKKwkJCQkJCQkgaW5mby0+ZnJlZV9zcGFjZSwKKwkJCQkJCQkgJm9iamVjdF9zcGFjZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfQ09QWV9UWVBFX1BBQ0tBR0U6CiAKIAkJLyoKIAkJICogQnVpbGQgdGhlIHBhY2thZ2Ugb2JqZWN0CiAJCSAqLwotCQl0YXJnZXRfb2JqZWN0LT50eXBlICAgICAgICAgICAgID0gQUNQSV9UWVBFX1BBQ0tBR0U7Ci0JCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgICAgPSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OworCQl0YXJnZXRfb2JqZWN0LT50eXBlID0gQUNQSV9UWVBFX1BBQ0tBR0U7CisJCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgPSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwogCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0KLQkJCUFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LCBpbmZvLT5mcmVlX3NwYWNlKTsKKwkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vYmplY3QsIGluZm8tPmZyZWVfc3BhY2UpOwogCiAJCS8qCiAJCSAqIFBhc3MgdGhlIG5ldyBwYWNrYWdlIG9iamVjdCBiYWNrIHRvIHRoZSBwYWNrYWdlIHdhbGsgcm91dGluZQpAQCAtMzAwLDIyICsyODIsMjIgQEAKIAkJICogU2F2ZSBzcGFjZSBmb3IgdGhlIGFycmF5IG9mIG9iamVjdHMgKFBhY2thZ2UgZWxlbWVudHMpCiAJCSAqIHVwZGF0ZSB0aGUgYnVmZmVyIGxlbmd0aCBjb3VudGVyCiAJCSAqLwotCQlvYmplY3Rfc3BhY2UgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKLQkJCQkgICAoYWNwaV9zaXplKSB0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICoKLQkJCQkgICBzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisJCW9iamVjdF9zcGFjZSA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICAgdGFyZ2V0X29iamVjdC0+CisJCQkJCQkJICAgIHBhY2thZ2UuY291bnQgKgorCQkJCQkJCSAgICBzaXplb2YodW5pb24KKwkJCQkJCQkJICAgYWNwaV9vYmplY3QpKTsKIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JaW5mby0+ZnJlZV9zcGFjZSAgKz0gb2JqZWN0X3NwYWNlOwotCWluZm8tPmxlbmd0aCAgICAgICs9IG9iamVjdF9zcGFjZTsKKwlpbmZvLT5mcmVlX3NwYWNlICs9IG9iamVjdF9zcGFjZTsKKwlpbmZvLT5sZW5ndGggKz0gb2JqZWN0X3NwYWNlOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UKQEAgLTMzNiw1NSArMzE4LDUxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKQorYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHU4ICogYnVmZmVyLCBhY3BpX3NpemUgKiBzcGFjZV91c2VkKQogewotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAgICAgICAgICAgIGluZm87CisJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcGtnX2luZm8gaW5mbzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UiKTsKIAogCS8qCiAJICogRmlyc3QgcGFja2FnZSBhdCBoZWFkIG9mIHRoZSBidWZmZXIKIAkgKi8KLQlleHRlcm5hbF9vYmplY3QgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29iamVjdCwgYnVmZmVyKTsKKwlleHRlcm5hbF9vYmplY3QgPSBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb2JqZWN0LCBidWZmZXIpOwogCiAJLyoKIAkgKiBGcmVlIHNwYWNlIGJlZ2lucyByaWdodCBhZnRlciB0aGUgZmlyc3QgcGFja2FnZQogCSAqLwotCWluZm8ubGVuZ3RoICAgICAgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7Ci0JaW5mby5mcmVlX3NwYWNlICA9IGJ1ZmZlciArIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAotCQkJICAgc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOworCWluZm8ubGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKKwlpbmZvLmZyZWVfc3BhY2UgPQorCSAgICBidWZmZXIgKyBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwogCWluZm8ub2JqZWN0X3NwYWNlID0gMDsKIAlpbmZvLm51bV9wYWNrYWdlcyA9IDE7CiAKLQlleHRlcm5hbF9vYmplY3QtPnR5cGUgICAgICAgICAgICA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpOwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAgID0gaW50ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LAotCQkJICBpbmZvLmZyZWVfc3BhY2UpOworCWV4dGVybmFsX29iamVjdC0+dHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCk7CisJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50ID0gaW50ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OworCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vYmplY3QsCisJCQkJCQkJICBpbmZvLmZyZWVfc3BhY2UpOwogCiAJLyoKIAkgKiBMZWF2ZSByb29tIGZvciBhbiBhcnJheSBvZiBBQ1BJX09CSkVDVFMgaW4gdGhlIGJ1ZmZlcgogCSAqIGFuZCBtb3ZlIHRoZSBmcmVlIHNwYWNlIHBhc3QgaXQKIAkgKi8KLQlpbmZvLmxlbmd0aCAgICArPSAoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgotCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwlpbmZvLmxlbmd0aCArPSAoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgorCSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwogCWluZm8uZnJlZV9zcGFjZSArPSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgotCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKKwkgICAgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKIAotCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUgKGludGVybmFsX29iamVjdCwgZXh0ZXJuYWxfb2JqZWN0LAotCQkJIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCwgJmluZm8pOworCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUoaW50ZXJuYWxfb2JqZWN0LCBleHRlcm5hbF9vYmplY3QsCisJCQkJCSAgIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCwKKwkJCQkJICAgJmluZm8pOwogCiAJKnNwYWNlX3VzZWQgPSBpbmZvLmxlbmd0aDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdApAQCAtNDAwLDQ0ICszNzgsNDUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcikKK2FjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCXN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0Iik7Ci0KLQotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCS8qCiAJCSAqIFBhY2thZ2Ugb2JqZWN0OiAgQ29weSBhbGwgc3Vib2JqZWN0cyAoaW5jbHVkaW5nCiAJCSAqIG5lc3RlZCBwYWNrYWdlcykKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSAoaW50ZXJuYWxfb2JqZWN0LAotCQkJCSAgcmV0X2J1ZmZlci0+cG9pbnRlciwgJnJldF9idWZmZXItPmxlbmd0aCk7Ci0JfQotCWVsc2UgeworCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UoaW50ZXJuYWxfb2JqZWN0LAorCQkJCQkJCSAgIHJldF9idWZmZXItPnBvaW50ZXIsCisJCQkJCQkJICAgJnJldF9idWZmZXItPmxlbmd0aCk7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogQnVpbGQgYSBzaW1wbGUgb2JqZWN0IChubyBuZXN0ZWQgb2JqZWN0cykKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUgKGludGVybmFsX29iamVjdCwKLQkJCQkgKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJldF9idWZmZXItPnBvaW50ZXIsCi0JCQkJICgodTggKikgcmV0X2J1ZmZlci0+cG9pbnRlciArCi0JCQkJIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKSksCi0JCQkJICZyZXRfYnVmZmVyLT5sZW5ndGgpOworCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlKGludGVybmFsX29iamVjdCwKKwkJCQkJCQkgKHVuaW9uIGFjcGlfb2JqZWN0ICopCisJCQkJCQkJIHJldF9idWZmZXItPnBvaW50ZXIsCisJCQkJCQkJICgodTggKikgcmV0X2J1ZmZlci0+CisJCQkJCQkJICBwb2ludGVyICsKKwkJCQkJCQkgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQKKwkJCQkJCQkgIChzaXplb2YKKwkJCQkJCQkgICAodW5pb24KKwkJCQkJCQkgICAgYWNwaV9vYmplY3QpKSksCisJCQkJCQkJICZyZXRfYnVmZmVyLT5sZW5ndGgpOwogCQkvKgogCQkgKiBidWlsZCBzaW1wbGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgb2JqZWN0IHNpemUgaW4gdGhlIGxlbmd0aAogCQkgKiBzbyB3ZSBhZGQgaXQgaW4gaGVyZQogCQkgKi8KLQkJcmV0X2J1ZmZlci0+bGVuZ3RoICs9IHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpOworCQlyZXRfYnVmZmVyLT5sZW5ndGggKz0gc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZQpAQCAtNDU1LDE1ICs0MzQsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSAoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXRfaW50ZXJuYWxfb2JqZWN0KQorYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXRfaW50ZXJuYWxfb2JqZWN0KQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3Q7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUiKTsKIAogCS8qCiAJICogU2ltcGxlIHR5cGVzIHN1cHBvcnRlZCBhcmU6IFN0cmluZywgQnVmZmVyLCBJbnRlZ2VyCkBAIC00NzMsNTggKzQ0OSw1NyBAQAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCi0JCWludGVybmFsX29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCi0JCQkJICAgKHU4KSBleHRlcm5hbF9vYmplY3QtPnR5cGUpOworCQlpbnRlcm5hbF9vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoKHU4KQorCQkJCQkJCQkgZXh0ZXJuYWxfb2JqZWN0LT4KKwkJCQkJCQkJIHR5cGUpOwogCQlpZiAoIWludGVybmFsX29iamVjdCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQkvKiBBbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1NVUFBPUlQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAJfQogCi0KIAkvKiBNdXN0IENPUFkgc3RyaW5nIGFuZCBidWZmZXIgY29udGVudHMgKi8KIAogCXN3aXRjaCAoZXh0ZXJuYWxfb2JqZWN0LT50eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCWludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIgPQotCQkJQUNQSV9NRU1fQ0FMTE9DQVRFICgoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJICAgIEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnN0cmluZy4KKwkJCQkgICAgICAgbGVuZ3RoICsgMSk7CiAJCWlmICghaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlcikgewogCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKLQkJQUNQSV9NRU1DUFkgKGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAotCQkJCSAgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkoaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAorCQkJICAgIGV4dGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCk7CiAKIAkJaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoID0gZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIgPQotCQkJQUNQSV9NRU1fQ0FMTE9DQVRFIChleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOworCQkgICAgQUNQSV9NRU1fQ0FMTE9DQVRFKGV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CiAJCWlmICghaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlcikgewogCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKLQkJQUNQSV9NRU1DUFkgKGludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJICBleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSAgZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKKwkJQUNQSV9NRU1DUFkoaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKKwkJCSAgICBleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAorCQkJICAgIGV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CiAKIAkJaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoID0gZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlpbnRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWUgID0gZXh0ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlOworCQlpbnRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWUgPSBleHRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWU7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTUzMywxNSArNTA4LDEzIEBACiAJfQogCiAJKnJldF9pbnRlcm5hbF9vYmplY3QgPSBpbnRlcm5hbF9vYmplY3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAotCi1lcnJvcl9leGl0OgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoaW50ZXJuYWxfb2JqZWN0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisgICAgICBlcnJvcl9leGl0OgorCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbnRlcm5hbF9vYmplY3QpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgogLyogQ29kZSB0byBjb252ZXJ0IHBhY2thZ2VzIHRoYXQgYXJlIHBhcmFtZXRlcnMgdG8gY29udHJvbCBtZXRob2RzICovCiAKQEAgLTU2NSwyMiArNTM4LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKQorYWNwaV91dF9jb3B5X2VwYWNrYWdlX3RvX2lwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHU4ICogYnVmZmVyLCB1MzIgKiBzcGFjZV91c2VkKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyZWVfc3BhY2U7Ci0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW5kZXg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3BhY2UgPSAwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRoaXNfaW50ZXJuYWxfb2JqOwotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKnRoaXNfZXh0ZXJuYWxfb2JqOworCXU4ICpmcmVlX3NwYWNlOworCXVuaW9uIGFjcGlfb2JqZWN0ICpleHRlcm5hbF9vYmplY3Q7CisJdTMyIGxlbmd0aCA9IDA7CisJdTMyIHRoaXNfaW5kZXg7CisJdTMyIG9iamVjdF9zcGFjZSA9IDA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19pbnRlcm5hbF9vYmo7CisJdW5pb24gYWNwaV9vYmplY3QgKnRoaXNfZXh0ZXJuYWxfb2JqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSIpOwogCiAJLyoKIAkgKiBGaXJzdCBwYWNrYWdlIGF0IGhlYWQgb2YgdGhlIGJ1ZmZlcgpAQCAtNTkyLDI0ICs1NjEsMjIgQEAKIAkgKi8KIAlmcmVlX3NwYWNlID0gYnVmZmVyICsgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KTsKIAotCi0JZXh0ZXJuYWxfb2JqZWN0LT50eXBlICAgICAgICAgICAgICA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpOwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAgICAgPSBpbnRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzICA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWZyZWVfc3BhY2U7CisJZXh0ZXJuYWxfb2JqZWN0LT50eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KTsKKwlleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgPSBpbnRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopZnJlZV9zcGFjZTsKIAogCS8qCiAJICogQnVpbGQgYW4gYXJyYXkgb2YgQUNQSV9PQkpFQ1RTIGluIHRoZSBidWZmZXIKIAkgKiBhbmQgbW92ZSB0aGUgZnJlZSBzcGFjZSBwYXN0IGl0CiAJICovCi0JZnJlZV9zcGFjZSArPSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKiBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOwotCisJZnJlZV9zcGFjZSArPQorCSAgICBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKiBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOwogCiAJLyogQ2FsbCB3YWxrX3BhY2thZ2UgKi8KIAogfQogCi0jZW5kaWYgLyogRnV0dXJlIGltcGxlbWVudGF0aW9uICovCi0KKyNlbmRpZgkJCQkvKiBGdXR1cmUgaW1wbGVtZW50YXRpb24gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MjUsMzcgKzU5MiwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QgKAotCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqaW50ZXJuYWxfb2JqZWN0KQorYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmplY3QpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0Iik7CiAKIAlpZiAoZXh0ZXJuYWxfb2JqZWN0LT50eXBlID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCS8qCiAJCSAqIFBhY2thZ2VzIGFzIGV4dGVybmFsIGlucHV0IHRvIGNvbnRyb2wgbWV0aG9kcyBhcmUgbm90IHN1cHBvcnRlZCwKIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlBhY2thZ2VzIGFzIHBhcmFtZXRlcnMgbm90IGltcGxlbWVudGVkIVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlBhY2thZ2VzIGFzIHBhcmFtZXRlcnMgbm90IGltcGxlbWVudGVkIVxuIikpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0lNUExFTUVOVEVEKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CiAJfQogCiAJZWxzZSB7CiAJCS8qCiAJCSAqIEJ1aWxkIGEgc2ltcGxlIG9iamVjdCAobm8gbmVzdGVkIG9iamVjdHMpCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlIChleHRlcm5hbF9vYmplY3QsIGludGVybmFsX29iamVjdCk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKGV4dGVybmFsX29iamVjdCwKKwkJCQkJCSAgICBpbnRlcm5hbF9vYmplY3QpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdApAQCAtNjcxLDgzICs2MzYsNzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYykKK2FjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjKQogewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX2NvdW50OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5leHRfb2JqZWN0OwotCisJdTE2IHJlZmVyZW5jZV9jb3VudDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X29iamVjdDsKIAogCS8qIFNhdmUgZmllbGRzIGZyb20gZGVzdGluYXRpb24gdGhhdCB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSAqLwogCiAJcmVmZXJlbmNlX2NvdW50ID0gZGVzdF9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OwogCW5leHRfb2JqZWN0ID0gZGVzdF9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CiAKLQkvKiBDb3B5IHRoZSBlbnRpcmUgc291cmNlIG9iamVjdCBvdmVyIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QqLworCS8qIENvcHkgdGhlIGVudGlyZSBzb3VyY2Ugb2JqZWN0IG92ZXIgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCAqLwogCi0JQUNQSV9NRU1DUFkgKChjaGFyICopIGRlc3RfZGVzYywgKGNoYXIgKikgc291cmNlX2Rlc2MsCi0JCQkgIHNpemVvZiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpOworCUFDUElfTUVNQ1BZKChjaGFyICopZGVzdF9kZXNjLCAoY2hhciAqKXNvdXJjZV9kZXNjLAorCQkgICAgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKTsKIAogCS8qIFJlc3RvcmUgdGhlIHNhdmVkIGZpZWxkcyAqLwogCiAJZGVzdF9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gcmVmZXJlbmNlX2NvdW50OwogCWRlc3RfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0gbmV4dF9vYmplY3Q7CiAKKwkvKiBOZXcgb2JqZWN0IGlzIG5vdCBzdGF0aWMsIHJlZ2FyZGxlc3Mgb2Ygc291cmNlICovCisKKwlkZXN0X2Rlc2MtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX1NUQVRJQ19QT0lOVEVSOworCiAJLyogSGFuZGxlIHRoZSBvYmplY3RzIHdpdGggZXh0cmEgZGF0YSAqLwogCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoZGVzdF9kZXNjKSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGVzdF9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlkZXN0X2Rlc2MtPmJ1ZmZlci5ub2RlID0gTlVMTDsKLQkJZGVzdF9kZXNjLT5jb21tb24uZmxhZ3MgPSBzb3VyY2VfZGVzYy0+Y29tbW9uLmZsYWdzOwotCiAJCS8qCiAJCSAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGlmIGFuZCBvbmx5IGlmOgogCQkgKiAxKSBUaGVyZSBpcyBhIHZhbGlkIGJ1ZmZlciBwb2ludGVyCi0JCSAqIDIpIFRoZSBidWZmZXIgaXMgbm90IHN0YXRpYyAobm90IGluIGFuIEFDUEkgdGFibGUpIChpbiB0aGlzIGNhc2UsCi0JCSAqICAgIHRoZSBhY3R1YWwgcG9pbnRlciB3YXMgYWxyZWFkeSBjb3BpZWQgYWJvdmUpCisJCSAqIDIpIFRoZSBidWZmZXIgaGFzIGEgbGVuZ3RoID4gMAogCQkgKi8KIAkJaWYgKChzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIpICYmCi0JCQkoIShzb3VyY2VfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKLQkJCWRlc3RfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPSBOVUxMOwotCi0JCQkvKiBDcmVhdGUgYW4gYWN0dWFsIGJ1ZmZlciBvbmx5IGlmIGxlbmd0aCA+IDAgKi8KLQotCQkJaWYgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSB7Ci0JCQkJZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciA9Ci0JCQkJCUFDUElfTUVNX0FMTE9DQVRFIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCQkJaWYgKCFkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKLQkJCQl9Ci0KLQkJCQkvKiBDb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGRhdGEgKi8KLQotCQkJCUFDUElfTUVNQ1BZIChkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCQkJc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCQkJc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkgICAgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSkgeworCQkJZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciA9CisJCQkgICAgQUNQSV9NRU1fQUxMT0NBVEUoc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkJaWYgKCFkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7CisJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQkJfQorCisJCQkvKiBDb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGRhdGEgKi8KKworCQkJQUNQSV9NRU1DUFkoZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KIAkJLyoKIAkJICogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIGFjdHVhbCBzdHJpbmcgaWYgYW5kIG9ubHkgaWY6CiAJCSAqIDEpIFRoZXJlIGlzIGEgdmFsaWQgc3RyaW5nIHBvaW50ZXIKLQkJICogMikgVGhlIHN0cmluZyBpcyBub3Qgc3RhdGljIChub3QgaW4gYW4gQUNQSSB0YWJsZSkgKGluIHRoaXMgY2FzZSwKLQkJICogICAgdGhlIGFjdHVhbCBwb2ludGVyIHdhcyBhbHJlYWR5IGNvcGllZCBhYm92ZSkKKwkJICogKFBvaW50ZXIgdG8gYSBOVUxMIHN0cmluZyBpcyBhbGxvd2VkKQogCQkgKi8KLQkJaWYgKChzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIpICYmCi0JCQkoIShzb3VyY2VfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKKwkJaWYgKHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikgewogCQkJZGVzdF9kZXNjLT5zdHJpbmcucG9pbnRlciA9Ci0JCQkJQUNQSV9NRU1fQUxMT0NBVEUgKChhY3BpX3NpemUpIHNvdXJjZV9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCQkgICAgQUNQSV9NRU1fQUxMT0NBVEUoKGFjcGlfc2l6ZSkgc291cmNlX2Rlc2MtPnN0cmluZy4KKwkJCQkJICAgICAgbGVuZ3RoICsgMSk7CiAJCQlpZiAoIWRlc3RfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKIAkJCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CiAJCQl9CiAKLQkJCUFDUElfTUVNQ1BZIChkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJCSAgKGFjcGlfc2l6ZSkgc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJCS8qIENvcHkgdGhlIGFjdHVhbCBzdHJpbmcgZGF0YSAqLworCisJCQlBQ1BJX01FTUNQWShkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIChhY3BpX3NpemUpIHNvdXJjZV9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTc1Niw3ICs3MTMsNyBAQAogCQkgKiBXZSBjb3BpZWQgdGhlIHJlZmVyZW5jZSBvYmplY3QsIHNvIHdlIG5vdyBtdXN0IGFkZCBhIHJlZmVyZW5jZQogCQkgKiB0byB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIHJlZmVyZW5jZQogCQkgKi8KLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTc2Nyw3ICs3MjQsNiBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudApAQCAtNzgxLDI0ICs3MzcsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudCh1OCBvYmplY3RfdHlwZSwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkJICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLAorCQkJCSAgdm9pZCAqY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbmRleDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqdGhpc190YXJnZXRfcHRyOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldF9vYmplY3Q7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHRoaXNfaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRoaXNfdGFyZ2V0X3B0cjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfb2JqZWN0OwogCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JdGhpc19pbmRleCAgICA9IHN0YXRlLT5wa2cuaW5kZXg7CisJdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7CiAJdGhpc190YXJnZXRfcHRyID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiopCi0JCQkgICAmc3RhdGUtPnBrZy5kZXN0X29iamVjdC0+cGFja2FnZS5lbGVtZW50c1t0aGlzX2luZGV4XTsKKwkgICAgJnN0YXRlLT5wa2cuZGVzdF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CiAKIAlzd2l0Y2ggKG9iamVjdF90eXBlKSB7CiAJY2FzZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEU6CkBAIC04MDksMzQgKzc2MiwzNiBAQAogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYSBzaW1wbGUgb2JqZWN0LCBqdXN0IGNvcHkgaXQKIAkJCSAqLwotCQkJdGFyZ2V0X29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCi0JCQkJCSAgIEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2Vfb2JqZWN0KSk7CisJCQl0YXJnZXRfb2JqZWN0ID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCQkgICAoc291cmNlX29iamVjdCkpOwogCQkJaWYgKCF0YXJnZXRfb2JqZWN0KSB7CiAJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQkJfQogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoc291cmNlX29iamVjdCwgdGFyZ2V0X29iamVjdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHNvdXJjZV9vYmplY3QsCisJCQkJCQkgICAgICAgdGFyZ2V0X29iamVjdCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCQl9CiAKIAkJCSp0aGlzX3RhcmdldF9wdHIgPSB0YXJnZXRfb2JqZWN0OwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogUGFzcyB0aHJvdWdoIGEgbnVsbCBlbGVtZW50ICovCiAKIAkJCSp0aGlzX3RhcmdldF9wdHIgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfQ09QWV9UWVBFX1BBQ0tBR0U6CiAKIAkJLyoKIAkJICogVGhpcyBvYmplY3QgaXMgYSBwYWNrYWdlIC0gZ28gZG93biBhbm90aGVyIG5lc3RpbmcgbGV2ZWwKIAkJICogQ3JlYXRlIGFuZCBidWlsZCB0aGUgcGFja2FnZSBvYmplY3QKIAkJICovCi0JCXRhcmdldF9vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9QQUNLQUdFKTsKKwkJdGFyZ2V0X29iamVjdCA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1BBQ0tBR0UpOwogCQlpZiAoIXRhcmdldF9vYmplY3QpIHsKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtODQ4LDggKzgwMyw4IEBACiAJCSAqIENyZWF0ZSB0aGUgb2JqZWN0IGFycmF5CiAJCSAqLwogCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0KLQkJCUFDUElfTUVNX0NBTExPQ0FURSAoKChhY3BpX3NpemUpIHNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQgKyAxKSAqCi0JCQkJCSBzaXplb2YgKHZvaWQgKikpOworCQkgICAgQUNQSV9NRU1fQ0FMTE9DQVRFKCgoYWNwaV9zaXplKSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLgorCQkJCQljb3VudCArIDEpICogc2l6ZW9mKHZvaWQgKikpOwogCQlpZiAoIXRhcmdldF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKQEAgLTg2NiwxOSArODIxLDE3IEBACiAJCSp0aGlzX3RhcmdldF9wdHIgPSB0YXJnZXRfb2JqZWN0OwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiAKLWVycm9yX2V4aXQ6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICh0YXJnZXRfb2JqZWN0KTsKKyAgICAgIGVycm9yX2V4aXQ6CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHRhcmdldF9vYmplY3QpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UKQEAgLTg5NCw0OSArODQ3LDQ2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmosCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaiwKKwkJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlIik7Ci0KLQotCWRlc3Rfb2JqLT5jb21tb24udHlwZSAgID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9vYmopOwotCWRlc3Rfb2JqLT5jb21tb24uZmxhZ3MgID0gc291cmNlX29iai0+Y29tbW9uLmZsYWdzOworCWRlc3Rfb2JqLT5jb21tb24udHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9vYmopOworCWRlc3Rfb2JqLT5jb21tb24uZmxhZ3MgPSBzb3VyY2Vfb2JqLT5jb21tb24uZmxhZ3M7CiAJZGVzdF9vYmotPnBhY2thZ2UuY291bnQgPSBzb3VyY2Vfb2JqLT5wYWNrYWdlLmNvdW50OwogCiAJLyoKIAkgKiBDcmVhdGUgdGhlIG9iamVjdCBhcnJheSBhbmQgd2FsayB0aGUgc291cmNlIHBhY2thZ2UgdHJlZQogCSAqLwotCWRlc3Rfb2JqLT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAgICgoYWNwaV9zaXplKSBzb3VyY2Vfb2JqLT5wYWNrYWdlLmNvdW50ICsgMSkgKgotCQkJICAgc2l6ZW9mICh2b2lkICopKTsKKwlkZXN0X29iai0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgc291cmNlX29iai0+cGFja2FnZS4KKwkJCQkJCQkgY291bnQgKworCQkJCQkJCSAxKSAqIHNpemVvZih2b2lkICopKTsKIAlpZiAoIWRlc3Rfb2JqLT5wYWNrYWdlLmVsZW1lbnRzKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgKLQkJCSgiYW1sX2J1aWxkX2NvcHlfaW50ZXJuYWxfcGFja2FnZV9vYmplY3Q6IFBhY2thZ2UgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJhbWxfYnVpbGRfY29weV9pbnRlcm5hbF9wYWNrYWdlX29iamVjdDogUGFja2FnZSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyoKIAkgKiBDb3B5IHRoZSBwYWNrYWdlIGVsZW1lbnQtYnktZWxlbWVudCBieSB3YWxraW5nIHRoZSBwYWNrYWdlICJ0cmVlIi4KIAkgKiBUaGlzIGhhbmRsZXMgbmVzdGVkIHBhY2thZ2VzIG9mIGFyYml0cmFyeSBkZXB0aC4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlIChzb3VyY2Vfb2JqLCBkZXN0X29iaiwKLQkJCSBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHNvdXJjZV9vYmosIGRlc3Rfb2JqLAorCQkJCQkgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQsCisJCQkJCSAgIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkvKiBPbiBmYWlsdXJlLCBkZWxldGUgdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2Ugb2JqZWN0ICovCiAKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChkZXN0X29iaik7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZXN0X29iaik7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QKQEAgLTk1MiwzNSArOTAyLDMxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQorYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGVzdF9kZXNjLAorCQkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCIpOwogCiAJLyogQ3JlYXRlIHRoZSB0b3AgbGV2ZWwgb2JqZWN0ICovCiAKLQkqZGVzdF9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKTsKKwkqZGVzdF9kZXNjID0KKwkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSk7CiAJaWYgKCEqZGVzdF9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQ29weSB0aGUgb2JqZWN0IGFuZCBwb3NzaWJsZSBzdWJvYmplY3RzICovCiAKLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UgKHNvdXJjZV9kZXNjLCAqZGVzdF9kZXNjLAotCQkJCSAgd2Fsa19zdGF0ZSk7Ci0JfQotCWVsc2UgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCAoc291cmNlX2Rlc2MsICpkZXN0X2Rlc2MpOworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZShzb3VyY2VfZGVzYywgKmRlc3RfZGVzYywKKwkJCQkJCSAgICAgIHdhbGtfc3RhdGUpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHNvdXJjZV9kZXNjLCAqZGVzdF9kZXNjKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwppbmRleCA3OTRjN2RmLi5kODBlOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwpAQCAtNDYsMTUgKzQ2LDE2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRkZWJ1ZyIpCi0KK0FDUElfTU9EVUxFX05BTUUoInV0ZGVidWciKQogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKK3N0YXRpYyB1MzIgYWNwaV9nYmxfcHJldl90aHJlYWRfaWQgPSAweEZGRkZGRkZGOworc3RhdGljIGNoYXIgKmFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciA9ICItLS0tRW50cnkiOworc3RhdGljIGNoYXIgKmFjcGlfZ2JsX2ZuX2V4aXRfc3RyID0gIi0tLS1FeGl0LSI7CiAKLXN0YXRpYyB1MzIgICBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCA9IDB4RkZGRkZGRkY7Ci1zdGF0aWMgY2hhciAgICAgKmFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciA9ICItLS0tRW50cnkiOwotc3RhdGljIGNoYXIgICAgICphY3BpX2dibF9mbl9leGl0X3N0ciA9ICItLS0tRXhpdC0iOworLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCitzdGF0aWMgY29uc3QgY2hhciAqYWNwaV91dF90cmltX2Z1bmN0aW9uX25hbWUoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjgsMTcgKzY5LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSh2b2lkKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NwOworCXUzMiBjdXJyZW50X3NwOwogCi0KLQlhY3BpX2dibF9lbnRyeV9zdGFja19wb2ludGVyID0gQUNQSV9QVFJfRElGRiAoJmN1cnJlbnRfc3AsIE5VTEwpOworCWFjcGlfZ2JsX2VudHJ5X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX1BUUl9ESUZGKCZjdXJyZW50X3NwLCBOVUxMKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cgpAQCAtOTEsMTQgKzg4LDExIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF90cmFja19zdGFja19wdHIgKAotCXZvaWQpCit2b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpCiB7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc3A7CisJYWNwaV9zaXplIGN1cnJlbnRfc3A7CiAKLQotCWN1cnJlbnRfc3AgPSBBQ1BJX1BUUl9ESUZGICgmY3VycmVudF9zcCwgTlVMTCk7CisJY3VycmVudF9zcCA9IEFDUElfUFRSX0RJRkYoJmN1cnJlbnRfc3AsIE5VTEwpOwogCiAJaWYgKGN1cnJlbnRfc3AgPCBhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcikgewogCQlhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlciA9IGN1cnJlbnRfc3A7CkBAIC0xMDksNiArMTAzLDM5IEBACiAJfQogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQXNjaWkgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcm9jZWR1cmUgbmFtZQorICoKKyAqIFJFVFVSTjogICAgICBVcGRhdGVkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG5hbWUKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIHRoZSAiQWNwaSIgcHJlZml4IGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUsIGlmIHByZXNlbnQuCisgKiAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgY29tcGlsZXIgbWFjcm9zIHN1Y2ggYXMgX19GVU5DVElPTl9fIHRvIGJlIHVzZWQKKyAqICAgICAgICAgICAgICB3aXRoIG5vIGNoYW5nZSB0byB0aGUgZGVidWcgb3V0cHV0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZShjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lKQoreworCisJLyogQWxsIEZ1bmN0aW9uIG5hbWVzIGFyZSBsb25nZXIgdGhhbiA0IGNoYXJzLCBjaGVjayBpcyBzYWZlICovCisKKwlpZiAoKihBQ1BJX0NBU1RfUFRSKHUzMiwgZnVuY3Rpb25fbmFtZSkpID09IEFDUElfUFJFRklYX01JWEVEKSB7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG9yaWdpbmFsIHNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgKi8KKworCQlyZXR1cm4gKGZ1bmN0aW9uX25hbWUgKyA0KTsKKwl9CisKKwlpZiAoKihBQ1BJX0NBU1RfUFRSKHUzMiwgZnVuY3Rpb25fbmFtZSkpID09IEFDUElfUFJFRklYX0xPV0VSKSB7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHNvdXJjZSBoYXMgYmVlbiAnbGludXhpemVkJyAqLworCisJCXJldHVybiAoZnVuY3Rpb25fbmFtZSArIDUpOworCX0KKworCXJldHVybiAoZnVuY3Rpb25fbmFtZSk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTE2LDEwICsxNDMsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgLSBSZXF1ZXN0ZWQgZGVidWcgcHJpbnQgbGV2ZWwKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgZmllbGQKICAqICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgcHJpbnRmIGFyZ3VtZW50cwogICoKQEAgLTEzMCwzNiArMTU2LDMzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfZGVidWdfcHJpbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLikKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfdXRfZGVidWdfcHJpbnQodTMyIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCwKKwkJICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWQ7Ci0JdmFfbGlzdCAgICAgICAgICAgICAgICAgYXJnczsKLQorCXUzMiB0aHJlYWRfaWQ7CisJdmFfbGlzdCBhcmdzOwogCiAJLyoKIAkgKiBTdGF5IHNpbGVudCBpZiB0aGUgZGVidWcgbGV2ZWwgb3IgY29tcG9uZW50IElEIGlzIGRpc2FibGVkCiAJICovCiAJaWYgKCEocmVxdWVzdGVkX2RlYnVnX2xldmVsICYgYWNwaV9kYmdfbGV2ZWwpIHx8Ci0JCSEoZGJnX2luZm8tPmNvbXBvbmVudF9pZCAmIGFjcGlfZGJnX2xheWVyKSkgeworCSAgICAhKGNvbXBvbmVudF9pZCAmIGFjcGlfZGJnX2xheWVyKSkgewogCQlyZXR1cm47CiAJfQogCiAJLyoKIAkgKiBUaHJlYWQgdHJhY2tpbmcgYW5kIGNvbnRleHQgc3dpdGNoIG5vdGlmaWNhdGlvbgogCSAqLwotCXRocmVhZF9pZCA9IGFjcGlfb3NfZ2V0X3RocmVhZF9pZCAoKTsKKwl0aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKIAogCWlmICh0aHJlYWRfaWQgIT0gYWNwaV9nYmxfcHJldl90aHJlYWRfaWQpIHsKIAkJaWYgKEFDUElfTFZfVEhSRUFEUyAmIGFjcGlfZGJnX2xldmVsKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoCi0JCQkJIlxuKioqKiBDb250ZXh0IFN3aXRjaCBmcm9tIFRJRCAlWCB0byBUSUQgJVggKioqKlxuXG4iLAotCQkJCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkLCB0aHJlYWRfaWQpOworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIlxuKioqKiBDb250ZXh0IFN3aXRjaCBmcm9tIFRJRCAlWCB0byBUSUQgJVggKioqKlxuXG4iLAorCQkJICAgICBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCwgdGhyZWFkX2lkKTsKIAkJfQogCiAJCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkID0gdGhyZWFkX2lkOwpAQCAtMTY5LDE3ICsxOTIsMTggQEAKIAkgKiBEaXNwbGF5IHRoZSBtb2R1bGUgbmFtZSwgY3VycmVudCBsaW5lIG51bWJlciwgdGhyZWFkIElEIChpZiByZXF1ZXN0ZWQpLAogCSAqIGN1cnJlbnQgcHJvY2VkdXJlIG5lc3RpbmcgbGV2ZWwsIGFuZCB0aGUgY3VycmVudCBwcm9jZWR1cmUgbmFtZQogCSAqLwotCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGxkICIsIGRiZ19pbmZvLT5tb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0bGQgIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIAogCWlmIChBQ1BJX0xWX1RIUkVBRFMgJiBhY3BpX2RiZ19sZXZlbCkgewotCQlhY3BpX29zX3ByaW50ZiAoIlslMDRsWF0gIiwgdGhyZWFkX2lkKTsKKwkJYWNwaV9vc19wcmludGYoIlslMDRsWF0gIiwgdGhyZWFkX2lkKTsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIlslMDJsZF0gJS0yMi4yMnM6ICIsCi0JCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsIGRiZ19pbmZvLT5wcm9jX25hbWUpOworCWFjcGlfb3NfcHJpbnRmKCJbJTAybGRdICUtMjIuMjJzOiAiLAorCQkgICAgICAgYWNwaV9nYmxfbmVzdGluZ19sZXZlbCwKKwkJICAgICAgIGFjcGlfdXRfdHJpbV9mdW5jdGlvbl9uYW1lKGZ1bmN0aW9uX25hbWUpKTsKIAotCXZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotCWFjcGlfb3NfdnByaW50ZiAoZm9ybWF0LCBhcmdzKTsKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnQpOwpAQCAtMTkwLDEwICsyMTQsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgLSBSZXF1ZXN0ZWQgZGVidWcgcHJpbnQgbGV2ZWwKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAogICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCiAgKgpAQCAtMjA0LDM3ICsyMjcsMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLikKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfdXRfZGVidWdfcHJpbnRfcmF3KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCisJCQl1MzIgbGluZV9udW1iZXIsCisJCQljb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkJY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgICAgICAgICAgICAgICAgIGFyZ3M7Ci0KKwl2YV9saXN0IGFyZ3M7CiAKIAlpZiAoIShyZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgJiBhY3BpX2RiZ19sZXZlbCkgfHwKLQkJIShkYmdfaW5mby0+Y29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSB7CisJICAgICEoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSB7CiAJCXJldHVybjsKIAl9CiAKLQl2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLQlhY3BpX29zX3ZwcmludGYgKGZvcm1hdCwgYXJncyk7CisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlhY3BpX29zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV91dF9kZWJ1Z19wcmludF9yYXcpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZQogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTI0NCwyOSArMjYzLDI4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3RyYWNlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvKQorYWNwaV91dF90cmFjZSh1MzIgbGluZV9udW1iZXIsCisJICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQpCiB7CiAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsKys7Ci0JYWNwaV91dF90cmFja19zdGFja19wdHIgKCk7CisJYWNwaV91dF90cmFja19zdGFja19wdHIoKTsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXNcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0cik7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXNcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0cik7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlX3B0cgogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBQb2ludGVyICAgICAgICAgICAgIC0gUG9pbnRlciB0byBkaXNwbGF5CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTI3NywyOCArMjk1LDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3RyYWNlX3B0ciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyKQorYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHZvaWQgKnBvaW50ZXIpCiB7CiAJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyICgpOworCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7CiAKLQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJIiVzICVwXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsIHBvaW50ZXIpOworCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAorCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzICVwXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsCisJCQkgICAgcG9pbnRlcik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV9zdHIKICAqCiAgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAtIEFkZGl0aW9uYWwgc3RyaW5nIHRvIGRpc3BsYXkKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQpAQCAtMzA5LDI5ICszMjYsMjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfdXRfdHJhY2Vfc3RyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZykKK2FjcGlfdXRfdHJhY2Vfc3RyKHUzMiBsaW5lX251bWJlciwKKwkJICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBjaGFyICpzdHJpbmcpCiB7CiAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsKys7Ci0JYWNwaV91dF90cmFja19zdGFja19wdHIgKCk7CisJYWNwaV91dF90cmFja19zdGFja19wdHIoKTsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXMgJXNcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciwgc3RyaW5nKTsKKwlhY3BpX3V0X2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKKwkJCSAgICBjb21wb25lbnRfaWQsICIlcyAlc1xuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyLAorCQkJICAgIHN0cmluZyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV91MzIKICAqCiAgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgZGJnX2luZm8gICAgICAgICAgICAtIENvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECiAgKiAgICAgICAgICAgICAgSW50ZWdlciAgICAgICAgICAgICAtIEludGVnZXIgdG8gZGlzcGxheQogICoKICAqIFJFVFVSTjogICAgICBOb25lCkBAIC0zNDIsMjkgKzM1OCwyOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF90cmFjZV91MzIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyKQorYWNwaV91dF90cmFjZV91MzIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHUzMiBpbnRlZ2VyKQogewogCiAJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyICgpOworCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7CiAKLQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJIiVzICUwOFhcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciwgaW50ZWdlcik7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJTA4WFxuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyLAorCQkJICAgIGludGVnZXIpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhpdAogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTM3NCwyOCArMzg5LDI3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X2V4aXQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8pCithY3BpX3V0X2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCSAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQpCiB7CiAKLQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJIiVzXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0cik7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyKTsKIAogCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV91dF9leGl0KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3V0X2V4aXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0YXR1c19leGl0CiAgKgogICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGRiZ19pbmZvICAgICAgICAgICAgLSBDb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAogICogICAgICAgICAgICAgIFN0YXR1cyAgICAgICAgICAgICAgLSBFeGl0IHN0YXR1cyBjb2RlCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTQwNiwzNyArNDIwLDM4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3N0YXR1c19leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKQorYWNwaV91dF9zdGF0dXNfZXhpdCh1MzIgbGluZV9udW1iZXIsCisJCSAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgICAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfc3RhdHVzIHN0YXR1cykKIHsKIAotCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJYWNwaV91dF9kZWJ1Z19wcmludCAoQUNQSV9MVl9GVU5DVElPTlMsIGxpbmVfbnVtYmVyLCBkYmdfaW5mbywKLQkJCQkiJXMgJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSk7Ci0JfQotCWVsc2UgewotCQlhY3BpX3V0X2RlYnVnX3ByaW50IChBQ1BJX0xWX0ZVTkNUSU9OUywgbGluZV9udW1iZXIsIGRiZ19pbmZvLAotCQkJCSIlcyAqKioqRXhjZXB0aW9uKioqKjogJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKKwkJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJXNcbiIsCisJCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAorCQkJCSAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJfSBlbHNlIHsKKwkJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAorCQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAqKioqRXhjZXB0aW9uKioqKjogJXNcbiIsCisJCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAorCQkJCSAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CiAJfQogCiAJYWNwaV9nYmxfbmVzdGluZ19sZXZlbC0tOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX3V0X3N0YXR1c19leGl0KTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX3V0X3N0YXR1c19leGl0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWx1ZV9leGl0CiAgKgogICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGRiZ19pbmZvICAgICAgICAgICAgLSBDb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAogICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBwcmludGVkIHdpdGggZXhpdCBtc2cKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQpAQCAtNDQ3LDMwICs0NjIsMjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfdXRfdmFsdWVfZXhpdCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKQorYWNwaV91dF92YWx1ZV9leGl0KHUzMiBsaW5lX251bWJlciwKKwkJICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfaW50ZWdlciB2YWx1ZSkKIHsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXMgJTguOFglOC44WFxuIiwgYWNwaV9nYmxfZm5fZXhpdF9zdHIsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKHZhbHVlKSk7CisJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJTguOFglOC44WFxuIiwKKwkJCSAgICBhY3BpX2dibF9mbl9leGl0X3N0ciwgQUNQSV9GT1JNQVRfVUlOVDY0KHZhbHVlKSk7CiAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdmFsdWVfZXhpdCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV91dF92YWx1ZV9leGl0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9wdHJfZXhpdAogICoKICAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqICAgICAgICAgICAgICBQdHIgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBkaXNwbGF5CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTQ4MSwyMSArNDk1LDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX3V0X3B0cl9leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cikKK2FjcGlfdXRfcHRyX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB1OCAqIHB0cikKIHsKIAotCWFjcGlfdXRfZGVidWdfcHJpbnQgKEFDUElfTFZfRlVOQ1RJT05TLCBsaW5lX251bWJlciwgZGJnX2luZm8sCi0JCQkiJXMgJXBcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLCBwdHIpOworCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAorCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzICVwXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0ciwgcHRyKTsKIAogCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKIH0KIAogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kdW1wX2J1ZmZlcgpAQCAtNTExLDIzICs1MjQsMTcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2R1bXBfYnVmZmVyICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXksCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpCit2b2lkIGFjcGlfdXRfZHVtcF9idWZmZXIodTggKiBidWZmZXIsIHUzMiBjb3VudCwgdTMyIGRpc3BsYXksIHUzMiBjb21wb25lbnRfaWQpCiB7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpID0gMDsKLQlhY3BpX25hdGl2ZV91aW50ICAgICAgICAgICAgICAgIGo7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMzI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfY2hhcjsKLQorCWFjcGlfbmF0aXZlX3VpbnQgaSA9IDA7CisJYWNwaV9uYXRpdmVfdWludCBqOworCXUzMiB0ZW1wMzI7CisJdTggYnVmX2NoYXI7CiAKIAkvKiBPbmx5IGR1bXAgdGhlIGJ1ZmZlciBpZiB0cmFjaW5nIGlzIGVuYWJsZWQgKi8KIAogCWlmICghKChBQ1BJX0xWX1RBQkxFUyAmIGFjcGlfZGJnX2xldmVsKSAmJgotCQkoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSkgeworCSAgICAgIChjb21wb25lbnRfaWQgJiBhY3BpX2RiZ19sYXllcikpKSB7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU0MCw3ICs1NDcsNyBAQAogCXdoaWxlIChpIDwgY291bnQpIHsKIAkJLyogUHJpbnQgY3VycmVudCBvZmZzZXQgKi8KIAotCQlhY3BpX29zX3ByaW50ZiAoIiU2LjRYOiAiLCAodTMyKSBpKTsKKwkJYWNwaV9vc19wcmludGYoIiU2LjRYOiAiLCAodTMyKSBpKTsKIAogCQkvKiBQcmludCAxNiBoZXggY2hhcnMgKi8KIApAQCAtNTQ4LDczICs1NTUsNjYgQEAKIAkJCWlmIChpICsgaiA+PSBjb3VudCkgewogCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiJSpzIiwgKChkaXNwbGF5ICogMikgKyAxKSwgIiAiKTsKLQkJCQlqICs9IGRpc3BsYXk7CisJCQkJYWNwaV9vc19wcmludGYoIiUqcyIsICgoZGlzcGxheSAqIDIpICsgMSksICIgIik7CisJCQkJaiArPSAoYWNwaV9uYXRpdmVfdWludCkgZGlzcGxheTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJc3dpdGNoIChkaXNwbGF5KSB7Ci0JCQlkZWZhdWx0OiAgICAvKiBEZWZhdWx0IGlzIEJZVEUgZGlzcGxheSAqLworCQkJZGVmYXVsdDoJLyogRGVmYXVsdCBpcyBCWVRFIGRpc3BsYXkgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiJTAyWCAiLCBidWZmZXJbaSArIGpdKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiJTAyWCAiLCBidWZmZXJbaSArIGpdKTsKIAkJCQlicmVhazsKIAotCiAJCQljYXNlIERCX1dPUkRfRElTUExBWToKIAotCQkJCUFDUElfTU9WRV8xNl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOwotCQkJCWFjcGlfb3NfcHJpbnRmICgiJTA0WCAiLCB0ZW1wMzIpOworCQkJCUFDUElfTU9WRV8xNl9UT18zMigmdGVtcDMyLCAmYnVmZmVyW2kgKyBqXSk7CisJCQkJYWNwaV9vc19wcmludGYoIiUwNFggIiwgdGVtcDMyKTsKIAkJCQlicmVhazsKIAotCiAJCQljYXNlIERCX0RXT1JEX0RJU1BMQVk6CiAKLQkJCQlBQ1BJX01PVkVfMzJfVE9fMzIgKCZ0ZW1wMzIsICZidWZmZXJbaSArIGpdKTsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOworCQkJCWFjcGlfb3NfcHJpbnRmKCIlMDhYICIsIHRlbXAzMik7CiAJCQkJYnJlYWs7CiAKLQogCQkJY2FzZSBEQl9RV09SRF9ESVNQTEFZOgogCi0JCQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmdGVtcDMyLCAmYnVmZmVyW2kgKyBqXSk7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIlMDhYIiwgdGVtcDMyKTsKKwkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOworCQkJCWFjcGlfb3NfcHJpbnRmKCIlMDhYIiwgdGVtcDMyKTsKIAotCQkJCUFDUElfTU9WRV8zMl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgaiArIDRdKTsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwgJmJ1ZmZlcltpICsgaiArIDRdKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiJTA4WCAiLCB0ZW1wMzIpOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlqICs9IGRpc3BsYXk7CisJCQlqICs9IChhY3BpX25hdGl2ZV91aW50KSBkaXNwbGF5OwogCQl9CiAKIAkJLyoKLQkJICogUHJpbnQgdGhlIEFTQ0lJIGVxdWl2YWxlbnQgY2hhcmFjdGVycwotCQkgKiBCdXQgd2F0Y2ggb3V0IGZvciB0aGUgYmFkIHVucHJpbnRhYmxlIG9uZXMuLi4KKwkJICogUHJpbnQgdGhlIEFTQ0lJIGVxdWl2YWxlbnQgY2hhcmFjdGVycyBidXQgd2F0Y2ggb3V0IGZvciB0aGUgYmFkCisJCSAqIHVucHJpbnRhYmxlIG9uZXMgKHByaW50YWJsZSBjaGFycyBhcmUgMHgyMCB0aHJvdWdoIDB4N0UpCiAJCSAqLwotCQlhY3BpX29zX3ByaW50ZiAoIiAiKTsKKwkJYWNwaV9vc19wcmludGYoIiAiKTsKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKIAkJCWlmIChpICsgaiA+PSBjb3VudCkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAKIAkJCWJ1Zl9jaGFyID0gYnVmZmVyW2kgKyBqXTsKLQkJCWlmICgoYnVmX2NoYXIgPiAweDFGICYmIGJ1Zl9jaGFyIDwgMHgyRSkgfHwKLQkJCQkoYnVmX2NoYXIgPiAweDJGICYmIGJ1Zl9jaGFyIDwgMHg2MSkgfHwKLQkJCQkoYnVmX2NoYXIgPiAweDYwICYmIGJ1Zl9jaGFyIDwgMHg3RikpIHsKLQkJCQlhY3BpX29zX3ByaW50ZiAoIiVjIiwgYnVmX2NoYXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYgKCIuIik7CisJCQlpZiAoQUNQSV9JU19QUklOVChidWZfY2hhcikpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiJWMiLCBidWZfY2hhcik7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmKCIuIik7CiAJCQl9CiAJCX0KIAogCQkvKiBEb25lIHdpdGggdGhhdCBsaW5lLiAqLwogCi0JCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKKwkJYWNwaV9vc19wcmludGYoIlxuIik7CiAJCWkgKz0gMTY7CiAJfQogCiAJcmV0dXJuOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKaW5kZXggYmM1NDAzMC4uMmJjODc4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYwpAQCAtNDEsNyArNDEsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CkBAIC00OSwxOSArNDgsMTMgQEAKICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGRlbGV0ZSIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGRlbGV0ZSIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCiBzdGF0aWMgdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwotCi1zdGF0aWMgdm9pZAotYWNwaV91dF91cGRhdGVfcmVmX2NvdW50ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pOwotCithY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MzIgYWN0aW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03NiwxOCArNjksMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCitzdGF0aWMgdm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KQogewotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9ial9wb2ludGVyID0gTlVMTDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc2Vjb25kX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbmV4dF9kZXNjOworCXZvaWQgKm9ial9wb2ludGVyID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9kZXNjOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2RlbGV0ZV9pbnRlcm5hbF9vYmoiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2RlbGV0ZV9pbnRlcm5hbF9vYmoiLCBvYmplY3QpOwogCiAJaWYgKCFvYmplY3QpIHsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC05NywxMSArODYsMTIgQEAKIAkgKiBNdXN0IGRlbGV0ZSBvciBmcmVlIGFueSBwb2ludGVycyB3aXRoaW4gdGhlIG9iamVjdCB0aGF0IGFyZSBub3QKIAkgKiBhY3R1YWwgQUNQSSBvYmplY3RzIChmb3IgZXhhbXBsZSwgYSByYXcgYnVmZmVyIHBvaW50ZXIpLgogCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkpIHsKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9iamVjdCkpIHsKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIqKioqIFN0cmluZyAlcCwgcHRyICVwXG4iLAotCQkJb2JqZWN0LCBvYmplY3QtPnN0cmluZy5wb2ludGVyKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiBTdHJpbmcgJXAsIHB0ciAlcFxuIiwgb2JqZWN0LAorCQkJCSAgb2JqZWN0LT5zdHJpbmcucG9pbnRlcikpOwogCiAJCS8qIEZyZWUgdGhlIGFjdHVhbCBzdHJpbmcgYnVmZmVyICovCiAKQEAgLTExMiwxMSArMTAyLDExIEBACiAJCX0KIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKiogQnVmZmVyICVwLCBwdHIgJXBcbiIsCi0JCQlvYmplY3QsIG9iamVjdC0+YnVmZmVyLnBvaW50ZXIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqIEJ1ZmZlciAlcCwgcHRyICVwXG4iLCBvYmplY3QsCisJCQkJICBvYmplY3QtPmJ1ZmZlci5wb2ludGVyKSk7CiAKIAkJLyogRnJlZSB0aGUgYWN0dWFsIGJ1ZmZlciAqLwogCkBAIC0xMjcsMTEgKzExNywxMSBAQAogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiICoqKiogUGFja2FnZSBvZiBjb3VudCAlWFxuIiwKLQkJCW9iamVjdC0+cGFja2FnZS5jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIiAqKioqIFBhY2thZ2Ugb2YgY291bnQgJVhcbiIsCisJCQkJICBvYmplY3QtPnBhY2thZ2UuY291bnQpKTsKIAogCQkvKgogCQkgKiBFbGVtZW50cyBvZiB0aGUgcGFja2FnZSBhcmUgbm90IGhhbmRsZWQgaGVyZSwgdGhleSBhcmUgZGVsZXRlZApAQCAtMTQzLDExICsxMzMsMTEgQEAKIAkJb2JqX3BvaW50ZXIgPSBvYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAKIAkJaWYgKG9iamVjdC0+ZGV2aWNlLmdwZV9ibG9jaykgewotCQkJKHZvaWQpIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayAob2JqZWN0LT5kZXZpY2UuZ3BlX2Jsb2NrKTsKKwkJCSh2b2lkKWFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhvYmplY3QtPmRldmljZS4KKwkJCQkJCSAgICAgICBncGVfYmxvY2spOwogCQl9CiAKIAkJLyogV2FsayB0aGUgaGFuZGxlciBsaXN0IGZvciB0aGlzIGRldmljZSAqLwpAQCAtMTU1LDU0ICsxNDUsNTEgQEAKIAkJaGFuZGxlcl9kZXNjID0gb2JqZWN0LT5kZXZpY2UuaGFuZGxlcjsKIAkJd2hpbGUgKGhhbmRsZXJfZGVzYykgewogCQkJbmV4dF9kZXNjID0gaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLm5leHQ7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGhhbmRsZXJfZGVzYyk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaGFuZGxlcl9kZXNjKTsKIAkJCWhhbmRsZXJfZGVzYyA9IG5leHRfZGVzYzsKIAkJfQogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfTVVURVg6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogTXV0ZXggJXAsIFNlbWFwaG9yZSAlcFxuIiwKLQkJCW9iamVjdCwgb2JqZWN0LT5tdXRleC5zZW1hcGhvcmUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBNdXRleCAlcCwgU2VtYXBob3JlICVwXG4iLAorCQkJCSAgb2JqZWN0LCBvYmplY3QtPm11dGV4LnNlbWFwaG9yZSkpOwogCi0JCWFjcGlfZXhfdW5saW5rX211dGV4IChvYmplY3QpOwotCQkodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChvYmplY3QtPm11dGV4LnNlbWFwaG9yZSk7CisJCWFjcGlfZXhfdW5saW5rX211dGV4KG9iamVjdCk7CisJCSh2b2lkKWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShvYmplY3QtPm11dGV4LnNlbWFwaG9yZSk7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9FVkVOVDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCSIqKioqKiBFdmVudCAlcCwgU2VtYXBob3JlICVwXG4iLAotCQkJb2JqZWN0LCBvYmplY3QtPmV2ZW50LnNlbWFwaG9yZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIioqKioqIEV2ZW50ICVwLCBTZW1hcGhvcmUgJXBcbiIsCisJCQkJICBvYmplY3QsIG9iamVjdC0+ZXZlbnQuc2VtYXBob3JlKSk7CiAKLQkJKHZvaWQpIGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZSAob2JqZWN0LT5ldmVudC5zZW1hcGhvcmUpOworCQkodm9pZClhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUob2JqZWN0LT5ldmVudC5zZW1hcGhvcmUpOwogCQlvYmplY3QtPmV2ZW50LnNlbWFwaG9yZSA9IE5VTEw7CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogTWV0aG9kICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBNZXRob2QgJXBcbiIsIG9iamVjdCkpOwogCiAJCS8qIERlbGV0ZSB0aGUgbWV0aG9kIHNlbWFwaG9yZSBpZiBpdCBleGlzdHMgKi8KIAogCQlpZiAob2JqZWN0LT5tZXRob2Quc2VtYXBob3JlKSB7Ci0JCQkodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChvYmplY3QtPm1ldGhvZC5zZW1hcGhvcmUpOworCQkJKHZvaWQpYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKG9iamVjdC0+bWV0aG9kLgorCQkJCQkJICAgICAgIHNlbWFwaG9yZSk7CiAJCQlvYmplY3QtPm1ldGhvZC5zZW1hcGhvcmUgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9SRUdJT046CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogUmVnaW9uICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBSZWdpb24gJXBcbiIsIG9iamVjdCkpOwogCi0JCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqZWN0KTsKKwkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7CiAJCWlmIChzZWNvbmRfZGVzYykgewogCQkJLyoKIAkJCSAqIEZyZWUgdGhlIHJlZ2lvbl9jb250ZXh0IGlmIGFuZCBvbmx5IGlmIHRoZSBoYW5kbGVyIGlzIG9uZSBvZiB0aGUKQEAgLTIxMSwzMiArMTk4LDMzIEBACiAJCQkgKi8KIAkJCWhhbmRsZXJfZGVzYyA9IG9iamVjdC0+cmVnaW9uLmhhbmRsZXI7CiAJCQlpZiAoaGFuZGxlcl9kZXNjKSB7Ci0JCQkJaWYgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oZmxhZ3MgJiBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkgewotCQkJCQlvYmpfcG9pbnRlciA9IHNlY29uZF9kZXNjLT5leHRyYS5yZWdpb25fY29udGV4dDsKKwkJCQlpZiAoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLgorCQkJCSAgICBoZmxhZ3MgJgorCQkJCSAgICBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkgeworCQkJCQlvYmpfcG9pbnRlciA9CisJCQkJCSAgICBzZWNvbmRfZGVzYy0+ZXh0cmEucmVnaW9uX2NvbnRleHQ7CiAJCQkJfQogCi0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChoYW5kbGVyX2Rlc2MpOworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShoYW5kbGVyX2Rlc2MpOwogCQkJfQogCiAJCQkvKiBOb3cgd2UgY2FuIGZyZWUgdGhlIEV4dHJhIG9iamVjdCAqLwogCi0JCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAoc2Vjb25kX2Rlc2MpOworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Moc2Vjb25kX2Rlc2MpOwogCQl9CiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiKioqKiogQnVmZmVyIEZpZWxkICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIqKioqKiBCdWZmZXIgRmllbGQgJXBcbiIsIG9iamVjdCkpOwogCi0JCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdCAob2JqZWN0KTsKKwkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7CiAJCWlmIChzZWNvbmRfZGVzYykgewotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKHNlY29uZF9kZXNjKTsKKwkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKHNlY29uZF9kZXNjKTsKIAkJfQogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjQ0LDIxICsyMzIsMjAgQEAKIAkvKiBGcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5IChwb2ludGVyIHdpdGhpbiB0aGUgb2JqZWN0KSBmb3VuZCBhYm92ZSAqLwogCiAJaWYgKG9ial9wb2ludGVyKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRGVsZXRpbmcgT2JqZWN0IFN1YnB0ciAlcFxuIiwKLQkJCQlvYmpfcG9pbnRlcikpOwotCQlBQ1BJX01FTV9GUkVFIChvYmpfcG9pbnRlcik7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiRGVsZXRpbmcgT2JqZWN0IFN1YnB0ciAlcFxuIiwgb2JqX3BvaW50ZXIpKTsKKwkJQUNQSV9NRU1fRlJFRShvYmpfcG9pbnRlcik7CiAJfQogCiAJLyogTm93IHRoZSBvYmplY3QgY2FuIGJlIHNhZmVseSBkZWxldGVkICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkRlbGV0aW5nIE9iamVjdCAlcCBbJXNdXG4iLAotCQkJb2JqZWN0LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmplY3QpKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkRlbGV0aW5nIE9iamVjdCAlcCBbJXNdXG4iLAorCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqZWN0KSkpOwogCi0JYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9iamVjdCk7CisJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqZWN0KTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdApAQCAtMjcyLDI5ICsyNTksMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9saXN0KQordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2xpc3QpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmludGVybmFsX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqaW50ZXJuYWxfb2JqOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QiKTsKIAogCS8qIFdhbGsgdGhlIG51bGwtdGVybWluYXRlZCBpbnRlcm5hbCBsaXN0ICovCiAKIAlmb3IgKGludGVybmFsX29iaiA9IG9ial9saXN0OyAqaW50ZXJuYWxfb2JqOyBpbnRlcm5hbF9vYmorKykgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKCppbnRlcm5hbF9vYmopOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoKmludGVybmFsX29iaik7CiAJfQogCiAJLyogRnJlZSB0aGUgY29tYmluZWQgcGFyYW1ldGVyIHBvaW50ZXIgbGlzdCBhbmQgb2JqZWN0IGFycmF5ICovCiAKLQlBQ1BJX01FTV9GUkVFIChvYmpfbGlzdCk7CisJQUNQSV9NRU1fRlJFRShvYmpfbGlzdCk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF91cGRhdGVfcmVmX2NvdW50CkBAIC0zMDksMTYgKzI5MSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKQorYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwgdTMyIGFjdGlvbikKIHsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NvdW50OworCXUxNiBjb3VudDsKKwl1MTYgbmV3X2NvdW50OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ1dF91cGRhdGVfcmVmX2NvdW50Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X3VwZGF0ZV9yZWZfY291bnQiKTsKIAogCWlmICghb2JqZWN0KSB7CiAJCXJldHVybjsKQEAgLTMzOCw1OCArMzE2LDU1IEBACiAJCW5ld19jb3VudCsrOwogCQlvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSBuZXdfY291bnQ7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiT2JqICVwIFJlZnM9JVgsIFtJbmNyZW1lbnRlZF1cbiIsCi0JCQlvYmplY3QsIG5ld19jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIk9iaiAlcCBSZWZzPSVYLCBbSW5jcmVtZW50ZWRdXG4iLAorCQkJCSAgb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgUkVGX0RFQ1JFTUVOVDoKIAogCQlpZiAoY291bnQgPCAxKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkiT2JqICVwIFJlZnM9JVgsIGNhbid0IGRlY3JlbWVudCEgKFNldCB0byAwKVxuIiwKLQkJCQlvYmplY3QsIG5ld19jb3VudCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkJICAiT2JqICVwIFJlZnM9JVgsIGNhbid0IGRlY3JlbWVudCEgKFNldCB0byAwKVxuIiwKKwkJCQkJICBvYmplY3QsIG5ld19jb3VudCkpOwogCiAJCQluZXdfY291bnQgPSAwOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJbmV3X2NvdW50LS07CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSJPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKLQkJCQlvYmplY3QsIG5ld19jb3VudCkpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkJICAiT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCisJCQkJCSAgb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJfQogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqZWN0KSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkiTWV0aG9kIE9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAotCQkJCW9iamVjdCwgbmV3X2NvdW50KSk7CisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJCSAgIk1ldGhvZCBPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKKwkJCQkJICBvYmplY3QsIG5ld19jb3VudCkpOwogCQl9CiAKIAkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwogCQlpZiAobmV3X2NvdW50ID09IDApIHsKLQkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaiAob2JqZWN0KTsKKwkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaihvYmplY3QpOwogCQl9CiAKIAkJYnJlYWs7CiAKLQogCWNhc2UgUkVGX0ZPUkNFX0RFTEVURToKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCSJPYmogJXAgUmVmcz0lWCwgRm9yY2UgZGVsZXRlISAoU2V0IHRvIDApXG4iLAotCQkJb2JqZWN0LCBjb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIk9iaiAlcCBSZWZzPSVYLCBGb3JjZSBkZWxldGUhIChTZXQgdG8gMClcbiIsCisJCQkJICBvYmplY3QsIGNvdW50KSk7CiAKIAkJbmV3X2NvdW50ID0gMDsKIAkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwotCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmogKG9iamVjdCk7CisJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaihvYmplY3QpOwogCQlicmVhazsKIAotCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gYWN0aW9uICglWClcbiIsIGFjdGlvbikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBhY3Rpb24gKCVYKVxuIiwKKwkJCQkgIGFjdGlvbikpOwogCQlicmVhazsKIAl9CiAKQEAgLTM5OSwxNSArMzc0LDE0IEBACiAJICovCiAJaWYgKGNvdW50ID4gQUNQSV9NQVhfUkVGRVJFTkNFX0NPVU5UKSB7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwKLQkJCSIqKioqIFdhcm5pbmcgKioqKiBMYXJnZSBSZWZlcmVuY2UgQ291bnQgKCVYKSBpbiBvYmplY3QgJXBcblxuIiwKLQkJCWNvdW50LCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCSAgIioqKiogV2FybmluZyAqKioqIExhcmdlIFJlZmVyZW5jZSBDb3VudCAoJVgpIGluIG9iamVjdCAlcFxuXG4iLAorCQkJCSAgY291bnQsIG9iamVjdCkpOwogCX0KIAogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlCkBAIC00MzEsNjUgKzQwNSw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbikKK2FjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9iamVjdCwgdTE2IGFjdGlvbikKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgKnN0YXRlX2xpc3QgPSBOVUxMOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgICpzdGF0ZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAqdG1wOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGVfbGlzdCA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9vYmplY3QgPSBOVUxMOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSIsIG9iamVjdCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlIiwgb2JqZWN0KTsKIAorCXdoaWxlIChvYmplY3QpIHsKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpc24ndCBhIG5hbWVzcGFjZSBoYW5kbGUgKi8KIAotCS8qIElnbm9yZSBhIG51bGwgb2JqZWN0IHB0ciAqLwotCi0JaWYgKCFvYmplY3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpc24ndCBhIG5hbWVzcGFjZSBoYW5kbGUgKi8KLQotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkiT2JqZWN0ICVwIGlzIE5TIGhhbmRsZVxuIiwgb2JqZWN0KSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwotCX0KLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlIChvYmplY3QsIGFjdGlvbik7Ci0KLQl3aGlsZSAoc3RhdGUpIHsKLQkJb2JqZWN0ID0gc3RhdGUtPnVwZGF0ZS5vYmplY3Q7Ci0JCWFjdGlvbiA9IHN0YXRlLT51cGRhdGUudmFsdWU7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHN0YXRlKTsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCQkgICJPYmplY3QgJXAgaXMgTlMgaGFuZGxlXG4iLCBvYmplY3QpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KIAogCQkvKgogCQkgKiBBbGwgc3ViLW9iamVjdHMgbXVzdCBoYXZlIHRoZWlyIHJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZCBhbHNvLgogCQkgKiBEaWZmZXJlbnQgb2JqZWN0IHR5cGVzIGhhdmUgZGlmZmVyZW50IHN1Ym9iamVjdHMuCiAJCSAqLwotCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmplY3QpKSB7CisJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqZWN0KSkgewogCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CiAKLQkJCXRtcCA9IG9iamVjdC0+ZGV2aWNlLnN5c3RlbV9ub3RpZnk7Ci0JCQlpZiAodG1wICYmICh0bXAtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPD0gMSkgJiYgYWN0aW9uID09IFJFRl9ERUNSRU1FTlQpCi0JCQkJb2JqZWN0LT5kZXZpY2Uuc3lzdGVtX25vdGlmeSA9IE5VTEw7Ci0JCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQgKHRtcCwgYWN0aW9uKTsKLQotCQkJdG1wID0gb2JqZWN0LT5kZXZpY2UuZGV2aWNlX25vdGlmeTsKLQkJCWlmICh0bXAgJiYgKHRtcC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA8PSAxKSAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmRldmljZS5kZXZpY2Vfbm90aWZ5ID0gTlVMTDsKLQkJCWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudCAodG1wLCBhY3Rpb24pOwotCisJCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQob2JqZWN0LT5kZXZpY2Uuc3lzdGVtX25vdGlmeSwKKwkJCQkJCSBhY3Rpb24pOworCQkJYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KG9iamVjdC0+ZGV2aWNlLmRldmljZV9ub3RpZnksCisJCQkJCQkgYWN0aW9uKTsKIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKLQogCQkJLyoKLQkJCSAqIFdlIG11c3QgdXBkYXRlIGFsbCB0aGUgc3ViLW9iamVjdHMgb2YgdGhlIHBhY2thZ2UKLQkJCSAqIChFYWNoIG9mIHdob20gbWF5IGhhdmUgdGhlaXIgb3duIHN1Yi1vYmplY3RzLCBldGMuCisJCQkgKiBXZSBtdXN0IHVwZGF0ZSBhbGwgdGhlIHN1Yi1vYmplY3RzIG9mIHRoZSBwYWNrYWdlLAorCQkJICogZWFjaCBvZiB3aG9tIG1heSBoYXZlIHRoZWlyIG93biBzdWItb2JqZWN0cy4KIAkJCSAqLwogCQkJZm9yIChpID0gMDsgaSA8IG9iamVjdC0+cGFja2FnZS5jb3VudDsgaSsrKSB7CiAJCQkJLyoKQEAgLTQ5NywxMTYgKzQ0OCw2NyBAQAogCQkJCSAqIE5vdGU6IFRoZXJlIGNhbiBiZSBudWxsIGVsZW1lbnRzIHdpdGhpbiB0aGUgcGFja2FnZSwKIAkJCQkgKiB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQKIAkJCQkgKi8KLQkJCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkJIG9iamVjdC0+cGFja2FnZS5lbGVtZW50c1tpXSwgYWN0aW9uLCAmc3RhdGVfbGlzdCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaAorCQkJCSAgICAob2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW2ldLCBhY3Rpb24sCisJCQkJICAgICAmc3RhdGVfbGlzdCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJCQl9Ci0KLQkJCQl0bXAgPSBvYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbaV07Ci0JCQkJaWYgKHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQkJb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW2ldID0gTlVMTDsKIAkJCX0KIAkJCWJyZWFrOwogCi0KIAkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiwgYWN0aW9uLCAmc3RhdGVfbGlzdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqOwotCQkJaWYgKCB0bXAgJiYgKHRtcC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA8PSAxKSAgJiYgYWN0aW9uID09IFJFRl9ERUNSRU1FTlQpCi0JCQkJb2JqZWN0LT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiA9IE5VTEw7CisJCQluZXh0X29iamVjdCA9IG9iamVjdC0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmo7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKIAotCQkJc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoICgKLQkJCQkJIG9iamVjdC0+ZmllbGQucmVnaW9uX29iaiwgYWN0aW9uLCAmc3RhdGVfbGlzdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmo7Ci0JCQlpZiAoIHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmogPSBOVUxMOwotCQkgICBicmVhazsKLQorCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmo7CisJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5iYW5rX2ZpZWxkLmJhbmtfb2JqLCBhY3Rpb24sICZzdGF0ZV9saXN0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCW5leHRfb2JqZWN0ID0gb2JqZWN0LT5iYW5rX2ZpZWxkLmJhbmtfb2JqOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2gob2JqZWN0LT4KKwkJCQkJCQkJIGJhbmtfZmllbGQuCisJCQkJCQkJCSByZWdpb25fb2JqLAorCQkJCQkJCQkgYWN0aW9uLAorCQkJCQkJCQkgJnN0YXRlX2xpc3QpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBlcnJvcl9leGl0OwogCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmJhbmtfZmllbGQuYmFua19vYmo7Ci0JCQlpZiAoIHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmJhbmtfZmllbGQuYmFua19vYmogPSBOVUxMOwotCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmosIGFjdGlvbiwgJnN0YXRlX2xpc3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0KLQotCQkJdG1wID0gb2JqZWN0LT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmo7Ci0JCQlpZiAoIHRtcCAmJiAodG1wLT5jb21tb24ucmVmZXJlbmNlX2NvdW50IDw9IDEpICAmJiBhY3Rpb24gPT0gUkVGX0RFQ1JFTUVOVCkKLQkJCQlvYmplY3QtPmJhbmtfZmllbGQucmVnaW9uX29iaiA9IE5VTEw7CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2ggKAotCQkJCQkgb2JqZWN0LT5pbmRleF9maWVsZC5pbmRleF9vYmosIGFjdGlvbiwgJnN0YXRlX2xpc3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoKG9iamVjdC0+CisJCQkJCQkJCSBpbmRleF9maWVsZC4KKwkJCQkJCQkJIGRhdGFfb2JqLAorCQkJCQkJCQkgYWN0aW9uLAorCQkJCQkJCQkgJnN0YXRlX2xpc3QpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBlcnJvcl9leGl0OwogCQkJfQotCi0JCQl0bXAgPSBvYmplY3QtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKLQkJCWlmICggdG1wICYmICh0bXAtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPD0gMSkgICYmIGFjdGlvbiA9PSBSRUZfREVDUkVNRU5UKQotCQkJCW9iamVjdC0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gTlVMTDsKLQotCQkJc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoICgKLQkJCQkJIG9iamVjdC0+aW5kZXhfZmllbGQuZGF0YV9vYmosIGFjdGlvbiwgJnN0YXRlX2xpc3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0KLQotCQkJdG1wID0gb2JqZWN0LT5pbmRleF9maWVsZC5kYXRhX29iajsKLQkJCWlmICggdG1wICYmICh0bXAtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPD0gMSkgICYmIGFjdGlvbiA9PSBSRUZfREVDUkVNRU5UKQotCQkJCW9iamVjdC0+aW5kZXhfZmllbGQuZGF0YV9vYmogPSBOVUxMOwogCQkJYnJlYWs7CiAKLQogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0KIAkJCS8qCiAJCQkgKiBUaGUgdGFyZ2V0IG9mIGFuIEluZGV4IChhIHBhY2thZ2UsIHN0cmluZywgb3IgYnVmZmVyKSBtdXN0IHRyYWNrCiAJCQkgKiBjaGFuZ2VzIHRvIHRoZSByZWYgY291bnQgb2YgdGhlIGluZGV4LgogCQkJICovCiAJCQlpZiAob2JqZWN0LT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9JTkRFWF9PUCkgewotCQkJCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCAoCi0JCQkJCQkgb2JqZWN0LT5yZWZlcmVuY2Uub2JqZWN0LCBhY3Rpb24sICZzdGF0ZV9saXN0KTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCQl9CisJCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPnJlZmVyZW5jZS5vYmplY3Q7CiAJCQl9CiAJCQlicmVhazsKIAotCiAJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAkJZGVmYXVsdDoKLQotCQkJLyogTm8gc3Vib2JqZWN0cyAqLwotCQkJYnJlYWs7CisJCQlicmVhazsJLyogTm8gc3Vib2JqZWN0cyAqLwogCQl9CiAKIAkJLyoKQEAgLTYxNCwyNSArNTE2LDMxIEBACiAJCSAqIGhhcHBlbiBhZnRlciB3ZSB1cGRhdGUgdGhlIHN1Yi1vYmplY3RzIGluIGNhc2UgdGhpcyBjYXVzZXMgdGhlCiAJCSAqIG1haW4gb2JqZWN0IHRvIGJlIGRlbGV0ZWQuCiAJCSAqLwotCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQgKG9iamVjdCwgYWN0aW9uKTsKKwkJYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KG9iamVjdCwgYWN0aW9uKTsKKwkJb2JqZWN0ID0gTlVMTDsKIAogCQkvKiBNb3ZlIG9uIHRvIHRoZSBuZXh0IG9iamVjdCB0byBiZSB1cGRhdGVkICovCiAKLQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlICgmc3RhdGVfbGlzdCk7CisJCWlmIChuZXh0X29iamVjdCkgeworCQkJb2JqZWN0ID0gbmV4dF9vYmplY3Q7CisJCQluZXh0X29iamVjdCA9IE5VTEw7CisJCX0gZWxzZSBpZiAoc3RhdGVfbGlzdCkgeworCQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZzdGF0ZV9saXN0KTsKKwkJCW9iamVjdCA9IHN0YXRlLT51cGRhdGUub2JqZWN0OworCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisJCX0KIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCisgICAgICBlcnJvcl9leGl0OgogCi1lcnJvcl9leGl0OgorCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHVwZGF0ZSBvYmplY3QgcmVmZXJlbmNlIGNvdW50LCAlc1xuIiwKKwkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKLQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgdXBkYXRlIG9iamVjdCByZWZlcmVuY2UgY291bnQsICVzXG4iLAotCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FkZF9yZWZlcmVuY2UKQEAgLTY0NiwzMSArNTU0LDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF9hZGRfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCit2b2lkIGFjcGlfdXRfYWRkX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2FkZF9yZWZlcmVuY2UiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2FkZF9yZWZlcmVuY2UiLCBvYmplY3QpOwogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIG9iamVjdCAqLwogCi0JaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCAob2JqZWN0KSkgeworCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qob2JqZWN0KSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJIk9iaiAlcCBDdXJyZW50IFJlZnM9JVggW1RvIEJlIEluY3JlbWVudGVkXVxuIiwKLQkJb2JqZWN0LCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJICAiT2JqICVwIEN1cnJlbnQgUmVmcz0lWCBbVG8gQmUgSW5jcmVtZW50ZWRdXG4iLAorCQkJICBvYmplY3QsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCkpOwogCiAJLyogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKi8KIAotCSh2b2lkKSBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlIChvYmplY3QsIFJFRl9JTkNSRU1FTlQpOworCSh2b2lkKWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2Uob2JqZWN0LCBSRUZfSU5DUkVNRU5UKTsKIAlyZXR1cm5fVk9JRDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UKQEAgLTY4MywxMyArNTg3LDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpCit2b2lkIGFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X3JlbW92ZV9yZWZlcmVuY2UiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X3JlbW92ZV9yZWZlcmVuY2UiLCBvYmplY3QpOwogCiAJLyoKIAkgKiBBbGxvdyBhIE5VTEwgcG9pbnRlciB0byBiZSBwYXNzZWQgaW4sIGp1c3QgaWdub3JlIGl0LiAgVGhpcyBzYXZlcwpAQCAtNjk3LDI3ICs1OTgsMjUgQEAKIAkgKgogCSAqLwogCWlmICghb2JqZWN0IHx8Ci0JCShBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpKSB7CisJICAgIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkpIHsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIG9iamVjdCAqLwogCi0JaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCAob2JqZWN0KSkgeworCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qob2JqZWN0KSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJIk9iaiAlcCBDdXJyZW50IFJlZnM9JVggW1RvIEJlIERlY3JlbWVudGVkXVxuIiwKLQkJb2JqZWN0LCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJICAiT2JqICVwIEN1cnJlbnQgUmVmcz0lWCBbVG8gQmUgRGVjcmVtZW50ZWRdXG4iLAorCQkJICBvYmplY3QsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCkpOwogCiAJLyoKIAkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCwgYW5kIG9ubHkgYWN0dWFsbHkgZGVsZXRlIHRoZSBvYmplY3QKIAkgKiBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgMC4gIChNdXN0IGFsc28gZGVjcmVtZW50IHRoZSByZWYgY291bnQKIAkgKiBvZiBhbGwgc3Vib2JqZWN0cyEpCiAJICovCi0JKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKG9iamVjdCwgUkVGX0RFQ1JFTUVOVCk7CisJKHZvaWQpYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZShvYmplY3QsIFJFRl9ERUNSRU1FTlQpOwogCXJldHVybl9WT0lEOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCmluZGV4IDAwMDQ2ZGQuLjdiODFkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwpAQCAtNDEsMjggKzQxLDIwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KIAotCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0ZXZhbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGV2YWwiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3V0X2NvcHlfaWRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbiwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKK2FjcGlfdXRfY29weV9pZF9zdHJpbmcoY2hhciAqZGVzdGluYXRpb24sIGNoYXIgKnNvdXJjZSwgYWNwaV9zaXplIG1heF9sZW5ndGgpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgICAgICAgKm9uZV9jaWQpOwotCithY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICpvbmVfY2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03NywzNyArNjksMzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb24gKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCithY3BpX3N0YXR1cyBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnN0cmluZ19kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdHJpbmdfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9vc2lfaW1wbGVtZW50YXRpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X29zaV9pbXBsZW1lbnRhdGlvbiIpOwogCiAJLyogVmFsaWRhdGUgdGhlIHN0cmluZyBpbnB1dCBhcmd1bWVudCAqLwogCiAJc3RyaW5nX2Rlc2MgPSB3YWxrX3N0YXRlLT5hcmd1bWVudHNbMF0ub2JqZWN0OwogCWlmICghc3RyaW5nX2Rlc2MgfHwgKHN0cmluZ19kZXNjLT5jb21tb24udHlwZSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX1RZUEUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJLyogQ3JlYXRlIGEgcmV0dXJuIG9iamVjdCAoRGVmYXVsdCB2YWx1ZSA9IDApICovCiAKLQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKIAlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyogQ29tcGFyZSBpbnB1dCBzdHJpbmcgdG8gdGFibGUgb2Ygc3VwcG9ydGVkIHN0cmluZ3MgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9PU0lfU1RSSU5HUzsgaSsrKSB7Ci0JCWlmICghQUNQSV9TVFJDTVAgKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAoY2hhciAqKSBhY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tpXSkpIHsKKwkJaWYgKCFBQ1BJX1NUUkNNUChzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJIChjaGFyICopYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbaV0pKSB7CiAJCQkvKiBUaGlzIHN0cmluZyBpcyBzdXBwb3J0ZWQgKi8KIAogCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSAweEZGRkZGRkZGOwpAQCAtMTE2LDEwICsxMDQsOSBAQAogCX0KIAogCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9DVFJMX1RFUk1JTkFURSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfVEVSTUlOQVRFKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V2YWx1YXRlX29iamVjdApAQCAtMTQwLDE5ICsxMjcsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcHJlZml4X25vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9kZXNjKQorYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkJY2hhciAqcGF0aCwKKwkJCXUzMiBleHBlY3RlZF9yZXR1cm5fYnR5cGVzLAorCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjKQogewotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgaW5mbzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybl9idHlwZTsKKwlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgcmV0dXJuX2J0eXBlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfZXZhbHVhdGVfb2JqZWN0Iik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9ldmFsdWF0ZV9vYmplY3QiKTsKIAogCWluZm8ubm9kZSA9IHByZWZpeF9ub2RlOwogCWluZm8ucGFyYW1ldGVycyA9IE5VTEw7CkBAIC0xNjAsMzYgKzE0NCwzOCBAQAogCiAJLyogRXZhbHVhdGUgdGhlIG9iamVjdC9tZXRob2QgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKHBhdGgsICZpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShwYXRoLCAmaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzLiVzXSB3YXMgbm90IGZvdW5kXG4iLAotCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocHJlZml4X25vZGUpLCBwYXRoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IgKCJNZXRob2QgZXhlY3V0aW9uIGZhaWxlZCIsCi0JCQkJcHJlZml4X25vZGUsIHBhdGgsIHN0YXR1cyk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIlslNC40cy4lc10gd2FzIG5vdCBmb3VuZFxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocHJlZml4X25vZGUpLAorCQkJCQkgIHBhdGgpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUigiTWV0aG9kIGV4ZWN1dGlvbiBmYWlsZWQiLAorCQkJCQkJIHByZWZpeF9ub2RlLCBwYXRoLCBzdGF0dXMpOwogCQl9CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBEaWQgd2UgZ2V0IGEgcmV0dXJuIG9iamVjdD8gKi8KIAogCWlmICghaW5mby5yZXR1cm5fb2JqZWN0KSB7CiAJCWlmIChleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSB7Ci0JCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IgKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAotCQkJCXByZWZpeF9ub2RlLCBwYXRoLCBBRV9OT1RfRVhJU1QpOworCQkJQUNQSV9SRVBPUlRfTUVUSE9EX0VSUk9SKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAorCQkJCQkJIHByZWZpeF9ub2RlLCBwYXRoLAorCQkJCQkJIEFFX05PVF9FWElTVCk7CiAKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCQl9CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogTWFwIHRoZSByZXR1cm4gb2JqZWN0IHR5cGUgdG8gdGhlIGJpdG1hcHBlZCB0eXBlICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLnJldHVybl9vYmplY3QpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJcmV0dXJuX2J0eXBlID0gQUNQSV9CVFlQRV9JTlRFR0VSOwogCQlicmVhazsKQEAgLTIxMSw0MSArMTk3LDQxIEBACiAJCWJyZWFrOwogCX0KIAotCWlmICgoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSAmJgotCQkoIWV4cGVjdGVkX3JldHVybl9idHlwZXMpKSB7CisJaWYgKChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spICYmICghZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcykpIHsKIAkJLyoKIAkJICogV2UgcmVjZWl2ZWQgYSByZXR1cm4gb2JqZWN0LCBidXQgb25lIHdhcyBub3QgZXhwZWN0ZWQuICBUaGlzIGNhbgogCQkgKiBoYXBwZW4gZnJlcXVlbnRseSBpZiB0aGUgImltcGxpY2l0IHJldHVybiIgZmVhdHVyZSBpcyBlbmFibGVkLgogCQkgKiBKdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCBhbmQgcmV0dXJuIEFFX09LLgogCQkgKi8KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChpbmZvLnJldHVybl9vYmplY3QpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8ucmV0dXJuX29iamVjdCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCiAJLyogSXMgdGhlIHJldHVybiBvYmplY3Qgb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlcz8gKi8KIAogCWlmICghKGV4cGVjdGVkX3JldHVybl9idHlwZXMgJiByZXR1cm5fYnR5cGUpKSB7Ci0JCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUiAoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAotCQkJcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOworCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAorCQkJCQkgcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlR5cGUgcmV0dXJuZWQgZnJvbSAlcyB3YXMgaW5jb3JyZWN0OiAlcywgZXhwZWN0ZWQgQnR5cGVzOiAlWFxuIiwKLQkJCXBhdGgsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKGluZm8ucmV0dXJuX29iamVjdCksCi0JCQlleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVHlwZSByZXR1cm5lZCBmcm9tICVzIHdhcyBpbmNvcnJlY3Q6ICVzLCBleHBlY3RlZCBCdHlwZXM6ICVYXG4iLAorCQkJCSAgcGF0aCwKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby4KKwkJCQkJCQkgICAgICAgcmV0dXJuX29iamVjdCksCisJCQkJICBleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSk7CiAKIAkJLyogT24gZXJyb3IgZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGluZm8ucmV0dXJuX29iamVjdCk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfVFlQRSk7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLnJldHVybl9vYmplY3QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCiAJLyogT2JqZWN0IHR5cGUgaXMgT0ssIHJldHVybiBpdCAqLwogCiAJKnJldHVybl9kZXNjID0gaW5mby5yZXR1cm5fb2JqZWN0OwotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdApAQCAtMjY0LDIyICsyNTAsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICphZGRyZXNzKQorYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChjaGFyICpvYmplY3RfbmFtZSwKKwkJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCQkJYWNwaV9pbnRlZ2VyICogYWRkcmVzcykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0Iik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChkZXZpY2Vfbm9kZSwgb2JqZWN0X25hbWUsCi0JCQkgQUNQSV9CVFlQRV9JTlRFR0VSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGRldmljZV9ub2RlLCBvYmplY3RfbmFtZSwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogR2V0IHRoZSByZXR1cm5lZCBJbnRlZ2VyICovCkBAIC0yODgsMTEgKzI3MSwxMCBAQAogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pZF9zdHJpbmcKQEAgLTMxMCwxMCArMjkyLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX3V0X2NvcHlfaWRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0aW5hdGlvbiwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQorYWNwaV91dF9jb3B5X2lkX3N0cmluZyhjaGFyICpkZXN0aW5hdGlvbiwgY2hhciAqc291cmNlLCBhY3BpX3NpemUgbWF4X2xlbmd0aCkKIHsKIAogCS8qCkBAIC0zMjgsMTAgKzMwNyw5IEBACiAKIAkvKiBEbyB0aGUgYWN0dWFsIGNvcHkgKi8KIAotCUFDUElfU1RSTkNQWSAoZGVzdGluYXRpb24sIHNvdXJjZSwgbWF4X2xlbmd0aCk7CisJQUNQSV9TVFJOQ1BZKGRlc3RpbmF0aW9uLCBzb3VyY2UsIG1heF9sZW5ndGgpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9ISUQKQEAgLTM0OSw0MiArMzI3LDM5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0hJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAqaGlkKQorYWNwaV91dF9leGVjdXRlX0hJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmhpZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX0hJRCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfSElEIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0hJRCwKLQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORywgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0hJRCwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAorCQkJCQkgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgSElEIHRvIHN0cmluZyAqLwogCi0JCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKCh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBoaWQtPnZhbHVlKTsKLQl9Ci0JZWxzZSB7CisJCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcoKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCSAgaGlkLT52YWx1ZSk7CisJfSBlbHNlIHsKIAkJLyogQ29weSB0aGUgU3RyaW5nIEhJRCBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3QgKi8KIAotCQlhY3BpX3V0X2NvcHlfaWRfc3RyaW5nIChoaWQtPnZhbHVlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJc2l6ZW9mIChoaWQtPnZhbHVlKSk7CisJCWFjcGlfdXRfY29weV9pZF9zdHJpbmcoaGlkLT52YWx1ZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgICBzaXplb2YoaGlkLT52YWx1ZSkpOwogCX0KIAogCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCiAKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkCkBAIC00MDMsMTggKzM3OCwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICAgICAgICpvbmVfY2lkKQorYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCAqb25lX2NpZCkKIHsKIAotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgQ0lEIHRvIHN0cmluZyAqLwogCi0JCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKCh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBvbmVfY2lkLT52YWx1ZSk7CisJCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcoKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCSAgb25lX2NpZC0+dmFsdWUpOwogCQlyZXR1cm4gKEFFX09LKTsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKQEAgLTQyNSw4ICszOTksOCBAQAogCiAJCS8qIENvcHkgdGhlIFN0cmluZyBDSUQgZnJvbSB0aGUgcmV0dXJuZWQgb2JqZWN0ICovCiAKLQkJYWNwaV91dF9jb3B5X2lkX3N0cmluZyAob25lX2NpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQlBQ1BJX01BWF9DSURfTEVOR1RIKTsKKwkJYWNwaV91dF9jb3B5X2lkX3N0cmluZyhvbmVfY2lkLT52YWx1ZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgICBBQ1BJX01BWF9DSURfTEVOR1RIKTsKIAkJcmV0dXJuIChBRV9PSyk7CiAKIAlkZWZhdWx0OgpAQCAtNDM1LDcgKzQwOSw2IEBACiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9DSUQKQEAgLTQ1Myw0NSArNDI2LDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0NJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqcmV0dXJuX2NpZF9saXN0KQorYWNwaV91dF9leGVjdXRlX0NJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGRldmljZV9ub2RlLAorCQkgICAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqIHJldHVybl9jaWRfbGlzdCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGNvdW50OworCXUzMiBzaXplOwogCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3Q7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfQ0lEIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX0NJRCIpOwogCiAJLyogRXZhbHVhdGUgdGhlIF9DSUQgbWV0aG9kIGZvciB0aGlzIGRldmljZSAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGRldmljZV9ub2RlLCBNRVRIT0RfTkFNRV9fQ0lELAotCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HIHwgQUNQSV9CVFlQRV9QQUNLQUdFLAotCQkJICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19DSUQsCisJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORworCQkJCQkgfCBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIF9DSURzIHJldHVybmVkICovCiAKIAljb3VudCA9IDE7Ci0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCWNvdW50ID0gb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQ7CiAJfQogCiAJLyogQWxsb2NhdGUgYSB3b3JzdC1jYXNlIGJ1ZmZlciBmb3IgdGhlIF9DSURzICovCiAKLQlzaXplID0gKCgoY291bnQgLSAxKSAqIHNpemVvZiAoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCkpICsKLQkJCSAgIHNpemVvZiAoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0KSk7CisJc2l6ZSA9ICgoKGNvdW50IC0gMSkgKiBzaXplb2Yoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCkpICsKKwkJc2l6ZW9mKHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCkpOwogCi0JY2lkX2xpc3QgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKChhY3BpX3NpemUpIHNpemUpOworCWNpZF9saXN0ID0gQUNQSV9NRU1fQ0FMTE9DQVRFKChhY3BpX3NpemUpIHNpemUpOwogCWlmICghY2lkX2xpc3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKIAkvKiBJbml0IENJRCBsaXN0ICovCkBAIC01MDgsMzkgKzQ3OCwzOCBAQAogCiAJLyogVGhlIF9DSUQgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgQ0lEIG9yIGEgcGFja2FnZSAobGlzdCkgb2YgQ0lEcyAqLwogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCS8qIFRyYW5zbGF0ZSBlYWNoIHBhY2thZ2UgZWxlbWVudCAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkIChvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKLQkJCQkJICAmY2lkX2xpc3QtPmlkW2ldKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZChvYmpfZGVzYy0+cGFja2FnZS4KKwkJCQkJCSAgICAgIGVsZW1lbnRzW2ldLAorCQkJCQkJICAgICAgJmNpZF9saXN0LT5pZFtpXSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBPbmx5IG9uZSBDSUQsIHRyYW5zbGF0ZSB0byBhIHN0cmluZyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQgKG9ial9kZXNjLCBjaWRfbGlzdC0+aWQpOworCQlzdGF0dXMgPSBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKG9ial9kZXNjLCBjaWRfbGlzdC0+aWQpOwogCX0KIAogCS8qIENsZWFudXAgb24gZXJyb3IgKi8KIAotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9NRU1fRlJFRSAoY2lkX2xpc3QpOwotCX0KLQllbHNlIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9NRU1fRlJFRShjaWRfbGlzdCk7CisJfSBlbHNlIHsKIAkJKnJldHVybl9jaWRfbGlzdCA9IGNpZF9saXN0OwogCX0KIAogCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBfQ0lEIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9VSUQKQEAgLTU1OCw0MiArNTI3LDM5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1VJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAqdWlkKQorYWNwaV91dF9leGVjdXRlX1VJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKnVpZCkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX1VJRCIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfVUlEIik7Ci0KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKLQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORywgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAorCQkJCQkgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgVUlEIHRvIHN0cmluZyAqLwogCi0JCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcgKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCB1aWQtPnZhbHVlKTsKLQl9Ci0JZWxzZSB7CisJCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcob2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCQkgICB1aWQtPnZhbHVlKTsKKwl9IGVsc2UgewogCQkvKiBDb3B5IHRoZSBTdHJpbmcgVUlEIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCAqLwogCi0JCWFjcGlfdXRfY29weV9pZF9zdHJpbmcgKHVpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQlzaXplb2YgKHVpZC0+dmFsdWUpKTsKKwkJYWNwaV91dF9jb3B5X2lkX3N0cmluZyh1aWQtPnZhbHVlLCBvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgICAgIHNpemVvZih1aWQtPnZhbHVlKSk7CiAJfQogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9TVEEKQEAgLTYxMSwzMCArNTc3LDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1NUQSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MpCithY3BpX3V0X2V4ZWN1dGVfU1RBKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwgdTMyICogZmxhZ3MpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZXhlY3V0ZV9TVEEiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9leGVjdXRlX1NUQSIpOwotCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19TVEEsCi0JCQkgQUNQSV9CVFlQRV9JTlRFR0VSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1NUQSwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKEFFX05PVF9GT1VORCA9PSBzdGF0dXMpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkJIl9TVEEgb24gJTQuNHMgd2FzIG5vdCBmb3VuZCwgYXNzdW1pbmcgZGV2aWNlIGlzIHByZXNlbnRcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChkZXZpY2Vfbm9kZSkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiX1NUQSBvbiAlNC40cyB3YXMgbm90IGZvdW5kLCBhc3N1bWluZyBkZXZpY2UgaXMgcHJlc2VudFxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoZGV2aWNlX25vZGUpKSk7CiAKIAkJCSpmbGFncyA9IDB4MEY7CiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyogRXh0cmFjdCB0aGUgc3RhdHVzIGZsYWdzICovCkBAIC02NDMsMTEgKzYwNSwxMCBAQAogCiAJLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9TeGRzCkBAIC02NjUsNDQgKzYyNiw0NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXhlY3V0ZV9zeGRzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoaWdoZXN0KQorYWNwaV91dF9leGVjdXRlX3N4ZHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLCB1OCAqIGhpZ2hlc3QpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgaTsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2V4ZWN1dGVfU3hkcyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZXhlY3V0ZV9TeGRzIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWhpZ2hlc3RbaV0gPSAweEZGOwotCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoZGV2aWNlX25vZGUsCi0JCQkJIChjaGFyICopIGFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzW2ldLAotCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsCisJCQkJCQkgKGNoYXIgKikKKwkJCQkJCSBhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcworCQkJCQkJIFtpXSwgQUNQSV9CVFlQRV9JTlRFR0VSLAorCQkJCQkJICZvYmpfZGVzYyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJCQkiJXMgb24gRGV2aWNlICU0LjRzLCAlc1xuIiwKLQkJCQkJKGNoYXIgKikgYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXNbaV0sCi0JCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoZGV2aWNlX25vZGUpLAotCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICIlcyBvbiBEZXZpY2UgJTQuNHMsICVzXG4iLAorCQkJCQkJICAoY2hhciAqKQorCQkJCQkJICBhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcworCQkJCQkJICBbaV0sCisJCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZQorCQkJCQkJICAoZGV2aWNlX25vZGUpLAorCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKwkJCQkJCSAgKHN0YXR1cykpKTsKIAotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIEV4dHJhY3QgdGhlIERzdGF0ZSB2YWx1ZSAqLwogCiAJCQloaWdoZXN0W2ldID0gKHU4KSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAogCQkJLyogRGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCiAKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJfQogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKaW5kZXggNDE0NjAxOS4uMzk5ZTY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYwpAQCAtNDgsOCArNDgsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGdsb2JhbCIpCi0KK0FDUElfTU9EVUxFX05BTUUoInV0Z2xvYmFsIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MywxNyArNjIsMTIgQEAKICAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50byBhbiBBU0NJSSBzdHJpbmcuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgY2hhciAqCi1hY3BpX2Zvcm1hdF9leGNlcHRpb24gKAotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKQorY29uc3QgY2hhciAqYWNwaV9mb3JtYXRfZXhjZXB0aW9uKGFjcGlfc3RhdHVzIHN0YXR1cykKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN1Yl9zdGF0dXM7Ci0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdWJfc3RhdHVzOworCWNvbnN0IGNoYXIgKmV4Y2VwdGlvbiA9IE5VTEw7CiAKLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoImZvcm1hdF9leGNlcHRpb24iKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgiZm9ybWF0X2V4Y2VwdGlvbiIpOwogCiAJc3ViX3N0YXR1cyA9IChzdGF0dXMgJiB+QUVfQ09ERV9NQVNLKTsKIApAQCAtODEsMzUgKzc1LDM5IEBACiAJY2FzZSBBRV9DT0RFX0VOVklST05NRU5UQUw6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9FTlZfTUFYKSB7Ci0JCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfZW52IFtzdWJfc3RhdHVzXTsKKwkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbc3ViX3N0YXR1c107CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfUFJPR1JBTU1FUjoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1BHTV9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19wZ20gW3N1Yl9zdGF0dXMgLTFdOworCQkJZXhjZXB0aW9uID0KKwkJCSAgICBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfcGdtW3N1Yl9zdGF0dXMgLSAxXTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9BQ1BJX1RBQkxFUzoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1RCTF9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190YmwgW3N1Yl9zdGF0dXMgLTFdOworCQkJZXhjZXB0aW9uID0KKwkJCSAgICBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfdGJsW3N1Yl9zdGF0dXMgLSAxXTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9BTUw6CiAKIAkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9BTUxfTUFYKSB7Ci0JCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sIFtzdWJfc3RhdHVzIC0xXTsKKwkJCWV4Y2VwdGlvbiA9CisJCQkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2FtbFtzdWJfc3RhdHVzIC0gMV07CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFFX0NPREVfQ09OVFJPTDoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0NUUkxfTUFYKSB7Ci0JCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybCBbc3ViX3N0YXR1cyAtMV07CisJCQlleGNlcHRpb24gPQorCQkJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19jdHJsW3N1Yl9zdGF0dXMgLSAxXTsKIAkJfQogCQlicmVhazsKIApAQCAtMTIwLDE2ICsxMTgsMTUgQEAKIAlpZiAoIWV4Y2VwdGlvbikgewogCQkvKiBFeGNlcHRpb24gY29kZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYXG4iLCBzdGF0dXMpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYXG4iLCBzdGF0dXMpKTsKIAotCQlyZXR1cm4gKChjb25zdCBjaGFyICopICJVTktOT1dOX1NUQVRVU19DT0RFIik7CisJCXJldHVybiAoKGNvbnN0IGNoYXIgKikiVU5LTk9XTl9TVEFUVVNfQ09ERSIpOwogCX0KIAotCXJldHVybiAoKGNvbnN0IGNoYXIgKikgZXhjZXB0aW9uKTsKKwlyZXR1cm4gKChjb25zdCBjaGFyICopZXhjZXB0aW9uKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCkBAIC0xNDIsMzQgKzEzOSwzMiBAQAogICovCiAKIC8qIERlYnVnIHN3aXRjaCAtIGxldmVsIGFuZCB0cmFjZSBtYXNrICovCi11MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2RiZ19sZXZlbCA9IEFDUElfREVCVUdfREVGQVVMVDsKK3UzMiBhY3BpX2RiZ19sZXZlbCA9IEFDUElfREVCVUdfREVGQVVMVDsKIEVYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGV2ZWwpOwogCiAvKiBEZWJ1ZyBzd2l0Y2ggLSBsYXllciAoY29tcG9uZW50KSBtYXNrICovCiAKLXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZGJnX2xheWVyID0gQUNQSV9DT01QT05FTlRfREVGQVVMVCB8IEFDUElfQUxMX0RSSVZFUlM7Cit1MzIgYWNwaV9kYmdfbGF5ZXIgPSBBQ1BJX0NPTVBPTkVOVF9ERUZBVUxUIHwgQUNQSV9BTExfRFJJVkVSUzsKIEVYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGF5ZXIpOwotdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbmVzdGluZ19sZXZlbCA9IDA7Ci0KK3UzMiBhY3BpX2dibF9uZXN0aW5nX2xldmVsID0gMDsKIAogLyogRGVidWdnZXIgZ2xvYmFscyAqLwogCi11OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOwotdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfYWJvcnRfbWV0aG9kID0gRkFMU0U7Ci11OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gRkFMU0U7Cit1OCBhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOwordTggYWNwaV9nYmxfYWJvcnRfbWV0aG9kID0gRkFMU0U7Cit1OCBhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gRkFMU0U7CiAKIC8qIFN5c3RlbSBmbGFncyAqLwogCi11MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gMDsKK3UzMiBhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gMDsKIAogLyogU3lzdGVtIHN0YXJ0cyB1bmluaXRpYWxpemVkICovCiAKLXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKK3U4IGFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKIAotY29uc3QgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGVjb2RlX3RvOGJpdCBbOF0gPSB7MSwyLDQsOCwxNiwzMiw2NCwxMjh9OworY29uc3QgdTggYWNwaV9nYmxfZGVjb2RlX3RvOGJpdFs4XSA9IHsgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4IH07CiAKLWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdID0KLXsKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW0FDUElfU19TVEFURV9DT1VOVF0gPSB7CiAJIlxcX1MwXyIsCiAJIlxcX1MxXyIsCiAJIlxcX1MyXyIsCkBAIC0xNzgsOCArMTczLDcgQEAKIAkiXFxfUzVfIgogfTsKIAotY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdID0KLXsKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdID0gewogCSJfUzFEIiwKIAkiX1MyRCIsCiAJIl9TM0QiLApAQCAtMTkwLDggKzE4NCw3IEBACiAgKiBTdHJpbmdzIHN1cHBvcnRlZCBieSB0aGUgX09TSSBwcmVkZWZpbmVkIChpbnRlcm5hbCkgbWV0aG9kLgogICogV2hlbiBhZGRpbmcgc3RyaW5ncywgYmUgc3VyZSB0byB1cGRhdGUgQUNQSV9OVU1fT1NJX1NUUklOR1MuCiAgKi8KLWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tBQ1BJX05VTV9PU0lfU1RSSU5HU10gPQoteworY29uc3QgY2hhciAqYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbQUNQSV9OVU1fT1NJX1NUUklOR1NdID0gewogCS8qIE9wZXJhdGluZyBTeXN0ZW0gVmVuZG9yIFN0cmluZ3MgKi8KIAogCSJMaW51eCIsCkBAIC0yMDksNyArMjAyLDYgQEAKIAkiRXh0ZW5kZWQgQWRkcmVzcyBTcGFjZSBEZXNjcmlwdG9yIgogfTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5hbWVzcGFjZSBnbG9iYWxzCkBAIC0yMjUsNzQgKzIxNyw3MCBAQAogICogMikgX1RaXyBpcyBkZWZpbmVkIHRvIGJlIGEgdGhlcm1hbCB6b25lIGluIG9yZGVyIHRvIGFsbG93IEFTTCBjb2RlIHRvCiAgKiAgICBwZXJmb3JtIGEgTm90aWZ5KCkgb3BlcmF0aW9uIG9uIGl0LgogICovCi1jb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICAgICAgYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXNbXSA9Ci17IHsiX0dQRSIsICAgIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgICAgICBOVUxMfSwKLQl7Il9QUl8iLCAgICBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsICAgICAgTlVMTH0sCi0JeyJfU0JfIiwgICAgQUNQSV9UWVBFX0RFVklDRSwgICAgICAgICAgIE5VTEx9LAotCXsiX1NJXyIsICAgIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgICAgICBOVUxMfSwKLQl7Il9UWl8iLCAgICBBQ1BJX1RZUEVfVEhFUk1BTCwgICAgICAgICAgTlVMTH0sCi0JeyJfUkVWIiwgICAgQUNQSV9UWVBFX0lOVEVHRVIsICAgICAgICAgIChjaGFyICopIEFDUElfQ0FfU1VQUE9SVF9MRVZFTH0sCi0JeyJfT1NfIiwgICAgQUNQSV9UWVBFX1NUUklORywgICAgICAgICAgIEFDUElfT1NfTkFNRX0sCi0JeyJfR0xfIiwgICAgQUNQSV9UWVBFX01VVEVYLCAgICAgICAgICAgIChjaGFyICopIDF9LAorY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lc1tdID0KKyAgICB7IHsiX0dQRSIsIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgTlVMTH0sCit7Il9QUl8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAoreyJfU0JfIiwgQUNQSV9UWVBFX0RFVklDRSwgTlVMTH0sCit7Il9TSV8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAoreyJfVFpfIiwgQUNQSV9UWVBFX1RIRVJNQUwsIE5VTEx9LAoreyJfUkVWIiwgQUNQSV9UWVBFX0lOVEVHRVIsIChjaGFyICopQUNQSV9DQV9TVVBQT1JUX0xFVkVMfSwKK3siX09TXyIsIEFDUElfVFlQRV9TVFJJTkcsIEFDUElfT1NfTkFNRX0sCit7Il9HTF8iLCBBQ1BJX1RZUEVfTVVURVgsIChjaGFyICopMX0sCiAKICNpZiAhZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSB8fCBkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkKLQl7Il9PU0kiLCAgICBBQ1BJX1RZUEVfTUVUSE9ELCAgICAgICAgICAgKGNoYXIgKikgMX0sCit7Il9PU0kiLCBBQ1BJX1RZUEVfTUVUSE9ELCAoY2hhciAqKTF9LAogI2VuZGlmCiAKIAkvKiBUYWJsZSB0ZXJtaW5hdG9yICovCiAKLQl7TlVMTCwgICAgICBBQ1BJX1RZUEVfQU5ZLCAgICAgICAgICAgICAgTlVMTH0KK3tOVUxMLCBBQ1BJX1RZUEVfQU5ZLCBOVUxMfQogfTsKIAogLyoKICAqIFByb3BlcnRpZXMgb2YgdGhlIEFDUEkgT2JqZWN0IFR5cGVzLCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbC4KICAqIFRoZSB0YWJsZSBpcyBpbmRleGVkIGJ5IHZhbHVlcyBvZiBhY3BpX29iamVjdF90eXBlCiAgKi8KLWNvbnN0IHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW10gPQotewotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDAwIEFueSAgICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAwMSBOdW1iZXIgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMDIgU3RyaW5nICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDAzIEJ1ZmZlciAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAwNCBQYWNrYWdlICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMDUgZmllbGRfdW5pdCAgICAgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsICAgICAgICAgICAgICAgICAgIC8qIDA2IERldmljZSAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAwNyBFdmVudCAgICAgICAgICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSwgICAgICAgICAgICAgICAgICAgLyogMDggTWV0aG9kICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDA5IE11dGV4ICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAxMCBSZWdpb24gICAgICAgICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSwgICAgICAgICAgICAgICAgICAgLyogMTEgUG93ZXIgICAgICAgICAgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsICAgICAgICAgICAgICAgICAgIC8qIDEyIFByb2Nlc3NvciAgICAgICAgKi8KLQlBQ1BJX05TX05FV1NDT1BFLCAgICAgICAgICAgICAgICAgICAvKiAxMyBUaGVybWFsICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMTQgYnVmZmVyX2ZpZWxkICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDE1IGRkYl9oYW5kbGUgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAxNiBEZWJ1ZyBPYmplY3QgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMTcgZGVmX2ZpZWxkICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDE4IGJhbmtfZmllbGQgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAxOSBpbmRleF9maWVsZCAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMjAgUmVmZXJlbmNlICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDIxIEFsaWFzICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAyMiBtZXRob2RfYWxpYXMgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMjMgTm90aWZ5ICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLCAgICAgICAgICAgICAgICAgICAgIC8qIDI0IEFkZHJlc3MgSGFuZGxlciAgKi8KLQlBQ1BJX05TX05FV1NDT1BFIHwgQUNQSV9OU19MT0NBTCwgICAvKiAyNSBSZXNvdXJjZSBEZXNjICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSB8IEFDUElfTlNfTE9DQUwsICAgLyogMjYgUmVzb3VyY2UgRmllbGQgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsICAgICAgICAgICAgICAgICAgIC8qIDI3IFNjb3BlICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwgICAgICAgICAgICAgICAgICAgICAvKiAyOCBFeHRyYSAgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsICAgICAgICAgICAgICAgICAgICAgLyogMjkgRGF0YSAgICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIEludmFsaWQgICAgICAgICAgKi8KK2NvbnN0IHU4IGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbXSA9IHsKKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAwIEFueSAgICAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAxIE51bWJlciAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAyIFN0cmluZyAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDAzIEJ1ZmZlciAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDA0IFBhY2thZ2UgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDA1IGZpZWxkX3VuaXQgICAgICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAwNiBEZXZpY2UgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwNyBFdmVudCAgICAgICAgICAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMDggTWV0aG9kICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMDkgTXV0ZXggICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTAgUmVnaW9uICAgICAgICAgICAqLworCUFDUElfTlNfTkVXU0NPUEUsCS8qIDExIFBvd2VyICAgICAgICAgICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAxMiBQcm9jZXNzb3IgICAgICAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMTMgVGhlcm1hbCAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTQgYnVmZmVyX2ZpZWxkICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTUgZGRiX2hhbmRsZSAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTYgRGVidWcgT2JqZWN0ICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTcgZGVmX2ZpZWxkICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTggYmFua19maWVsZCAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMTkgaW5kZXhfZmllbGQgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjAgUmVmZXJlbmNlICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjEgQWxpYXMgICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjIgbWV0aG9kX2FsaWFzICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjMgTm90aWZ5ICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjQgQWRkcmVzcyBIYW5kbGVyICAqLworCUFDUElfTlNfTkVXU0NPUEUgfCBBQ1BJX05TX0xPQ0FMLAkvKiAyNSBSZXNvdXJjZSBEZXNjICAgICovCisJQUNQSV9OU19ORVdTQ09QRSB8IEFDUElfTlNfTE9DQUwsCS8qIDI2IFJlc291cmNlIEZpZWxkICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAyNyBTY29wZSAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAyOCBFeHRyYSAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAyOSBEYXRhICAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwJCS8qIDMwIEludmFsaWQgICAgICAgICAgKi8KIH07CiAKLQogLyogSGV4IHRvIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaGV4X3RvX2FzY2lpW10gPQotewotCScwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsCi0JJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJworc3RhdGljIGNvbnN0IGNoYXIgYWNwaV9nYmxfaGV4X3RvX2FzY2lpW10gPSB7CisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisJJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcgpAQCAtMzA3LDE2ICsyOTUsMTIgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jaGFyCi1hY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbikKK2NoYXIgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcihhY3BpX2ludGVnZXIgaW50ZWdlciwgdTMyIHBvc2l0aW9uKQogewogCiAJcmV0dXJuIChhY3BpX2dibF9oZXhfdG9fYXNjaWlbKGludGVnZXIgPj4gcG9zaXRpb24pICYgMHhGXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUYWJsZSBuYW1lIGdsb2JhbHMKQEAgLTMzMCw2NyArMzE0LDEzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX3RhYmxlX2xpc3QgICAgICAgICAgICAgIGFjcGlfZ2JsX3RhYmxlX2xpc3RzW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK3N0cnVjdCBhY3BpX3RhYmxlX2xpc3QgYWNwaV9nYmxfdGFibGVfbGlzdHNbTlVNX0FDUElfVEFCTEVfVFlQRVNdOwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0ICAgICAgICAgICBhY3BpX2dibF90YWJsZV9kYXRhW05VTV9BQ1BJX1RBQkxFX1RZUEVTXSA9Ci17CitzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbTlVNX0FDUElfVEFCTEVfVFlQRVNdID0gewogCS8qKioqKioqKioqKiAgICBOYW1lLCAgIFNpZ25hdHVyZSwgR2xvYmFsIHR5cGVkIHBvaW50ZXIgICAgIFNpZ25hdHVyZSBzaXplLCAgICAgIFR5cGUgICAgICAgICAgICAgICAgICBIb3cgbWFueSBhbGxvd2VkPywgICAgQ29udGFpbnMgdmFsaWQgQU1MPyAqLwogCi0JLyogUlNEUCAwICovIHtSU0RQX05BTUUsIFJTRFBfU0lHLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChSU0RQX1NJRyktMSwgQUNQSV9UQUJMRV9ST09UICAgICB8IEFDUElfVEFCTEVfU0lOR0xFfSwKLQkvKiBEU0RUIDEgKi8ge0RTRFRfU0lHLCAgRFNEVF9TSUcsICh2b2lkICopICZhY3BpX2dibF9EU0RULCBzaXplb2YgKERTRFRfU0lHKS0xLCBBQ1BJX1RBQkxFX1NFQ09OREFSWXwgQUNQSV9UQUJMRV9TSU5HTEUgICB8IEFDUElfVEFCTEVfRVhFQ1VUQUJMRX0sCi0JLyogRkFEVCAyICovIHtGQURUX1NJRywgIEZBRFRfU0lHLCAodm9pZCAqKSAmYWNwaV9nYmxfRkFEVCwgc2l6ZW9mIChGQURUX1NJRyktMSwgQUNQSV9UQUJMRV9QUklNQVJZICB8IEFDUElfVEFCTEVfU0lOR0xFfSwKLQkvKiBGQUNTIDMgKi8ge0ZBQ1NfU0lHLCAgRkFDU19TSUcsICh2b2lkICopICZhY3BpX2dibF9GQUNTLCBzaXplb2YgKEZBQ1NfU0lHKS0xLCBBQ1BJX1RBQkxFX1NFQ09OREFSWXwgQUNQSV9UQUJMRV9TSU5HTEV9LAotCS8qIFBTRFQgNCAqLyB7UFNEVF9TSUcsICBQU0RUX1NJRywgTlVMTCwgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoUFNEVF9TSUcpLTEsIEFDUElfVEFCTEVfUFJJTUFSWSAgfCBBQ1BJX1RBQkxFX01VTFRJUExFIHwgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfSwKLQkvKiBTU0RUIDUgKi8ge1NTRFRfU0lHLCAgU1NEVF9TSUcsIE5VTEwsICAgICAgICAgICAgICAgICAgICBzaXplb2YgKFNTRFRfU0lHKS0xLCBBQ1BJX1RBQkxFX1BSSU1BUlkgIHwgQUNQSV9UQUJMRV9NVUxUSVBMRSB8IEFDUElfVEFCTEVfRVhFQ1VUQUJMRX0sCi0JLyogWFNEVCA2ICovIHtYU0RUX1NJRywgIFhTRFRfU0lHLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChSU0RUX1NJRyktMSwgQUNQSV9UQUJMRV9ST09UICAgICB8IEFDUElfVEFCTEVfU0lOR0xFfSwKKwkvKiBSU0RQIDAgKi8ge1JTRFBfTkFNRSwgUlNEUF9TSUcsIE5VTEwsIHNpemVvZihSU0RQX1NJRykgLSAxLAorCQkgICAgICBBQ1BJX1RBQkxFX1JPT1QgfCBBQ1BJX1RBQkxFX1NJTkdMRX0KKwksCisJLyogRFNEVCAxICovIHtEU0RUX1NJRywgRFNEVF9TSUcsICh2b2lkICopJmFjcGlfZ2JsX0RTRFQsCisJCSAgICAgIHNpemVvZihEU0RUX1NJRykgLSAxLAorCQkgICAgICBBQ1BJX1RBQkxFX1NFQ09OREFSWSB8IEFDUElfVEFCTEVfU0lOR0xFIHwKKwkJICAgICAgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfQorCSwKKwkvKiBGQURUIDIgKi8ge0ZBRFRfU0lHLCBGQURUX1NJRywgKHZvaWQgKikmYWNwaV9nYmxfRkFEVCwKKwkJICAgICAgc2l6ZW9mKEZBRFRfU0lHKSAtIDEsCisJCSAgICAgIEFDUElfVEFCTEVfUFJJTUFSWSB8IEFDUElfVEFCTEVfU0lOR0xFfQorCSwKKwkvKiBGQUNTIDMgKi8ge0ZBQ1NfU0lHLCBGQUNTX1NJRywgKHZvaWQgKikmYWNwaV9nYmxfRkFDUywKKwkJICAgICAgc2l6ZW9mKEZBQ1NfU0lHKSAtIDEsCisJCSAgICAgIEFDUElfVEFCTEVfU0VDT05EQVJZIHwgQUNQSV9UQUJMRV9TSU5HTEV9CisJLAorCS8qIFBTRFQgNCAqLyB7UFNEVF9TSUcsIFBTRFRfU0lHLCBOVUxMLCBzaXplb2YoUFNEVF9TSUcpIC0gMSwKKwkJICAgICAgQUNQSV9UQUJMRV9QUklNQVJZIHwgQUNQSV9UQUJMRV9NVUxUSVBMRSB8CisJCSAgICAgIEFDUElfVEFCTEVfRVhFQ1VUQUJMRX0KKwksCisJLyogU1NEVCA1ICovIHtTU0RUX1NJRywgU1NEVF9TSUcsIE5VTEwsIHNpemVvZihTU0RUX1NJRykgLSAxLAorCQkgICAgICBBQ1BJX1RBQkxFX1BSSU1BUlkgfCBBQ1BJX1RBQkxFX01VTFRJUExFIHwKKwkJICAgICAgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfQorCSwKKwkvKiBYU0RUIDYgKi8ge1hTRFRfU0lHLCBYU0RUX1NJRywgTlVMTCwgc2l6ZW9mKFJTRFRfU0lHKSAtIDEsCisJCSAgICAgIEFDUElfVEFCTEVfUk9PVCB8IEFDUElfVEFCTEVfU0lOR0xFfQorCSwKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEV2ZW50IGFuZCBIYXJkd2FyZSBnbG9iYWxzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gICAgICAgYWNwaV9nYmxfYml0X3JlZ2lzdGVyX2luZm9bQUNQSV9OVU1fQklUUkVHXSA9Ci17CitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddID0gewogCS8qIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50IFJlZ2lzdGVyICAgICAgICAgICAgIFJlZ2lzdGVyIEJpdCBQb3NpdGlvbiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBCaXQgTWFzayAgICAgICAqLwogCi0JLyogQUNQSV9CSVRSRUdfVElNRVJfU1RBVFVTICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAgIEFDUElfQklUUE9TSVRJT05fVElNRVJfU1RBVFVTLCAgICAgICAgICBBQ1BJX0JJVE1BU0tfVElNRVJfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1NUQVRVUyAgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9CVVNfTUFTVEVSX1NUQVRVUywgICAgIEFDUElfQklUTUFTS19CVVNfTUFTVEVSX1NUQVRVU30sCi0JLyogQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfU1RBVFVTICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLCAgIEFDUElfQklUUE9TSVRJT05fR0xPQkFMX0xPQ0tfU1RBVFVTLCAgICBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fU1RBVFVTICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19SVF9DTE9DS19TVEFUVVMgICAgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVN9LAotCS8qIEFDUElfQklUUkVHX1dBS0VfU1RBVFVTICAgICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywgICBBQ1BJX0JJVFBPU0lUSU9OX1dBS0VfU1RBVFVTLCAgICAgICAgICAgQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19QQ0lFWFBfV0FLRV9TVEFUVVMgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICAgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9TVEFUVVMsICAgIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1RJTUVSX1NUQVRVUyAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1RJTUVSX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19USU1FUl9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX0JVU19NQVNURVJfU1RBVFVTICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX0JVU19NQVNURVJfU1RBVFVTfSwKKwkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19TVEFUVVMgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTfSwKKwkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9TVEFUVVMgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfU1RBVFVTICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fV0FLRV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfV0FLRV9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1BDSUVYUF9XQUtFX1NUQVRVUyAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVN9LAogCi0JLyogQUNQSV9CSVRSRUdfVElNRVJfRU5BQkxFICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAgIEFDUElfQklUUE9TSVRJT05fVElNRVJfRU5BQkxFLCAgICAgICAgICBBQ1BJX0JJVE1BU0tfVElNRVJfRU5BQkxFfSwKLQkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICAgQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19FTkFCTEUsICAgIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9FTkFCTEUgICovICAge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgICBBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9FTkFCTEUsICAgQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUgICovICAge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgICBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9FTkFCTEUsICAgQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1JUX0NMT0NLX0VOQUJMRSAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgICBBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX0VOQUJMRSwgICAgICAgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRX0sCi0JLyogQUNQSV9CSVRSRUdfV0FLRV9FTkFCTEUgICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfSwKLQkvKiBBQ1BJX0JJVFJFR19QQ0lFWFBfV0FLRV9ESVNBQkxFICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICAgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9ESVNBQkxFLCAgIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19USU1FUl9FTkFCTEUgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9USU1FUl9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfVElNRVJfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fRU5BQkxFICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX0VOQUJMRX0sCisJLyogQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRX0sCisJLyogQUNQSV9CSVRSRUdfV0FLRV9FTkFCTEUgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgMCwgMH0sCisJLyogQUNQSV9CSVRSRUdfUENJRVhQX1dBS0VfRElTQUJMRSAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUENJRVhQX1dBS0VfRElTQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFfSwKIAotCS8qIEFDUElfQklUUkVHX1NDSV9FTkFCTEUgICAgICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICBBQ1BJX0JJVFBPU0lUSU9OX1NDSV9FTkFCTEUsICAgICAgICAgICAgQUNQSV9CSVRNQVNLX1NDSV9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxEICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICBBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfUkxELCAgICAgICAgQUNQSV9CSVRNQVNLX0JVU19NQVNURVJfUkxEfSwKLQkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19SRUxFQVNFICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAgQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19SRUxFQVNFLCAgIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19SRUxFQVNFfSwKLQkvKiBBQ1BJX0JJVFJFR19TTEVFUF9UWVBFX0EgICAgICAgICAqLyAgIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1gsICAgICAgICAgIEFDUElfQklUTUFTS19TTEVFUF9UWVBFX1h9LAotCS8qIEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQiAgICAgICAgICovICAge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX1RZUEVfWCwgICAgICAgICAgQUNQSV9CSVRNQVNLX1NMRUVQX1RZUEVfWH0sCi0JLyogQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgIEFDUElfQklUUE9TSVRJT05fU0xFRVBfRU5BQkxFLCAgICAgICAgICBBQ1BJX0JJVE1BU0tfU0xFRVBfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFICAgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fU0NJX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19TQ0lfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fQlVTX01BU1RFUl9STEQsCisJCQkJCQlBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9STER9LAorCS8qIEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19SRUxFQVNFLAorCQkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1JFTEVBU0V9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1gsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfVFlQRV9YfSwKKwkvKiBBQ1BJX0JJVFJFR19TTEVFUF9UWVBFX0IgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fU0xFRVBfVFlQRV9YLAorCQkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX1RZUEVfWH0sCisJLyogQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19TTEVFUF9FTkFCTEV9LAogCi0JLyogQUNQSV9CSVRSRUdfQVJCX0RJUyAgICAgICAgICAgICAgKi8gICB7QUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwgIEFDUElfQklUUE9TSVRJT05fQVJCX0RJU0FCTEUsICAgICAgICAgICBBQ1BJX0JJVE1BU0tfQVJCX0RJU0FCTEV9CisJLyogQUNQSV9CSVRSRUdfQVJCX0RJUyAgICAgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0FSQl9ESVNBQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX0FSQl9ESVNBQkxFfQogfTsKIAotCi1zdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9pbmZvICAgICAgICBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU10gPQotewotCS8qIEFDUElfRVZFTlRfUE1USU1FUiAgICAgICAqLyAge0FDUElfQklUUkVHX1RJTUVSX1NUQVRVUywgICAgICAgICAgQUNQSV9CSVRSRUdfVElNRVJfRU5BQkxFLCAgICAgICAgQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUywgICAgICAgICAgQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRX0sCi0JLyogQUNQSV9FVkVOVF9HTE9CQUwgICAgICAgICovICB7QUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfU1RBVFVTLCAgICBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUsICBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTLCAgICBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiAgKi8gIHtBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9FTkFCTEUsIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1NMRUVQX0JVVFRPTiAgKi8gIHtBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUsIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTLCAgIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1JUQyAgICAgICAgICAgKi8gIHtBQ1BJX0JJVFJFR19SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUUkVHX1JUX0NMT0NLX0VOQUJMRSwgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMsICAgICAgIEFDUElfQklUTUFTS19SVF9DTE9DS19FTkFCTEV9LAorc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbyBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU10gPSB7CisJLyogQUNQSV9FVkVOVF9QTVRJTUVSICAgICAgICovIHtBQ1BJX0JJVFJFR19USU1FUl9TVEFUVVMsCisJCQkJCUFDUElfQklUUkVHX1RJTUVSX0VOQUJMRSwKKwkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRX0sCisJLyogQUNQSV9FVkVOVF9HTE9CQUwgICAgICAgICovIHtBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19TVEFUVVMsCisJCQkJCUFDUElfQklUUkVHX0dMT0JBTF9MT0NLX0VOQUJMRSwKKwkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX0VOQUJMRX0sCisJLyogQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04gICovIHtBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTLAorCQkJCQlBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAorCS8qIEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OICAqLyB7QUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX0VOQUJMRSwKKwkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9TVEFUVVMsCisJCQkJCUFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFfSwKKwkvKiBBQ1BJX0VWRU5UX1JUQyAgICAgICAgICAgKi8ge0FDUElfQklUUkVHX1JUX0NMT0NLX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfU1RBVFVTLAorCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfRU5BQkxFfSwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MDcsOCArNDYzLDcgQEAKIAogLyogUmVnaW9uIHR5cGUgZGVjb2RpbmcgKi8KIAotY29uc3QgY2hhciAgICAgICAgICAgICAgICAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU10gPQoteworY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU10gPSB7CiAvKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAoa2VlcCB0aGVzZSBBU0wgS2V5d29yZHMgYXMtaXMpICovCiAJIlN5c3RlbU1lbW9yeSIsCiAJIlN5c3RlbUlPIiwKQEAgLTQyMSwyNSArNDc2LDE4IEBACiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiB9OwogCi0KLWNoYXIgKgotYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VfaWQpCitjaGFyICphY3BpX3V0X2dldF9yZWdpb25fbmFtZSh1OCBzcGFjZV9pZCkKIHsKIAotCWlmIChzcGFjZV9pZCA+PSBBQ1BJX1VTRVJfUkVHSU9OX0JFR0lOKQotCXsKKwlpZiAoc3BhY2VfaWQgPj0gQUNQSV9VU0VSX1JFR0lPTl9CRUdJTikgewogCQlyZXR1cm4gKCJ1c2VyX2RlZmluZWRfcmVnaW9uIik7Ci0JfQotCWVsc2UgaWYgKHNwYWNlX2lkID49IEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUykKLQl7CisJfSBlbHNlIGlmIChzcGFjZV9pZCA+PSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMpIHsKIAkJcmV0dXJuICgiaW52YWxpZF9zcGFjZV9pZCIpOwogCX0KIAotCXJldHVybiAoKGNoYXIgKikgYWNwaV9nYmxfcmVnaW9uX3R5cGVzW3NwYWNlX2lkXSk7CisJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX3JlZ2lvbl90eXBlc1tzcGFjZV9pZF0pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUKQEAgLTQ1NCw4ICs1MDIsNyBAQAogCiAvKiBFdmVudCB0eXBlIGRlY29kaW5nICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICphY3BpX2dibF9ldmVudF90eXBlc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdID0KLXsKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9ldmVudF90eXBlc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdID0gewogCSJQTV9UaW1lciIsCiAJImdsb2JhbF9sb2NrIiwKIAkicG93ZXJfYnV0dG9uIiwKQEAgLTQ2MywyMSArNTEwLDE2IEBACiAJInJlYWxfdGltZV9jbG9jayIsCiB9OwogCi0KLWNoYXIgKgotYWNwaV91dF9nZXRfZXZlbnRfbmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9pZCkKK2NoYXIgKmFjcGlfdXRfZ2V0X2V2ZW50X25hbWUodTMyIGV2ZW50X2lkKQogewogCi0JaWYgKGV2ZW50X2lkID4gQUNQSV9FVkVOVF9NQVgpCi0JeworCWlmIChldmVudF9pZCA+IEFDUElfRVZFTlRfTUFYKSB7CiAJCXJldHVybiAoImludmFsaWRfZXZlbnRfaUQiKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSk7CisJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCkBAIC00OTgsMTIgKzU0MCwxMSBAQAogICogd2hlbiBzdG9yZWQgaW4gYSB0YWJsZSBpdCByZWFsbHkgbWVhbnMgdGhhdCB3ZSBoYXZlIHRodXMgZmFyIHNlZW4gbm8KICAqIGV2aWRlbmNlIHRvIGluZGljYXRlIHdoYXQgdHlwZSBpcyBhY3R1YWxseSBnb2luZyB0byBiZSBzdG9yZWQgZm9yIHRoaXMgZW50cnkuCiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2JhZF90eXBlW10gPSAiVU5ERUZJTkVEIjsKK3N0YXRpYyBjb25zdCBjaGFyIGFjcGlfZ2JsX2JhZF90eXBlW10gPSAiVU5ERUZJTkVEIjsKIAogLyogUHJpbnRhYmxlIG5hbWVzIG9mIHRoZSBBQ1BJIG9iamVjdCB0eXBlcyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1tdID0KLXsKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9uc190eXBlX25hbWVzW10gPSB7CiAJLyogMDAgKi8gIlVudHlwZWQiLAogCS8qIDAxICovICJJbnRlZ2VyIiwKIAkvKiAwMiAqLyAiU3RyaW5nIiwKQEAgLTUzNywzNSArNTc4LDI2IEBACiAJLyogMzAgKi8gIkludmFsaWQiCiB9OwogCi0KLWNoYXIgKgotYWNwaV91dF9nZXRfdHlwZV9uYW1lICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpCitjaGFyICphY3BpX3V0X2dldF90eXBlX25hbWUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQogewogCi0JaWYgKHR5cGUgPiBBQ1BJX1RZUEVfSU5WQUxJRCkKLQl7Ci0JCXJldHVybiAoKGNoYXIgKikgYWNwaV9nYmxfYmFkX3R5cGUpOworCWlmICh0eXBlID4gQUNQSV9UWVBFX0lOVkFMSUQpIHsKKwkJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2JhZF90eXBlKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbdHlwZV0pOworCXJldHVybiAoKGNoYXIgKilhY3BpX2dibF9uc190eXBlX25hbWVzW3R5cGVdKTsKIH0KIAotCi1jaGFyICoKLWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQorY2hhciAqYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKIAotCWlmICghb2JqX2Rlc2MpCi0JeworCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuICgiW05VTEwgT2JqZWN0IERlc2NyaXB0b3JdIik7CiAJfQogCi0JcmV0dXJuIChhY3BpX3V0X2dldF90eXBlX25hbWUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpKTsKKwlyZXR1cm4gKGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUKQEAgLTU3OCwzOSArNjEwLDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY2hhciAqCi1hY3BpX3V0X2dldF9ub2RlX25hbWUgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCkKK2NoYXIgKmFjcGlfdXRfZ2V0X25vZGVfbmFtZSh2b2lkICpvYmplY3QpCiB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvYmplY3Q7Ci0KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdDsKIAogCS8qIE11c3QgcmV0dXJuIGEgc3RyaW5nIG9mIGV4YWN0bHkgNCBjaGFyYWN0ZXJzID09IEFDUElfTkFNRV9TSVpFICovCiAKLQlpZiAoIW9iamVjdCkKLQl7CisJaWYgKCFvYmplY3QpIHsKIAkJcmV0dXJuICgiTlVMTCIpOwogCX0KIAogCS8qIENoZWNrIGZvciBSb290IG5vZGUgKi8KIAotCWlmICgob2JqZWN0ID09IEFDUElfUk9PVF9PQkpFQ1QpIHx8Ci0JCShvYmplY3QgPT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkKLQl7CisJaWYgKChvYmplY3QgPT0gQUNQSV9ST09UX09CSkVDVCkgfHwgKG9iamVjdCA9PSBhY3BpX2dibF9yb290X25vZGUpKSB7CiAJCXJldHVybiAoIlwiXFxcIiAiKTsKIAl9CiAKIAkvKiBEZXNjcmlwdG9yIG11c3QgYmUgYSBuYW1lc3BhY2Ugbm9kZSAqLwogCi0JaWYgKG5vZGUtPmRlc2NyaXB0b3IgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpCi0JeworCWlmIChub2RlLT5kZXNjcmlwdG9yICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCXJldHVybiAoIiMjIyMiKTsKIAl9CiAKIAkvKiBOYW1lIG11c3QgYmUgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KIAotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKCogKHUzMiAqKSBub2RlLT5uYW1lLmFzY2lpKSkKLQl7CisJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSgqKHUzMiAqKSBub2RlLT5uYW1lLmFzY2lpKSkgewogCQlyZXR1cm4gKCI/Pz8/Iik7CiAJfQogCkBAIC02MTksNyArNjQzLDYgQEAKIAlyZXR1cm4gKG5vZGUtPm5hbWUuYXNjaWkpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQpAQCAtNjM0LDggKzY1Nyw3IEBACiAKIC8qIFByaW50YWJsZSBuYW1lcyBvZiBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW10gPQoteworc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tdID0gewogCS8qIDAwICovICJJbnZhbGlkIiwKIAkvKiAwMSAqLyAiQ2FjaGVkIiwKIAkvKiAwMiAqLyAiU3RhdGUtR2VuZXJpYyIsCkBAIC02NTQsMjcgKzY3NiwyMiBAQAogCS8qIDE1ICovICJOb2RlIgogfTsKIAotCi1jaGFyICoKLWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KQorY2hhciAqYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHZvaWQgKm9iamVjdCkKIHsKIAotCWlmICghb2JqZWN0KQotCXsKKwlpZiAoIW9iamVjdCkgewogCQlyZXR1cm4gKCJOVUxMIE9CSkVDVCIpOwogCX0KIAotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPiBBQ1BJX0RFU0NfVFlQRV9NQVgpCi0JewotCQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX2JhZF90eXBlKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgPiBBQ1BJX0RFU0NfVFlQRV9NQVgpIHsKKwkJcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2JhZF90eXBlKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopIGFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCldKTsKKwlyZXR1cm4gKChjaGFyICopCisJCWFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KV0pOwogCiB9CiAKLQogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIC8qCiAgKiBTdHJpbmdzIGFuZCBwcm9jZWR1cmVzIHVzZWQgZm9yIGRlYnVnIG9ubHkKQEAgLTY5MywxMyArNzEwLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY2hhciAqCi1hY3BpX3V0X2dldF9tdXRleF9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X2lkKQorY2hhciAqYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSh1MzIgbXV0ZXhfaWQpCiB7CiAKLQlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpCi0JeworCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgewogCQlyZXR1cm4gKCJJbnZhbGlkIE11dGV4IElEIik7CiAJfQogCkBAIC03MDcsNyArNzIxLDYgQEAKIH0KICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUKQEAgLTcyMCwxMyArNzMzLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSkKK3U4IGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQogewogCi0JaWYgKHR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKQotCXsKKwlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKIAkJLyogTm90ZTogQXNzdW1lcyBhbGwgVFlQRXMgYXJlIGNvbnRpZ3VvdXMgKGV4dGVybmFsL2xvY2FsKSAqLwogCiAJCXJldHVybiAoRkFMU0UpOwpAQCAtNzM1LDc0ICs3NDUsNiBAQAogCXJldHVybiAoVFJVRSk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZAotICoKLSAqIFBBUkFNRVRFUlM6ICBpZF90eXBlICAgICAgICAgLSBUeXBlIG9mIElEIChtZXRob2Qgb3IgdGFibGUpCi0gKgotICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIGlkCi0gKgotICogTk9URTogdGhpcyBhbGdvcml0aG0gaGFzIGEgd3JhcGFyb3VuZCBwcm9ibGVtIGF0IDY0X2sgbWV0aG9kIGludm9jYXRpb25zLCBhbmQKLSAqICAgICAgIHNob3VsZCBiZSByZXZpc2l0ZWQgKFRCRCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX293bmVyX2lkCi1hY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkX3R5cGUpCi17Ci0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZCA9IDB4RkZGRjsKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2FsbG9jYXRlX293bmVyX2lkIik7Ci0KLQotCWlmIChBQ1BJX0ZBSUxVUkUgKGFjcGlfdXRfYWNxdWlyZV9tdXRleCAoQUNQSV9NVFhfQ0FDSEVTKSkpCi0JewotCQlyZXR1cm4gKDApOwotCX0KLQotCXN3aXRjaCAoaWRfdHlwZSkKLQl7Ci0JY2FzZSBBQ1BJX09XTkVSX1RZUEVfVEFCTEU6Ci0KLQkJb3duZXJfaWQgPSBhY3BpX2dibF9uZXh0X3RhYmxlX293bmVyX2lkOwotCQlhY3BpX2dibF9uZXh0X3RhYmxlX293bmVyX2lkKys7Ci0KLQkJLyogQ2hlY2sgZm9yIHdyYXBhcm91bmQgKi8KLQotCQlpZiAoYWNwaV9nYmxfbmV4dF90YWJsZV9vd25lcl9pZCA9PSBBQ1BJX0ZJUlNUX01FVEhPRF9JRCkKLQkJewotCQkJYWNwaV9nYmxfbmV4dF90YWJsZV9vd25lcl9pZCA9IEFDUElfRklSU1RfVEFCTEVfSUQ7Ci0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIlRhYmxlIG93bmVyIElEIHdyYXBhcm91bmRcbiIpKTsKLQkJfQotCQlicmVhazsKLQotCi0JY2FzZSBBQ1BJX09XTkVSX1RZUEVfTUVUSE9EOgotCi0JCW93bmVyX2lkID0gYWNwaV9nYmxfbmV4dF9tZXRob2Rfb3duZXJfaWQ7Ci0JCWFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkKys7Ci0KLQkJaWYgKGFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkID09IEFDUElfRklSU1RfVEFCTEVfSUQpCi0JCXsKLQkJCS8qIENoZWNrIGZvciB3cmFwYXJvdW5kICovCi0KLQkJCWFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkID0gQUNQSV9GSVJTVF9NRVRIT0RfSUQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkodm9pZCkgYWNwaV91dF9yZWxlYXNlX211dGV4IChBQ1BJX01UWF9DQUNIRVMpOwotCXJldHVybl9WQUxVRSAob3duZXJfaWQpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9nbG9iYWxzCkBAIC04MTYsMTI5ICs3NTgsOTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2luaXRfZ2xvYmFscyAoCi0Jdm9pZCkKK3ZvaWQgYWNwaV91dF9pbml0X2dsb2JhbHModm9pZCkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBpOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfaW5pdF9nbG9iYWxzIik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfaW5pdF9nbG9iYWxzIik7CisJLyogQ3JlYXRlIGFsbCBtZW1vcnkgY2FjaGVzICovCiAKLQotCS8qIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBjYWNoZSBsaXN0cyAqLwotCi0JQUNQSV9NRU1TRVQgKGFjcGlfZ2JsX21lbW9yeV9saXN0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkgKiBBQ1BJX05VTV9NRU1fTElTVFMpOwotCi0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfU1RBVEVdLmxpbmtfb2Zmc2V0ICAgICAgPSAodTE2KSBBQ1BJX1BUUl9ESUZGICgmKCgodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICopIE5VTEwpLT5jb21tb24ubmV4dCksIE5VTEwpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV0ubGlua19vZmZzZXQgICAgID0gKHUxNikgQUNQSV9QVFJfRElGRiAoJigoKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICopIE5VTEwpLT5jb21tb24ubmV4dCksIE5VTEwpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFRdLmxpbmtfb2Zmc2V0ID0gKHUxNikgQUNQSV9QVFJfRElGRiAoJigoKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICopIE5VTEwpLT5jb21tb24ubmV4dCksIE5VTEwpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX09QRVJBTkRdLmxpbmtfb2Zmc2V0ICAgID0gKHUxNikgQUNQSV9QVFJfRElGRiAoJigoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgTlVMTCktPmNhY2hlLm5leHQpLCBOVUxMKTsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9XQUxLXS5saW5rX29mZnNldCAgICAgICA9ICh1MTYpIEFDUElfUFRSX0RJRkYgKCYoKChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICopIE5VTEwpLT5uZXh0KSwgTlVMTCk7Ci0KLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9OU05PREVdLm9iamVjdF9zaXplICAgICA9IHNpemVvZiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1NUQVRFXS5vYmplY3Rfc2l6ZSAgICAgID0gc2l6ZW9mICh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUpOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV0ub2JqZWN0X3NpemUgICAgID0gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uKTsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9QU05PREVfRVhUXS5vYmplY3Rfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKTsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9PUEVSQU5EXS5vYmplY3Rfc2l6ZSAgICA9IHNpemVvZiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCk7Ci0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfV0FMS10ub2JqZWN0X3NpemUgICAgICAgPSBzaXplb2YgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUpOwotCi0JYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfU1RBVEVdLm1heF9jYWNoZV9kZXB0aCAgPSBBQ1BJX01BWF9TVEFURV9DQUNIRV9ERVBUSDsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9QU05PREVdLm1heF9jYWNoZV9kZXB0aCA9IEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRIOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFRdLm1heF9jYWNoZV9kZXB0aCA9IEFDUElfTUFYX0VYVFBBUlNFX0NBQ0hFX0RFUFRIOwotCWFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX09QRVJBTkRdLm1heF9jYWNoZV9kZXB0aCA9IEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSDsKLQlhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9XQUxLXS5tYXhfY2FjaGVfZGVwdGggICA9IEFDUElfTUFYX1dBTEtfQ0FDSEVfREVQVEg7Ci0KLQlBQ1BJX01FTV9UUkFDS0lORyAoYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfR0xPQkFMXS5saXN0X25hbWUgICAgPSAiR2xvYmFsIE1lbW9yeSBBbGxvY2F0aW9uIik7Ci0JQUNQSV9NRU1fVFJBQ0tJTkcgKGFjcGlfZ2JsX21lbW9yeV9saXN0c1tBQ1BJX01FTV9MSVNUX05TTk9ERV0ubGlzdF9uYW1lICAgID0gIk5hbWVzcGFjZSBOb2RlcyIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9TVEFURV0ubGlzdF9uYW1lICAgICA9ICJTdGF0ZSBPYmplY3QgQ2FjaGUiKTsKLQlBQ1BJX01FTV9UUkFDS0lORyAoYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTUVNX0xJU1RfUFNOT0RFXS5saXN0X25hbWUgICAgPSAiUGFyc2UgTm9kZSBDYWNoZSIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9QU05PREVfRVhUXS5saXN0X25hbWUgPSAiRXh0ZW5kZWQgUGFyc2UgTm9kZSBDYWNoZSIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9PUEVSQU5EXS5saXN0X25hbWUgICA9ICJPcGVyYW5kIE9iamVjdCBDYWNoZSIpOwotCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9XQUxLXS5saXN0X25hbWUgICAgICA9ICJUcmVlIFdhbGsgTm9kZSBDYWNoZSIpOworCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX2NhY2hlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm47CisJfQogCiAJLyogQUNQSSB0YWJsZSBzdHJ1Y3R1cmUgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fQUNQSV9UQUJMRV9UWVBFUzsgaSsrKQotCXsKLQkJYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dCAgICAgICAgPSBOVUxMOwotCQlhY3BpX2dibF90YWJsZV9saXN0c1tpXS5jb3VudCAgICAgICA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BQ1BJX1RBQkxFX1RZUEVTOyBpKyspIHsKKwkJYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dCA9IE5VTEw7CisJCWFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLmNvdW50ID0gMDsKIAl9CiAKIAkvKiBNdXRleCBsb2NrZWQgZmxhZ3MgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykKLQl7Ci0JCWFjcGlfZ2JsX211dGV4X2luZm9baV0ubXV0ZXggICAgICAgID0gTlVMTDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS5vd25lcl9pZCAgICAgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS51c2VfY291bnQgICAgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgeworCQlhY3BpX2dibF9tdXRleF9pbmZvW2ldLm11dGV4ID0gTlVMTDsKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS51c2VfY291bnQgPSAwOwogCX0KIAogCS8qIEdQRSBzdXBwb3J0ICovCiAKLQlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkICAgICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdICAgICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSAgICAgICAgID0gTlVMTDsKKwlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkID0gTlVMTDsKKwlhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0gPSBOVUxMOworCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSA9IE5VTEw7CiAKIAkvKiBHbG9iYWwgbm90aWZ5IGhhbmRsZXJzICovCiAKLQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIgICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyICAgICAgICAgID0gTlVMTDsKLQlhY3BpX2dibF9pbml0X2hhbmRsZXIgICAgICAgICAgICAgICA9IE5VTEw7CisJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyID0gTlVMTDsKKwlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBOVUxMOworCWFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyID0gTlVMTDsKKwlhY3BpX2dibF9pbml0X2hhbmRsZXIgPSBOVUxMOwogCiAJLyogR2xvYmFsICJ0eXBlZCIgQUNQSSB0YWJsZSBwb2ludGVycyAqLwogCi0JYWNwaV9nYmxfUlNEUCAgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX1hTRFQgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKLQlhY3BpX2dibF9GQUNTICAgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfRkFEVCAgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX0RTRFQgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKwlhY3BpX2dibF9SU0RQID0gTlVMTDsKKwlhY3BpX2dibF9YU0RUID0gTlVMTDsKKwlhY3BpX2dibF9GQUNTID0gTlVMTDsKKwlhY3BpX2dibF9GQURUID0gTlVMTDsKKwlhY3BpX2dibF9EU0RUID0gTlVMTDsKIAogCS8qIEdsb2JhbCBMb2NrIHN1cHBvcnQgKi8KIAotCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkICAgICAgID0gRkFMU0U7Ci0JYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50ICAgPSAwOwotCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZSAgICAgICAgID0gMDsKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IEZBTFNFOworCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCA9IDA7CisJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlID0gMDsKIAogCS8qIE1pc2NlbGxhbmVvdXMgdmFyaWFibGVzICovCiAKLQlhY3BpX2dibF90YWJsZV9mbGFncyAgICAgICAgICAgICAgICA9IEFDUElfUEhZU0lDQUxfUE9JTlRFUjsKLQlhY3BpX2dibF9yc2RwX29yaWdpbmFsX2xvY2F0aW9uICAgICA9IDA7Ci0JYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXAgICAgICAgICAgICAgPSBGQUxTRTsKLQlhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyAgICAgICA9IEZBTFNFOwotCWFjcGlfZ2JsX3NodXRkb3duICAgICAgICAgICAgICAgICAgID0gRkFMU0U7Ci0JYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50ICAgICAgICAgICAgPSAwOwotCWFjcGlfZ2JsX3BzX2ZpbmRfY291bnQgICAgICAgICAgICAgID0gMDsKLQlhY3BpX2dibF9hY3BpX2hhcmR3YXJlX3ByZXNlbnQgICAgICA9IFRSVUU7Ci0JYWNwaV9nYmxfbmV4dF90YWJsZV9vd25lcl9pZCAgICAgICAgPSBBQ1BJX0ZJUlNUX1RBQkxFX0lEOwotCWFjcGlfZ2JsX25leHRfbWV0aG9kX293bmVyX2lkICAgICAgID0gQUNQSV9GSVJTVF9NRVRIT0RfSUQ7Ci0JYWNwaV9nYmxfZGVidWdnZXJfY29uZmlndXJhdGlvbiAgICAgPSBERUJVR0dFUl9USFJFQURJTkc7Ci0JYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzICAgICAgICAgICAgPSBBQ1BJX0RCX0NPTlNPTEVfT1VUUFVUOworCWFjcGlfZ2JsX3RhYmxlX2ZsYWdzID0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSOworCWFjcGlfZ2JsX3JzZHBfb3JpZ2luYWxfbG9jYXRpb24gPSAwOworCWFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwID0gRkFMU0U7CisJYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHMgPSBGQUxTRTsKKwlhY3BpX2dibF9zaHV0ZG93biA9IEZBTFNFOworCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCA9IDA7CisJYWNwaV9nYmxfcHNfZmluZF9jb3VudCA9IDA7CisJYWNwaV9nYmxfYWNwaV9oYXJkd2FyZV9wcmVzZW50ID0gVFJVRTsKKwlhY3BpX2dibF9vd25lcl9pZF9tYXNrID0gMDsKKwlhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uID0gREVCVUdHRVJfVEhSRUFESU5HOworCWFjcGlfZ2JsX2RiX291dHB1dF9mbGFncyA9IEFDUElfREJfQ09OU09MRV9PVVRQVVQ7CiAKIAkvKiBIYXJkd2FyZSBvcmllbnRlZCAqLwogCi0JYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkICAgICAgICAgPSBGQUxTRTsKLQlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgICA9IFRSVUU7CisJYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkID0gRkFMU0U7CisJYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gVFJVRTsKIAogCS8qIE5hbWVzcGFjZSAqLwogCi0JYWNwaV9nYmxfcm9vdF9ub2RlICAgICAgICAgICAgICAgICAgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZSA9IE5VTEw7CiAKIAlhY3BpX2dibF9yb290X25vZGVfc3RydWN0Lm5hbWUuaW50ZWdlciA9IEFDUElfUk9PVF9OQU1FOwogCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZGVzY3JpcHRvciA9IEFDUElfREVTQ19UWVBFX05BTUVEOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QudHlwZSAgICAgID0gQUNQSV9UWVBFX0RFVklDRTsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmNoaWxkICAgICA9IE5VTEw7Ci0JYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC5wZWVyICAgICAgPSBOVUxMOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3Qub2JqZWN0ICAgID0gTlVMTDsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmZsYWdzICAgICA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7Ci0KKwlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LnR5cGUgPSBBQ1BJX1RZUEVfREVWSUNFOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuY2hpbGQgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QucGVlciA9IE5VTEw7CisJYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC5vYmplY3QgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZmxhZ3MgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLQlhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlciAgICAgICA9IEFDUElfU0laRV9NQVg7CisJYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX1NJWkVfTUFYOwogI2VuZGlmCiAKIAlyZXR1cm5fVk9JRDsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYwppbmRleCA3ZjM3MTM4Li45ZGRlODJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKQEAgLTQxLDI1ICs0MSwxOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRpbml0IikKK0FDUElfTU9EVUxFX05BTUUoInV0aW5pdCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQogc3RhdGljIHZvaWQKLWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaXN0ZXJfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKK2FjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcihjaGFyICpyZWdpc3Rlcl9uYW1lLCB1MzIgdmFsdWUsIGFjcGlfc2l6ZSBvZmZzZXQpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3V0X3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Ci0KK3N0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc2LDE4ICs2OSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaXN0ZXJfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KQorYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKGNoYXIgKnJlZ2lzdGVyX25hbWUsIHUzMiB2YWx1ZSwgYWNwaV9zaXplIG9mZnNldCkKIHsKIAotCUFDUElfUkVQT1JUX1dBUk5JTkcgKAotCQkoIkludmFsaWQgRkFEVCB2YWx1ZSAlcz0lWCBhdCBvZmZzZXQgJVggRkFEVD0lcFxuIiwKLQkJcmVnaXN0ZXJfbmFtZSwgdmFsdWUsICh1MzIpIG9mZnNldCwgYWNwaV9nYmxfRkFEVCkpOworCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIEZBRFQgdmFsdWUgJXM9JVggYXQgb2Zmc2V0ICVYIEZBRFQ9JXBcbiIsCisJCQkgICAgIHJlZ2lzdGVyX25hbWUsIHZhbHVlLCAodTMyKSBvZmZzZXQsCisJCQkgICAgIGFjcGlfZ2JsX0ZBRFQpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRhdGVfZmFkdApAQCAtMTAwLDkgKzg5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF92YWxpZGF0ZV9mYWR0ICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV91dF92YWxpZGF0ZV9mYWR0KHZvaWQpCiB7CiAKIAkvKgpAQCAtMTEwLDY0ICs5Nyw2NiBAQAogCSAqIGJ1dCBkb24ndCBhYm9ydCBvbiBhbnkgcHJvYmxlbXMsIGp1c3QgZGlzcGxheSBlcnJvcgogCSAqLwogCWlmIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiA8IDQpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiUE0xX0VWVF9MRU4iLAotCQkJCSAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sCi0JCQkJICBBQ1BJX0ZBRFRfT0ZGU0VUIChwbTFfZXZ0X2xlbikpOworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlBNMV9FVlRfTEVOIiwKKwkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbTFfZXZ0X2xlbikpOwogCX0KIAogCWlmICghYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4pIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiUE0xX0NOVF9MRU4iLCAwLAotCQkJCSAgQUNQSV9GQURUX09GRlNFVCAocG0xX2NudF9sZW4pKTsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJQTTFfQ05UX0xFTiIsIDAsCisJCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMV9jbnRfbGVuKSk7CiAJfQogCiAJaWYgKCFhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiWF9QTTFhX0VWVF9CTEsiLCAwLAotCQkJCSAgQUNQSV9GQURUX09GRlNFVCAoeHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSk7CisJCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcigiWF9QTTFhX0VWVF9CTEsiLCAwLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVCh4cG0xYV9ldnRfYmxrLgorCQkJCQkJCSAgICAgYWRkcmVzcykpOwogCX0KIAogCWlmICghYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsay5hZGRyZXNzKSB7Ci0JCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoIlhfUE0xYV9DTlRfQkxLIiwgMCwKLQkJCQkgIEFDUElfRkFEVF9PRkZTRVQgKHhwbTFhX2NudF9ibGsuYWRkcmVzcykpOworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlhfUE0xYV9DTlRfQkxLIiwgMCwKKwkJCQkJICAgIEFDUElfRkFEVF9PRkZTRVQoeHBtMWFfY250X2Jsay4KKwkJCQkJCQkgICAgIGFkZHJlc3MpKTsKIAl9CiAKIAlpZiAoIWFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiWF9QTV9UTVJfQkxLIiwgMCwKLQkJCQkgIEFDUElfRkFEVF9PRkZTRVQgKHhwbV90bXJfYmxrLmFkZHJlc3MpKTsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJYX1BNX1RNUl9CTEsiLCAwLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVCh4cG1fdG1yX2Jsay4KKwkJCQkJCQkgICAgIGFkZHJlc3MpKTsKIAl9CiAKIAlpZiAoKGFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzICYmCi0JCSFhY3BpX2dibF9GQURULT5wbTJfY250X2xlbikpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiUE0yX0NOVF9MRU4iLAotCQkJCSAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4sCi0JCQkJICBBQ1BJX0ZBRFRfT0ZGU0VUIChwbTJfY250X2xlbikpOworCSAgICAgIWFjcGlfZ2JsX0ZBRFQtPnBtMl9jbnRfbGVuKSkgeworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlBNMl9DTlRfTEVOIiwKKwkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPnBtMl9jbnRfbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbTJfY250X2xlbikpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQURULT5wbV90bV9sZW4gPCA0KSB7Ci0JCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvciAoIlBNX1RNX0xFTiIsCi0JCQkJICAodTMyKSBhY3BpX2dibF9GQURULT5wbV90bV9sZW4sCi0JCQkJICBBQ1BJX0ZBRFRfT0ZGU0VUIChwbV90bV9sZW4pKTsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJQTV9UTV9MRU4iLAorCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbV90bV9sZW4pKTsKIAl9CiAKIAkvKiBMZW5ndGggb2YgR1BFIGJsb2NrcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwogCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzICYmCi0JCShhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiAxKSkgewotCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IgKCIoeClHUEUwX0JMS19MRU4iLAotCQkJCSAgKHUzMikgYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuLAotCQkJCSAgQUNQSV9GQURUX09GRlNFVCAoZ3BlMF9ibGtfbGVuKSk7CisJICAgIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiAxKSkgeworCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIih4KUdQRTBfQkxLX0xFTiIsCisJCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4sCisJCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKGdwZTBfYmxrX2xlbikpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcyAmJgotCQkoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYgMSkpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgiKHgpR1BFMV9CTEtfTEVOIiwKLQkJCQkgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiwKLQkJCQkgIEFDUElfRkFEVF9PRkZTRVQgKGdwZTFfYmxrX2xlbikpOworCSAgICAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYgMSkpIHsKKwkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCIoeClHUEUxX0JMS19MRU4iLAorCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuLAorCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChncGUxX2Jsa19sZW4pKTsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdGVybWluYXRlCkBAIC0xODAsMTggKzE2OSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1hY3BpX3V0X3Rlcm1pbmF0ZSAoCi0Jdm9pZCkKK3N0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKm5leHRfZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKm5leHRfZ3BlX3hydXB0X2luZm87CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqbmV4dF9ncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpuZXh0X2dwZV94cnVwdF9pbmZvOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfdGVybWluYXRlIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF90ZXJtaW5hdGUiKTsKIAogCS8qIEZyZWUgZ2xvYmFsIHRhYmxlcywgZXRjLiAqLwogCS8qIEZyZWUgZ2xvYmFsIEdQRSBibG9ja3MgYW5kIHJlbGF0ZWQgaW5mbyBzdHJ1Y3R1cmVzICovCkBAIC0yMDEsMjEgKzE4NiwyMCBAQAogCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfaW5mby0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKIAkJd2hpbGUgKGdwZV9ibG9jaykgewogCQkJbmV4dF9ncGVfYmxvY2sgPSBncGVfYmxvY2stPm5leHQ7Ci0JCQlBQ1BJX01FTV9GUkVFIChncGVfYmxvY2stPmV2ZW50X2luZm8pOwotCQkJQUNQSV9NRU1fRlJFRSAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvKTsKLQkJCUFDUElfTUVNX0ZSRUUgKGdwZV9ibG9jayk7CisJCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7CisJCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7CisJCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CiAKIAkJCWdwZV9ibG9jayA9IG5leHRfZ3BlX2Jsb2NrOwogCQl9CiAJCW5leHRfZ3BlX3hydXB0X2luZm8gPSBncGVfeHJ1cHRfaW5mby0+bmV4dDsKLQkJQUNQSV9NRU1fRlJFRSAoZ3BlX3hydXB0X2luZm8pOworCQlBQ1BJX01FTV9GUkVFKGdwZV94cnVwdF9pbmZvKTsKIAkJZ3BlX3hydXB0X2luZm8gPSBuZXh0X2dwZV94cnVwdF9pbmZvOwogCX0KIAogCXJldHVybl9WT0lEOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duCkBAIC0yMjksNTAgKzIxMyw0NSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKLQl2b2lkKQordm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3N1YnN5c3RlbV9zaHV0ZG93biIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3N1YnN5c3RlbV9zaHV0ZG93biIpOwogCiAJLyogSnVzdCBleGl0IGlmIHN1YnN5c3RlbSBpcyBhbHJlYWR5IHNodXRkb3duICovCiAKIAlpZiAoYWNwaV9nYmxfc2h1dGRvd24pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkXG4iKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIAogCS8qIFN1YnN5c3RlbSBhcHBlYXJzIGFjdGl2ZSwgZ28gYWhlYWQgYW5kIHNodXQgaXQgZG93biAqLwogCiAJYWNwaV9nYmxfc2h1dGRvd24gPSBUUlVFOwotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCSJTaHV0dGluZyBkb3duIEFDUEkgU3Vic3lzdGVtLi4uXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU2h1dHRpbmcgZG93biBBQ1BJIFN1YnN5c3RlbS4uLlxuIikpOwogCiAJLyogQ2xvc2UgdGhlIGFjcGlfZXZlbnQgSGFuZGxpbmcgKi8KIAotCWFjcGlfZXZfdGVybWluYXRlICgpOworCWFjcGlfZXZfdGVybWluYXRlKCk7CiAKIAkvKiBDbG9zZSB0aGUgTmFtZXNwYWNlICovCiAKLQlhY3BpX25zX3Rlcm1pbmF0ZSAoKTsKKwlhY3BpX25zX3Rlcm1pbmF0ZSgpOwogCiAJLyogQ2xvc2UgdGhlIGdsb2JhbHMgKi8KIAotCWFjcGlfdXRfdGVybWluYXRlICgpOworCWFjcGlfdXRfdGVybWluYXRlKCk7CiAKIAkvKiBQdXJnZSB0aGUgbG9jYWwgY2FjaGVzICovCiAKLQkodm9pZCkgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyAoKTsKKwkodm9pZClhY3BpX3V0X2RlbGV0ZV9jYWNoZXMoKTsKIAogCS8qIERlYnVnIG9ubHkgLSBkaXNwbGF5IGxlZnRvdmVyIG1lbW9yeSBhbGxvY2F0aW9uLCBpZiBhbnkgKi8KIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0JYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zIChBQ1BJX1VJTlQzMl9NQVgsIE5VTEwpOworCWFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyhBQ1BJX1VJTlQzMl9NQVgsIE5VTEwpOwogI2VuZGlmCiAKIAlyZXR1cm5fVk9JRDsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYwppbmRleCAwZDUyN2M5Li42OGEwYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKQEAgLTQxLDE5ICs0MSwxNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRtYXRoIikKK0FDUElfTU9EVUxFX05BTUUoInV0bWF0aCIpCiAKIC8qCiAgKiBTdXBwb3J0IGZvciBkb3VibGUtcHJlY2lzaW9uIGludGVnZXIgZGl2aWRlLiAgVGhpcyBjb2RlIGlzIGluY2x1ZGVkIGhlcmUKICAqIGluIG9yZGVyIHRvIHN1cHBvcnQga2VybmVsIGVudmlyb25tZW50cyB3aGVyZSB0aGUgZG91YmxlLXByZWNpc2lvbiBtYXRoCiAgKiBsaWJyYXJ5IGlzIG5vdCBhdmFpbGFibGUuCiAgKi8KLQogI2lmbmRlZiBBQ1BJX1VTRV9OQVRJVkVfRElWSURFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcxLDI3ICs2OCwyMiBAQAogICogICAgICAgICAgICAgIDMyLWJpdCByZW1haW5kZXIuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKLWFjcGlfdXRfc2hvcnRfZGl2aWRlICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGRpdmlkZW5kLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvciwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpvdXRfcXVvdGllbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0X3JlbWFpbmRlcikKK2FjcGlfdXRfc2hvcnRfZGl2aWRlKGFjcGlfaW50ZWdlciBkaXZpZGVuZCwKKwkJICAgICB1MzIgZGl2aXNvciwKKwkJICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIHUzMiAqIG91dF9yZW1haW5kZXIpCiB7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgICAgICAgICAgICBkaXZpZGVuZF9vdmw7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgICAgICAgICAgICBxdW90aWVudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcjMyOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlkZW5kX292bDsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBxdW90aWVudDsKKwl1MzIgcmVtYWluZGVyMzI7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9zaG9ydF9kaXZpZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Nob3J0X2RpdmlkZSIpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX3V0X3Nob3J0X2RpdmlkZTogRGl2aWRlIGJ5IHplcm9cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfc2hvcnRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKIAl9CiAKIAlkaXZpZGVuZF9vdmwuZnVsbCA9IGRpdmlkZW5kOwpAQCAtMTAwLDkgKzkyLDkgQEAKIAkgKiBUaGUgcXVvdGllbnQgaXMgNjQgYml0cywgdGhlIHJlbWFpbmRlciBpcyBhbHdheXMgMzIgYml0cywKIAkgKiBhbmQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBzZWNvbmQgZGl2aWRlLgogCSAqLwotCUFDUElfRElWXzY0X0JZXzMyICgwLCBkaXZpZGVuZF9vdmwucGFydC5oaSwgZGl2aXNvciwKKwlBQ1BJX0RJVl82NF9CWV8zMigwLCBkaXZpZGVuZF9vdmwucGFydC5oaSwgZGl2aXNvciwKIAkJCSAgcXVvdGllbnQucGFydC5oaSwgcmVtYWluZGVyMzIpOwotCUFDUElfRElWXzY0X0JZXzMyIChyZW1haW5kZXIzMiwgZGl2aWRlbmRfb3ZsLnBhcnQubG8sIGRpdmlzb3IsCisJQUNQSV9ESVZfNjRfQllfMzIocmVtYWluZGVyMzIsIGRpdmlkZW5kX292bC5wYXJ0LmxvLCBkaXZpc29yLAogCQkJICBxdW90aWVudC5wYXJ0LmxvLCByZW1haW5kZXIzMik7CiAKIAkvKiBSZXR1cm4gb25seSB3aGF0IHdhcyByZXF1ZXN0ZWQgKi8KQEAgLTExNCwxMCArMTA2LDkgQEAKIAkJKm91dF9yZW1haW5kZXIgPSByZW1haW5kZXIzMjsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGl2aWRlCkBAIC0xMzQsMzQgKzEyNSwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZGl2aWRlICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluX2RpdmlkZW5kLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aXNvciwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpvdXRfcXVvdGllbnQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3JlbWFpbmRlcikKK2FjcGlfdXRfZGl2aWRlKGFjcGlfaW50ZWdlciBpbl9kaXZpZGVuZCwKKwkgICAgICAgYWNwaV9pbnRlZ2VyIGluX2Rpdmlzb3IsCisJICAgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgYWNwaV9pbnRlZ2VyICogb3V0X3JlbWFpbmRlcikKIHsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSAgICAgICAgICAgIGRpdmlkZW5kOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgZGl2aXNvcjsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSAgICAgICAgICAgIHF1b3RpZW50OwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgcmVtYWluZGVyOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgbm9ybWFsaXplZF9kaXZpZGVuZDsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSAgICAgICAgICAgIG5vcm1hbGl6ZWRfZGl2aXNvcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWwxOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5ICAgICAgICAgICAgcGFydGlhbDI7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgICAgICAgICAgICBwYXJ0aWFsMzsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBkaXZpZGVuZDsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBkaXZpc29yOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IHF1b3RpZW50OworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IHJlbWFpbmRlcjsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBub3JtYWxpemVkX2RpdmlkZW5kOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IG5vcm1hbGl6ZWRfZGl2aXNvcjsKKwl1MzIgcGFydGlhbDE7CisJdW5pb24gdWludDY0X292ZXJsYXkgcGFydGlhbDI7CisJdW5pb24gdWludDY0X292ZXJsYXkgcGFydGlhbDM7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9kaXZpZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2RpdmlkZSIpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGluX2Rpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX3V0X2RpdmlkZTogRGl2aWRlIGJ5IHplcm9cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKIAl9CiAKLQlkaXZpc29yLmZ1bGwgID0gaW5fZGl2aXNvcjsKKwlkaXZpc29yLmZ1bGwgPSBpbl9kaXZpc29yOwogCWRpdmlkZW5kLmZ1bGwgPSBpbl9kaXZpZGVuZDsKIAlpZiAoZGl2aXNvci5wYXJ0LmhpID09IDApIHsKIAkJLyoKQEAgLTE3NCw5ICsxNjEsOSBAQAogCQkgKiBUaGUgcXVvdGllbnQgaXMgNjQgYml0cywgdGhlIHJlbWFpbmRlciBpcyBhbHdheXMgMzIgYml0cywKIAkJICogYW5kIGlzIGdlbmVyYXRlZCBieSB0aGUgc2Vjb25kIGRpdmlkZS4KIAkJICovCi0JCUFDUElfRElWXzY0X0JZXzMyICgwLCBkaXZpZGVuZC5wYXJ0LmhpLCBkaXZpc29yLnBhcnQubG8sCisJCUFDUElfRElWXzY0X0JZXzMyKDAsIGRpdmlkZW5kLnBhcnQuaGksIGRpdmlzb3IucGFydC5sbywKIAkJCQkgIHF1b3RpZW50LnBhcnQuaGksIHBhcnRpYWwxKTsKLQkJQUNQSV9ESVZfNjRfQllfMzIgKHBhcnRpYWwxLCBkaXZpZGVuZC5wYXJ0LmxvLCBkaXZpc29yLnBhcnQubG8sCisJCUFDUElfRElWXzY0X0JZXzMyKHBhcnRpYWwxLCBkaXZpZGVuZC5wYXJ0LmxvLCBkaXZpc29yLnBhcnQubG8sCiAJCQkJICBxdW90aWVudC5wYXJ0LmxvLCByZW1haW5kZXIucGFydC5sbyk7CiAJfQogCkBAIC0xODUsMjMgKzE3MiwyMyBAQAogCQkgKiAyKSBUaGUgZ2VuZXJhbCBjYXNlIHdoZXJlIHRoZSBkaXZpc29yIGlzIGEgZnVsbCA2NCBiaXRzCiAJCSAqIGlzIG1vcmUgZGlmZmljdWx0CiAJCSAqLwotCQlxdW90aWVudC5wYXJ0LmhpICAgPSAwOworCQlxdW90aWVudC5wYXJ0LmhpID0gMDsKIAkJbm9ybWFsaXplZF9kaXZpZGVuZCA9IGRpdmlkZW5kOwogCQlub3JtYWxpemVkX2Rpdmlzb3IgPSBkaXZpc29yOwogCiAJCS8qIE5vcm1hbGl6ZSB0aGUgb3BlcmFuZHMgKHNoaWZ0IHVudGlsIHRoZSBkaXZpc29yIGlzIDwgMzIgYml0cykgKi8KIAogCQlkbyB7Ci0JCQlBQ1BJX1NISUZUX1JJR0hUXzY0IChub3JtYWxpemVkX2Rpdmlzb3IucGFydC5oaSwKLQkJCQkJIG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmxvKTsKLQkJCUFDUElfU0hJRlRfUklHSFRfNjQgKG5vcm1hbGl6ZWRfZGl2aWRlbmQucGFydC5oaSwKLQkJCQkJIG5vcm1hbGl6ZWRfZGl2aWRlbmQucGFydC5sbyk7CisJCQlBQ1BJX1NISUZUX1JJR0hUXzY0KG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpLAorCQkJCQkgICAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8pOworCQkJQUNQSV9TSElGVF9SSUdIVF82NChub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQuaGksCisJCQkJCSAgICBub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQubG8pOwogCiAJCX0gd2hpbGUgKG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpICE9IDApOwogCiAJCS8qIFBhcnRpYWwgZGl2aWRlICovCiAKLQkJQUNQSV9ESVZfNjRfQllfMzIgKG5vcm1hbGl6ZWRfZGl2aWRlbmQucGFydC5oaSwKKwkJQUNQSV9ESVZfNjRfQllfMzIobm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmhpLAogCQkJCSAgbm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmxvLAogCQkJCSAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8sCiAJCQkJICBxdW90aWVudC5wYXJ0LmxvLCBwYXJ0aWFsMSk7CkBAIC0yMTAsOCArMTk3LDkgQEAKIAkJICogVGhlIHF1b3RpZW50IGlzIGFsd2F5cyAzMiBiaXRzLCBhbmQgc2ltcGx5IHJlcXVpcmVzIGFkanVzdG1lbnQuCiAJCSAqIFRoZSA2NC1iaXQgcmVtYWluZGVyIG11c3QgYmUgZ2VuZXJhdGVkLgogCQkgKi8KLQkJcGFydGlhbDEgICAgICA9IHF1b3RpZW50LnBhcnQubG8gKiBkaXZpc29yLnBhcnQuaGk7Ci0JCXBhcnRpYWwyLmZ1bGwgPSAoYWNwaV9pbnRlZ2VyKSBxdW90aWVudC5wYXJ0LmxvICogZGl2aXNvci5wYXJ0LmxvOworCQlwYXJ0aWFsMSA9IHF1b3RpZW50LnBhcnQubG8gKiBkaXZpc29yLnBhcnQuaGk7CisJCXBhcnRpYWwyLmZ1bGwgPQorCQkgICAgKGFjcGlfaW50ZWdlcikgcXVvdGllbnQucGFydC5sbyAqIGRpdmlzb3IucGFydC5sbzsKIAkJcGFydGlhbDMuZnVsbCA9IChhY3BpX2ludGVnZXIpIHBhcnRpYWwyLnBhcnQuaGkgKyBwYXJ0aWFsMTsKIAogCQlyZW1haW5kZXIucGFydC5oaSA9IHBhcnRpYWwzLnBhcnQubG87CkBAIC0yMjQsMTYgKzIxMiwxNSBAQAogCQkJCQkJcXVvdGllbnQucGFydC5sby0tOwogCQkJCQkJcmVtYWluZGVyLmZ1bGwgLT0gZGl2aXNvci5mdWxsOwogCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgeworCQkJCX0gZWxzZSB7CiAJCQkJCXF1b3RpZW50LnBhcnQubG8tLTsKIAkJCQkJcmVtYWluZGVyLmZ1bGwgLT0gZGl2aXNvci5mdWxsOwogCQkJCX0KIAkJCX0KIAotCQkJcmVtYWluZGVyLmZ1bGwgICAgPSByZW1haW5kZXIuZnVsbCAtIGRpdmlkZW5kLmZ1bGw7Ci0JCQlyZW1haW5kZXIucGFydC5oaSA9ICh1MzIpIC0oKHMzMikgcmVtYWluZGVyLnBhcnQuaGkpOwotCQkJcmVtYWluZGVyLnBhcnQubG8gPSAodTMyKSAtKChzMzIpIHJlbWFpbmRlci5wYXJ0LmxvKTsKKwkJCXJlbWFpbmRlci5mdWxsID0gcmVtYWluZGVyLmZ1bGwgLSBkaXZpZGVuZC5mdWxsOworCQkJcmVtYWluZGVyLnBhcnQuaGkgPSAodTMyKSAtICgoczMyKSByZW1haW5kZXIucGFydC5oaSk7CisJCQlyZW1haW5kZXIucGFydC5sbyA9ICh1MzIpIC0gKChzMzIpIHJlbWFpbmRlci5wYXJ0LmxvKTsKIAogCQkJaWYgKHJlbWFpbmRlci5wYXJ0LmxvKSB7CiAJCQkJcmVtYWluZGVyLnBhcnQuaGktLTsKQEAgLTI1MCwxMSArMjM3LDEwIEBACiAJCSpvdXRfcmVtYWluZGVyID0gcmVtYWluZGVyLmZ1bGw7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAogI2Vsc2UKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9zaG9ydF9kaXZpZGUsIGFjcGlfdXRfZGl2aWRlCkBAIC0yNjksMjMgKzI1NSwxOSBAQAogICogICAgICAgICAgICAgICAgIHBlcmZvcm0gdGhlIGRpdmlkZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwotYWNwaV91dF9zaG9ydF9kaXZpZGUgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aWRlbmQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9xdW90aWVudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfcmVtYWluZGVyKQorYWNwaV91dF9zaG9ydF9kaXZpZGUoYWNwaV9pbnRlZ2VyIGluX2RpdmlkZW5kLAorCQkgICAgIHUzMiBkaXZpc29yLAorCQkgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgdTMyICogb3V0X3JlbWFpbmRlcikKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9zaG9ydF9kaXZpZGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Nob3J0X2RpdmlkZSIpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX3V0X3Nob3J0X2RpdmlkZTogRGl2aWRlIGJ5IHplcm9cbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfc2hvcnRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKIAl9CiAKIAkvKiBSZXR1cm4gb25seSB3aGF0IHdhcyByZXF1ZXN0ZWQgKi8KQEAgLTI5NywyNyArMjc5LDIzIEBACiAJCSpvdXRfcmVtYWluZGVyID0gKHUzMikgaW5fZGl2aWRlbmQgJSBkaXZpc29yOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2RpdmlkZSAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbl9kaXZpZGVuZCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluX2Rpdmlzb3IsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3F1b3RpZW50LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9yZW1haW5kZXIpCithY3BpX3V0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCisJICAgICAgIGFjcGlfaW50ZWdlciBpbl9kaXZpc29yLAorCSAgICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIGFjcGlfaW50ZWdlciAqIG91dF9yZW1haW5kZXIpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2RpdmlkZSIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZGl2aWRlIik7CiAKIAkvKiBBbHdheXMgY2hlY2sgZm9yIGEgemVybyBkaXZpc29yICovCiAKIAlpZiAoaW5fZGl2aXNvciA9PSAwKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImFjcGlfdXRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9ESVZJREVfQllfWkVSTyk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV91dF9kaXZpZGU6IERpdmlkZSBieSB6ZXJvXG4iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwogCX0KIAotCiAJLyogUmV0dXJuIG9ubHkgd2hhdCB3YXMgcmVxdWVzdGVkICovCiAKIAlpZiAob3V0X3F1b3RpZW50KSB7CkBAIC0zMjcsOSArMzA1LDcgQEAKIAkJKm91dF9yZW1haW5kZXIgPSBpbl9kaXZpZGVuZCAlIGluX2Rpdmlzb3I7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAogI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKaW5kZXggZjZkZTRlZC4uMGM1YWJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCkBAIC00MSwyNCArNDEsMTMwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRtaXNjIikKK0FDUElfTU9EVUxFX05BTUUoInV0bWlzYyIpCiAKLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQKKyAqCisgKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgICAgIC0gV2hlcmUgdGhlIG5ldyBvd25lciBJRCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQWxsb2NhdGUgYSB0YWJsZSBvciBtZXRob2Qgb3duZXIgSUQuIFRoZSBvd25lciBJRCBpcyB1c2VkIHRvCisgKiAgICAgICAgICAgICAgdHJhY2sgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSB0YWJsZSBvciBtZXRob2QsIHRvIGJlIGRlbGV0ZWQKKyAqICAgICAgICAgICAgICB3aGVuIHRoZSBtZXRob2QgZXhpdHMgb3IgdGhlIHRhYmxlIGlzIHVubG9hZGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCkKK3sKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9hbGxvY2F0ZV9vd25lcl9pZCIpOwogCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZGVsZXRlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKKwkvKiBHdWFyZCBhZ2FpbnN0IG11bHRpcGxlIGFsbG9jYXRpb25zIG9mIElEIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCiAKKwlpZiAoKm93bmVyX2lkKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiT3duZXIgSUQgWyUyLjJYXSBhbHJlYWR5IGV4aXN0c1xuIiwKKwkJCQkgICAqb3duZXJfaWQpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FMUkVBRFlfRVhJU1RTKTsKKwl9CisKKwkvKiBNdXRleCBmb3IgdGhlIGdsb2JhbCBJRCBtYXNrICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRmluZCBhIGZyZWUgb3duZXIgSUQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICghKGFjcGlfZ2JsX293bmVyX2lkX21hc2sgJiAoMSA8PCBpKSkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVkFMVUVTLAorCQkJCQkgICJDdXJyZW50IG93bmVyX2lkIG1hc2s6ICU4LjhYIE5ldyBJRDogJTIuMlhcbiIsCisJCQkJCSAgYWNwaV9nYmxfb3duZXJfaWRfbWFzaywKKwkJCQkJICAodW5zaWduZWQgaW50KShpICsgMSkpKTsKKworCQkJYWNwaV9nYmxfb3duZXJfaWRfbWFzayB8PSAoMSA8PCBpKTsKKwkJCSpvd25lcl9pZCA9IChhY3BpX293bmVyX2lkKSAoaSArIDEpOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgaGVyZSwgYWxsIG93bmVyX2lkcyBoYXZlIGJlZW4gYWxsb2NhdGVkLiBUaGlzIHByb2JhYmx5IHNob3VsZAorCSAqIG5vdCBoYXBwZW4gc2luY2UgdGhlIElEcyBhcmUgcmV1c2VkIGFmdGVyIGRlYWxsb2NhdGlvbi4gVGhlIElEcyBhcmUKKwkgKiBhbGxvY2F0ZWQgdXBvbiB0YWJsZSBsb2FkIChvbmUgcGVyIHRhYmxlKSBhbmQgbWV0aG9kIGV4ZWN1dGlvbiwgYW5kCisJICogdGhleSBhcmUgcmVsZWFzZWQgd2hlbiBhIHRhYmxlIGlzIHVubG9hZGVkIG9yIGEgbWV0aG9kIGNvbXBsZXRlcworCSAqIGV4ZWN1dGlvbi4KKwkgKi8KKwkqb3duZXJfaWQgPSAwOworCXN0YXR1cyA9IEFFX09XTkVSX0lEX0xJTUlUOworCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGFsbG9jYXRlIG5ldyBvd25lcl9pZCAoMzIgbWF4KSwgQUVfT1dORVJfSURfTElNSVRcbiIpKTsKKworICAgICAgZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZWxlYXNlX293bmVyX2lkCisgKgorICogUEFSQU1FVEVSUzogIG93bmVyX2lkX3B0ciAgICAgICAgLSBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgb3duZXJfaUQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4gTm8gZXJyb3IgaXMgcmV0dXJuZWQgYmVjYXVzZSB3ZSBhcmUgZWl0aGVyIGV4aXRpbmcgYQorICogICAgICAgICAgICAgIGNvbnRyb2wgbWV0aG9kIG9yIHVubG9hZGluZyBhIHRhYmxlLiBFaXRoZXIgd2F5LCB3ZSB3b3VsZAorICogICAgICAgICAgICAgIGlnbm9yZSBhbnkgZXJyb3IgYW55d2F5LgorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIElELiAgVmFsaWQgSURzIGFyZSAxIC0gMzIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWRfcHRyKQoreworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQgPSAqb3duZXJfaWRfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9yZWxlYXNlX293bmVyX2lkIiwgb3duZXJfaWQpOworCisJLyogQWx3YXlzIGNsZWFyIHRoZSBpbnB1dCBvd25lcl9pZCAoemVybyBpcyBhbiBpbnZhbGlkIElEKSAqLworCisJKm93bmVyX2lkX3B0ciA9IDA7CisKKwkvKiBaZXJvIGlzIG5vdCBhIHZhbGlkIG93bmVyX2lEICovCisKKwlpZiAoKG93bmVyX2lkID09IDApIHx8IChvd25lcl9pZCA+IDMyKSkgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgb3duZXJfaWQ6ICUyLjJYXG4iLCBvd25lcl9pZCkpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBNdXRleCBmb3IgdGhlIGdsb2JhbCBJRCBtYXNrICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogTm9ybWFsaXplIHRoZSBJRCB0byB6ZXJvICovCisKKwlvd25lcl9pZC0tOworCisJLyogRnJlZSB0aGUgb3duZXIgSUQgb25seSBpZiBpdCBpcyB2YWxpZCAqLworCisJaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2sgJiAoMSA8PCBvd25lcl9pZCkpIHsKKwkJYWNwaV9nYmxfb3duZXJfaWRfbWFzayBePSAoMSA8PCBvd25lcl9pZCk7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7CisJcmV0dXJuX1ZPSUQ7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjYsNyArMTcyLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgc3JjX3N0cmluZyAgICAgIC0gVGhlIHNvdXJjZSBzdHJpbmcgdG8gY29udmVydAogICoKLSAqIFJFVFVSTjogICAgICBDb252ZXJ0ZWQgc3JjX3N0cmluZyAoc2FtZSBhcyBpbnB1dCBwb2ludGVyKQorICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBzdHJpbmcgdG8gdXBwZXJjYXNlCiAgKgpAQCAtNzQsMjYgKzE4MCwyNSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNoYXIgKgotYWNwaV91dF9zdHJ1cHIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcpCit2b2lkIGFjcGlfdXRfc3RydXByKGNoYXIgKnNyY19zdHJpbmcpCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nOworCWNoYXIgKnN0cmluZzsKIAorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KKwlpZiAoIXNyY19zdHJpbmcpIHsKKwkJcmV0dXJuOworCX0KIAogCS8qIFdhbGsgZW50aXJlIHN0cmluZywgdXBwZXJjYXNpbmcgdGhlIGxldHRlcnMgKi8KIAogCWZvciAoc3RyaW5nID0gc3JjX3N0cmluZzsgKnN0cmluZzsgc3RyaW5nKyspIHsKLQkJKnN0cmluZyA9IChjaGFyKSBBQ1BJX1RPVVBQRVIgKCpzdHJpbmcpOworCQkqc3RyaW5nID0gKGNoYXIpQUNQSV9UT1VQUEVSKCpzdHJpbmcpOwogCX0KIAotCXJldHVybiAoc3JjX3N0cmluZyk7CisJcmV0dXJuOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHJpbnRfc3RyaW5nCkBAIC0xMDgsODUgKzIxMyw3NyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfcHJpbnRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQordm9pZCBhY3BpX3V0X3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIHU4IG1heF9sZW5ndGgpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCisJdTMyIGk7CiAKIAlpZiAoIXN0cmluZykgewotCQlhY3BpX29zX3ByaW50ZiAoIjxcIk5VTEwgU1RSSU5HIFBUUlwiPiIpOworCQlhY3BpX29zX3ByaW50ZigiPFwiTlVMTCBTVFJJTkcgUFRSXCI+Iik7CiAJCXJldHVybjsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIlwiIik7CisJYWNwaV9vc19wcmludGYoIlwiIik7CiAJZm9yIChpID0gMDsgc3RyaW5nW2ldICYmIChpIDwgbWF4X2xlbmd0aCk7IGkrKykgewogCQkvKiBFc2NhcGUgc2VxdWVuY2VzICovCiAKIAkJc3dpdGNoIChzdHJpbmdbaV0pIHsKIAkJY2FzZSAweDA3OgotCQkJYWNwaV9vc19wcmludGYgKCJcXGEiKTsgICAgICAvKiBCRUxMICovCisJCQlhY3BpX29zX3ByaW50ZigiXFxhIik7CS8qIEJFTEwgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgMHgwODoKLQkJCWFjcGlfb3NfcHJpbnRmICgiXFxiIik7ICAgICAvKiBCQUNLU1BBQ0UgKi8KKwkJCWFjcGlfb3NfcHJpbnRmKCJcXGIiKTsJLyogQkFDS1NQQUNFICovCiAJCQlicmVhazsKIAogCQljYXNlIDB4MEM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxcZiIpOyAgICAgLyogRk9STUZFRUQgKi8KKwkJCWFjcGlfb3NfcHJpbnRmKCJcXGYiKTsJLyogRk9STUZFRUQgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgMHgwQToKLQkJCWFjcGlfb3NfcHJpbnRmICgiXFxuIik7ICAgICAvKiBMSU5FRkVFRCAqLworCQkJYWNwaV9vc19wcmludGYoIlxcbiIpOwkvKiBMSU5FRkVFRCAqLwogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDBEOgotCQkJYWNwaV9vc19wcmludGYgKCJcXHIiKTsgICAgIC8qIENBUlJJQUdFIFJFVFVSTiovCisJCQlhY3BpX29zX3ByaW50ZigiXFxyIik7CS8qIENBUlJJQUdFIFJFVFVSTiAqLwogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDA5OgotCQkJYWNwaV9vc19wcmludGYgKCJcXHQiKTsgICAgIC8qIEhPUklaT05UQUwgVEFCICovCisJCQlhY3BpX29zX3ByaW50ZigiXFx0Iik7CS8qIEhPUklaT05UQUwgVEFCICovCiAJCQlicmVhazsKIAogCQljYXNlIDB4MEI6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIlxcdiIpOyAgICAgLyogVkVSVElDQUwgVEFCICovCisJCQlhY3BpX29zX3ByaW50ZigiXFx2Iik7CS8qIFZFUlRJQ0FMIFRBQiAqLwogCQkJYnJlYWs7CiAKLQkJY2FzZSAnXCcnOiAgICAgICAgICAgICAgICAgICAgICAvKiBTaW5nbGUgUXVvdGUgKi8KLQkJY2FzZSAnXCInOiAgICAgICAgICAgICAgICAgICAgICAvKiBEb3VibGUgUXVvdGUgKi8KLQkJY2FzZSAnXFwnOiAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrc2xhc2ggKi8KLQkJCWFjcGlfb3NfcHJpbnRmICgiXFwlYyIsIChpbnQpIHN0cmluZ1tpXSk7CisJCWNhc2UgJ1wnJzoJLyogU2luZ2xlIFF1b3RlICovCisJCWNhc2UgJ1wiJzoJLyogRG91YmxlIFF1b3RlICovCisJCWNhc2UgJ1xcJzoJLyogQmFja3NsYXNoICovCisJCQlhY3BpX29zX3ByaW50ZigiXFwlYyIsIChpbnQpc3RyaW5nW2ldKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKIAkJCS8qIENoZWNrIGZvciBwcmludGFibGUgY2hhcmFjdGVyIG9yIGhleCBlc2NhcGUgKi8KIAotCQkJaWYgKEFDUElfSVNfUFJJTlQgKHN0cmluZ1tpXSkpCi0JCQl7CisJCQlpZiAoQUNQSV9JU19QUklOVChzdHJpbmdbaV0pKSB7CiAJCQkJLyogVGhpcyBpcyBhIG5vcm1hbCBjaGFyYWN0ZXIgKi8KIAotCQkJCWFjcGlfb3NfcHJpbnRmICgiJWMiLCAoaW50KSBzdHJpbmdbaV0pOwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIChpbnQpc3RyaW5nW2ldKTsKKwkJCX0gZWxzZSB7CiAJCQkJLyogQWxsIG90aGVycyB3aWxsIGJlIEhleCBlc2NhcGVzICovCiAKLQkJCQlhY3BpX29zX3ByaW50ZiAoIlxceCUyLjJYIiwgKHMzMikgc3RyaW5nW2ldKTsKKwkJCQlhY3BpX29zX3ByaW50ZigiXFx4JTIuMlgiLCAoczMyKSBzdHJpbmdbaV0pOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JYWNwaV9vc19wcmludGYgKCJcIiIpOworCWFjcGlfb3NfcHJpbnRmKCJcIiIpOwogCiAJaWYgKGkgPT0gbWF4X2xlbmd0aCAmJiBzdHJpbmdbaV0pIHsKLQkJYWNwaV9vc19wcmludGYgKCIuLi4iKTsKKwkJYWNwaV9vc19wcmludGYoIi4uLiIpOwogCX0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcApAQCAtMTk5LDIyICsyOTYsMTggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKLWFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQordTMyIGFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwKHUzMiB2YWx1ZSkKIHsKIAl1bmlvbiB7Ci0JCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKLQkJdTggICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzRdOworCQl1MzIgdmFsdWU7CisJCXU4IGJ5dGVzWzRdOwogCX0gb3V0OwogCXVuaW9uIHsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwotCQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNbNF07CisJCXUzMiB2YWx1ZTsKKwkJdTggYnl0ZXNbNF07CiAJfSBpbjsKIAotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQorCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWluLnZhbHVlID0gdmFsdWU7CiAKQEAgLTIyNiw3ICszMTksNiBAQAogCXJldHVybiAob3V0LnZhbHVlKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoCkBAIC0yNDIsMjQgKzMzNCwyMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGggKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24pCit2b2lkIGFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgodTggcmV2aXNpb24pCiB7CiAKIAlpZiAocmV2aXNpb24gPD0gMSkgewogCQlhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aCA9IDMyOwogCQlhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCA9IDg7CiAJCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoID0gNjQ7CiAJCWFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoID0gMTY7CiAJCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDg7CiAJfQogfQogCi0KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNzcsMTcgKzM2NSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpvYmpfaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgpCithY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSh1OCB0eXBlLAorCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9oYW5kbGUsCisJCQkgICAgICBjaGFyICpwYXRoKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgYnVmZmVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogT25seSBwcmludCB0aGUgcGF0aCBpZiB0aGUgYXBwcm9wcmlhdGUgZGVidWcgbGV2ZWwgaXMgZW5hYmxlZCAqLwogCkBAIC0yOTgsOCArMzgzLDggQEAKIAkvKiBHZXQgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKi8KIAogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKLQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAob2JqX2hhbmRsZSwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKG9ial9oYW5kbGUsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm47CiAJfQogCkBAIC0zMDcsMzEgKzM5MiwzMCBAQAogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCQlhY3BpX29zX3ByaW50ZiAoIkV4ZWN1dGluZyAgIik7CisJCWFjcGlfb3NfcHJpbnRmKCJFeGVjdXRpbmcgICIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmICgiSW5pdGlhbGl6aW5nICIpOworCQlhY3BpX29zX3ByaW50ZigiSW5pdGlhbGl6aW5nICIpOwogCQlicmVhazsKIAl9CiAKIAkvKiBQcmludCB0aGUgb2JqZWN0IHR5cGUgYW5kIHBhdGhuYW1lICovCiAKLQlhY3BpX29zX3ByaW50ZiAoIiUtMTJzICVzIiwKLQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwgKGNoYXIgKikgYnVmZmVyLnBvaW50ZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlLTEycyAlcyIsCisJCSAgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOwogCiAJLyogRXh0cmEgcGF0aCBpcyB1c2VkIHRvIGFwcGVuZCBuYW1lcyBsaWtlIF9TVEEsIF9JTkksIGV0Yy4gKi8KIAogCWlmIChwYXRoKSB7Ci0JCWFjcGlfb3NfcHJpbnRmICgiLiVzIiwgcGF0aCk7CisJCWFjcGlfb3NfcHJpbnRmKCIuJXMiLCBwYXRoKTsKIAl9Ci0JYWNwaV9vc19wcmludGYgKCJcbiIpOworCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCi0JQUNQSV9NRU1fRlJFRSAoYnVmZmVyLnBvaW50ZXIpOworCUFDUElfTUVNX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOwogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX25hbWUKQEAgLTM0NywyNSArNDMxLDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh1MzIgbmFtZSkKIHsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX3B0ciA9IChjaGFyICopICZuYW1lOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyOwotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKKwljaGFyICpuYW1lX3B0ciA9IChjaGFyICopJm5hbWU7CisJY2hhciBjaGFyYWN0ZXI7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKIAkJY2hhcmFjdGVyID0gKm5hbWVfcHRyOwogCQluYW1lX3B0cisrOwogCiAJCWlmICghKChjaGFyYWN0ZXIgPT0gJ18nKSB8fAotCQkJICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAotCQkJICAoY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknKSkpIHsKKwkJICAgICAgKGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJykgfHwKKwkJICAgICAgKGNoYXJhY3RlciA+PSAnMCcgJiYgY2hhcmFjdGVyIDw9ICc5JykpKSB7CiAJCQlyZXR1cm4gKEZBTFNFKTsKIAkJfQogCX0KQEAgLTM3Myw3ICs0NTMsNiBAQAogCXJldHVybiAoVFJVRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlcgpAQCAtMzg2LDE5ICs0NjUsMTYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAotYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIpCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcmFjdGVyKGNoYXIgY2hhcmFjdGVyKQogewogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlyZXR1cm4gKCh1OCkgICAoKGNoYXJhY3RlciA9PSAnXycpIHx8Ci0JCQkgICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAotCQkJICAgKGNoYXJhY3RlciA+PSAnMCcgJiYgY2hhcmFjdGVyIDw9ICc5JykpKTsKKwlyZXR1cm4gKCh1OCkgKChjaGFyYWN0ZXIgPT0gJ18nKSB8fAorCQkgICAgICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAorCQkgICAgICAoY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknKSkpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0CkBAIC00MTUsMTggKzQ5MSwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfc3RydG91bDY0ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnJldF9pbnRlZ2VyKQorYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLCB1MzIgYmFzZSwgYWNwaV9pbnRlZ2VyICogcmV0X2ludGVnZXIpCiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2RpZ2l0ID0gMDsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBxdW90aWVudDsKKwl1MzIgdGhpc19kaWdpdCA9IDA7CisJYWNwaV9pbnRlZ2VyIHJldHVybl92YWx1ZSA9IDA7CisJYWNwaV9pbnRlZ2VyIHF1b3RpZW50OwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfc3Ryb3VsNjQiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3N0cm91bDY0Iik7CiAKIAlpZiAoKCFzdHJpbmcpIHx8ICEoKnN0cmluZykpIHsKIAkJZ290byBlcnJvcl9leGl0OwpAQCAtNDQwLDEyICs1MTEsMTIgQEAKIAogCWRlZmF1bHQ6CiAJCS8qIEludmFsaWQgQmFzZSAqLwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogU2tpcCBvdmVyIGFueSB3aGl0ZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCiAKLQl3aGlsZSAoQUNQSV9JU19TUEFDRSAoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSB7CisJd2hpbGUgKEFDUElfSVNfU1BBQ0UoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSB7CiAJCXN0cmluZysrOwogCX0KIApAQCAtNDU0LDEyICs1MjUsMTAgQEAKIAkgKiBkZXRlcm1pbmUgaWYgaXQgaXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbDoKIAkgKi8KIAlpZiAoYmFzZSA9PSAwKSB7Ci0JCWlmICgoKnN0cmluZyA9PSAnMCcpICYmCi0JCQkoQUNQSV9UT0xPV0VSICgqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7CisJCWlmICgoKnN0cmluZyA9PSAnMCcpICYmIChBQ1BJX1RPTE9XRVIoKihzdHJpbmcgKyAxKSkgPT0gJ3gnKSkgewogCQkJYmFzZSA9IDE2OwogCQkJc3RyaW5nICs9IDI7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQliYXNlID0gMTA7CiAJCX0KIAl9CkBAIC00NjksOCArNTM4LDcgQEAKIAkgKiAwIG9yIDB4LCBpZiB0aGV5IGFyZSBwcmVzZW50LgogCSAqLwogCWlmICgoYmFzZSA9PSAxNikgJiYKLQkJKCpzdHJpbmcgPT0gJzAnKSAmJgotCQkoQUNQSV9UT0xPV0VSICgqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7CisJICAgICgqc3RyaW5nID09ICcwJykgJiYgKEFDUElfVE9MT1dFUigqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7CiAJCXN0cmluZyArPSAyOwogCX0KIApAQCAtNDgzLDI1ICs1NTEsMjMgQEAKIAkvKiBNYWluIGxvb3A6IGNvbnZlcnQgdGhlIHN0cmluZyB0byBhIDY0LWJpdCBpbnRlZ2VyICovCiAKIAl3aGlsZSAoKnN0cmluZykgewotCQlpZiAoQUNQSV9JU19ESUdJVCAoKnN0cmluZykpIHsKKwkJaWYgKEFDUElfSVNfRElHSVQoKnN0cmluZykpIHsKIAkJCS8qIENvbnZlcnQgQVNDSUkgMC05IHRvIERlY2ltYWwgdmFsdWUgKi8KIAotCQkJdGhpc19kaWdpdCA9ICgodTgpICpzdHJpbmcpIC0gJzAnOwotCQl9Ci0JCWVsc2UgeworCQkJdGhpc19kaWdpdCA9ICgodTgpICogc3RyaW5nKSAtICcwJzsKKwkJfSBlbHNlIHsKIAkJCWlmIChiYXNlID09IDEwKSB7CiAJCQkJLyogRGlnaXQgaXMgb3V0IG9mIHJhbmdlICovCiAKIAkJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCQl9CiAKLQkJCXRoaXNfZGlnaXQgPSAodTgpIEFDUElfVE9VUFBFUiAoKnN0cmluZyk7Ci0JCQlpZiAoQUNQSV9JU19YRElHSVQgKChjaGFyKSB0aGlzX2RpZ2l0KSkgeworCQkJdGhpc19kaWdpdCA9ICh1OCkgQUNQSV9UT1VQUEVSKCpzdHJpbmcpOworCQkJaWYgKEFDUElfSVNfWERJR0lUKChjaGFyKXRoaXNfZGlnaXQpKSB7CiAJCQkJLyogQ29udmVydCBBU0NJSSBIZXggY2hhciB0byB2YWx1ZSAqLwogCiAJCQkJdGhpc19kaWdpdCA9IHRoaXNfZGlnaXQgLSAnQScgKyAxMDsKLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIFdlIGFsbG93IG5vbi1oZXggY2hhcnMsIGp1c3Qgc3RvcCBub3csIHNhbWUgYXMgZW5kLW9mLXN0cmluZy4KIAkJCQkgKiBTZWUgQUNQSSBzcGVjLCBzdHJpbmctdG8taW50ZWdlciBjb252ZXJzaW9uLgpAQCAtNTEyLDggKzU3OCwxMCBAQAogCiAJCS8qIERpdmlkZSB0aGUgZGlnaXQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiAqLwogCi0JCSh2b2lkKSBhY3BpX3V0X3Nob3J0X2RpdmlkZSAoKEFDUElfSU5URUdFUl9NQVggLSAoYWNwaV9pbnRlZ2VyKSB0aGlzX2RpZ2l0KSwKLQkJCQkgYmFzZSwgJnF1b3RpZW50LCBOVUxMKTsKKwkJKHZvaWQpCisJCSAgICBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoQUNQSV9JTlRFR0VSX01BWCAtCisJCQkJCSAgKGFjcGlfaW50ZWdlcikgdGhpc19kaWdpdCksIGJhc2UsCisJCQkJCSAmcXVvdGllbnQsIE5VTEwpOwogCQlpZiAocmV0dXJuX3ZhbHVlID4gcXVvdGllbnQpIHsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJfQpAQCAtNTI2LDMzNSArNTk0LDE4IEBACiAJLyogQWxsIGRvbmUsIG5vcm1hbCBleGl0ICovCiAKIAkqcmV0X2ludGVnZXIgPSByZXR1cm5fdmFsdWU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAotCi1lcnJvcl9leGl0OgorICAgICAgZXJyb3JfZXhpdDoKIAkvKiBCYXNlIHdhcyBzZXQvdmFsaWRhdGVkIGFib3ZlICovCiAKIAlpZiAoYmFzZSA9PSAxMCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UKTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0hFWF9DT05TVEFOVCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREVDSU1BTF9DT05TVEFOVCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9IRVhfQ09OU1RBTlQpOwogCX0KIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X211dGV4X2luaXRpYWxpemUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZS4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSB0aGUgc3lzdGVtIG11dGV4IG9iamVjdHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoCi0Jdm9pZCkKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9tdXRleF9pbml0aWFsaXplIik7Ci0KLQotCS8qCi0JICogQ3JlYXRlIGVhY2ggb2YgdGhlIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0cwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV9tdXRleCAoaSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLQkJfQotCX0KLQotCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX2xvY2sgKCZhY3BpX2dibF9ncGVfbG9jayk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfbXV0ZXhfdGVybWluYXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUuCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUuCi0gKgotICogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgb2YgdGhlIHN5c3RlbSBtdXRleCBvYmplY3RzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfdXRfbXV0ZXhfdGVybWluYXRlICgKLQl2b2lkKQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X211dGV4X3Rlcm1pbmF0ZSIpOwotCi0KLQkvKgotCSAqIERlbGV0ZSBlYWNoIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9NVVRFWDsgaSsrKSB7Ci0JCSh2b2lkKSBhY3BpX3V0X2RlbGV0ZV9tdXRleCAoaSk7Ci0JfQotCi0JYWNwaV9vc19kZWxldGVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2spOwotCXJldHVybl9WT0lEOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX211dGV4Ci0gKgotICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBjcmVhdGVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBtdXRleCBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCkKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMiAoInV0X2NyZWF0ZV9tdXRleCIsIG11dGV4X2lkKTsKLQotCi0JaWYgKG11dGV4X2lkID4gTUFYX01VVEVYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCkgewotCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKDEsIDEsCi0JCQkJICAmYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpOwotCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS51c2VfY291bnQgPSAwOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgZGVsZXRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGEgbXV0ZXggb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9kZWxldGVfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpCi17Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgidXRfZGVsZXRlX211dGV4IiwgbXV0ZXhfaWQpOwotCi0KLQlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUgKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4KTsKLQotCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4ID0gTlVMTDsKLQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFjcXVpcmUgYSBtdXRleCBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfYWNxdWlyZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCkKLXsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyZWFkX2lkOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ1dF9hY3F1aXJlX211dGV4Iik7Ci0KLQotCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkICgpOwotCi0jaWZkZWYgQUNQSV9NVVRFWF9ERUJVRwotCXsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCQkvKgotCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCi0JCSAqCi0JCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCi0JCSAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZAotCQkgKiB0aGUgbXV0ZXggb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgotCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KLQkJICovCi0JCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKLQkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7Ci0JCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiTXV0ZXggWyVzXSBhbHJlYWR5IGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIFslWF1cbiIsCi0JCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksIHRoaXNfdGhyZWFkX2lkKSk7Ci0KLQkJCQkJcmV0dXJuIChBRV9BTFJFQURZX0FDUVVJUkVEKTsKLQkJCQl9Ci0KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKLQkJCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKGkpLAotCQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQotCQkJCXJldHVybiAoQUVfQUNRVUlSRV9ERUFETE9DSyk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLAotCQkiVGhyZWFkICVYIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBNdXRleCBbJXNdXG4iLAotCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwKLQkJCSAgIDEsIEFDUElfV0FJVF9GT1JFVkVSKTsKLQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX01VVEVYLCAiVGhyZWFkICVYIGFjcXVpcmVkIE11dGV4IFslc11cbiIsCi0JCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7Ci0KLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50Kys7Ci0JCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm93bmVyX2lkID0gdGhpc190aHJlYWRfaWQ7Ci0JfQotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJUaHJlYWQgJVggY291bGQgbm90IGFjcXVpcmUgTXV0ZXggWyVzXSAlc1xuIiwKLQkJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgbXV0ZXhfaUQgICAgICAgIC0gSUQgb2YgdGhlIG11dGV4IHRvIGJlIHJlbGVhc2VkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgbXV0ZXggb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3JlbGVhc2VfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpCi17Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHJlYWRfaWQ7Ci0KLQotCUFDUElfRlVOQ1RJT05fTkFNRSAoInV0X3JlbGVhc2VfbXV0ZXgiKTsKLQotCi0JdGhpc190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQgKCk7Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsCi0JCSJUaHJlYWQgJVggcmVsZWFzaW5nIE11dGV4IFslc11cbiIsIHRoaXNfdGhyZWFkX2lkLAotCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQotCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogTXV0ZXggbXVzdCBiZSBhY3F1aXJlZCBpbiBvcmRlciB0byByZWxlYXNlIGl0IQotCSAqLwotCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9PSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJNdXRleCBbJXNdIGlzIG5vdCBhY3F1aXJlZCwgY2Fubm90IHJlbGVhc2VcbiIsCi0JCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQotCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7Ci0JfQotCi0JLyoKLQkgKiBEZWFkbG9jayBwcmV2ZW50aW9uLiAgQ2hlY2sgaWYgdGhpcyB0aHJlYWQgb3ducyBhbnkgbXV0ZXhlcyBvZiB2YWx1ZQotCSAqIGdyZWF0ZXIgdGhhbiB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZCB0aGUgbXV0ZXgKLQkgKiBvcmRlcmluZyBydWxlLiAgVGhpcyBpbmRpY2F0ZXMgYSBjb2RpbmcgZXJyb3Igc29tZXdoZXJlIGluCi0JICogdGhlIEFDUEkgc3Vic3lzdGVtIGNvZGUuCi0JICovCi0JZm9yIChpID0gbXV0ZXhfaWQ7IGkgPCBNQVhfTVVURVg7IGkrKykgewotCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS5vd25lcl9pZCA9PSB0aGlzX3RocmVhZF9pZCkgewotCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwKLQkJCQlhY3BpX3V0X2dldF9tdXRleF9uYW1lIChpKSwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7Ci0KLQkJCXJldHVybiAoQUVfUkVMRUFTRV9ERUFETE9DSyk7Ci0JCX0KLQl9Ci0KLQkvKiBNYXJrIHVubG9ja2VkIEZJUlNUICovCi0KLQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCi0Jc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwgMSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJIlRocmVhZCAlWCBjb3VsZCBub3QgcmVsZWFzZSBNdXRleCBbJXNdICVzXG4iLAotCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCX0KLQllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJUaHJlYWQgJVggcmVsZWFzZWQgTXV0ZXggWyVzXVxuIiwKLQkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoCkBAIC04NzAsMTYgKzYyMSwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipzdGF0ZV9saXN0KQorYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJCQkgICAgIHUxNiBhY3Rpb24sCisJCQkJICAgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipzdGF0ZV9saXN0KQogewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgICpzdGF0ZTsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogSWdub3JlIG51bGwgb2JqZWN0czsgdGhlc2UgYXJlIGV4cGVjdGVkICovCiAKQEAgLTg4NywzNzEgKzYzNSwxNSBAQAogCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSAob2JqZWN0LCBhY3Rpb24pOworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlKG9iamVjdCwgYWN0aW9uKTsKIAlpZiAoIXN0YXRlKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoc3RhdGVfbGlzdCwgc3RhdGUpOworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHN0YXRlX2xpc3QsIHN0YXRlKTsKIAlyZXR1cm4gKEFFX09LKTsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2gKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBJbmNyZW1lbnQvRGVjcmVtZW50Ci0gKiAgICAgICAgICAgICAgc3RhdGVfbGlzdCAgICAgIC0gTGlzdCB0aGUgc3RhdGUgd2lsbCBiZSBhZGRlZCB0bwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHN0YXRlIGFuZCBwdXNoIGl0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqKnN0YXRlX2xpc3QpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgKnN0YXRlOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAoaW50ZXJuYWxfb2JqZWN0LCBleHRlcm5hbF9vYmplY3QsIGluZGV4KTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSAoc3RhdGVfbGlzdCwgc3RhdGUpOwotCXJldHVybiAoQUVfT0spOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawotICogICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgLSBTdGF0ZSBvYmplY3QgdG8gcHVzaAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFB1c2ggYSBzdGF0ZSBvYmplY3Qgb250byBhIHN0YXRlIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X3B1c2hfZ2VuZXJpY19zdGF0ZSIpOwotCi0KLQkvKiBQdXNoIHRoZSBzdGF0ZSBvYmplY3Qgb250byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgKHN0YWNrKSAqLwotCi0Jc3RhdGUtPmNvbW1vbi5uZXh0ID0gKmxpc3RfaGVhZDsKLQkqbGlzdF9oZWFkID0gc3RhdGU7Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawotICoKLSAqIFJFVFVSTjogICAgICBUaGUgcG9wcGVkIHN0YXRlIG9iamVjdAotICoKLSAqIERFU0NSSVBUSU9OOiBQb3AgYSBzdGF0ZSBvYmplY3QgZnJvbSBhIHN0YXRlIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9wb3BfZ2VuZXJpY19zdGF0ZSIpOwotCi0KLQkvKiBSZW1vdmUgdGhlIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAoc3RhY2spICovCi0KLQlzdGF0ZSA9ICpsaXN0X2hlYWQ7Ci0JaWYgKHN0YXRlKSB7Ci0JCS8qIFVwZGF0ZSB0aGUgbGlzdCBoZWFkICovCi0KLQkJKmxpc3RfaGVhZCA9IHN0YXRlLT5jb21tb24ubmV4dDsKLQl9Ci0KLQlyZXR1cm5fUFRSIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFRoZSBuZXcgc3RhdGUgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGdlbmVyaWMgc3RhdGUgb2JqZWN0LiAgQXR0ZW1wdCB0byBvYnRhaW4gb25lIGZyb20KLSAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlOyAgSWYgbm9uZSBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKAotCXZvaWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCXN0YXRlID0gYWNwaV91dF9hY3F1aXJlX2Zyb21fY2FjaGUgKEFDUElfTUVNX0xJU1RfU1RBVEUpOwotCi0JLyogSW5pdGlhbGl6ZSAqLwotCi0JaWYgKHN0YXRlKSB7Ci0JCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEU7Ci0JfQotCi0JcmV0dXJuIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV3IFRocmVhZCBTdGF0ZS4gTlVMTCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJUaHJlYWQgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAotICogICAgICAgICAgICAgIHRvIHRyYWNrIHBlci10aHJlYWQgaW5mbyBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUgKAotCXZvaWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jcmVhdGVfdGhyZWFkX3N0YXRlIik7Ci0KLQotCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoKTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOwotCX0KLQotCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCi0KLQlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1RIUkVBRDsKLQlzdGF0ZS0+dGhyZWFkLnRocmVhZF9pZCA9IGFjcGlfb3NfZ2V0X3RocmVhZF9pZCAoKTsKLQotCXJldHVybl9QVFIgKChzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKikgc3RhdGUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCi0gKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhbiAiVXBkYXRlIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKLSAqICAgICAgICAgICAgICB0byB1cGRhdGUgcmVmZXJlbmNlIGNvdW50cyBhbmQgZGVsZXRlIGNvbXBsZXggb2JqZWN0cyBzdWNoCi0gKiAgICAgICAgICAgICAgYXMgcGFja2FnZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKQotewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2NyZWF0ZV91cGRhdGVfc3RhdGUiLCBvYmplY3QpOwotCi0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwotCi0Jc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9VUERBVEU7Ci0Jc3RhdGUtPnVwZGF0ZS5vYmplY3QgPSBvYmplY3Q7Ci0Jc3RhdGUtPnVwZGF0ZS52YWx1ZSAgPSBhY3Rpb247Ci0KLQlyZXR1cm5fUFRSIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAotICoKLSAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIlBhY2thZ2UgU3RhdGUiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KQotewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2NyZWF0ZV9wa2dfc3RhdGUiLCBpbnRlcm5hbF9vYmplY3QpOwotCi0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwotCi0Jc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QQUNLQUdFOwotCXN0YXRlLT5wa2cuc291cmNlX29iamVjdCA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIGludGVybmFsX29iamVjdDsKLQlzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0ICA9IGV4dGVybmFsX29iamVjdDsKLQlzdGF0ZS0+cGtnLmluZGV4ICAgICAgICA9IGluZGV4OwotCXN0YXRlLT5wa2cubnVtX3BhY2thZ2VzID0gMTsKLQotCXJldHVybl9QVFIgKHN0YXRlKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJDb250cm9sIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKLSAqICAgICAgICAgICAgICB0byBzdXBwb3J0IG5lc3RlZCBJRi9XSElMRSBjb25zdHJ1Y3RzIGluIHRoZSBBTUwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoKLWFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUgKAotCXZvaWQpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF9jcmVhdGVfY29udHJvbF9zdGF0ZSIpOwotCi0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUgKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgY29udHJvbCBzdHJ1Y3QgKi8KLQotCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfQ09OVFJPTDsKLQlzdGF0ZS0+Y29tbW9uLnN0YXRlICAgICA9IEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkc7Ci0KLQlyZXR1cm5fUFRSIChzdGF0ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBTdGF0ZSAgICAgICAgICAgICAgIC0gVGhlIHN0YXRlIG9iamVjdCB0byBiZSBkZWxldGVkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHV0IGEgc3RhdGUgb2JqZWN0IGJhY2sgaW50byB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlLiAgVGhlIG9iamVjdAotICogICAgICAgICAgICAgIGlzIG5vdCBhY3R1YWxseSBmcmVlZCBhdCB0aGlzIHRpbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2RlbGV0ZV9nZW5lcmljX3N0YXRlIik7Ci0KLQotCWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoQUNQSV9NRU1fTElTVF9TVEFURSwgc3RhdGUpOwotCXJldHVybl9WT0lEOwotfQotCi0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGVfY2FjaGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFB1cmdlIHRoZSBnbG9iYWwgc3RhdGUgb2JqZWN0IGNhY2hlLiAgVXNlZCBkdXJpbmcgc3Vic3lzdGVtCi0gKiAgICAgICAgICAgICAgdGVybWluYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZV9jYWNoZSAoCi0Jdm9pZCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfZGVsZXRlX2dlbmVyaWNfc3RhdGVfY2FjaGUiKTsKLQotCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZSAoQUNQSV9NRU1fTElTVF9TVEFURSk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlCkBAIC0xMjY4LDMzICs2NjAsMjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCi0JYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpCithY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LAorCQkJICB2b2lkICp0YXJnZXRfb2JqZWN0LAorCQkJICBhY3BpX3BrZ19jYWxsYmFjayB3YWxrX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGVfbGlzdCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2luZGV4OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRoaXNfc291cmNlX29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlX2xpc3QgPSBOVUxMOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisJdTMyIHRoaXNfaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19zb3VyY2Vfb2JqOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfd2Fsa19wYWNrYWdlX3RyZWUiKTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ1dF93YWxrX3BhY2thZ2VfdHJlZSIpOwotCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAoc291cmNlX29iamVjdCwgdGFyZ2V0X29iamVjdCwgMCk7CisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUoc291cmNlX29iamVjdCwgdGFyZ2V0X29iamVjdCwgMCk7CiAJaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCXdoaWxlIChzdGF0ZSkgewogCQkvKiBHZXQgb25lIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UgKi8KIAotCQl0aGlzX2luZGV4ICAgID0gc3RhdGUtPnBrZy5pbmRleDsKKwkJdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7CiAJCXRoaXNfc291cmNlX29iaiA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCi0JCQkJICBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CisJCSAgICBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CiAKIAkJLyoKIAkJICogQ2hlY2sgZm9yOgpAQCAtMTMwNSwxNiArNjkzLDIwIEBACiAJCSAqICAgIGNhc2UgYmVsb3cuCiAJCSAqLwogCQlpZiAoKCF0aGlzX3NvdXJjZV9vYmopIHx8Ci0JCQkoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFICh0aGlzX3NvdXJjZV9vYmopICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHx8Ci0JCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHRoaXNfc291cmNlX29iaikgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7Ci0JCQlzdGF0dXMgPSB3YWxrX2NhbGxiYWNrIChBQ1BJX0NPUFlfVFlQRV9TSU1QTEUsIHRoaXNfc291cmNlX29iaiwKLQkJCQkJIHN0YXRlLCBjb250ZXh0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHRoaXNfc291cmNlX29iaikgIT0KKwkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKHRoaXNfc291cmNlX29iaikgIT0KKwkJCUFDUElfVFlQRV9QQUNLQUdFKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICB3YWxrX2NhbGxiYWNrKEFDUElfQ09QWV9UWVBFX1NJTVBMRSwKKwkJCQkJICB0aGlzX3NvdXJjZV9vYmosIHN0YXRlLCBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCiAJCQlzdGF0ZS0+cGtnLmluZGV4Kys7Ci0JCQl3aGlsZSAoc3RhdGUtPnBrZy5pbmRleCA+PSBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQpIHsKKwkJCXdoaWxlIChzdGF0ZS0+cGtnLmluZGV4ID49CisJCQkgICAgICAgc3RhdGUtPnBrZy5zb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50KSB7CiAJCQkJLyoKIAkJCQkgKiBXZSd2ZSBoYW5kbGVkIGFsbCBvZiB0aGUgb2JqZWN0cyBhdCB0aGlzIGxldmVsLCAgVGhpcyBtZWFucwogCQkJCSAqIHRoYXQgd2UgaGF2ZSBqdXN0IGNvbXBsZXRlZCBhIHBhY2thZ2UuICBUaGF0IHBhY2thZ2UgbWF5CkBAIC0xMzIyLDggKzcxNCw4IEBACiAJCQkJICoKIAkJCQkgKiBEZWxldGUgdGhpcyBzdGF0ZSBhbmQgcG9wIHRoZSBwcmV2aW91cyBzdGF0ZSAocGFja2FnZSkuCiAJCQkJICovCi0JCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoc3RhdGUpOwotCQkJCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoJnN0YXRlX2xpc3QpOworCQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOworCQkJCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmc3RhdGVfbGlzdCk7CiAKIAkJCQkvKiBGaW5pc2hlZCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHN0YXRlcyAqLwogCkBAIC0xMzMzLDcgKzcyNSw3IEBACiAJCQkJCSAqIHBhY2thZ2UganVzdCBhZGQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2FnZSBvYmplY3RzCiAJCQkJCSAqIGFuZCBleGl0CiAJCQkJCSAqLwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCQl9CiAKIAkJCQkvKgpAQCAtMTM0MiwzNSArNzM0LDM1IEBACiAJCQkJICovCiAJCQkJc3RhdGUtPnBrZy5pbmRleCsrOwogCQkJfQotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogVGhpcyBpcyBhIHN1Ym9iamVjdCBvZiB0eXBlIHBhY2thZ2UgKi8KIAotCQkJc3RhdHVzID0gd2Fsa19jYWxsYmFjayAoQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSwgdGhpc19zb3VyY2Vfb2JqLAotCQkJCQkgIHN0YXRlLCBjb250ZXh0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCQlzdGF0dXMgPQorCQkJICAgIHdhbGtfY2FsbGJhY2soQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSwKKwkJCQkJICB0aGlzX3NvdXJjZV9vYmosIHN0YXRlLCBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQogCiAJCQkvKgogCQkJICogUHVzaCB0aGUgY3VycmVudCBzdGF0ZSBhbmQgY3JlYXRlIGEgbmV3IG9uZQogCQkJICogVGhlIGNhbGxiYWNrIGFib3ZlIHJldHVybmVkIGEgbmV3IHRhcmdldCBwYWNrYWdlIG9iamVjdC4KIAkJCSAqLwotCQkJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZzdGF0ZV9saXN0LCBzdGF0ZSk7Ci0JCQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZSAodGhpc19zb3VyY2Vfb2JqLAotCQkJCQkgICBzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiwgMCk7CisJCQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmc3RhdGVfbGlzdCwgc3RhdGUpOworCQkJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUodGhpc19zb3VyY2Vfb2JqLAorCQkJCQkJCSBzdGF0ZS0+cGtnLgorCQkJCQkJCSB0aGlzX3RhcmdldF9vYmosIDApOwogCQkJaWYgKCFzdGF0ZSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJCX0KIAkJfQogCX0KIAogCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0KQEAgLTEzODQsMjMgKzc3NiwxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4Ci1hY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpCit1OCBhY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtKHU4ICogYnVmZmVyLCB1MzIgbGVuZ3RoKQogewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlzaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIHN1bSA9IDA7Ci0KKwl1MzIgaTsKKwlzaWduZWQgY2hhciBzdW0gPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXN1bSA9IChzaWduZWQgY2hhcikgKHN1bSArIGJ1ZmZlcltpXSk7CisJCXN1bSA9IChzaWduZWQgY2hhcikoc3VtICsgYnVmZmVyW2ldKTsKIAl9CiAKIAlyZXR1cm4gKCh1OCkgKDAgLSBzdW0pKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnCkBAIC0xNDEzLDE3ICs4MDAsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KLXU4ICoKLWFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKQordTggKmFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjKQogewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2J5dGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVuZF9idWZmZXI7CisJdTggYnVmZmVyX2J5dGU7CisJdTggKmJ1ZmZlcjsKKwl1OCAqZW5kX2J1ZmZlcjsKIAotCi0JYnVmZmVyICAgID0gb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCWJ1ZmZlciA9IG9ial9kZXNjLT5idWZmZXIucG9pbnRlcjsKIAllbmRfYnVmZmVyID0gYnVmZmVyICsgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CiAKIAl3aGlsZSAoYnVmZmVyIDwgZW5kX2J1ZmZlcikgewpAQCAtMTQzMSwxMiArODE0LDEyIEBACiAJCWlmIChidWZmZXJfYnl0ZSAmIEFDUElfUkRFU0NfVFlQRV9NQVNLKSB7CiAJCQkvKiBMYXJnZSBEZXNjcmlwdG9yIC0gTGVuZ3RoIGlzIG5leHQgMiBieXRlcyAqLwogCi0JCQlidWZmZXIgKz0gKCgqKGJ1ZmZlcisxKSB8ICgqKGJ1ZmZlcisyKSA8PCA4KSkgKyAzKTsKLQkJfQotCQllbHNlIHsKKwkJCWJ1ZmZlciArPSAoKCooYnVmZmVyICsgMSkgfCAoKihidWZmZXIgKyAyKSA8PCA4KSkgKyAzKTsKKwkJfSBlbHNlIHsKIAkJCS8qIFNtYWxsIERlc2NyaXB0b3IuICBFbmQgVGFnIHdpbGwgYmUgZm91bmQgaGVyZSAqLwogCi0JCQlpZiAoKGJ1ZmZlcl9ieXRlICYgQUNQSV9SREVTQ19TTUFMTF9NQVNLKSA9PSBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRykgeworCQkJaWYgKChidWZmZXJfYnl0ZSAmIEFDUElfUkRFU0NfU01BTExfTUFTSykgPT0KKwkJCSAgICBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRykgewogCQkJCS8qIEZvdW5kIHRoZSBlbmQgdGFnIGRlc2NyaXB0b3IsIGFsbCBkb25lLiAqLwogCiAJCQkJcmV0dXJuIChidWZmZXIpOwpAQCAtMTQ1Myw3ICs4MzYsNiBAQAogCXJldHVybiAoTlVMTCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZXBvcnRfZXJyb3IKQEAgLTE0NjgsMTcgKzg1MCwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLWFjcGlfdXRfcmVwb3J0X2Vycm9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKQordm9pZCBhY3BpX3V0X3JlcG9ydF9lcnJvcihjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyLCB1MzIgY29tcG9uZW50X2lkKQogewogCi0JYWNwaV9vc19wcmludGYgKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVwb3J0X3dhcm5pbmcKQEAgLTE0OTQsMTYgKzg3MSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV91dF9yZXBvcnRfd2FybmluZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCkKK2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCkKIHsKIAotCWFjcGlfb3NfcHJpbnRmICgiJThzLSUwNGQ6ICoqKiBXYXJuaW5nOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIFdhcm5pbmc6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZXBvcnRfaW5mbwpAQCAtMTUxOCwxNCArODkxLDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X3JlcG9ydF9pbmZvICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKQordm9pZCBhY3BpX3V0X3JlcG9ydF9pbmZvKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCiB7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiU4cy0lMDRkOiAqKiogSW5mbzogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKwlhY3BpX29zX3ByaW50ZigiJThzLSUwNGQ6ICoqKiBJbmZvOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxMzRjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dG11dGV4IC0gbG9jYWwgbXV0ZXggc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG11dGV4IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfY3JlYXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF9pbml0aWFsaXplCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUuCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgdGhlIHN5c3RlbSBtdXRleCBvYmplY3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSh2b2lkKQoreworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X211dGV4X2luaXRpYWxpemUiKTsKKworCS8qCisJICogQ3JlYXRlIGVhY2ggb2YgdGhlIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0cworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgeworCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV9tdXRleChpKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX2xvY2soJmFjcGlfZ2JsX2dwZV9sb2NrKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF90ZXJtaW5hdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZS4KKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqCisgKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBvZiB0aGUgc3lzdGVtIG11dGV4IG9iamVjdHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSh2b2lkKQoreworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfbXV0ZXhfdGVybWluYXRlIik7CisKKwkvKgorCSAqIERlbGV0ZSBlYWNoIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0CisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9NVVRFWDsgaSsrKSB7CisJCSh2b2lkKWFjcGlfdXRfZGVsZXRlX211dGV4KGkpOworCX0KKworCWFjcGlfb3NfZGVsZXRlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgY3JlYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbXV0ZXggb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfbXV0ZXgiLCBtdXRleF9pZCk7CisKKwlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmICghYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpIHsKKwkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKDEsIDEsCisJCQkJCQkgICZhY3BpX2dibF9tdXRleF9pbmZvCisJCQkJCQkgIFttdXRleF9pZF0ubXV0ZXgpOworCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPQorCQkgICAgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CisJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnVzZV9jb3VudCA9IDA7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX211dGV4CisgKgorICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBkZWxldGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSBtdXRleCBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9kZWxldGVfbXV0ZXgiLCBtdXRleF9pZCk7CisKKwlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCk7CisKKwlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCA9IE5VTEw7CisJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9hY3F1aXJlX211dGV4CisgKgorICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBhY3F1aXJlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQWNxdWlyZSBhIG11dGV4IG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiB0aGlzX3RocmVhZF9pZDsKKworCUFDUElfRlVOQ1RJT05fTkFNRSgidXRfYWNxdWlyZV9tdXRleCIpOworCisJaWYgKG11dGV4X2lkID4gTUFYX01VVEVYKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJdGhpc190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKKworI2lmZGVmIEFDUElfTVVURVhfREVCVUcKKwl7CisJCXUzMiBpOworCQkvKgorCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCisJCSAqCisJCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCisJCSAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZAorCQkgKiB0aGUgbXV0ZXggb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgorCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KKwkJICovCisJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKKwkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJNdXRleCBbJXNdIGFscmVhZHkgYWNxdWlyZWQgYnkgdGhpcyB0aHJlYWQgWyVYXVxuIiwKKwkJCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKKwkJCQkJCQkgIChtdXRleF9pZCksCisJCQkJCQkJICB0aGlzX3RocmVhZF9pZCkpOworCisJCQkJCXJldHVybiAoQUVfQUxSRUFEWV9BQ1FVSVJFRCk7CisJCQkJfQorCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKKwkJCQkJCSAgdGhpc190aHJlYWRfaWQsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUoaSksCisJCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKKwkJCQkJCSAgKG11dGV4X2lkKSkpOworCisJCQkJcmV0dXJuIChBRV9BQ1FVSVJFX0RFQURMT0NLKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCSAgIlRocmVhZCAlWCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgTXV0ZXggWyVzXVxuIiwKKwkJCSAgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4LAorCQkJCQkxLCBBQ1BJX1dBSVRfRk9SRVZFUik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsCisJCQkJICAiVGhyZWFkICVYIGFjcXVpcmVkIE11dGV4IFslc11cbiIsCisJCQkJICB0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50Kys7CisJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9IHRoaXNfdGhyZWFkX2lkOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVGhyZWFkICVYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslc10gJXNcbiIsCisJCQkJICB0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVsZWFzZV9tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgcmVsZWFzZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlbGVhc2UgYSBtdXRleCBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgdGhpc190aHJlYWRfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X3JlbGVhc2VfbXV0ZXgiKTsKKworCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCSAgIlRocmVhZCAlWCByZWxlYXNpbmcgTXV0ZXggWyVzXVxuIiwgdGhpc190aHJlYWRfaWQsCisJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIE11dGV4IG11c3QgYmUgYWNxdWlyZWQgaW4gb3JkZXIgdG8gcmVsZWFzZSBpdCEKKwkgKi8KKwlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID09IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiTXV0ZXggWyVzXSBpcyBub3QgYWNxdWlyZWQsIGNhbm5vdCByZWxlYXNlXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKKworCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7CisJfQorI2lmZGVmIEFDUElfTVVURVhfREVCVUcKKwl7CisJCXUzMiBpOworCQkvKgorCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCisJCSAqCisJCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCisJCSAqIGdyZWF0ZXIgdGhhbiB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZCB0aGUgbXV0ZXgKKwkJICogb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgorCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KKwkJICovCisJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKKwkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSAgIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShpKSwKKwkJCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZQorCQkJCQkJICAobXV0ZXhfaWQpKSk7CisKKwkJCQlyZXR1cm4gKEFFX1JFTEVBU0VfREVBRExPQ0spOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBNYXJrIHVubG9ja2VkIEZJUlNUICovCisKKwlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZShhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwgMSk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJUaHJlYWQgJVggY291bGQgbm90IHJlbGVhc2UgTXV0ZXggWyVzXSAlc1xuIiwKKwkJCQkgIHRoaXNfdGhyZWFkX2lkLAorCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCksCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsCisJCQkJICAiVGhyZWFkICVYIHJlbGVhc2VkIE11dGV4IFslc11cbiIsCisJCQkJICB0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCmluZGV4IGNkMzg5OWI5Li4zMDE1ZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCkBAIC00MSwzNCArNDEsMjYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKLQogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi0JIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dG9iamVjdCIpCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG9iamVjdCIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCSAgICAgICBhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKK2FjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqLAorCQkJCWFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCithY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCh1OCBvYmplY3RfdHlwZSwKKwkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLCB2b2lkICpjb250ZXh0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05MSwyNiArODMsMjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICoKLWFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyhjaGFyICptb2R1bGVfbmFtZSwKKwkJCQkJCQkgICAgICB1MzIgbGluZV9udW1iZXIsCisJCQkJCQkJICAgICAgdTMyIGNvbXBvbmVudF9pZCwKKwkJCQkJCQkgICAgICBhY3BpX29iamVjdF90eXBlCisJCQkJCQkJICAgICAgdHlwZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc2Vjb25kX29iamVjdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX29iamVjdDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJ1dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyIsCi0JCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoInV0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnIiwKKwkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpOwogCiAJLyogQWxsb2NhdGUgdGhlIHJhdyBvYmplY3QgZGVzY3JpcHRvciAqLwogCi0Jb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKG1vZHVsZV9uYW1lLCBsaW5lX251bWJlciwgY29tcG9uZW50X2lkKTsKKwlvYmplY3QgPQorCSAgICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsCisJCQkJCSAgICAgY29tcG9uZW50X2lkKTsKIAlpZiAoIW9iamVjdCkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTExOSwxMSArMTEwLDEyIEBACiAKIAkJLyogVGhlc2UgdHlwZXMgcmVxdWlyZSBhIHNlY29uZGFyeSBvYmplY3QgKi8KIAotCQlzZWNvbmRfb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKG1vZHVsZV9uYW1lLAotCQkJCSAgIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQpOworCQlzZWNvbmRfb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcobW9kdWxlX25hbWUsCisJCQkJCQkJCSBsaW5lX251bWJlciwKKwkJCQkJCQkJIGNvbXBvbmVudF9pZCk7CiAJCWlmICghc2Vjb25kX29iamVjdCkgewotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9iamVjdCk7Ci0JCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9iamVjdCk7CisJCQlyZXR1cm5fUFRSKE5VTEwpOwogCQl9CiAKIAkJc2Vjb25kX29iamVjdC0+Y29tbW9uLnR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfRVhUUkE7CkBAIC0xNDksMTAgKzE0MSw5IEBACiAKIAkvKiBBbnkgcGVyLXR5cGUgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGdvIGhlcmUgKi8KIAotCXJldHVybl9QVFIgKG9iamVjdCk7CisJcmV0dXJuX1BUUihvYmplY3QpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QKQEAgLTE2NSwyMiArMTU2LDE4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqCi1hY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0ICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChhY3BpX3NpemUgYnVmZmVyX3NpemUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKKwl1OCAqYnVmZmVyID0gTlVMTDsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJ1dF9jcmVhdGVfYnVmZmVyX29iamVjdCIsIGJ1ZmZlcl9zaXplKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfYnVmZmVyX29iamVjdCIsIGJ1ZmZlcl9zaXplKTsKIAogCS8qIENyZWF0ZSBhIG5ldyBCdWZmZXIgb2JqZWN0ICovCiAKLQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0JVRkZFUik7CisJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7CiAJaWYgKCFidWZmZXJfZGVzYykgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBDcmVhdGUgYW4gYWN0dWFsIGJ1ZmZlciBvbmx5IGlmIHNpemUgPiAwICovCkBAIC0xODgsMTIgKzE3NSwxMSBAQAogCWlmIChidWZmZXJfc2l6ZSA+IDApIHsKIAkJLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgKi8KIAotCQlidWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUgKGJ1ZmZlcl9zaXplKTsKKwkJYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGJ1ZmZlcl9zaXplKTsKIAkJaWYgKCFidWZmZXIpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoImNyZWF0ZV9idWZmZXI6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLAotCQkJCSh1MzIpIGJ1ZmZlcl9zaXplKSk7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKGJ1ZmZlcl9kZXNjKTsKLQkJCXJldHVybl9QVFIgKE5VTEwpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJjcmVhdGVfYnVmZmVyOiBjb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwgKHUzMikgYnVmZmVyX3NpemUpKTsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShidWZmZXJfZGVzYyk7CisJCQlyZXR1cm5fUFRSKE5VTEwpOwogCQl9CiAJfQogCkBAIC0yMDUsMTAgKzE5MSw5IEBACiAKIAkvKiBSZXR1cm4gdGhlIG5ldyBidWZmZXIgZGVzY3JpcHRvciAqLwogCi0JcmV0dXJuX1BUUiAoYnVmZmVyX2Rlc2MpOworCXJldHVybl9QVFIoYnVmZmVyX2Rlc2MpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QKQEAgLTIyMywzNCArMjA4LDI5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqCi1hY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zaXplKQordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChhY3BpX3NpemUgc3RyaW5nX3NpemUpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc3RyaW5nX2Rlc2M7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0cmluZ19kZXNjOworCWNoYXIgKnN0cmluZzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIgKCJ1dF9jcmVhdGVfc3RyaW5nX29iamVjdCIsIHN0cmluZ19zaXplKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfc3RyaW5nX29iamVjdCIsIHN0cmluZ19zaXplKTsKIAogCS8qIENyZWF0ZSBhIG5ldyBTdHJpbmcgb2JqZWN0ICovCiAKLQlzdHJpbmdfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX1NUUklORyk7CisJc3RyaW5nX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1NUUklORyk7CiAJaWYgKCFzdHJpbmdfZGVzYykgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSBhY3R1YWwgc3RyaW5nIGJ1ZmZlciAtLSAoU2l6ZSArIDEpIGZvciBOVUxMIHRlcm1pbmF0b3IuCiAJICogTk9URTogWmVyby1sZW5ndGggc3RyaW5ncyBhcmUgTlVMTCB0ZXJtaW5hdGVkCiAJICovCi0Jc3RyaW5nID0gQUNQSV9NRU1fQ0FMTE9DQVRFIChzdHJpbmdfc2l6ZSArIDEpOworCXN0cmluZyA9IEFDUElfTUVNX0NBTExPQ0FURShzdHJpbmdfc2l6ZSArIDEpOwogCWlmICghc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImNyZWF0ZV9zdHJpbmc6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLAotCQkJKHUzMikgc3RyaW5nX3NpemUpKTsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdHJpbmdfZGVzYyk7Ci0JCXJldHVybl9QVFIgKE5VTEwpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoImNyZWF0ZV9zdHJpbmc6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLCAodTMyKSBzdHJpbmdfc2l6ZSkpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RyaW5nX2Rlc2MpOworCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIAogCS8qIENvbXBsZXRlIHN0cmluZyBvYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTI2MCwxMCArMjQwLDkgQEAKIAogCS8qIFJldHVybiB0aGUgbmV3IHN0cmluZyBkZXNjcmlwdG9yICovCiAKLQlyZXR1cm5fUFRSIChzdHJpbmdfZGVzYyk7CisJcmV0dXJuX1BUUihzdHJpbmdfZGVzYyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3QKQEAgLTI3NiwyNCArMjU1LDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKLWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpCit1OCBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCh2b2lkICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ1dF92YWxpZF9pbnRlcm5hbF9vYmplY3QiKTsKLQorCUFDUElfRlVOQ1RJT05fTkFNRSgidXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0Iik7CiAKIAkvKiBDaGVjayBmb3IgYSBudWxsIHBvaW50ZXIgKi8KIAogCWlmICghb2JqZWN0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICIqKioqIE51bGwgT2JqZWN0IFB0clxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIqKioqIE51bGwgT2JqZWN0IFB0clxuIikpOwogCQlyZXR1cm4gKEZBTFNFKTsKIAl9CiAKIAkvKiBDaGVjayB0aGUgZGVzY3JpcHRvciB0eXBlIGZpZWxkICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqZWN0KSkgeworCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkpIHsKIAljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CiAKIAkJLyogVGhlIG9iamVjdCBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwpAQCAtMzAxLDE2ICsyNzcsMTUgQEAKIAkJcmV0dXJuIChUUlVFKTsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCi0JCQkJIiVwIGlzIG5vdCBub3QgYW4gQUNQSSBvcGVyYW5kIG9iaiBbJXNdXG4iLAotCQkJCW9iamVjdCwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChvYmplY3QpKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICIlcCBpcyBub3Qgbm90IGFuIEFDUEkgb3BlcmFuZCBvYmogWyVzXVxuIiwKKwkJCQkgIG9iamVjdCwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG9iamVjdCkpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIChGQUxTRSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcKQEAgLTMyNiwzNyArMzAxLDMxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqCi1hY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCkKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJCSAgICAgICB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCiB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyIpOwotCi0KLQlvYmplY3QgPSBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoQUNQSV9NRU1fTElTVF9PUEVSQU5EKTsKKwlvYmplY3QgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOwogCWlmICghb2JqZWN0KSB7Ci0JCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQsCi0JCQkJICAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBhbiBvYmplY3QgZGVzY3JpcHRvclxuIikpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBjb21wb25lbnRfaWQsCisJCQkJICAgKCJDb3VsZCBub3QgYWxsb2NhdGUgYW4gb2JqZWN0IGRlc2NyaXB0b3JcbiIpKTsKIAotCQlyZXR1cm5fUFRSIChOVUxMKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKIAkvKiBNYXJrIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KKwltZW1zZXQob2JqZWN0LCAwLCBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpOworCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QsIEFDUElfREVTQ19UWVBFX09QRVJBTkQpOwogCi0JQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QsIEFDUElfREVTQ19UWVBFX09QRVJBTkQpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBTaXplICVYXG4iLAorCQkJICBvYmplY3QsICh1MzIpIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSkpOwogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBTaXplICVYXG4iLAotCQkJb2JqZWN0LCAodTMyKSBzaXplb2YgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKSk7Ci0KLQlyZXR1cm5fUFRSIChvYmplY3QpOworCXJldHVybl9QVFIob2JqZWN0KTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYwpAQCAtMzY5LDU1ICszMzgsMjMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KQordm9pZCBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJ1dF9kZWxldGVfb2JqZWN0X2Rlc2MiLCBvYmplY3QpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2RlbGV0ZV9vYmplY3RfZGVzYyIsIG9iamVjdCk7CiAKIAkvKiBPYmplY3QgbXVzdCBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIiVwIGlzIG5vdCBhbiBBQ1BJIE9wZXJhbmQgb2JqZWN0IFslc11cbiIsIG9iamVjdCwKLQkJCQlhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKG9iamVjdCkpKTsKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIiVwIGlzIG5vdCBhbiBBQ1BJIE9wZXJhbmQgb2JqZWN0IFslc11cbiIsCisJCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShvYmplY3QpKSk7CiAJCXJldHVybl9WT0lEOwogCX0KIAotCWFjcGlfdXRfcmVsZWFzZV90b19jYWNoZSAoQUNQSV9NRU1fTElTVF9PUEVSQU5ELCBvYmplY3QpOwotCisJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9vcGVyYW5kX2NhY2hlLCBvYmplY3QpOwogCXJldHVybl9WT0lEOwogfQogCi0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX29iamVjdF9jYWNoZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHVyZ2UgdGhlIGdsb2JhbCBzdGF0ZSBvYmplY3QgY2FjaGUuICBVc2VkIGR1cmluZyBzdWJzeXN0ZW0KLSAqICAgICAgICAgICAgICB0ZXJtaW5hdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9vYmplY3RfY2FjaGUgKAotCXZvaWQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSAoInV0X2RlbGV0ZV9vYmplY3RfY2FjaGUiKTsKLQotCi0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19jYWNoZSAoQUNQSV9NRU1fTElTVF9PUEVSQU5EKTsKLQlyZXR1cm5fVk9JRDsKLX0KLSNlbmRpZgotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZQpAQCAtNDM2LDE2ICszNzMsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKK2FjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkgICAgICAgYWNwaV9zaXplICogb2JqX2xlbmd0aCkKIHsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOworCWFjcGlfc2l6ZSBsZW5ndGg7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgidXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7CiAKIAkvKgogCSAqIEhhbmRsZSBhIG51bGwgb2JqZWN0IChDb3VsZCBiZSBhIHVuaW5pdGlhbGl6ZWQgcGFja2FnZQpAQCAtNDUzLDE4ICszODcsMTggQEAKIAkgKi8KIAlpZiAoIWludGVybmFsX29iamVjdCkgewogCQkqb2JqX2xlbmd0aCA9IDA7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIFN0YXJ0IHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgQWNwaSBvYmplY3QgKi8KIAotCWxlbmd0aCA9IHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpOworCWxlbmd0aCA9IHNpemVvZih1bmlvbiBhY3BpX29iamVjdCk7CiAKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChpbnRlcm5hbF9vYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCS8qIE9iamVjdCBpcyBhIG5hbWVkIG9iamVjdCAocmVmZXJlbmNlKSwganVzdCByZXR1cm4gdGhlIGxlbmd0aCAqLwogCi0JCSpvYmpfbGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAobGVuZ3RoKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQkqb2JqX2xlbmd0aCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQobGVuZ3RoKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKQEAgLTQ3MywxOSArNDA3LDE3IEBACiAJICogbXVzdCBiZSBhY2Nlc3NlZCBieXRld2lzZSBvciB0aGVyZSBtYXkgYmUgYWxpZ25tZW50IHByb2JsZW1zIG9uCiAJICogY2VydGFpbiBwcm9jZXNzb3JzCiAJICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSkgewogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQlsZW5ndGggKz0gKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMTsKIAkJYnJlYWs7CiAKLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQlsZW5ndGggKz0gKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CiAJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CkBAIC00OTUsNyArNDI3LDYgQEAKIAkJICovCiAJCWJyZWFrOwogCi0KIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJc3dpdGNoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vcGNvZGUpIHsKQEAgLTUwNSw4ICs0MzYsMTAgQEAKIAkJCSAqIEdldCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZnVsbCBwYXRobmFtZSB0byB0aGlzIG9iamVjdC4KIAkJCSAqIFRoZSByZWZlcmVuY2Ugd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHBhdGhuYW1lIHRvIHRoZSBvYmplY3QKIAkJCSAqLwotCQkJbGVuZ3RoICs9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAotCQkJCQkgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlKSk7CisJCQlsZW5ndGggKz0KKwkJCSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JECisJCQkgICAgKGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aAorCQkJICAgICAoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2Uubm9kZSkpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTUxNiwxOSArNDQ5LDIxIEBACiAJCQkgKiBOb3RhYmx5LCBMb2NhbHMgYW5kIEFyZ3MgYXJlIG5vdCBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG1heSBiZQogCQkJICogcmVxdWlyZWQgZXZlbnR1YWxseS4KIAkJCSAqLwotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGU9JVggaW4gb2JqZWN0ICVwXG4iLAotCQkJCWludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLm9wY29kZSwgaW50ZXJuYWxfb2JqZWN0KSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJVbnN1cHBvcnRlZCBSZWZlcmVuY2Ugb3Bjb2RlPSVYIGluIG9iamVjdCAlcFxuIiwKKwkJCQkJICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vcGNvZGUsCisJCQkJCSAgaW50ZXJuYWxfb2JqZWN0KSk7CiAJCQlzdGF0dXMgPSBBRV9UWVBFOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbnN1cHBvcnRlZCB0eXBlPSVYIGluIG9iamVjdCAlcFxuIiwKLQkJCUFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpLCBpbnRlcm5hbF9vYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbnN1cHBvcnRlZCB0eXBlPSVYIGluIG9iamVjdCAlcFxuIiwKKwkJCQkgIEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCksCisJCQkJICBpbnRlcm5hbF9vYmplY3QpKTsKIAkJc3RhdHVzID0gQUVfVFlQRTsKIAkJYnJlYWs7CiAJfQpAQCAtNTM5LDExICs0NzQsMTAgQEAKIAkgKiBvbiBhIG1hY2hpbmUgd29yZCBib3VuZGFyeS4gKHByZXZlbnRpbmcgYWxpZ25tZW50IGZhdWx0cyBvbiBzb21lCiAJICogbWFjaGluZXMuKQogCSAqLwotCSpvYmpfbGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAobGVuZ3RoKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJKm9ial9sZW5ndGggPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGxlbmd0aCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGgKQEAgLTU1NywxNiArNDkxLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCkKK2FjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoKHU4IG9iamVjdF90eXBlLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCSAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAgICAgICAgICAgICppbmZvID0gKHN0cnVjdCBhY3BpX3BrZ19pbmZvICopIGNvbnRleHQ7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc3BhY2U7Ci0KKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAqKWNvbnRleHQ7CisJYWNwaV9zaXplIG9iamVjdF9zcGFjZTsKIAogCXN3aXRjaCAob2JqZWN0X3R5cGUpIHsKIAljYXNlIEFDUElfQ09QWV9UWVBFX1NJTVBMRToKQEAgLTU3NSwxNSArNTA2LDE2IEBACiAJCSAqIFNpbXBsZSBvYmplY3QgLSBqdXN0IGdldCB0aGUgc2l6ZSAoTnVsbCBvYmplY3QvZW50cnkgaXMgaGFuZGxlZAogCQkgKiBoZXJlIGFsc28pIGFuZCBzdW0gaXQgaW50byB0aGUgcnVubmluZyBwYWNrYWdlIGxlbmd0aAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplIChzb3VyY2Vfb2JqZWN0LCAmb2JqZWN0X3NwYWNlKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHNvdXJjZV9vYmplY3QsCisJCQkJCQkgICAmb2JqZWN0X3NwYWNlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAogCQlpbmZvLT5sZW5ndGggKz0gb2JqZWN0X3NwYWNlOwogCQlicmVhazsKIAotCiAJY2FzZSBBQ1BJX0NPUFlfVFlQRV9QQUNLQUdFOgogCiAJCS8qIFBhY2thZ2Ugb2JqZWN0IC0gbm90aGluZyBtdWNoIHRvIGRvIGhlcmUsIGxldCB0aGUgd2FsayBoYW5kbGUgaXQgKi8KQEAgLTU5Miw3ICs1MjQsNiBAQAogCQlzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiA9IE5VTEw7CiAJCWJyZWFrOwogCi0KIAlkZWZhdWx0OgogCiAJCS8qIE5vIG90aGVyIHR5cGVzIGFsbG93ZWQgKi8KQEAgLTYwMyw3ICs1MzQsNiBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplCkBAIC02MjIsMjUgKzU1MiwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKK2FjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCWFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcGtnX2luZm8gICAgICAgICAgICBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyBpbmZvOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2dldF9wYWNrYWdlX29iamVjdF9zaXplIiwgaW50ZXJuYWxfb2JqZWN0KTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgidXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUiLCBpbnRlcm5hbF9vYmplY3QpOwotCi0KLQlpbmZvLmxlbmd0aCAgICAgID0gMDsKKwlpbmZvLmxlbmd0aCA9IDA7CiAJaW5mby5vYmplY3Rfc3BhY2UgPSAwOwogCWluZm8ubnVtX3BhY2thZ2VzID0gMTsKIAotCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUgKGludGVybmFsX29iamVjdCwgTlVMTCwKLQkJCSBhY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCwgJmluZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUoaW50ZXJuYWxfb2JqZWN0LCBOVUxMLAorCQkJCQkgICBhY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCwgJmluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgpAQCAtNjQ4LDE2ICs1NzUsMTUgQEAKIAkgKiBqdXN0IGFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrYWdlIG9iamVjdHMgdGhlbXNlbHZlcy4KIAkgKiBSb3VuZCB1cCB0byB0aGUgbmV4dCBtYWNoaW5lIHdvcmQuCiAJICovCi0JaW5mby5sZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpICoKLQkJCSAgKGFjcGlfc2l6ZSkgaW5mby5udW1fcGFja2FnZXM7CisJaW5mby5sZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKSAqCisJICAgIChhY3BpX3NpemUpIGluZm8ubnVtX3BhY2thZ2VzOwogCiAJLyogUmV0dXJuIHRoZSB0b3RhbCBwYWNrYWdlIGxlbmd0aCAqLwogCiAJKm9ial9sZW5ndGggPSBpbmZvLmxlbmd0aDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfb2JqZWN0X3NpemUKQEAgLTY3MywyNSArNTk5LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfb2JqZWN0X3NpemUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKQorYWNwaV91dF9nZXRfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJYWNwaV9zaXplICogb2JqX2xlbmd0aCkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSAmJgotCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGludGVybmFsX29iamVjdCkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUgKGludGVybmFsX29iamVjdCwgb2JqX2xlbmd0aCk7Ci0JfQotCWVsc2UgewotCQlzdGF0dXMgPSBhY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUgKGludGVybmFsX29iamVjdCwgb2JqX2xlbmd0aCk7CisJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSA9PQorCSAgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkgICAgJiYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplKGludGVybmFsX29iamVjdCwKKwkJCQkJCSAgICBvYmpfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKGludGVybmFsX29iamVjdCwgb2JqX2xlbmd0aCk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjYjI3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jCkBAIC0wLDAgKzEsMzMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dHN0YXRlIC0gc3RhdGUgb2JqZWN0IHN1cHBvcnQgcHJvY2VkdXJlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHN0YXRlIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gSW5jcmVtZW50L0RlY3JlbWVudAorICogICAgICAgICAgICAgIHN0YXRlX2xpc3QgICAgICAtIExpc3QgdGhlIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBzdGF0ZSBhbmQgcHVzaCBpdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkgIHUxNiBpbmRleCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKiBzdGF0ZV9saXN0KQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlzdGF0ZSA9CisJICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZShpbnRlcm5hbF9vYmplY3QsIGV4dGVybmFsX29iamVjdCwgaW5kZXgpOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHN0YXRlX2xpc3QsIHN0YXRlKTsKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCisgKiAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAtIFN0YXRlIG9iamVjdCB0byBwdXNoCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUHVzaCBhIHN0YXRlIG9iamVjdCBvbnRvIGEgc3RhdGUgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipsaXN0X2hlYWQsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3B1c2hfZ2VuZXJpY19zdGF0ZSIpOworCisJLyogUHVzaCB0aGUgc3RhdGUgb2JqZWN0IG9udG8gdGhlIGZyb250IG9mIHRoZSBsaXN0IChzdGFjaykgKi8KKworCXN0YXRlLT5jb21tb24ubmV4dCA9ICpsaXN0X2hlYWQ7CisJKmxpc3RfaGVhZCA9IHN0YXRlOworCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBwb3BwZWQgc3RhdGUgb2JqZWN0CisgKgorICogREVTQ1JJUFRJT046IFBvcCBhIHN0YXRlIG9iamVjdCBmcm9tIGEgc3RhdGUgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlCisJCQkJCQkgICAgKipsaXN0X2hlYWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3BvcF9nZW5lcmljX3N0YXRlIik7CisKKwkvKiBSZW1vdmUgdGhlIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAoc3RhY2spICovCisKKwlzdGF0ZSA9ICpsaXN0X2hlYWQ7CisJaWYgKHN0YXRlKSB7CisJCS8qIFVwZGF0ZSB0aGUgbGlzdCBoZWFkICovCisKKwkJKmxpc3RfaGVhZCA9IHN0YXRlLT5jb21tb24ubmV4dDsKKwl9CisKKwlyZXR1cm5fUFRSKHN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBuZXcgc3RhdGUgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGdlbmVyaWMgc3RhdGUgb2JqZWN0LiAgQXR0ZW1wdCB0byBvYnRhaW4gb25lIGZyb20KKyAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlOyAgSWYgbm9uZSBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKHZvaWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXN0YXRlID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CisJaWYgKHN0YXRlKSB7CisJCS8qIEluaXRpYWxpemUgKi8KKwkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlKSk7CisJCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEU7CisJfQorCisJcmV0dXJuIChzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5ldyBUaHJlYWQgU3RhdGUuIE5VTEwgb24gZmFpbHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSAiVGhyZWFkIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKKyAqICAgICAgICAgICAgICB0byB0cmFjayBwZXItdGhyZWFkIGluZm8gZHVyaW5nIG1ldGhvZCBleGVjdXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZSh2b2lkKQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jcmVhdGVfdGhyZWFkX3N0YXRlIik7CisKKwkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCisKKwlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKKwlpZiAoIXN0YXRlKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJLyogSW5pdCBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIHVwZGF0ZSBzdHJ1Y3QgKi8KKworCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfVEhSRUFEOworCXN0YXRlLT50aHJlYWQudGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisKKwlyZXR1cm5fUFRSKChzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKilzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhbiAiVXBkYXRlIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKKyAqICAgICAgICAgICAgICB0byB1cGRhdGUgcmVmZXJlbmNlIGNvdW50cyBhbmQgZGVsZXRlIGNvbXBsZXggb2JqZWN0cyBzdWNoCisgKiAgICAgICAgICAgICAgYXMgcGFja2FnZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAgICAgKm9iamVjdCwgdTE2IGFjdGlvbikKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2NyZWF0ZV91cGRhdGVfc3RhdGUiLCBvYmplY3QpOworCisJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLworCisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCisKKwlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1VQREFURTsKKwlzdGF0ZS0+dXBkYXRlLm9iamVjdCA9IG9iamVjdDsKKwlzdGF0ZS0+dXBkYXRlLnZhbHVlID0gYWN0aW9uOworCisJcmV0dXJuX1BUUihzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJQYWNrYWdlIFN0YXRlIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHUxNiBpbmRleCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2NyZWF0ZV9wa2dfc3RhdGUiLCBpbnRlcm5hbF9vYmplY3QpOworCisJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLworCisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCisKKwlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BBQ0tBR0U7CisJc3RhdGUtPnBrZy5zb3VyY2Vfb2JqZWN0ID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilpbnRlcm5hbF9vYmplY3Q7CisJc3RhdGUtPnBrZy5kZXN0X29iamVjdCA9IGV4dGVybmFsX29iamVjdDsKKwlzdGF0ZS0+cGtnLmluZGV4ID0gaW5kZXg7CisJc3RhdGUtPnBrZy5udW1fcGFja2FnZXMgPSAxOworCisJcmV0dXJuX1BUUihzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIkNvbnRyb2wgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAorICogICAgICAgICAgICAgIHRvIHN1cHBvcnQgbmVzdGVkIElGL1dISUxFIGNvbnN0cnVjdHMgaW4gdGhlIEFNTC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUodm9pZCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUiKTsKKworCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KKworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgY29udHJvbCBzdHJ1Y3QgKi8KKworCXN0YXRlLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfQ09OVFJPTDsKKwlzdGF0ZS0+Y29tbW9uLnN0YXRlID0gQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORzsKKworCXJldHVybl9QVFIoc3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIFN0YXRlICAgICAgICAgICAgICAgLSBUaGUgc3RhdGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBQdXQgYSBzdGF0ZSBvYmplY3QgYmFjayBpbnRvIHRoZSBnbG9iYWwgc3RhdGUgY2FjaGUuICBUaGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgaXMgbm90IGFjdHVhbGx5IGZyZWVkIGF0IHRoaXMgdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSIpOworCisJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSwgc3RhdGUpOworCXJldHVybl9WT0lEOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwppbmRleCBlODgwM2Q4Li5mMDZiZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwpAQCAtNDYsMTMgKzQ2LDEwIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgogI2luY2x1ZGUgPGFjcGkvYWNkZWJ1Zy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLQkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0eGZhY2UiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHhmYWNlIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02Niw2MSArNjMsNTQgQEAKICAqICAgICAgICAgICAgICBjYWxsZWQsIHNvIGFueSBlYXJseSBpbml0aWFsaXphdGlvbiBiZWxvbmdzIGhlcmUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0gKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSIpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0iKTsKLQotCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlICgpKTsKLQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgZ2xvYmFscyB1c2VkIGJ5IHRoZSBzdWJzeXN0ZW0gKi8KLQotCWFjcGlfdXRfaW5pdF9nbG9iYWxzICgpOworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlKCkpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgT1MtRGVwZW5kZW50IGxheWVyICovCiAKLQlzdGF0dXMgPSBhY3BpX29zX2luaXRpYWxpemUgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJPU0QgZmFpbGVkIHRvIGluaXRpYWxpemUsICVzXG4iLAotCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX29zX2luaXRpYWxpemUoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJPU0QgZmFpbGVkIHRvIGluaXRpYWxpemUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAorCS8qIEluaXRpYWxpemUgYWxsIGdsb2JhbHMgdXNlZCBieSB0aGUgc3Vic3lzdGVtICovCisKKwlhY3BpX3V0X2luaXRfZ2xvYmFscygpOworCiAJLyogQ3JlYXRlIHRoZSBkZWZhdWx0IG11dGV4IG9iamVjdHMgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkdsb2JhbCBtdXRleCBjcmVhdGlvbiBmYWlsdXJlLCAlc1xuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF9tdXRleF9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiR2xvYmFsIG11dGV4IGNyZWF0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgbmFtZXNwYWNlIG1hbmFnZXIgYW5kCiAJICogdGhlIHJvb3Qgb2YgdGhlIG5hbWVzcGFjZSB0cmVlCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19yb290X2luaXRpYWxpemUgKCk7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24gZmFpbHVyZSwgJXNcbiIsCi0JCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXN0YXR1cyA9IGFjcGlfbnNfcm9vdF9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTmFtZXNwYWNlIGluaXRpYWxpemF0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIElmIGNvbmZpZ3VyZWQsIGluaXRpYWxpemUgdGhlIEFNTCBkZWJ1Z2dlciAqLwogCi0JQUNQSV9ERUJVR0dFUl9FWEVDIChzdGF0dXMgPSBhY3BpX2RiX2luaXRpYWxpemUgKCkpOworCUFDUElfREVCVUdHRVJfRVhFQyhzdGF0dXMgPSBhY3BpX2RiX2luaXRpYWxpemUoKSk7CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfc3Vic3lzdGVtCkBAIC0xMzQsNDEgKzEyNCwzOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZV9zdWJzeXN0ZW0gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2VuYWJsZV9zdWJzeXN0ZW0iKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX3N1YnN5c3RlbSIpOwogCiAJLyoKIAkgKiBXZSBtdXN0IGluaXRpYWxpemUgdGhlIGhhcmR3YXJlIGJlZm9yZSB3ZSBjYW4gZW5hYmxlIEFDUEkuCiAJICogVGhlIHZhbHVlcyBmcm9tIHRoZSBGQURUIGFyZSB2YWxpZGF0ZWQgaGVyZS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFSRFdBUkVfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgaGFyZHdhcmVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBoYXJkd2FyZVxuIikpOwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfaW5pdGlhbGl6ZSAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2h3X2luaXRpYWxpemUoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEVuYWJsZSBBQ1BJIG1vZGUgKi8KIAogCWlmICghKGZsYWdzICYgQUNQSV9OT19BQ1BJX0VOQUJMRSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBHb2luZyBpbnRvIEFDUEkgbW9kZVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEdvaW5nIGludG8gQUNQSSBtb2RlXG4iKSk7CiAKIAkJYWNwaV9nYmxfb3JpZ2luYWxfbW9kZSA9IGFjcGlfaHdfZ2V0X21vZGUoKTsKIAotCQlzdGF0dXMgPSBhY3BpX2VuYWJsZSAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfV0FSTiwgImFjcGlfZW5hYmxlIGZhaWxlZC5cbiIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwkJc3RhdHVzID0gYWNwaV9lbmFibGUoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJCSAgImFjcGlfZW5hYmxlIGZhaWxlZC5cbiIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0xNzgsMTIgKzE2NiwxMiBAQAogCSAqIGluc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIGludGVyZmFjZS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIltJbml0XSBJbnN0YWxsaW5nIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBoYW5kbGVyc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluc3RhbGxpbmcgZGVmYXVsdCBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzXG4iKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycyAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTE5NiwyOCArMTg0LDI4IEBACiAJICogZXhlY3V0aW9uIQogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19FVkVOVF9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKIAotCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KIAogCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyIGFuZCBHbG9iYWwgTG9jayBoYW5kbGVyICovCiAKIAlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFORExFUl9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAotCQkJIltJbml0XSBJbnN0YWxsaW5nIFNDSS9HTCBoYW5kbGVyc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluc3RhbGxpbmcgU0NJL0dMIGhhbmRsZXJzXG4iKSk7CiAKLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjMzLDE1ICsyMjEsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9pbml0aWFsaXplX29iamVjdHMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpCiB7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzIik7Ci0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luaXRpYWxpemVfb2JqZWN0cyIpOwogCiAJLyoKIAkgKiBSdW4gYWxsIF9SRUcgbWV0aG9kcwpAQCAtMjUxLDEyICsyMzUsMTIgQEAKIAkgKiBjb250YWluIGV4ZWN1dGFibGUgQU1MIChzZWUgY2FsbCB0byBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyBiZWxvdykuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FERFJFU1NfU1BBQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJbSW5pdF0gRXhlY3V0aW5nIF9SRUcgb3BfcmVnaW9uIG1ldGhvZHNcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBFeGVjdXRpbmcgX1JFRyBvcF9yZWdpb24gbWV0aG9kc1xuIikpOwogCi0JCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zICgpOwotCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTI2NiwxMiArMjUwLDEyIEBACiAJICogb2JqZWN0czogb3BlcmF0aW9uX3JlZ2lvbnMsIGJ1ZmZlcl9maWVsZHMsIEJ1ZmZlcnMsIGFuZCBQYWNrYWdlcy4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fT0JKRUNUX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiW0luaXRdIENvbXBsZXRpbmcgSW5pdGlhbGl6YXRpb24gb2YgQUNQSSBPYmplY3RzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJbSW5pdF0gQ29tcGxldGluZyBJbml0aWFsaXphdGlvbiBvZiBBQ1BJIE9iamVjdHNcbiIpKTsKIAotCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0yODAsMTIgKzI2NCwxMiBAQAogCSAqIFRoaXMgcnVucyB0aGUgX1NUQSBhbmQgX0lOSSBtZXRob2RzLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19ERVZJQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJCSJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgRGV2aWNlc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIERldmljZXNcbiIpKTsKIAotCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAoKTsKLQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOworCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCkBAIC0yOTQsMTMgKzI3OCwxMiBAQAogCSAqIHRoZSB0YWJsZSBsb2FkIGZpbGxlZCB0aGVtIHVwIG1vcmUgdGhhbiB0aGV5IHdpbGwgYmUgYXQgcnVudGltZSAtLQogCSAqIHRodXMgd2FzdGluZyBub24tcGFnZWQgbWVtb3J5LgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMgKCk7CisJc3RhdHVzID0gYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cygpOwogCiAJYWNwaV9nYmxfc3RhcnR1cF9mbGFncyB8PSBBQ1BJX0lOSVRJQUxJWkVEX09LOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3Rlcm1pbmF0ZQpAQCAtMzEzLDE1ICsyOTYsMTEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90ZXJtaW5hdGUgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX3Rlcm1pbmF0ZSh2b2lkKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICBzdGF0dXM7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV90ZXJtaW5hdGUiKTsKLQorCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGVybWluYXRlIik7CiAKIAkvKiBUZXJtaW5hdGUgdGhlIEFNTCBEZWJ1Z2dlciBpZiBwcmVzZW50ICovCiAKQEAgLTMyOSwyOCArMzA4LDI1IEBACiAKIAkvKiBTaHV0ZG93biBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzICovCiAKLQlhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93biAoKTsKLQorCWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duKCk7CiAKIAkvKiBGcmVlIHRoZSBtdXRleCBvYmplY3RzICovCiAKLQlhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSAoKTsKLQorCWFjcGlfdXRfbXV0ZXhfdGVybWluYXRlKCk7CiAKICNpZmRlZiBBQ1BJX0RFQlVHR0VSCiAKIAkvKiBTaHV0IGRvd24gdGhlIGRlYnVnZ2VyICovCiAKLQlhY3BpX2RiX3Rlcm1pbmF0ZSAoKTsKKwlhY3BpX2RiX3Rlcm1pbmF0ZSgpOwogI2VuZGlmCiAKIAkvKiBOb3cgd2UgY2FuIHNodXRkb3duIHRoZSBPUy1kZXBlbmRlbnQgbGF5ZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfb3NfdGVybWluYXRlICgpOwotCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPSBhY3BpX29zX3Rlcm1pbmF0ZSgpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zNjYsMjAgKzM0MiwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3N1YnN5c3RlbV9zdGF0dXMgKAotCXZvaWQpCithY3BpX3N0YXR1cyBhY3BpX3N1YnN5c3RlbV9zdGF0dXModm9pZCkKIHsKIAogCWlmIChhY3BpX2dibF9zdGFydHVwX2ZsYWdzICYgQUNQSV9JTklUSUFMSVpFRF9PSykgewogCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcmV0dXJuIChBRV9FUlJPUik7CiAJfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3N5c3RlbV9pbmZvCkBAIC0zOTgsNjQgKzM3MCw2MCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9zeXN0ZW1faW5mbyAoCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqb3V0X2J1ZmZlcikKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3N5c3RlbV9pbmZvKHN0cnVjdCBhY3BpX2J1ZmZlciAqIG91dF9idWZmZXIpCiB7Ci0Jc3RydWN0IGFjcGlfc3lzdGVtX2luZm8gICAgICAgICAqaW5mb19wdHI7Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICppbmZvX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CiAKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9zeXN0ZW1faW5mbyIpOwotCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfc3lzdGVtX2luZm8iKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAob3V0X2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIob3V0X2J1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKG91dF9idWZmZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfc3lzdGVtX2luZm8pKTsKLQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKG91dF9idWZmZXIsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qCiAJICogUG9wdWxhdGUgdGhlIHJldHVybiBidWZmZXIKIAkgKi8KLQlpbmZvX3B0ciA9IChzdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbyAqKSBvdXRfYnVmZmVyLT5wb2ludGVyOworCWluZm9fcHRyID0gKHN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICopb3V0X2J1ZmZlci0+cG9pbnRlcjsKIAotCWluZm9fcHRyLT5hY3BpX2NhX3ZlcnNpb24gICA9IEFDUElfQ0FfVkVSU0lPTjsKKwlpbmZvX3B0ci0+YWNwaV9jYV92ZXJzaW9uID0gQUNQSV9DQV9WRVJTSU9OOwogCiAJLyogU3lzdGVtIGZsYWdzIChBQ1BJIGNhcGFiaWxpdGllcykgKi8KIAotCWluZm9fcHRyLT5mbGFncyAgICAgICAgICAgICA9IEFDUElfU1lTX01PREVfQUNQSTsKKwlpbmZvX3B0ci0+ZmxhZ3MgPSBBQ1BJX1NZU19NT0RFX0FDUEk7CiAKIAkvKiBUaW1lciByZXNvbHV0aW9uIC0gMjQgb3IgMzIgYml0cyAgKi8KIAogCWlmICghYWNwaV9nYmxfRkFEVCkgewogCQlpbmZvX3B0ci0+dGltZXJfcmVzb2x1dGlvbiA9IDA7Ci0JfQotCWVsc2UgaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKKwl9IGVsc2UgaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKIAkJaW5mb19wdHItPnRpbWVyX3Jlc29sdXRpb24gPSAyNDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaW5mb19wdHItPnRpbWVyX3Jlc29sdXRpb24gPSAzMjsKIAl9CiAKIAkvKiBDbGVhciB0aGUgcmVzZXJ2ZWQgZmllbGRzICovCiAKLQlpbmZvX3B0ci0+cmVzZXJ2ZWQxICAgICAgICAgPSAwOwotCWluZm9fcHRyLT5yZXNlcnZlZDIgICAgICAgICA9IDA7CisJaW5mb19wdHItPnJlc2VydmVkMSA9IDA7CisJaW5mb19wdHItPnJlc2VydmVkMiA9IDA7CiAKIAkvKiBDdXJyZW50IGRlYnVnIGxldmVscyAqLwogCi0JaW5mb19wdHItPmRlYnVnX2xheWVyICAgICAgID0gYWNwaV9kYmdfbGF5ZXI7Ci0JaW5mb19wdHItPmRlYnVnX2xldmVsICAgICAgID0gYWNwaV9kYmdfbGV2ZWw7CisJaW5mb19wdHItPmRlYnVnX2xheWVyID0gYWNwaV9kYmdfbGF5ZXI7CisJaW5mb19wdHItPmRlYnVnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7CiAKIAkvKiBDdXJyZW50IHN0YXR1cyBvZiB0aGUgQUNQSSB0YWJsZXMsIHBlciB0YWJsZSB0eXBlICovCiAKQEAgLTQ2NCwxMCArNDMyLDEwIEBACiAJCWluZm9fcHRyLT50YWJsZV9pbmZvW2ldLmNvdW50ID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0uY291bnQ7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfc3lzdGVtX2luZm8pOwogCitFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3N5c3RlbV9pbmZvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDg1LDkgKzQ1Myw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyICgKLQlhY3BpX2luaXRfaGFuZGxlciAgICAgICAgICAgICAgIGhhbmRsZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikKK2FjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbikKIHsKIAogCWlmICghaGFuZGxlcikgewpAQCAtNTAyLDcgKzQ2OCw3IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTUxNiwxOSArNDgyLDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzICgKLQl2b2lkKQorYWNwaV9zdGF0dXMgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyh2b2lkKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyIpOwogCi0KLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlX2NhY2hlICgpOwotCWFjcGlfdXRfZGVsZXRlX29iamVjdF9jYWNoZSAoKTsKLQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlX2NhY2hlICgpOwotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX2NhY2hlICgpOwotI2VuZGlmCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKKwkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKKwkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOworCSh2b2lkKWFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJKHZvaWQpYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlscy5jIGIvZHJpdmVycy9hY3BpL3V0aWxzLmMKaW5kZXggMWNlMjA0Ny4uNjQ1OGM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxzLmMKQEAgLTMwLDE1ICszMCwxMiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0KICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FCQkoImFjcGlfdXRpbHMiKQotCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3V0aWxzIikKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgRXZhbHVhdGlvbiBIZWxwZXJzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKICNkZWZpbmUgYWNwaV91dGlsX2V2YWxfZXJyb3IoaCxwLHMpIHtcCiAJY2hhciBwcmVmaXhbODBdID0geydcMCd9O1wKQEAgLTQ5LDI2ICs0NiwyNCBAQAogI2Vsc2UKICNkZWZpbmUgYWNwaV91dGlsX2V2YWxfZXJyb3IoaCxwLHMpCiAjZW5kaWYKLQotCiBhY3BpX3N0YXR1cwotYWNwaV9leHRyYWN0X3BhY2thZ2UgKAotCXVuaW9uIGFjcGlfb2JqZWN0CSpwYWNrYWdlLAotCXN0cnVjdCBhY3BpX2J1ZmZlcgkqZm9ybWF0LAotCXN0cnVjdCBhY3BpX2J1ZmZlcgkqYnVmZmVyKQorYWNwaV9leHRyYWN0X3BhY2thZ2UodW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UsCisJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpmb3JtYXQsIHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKQogewotCXUzMgkJCXNpemVfcmVxdWlyZWQgPSAwOwotCXUzMgkJCXRhaWxfb2Zmc2V0ID0gMDsKLQljaGFyCQkJKmZvcm1hdF9zdHJpbmcgPSBOVUxMOwotCXUzMgkJCWZvcm1hdF9jb3VudCA9IDA7Ci0JdTMyCQkJaSA9IDA7Ci0JdTgJCQkqaGVhZCA9IE5VTEw7Ci0JdTgJCQkqdGFpbCA9IE5VTEw7CisJdTMyIHNpemVfcmVxdWlyZWQgPSAwOworCXUzMiB0YWlsX29mZnNldCA9IDA7CisJY2hhciAqZm9ybWF0X3N0cmluZyA9IE5VTEw7CisJdTMyIGZvcm1hdF9jb3VudCA9IDA7CisJdTMyIGkgPSAwOworCXU4ICpoZWFkID0gTlVMTDsKKwl1OCAqdGFpbCA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2V4dHJhY3RfcGFja2FnZSIpOwogCi0JaWYgKCFwYWNrYWdlIHx8IChwYWNrYWdlLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKSB8fCAocGFja2FnZS0+cGFja2FnZS5jb3VudCA8IDEpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgJ3BhY2thZ2UnIGFyZ3VtZW50XG4iKSk7CisJaWYgKCFwYWNrYWdlIHx8IChwYWNrYWdlLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKQorCSAgICB8fCAocGFja2FnZS0+cGFja2FnZS5jb3VudCA8IDEpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkgICJJbnZhbGlkICdwYWNrYWdlJyBhcmd1bWVudFxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC04MiwxOCArNzcsMjAgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWZvcm1hdF9jb3VudCA9IChmb3JtYXQtPmxlbmd0aC9zaXplb2YoY2hhcikpIC0gMTsKKwlmb3JtYXRfY291bnQgPSAoZm9ybWF0LT5sZW5ndGggLyBzaXplb2YoY2hhcikpIC0gMTsKIAlpZiAoZm9ybWF0X2NvdW50ID4gcGFja2FnZS0+cGFja2FnZS5jb3VudCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJGb3JtYXQgc3BlY2lmaWVzIG1vcmUgb2JqZWN0cyBbJWRdIHRoYW4gZXhpc3QgaW4gcGFja2FnZSBbJWRdLiIsIGZvcm1hdF9jb3VudCwgcGFja2FnZS0+cGFja2FnZS5jb3VudCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCisJCQkJICAiRm9ybWF0IHNwZWNpZmllcyBtb3JlIG9iamVjdHMgWyVkXSB0aGFuIGV4aXN0IGluIHBhY2thZ2UgWyVkXS4iLAorCQkJCSAgZm9ybWF0X2NvdW50LCBwYWNrYWdlLT5wYWNrYWdlLmNvdW50KSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7CiAJfQogCi0JZm9ybWF0X3N0cmluZyA9IChjaGFyKilmb3JtYXQtPnBvaW50ZXI7CisJZm9ybWF0X3N0cmluZyA9IChjaGFyICopZm9ybWF0LT5wb2ludGVyOwogCiAJLyoKIAkgKiBDYWxjdWxhdGUgc2l6ZV9yZXF1aXJlZC4KIAkgKi8KLQlmb3IgKGk9MDsgaTxmb3JtYXRfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBmb3JtYXRfY291bnQ7IGkrKykgewogCiAJCXVuaW9uIGFjcGlfb2JqZWN0ICplbGVtZW50ID0gJihwYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKIApAQCAtMTEwLDExICsxMDcsMTUgQEAKIAkJCQl0YWlsX29mZnNldCArPSBzaXplb2YoYWNwaV9pbnRlZ2VyKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ1MnOgotCQkJCXNpemVfcmVxdWlyZWQgKz0gc2l6ZW9mKGNoYXIqKSArIHNpemVvZihhY3BpX2ludGVnZXIpICsgc2l6ZW9mKGNoYXIpOwotCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZihjaGFyKik7CisJCQkJc2l6ZV9yZXF1aXJlZCArPQorCQkJCSAgICBzaXplb2YoY2hhciAqKSArIHNpemVvZihhY3BpX2ludGVnZXIpICsKKwkJCQkgICAgc2l6ZW9mKGNoYXIpOworCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZihjaGFyICopOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJJbnZhbGlkIHBhY2thZ2UgZWxlbWVudCBbJWRdOiBnb3QgbnVtYmVyLCBleHBlY2luZyBbJWNdLlxuIiwgaSwgZm9ybWF0X3N0cmluZ1tpXSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKKwkJCQkJCSAgIkludmFsaWQgcGFja2FnZSBlbGVtZW50IFslZF06IGdvdCBudW1iZXIsIGV4cGVjaW5nIFslY10uXG4iLAorCQkJCQkJICBpLCBmb3JtYXRfc3RyaW5nW2ldKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEyNCwxNSArMTI1LDIyIEBACiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAkJCXN3aXRjaCAoZm9ybWF0X3N0cmluZ1tpXSkgewogCQkJY2FzZSAnUyc6Ci0JCQkJc2l6ZV9yZXF1aXJlZCArPSBzaXplb2YoY2hhciopICsgKGVsZW1lbnQtPnN0cmluZy5sZW5ndGggKiBzaXplb2YoY2hhcikpICsgc2l6ZW9mKGNoYXIpOwotCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZihjaGFyKik7CisJCQkJc2l6ZV9yZXF1aXJlZCArPQorCQkJCSAgICBzaXplb2YoY2hhciAqKSArCisJCQkJICAgIChlbGVtZW50LT5zdHJpbmcubGVuZ3RoICogc2l6ZW9mKGNoYXIpKSArCisJCQkJICAgIHNpemVvZihjaGFyKTsKKwkJCQl0YWlsX29mZnNldCArPSBzaXplb2YoY2hhciAqKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgJ0InOgotCQkJCXNpemVfcmVxdWlyZWQgKz0gc2l6ZW9mKHU4KikgKyAoZWxlbWVudC0+YnVmZmVyLmxlbmd0aCAqIHNpemVvZih1OCkpOwotCQkJCXRhaWxfb2Zmc2V0ICs9IHNpemVvZih1OCopOworCQkJCXNpemVfcmVxdWlyZWQgKz0KKwkJCQkgICAgc2l6ZW9mKHU4ICopICsKKwkJCQkgICAgKGVsZW1lbnQtPmJ1ZmZlci5sZW5ndGggKiBzaXplb2YodTgpKTsKKwkJCQl0YWlsX29mZnNldCArPSBzaXplb2YodTggKik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkludmFsaWQgcGFja2FnZSBlbGVtZW50IFslZF0gZ290IHN0cmluZy9idWZmZXIsIGV4cGVjaW5nIFslY10uXG4iLCBpLCBmb3JtYXRfc3RyaW5nW2ldKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkJICAiSW52YWxpZCBwYWNrYWdlIGVsZW1lbnQgWyVkXSBnb3Qgc3RyaW5nL2J1ZmZlciwgZXhwZWNpbmcgWyVjXS5cbiIsCisJCQkJCQkgIGksIGZvcm1hdF9zdHJpbmdbaV0pKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTQwLDcgKzE0OCw5IEBACiAKIAkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAkJZGVmYXVsdDoKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIHVuc3VwcG9ydGVkIGVsZW1lbnQgYXQgaW5kZXg9JWRcbiIsIGkpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRm91bmQgdW5zdXBwb3J0ZWQgZWxlbWVudCBhdCBpbmRleD0lZFxuIiwKKwkJCQkJICBpKSk7CiAJCQkvKiBUQkQ6IGhhbmRsZSBuZXN0ZWQgcGFja2FnZXMuLi4gKi8KIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKIAkJCWJyZWFrOwpAQCAtMTUzLDggKzE2Myw3IEBACiAJaWYgKGJ1ZmZlci0+bGVuZ3RoIDwgc2l6ZV9yZXF1aXJlZCkgewogCQlidWZmZXItPmxlbmd0aCA9IHNpemVfcmVxdWlyZWQ7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CVUZGRVJfT1ZFUkZMT1cpOwotCX0KLQllbHNlIGlmIChidWZmZXItPmxlbmd0aCAhPSBzaXplX3JlcXVpcmVkIHx8ICFidWZmZXItPnBvaW50ZXIpIHsKKwl9IGVsc2UgaWYgKGJ1ZmZlci0+bGVuZ3RoICE9IHNpemVfcmVxdWlyZWQgfHwgIWJ1ZmZlci0+cG9pbnRlcikgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC0xNjQsNyArMTczLDcgQEAKIAkvKgogCSAqIEV4dHJhY3QgcGFja2FnZSBkYXRhLgogCSAqLwotCWZvciAoaT0wOyBpPGZvcm1hdF9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGZvcm1hdF9jb3VudDsgaSsrKSB7CiAKIAkJdTggKipwb2ludGVyID0gTlVMTDsKIAkJdW5pb24gYWNwaV9vYmplY3QgKmVsZW1lbnQgPSAmKHBhY2thZ2UtPnBhY2thZ2UuZWxlbWVudHNbaV0pOwpAQCAtMTc4LDE0ICsxODcsMTYgQEAKIAkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJCXN3aXRjaCAoZm9ybWF0X3N0cmluZ1tpXSkgewogCQkJY2FzZSAnTic6Ci0JCQkJKigoYWNwaV9pbnRlZ2VyKiloZWFkKSA9IGVsZW1lbnQtPmludGVnZXIudmFsdWU7CisJCQkJKigoYWNwaV9pbnRlZ2VyICopIGhlYWQpID0KKwkJCQkgICAgZWxlbWVudC0+aW50ZWdlci52YWx1ZTsKIAkJCQloZWFkICs9IHNpemVvZihhY3BpX2ludGVnZXIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnUyc6Ci0JCQkJcG9pbnRlciA9ICh1OCoqKWhlYWQ7CisJCQkJcG9pbnRlciA9ICh1OCAqKikgaGVhZDsKIAkJCQkqcG9pbnRlciA9IHRhaWw7Ci0JCQkJKigoYWNwaV9pbnRlZ2VyKil0YWlsKSA9IGVsZW1lbnQtPmludGVnZXIudmFsdWU7Ci0JCQkJaGVhZCArPSBzaXplb2YoYWNwaV9pbnRlZ2VyKik7CisJCQkJKigoYWNwaV9pbnRlZ2VyICopIHRhaWwpID0KKwkJCQkgICAgZWxlbWVudC0+aW50ZWdlci52YWx1ZTsKKwkJCQloZWFkICs9IHNpemVvZihhY3BpX2ludGVnZXIgKik7CiAJCQkJdGFpbCArPSBzaXplb2YoYWNwaV9pbnRlZ2VyKTsKIAkJCQkvKiBOVUxMIHRlcm1pbmF0ZSBzdHJpbmcgKi8KIAkJCQkqdGFpbCA9IChjaGFyKTA7CkBAIC0yMDEsMjAgKzIxMiwyMiBAQAogCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAJCQlzd2l0Y2ggKGZvcm1hdF9zdHJpbmdbaV0pIHsKIAkJCWNhc2UgJ1MnOgotCQkJCXBvaW50ZXIgPSAodTgqKiloZWFkOworCQkJCXBvaW50ZXIgPSAodTggKiopIGhlYWQ7CiAJCQkJKnBvaW50ZXIgPSB0YWlsOwotCQkJCW1lbWNweSh0YWlsLCBlbGVtZW50LT5zdHJpbmcucG9pbnRlciwgZWxlbWVudC0+c3RyaW5nLmxlbmd0aCk7Ci0JCQkJaGVhZCArPSBzaXplb2YoY2hhciopOworCQkJCW1lbWNweSh0YWlsLCBlbGVtZW50LT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgICAgZWxlbWVudC0+c3RyaW5nLmxlbmd0aCk7CisJCQkJaGVhZCArPSBzaXplb2YoY2hhciAqKTsKIAkJCQl0YWlsICs9IGVsZW1lbnQtPnN0cmluZy5sZW5ndGggKiBzaXplb2YoY2hhcik7CiAJCQkJLyogTlVMTCB0ZXJtaW5hdGUgc3RyaW5nICovCiAJCQkJKnRhaWwgPSAoY2hhcikwOwogCQkJCXRhaWwgKz0gc2l6ZW9mKGNoYXIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnQic6Ci0JCQkJcG9pbnRlciA9ICh1OCoqKWhlYWQ7CisJCQkJcG9pbnRlciA9ICh1OCAqKikgaGVhZDsKIAkJCQkqcG9pbnRlciA9IHRhaWw7Ci0JCQkJbWVtY3B5KHRhaWwsIGVsZW1lbnQtPmJ1ZmZlci5wb2ludGVyLCBlbGVtZW50LT5idWZmZXIubGVuZ3RoKTsKLQkJCQloZWFkICs9IHNpemVvZih1OCopOworCQkJCW1lbWNweSh0YWlsLCBlbGVtZW50LT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgICAgZWxlbWVudC0+YnVmZmVyLmxlbmd0aCk7CisJCQkJaGVhZCArPSBzaXplb2YodTggKik7CiAJCQkJdGFpbCArPSBlbGVtZW50LT5idWZmZXIubGVuZ3RoICogc2l6ZW9mKHU4KTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CkBAIC0yMzMsMTkgKzI0NiwxNyBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2V4dHJhY3RfcGFja2FnZSk7CiAKLQogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfaW50ZWdlciAoCi0JYWNwaV9oYW5kbGUJCWhhbmRsZSwKLQlhY3BpX3N0cmluZwkJcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJKmFyZ3VtZW50cywKLQl1bnNpZ25lZCBsb25nCQkqZGF0YSkKK2FjcGlfZXZhbHVhdGVfaW50ZWdlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCSAgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgICBzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqYXJndW1lbnRzLCB1bnNpZ25lZCBsb25nICpkYXRhKQogewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplbGVtZW50OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7MCxOVUxMfTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCAqZWxlbWVudDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAwLCBOVUxMIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2V2YWx1YXRlX2ludGVnZXIiKTsKIApAQCAtMjUzLDcgKzI2NCw3IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAogCWVsZW1lbnQgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOwotCWlmKCFlbGVtZW50KQorCWlmICghZWxlbWVudCkKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAKIAltZW1zZXQoZWxlbWVudCwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSk7CkBAIC0yNzcsMjAgKzI4OCwxOCBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKTsKIAorRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX2ludGVnZXIpOwogCiAjaWYgMAogYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfc3RyaW5nICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCWFjcGlfc3RyaW5nCQlwYXRobmFtZSwKLQlhY3BpX29iamVjdF9saXN0CSphcmd1bWVudHMsCi0JYWNwaV9zdHJpbmcJCSpkYXRhKQorYWNwaV9ldmFsdWF0ZV9zdHJpbmcoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgIGFjcGlfb2JqZWN0X2xpc3QgKiBhcmd1bWVudHMsIGFjcGlfc3RyaW5nICogZGF0YSkKIHsKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX29iamVjdCAgICAgICAgICAgICAqZWxlbWVudCA9IE5VTEw7Ci0JYWNwaV9idWZmZXIJCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9vYmplY3QgKmVsZW1lbnQgPSBOVUxMOworCWFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZXZhbHVhdGVfc3RyaW5nIik7CiAKQEAgLTMwNSw5ICszMTQsOSBAQAogCiAJZWxlbWVudCA9IChhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKIAotCWlmICgoZWxlbWVudC0+dHlwZSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSAKLQkJfHwgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKLQkJfHwgIWVsZW1lbnQtPnN0cmluZy5sZW5ndGgpIHsKKwlpZiAoKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX1NUUklORykKKwkgICAgfHwgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKKwkgICAgfHwgIWVsZW1lbnQtPnN0cmluZy5sZW5ndGgpIHsKIAkJYWNwaV91dGlsX2V2YWxfZXJyb3IoaGFuZGxlLCBwYXRobmFtZSwgQUVfQkFEX0RBVEEpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCX0KQEAgLTMyOSwxOSArMzM4LDE3IEBACiB9CiAjZW5kaWYKIAotCiBhY3BpX3N0YXR1cwotYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JYWNwaV9zdHJpbmcJCXBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CSphcmd1bWVudHMsCi0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QJKmxpc3QpCithY3BpX2V2YWx1YXRlX3JlZmVyZW5jZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQlhY3BpX3N0cmluZyBwYXRobmFtZSwKKwkJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICphcmd1bWVudHMsCisJCQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCAqbGlzdCkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vYmplY3QJKnBhY2thZ2UgPSBOVUxMOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplbGVtZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIJYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQl1MzIJCQlpID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZSA9IE5VTEw7CisJdW5pb24gYWNwaV9vYmplY3QgKmVsZW1lbnQgPSBOVUxMOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdTMyIGkgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UiKTsKIApAQCAtMzU1LDI4ICszNjIsMjggQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gZW5kOwogCi0JcGFja2FnZSA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlwYWNrYWdlID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CiAKIAlpZiAoKGJ1ZmZlci5sZW5ndGggPT0gMCkgfHwgIXBhY2thZ2UpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiTm8gcmV0dXJuIG9iamVjdCAobGVuICVYIHB0ciAlcClcbiIsIAotCQkJKHVuc2lnbmVkKWJ1ZmZlci5sZW5ndGgsIHBhY2thZ2UpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJObyByZXR1cm4gb2JqZWN0IChsZW4gJVggcHRyICVwKVxuIiwKKwkJCQkgICh1bnNpZ25lZClidWZmZXIubGVuZ3RoLCBwYWNrYWdlKSk7CiAJCXN0YXR1cyA9IEFFX0JBRF9EQVRBOwogCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOwogCQlnb3RvIGVuZDsKIAl9CiAJaWYgKHBhY2thZ2UtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgCi0JCQkiRXhwZWN0aW5nIGEgW1BhY2thZ2VdLCBmb3VuZCB0eXBlICVYXG4iLCAKLQkJCXBhY2thZ2UtPnR5cGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFeHBlY3RpbmcgYSBbUGFja2FnZV0sIGZvdW5kIHR5cGUgJVhcbiIsCisJCQkJICBwYWNrYWdlLT50eXBlKSk7CiAJCXN0YXR1cyA9IEFFX0JBRF9EQVRBOwogCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOwogCQlnb3RvIGVuZDsKIAl9CiAJaWYgKCFwYWNrYWdlLT5wYWNrYWdlLmNvdW50KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAotCQkJIltQYWNrYWdlXSBoYXMgemVybyBlbGVtZW50cyAoJXApXG4iLCAKLQkJCXBhY2thZ2UpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJbUGFja2FnZV0gaGFzIHplcm8gZWxlbWVudHMgKCVwKVxuIiwKKwkJCQkgIHBhY2thZ2UpKTsKIAkJc3RhdHVzID0gQUVfQkFEX0RBVEE7CiAJCWFjcGlfdXRpbF9ldmFsX2Vycm9yKGhhbmRsZSwgcGF0aG5hbWUsIHN0YXR1cyk7CiAJCWdvdG8gZW5kOwpAQCAtMzk1LDkgKzQwMiw5IEBACiAKIAkJaWYgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgewogCQkJc3RhdHVzID0gQUVfQkFEX0RBVEE7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAKLQkJCQkiRXhwZWN0aW5nIGEgW1JlZmVyZW5jZV0gcGFja2FnZSBlbGVtZW50LCBmb3VuZCB0eXBlICVYXG4iLAotCQkJCWVsZW1lbnQtPnR5cGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJCSAgIkV4cGVjdGluZyBhIFtSZWZlcmVuY2VdIHBhY2thZ2UgZWxlbWVudCwgZm91bmQgdHlwZSAlWFxuIiwKKwkJCQkJICBlbGVtZW50LT50eXBlKSk7CiAJCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQwNiwxMCArNDEzLDEwIEBACiAKIAkJbGlzdC0+aGFuZGxlc1tpXSA9IGVsZW1lbnQtPnJlZmVyZW5jZS5oYW5kbGU7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIHJlZmVyZW5jZSBbJXBdXG4iLAotCQkJbGlzdC0+aGFuZGxlc1tpXSkpOworCQkJCSAgbGlzdC0+aGFuZGxlc1tpXSkpOwogCX0KIAotZW5kOgorICAgICAgZW5kOgogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlsaXN0LT5jb3VudCA9IDA7CiAJCS8va2ZyZWUobGlzdC0+aGFuZGxlcyk7CkBAIC00MTksNSArNDI2LDUgQEAKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCAyY2YyNjRmLi5lMzgzZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtNTMsMjEgKzUzLDIwIEBACiAjZGVmaW5lIEFDUElfVklERU9fTk9USUZZX1pFUk9fQlJJR0hUTkVTUwkweDg1CiAjZGVmaW5lIEFDUElfVklERU9fTk9USUZZX0RJU1BMQVlfT0ZGCQkweDg2CiAKLQogI2RlZmluZSBBQ1BJX1ZJREVPX0hFQURfSU5WQUxJRAkJKH4wdSAtIDEpCiAjZGVmaW5lIEFDUElfVklERU9fSEVBRF9FTkQJCSh+MHUpCiAKLQogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1ZJREVPX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRQkJKCJhY3BpX3ZpZGVvIikKK0FDUElfTU9EVUxFX05BTUUoImFjcGlfdmlkZW8iKQogCi1NT0RVTEVfQVVUSE9SKCJCcnVubyBEdWNyb3QiKTsKKyAgICBNT0RVTEVfQVVUSE9SKCJCcnVubyBEdWNyb3QiKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX1ZJREVPX0RSSVZFUl9OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19tYXRjaCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX21hdGNoKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3ZpZGVvX2J1cyA9IHsKIAkubmFtZSA9IEFDUElfVklERU9fRFJJVkVSX05BTUUsCkBAIC03NiwxODcgKzc1LDE5MiBAQAogCQkuYWRkID0gYWNwaV92aWRlb19idXNfYWRkLAogCQkucmVtb3ZlID0gYWNwaV92aWRlb19idXNfcmVtb3ZlLAogCQkubWF0Y2ggPSBhY3BpX3ZpZGVvX2J1c19tYXRjaCwKLQl9LAorCQl9LAogfTsKIAogc3RydWN0IGFjcGlfdmlkZW9fYnVzX2ZsYWdzIHsKLQl1OAltdWx0aWhlYWQ6MTsJLyogY2FuIHN3aXRjaCB2aWRlbyBoZWFkcyAqLwotCXU4CXJvbToxOwkJLyogY2FuIHJldHJpZXZlIGEgdmlkZW8gcm9tICovCi0JdTgJcG9zdDoxOwkJLyogY2FuIGNvbmZpZ3VyZSB0aGUgaGVhZCB0byAqLwotCXU4CXJlc2VydmVkOjU7CisJdTggbXVsdGloZWFkOjE7CQkvKiBjYW4gc3dpdGNoIHZpZGVvIGhlYWRzICovCisJdTggcm9tOjE7CQkvKiBjYW4gcmV0cmlldmUgYSB2aWRlbyByb20gKi8KKwl1OCBwb3N0OjE7CQkvKiBjYW4gY29uZmlndXJlIHRoZSBoZWFkIHRvICovCisJdTggcmVzZXJ2ZWQ6NTsKIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2J1c19jYXAgewotCXU4CV9ET1M6MTsgLypFbmFibGUvRGlzYWJsZSBvdXRwdXQgc3dpdGNoaW5nKi8KLQl1OAlfRE9EOjE7IC8qRW51bWVyYXRlIGFsbCBkZXZpY2VzIGF0dGFjaGVkIHRvIGRpc3BsYXkgYWRhcHRlciovCi0JdTgJX1JPTToxOyAvKkdldCBST00gRGF0YSovCi0JdTgJX0dQRDoxOyAvKkdldCBQT1NUIERldmljZSovCi0JdTgJX1NQRDoxOyAvKlNldCBQT1NUIERldmljZSovCi0JdTgJX1ZQTzoxOyAvKlZpZGVvIFBPU1QgT3B0aW9ucyovCi0JdTgJcmVzZXJ2ZWQ6MjsKKwl1OCBfRE9TOjE7CQkvKkVuYWJsZS9EaXNhYmxlIG91dHB1dCBzd2l0Y2hpbmcgKi8KKwl1OCBfRE9EOjE7CQkvKkVudW1lcmF0ZSBhbGwgZGV2aWNlcyBhdHRhY2hlZCB0byBkaXNwbGF5IGFkYXB0ZXIgKi8KKwl1OCBfUk9NOjE7CQkvKkdldCBST00gRGF0YSAqLworCXU4IF9HUEQ6MTsJCS8qR2V0IFBPU1QgRGV2aWNlICovCisJdTggX1NQRDoxOwkJLypTZXQgUE9TVCBEZXZpY2UgKi8KKwl1OCBfVlBPOjE7CQkvKlZpZGVvIFBPU1QgT3B0aW9ucyAqLworCXU4IHJlc2VydmVkOjI7CiB9OwogCi1zdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYXR0cmliewotCXUzMglkaXNwbGF5X2luZGV4OjQ7IC8qIEEgemVyby1iYXNlZCBpbnN0YW5jZSBvZiB0aGUgRGlzcGxheSovCi0JdTMyCWRpc3BsYXlfcG9ydF9hdHRhY2htZW50OjQ7IC8qVGhpcyBmaWVsZCBkaWZmZXJlbmF0ZXMgZGlzcGxheXMgdHlwZSovCi0JdTMyCWRpc3BsYXlfdHlwZTo0OwkvKkRlc2NyaWJlIHRoZSBzcGVjaWZpYyB0eXBlIGluIHVzZSovCi0JdTMyCXZlbmRvcl9zcGVjaWZpYzo0OyAvKkNoaXBzZXQgVmVuZG9yIFNwZWNpZmkqLyAKLQl1MzIJYmlvc19jYW5fZGV0ZWN0OjE7IC8qQklPUyBjYW4gZGV0ZWN0IHRoZSBkZXZpY2UqLwotCXUzMglkZXBlbmRfb25fdmdhOjE7IC8qTm9uLVZHQSBvdXRwdXQgZGV2aWNlIHdob3NlIHBvd2VyIGlzIHJlbGF0ZWQgdG8gCi0JCQkJICAgdGhlIFZHQSBkZXZpY2UuKi8KLQl1MzIJcGlwZV9pZDozOyAvKkZvciBWR0EgbXVsdGlwbGUtaGVhZCBkZXZpY2VzLiovCi0JdTMyCXJlc2VydmVkOjEwOyAvKk11c3QgYmUgMCovCi0JdTMyCWRldmljZV9pZF9zY2hlbWU6MTsgLypEZXZpY2UgSUQgU2NoZW1lKi8KK3N0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9hdHRyaWIgeworCXUzMiBkaXNwbGF5X2luZGV4OjQ7CS8qIEEgemVyby1iYXNlZCBpbnN0YW5jZSBvZiB0aGUgRGlzcGxheSAqLworCXUzMiBkaXNwbGF5X3BvcnRfYXR0YWNobWVudDo0OwkvKlRoaXMgZmllbGQgZGlmZmVyZW5hdGVzIGRpc3BsYXlzIHR5cGUgKi8KKwl1MzIgZGlzcGxheV90eXBlOjQ7CS8qRGVzY3JpYmUgdGhlIHNwZWNpZmljIHR5cGUgaW4gdXNlICovCisJdTMyIHZlbmRvcl9zcGVjaWZpYzo0OwkvKkNoaXBzZXQgVmVuZG9yIFNwZWNpZmkgKi8KKwl1MzIgYmlvc19jYW5fZGV0ZWN0OjE7CS8qQklPUyBjYW4gZGV0ZWN0IHRoZSBkZXZpY2UgKi8KKwl1MzIgZGVwZW5kX29uX3ZnYToxOwkvKk5vbi1WR0Egb3V0cHV0IGRldmljZSB3aG9zZSBwb3dlciBpcyByZWxhdGVkIHRvIAorCQkJCSAgIHRoZSBWR0EgZGV2aWNlLiAqLworCXUzMiBwaXBlX2lkOjM7CQkvKkZvciBWR0EgbXVsdGlwbGUtaGVhZCBkZXZpY2VzLiAqLworCXUzMiByZXNlcnZlZDoxMDsJLypNdXN0IGJlIDAgKi8KKwl1MzIgZGV2aWNlX2lkX3NjaGVtZToxOwkvKkRldmljZSBJRCBTY2hlbWUgKi8KIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2VudW1lcmF0ZWRfZGV2aWNlIHsKIAl1bmlvbiB7CiAJCXUzMiBpbnRfdmFsOwotCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYXR0cmliCWF0dHJpYjsKKwkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2F0dHJpYiBhdHRyaWI7CiAJfSB2YWx1ZTsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmJpbmRfaW5mbzsKIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyB7Ci0JYWNwaV9oYW5kbGUJaGFuZGxlOwotCXU4CWRvc19zZXR0aW5nOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1OCBkb3Nfc2V0dGluZzsKIAlzdHJ1Y3QgYWNwaV92aWRlb19lbnVtZXJhdGVkX2RldmljZSAqYXR0YWNoZWRfYXJyYXk7Ci0JdTgJCQlhdHRhY2hlZF9jb3VudDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXNfY2FwCWNhcDsKKwl1OCBhdHRhY2hlZF9jb3VudDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXNfY2FwIGNhcDsKIAlzdHJ1Y3QgYWNwaV92aWRlb19idXNfZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzZW07Ci0Jc3RydWN0IGxpc3RfaGVhZAl2aWRlb19kZXZpY2VfbGlzdDsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgCSpkaXI7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJc3RydWN0IGxpc3RfaGVhZCB2aWRlb19kZXZpY2VfbGlzdDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcjsKIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9mbGFncyB7Ci0JdTgJY3J0OjE7Ci0JdTgJbGNkOjE7Ci0JdTgJdHZvdXQ6MTsKLQl1OAliaW9zOjE7Ci0JdTgJdW5rbm93bjoxOwotCXU4CXJlc2VydmVkOjM7CisJdTggY3J0OjE7CisJdTggbGNkOjE7CisJdTggdHZvdXQ6MTsKKwl1OCBiaW9zOjE7CisJdTggdW5rbm93bjoxOworCXU4IHJlc2VydmVkOjM7CiB9OwogCiBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfY2FwIHsKLQl1OAlfQURSOjE7CS8qUmV0dXJuIHRoZSB1bmlxdWUgSUQgKi8KLQl1OAlfQkNMOjE7IC8qUXVlcnkgbGlzdCBvZiBicmlnaHRuZXNzIGNvbnRyb2wgbGV2ZWxzIHN1cHBvcnRlZCovCi0JdTgJX0JDTToxOyAvKlNldCB0aGUgYnJpZ2h0bmVzcyBsZXZlbCovCi0JdTgJX0REQzoxOyAvKlJldHVybiB0aGUgRURJRCBmb3IgdGhpcyBkZXZpY2UqLwotCXU4CV9EQ1M6MTsgLypSZXR1cm4gc3RhdHVzIG9mIG91dHB1dCBkZXZpY2UqLwotCXU4CV9ER1M6MTsgLypRdWVyeSBncmFwaGljcyBzdGF0ZSovCi0JdTgJX0RTUzoxOyAvKkRldmljZSBzdGF0ZSBzZXQqLwotCXU4CV9yZXNlcnZlZDoxOworCXU4IF9BRFI6MTsJCS8qUmV0dXJuIHRoZSB1bmlxdWUgSUQgKi8KKwl1OCBfQkNMOjE7CQkvKlF1ZXJ5IGxpc3Qgb2YgYnJpZ2h0bmVzcyBjb250cm9sIGxldmVscyBzdXBwb3J0ZWQgKi8KKwl1OCBfQkNNOjE7CQkvKlNldCB0aGUgYnJpZ2h0bmVzcyBsZXZlbCAqLworCXU4IF9EREM6MTsJCS8qUmV0dXJuIHRoZSBFRElEIGZvciB0aGlzIGRldmljZSAqLworCXU4IF9EQ1M6MTsJCS8qUmV0dXJuIHN0YXR1cyBvZiBvdXRwdXQgZGV2aWNlICovCisJdTggX0RHUzoxOwkJLypRdWVyeSBncmFwaGljcyBzdGF0ZSAqLworCXU4IF9EU1M6MTsJCS8qRGV2aWNlIHN0YXRlIHNldCAqLworCXU4IF9yZXNlcnZlZDoxOwogfTsKIAogc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3MgewotCWludAljdXJyOwotCWludAljb3VudDsKLQlpbnQJKmxldmVsczsKKwlpbnQgY3VycjsKKwlpbnQgY291bnQ7CisJaW50ICpsZXZlbHM7CiB9OwogCiBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JdW5zaWduZWQgbG9uZwkJZGV2aWNlX2lkOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9mbGFncwlmbGFnczsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfY2FwCWNhcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW87Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXY7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgZGV2aWNlX2lkOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9mbGFncyBmbGFnczsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfY2FwIGNhcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW87CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7CiAJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3MgKmJyaWdodG5lc3M7CiB9OwogCi0KIC8qIGJ1cyAqLwogc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV92aWRlb19idXNfaW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fYnVzX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19idXNfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19ST01fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2J1c19ST01fZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3ZpZGVvX2J1c19ST01fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19idXNfUk9NX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3ZpZGVvX2J1c19QT1NUX2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdmlkZW9fYnVzX1BPU1RfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3ZpZGVvX2J1c19QT1NUX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdmlkZW9fYnVzX1BPU1Rfb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLQogc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19ET1Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2J1c19ET1NfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX3ZpZGVvX2J1c19ET1Nfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19idXNfRE9TX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCiAvKiBkZXZpY2UgKi8KLXN0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV92aWRlb19kZXZpY2VfaW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fZGV2aWNlX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19kZXZpY2VfaW5mb19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9zdGF0ZV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2RldmljZV9zdGF0ZV9mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX29wZW5fZnMsCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3BlbiA9IGFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5vcGVuID0gYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3ZpZGVvX2RldmljZV9FRElEX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gYWNwaV92aWRlb19kZXZpY2VfRURJRF9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLm9wZW4gPSBhY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgY2hhcglkZXZpY2VfZGVjb2RlW11bMzBdID0geworc3RhdGljIGNoYXIgZGV2aWNlX2RlY29kZVtdWzMwXSA9IHsKIAkibW90aGVyYm9hcmQgVkdBIGRldmljZSIsCiAJIlBDSSBWR0EgZGV2aWNlIiwKIAkiQUdQIFZHQSBkZXZpY2UiLAogCSJVTktOT1dOIiwKIH07CiAKLXN0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX25vdGlmeSAoIGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX3JlYmluZCggc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyk7Ci1zdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX2RldmljZV9iaW5kKCBzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYWNwaV92aWRlb19kZXZpY2VfcmViaW5kKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8pOworc3RhdGljIHZvaWQgYWNwaV92aWRlb19kZXZpY2VfYmluZChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLAorCQkJCSAgIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfZW51bWVyYXRlKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8pOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQoIHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8sIGludAlldmVudCk7Ci1zdGF0aWMgaW50IGFjcGlfdmlkZW9fZ2V0X25leHRfbGV2ZWwoIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLCB1MzIgbGV2ZWxfY3VycmVudCx1MzIgZXZlbnQpOwotc3RhdGljIHZvaWQgYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyAoIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLCBpbnQgZXZlbnQpOwotCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fc3dpdGNoX291dHB1dChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBpbnQgZXZlbnQpOworc3RhdGljIGludCBhY3BpX3ZpZGVvX2dldF9uZXh0X2xldmVsKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgdTMyIGxldmVsX2N1cnJlbnQsIHUzMiBldmVudCk7CitzdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkJCQkgaW50IGV2ZW50KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBNYW5hZ2VtZW50CkBAIC0yNjUsMTEgKzI2OSw5IEBACiAvKiBkZXZpY2UgKi8KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfcXVlcnkgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuc2lnbmVkIGxvbmcJCQkqc3RhdGUpCithY3BpX3ZpZGVvX2RldmljZV9xdWVyeShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyAqc3RhdGUpCiB7Ci0JaW50CQkJc3RhdHVzOworCWludCBzdGF0dXM7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfcXVlcnkiKTsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfREdTIiwgTlVMTCwgc3RhdGUpOwogCkBAIC0yNzcsMTEgKzI3OSwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuc2lnbmVkIGxvbmcgCQkqc3RhdGUpCithY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqc3RhdGUpCiB7Ci0JaW50CQkJc3RhdHVzOworCWludCBzdGF0dXM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUiKTsKIApAQCAtMjkxLDMxICsyOTIsMjggQEAKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2Vfc2V0X3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldmljZSwKLQlpbnQJCQlzdGF0ZSkKK2FjcGlfdmlkZW9fZGV2aWNlX3NldF9zdGF0ZShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQogewotCWludAkJCXN0YXR1czsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKKwl1bnNpZ25lZCBsb25nIHJldDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX3NldF9zdGF0ZSIpOwogCiAJYXJnMC5pbnRlZ2VyLnZhbHVlID0gc3RhdGU7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX0RTUyIsICZhcmdzLCBOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfRFNTIiwgJmFyZ3MsICZyZXQpOwogCiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2xjZF9xdWVyeV9sZXZlbHMgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuaW9uIGFjcGlfb2JqZWN0CQkqKmxldmVscykKK2FjcGlfdmlkZW9fZGV2aWNlX2xjZF9xdWVyeV9sZXZlbHMoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQkJICAgdW5pb24gYWNwaV9vYmplY3QgKipsZXZlbHMpCiB7Ci0JaW50CQkJc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpvYmo7Ci0KKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX2xjZF9xdWVyeV9sZXZlbHMiKTsKIApAQCAtMzI0LDcgKzMyMiw3IEBACiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlLT5oYW5kbGUsICJfQkNMIiwgTlVMTCwgJmJ1ZmZlcik7CiAJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7Ci0Jb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKWJ1ZmZlci5wb2ludGVyOwogCWlmICghb2JqICYmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIF9CQ0wgZGF0YVxuIikpOwogCQlzdGF0dXMgPSAtRUZBVUxUOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAKIAlyZXR1cm5fVkFMVUUoMCk7CiAKLWVycjoKKyAgICAgIGVycjoKIAlpZiAoYnVmZmVyLnBvaW50ZXIpCiAJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIApAQCAtMzQzLDEzICszNDEsMTEgQEAKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbCAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJCWxldmVsKQorYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgaW50IGxldmVsKQogewotCWludAkJCXN0YXR1czsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX2xjZF9zZXRfbGV2ZWwiKTsKIApAQCAtMzYxLDExICszNTcsMTAgQEAKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfbGNkX2dldF9sZXZlbF9jdXJyZW50ICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldmljZSwKLQl1bnNpZ25lZCBsb25nIAkqbGV2ZWwpCithY3BpX3ZpZGVvX2RldmljZV9sY2RfZ2V0X2xldmVsX2N1cnJlbnQoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmxldmVsKQogewotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzOwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX2xjZF9nZXRfbGV2ZWxfY3VycmVudCIpOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX0JRQyIsIE5VTEwsIGxldmVsKTsKQEAgLTM3NCwxNiArMzY5LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX0VESUQgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2aWNlLAotCXVuaW9uIGFjcGlfb2JqZWN0CQkqKmVkaWQsCi0Jc3NpemVfdAkJCQlsZW5ndGgpCithY3BpX3ZpZGVvX2RldmljZV9FRElEKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkgICAgICAgdW5pb24gYWNwaV9vYmplY3QgKiplZGlkLCBzc2l6ZV90IGxlbmd0aCkKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCWJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QJKm9iajsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ3MgPSB7IDEsICZhcmcwIH07CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9nZXRfRURJRCIpOwogCkBAIC00MDIsNyArMzk1LDcgQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAogCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIpCiAJCSplZGlkID0gb2JqOwpAQCAtNDE1LDE4ICs0MDgsMTUgQEAKIAlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIH0KIAotCiAvKiBidXMgKi8KIAogc3RhdGljIGludAotYWNwaV92aWRlb19idXNfc2V0X1BPU1QgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8sCi0JdW5zaWduZWQgbG9uZwkJb3B0aW9uKQorYWNwaV92aWRlb19idXNfc2V0X1BPU1Qoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywgdW5zaWduZWQgbG9uZyBvcHRpb24pCiB7Ci0JaW50CQkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJCXRtcDsKLQl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9JTlRFR0VSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdAlhcmdzID0gezEsICZhcmcwfTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX3NldF9QT1NUIik7CiAKQEAgLTQzNCwxNSArNDI0LDEzIEBACiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodmlkZW8tPmhhbmRsZSwgIl9TUEQiLCAmYXJncywgJnRtcCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQlzdGF0dXMgPSB0bXAgPyAoLUVJTlZBTCk6KEFFX09LKTsKKwkJc3RhdHVzID0gdG1wID8gKC1FSU5WQUwpIDogKEFFX09LKTsKIAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19nZXRfUE9TVCAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbywKLQl1bnNpZ25lZCBsb25nCQkqaWQpCithY3BpX3ZpZGVvX2J1c19nZXRfUE9TVChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCB1bnNpZ25lZCBsb25nICppZCkKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC00NTQsMTEgKzQ0MiwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19QT1NUX29wdGlvbnMgKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8sCi0JdW5zaWduZWQgbG9uZwkJKm9wdGlvbnMpCithY3BpX3ZpZGVvX2J1c19QT1NUX29wdGlvbnMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywKKwkJCSAgICB1bnNpZ25lZCBsb25nICpvcHRpb25zKQogewotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzOwogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX1BPU1Rfb3B0aW9ucyIpOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHZpZGVvLT5oYW5kbGUsICJfVlBPIiwgTlVMTCwgb3B0aW9ucyk7CkBAIC00ODksMTggKzQ3NiwxNSBAQAogICovCiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX0RPUygKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvLAotCWludAkJCWJpb3NfZmxhZywKLQlpbnQJCQlsY2RfZmxhZykKK2FjcGlfdmlkZW9fYnVzX0RPUyhzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBpbnQgYmlvc19mbGFnLCBpbnQgbGNkX2ZsYWcpCiB7Ci0JYWNwaV9pbnRlZ2VyCQlzdGF0dXMgPSAwOwotCXVuaW9uIGFjcGlfb2JqZWN0CWFyZzAgPSB7QUNQSV9UWVBFX0lOVEVHRVJ9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CWFyZ3MgPSB7MSwgJmFyZzB9OworCWFjcGlfaW50ZWdlciBzdGF0dXMgPSAwOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX0RPUyIpOwogCi0JaWYgKGJpb3NfZmxhZyA8IDAgfHwgYmlvc19mbGFnID4zIHx8IGxjZF9mbGFnIDwgMCB8fCBsY2RfZmxhZyA+IDEpeworCWlmIChiaW9zX2ZsYWcgPCAwIHx8IGJpb3NfZmxhZyA+IDMgfHwgbGNkX2ZsYWcgPCAwIHx8IGxjZF9mbGFnID4gMSkgewogCQlzdGF0dXMgPSAtMTsKIAkJZ290byBGYWlsZWQ7CiAJfQpAQCAtNTA4LDcgKzQ5Miw3IEBACiAJdmlkZW8tPmRvc19zZXR0aW5nID0gYXJnMC5pbnRlZ2VyLnZhbHVlOwogCWFjcGlfZXZhbHVhdGVfb2JqZWN0KHZpZGVvLT5oYW5kbGUsICJfRE9TIiwgJmFyZ3MsIE5VTEwpOwogCi1GYWlsZWQ6CisgICAgICBGYWlsZWQ6CiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKQEAgLTUyMywxMCArNTA3LDkgQEAKICAqICBkZXZpY2UuCiAgKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfdmlkZW9fZGV2aWNlX2ZpbmRfY2FwIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSkKK3N0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX2ZpbmRfY2FwKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfaW50ZWdlcgkJc3RhdHVzOworCWFjcGlfaW50ZWdlciBzdGF0dXM7CiAJYWNwaV9oYW5kbGUgaF9kdW1teTE7CiAJaW50IGk7CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iaiA9IE5VTEw7CkBAIC01MzQsMjcgKzUxNywyNyBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfZmluZF9jYXAiKTsKIAotCW1lbXNldCggJmRldmljZS0+Y2FwLCAwLCA0KTsKKwltZW1zZXQoJmRldmljZS0+Y2FwLCAwLCA0KTsKIAotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9BRFIiLCAmaF9kdW1teTEpKSkgeworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0FEUiIsICZoX2R1bW15MSkpKSB7CiAJCWRldmljZS0+Y2FwLl9BRFIgPSAxOwogCX0KLSAgICAJaWYoIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfQkNMIiwgJmhfZHVtbXkxKSkpIHsKLQkJZGV2aWNlLT5jYXAuX0JDTD0gMTsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9CQ0wiLCAmaF9kdW1teTEpKSkgeworCQlkZXZpY2UtPmNhcC5fQkNMID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0JDTSIsICZoX2R1bW15MSkpKSB7Ci0JCWRldmljZS0+Y2FwLl9CQ009IDE7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfQkNNIiwgJmhfZHVtbXkxKSkpIHsKKwkJZGV2aWNlLT5jYXAuX0JDTSA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EREMiLCAmaF9kdW1teTEpKSkgewotCQlkZXZpY2UtPmNhcC5fRERDPSAxOworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0REQyIsICZoX2R1bW15MSkpKSB7CisJCWRldmljZS0+Y2FwLl9EREMgPSAxOwogCX0KLSAgICAJaWYoIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfRENTIiwgJmhfZHVtbXkxKSkpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EQ1MiLCAmaF9kdW1teTEpKSkgewogCQlkZXZpY2UtPmNhcC5fRENTID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RHUyIsICZoX2R1bW15MSkpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfREdTIiwgJmhfZHVtbXkxKSkpIHsKIAkJZGV2aWNlLT5jYXAuX0RHUyA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EU1MiLCAmaF9kdW1teTEpKSkgeworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RTUyIsICZoX2R1bW15MSkpKSB7CiAJCWRldmljZS0+Y2FwLl9EU1MgPSAxOwogCX0KIApAQCAtNTYzLDM0ICs1NDYsMzggQEAKIAlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSAmJiBvYmotPnBhY2thZ2UuY291bnQgPj0gMikgewogCQlpbnQgY291bnQgPSAwOwogCQl1bmlvbiBhY3BpX29iamVjdCAqbzsKLQkJCisKIAkJYnIgPSBrbWFsbG9jKHNpemVvZigqYnIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFicikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQl9IGVsc2UgewogCQkJbWVtc2V0KGJyLCAwLCBzaXplb2YoKmJyKSk7CiAJCQlici0+bGV2ZWxzID0ga21hbGxvYyhvYmotPnBhY2thZ2UuY291bnQgKgotCQkJCQlzaXplb2YgKihici0+bGV2ZWxzKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICAgc2l6ZW9mICooYnItPmxldmVscyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFici0+bGV2ZWxzKQogCQkJCWdvdG8gb3V0OwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgb2JqLT5wYWNrYWdlLmNvdW50OyBpKyspIHsKLQkJCQlvID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopICZvYmotPnBhY2thZ2UuZWxlbWVudHNbaV07CisJCQkJbyA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSZvYmotPnBhY2thZ2UuCisJCQkJICAgIGVsZW1lbnRzW2ldOwogCQkJCWlmIChvLT50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGFcbiIpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCQkgICJJbnZhbGlkIGRhdGFcbiIpKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWJyLT5sZXZlbHNbY291bnRdID0gKHUzMikgby0+aW50ZWdlci52YWx1ZTsKIAkJCQljb3VudCsrOwogCQkJfQotb3V0OgorCQkgICAgICBvdXQ6CiAJCQlpZiAoY291bnQgPCAyKSB7CiAJCQkJa2ZyZWUoYnItPmxldmVscyk7CiAJCQkJa2ZyZWUoYnIpOwogCQkJfSBlbHNlIHsKIAkJCQlici0+Y291bnQgPSBjb3VudDsKIAkJCQlkZXZpY2UtPmJyaWdodG5lc3MgPSBicjsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJmb3VuZCAlZCBicmlnaHRuZXNzIGxldmVsc1xuIiwgY291bnQpKTsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCQkgICJmb3VuZCAlZCBicmlnaHRuZXNzIGxldmVsc1xuIiwKKwkJCQkJCSAgY291bnQpKTsKIAkJCX0KIAkJfQogCX0KQEAgLTYxMCwyOCArNTk3LDI3IEBACiAgKiAgRmluZCBvdXQgYWxsIHJlcXVpcmVkIEFNTCBtZXRob2QgZGVmaW5lZCB1bmRlciB0aGUgdmlkZW8gYnVzIGRldmljZS4KICAqLwogCi1zdGF0aWMgdm9pZCAKLWFjcGlfdmlkZW9fYnVzX2ZpbmRfY2FwIChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQorc3RhdGljIHZvaWQgYWNwaV92aWRlb19idXNfZmluZF9jYXAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlhY3BpX2hhbmRsZQloX2R1bW15MTsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MTsKIAotCW1lbXNldCgmdmlkZW8tPmNhcCAsMCwgNCk7Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfRE9TIiwgJmhfZHVtbXkxKSkpIHsKKwltZW1zZXQoJnZpZGVvLT5jYXAsIDAsIDQpOworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfRE9TIiwgJmhfZHVtbXkxKSkpIHsKIAkJdmlkZW8tPmNhcC5fRE9TID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfRE9EIiwgJmhfZHVtbXkxKSkpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX0RPRCIsICZoX2R1bW15MSkpKSB7CiAJCXZpZGVvLT5jYXAuX0RPRCA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX1JPTSIsICZoX2R1bW15MSkpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUodmlkZW8tPmhhbmRsZSwgIl9ST00iLCAmaF9kdW1teTEpKSkgewogCQl2aWRlby0+Y2FwLl9ST00gPSAxOwogCX0KLSAgICAJaWYoIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUodmlkZW8tPmhhbmRsZSwgIl9HUEQiLCAmaF9kdW1teTEpKSkgeworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfR1BEIiwgJmhfZHVtbXkxKSkpIHsKIAkJdmlkZW8tPmNhcC5fR1BEID0gMTsKIAl9Ci0gICAgCWlmKCBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHZpZGVvLT5oYW5kbGUsICJfU1BEIiwgJmhfZHVtbXkxKSkpIHsKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX1NQRCIsICZoX2R1bW15MSkpKSB7CiAJCXZpZGVvLT5jYXAuX1NQRCA9IDE7CiAJfQotICAgIAlpZiggQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZSh2aWRlby0+aGFuZGxlLCAiX1ZQTyIsICZoX2R1bW15MSkpKSB7CisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUodmlkZW8tPmhhbmRsZSwgIl9WUE8iLCAmaF9kdW1teTEpKSkgewogCQl2aWRlby0+Y2FwLl9WUE8gPSAxOwogCX0KIH0KQEAgLTY0MSwxMiArNjI3LDkgQEAKICAqIHN1cHBvcnQgdGhlIGRlc2lyZWQgZmVhdHVyZXMKICAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19jaGVjayAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbykKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfY2hlY2soc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gLUVOT0VOVDsKLQorCWFjcGlfc3RhdHVzIHN0YXR1cyA9IC1FTk9FTlQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c19jaGVjayIpOwogCkBAIC02NTgsMTkgKzY0MSwxOSBAQAogCSAqLwogCiAJLyogRG9lcyB0aGlzIGRldmljZSBhYmxlIHRvIHN1cHBvcnQgdmlkZW8gc3dpdGNoaW5nID8gKi8KLQlpZih2aWRlby0+Y2FwLl9ET1MpeworCWlmICh2aWRlby0+Y2FwLl9ET1MpIHsKIAkJdmlkZW8tPmZsYWdzLm11bHRpaGVhZCA9IDE7CiAJCXN0YXR1cyA9IDA7CiAJfQogCiAJLyogRG9lcyB0aGlzIGRldmljZSBhYmxlIHRvIHJldHJpZXZlIGEgcmV0cmlldmUgYSB2aWRlbyBST00gPyAqLwotCWlmKHZpZGVvLT5jYXAuX1JPTSl7CisJaWYgKHZpZGVvLT5jYXAuX1JPTSkgewogCQl2aWRlby0+ZmxhZ3Mucm9tID0gMTsKIAkJc3RhdHVzID0gMDsKIAl9CiAKIAkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gY29uZmlndXJlIHdoaWNoIHZpZGVvIGRldmljZSB0byBQT1NUID8gKi8KLQlpZih2aWRlby0+Y2FwLl9HUEQgJiYgdmlkZW8tPmNhcC5fU1BEICYmIHZpZGVvLT5jYXAuX1ZQTyl7CisJaWYgKHZpZGVvLT5jYXAuX0dQRCAmJiB2aWRlby0+Y2FwLl9TUEQgJiYgdmlkZW8tPmNhcC5fVlBPKSB7CiAJCXZpZGVvLT5mbGFncy5wb3N0ID0gMTsKIAkJc3RhdHVzID0gMDsKIAl9CkBAIC02ODIsMTYgKzY2NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfdmlkZW9fZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV92aWRlb19kaXI7CiAKIC8qIHZpZGVvIGRldmljZXMgKi8KIAotc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2VfaW5mb19zZXFfc2hvdyAoCi0Jc3RydWN0IHNlcV9maWxlCQkqc2VxLAotCXZvaWQJCQkqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlCSpkZXYgPSAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopIHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9CisJICAgIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9pbmZvX3NlcV9zaG93Iik7CiAKQEAgLTcwOSwzMCArNjkwLDI1IEBACiAJZWxzZQogCQlzZXFfcHJpbnRmKHNlcSwgIlVOS05PV05cbiIpOwogCi0Jc2VxX3ByaW50ZihzZXEsImtub3duIGJ5IGJpb3M6ICVzXG4iLAotCQkgICBkZXYtPmZsYWdzLmJpb3MgPyAieWVzIjoibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgImtub3duIGJ5IGJpb3M6ICVzXG4iLCBkZXYtPmZsYWdzLmJpb3MgPyAieWVzIiA6ICJubyIpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9pbmZvX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK2FjcGlfdmlkZW9fZGV2aWNlX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2VfaW5mb19zZXFfc2hvdywKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50ICAKLWFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX3NlcV9zaG93ICgKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSpzZXEsCi0Jdm9pZAkJCSpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0JaW50CQkJc3RhdHVzOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBzZXEtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZwlzdGF0ZTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2ID0KKwkgICAgKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfc2VxX3Nob3ciKTsKIApAQCAtNzUzLDMxICs3MjksMjcgQEAKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKIAotZW5kOgorICAgICAgZW5kOgogCXJldHVybl9WQUxVRSgwKTsKIH0KIAogc3RhdGljIGludAotYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfb3Blbl9mcyAoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUsCi0Jc3RydWN0IGZpbGUJCSpmaWxlKQorYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfc2VxX3Nob3csCiAJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfdmlkZW9fZGV2aWNlX3dyaXRlX3N0YXRlICgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JY29uc3QgY2hhcgkJX191c2VyICpidWZmZXIsCi0Jc2l6ZV90CQkJY291bnQsCi0JbG9mZl90CQkJKmRhdGEpCithY3BpX3ZpZGVvX2RldmljZV93cml0ZV9zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQogewotCWludAkJCXN0YXR1czsKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptID0gKHN0cnVjdCBzZXFfZmlsZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlCSpkZXYgPSAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0clsxMl0gPSB7MH07Ci0JdTMyCQkJc3RhdGUgPSAwOworCWludCBzdGF0dXM7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKiltLT5wcml2YXRlOworCWNoYXIgc3RyWzEyXSA9IHsgMCB9OworCXUzMiBzdGF0ZSA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9zdGF0ZSIpOwogCkBAIC03ODksNyArNzYxLDcgQEAKIAogCXN0cltjb3VudF0gPSAwOwogCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKLQlzdGF0ZSAmPSAoKDF1bDw8MzEpIHwgKDF1bDw8MzApIHwgKDF1bDw8MCkpOworCXN0YXRlICY9ICgoMXVsIDw8IDMxKSB8ICgxdWwgPDwgMzApIHwgKDF1bCA8PCAwKSk7CiAKIAlzdGF0dXMgPSBhY3BpX3ZpZGVvX2RldmljZV9zZXRfc3RhdGUoZGV2LCBzdGF0ZSk7CiAKQEAgLTgwMCwxMiArNzcyLDExIEBACiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK2FjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKikgc2VxLT5wcml2YXRlOwotCWludAkJCWk7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXYgPQorCSAgICAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19zZXFfc2hvdyIpOwogCkBAIC04MjMsMjYgKzc5NCwyMiBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9icmlnaHRuZXNzX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK2FjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzc19zZXFfc2hvdywKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfYnJpZ2h0bmVzcyAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfYnJpZ2h0bmVzcyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCiB7Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBtLT5wcml2YXRlOwotCWNoYXIJCQlzdHJbNF0gPSB7MH07Ci0JdW5zaWduZWQgaW50CQlsZXZlbCA9IDA7Ci0JaW50CQkJaTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKW0tPnByaXZhdGU7CisJY2hhciBzdHJbNF0gPSB7IDAgfTsKKwl1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOworCWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfYnJpZ2h0bmVzcyIpOwogCkBAIC04NTQsMTQgKzgyMSwxNSBAQAogCiAJc3RyW2NvdW50XSA9IDA7CiAJbGV2ZWwgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwotCQorCiAJaWYgKGxldmVsID4gMTAwKQogCQlyZXR1cm5fVkFMVUUoLUVGQVVMVCk7CiAKIAkvKiB2YWxpZGF0ZSB0aG91Z2ggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxldmVscyAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmJyaWdodG5lc3MtPmNvdW50OyBpKyspCiAJCWlmIChsZXZlbCA9PSBkZXYtPmJyaWdodG5lc3MtPmxldmVsc1tpXSkgewotCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX3ZpZGVvX2RldmljZV9sY2Rfc2V0X2xldmVsKGRldiwgbGV2ZWwpKSkKKwkJCWlmIChBQ1BJX1NVQ0NFU1MKKwkJCSAgICAoYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbChkZXYsIGxldmVsKSkpCiAJCQkJZGV2LT5icmlnaHRuZXNzLT5jdXJyID0gbGV2ZWw7CiAJCQlicmVhazsKIAkJfQpAQCAtODY5LDI0ICs4MzcsMjIgQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9FRElEX3NlcV9zaG93ICgKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSpzZXEsCi0Jdm9pZAkJCSpvZmZzZXQpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX0VESURfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKikgc2VxLT5wcml2YXRlOwotCWludAkJCXN0YXR1czsKLQlpbnQJCQlpOwotCXVuaW9uIGFjcGlfb2JqZWN0CSplZGlkID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9CisJICAgIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwl1bmlvbiBhY3BpX29iamVjdCAqZWRpZCA9IE5VTEw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9FRElEX3NlcV9zaG93Iik7CiAKIAlpZiAoIWRldikKIAkJZ290byBvdXQ7CiAKLQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2RldmljZV9FRElEIChkZXYsICZlZGlkLCAxMjgpOworCXN0YXR1cyA9IGFjcGlfdmlkZW9fZGV2aWNlX0VESUQoZGV2LCAmZWRpZCwgMTI4KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfRURJRCAoZGV2LCAmZWRpZCwgMjU2KTsKKwkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfRURJRChkZXYsICZlZGlkLCAyNTYpOwogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtODk4LDcgKzg2NCw3IEBACiAJCQlzZXFfcHV0YyhzZXEsIGVkaWQtPmJ1ZmZlci5wb2ludGVyW2ldKTsKIAl9CiAKLW91dDoKKyAgICAgIG91dDoKIAlpZiAoIWVkaWQpCiAJCXNlcV9wcmludGYoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKIAllbHNlCkBAIC05MDgsMjAgKzg3NCwxNSBAQAogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9FRElEX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK2FjcGlfdmlkZW9fZGV2aWNlX0VESURfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19kZXZpY2VfRURJRF9zZXFfc2hvdywKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2FkZF9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZF9kZXY7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2RldmljZV9hZGRfZnMiKTsKQEAgLTkyOSwxMyArODkwLDEzIEBACiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAotCXZpZF9kZXYgPSAoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwl2aWRfZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpZiAoIXZpZF9kZXYpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCXZpZF9kZXYtPnZpZGVvLT5kaXIpOworCQkJCQkJICAgICB2aWRfZGV2LT52aWRlby0+ZGlyKTsKIAkJaWYgKCFhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC05NDUsNyArOTA2LDcgQEAKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpbmZvIiwgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnaW5mbycgZnMgZW50cnlcbiIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdpbmZvJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fZGV2aWNlX2luZm9fZm9wczsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CkBAIC05NTMsMTAgKzkxNCwxMiBAQAogCX0KIAogCS8qICdzdGF0ZScgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzdGF0ZSIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgic3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJVbmFibGUgdG8gY3JlYXRlICdzdGF0ZScgZnMgZW50cnlcbiIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdzdGF0ZScgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3ZpZGVvX2RldmljZV9zdGF0ZV9mb3BzOwogCQllbnRyeS0+cHJvY19mb3BzLT53cml0ZSA9IGFjcGlfdmlkZW9fZGV2aWNlX3dyaXRlX3N0YXRlOwpAQCAtOTY1LDEwICs5MjgsMTIgQEAKIAl9CiAKIAkvKiAnYnJpZ2h0bmVzcycgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJicmlnaHRuZXNzIiwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJicmlnaHRuZXNzIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiVW5hYmxlIHRvIGNyZWF0ZSAnYnJpZ2h0bmVzcycgZnMgZW50cnlcbiIpKTsKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdicmlnaHRuZXNzJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3NfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9icmlnaHRuZXNzOwpAQCAtOTgwLDcgKzk0NSw3IEBACiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiRURJRCIsIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJ2JyaWdodG5lc3MnIGZzIGVudHJ5XG4iKSk7CisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnYnJpZ2h0bmVzcycgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3ZpZGVvX2RldmljZV9FRElEX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtOTkwLDE0ICs5NTUsMTIgQEAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX3JlbW92ZV9mcyAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZF9kZXY7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfcmVtb3ZlX2ZzIik7CiAKLQl2aWRfZGV2ID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJdmlkX2RldiA9IChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJaWYgKCF2aWRfZGV2IHx8ICF2aWRfZGV2LT52aWRlbyB8fCAhdmlkX2Rldi0+dmlkZW8tPmRpcikKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCkBAIC0xMDA2LDIyICs5NjksMTcgQEAKIAkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRlIiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlyZW1vdmVfcHJvY19lbnRyeSgiYnJpZ2h0bmVzcyIsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoIkVESUQiLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCSB2aWRfZGV2LT52aWRlby0+ZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIHZpZF9kZXYtPnZpZGVvLT5kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIC8qIHZpZGVvIGJ1cyAqLwotc3RhdGljIGludAotYWNwaV92aWRlb19idXNfaW5mb19zZXFfc2hvdyAoCi0Jc3RydWN0IHNlcV9maWxlCQkqc2VxLAotCXZvaWQJCQkqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfaW5mb19zZXFfc2hvdyIpOwogCkBAIC0xMDI5LDMwICs5ODcsMjUgQEAKIAkJZ290byBlbmQ7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlN3aXRjaGluZyBoZWFkczogICAgICAgICAgICAgICVzXG4iLAotCQkJdmlkZW8tPmZsYWdzLm11bHRpaGVhZCA/ICJ5ZXMiOiJubyIpOworCQkgICB2aWRlby0+ZmxhZ3MubXVsdGloZWFkID8gInllcyIgOiAibm8iKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlZpZGVvIFJPTTogICAgICAgICAgICAgICAgICAgICVzXG4iLAotCQkJdmlkZW8tPmZsYWdzLnJvbSA/ICJ5ZXMiOiJubyIpOworCQkgICB2aWRlby0+ZmxhZ3Mucm9tID8gInllcyIgOiAibm8iKTsKIAlzZXFfcHJpbnRmKHNlcSwgIkRldmljZSB0byBiZSBQT1NUZWQgb24gYm9vdDogICVzXG4iLAotCQkJdmlkZW8tPmZsYWdzLnBvc3QgPyAieWVzIjoibm8iKTsKKwkJICAgdmlkZW8tPmZsYWdzLnBvc3QgPyAieWVzIiA6ICJubyIpOwogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19pbmZvX29wZW5fZnMgKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBmaWxlCQkqZmlsZSkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19idXNfaW5mb19zZXFfc2hvdywKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19ST01fc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUk9NX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopc2VxLT5wcml2YXRlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfUk9NX3NlcV9zaG93Iik7CiAKQEAgLTEwNjIsMjYgKzEwMTUsMjAgQEAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUGxlYXNlIGltcGxlbWVudCAlc1xuIiwgX19GVU5DVElPTl9fKTsKIAlzZXFfcHJpbnRmKHNlcSwgIjxUT0RPPlxuIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1JPTV9vcGVuX2ZzICgKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX1JPTV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19ST01fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19QT1NUX2luZm9fc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgc2VxLT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcJCW9wdGlvbnM7Ci0JaW50CQkJc3RhdHVzOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopc2VxLT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgb3B0aW9uczsKKwlpbnQgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93Iik7CiAKQEAgLTEwOTEsOCArMTAzOCwxMCBAQAogCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX1BPU1Rfb3B0aW9ucyh2aWRlbywgJm9wdGlvbnMpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAoIShvcHRpb25zICYgMSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJUaGUgbW90aGVyYm9hcmQgVkdBIGRldmljZSBpcyBub3QgbGlzdGVkIGFzIGEgcG9zc2libGUgUE9TVCBkZXZpY2UuXG4iKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJUaGlzIGluZGljYXRlIGEgQklPUyBidWcuICBQbGVhc2UgY29udGFjdCB0aGUgbWFudWZhY3R1cmVyLlxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJUaGUgbW90aGVyYm9hcmQgVkdBIGRldmljZSBpcyBub3QgbGlzdGVkIGFzIGEgcG9zc2libGUgUE9TVCBkZXZpY2UuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQkgICAgICAgIlRoaXMgaW5kaWNhdGUgYSBCSU9TIGJ1Zy4gIFBsZWFzZSBjb250YWN0IHRoZSBtYW51ZmFjdHVyZXIuXG4iKTsKIAkJfQogCQlwcmludGsoIiVseFxuIiwgb3B0aW9ucyk7CiAJCXNlcV9wcmludGYoc2VxLCAiY2FuIFBPU1Q6IDxpbnRncmF0ZWQgdmlkZW8+Iik7CkBAIC0xMTAzLDg5ICsxMDUyLDc0IEBACiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfSBlbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiPG5vdCBzdXBwb3J0ZWQ+XG4iKTsKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1BPU1RfaW5mb19vcGVuX2ZzICgKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUpCithY3BpX3ZpZGVvX2J1c19QT1NUX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX3NlcV9zaG93LAorCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1BPU1Rfc2VxX3Nob3cgKAotCXN0cnVjdCBzZXFfZmlsZQkJKnNlcSwKLQl2b2lkCQkJKm9mZnNldCkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfUE9TVF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopIHNlcS0+cHJpdmF0ZTsKLQlpbnQJCQlzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwkJaWQ7CisJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKilzZXEtPnByaXZhdGU7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGlkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfUE9TVF9zZXFfc2hvdyIpOwogCiAJaWYgKCF2aWRlbykKIAkJZ290byBlbmQ7CiAKLQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19nZXRfUE9TVCAodmlkZW8sICZpZCk7CisJc3RhdHVzID0gYWNwaV92aWRlb19idXNfZ2V0X1BPU1QodmlkZW8sICZpZCk7CiAJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlzZXFfcHJpbnRmKHNlcSwgIjxub3Qgc3VwcG9ydGVkPlxuIik7CiAJCWdvdG8gZW5kOwogCX0KLQlzZXFfcHJpbnRmKHNlcSwgImRldmljZSBwb3N0ZWQgaXMgPCVzPlxuIiwgIGRldmljZV9kZWNvZGVbaWQgJiAzXSk7CisJc2VxX3ByaW50ZihzZXEsICJkZXZpY2UgcG9zdGVkIGlzIDwlcz5cbiIsIGRldmljZV9kZWNvZGVbaWQgJiAzXSk7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX0RPU19zZXFfc2hvdyAoCi0Jc3RydWN0IHNlcV9maWxlCQkqc2VxLAotCXZvaWQJCQkqb2Zmc2V0KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19ET1Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKilzZXEtPnByaXZhdGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c19ET1Nfc2VxX3Nob3ciKTsKIAotCXNlcV9wcmludGYoc2VxLCAiRE9TIHNldHRpbmc6IDwlZD5cbiIsIHZpZGVvLT5kb3Nfc2V0dGluZyApOworCXNlcV9wcmludGYoc2VxLCAiRE9TIHNldHRpbmc6IDwlZD5cbiIsIHZpZGVvLT5kb3Nfc2V0dGluZyk7CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX1BPU1Rfb3Blbl9mcyAoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUsCi0Jc3RydWN0IGZpbGUJCSpmaWxlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19QT1NUX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfdmlkZW9fYnVzX1BPU1Rfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19QT1NUX3NlcV9zaG93LAorCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX0RPU19vcGVuX2ZzICgKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUpCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX0RPU19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX3ZpZGVvX2J1c19ET1Nfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdAotYWNwaV92aWRlb19idXNfd3JpdGVfUE9TVCAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorYWNwaV92aWRlb19idXNfd3JpdGVfUE9TVChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0clsxMl0gPSB7MH07Ci0JdW5zaWduZWQgbG9uZwkJb3B0LCBvcHRpb25zOworCWludCBzdGF0dXM7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKW0tPnByaXZhdGU7CisJY2hhciBzdHJbMTJdID0geyAwIH07CisJdW5zaWduZWQgbG9uZyBvcHQsIG9wdGlvbnM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c193cml0ZV9QT1NUIik7CiAKLQogCWlmICghdmlkZW8gfHwgY291bnQgKyAxID4gc2l6ZW9mIHN0cikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCkBAIC0xMjA1LDMyICsxMTM5LDI4IEBACiAJb3B0aW9ucyB8PSAxOwogCiAJaWYgKG9wdGlvbnMgJiAoMXVsIDw8IG9wdCkpIHsKLQkJc3RhdHVzID0gYWNwaV92aWRlb19idXNfc2V0X1BPU1QgKHZpZGVvLCBvcHQpOworCQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19zZXRfUE9TVCh2aWRlbywgb3B0KTsKIAkJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKIAogCX0KIAotCiAJcmV0dXJuX1ZBTFVFKGNvdW50KTsKIH0KIAogc3RhdGljIHNzaXplX3QKLWFjcGlfdmlkZW9fYnVzX3dyaXRlX0RPUyAoCi0Jc3RydWN0IGZpbGUJCSpmaWxlLAotCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmZmVyLAotCXNpemVfdAkJCWNvdW50LAotCWxvZmZfdAkJCSpkYXRhKQorYWNwaV92aWRlb19idXNfd3JpdGVfRE9TKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IHNlcV9maWxlCQkqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8gPSAoc3RydWN0IGFjcGlfdmlkZW9fYnVzICopIG0tPnByaXZhdGU7Ci0JY2hhcgkJCXN0clsxMl0gPSB7MH07Ci0JdW5zaWduZWQgbG9uZwkJb3B0OworCWludCBzdGF0dXM7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKW0tPnByaXZhdGU7CisJY2hhciBzdHJbMTJdID0geyAwIH07CisJdW5zaWduZWQgbG9uZyBvcHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c193cml0ZV9ET1MiKTsKIAotCiAJaWYgKCF2aWRlbyB8fCBjb3VudCArIDEgPiBzaXplb2Ygc3RyKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKQEAgLTEyNDIsNyArMTE3Miw3IEBACiAJaWYgKG9wdCA+IDcpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKIAotCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX0RPUyAodmlkZW8sIG9wdCAmIDB4MywgKG9wdCAmIDB4NCk+PjIpOworCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX0RPUyh2aWRlbywgb3B0ICYgMHgzLCAob3B0ICYgMHg0KSA+PiAyKTsKIAogCWlmICghQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRUZBVUxUKTsKQEAgLTEyNTAsMjAgKzExODAsMTggQEAKIAlyZXR1cm5fVkFMVUUoY291bnQpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbzsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfYWRkX2ZzIik7CiAKLQl2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCWFjcGlfdmlkZW9fZGlyKTsKKwkJCQkJCSAgICAgYWNwaV92aWRlb19kaXIpOwogCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCQl2aWRlby0+ZGlyID0gYWNwaV9kZXZpY2VfZGlyKGRldmljZSk7CkBAIC0xMjczLDcgKzEyMDEsOCBAQAogCS8qICdpbmZvJyBbUl0gKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpbmZvIiwgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlICdpbmZvJyBmcyBlbnRyeVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJ2luZm8nIGZzIGVudHJ5XG4iKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV92aWRlb19idXNfaW5mb19mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTEyODMsNyArMTIxMiw4IEBACiAJLyogJ1JPTScgW1JdICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiUk9NIiwgU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCWlmICghZW50cnkpCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlICdST00nIGZzIGVudHJ5XG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnUk9NJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fYnVzX1JPTV9mb3BzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKQEAgLTEyOTEsOSArMTIyMSwxMSBAQAogCX0KIAogCS8qICdQT1NUX2luZm8nIFtSXSAqLwotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlBPU1RfaW5mbyIsIFNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKKwllbnRyeSA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJQT1NUX2luZm8iLCBTX0lSVUdPLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJaWYgKCFlbnRyeSkKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgJ1BPU1RfaW5mbycgZnMgZW50cnlcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdQT1NUX2luZm8nIGZzIGVudHJ5XG4iKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV92aWRlb19idXNfUE9TVF9pbmZvX2ZvcHM7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTMwMSw5ICsxMjMzLDEyIEBACiAJfQogCiAJLyogJ1BPU1QnIFtSL1ddICovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiUE9TVCIsIFNfSUZSRUd8U19JUlVHT3xTX0lSVVNSLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CisJZW50cnkgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgiUE9TVCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JUlVTUiwKKwkJCSAgICAgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSAnUE9TVCcgZnMgZW50cnlcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdQT1NUJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fYnVzX1BPU1RfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2J1c193cml0ZV9QT1NUOwpAQCAtMTMxMiw5ICsxMjQ3LDEyIEBACiAJfQogCiAJLyogJ0RPUycgW1IvV10gKi8KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJET1MiLCBTX0lGUkVHfFNfSVJVR098U19JUlVTUiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOworCWVudHJ5ID0KKwkgICAgY3JlYXRlX3Byb2NfZW50cnkoIkRPUyIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JUlVTUiwKKwkJCSAgICAgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKIAlpZiAoIWVudHJ5KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSAnRE9TJyBmcyBlbnRyeVxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIlVuYWJsZSB0byBjcmVhdGUgJ0RPUycgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3ZpZGVvX2J1c19ET1NfZm9wczsKIAkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2J1c193cml0ZV9ET1M7CkBAIC0xMzI1LDE1ICsxMjYzLDEzIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19yZW1vdmVfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbzsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfcmVtb3ZlX2ZzIik7CiAKLQl2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWlmIChhY3BpX2RldmljZV9kaXIoZGV2aWNlKSkgewogCQlyZW1vdmVfcHJvY19lbnRyeSgiaW5mbyIsIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKQEAgLTEzNDEsOCArMTI3Nyw3IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJQT1NUX2luZm8iLCBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJQT1NUIiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwogCQlyZW1vdmVfcHJvY19lbnRyeSgiRE9TIiwgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlyZW1vdmVfcHJvY19lbnRyeShhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCQlhY3BpX3ZpZGVvX2Rpcik7IAorCQlyZW1vdmVfcHJvY19lbnRyeShhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwgYWNwaV92aWRlb19kaXIpOwogCQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IE5VTEw7CiAJfQogCkBAIC0xMzU2LDIwICsxMjkxLDIwIEBACiAvKiBkZXZpY2UgaW50ZXJmYWNlICovCiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX2dldF9vbmVfZGV2aWNlICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvKQorYWNwaV92aWRlb19idXNfZ2V0X29uZV9kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewotCXVuc2lnbmVkIGxvbmcJCWRldmljZV9pZDsKLQlpbnQJCQlzdGF0dXMsIHJlc3VsdDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRhdGE7CisJdW5zaWduZWQgbG9uZyBkZXZpY2VfaWQ7CisJaW50IHN0YXR1cywgcmVzdWx0OworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGF0YTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX2dldF9vbmVfZGV2aWNlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhdmlkZW8pCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmZGV2aWNlX2lkKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfQURSIiwgTlVMTCwgJmRldmljZV9pZCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAKIAkJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOwpAQCAtMTQwMSwxNSArMTMzNiwxNyBAQAogCQkJZGF0YS0+ZmxhZ3MudW5rbm93biA9IDE7CiAJCQlicmVhazsKIAkJfQotCQkKKwogCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKHZpZGVvLCBkYXRhKTsKIAkJYWNwaV92aWRlb19kZXZpY2VfZmluZF9jYXAoZGF0YSk7CiAKIAkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRhdGEtPmhhbmRsZSwKLQkJCUFDUElfREVWSUNFX05PVElGWSwgYWNwaV92aWRlb19kZXZpY2Vfbm90aWZ5LCBkYXRhKTsKKwkJCQkJCSAgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkJICAgICBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnksCisJCQkJCQkgICAgIGRhdGEpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKKwkJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJCWdvdG8gZW5kOwogCQl9CkBAIC0xNDIzLDcgKzEzNjAsNyBAQAogCQlyZXR1cm5fVkFMVUUoMCk7CiAJfQogCi1lbmQ6CisgICAgICBlbmQ6CiAJcmV0dXJuX1ZBTFVFKC1FTk9FTlQpOwogfQogCkBAIC0xNDM3LDE1ICsxMzc0LDE1IEBACiAgKiAgRW51bWVyYXRlIHRoZSB2aWRlbyBkZXZpY2UgbGlzdCBvZiB0aGUgdmlkZW8gYnVzLCAKICAqICBiaW5kIHRoZSBpZHMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2aWRlbyBkZXZpY2VzCiAgKiAgdW5kZXIgdGhlIHZpZGVvIGJ1cy4KLSAqLyAgCisgKi8KIAotc3RhdGljIHZvaWQKLWFjcGlfdmlkZW9fZGV2aWNlX3JlYmluZCggc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKK3N0YXRpYyB2b2lkIGFjcGlfdmlkZW9fZGV2aWNlX3JlYmluZChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZ2aWRlby0+dmlkZW9fZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKCB2aWRlbywgZGV2KTsKKwkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXYgPQorCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOworCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKHZpZGVvLCBkZXYpOwogCX0KIH0KIApAQCAtMTQ2MCwyMSArMTM5NywyMSBAQAogICogIAogICogIEJpbmQgdGhlIGlkcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZpZGVvIGRldmljZXMKICAqICB1bmRlciB0aGUgdmlkZW8gYnVzLgotICovICAKKyAqLwogCiBzdGF0aWMgdm9pZAotYWNwaV92aWRlb19kZXZpY2VfYmluZCggc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywKLQkJCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlKQorYWNwaV92aWRlb19kZXZpY2VfYmluZChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLAorCQkgICAgICAgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CWk7CisJaW50IGk7CiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfYmluZCIpOwogCiAjZGVmaW5lIElEU19WQUwoaSkgdmlkZW8tPmF0dGFjaGVkX2FycmF5W2ldLnZhbHVlLmludF92YWwKICNkZWZpbmUgSURTX0JJTkQoaSkgdmlkZW8tPmF0dGFjaGVkX2FycmF5W2ldLmJpbmRfaW5mbwotCQotCWZvciAoaSA9IDA7IElEU19WQUwoaSkgIT0gQUNQSV9WSURFT19IRUFEX0lOVkFMSUQgJiYgCi0JCWkgPCB2aWRlby0+YXR0YWNoZWRfY291bnQ7IGkrKykgewotCQlpZiAoZGV2aWNlLT5kZXZpY2VfaWQgPT0gKElEU19WQUwoaSkmIDB4ZmZmZikpIHsKKworCWZvciAoaSA9IDA7IElEU19WQUwoaSkgIT0gQUNQSV9WSURFT19IRUFEX0lOVkFMSUQgJiYKKwkgICAgIGkgPCB2aWRlby0+YXR0YWNoZWRfY291bnQ7IGkrKykgeworCQlpZiAoZGV2aWNlLT5kZXZpY2VfaWQgPT0gKElEU19WQUwoaSkgJiAweGZmZmYpKSB7CiAJCQlJRFNfQklORChpKSA9IGRldmljZTsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImRldmljZV9iaW5kICVkXG4iLCBpKSk7CiAJCX0KQEAgLTE0OTIsMTcgKzE0MjksMTcgQEAKICAqICAKICAqICBDYWxsIF9ET0QgdG8gZW51bWVyYXRlIGFsbCBkZXZpY2VzIGF0dGFjaGVkIHRvIGRpc3BsYXkgYWRhcHRlcgogICoKLSAqLyAgCisgKi8KIAogc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9lbnVtZXJhdGUoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlpbnQJCQlzdGF0dXM7Ci0JaW50CQkJY291bnQ7Ci0JaW50CQkJaTsKKwlpbnQgc3RhdHVzOworCWludCBjb3VudDsKKwlpbnQgaTsKIAlzdHJ1Y3QgYWNwaV92aWRlb19lbnVtZXJhdGVkX2RldmljZSAqYWN0aXZlX2RldmljZV9saXN0OwotCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0CSpkb2QgPSBOVUxMOwotCXVuaW9uIGFjcGlfb2JqZWN0CSpvYmo7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqZG9kID0gTlVMTDsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19kZXZpY2VfZW51bWVyYXRlIik7CiAKQEAgLTE1MTIsNyArMTQ0OSw3IEBACiAJCXJldHVybl9WQUxVRShzdGF0dXMpOwogCX0KIAotCWRvZCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwlkb2QgPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKIAlpZiAoIWRvZCB8fCAoZG9kLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfRE9EIGRhdGFcbiIpKTsKIAkJc3RhdHVzID0gLUVGQVVMVDsKQEAgLTE1MjAsMTEgKzE0NTcsMTMgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCAlZCB2aWRlbyBoZWFkcyBpbiBfRE9EXG4iLAotCQlkb2QtPnBhY2thZ2UuY291bnQpKTsKKwkJCSAgZG9kLT5wYWNrYWdlLmNvdW50KSk7CiAKLQlhY3RpdmVfZGV2aWNlX2xpc3Q9IGttYWxsb2MoCi0gCQkoMStkb2QtPnBhY2thZ2UuY291bnQpKnNpemVvZihzdHJ1Y3QgYWNwaV92aWRlb19lbnVtZXJhdGVkX2RldmljZSksCi0JICAgICAgIAlHRlBfS0VSTkVMKTsKKwlhY3RpdmVfZGV2aWNlX2xpc3QgPSBrbWFsbG9jKCgxICsKKwkJCQkgICAgICBkb2QtPnBhY2thZ2UuY291bnQpICoKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJICAgIGFjcGlfdmlkZW9fZW51bWVyYXRlZF9kZXZpY2UpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWFjdGl2ZV9kZXZpY2VfbGlzdCkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwpAQCAtMTUzMywyNSArMTQ3MiwyOCBAQAogCiAJY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBkb2QtPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgJmRvZC0+cGFja2FnZS5lbGVtZW50c1tpXTsKKwkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopJmRvZC0+cGFja2FnZS5lbGVtZW50c1tpXTsKIAogCQlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfRE9EIGRhdGFcbiIpKTsKLQkJCWFjdGl2ZV9kZXZpY2VfbGlzdFtpXS52YWx1ZS5pbnRfdmFsID0gQUNQSV9WSURFT19IRUFEX0lOVkFMSUQ7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJJbnZhbGlkIF9ET0QgZGF0YVxuIikpOworCQkJYWN0aXZlX2RldmljZV9saXN0W2ldLnZhbHVlLmludF92YWwgPQorCQkJICAgIEFDUElfVklERU9fSEVBRF9JTlZBTElEOwogCQl9CiAJCWFjdGl2ZV9kZXZpY2VfbGlzdFtpXS52YWx1ZS5pbnRfdmFsID0gb2JqLT5pbnRlZ2VyLnZhbHVlOwogCQlhY3RpdmVfZGV2aWNlX2xpc3RbaV0uYmluZF9pbmZvID0gTlVMTDsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiZG9kIGVsZW1lbnRbJWRdID0gJWRcbiIsIGksIChpbnQpIG9iai0+aW50ZWdlci52YWx1ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJkb2QgZWxlbWVudFslZF0gPSAlZFxuIiwgaSwKKwkJCQkgIChpbnQpb2JqLT5pbnRlZ2VyLnZhbHVlKSk7CiAJCWNvdW50Kys7CiAJfQogCWFjdGl2ZV9kZXZpY2VfbGlzdFtjb3VudF0udmFsdWUuaW50X3ZhbCA9IEFDUElfVklERU9fSEVBRF9FTkQ7CiAKLQlpZih2aWRlby0+YXR0YWNoZWRfYXJyYXkpCisJaWYgKHZpZGVvLT5hdHRhY2hlZF9hcnJheSkKIAkJa2ZyZWUodmlkZW8tPmF0dGFjaGVkX2FycmF5KTsKLQkKKwogCXZpZGVvLT5hdHRhY2hlZF9hcnJheSA9IGFjdGl2ZV9kZXZpY2VfbGlzdDsKIAl2aWRlby0+YXR0YWNoZWRfY291bnQgPSBjb3VudDsKLW91dDoKKyAgICAgIG91dDoKIAlhY3BpX29zX2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQpAQCAtMTU2NywxNyArMTUwOSwxNCBAQAogICoJMS4gRmluZCBvdXQgdGhlIGN1cnJlbnQgYWN0aXZlIG91dHB1dCBkZXZpY2UuCiAgKgkyLiBJZGVudGlmeSB0aGUgbmV4dCBvdXRwdXQgZGV2aWNlIHRvIHN3aXRjaAogICoJMy4gY2FsbCBfRFNTIHRvIGRvIGFjdHVhbCBzd2l0Y2guCi0gKi8gIAorICovCiAKLXN0YXRpYyBpbnQgCi1hY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywgCi0JaW50CWV2ZW50KQorc3RhdGljIGludCBhY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywgaW50IGV2ZW50KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlLCAqIG5leHQ7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXY9TlVMTDsKLSAgICAgICAJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZfbmV4dD1OVUxMOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2X3ByZXY9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZfbmV4dCA9IE5VTEw7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZfcHJldiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMTU4NiwxNSArMTUyNSwxOSBAQAogCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmdmlkZW8tPnZpZGVvX2RldmljZV9saXN0KSB7CiAJCWRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKIAkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfZ2V0X3N0YXRlKGRldiwgJnN0YXRlKTsKLQkJaWYgKHN0YXRlICYgMHgyKXsKLQkJCWRldl9uZXh0ID0gY29udGFpbmVyX29mKG5vZGUtPm5leHQsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotCQkJZGV2X3ByZXYgPSBjb250YWluZXJfb2Yobm9kZS0+cHJldiwgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlLCBlbnRyeSk7CisJCWlmIChzdGF0ZSAmIDB4MikgeworCQkJZGV2X25leHQgPQorCQkJICAgIGNvbnRhaW5lcl9vZihub2RlLT5uZXh0LCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsCisJCQkJCSBlbnRyeSk7CisJCQlkZXZfcHJldiA9CisJCQkgICAgY29udGFpbmVyX29mKG5vZGUtPnByZXYsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwKKwkJCQkJIGVudHJ5KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCWRldl9uZXh0ID0gY29udGFpbmVyX29mKG5vZGUtPm5leHQsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwogCWRldl9wcmV2ID0gY29udGFpbmVyX29mKG5vZGUtPnByZXYsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotb3V0OgkKKyAgICAgIG91dDoKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRToKIAljYXNlIEFDUElfVklERU9fTk9USUZZX05FWFRfT1VUUFVUOgpAQCAtMTYxMSwyMSArMTU1NCwxNiBAQAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IAotYWNwaV92aWRlb19nZXRfbmV4dF9sZXZlbCgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwKLQl1MzIJbGV2ZWxfY3VycmVudCwKLQl1MzIJZXZlbnQpCitzdGF0aWMgaW50CithY3BpX3ZpZGVvX2dldF9uZXh0X2xldmVsKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAorCQkJICB1MzIgbGV2ZWxfY3VycmVudCwgdTMyIGV2ZW50KQogewotCS8qRml4IG1lKi8KKwkvKkZpeCBtZSAqLwogCXJldHVybiBsZXZlbF9jdXJyZW50OwogfQogCi0KIHN0YXRpYyB2b2lkCi1hY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgCi0JaW50CWV2ZW50KQorYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyhzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwgaW50IGV2ZW50KQogewogCXVuc2lnbmVkIGxvbmcgbGV2ZWxfY3VycmVudCwgbGV2ZWxfbmV4dDsKIAlhY3BpX3ZpZGVvX2RldmljZV9sY2RfZ2V0X2xldmVsX2N1cnJlbnQoZGV2aWNlLCAmbGV2ZWxfY3VycmVudCk7CkBAIC0xNjM0LDI2ICsxNTcyLDI3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX2dldF9kZXZpY2VzICgKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvLAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorYWNwaV92aWRlb19idXNfZ2V0X2RldmljZXMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbywKKwkJCSAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludAkJCXN0YXR1cyA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqbm9kZSwgKm5leHQ7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2dldF9kZXZpY2VzIik7CiAKIAlhY3BpX3ZpZGVvX2RldmljZV9lbnVtZXJhdGUodmlkZW8pOwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZkZXZpY2UtPmNoaWxkcmVuKSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIG5vZGUpOworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CisJCSAgICBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgbm9kZSk7CiAKIAkJaWYgKCFkZXYpCiAJCQljb250aW51ZTsKIAogCQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19nZXRfb25lX2RldmljZShkZXYsIHZpZGVvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiQ2FudCBhdHRhY2ggZGV2aWNlXG4iKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgICJDYW50IGF0dGFjaCBkZXZpY2VcbiIpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTE2NjEsMTAgKzE2MDAsOSBAQAogCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19wdXRfb25lX2RldmljZSgKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UJKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcHV0X29uZV9kZXZpY2Uoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UpCiB7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW87CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2J1c19wdXRfb25lX2RldmljZSIpOwpAQCAtMTY3OSwyNiArMTYxNywzMyBAQAogCXVwKCZ2aWRlby0+c2VtKTsKIAlhY3BpX3ZpZGVvX2RldmljZV9yZW1vdmVfZnMoZGV2aWNlLT5kZXYpOwogCisJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsCisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19wdXRfZGV2aWNlcyAoCi0Jc3RydWN0IGFjcGlfdmlkZW9fYnVzCSp2aWRlbykKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcHV0X2RldmljZXMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqbm9kZSwgKm5leHQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX3B1dF9kZXZpY2VzIik7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJnZpZGVvLT52aWRlb19kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRhdGEgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOworCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRhdGEgPQorCQkgICAgbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKIAkJaWYgKCFkYXRhKQogCQkJY29udGludWU7CiAKIAkJc3RhdHVzID0gYWNwaV92aWRlb19idXNfcHV0X29uZV9kZXZpY2UoZGF0YSk7Ci0JCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggImhodXVoaHV1IGJ1ZyBpbiBhY3BpIHZpZGVvIGRyaXZlci5cbiIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJICAgICAgICJoaHV1aGh1dSBidWcgaW4gYWNwaSB2aWRlbyBkcml2ZXIuXG4iKTsKIAogCQlpZiAoZGF0YS0+YnJpZ2h0bmVzcykKIAkJCWtmcmVlKGRhdGEtPmJyaWdodG5lc3MpOwpAQCAtMTcxMSwyOCArMTY1NiwyMCBAQAogCiAvKiBhY3BpX3ZpZGVvIGludGVyZmFjZSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19zdGFydF9kZXZpY2VzKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8pCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3N0YXJ0X2RldmljZXMoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbykKIHsKIAlyZXR1cm4gYWNwaV92aWRlb19idXNfRE9TKHZpZGVvLCAxLCAwKTsKIH0KIAotc3RhdGljIGludAotYWNwaV92aWRlb19idXNfc3RvcF9kZXZpY2VzKAotCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cwkqdmlkZW8pCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3N0b3BfZGV2aWNlcyhzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewogCXJldHVybiBhY3BpX3ZpZGVvX2J1c19ET1ModmlkZW8sIDAsIDEpOwogfQogCi1zdGF0aWMgdm9pZAotYWNwaV92aWRlb19idXNfbm90aWZ5ICgKLQlhY3BpX2hhbmRsZQkJaGFuZGxlLAotCXUzMgkJCWV2ZW50LAotCXZvaWQJCQkqZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfdmlkZW9fYnVzX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKSBkYXRhOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfbm90aWZ5Iik7CiAJcHJpbnRrKCJ2aWRlbyBidXMgbm90aWZ5XG4iKTsKQEAgLTE3NTcsMzAgKzE2OTQsMjcgQEAKIAkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBldmVudCwgMCk7CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRTogLyogQ3ljbGUgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuKi8KLQljYXNlIEFDUElfVklERU9fTk9USUZZX05FWFRfT1VUUFVUOiAvKiBOZXh0IERpc3BsYXkgb3V0cHV0IGhvdGtleSBwcmVzc2VkLiAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfUFJFVl9PVVRQVVQ6IC8qIHByZXZpb3VzIERpc3BsYXkgb3V0cHV0IGhvdGtleSBwcmVzc2VkLiAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfQ1lDTEU6CS8qIEN5Y2xlIERpc3BsYXkgb3V0cHV0IGhvdGtleSBwcmVzc2VkLiAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfTkVYVF9PVVRQVVQ6CS8qIE5leHQgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuICovCisJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9QUkVWX09VVFBVVDoJLyogcHJldmlvdXMgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuICovCiAJCWFjcGlfdmlkZW9fc3dpdGNoX291dHB1dCh2aWRlbywgZXZlbnQpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkgKAotCWFjcGlfaGFuZGxlCQloYW5kbGUsCi0JdTMyCQkJZXZlbnQsCi0Jdm9pZAkJCSpkYXRhKQorc3RhdGljIHZvaWQgYWNwaV92aWRlb19kZXZpY2Vfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZQkqdmlkZW9fZGV2aWNlID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKSBkYXRhOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZGVvX2RldmljZSA9CisJICAgIChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilkYXRhOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fZGV2aWNlX25vdGlmeSIpOwogCkBAIC0xNzkyLDM2ICsxNzI2LDM0IEBACiAJCXJldHVybl9WT0lEOwogCiAJc3dpdGNoIChldmVudCkgewotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfU1dJVENIOiAvKiBjaGFuZ2UgaW4gc3RhdHVzIChjeWNsZSBvdXRwdXQgZGV2aWNlKSAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfUFJPQkU6IC8qIGNoYW5nZSBpbiBzdGF0dXMgKG91dHB1dCBkZXZpY2Ugc3RhdHVzKSAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfU1dJVENIOgkvKiBjaGFuZ2UgaW4gc3RhdHVzIChjeWNsZSBvdXRwdXQgZGV2aWNlKSAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfUFJPQkU6CS8qIGNoYW5nZSBpbiBzdGF0dXMgKG91dHB1dCBkZXZpY2Ugc3RhdHVzKSAqLwogCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJYnJlYWs7Ci0JY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRV9CUklHSFRORVNTOiAvKiBDeWNsZSBicmlnaHRuZXNzICovCi0JY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9JTkNfQlJJR0hUTkVTUzogLyogSW5jcmVhc2UgYnJpZ2h0bmVzcyAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfREVDX0JSSUdIVE5FU1M6IC8qIERlY3JlYXNlIGJyaWdodG5lc3MgKi8KLQljYXNlIEFDUElfVklERU9fTk9USUZZX1pFUk9fQlJJR0hUTkVTUzogLyogemVybyBicmlnaHRuZXNzcyAqLwotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfRElTUExBWV9PRkY6IC8qIGRpc3BsYXkgZGV2aWNlIG9mZiAqLwotCQlhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzICh2aWRlb19kZXZpY2UsIGV2ZW50KTsKKwljYXNlIEFDUElfVklERU9fTk9USUZZX0NZQ0xFX0JSSUdIVE5FU1M6CS8qIEN5Y2xlIGJyaWdodG5lc3MgKi8KKwljYXNlIEFDUElfVklERU9fTk9USUZZX0lOQ19CUklHSFRORVNTOgkvKiBJbmNyZWFzZSBicmlnaHRuZXNzICovCisJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9ERUNfQlJJR0hUTkVTUzoJLyogRGVjcmVhc2UgYnJpZ2h0bmVzcyAqLworCWNhc2UgQUNQSV9WSURFT19OT1RJRllfWkVST19CUklHSFRORVNTOgkvKiB6ZXJvIGJyaWdodG5lc3NzICovCisJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9ESVNQTEFZX09GRjoJLyogZGlzcGxheSBkZXZpY2Ugb2ZmICovCisJCWFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLCBldmVudCk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCkpOworCQkJCSAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybl9WT0lEOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2J1c19hZGQgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfYWRkIik7Ci0JCisKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCkBAIC0xODUxLDIxICsxNzgzLDIyIEBACiAJYWNwaV92aWRlb19idXNfc3RhcnRfZGV2aWNlcyh2aWRlbyk7CiAKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIodmlkZW8tPmhhbmRsZSwKLQkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX3ZpZGVvX2J1c19ub3RpZnksIHZpZGVvKTsKKwkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICAgYWNwaV92aWRlb19idXNfbm90aWZ5LCB2aWRlbyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlbmQ7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKG11bHRpLWhlYWQ6ICVzICByb206ICVzICBwb3N0OiAlcylcbiIsCi0JCUFDUElfVklERU9fREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQl2aWRlby0+ZmxhZ3MubXVsdGloZWFkID8gInllcyI6Im5vIiwKLQkJdmlkZW8tPmZsYWdzLnJvbSA/ICJ5ZXMiOiJubyIsCi0JCXZpZGVvLT5mbGFncy5wb3N0ID8gInllcyI6Im5vIik7CisJICAgICAgIEFDUElfVklERU9fREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCSAgICAgICB2aWRlby0+ZmxhZ3MubXVsdGloZWFkID8gInllcyIgOiAibm8iLAorCSAgICAgICB2aWRlby0+ZmxhZ3Mucm9tID8gInllcyIgOiAibm8iLAorCSAgICAgICB2aWRlby0+ZmxhZ3MucG9zdCA/ICJ5ZXMiIDogIm5vIik7CiAKLWVuZDoKKyAgICAgIGVuZDoKIAlpZiAocmVzdWx0KSB7CiAJCWFjcGlfdmlkZW9fYnVzX3JlbW92ZV9mcyhkZXZpY2UpOwogCQlrZnJlZSh2aWRlbyk7CkBAIC0xODc0LDI4ICsxODA3LDI2IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX3JlbW92ZSAoCi0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UsCi0JaW50CQkJdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19idXMJKnZpZGVvID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8gPSBOVUxMOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV92aWRlb19idXNfcmVtb3ZlIik7CiAKIAlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQl2aWRlbyA9IChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKikgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXZpZGVvID0gKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAogCWFjcGlfdmlkZW9fYnVzX3N0b3BfZGV2aWNlcyh2aWRlbyk7CiAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcih2aWRlby0+aGFuZGxlLAotCQlBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfdmlkZW9fYnVzX25vdGlmeSk7CisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBhY3BpX3ZpZGVvX2J1c19ub3RpZnkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQkJCSAgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CiAKIAlhY3BpX3ZpZGVvX2J1c19wdXRfZGV2aWNlcyh2aWRlbyk7CiAJYWNwaV92aWRlb19idXNfcmVtb3ZlX2ZzKGRldmljZSk7CkBAIC0xOTA3LDE1ICsxODM4LDEyIEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi0KIHN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fYnVzX21hdGNoICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKLQlzdHJ1Y3QgYWNwaV9kcml2ZXIJKmRyaXZlcikKK2FjcGlfdmlkZW9fYnVzX21hdGNoKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKIHsKLQlhY3BpX2hhbmRsZQkJaF9kdW1teTE7Ci0JYWNwaV9oYW5kbGUJCWhfZHVtbXkyOwotCWFjcGlfaGFuZGxlCQloX2R1bW15MzsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MTsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MjsKKwlhY3BpX2hhbmRsZSBoX2R1bW15MzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX21hdGNoIik7CiAKQEAgLTE5NDEsMjIgKzE4NjksMTkgQEAKIAkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9TUEQiLCAmaF9kdW1teTMpKSkKIAkJcmV0dXJuX1ZBTFVFKDApOwogCi0KIAlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQKLWFjcGlfdmlkZW9faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfdmlkZW9faW5pdCh2b2lkKQogewotCWludAkJCXJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2luaXQiKTsKIAogCS8qCi0JYWNwaV9kYmdfbGV2ZWwgPSAweEZGRkZGRkZGOwotCWFjcGlfZGJnX2xheWVyID0gMHgwODAwMDAwMDsKLQkqLworCSAgIGFjcGlfZGJnX2xldmVsID0gMHhGRkZGRkZGRjsKKwkgICBhY3BpX2RiZ19sYXllciA9IDB4MDgwMDAwMDA7CisJICovCiAKIAlhY3BpX3ZpZGVvX2RpciA9IHByb2NfbWtkaXIoQUNQSV9WSURFT19DTEFTUywgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFhY3BpX3ZpZGVvX2RpcikKQEAgLTE5NzIsOCArMTg5Nyw3IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWFjcGlfdmlkZW9fZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3ZpZGVvX2V4aXQodm9pZCkKIHsKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3ZpZGVvX2V4aXQiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcxMDUuYyBiL2RyaXZlcnMvYXRtL2lkdDc3MTA1LmMKaW5kZXggYjhjMjYwZS4uMGFhYmZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaWR0NzcxMDUuYworKysgYi9kcml2ZXJzL2F0bS9pZHQ3NzEwNS5jCkBAIC01MCwxMCArNTAsOCBAQAogc3RhdGljIHZvaWQgaWR0NzcxMDVfcmVzdGFydF90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c190aW1lciA9Ci0gICAgVElNRVJfSU5JVElBTElaRVIoaWR0NzcxMDVfc3RhdHNfdGltZXJfZnVuYywgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcmVzdGFydF90aW1lciA9Ci0gICAgVElNRVJfSU5JVElBTElaRVIoaWR0NzcxMDVfcmVzdGFydF90aW1lcl9mdW5jLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc3RhdHNfdGltZXIsIGlkdDc3MTA1X3N0YXRzX3RpbWVyX2Z1bmMsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihyZXN0YXJ0X3RpbWVyLCBpZHQ3NzEwNV9yZXN0YXJ0X3RpbWVyX2Z1bmMsIDAsIDApOwogc3RhdGljIGludCBzdGFydF90aW1lciA9IDE7CiBzdGF0aWMgc3RydWN0IGlkdDc3MTA1X3ByaXYgKmlkdDc3MTA1X2FsbCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKaW5kZXggYTQzNTc1YS4uMmUyZTUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaXBoYXNlLmMKKysrIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKQEAgLTc5LDcgKzc5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtX2RldiAqX2lhX2Rldls4XTsKIHN0YXRpYyBpbnQgaWFkZXZfY291bnQ7CiBzdGF0aWMgdm9pZCBpYV9sZWRfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGlhX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoaWFfbGVkX3RpbWVyLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoaWFfdGltZXIsIGlhX2xlZF90aW1lciwgMCwgMCk7CiBzdGF0aWMgaW50IElBX1RYX0JVRiA9IERGTF9UWF9CVUZGRVJTLCBJQV9UWF9CVUZfU1ogPSBERkxfVFhfQlVGX1NaOwogc3RhdGljIGludCBJQV9SWF9CVUYgPSBERkxfUlhfQlVGRkVSUywgSUFfUlhfQlVGX1NaID0gREZMX1JYX0JVRl9TWjsKIHN0YXRpYyB1aW50IElBRGVidWdGbGFnID0gLyogSUZfSUFEQkdfRVJSIHwgSUZfSUFEQkdfQ0JSfCBJRl9JQURCR19JTklUX0FEQVBURVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCmluZGV4IGVjNjE1ZDguLjM3M2U3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwpAQCAtMjIsMTEgKzIyLDI2IEBACiAvKiBUaGlzIGlzIGEgcHJpdmF0ZSBzdHJ1Y3R1cmUgdXNlZCB0byB0aWUgdGhlIGNsYXNzZGV2IGFuZCB0aGUKICAqIGNvbnRhaW5lciAuLiBpdCBzaG91bGQgbmV2ZXIgYmUgdmlzaWJsZSBvdXRzaWRlIHRoaXMgZmlsZSAqLwogc3RydWN0IGludGVybmFsX2NvbnRhaW5lciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBrbGlzdF9ub2RlIG5vZGU7CiAJc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQ7CiAJc3RydWN0IGNsYXNzX2RldmljZSBjbGFzc2RldjsKIH07CiAKK3N0YXRpYyB2b2lkIGludGVybmFsX2NvbnRhaW5lcl9rbGlzdF9nZXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGludGVybmFsX2NvbnRhaW5lciAqaWMgPQorCQljb250YWluZXJfb2Yobiwgc3RydWN0IGludGVybmFsX2NvbnRhaW5lciwgbm9kZSk7CisJY2xhc3NfZGV2aWNlX2dldCgmaWMtPmNsYXNzZGV2KTsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfY29udGFpbmVyX2tsaXN0X3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYyA9CisJCWNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyLCBub2RlKTsKKwljbGFzc19kZXZpY2VfcHV0KCZpYy0+Y2xhc3NkZXYpOworfQorCisKIC8qKgogICogYXR0cmlidXRlX2NvbnRhaW5lcl9jbGFzc2Rldl90b19jb250YWluZXIgLSBnaXZlbiBhIGNsYXNzZGV2LCByZXR1cm4gdGhlIGNvbnRhaW5lcgogICoKQEAgLTU3LDcgKzcyLDggQEAKIGF0dHJpYnV0ZV9jb250YWluZXJfcmVnaXN0ZXIoc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmNvbnQtPm5vZGUpOwotCUlOSVRfTElTVF9IRUFEKCZjb250LT5jb250YWluZXJzKTsKKwlrbGlzdF9pbml0KCZjb250LT5jb250YWluZXJzLGludGVybmFsX2NvbnRhaW5lcl9rbGlzdF9nZXQsCisJCSAgIGludGVybmFsX2NvbnRhaW5lcl9rbGlzdF9wdXQpOwogCQkKIAlkb3duKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZjb250LT5ub2RlLCAmYXR0cmlidXRlX2NvbnRhaW5lcl9saXN0KTsKQEAgLTc3LDExICs5MywxMyBAQAogewogCWludCByZXR2YWwgPSAtRUJVU1k7CiAJZG93bigmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZjb250LT5jb250YWluZXJzKSkKKwlzcGluX2xvY2soJmNvbnQtPmNvbnRhaW5lcnMua19sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNvbnQtPmNvbnRhaW5lcnMua19saXN0KSkKIAkJZ290byBvdXQ7CiAJcmV0dmFsID0gMDsKIAlsaXN0X2RlbCgmY29udC0+bm9kZSk7CiAgb3V0OgorCXNwaW5fdW5sb2NrKCZjb250LT5jb250YWluZXJzLmtfbG9jayk7CiAJdXAoJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiAJCQpAQCAtMTQwLDcgKzE1OCw2IEBACiAJCQljb250aW51ZTsKIAkJfQogCQltZW1zZXQoaWMsIDAsIHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyKSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZpYy0+bm9kZSk7CiAJCWljLT5jb250ID0gY29udDsKIAkJY2xhc3NfZGV2aWNlX2luaXRpYWxpemUoJmljLT5jbGFzc2Rldik7CiAJCWljLT5jbGFzc2Rldi5kZXYgPSBnZXRfZGV2aWNlKGRldik7CkBAIC0xNTEsMTEgKzE2OCwyMiBAQAogCQkJZm4oY29udCwgZGV2LCAmaWMtPmNsYXNzZGV2KTsKIAkJZWxzZQogCQkJYXR0cmlidXRlX2NvbnRhaW5lcl9hZGRfY2xhc3NfZGV2aWNlKCZpYy0+Y2xhc3NkZXYpOwotCQlsaXN0X2FkZF90YWlsKCZpYy0+bm9kZSwgJmNvbnQtPmNvbnRhaW5lcnMpOworCQlrbGlzdF9hZGRfdGFpbCgmaWMtPm5vZGUsICZjb250LT5jb250YWluZXJzKTsKIAl9CiAJdXAoJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogfQogCisvKiBGSVhNRTogY2FuJ3QgYnJlYWsgb3V0IG9mIHRoaXMgdW5sZXNzIGtsaXN0X2l0ZXJfZXhpdCBpcyBhbHNvCisgKiBjYWxsZWQgYmVmb3JlIGRvaW5nIHRoZSBicmVhaworICovCisjZGVmaW5lIGtsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgaGVhZCwgbWVtYmVyLCBpdGVyKSBcCisJZm9yIChrbGlzdF9pdGVyX2luaXQoaGVhZCwgaXRlcik7IChwb3MgPSAoeyBcCisJCXN0cnVjdCBrbGlzdF9ub2RlICpuID0ga2xpc3RfbmV4dChpdGVyKTsgXAorCQluID8gY29udGFpbmVyX29mKG4sIHR5cGVvZigqcG9zKSwgbWVtYmVyKSA6IFwKKwkJCSh7IGtsaXN0X2l0ZXJfZXhpdChpdGVyKSA7IE5VTEw7IH0pOyBcCisJfSkgKSAhPSBOVUxMOyApCisJCQkKKwogLyoqCiAgKiBhdHRyaWJ1dGVfY29udGFpbmVyX3JlbW92ZV9kZXZpY2UgLSBtYWtlIGRldmljZSBlbGlnaWJsZSBmb3IgcmVtb3ZhbC4KICAqCkBAIC0xODIsMTcgKzIxMCwxOSBAQAogCiAJZG93bigmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb250LCAmYXR0cmlidXRlX2NvbnRhaW5lcl9saXN0LCBub2RlKSB7Ci0JCXN0cnVjdCBpbnRlcm5hbF9jb250YWluZXIgKmljLCAqdG1wOworCQlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYzsKKwkJc3RydWN0IGtsaXN0X2l0ZXIgaXRlcjsKIAogCQlpZiAoYXR0cmlidXRlX2NvbnRhaW5lcl9ub19jbGFzc2RldnMoY29udCkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIWNvbnQtPm1hdGNoKGNvbnQsIGRldikpCiAJCQljb250aW51ZTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGljLCB0bXAsICZjb250LT5jb250YWluZXJzLCBub2RlKSB7CisKKwkJa2xpc3RfZm9yX2VhY2hfZW50cnkoaWMsICZjb250LT5jb250YWluZXJzLCBub2RlLCAmaXRlcikgewogCQkJaWYgKGRldiAhPSBpYy0+Y2xhc3NkZXYuZGV2KQogCQkJCWNvbnRpbnVlOwotCQkJbGlzdF9kZWwoJmljLT5ub2RlKTsKKwkJCWtsaXN0X2RlbCgmaWMtPm5vZGUpOwogCQkJaWYgKGZuKQogCQkJCWZuKGNvbnQsIGRldiwgJmljLT5jbGFzc2Rldik7CiAJCQllbHNlIHsKQEAgLTIyNSwxMiArMjU1LDE4IEBACiAKIAlkb3duKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnQsICZhdHRyaWJ1dGVfY29udGFpbmVyX2xpc3QsIG5vZGUpIHsKLQkJc3RydWN0IGludGVybmFsX2NvbnRhaW5lciAqaWMsICp0bXA7CisJCXN0cnVjdCBpbnRlcm5hbF9jb250YWluZXIgKmljOworCQlzdHJ1Y3Qga2xpc3RfaXRlciBpdGVyOwogCiAJCWlmICghY29udC0+bWF0Y2goY29udCwgZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpYywgdG1wLCAmY29udC0+Y29udGFpbmVycywgbm9kZSkgeworCQlpZiAoYXR0cmlidXRlX2NvbnRhaW5lcl9ub19jbGFzc2RldnMoY29udCkpIHsKKwkJCWZuKGNvbnQsIGRldiwgTlVMTCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWtsaXN0X2Zvcl9lYWNoX2VudHJ5KGljLCAmY29udC0+Y29udGFpbmVycywgbm9kZSwgJml0ZXIpIHsKIAkJCWlmIChkZXYgPT0gaWMtPmNsYXNzZGV2LmRldikKIAkJCQlmbihjb250LCBkZXYsICZpYy0+Y2xhc3NkZXYpOwogCQl9CkBAIC0zNjgsNiArNDA0LDM2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdHRyaWJ1dGVfY29udGFpbmVyX2NsYXNzX2RldmljZV9kZWwpOwogCisvKioKKyAqIGF0dHJpYnV0ZV9jb250YWluZXJfZmluZF9jbGFzc19kZXZpY2UgLSBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzX2RldmljZQorICoKKyAqIEBjb250Ogl0aGUgY29udGFpbmVyCisgKiBAZGV2Ogl0aGUgZ2VuZXJpYyBkZXZpY2UKKyAqCisgKiBMb29rcyB1cCB0aGUgZGV2aWNlIGluIHRoZSBjb250YWluZXIncyBsaXN0IG9mIGNsYXNzIGRldmljZXMgYW5kIHJldHVybnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzX2RldmljZS4KKyAqLworc3RydWN0IGNsYXNzX2RldmljZSAqCithdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYzsKKwlzdHJ1Y3Qga2xpc3RfaXRlciBpdGVyOworCisJa2xpc3RfZm9yX2VhY2hfZW50cnkoaWMsICZjb250LT5jb250YWluZXJzLCBub2RlLCAmaXRlcikgeworCQlpZiAoaWMtPmNsYXNzZGV2LmRldiA9PSBkZXYpIHsKKwkJCWNkZXYgPSAmaWMtPmNsYXNzZGV2OworCQkJLyogRklYTUU6IG11c3QgZXhpdCBpdGVyYXRvciB0aGVuIGJyZWFrICovCisJCQlrbGlzdF9pdGVyX2V4aXQoJml0ZXIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gY2RldjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF0dHJpYnV0ZV9jb250YWluZXJfZmluZF9jbGFzc19kZXZpY2UpOworCiBpbnQgX19pbml0CiBhdHRyaWJ1dGVfY29udGFpbmVyX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCAxN2U5NjY5Li4wMzIwNGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC01NjgsNiArNTY4LDM2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKworCWdldF9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIHZvaWQga2xpc3RfZGV2aWNlc19wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CisKKwlwdXRfZGV2aWNlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGtsaXN0X2RyaXZlcnNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZV9kcml2ZXIsCisJCQkJCQkga25vZGVfYnVzKTsKKworCWdldF9kcml2ZXIoZHJ2KTsKK30KKworc3RhdGljIHZvaWQga2xpc3RfZHJpdmVyc19wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciwKKwkJCQkJCSBrbm9kZV9idXMpOworCisJcHV0X2RyaXZlcihkcnYpOworfQorCiAvKioKICAqCWJ1c19yZWdpc3RlciAtIHJlZ2lzdGVyIGEgYnVzIHdpdGggdGhlIHN5c3RlbS4KICAqCUBidXM6CWJ1cy4KQEAgLTYwMiw4ICs2MzIsOCBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gYnVzX2RyaXZlcnNfZmFpbDsKIAotCWtsaXN0X2luaXQoJmJ1cy0+a2xpc3RfZGV2aWNlcyk7Ci0Ja2xpc3RfaW5pdCgmYnVzLT5rbGlzdF9kcml2ZXJzKTsKKwlrbGlzdF9pbml0KCZidXMtPmtsaXN0X2RldmljZXMsIGtsaXN0X2RldmljZXNfZ2V0LCBrbGlzdF9kZXZpY2VzX3B1dCk7CisJa2xpc3RfaW5pdCgmYnVzLT5rbGlzdF9kcml2ZXJzLCBrbGlzdF9kcml2ZXJzX2dldCwga2xpc3RfZHJpdmVyc19wdXQpOwogCWJ1c19hZGRfYXR0cnMoYnVzKTsKIAogCXByX2RlYnVnKCJidXMgdHlwZSAnJXMnIHJlZ2lzdGVyZWRcbiIsIGJ1cy0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCBjOGEzM2RmLi42YWI3M2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTE5MSw2ICsxOTEsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGtsaXN0X2NoaWxkcmVuX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKKworCWdldF9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIHZvaWQga2xpc3RfY2hpbGRyZW5fcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9wYXJlbnQpOworCisJcHV0X2RldmljZShkZXYpOworfQorCiAKIC8qKgogICoJZGV2aWNlX2luaXRpYWxpemUgLSBpbml0IGRldmljZSBzdHJ1Y3R1cmUuCkBAIC0yMDcsNyArMjIxLDggQEAKIHsKIAlrb2JqX3NldF9rc2V0X3MoZGV2LCBkZXZpY2VzX3N1YnN5cyk7CiAJa29iamVjdF9pbml0KCZkZXYtPmtvYmopOwotCWtsaXN0X2luaXQoJmRldi0+a2xpc3RfY2hpbGRyZW4pOworCWtsaXN0X2luaXQoJmRldi0+a2xpc3RfY2hpbGRyZW4sIGtsaXN0X2NoaWxkcmVuX2dldCwKKwkJICAga2xpc3RfY2hpbGRyZW5fcHV0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5kbWFfcG9vbHMpOwogCWluaXRfTVVURVgoJmRldi0+c2VtKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMgYi9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCmluZGV4IGM0YWViZjIuLjYwYTdlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYXBvb2wuYwpAQCAtMjYyLDcgKzI2Miw4IEBACiAgKiBJZiBzdWNoIGEgbWVtb3J5IGJsb2NrIGNhbid0IGJlIGFsbG9jYXRlZCwgbnVsbCBpcyByZXR1cm5lZC4KICAqLwogdm9pZCAqCi1kbWFfcG9vbF9hbGxvYyAoc3RydWN0IGRtYV9wb29sICpwb29sLCBpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpoYW5kbGUpCitkbWFfcG9vbF9hbGxvYyAoc3RydWN0IGRtYV9wb29sICpwb29sLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgbWVtX2ZsYWdzLAorCQlkbWFfYWRkcl90ICpoYW5kbGUpCiB7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJc3RydWN0IGRtYV9wYWdlCQkqcGFnZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCAyOTFjNTk1Li5lZjNmZTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC0xNDIsNiArMTQyLDE5IEBACiAJa29iamVjdF9wdXQoJmRydi0+a29iaik7CiB9CiAKK3N0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIpOworCisJZ2V0X2RldmljZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyKTsKKworCXB1dF9kZXZpY2UoZGV2KTsKK30KIAogLyoqCiAgKglkcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlciBkcml2ZXIgd2l0aCBidXMKQEAgLTE1Nyw3ICsxNzAsNyBAQAogICovCiBpbnQgZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogewotCWtsaXN0X2luaXQoJmRydi0+a2xpc3RfZGV2aWNlcyk7CisJa2xpc3RfaW5pdCgmZHJ2LT5rbGlzdF9kZXZpY2VzLCBrbGlzdF9kZXZpY2VzX2dldCwga2xpc3RfZGV2aWNlc19wdXQpOwogCWluaXRfY29tcGxldGlvbigmZHJ2LT51bmxvYWRlZCk7CiAJcmV0dXJuIGJ1c19hZGRfZHJpdmVyKGRydik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDY1MjI4MTQuLjViZmEyZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0yOCw2ICsyOCw3IEBACiAJRldfU1RBVFVTX0RPTkUsCiAJRldfU1RBVFVTX0FCT1JULAogCUZXX1NUQVRVU19SRUFEWSwKKwlGV19TVEFUVVNfUkVBRFlfTk9IT1RQTFVHLAogfTsKIAogc3RhdGljIGludCBsb2FkaW5nX3RpbWVvdXQgPSAxMDsJLyogSW4gc2Vjb25kcyAqLwpAQCAtMzQ0LDcgKzM0NSw3IEBACiAKIHN0YXRpYyBpbnQKIGZ3X3NldHVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmlybXdhcmUgKmZ3LCBzdHJ1Y3QgY2xhc3NfZGV2aWNlICoqY2xhc3NfZGV2X3AsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKKwkJICAgICAgY29uc3QgY2hhciAqZndfbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlLCBpbnQgaG90cGx1ZykKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXY7CkBAIC0zNzYsNyArMzc3LDEwIEBACiAJCWdvdG8gZXJyb3JfdW5yZWc7CiAJfQogCi0Jc2V0X2JpdChGV19TVEFUVVNfUkVBRFksICZmd19wcml2LT5zdGF0dXMpOworCWlmIChob3RwbHVnKQorICAgICAgICAgICAgICAgIHNldF9iaXQoRldfU1RBVFVTX1JFQURZLCAmZndfcHJpdi0+c3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNldF9iaXQoRldfU1RBVFVTX1JFQURZX05PSE9UUExVRywgJmZ3X3ByaXYtPnN0YXR1cyk7CiAJKmNsYXNzX2Rldl9wID0gY2xhc3NfZGV2OwogCWdvdG8gb3V0OwogCkBAIC0zODYsMjEgKzM5MCw5IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoqCi0gKiByZXF1ZXN0X2Zpcm13YXJlOiAtIHJlcXVlc3QgZmlybXdhcmUgdG8gaG90cGx1ZyBhbmQgd2FpdCBmb3IgaXQKLSAqIERlc2NyaXB0aW9uOgotICoJQGZpcm13YXJlIHdpbGwgYmUgdXNlZCB0byByZXR1cm4gYSBmaXJtd2FyZSBpbWFnZSBieSB0aGUgbmFtZQotICoJb2YgQG5hbWUgZm9yIGRldmljZSBAZGV2aWNlLgotICoKLSAqCVNob3VsZCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQgd2hlcmUgc2xlZXBpbmcgaXMgYWxsb3dlZC4KLSAqCi0gKglAbmFtZSB3aWxsIGJlIHVzZSBhcyAkRklSTVdBUkUgaW4gdGhlIGhvdHBsdWcgZW52aXJvbm1lbnQgYW5kCi0gKglzaG91bGQgYmUgZGlzdGluY3RpdmUgZW5vdWdoIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGFueSBvdGhlcgotICoJZmlybXdhcmUgaW1hZ2UgZm9yIHRoaXMgb3IgYW55IG90aGVyIGRldmljZS4KLSAqKi8KLWludAotcmVxdWVzdF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmaXJtd2FyZV9wLCBjb25zdCBjaGFyICpuYW1lLAotCQkgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludAorX3JlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZmlybXdhcmVfcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgaW50IGhvdHBsdWcpCiB7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OwpAQCAtNDE5LDIyICs0MTEsMjUgQEAKIAl9CiAJbWVtc2V0KGZpcm13YXJlLCAwLCBzaXplb2YgKCpmaXJtd2FyZSkpOwogCi0JcmV0dmFsID0gZndfc2V0dXBfY2xhc3NfZGV2aWNlKGZpcm13YXJlLCAmY2xhc3NfZGV2LCBuYW1lLCBkZXZpY2UpOworCXJldHZhbCA9IGZ3X3NldHVwX2NsYXNzX2RldmljZShmaXJtd2FyZSwgJmNsYXNzX2RldiwgbmFtZSwgZGV2aWNlLAorCQlob3RwbHVnKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2tmcmVlX2Z3OwogCiAJZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CiAKLQlpZiAobG9hZGluZ190aW1lb3V0ID4gMCkgewotCQlmd19wcml2LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbG9hZGluZ190aW1lb3V0ICogSFo7Ci0JCWFkZF90aW1lcigmZndfcHJpdi0+dGltZW91dCk7Ci0JfQorCWlmIChob3RwbHVnKSB7CisJCWlmIChsb2FkaW5nX3RpbWVvdXQgPiAwKSB7CisJCQlmd19wcml2LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbG9hZGluZ190aW1lb3V0ICogSFo7CisJCQlhZGRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOworCQl9CiAKLQlrb2JqZWN0X2hvdHBsdWcoJmNsYXNzX2Rldi0+a29iaiwgS09CSl9BREQpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZ3X3ByaXYtPmNvbXBsZXRpb24pOwotCXNldF9iaXQoRldfU1RBVFVTX0RPTkUsICZmd19wcml2LT5zdGF0dXMpOwotCi0JZGVsX3RpbWVyX3N5bmMoJmZ3X3ByaXYtPnRpbWVvdXQpOworCQlrb2JqZWN0X2hvdHBsdWcoJmNsYXNzX2Rldi0+a29iaiwgS09CSl9BREQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmd19wcml2LT5jb21wbGV0aW9uKTsKKwkJc2V0X2JpdChGV19TVEFUVVNfRE9ORSwgJmZ3X3ByaXYtPnN0YXR1cyk7CisJCWRlbF90aW1lcl9zeW5jKCZmd19wcml2LT50aW1lb3V0KTsKKwl9IGVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZndfcHJpdi0+Y29tcGxldGlvbik7CiAKIAlkb3duKCZmd19sb2NrKTsKIAlpZiAoIWZ3X3ByaXYtPmZ3LT5zaXplIHx8IHRlc3RfYml0KEZXX1NUQVRVU19BQk9SVCwgJmZ3X3ByaXYtPnN0YXR1cykpIHsKQEAgLTQ1NSw2ICs0NTAsMjYgQEAKIH0KIAogLyoqCisgKiByZXF1ZXN0X2Zpcm13YXJlOiAtIHJlcXVlc3QgZmlybXdhcmUgdG8gaG90cGx1ZyBhbmQgd2FpdCBmb3IgaXQKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBAZmlybXdhcmUgd2lsbCBiZSB1c2VkIHRvIHJldHVybiBhIGZpcm13YXJlIGltYWdlIGJ5IHRoZSBuYW1lCisgKiAgICAgIG9mIEBuYW1lIGZvciBkZXZpY2UgQGRldmljZS4KKyAqCisgKiAgICAgIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQgd2hlcmUgc2xlZXBpbmcgaXMgYWxsb3dlZC4KKyAqCisgKiAgICAgIEBuYW1lIHdpbGwgYmUgdXNlIGFzICRGSVJNV0FSRSBpbiB0aGUgaG90cGx1ZyBlbnZpcm9ubWVudCBhbmQKKyAqICAgICAgc2hvdWxkIGJlIGRpc3RpbmN0aXZlIGVub3VnaCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBhbnkgb3RoZXIKKyAqICAgICAgZmlybXdhcmUgaW1hZ2UgZm9yIHRoaXMgb3IgYW55IG90aGVyIGRldmljZS4KKyAqKi8KK2ludAorcmVxdWVzdF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmaXJtd2FyZV9wLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisgICAgICAgIGludCBob3RwbHVnID0gMTsKKyAgICAgICAgcmV0dXJuIF9yZXF1ZXN0X2Zpcm13YXJlKGZpcm13YXJlX3AsIG5hbWUsIGRldmljZSwgaG90cGx1Zyk7Cit9CisKKy8qKgogICogcmVsZWFzZV9maXJtd2FyZTogLSByZWxlYXNlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBmaXJtd2FyZSBpbWFnZQogICoqLwogdm9pZApAQCAtNDkxLDYgKzUwNiw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwogCXZvaWQgKmNvbnRleHQ7CiAJdm9pZCAoKmNvbnQpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpOworCWludCBob3RwbHVnOwogfTsKIAogc3RhdGljIGludApAQCAtNTAzLDcgKzUxOSw4IEBACiAJCXJldHVybiAwOwogCX0KIAlkYWVtb25pemUoIiVzLyVzIiwgImZpcm13YXJlIiwgZndfd29yay0+bmFtZSk7Ci0JcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X3dvcmstPm5hbWUsIGZ3X3dvcmstPmRldmljZSk7CisJX3JlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd193b3JrLT5uYW1lLCBmd193b3JrLT5kZXZpY2UsCisJCWZ3X3dvcmstPmhvdHBsdWcpOwogCWZ3X3dvcmstPmNvbnQoZncsIGZ3X3dvcmstPmNvbnRleHQpOwogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCW1vZHVsZV9wdXQoZndfd29yay0+bW9kdWxlKTsKQEAgLTUxOCw2ICs1MzUsOSBAQAogICoJQXN5bmNocm9ub3VzIHZhcmlhbnQgb2YgcmVxdWVzdF9maXJtd2FyZSgpIGZvciBjb250ZXh0cyB3aGVyZQogICoJaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNsZWVwLgogICoKKyAqICAgICAgQGhvdHBsdWcgaW52b2tlcyBob3RwbHVnIGV2ZW50IHRvIGNvcHkgdGhlIGZpcm13YXJlIGltYWdlIGlmIHRoaXMgZmxhZworICogICAgICBpcyBub24temVybyBlbHNlIHRoZSBmaXJtd2FyZSBjb3B5IG11c3QgYmUgZG9uZSBtYW51YWxseS4KKyAqCiAgKglAY29udCB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBmaXJtd2FyZSByZXF1ZXN0IGlzIG92ZXIuCiAgKgogICoJQGNvbnRleHQgd2lsbCBiZSBwYXNzZWQgb3ZlciB0byBAY29udC4KQEAgLTUyNyw3ICs1NDcsNyBAQAogICoqLwogaW50CiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCgKLQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCisJc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgaG90cGx1ZywKIAljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHZvaWQgKmNvbnRleHQsCiAJdm9pZCAoKmNvbnQpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpKQogewpAQCAtNTQ4LDYgKzU2OCw3IEBACiAJCS5kZXZpY2UgPSBkZXZpY2UsCiAJCS5jb250ZXh0ID0gY29udGV4dCwKIAkJLmNvbnQgPSBjb250LAorCQkuaG90cGx1ZyA9IGhvdHBsdWcsCiAJfTsKIAogCXJldCA9IGtlcm5lbF90aHJlYWQocmVxdWVzdF9maXJtd2FyZV93b3JrX2Z1bmMsIGZ3X3dvcmssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMKaW5kZXggNmMyYjQ0Ny4uZjI1ZTdjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS90cmFuc3BvcnRfY2xhc3MuYwpAQCAtNyw3ICs3LDcgQEAKICAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciBHUEx2MgogICoKICAqIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gYWxsb3cgYW55ICJkZXZpY2UgY29udHJvbGxlciIgKHdoaWNoCi0gKiB3b3VsZCBtb3N0IG9mdGVuIGJlIGEgSG9zdCBCdXMgQWRhcHRlciIgdG8gdXNlIHRoZSBzZXJ2aWNlcyBvZiBvbmUKKyAqIHdvdWxkIG1vc3Qgb2Z0ZW4gYmUgYSBIb3N0IEJ1cyBBZGFwdGVyIHRvIHVzZSB0aGUgc2VydmljZXMgb2Ygb25lCiAgKiBvciBtb3JlIHRyYW5wb3J0IGNsYXNzZXMgZm9yIHBlcmZvcm1pbmcgdHJhbnNwb3J0IHNwZWNpZmljCiAgKiBzZXJ2aWNlcy4gIFRyYW5zcG9ydCBzcGVjaWZpYyBzZXJ2aWNlcyBhcmUgdGhpbmdzIHRoYXQgdGhlIGdlbmVyaWMKICAqIGNvbW1hbmQgbGF5ZXIgZG9lc24ndCB3YW50IHRvIGtub3cgYWJvdXQgKHNwZWVkIHNldHRpbmdzLCBsaW5lCkBAIC02NCw3ICs2NCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3Rlcik7CiAKLXN0YXRpYyBpbnQgYW5vbl90cmFuc3BvcnRfZHVtbXlfZnVuY3Rpb24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhbm9uX3RyYW5zcG9ydF9kdW1teV9mdW5jdGlvbihzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCS8qIGRvIG5vdGhpbmcgKi8KIAlyZXR1cm4gMDsKQEAgLTExNSw5ICsxMTcsMTAgQEAKIAkJCQkgICAgc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NkZXYpCiB7CiAJc3RydWN0IHRyYW5zcG9ydF9jbGFzcyAqdGNsYXNzID0gY2xhc3NfdG9fdHJhbnNwb3J0X2NsYXNzKGNvbnQtPmNsYXNzKTsKKwlzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGNvbnQgPSBhdHRyaWJ1dGVfY29udGFpbmVyX3RvX3RyYW5zcG9ydF9jb250YWluZXIoY29udCk7CiAKIAlpZiAodGNsYXNzLT5zZXR1cCkKLQkJdGNsYXNzLT5zZXR1cChkZXYpOworCQl0Y2xhc3MtPnNldHVwKHRjb250LCBkZXYsIGNsYXNzZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc4LDEyICsxODEsMTQgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHRyYW5zcG9ydF9hZGRfZGV2aWNlKTsKIAogc3RhdGljIGludCB0cmFuc3BvcnRfY29uZmlndXJlKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgdHJhbnNwb3J0X2NsYXNzICp0Y2xhc3MgPSBjbGFzc190b190cmFuc3BvcnRfY2xhc3MoY29udC0+Y2xhc3MpOworCXN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Y29udCA9IGF0dHJpYnV0ZV9jb250YWluZXJfdG9fdHJhbnNwb3J0X2NvbnRhaW5lcihjb250KTsKIAogCWlmICh0Y2xhc3MtPmNvbmZpZ3VyZSkKLQkJdGNsYXNzLT5jb25maWd1cmUoZGV2KTsKKwkJdGNsYXNzLT5jb25maWd1cmUodGNvbnQsIGRldiwgY2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMiw3ICsyMDcsNyBAQAogICovCiB2b2lkIHRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlhdHRyaWJ1dGVfY29udGFpbmVyX3RyaWdnZXIoZGV2LCB0cmFuc3BvcnRfY29uZmlndXJlKTsKKwlhdHRyaWJ1dGVfY29udGFpbmVyX2RldmljZV90cmlnZ2VyKGRldiwgdHJhbnNwb3J0X2NvbmZpZ3VyZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cmFuc3BvcnRfY29uZmlndXJlX2RldmljZSk7CiAKQEAgLTIxNSw3ICsyMjAsNyBAQAogCXN0cnVjdCB0cmFuc3BvcnRfY2xhc3MgKnRjbGFzcyA9IGNsYXNzX3RvX3RyYW5zcG9ydF9jbGFzcyhjb250LT5jbGFzcyk7CiAKIAlpZiAodGNsYXNzLT5yZW1vdmUpCi0JCXRjbGFzcy0+cmVtb3ZlKGRldik7CisJCXRjbGFzcy0+cmVtb3ZlKHRjb250LCBkZXYsIGNsYXNzZGV2KTsKIAogCWlmICh0Y2xhc3MtPnJlbW92ZSAhPSBhbm9uX3RyYW5zcG9ydF9kdW1teV9mdW5jdGlvbikgewogCQlpZiAodGNvbnQtPnN0YXRpc3RpY3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggNmI3MzYzNi4uNTFiMGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAogY29uZmlnIEJMS19ERVZfRkQKIAl0cmlzdGF0ZSAiTm9ybWFsIGZsb3BweSBkaXNrIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoIUFSQ0hfUzM5MCAmJiAhTTY4SyAmJiAhSUE2NCAmJiAhVU1MICYmICFBUk0pIHx8IFE0MCB8fCAoU1VOM1ggJiYgQlJPS0VOKSB8fCBBUkNIX1JQQyB8fCBBUkNIX0VCU0EyODUKKwlkZXBlbmRzIG9uIEFSQ0hfTUFZX0hBVkVfUENfRkRDCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmbG9wcHkgZGlzayBkcml2ZShzKSBvZiB5b3VyIFBDIHVuZGVyIExpbnV4LAogCSAgc2F5IFkuIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyLCBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgSUJNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Fjc2kuYyBiL2RyaXZlcnMvYmxvY2svYWNzaS5jCmluZGV4IGNlOTMzZGUuLjBlMWYzNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYWNzaS5jCisrKyBiL2RyaXZlcnMvYmxvY2svYWNzaS5jCkBAIC0zNzEsNyArMzcxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLXN0cnVjdCB0aW1lcl9saXN0IGFjc2lfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihhY3NpX3RpbWVzX291dCwgMCwgMCk7CitERUZJTkVfVElNRVIoYWNzaV90aW1lciwgYWNzaV90aW1lc19vdXQsIDAsIDApOwogCiAKICNpZmRlZiBDT05GSUdfQVRBUklfU0xNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMgYi9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKaW5kZXggZTNiZThjMy4uYTVjMWM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2xtX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoc2xtX3Rlc3RfcmVhZHksIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzbG1fdGltZXIsIHNsbV90ZXN0X3JlYWR5LCAwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2xtX2ZvcHMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCmluZGV4IDZlMjMxYzUuLmRlZDMzYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCkBAIC0zNSw3ICszNSw3IEBACiAJc3RydWN0IGFvZWRldiAqZDsKIAlzdHJ1Y3QgZnJhbWUgKmYsICplOwogCi0JZCA9IGtjYWxsb2MoMSwgc2l6ZW9mICpkLCBHRlBfQVRPTUlDKTsKKwlkID0ga3phbGxvYyhzaXplb2YgKmQsIEdGUF9BVE9NSUMpOwogCWlmIChkID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWYgPSBrY2FsbG9jKG5mcmFtZXMsIHNpemVvZiAqZiwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCmluZGV4IGRiMDVhNWEuLjIyYmRhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCkBAIC0zNzEsMTYgKzM3MSwxMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1vdG9yX29mZl90aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZmRfbW90b3Jfb2ZmX3RpbWVyLCAwLCAwKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCByZWFkdHJhY2tfdGltZXIgPQotCVRJTUVSX0lOSVRJQUxJWkVSKGZkX3JlYWR0cmFja19jaGVjaywgMCwgMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0X3RpbWVyID0KLQlUSU1FUl9JTklUSUFMSVpFUihmZF90aW1lc19vdXQsIDAsIDApOwotCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZmRfdGltZXIgPQotCVRJTUVSX0lOSVRJQUxJWkVSKGNoZWNrX2NoYW5nZSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKG1vdG9yX29mZl90aW1lciwgZmRfbW90b3Jfb2ZmX3RpbWVyLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIocmVhZHRyYWNrX3RpbWVyLCBmZF9yZWFkdHJhY2tfY2hlY2ssIDAsIDApOworc3RhdGljIERFRklORV9USU1FUih0aW1lb3V0X3RpbWVyLCBmZF90aW1lc19vdXQsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihmZF90aW1lciwgY2hlY2tfY2hhbmdlLCAwLCAwKTsKIAkKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9tb3Rvcl9vZmZfdGltZXIodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCA0MThiMTQ2Li4yOGYyYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC0xNzEzLDEwICsxNzEzLDkgQEAKIAogCWZvciAoaSA9IDIwICogSFo7IGkgPiAwOyBpLS0pIHsKIAkJZG9uZSA9IGhiYVtjdGxyXS0+YWNjZXNzLmNvbW1hbmRfY29tcGxldGVkKGhiYVtjdGxyXSk7Ci0JCWlmIChkb25lID09IEZJRk9fRU1QVFkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCX0gZWxzZQorCQlpZiAoZG9uZSA9PSBGSUZPX0VNUFRZKQorCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCWVsc2UKIAkJCXJldHVybiAoZG9uZSk7CiAJfQogCS8qIEludmFsaWQgYWRkcmVzcyB0byB0ZWxsIGNhbGxlciB3ZSByYW4gb3V0IG9mIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggZmY1MjAxZS4uNTJhM2FlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKKysrIGIvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTUwNywxOCArNTA3LDE1IEBACiAJY29uc3QgaW50IHJlYWRzID0gIWxpc3RfZW1wdHkoJmRkLT5maWZvX2xpc3RbUkVBRF0pOwogCWNvbnN0IGludCB3cml0ZXMgPSAhbGlzdF9lbXB0eSgmZGQtPmZpZm9fbGlzdFtXUklURV0pOwogCXN0cnVjdCBkZWFkbGluZV9ycSAqZHJxOwotCWludCBkYXRhX2Rpciwgb3RoZXJfZGlyOworCWludCBkYXRhX2RpcjsKIAogCS8qCiAJICogYmF0Y2hlcyBhcmUgY3VycmVudGx5IHJlYWRzIFhPUiB3cml0ZXMKIAkgKi8KLQlkcnEgPSBOVUxMOwotCi0JaWYgKGRkLT5uZXh0X2RycVtSRUFEXSkKLQkJZHJxID0gZGQtPm5leHRfZHJxW1JFQURdOwotCiAJaWYgKGRkLT5uZXh0X2RycVtXUklURV0pCiAJCWRycSA9IGRkLT5uZXh0X2RycVtXUklURV07CisJZWxzZQorCQlkcnEgPSBkZC0+bmV4dF9kcnFbUkVBRF07CiAKIAlpZiAoZHJxKSB7CiAJCS8qIHdlIGhhdmUgYSAibmV4dCByZXF1ZXN0IiAqLwpAQCAtNTQ0LDcgKzU0MSw2IEBACiAJCQlnb3RvIGRpc3BhdGNoX3dyaXRlczsKIAogCQlkYXRhX2RpciA9IFJFQUQ7Ci0JCW90aGVyX2RpciA9IFdSSVRFOwogCiAJCWdvdG8gZGlzcGF0Y2hfZmluZF9yZXF1ZXN0OwogCX0KQEAgLTU2MCw3ICs1NTYsNiBAQAogCQlkZC0+c3RhcnZlZCA9IDA7CiAKIAkJZGF0YV9kaXIgPSBXUklURTsKLQkJb3RoZXJfZGlyID0gUkVBRDsKIAogCQlnb3RvIGRpc3BhdGNoX2ZpbmRfcmVxdWVzdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwppbmRleCA4ODhkYWQ1Li4wMDg5NTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCisrKyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKQEAgLTYyOCw3ICs2MjgsNyBAQAogI2VuZGlmIC8qIERFQlVHVCAqLwogCiB0eXBlZGVmIHZvaWQgKCp0aW1lb3V0X2ZuKSAodW5zaWduZWQgbG9uZyk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZmRfdGltZW91dCA9IFRJTUVSX0lOSVRJQUxJWkVSKGZsb3BweV9zaHV0ZG93biwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGZkX3RpbWVvdXQsIGZsb3BweV9zaHV0ZG93biwgMCwgMCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0aW1lb3V0X21lc3NhZ2U7CiAKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJc2NoZWR1bGVfd29yaygmZmxvcHB5X3dvcmspOwogfQogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZmRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoZmRfdGltZXIsIE5VTEwsIDAsIDApOwogCiBzdGF0aWMgdm9pZCBjYW5jZWxfYWN0aXZpdHkodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZ2VuaGQuYyBiL2RyaXZlcnMvYmxvY2svZ2VuaGQuYwppbmRleCA0N2ZkMzY1Li5kNDI4NDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2dlbmhkLmMKKysrIGIvZHJpdmVycy9ibG9jay9nZW5oZC5jCkBAIC00NSw3ICs0NSw3IEBACiAJc3RydWN0IGJsa19tYWpvcl9uYW1lICpuOwogCWludCBpLCBsZW47CiAKLQlsZW4gPSBzcHJpbnRmKHAsICJcbkJsb2NrIGRldmljZXM6XG4iKTsKKwlsZW4gPSBzbnByaW50ZihwLCAoUEFHRV9TSVpFLXVzZWQpLCAiXG5CbG9jayBkZXZpY2VzOlxuIik7CiAKIAlkb3duKCZibG9ja19zdWJzeXNfc2VtKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYWpvcl9uYW1lcyk7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sbF9yd19ibGsuYyBiL2RyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggM2M4MTg1NC4uNDgzZDcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sbF9yd19ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xsX3J3X2Jsay5jCkBAIC0yMzUsOCArMjM1LDggQEAKIAkgKiBzZXQgZGVmYXVsdHMKIAkgKi8KIAlxLT5ucl9yZXF1ZXN0cyA9IEJMS0RFVl9NQVhfUlE7Ci0JcS0+bWF4X3BoeXNfc2VnbWVudHMgPSBNQVhfUEhZU19TRUdNRU5UUzsKLQlxLT5tYXhfaHdfc2VnbWVudHMgPSBNQVhfSFdfU0VHTUVOVFM7CisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIE1BWF9QSFlTX1NFR01FTlRTKTsKKwlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEsIE1BWF9IV19TRUdNRU5UUyk7CiAJcS0+bWFrZV9yZXF1ZXN0X2ZuID0gbWZuOwogCXEtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOwogCXEtPmJhY2tpbmdfZGV2X2luZm8uc3RhdGUgPSAwOwpAQCAtMjg0LDYgKzI4NCw3IEBACiAJcnEtPnNwZWNpYWwgPSBOVUxMOwogCXJxLT5kYXRhX2xlbiA9IDA7CiAJcnEtPmRhdGEgPSBOVUxMOworCXJxLT5ucl9waHlzX3NlZ21lbnRzID0gMDsKIAlycS0+c2Vuc2UgPSBOVUxMOwogCXJxLT5lbmRfaW8gPSBOVUxMOwogCXJxLT5lbmRfaW9fZGF0YSA9IE5VTEw7CkBAIC0yMTE1LDcgKzIxMTYsNyBAQAogLyoqCiAgKiBibGtfcnFfbWFwX3VzZXIgLSBtYXAgdXNlciBkYXRhIHRvIGEgcmVxdWVzdCwgZm9yIFJFUV9CTE9DS19QQyB1c2FnZQogICogQHE6CQlyZXF1ZXN0IHF1ZXVlIHdoZXJlIHJlcXVlc3Qgc2hvdWxkIGJlIGluc2VydGVkCi0gKiBAcnc6CQlSRUFEIG9yIFdSSVRFIGRhdGEKKyAqIEBycToJCXJlcXVlc3Qgc3RydWN0dXJlIHRvIGZpbGwKICAqIEB1YnVmOgl0aGUgdXNlciBidWZmZXIKICAqIEBsZW46CWxlbmd0aCBvZiB1c2VyIGRhdGEKICAqCkBAIC0yMTMyLDIxICsyMTMzLDE5IEBACiAgKiAgICBvcmlnaW5hbCBiaW8gbXVzdCBiZSBwYXNzZWQgYmFjayBpbiB0byBibGtfcnFfdW5tYXBfdXNlcigpIGZvciBwcm9wZXIKICAqICAgIHVubWFwcGluZy4KICAqLwotc3RydWN0IHJlcXVlc3QgKmJsa19ycV9tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgdm9pZCBfX3VzZXIgKnVidWYsCi0JCQkJdW5zaWduZWQgaW50IGxlbikKK2ludCBibGtfcnFfbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHZvaWQgX191c2VyICp1YnVmLAorCQkgICAgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIHVhZGRyOwotCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgYmlvICpiaW87CisJaW50IHJlYWRpbmc7CiAKIAlpZiAobGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlpZiAoKCFsZW4gJiYgdWJ1ZikgfHwgKGxlbiAmJiAhdWJ1ZikpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWxlbiB8fCAhdWJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBydywgX19HRlBfV0FJVCk7Ci0JaWYgKCFycSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJcmVhZGluZyA9IHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEOwogCiAJLyoKIAkgKiBpZiBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMgc2F0aXNmaWVkLCBtYXAgaW4gdXNlciBwYWdlcyBmb3IKQEAgLTIxNTQsOSArMjE1Myw5IEBACiAJICovCiAJdWFkZHIgPSAodW5zaWduZWQgbG9uZykgdWJ1ZjsKIAlpZiAoISh1YWRkciAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpICYmICEobGVuICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkpCi0JCWJpbyA9IGJpb19tYXBfdXNlcihxLCBOVUxMLCB1YWRkciwgbGVuLCBydyA9PSBSRUFEKTsKKwkJYmlvID0gYmlvX21hcF91c2VyKHEsIE5VTEwsIHVhZGRyLCBsZW4sIHJlYWRpbmcpOwogCWVsc2UKLQkJYmlvID0gYmlvX2NvcHlfdXNlcihxLCB1YWRkciwgbGVuLCBydyA9PSBSRUFEKTsKKwkJYmlvID0gYmlvX2NvcHlfdXNlcihxLCB1YWRkciwgbGVuLCByZWFkaW5nKTsKIAogCWlmICghSVNfRVJSKGJpbykpIHsKIAkJcnEtPmJpbyA9IHJxLT5iaW90YWlsID0gYmlvOwpAQCAtMjE2NCwyOCArMjE2Myw3MCBAQAogCiAJCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7CiAJCXJxLT5kYXRhX2xlbiA9IGxlbjsKLQkJcmV0dXJuIHJxOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKgogCSAqIGJpbyBpcyB0aGUgZXJyLXB0cgogCSAqLwotCWJsa19wdXRfcmVxdWVzdChycSk7Ci0JcmV0dXJuIChzdHJ1Y3QgcmVxdWVzdCAqKSBiaW87CisJcmV0dXJuIFBUUl9FUlIoYmlvKTsKIH0KIAogRVhQT1JUX1NZTUJPTChibGtfcnFfbWFwX3VzZXIpOwogCiAvKioKKyAqIGJsa19ycV9tYXBfdXNlcl9pb3YgLSBtYXAgdXNlciBkYXRhIHRvIGEgcmVxdWVzdCwgZm9yIFJFUV9CTE9DS19QQyB1c2FnZQorICogQHE6CQlyZXF1ZXN0IHF1ZXVlIHdoZXJlIHJlcXVlc3Qgc2hvdWxkIGJlIGluc2VydGVkCisgKiBAcnE6CQlyZXF1ZXN0IHRvIG1hcCBkYXRhIHRvCisgKiBAaW92Oglwb2ludGVyIHRvIHRoZSBpb3ZlYworICogQGlvdl9jb3VudDoJbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpb3ZlYworICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgRGF0YSB3aWxsIGJlIG1hcHBlZCBkaXJlY3RseSBmb3IgemVybyBjb3B5IGlvLCBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlCisgKiAgICBhIGtlcm5lbCBib3VuY2UgYnVmZmVyIGlzIHVzZWQuCisgKgorICogICAgQSBtYXRjaGluZyBibGtfcnFfdW5tYXBfdXNlcigpIG11c3QgYmUgaXNzdWVkIGF0IHRoZSBlbmQgb2YgaW8sIHdoaWxlCisgKiAgICBzdGlsbCBpbiBwcm9jZXNzIGNvbnRleHQuCisgKgorICogICAgTm90ZTogVGhlIG1hcHBlZCBiaW8gbWF5IG5lZWQgdG8gYmUgYm91bmNlZCB0aHJvdWdoIGJsa19xdWV1ZV9ib3VuY2UoKQorICogICAgYmVmb3JlIGJlaW5nIHN1Ym1pdHRlZCB0byB0aGUgZGV2aWNlLCBhcyBwYWdlcyBtYXBwZWQgbWF5IGJlIG91dCBvZgorICogICAgcmVhY2guIEl0J3MgdGhlIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoaXMgaGFwcGVucy4gVGhlCisgKiAgICBvcmlnaW5hbCBiaW8gbXVzdCBiZSBwYXNzZWQgYmFjayBpbiB0byBibGtfcnFfdW5tYXBfdXNlcigpIGZvciBwcm9wZXIKKyAqICAgIHVubWFwcGluZy4KKyAqLworaW50IGJsa19ycV9tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQlzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwlpZiAoIWlvdiB8fCBpb3ZfY291bnQgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiB3ZSBkb24ndCBhbGxvdyBtaXNhbGlnbmVkIGRhdGEgbGlrZSBiaW9fbWFwX3VzZXIoKSBkb2VzLiAgSWYgdGhlCisJICogdXNlciBpcyB1c2luZyBzZywgdGhleSdyZSBleHBlY3RlZCB0byBrbm93IHRoZSBhbGlnbm1lbnQgY29uc3RyYWludHMKKwkgKiBhbmQgcmVzcGVjdCB0aGVtIGFjY29yZGluZ2x5ICovCisJYmlvID0gYmlvX21hcF91c2VyX2lvdihxLCBOVUxMLCBpb3YsIGlvdl9jb3VudCwgcnFfZGF0YV9kaXIocnEpPT0gUkVBRCk7CisJaWYgKElTX0VSUihiaW8pKQorCQlyZXR1cm4gUFRSX0VSUihiaW8pOworCisJcnEtPmJpbyA9IHJxLT5iaW90YWlsID0gYmlvOworCWJsa19ycV9iaW9fcHJlcChxLCBycSwgYmlvKTsKKwlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOworCXJxLT5kYXRhX2xlbiA9IGJpby0+Ymlfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChibGtfcnFfbWFwX3VzZXJfaW92KTsKKworLyoqCiAgKiBibGtfcnFfdW5tYXBfdXNlciAtIHVubWFwIGEgcmVxdWVzdCB3aXRoIHVzZXIgZGF0YQotICogQHJxOgkJcmVxdWVzdCB0byBiZSB1bm1hcHBlZAotICogQGJpbzoJYmlvIGZvciB0aGUgcmVxdWVzdAorICogQGJpbzoJYmlvIHRvIGJlIHVubWFwcGVkCiAgKiBAdWxlbjoJbGVuZ3RoIG9mIHVzZXIgYnVmZmVyCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgICBVbm1hcCBhIHJlcXVlc3QgcHJldmlvdXNseSBtYXBwZWQgYnkgYmxrX3JxX21hcF91c2VyKCkuCisgKiAgICBVbm1hcCBhIGJpbyBwcmV2aW91c2x5IG1hcHBlZCBieSBibGtfcnFfbWFwX3VzZXIoKS4KICAqLwotaW50IGJsa19ycV91bm1hcF91c2VyKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgdWxlbikKK2ludCBibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCB1bGVuKQogewogCWludCByZXQgPSAwOwogCkBAIC0yMTk2LDMxICsyMjM3LDg5IEBACiAJCQlyZXQgPSBiaW9fdW5jb3B5X3VzZXIoYmlvKTsKIAl9CiAKLQlibGtfcHV0X3JlcXVlc3QocnEpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIEVYUE9SVF9TWU1CT0woYmxrX3JxX3VubWFwX3VzZXIpOwogCiAvKioKKyAqIGJsa19ycV9tYXBfa2VybiAtIG1hcCBrZXJuZWwgZGF0YSB0byBhIHJlcXVlc3QsIGZvciBSRVFfQkxPQ0tfUEMgdXNhZ2UKKyAqIEBxOgkJcmVxdWVzdCBxdWV1ZSB3aGVyZSByZXF1ZXN0IHNob3VsZCBiZSBpbnNlcnRlZAorICogQHJxOgkJcmVxdWVzdCB0byBmaWxsCisgKiBAa2J1ZjoJdGhlIGtlcm5lbCBidWZmZXIKKyAqIEBsZW46CWxlbmd0aCBvZiB1c2VyIGRhdGEKKyAqIEBnZnBfbWFzazoJbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKKyAqLworaW50IGJsa19ycV9tYXBfa2VybihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqa2J1ZiwKKwkJICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwlpZiAobGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWxlbiB8fCAha2J1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaW8gPSBiaW9fbWFwX2tlcm4ocSwga2J1ZiwgbGVuLCBnZnBfbWFzayk7CisJaWYgKElTX0VSUihiaW8pKQorCQlyZXR1cm4gUFRSX0VSUihiaW8pOworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKKwkJYmlvLT5iaV9ydyB8PSAoMSA8PCBCSU9fUlcpOworCisJcnEtPmJpbyA9IHJxLT5iaW90YWlsID0gYmlvOworCWJsa19ycV9iaW9fcHJlcChxLCBycSwgYmlvKTsKKworCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7CisJcnEtPmRhdGFfbGVuID0gbGVuOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGJsa19ycV9tYXBfa2Vybik7CisKKy8qKgorICogYmxrX2V4ZWN1dGVfcnFfbm93YWl0IC0gaW5zZXJ0IGEgcmVxdWVzdCBpbnRvIHF1ZXVlIGZvciBleGVjdXRpb24KKyAqIEBxOgkJcXVldWUgdG8gaW5zZXJ0IHRoZSByZXF1ZXN0IGluCisgKiBAYmRfZGlzazoJbWF0Y2hpbmcgZ2VuZGlzaworICogQHJxOgkJcmVxdWVzdCB0byBpbnNlcnQKKyAqIEBhdF9oZWFkOiAgICBpbnNlcnQgcmVxdWVzdCBhdCBoZWFkIG9yIHRhaWwgb2YgcXVldWUKKyAqIEBkb25lOglJL08gY29tcGxldGlvbiBoYW5kbGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBJbnNlcnQgYSBmdWxseSBwcmVwYXJlZCByZXF1ZXN0IGF0IHRoZSBiYWNrIG9mIHRoZSBpbyBzY2hlZHVsZXIgcXVldWUKKyAqICAgIGZvciBleGVjdXRpb24uICBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uLgorICovCit2b2lkIGJsa19leGVjdXRlX3JxX25vd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLAorCQkJICAgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgYXRfaGVhZCwKKwkJCSAgIHZvaWQgKCpkb25lKShzdHJ1Y3QgcmVxdWVzdCAqKSkKK3sKKwlpbnQgd2hlcmUgPSBhdF9oZWFkID8gRUxFVkFUT1JfSU5TRVJUX0ZST05UIDogRUxFVkFUT1JfSU5TRVJUX0JBQ0s7CisKKwlycS0+cnFfZGlzayA9IGJkX2Rpc2s7CisJcnEtPmZsYWdzIHw9IFJFUV9OT01FUkdFOworCXJxLT5lbmRfaW8gPSBkb25lOworCWVsdl9hZGRfcmVxdWVzdChxLCBycSwgd2hlcmUsIDEpOworCWdlbmVyaWNfdW5wbHVnX2RldmljZShxKTsKK30KKworLyoqCiAgKiBibGtfZXhlY3V0ZV9ycSAtIGluc2VydCBhIHJlcXVlc3QgaW50byBxdWV1ZSBmb3IgZXhlY3V0aW9uCiAgKiBAcToJCXF1ZXVlIHRvIGluc2VydCB0aGUgcmVxdWVzdCBpbgogICogQGJkX2Rpc2s6CW1hdGNoaW5nIGdlbmRpc2sKICAqIEBycToJCXJlcXVlc3QgdG8gaW5zZXJ0CisgKiBAYXRfaGVhZDogICAgaW5zZXJ0IHJlcXVlc3QgYXQgaGVhZCBvciB0YWlsIG9mIHF1ZXVlCiAgKgogICogRGVzY3JpcHRpb246CiAgKiAgICBJbnNlcnQgYSBmdWxseSBwcmVwYXJlZCByZXF1ZXN0IGF0IHRoZSBiYWNrIG9mIHRoZSBpbyBzY2hlZHVsZXIgcXVldWUKLSAqICAgIGZvciBleGVjdXRpb24uCisgKiAgICBmb3IgZXhlY3V0aW9uIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLgogICovCiBpbnQgYmxrX2V4ZWN1dGVfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywKLQkJICAgc3RydWN0IHJlcXVlc3QgKnJxKQorCQkgICBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBhdF9oZWFkKQogewogCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKIAljaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07CiAJaW50IGVyciA9IDA7CiAKLQlycS0+cnFfZGlzayA9IGJkX2Rpc2s7Ci0KIAkvKgogCSAqIHdlIG5lZWQgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0LCBzbyB3ZSBjYW4gbG9vayBhdAogCSAqIGl0IGFmdGVyIGlvIGNvbXBsZXRpb24KQEAgLTIyMzMsMTEgKzIzMzIsOCBAQAogCQlycS0+c2Vuc2VfbGVuID0gMDsKIAl9CiAKLQlycS0+ZmxhZ3MgfD0gUkVRX05PTUVSR0U7CiAJcnEtPndhaXRpbmcgPSAmd2FpdDsKLQlycS0+ZW5kX2lvID0gYmxrX2VuZF9zeW5jX3JxOwotCWVsdl9hZGRfcmVxdWVzdChxLCBycSwgRUxFVkFUT1JfSU5TRVJUX0JBQ0ssIDEpOwotCWdlbmVyaWNfdW5wbHVnX2RldmljZShxKTsKKwlibGtfZXhlY3V0ZV9ycV9ub3dhaXQocSwgYmRfZGlzaywgcnEsIGF0X2hlYWQsIGJsa19lbmRfc3luY19ycSk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CiAJcnEtPndhaXRpbmcgPSBOVUxMOwogCkBAIC0yMjc3LDYgKzIzNzMsNDQgQEAKIAogRVhQT1JUX1NZTUJPTChibGtkZXZfaXNzdWVfZmx1c2gpOwogCisvKioKKyAqIGJsa2Rldl9zY3NpX2lzc3VlX2ZsdXNoX2ZuIC0gaXNzdWUgZmx1c2ggZm9yIFNDU0kgZGV2aWNlcworICogQHE6CQlkZXZpY2UgcXVldWUKKyAqIEBkaXNrOglnZW5kaXNrCisgKiBAZXJyb3Jfc2VjdG9yOgllcnJvciBvZmZzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIERldmljZXMgdW5kZXJzdGFuZGluZyB0aGUgU0NTSSBjb21tYW5kIHNldCwgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIGFzCisgKiAgICBhIGhlbHBlciBmb3IgaXNzdWluZyBhIGNhY2hlIGZsdXNoLiBOb3RlOiBkcml2ZXIgaXMgcmVxdWlyZWQgdG8gc3RvcmUKKyAqICAgIHRoZSBlcnJvciBvZmZzZXQgKGluIGNhc2Ugb2YgZXJyb3IgZmx1c2hpbmcpIGluIC0+c2VjdG9yIG9mIHN0cnVjdAorICogICAgcmVxdWVzdC4KKyAqLworaW50IGJsa2Rldl9zY3NpX2lzc3VlX2ZsdXNoX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCisJCQkgICAgICAgc2VjdG9yX3QgKmVycm9yX3NlY3RvcikKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgV1JJVEUsIF9fR0ZQX1dBSVQpOworCWludCByZXQ7CisKKwlycS0+ZmxhZ3MgfD0gUkVRX0JMT0NLX1BDIHwgUkVRX1NPRlRCQVJSSUVSOworCXJxLT5zZWN0b3IgPSAwOworCW1lbXNldChycS0+Y21kLCAwLCBzaXplb2YocnEtPmNtZCkpOworCXJxLT5jbWRbMF0gPSAweDM1OworCXJxLT5jbWRfbGVuID0gMTI7CisJcnEtPmRhdGEgPSBOVUxMOworCXJxLT5kYXRhX2xlbiA9IDA7CisJcnEtPnRpbWVvdXQgPSA2MCAqIEhaOworCisJcmV0ID0gYmxrX2V4ZWN1dGVfcnEocSwgZGlzaywgcnEsIDApOworCisJaWYgKHJldCAmJiBlcnJvcl9zZWN0b3IpCisJCSplcnJvcl9zZWN0b3IgPSBycS0+c2VjdG9yOworCisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGJsa2Rldl9zY3NpX2lzc3VlX2ZsdXNoX2ZuKTsKKwogc3RhdGljIHZvaWQgZHJpdmVfc3RhdF9hY2N0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IG5yX3NlY3RvcnMsIGludCBuZXdfaW8pCiB7CiAJaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYwppbmRleCA3Mjg5ZjY3Li5hYzViYTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYwpAQCAtNTE2LDggKzUxNiw3IEBACiAKIHN0YXRpYyB2b2lkIHBjZF9zbGVlcChpbnQgY3MpCiB7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChjcyk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNzKTsKIH0KIAogc3RhdGljIGludCBwY2RfcmVzZXQoc3RydWN0IHBjZF91bml0ICpjZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jCmluZGV4IDA2MGIxZjIuLjcxMWQyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGYuYwpAQCAtNTA3LDggKzUwNyw3IEBACiAKIHN0YXRpYyB2b2lkIHBmX3NsZWVwKGludCBjcykKIHsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KGNzKTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoY3MpOwogfQogCiAvKiB0aGUgQVRBUEkgc3RhbmRhcmQgYWN0dWFsbHkgc3BlY2lmaWVzIHRoZSBjb250ZW50cyBvZiBhbGwgNyByZWdpc3RlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jCmluZGV4IDg0ZDhlMjkuLmIzOTgyMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYwpAQCAtMjc2LDggKzI3Niw3IEBACiAKIHN0YXRpYyB2b2lkIHBnX3NsZWVwKGludCBjcykKIHsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KGNzKTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoY3MpOwogfQogCiBzdGF0aWMgaW50IHBnX3dhaXQoc3RydWN0IHBnICpkZXYsIGludCBnbywgaW50IHN0b3AsIHVuc2lnbmVkIGxvbmcgdG1vLCBjaGFyICptc2cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wdC5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcHQuYwppbmRleCA1ZmU4ZWU4Li5kOGQzNTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wdC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3B0LmMKQEAgLTM4Myw4ICszODMsNyBAQAogCiBzdGF0aWMgdm9pZCBwdF9zbGVlcChpbnQgY3MpCiB7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChjcyk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNzKTsKIH0KIAogc3RhdGljIGludCBwdF9wb2xsX2RzYyhzdHJ1Y3QgcHRfdW5pdCAqdGFwZSwgaW50IHBhdXNlLCBpbnQgdG1vLCBjaGFyICptc2cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BzMmVzZGkuYyBiL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jCmluZGV4IDI5NTQ4NzguLjI5ZDE1MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jCisrKyBiL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jCkBAIC05OSw4ICs5OSw3IEBACiBzdGF0aWMgaW50IG5vX2ludF95ZXQ7CiBzdGF0aWMgaW50IHBzMmVzZGlfZHJpdmVzOwogc3RhdGljIHVfc2hvcnQgaW9fYmFzZTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBlc2RpX3RpbWVyID0KLQkJVElNRVJfSU5JVElBTElaRVIocHMyZXNkaV9yZXNldF90aW1lciwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGVzZGlfdGltZXIsIHBzMmVzZGlfcmVzZXRfdGltZXIsIDAsIDApOwogc3RhdGljIGludCByZXNldF9zdGF0dXM7CiBzdGF0aWMgaW50IHBzMmVzZGlfc2xvdCA9IC0xOwogc3RhdGljIGludCB0cDcyMGVzZGkgPSAwOwkvKiBJcyBpdCBJbnRlZ3JhdGVkIEVTREkgb2YgVGhpbmtQYWQtNzIwPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zY3NpX2lvY3RsLmMgYi9kcml2ZXJzL2Jsb2NrL3Njc2lfaW9jdGwuYwppbmRleCA2ODE4NzFjLi5hYmIyZGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9kcml2ZXJzL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCXN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwotCWludCByZWFkaW5nLCB3cml0aW5nOworCWludCB3cml0aW5nID0gMCwgcmV0ID0gMDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IGJpbyAqYmlvOwogCWNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKQEAgLTIzMSwzOCArMjMxLDQ4IEBACiAJaWYgKHZlcmlmeV9jb21tYW5kKGZpbGUsIGNtZCkpCiAJCXJldHVybiAtRVBFUk07CiAKLQkvKgotCSAqIHdlJ2xsIGRvIHRoYXQgbGF0ZXIKLQkgKi8KLQlpZiAoaGRyLT5pb3ZlY19jb3VudCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJaWYgKGhkci0+ZHhmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQogCQlyZXR1cm4gLUVJTzsKIAotCXJlYWRpbmcgPSB3cml0aW5nID0gMDsKLQlpZiAoaGRyLT5keGZlcl9sZW4pIHsKKwlpZiAoaGRyLT5keGZlcl9sZW4pCiAJCXN3aXRjaCAoaGRyLT5keGZlcl9kaXJlY3Rpb24pIHsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQljYXNlIFNHX0RYRkVSX1RPX0ZST01fREVWOgotCQkJcmVhZGluZyA9IDE7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBTR19EWEZFUl9UT19ERVY6CiAJCQl3cml0aW5nID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIFNHX0RYRkVSX0ZST01fREVWOgotCQkJcmVhZGluZyA9IDE7CiAJCQlicmVhazsKIAkJfQogCi0JCXJxID0gYmxrX3JxX21hcF91c2VyKHEsIHdyaXRpbmcgPyBXUklURSA6IFJFQUQsIGhkci0+ZHhmZXJwLAotCQkJCSAgICAgaGRyLT5keGZlcl9sZW4pOworCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIHdyaXRpbmcgPyBXUklURSA6IFJFQUQsIEdGUF9LRVJORUwpOworCWlmICghcnEpCisJCXJldHVybiAtRU5PTUVNOwogCi0JCWlmIChJU19FUlIocnEpKQotCQkJcmV0dXJuIFBUUl9FUlIocnEpOwotCX0gZWxzZQotCQlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBfX0dGUF9XQUlUKTsKKwlpZiAoaGRyLT5pb3ZlY19jb3VudCkgeworCQljb25zdCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2dfaW92ZWMpICogaGRyLT5pb3ZlY19jb3VudDsKKwkJc3RydWN0IHNnX2lvdmVjICppb3Y7CisKKwkJaW92ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpb3YpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihpb3YsIGhkci0+ZHhmZXJwLCBzaXplKSkgeworCQkJa2ZyZWUoaW92KTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGJsa19ycV9tYXBfdXNlcl9pb3YocSwgcnEsIGlvdiwgaGRyLT5pb3ZlY19jb3VudCk7CisJCWtmcmVlKGlvdik7CisJfSBlbHNlIGlmIChoZHItPmR4ZmVyX2xlbikKKwkJcmV0ID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCBoZHItPmR4ZmVycCwgaGRyLT5keGZlcl9sZW4pOworCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAkvKgogCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKQEAgLTI5OCw3ICszMDgsNyBAQAogCSAqIChpZiBoZSBkb2Vzbid0IGNoZWNrIHRoYXQgaXMgaGlzIHByb2JsZW0pLgogCSAqIE4uQi4gYSBub24temVybyBTQ1NJIHN0YXR1cyBpcyBfbm90XyBuZWNlc3NhcmlseSBhbiBlcnJvci4KIAkgKi8KLQlibGtfZXhlY3V0ZV9ycShxLCBiZF9kaXNrLCBycSk7CisJYmxrX2V4ZWN1dGVfcnEocSwgYmRfZGlzaywgcnEsIDApOwogCiAJLyogd3JpdGUgdG8gYWxsIG91dHB1dCBtZW1iZXJzICovCiAJaGRyLT5zdGF0dXMgPSAweGZmICYgcnEtPmVycm9yczsKQEAgLTMyMCwxMiArMzMwLDE0IEBACiAJCQloZHItPnNiX2xlbl93ciA9IGxlbjsKIAl9CiAKLQlpZiAoYmxrX3JxX3VubWFwX3VzZXIocnEsIGJpbywgaGRyLT5keGZlcl9sZW4pKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoYmxrX3JxX3VubWFwX3VzZXIoYmlvLCBoZHItPmR4ZmVyX2xlbikpCisJCXJldCA9IC1FRkFVTFQ7CiAKIAkvKiBtYXkgbm90IGhhdmUgc3VjY2VlZGVkLCBidXQgb3V0cHV0IHZhbHVlcyB3cml0dGVuIHRvIGNvbnRyb2wKIAkgKiBzdHJ1Y3R1cmUgKHN0cnVjdCBzZ19pb19oZHIpLiAgKi8KLQlyZXR1cm4gMDsKK291dDoKKwlibGtfcHV0X3JlcXVlc3QocnEpOworCXJldHVybiByZXQ7CiB9CiAKICNkZWZpbmUgT01BWF9TQl9MRU4gMTYgICAgICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KQEAgLTQwOCw3ICs0MjAsNyBAQAogCXJxLT5kYXRhX2xlbiA9IGJ5dGVzOwogCXJxLT5mbGFncyB8PSBSRVFfQkxPQ0tfUEM7CiAKLQlibGtfZXhlY3V0ZV9ycShxLCBiZF9kaXNrLCBycSk7CisJYmxrX2V4ZWN1dGVfcnEocSwgYmRfZGlzaywgcnEsIDApOwogCWVyciA9IHJxLT5lcnJvcnMgJiAweGZmOwkvKiBvbmx5IDggYml0IFNDU0kgc3RhdHVzICovCiAJaWYgKGVycikgewogCQlpZiAocnEtPnNlbnNlX2xlbiAmJiBycS0+c2Vuc2UpIHsKQEAgLTU2MSw3ICs1NzMsNyBAQAogCQkJcnEtPmNtZFswXSA9IEdQQ01EX1NUQVJUX1NUT1BfVU5JVDsKIAkJCXJxLT5jbWRbNF0gPSAweDAyICsgKGNsb3NlICE9IDApOwogCQkJcnEtPmNtZF9sZW4gPSA2OwotCQkJZXJyID0gYmxrX2V4ZWN1dGVfcnEocSwgYmRfZGlzaywgcnEpOworCQkJZXJyID0gYmxrX2V4ZWN1dGVfcnEocSwgYmRfZGlzaywgcnEsIDApOwogCQkJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zd2ltMy5jIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCmluZGV4IGU1Zjc0OTQuLmU0MjVhZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKQEAgLTgzNCw4ICs4MzQsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAkJc3dpbTNfc2VsZWN0KGZzLCBSRUxBWCk7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJCWlmIChzd2ltM19yZWFkYml0KGZzLCBESVNLX0lOKSA9PSAwKQogCQkJYnJlYWs7CiAJfQpAQCAtOTA2LDggKzkwNSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlzd2ltM19zZWxlY3QoZnMsIFJFTEFYKTsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAkJfQogCQlpZiAoZXJyID09IDAgJiYgKHN3aW0zX3JlYWRiaXQoZnMsIFNFRUtfQ09NUExFVEUpID09IDAKIAkJCQkgfHwgc3dpbTNfcmVhZGJpdChmcywgRElTS19JTikgPT0gMCkpCkBAIC05OTIsOCArOTkwLDcgQEAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CiAJCXN3aW0zX3NlbGVjdChmcywgUkVMQVgpOwotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCX0KIAlyZXQgPSBzd2ltM19yZWFkYml0KGZzLCBTRUVLX0NPTVBMRVRFKSA9PSAwCiAJCXx8IHN3aW0zX3JlYWRiaXQoZnMsIERJU0tfSU4pID09IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N3aW1faW9wLmMgYi9kcml2ZXJzL2Jsb2NrL3N3aW1faW9wLmMKaW5kZXggYTEyODNmNi4uODllM2MyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zd2ltX2lvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbV9pb3AuYwpAQCAtMzM4LDggKzMzOCw3IEBACiAJCQllcnIgPSAtRUlOVFI7CiAJCQlicmVhazsKIAkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCX0KIAlyZWxlYXNlX2RyaXZlKGZzKTsKIAlyZXR1cm4gY21kLT5lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCBhMDI2NTY3Li5hYTBiZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC0xNiw5ICsxNiwxMCBAQAogICogIC0tIHZlcmlmeSB0aGUgMTMgY29uZGl0aW9ucyBhbmQgZG8gYnVsayByZXNldHMKICAqICAtLSBraWxsIGxhc3RfcGlwZSBhbmQgc2ltcGx5IGRvIHR3by1zdGF0ZSBjbGVhcmluZyBvbiBib3RoIHBpcGVzCiAgKiAgLS0gdmVyaWZ5IHByb3RvY29sIChidWxrKSBmcm9tIFVTQiBkZXNjcmlwdG9ycyAobWF5YmUuLi4pCi0gKiAgLS0gaGlnaG1lbSBhbmQgc2cKKyAqICAtLSBoaWdobWVtCiAgKiAgLS0gbW92ZSB0b3Bfc2Vuc2UgYW5kIHdvcmtfYmNzIGludG8gc2VwYXJhdGUgYWxsb2NhdGlvbnMgKGlmIHRoZXkgc3Vydml2ZSkKICAqICAgICBmb3IgY2FjaGUgcHVyaXN0cyBhbmQgZXNvdGVyaWMgYXJjaGl0ZWN0dXJlcy4KKyAqICAtLSBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIExVTiAwIGJlZm9yZSB0aGUgZmlyc3QgdWJfc3luY190dXIsIGF2b2lkIE5VTEwuID8KICAqICAtLSBwcnVuZSBjb21tZW50cywgdGhleSBhcmUgdG9vIHZvbHVtbm91cwogICogIC0tIEV4dGVybWluYXRlIFAzIHByaW50a3MKICAqICAtLSBSZXNvdmUgWFhYJ3MKQEAgLTE3MSw3ICsxNzIsNyBAQAogICovCiBzdHJ1Y3QgdWJfZGV2OwogCi0jZGVmaW5lIFVCX01BWF9SRVFfU0cJMQorI2RlZmluZSBVQl9NQVhfUkVRX1NHCTQKICNkZWZpbmUgVUJfTUFYX1NFQ1RPUlMgNjQKIAogLyoKQEAgLTIzNCwxMyArMjM1LDEwIEBACiAKIAlpbnQgc3RhdF9jb3VudDsJCQkvKiBSZXRyaWVzIGdldHRpbmcgc3RhdHVzLiAqLwogCi0JLyoKLQkgKiBXZSBkbyBub3Qgc3VwcG9ydCB0cmFuc2ZlcnMgZnJvbSBoaWdobWVtIHBhZ2VzCi0JICogYmVjYXVzZSB0aGUgdW5kZXJseWluZyBVU0IgZnJhbWV3b3JrIGRvZXMgbm90IGRvIHdoYXQgd2UgbmVlZC4KLQkgKi8KLQljaGFyICpkYXRhOwkJCS8qIFJlcXVlc3RlZCBidWZmZXIgKi8KIAl1bnNpZ25lZCBpbnQgbGVuOwkJLyogUmVxdWVzdGVkIGxlbmd0aCAqLwotCS8vIHN0cnVjdCBzY2F0dGVybGlzdCBzZ3ZbVUJfTUFYX1JFUV9TR107CisJdW5zaWduZWQgaW50IGN1cnJlbnRfc2c7CisJdW5zaWduZWQgaW50IG5zZzsJCS8qIHNndltuc2ddICovCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNndltVQl9NQVhfUkVRX1NHXTsKIAogCXN0cnVjdCB1Yl9sdW4gKmx1bjsKIAl2b2lkICgqZG9uZSkoc3RydWN0IHViX2RldiAqLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKik7CkBAIC0zODksMTcgKzM4NywxOCBAQAogCXN0cnVjdCBidWxrX2NzX3dyYXAgd29ya19iY3M7CiAJc3RydWN0IHVzYl9jdHJscmVxdWVzdCB3b3JrX2NyOwogCisJaW50IHNnX3N0YXRbVUJfTUFYX1JFUV9TRysxXTsKIAlzdHJ1Y3QgdWJfc2NzaV90cmFjZSB0cjsKIH07CiAKIC8qCiAgKi8KIHN0YXRpYyB2b2lkIHViX2NsZWFudXAoc3RydWN0IHViX2RldiAqc2MpOwotc3RhdGljIGludCB1Yl9iZF9ycV9mbl8xKHN0cnVjdCB1Yl9sdW4gKmx1biwgc3RydWN0IHJlcXVlc3QgKnJxKTsKK3N0YXRpYyBpbnQgdWJfcmVxdWVzdF9mbl8xKHN0cnVjdCB1Yl9sdW4gKmx1biwgc3RydWN0IHJlcXVlc3QgKnJxKTsKIHN0YXRpYyBpbnQgdWJfY21kX2J1aWxkX2Jsb2NrKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfbHVuICpsdW4sCiAgICAgc3RydWN0IHViX3Njc2lfY21kICpjbWQsIHN0cnVjdCByZXF1ZXN0ICpycSk7Ci1zdGF0aWMgaW50IHViX2NtZF9idWlsZF9wYWNrZXQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLAotICAgIHN0cnVjdCByZXF1ZXN0ICpycSk7CitzdGF0aWMgaW50IHViX2NtZF9idWlsZF9wYWNrZXQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9sdW4gKmx1biwKKyAgICBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwgc3RydWN0IHJlcXVlc3QgKnJxKTsKIHN0YXRpYyB2b2lkIHViX3J3X2NtZF9kb25lKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCk7CiBzdGF0aWMgdm9pZCB1Yl9lbmRfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUpOwogc3RhdGljIGludCB1Yl9zdWJtaXRfc2NzaShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwpAQCAtNDA3LDYgKzQwNiw3IEBACiBzdGF0aWMgdm9pZCB1Yl9zY3NpX2FjdGlvbih1bnNpZ25lZCBsb25nIF9kZXYpOwogc3RhdGljIHZvaWQgdWJfc2NzaV9kaXNwYXRjaChzdHJ1Y3QgdWJfZGV2ICpzYyk7CiBzdGF0aWMgdm9pZCB1Yl9zY3NpX3VyYl9jb21wbChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOworc3RhdGljIHZvaWQgdWJfZGF0YV9zdGFydChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwogc3RhdGljIHZvaWQgdWJfc3RhdGVfZG9uZShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQsIGludCByYyk7CiBzdGF0aWMgaW50IF9fdWJfc3RhdGVfc3RhdChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwogc3RhdGljIHZvaWQgdWJfc3RhdGVfc3RhdChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwpAQCAtNTAwLDcgKzUwMCw4IEBACiAJfQogfQogCi1zdGF0aWMgc3NpemVfdCB1Yl9kaWFnX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqcGFnZSkKK3N0YXRpYyBzc2l6ZV90IHViX2RpYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgIGNoYXIgKnBhZ2UpCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHViX2RldiAqc2M7CkBAIC01MjMsNiArNTI0LDEzIEBACiAJY250ICs9IHNwcmludGYocGFnZSArIGNudCwKIAkgICAgInFsZW4gJWQgcW1heCAlZFxuIiwKIAkgICAgc2MtPmNtZF9xdWV1ZS5xbGVuLCBzYy0+Y21kX3F1ZXVlLnFtYXgpOworCWNudCArPSBzcHJpbnRmKHBhZ2UgKyBjbnQsCisJICAgICJzZyAlZCAlZCAlZCAlZCAlZFxuIiwKKwkgICAgc2MtPnNnX3N0YXRbMF0sCisJICAgIHNjLT5zZ19zdGF0WzFdLAorCSAgICBzYy0+c2dfc3RhdFsyXSwKKwkgICAgc2MtPnNnX3N0YXRbM10sCisJICAgIHNjLT5zZ19zdGF0WzRdKTsKIAogCWxpc3RfZm9yX2VhY2ggKHAsICZzYy0+bHVucykgewogCQlsdW4gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB1Yl9sdW4sIGxpbmspOwpAQCAtNzQ0LDIwICs3NTIsMjAgQEAKICAqIFRoZSByZXF1ZXN0IGZ1bmN0aW9uIGlzIG91ciBtYWluIGVudHJ5IHBvaW50CiAgKi8KIAotc3RhdGljIHZvaWQgdWJfYmRfcnFfZm4ocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgdWJfcmVxdWVzdF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEpCiB7CiAJc3RydWN0IHViX2x1biAqbHVuID0gcS0+cXVldWVkYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAogCXdoaWxlICgocnEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7Ci0JCWlmICh1Yl9iZF9ycV9mbl8xKGx1biwgcnEpICE9IDApIHsKKwkJaWYgKHViX3JlcXVlc3RfZm5fMShsdW4sIHJxKSAhPSAwKSB7CiAJCQlibGtfc3RvcF9xdWV1ZShxKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogfQogCi1zdGF0aWMgaW50IHViX2JkX3JxX2ZuXzEoc3RydWN0IHViX2x1biAqbHVuLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgaW50IHViX3JlcXVlc3RfZm5fMShzdHJ1Y3QgdWJfbHVuICpsdW4sIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgdWJfZGV2ICpzYyA9IGx1bi0+dWRldjsKIAlzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZDsKQEAgLTc3NCw5ICs3ODIsOCBAQAogCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpKTsKIAogCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwotCiAJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewotCQlyYyA9IHViX2NtZF9idWlsZF9wYWNrZXQoc2MsIGNtZCwgcnEpOworCQlyYyA9IHViX2NtZF9idWlsZF9wYWNrZXQoc2MsIGx1biwgY21kLCBycSk7CiAJfSBlbHNlIHsKIAkJcmMgPSB1Yl9jbWRfYnVpbGRfYmxvY2soc2MsIGx1biwgY21kLCBycSk7CiAJfQpAQCAtNzkxLDcgKzc5OCw3IEBACiAJY21kLT5iYWNrID0gcnE7CiAKIAljbWQtPnRhZyA9IHNjLT50YWdjbnQrKzsKLQlpZiAoKHJjID0gdWJfc3VibWl0X3Njc2koc2MsIGNtZCkpICE9IDApIHsKKwlpZiAodWJfc3VibWl0X3Njc2koc2MsIGNtZCkgIT0gMCkgewogCQl1Yl9wdXRfY21kKGx1biwgY21kKTsKIAkJdWJfZW5kX3JxKHJxLCAwKTsKIAkJcmV0dXJuIDA7CkBAIC04MDQsNTggKzgxMSwzMSBAQAogICAgIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaW50IHViX2RpcjsKLSNpZiAwIC8qIFdlIHVzZSBycS0+YnVmZmVyIGZvciBub3cgKi8KLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBuX2VsZW07Ci0jZW5kaWYKIAl1bnNpZ25lZCBpbnQgYmxvY2ssIG5ibGtzOwogCiAJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKIAkJdWJfZGlyID0gVUJfRElSX1dSSVRFOwogCWVsc2UKIAkJdWJfZGlyID0gVUJfRElSX1JFQUQ7CisJY21kLT5kaXIgPSB1Yl9kaXI7CiAKIAkvKgogCSAqIGdldCBzY2F0dGVybGlzdCBmcm9tIGJsb2NrIGxheWVyCiAJICovCi0jaWYgMCAvKiBXZSB1c2UgcnEtPmJ1ZmZlciBmb3Igbm93ICovCi0Jc2cgPSAmY21kLT5zZ3ZbMF07Ci0Jbl9lbGVtID0gYmxrX3JxX21hcF9zZyhxLCBycSwgc2cpOworCW5fZWxlbSA9IGJsa19ycV9tYXBfc2cobHVuLT5kaXNrLT5xdWV1ZSwgcnEsICZjbWQtPnNndlswXSk7CiAJaWYgKG5fZWxlbSA8PSAwKSB7Ci0JCXViX3B1dF9jbWQobHVuLCBjbWQpOwotCQl1Yl9lbmRfcnEocnEsIDApOwotCQlibGtfc3RhcnRfcXVldWUocSk7Ci0JCXJldHVybiAwOwkJLyogcmVxdWVzdCB3aXRoIG5vIHMvZyBlbnRyaWVzPyAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHJlcXVlc3QgbWFwICglZClcbiIsCisJCSAgICBzYy0+bmFtZSwgbl9lbGVtKTsgLyogUDMgKi8KKwkJcmV0dXJuIC0xOwkJLyogcmVxdWVzdCB3aXRoIG5vIHMvZyBlbnRyaWVzPyAqLwogCX0KLQotCWlmIChuX2VsZW0gIT0gMSkgewkJLyogUGFyYW5vaWEgKi8KKwlpZiAobl9lbGVtID4gVUJfTUFYX1JFUV9TRykgewkvKiBQYXJhbm9pYSAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVxdWVzdCB3aXRoICVkIHNlZ21lbnRzXG4iLAogCQkgICAgc2MtPm5hbWUsIG5fZWxlbSk7Ci0JCXViX3B1dF9jbWQobHVuLCBjbWQpOwotCQl1Yl9lbmRfcnEocnEsIDApOwotCQlibGtfc3RhcnRfcXVldWUocSk7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBYWFggVW5mb3J0dW5hdGVseSwgdGhpcyBjaGVjayBkb2VzIG5vdCB3b3JrLiBJdCBpcyBxdWl0ZSBwb3NzaWJsZQotCSAqIHRvIGdldCBib2d1cyBub24tbnVsbCBycS0+YnVmZmVyIGlmIHlvdSBhbGxvdyBzZyBieSBtaXN0YWtlLgotCSAqLwotCWlmIChycS0+YnVmZmVyID09IE5VTEwpIHsKLQkJLyoKLQkJICogVGhpcyBtdXN0IG5vdCBoYXBwZW4gaWYgd2Ugc2V0IHRoZSBxdWV1ZSByaWdodC4KLQkJICogVGhlIGJsb2NrIGxldmVsIG11c3QgY3JlYXRlIGJvdW5jZSBidWZmZXJzIGZvciB1cy4KLQkJICovCi0JCXN0YXRpYyBpbnQgZG9fcHJpbnQgPSAxOwotCQlpZiAoZG9fcHJpbnQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bm1hcHBlZCBibG9jayByZXF1ZXN0IgotCQkJICAgICIgZmxhZ3MgMHglbHggc2VjdG9ycyAlbHVcbiIsCi0JCQkgICAgc2MtPm5hbWUsIHJxLT5mbGFncywgcnEtPm5yX3NlY3RvcnMpOwotCQkJZG9fcHJpbnQgPSAwOwotCQl9CiAJCXJldHVybiAtMTsKIAl9CisJY21kLT5uc2cgPSBuX2VsZW07CisJc2MtPnNnX3N0YXRbbl9lbGVtXSsrOwogCiAJLyoKIAkgKiBidWlsZCB0aGUgY29tbWFuZApAQCAtODc2LDMwICs4NTYsMTUgQEAKIAljbWQtPmNkYls4XSA9IG5ibGtzOwogCWNtZC0+Y2RiX2xlbiA9IDEwOwogCi0JY21kLT5kaXIgPSB1Yl9kaXI7Ci0JY21kLT5kYXRhID0gcnEtPmJ1ZmZlcjsKIAljbWQtPmxlbiA9IHJxLT5ucl9zZWN0b3JzICogNTEyOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWJfY21kX2J1aWxkX3BhY2tldChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQsCi0gICAgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIGludCB1Yl9jbWRfYnVpbGRfcGFja2V0KHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfbHVuICpsdW4sCisgICAgc3RydWN0IHViX3Njc2lfY21kICpjbWQsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQotCWlmIChycS0+ZGF0YV9sZW4gIT0gMCAmJiBycS0+ZGF0YSA9PSBOVUxMKSB7Ci0JCXN0YXRpYyBpbnQgZG9fcHJpbnQgPSAxOwotCQlpZiAoZG9fcHJpbnQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bm1hcHBlZCBwYWNrZXQgcmVxdWVzdCIKLQkJCSAgICAiIGZsYWdzIDB4JWx4IGxlbmd0aCAlZFxuIiwKLQkJCSAgICBzYy0+bmFtZSwgcnEtPmZsYWdzLCBycS0+ZGF0YV9sZW4pOwotCQkJZG9fcHJpbnQgPSAwOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQltZW1jcHkoJmNtZC0+Y2RiLCBycS0+Y21kLCBycS0+Y21kX2xlbik7Ci0JY21kLT5jZGJfbGVuID0gcnEtPmNtZF9sZW47CisJaW50IG5fZWxlbTsKIAogCWlmIChycS0+ZGF0YV9sZW4gPT0gMCkgewogCQljbWQtPmRpciA9IFVCX0RJUl9OT05FOwpAQCAtOTA4LDggKzg3MywyOSBAQAogCQkJY21kLT5kaXIgPSBVQl9ESVJfV1JJVEU7CiAJCWVsc2UKIAkJCWNtZC0+ZGlyID0gVUJfRElSX1JFQUQ7CisKIAl9Ci0JY21kLT5kYXRhID0gcnEtPmRhdGE7CisKKwkvKgorCSAqIGdldCBzY2F0dGVybGlzdCBmcm9tIGJsb2NrIGxheWVyCisJICovCisJbl9lbGVtID0gYmxrX3JxX21hcF9zZyhsdW4tPmRpc2stPnF1ZXVlLCBycSwgJmNtZC0+c2d2WzBdKTsKKwlpZiAobl9lbGVtIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHJlcXVlc3QgbWFwICglZClcbiIsCisJCSAgICBzYy0+bmFtZSwgbl9lbGVtKTsgLyogUDMgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobl9lbGVtID4gVUJfTUFYX1JFUV9TRykgewkvKiBQYXJhbm9pYSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVxdWVzdCB3aXRoICVkIHNlZ21lbnRzXG4iLAorCQkgICAgc2MtPm5hbWUsIG5fZWxlbSk7CisJCXJldHVybiAtMTsKKwl9CisJY21kLT5uc2cgPSBuX2VsZW07CisJc2MtPnNnX3N0YXRbbl9lbGVtXSsrOworCisJbWVtY3B5KCZjbWQtPmNkYiwgcnEtPmNtZCwgcnEtPmNtZF9sZW4pOworCWNtZC0+Y2RiX2xlbiA9IHJxLT5jbWRfbGVuOworCiAJY21kLT5sZW4gPSBycS0+ZGF0YV9sZW47CiAKIAlyZXR1cm4gMDsKQEAgLTkxOSwyNCArOTA1LDM0IEBACiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gY21kLT5iYWNrOwogCXN0cnVjdCB1Yl9sdW4gKmx1biA9IGNtZC0+bHVuOwotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gbHVuLT5kaXNrOwotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGRpc2stPnF1ZXVlOwogCWludCB1cHRvZGF0ZTsKIAotCWlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKLQkJLyogVUJfU0VOU0VfU0laRSBpcyBzbWFsbGVyIHRoYW4gU0NTSV9TRU5TRV9CVUZGRVJTSVpFICovCi0JCW1lbWNweShycS0+c2Vuc2UsIHNjLT50b3Bfc2Vuc2UsIFVCX1NFTlNFX1NJWkUpOwotCQlycS0+c2Vuc2VfbGVuID0gVUJfU0VOU0VfU0laRTsKLQl9Ci0KLQlpZiAoY21kLT5lcnJvciA9PSAwKQorCWlmIChjbWQtPmVycm9yID09IDApIHsKIAkJdXB0b2RhdGUgPSAxOwotCWVsc2UKKworCQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7CisJCQlpZiAoY21kLT5hY3RfbGVuID49IHJxLT5kYXRhX2xlbikKKwkJCQlycS0+ZGF0YV9sZW4gPSAwOworCQkJZWxzZQorCQkJCXJxLT5kYXRhX2xlbiAtPSBjbWQtPmFjdF9sZW47CisJCX0KKwl9IGVsc2UgewogCQl1cHRvZGF0ZSA9IDA7CiAKKwkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgeworCQkJLyogVUJfU0VOU0VfU0laRSBpcyBzbWFsbGVyIHRoYW4gU0NTSV9TRU5TRV9CVUZGRVJTSVpFICovCisJCQltZW1jcHkocnEtPnNlbnNlLCBzYy0+dG9wX3NlbnNlLCBVQl9TRU5TRV9TSVpFKTsKKwkJCXJxLT5zZW5zZV9sZW4gPSBVQl9TRU5TRV9TSVpFOworCQkJaWYgKHNjLT50b3Bfc2Vuc2VbMF0gIT0gMCkKKwkJCQlycS0+ZXJyb3JzID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQkJZWxzZQorCQkJCXJxLT5lcnJvcnMgPSBESURfRVJST1IgPDwgMTY7CisJCX0KKwl9CisKIAl1Yl9wdXRfY21kKGx1biwgY21kKTsKIAl1Yl9lbmRfcnEocnEsIHVwdG9kYXRlKTsKLQlibGtfc3RhcnRfcXVldWUocSk7CisJYmxrX3N0YXJ0X3F1ZXVlKGx1bi0+ZGlzay0+cXVldWUpOwogfQogCiBzdGF0aWMgdm9pZCB1Yl9lbmRfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUpCkBAIC0xMDE0LDcgKzEwMTAsNyBAQAogCXNjLT5sYXN0X3BpcGUgPSBzYy0+c2VuZF9idWxrX3BpcGU7CiAJdXNiX2ZpbGxfYnVsa191cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgc2MtPnNlbmRfYnVsa19waXBlLAogCSAgICBiY2IsIFVTX0JVTEtfQ0JfV1JBUF9MRU4sIHViX3VyYl9jb21wbGV0ZSwgc2MpOwotCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CisJc2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gMDsKIAogCS8qIEZpbGwgd2hhdCB3ZSBzaG91bGRuJ3QgYmUgZmlsbGluZywgYmVjYXVzZSB1c2Itc3RvcmFnZSBkaWQgc28uICovCiAJc2MtPndvcmtfdXJiLmFjdHVhbF9sZW5ndGggPSAwOwpAQCAtMTEwMyw3ICsxMDk5LDYgQEAKIHsKIAlzdHJ1Y3QgdXJiICp1cmIgPSAmc2MtPndvcmtfdXJiOwogCXN0cnVjdCBidWxrX2NzX3dyYXAgKmJjczsKLQlpbnQgcGlwZTsKIAlpbnQgcmM7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnNjLT5wb2lzb24pKSB7CkBAIC0xMjA0LDM4ICsxMTk5LDEzIEBACiAJCQlnb3RvIEJhZF9FbmQ7CiAJCX0KIAotCQlpZiAoY21kLT5kaXIgPT0gVUJfRElSX05PTkUpIHsKKwkJaWYgKGNtZC0+ZGlyID09IFVCX0RJUl9OT05FIHx8IGNtZC0+bnNnIDwgMSkgewogCQkJdWJfc3RhdGVfc3RhdChzYywgY21kKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCVVCX0lOSVRfQ09NUExFVElPTihzYy0+d29ya19kb25lKTsKLQotCQlpZiAoY21kLT5kaXIgPT0gVUJfRElSX1JFQUQpCi0JCQlwaXBlID0gc2MtPnJlY3ZfYnVsa19waXBlOwotCQllbHNlCi0JCQlwaXBlID0gc2MtPnNlbmRfYnVsa19waXBlOwotCQlzYy0+bGFzdF9waXBlID0gcGlwZTsKLQkJdXNiX2ZpbGxfYnVsa191cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgcGlwZSwKLQkJICAgIGNtZC0+ZGF0YSwgY21kLT5sZW4sIHViX3VyYl9jb21wbGV0ZSwgc2MpOwotCQlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3MgPSBVUkJfQVNZTkNfVU5MSU5LOwotCQlzYy0+d29ya191cmIuYWN0dWFsX2xlbmd0aCA9IDA7Ci0JCXNjLT53b3JrX3VyYi5lcnJvcl9jb3VudCA9IDA7Ci0JCXNjLT53b3JrX3VyYi5zdGF0dXMgPSAwOwotCi0JCWlmICgocmMgPSB1c2Jfc3VibWl0X3VyYigmc2MtPndvcmtfdXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewotCQkJLyogWFhYIENsZWFyIHN0YWxscyAqLwotCQkJcHJpbnRrKCJ1YjogZGF0YSAjJWQgc3VibWl0IGZhaWxlZCAoJWQpXG4iLCBjbWQtPnRhZywgcmMpOyAvKiBQMyAqLwotCQkJdWJfY29tcGxldGUoJnNjLT53b3JrX2RvbmUpOwotCQkJdWJfc3RhdGVfZG9uZShzYywgY21kLCByYyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzYy0+d29ya190aW1lci5leHBpcmVzID0gamlmZmllcyArIFVCX0RBVEFfVElNRU9VVDsKLQkJYWRkX3RpbWVyKCZzYy0+d29ya190aW1lcik7Ci0KLQkJY21kLT5zdGF0ZSA9IFVCX0NNRFNUX0RBVEE7Ci0JCXViX2NtZHRyX3N0YXRlKHNjLCBjbWQpOworCQkvLyB1ZGVsYXkoMTI1KTsJCS8vIHVzYi1zdG9yYWdlIGhhcyB0aGlzCisJCXViX2RhdGFfc3RhcnQoc2MsIGNtZCk7CiAKIAl9IGVsc2UgaWYgKGNtZC0+c3RhdGUgPT0gVUJfQ01EU1RfREFUQSkgewogCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKSB7CkBAIC0xMjU3LDE2ICsxMjI3LDIyIEBACiAJCWlmICh1cmItPnN0YXR1cyA9PSAtRU9WRVJGTE9XKSB7CiAJCQkvKgogCQkJICogQSBiYWJibGU/IEZhaWx1cmUsIGJ1dCB3ZSBtdXN0IHRyYW5zZmVyIENTVyBub3cuCisJCQkgKiBYWFggVGhpcyBpcyBnb2luZyB0byBlbmQgaW4gcGVycGV0dWFsIGJhYmJsZS4gUmVzZXQuCiAJCQkgKi8KIAkJCWNtZC0+ZXJyb3IgPSAtRU9WRVJGTE9XOwkvKiBBIGNoZWFwIHRyaWNrLi4uICovCi0JCX0gZWxzZSB7Ci0JCQlpZiAodXJiLT5zdGF0dXMgIT0gMCkKLQkJCQlnb3RvIEJhZF9FbmQ7CisJCQl1Yl9zdGF0ZV9zdGF0KHNjLCBjbWQpOworCQkJcmV0dXJuOwogCQl9CisJCWlmICh1cmItPnN0YXR1cyAhPSAwKQorCQkJZ290byBCYWRfRW5kOwogCi0JCWNtZC0+YWN0X2xlbiA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJY21kLT5hY3RfbGVuICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAkJdWJfY21kdHJfYWN0X2xlbihzYywgY21kKTsKIAorCQlpZiAoKytjbWQtPmN1cnJlbnRfc2cgPCBjbWQtPm5zZykgeworCQkJdWJfZGF0YV9zdGFydChzYywgY21kKTsKKwkJCXJldHVybjsKKwkJfQogCQl1Yl9zdGF0ZV9zdGF0KHNjLCBjbWQpOwogCiAJfSBlbHNlIGlmIChjbWQtPnN0YXRlID09IFVCX0NNRFNUX1NUQVQpIHsKQEAgLTE0MDEsNiArMTM3Nyw0NiBAQAogCiAvKgogICogRmFjdG9yaXphdGlvbiBoZWxwZXIgZm9yIHRoZSBjb21tYW5kIHN0YXRlIG1hY2hpbmU6CisgKiBJbml0aWF0ZSBhIGRhdGEgc2VnbWVudCB0cmFuc2Zlci4KKyAqLworc3RhdGljIHZvaWQgdWJfZGF0YV9zdGFydChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZjbWQtPnNndltjbWQtPmN1cnJlbnRfc2ddOworCWludCBwaXBlOworCWludCByYzsKKworCVVCX0lOSVRfQ09NUExFVElPTihzYy0+d29ya19kb25lKTsKKworCWlmIChjbWQtPmRpciA9PSBVQl9ESVJfUkVBRCkKKwkJcGlwZSA9IHNjLT5yZWN2X2J1bGtfcGlwZTsKKwllbHNlCisJCXBpcGUgPSBzYy0+c2VuZF9idWxrX3BpcGU7CisJc2MtPmxhc3RfcGlwZSA9IHBpcGU7CisJdXNiX2ZpbGxfYnVsa191cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgcGlwZSwKKwkgICAgcGFnZV9hZGRyZXNzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsCisJICAgIHViX3VyYl9jb21wbGV0ZSwgc2MpOworCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IDA7CisJc2MtPndvcmtfdXJiLmFjdHVhbF9sZW5ndGggPSAwOworCXNjLT53b3JrX3VyYi5lcnJvcl9jb3VudCA9IDA7CisJc2MtPndvcmtfdXJiLnN0YXR1cyA9IDA7CisKKwlpZiAoKHJjID0gdXNiX3N1Ym1pdF91cmIoJnNjLT53b3JrX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKKwkJLyogWFhYIENsZWFyIHN0YWxscyAqLworCQlwcmludGsoInViOiBkYXRhICMlZCBzdWJtaXQgZmFpbGVkICglZClcbiIsIGNtZC0+dGFnLCByYyk7IC8qIFAzICovCisJCXViX2NvbXBsZXRlKCZzYy0+d29ya19kb25lKTsKKwkJdWJfc3RhdGVfZG9uZShzYywgY21kLCByYyk7CisJCXJldHVybjsKKwl9CisKKwlzYy0+d29ya190aW1lci5leHBpcmVzID0gamlmZmllcyArIFVCX0RBVEFfVElNRU9VVDsKKwlhZGRfdGltZXIoJnNjLT53b3JrX3RpbWVyKTsKKworCWNtZC0+c3RhdGUgPSBVQl9DTURTVF9EQVRBOworCXViX2NtZHRyX3N0YXRlKHNjLCBjbWQpOworfQorCisvKgorICogRmFjdG9yaXphdGlvbiBoZWxwZXIgZm9yIHRoZSBjb21tYW5kIHN0YXRlIG1hY2hpbmU6CiAgKiBGaW5pc2ggdGhlIGNvbW1hbmQuCiAgKi8KIHN0YXRpYyB2b2lkIHViX3N0YXRlX2RvbmUoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLCBpbnQgcmMpCkBAIC0xNDI2LDcgKzE0NDIsNyBAQAogCXNjLT5sYXN0X3BpcGUgPSBzYy0+cmVjdl9idWxrX3BpcGU7CiAJdXNiX2ZpbGxfYnVsa191cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgc2MtPnJlY3ZfYnVsa19waXBlLAogCSAgICAmc2MtPndvcmtfYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCB1Yl91cmJfY29tcGxldGUsIHNjKTsKLQlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3MgPSBVUkJfQVNZTkNfVU5MSU5LOworCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IDA7CiAJc2MtPndvcmtfdXJiLmFjdHVhbF9sZW5ndGggPSAwOwogCXNjLT53b3JrX3VyYi5lcnJvcl9jb3VudCA9IDA7CiAJc2MtPndvcmtfdXJiLnN0YXR1cyA9IDA7CkBAIC0xNDg0LDYgKzE1MDAsNyBAQAogc3RhdGljIHZvaWQgdWJfc3RhdGVfc2Vuc2Uoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKQogewogCXN0cnVjdCB1Yl9zY3NpX2NtZCAqc2NtZDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCByYzsKIAogCWlmIChjbWQtPmNkYlswXSA9PSBSRVFVRVNUX1NFTlNFKSB7CkBAIC0xNDkyLDEyICsxNTA5LDE3IEBACiAJfQogCiAJc2NtZCA9ICZzYy0+dG9wX3Jxc19jbWQ7CisJbWVtc2V0KHNjbWQsIDAsIHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpKTsKIAlzY21kLT5jZGJbMF0gPSBSRVFVRVNUX1NFTlNFOwogCXNjbWQtPmNkYls0XSA9IFVCX1NFTlNFX1NJWkU7CiAJc2NtZC0+Y2RiX2xlbiA9IDY7CiAJc2NtZC0+ZGlyID0gVUJfRElSX1JFQUQ7CiAJc2NtZC0+c3RhdGUgPSBVQl9DTURTVF9JTklUOwotCXNjbWQtPmRhdGEgPSBzYy0+dG9wX3NlbnNlOworCXNjbWQtPm5zZyA9IDE7CisJc2cgPSAmc2NtZC0+c2d2WzBdOworCXNnLT5wYWdlID0gdmlydF90b19wYWdlKHNjLT50b3Bfc2Vuc2UpOworCXNnLT5vZmZzZXQgPSAodW5zaWduZWQgaW50KXNjLT50b3Bfc2Vuc2UgJiAoUEFHRV9TSVpFLTEpOworCXNnLT5sZW5ndGggPSBVQl9TRU5TRV9TSVpFOwogCXNjbWQtPmxlbiA9IFVCX1NFTlNFX1NJWkU7CiAJc2NtZC0+bHVuID0gY21kLT5sdW47CiAJc2NtZC0+ZG9uZSA9IHViX3RvcF9zZW5zZV9kb25lOwpAQCAtMTU0MSw3ICsxNTYzLDcgQEAKIAogCXVzYl9maWxsX2NvbnRyb2xfdXJiKCZzYy0+d29ya191cmIsIHNjLT5kZXYsIHNjLT5zZW5kX2N0cmxfcGlwZSwKIAkgICAgKHVuc2lnbmVkIGNoYXIqKSBjciwgTlVMTCwgMCwgdWJfdXJiX2NvbXBsZXRlLCBzYyk7Ci0Jc2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKKwlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3MgPSAwOwogCXNjLT53b3JrX3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKIAlzYy0+d29ya191cmIuZXJyb3JfY291bnQgPSAwOwogCXNjLT53b3JrX3VyYi5zdGF0dXMgPSAwOwpAQCAtMTU2MCw3ICsxNTgyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgdWJfdG9wX3NlbnNlX2RvbmUoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqc2NtZCkKIHsKLQl1bnNpZ25lZCBjaGFyICpzZW5zZSA9IHNjbWQtPmRhdGE7CisJdW5zaWduZWQgY2hhciAqc2Vuc2UgPSBzYy0+dG9wX3NlbnNlOwogCXN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kOwogCiAJLyoKQEAgLTE4NTIsNiArMTg3NCw3IEBACiAgICAgc3RydWN0IHViX2NhcGFjaXR5ICpyZXQpCiB7CiAJc3RydWN0IHViX3Njc2lfY21kICpjbWQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAljaGFyICpwOwogCWVudW0geyBBTExPQ19TSVpFID0gc2l6ZW9mKHN0cnVjdCB1Yl9zY3NpX2NtZCkgKyA4IH07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE4NzIsNyArMTg5NSwxMSBAQAogCWNtZC0+Y2RiX2xlbiA9IDEwOwogCWNtZC0+ZGlyID0gVUJfRElSX1JFQUQ7CiAJY21kLT5zdGF0ZSA9IFVCX0NNRFNUX0lOSVQ7Ci0JY21kLT5kYXRhID0gcDsKKwljbWQtPm5zZyA9IDE7CisJc2cgPSAmY21kLT5zZ3ZbMF07CisJc2ctPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocCk7CisJc2ctPm9mZnNldCA9ICh1bnNpZ25lZCBpbnQpcCAmIChQQUdFX1NJWkUtMSk7CisJc2ctPmxlbmd0aCA9IDg7CiAJY21kLT5sZW4gPSA4OwogCWNtZC0+bHVuID0gbHVuOwogCWNtZC0+ZG9uZSA9IHViX3Byb2JlX2RvbmU7CkBAIC0yMjg5LDcgKzIzMTYsNyBAQAogCWRpc2stPmRyaXZlcmZzX2RldiA9ICZzYy0+aW50Zi0+ZGV2OwkvKiBYWFggTWFueSB0byBvbmUgb2s/ICovCiAKIAlyYyA9IC1FTk9NRU07Ci0JaWYgKChxID0gYmxrX2luaXRfcXVldWUodWJfYmRfcnFfZm4sICZzYy0+bG9jaykpID09IE5VTEwpCisJaWYgKChxID0gYmxrX2luaXRfcXVldWUodWJfcmVxdWVzdF9mbiwgJnNjLT5sb2NrKSkgPT0gTlVMTCkKIAkJZ290byBlcnJfYmxrcWluaXQ7CiAKIAlkaXNrLT5xdWV1ZSA9IHE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYyBiL2RyaXZlcnMvYmxvY2svdW1lbS5jCmluZGV4IDBjNGMxMjEuLjBmNDgzMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdW1lbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svdW1lbS5jCkBAIC0zNCw2ICszNCw3IEBACiAgKgkJCSAtIHNldCBpbml0aWFsaXNlZCBiaXQgdGhlbi4KICAqLwogCisvLyNkZWZpbmUgREVCVUcgLyogdW5jb21tZW50IGlmIHlvdSB3YW50IGRlYnVnZ2luZyBpbmZvIChwcl9kZWJ1ZykgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC01OCwxMCArNTksNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNkZWZpbmUgUFJJTlRLKHguLi4pIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBkcHJpbnRrKHguLi4pIGRvIHt9IHdoaWxlICgwKQotLyojZGVmaW5lIGRwcmludGsoeC4uLikgcHJpbnRrKHgpICovCi0KICNkZWZpbmUgTU1fTUFYQ0FSRFMgNAogI2RlZmluZSBNTV9SQUhFQUQgMiAgICAgIC8qIHR3byBzZWN0b3JzICovCiAjZGVmaW5lIE1NX0JMS1NJWkUgMTAyNCAgLyogMWsgYmxvY2tzICovCkBAIC0yOTksNyArMjk2LDcgQEAKIAogCS8qIG1ha2UgdGhlIGxhc3QgZGVzY3JpcHRvciBlbmQgdGhlIGNoYWluICovCiAJcGFnZSA9ICZjYXJkLT5tbV9wYWdlc1tjYXJkLT5BY3RpdmVdOwotCVBSSU5USygic3RhcnRfaW86ICVkICVkLT4lZFxuIiwgY2FyZC0+QWN0aXZlLCBwYWdlLT5oZWFkY250LCBwYWdlLT5jbnQtMSk7CisJcHJfZGVidWcoInN0YXJ0X2lvOiAlZCAlZC0+JWRcbiIsIGNhcmQtPkFjdGl2ZSwgcGFnZS0+aGVhZGNudCwgcGFnZS0+Y250LTEpOwogCWRlc2MgPSAmcGFnZS0+ZGVzY1twYWdlLT5jbnQtMV07CiAKIAlkZXNjLT5jb250cm9sX2JpdHMgfD0gY3B1X3RvX2xlMzIoRE1BU0NSX0NIQUlOX0NPTVBfRU4pOwpAQCAtNTMyLDcgKzUyOSw3IEBACiAJCWFjdGl2YXRlKGNhcmQpOwogCX0gZWxzZSB7CiAJCS8qIGhhdmVuJ3QgZmluaXNoZWQgd2l0aCB0aGlzIG9uZSB5ZXQgKi8KLQkJUFJJTlRLKCJkbyBzb21lIG1vcmVcbiIpOworCQlwcl9kZWJ1ZygiZG8gc29tZSBtb3JlXG4iKTsKIAkJbW1fc3RhcnRfaW8oY2FyZCk7CiAJfQogIG91dF91bmxvY2s6CkBAIC01NTUsNyArNTUyLDcgQEAKIHN0YXRpYyBpbnQgbW1fbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBjYXJkaW5mbyAqY2FyZCA9IHEtPnF1ZXVlZGF0YTsKLQlQUklOVEsoIm1tX21ha2VfcmVxdWVzdCAlbGQgJWRcbiIsIGJoLT5iX3JzZWN0b3IsIGJoLT5iX3NpemUpOworCXByX2RlYnVnKCJtbV9tYWtlX3JlcXVlc3QgJWxkICVkXG4iLCBiaC0+Yl9yc2VjdG9yLCBiaC0+Yl9zaXplKTsKIAogCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IGJpby0+YmlfaWR4OyAvKiBjb3VudCBvZiBjb21wbGV0ZWQgc2VnbWVudHMqLwogCXNwaW5fbG9ja19pcnEoJmNhcmQtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZC5jIGIvZHJpdmVycy9ibG9jay94ZC5jCmluZGV4IDE2NzYwMzMuLjY4YjZkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hkLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjIsNyArNjMsNyBAQAogCiAjZGVmaW5lIFhEX0RPTlRfVVNFX0RNQQkJMCAgLyogSW5pdGlhbCB2YWx1ZS4gbWF5IGJlIG92ZXJyaWRlbiB1c2luZwogCQkJCSAgICAgICJub2RtYSIgbW9kdWxlIG9wdGlvbiAqLwotI2RlZmluZSBYRF9JTklUX0RJU0tfREVMQVkJKDMwKkhaLzEwMDApICAvKiAzMCBtcyBkZWxheSBkdXJpbmcgZGlzayBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBYRF9JTklUX0RJU0tfREVMQVkJKDMwKSAgLyogMzAgbXMgZGVsYXkgZHVyaW5nIGRpc2sgaW5pdGlhbGl6YXRpb24gKi8KIAogLyogQWJvdmUgbWF5IG5lZWQgdG8gYmUgaW5jcmVhc2VkIGlmIGEgcHJvYmxlbSB3aXRoIHRoZSAybmQgZHJpdmUgZGV0ZWN0aW9uCiAgICAoU1QxMU0gY29udHJvbGxlcikgb3IgcmVzZXR0aW5nIGEgY29udHJvbGxlciAoV0QpIGFwcGVhcnMgKi8KQEAgLTUyOSwxMCArNTMwLDggQEAKIAlpbnQgc3VjY2VzczsKIAogCXhkY19idXN5ID0gMTsKLQl3aGlsZSAoKHN1Y2Nlc3MgPSAoKGluYihwb3J0KSAmIG1hc2spICE9IGZsYWdzKSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJ5KSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCXdoaWxlICgoc3VjY2VzcyA9ICgoaW5iKHBvcnQpICYgbWFzaykgIT0gZmxhZ3MpKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcnkpKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl4ZGNfYnVzeSA9IDA7CiAJcmV0dXJuIChzdWNjZXNzKTsKIH0KQEAgLTYzMywxNCArNjMyLDEyIEBACiAJZm9yIChpID0gMDsgaSA8IFhEX01BWERSSVZFUzsgaSsrKSB7CiAJCXhkX2J1aWxkKGNtZGJsayxDTURfVEVTVFJFQURZLGksMCwwLDAsMCwwKTsKIAkJaWYgKCF4ZF9jb21tYW5kKGNtZGJsayxQSU9fTU9ERSxOVUxMLE5VTEwsTlVMTCxYRF9USU1FT1VUKjgpKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dChYRF9JTklUX0RJU0tfREVMQVkpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoWERfSU5JVF9ESVNLX0RFTEFZKTsKIAogCQkJaW5pdF9kcml2ZShjb3VudCk7CiAJCQljb3VudCsrOwogCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dChYRF9JTklUX0RJU0tfREVMQVkpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoWERfSU5JVF9ESVNLX0RFTEFZKTsKIAkJfQogCX0KIAlyZXR1cm4gKGNvdW50KTsKQEAgLTc2MSw4ICs3NTgsNyBAQAogCiAJb3V0YigwLFhEX1JFU0VUKTsJCS8qIHJlc2V0IHRoZSBjb250cm9sbGVyICovCiAKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dChYRF9JTklUX0RJU0tfREVMQVkpOworCW1zbGVlcChYRF9JTklUX0RJU0tfREVMQVkpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgeGRfd2RfaW5pdF9kcml2ZSAodV9jaGFyIGRyaXZlKQpAQCAtOTM2LDggKzkzMiw3IEBACiAJeGRfbWF4c2VjdG9ycyA9IDB4MDE7CiAJb3V0YigwLFhEX1JFU0VUKTsJCS8qIHJlc2V0IHRoZSBjb250cm9sbGVyICovCiAKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dChYRF9JTklUX0RJU0tfREVMQVkpOworCW1zbGVlcChYRF9JTklUX0RJU0tfREVMQVkpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgeGRfeGViZWNfaW5pdF9kcml2ZSAodV9jaGFyIGRyaXZlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay96MnJhbS5jIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCmluZGV4IDAwN2Y2YTYuLmJiNWU4ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svejJyYW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogICAgIHJldHVybiAwOwogCiBlcnJfb3V0X2tmcmVlOgotICAgIGtmcmVlKCB6MnJhbV9tYXAgKTsKKyAgICBrZnJlZSh6MnJhbV9tYXApOwogZXJyX291dDoKICAgICByZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2F6dGNkLmMgYi9kcml2ZXJzL2Nkcm9tL2F6dGNkLmMKaW5kZXggNDNiZjFlNS4uY2U0YTFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9henRjZC5jCisrKyBiL2RyaXZlcnMvY2Ryb20vYXp0Y2QuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAKIHN0YXRpYyBpbnQgQXp0VGltZW91dCwgQXp0VHJpZXM7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXp0X3dhaXRxKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZWxheV90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkZWxheV90aW1lciwgTlVMTCwgMCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXp0X0Rpc2tJbmZvIERpc2tJbmZvOwogc3RhdGljIHN0cnVjdCBhenRfVG9jIFRvY1tNQVhfVFJBQ0tTXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwppbmRleCBiZWFhNTYxLi4xNTM5NjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKKysrIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCkBAIC0yMDk3LDYgKzIwOTcsMTAgQEAKIAlpZiAoIXEpCiAJCXJldHVybiAtRU5YSU87CiAKKwlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJxKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWNkaS0+bGFzdF9zZW5zZSA9IDA7CiAKIAl3aGlsZSAobmZyYW1lcykgewpAQCAtMjEwOCw5ICsyMTEyLDkgQEAKIAogCQlsZW4gPSBuciAqIENEX0ZSQU1FU0laRV9SQVc7CiAKLQkJcnEgPSBibGtfcnFfbWFwX3VzZXIocSwgUkVBRCwgdWJ1ZiwgbGVuKTsKLQkJaWYgKElTX0VSUihycSkpCi0JCQlyZXR1cm4gUFRSX0VSUihycSk7CisJCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgdWJ1ZiwgbGVuKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCiAJCW1lbXNldChycS0+Y21kLCAwLCBzaXplb2YocnEtPmNtZCkpOwogCQlycS0+Y21kWzBdID0gR1BDTURfUkVBRF9DRDsKQEAgLTIxMzIsMTMgKzIxMzYsMTMgQEAKIAkJaWYgKHJxLT5iaW8pCiAJCQlibGtfcXVldWVfYm91bmNlKHEsICZycS0+YmlvKTsKIAotCQlpZiAoYmxrX2V4ZWN1dGVfcnEocSwgY2RpLT5kaXNrLCBycSkpIHsKKwkJaWYgKGJsa19leGVjdXRlX3JxKHEsIGNkaS0+ZGlzaywgcnEsIDApKSB7CiAJCQlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqcyA9IHJxLT5zZW5zZTsKIAkJCXJldCA9IC1FSU87CiAJCQljZGktPmxhc3Rfc2Vuc2UgPSBzLT5zZW5zZV9rZXk7CiAJCX0KIAotCQlpZiAoYmxrX3JxX3VubWFwX3VzZXIocnEsIGJpbywgbGVuKSkKKwkJaWYgKGJsa19ycV91bm1hcF91c2VyKGJpbywgbGVuKSkKIAkJCXJldCA9IC1FRkFVTFQ7CiAKIAkJaWYgKHJldCkKQEAgLTIxNDksNiArMjE1Myw3IEBACiAJCXVidWYgKz0gbGVuOwogCX0KIAorCWJsa19wdXRfcmVxdWVzdChycSk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9nc2NkLmMgYi9kcml2ZXJzL2Nkcm9tL2dzY2QuYwppbmRleCA3ZWFjMTBlLi5hZDU0NjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL2dzY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL2dzY2QuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiBzdGF0aWMgaW50IEF1ZGlvRW5kX207CiBzdGF0aWMgaW50IEF1ZGlvRW5kX2Y7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBnc2NkX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGdzY2RfdGltZXIsIE5VTEwsIDAsIDApOwogc3RhdGljIERFRklORV9TUElOTE9DSyhnc2NkX2xvY2spOwogc3RhdGljIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpnc2NkX3F1ZXVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL29wdGNkLmMgYi9kcml2ZXJzL2Nkcm9tL29wdGNkLmMKaW5kZXggMzUxYTAxZC4uMGIwZWFiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9vcHRjZC5jCisrKyBiL2RyaXZlcnMvY2Ryb20vb3B0Y2QuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiBzdGF0aWMgaW50IHNsZWVwX3RpbWVvdXQ7CS8qIG1heCAjIG9mIHRpY2tzIHRvIHNsZWVwICovCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdHEpOwogc3RhdGljIHZvaWQgc2xlZXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZWxheV90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKHNsZWVwX3RpbWVyLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoZGVsYXlfdGltZXIsIHNsZWVwX3RpbWVyLCAwLCAwKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sob3B0Y2RfbG9jayk7CiBzdGF0aWMgc3RydWN0IHJlcXVlc3RfcXVldWUgKm9wdF9xdWV1ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9zYnBjZC5jIGIvZHJpdmVycy9jZHJvbS9zYnBjZC5jCmluZGV4IDQ1MmQzNDYuLjQ2NmU5YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vc2JwY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKQEAgLTc0MiwxMyArNzQyLDEwIEBACiB1bnNpZ25lZCBsb25nIGNsaV9zdGk7IC8qIGZvciBzYXZpbmcgdGhlIHByb2Nlc3NvciBmbGFncyAqLwogI2VuZGlmCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZWxheV90aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKG1hcmtfdGltZW91dF9kZWxheSwgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZGF0YV90aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKG1hcmtfdGltZW91dF9kYXRhLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoZGVsYXlfdGltZXIsIG1hcmtfdGltZW91dF9kZWxheSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGRhdGFfdGltZXIsIG1hcmtfdGltZW91dF9kYXRhLCAwLCAwKTsKICNpZiAwCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYXVkaW9fdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihtYXJrX3RpbWVvdXRfYXVkaW8sIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihhdWRpb190aW1lciwgbWFya190aW1lb3V0X2F1ZGlvLCAwLCAwKTsKICNlbmRpZgogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKgpAQCAtODMwLDggKzgyNyw3IEBACiBzdGF0aWMgdm9pZCBzYnBfc2xlZXAodV9pbnQgdGltZSkKIHsKIAlzdGkoKTsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KHRpbWUpOworCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lKTsKIAlzdGkoKTsKIH0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNDIxOSw3ICs0MjE1LDggQEAKIAkJCiAJY2FzZSBDRFJPTUFVRElPQlVGU0laOiAvKiBjb25maWd1cmUgdGhlIGF1ZGlvIGJ1ZmZlciBzaXplICovCiAJCW1zZyhEQkdfSU9DLCJpb2N0bDogQ0RST01BVURJT0JVRlNJWiBlbnRlcmVkLlxuIik7Ci0JCWlmIChjdXJyZW50X2RyaXZlLT5zYnBfYXVkc2l6PjApIHZmcmVlKGN1cnJlbnRfZHJpdmUtPmF1ZF9idWYpOworCQlpZiAoY3VycmVudF9kcml2ZS0+c2JwX2F1ZHNpej4wKQorCQkJdmZyZWUoY3VycmVudF9kcml2ZS0+YXVkX2J1Zik7CiAJCWN1cnJlbnRfZHJpdmUtPmF1ZF9idWY9TlVMTDsKIAkJY3VycmVudF9kcml2ZS0+c2JwX2F1ZHNpej1hcmc7CiAJCQpAQCAtNTkxMyw3ICs1OTEwLDggQEAKIAkJcHV0X2Rpc2soRF9TW2pdLmRpc2spOwogCQlkZXZmc19yZW1vdmUoInNicC9jMHQlZCIsIGopOwogCQl2ZnJlZShEX1Nbal0uc2JwX2J1Zik7Ci0JCWlmIChEX1Nbal0uc2JwX2F1ZHNpej4wKSB2ZnJlZShEX1Nbal0uYXVkX2J1Zik7CisJCWlmIChEX1Nbal0uc2JwX2F1ZHNpej4wKQorCQkJdmZyZWUoRF9TW2pdLmF1ZF9idWYpOwogCQlpZiAoKHVucmVnaXN0ZXJfY2Ryb20oRF9TW2pdLnNicGNkX2luZm9wKSA9PSAtRUlOVkFMKSkKIAkJewogCQkJbXNnKERCR19JTkYsICJXaGF0J3MgdGhhdDogY2FuJ3QgdW5yZWdpc3RlciBpbmZvICVzLlxuIiwgbWFqb3JfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL3NqY2QuYyBiL2RyaXZlcnMvY2Ryb20vc2pjZC5jCmluZGV4IDRlN2EzNDIuLjc0YjFjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vc2pjZC5jCisrKyBiL2RyaXZlcnMvY2Ryb20vc2pjZC5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIC8qCiAgKiBUaW1lci4KICAqLwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNqY2RfZGVsYXlfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc2pjZF9kZWxheV90aW1lciwgTlVMTCwgMCwgMCk7CiAKICNkZWZpbmUgU0pDRF9TRVRfVElNRVIoIGZ1bmMsIHRtb3V0ICkgICAgICAgICAgIFwKICAgICAoIHNqY2RfZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrdG1vdXQsICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9zb255Y2Q1MzUuYyBiL2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmMKaW5kZXggOWYyMmU4Zi4uZTY1NjU5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9zb255Y2Q1MzUuYworKysgYi9kcml2ZXJzL2Nkcm9tL3NvbnljZDUzNS5jCkBAIC0xNDc4LDggKzE0NzgsNyBAQAogCS8qIGxvb2sgZm9yIHRoZSBDRC1ST00sIGZvbGxvd3MgdGhlIHByb2NlZHVyZSBpbiB0aGUgRE9TIGRyaXZlciAqLwogCWluYihzZWxlY3RfdW5pdF9yZWcpOwogCS8qIHdhaXQgZm9yIDQwIDE4IEh6IHRpY2tzIChyZXZlcnNlLWVuZ2luZWVyZWQgZnJvbSBET1MgZHJpdmVyKSAqLwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dCgoSForMTcpKjQwLzE4KTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKEhaKzE3KSo0MC8xOCk7CiAJaW5iKHJlc3VsdF9yZWcpOwogCiAJb3V0YigwLCByZWFkX3N0YXR1c19yZWcpOwkvKiBkb2VzIGEgcmVzZXQ/ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IGExZGUwNmQuLmMyOTM2NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC04MCw3ICs4MCw3IEBACiAKIGNvbmZpZyBDT01QVVRPTkUKIAl0cmlzdGF0ZSAiQ29tcHV0b25lIEludGVsbGlQb3J0IFBsdXMgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUCAmJiAoQlJPS0VOIHx8ICFTUEFSQzMyKQorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIEJST0tFTl9PTl9TTVAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgZW50aXJlIGZhbWlseSBvZiBJbnRlbGxpcG9ydCBJSS9QbHVzCiAJICBjb250cm9sbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIE1pY3JvQ2hhbm5lbCBjb250cm9sbGVycyBhbmQKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiBjb25maWcgRElHSUVQQ0EKIAl0cmlzdGF0ZSAiRGlnaWJvYXJkIEludGVsbGlnZW50IEFzeW5jIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUCAmJiAoITY0QklUIHx8IEJST0tFTikKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIERpZ2kgSW50ZXJuYXRpb25hbCdzIFh4LCBYZXZlLCBhbmQgWGVtIHNlcmllcwogCSAgb2YgY2FyZHMgd2hpY2ggcHJvdmlkZSBtdWx0aXBsZSBzZXJpYWwgcG9ydHMuIFlvdSB3b3VsZCBuZWVkCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogY29uZmlnIFNZTkNMSU5LTVAKIAl0cmlzdGF0ZSAiU3luY0xpbmsgTXVsdGlwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgKEJST0tFTiB8fCAhU1BBUkMzMikKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3luY0xpbmsgTXVsdGlwb3J0ICgyIG9yIDQgcG9ydHMpCiAJICBzZXJpYWwgYWRhcHRlciwgcnVubmluZyBhc3luY2hyb25vdXMgYW5kIEhETEMgY29tbXVuaWNhdGlvbnMgdXAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCmluZGV4IDU5ZjU4OWQuLjBhNzYyNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwpAQCAtNDI5LDcgKzQyOSw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldjE7CiAJaW50IGk7CiAJdW5zaWduZWQgc2l6ZSA9IGFtZDY0X2ZldGNoX3NpemUoKTsKLQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHVwIFVMaSBBR1AuIFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyB1cCBVTGkgQUdQLlxuIik7CiAJZGV2MSA9IHBjaV9maW5kX3Nsb3QgKCh1bnNpZ25lZCBpbnQpcGRldi0+YnVzLT5udW1iZXIsUENJX0RFVkZOKDAsMCkpOwogCWlmIChkZXYxID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldGVjdGVkIGEgVUxpIGNoaXBzZXQsICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKaW5kZXggNGQ0ZTYwMi4uODJiNDNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKQEAgLTIwNiwxMCArMjA2LDkgQEAKIAkJYnJpZGdlLT5kcml2ZXItPmNsZWFudXAoKTsKIAlpZiAoYnJpZGdlLT5kcml2ZXItPmZyZWVfZ2F0dF90YWJsZSkKIAkJYnJpZGdlLT5kcml2ZXItPmZyZWVfZ2F0dF90YWJsZShicmlkZ2UpOwotCWlmIChicmlkZ2UtPmtleV9saXN0KSB7Ci0JCXZmcmVlKGJyaWRnZS0+a2V5X2xpc3QpOwotCQlicmlkZ2UtPmtleV9saXN0ID0gTlVMTDsKLQl9CisKKwl2ZnJlZShicmlkZ2UtPmtleV9saXN0KTsKKwlicmlkZ2UtPmtleV9saXN0ID0gTlVMTDsKIAogCWlmIChicmlkZ2UtPmRyaXZlci0+YWdwX2Rlc3Ryb3lfcGFnZSAmJgogCSAgICBicmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwppbmRleCBmMDA3OWU5Li5hYzlkYTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMzE5LDcgKzMxOSw2IEBACiAJCWluZm8tPm1vZGUgPSBicmlkZ2UtPm1vZGUgJiB+QUdQM19SRVNFUlZFRF9NQVNLOwogCWVsc2UKIAkJaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZSAmIH5BR1AyX1JFU0VSVkVEX01BU0s7Ci0JaW5mby0+bW9kZSA9IGJyaWRnZS0+bW9kZTsKIAlpbmZvLT5hcGVyX2Jhc2UgPSBicmlkZ2UtPmdhcnRfYnVzX2FkZHI7CiAJaW5mby0+YXBlcl9zaXplID0gYWdwX3JldHVybl9zaXplKCk7CiAJaW5mby0+bWF4X21lbW9yeSA9IGJyaWRnZS0+bWF4X21lbW9yeV9hZ3A7CkBAIC0zNTYsNyArMzU1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY3Vyci0+aXNfYm91bmQgPT0gVFJVRSkgewotCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIm1lbW9yeSAlcCBpcyBhbHJlYWR5IGJvdW5kIVxuIiwgY3Vycik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJtZW1vcnkgJXAgaXMgYWxyZWFkeSBib3VuZCFcbiIsIGN1cnIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKGN1cnItPmlzX2ZsdXNoZWQgPT0gRkFMU0UpIHsKQEAgLTM5MSw3ICszOTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjdXJyLT5pc19ib3VuZCAhPSBUUlVFKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAibWVtb3J5ICVwIHdhcyBub3QgYm91bmQhXG4iLCBjdXJyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm1lbW9yeSAlcCB3YXMgbm90IGJvdW5kIVxuIiwgY3Vycik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDE1LDcgKzQxNCw3IEBACiAJdTMyIHRtcDsKIAogCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1AyX1JFU0VSVkVEX01BU0spIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJyZXNlcnZlZCBiaXRzIHNldCBpbiBtb2RlIDB4JXguIEZpeGVkLlxuIiwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInJlc2VydmVkIGJpdHMgc2V0IGluIG1vZGUgMHgleC4gRml4ZWQuXG4iLCAqcmVxdWVzdGVkX21vZGUpOwogCQkqcmVxdWVzdGVkX21vZGUgJj0gfkFHUDJfUkVTRVJWRURfTUFTSzsKIAl9CiAKQEAgLTQyMyw3ICs0MjIsNyBAQAogCXRtcCA9ICpyZXF1ZXN0ZWRfbW9kZSAmIDc7CiAJc3dpdGNoICh0bXApIHsKIAkJY2FzZSAwOgotCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14MC4gU2V0dGluZyB0byB4MSBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgdHJpZWQgdG8gc2V0IHJhdGU9eDAuIFNldHRpbmcgdG8geDEgbW9kZS5cbiIsIGN1cnJlbnQtPmNvbW0pOwogCQkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQyXzFYOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKQEAgLTQ5MywxOCArNDkyLDE4IEBACiAJdTMyIHRtcDsKIAogCWlmICgqcmVxdWVzdGVkX21vZGUgJiBBR1AzX1JFU0VSVkVEX01BU0spIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJyZXNlcnZlZCBiaXRzIHNldCBpbiBtb2RlIDB4JXguIEZpeGVkLlxuIiwgKnJlcXVlc3RlZF9tb2RlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInJlc2VydmVkIGJpdHMgc2V0IGluIG1vZGUgMHgleC4gRml4ZWQuXG4iLCAqcmVxdWVzdGVkX21vZGUpOwogCQkqcmVxdWVzdGVkX21vZGUgJj0gfkFHUDNfUkVTRVJWRURfTUFTSzsKIAl9CiAKIAkvKiBDaGVjayB0aGUgc3BlZWQgYml0cyBtYWtlIHNlbnNlLiAqLwogCXRtcCA9ICpyZXF1ZXN0ZWRfbW9kZSAmIDc7CiAJaWYgKHRtcCA9PSAwKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiJXMgdHJpZWQgdG8gc2V0IHJhdGU9eDAuIFNldHRpbmcgdG8gQUdQMyB4NCBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14MC4gU2V0dGluZyB0byBBR1AzIHg0IG1vZGUuXG4iLCBjdXJyZW50LT5jb21tKTsKIAkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQzXzRYOwogCX0KIAlpZiAodG1wID49IDMpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14JWQuIFNldHRpbmcgdG8gQUdQMyB4OCBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSwgdG1wICogNCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyB0cmllZCB0byBzZXQgcmF0ZT14JWQuIFNldHRpbmcgdG8gQUdQMyB4OCBtb2RlLlxuIiwgY3VycmVudC0+Y29tbSwgdG1wICogNCk7CiAJCSpyZXF1ZXN0ZWRfbW9kZSA9ICgqcmVxdWVzdGVkX21vZGUgJiB+NykgfCBBR1BTVEFUM184WDsKIAl9CiAKQEAgLTUzMyw3ICs1MzIsNyBAQAogCQkgKiBBR1AyLnggNHggLT4gQUdQMy4wIDR4LgogCQkgKi8KIAkJaWYgKCpyZXF1ZXN0ZWRfbW9kZSAmIEFHUFNUQVQyXzRYKSB7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIiVzIHBhc3NlcyBicm9rZW4gQUdQMyBmbGFncyAoJXgpLiBGaXhlZC5cbiIsCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgcGFzc2VzIGJyb2tlbiBBR1AzIGZsYWdzICgleCkuIEZpeGVkLlxuIiwKIAkJCQkJCWN1cnJlbnQtPmNvbW0sICpyZXF1ZXN0ZWRfbW9kZSk7CiAJCQkqcmVxdWVzdGVkX21vZGUgJj0gfkFHUFNUQVQyXzRYOwogCQkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQzXzRYOwpAQCAtNTQ0LDcgKzU0Myw3IEBACiAJCSAqIGJ1dCBoYXZlIGJlZW4gcGFzc2VkIGFuIEFHUCAyLnggbW9kZS4KIAkJICogQ29udmVydCBBR1AgMXgsMngsNHggLT4gQUdQIDMuMCA0eC4KIAkJICovCi0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiJXMgcGFzc2VzIGJyb2tlbiBBR1AyIGZsYWdzICgleCkgaW4gQUdQMyBtb2RlLiBGaXhlZC5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyBwYXNzZXMgYnJva2VuIEFHUDIgZmxhZ3MgKCV4KSBpbiBBR1AzIG1vZGUuIEZpeGVkLlxuIiwKIAkJCQkJY3VycmVudC0+Y29tbSwgKnJlcXVlc3RlZF9tb2RlKTsKIAkJKnJlcXVlc3RlZF9tb2RlICY9IH4oQUdQU1RBVDJfNFggfCBBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzFYKTsKIAkJKnJlcXVlc3RlZF9tb2RlIHw9IEFHUFNUQVQzXzRYOwpAQCAtNTU0LDEzICs1NTMsMTMgQEAKIAkJaWYgKCEoKmJyaWRnZV9hZ3BzdGF0ICYgQUdQU1RBVDNfOFgpKSB7CiAJCQkqYnJpZGdlX2FncHN0YXQgJj0gfihBR1BTVEFUM184WCB8IEFHUFNUQVQzX1JTVkQpOwogCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOwotCQkJcHJpbnRrICgiJXMgcmVxdWVzdGVkIEFHUHg4IGJ1dCBicmlkZ2Ugbm90IGNhcGFibGUuXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyByZXF1ZXN0ZWQgQUdQeDggYnV0IGJyaWRnZSBub3QgY2FwYWJsZS5cbiIsIGN1cnJlbnQtPmNvbW0pOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmICghKCp2Z2FfYWdwc3RhdCAmIEFHUFNUQVQzXzhYKSkgewogCQkJKmJyaWRnZV9hZ3BzdGF0ICY9IH4oQUdQU1RBVDNfOFggfCBBR1BTVEFUM19SU1ZEKTsKIAkJCSpicmlkZ2VfYWdwc3RhdCB8PSBBR1BTVEFUM180WDsKLQkJCXByaW50ayAoIiVzIHJlcXVlc3RlZCBBR1B4OCBidXQgZ3JhcGhpYyBjYXJkIG5vdCBjYXBhYmxlLlxuIiwgY3VycmVudC0+Y29tbSk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgcmVxdWVzdGVkIEFHUHg4IGJ1dCBncmFwaGljIGNhcmQgbm90IGNhcGFibGUuXG4iLCBjdXJyZW50LT5jb21tKTsKIAkJCXJldHVybjsKIAkJfQogCQkvKiBBbGwgc2V0LCBicmlkZ2UgJiBkZXZpY2UgY2FuIGRvIEFHUCB4OCovCkBAIC01NzgsMTMgKzU3NywxMyBAQAogCQlpZiAoKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQzXzRYKSAmJiAoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVDNfNFgpKQogCQkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQzXzRYOwogCQllbHNlIHsKLQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQmFkbmVzcy4gRG9uJ3Qga25vdyB3aGljaCBBR1AgbW9kZSB0byBzZXQuICIKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJCYWRuZXNzLiBEb24ndCBrbm93IHdoaWNoIEFHUCBtb2RlIHRvIHNldC4gIgogCQkJCQkJCSJbYnJpZGdlX2FncHN0YXQ6JXggdmdhX2FncHN0YXQ6JXggZmVsbCBiYWNrIHRvOi0gYnJpZGdlX2FncHN0YXQ6JXggdmdhX2FncHN0YXQ6JXhdXG4iLAogCQkJCQkJCW9yaWdicmlkZ2UsIG9yaWd2Z2EsICpicmlkZ2VfYWdwc3RhdCwgKnZnYV9hZ3BzdGF0KTsKIAkJCWlmICghKCpicmlkZ2VfYWdwc3RhdCAmIEFHUFNUQVQzXzRYKSkKLQkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkJyaWRnZSBjb3VsZG4ndCBkbyBBR1AgeDQuXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQnJpZGdlIGNvdWxkbid0IGRvIEFHUCB4NC5cbiIpOwogCQkJaWYgKCEoKnZnYV9hZ3BzdGF0ICYgQUdQU1RBVDNfNFgpKQotCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiR3JhcGhpYyBjYXJkIGNvdWxkbid0IGRvIEFHUCB4NC5cbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJHcmFwaGljIGNhcmQgY291bGRuJ3QgZG8gQUdQIHg0LlxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC02MjIsNyArNjIxLDcgQEAKIAlmb3IgKDs7KSB7CiAJCWRldmljZSA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIGRldmljZSk7CiAJCWlmICghZGV2aWNlKSB7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNvdWxkbid0IGZpbmQgYW4gQUdQIFZHQSBjb250cm9sbGVyLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGRuJ3QgZmluZCBhbiBBR1AgVkdBIGNvbnRyb2xsZXIuXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhcF9wdHIgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldmljZSwgUENJX0NBUF9JRF9BR1ApOwpAQCAtNzM0LDcgKzczMyw3IEBACiAJCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZS0+ZGV2LAogCQkJCQlicmlkZ2UtPmNhcG5keCtBR1BDVFJMLCB0ZW1wKTsKIAotCQkgICAgcHJpbnRrIChLRVJOX0lORk8gUEZYICJEZXZpY2UgaXMgaW4gbGVnYWN5IG1vZGUsIgorCQkgICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldmljZSBpcyBpbiBsZWdhY3kgbW9kZSwiCiAJCQkJIiBmYWxsaW5nIGJhY2sgdG8gMi54XG4iKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKaW5kZXggMTFmOWVlNS4uOTI3YTViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiB2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAltaXNjX2RlcmVnaXN0ZXIoJmFjX21pc2NkZXYpOwogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlpbnQgaSwgbnVtaXNhID0gMDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKlJhbUlPOwotCWludCBib2FyZG5vOworCWludCBib2FyZG5vLCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSBkcml2ZXI6ICRJZDogYWMuYyx2IDEuMzAgMjAwMC8wMy8yMiAxNjowMzo1NyBkd213MiBFeHAgJFxuIik7CiAKQEAgLTI5NCw3ICsyOTQsOCBAQAogCX0KIAogCWlmICghbnVtaXNhKQotCQlwcmludGsoS0VSTl9XQVJOSU5HImFjLm86IE5vIHZhbGlkIElTQSBBcHBsaWNvbSBib2FyZHMgZm91bmQgYXQgbWVtIDB4JWx4XG4iLG1lbSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjLm86IE5vIHZhbGlkIElTQSBBcHBsaWNvbSBib2FyZHMgZm91bmQgIgorCQkJCSJhdCBtZW0gMHglbHhcbiIsIG1lbSk7CiAKICBmaW46CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmRmxhZ1NsZWVwUmVjKTsKQEAgLTMwNCw3ICszMDUsMTEgQEAKIAlEZXZpY2VFcnJvckNvdW50ID0gMDsKIAogCWlmIChudW1ib2FyZHMpIHsKLQkJbWlzY19yZWdpc3RlcigmYWNfbWlzY2Rldik7CisJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmFjX21pc2NkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhYy5vOiBVbmFibGUgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCQkJZ290byBvdXQ7CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRDsgaSsrKSB7CiAJCQlpbnQgc2VyaWFsOwogCQkJY2hhciBib2FyZG5hbWVbKFNFUklBTF9OVU1CRVIgLSBUWVBFX0NBUkQpICsgMV07CkBAIC0zMzcsNiArMzQyLDE3IEBACiAKIAllbHNlCiAJCXJldHVybiAtRU5YSU87CisKK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEOyBpKyspIHsKKwkJaWYgKCFhcGJzW2ldLlJhbUlPKQorCQkJY29udGludWU7CisJCWlmIChhcGJzW2ldLmlycSkKKwkJCWZyZWVfaXJxKGFwYnNbaV0uaXJxLCAmZHVtbXkpOworCQlpb3VubWFwKGFwYnNbaV0uUmFtSU8pOworCX0KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKaW5kZXggNmE1MzM3Yi4uY2Y0YzM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTg2NSw3ICs4NjUsNyBAQAogc3RhdGljIGxvbmcgY3l6X3BvbGxpbmdfY3ljbGUgPSBDWl9ERUZfUE9MTDsKIAogc3RhdGljIGludCBjeXpfdGltZXJvbiA9IDA7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY3l6X3RpbWVybGlzdCA9IFRJTUVSX0lOSVRJQUxJWkVSKGN5el9wb2xsLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoY3l6X3RpbWVybGlzdCwgY3l6X3BvbGwsIDAsIDApOwogCiAjZWxzZSAvKiBDT05GSUdfQ1laX0lOVFIgKi8KIHN0YXRpYyB2b2lkIGN5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RpZ2kxLmggYi9kcml2ZXJzL2NoYXIvZGlnaTEuaAppbmRleCAxODQzNzhkLi45NGQ0ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlnaTEuaAorKysgYi9kcml2ZXJzL2NoYXIvZGlnaTEuaApAQCAtMSw0NiArMSw0NiBAQAogLyogICAgICAgICAgRGVmaW5pdGlvbnMgZm9yIERpZ2lCb2FyZCBkaXR0eSgxKSBjb21tYW5kLiAgICAgICAgICAgICAgICAgKi8KIAogI2lmICFkZWZpbmVkKFRJT0NNT0RHKQotI2RlZmluZQlUSU9DTU9ERwkoJ2QnPDw4KSB8IDI1MAkJLyogZ2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNkZWZpbmUJVElPQ01PRFMJKCdkJzw8OCkgfCAyNTEJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNT0RHCSgoJ2QnPDw4KSB8IDI1MCkJLyogZ2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KKyNkZWZpbmUJVElPQ01PRFMJKCgnZCc8PDgpIHwgMjUxKQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChUSU9DTVNFVCkKLSNkZWZpbmUJVElPQ01TRVQJKCdkJzw8OCkgfCAyNTIJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0jZGVmaW5lCVRJT0NNR0VUCSgnZCc8PDgpIHwgMjUzCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTVNFVAkoKCdkJzw8OCkgfCAyNTIpCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCisjZGVmaW5lCVRJT0NNR0VUCSgoJ2QnPDw4KSB8IDI1MykJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoVElPQ01CSUMpCi0jZGVmaW5lCVRJT0NNQklDCSgnZCc8PDgpIHwgMjU0CQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLwotI2RlZmluZQlUSU9DTUJJUwkoJ2QnPDw4KSB8IDI1NQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNkZWZpbmUJVElPQ01CSUMJKCgnZCc8PDgpIHwgMjU0KQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLworI2RlZmluZQlUSU9DTUJJUwkoKCdkJzw8OCkgfCAyNTUpCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlICovCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKFRJT0NTRFRSKQotI2RlZmluZQlUSU9DU0RUUgkoJ2UnPDw4KSB8IDAJCS8qIHNldCBEVFIJCSovCi0jZGVmaW5lCVRJT0NDRFRSCSgnZSc8PDgpIHwgMQkJLyogY2xlYXIgRFRSCQkqLworI2RlZmluZQlUSU9DU0RUUgkoKCdlJzw8OCkgfCAwKQkJLyogc2V0IERUUgkJKi8KKyNkZWZpbmUJVElPQ0NEVFIJKCgnZSc8PDgpIHwgMSkJCS8qIGNsZWFyIERUUgkJKi8KICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJb2N0bCBjb21tYW5kIGFyZ3VtZW50cyBmb3IgRElHSSBwYXJhbWV0ZXJzLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRElHSV9HRVRBCSgnZSc8PDgpIHwgOTQJCS8qIFJlYWQgcGFyYW1zCQkqLworI2RlZmluZSBESUdJX0dFVEEJKCgnZSc8PDgpIHwgOTQpCQkvKiBSZWFkIHBhcmFtcwkJKi8KIAotI2RlZmluZSBESUdJX1NFVEEJKCdlJzw8OCkgfCA5NQkJLyogU2V0IHBhcmFtcwkJKi8KLSNkZWZpbmUgRElHSV9TRVRBVwkoJ2UnPDw4KSB8IDk2CQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KLSNkZWZpbmUgRElHSV9TRVRBRgkoJ2UnPDw4KSB8IDk3CQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCisjZGVmaW5lIERJR0lfU0VUQQkoKCdlJzw8OCkgfCA5NSkJCS8qIFNldCBwYXJhbXMJCSovCisjZGVmaW5lIERJR0lfU0VUQVcJKCgnZSc8PDgpIHwgOTYpCQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KKyNkZWZpbmUgRElHSV9TRVRBRgkoKCdlJzw8OCkgfCA5NykJCS8qIERyYWluLCBmbHVzaCAmIHNldCBwYXJhbXMgKi8KIAotI2RlZmluZQlESUdJX0dFVEZMT1cJKCdlJzw8OCkgfCA5OQkJLyogR2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCisjZGVmaW5lCURJR0lfR0VURkxPVwkoKCdlJzw8OCkgfCA5OSkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLwogCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzIAkgKi8KLSNkZWZpbmUJRElHSV9TRVRGTE9XCSgnZSc8PDgpIHwgMTAwCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKyNkZWZpbmUJRElHSV9TRVRGTE9XCSgoJ2UnPDw4KSB8IDEwMCkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCiAJCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCi0jZGVmaW5lCURJR0lfR0VUQUZMT1cJKCdlJzw8OCkgfCAxMDEJCS8qIEdldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLworI2RlZmluZQlESUdJX0dFVEFGTE9XCSgoJ2UnPDw4KSB8IDEwMSkJLyogR2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCiAJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMgCSAqLwotI2RlZmluZQlESUdJX1NFVEFGTE9XCSgnZSc8PDgpIHwgMTAyCQkvKiBTZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKyNkZWZpbmUJRElHSV9TRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDIpCS8qIFNldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLwogCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzCSAqLwogCi0jZGVmaW5lCURJR0lfR0VUSU5GTwkoJ2UnPDw4KSB8IDEwMwkJLyogRmlsbCBpbiBkaWdpX2luZm8gKi8KLSNkZWZpbmUJRElHSV9QT0xMRVIJKCdlJzw8OCkgfCAxMDQJCS8qIFR1cm4gb24vb2ZmIHBvbGxlciAqLwotI2RlZmluZQlESUdJX0lOSVQJKCdlJzw8OCkgfCAxMDUJCS8qIEFsbG93IHRoaW5ncyB0byBydW4uICovCisjZGVmaW5lCURJR0lfR0VUSU5GTwkoKCdlJzw8OCkgfCAxMDMpCS8qIEZpbGwgaW4gZGlnaV9pbmZvICovCisjZGVmaW5lCURJR0lfUE9MTEVSCSgoJ2UnPDw4KSB8IDEwNCkJLyogVHVybiBvbi9vZmYgcG9sbGVyICovCisjZGVmaW5lCURJR0lfSU5JVAkoKCdlJzw8OCkgfCAxMDUpCS8qIEFsbG93IHRoaW5ncyB0byBydW4uICovCiAKIHN0cnVjdAlkaWdpZmxvd19zdHJ1Y3QgCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlnaUZlcDEuaCBiL2RyaXZlcnMvY2hhci9kaWdpRmVwMS5oCmluZGV4IGM0N2Q3ZmMuLjNjMWYxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kaWdpRmVwMS5oCisrKyBiL2RyaXZlcnMvY2hhci9kaWdpRmVwMS5oCkBAIC0xMyw4OCArMTMsODggQEAKIAogc3RydWN0IGdsb2JhbF9kYXRhIAogewotCXZvbGF0aWxlIHVzaG9ydCBjaW47Ci0Jdm9sYXRpbGUgdXNob3J0IGNvdXQ7Ci0Jdm9sYXRpbGUgdXNob3J0IGNzdGFydDsKLQl2b2xhdGlsZSB1c2hvcnQgY21heDsKLQl2b2xhdGlsZSB1c2hvcnQgZWluOwotCXZvbGF0aWxlIHVzaG9ydCBlb3V0OwotCXZvbGF0aWxlIHVzaG9ydCBpc3RhcnQ7Ci0Jdm9sYXRpbGUgdXNob3J0IGltYXg7CisJdTE2IGNpbjsKKwl1MTYgY291dDsKKwl1MTYgY3N0YXJ0OworCXUxNiBjbWF4OworCXUxNiBlaW47CisJdTE2IGVvdXQ7CisJdTE2IGlzdGFydDsKKwl1MTYgaW1heDsKIH07CiAKIAogc3RydWN0IGJvYXJkX2NoYW4gCiB7Ci0JaW50IGZpbGxlcjE7IAotCWludCBmaWxsZXIyOwotCXZvbGF0aWxlIHVzaG9ydCB0c2VnOwotCXZvbGF0aWxlIHVzaG9ydCB0aW47Ci0Jdm9sYXRpbGUgdXNob3J0IHRvdXQ7Ci0Jdm9sYXRpbGUgdXNob3J0IHRtYXg7Ci0JCi0Jdm9sYXRpbGUgdXNob3J0IHJzZWc7Ci0Jdm9sYXRpbGUgdXNob3J0IHJpbjsKLQl2b2xhdGlsZSB1c2hvcnQgcm91dDsKLQl2b2xhdGlsZSB1c2hvcnQgcm1heDsKLQkKLQl2b2xhdGlsZSB1c2hvcnQgdGxvdzsKLQl2b2xhdGlsZSB1c2hvcnQgcmxvdzsKLQl2b2xhdGlsZSB1c2hvcnQgcmhpZ2g7Ci0Jdm9sYXRpbGUgdXNob3J0IGluY3I7Ci0JCi0Jdm9sYXRpbGUgdXNob3J0IGV0aW1lOwotCXZvbGF0aWxlIHVzaG9ydCBlZGVsYXk7Ci0Jdm9sYXRpbGUgdW5jaGFyICpkZXY7Ci0JCi0Jdm9sYXRpbGUgdXNob3J0IGlmbGFnOwotCXZvbGF0aWxlIHVzaG9ydCBvZmxhZzsKLQl2b2xhdGlsZSB1c2hvcnQgY2ZsYWc7Ci0Jdm9sYXRpbGUgdXNob3J0IGdtYXNrOwotCQotCXZvbGF0aWxlIHVzaG9ydCBjb2w7Ci0Jdm9sYXRpbGUgdXNob3J0IGRlbGF5OwotCXZvbGF0aWxlIHVzaG9ydCBpbWFzazsKLQl2b2xhdGlsZSB1c2hvcnQgdGZsdXNoOworCXUzMiBmaWxsZXIxOworCXUzMiBmaWxsZXIyOworCXUxNiB0c2VnOworCXUxNiB0aW47CisJdTE2IHRvdXQ7CisJdTE2IHRtYXg7CiAKLQlpbnQgZmlsbGVyMzsKLQlpbnQgZmlsbGVyNDsKLQlpbnQgZmlsbGVyNTsKLQlpbnQgZmlsbGVyNjsKLQkKLQl2b2xhdGlsZSB1bmNoYXIgbnVtOwotCXZvbGF0aWxlIHVuY2hhciByYWN0OwotCXZvbGF0aWxlIHVuY2hhciBic3RhdDsKLQl2b2xhdGlsZSB1bmNoYXIgdGJ1c3k7Ci0Jdm9sYXRpbGUgdW5jaGFyIGllbXB0eTsKLQl2b2xhdGlsZSB1bmNoYXIgaWxvdzsKLQl2b2xhdGlsZSB1bmNoYXIgaWRhdGE7Ci0Jdm9sYXRpbGUgdW5jaGFyIGVmbGFnOwotCQotCXZvbGF0aWxlIHVuY2hhciB0ZmxhZzsKLQl2b2xhdGlsZSB1bmNoYXIgcmZsYWc7Ci0Jdm9sYXRpbGUgdW5jaGFyIHhtYXNrOwotCXZvbGF0aWxlIHVuY2hhciB4dmFsOwotCXZvbGF0aWxlIHVuY2hhciBtc3RhdDsKLQl2b2xhdGlsZSB1bmNoYXIgbWNoYW5nZTsKLQl2b2xhdGlsZSB1bmNoYXIgbWludDsKLQl2b2xhdGlsZSB1bmNoYXIgbHN0YXQ7CisJdTE2IHJzZWc7CisJdTE2IHJpbjsKKwl1MTYgcm91dDsKKwl1MTYgcm1heDsKIAotCXZvbGF0aWxlIHVuY2hhciBtdHJhbjsKLQl2b2xhdGlsZSB1bmNoYXIgb3J1bjsKLQl2b2xhdGlsZSB1bmNoYXIgc3RhcnRjYTsKLQl2b2xhdGlsZSB1bmNoYXIgc3RvcGNhOwotCXZvbGF0aWxlIHVuY2hhciBzdGFydGM7Ci0Jdm9sYXRpbGUgdW5jaGFyIHN0b3BjOwotCXZvbGF0aWxlIHVuY2hhciB2bmV4dDsKLQl2b2xhdGlsZSB1bmNoYXIgaGZsb3c7CisJdTE2IHRsb3c7CisJdTE2IHJsb3c7CisJdTE2IHJoaWdoOworCXUxNiBpbmNyOwogCi0Jdm9sYXRpbGUgdW5jaGFyIGZpbGxjOwotCXZvbGF0aWxlIHVuY2hhciBvY2hhcjsKLQl2b2xhdGlsZSB1bmNoYXIgb21hc2s7CisJdTE2IGV0aW1lOworCXUxNiBlZGVsYXk7CisJdW5jaGFyICpkZXY7CiAKLQl1bmNoYXIgZmlsbGVyNzsKLQl1bmNoYXIgZmlsbGVyOFsyOF07CisJdTE2IGlmbGFnOworCXUxNiBvZmxhZzsKKwl1MTYgY2ZsYWc7CisJdTE2IGdtYXNrOworCisJdTE2IGNvbDsKKwl1MTYgZGVsYXk7CisJdTE2IGltYXNrOworCXUxNiB0Zmx1c2g7CisKKwl1MzIgZmlsbGVyMzsKKwl1MzIgZmlsbGVyNDsKKwl1MzIgZmlsbGVyNTsKKwl1MzIgZmlsbGVyNjsKKworCXU4IG51bTsKKwl1OCByYWN0OworCXU4IGJzdGF0OworCXU4IHRidXN5OworCXU4IGllbXB0eTsKKwl1OCBpbG93OworCXU4IGlkYXRhOworCXU4IGVmbGFnOworCisJdTggdGZsYWc7CisJdTggcmZsYWc7CisJdTggeG1hc2s7CisJdTggeHZhbDsKKwl1OCBtc3RhdDsKKwl1OCBtY2hhbmdlOworCXU4IG1pbnQ7CisJdTggbHN0YXQ7CisKKwl1OCBtdHJhbjsKKwl1OCBvcnVuOworCXU4IHN0YXJ0Y2E7CisJdTggc3RvcGNhOworCXU4IHN0YXJ0YzsKKwl1OCBzdG9wYzsKKwl1OCB2bmV4dDsKKwl1OCBoZmxvdzsKKworCXU4IGZpbGxjOworCXU4IG9jaGFyOworCXU4IG9tYXNrOworCisJdTggZmlsbGVyNzsKKwl1OCBmaWxsZXI4WzI4XTsKIH07IAogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKaW5kZXggNmY5ODcwMS4uMTIxY2M4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKQEAgLTEwNzEsNSArMTA3MSw5IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhkcm1fbWFwX3QgKm1hcCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfcmVnX29mcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAorI2lmbmRlZiBwY2lfcHJldHR5X25hbWUKKyNkZWZpbmUgcGNpX3ByZXR0eV9uYW1lKGRldikgIiIKKyNlbmRpZgorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggZTA3NDNlYi4uZjI4ZTcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtNDgsOCArNDgsOCBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX2xlbik7CiAKLXN0YXRpYyBkcm1fbG9jYWxfbWFwX3QgKmRybV9maW5kX21hdGNoaW5nX21hcChkcm1fZGV2aWNlX3QgKmRldiwKLQkJCQkJICAgICAgZHJtX2xvY2FsX21hcF90ICptYXApCitzdGF0aWMgZHJtX21hcF9saXN0X3QgKmRybV9maW5kX21hdGNoaW5nX21hcChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgICBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCkBAIC01Nyw3ICs1Nyw3IEBACiAJCWRybV9tYXBfbGlzdF90ICplbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwogCQlpZiAoZW50cnktPm1hcCAmJiBtYXAtPnR5cGUgPT0gZW50cnktPm1hcC0+dHlwZSAmJgogCQkgICAgZW50cnktPm1hcC0+b2Zmc2V0ID09IG1hcC0+b2Zmc2V0KSB7Ci0JCQlyZXR1cm4gZW50cnktPm1hcDsKKwkJCXJldHVybiBlbnRyeTsKIAkJfQogCX0KIApAQCAtMTE0LDE0ICsxMTQsMTMgQEAKICAqIHR5cGUuICBBZGRzIHRoZSBtYXAgdG8gdGhlIG1hcCBsaXN0IGRybV9kZXZpY2U6Om1hcGxpc3QuIEFkZHMgTVRSUidzIHdoZXJlCiAgKiBhcHBsaWNhYmxlIGFuZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KICAqLwotaW50IGRybV9hZGRtYXAoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZHJtX21hcF90eXBlX3QgdHlwZSwKLQkgICAgICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiogbWFwX3B0cikKK2ludCBkcm1fYWRkbWFwX2NvcmUoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCisJCSAgICBkcm1fbWFwX2ZsYWdzX3QgZmxhZ3MsIGRybV9tYXBfbGlzdF90ICoqbWFwbGlzdCkKIHsKIAlkcm1fbWFwX3QgKm1hcDsKIAlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKIAlkcm1fZG1hX2hhbmRsZV90ICpkbWFoOwotCWRybV9sb2NhbF9tYXBfdCAqZm91bmRfbWFwOwogCiAJbWFwID0gZHJtX2FsbG9jKCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyApOwogCWlmICggIW1hcCApCkBAIC0xNjYsMTcgKzE2NSwxNyBAQAogCQkgKiBuZWVkaW5nIHRvIGJlIGF3YXJlIG9mIGl0LiAgVGhlcmVmb3JlLCB3ZSBqdXN0IHJldHVybiBzdWNjZXNzCiAJCSAqIHdoZW4gdGhlIHNlcnZlciB0cmllcyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgbWFwLgogCQkgKi8KLQkJZm91bmRfbWFwID0gZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRldiwgbWFwKTsKLQkJaWYgKGZvdW5kX21hcCAhPSBOVUxMKSB7Ci0JCQlpZiAoZm91bmRfbWFwLT5zaXplICE9IG1hcC0+c2l6ZSkgeworCQlsaXN0ID0gZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRldiwgbWFwKTsKKwkJaWYgKGxpc3QgIT0gTlVMTCkgeworCQkJaWYgKGxpc3QtPm1hcC0+c2l6ZSAhPSBtYXAtPnNpemUpIHsKIAkJCQlEUk1fREVCVUcoIk1hdGNoaW5nIG1hcHMgb2YgdHlwZSAlZCB3aXRoICIKIAkJCQkgICAibWlzbWF0Y2hlZCBzaXplcywgKCVsZCB2cyAlbGQpXG4iLAotCQkJCSAgICBtYXAtPnR5cGUsIG1hcC0+c2l6ZSwgZm91bmRfbWFwLT5zaXplKTsKLQkJCQlmb3VuZF9tYXAtPnNpemUgPSBtYXAtPnNpemU7CisJCQkJICAgIG1hcC0+dHlwZSwgbWFwLT5zaXplLCBsaXN0LT5tYXAtPnNpemUpOworCQkJCWxpc3QtPm1hcC0+c2l6ZSA9IG1hcC0+c2l6ZTsKIAkJCX0KIAogCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7Ci0JCQkqbWFwX3B0ciA9IGZvdW5kX21hcDsKKwkJCSptYXBsaXN0ID0gbGlzdDsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTI2NCw5ICsyNjMsMjIgQEAKIAkJCQkgICAgOiBtYXAtPm9mZnNldCwgZGV2KTsKICAJdXAoJmRldi0+c3RydWN0X3NlbSk7CiAKLQkqbWFwX3B0ciA9IG1hcDsKKwkqbWFwbGlzdCA9IGxpc3Q7CiAJcmV0dXJuIDA7CiB9CisKK2ludCBkcm1fYWRkbWFwKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZHJtX21hcF90eXBlX3QgdHlwZSwKKwkgICAgICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiptYXBfcHRyKQoreworCWRybV9tYXBfbGlzdF90ICpsaXN0OworCWludCByYzsKKworCXJjID0gZHJtX2FkZG1hcF9jb3JlKGRldiwgb2Zmc2V0LCBzaXplLCB0eXBlLCBmbGFncywgJmxpc3QpOworCWlmICghcmMpCisJCSptYXBfcHRyID0gbGlzdC0+bWFwOworCXJldHVybiByYzsKK30KIEVYUE9SVF9TWU1CT0woZHJtX2FkZG1hcCk7CiAKIGludCBkcm1fYWRkbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtMjc1LDEwICsyODcsOSBAQAogCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX21hcF90IG1hcDsKLQlkcm1fbWFwX3QgKm1hcF9wdHI7CisJZHJtX21hcF9saXN0X3QgKm1hcGxpc3Q7CiAJZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyOwotCXVuc2lnbmVkIGxvbmcgaGFuZGxlID0gMDsKIAogCWlmICghKGZpbHAtPmZfbW9kZSAmIDMpKQogCQlyZXR1cm4gLUVBQ0NFUzsJLyogUmVxdWlyZSByZWFkL3dyaXRlICovCkBAIC0yODcsMjYgKzI5OCwxNSBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQllcnIgPSBkcm1fYWRkbWFwKGRldiwgbWFwLm9mZnNldCwgbWFwLnNpemUsIG1hcC50eXBlLCBtYXAuZmxhZ3MsCi0JCQkgJm1hcF9wdHIpOworCWVyciA9IGRybV9hZGRtYXBfY29yZShkZXYsIG1hcC5vZmZzZXQsIG1hcC5zaXplLCBtYXAudHlwZSwgbWFwLmZsYWdzLAorCQkJICAgICAgJm1hcGxpc3QpOwogCi0JaWYgKGVycikgeworCWlmIChlcnIpIAogCQlyZXR1cm4gZXJyOwotCX0KIAotCXsKLQkJZHJtX21hcF9saXN0X3QgKl9lbnRyeTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQpIHsKLQkJCWlmIChfZW50cnktPm1hcCA9PSBtYXBfcHRyKQotCQkJCWhhbmRsZSA9IF9lbnRyeS0+dXNlcl90b2tlbjsKLQkJfQotCQlpZiAoIWhhbmRsZSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbWFwX3B0ciwgc2l6ZW9mKCptYXBfcHRyKSkpCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBtYXBsaXN0LT5tYXAsIHNpemVvZihkcm1fbWFwX3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHB1dF91c2VyKGhhbmRsZSwgJmFyZ3AtPmhhbmRsZSkpCisJaWYgKHB1dF91c2VyKG1hcGxpc3QtPnVzZXJfdG9rZW4sICZhcmdwLT5oYW5kbGUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNDEsNyArMTA0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkcm1fYWRkYnVmc19mYihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2J1Zl9kZXNjX3QgKnJlcXVlc3QpCitzdGF0aWMgaW50IGRybV9hZGRidWZzX2ZiKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX2Rlc2NfdCAqcmVxdWVzdCkKIHsKIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCmluZGV4IGY1MTU1NjcuLjUwMjg5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKQEAgLTMwOCw3ICszMDgsNyBAQAogICoKICAqIEF0dGVtcHQgdG8gc2V0IGRybV9kZXZpY2U6OmNvbnRleHRfZmxhZy4KICAqLwotaW50IGRybV9jb250ZXh0X3N3aXRjaCggZHJtX2RldmljZV90ICpkZXYsIGludCBvbGQsIGludCBuZXcgKQorc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2goIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3ICkKIHsKICAgICAgICAgaWYgKCB0ZXN0X2FuZF9zZXRfYml0KCAwLCAmZGV2LT5jb250ZXh0X2ZsYWcgKSApIHsKICAgICAgICAgICAgICAgICBEUk1fRVJST1IoICJSZWVudGVyaW5nIC0tIEZJWE1FXG4iICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYwppbmRleCAyZmMxMGM0Li40NzVjYzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgImRybV9jb3JlLmgiCisjaW5jbHVkZSAiZHJtUC5oIgogCiBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYwppbmRleCA1NjdiNDI1Li5mYzdkNGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYwpAQCAtNDE3LDYgKzQxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiBfX09TX0hBU19BR1AKIC8qKgogICogQm9vdHN0cmFwIHRoZSBkcml2ZXIgZm9yIEFHUCBETUEuCiAgKiAKQEAgLTU2MCw2ICs1NjEsMTMgQEAKIAlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgY2FyZCBmb3IgQUdQIERNQS5cbiIpOwogCXJldHVybiAwOwogfQorI2Vsc2UKK3N0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYKIAogLyoqCiAgKiBCb290c3RyYXAgdGhlIGRyaXZlciBmb3IgUENJIERNQS4KQEAgLTY5Nyw3ICs3MDUsNiBAQAogCSAqIGNhcnZlIG9mZiBwb3J0aW9ucyBvZiBpdCBmb3IgaW50ZXJuYWwgdXNlcy4gIFRoZSByZW1haW5pbmcgbWVtb3J5CiAJICogaXMgcmV0dXJuZWQgdG8gdXNlci1tb2RlIHRvIGJlIHVzZWQgZm9yIEFHUCB0ZXh0dXJlcy4KIAkgKi8KLQogCWlmIChpc19hZ3ApIHsKIAkJZXJyID0gbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKGRldiwgZG1hX2JzKTsKIAl9CkBAIC05MzIsNiArOTM5LDcgQEAKIAkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldik7CiAKIAkJaWYgKGRldl9wcml2LT51c2VkX25ld19kbWFfaW5pdCkgeworI2lmIF9fT1NfSEFTX0FHUAogCQkJaWYgKGRldl9wcml2LT5hZ3BfbWVtICE9IE5VTEwpIHsKIAkJCQlkZXZfcHJpdi0+YWdwX3RleHR1cmVzID0gTlVMTDsKIAkJCQlkcm1fdW5iaW5kX2FncChkZXZfcHJpdi0+YWdwX21lbSk7CkBAIC05NDQsNyArOTUyLDcgQEAKIAkJCWlmICgoZGV2LT5hZ3AgIT0gTlVMTCkgJiYgZGV2LT5hZ3AtPmFjcXVpcmVkKSB7CiAJCQkJZXJyID0gZHJtX2FncF9yZWxlYXNlKGRldik7CiAJCQl9Ci0KKyNlbmRpZgogCQkJZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0ID0gMDsKIAkJfQogCkBAIC05NjUsNyArOTczLDcgQEAKIAkJfQogCX0KIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBtZ2FfZG1hX2luaXQoIERSTV9JT0NUTF9BUkdTICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhLmMgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCmluZGV4IDYwMjVlMTguLjU4ZDM3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lcGNhLmMKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtNiw2ICs2LDggQEAKIAlGb3IgdGVjaG5pY2FsIHN1cHBvcnQgcGxlYXNlIGVtYWlsIGRpZ2lMaW51eEBkZ2lpLmNvbSBvcgogCWNhbGwgRGlnaSB0ZWNoIHN1cHBvcnQgYXQgKDYxMikgOTEyLTM0NTYKIAorCSoqIFRoaXMgZHJpdmVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgRGlnaSAqKgorCiAJTXVjaCBvZiB0aGlzIGRlc2lnbiBhbmQgY29kZSBjYW1lIGZyb20gZXBjYS5jIHdoaWNoIHdhcyAKIAljb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgVHJveSBEZSBKb25naCwgYW5kIHN1YnNxdWVudGx5IAogCW1vZGlmaWVkIGJ5IERhdmlkIE51Z2VudCwgQ2hyaXN0b3BoIExhbWV0ZXIsIE1pa2UgTWNMYWdhbi4gCkBAIC00MywzMSArNDUsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBFTkFCTEVfUENJCi0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotCi0jZGVmaW5lIHB1dFVzZXIoYXJnMSwgYXJnMikgcHV0X3VzZXIoYXJnMSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnMikKLSNkZWZpbmUgZ2V0VXNlcihhcmcxLCBhcmcyKSBnZXRfdXNlcihhcmcxLCAodW5zaWduZWQgX191c2VyICopYXJnMikKLQotI2lmZGVmIEVOQUJMRV9QQ0kKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgImRpZ2lQQ0kuaCIKLSNlbmRpZiAvKiBFTkFCTEVfUENJICovCisKIAogI2luY2x1ZGUgImRpZ2kxLmgiCiAjaW5jbHVkZSAiZGlnaUZlcDEuaCIKICNpbmNsdWRlICJlcGNhLmgiCiAjaW5jbHVkZSAiZXBjYWNvbmZpZy5oIgogCi0jaWYgQklUU19QRVJfTE9ORyAhPSAzMgotIyAgZXJyb3IgRklYTUU6IHRoaXMgZHJpdmVyIG9ubHkgd29ya3Mgb24gMzItYml0IHBsYXRmb3JtcwotI2VuZGlmCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBWRVJTSU9OICAgICAgICAgICAgIjEuMy4wLjEtTEsiCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAgICAiMS4zLjAuMS1MSzIuNiIKIAogLyogVGhpcyBtYWpvciBuZWVkcyB0byBiZSBzdWJtaXR0ZWQgdG8gTGludXggdG8gam9pbiB0aGUgbWFqb3JzIGxpc3QgKi8KIApAQCAtODEsMTMgKzcxLDE3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGdsb2JhbCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBjaGFyIG1lc2dbMTAwXTsKIHN0YXRpYyBpbnQgbmJkZXZzLCBudW1fY2FyZHMsIGxpbG9jb25maWc7CiBzdGF0aWMgaW50IGRpZ2lfcG9sbGVyX2luaGliaXRlZCA9IDEgOwogCiBzdGF0aWMgaW50IHNldHVwX2Vycm9yX2NvZGU7CiBzdGF0aWMgaW50IGludmFsaWRfbGlsb19jb25maWc7CiAKKy8qIFRoZSBJU0EgYm9hcmRzIGRvIHdpbmRvdyBmbGlwcGluZyBpbnRvIHRoZSBzYW1lIHNwYWNlcyBzbyBpdHMgb25seSBzYW5lCisgICB3aXRoIGEgc2luZ2xlIGxvY2suIEl0J3Mgc3RpbGwgcHJldHR5IGVmZmljaWVudCAqLworCitzdGF0aWMgc3BpbmxvY2tfdCBlcGNhX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJTUFYQk9BUkRTIGlzIHR5cGljYWxseSAxMiwgYnV0IElTQSBhbmQgRUlTQSBjYXJkcyBhcmUgcmVzdHJpY3RlZCB0byAKIAk3IGJlbG93LgpAQCAtMTI5LDU4ICsxMjMsNTggQEAKIAljb25maWd1cmVkLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAkKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBnbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBtZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBtZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHR4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBhc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKIAogLyogLS0tLSBCZWdpbiBtb3JlICdzcGVjaWZpYycgbWVtb3J5IGZ1bmN0aW9ucyBmb3IgY3hfbGlrZSBwcm9kdWN0cyAtLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZW1fcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGVtX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVtX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyB2b2lkIHBjeGVtX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4ZW1fcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4ZW1fdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4ZW1fbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CiAKIC8qIC0tLS0tLSBCZWdpbiBtb3JlICdzcGVjaWZpYycgbWVtb3J5IGZ1bmN0aW9ucyBmb3IgdGhlIHBjeGUgLS0tLS0tLSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4ZV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBwY3hlX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBwY3hlX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGVfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4ZV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKIAogLyogLS0tLSBCZWdpbiBtb3JlICdzcGVjaWZpYycgbWVtb3J5IGZ1bmN0aW9ucyBmb3IgdGhlIHBjNjR4ZSBhbmQgcGN4aSAtLS0tICovCiAvKiBOb3RlIDogcGM2NHhlIGFuZCBwY3hpIHNoYXJlIHRoZSBzYW1lIHdpbmRvd2luZyByb3V0aW5lcyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4aV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBwY3hpX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7CitzdGF0aWMgdm9pZCBwY3hpX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBwY3hpX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIHBjeGlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgcGN4aV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKIAogLyogLSBCZWdpbiAnc3BlY2lmaWMnIGRvIG5vdGhpbmcgbWVtb3J5IGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHNvbWUgY2FyZHMgLSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOwotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfZ2xvYmFsd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X2Fzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgZHVtbXlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pOworc3RhdGljIHZvaWQgZHVtbXlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKTsKK3N0YXRpYyB2b2lkIGR1bW15X2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBkdW1teV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBkdW1teV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCk7CitzdGF0aWMgdm9pZCBkdW1teV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKTsKK3N0YXRpYyB2b2lkIGR1bW15X2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpOworc3RhdGljIHZvaWQgZHVtbXlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZGVjbGFyZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgY2hhbm5lbCAqdmVyaWZ5Q2hhbm5lbChyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY19zY2hlZF9ldmVudChzdHJ1Y3QgY2hhbm5lbCAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBjaGFubmVsICp2ZXJpZnlDaGFubmVsKHN0cnVjdCB0dHlfc3RydWN0ICopOworc3RhdGljIHZvaWQgcGNfc2NoZWRfZXZlbnQoc3RydWN0IGNoYW5uZWwgKiwgaW50KTsKIHN0YXRpYyB2b2lkIGVwY2FfZXJyb3IoaW50LCBjaGFyICopOwogc3RhdGljIHZvaWQgcGNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3QgY2hhbm5lbCAqKTsKQEAgLTIxNSwxNSArMjA5LDExIEBACiBzdGF0aWMgdm9pZCBkaWdpX3NlbmRfYnJlYWsoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgbXNlYyk7CiBzdGF0aWMgdm9pZCBzZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpOwogdm9pZCBlcGNhX3NldHVwKGNoYXIgKiwgaW50ICopOwotdm9pZCBjb25zb2xlX3ByaW50KGNvbnN0IGNoYXIgKik7CiAKIHN0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvIF9fdXNlciAqKTsKIHN0YXRpYyBpbnQgcGNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotaW50IHBjX2luaXQodm9pZCk7Ci0KLSNpZmRlZiBFTkFCTEVfUENJCitzdGF0aWMgaW50IHBjX2luaXQodm9pZCk7CiBzdGF0aWMgaW50IGluaXRfUENJKHZvaWQpOwotI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIzNyw0MSArMjI3LDQxIEBACiAJbWFraW5nIGRpcmVjdCBjYWxscyBkZXNlcnZlcyB3aGF0IHRoZXkgZ2V0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIG1lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCiB7CiAJKGItPm1lbXdpbm9uKShiLCB3aW4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewogCShiLT5tZW13aW5vZmYpKGIsIHdpbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBnbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBnbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJKGNoLT5ib2FyZC0+Z2xvYmFsd2lub24pKGNoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJ4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJKGNoLT5ib2FyZC0+cnh3aW5vbikoY2gpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCB0eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAkoY2gtPmJvYXJkLT50eHdpbm9uKShjaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAkoY2gtPmJvYXJkLT5tZW1vZmYpKGNoKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRnd2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAkoY2gtPmJvYXJkLT5hc3NlcnRnd2lub24pKGNoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFzc2VydG1lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBhc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQogewogCShjaC0+Ym9hcmQtPmFzc2VydG1lbW9mZikoY2gpOwogfQpAQCAtMjgxLDY2ICsyNzEsNjYgQEAKIAlhbmQgQ1ggc2VyaWVzIGNhcmRzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIHBjeGVtX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewotICAgICAgICBvdXRiX3AoRkVQV0lOfHdpbiwgKGludCliLT5wb3J0ICsgMSk7CisgICAgICAgIG91dGJfcChGRVBXSU58d2luLCBiLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCitzdGF0aWMgdm9pZCBwY3hlbV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCiB7Ci0Jb3V0Yl9wKDAsIChpbnQpYi0+cG9ydCArIDEpOworCW91dGJfcCgwLCBiLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlbV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJb3V0Yl9wKCBGRVBXSU4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGVtX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCW91dGJfcChjaC0+cnh3aW4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGVtX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCW91dGJfcChjaC0+dHh3aW4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlbV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4ZW1fbWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGN4ZSBtZW1vcnkgd2luZG93IHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9tZW13aW5vbihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIHBjeGVfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCiB7Ci0gICAgICAgICAgICAgICBvdXRiX3AoRkVQV0lOIHwgd2luLCAoaW50KWItPnBvcnQgKyAxKTsKKyAgICAgICAgICAgICAgIG91dGJfcChGRVBXSU4gfCB3aW4sIGItPnBvcnQgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgcGN4ZV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCiB7Ci0Jb3V0Yl9wKGluYigoaW50KWItPnBvcnQpICYgfkZFUE1FTSwKLQkgICAgICAgICAgIChpbnQpYi0+cG9ydCArIDEpOwotCW91dGJfcCgwLCAoaW50KWItPnBvcnQgKyAxKTsKKwlvdXRiX3AoaW5iKGItPnBvcnQpICYgfkZFUE1FTSwKKwkgICAgICAgICAgIGItPnBvcnQgKyAxKTsKKwlvdXRiX3AoMCwgYi0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIAlvdXRiX3AoIEZFUFdJTiwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGVfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogCQlvdXRiX3AoY2gtPnJ4d2luLCAoaW50KWNoLT5ib2FyZC0+cG9ydCArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4ZV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGVfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJCW91dGJfcChjaC0+dHh3aW4sIChpbnQpY2gtPmJvYXJkLT5wb3J0ICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hlX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hlX21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiAJb3V0Yl9wKDAsIChpbnQpY2gtPmJvYXJkLT5wb3J0KTsKIAlvdXRiX3AoMCwgKGludCljaC0+Ym9hcmQtPnBvcnQgKyAxKTsKQEAgLTM0OCw0NCArMzM4LDQ0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0gQmVnaW4gcGM2NHhlIGFuZCBwY3hpIG1lbW9yeSB3aW5kb3cgc3R1ZmYgLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCitzdGF0aWMgdm9pZCBwY3hpX21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewotICAgICAgICAgICAgICAgb3V0Yl9wKGluYigoaW50KWItPnBvcnQpIHwgRkVQTUVNLCAoaW50KWItPnBvcnQpOworICAgICAgICAgICAgICAgb3V0Yl9wKGluYihiLT5wb3J0KSB8IEZFUE1FTSwgYi0+cG9ydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX21lbXdpbm9mZihzdHJ1Y3QgYm9hcmRfaW5mbyAqYiwgdW5zaWduZWQgaW50IHdpbikKK3N0YXRpYyB2b2lkIHBjeGlfbWVtd2lub2ZmKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQogewotCW91dGJfcChpbmIoKGludCliLT5wb3J0KSAmIH5GRVBNRU0sIChpbnQpYi0+cG9ydCk7CisJb3V0Yl9wKGluYihiLT5wb3J0KSAmIH5GRVBNRU0sIGItPnBvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hpX2dsb2JhbHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKLQlvdXRiX3AoRkVQTUVNLCAoaW50KWNoLT5ib2FyZC0+cG9ydCk7CisJb3V0Yl9wKEZFUE1FTSwgY2gtPmJvYXJkLT5wb3J0KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfcnh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hpX3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewotCQlvdXRiX3AoRkVQTUVNLCAoaW50KWNoLT5ib2FyZC0+cG9ydCk7CisJCW91dGJfcChGRVBNRU0sIGNoLT5ib2FyZC0+cG9ydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX3R4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4aV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKLQkJb3V0Yl9wKEZFUE1FTSwgKGludCljaC0+Ym9hcmQtPnBvcnQpOworCQlvdXRiX3AoRkVQTUVNLCBjaC0+Ym9hcmQtPnBvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGN4aV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgcGN4aV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQogewotCW91dGJfcCgwLCAoaW50KWNoLT5ib2FyZC0+cG9ydCk7CisJb3V0Yl9wKDAsIGNoLT5ib2FyZC0+cG9ydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY3hpX2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBwY3hpX2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7Ci0JZXBjYWFzc2VydChpbmIoKGludCljaC0+Ym9hcmQtPnBvcnQpICYgRkVQTUVNLCAiR2xvYmFsIG1lbW9yeSBvZmYiKTsKKwllcGNhYXNzZXJ0KGluYihjaC0+Ym9hcmQtPnBvcnQpICYgRkVQTUVNLCAiR2xvYmFsIG1lbW9yeSBvZmYiKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjeGlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHBjeGlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKLQllcGNhYXNzZXJ0KCEoaW5iKChpbnQpY2gtPmJvYXJkLT5wb3J0KSAmIEZFUE1FTSksICJNZW1vcnkgb24iKTsKKwllcGNhYXNzZXJ0KCEoaW5iKGNoLT5ib2FyZC0+cG9ydCkgJiBGRVBNRU0pLCAiTWVtb3J5IG9uIik7CiB9CiAKIApAQCAtMzk4LDE4NSArMzg4LDE0MyBAQAogCW1heSBvciBtYXkgbm90IGRvIGFueXRoaW5nLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbXdpbm9uKHN0cnVjdCBib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgd2luKQorc3RhdGljIHZvaWQgZHVtbXlfbWVtd2lub24oc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCitzdGF0aWMgdm9pZCBkdW1teV9tZW13aW5vZmYoc3RydWN0IGJvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCB3aW4pCiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBkdW1teV9nbG9iYWx3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9yeHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIGR1bW15X3J4d2lub24oc3RydWN0IGNoYW5uZWwgKmNoKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfdHh3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBkdW1teV90eHdpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGR1bW15X21lbW9mZihzdHJ1Y3QgY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCBkdW1teV9tZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfYXNzZXJ0Z3dpbm9uKHN0cnVjdCBjaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIGR1bW15X2Fzc2VydGd3aW5vbihzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9hc3NlcnRtZW1vZmYoc3RydWN0IGNoYW5uZWwgKmNoKQorc3RhdGljIHZvaWQgZHVtbXlfYXNzZXJ0bWVtb2ZmKHN0cnVjdCBjaGFubmVsICpjaCkKIHsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gdmVyaWZ5Q2hhbm5lbCBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgY2hhbm5lbCAqdmVyaWZ5Q2hhbm5lbChyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHN0cnVjdCBjaGFubmVsICp2ZXJpZnlDaGFubmVsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7IC8qIEJlZ2luIHZlcmlmeUNoYW5uZWwgKi8KLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVRoaXMgcm91dGluZSBiYXNpY2FsbHkgcHJvdmlkZXMgYSBzYW5pdHkgY2hlY2suICBJdCBpbnN1cmVzIHRoYXQKIAkJdGhlIGNoYW5uZWwgcmV0dXJuZWQgaXMgd2l0aGluIHRoZSBwcm9wZXIgcmFuZ2Ugb2YgYWRkcmVzc2VzIGFzCiAJCXdlbGwgYXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuICBJZiBzb21lIGJvZ3VzIGluZm8gZ2V0cyBwYXNzZWQgaW4KIAkJdGhyb3VnaCB0dHktPmRyaXZlcl9kYXRhIHRoaXMgc2hvdWxkIGNhdGNoIGl0LgotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JaWYgKHR0eSkgCi0JeyAvKiBCZWdpbiBpZiB0dHkgKi8KLQotCQlyZWdpc3RlciBzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKil0dHktPmRyaXZlcl9kYXRhOwotCi0JCWlmICgoY2ggPj0gJmRpZ2lfY2hhbm5lbHNbMF0pICYmIChjaCA8ICZkaWdpX2NoYW5uZWxzW25iZGV2c10pKSAKLQkJeworCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpZiAodHR5KSB7CisJCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCWlmICgoY2ggPj0gJmRpZ2lfY2hhbm5lbHNbMF0pICYmIChjaCA8ICZkaWdpX2NoYW5uZWxzW25iZGV2c10pKSB7CiAJCQlpZiAoY2gtPm1hZ2ljID09IEVQQ0FfTUFHSUMpCiAJCQkJcmV0dXJuIGNoOwogCQl9Ci0KLQl9IC8qIEVuZCBpZiB0dHkgKi8KLQotCS8qIEVsc2UgcmV0dXJuIGEgTlVMTCBmb3IgaW52YWxpZCAqLworCX0KIAlyZXR1cm4gTlVMTDsKIAogfSAvKiBFbmQgdmVyaWZ5Q2hhbm5lbCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfc2NoZWRfZXZlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNfc2NoZWRfZXZlbnQoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgZXZlbnQpCi17IC8qIEJlZ2luIHBjX3NjaGVkX2V2ZW50ICovCi0KLQorc3RhdGljIHZvaWQgcGNfc2NoZWRfZXZlbnQoc3RydWN0IGNoYW5uZWwgKmNoLCBpbnQgZXZlbnQpCit7CiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlXZSBjYWxsIHRoaXMgdG8gc2NoZWR1bGUgaW50ZXJydXB0IHByb2Nlc3Npbmcgb24gc29tZSBldmVudC4gIFRoZSAKIAkJa2VybmVsIHNlZXMgb3VyIHJlcXVlc3QgYW5kIGNhbGxzIHRoZSByZWxhdGVkIHJvdXRpbmUgaW4gT1VSIGRyaXZlci4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogCWNoLT5ldmVudCB8PSAxIDw8IGV2ZW50OwogCXNjaGVkdWxlX3dvcmsoJmNoLT50cXVldWUpOwotCi0KIH0gLyogRW5kIHBjX3NjaGVkX2V2ZW50ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBlcGNhX2Vycm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHZvaWQgZXBjYV9lcnJvcihpbnQgbGluZSwgY2hhciAqbXNnKQoteyAvKiBCZWdpbiBlcGNhX2Vycm9yICovCi0KK3sKIAlwcmludGsoS0VSTl9FUlIgImVwY2FfZXJyb3IgKERpZ2kpOiBsaW5lID0gJWQgJXNcbiIsbGluZSxtc2cpOwotCXJldHVybjsKLQotfSAvKiBFbmQgZXBjYV9lcnJvciAqLworfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfY2xvc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIHZvaWQgcGNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKLXsgLyogQmVnaW4gcGNfY2xvc2UgKi8KLQorewogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CiAJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCi0JeyAvKiBCZWdpbiBpZiBjaCAhPSBOVUxMICovCi0KLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOwotCi0JCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSAKLQkJewotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgIHsgLyogQmVnaW4gaWYgY2ggIT0gTlVMTCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybjsKIAkJfQotCiAJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbm5lbCBpcyBvcGVuIG1vcmUgdGhhbiBvbmNlICovCi0JCWlmIChjaC0+Y291bnQtLSA+IDEpIAotCQl7IC8qIEJlZ2luIGNoYW5uZWwgaXMgb3BlbiBtb3JlIHRoYW4gb25jZSAqLwotCisJCWlmIChjaC0+Y291bnQtLSA+IDEpICB7CisJCQkvKiBCZWdpbiBjaGFubmVsIGlzIG9wZW4gbW9yZSB0aGFuIG9uY2UgKi8KIAkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlSZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZy4gIFNvbWVvbmUgbWlnaHQgc3RpbGwgYmUgdXNpbmcKIAkJCQl0aGUgY2hhbm5lbC4KIAkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybjsKIAkJfSAvKiBFbmQgY2hhbm5lbCBpcyBvcGVuIG1vcmUgdGhhbiBvbmNlICovCiAKIAkJLyogUG9ydCBvcGVuIG9ubHkgb25jZSBnbyBhaGVhZCB3aXRoIHNodXRkb3duICYgcmVzZXQgKi8KLQotCQlpZiAoY2gtPmNvdW50IDwgMCkgCi0JCXsKLQkJCWNoLT5jb3VudCA9IDA7Ci0JCX0KKwkJaWYgKGNoLT5jb3VudCA8IDApCisJCQlCVUcoKTsKIAogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUxldCB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIGtub3cgdGhlIGNoYW5uZWwgaXMgYmVpbmcgY2xvc2VkLgogCQkJVGhpcyBiZWNvbWVzIGltcG9ydGFudCBpZiBhbiBvcGVuIGlzIGF0dGVtcHRlZCBiZWZvcmUgY2xvc2UgCiAJCQlpcyBmaW5pc2hlZC4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKLQkKIAkJdHR5LT5jbG9zaW5nID0gMTsKIAotCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgCi0JCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpICB7CiAJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLwogCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LCBjaCk7CQkKIAkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAzMDAwKTsgLyogMzAgc2Vjb25kcyB0aW1lb3V0ICovCiAJCX0KLQkKIAkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCiAJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAKIAkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CiAJCXNodXRkb3duKGNoKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCXR0eS0+Y2xvc2luZyA9IDA7CiAJCWNoLT5ldmVudCA9IDA7CiAJCWNoLT50dHkgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAotCQlpZiAoY2gtPmJsb2NrZWRfb3BlbikgCi0JCXsgLyogQmVnaW4gaWYgYmxvY2tlZF9vcGVuICovCi0KKwkJaWYgKGNoLT5ibG9ja2VkX29wZW4pICB7IC8qIEJlZ2luIGlmIGJsb2NrZWRfb3BlbiAqLwogCQkJaWYgKGNoLT5jbG9zZV9kZWxheSkgCi0JCQl7CiAJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaC0+Y2xvc2VfZGVsYXkpKTsKLQkJCX0KLQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKLQogCQl9IC8qIEVuZCBpZiBibG9ja2VkX29wZW4gKi8KLQogCQljaC0+YXN5bmNmbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkUgfCBBU1lOQ19JTklUSUFMSVpFRCB8IAogCQkgICAgICAgICAgICAgICAgICAgICAgQVNZTkNfQ0xPU0lORyk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNsb3NlX3dhaXQpOwotCi0KLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KIAl9IC8qIEVuZCBpZiBjaCAhPSBOVUxMICovCi0KIH0gLyogRW5kIHBjX2Nsb3NlICovIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gc2h1dGRvd24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTU4NiwxNSArNTM0LDE0IEBACiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKIAogCWlmICghKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSAKIAkJcmV0dXJuOwogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0JZ2xvYmFsd2lub24oY2gpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAorCWdsb2JhbHdpbm9uKGNoKTsKIAliYyA9IGNoLT5icmRjaGFuOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MDQsMjAgKzU1MSwxNyBAQAogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKIAogCWlmIChiYykKLQkJYmMtPmlkYXRhID0gMDsKLQorCQl3cml0ZWIoMCwgJmJjLT5pZGF0YSk7CiAJdHR5ID0gY2gtPnR0eTsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgICBJZiB3ZSdyZSBhIG1vZGVtIGNvbnRyb2wgZGV2aWNlIGFuZCBIVVBDTCBpcyBvbiwgZHJvcCBSVFMgJiBEVFIuCiAgCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSAKLQl7CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSAgewogCQljaC0+b21vZGVtICY9IH4oY2gtPm1fcnRzIHwgY2gtPm1fZHRyKTsKIAkJZmVwY21kKGNoLCBTRVRNT0RFTSwgMCwgY2gtPm1fZHRyIHwgY2gtPm1fcnRzLCAxMCwgMSk7CiAJfQotCiAJbWVtb2ZmKGNoKTsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjI4LDcgKzU3Miw3IEBACiAJLyogUHJldmVudCBmdXR1cmUgRGlnaSBwcm9ncmFtbWVkIGludGVycnVwdHMgZnJvbSBjb21pbmcgYWN0aXZlICovCiAKIAljaC0+YXN5bmNmbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKIH0gLyogRW5kIHNodXRkb3duICovCiAKQEAgLTYzNiw3ICs1ODAsNiBAQAogCiBzdGF0aWMgdm9pZCBwY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsgLyogQmVnaW4gcGNfaGFuZ3VwICovCi0KIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NDQsMjUgKzU4NywyMSBAQAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsgLyogQmVnaW4gaWYgY2ggIT0gTlVMTCAqLwotCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgIHsgLyogQmVnaW4gaWYgY2ggIT0gTlVMTCAqLwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKIAkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCiAJCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAJCXR0eV9sZGlzY19mbHVzaCh0dHkpOwogCQlzaHV0ZG93bihjaCk7CiAKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQljaC0+dHR5ICAgPSBOVUxMOwogCQljaC0+ZXZlbnQgPSAwOwogCQljaC0+Y291bnQgPSAwOwotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKIAkJY2gtPmFzeW5jZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfSU5JVElBTElaRUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKLQogCX0gLyogRW5kIGlmIGNoICE9IE5VTEwgKi8KIAogfSAvKiBFbmQgcGNfaGFuZ3VwICovCkBAIC02NzIsMTggKzYxMSwxNCBAQAogc3RhdGljIGludCBwY193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnl0ZXNBdmFpbGFibGUpCiB7IC8qIEJlZ2luIHBjX3dyaXRlICovCi0KLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKLQlyZWdpc3RlciBpbnQgZGF0YUxlbjsKLQlyZWdpc3RlciBpbnQgc2l6ZTsKLQlyZWdpc3RlciBpbnQgYW1vdW50Q29waWVkOwotCi0KKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKKwlpbnQgZGF0YUxlbjsKKwlpbnQgc2l6ZTsKKwlpbnQgYW1vdW50Q29waWVkOwogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZW1haW47Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOwotCisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlwY193cml0ZSBpcyBwcmltYXJpbHkgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSBrZXJuZWwgcm91dGluZQpAQCAtNzA2LDI0ICs2NDEsMjAgQEAKIAogCWJjICAgPSBjaC0+YnJkY2hhbjsKIAlzaXplID0gY2gtPnR4YnVmc2l6ZTsKLQogCWFtb3VudENvcGllZCA9IDA7Ci0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJZ2xvYmFsd2lub24oY2gpOwogCi0JaGVhZCA9IGJjLT50aW4gJiAoc2l6ZSAtIDEpOwotCXRhaWwgPSBiYy0+dG91dDsKKwloZWFkID0gcmVhZHcoJmJjLT50aW4pICYgKHNpemUgLSAxKTsKKwl0YWlsID0gcmVhZHcoJmJjLT50b3V0KTsKIAotCWlmICh0YWlsICE9IGJjLT50b3V0KQotCQl0YWlsID0gYmMtPnRvdXQ7CisJaWYgKHRhaWwgIT0gcmVhZHcoJmJjLT50b3V0KSkKKwkJdGFpbCA9IHJlYWR3KCZiYy0+dG91dCk7CiAJdGFpbCAmPSAoc2l6ZSAtIDEpOwogCiAJLyoJSWYgaGVhZCA+PSB0YWlsLCBoZWFkIGhhcyBub3Qgd3JhcHBlZCBhcm91bmQuICovIAotCWlmIChoZWFkID49IHRhaWwpIAotCXsgLyogQmVnaW4gaGVhZCBoYXMgbm90IHdyYXBwZWQgKi8KLQorCWlmIChoZWFkID49IHRhaWwpICB7IC8qIEJlZ2luIGhlYWQgaGFzIG5vdCB3cmFwcGVkICovCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJcmVtYWluIChtdWNoIGxpa2UgZGF0YUxlbiBhYm92ZSkgcmVwcmVzZW50cyB0aGUgdG90YWwgYW1vdW50IG9mCiAJCQlzcGFjZSBhdmFpbGFibGUgb24gdGhlIGNhcmQgZm9yIGRhdGEuICBIZXJlIGRhdGFMZW4gcmVwcmVzZW50cwpAQCAtNzMxLDI2ICs2NjIsMTkgQEAKIAkJCWJ1ZmZlci4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgYSBtZW1jcHkgY2Fubm90IGJlIHRvbGQgdG8KIAkJCWF1dG9tYXRpY2FsbHkgd3JhcCBhcm91bmQgd2hlbiBpdCBoaXRzIHRoZSBidWZmZXIgZW5kLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCi0KIAkJZGF0YUxlbiA9IHNpemUgLSBoZWFkOwogCQlyZW1haW4gPSBzaXplIC0gKGhlYWQgLSB0YWlsKSAtIDE7Ci0KLQl9IC8qIEVuZCBoZWFkIGhhcyBub3Qgd3JhcHBlZCAqLwotCWVsc2UgCi0JeyAvKiBCZWdpbiBoZWFkIGhhcyB3cmFwcGVkIGFyb3VuZCAqLworCX0gZWxzZSB7IC8qIEJlZ2luIGhlYWQgaGFzIHdyYXBwZWQgYXJvdW5kICovCiAKIAkJcmVtYWluID0gdGFpbCAtIGhlYWQgLSAxOwogCQlkYXRhTGVuID0gcmVtYWluOwogCiAJfSAvKiBFbmQgaGVhZCBoYXMgd3JhcHBlZCBhcm91bmQgKi8KLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUNoZWNrIHRoZSBzcGFjZSBvbiB0aGUgY2FyZC4gIElmIHdlIGhhdmUgbW9yZSBkYXRhIHRoYW4gCiAJCQlzcGFjZTsgcmVkdWNlIHRoZSBhbW91bnQgb2YgZGF0YSB0byBmaXQgdGhlIHNwYWNlLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCWJ5dGVzQXZhaWxhYmxlID0gbWluKHJlbWFpbiwgYnl0ZXNBdmFpbGFibGUpOwotCiAJdHh3aW5vbihjaCk7CiAJd2hpbGUgKGJ5dGVzQXZhaWxhYmxlID4gMCkgCiAJeyAvKiBCZWdpbiB3aGlsZSB0aGVyZSBpcyBkYXRhIHRvIGNvcHkgb250byBjYXJkICovCkBAIC03NjcsMjYgKzY5MSwyMSBAQAogCQlhbW91bnRDb3BpZWQgKz0gZGF0YUxlbjsKIAkJYnl0ZXNBdmFpbGFibGUgLT0gZGF0YUxlbjsKIAotCQlpZiAoaGVhZCA+PSBzaXplKSAKLQkJeworCQlpZiAoaGVhZCA+PSBzaXplKSB7CiAJCQloZWFkID0gMDsKIAkJCWRhdGFMZW4gPSB0YWlsOwogCQl9Ci0KIAl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBkYXRhIHRvIGNvcHkgb250byBjYXJkICovCi0KIAljaC0+c3RhdHVzZmxhZ3MgfD0gVFhCVVNZOwogCWdsb2JhbHdpbm9uKGNoKTsKLQliYy0+dGluID0gaGVhZDsKKwl3cml0ZXcoaGVhZCwgJmJjLT50aW4pOwogCi0JaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSA9PSAwKSAKLQl7CisJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSA9PSAwKSAgewogCQljaC0+c3RhdHVzZmxhZ3MgfD0gTE9XV0FJVDsKLQkJYmMtPmlsb3cgPSAxOworCQl3cml0ZWIoMSwgJmJjLT5pbG93KTsKIAl9CiAJbWVtb2ZmKGNoKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCXJldHVybihhbW91bnRDb3BpZWQpOwogCiB9IC8qIEVuZCBwY193cml0ZSAqLwpAQCAtNzk1LDExICs3MTQsNyBAQAogCiBzdGF0aWMgdm9pZCBwY19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCiB7IC8qIEJlZ2luIHBjX3B1dF9jaGFyICovCi0KLSAgIAogCXBjX3dyaXRlKHR0eSwgJmMsIDEpOwotCXJldHVybjsKLQogfSAvKiBFbmQgcGNfcHV0X2NoYXIgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX3dyaXRlX3Jvb20gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTgxMSw3ICs3MjYsNyBAQAogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAKIAlyZW1haW4gPSAwOwogCkBAIC04MjAsMzMgKzczNSwyOSBAQAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsKLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOworCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpICB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJZ2xvYmFsd2lub24oY2gpOwogCiAJCWJjICAgPSBjaC0+YnJkY2hhbjsKLQkJaGVhZCA9IGJjLT50aW4gJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOwotCQl0YWlsID0gYmMtPnRvdXQ7CisJCWhlYWQgPSByZWFkdygmYmMtPnRpbikgJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCQl0YWlsID0gcmVhZHcoJmJjLT50b3V0KTsKIAotCQlpZiAodGFpbCAhPSBiYy0+dG91dCkKLQkJCXRhaWwgPSBiYy0+dG91dDsKKwkJaWYgKHRhaWwgIT0gcmVhZHcoJmJjLT50b3V0KSkKKwkJCXRhaWwgPSByZWFkdygmYmMtPnRvdXQpOwogCQkvKiBXcmFwIHRhaWwgaWYgbmVjZXNzYXJ5ICovCiAJCXRhaWwgJj0gKGNoLT50eGJ1ZnNpemUgLSAxKTsKIAogCQlpZiAoKHJlbWFpbiA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwICkKIAkJCXJlbWFpbiArPSBjaC0+dHhidWZzaXplOwogCi0JCWlmIChyZW1haW4gJiYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpID09IDApIAotCQl7CisJCWlmIChyZW1haW4gJiYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpID09IDApIHsKIAkJCWNoLT5zdGF0dXNmbGFncyB8PSBMT1dXQUlUOwotCQkJYmMtPmlsb3cgPSAxOworCQkJd3JpdGViKDEsICZiYy0+aWxvdyk7CiAJCX0KIAkJbWVtb2ZmKGNoKTsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCX0KLQogCS8qIFJldHVybiBob3cgbXVjaCByb29tIGlzIGxlZnQgb24gY2FyZCAqLwogCXJldHVybiByZW1haW47CiAKQEAgLTg2Miw4ICs3NzMsNyBAQAogCWludCByZW1haW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOwotCisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CkBAIC04NzMsMzQgKzc4MywyNyBAQAogCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpID09IE5VTEwpCiAJCXJldHVybigwKTsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAlnbG9iYWx3aW5vbihjaCk7CiAKIAliYyA9IGNoLT5icmRjaGFuOwotCXRhaWwgPSBiYy0+dG91dDsKLQloZWFkID0gYmMtPnRpbjsKLQljdGFpbCA9IGNoLT5tYWlsYm94LT5jb3V0OworCXRhaWwgPSByZWFkdygmYmMtPnRvdXQpOworCWhlYWQgPSByZWFkdygmYmMtPnRpbik7CisJY3RhaWwgPSByZWFkdygmY2gtPm1haWxib3gtPmNvdXQpOwogCi0JaWYgKHRhaWwgPT0gaGVhZCAmJiBjaC0+bWFpbGJveC0+Y2luID09IGN0YWlsICYmIGJjLT50YnVzeSA9PSAwKQorCWlmICh0YWlsID09IGhlYWQgJiYgcmVhZHcoJmNoLT5tYWlsYm94LT5jaW4pID09IGN0YWlsICYmIHJlYWRiKCZiYy0+dGJ1c3kpID09IDApCiAJCWNoYXJzID0gMDsKLQllbHNlIAotCXsgLyogQmVnaW4gaWYgc29tZSBzcGFjZSBvbiB0aGUgY2FyZCBoYXMgYmVlbiB1c2VkICovCi0KLQkJaGVhZCA9IGJjLT50aW4gJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOworCWVsc2UgIHsgLyogQmVnaW4gaWYgc29tZSBzcGFjZSBvbiB0aGUgY2FyZCBoYXMgYmVlbiB1c2VkICovCisJCWhlYWQgPSByZWFkdygmYmMtPnRpbikgJiAoY2gtPnR4YnVmc2l6ZSAtIDEpOwogCQl0YWlsICY9IChjaC0+dHhidWZzaXplIC0gMSk7Ci0KIAkJLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlUaGUgbG9naWMgaGVyZSBpcyBiYXNpY2FsbHkgb3Bwb3NpdGUgb2YgdGhlIGFib3ZlIHBjX3dyaXRlX3Jvb20KIAkJCWhlcmUgd2UgYXJlIGZpbmRpbmcgdGhlIGFtb3VudCBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIGZpbGxlZC4KIAkJCU5vdCB0aGUgYW1vdW50IG9mIGJ5dGVzIGVtcHR5LgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJaWYgKChyZW1haW4gPSB0YWlsIC0gaGVhZCAtIDEpIDwgMCApCiAJCQlyZW1haW4gKz0gY2gtPnR4YnVmc2l6ZTsKLQogCQljaGFycyA9IChpbnQpKGNoLT50eGJ1ZnNpemUgLSByZW1haW4pOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogCQkJTWFrZSBpdCBwb3NzaWJsZSB0byB3YWtldXAgYW55dGhpbmcgd2FpdGluZyBmb3Igb3V0cHV0CiAJCQlpbiB0dHlfaW9jdGwuYywgZXRjLgpAQCAtOTA4LDE1ICs4MTEsMTIgQEAKIAkJCUlmIG5vdCBhbHJlYWR5IHNldC4gIFNldHVwIGFuIGV2ZW50IHRvIGluZGljYXRlIHdoZW4gdGhlCiAJCQl0cmFuc21pdCBidWZmZXIgZW1wdGllcyAKIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQlpZiAoIShjaC0+c3RhdHVzZmxhZ3MgJiBFTVBUWVdBSVQpKQogCQkJc2V0dXBfZW1wdHlfZXZlbnQodHR5LGNoKTsKIAogCX0gLyogRW5kIGlmIHNvbWUgc3BhY2Ugb24gdGhlIGNhcmQgaGFzIGJlZW4gdXNlZCAqLwotCiAJbWVtb2ZmKGNoKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCS8qIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyByZXNpZGluZyBvbiBjYXJkLiAqLwogCXJldHVybihjaGFycyk7CiAKQEAgLTkzMCw2NyArODMwLDQ2IEBACiAJdW5zaWduZWQgaW50IHRhaWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOwotCi0KKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CiAJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJZ2xvYmFsd2lub24oY2gpOwotCiAJYmMgICA9IGNoLT5icmRjaGFuOwotCXRhaWwgPSBiYy0+dG91dDsKLQorCXRhaWwgPSByZWFkdygmYmMtPnRvdXQpOwogCS8qIEhhdmUgRkVQIG1vdmUgdG91dCBwb2ludGVyOyBlZmZlY3RpdmVseSBmbHVzaGluZyB0cmFuc21pdCBidWZmZXIgKi8KLQogCWZlcGNtZChjaCwgU1RPVVQsICh1bnNpZ25lZCkgdGFpbCwgMCwgMCwgMCk7Ci0KIAltZW1vZmYoY2gpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOwogCXR0eV93YWtldXAodHR5KTsKLQogfSAvKiBFbmQgcGNfZmx1c2hfYnVmZmVyICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19mbHVzaF9jaGFycyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgdm9pZCBwY19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogeyAvKiBCZWdpbiBwY19mbHVzaF9jaGFycyAqLwotCiAJc3RydWN0IGNoYW5uZWwgKiBjaDsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOwotCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJSWYgbm90IGFscmVhZHkgc2V0IGFuZCB0aGUgdHJhbnNtaXR0ZXIgaXMgYnVzeSBzZXR1cCBhbiBldmVudAogCQkJdG8gaW5kaWNhdGUgd2hlbiB0aGUgdHJhbnNtaXQgZW1wdGllcy4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWlmICgoY2gtPnN0YXR1c2ZsYWdzICYgVFhCVVNZKSAmJiAhKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkpCiAJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwotCi0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAl9Ci0KIH0gLyogRW5kIHBjX2ZsdXNoX2NoYXJzICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBibG9ja190aWxfcmVhZHkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTk5OCwxNCArODc3LDExIEBACiBzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7IC8qIEJlZ2luIGJsb2NrX3RpbF9yZWFkeSAqLwotCiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKIAlpbnQJcmV0dmFsLCBkb19jbG9jYWwgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQotCXsKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgewogCQlpZiAoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQogCQkJcmV0dmFsID0gLUVBR0FJTjsKIAkJZWxzZQpAQCAtMTAxNyw4ICs4OTMsNyBAQAogCQlJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCiAJCXVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JaWYgKGNoLT5hc3luY2ZsYWdzICYgQVNZTkNfQ0xPU0lORykgCi0JeworCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKIAkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2gtPmNsb3NlX3dhaXQpOwogCiAJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCkBAIC0xMDI3LDQzICs5MDIsMjkgQEAKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJfQogCi0JaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAKLQl7CisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAgewogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKIAkgIAkgSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250CiAJICAJIGFuZCB0aGVuIGV4aXQuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJY2gtPmFzeW5jZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQogCQlyZXR1cm4gMDsKIAl9Ci0KLQogCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCiAJCWRvX2Nsb2NhbCA9IDE7Ci0JCi0gICAvKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZSBmcmVlICovCisJLyogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUgZnJlZSAqLwogCQogCXJldHZhbCA9IDA7CiAJYWRkX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKIAotCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCS8qIFdlIGRlYyBjb3VudCBzbyB0aGF0IHBjX2Nsb3NlIHdpbGwga25vdyB3aGVuIHRvIGZyZWUgdGhpbmdzICovCiAJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQogCQljaC0+Y291bnQtLTsKLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCiAJY2gtPmJsb2NrZWRfb3BlbisrOwotCiAJd2hpbGUoMSkgCiAJeyAvKiBCZWdpbiBmb3JldmVyIHdoaWxlICAqLwotCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KIAkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKIAkJICAgICEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIAogCQl7CkBAIC0xMDczLDE3ICs5MzQsMTQgQEAKIAkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQogCQkJYnJlYWs7CiAJCX0KLQogCQlpZiAoIShjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIAogCQkJICAoZG9fY2xvY2FsIHx8IChjaC0+aW1vZGVtICYgY2gtPmRjZCkpKQogCQkJYnJlYWs7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSAKLQkJeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCWJyZWFrOwogCQl9Ci0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJQWxsb3cgc29tZW9uZSBlbHNlIHRvIGJlIHNjaGVkdWxlZC4gIFdlIHdpbGwgb2NjYXNpb25hbGx5IGdvCiAJCQl0aHJvdWdoIHRoaXMgbG9vcCB1bnRpbCBvbmUgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgY2hhbmdlLgpAQCAtMTA5MSwyNSArOTQ5LDIzIEBACiAJCQlwcmV2ZW50IHRoaXMgbG9vcCBmcm9tIGhvZ2dpbmcgdGhlIGNwdS4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJCXNjaGVkdWxlKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAogCX0gLyogRW5kIGZvcmV2ZXIgd2hpbGUgICovCiAKIAljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmY2gtPm9wZW5fd2FpdCwgJndhaXQpOwotCWNsaSgpOwogCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKIAkJY2gtPmNvdW50Kys7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KIAljaC0+YmxvY2tlZF9vcGVuLS07CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKIAljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCiAJcmV0dXJuIDA7Ci0KIH0gLyogRW5kIGJsb2NrX3RpbF9yZWFkeSAqLwkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX29wZW4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExMjAsMTcgKzk3NiwxMiBAQAogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBsaW5lLCByZXR2YWwsIGJvYXJkbnVtOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaGVhZDsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CisJdW5zaWduZWQgaW50IGhlYWQ7CiAKIAlsaW5lID0gdHR5LT5pbmRleDsKLQlpZiAobGluZSA8IDAgfHwgbGluZSA+PSBuYmRldnMpIAotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbiA6IGxpbmUgb3V0IG9mIHJhbmdlIGluIHBjX29wZW5cbiIpOwotCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJcmV0dXJuKC1FTk9ERVYpOwotCX0KLQorCWlmIChsaW5lIDwgMCB8fCBsaW5lID49IG5iZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAljaCA9ICZkaWdpX2NoYW5uZWxzW2xpbmVdOwogCWJvYXJkbnVtID0gY2gtPmJvYXJkbnVtOwpAQCAtMTE0Myw2NiArOTk0LDQ5IEBACiAJCWdvZXMgaGVyZS4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQlpZiAoaW52YWxpZF9saWxvX2NvbmZpZykKLQl7CisJaWYgKGludmFsaWRfbGlsb19jb25maWcpIHsKIAkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX0JPQVJEX1RZUEUpCi0JCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIHR5cGUgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7Ci0KKwkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogcGNfb3BlbjogSW52YWxpZCBib2FyZCB0eXBlIHNwZWNpZmllZCBpbiBrZXJuZWwgb3B0aW9ucy5cbiIpOwogCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfTlVNX1BPUlRTKQotCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBudW1iZXIgb2YgcG9ydHMgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7Ci0KKwkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogcGNfb3BlbjogSW52YWxpZCBudW1iZXIgb2YgcG9ydHMgc3BlY2lmaWVkIGluIGtlcm5lbCBvcHRpb25zLlxuIik7CiAJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9NRU1fQkFTRSkKLQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgbWVtb3J5IGFkZHJlc3Mgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7Ci0KKwkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogcGNfb3BlbjogSW52YWxpZCBib2FyZCBtZW1vcnkgYWRkcmVzcyBzcGVjaWZpZWQgaW4ga2VybmVsIG9wdGlvbnMuXG4iKTsKIAkJaWYgKHNldHVwX2Vycm9yX2NvZGUgJiBJTlZBTElEX1BPUlRfQkFTRSkKLQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIHBjX29wZW46IEludmFsaWQgYm9hcmQgcG9ydCBhZGRyZXNzIHNwZWNpZmllZCBpbiBMSUxPIGNvbW1hbmRcbiIpOwotCisJCQlwcmludGsoS0VSTl9FUlIgImVwY2E7IHBjX29wZW46IEludmFsaWQgYm9hcmQgcG9ydCBhZGRyZXNzIHNwZWNpZmllZCBpbiBrZXJuZWwgb3B0aW9ucy5cbiIpOwogCQlpZiAoc2V0dXBfZXJyb3JfY29kZSAmIElOVkFMSURfQk9BUkRfU1RBVFVTKQotCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gcGNfb3BlbjogSW52YWxpZCBib2FyZCBzdGF0dXMgc3BlY2lmaWVkIGluIExJTE8gY29tbWFuZFxuIik7Ci0KKwkJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogcGNfb3BlbjogSW52YWxpZCBib2FyZCBzdGF0dXMgc3BlY2lmaWVkIGluIGtlcm5lbCBvcHRpb25zLlxuIik7CiAJCWlmIChzZXR1cF9lcnJvcl9jb2RlICYgSU5WQUxJRF9BTFRQSU4pCi0JCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIGFsdHBpbiBzcGVjaWZpZWQgaW4gTElMTyBjb21tYW5kXG4iKTsKLQorCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhOiBwY19vcGVuOiBJbnZhbGlkIGJvYXJkIGFsdHBpbiBzcGVjaWZpZWQgaW4ga2VybmVsIG9wdGlvbnM7XG4iKTsKIAkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7ICAgLyogTWFyayB0aGlzIGRldmljZSBhcyAnZG93bicgKi8KLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0KLQlpZiAoKGJvYXJkbnVtID49IG51bV9jYXJkcykgfHwgKGJvYXJkc1tib2FyZG51bV0uc3RhdHVzID09IERJU0FCTEVEKSkgCi0JeworCWlmIChib2FyZG51bSA+PSBudW1fY2FyZHMgfHwgYm9hcmRzW2JvYXJkbnVtXS5zdGF0dXMgPT0gRElTQUJMRUQpICB7CiAJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOyAgIC8qIE1hcmsgdGhpcyBkZXZpY2UgYXMgJ2Rvd24nICovCiAJCXJldHVybigtRU5PREVWKTsKIAl9CiAJCi0JaWYgKCggYmMgPSBjaC0+YnJkY2hhbikgPT0gMCkgCi0JeworCWlmICgoYmMgPSBjaC0+YnJkY2hhbikgPT0gMCkgewogCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCUV2ZXJ5IHRpbWUgYSBjaGFubmVsIGlzIG9wZW5lZCwgaW5jcmVtZW50IGEgY291bnRlci4gIFRoaXMgaXMgCiAJCW5lY2Vzc2FyeSBiZWNhdXNlIHdlIGRvIG5vdCB3aXNoIHRvIGZsdXNoIGFuZCBzaHV0ZG93biB0aGUgY2hhbm5lbAogCQl1bnRpbCB0aGUgbGFzdCBhcHAgaG9sZGluZyB0aGUgY2hhbm5lbCBvcGVuLCBjbG9zZXMgaXQuCSAJCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAljaC0+Y291bnQrKzsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJU2V0IGEga2VybmVsIHN0cnVjdHVyZXMgcG9pbnRlciB0byBvdXIgbG9jYWwgY2hhbm5lbCAKIAkJc3RydWN0dXJlLiAgVGhpcyB3YXkgd2UgY2FuIGdldCB0byBpdCB3aGVuIHBhc3NlZCBvbmx5CiAJCWEgdHR5IHN0cnVjdC4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCXR0eS0+ZHJpdmVyX2RhdGEgPSBjaDsKLQkKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCUlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGNoYW5uZWwgaGFzIGJlZW4gb3BlbmVkLCBpbml0aWFsaXplCiAJCXRoZSB0dHktPnRlcm1pb3Mgc3RydWN0IG90aGVyd2lzZSBsZXQgcGNfY2xvc2UgaGFuZGxlIGl0LgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQogCWdsb2JhbHdpbm9uKGNoKTsKIAljaC0+c3RhdHVzZmxhZ3MgPSAwOwogCkBAIC0xMjEzLDggKzEwNDcsOCBAQAogCSAgIFNldCByZWNlaXZlIGhlYWQgYW5kIHRhaWwgcHRycyB0byBlYWNoIG90aGVyLiAgVGhpcyBpbmRpY2F0ZXMKIAkgICBubyBkYXRhIGF2YWlsYWJsZSB0byByZWFkLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JaGVhZCA9IGJjLT5yaW47Ci0JYmMtPnJvdXQgPSBoZWFkOworCWhlYWQgPSByZWFkdygmYmMtPnJpbik7CisJd3JpdGV3KGhlYWQsICZiYy0+cm91dCk7CiAKIAkvKiBTZXQgdGhlIGNoYW5uZWxzIGFzc29jaWF0ZWQgdHR5IHN0cnVjdHVyZSAqLwogCWNoLT50dHkgPSB0dHk7CkBAIC0xMjI0LDEyMiArMTA1OCw3NCBAQAogCQlpc3N1ZXMsIGV0Yy4uLi4gSXQgZWZmZWN0IGJvdGggY29udHJvbCBmbGFncyBhbmQgaW5wdXQgZmxhZ3MuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAllcGNhcGFyYW0odHR5LGNoKTsKLQogCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwogCW1lbW9mZihjaCk7Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAogCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGNoKTsKIAlpZiAocmV0dmFsKQotCXsKIAkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVNldCB0aGlzIGFnYWluIGluIGNhc2UgYSBoYW5ndXAgc2V0IGl0IHRvIHplcm8gd2hpbGUgdGhpcyAKIAkJb3BlbigpIHdhcyB3YWl0aW5nIGZvciB0aGUgbGluZS4uLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAljaC0+dHR5ID0gdHR5OwotCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CiAJZ2xvYmFsd2lub24oY2gpOwotCiAJLyogRW5hYmxlIERpZ2kgRGF0YSBldmVudHMgKi8KLQliYy0+aWRhdGEgPSAxOwotCisJd3JpdGViKDEsICZiYy0+aWRhdGEpOwogCW1lbW9mZihjaCk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKLQogfSAvKiBFbmQgcGNfb3BlbiAqLwogCi0jaWZkZWYgTU9EVUxFCiBzdGF0aWMgaW50IF9faW5pdCBlcGNhX21vZHVsZV9pbml0KHZvaWQpCiB7IC8qIEJlZ2luIGluaXRfbW9kdWxlICovCi0KLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KLQlwY19pbml0KCk7Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCXJldHVybigwKTsKKwlyZXR1cm4gcGNfaW5pdCgpOwogfQogCiBtb2R1bGVfaW5pdChlcGNhX21vZHVsZV9pbml0KTsKLSNlbmRpZgogCi0jaWZkZWYgRU5BQkxFX1BDSQogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGVwY2FfZHJpdmVyOwotI2VuZGlmCi0KLSNpZmRlZiBNT0RVTEUKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGNsZWFudXBfbW9kdWxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlcGNhX21vZHVsZV9leGl0KHZvaWQpCiB7Ci0KIAlpbnQgICAgICAgICAgICAgICBjb3VudCwgY3JkOwogCXN0cnVjdCBib2FyZF9pbmZvICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbCAgICAqY2g7Ci0JdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CiAKIAlkZWxfdGltZXJfc3luYygmZXBjYV90aW1lcik7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQogCWlmICgodHR5X3VucmVnaXN0ZXJfZHJpdmVyKHBjX2RyaXZlcikpIHx8ICAKIAkgICAgKHR0eV91bnJlZ2lzdGVyX2RyaXZlcihwY19pbmZvKSkpCiAJewotCQlwcmludGsoS0VSTl9XQVJOSU5HICI8RXJyb3I+IC0gRElHSSA6IGNsZWFudXBfbW9kdWxlIGZhaWxlZCB0byB1bi1yZWdpc3RlciB0dHkgZHJpdmVyXG4iKTsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVwY2E6IGNsZWFudXBfbW9kdWxlIGZhaWxlZCB0byB1bi1yZWdpc3RlciB0dHkgZHJpdmVyXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlwdXRfdHR5X2RyaXZlcihwY19kcml2ZXIpOwogCXB1dF90dHlfZHJpdmVyKHBjX2luZm8pOwogCi0JZm9yIChjcmQgPSAwOyBjcmQgPCBudW1fY2FyZHM7IGNyZCsrKSAKLQl7IC8qIEJlZ2luIGZvciBlYWNoIGNhcmQgKi8KLQorCWZvciAoY3JkID0gMDsgY3JkIDwgbnVtX2NhcmRzOyBjcmQrKykgIHsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLwogCQliZCA9ICZib2FyZHNbY3JkXTsKLQogCQlpZiAoIWJkKQogCQl7IC8qIEJlZ2luIHNhbml0eSBjaGVjayAqLwogCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gRGlnaSA6IGNsZWFudXBfbW9kdWxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm47CiAJCX0gLyogRW5kIHNhbml0eSBjaGVjayAqLwotCi0JCWNoID0gY2FyZF9wdHJbY3JkXTsgCi0KKwkJY2ggPSBjYXJkX3B0cltjcmRdOwogCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBiZC0+bnVtcG9ydHM7IGNvdW50KyssIGNoKyspIAogCQl7IC8qIEJlZ2luIGZvciBlYWNoIHBvcnQgKi8KLQotCQkJaWYgKGNoKSAKLQkJCXsKKwkJCWlmIChjaCkgewogCQkJCWlmIChjaC0+dHR5KQogCQkJCQl0dHlfaGFuZ3VwKGNoLT50dHkpOwogCQkJCWtmcmVlKGNoLT50bXBfYnVmKTsKIAkJCX0KLQogCQl9IC8qIEVuZCBmb3IgZWFjaCBwb3J0ICovCiAJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLwotCi0jaWZkZWYgRU5BQkxFX1BDSQogCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmVwY2FfZHJpdmVyKTsKLSNlbmRpZgotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KIH0KKwogbW9kdWxlX2V4aXQoZXBjYV9tb2R1bGVfZXhpdCk7Ci0jZW5kaWYgLyogTU9EVUxFICovCiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcGNfb3BzID0gewogCS5vcGVuID0gcGNfb3BlbiwKQEAgLTEzNzEsMzQgKzExNTcsMTUgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHBjX2luaXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50IF9faW5pdCBwY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwY19pbml0KHZvaWQpCiB7IC8qIEJlZ2luIHBjX2luaXQgKi8KLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJcGNfaW5pdCBpcyBjYWxsZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZHVyaW5nIGJvb3QgdXAgcHJpb3IgdG8KLQkJYW55IG9wZW4gY2FsbHMgYmVpbmcgbWFkZS4gIEluIHRoZSBvbGRlciB2ZXJzaW9ucyBvZiBMaW51eCAoUHJpb3IKLQkJdG8gMi4wLjApIGFuIGVudHJ5IGlzIG1hZGUgaW50byB0dHlfaW8uYy4gIEEgcG9pbnRlciB0byB0aGUgbGFzdAotCQltZW1vcnkgbG9jYXRpb24gKGZyb20ga2VybmVsIHNwYWNlKSB1c2VkIChrbWVtX3N0YXJ0KSBpcyBwYXNzZWQKLQkJdG8gcGNfaW5pdC4gIEl0IGlzIHBjX2luaXRzIHJlc3BvbnNpYmlsaXR5IHRvIG1vZGlmeSB0aGlzIHZhbHVlIAotCQlmb3IgYW55IG1lbW9yeSB0aGF0IHRoZSBEaWdpIGRyaXZlciBtaWdodCBuZWVkIGFuZCB0aGVuIHJldHVybgotCQl0aGlzIHZhbHVlIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgRm9yIGV4YW1wbGUgaWYgdGhlIGRyaXZlcgotCQl3aXNoZXMgdG8gYWxsb2NhdGUgMUsgb2Yga2VybmVsIG1lbW9yeSwgcGNfaW5pdCB3b3VsZCByZXR1cm4gCi0JCShrbWVtX3N0YXJ0ICsgMTAyNCkuICBUaGlzIG1lbW9yeSAoQmV0d2VlbiBrbWVtX3N0YXJ0IGFuZCBrbWVtX3N0YXJ0Ci0JCSsgMTAyNCkgd291bGQgdGhlbiBiZSBhdmFpbGFibGUgZm9yIHVzZSBleGNsdXNpdmVseSBieSB0aGUgZHJpdmVyLiAgCi0JCUluIHRoaXMgY2FzZSBvdXIgZHJpdmVyIGRvZXMgbm90IGFsbG9jYXRlIGFueSBvZiB0aGlzIGtlcm5lbCAKLQkJbWVtb3J5LgotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQl1bG9uZyBmbGFnczsKIAlpbnQgY3JkOwogCXN0cnVjdCBib2FyZF9pbmZvICpiZDsKIAl1bnNpZ25lZCBjaGFyIGJvYXJkX2lkID0gMDsKIAotI2lmZGVmIEVOQUJMRV9QQ0kKIAlpbnQgcGNpX2JvYXJkc19mb3VuZCwgcGNpX2NvdW50OwogCiAJcGNpX2NvdW50ID0gMDsKLSNlbmRpZiAvKiBFTkFCTEVfUENJICovCiAKIAlwY19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWF9BTExPQyk7CiAJaWYgKCFwY19kcml2ZXIpCkBAIC0xNDE2LDggKzExODMsNyBAQAogCQlOb3RlIDogSWYgTElMTyBoYXMgcmFuIGVwY2Ffc2V0dXAgdGhlbiBlcGNhX3NldHVwIHdpbGwgaGFuZGxlIGRlZmluaW5nCiAJCW51bV9jYXJkcyBhcyB3ZWxsIGFzIGNvcHlpbmcgdGhlIGRhdGEgaW50byB0aGUgYm9hcmQgc3RydWN0dXJlLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JaWYgKCFsaWxvY29uZmlnKQotCXsgLyogQmVnaW4gZHJpdmVyIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdmlhLiBlcGNhY29uZmlnICovCisJaWYgKCFsaWxvY29uZmlnKSB7IC8qIEJlZ2luIGRyaXZlciBoYXMgYmVlbiBjb25maWd1cmVkIHZpYS4gZXBjYWNvbmZpZyAqLwogCiAJCW5iZGV2cyA9IE5CREVWUzsKIAkJbnVtX2NhcmRzID0gTlVNQ0FSRFM7CkBAIC0xNDQwLDggKzEyMDYsNiBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRElHSSBlcGNhIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZC5cbiIsVkVSU0lPTik7CiAKLSNpZmRlZiBFTkFCTEVfUENJCi0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJTk9URSA6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG51bWJlciBvZiBwb3J0cyBmb3VuZCBpbiAKIAkJICAgICAgIHRoZSBib2FyZHMgYXJyYXkgaXMgY29ycmVjdC4gIFRoaXMgY291bGQgYmUgd3JvbmcgaWYKQEAgLTE0NjcsOCArMTIzMSw2IEBACiAJCXBjaV9ib2FyZHNfZm91bmQgKz0gaW5pdF9QQ0koKTsKIAludW1fY2FyZHMgKz0gcGNpX2JvYXJkc19mb3VuZDsKIAotI2VuZGlmIC8qIEVOQUJMRV9QQ0kgKi8KLQogCXBjX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwY19kcml2ZXItPm5hbWUgPSAidHR5RCI7IAogCXBjX2RyaXZlci0+ZGV2ZnNfbmFtZSA9ICJ0dHMvRCI7CkBAIC0xNDk5LDkgKzEyNjEsNiBAQAogCXR0eV9zZXRfb3BlcmF0aW9ucyhwY19pbmZvLCAmaW5mb19vcHMpOwogCiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQogCWZvciAoY3JkID0gMDsgY3JkIDwgbnVtX2NhcmRzOyBjcmQrKykgCiAJeyAvKiBCZWdpbiBmb3IgZWFjaCBjYXJkICovCiAKQEAgLTE2MTAsMTEgKzEzNjksNyBAQAogCQkJCQlpZiAoKGJvYXJkX2lkICYgMHgzMCkgPT0gMHgzMCkgCiAJCQkJCQliZC0+bWVtb3J5X3NlZyA9IDB4ODAwMDsKIAotCQkJCX0gLyogRW5kIGl0IGlzIGFuIFhJIGNhcmQgKi8KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBCb2FyZCBhdCAweCV4IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFuIFhJXG4iLChpbnQpYmQtPnBvcnQpOwotCQkJCX0KKwkJCQl9IGVsc2UgcHJpbnRrKEtFUk5fRVJSICJlcGNhOiBCb2FyZCBhdCAweCV4IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFuIFhJXG4iLChpbnQpYmQtPnBvcnQpOwogCQkJYnJlYWs7CiAKIAkJfSAvKiBFbmQgc3dpdGNoIG9uIGJkLT50eXBlICovCkBAIC0xNjM0LDkgKzEzODksNiBAQAogCWluaXRfdGltZXIoJmVwY2FfdGltZXIpOwogCWVwY2FfdGltZXIuZnVuY3Rpb24gPSBlcGNhcG9sbDsKIAltb2RfdGltZXIoJmVwY2FfdGltZXIsIGppZmZpZXMgKyBIWi8yNSk7Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQogCXJldHVybiAwOwogCiB9IC8qIEVuZCBwY19pbml0ICovCkBAIC0xNjQ3LDEwICsxMzk5LDEwIEBACiB7IC8qIEJlZ2luIHBvc3RfZmVwX2luaXQgKi8KIAogCWludCBpOwotCXVuY2hhciAqbWVtYWRkcjsKLQl2b2xhdGlsZSBzdHJ1Y3QgZ2xvYmFsX2RhdGEgKmdkOworCXVuc2lnbmVkIGNoYXIgKm1lbWFkZHI7CisJc3RydWN0IGdsb2JhbF9kYXRhICpnZDsKIAlzdHJ1Y3QgYm9hcmRfaW5mbyAqYmQ7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7IAogCWludCBzaHJpbmttZW0gPSAwLCBsb3d3YXRlciA7IAogIApAQCAtMTY2OSw5ICsxNDIxLDcgQEAKIAkJYWZ0ZXIgRElHSV9JTklUIGhhcyBiZWVuIGNhbGxlZCB3aWxsIHJldHVybiB0aGUgcHJvcGVyIHZhbHVlcy4gCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0JaWYgKGJkLT50eXBlID49IFBDSVhFTSkgLyogSWYgdGhlIGJvYXJkIGluIHF1ZXN0aW9uIGlzIFBDSSAqLwotCXsgLyogQmVnaW4gZ2V0IFBDSSBudW1iZXIgb2YgcG9ydHMgKi8KLQorCWlmIChiZC0+dHlwZSA+PSBQQ0lYRU0pIHsgLyogQmVnaW4gZ2V0IFBDSSBudW1iZXIgb2YgcG9ydHMgKi8KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUJlbG93IHdlIHVzZSBYRU1QT1JUUyBhcyBhIG1lbW9yeSBvZmZzZXQgcmVnYXJkbGVzcyBvZiB3aGljaCBQQ0kKIAkJCWNhcmQgaXQgaXMuICBUaGlzIGlzIGJlY2F1c2UgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgUENJIGNhcmRzIGhhdmUKQEAgLTE2ODUsMTUgKzE0MzUsMTUgQEAKIAkJCShGWUkgLSBUaGUgaWQgc2hvdWxkIGJlIGxvY2F0ZWQgYXQgMHgxYWMgKEFuZCBtYXkgdXNlIHVwIHRvIDQgYnl0ZXMKIAkJCWlmIHRoZSBib3ggaW4gcXVlc3Rpb24gaXMgYSBYRU0gb3IgQ1gpKS4gIAogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCi0KLQkJYmQtPm51bXBvcnRzID0gKHVuc2lnbmVkIHNob3J0KSoodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZC0+cmVfbWFwX21lbWJhc2UgKyBYRU1QT1JUUykpOwotCi0JCQorCQkvKiBQQ0kgY2FyZHMgYXJlIGFscmVhZHkgcmVtYXBwZWQgYXQgdGhpcyBwb2ludCBJU0EgYXJlIG5vdCAqLworCQliZC0+bnVtcG9ydHMgPSByZWFkdyhiZC0+cmVfbWFwX21lbWJhc2UgKyBYRU1QT1JUUyk7CiAJCWVwY2Fhc3NlcnQoYmQtPm51bXBvcnRzIDw9IDY0LCJQQ0kgcmV0dXJuZWQgYSBpbnZhbGlkIG51bWJlciBvZiBwb3J0cyIpOwogCQluYmRldnMgKz0gKGJkLT5udW1wb3J0cyk7Ci0KLQl9IC8qIEVuZCBnZXQgUENJIG51bWJlciBvZiBwb3J0cyAqLworCX0gZWxzZSB7CisJCS8qIEZpeCB1cCB0aGUgbWFwcGluZ3MgZm9yIElTQS9FSVNBIGV0YyAqLworCQkvKiBGSVhNRTogNjRLIC0gY2FuIHdlIGJlIHNtYXJ0ZXIgPyAqLworCQliZC0+cmVfbWFwX21lbWJhc2UgPSBpb3JlbWFwKGJkLT5tZW1iYXNlLCAweDEwMDAwKTsKKwl9CiAKIAlpZiAoY3JkICE9IDApCiAJCWNhcmRfcHRyW2NyZF0gPSBjYXJkX3B0cltjcmQtMV0gKyBib2FyZHNbY3JkLTFdLm51bXBvcnRzOwpAQCAtMTcwMSwxOSArMTQ1MSw5IEBACiAJCWNhcmRfcHRyW2NyZF0gPSAmZGlnaV9jaGFubmVsc1tjcmRdOyAvKiA8LSBGb3IgY2FyZCAwIG9ubHkgKi8KIAogCWNoID0gY2FyZF9wdHJbY3JkXTsKLQotCiAJZXBjYWFzc2VydChjaCA8PSAmZGlnaV9jaGFubmVsc1tuYmRldnMgLSAxXSwgImNoIG91dCBvZiByYW5nZSIpOwogCi0JbWVtYWRkciA9ICh1bmNoYXIgKiliZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQkvKiAKLQkgICBUaGUgYmVsb3cgY29tbWFuZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBuZXdlciBrZXJuZWxzICgyLjEueCBhbmQKLQkgICB1cCkgZG8gbm90IGhhdmUgYSAxOjEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLiAgVGhlIGJlbG93Ci0JICAgY2FsbCBhZGp1c3QgZm9yIHRoYXQuCi0JKi8KLQotCW1lbWFkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW1lbWFkZHIpOworCW1lbWFkZHIgPSBiZC0+cmVfbWFwX21lbWJhc2U7CiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlUaGUgYmVsb3cgYXNzaWdubWVudCB3aWxsIHNldCBiYyB0byBwb2ludCBhdCB0aGUgQkVHSU5JTkcgb2YKQEAgLTE3MjEsNyArMTQ2MSw3IEBACiAJCTggYW5kIDY0IG9mIHRoZXNlIHN0cnVjdHVyZXMuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCWJjID0gKHZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICopKCh1bG9uZyltZW1hZGRyICsgQ0hBTlNUUlVDVCk7CisJYmMgPSAoc3RydWN0IGJvYXJkX2NoYW4gKikobWVtYWRkciArIENIQU5TVFJVQ1QpOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlUaGUgYmVsb3cgYXNzaWdubWVudCB3aWxsIHNldCBnZCB0byBwb2ludCBhdCB0aGUgQkVHSU5JTkcgb2YKQEAgLTE3MzAsMjAgKzE0NzAsMTggQEAKIAkJcG9pbnRlciBiZWdpbnMgYXQgMHhkMTAuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0JZ2QgPSAodm9sYXRpbGUgc3RydWN0IGdsb2JhbF9kYXRhICopKCh1bG9uZyltZW1hZGRyICsgR0xPQkFMKTsKKwlnZCA9IChzdHJ1Y3QgZ2xvYmFsX2RhdGEgKikobWVtYWRkciArIEdMT0JBTCk7CiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlYRVBPUlRTIChhZGRyZXNzIDB4YzIyKSBwb2ludHMgYXQgdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGUKIAkJY2FyZCBzdXBwb3J0cy4gKEZvciA2NFhFLCBYSSwgWEVNLCBhbmQgWFIgdXNlIDB4YzAyKQogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQlpZiAoKChiZC0+dHlwZSA9PSBQQ1hFVkUpIHwgKGJkLT50eXBlID09IFBDWEUpKSAmJgotCSAgICAoKih1c2hvcnQgKikoKHVsb25nKW1lbWFkZHIgKyBYRVBPUlRTKSA8IDMpKQorCWlmICgoYmQtPnR5cGUgPT0gUENYRVZFIHx8IGJkLT50eXBlID09IFBDWEUpICYmIChyZWFkdyhtZW1hZGRyICsgWEVQT1JUUykgPCAzKSkKIAkJc2hyaW5rbWVtID0gMTsKIAlpZiAoYmQtPnR5cGUgPCBQQ0lYRU0pCiAJCWlmICghcmVxdWVzdF9yZWdpb24oKGludCliZC0+cG9ydCwgNCwgYm9hcmRfZGVzY1tiZC0+dHlwZV0pKQogCQkJcmV0dXJuOwkJCi0KIAltZW13aW5vbihiZCwgMCk7CiAKIAkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3NTMsMTcgKzE0OTEsMTYgQEAKIAogCS8qIEZvciBldmVyeSBwb3J0IG9uIHRoZSBjYXJkIGRvIC4uLi4uICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm51bXBvcnRzOyBpKyssIGNoKyssIGJjKyspIAotCXsgLyogQmVnaW4gZm9yIGVhY2ggcG9ydCAqLworCWZvciAoaSA9IDA7IGkgPCBiZC0+bnVtcG9ydHM7IGkrKywgY2grKywgYmMrKykgIHsgLyogQmVnaW4gZm9yIGVhY2ggcG9ydCAqLworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWNoLT5icmRjaGFuICAgICAgICA9IGJjOwogCQljaC0+bWFpbGJveCAgICAgICAgPSBnZDsgCiAJCUlOSVRfV09SSygmY2gtPnRxdWV1ZSwgZG9fc29mdGludCwgY2gpOwogCQljaC0+Ym9hcmQgICAgICAgICAgPSAmYm9hcmRzW2NyZF07CiAKLQkJc3dpdGNoIChiZC0+dHlwZSkKLQkJeyAvKiBCZWdpbiBzd2l0Y2ggYmQtPnR5cGUgKi8KLQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CisJCXN3aXRjaCAoYmQtPnR5cGUpIHsKIAkJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlTaW5jZSBzb21lIG9mIHRoZSBib2FyZHMgdXNlIGRpZmZlcmVudCBiaXRtYXBzIGZvciB0aGVpcgogCQkJCWNvbnRyb2wgc2lnbmFscyB3ZSBjYW5ub3QgaGFyZCBjb2RlIHRoZXNlIHZhbHVlcyBhbmQgcmV0YWluCkBAIC0xNzk2LDE0ICsxNTMzLDEyIEBACiAJCiAJCX0gLyogRW5kIHN3aXRjaCBiZC0+dHlwZSAqLwogCi0JCWlmIChib2FyZHNbY3JkXS5hbHRwaW4pIAotCQl7CisJCWlmIChib2FyZHNbY3JkXS5hbHRwaW4pIHsKIAkJCWNoLT5kc3IgPSBjaC0+bV9kY2Q7CiAJCQljaC0+ZGNkID0gY2gtPm1fZHNyOwogCQkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSBESUdJX0FMVFBJTjsKIAkJfQotCQllbHNlIAotCQl7IAorCQllbHNlIHsKIAkJCWNoLT5kY2QgPSBjaC0+bV9kY2Q7CiAJCQljaC0+ZHNyID0gY2gtPm1fZHNyOwogCQl9CkBAIC0xODEzLDE0ICsxNTQ4LDEyIEBACiAJCWNoLT5tYWdpYyAgICAgID0gRVBDQV9NQUdJQzsKIAkJY2gtPnR0eSAgICAgICAgPSBOVUxMOwogCi0JCWlmIChzaHJpbmttZW0pIAotCQl7CisJCWlmIChzaHJpbmttZW0pIHsKIAkJCWZlcGNtZChjaCwgU0VUQlVGRkVSLCAzMiwgMCwgMCwgMCk7CiAJCQlzaHJpbmttZW0gPSAwOwogCQl9CiAKLQkJc3dpdGNoIChiZC0+dHlwZSkKLQkJeyAvKiBCZWdpbiBzd2l0Y2ggYmQtPnR5cGUgKi8KKwkJc3dpdGNoIChiZC0+dHlwZSkgewogCiAJCQljYXNlIFBDSVhFTToKIAkJCWNhc2UgUENJWFJKOgpAQCAtMTg3OCwxMyArMTYxMSwxMyBAQAogCiAJCWZlcGNtZChjaCwgU1JYSFdBVEVSLCAoMyAqIGNoLT5yeGJ1ZnNpemUgLyA0KSwgMCwgMTAsIDApOwogCi0JCWJjLT5lZGVsYXkgPSAxMDA7Ci0JCWJjLT5pZGF0YSA9IDE7CisJCXdyaXRldygxMDAsICZiYy0+ZWRlbGF5KTsKKwkJd3JpdGViKDEsICZiYy0+aWRhdGEpOwogCQotCQljaC0+c3RhcnRjICA9IGJjLT5zdGFydGM7Ci0JCWNoLT5zdG9wYyAgID0gYmMtPnN0b3BjOwotCQljaC0+c3RhcnRjYSA9IGJjLT5zdGFydGNhOwotCQljaC0+c3RvcGNhICA9IGJjLT5zdG9wY2E7CisJCWNoLT5zdGFydGMgID0gcmVhZGIoJmJjLT5zdGFydGMpOworCQljaC0+c3RvcGMgICA9IHJlYWRiKCZiYy0+c3RvcGMpOworCQljaC0+c3RhcnRjYSA9IHJlYWRiKCZiYy0+c3RhcnRjYSk7CisJCWNoLT5zdG9wY2EgID0gcmVhZGIoJmJjLT5zdG9wY2EpOwogCQogCQljaC0+ZmVwY2ZsYWcgPSAwOwogCQljaC0+ZmVwaWZsYWcgPSAwOwpAQCAtMTg5OSwyNyArMTYzMiwyMyBAQAogCQljaC0+YmxvY2tlZF9vcGVuID0gMDsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPm9wZW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jbG9zZV93YWl0KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwogCQljaC0+dG1wX2J1ZiA9IGttYWxsb2MoY2gtPnR4YnVmc2l6ZSxHRlBfS0VSTkVMKTsKLQkJaWYgKCEoY2gtPnRtcF9idWYpKQotCQl7CisJCWlmICghY2gtPnRtcF9idWYpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiUE9TVCBGRVAgSU5JVCA6IGttYWxsb2MgZmFpbGVkIGZvciBwb3J0IDB4JXhcbiIsaSk7CiAJCQlyZWxlYXNlX3JlZ2lvbigoaW50KWJkLT5wb3J0LCA0KTsKIAkJCXdoaWxlKGktLSA+IDApCiAJCQkJa2ZyZWUoKGNoLS0pLT50bXBfYnVmKTsKIAkJCXJldHVybjsKLQkJfQotCQllbHNlIAorCQl9IGVsc2UKIAkJCW1lbXNldCgodm9pZCAqKWNoLT50bXBfYnVmLDAsY2gtPnR4YnVmc2l6ZSk7CiAJfSAvKiBFbmQgZm9yIGVhY2ggcG9ydCAqLwogCiAJcHJpbnRrKEtFUk5fSU5GTyAKIAkgICAgICAgICJEaWdpIFBDL1h4IERyaXZlciBWJXM6ICAlcyBJL08gPSAweCVseCBNZW0gPSAweCVseCBQb3J0cyA9ICVkXG4iLCAKIAkgICAgICAgIFZFUlNJT04sIGJvYXJkX2Rlc2NbYmQtPnR5cGVdLCAobG9uZyliZC0+cG9ydCwgKGxvbmcpYmQtPm1lbWJhc2UsIGJkLT5udW1wb3J0cyk7Ci0Jc3ByaW50ZihtZXNnLCAKLQkgICAgICAgICJEaWdpIFBDL1h4IERyaXZlciBWJXM6ICAlcyBJL08gPSAweCVseCBNZW0gPSAweCVseCBQb3J0cyA9ICVkXG4iLCAKLQkgICAgICAgIFZFUlNJT04sIGJvYXJkX2Rlc2NbYmQtPnR5cGVdLCAobG9uZyliZC0+cG9ydCwgKGxvbmcpYmQtPm1lbWJhc2UsIGJkLT5udW1wb3J0cyk7Ci0JY29uc29sZV9wcmludChtZXNnKTsKLQogCW1lbXdpbm9mZihiZCwgMCk7CiAKIH0gLyogRW5kIHBvc3RfZmVwX2luaXQgKi8KQEAgLTE5NDMsOSArMTY3Miw2IEBACiAJCWJ1ZmZlciBlbXB0eSkgYW5kIGFjdHMgb24gdGhvc2UgZXZlbnRzLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KIAlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAogCXsgLyogQmVnaW4gZm9yIGVhY2ggY2FyZCAqLwogCkBAIC0xOTYxLDYgKzE2ODcsOCBAQAogCQkJc29tZSBsZWdhY3kgYm9hcmRzLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOworCiAJCWFzc2VydG1lbW9mZihjaCk7CiAKIAkJZ2xvYmFsd2lub24oY2gpOwpAQCAtMTk3MCwyMSArMTY5OCwxOSBAQAogCQkJdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgcXVldWUuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCQloZWFkID0gY2gtPm1haWxib3gtPmVpbjsKLQkJdGFpbCA9IGNoLT5tYWlsYm94LT5lb3V0OworCQloZWFkID0gcmVhZHcoJmNoLT5tYWlsYm94LT5laW4pOworCQl0YWlsID0gcmVhZHcoJmNoLT5tYWlsYm94LT5lb3V0KTsKIAkJCiAJCS8qIElmIGhlYWQgaXNuJ3QgZXF1YWwgdG8gdGFpbCB3ZSBoYXZlIGFuIGV2ZW50ICovCiAKIAkJaWYgKGhlYWQgIT0gdGFpbCkKIAkJCWRvZXZlbnQoY3JkKTsKLQogCQltZW1vZmYoY2gpOwogCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOworCiAJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLwotCiAJbW9kX3RpbWVyKCZlcGNhX3RpbWVyLCBqaWZmaWVzICsgKEhaIC8gMjUpKTsKLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwogfSAvKiBFbmQgZXBjYXBvbGwgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGRvZXZlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTk5Miw1MyArMTcxOCw0MiBAQAogc3RhdGljIHZvaWQgZG9ldmVudChpbnQgY3JkKQogeyAvKiBCZWdpbiBkb2V2ZW50ICovCiAKLQl2b2xhdGlsZSB1bmNoYXIgKmV2ZW50YnVmOworCXZvaWQgKmV2ZW50YnVmOwogCXN0cnVjdCBjaGFubmVsICpjaCwgKmNoYW4wOwogCXN0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9pbmZvICpiZDsKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7Ci0JcmVnaXN0ZXIgdm9sYXRpbGUgdW5zaWduZWQgaW50IHRhaWwsIGhlYWQ7Ci0JcmVnaXN0ZXIgaW50IGV2ZW50LCBjaGFubmVsOwotCXJlZ2lzdGVyIGludCBtc3RhdCwgbHN0YXQ7CisJc3RydWN0IGJvYXJkX2luZm8gKmJkOworCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwl1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKKwlpbnQgZXZlbnQsIGNoYW5uZWw7CisJaW50IG1zdGF0LCBsc3RhdDsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJVGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCBieSBlcGNhcG9sbCB3aGVuIGFuIGV2ZW50IGlzIGRldGVjdGVkIAogCQlpbiB0aGUgZXZlbnQgcXVldWUuICBUaGlzIHJvdXRpbmUgcmVzcG9uZHMgdG8gdGhvc2UgZXZlbnRzLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJYmQgPSAmYm9hcmRzW2NyZF07CiAKIAljaGFuMCA9IGNhcmRfcHRyW2NyZF07CiAJZXBjYWFzc2VydChjaGFuMCA8PSAmZGlnaV9jaGFubmVsc1tuYmRldnMgLSAxXSwgImNoIG91dCBvZiByYW5nZSIpOwotCiAJYXNzZXJ0Z3dpbm9uKGNoYW4wKTsKLQotCXdoaWxlICgodGFpbCA9IGNoYW4wLT5tYWlsYm94LT5lb3V0KSAhPSAoaGVhZCA9IGNoYW4wLT5tYWlsYm94LT5laW4pKSAKKwl3aGlsZSAoKHRhaWwgPSByZWFkdygmY2hhbjAtPm1haWxib3gtPmVvdXQpKSAhPSAoaGVhZCA9IHJlYWR3KCZjaGFuMC0+bWFpbGJveC0+ZWluKSkpCiAJeyAvKiBCZWdpbiB3aGlsZSBzb21ldGhpbmcgaW4gZXZlbnQgcXVldWUgKi8KLQogCQlhc3NlcnRnd2lub24oY2hhbjApOwotCi0JCWV2ZW50YnVmID0gKHZvbGF0aWxlIHVuY2hhciAqKWJ1c190b192aXJ0KCh1bG9uZykoYmQtPnJlX21hcF9tZW1iYXNlICsgdGFpbCArIElTVEFSVCkpOwotCisJCWV2ZW50YnVmID0gYmQtPnJlX21hcF9tZW1iYXNlICsgdGFpbCArIElTVEFSVDsKIAkJLyogR2V0IHRoZSBjaGFubmVsIHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLwotCQljaGFubmVsID0gZXZlbnRidWZbMF07Ci0KKwkJY2hhbm5lbCA9IHJlYWRiKGV2ZW50YnVmKTsKIAkJLyogR2V0IHRoZSBhY3R1YWwgZXZlbnQgY29kZSB0aGF0IG9jY3VycmVkICovCi0JCWV2ZW50ID0gZXZlbnRidWZbMV07Ci0KKwkJZXZlbnQgPSByZWFkYihldmVudGJ1ZiArIDEpOwogCQkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJVGhlIHR3byBhc3NpZ25tZW50cyBiZWxvdyBnZXQgdGhlIGN1cnJlbnQgbW9kZW0gc3RhdHVzIChtc3RhdCkKIAkJCWFuZCB0aGUgcHJldmlvdXMgbW9kZW0gc3RhdHVzIChsc3RhdCkuICBUaGVzZSBhcmUgdXNlZnVsIGJlY3Vhc2UKIAkJCWFuIGV2ZW50IGNvdWxkIHNpZ25hbCBhIGNoYW5nZSBpbiBtb2RlbSBzaWduYWxzIGl0c2VsZi4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JCW1zdGF0ID0gZXZlbnRidWZbMl07Ci0JCWxzdGF0ID0gZXZlbnRidWZbM107CisJCW1zdGF0ID0gcmVhZGIoZXZlbnRidWYgKyAyKTsKKwkJbHN0YXQgPSByZWFkYihldmVudGJ1ZiArIDMpOwogCiAJCWNoID0gY2hhbjAgKyBjaGFubmVsOwotCi0JCWlmICgodW5zaWduZWQpY2hhbm5lbCA+PSBiZC0+bnVtcG9ydHMgfHwgIWNoKSAKLQkJeyAKKwkJaWYgKCh1bnNpZ25lZCljaGFubmVsID49IGJkLT5udW1wb3J0cyB8fCAhY2gpICB7CiAJCQlpZiAoY2hhbm5lbCA+PSBiZC0+bnVtcG9ydHMpCiAJCQkJY2ggPSBjaGFuMDsKIAkJCWJjID0gY2gtPmJyZGNoYW47CkBAIC0yMDQ4LDk3ICsxNzYzLDUzIEBACiAJCWlmICgoYmMgPSBjaC0+YnJkY2hhbikgPT0gTlVMTCkKIAkJCWdvdG8gbmV4dDsKIAotCQlpZiAoZXZlbnQgJiBEQVRBX0lORCkgCi0JCXsgLyogQmVnaW4gREFUQV9JTkQgKi8KLQorCQlpZiAoZXZlbnQgJiBEQVRBX0lORCkgIHsgLyogQmVnaW4gREFUQV9JTkQgKi8KIAkJCXJlY2VpdmVfZGF0YShjaCk7CiAJCQlhc3NlcnRnd2lub24oY2gpOwotCiAJCX0gLyogRW5kIERBVEFfSU5EICovCiAJCS8qIGVsc2UgKi8vKiBGaXggZm9yIERDRCB0cmFuc2l0aW9uIG1pc3NlZCBidWcgKi8KLQkJaWYgKGV2ZW50ICYgTU9ERU1DSEdfSU5EKSAKLQkJeyAvKiBCZWdpbiBNT0RFTUNIR19JTkQgKi8KLQorCQlpZiAoZXZlbnQgJiBNT0RFTUNIR19JTkQpICB7IC8qIEJlZ2luIE1PREVNQ0hHX0lORCAqLwogCQkJLyogQSBtb2RlbSBzaWduYWwgY2hhbmdlIGhhcyBiZWVuIGluZGljYXRlZCAqLwotCiAJCQljaC0+aW1vZGVtID0gbXN0YXQ7Ci0KLQkJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAKLQkJCXsKKwkJCWlmIChjaC0+YXN5bmNmbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAgewogCQkJCWlmIChtc3RhdCAmIGNoLT5kY2QpICAvKiBXZSBhcmUgbm93IHJlY2VpdmluZyBkY2QgKi8KIAkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKIAkJCQllbHNlCiAJCQkJCXBjX3NjaGVkX2V2ZW50KGNoLCBFUENBX0VWRU5UX0hBTkdVUCk7IC8qIE5vIGRjZDsgaGFuZ3VwICovCiAJCQl9Ci0KIAkJfSAvKiBFbmQgTU9ERU1DSEdfSU5EICovCi0KIAkJdHR5ID0gY2gtPnR0eTsKLQkJaWYgKHR0eSkgCi0JCXsgLyogQmVnaW4gaWYgdmFsaWQgdHR5ICovCi0KLQkJCWlmIChldmVudCAmIEJSRUFLX0lORCkgCi0JCQl7IC8qIEJlZ2luIGlmIEJSRUFLX0lORCAqLwotCisJCWlmICh0dHkpICB7IC8qIEJlZ2luIGlmIHZhbGlkIHR0eSAqLworCQkJaWYgKGV2ZW50ICYgQlJFQUtfSU5EKSAgeyAvKiBCZWdpbiBpZiBCUkVBS19JTkQgKi8KIAkJCQkvKiBBIGJyZWFrIGhhcyBiZWVuIGluZGljYXRlZCAqLwotCiAJCQkJdHR5LT5mbGlwLmNvdW50Kys7CiAJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKLQogCQkJCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOwotCiAJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsgCi0KLQkJCX0gLyogRW5kIGlmIEJSRUFLX0lORCAqLwotCQkJZWxzZQotCQkJaWYgKGV2ZW50ICYgTE9XVFhfSU5EKSAKLQkJCXsgLyogQmVnaW4gTE9XVFhfSU5EICovCi0KKwkJCX0gZWxzZSBpZiAoZXZlbnQgJiBMT1dUWF9JTkQpICB7IC8qIEJlZ2luIExPV1RYX0lORCAqLwogCQkJCWlmIChjaC0+c3RhdHVzZmxhZ3MgJiBMT1dXQUlUKSAKIAkJCQl7IC8qIEJlZ2luIGlmIExPV1dBSVQgKi8KLQogCQkJCQljaC0+c3RhdHVzZmxhZ3MgJj0gfkxPV1dBSVQ7CiAJCQkJCXR0eV93YWtldXAodHR5KTsKIAkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOwotCiAJCQkJfSAvKiBFbmQgaWYgTE9XV0FJVCAqLwotCi0JCQl9IC8qIEVuZCBMT1dUWF9JTkQgKi8KLQkJCWVsc2UKLQkJCWlmIChldmVudCAmIEVNUFRZVFhfSU5EKSAKLQkJCXsgLyogQmVnaW4gRU1QVFlUWF9JTkQgKi8KLQorCQkJfSBlbHNlIGlmIChldmVudCAmIEVNUFRZVFhfSU5EKSAgeyAvKiBCZWdpbiBFTVBUWVRYX0lORCAqLwogCQkJCS8qIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHNldHVwX2VtcHR5X2V2ZW50ICovCi0KIAkJCQljaC0+c3RhdHVzZmxhZ3MgJj0gflRYQlVTWTsKLQkJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgRU1QVFlXQUlUKSAKLQkJCQl7IC8qIEJlZ2luIGlmIEVNUFRZV0FJVCAqLwotCisJCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkgIHsgLyogQmVnaW4gaWYgRU1QVFlXQUlUICovCiAJCQkJCWNoLT5zdGF0dXNmbGFncyAmPSB+RU1QVFlXQUlUOwogCQkJCQl0dHlfd2FrZXVwKHR0eSk7Ci0KIAkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOwotCiAJCQkJfSAvKiBFbmQgaWYgRU1QVFlXQUlUICovCi0KIAkJCX0gLyogRW5kIEVNUFRZVFhfSU5EICovCi0KIAkJfSAvKiBFbmQgaWYgdmFsaWQgdHR5ICovCi0KLQogCW5leHQ6CiAJCWdsb2JhbHdpbm9uKGNoKTsKLQotCQlpZiAoIWJjKQotCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gYmMgPT0gTlVMTCBpbiBkb2V2ZW50IVxuIik7Ci0JCWVsc2UgCi0JCQliYy0+aWRhdGEgPSAxOwotCi0JCWNoYW4wLT5tYWlsYm94LT5lb3V0ID0gKHRhaWwgKyA0KSAmIChJTUFYIC0gSVNUQVJUIC0gNCk7CisJCUJVR19PTighYmMpOworCQl3cml0ZXcoMSwgJmJjLT5pZGF0YSk7CisJCXdyaXRldygodGFpbCArIDQpICYgKElNQVggLSBJU1RBUlQgLSA0KSwgJmNoYW4wLT5tYWlsYm94LT5lb3V0KTsKIAkJZ2xvYmFsd2lub24oY2hhbjApOwotCiAJfSAvKiBFbmQgd2hpbGUgc29tZXRoaW5nIGluIGV2ZW50IHF1ZXVlICovCi0KIH0gLyogRW5kIGRvZXZlbnQgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGZlcGNtZCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMTQ2LDcgKzE4MTcsNiBAQAogc3RhdGljIHZvaWQgZmVwY21kKHN0cnVjdCBjaGFubmVsICpjaCwgaW50IGNtZCwgaW50IHdvcmRfb3JfYnl0ZSwKICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZTIsIGludCBuY21kcywgaW50IGJ5dGVjbWQpCiB7IC8qIEJlZ2luIGZlcGNtZCAqLwotCiAJdW5jaGFyICptZW1hZGRyOwogCXVuc2lnbmVkIGludCBoZWFkLCBjbWRUYWlsLCBjbWRTdGFydCwgY21kTWF4OwogCWxvbmcgY291bnQ7CkBAIC0yMTU1LDkzICsxODI1LDU3IEBACiAJLyogVGhpcyBpcyB0aGUgcm91dGluZSBpbiB3aGljaCBjb21tYW5kcyBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYXJkLiAqLwogCiAJaWYgKGNoLT5ib2FyZC0+c3RhdHVzID09IERJU0FCTEVEKQotCXsKIAkJcmV0dXJuOwotCX0KLQogCWFzc2VydGd3aW5vbihjaCk7Ci0KIAkvKiBSZW1lbWJlciBoZWFkIChBcyB3ZWxsIGFzIG1heCkgaXMganVzdCBhbiBvZmZzZXQgbm90IGEgYmFzZSBhZGRyICovCi0JaGVhZCA9IGNoLT5tYWlsYm94LT5jaW47Ci0KKwloZWFkID0gcmVhZHcoJmNoLT5tYWlsYm94LT5jaW4pOwogCS8qIGNtZFN0YXJ0IGlzIGEgYmFzZSBhZGRyZXNzICovCi0JY21kU3RhcnQgPSBjaC0+bWFpbGJveC0+Y3N0YXJ0OwotCisJY21kU3RhcnQgPSByZWFkdygmY2gtPm1haWxib3gtPmNzdGFydCk7CiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVdlIGRvIHRoZSBhZGRpdGlvbiBiZWxvdyBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IGEgbWF4IHBvaW50ZXIgCiAJCXJlbGF0aXZlIHRvIGNtZFN0YXJ0LiAgV2Ugd2FudCBhIG1heCBwb2ludGVyIHRoYXQgcG9pbnRzIGF0IHRoZSAKIAkJcGh5c2ljYWwgZW5kIG9mIHRoZSBjb21tYW5kIHF1ZXVlLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQljbWRNYXggPSAoY21kU3RhcnQgKyA0ICsgKGNoLT5tYWlsYm94LT5jbWF4KSk7Ci0KKwljbWRNYXggPSAoY21kU3RhcnQgKyA0ICsgcmVhZHcoJmNoLT5tYWlsYm94LT5jbWF4KSk7CiAJbWVtYWRkciA9IGNoLT5ib2FyZC0+cmVfbWFwX21lbWJhc2U7CiAKLQkvKiAKLQkgICBUaGUgYmVsb3cgY29tbWFuZCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBuZXdlciBrZXJuZWxzICgyLjEueCBhbmQKLQkgICB1cCkgZG8gbm90IGhhdmUgYSAxOjEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLiAgVGhlIGJlbG93Ci0JICAgY2FsbCBhZGp1c3QgZm9yIHRoYXQuCi0JKi8KLQotCW1lbWFkZHIgPSAodW5zaWduZWQgY2hhciAqKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW1lbWFkZHIpOwotCi0JaWYgKGhlYWQgPj0gKGNtZE1heCAtIGNtZFN0YXJ0KSB8fCAoaGVhZCAmIDAzKSkgCi0JewotCQlwcmludGsoS0VSTl9FUlIgImxpbmUgJWQ6IE91dCBvZiByYW5nZSwgY21kID0gJXgsIGhlYWQgPSAleFxuIiwgX19MSU5FX18sIAotICAgICAgICAgICAgICBjbWQsIGhlYWQpOwotCQlwcmludGsoS0VSTl9FUlIgImxpbmUgJWQ6IE91dCBvZiByYW5nZSwgY21kTWF4ID0gJXgsIGNtZFN0YXJ0ID0gJXhcbiIsIF9fTElORV9fLCAKLSAgICAgICAgICAgICAgY21kTWF4LCBjbWRTdGFydCk7CisJaWYgKGhlYWQgPj0gKGNtZE1heCAtIGNtZFN0YXJ0KSB8fCAoaGVhZCAmIDAzKSkgIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaW5lICVkOiBPdXQgb2YgcmFuZ2UsIGNtZCA9ICV4LCBoZWFkID0gJXhcbiIsIF9fTElORV9fLCAgY21kLCBoZWFkKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaW5lICVkOiBPdXQgb2YgcmFuZ2UsIGNtZE1heCA9ICV4LCBjbWRTdGFydCA9ICV4XG4iLCBfX0xJTkVfXywgIGNtZE1heCwgY21kU3RhcnQpOwogCQlyZXR1cm47CiAJfQotCi0JaWYgKGJ5dGVjbWQpIAotCXsKLQkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDApID0gKHVuY2hhciljbWQ7Ci0KLQkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDEpID0gKHVuY2hhciljaC0+Y2hhbm5lbG51bTsKKwlpZiAoYnl0ZWNtZCkgIHsKKwkJd3JpdGViKGNtZCwgbWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDApOworCQl3cml0ZWIoY2gtPmNoYW5uZWxudW0sICBtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMSk7CiAJCS8qIEJlbG93IHdvcmRfb3JfYnl0ZSBpcyBiaXRzIHRvIHNldCAqLwotCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMikgPSAodW5jaGFyKXdvcmRfb3JfYnl0ZTsKKwkJd3JpdGViKHdvcmRfb3JfYnl0ZSwgIG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAyKTsKIAkJLyogQmVsb3cgYnl0ZTIgaXMgYml0cyB0byByZXNldCAqLwotCQkqKHZvbGF0aWxlIHVuY2hhciAqKShtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMykgPSAodW5jaGFyKWJ5dGUyOwotCi0JfSAKLQllbHNlIAotCXsKLQkJKih2b2xhdGlsZSB1bmNoYXIgKikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDApID0gKHVuY2hhciljbWQ7Ci0JCSoodm9sYXRpbGUgdW5jaGFyICopKG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAxKSA9ICh1bmNoYXIpY2gtPmNoYW5uZWxudW07Ci0JCSoodm9sYXRpbGUgdXNob3J0KikobWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDIpID0gKHVzaG9ydCl3b3JkX29yX2J5dGU7CisJCXdyaXRlYihieXRlMiwgbWVtYWRkciArIGhlYWQgKyBjbWRTdGFydCArIDMpOworCX0gIGVsc2UgeworCQl3cml0ZWIoY21kLCBtZW1hZGRyICsgaGVhZCArIGNtZFN0YXJ0ICsgMCk7CisJCXdyaXRlYihjaC0+Y2hhbm5lbG51bSwgIG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAxKTsKKwkJd3JpdGViKHdvcmRfb3JfYnl0ZSwgIG1lbWFkZHIgKyBoZWFkICsgY21kU3RhcnQgKyAyKTsKIAl9Ci0KIAloZWFkID0gKGhlYWQgKyA0KSAmIChjbWRNYXggLSBjbWRTdGFydCAtIDQpOwotCWNoLT5tYWlsYm94LT5jaW4gPSBoZWFkOwotCisJd3JpdGV3KGhlYWQsICZjaC0+bWFpbGJveC0+Y2luKTsKIAljb3VudCA9IEZFUFRJTUVPVVQ7CiAKLQlmb3IgKDs7KSAKLQl7IC8qIEJlZ2luIGZvcmV2ZXIgbG9vcCAqLwotCisJZm9yICg7OykgIHsgLyogQmVnaW4gZm9yZXZlciBsb29wICovCiAJCWNvdW50LS07Ci0JCWlmIChjb3VudCA9PSAwKSAKLQkJeworCQlpZiAoY291bnQgPT0gMCkgIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIEZlcCBub3QgcmVzcG9uZGluZyBpbiBmZXBjbWQoKVxuIik7CiAJCQlyZXR1cm47CiAJCX0KLQotCQloZWFkID0gY2gtPm1haWxib3gtPmNpbjsKLQkJY21kVGFpbCA9IGNoLT5tYWlsYm94LT5jb3V0OwotCisJCWhlYWQgPSByZWFkdygmY2gtPm1haWxib3gtPmNpbik7CisJCWNtZFRhaWwgPSByZWFkdygmY2gtPm1haWxib3gtPmNvdXQpOwogCQluID0gKGhlYWQgLSBjbWRUYWlsKSAmIChjbWRNYXggLSBjbWRTdGFydCAtIDQpOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUJhc2ljYWxseSB0aGlzIHdpbGwgYnJlYWsgd2hlbiB0aGUgRkVQIGFja25vd2xlZGdlcyB0aGUgCiAJCQljb21tYW5kIGJ5IGluY3JlbWVudGluZyBjbWRUYWlsIChNYWtpbmcgaXQgZXF1YWwgdG8gaGVhZCkuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQlpZiAobiA8PSBuY21kcyAqIChzaXplb2Yoc2hvcnQpICogNCkpCiAJCQlicmVhazsgLyogV2VsbCBuZWFybHkgZm9yZXZlciA6LSkgKi8KLQogCX0gLyogRW5kIGZvcmV2ZXIgbG9vcCAqLwotCiB9IC8qIEVuZCBmZXBjbWQgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMjU1LDExICsxODg5LDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIHRlcm1pb3MyZGlnaV9oKHN0cnVjdCBjaGFubmVsICpjaCwgdW5zaWduZWQgY2ZsYWcpCiB7IC8qIEJlZ2luIHRlcm1pb3MyZGlnaV9oICovCi0KIAl1bnNpZ25lZCByZXMgPSAwOwogCi0JaWYgKGNmbGFnICYgQ1JUU0NUUykgCi0JeworCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKIAkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSAoUlRTUEFDRSB8IENUU1BBQ0UpOwogCQlyZXMgfD0gKChjaC0+bV9jdHMpIHwgKGNoLT5tX3J0cykpOwogCX0KQEAgLTIyOTUsNyArMTkyNyw2IEBACiAKIAl1bnNpZ25lZCByZXMgPSBpZmxhZyAmIChJR05CUksgfCBCUktJTlQgfCBJR05QQVIgfCBQQVJNUksgfCAKIAkgICAgICAgICAgICAgICAgICAgICAgICBJTlBDSyB8IElTVFJJUHxJWE9OfElYQU5ZfElYT0ZGKTsKLQkKIAlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfQUlYT04pCiAJCXJlcyB8PSBJQUlYT047CiAJcmV0dXJuIHJlczsKQEAgLTIzMDgsMjggKzE5MzksMTUgQEAKIHsgLyogQmVnaW4gdGVybWlvczJkaWdpX2MgKi8KIAogCXVuc2lnbmVkIHJlcyA9IDA7Ci0KLSNpZmRlZiBTUEVFRF9IQUNLCi0JLyogQ0w6IEhBQ0sgdG8gZm9yY2UgMTE1MjAwIGF0IDM4NDAwIGFuZCA1NzYwMCBhdCAxOTIwMCBCYXVkICovCi0JaWYgKChjZmxhZyAmIENCQVVEKT09IEIzODQwMCkgY2ZsYWc9Y2ZsYWcgLSBCMzg0MDAgKyBCMTE1MjAwOwotCWlmICgoY2ZsYWcgJiBDQkFVRCk9PSBCMTkyMDApIGNmbGFnPWNmbGFnIC0gQjE5MjAwICsgQjU3NjAwOwotI2VuZGlmIC8qIFNQRUVEX0hBQ0sgKi8KLQotCWlmIChjZmxhZyAmIENCQVVERVgpCi0JeyAvKiBCZWdpbiBkZXRlY3RlZCBDQkFVREVYICovCi0KKwlpZiAoY2ZsYWcgJiBDQkFVREVYKSB7IC8qIEJlZ2luIGRldGVjdGVkIENCQVVERVggKi8KIAkJY2gtPmRpZ2lleHQuZGlnaV9mbGFncyB8PSBESUdJX0ZBU1Q7Ci0KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkgICBIVVBDTCBiaXQgaXMgdXNlZCBieSBGRVAgdG8gaW5kaWNhdGUgZmFzdCBiYXVkCiAJCSAgIHRhYmxlIGlzIHRvIGJlIHVzZWQuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJcmVzIHw9IEZFUF9IVVBDTDsKLQogCX0gLyogRW5kIGRldGVjdGVkIENCQVVERVggKi8KIAllbHNlIGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJj0gfkRJR0lfRkFTVDsgCi0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCUNCQVVEIGhhcyBiaXQgcG9zaXRpb24gMHgxMDAwIHNldCB0aGVzZSBkYXlzIHRvIGluZGljYXRlIExpbnV4CiAJCWJhdWQgcmF0ZSByZW1hcC4gIERpZ2kgaGFyZHdhcmUgY2FuJ3QgaGFuZGxlIHRoZSBiaXQgYXNzaWdubWVudC4KQEAgLTIzMzcsNyArMTk1NSw2IEBACiAJCWJpdCBvdXQuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCXJlcyB8PSBjZmxhZyAmICgoQ0JBVUQgXiBDQkFVREVYKSB8IFBBUk9ERCB8IFBBUkVOQiB8IENTVE9QQiB8IENTSVpFKTsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJVGhpcyBnZXRzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBEaWdpIGNhcmRzIGhhdmUgdGhlaXIgb3duCiAJCXJlcHJlc2VudGF0aW9uIG9mIGNfY2ZsYWdzIGNvbnRyb2xpbmcgYmF1ZCByYXRlLiAgRm9yIHRoZSBtb3N0CkBAIC0yMzU3LDEwICsxOTc0LDggQEAKIAkJc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGEgc2NyZWVuZWQgb3V0IHByaW9yIHRvIHRlcm1pb3MyZGlnaV9jIAogCQlyZXR1cm5pbmcuICBTaW5jZSBDTE9DQUwgaXNuJ3QgdXNlZCBieSB0aGUgYm9hcmQgdGhpcyBjYW4gYmUKIAkJaWdub3JlZCBhcyBsb25nIGFzIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB1c2VkIG9ubHkgYnkgRGlnaSBoYXJkd2FyZS4gCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmIChjZmxhZyAmIENCQVVERVgpCi0JeworCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWlmIChjZmxhZyAmIENCQVVERVgpIHsKIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJVGhlIGJlbG93IGNvZGUgaXMgdHJ5aW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYmF1ZCByYXRlcwogCQkJMTE1MjAwIGFuZCAyMzA0MDAgYXJlIHJlbWFwcGVkLiAgV2UgdXNlIGV4Y2x1c2l2ZSBvciBiZWNhdXNlCkBAIC0yMzcxLDEzOCArMTk4Niw5NiBAQAogCQkJCQogCQlpZiAoKCEoKGNmbGFnICYgMHg3KSBeIChCMTE1MjAwICYgfkNCQVVERVgpKSkgfHwgCiAJCSAgICAoISgoY2ZsYWcgJiAweDcpIF4gKEIyMzA0MDAgJiB+Q0JBVURFWCkpKSkKLQkJewogCQkJcmVzICs9IDE7Ci0JCX0KIAl9Ci0KIAlyZXR1cm4gcmVzOwogCiB9IC8qIEVuZCB0ZXJtaW9zMmRpZ2lfYyAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gZXBjYXBhcmFtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBsb2NrcyAqLwogc3RhdGljIHZvaWQgZXBjYXBhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBjaGFubmVsICpjaCkKIHsgLyogQmVnaW4gZXBjYXBhcmFtICovCiAKIAl1bnNpZ25lZCBpbnQgY21kSGVhZDsKIAlzdHJ1Y3QgdGVybWlvcyAqdHM7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKIAl1bnNpZ25lZCBtdmFsLCBoZmxvdywgY2ZsYWcsIGlmbGFnOwogCiAJYmMgPSBjaC0+YnJkY2hhbjsKIAllcGNhYXNzZXJ0KGJjICE9MCwgImJjIG91dCBvZiByYW5nZSIpOwogCiAJYXNzZXJ0Z3dpbm9uKGNoKTsKLQogCXRzID0gdHR5LT50ZXJtaW9zOwotCi0JaWYgKCh0cy0+Y19jZmxhZyAmIENCQVVEKSA9PSAwKSAKLQl7IC8qIEJlZ2luIENCQVVEIGRldGVjdGVkICovCi0KLQkJY21kSGVhZCA9IGJjLT5yaW47CisJaWYgKCh0cy0+Y19jZmxhZyAmIENCQVVEKSA9PSAwKSAgeyAvKiBCZWdpbiBDQkFVRCBkZXRlY3RlZCAqLworCQljbWRIZWFkID0gcmVhZHcoJmJjLT5yaW4pOwogCQliYy0+cm91dCA9IGNtZEhlYWQ7Ci0JCWNtZEhlYWQgPSBiYy0+dGluOwotCisJCWNtZEhlYWQgPSByZWFkdygmYmMtPnRpbik7CiAJCS8qIENoYW5naW5nIGJhdWQgaW4gbWlkLXN0cmVhbSB0cmFuc21pc3Npb24gY2FuIGJlIHdvbmRlcmZ1bCAqLwogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUZsdXNoIGN1cnJlbnQgdHJhbnNtaXQgYnVmZmVyIGJ5IHNldHRpbmcgY21kVGFpbCBwb2ludGVyICh0b3V0KQogCQkJdG8gY21kSGVhZCBwb2ludGVyICh0aW4pLiAgSG9wZWZ1bGx5IHRoZSB0cmFuc21pdCBidWZmZXIgaXMgZW1wdHkuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJZmVwY21kKGNoLCBTVE9VVCwgKHVuc2lnbmVkKSBjbWRIZWFkLCAwLCAwLCAwKTsKIAkJbXZhbCA9IDA7Ci0KLQl9IC8qIEVuZCBDQkFVRCBkZXRlY3RlZCAqLwotCWVsc2UgCi0JeyAvKiBCZWdpbiBDQkFVRCBub3QgZGV0ZWN0ZWQgKi8KLQorCX0gZWxzZSAgeyAvKiBCZWdpbiBDQkFVRCBub3QgZGV0ZWN0ZWQgKi8KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJY19jZmxhZ3MgaGF2ZSBjaGFuZ2VkIGJ1dCB0aGF0IGNoYW5nZSBoYWQgbm90aGluZyB0byBkbyB3aXRoIEJBVUQuCiAJCQlQcm9wYWdhdGUgdGhlIGNoYW5nZSB0byB0aGUgY2FyZC4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKLQogCQljZmxhZyA9IHRlcm1pb3MyZGlnaV9jKGNoLCB0cy0+Y19jZmxhZyk7Ci0KLQkJaWYgKGNmbGFnICE9IGNoLT5mZXBjZmxhZykgCi0JCXsKKwkJaWYgKGNmbGFnICE9IGNoLT5mZXBjZmxhZykgIHsKIAkJCWNoLT5mZXBjZmxhZyA9IGNmbGFnOwogCQkJLyogU2V0IGJhdWQgcmF0ZSwgY2hhciBzaXplLCBzdG9wIGJpdHMsIHBhcml0eSAqLwogCQkJZmVwY21kKGNoLCBTRVRDVFJMRkxBR1MsICh1bnNpZ25lZCkgY2ZsYWcsIDAsIDAsIDApOwogCQl9Ci0KLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlJZiB0aGUgdXNlciBoYXMgbm90IGZvcmNlZCBDTE9DQUwgYW5kIGlmIHRoZSBkZXZpY2UgaXMgbm90IGEgCiAJCQlDQUxMT1VUIGRldmljZSAoV2hpY2ggaXMgYWx3YXlzIENMT0NBTCkgd2Ugc2V0IGZsYWdzIHN1Y2ggdGhhdAogCQkJdGhlIGRyaXZlciB3aWxsIHdhaXQgb24gY2FycmllciBkZXRlY3QuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQlpZiAodHMtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCXsgLyogQmVnaW4gaXQgaXMgYSBjdWQgZGV2aWNlIG9yIGEgdHR5RCBkZXZpY2Ugd2l0aCBDTE9DQUwgb24gKi8KIAkJCWNoLT5hc3luY2ZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKLQkJfSAvKiBFbmQgaXQgaXMgYSBjdWQgZGV2aWNlIG9yIGEgdHR5RCBkZXZpY2Ugd2l0aCBDTE9DQUwgb24gKi8KIAkJZWxzZQotCQl7IC8qIEJlZ2luIGl0IGlzIGEgdHR5RCBkZXZpY2UgKi8KIAkJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOwotCQl9IC8qIEVuZCBpdCBpcyBhIHR0eUQgZGV2aWNlICovCi0KIAkJbXZhbCA9IGNoLT5tX2R0ciB8IGNoLT5tX3J0czsKLQogCX0gLyogRW5kIENCQVVEIG5vdCBkZXRlY3RlZCAqLwotCiAJaWZsYWcgPSB0ZXJtaW9zMmRpZ2lfaShjaCwgdHMtPmNfaWZsYWcpOwotCiAJLyogQ2hlY2sgaW5wdXQgbW9kZSBmbGFncyAqLwotCi0JaWYgKGlmbGFnICE9IGNoLT5mZXBpZmxhZykgCi0JeworCWlmIChpZmxhZyAhPSBjaC0+ZmVwaWZsYWcpICB7CiAJCWNoLT5mZXBpZmxhZyA9IGlmbGFnOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJQ29tbWFuZCBzZXRzIGNoYW5uZWxzIGlmbGFnIHN0cnVjdHVyZSBvbiB0aGUgYm9hcmQuIFN1Y2ggdGhpbmdzIAogCQkJYXMgaW5wdXQgc29mdCBmbG93IGNvbnRyb2wsIGhhbmRsaW5nIG9mIHBhcml0eSBlcnJvcnMsIGFuZAogCQkJYnJlYWsgaGFuZGxpbmcgYXJlIGFsbCBzZXQgaGVyZS4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCS8qIGJyZWFrIGhhbmRsaW5nLCBwYXJpdHkgaGFuZGxpbmcsIGlucHV0IHN0cmlwcGluZywgZmxvdyBjb250cm9sIGNoYXJzICovCiAJCWZlcGNtZChjaCwgU0VUSUZMQUdTLCAodW5zaWduZWQgaW50KSBjaC0+ZmVwaWZsYWcsIDAsIDAsIDApOwogCX0KLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlTZXQgdGhlIGJvYXJkIG1pbnQgdmFsdWUgZm9yIHRoaXMgY2hhbm5lbC4gIFRoaXMgd2lsbCBjYXVzZSBoYXJkd2FyZQogCQlldmVudHMgdG8gYmUgZ2VuZXJhdGVkIGVhY2ggdGltZSB0aGUgRENEIHNpZ25hbCAoRGVzY3JpYmVkIGluIG1pbnQpIAogCQljaGFuZ2VzLgkKIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JYmMtPm1pbnQgPSBjaC0+ZGNkOwotCisJd3JpdGViKGNoLT5kY2QsICZiYy0+bWludCk7CiAJaWYgKCh0cy0+Y19jZmxhZyAmIENMT0NBTCkgfHwgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0ZPUkNFRENEKSkKIAkJaWYgKGNoLT5kaWdpZXh0LmRpZ2lfZmxhZ3MgJiBESUdJX0ZPUkNFRENEKQotCQkJYmMtPm1pbnQgPSAwOwotCi0JY2gtPmltb2RlbSA9IGJjLT5tc3RhdDsKLQorCQkJd3JpdGViKDAsICZiYy0+bWludCk7CisJY2gtPmltb2RlbSA9IHJlYWRiKCZiYy0+bXN0YXQpOwogCWhmbG93ID0gdGVybWlvczJkaWdpX2goY2gsIHRzLT5jX2NmbGFnKTsKLQotCWlmIChoZmxvdyAhPSBjaC0+aGZsb3cpIAotCXsKKwlpZiAoaGZsb3cgIT0gY2gtPmhmbG93KSAgewogCQljaC0+aGZsb3cgPSBoZmxvdzsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJSGFyZCBmbG93IGNvbnRyb2wgaGFzIGJlZW4gc2VsZWN0ZWQgYnV0IHRoZSBib2FyZCBpcyBub3QKIAkJCXVzaW5nIGl0LiAgQWN0aXZhdGUgaGFyZCBmbG93IGNvbnRyb2wgbm93LgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJCWZlcGNtZChjaCwgU0VUSEZMT1csIGhmbG93LCAweGZmLCAwLCAxKTsKIAl9Ci0JCi0KIAltdmFsIF49IGNoLT5tb2RlbWZha2UgJiAobXZhbCBeIGNoLT5tb2RlbSk7CiAKLQlpZiAoY2gtPm9tb2RlbSBeIG12YWwpIAotCXsKKwlpZiAoY2gtPm9tb2RlbSBeIG12YWwpICB7CiAJCWNoLT5vbW9kZW0gPSBtdmFsOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlUaGUgYmVsb3cgY29tbWFuZCBzZXRzIHRoZSBEVFIgYW5kIFJUUyBtc3RhdCBzdHJ1Y3R1cmUuICBJZgogCQkJaGFyZCBmbG93IGNvbnRyb2wgaXMgTk9UIGFjdGl2ZSB0aGVzZSBjaGFuZ2VzIHdpbGwgZHJpdmUgdGhlCkBAIC0yNTE0LDg3ICsyMDg3LDY1IEBACiAJCS8qIEZpcnN0IHJlc2V0IERUUiAmIFJUUzsgdGhlbiBzZXQgdGhlbSAqLwogCQlmZXBjbWQoY2gsIFNFVE1PREVNLCAwLCAoKGNoLT5tX2R0cil8KGNoLT5tX3J0cykpLCAwLCAxKTsKIAkJZmVwY21kKGNoLCBTRVRNT0RFTSwgbXZhbCwgMCwgMCwgMSk7Ci0KIAl9Ci0KLQlpZiAoY2gtPnN0YXJ0YyAhPSBjaC0+ZmVwc3RhcnRjIHx8IGNoLT5zdG9wYyAhPSBjaC0+ZmVwc3RvcGMpIAotCXsKKwlpZiAoY2gtPnN0YXJ0YyAhPSBjaC0+ZmVwc3RhcnRjIHx8IGNoLT5zdG9wYyAhPSBjaC0+ZmVwc3RvcGMpICB7CiAJCWNoLT5mZXBzdGFydGMgPSBjaC0+c3RhcnRjOwogCQljaC0+ZmVwc3RvcGMgPSBjaC0+c3RvcGM7Ci0KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlUaGUgWE9OIC8gWE9GRiBjaGFyYWN0ZXJzIGhhdmUgY2hhbmdlZDsgcHJvcGFnYXRlIHRoZXNlCiAJCQljaGFuZ2VzIHRvIHRoZSBjYXJkLgkKIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJZmVwY21kKGNoLCBTT05PRkZDLCBjaC0+ZmVwc3RhcnRjLCBjaC0+ZmVwc3RvcGMsIDAsIDEpOwogCX0KLQotCWlmIChjaC0+c3RhcnRjYSAhPSBjaC0+ZmVwc3RhcnRjYSB8fCBjaC0+c3RvcGNhICE9IGNoLT5mZXBzdG9wY2EpIAotCXsKKwlpZiAoY2gtPnN0YXJ0Y2EgIT0gY2gtPmZlcHN0YXJ0Y2EgfHwgY2gtPnN0b3BjYSAhPSBjaC0+ZmVwc3RvcGNhKSAgewogCQljaC0+ZmVwc3RhcnRjYSA9IGNoLT5zdGFydGNhOwogCQljaC0+ZmVwc3RvcGNhID0gY2gtPnN0b3BjYTsKLQogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCVNpbWlsYXIgdG8gdGhlIGFib3ZlLCB0aGlzIHRpbWUgdGhlIGF1eGlsYXJseSBYT04gLyBYT0ZGIAogCQkJY2hhcmFjdGVycyBoYXZlIGNoYW5nZWQ7IHByb3BhZ2F0ZSB0aGVzZSBjaGFuZ2VzIHRvIHRoZSBjYXJkLgogCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogCQlmZXBjbWQoY2gsIFNBVVhPTk9GRkMsIGNoLT5mZXBzdGFydGNhLCBjaC0+ZmVwc3RvcGNhLCAwLCAxKTsKIAl9Ci0KIH0gLyogRW5kIGVwY2FwYXJhbSAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcmVjZWl2ZV9kYXRhICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCisvKiBDYWxsZXIgaG9sZHMgbG9jayAqLwogc3RhdGljIHZvaWQgcmVjZWl2ZV9kYXRhKHN0cnVjdCBjaGFubmVsICpjaCkKIHsgLyogQmVnaW4gcmVjZWl2ZV9kYXRhICovCiAKIAl1bmNoYXIgKnJwdHI7CiAJc3RydWN0IHRlcm1pb3MgKnRzID0gTlVMTDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQlyZWdpc3RlciBpbnQgZGF0YVRvUmVhZCwgd3JhcGdhcCwgYnl0ZXNBdmFpbGFibGU7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IHRhaWwsIGhlYWQ7CisJc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCWludCBkYXRhVG9SZWFkLCB3cmFwZ2FwLCBieXRlc0F2YWlsYWJsZTsKKwl1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKIAl1bnNpZ25lZCBpbnQgd3JhcG1hc2s7CiAJaW50IHJjOwogCi0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBkb2ludCB3aGVuIGEgcmVjZWl2ZSBkYXRhIGV2ZW50IAogCQloYXMgdGFrZW4gcGxhY2UuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAJZ2xvYmFsd2lub24oY2gpOwotCiAJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkKIAkJcmV0dXJuOwotCiAJdHR5ID0gY2gtPnR0eTsKIAlpZiAodHR5KQogCQl0cyA9IHR0eS0+dGVybWlvczsKLQogCWJjID0gY2gtPmJyZGNoYW47Ci0KLQlpZiAoIWJjKSAKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGJjIGlzIE5VTEwgaW4gcmVjZWl2ZV9kYXRhIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KKwlCVUdfT04oIWJjKTsKIAl3cmFwbWFzayA9IGNoLT5yeGJ1ZnNpemUgLSAxOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogCQlHZXQgdGhlIGhlYWQgYW5kIHRhaWwgcG9pbnRlcnMgdG8gdGhlIHJlY2VpdmVyIHF1ZXVlLiAgV3JhcCB0aGUgCiAJCWhlYWQgcG9pbnRlciBpZiBpdCBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQloZWFkID0gYmMtPnJpbjsKKwloZWFkID0gcmVhZHcoJmJjLT5yaW4pOwogCWhlYWQgJj0gd3JhcG1hc2s7Ci0JdGFpbCA9IGJjLT5yb3V0ICYgd3JhcG1hc2s7CisJdGFpbCA9IHJlYWR3KCZiYy0+cm91dCkgJiB3cmFwbWFzazsKIAogCWJ5dGVzQXZhaWxhYmxlID0gKGhlYWQgLSB0YWlsKSAmIHdyYXBtYXNrOwotCiAJaWYgKGJ5dGVzQXZhaWxhYmxlID09IDApCiAJCXJldHVybjsKIApAQCAtMjYwMiw4ICsyMTUzLDcgQEAKIAkgICBJZiBDUkVBRCBiaXQgaXMgb2ZmIG9yIGRldmljZSBub3Qgb3Blbiwgc2V0IFRYIHRhaWwgdG8gaGVhZAogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0JaWYgKCF0dHkgfHwgIXRzIHx8ICEodHMtPmNfY2ZsYWcgJiBDUkVBRCkpIAotCXsKKwlpZiAoIXR0eSB8fCAhdHMgfHwgISh0cy0+Y19jZmxhZyAmIENSRUFEKSkgIHsKIAkJYmMtPnJvdXQgPSBoZWFkOwogCQlyZXR1cm47CiAJfQpAQCAtMjYxMSw2NCArMjE2MSw0NSBAQAogCWlmICh0dHktPmZsaXAuY291bnQgPT0gVFRZX0ZMSVBCVUZfU0laRSkgCiAJCXJldHVybjsKIAotCWlmIChiYy0+b3J1bikgCi0JewotCQliYy0+b3J1biA9IDA7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm92ZXJydW4hIERpZ2lCb2FyZCBkZXZpY2UgJXNcbiIsdHR5LT5uYW1lKTsKKwlpZiAocmVhZGIoJmJjLT5vcnVuKSkgeworCQl3cml0ZWIoMCwgJmJjLT5vcnVuKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXBjYTsgb3ZlcnJ1biEgRGlnaUJvYXJkIGRldmljZSAlc1xuIix0dHktPm5hbWUpOwogCX0KLQogCXJ4d2lub24oY2gpOwogCXJwdHIgPSB0dHktPmZsaXAuY2hhcl9idWZfcHRyOwogCXJjID0gdHR5LT5mbGlwLmNvdW50OwotCi0Jd2hpbGUgKGJ5dGVzQXZhaWxhYmxlID4gMCkgCi0JeyAvKiBCZWdpbiB3aGlsZSB0aGVyZSBpcyBkYXRhIG9uIHRoZSBjYXJkICovCi0KKwl3aGlsZSAoYnl0ZXNBdmFpbGFibGUgPiAwKSAgeyAvKiBCZWdpbiB3aGlsZSB0aGVyZSBpcyBkYXRhIG9uIHRoZSBjYXJkICovCiAJCXdyYXBnYXAgPSAoaGVhZCA+PSB0YWlsKSA/IGhlYWQgLSB0YWlsIDogY2gtPnJ4YnVmc2l6ZSAtIHRhaWw7Ci0KIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlFdmVuIGlmIGhlYWQgaGFzIHdyYXBwZWQgYXJvdW5kIG9ubHkgcmVwb3J0IHRoZSBhbW91bnQgb2YKIAkJCWRhdGEgdG8gYmUgZXF1YWwgdG8gdGhlIHNpemUgLSB0YWlsLiAgUmVtZW1iZXIgbWVtY3B5IGNhbid0CiAJCQlhdXRvbWF0aWNseSB3cmFwIGFyb3VuZCB0aGUgcmVjZWl2ZSBidWZmZXIuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJZGF0YVRvUmVhZCA9ICh3cmFwZ2FwIDwgYnl0ZXNBdmFpbGFibGUpID8gd3JhcGdhcCA6IGJ5dGVzQXZhaWxhYmxlOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCSAgIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAkJaWYgKChyYyArIGRhdGFUb1JlYWQpID4gVFRZX0ZMSVBCVUZfU0laRSkKIAkJCWRhdGFUb1JlYWQgPSBUVFlfRkxJUEJVRl9TSVpFIC0gcmM7Ci0KIAkJaWYgKGRhdGFUb1JlYWQgPT0gMCkKIAkJCWJyZWFrOwotCiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJTW92ZSBkYXRhIHJlYWQgZnJvbSBvdXIgY2FyZCBpbnRvIHRoZSBsaW5lIGRpc2NpcGxpbmVzIGJ1ZmZlcgogCQkJZm9yIHRyYW5zbGF0aW9uIGlmIG5lY2Vzc2FyeS4KIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkJaWYgKChtZW1jcHkocnB0ciwgY2gtPnJ4cHRyICsgdGFpbCwgZGF0YVRvUmVhZCkpICE9IHJwdHIpCi0JCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSByZWNlaXZlX2RhdGEgOiBtZW1jcHkgZmFpbGVkXG4iKTsKLQkJCQorCQltZW1jcHlfZnJvbWlvKHJwdHIsIGNoLT5yeHB0ciArIHRhaWwsIGRhdGFUb1JlYWQpOwogCQlyYyAgICs9IGRhdGFUb1JlYWQ7CiAJCXJwdHIgKz0gZGF0YVRvUmVhZDsKIAkJdGFpbCA9ICh0YWlsICsgZGF0YVRvUmVhZCkgJiB3cmFwbWFzazsKIAkJYnl0ZXNBdmFpbGFibGUgLT0gZGF0YVRvUmVhZDsKLQogCX0gLyogRW5kIHdoaWxlIHRoZXJlIGlzIGRhdGEgb24gdGhlIGNhcmQgKi8KLQotCiAJdHR5LT5mbGlwLmNvdW50ID0gcmM7CiAJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IHJwdHI7CiAJZ2xvYmFsd2lub24oY2gpOwotCWJjLT5yb3V0ID0gdGFpbDsKLQorCXdyaXRldyh0YWlsLCAmYmMtPnJvdXQpOwogCS8qIE11c3QgYmUgY2FsbGVkIHdpdGggZ2xvYmFsIGRhdGEgKi8KIAl0dHlfc2NoZWR1bGVfZmxpcChjaC0+dHR5KTsgCiAJcmV0dXJuOwotCiB9IC8qIEVuZCByZWNlaXZlX2RhdGEgKi8KIAogc3RhdGljIGludCBpbmZvX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKQEAgLTI2NzYsMTcgKzIyMDcsMTUgQEAKIHsKIAlzd2l0Y2ggKGNtZCkgCiAJeyAvKiBCZWdpbiBzd2l0Y2ggY21kICovCi0KIAkJY2FzZSBESUdJX0dFVElORk86CiAJCXsgLyogQmVnaW4gY2FzZSBESUdJX0dFVElORk8gKi8KLQogCQkJc3RydWN0IGRpZ2lfaW5mbyBkaSA7CiAJCQlpbnQgYnJkOwogCi0JCQlnZXRVc2VyKGJyZCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwotCi0JCQlpZiAoKGJyZCA8IDApIHx8IChicmQgPj0gbnVtX2NhcmRzKSB8fCAobnVtX2NhcmRzID09IDApKQotCQkJCXJldHVybiAoLUVOT0RFVik7CisJCQlpZihnZXRfdXNlcihicmQsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChicmQgPCAwIHx8IGJyZCA+PSBudW1fY2FyZHMgfHwgbnVtX2NhcmRzID09IDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJCW1lbXNldCgmZGksIDAsIHNpemVvZihkaSkpOwogCkBAIC0yNjk0LDggKzIyMjMsOSBAQAogCQkJZGkuc3RhdHVzID0gYm9hcmRzW2JyZF0uc3RhdHVzOwogCQkJZGkudHlwZSA9IGJvYXJkc1ticmRdLnR5cGUgOwogCQkJZGkubnVtcG9ydHMgPSBib2FyZHNbYnJkXS5udW1wb3J0cyA7Ci0JCQlkaS5wb3J0ID0gYm9hcmRzW2JyZF0ucG9ydCA7Ci0JCQlkaS5tZW1iYXNlID0gYm9hcmRzW2JyZF0ubWVtYmFzZSA7CisJCQkvKiBMZWdhY3kgZml4dXBzIC0ganVzdCBtb3ZlIGFsb25nIG5vdGhpbmcgdG8gc2VlICovCisJCQlkaS5wb3J0ID0gKHVuc2lnbmVkIGNoYXIgKilib2FyZHNbYnJkXS5wb3J0IDsKKwkJCWRpLm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciAqKWJvYXJkc1ticmRdLm1lbWJhc2UgOwogCiAJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmRpLCBzaXplb2YgKGRpKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNzA5LDM5ICsyMjM5LDI5IEBACiAJCQlpbnQgYnJkID0gYXJnICYgMHhmZjAwMDAwMCA+PiAxNiA7IAogCQkJdW5zaWduZWQgY2hhciBzdGF0ZSA9IGFyZyAmIDB4ZmYgOyAKIAotCQkJaWYgKChicmQgPCAwKSB8fCAoYnJkID49IG51bV9jYXJkcykpCi0JCQl7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gRElHSSBQT0xMRVIgOiBicmQgbm90IHZhbGlkIVxuIik7CisJCQlpZiAoYnJkIDwgMCB8fCBicmQgPj0gbnVtX2NhcmRzKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhOiBESUdJIFBPTExFUiA6IGJyZCBub3QgdmFsaWQhXG4iKTsKIAkJCQlyZXR1cm4gKC1FTk9ERVYpOwogCQkJfQotCiAJCQlkaWdpX3BvbGxlcl9pbmhpYml0ZWQgPSBzdGF0ZSA7CiAJCQlicmVhayA7IAotCiAJCX0gLyogRW5kIGNhc2UgRElHSV9QT0xMRVIgKi8KIAogCQljYXNlIERJR0lfSU5JVDoKIAkJeyAvKiBCZWdpbiBjYXNlIERJR0lfSU5JVCAqLwotCiAJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlUaGlzIGNhbGwgaXMgbWFkZSBieSB0aGUgYXBwcyB0byBjb21wbGV0ZSB0aGUgaW5pdGlsaXphdGlvbgogCQkJCW9mIHRoZSBib2FyZChzKS4gIFRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZwogCQkJCXRoZSBjYXJkIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFuZCBzZXR0aW5nIHRoZSBkcml2ZXJzIGNvbnRyb2wKIAkJCQlmaWVsZHMgdG8gdGhlIHN1dGlhbmxlIHNldHRpbmdzIGZvciB0aGUgY2FyZCBpbiBxdWVzdGlvbi4KIAkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQkJCiAJCQlpbnQgY3JkIDsgCiAJCQlmb3IgKGNyZCA9IDA7IGNyZCA8IG51bV9jYXJkczsgY3JkKyspIAogCQkJCXBvc3RfZmVwX2luaXQgKGNyZCk7Ci0KIAkJCWJyZWFrIDsgCi0KIAkJfSAvKiBFbmQgY2FzZSBESUdJX0lOSVQgKi8KLQotCiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCisJCQlyZXR1cm4gLUVOT1RUWTsKIAl9IC8qIEVuZCBzd2l0Y2ggY21kICovCiAJcmV0dXJuICgwKSA7CiB9CkBAIC0yNzUwLDQzICsyMjcwLDMzIEBACiBzdGF0aWMgaW50IHBjX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAJdW5zaWduZWQgaW50IG1zdGF0LCBtZmxhZyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjaCkKIAkJYmMgPSBjaC0+YnJkY2hhbjsKIAllbHNlCi0JewotCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBjaCBpcyBOVUxMIGluIHBjX3Rpb2NtZ2V0IVxuIik7Ci0JCXJldHVybigtRUlOVkFMKTsKLQl9CisJCXJldHVybiAtRUlOVkFMOwogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCWdsb2JhbHdpbm9uKGNoKTsKLQltc3RhdCA9IGJjLT5tc3RhdDsKKwltc3RhdCA9IHJlYWRiKCZiYy0+bXN0YXQpOwogCW1lbW9mZihjaCk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAKIAlpZiAobXN0YXQgJiBjaC0+bV9kdHIpCiAJCW1mbGFnIHw9IFRJT0NNX0RUUjsKLQogCWlmIChtc3RhdCAmIGNoLT5tX3J0cykKIAkJbWZsYWcgfD0gVElPQ01fUlRTOwotCiAJaWYgKG1zdGF0ICYgY2gtPm1fY3RzKQogCQltZmxhZyB8PSBUSU9DTV9DVFM7Ci0KIAlpZiAobXN0YXQgJiBjaC0+ZHNyKQogCQltZmxhZyB8PSBUSU9DTV9EU1I7Ci0KIAlpZiAobXN0YXQgJiBjaC0+bV9yaSkKIAkJbWZsYWcgfD0gVElPQ01fUkk7Ci0KIAlpZiAobXN0YXQgJiBjaC0+ZGNkKQogCQltZmxhZyB8PSBUSU9DTV9DRDsKLQogCXJldHVybiBtZmxhZzsKIH0KIApAQCAtMjc5NiwxMyArMjMwNiwxMCBAQAogCXN0cnVjdCBjaGFubmVsICpjaCA9IChzdHJ1Y3QgY2hhbm5lbCAqKSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWNoKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGNoIGlzIE5VTEwgaW4gcGNfdGlvY21zZXQhXG4iKTsKLQkJcmV0dXJuKC1FSU5WQUwpOwotCX0KKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkvKgogCSAqIEkgdGhpbmsgdGhpcyBtb2RlbWZha2Ugc3R1ZmYgaXMgYnJva2VuLiAgSXQgZG9lc24ndAogCSAqIGNvcnJlY3RseSByZWZsZWN0IHRoZSBiZWhhdmlvdXIgZGVzaXJlZCBieSB0aGUgVElPQ00qCkBAIC0yODI0LDE3ICsyMzMxLDE0IEBACiAJCWNoLT5tb2RlbWZha2UgfD0gY2gtPm1fZHRyOwogCQljaC0+bW9kZW0gJj0gfmNoLT5tX2R0cjsKIAl9Ci0KIAlnbG9iYWx3aW5vbihjaCk7Ci0KIAkvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJVGhlIGJlbG93IHJvdXRpbmUgZ2VuZXJhbGx5IHNldHMgdXAgcGFyaXR5LCBiYXVkLCBmbG93IGNvbnRyb2wKIAkJaXNzdWVzLCBldGMuLi4uIEl0IGVmZmVjdCBib3RoIGNvbnRyb2wgZmxhZ3MgYW5kIGlucHV0IGZsYWdzLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiAJZXBjYXBhcmFtKHR0eSxjaCk7CiAJbWVtb2ZmKGNoKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg0NywxOSArMjM1MSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1mbGFnLCBtc3RhdDsKIAl1bnNpZ25lZCBjaGFyIHN0YXJ0Yywgc3RvcGM7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOworCXN0cnVjdCBib2FyZF9jaGFuICpiYzsKIAlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgdHR5LT5kcml2ZXJfZGF0YTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAkKIAlpZiAoY2gpCiAJCWJjID0gY2gtPmJyZGNoYW47CiAJZWxzZSAKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGNoIGlzIE5VTEwgaW4gcGNfaW9jdGwhXG4iKTsKLQkJcmV0dXJuKC1FSU5WQUwpOwotCX0KLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJRm9yIFBPU0lYIGNvbXBsaWFuY2Ugd2UgbmVlZCB0byBhZGQgbW9yZSBpb2N0bHMuICBTZWUgdHR5X2lvY3RsLmMKQEAgLTI4NzEsNDYgKzIzNzAsMzkgQEAKIAl7IC8qIEJlZ2luIHN3aXRjaCBjbWQgKi8KIAogCQljYXNlIFRDR0VUUzoKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgCi0JCQkJCSB0dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpKQorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB0dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuKDApOwotCisJCQlyZXR1cm4gMDsKIAkJY2FzZSBUQ0dFVEE6CiAJCQlyZXR1cm4gZ2V0X3Rlcm1pbyh0dHksIGFyZ3ApOwotCiAJCWNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KLQogCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlyZXR1cm4gcmV0dmFsOwotCiAJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLwotCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlzZXR1cF9lbXB0eV9ldmVudCh0dHksY2gpOwkJCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKIAkJCWlmICghYXJnKQogCQkJCWRpZ2lfc2VuZF9icmVhayhjaCwgSFovNCk7ICAgIC8qIDEvNCBzZWNvbmQgKi8KIAkJCXJldHVybiAwOwotCiAJCWNhc2UgVENTQlJLUDoJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLwotCiAJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CiAJCQlpZiAocmV0dmFsKQogCQkJCXJldHVybiByZXR2YWw7CiAKIAkJCS8qIFNldHVwIGFuIGV2ZW50IHRvIGluZGljYXRlIHdoZW4gdGhlIHRyYW5zbWl0IGJ1ZmZlciBlbXB0aWVzICovCi0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CQkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwogCQkJZGlnaV9zZW5kX2JyZWFrKGNoLCBhcmcgPyBhcmcqKEhaLzEwKSA6IEhaLzQpOwogCQkJcmV0dXJuIDA7Ci0KIAkJY2FzZSBUSU9DR1NPRlRDQVI6CiAJCQlpZiAocHV0X3VzZXIoQ19DTE9DQUwodHR5KT8xOjAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gMDsKLQogCQljYXNlIFRJT0NTU09GVENBUjoKIAkJewogCQkJdW5zaWduZWQgaW50IHZhbHVlOwpAQCAtMjkyMiw3NSArMjQxNCw2MyBAQAogCQkJCSAodmFsdWUgPyBDTE9DQUwgOiAwKSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCiAJCWNhc2UgVElPQ01PREc6CiAJCQltZmxhZyA9IHBjX3Rpb2NtZ2V0KHR0eSwgZmlsZSk7CiAJCQlpZiAocHV0X3VzZXIobWZsYWcsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJYnJlYWs7Ci0KIAkJY2FzZSBUSU9DTU9EUzoKIAkJCWlmIChnZXRfdXNlcihtc3RhdCwgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIHBjX3Rpb2Ntc2V0KHR0eSwgZmlsZSwgbXN0YXQsIH5tc3RhdCk7Ci0KIAkJY2FzZSBUSU9DU0RUUjoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCWNoLT5vbW9kZW0gfD0gY2gtPm1fZHRyOwotCQkJY2xpKCk7CiAJCQlnbG9iYWx3aW5vbihjaCk7CiAJCQlmZXBjbWQoY2gsIFNFVE1PREVNLCBjaC0+bV9kdHIsIDAsIDEwLCAxKTsKIAkJCW1lbW9mZihjaCk7Ci0JCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBUSU9DQ0RUUjoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCWNoLT5vbW9kZW0gJj0gfmNoLT5tX2R0cjsKLQkJCWNsaSgpOwogCQkJZ2xvYmFsd2lub24oY2gpOwogCQkJZmVwY21kKGNoLCBTRVRNT0RFTSwgMCwgY2gtPm1fZHRyLCAxMCwgMSk7CiAJCQltZW1vZmYoY2gpOwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwotCiAJCWNhc2UgRElHSV9HRVRBOgogCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2gtPmRpZ2lleHQsIHNpemVvZihkaWdpX3QpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCWJyZWFrOwotCiAJCWNhc2UgRElHSV9TRVRBVzoKIAkJY2FzZSBESUdJX1NFVEFGOgotCQkJaWYgKChjbWQpID09IChESUdJX1NFVEFXKSkgCi0JCQl7CisJCQlpZiAoY21kID09IERJR0lfU0VUQVcpIHsKIAkJCQkvKiBTZXR1cCBhbiBldmVudCB0byBpbmRpY2F0ZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIgZW1wdGllcyAqLwotCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJCXNldHVwX2VtcHR5X2V2ZW50KHR0eSxjaCk7CQkKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7Ci0JCQl9Ci0JCQllbHNlIAotCQkJeworCQkJfSBlbHNlIAl7CiAJCQkJLyogbGRpc2MgbG9jayBhbHJlYWR5IGhlbGQgaW4gaW9jdGwgKi8KIAkJCQlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpCiAJCQkJCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKHR0eSk7CiAJCQl9Ci0KIAkJCS8qIEZhbGwgVGhydSAqLwotCiAJCWNhc2UgRElHSV9TRVRBOgogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaC0+ZGlnaWV4dCwgYXJncCwgc2l6ZW9mKGRpZ2lfdCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCi0JCQlpZiAoY2gtPmRpZ2lleHQuZGlnaV9mbGFncyAmIERJR0lfQUxUUElOKSAKLQkJCXsKKwkJCWlmIChjaC0+ZGlnaWV4dC5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pICB7CiAJCQkJY2gtPmRjZCA9IGNoLT5tX2RzcjsKIAkJCQljaC0+ZHNyID0gY2gtPm1fZGNkOwotCQkJfSAKLQkJCWVsc2UgCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCWNoLT5kY2QgPSBjaC0+bV9kY2Q7CiAJCQkJY2gtPmRzciA9IGNoLT5tX2RzcjsKIAkJCX0KIAkJCi0JCQljbGkoKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCWdsb2JhbHdpbm9uKGNoKTsKIAogCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMDAsMjUgKzI0ODAsMjIgQEAKIAogCQkJZXBjYXBhcmFtKHR0eSxjaCk7CiAJCQltZW1vZmYoY2gpOwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRElHSV9HRVRGTE9XOgogCQljYXNlIERJR0lfR0VUQUZMT1c6Ci0JCQljbGkoKTsJCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQlnbG9iYWx3aW5vbihjaCk7Ci0JCQlpZiAoKGNtZCkgPT0gKERJR0lfR0VURkxPVykpIAotCQkJewotCQkJCWRmbG93LnN0YXJ0YyA9IGJjLT5zdGFydGM7Ci0JCQkJZGZsb3cuc3RvcGMgPSBiYy0+c3RvcGM7Ci0JCQl9Ci0JCQllbHNlIAotCQkJewotCQkJCWRmbG93LnN0YXJ0YyA9IGJjLT5zdGFydGNhOwotCQkJCWRmbG93LnN0b3BjID0gYmMtPnN0b3BjYTsKKwkJCWlmIChjbWQgPT0gRElHSV9HRVRGTE9XKSB7CisJCQkJZGZsb3cuc3RhcnRjID0gcmVhZGIoJmJjLT5zdGFydGMpOworCQkJCWRmbG93LnN0b3BjID0gcmVhZGIoJmJjLT5zdG9wYyk7CisJCQl9IGVsc2UgeworCQkJCWRmbG93LnN0YXJ0YyA9IHJlYWRiKCZiYy0+c3RhcnRjYSk7CisJCQkJZGZsb3cuc3RvcGMgPSByZWFkYigmYmMtPnN0b3BjYSk7CiAJCQl9CiAJCQltZW1vZmYoY2gpOwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZGZsb3csIHNpemVvZihkZmxvdykpKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMzAyNiwxMyArMjUwMywxMCBAQAogCiAJCWNhc2UgRElHSV9TRVRBRkxPVzoKIAkJY2FzZSBESUdJX1NFVEZMT1c6Ci0JCQlpZiAoKGNtZCkgPT0gKERJR0lfU0VURkxPVykpIAotCQkJeworCQkJaWYgKGNtZCA9PSBESUdJX1NFVEZMT1cpIHsKIAkJCQlzdGFydGMgPSBjaC0+c3RhcnRjOwogCQkJCXN0b3BjID0gY2gtPnN0b3BjOwotCQkJfSAKLQkJCWVsc2UgCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCXN0YXJ0YyA9IGNoLT5zdGFydGNhOwogCQkJCXN0b3BjID0gY2gtPnN0b3BjYTsKIAkJCX0KQEAgLTMwNDAsNDAgKzI1MTQsMzEgQEAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmZGZsb3csIGFyZ3AsIHNpemVvZihkZmxvdykpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQlpZiAoZGZsb3cuc3RhcnRjICE9IHN0YXJ0YyB8fCBkZmxvdy5zdG9wYyAhPSBzdG9wYykgCi0JCQl7IC8qIEJlZ2luICBpZiBzZXRmbG93IHRvZ2dsZWQgKi8KLQkJCQljbGkoKTsKKwkJCWlmIChkZmxvdy5zdGFydGMgIT0gc3RhcnRjIHx8IGRmbG93LnN0b3BjICE9IHN0b3BjKSB7IC8qIEJlZ2luICBpZiBzZXRmbG93IHRvZ2dsZWQgKi8KKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJCQkJZ2xvYmFsd2lub24oY2gpOwogCi0JCQkJaWYgKChjbWQpID09IChESUdJX1NFVEZMT1cpKSAKLQkJCQl7CisJCQkJaWYgKGNtZCA9PSBESUdJX1NFVEZMT1cpIHsKIAkJCQkJY2gtPmZlcHN0YXJ0YyA9IGNoLT5zdGFydGMgPSBkZmxvdy5zdGFydGM7CiAJCQkJCWNoLT5mZXBzdG9wYyA9IGNoLT5zdG9wYyA9IGRmbG93LnN0b3BjOwogCQkJCQlmZXBjbWQoY2gsIFNPTk9GRkMsIGNoLT5mZXBzdGFydGMsIGNoLT5mZXBzdG9wYywgMCwgMSk7Ci0JCQkJfSAKLQkJCQllbHNlIAotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQljaC0+ZmVwc3RhcnRjYSA9IGNoLT5zdGFydGNhID0gZGZsb3cuc3RhcnRjOwogCQkJCQljaC0+ZmVwc3RvcGNhICA9IGNoLT5zdG9wY2EgPSBkZmxvdy5zdG9wYzsKIAkJCQkJZmVwY21kKGNoLCBTQVVYT05PRkZDLCBjaC0+ZmVwc3RhcnRjYSwgY2gtPmZlcHN0b3BjYSwgMCwgMSk7CiAJCQkJfQogCi0JCQkJaWYJKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkKKwkJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgVFhTVE9QUEVEKQogCQkJCQlwY19zdGFydCh0dHkpOwogCiAJCQkJbWVtb2ZmKGNoKTsKLQkJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCQkJfSAvKiBFbmQgaWYgc2V0ZmxvdyB0b2dnbGVkICovCiAJCQlicmVhazsKLQogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQogCX0gLyogRW5kIHN3aXRjaCBjbWQgKi8KLQogCXJldHVybiAwOwotCiB9IC8qIEVuZCBwY19pb2N0bCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVnaW4gcGNfc2V0X3Rlcm1pb3MgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMDgzLDIwICsyNTQ4LDE2IEBACiAKIAlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAgeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJZ2xvYmFsd2lub24oY2gpOwogCQllcGNhcGFyYW0odHR5LCBjaCk7CiAJCW1lbW9mZihjaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCiAJCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgogCQkJICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgPT0gMCkpCkBAIC0zMTA2LDggKzI1NjcsNiBAQAogCQkJICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+b3Blbl93YWl0KTsKIAotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQogCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KIAogfSAvKiBFbmQgcGNfc2V0X3Rlcm1pb3MgKi8KQEAgLTMxMTYsMjkgKzI1NzUsMTggQEAKIAogc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKIHsgLyogQmVnaW4gZG9fc29mdGludCAqLwotCiAJc3RydWN0IGNoYW5uZWwgKmNoID0gKHN0cnVjdCBjaGFubmVsICopIHByaXZhdGVfOwotCQotCiAJLyogQ2FsbGVkIGluIHJlc3BvbnNlIHRvIGEgbW9kZW0gY2hhbmdlIGV2ZW50ICovCi0KLQlpZiAoY2ggJiYgY2gtPm1hZ2ljID09IEVQQ0FfTUFHSUMpIAotCXsgLyogQmVnaW4gRVBDQV9NQUdJQyAqLwotCisJaWYgKGNoICYmIGNoLT5tYWdpYyA9PSBFUENBX01BR0lDKSAgeyAvKiBCZWdpbiBFUENBX01BR0lDICovCiAJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBjaC0+dHR5OwogCi0JCWlmICh0dHkgJiYgdHR5LT5kcml2ZXJfZGF0YSkgCi0JCXsgCi0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVQQ0FfRVZFTlRfSEFOR1VQLCAmY2gtPmV2ZW50KSkgCi0JCQl7IC8qIEJlZ2luIGlmIGNsZWFyX2JpdCAqLwotCisJCWlmICh0dHkgJiYgdHR5LT5kcml2ZXJfZGF0YSkgeworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFUENBX0VWRU5UX0hBTkdVUCwgJmNoLT5ldmVudCkpIHsgLyogQmVnaW4gaWYgY2xlYXJfYml0ICovCiAJCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLwogCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CiAJCQkJY2gtPmFzeW5jZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0KIAkJCX0gLyogRW5kIGlmIGNsZWFyX2JpdCAqLwogCQl9Ci0KIAl9IC8qIEVuZCBFUENBX01BR0lDICovCiB9IC8qIEVuZCBkb19zb2Z0aW50ICovCiAKQEAgLTMxNTQsODIgKzI2MDIsNDkgQEAKIAogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CiAJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCi0JeyAvKiBCZWdpbiBpZiB2YWxpZCBjaGFubmVsICovCi0KLQkJc2F2ZV9mbGFncyhmbGFncyk7IAotCQljbGkoKTsKLQotCQlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgPT0gMCkgCi0JCXsgLyogQmVnaW4gaWYgdHJhbnNtaXQgc3RvcCByZXF1ZXN0ZWQgKi8KLQorCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpICB7IC8qIEJlZ2luIGlmIHZhbGlkIGNoYW5uZWwgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOworCQlpZiAoKGNoLT5zdGF0dXNmbGFncyAmIFRYU1RPUFBFRCkgPT0gMCkgIHsgLyogQmVnaW4gaWYgdHJhbnNtaXQgc3RvcCByZXF1ZXN0ZWQgKi8KIAkJCWdsb2JhbHdpbm9uKGNoKTsKLQogCQkJLyogU1RPUCB0cmFuc21pdHRpbmcgbm93ICEhICovCi0KIAkJCWZlcGNtZChjaCwgUEFVU0VUWCwgMCwgMCwgMCwgMCk7Ci0KIAkJCWNoLT5zdGF0dXNmbGFncyB8PSBUWFNUT1BQRUQ7CiAJCQltZW1vZmYoY2gpOwotCiAJCX0gLyogRW5kIGlmIHRyYW5zbWl0IHN0b3AgcmVxdWVzdGVkICovCi0KLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJfSAvKiBFbmQgaWYgdmFsaWQgY2hhbm5lbCAqLwotCiB9IC8qIEVuZCBwY19zdG9wICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zdGFydCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHZvaWQgcGNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsgLyogQmVnaW4gcGNfc3RhcnQgKi8KLQogCXN0cnVjdCBjaGFubmVsICpjaDsKLQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQl2ZXJpZnlDaGFubmVsIHJldHVybnMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgdHR5IHN0cnVjdAogCQlpZiBpdCBpcyB2YWxpZC4gIFRoaXMgc2VydmVzIGFzIGEgc2FuaXR5IGNoZWNrLgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCWlmICgoY2ggPSB2ZXJpZnlDaGFubmVsKHR0eSkpICE9IE5VTEwpIAotCXsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLwotCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOwotCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAkJLyogSnVzdCBpbiBjYXNlIG91dHB1dCB3YXMgcmVzdW1lZCBiZWNhdXNlIG9mIGEgY2hhbmdlIGluIERpZ2ktZmxvdyAqLwotCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgVFhTVE9QUEVEKSAKLQkJeyAvKiBCZWdpbiB0cmFuc21pdCByZXN1bWUgcmVxdWVzdGVkICovCi0KLQkJCXZvbGF0aWxlIHN0cnVjdCBib2FyZF9jaGFuICpiYzsKLQorCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgVFhTVE9QUEVEKSAgeyAvKiBCZWdpbiB0cmFuc21pdCByZXN1bWUgcmVxdWVzdGVkICovCisJCQlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmM7CiAJCQlnbG9iYWx3aW5vbihjaCk7CiAJCQliYyA9IGNoLT5icmRjaGFuOwogCQkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpCi0JCQkJYmMtPmlsb3cgPSAxOwotCisJCQkJd3JpdGViKDEsICZiYy0+aWxvdyk7CiAJCQkvKiBPa2F5LCB5b3UgY2FuIHN0YXJ0IHRyYW5zbWl0dGluZyBhZ2Fpbi4uLiAqLwotCiAJCQlmZXBjbWQoY2gsIFJFU1VNRVRYLCAwLCAwLCAwLCAwKTsKLQogCQkJY2gtPnN0YXR1c2ZsYWdzICY9IH5UWFNUT1BQRUQ7CiAJCQltZW1vZmYoY2gpOwotCiAJCX0gLyogRW5kIHRyYW5zbWl0IHJlc3VtZSByZXF1ZXN0ZWQgKi8KLQotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAl9IC8qIEVuZCBpZiBjaGFubmVsIHZhbGlkICovCi0KIH0gLyogRW5kIHBjX3N0YXJ0ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzI0NCw4NiArMjY1OSw1NSBAQAogCiBzdGF0aWMgdm9pZCBwY190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKIHsgLyogQmVnaW4gcGNfdGhyb3R0bGUgKi8KLQogCXN0cnVjdCBjaGFubmVsICpjaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCXZlcmlmeUNoYW5uZWwgcmV0dXJucyB0aGUgY2hhbm5lbCBmcm9tIHRoZSB0dHkgc3RydWN0CiAJCWlmIGl0IGlzIHZhbGlkLiAgVGhpcyBzZXJ2ZXMgYXMgYSBzYW5pdHkgY2hlY2suCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgCi0JeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCi0KLQotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7Ci0KLQkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpID09IDApCi0JCXsKKwlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAgeyAvKiBCZWdpbiBpZiBjaGFubmVsIHZhbGlkICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwkJaWYgKChjaC0+c3RhdHVzZmxhZ3MgJiBSWFNUT1BQRUQpID09IDApIHsKIAkJCWdsb2JhbHdpbm9uKGNoKTsKIAkJCWZlcGNtZChjaCwgUEFVU0VSWCwgMCwgMCwgMCwgMCk7Ci0KIAkJCWNoLT5zdGF0dXNmbGFncyB8PSBSWFNUT1BQRUQ7CiAJCQltZW1vZmYoY2gpOwogCQl9Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogCX0gLyogRW5kIGlmIGNoYW5uZWwgdmFsaWQgKi8KLQogfSAvKiBFbmQgcGNfdGhyb3R0bGUgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIHVudGhyb3R0bGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkIHBjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsgLyogQmVnaW4gcGNfdW50aHJvdHRsZSAqLwotCiAJc3RydWN0IGNoYW5uZWwgKmNoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gKmJjOwotCi0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJdmVyaWZ5Q2hhbm5lbCByZXR1cm5zIHRoZSBjaGFubmVsIGZyb20gdGhlIHR0eSBzdHJ1Y3QKIAkJaWYgaXQgaXMgdmFsaWQuICBUaGlzIHNlcnZlcyBhcyBhIHNhbml0eSBjaGVjay4KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQlpZiAoKGNoID0gdmVyaWZ5Q2hhbm5lbCh0dHkpKSAhPSBOVUxMKSAKLQl7IC8qIEJlZ2luIGlmIGNoYW5uZWwgdmFsaWQgKi8KLQotCisJaWYgKChjaCA9IHZlcmlmeUNoYW5uZWwodHR5KSkgIT0gTlVMTCkgIHsgLyogQmVnaW4gaWYgY2hhbm5lbCB2YWxpZCAqLwogCQkvKiBKdXN0IGluIGNhc2Ugb3V0cHV0IHdhcyByZXN1bWVkIGJlY2F1c2Ugb2YgYSBjaGFuZ2UgaW4gRGlnaS1mbG93ICovCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLQotCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgUlhTVE9QUEVEKSAKLQkJewotCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGNoLT5zdGF0dXNmbGFncyAmIFJYU1RPUFBFRCkgewogCQkJZ2xvYmFsd2lub24oY2gpOwotCQkJYmMgPSBjaC0+YnJkY2hhbjsKIAkJCWZlcGNtZChjaCwgUkVTVU1FUlgsIDAsIDAsIDAsIDApOwotCiAJCQljaC0+c3RhdHVzZmxhZ3MgJj0gflJYU1RPUFBFRDsKIAkJCW1lbW9mZihjaCk7CiAJCX0KLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJfSAvKiBFbmQgaWYgY2hhbm5lbCB2YWxpZCAqLwotCiB9IC8qIEVuZCBwY191bnRocm90dGxlICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkaWdpX3NlbmRfYnJlYWsgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHZvaWQgZGlnaV9zZW5kX2JyZWFrKHN0cnVjdCBjaGFubmVsICpjaCwgaW50IG1zZWMpCiB7IC8qIEJlZ2luIGRpZ2lfc2VuZF9icmVhayAqLwotCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlcGNhX2xvY2ssIGZsYWdzKTsKIAlnbG9iYWx3aW5vbihjaCk7Ci0KIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKIAkgICBNYXliZSBJIHNob3VsZCBzZW5kIGFuIGluZmluaXRlIGJyZWFrIGhlcmUsIHNjaGVkdWxlKCkgZm9yCiAJICAgbXNlYyBhbW91bnQgb2YgdGltZSwgYW5kIHRoZW4gc3RvcCB0aGUgYnJlYWsuICBUaGlzIHdheSwKQEAgLTMzMzEsMzYgKzI3MTUsMjggQEAKIAkgICB0byBiZSBjYWxsZWQgKGkuZS4gdmlhIGFuIGlvY3RsKCkpIG1vcmUgdGhhbiBvbmNlIGluIG1zZWMgYW1vdW50IAogCSAgIG9mIHRpbWUuICBUcnkgdGhpcyBmb3Igbm93Li4uCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KIAlmZXBjbWQoY2gsIFNFTkRCUkVBSywgbXNlYywgMCwgMTAsIDApOwogCW1lbW9mZihjaCk7Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwY2FfbG9jaywgZmxhZ3MpOwogfSAvKiBFbmQgZGlnaV9zZW5kX2JyZWFrICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBzZXR1cF9lbXB0eV9ldmVudCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogQ2FsbGVyIE1VU1QgaG9sZCB0aGUgbG9jayAqLworCiBzdGF0aWMgdm9pZCBzZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgY2hhbm5lbCAqY2gpCiB7IC8qIEJlZ2luIHNldHVwX2VtcHR5X2V2ZW50ICovCiAKLQl2b2xhdGlsZSBzdHJ1Y3QgYm9hcmRfY2hhbiAqYmMgPSBjaC0+YnJkY2hhbjsKLQl1bnNpZ25lZCBsb25nIGludCBmbGFnczsKKwlzdHJ1Y3QgYm9hcmRfY2hhbiAqYmMgPSBjaC0+YnJkY2hhbjsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwogCWdsb2JhbHdpbm9uKGNoKTsKIAljaC0+c3RhdHVzZmxhZ3MgfD0gRU1QVFlXQUlUOwotCQogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQlXaGVuIHNldCB0aGUgaWVtcHR5IGZsYWcgcmVxdWVzdCBhIGV2ZW50IHRvIGJlIGdlbmVyYXRlZCB3aGVuIHRoZSAKIAkJdHJhbnNtaXQgYnVmZmVyIGlzIGVtcHR5IChJZiB0aGVyZSBpcyBubyBCUkVBSyBpbiBwcm9ncmVzcykuCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQliYy0+aWVtcHR5ID0gMTsKKwl3cml0ZWIoMSwgJmJjLT5pZW1wdHkpOwogCW1lbW9mZihjaCk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KIH0gLyogRW5kIHNldHVwX2VtcHR5X2V2ZW50ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBnZXRfdGVybWlvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzY5LDEwICsyNzQ1LDEwIEBACiB7IC8qIEJlZ2luIGdldF90ZXJtaW8gKi8KIAlyZXR1cm4ga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0dHktPnRlcm1pb3MpOwogfSAvKiBFbmQgZ2V0X3Rlcm1pbyAqLworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlZ2luIGVwY2Ffc2V0dXAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiB2b2lkIGVwY2Ffc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCiB7IC8qIEJlZ2luIGVwY2Ffc2V0dXAgKi8KLQogCXN0cnVjdCBib2FyZF9pbmZvIGJvYXJkOwogCWludCAgICAgICAgICAgICAgIGluZGV4LCBsb29wLCBsYXN0OwogCWNoYXIgICAgICAgICAgICAgICp0ZW1wLCAqdDI7CkBAIC0zMzk0LDQ5ICsyNzcwLDQxIEBACiAJZm9yIChsYXN0ID0gMCwgaW5kZXggPSAxOyBpbmRleCA8PSBpbnRzWzBdOyBpbmRleCsrKQogCQlzd2l0Y2goaW5kZXgpCiAJCXsgLyogQmVnaW4gcGFyc2Ugc3dpdGNoICovCi0KIAkJCWNhc2UgMToKIAkJCQlib2FyZC5zdGF0dXMgPSBpbnRzW2luZGV4XTsKLQkJCQkKIAkJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQkJV2UgY2hlY2sgZm9yIDIgKEFzIG9wcG9zZWQgdG8gMTsgYmVjYXVzZSAyIGlzIGEgZmxhZwogCQkJCQlpbnN0cnVjdGluZyB0aGUgZHJpdmVyIHRvIGlnbm9yZSBlcGNhY29uZmlnLikgIEZvciB0aGlzCiAJCQkJCXJlYXNvbiB3ZSBjaGVjayBmb3IgMi4KIAkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCi0JCQkJaWYgKGJvYXJkLnN0YXR1cyA9PSAyKQotCQkJCXsgLyogQmVnaW4gaWdub3JlIGVwY2Fjb25maWcgYXMgd2VsbCBhcyBsaWxvIGNtZCBsaW5lICovCisJCQkJaWYgKGJvYXJkLnN0YXR1cyA9PSAyKSB7IC8qIEJlZ2luIGlnbm9yZSBlcGNhY29uZmlnIGFzIHdlbGwgYXMgbGlsbyBjbWQgbGluZSAqLwogCQkJCQluYmRldnMgPSAwOwogCQkJCQludW1fY2FyZHMgPSAwOwogCQkJCQlyZXR1cm47CiAJCQkJfSAvKiBFbmQgaWdub3JlIGVwY2Fjb25maWcgYXMgd2VsbCBhcyBsaWxvIGNtZCBsaW5lICovCiAJCi0JCQkJaWYgKGJvYXJkLnN0YXR1cyA+IDIpCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHN0YXR1cyAweCV4XG4iLCBib2FyZC5zdGF0dXMpOworCQkJCWlmIChib2FyZC5zdGF0dXMgPiAyKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBzdGF0dXMgMHgleFxuIiwgYm9hcmQuc3RhdHVzKTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9TVEFUVVM7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJbGFzdCA9IGluZGV4OwogCQkJCWJyZWFrOwotCiAJCQljYXNlIDI6CiAJCQkJYm9hcmQudHlwZSA9IGludHNbaW5kZXhdOwotCQkJCWlmIChib2FyZC50eXBlID49IFBDSVhFTSkgCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHR5cGUgMHgleFxuIiwgYm9hcmQudHlwZSk7CisJCQkJaWYgKGJvYXJkLnR5cGUgPj0gUENJWEVNKSAgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgdHlwZSAweCV4XG4iLCBib2FyZC50eXBlKTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9UWVBFOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWxhc3QgPSBpbmRleDsKIAkJCQlicmVhazsKLQogCQkJY2FzZSAzOgogCQkJCWJvYXJkLmFsdHBpbiA9IGludHNbaW5kZXhdOwotCQkJCWlmIChib2FyZC5hbHRwaW4gPiAxKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBib2FyZCBhbHRwaW4gMHgleFxuIiwgYm9hcmQuYWx0cGluKTsKKwkJCQlpZiAoYm9hcmQuYWx0cGluID4gMSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgYWx0cGluIDB4JXhcbiIsIGJvYXJkLmFsdHBpbik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQUxUUElOOwogCQkJCQlyZXR1cm47CkBAIC0zNDQ2LDkgKzI4MTQsOCBAQAogCiAJCQljYXNlIDQ6CiAJCQkJYm9hcmQubnVtcG9ydHMgPSBpbnRzW2luZGV4XTsKLQkJCQlpZiAoKGJvYXJkLm51bXBvcnRzIDwgMikgfHwgKGJvYXJkLm51bXBvcnRzID4gMjU2KSkKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiPEVycm9yPiAtIGVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgbnVtcG9ydHMgMHgleFxuIiwgYm9hcmQubnVtcG9ydHMpOworCQkJCWlmIChib2FyZC5udW1wb3J0cyA8IDIgfHwgYm9hcmQubnVtcG9ydHMgPiAyNTYpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIG51bXBvcnRzIDB4JXhcbiIsIGJvYXJkLm51bXBvcnRzKTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9OVU1fUE9SVFM7CiAJCQkJCXJldHVybjsKQEAgLTM0NTgsMTAgKzI4MjUsOSBAQAogCQkJCWJyZWFrOwogCiAJCQljYXNlIDU6Ci0JCQkJYm9hcmQucG9ydCA9ICh1bnNpZ25lZCBjaGFyICopaW50c1tpbmRleF07Ci0JCQkJaWYgKGludHNbaW5kZXhdIDw9IDApCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGlvIHBvcnQgMHgleFxuIiwgKHVuc2lnbmVkIGludClib2FyZC5wb3J0KTsKKwkJCQlib2FyZC5wb3J0ID0gaW50c1tpbmRleF07CisJCQkJaWYgKGludHNbaW5kZXhdIDw9IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIGlvIHBvcnQgMHgleFxuIiwgKHVuc2lnbmVkIGludClib2FyZC5wb3J0KTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9QT1JUX0JBU0U7CiAJCQkJCXJldHVybjsKQEAgLTM0NzAsMTAgKzI4MzYsOSBAQAogCQkJCWJyZWFrOwogCiAJCQljYXNlIDY6Ci0JCQkJYm9hcmQubWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopaW50c1tpbmRleF07Ci0JCQkJaWYgKGludHNbaW5kZXhdIDw9IDApCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIG1lbW9yeSBiYXNlIDB4JXhcbiIsKHVuc2lnbmVkIGludClib2FyZC5tZW1iYXNlKTsKKwkJCQlib2FyZC5tZW1iYXNlID0gaW50c1tpbmRleF07CisJCQkJaWYgKGludHNbaW5kZXhdIDw9IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIG1lbW9yeSBiYXNlIDB4JXhcbiIsKHVuc2lnbmVkIGludClib2FyZC5tZW1iYXNlKTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9NRU1fQkFTRTsKIAkJCQkJcmV0dXJuOwpAQCAtMzQ4NywyMSArMjg1MiwxNiBAQAogCiAJCX0gLyogRW5kIHBhcnNlIHN3aXRjaCAqLwogCi0Jd2hpbGUgKHN0ciAmJiAqc3RyKSAKLQl7IC8qIEJlZ2luIHdoaWxlIHRoZXJlIGlzIGEgc3RyaW5nIGFyZyAqLwotCisJd2hpbGUgKHN0ciAmJiAqc3RyKSAgeyAvKiBCZWdpbiB3aGlsZSB0aGVyZSBpcyBhIHN0cmluZyBhcmcgKi8KIAkJLyogZmluZCB0aGUgbmV4dCBjb21tYSBvciB0ZXJtaW5hdG9yICovCiAJCXRlbXAgPSBzdHI7Ci0KIAkJLyogV2hpbGUgc3RyaW5nIGlzIG5vdCBudWxsLCBhbmQgYSBjb21tYSBoYXNuJ3QgYmVlbiBmb3VuZCAqLwogCQl3aGlsZSAoKnRlbXAgJiYgKCp0ZW1wICE9ICcsJykpCiAJCQl0ZW1wKys7Ci0KIAkJaWYgKCEqdGVtcCkKIAkJCXRlbXAgPSBOVUxMOwogCQllbHNlCiAJCQkqdGVtcCsrID0gMDsKLQogCQkvKiBTZXQgaW5kZXggdG8gdGhlIG51bWJlciBvZiBhcmdzICsgMSAqLwogCQlpbmRleCA9IGxhc3QgKyAxOwogCkBAIC0zNTExLDEyICsyODcxLDEwIEBACiAJCQkJbGVuID0gc3RybGVuKHN0cik7CiAJCQkJaWYgKHN0cm5jbXAoIkRpc2FibGUiLCBzdHIsIGxlbikgPT0gMCkgCiAJCQkJCWJvYXJkLnN0YXR1cyA9IDA7Ci0JCQkJZWxzZQotCQkJCWlmIChzdHJuY21wKCJFbmFibGUiLCBzdHIsIGxlbikgPT0gMCkKKwkJCQllbHNlIGlmIChzdHJuY21wKCJFbmFibGUiLCBzdHIsIGxlbikgPT0gMCkKIAkJCQkJYm9hcmQuc3RhdHVzID0gMTsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIHN0YXR1cyAlc1xuIiwgc3RyKTsKKwkJCQllbHNlIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIHN0YXR1cyAlc1xuIiwgc3RyKTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9CT0FSRF9TVEFUVVM7CiAJCQkJCXJldHVybjsKQEAgLTM1MjUsMjIgKzI4ODMsMTcgQEAKIAkJCQlicmVhazsKIAogCQkJY2FzZSAyOgotCiAJCQkJZm9yKGxvb3AgPSAwOyBsb29wIDwgRVBDQV9OVU1fVFlQRVM7IGxvb3ArKykKIAkJCQkJaWYgKHN0cmNtcChib2FyZF9kZXNjW2xvb3BdLCBzdHIpID09IDApCiAJCQkJCQlicmVhazsKLQotCiAJCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJCUlmIHRoZSBpbmRleCBpbmNyZW1lbnRlZCBhYm92ZSByZWZlcnMgdG8gYSBsZWdpdGFtYXRlIGJvYXJkIAogCQkJCQl0eXBlIHNldCBpdCBoZXJlLiAKIAkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAJCQkJaWYgKGluZGV4IDwgRVBDQV9OVU1fVFlQRVMpIAogCQkJCQlib2FyZC50eXBlID0gbG9vcDsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIjxFcnJvcj4gLSBlcGNhX3NldHVwOiBJbnZhbGlkIGJvYXJkIHR5cGU6ICVzXG4iLCBzdHIpOworCQkJCWVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImVwY2Ffc2V0dXA6IEludmFsaWQgYm9hcmQgdHlwZTogJXNcbiIsIHN0cik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQk9BUkRfVFlQRTsKIAkJCQkJcmV0dXJuOwpAQCAtMzU1MiwxMiArMjkwNSwxMCBAQAogCQkJCWxlbiA9IHN0cmxlbihzdHIpOwogCQkJCWlmIChzdHJuY21wKCJEaXNhYmxlIiwgc3RyLCBsZW4pID09IDApIAogCQkJCQlib2FyZC5hbHRwaW4gPSAwOwotCQkJCWVsc2UKLQkJCQlpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCisJCQkJZWxzZSBpZiAoc3RybmNtcCgiRW5hYmxlIiwgc3RyLCBsZW4pID09IDApCiAJCQkJCWJvYXJkLmFsdHBpbiA9IDE7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBhbHRwaW4gJXNcbiIsIHN0cik7CisJCQkJZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBhbHRwaW4gJXNcbiIsIHN0cik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfQUxUUElOOwogCQkJCQlyZXR1cm47CkBAIC0zNTcwLDkgKzI5MjEsOCBAQAogCQkJCXdoaWxlIChpc2RpZ2l0KCp0MikpCiAJCQkJCXQyKys7CiAKLQkJCQlpZiAoKnQyKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBwb3J0IGNvdW50ICVzXG4iLCBzdHIpOworCQkJCWlmICgqdDIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIHBvcnQgY291bnQgJXNcbiIsIHN0cik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfTlVNX1BPUlRTOwogCQkJCQlyZXR1cm47CkBAIC0zNjAxLDE1ICsyOTUxLDE0IEBACiAJCQkJd2hpbGUgKGlzeGRpZ2l0KCp0MikpCiAJCQkJCXQyKys7CiAKLQkJCQlpZiAoKnQyKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBpL28gYWRkcmVzcyAlc1xuIiwgc3RyKTsKKwkJCQlpZiAoKnQyKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiZXBjYV9zZXR1cDogSW52YWxpZCBpL28gYWRkcmVzcyAlc1xuIiwgc3RyKTsKIAkJCQkJaW52YWxpZF9saWxvX2NvbmZpZyA9IDE7CiAJCQkJCXNldHVwX2Vycm9yX2NvZGUgfD0gSU5WQUxJRF9QT1JUX0JBU0U7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAKLQkJCQlib2FyZC5wb3J0ID0gKHVuc2lnbmVkIGNoYXIgKilzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDE2KTsKKwkJCQlib2FyZC5wb3J0ID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxNik7CiAJCQkJbGFzdCA9IGluZGV4OwogCQkJCWJyZWFrOwogCkBAIC0zNjE4LDUyICsyOTY3LDM4IEBACiAJCQkJd2hpbGUgKGlzeGRpZ2l0KCp0MikpCiAJCQkJCXQyKys7CiAKLQkJCQlpZiAoKnQyKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICI8RXJyb3I+IC0gZXBjYV9zZXR1cDogSW52YWxpZCBtZW1vcnkgYmFzZSAlc1xuIixzdHIpOworCQkJCWlmICgqdDIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhX3NldHVwOiBJbnZhbGlkIG1lbW9yeSBiYXNlICVzXG4iLHN0cik7CiAJCQkJCWludmFsaWRfbGlsb19jb25maWcgPSAxOwogCQkJCQlzZXR1cF9lcnJvcl9jb2RlIHw9IElOVkFMSURfTUVNX0JBU0U7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0KLQkJCQlib2FyZC5tZW1iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDE2KTsKKwkJCQlib2FyZC5tZW1iYXNlID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxNik7CiAJCQkJbGFzdCA9IGluZGV4OwogCQkJCWJyZWFrOwotCiAJCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0VSUiAiUEMvWHg6IFRvbyBtYW55IHN0cmluZyBwYXJtc1xuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJlcGNhOiBUb28gbWFueSBzdHJpbmcgcGFybXNcbiIpOwogCQkJCXJldHVybjsKIAkJfQogCQlzdHIgPSB0ZW1wOwotCiAJfSAvKiBFbmQgd2hpbGUgdGhlcmUgaXMgYSBzdHJpbmcgYXJnICovCiAKLQotCWlmIChsYXN0IDwgNikgIAotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQy9YeDogSW5zdWZmaWNpZW50IHBhcm1zIHNwZWNpZmllZFxuIik7CisJaWYgKGxhc3QgPCA2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXBjYTogSW5zdWZmaWNpZW50IHBhcm1zIHNwZWNpZmllZFxuIik7CiAJCXJldHVybjsKIAl9CiAgCiAJLyogSSBzaG91bGQgUkVBTExZIHZhbGlkYXRlIHRoZSBzdHVmZiBoZXJlICovCi0KIAkvKiBDb3BpZXMgb3VyIGxvY2FsIGNvcHkgb2YgYm9hcmQgaW50byBib2FyZHMgKi8KIAltZW1jcHkoKHZvaWQgKikmYm9hcmRzW251bV9jYXJkc10sKHZvaWQgKikmYm9hcmQsIHNpemVvZihib2FyZCkpOwotCi0KIAkvKiBEb2VzIHRoaXMgZ2V0IGNhbGxlZCBvbmNlIHBlciBsaWxvIGFyZyBhcmUgd2hhdCA/ICovCi0KIAlwcmludGsoS0VSTl9JTkZPICJQQy9YeDogQWRkZWQgYm9hcmQgJWksICVzICVpIHBvcnRzIGF0IDB4JTQuNFggYmFzZSAweCU2LjZYXG4iLCAKIAkJbnVtX2NhcmRzLCBib2FyZF9kZXNjW2JvYXJkLnR5cGVdLCAKIAkJYm9hcmQubnVtcG9ydHMsIChpbnQpYm9hcmQucG9ydCwgKHVuc2lnbmVkIGludCkgYm9hcmQubWVtYmFzZSk7Ci0KIAludW1fY2FyZHMrKzsKLQogfSAvKiBFbmQgZXBjYV9zZXR1cCAqLwogCiAKLQotI2lmZGVmIEVOQUJMRV9QQ0kKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBpbml0X1BDSSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIGVudW0gZXBpY19ib2FyZF90eXBlcyB7CkBAIC0zNjg1LDcgKzMwMjAsNiBAQAogCXsgUENJWFJKLCAyLCB9LAogfTsKIAotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBlcGNhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTM3MTEsMTAgKzMwNDUsOCBAQAogCWJvYXJkc1tib2FyZF9pZHhdLnN0YXR1cyA9IEVOQUJMRUQ7CiAJYm9hcmRzW2JvYXJkX2lkeF0udHlwZSA9IGVwY2FfaW5mb190YmxbaW5mb19pZHhdLmJvYXJkX3R5cGU7CiAJYm9hcmRzW2JvYXJkX2lkeF0ubnVtcG9ydHMgPSAweDA7Ci0JYm9hcmRzW2JvYXJkX2lkeF0ucG9ydCA9Ci0JCSh1bnNpZ25lZCBjaGFyICopKChjaGFyICopIGFkZHIgKyBQQ0lfSU9fT0ZGU0VUKTsKLQlib2FyZHNbYm9hcmRfaWR4XS5tZW1iYXNlID0KLQkJKHVuc2lnbmVkIGNoYXIgKikoKGNoYXIgKikgYWRkcik7CisJYm9hcmRzW2JvYXJkX2lkeF0ucG9ydCA9IGFkZHIgKyBQQ0lfSU9fT0ZGU0VUOworCWJvYXJkc1tib2FyZF9pZHhdLm1lbWJhc2UgPSBhZGRyOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGFkZHIgKyBQQ0lfSU9fT0ZGU0VULCAweDIwMDAwMCwgImVwY2EiKSkgewogCQlwcmludGsgKEtFUk5fRVJSIFBGWCAicmVzb3VyY2UgMHgleCBAIDB4JWx4IHVuYXZhaWxhYmxlXG4iLApAQCAtMzc3NSwxNSArMzEwNywxMyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGVwY2FfcGNpX3RibCk7CiAKIGludCBfX2luaXQgaW5pdF9QQ0kgKHZvaWQpCi17IC8qIEJlZ2luIGluaXRfUENJICovCit7CS8qIEJlZ2luIGluaXRfUENJICovCiAJbWVtc2V0ICgmZXBjYV9kcml2ZXIsIDAsIHNpemVvZiAoZXBjYV9kcml2ZXIpKTsKIAllcGNhX2RyaXZlci5uYW1lID0gImVwY2EiOwogCWVwY2FfZHJpdmVyLmlkX3RhYmxlID0gZXBjYV9wY2lfdGJsOwogCWVwY2FfZHJpdmVyLnByb2JlID0gZXBjYV9pbml0X29uZTsKIAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlcGNhX2RyaXZlcik7Ci19IC8qIEVuZCBpbml0X1BDSSAqLwotCi0jZW5kaWYgLyogRU5BQkxFX1BDSSAqLworfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5oIGIvZHJpdmVycy9jaGFyL2VwY2EuaAppbmRleCA1MjIwNWVmLi4yMGVlYjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXBjYS5oCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhLmgKQEAgLTg1LDczICs4NSw3MyBAQAogc3RydWN0IGNoYW5uZWwgCiB7CiAJbG9uZyAgIG1hZ2ljOwotCXVuY2hhciBib2FyZG51bTsKLQl1bmNoYXIgY2hhbm5lbG51bTsKLQl1bmNoYXIgb21vZGVtOyAgICAgICAgIC8qIEZFUCBvdXRwdXQgbW9kZW0gc3RhdHVzICAgICAqLwotCXVuY2hhciBpbW9kZW07ICAgICAgICAgLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICovCi0JdW5jaGFyIG1vZGVtZmFrZTsgICAgICAvKiBNb2RlbSB2YWx1ZXMgdG8gYmUgZm9yY2VkICAgKi8KLQl1bmNoYXIgbW9kZW07ICAgICAgICAgIC8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotCXVuY2hhciBoZmxvdzsKLQl1bmNoYXIgZHNyOwotCXVuY2hhciBkY2Q7Ci0JdW5jaGFyIG1fcnRzIDsgCQkvKiBUaGUgYml0cyB1c2VkIGluIHdoYXRldmVyIEZFUCAqLwotCXVuY2hhciBtX2RjZCA7CQkvKiBpcyBpbmRpZ2lub3VzIHRvIHRoaXMgYm9hcmQgdG8gKi8KLQl1bmNoYXIgbV9kc3IgOwkJLyogcmVwcmVzZW50IGVhY2ggb2YgdGhlIHBoeXNpY2FsICovCi0JdW5jaGFyIG1fY3RzIDsJCS8qIGhhbmRzaGFrZSBsaW5lcyAqLwotCXVuY2hhciBtX3JpIDsKLQl1bmNoYXIgbV9kdHIgOwotCXVuY2hhciBzdG9wYzsKLQl1bmNoYXIgc3RhcnRjOwotCXVuY2hhciBzdG9wY2E7Ci0JdW5jaGFyIHN0YXJ0Y2E7Ci0JdW5jaGFyIGZlcHN0b3BjOwotCXVuY2hhciBmZXBzdGFydGM7Ci0JdW5jaGFyIGZlcHN0b3BjYTsKLQl1bmNoYXIgZmVwc3RhcnRjYTsKLQl1bmNoYXIgdHh3aW47Ci0JdW5jaGFyIHJ4d2luOwotCXVzaG9ydCBmZXBpZmxhZzsKLQl1c2hvcnQgZmVwY2ZsYWc7Ci0JdXNob3J0IGZlcG9mbGFnOwotCXVzaG9ydCB0eGJ1ZmhlYWQ7Ci0JdXNob3J0IHR4YnVmc2l6ZTsKLQl1c2hvcnQgcnhidWZoZWFkOwotCXVzaG9ydCByeGJ1ZnNpemU7CisJdW5zaWduZWQgY2hhciBib2FyZG51bTsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWxudW07CisJdW5zaWduZWQgY2hhciBvbW9kZW07ICAgICAgICAgLyogRkVQIG91dHB1dCBtb2RlbSBzdGF0dXMgICAgICovCisJdW5zaWduZWQgY2hhciBpbW9kZW07ICAgICAgICAgLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICovCisJdW5zaWduZWQgY2hhciBtb2RlbWZha2U7ICAgICAgLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICovCisJdW5zaWduZWQgY2hhciBtb2RlbTsgICAgICAgICAgLyogRm9yY2UgdmFsdWVzICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgY2hhciBoZmxvdzsKKwl1bnNpZ25lZCBjaGFyIGRzcjsKKwl1bnNpZ25lZCBjaGFyIGRjZDsKKwl1bnNpZ25lZCBjaGFyIG1fcnRzIDsgCQkvKiBUaGUgYml0cyB1c2VkIGluIHdoYXRldmVyIEZFUCAqLworCXVuc2lnbmVkIGNoYXIgbV9kY2QgOwkJLyogaXMgaW5kaWdpbm91cyB0byB0aGlzIGJvYXJkIHRvICovCisJdW5zaWduZWQgY2hhciBtX2RzciA7CQkvKiByZXByZXNlbnQgZWFjaCBvZiB0aGUgcGh5c2ljYWwgKi8KKwl1bnNpZ25lZCBjaGFyIG1fY3RzIDsJCS8qIGhhbmRzaGFrZSBsaW5lcyAqLworCXVuc2lnbmVkIGNoYXIgbV9yaSA7CisJdW5zaWduZWQgY2hhciBtX2R0ciA7CisJdW5zaWduZWQgY2hhciBzdG9wYzsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0YzsKKwl1bnNpZ25lZCBjaGFyIHN0b3BjYTsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0Y2E7CisJdW5zaWduZWQgY2hhciBmZXBzdG9wYzsKKwl1bnNpZ25lZCBjaGFyIGZlcHN0YXJ0YzsKKwl1bnNpZ25lZCBjaGFyIGZlcHN0b3BjYTsKKwl1bnNpZ25lZCBjaGFyIGZlcHN0YXJ0Y2E7CisJdW5zaWduZWQgY2hhciB0eHdpbjsKKwl1bnNpZ25lZCBjaGFyIHJ4d2luOworCXVuc2lnbmVkIHNob3J0IGZlcGlmbGFnOworCXVuc2lnbmVkIHNob3J0IGZlcGNmbGFnOworCXVuc2lnbmVkIHNob3J0IGZlcG9mbGFnOworCXVuc2lnbmVkIHNob3J0IHR4YnVmaGVhZDsKKwl1bnNpZ25lZCBzaG9ydCB0eGJ1ZnNpemU7CisJdW5zaWduZWQgc2hvcnQgcnhidWZoZWFkOworCXVuc2lnbmVkIHNob3J0IHJ4YnVmc2l6ZTsKIAlpbnQgICAgY2xvc2VfZGVsYXk7CiAJaW50ICAgIGNvdW50OwogCWludCAgICBibG9ja2VkX29wZW47Ci0JdWxvbmcgIGV2ZW50OworCXVuc2lnbmVkIGxvbmcgIGV2ZW50OwogCWludCAgICBhc3luY2ZsYWdzOwogCXVpbnQgICBkZXY7Ci0JdWxvbmcgIHN0YXR1c2ZsYWdzOwotCXVsb25nICBjX2lmbGFnOwotCXVsb25nICBjX2NmbGFnOwotCXVsb25nICBjX2xmbGFnOwotCXVsb25nICBjX29mbGFnOwotCXVuY2hhciAqdHhwdHI7Ci0JdW5jaGFyICpyeHB0cjsKLQl1bmNoYXIgKnRtcF9idWY7CisJdW5zaWduZWQgbG9uZyAgc3RhdHVzZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAgY19pZmxhZzsKKwl1bnNpZ25lZCBsb25nICBjX2NmbGFnOworCXVuc2lnbmVkIGxvbmcgIGNfbGZsYWc7CisJdW5zaWduZWQgbG9uZyAgY19vZmxhZzsKKwl1bnNpZ25lZCBjaGFyICp0eHB0cjsKKwl1bnNpZ25lZCBjaGFyICpyeHB0cjsKKwl1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwogCXN0cnVjdCBib2FyZF9pbmZvICAgICAgICAgICAqYm9hcmQ7Ci0Jdm9sYXRpbGUgc3RydWN0IGJvYXJkX2NoYW4gICpicmRjaGFuOworCXN0cnVjdCBib2FyZF9jaGFuCSAgICAqYnJkY2hhbjsKIAlzdHJ1Y3QgZGlnaV9zdHJ1Y3QgICAgICAgICAgZGlnaWV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAgICAgICAgICAgKnR0eTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICAgb3Blbl93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgICBjbG9zZV93YWl0OwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICAgIHRxdWV1ZTsKLQl2b2xhdGlsZSBzdHJ1Y3QgZ2xvYmFsX2RhdGEgKm1haWxib3g7CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgIHRxdWV1ZTsKKwlzdHJ1Y3QgZ2xvYmFsX2RhdGEgCSAgICAqbWFpbGJveDsKIH07CiAKIHN0cnVjdCBib2FyZF9pbmZvCQogewotCXVuY2hhciBzdGF0dXM7Ci0JdW5jaGFyIHR5cGU7Ci0JdW5jaGFyIGFsdHBpbjsKLQl1c2hvcnQgbnVtcG9ydHM7Ci0JdW5jaGFyICpwb3J0OwotCXVuY2hhciAqbWVtYmFzZTsKLQl1bmNoYXIgX19pb21lbSAqcmVfbWFwX3BvcnQ7Ci0JdW5jaGFyICpyZV9tYXBfbWVtYmFzZTsKLQl1bG9uZyAgbWVtb3J5X3NlZzsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciBhbHRwaW47CisJdW5zaWduZWQgc2hvcnQgbnVtcG9ydHM7CisJdW5zaWduZWQgbG9uZyBwb3J0OworCXVuc2lnbmVkIGxvbmcgbWVtYmFzZTsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnJlX21hcF9wb3J0OworCXVuc2lnbmVkIGNoYXIgKnJlX21hcF9tZW1iYXNlOworCXVuc2lnbmVkIGxvbmcgIG1lbW9yeV9zZWc7CiAJdm9pZCAoICogbWVtd2lub24gKQkoc3RydWN0IGJvYXJkX2luZm8gKiwgdW5zaWduZWQgaW50KSA7CiAJdm9pZCAoICogbWVtd2lub2ZmICkgCShzdHJ1Y3QgYm9hcmRfaW5mbyAqLCB1bnNpZ25lZCBpbnQpIDsKIAl2b2lkICggKiBnbG9iYWx3aW5vbiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CkBAIC0xNjAsNiArMTYwLDYgQEAKIAl2b2lkICggKiBtZW1vZmYgKQkoc3RydWN0IGNoYW5uZWwgKikgOwogCXZvaWQgKCAqIGFzc2VydGd3aW5vbiApCShzdHJ1Y3QgY2hhbm5lbCAqKSA7CiAJdm9pZCAoICogYXNzZXJ0bWVtb2ZmICkJKHN0cnVjdCBjaGFubmVsICopIDsKLQl1bmNoYXIgcG9sbGVyX2luaGliaXRlZCA7CisJdW5zaWduZWQgY2hhciBwb2xsZXJfaW5oaWJpdGVkIDsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYyBiL2RyaXZlcnMvY2hhci9mdGFwZS9sb3dsZXZlbC9mZGMtaW8uYwppbmRleCAxNzA0YTJhLi5iMmUwOTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvbG93bGV2ZWwvZmRjLWlvLmMKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2xvd2xldmVsL2ZkYy1pby5jCkBAIC0zODcsMTAgKzM4Nyw4IEBACiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCWFkZF93YWl0X3F1ZXVlKCZmdGFwZV93YWl0X2ludHIsICZ3YWl0KTsKLQl3aGlsZSAoIWZ0X2ludGVycnVwdF9zZWVuICYmIHRpbWVvdXQpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0gICAgICAgIH0KKwl3aGlsZSAoIWZ0X2ludGVycnVwdF9zZWVuICYmIHRpbWVvdXQpCisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMgYi9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKaW5kZXggODFkODExZS4uYTU0YmM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCisrKyBiL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYwpAQCAtMTQ5LDggKzE0OSw3IEBACiAKIHN0YXRpYyB2b2lkIGhhbmdjaGVja19maXJlKHVuc2lnbmVkIGxvbmcpOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgaGFuZ2NoZWNrX3RpY2t0b2NrID0KLQkJVElNRVJfSU5JVElBTElaRVIoaGFuZ2NoZWNrX2ZpcmUsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihoYW5nY2hlY2tfdGlja3RvY2ssIGhhbmdjaGVja19maXJlLCAwLCAwKTsKIAogCiBzdGF0aWMgdm9pZCBoYW5nY2hlY2tfZmlyZSh1bnNpZ25lZCBsb25nIGRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwppbmRleCA3NjJmYTQzLi5kZTAzNzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHBldC5jCisrKyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIC8qCiAgKiBUaGUgSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgZHJpdmVyLgogICogVGhpcyBkcml2ZXIgaXMgY2xvc2VseSBtb2RlbGxlZCBhZnRlciB0aGUgcnRjLmMgZHJpdmVyLgotICogaHR0cDovL3d3dy5pbnRlbC5jb20vbGFicy9wbGF0Y29tcC9ocGV0L2hwZXRzcGVjLmh0bQorICogaHR0cDovL3d3dy5pbnRlbC5jb20vaGFyZHdhcmVkZXNpZ24vaHBldHNwZWMuaHRtCiAgKi8KICNkZWZpbmUJSFBFVF9VU0VSX0ZSRVEJKDY0KQogI2RlZmluZQlIUEVUX0RSSUZUCSg1MDApCkBAIC0xMDAsMTQgKzEwMCwxNCBAQAogI2VuZGlmCiAKICNpZm5kZWYgcmVhZHEKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgX19pbmxpbmUgcmVhZHEodm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgcmVhZHEodm9pZCBfX2lvbWVtICphZGRyKQogewogCXJldHVybiByZWFkbChhZGRyKSB8ICgoKHVuc2lnbmVkIGxvbmcgbG9uZylyZWFkbChhZGRyICsgNCkpIDw8IDMyTEwpOwogfQogI2VuZGlmCiAKICNpZm5kZWYgd3JpdGVxCi1zdGF0aWMgdm9pZCBfX2lubGluZSB3cml0ZXEodW5zaWduZWQgbG9uZyBsb25nIHYsIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXEodW5zaWduZWQgbG9uZyBsb25nIHYsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl3cml0ZWwodiAmIDB4ZmZmZmZmZmYsIGFkZHIpOwogCXdyaXRlbCh2ID4+IDMyLCBhZGRyICsgNCk7CkBAIC03MTIsNyArNzEyLDcgQEAKIAl0aS0+c2hpZnQgPSAxMDsKIAl0aS0+YWRkciA9ICZocGV0cC0+aHBfaHBldC0+aHBldF9tYzsKIAl0aS0+ZnJlcXVlbmN5ID0gaHBldF90aW1lX2RpdihocGV0cy0+aHBfcGVyaW9kKTsKLQl0aS0+ZHJpZnQgPSB0aS0+ZnJlcXVlbmN5ICogSFBFVF9EUklGVCAvIDEwMDAwMDA7CisJdGktPmRyaWZ0ID0gSFBFVF9EUklGVDsKIAl0aS0+bWFzayA9IC0xOwogCiAJaHBldHAtPmhwX2ludGVycG9sYXRvciA9IHRpOwpAQCAtOTA2LDExICs5MDYsMTUgQEAKIAkJaWYgKGlycXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgewogCQkJaGRwLT5oZF9uaXJxcyA9IGlycXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgaGRwLT5oZF9uaXJxczsgaSsrKQotCQkJCWhkcC0+aGRfaXJxW2ldID0KKwkJCWZvciAoaSA9IDA7IGkgPCBoZHAtPmhkX25pcnFzOyBpKyspIHsKKwkJCQlpbnQgcmMgPQogCQkJCSAgICBhY3BpX3JlZ2lzdGVyX2dzaShpcnFwLT5pbnRlcnJ1cHRzW2ldLAogCQkJCQkJICAgICAgaXJxcC0+ZWRnZV9sZXZlbCwKIAkJCQkJCSAgICAgIGlycXAtPmFjdGl2ZV9oaWdoX2xvdyk7CisJCQkJaWYgKHJjIDwgMCkKKwkJCQkJcmV0dXJuIEFFX0VSUk9SOworCQkJCWhkcC0+aGRfaXJxW2ldID0gcmM7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwppbmRleCAzNDgwNTM1Li42ZjY3M2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCkBAIC01MTMsMTAgKzUxMyw3IEBACiAJCQlyZXR1cm4gcmV0ID8gOiAtRUFHQUlOOwogCiAJCWlmKG5lZWRfcmVzY2hlZCgpKQotCQl7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCX0KKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAkJZWxzZQogCQkJdWRlbGF5KDIwMCk7CS8qIEZJWE1FOiBXZSBjb3VsZCBwb2xsIGZvciAyNTB1UyA/PyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKaW5kZXggODJjNWYzMDMuLmJhODVlYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKQEAgLTY1NSw4ICs2NTUsNyBAQAogCQkJdGltZW91dC0tOyAgIC8vIFNvIG5lZ2F0aXZlIHZhbHVlcyA9PSBmb3JldmVyCiAJCQogCQlpZiAoIWluX2ludGVycnVwdCgpKSB7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CS8vIHNob3J0IG5hcCAKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsJLy8gc2hvcnQgbmFwCiAJCX0gZWxzZSB7CiAJCQkvLyB3ZSBjYW5ub3Qgc2NoZWQvc2xlZXAgaW4gaW50ZXJycnVwdCBzaWxseQogCQkJcmV0dXJuIDA7ICAgCkBAIC0xMTMyLDggKzExMzEsNyBAQAogCiAJCQkJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19PVVRQVVQsIDYxLCAwICk7CiAKLQkJCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQkJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJCQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgyKTsKIAkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQkJCQlicmVhazsKIAkJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMm1haW4uYyBiL2RyaXZlcnMvY2hhci9pcDJtYWluLmMKaW5kZXggY2YwY2Q1OC4uOWU0ZTI2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAybWFpbi5jCkBAIC0xMjAsNyArMTIwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtMjU1LDcgKzI1NCw3IEBACiAgKiBzZWxlY3RlZCwgdGhlIGJvYXJkIGlzIHNlcnZpY2VkIHBlcmlvZGljYWxseSB0byBzZWUgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcuCiAgKi8KICNkZWZpbmUgIFBPTExfVElNRU9VVCAgIChqaWZmaWVzICsgMSkKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBQb2xsVGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihpcDJfcG9sbCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKFBvbGxUaW1lciwgaXAyX3BvbGwsIDAsIDApOwogc3RhdGljIGNoYXIgIFRpbWVyT247CiAKICNpZmRlZiBJUDJERUJVR19UUkFDRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jCmluZGV4IDVjZTljNjIuLjMzODYyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfYnRfc20uYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2J0X3NtLmMKQEAgLTMxLDggKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4JCS8qIGZvciBjb21wbGV0aW9uIGNvZGVzICovCiAjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgogCi0jZGVmaW5lIElQTUlfQlRfVkVSU0lPTiAidjMzIgotCiBzdGF0aWMgaW50IGJ0X2RlYnVnID0gMHgwMDsJLyogUHJvZHVjdGlvbiB2YWx1ZSAwLCBzZWUgZm9sbG93aW5nIGZsYWdzICovCiAKICNkZWZpbmUJQlRfREVCVUdfRU5BQkxFCTEKQEAgLTE2Myw3ICsxNjEsOCBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKChzaXplIDwgMikgfHwgKHNpemUgPiBJUE1JX01BWF9NU0dfTEVOR1RIKSkgcmV0dXJuIC0xOworCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkpCisJICAgICAgIHJldHVybiAtMTsKIAogCWlmICgoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpICYmIChidC0+c3RhdGUgIT0gQlRfU1RBVEVfSE9TRUQpKQogCQlyZXR1cm4gLTI7CkBAIC0xNzEsNyArMTcwLDggQEAKIAlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHsKICAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogd3JpdGUgc2VxPTB4JTAyWDoiLCBidC0+c2VxKTsKLQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKyspIHByaW50ayAoIiAlMDJ4IiwgZGF0YVtpXSk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKQorCQkgICAgICAgcHJpbnRrICgiICUwMngiLCBkYXRhW2ldKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KIAlidC0+d3JpdGVfZGF0YVswXSA9IHNpemUgKyAxOwkvKiBhbGwgZGF0YSBwbHVzIHNlcSBieXRlICovCkBAIC0yMTAsMTUgKzIxMCwxOCBAQAogCX0gZWxzZSB7CiAJCWRhdGFbMF0gPSBidC0+cmVhZF9kYXRhWzFdOwogCQlkYXRhWzFdID0gYnQtPnJlYWRfZGF0YVszXTsKLQkJaWYgKGxlbmd0aCA8IG1zZ19sZW4pIGJ0LT50cnVuY2F0ZWQgPSAxOworCQlpZiAobGVuZ3RoIDwgbXNnX2xlbikKKwkJICAgICAgIGJ0LT50cnVuY2F0ZWQgPSAxOwogCQlpZiAoYnQtPnRydW5jYXRlZCkgewkvKiBjYW4gYmUgc2V0IGluIHJlYWRfYWxsX2J5dGVzKCkgKi8KIAkJCWRhdGFbMl0gPSBJUE1JX0VSUl9NU0dfVFJVTkNBVEVEOwogCQkJbXNnX2xlbiA9IDM7Ci0JCX0gZWxzZSBtZW1jcHkoZGF0YSArIDIsIGJ0LT5yZWFkX2RhdGEgKyA0LCBtc2dfbGVuIC0gMik7CisJCX0gZWxzZQorCQkgICAgICAgbWVtY3B5KGRhdGEgKyAyLCBidC0+cmVhZF9kYXRhICsgNCwgbXNnX2xlbiAtIDIpOwogCiAJCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykgewogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIkJUOiByZXMgKHJhdykiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBtc2dfbGVuOyBpKyspIHByaW50aygiICUwMngiLCBkYXRhW2ldKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBtc2dfbGVuOyBpKyspCisJCQkgICAgICAgcHJpbnRrKCIgJTAyeCIsIGRhdGFbaV0pOwogCQkJcHJpbnRrICgiXG4iKTsKIAkJfQogCX0KQEAgLTIzMSw4ICsyMzQsMTAgQEAKIAogc3RhdGljIHZvaWQgcmVzZXRfZmxhZ3Moc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQogewotCWlmIChCVF9TVEFUVVMgJiBCVF9IX0JVU1kpIEJUX0NPTlRST0woQlRfSF9CVVNZKTsKLQlpZiAoQlRfU1RBVFVTICYgQlRfQl9CVVNZKSBCVF9DT05UUk9MKEJUX0JfQlVTWSk7CisJaWYgKEJUX1NUQVRVUyAmIEJUX0hfQlVTWSkKKwkgICAgICAgQlRfQ09OVFJPTChCVF9IX0JVU1kpOworCWlmIChCVF9TVEFUVVMgJiBCVF9CX0JVU1kpCisJICAgICAgIEJUX0NPTlRST0woQlRfQl9CVVNZKTsKIAlCVF9DT05UUk9MKEJUX0NMUl9XUl9QVFIpOwogCUJUX0NPTlRST0woQlRfU01TX0FUTik7CiAjaWZkZWYgREVWRUxPUE1FTlRfT05MWV9OT1RfRk9SX1BST0RVQ1RJT04KQEAgLTI0MSw3ICsyNDYsOCBAQAogCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CiAJCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CiAJCUJUX0NPTlRST0woQlRfQ0xSX1JEX1BUUik7Ci0JCWZvciAoaSA9IDA7IGkgPCBJUE1JX01BWF9NU0dfTEVOR1RIICsgMjsgaSsrKSBCTUMySE9TVDsKKwkJZm9yIChpID0gMDsgaSA8IElQTUlfTUFYX01TR19MRU5HVEggKyAyOyBpKyspCisJCSAgICAgICBCTUMySE9TVDsKIAkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwogCX0KICNlbmRpZgpAQCAtMjU4LDcgKzI2NCw4IEBACiAJCQlwcmludGsgKCIgJTAyeCIsIGJ0LT53cml0ZV9kYXRhW2ldKTsKIAkJcHJpbnRrICgiXG4iKTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IGJ0LT53cml0ZV9jb3VudDsgaSsrKSBIT1NUMkJNQyhidC0+d3JpdGVfZGF0YVtpXSk7CisJZm9yIChpID0gMDsgaSA8IGJ0LT53cml0ZV9jb3VudDsgaSsrKQorCSAgICAgICBIT1NUMkJNQyhidC0+d3JpdGVfZGF0YVtpXSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJlYWRfYWxsX2J5dGVzKHN0cnVjdCBzaV9zbV9kYXRhICpidCkKQEAgLTI3OCw3ICsyODUsOCBAQAogCQlidC0+dHJ1bmNhdGVkID0gMTsKIAkJcmV0dXJuIDE7CS8qIGxldCBuZXh0IFhBQ1RJT04gU1RBUlQgY2xlYW4gaXQgdXAgKi8KIAl9Ci0JZm9yIChpID0gMTsgaSA8PSBidC0+cmVhZF9jb3VudDsgaSsrKSBidC0+cmVhZF9kYXRhW2ldID0gQk1DMkhPU1Q7CisJZm9yIChpID0gMTsgaSA8PSBidC0+cmVhZF9jb3VudDsgaSsrKQorCSAgICAgICBidC0+cmVhZF9kYXRhW2ldID0gQk1DMkhPU1Q7CiAJYnQtPnJlYWRfY291bnQrKzsJLyogYWNjb3VudCBmb3IgdGhlIGxlbmd0aCBieXRlICovCiAKIAlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHsKQEAgLTI5NSw3ICszMDMsOCBAQAogICAgICAgICAJKChidC0+cmVhZF9kYXRhWzFdICYgMHhGOCkgPT0gKGJ0LT53cml0ZV9kYXRhWzFdICYgMHhGOCkpKQogCQkJcmV0dXJuIDE7CiAKLQlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHByaW50ayhLRVJOX1dBUk5JTkcgIkJUOiBiYWQgcGFja2V0OiAiCisJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKQorCSAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJCVDogYmFkIHBhY2tldDogIgogCQkid2FudCAweCglMDJYLCAlMDJYLCAlMDJYKSBnb3QgKCUwMlgsICUwMlgsICUwMlgpXG4iLAogCQlidC0+d3JpdGVfZGF0YVsxXSwgYnQtPndyaXRlX2RhdGFbMl0sIGJ0LT53cml0ZV9kYXRhWzNdLAogCQlidC0+cmVhZF9kYXRhWzFdLCAgYnQtPnJlYWRfZGF0YVsyXSwgIGJ0LT5yZWFkX2RhdGFbM10pOwpAQCAtMzU5LDcgKzM2OCw4IEBACiAJCQl0aW1lKTsKIAlidC0+bGFzdF9zdGF0ZSA9IGJ0LT5zdGF0ZTsKIAotCWlmIChidC0+c3RhdGUgPT0gQlRfU1RBVEVfSE9TRUQpIHJldHVybiBTSV9TTV9IT1NFRDsKKwlpZiAoYnQtPnN0YXRlID09IEJUX1NUQVRFX0hPU0VEKQorCSAgICAgICByZXR1cm4gU0lfU01fSE9TRUQ7CiAKIAlpZiAoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpIHsJLyogZG8gdGltZW91dCB0ZXN0ICovCiAKQEAgLTM3MSw3ICszODEsOCBAQAogICAgIAkvKiBGSVhNRTogYnRfZXZlbnQgaXMgc29tZXRpbWVzIGNhbGxlZCB3aXRoIHRpbWUgPiBCVF9OT1JNQUxfVElNRU9VVAogICAgICAgICAgICAgICAobm90aWNlZCBpbiBpcG1pX3NtaWNfc20uYyBKYW51YXJ5IDIwMDQpICovCiAKLQkJaWYgKCh0aW1lIDw9IDApIHx8ICh0aW1lID49IEJUX05PUk1BTF9USU1FT1VUKSkgdGltZSA9IDEwMDsKKwkJaWYgKCh0aW1lIDw9IDApIHx8ICh0aW1lID49IEJUX05PUk1BTF9USU1FT1VUKSkKKwkJICAgICAgIHRpbWUgPSAxMDA7CiAJCWJ0LT50aW1lb3V0IC09IHRpbWU7CiAJCWlmICgoYnQtPnRpbWVvdXQgPCAwKSAmJiAoYnQtPnN0YXRlIDwgQlRfU1RBVEVfUkVTRVQxKSkgewogCQkJZXJyb3JfcmVjb3ZlcnkoYnQsICJ0aW1lZCBvdXQiKTsKQEAgLTM5MywxMiArNDA0LDE0IEBACiAJCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CiAJCQlicmVhazsKIAkJfQotICAgIAkJaWYgKHN0YXR1cyAmIEJUX0IySF9BVE4pIGJyZWFrOworICAgIAkJaWYgKHN0YXR1cyAmIEJUX0IySF9BVE4pCisJCSAgICAgICBicmVhazsKIAkJYnQtPnN0YXRlID0gQlRfU1RBVEVfV1JJVEVfQllURVM7CiAJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7CS8qIGZvciBsb2dnaW5nICovCiAKIAljYXNlIEJUX1NUQVRFX1dSSVRFX0JZVEVTOgotCQlpZiAoc3RhdHVzICYgKEJUX0JfQlVTWSB8IEJUX0gyQl9BVE4pKSBicmVhazsKKwkJaWYgKHN0YXR1cyAmIChCVF9CX0JVU1kgfCBCVF9IMkJfQVROKSkKKwkJICAgICAgIGJyZWFrOwogCQlCVF9DT05UUk9MKEJUX0NMUl9XUl9QVFIpOwogCQl3cml0ZV9hbGxfYnl0ZXMoYnQpOwogCQlCVF9DT05UUk9MKEJUX0gyQl9BVE4pOwkvKiBjbGVhcnMgdG9vIGZhc3QgdG8gY2F0Y2g/ICovCkBAIC00MDYsNyArNDE5LDggQEAKIAkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsgLyogaXQgTUlHSFQgc2FpbCB0aHJvdWdoICovCiAKIAljYXNlIEJUX1NUQVRFX1dSSVRFX0NPTlNVTUU6IC8qIEJNQ3MgdXN1YWxseSBibG93IHJpZ2h0IHRocnUgaGVyZSAqLwotICAgICAgICAJaWYgKHN0YXR1cyAmIChCVF9IMkJfQVROIHwgQlRfQl9CVVNZKSkgYnJlYWs7CisgICAgICAgIAlpZiAoc3RhdHVzICYgKEJUX0gyQl9BVE4gfCBCVF9CX0JVU1kpKQorCQkgICAgICAgYnJlYWs7CiAJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX0IySF9XQUlUOwogCQkvKiBmYWxsIHRocm91Z2ggd2l0aCBzdGF0dXMgKi8KIApAQCAtNDE1LDE1ICs0MjksMTggQEAKIAkgICBnZW5lcmF0aW9uIG9mIEIySF9BVE4gc28gQUxXQVlTIHJldHVybiBDQUxMX1dJVEhfREVMQVkuICovCiAKIAljYXNlIEJUX1NUQVRFX0IySF9XQUlUOgotICAgIAkJaWYgKCEoc3RhdHVzICYgQlRfQjJIX0FUTikpIGJyZWFrOworICAgIAkJaWYgKCEoc3RhdHVzICYgQlRfQjJIX0FUTikpCisJCSAgICAgICBicmVhazsKIAogCQkvKiBBc3N1bWUgb3JkZXJlZCwgdW5jYWNoZWQgd3JpdGVzOiBubyBuZWVkIHRvIHdhaXQgKi8KLQkJaWYgKCEoc3RhdHVzICYgQlRfSF9CVVNZKSkgQlRfQ09OVFJPTChCVF9IX0JVU1kpOyAvKiBzZXQgKi8KKwkJaWYgKCEoc3RhdHVzICYgQlRfSF9CVVNZKSkKKwkJICAgICAgIEJUX0NPTlRST0woQlRfSF9CVVNZKTsgLyogc2V0ICovCiAJCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CQkvKiBjbGVhciBpdCwgQUNLIHRvIHRoZSBCTUMgKi8KIAkJQlRfQ09OVFJPTChCVF9DTFJfUkRfUFRSKTsJLyogcmVzZXQgdGhlIHF1ZXVlICovCiAJCWkgPSByZWFkX2FsbF9ieXRlcyhidCk7CiAJCUJUX0NPTlRST0woQlRfSF9CVVNZKTsJCS8qIGNsZWFyICovCi0JCWlmICghaSkgYnJlYWs7CQkJLyogVHJ5IHRoaXMgc3RhdGUgYWdhaW4gKi8KKwkJaWYgKCFpKQkJCQkvKiBUcnkgdGhpcyBzdGF0ZSBhZ2FpbiAqLworCQkgICAgICAgYnJlYWs7CiAJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFQURfRU5EOwogCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOwkvKiBmb3IgbG9nZ2luZyAqLwogCkBAIC00MzYsNyArNDUzLDggQEAKIAogI2lmZGVmIE1BS0VfVEhJU19UUlVFX0lGX05FQ0VTU0FSWQogCi0JCWlmIChzdGF0dXMgJiBCVF9IX0JVU1kpIGJyZWFrOworCQlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKQorCQkgICAgICAgYnJlYWs7CiAjZW5kaWYKIAkJYnQtPnNlcSsrOwogCQlidC0+c3RhdGUgPSBCVF9TVEFURV9JRExFOwpAQCAtNDU5LDcgKzQ3Nyw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCVF9TVEFURV9SRVNFVDM6Ci0JCWlmIChidC0+dGltZW91dCA+IDApIHJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCWlmIChidC0+dGltZW91dCA+IDApCisJCSAgICAgICByZXR1cm4gU0lfU01fQ0FMTF9XSVRIX0RFTEFZOwogCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRVNUQVJUOwkvKiBwcmludGsgaW4gZGVidWcgbW9kZXMgKi8KIAkJYnJlYWs7CiAKQEAgLTQ4NSw3ICs1MDQsOCBAQAogCSAgIGJ1dCB0aGF0J3Mgd2hhdCB5b3UgZ2V0IGZyb20gcmVhZGluZyBhIGJvZ3VzIGFkZHJlc3MsIHNvIHdlCiAJICAgdGVzdCB0aGF0IGZpcnN0LiAgVGhlIGNhbGxpbmcgcm91dGluZSB1c2VzIG5lZ2F0aXZlIGxvZ2ljLiAqLwogCi0JaWYgKChCVF9TVEFUVVMgPT0gMHhGRikgJiYgKEJUX0lOVE1BU0tfUiA9PSAweEZGKSkgcmV0dXJuIDE7CisJaWYgKChCVF9TVEFUVVMgPT0gMHhGRikgJiYgKEJUX0lOVE1BU0tfUiA9PSAweEZGKSkKKwkgICAgICAgcmV0dXJuIDE7CiAJcmVzZXRfZmxhZ3MoYnQpOwogCXJldHVybiAwOwogfQpAQCAtNTAxLDcgKzUyMSw2IEBACiAKIHN0cnVjdCBzaV9zbV9oYW5kbGVycyBidF9zbWlfaGFuZGxlcnMgPQogewotCS52ZXJzaW9uICAgICAgICAgICA9IElQTUlfQlRfVkVSU0lPTiwKIAkuaW5pdF9kYXRhICAgICAgICAgPSBidF9pbml0X2RhdGEsCiAJLnN0YXJ0X3RyYW5zYWN0aW9uID0gYnRfc3RhcnRfdHJhbnNhY3Rpb24sCiAJLmdldF9yZXN1bHQgICAgICAgID0gYnRfZ2V0X3Jlc3VsdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKaW5kZXggZTBhNTM1Ny4uYTA5ZmYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKQEAgLTQ3LDggKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KIAotI2RlZmluZSBJUE1JX0RFVklOVEZfVkVSU0lPTiAidjMzIgotCiBzdHJ1Y3QgaXBtaV9maWxlX3ByaXZhdGUKIHsKIAlpcG1pX3VzZXJfdCAgICAgICAgICB1c2VyOwpAQCAtNDExLDYgKzQwOSw3IEBACiAJCWJyZWFrOwogCX0KIAorCS8qIFRoZSBuZXh0IGZvdXIgYXJlIGxlZ2FjeSwgbm90IHBlci1jaGFubmVsLiAqLwogCWNhc2UgSVBNSUNUTF9TRVRfTVlfQUREUkVTU19DTUQ6CiAJewogCQl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtNDIwLDIyICs0MTksMjUgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaXBtaV9zZXRfbXlfYWRkcmVzcyhwcml2LT51c2VyLCB2YWwpOwotCQlydiA9IDA7CisJCXJ2ID0gaXBtaV9zZXRfbXlfYWRkcmVzcyhwcml2LT51c2VyLCAwLCB2YWwpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIElQTUlDVExfR0VUX01ZX0FERFJFU1NfQ01EOgogCXsKLQkJdW5zaWduZWQgaW50IHZhbDsKKwkJdW5zaWduZWQgaW50ICB2YWw7CisJCXVuc2lnbmVkIGNoYXIgcnZhbDsKIAotCQl2YWwgPSBpcG1pX2dldF9teV9hZGRyZXNzKHByaXYtPnVzZXIpOworCQlydiA9IGlwbWlfZ2V0X215X2FkZHJlc3MocHJpdi0+dXNlciwgMCwgJnJ2YWwpOworCQlpZiAocnYpCisJCQlicmVhazsKKworCQl2YWwgPSBydmFsOwogCiAJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpIHsKIAkJCXJ2ID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCXJ2ID0gMDsKIAkJYnJlYWs7CiAJfQogCkBAIC00NDgsMjQgKzQ1MCw5NCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpcG1pX3NldF9teV9MVU4ocHJpdi0+dXNlciwgdmFsKTsKLQkJcnYgPSAwOworCQlydiA9IGlwbWlfc2V0X215X0xVTihwcml2LT51c2VyLCAwLCB2YWwpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIElQTUlDVExfR0VUX01ZX0xVTl9DTUQ6CiAJewotCQl1bnNpZ25lZCBpbnQgdmFsOworCQl1bnNpZ25lZCBpbnQgIHZhbDsKKwkJdW5zaWduZWQgY2hhciBydmFsOwogCi0JCXZhbCA9IGlwbWlfZ2V0X215X0xVTihwcml2LT51c2VyKTsKKwkJcnYgPSBpcG1pX2dldF9teV9MVU4ocHJpdi0+dXNlciwgMCwgJnJ2YWwpOworCQlpZiAocnYpCisJCQlicmVhazsKKworCQl2YWwgPSBydmFsOwogCiAJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpIHsKIAkJCXJ2ID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCXJ2ID0gMDsKIAkJYnJlYWs7CiAJfQorCisJY2FzZSBJUE1JQ1RMX1NFVF9NWV9DSEFOTkVMX0FERFJFU1NfQ01EOgorCXsKKwkJc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gaXBtaV9zZXRfbXlfYWRkcmVzcyhwcml2LT51c2VyLCB2YWwuY2hhbm5lbCwgdmFsLnZhbHVlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUE1JQ1RMX0dFVF9NWV9DSEFOTkVMX0FERFJFU1NfQ01EOgorCXsKKwkJc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlydiA9IGlwbWlfZ2V0X215X2FkZHJlc3MocHJpdi0+dXNlciwgdmFsLmNoYW5uZWwsICZ2YWwudmFsdWUpOworCQlpZiAocnYpCisJCQlicmVhazsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfU0VUX01ZX0NIQU5ORUxfTFVOX0NNRDoKKwl7CisJCXN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0IHZhbDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJnLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcnYgPSBpcG1pX3NldF9teV9MVU4ocHJpdi0+dXNlciwgdmFsLmNoYW5uZWwsIHZhbC52YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9MVU5fQ01EOgorCXsKKwkJc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQgdmFsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmcsIHNpemVvZih2YWwpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlydiA9IGlwbWlfZ2V0X215X0xVTihwcml2LT51c2VyLCB2YWwuY2hhbm5lbCwgJnZhbC52YWx1ZSk7CisJCWlmIChydikKKwkJCWJyZWFrOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwogCWNhc2UgSVBNSUNUTF9TRVRfVElNSU5HX1BBUk1TX0NNRDoKIAl7CiAJCXN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcyBwYXJtczsKQEAgLTY2Myw3ICs3MzUsOCBAQAogCWNhc2UgQ09NUEFUX0lQTUlDVExfUkVDRUlWRV9NU0c6CiAJY2FzZSBDT01QQVRfSVBNSUNUTF9SRUNFSVZFX01TR19UUlVOQzoKIAl7Ci0JCXN0cnVjdCBpcG1pX3JlY3YgICAqcHJlY3Y2NCwgcmVjdjY0OworCQlzdHJ1Y3QgaXBtaV9yZWN2ICAgX191c2VyICpwcmVjdjY0OworCQlzdHJ1Y3QgaXBtaV9yZWN2ICAgcmVjdjY0OwogCiAJCWlmIChnZXRfY29tcGF0X2lwbWlfcmVjdigmcmVjdjY0LCBjb21wYXRfcHRyKGFyZykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC02NzYsNyArNzQ5LDcgQEAKIAkJCQkoKGNtZCA9PSBDT01QQVRfSVBNSUNUTF9SRUNFSVZFX01TRykKIAkJCQkgPyBJUE1JQ1RMX1JFQ0VJVkVfTVNHCiAJCQkJIDogSVBNSUNUTF9SRUNFSVZFX01TR19UUlVOQyksCi0JCQkJKGxvbmcpIHByZWN2NjQpOworCQkJCSh1bnNpZ25lZCBsb25nKSBwcmVjdjY0KTsKIAkJaWYgKHJjICE9IDApCiAJCQlyZXR1cm4gcmM7CiAKQEAgLTc0OCw4ICs4MjEsNyBAQAogCWlmIChpcG1pX21ham9yIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpcG1pIGRldmljZSBpbnRlcmZhY2UgdmVyc2lvbiAiCi0JICAgICAgIElQTUlfREVWSU5URl9WRVJTSU9OICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gImlwbWkgZGV2aWNlIGludGVyZmFjZVxuIik7CiAKIAlpcG1pX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiaXBtaSIpOwogCWlmIChJU19FUlIoaXBtaV9jbGFzcykpIHsKQEAgLTc5MiwzICs4NjQsNSBAQAogbW9kdWxlX2V4aXQoY2xlYW51cF9pcG1pKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBkZXZpY2UgaW50ZXJmYWNlIGZvciB0aGUgSVBNSSBtZXNzYWdlIGhhbmRsZXIuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2tjc19zbS5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9rY3Nfc20uYwppbmRleCA0OGNjZTI0Li5kMjE4NTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2tjc19zbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfa2NzX3NtLmMKQEAgLTQyLDggKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4JCS8qIGZvciBjb21wbGV0aW9uIGNvZGVzICovCiAjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgogCi0jZGVmaW5lIElQTUlfS0NTX1ZFUlNJT04gInYzMyIKLQogLyogU2V0IHRoaXMgaWYgeW91IHdhbnQgYSBwcmludG91dCBvZiB3aHkgdGhlIHN0YXRlIG1hY2hpbmUgd2FzIGhvc2VkCiAgICB3aGVuIGl0IGdldHMgaG9zZWQuICovCiAjZGVmaW5lIERFQlVHX0hPU0VEX1JFQVNPTgpAQCAtNDg5LDcgKzQ4Nyw2IEBACiAKIHN0cnVjdCBzaV9zbV9oYW5kbGVycyBrY3Nfc21pX2hhbmRsZXJzID0KIHsKLQkudmVyc2lvbiAgICAgICAgICAgPSBJUE1JX0tDU19WRVJTSU9OLAogCS5pbml0X2RhdGEgICAgICAgICA9IGluaXRfa2NzX2RhdGEsCiAJLnN0YXJ0X3RyYW5zYWN0aW9uID0gc3RhcnRfa2NzX3RyYW5zYWN0aW9uLAogCS5nZXRfcmVzdWx0ICAgICAgICA9IGdldF9rY3NfcmVzdWx0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwppbmRleCBlMTZjMTNmLi40NjMzNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwpAQCAtNDcsNyArNDcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAogI2RlZmluZSBQRlggIklQTUkgbWVzc2FnZSBoYW5kbGVyOiAiCi0jZGVmaW5lIElQTUlfTVNHSEFORExFUl9WRVJTSU9OICJ2MzMiCisKKyNkZWZpbmUgSVBNSV9EUklWRVJfVkVSU0lPTiAiMzYuMCIKIAogc3RhdGljIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICppcG1pX2FsbG9jX3JlY3ZfbXNnKHZvaWQpOwogc3RhdGljIGludCBpcG1pX2luaXRfbXNnaGFuZGxlcih2b2lkKTsKQEAgLTExNiw3ICsxMTcsNyBAQAogCWRvIHsJCQkJCQkJCVwKIAkJc2VxID0gKChtc2dpZCA+PiAyNikgJiAweDNmKTsJCQkJXAogCQlzZXFpZCA9IChtc2dpZCAmIDB4M2ZmZmZmKTsJCQkJXAotICAgICAgICB9IHdoaWxlKDApCisgICAgICAgIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgTkVYVF9TRVFJRChzZXFpZCkgKCgoc2VxaWQpICsgMSkgJiAweDNmZmZmZikKIApAQCAtMTI0LDYgKzEyNSwxNCBAQAogewogCXVuc2lnbmVkIGNoYXIgbWVkaXVtOwogCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2w7CisKKwkvKiBNeSBzbGF2ZSBhZGRyZXNzLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byBJUE1JX0JNQ19TTEFWRV9BRERSLAorCSAgIGJ1dCBtYXkgYmUgY2hhbmdlZCBieSB0aGUgdXNlci4gKi8KKwl1bnNpZ25lZCBjaGFyIGFkZHJlc3M7CisKKwkvKiBNeSBMVU4uICBUaGlzIHNob3VsZCBnZW5lcmFsbHkgc3RheSB0aGUgU01TIExVTiwgYnV0IGp1c3QgaW4KKwkgICBjYXNlLi4uICovCisJdW5zaWduZWQgY2hhciBsdW47CiB9OwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTEzNSw3ICsxNDQsNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgSVBNSV9JUE1CX05VTV9TRVEJNjQKLSNkZWZpbmUgSVBNSV9NQVhfQ0hBTk5FTFMgICAgICAgOAorI2RlZmluZSBJUE1JX01BWF9DSEFOTkVMUyAgICAgICAxNgogc3RydWN0IGlwbWlfc21pCiB7CiAJLyogV2hhdCBpbnRlcmZhY2UgbnVtYmVyIGFyZSB3ZT8gKi8KQEAgLTE5MywyMCArMjAyLDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfZXZlbnRzOwogCXVuc2lnbmVkIGludCAgICAgd2FpdGluZ19ldmVudHNfY291bnQ7IC8qIEhvdyBtYW55IGV2ZW50cyBpbiBxdWV1ZT8gKi8KIAotCS8qIFRoaXMgd2lsbCBiZSBub24tbnVsbCBpZiBzb21lb25lIHJlZ2lzdGVycyB0byByZWNlaXZlIGFsbAotCSAgIElQTUkgY29tbWFuZHMgKHRoaXMgaXMgZm9yIGludGVyZmFjZSBlbXVsYXRpb24pLiAgVGhlcmUKLQkgICBtYXkgbm90IGJlIGFueSB0aGluZ3MgaW4gdGhlIGNtZF9yY3ZycyBsaXN0IGFib3ZlIHdoZW4KLQkgICB0aGlzIGlzIHJlZ2lzdGVyZWQuICovCi0JaXBtaV91c2VyX3QgYWxsX2NtZF9yY3ZyOwotCi0JLyogTXkgc2xhdmUgYWRkcmVzcy4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gSVBNSV9CTUNfU0xBVkVfQUREUiwKLQkgICBidXQgbWF5IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuICovCi0JdW5zaWduZWQgY2hhciBteV9hZGRyZXNzOwotCi0JLyogTXkgTFVOLiAgVGhpcyBzaG91bGQgZ2VuZXJhbGx5IHN0YXkgdGhlIFNNUyBMVU4sIGJ1dCBqdXN0IGluCi0JICAgY2FzZS4uLiAqLwotCXVuc2lnbmVkIGNoYXIgbXlfbHVuOwotCiAJLyogVGhlIGV2ZW50IHJlY2VpdmVyIGZvciBteSBCTUMsIG9ubHkgcmVhbGx5IHVzZWQgYXQgcGFuaWMKIAkgICBzaHV0ZG93biBhcyBhIHBsYWNlIHRvIHN0b3JlIHRoaXMuICovCiAJdW5zaWduZWQgY2hhciBldmVudF9yZWNlaXZlcjsKQEAgLTIxOCw3ICsyMTMsNyBAQAogCSAgIGludGVyZmFjZSBjb21lcyBpbiB3aXRoIGEgTlVMTCB1c2VyLCBjYWxsIHRoaXMgcm91dGluZSB3aXRoCiAJICAgaXQuICBOb3RlIHRoYXQgdGhlIG1lc3NhZ2Ugd2lsbCBzdGlsbCBiZSBmcmVlZCBieSB0aGUKIAkgICBjYWxsZXIuICBUaGlzIG9ubHkgd29ya3Mgb24gdGhlIHN5c3RlbSBpbnRlcmZhY2UuICovCi0Jdm9pZCAoKm51bGxfdXNlcl9oYW5kbGVyKShpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3NtaV9tc2cgKm1zZyk7CisJdm9pZCAoKm51bGxfdXNlcl9oYW5kbGVyKShpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpOwogCiAJLyogV2hlbiB3ZSBhcmUgc2Nhbm5pbmcgdGhlIGNoYW5uZWxzIGZvciBhbiBTTUksIHRoaXMgd2lsbAogCSAgIHRlbGwgd2hpY2ggY2hhbm5lbCB3ZSBhcmUgc2Nhbm5pbmcuICovCkBAIC0zMjUsNyArMzIwLDcgQEAKIAlkb3duX3JlYWQoJmludGVyZmFjZXNfc2VtKTsKIAlkb3duX3dyaXRlKCZzbWlfd2F0Y2hlcnNfc2VtKTsKIAlsaXN0X2FkZCgmKHdhdGNoZXItPmxpbmspLCAmc21pX3dhdGNoZXJzKTsKLQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CiAJCWlmIChpcG1pX2ludGVyZmFjZXNbaV0gIT0gTlVMTCkgewogCQkJd2F0Y2hlci0+bmV3X3NtaShpKTsKIAkJfQpAQCAtNDU4LDcgKzQ1MywyNyBAQAogCiBzdGF0aWMgdm9pZCBkZWxpdmVyX3Jlc3BvbnNlKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCiB7Ci0JbXNnLT51c2VyLT5oYW5kbGVyLT5pcG1pX3JlY3ZfaG5kbChtc2csIG1zZy0+dXNlci0+aGFuZGxlcl9kYXRhKTsKKwlpZiAoISBtc2ctPnVzZXIpIHsKKwkJaXBtaV9zbWlfdCAgICBpbnRmID0gbXNnLT51c2VyX21zZ19kYXRhOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE5VTEwgdXNlcnMuICovCisJCWlmIChpbnRmLT5udWxsX3VzZXJfaGFuZGxlcikgeworCQkJaW50Zi0+bnVsbF91c2VyX2hhbmRsZXIoaW50ZiwgbXNnKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJCWludGYtPmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIGhhbmRsZXIsIHNvIGdpdmUgdXAuICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT51bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlpcG1pX2ZyZWVfcmVjdl9tc2cobXNnKTsKKwl9IGVsc2UgeworCQltc2ctPnVzZXItPmhhbmRsZXItPmlwbWlfcmVjdl9obmRsKG1zZywKKwkJCQkJCSAgIG1zZy0+dXNlci0+aGFuZGxlcl9kYXRhKTsKKwl9CiB9CiAKIC8qIEZpbmQgdGhlIG5leHQgc2VxdWVuY2UgbnVtYmVyIG5vdCBiZWluZyB1c2VkIGFuZCBhZGQgdGhlIGdpdmVuCkBAIC00NzUsOSArNDkwLDkgQEAKIAlpbnQgICAgICAgICAgcnYgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpPWludGYtPmN1cnJfc2VxOworCWZvciAoaSA9IGludGYtPmN1cnJfc2VxOwogCSAgICAgKGkrMSklSVBNSV9JUE1CX05VTV9TRVEgIT0gaW50Zi0+Y3Vycl9zZXE7Ci0JICAgICBpPShpKzEpJUlQTUlfSVBNQl9OVU1fU0VRKQorCSAgICAgaSA9IChpKzEpJUlQTUlfSVBNQl9OVU1fU0VRKQogCXsKIAkJaWYgKCEgaW50Zi0+c2VxX3RhYmxlW2ldLmludXNlKQogCQkJYnJlYWs7CkBAIC03MTIsNyArNzI3LDcgQEAKIAogCS8qIFJlbW92ZSB0aGUgdXNlciBmcm9tIHRoZSBpbnRlcmZhY2VzIHNlcXVlbmNlIHRhYmxlLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCYodXNlci0+aW50Zi0+c2VxX2xvY2spLCBmbGFncyk7Ci0JZm9yIChpPTA7IGk8SVBNSV9JUE1CX05VTV9TRVE7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBJUE1JX0lQTUJfTlVNX1NFUTsgaSsrKSB7CiAJCWlmICh1c2VyLT5pbnRmLT5zZXFfdGFibGVbaV0uaW51c2UKIAkJICAgICYmICh1c2VyLT5pbnRmLT5zZXFfdGFibGVbaV0ucmVjdl9tc2ctPnVzZXIgPT0gdXNlcikpCiAJCXsKQEAgLTc2NiwyNiArNzgxLDQ0IEBACiAJKm1pbm9yID0gdXNlci0+aW50Zi0+dmVyc2lvbl9taW5vcjsKIH0KIAotdm9pZCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKLQkJCSB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCitpbnQgaXBtaV9zZXRfbXlfYWRkcmVzcyhpcG1pX3VzZXJfdCAgIHVzZXIsCisJCQl1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCQl1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCiB7Ci0JdXNlci0+aW50Zi0+bXlfYWRkcmVzcyA9IGFkZHJlc3M7CisJaWYgKGNoYW5uZWwgPj0gSVBNSV9NQVhfQ0hBTk5FTFMpCisJCXJldHVybiAtRUlOVkFMOworCXVzZXItPmludGYtPmNoYW5uZWxzW2NoYW5uZWxdLmFkZHJlc3MgPSBhZGRyZXNzOworCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBjaGFyIGlwbWlfZ2V0X215X2FkZHJlc3MoaXBtaV91c2VyX3QgdXNlcikKK2ludCBpcG1pX2dldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJCXVuc2lnbmVkIGludCAgY2hhbm5lbCwKKwkJCXVuc2lnbmVkIGNoYXIgKmFkZHJlc3MpCiB7Ci0JcmV0dXJuIHVzZXItPmludGYtPm15X2FkZHJlc3M7CisJaWYgKGNoYW5uZWwgPj0gSVBNSV9NQVhfQ0hBTk5FTFMpCisJCXJldHVybiAtRUlOVkFMOworCSphZGRyZXNzID0gdXNlci0+aW50Zi0+Y2hhbm5lbHNbY2hhbm5lbF0uYWRkcmVzczsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBpcG1pX3NldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgTFVOKQoraW50IGlwbWlfc2V0X215X0xVTihpcG1pX3VzZXJfdCAgIHVzZXIsCisJCSAgICB1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCSAgICB1bnNpZ25lZCBjaGFyIExVTikKIHsKLQl1c2VyLT5pbnRmLT5teV9sdW4gPSBMVU4gJiAweDM7CisJaWYgKGNoYW5uZWwgPj0gSVBNSV9NQVhfQ0hBTk5FTFMpCisJCXJldHVybiAtRUlOVkFMOworCXVzZXItPmludGYtPmNoYW5uZWxzW2NoYW5uZWxdLmx1biA9IExVTiAmIDB4MzsKKwlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgY2hhciBpcG1pX2dldF9teV9MVU4oaXBtaV91c2VyX3QgdXNlcikKK2ludCBpcG1pX2dldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAorCQkgICAgdW5zaWduZWQgaW50ICBjaGFubmVsLAorCQkgICAgdW5zaWduZWQgY2hhciAqYWRkcmVzcykKIHsKLQlyZXR1cm4gdXNlci0+aW50Zi0+bXlfbHVuOworCWlmIChjaGFubmVsID49IElQTUlfTUFYX0NIQU5ORUxTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqYWRkcmVzcyA9IHVzZXItPmludGYtPmNoYW5uZWxzW2NoYW5uZWxdLmx1bjsKKwlyZXR1cm4gMDsKIH0KIAogaW50IGlwbWlfc2V0X2dldHNfZXZlbnRzKGlwbWlfdXNlcl90IHVzZXIsIGludCB2YWwpCkBAIC04MjgsMTEgKzg2MSw2IEBACiAKIAlyZWFkX2xvY2soJih1c2VyLT5pbnRmLT51c2Vyc19sb2NrKSk7CiAJd3JpdGVfbG9ja19pcnFzYXZlKCYodXNlci0+aW50Zi0+Y21kX3JjdnJfbG9jayksIGZsYWdzKTsKLQlpZiAodXNlci0+aW50Zi0+YWxsX2NtZF9yY3ZyICE9IE5VTEwpIHsKLQkJcnYgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAkvKiBNYWtlIHN1cmUgdGhlIGNvbW1hbmQvbmV0Zm4gaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtcCwgJih1c2VyLT5pbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7CiAJCWlmICgoY21wLT5uZXRmbiA9PSBuZXRmbikgJiYgKGNtcC0+Y21kID09IGNtZCkpIHsKQEAgLTg0Nyw3ICs4NzUsNyBAQAogCQlyY3ZyLT51c2VyID0gdXNlcjsKIAkJbGlzdF9hZGRfdGFpbCgmKHJjdnItPmxpbmspLCAmKHVzZXItPmludGYtPmNtZF9yY3ZycykpOwogCX0KLSBvdXRfdW5sb2NrOgorCiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJih1c2VyLT5pbnRmLT5jbWRfcmN2cl9sb2NrKSwgZmxhZ3MpOwogCXJlYWRfdW5sb2NrKCYodXNlci0+aW50Zi0+dXNlcnNfbG9jaykpOwogCkBAIC0xMjEzLDcgKzEyNDEsNyBAQAogCQl1bnNpZ25lZCBjaGFyICAgICAgICAgaXBtYl9zZXE7CiAJCWxvbmcgICAgICAgICAgICAgICAgICBzZXFpZDsKIAotCQlpZiAoYWRkci0+Y2hhbm5lbCA+IElQTUlfTlVNX0NIQU5ORUxTKSB7CisJCWlmIChhZGRyLT5jaGFubmVsID49IElQTUlfTlVNX0NIQU5ORUxTKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CiAJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwpAQCAtMTMzMSw3ICsxMzU5LDcgQEAKICNpZmRlZiBERUJVR19NU0dJTkcKIAl7CiAJCWludCBtOwotCQlmb3IgKG09MDsgbTxzbWlfbXNnLT5kYXRhX3NpemU7IG0rKykKKwkJZm9yIChtID0gMDsgbSA8IHNtaV9tc2ctPmRhdGFfc2l6ZTsgbSsrKQogCQkJcHJpbnRrKCIgJTIuMngiLCBzbWlfbXNnLT5kYXRhW21dKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KQEAgLTEzNDYsNiArMTM3NCwxOCBAQAogCXJldHVybiBydjsKIH0KIAorc3RhdGljIGludCBjaGVja19hZGRyKGlwbWlfc21pX3QgICAgICAgaW50ZiwKKwkJICAgICAgc3RydWN0IGlwbWlfYWRkciAqYWRkciwKKwkJICAgICAgdW5zaWduZWQgY2hhciAgICAqc2FkZHIsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgICAgKmx1bikKK3sKKwlpZiAoYWRkci0+Y2hhbm5lbCA+PSBJUE1JX01BWF9DSEFOTkVMUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJKmx1biA9IGludGYtPmNoYW5uZWxzW2FkZHItPmNoYW5uZWxdLmx1bjsKKwkqc2FkZHIgPSBpbnRmLT5jaGFubmVsc1thZGRyLT5jaGFubmVsXS5hZGRyZXNzOworCXJldHVybiAwOworfQorCiBpbnQgaXBtaV9yZXF1ZXN0X3NldHRpbWUoaXBtaV91c2VyX3QgICAgICB1c2VyLAogCQkJIHN0cnVjdCBpcG1pX2FkZHIgKmFkZHIsCiAJCQkgbG9uZyAgICAgICAgICAgICBtc2dpZCwKQEAgLTEzNTUsNiArMTM5NSwxNCBAQAogCQkJIGludCAgICAgICAgICAgICAgcmV0cmllcywKIAkJCSB1bnNpZ25lZCBpbnQgICAgIHJldHJ5X3RpbWVfbXMpCiB7CisJdW5zaWduZWQgY2hhciBzYWRkciwgbHVuOworCWludCAgICAgICAgICAgcnY7CisKKwlpZiAoISB1c2VyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlydiA9IGNoZWNrX2FkZHIodXNlci0+aW50ZiwgYWRkciwgJnNhZGRyLCAmbHVuKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKIAlyZXR1cm4gaV9pcG1pX3JlcXVlc3QodXNlciwKIAkJCSAgICAgIHVzZXItPmludGYsCiAJCQkgICAgICBhZGRyLApAQCAtMTM2Myw4ICsxNDExLDggQEAKIAkJCSAgICAgIHVzZXJfbXNnX2RhdGEsCiAJCQkgICAgICBOVUxMLCBOVUxMLAogCQkJICAgICAgcHJpb3JpdHksCi0JCQkgICAgICB1c2VyLT5pbnRmLT5teV9hZGRyZXNzLAotCQkJICAgICAgdXNlci0+aW50Zi0+bXlfbHVuLAorCQkJICAgICAgc2FkZHIsCisJCQkgICAgICBsdW4sCiAJCQkgICAgICByZXRyaWVzLAogCQkJICAgICAgcmV0cnlfdGltZV9tcyk7CiB9CkBAIC0xMzc4LDYgKzE0MjYsMTQgQEAKIAkJCSAgICAgc3RydWN0IGlwbWlfcmVjdl9tc2cgKnN1cHBsaWVkX3JlY3YsCiAJCQkgICAgIGludCAgICAgICAgICAgICAgICAgIHByaW9yaXR5KQogeworCXVuc2lnbmVkIGNoYXIgc2FkZHIsIGx1bjsKKwlpbnQgICAgICAgICAgIHJ2OworCisJaWYgKCEgdXNlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcnYgPSBjaGVja19hZGRyKHVzZXItPmludGYsIGFkZHIsICZzYWRkciwgJmx1bik7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CiAJcmV0dXJuIGlfaXBtaV9yZXF1ZXN0KHVzZXIsCiAJCQkgICAgICB1c2VyLT5pbnRmLAogCQkJICAgICAgYWRkciwKQEAgLTEzODcsOCArMTQ0Myw4IEBACiAJCQkgICAgICBzdXBwbGllZF9zbWksCiAJCQkgICAgICBzdXBwbGllZF9yZWN2LAogCQkJICAgICAgcHJpb3JpdHksCi0JCQkgICAgICB1c2VyLT5pbnRmLT5teV9hZGRyZXNzLAotCQkJICAgICAgdXNlci0+aW50Zi0+bXlfbHVuLAorCQkJICAgICAgc2FkZHIsCisJCQkgICAgICBsdW4sCiAJCQkgICAgICAtMSwgMCk7CiB9CiAKQEAgLTEzOTcsOCArMTQ1MywxNSBAQAogewogCWNoYXIgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CiAJaXBtaV9zbWlfdCBpbnRmID0gZGF0YTsKKwlpbnQgICAgICAgIGk7CisJaW50ICAgICAgICBydj0gMDsKIAotCXJldHVybiBzcHJpbnRmKG91dCwgIiV4XG4iLCBpbnRmLT5teV9hZGRyZXNzKTsKKwlmb3IgKGkgPSAwOyBpIDwgSVBNSV9NQVhfQ0hBTk5FTFM7IGkrKykKKwkJcnYgKz0gc3ByaW50ZihvdXQrcnYsICIleCAiLCBpbnRmLT5jaGFubmVsc1tpXS5hZGRyZXNzKTsKKwlvdXRbcnYtMV0gPSAnXG4nOyAvKiBSZXBsYWNlIHRoZSBmaW5hbCBzcGFjZSB3aXRoIGEgbmV3bGluZSAqLworCW91dFtydl0gPSAnXDAnOworCXJ2Kys7CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgaW50IHZlcnNpb25fZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCkBAIC0xNTg4LDI5ICsxNjUxLDMwIEBACiAJCQkgICAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc2ksCiAJCQkgICAgICAwLAogCQkJICAgICAgJm1zZywKLQkJCSAgICAgIE5VTEwsCisJCQkgICAgICBpbnRmLAogCQkJICAgICAgTlVMTCwKIAkJCSAgICAgIE5VTEwsCiAJCQkgICAgICAwLAotCQkJICAgICAgaW50Zi0+bXlfYWRkcmVzcywKLQkJCSAgICAgIGludGYtPm15X2x1biwKKwkJCSAgICAgIGludGYtPmNoYW5uZWxzWzBdLmFkZHJlc3MsCisJCQkgICAgICBpbnRmLT5jaGFubmVsc1swXS5sdW4sCiAJCQkgICAgICAtMSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1jaGFubmVsX2hhbmRsZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCitjaGFubmVsX2hhbmRsZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnKQogewogCWludCBydiA9IDA7CiAJaW50IGNoYW47CiAKLQlpZiAoKG1zZy0+cnNwWzBdID09IChJUE1JX05FVEZOX0FQUF9SRVNQT05TRSA8PCAyKSkKLQkgICAgJiYgKG1zZy0+cnNwWzFdID09IElQTUlfR0VUX0NIQU5ORUxfSU5GT19DTUQpKQorCWlmICgobXNnLT5hZGRyLmFkZHJfdHlwZSA9PSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFKQorCSAgICAmJiAobXNnLT5tc2cubmV0Zm4gPT0gSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UpCisJICAgICYmIChtc2ctPm1zZy5jbWQgPT0gSVBNSV9HRVRfQ0hBTk5FTF9JTkZPX0NNRCkpCiAJewogCQkvKiBJdCdzIHRoZSBvbmUgd2Ugd2FudCAqLwotCQlpZiAobXNnLT5yc3BbMl0gIT0gMCkgeworCQlpZiAobXNnLT5tc2cuZGF0YVswXSAhPSAwKSB7CiAJCQkvKiBHb3QgYW4gZXJyb3IgZnJvbSB0aGUgY2hhbm5lbCwganVzdCBnbyBvbi4gKi8KIAotCQkJaWYgKG1zZy0+cnNwWzJdID09IElQTUlfSU5WQUxJRF9DT01NQU5EX0VSUikgeworCQkJaWYgKG1zZy0+bXNnLmRhdGFbMF0gPT0gSVBNSV9JTlZBTElEX0NPTU1BTkRfRVJSKSB7CiAJCQkJLyogSWYgdGhlIE1DIGRvZXMgbm90IHN1cHBvcnQgdGhpcwogCQkJCSAgIGNvbW1hbmQsIHRoYXQgaXMgbGVnYWwuICBXZSBqdXN0CiAJCQkJICAgYXNzdW1lIGl0IGhhcyBvbmUgSVBNQiBhdCBjaGFubmVsCkBAIC0xNjI3LDEzICsxNjkxLDEzIEBACiAJCQl9CiAJCQlnb3RvIG5leHRfY2hhbm5lbDsKIAkJfQotCQlpZiAobXNnLT5yc3Bfc2l6ZSA8IDYpIHsKKwkJaWYgKG1zZy0+bXNnLmRhdGFfbGVuIDwgNCkgewogCQkJLyogTWVzc2FnZSBub3QgYmlnIGVub3VnaCwganVzdCBnbyBvbi4gKi8KIAkJCWdvdG8gbmV4dF9jaGFubmVsOwogCQl9CiAJCWNoYW4gPSBpbnRmLT5jdXJyX2NoYW5uZWw7Ci0JCWludGYtPmNoYW5uZWxzW2NoYW5dLm1lZGl1bSA9IG1zZy0+cnNwWzRdICYgMHg3ZjsKLQkJaW50Zi0+Y2hhbm5lbHNbY2hhbl0ucHJvdG9jb2wgPSBtc2ctPnJzcFs1XSAmIDB4MWY7CisJCWludGYtPmNoYW5uZWxzW2NoYW5dLm1lZGl1bSA9IG1zZy0+bXNnLmRhdGFbMl0gJiAweDdmOworCQlpbnRmLT5jaGFubmVsc1tjaGFuXS5wcm90b2NvbCA9IG1zZy0+bXNnLmRhdGFbM10gJiAweDFmOwogCiAJbmV4dF9jaGFubmVsOgogCQlpbnRmLT5jdXJyX2NoYW5uZWwrKzsKQEAgLTE2OTEsMjIgKzE3NTUsMjQgQEAKIAlydiA9IC1FTk9NRU07CiAKIAlkb3duX3dyaXRlKCZpbnRlcmZhY2VzX3NlbSk7Ci0JZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewogCQlpZiAoaXBtaV9pbnRlcmZhY2VzW2ldID09IE5VTEwpIHsKIAkJCW5ld19pbnRmLT5pbnRmX251bSA9IGk7CiAJCQluZXdfaW50Zi0+dmVyc2lvbl9tYWpvciA9IHZlcnNpb25fbWFqb3I7CiAJCQluZXdfaW50Zi0+dmVyc2lvbl9taW5vciA9IHZlcnNpb25fbWlub3I7Ci0JCQlpZiAoc2xhdmVfYWRkciA9PSAwKQotCQkJCW5ld19pbnRmLT5teV9hZGRyZXNzID0gSVBNSV9CTUNfU0xBVkVfQUREUjsKLQkJCWVsc2UKLQkJCQluZXdfaW50Zi0+bXlfYWRkcmVzcyA9IHNsYXZlX2FkZHI7Ci0JCQluZXdfaW50Zi0+bXlfbHVuID0gMjsgIC8qIHRoZSBTTVMgTFVOLiAqLworCQkJZm9yIChqID0gMDsgaiA8IElQTUlfTUFYX0NIQU5ORUxTOyBqKyspIHsKKwkJCQluZXdfaW50Zi0+Y2hhbm5lbHNbal0uYWRkcmVzcworCQkJCQk9IElQTUlfQk1DX1NMQVZFX0FERFI7CisJCQkJbmV3X2ludGYtPmNoYW5uZWxzW2pdLmx1biA9IDI7CisJCQl9CisJCQlpZiAoc2xhdmVfYWRkciAhPSAwKQorCQkJCW5ld19pbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzID0gc2xhdmVfYWRkcjsKIAkJCXJ3bG9ja19pbml0KCYobmV3X2ludGYtPnVzZXJzX2xvY2spKTsKIAkJCUlOSVRfTElTVF9IRUFEKCYobmV3X2ludGYtPnVzZXJzKSk7CiAJCQluZXdfaW50Zi0+aGFuZGxlcnMgPSBoYW5kbGVyczsKIAkJCW5ld19pbnRmLT5zZW5kX2luZm8gPSBzZW5kX2luZm87CiAJCQlzcGluX2xvY2tfaW5pdCgmKG5ld19pbnRmLT5zZXFfbG9jaykpOwotCQkJZm9yIChqPTA7IGo8SVBNSV9JUE1CX05VTV9TRVE7IGorKykgeworCQkJZm9yIChqID0gMDsgaiA8IElQTUlfSVBNQl9OVU1fU0VROyBqKyspIHsKIAkJCQluZXdfaW50Zi0+c2VxX3RhYmxlW2pdLmludXNlID0gMDsKIAkJCQluZXdfaW50Zi0+c2VxX3RhYmxlW2pdLnNlcWlkID0gMDsKIAkJCX0KQEAgLTE3MjIsNyArMTc4OCw2IEBACiAJCQlyd2xvY2tfaW5pdCgmKG5ld19pbnRmLT5jbWRfcmN2cl9sb2NrKSk7CiAJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXdfaW50Zi0+d2FpdHEpOwogCQkJSU5JVF9MSVNUX0hFQUQoJihuZXdfaW50Zi0+Y21kX3JjdnJzKSk7Ci0JCQluZXdfaW50Zi0+YWxsX2NtZF9yY3ZyID0gTlVMTDsKIAogCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+Y291bnRlcl9sb2NrKSk7CiAKQEAgLTE4MTQsNyArMTg3OSw3IEBACiAJZnJlZV9yZWN2X21zZ19saXN0KCYoaW50Zi0+d2FpdGluZ19ldmVudHMpKTsKIAlmcmVlX2NtZF9yY3ZyX2xpc3QoJihpbnRmLT5jbWRfcmN2cnMpKTsKIAotCWZvciAoaT0wOyBpPElQTUlfSVBNQl9OVU1fU0VROyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgSVBNSV9JUE1CX05VTV9TRVE7IGkrKykgewogCQlpZiAoKGludGYtPnNlcV90YWJsZVtpXS5pbnVzZSkKIAkJICAgICYmIChpbnRmLT5zZXFfdGFibGVbaV0ucmVjdl9tc2cpKQogCQl7CkBAIC0xODMzLDcgKzE4OTgsNyBAQAogCWRvd25fd3JpdGUoJmludGVyZmFjZXNfc2VtKTsKIAlpZiAobGlzdF9lbXB0eSgmKGludGYtPnVzZXJzKSkpCiAJewotCQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewogCQkJaWYgKGlwbWlfaW50ZXJmYWNlc1tpXSA9PSBpbnRmKSB7CiAJCQkJcmVtb3ZlX3Byb2NfZW50cmllcyhpbnRmKTsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7CkBAIC0xOTYwLDE1ICsyMDI1LDExIEBACiAKIAlyZWFkX2xvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CiAJCi0JaWYgKGludGYtPmFsbF9jbWRfcmN2cikgewotCQl1c2VyID0gaW50Zi0+YWxsX2NtZF9yY3ZyOwotCX0gZWxzZSB7Ci0JCS8qIEZpbmQgdGhlIGNvbW1hbmQvbmV0Zm4uICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkocmN2ciwgJihpbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7Ci0JCQlpZiAoKHJjdnItPm5ldGZuID09IG5ldGZuKSAmJiAocmN2ci0+Y21kID09IGNtZCkpIHsKLQkJCQl1c2VyID0gcmN2ci0+dXNlcjsKLQkJCQlicmVhazsKLQkJCX0KKwkvKiBGaW5kIHRoZSBjb21tYW5kL25ldGZuLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmN2ciwgJihpbnRmLT5jbWRfcmN2cnMpLCBsaW5rKSB7CisJCWlmICgocmN2ci0+bmV0Zm4gPT0gbmV0Zm4pICYmIChyY3ZyLT5jbWQgPT0gY21kKSkgeworCQkJdXNlciA9IHJjdnItPnVzZXI7CisJCQlicmVhazsKIAkJfQogCX0KIAlyZWFkX3VubG9jaygmKGludGYtPmNtZF9yY3ZyX2xvY2spKTsKQEAgLTE5ODUsNyArMjA0Niw3IEBACiAJCW1zZy0+ZGF0YVszXSA9IG1zZy0+cnNwWzZdOwogICAgICAgICAgICAgICAgIG1zZy0+ZGF0YVs0XSA9ICgobmV0Zm4gKyAxKSA8PCAyKSB8IChtc2ctPnJzcFs3XSAmIDB4Myk7CiAJCW1zZy0+ZGF0YVs1XSA9IGlwbWJfY2hlY2tzdW0oJihtc2ctPmRhdGFbM10pLCAyKTsKLQkJbXNnLT5kYXRhWzZdID0gaW50Zi0+bXlfYWRkcmVzczsKKwkJbXNnLT5kYXRhWzZdID0gaW50Zi0+Y2hhbm5lbHNbbXNnLT5yc3BbM10gJiAweGZdLmFkZHJlc3M7CiAgICAgICAgICAgICAgICAgLyogcnFzZXEvbHVuICovCiAgICAgICAgICAgICAgICAgbXNnLT5kYXRhWzddID0gKG1zZy0+cnNwWzddICYgMHhmYykgfCAobXNnLT5yc3BbNF0gJiAweDMpOwogCQltc2ctPmRhdGFbOF0gPSBtc2ctPnJzcFs4XTsgLyogY21kICovCkBAIC0xOTk3LDcgKzIwNTgsNyBAQAogCXsKIAkJaW50IG07CiAJCXByaW50aygiSW52YWxpZCBjb21tYW5kOiIpOwotCQlmb3IgKG09MDsgbTxtc2ctPmRhdGFfc2l6ZTsgbSsrKQorCQlmb3IgKG0gPSAwOyBtIDwgbXNnLT5kYXRhX3NpemU7IG0rKykKIAkJCXByaW50aygiICUyLjJ4IiwgbXNnLT5kYXRhW21dKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KQEAgLTIxNDUsMTUgKzIyMDYsMTEgQEAKIAogCXJlYWRfbG9jaygmKGludGYtPmNtZF9yY3ZyX2xvY2spKTsKIAotCWlmIChpbnRmLT5hbGxfY21kX3JjdnIpIHsKLQkJdXNlciA9IGludGYtPmFsbF9jbWRfcmN2cjsKLQl9IGVsc2UgewotCQkvKiBGaW5kIHRoZSBjb21tYW5kL25ldGZuLiAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYoaW50Zi0+Y21kX3JjdnJzKSwgbGluaykgewotCQkJaWYgKChyY3ZyLT5uZXRmbiA9PSBuZXRmbikgJiYgKHJjdnItPmNtZCA9PSBjbWQpKSB7Ci0JCQkJdXNlciA9IHJjdnItPnVzZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJLyogRmluZCB0aGUgY29tbWFuZC9uZXRmbi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJjdnIsICYoaW50Zi0+Y21kX3JjdnJzKSwgbGluaykgeworCQlpZiAoKHJjdnItPm5ldGZuID09IG5ldGZuKSAmJiAocmN2ci0+Y21kID09IGNtZCkpIHsKKwkJCXVzZXIgPSByY3ZyLT51c2VyOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmVhZF91bmxvY2soJihpbnRmLT5jbWRfcmN2cl9sb2NrKSk7CkBAIC0yMzMwLDYgKzIzODcsMTQgQEAKIAl1bnNpZ25lZCBsb25nICAgICAgICBmbGFnczsKIAogCXJlY3ZfbXNnID0gKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICopIG1zZy0+dXNlcl9kYXRhOworCWlmIChyZWN2X21zZyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyJJUE1JIG1lc3NhZ2UgcmVjZWl2ZWQgd2l0aCBubyBvd25lci4gVGhpc1xuIgorCQkJImNvdWxkIGJlIGJlY2F1c2Ugb2YgYSBtYWxmb3JtZWQgbWVzc2FnZSwgb3JcbiIKKwkJCSJiZWNhdXNlIG9mIGEgaGFyZHdhcmUgZXJyb3IuICBDb250YWN0IHlvdXJcbiIKKwkJCSJoYXJkd2FyZSB2ZW5kZXIgZm9yIGFzc2lzdGFuY2VcbiIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHVzZXIgc3RpbGwgZXhpc3RzLiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkodXNlciwgJihpbnRmLT51c2VycyksIGxpbmspIHsKQEAgLTIzNDAsMTkgKzI0MDUsMTEgQEAKIAkJfQogCX0KIAotCWlmICghZm91bmQpIHsKLQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgTlVMTCB1c2Vycy4gKi8KLQkJaWYgKCFyZWN2X21zZy0+dXNlciAmJiBpbnRmLT5udWxsX3VzZXJfaGFuZGxlcil7Ci0JCQlpbnRmLT5udWxsX3VzZXJfaGFuZGxlcihpbnRmLCBtc2cpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwotCQkJaW50Zi0+aGFuZGxlZF9sb2NhbF9yZXNwb25zZXMrKzsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwotCQl9ZWxzZXsKLQkJCS8qIFRoZSB1c2VyIGZvciB0aGUgbWVzc2FnZSB3ZW50IGF3YXksIHNvIGdpdmUgdXAuICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7Ci0JCQlpbnRmLT51bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKLQkJfQorCWlmICgoISBmb3VuZCkgJiYgcmVjdl9tc2ctPnVzZXIpIHsKKwkJLyogVGhlIHVzZXIgZm9yIHRoZSBtZXNzYWdlIHdlbnQgYXdheSwgc28gZ2l2ZSB1cC4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlpbnRmLT51bmhhbmRsZWRfbG9jYWxfcmVzcG9uc2VzKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwogCQlpcG1pX2ZyZWVfcmVjdl9tc2cocmVjdl9tc2cpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBpcG1pX3N5c3RlbV9pbnRlcmZhY2VfYWRkciAqc21pX2FkZHI7CkBAIC0yMzkyLDcgKzI0NDksNyBAQAogI2lmZGVmIERFQlVHX01TR0lORwogCWludCBtOwogCXByaW50aygiUmVjdjoiKTsKLQlmb3IgKG09MDsgbTxtc2ctPnJzcF9zaXplOyBtKyspCisJZm9yIChtID0gMDsgbSA8IG1zZy0+cnNwX3NpemU7IG0rKykKIAkJcHJpbnRrKCIgJTIuMngiLCBtc2ctPnJzcFttXSk7CiAJcHJpbnRrKCJcbiIpOwogI2VuZGlmCkBAIC0yNjI2LDcgKzI2ODMsNyBAQAogCXsKIAkJaW50IG07CiAJCXByaW50aygiUmVzZW5kOiAiKTsKLQkJZm9yIChtPTA7IG08c21pX21zZy0+ZGF0YV9zaXplOyBtKyspCisJCWZvciAobSA9IDA7IG0gPCBzbWlfbXNnLT5kYXRhX3NpemU7IG0rKykKIAkJCXByaW50aygiICUyLjJ4Iiwgc21pX21zZy0+ZGF0YVttXSk7CiAJCXByaW50aygiXG4iKTsKIAl9CkBAIC0yNjQ3LDcgKzI3MDQsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZ0aW1lb3V0cyk7CiAKIAlzcGluX2xvY2soJmludGVyZmFjZXNfbG9jayk7Ci0JZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewogCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOwogCQlpZiAoaW50ZiA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC0yNjcyLDcgKzI3MjksNyBAQAogCQkgICBoYXZlIHRpbWVkIG91dCwgcHV0dGluZyB0aGVtIGluIHRoZSB0aW1lb3V0cwogCQkgICBsaXN0LiAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmKGludGYtPnNlcV9sb2NrKSwgZmxhZ3MpOwotCQlmb3IgKGo9MDsgajxJUE1JX0lQTUJfTlVNX1NFUTsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBJUE1JX0lQTUJfTlVNX1NFUTsgaisrKSB7CiAJCQlzdHJ1Y3Qgc2VxX3RhYmxlICplbnQgPSAmKGludGYtPnNlcV90YWJsZVtqXSk7CiAJCQlpZiAoIWVudC0+aW51c2UpCiAJCQkJY29udGludWU7CkBAIC0yNzEyLDcgKzI3NjksNyBAQAogCQkJCXNwaW5fdW5sb2NrKCZpbnRmLT5jb3VudGVyX2xvY2spOwogCQkJCXNtaV9tc2cgPSBzbWlfZnJvbV9yZWN2X21zZyhpbnRmLAogCQkJCQkJZW50LT5yZWN2X21zZywgaiwgZW50LT5zZXFpZCk7Ci0JCQkJaWYoIXNtaV9tc2cpCisJCQkJaWYgKCEgc21pX21zZykKIAkJCQkJY29udGludWU7CiAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLGZsYWdzKTsKQEAgLTI3NDMsNyArMjgwMCw3IEBACiAJaW50ICAgICAgICBpOwogCiAJc3Bpbl9sb2NrKCZpbnRlcmZhY2VzX2xvY2spOwotCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKIAkJaWYgKGludGYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpAQCAtMjgzOCwyOCArMjg5NSwzMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX0lQTUlfUEFOSUNfU1RSSU5HCi1zdGF0aWMgdm9pZCBldmVudF9yZWNlaXZlcl9mZXRjaGVyKGlwbWlfc21pX3QgaW50Ziwgc3RydWN0IGlwbWlfc21pX21zZyAqbXNnKQorc3RhdGljIHZvaWQgZXZlbnRfcmVjZWl2ZXJfZmV0Y2hlcihpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCiB7Ci0JaWYgKChtc2ctPnJzcFswXSA9PSAoSVBNSV9ORVRGTl9TRU5TT1JfRVZFTlRfUkVTUE9OU0UgPDwgMikpCi0JICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9FVkVOVF9SRUNFSVZFUl9DTUQpCi0JICAgICYmIChtc2ctPnJzcFsyXSA9PSBJUE1JX0NDX05PX0VSUk9SKSkKKwlpZiAoKG1zZy0+YWRkci5hZGRyX3R5cGUgPT0gSVBNSV9TWVNURU1fSU5URVJGQUNFX0FERFJfVFlQRSkKKwkgICAgJiYgKG1zZy0+bXNnLm5ldGZuID09IElQTUlfTkVURk5fU0VOU09SX0VWRU5UX1JFU1BPTlNFKQorCSAgICAmJiAobXNnLT5tc2cuY21kID09IElQTUlfR0VUX0VWRU5UX1JFQ0VJVkVSX0NNRCkKKwkgICAgJiYgKG1zZy0+bXNnLmRhdGFbMF0gPT0gSVBNSV9DQ19OT19FUlJPUikpCiAJewogCQkvKiBBIGdldCBldmVudCByZWNlaXZlciBjb21tYW5kLCBzYXZlIGl0LiAqLwotCQlpbnRmLT5ldmVudF9yZWNlaXZlciA9IG1zZy0+cnNwWzNdOwotCQlpbnRmLT5ldmVudF9yZWNlaXZlcl9sdW4gPSBtc2ctPnJzcFs0XSAmIDB4MzsKKwkJaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgPSBtc2ctPm1zZy5kYXRhWzFdOworCQlpbnRmLT5ldmVudF9yZWNlaXZlcl9sdW4gPSBtc2ctPm1zZy5kYXRhWzJdICYgMHgzOwogCX0KIH0KIAotc3RhdGljIHZvaWQgZGV2aWNlX2lkX2ZldGNoZXIoaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cpCitzdGF0aWMgdm9pZCBkZXZpY2VfaWRfZmV0Y2hlcihpcG1pX3NtaV90IGludGYsIHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCiB7Ci0JaWYgKChtc2ctPnJzcFswXSA9PSAoSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UgPDwgMikpCi0JICAgICYmIChtc2ctPnJzcFsxXSA9PSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01EKQotCSAgICAmJiAobXNnLT5yc3BbMl0gPT0gSVBNSV9DQ19OT19FUlJPUikpCisJaWYgKChtc2ctPmFkZHIuYWRkcl90eXBlID09IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUpCisJICAgICYmIChtc2ctPm1zZy5uZXRmbiA9PSBJUE1JX05FVEZOX0FQUF9SRVNQT05TRSkKKwkgICAgJiYgKG1zZy0+bXNnLmNtZCA9PSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01EKQorCSAgICAmJiAobXNnLT5tc2cuZGF0YVswXSA9PSBJUE1JX0NDX05PX0VSUk9SKSkKIAl7CiAJCS8qIEEgZ2V0IGRldmljZSBpZCBjb21tYW5kLCBzYXZlIGlmIHdlIGFyZSBhbiBldmVudAogCQkgICByZWNlaXZlciBvciBnZW5lcmF0b3IuICovCi0JCWludGYtPmxvY2FsX3NlbF9kZXZpY2UgPSAobXNnLT5yc3BbOF0gPj4gMikgJiAxOwotCQlpbnRmLT5sb2NhbF9ldmVudF9nZW5lcmF0b3IgPSAobXNnLT5yc3BbOF0gPj4gNSkgJiAxOworCQlpbnRmLT5sb2NhbF9zZWxfZGV2aWNlID0gKG1zZy0+bXNnLmRhdGFbNl0gPj4gMikgJiAxOworCQlpbnRmLT5sb2NhbF9ldmVudF9nZW5lcmF0b3IgPSAobXNnLT5tc2cuZGF0YVs2XSA+PiA1KSAmIDE7CiAJfQogfQogI2VuZGlmCkBAIC0yOTAzLDcgKzI5NjIsNyBAQAogCXJlY3ZfbXNnLmRvbmUgPSBkdW1teV9yZWN2X2RvbmVfaGFuZGxlcjsKIAogCS8qIEZvciBldmVyeSByZWdpc3RlcmVkIGludGVyZmFjZSwgc2VuZCB0aGUgZXZlbnQuICovCi0JZm9yIChpPTA7IGk8TUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewogCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOwogCQlpZiAoaW50ZiA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC0yOTE1LDEyICsyOTc0LDEyIEBACiAJCQkgICAgICAgJmFkZHIsCiAJCQkgICAgICAgMCwKIAkJCSAgICAgICAmbXNnLAotCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgaW50ZiwKIAkJCSAgICAgICAmc21pX21zZywKIAkJCSAgICAgICAmcmVjdl9tc2csCiAJCQkgICAgICAgMCwKLQkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAotCQkJICAgICAgIGludGYtPm15X2x1biwKKwkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzLAorCQkJICAgICAgIGludGYtPmNoYW5uZWxzWzBdLmx1biwKIAkJCSAgICAgICAwLCAxKTsgLyogRG9uJ3QgcmV0cnksIGFuZCBkb24ndCB3YWl0LiAqLwogCX0KIApAQCAtMjkzMCw3ICsyOTg5LDcgQEAKIAlpZiAoIXN0cikgCiAJCXJldHVybjsKIAotCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJY2hhciAgICAgICAgICAgICAgICAgICpwID0gc3RyOwogCQlzdHJ1Y3QgaXBtaV9pcG1iX2FkZHIgKmlwbWI7CiAJCWludCAgICAgICAgICAgICAgICAgICBqOwpAQCAtMjk2MSwxMiArMzAyMCwxMiBAQAogCQkJICAgICAgICZhZGRyLAogCQkJICAgICAgIDAsCiAJCQkgICAgICAgJm1zZywKLQkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIGludGYsCiAJCQkgICAgICAgJnNtaV9tc2csCiAJCQkgICAgICAgJnJlY3ZfbXNnLAogCQkJICAgICAgIDAsCi0JCQkgICAgICAgaW50Zi0+bXlfYWRkcmVzcywKLQkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkgICAgICAgaW50Zi0+Y2hhbm5lbHNbMF0uYWRkcmVzcywKKwkJCSAgICAgICBpbnRmLT5jaGFubmVsc1swXS5sdW4sCiAJCQkgICAgICAgMCwgMSk7IC8qIERvbid0IHJldHJ5LCBhbmQgZG9uJ3Qgd2FpdC4gKi8KIAogCQlpZiAoaW50Zi0+bG9jYWxfZXZlbnRfZ2VuZXJhdG9yKSB7CkBAIC0yOTgxLDEyICszMDQwLDEyIEBACiAJCQkJICAgICAgICZhZGRyLAogCQkJCSAgICAgICAwLAogCQkJCSAgICAgICAmbXNnLAotCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICBpbnRmLAogCQkJCSAgICAgICAmc21pX21zZywKIAkJCQkgICAgICAgJnJlY3ZfbXNnLAogCQkJCSAgICAgICAwLAotCQkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAotCQkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkJICAgICAgIGludGYtPmNoYW5uZWxzWzBdLmFkZHJlc3MsCisJCQkJICAgICAgIGludGYtPmNoYW5uZWxzWzBdLmx1biwKIAkJCQkgICAgICAgMCwgMSk7IC8qIG5vIHJldHJ5LCBhbmQgbm8gd2FpdC4gKi8KIAkJfQogCQlpbnRmLT5udWxsX3VzZXJfaGFuZGxlciA9IE5VTEw7CkBAIC0yOTk2LDcgKzMwNTUsNyBAQAogCQkgICBiZSB6ZXJvLCBhbmQgaXQgbXVzdCBub3QgYmUgbXkgYWRkcmVzcy4gKi8KICAgICAgICAgICAgICAgICBpZiAoKChpbnRmLT5ldmVudF9yZWNlaXZlciAmIDEpID09IDApCiAJCSAgICAmJiAoaW50Zi0+ZXZlbnRfcmVjZWl2ZXIgIT0gMCkKLQkJICAgICYmIChpbnRmLT5ldmVudF9yZWNlaXZlciAhPSBpbnRmLT5teV9hZGRyZXNzKSkKKwkJICAgICYmIChpbnRmLT5ldmVudF9yZWNlaXZlciAhPSBpbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzKSkKIAkJewogCQkJLyogVGhlIGV2ZW50IHJlY2VpdmVyIGlzIHZhbGlkLCBzZW5kIGFuIElQTUIKIAkJCSAgIG1lc3NhZ2UuICovCkBAIC0zMDMxLDcgKzMwOTAsNyBAQAogCQkJZGF0YVswXSA9IDA7CiAJCQlkYXRhWzFdID0gMDsKIAkJCWRhdGFbMl0gPSAweGYwOyAvKiBPRU0gZXZlbnQgd2l0aG91dCB0aW1lc3RhbXAuICovCi0JCQlkYXRhWzNdID0gaW50Zi0+bXlfYWRkcmVzczsKKwkJCWRhdGFbM10gPSBpbnRmLT5jaGFubmVsc1swXS5hZGRyZXNzOwogCQkJZGF0YVs0XSA9IGorKzsgLyogc2VxdWVuY2UgIyAqLwogCQkJLyogQWx3YXlzIGdpdmUgMTEgYnl0ZXMsIHNvIHN0cm5jcHkgd2lsbCBmaWxsCiAJCQkgICBpdCB3aXRoIHplcm9lcyBmb3IgbWUuICovCkBAIC0zMDQzLDEyICszMTAyLDEyIEBACiAJCQkJICAgICAgICZhZGRyLAogCQkJCSAgICAgICAwLAogCQkJCSAgICAgICAmbXNnLAotCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICBpbnRmLAogCQkJCSAgICAgICAmc21pX21zZywKIAkJCQkgICAgICAgJnJlY3ZfbXNnLAogCQkJCSAgICAgICAwLAotCQkJCSAgICAgICBpbnRmLT5teV9hZGRyZXNzLAotCQkJCSAgICAgICBpbnRmLT5teV9sdW4sCisJCQkJICAgICAgIGludGYtPmNoYW5uZWxzWzBdLmFkZHJlc3MsCisJCQkJICAgICAgIGludGYtPmNoYW5uZWxzWzBdLmx1biwKIAkJCQkgICAgICAgMCwgMSk7IC8qIG5vIHJldHJ5LCBhbmQgbm8gd2FpdC4gKi8KIAkJfQogCX0JCkBAIC0zMDcwLDcgKzMxMjksNyBAQAogCWhhc19wYW5pY2VkID0gMTsKIAogCS8qIEZvciBldmVyeSByZWdpc3RlcmVkIGludGVyZmFjZSwgc2V0IGl0IHRvIHJ1biB0byBjb21wbGV0aW9uLiAqLwotCWZvciAoaT0wOyBpPE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKIAkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKIAkJaWYgKGludGYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpAQCAtMzA5OSw5ICszMTU4LDkgQEAKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJpcG1pIG1lc3NhZ2UgaGFuZGxlciB2ZXJzaW9uICIKLQkgICAgICAgSVBNSV9NU0dIQU5ETEVSX1ZFUlNJT04gIlxuIik7CisJICAgICAgIElQTUlfRFJJVkVSX1ZFUlNJT04gIlxuIik7CiAKLQlmb3IgKGk9MDsgaTxNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKSB7CiAJCWlwbWlfaW50ZXJmYWNlc1tpXSA9IE5VTEw7CiAJfQogCkBAIC0zMTcxLDYgKzMyMzAsOSBAQAogCiBtb2R1bGVfaW5pdChpcG1pX2luaXRfbXNnaGFuZGxlcl9tb2QpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbmNvbWluZyBhbmQgb3V0Z29pbmcgbWVzc2FnZSByb3V0aW5nIGZvciBhbiBJUE1JIGludGVyZmFjZS4iKTsKK01PRFVMRV9WRVJTSU9OKElQTUlfRFJJVkVSX1ZFUlNJT04pOwogCiBFWFBPUlRfU1lNQk9MKGlwbWlfY3JlYXRlX3VzZXIpOwogRVhQT1JUX1NZTUJPTChpcG1pX2Rlc3Ryb3lfdXNlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKaW5kZXggZjk1MWMzMC4uZTgyYTk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CiAKICNkZWZpbmUgUEZYICJJUE1JIHBvd2Vyb2ZmOiAiCi0jZGVmaW5lIElQTUlfUE9XRVJPRkZfVkVSU0lPTgkidjMzIgogCiAvKiBXaGVyZSB0byB3ZSBpbnNlcnQgb3VyIHBvd2Vyb2ZmIGZ1bmN0aW9uPyAqLwogZXh0ZXJuIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOwpAQCAtNTMsMTYgKzUyLDE3IEBACiAjZGVmaW5lIElQTUlfQ0hBU1NJU19QT1dFUl9DWUNMRQkweDAyCS8qIHBvd2VyIGN5Y2xlICovCiAKIC8qIHRoZSBJUE1JIGRhdGEgY29tbWFuZCAqLwotc3RhdGljIGludCBwb3dlcm9mZl9jb250cm9sID0gSVBNSV9DSEFTU0lTX1BPV0VSX0RPV047CitzdGF0aWMgaW50IHBvd2Vyb2ZmX3Bvd2VyY3ljbGU7CiAKIC8qIHBhcmFtZXRlciBkZWZpbml0aW9uIHRvIGFsbG93IHVzZXIgdG8gZmxhZyBwb3dlciBjeWNsZSAqLwotbW9kdWxlX3BhcmFtKHBvd2Vyb2ZmX2NvbnRyb2wsIGludCwgSVBNSV9DSEFTU0lTX1BPV0VSX0RPV04pOwotTU9EVUxFX1BBUk1fREVTQyhwb3dlcm9mZl9jb250cm9sLCAiIFNldCB0byAyIHRvIGVuYWJsZSBwb3dlciBjeWNsZSBpbnN0ZWFkIG9mIHBvd2VyIGRvd24uIFBvd2VyIGN5Y2xlIGlzIGNvbnRpbmdlbnQgb24gaGFyZHdhcmUgc3VwcG9ydCwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIGJhY2sgdG8gcG93ZXIgZG93bi4iKTsKK21vZHVsZV9wYXJhbShwb3dlcm9mZl9wb3dlcmN5Y2xlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcm9mZl9wb3dlcmN5Y2xlcywgIiBTZXQgdG8gbm9uLXplcm8gdG8gZW5hYmxlIHBvd2VyIGN5Y2xlIGluc3RlYWQgb2YgcG93ZXIgZG93bi4gUG93ZXIgY3ljbGUgaXMgY29udGluZ2VudCBvbiBoYXJkd2FyZSBzdXBwb3J0LCBvdGhlcndpc2UgaXQgZGVmYXVsdHMgYmFjayB0byBwb3dlciBkb3duLiIpOwogCiAvKiBTdHVmZiBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkIGNvbW1hbmQuICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG1mZ19pZDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJvZF9pZDsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllczsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlwbWlfdmVyc2lvbjsKIAogLyogV2UgdXNlIG91ciBvd24gbWVzc2FnZXMgZm9yIHRoaXMgb3BlcmF0aW9uLCB3ZSBkb24ndCBsZXQgdGhlIHN5c3RlbQogICAgYWxsb2NhdGUgdGhlbSwgc2luY2Ugd2UgbWF5IGJlIGluIGEgcGFuaWMgc2l0dWF0aW9uLiAgVGhlIHdob2xlCkBAIC0zMzgsNiArMzM4LDI1IEBACiB9CiAKIC8qCisgKiBpcG1pX2RlbGxfY2hhc3Npc19kZXRlY3QoKQorICogRGVsbCBzeXN0ZW1zIHdpdGggSVBNSSA8IDEuNSBkb24ndCBzZXQgdGhlIGNoYXNzaXMgY2FwYWJpbGl0eSBiaXQKKyAqIGJ1dCB0aGV5IGNhbiBoYW5kbGUgYSBjaGFzc2lzIHBvd2Vyb2ZmIG9yIHBvd2VyY3ljbGUgY29tbWFuZC4KKyAqLworCisjZGVmaW5lIERFTExfSUFOQV9NRlJfSUQgezB4QTIsIDB4MDIsIDB4MDB9CitzdGF0aWMgaW50IGlwbWlfZGVsbF9jaGFzc2lzX2RldGVjdCAoaXBtaV91c2VyX3QgdXNlcikKK3sKKwljb25zdCBjaGFyIGlwbWlfdmVyc2lvbl9tYWpvciA9IGlwbWlfdmVyc2lvbiAmIDB4RjsKKwljb25zdCBjaGFyIGlwbWlfdmVyc2lvbl9taW5vciA9IChpcG1pX3ZlcnNpb24gPj4gNCkgJiAweEY7CisJY29uc3QgY2hhciBtZnJbM109REVMTF9JQU5BX01GUl9JRDsKKwlpZiAoIW1lbWNtcChtZnIsICZtZmdfaWQsIHNpemVvZihtZnIpKSAmJgorCSAgICBpcG1pX3ZlcnNpb25fbWFqb3IgPD0gMSAmJgorCSAgICBpcG1pX3ZlcnNpb25fbWlub3IgPCA1KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFN0YW5kYXJkIGNoYXNzaXMgc3VwcG9ydAogICovCiAKQEAgLTM2NiwzNyArMzg1LDM0IEBACiAKICBwb3dlcmN5Y2xlZmFpbGVkOgogCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlcmluZyAlcyB2aWEgSVBNSSBjaGFzc2lzIGNvbnRyb2wgY29tbWFuZFxuIiwKLQkJKChwb3dlcm9mZl9jb250cm9sICE9IElQTUlfQ0hBU1NJU19QT1dFUl9DWUNMRSkgPyAiZG93biIgOiAiY3ljbGUiKSk7CisJCShwb3dlcm9mZl9wb3dlcmN5Y2xlID8gImN5Y2xlIiA6ICJkb3duIikpOwogCiAJLyoKIAkgKiBQb3dlciBkb3duCiAJICovCiAJc2VuZF9tc2cubmV0Zm4gPSBJUE1JX05FVEZOX0NIQVNTSVNfUkVRVUVTVDsKIAlzZW5kX21zZy5jbWQgPSBJUE1JX0NIQVNTSVNfQ09OVFJPTF9DTUQ7Ci0JZGF0YVswXSA9IHBvd2Vyb2ZmX2NvbnRyb2w7CisJaWYgKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUpCisJCWRhdGFbMF0gPSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEU7CisJZWxzZQorCQlkYXRhWzBdID0gSVBNSV9DSEFTU0lTX1BPV0VSX0RPV047CiAJc2VuZF9tc2cuZGF0YSA9IGRhdGE7CiAJc2VuZF9tc2cuZGF0YV9sZW4gPSBzaXplb2YoZGF0YSk7CiAJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAogCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAogCQkJCSAgICAgJnNlbmRfbXNnKTsKIAlpZiAocnYpIHsKLQkJc3dpdGNoIChwb3dlcm9mZl9jb250cm9sKSB7Ci0JCQljYXNlIElQTUlfQ0hBU1NJU19QT1dFUl9DWUNMRToKLQkJCQkvKiBwb3dlciBjeWNsZSBmYWlsZWQsIGRlZmF1bHQgdG8gcG93ZXIgZG93biAqLwotCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIGNoYXNzaXMgcG93ZXIgIiBcCi0JCQkJCSJjeWNsZSBtZXNzYWdlLCBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKLQkJCQlwb3dlcm9mZl9jb250cm9sID0gSVBNSV9DSEFTU0lTX1BPV0VSX0RPV047Ci0JCQkJZ290byBwb3dlcmN5Y2xlZmFpbGVkOwotCi0JCQljYXNlIElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOgotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyICIgXAotCQkJCQkiZG93biBtZXNzYWdlLCBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKLQkJCQlicmVhazsKKwkJaWYgKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUpIHsKKwkJCS8qIHBvd2VyIGN5Y2xlIGZhaWxlZCwgZGVmYXVsdCB0byBwb3dlciBkb3duICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyICIgXAorCQkJICAgICAgICJjeWNsZSBtZXNzYWdlLCBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKKwkJCXBvd2Vyb2ZmX3Bvd2VyY3ljbGUgPSAwOworCQkJZ290byBwb3dlcmN5Y2xlZmFpbGVkOwogCQl9Ci0JfQogCi0JcmV0dXJuOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyICIgXAorCQkgICAgICAgImRvd24gbWVzc2FnZSwgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJfQogfQogCiAKQEAgLTQxNCw2ICs0MzAsOSBAQAogCXsgLnBsYXRmb3JtX3R5cGUJPSAiQ1BJMSIsCiAJICAuZGV0ZWN0CQk9IGlwbWlfY3BpMV9kZXRlY3QsCiAJICAucG93ZXJvZmZfZnVuYwk9IGlwbWlfcG93ZXJvZmZfY3BpMSB9LAorCXsgLnBsYXRmb3JtX3R5cGUJPSAiY2hhc3NpcyIsCisJICAuZGV0ZWN0CQk9IGlwbWlfZGVsbF9jaGFzc2lzX2RldGVjdCwKKwkgIC5wb3dlcm9mZl9mdW5jCT0gaXBtaV9wb3dlcm9mZl9jaGFzc2lzIH0sCiAJLyogQ2hhc3NpcyBzaG91bGQgZ2VuZXJhbGx5IGJlIGxhc3QsIG90aGVyIHRoaW5ncyBzaG91bGQgb3ZlcnJpZGUKIAkgICBpdC4gKi8KIAl7IC5wbGF0Zm9ybV90eXBlCT0gImNoYXNzaXMiLApAQCAtNDk5LDEwICs1MTgsMTEgQEAKIAlwcm9kX2lkID0gKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMTBdCiAJCSAgIHwgKGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbMTFdIDw8IDgpKTsKIAljYXBhYmlsaXRpZXMgPSBoYWx0X3JlY3ZfbXNnLm1zZy5kYXRhWzZdOworCWlwbWlfdmVyc2lvbiA9IGhhbHRfcmVjdl9tc2cubXNnLmRhdGFbNV07CiAKIAogCS8qIFNjYW4gZm9yIGEgcG93ZXJvZmYgbWV0aG9kICovCi0JZm9yIChpPTA7IGk8TlVNX1BPX0ZVTkNTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1BPX0ZVTkNTOyBpKyspIHsKIAkJaWYgKHBvd2Vyb2ZmX2Z1bmN0aW9uc1tpXS5kZXRlY3QoaXBtaV91c2VyKSkKIAkJCWdvdG8gZm91bmQ7CiAJfQpAQCAtNTM4LDM5ICs1NTgsMzUgQEAKIAogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLS8qIGRpc3BsYXlzIHByb3BlcnRpZXMgdG8gcHJvYyAqLwotc3RhdGljIGludCBwcm9jX3JlYWRfY2hhc3NjdHJsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCi0JCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXHRbIDA9cG93ZXJkb3duIDI9cG93ZXJjeWNsZSBdXG4iLAotCQkJcG93ZXJvZmZfY29udHJvbCk7Ci19CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAKLS8qIHByb2Nlc3MgcHJvcGVydHkgd3JpdGVzIGZyb20gcHJvYyAqLwotc3RhdGljIGludCBwcm9jX3dyaXRlX2NoYXNzY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAotCQkJICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCWludCAgICAgICAgICBydiA9IGNvdW50OwotCXVuc2lnbmVkIGludCBuZXd2YWwgPSAwOworc3RhdGljIGN0bF90YWJsZSBpcG1pX3RhYmxlW10gPSB7CisJeyAuY3RsX25hbWUJPSBERVZfSVBNSV9QT1dFUk9GRl9QT1dFUkNZQ0xFLAorCSAgLnByb2NuYW1lCT0gInBvd2Vyb2ZmX3Bvd2VyY3ljbGUiLAorCSAgLmRhdGEJCT0gJnBvd2Vyb2ZmX3Bvd2VyY3ljbGUsCisJICAubWF4bGVuCT0gc2l6ZW9mKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUpLAorCSAgLm1vZGUJCT0gMDY0NCwKKwkgIC5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYyB9LAorCXsgfQorfTsKIAotCXNzY2FuZihidWZmZXIsICIlZCIsICZuZXd2YWwpOwotCXN3aXRjaCAobmV3dmFsKSB7Ci0JCWNhc2UgSVBNSV9DSEFTU0lTX1BPV0VSX0NZQ0xFOgotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInBvd2VyIGN5Y2xlIGlzIG5vdyBlbmFibGVkXG4iKTsKLQkJCXBvd2Vyb2ZmX2NvbnRyb2wgPSBuZXd2YWw7Ci0JCQlicmVhazsKK3N0YXRpYyBjdGxfdGFibGUgaXBtaV9kaXJfdGFibGVbXSA9IHsKKwl7IC5jdGxfbmFtZQk9IERFVl9JUE1JLAorCSAgLnByb2NuYW1lCT0gImlwbWkiLAorCSAgLm1vZGUJCT0gMDU1NSwKKwkgIC5jaGlsZAk9IGlwbWlfdGFibGUgfSwKKwl7IH0KK307CiAKLQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjoKLQkJCXBvd2Vyb2ZmX2NvbnRyb2wgPSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjsKLQkJCWJyZWFrOworc3RhdGljIGN0bF90YWJsZSBpcG1pX3Jvb3RfdGFibGVbXSA9IHsKKwl7IC5jdGxfbmFtZQk9IENUTF9ERVYsCisJICAucHJvY25hbWUJPSAiZGV2IiwKKwkgIC5tb2RlCQk9IDA1NTUsCisJICAuY2hpbGQJPSBpcG1pX2Rpcl90YWJsZSB9LAorCXsgfQorfTsKIAotCQlkZWZhdWx0OgotCQkJcnYgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJ2OwotfQorc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICppcG1pX3RhYmxlX2hlYWRlcjsKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAvKgpAQCAtNTc4LDQyICs1OTQsMzIgQEAKICAqLwogc3RhdGljIGludCBpcG1pX3Bvd2Vyb2ZmX2luaXQgKHZvaWQpCiB7Ci0JaW50ICAgICAgICAgICAgICAgICAgIHJ2OwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZmlsZTsKKwlpbnQgcnY7CiAKIAlwcmludGsgKCJDb3B5cmlnaHQgKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSAtIgotCQkiIElQTUkgUG93ZXJkb3duIHZpYSBzeXNfcmVib290IHZlcnNpb24gIgotCQlJUE1JX1BPV0VST0ZGX1ZFUlNJT04gIi5cbiIpOworCQkiIElQTUkgUG93ZXJkb3duIHZpYSBzeXNfcmVib290LlxuIik7CiAKLQlzd2l0Y2ggKHBvd2Vyb2ZmX2NvbnRyb2wpIHsKLQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEU6Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXIgY3ljbGUgaXMgZW5hYmxlZC5cbiIpOwotCQkJYnJlYWs7CisJaWYgKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlciBjeWNsZSBpcyBlbmFibGVkLlxuIik7CiAKLQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjoKLQkJZGVmYXVsdDoKLQkJCXBvd2Vyb2ZmX2NvbnRyb2wgPSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjsKLQkJCWJyZWFrOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaXBtaV90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBtaV9yb290X3RhYmxlLCAxKTsKKwlpZiAoIWlwbWlfdGFibGVfaGVhZGVyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBwb3dlcmN5Y2xlIHN5c2N0bFxuIik7CisJCXJ2ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOwogCX0KKyNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlydiA9IGlwbWlfc21pX3dhdGNoZXJfcmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKKyNlbmRpZgogCWlmIChydikgeworCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcG1pX3RhYmxlX2hlYWRlcik7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBTTUkgd2F0Y2hlcjogJWRcbiIsIHJ2KTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwb3dlcm9mZl9jb250cm9sIiwgMCwgcHJvY19pcG1pX3Jvb3QpOwotCWlmICghZmlsZSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gY3JlYXRlIHByb2MgcG93ZXIgY29udHJvbFxuIik7Ci0JfSBlbHNlIHsKLQkJZmlsZS0+bmxpbmsgPSAxOwotCQlmaWxlLT5yZWFkX3Byb2MgPSBwcm9jX3JlYWRfY2hhc3NjdHJsOwotCQlmaWxlLT53cml0ZV9wcm9jID0gcHJvY193cml0ZV9jaGFzc2N0cmw7Ci0JCWZpbGUtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JfQotI2VuZGlmCi0KICBvdXRfZXJyOgogCXJldHVybiBydjsKIH0KQEAgLTYyNCw3ICs2MzAsNyBAQAogCWludCBydjsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcmVtb3ZlX3Byb2NfZW50cnkoInBvd2Vyb2ZmX2NvbnRyb2wiLCBwcm9jX2lwbWlfcm9vdCk7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBtaV90YWJsZV9oZWFkZXIpOwogI2VuZGlmCiAKIAlpcG1pX3NtaV93YXRjaGVyX3VucmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKQEAgLTY0MiwzICs2NDgsNSBAQAogCiBtb2R1bGVfaW5pdChpcG1pX3Bvd2Vyb2ZmX2luaXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUE1JIFBvd2Vyb2ZmIGV4dGVuc2lvbiB0byBzeXNfcmVib290Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IGE0NGI5NzMuLmI2ZTVjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC02MSwxMSArNjEsMTEgQEAKICMgZW5kaWYKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdXNlY190b190aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCwgbG9uZyB2KQogewotCXQtPnN1Yl9leHBpcmVzICs9IG5zZWNfdG9fYXJjaF9jeWNsZSh2ICogMTAwMCk7Ci0Jd2hpbGUgKHQtPnN1Yl9leHBpcmVzID49IGFyY2hfY3ljbGVzX3Blcl9qaWZmeSkKKwl0LT5hcmNoX2N5Y2xlX2V4cGlyZXMgKz0gbnNlY190b19hcmNoX2N5Y2xlKHYgKiAxMDAwKTsKKwl3aGlsZSAodC0+YXJjaF9jeWNsZV9leHBpcmVzID49IGFyY2hfY3ljbGVzX3Blcl9qaWZmeSkKIAl7CiAJCXQtPmV4cGlyZXMrKzsKLQkJdC0+c3ViX2V4cGlyZXMgLT0gYXJjaF9jeWNsZXNfcGVyX2ppZmZ5OworCQl0LT5hcmNoX2N5Y2xlX2V4cGlyZXMgLT0gYXJjaF9jeWNsZXNfcGVyX2ppZmZ5OwogCX0KIH0KICNlbmRpZgpAQCAtNzUsOCArNzUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNkZWZpbmUgSVBNSV9TSV9WRVJTSU9OICJ2MzMiCisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKIC8qIE1lYXN1cmUgdGltZXMgYmV0d2VlbiBldmVudHMgaW4gdGhlIGRyaXZlci4gKi8KICN1bmRlZiBERUJVR19USU1JTkcKQEAgLTEwOSw2ICsxMDgsMjEgQEAKICAgICBTSV9LQ1MsIFNJX1NNSUMsIFNJX0JUCiB9OwogCitzdHJ1Y3QgaXBtaV9kZXZpY2VfaWQgeworCXVuc2lnbmVkIGNoYXIgZGV2aWNlX2lkOworCXVuc2lnbmVkIGNoYXIgZGV2aWNlX3JldmlzaW9uOworCXVuc2lnbmVkIGNoYXIgZmlybXdhcmVfcmV2aXNpb25fMTsKKwl1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3JldmlzaW9uXzI7CisJdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb247CisJdW5zaWduZWQgY2hhciBhZGRpdGlvbmFsX2RldmljZV9zdXBwb3J0OworCXVuc2lnbmVkIGNoYXIgbWFudWZhY3R1cmVyX2lkWzNdOworCXVuc2lnbmVkIGNoYXIgcHJvZHVjdF9pZFsyXTsKKwl1bnNpZ25lZCBjaGFyIGF1eF9maXJtd2FyZV9yZXZpc2lvbls0XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgaXBtaV92ZXJzaW9uX21ham9yKHYpICgodiktPmlwbWlfdmVyc2lvbiAmIDB4ZikKKyNkZWZpbmUgaXBtaV92ZXJzaW9uX21pbm9yKHYpICgodiktPmlwbWlfdmVyc2lvbiA+PiA0KQorCiBzdHJ1Y3Qgc21pX2luZm8KIHsKIAlpcG1pX3NtaV90ICAgICAgICAgICAgIGludGY7CkBAIC0xMzEsMTIgKzE0NSwyNCBAQAogCXZvaWQgKCppcnFfY2xlYW51cCkoc3RydWN0IHNtaV9pbmZvICppbmZvKTsKIAl1bnNpZ25lZCBpbnQgaW9fc2l6ZTsKIAorCS8qIFBlci1PRU0gaGFuZGxlciwgY2FsbGVkIGZyb20gaGFuZGxlX2ZsYWdzKCkuCisJICAgUmV0dXJucyAxIHdoZW4gaGFuZGxlX2ZsYWdzKCkgbmVlZHMgdG8gYmUgcmUtcnVuCisJICAgb3IgMCBpbmRpY2F0aW5nIGl0IHNldCBzaV9zdGF0ZSBpdHNlbGYuCisJKi8KKwlpbnQgKCpvZW1fZGF0YV9hdmFpbF9oYW5kbGVyKShzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKTsKKwogCS8qIEZsYWdzIGZyb20gdGhlIGxhc3QgR0VUX01TR19GTEFHUyBjb21tYW5kLCB1c2VkIHdoZW4gYW4gQVRUTgogCSAgIGlzIHNldCB0byBob2xkIHRoZSBmbGFncyB1bnRpbCB3ZSBhcmUgZG9uZSBoYW5kbGluZyBldmVyeXRoaW5nCiAJICAgZnJvbSB0aGUgZmxhZ3MuICovCiAjZGVmaW5lIFJFQ0VJVkVfTVNHX0FWQUlMCTB4MDEKICNkZWZpbmUgRVZFTlRfTVNHX0JVRkZFUl9GVUxMCTB4MDIKICNkZWZpbmUgV0RUX1BSRV9USU1FT1VUX0lOVAkweDA4CisjZGVmaW5lIE9FTTBfREFUQV9BVkFJTCAgICAgMHgyMAorI2RlZmluZSBPRU0xX0RBVEFfQVZBSUwgICAgIDB4NDAKKyNkZWZpbmUgT0VNMl9EQVRBX0FWQUlMICAgICAweDgwCisjZGVmaW5lIE9FTV9EQVRBX0FWQUlMICAgICAgKE9FTTBfREFUQV9BVkFJTCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0VNMV9EQVRBX0FWQUlMIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRU0yX0RBVEFfQVZBSUwpCiAJdW5zaWduZWQgY2hhciAgICAgICBtc2dfZmxhZ3M7CiAKIAkvKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHJlcXVlc3QgZXZlbnRzIHRoZSBuZXh0IHRpbWUgdGhlCkBAIC0xNzUsMTEgKzIwMSw3IEBACiAJICAgaW50ZXJydXB0cy4gKi8KIAlpbnQgaW50ZXJydXB0X2Rpc2FibGVkOwogCi0JdW5zaWduZWQgY2hhciBpcG1pX3NpX2Rldl9yZXY7Ci0JdW5zaWduZWQgY2hhciBpcG1pX3NpX2Z3X3Jldl9tYWpvcjsKLQl1bnNpZ25lZCBjaGFyIGlwbWlfc2lfZndfcmV2X21pbm9yOwotCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21ham9yOwotCXVuc2lnbmVkIGNoYXIgaXBtaV92ZXJzaW9uX21pbm9yOworCXN0cnVjdCBpcG1pX2RldmljZV9pZCBkZXZpY2VfaWQ7CiAKIAkvKiBTbGF2ZSBhZGRyZXNzLCBjb3VsZCBiZSByZXBvcnRlZCBmcm9tIERNSS4gKi8KIAl1bnNpZ25lZCBjaGFyIHNsYXZlX2FkZHI7CkBAIC0yNDUsNyArMjY3LDcgQEAKIAkJZW50cnkgPSBzbWlfaW5mby0+eG1pdF9tc2dzLm5leHQ7CiAJfQogCi0JaWYgKCFlbnRyeSkgeworCWlmICghIGVudHJ5KSB7CiAJCXNtaV9pbmZvLT5jdXJyX21zZyA9IE5VTEw7CiAJCXJ2ID0gU0lfU01fSURMRTsKIAl9IGVsc2UgewpAQCAtMzA2LDcgKzMyOCw3IEBACiAgICBtZW1vcnksIHdlIHdpbGwgcmUtZW5hYmxlIHRoZSBpbnRlcnJ1cHQuICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9zaV9pcnEoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKIHsKLQlpZiAoKHNtaV9pbmZvLT5pcnEpICYmICghc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkpIHsKKwlpZiAoKHNtaV9pbmZvLT5pcnEpICYmICghIHNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQpKSB7CiAJCWRpc2FibGVfaXJxX25vc3luYyhzbWlfaW5mby0+aXJxKTsKIAkJc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCA9IDE7CiAJfQpAQCAtMzIyLDYgKzM0NCw3IEBACiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9mbGFncyhzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQogeworIHJldHJ5OgogCWlmIChzbWlfaW5mby0+bXNnX2ZsYWdzICYgV0RUX1BSRV9USU1FT1VUX0lOVCkgewogCQkvKiBXYXRjaGRvZyBwcmUtdGltZW91dCAqLwogCQlzcGluX2xvY2soJnNtaV9pbmZvLT5jb3VudF9sb2NrKTsKQEAgLTMzNiw3ICszNTksNyBAQAogCX0gZWxzZSBpZiAoc21pX2luZm8tPm1zZ19mbGFncyAmIFJFQ0VJVkVfTVNHX0FWQUlMKSB7CiAJCS8qIE1lc3NhZ2VzIGF2YWlsYWJsZS4gKi8KIAkJc21pX2luZm8tPmN1cnJfbXNnID0gaXBtaV9hbGxvY19zbWlfbXNnKCk7Ci0JCWlmICghc21pX2luZm8tPmN1cnJfbXNnKSB7CisJCWlmICghIHNtaV9pbmZvLT5jdXJyX21zZykgewogCQkJZGlzYWJsZV9zaV9pcnEoc21pX2luZm8pOwogCQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfTk9STUFMOwogCQkJcmV0dXJuOwpAQCAtMzU1LDcgKzM3OCw3IEBACiAJfSBlbHNlIGlmIChzbWlfaW5mby0+bXNnX2ZsYWdzICYgRVZFTlRfTVNHX0JVRkZFUl9GVUxMKSB7CiAJCS8qIEV2ZW50cyBhdmFpbGFibGUuICovCiAJCXNtaV9pbmZvLT5jdXJyX21zZyA9IGlwbWlfYWxsb2Nfc21pX21zZygpOwotCQlpZiAoIXNtaV9pbmZvLT5jdXJyX21zZykgeworCQlpZiAoISBzbWlfaW5mby0+Y3Vycl9tc2cpIHsKIAkJCWRpc2FibGVfc2lfaXJxKHNtaV9pbmZvKTsKIAkJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKIAkJCXJldHVybjsKQEAgLTM3MSw2ICszOTQsMTAgQEAKIAkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YSwKIAkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YV9zaXplKTsKIAkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19FVkVOVFM7CisJfSBlbHNlIGlmIChzbWlfaW5mby0+bXNnX2ZsYWdzICYgT0VNX0RBVEFfQVZBSUwpIHsKKwkJaWYgKHNtaV9pbmZvLT5vZW1fZGF0YV9hdmFpbF9oYW5kbGVyKQorCQkJaWYgKHNtaV9pbmZvLT5vZW1fZGF0YV9hdmFpbF9oYW5kbGVyKHNtaV9pbmZvKSkKKwkJCQlnb3RvIHJldHJ5OwogCX0gZWxzZSB7CiAJCXNtaV9pbmZvLT5zaV9zdGF0ZSA9IFNJX05PUk1BTDsKIAl9CkBAIC0zODcsNyArNDE0LDcgQEAKICNlbmRpZgogCXN3aXRjaCAoc21pX2luZm8tPnNpX3N0YXRlKSB7CiAJY2FzZSBTSV9OT1JNQUw6Ci0JCWlmICghc21pX2luZm8tPmN1cnJfbXNnKQorCQlpZiAoISBzbWlfaW5mby0+Y3Vycl9tc2cpCiAJCQlicmVhazsKIAogCQlzbWlfaW5mby0+Y3Vycl9tc2ctPnJzcF9zaXplCkBAIC03NjEsMTggKzc4OCwyMCBAQAogI2lmIGRlZmluZWQoQ09ORklHX0hJR0hfUkVTX1RJTUVSUykKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgamlmZmllc19ub3c7CisJdW5zaWduZWQgbG9uZyBzZXE7CiAKIAlpZiAoZGVsX3RpbWVyKCYoc21pX2luZm8tPnNpX3RpbWVyKSkpIHsKIAkJLyogSWYgd2UgZG9uJ3QgZGVsZXRlIHRoZSB0aW1lciwgdGhlbiBpdCB3aWxsIGdvIG9mZgogCQkgICBpbW1lZGlhdGVseSwgYW55d2F5LiAgU28gd2Ugb25seSBwcm9jZXNzIGlmIHdlCiAJCSAgIGFjdHVhbGx5IGRlbGV0ZSB0aGUgdGltZXIuICovCiAKLQkJLyogV2UgYWxyZWFkeSBoYXZlIGlycXNhdmUgb24sIHNvIG5vIG5lZWQgZm9yIGl0Ci0gICAgICAgICAgICAgICAgICAgaGVyZS4gKi8KLQkJcmVhZF9sb2NrKCZ4dGltZV9sb2NrKTsKLQkJamlmZmllc19ub3cgPSBqaWZmaWVzOwotCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXNfbm93OwotCQlzbWlfaW5mby0+c2lfdGltZXIuc3ViX2V4cGlyZXMgPSBnZXRfYXJjaF9jeWNsZXMoamlmZmllc19ub3cpOworCQlkbyB7CisJCQlzZXEgPSByZWFkX3NlcWJlZ2luX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwkJCWppZmZpZXNfbm93ID0gamlmZmllczsKKwkJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllc19ub3c7CisJCQlzbWlfaW5mby0+c2lfdGltZXIuYXJjaF9jeWNsZV9leHBpcmVzCisJCQkJPSBnZXRfYXJjaF9jeWNsZXMoamlmZmllc19ub3cpOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5X2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIHNlcSwgZmxhZ3MpKTsKIAogCQlhZGRfdXNlY190b190aW1lcigmc21pX2luZm8tPnNpX3RpbWVyLCBTSV9TSE9SVF9USU1FT1VUX1VTRUMpOwogCkBAIC04MjYsMTUgKzg1NSwxOSBAQAogCS8qIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGFza3MgZm9yIGEgc2hvcnQgZGVsYXksIHRoZW4gc2hvcnRlbgogICAgICAgICAgICB0aGUgdGltZXIgdGltZW91dC4gKi8KIAlpZiAoc21pX3Jlc3VsdCA9PSBTSV9TTV9DQUxMX1dJVEhfREVMQVkpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdIX1JFU19USU1FUlMpCisJCXVuc2lnbmVkIGxvbmcgc2VxOworI2VuZGlmCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzbWlfaW5mby0+Y291bnRfbG9jaywgZmxhZ3MpOwogCQlzbWlfaW5mby0+c2hvcnRfdGltZW91dHMrKzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21pX2luZm8tPmNvdW50X2xvY2ssIGZsYWdzKTsKICNpZiBkZWZpbmVkKENPTkZJR19ISUdIX1JFU19USU1FUlMpCi0JCXJlYWRfbG9jaygmeHRpbWVfbG9jayk7Ci0gICAgICAgICAgICAgICAgc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzOwotICAgICAgICAgICAgICAgIHNtaV9pbmZvLT5zaV90aW1lci5zdWJfZXhwaXJlcwotICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYXJjaF9jeWNsZXMoc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMpOwotICAgICAgICAgICAgICAgIHJlYWRfdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwkJZG8geworCQkJc2VxID0gcmVhZF9zZXFiZWdpbl9pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCQlzbWlfaW5mby0+c2lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7CisJCQlzbWlfaW5mby0+c2lfdGltZXIuYXJjaF9jeWNsZV9leHBpcmVzCisJCQkJPSBnZXRfYXJjaF9jeWNsZXMoc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMpOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5X2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIHNlcSwgZmxhZ3MpKTsKIAkJYWRkX3VzZWNfdG9fdGltZXIoJnNtaV9pbmZvLT5zaV90aW1lciwgU0lfU0hPUlRfVElNRU9VVF9VU0VDKTsKICNlbHNlCiAJCXNtaV9pbmZvLT5zaV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDE7CkBAIC04NDUsNyArODc4LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21pX2luZm8tPmNvdW50X2xvY2ssIGZsYWdzKTsKIAkJc21pX2luZm8tPnNpX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0lfVElNRU9VVF9KSUZGSUVTOwogI2lmIGRlZmluZWQoQ09ORklHX0hJR0hfUkVTX1RJTUVSUykKLQkJc21pX2luZm8tPnNpX3RpbWVyLnN1Yl9leHBpcmVzID0gMDsKKwkJc21pX2luZm8tPnNpX3RpbWVyLmFyY2hfY3ljbGVfZXhwaXJlcyA9IDA7CiAjZW5kaWYKIAl9CiAKQEAgLTk4Niw3ICsxMDE5LDcgQEAKICNkZWZpbmUgSVBNSV9NRU1fQUREUl9TUEFDRSAxCiAjZGVmaW5lIElQTUlfSU9fQUREUl9TUEFDRSAgMgogCi0jaWYgZGVmaW5lZChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikgfHwgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgfHwgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCiBzdGF0aWMgaW50IGlzX25ld19pbnRlcmZhY2UoaW50IGludGYsIHU4IGFkZHJfc3BhY2UsIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyKQogewogCWludCBpOwpAQCAtMTAxNCw3ICsxMDQ3LDcgQEAKIHsKIAlpbnQgcnY7CiAKLQlpZiAoIWluZm8tPmlycSkKKwlpZiAoISBpbmZvLT5pcnEpCiAJCXJldHVybiAwOwogCiAJaWYgKGluZm8tPnNpX3R5cGUgPT0gU0lfQlQpIHsKQEAgLTEwMjMsNyArMTA1Niw3IEBACiAJCQkJIFNBX0lOVEVSUlVQVCwKIAkJCQkgREVWSUNFX05BTUUsCiAJCQkJIGluZm8pOwotCQlpZiAoIXJ2KQorCQlpZiAoISBydikKIAkJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGluIHRoZSBCVCBpbnRlcmZhY2UuICovCiAJCQlpbmZvLT5pby5vdXRwdXRiKCZpbmZvLT5pbywgSVBNSV9CVF9JTlRNQVNLX1JFRywKIAkJCQkJIElQTUlfQlRfSU5UTUFTS19FTkFCTEVfSVJRX0JJVCk7CkBAIC0xMDQ4LDcgKzEwODEsNyBAQAogCiBzdGF0aWMgdm9pZCBzdGRfaXJxX2NsZWFudXAoc3RydWN0IHNtaV9pbmZvICppbmZvKQogewotCWlmICghaW5mby0+aXJxKQorCWlmICghIGluZm8tPmlycSkKIAkJcmV0dXJuOwogCiAJaWYgKGluZm8tPnNpX3R5cGUgPT0gU0lfQlQpCkBAIC0xMTIxLDcgKzExNTQsNyBAQAogCXVuc2lnbmVkIGludCAqYWRkciA9IGluZm8tPmlvLmluZm87CiAJaW50ICAgICAgICAgICBtYXBzaXplOwogCi0JaWYgKCFhZGRyIHx8ICghKmFkZHIpKQorCWlmICghIGFkZHIgfHwgKCEgKmFkZHIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWluZm8tPmlvX2NsZWFudXAgPSBwb3J0X2NsZWFudXA7CkBAIC0xMTY0LDE1ICsxMTk3LDE1IEBACiB7CiAJc3RydWN0IHNtaV9pbmZvICppbmZvOwogCi0JaWYgKCFwb3J0c1tpbnRmX251bV0pCisJaWYgKCEgcG9ydHNbaW50Zl9udW1dKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghaXNfbmV3X2ludGVyZmFjZShpbnRmX251bSwgSVBNSV9JT19BRERSX1NQQUNFLAorCWlmICghIGlzX25ld19pbnRlcmZhY2UoaW50Zl9udW0sIElQTUlfSU9fQUREUl9TUEFDRSwKIAkJCSAgICAgIHBvcnRzW2ludGZfbnVtXSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKSB7CisJaWYgKCEgaW5mbykgewogCQlwcmludGsoS0VSTl9FUlIgImlwbWlfc2k6IENvdWxkIG5vdCBhbGxvY2F0ZSBTSSBkYXRhICgxKVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTExODIsMTAgKzEyMTUsMTAgQEAKIAlpbmZvLT5pby5pbmZvID0gJihwb3J0c1tpbnRmX251bV0pOwogCWluZm8tPmlvLmFkZHIgPSBOVUxMOwogCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07Ci0JaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCWlmICghIGluZm8tPmlvLnJlZ3NwYWNpbmcpCiAJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJaW5mby0+aW8ucmVnc2l6ZSA9IHJlZ3NpemVzW2ludGZfbnVtXTsKLQlpZiAoIWluZm8tPmlvLnJlZ3NpemUpCisJaWYgKCEgaW5mby0+aW8ucmVnc2l6ZSkKIAkJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKIAlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CiAJaW5mby0+aXJxID0gMDsKQEAgLTEyNzAsNyArMTMwMyw3IEBACiAJdW5zaWduZWQgbG9uZyAqYWRkciA9IGluZm8tPmlvLmluZm87CiAJaW50ICAgICAgICAgICBtYXBzaXplOwogCi0JaWYgKCFhZGRyIHx8ICghKmFkZHIpKQorCWlmICghIGFkZHIgfHwgKCEgKmFkZHIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWluZm8tPmlvX2NsZWFudXAgPSBtZW1fY2xlYW51cDsKQEAgLTEzMjUsMTUgKzEzNTgsMTUgQEAKIHsKIAlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CiAKLQlpZiAoIWFkZHJzW2ludGZfbnVtXSkKKwlpZiAoISBhZGRyc1tpbnRmX251bV0pCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFpc19uZXdfaW50ZXJmYWNlKGludGZfbnVtLCBJUE1JX01FTV9BRERSX1NQQUNFLAorCWlmICghIGlzX25ld19pbnRlcmZhY2UoaW50Zl9udW0sIElQTUlfTUVNX0FERFJfU1BBQ0UsCiAJCQkgICAgICBhZGRyc1tpbnRmX251bV0pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykgeworCWlmICghIGluZm8pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoMilcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzQzLDEwICsxMzc2LDEwIEBACiAJaW5mby0+aW8uaW5mbyA9ICZhZGRyc1tpbnRmX251bV07CiAJaW5mby0+aW8uYWRkciA9IE5VTEw7CiAJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKLQlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJaWYgKCEgaW5mby0+aW8ucmVnc3BhY2luZykKIAkJaW5mby0+aW8ucmVnc3BhY2luZyA9IERFRkFVTFRfUkVHU1BBQ0lORzsKIAlpbmZvLT5pby5yZWdzaXplID0gcmVnc2l6ZXNbaW50Zl9udW1dOwotCWlmICghaW5mby0+aW8ucmVnc2l6ZSkKKwlpZiAoISBpbmZvLT5pby5yZWdzaXplKQogCQlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOwogCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKIAlpbmZvLT5pcnEgPSAwOwpAQCAtMTM2Miw3ICsxMzk1LDcgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX0FDUElfSU5URVJQUkVURVIKKyNpZmRlZiBDT05GSUdfQUNQSQogCiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCkBAIC0xNDA0LDcgKzE0MzcsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCWlmICghaW5mby0+aXJxKQorCWlmICghIGluZm8tPmlycSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBGSVhNRSAtIGlzIGxldmVsIHRyaWdnZXJlZCByaWdodD8gKi8KQEAgLTE0MjgsNyArMTQ2MSw3IEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfZ3BlX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKIHsKLQlpZiAoIWluZm8tPmlycSkKKwlpZiAoISBpbmZvLT5pcnEpCiAJCXJldHVybjsKIAogCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGluZm8tPmlycSwgJmlwbWlfYWNwaV9ncGUpOwpAQCAtMTQ4NCw2ICsxNTE3LDkgQEAKIAljaGFyICAgICAgICAgICAgICppb190eXBlOwogCXU4IAkJIGFkZHJfc3BhY2U7CiAKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAoYWNwaV9mYWlsdXJlKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTUwNCwxMCArMTU0MCwxMCBAQAogCQlhZGRyX3NwYWNlID0gSVBNSV9NRU1fQUREUl9TUEFDRTsKIAllbHNlCiAJCWFkZHJfc3BhY2UgPSBJUE1JX0lPX0FERFJfU1BBQ0U7Ci0JaWYgKCFpc19uZXdfaW50ZXJmYWNlKC0xLCBhZGRyX3NwYWNlLCBzcG1pLT5hZGRyLmFkZHJlc3MpKQorCWlmICghIGlzX25ld19pbnRlcmZhY2UoLTEsIGFkZHJfc3BhY2UsIHNwbWktPmFkZHIuYWRkcmVzcykpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFzcG1pLT5hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCkgeworCWlmICghIHNwbWktPmFkZHIucmVnaXN0ZXJfYml0X3dpZHRoKSB7CiAJCWFjcGlfZmFpbHVyZSA9IDE7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE1MzQsNyArMTU3MCw3IEBACiAJfQogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKSB7CisJaWYgKCEgaW5mbykgewogCQlwcmludGsoS0VSTl9FUlIgImlwbWlfc2k6IENvdWxkIG5vdCBhbGxvY2F0ZSBTSSBkYXRhICgzKVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE2MTAsMjIgKzE2NDYsMTUgQEAKIHN0YXRpYyBkbWlfaXBtaV9kYXRhX3QgZG1pX2RhdGFbU0lfTUFYX0RSSVZFUlNdOwogc3RhdGljIGludCBkbWlfZGF0YV9lbnRyaWVzOwogCi10eXBlZGVmIHN0cnVjdCBkbWlfaGVhZGVyCitzdGF0aWMgaW50IF9faW5pdCBkZWNvZGVfZG1pKHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgaW50IGludGZfbnVtKQogewotCXU4CXR5cGU7Ci0JdTgJbGVuZ3RoOwotCXUxNgloYW5kbGU7Ci19IGRtaV9oZWFkZXJfdDsKLQotc3RhdGljIGludCBkZWNvZGVfZG1pKGRtaV9oZWFkZXJfdCBfX2lvbWVtICpkbSwgaW50IGludGZfbnVtKQotewotCXU4CQlfX2lvbWVtICpkYXRhID0gKHU4IF9faW9tZW0gKilkbTsKKwl1OCAgICAgICAgICAgICAgKmRhdGEgPSAodTggKilkbTsKIAl1bnNpZ25lZCBsb25nICAJYmFzZV9hZGRyOwogCXU4CQlyZWdfc3BhY2luZzsKLQl1OCAgICAgICAgICAgICAgbGVuID0gcmVhZGIoJmRtLT5sZW5ndGgpOworCXU4ICAgICAgICAgICAgICBsZW4gPSBkbS0+bGVuZ3RoOwogCWRtaV9pcG1pX2RhdGFfdCAqaXBtaV9kYXRhID0gZG1pX2RhdGEraW50Zl9udW07CiAKLQlpcG1pX2RhdGEtPnR5cGUgPSByZWFkYigmZGF0YVs0XSk7CisJaXBtaV9kYXRhLT50eXBlID0gZGF0YVs0XTsKIAogCW1lbWNweSgmYmFzZV9hZGRyLCBkYXRhKzgsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAJaWYgKGxlbiA+PSAweDExKSB7CkBAIC0xNjQwLDEyICsxNjY5LDEyIEBACiAJCX0KIAkJLyogSWYgYml0IDQgb2YgYnl0ZSAweDEwIGlzIHNldCwgdGhlbiB0aGUgbHNiIGZvciB0aGUgYWRkcmVzcwogCQkgICBpcyBvZGQuICovCi0JCWlwbWlfZGF0YS0+YmFzZV9hZGRyID0gYmFzZV9hZGRyIHwgKChyZWFkYigmZGF0YVsweDEwXSkgJiAweDEwKSA+PiA0KTsKKwkJaXBtaV9kYXRhLT5iYXNlX2FkZHIgPSBiYXNlX2FkZHIgfCAoKGRhdGFbMHgxMF0gJiAweDEwKSA+PiA0KTsKIAotCQlpcG1pX2RhdGEtPmlycSA9IHJlYWRiKCZkYXRhWzB4MTFdKTsKKwkJaXBtaV9kYXRhLT5pcnEgPSBkYXRhWzB4MTFdOwogCiAJCS8qIFRoZSB0b3AgdHdvIGJpdHMgb2YgYnl0ZSAweDEwIGhvbGQgdGhlIHJlZ2lzdGVyIHNwYWNpbmcuICovCi0JCXJlZ19zcGFjaW5nID0gKHJlYWRiKCZkYXRhWzB4MTBdKSAmIDB4QzApID4+IDY7CisJCXJlZ19zcGFjaW5nID0gKGRhdGFbMHgxMF0gJiAweEMwKSA+PiA2OwogCQlzd2l0Y2gocmVnX3NwYWNpbmcpewogCQljYXNlIDB4MDA6IC8qIEJ5dGUgYm91bmRhcmllcyAqLwogCQkgICAgaXBtaV9kYXRhLT5vZmZzZXQgPSAxOwpAQCAtMTY3Myw3ICsxNzAyLDcgQEAKIAkJaXBtaV9kYXRhLT5vZmZzZXQgPSAxOwogCX0KIAotCWlwbWlfZGF0YS0+c2xhdmVfYWRkciA9IHJlYWRiKCZkYXRhWzZdKTsKKwlpcG1pX2RhdGEtPnNsYXZlX2FkZHIgPSBkYXRhWzZdOwogCiAJaWYgKGlzX25ld19pbnRlcmZhY2UoLTEsIGlwbWlfZGF0YS0+YWRkcl9zcGFjZSxpcG1pX2RhdGEtPmJhc2VfYWRkcikpIHsKIAkJZG1pX2RhdGFfZW50cmllcysrOwpAQCAtMTY4NSw5NCArMTcxNCwyOSBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBkbWlfdGFibGUodTMyIGJhc2UsIGludCBsZW4sIGludCBudW0pCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2ZpbmRfYm1jKHZvaWQpCiB7Ci0JdTggCQkgIF9faW9tZW0gKmJ1ZjsKLQlzdHJ1Y3QgZG1pX2hlYWRlciBfX2lvbWVtICpkbTsKLQl1OCAJCSAgX19pb21lbSAqZGF0YTsKLQlpbnQgCQkgIGk9MTsKLQlpbnQJCSAgc3RhdHVzPS0xOworCXN0cnVjdCBkbWlfZGV2aWNlICpkZXYgPSBOVUxMOwogCWludCAgICAgICAgICAgICAgIGludGZfbnVtID0gMDsKIAotCWJ1ZiA9IGlvcmVtYXAoYmFzZSwgbGVuKTsKLQlpZihidWY9PU5VTEwpCi0JCXJldHVybiAtMTsKKwl3aGlsZSAoKGRldiA9IGRtaV9maW5kX2RldmljZShETUlfREVWX1RZUEVfSVBNSSwgTlVMTCwgZGV2KSkpIHsKKwkJaWYgKGludGZfbnVtID49IFNJX01BWF9EUklWRVJTKQorCQkJYnJlYWs7CiAKLQlkYXRhID0gYnVmOwotCi0Jd2hpbGUoaTxudW0gJiYgKGRhdGEgLSBidWYpIDwgbGVuKQotCXsKLQkJZG09KGRtaV9oZWFkZXJfdCBfX2lvbWVtICopZGF0YTsKLQotCQlpZigoZGF0YS1idWYrcmVhZGIoJmRtLT5sZW5ndGgpKSA+PSBsZW4pCi0gICAgICAgIAkJYnJlYWs7Ci0KLQkJaWYgKHJlYWRiKCZkbS0+dHlwZSkgPT0gMzgpIHsKLQkJCWlmIChkZWNvZGVfZG1pKGRtLCBpbnRmX251bSkgPT0gMCkgewotCQkJCWludGZfbnVtKys7Ci0JCQkJaWYgKGludGZfbnVtID49IFNJX01BWF9EUklWRVJTKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JICAgICAgICBkYXRhKz1yZWFkYigmZG0tPmxlbmd0aCk7Ci0JCXdoaWxlKChkYXRhLWJ1ZikgPCBsZW4gJiYgKHJlYWRiKGRhdGEpfHxyZWFkYihkYXRhKzEpKSkKLQkJCWRhdGErKzsKLQkJZGF0YSs9MjsKLQkJaSsrOworCQlkZWNvZGVfZG1pKChzdHJ1Y3QgZG1pX2hlYWRlciAqKSBkZXYtPmRldmljZV9kYXRhLCBpbnRmX251bSsrKTsKIAl9Ci0JaW91bm1hcChidWYpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZG1pX2NoZWNrc3VtKHU4ICpidWYpCi17Ci0JdTggICBzdW09MDsKLQlpbnQgIGE7Ci0KLQlmb3IoYT0wOyBhPDE1OyBhKyspCi0JCXN1bSs9YnVmW2FdOwotCXJldHVybiAoc3VtPT0wKTsKLX0KLQotc3RhdGljIGludCBkbWlfZGVjb2RlKHZvaWQpCi17Ci0JdTggICBidWZbMTVdOwotCXUzMiAgZnA9MHhGMDAwMDsKLQotI2lmZGVmIENPTkZJR19TSU1OT1cKLQlyZXR1cm4gLTE7Ci0jZW5kaWYKLQotCXdoaWxlKGZwIDwgMHhGRkZGRikKLQl7Ci0JCWlzYV9tZW1jcHlfZnJvbWlvKGJ1ZiwgZnAsIDE1KTsKLQkJaWYobWVtY21wKGJ1ZiwgIl9ETUlfIiwgNSk9PTAgJiYgZG1pX2NoZWNrc3VtKGJ1ZikpCi0JCXsKLQkJCXUxNiBudW09YnVmWzEzXTw8OHxidWZbMTJdOwotCQkJdTE2IGxlbj1idWZbN108PDh8YnVmWzZdOwotCQkJdTMyIGJhc2U9YnVmWzExXTw8MjR8YnVmWzEwXTw8MTZ8YnVmWzldPDw4fGJ1Zls4XTsKLQotCQkJaWYoZG1pX3RhYmxlKGJhc2UsIGxlbiwgbnVtKSA9PSAwKQotCQkJCXJldHVybiAwOwotCQl9Ci0JCWZwKz0xNjsKLQl9Ci0KLQlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQgdHJ5X2luaXRfc21iaW9zKGludCBpbnRmX251bSwgc3RydWN0IHNtaV9pbmZvICoqbmV3X2luZm8pCiB7Ci0Jc3RydWN0IHNtaV9pbmZvICAgKmluZm87Ci0JZG1pX2lwbWlfZGF0YV90ICAgKmlwbWlfZGF0YSA9IGRtaV9kYXRhK2ludGZfbnVtOwotCWNoYXIgICAgICAgICAgICAgICppb190eXBlOworCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKKwlkbWlfaXBtaV9kYXRhX3QgKmlwbWlfZGF0YSA9IGRtaV9kYXRhK2ludGZfbnVtOworCWNoYXIgICAgICAgICAgICAqaW9fdHlwZTsKIAogCWlmIChpbnRmX251bSA+PSBkbWlfZGF0YV9lbnRyaWVzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN3aXRjaChpcG1pX2RhdGEtPnR5cGUpIHsKKwlzd2l0Y2ggKGlwbWlfZGF0YS0+dHlwZSkgewogCQljYXNlIDB4MDE6IC8qIEtDUyAqLwogCQkJc2lfdHlwZVtpbnRmX251bV0gPSAia2NzIjsKIAkJCWJyZWFrOwpAQCAtMTc4Nyw3ICsxNzUxLDcgQEAKIAl9CiAKIAlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pIHsKKwlpZiAoISBpbmZvKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXBtaV9zaTogQ291bGQgbm90IGFsbG9jYXRlIFNJIGRhdGEgKDQpXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTgxMSw3ICsxNzc1LDcgQEAKIAogCXJlZ3NwYWNpbmdzW2ludGZfbnVtXSA9IGlwbWlfZGF0YS0+b2Zmc2V0OwogCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nc1tpbnRmX251bV07Ci0JaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCWlmICghIGluZm8tPmlvLnJlZ3NwYWNpbmcpCiAJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJaW5mby0+aW8ucmVnc2l6ZSA9IERFRkFVTFRfUkVHU1BBQ0lORzsKIAlpbmZvLT5pby5yZWdzaGlmdCA9IHJlZ3NoaWZ0c1tpbnRmX251bV07CkBAIC0xODUzLDE0ICsxODE3LDE0IEBACiAKIAlwY2lfc21pY19jaGVja2VkID0gMTsKIAotCWlmICgocGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9IUF9WRU5ET1JfSUQsIFBDSV9NTUNfREVWSUNFX0lELAotCQkJCSAgICAgICBOVUxMKSkpCi0JCTsKLQllbHNlIGlmICgocGNpX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0VSTUNfQ0xBU1NDT0RFLCBOVUxMKSkgJiYKLQkJIHBjaV9kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX0hQX1ZFTkRPUl9JRCkKLQkJZmVfcm1jID0gMTsKLQllbHNlCi0JCXJldHVybiAtRU5PREVWOworCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfSFBfVkVORE9SX0lELCBQQ0lfTU1DX0RFVklDRV9JRCwgTlVMTCk7CisJaWYgKCEgcGNpX2RldikgeworCQlwY2lfZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfRVJNQ19DTEFTU0NPREUsIE5VTEwpOworCQlpZiAocGNpX2RldiAmJiAocGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfSFBfVkVORE9SX0lEKSkKKwkJCWZlX3JtYyA9IDE7CisJCWVsc2UKKwkJCXJldHVybiAtRU5PREVWOworCX0KIAogCWVycm9yID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX01NQ19BRERSX0NXLCAmYmFzZV9hZGRyKTsKIAlpZiAoZXJyb3IpCkBAIC0xODczLDcgKzE4MzcsNyBAQAogCX0KIAogCS8qIEJpdCAwOiAxIHNwZWNpZmllcyBwcm9ncmFtbWVkIEkvTywgMCBzcGVjaWZpZXMgbWVtb3J5IG1hcHBlZCBJL08gKi8KLQlpZiAoIShiYXNlX2FkZHIgJiAweDAwMDEpKQorCWlmICghIChiYXNlX2FkZHIgJiAweDAwMDEpKQogCXsKIAkJcGNpX2Rldl9wdXQocGNpX2Rldik7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtMTg4MywxNyArMTg0NywxNyBAQAogCX0KIAogCWJhc2VfYWRkciAmPSAweEZGRkU7Ci0JaWYgKCFmZV9ybWMpCisJaWYgKCEgZmVfcm1jKQogCQkvKiBEYXRhIHJlZ2lzdGVyIHN0YXJ0cyBhdCBiYXNlIGFkZHJlc3MgKyAxIGluIGVSTUMgKi8KIAkJKytiYXNlX2FkZHI7CiAKLQlpZiAoIWlzX25ld19pbnRlcmZhY2UoLTEsIElQTUlfSU9fQUREUl9TUEFDRSwgYmFzZV9hZGRyKSkgeworCWlmICghIGlzX25ld19pbnRlcmZhY2UoLTEsIElQTUlfSU9fQUREUl9TUEFDRSwgYmFzZV9hZGRyKSkgewogCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKSB7CisJaWYgKCEgaW5mbykgewogCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcG1pX3NpOiBDb3VsZCBub3QgYWxsb2NhdGUgU0kgZGF0YSAoNSlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE5MDQsNyArMTg2OCw3IEBACiAJcG9ydHNbaW50Zl9udW1dID0gYmFzZV9hZGRyOwogCWluZm8tPmlvLmluZm8gPSAmKHBvcnRzW2ludGZfbnVtXSk7CiAJaW5mby0+aW8ucmVnc3BhY2luZyA9IHJlZ3NwYWNpbmdzW2ludGZfbnVtXTsKLQlpZiAoIWluZm8tPmlvLnJlZ3NwYWNpbmcpCisJaWYgKCEgaW5mby0+aW8ucmVnc3BhY2luZykKIAkJaW5mby0+aW8ucmVnc3BhY2luZyA9IERFRkFVTFRfUkVHU1BBQ0lORzsKIAlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOwogCWluZm8tPmlvLnJlZ3NoaWZ0ID0gcmVnc2hpZnRzW2ludGZfbnVtXTsKQEAgLTE5MjUsNyArMTg4OSw3IEBACiBzdGF0aWMgaW50IHRyeV9pbml0X3BsdWdfYW5kX3BsYXkoaW50IGludGZfbnVtLCBzdHJ1Y3Qgc21pX2luZm8gKipuZXdfaW5mbykKIHsKICNpZmRlZiBDT05GSUdfUENJCi0JaWYgKGZpbmRfcGNpX3NtaWMoaW50Zl9udW0sIG5ld19pbmZvKT09MCkKKwlpZiAoZmluZF9wY2lfc21pYyhpbnRmX251bSwgbmV3X2luZm8pID09IDApCiAJCXJldHVybiAwOwogI2VuZGlmCiAJLyogSW5jbHVkZSBvdGhlciBtZXRob2RzIGhlcmUuICovCkBAIC0xOTQzLDcgKzE5MDcsNyBAQAogCWludCAgICAgICAgICAgICAgIHJ2ID0gMDsKIAogCXJlc3AgPSBrbWFsbG9jKElQTUlfTUFYX01TR19MRU5HVEgsIEdGUF9LRVJORUwpOwotCWlmICghcmVzcCkKKwlpZiAoISByZXNwKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIERvIGEgR2V0IERldmljZSBJRCBjb21tYW5kLCBzaW5jZSBpdCBjb21lcyBiYWNrIHdpdGggc29tZQpAQCAtMTk1Niw4ICsxOTIwLDcgQEAKIAlmb3IgKDs7KQogCXsKIAkJaWYgKHNtaV9yZXN1bHQgPT0gU0lfU01fQ0FMTF9XSVRIX0RFTEFZKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCQlzbWlfcmVzdWx0ID0gc21pX2luZm8tPmhhbmRsZXJzLT5ldmVudCgKIAkJCQlzbWlfaW5mby0+c2lfc20sIDEwMCk7CiAJCX0KQEAgLTE5OTIsMTEgKzE5NTUsOCBAQAogCX0KIAogCS8qIFJlY29yZCBpbmZvIGZyb20gdGhlIGdldCBkZXZpY2UgaWQsIGluIGNhc2Ugd2UgbmVlZCBpdC4gKi8KLQlzbWlfaW5mby0+aXBtaV9zaV9kZXZfcmV2ID0gcmVzcFs0XSAmIDB4ZjsKLQlzbWlfaW5mby0+aXBtaV9zaV9md19yZXZfbWFqb3IgPSByZXNwWzVdICYgMHg3ZjsKLQlzbWlfaW5mby0+aXBtaV9zaV9md19yZXZfbWlub3IgPSByZXNwWzZdOwotCXNtaV9pbmZvLT5pcG1pX3ZlcnNpb25fbWFqb3IgPSByZXNwWzddICYgMHhmOwotCXNtaV9pbmZvLT5pcG1pX3ZlcnNpb25fbWlub3IgPSByZXNwWzddID4+IDQ7CisJbWVtY3B5KCZzbWlfaW5mby0+ZGV2aWNlX2lkLCAmcmVzcFszXSwKKwkgICAgICAgbWluX3QodW5zaWduZWQgbG9uZywgcmVzcF9sZW4tMywgc2l6ZW9mKHNtaV9pbmZvLT5kZXZpY2VfaWQpKSk7CiAKICBvdXQ6CiAJa2ZyZWUocmVzcCk7CkBAIC0yMDI4LDcgKzE5ODgsNyBAQAogCXN0cnVjdCBzbWlfaW5mbyAqc21pID0gZGF0YTsKIAogCW91dCArPSBzcHJpbnRmKG91dCwgImludGVycnVwdHNfZW5hYmxlZDogICAgJWRcbiIsCi0JCSAgICAgICBzbWktPmlycSAmJiAhc21pLT5pbnRlcnJ1cHRfZGlzYWJsZWQpOworCQkgICAgICAgc21pLT5pcnEgJiYgISBzbWktPmludGVycnVwdF9kaXNhYmxlZCk7CiAJb3V0ICs9IHNwcmludGYob3V0LCAic2hvcnRfdGltZW91dHM6ICAgICAgICAlbGRcbiIsCiAJCSAgICAgICBzbWktPnNob3J0X3RpbWVvdXRzKTsKIAlvdXQgKz0gc3ByaW50ZihvdXQsICJsb25nX3RpbWVvdXRzOiAgICAgICAgICVsZFxuIiwKQEAgLTIwNTcsNiArMjAxNyw3MyBAQAogCXJldHVybiAob3V0IC0gKChjaGFyICopIHBhZ2UpKTsKIH0KIAorLyoKKyAqIG9lbV9kYXRhX2F2YWlsX3RvX3JlY2VpdmVfbXNnX2F2YWlsCisgKiBAaW5mbyAtIHNtaV9pbmZvIHN0cnVjdHVyZSB3aXRoIG1zZ19mbGFncyBzZXQKKyAqCisgKiBDb252ZXJ0cyBmbGFncyBmcm9tIE9FTV9EQVRBX0FWQUlMIHRvIFJFQ0VJVkVfTVNHX0FWQUlMCisgKiBSZXR1cm5zIDEgaW5kaWNhdGluZyBuZWVkIHRvIHJlLXJ1biBoYW5kbGVfZmxhZ3MoKS4KKyAqLworc3RhdGljIGludCBvZW1fZGF0YV9hdmFpbF90b19yZWNlaXZlX21zZ19hdmFpbChzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXNtaV9pbmZvLT5tc2dfZmxhZ3MgPSAoKHNtaV9pbmZvLT5tc2dfZmxhZ3MgJiB+T0VNX0RBVEFfQVZBSUwpIHwKKwkJCSAgICAgIAlSRUNFSVZFX01TR19BVkFJTCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzZXR1cF9kZWxsX3Bvd2VyZWRnZV9vZW1fZGF0YV9oYW5kbGVyCisgKiBAaW5mbyAtIHNtaV9pbmZvLmRldmljZV9pZCBtdXN0IGJlIHBvcHVsYXRlZAorICoKKyAqIFN5c3RlbXMgdGhhdCBtYXRjaCwgYnV0IGhhdmUgZmlybXdhcmUgdmVyc2lvbiA8IDEuNDAgbWF5IGFzc2VydAorICogT0VNMF9EQVRBX0FWQUlMIG9uIHRoZWlyIG93biwgd2l0aG91dCBiZWluZyB0b2xkIHZpYSBTZXQgRmxhZ3MgdGhhdAorICogaXQncyBzYWZlIHRvIGRvIHNvLiAgU3VjaCBzeXN0ZW1zIHdpbGwgZGUtYXNzZXJ0IE9FTTFfREFUQV9BVkFJTAorICogdXBvbiByZWNlaXB0IG9mIElQTUlfR0VUX01TR19DTUQsIHNvIHdlIHNob3VsZCB0cmVhdCB0aGVzZSBmbGFncworICogYXMgUkVDRUlWRV9NU0dfQVZBSUwgaW5zdGVhZC4KKyAqCisgKiBBcyBEZWxsIGhhcyBubyBwbGFucyB0byByZWxlYXNlIElQTUkgMS41IGZpcm13YXJlIHRoYXQgKmV2ZXIqCisgKiBhc3NlcnQgdGhlIE9FTVswMTJdIGJpdHMsIGFuZCBpZiBpdCBkaWQsIHRoZSBkcml2ZXIgd291bGQgaGF2ZSB0bworICogY2hhbmdlIHRvIGhhbmRsZSB0aGF0IHByb3Blcmx5LCB3ZSBkb24ndCBhY3R1YWxseSBjaGVjayBmb3IgdGhlCisgKiBmaXJtd2FyZSB2ZXJzaW9uLgorICogRGV2aWNlIElEID0gMHgyMCAgICAgICAgICAgICAgICBCTUMgb24gUG93ZXJFZGdlIDhHIHNlcnZlcnMKKyAqIERldmljZSBSZXZpc2lvbiA9IDB4ODAKKyAqIEZpcm13YXJlIFJldmlzaW9uMSA9IDB4MDEgICAgICAgQk1DIHZlcnNpb24gMS40MAorICogRmlybXdhcmUgUmV2aXNpb24yID0gMHg0MCAgICAgICBCQ0QgZW5jb2RlZAorICogSVBNSSBWZXJzaW9uID0gMHg1MSAgICAgICAgICAgICBJUE1JIDEuNQorICogTWFudWZhY3R1cmVyIElEID0gQTIgMDIgMDAgICAgICBEZWxsIElBTkEKKyAqCisgKi8KKyNkZWZpbmUgREVMTF9QT1dFUkVER0VfOEdfQk1DX0RFVklDRV9JRCAgMHgyMAorI2RlZmluZSBERUxMX1BPV0VSRURHRV84R19CTUNfREVWSUNFX1JFViAweDgwCisjZGVmaW5lIERFTExfUE9XRVJFREdFXzhHX0JNQ19JUE1JX1ZFUlNJT04gMHg1MQorI2RlZmluZSBERUxMX0lBTkFfTUZSX0lEIHsweEEyLCAweDAyLCAweDAwfQorc3RhdGljIHZvaWQgc2V0dXBfZGVsbF9wb3dlcmVkZ2Vfb2VtX2RhdGFfaGFuZGxlcihzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXN0cnVjdCBpcG1pX2RldmljZV9pZCAqaWQgPSAmc21pX2luZm8tPmRldmljZV9pZDsKKwljb25zdCBjaGFyIG1mclszXT1ERUxMX0lBTkFfTUZSX0lEOworCWlmICghIG1lbWNtcChtZnIsIGlkLT5tYW51ZmFjdHVyZXJfaWQsIHNpemVvZihtZnIpKQorCSAgICAmJiAoaWQtPmRldmljZV9pZCAgICAgICA9PSBERUxMX1BPV0VSRURHRV84R19CTUNfREVWSUNFX0lEKQorCSAgICAmJiAoaWQtPmRldmljZV9yZXZpc2lvbiA9PSBERUxMX1BPV0VSRURHRV84R19CTUNfREVWSUNFX1JFVikKKwkgICAgJiYgKGlkLT5pcG1pX3ZlcnNpb24gICAgPT0gREVMTF9QT1dFUkVER0VfOEdfQk1DX0lQTUlfVkVSU0lPTikpCisJeworCQlzbWlfaW5mby0+b2VtX2RhdGFfYXZhaWxfaGFuZGxlciA9CisJCQlvZW1fZGF0YV9hdmFpbF90b19yZWNlaXZlX21zZ19hdmFpbDsKKwl9Cit9CisKKy8qCisgKiBzZXR1cF9vZW1fZGF0YV9oYW5kbGVyCisgKiBAaW5mbyAtIHNtaV9pbmZvLmRldmljZV9pZCBtdXN0IGJlIGZpbGxlZCBpbiBhbHJlYWR5CisgKgorICogRmlsbHMgaW4gc21pX2luZm8uZGV2aWNlX2lkLm9lbV9kYXRhX2F2YWlsYWJsZV9oYW5kbGVyCisgKiB3aGVuIHdlIGtub3cgd2hhdCBmdW5jdGlvbiB0byB1c2UgdGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgc2V0dXBfb2VtX2RhdGFfaGFuZGxlcihzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvKQoreworCXNldHVwX2RlbGxfcG93ZXJlZGdlX29lbV9kYXRhX2hhbmRsZXIoc21pX2luZm8pOworfQorCiAvKiBSZXR1cm5zIDAgaWYgaW5pdGlhbGl6ZWQsIG9yIG5lZ2F0aXZlIG9uIGFuIGVycm9yLiAqLwogc3RhdGljIGludCBpbml0X29uZV9zbWkoaW50IGludGZfbnVtLCBzdHJ1Y3Qgc21pX2luZm8gKipzbWkpCiB7CkBAIC0yMDY3LDIwICsyMDk0LDE2IEBACiAJcnYgPSB0cnlfaW5pdF9tZW0oaW50Zl9udW0sICZuZXdfc21pKTsKIAlpZiAocnYpCiAJCXJ2ID0gdHJ5X2luaXRfcG9ydChpbnRmX251bSwgJm5ld19zbWkpOwotI2lmZGVmIENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCi0JaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworI2lmZGVmIENPTkZJR19BQ1BJCisJaWYgKHJ2ICYmIHNpX3RyeWRlZmF1bHRzKQogCQlydiA9IHRyeV9pbml0X2FjcGkoaW50Zl9udW0sICZuZXdfc21pKTsKLQl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfWDg2Ci0JaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworCWlmIChydiAmJiBzaV90cnlkZWZhdWx0cykKIAkJcnYgPSB0cnlfaW5pdF9zbWJpb3MoaW50Zl9udW0sICZuZXdfc21pKTsKLSAgICAgICAgfQogI2VuZGlmCi0JaWYgKChydikgJiYgKHNpX3RyeWRlZmF1bHRzKSkgeworCWlmIChydiAmJiBzaV90cnlkZWZhdWx0cykKIAkJcnYgPSB0cnlfaW5pdF9wbHVnX2FuZF9wbGF5KGludGZfbnVtLCAmbmV3X3NtaSk7Ci0JfQotCiAKIAlpZiAocnYpCiAJCXJldHVybiBydjsKQEAgLTIwOTAsNyArMjExMyw3IEBACiAJbmV3X3NtaS0+c2lfc20gPSBOVUxMOwogCW5ld19zbWktPmhhbmRsZXJzID0gTlVMTDsKIAotCWlmICghbmV3X3NtaS0+aXJxX3NldHVwKSB7CisJaWYgKCEgbmV3X3NtaS0+aXJxX3NldHVwKSB7CiAJCW5ld19zbWktPmlycSA9IGlycXNbaW50Zl9udW1dOwogCQluZXdfc21pLT5pcnFfc2V0dXAgPSBzdGRfaXJxX3NldHVwOwogCQluZXdfc21pLT5pcnFfY2xlYW51cCA9IHN0ZF9pcnFfY2xlYW51cDsKQEAgLTIxMjQsNyArMjE0Nyw3IEBACiAKIAkvKiBBbGxvY2F0ZSB0aGUgc3RhdGUgbWFjaGluZSdzIGRhdGEgYW5kIGluaXRpYWxpemUgaXQuICovCiAJbmV3X3NtaS0+c2lfc20gPSBrbWFsbG9jKG5ld19zbWktPmhhbmRsZXJzLT5zaXplKCksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X3NtaS0+c2lfc20pIHsKKwlpZiAoISBuZXdfc21pLT5zaV9zbSkgewogCQlwcmludGsoIiBDb3VsZCBub3QgYWxsb2NhdGUgc3RhdGUgbWFjaGluZSBtZW1vcnlcbiIpOwogCQlydiA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2VycjsKQEAgLTIxNTUsNiArMjE3OCw4IEBACiAJaWYgKHJ2KQogCQlnb3RvIG91dF9lcnI7CiAKKwlzZXR1cF9vZW1fZGF0YV9oYW5kbGVyKG5ld19zbWkpOworCiAJLyogVHJ5IHRvIGNsYWltIGFueSBpbnRlcnJ1cHRzLiAqLwogCW5ld19zbWktPmlycV9zZXR1cChuZXdfc21pKTsKIApAQCAtMjE4OCw4ICsyMjEzLDggQEAKIAogCXJ2ID0gaXBtaV9yZWdpc3Rlcl9zbWkoJmhhbmRsZXJzLAogCQkJICAgICAgIG5ld19zbWksCi0JCQkgICAgICAgbmV3X3NtaS0+aXBtaV92ZXJzaW9uX21ham9yLAotCQkJICAgICAgIG5ld19zbWktPmlwbWlfdmVyc2lvbl9taW5vciwKKwkJCSAgICAgICBpcG1pX3ZlcnNpb25fbWFqb3IoJm5ld19zbWktPmRldmljZV9pZCksCisJCQkgICAgICAgaXBtaV92ZXJzaW9uX21pbm9yKCZuZXdfc21pLT5kZXZpY2VfaWQpLAogCQkJICAgICAgIG5ld19zbWktPnNsYXZlX2FkZHIsCiAJCQkgICAgICAgJihuZXdfc21pLT5pbnRmKSk7CiAJaWYgKHJ2KSB7CkBAIC0yMjMwLDEwICsyMjU1LDggQEAKIAogCS8qIFdhaXQgZm9yIHRoZSB0aW1lciB0byBzdG9wLiAgVGhpcyBhdm9pZHMgcHJvYmxlbXMgd2l0aCByYWNlCiAJICAgY29uZGl0aW9ucyByZW1vdmluZyB0aGUgdGltZXIgaGVyZS4gKi8KLQl3aGlsZSAoIW5ld19zbWktPnRpbWVyX3N0b3BwZWQpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwl3aGlsZSAoIW5ld19zbWktPnRpbWVyX3N0b3BwZWQpCisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCiAgb3V0X2VycjoKIAlpZiAobmV3X3NtaS0+aW50ZikKQEAgLTIyNzAsNyArMjI5Myw3IEBACiAJLyogUGFyc2Ugb3V0IHRoZSBzaV90eXBlIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnRzLiAqLwogCXN0ciA9IHNpX3R5cGVfc3RyOwogCWlmICgqc3RyICE9ICdcMCcpIHsKLQkJZm9yIChpPTA7IChpPFNJX01BWF9QQVJNUykgJiYgKCpzdHIgIT0gJ1wwJyk7IGkrKykgeworCQlmb3IgKGkgPSAwOyAoaSA8IFNJX01BWF9QQVJNUykgJiYgKCpzdHIgIT0gJ1wwJyk7IGkrKykgewogCQkJc2lfdHlwZVtpXSA9IHN0cjsKIAkJCXN0ciA9IHN0cmNocihzdHIsICcsJyk7CiAJCQlpZiAoc3RyKSB7CkBAIC0yMjgyLDIyICsyMzA1LDE0IEBACiAJCX0KIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJJUE1JIFN5c3RlbSBJbnRlcmZhY2UgZHJpdmVyIHZlcnNpb24gIgotCSAgICAgICBJUE1JX1NJX1ZFUlNJT04pOwotCWlmIChrY3Nfc21pX2hhbmRsZXJzLnZlcnNpb24pCi0JCXByaW50aygiLCBLQ1MgdmVyc2lvbiAlcyIsIGtjc19zbWlfaGFuZGxlcnMudmVyc2lvbik7Ci0JaWYgKHNtaWNfc21pX2hhbmRsZXJzLnZlcnNpb24pCi0JCXByaW50aygiLCBTTUlDIHZlcnNpb24gJXMiLCBzbWljX3NtaV9oYW5kbGVycy52ZXJzaW9uKTsKLQlpZiAoYnRfc21pX2hhbmRsZXJzLnZlcnNpb24pCi0gICAJICAgICAgICBwcmludGsoIiwgQlQgdmVyc2lvbiAlcyIsIGJ0X3NtaV9oYW5kbGVycy52ZXJzaW9uKTsKLQlwcmludGsoIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiSVBNSSBTeXN0ZW0gSW50ZXJmYWNlIGRyaXZlci5cbiIpOwogCiAjaWZkZWYgQ09ORklHX1g4NgotCWRtaV9kZWNvZGUoKTsKKwlkbWlfZmluZF9ibWMoKTsKICNlbmRpZgogCiAJcnYgPSBpbml0X29uZV9zbWkoMCwgJihzbWlfaW5mb3NbcG9zXSkpOwotCWlmIChydiAmJiAhcG9ydHNbMF0gJiYgc2lfdHJ5ZGVmYXVsdHMpIHsKKwlpZiAocnYgJiYgISBwb3J0c1swXSAmJiBzaV90cnlkZWZhdWx0cykgewogCQkvKiBJZiB3ZSBhcmUgdHJ5aW5nIGRlZmF1bHRzIGFuZCB0aGUgaW5pdGlhbCBwb3J0IGlzCiAgICAgICAgICAgICAgICAgICAgbm90IHNldCwgdGhlbiBzZXQgaXQuICovCiAJCXNpX3R5cGVbMF0gPSAia2NzIjsKQEAgLTIzMTksNyArMjMzNCw3IEBACiAJaWYgKHJ2ID09IDApCiAJCXBvcysrOwogCi0JZm9yIChpPTE7IGkgPCBTSV9NQVhfUEFSTVM7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBTSV9NQVhfUEFSTVM7IGkrKykgewogCQlydiA9IGluaXRfb25lX3NtaShpLCAmKHNtaV9pbmZvc1twb3NdKSk7CiAJCWlmIChydiA9PSAwKQogCQkJcG9zKys7CkBAIC0yMzYxLDE3ICsyMzc2LDE0IEBACiAKIAkvKiBXYWl0IGZvciB0aGUgdGltZXIgdG8gc3RvcC4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggcmFjZQogCSAgIGNvbmRpdGlvbnMgcmVtb3ZpbmcgdGhlIHRpbWVyIGhlcmUuICovCi0Jd2hpbGUgKCF0b19jbGVhbi0+dGltZXJfc3RvcHBlZCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCXdoaWxlICghdG9fY2xlYW4tPnRpbWVyX3N0b3BwZWQpCisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCiAJLyogSW50ZXJydXB0cyBhbmQgdGltZW91dHMgYXJlIHN0b3BwZWQsIG5vdyBtYWtlIHN1cmUgdGhlCiAJICAgaW50ZXJmYWNlIGlzIGluIGEgY2xlYW4gc3RhdGUuICovCi0Jd2hpbGUgKCh0b19jbGVhbi0+Y3Vycl9tc2cpIHx8ICh0b19jbGVhbi0+c2lfc3RhdGUgIT0gU0lfTk9STUFMKSkgeworCXdoaWxlICh0b19jbGVhbi0+Y3Vycl9tc2cgfHwgKHRvX2NsZWFuLT5zaV9zdGF0ZSAhPSBTSV9OT1JNQUwpKSB7CiAJCXBvbGwodG9fY2xlYW4pOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0KIAogCXJ2ID0gaXBtaV91bnJlZ2lzdGVyX3NtaSh0b19jbGVhbi0+aW50Zik7CkBAIC0yMzkyLDEzICsyNDA0LDE1IEBACiB7CiAJaW50IGk7CiAKLQlpZiAoIWluaXRpYWxpemVkKQorCWlmICghIGluaXRpYWxpemVkKQogCQlyZXR1cm47CiAKLQlmb3IgKGk9MDsgaTxTSV9NQVhfRFJJVkVSUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFNJX01BWF9EUklWRVJTOyBpKyspIHsKIAkJY2xlYW51cF9vbmVfc2koc21pX2luZm9zW2ldKTsKIAl9CiB9CiBtb2R1bGVfZXhpdChjbGVhbnVwX2lwbWlfc2kpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVyZmFjZSB0byB0aGUgSVBNSSBkcml2ZXIgZm9yIHRoZSBLQ1MsIFNNSUMsIGFuZCBCVCBzeXN0ZW0gaW50ZXJmYWNlcy4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMKaW5kZXggYWUxODc0Ny4uYWRkMmFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zbWljX3NtLmMKQEAgLTQ2LDggKzQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4JCS8qIGZvciBjb21wbGV0aW9uIGNvZGVzICovCiAjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgogCi0jZGVmaW5lIElQTUlfU01JQ19WRVJTSU9OICJ2MzMiCi0KIC8qIHNtaWNfZGVidWcgaXMgYSBiaXQtZmllbGQKICAqCVNNSUNfREVCVUdfRU5BQkxFIC0JdHVybmVkIG9uIGZvciBub3cKICAqCVNNSUNfREVCVUdfTVNHIC0JY29tbWFuZHMgYW5kIHRoZWlyIHJlc3BvbnNlcwpAQCAtNTg4LDcgKzU4Niw2IEBACiAKIHN0cnVjdCBzaV9zbV9oYW5kbGVycyBzbWljX3NtaV9oYW5kbGVycyA9CiB7Ci0JLnZlcnNpb24gICAgICAgICAgID0gSVBNSV9TTUlDX1ZFUlNJT04sCiAJLmluaXRfZGF0YSAgICAgICAgID0gaW5pdF9zbWljX2RhdGEsCiAJLnN0YXJ0X3RyYW5zYWN0aW9uID0gc3RhcnRfc21pY190cmFuc2FjdGlvbiwKIAkuZ2V0X3Jlc3VsdCAgICAgICAgPSBzbWljX2dldF9yZXN1bHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKaW5kZXggZDM1YTk1My4uMmRhNjRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYwpAQCAtNTMsOCArNTMsNiBAQAogCiAjZGVmaW5lCVBGWCAiSVBNSSBXYXRjaGRvZzogIgogCi0jZGVmaW5lIElQTUlfV0FUQ0hET0dfVkVSU0lPTiAidjMzIgotCiAvKgogICogVGhlIElQTUkgY29tbWFuZC9yZXNwb25zZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyLgogICovCkBAIC0yNTksNyArMjU3LDcgQEAKIAogCWRhdGFbMV0gPSAwOwogCVdET0dfU0VUX1RJTUVPVVRfQUNUKGRhdGFbMV0sIGlwbWlfd2F0Y2hkb2dfc3RhdGUpOwotCWlmIChwcmV0aW1lb3V0ID4gMCkgeworCWlmICgocHJldGltZW91dCA+IDApICYmIChpcG1pX3dhdGNoZG9nX3N0YXRlICE9IFdET0dfVElNRU9VVF9OT05FKSkgewogCSAgICBXRE9HX1NFVF9QUkVUSU1FT1VUX0FDVChkYXRhWzFdLCBwcmVhY3Rpb25fdmFsKTsKIAkgICAgZGF0YVsyXSA9IHByZXRpbWVvdXQ7CiAJfSBlbHNlIHsKQEAgLTY1OSwxOSArNjU3LDE4IEBACiAKIHN0YXRpYyBpbnQgaXBtaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCiB7Ci0gICAgICAgIHN3aXRjaCAoaW1pbm9yKGlubykpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFdBVENIRE9HX01JTk9SOgotCQkgICAgaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmaXBtaV93ZG9nX29wZW4pKQorICAgICAgICBzd2l0Y2ggKGltaW5vcihpbm8pKSB7CisgICAgICAgIGNhc2UgV0FUQ0hET0dfTUlOT1I6CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZpcG1pX3dkb2dfb3BlbikpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogCi0JCSAgICAvKiBEb24ndCBzdGFydCB0aGUgdGltZXIgbm93LCBsZXQgaXQgc3RhcnQgb24gdGhlCi0JCSAgICAgICBmaXJzdCBoZWFydGJlYXQuICovCi0JCSAgICBpcG1pX3N0YXJ0X3RpbWVyX29uX2hlYXJ0YmVhdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOworCQkvKiBEb24ndCBzdGFydCB0aGUgdGltZXIgbm93LCBsZXQgaXQgc3RhcnQgb24gdGhlCisJCSAgIGZpcnN0IGhlYXJ0YmVhdC4gKi8KKwkJaXBtaV9zdGFydF90aW1lcl9vbl9oZWFydGJlYXQgPSAxOworCQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm8sIGZpbGVwKTsKIAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoLUVOT0RFVik7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgtRU5PREVWKTsKICAgICAgICAgfQogfQogCkBAIC04MTcsMTUgKzgxNCwxOSBAQAogc3RhdGljIGludAogaXBtaV9ubWkodm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSwgaW50IGhhbmRsZWQpCiB7CisgICAgICAgIC8qIElmIHdlIGFyZSBub3QgZXhwZWN0aW5nIGEgdGltZW91dCwgaWdub3JlIGl0LiAqLworCWlmIChpcG1pX3dhdGNoZG9nX3N0YXRlID09IFdET0dfVElNRU9VVF9OT05FKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKIAkvKiBJZiBubyBvbmUgZWxzZSBoYW5kbGVkIHRoZSBOTUksIHdlIGFzc3VtZSBpdCB3YXMgdGhlIElQTUkKICAgICAgICAgICAgd2F0Y2hkb2cuICovCi0JaWYgKCghaGFuZGxlZCkgJiYgKHByZW9wX3ZhbCA9PSBXRE9HX1BSRU9QX1BBTklDKSkKKwlpZiAoKCFoYW5kbGVkKSAmJiAocHJlb3BfdmFsID09IFdET0dfUFJFT1BfUEFOSUMpKSB7CisJCS8qIE9uIHNvbWUgbWFjaGluZXMsIHRoZSBoZWFydGJlYXQgd2lsbCBnaXZlCisJCSAgIGFuIGVycm9yIGFuZCBub3Qgd29yayB1bmxlc3Mgd2UgcmUtZW5hYmxlCisJCSAgIHRoZSB0aW1lci4gICBTbyBkbyBzby4gKi8KKwkJcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDE7CiAJCXBhbmljKFBGWCAicHJlLXRpbWVvdXQiKTsKLQotCS8qIE9uIHNvbWUgbWFjaGluZXMsIHRoZSBoZWFydGJlYXQgd2lsbCBnaXZlCi0JICAgYW4gZXJyb3IgYW5kIG5vdCB3b3JrIHVubGVzcyB3ZSByZS1lbmFibGUKLQkgICB0aGUgdGltZXIuICAgU28gZG8gc28uICovCi0JcHJldGltZW91dF9zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDE7CisJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQpAQCAtOTI0LDkgKzkyNSw2IEBACiB7CiAJaW50IHJ2OwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggImRyaXZlciB2ZXJzaW9uICIKLQkgICAgICAgSVBNSV9XQVRDSERPR19WRVJTSU9OICJcbiIpOwotCiAJaWYgKHN0cmNtcChhY3Rpb24sICJyZXNldCIpID09IDApIHsKIAkJYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9SRVNFVDsKIAl9IGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJub25lIikgPT0gMCkgewpAQCAtMTAxMSw2ICsxMDA5LDggQEAKIAlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkb2dfcmVib290X25vdGlmaWVyKTsKIAlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJndkb2dfcGFuaWNfbm90aWZpZXIpOwogCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImRyaXZlciBpbml0aWFsaXplZFxuIik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAzNywxMCArMTAzNyw4IEBACiAJLyogV2FpdCB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgbWFrZXMgaXQgb3V0LiAgVGhlIGxvd2VyIGxheWVyIGhhcwogCSAgIHBvaW50ZXJzIHRvIG91ciBidWZmZXJzLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkb25lIGJlZm9yZQogCSAgIHdlIHJlbGVhc2Ugb3VyIG1lbW9yeS4gKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnNldF90aW1lb3V0X3RvZnJlZSkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwl3aGlsZSAoYXRvbWljX3JlYWQoJnNldF90aW1lb3V0X3RvZnJlZSkpCisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCiAJLyogRGlzY29ubmVjdCBmcm9tIElQTUkuICovCiAJcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcih3YXRjaGRvZ191c2VyKTsKQEAgLTEwNjIsMyArMTA2MCw1IEBACiBtb2R1bGVfZXhpdChpcG1pX3dkb2dfZXhpdCk7CiBtb2R1bGVfaW5pdChpcG1pX3dkb2dfaW5pdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIndhdGNoZG9nIHRpbWVyIGJhc2VkIHVwb24gdGhlIElQTUkgaW50ZXJmYWNlLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCmluZGV4IDUyYTA3M2UuLjljMTllNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogICoJbXVjaCBjaGVhcGVyIG9uIGhvc3QgY3B1IHRoYW4gdXNpbmcgaW50ZXJydXB0cy4gSXQgdHVybnMgb3V0IHRvCiAgKglub3QgaW5jcmVhc2UgY2hhcmFjdGVyIGxhdGVuY3kgYnkgbXVjaCBlaXRoZXIuLi4KICAqLwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHN0bGlfdGltZXJsaXN0ID0gVElNRVJfSU5JVElBTElaRVIoc3RsaV9wb2xsLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoc3RsaV90aW1lcmxpc3QsIHN0bGlfcG9sbCwgMCwgMCk7CiAKIHN0YXRpYyBpbnQJc3RsaV90aW1lcm9uOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCmluZGV4IDUyM2ZkM2MuLjQ0OWQwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCisrKyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBgU3RpY2t5JyBtb2RpZmllciBrZXlzLCA5NTEwMDYuCiAgKgogICogMTEtMTEtOTY6IFNBSyBzaG91bGQgbm93IHdvcmsgaW4gdGhlIHJhdyBtb2RlIChNYXJ0aW4gTWFyZXMpCi0gKiAKKyAqCiAgKiBNb2RpZmllZCB0byBwcm92aWRlICdnZW5lcmljJyBrZXlib2FyZCBzdXBwb3J0IGJ5IEhhbWlzaCBNYWNkb25hbGQKICAqIE1lcmdlIHdpdGggdGhlIG02OGsga2V5Ym9hcmQgZHJpdmVyIGFuZCBzcGxpdC1vZmYgb2YgdGhlIFBDIGxvdy1sZXZlbAogICogcGFydHMgYnkgR2VlcnQgVXl0dGVyaG9ldmVuLCBNYXkgMTk5NwpAQCAtNTIsNyArNTIsNyBAQAogLyoKICAqIFNvbWUgbGFwdG9wcyB0YWtlIHRoZSA3ODl1aW9qa2xtLC4ga2V5cyBhcyBudW1iZXIgcGFkIHdoZW4gTnVtTG9jayBpcyBvbi4KICAqIFRoaXMgc2VlbXMgYSBnb29kIHJlYXNvbiB0byBzdGFydCB3aXRoIE51bUxvY2sgb2ZmLiBPbiBISUwga2V5Ym9hcmRzCi0gKiBvZiBQQVJJU0MgbWFjaGluZXMgaG93ZXZlciB0aGVyZSBpcyBubyBOdW1Mb2NrIGtleSBhbmQgZXZlcnlvbmUgZXhwZWN0cyB0aGUga2V5cGFkIAorICogb2YgUEFSSVNDIG1hY2hpbmVzIGhvd2V2ZXIgdGhlcmUgaXMgbm8gTnVtTG9jayBrZXkgYW5kIGV2ZXJ5b25lIGV4cGVjdHMgdGhlIGtleXBhZAogICogdG8gYmUgdXNlZCBmb3IgbnVtYmVycy4KICAqLwogCkBAIC03NiwxNyArNzYsMTcgQEAKIAlrX21ldGEsCQlrX2FzY2lpLAlrX2xvY2ssCQlrX2xvd2VyY2FzZSxcCiAJa19zbG9jaywJa19kZWFkMiwJa19pZ25vcmUsCWtfaWdub3JlCiAKLXR5cGVkZWYgdm9pZCAoa19oYW5kbGVyX2ZuKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIAordHlwZWRlZiB2b2lkIChrX2hhbmRsZXJfZm4pKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwKIAkJCSAgICBjaGFyIHVwX2ZsYWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBrX2hhbmRsZXJfZm4gS19IQU5ETEVSUzsKIHN0YXRpYyBrX2hhbmRsZXJfZm4gKmtfaGFuZGxlclsxNl0gPSB7IEtfSEFORExFUlMgfTsKIAogI2RlZmluZSBGTl9IQU5ETEVSU1wKLQlmbl9udWxsLCAJZm5fZW50ZXIsCWZuX3Nob3dfcHRyZWdzLAlmbl9zaG93X21lbSxcCi0JZm5fc2hvd19zdGF0ZSwJZm5fc2VuZF9pbnRyLCAJZm5fbGFzdGNvbnMsIAlmbl9jYXBzX3RvZ2dsZSxcCi0JZm5fbnVtLAkJZm5faG9sZCwgCWZuX3Njcm9sbF9mb3J3LAlmbl9zY3JvbGxfYmFjayxcCi0JZm5fYm9vdF9pdCwgCWZuX2NhcHNfb24sIAlmbl9jb21wb3NlLAlmbl9TQUssXAotCWZuX2RlY19jb25zb2xlLCBmbl9pbmNfY29uc29sZSwgZm5fc3Bhd25fY29uLCAJZm5fYmFyZV9udW0KKwlmbl9udWxsLAlmbl9lbnRlciwJZm5fc2hvd19wdHJlZ3MsCWZuX3Nob3dfbWVtLFwKKwlmbl9zaG93X3N0YXRlLAlmbl9zZW5kX2ludHIsCWZuX2xhc3Rjb25zLAlmbl9jYXBzX3RvZ2dsZSxcCisJZm5fbnVtLAkJZm5faG9sZCwJZm5fc2Nyb2xsX2ZvcncsCWZuX3Njcm9sbF9iYWNrLFwKKwlmbl9ib290X2l0LAlmbl9jYXBzX29uLAlmbl9jb21wb3NlLAlmbl9TQUssXAorCWZuX2RlY19jb25zb2xlLCBmbl9pbmNfY29uc29sZSwgZm5fc3Bhd25fY29uLAlmbl9iYXJlX251bQogCiB0eXBlZGVmIHZvaWQgKGZuX2hhbmRsZXJfZm4pKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogc3RhdGljIGZuX2hhbmRsZXJfZm4gRk5fSEFORExFUlM7CkBAIC0xNTksMTMgKzE1OSwxMyBAQAogICovCiBpbnQgZ2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaChub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKLQkJc3RydWN0IGlucHV0X2hhbmRsZSAqIGhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOwotCQlpZiAoaGFuZGxlLT5kZXYtPmtleWNvZGVzaXplKSB7IAotCQkJZGV2ID0gaGFuZGxlLT5kZXY7IAorCWxpc3RfZm9yX2VhY2gobm9kZSwgJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKKwkJaWYgKGhhbmRsZS0+ZGV2LT5rZXljb2Rlc2l6ZSkgeworCQkJZGV2ID0gaGFuZGxlLT5kZXY7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE4MSwxNSArMTgxLDE1IEBACiAKIGludCBzZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBOVUxMOwogCXVuc2lnbmVkIGludCBpLCBvbGRrZXk7CiAKLQlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCWxpc3RfZm9yX2VhY2gobm9kZSwgJmtiZF9oYW5kbGVyLmhfbGlzdCkgewogCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKLQkJaWYgKGhhbmRsZS0+ZGV2LT5rZXljb2Rlc2l6ZSkgeyAKLQkJCWRldiA9IGhhbmRsZS0+ZGV2OyAKLQkJCWJyZWFrOyAKKwkJaWYgKGhhbmRsZS0+ZGV2LT5rZXljb2Rlc2l6ZSkgeworCQkJZGV2ID0gaGFuZGxlLT5kZXY7CisJCQlicmVhazsKIAkJfQogCX0KIApAQCAtMjAwLDcgKzIwMCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGtleWNvZGUgPj4gKGRldi0+a2V5Y29kZXNpemUgKiA4KSkKKwlpZiAoZGV2LT5rZXljb2Rlc2l6ZSA8IHNpemVvZihrZXljb2RlKSAmJiAoa2V5Y29kZSA+PiAoZGV2LT5rZXljb2Rlc2l6ZSAqIDgpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlvbGRrZXkgPSBTRVRfSU5QVVRfS0VZQ09ERShkZXYsIHNjYW5jb2RlLCBrZXljb2RlKTsKQEAgLTIxNiwxMSArMjE2LDExIEBACiB9CiAKIC8qCi0gKiBNYWtpbmcgYmVlcHMgYW5kIGJlbGxzLiAKKyAqIE1ha2luZyBiZWVwcyBhbmQgYmVsbHMuCiAgKi8KIHN0YXRpYyB2b2lkIGtkX25vc291bmQodW5zaWduZWQgbG9uZyBpZ25vcmVkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAKIAlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgewogCQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKQEAgLTIzMywxNyArMjMzLDE2IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qga2RfbWtzb3VuZF90aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKGtkX25vc291bmQsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihrZF9ta3NvdW5kX3RpbWVyLCBrZF9ub3NvdW5kLCAwLCAwKTsKIAogdm9pZCBrZF9ta3NvdW5kKHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAKIAlkZWxfdGltZXIoJmtkX21rc291bmRfdGltZXIpOwogCiAJaWYgKGh6KSB7Ci0JCWxpc3RfZm9yX2VhY2hfcHJldihub2RlLCZrYmRfaGFuZGxlci5oX2xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9wcmV2KG5vZGUsICZrYmRfaGFuZGxlci5oX2xpc3QpIHsKIAkJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOwogCQkJaWYgKHRlc3RfYml0KEVWX1NORCwgaGFuZGxlLT5kZXYtPmV2Yml0KSkgewogCQkJCWlmICh0ZXN0X2JpdChTTkRfVE9ORSwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpIHsKQEAgLTMzOCwxOSArMzM3LDE5IEBACiAJaWYgKGMgPCAweDgwKQogCQkvKiAgMCoqKioqKiogKi8KIAkJcHV0X3F1ZXVlKHZjLCBjKTsKLSAgICAJZWxzZSBpZiAoYyA8IDB4ODAwKSB7CisJZWxzZSBpZiAoYyA8IDB4ODAwKSB7CiAJCS8qIDExMCoqKioqIDEwKioqKioqICovCi0JCXB1dF9xdWV1ZSh2YywgMHhjMCB8IChjID4+IDYpKTsgCisJCXB1dF9xdWV1ZSh2YywgMHhjMCB8IChjID4+IDYpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7Ci0gICAgCX0gZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogMTExMCoqKiogMTAqKioqKiogMTAqKioqKiogKi8KIAkJcHV0X3F1ZXVlKHZjLCAweGUwIHwgKGMgPj4gMTIpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDYpICYgMHgzZikpOwogCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoYyAmIDB4M2YpKTsKLSAgICAJfQorCX0KIH0KIAotLyogCisvKgogICogQ2FsbGVkIGFmdGVyIHJldHVybmluZyBmcm9tIFJBVyBtb2RlIG9yIHdoZW4gY2hhbmdpbmcgY29uc29sZXMgLSByZWNvbXB1dGUKICAqIHNoaWZ0X2Rvd25bXSBhbmQgc2hpZnRfc3RhdGUgZnJvbSBrZXlfZG93bltdIG1heWJlIGNhbGxlZCB3aGVuIGtleW1hcCBpcwogICogdW5kZWZpbmVkLCBzbyB0aGF0IHNoaWZ0a2V5IHJlbGVhc2UgaXMgc2VlbgpAQCAtMzYxLDcgKzM2MCw3IEBACiAKIAlzaGlmdF9zdGF0ZSA9IDA7CiAJbWVtc2V0KHNoaWZ0X2Rvd24sIDAsIHNpemVvZihzaGlmdF9kb3duKSk7Ci0JCisKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXlfZG93bik7IGkrKykgewogCiAJCWlmICgha2V5X2Rvd25baV0pCkBAIC01MDAsOSArNDk5LDkgQEAKIAlpZiAod2FudF9jb25zb2xlICE9IC0xKQogCQljdXIgPSB3YW50X2NvbnNvbGU7CiAKLQlmb3IgKGkgPSBjdXItMTsgaSAhPSBjdXI7IGktLSkgeworCWZvciAoaSA9IGN1ciAtIDE7IGkgIT0gY3VyOyBpLS0pIHsKIAkJaWYgKGkgPT0gLTEpCi0JCQlpID0gTUFYX05SX0NPTlNPTEVTLTE7CisJCQlpID0gTUFYX05SX0NPTlNPTEVTIC0gMTsKIAkJaWYgKHZjX2NvbnNfYWxsb2NhdGVkKGkpKQogCQkJYnJlYWs7CiAJfQpAQCAtNTY4LDkgKzU2Nyw5IEBACiAKIHN0YXRpYyB2b2lkIGZuX3NwYXduX2NvbihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotICAgICAgICBpZiAoc3Bhd25waWQpCi0JICAgaWYoa2lsbF9wcm9jKHNwYXducGlkLCBzcGF3bnNpZywgMSkpCi0JICAgICBzcGF3bnBpZCA9IDA7CisJaWYgKHNwYXducGlkKQorCQlpZiAoa2lsbF9wcm9jKHNwYXducGlkLCBzcGF3bnNpZywgMSkpCisJCQlzcGF3bnBpZCA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGZuX1NBSyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNjA0LDggKzYwMyw4IEBACiAJCXJldHVybjsKIAlpZiAodmFsdWUgPj0gQVJSQVlfU0laRShmbl9oYW5kbGVyKSkKIAkJcmV0dXJuOwotCWlmICgoa2JkLT5rYmRtb2RlID09IFZDX1JBVyB8fCAKLQkgICAgIGtiZC0+a2JkbW9kZSA9PSBWQ19NRURJVU1SQVcpICYmIAorCWlmICgoa2JkLT5rYmRtb2RlID09IFZDX1JBVyB8fAorCSAgICAga2JkLT5rYmRtb2RlID09IFZDX01FRElVTVJBVykgJiYKIAkgICAgIHZhbHVlICE9IEtWQUwoS19TQUspKQogCQlyZXR1cm47CQkvKiBTQUsgaXMgYWxsb3dlZCBldmVuIGluIHJhdyBtb2RlICovCiAJZm5faGFuZGxlclt2YWx1ZV0odmMsIHJlZ3MpOwpAQCAtODk1LDExICs4OTQsMTEgQEAKIAogc3RhdGljIHZvaWQga2JkX2JoKHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKIAl1bnNpZ25lZCBjaGFyIGxlZHMgPSBnZXRsZWRzKCk7CiAKIAlpZiAobGVkcyAhPSBsZWRzdGF0ZSkgewotCQlsaXN0X2Zvcl9lYWNoKG5vZGUsJmtiZF9oYW5kbGVyLmhfbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZrYmRfaGFuZGxlci5oX2xpc3QpIHsKIAkJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKiBoYW5kbGUgPSB0b19oYW5kbGVfaChub2RlKTsKIAkJCWlucHV0X2V2ZW50KGhhbmRsZS0+ZGV2LCBFVl9MRUQsIExFRF9TQ1JPTExMLCAhIShsZWRzICYgMHgwMSkpOwogCQkJaW5wdXRfZXZlbnQoaGFuZGxlLT5kZXYsIEVWX0xFRCwgTEVEX05VTUwsICAgICEhKGxlZHMgJiAweDAyKSk7CkBAIC05NjQsMTEgKzk2MywxMSBAQAogZXh0ZXJuIHZvaWQgc3VuX2RvX2JyZWFrKHZvaWQpOwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgZW11bGF0ZV9yYXcoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQga2V5Y29kZSwgCitzdGF0aWMgaW50IGVtdWxhdGVfcmF3KHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgaW50IGtleWNvZGUsCiAJCSAgICAgICB1bnNpZ25lZCBjaGFyIHVwX2ZsYWcpCiB7CiAJaWYgKGtleWNvZGUgPiAyNTUgfHwgIXg4Nl9rZXljb2Rlc1trZXljb2RlXSkKLQkJcmV0dXJuIC0xOyAKKwkJcmV0dXJuIC0xOwogCiAJc3dpdGNoIChrZXljb2RlKSB7CiAJCWNhc2UgS0VZX1BBVVNFOgpAQCAtOTgyLDcgKzk4MSw3IEBACiAJCWNhc2UgS0VZX0hBTkpBOgogCQkJaWYgKCF1cF9mbGFnKSBwdXRfcXVldWUodmMsIDB4ZjIpOwogCQkJcmV0dXJuIDA7Ci0JfSAKKwl9CiAKIAlpZiAoa2V5Y29kZSA9PSBLRVlfU1lTUlEgJiYgc3lzcnFfYWx0KSB7CiAJCXB1dF9xdWV1ZSh2YywgMHg1NCB8IHVwX2ZsYWcpOwpAQCAtMTEwNSwxMSArMTEwNCwxMiBAQAogCWVsc2UKIAkJY2xlYXJfYml0KGtleWNvZGUsIGtleV9kb3duKTsKIAotCWlmIChyZXAgJiYgKCF2Y19rYmRfbW9kZShrYmQsIFZDX1JFUEVBVCkgfHwgKHR0eSAmJiAKLQkJKCFMX0VDSE8odHR5KSAmJiB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpKSkpIHsKKwlpZiAocmVwICYmCisJICAgICghdmNfa2JkX21vZGUoa2JkLCBWQ19SRVBFQVQpIHx8CisJICAgICAodHR5ICYmICFMX0VDSE8odHR5KSAmJiB0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpKSkgewogCQkvKgogCQkgKiBEb24ndCByZXBlYXQgYSBrZXkgaWYgdGhlIGlucHV0IGJ1ZmZlcnMgYXJlIG5vdCBlbXB0eSBhbmQgdGhlCi0JCSAqIGNoYXJhY3RlcnMgZ2V0IGFyZW4ndCBlY2hvZWQgbG9jYWxseS4gVGhpcyBtYWtlcyBrZXkgcmVwZWF0IAorCQkgKiBjaGFyYWN0ZXJzIGdldCBhcmVuJ3QgZWNob2VkIGxvY2FsbHkuIFRoaXMgbWFrZXMga2V5IHJlcGVhdAogCQkgKiB1c2FibGUgd2l0aCBzbG93IGFwcGxpY2F0aW9ucyBhbmQgdW5kZXIgaGVhdnkgbG9hZHMuCiAJCSAqLwogCQlyZXR1cm47CkBAIC0xMTMxLDcgKzExMzEsOCBAQAogCXR5cGUgPSBLVFlQKGtleXN5bSk7CiAKIAlpZiAodHlwZSA8IDB4ZjApIHsKLQkJaWYgKGRvd24gJiYgIXJhd19tb2RlKSB0b191dGY4KHZjLCBrZXlzeW0pOworCQlpZiAoZG93biAmJiAhcmF3X21vZGUpCisJCQl0b191dGY4KHZjLCBrZXlzeW0pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTU1LDcgKzExNTYsNyBAQAogCQlrYmQtPnNsb2Nrc3RhdGUgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBrYmRfZXZlbnQoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgZXZlbnRfdHlwZSwgCitzdGF0aWMgdm9pZCBrYmRfZXZlbnQoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgZXZlbnRfdHlwZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGV2ZW50X2NvZGUsIGludCB2YWx1ZSkKIHsKIAlpZiAoZXZlbnRfdHlwZSA9PSBFVl9NU0MgJiYgZXZlbnRfY29kZSA9PSBNU0NfUkFXICYmIEhXX1JBVyhoYW5kbGUtPmRldikpCkBAIC0xMTY3LDE1ICsxMTY4LDEzIEBACiAJc2NoZWR1bGVfY29uc29sZV9jYWxsYmFjaygpOwogfQogCi1zdGF0aWMgY2hhciBrYmRfbmFtZVtdID0gImtiZCI7Ci0KIC8qCiAgKiBXaGVuIGEga2V5Ym9hcmQgKG9yIG90aGVyIGlucHV0IGRldmljZSkgaXMgZm91bmQsIHRoZSBrYmRfY29ubmVjdAogICogZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGUgZnVuY3Rpb24gdGhlbiBsb29rcyBhdCB0aGUgZGV2aWNlLCBhbmQgaWYgaXQKICAqIGxpa2VzIGl0LCBpdCBjYW4gb3BlbiBpdCBhbmQgZ2V0IGV2ZW50cyBmcm9tIGl0LiBJbiB0aGlzIChrYmRfY29ubmVjdCkKICAqIGZ1bmN0aW9uLCB3ZSBzaG91bGQgZGVjaWRlIHdoaWNoIFZUIHRvIGJpbmQgdGhhdCBrZXlib2FyZCB0byBpbml0aWFsbHkuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfaGFuZGxlICprYmRfY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlciwgCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZSAqa2JkX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsCiAJCQkJCXN0cnVjdCBpbnB1dF9kZXYgKmRldiwKIAkJCQkJc3RydWN0IGlucHV0X2RldmljZV9pZCAqaWQpCiB7CkBAIC0xMTgzLDE4ICsxMTgyLDE5IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSBLRVlfUkVTRVJWRUQ7IGkgPCBCVE5fTUlTQzsgaSsrKQotCQlpZiAodGVzdF9iaXQoaSwgZGV2LT5rZXliaXQpKSBicmVhazsKKwkJaWYgKHRlc3RfYml0KGksIGRldi0+a2V5Yml0KSkKKwkJCWJyZWFrOwogCi0JaWYgKChpID09IEJUTl9NSVNDKSAmJiAhdGVzdF9iaXQoRVZfU05ELCBkZXYtPmV2Yml0KSkgCisJaWYgKGkgPT0gQlROX01JU0MgJiYgIXRlc3RfYml0KEVWX1NORCwgZGV2LT5ldmJpdCkpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKCEoaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2hhbmRsZSksIEdGUF9LRVJORUwpKSkgCisJaWYgKCEoaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2hhbmRsZSksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIE5VTEw7CiAJbWVtc2V0KGhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9oYW5kbGUpKTsKIAogCWhhbmRsZS0+ZGV2ID0gZGV2OwogCWhhbmRsZS0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JaGFuZGxlLT5uYW1lID0ga2JkX25hbWU7CisJaGFuZGxlLT5uYW1lID0gImtiZCI7CiAKIAlpbnB1dF9vcGVuX2RldmljZShoYW5kbGUpOwogCWtiZF9yZWZyZXNoX2xlZHMoaGFuZGxlKTsKQEAgLTEyMTMsMTEgKzEyMTMsMTEgQEAKICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCiAgICAgICAgICAgICAgICAgLmV2Yml0ID0geyBCSVQoRVZfS0VZKSB9LAogICAgICAgICB9LAotCQorCiAJewogICAgICAgICAgICAgICAgIC5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCwKICAgICAgICAgICAgICAgICAuZXZiaXQgPSB7IEJJVChFVl9TTkQpIH0sCi0gICAgICAgIH0sCQorICAgICAgICB9LAogCiAJeyB9LCAgICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9sY2QuYyBiL2RyaXZlcnMvY2hhci9sY2QuYwppbmRleCBjZjAxYTcyLi5iNzcxNjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbGNkLmMKKysrIGIvZHJpdmVycy9jaGFyL2xjZC5jCkBAIC02MTMsMTAgKzYxMywxNSBAQAogCiBzdGF0aWMgaW50IGxjZF9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAlwcl9pbmZvKCIlc1xuIiwgTENEX0RSSVZFUik7Ci0JbWlzY19yZWdpc3RlcigmbGNkX2Rldik7CisJcmV0ID0gbWlzY19yZWdpc3RlcigmbGNkX2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIExDRCAiVW5hYmxlIHRvIHJlZ2lzdGVyIG1pc2MgZGV2aWNlLlxuIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogQ2hlY2sgcmVnaW9uPyBOYWFhaCEgSnVzdCBzbmFyZiBpdCB1cC4gKi8KIC8qCXJlcXVlc3RfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5ULCAibGNkIik7Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9scC5jIGIvZHJpdmVycy9jaGFyL2xwLmMKaW5kZXggNTllZWJlNS4uMmFmYjkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2xwLmMKKysrIGIvZHJpdmVycy9jaGFyL2xwLmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI3VuZGVmIExQX1NUQVRTCkBAIC0zMDcsNyArMzA4LDcgQEAKIAkJCShMUF9GKG1pbm9yKSAmIExQX0FCT1JUKSk7CiAKICNpZmRlZiBMUF9TVEFUUwotCWlmIChqaWZmaWVzLWxwX3RhYmxlW21pbm9yXS5sYXN0Y2FsbCA+IExQX1RJTUUobWlub3IpKQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGxwX3RhYmxlW21pbm9yXS5sYXN0Y2FsbCArIExQX1RJTUUobWlub3IpKSkKIAkJbHBfdGFibGVbbWlub3JdLnJ1bmNoYXJzID0gMDsKIAogCWxwX3RhYmxlW21pbm9yXS5sYXN0Y2FsbCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWJjcy5jIGIvZHJpdmVycy9jaGFyL21iY3MuYwppbmRleCAxMTVkYmIzLi4zZmE2NGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWJjcy5jCisrKyBiL2RyaXZlcnMvY2hhci9tYmNzLmMKQEAgLTc1MCw3ICs3NTAsNyBAQAogCiAJZGV2LT5zb2Z0ID0gTlVMTDsKIAotCXNvZnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbWJjc19zb2Z0KSwgR0ZQX0tFUk5FTCk7CisJc29mdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYmNzX3NvZnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc29mdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDg1MGE3OGMuLmYxODI3NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTM1LDEwICszNSw2IEBACiAjIGluY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TMzkwX1RBUEUpICYmIGRlZmluZWQoQ09ORklHX1MzOTBfVEFQRV9DSEFSKQotZXh0ZXJuIHZvaWQgdGFwZWNoYXJfaW5pdCh2b2lkKTsKLSNlbmRpZgotCiAvKgogICogQXJjaGl0ZWN0dXJlcyB2YXJ5IGluIGhvdyB0aGV5IGhhbmRsZSBjYWNoaW5nIGZvciBhZGRyZXNzZXMKICAqIG91dHNpZGUgb2YgbWFpbiBtZW1vcnkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwppbmRleCA5MzFlZmQ1Li4wYzgzNzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWlzYy5jCisrKyBiL2RyaXZlcnMvY2hhci9taXNjLmMKQEAgLTYzLDggKzYzLDYgQEAKICNkZWZpbmUgRFlOQU1JQ19NSU5PUlMgNjQgLyogbGlrZSBkeW5hbWljIG1ham9ycyAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgbWlzY19taW5vcnNbRFlOQU1JQ19NSU5PUlMgLyA4XTsKIAotZXh0ZXJuIGludCBydGNfRFA4NTcwQV9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBydGNfTUs0OFQwOF9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBwbXVfZGV2aWNlX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtMzAzLDEyICszMDEsNyBAQAogCW1pc2NfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtaXNjIik7CiAJaWYgKElTX0VSUihtaXNjX2NsYXNzKSkKIAkJcmV0dXJuIFBUUl9FUlIobWlzY19jbGFzcyk7Ci0jaWZkZWYgQ09ORklHX01WTUUxNngKLQlydGNfTUs0OFQwOF9pbml0KCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQlZNRTYwMDAKLQlydGNfRFA4NTcwQV9pbml0KCk7Ci0jZW5kaWYKKwogCWlmIChyZWdpc3Rlcl9jaHJkZXYoTUlTQ19NQUpPUiwibWlzYyIsJm1pc2NfZm9wcykpIHsKIAkJcHJpbnRrKCJ1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBtaXNjIGRldmljZXNcbiIsCiAJCSAgICAgICBNSVNDX01BSk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKaW5kZXggZDBlZjFhZS4uNDVkMDEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyLmMKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmMKQEAgLTEwNTgsOCArMTA1OCw3IEBACiAJCSAqLwogCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCQl3aGlsZSAoIShpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCg1KTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSg1KTsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMDgwLDEwICsxMDc5LDggQEAKIAlpbmZvLT5ldmVudCA9IDA7CiAJaW5mby0+dHR5ID0gTlVMTDsKIAlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7Ci0JCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoaW5mby0+Y2xvc2VfZGVsYXkpOwotCQl9CisJCWlmIChpbmZvLT5jbG9zZV9kZWxheSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShpbmZvLT5jbG9zZV9kZWxheSk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKIAl9CiAKQEAgLTE4MDEsOCArMTc5OCw3IEBACiAjaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAogCQlwcmludGsoImxzciA9ICVkIChqaWZmPSVsdSkuLi4iLCBsc3IsIGppZmZpZXMpOwogI2VuZGlmCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoY2hhcl90aW1lKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNoYXJfdGltZSk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fdHR5LmMgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwppbmRleCAwOTEwM2IzLi5jOWJkZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl90dHkuYworKysgYi9kcml2ZXJzL2NoYXIvbl90dHkuYwpAQCAtNjIsNyArNjIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKmFsbG9jX2J1Zih2b2lkKQogewotCWludCBwcmlvID0gaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKKwl1bnNpZ25lZCBpbnQgcHJpbyA9IGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUw7CiAKIAlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQogCQlyZXR1cm4ga21hbGxvYyhOX1RUWV9CVUZfU0laRSwgcHJpbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKaW5kZXggN2EwYzc0NjQuLjAyZDdmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbGludXgvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCiAgKgotICogJElkOiBzeW5jbGlua19jcy5jLHYgNC4yNiAyMDA0LzA4LzExIDE5OjMwOjAyIHBhdWxrZiBFeHAgJAorICogJElkOiBzeW5jbGlua19jcy5jLHYgNC4zNCAyMDA1LzA5LzA4IDEzOjIwOjU0IHBhdWxrZiBFeHAgJAogICoKICAqIERldmljZSBkcml2ZXIgZm9yIE1pY3JvZ2F0ZSBTeW5jTGluayBQQyBDYXJkCiAgKiBtdWx0aXByb3RvY29sIHNlcmlhbCBhZGFwdGVyLgpAQCAtNDcyLDcgKzQ3Miw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBQQyBDYXJkIGRyaXZlciI7Ci1zdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjI2ICQiOworc3RhdGljIGNoYXIgKmRyaXZlcl92ZXJzaW9uID0gIiRSZXZpc2lvbjogNC4zNCAkIjsKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfZHJpdmVyOwogCkBAIC0xNDU3LDYgKzE0NTcsOCBAQAogCiAJaW5mby0+cGVuZGluZ19iaCA9IDA7CiAJCisJbWVtc2V0KCZpbmZvLT5pY291bnQsIDAsIHNpemVvZihpbmZvLT5pY291bnQpKTsKKwogCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKIAlpbmZvLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKIAlpbmZvLT50eF90aW1lci5mdW5jdGlvbiA9IHR4X3RpbWVvdXQ7CkBAIC0xOTQ2LDkgKzE5NDgsMTMgQEAKIAlpbnQgZXJyOwogCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQogCQlwcmludGsoImdldF9wYXJhbXMoJXMpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSk7Ci0JQ09QWV9UT19VU0VSKGVycix1c2VyX2ljb3VudCwgJmluZm8tPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX2ljb3VudCkpOwotCWlmIChlcnIpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghdXNlcl9pY291bnQpIHsKKwkJbWVtc2V0KCZpbmZvLT5pY291bnQsIDAsIHNpemVvZihpbmZvLT5pY291bnQpKTsKKwl9IGVsc2UgeworCQlDT1BZX1RPX1VTRVIoZXJyLCB1c2VyX2ljb3VudCwgJmluZm8tPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX2ljb3VudCkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKaW5kZXggZGEzMjg4OS4uNDlmMzk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3B0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtMTQ5LDE1ICsxNDksMTQgQEAKIHN0YXRpYyBpbnQgcHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0byA9IHR0eS0+bGluazsKLQlzc2l6ZV90ICgqY2hhcnNfaW5fYnVmZmVyKShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIAlpbnQgY291bnQ7CiAKIAkvKiBXZSBzaG91bGQgZ2V0IHRoZSBsaW5lIGRpc2NpcGxpbmUgbG9jayBmb3IgInR0eS0+bGluayIgKi8KLQlpZiAoIXRvIHx8ICEoY2hhcnNfaW5fYnVmZmVyID0gdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcikpCisJaWYgKCF0byB8fCAhdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcikKIAkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgbGRpc2MgbXVzdCByZXBvcnQgMCBpZiBubyBjaGFyYWN0ZXJzIGF2YWlsYWJsZSB0byBiZSByZWFkICovCi0JY291bnQgPSBjaGFyc19pbl9idWZmZXIodG8pOworCWNvdW50ID0gdG8tPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0byk7CiAKIAlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUpIHJldHVybiBjb3VudDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCmluZGV4IGNlZmJlOTguLjM2YWU5YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zb255cGkuYworKysgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKQEAgLTk4LDEyICs5OCwxMyBAQAogCiAjZGVmaW5lIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEJMQogI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKKyNkZWZpbmUgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMwkzCiAKIC8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KICNkZWZpbmUgU09OWVBJX0lSUV9QT1JUCQkJMHg4MDM0CiAjZGVmaW5lIFNPTllQSV9JUlFfU0hJRlQJCTIyCi0jZGVmaW5lIFNPTllQSV9CQVNFCQkJMHg1MAotI2RlZmluZSBTT05ZUElfRzEwQQkJCShTT05ZUElfQkFTRSsweDE0KQorI2RlZmluZSBTT05ZUElfVFlQRTFfQkFTRQkJMHg1MAorI2RlZmluZSBTT05ZUElfRzEwQQkJCShTT05ZUElfVFlQRTFfQkFTRSsweDE0KQogI2RlZmluZSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkUJMHgwOAogI2RlZmluZSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVAkweDA0CiAKQEAgLTExNCw2ICsxMTUsMTMgQEAKICNkZWZpbmUgU09OWVBJX1RZUEUyX1JFR0lPTl9TSVpFCTB4MjAKICNkZWZpbmUgU09OWVBJX1RZUEUyX0VWVFlQRV9PRkZTRVQJMHgxMgogCisvKiB0eXBlMyBzZXJpZXMgc3BlY2lmaWNzICovCisjZGVmaW5lIFNPTllQSV9UWVBFM19CQVNFCQkweDQwCisjZGVmaW5lIFNPTllQSV9UWVBFM19HSUQyCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg0OCkgLyogMTYgYml0cyAqLworI2RlZmluZSBTT05ZUElfVFlQRTNfTUlTQwkJKFNPTllQSV9UWVBFM19CQVNFKzB4NmQpIC8qIDggYml0cyAgKi8KKyNkZWZpbmUgU09OWVBJX1RZUEUzX1JFR0lPTl9TSVpFCTB4MjAKKyNkZWZpbmUgU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQJMHgxMgorCiAvKiBiYXR0ZXJ5IC8gYnJpZ2h0bmVzcyBhZGRyZXNzZXMgKi8KICNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiAjZGVmaW5lIFNPTllQSV9MQ0RfTElHSFQJMHg5NgpAQCAtMTU5LDYgKzE2NywxMCBAQAogCXsgMHgwLCAweDAgfQogfTsKIAorLyogc2FtZSBhcyBpbiB0eXBlIDIgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCAqc29ueXBpX3R5cGUzX2lvcG9ydF9saXN0ID0KKwlzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CisKIC8qIFRoZSBzZXQgb2YgcG9zc2libGUgaW50ZXJydXB0cyAqLwogc3RydWN0IHNvbnlwaV9pcnFfbGlzdCB7CiAJdTE2CWlycTsKQEAgLTE4MCw2ICsxOTIsOSBAQAogCXsgIDAsIDB4MDAgfQkvKiBubyBJUlEsIDB4MDAgaW4gU0lSUSBpbiBBTUwgKi8KIH07CiAKKy8qIHNhbWUgYXMgaW4gdHlwZTIgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqc29ueXBpX3R5cGUzX2lycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OworCiAjZGVmaW5lIFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUwkJMAogI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQogI2RlZmluZSBTT05ZUElfQ0FNRVJBX0hVRQkJCTIKQEAgLTIyMyw2ICsyMzgsNyBAQAogI2RlZmluZSBTT05ZUElfTUVZRV9NQVNLCQkJMHgwMDAwMDQwMAogI2RlZmluZSBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSwkJCTB4MDAwMDA4MDAKICNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgU09OWVBJX1dJUkVMRVNTX01BU0sJCQkweDAwMDAyMDAwCiAKIHN0cnVjdCBzb255cGlfZXZlbnQgewogCXU4CWRhdGE7CkBAIC0zMDUsNiArMzIxLDEzIEBACiAJeyAwLCAwIH0KIH07CiAKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfd2xlc3NldltdID0geworCXsgMHg1OSwgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OIH0sCisJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCisJeyAwLCAwIH0KK307CisKIC8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmFjayBidXR0b24gZXZlbnRzICovCiBzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmFja2V2W10gPSB7CiAJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCkBAIC0zODMsNyArNDA2LDYgQEAKIAl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAotCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAogCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCkBAIC0zOTEsNiArNDEzLDEyIEBACiAJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCiAJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCiAKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX1dJUkVMRVNTX01BU0ssIHNvbnlwaV93bGVzc2V2IH0sCisJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKIAl7IDAgfQogfTsKIApAQCAtNTYzLDYgKzU5MSwyMyBAQAogCXVkZWxheSgxMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNvbnlwaV90eXBlM19zcnModm9pZCkKK3sKKwl1MTYgdjE2OworCXU4ICB2ODsKKworCS8qIFRoaXMgbW9kZWwgdHlwZSB1c2VzIHRoZSBzYW1lIGluaXRpYWxpYXphdGlvbiBvZgorCSAqIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyIGFzIHRoZSB0eXBlMiBtb2RlbHMuICovCisJc29ueXBpX3R5cGUyX3NycygpOworCisJLyogSW5pdGlhbGl6YXRpb24gb2YgUENJIGNvbmZpZyBzcGFjZSBvZiB0aGUgTFBDIGludGVyZmFjZSBicmlkZ2UuICovCisJdjE2ID0gKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkZGMCkgfCAweDAxOworCXBjaV93cml0ZV9jb25maWdfd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX0dJRDIsIHYxNik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9UWVBFM19NSVNDLCAmdjgpOworCXY4ID0gKHY4ICYgMHhDRikgfCAweDEwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX01JU0MsIHY4KTsKK30KKwogLyogRGlzYWJsZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLwogc3RhdGljIHZvaWQgc29ueXBpX3R5cGUxX2Rpcyh2b2lkKQogewpAQCAtNTg3LDYgKzYzMiwxMyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwogfQogCitzdGF0aWMgdm9pZCBzb255cGlfdHlwZTNfZGlzKHZvaWQpCit7CisJc29ueXBpX3R5cGUyX2RpcygpOworCXVkZWxheSgxMCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfR0lEMiwgMCk7Cit9CisKIHN0YXRpYyB1OCBzb255cGlfY2FsbDEodTggZGV2KQogewogCXU4IHYxLCB2MjsKQEAgLTEwNjcsMTAgKzExMTksMTcgQEAKIAogc3RhdGljIHZvaWQgc29ueXBpX2VuYWJsZSh1bnNpZ25lZCBpbnQgY2FtZXJhX29uKQogewotCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpCi0JCXNvbnlwaV90eXBlMl9zcnMoKTsKLQllbHNlCisJc3dpdGNoIChzb255cGlfZGV2aWNlLm1vZGVsKSB7CisJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOgogCQlzb255cGlfdHlwZTFfc3JzKCk7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjoKKwkJc29ueXBpX3R5cGUyX3NycygpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTM6CisJCXNvbnlwaV90eXBlM19zcnMoKTsKKwkJYnJlYWs7CisJfQogCiAJc29ueXBpX2NhbGwxKDB4ODIpOwogCXNvbnlwaV9jYWxsMigweDgxLCAweGZmKTsKQEAgLTEwOTQsMTAgKzExNTMsMTggQEAKIAlpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCiAJCW91dGIoMHhmMSwgMHhiMik7CiAKLQlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKQotCQlzb255cGlfdHlwZTJfZGlzKCk7Ci0JZWxzZQorCXN3aXRjaCAoc29ueXBpX2RldmljZS5tb2RlbCkgeworCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMToKIAkJc29ueXBpX3R5cGUxX2RpcygpOworCQlicmVhazsKKwljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI6CisJCXNvbnlwaV90eXBlMl9kaXMoKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOgorCQlzb255cGlfdHlwZTNfZGlzKCk7CisJCWJyZWFrOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMTQzLDEyICsxMjEwLDE2IEBACiAJc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqaXJxX2xpc3Q7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKIAotCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCQkJUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOworCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKSkpCisJCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOworCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCisJCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOworCWVsc2UKKwkJc29ueXBpX2RldmljZS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7CiAKIAlzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKLQlzb255cGlfZGV2aWNlLm1vZGVsID0gcGNpZGV2ID8KLQkJU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSA6IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7CiAKIAlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwogCXNvbnlwaV9kZXZpY2UuZmlmbyA9IGtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKQEAgLTExNzYsMTYgKzEyNDcsMjIgQEAKIAkJZ290byBvdXRfbWlzY3JlZzsKIAl9CiAKLQlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKSB7CisKKwlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSB7CisJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0OworCQlzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplID0gU09OWVBJX1RZUEUxX1JFR0lPTl9TSVpFOworCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKKwkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTFfaXJxX2xpc3Q7CisJfSBlbHNlIGlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpIHsKIAkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CiAJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkU7CiAJCXNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCA9IFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUOwogCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKIAl9IGVsc2UgewotCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlMV9pb3BvcnRfbGlzdDsKLQkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMV9SRUdJT05fU0laRTsKLQkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUxX0VWVFlQRV9PRkZTRVQ7Ci0JCWlycV9saXN0ID0gc29ueXBpX3R5cGUxX2lycV9saXN0OworCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlM19pb3BvcnRfbGlzdDsKKwkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFM19SRUdJT05fU0laRTsKKwkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQ7CisJCWlycV9saXN0ID0gc29ueXBpX3R5cGUzX2lycV9saXN0OwogCX0KIAogCWZvciAoaSA9IDA7IGlvcG9ydF9saXN0W2ldLnBvcnQxOyBpKyspIHsKQEAgLTEyNzQsMTEgKzEzNTEsMTAgQEAKIAogCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2xsZXIgRHJpdmVyIgogCSAgICAgICAidiVzLlxuIiwgU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKLQlwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGRldGVjdGVkICVzIG1vZGVsLCAiCisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXRlY3RlZCB0eXBlJWQgbW9kZWwsICIKIAkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCiAJICAgICAgICJjb21wYXQgPSAlcywgbWFzayA9IDB4JTA4bHgsIHVzZWlucHV0ID0gJXMsIGFjcGkgPSAlc1xuIiwKLQkgICAgICAgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSkgPwotCQkJInR5cGUxIiA6ICJ0eXBlMiIsCisJICAgICAgIHNvbnlwaV9kZXZpY2UubW9kZWwsCiAJICAgICAgIHZlcmJvc2UsCiAJICAgICAgIGZua2V5aW5pdCA/ICJvbiIgOiAib2ZmIiwKIAkgICAgICAgY2FtZXJhID8gIm9uIiA6ICJvZmYiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwppbmRleCAzN2M4YmVhLi5lYTJkNTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsaW51eC9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwogICoKLSAqICRJZDogc3luY2xpbmsuYyx2IDQuMjggMjAwNC8wOC8xMSAxOTozMDowMSBwYXVsa2YgRXhwICQKKyAqICRJZDogc3luY2xpbmsuYyx2IDQuMzcgMjAwNS8wOS8wNyAxMzoxMzoxOSBwYXVsa2YgRXhwICQKICAqCiAgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgSVNBIGFuZCBQQ0kKICAqIGhpZ2ggc3BlZWQgbXVsdGlwcm90b2NvbCBzZXJpYWwgYWRhcHRlcnMuCkBAIC0xNDEsOSArMTQxLDkgQEAKIHR5cGVkZWYgc3RydWN0IF9ETUFCVUZGRVJFTlRSWQogewogCXUzMiBwaHlzX2FkZHI7CS8qIDMyLWJpdCBmbGF0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgKi8KLQl1MTYgY291bnQ7CS8qIGJ1ZmZlciBzaXplL2RhdGEgY291bnQgKi8KLQl1MTYgc3RhdHVzOwkvKiBDb250cm9sL3N0YXR1cyBmaWVsZCAqLwotCXUxNiByY2M7CS8qIGNoYXJhY3RlciBjb3VudCBmaWVsZCAqLworCXZvbGF0aWxlIHUxNiBjb3VudDsJLyogYnVmZmVyIHNpemUvZGF0YSBjb3VudCAqLworCXZvbGF0aWxlIHUxNiBzdGF0dXM7CS8qIENvbnRyb2wvc3RhdHVzIGZpZWxkICovCisJdm9sYXRpbGUgdTE2IHJjYzsJLyogY2hhcmFjdGVyIGNvdW50IGZpZWxkICovCiAJdTE2IHJlc2VydmVkOwkvKiBwYWRkaW5nIHJlcXVpcmVkIGJ5IDE2QzMyICovCiAJdTMyIGxpbms7CS8qIDMyLWJpdCBmbGF0IGxpbmsgdG8gbmV4dCBidWZmZXIgZW50cnkgKi8KIAljaGFyICp2aXJ0X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAqLwpAQCAtODk2LDcgKzg5Niw3IEBACiBtb2R1bGVfcGFyYW1fYXJyYXkodHhob2xkYnVmcywgaW50LCBOVUxMLCAwKTsKIAogc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gIlN5bmNMaW5rIHNlcmlhbCBkcml2ZXIiOwotc3RhdGljIGNoYXIgKmRyaXZlcl92ZXJzaW9uID0gIiRSZXZpc2lvbjogNC4yOCAkIjsKK3N0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMzcgJCI7CiAKIHN0YXRpYyBpbnQgc3luY2xpbmtfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKQEAgLTE4MTQsNiArMTgxNCw4IEBACiAKIAlpbmZvLT5wZW5kaW5nX2JoID0gMDsKIAkKKwltZW1zZXQoJmluZm8tPmljb3VudCwgMCwgc2l6ZW9mKGluZm8tPmljb3VudCkpOworCiAJaW5pdF90aW1lcigmaW5mby0+dHhfdGltZXIpOwogCWluZm8tPnR4X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOwogCWluZm8tPnR4X3RpbWVyLmZ1bmN0aW9uID0gbWdzbF90eF90aW1lb3V0OwpAQCAtMjQ3MCwxMiArMjQ3MiwxMiBAQAogCQlwcmludGsoIiVzKCVkKTptZ3NsX2dldF9wYXJhbXMoJXMpXG4iLAogCQkJIF9fRklMRV9fLF9fTElORV9fLCBpbmZvLT5kZXZpY2VfbmFtZSk7CiAJCQkKLQlDT1BZX1RPX1VTRVIoZXJyLHVzZXJfaWNvdW50LCAmaW5mby0+aWNvdW50LCBzaXplb2Yoc3RydWN0IG1nc2xfaWNvdW50KSk7Ci0JaWYgKGVycikgewotCQlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8gKQotCQkJcHJpbnRrKCAiJXMoJWQpOm1nc2xfZ2V0X3N0YXRzKCVzKSB1c2VyIGJ1ZmZlciBjb3B5IGZhaWxlZFxuIiwKLQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSk7Ci0JCXJldHVybiAtRUZBVUxUOworCWlmICghdXNlcl9pY291bnQpIHsKKwkJbWVtc2V0KCZpbmZvLT5pY291bnQsIDAsIHNpemVvZihpbmZvLT5pY291bnQpKTsKKwl9IGVsc2UgeworCQlDT1BZX1RPX1VTRVIoZXJyLCB1c2VyX2ljb3VudCwgJmluZm8tPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBtZ3NsX2ljb3VudCkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCQogCXJldHVybiAwOwpAQCAtNjE0OSw2ICs2MTUxLDExIEBACiAJCXVzY19PdXRSZWcoaW5mbywgUENSLCAodTE2KSgodXNjX0luUmVnKGluZm8sIFBDUikgfCBCSVQxMykgJiB+QklUMTIpKTsKIAl9CiAKKwlpZiAoaW5mby0+cGFyYW1zLmxvb3BiYWNrKSB7CisJCWluZm8tPmxvb3BiYWNrX2JpdHMgPSAweDMwMDsKKwkJb3V0dygweDAzMDAsIGluZm8tPmlvX2Jhc2UgKyBDQ0FSKTsKKwl9CisKIH0JLyogZW5kIG9mIHVzY19zZXRfYXN5bmNfbW9kZSgpICovCiAKIC8qIHVzY19sb29wYmFja19mcmFtZSgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwppbmRleCBlYzk0OWU0Li42ZmIxNjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzeW5jbGlua21wLmMsdiA0LjM0IDIwMDUvMDMvMDQgMTU6MDc6MTAgcGF1bGtmIEV4cCAkCisgKiAkSWQ6IHN5bmNsaW5rbXAuYyx2IDQuMzggMjAwNS8wNy8xNSAxMzoyOTo0NCBwYXVsa2YgRXhwICQKICAqCiAgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgTXVsdGlwb3J0CiAgKiBoaWdoIHNwZWVkIG11bHRpcHJvdG9jb2wgc2VyaWFsIGFkYXB0ZXIuCkBAIC01NSw3ICs1NSw2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCkBAIC00ODcsNyArNDg2LDcgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShkb3N5bmNwcHAsIGludCwgTlVMTCwgMCk7CiAKIHN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJTeW5jTGluayBNdWx0aVBvcnQgZHJpdmVyIjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiA9ICIkUmV2aXNpb246IDQuMzQgJCI7CitzdGF0aWMgY2hhciAqZHJpdmVyX3ZlcnNpb24gPSAiJFJldmlzaW9uOiA0LjM4ICQiOwogCiBzdGF0aWMgaW50IHN5bmNsaW5rbXBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB2b2lkIHN5bmNsaW5rbXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKQEAgLTU1Niw3ICs1NTUsNiBAQAogc3RhdGljIGludCAgdHhfZW5hYmxlKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7CiBzdGF0aWMgaW50ICB0eF9hYm9ydChTTE1QX0lORk8gKmluZm8pOwogc3RhdGljIGludCAgcnhfZW5hYmxlKFNMTVBfSU5GTyAqaW5mbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50ICBtYXBfc3RhdHVzKGludCBzaWduYWxzKTsKIHN0YXRpYyBpbnQgIG1vZGVtX2lucHV0X3dhaXQoU0xNUF9JTkZPICppbmZvLGludCBhcmcpOwogc3RhdGljIGludCAgd2FpdF9tZ3NsX2V2ZW50KFNMTVBfSU5GTyAqaW5mbywgaW50IF9fdXNlciAqbWFza19wdHIpOwogc3RhdGljIGludCAgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtNjQ1LDcgKzY0Myw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciB0eF9uZWdhdGVfZmlmb19sZXZlbCA9IDMyOwkvLyB0eCByZXF1ZXN0IEZJRk8gbmVnYXRpb24gbGV2ZWwgaW4gYnl0ZXMKIAogc3RhdGljIHUzMiBtaXNjX2N0cmxfdmFsdWUgPSAweDAwN2U0MDQwOwotc3RhdGljIHUzMiBsY3IxX2JyZHJfdmFsdWUgPSAweDAwODAwMDI5Oworc3RhdGljIHUzMiBsY3IxX2JyZHJfdmFsdWUgPSAweDAwODAwMDI4OwogCiBzdGF0aWMgdTMyIHJlYWRfYWhlYWRfY291bnQgPSA4OwogCkBAIC0yNzUwLDYgKzI3NDgsOCBAQAogCiAJaW5mby0+cGVuZGluZ19iaCA9IDA7CiAKKwltZW1zZXQoJmluZm8tPmljb3VudCwgMCwgc2l6ZW9mKGluZm8tPmljb3VudCkpOworCiAJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCiAJcmVzZXRfcG9ydChpbmZvKTsKIApAQCAtMjk1MywxMiArMjk1MywxMiBAQAogCQlwcmludGsoIiVzKCVkKTolcyBnZXRfcGFyYW1zKClcbiIsCiAJCQkgX19GSUxFX18sX19MSU5FX18sIGluZm8tPmRldmljZV9uYW1lKTsKIAotCUNPUFlfVE9fVVNFUihlcnIsdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKLQlpZiAoZXJyKSB7Ci0JCWlmICggZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTyApCi0JCQlwcmludGsoICIlcyglZCk6JXMgZ2V0X3N0YXRzKCkgdXNlciBidWZmZXIgY29weSBmYWlsZWRcbiIsCi0JCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIXVzZXJfaWNvdW50KSB7CisJCW1lbXNldCgmaW5mby0+aWNvdW50LCAwLCBzaXplb2YoaW5mby0+aWNvdW50KSk7CisJfSBlbHNlIHsKKwkJQ09QWV9UT19VU0VSKGVyciwgdXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzEwOSwxNiArMzEwOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWFwX3N0YXR1cyhpbnQgc2lnbmFscykKLXsKLQkvKiBNYXAgc3RhdHVzIGJpdHMgdG8gQVBJIGV2ZW50IGJpdHMgKi8KLQotCXJldHVybiAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFNSKSA/IE1nc2xFdmVudF9Ec3JBY3RpdmUgOiBNZ3NsRXZlbnRfRHNySW5hY3RpdmUpICsKLQkgICAgICAgKChzaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlIDogTWdzbEV2ZW50X0N0c0luYWN0aXZlKSArCi0JICAgICAgICgoc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gTWdzbEV2ZW50X0RjZEFjdGl2ZSA6IE1nc2xFdmVudF9EY2RJbmFjdGl2ZSkgKwotCSAgICAgICAoKHNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IE1nc2xFdmVudF9SaUFjdGl2ZSA6IE1nc2xFdmVudF9SaUluYWN0aXZlKTsKLX0KLQogLyogd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCiAgKi8KIHN0YXRpYyBpbnQgd2FpdF9tZ3NsX2V2ZW50KFNMTVBfSU5GTyAqIGluZm8sIGludCBfX3VzZXIgKm1hc2tfcHRyKQpAQCAtMzE0NSw3ICszMTM1LDcgQEAKIAogCS8qIHJldHVybiBpbW1lZGlhdGVseSBpZiBzdGF0ZSBtYXRjaGVzIHJlcXVlc3RlZCBldmVudHMgKi8KIAlnZXRfc2lnbmFscyhpbmZvKTsKLQlzID0gbWFwX3N0YXR1cyhpbmZvLT5zZXJpYWxfc2lnbmFscyk7CisJcyA9IGluZm8tPnNlcmlhbF9zaWduYWxzOwogCiAJZXZlbnRzID0gbWFzayAmCiAJCSggKChzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOk1nc2xFdmVudF9Ec3JJbmFjdGl2ZSkgKwpAQCAtNDQ4OSwxMSArNDQ3OSwxMyBAQAogCS8qIE1EMiwgTW9kZSBSZWdpc3RlciAyCiAJICoKIAkgKiAwNy4uMDIgIFJlc2VydmVkLCBtdXN0IGJlIDAKLQkgKiAwMS4uMDAgIENOQ1Q8MS4uMD4gQ2hhbm5lbCBjb25uZWN0aW9uLCAwPW5vcm1hbAorCSAqIDAxLi4wMCAgQ05DVDwxLi4wPiBDaGFubmVsIGNvbm5lY3Rpb24sIDAwPW5vcm1hbCAxMT1sb2NhbCBsb29wYmFjawogCSAqCiAJICogMDAwMCAwMDAwCiAJICovCiAJUmVnVmFsdWUgPSAweDAwOworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCVJlZ1ZhbHVlIHw9IChCSVQxICsgQklUMCk7CiAJd3JpdGVfcmVnKGluZm8sIE1EMiwgUmVnVmFsdWUpOwogCiAJLyogUlhTLCBSZWNlaXZlIGNsb2NrIHNvdXJjZQpAQCAtNDU3NCw5ICs0NTY2LDYgQEAKIAl3cml0ZV9yZWcoaW5mbywgSUUyLCBpbmZvLT5pZTJfdmFsdWUpOwogCiAJc2V0X3JhdGUoIGluZm8sIGluZm8tPnBhcmFtcy5kYXRhX3JhdGUgKiAxNiApOwotCi0JaWYgKGluZm8tPnBhcmFtcy5sb29wYmFjaykKLQkJZW5hYmxlX2xvb3BiYWNrKGluZm8sMSk7CiB9CiAKIC8qIFByb2dyYW0gdGhlIFNDQSBmb3IgSERMQyBjb21tdW5pY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwppbmRleCA3OWU5ODMyLi5iNThhZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCkBAIC0xNyw3ICsxNyw3IEBACiAJICBvYnRhaW5lZCBhdDogPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHJvdXNlcnM+LiAgVG8gCiAJICBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUgbW9kdWxlIAogCSAgd2lsbCBiZSBjYWxsZWQgdHBtLiBJZiB1bnN1cmUsIHNheSBOLgotCSAgTm90ZTogRm9yIG1vcmUgVFBNIGRyaXZlcnMgZW5hYmxlIENPTkZJR19QTlAsIENPTkZJR19BQ1BJX0JVUworCSAgTm90ZTogRm9yIG1vcmUgVFBNIGRyaXZlcnMgZW5hYmxlIENPTkZJR19QTlAsIENPTkZJR19BQ1BJCiAJICBhbmQgQ09ORklHX1BOUEFDUEkuCiAKIGNvbmZpZyBUQ0dfTlNDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuYwppbmRleCBjYzJjYzc3Li5jMGQ2NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmMKQEAgLTIwNiw2ICsyMDYsOSBAQAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzApfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfODExMV9MUEMpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZMUEMpfSwKIAl7MCx9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggNmU0YmUzYi4uZTU5NTNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtMTUzLDcgKzE1Myw2IEBACiBpbnQgdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCB0dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxwLCBpbnQgb24pOwotZXh0ZXJuIHZvaWQgcnNfMzYwX2luaXQodm9pZCk7CiBzdGF0aWMgdm9pZCByZWxlYXNlX21lbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgaWR4KTsKIAogCkBAIC00NzAsMjEgKzQ2OSwxOSBAQAogIAogc3RhdGljIGludCB0dHlfc2V0X2xkaXNjKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBsZGlzYykKIHsKLQlpbnQJcmV0dmFsID0gMDsKLQlzdHJ1Y3QJdHR5X2xkaXNjIG9fbGRpc2M7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHR0eV9sZGlzYyBvX2xkaXNjOwogCWNoYXIgYnVmWzY0XTsKIAlpbnQgd29yazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCXN0cnVjdCB0dHlfc3RydWN0ICpvX3R0eTsKIAogCWlmICgobGRpc2MgPCBOX1RUWSkgfHwgKGxkaXNjID49IE5SX0xESVNDUykpCiAJCXJldHVybiAtRUlOVkFMOwogCiByZXN0YXJ0OgogCi0JaWYgKHR0eS0+bGRpc2MubnVtID09IGxkaXNjKQotCQlyZXR1cm4gMDsJLyogV2UgYXJlIGFscmVhZHkgaW4gdGhlIGRlc2lyZWQgZGlzY2lwbGluZSAqLwotCQogCWxkID0gdHR5X2xkaXNjX2dldChsZGlzYyk7CiAJLyogRWR1YXJkbyBCbGFuY28gPGVqYnNAY3MuY3MuY29tLnV5PiAqLwogCS8qIEN5cnVzIER1cmdpbiA8Y2lkZXJAc3BlYWtlYXN5Lm9yZz4gKi8KQEAgLTQ5NSw0NSArNDkyLDc0IEBACiAJaWYgKGxkID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jb19sZGlzYyA9IHR0eS0+bGRpc2M7Ci0KIAl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CiAKKwlpZiAodHR5LT5sZGlzYy5udW0gPT0gbGRpc2MpIHsKKwkJdHR5X2xkaXNjX3B1dChsZGlzYyk7CisJCXJldHVybiAwOworCX0KKworCW9fbGRpc2MgPSB0dHktPmxkaXNjOworCW9fdHR5ID0gdHR5LT5saW5rOworCiAJLyoKIAkgKglNYWtlIHN1cmUgd2UgZG9uJ3QgY2hhbmdlIHdoaWxlIHNvbWVvbmUgaG9sZHMgYQogCSAqCXJlZmVyZW5jZSB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGUgVFRZX0xESVNDIGJpdAogCSAqCXByZXZlbnRzIGFueW9uZSB0YWtpbmcgYSByZWZlcmVuY2Ugb25jZSBpdCBpcyBjbGVhci4KIAkgKglXZSBuZWVkIHRoZSBsb2NrIHRvIGF2b2lkIHJhY2luZyByZWZlcmVuY2UgdGFrZXJzLgogCSAqLwotCSAKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCWlmKHR0eS0+bGRpc2MucmVmY291bnQpCi0JewotCQkvKiBGcmVlIHRoZSBuZXcgbGRpc2Mgd2UgZ3JhYmJlZC4gTXVzdCBkcm9wIHRoZSBsb2NrCi0JCSAgIGZpcnN0LiAqLworCWlmICh0dHktPmxkaXNjLnJlZmNvdW50IHx8IChvX3R0eSAmJiBvX3R0eS0+bGRpc2MucmVmY291bnQpKSB7CisJCWlmKHR0eS0+bGRpc2MucmVmY291bnQpIHsKKwkJCS8qIEZyZWUgdGhlIG5ldyBsZGlzYyB3ZSBncmFiYmVkLiBNdXN0IGRyb3AgdGhlIGxvY2sKKwkJCSAgIGZpcnN0LiAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwkJCXR0eV9sZGlzY19wdXQobGRpc2MpOworCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2UgbWF5IGJlIGJ1c3ksIGluY2x1ZGluZworCQkJICogcmFuZG9tIG1vbWVudGFyeSBJL08gdHJhZmZpYy4gV2UgbXVzdCB0aGVyZWZvcmUKKwkJCSAqIHJldHJ5LiBXZSBjb3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJsb2NraW5nIG9wcworCQkJICogYW5kIHJldHJpZXMgaWYgd2UgbWFkZSB0dHlfbGRpc2Nfd2FpdCgpIHNtYXJ0ZXIuIFRoYXQKKwkJCSAqIGlzIHVwIGZvciBkaXNjdXNzaW9uLgorCQkJICovCisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHR0eV9sZGlzY193YWl0LCB0dHktPmxkaXNjLnJlZmNvdW50ID09IDApIDwgMCkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJZ290byByZXN0YXJ0OworCQl9CisJCWlmKG9fdHR5ICYmIG9fdHR5LT5sZGlzYy5yZWZjb3VudCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKKwkJCXR0eV9sZGlzY19wdXQobGRpc2MpOworCQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0dHlfbGRpc2Nfd2FpdCwgb190dHktPmxkaXNjLnJlZmNvdW50ID09IDApIDwgMCkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCisJLyogaWYgdGhlIFRUWV9MRElTQyBiaXQgaXMgc2V0LCB0aGVuIHdlIGFyZSByYWNpbmcgYWdhaW5zdCBhbm90aGVyIGxkaXNjIGNoYW5nZSAqLworCisJaWYgKCF0ZXN0X2JpdChUVFlfTERJU0MsICZ0dHktPmZsYWdzKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwogCQl0dHlfbGRpc2NfcHV0KGxkaXNjKTsKLQkJLyoKLQkJICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3ZSBtYXkgYmUgYnVzeSwgaW5jbHVkaW5nCi0JCSAqIHJhbmRvbSBtb21lbnRhcnkgSS9PIHRyYWZmaWMuIFdlIG11c3QgdGhlcmVmb3JlCi0JCSAqIHJldHJ5LiBXZSBjb3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJsb2NraW5nIG9wcwotCQkgKiBhbmQgcmV0cmllcyBpZiB3ZSBtYWRlIHR0eV9sZGlzY193YWl0KCkgc21hcnRlci4gVGhhdAotCQkgKiBpcyB1cCBmb3IgZGlzY3Vzc2lvbi4KLQkJICovCi0JCWlmKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0dHlfbGRpc2Nfd2FpdCwgdHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKSA8IDApCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwkJCQorCQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOworCQl0dHlfbGRpc2NfZGVyZWYobGQpOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQotCWNsZWFyX2JpdChUVFlfTERJU0MsICZ0dHktPmZsYWdzKTsJCisKKwljbGVhcl9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7CiAJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKKwlpZiAob190dHkpIHsKKwkJY2xlYXJfYml0KFRUWV9MRElTQywgJm9fdHR5LT5mbGFncyk7CisJCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmb190dHktPmZsYWdzKTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKLQkKKwogCS8qCiAJICoJRnJvbSB0aGlzIHBvaW50IG9uIHdlIGtub3cgbm9ib2R5IGhhcyBhbiBsZGlzYwogCSAqCXVzYWdlIHJlZmVyZW5jZSwgbm9yIGNhbiB0aGV5IG9idGFpbiBvbmUgdW50aWwKIAkgKgl3ZSBzYXkgc28gbGF0ZXIgb24uCiAJICovCi0JIAorCiAJd29yayA9IGNhbmNlbF9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrKTsKIAkvKgogCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+ZmxpcC53b3JrIGhhbmRsZXJzIHRvIHRlcm1pbmF0ZQpAQCAtNTg0LDEwICs2MTAsMTIgQEAKIAkgKi8KIAkgCiAJdHR5X2xkaXNjX2VuYWJsZSh0dHkpOworCWlmIChvX3R0eSkKKwkJdHR5X2xkaXNjX2VuYWJsZShvX3R0eSk7CiAJCiAJLyogUmVzdGFydCBpdCBpbiBjYXNlIG5vIGNoYXJhY3RlcnMga2ljayBpdCBvZmYuIFNhZmUgaWYKIAkgICBhbHJlYWR5IHJ1bm5pbmcgKi8KLQlpZih3b3JrKQorCWlmICh3b3JrKQogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjQyNiw2ICsyNDU0LDcgQEAKIAlpbnQJCWk7CiAJc3RydWN0IGZpbGUJKmZpbHA7CiAJc3RydWN0IHR0eV9sZGlzYyAqZGlzYzsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCQogCWlmICghdHR5KQogCQlyZXR1cm47CkBAIC0yNDUxLDggKzI0ODAsOSBAQAogCQl9CiAJCXRhc2tfbG9jayhwKTsKIAkJaWYgKHAtPmZpbGVzKSB7Ci0JCQlzcGluX2xvY2soJnAtPmZpbGVzLT5maWxlX2xvY2spOwotCQkJZm9yIChpPTA7IGkgPCBwLT5maWxlcy0+bWF4X2ZkczsgaSsrKSB7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlmZHQgPSBmaWxlc19mZHRhYmxlKHAtPmZpbGVzKTsKKwkJCWZvciAoaT0wOyBpIDwgZmR0LT5tYXhfZmRzOyBpKyspIHsKIAkJCQlmaWxwID0gZmNoZWNrX2ZpbGVzKHAtPmZpbGVzLCBpKTsKIAkJCQlpZiAoIWZpbHApCiAJCQkJCWNvbnRpbnVlOwpAQCAtMjQ2NSw3ICsyNDk1LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJc3Bpbl91bmxvY2soJnAtPmZpbGVzLT5maWxlX2xvY2spOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCX0KIAkJdGFza191bmxvY2socCk7CiAJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKHNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKQEAgLTI5MTEsMTEgKzI5NDEsNiBAQAogI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKIAlkaXNhYmxlX2Vhcmx5X3ByaW50aygpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF82ODM2MAotIAkvKiBUaGlzIGlzIG5vdCBhIGNvbnNvbGUgaW5pdGNhbGwuIEkga25vdyBub3Qgd2hhdCBpdCdzIGRvaW5nIGhlcmUuCi0JICAgU28gSSBoYXZlbid0IG1vdmVkIGl0LiBkd213MiAqLwotICAgICAgICByc18zNjBfaW5pdCgpOwotI2VuZGlmCiAJY2FsbCA9IF9fY29uX2luaXRjYWxsX3N0YXJ0OwogCXdoaWxlIChjYWxsIDwgX19jb25faW5pdGNhbGxfZW5kKSB7CiAJCSgqY2FsbCkoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKaW5kZXggNjY1MTAzYy4uMWUzM2NiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0LmMKQEAgLTQzNCwyMSArNDM0LDI1IEBACiAvKiB1c2VkIGJ5IHNlbGVjdGlvbjogY29tcGxlbWVudCBwb2ludGVyIHBvc2l0aW9uICovCiB2b2lkIGNvbXBsZW1lbnRfcG9zKHN0cnVjdCB2Y19kYXRhICp2YywgaW50IG9mZnNldCkKIHsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgKnA7CisJc3RhdGljIGludCBvbGRfb2Zmc2V0ID0gLTE7CiAJc3RhdGljIHVuc2lnbmVkIHNob3J0IG9sZDsKIAlzdGF0aWMgdW5zaWduZWQgc2hvcnQgb2xkeCwgb2xkeTsKIAogCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOwogCi0JaWYgKHApIHsKLQkJc2NyX3dyaXRldyhvbGQsIHApOworCWlmIChvbGRfb2Zmc2V0ICE9IC0xICYmIG9sZF9vZmZzZXQgPj0gMCAmJgorCSAgICBvbGRfb2Zmc2V0IDwgdmMtPnZjX3NjcmVlbmJ1Zl9zaXplKSB7CisJCXNjcl93cml0ZXcob2xkLCBzY3JlZW5wb3ModmMsIG9sZF9vZmZzZXQsIDEpKTsKIAkJaWYgKERPX1VQREFURSh2YykpCiAJCQl2Yy0+dmNfc3ctPmNvbl9wdXRjKHZjLCBvbGQsIG9sZHksIG9sZHgpOwogCX0KLQlpZiAob2Zmc2V0ID09IC0xKQotCQlwID0gTlVMTDsKLQllbHNlIHsKKworCW9sZF9vZmZzZXQgPSBvZmZzZXQ7CisKKwlpZiAob2Zmc2V0ICE9IC0xICYmIG9mZnNldCA+PSAwICYmCisJICAgIG9mZnNldCA8IHZjLT52Y19zY3JlZW5idWZfc2l6ZSkgewogCQl1bnNpZ25lZCBzaG9ydCBuZXc7CisJCXVuc2lnbmVkIHNob3J0ICpwOwogCQlwID0gc2NyZWVucG9zKHZjLCBvZmZzZXQsIDEpOwogCQlvbGQgPSBzY3JfcmVhZHcocCk7CiAJCW5ldyA9IG9sZCBeIHZjLT52Y19jb21wbGVtZW50X21hc2s7CkBAIC00NTksNiArNDYzLDcgQEAKIAkJCXZjLT52Y19zdy0+Y29uX3B1dGModmMsIG5ldywgb2xkeSwgb2xkeCk7CiAJCX0KIAl9CisKIH0KIAogc3RhdGljIHZvaWQgaW5zZXJ0X2NoYXIoc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBpbnQgbnIpCkBAIC03NDYsNiArNzUxLDcgQEAKIAl1bnNpZ25lZCBsb25nIG9sZF9vcmlnaW4sIG5ld19vcmlnaW4sIG5ld19zY3JfZW5kLCBybHRoLCBycmVtLCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBvbGRfY29scywgb2xkX3Jvd3MsIG9sZF9yb3dfc2l6ZSwgb2xkX3NjcmVlbl9zaXplOwogCXVuc2lnbmVkIGludCBuZXdfY29scywgbmV3X3Jvd3MsIG5ld19yb3dfc2l6ZSwgbmV3X3NjcmVlbl9zaXplOworCXVuc2lnbmVkIGludCBlbmQ7CiAJdW5zaWduZWQgc2hvcnQgKm5ld3NjcmVlbjsKIAogCVdBUk5fQ09OU09MRV9VTkxPQ0tFRCgpOwpAQCAtNzg5LDIwICs3OTUsNDQgQEAKIAlvbGRfb3JpZ2luID0gdmMtPnZjX29yaWdpbjsKIAluZXdfb3JpZ2luID0gKGxvbmcpIG5ld3NjcmVlbjsKIAluZXdfc2NyX2VuZCA9IG5ld19vcmlnaW4gKyBuZXdfc2NyZWVuX3NpemU7Ci0JaWYgKG5ld19yb3dzIDwgb2xkX3Jvd3MpCi0JCW9sZF9vcmlnaW4gKz0gKG9sZF9yb3dzIC0gbmV3X3Jvd3MpICogb2xkX3Jvd19zaXplOworCisJaWYgKHZjLT52Y195ID4gbmV3X3Jvd3MpIHsKKwkJaWYgKG9sZF9yb3dzIC0gdmMtPnZjX3kgPCBuZXdfcm93cykgeworCQkJLyoKKwkJCSAqIEN1cnNvciBuZWFyIHRoZSBib3R0b20sIGNvcHkgY29udGVudHMgZnJvbSB0aGUKKwkJCSAqIGJvdHRvbSBvZiBidWZmZXIKKwkJCSAqLworCQkJb2xkX29yaWdpbiArPSAob2xkX3Jvd3MgLSBuZXdfcm93cykgKiBvbGRfcm93X3NpemU7CisJCQllbmQgPSB2Yy0+dmNfc2NyX2VuZDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDdXJzb3IgaXMgaW4gbm8gbWFuJ3MgbGFuZCwgY29weSAxLzIgc2NyZWVuZnVsCisJCQkgKiBmcm9tIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBjdXJzb3IgcG9zaXRpb24KKwkJCSAqLworCQkJb2xkX29yaWdpbiArPSAodmMtPnZjX3kgLSBuZXdfcm93cy8yKSAqIG9sZF9yb3dfc2l6ZTsKKwkJCWVuZCA9IG9sZF9vcmlnaW4gKyBuZXdfc2NyZWVuX3NpemU7CisJCX0KKwl9IGVsc2UKKwkJLyoKKwkJICogQ3Vyc29yIG5lYXIgdGhlIHRvcCwgY29weSBjb250ZW50cyBmcm9tIHRoZSB0b3Agb2YgYnVmZmVyCisJCSAqLworCQllbmQgPSAob2xkX3Jvd3MgPiBuZXdfcm93cykgPyBvbGRfb3JpZ2luICsgbmV3X3NjcmVlbl9zaXplIDoKKwkJCXZjLT52Y19zY3JfZW5kOwogCiAJdXBkYXRlX2F0dHIodmMpOwogCi0Jd2hpbGUgKG9sZF9vcmlnaW4gPCB2Yy0+dmNfc2NyX2VuZCkgewotCQlzY3JfbWVtY3B5dygodW5zaWduZWQgc2hvcnQgKikgbmV3X29yaWdpbiwgKHVuc2lnbmVkIHNob3J0ICopIG9sZF9vcmlnaW4sIHJsdGgpOworCXdoaWxlIChvbGRfb3JpZ2luIDwgZW5kKSB7CisJCXNjcl9tZW1jcHl3KCh1bnNpZ25lZCBzaG9ydCAqKSBuZXdfb3JpZ2luLAorCQkJICAgICh1bnNpZ25lZCBzaG9ydCAqKSBvbGRfb3JpZ2luLCBybHRoKTsKIAkJaWYgKHJyZW0pCi0JCQlzY3JfbWVtc2V0dygodm9pZCAqKShuZXdfb3JpZ2luICsgcmx0aCksIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCBycmVtKTsKKwkJCXNjcl9tZW1zZXR3KCh2b2lkICopKG5ld19vcmlnaW4gKyBybHRoKSwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsIHJyZW0pOwogCQlvbGRfb3JpZ2luICs9IG9sZF9yb3dfc2l6ZTsKIAkJbmV3X29yaWdpbiArPSBuZXdfcm93X3NpemU7CiAJfQogCWlmIChuZXdfc2NyX2VuZCA+IG5ld19vcmlnaW4pCi0JCXNjcl9tZW1zZXR3KCh2b2lkICopbmV3X29yaWdpbiwgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsIG5ld19zY3JfZW5kIC0gbmV3X29yaWdpbik7CisJCXNjcl9tZW1zZXR3KCh2b2lkICopbmV3X29yaWdpbiwgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCisJCQkgICAgbmV3X3Njcl9lbmQgLSBuZXdfb3JpZ2luKTsKIAlpZiAodmMtPnZjX2ttYWxsb2NlZCkKIAkJa2ZyZWUodmMtPnZjX3NjcmVlbmJ1Zik7CiAJdmMtPnZjX3NjcmVlbmJ1ZiA9IG5ld3NjcmVlbjsKQEAgLTIyNzIsNyArMjMwMiw5IEBACiAJCQlyZXQgPSBwYXN0ZV9zZWxlY3Rpb24odHR5KTsKIAkJCWJyZWFrOwogCQljYXNlIFRJT0NMX1VOQkxBTktTQ1JFRU46CisJCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAJCQl1bmJsYW5rX3NjcmVlbigpOworCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVElPQ0xfU0VMTE9BRExVVDoKIAkJCXJldCA9IHNlbF9sb2FkbHV0KHApOwpAQCAtMjMxNyw4ICsyMzQ5LDEwIEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUSU9DTF9CTEFOS1NDUkVFTjoJLyogdW50aWwgZXhwbGljaXRseSB1bmJsYW5rZWQsIG5vdCBvbmx5IHBva2VkICovCisJCQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAJCQlpZ25vcmVfcG9rZSA9IDE7CiAJCQlkb19ibGFua19zY3JlZW4oMCk7CisJCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAJCQlicmVhazsKIAkJY2FzZSBUSU9DTF9CTEFOS0VEU0NSRUVOOgogCQkJcmV0ID0gY29uc29sZV9ibGFua2VkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21peGNvbXdkLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWl4Y29td2QuYwppbmRleCBjOWIzMDFkLi43ZmMyMTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWl4Y29td2QuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWl4Y29td2QuYwpAQCAtNTksNyArNTksNyBAQAogCiBzdGF0aWMgaW50IHdhdGNoZG9nX3BvcnQ7CiBzdGF0aWMgaW50IG1peGNvbXdkX3RpbWVyX2FsaXZlOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1peGNvbXdkX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKG1peGNvbXdkX3RpbWVyLCBOVUxMLCAwLCAwKTsKIHN0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKIAogc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggMTBiMDE0OS4uMTA5ZDYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC02MjcsNyArNjI3LDcgQEAKIAogCXJldCA9IGtvYmplY3RfcmVnaXN0ZXIoJnBvbGljeS0+a29iaik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OworCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CiAKIAkvKiBzZXQgdXAgZmlsZXMgZm9yIHRoaXMgY3B1IGRldmljZSAqLwogCWRydl9hdHRyID0gY3B1ZnJlcV9kcml2ZXItPmF0dHI7CkBAIC02NzMsNiArNjczLDEwIEBACiAJa29iamVjdF91bnJlZ2lzdGVyKCZwb2xpY3ktPmtvYmopOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBvbGljeS0+a29ial91bnJlZ2lzdGVyKTsKIAorZXJyX291dF9kcml2ZXJfZXhpdDoKKwlpZiAoY3B1ZnJlcV9kcml2ZXItPmV4aXQpCisJCWNwdWZyZXFfZHJpdmVyLT5leGl0KHBvbGljeSk7CisKIGVycl9vdXQ6CiAJa2ZyZWUocG9saWN5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IDViMjljM2IuLjMyN2I1OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKQEAgLTU4LDQgKzU4LDMxIEBACiAKIAkgIFNlZSA8aHR0cDovL3d3dy5kaWc2NC5vcmcvc3BlY2lmaWNhdGlvbnMvRElHNjRfSENEUHYyMF8wNDI4MDQucGRmPgogCitjb25maWcgREVMTF9SQlUKKwl0cmlzdGF0ZSAiQklPUyB1cGRhdGUgc3VwcG9ydCBmb3IgREVMTCBzeXN0ZW1zIHZpYSBzeXNmcyIKKwlzZWxlY3QgRldfTE9BREVSCisJaGVscAorCSBTYXkgbSBpZiB5b3Ugd2FudCB0byBoYXZlIHRoZSBvcHRpb24gb2YgdXBkYXRpbmcgdGhlIEJJT1MgZm9yIHlvdXIKKwkgREVMTCBzeXN0ZW0uIE5vdGUgeW91IG5lZWQgYSBEZWxsIE9wZW5NYW5hZ2Ugb3IgRGVsbCBVcGRhdGUgcGFja2FnZSAoRFVQKQorCSBzdXBwb3J0aW5nIGFwcGxpY2F0aW9uIHRvIGNvbXVuaWNhdGUgd2l0aCB0aGUgQklPUyByZWdhcmRpbmcgdGhlIG5ldworCSBpbWFnZSBmb3IgdGhlIGltYWdlIHVwZGF0ZSB0byB0YWtlIGVmZmVjdC4KKwkgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vZGVsbF9yYnUudHh0PiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBEQ0RCQVMKKwl0cmlzdGF0ZSAiRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIiCisJZGVwZW5kcyBvbiBYODYgfHwgWDg2XzY0CisJZGVmYXVsdCBtCisJaGVscAorCSAgVGhlIERlbGwgU3lzdGVtcyBNYW5hZ2VtZW50IEJhc2UgRHJpdmVyIHByb3ZpZGVzIGEgc3lzZnMgaW50ZXJmYWNlCisJICBmb3Igc3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIHRvIHBlcmZvcm0gU3lzdGVtIE1hbmFnZW1lbnQKKwkgIEludGVycnVwdHMgKFNNSXMpIGFuZCBIb3N0IENvbnRyb2wgQWN0aW9ucyAoc3lzdGVtIHBvd2VyIGN5Y2xlIG9yCisJICBwb3dlciBvZmYgYWZ0ZXIgT1Mgc2h1dGRvd24pIG9uIGNlcnRhaW4gRGVsbCBzeXN0ZW1zLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9kY2RiYXMudHh0PiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBkcml2ZXIKKwkgIGFuZCB0aGUgRGVsbCBzeXN0ZW1zIG9uIHdoaWNoIERlbGwgc3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIG1ha2VzCisJICB1c2Ugb2YgdGhpcyBkcml2ZXIuCisKKwkgIFNheSBZIG9yIE0gaGVyZSB0byBlbmFibGUgdGhlIGRyaXZlciBmb3IgdXNlIGJ5IERlbGwgc3lzdGVtcworCSAgbWFuYWdlbWVudCBzb2Z0d2FyZSBzdWNoIGFzIERlbGwgT3Blbk1hbmFnZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggOTBmZDBiMi4uODU0Mjk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCkBAIC00LDMgKzQsNSBAQAogb2JqLSQoQ09ORklHX0VERCkgICAgICAgICAgICAgCSs9IGVkZC5vCiBvYmotJChDT05GSUdfRUZJX1ZBUlMpCQkrPSBlZml2YXJzLm8KIG9iai0kKENPTkZJR19FRklfUENEUCkJCSs9IHBjZHAubworb2JqLSQoQ09ORklHX0RFTExfUkJVKSAgICAgICAgICArPSBkZWxsX3JidS5vCitvYmotJChDT05GSUdfRENEQkFTKQkJKz0gZGNkYmFzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTUzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCkBAIC0wLDAgKzEsNTk2IEBACisvKgorICogIGRjZGJhcy5jOiBEZWxsIFN5c3RlbXMgTWFuYWdlbWVudCBCYXNlIERyaXZlcgorICoKKyAqICBUaGUgRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIgcHJvdmlkZXMgYSBzeXNmcyBpbnRlcmZhY2UgZm9yCisgKiAgc3lzdGVtcyBtYW5hZ2VtZW50IHNvZnR3YXJlIHRvIHBlcmZvcm0gU3lzdGVtIE1hbmFnZW1lbnQgSW50ZXJydXB0cyAoU01JcykKKyAqICBhbmQgSG9zdCBDb250cm9sIEFjdGlvbnMgKHBvd2VyIGN5Y2xlIG9yIHBvd2VyIG9mZiBhZnRlciBPUyBzaHV0ZG93bikgb24KKyAqICBEZWxsIHN5c3RlbXMuCisgKgorICogIFNlZSBEb2N1bWVudGF0aW9uL2RjZGJhcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IERlbGwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiZGNkYmFzLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJkY2RiYXMiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiNS42LjAtMSIKKyNkZWZpbmUgRFJJVkVSX0RFU0NSSVBUSU9OCSJEZWxsIFN5c3RlbXMgTWFuYWdlbWVudCBCYXNlIERyaXZlciIKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRjZGJhc19wZGV2OworCitzdGF0aWMgdTggKnNtaV9kYXRhX2J1ZjsKK3N0YXRpYyBkbWFfYWRkcl90IHNtaV9kYXRhX2J1Zl9oYW5kbGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbWlfZGF0YV9idWZfc2l6ZTsKK3N0YXRpYyB1MzIgc21pX2RhdGFfYnVmX3BoeXNfYWRkcjsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNtaV9kYXRhX2xvY2spOworCitzdGF0aWMgdW5zaWduZWQgaW50IGhvc3RfY29udHJvbF9hY3Rpb247CitzdGF0aWMgdW5zaWduZWQgaW50IGhvc3RfY29udHJvbF9zbWlfdHlwZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaG9zdF9jb250cm9sX29uX3NodXRkb3duOworCisvKioKKyAqIHNtaV9kYXRhX2J1Zl9mcmVlOiBmcmVlIFNNSSBkYXRhIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBzbWlfZGF0YV9idWZfZnJlZSh2b2lkKQoreworCWlmICghc21pX2RhdGFfYnVmKQorCQlyZXR1cm47CisKKwlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IHBoeXM6ICV4IHNpemU6ICVsdVxuIiwKKwkJX19GVU5DVElPTl9fLCBzbWlfZGF0YV9idWZfcGh5c19hZGRyLCBzbWlfZGF0YV9idWZfc2l6ZSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmZGNkYmFzX3BkZXYtPmRldiwgc21pX2RhdGFfYnVmX3NpemUsIHNtaV9kYXRhX2J1ZiwKKwkJCSAgc21pX2RhdGFfYnVmX2hhbmRsZSk7CisJc21pX2RhdGFfYnVmID0gTlVMTDsKKwlzbWlfZGF0YV9idWZfaGFuZGxlID0gMDsKKwlzbWlfZGF0YV9idWZfcGh5c19hZGRyID0gMDsKKwlzbWlfZGF0YV9idWZfc2l6ZSA9IDA7Cit9CisKKy8qKgorICogc21pX2RhdGFfYnVmX3JlYWxsb2M6IGdyb3cgU01JIGRhdGEgYnVmZmVyIGlmIG5lZWRlZAorICovCitzdGF0aWMgaW50IHNtaV9kYXRhX2J1Zl9yZWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICpidWY7CisJZG1hX2FkZHJfdCBoYW5kbGU7CisKKwlpZiAoc21pX2RhdGFfYnVmX3NpemUgPj0gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2l6ZSA+IE1BWF9TTUlfREFUQV9CVUZfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBuZXcgYnVmZmVyIGlzIG5lZWRlZCAqLworCWJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmZGNkYmFzX3BkZXYtPmRldiwgc2l6ZSwgJmhhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJZGV2X2RiZygmZGNkYmFzX3BkZXYtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBzaXplICVsdVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBtZW1vcnkgemVyb2VkIGJ5IGRtYV9hbGxvY19jb2hlcmVudCAqLworCisJaWYgKHNtaV9kYXRhX2J1ZikKKwkJbWVtY3B5KGJ1Ziwgc21pX2RhdGFfYnVmLCBzbWlfZGF0YV9idWZfc2l6ZSk7CisKKwkvKiBmcmVlIGFueSBleGlzdGluZyBidWZmZXIgKi8KKwlzbWlfZGF0YV9idWZfZnJlZSgpOworCisJLyogc2V0IHVwIG5ldyBidWZmZXIgZm9yIHVzZSAqLworCXNtaV9kYXRhX2J1ZiA9IGJ1ZjsKKwlzbWlfZGF0YV9idWZfaGFuZGxlID0gaGFuZGxlOworCXNtaV9kYXRhX2J1Zl9waHlzX2FkZHIgPSAodTMyKSB2aXJ0X3RvX3BoeXMoYnVmKTsKKwlzbWlfZGF0YV9idWZfc2l6ZSA9IHNpemU7CisKKwlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IHBoeXM6ICV4IHNpemU6ICVsdVxuIiwKKwkJX19GVU5DVElPTl9fLCBzbWlfZGF0YV9idWZfcGh5c19hZGRyLCBzbWlfZGF0YV9idWZfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc21pX2RhdGFfYnVmX3BoeXNfYWRkcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgc21pX2RhdGFfYnVmX3BoeXNfYWRkcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNtaV9kYXRhX2J1Zl9zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHNtaV9kYXRhX2J1Zl9zaXplKTsKK30KKworc3RhdGljIHNzaXplX3Qgc21pX2RhdGFfYnVmX3NpemVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBidWZfc2l6ZTsKKwlzc2l6ZV90IHJldDsKKworCWJ1Zl9zaXplID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwkvKiBtYWtlIHN1cmUgU01JIGRhdGEgYnVmZmVyIGlzIGF0IGxlYXN0IGJ1Zl9zaXplICovCisJZG93bigmc21pX2RhdGFfbG9jayk7CisJcmV0ID0gc21pX2RhdGFfYnVmX3JlYWxsb2MoYnVmX3NpemUpOworCXVwKCZzbWlfZGF0YV9sb2NrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzbWlfZGF0YV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBwb3MsCisJCQkgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgbWF4X3JlYWQ7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZzbWlfZGF0YV9sb2NrKTsKKworCWlmIChwb3MgPj0gc21pX2RhdGFfYnVmX3NpemUpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJbWF4X3JlYWQgPSBzbWlfZGF0YV9idWZfc2l6ZSAtIHBvczsKKwlyZXQgPSBtaW4obWF4X3JlYWQsIGNvdW50KTsKKwltZW1jcHkoYnVmLCBzbWlfZGF0YV9idWYgKyBwb3MsIHJldCk7CitvdXQ6CisJdXAoJnNtaV9kYXRhX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNtaV9kYXRhX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBwb3MsCisJCQkgICAgICBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZzbWlfZGF0YV9sb2NrKTsKKworCXJldCA9IHNtaV9kYXRhX2J1Zl9yZWFsbG9jKHBvcyArIGNvdW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW1lbWNweShzbWlfZGF0YV9idWYgKyBwb3MsIGJ1ZiwgY291bnQpOworCXJldCA9IGNvdW50Oworb3V0OgorCXVwKCZzbWlfZGF0YV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBob3N0X2NvbnRyb2xfYWN0aW9uKTsKK30KKworc3RhdGljIHNzaXplX3QgaG9zdF9jb250cm9sX2FjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0OworCisJLyogbWFrZSBzdXJlIGJ1ZmZlciBpcyBhdmFpbGFibGUgZm9yIGhvc3QgY29udHJvbCBjb21tYW5kICovCisJZG93bigmc21pX2RhdGFfbG9jayk7CisJcmV0ID0gc21pX2RhdGFfYnVmX3JlYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcG1fY21kKSk7CisJdXAoJnNtaV9kYXRhX2xvY2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlob3N0X2NvbnRyb2xfYWN0aW9uID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfc21pX3R5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBob3N0X2NvbnRyb2xfc21pX3R5cGUpOworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfc21pX3R5cGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaG9zdF9jb250cm9sX3NtaV90eXBlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfb25fc2h1dGRvd25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBob3N0X2NvbnRyb2xfb25fc2h1dGRvd24pOworfQorCitzdGF0aWMgc3NpemVfdCBob3N0X2NvbnRyb2xfb25fc2h1dGRvd25fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaG9zdF9jb250cm9sX29uX3NodXRkb3duID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIHNtaV9yZXF1ZXN0OiBnZW5lcmF0ZSBTTUkgcmVxdWVzdAorICoKKyAqIENhbGxlZCB3aXRoIHNtaV9kYXRhX2xvY2suCisgKi8KK3N0YXRpYyBpbnQgc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCit7CisJY3B1bWFza190IG9sZF9tYXNrOworCWludCByZXQgPSAwOworCisJaWYgKHNtaV9jbWQtPm1hZ2ljICE9IFNNSV9DTURfTUFHSUMpIHsKKwkJZGV2X2luZm8oJmRjZGJhc19wZGV2LT5kZXYsICIlczogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIiwKKwkJCSBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCQURSOworCX0KKworCS8qIFNNSSByZXF1aXJlcyBDUFUgMCAqLworCW9sZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoMCkpOworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgeworCQlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgQ1BVIDBcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdlbmVyYXRlIFNNSSAqLworCWFzbSB2b2xhdGlsZSAoCisJCSJvdXRiICViMCwldzEiCisJCTogLyogbm8gb3V0cHV0IGFyZ3MgKi8KKwkJOiAiYSIgKHNtaV9jbWQtPmNvbW1hbmRfY29kZSksCisJCSAgImQiIChzbWlfY21kLT5jb21tYW5kX2FkZHJlc3MpLAorCQkgICJiIiAoc21pX2NtZC0+ZWJ4KSwKKwkJICAiYyIgKHNtaV9jbWQtPmVjeCkKKwkJOiAibWVtb3J5IgorCSk7CisKK291dDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZF9tYXNrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNtaV9yZXF1ZXN0X3N0b3JlOgorICoKKyAqIFRoZSB2YWxpZCB2YWx1ZXMgYXJlOgorICogMDogemVybyBTTUkgZGF0YSBidWZmZXIKKyAqIDE6IGdlbmVyYXRlIGNhbGxpbmcgaW50ZXJmYWNlIFNNSQorICogMjogZ2VuZXJhdGUgcmF3IFNNSQorICoKKyAqIFVzZXIgYXBwbGljYXRpb24gd3JpdGVzIHNtaV9jbWQgdG8gc21pX2RhdGEgYmVmb3JlIHRlbGxpbmcgZHJpdmVyCisgKiB0byBnZW5lcmF0ZSBTTUkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNtaV9yZXF1ZXN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzbWlfY21kICpzbWlfY21kOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZzbWlfZGF0YV9sb2NrKTsKKworCWlmIChzbWlfZGF0YV9idWZfc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgc21pX2NtZCkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCXNtaV9jbWQgPSAoc3RydWN0IHNtaV9jbWQgKilzbWlfZGF0YV9idWY7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMjoKKwkJLyogUmF3IFNNSSAqLworCQlyZXQgPSBzbWlfcmVxdWVzdChzbWlfY21kKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBjb3VudDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBDYWxsaW5nIEludGVyZmFjZSBTTUkgKi8KKwkJc21pX2NtZC0+ZWJ4ID0gKHUzMikgdmlydF90b19waHlzKHNtaV9jbWQtPmNvbW1hbmRfYnVmZmVyKTsKKwkJcmV0ID0gc21pX3JlcXVlc3Qoc21pX2NtZCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY291bnQ7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtc2V0KHNtaV9kYXRhX2J1ZiwgMCwgc21pX2RhdGFfYnVmX3NpemUpOworCQlyZXQgPSBjb3VudDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdXAoJnNtaV9kYXRhX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaG9zdF9jb250cm9sX3NtaTogZ2VuZXJhdGUgaG9zdCBjb250cm9sIFNNSQorICoKKyAqIENhbGxlciBtdXN0IHNldCB1cCB0aGUgaG9zdCBjb250cm9sIGNvbW1hbmQgaW4gc21pX2RhdGFfYnVmLgorICovCitzdGF0aWMgaW50IGhvc3RfY29udHJvbF9zbWkodm9pZCkKK3sKKwlzdHJ1Y3QgYXBtX2NtZCAqYXBtX2NtZDsKKwl1OCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBudW1fdGlja3M7CisJczggY21kX3N0YXR1czsKKwl1OCBpbmRleDsKKworCWFwbV9jbWQgPSAoc3RydWN0IGFwbV9jbWQgKilzbWlfZGF0YV9idWY7CisJYXBtX2NtZC0+c3RhdHVzID0gRVNNX1NUQVRVU19DTURfVU5TVUNDRVNTRlVMOworCisJc3dpdGNoIChob3N0X2NvbnRyb2xfc21pX3R5cGUpIHsKKwljYXNlIEhDX1NNSVRZUEVfVFlQRTE6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCQkvKiB3cml0ZSBTTUkgZGF0YSBidWZmZXIgcGh5c2ljYWwgYWRkcmVzcyAqLworCQlkYXRhID0gKHU4ICopJnNtaV9kYXRhX2J1Zl9waHlzX2FkZHI7CisJCWZvciAoaW5kZXggPSBQRTEzMDBfQ01PU19DTURfU1RSVUNUX1BUUjsKKwkJICAgICBpbmRleCA8IChQRTEzMDBfQ01PU19DTURfU1RSVUNUX1BUUiArIDQpOworCQkgICAgIGluZGV4KyssIGRhdGErKykgeworCQkJb3V0YihpbmRleCwKKwkJCSAgICAgKENNT1NfQkFTRV9QT1JUICsgQ01PU19QQUdFMl9JTkRFWF9QT1JUX1BJSVg0KSk7CisJCQlvdXRiKCpkYXRhLAorCQkJICAgICAoQ01PU19CQVNFX1BPUlQgKyBDTU9TX1BBR0UyX0RBVEFfUE9SVF9QSUlYNCkpOworCQl9CisKKwkJLyogZmlyc3Qgc2V0IHN0YXR1cyB0byAtMSBhcyBjYWxsZWQgYnkgc3BlYyAqLworCQljbWRfc3RhdHVzID0gRVNNX1NUQVRVU19DTURfVU5TVUNDRVNTRlVMOworCQlvdXRiKCh1OCkgY21kX3N0YXR1cywgUENBVF9BUE1fU1RBVFVTX1BPUlQpOworCisJCS8qIGdlbmVyYXRlIFNNTSBjYWxsICovCisJCW91dGIoRVNNX0FQTV9DTUQsIFBDQVRfQVBNX0NPTlRST0xfUE9SVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwkJLyogd2FpdCBhIGZldyB0byBzZWUgaWYgaXQgZXhlY3V0ZWQgKi8KKwkJbnVtX3RpY2tzID0gVElNRU9VVF9VU0VDX1NIT1JUX1NFTUFfQkxPQ0tJTkc7CisJCXdoaWxlICgoY21kX3N0YXR1cyA9IGluYihQQ0FUX0FQTV9TVEFUVVNfUE9SVCkpCisJCSAgICAgICA9PSBFU01fU1RBVFVTX0NNRF9VTlNVQ0NFU1NGVUwpIHsKKwkJCW51bV90aWNrcy0tOworCQkJaWYgKG51bV90aWNrcyA9PSBFWFBJUkVEX1RJTUVSKQorCQkJCXJldHVybiAtRVRJTUU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhDX1NNSVRZUEVfVFlQRTI6CisJY2FzZSBIQ19TTUlUWVBFX1RZUEUzOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwkJLyogd3JpdGUgU01JIGRhdGEgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJZGF0YSA9ICh1OCAqKSZzbWlfZGF0YV9idWZfcGh5c19hZGRyOworCQlmb3IgKGluZGV4ID0gUEUxNDAwX0NNT1NfQ01EX1NUUlVDVF9QVFI7CisJCSAgICAgaW5kZXggPCAoUEUxNDAwX0NNT1NfQ01EX1NUUlVDVF9QVFIgKyA0KTsKKwkJICAgICBpbmRleCsrLCBkYXRhKyspIHsKKwkJCW91dGIoaW5kZXgsIChDTU9TX0JBU0VfUE9SVCArIENNT1NfUEFHRTFfSU5ERVhfUE9SVCkpOworCQkJb3V0YigqZGF0YSwgKENNT1NfQkFTRV9QT1JUICsgQ01PU19QQUdFMV9EQVRBX1BPUlQpKTsKKwkJfQorCisJCS8qIGdlbmVyYXRlIFNNTSBjYWxsICovCisJCWlmIChob3N0X2NvbnRyb2xfc21pX3R5cGUgPT0gSENfU01JVFlQRV9UWVBFMykKKwkJCW91dGIoRVNNX0FQTV9DTUQsIFBDQVRfQVBNX0NPTlRST0xfUE9SVCk7CisJCWVsc2UKKwkJCW91dGIoRVNNX0FQTV9DTUQsIFBFMTQwMF9BUE1fQ09OVFJPTF9QT1JUKTsKKworCQkvKiByZXN0b3JlIFJUQyBpbmRleCBwb2ludGVyIHNpbmNlIGl0IHdhcyB3cml0dGVuIHRvIGFib3ZlICovCisJCUNNT1NfUkVBRChSVENfUkVHX0MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCisJCS8qIHJlYWQgY29udHJvbCBwb3J0IGJhY2sgdG8gc2VyaWFsaXplIHdyaXRlICovCisJCWNtZF9zdGF0dXMgPSBpbmIoUEUxNDAwX0FQTV9DT05UUk9MX1BPUlQpOworCisJCS8qIHdhaXQgYSBmZXcgdG8gc2VlIGlmIGl0IGV4ZWN1dGVkICovCisJCW51bV90aWNrcyA9IFRJTUVPVVRfVVNFQ19TSE9SVF9TRU1BX0JMT0NLSU5HOworCQl3aGlsZSAoYXBtX2NtZC0+c3RhdHVzID09IEVTTV9TVEFUVVNfQ01EX1VOU1VDQ0VTU0ZVTCkgeworCQkJbnVtX3RpY2tzLS07CisJCQlpZiAobnVtX3RpY2tzID09IEVYUElSRURfVElNRVIpCisJCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmRjZGJhc19wZGV2LT5kZXYsICIlczogaW52YWxpZCBTTUkgdHlwZSAldVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgaG9zdF9jb250cm9sX3NtaV90eXBlKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZGNkYmFzX2hvc3RfY29udHJvbDogaW5pdGlhdGUgaG9zdCBjb250cm9sCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGRyaXZlciBhZnRlciB0aGUgc3lzdGVtIGhhcworICogZmluaXNoZWQgc2h1dHRpbmcgZG93biBpZiB0aGUgdXNlciBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYQorICogaG9zdCBjb250cm9sIGFjdGlvbiB0byBwZXJmb3JtIG9uIHNodXRkb3duLiAgSXQgaXMgc2FmZSB0bworICogdXNlIHNtaV9kYXRhX2J1ZiBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHN5c3RlbSBoYXMgZmluaXNoZWQKKyAqIHNodXR0aW5nIGRvd24gYW5kIG5vIHVzZXJzcGFjZSBhcHBzIGFyZSBydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCBkY2RiYXNfaG9zdF9jb250cm9sKHZvaWQpCit7CisJc3RydWN0IGFwbV9jbWQgKmFwbV9jbWQ7CisJdTggYWN0aW9uOworCisJaWYgKGhvc3RfY29udHJvbF9hY3Rpb24gPT0gSENfQUNUSU9OX05PTkUpCisJCXJldHVybjsKKworCWFjdGlvbiA9IGhvc3RfY29udHJvbF9hY3Rpb247CisJaG9zdF9jb250cm9sX2FjdGlvbiA9IEhDX0FDVElPTl9OT05FOworCisJaWYgKCFzbWlfZGF0YV9idWYpIHsKKwkJZGV2X2RiZygmZGNkYmFzX3BkZXYtPmRldiwgIiVzOiBubyBTTUkgYnVmZmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHNtaV9kYXRhX2J1Zl9zaXplIDwgc2l6ZW9mKHN0cnVjdCBhcG1fY21kKSkgeworCQlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IFNNSSBidWZmZXIgdG9vIHNtYWxsXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWFwbV9jbWQgPSAoc3RydWN0IGFwbV9jbWQgKilzbWlfZGF0YV9idWY7CisKKwkvKiBwb3dlciBvZmYgdGFrZXMgcHJlY2VkZW5jZSAqLworCWlmIChhY3Rpb24gJiBIQ19BQ1RJT05fSE9TVF9DT05UUk9MX1BPV0VST0ZGKSB7CisJCWFwbV9jbWQtPmNvbW1hbmQgPSBFU01fQVBNX1BPV0VSX0NZQ0xFOworCQlhcG1fY21kLT5yZXNlcnZlZCA9IDA7CisJCSooKHMxNiAqKSZhcG1fY21kLT5wYXJhbWV0ZXJzLnNob3J0cmVxLnBhcm1bMF0pID0gKHMxNikgMDsKKwkJaG9zdF9jb250cm9sX3NtaSgpOworCX0gZWxzZSBpZiAoYWN0aW9uICYgSENfQUNUSU9OX0hPU1RfQ09OVFJPTF9QT1dFUkNZQ0xFKSB7CisJCWFwbV9jbWQtPmNvbW1hbmQgPSBFU01fQVBNX1BPV0VSX0NZQ0xFOworCQlhcG1fY21kLT5yZXNlcnZlZCA9IDA7CisJCSooKHMxNiAqKSZhcG1fY21kLT5wYXJhbWV0ZXJzLnNob3J0cmVxLnBhcm1bMF0pID0gKHMxNikgMjA7CisJCWhvc3RfY29udHJvbF9zbWkoKTsKKwl9Cit9CisKKy8qKgorICogZGNkYmFzX3JlYm9vdF9ub3RpZnk6IGhhbmRsZSByZWJvb3Qgbm90aWZpY2F0aW9uIGZvciBob3N0IGNvbnRyb2wKKyAqLworc3RhdGljIGludCBkY2RiYXNfcmVib290X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCQkJdm9pZCAqdW51c2VkKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbm90aWZ5X2NudCA9IDA7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFNZU19ET1dOOgorCWNhc2UgU1lTX0hBTFQ6CisJY2FzZSBTWVNfUE9XRVJfT0ZGOgorCQlpZiAoaG9zdF9jb250cm9sX29uX3NodXRkb3duKSB7CisJCQkvKiBmaXJtd2FyZSBpcyBnb2luZyB0byBwZXJmb3JtIGhvc3QgY29udHJvbCBhY3Rpb24gKi8KKwkJCWlmICgrK25vdGlmeV9jbnQgPT0gMikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIlBsZWFzZSB3YWl0IGZvciBzaHV0ZG93biAiCisJCQkJICAgICAgICJhY3Rpb24gdG8gY29tcGxldGUuLi5cbiIpOworCQkJCWRjZGJhc19ob3N0X2NvbnRyb2woKTsKKwkJCX0KKwkJCS8qCisJCQkgKiByZWdpc3RlciBhZ2FpbiBhbmQgaW5pdGlhdGUgdGhlIGhvc3QgY29udHJvbAorCQkJICogYWN0aW9uIG9uIHRoZSBzZWNvbmQgbm90aWZpY2F0aW9uIHRvIGFsbG93CisJCQkgKiBldmVyeW9uZSB0aGF0IHJlZ2lzdGVyZWQgdG8gYmUgbm90aWZpZWQKKwkJCSAqLworCQkJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKG5iKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGNkYmFzX3JlYm9vdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRjZGJhc19yZWJvb3Rfbm90aWZ5LAorCS5uZXh0ID0gTlVMTCwKKwkucHJpb3JpdHkgPSAwCit9OworCitzdGF0aWMgRENEQkFTX0JJTl9BVFRSX1JXKHNtaV9kYXRhKTsKKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlICpkY2RiYXNfYmluX2F0dHJzW10gPSB7CisJJmJpbl9hdHRyX3NtaV9kYXRhLAorCU5VTEwKK307CisKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfUlcoc21pX2RhdGFfYnVmX3NpemUpOworc3RhdGljIERDREJBU19ERVZfQVRUUl9STyhzbWlfZGF0YV9idWZfcGh5c19hZGRyKTsKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfV08oc21pX3JlcXVlc3QpOworc3RhdGljIERDREJBU19ERVZfQVRUUl9SVyhob3N0X2NvbnRyb2xfYWN0aW9uKTsKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfUlcoaG9zdF9jb250cm9sX3NtaV90eXBlKTsKK3N0YXRpYyBEQ0RCQVNfREVWX0FUVFJfUlcoaG9zdF9jb250cm9sX29uX3NodXRkb3duKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkY2RiYXNfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3NtaV9kYXRhX2J1Zl9zaXplLAorCSZkZXZfYXR0cl9zbWlfZGF0YV9idWZfcGh5c19hZGRyLAorCSZkZXZfYXR0cl9zbWlfcmVxdWVzdCwKKwkmZGV2X2F0dHJfaG9zdF9jb250cm9sX2FjdGlvbiwKKwkmZGV2X2F0dHJfaG9zdF9jb250cm9sX3NtaV90eXBlLAorCSZkZXZfYXR0cl9ob3N0X2NvbnRyb2xfb25fc2h1dGRvd24sCisJTlVMTAorfTsKKworLyoqCisgKiBkY2RiYXNfaW5pdDogaW5pdGlhbGl6ZSBkcml2ZXIKKyAqLworc3RhdGljIGludCBfX2luaXQgZGNkYmFzX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWhvc3RfY29udHJvbF9hY3Rpb24gPSBIQ19BQ1RJT05fTk9ORTsKKwlob3N0X2NvbnRyb2xfc21pX3R5cGUgPSBIQ19TTUlUWVBFX05PTkU7CisKKwlkY2RiYXNfcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJJVkVSX05BTUUsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKGRjZGJhc19wZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGNkYmFzX3BkZXYpOworCisJLyoKKwkgKiBCSU9TIFNNSSBjYWxscyByZXF1aXJlIGJ1ZmZlciBhZGRyZXNzZXMgYmUgaW4gMzItYml0IGFkZHJlc3Mgc3BhY2UuCisJICogVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgdGhlIERNQSBtYXNrIGJlbG93LgorCSAqLworCWRjZGJhc19wZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKKwlkY2RiYXNfcGRldi0+ZGV2LmRtYV9tYXNrID0gJmRjZGJhc19wZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CisKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmRjZGJhc19yZWJvb3RfbmIpOworCisJZm9yIChpID0gMDsgZGNkYmFzX2Jpbl9hdHRyc1tpXTsgaSsrKQorCQlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRjZGJhc19wZGV2LT5kZXYua29iaiwKKwkJCQkgICAgICBkY2RiYXNfYmluX2F0dHJzW2ldKTsKKworCWZvciAoaSA9IDA7IGRjZGJhc19kZXZfYXR0cnNbaV07IGkrKykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkY2RiYXNfcGRldi0+ZGV2LCBkY2RiYXNfZGV2X2F0dHJzW2ldKTsKKworCWRldl9pbmZvKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXMgKHZlcnNpb24gJXMpXG4iLAorCQkgRFJJVkVSX0RFU0NSSVBUSU9OLCBEUklWRVJfVkVSU0lPTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkY2RiYXNfZXhpdDogcGVyZm9ybSBkcml2ZXIgY2xlYW51cAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZGNkYmFzX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkY2RiYXNfcGRldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmRjZGJhc19yZWJvb3RfbmIpOworCXNtaV9kYXRhX2J1Zl9mcmVlKCk7Cit9CisKK21vZHVsZV9pbml0KGRjZGJhc19pbml0KTsKK21vZHVsZV9leGl0KGRjZGJhc19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDUklQVElPTiAiICh2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIikiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIkRlbGwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE4NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqICBkY2RiYXMuaDogRGVmaW5pdGlvbnMgZm9yIERlbGwgU3lzdGVtcyBNYW5hZ2VtZW50IEJhc2UgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IERlbGwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RDREJBU19IXworI2RlZmluZSBfRENEQkFTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBNQVhfU01JX0RBVEFfQlVGX1NJWkUJCQkoMjU2ICogMTAyNCkKKworI2RlZmluZSBIQ19BQ1RJT05fTk9ORQkJCQkoMCkKKyNkZWZpbmUgSENfQUNUSU9OX0hPU1RfQ09OVFJPTF9QT1dFUk9GRgkJQklUKDEpCisjZGVmaW5lIEhDX0FDVElPTl9IT1NUX0NPTlRST0xfUE9XRVJDWUNMRQlCSVQoMikKKworI2RlZmluZSBIQ19TTUlUWVBFX05PTkUJCQkJKDApCisjZGVmaW5lIEhDX1NNSVRZUEVfVFlQRTEJCQkoMSkKKyNkZWZpbmUgSENfU01JVFlQRV9UWVBFMgkJCSgyKQorI2RlZmluZSBIQ19TTUlUWVBFX1RZUEUzCQkJKDMpCisKKyNkZWZpbmUgRVNNX0FQTV9DTUQJCQkJKDB4MEEwKQorI2RlZmluZSBFU01fQVBNX1BPV0VSX0NZQ0xFCQkJKDB4MTApCisjZGVmaW5lIEVTTV9TVEFUVVNfQ01EX1VOU1VDQ0VTU0ZVTAkJKC0xKQorCisjZGVmaW5lIENNT1NfQkFTRV9QT1JUCQkJCSgweDA3MCkKKyNkZWZpbmUgQ01PU19QQUdFMV9JTkRFWF9QT1JUCQkJKDApCisjZGVmaW5lIENNT1NfUEFHRTFfREFUQV9QT1JUCQkJKDEpCisjZGVmaW5lIENNT1NfUEFHRTJfSU5ERVhfUE9SVF9QSUlYNAkJKDIpCisjZGVmaW5lIENNT1NfUEFHRTJfREFUQV9QT1JUX1BJSVg0CQkoMykKKyNkZWZpbmUgUEUxNDAwX0FQTV9DT05UUk9MX1BPUlQJCQkoMHgwQjApCisjZGVmaW5lIFBDQVRfQVBNX0NPTlRST0xfUE9SVAkJCSgweDBCMikKKyNkZWZpbmUgUENBVF9BUE1fU1RBVFVTX1BPUlQJCQkoMHgwQjMpCisjZGVmaW5lIFBFMTMwMF9DTU9TX0NNRF9TVFJVQ1RfUFRSCQkoMHgzOCkKKyNkZWZpbmUgUEUxNDAwX0NNT1NfQ01EX1NUUlVDVF9QVFIJCSgweDcwKQorCisjZGVmaW5lIE1BWF9TWVNNR01UX1NIT1JUQ01EX1BBUk1CVUZfTEVOCSgxNCkKKyNkZWZpbmUgTUFYX1NZU01HTVRfTE9OR0NNRF9TR0VOVFJZX05VTQkJKDE2KQorCisjZGVmaW5lIFRJTUVPVVRfVVNFQ19TSE9SVF9TRU1BX0JMT0NLSU5HCSgxMDAwMCkKKyNkZWZpbmUgRVhQSVJFRF9USU1FUgkJCQkoMCkKKworI2RlZmluZSBTTUlfQ01EX01BR0lDCQkJCSgweDUzNEQ0OTMxKQorCisjZGVmaW5lIERDREJBU19ERVZfQVRUUl9SVyhfbmFtZSkgXAorCURFVklDRV9BVFRSKF9uYW1lLDA2MDAsX25hbWUjI19zaG93LF9uYW1lIyNfc3RvcmUpOworCisjZGVmaW5lIERDREJBU19ERVZfQVRUUl9STyhfbmFtZSkgXAorCURFVklDRV9BVFRSKF9uYW1lLDA0MDAsX25hbWUjI19zaG93LE5VTEwpOworCisjZGVmaW5lIERDREJBU19ERVZfQVRUUl9XTyhfbmFtZSkgXAorCURFVklDRV9BVFRSKF9uYW1lLDAyMDAsTlVMTCxfbmFtZSMjX3N0b3JlKTsKKworI2RlZmluZSBEQ0RCQVNfQklOX0FUVFJfUlcoX25hbWUpIFwKK3N0cnVjdCBiaW5fYXR0cmlidXRlIGJpbl9hdHRyXyMjX25hbWUgPSB7IFwKKwkuYXR0ciA9ICB7IC5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCBcCisJCSAgIC5tb2RlID0gMDYwMCwgXAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSB9LCBcCisJLnJlYWQgPSAgX25hbWUjI19yZWFkLCBcCisJLndyaXRlID0gX25hbWUjI193cml0ZSwgXAorfQorCitzdHJ1Y3Qgc21pX2NtZCB7CisJX191MzIgbWFnaWM7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UxNiBjb21tYW5kX2FkZHJlc3M7CisJX191OCBjb21tYW5kX2NvZGU7CisJX191OCByZXNlcnZlZDsKKwlfX3U4IGNvbW1hbmRfYnVmZmVyWzFdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBhcG1fY21kIHsKKwlfX3U4IGNvbW1hbmQ7CisJX19zOCBzdGF0dXM7CisJX191MTYgcmVzZXJ2ZWQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OCBwYXJtW01BWF9TWVNNR01UX1NIT1JUQ01EX1BBUk1CVUZfTEVOXTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2hvcnRyZXE7CisKKwkJc3RydWN0IHsKKwkJCV9fdTE2IG51bV9zZ19lbnRyaWVzOworCQkJc3RydWN0IHsKKwkJCQlfX3UzMiBzaXplOworCQkJCV9fdTY0IGFkZHI7CisJCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCQkJICAgIHNnbGlzdFtNQVhfU1lTTUdNVF9MT05HQ01EX1NHRU5UUllfTlVNXTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbG9uZ3JlcTsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwYXJhbWV0ZXJzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfRENEQkFTX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg2NWYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCkBAIC0wLDAgKzEsNjM0IEBACisvKgorICogZGVsbF9yYnUuYworICogQmlvcyBVcGRhdGUgZHJpdmVyIGZvciBEZWxsIHN5c3RlbXMKKyAqIEF1dGhvcjogRGVsbCBJbmMKKyAqICAgICAgICAgQWJoYXkgU2FsdW5rZSA8YWJoYXlfc2FsdW5rZUBkZWxsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGVsbCBJbmMuCisgKgorICogUmVtb3RlIEJJT1MgVXBkYXRlIChyYnUpIGRyaXZlciBpcyB1c2VkIGZvciB1cGRhdGluZyBERUxMIEJJT1MgYnkKKyAqIGNyZWF0aW5nIGVudHJpZXMgaW4gdGhlIC9zeXMgZmlsZSBzeXN0ZW1zIG9uIExpbnV4IDIuNiBhbmQgaGlnaGVyCisgKiBrZXJuZWxzLiBUaGUgZHJpdmVyIHN1cHBvcnRzIHR3byBtZWNoYW5pc20gdG8gdXBkYXRlIHRoZSBCSU9TIG5hbWVseQorICogY29udGlndW91cyBhbmQgcGFja2V0aXplZC4gQm90aCB0aGVzZSBtZXRob2RzIHN0aWxsIHJlcXVpcmUgaGF2aW5nIHNvbWUKKyAqIGFwcGxpY2F0aW9uIHRvIHNldCB0aGUgQ01PUyBiaXQgaW5kaWNhdGluZyB0aGUgQklPUyB0byB1cGRhdGUgaXRzZWxmCisgKiBhZnRlciBhIHJlYm9vdC4KKyAqCisgKiBDb250aWd1b3VzIG1ldGhvZDoKKyAqIFRoaXMgZHJpdmVyIHdyaXRlcyB0aGUgaW5jb21pbmcgZGF0YSBpbiBhIG1vbm9saXRoaWMgaW1hZ2UgYnkgYWxsb2NhdGluZworICogY29udGlndW91cyBwaHlzaWNhbCBwYWdlcyBsYXJnZSBlbm91Z2ggdG8gYWNjb21tb2RhdGUgdGhlIGluY29taW5nIEJJT1MKKyAqIGltYWdlIHNpemUuCisgKgorICogUGFja2V0aXplZCBtZXRob2Q6CisgKiBUaGUgZHJpdmVyIHdyaXRlcyB0aGUgaW5jb21pbmcgcGFja2V0IGltYWdlIGJ5IGFsbG9jYXRpbmcgYSBuZXcgcGFja2V0CisgKiBvbiBldmVyeSB0aW1lIHRoZSBwYWNrZXQgZGF0YSBpcyB3cml0dGVuLiBUaGlzIGRyaXZlciByZXF1aXJlcyBhbgorICogYXBwbGljYXRpb24gdG8gYnJlYWsgdGhlIEJJT1MgaW1hZ2UgaW4gdG8gZml4ZWQgc2l6ZWQgcGFja2V0IGNodW5rcy4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworTU9EVUxFX0FVVEhPUigiQWJoYXkgU2FsdW5rZSA8YWJoYXlfc2FsdW5rZUBkZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB1cGRhdGluZyBCSU9TIGltYWdlIG9uIERFTEwgc3lzdGVtcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworCisjZGVmaW5lIEJJT1NfU0NBTl9MSU1JVCAweGZmZmZmZmZmCisjZGVmaW5lIE1BWF9JTUFHRV9MRU5HVEggMTYKK3N0YXRpYyBzdHJ1Y3QgX3JidV9kYXRhIHsKKwl2b2lkICppbWFnZV91cGRhdGVfYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgaW1hZ2VfdXBkYXRlX2J1ZmZlcl9zaXplOworCXVuc2lnbmVkIGxvbmcgYmlvc19pbWFnZV9zaXplOworCWludCBpbWFnZV91cGRhdGVfb3JkZXJudW07CisJaW50IGRtYV9hbGxvYzsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfcmVhZF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF93cml0ZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgcGFja2V0c2l6ZTsKK30gcmJ1X2RhdGE7CisKK3N0YXRpYyBjaGFyIGltYWdlX3R5cGVbTUFYX0lNQUdFX0xFTkdUSF0gPSAibW9ubyI7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGltYWdlX3R5cGUsIGltYWdlX3R5cGUsIHNpemVvZihpbWFnZV90eXBlKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGltYWdlX3R5cGUsICJCSU9TIGltYWdlIHR5cGUuIGNob29zZS0gbW9ubyBvciBwYWNrZXQiKTsKKworc3RydWN0IHBhY2tldF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc2l6ZV90IGxlbmd0aDsKKwl2b2lkICpkYXRhOworCWludCBvcmRlcm51bTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X2RhdGEgcGFja2V0X2RhdGFfaGVhZDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJidV9kZXZpY2U7CitzdGF0aWMgaW50IGNvbnRleHQ7CitzdGF0aWMgZG1hX2FkZHJfdCBkZWxsX3JidV9kbWFhZGRyOworCitzdGF0aWMgdm9pZCBpbml0X3BhY2tldF9oZWFkKHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJnBhY2tldF9kYXRhX2hlYWQubGlzdCk7CisJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ID0gMDsKKwlyYnVfZGF0YS5wYWNrZXRfcmVhZF9jb3VudCA9IDA7CisJcmJ1X2RhdGEubnVtX3BhY2tldHMgPSAwOworCXJidV9kYXRhLnBhY2tldHNpemUgPSAwOworfQorCitzdGF0aWMgaW50IGZpbGxfbGFzdF9wYWNrZXQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdGVtcF9saXN0OworCXN0cnVjdCBwYWNrZXRfZGF0YSAqcGFja2V0ID0gTlVMTDsKKwlpbnQgcGFja2V0X2NvdW50ID0gMDsKKworCXByX2RlYnVnKCJmaWxsX2xhc3RfcGFja2V0OiBlbnRyeSBcbiIpOworCisJaWYgKCFyYnVfZGF0YS5udW1fcGFja2V0cykgeworCQlwcl9kZWJ1ZygiZmlsbF9sYXN0X3BhY2tldDogbnVtX3BhY2tldHM9MFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBhY2tldF9jb3VudCA9IHJidV9kYXRhLm51bV9wYWNrZXRzOworCisJcHRlbXBfbGlzdCA9ICgmcGFja2V0X2RhdGFfaGVhZC5saXN0KS0+cHJldjsKKworCXBhY2tldCA9IGxpc3RfZW50cnkocHRlbXBfbGlzdCwgc3RydWN0IHBhY2tldF9kYXRhLCBsaXN0KTsKKworCWlmICgocmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ICsgbGVuZ3RoKSA+IHJidV9kYXRhLnBhY2tldHNpemUpIHsKKwkJcHJfZGVidWcoImRlbGxfcmJ1OiVzOiBwYWNrZXQgc2l6ZSBkYXRhICIKKwkJCSAib3ZlcnJ1blxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoImZpbGxfbGFzdF9wYWNrZXQgOiBidWZmZXIgPSAlcFxuIiwgcGFja2V0LT5kYXRhKTsKKworCW1lbWNweSgocGFja2V0LT5kYXRhICsgcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50KSwgZGF0YSwgbGVuZ3RoKTsKKworCWlmICgocmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ICsgbGVuZ3RoKSA9PSByYnVfZGF0YS5wYWNrZXRzaXplKSB7CisJCS8qCisJCSAqIHRoaXMgd2FzIHRoZSBsYXN0IGRhdGEgY2h1bmsgaW4gdGhlIHBhY2tldAorCQkgKiBzbyByZWluaXRpYWxpemUgdGhlIHBhY2tldCBkYXRhIGNvdW50ZXIgdG8gemVybworCQkgKi8KKwkJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ID0gMDsKKwl9IGVsc2UKKwkJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ICs9IGxlbmd0aDsKKworCXByX2RlYnVnKCJmaWxsX2xhc3RfcGFja2V0OiBleGl0IFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3BhY2tldChzaXplX3QgbGVuZ3RoKQoreworCXN0cnVjdCBwYWNrZXRfZGF0YSAqbmV3cGFja2V0OworCWludCBvcmRlcm51bSA9IDA7CisKKwlwcl9kZWJ1ZygiY3JlYXRlX3BhY2tldDogZW50cnkgXG4iKTsKKworCWlmICghcmJ1X2RhdGEucGFja2V0c2l6ZSkgeworCQlwcl9kZWJ1ZygiY3JlYXRlX3BhY2tldDogcGFja2V0c2l6ZSBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3cGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhY2tldF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdwYWNrZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImRlbGxfcmJ1OiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3ICIKKwkJICAgICAgICJwYWNrZXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW9yZGVybnVtID0gZ2V0X29yZGVyKGxlbmd0aCk7CisJLyoKKwkgKiB0aGVyZSBpcyBubyB1cHBlciBsaW1pdCBvbiBtZW1vcnkKKwkgKiBhZGRyZXNzIGZvciBwYWNrZXRpemVkIG1lY2hhbmlzbQorCSAqLworCW5ld3BhY2tldC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJCSAgICBvcmRlcm51bSk7CisKKwlwcl9kZWJ1ZygiY3JlYXRlX3BhY2tldDogbmV3cGFja2V0ICVwXG4iLCBuZXdwYWNrZXQtPmRhdGEpOworCisJaWYgKCFuZXdwYWNrZXQtPmRhdGEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImRlbGxfcmJ1OiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3ICIKKwkJICAgICAgICJwYWNrZXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKG5ld3BhY2tldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5ld3BhY2tldC0+b3JkZXJudW0gPSBvcmRlcm51bTsKKwkrK3JidV9kYXRhLm51bV9wYWNrZXRzOworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgbmV3bHkgY3JlYXRlZCBwYWNrZXQgaGVhZGVycworCSAqLworCUlOSVRfTElTVF9IRUFEKCZuZXdwYWNrZXQtPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJm5ld3BhY2tldC0+bGlzdCwgJnBhY2tldF9kYXRhX2hlYWQubGlzdCk7CisJLyoKKwkgKiBwYWNrZXRzIGhhdmUgZml4ZWQgc2l6ZQorCSAqLworCW5ld3BhY2tldC0+bGVuZ3RoID0gcmJ1X2RhdGEucGFja2V0c2l6ZTsKKworCXByX2RlYnVnKCJjcmVhdGVfcGFja2V0OiBleGl0IFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWNrZXRpemVfZGF0YSh2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIXJidV9kYXRhLnBhY2tldF93cml0ZV9jb3VudCkgeworCQlpZiAoKHJjID0gY3JlYXRlX3BhY2tldChsZW5ndGgpKSkKKwkJCXJldHVybiByYzsKKwl9CisJaWYgKChyYyA9IGZpbGxfbGFzdF9wYWNrZXQoZGF0YSwgbGVuZ3RoKSkpCisJCXJldHVybiByYzsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorZG9fcGFja2V0X3JlYWQoY2hhciAqZGF0YSwgc3RydWN0IGxpc3RfaGVhZCAqcHRlbXBfbGlzdCwKKwkgICAgICAgaW50IGxlbmd0aCwgaW50IGJ5dGVzX3JlYWQsIGludCAqbGlzdF9yZWFkX2NvdW50KQoreworCXZvaWQgKnB0ZW1wX2J1ZjsKKwlzdHJ1Y3QgcGFja2V0X2RhdGEgKm5ld3BhY2tldCA9IE5VTEw7CisJaW50IGJ5dGVzX2NvcGllZCA9IDA7CisJaW50IGogPSAwOworCisJbmV3cGFja2V0ID0gbGlzdF9lbnRyeShwdGVtcF9saXN0LCBzdHJ1Y3QgcGFja2V0X2RhdGEsIGxpc3QpOworCSpsaXN0X3JlYWRfY291bnQgKz0gbmV3cGFja2V0LT5sZW5ndGg7CisKKwlpZiAoKmxpc3RfcmVhZF9jb3VudCA+IGJ5dGVzX3JlYWQpIHsKKwkJLyogcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHVucmVhZCBkYXRhICovCisJCWogPSBuZXdwYWNrZXQtPmxlbmd0aCAtICgqbGlzdF9yZWFkX2NvdW50IC0gYnl0ZXNfcmVhZCk7CisJCS8qIHBvaW50IHRvIHRoZSBvZmZzZXQgaW4gdGhlIHBhY2tldCBidWZmZXIgKi8KKwkJcHRlbXBfYnVmID0gKHU4ICopIG5ld3BhY2tldC0+ZGF0YSArIGo7CisJCS8qCisJCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCByb29tIGluCisJCSAqICogdGhlIGluY29taW5nIGJ1ZmZlcgorCQkgKi8KKwkJaWYgKGxlbmd0aCA+ICgqbGlzdF9yZWFkX2NvdW50IC0gYnl0ZXNfcmVhZCkpCisJCQkvKgorCQkJICogY29weSB3aGF0IGV2ZXIgaXMgdGhlcmUgaW4gdGhpcworCQkJICogcGFja2V0IGFuZCBtb3ZlIG9uCisJCQkgKi8KKwkJCWJ5dGVzX2NvcGllZCA9ICgqbGlzdF9yZWFkX2NvdW50IC0gYnl0ZXNfcmVhZCk7CisJCWVsc2UKKwkJCS8qIGNvcHkgdGhlIHJlbWFpbmluZyAqLworCQkJYnl0ZXNfY29waWVkID0gbGVuZ3RoOworCQltZW1jcHkoZGF0YSwgcHRlbXBfYnVmLCBieXRlc19jb3BpZWQpOworCX0KKwlyZXR1cm4gYnl0ZXNfY29waWVkOworfQorCitzdGF0aWMgaW50IHBhY2tldF9yZWFkX2xpc3QoY2hhciAqZGF0YSwgc2l6ZV90ICogcHJlYWRfbGVuZ3RoKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ZW1wX2xpc3Q7CisJaW50IHRlbXBfY291bnQgPSAwOworCWludCBieXRlc19jb3BpZWQgPSAwOworCWludCBieXRlc19yZWFkID0gMDsKKwlpbnQgcmVtYWluaW5nX2J5dGVzID0gMDsKKwljaGFyICpwZGVzdCA9IGRhdGE7CisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFueSBwYWNrZXRzICovCisJaWYgKDAgPT0gcmJ1X2RhdGEubnVtX3BhY2tldHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVtYWluaW5nX2J5dGVzID0gKnByZWFkX2xlbmd0aDsKKwlieXRlc19yZWFkID0gcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQ7CisKKwlwdGVtcF9saXN0ID0gKCZwYWNrZXRfZGF0YV9oZWFkLmxpc3QpLT5uZXh0OworCXdoaWxlICghbGlzdF9lbXB0eShwdGVtcF9saXN0KSkgeworCQlieXRlc19jb3BpZWQgPSBkb19wYWNrZXRfcmVhZChwZGVzdCwgcHRlbXBfbGlzdCwKKwkJCQkJICAgICAgcmVtYWluaW5nX2J5dGVzLCBieXRlc19yZWFkLAorCQkJCQkgICAgICAmdGVtcF9jb3VudCk7CisJCXJlbWFpbmluZ19ieXRlcyAtPSBieXRlc19jb3BpZWQ7CisJCWJ5dGVzX3JlYWQgKz0gYnl0ZXNfY29waWVkOworCQlwZGVzdCArPSBieXRlc19jb3BpZWQ7CisJCS8qCisJCSAqIGNoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIG9mIGJ1ZmZlciBiZWZvcmUgcmVhY2hpbmcgdGhlCisJCSAqIGxhc3QgcGFja2V0CisJCSAqLworCQlpZiAocmVtYWluaW5nX2J5dGVzID09IDApCisJCQlicmVhazsKKworCQlwdGVtcF9saXN0ID0gcHRlbXBfbGlzdC0+bmV4dDsKKwl9CisJLypmaW5hbGx5IHNldCB0aGUgYnl0ZXMgcmVhZCAqLworCSpwcmVhZF9sZW5ndGggPSBieXRlc19yZWFkIC0gcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQ7CisJcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQgPSBieXRlc19yZWFkOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWNrZXRfZW1wdHlfbGlzdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ZW1wX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqcG5leHRfbGlzdDsKKwlzdHJ1Y3QgcGFja2V0X2RhdGEgKm5ld3BhY2tldDsKKworCXB0ZW1wX2xpc3QgPSAoJnBhY2tldF9kYXRhX2hlYWQubGlzdCktPm5leHQ7CisJd2hpbGUgKCFsaXN0X2VtcHR5KHB0ZW1wX2xpc3QpKSB7CisJCW5ld3BhY2tldCA9CisJCSAgICBsaXN0X2VudHJ5KHB0ZW1wX2xpc3QsIHN0cnVjdCBwYWNrZXRfZGF0YSwgbGlzdCk7CisJCXBuZXh0X2xpc3QgPSBwdGVtcF9saXN0LT5uZXh0OworCQlsaXN0X2RlbChwdGVtcF9saXN0KTsKKwkJcHRlbXBfbGlzdCA9IHBuZXh0X2xpc3Q7CisJCS8qCisJCSAqIHplcm8gb3V0IHRoZSBSQlUgcGFja2V0IG1lbW9yeSBiZWZvcmUgZnJlZWluZworCQkgKiB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHN0YWxlIFJCVSBwYWNrZXRzIGxlZnQgaW4gbWVtb3J5CisJCSAqLworCQltZW1zZXQobmV3cGFja2V0LT5kYXRhLCAwLCByYnVfZGF0YS5wYWNrZXRzaXplKTsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdwYWNrZXQtPmRhdGEsCisJCQkgICBuZXdwYWNrZXQtPm9yZGVybnVtKTsKKwkJa2ZyZWUobmV3cGFja2V0KTsKKwl9CisJcmJ1X2RhdGEucGFja2V0X3dyaXRlX2NvdW50ID0gMDsKKwlyYnVfZGF0YS5wYWNrZXRfcmVhZF9jb3VudCA9IDA7CisJcmJ1X2RhdGEubnVtX3BhY2tldHMgPSAwOworCXJidV9kYXRhLnBhY2tldHNpemUgPSAwOworfQorCisvKgorICogaW1nX3VwZGF0ZV9mcmVlOiBGcmVlcyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3Igc3RvcmluZyBCSU9TIGltYWdlCisgKiBBbHdheXMgY2FsbGVkIHdpdGggbG9jayBoZWxkIGFuZCByZXR1cm5lZCB3aXRoIGxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBpbWdfdXBkYXRlX2ZyZWUodm9pZCkKK3sKKwlpZiAoIXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIpCisJCXJldHVybjsKKwkvKgorCSAqIHplcm8gb3V0IHRoaXMgYnVmZmVyIGJlZm9yZSBmcmVlaW5nIGl0IHRvIGdldCByaWQgb2YgYW55IHN0YWxlCisJICogQklPUyBpbWFnZSBjb3BpZWQgaW4gbWVtb3J5LgorCSAqLworCW1lbXNldChyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyLCAwLAorCSAgICAgICByYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyX3NpemUpOworCWlmIChyYnVfZGF0YS5kbWFfYWxsb2MgPT0gMSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplLAorCQkJCSAgcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlciwKKwkJCQkgIGRlbGxfcmJ1X2RtYWFkZHIpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyLAorCQkJICAgcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX29yZGVybnVtKTsKKworCS8qCisJICogUmUtaW5pdGlhbGl6ZSB0aGUgcmJ1X2RhdGEgdmFyaWFibGVzIGFmdGVyIGEgZnJlZQorCSAqLworCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9vcmRlcm51bSA9IC0xOworCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIgPSBOVUxMOworCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXJfc2l6ZSA9IDA7CisJcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplID0gMDsKKwlyYnVfZGF0YS5kbWFfYWxsb2MgPSAwOworfQorCisvKgorICogaW1nX3VwZGF0ZV9yZWFsbG9jOiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgY29udGlndW91cyBwYWdlcyB0bworICogYWNjb21tb2RhdGUgdGhlIHJlcXVlc3RlZCBzaXplIG9mIGRhdGEuIFRoZSBtZW1vcnkgYWRkcmVzcyBhbmQgc2l6ZQorICogdmFsdWVzIGFyZSBzdG9yZWQgZ2xvYmFsbHkgYW5kIG9uIGV2ZXJ5IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB0aGUgbmV3CisgKiBzaXplIGlzIGNoZWNrZWQgdG8gc2VlIGlmIG1vcmUgZGF0YSBpcyByZXF1aXJlZCB0aGFuIHRoZSBleGlzdGluZyBzaXplLgorICogSWYgdHJ1ZSB0aGUgcHJldmlvdXMgbWVtb3J5IGlzIGZyZWVkIGFuZCBuZXcgYWxsb2NhdGlvbiBpcyBkb25lIHRvCisgKiBhY2NvbW1vZGF0ZSB0aGUgbmV3IHNpemUuIElmIHRoZSBpbmNvbWluZyBzaXplIGlzIGxlc3MgdGhlbiB0aGFuIHRoZQorICogYWxyZWFkeSBhbGxvY2F0ZWQgc2l6ZSwgdGhlbiB0aGF0IG1lbW9yeSBpcyByZXVzZWQuIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGNhbGxlZCB3aXRoIGxvY2sgaGVsZCBhbmQgcmV0dXJucyB3aXRoIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBpbWdfdXBkYXRlX3JlYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKmltYWdlX3VwZGF0ZV9idWZmZXIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgcmM7CisJdW5zaWduZWQgbG9uZyBpbWdfYnVmX3BoeXNfYWRkcjsKKwlpbnQgb3JkZXJudW07CisJaW50IGRtYV9hbGxvYyA9IDA7CisKKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIGhhcyBiZWVuCisJICogYWxyZWFkeSBhbGxvY2F0ZWQKKwkgKi8KKwlpZiAocmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlcl9zaXplID49IHNpemUpIHsKKwkJLyoKKwkJICogY2hlY2sgZm9yIGNvcnJ1cHRpb24KKwkJICovCisJCWlmICgoc2l6ZSAhPSAwKSAmJiAocmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlciA9PSBOVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkZWxsX3JidTolczogY29ycnVwdGlvbiAiCisJCQkgICAgICAgImNoZWNrIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qCisJCSAqIHdlIGhhdmUgYSB2YWxpZCBwcmUtYWxsb2NhdGVkIGJ1ZmZlciB3aXRoCisJCSAqIHN1ZmZpY2llbnQgc2l6ZQorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBmcmVlIGFueSBwcmV2aW91c2x5IGFsbG9jYXRlZCBidWZmZXIKKwkgKi8KKwlpbWdfdXBkYXRlX2ZyZWUoKTsKKworCXNwaW5fdW5sb2NrKCZyYnVfZGF0YS5sb2NrKTsKKworCW9yZGVybnVtID0gZ2V0X29yZGVyKHNpemUpOworCWltYWdlX3VwZGF0ZV9idWZmZXIgPQorCSAgICAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXJudW0pOworCisJaW1nX2J1Zl9waHlzX2FkZHIgPQorCSAgICAodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoaW1hZ2VfdXBkYXRlX2J1ZmZlcik7CisKKwlpZiAoaW1nX2J1Zl9waHlzX2FkZHIgPiBCSU9TX1NDQU5fTElNSVQpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpbWFnZV91cGRhdGVfYnVmZmVyLCBvcmRlcm51bSk7CisJCW9yZGVybnVtID0gLTE7CisJCWltYWdlX3VwZGF0ZV9idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSwKKwkJCQkJCQkgJmRlbGxfcmJ1X2RtYWFkZHIsCisJCQkJCQkJIEdGUF9LRVJORUwpOworCQlkbWFfYWxsb2MgPSAxOworCX0KKworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisKKwlpZiAoaW1hZ2VfdXBkYXRlX2J1ZmZlciAhPSBOVUxMKSB7CisJCXJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIgPSBpbWFnZV91cGRhdGVfYnVmZmVyOworCQlyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyX3NpemUgPSBzaXplOworCQlyYnVfZGF0YS5iaW9zX2ltYWdlX3NpemUgPQorCQkgICAgcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlcl9zaXplOworCQlyYnVfZGF0YS5pbWFnZV91cGRhdGVfb3JkZXJudW0gPSBvcmRlcm51bTsKKwkJcmJ1X2RhdGEuZG1hX2FsbG9jID0gZG1hX2FsbG9jOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBpbWFnZSB1cGRhdGU6IgorCQkJICJzaXplID0gJWxkXG4iLCBzaXplKTsKKwkJcmMgPSAtRU5PTUVNOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF9wYWNrZXRfZGF0YShjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0dmFsOworCXNpemVfdCBieXRlc19sZWZ0OworCXNpemVfdCBkYXRhX2xlbmd0aDsKKwljaGFyICpwdGVtcEJ1ZiA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGltYWdlc2l6ZTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4gKi8KKwlpZiAocmJ1X2RhdGEubnVtX3BhY2tldHMgPT0gMCkgeworCQlwcl9kZWJ1ZygicmVhZF9wYWNrZXRfZGF0YTogbm8gcGFja2V0cyB3cml0dGVuXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byByZWFkX3JidV9kYXRhX2V4aXQ7CisJfQorCisJaW1hZ2VzaXplID0gcmJ1X2RhdGEubnVtX3BhY2tldHMgKiByYnVfZGF0YS5wYWNrZXRzaXplOworCisJaWYgKHBvcyA+IGltYWdlc2l6ZSkgeworCQlyZXR2YWwgPSAwOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWxsX3JidTpyZWFkX3BhY2tldF9kYXRhOiAiCisJCSAgICAgICAiZGF0YSB1bmRlcnJ1blxuIik7CisJCWdvdG8gcmVhZF9yYnVfZGF0YV9leGl0OworCX0KKworCWJ5dGVzX2xlZnQgPSBpbWFnZXNpemUgLSBwb3M7CisJZGF0YV9sZW5ndGggPSBtaW4oYnl0ZXNfbGVmdCwgY291bnQpOworCisJaWYgKChyZXR2YWwgPSBwYWNrZXRfcmVhZF9saXN0KHB0ZW1wQnVmLCAmZGF0YV9sZW5ndGgpKSA8IDApCisJCWdvdG8gcmVhZF9yYnVfZGF0YV9leGl0OworCisJaWYgKChwb3MgKyBjb3VudCkgPiBpbWFnZXNpemUpIHsKKwkJcmJ1X2RhdGEucGFja2V0X3JlYWRfY291bnQgPSAwOworCQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBjb3B5ICovCisJCXJldHZhbCA9IGJ5dGVzX2xlZnQ7CisJfSBlbHNlCisJCXJldHZhbCA9IGNvdW50OworCisgICAgICByZWFkX3JidV9kYXRhX2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF9yYnVfbW9ub19kYXRhKGNoYXIgKmJ1ZmZlciwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgKnB0ZW1wID0gTlVMTDsKKwlzaXplX3QgYnl0ZXNfbGVmdCA9IDA7CisJc2l6ZV90IGRhdGFfbGVuZ3RoID0gMDsKKwlzc2l6ZV90IHJldF9jb3VudCA9IDA7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuICovCisJaWYgKChyYnVfZGF0YS5pbWFnZV91cGRhdGVfYnVmZmVyID09IE5VTEwpIHx8CisJICAgIChyYnVfZGF0YS5iaW9zX2ltYWdlX3NpemUgPT0gMCkpIHsKKwkJcHJfZGVidWcoInJlYWRfcmJ1X2RhdGFfbW9ubzogaW1hZ2VfdXBkYXRlX2J1ZmZlciAlcCAsIgorCQkJICJiaW9zX2ltYWdlX3NpemUgJWx1XG4iLAorCQkJIHJidV9kYXRhLmltYWdlX3VwZGF0ZV9idWZmZXIsCisJCQkgcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplKTsKKwkJcmV0X2NvdW50ID0gLUVOT01FTTsKKwkJZ290byByZWFkX3JidV9kYXRhX2V4aXQ7CisJfQorCisJaWYgKHBvcyA+IHJidV9kYXRhLmJpb3NfaW1hZ2Vfc2l6ZSkgeworCQlyZXRfY291bnQgPSAwOworCQlnb3RvIHJlYWRfcmJ1X2RhdGFfZXhpdDsKKwl9CisKKwlieXRlc19sZWZ0ID0gcmJ1X2RhdGEuYmlvc19pbWFnZV9zaXplIC0gcG9zOworCWRhdGFfbGVuZ3RoID0gbWluKGJ5dGVzX2xlZnQsIGNvdW50KTsKKworCXB0ZW1wID0gcmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlcjsKKwltZW1jcHkoYnVmZmVyLCAocHRlbXAgKyBwb3MpLCBkYXRhX2xlbmd0aCk7CisKKwlpZiAoKHBvcyArIGNvdW50KSA+IHJidV9kYXRhLmJpb3NfaW1hZ2Vfc2l6ZSkKKwkJLyogdGhpcyB3YXMgdGhlIGxhc3QgY29weSAqLworCQlyZXRfY291bnQgPSBieXRlc19sZWZ0OworCWVsc2UKKwkJcmV0X2NvdW50ID0gY291bnQ7CisgICAgICByZWFkX3JidV9kYXRhX2V4aXQ6CisJcmV0dXJuIHJldF9jb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3JlYWRfcmJ1X2RhdGEoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZmZlciwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0X2NvdW50ID0gMDsKKworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisKKwlpZiAoIXN0cmNtcChpbWFnZV90eXBlLCAibW9ubyIpKQorCQlyZXRfY291bnQgPSByZWFkX3JidV9tb25vX2RhdGEoYnVmZmVyLCBwb3MsIGNvdW50KTsKKwllbHNlIGlmICghc3RyY21wKGltYWdlX3R5cGUsICJwYWNrZXQiKSkKKwkJcmV0X2NvdW50ID0gcmVhZF9wYWNrZXRfZGF0YShidWZmZXIsIHBvcywgY291bnQpOworCWVsc2UKKwkJcHJfZGVidWcoInJlYWRfcmJ1X2RhdGE6IGludmFsaWQgaW1hZ2UgdHlwZSBzcGVjaWZpZWRcbiIpOworCisJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworCXJldHVybiByZXRfY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CityZWFkX3JidV9pbWFnZV90eXBlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsCisJCSAgICBzaXplX3QgY291bnQpCit7CisJaW50IHNpemUgPSAwOworCWlmICghcG9zKQorCQlzaXplID0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgaW1hZ2VfdHlwZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit3cml0ZV9yYnVfaW1hZ2VfdHlwZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmZmVyLCBsb2ZmX3QgcG9zLAorCQkgICAgIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmMgPSBjb3VudDsKKwlzcGluX2xvY2soJnJidV9kYXRhLmxvY2spOworCisJaWYgKHN0cmxlbihidWZmZXIpIDwgTUFYX0lNQUdFX0xFTkdUSCkKKwkJc3NjYW5mKGJ1ZmZlciwgIiVzIiwgaW1hZ2VfdHlwZSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWxsX3JidTogaW1hZ2VfdHlwZSBpcyBpbnZhbGlkIgorCQkgICAgICAgIm1heCBjaGFycyA9ICVkLCBcbiBpbmNvbWluZyBzdHItLSVzLS0gXG4iLAorCQkgICAgICAgTUFYX0lNQUdFX0xFTkdUSCwgYnVmZmVyKTsKKworCS8qIHdlIG11c3QgZnJlZSBhbGwgcHJldmlvdXMgYWxsb2NhdGlvbnMgKi8KKwlwYWNrZXRfZW1wdHlfbGlzdCgpOworCWltZ191cGRhdGVfZnJlZSgpOworCisJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworCXJldHVybiByYzsKKworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcmJ1X2RhdGFfYXR0ciA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJkYXRhIiwub3duZXIgPSBUSElTX01PRFVMRSwubW9kZSA9IDA0NDR9LAorCS5yZWFkID0gcmVhZF9yYnVfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSByYnVfaW1hZ2VfdHlwZV9hdHRyID0geworCS5hdHRyID0gey5uYW1lID0gImltYWdlX3R5cGUiLC5vd25lciA9IFRISVNfTU9EVUxFLC5tb2RlID0gMDY0NH0sCisJLnJlYWQgPSByZWFkX3JidV9pbWFnZV90eXBlLAorCS53cml0ZSA9IHdyaXRlX3JidV9pbWFnZV90eXBlLAorfTsKKworc3RhdGljIHZvaWQgY2FsbGJhY2tmbl9yYnUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFmdyB8fCAhZnctPnNpemUpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisJaWYgKCFzdHJjbXAoaW1hZ2VfdHlwZSwgIm1vbm8iKSkgeworCQlpZiAoIWltZ191cGRhdGVfcmVhbGxvYyhmdy0+c2l6ZSkpCisJCQltZW1jcHkocmJ1X2RhdGEuaW1hZ2VfdXBkYXRlX2J1ZmZlciwKKwkJCSAgICAgICBmdy0+ZGF0YSwgZnctPnNpemUpOworCX0gZWxzZSBpZiAoIXN0cmNtcChpbWFnZV90eXBlLCAicGFja2V0IikpIHsKKwkJaWYgKCFyYnVfZGF0YS5wYWNrZXRzaXplKQorCQkJcmJ1X2RhdGEucGFja2V0c2l6ZSA9IGZ3LT5zaXplOworCQllbHNlIGlmIChyYnVfZGF0YS5wYWNrZXRzaXplICE9IGZ3LT5zaXplKSB7CisJCQlwYWNrZXRfZW1wdHlfbGlzdCgpOworCQkJcmJ1X2RhdGEucGFja2V0c2l6ZSA9IGZ3LT5zaXplOworCQl9CisJCXBhY2tldGl6ZV9kYXRhKGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJfSBlbHNlCisJCXByX2RlYnVnKCJpbnZhbGlkIGltYWdlIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJc3Bpbl91bmxvY2soJnJidV9kYXRhLmxvY2spOworCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgRldfQUNUSU9OX05PSE9UUExVRywKKwkJCQkgICAgICJkZWxsX3JidSIsICZyYnVfZGV2aWNlLT5kZXYsCisJCQkJICAgICAmY29udGV4dCwgY2FsbGJhY2tmbl9yYnUpOworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZGVsbF9yYnU6JXMgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkIgorCQkgICAgICAgIiAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRjZHJidV9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmcmJ1X2RhdGEubG9jayk7CisKKwlpbml0X3BhY2tldF9oZWFkKCk7CisJcmJ1X2RldmljZSA9CisJICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImRlbGxfcmJ1IiwgLTEsIE5VTEwsIDApOworCWlmICghcmJ1X2RldmljZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkZWxsX3JidTolczpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlICIKKwkJICAgICAgICJmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosICZyYnVfZGF0YV9hdHRyKTsKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnJidV9kZXZpY2UtPmRldi5rb2JqLCAmcmJ1X2ltYWdlX3R5cGVfYXR0cik7CisKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCBGV19BQ1RJT05fTk9IT1RQTFVHLAorCQkJCSAgICAgImRlbGxfcmJ1IiwgJnJidV9kZXZpY2UtPmRldiwKKwkJCQkgICAgICZjb250ZXh0LCBjYWxsYmFja2ZuX3JidSk7CisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9FUlIgImRlbGxfcmJ1OiVzOnJlcXVlc3RfZmlybXdhcmVfbm93YWl0IgorCQkgICAgICAgIiBmYWlsZWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworCisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBkY2RyYnVfZXhpdCh2b2lkKQoreworCXNwaW5fbG9jaygmcmJ1X2RhdGEubG9jayk7CisJcGFja2V0X2VtcHR5X2xpc3QoKTsKKwlpbWdfdXBkYXRlX2ZyZWUoKTsKKwlzcGluX3VubG9jaygmcmJ1X2RhdGEubG9jayk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocmJ1X2RldmljZSk7Cit9CisKK21vZHVsZV9leGl0KGRjZHJidV9leGl0KTsKK21vZHVsZV9pbml0KGRjZHJidV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggNmU5ZGExMy4uODMzNDQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTE0NCw2ICsxNDQsMjIgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1pODEwLgogCitjb25maWcgSTJDX1BYQQorCXRyaXN0YXRlICJJbnRlbCBQWEEyWFggSTJDIGFkYXB0ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMICYmIEFSQ0hfUFhBCisJaGVscAorCSAgSWYgeW91IGhhdmUgZGV2aWNlcyBpbiB0aGUgUFhBIEkyQyBidXMsIHNheSB5ZXMgdG8gdGhpcyBvcHRpb24uCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcHhhLgorCitjb25maWcgSTJDX1BYQV9TTEFWRQorCWJvb2wgIkludGVsIFBYQTJYWCBJMkMgU2xhdmUgY29tbXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQ19QWEEKKwloZWxwCisJICBTdXBwb3J0IEkyQyBzbGF2ZSBtb2RlIGNvbW11bmljYXRpb25zIG9uIHRoZSBQWEEgSTJDIGJ1cy4gIFRoaXMKKwkgIGlzIG5lY2Vzc2FyeSBmb3Igc3lzdGVtcyB3aGVyZSB0aGUgUFhBIG1heSBiZSBhIHRhcmdldCBvbiB0aGUKKwkgIEkyQyBidXMuCisKIGNvbmZpZyBJMkNfUElJWDQKIAl0cmlzdGF0ZSAiSW50ZWwgUElJWDQiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKaW5kZXggNDJkNmQ4MS4uOTgwYjNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0kyQ19QQ0FfSVNBKQkrPSBpMmMtcGNhLWlzYS5vCiBvYmotJChDT05GSUdfSTJDX1BJSVg0KQkJKz0gaTJjLXBpaXg0Lm8KIG9iai0kKENPTkZJR19JMkNfUFJPU0FWQUdFKQkrPSBpMmMtcHJvc2F2YWdlLm8KK29iai0kKENPTkZJR19JMkNfUFhBKQkJKz0gaTJjLXB4YS5vCiBvYmotJChDT05GSUdfSTJDX1JQWExJVEUpCSs9IGkyYy1ycHgubwogb2JqLSQoQ09ORklHX0kyQ19TM0MyNDEwKQkrPSBpMmMtczNjMjQxMC5vCiBvYmotJChDT05GSUdfSTJDX1NBVkFHRTQpCSs9IGkyYy1zYXZhZ2U0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjUzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC0wLDAgKzEsMTAyMiBAQAorLyoKKyAqICBpMmNfYWRhcF9weGEuYworICoKKyAqICBJMkMgYWRhcHRlciBmb3IgdGhlIFBYQSBJMkMgYnVzIGFjY2Vzcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludHJpbnN5YyBTb2Z0d2FyZSBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgSGlzdG9yeToKKyAqICAgIEFwciAyMDAyOiBJbml0aWFsIHZlcnNpb24gW0NTXQorICogICAgSnVuIDIwMDI6IFByb3Blcmx5IHNlcGVyYXRlZCBhbGdvL2FkYXAgW0ZCXQorICogICAgSmFuIDIwMDM6IEZpeGVkIHNldmVyYWwgYnVncyBjb25jZXJuaW5nIGludGVycnVwdCBoYW5kbGluZyBbS2FpLVV3ZSBCbG9lbV0KKyAqICAgIEphbiAyMDAzOiBhZGRlZCBsaW1pdGVkIHNpZ25hbCBoYW5kbGluZyBbS2FpLVV3ZSBCbG9lbV0KKyAqICAgIFNlcCAyMDA0OiBNYWpvciByZXdvcmsgdG8gZW5zdXJlIGVmZmljaWVudCBidXMgaGFuZGxpbmcgW1JNS10KKyAqICAgIERlYyAyMDA0OiBBZGRlZCBzdXBwb3J0IGZvciBQWEEyN3ggYW5kIHNsYXZlIGRldmljZSBwcm9iaW5nIFtMaWFtIEdpcmR3b29kXQorICogICAgRmViIDIwMDU6IFJld29yayBzbGF2ZSBtb2RlIGhhbmRsaW5nIFtSTUtdCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1weGEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pMmMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCitzdHJ1Y3QgcHhhX2kyYyB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OworCXN0cnVjdCBpMmNfbXNnCQkqbXNnOworCXVuc2lnbmVkIGludAkJbXNnX251bTsKKwl1bnNpZ25lZCBpbnQJCW1zZ19pZHg7CisJdW5zaWduZWQgaW50CQltc2dfcHRyOworCXVuc2lnbmVkIGludAkJc2xhdmVfYWRkcjsKKworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwOworI2lmZGVmIENPTkZJR19JMkNfUFhBX1NMQVZFCisJc3RydWN0IGkyY19zbGF2ZV9jbGllbnQgKnNsYXZlOworI2VuZGlmCisKKwl1bnNpZ25lZCBpbnQJCWlycWxvZ2lkeDsKKwl1MzIJCQlpc3Jsb2dbMzJdOworCXUzMgkJCWljcmxvZ1szMl07Cit9OworCisvKgorICogSTJDIFNsYXZlIG1vZGUgYWRkcmVzcworICovCisjZGVmaW5lIEkyQ19QWEFfU0xBVkVfQUREUiAgICAgIDB4MQorCisjaWZkZWYgREVCVUcKKworc3RydWN0IGJpdHMgeworCXUzMgltYXNrOworCWNvbnN0IGNoYXIgKnNldDsKKwljb25zdCBjaGFyICp1bnNldDsKK307CisjZGVmaW5lIEJJVChtLCBzLCB1KQl7IC5tYXNrID0gbSwgLnNldCA9IHMsIC51bnNldCA9IHUgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlY29kZV9iaXRzKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3Qgc3RydWN0IGJpdHMgKmJpdHMsIGludCBudW0sIHUzMiB2YWwpCit7CisJcHJpbnRrKCIlcyAlMDh4OiAiLCBwcmVmaXgsIHZhbCk7CisJd2hpbGUgKG51bS0tKSB7CisJCWNvbnN0IGNoYXIgKnN0ciA9IHZhbCAmIGJpdHMtPm1hc2sgPyBiaXRzLT5zZXQgOiBiaXRzLT51bnNldDsKKwkJaWYgKHN0cikKKwkJCXByaW50aygiJXMgIiwgc3RyKTsKKwkJYml0cysrOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiaXRzIGlzcl9iaXRzW10gPSB7CisJQklUKElTUl9SV00sCSJSWCIsCQkiVFgiKSwKKwlCSVQoSVNSX0FDS05BSywJIk5BSyIsCQkiQUNLIiksCisJQklUKElTUl9VQiwJIkJzeSIsCQkiUmR5IiksCisJQklUKElTUl9JQkIsCSJCdXNCc3kiLAkiQnVzUmR5IiksCisJQklUKElTUl9TU0QsCSJTbGF2ZVN0b3AiLAlOVUxMKSwKKwlCSVQoSVNSX0FMRCwJIkFMRCIsCQlOVUxMKSwKKwlCSVQoSVNSX0lURSwJIlR4RW1wdHkiLAlOVUxMKSwKKwlCSVQoSVNSX0lSRiwJIlJ4RnVsbCIsCU5VTEwpLAorCUJJVChJU1JfR0NBRCwJIkdlbkNhbGwiLAlOVUxMKSwKKwlCSVQoSVNSX1NBRCwJIlNsYXZlQWRkciIsCU5VTEwpLAorCUJJVChJU1JfQkVELAkiQnVzRXJyIiwJTlVMTCksCit9OworCitzdGF0aWMgdm9pZCBkZWNvZGVfSVNSKHVuc2lnbmVkIGludCB2YWwpCit7CisJZGVjb2RlX2JpdHMoS0VSTl9ERUJVRyAiSVNSIiwgaXNyX2JpdHMsIEFSUkFZX1NJWkUoaXNyX2JpdHMpLCB2YWwpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiaXRzIGljcl9iaXRzW10gPSB7CisJQklUKElDUl9TVEFSVCwgICJTVEFSVCIsCU5VTEwpLAorCUJJVChJQ1JfU1RPUCwgICAiU1RPUCIsCQlOVUxMKSwKKwlCSVQoSUNSX0FDS05BSywgIkFDS05BSyIsCU5VTEwpLAorCUJJVChJQ1JfVEIsICAgICAiVEIiLAkJTlVMTCksCisJQklUKElDUl9NQSwgICAgICJNQSIsCQlOVUxMKSwKKwlCSVQoSUNSX1NDTEUsICAgIlNDTEUiLAkJInNjbGUiKSwKKwlCSVQoSUNSX0lVRSwgICAgIklVRSIsCQkiaXVlIiksCisJQklUKElDUl9HQ0QsICAgICJHQ0QiLAkJTlVMTCksCisJQklUKElDUl9JVEVJRSwgICJJVEVJRSIsCU5VTEwpLAorCUJJVChJQ1JfSVJGSUUsICAiSVJGSUUiLAlOVUxMKSwKKwlCSVQoSUNSX0JFSUUsICAgIkJFSUUiLAkJTlVMTCksCisJQklUKElDUl9TU0RJRSwgICJTU0RJRSIsCU5VTEwpLAorCUJJVChJQ1JfQUxESUUsICAiQUxESUUiLAlOVUxMKSwKKwlCSVQoSUNSX1NBRElFLCAgIlNBRElFIiwJTlVMTCksCisJQklUKElDUl9VUiwgICAgICJVUiIsCQkidXIiKSwKK307CisKK3N0YXRpYyB2b2lkIGRlY29kZV9JQ1IodW5zaWduZWQgaW50IHZhbCkKK3sKKwlkZWNvZGVfYml0cyhLRVJOX0RFQlVHICJJQ1IiLCBpY3JfYml0cywgQVJSQVlfU0laRShpY3JfYml0cyksIHZhbCk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGkyY19kZWJ1ZyA9IERFQlVHOworCitzdGF0aWMgdm9pZCBpMmNfcHhhX3Nob3dfc3RhdGUoc3RydWN0IHB4YV9pMmMgKmkyYywgaW50IGxubywgY29uc3QgY2hhciAqZm5hbWUpCit7CisJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgInN0YXRlOiVzOiVkOiBJU1I9JTA4eCwgSUNSPSUwOHgsIElCTVI9JTAyeFxuIiwgZm5hbWUsIGxubywgSVNSLCBJQ1IsIElCTVIpOworfQorCisjZGVmaW5lIHNob3dfc3RhdGUoaTJjKSBpMmNfcHhhX3Nob3dfc3RhdGUoaTJjLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgaTJjX2RlYnVnCTAKKworI2RlZmluZSBzaG93X3N0YXRlKGkyYykgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWNvZGVfSVNSKHZhbCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWNvZGVfSUNSKHZhbCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgZWVkYmcobHZsLCB4Li4uKSBkbyB7IGlmICgobHZsKSA8IDEpIHsgcHJpbnRrKEtFUk5fREVCVUcgIiIgeCk7IH0gfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShzdHJ1Y3QgcHhhX2kyYyAqaTJjLCBpbnQgcmV0KTsKKworc3RhdGljIHZvaWQgaTJjX3B4YV9zY3JlYW1fYmx1ZV9tdXJkZXIoc3RydWN0IHB4YV9pMmMgKmkyYywgY29uc3QgY2hhciAqd2h5KQoreworCXVuc2lnbmVkIGludCBpOworCXByaW50aygiaTJjOiBlcnJvcjogJXNcbiIsIHdoeSk7CisJcHJpbnRrKCJpMmM6IG1zZ19udW06ICVkIG1zZ19pZHg6ICVkIG1zZ19wdHI6ICVkXG4iLAorCQlpMmMtPm1zZ19udW0sIGkyYy0+bXNnX2lkeCwgaTJjLT5tc2dfcHRyKTsKKwlwcmludGsoImkyYzogSUNSOiAlMDh4IElTUjogJTA4eFxuIgorCSAgICAgICAiaTJjOiBsb2c6ICIsIElDUiwgSVNSKTsKKwlmb3IgKGkgPSAwOyBpIDwgaTJjLT5pcnFsb2dpZHg7IGkrKykKKwkJcHJpbnRrKCJbJTA4eDolMDh4XSAiLCBpMmMtPmlzcmxvZ1tpXSwgaTJjLT5pY3Jsb2dbaV0pOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaTJjX3B4YV9pc19zbGF2ZW1vZGUoc3RydWN0IHB4YV9pMmMgKmkyYykKK3sKKwlyZXR1cm4gIShJQ1IgJiBJQ1JfU0NMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19weGFfYWJvcnQoc3RydWN0IHB4YV9pMmMgKmkyYykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFovNDsKKworCWlmIChpMmNfcHhhX2lzX3NsYXZlbW9kZShpMmMpKSB7CisJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICIlczogY2FsbGVkIGluIHNsYXZlIG1vZGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAoSUJNUiAmIDB4MSkgPT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGljciA9IElDUjsKKworCQlpY3IgJj0gfklDUl9TVEFSVDsKKwkJaWNyIHw9IElDUl9BQ0tOQUsgfCBJQ1JfU1RPUCB8IElDUl9UQjsKKworCQlJQ1IgPSBpY3I7CisKKwkJc2hvd19zdGF0ZShpMmMpOworCisJCW1zbGVlcCgxKTsKKwl9CisKKwlJQ1IgJj0gfihJQ1JfTUEgfCBJQ1JfU1RBUlQgfCBJQ1JfU1RPUCk7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3B4YV93YWl0X2J1c19ub3RfYnVzeShzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCWludCB0aW1lb3V0ID0gREVGX1RJTUVPVVQ7CisKKwl3aGlsZSAodGltZW91dC0tICYmIElTUiAmIChJU1JfSUJCIHwgSVNSX1VCKSkgeworCQlpZiAoKElTUiAmIElTUl9TQUQpICE9IDApCisJCQl0aW1lb3V0ICs9IDQ7CisKKwkJbXNsZWVwKDIpOworCQlzaG93X3N0YXRlKGkyYyk7CisJfQorCisJaWYgKHRpbWVvdXQgPD0gMCkKKwkJc2hvd19zdGF0ZShpMmMpOworCisJcmV0dXJuIHRpbWVvdXQgPD0gMCA/IEkyQ19SRVRSWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3B4YV93YWl0X21hc3RlcihzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWio0OworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmIChpMmNfZGVidWcgPiAxKQorCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiAlbGQ6IElTUj0lMDh4LCBJQ1I9JTA4eCwgSUJNUj0lMDJ4XG4iLAorCQkJCV9fZnVuY19fLCAobG9uZylqaWZmaWVzLCBJU1IsIElDUiwgSUJNUik7CisKKwkJaWYgKElTUiAmIElTUl9TQUQpIHsKKwkJCWlmIChpMmNfZGVidWcgPiAwKQorCQkJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICIlczogU2xhdmUgZGV0ZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogd2FpdCBmb3IgdW5pdCBhbmQgYnVzIGJlaW5nIG5vdCBidXN5LCBhbmQgd2UgYWxzbyBkbyBhCisJCSAqIHF1aWNrIGNoZWNrIG9mIHRoZSBpMmMgbGluZXMgdGhlbXNlbHZlcyB0byBlbnN1cmUgdGhleSd2ZQorCQkgKiBnb25lIGhpZ2guLi4KKwkJICovCisJCWlmICgoSVNSICYgKElTUl9VQiB8IElTUl9JQkIpKSA9PSAwICYmIElCTVIgPT0gMykgeworCQkJaWYgKGkyY19kZWJ1ZyA+IDApCisJCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaTJjX2RlYnVnID4gMCkKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBkaWQgbm90IGZyZWVcbiIsIF9fZnVuY19fKTsKKyBvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3B4YV9zZXRfbWFzdGVyKHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJaWYgKGkyY19kZWJ1ZykKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgInNldHRpbmcgdG8gYnVzIG1hc3RlclxuIik7CisKKwlpZiAoKElTUiAmIChJU1JfVUIgfCBJU1JfSUJCKSkgIT0gMCkgeworCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6IHVuaXQgaXMgYnVzeVxuIiwgX19mdW5jX18pOworCQlpZiAoIWkyY19weGFfd2FpdF9tYXN0ZXIoaTJjKSkgeworCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBlcnJvcjogdW5pdCBidXN5XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gSTJDX1JFVFJZOworCQl9CisJfQorCisJSUNSIHw9IElDUl9TQ0xFOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKK3N0YXRpYyBpbnQgaTJjX3B4YV93YWl0X3NsYXZlKHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaKjE7CisKKwkvKiB3YWl0IGZvciBzdG9wICovCisKKwlzaG93X3N0YXRlKGkyYyk7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKGkyY19kZWJ1ZyA+IDEpCisJCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6ICVsZDogSVNSPSUwOHgsIElDUj0lMDh4LCBJQk1SPSUwMnhcbiIsCisJCQkJX19mdW5jX18sIChsb25nKWppZmZpZXMsIElTUiwgSUNSLCBJQk1SKTsKKworCQlpZiAoKElTUiAmIChJU1JfVUJ8SVNSX0lCQnxJU1JfU0FEKSkgPT0gSVNSX1NBRCB8fAorCQkgICAgKElDUiAmIElDUl9TQ0xFKSA9PSAwKSB7CisJCQlpZiAoaTJjX2RlYnVnID4gMSkKKwkJCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJbXNsZWVwKDEpOworCX0KKworCWlmIChpMmNfZGVidWcgPiAwKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiJXM6IGRpZCBub3QgZnJlZVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCisvKgorICogY2xlYXIgdGhlIGhvbGQgb24gdGhlIGJ1cywgYW5kIHRha2Ugb2YgYW55dGhpbmcgZWxzZQorICogdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkCisgKi8KK3N0YXRpYyB2b2lkIGkyY19weGFfc2V0X3NsYXZlKHN0cnVjdCBweGFfaTJjICppMmMsIGludCBlcnJjb2RlKQoreworCXNob3dfc3RhdGUoaTJjKTsKKworCWlmIChlcnJjb2RlIDwgMCkgeworCQl1ZGVsYXkoMTAwKTsgICAvKiBzaW1wbGUgZGVsYXkgKi8KKwl9IGVsc2UgeworCQkvKiB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBzdG9wIGNvbmRpdGlvbiB0byBlbmQgKi8KKworCQkvKiBpZiB3ZSB3aGVyZSBpbiBzdG9wLCB0aGVuIGNsZWFyLi4uICovCisJCWlmIChJQ1IgJiBJQ1JfU1RPUCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlJQ1IgJj0gfklDUl9TVE9QOworCQl9CisKKwkJaWYgKCFpMmNfcHhhX3dhaXRfc2xhdmUoaTJjKSkgeworCQkJZGV2X2VycigmaTJjLT5hZGFwLmRldiwgIiVzOiB3YWl0IHRpbWVkb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCUlDUiAmPSB+KElDUl9TVE9QfElDUl9BQ0tOQUt8SUNSX01BKTsKKwlJQ1IgJj0gfklDUl9TQ0xFOworCisJaWYgKGkyY19kZWJ1ZykgeworCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSUNSIG5vdyAlMDh4LCBJU1IgJTA4eFxuIiwgSUNSLCBJU1IpOworCQlkZWNvZGVfSUNSKElDUik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgaTJjX3B4YV9zZXRfc2xhdmUoaTJjLCBlcnIpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpMmNfcHhhX3Jlc2V0KHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJcHJfZGVidWcoIlJlc2V0dGluZyBJMkMgQ29udHJvbGxlciBVbml0XG4iKTsKKworCS8qIGFib3J0IGFueSB0cmFuc2ZlciBjdXJyZW50bHkgdW5kZXIgd2F5ICovCisJaTJjX3B4YV9hYm9ydChpMmMpOworCisJLyogcmVzZXQgYWNjb3JkaW5nIHRvIDkuOCAqLworCUlDUiA9IElDUl9VUjsKKwlJU1IgPSBJMkNfSVNSX0lOSVQ7CisJSUNSICY9IH5JQ1JfVVI7CisKKwlJU0FSID0gaTJjLT5zbGF2ZV9hZGRyOworCisJLyogc2V0IGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzICovCisJSUNSID0gSTJDX0lDUl9JTklUOworCisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKKwlkZXZfaW5mbygmaTJjLT5hZGFwLmRldiwgIkVuYWJsaW5nIHNsYXZlIG1vZGVcbiIpOworCUlDUiB8PSBJQ1JfU0FESUUgfCBJQ1JfQUxESUUgfCBJQ1JfU1NESUU7CisjZW5kaWYKKworCWkyY19weGFfc2V0X3NsYXZlKGkyYywgMCk7CisKKwkvKiBlbmFibGUgdW5pdCAqLworCUlDUiB8PSBJQ1JfSVVFOworCXVkZWxheSgxMDApOworfQorCisKKyNpZmRlZiBDT05GSUdfSTJDX1BYQV9TTEFWRQorLyoKKyAqIEkyQyBFRVBST00gZW11bGF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGkyY19lZXByb21fZW11IGVlcHJvbSA9IHsKKwkuc2l6ZSA9IEkyQ19FRVBST01fRU1VX1NJWkUsCisJLndhdGNoID0gTElTVF9IRUFEX0lOSVQoZWVwcm9tLndhdGNoKSwKK307CisKK3N0cnVjdCBpMmNfZWVwcm9tX2VtdSAqaTJjX3B4YV9nZXRfZWVwcm9tKHZvaWQpCit7CisJcmV0dXJuICZlZXByb207Cit9CisKK2ludCBpMmNfZWVwcm9tX2VtdV9hZGR3YXRjaGVyKHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11LCB2b2lkICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgICAgc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoZXIgKndhdGNoZXIpCit7CisJc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoICp3YXRjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFkZHIgKyBzaXplID4gZW11LT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdhdGNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhdGNoKSB7CisJCXdhdGNoLT5zdGFydCA9IGFkZHI7CisJCXdhdGNoLT5lbmQgPSBhZGRyICsgc2l6ZSAtIDE7CisJCXdhdGNoLT5vcHMgPSB3YXRjaGVyOworCQl3YXRjaC0+ZGF0YSA9IGRhdGE7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsaXN0X2FkZCgmd2F0Y2gtPm5vZGUsICZlbXUtPndhdGNoKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCXJldHVybiB3YXRjaCA/IDAgOiAtRU5PTUVNOworfQorCit2b2lkIGkyY19lZXByb21fZW11X2RlbHdhdGNoZXIoc3RydWN0IGkyY19lZXByb21fZW11ICplbXUsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoZXIgKndhdGNoZXIpCit7CisJc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoICp3YXRjaCwgKm47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgbiwgJmVtdS0+d2F0Y2gsIG5vZGUpIHsKKwkJaWYgKHdhdGNoLT5vcHMgPT0gd2F0Y2hlciAmJiB3YXRjaC0+ZGF0YSA9PSBkYXRhKSB7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlsaXN0X2RlbCgmd2F0Y2gtPm5vZGUpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJa2ZyZWUod2F0Y2gpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpMmNfZWVwcm9tX2VtdV9ldmVudCh2b2lkICpwdHIsIGkyY19zbGF2ZV9ldmVudF90IGV2ZW50KQoreworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11ID0gcHRyOworCisJZWVkYmcoMywgImkyY19lZXByb21fZW11X2V2ZW50OiAlZFxuIiwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSTJDX1NMQVZFX0VWRU5UX1NUQVJUX1dSSVRFOgorCQllbXUtPnNlZW5fc3RhcnQgPSAxOworCQllZWRiZygyLCAiaTJjX2VlcHJvbTogd3JpdGUgaW5pdGlhdGVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyQ19TTEFWRV9FVkVOVF9TVEFSVF9SRUFEOgorCQllbXUtPnNlZW5fc3RhcnQgPSAwOworCQllZWRiZygyLCAiaTJjX2VlcHJvbTogcmVhZCBpbml0aWF0ZWRcbiIpOworCQlicmVhazsKKworCWNhc2UgSTJDX1NMQVZFX0VWRU5UX1NUT1A6CisJCWVtdS0+c2Vlbl9zdGFydCA9IDA7CisJCWVlZGJnKDIsICJpMmNfZWVwcm9tOiByZWNlaXZlZCBzdG9wXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllZWRiZygwLCAiaTJjX2VlcHJvbTogdW5oYW5kbGVkIGV2ZW50XG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGkyY19lZXByb21fZW11X3JlYWQodm9pZCAqcHRyKQoreworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11ID0gcHRyOworCWludCByZXQ7CisKKwlyZXQgPSBlbXUtPmJ5dGVzW2VtdS0+cHRyXTsKKwllbXUtPnB0ciA9IChlbXUtPnB0ciArIDEpICUgZW11LT5zaXplOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaTJjX2VlcHJvbV9lbXVfd3JpdGUodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11ID0gcHRyOworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCAqd2F0Y2g7CisKKwlpZiAoZW11LT5zZWVuX3N0YXJ0ICE9IDApIHsKKwkJZWVkYmcoMiwgImkyY19lZXByb21fZW11X3dyaXRlOiBzZXR0aW5nIHB0ciAlMDJ4XG4iLCB2YWwpOworCQllbXUtPnB0ciA9IHZhbDsKKwkJZW11LT5zZWVuX3N0YXJ0ID0gMDsKKwkJcmV0dXJuOworCX0KKworCWVtdS0+Ynl0ZXNbZW11LT5wdHJdID0gdmFsOworCisJZWVkYmcoMSwgImkyY19lZXByb21fZW11X3dyaXRlOiBwdHI9MHglMDJ4LCB2YWw9MHglMDJ4XG4iLAorCSAgICAgIGVtdS0+cHRyLCB2YWwpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YXRjaCwgJmVtdS0+d2F0Y2gsIG5vZGUpIHsKKwkJaWYgKCF3YXRjaC0+b3BzIHx8ICF3YXRjaC0+b3BzLT53cml0ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAod2F0Y2gtPnN0YXJ0IDw9IGVtdS0+cHRyICYmIHdhdGNoLT5lbmQgPj0gZW11LT5wdHIpCisJCQl3YXRjaC0+b3BzLT53cml0ZSh3YXRjaC0+ZGF0YSwgZW11LT5wdHIsIHZhbCk7CisJfQorCisJZW11LT5wdHIgPSAoZW11LT5wdHIgKyAxKSAlIGVtdS0+c2l6ZTsKK30KKworc3RydWN0IGkyY19zbGF2ZV9jbGllbnQgZWVwcm9tX2NsaWVudCA9IHsKKwkuZGF0YQk9ICZlZXByb20sCisJLmV2ZW50CT0gaTJjX2VlcHJvbV9lbXVfZXZlbnQsCisJLnJlYWQJPSBpMmNfZWVwcm9tX2VtdV9yZWFkLAorCS53cml0ZQk9IGkyY19lZXByb21fZW11X3dyaXRlCit9OworCisvKgorICogUFhBIEkyQyBTbGF2ZSBtb2RlCisgKi8KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV90eGVtcHR5KHN0cnVjdCBweGFfaTJjICppMmMsIHUzMiBpc3IpCit7CisJaWYgKGlzciAmIElTUl9CRUQpIHsKKwkJLyogd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gKi8KKwl9IGVsc2UgeworCQlpbnQgcmV0ID0gaTJjLT5zbGF2ZS0+cmVhZChpMmMtPnNsYXZlLT5kYXRhKTsKKworCQlJREJSID0gcmV0OworCQlJQ1IgfD0gSUNSX1RCOyAgIC8qIGFsbG93IG5leHQgYnl0ZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9yeGZ1bGwoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZSA9IElEQlI7CisKKwlpZiAoaTJjLT5zbGF2ZSAhPSBOVUxMKQorCQlpMmMtPnNsYXZlLT53cml0ZShpMmMtPnNsYXZlLT5kYXRhLCBieXRlKTsKKworCUlDUiB8PSBJQ1JfVEI7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19weGFfc2xhdmVfc3RhcnQoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwlpbnQgdGltZW91dDsKKworCWlmIChpMmNfZGVidWcgPiAwKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiU0FELCBtb2RlIGlzIHNsYXZlLSVjeFxuIiwKKwkJICAgICAgIChpc3IgJiBJU1JfUldNKSA/ICdyJyA6ICd0Jyk7CisKKwlpZiAoaTJjLT5zbGF2ZSAhPSBOVUxMKQorCQlpMmMtPnNsYXZlLT5ldmVudChpMmMtPnNsYXZlLT5kYXRhLAorCQkJCSAoaXNyICYgSVNSX1JXTSkgPyBJMkNfU0xBVkVfRVZFTlRfU1RBUlRfUkVBRCA6IEkyQ19TTEFWRV9FVkVOVF9TVEFSVF9XUklURSk7CisKKwkvKgorCSAqIHNsYXZlIGNvdWxkIGludGVycnVwdCBpbiB0aGUgbWlkZGxlIG9mIHVzIGdlbmVyYXRpbmcgYQorCSAqIHN0YXJ0IGNvbmRpdGlvbi4uLiBpZiB0aGlzIGhhcHBlbnMsIHdlJ2QgYmV0dGVyIGJhY2sgb2ZmCisJICogYW5kIHN0b3AgaG9sZGluZyB0aGUgcG9vciB0aGluZyB1cAorCSAqLworCUlDUiAmPSB+KElDUl9TVEFSVHxJQ1JfU1RPUCk7CisJSUNSIHw9IElDUl9UQjsKKworCXRpbWVvdXQgPSAweDEwMDAwOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKChJQk1SICYgMikgPT0gMikKKwkJCWJyZWFrOworCisJCXRpbWVvdXQtLTsKKworCQlpZiAodGltZW91dCA8PSAwKSB7CisJCQlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBTQ0wgaGlnaFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCUlDUiAmPSB+SUNSX1NDTEU7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19weGFfc2xhdmVfc3RvcChzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCWlmIChpMmNfZGVidWcgPiAyKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSVNSOiBTU0QgKFNsYXZlIFN0b3ApXG4iKTsKKworCWlmIChpMmMtPnNsYXZlICE9IE5VTEwpCisJCWkyYy0+c2xhdmUtPmV2ZW50KGkyYy0+c2xhdmUtPmRhdGEsIEkyQ19TTEFWRV9FVkVOVF9TVE9QKTsKKworCWlmIChpMmNfZGVidWcgPiAyKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSVNSOiBTU0QgKFNsYXZlIFN0b3ApIGFja2VkXG4iKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIG1hc3Rlci1tb2RlIG1lc3NhZ2Ugd2FpdGluZywKKwkgKiBraWNrIGl0IG9mZiBub3cgdGhhdCB0aGUgc2xhdmUgaGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlpZiAoaTJjLT5tc2cpCisJCWkyY19weGFfbWFzdGVyX2NvbXBsZXRlKGkyYywgSTJDX1JFVFJZKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBpMmNfcHhhX3NsYXZlX3R4ZW1wdHkoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwlpZiAoaXNyICYgSVNSX0JFRCkgeworCQkvKiB3aGF0IHNob3VsZCB3ZSBkbyBoZXJlPyAqLworCX0gZWxzZSB7CisJCUlEQlIgPSAwOworCQlJQ1IgfD0gSUNSX1RCOworCX0KK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9yeGZ1bGwoc3RydWN0IHB4YV9pMmMgKmkyYywgdTMyIGlzcikKK3sKKwlJQ1IgfD0gSUNSX1RCIHwgSUNSX0FDS05BSzsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9zdGFydChzdHJ1Y3QgcHhhX2kyYyAqaTJjLCB1MzIgaXNyKQoreworCWludCB0aW1lb3V0OworCisJLyoKKwkgKiBzbGF2ZSBjb3VsZCBpbnRlcnJ1cHQgaW4gdGhlIG1pZGRsZSBvZiB1cyBnZW5lcmF0aW5nIGEKKwkgKiBzdGFydCBjb25kaXRpb24uLi4gaWYgdGhpcyBoYXBwZW5zLCB3ZSdkIGJldHRlciBiYWNrIG9mZgorCSAqIGFuZCBzdG9wIGhvbGRpbmcgdGhlIHBvb3IgdGhpbmcgdXAKKwkgKi8KKwlJQ1IgJj0gfihJQ1JfU1RBUlR8SUNSX1NUT1ApOworCUlDUiB8PSBJQ1JfVEIgfCBJQ1JfQUNLTkFLOworCisJdGltZW91dCA9IDB4MTAwMDA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKElCTVIgJiAyKSA9PSAyKQorCQkJYnJlYWs7CisKKwkJdGltZW91dC0tOworCisJCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIFNDTCBoaWdoXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJSUNSICY9IH5JQ1JfU0NMRTsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9zbGF2ZV9zdG9wKHN0cnVjdCBweGFfaTJjICppMmMpCit7CisJaWYgKGkyYy0+bXNnKQorCQlpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShpMmMsIEkyQ19SRVRSWSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFBYQSBJMkMgTWFzdGVyIG1vZGUKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpMmNfcHhhX2FkZHJfYnl0ZShzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXVuc2lnbmVkIGludCBhZGRyID0gKG1zZy0+YWRkciAmIDB4N2YpIDw8IDE7CisKKwlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQlhZGRyIHw9IDE7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY19weGFfc3RhcnRfbWVzc2FnZShzdHJ1Y3QgcHhhX2kyYyAqaTJjKQoreworCXUzMiBpY3I7CisKKwkvKgorCSAqIFN0ZXAgMTogdGFyZ2V0IHNsYXZlIGFkZHJlc3MgaW50byBJREJSCisJICovCisJSURCUiA9IGkyY19weGFfYWRkcl9ieXRlKGkyYy0+bXNnKTsKKworCS8qCisJICogU3RlcCAyOiBpbml0aWF0ZSB0aGUgd3JpdGUuCisJICovCisJaWNyID0gSUNSICYgfihJQ1JfU1RPUCB8IElDUl9BTERJRSk7CisJSUNSID0gaWNyIHwgSUNSX1NUQVJUIHwgSUNSX1RCOworfQorCisvKgorICogV2UgYXJlIHByb3RlY3RlZCBieSB0aGUgYWRhcHRlciBidXMgc2VtYXBob3JlLgorICovCitzdGF0aWMgaW50IGkyY19weGFfZG9feGZlcihzdHJ1Y3QgcHhhX2kyYyAqaTJjLCBzdHJ1Y3QgaTJjX21zZyAqbXNnLCBpbnQgbnVtKQoreworCWxvbmcgdGltZW91dDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgYnVzIHRvIGJlY29tZSBmcmVlLgorCSAqLworCXJldCA9IGkyY19weGFfd2FpdF9idXNfbm90X2J1c3koaTJjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJpMmNfcHhhOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGJ1cyBmcmVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTZXQgbWFzdGVyIG1vZGUuCisJICovCisJcmV0ID0gaTJjX3B4YV9zZXRfbWFzdGVyKGkyYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAiaTJjX3B4YV9zZXRfbWFzdGVyOiBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaTJjLT5sb2NrKTsKKworCWkyYy0+bXNnID0gbXNnOworCWkyYy0+bXNnX251bSA9IG51bTsKKwlpMmMtPm1zZ19pZHggPSAwOworCWkyYy0+bXNnX3B0ciA9IDA7CisJaTJjLT5pcnFsb2dpZHggPSAwOworCisJaTJjX3B4YV9zdGFydF9tZXNzYWdlKGkyYyk7CisKKwlzcGluX3VubG9ja19pcnEoJmkyYy0+bG9jayk7CisKKwkvKgorCSAqIFRoZSByZXN0IG9mIHRoZSBwcm9jZXNzaW5nIG9jY3VycyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisJICovCisJdGltZW91dCA9IHdhaXRfZXZlbnRfdGltZW91dChpMmMtPndhaXQsIGkyYy0+bXNnX251bSA9PSAwLCBIWiAqIDUpOworCisJLyoKKwkgKiBXZSBwbGFjZSB0aGUgcmV0dXJuIGNvZGUgaW4gaTJjLT5tc2dfaWR4LgorCSAqLworCXJldCA9IGkyYy0+bXNnX2lkeDsKKworCWlmICh0aW1lb3V0ID09IDApCisJCWkyY19weGFfc2NyZWFtX2JsdWVfbXVyZGVyKGkyYywgInRpbWVvdXQiKTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaTJjX3B4YV9tYXN0ZXJfY29tcGxldGUgLSBjb21wbGV0ZSB0aGUgbWVzc2FnZSBhbmQgd2FrZSB1cC4KKyAqLworc3RhdGljIHZvaWQgaTJjX3B4YV9tYXN0ZXJfY29tcGxldGUoc3RydWN0IHB4YV9pMmMgKmkyYywgaW50IHJldCkKK3sKKwlpMmMtPm1zZ19wdHIgPSAwOworCWkyYy0+bXNnID0gTlVMTDsKKwlpMmMtPm1zZ19pZHggKys7CisJaTJjLT5tc2dfbnVtID0gMDsKKwlpZiAocmV0KQorCQlpMmMtPm1zZ19pZHggPSByZXQ7CisJd2FrZV91cCgmaTJjLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9pcnFfdHhlbXB0eShzdHJ1Y3QgcHhhX2kyYyAqaTJjLCB1MzIgaXNyKQoreworCXUzMiBpY3IgPSBJQ1IgJiB+KElDUl9TVEFSVHxJQ1JfU1RPUHxJQ1JfQUNLTkFLfElDUl9UQik7CisKKyBhZ2FpbjoKKwkvKgorCSAqIElmIElTUl9BTEQgaXMgc2V0LCB3ZSBsb3N0IGFyYml0cmF0aW9uLgorCSAqLworCWlmIChpc3IgJiBJU1JfQUxEKSB7CisJCS8qCisJCSAqIERvIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZT8gIFRoZSBQWEEgZG9jcworCQkgKiBhcmUgdmFndWUgYWJvdXQgd2hhdCBoYXBwZW5zLgorCQkgKi8KKwkJaTJjX3B4YV9zY3JlYW1fYmx1ZV9tdXJkZXIoaTJjLCAiQUxEIHNldCIpOworCisJCS8qCisJCSAqIFdlIGlnbm9yZSB0aGlzIGVycm9yLiAgV2Ugc2VlbSB0byBzZWUgc3B1cmlvdXMgQUxEcworCQkgKiBmb3Igc2VlbWluZ2x5IG5vIHJlYXNvbi4gIElmIHdlIGhhbmRsZSB0aGVtIGFzIEkgdGhpbmsKKwkJICogdGhleSBzaG91bGQsIHdlIGVuZCB1cCBjYXVzaW5nIGFuIEkyQyBlcnJvciwgd2hpY2gKKwkJICogaXMgcGFpbmZ1bCBmb3Igc29tZSBzeXN0ZW1zLgorCQkgKi8KKwkJcmV0dXJuOyAvKiBpZ25vcmUgKi8KKwl9CisKKwlpZiAoaXNyICYgSVNSX0JFRCkgeworCQlpbnQgcmV0ID0gQlVTX0VSUk9SOworCisJCS8qCisJCSAqIEkyQyBidXMgZXJyb3IgLSBlaXRoZXIgdGhlIGRldmljZSBOQUsnZCB1cywgb3IKKwkJICogc29tZXRoaW5nIG1vcmUgc2VyaW91cyBoYXBwZW5lZC4gIElmIHdlIHdlcmUgTkFLJ2QKKwkJICogb24gdGhlIGluaXRpYWwgYWRkcmVzcyBwaGFzZSwgd2UgY2FuIHJldHJ5LgorCQkgKi8KKwkJaWYgKGlzciAmIElTUl9BQ0tOQUspIHsKKwkJCWlmIChpMmMtPm1zZ19wdHIgPT0gMCAmJiBpMmMtPm1zZ19pZHggPT0gMCkKKwkJCQlyZXQgPSBJMkNfUkVUUlk7CisJCQllbHNlCisJCQkJcmV0ID0gWEZFUl9OQUtFRDsKKwkJfQorCQlpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShpMmMsIHJldCk7CisJfSBlbHNlIGlmIChpc3IgJiBJU1JfUldNKSB7CisJCS8qCisJCSAqIFJlYWQgbW9kZS4gIFdlIGhhdmUganVzdCBzZW50IHRoZSBhZGRyZXNzIGJ5dGUsIGFuZAorCQkgKiBub3cgd2UgbXVzdCBpbml0aWF0ZSB0aGUgdHJhbnNmZXIuCisJCSAqLworCQlpZiAoaTJjLT5tc2dfcHRyID09IGkyYy0+bXNnLT5sZW4gLSAxICYmCisJCSAgICBpMmMtPm1zZ19pZHggPT0gaTJjLT5tc2dfbnVtIC0gMSkKKwkJCWljciB8PSBJQ1JfU1RPUCB8IElDUl9BQ0tOQUs7CisKKwkJaWNyIHw9IElDUl9BTERJRSB8IElDUl9UQjsKKwl9IGVsc2UgaWYgKGkyYy0+bXNnX3B0ciA8IGkyYy0+bXNnLT5sZW4pIHsKKwkJLyoKKwkJICogV3JpdGUgbW9kZS4gIFdyaXRlIHRoZSBuZXh0IGRhdGEgYnl0ZS4KKwkJICovCisJCUlEQlIgPSBpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX3B0cisrXTsKKworCQlpY3IgfD0gSUNSX0FMRElFIHwgSUNSX1RCOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbGFzdCBtZXNzYWdlLCBzZW5kCisJCSAqIGEgU1RPUC4KKwkJICovCisJCWlmIChpMmMtPm1zZ19wdHIgPT0gaTJjLT5tc2ctPmxlbiAmJgorCQkgICAgaTJjLT5tc2dfaWR4ID09IGkyYy0+bXNnX251bSAtIDEpCisJCQlpY3IgfD0gSUNSX1NUT1A7CisJfSBlbHNlIGlmIChpMmMtPm1zZ19pZHggPCBpMmMtPm1zZ19udW0gLSAxKSB7CisJCS8qCisJCSAqIE5leHQgc2VnbWVudCBvZiB0aGUgbWVzc2FnZS4KKwkJICovCisJCWkyYy0+bXNnX3B0ciA9IDA7CisJCWkyYy0+bXNnX2lkeCArKzsKKwkJaTJjLT5tc2crKzsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgYSByZXBlYXRlZCBzdGFydCBhbmQgYWRkcmVzcywKKwkJICogZ28gYmFjayBhbmQgdHJ5IHRvIHNlbmQgdGhlIG5leHQgYnl0ZS4gIE5vdGUgdGhhdAorCQkgKiB3ZSBkbyBub3Qgc3VwcG9ydCBzd2l0Y2hpbmcgdGhlIFIvVyBkaXJlY3Rpb24gaGVyZS4KKwkJICovCisJCWlmIChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKQorCQkJZ290byBhZ2FpbjsKKworCQkvKgorCQkgKiBXcml0ZSB0aGUgbmV4dCBhZGRyZXNzLgorCQkgKi8KKwkJSURCUiA9IGkyY19weGFfYWRkcl9ieXRlKGkyYy0+bXNnKTsKKworCQkvKgorCQkgKiBBbmQgdHJpZ2dlciBhIHJlcGVhdGVkIHN0YXJ0LCBhbmQgc2VuZCB0aGUgYnl0ZS4KKwkJICovCisJCWljciAmPSB+SUNSX0FMRElFOworCQlpY3IgfD0gSUNSX1NUQVJUIHwgSUNSX1RCOworCX0gZWxzZSB7CisJCWlmIChpMmMtPm1zZy0+bGVuID09IDApIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgcHJvYmVzIGhhdmUgYSBtZXNzYWdlIGxlbmd0aCBvZiB6ZXJvCisJCQkgKiBhbmQgbmVlZCB0aGUgYnVzIHRvIGJlIHJlc2V0IGJlZm9yZSBpdCBjYW4KKwkJCSAqIGJlIHVzZWQgYWdhaW4uCisJCQkgKi8KKwkJCWkyY19weGFfcmVzZXQoaTJjKTsKKwkJfQorCQlpMmNfcHhhX21hc3Rlcl9jb21wbGV0ZShpMmMsIDApOworCX0KKworCWkyYy0+aWNybG9nW2kyYy0+aXJxbG9naWR4LTFdID0gaWNyOworCisJSUNSID0gaWNyOworCXNob3dfc3RhdGUoaTJjKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3B4YV9pcnFfcnhmdWxsKHN0cnVjdCBweGFfaTJjICppMmMsIHUzMiBpc3IpCit7CisJdTMyIGljciA9IElDUiAmIH4oSUNSX1NUQVJUfElDUl9TVE9QfElDUl9BQ0tOQUt8SUNSX1RCKTsKKworCS8qCisJICogUmVhZCB0aGUgYnl0ZS4KKwkgKi8KKwlpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX3B0cisrXSA9IElEQlI7CisKKwlpZiAoaTJjLT5tc2dfcHRyIDwgaTJjLT5tc2ctPmxlbikgeworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGxhc3QKKwkJICogbWVzc2FnZSwgc2VuZCBhIFNUT1AuCisJCSAqLworCQlpZiAoaTJjLT5tc2dfcHRyID09IGkyYy0+bXNnLT5sZW4gLSAxKQorCQkJaWNyIHw9IElDUl9TVE9QIHwgSUNSX0FDS05BSzsKKworCQlpY3IgfD0gSUNSX0FMRElFIHwgSUNSX1RCOworCX0gZWxzZSB7CisJCWkyY19weGFfbWFzdGVyX2NvbXBsZXRlKGkyYywgMCk7CisJfQorCisJaTJjLT5pY3Jsb2dbaTJjLT5pcnFsb2dpZHgtMV0gPSBpY3I7CisKKwlJQ1IgPSBpY3I7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpMmNfcHhhX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBweGFfaTJjICppMmMgPSBkZXZfaWQ7CisJdTMyIGlzciA9IElTUjsKKworCWlmIChpMmNfZGVidWcgPiAyICYmIDApIHsKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBJU1I9JTA4eCwgSUNSPSUwOHgsIElCTVI9JTAyeFxuIiwKKwkJCV9fZnVuY19fLCBpc3IsIElDUiwgSUJNUik7CisJCWRlY29kZV9JU1IoaXNyKTsKKwl9CisKKwlpZiAoaTJjLT5pcnFsb2dpZHggPCBzaXplb2YoaTJjLT5pc3Jsb2cpL3NpemVvZih1MzIpKQorCQlpMmMtPmlzcmxvZ1tpMmMtPmlycWxvZ2lkeCsrXSA9IGlzcjsKKworCXNob3dfc3RhdGUoaTJjKTsKKworCS8qCisJICogQWx3YXlzIGNsZWFyIGFsbCBwZW5kaW5nIElSUXMuCisJICovCisJSVNSID0gaXNyICYgKElTUl9TU0R8SVNSX0FMRHxJU1JfSVRFfElTUl9JUkZ8SVNSX1NBRHxJU1JfQkVEKTsKKworCWlmIChpc3IgJiBJU1JfU0FEKQorCQlpMmNfcHhhX3NsYXZlX3N0YXJ0KGkyYywgaXNyKTsKKwlpZiAoaXNyICYgSVNSX1NTRCkKKwkJaTJjX3B4YV9zbGF2ZV9zdG9wKGkyYyk7CisKKwlpZiAoaTJjX3B4YV9pc19zbGF2ZW1vZGUoaTJjKSkgeworCQlpZiAoaXNyICYgSVNSX0lURSkKKwkJCWkyY19weGFfc2xhdmVfdHhlbXB0eShpMmMsIGlzcik7CisJCWlmIChpc3IgJiBJU1JfSVJGKQorCQkJaTJjX3B4YV9zbGF2ZV9yeGZ1bGwoaTJjLCBpc3IpOworCX0gZWxzZSBpZiAoaTJjLT5tc2cpIHsKKwkJaWYgKGlzciAmIElTUl9JVEUpCisJCQlpMmNfcHhhX2lycV90eGVtcHR5KGkyYywgaXNyKTsKKwkJaWYgKGlzciAmIElTUl9JUkYpCisJCQlpMmNfcHhhX2lycV9yeGZ1bGwoaTJjLCBpc3IpOworCX0gZWxzZSB7CisJCWkyY19weGFfc2NyZWFtX2JsdWVfbXVyZGVyKGkyYywgInNwdXJpb3VzIGlycSIpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaW50IGkyY19weGFfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgcHhhX2kyYyAqaTJjID0gYWRhcC0+YWxnb19kYXRhOworCWludCByZXQsIGk7CisKKwlmb3IgKGkgPSBhZGFwLT5yZXRyaWVzOyBpID49IDA7IGktLSkgeworCQlyZXQgPSBpMmNfcHhhX2RvX3hmZXIoaTJjLCBtc2dzLCBudW0pOworCQlpZiAocmV0ICE9IEkyQ19SRVRSWSkKKwkJCWdvdG8gb3V0OworCisJCWlmIChpMmNfZGVidWcpCisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJSZXRyeWluZyB0cmFuc21pc3Npb25cbiIpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJaTJjX3B4YV9zY3JlYW1fYmx1ZV9tdXJkZXIoaTJjLCAiZXhoYXVzdGVkIHJldHJpZXMiKTsKKwlyZXQgPSAtRVJFTU9URUlPOworIG91dDoKKwlpMmNfcHhhX3NldF9zbGF2ZShpMmMsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19weGFfYWxnb3JpdGhtID0geworCS5uYW1lCQk9ICJQWEEtSTJDLUFsZ29yaXRobSIsCisJLmlkCQk9IEkyQ19BTEdPX1BYQSwKKwkubWFzdGVyX3hmZXIJPSBpMmNfcHhhX3hmZXIsCit9OworCitzdGF0aWMgc3RydWN0IHB4YV9pMmMgaTJjX3B4YSA9IHsKKwkubG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkud2FpdAk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKGkyY19weGEud2FpdCksCisJLmFkYXAJPSB7CisJCS5uYW1lCQk9ICJweGEyeHgtaTJjIiwKKwkJLmlkCQk9IEkyQ19BTEdPX1BYQSwKKwkJLmFsZ28JCT0gJmkyY19weGFfYWxnb3JpdGhtLAorCQkucmV0cmllcwk9IDUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaTJjX3B4YV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9pMmMgKmkyYyA9ICZpMmNfcHhhOworCXN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworI2lmZGVmIENPTkZJR19QWEEyN3gKKwlweGFfZ3Bpb19tb2RlKEdQSU8xMTdfSTJDU0NMX01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8xMThfSTJDU0RBX01EKTsKKwl1ZGVsYXkoMTAwKTsKKyNlbmRpZgorCisJaTJjLT5zbGF2ZV9hZGRyID0gSTJDX1BYQV9TTEFWRV9BRERSOworCisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKKwlpMmMtPnNsYXZlID0gJmVlcHJvbV9jbGllbnQ7CisJaWYgKHBsYXQpIHsKKwkJaTJjLT5zbGF2ZV9hZGRyID0gcGxhdC0+c2xhdmVfYWRkcjsKKwkJaWYgKHBsYXQtPnNsYXZlKQorCQkJaTJjLT5zbGF2ZSA9IHBsYXQtPnNsYXZlOworCX0KKyNlbmRpZgorCisJcHhhX3NldF9ja2VuKENLRU4xNF9JMkMsIDEpOworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9JMkMsIGkyY19weGFfaGFuZGxlciwgU0FfSU5URVJSVVBULAorCQkJICAicHhhMnh4LWkyYyIsIGkyYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpMmNfcHhhX3Jlc2V0KGkyYyk7CisKKwlpMmMtPmFkYXAuYWxnb19kYXRhID0gaTJjOworCWkyYy0+YWRhcC5kZXYucGFyZW50ID0gZGV2OworCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkkyQzogRmFpbGVkIHRvIGFkZCBidXNcbiIpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgaTJjKTsKKworI2lmZGVmIENPTkZJR19JMkNfUFhBX1NMQVZFCisJcHJpbnRrKEtFUk5fSU5GTyAiSTJDOiAlczogUFhBIEkyQyBhZGFwdGVyLCBzbGF2ZSBhZGRyZXNzICVkXG4iLAorCSAgICAgICBpMmMtPmFkYXAuZGV2LmJ1c19pZCwgaTJjLT5zbGF2ZV9hZGRyKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAiSTJDOiAlczogUFhBIEkyQyBhZGFwdGVyXG4iLAorCSAgICAgICBpMmMtPmFkYXAuZGV2LmJ1c19pZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworIGVycl9pcnE6CisJZnJlZV9pcnEoSVJRX0kyQywgaTJjKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpMmNfcHhhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9pMmMgKmkyYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CisJZnJlZV9pcnEoSVJRX0kyQywgaTJjKTsKKwlweGFfc2V0X2NrZW4oQ0tFTjE0X0kyQywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGkyY19weGFfZHJpdmVyID0geworCS5uYW1lCQk9ICJweGEyeHgtaTJjIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gaTJjX3B4YV9wcm9iZSwKKwkucmVtb3ZlCQk9IGkyY19weGFfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTJjX2FkYXBfcHhhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZpMmNfcHhhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19hZGFwX3B4YV9leGl0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl91bnJlZ2lzdGVyKCZpMmNfcHhhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGkyY19hZGFwX3B4YV9pbml0KTsKK21vZHVsZV9leGl0KGkyY19hZGFwX3B4YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKaW5kZXggMzU0YTI2Mi4uOGVlNTZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKQEAgLTE0ODksNyArMTQ4OSw3IEBACiAJaWYgKHRoZV90cmFuc2NlaXZlcikKIAkJcmV0dXJuIDA7CiAKLQlpc3AgPSBrY2FsbG9jKDEsIHNpemVvZiAqaXNwLCBHRlBfS0VSTkVMKTsKKwlpc3AgPSBremFsbG9jKHNpemVvZiAqaXNwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlzcCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IGM5ZDNhMDAuLjIzNGY1ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtNzU0LDcgKzc1NCw3IEBACiAKIAlpZGVkaXNrX3ByZXBhcmVfZmx1c2gocSwgcnEpOwogCi0JcmV0ID0gYmxrX2V4ZWN1dGVfcnEocSwgZGlzaywgcnEpOworCXJldCA9IGJsa19leGVjdXRlX3JxKHEsIGRpc2ssIHJxLCAwKTsKIAogCS8qCiAJICogaWYgd2UgZmFpbGVkIGFuZCBjYWxsZXIgd2FudHMgZXJyb3Igb2Zmc2V0LCBnZXQgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pby5jIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKaW5kZXggZjE3NGFlZS4uOWU5Y2YxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKQEAgLTU2MCw3ICs1NjAsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoX19pZGVfYWJvcnQpOwogCiAvKioKLSAqCWlkZV9hYm9ydAktCWFib3J0IHBlbmRpbmcgSURFIG9wZXJhdGlucworICoJaWRlX2Fib3J0CS0JYWJvcnQgcGVuZGluZyBJREUgb3BlcmF0aW9ucwogICoJQGRyaXZlOiBkcml2ZSB0aGUgZXJyb3Igb2NjdXJyZWQgb24KICAqCUBtc2c6IG1lc3NhZ2UgdG8gcmVwb3J0CiAgKgpAQCAtNjIzLDcgKzYyMyw3IEBACiAgKglAZHJpdmU6IGRyaXZlIHRoZSBjb21wbGV0aW9uIGludGVycnVwdCBvY2N1cnJlZCBvbgogICoKICAqCWRyaXZlX2NtZF9pbnRyKCkgaXMgaW52b2tlZCBvbiBjb21wbGV0aW9uIG9mIGEgc3BlY2lhbCBEUklWRV9DTUQuCi0gKglXZSBkbyBhbnkgbmVjZXNzYXJ5IGRheWEgcmVhZGluZyBhbmQgdGhlbiB3YWl0IGZvciB0aGUgZHJpdmUgdG8KKyAqCVdlIGRvIGFueSBuZWNlc3NhcnkgZGF0YSByZWFkaW5nIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBkcml2ZSB0bwogICoJZ28gbm9uIGJ1c3kuIEF0IHRoYXQgcG9pbnQgd2UgbWF5IHJlYWQgdGhlIGVycm9yIGRhdGEgYW5kIGNvbXBsZXRlCiAgKgl0aGUgcmVxdWVzdAogICovCkBAIC03NzMsNyArNzczLDcgQEAKIAogLyoqCiAgKglleGVjdXRlX2RyaXZlX2NvbW1hbmQJLQlpc3N1ZSBzcGVjaWFsIGRyaXZlIGNvbW1hbmQKLSAqCUBkcml2ZTogdGhlIGRyaXZlIHRvIGlzc3VlIHRoIGNvbW1hbmQgb24KKyAqCUBkcml2ZTogdGhlIGRyaXZlIHRvIGlzc3VlIHRoZSBjb21tYW5kIG9uCiAgKglAcnE6IHRoZSByZXF1ZXN0IHN0cnVjdHVyZSBob2xkaW5nIHRoZSBjb21tYW5kCiAgKgogICoJZXhlY3V0ZV9kcml2ZV9jbWQoKSBpc3N1ZXMgYSBzcGVjaWFsIGRyaXZlIGNvbW1hbmQsICB1c3VhbGx5IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKaW5kZXggNWEzZGM0Ni4uZWUzOGU2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhcGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCkBAIC0yOTAzLDggKzI5MDMsNyBAQAogCQl9IGVsc2UgaWYgKCEodGFwZS0+c2Vuc2Vfa2V5ID09IDIgJiYgdGFwZS0+YXNjID09IDQgJiYKIAkJCSAgICAgKHRhcGUtPmFzY3EgPT0gMSB8fCB0YXBlLT5hc2NxID09IDgpKSkKIAkJCXJldHVybiAtRUlPOwotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLSAgCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApOworCQltc2xlZXAoMTAwKTsKIAl9CiAJcmV0dXJuIC1FSU87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGltaW5nLmggYi9kcml2ZXJzL2lkZS9pZGUtdGltaW5nLmgKaW5kZXggYzExOTZjZS4uMmZjZmFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRpbWluZy5oCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10aW1pbmcuaApAQCAtMjcsNiArMjcsNyBAQAogICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAKICNkZWZpbmUgWEZFUl9QSU9fNQkJMHgwZApAQCAtOTYsMTEgKzk3LDkgQEAKICNkZWZpbmUgSURFX1RJTUlOR19VRE1BCQkweDgwCiAjZGVmaW5lIElERV9USU1JTkdfQUxMCQkweGZmCiAKLSNkZWZpbmUgTUlOKGEsYikJKChhKTwoYik/KGEpOihiKSkKLSNkZWZpbmUgTUFYKGEsYikJKChhKT4oYik/KGEpOihiKSkKLSNkZWZpbmUgRklUKHYsbWluLG1heCkJTUFYKE1JTih2LG1heCksbWluKQotI2RlZmluZSBFTk9VR0godix1bml0KQkoKCh2KS0xKS8odW5pdCkrMSkKLSNkZWZpbmUgRVoodix1bml0KQkoKHYpP0VOT1VHSCh2LHVuaXQpOjApCisjZGVmaW5lIEZJVCh2LHZtaW4sdm1heCkJbWF4X3Qoc2hvcnQsbWluX3Qoc2hvcnQsdix2bWF4KSx2bWluKQorI2RlZmluZSBFTk9VR0godix1bml0KQkJKCgodiktMSkvKHVuaXQpKzEpCisjZGVmaW5lIEVaKHYsdW5pdCkJCSgodik/RU5PVUdIKHYsdW5pdCk6MCkKIAogI2RlZmluZSBYRkVSX01PREUJMHhmMAogI2RlZmluZSBYRkVSX1VETUFfMTMzCTB4NDgKQEAgLTE4OCwxNCArMTg3LDE0IEBACiAKIHN0YXRpYyB2b2lkIGlkZV90aW1pbmdfbWVyZ2Uoc3RydWN0IGlkZV90aW1pbmcgKmEsIHN0cnVjdCBpZGVfdGltaW5nICpiLCBzdHJ1Y3QgaWRlX3RpbWluZyAqbSwgdW5zaWduZWQgaW50IHdoYXQpCiB7Ci0JaWYgKHdoYXQgJiBJREVfVElNSU5HX1NFVFVQICApIG0tPnNldHVwICAgPSBNQVgoYS0+c2V0dXAsICAgYi0+c2V0dXApOwotCWlmICh3aGF0ICYgSURFX1RJTUlOR19BQ1Q4QiAgKSBtLT5hY3Q4YiAgID0gTUFYKGEtPmFjdDhiLCAgIGItPmFjdDhiKTsKLQlpZiAod2hhdCAmIElERV9USU1JTkdfUkVDOEIgICkgbS0+cmVjOGIgICA9IE1BWChhLT5yZWM4YiwgICBiLT5yZWM4Yik7Ci0JaWYgKHdoYXQgJiBJREVfVElNSU5HX0NZQzhCICApIG0tPmN5YzhiICAgPSBNQVgoYS0+Y3ljOGIsICAgYi0+Y3ljOGIpOwotCWlmICh3aGF0ICYgSURFX1RJTUlOR19BQ1RJVkUgKSBtLT5hY3RpdmUgID0gTUFYKGEtPmFjdGl2ZSwgIGItPmFjdGl2ZSk7Ci0JaWYgKHdoYXQgJiBJREVfVElNSU5HX1JFQ09WRVIpIG0tPnJlY292ZXIgPSBNQVgoYS0+cmVjb3ZlciwgYi0+cmVjb3Zlcik7Ci0JaWYgKHdoYXQgJiBJREVfVElNSU5HX0NZQ0xFICApIG0tPmN5Y2xlICAgPSBNQVgoYS0+Y3ljbGUsICAgYi0+Y3ljbGUpOwotCWlmICh3aGF0ICYgSURFX1RJTUlOR19VRE1BICAgKSBtLT51ZG1hICAgID0gTUFYKGEtPnVkbWEsICAgIGItPnVkbWEpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19TRVRVUCAgKSBtLT5zZXR1cCAgID0gbWF4KGEtPnNldHVwLCAgIGItPnNldHVwKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfQUNUOEIgICkgbS0+YWN0OGIgICA9IG1heChhLT5hY3Q4YiwgICBiLT5hY3Q4Yik7CisJaWYgKHdoYXQgJiBJREVfVElNSU5HX1JFQzhCICApIG0tPnJlYzhiICAgPSBtYXgoYS0+cmVjOGIsICAgYi0+cmVjOGIpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19DWUM4QiAgKSBtLT5jeWM4YiAgID0gbWF4KGEtPmN5YzhiLCAgIGItPmN5YzhiKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfQUNUSVZFICkgbS0+YWN0aXZlICA9IG1heChhLT5hY3RpdmUsICBiLT5hY3RpdmUpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19SRUNPVkVSKSBtLT5yZWNvdmVyID0gbWF4KGEtPnJlY292ZXIsIGItPnJlY292ZXIpOworCWlmICh3aGF0ICYgSURFX1RJTUlOR19DWUNMRSAgKSBtLT5jeWNsZSAgID0gbWF4KGEtPmN5Y2xlLCAgIGItPmN5Y2xlKTsKKwlpZiAod2hhdCAmIElERV9USU1JTkdfVURNQSAgICkgbS0+dWRtYSAgICA9IG1heChhLT51ZG1hLCAgICBiLT51ZG1hKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpZGVfdGltaW5nKiBpZGVfdGltaW5nX2ZpbmRfbW9kZShzaG9ydCBzcGVlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwppbmRleCBmMWQxZWM0Li4wY2NmODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCkBAIC0zNDAsOCArMzQxLDcgQEAKIAkJYnJlYWs7CiAJICAgIH0KIAl9Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CisJbXNsZWVwKDEwMCk7CiAgICAgfQogCiAgICAgaWYgKGhkIDwgMCkgewpAQCAtNDU0LDkgKzQ1NCwxMiBAQAogc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGlkZV9pZHNbXSA9IHsKIAlQQ01DSUFfREVWSUNFX0ZVTkNfSUQoNCksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDMyLCAweDA3MDQpLAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDBhNCwgMHgwMDJkKSwKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDIwODAsIDB4MDAwMSksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDQ1LCAweDA0MDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA5OCwgMHgwMDAwKSwJLyogVG9zaGliYSAqLworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDBhNCwgMHgwMDJkKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwY2UsIDB4MDAwMCksCS8qIFNhbXN1bmcgKi8KKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDIwODAsIDB4MDAwMSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHg0ZTAxLCAweDAyMDApLAkvKiBMZXhhciAqLwogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQ2FyYXZlbGxlIiwgIlBTQy1JREUgIiwgIlBTQzAwMCIsIDB4OGMzNjEzN2MsIDB4ZDA2OTNhYjgsIDB4Mjc2OGE5ZjApLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQ0RST00iLCAiSURFIiwgIk1DRC02MDFwIiwgMHgxYjkxNzljYSwgMHhlZGU4ODk1MSwgMHgwZDkwMmY3NCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJQQ01DSUEiLCAiSURFIENBUkQiLCAiRjEiLCAweDI4MWYxYzVkLCAweDE5MDc5NjBjLCAweGY3ZmRlOGI5KSwKQEAgLTQ4MSw2ICs0ODQsNyBAQAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJUT1NISUJBIiwgIk1LMjAwMU1QTCIsIDB4YjQ1ODVhMWEsIDB4MzQ4OWUwMDMpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJXSVQiLCAiSURFMTYiLCAweDI0NGU1OTk0LCAweDNlMjMyODUyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJTVEkgRmxhc2giLCAweGU0YTEzMjA5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU1RJIiwgIkZsYXNoIDUuMCIsIDB4YmYyZGYxOGQsIDB4OGNiNTdhMGUpLAogCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigxLCAiU2FuRGlzayIsICJDb25uZWN0UGx1cyIsIDB4N2E5NTRiZDksIDB4NzRiZTAwYzYpLAogCVBDTUNJQV9ERVZJQ0VfTlVMTCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMgYi9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKaW5kZXggN2I2NGRiMS4uMTI3NjE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYwpAQCAtMTMzNCw5ICsxMzM0LDEzIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfaHB0MzY2KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaW50IHJldCA9IDA7Ci0JLyogRklYTUU6IE5vdCBwb3J0YWJsZSAqLworCisJLyoKKwkgKiBGSVhNRTogTm90IHBvcnRhYmxlLiBBbHNvLCB3aHkgZG8gd2UgZW5hYmxlIHRoZSBST00gaW4gdGhlIGZpcnN0IHBsYWNlPworCSAqIFdlIGRvbid0IHNlZW0gdG8gYmUgdXNpbmcgaXQuCisJICovCiAJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9ST01fQUREUkVTUywKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywKIAkJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKIAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIChMMV9DQUNIRV9CWVRFUyAvIDQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKaW5kZXggYmViY2M0Ny4uYjIzMzIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKQEAgLTEwNjgsNiArMTA2OCw4IEBACiAJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKIAlpbnQgaSA9IDA7CiAJaW50IGxlbmd0aCA9IDA7CisJLyogaWVlZTEzOTQ6dmVuTm1vTnNwTnZlck4gKi8KKwljaGFyIGJ1Zls4ICsgMSArIDMgKyA4ICsgMiArIDggKyAyICsgOCArIDMgKyA4ICsgMV07CiAKIAlpZiAoIWNkZXYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTA5NCw2ICsxMDk2LDEyIEBACiAJUFVUX0VOVlAoIkdVSUQ9JTAxNkx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl1ZC0+bmUtPmd1aWQpOwogCVBVVF9FTlZQKCJTUEVDSUZJRVJfSUQ9JTA2eCIsIHVkLT5zcGVjaWZpZXJfaWQpOwogCVBVVF9FTlZQKCJWRVJTSU9OPSUwNngiLCB1ZC0+dmVyc2lvbik7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImllZWUxMzk0OnZlbiUwOFhtbyUwOFhzcCUwOFh2ZXIlMDhYIiwKKwkJCXVkLT52ZW5kb3JfaWQsCisJCQl1ZC0+bW9kZWxfaWQsCisJCQl1ZC0+c3BlY2lmaWVyX2lkLAorCQkJdWQtPnZlcnNpb24pOworCVBVVF9FTlZQKCJNT0RBTElBUz0lcyIsIGJ1Zik7CiAKICN1bmRlZiBQVVRfRU5WUAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYwppbmRleCAwNjc1OWIzLi45ZDZmYWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKQEAgLTg4Myw3ICs4ODMsNyBAQAogCQkJICAgICAgdi5jaGFubmVsKTsKIAkJfQogCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZ2LCBzaXplb2YodikpKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnYsIHNpemVvZih2KSkpIHsKIAkJCS8qIEZJWE1FIDogZnJlZSBhbGxvY2F0ZWQgZG1hIHJlc291cmNlcyAqLwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IGZhZTFjMmQuLjIxMWJhMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWVsZW1lbnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG9ydF90YWJsZV9hdHRyaWJ1dGUpLAorCQllbGVtZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBvcnRfdGFibGVfYXR0cmlidXRlKSwKIAkJCQkgIEdGUF9LRVJORUwpOwogCQlpZiAoIWVsZW1lbnQpCiAJCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCmluZGV4IDMyNDFkNmMuLmZmYmNkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYwpAQCAtOTM3LDEyICs5MzcsMTIgQEAKIAkJKyttdGhjYV92ZXJzaW9uX3ByaW50ZWQ7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggIkluaXRpYWxpemluZyAlcyAoJXMpXG4iLAotCSAgICAgICBwY2lfcHJldHR5X25hbWUocGRldiksIHBjaV9uYW1lKHBkZXYpKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiSW5pdGlhbGl6aW5nICVzXG4iLAorCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAKIAlpZiAoaWQtPmRyaXZlcl9kYXRhID49IEFSUkFZX1NJWkUobXRoY2FfaGNhX3RhYmxlKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyAoJXMpIGhhcyBpbnZhbGlkIGRyaXZlciBkYXRhICVseFxuIiwKLQkJICAgICAgIHBjaV9wcmV0dHlfbmFtZShwZGV2KSwgcGNpX25hbWUocGRldiksIGlkLT5kcml2ZXJfZGF0YSk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIGhhcyBpbnZhbGlkIGRyaXZlciBkYXRhICVseFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBpZC0+ZHJpdmVyX2RhdGEpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9yZXNldC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Jlc2V0LmMKaW5kZXggOGVhODAxMi4uNGY5OTUzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Jlc2V0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Jlc2V0LmMKQEAgLTcxLDggKzcxLDggQEAKIAkJCQkJCWJyaWRnZSkpICE9IE5VTEwpIHsKIAkJCWlmIChicmlkZ2UtPmhkcl90eXBlICAgID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UgJiYKIAkJCSAgICBicmlkZ2UtPnN1Ym9yZGluYXRlID09IG1kZXYtPnBkZXYtPmJ1cykgewotCQkJCW10aGNhX2RiZyhtZGV2LCAiRm91bmQgYnJpZGdlOiAlcyAoJXMpXG4iLAotCQkJCQkgIHBjaV9wcmV0dHlfbmFtZShicmlkZ2UpLCBwY2lfbmFtZShicmlkZ2UpKTsKKwkJCQltdGhjYV9kYmcobWRldiwgIkZvdW5kIGJyaWRnZTogJXNcbiIsCisJCQkJCSAgcGNpX25hbWUoYnJpZGdlKSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTgzLDggKzgzLDggQEAKIAkJCSAqIGFzc3VtZSB3ZSdyZSBpbiBuby1icmlkZ2UgbW9kZSBhbmQgaG9wZSBmb3IKIAkJCSAqIHRoZSBiZXN0LgogCQkJICovCi0JCQltdGhjYV93YXJuKG1kZXYsICJObyBicmlkZ2UgZm91bmQgZm9yICVzICglcylcbiIsCi0JCQkJICBwY2lfcHJldHR5X25hbWUobWRldi0+cGRldiksIHBjaV9uYW1lKG1kZXYtPnBkZXYpKTsKKwkJCW10aGNhX3dhcm4obWRldiwgIk5vIGJyaWRnZSBmb3VuZCBmb3IgJXNcbiIsCisJCQkJICBwY2lfbmFtZShtZGV2LT5wZGV2KSk7CiAJCX0KIAogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwppbmRleCBmOGIyNzhkLi4zNzM4ZDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkJCWlmICh0IDwgMCB8fCB0ID49IGRldi0+a2V5Y29kZW1heCB8fCAhZGV2LT5rZXljb2Rlc2l6ZSkgcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAoZ2V0X3VzZXIodiwgaXAgKyAxKSkgcmV0dXJuIC1FRkFVTFQ7CiAJCQlpZiAodiA8IDAgfHwgdiA+IEtFWV9NQVgpIHJldHVybiAtRUlOVkFMOwotCQkJaWYgKHYgPj4gKGRldi0+a2V5Y29kZXNpemUgKiA4KSkgcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZGV2LT5rZXljb2Rlc2l6ZSA8IHNpemVvZih2KSAmJiAodiA+PiAoZGV2LT5rZXljb2Rlc2l6ZSAqIDgpKSkgcmV0dXJuIC1FSU5WQUw7CiAJCQl1ID0gU0VUX0lOUFVUX0tFWUNPREUoZGV2LCB0LCB2KTsKIAkJCWNsZWFyX2JpdCh1LCBkZXYtPmtleWJpdCk7CiAJCQlzZXRfYml0KHYsIGRldi0+a2V5Yml0KTsKQEAgLTM5Myw2ICszOTMsNyBAQAogCQkJCQkJY2FzZSBFVl9MRUQ6IGJpdHMgPSBkZXYtPmxlZGJpdDsgbGVuID0gTEVEX01BWDsgYnJlYWs7CiAJCQkJCQljYXNlIEVWX1NORDogYml0cyA9IGRldi0+c25kYml0OyBsZW4gPSBTTkRfTUFYOyBicmVhazsKIAkJCQkJCWNhc2UgRVZfRkY6ICBiaXRzID0gZGV2LT5mZmJpdDsgIGxlbiA9IEZGX01BWDsgIGJyZWFrOworCQkJCQkJY2FzZSBFVl9TVzogIGJpdHMgPSBkZXYtPnN3Yml0OyAgbGVuID0gU1dfTUFYOyAgYnJlYWs7CiAJCQkJCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKIAkJCQkJfQogCQkJCQlsZW4gPSBOQklUUyhsZW4pICogc2l6ZW9mKGxvbmcpOwpAQCAtNDIxLDYgKzQyMiwxMyBAQAogCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+c25kLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKIAkJCQl9CiAKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHU1coMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWxlbiA9IE5CSVRTKFNXX01BWCkgKiBzaXplb2YobG9uZyk7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5zdywgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCiAJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR05BTUUoMCkpKSB7CiAJCQkJCWludCBsZW47CiAJCQkJCWlmICghZGV2LT5uYW1lKSByZXR1cm4gLUVOT0VOVDsKQEAgLTUwMSw3ICs1MDksNyBAQAogCWludCBsZW4gPSBOQklUU19DT01QQVQoKG1heCkpICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBcCiAJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsgXAogCWZvciAoaSA9IDA7IGkgPCBsZW4gLyBzaXplb2YoY29tcGF0X2xvbmdfdCk7IGkrKykgXAotCQlpZiAoY29weV90b191c2VyKChjb21wYXRfbG9uZ190KikgcCArIGksIFwKKwkJaWYgKGNvcHlfdG9fdXNlcigoY29tcGF0X2xvbmdfdCBfX3VzZXIgKikgcCArIGksIFwKIAkJCQkgKGNvbXBhdF9sb25nX3QqKSAoYml0KSArIGkgKyAxIC0gKChpICUgMikgPDwgMSksIFwKIAkJCQkgc2l6ZW9mKGNvbXBhdF9sb25nX3QpKSkgXAogCQkJcmV0dXJuIC1FRkFVTFQ7IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZW11MTBrMS1ncC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9lbXUxMGsxLWdwLmMKaW5kZXggYTAxMTgwMy4uNDYyZjhkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9lbXUxMGsxLWdwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9lbXUxMGsxLWdwLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvcG9ydCwgaW9sZW4sICJlbXUxMGsxLWdwIikpCiAJCXJldHVybiAtRUJVU1k7CiAKLQllbXUgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW11KSwgR0ZQX0tFUk5FTCk7CisJZW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtdSksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFlbXUgfHwgIXBvcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxLWdwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9mbTgwMS1ncC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9mbTgwMS1ncC5jCmluZGV4IDU3NjE1YmMuLjQ3ZTkzZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZm04MDEtZ3AuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2ZtODAxLWdwLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlzdHJ1Y3QgZm04MDFfZ3AgKmdwOwogCXN0cnVjdCBnYW1lcG9ydCAqcG9ydDsKIAotCWdwID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGZtODAxX2dwKSwgR0ZQX0tFUk5FTCk7CisJZ3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZm04MDFfZ3ApLCBHRlBfS0VSTkVMKTsKIAlwb3J0ID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3AgfHwgIXBvcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmbTgwMS1ncDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYwppbmRleCA3MGYwNTE4Li5kMmU1NWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JbnM1NTggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbnM1NTgpLCBHRlBfS0VSTkVMKTsKKwluczU1OCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuczU1OCksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFuczU1OCB8fCAhcG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgIm5zNTU4OiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKQEAgLTIxNSw3ICsyMTUsNyBAQAogCWlmICghcmVxdWVzdF9yZWdpb24oaW9wb3J0LCBpb2xlbiwgIm5zNTU4LXBucCIpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbnM1NTggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbnM1NTgpLCBHRlBfS0VSTkVMKTsKKwluczU1OCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuczU1OCksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFuczU1OCB8fCAhcG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgIm5zNTU4OiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IGEyNzUyMTEuLjg4NjM2YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTg5LDYgKzg5LDE1IEBACiAKIAkJCWJyZWFrOwogCisJCWNhc2UgRVZfU1c6CisKKwkJCWlmIChjb2RlID4gU1dfTUFYIHx8ICF0ZXN0X2JpdChjb2RlLCBkZXYtPnN3Yml0KSB8fCAhIXRlc3RfYml0KGNvZGUsIGRldi0+c3cpID09IHZhbHVlKQorCQkJCXJldHVybjsKKworCQkJY2hhbmdlX2JpdChjb2RlLCBkZXYtPnN3KTsKKworCQkJYnJlYWs7CisKIAkJY2FzZSBFVl9BQlM6CiAKIAkJCWlmIChjb2RlID4gQUJTX01BWCB8fCAhdGVzdF9iaXQoY29kZSwgZGV2LT5hYnNiaXQpKQpAQCAtNDAyLDYgKzQxMSw3IEBACiAJU1BSSU5URl9CSVRfQTIobGVkYml0LCAiTEVEPSIsIExFRF9NQVgsIEVWX0xFRCk7CiAJU1BSSU5URl9CSVRfQTIoc25kYml0LCAiU05EPSIsIFNORF9NQVgsIEVWX1NORCk7CiAJU1BSSU5URl9CSVRfQTIoZmZiaXQsICAiRkY9IiwgIEZGX01BWCwgRVZfRkYpOworCVNQUklOVEZfQklUX0EyKHN3Yml0LCAgIlNXPSIsICBTV19NQVgsIEVWX1NXKTsKIAogCWVudnBbaSsrXSA9IE5VTEw7CiAKQEAgLTQ5MCw2ICs1MDAsNyBAQAogCQlTUFJJTlRGX0JJVF9CMihsZWRiaXQsICJMRUQ9IiwgTEVEX01BWCwgRVZfTEVEKTsKIAkJU1BSSU5URl9CSVRfQjIoc25kYml0LCAiU05EPSIsIFNORF9NQVgsIEVWX1NORCk7CiAJCVNQUklOVEZfQklUX0IyKGZmYml0LCAgIkZGPSIsICBGRl9NQVgsIEVWX0ZGKTsKKwkJU1BSSU5URl9CSVRfQjIoc3diaXQsICAiU1c9IiwgIFNXX01BWCwgRVZfU1cpOwogCiAJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCmluZGV4IGJmMzRmNzUuLmJmNjU0MzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMKQEAgLTI2OSw3ICsyNjksNyBAQAogCWludCBpOwogCWludCBlcnI7CiAKLQlpZiAoIShhM2QgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYTNkKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGEzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhM2QpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJYTNkLT5nYW1lcG9ydCA9IGdhbWVwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMKaW5kZXggMjY1OTYyOS4uY2YzNWFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jCkBAIC00NjksNyArNDY5LDcgQEAKIAlpbnQgaTsKIAlpbnQgZXJyOwogCi0JaWYgKCEocG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBhZGlfcG9ydCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkaV9wb3J0KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBvcnQtPmdhbWVwb3J0ID0gZ2FtZXBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwppbmRleCBjM2E1NzM5Li42NGIxMzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWludCBpOwogCWludCBlcnI7CiAKLQlpZiAoIShwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGFuYWxvZ19wb3J0KSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKHBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW5hbG9nX3BvcnQpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtIEVOT01FTTsKIAogCWVyciA9IGFuYWxvZ19pbml0X3BvcnQoZ2FtZXBvcnQsIGRydiwgcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMKaW5kZXggYTYwMDIyMC4uMGIyZTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svY29icmEuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJaW50IGksIGo7CiAJaW50IGVycjsKIAotCWlmICghKGNvYnJhID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGNvYnJhKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGNvYnJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvYnJhKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNvYnJhLT5nYW1lcG9ydCA9IGdhbWVwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKaW5kZXggZmJkM2VlZC4uMmEzZTRiYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYwpAQCAtNTcyLDcgKzU3Miw3IEBACiAJCX0KIAl9CiAKLQlpZiAoIShkYjkgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGI5KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZGI5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRiOSksIEdGUF9LRVJORUwpKSkgewogCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nYW1lY29uLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYwppbmRleCA5NWJiZGQzLi41NDI3YmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmICghKGdjID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGdjKSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZ2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ2MpLCBHRlBfS0VSTkVMKSkpIHsKIAkJcGFycG9ydF9wdXRfcG9ydChwcCk7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKaW5kZXggN2Q5Njk0Mi4uOGU0ZjkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCXVuc2lnbmVkIGNoYXIgZGF0YVtHRjJLX0xFTkdUSF07CiAJaW50IGksIGVycjsKIAotCWlmICghKGdmMmsgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZ2YyayksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShnZjJrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdmMmspLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZ2Yyay0+Z2FtZXBvcnQgPSBnYW1lcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwLmMKaW5kZXggZDE1MDBkMi4uOWQzZjkxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCWludCBpLCBqLCB0OwogCWludCBlcnI7CiAKLQlpZiAoIShncmlwID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGdyaXApLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoZ3JpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncmlwKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWdyaXAtPmdhbWVwb3J0ID0gZ2FtZXBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCmluZGV4IDBkYTdiZDEuLmRhMTdlZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCkBAIC02MDcsNyArNjA3LDcgQEAKIAlzdHJ1Y3QgZ3JpcF9tcCAqZ3JpcDsKIAlpbnQgZXJyOwogCi0JaWYgKCEoZ3JpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBncmlwX21wKSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGdyaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JpcF9tcCksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlncmlwLT5nYW1lcG9ydCA9IGdhbWVwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3VpbGxlbW90LmMKaW5kZXggZjkzZGE3Yi4uNmE3MGVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAlpbnQgaSwgdDsKIAlpbnQgZXJyOwogCi0JaWYgKCEoZ3VpbGxlbW90ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGd1aWxsZW1vdCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShndWlsbGVtb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3VpbGxlbW90KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWd1aWxsZW1vdC0+Z2FtZXBvcnQgPSBnYW1lcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1wYWNrZXRzLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtcGFja2V0cy5jCmluZGV4IDU4NzI4ZWIuLmU1YTMxZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1wYWNrZXRzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXBhY2tldHMuYwpAQCAtMjQ5LDkgKzI0OSw2IEBACiAKIGludCBpZm9yY2VfZ2V0X2lkX3BhY2tldChzdHJ1Y3QgaWZvcmNlICppZm9yY2UsIGNoYXIgKnBhY2tldCkKIHsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlpbnQgdGltZW91dCA9IEhaOyAvKiAxIHNlY29uZCAqLwotCiAJc3dpdGNoIChpZm9yY2UtPmJ1cykgewogCiAJY2FzZSBJRk9SQ0VfVVNCOgpAQCAtMjYwLDIyICsyNTcsMTMgQEAKIAkJaWZvcmNlLT5jci5iUmVxdWVzdCA9IHBhY2tldFswXTsKIAkJaWZvcmNlLT5jdHJsLT5kZXYgPSBpZm9yY2UtPnVzYmRldjsKIAotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlhZGRfd2FpdF9xdWV1ZSgmaWZvcmNlLT53YWl0LCAmd2FpdCk7Ci0KLQkJaWYgKHVzYl9zdWJtaXRfdXJiKGlmb3JjZS0+Y3RybCwgR0ZQX0FUT01JQykpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaWZvcmNlLT53YWl0LCAmd2FpdCk7CisJCWlmICh1c2Jfc3VibWl0X3VyYihpZm9yY2UtPmN0cmwsIEdGUF9BVE9NSUMpKQogCQkJcmV0dXJuIC0xOwotCQl9CiAKLQkJd2hpbGUgKHRpbWVvdXQgJiYgaWZvcmNlLT5jdHJsLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGlmb3JjZS0+d2FpdCwKKwkJCWlmb3JjZS0+Y3RybC0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUywgSFopOwogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZpZm9yY2UtPndhaXQsICZ3YWl0KTsKLQotCQlpZiAoIXRpbWVvdXQpIHsKKwkJaWYgKGlmb3JjZS0+Y3RybC0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgewogCQkJdXNiX3VubGlua191cmIoaWZvcmNlLT5jdHJsKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMjkwLDE2ICsyNzgsMTAgQEAKIAkJaWZvcmNlLT5leHBlY3RfcGFja2V0ID0gRkZfQ01EX1FVRVJZOwogCQlpZm9yY2Vfc2VuZF9wYWNrZXQoaWZvcmNlLCBGRl9DTURfUVVFUlksIHBhY2tldCk7CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJYWRkX3dhaXRfcXVldWUoJmlmb3JjZS0+d2FpdCwgJndhaXQpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpZm9yY2UtPndhaXQsCisJCQkhaWZvcmNlLT5leHBlY3RfcGFja2V0LCBIWik7CiAKLQkJd2hpbGUgKHRpbWVvdXQgJiYgaWZvcmNlLT5leHBlY3RfcGFja2V0KQotCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJmlmb3JjZS0+d2FpdCwgJndhaXQpOwotCi0JCWlmICghdGltZW91dCkgeworCQlpZiAoaWZvcmNlLT5leHBlY3RfcGFja2V0KSB7CiAJCQlpZm9yY2UtPmV4cGVjdF9wYWNrZXQgPSAwOwogCQkJcmV0dXJuIC0xOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMKaW5kZXggNjM2OWEyNC4uNTg2MDBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS11c2IuYwpAQCAtOTUsNiArOTUsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCisJd2FrZV91cCgmaWZvcmNlLT53YWl0KTsKIAlpZm9yY2VfcHJvY2Vzc19wYWNrZXQoaWZvcmNlLAogCQkoaWZvcmNlLT5kYXRhWzBdIDw8IDgpIHwgKHVyYi0+YWN0dWFsX2xlbmd0aCAtIDEpLCBpZm9yY2UtPmRhdGEgKyAxLCByZWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jCmluZGV4IDlkM2Y4YzMuLmQ3YjM0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaW50ZXJhY3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2ludGVyYWN0LmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogCWludCBpLCB0OwogCWludCBlcnI7CiAKLQlpZiAoIShpbnRlcmFjdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBpbnRlcmFjdCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShpbnRlcmFjdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlcmFjdCksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbnRlcmFjdC0+Z2FtZXBvcnQgPSBnYW1lcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc2lkZXdpbmRlci5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMKaW5kZXggNDcxNDRhNy4uOWUwMzUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zaWRld2luZGVyLmMKQEAgLTU5MCw3ICs1OTAsNyBAQAogCiAJY29tbWVudFswXSA9IDA7CiAKLQlzdyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdyksIEdGUF9LRVJORUwpOworCXN3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN3KSwgR0ZQX0tFUk5FTCk7CiAJYnVmID0ga21hbGxvYyhTV19MRU5HVEgsIEdGUF9LRVJORUwpOwogCWlkYnVmID0ga21hbGxvYyhTV19MRU5HVEgsIEdGUF9LRVJORUwpOwogCWlmICghc3cgfHwgIWJ1ZiB8fCAhaWRidWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMKaW5kZXggOWViOTk1NC4uNzQzMWVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCWludCBpLCBqLCBrLCBsLCBtOwogCWludCBlcnI7CiAKLQlpZiAoISh0bWRjID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRtZGMpLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEodG1kYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bWRjKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXRtZGMtPmdhbWVwb3J0ID0gZ2FtZXBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3R1cmJvZ3JhZnguYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCmluZGV4IDI4MTAwZDQuLjBjNWI5YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCEodGdmeCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0Z2Z4KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEodGdmeCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0Z2Z4KSwgR0ZQX0tFUk5FTCkpKSB7CiAJCXBhcnBvcnRfcHV0X3BvcnQocHApOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggNGQ0OTg1Yi4uMWFkOGMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtMjA4LDYgKzIwOCw3IEBACiAJdW5zaWduZWQgY2hhciByZXNlbmQ7CiAJdW5zaWduZWQgY2hhciByZWxlYXNlOwogCXVuc2lnbmVkIGNoYXIgYmF0X3hsOworCXVuc2lnbmVkIGNoYXIgZXJyX3hsOwogCXVuc2lnbmVkIGludCBsYXN0OwogCXVuc2lnbmVkIGxvbmcgdGltZTsKIH07CkBAIC0yOTYsMTUgKzI5NywxOCBAQAogCQlpZiAoYXRrYmQtPmVtdWwgfHwKIAkJICAgICEoY29kZSA9PSBBVEtCRF9SRVRfRU1VTDAgfHwgY29kZSA9PSBBVEtCRF9SRVRfRU1VTDEgfHwKIAkJICAgICAgY29kZSA9PSBBVEtCRF9SRVRfSEFOR1VFTCB8fCBjb2RlID09IEFUS0JEX1JFVF9IQU5KQSB8fAotCQkgICAgICBjb2RlID09IEFUS0JEX1JFVF9FUlIgfHwKKwkJICAgICAoY29kZSA9PSBBVEtCRF9SRVRfRVJSICYmICFhdGtiZC0+ZXJyX3hsKSB8fAogCSAgICAgICAgICAgICAoY29kZSA9PSBBVEtCRF9SRVRfQkFUICYmICFhdGtiZC0+YmF0X3hsKSkpIHsKIAkJCWF0a2JkLT5yZWxlYXNlID0gY29kZSA+PiA3OwogCQkJY29kZSAmPSAweDdmOwogCQl9CiAKLQkJaWYgKCFhdGtiZC0+ZW11bCAmJgotCQkgICAgIChjb2RlICYgMHg3ZikgPT0gKEFUS0JEX1JFVF9CQVQgJiAweDdmKSkKKwkJaWYgKCFhdGtiZC0+ZW11bCkgeworCQkgICAgIGlmICgoY29kZSAmIDB4N2YpID09IChBVEtCRF9SRVRfQkFUICYgMHg3ZikpCiAJCQlhdGtiZC0+YmF0X3hsID0gIWF0a2JkLT5yZWxlYXNlOworCQkgICAgIGlmICgoY29kZSAmIDB4N2YpID09IChBVEtCRF9SRVRfRVJSICYgMHg3ZikpCisJCQlhdGtiZC0+ZXJyX3hsID0gIWF0a2JkLT5yZWxlYXNlOworCQl9CiAJfQogCiAJc3dpdGNoIChjb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKaW5kZXggYTg1NTE3MS4uY2Q0YjZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzIsNyArMzMsNiBAQAogLyogemVybyBjb2RlLCAxMjQgc2NhbmNvZGVzICsgMyBoaW5nZSBjb21iaW5hdGlvbnMgKi8KICNkZWZpbmUJTlJfU0NBTkNPREVTCQkoIFNDQU5DT0RFKEtCX1JPV1MtMSxLQl9DT0xTLTEpICsxICsxICszICkKICNkZWZpbmUgU0NBTl9JTlRFUlZBTAkJKEhaLzEwKQotI2RlZmluZSBDT1JHSUtCRF9QUkVTU0VECTEKIAogI2RlZmluZSBISU5HRV9TQ0FOX0lOVEVSVkFMCQkoSFovNCkKIApAQCAtNzMsMjUgKzczLDEzIEBACiAJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKIAljaGFyIHBoeXNbMzJdOwogCi0JdW5zaWduZWQgY2hhciBzdGF0ZVtBUlJBWV9TSVpFKGNvcmdpa2JkX2tleWNvZGUpXTsKIAlzcGlubG9ja190IGxvY2s7Ci0KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBodGltZXI7Ci19OwogCi1zdGF0aWMgdm9pZCBoYW5kbGVfc2NhbmNvZGUodW5zaWduZWQgaW50IHByZXNzZWQsdW5zaWduZWQgaW50IHNjYW5jb2RlLCBzdHJ1Y3QgY29yZ2lrYmQgKmNvcmdpa2JkX2RhdGEpCi17Ci0JaWYgKHByZXNzZWQgJiYgIShjb3JnaWtiZF9kYXRhLT5zdGF0ZVtzY2FuY29kZV0gJiBDT1JHSUtCRF9QUkVTU0VEKSkgewotCQljb3JnaWtiZF9kYXRhLT5zdGF0ZVtzY2FuY29kZV0gfD0gQ09SR0lLQkRfUFJFU1NFRDsKLQkJaW5wdXRfcmVwb3J0X2tleSgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIGNvcmdpa2JkX2RhdGEtPmtleWNvZGVbc2NhbmNvZGVdLCAxKTsKLQkJaWYgKGNvcmdpa2JkX2RhdGEtPmtleWNvZGVbc2NhbmNvZGVdID09IENPUkdJX0tFWV9PRkYpCi0JCQlpbnB1dF9ldmVudCgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIEVWX1BXUiwgQ09SR0lfS0VZX09GRiwgMSk7Ci0JfSBlbHNlIGlmICghcHJlc3NlZCAmJiBjb3JnaWtiZF9kYXRhLT5zdGF0ZVtzY2FuY29kZV0gJiBDT1JHSUtCRF9QUkVTU0VEKSB7Ci0JCWNvcmdpa2JkX2RhdGEtPnN0YXRlW3NjYW5jb2RlXSAmPSB+Q09SR0lLQkRfUFJFU1NFRDsKLQkJaW5wdXRfcmVwb3J0X2tleSgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIGNvcmdpa2JkX2RhdGEtPmtleWNvZGVbc2NhbmNvZGVdLCAwKTsKLQl9Ci19CisJdW5zaWduZWQgaW50IHN1c3BlbmRlZDsKKwl1bnNpZ25lZCBsb25nIHN1c3BlbmRfamlmZmllczsKK307CiAKICNkZWZpbmUgS0JfRElTQ0hBUkdFX0RFTEFZCTEwCiAjZGVmaW5lIEtCX0FDVElWQVRFX0RFTEFZCTEwCkBAIC0xMDUsMzYgKzkzLDM2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaWtiZF9kaXNjaGFyZ2VfYWxsKHZvaWQpCiB7Ci0JLy8gU1RST0JFIEFsbCBIaVoKKwkvKiBTVFJPQkUgQWxsIEhpWiAqLwogCUdQQ1IyICA9IENPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQ7CiAJR1BEUjIgJj0gfkNPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaWtiZF9hY3RpdmF0ZV9hbGwodm9pZCkKIHsKLQkvLyBTVFJPQkUgQUxMIC0+IEhpZ2gKKwkvKiBTVFJPQkUgQUxMIC0+IEhpZ2ggKi8KIAlHUFNSMiAgPSBDT1JHSV9HUElPX0FMTF9TVFJPQkVfQklUOwogCUdQRFIyIHw9IENPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQ7CiAKIAl1ZGVsYXkoS0JfRElTQ0hBUkdFX0RFTEFZKTsKIAotCS8vIENsZWFyIGFueSBpbnRlcnJ1cHRzIHdlIG1heSBoYXZlIHRyaWdnZXJlZCB3aGVuIGFsdGVyaW5nIHRoZSBHUElPIGxpbmVzCisJLyogQ2xlYXIgYW55IGludGVycnVwdHMgd2UgbWF5IGhhdmUgdHJpZ2dlcmVkIHdoZW4gYWx0ZXJpbmcgdGhlIEdQSU8gbGluZXMgKi8KIAlHRURSMSA9IENPUkdJX0dQSU9fSElHSF9TRU5TRV9CSVQ7CiAJR0VEUjIgPSBDT1JHSV9HUElPX0xPV19TRU5TRV9CSVQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaWtiZF9hY3RpdmF0ZV9jb2woaW50IGNvbCkKIHsKLQkvLyBTVFJPQkUgY29sIC0+IEhpZ2gsIG5vdCBjb2wgLT4gSGlaCisJLyogU1RST0JFIGNvbCAtPiBIaWdoLCBub3QgY29sIC0+IEhpWiAqLwogCUdQU1IyID0gQ09SR0lfR1BJT19TVFJPQkVfQklUKGNvbCk7CiAJR1BEUjIgPSAoR1BEUjIgJiB+Q09SR0lfR1BJT19BTExfU1RST0JFX0JJVCkgfCBDT1JHSV9HUElPX1NUUk9CRV9CSVQoY29sKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvcmdpa2JkX3Jlc2V0X2NvbChpbnQgY29sKQogewotCS8vIFNUUk9CRSBjb2wgLT4gTG93CisJLyogU1RST0JFIGNvbCAtPiBMb3cgKi8KIAlHUENSMiA9IENPUkdJX0dQSU9fU1RST0JFX0JJVChjb2wpOwotCS8vIFNUUk9CRSBjb2wgLT4gb3V0LCBub3QgY29sIC0+IEhpWgorCS8qIFNUUk9CRSBjb2wgLT4gb3V0LCBub3QgY29sIC0+IEhpWiAqLwogCUdQRFIyID0gKEdQRFIyICYgfkNPUkdJX0dQSU9fQUxMX1NUUk9CRV9CSVQpIHwgQ09SR0lfR1BJT19TVFJPQkVfQklUKGNvbCk7CiB9CiAKQEAgLTE0OSwxMCArMTM3LDEzIEBACiAvKiBTY2FuIHRoZSBoYXJkd2FyZSBrZXlib2FyZCBhbmQgcHVzaCBhbnkgY2hhbmdlcyB1cCB0aHJvdWdoIHRoZSBpbnB1dCBsYXllciAqLwogc3RhdGljIHZvaWQgY29yZ2lrYmRfc2NhbmtleWJvYXJkKHN0cnVjdCBjb3JnaWtiZCAqY29yZ2lrYmRfZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgaW50IHJvdywgY29sLCByb3dkLCBzY2FuY29kZTsKKwl1bnNpZ25lZCBpbnQgcm93LCBjb2wsIHJvd2Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgbnVtX3ByZXNzZWQ7CiAKKwlpZiAoY29yZ2lrYmRfZGF0YS0+c3VzcGVuZGVkKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29yZ2lrYmRfZGF0YS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHJlZ3MpCkBAIC0xNzMsMTAgKzE2NCwyMSBAQAogCiAJCXJvd2QgPSBHRVRfUk9XU19TVEFUVVMoY29sKTsKIAkJZm9yIChyb3cgPSAwOyByb3cgPCBLQl9ST1dTOyByb3crKykgeworCQkJdW5zaWduZWQgaW50IHNjYW5jb2RlLCBwcmVzc2VkOworCiAJCQlzY2FuY29kZSA9IFNDQU5DT0RFKHJvdywgY29sKTsKLQkJCWhhbmRsZV9zY2FuY29kZSgocm93ZCAmIEtCX1JPV01BU0socm93KSksIHNjYW5jb2RlLCBjb3JnaWtiZF9kYXRhKTsKLQkJCWlmIChyb3dkICYgS0JfUk9XTUFTSyhyb3cpKQorCQkJcHJlc3NlZCA9IHJvd2QgJiBLQl9ST1dNQVNLKHJvdyk7CisKKwkJCWlucHV0X3JlcG9ydF9rZXkoJmNvcmdpa2JkX2RhdGEtPmlucHV0LCBjb3JnaWtiZF9kYXRhLT5rZXljb2RlW3NjYW5jb2RlXSwgcHJlc3NlZCk7CisKKwkJCWlmIChwcmVzc2VkKQogCQkJCW51bV9wcmVzc2VkKys7CisKKwkJCWlmIChwcmVzc2VkICYmIChjb3JnaWtiZF9kYXRhLT5rZXljb2RlW3NjYW5jb2RlXSA9PSBDT1JHSV9LRVlfT0ZGKQorCQkJCQkmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGNvcmdpa2JkX2RhdGEtPnN1c3BlbmRfamlmZmllcyArIEhaKSkgeworCQkJCWlucHV0X2V2ZW50KCZjb3JnaWtiZF9kYXRhLT5pbnB1dCwgRVZfUFdSLCBDT1JHSV9LRVlfT0ZGLCAxKTsKKwkJCQljb3JnaWtiZF9kYXRhLT5zdXNwZW5kX2ppZmZpZXM9amlmZmllczsKKwkJCX0KIAkJfQogCQljb3JnaWtiZF9yZXNldF9jb2woY29sKTsKIAl9CkBAIC0yMjEsOCArMjIzLDExIEBACiAgKiBUaGUgaGluZ2Ugc3dpdGNoZXMgZ2VuZXJhdGUgbm8gaW50ZXJydXB0IHNvIHRoZXkgbmVlZCB0byBiZQogICogbW9uaXRvcmVkIGJ5IGEgdGltZXIuCiAgKgotICogV2hlbiB3ZSBkZXRlY3QgY2hhbmdlcywgd2UgZGVib3VuY2UgaXQgYW5kIHRoZW4gcGFzcyB0aGUgdGhyZWUKLSAqIHBvc2l0aW9ucyB0aGUgc3lzdGVtIGNhbiB0YWtlIGFzIGtleXByZXNzZXMgdG8gdGhlIGlucHV0IHN5c3RlbS4KKyAqIFdlIGRlYm91bmNlIHRoZSBzd2l0Y2hlcyBhbmQgcGFzcyB0aGVtIHRvIHRoZSBpbnB1dCBzeXN0ZW0uCisgKgorICogIGdwcnIgPT0gMHgwMCAtIEtleWJvYXJkIHdpdGggTGFuZHNjYXBlIFNjcmVlbgorICogICAgICAgICAgMHgwOCAtIE5vIEtleWJvYXJkIHdpdGggUG9ydHJhaXQgU2NyZWVuCisgKiAgICAgICAgICAweDBjIC0gS2V5Ym9hcmQgYW5kIFNjcmVlbiBDbG9zZWQKICAqLwogCiAjZGVmaW5lIEhJTkdFX1NUQUJMRV9DT1VOVCAyCkBAIC0yMzUsNyArMjQwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGdwcnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWdwcnIgPSByZWFkX3Njb29wX3JlZyhTQ09PUF9HUFJSKSAmIChDT1JHSV9TQ1BfU1dBIHwgQ09SR0lfU0NQX1NXQik7CisJZ3ByciA9IHJlYWRfc2Nvb3BfcmVnKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIFNDT09QX0dQUlIpICYgKENPUkdJX1NDUF9TV0EgfCBDT1JHSV9TQ1BfU1dCKTsKIAlpZiAoZ3ByciAhPSBzaGFycHNsX2hpbmdlX3N0YXRlKSB7CiAJCWhpbmdlX2NvdW50ID0gMDsKIAkJc2hhcnBzbF9oaW5nZV9zdGF0ZSA9IGdwcnI7CkBAIC0yNDQsOSArMjQ5LDggQEAKIAkJaWYgKGhpbmdlX2NvdW50ID49IEhJTkdFX1NUQUJMRV9DT1VOVCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvcmdpa2JkX2RhdGEtPmxvY2ssIGZsYWdzKTsKIAotCQkJaGFuZGxlX3NjYW5jb2RlKChzaGFycHNsX2hpbmdlX3N0YXRlID09IDB4MDApLCAxMjUsIGNvcmdpa2JkX2RhdGEpOyAvKiBLZXlib2FyZCB3aXRoIExhbmRzY2FwZSBTY3JlZW4gKi8KLQkJCWhhbmRsZV9zY2FuY29kZSgoc2hhcnBzbF9oaW5nZV9zdGF0ZSA9PSAweDA4KSwgMTI2LCBjb3JnaWtiZF9kYXRhKTsgLyogTm8gS2V5Ym9hcmQgd2l0aCBQb3J0cmFpdCBTY3JlZW4gKi8KLQkJCWhhbmRsZV9zY2FuY29kZSgoc2hhcnBzbF9oaW5nZV9zdGF0ZSA9PSAweDBjKSwgMTI3LCBjb3JnaWtiZF9kYXRhKTsgLyogS2V5Ym9hcmQgYW5kIFNjcmVlbiBDbG9zZWQgICovCisJCQlpbnB1dF9yZXBvcnRfc3dpdGNoKCZjb3JnaWtiZF9kYXRhLT5pbnB1dCwgU1dfMCwgKChzaGFycHNsX2hpbmdlX3N0YXRlICYgQ09SR0lfU0NQX1NXQSkgIT0gMCkpOworCQkJaW5wdXRfcmVwb3J0X3N3aXRjaCgmY29yZ2lrYmRfZGF0YS0+aW5wdXQsIFNXXzEsICgoc2hhcnBzbF9oaW5nZV9zdGF0ZSAmIENPUkdJX1NDUF9TV0IpICE9IDApKTsKIAkJCWlucHV0X3N5bmMoJmNvcmdpa2JkX2RhdGEtPmlucHV0KTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZ2lrYmRfZGF0YS0+bG9jaywgZmxhZ3MpOwpAQCAtMjU1LDE5ICsyNTksNDUgQEAKIAltb2RfdGltZXIoJmNvcmdpa2JkX2RhdGEtPmh0aW1lciwgamlmZmllcyArIEhJTkdFX1NDQU5fSU5URVJWQUwpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGNvcmdpa2JkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQoreworCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKKwkJc3RydWN0IGNvcmdpa2JkICpjb3JnaWtiZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCQljb3JnaWtiZC0+c3VzcGVuZGVkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lrYmRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgbGV2ZWwpCit7CisJaWYgKGxldmVsID09IFJFU1VNRV9QT1dFUl9PTikgeworCQlzdHJ1Y3QgY29yZ2lrYmQgKmNvcmdpa2JkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkJLyogVXBvbiByZXN1bWUsIGlnbm9yZSB0aGUgc3VzcGVuZCBrZXkgZm9yIGEgc2hvcnQgd2hpbGUgKi8KKwkJY29yZ2lrYmQtPnN1c3BlbmRfamlmZmllcz1qaWZmaWVzOworCQljb3JnaWtiZC0+c3VzcGVuZGVkID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBjb3JnaWtiZF9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgY29yZ2lrYmRfcmVzdW1lCQlOVUxMCisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgY29yZ2lrYmRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCBpOwogCXN0cnVjdCBjb3JnaWtiZCAqY29yZ2lrYmQ7CiAKLQljb3JnaWtiZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb3JnaWtiZCksIEdGUF9LRVJORUwpOworCWNvcmdpa2JkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvcmdpa2JkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb3JnaWtiZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LGNvcmdpa2JkKTsKIAlzdHJjcHkoY29yZ2lrYmQtPnBoeXMsICJjb3JnaWtiZC9pbnB1dDAiKTsKIAotCXNwaW5fbG9ja19pbml0KGNvcmdpa2JkLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY29yZ2lrYmQtPmxvY2spOwogCiAJLyogSW5pdCBLZXlib2FyZCByZXNjYW4gdGltZXIgKi8KIAlpbml0X3RpbWVyKCZjb3JnaWtiZC0+dGltZXIpOwpAQCAtMjc5LDYgKzMwOSw4IEBACiAJY29yZ2lrYmQtPmh0aW1lci5mdW5jdGlvbiA9IGNvcmdpa2JkX2hpbmdlX3RpbWVyOwogCWNvcmdpa2JkLT5odGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjb3JnaWtiZDsKIAorCWNvcmdpa2JkLT5zdXNwZW5kX2ppZmZpZXM9amlmZmllczsKKwogCWluaXRfaW5wdXRfZGV2KCZjb3JnaWtiZC0+aW5wdXQpOwogCWNvcmdpa2JkLT5pbnB1dC5wcml2YXRlID0gY29yZ2lrYmQ7CiAJY29yZ2lrYmQtPmlucHV0Lm5hbWUgPSAiQ29yZ2kgS2V5Ym9hcmQiOwpAQCAtMjg4LDcgKzMyMCw3IEBACiAJY29yZ2lrYmQtPmlucHV0LmlkLnZlbmRvciA9IDB4MDAwMTsKIAljb3JnaWtiZC0+aW5wdXQuaWQucHJvZHVjdCA9IDB4MDAwMTsKIAljb3JnaWtiZC0+aW5wdXQuaWQudmVyc2lvbiA9IDB4MDEwMDsKLQljb3JnaWtiZC0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApIHwgQklUKEVWX1BXUik7CisJY29yZ2lrYmQtPmlucHV0LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVQKSB8IEJJVChFVl9QV1IpIHwgQklUKEVWX1NXKTsKIAljb3JnaWtiZC0+aW5wdXQua2V5Y29kZSA9IGNvcmdpa2JkLT5rZXljb2RlOwogCWNvcmdpa2JkLT5pbnB1dC5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKIAljb3JnaWtiZC0+aW5wdXQua2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoY29yZ2lrYmRfa2V5Y29kZSk7CkBAIC0yOTcsNiArMzI5LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb3JnaWtiZF9rZXljb2RlKTsgaSsrKQogCQlzZXRfYml0KGNvcmdpa2JkLT5rZXljb2RlW2ldLCBjb3JnaWtiZC0+aW5wdXQua2V5Yml0KTsKIAljbGVhcl9iaXQoMCwgY29yZ2lrYmQtPmlucHV0LmtleWJpdCk7CisJc2V0X2JpdChTV18wLCBjb3JnaWtiZC0+aW5wdXQuc3diaXQpOworCXNldF9iaXQoU1dfMSwgY29yZ2lrYmQtPmlucHV0LnN3Yml0KTsKIAogCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmY29yZ2lrYmQtPmlucHV0KTsKIAltb2RfdGltZXIoJmNvcmdpa2JkLT5odGltZXIsIGppZmZpZXMgKyBISU5HRV9TQ0FOX0lOVEVSVkFMKTsKQEAgLTM0Myw2ICszNzcsOCBAQAogCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAogCS5wcm9iZQkJPSBjb3JnaWtiZF9wcm9iZSwKIAkucmVtb3ZlCQk9IGNvcmdpa2JkX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGNvcmdpa2JkX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBjb3JnaWtiZF9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjb3JnaWtiZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYwppbmRleCA1OTY5NjRjLi40YmFlNWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3Vua2JkLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgc3Vua2JkX2tleWNvZGVbMTI4XSA9IHsKLQkgIDAsMTI4LDExNCwxMjksMTE1LCA1OSwgNjAsIDY4LCA2MSwgODcsIDYyLCA4OCwgNjMsMTAwLCA2NCwgIDAsCisJICAwLDEyOCwxMTQsMTI5LDExNSwgNTksIDYwLCA2OCwgNjEsIDg3LCA2MiwgODgsIDYzLDEwMCwgNjQsMTEyLAogCSA2NSwgNjYsIDY3LCA1NiwxMDMsMTE5LCA5OSwgNzAsMTA1LDEzMCwxMzEsMTA4LDEwNiwgIDEsICAyLCAgMywKIAkgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDQxLCAxNCwxMTAsMTEzLCA5OCwgNTUsCiAJMTE2LDEzMiwgODMsMTMzLDEwMiwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKaW5kZXggYzQ5MDliNC4uODJiMzMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCkBAIC0xNSw0ICsxNSw0IEBACiBvYmotJChDT05GSUdfTU9VU0VfSElMKQkJKz0gaGlsX3B0ci5vCiBvYmotJChDT05GSUdfTU9VU0VfVlNYWFhBQSkJKz0gdnN4eHhhYS5vCiAKLXBzbW91c2Utb2JqcyAgOj0gcHNtb3VzZS1iYXNlLm8gYWxwcy5vIGxvZ2lwczJwcC5vIHN5bmFwdGljcy5vIGxpZmVib29rLm8KK3BzbW91c2Utb2JqcyAgOj0gcHNtb3VzZS1iYXNlLm8gYWxwcy5vIGxvZ2lwczJwcC5vIHN5bmFwdGljcy5vIGxpZmVib29rLm8gdHJhY2twb2ludC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCmluZGV4IDBkNjhlNWUuLmIyMDc4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCB6ID4gMCk7CiAKIAlpZiAocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX1dIRUVMKQotCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAoKHBhY2tldFswXSA+PiA0KSAmIDB4MDcpIHwgKChwYWNrZXRbMl0gPj4gMikgJiAweDA4KSk7CisJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsICgocGFja2V0WzJdIDw8IDEpICYgMHgwOCkgLSAoKHBhY2tldFswXSA+PiA0KSAmIDB4MDcpKTsKIAogCWlmIChwcml2LT5pLT5mbGFncyAmIChBTFBTX0ZXX0JLXzEgfCBBTFBTX0ZXX0JLXzIpKSB7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRk9SV0FSRCwgZm9yd2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwppbmRleCA0OGQyYjIwLi43ZGY5NjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKQEAgLTE1MCwxMiArMTUwLDEyIEBACiAJcHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfU0VUUkVTKTsKIH0KIAotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfc21hcnRzY3JvbGwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBzMnBwX2F0dHJfc2hvd19zbWFydHNjcm9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwc21vdXNlLT5zbWFydHNjcm9sbCA/IDEgOiAwKTsKIH0KIAotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9zbWFydHNjcm9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBwczJwcF9hdHRyX3NldF9zbWFydHNjcm9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljaGFyICpyZXN0OwpAQCAtMTY5LDcgKzE2OSw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1QU01PVVNFX0RFRklORV9BVFRSKHNtYXJ0c2Nyb2xsKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIoc21hcnRzY3JvbGwsIFNfSVdVU1IgfCBTX0lSVUdPLCBOVUxMLAorCQkJcHMycHBfYXR0cl9zaG93X3NtYXJ0c2Nyb2xsLCBwczJwcF9hdHRyX3NldF9zbWFydHNjcm9sbCk7CiAKIC8qCiAgKiBTdXBwb3J0IDgwMCBkcGkgcmVzb2x1dGlvbiBfb25seV8gaWYgdGhlIHVzZXIgd2FudHMgaXQgKHRoZXJlIGFyZSBnb29kCkBAIC0xOTQsNyArMTk1LDcgQEAKIAogc3RhdGljIHZvaWQgcHMycHBfZGlzY29ubmVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3NtYXJ0c2Nyb2xsKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3NtYXJ0c2Nyb2xsLmRhdHRyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwczJwcF9pbmZvICpnZXRfbW9kZWxfaW5mbyh1bnNpZ25lZCBjaGFyIG1vZGVsKQpAQCAtMjIyLDYgKzIyMyw3IEBACiAJCXsgODAsCVBTMlBQX0tJTkRfV0hFRUwsCVBTMlBQX1NJREVfQlROIHwgUFMyUFBfV0hFRUwgfSwKIAkJeyA4MSwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA4MywJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKKwkJeyA4NiwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA4OCwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA5NiwJMCwJCQkwIH0sCiAJCXsgOTcsCVBTMlBQX0tJTkRfVFAzLAkJUFMyUFBfV0hFRUwgfCBQUzJQUF9IV0hFRUwgfSwKQEAgLTM3OSw3ICszODEsOCBAQAogCQkJCXBzbW91c2UtPnNldF9yZXNvbHV0aW9uID0gcHMycHBfc2V0X3Jlc29sdXRpb247CiAJCQkJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IHBzMnBwX2Rpc2Nvbm5lY3Q7CiAKLQkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3NtYXJ0c2Nyb2xsKTsKKwkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAorCQkJCQkJICAgJnBzbW91c2VfYXR0cl9zbWFydHNjcm9sbC5kYXR0cik7CiAJCQl9CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKaW5kZXggMmJiMmZlNy4uYWYyNDMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAibG9naXBzMnBwLmgiCiAjaW5jbHVkZSAiYWxwcy5oIgogI2luY2x1ZGUgImxpZmVib29rLmgiCisjaW5jbHVkZSAidHJhY2twb2ludC5oIgogCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJQUy8yIG1vdXNlIGRyaXZlciIKIApAQCAtNTcsMTAgKzU4LDMwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocmVzZXRhZnRlciwgcHNtb3VzZV9yZXNldGFmdGVyLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVzZXRhZnRlciwgIlJlc2V0IGRldmljZSBhZnRlciBzbyBtYW55IGJhZCBwYWNrZXRzICgwID0gbmV2ZXIpLiIpOwogCi1QU01PVVNFX0RFRklORV9BVFRSKHByb3RvY29sKTsKLVBTTU9VU0VfREVGSU5FX0FUVFIocmF0ZSk7Ci1QU01PVVNFX0RFRklORV9BVFRSKHJlc29sdXRpb24pOwotUFNNT1VTRV9ERUZJTkVfQVRUUihyZXNldGFmdGVyKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIocHJvdG9jb2wsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJTlVMTCwKKwkJCXBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sLCBwc21vdXNlX2F0dHJfc2V0X3Byb3RvY29sKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIocmF0ZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkodm9pZCAqKSBvZmZzZXRvZihzdHJ1Y3QgcHNtb3VzZSwgcmF0ZSksCisJCQlwc21vdXNlX3Nob3dfaW50X2F0dHIsIHBzbW91c2VfYXR0cl9zZXRfcmF0ZSk7CitQU01PVVNFX0RFRklORV9BVFRSKHJlc29sdXRpb24sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJKHZvaWQgKikgb2Zmc2V0b2Yoc3RydWN0IHBzbW91c2UsIHJlc29sdXRpb24pLAorCQkJcHNtb3VzZV9zaG93X2ludF9hdHRyLCBwc21vdXNlX2F0dHJfc2V0X3Jlc29sdXRpb24pOworUFNNT1VTRV9ERUZJTkVfQVRUUihyZXNldGFmdGVyLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSh2b2lkICopIG9mZnNldG9mKHN0cnVjdCBwc21vdXNlLCByZXNldGFmdGVyKSwKKwkJCXBzbW91c2Vfc2hvd19pbnRfYXR0ciwgcHNtb3VzZV9zZXRfaW50X2F0dHIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcHNtb3VzZV9hdHRyaWJ1dGVzW10gPSB7CisJJnBzbW91c2VfYXR0cl9wcm90b2NvbC5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmF0ZS5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVzb2x1dGlvbi5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVzZXRhZnRlci5kYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBzbW91c2VfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycwk9IHBzbW91c2VfYXR0cmlidXRlcywKK307CiAKIF9fb2Jzb2xldGVfc2V0dXAoInBzbW91c2Vfbm9leHQiKTsKIF9fb2Jzb2xldGVfc2V0dXAoInBzbW91c2VfcmVzb2x1dGlvbj0iKTsKQEAgLTUyMCw2ICs1NDEsMTIgQEAKIAkJcmV0dXJuIFBTTU9VU0VfSU1QUzsKIAogLyoKKyAqIFRyeSB0byBpbml0aWFsaXplIHRoZSBJQk0gVHJhY2tQb2ludAorICovCisJaWYgKG1heF9wcm90byA+IFBTTU9VU0VfSU1FWCAmJiB0cmFja3BvaW50X2RldGVjdChwc21vdXNlLCBzZXRfcHJvcGVydGllcykgPT0gMCkKKwkJcmV0dXJuIFBTTU9VU0VfVFJBQ0tQT0lOVDsKKworLyoKICAqIE9rYXksIGFsbCBmYWlsZWQsIHdlIGhhdmUgYSBzdGFuZGFyZCBtb3VzZSBoZXJlLiBUaGUgbnVtYmVyIG9mIHRoZSBidXR0b25zCiAgKiBpcyBzdGlsbCBhIHF1ZXN0aW9uLCB0aG91Z2guIFdlIGFzc3VtZSAzLgogICovCkBAIC02MDAsNiArNjI3LDEyIEBACiAJCS5pbml0CQk9IGxpZmVib29rX2luaXQsCiAJfSwKIAl7CisJCS50eXBlCQk9IFBTTU9VU0VfVFJBQ0tQT0lOVCwKKwkJLm5hbWUJCT0gIlRQUFMvMiIsCisJCS5hbGlhcwkJPSAidHJhY2twb2ludCIsCisJCS5kZXRlY3QJCT0gdHJhY2twb2ludF9kZXRlY3QsCisJfSwKKwl7CiAJCS50eXBlCQk9IFBTTU9VU0VfQVVUTywKIAkJLm5hbWUJCT0gImF1dG8iLAogCQkuYWxpYXMJCT0gImFueSIsCkBAIC03ODcsMTAgKzgyMCw3IEBACiAKIAlwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Byb3RvY29sKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmF0ZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc29sdXRpb24pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yZXNldGFmdGVyKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNlcmlvLT5kZXYua29iaiwgJnBzbW91c2VfYXR0cmlidXRlX2dyb3VwKTsKIAogCWRvd24oJnBzbW91c2Vfc2VtKTsKIApAQCAtODgzLDcgKzkxMyw3IEBACiAJCXBzbW91c2VfZGVhY3RpdmF0ZShwYXJlbnQpOwogCX0KIAotCWlmICghKHBzbW91c2UgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpKSkgeworCWlmICghKHBzbW91c2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpKSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC05MjcsMTAgKzk1Nyw3IEBACiAJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnB0X2FjdGl2YXRlKQogCQlwYXJlbnQtPnB0X2FjdGl2YXRlKHBhcmVudCk7CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcHJvdG9jb2wpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yYXRlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmVzb2x1dGlvbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc2V0YWZ0ZXIpOworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmcHNtb3VzZV9hdHRyaWJ1dGVfZ3JvdXApOwogCiAJcHNtb3VzZV9hY3RpdmF0ZShwc21vdXNlKTsKIApAQCAtMTAyNywxMCArMTA1NCwxMiBAQAogCS5jbGVhbnVwCT0gcHNtb3VzZV9jbGVhbnVwLAogfTsKIAotc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsCi0JCQkJIHNzaXplX3QgKCpoYW5kbGVyKShzdHJ1Y3QgcHNtb3VzZSAqLCBjaGFyICopKQorc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgY2hhciAqYnVmKQogewogCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSB0b19zZXJpb19wb3J0KGRldik7CisJc3RydWN0IHBzbW91c2VfYXR0cmlidXRlICphdHRyID0gdG9fcHNtb3VzZV9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwc21vdXNlICpwc21vdXNlOwogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzZXJpb19waW5fZHJpdmVyKHNlcmlvKTsKQEAgLTEwNDIsMTkgKzEwNzEsMjEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0dmFsID0gaGFuZGxlcihzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyksIGJ1Zik7CisJcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCXJldHZhbCA9IGF0dHItPnNob3cocHNtb3VzZSwgYXR0ci0+ZGF0YSwgYnVmKTsKIAogb3V0OgogCXNlcmlvX3VucGluX2RyaXZlcihzZXJpbyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCXNzaXplX3QgKCpoYW5kbGVyKShzdHJ1Y3QgcHNtb3VzZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCkpCitzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHRvX3NlcmlvX3BvcnQoZGV2KTsKLQlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKLQlzdHJ1Y3QgcHNtb3VzZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcHNtb3VzZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19wc21vdXNlX2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBzbW91c2UgKnBzbW91c2UsICpwYXJlbnQgPSBOVUxMOwogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzZXJpb19waW5fZHJpdmVyKHNlcmlvKTsKQEAgLTEwNzAsNiArMTEwMSw4IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXRfdW5waW47CiAKKwlwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCiAJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfSUdOT1JFKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X3VwOwpAQCAtMTA4Miw3ICsxMTE1LDcgQEAKIAogCXBzbW91c2VfZGVhY3RpdmF0ZShwc21vdXNlKTsKIAotCXJldHZhbCA9IGhhbmRsZXIocHNtb3VzZSwgYnVmLCBjb3VudCk7CisJcmV0dmFsID0gYXR0ci0+c2V0KHBzbW91c2UsIGF0dHItPmRhdGEsIGJ1ZiwgY291bnQpOwogCiAJaWYgKHJldHZhbCAhPSAtRU5PREVWKQogCQlwc21vdXNlX2FjdGl2YXRlKHBzbW91c2UpOwpAQCAtMTA5NywxMiArMTEzMCwzNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwc21vdXNlX3Nob3dfaW50X2F0dHIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHZvaWQgKm9mZnNldCwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgKmZpZWxkID0gKHVuc2lnbmVkIGxvbmcgKikoKGNoYXIgKilwc21vdXNlICsgKHNpemVfdClvZmZzZXQpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCAqZmllbGQpOworfQorCitzdGF0aWMgc3NpemVfdCBwc21vdXNlX3NldF9pbnRfYXR0cihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqb2Zmc2V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nICpmaWVsZCA9ICh1bnNpZ25lZCBsb25nICopKChjaGFyICopcHNtb3VzZSArIChzaXplX3Qpb2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgKnJlc3Q7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKKwlpZiAoKnJlc3QpCisJCXJldHVybiAtRUlOVkFMOworCisJKmZpZWxkID0gdmFsdWU7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHBzbW91c2VfcHJvdG9jb2xfYnlfdHlwZShwc21vdXNlLT50eXBlKS0+bmFtZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfcHJvdG9jb2woc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9wcm90b2NvbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKIAlzdHJ1Y3QgcHNtb3VzZSAqcGFyZW50ID0gTlVMTDsKQEAgLTExNjYsMTIgKzEyMjEsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfcmF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwc21vdXNlLT5yYXRlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9yYXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfcmF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljaGFyICpyZXN0OwpAQCAtMTE4NCwxMiArMTIzNCw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd19yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBzbW91c2UtPnJlc29sdXRpb24pOwotfQotCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X3Jlc29sdXRpb24oc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNoYXIgKnJlc3Q7CkBAIC0xMjAyLDIzICsxMjQ3LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X3Jlc2V0YWZ0ZXIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHNtb3VzZS0+cmVzZXRhZnRlcik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfcmVzZXRhZnRlcihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQljaGFyICpyZXN0OwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7Ci0JaWYgKCpyZXN0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBzbW91c2UtPnJlc2V0YWZ0ZXIgPSB2YWx1ZTsKLQlyZXR1cm4gY291bnQ7Ci19CiAKIHN0YXRpYyBpbnQgcHNtb3VzZV9zZXRfbWF4cHJvdG8oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKQEAgLTEyMzQsNyArMTI2Miw3IEBACiAKIAkqKCh1bnNpZ25lZCBpbnQgKilrcC0+YXJnKSA9IHByb3RvLT50eXBlOwogCi0JcmV0dXJuIDA7CQkJCQlcCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcHNtb3VzZV9nZXRfbWF4cHJvdG8oY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKaW5kZXggODY2OTFjZi4uNDVkMmJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAlQU01PVVNFX1NZTkFQVElDUywKIAlQU01PVVNFX0FMUFMsCiAJUFNNT1VTRV9MSUZFQk9PSywKKwlQU01PVVNFX1RSQUNLUE9JTlQsCiAJUFNNT1VTRV9BVVRPCQkvKiBUaGlzIG9uZSBzaG91bGQgYWx3YXlzIGJlIGxhc3QgKi8KIH07CiAKQEAgLTg1LDI0ICs4NiwzNyBAQAogaW50IHBzbW91c2VfcmVzZXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwogdm9pZCBwc21vdXNlX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbik7CiAKLXNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLAotCQkJc3NpemVfdCAoKmhhbmRsZXIpKHN0cnVjdCBwc21vdXNlICosIGNoYXIgKikpOwotc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJc3NpemVfdCAoKmhhbmRsZXIpKHN0cnVjdCBwc21vdXNlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSk7CiAKLSNkZWZpbmUgUFNNT1VTRV9ERUZJTkVfQVRUUihfbmFtZSkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2hvd18jI19uYW1lKHN0cnVjdCBwc21vdXNlICosIGNoYXIgKik7CQlcCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0XyMjX25hbWUoc3RydWN0IHBzbW91c2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpO1wKLXN0YXRpYyBzc2l6ZV90IHBzbW91c2VfZG9fc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpiKQkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHBzbW91c2VfYXR0cl9zaG93X2hlbHBlcihkLCBiLCBwc21vdXNlX2F0dHJfc2hvd18jI19uYW1lKTsJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBwc21vdXNlX2RvX3NldF8jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpiLCBzaXplX3QgcylcCi17CQkJCQkJCQkJCVwKLQlyZXR1cm4gcHNtb3VzZV9hdHRyX3NldF9oZWxwZXIoZCwgYiwgcywgcHNtb3VzZV9hdHRyX3NldF8jI19uYW1lKTsJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHNtb3VzZV9hdHRyXyMjX25hbWUgPQkJCQlcCi0JX19BVFRSKF9uYW1lLCBTX0lXVVNSIHwgU19JUlVHTywJCQkJCVwKLQkJcHNtb3VzZV9kb19zaG93XyMjX25hbWUsIHBzbW91c2VfZG9fc2V0XyMjX25hbWUpOworc3RydWN0IHBzbW91c2VfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkYXR0cjsKKwl2b2lkICpkYXRhOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc2V0KShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK307CisjZGVmaW5lIHRvX3BzbW91c2VfYXR0cihhKQljb250YWluZXJfb2YoKGEpLCBzdHJ1Y3QgcHNtb3VzZV9hdHRyaWJ1dGUsIGRhdHRyKQorCitzc2l6ZV90IHBzbW91c2VfYXR0cl9zaG93X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpOworc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKworI2RlZmluZSBQU01PVVNFX0RFRklORV9BVFRSKF9uYW1lLCBfbW9kZSwgX2RhdGEsIF9zaG93LCBfc2V0KQkJCVwKK3N0YXRpYyBzc2l6ZV90IF9zaG93KHN0cnVjdCBwc21vdXNlICosIHZvaWQgKmRhdGEsIGNoYXIgKik7CQkJXAorc3RhdGljIHNzaXplX3QgX3NldChzdHJ1Y3QgcHNtb3VzZSAqLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICosIHNpemVfdCk7CVwKK3N0YXRpYyBzdHJ1Y3QgcHNtb3VzZV9hdHRyaWJ1dGUgcHNtb3VzZV9hdHRyXyMjX25hbWUgPSB7CQkJXAorCS5kYXR0cgk9IHsJCQkJCQkJCVwKKwkJLmF0dHIJPSB7CQkJCQkJCVwKKwkJCS5uYW1lCT0gX19zdHJpbmdpZnkoX25hbWUpLAkJCQlcCisJCQkubW9kZQk9IF9tb2RlLAkJCQkJXAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCQkJCQlcCisJCX0sCQkJCQkJCQlcCisJCS5zaG93CT0gcHNtb3VzZV9hdHRyX3Nob3dfaGVscGVyLAkJCQlcCisJCS5zdG9yZQk9IHBzbW91c2VfYXR0cl9zZXRfaGVscGVyLAkJCQlcCisJfSwJCQkJCQkJCQlcCisJLmRhdGEJPSBfZGF0YSwJCQkJCQkJXAorCS5zaG93CT0gX3Nob3csCQkJCQkJCVwKKwkuc2V0CT0gX3NldCwJCQkJCQkJCVwKK30KIAogI2VuZGlmIC8qIF9QU01PVVNFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4OThkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogU3RlcGhlbiBFdmFuY2hpayA8ZXZhbmNoc2FAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVHJhZGVtYXJrcyBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgInBzbW91c2UuaCIKKyNpbmNsdWRlICJ0cmFja3BvaW50LmgiCisKKy8qCisgKiBEZXZpY2UgSU86IHJlYWQsIHdyaXRlIGFuZCB0b2dnbGUgYml0CisgKi8KK3N0YXRpYyBpbnQgdHJhY2twb2ludF9yZWFkKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgdW5zaWduZWQgY2hhciBsb2MsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdHMpCit7CisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIFRQX0NPTU1BTkQpKSB8fAorCSAgICBwczJfY29tbWFuZChwczJkZXYsIHJlc3VsdHMsIE1BS0VfUFMyX0NNRCgwLCAxLCBsb2MpKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2twb2ludF93cml0ZShzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgbG9jLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpZiAocHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgVFBfQ09NTUFORCkpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIFRQX1dSSVRFX01FTSkpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIGxvYykpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgTUFLRV9QUzJfQ01EKDAsIDAsIHZhbCkpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cmFja3BvaW50X3RvZ2dsZV9iaXQoc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyIGxvYywgdW5zaWduZWQgY2hhciBtYXNrKQoreworCS8qIEJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gaWYgdGhlIGxvYyBwYXJhbSBpc24ndCBpbiB0aGlzIHJhbmdlICovCisJaWYgKGxvYyA8IDB4MjAgfHwgbG9jID49IDB4MkYpCisJCXJldHVybiAtMTsKKworCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIE1BS0VfUFMyX0NNRCgwLCAwLCBUUF9DT01NQU5EKSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgVFBfVE9HR0xFKSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgbG9jKSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBNQUtFX1BTMl9DTUQoMCwgMCwgbWFzaykpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVHJhY2twb2ludC1zcGVjaWZpYyBhdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSB7CisJc2l6ZV90IGZpZWxkX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBtYXNrOworfTsKKworc3RhdGljIHNzaXplX3QgdHJhY2twb2ludF9zaG93X2ludF9hdHRyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqdHAgPSBwc21vdXNlLT5wcml2YXRlOworCXN0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSAqYXR0ciA9IGRhdGE7CisJdW5zaWduZWQgY2hhciAqZmllbGQgPSAodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKXRwICsgYXR0ci0+ZmllbGRfb2Zmc2V0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAqZmllbGQpOworfQorCitzdGF0aWMgc3NpemVfdCB0cmFja3BvaW50X3NldF9pbnRfYXR0cihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqdHAgPSBwc21vdXNlLT5wcml2YXRlOworCXN0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSAqYXR0ciA9IGRhdGE7CisJdW5zaWduZWQgY2hhciAqZmllbGQgPSAodW5zaWduZWQgY2hhciAqKSgoY2hhciAqKXRwICsgYXR0ci0+ZmllbGRfb2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgKnJlc3Q7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKKwlpZiAoKnJlc3QgfHwgdmFsdWUgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJKmZpZWxkID0gdmFsdWU7CisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBhdHRyLT5jb21tYW5kLCB2YWx1ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgVFJBQ0tQT0lOVF9JTlRfQVRUUihfbmFtZSwgX2NvbW1hbmQpCQkJCQlcCisJc3RhdGljIHN0cnVjdCB0cmFja3BvaW50X2F0dHJfZGF0YSB0cmFja3BvaW50X2F0dHJfIyNfbmFtZSA9IHsJCVwKKwkJLmZpZWxkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0cmFja3BvaW50X2RhdGEsIF9uYW1lKSwJXAorCQkuY29tbWFuZCA9IF9jb21tYW5kLAkJCQkJCVwKKwl9OwkJCQkJCQkJCVwKKwlQU01PVVNFX0RFRklORV9BVFRSKF9uYW1lLCBTX0lXVVNSIHwgU19JUlVHTywJCQkJXAorCQkJICAgICZ0cmFja3BvaW50X2F0dHJfIyNfbmFtZSwJCQkJXAorCQkJICAgIHRyYWNrcG9pbnRfc2hvd19pbnRfYXR0ciwgdHJhY2twb2ludF9zZXRfaW50X2F0dHIpCisKK3N0YXRpYyBzc2l6ZV90IHRyYWNrcG9pbnRfc2V0X2JpdF9hdHRyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdHJhY2twb2ludF9kYXRhICp0cCA9IHBzbW91c2UtPnByaXZhdGU7CisJc3RydWN0IHRyYWNrcG9pbnRfYXR0cl9kYXRhICphdHRyID0gZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpmaWVsZCA9ICh1bnNpZ25lZCBjaGFyICopKChjaGFyICopdHAgKyBhdHRyLT5maWVsZF9vZmZzZXQpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJY2hhciAqcmVzdDsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOworCWlmICgqcmVzdCB8fCB2YWx1ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCpmaWVsZCAhPSB2YWx1ZSkgeworCQkqZmllbGQgPSB2YWx1ZTsKKwkJdHJhY2twb2ludF90b2dnbGVfYml0KCZwc21vdXNlLT5wczJkZXYsIGF0dHItPmNvbW1hbmQsIGF0dHItPm1hc2spOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworCisjZGVmaW5lIFRSQUNLUE9JTlRfQklUX0FUVFIoX25hbWUsIF9jb21tYW5kLCBfbWFzaykJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgdHJhY2twb2ludF9hdHRyX2RhdGEgdHJhY2twb2ludF9hdHRyXyMjX25hbWUgPSB7CQlcCisJCS5maWVsZF9vZmZzZXQJPSBvZmZzZXRvZihzdHJ1Y3QgdHJhY2twb2ludF9kYXRhLCBfbmFtZSksCVwKKwkJLmNvbW1hbmQJPSBfY29tbWFuZCwJCQkJCVwKKwkJLm1hc2sJCT0gX21hc2ssCQkJCQlcCisJfTsJCQkJCQkJCQlcCisJUFNNT1VTRV9ERUZJTkVfQVRUUihfbmFtZSwgU19JV1VTUiB8IFNfSVJVR08sCQkJCVwKKwkJCSAgICAmdHJhY2twb2ludF9hdHRyXyMjX25hbWUsCQkJCVwKKwkJCSAgICB0cmFja3BvaW50X3Nob3dfaW50X2F0dHIsIHRyYWNrcG9pbnRfc2V0X2JpdF9hdHRyKQorCitUUkFDS1BPSU5UX0lOVF9BVFRSKHNlbnNpdGl2aXR5LCBUUF9TRU5TKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIoc3BlZWQsIFRQX1NQRUVEKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIoaW5lcnRpYSwgVFBfSU5FUlRJQSk7CitUUkFDS1BPSU5UX0lOVF9BVFRSKHJlYWNoLCBUUF9SRUFDSCk7CitUUkFDS1BPSU5UX0lOVF9BVFRSKGRyYWdoeXMsIFRQX0RSQUdIWVMpOworVFJBQ0tQT0lOVF9JTlRfQVRUUihtaW5kcmFnLCBUUF9NSU5EUkFHKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIodGhyZXNoLCBUUF9USFJFU0gpOworVFJBQ0tQT0lOVF9JTlRfQVRUUih1cHRocmVzaCwgVFBfVVBfVEhSRVNIKTsKK1RSQUNLUE9JTlRfSU5UX0FUVFIoenRpbWUsIFRQX1pfVElNRSk7CitUUkFDS1BPSU5UX0lOVF9BVFRSKGplbmtzLCBUUF9KRU5LU19DVVJWKTsKKworVFJBQ0tQT0lOVF9CSVRfQVRUUihwcmVzc190b19zZWxlY3QsIFRQX1RPR0dMRV9QVFNPTiwgVFBfTUFTS19QVFNPTik7CitUUkFDS1BPSU5UX0JJVF9BVFRSKHNraXBiYWNrLCBUUF9UT0dHTEVfU0tJUEJBQ0ssIFRQX01BU0tfU0tJUEJBQ0spOworVFJBQ0tQT0lOVF9CSVRfQVRUUihleHRfZGV2LCBUUF9UT0dHTEVfRVhUX0RFViwgVFBfTUFTS19FWFRfREVWKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRyYWNrcG9pbnRfYXR0cnNbXSA9IHsKKwkmcHNtb3VzZV9hdHRyX3NlbnNpdGl2aXR5LmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9zcGVlZC5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfaW5lcnRpYS5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVhY2guZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX2RyYWdoeXMuZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX21pbmRyYWcuZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX3RocmVzaC5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfdXB0aHJlc2guZGF0dHIuYXR0ciwKKwkmcHNtb3VzZV9hdHRyX3p0aW1lLmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9qZW5rcy5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcHJlc3NfdG9fc2VsZWN0LmRhdHRyLmF0dHIsCisJJnBzbW91c2VfYXR0cl9za2lwYmFjay5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfZXh0X2Rldi5kYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRyYWNrcG9pbnRfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB0cmFja3BvaW50X2F0dHJzLAorfTsKKworc3RhdGljIHZvaWQgdHJhY2twb2ludF9kaXNjb25uZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYua29iaiwgJnRyYWNrcG9pbnRfYXR0cl9ncm91cCk7CisKKwlrZnJlZShwc21vdXNlLT5wcml2YXRlKTsKKwlwc21vdXNlLT5wcml2YXRlID0gTlVMTDsKK30KKworc3RhdGljIGludCB0cmFja3BvaW50X3N5bmMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJdW5zaWduZWQgY2hhciB0b2dnbGU7CisJc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqdHAgPSBwc21vdXNlLT5wcml2YXRlOworCisJaWYgKCF0cCkKKwkJcmV0dXJuIC0xOworCisJLyogRGlzYWJsZSBmZWF0dXJlcyB0aGF0IG1heSBtYWtlIGRldmljZSB1bnVzYWJsZSB3aXRoIHRoaXMgZHJpdmVyICovCisJdHJhY2twb2ludF9yZWFkKCZwc21vdXNlLT5wczJkZXYsIFRQX1RPR0dMRV9UV09IQU5ELCAmdG9nZ2xlKTsKKwlpZiAodG9nZ2xlICYgVFBfTUFTS19UV09IQU5EKQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX1RXT0hBTkQsIFRQX01BU0tfVFdPSEFORCk7CisKKwl0cmFja3BvaW50X3JlYWQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX1NPVVJDRV9UQUcsICZ0b2dnbGUpOworCWlmICh0b2dnbGUgJiBUUF9NQVNLX1NPVVJDRV9UQUcpCisJCXRyYWNrcG9pbnRfdG9nZ2xlX2JpdCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfU09VUkNFX1RBRywgVFBfTUFTS19TT1VSQ0VfVEFHKTsKKworCXRyYWNrcG9pbnRfcmVhZCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfTUIsICZ0b2dnbGUpOworCWlmICh0b2dnbGUgJiBUUF9NQVNLX01CKQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX01CLCBUUF9NQVNLX01CKTsKKworCS8qIFB1c2ggdGhlIGNvbmZpZyB0byB0aGUgZGV2aWNlICovCisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9TRU5TLCB0cC0+c2Vuc2l0aXZpdHkpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfSU5FUlRJQSwgdHAtPmluZXJ0aWEpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfU1BFRUQsIHRwLT5zcGVlZCk7CisKKwl0cmFja3BvaW50X3dyaXRlKCZwc21vdXNlLT5wczJkZXYsIFRQX1JFQUNILCB0cC0+cmVhY2gpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfRFJBR0hZUywgdHAtPmRyYWdoeXMpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfTUlORFJBRywgdHAtPm1pbmRyYWcpOworCisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9USFJFU0gsIHRwLT50aHJlc2gpOworCXRyYWNrcG9pbnRfd3JpdGUoJnBzbW91c2UtPnBzMmRldiwgVFBfVVBfVEhSRVNILCB0cC0+dXB0aHJlc2gpOworCisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9aX1RJTUUsIHRwLT56dGltZSk7CisJdHJhY2twb2ludF93cml0ZSgmcHNtb3VzZS0+cHMyZGV2LCBUUF9KRU5LU19DVVJWLCB0cC0+amVua3MpOworCisJdHJhY2twb2ludF9yZWFkKCZwc21vdXNlLT5wczJkZXYsIFRQX1RPR0dMRV9QVFNPTiwgJnRvZ2dsZSk7CisJaWYgKCgodG9nZ2xlICYgVFBfTUFTS19QVFNPTikgPT0gVFBfTUFTS19QVFNPTikgIT0gdHAtPnByZXNzX3RvX3NlbGVjdCkKKwkJIHRyYWNrcG9pbnRfdG9nZ2xlX2JpdCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfUFRTT04sIFRQX01BU0tfUFRTT04pOworCisJdHJhY2twb2ludF9yZWFkKCZwc21vdXNlLT5wczJkZXYsIFRQX1RPR0dMRV9TS0lQQkFDSywgJnRvZ2dsZSk7CisJaWYgKCgodG9nZ2xlICYgVFBfTUFTS19TS0lQQkFDSykgPT0gVFBfTUFTS19TS0lQQkFDSykgIT0gdHAtPnNraXBiYWNrKQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX1NLSVBCQUNLLCBUUF9NQVNLX1NLSVBCQUNLKTsKKworCXRyYWNrcG9pbnRfcmVhZCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9UT0dHTEVfRVhUX0RFViwgJnRvZ2dsZSk7CisJaWYgKCgodG9nZ2xlICYgVFBfTUFTS19FWFRfREVWKSA9PSBUUF9NQVNLX0VYVF9ERVYpICE9IHRwLT5leHRfZGV2KQorCQl0cmFja3BvaW50X3RvZ2dsZV9iaXQoJnBzbW91c2UtPnBzMmRldiwgVFBfVE9HR0xFX0VYVF9ERVYsIFRQX01BU0tfRVhUX0RFVik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHJhY2twb2ludF9kZWZhdWx0cyhzdHJ1Y3QgdHJhY2twb2ludF9kYXRhICp0cCkKK3sKKwl0cC0+cHJlc3NfdG9fc2VsZWN0ID0gVFBfREVGX1BUU09OOworCXRwLT5zZW5zaXRpdml0eSA9IFRQX0RFRl9TRU5TOworCXRwLT5zcGVlZCA9IFRQX0RFRl9TUEVFRDsKKwl0cC0+cmVhY2ggPSBUUF9ERUZfUkVBQ0g7CisKKwl0cC0+ZHJhZ2h5cyA9IFRQX0RFRl9EUkFHSFlTOworCXRwLT5taW5kcmFnID0gVFBfREVGX01JTkRSQUc7CisKKwl0cC0+dGhyZXNoID0gVFBfREVGX1RIUkVTSDsKKwl0cC0+dXB0aHJlc2ggPSBUUF9ERUZfVVBfVEhSRVNIOworCisJdHAtPnp0aW1lID0gVFBfREVGX1pfVElNRTsKKwl0cC0+amVua3MgPSBUUF9ERUZfSkVOS1NfQ1VSVjsKKworCXRwLT5pbmVydGlhID0gVFBfREVGX0lORVJUSUE7CisJdHAtPnNraXBiYWNrID0gVFBfREVGX1NLSVBCQUNLOworCXRwLT5leHRfZGV2ID0gVFBfREVGX0VYVF9ERVY7Cit9CisKK2ludCB0cmFja3BvaW50X2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKQoreworCXN0cnVjdCB0cmFja3BvaW50X2RhdGEgKnByaXY7CisJc3RydWN0IHBzMmRldiAqcHMyZGV2ID0gJnBzbW91c2UtPnBzMmRldjsKKwl1bnNpZ25lZCBjaGFyIGZpcm13YXJlX2lkOworCXVuc2lnbmVkIGNoYXIgYnV0dG9uX2luZm87CisJdW5zaWduZWQgY2hhciBwYXJhbVsyXTsKKworCXBhcmFtWzBdID0gcGFyYW1bMV0gPSAwOworCisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIE1BS0VfUFMyX0NNRCgwLCAyLCBUUF9SRUFEX0lEKSkpCisJCXJldHVybiAtMTsKKworCWlmIChwYXJhbVswXSAhPSBUUF9NQUdJQ19JREVOVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFzZXRfcHJvcGVydGllcykKKwkJcmV0dXJuIDA7CisKKwlmaXJtd2FyZV9pZCA9IHBhcmFtWzFdOworCisJaWYgKHRyYWNrcG9pbnRfcmVhZCgmcHNtb3VzZS0+cHMyZGV2LCBUUF9FWFRfQlROLCAmYnV0dG9uX2luZm8pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyYWNrcG9pbnQuYzogZmFpbGVkIHRvIGdldCBleHRlbmRlZCBidXR0b24gZGF0YVxuIik7CisJCWJ1dHRvbl9pbmZvID0gMDsKKwl9CisKKwlwc21vdXNlLT5wcml2YXRlID0gcHJpdiA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmFja3BvaW50X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtMTsKKworCXBzbW91c2UtPnZlbmRvciA9ICJJQk0iOworCXBzbW91c2UtPm5hbWUgPSAiVHJhY2tQb2ludCI7CisKKwlwc21vdXNlLT5yZWNvbm5lY3QgPSB0cmFja3BvaW50X3N5bmM7CisJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IHRyYWNrcG9pbnRfZGlzY29ubmVjdDsKKworCXRyYWNrcG9pbnRfZGVmYXVsdHMocHJpdik7CisJdHJhY2twb2ludF9zeW5jKHBzbW91c2UpOworCisJc3lzZnNfY3JlYXRlX2dyb3VwKCZwczJkZXYtPnNlcmlvLT5kZXYua29iaiwgJnRyYWNrcG9pbnRfYXR0cl9ncm91cCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJJQk0gVHJhY2tQb2ludCBmaXJtd2FyZTogMHglMDJ4LCBidXR0b25zOiAlZC8lZFxuIiwKKwkJZmlybXdhcmVfaWQsIChidXR0b25faW5mbyAmIDB4ZjApID4+IDQsIGJ1dHRvbl9pbmZvICYgMHgwZik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3RyYWNrcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU3ZDhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBJQk0gVHJhY2tQb2ludCBQUy8yIG1vdXNlIGRyaXZlcgorICoKKyAqIFN0ZXBoZW4gRXZhbmNoaWsgPGV2YW5jaHNhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1RSQUNLUE9JTlRfSAorI2RlZmluZSBfVFJBQ0tQT0lOVF9ICisKKy8qCisgKiBUaGVzZSBjb25zdGFudHMgYXJlIGZyb20gdGhlIFRyYWNrUG9pbnQgU3lzdGVtCisgKiBFbmdpbmVlcmluZyBkb2N1bWVudGF0aW9uIFZlcnNpb24gNCBmcm9tIElCTSBXYXRzb24KKyAqIHJlc2VhcmNoOgorICoJaHR0cDovL3d3d2Nzc3J2LmFsbWFkZW4uaWJtLmNvbS90cmFja3BvaW50L2Rvd25sb2FkLmh0bWwKKyAqLworCisjZGVmaW5lIFRQX0NPTU1BTkQJCTB4RTIJLyogQ29tbWFuZHMgc3RhcnQgd2l0aCB0aGlzICovCisKKyNkZWZpbmUgVFBfUkVBRF9JRAkJMHhFMQkvKiBTZW50IGZvciBkZXZpY2UgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgVFBfTUFHSUNfSURFTlQJCTB4MDEJLyogU2VudCBhZnRlciBhIFRQX1JFQURfSUQgZm9sbG93ZWQgKi8KKwkJCQkJLyogYnkgdGhlIGZpcm13YXJlIElEICovCisKKworLyoKKyAqIENvbW1hbmRzCisgKi8KKyNkZWZpbmUgVFBfUkVDQUxJQgkJMHg1MQkvKiBSZWNhbGlicmF0ZSAqLworI2RlZmluZSBUUF9QT1dFUl9ET1dOCQkweDQ0CS8qIENhbiBvbmx5IGJlIHVuZG9uZSB0aHJvdWdoIEhXIHJlc2V0ICovCisjZGVmaW5lIFRQX0VYVF9ERVYJCTB4MjEJLyogRGV0ZXJtaW5lcyBpZiBleHRlcm5hbCBkZXZpY2UgaXMgY29ubmVjdGVkIChSTykgKi8KKyNkZWZpbmUgVFBfRVhUX0JUTgkJMHg0QgkvKiBSZWFkIGV4dGVuZGVkIGJ1dHRvbiBzdGF0dXMgKi8KKyNkZWZpbmUgVFBfUE9SCQkJMHg3RgkvKiBFeGVjdXRlIFBvd2VyIG9uIFJlc2V0ICovCisjZGVmaW5lIFRQX1BPUl9SRVNVTFRTCQkweDI1CS8qIFJlYWQgUG93ZXIgb24gU2VsZiB0ZXN0IHJlc3VsdHMgKi8KKyNkZWZpbmUgVFBfRElTQUJMRV9FWFQJCTB4NDAJLyogRGlzYWJsZSBleHRlcm5hbCBwb2ludGluZyBkZXZpY2UgKi8KKyNkZWZpbmUgVFBfRU5BQkxFX0VYVAkJMHg0MQkvKiBFbmFibGUgZXh0ZXJuYWwgcG9pbnRpbmcgZGV2aWNlICovCisKKy8qCisgKiBNb2RlIG1hbmlwdWxhdGlvbgorICovCisjZGVmaW5lIFRQX1NFVF9TT0ZUX1RSQU5TCTB4NEUJLyogU2V0IG1vZGUgKi8KKyNkZWZpbmUgVFBfQ0FOQ0VMX1NPRlRfVFJBTlMJMHhCOQkvKiBDYW5jZWwgbW9kZSAqLworI2RlZmluZSBUUF9TRVRfSEFSRF9UUkFOUwkweDQ1CS8qIE1vZGUgY2FuIG9ubHkgYmUgc2V0ICovCisKKworLyoKKyAqIFJlZ2lzdGVyIG9yaWVudGVkIGNvbW1hbmRzL3Byb3BlcnRpZXMKKyAqLworI2RlZmluZSBUUF9XUklURV9NRU0JCTB4ODEKKyNkZWZpbmUgVFBfUkVBRF9NRU0JCTB4ODAJLyogTm90IHVzZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorKiBSQU0gTG9jYXRpb25zIGZvciBwcm9wZXJ0aWVzCisgKi8KKyNkZWZpbmUgVFBfU0VOUwkJCTB4NEEJLyogU2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgVFBfTUIJCQkweDRDCS8qIFJlYWQgTWlkZGxlIEJ1dHRvbiBTdGF0dXMgKFJPKSAqLworI2RlZmluZSBUUF9JTkVSVElBCQkweDRECS8qIE5lZ2F0aXZlIEluZXJ0aWEgKi8KKyNkZWZpbmUgVFBfU1BFRUQJCTB4NjAJLyogU3BlZWQgb2YgVFAgQ3Vyc29yICovCisjZGVmaW5lIFRQX1JFQUNICQkweDU3CS8qIEJhY2t1cCBmb3IgWi1heGlzIHByZXNzICovCisjZGVmaW5lIFRQX0RSQUdIWVMJCTB4NTgJLyogRHJhZyBIeXN0ZXJlc2lzICovCisJCQkJCS8qIChob3cgaGFyZCBpdCBpcyB0byBkcmFnICovCisJCQkJCS8qIHdpdGggWi1heGlzIHByZXNzZWQpICovCisKKyNkZWZpbmUgVFBfTUlORFJBRwkJMHg1OQkvKiBNaW5pbXVtIGFtb3VudCBvZiBmb3JjZSBuZWVkZWQgKi8KKwkJCQkJLyogdG8gdHJpZ2dlciBkcmFnZ2luZyAqLworCisjZGVmaW5lIFRQX1RIUkVTSAkJMHg1QwkvKiBNaW5pbXVtIHZhbHVlIGZvciBhIFotYXhpcyBwcmVzcyAqLworI2RlZmluZSBUUF9VUF9USFJFU0gJCTB4NUEJLyogVXNlZCB0byBnZW5lcmF0ZSBhICdjbGljaycgb24gWi1heGlzICovCisjZGVmaW5lIFRQX1pfVElNRQkJMHg1RQkvKiBIb3cgc2hhcnAgb2YgYSBwcmVzcyAqLworI2RlZmluZSBUUF9KRU5LU19DVVJWCQkweDVECS8qIE1pbmltdW0gY3VydmF0dXJlIGZvciBkb3VibGUgY2xpY2sgKi8KKworLyoKKyAqIFRvZ2dsaW5nIEZsYWcgYml0cworICovCisjZGVmaW5lIFRQX1RPR0dMRQkJMHg0NwkvKiBUb2dnbGUgY29tbWFuZCAqLworCisjZGVmaW5lIFRQX1RPR0dMRV9NQgkJMHgyMwkvKiBEaXNhYmxlL0VuYWJsZSBNaWRkbGUgQnV0dG9uICovCisjZGVmaW5lIFRQX01BU0tfTUIJCQkweDAxCisjZGVmaW5lIFRQX1RPR0dMRV9FWFRfREVWCTB4MjMJLyogVG9nZ2xlIGV4dGVybmFsIGRldmljZSAqLworI2RlZmluZSBUUF9NQVNLX0VYVF9ERVYJCQkweDAyCisjZGVmaW5lIFRQX1RPR0dMRV9EUklGVAkJMHgyMwkvKiBEcmlmdCBDb3JyZWN0aW9uICovCisjZGVmaW5lIFRQX01BU0tfRFJJRlQJCQkweDgwCisjZGVmaW5lIFRQX1RPR0dMRV9CVVJTVAkJMHgyOAkvKiBCdXJzdCBNb2RlICovCisjZGVmaW5lIFRQX01BU0tfQlVSU1QJCQkweDgwCisjZGVmaW5lIFRQX1RPR0dMRV9QVFNPTgkJMHgyQwkvKiBQcmVzcyB0byBTZWxlY3QgKi8KKyNkZWZpbmUgVFBfTUFTS19QVFNPTgkJCTB4MDEKKyNkZWZpbmUgVFBfVE9HR0xFX0hBUkRfVFJBTlMJMHgyQwkvKiBBbHRlcm5hdGUgbWV0aG9kIHRvIHNldCBIYXJkIFRyYW5zcGFyZW5jeSAqLworI2RlZmluZSBUUF9NQVNLX0hBUkRfVFJBTlMJCTB4ODAKKyNkZWZpbmUgVFBfVE9HR0xFX1RXT0hBTkQJMHgyRAkvKiBUd28gaGFuZGVkICovCisjZGVmaW5lIFRQX01BU0tfVFdPSEFORAkJCTB4MDEKKyNkZWZpbmUgVFBfVE9HR0xFX1NUSUNLWV9UV08JMHgyRAkvKiBTdGlja3kgdHdvIGhhbmRlZCAqLworI2RlZmluZSBUUF9NQVNLX1NUSUNLWV9UV08JCTB4MDQKKyNkZWZpbmUgVFBfVE9HR0xFX1NLSVBCQUNLCTB4MkQJLyogU3VwcHJlc3MgbW92ZW1lbnQgYWZ0ZXIgZHJhZyByZWxlYXNlICovCisjZGVmaW5lIFRQX01BU0tfU0tJUEJBQ0sJCTB4MDgKKyNkZWZpbmUgVFBfVE9HR0xFX1NPVVJDRV9UQUcJMHgyMAkvKiBCaXQgMyBvZiB0aGUgZmlyc3QgcGFja2V0IHdpbGwgYmUgc2V0IHRvCisJCQkJCSAgIHRvIHRoZSBvcmlnaW4gb2YgdGhlIHBhY2tldCAoZXh0ZXJuYWwgb3IgVFApICovCisjZGVmaW5lIFRQX01BU0tfU09VUkNFX1RBRwkJMHg4MAorI2RlZmluZSBUUF9UT0dHTEVfRVhUX1RBRwkweDIyCS8qIEJpdCAzIG9mIHRoZSBmaXJzdCBwYWNrZXQgY29taW5nIGZyb20gdGhlCisJCQkJCSAgIGV4dGVybmFsIGRldmljZSB3aWxsIGJlIGZvcmNlZCB0byAxICovCisjZGVmaW5lIFRQX01BU0tfRVhUX1RBRwkJCTB4MDQKKworCisvKiBQb3dlciBvbiBTZWxmIFRlc3QgUmVzdWx0cyAqLworI2RlZmluZSBUUF9QT1JfU1VDQ0VTUwkJMHgzQgorCisvKgorICogRGVmYXVsdCBwb3dlciBvbiB2YWx1ZXMKKyAqLworI2RlZmluZSBUUF9ERUZfU0VOUwkJMHg4MAorI2RlZmluZSBUUF9ERUZfSU5FUlRJQQkJMHgwNgorI2RlZmluZSBUUF9ERUZfU1BFRUQJCTB4NjEKKyNkZWZpbmUgVFBfREVGX1JFQUNICQkweDBBCisKKyNkZWZpbmUgVFBfREVGX0RSQUdIWVMJCTB4RkYKKyNkZWZpbmUgVFBfREVGX01JTkRSQUcJCTB4MTQKKworI2RlZmluZSBUUF9ERUZfVEhSRVNICQkweDA4CisjZGVmaW5lIFRQX0RFRl9VUF9USFJFU0gJMHhGRgorI2RlZmluZSBUUF9ERUZfWl9USU1FCQkweDI2CisjZGVmaW5lIFRQX0RFRl9KRU5LU19DVVJWCTB4ODcKKworLyogVG9nZ2xlcyAqLworI2RlZmluZSBUUF9ERUZfTUIJCTB4MDAKKyNkZWZpbmUgVFBfREVGX1BUU09OCQkweDAwCisjZGVmaW5lIFRQX0RFRl9TS0lQQkFDSwkJMHgwMAorI2RlZmluZSBUUF9ERUZfRVhUX0RFVgkJMHgwMQorCisjZGVmaW5lIE1BS0VfUFMyX0NNRChwYXJhbXMsIHJlc3VsdHMsIGNtZCkgKChwYXJhbXM8PDEyKSB8IChyZXN1bHRzPDw4KSB8IChjbWQpKQorCitzdHJ1Y3QgdHJhY2twb2ludF9kYXRhCit7CisJdW5zaWduZWQgY2hhciBzZW5zaXRpdml0eSwgc3BlZWQsIGluZXJ0aWEsIHJlYWNoOworCXVuc2lnbmVkIGNoYXIgZHJhZ2h5cywgbWluZHJhZzsKKwl1bnNpZ25lZCBjaGFyIHRocmVzaCwgdXB0aHJlc2g7CisJdW5zaWduZWQgY2hhciB6dGltZSwgamVua3M7CisKKwl1bnNpZ25lZCBjaGFyIHByZXNzX3RvX3NlbGVjdDsKKwl1bnNpZ25lZCBjaGFyIHNraXBiYWNrOworCisJdW5zaWduZWQgY2hhciBleHRfZGV2OworfTsKKworZXh0ZXJuIGludCB0cmFja3BvaW50X2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKTsKKworI2VuZGlmIC8qIF9UUkFDS1BPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaAppbmRleCBjOWU2MzNkLi45YTkyMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1pby5oCkBAIC02OSwxNiArNjksMTYgQEAKICAqLwogI2lmICFkZWZpbmVkKF9fc2hfXykgJiYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX21pcHNfXykgJiYgIWRlZmluZWQoQ09ORklHX1BQQzY0KQogCWlmICghcmVxdWVzdF9yZWdpb24oSTgwNDJfREFUQV9SRUcsIDE2LCAiaTgwNDIiKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKICAgICAgICAgaTgwNDJfcmVzZXQgPSAxOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpCiAJaWYgKGNoZWNrX2xlZ2FjeV9pb3BvcnQoSTgwNDJfREFUQV9SRUcpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJODA0Ml9EQVRBX1JFRywgMTYsICJpODA0MiIpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaXAyMmlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlwMjJpby5oCmluZGV4IDg2M2I5YzkuLmVlMWFkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaXAyMmlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1pcDIyaW8uaApAQCAtNTgsNyArNTgsNyBAQAogI2lmIDAKIAkvKiBYWFggc2dpX2toIGlzIGEgdmlydHVhbCBhZGRyZXNzICovCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oc2dpX2toLCBzaXplb2Yoc3RydWN0IGhwY19rZXliKSwgImk4MDQyIikpCi0JCXJldHVybiAxOworCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKIAlpODA0Ml9yZXNldCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWphenppby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1qYXp6aW8uaAppbmRleCA1YzIwYWIxLi4xM2ZkNzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWphenppby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItamF6emlvLmgKQEAgLTUzLDcgKzUzLDcgQEAKICNpZiAwCiAJLyogWFhYIEpBWlpfS0VZQk9BUkRfQUREUkVTUyBpcyBhIHZpcnR1YWwgYWRkcmVzcyAqLwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKEpBWlpfS0VZQk9BUkRfQUREUkVTUywgMiwgImk4MDQyIikpCi0JCXJldHVybiAxOworCQlyZXR1cm4gLUVCVVNZOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmgKaW5kZXggZGEyYTE5OC4uZWQ5NDQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmgKQEAgLTQ4LDEwICs0OCwxMCBAQAogI2RlZmluZSBPQlBfUFMyTVNfTkFNRTEJCSJrZG1vdXNlIgogI2RlZmluZSBPQlBfUFMyTVNfTkFNRTIJCSJtb3VzZSIKIAotc3RhdGljIGludCBpODA0Ml9wbGF0Zm9ybV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9wbGF0Zm9ybV9pbml0KHZvaWQpCiB7CiAjaWZuZGVmIENPTkZJR19QQ0kKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FTk9ERVY7CiAjZWxzZQogCWNoYXIgcHJvcFsxMjhdOwogCWludCBsZW47CkBAIC01OSwxNCArNTksMTQgQEAKIAlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHByb21fcm9vdF9ub2RlLCAibmFtZSIsIHByb3AsIHNpemVvZihwcm9wKSk7CiAJaWYgKGxlbiA8IDApIHsKIAkJcHJpbnRrKCJpODA0MjogQ2Fubm90IGdldCBuYW1lIHByb3BlcnR5IG9mIHJvb3QgT0JQIG5vZGUuXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKHN0cm5jbXAocHJvcCwgIlNVTlcsSmF2YVN0YXRpb24tMSIsIGxlbikgPT0gMCkgewogCQkvKiBIYXJkY29kZWQgdmFsdWVzIGZvciBNckNvZmZlZS4gICovCiAJCWk4MDQyX2tiZF9pcnEgPSBpODA0Ml9hdXhfaXJxID0gMTMgfCAweDIwOwogCQlrYmRfaW9iYXNlID0gaW9yZW1hcCgweDcxMzAwMDYwLCA4KTsKIAkJaWYgKCFrYmRfaW9iYXNlKQotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGxpbnV4X2VidXMgKmVidXM7CiAJCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldjsKQEAgLTc4LDcgKzc4LDcgQEAKIAkJCQkJZ290byBlZGV2X2ZvdW5kOwogCQkJfQogCQl9Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAllZGV2X2ZvdW5kOgogCQlmb3JfZWFjaF9lZGV2Y2hpbGQoZWRldiwgY2hpbGQpIHsKQEAgLTk2LDcgKzk2LDcgQEAKIAkJICAgIGk4MDQyX2F1eF9pcnEgPT0gLTEpIHsKIAkJCXByaW50aygiaTgwNDI6IEVycm9yLCA4MDQyIGRldmljZSBsYWNrcyBib3RoIGtiZCBhbmQgIgogCQkJICAgICAgICJtb3VzZSBub2Rlcy5cbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCmluZGV4IDAzODc3YzguLjI3M2JiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaApAQCAtMTM4LDYgKzEzOCwxMyBAQAogCQl9LAogCX0sCiAJeworCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIExpZmVib29rIEU0MDEwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTElGRUJPT0sgRTQwMTAiKSwKKwkJfSwKKwl9LAorCXsKIAkJLmlkZW50ID0gIlRvc2hpYmEgUDEwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCkBAIC0yNTYsOSArMjYzLDEwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGk4MDQyX3BucF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9wbnBfaW5pdCh2b2lkKQogewotCWludCByZXN1bHRfa2JkLCByZXN1bHRfYXV4OworCWludCByZXN1bHRfa2JkID0gMCwgcmVzdWx0X2F1eCA9IDA7CisJY2hhciBrYmRfaXJxX3N0cls0XSA9IHsgMCB9LCBhdXhfaXJxX3N0cls0XSA9IHsgMCB9OwogCiAJaWYgKGk4MDQyX25vcG5wKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImk4MDQyOiBQTlAgZGV0ZWN0aW9uIGRpc2FibGVkXG4iKTsKQEAgLTI2Nyw2ICsyNzUsNyBAQAogCiAJaWYgKChyZXN1bHRfa2JkID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaTgwNDJfcG5wX2tiZF9kcml2ZXIpKSA+PSAwKQogCQlpODA0Ml9wbnBfa2JkX3JlZ2lzdGVyZWQgPSAxOworCiAJaWYgKChyZXN1bHRfYXV4ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaTgwNDJfcG5wX2F1eF9kcml2ZXIpKSA+PSAwKQogCQlpODA0Ml9wbnBfYXV4X3JlZ2lzdGVyZWQgPSAxOwogCkBAIC0yODAsNiArMjg5LDI3IEBACiAjZW5kaWYKIAl9CiAKKwlpZiAocmVzdWx0X2tiZCA+IDApCisJCXNucHJpbnRmKGtiZF9pcnFfc3RyLCBzaXplb2Yoa2JkX2lycV9zdHIpLAorCQkJIiVkIiwgaTgwNDJfcG5wX2tiZF9pcnEpOworCWlmIChyZXN1bHRfYXV4ID4gMCkKKwkJc25wcmludGYoYXV4X2lycV9zdHIsIHNpemVvZihhdXhfaXJxX3N0ciksCisJCQkiJWQiLCBpODA0Ml9wbnBfYXV4X2lycSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTlA6IFBTLzIgQ29udHJvbGxlciBbJXMlcyVzXSBhdCAlI3gsJSN4IGlycSAlcyVzJXNcbiIsCisJCWk4MDQyX3BucF9rYmRfbmFtZSwgKHJlc3VsdF9rYmQgPiAwICYmIHJlc3VsdF9hdXggPiAwKSA/ICIsIiA6ICIiLAorCQlpODA0Ml9wbnBfYXV4X25hbWUsCisJCWk4MDQyX3BucF9kYXRhX3JlZywgaTgwNDJfcG5wX2NvbW1hbmRfcmVnLAorCQlrYmRfaXJxX3N0ciwgKHJlc3VsdF9rYmQgPiAwICYmIHJlc3VsdF9hdXggPiAwKSA/ICIsIiA6ICIiLAorCQlhdXhfaXJxX3N0cik7CisKKyNpZiBkZWZpbmVkKF9faWE2NF9fKQorCWlmIChyZXN1bHRfa2JkIDw9IDApCisJCWk4MDQyX25va2JkID0gMTsKKwlpZiAocmVzdWx0X2F1eCA8PSAwKQorCQlpODA0Ml9ub2F1eCA9IDE7CisjZW5kaWYKKwogCWlmICgoKGk4MDQyX3BucF9kYXRhX3JlZyAmIH4weGYpID09IChpODA0Ml9kYXRhX3JlZyAmIH4weGYpICYmCiAJICAgICAgaTgwNDJfcG5wX2RhdGFfcmVnICE9IGk4MDQyX2RhdGFfcmVnKSB8fCAhaTgwNDJfcG5wX2RhdGFfcmVnKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBOUDogUFMvMiBjb250cm9sbGVyIGhhcyBpbnZhbGlkIGRhdGEgcG9ydCAlI3g7IHVzaW5nIGRlZmF1bHQgJSN4XG4iLApAQCAtMjk0LDUzICszMjQsNDcgQEAKIAkJaTgwNDJfcG5wX2NvbW1hbmRfcmVnID0gaTgwNDJfY29tbWFuZF9yZWc7CiAJfQogCi0JaWYgKCFpODA0Ml9wbnBfa2JkX2lycSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQTlA6IFBTLzIgY29udHJvbGxlciBkb2Vzbid0IGhhdmUgS0JEIGlycTsgdXNpbmcgZGVmYXVsdCAlI3hcbiIsIGk4MDQyX2tiZF9pcnEpOworCWlmICghaTgwNDJfbm9rYmQgJiYgIWk4MDQyX3BucF9rYmRfaXJxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBOUDogUFMvMiBjb250cm9sbGVyIGRvZXNuJ3QgaGF2ZSBLQkQgaXJxOyB1c2luZyBkZWZhdWx0ICVkXG4iLCBpODA0Ml9rYmRfaXJxKTsKIAkJaTgwNDJfcG5wX2tiZF9pcnEgPSBpODA0Ml9rYmRfaXJxOwogCX0KIAotCWlmICghaTgwNDJfcG5wX2F1eF9pcnEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUE5QOiBQUy8yIGNvbnRyb2xsZXIgZG9lc24ndCBoYXZlIEFVWCBpcnE7IHVzaW5nIGRlZmF1bHQgJSN4XG4iLCBpODA0Ml9hdXhfaXJxKTsKKwlpZiAoIWk4MDQyX25vYXV4ICYmICFpODA0Ml9wbnBfYXV4X2lycSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQTlA6IFBTLzIgY29udHJvbGxlciBkb2Vzbid0IGhhdmUgQVVYIGlycTsgdXNpbmcgZGVmYXVsdCAlZFxuIiwgaTgwNDJfYXV4X2lycSk7CiAJCWk4MDQyX3BucF9hdXhfaXJxID0gaTgwNDJfYXV4X2lycTsKIAl9CiAKLSNpZiBkZWZpbmVkKF9faWE2NF9fKQotCWlmIChyZXN1bHRfYXV4IDw9IDApCi0JCWk4MDQyX25vYXV4ID0gMTsKLSNlbmRpZgotCiAJaTgwNDJfZGF0YV9yZWcgPSBpODA0Ml9wbnBfZGF0YV9yZWc7CiAJaTgwNDJfY29tbWFuZF9yZWcgPSBpODA0Ml9wbnBfY29tbWFuZF9yZWc7CiAJaTgwNDJfa2JkX2lycSA9IGk4MDQyX3BucF9rYmRfaXJxOwogCWk4MDQyX2F1eF9pcnEgPSBpODA0Ml9wbnBfYXV4X2lycTsKIAotCXByaW50ayhLRVJOX0lORk8gIlBOUDogUFMvMiBDb250cm9sbGVyIFslcyVzJXNdIGF0ICUjeCwlI3ggaXJxICVkJXMlZFxuIiwKLQkJaTgwNDJfcG5wX2tiZF9uYW1lLCAocmVzdWx0X2tiZCA+IDAgJiYgcmVzdWx0X2F1eCA+IDApID8gIiwiIDogIiIsIGk4MDQyX3BucF9hdXhfbmFtZSwKLQkJaTgwNDJfZGF0YV9yZWcsIGk4MDQyX2NvbW1hbmRfcmVnLCBpODA0Ml9rYmRfaXJxLAotCQkocmVzdWx0X2F1eCA+IDApID8gIiwiIDogIiIsIGk4MDQyX2F1eF9pcnEpOwotCiAJcmV0dXJuIDA7CiB9CiAKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpODA0Ml9wbnBfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaTgwNDJfcG5wX2V4aXQodm9pZCkgeyB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgaTgwNDJfcGxhdGZvcm1faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaTgwNDJfcGxhdGZvcm1faW5pdCh2b2lkKQogeworCWludCByZXR2YWw7CisKIC8qCiAgKiBPbiBpeDg2IHBsYXRmb3JtcyB0b3VjaGluZyB0aGUgaTgwNDIgZGF0YSByZWdpc3RlciByZWdpb24gY2FuIGRvIHJlYWxseQogICogYmFkIHRoaW5ncy4gQmVjYXVzZSBvZiB0aGlzIHRoZSByZWdpb24gaXMgYWx3YXlzIHJlc2VydmVkIG9uIGl4ODYgYm94ZXMuCiAgKgogICoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJODA0Ml9EQVRBX1JFRywgMTYsICJpODA0MiIpKQotICoJCXJldHVybiAtMTsKKyAqCQlyZXR1cm4gLUVCVVNZOwogICovCiAKIAlpODA0Ml9rYmRfaXJxID0gSTgwNDJfTUFQX0lSUSgxKTsKIAlpODA0Ml9hdXhfaXJxID0gSTgwNDJfTUFQX0lSUSgxMik7CiAKLSNpZmRlZiBDT05GSUdfUE5QCi0JaWYgKGk4MDQyX3BucF9pbml0KCkpCi0JCXJldHVybiAtMTsKLSNlbmRpZgorCXJldHZhbCA9IGk4MDQyX3BucF9pbml0KCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAogI2lmIGRlZmluZWQoX19pYTY0X18pCiAgICAgICAgIGk4MDQyX3Jlc2V0ID0gMTsKQEAgLTM1NCwxNCArMzc4LDEyIEBACiAJCWk4MDQyX25vbXV4ID0gMTsKICNlbmRpZgogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGk4MDQyX3BsYXRmb3JtX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUE5QCiAJaTgwNDJfcG5wX2V4aXQoKTsKLSNlbmRpZgogfQogCiAjZW5kaWYgLyogX0k4MDQyX1g4NklBNjRJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKaW5kZXggNzA4YTFkMy4uNDBkNDUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwpAQCAtMjcsNiArMjcsMTAgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaTgwNDIga2V5Ym9hcmQgYW5kIG1vdXNlIGNvbnRyb2xsZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTgwNDJfbm9rYmQ7Cittb2R1bGVfcGFyYW1fbmFtZWQobm9rYmQsIGk4MDQyX25va2JkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9rYmQsICJEbyBub3QgcHJvYmUgb3IgdXNlIEtCRCBwb3J0LiIpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IGk4MDQyX25vYXV4OwogbW9kdWxlX3BhcmFtX25hbWVkKG5vYXV4LCBpODA0Ml9ub2F1eCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vYXV4LCAiRG8gbm90IHByb2JlIG9yIHVzZSBBVVggKG1vdXNlKSBwb3J0LiIpOwpAQCAtMzM4LDEwICszNDIsMTAgQEAKIAogCXJldHVybiAwOwogCi1hY3RpdmF0ZV9mYWlsOgorIGFjdGl2YXRlX2ZhaWw6CiAJZnJlZV9pcnEocG9ydC0+aXJxLCBpODA0Ml9yZXF1ZXN0X2lycV9jb29raWUpOwogCi1pcnFfZmFpbDoKKyBpcnFfZmFpbDoKIAlzZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZChzZXJpbyk7CiAKIAlyZXR1cm4gLTE7CkBAIC00ODUsNyArNDg5LDcgQEAKIAkJc2VyaW9faW50ZXJydXB0KHBvcnQtPnNlcmlvLCBkYXRhLCBkZmwsIHJlZ3MpOwogCiAJcmV0ID0gMTsKLW91dDoKKyBvdXQ6CiAJcmV0dXJuIElSUV9SRVRWQUwocmV0KTsKIH0KIApAQCAtNTUyLDcgKzU1Niw3IEBACiAgKiBFbmFibGUgYWxsIG11eGVkIHBvcnRzLgogICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEk4MDQyX05VTV9NVVhfUE9SVFM7IGkrKykgewogCQlpODA0Ml9jb21tYW5kKCZwYXJhbSwgSTgwNDJfQ01EX01VWF9QRlggKyBpKTsKIAkJaTgwNDJfY29tbWFuZCgmcGFyYW0sIEk4MDQyX0NNRF9BVVhfRU5BQkxFKTsKIAl9CkBAIC02ODIsNyArNjg2LDcgQEAKIAkJa2ZyZWUocG9ydC0+c2VyaW8pOwogCQlwb3J0LT5zZXJpbyA9IE5VTEw7CiAJCWk4MDQyX2N0ciB8PSBwb3J0LT5kaXNhYmxlOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gInNlcmlvOiBpODA0MiAlcyBwb3J0IGF0ICUjbHgsJSNseCBpcnEgJWRcbiIsCkBAIC05NzcsODUgKzk4MSw4OCBAQAogCS5zaHV0ZG93bgk9IGk4MDQyX3NodXRkb3duLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGk4MDQyX2NyZWF0ZV9rYmRfcG9ydCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaTgwNDJfY3JlYXRlX2tiZF9wb3J0KHZvaWQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbzsKIAlzdHJ1Y3QgaTgwNDJfcG9ydCAqcG9ydCA9ICZpODA0Ml9wb3J0c1tJODA0Ml9LQkRfUE9SVF9OT107CiAKLQlzZXJpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwotCWlmIChzZXJpbykgewotCQltZW1zZXQoc2VyaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaW8pKTsKLQkJc2VyaW8tPmlkLnR5cGUJCT0gaTgwNDJfZGlyZWN0ID8gU0VSSU9fODA0MiA6IFNFUklPXzgwNDJfWEw7Ci0JCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9kdW1ia2JkID8gTlVMTCA6IGk4MDQyX2tiZF93cml0ZTsKLQkJc2VyaW8tPm9wZW4JCT0gaTgwNDJfb3BlbjsKLQkJc2VyaW8tPmNsb3NlCQk9IGk4MDQyX2Nsb3NlOwotCQlzZXJpby0+c3RhcnQJCT0gaTgwNDJfc3RhcnQ7Ci0JCXNlcmlvLT5zdG9wCQk9IGk4MDQyX3N0b3A7Ci0JCXNlcmlvLT5wb3J0X2RhdGEJPSBwb3J0OwotCQlzZXJpby0+ZGV2LnBhcmVudAk9ICZpODA0Ml9wbGF0Zm9ybV9kZXZpY2UtPmRldjsKLQkJc3RybGNweShzZXJpby0+bmFtZSwgImk4MDQyIEtiZCBQb3J0Iiwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7Ci0JCXN0cmxjcHkoc2VyaW8tPnBoeXMsIEk4MDQyX0tCRF9QSFlTX0RFU0MsIHNpemVvZihzZXJpby0+cGh5cykpOworCXNlcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJpbykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJcG9ydC0+c2VyaW8gPSBzZXJpbzsKLQkJaTgwNDJfcG9ydF9yZWdpc3Rlcihwb3J0KTsKLQl9CisJc2VyaW8tPmlkLnR5cGUJCT0gaTgwNDJfZGlyZWN0ID8gU0VSSU9fODA0MiA6IFNFUklPXzgwNDJfWEw7CisJc2VyaW8tPndyaXRlCQk9IGk4MDQyX2R1bWJrYmQgPyBOVUxMIDogaTgwNDJfa2JkX3dyaXRlOworCXNlcmlvLT5vcGVuCQk9IGk4MDQyX29wZW47CisJc2VyaW8tPmNsb3NlCQk9IGk4MDQyX2Nsb3NlOworCXNlcmlvLT5zdGFydAkJPSBpODA0Ml9zdGFydDsKKwlzZXJpby0+c3RvcAkJPSBpODA0Ml9zdG9wOworCXNlcmlvLT5wb3J0X2RhdGEJPSBwb3J0OworCXNlcmlvLT5kZXYucGFyZW50CT0gJmk4MDQyX3BsYXRmb3JtX2RldmljZS0+ZGV2OworCXN0cmxjcHkoc2VyaW8tPm5hbWUsICJpODA0MiBLYmQgUG9ydCIsIHNpemVvZihzZXJpby0+bmFtZSkpOworCXN0cmxjcHkoc2VyaW8tPnBoeXMsIEk4MDQyX0tCRF9QSFlTX0RFU0MsIHNpemVvZihzZXJpby0+cGh5cykpOworCisJcG9ydC0+c2VyaW8gPSBzZXJpbzsKKworCXJldHVybiBpODA0Ml9wb3J0X3JlZ2lzdGVyKHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaTgwNDJfY3JlYXRlX2F1eF9wb3J0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9jcmVhdGVfYXV4X3BvcnQodm9pZCkKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwogCXN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0ID0gJmk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXTsKIAotCXNlcmlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNlcmlvKSB7Ci0JCW1lbXNldChzZXJpbywgMCwgc2l6ZW9mKHN0cnVjdCBzZXJpbykpOwotCQlzZXJpby0+aWQudHlwZQkJPSBTRVJJT184MDQyOwotCQlzZXJpby0+d3JpdGUJCT0gaTgwNDJfYXV4X3dyaXRlOwotCQlzZXJpby0+b3BlbgkJPSBpODA0Ml9vcGVuOwotCQlzZXJpby0+Y2xvc2UJCT0gaTgwNDJfY2xvc2U7Ci0JCXNlcmlvLT5zdGFydAkJPSBpODA0Ml9zdGFydDsKLQkJc2VyaW8tPnN0b3AJCT0gaTgwNDJfc3RvcDsKLQkJc2VyaW8tPnBvcnRfZGF0YQk9IHBvcnQ7Ci0JCXNlcmlvLT5kZXYucGFyZW50CT0gJmk4MDQyX3BsYXRmb3JtX2RldmljZS0+ZGV2OwotCQlzdHJsY3B5KHNlcmlvLT5uYW1lLCAiaTgwNDIgQXV4IFBvcnQiLCBzaXplb2Yoc2VyaW8tPm5hbWUpKTsKLQkJc3RybGNweShzZXJpby0+cGh5cywgSTgwNDJfQVVYX1BIWVNfREVTQywgc2l6ZW9mKHNlcmlvLT5waHlzKSk7CisJc2VyaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcmlvKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQlwb3J0LT5zZXJpbyA9IHNlcmlvOwotCQlpODA0Ml9wb3J0X3JlZ2lzdGVyKHBvcnQpOwotCX0KKwlzZXJpby0+aWQudHlwZQkJPSBTRVJJT184MDQyOworCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9hdXhfd3JpdGU7CisJc2VyaW8tPm9wZW4JCT0gaTgwNDJfb3BlbjsKKwlzZXJpby0+Y2xvc2UJCT0gaTgwNDJfY2xvc2U7CisJc2VyaW8tPnN0YXJ0CQk9IGk4MDQyX3N0YXJ0OworCXNlcmlvLT5zdG9wCQk9IGk4MDQyX3N0b3A7CisJc2VyaW8tPnBvcnRfZGF0YQk9IHBvcnQ7CisJc2VyaW8tPmRldi5wYXJlbnQJPSAmaTgwNDJfcGxhdGZvcm1fZGV2aWNlLT5kZXY7CisJc3RybGNweShzZXJpby0+bmFtZSwgImk4MDQyIEF1eCBQb3J0Iiwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7CisJc3RybGNweShzZXJpby0+cGh5cywgSTgwNDJfQVVYX1BIWVNfREVTQywgc2l6ZW9mKHNlcmlvLT5waHlzKSk7CisKKwlwb3J0LT5zZXJpbyA9IHNlcmlvOworCisJcmV0dXJuIGk4MDQyX3BvcnRfcmVnaXN0ZXIocG9ydCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpODA0Ml9jcmVhdGVfbXV4X3BvcnQoaW50IGluZGV4KQorc3RhdGljIGludCBfX2luaXQgaTgwNDJfY3JlYXRlX211eF9wb3J0KGludCBpbmRleCkKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwogCXN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0ID0gJmk4MDQyX3BvcnRzW0k4MDQyX01VWF9QT1JUX05PICsgaW5kZXhdOwogCi0Jc2VyaW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2VyaW8pIHsKLQkJbWVtc2V0KHNlcmlvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlvKSk7Ci0JCXNlcmlvLT5pZC50eXBlCQk9IFNFUklPXzgwNDI7Ci0JCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9hdXhfd3JpdGU7Ci0JCXNlcmlvLT5vcGVuCQk9IGk4MDQyX29wZW47Ci0JCXNlcmlvLT5jbG9zZQkJPSBpODA0Ml9jbG9zZTsKLQkJc2VyaW8tPnN0YXJ0CQk9IGk4MDQyX3N0YXJ0OwotCQlzZXJpby0+c3RvcAkJPSBpODA0Ml9zdG9wOwotCQlzZXJpby0+cG9ydF9kYXRhCT0gcG9ydDsKLQkJc2VyaW8tPmRldi5wYXJlbnQJPSAmaTgwNDJfcGxhdGZvcm1fZGV2aWNlLT5kZXY7Ci0JCXNucHJpbnRmKHNlcmlvLT5uYW1lLCBzaXplb2Yoc2VyaW8tPm5hbWUpLCAiaTgwNDIgQXV4LSVkIFBvcnQiLCBpbmRleCk7Ci0JCXNucHJpbnRmKHNlcmlvLT5waHlzLCBzaXplb2Yoc2VyaW8tPnBoeXMpLCBJODA0Ml9NVVhfUEhZU19ERVNDLCBpbmRleCArIDEpOworCXNlcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJpbykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJKnBvcnQgPSBpODA0Ml9wb3J0c1tJODA0Ml9BVVhfUE9SVF9OT107Ci0JCXBvcnQtPmV4aXN0cyA9IDA7Ci0JCXNucHJpbnRmKHBvcnQtPm5hbWUsIHNpemVvZihwb3J0LT5uYW1lKSwgIkFVWCVkIiwgaW5kZXgpOwotCQlwb3J0LT5tdXggPSBpbmRleDsKLQkJcG9ydC0+c2VyaW8gPSBzZXJpbzsKLQkJaTgwNDJfcG9ydF9yZWdpc3Rlcihwb3J0KTsKLQl9CisJc2VyaW8tPmlkLnR5cGUJCT0gU0VSSU9fODA0MjsKKwlzZXJpby0+d3JpdGUJCT0gaTgwNDJfYXV4X3dyaXRlOworCXNlcmlvLT5vcGVuCQk9IGk4MDQyX29wZW47CisJc2VyaW8tPmNsb3NlCQk9IGk4MDQyX2Nsb3NlOworCXNlcmlvLT5zdGFydAkJPSBpODA0Ml9zdGFydDsKKwlzZXJpby0+c3RvcAkJPSBpODA0Ml9zdG9wOworCXNlcmlvLT5wb3J0X2RhdGEJPSBwb3J0OworCXNlcmlvLT5kZXYucGFyZW50CT0gJmk4MDQyX3BsYXRmb3JtX2RldmljZS0+ZGV2OworCXNucHJpbnRmKHNlcmlvLT5uYW1lLCBzaXplb2Yoc2VyaW8tPm5hbWUpLCAiaTgwNDIgQXV4LSVkIFBvcnQiLCBpbmRleCk7CisJc25wcmludGYoc2VyaW8tPnBoeXMsIHNpemVvZihzZXJpby0+cGh5cyksIEk4MDQyX01VWF9QSFlTX0RFU0MsIGluZGV4ICsgMSk7CisKKwkqcG9ydCA9IGk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXTsKKwlwb3J0LT5leGlzdHMgPSAwOworCXNucHJpbnRmKHBvcnQtPm5hbWUsIHNpemVvZihwb3J0LT5uYW1lKSwgIkFVWCVkIiwgaW5kZXgpOworCXBvcnQtPm11eCA9IGluZGV4OworCXBvcnQtPnNlcmlvID0gc2VyaW87CisKKwlyZXR1cm4gaTgwNDJfcG9ydF9yZWdpc3Rlcihwb3J0KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaTgwNDJfaW5pdCh2b2lkKQogewotCWludCBpOworCWludCBpLCBoYXZlX3BvcnRzID0gMDsKIAlpbnQgZXJyOwogCiAJZGJnX2luaXQoKTsKQEAgLTEwNjMsNDMgKzEwNzAsNzMgQEAKIAlpbml0X3RpbWVyKCZpODA0Ml90aW1lcik7CiAJaTgwNDJfdGltZXIuZnVuY3Rpb24gPSBpODA0Ml90aW1lcl9mdW5jOwogCi0JaWYgKGk4MDQyX3BsYXRmb3JtX2luaXQoKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwllcnIgPSBpODA0Ml9wbGF0Zm9ybV9pbml0KCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXS5pcnEgPSBJODA0Ml9BVVhfSVJROwogCWk4MDQyX3BvcnRzW0k4MDQyX0tCRF9QT1JUX05PXS5pcnEgPSBJODA0Ml9LQkRfSVJROwogCiAJaWYgKGk4MDQyX2NvbnRyb2xsZXJfaW5pdCgpKSB7Ci0JCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3BsYXRmb3JtX2V4aXQ7CiAJfQogCiAJZXJyID0gZHJpdmVyX3JlZ2lzdGVyKCZpODA0Ml9kcml2ZXIpOwotCWlmIChlcnIpIHsKLQkJaTgwNDJfcGxhdGZvcm1fZXhpdCgpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jb250cm9sbGVyX2NsZWFudXA7CiAKIAlpODA0Ml9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJpODA0MiIsIC0xLCBOVUxMLCAwKTsKIAlpZiAoSVNfRVJSKGk4MDQyX3BsYXRmb3JtX2RldmljZSkpIHsKLQkJZHJpdmVyX3VucmVnaXN0ZXIoJmk4MDQyX2RyaXZlcik7Ci0JCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKLQkJcmV0dXJuIFBUUl9FUlIoaTgwNDJfcGxhdGZvcm1fZGV2aWNlKTsKKwkJZXJyID0gUFRSX0VSUihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RyaXZlcjsKIAl9CiAKIAlpZiAoIWk4MDQyX25vYXV4ICYmICFpODA0Ml9jaGVja19hdXgoKSkgewotCQlpZiAoIWk4MDQyX25vbXV4ICYmICFpODA0Ml9jaGVja19tdXgoKSkKLQkJCWZvciAoaSA9IDA7IGkgPCBJODA0Ml9OVU1fTVVYX1BPUlRTOyBpKyspCi0JCQkJaTgwNDJfY3JlYXRlX211eF9wb3J0KGkpOwotCQllbHNlCi0JCQlpODA0Ml9jcmVhdGVfYXV4X3BvcnQoKTsKKwkJaWYgKCFpODA0Ml9ub211eCAmJiAhaTgwNDJfY2hlY2tfbXV4KCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBJODA0Ml9OVU1fTVVYX1BPUlRTOyBpKyspIHsKKwkJCQllcnIgPSBpODA0Ml9jcmVhdGVfbXV4X3BvcnQoaSk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJfdW5yZWdpc3Rlcl9wb3J0czsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVyciA9IGk4MDQyX2NyZWF0ZV9hdXhfcG9ydCgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycl91bnJlZ2lzdGVyX3BvcnRzOworCQl9CisJCWhhdmVfcG9ydHMgPSAxOwogCX0KIAotCWk4MDQyX2NyZWF0ZV9rYmRfcG9ydCgpOworCWlmICghaTgwNDJfbm9rYmQpIHsKKwkJZXJyID0gaTgwNDJfY3JlYXRlX2tiZF9wb3J0KCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl91bnJlZ2lzdGVyX3BvcnRzOworCQloYXZlX3BvcnRzID0gMTsKKwl9CisKKwlpZiAoIWhhdmVfcG9ydHMpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kZXZpY2U7CisJfQogCiAJbW9kX3RpbWVyKCZpODA0Ml90aW1lciwgamlmZmllcyArIEk4MDQyX1BPTExfUEVSSU9EKTsKIAogCXJldHVybiAwOworCisgZXJyX3VucmVnaXN0ZXJfcG9ydHM6CisJZm9yIChpID0gMDsgaSA8IEk4MDQyX05VTV9QT1JUUzsgaSsrKQorCQlpZiAoaTgwNDJfcG9ydHNbaV0uc2VyaW8pCisJCQlzZXJpb191bnJlZ2lzdGVyX3BvcnQoaTgwNDJfcG9ydHNbaV0uc2VyaW8pOworIGVycl91bnJlZ2lzdGVyX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpOworIGVycl91bnJlZ2lzdGVyX2RyaXZlcjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmaTgwNDJfZHJpdmVyKTsKKyBlcnJfY29udHJvbGxlcl9jbGVhbnVwOgorCWk4MDQyX2NvbnRyb2xsZXJfY2xlYW51cCgpOworIGVycl9wbGF0Zm9ybV9leGl0OgorCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpODA0Ml9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcnBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCmluZGV4IDc5Y2EzODQuLjFiZDg4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc2VycG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzZXJwb3J0KSwgR0ZQX0tFUk5FTCk7CisJc2VycG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJwb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJwb3J0KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTY1LDcgKzE2NSw3IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VSUE9SVF9CVVNZLCAmc2VycG9ydC0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0Jc2VycG9ydC0+c2VyaW8gPSBzZXJpbyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOworCXNlcnBvcnQtPnNlcmlvID0gc2VyaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNlcmlvKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jCmluZGV4IDNmOGI2MWMuLjVkMTkyNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY29yZ2lfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMKQEAgLTUzLDExICs1Myw4IEBACiAKICNkZWZpbmUgU3luY0hTKCkJd2hpbGUoKFNUQVRVU19IU1lOQykgPT0gMCk7IHdoaWxlKChTVEFUVVNfSFNZTkMpICE9IDApOwogI2RlZmluZSBDQ05UKGEpCQlhc20gdm9sYXRpbGUgKCJtcmMgcDE0LCAwLCAlMCwgQzEsIEMwLCAwIiA6ICI9ciIoYSkpCi0jZGVmaW5lIENDTlRfT04oKQl7aW50IHBtbmMgPSAxOyBhc20gdm9sYXRpbGUgKCJtY3IgcDE0LCAwLCAlMCwgQzAsIEMwLCAwIiA6IDogInIiKHBtbmMpKTt9Ci0jZGVmaW5lIENDTlRfT0ZGKCkJe2ludCBwbW5jID0gMDsgYXNtIHZvbGF0aWxlICgibWNyIHAxNCwgMCwgJTAsIEMwLCBDMCwgMCIgOiA6ICJyIihwbW5jKSk7fQotCi0jZGVmaW5lIFdBSVRfSFNfNDAwX1ZHQQkJNzAxM1UJLy8gMTcuNjE1dXMKLSNkZWZpbmUgV0FJVF9IU180MDBfUVZHQQkxNjYyMlUJLy8gNDEuNzUwdXMKKyNkZWZpbmUgUE1OQ19HRVQoeCkJYXNtIHZvbGF0aWxlICgibXJjIHAxNCwgMCwgJTAsIEMwLCBDMCwgMCIgOiAiPXIiKHgpKQorI2RlZmluZSBQTU5DX1NFVCh4KQlhc20gdm9sYXRpbGUgKCJtY3IgcDE0LCAwLCAlMCwgQzAsIEMwLCAwIiA6IDogInIiKHgpKQogCiAKIC8qIEFEUzc4NDYgVG91Y2ggU2NyZWVuIENvbnRyb2xsZXIgYml0IGRlZmluaXRpb25zICovCkBAIC02OSw0MSArNjYsMjkgQEAKICNkZWZpbmUgQURTQ1RSTF9TVFMJCSgxdSA8PCA3KQkvKiBTdGFydCBCaXQgKi8KIAogLyogRXh0ZXJuYWwgRnVuY3Rpb25zICovCi1leHRlcm4gaW50IHcxMDBmYl9nZXRfeHJlcyh2b2lkKTsKLWV4dGVybiBpbnQgdzEwMGZiX2dldF9ibGFua2luZyh2b2lkKTsKLWV4dGVybiBpbnQgdzEwMGZiX2dldF9mYXN0c3lzY2xrKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdzEwMGZiX2dldF9oc3luY2xlbihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooaW50IGluZm8pOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX3dhaXR0aW1lKHZvaWQpCiB7Ci0JaW50IHcxMDBmYl94cmVzID0gdzEwMGZiX2dldF94cmVzKCk7Ci0JdW5zaWduZWQgaW50IHdhaXR0aW1lID0gMDsKKwl1bnNpZ25lZCBsb25nIGhzeW5jX2xlbiA9IHcxMDBmYl9nZXRfaHN5bmNsZW4oJmNvcmdpZmJfZGV2aWNlLmRldik7CiAKLQlpZiAodzEwMGZiX3hyZXMgPT0gNDgwIHx8IHcxMDBmYl94cmVzID09IDY0MCkgewotCQl3YWl0dGltZSA9IFdBSVRfSFNfNDAwX1ZHQSAqIGdldF9jbGtfZnJlcXVlbmN5X2toeigwKSAvIDM5ODEzMVU7Ci0KLQkJaWYgKHcxMDBmYl9nZXRfZmFzdHN5c2NsaygpID09IDEwMCkKLQkJCXdhaXR0aW1lID0gd2FpdHRpbWUgKiA3NSAvIDEwMDsKLQotCQlpZiAodzEwMGZiX3hyZXMgPT0gNjQwKQotCQkJd2FpdHRpbWUgKj0gMzsKLQotCQlyZXR1cm4gd2FpdHRpbWU7Ci0JfQotCi0JcmV0dXJuIFdBSVRfSFNfNDAwX1FWR0EgKiBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCkgLyAzOTgxMzFVOworCWlmIChoc3luY19sZW4pCisJCXJldHVybiBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCkqMTAwMC9oc3luY19sZW47CisJZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzeW5jX3JlY2VpdmVfZGF0YV9zZW5kX2NtZChpbnQgZG9SZWNpdmUsIGludCBkb1NlbmQsIHVuc2lnbmVkIGludCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHdhaXRfdGltZSkKIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVyMSA9IDAsIHRpbWVyMiwgcG1uYyA9IDA7CiAJaW50IHBvcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcjEgPSAwLCB0aW1lcjI7Ci0JaW50IGRvc2xlZXA7CiAKLQlkb3NsZWVwID0gIXcxMDBmYl9nZXRfYmxhbmtpbmcoKTsKKwlpZiAod2FpdF90aW1lICYmIGRvU2VuZCkgeworCQlQTU5DX0dFVChwbW5jKTsKKwkJaWYgKCEocG1uYyAmIDB4MDEpKQorCQkJUE1OQ19TRVQoMHgwMSk7CiAKLQlpZiAoZG9zbGVlcCAmJiBkb1NlbmQpIHsKLQkJQ0NOVF9PTigpOwogCQkvKiBwb2xsaW5nIEhTeW5jICovCiAJCVN5bmNIUygpOwogCQkvKiBnZXQgQ0NOVCAqLwpAQCAtMTE5LDExICsxMDQsMTEgQEAKIAkJY29yZ2lfc3NwX2Fkczc4NDZfcHV0KGNtZCk7CiAJCWNvcmdpX3NzcF9hZHM3ODQ2X2dldCgpOwogCi0JCWlmIChkb3NsZWVwKSB7CisJCWlmICh3YWl0X3RpbWUpIHsKIAkJCS8qIFdhaXQgYWZ0ZXIgSFN5bmMgKi8KIAkJCUNDTlQodGltZXIyKTsKIAkJCWlmICh0aW1lcjItdGltZXIxID4gd2FpdF90aW1lKSB7Ci0JCQkJLyogdGltZW91dCAqLworCQkJCS8qIHRvbyBzbG93IC0gdGltZW91dCwgdHJ5IGFnYWluICovCiAJCQkJU3luY0hTKCk7CiAJCQkJLyogZ2V0IE9TQ1IgKi8KIAkJCQlDQ05UKHRpbWVyMSk7CkBAIC0xMzQsOCArMTE5LDggQEAKIAkJCQlDQ05UKHRpbWVyMik7CiAJCX0KIAkJY29yZ2lfc3NwX2Fkczc4NDZfcHV0KGNtZCk7Ci0JCWlmIChkb3NsZWVwKQotCQkJQ0NOVF9PRkYoKTsKKwkJaWYgKHdhaXRfdGltZSAmJiAhKHBtbmMgJiAweDAxKSkKKwkJCVBNTkNfU0VUKHBtbmMpOwogCX0KIAlyZXR1cm4gcG9zOwogfQpAQCAtMjQ0LDcgKzIyOSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgY29yZ2l0c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQorc3RhdGljIGludCBjb3JnaXRzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQogewogCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKIAkJc3RydWN0IGNvcmdpX3RzICpjb3JnaV90cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmggYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaAppbmRleCAxN2NmNzY2Li4yNmM1NDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTEyNDIsNiArMTI0MSw4IEBACiAKICNpZmRlZiBDT05GSUdfSElTQVhfRU5URVJOT1dfUENJCiAjZGVmaW5lIENBUkRfRk5fRU5URVJOT1dfUENJIDEKKyNlbHNlCisjZGVmaW5lIENBUkRfRk5fRU5URVJOT1dfUENJIDAKICNlbmRpZgogCiAjZGVmaW5lIFRFSV9QRVJfQ0FSRCAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2JzZGNvbXAuYwppbmRleCBiYWY0YmNhZC4uMGFmZTQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2JzZGNvbXAuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jCkBAIC0yODMsMjMgKzI4MywxOSBAQAogCQkvKgogCQkgKiBSZWxlYXNlIHRoZSBkaWN0aW9uYXJ5CiAJCSAqLwotCQlpZiAoZGItPmRpY3QpIHsKLQkJCXZmcmVlIChkYi0+ZGljdCk7Ci0JCQlkYi0+ZGljdCA9IE5VTEw7Ci0JCX0KKwkJdmZyZWUoZGItPmRpY3QpOworCQlkYi0+ZGljdCA9IE5VTEw7CiAKIAkJLyoKIAkJICogUmVsZWFzZSB0aGUgc3RyaW5nIGJ1ZmZlcgogCQkgKi8KLQkJaWYgKGRiLT5sZW5zKSB7Ci0JCQl2ZnJlZSAoZGItPmxlbnMpOwotCQkJZGItPmxlbnMgPSBOVUxMOwotCQl9CisJCXZmcmVlKGRiLT5sZW5zKTsKKwkJZGItPmxlbnMgPSBOVUxMOwogCiAJCS8qCiAJCSAqIEZpbmFsbHkgcmVsZWFzZSB0aGUgc3RydWN0dXJlIGl0c2VsZi4KIAkJICovCi0JCWtmcmVlIChkYik7CisJCWtmcmVlKGRiKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwppbmRleCBlZWJjYjBiLi44YTdkNTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCkBAIC0xOTUzLDcgKzE5NTMsOCBAQAogCQlrZnJlZShkLT5yY3Zjb3VudCk7CiAJaWYgKCEoZC0+cmN2Y291bnQgPSBrbWFsbG9jKHNpemVvZihpbnQpICogbSwgR0ZQX0FUT01JQykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlZ2lzdGVyX2lzZG46IENvdWxkIG5vdCBhbGxvYyByY3Zjb3VudFxuIik7Ci0JCWlmICghYWRkaW5nKSBrZnJlZShkLT5yY3ZlcnIpOworCQlpZiAoIWFkZGluZykKKwkJCWtmcmVlKGQtPnJjdmVycik7CiAJCXJldHVybiAtMTsKIAl9CiAJbWVtc2V0KChjaGFyICopIGQtPnJjdmNvdW50LCAwLCBzaXplb2YoaW50KSAqIG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3YxMTAuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl92MTEwLmMKaW5kZXggZjQ3ZjJiOS4uMzg2MTllOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3YxMTAuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdjExMC5jCkBAIC01MTYsMTEgKzUxNiwxMSBAQAogfQogCiBpbnQKLWlzZG5fdjExMF9zdGF0X2NhbGxiYWNrKGludCBpZHgsIGlzZG5fY3RybCAqIGMpCitpc2RuX3YxMTBfc3RhdF9jYWxsYmFjayhpbnQgaWR4LCBpc2RuX2N0cmwgKmMpCiB7CiAJaXNkbl92MTEwX3N0cmVhbSAqdiA9IE5VTEw7CiAJaW50IGk7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChpZHggPCAwKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDQxZGY0Y2QuLjJmYmEyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtMjcwLDE5ICsyNzAsMjAgQEAKIAogCWlmICghcGFnZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JZG8gewotCQlJVEVSQVRFX1JERVYobWRkZXYsIHJkZXYsIHRtcCkKLQkJCWlmIChyZGV2LT5pbl9zeW5jICYmICFyZGV2LT5mYXVsdHkpCi0JCQkJZ290byBmb3VuZDsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAKLQlmb3VuZDoKKwlJVEVSQVRFX1JERVYobWRkZXYsIHJkZXYsIHRtcCkgeworCQlpZiAoISByZGV2LT5pbl9zeW5jIHx8IHJkZXYtPmZhdWx0eSkKKwkJCWNvbnRpbnVlOworCiAJCXRhcmdldCA9IChyZGV2LT5zYl9vZmZzZXQgPDwgMSkgKyBvZmZzZXQgKyBpbmRleCAqIChQQUdFX1NJWkUvNTEyKTsKIAotCX0gd2hpbGUgKCFzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwgdGFyZ2V0LCBQQUdFX1NJWkUsIHBhZ2UsIFJFQUQpKTsKKwkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LT5iZGV2LCB0YXJnZXQsIFBBR0VfU0laRSwgcGFnZSwgUkVBRCkpIHsKKwkJCXBhZ2UtPmluZGV4ID0gaW5kZXg7CisJCQlyZXR1cm4gcGFnZTsKKwkJfQorCX0KKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAotCXBhZ2UtPmluZGV4ID0gaW5kZXg7Ci0JcmV0dXJuIHBhZ2U7CiB9CiAKIHN0YXRpYyBpbnQgd3JpdGVfc2JfcGFnZShtZGRldl90ICptZGRldiwgbG9uZyBvZmZzZXQsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKQEAgLTQzNyw2ICs0MzgsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICIgIGRhZW1vbiBzbGVlcDogJWRzXG4iLCBsZTMyX3RvX2NwdShzYi0+ZGFlbW9uX3NsZWVwKSk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgc3luYyBzaXplOiAlbGx1IEtCXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+c3luY19zaXplKS8yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWF4IHdyaXRlIGJlaGluZDogJWRcbiIsIGxlMzJfdG9fY3B1KHNiLT53cml0ZV9iZWhpbmQpKTsKIAlrdW5tYXAoYml0bWFwLT5zYl9wYWdlKTsKIH0KIApAQCAtNDQ1LDcgKzQ0Nyw3IEBACiB7CiAJY2hhciAqcmVhc29uID0gTlVMTDsKIAliaXRtYXBfc3VwZXJfdCAqc2I7Ci0JdW5zaWduZWQgbG9uZyBjaHVua3NpemUsIGRhZW1vbl9zbGVlcDsKKwl1bnNpZ25lZCBsb25nIGNodW5rc2l6ZSwgZGFlbW9uX3NsZWVwLCB3cml0ZV9iZWhpbmQ7CiAJdW5zaWduZWQgbG9uZyBieXRlc19yZWFkOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBldmVudHM7CiAJaW50IGVyciA9IC1FSU5WQUw7CkBAIC00NzQsNiArNDc2LDcgQEAKIAogCWNodW5rc2l6ZSA9IGxlMzJfdG9fY3B1KHNiLT5jaHVua3NpemUpOwogCWRhZW1vbl9zbGVlcCA9IGxlMzJfdG9fY3B1KHNiLT5kYWVtb25fc2xlZXApOworCXdyaXRlX2JlaGluZCA9IGxlMzJfdG9fY3B1KHNiLT53cml0ZV9iZWhpbmQpOwogCiAJLyogdmVyaWZ5IHRoYXQgdGhlIGJpdG1hcC1zcGVjaWZpYyBmaWVsZHMgYXJlIHZhbGlkICovCiAJaWYgKHNiLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihCSVRNQVBfTUFHSUMpKQpAQCAtNDg1LDcgKzQ4OCw5IEBACiAJZWxzZSBpZiAoKDEgPDwgZmZ6KH5jaHVua3NpemUpKSAhPSBjaHVua3NpemUpCiAJCXJlYXNvbiA9ICJiaXRtYXAgY2h1bmtzaXplIG5vdCBhIHBvd2VyIG9mIDIiOwogCWVsc2UgaWYgKGRhZW1vbl9zbGVlcCA8IDEgfHwgZGFlbW9uX3NsZWVwID4gMTUpCi0JCXJlYXNvbiA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSI7CisJCXJlYXNvbiA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSAoMS0xNXMpIjsKKwllbHNlIGlmICh3cml0ZV9iZWhpbmQgPiBDT1VOVEVSX01BWCkKKwkJcmVhc29uID0gIndyaXRlLWJlaGluZCBsaW1pdCBvdXQgb2YgcmFuZ2UgKDAgLSAxNjM4MykiOwogCWlmIChyZWFzb24pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgYml0bWFwIGZpbGUgc3VwZXJibG9jazogJXNcbiIsCiAJCQlibW5hbWUoYml0bWFwKSwgcmVhc29uKTsKQEAgLTUxOCw4ICs1MjMsMTIgQEAKIAkvKiBhc3NpZ24gZmllbGRzIHVzaW5nIHZhbHVlcyBmcm9tIHN1cGVyYmxvY2sgKi8KIAliaXRtYXAtPmNodW5rc2l6ZSA9IGNodW5rc2l6ZTsKIAliaXRtYXAtPmRhZW1vbl9zbGVlcCA9IGRhZW1vbl9zbGVlcDsKKwliaXRtYXAtPmRhZW1vbl9sYXN0cnVuID0gamlmZmllczsKKwliaXRtYXAtPm1heF93cml0ZV9iZWhpbmQgPSB3cml0ZV9iZWhpbmQ7CiAJYml0bWFwLT5mbGFncyB8PSBzYi0+c3RhdGU7CiAJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGxlNjRfdG9fY3B1KHNiLT5ldmVudHNfY2xlYXJlZCk7CisJaWYgKHNiLT5zdGF0ZSAmIEJJVE1BUF9TVEFMRSkKKwkJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGJpdG1hcC0+bWRkZXYtPmV2ZW50czsKIAllcnIgPSAwOwogb3V0OgogCWt1bm1hcChiaXRtYXAtPnNiX3BhZ2UpOwpAQCAtNjE3LDcgKzYyNiw3IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShzYl9wYWdlKTsKIH0KIAotc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9ucyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOworc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAKIC8qIGRlcXVldWUgdGhlIG5leHQgaXRlbSBpbiBhIHBhZ2UgbGlzdCAtLSBkb24ndCBjYWxsIGZyb20gaXJxIGNvbnRleHQgKi8KIHN0YXRpYyBzdHJ1Y3QgcGFnZV9saXN0ICpkZXF1ZXVlX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwKQpAQCAtNjU5LDcgKzY2OCw3IEBACiAJYml0bWFwLT5maWxlID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAotCWJpdG1hcF9zdG9wX2RhZW1vbnMoYml0bWFwKTsKKwliaXRtYXBfc3RvcF9kYWVtb24oYml0bWFwKTsKIAogCWRyYWluX3dyaXRlX3F1ZXVlcyhiaXRtYXApOwogCkBAIC04MTgsNyArODI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYml0bWFwX3NldF9tZW1vcnlfYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCk7CitzdGF0aWMgdm9pZCBiaXRtYXBfc2V0X21lbW9yeV9iaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgbmVlZGVkKTsKIC8qICogYml0bWFwX2luaXRfZnJvbV9kaXNrIC0tIGNhbGxlZCBhdCBiaXRtYXBfY3JlYXRlIHRpbWUgdG8gaW5pdGlhbGl6ZQogICogdGhlIGluLW1lbW9yeSBiaXRtYXAgZnJvbSB0aGUgb24tZGlzayBiaXRtYXAgLS0gYWxzbywgc2V0cyB1cCB0aGUKICAqIG1lbW9yeSBtYXBwaW5nIG9mIHRoZSBiaXRtYXAgZmlsZQpAQCAtODI2LDggKzgzNSwxMSBAQAogICogICBpZiB0aGVyZSdzIG5vIGJpdG1hcCBmaWxlLCBvciBpZiB0aGUgYml0bWFwIGZpbGUgaGFkIGJlZW4KICAqICAgcHJldmlvdXNseSBraWNrZWQgZnJvbSB0aGUgYXJyYXksIHdlIG1hcmsgYWxsIHRoZSBiaXRzIGFzCiAgKiAgIDEncyBpbiBvcmRlciB0byBjYXVzZSBhIGZ1bGwgcmVzeW5jLgorICoKKyAqIFdlIGlnbm9yZSBhbGwgYml0cyBmb3Igc2VjdG9ycyB0aGF0IGVuZCBlYXJsaWVyIHRoYW4gJ3N0YXJ0Jy4KKyAqIFRoaXMgaXMgdXNlZCB3aGVuIHJlYWRpbmcgYW4gb3V0LW9mLWRhdGUgYml0bWFwLi4uCiAgKi8KLXN0YXRpYyBpbnQgYml0bWFwX2luaXRfZnJvbV9kaXNrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3N0YXRpYyBpbnQgYml0bWFwX2luaXRfZnJvbV9kaXNrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgc3RhcnQpCiB7CiAJdW5zaWduZWQgbG9uZyBpLCBjaHVua3MsIGluZGV4LCBvbGRpbmRleCwgYml0OwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKm9sZHBhZ2UgPSBOVUxMOwpAQCAtOTE0LDcgKzkyNiw3IEBACiAJCQkgCSAqIHdob2xlIHBhZ2UgYW5kIHdyaXRlIGl0IG91dAogCQkJCSAqLwogCQkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsIDB4ZmYsCi0JCQkJCVBBR0VfU0laRSAtIG9mZnNldCk7CisJCQkJICAgICAgIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJCQkJcmV0ID0gd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDEpOwogCQkJCWlmIChyZXQpIHsKIAkJCQkJa3VubWFwKHBhZ2UpOwpAQCAtOTI4LDggKzk0MCwxMSBAQAogCQl9CiAJCWlmICh0ZXN0X2JpdChiaXQsIHBhZ2VfYWRkcmVzcyhwYWdlKSkpIHsKIAkJCS8qIGlmIHRoZSBkaXNrIGJpdCBpcyBzZXQsIHNldCB0aGUgbWVtb3J5IGJpdCAqLwotCQkJYml0bWFwX3NldF9tZW1vcnlfYml0cyhiaXRtYXAsIGkgPDwgQ0hVTktfQkxPQ0tfU0hJRlQoYml0bWFwKSk7CisJCQliaXRtYXBfc2V0X21lbW9yeV9iaXRzKGJpdG1hcCwgaSA8PCBDSFVOS19CTE9DS19TSElGVChiaXRtYXApLAorCQkJCQkgICAgICAgKChpKzEpIDw8IChDSFVOS19CTE9DS19TSElGVChiaXRtYXApKSA+PSBzdGFydCkKKwkJCQkpOwogCQkJYml0X2NudCsrOworCQkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX0NMRUFOKTsKIAkJfQogCX0KIApAQCAtMTE0MSw2ICsxMTU2LDkgQEAKIAkJZXJyID0gLUVJTlRSOwogCQlnb3RvIG91dDsKIAl9CisJaWYgKGJpdG1hcCA9PSBOVUxMKQorCQkvKiBhYm91dCB0byBiZSBzdG9wcGVkLiAqLworCQlyZXR1cm47CiAKIAlQUklOVEsoIiVzOiBiaXRtYXAgd3JpdGViYWNrIGRhZW1vbiB3b2tlIHVwLi4uXG4iLCBibW5hbWUoYml0bWFwKSk7CiAJLyogd2FpdCBvbiBiaXRtYXAgcGFnZSB3cml0ZWJhY2tzICovCkBAIC0xMTcwLDIxICsxMTg4LDEyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGJpdG1hcF9zdGFydF9kYWVtb24oc3RydWN0IGJpdG1hcCAqYml0bWFwLCBtZGtfdGhyZWFkX3QgKipwdHIsCitzdGF0aWMgbWRrX3RocmVhZF90ICpiaXRtYXBfc3RhcnRfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwKIAkJCQl2b2lkICgqZnVuYykobWRkZXZfdCAqKSwgY2hhciAqbmFtZSkKIHsKIAltZGtfdGhyZWFkX3QgKmRhZW1vbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgbmFtZWJ1ZlszMl07CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JKnB0ciA9IE5VTEw7Ci0KLQlpZiAoIWJpdG1hcC0+ZmlsZSkgLyogbm8gbmVlZCBmb3IgZGFlbW9uIGlmIHRoZXJlJ3Mgbm8gYmFja2luZyBmaWxlICovCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCiAjaWZkZWYgSU5KRUNUX0ZBVEFMX0ZBVUxUXzIKIAlkYWVtb24gPSBOVUxMOwogI2Vsc2UKQEAgLTExOTQsNDcgKzEyMDMsMzIgQEAKIAlpZiAoIWRhZW1vbikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gc3RhcnQgYml0bWFwIGRhZW1vblxuIiwKIAkJCWJtbmFtZShiaXRtYXApKTsKLQkJcmV0dXJuIC1FQ0hJTEQ7CisJCXJldHVybiBFUlJfUFRSKC1FQ0hJTEQpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkqcHRyID0gZGFlbW9uOwotCiAJbWRfd2FrZXVwX3RocmVhZChkYWVtb24pOyAvKiBzdGFydCBpdCBydW5uaW5nICovCiAKIAlQUklOVEsoIiVzOiAlcyBkYWVtb24gKHBpZCAlZCkgc3RhcnRlZC4uLlxuIiwKIAkJYm1uYW1lKGJpdG1hcCksIG5hbWUsIGRhZW1vbi0+dHNrLT5waWQpOwotb3V0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBkYWVtb247CiB9CiAKLXN0YXRpYyBpbnQgYml0bWFwX3N0YXJ0X2RhZW1vbnMoc3RydWN0IGJpdG1hcCAqYml0bWFwKQorc3RhdGljIHZvaWQgYml0bWFwX3N0b3BfZGFlbW9uKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKIHsKLQlpbnQgZXJyID0gYml0bWFwX3N0YXJ0X2RhZW1vbihiaXRtYXAsICZiaXRtYXAtPndyaXRlYmFja19kYWVtb24sCi0JCQkJCWJpdG1hcF93cml0ZWJhY2tfZGFlbW9uLCAiYml0bWFwX3diIik7Ci0JcmV0dXJuIGVycjsKLX0KKwkvKiB0aGUgZGFlbW9uIGNhbid0IHN0b3AgaXRzZWxmLi4uIGl0J2xsIGp1c3QgZXhpdCBpbnN0ZWFkLi4uICovCisJaWYgKGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbiAmJiAhIElTX0VSUihiaXRtYXAtPndyaXRlYmFja19kYWVtb24pICYmCisJICAgIGN1cnJlbnQtPnBpZCAhPSBiaXRtYXAtPndyaXRlYmFja19kYWVtb24tPnRzay0+cGlkKSB7CisJCW1ka190aHJlYWRfdCAqZGFlbW9uOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi1zdGF0aWMgdm9pZCBiaXRtYXBfc3RvcF9kYWVtb24oc3RydWN0IGJpdG1hcCAqYml0bWFwLCBtZGtfdGhyZWFkX3QgKipwdHIpCi17Ci0JbWRrX3RocmVhZF90ICpkYWVtb247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQlkYWVtb24gPSAqcHRyOwotCSpwdHIgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCWlmIChkYWVtb24pCi0JCW1kX3VucmVnaXN0ZXJfdGhyZWFkKGRhZW1vbik7IC8qIGRlc3Ryb3kgdGhlIHRocmVhZCAqLwotfQotCi1zdGF0aWMgdm9pZCBiaXRtYXBfc3RvcF9kYWVtb25zKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKLXsKLQkvKiB0aGUgZGFlbW9ucyBjYW4ndCBzdG9wIHRoZW1zZWx2ZXMuLi4gdGhleSdsbCBqdXN0IGV4aXQgaW5zdGVhZC4uLiAqLwotCWlmIChiaXRtYXAtPndyaXRlYmFja19kYWVtb24gJiYKLQkgICAgY3VycmVudC0+cGlkICE9IGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbi0+dHNrLT5waWQpCi0JCWJpdG1hcF9zdG9wX2RhZW1vbihiaXRtYXAsICZiaXRtYXAtPndyaXRlYmFja19kYWVtb24pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CisJCWRhZW1vbiA9IGJpdG1hcC0+d3JpdGViYWNrX2RhZW1vbjsKKwkJYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CisJCWlmIChkYWVtb24gJiYgISBJU19FUlIoZGFlbW9uKSkKKwkJCW1kX3VucmVnaXN0ZXJfdGhyZWFkKGRhZW1vbik7IC8qIGRlc3Ryb3kgdGhlIHRocmVhZCAqLworCX0KIH0KIAogc3RhdGljIGJpdG1hcF9jb3VudGVyX3QgKmJpdG1hcF9nZXRfY291bnRlcihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsCkBAIC0xMjc0LDkgKzEyNjgsMTYgQEAKIAl9CiB9CiAKLWludCBiaXRtYXBfc3RhcnR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzZWN0b3JzKQoraW50IGJpdG1hcF9zdGFydHdyaXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNlY3RvcnMsIGludCBiZWhpbmQpCiB7CiAJaWYgKCFiaXRtYXApIHJldHVybiAwOworCisJaWYgKGJlaGluZCkgeworCQlhdG9taWNfaW5jKCZiaXRtYXAtPmJlaGluZF93cml0ZXMpOworCQlQUklOVEsoS0VSTl9ERUJVRyAiaW5jIHdyaXRlLWJlaGluZCBjb3VudCAlZC8lZFxuIiwKKwkJICBhdG9taWNfcmVhZCgmYml0bWFwLT5iZWhpbmRfd3JpdGVzKSwgYml0bWFwLT5tYXhfd3JpdGVfYmVoaW5kKTsKKwl9CisKIAl3aGlsZSAoc2VjdG9ycykgewogCQlpbnQgYmxvY2tzOwogCQliaXRtYXBfY291bnRlcl90ICpibWM7CkBAIC0xMzExLDkgKzEzMTIsMTUgQEAKIH0KIAogdm9pZCBiaXRtYXBfZW5kd3JpdGUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2VjdG9ycywKLQkJICAgICBpbnQgc3VjY2VzcykKKwkJICAgICBpbnQgc3VjY2VzcywgaW50IGJlaGluZCkKIHsKIAlpZiAoIWJpdG1hcCkgcmV0dXJuOworCWlmIChiZWhpbmQpIHsKKwkJYXRvbWljX2RlYygmYml0bWFwLT5iZWhpbmRfd3JpdGVzKTsKKwkJUFJJTlRLKEtFUk5fREVCVUcgImRlYyB3cml0ZS1iZWhpbmQgY291bnQgJWQvJWRcbiIsCisJCSAgYXRvbWljX3JlYWQoJmJpdG1hcC0+YmVoaW5kX3dyaXRlcyksIGJpdG1hcC0+bWF4X3dyaXRlX2JlaGluZCk7CisJfQorCiAJd2hpbGUgKHNlY3RvcnMpIHsKIAkJaW50IGJsb2NrczsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0MjQsNyArMTQzMSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBiaXRtYXBfc2V0X21lbW9yeV9iaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0KQorc3RhdGljIHZvaWQgYml0bWFwX3NldF9tZW1vcnlfYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50IG5lZWRlZCkKIHsKIAkvKiBGb3IgZWFjaCBjaHVuayBjb3ZlcmVkIGJ5IGFueSBvZiB0aGVzZSBzZWN0b3JzLCBzZXQgdGhlCiAJICogY291bnRlciB0byAxIGFuZCBzZXQgcmVzeW5jX25lZWRlZC4gIFRoZXkgc2hvdWxkIGFsbApAQCAtMTQ0MSw3ICsxNDQ4LDcgQEAKIAl9CiAJaWYgKCEgKmJtYykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQkJKmJtYyA9IDEgfCBORUVERURfTUFTSzsKKwkJKmJtYyA9IDEgfCAobmVlZGVkP05FRURFRF9NQVNLOjApOwogCQliaXRtYXBfY291bnRfcGFnZShiaXRtYXAsIG9mZnNldCwgMSk7CiAJCXBhZ2UgPSBmaWxlbWFwX2dldF9wYWdlKGJpdG1hcCwgb2Zmc2V0ID4+IENIVU5LX0JMT0NLX1NISUZUKGJpdG1hcCkpOwogCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfQ0xFQU4pOwpAQCAtMTQ3NiwxNyArMTQ4MywxNCBAQAogLyoKICAqIGZyZWUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZAogICovCi12b2lkIGJpdG1hcF9kZXN0cm95KG1kZGV2X3QgKm1kZGV2KQorc3RhdGljIHZvaWQgYml0bWFwX2ZyZWUoc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCXVuc2lnbmVkIGxvbmcgaywgcGFnZXM7CiAJc3RydWN0IGJpdG1hcF9wYWdlICpicDsKLQlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOwogCiAJaWYgKCFiaXRtYXApIC8qIHRoZXJlIHdhcyBubyBiaXRtYXAgKi8KIAkJcmV0dXJuOwogCi0JbWRkZXYtPmJpdG1hcCA9IE5VTEw7IC8qIGRpc2Nvbm5lY3QgZnJvbSB0aGUgbWQgZGV2aWNlICovCi0KIAkvKiByZWxlYXNlIHRoZSBiaXRtYXAgZmlsZSBhbmQga2lsbCB0aGUgZGFlbW9uICovCiAJYml0bWFwX2ZpbGVfcHV0KGJpdG1hcCk7CiAKQEAgLTE1MDQsNiArMTUwOCwxNyBAQAogCWtmcmVlKGJwKTsKIAlrZnJlZShiaXRtYXApOwogfQordm9pZCBiaXRtYXBfZGVzdHJveShtZGRldl90ICptZGRldikKK3sKKwlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOworCisJaWYgKCFiaXRtYXApIC8qIHRoZXJlIHdhcyBubyBiaXRtYXAgKi8KKwkJcmV0dXJuOworCisJbWRkZXYtPmJpdG1hcCA9IE5VTEw7IC8qIGRpc2Nvbm5lY3QgZnJvbSB0aGUgbWQgZGV2aWNlICovCisKKwliaXRtYXBfZnJlZShiaXRtYXApOworfQogCiAvKgogICogaW5pdGlhbGl6ZSB0aGUgYml0bWFwIHN0cnVjdHVyZQpAQCAtMTUxNyw2ICsxNTMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXN0cnVjdCBmaWxlICpmaWxlID0gbWRkZXYtPmJpdG1hcF9maWxlOwogCWludCBlcnI7CisJc2VjdG9yX3Qgc3RhcnQ7CiAKIAlCVUdfT04oc2l6ZW9mKGJpdG1hcF9zdXBlcl90KSAhPSAyNTYpOwogCkBAIC0xNTMzLDE1ICsxNTQ5LDE1IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmYml0bWFwLT5sb2NrKTsKIAliaXRtYXAtPm1kZGV2ID0gbWRkZXY7Ci0JbWRkZXYtPmJpdG1hcCA9IGJpdG1hcDsKIAogCXNwaW5fbG9ja19pbml0KCZiaXRtYXAtPndyaXRlX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXAtPmNvbXBsZXRlX3BhZ2VzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiaXRtYXAtPndyaXRlX3dhaXQpOwogCWJpdG1hcC0+d3JpdGVfcG9vbCA9IG1lbXBvb2xfY3JlYXRlKFdSSVRFX1BPT0xfU0laRSwgd3JpdGVfcG9vbF9hbGxvYywKIAkJCQl3cml0ZV9wb29sX2ZyZWUsIE5VTEwpOworCWVyciA9IC1FTk9NRU07CiAJaWYgKCFiaXRtYXAtPndyaXRlX3Bvb2wpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIGVycm9yOwogCiAJYml0bWFwLT5maWxlID0gZmlsZTsKIAliaXRtYXAtPm9mZnNldCA9IG1kZGV2LT5iaXRtYXBfb2Zmc2V0OwpAQCAtMTU0OSw3ICsxNTY1LDcgQEAKIAkvKiByZWFkIHN1cGVyYmxvY2sgZnJvbSBiaXRtYXAgZmlsZSAodGhpcyBzZXRzIGJpdG1hcC0+Y2h1bmtzaXplKSAqLwogCWVyciA9IGJpdG1hcF9yZWFkX3NiKGJpdG1hcCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJvcjsKIAogCWJpdG1hcC0+Y2h1bmtzaGlmdCA9IGZpbmRfZmlyc3RfYml0KCZiaXRtYXAtPmNodW5rc2l6ZSwKIAkJCQkJc2l6ZW9mKGJpdG1hcC0+Y2h1bmtzaXplKSk7CkBAIC0xNTczLDI3ICsxNTg5LDQ0IEBACiAjZWxzZQogCWJpdG1hcC0+YnAgPSBrbWFsbG9jKHBhZ2VzICogc2l6ZW9mKCpiaXRtYXAtPmJwKSwgR0ZQX0tFUk5FTCk7CiAjZW5kaWYKKwllcnIgPSAtRU5PTUVNOwogCWlmICghYml0bWFwLT5icCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CiAJbWVtc2V0KGJpdG1hcC0+YnAsIDAsIHBhZ2VzICogc2l6ZW9mKCpiaXRtYXAtPmJwKSk7CiAKIAliaXRtYXAtPmZsYWdzIHw9IEJJVE1BUF9BQ1RJVkU7CiAKIAkvKiBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgcGFnZXMgYXZhaWxhYmxlLCBpbml0aWFsaXplIHRoZSBpbi1tZW1vcnkKIAkgKiBiaXRtYXAgZnJvbSB0aGUgb24tZGlzayBiaXRtYXAgKi8KLQllcnIgPSBiaXRtYXBfaW5pdF9mcm9tX2Rpc2soYml0bWFwKTsKKwlzdGFydCA9IDA7CisJaWYgKG1kZGV2LT5kZWdyYWRlZCA9PSAwCisJICAgIHx8IGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPT0gbWRkZXYtPmV2ZW50cykKKwkJLyogbm8gbmVlZCB0byBrZWVwIGRpcnR5IGJpdHMgdG8gb3B0aW1pc2UgYSByZS1hZGQgb2YgYSBtaXNzaW5nIGRldmljZSAqLworCQlzdGFydCA9IG1kZGV2LT5yZWNvdmVyeV9jcDsKKwllcnIgPSBiaXRtYXBfaW5pdF9mcm9tX2Rpc2soYml0bWFwLCBzdGFydCk7CiAKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycm9yOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiY3JlYXRlZCBiaXRtYXAgKCVsdSBwYWdlcykgZm9yIGRldmljZSAlc1xuIiwKIAkJcGFnZXMsIGJtbmFtZShiaXRtYXApKTsKIAotCS8qIGtpY2sgb2ZmIHRoZSBiaXRtYXAgZGFlbW9ucyAqLwotCWVyciA9IGJpdG1hcF9zdGFydF9kYWVtb25zKGJpdG1hcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwltZGRldi0+Yml0bWFwID0gYml0bWFwOworCisJaWYgKGZpbGUpCisJCS8qIGtpY2sgb2ZmIHRoZSBiaXRtYXAgd3JpdGViYWNrIGRhZW1vbiAqLworCQliaXRtYXAtPndyaXRlYmFja19kYWVtb24gPQorCQkJYml0bWFwX3N0YXJ0X2RhZW1vbihiaXRtYXAsCisJCQkJCSAgICBiaXRtYXBfd3JpdGViYWNrX2RhZW1vbiwKKwkJCQkJICAgICJiaXRtYXBfd2IiKTsKKworCWlmIChJU19FUlIoYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uKSkKKwkJcmV0dXJuIFBUUl9FUlIoYml0bWFwLT53cml0ZWJhY2tfZGFlbW9uKTsKIAlyZXR1cm4gYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOworCisgZXJyb3I6CisJYml0bWFwX2ZyZWUoYml0bWFwKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiB0aGUgYml0bWFwIEFQSSAtLSBmb3IgcmFpZCBwZXJzb25hbGl0aWVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwppbmRleCAxNzIxMmI0Li5jYzA3YmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKQEAgLTU2OCwxMiArNTY4LDkgQEAKIAogICAgICAgYmFkOgogCWRtX2lvX3B1dChzZWN0b3JzX3RvX3BhZ2VzKGNodW5rX3NpemUpKTsKLQlpZiAocHMpIHsKLQkJaWYgKHBzLT5hcmVhKQotCQkJZnJlZV9hcmVhKHBzKTsKLQotCQlrZnJlZShwcyk7Ci0JfQorCWlmIChwcyAmJiBwcy0+YXJlYSkKKwkJZnJlZV9hcmVhKHBzKTsKKwlrZnJlZShwcyk7CiAJcmV0dXJuIHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCA0NTc1NGJiLi45ZGUwMDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC0yMzksNiArMjM5LDExIEBACiAJZHAtPmNvbnRleHRfcHRyID0gZGF0YTsKIH0KIAorc3RhdGljIHZvaWQgZG1fYmlvX2Rlc3RydWN0b3Ioc3RydWN0IGJpbyAqYmlvKQoreworCWJpb19mcmVlKGJpbywgX2Jpb3MpOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJTyByb3V0aW5lcyB0aGF0IGFjY2VwdCBhIGxpc3Qgb2YgcGFnZXMuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNjMsNiArMjY4LDcgQEAKIAkJYmlvLT5iaV9iZGV2ID0gd2hlcmUtPmJkZXY7CiAJCWJpby0+YmlfZW5kX2lvID0gZW5kaW87CiAJCWJpby0+YmlfcHJpdmF0ZSA9IGlvOworCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBkbV9iaW9fZGVzdHJ1Y3RvcjsKIAkJYmlvX3NldF9yZWdpb24oYmlvLCByZWdpb24pOwogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKaW5kZXggYjA4ZGY4Yi4uODYzMjgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwpAQCAtMzc1LDE2ICszNzUsMTggQEAKIAogCXJlYWRfbG9jaygmcmgtPmhhc2hfbG9jayk7CiAJcmVnID0gX19yaF9maW5kKHJoLCByZWdpb24pOworCisJYXRvbWljX2luYygmcmVnLT5wZW5kaW5nKTsKKworCXNwaW5fbG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CiAJaWYgKHJlZy0+c3RhdGUgPT0gUkhfQ0xFQU4pIHsKIAkJcmgtPmxvZy0+dHlwZS0+bWFya19yZWdpb24ocmgtPmxvZywgcmVnLT5rZXkpOwogCi0JCXNwaW5fbG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CiAJCXJlZy0+c3RhdGUgPSBSSF9ESVJUWTsKIAkJbGlzdF9kZWxfaW5pdCgmcmVnLT5saXN0KTsJLyogdGFrZSBvZmYgdGhlIGNsZWFuIGxpc3QgKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZyaC0+cmVnaW9uX2xvY2spOwogCX0KKwlzcGluX3VubG9ja19pcnEoJnJoLT5yZWdpb25fbG9jayk7CiAKLQlhdG9taWNfaW5jKCZyZWctPnBlbmRpbmcpOwogCXJlYWRfdW5sb2NrKCZyaC0+aGFzaF9sb2NrKTsKIH0KIApAQCAtNDA4LDYgKzQxMCwxMCBAQAogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlZy0+cGVuZGluZykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJoLT5yZWdpb25fbG9jaywgZmxhZ3MpOworCQlpZiAoYXRvbWljX3JlYWQoJnJlZy0+cGVuZGluZykpIHsgLyogY2hlY2sgcmFjZSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmgtPnJlZ2lvbl9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KIAkJaWYgKHJlZy0+c3RhdGUgPT0gUkhfUkVDT1ZFUklORykgewogCQkJbGlzdF9hZGRfdGFpbCgmcmVnLT5saXN0LCAmcmgtPnF1aWVzY2VkX3JlZ2lvbnMpOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IGQ0ODdkOWQuLjkzMGI5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTM5OSw2ICszOTksMTEgQEAKIAl1bnNpZ25lZCBzaG9ydCBpZHg7CiB9OwogCitzdGF0aWMgdm9pZCBkbV9iaW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJYmlvX2ZyZWUoYmlvLCBkbV9zZXQpOworfQorCiAvKgogICogQ3JlYXRlcyBhIGxpdHRsZSBiaW8gdGhhdCBpcyBqdXN0IGRvZXMgcGFydCBvZiBhIGJ2ZWMuCiAgKi8KQEAgLTQxMCw2ICs0MTUsNyBAQAogCXN0cnVjdCBiaW9fdmVjICpidiA9IGJpby0+YmlfaW9fdmVjICsgaWR4OwogCiAJY2xvbmUgPSBiaW9fYWxsb2NfYmlvc2V0KEdGUF9OT0lPLCAxLCBkbV9zZXQpOworCWNsb25lLT5iaV9kZXN0cnVjdG9yID0gZG1fYmlvX2Rlc3RydWN0b3I7CiAJKmNsb25lLT5iaV9pb192ZWMgPSAqYnY7CiAKIAljbG9uZS0+Ymlfc2VjdG9yID0gc2VjdG9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggOGQ3NDAwMS4uYmIyNzlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0zOCw3ICszOCw4IEBACiAJLyoKIAkgKiBzZWN0b3JfZGl2KGEsYikgcmV0dXJucyB0aGUgcmVtYWluZXIgYW5kIHNldHMgYSB0byBhL2IKIAkgKi8KLQkodm9pZClzZWN0b3JfZGl2KGJsb2NrLCBjb25mLT5zbWFsbGVzdC0+c2l6ZSk7CisJYmxvY2sgPj49IGNvbmYtPnByZXNoaWZ0OworCSh2b2lkKXNlY3Rvcl9kaXYoYmxvY2ssIGNvbmYtPmhhc2hfc3BhY2luZyk7CiAJaGFzaCA9IGNvbmYtPmhhc2hfdGFibGVbYmxvY2tdOwogCiAJd2hpbGUgKChzZWN0b3I+PjEpID49IChoYXNoLT5zaXplICsgaGFzaC0+b2Zmc2V0KSkKQEAgLTQ3LDcgKzQ4LDcgQEAKIH0KIAogLyoqCi0gKglsaW5lYXJfbWVyZ2VhYmxlX2J2ZWMgLS0gdGVsbCBiaW8gbGF5ZXIgaWYgYSB0d28gcmVxdWVzdHMgY2FuIGJlIG1lcmdlZAorICoJbGluZWFyX21lcmdlYWJsZV9idmVjIC0tIHRlbGwgYmlvIGxheWVyIGlmIHR3byByZXF1ZXN0cyBjYW4gYmUgbWVyZ2VkCiAgKglAcTogcmVxdWVzdCBxdWV1ZQogICoJQGJpbzogdGhlIGJ1ZmZlciBoZWFkIHRoYXQncyBiZWVuIGJ1aWx0IHVwIHNvIGZhcgogICoJQGJpb3ZlYzogdGhlIHJlcXVlc3QgdGhhdCBjb3VsZCBiZSBtZXJnZWQgdG8gaXQuCkBAIC0xMTYsNyArMTE3LDcgQEAKIAlkZXZfaW5mb190ICoqdGFibGU7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgaSwgbmJfem9uZSwgY250OwotCXNlY3Rvcl90IHN0YXJ0OworCXNlY3Rvcl90IG1pbl9zcGFjaW5nOwogCXNlY3Rvcl90IGN1cnJfb2Zmc2V0OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIApAQCAtMTI3LDExICsxMjgsNiBAQAogCW1lbXNldChjb25mLCAwLCBzaXplb2YoKmNvbmYpICsgbWRkZXYtPnJhaWRfZGlza3Mqc2l6ZW9mKGRldl9pbmZvX3QpKTsKIAltZGRldi0+cHJpdmF0ZSA9IGNvbmY7CiAKLQkvKgotCSAqIEZpbmQgdGhlIHNtYWxsZXN0IGRldmljZS4KLQkgKi8KLQotCWNvbmYtPnNtYWxsZXN0ID0gTlVMTDsKIAljbnQgPSAwOwogCW1kZGV2LT5hcnJheV9zaXplID0gMDsKIApAQCAtMTU5LDggKzE1NSw2IEBACiAJCWRpc2stPnNpemUgPSByZGV2LT5zaXplOwogCQltZGRldi0+YXJyYXlfc2l6ZSArPSByZGV2LT5zaXplOwogCi0JCWlmICghY29uZi0+c21hbGxlc3QgfHwgKGRpc2stPnNpemUgPCBjb25mLT5zbWFsbGVzdC0+c2l6ZSkpCi0JCQljb25mLT5zbWFsbGVzdCA9IGRpc2s7CiAJCWNudCsrOwogCX0KIAlpZiAoY250ICE9IG1kZGV2LT5yYWlkX2Rpc2tzKSB7CkBAIC0xNjgsNiArMTYyLDM2IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCW1pbl9zcGFjaW5nID0gbWRkZXYtPmFycmF5X3NpemU7CisJc2VjdG9yX2RpdihtaW5fc3BhY2luZywgUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgZGV2X2luZm8gKikpOworCisJLyogbWluX3NwYWNpbmcgaXMgdGhlIG1pbmltdW0gc3BhY2luZyB0aGF0IHdpbGwgZml0IHRoZSBoYXNoCisJICogdGFibGUgaW4gb25lIFBBR0UuICBUaGlzIG1heSBiZSBtdWNoIHNtYWxsZXIgdGhhbiBuZWVkZWQuCisJICogV2UgZmluZCB0aGUgc21hbGxlc3Qgbm9uLXRlcm1pbmFsIHNldCBvZiBjb25zZWN1dGl2ZSBkZXZpY2VzCisJICogdGhhdCBpcyBsYXJnZXIgdGhhbiBtaW5fc3BhY2luZyBhcyB1c2UgdGhlIHNpemUgb2YgdGhhdCBhcworCSAqIHRoZSBhY3R1YWwgc3BhY2luZworCSAqLworCWNvbmYtPmhhc2hfc3BhY2luZyA9IG1kZGV2LT5hcnJheV9zaXplOworCWZvciAoaT0wOyBpIDwgY250LTEgOyBpKyspIHsKKwkJc2VjdG9yX3Qgc3ogPSAwOworCQlpbnQgajsKKwkJZm9yIChqPWk7IGk8Y250LTEgJiYgc3ogPCBtaW5fc3BhY2luZyA7IGorKykKKwkJCXN6ICs9IGNvbmYtPmRpc2tzW2pdLnNpemU7CisJCWlmIChzeiA+PSBtaW5fc3BhY2luZyAmJiBzeiA8IGNvbmYtPmhhc2hfc3BhY2luZykKKwkJCWNvbmYtPmhhc2hfc3BhY2luZyA9IHN6OworCX0KKworCS8qIGhhc2hfc3BhY2luZyBtYXkgYmUgdG9vIGxhcmdlIGZvciBzZWN0b3JfZGl2IHRvIHdvcmsgd2l0aCwKKwkgKiBzbyB3ZSBtaWdodCBuZWVkIHRvIHByZS1zaGlmdAorCSAqLworCWNvbmYtPnByZXNoaWZ0ID0gMDsKKwlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA+IHNpemVvZih1MzIpKSB7CisJCXNlY3Rvcl90IHNwYWNlID0gY29uZi0+aGFzaF9zcGFjaW5nOworCQl3aGlsZSAoc3BhY2UgPiAoc2VjdG9yX3QpKH4odTMyKTApKSB7CisJCQlzcGFjZSA+Pj0gMTsKKwkJCWNvbmYtPnByZXNoaWZ0Kys7CisJCX0KKwl9CiAJLyoKIAkgKiBUaGlzIGNvZGUgd2FzIHJlc3RydWN0dXJlZCB0byB3b3JrIGFyb3VuZCBhIGdjYy0yLjk1LjMgaW50ZXJuYWwKIAkgKiBjb21waWxlciBlcnJvci4gIEFsdGVyIGl0IHdpdGggY2FyZS4KQEAgLTE3NywzOSArMjAxLDUyIEBACiAJCXVuc2lnbmVkIHJvdW5kOwogCQl1bnNpZ25lZCBsb25nIGJhc2U7CiAKLQkJc3ogPSBtZGRldi0+YXJyYXlfc2l6ZTsKLQkJYmFzZSA9IGNvbmYtPnNtYWxsZXN0LT5zaXplOworCQlzeiA9IG1kZGV2LT5hcnJheV9zaXplID4+IGNvbmYtPnByZXNoaWZ0OworCQlzeiArPSAxOyAvKiBmb3JjZSByb3VuZC11cCAqLworCQliYXNlID0gY29uZi0+aGFzaF9zcGFjaW5nID4+IGNvbmYtPnByZXNoaWZ0OwogCQlyb3VuZCA9IHNlY3Rvcl9kaXYoc3osIGJhc2UpOwotCQluYl96b25lID0gY29uZi0+bnJfem9uZXMgPSBzeiArIChyb3VuZCA/IDEgOiAwKTsKKwkJbmJfem9uZSA9IHN6ICsgKHJvdW5kID8gMSA6IDApOwogCX0KLQkJCQotCWNvbmYtPmhhc2hfdGFibGUgPSBrbWFsbG9jIChzaXplb2YgKGRldl9pbmZvX3QqKSAqIG5iX3pvbmUsCisJQlVHX09OKG5iX3pvbmUgPiBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGRldl9pbmZvICopKTsKKworCWNvbmYtPmhhc2hfdGFibGUgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBkZXZfaW5mbyAqKSAqIG5iX3pvbmUsCiAJCQkJCUdGUF9LRVJORUwpOwogCWlmICghY29uZi0+aGFzaF90YWJsZSkKIAkJZ290byBvdXQ7CiAKIAkvKgogCSAqIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIGxpbmVhciBoYXNoIHRhYmxlCisJICogRmlyc3QgY2FsY3VsYXRlIHRoZSBkZXZpY2Ugb2Zmc2V0cy4KIAkgKi8KKwljb25mLT5kaXNrc1swXS5vZmZzZXQgPSAwOworCWZvciAoaT0xOyBpPG1kZGV2LT5yYWlkX2Rpc2tzOyBpKyspCisJCWNvbmYtPmRpc2tzW2ldLm9mZnNldCA9CisJCQljb25mLT5kaXNrc1tpLTFdLm9mZnNldCArCisJCQljb25mLT5kaXNrc1tpLTFdLnNpemU7CisKIAl0YWJsZSA9IGNvbmYtPmhhc2hfdGFibGU7Ci0Jc3RhcnQgPSAwOwogCWN1cnJfb2Zmc2V0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJZGV2X2luZm9fdCAqZGlzayA9IGNvbmYtPmRpc2tzICsgaTsKKwlpID0gMDsKKwlmb3IgKGN1cnJfb2Zmc2V0ID0gMDsKKwkgICAgIGN1cnJfb2Zmc2V0IDwgbWRkZXYtPmFycmF5X3NpemU7CisJICAgICBjdXJyX29mZnNldCArPSBjb25mLT5oYXNoX3NwYWNpbmcpIHsKIAotCQlkaXNrLT5vZmZzZXQgPSBjdXJyX29mZnNldDsKLQkJY3Vycl9vZmZzZXQgKz0gZGlzay0+c2l6ZTsKKwkJd2hpbGUgKGkgPCBtZGRldi0+cmFpZF9kaXNrcy0xICYmCisJCSAgICAgICBjdXJyX29mZnNldCA+PSBjb25mLT5kaXNrc1tpKzFdLm9mZnNldCkKKwkJCWkrKzsKIAotCQkvKiAnY3Vycl9vZmZzZXQnIGlzIHRoZSBlbmQgb2YgdGhpcyBkaXNrCi0JCSAqICdzdGFydCcgaXMgdGhlIHN0YXJ0IG9mIHRhYmxlCi0JCSAqLwotCQl3aGlsZSAoc3RhcnQgPCBjdXJyX29mZnNldCkgewotCQkJKnRhYmxlKysgPSBkaXNrOwotCQkJc3RhcnQgKz0gY29uZi0+c21hbGxlc3QtPnNpemU7Ci0JCX0KKwkJKnRhYmxlICsrID0gY29uZi0+ZGlza3MgKyBpOwogCX0KLQlpZiAodGFibGUtY29uZi0+aGFzaF90YWJsZSAhPSBuYl96b25lKQotCQlCVUcoKTsKKworCWlmIChjb25mLT5wcmVzaGlmdCkgeworCQljb25mLT5oYXNoX3NwYWNpbmcgPj49IGNvbmYtPnByZXNoaWZ0OworCQkvKiByb3VuZCBoYXNoX3NwYWNpbmcgdXAgc28gdGhhdCB3aGVuIHdlIGRpdmlkZSBieSBpdCwKKwkJICogd2UgZXJyIG9uIHRoZSBzaWRlIG9mICJ0b28tbG93Iiwgd2hpY2ggaXMgc2FmZXN0LgorCQkgKi8KKwkJY29uZi0+aGFzaF9zcGFjaW5nKys7CisJfQorCisJQlVHX09OKHRhYmxlIC0gY29uZi0+aGFzaF90YWJsZSA+IG5iX3pvbmUpOwogCiAJYmxrX3F1ZXVlX21lcmdlX2J2ZWMobWRkZXYtPnF1ZXVlLCBsaW5lYXJfbWVyZ2VhYmxlX2J2ZWMpOwogCW1kZGV2LT5xdWV1ZS0+dW5wbHVnX2ZuID0gbGluZWFyX3VucGx1ZzsKQEAgLTIzOCw2ICsyNzUsMTEgQEAKIAlkZXZfaW5mb190ICp0bXBfZGV2OwogCXNlY3Rvcl90IGJsb2NrOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoYmlvX2RhdGFfZGlyKGJpbyk9PVdSSVRFKSB7CiAJCWRpc2tfc3RhdF9pbmMobWRkZXYtPmdlbmRpc2ssIHdyaXRlcyk7CiAJCWRpc2tfc3RhdF9hZGQobWRkZXYtPmdlbmRpc2ssIHdyaXRlX3NlY3RvcnMsIGJpb19zZWN0b3JzKGJpbykpOwpAQCAtMjk0LDcgKzMzNiw3IEBACiAJc2VjdG9yX3QgcyA9IDA7CiAgIAogCXNlcV9wcmludGYoc2VxLCAiICAgICAgIik7Ci0JZm9yIChqID0gMDsgaiA8IGNvbmYtPm5yX3pvbmVzOyBqKyspCisJZm9yIChqID0gMDsgaiA8IG1kZGV2LT5yYWlkX2Rpc2tzOyBqKyspCiAJewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCXMgKz0gY29uZi0+c21hbGxlc3Rfc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCAyMGNhODBiLi4yODk3ZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWQuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL2JpdG1hcC5oPgpAQCAtNzMsNyArNzQsNyBAQAogICogQ3VycmVudCBSQUlELTEsNCw1IHBhcmFsbGVsIHJlY29uc3RydWN0aW9uICdndWFyYW50ZWVkIHNwZWVkIGxpbWl0JwogICogaXMgMTAwMCBLQi9zZWMsIHNvIHRoZSBleHRyYSBzeXN0ZW0gbG9hZCBkb2VzIG5vdCBzaG93IHVwIHRoYXQgbXVjaC4KICAqIEluY3JlYXNlIGl0IGlmIHlvdSB3YW50IHRvIGhhdmUgbW9yZSBfZ3VhcmFudGVlZF8gc3BlZWQuIE5vdGUgdGhhdAotICogdGhlIFJBSUQgZHJpdmVyIHdpbGwgdXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBiYW5kd2l0aCBpZiB0aGUgSU8KKyAqIHRoZSBSQUlEIGRyaXZlciB3aWxsIHVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUgYmFuZHdpZHRoIGlmIHRoZSBJTwogICogc3Vic3lzdGVtIGlzIGlkbGUuIFRoZXJlIGlzIGFsc28gYW4gJ2Fic29sdXRlIG1heGltdW0nIHJlY29uc3RydWN0aW9uCiAgKiBzcGVlZCBsaW1pdCAtIGluIGNhc2UgcmVjb25zdHJ1Y3Rpb24gc2xvd3MgZG93biB5b3VyIHN5c3RlbSBkZXNwaXRlCiAgKiBpZGxlIElPIGRldGVjdGlvbi4KQEAgLTM5Myw3ICszOTQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9kaXNrX3NiKG1ka19yZGV2X3QgKiByZGV2KQorc3RhdGljIGludCByZWFkX2Rpc2tfc2IobWRrX3JkZXZfdCAqIHJkZXYsIGludCBzaXplKQogewogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAlpZiAoIXJkZXYtPnNiX3BhZ2UpIHsKQEAgLTQwNCw3ICs0MDUsNyBAQAogCQlyZXR1cm4gMDsKIAogCi0JaWYgKCFzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwgcmRldi0+c2Jfb2Zmc2V0PDwxLCBNRF9TQl9CWVRFUywgcmRldi0+c2JfcGFnZSwgUkVBRCkpCisJaWYgKCFzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwgcmRldi0+c2Jfb2Zmc2V0PDwxLCBzaXplLCByZGV2LT5zYl9wYWdlLCBSRUFEKSkKIAkJZ290byBmYWlsOwogCXJkZXYtPnNiX2xvYWRlZCA9IDE7CiAJcmV0dXJuIDA7CkBAIC01MzEsNyArNTMyLDcgQEAKIAlzYl9vZmZzZXQgPSBjYWxjX2Rldl9zYm9mZnNldChyZGV2LT5iZGV2KTsKIAlyZGV2LT5zYl9vZmZzZXQgPSBzYl9vZmZzZXQ7CiAKLQlyZXQgPSByZWFkX2Rpc2tfc2IocmRldik7CisJcmV0ID0gcmVhZF9kaXNrX3NiKHJkZXYsIE1EX1NCX0JZVEVTKTsKIAlpZiAocmV0KSByZXR1cm4gcmV0OwogCiAJcmV0ID0gLUVJTlZBTDsKQEAgLTU2NCw2ICs1NjUsNyBAQAogCiAJcmRldi0+cHJlZmVycmVkX21pbm9yID0gc2ItPm1kX21pbm9yOwogCXJkZXYtPmRhdGFfb2Zmc2V0ID0gMDsKKwlyZGV2LT5zYl9zaXplID0gTURfU0JfQllURVM7CiAKIAlpZiAoc2ItPmxldmVsID09IExFVkVMX01VTFRJUEFUSCkKIAkJcmRldi0+ZGVzY19uciA9IC0xOwpAQCAtNjIzLDYgKzYyNSw3IEBACiAJCW1kZGV2LT5zaXplID0gc2ItPnNpemU7CiAJCW1kZGV2LT5ldmVudHMgPSBtZF9ldmVudChzYik7CiAJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJbWRkZXYtPmRlZmF1bHRfYml0bWFwX29mZnNldCA9IE1EX1NCX0JZVEVTID4+IDk7CiAKIAkJaWYgKHNiLT5zdGF0ZSAmICgxPDxNRF9TQl9DTEVBTikpCiAJCQltZGRldi0+cmVjb3ZlcnlfY3AgPSBNYXhTZWN0b3I7CkBAIC02NDMsMTIgKzY0NiwxMiBAQAogCiAJCWlmIChzYi0+c3RhdGUgJiAoMTw8TURfU0JfQklUTUFQX1BSRVNFTlQpICYmCiAJCSAgICBtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkgewotCQkJaWYgKG1kZGV2LT5sZXZlbCAhPSAxKSB7CisJCQlpZiAobWRkZXYtPmxldmVsICE9IDEgJiYgbWRkZXYtPmxldmVsICE9IDUgJiYgbWRkZXYtPmxldmVsICE9IDYpIHsKIAkJCQkvKiBGSVhNRSB1c2UgYSBiZXR0ZXIgdGVzdCAqLwogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1kOiBiaXRtYXBzIG9ubHkgc3VwcG9ydCBmb3IgcmFpZDFcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJbWRkZXYtPmJpdG1hcF9vZmZzZXQgPSAoTURfU0JfQllURVMgPj4gOSk7CisJCQltZGRldi0+Yml0bWFwX29mZnNldCA9IG1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQ7CiAJCX0KIAogCX0gZWxzZSBpZiAobWRkZXYtPnBlcnMgPT0gTlVMTCkgewpAQCAtNjY5LDYgKzY3Miw3IEBACiAKIAlpZiAobWRkZXYtPmxldmVsICE9IExFVkVMX01VTFRJUEFUSCkgewogCQlyZGV2LT5mYXVsdHkgPSAwOworCQlyZGV2LT5mbGFncyA9IDA7CiAJCWRlc2MgPSBzYi0+ZGlza3MgKyByZGV2LT5kZXNjX25yOwogCiAJCWlmIChkZXNjLT5zdGF0ZSAmICgxPDxNRF9ESVNLX0ZBVUxUWSkpCkBAIC02NzgsNiArNjgyLDggQEAKIAkJCXJkZXYtPmluX3N5bmMgPSAxOwogCQkJcmRldi0+cmFpZF9kaXNrID0gZGVzYy0+cmFpZF9kaXNrOwogCQl9CisJCWlmIChkZXNjLT5zdGF0ZSAmICgxPDxNRF9ESVNLX1dSSVRFTU9TVExZKSkKKwkJCXNldF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncyk7CiAJfSBlbHNlIC8qIE1VTFRJUEFUSCBhcmUgYWx3YXlzIGluc3luYyAqLwogCQlyZGV2LT5pbl9zeW5jID0gMTsKIAlyZXR1cm4gMDsKQEAgLTcwNiw2ICs3MTIsOCBAQAogCWludCBpOwogCWludCBhY3RpdmU9MCwgd29ya2luZz0wLGZhaWxlZD0wLHNwYXJlPTAsbnJfZGlza3M9MDsKIAorCXJkZXYtPnNiX3NpemUgPSBNRF9TQl9CWVRFUzsKKwogCXNiID0gKG1kcF9zdXBlcl90KilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CiAKIAltZW1zZXQoc2IsIDAsIHNpemVvZigqc2IpKTsKQEAgLTc3Niw2ICs3ODQsOCBAQAogCQkJc3BhcmUrKzsKIAkJCXdvcmtpbmcrKzsKIAkJfQorCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZyZGV2Mi0+ZmxhZ3MpKQorCQkJZC0+c3RhdGUgfD0gKDE8PE1EX0RJU0tfV1JJVEVNT1NUTFkpOwogCX0KIAkKIAkvKiBub3cgc2V0IHRoZSAicmVtb3ZlZCIgYW5kICJmYXVsdHkiIGJpdHMgb24gYW55IG1pc3NpbmcgZGV2aWNlcyAqLwpAQCAtODMxLDYgKzg0MSw3IEBACiAJaW50IHJldDsKIAlzZWN0b3JfdCBzYl9vZmZzZXQ7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdLCBiMltCREVWTkFNRV9TSVpFXTsKKwlpbnQgYm1hc2s7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHN1cGVyYmxvY2suCkBAIC04NTksNyArODcwLDEwIEBACiAJfQogCXJkZXYtPnNiX29mZnNldCA9IHNiX29mZnNldDsKIAotCXJldCA9IHJlYWRfZGlza19zYihyZGV2KTsKKwkvKiBzdXBlcmJsb2NrIGlzIHJhcmVseSBsYXJnZXIgdGhhbiAxSywgYnV0IGl0IGNhbiBiZSBsYXJnZXIsCisJICogYW5kIGl0IGlzIHNhZmUgdG8gcmVhZCA0aywgc28gd2UgZG8gdGhhdAorCSAqLworCXJldCA9IHJlYWRfZGlza19zYihyZGV2LCA0MDk2KTsKIAlpZiAocmV0KSByZXR1cm4gcmV0OwogCiAKQEAgLTg2OSw3ICs4ODMsNyBAQAogCSAgICBzYi0+bWFqb3JfdmVyc2lvbiAhPSBjcHVfdG9fbGUzMigxKSB8fAogCSAgICBsZTMyX3RvX2NwdShzYi0+bWF4X2RldikgPiAoNDA5Ni0yNTYpLzIgfHwKIAkgICAgbGU2NF90b19jcHUoc2ItPnN1cGVyX29mZnNldCkgIT0gKHJkZXYtPnNiX29mZnNldDw8MSkgfHwKLQkgICAgc2ItPmZlYXR1cmVfbWFwICE9IDApCisJICAgIChsZTMyX3RvX2NwdShzYi0+ZmVhdHVyZV9tYXApICYgfk1EX0ZFQVRVUkVfQUxMKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjYWxjX3NiXzFfY3N1bShzYikgIT0gc2ItPnNiX2NzdW0pIHsKQEAgLTg4NSw2ICs4OTksMTEgQEAKIAlyZGV2LT5wcmVmZXJyZWRfbWlub3IgPSAweGZmZmY7CiAJcmRldi0+ZGF0YV9vZmZzZXQgPSBsZTY0X3RvX2NwdShzYi0+ZGF0YV9vZmZzZXQpOwogCisJcmRldi0+c2Jfc2l6ZSA9IGxlMzJfdG9fY3B1KHNiLT5tYXhfZGV2KSAqIDIgKyAyNTY7CisJYm1hc2sgPSBxdWV1ZV9oYXJkc2VjdF9zaXplKHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlKS0xOworCWlmIChyZGV2LT5zYl9zaXplICYgYm1hc2spCisJCXJkZXYtPiBzYl9zaXplID0gKHJkZXYtPnNiX3NpemUgfCBibWFzaykrMTsKKwogCWlmIChyZWZkZXYgPT0gMCkKIAkJcmV0dXJuIDE7CiAJZWxzZSB7CkBAIC05MzksMTMgKzk1OCwxNSBAQAogCQltZGRldi0+c2l6ZSA9IGxlNjRfdG9fY3B1KHNiLT5zaXplKS8yOwogCQltZGRldi0+ZXZlbnRzID0gbGU2NF90b19jcHUoc2ItPmV2ZW50cyk7CiAJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJbWRkZXYtPmRlZmF1bHRfYml0bWFwX29mZnNldCA9IDA7CisJCW1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQgPSAxMDI0OwogCQkKIAkJbWRkZXYtPnJlY292ZXJ5X2NwID0gbGU2NF90b19jcHUoc2ItPnJlc3luY19vZmZzZXQpOwogCQltZW1jcHkobWRkZXYtPnV1aWQsIHNiLT5zZXRfdXVpZCwgMTYpOwogCiAJCW1kZGV2LT5tYXhfZGlza3MgPSAgKDQwOTYtMjU2KS8yOwogCi0JCWlmICgobGUzMl90b19jcHUoc2ItPmZlYXR1cmVfbWFwKSAmIDEpICYmCisJCWlmICgobGUzMl90b19jcHUoc2ItPmZlYXR1cmVfbWFwKSAmIE1EX0ZFQVRVUkVfQklUTUFQX09GRlNFVCkgJiYKIAkJICAgIG1kZGV2LT5iaXRtYXBfZmlsZSA9PSBOVUxMICkgewogCQkJaWYgKG1kZGV2LT5sZXZlbCAhPSAxKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IGJpdG1hcHMgb25seSBzdXBwb3J0ZWQgZm9yIHJhaWQxXG4iKTsKQEAgLTk4Niw2ICsxMDA3LDkgQEAKIAkJCXJkZXYtPnJhaWRfZGlzayA9IHJvbGU7CiAJCQlicmVhazsKIAkJfQorCQlyZGV2LT5mbGFncyA9IDA7CisJCWlmIChzYi0+ZGV2ZmxhZ3MgJiBXcml0ZU1vc3RseTEpCisJCQlzZXRfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOwogCX0gZWxzZSAvKiBNVUxUSVBBVEggYXJlIGFsd2F5cyBpbnN5bmMgKi8KIAkJcmRldi0+aW5fc3luYyA9IDE7CiAKQEAgLTEwMTcsNyArMTA0MSw3IEBACiAKIAlpZiAobWRkZXYtPmJpdG1hcCAmJiBtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkgewogCQlzYi0+Yml0bWFwX29mZnNldCA9IGNwdV90b19sZTMyKChfX3UzMiltZGRldi0+Yml0bWFwX29mZnNldCk7Ci0JCXNiLT5mZWF0dXJlX21hcCA9IGNwdV90b19sZTMyKDEpOworCQlzYi0+ZmVhdHVyZV9tYXAgPSBjcHVfdG9fbGUzMihNRF9GRUFUVVJFX0JJVE1BUF9PRkZTRVQpOwogCX0KIAogCW1heF9kZXYgPSAwOwpAQCAtMTM2Myw3ICsxMzg3LDcgQEAKIAkJZHByaW50aygiJXMgIiwgYmRldm5hbWUocmRldi0+YmRldixiKSk7CiAJCWlmICghcmRldi0+ZmF1bHR5KSB7CiAJCQltZF9zdXBlcl93cml0ZShtZGRldixyZGV2LAotCQkJCSAgICAgICByZGV2LT5zYl9vZmZzZXQ8PDEsIE1EX1NCX0JZVEVTLAorCQkJCSAgICAgICByZGV2LT5zYl9vZmZzZXQ8PDEsIHJkZXYtPnNiX3NpemUsCiAJCQkJICAgICAgIHJkZXYtPnNiX3BhZ2UpOwogCQkJZHByaW50ayhLRVJOX0lORk8gIih3cml0ZSkgJXMncyBzYiBvZmZzZXQ6ICVsbHVcbiIsCiAJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwKQEAgLTIwNzMsNiArMjA5Nyw4IEBACiAJaW5mby5zdGF0ZSAgICAgICAgID0gMDsKIAlpZiAobWRkZXYtPmluX3N5bmMpCiAJCWluZm8uc3RhdGUgPSAoMTw8TURfU0JfQ0xFQU4pOworCWlmIChtZGRldi0+Yml0bWFwICYmIG1kZGV2LT5iaXRtYXBfb2Zmc2V0KQorCQlpbmZvLnN0YXRlID0gKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAlpbmZvLmFjdGl2ZV9kaXNrcyAgPSBhY3RpdmU7CiAJaW5mby53b3JraW5nX2Rpc2tzID0gd29ya2luZzsKIAlpbmZvLmZhaWxlZF9kaXNrcyAgPSBmYWlsZWQ7CkBAIC0yMDg3LDcgKzIxMTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9iaXRtYXBfZmlsZShtZGRldl90ICogbWRkZXYsIHZvaWQgKiBhcmcpCitzdGF0aWMgaW50IGdldF9iaXRtYXBfZmlsZShtZGRldl90ICogbWRkZXYsIHZvaWQgX191c2VyICogYXJnKQogewogCW1kdV9iaXRtYXBfZmlsZV90ICpmaWxlID0gTlVMTDsgLyogdG9vIGJpZyBmb3Igc3RhY2sgYWxsb2NhdGlvbiAqLwogCWNoYXIgKnB0ciwgKmJ1ZiA9IE5VTEw7CkBAIC0yMTQ2LDYgKzIxNzIsOCBAQAogCQkJaW5mby5zdGF0ZSB8PSAoMTw8TURfRElTS19BQ1RJVkUpOwogCQkJaW5mby5zdGF0ZSB8PSAoMTw8TURfRElTS19TWU5DKTsKIAkJfQorCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncykpCisJCQlpbmZvLnN0YXRlIHw9ICgxPDxNRF9ESVNLX1dSSVRFTU9TVExZKTsKIAl9IGVsc2UgewogCQlpbmZvLm1ham9yID0gaW5mby5taW5vciA9IDA7CiAJCWluZm8ucmFpZF9kaXNrID0gLTE7CkBAIC0yMjEwLDggKzIyMzgsMTEgQEAKIAkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwgbWRkZXYtPm1ham9yX3ZlcnNpb24sCi0JCQkJCW1kZGV2LT5taW5vcl92ZXJzaW9uKTsKKwkJaWYgKG1kZGV2LT5wZXJzaXN0ZW50KQorCQkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LCBtZGRldi0+bWFqb3JfdmVyc2lvbiwKKwkJCQkJCW1kZGV2LT5taW5vcl92ZXJzaW9uKTsKKwkJZWxzZQorCQkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LCAtMSwgLTEpOwogCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJCSJtZDogbWRfaW1wb3J0X2RldmljZSByZXR1cm5lZCAlbGRcbiIsCkBAIC0yMjMxLDYgKzIyNjIsOSBAQAogCQlyZGV2LT5zYXZlZF9yYWlkX2Rpc2sgPSByZGV2LT5yYWlkX2Rpc2s7CiAKIAkJcmRldi0+aW5fc3luYyA9IDA7IC8qIGp1c3QgdG8gYmUgc3VyZSAqLworCQlpZiAoaW5mby0+c3RhdGUgJiAoMTw8TURfRElTS19XUklURU1PU1RMWSkpCisJCQlzZXRfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCiAJCXJkZXYtPnJhaWRfZGlzayA9IC0xOwogCQllcnIgPSBiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpOwogCQlpZiAoZXJyKQpAQCAtMjI3MSw2ICsyMzA1LDkgQEAKIAkJZWxzZQogCQkJcmRldi0+aW5fc3luYyA9IDA7CiAKKwkJaWYgKGluZm8tPnN0YXRlICYgKDE8PE1EX0RJU0tfV1JJVEVNT1NUTFkpKQorCQkJc2V0X2JpdChXcml0ZU1vc3RseSwgJnJkZXYtPmZsYWdzKTsKKwogCQllcnIgPSBiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpOwogCQlpZiAoZXJyKSB7CiAJCQlleHBvcnRfcmRldihyZGV2KTsKQEAgLTI0MzAsMjUgKzI0NjcsNTEgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKG1kZGV2LT5wZXJzKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JbWRkZXYtPmJpdG1hcF9maWxlID0gZmdldChmZCk7Ci0KLQlpZiAobWRkZXYtPmJpdG1hcF9maWxlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGZhaWxlZCB0byBnZXQgYml0bWFwIGZpbGVcbiIsCi0JCQltZG5hbWUobWRkZXYpKTsKLQkJcmV0dXJuIC1FQkFERjsKKwlpZiAobWRkZXYtPnBlcnMpIHsKKwkJaWYgKCFtZGRldi0+cGVycy0+cXVpZXNjZSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChtZGRldi0+cmVjb3ZlcnkgfHwgbWRkZXYtPnN5bmNfdGhyZWFkKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBiaXRtYXAuLiAqLwogCX0KIAotCWVyciA9IGRlbnlfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2ZpbGUpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGJpdG1hcCBmaWxlIGlzIGFscmVhZHkgaW4gdXNlXG4iLAotCQkJbWRuYW1lKG1kZGV2KSk7Ci0JCWZwdXQobWRkZXYtPmJpdG1hcF9maWxlKTsKLQkJbWRkZXYtPmJpdG1hcF9maWxlID0gTlVMTDsKLQl9IGVsc2UKKworCWlmIChmZCA+PSAwKSB7CisJCWlmIChtZGRldi0+Yml0bWFwKQorCQkJcmV0dXJuIC1FRVhJU1Q7IC8qIGNhbm5vdCBhZGQgd2hlbiBiaXRtYXAgaXMgcHJlc2VudCAqLworCQltZGRldi0+Yml0bWFwX2ZpbGUgPSBmZ2V0KGZkKTsKKworCQlpZiAobWRkZXYtPmJpdG1hcF9maWxlID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBmYWlsZWQgdG8gZ2V0IGJpdG1hcCBmaWxlXG4iLAorCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQkJcmV0dXJuIC1FQkFERjsKKwkJfQorCisJCWVyciA9IGRlbnlfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2ZpbGUpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvcjogYml0bWFwIGZpbGUgaXMgYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQlmcHV0KG1kZGV2LT5iaXRtYXBfZmlsZSk7CisJCQltZGRldi0+Yml0bWFwX2ZpbGUgPSBOVUxMOworCQkJcmV0dXJuIGVycjsKKwkJfQogCQltZGRldi0+Yml0bWFwX29mZnNldCA9IDA7IC8qIGZpbGUgb3ZlcnJpZGVzIG9mZnNldCAqLworCX0gZWxzZSBpZiAobWRkZXYtPmJpdG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsgLyogY2Fubm90IHJlbW92ZSB3aGF0IGlzbid0IHRoZXJlICovCisJZXJyID0gMDsKKwlpZiAobWRkZXYtPnBlcnMpIHsKKwkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDEpOworCQlpZiAoZmQgPj0gMCkKKwkJCWVyciA9IGJpdG1hcF9jcmVhdGUobWRkZXYpOworCQlpZiAoZmQgPCAwIHx8IGVycikKKwkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOworCX0gZWxzZSBpZiAoZmQgPCAwKSB7CisJCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUpCisJCQlmcHV0KG1kZGV2LT5iaXRtYXBfZmlsZSk7CisJCW1kZGV2LT5iaXRtYXBfZmlsZSA9IE5VTEw7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjUyOCw2ICsyNTkxLDExIEBACiB7CiAJaW50IHJ2ID0gMDsKIAlpbnQgY250ID0gMDsKKwlpbnQgc3RhdGUgPSAwOworCisJLyogY2FsY3VsYXRlIGV4cGVjdGVkIHN0YXRlLGlnbm9yaW5nIGxvdyBiaXRzICovCisJaWYgKG1kZGV2LT5iaXRtYXAgJiYgbWRkZXYtPmJpdG1hcF9vZmZzZXQpCisJCXN0YXRlIHw9ICgxIDw8IE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAogCWlmIChtZGRldi0+bWFqb3JfdmVyc2lvbiAhPSBpbmZvLT5tYWpvcl92ZXJzaW9uIHx8CiAJICAgIG1kZGV2LT5taW5vcl92ZXJzaW9uICE9IGluZm8tPm1pbm9yX3ZlcnNpb24gfHwKQEAgLTI1MzYsMTIgKzI2MDQsMTYgQEAKIAkgICAgbWRkZXYtPmxldmVsICAgICAgICAgIT0gaW5mby0+bGV2ZWwgICAgICAgICB8fAogLyoJICAgIG1kZGV2LT5sYXlvdXQgICAgICAgICE9IGluZm8tPmxheW91dCAgICAgICAgfHwgKi8KIAkgICAgIW1kZGV2LT5wZXJzaXN0ZW50CSAhPSBpbmZvLT5ub3RfcGVyc2lzdGVudHx8Ci0JICAgIG1kZGV2LT5jaHVua19zaXplICAgICE9IGluZm8tPmNodW5rX3NpemUgICAgKQorCSAgICBtZGRldi0+Y2h1bmtfc2l6ZSAgICAhPSBpbmZvLT5jaHVua19zaXplICAgIHx8CisJICAgIC8qIGlnbm9yZSBib3R0b20gOCBiaXRzIG9mIHN0YXRlLCBhbmQgYWxsb3cgU0JfQklUTUFQX1BSRVNFTlQgdG8gY2hhbmdlICovCisJICAgICgoc3RhdGVeaW5mby0+c3RhdGUpICYgMHhmZmZmZmUwMCkKKwkJKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBDaGVjayB0aGVyZSBpcyBvbmx5IG9uZSBjaGFuZ2UgKi8KIAlpZiAobWRkZXYtPnNpemUgIT0gaW5mby0+c2l6ZSkgY250Kys7CiAJaWYgKG1kZGV2LT5yYWlkX2Rpc2tzICE9IGluZm8tPnJhaWRfZGlza3MpIGNudCsrOwogCWlmIChtZGRldi0+bGF5b3V0ICE9IGluZm8tPmxheW91dCkgY250Kys7CisJaWYgKChzdGF0ZSBeIGluZm8tPnN0YXRlKSAmICgxPDxNRF9TQl9CSVRNQVBfUFJFU0VOVCkpIGNudCsrOwogCWlmIChjbnQgPT0gMCkgcmV0dXJuIDA7CiAJaWYgKGNudCA+IDEpIHJldHVybiAtRUlOVkFMOwogCkBAIC0yNjIwLDYgKzI2OTIsMzUgQEAKIAkJCX0KIAkJfQogCX0KKwlpZiAoKHN0YXRlIF4gaW5mby0+c3RhdGUpICYgKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKSkgeworCQlpZiAobWRkZXYtPnBlcnMtPnF1aWVzY2UgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWRkZXYtPnJlY292ZXJ5IHx8IG1kZGV2LT5zeW5jX3RocmVhZCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChpbmZvLT5zdGF0ZSAmICgxPDxNRF9TQl9CSVRNQVBfUFJFU0VOVCkpIHsKKwkJCS8qIGFkZCB0aGUgYml0bWFwICovCisJCQlpZiAobWRkZXYtPmJpdG1hcCkKKwkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCWlmIChtZGRldi0+ZGVmYXVsdF9iaXRtYXBfb2Zmc2V0ID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZGRldi0+Yml0bWFwX29mZnNldCA9IG1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQ7CisJCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMSk7CisJCQlydiA9IGJpdG1hcF9jcmVhdGUobWRkZXYpOworCQkJaWYgKHJ2KQorCQkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlbW92ZSB0aGUgYml0bWFwICovCisJCQlpZiAoIW1kZGV2LT5iaXRtYXApCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQlpZiAobWRkZXYtPmJpdG1hcC0+ZmlsZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKKwkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKwkJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJfQorCX0KIAltZF91cGRhdGVfc2IobWRkZXYpOwogCXJldHVybiBydjsKIH0KQEAgLTI3ODEsNyArMjg4Miw3IEBACiAJCQlnb3RvIGRvbmVfdW5sb2NrOwogCiAJCWNhc2UgR0VUX0JJVE1BUF9GSUxFOgotCQkJZXJyID0gZ2V0X2JpdG1hcF9maWxlKG1kZGV2LCAodm9pZCAqKWFyZyk7CisJCQllcnIgPSBnZXRfYml0bWFwX2ZpbGUobWRkZXYsIGFyZ3ApOwogCQkJZ290byBkb25lX3VubG9jazsKIAogCQljYXNlIEdFVF9ESVNLX0lORk86CkBAIC0yOTUwLDE4ICszMDUxLDYgQEAKIHsKIAltZGtfdGhyZWFkX3QgKnRocmVhZCA9IGFyZzsKIAotCWxvY2tfa2VybmVsKCk7Ci0KLQkvKgotCSAqIERldGFjaCB0aHJlYWQKLQkgKi8KLQotCWRhZW1vbml6ZSh0aHJlYWQtPm5hbWUsIG1kbmFtZSh0aHJlYWQtPm1kZGV2KSk7Ci0KLQljdXJyZW50LT5leGl0X3NpZ25hbCA9IFNJR0NITEQ7Ci0JYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwotCXRocmVhZC0+dHNrID0gY3VycmVudDsKLQogCS8qCiAJICogbWRfdGhyZWFkIGlzIGEgJ3N5c3RlbS10aHJlYWQnLCBpdCdzIHByaW9yaXR5IHNob3VsZCBiZSB2ZXJ5CiAJICogaGlnaC4gV2UgYXZvaWQgcmVzb3VyY2UgZGVhZGxvY2tzIGluZGl2aWR1YWxseSBpbiBlYWNoCkBAIC0yOTczLDE0ICszMDYyLDE0IEBACiAJICogYmRmbHVzaCwgb3RoZXJ3aXNlIGJkZmx1c2ggd2lsbCBkZWFkbG9jayBpZiB0aGVyZSBhcmUgdG9vCiAJICogbWFueSBkaXJ0eSBSQUlENSBibG9ja3MuCiAJICovCi0JdW5sb2NrX2tlcm5lbCgpOwogCiAJY29tcGxldGUodGhyZWFkLT5ldmVudCk7Ci0Jd2hpbGUgKHRocmVhZC0+cnVuKSB7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdm9pZCAoKnJ1bikobWRkZXZfdCAqKTsKIAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0aHJlYWQtPndxdWV1ZSwKLQkJCQkJCSB0ZXN0X2JpdChUSFJFQURfV0FLRVVQLCAmdGhyZWFkLT5mbGFncyksCisJCQkJCQkgdGVzdF9iaXQoVEhSRUFEX1dBS0VVUCwgJnRocmVhZC0+ZmxhZ3MpCisJCQkJCQkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpLAogCQkJCQkJIHRocmVhZC0+dGltZW91dCk7CiAJCXRyeV90b19mcmVlemUoKTsKIApAQCAtMjk4OSwxMSArMzA3OCw4IEBACiAJCXJ1biA9IHRocmVhZC0+cnVuOwogCQlpZiAocnVuKQogCQkJcnVuKHRocmVhZC0+bWRkZXYpOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJfQotCWNvbXBsZXRlKHRocmVhZC0+ZXZlbnQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMTAsMTEgKzMwOTYsOSBAQAogCQkJCSBjb25zdCBjaGFyICpuYW1lKQogewogCW1ka190aHJlYWRfdCAqdGhyZWFkOwotCWludCByZXQ7CiAJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CiAKLQl0aHJlYWQgPSAobWRrX3RocmVhZF90ICopIGttYWxsb2MKLQkJCQkoc2l6ZW9mKG1ka190aHJlYWRfdCksIEdGUF9LRVJORUwpOworCXRocmVhZCA9IGttYWxsb2Moc2l6ZW9mKG1ka190aHJlYWRfdCksIEdGUF9LRVJORUwpOwogCWlmICghdGhyZWFkKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzAyNyw4ICszMTExLDggQEAKIAl0aHJlYWQtPm1kZGV2ID0gbWRkZXY7CiAJdGhyZWFkLT5uYW1lID0gbmFtZTsKIAl0aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQlyZXQgPSBrZXJuZWxfdGhyZWFkKG1kX3RocmVhZCwgdGhyZWFkLCAwKTsKLQlpZiAocmV0IDwgMCkgeworCXRocmVhZC0+dHNrID0ga3RocmVhZF9ydW4obWRfdGhyZWFkLCB0aHJlYWQsIG1kbmFtZSh0aHJlYWQtPm1kZGV2KSk7CisJaWYgKElTX0VSUih0aHJlYWQtPnRzaykpIHsKIAkJa2ZyZWUodGhyZWFkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzAzOCwyMSArMzEyMiw5IEBACiAKIHZvaWQgbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRrX3RocmVhZF90ICp0aHJlYWQpCiB7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmV2ZW50KTsKLQotCXRocmVhZC0+ZXZlbnQgPSAmZXZlbnQ7Ci0KLQkvKiBBcyBzb29uIGFzIC0+cnVuIGlzIHNldCB0byBOVUxMLCB0aGUgdGFzayBjb3VsZCBkaXNhcHBlYXIsCi0JICogc28gd2UgbmVlZCB0byBob2xkIHRhc2tsaXN0X2xvY2sgdW50aWwgd2UgaGF2ZSBzZW50IHRoZSBzaWduYWwKLQkgKi8KIAlkcHJpbnRrKCJpbnRlcnJ1cHRpbmcgTUQtdGhyZWFkIHBpZCAlZFxuIiwgdGhyZWFkLT50c2stPnBpZCk7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl0aHJlYWQtPnJ1biA9IE5VTEw7Ci0Jc2VuZF9zaWcoU0lHS0lMTCwgdGhyZWFkLT50c2ssIDEpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldmVudCk7CisKKwlrdGhyZWFkX3N0b3AodGhyZWFkLT50c2spOwogCWtmcmVlKHRocmVhZCk7CiB9CiAKQEAgLTMyNTksMTAgKzMzMzEsMTMgQEAKIAkJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJCXNlcV9wcmludGYoc2VxLCAiICVzWyVkXSIsCiAJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwgcmRldi0+ZGVzY19ucik7CisJCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZyZGV2LT5mbGFncykpCisJCQkJc2VxX3ByaW50ZihzZXEsICIoVykiKTsKIAkJCWlmIChyZGV2LT5mYXVsdHkpIHsKIAkJCQlzZXFfcHJpbnRmKHNlcSwgIihGKSIpOwogCQkJCWNvbnRpbnVlOwotCQkJfQorCQkJfSBlbHNlIGlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwKQorCQkJCXNlcV9wcmludGYoc2VxLCAiKFMpIik7IC8qIHNwYXJlICovCiAJCQlzaXplICs9IHJkZXYtPnNpemU7CiAJCX0KIApAQCAtMzI3NCw2ICszMzQ5LDE1IEBACiAJCQkJc2VxX3ByaW50ZihzZXEsICJcbiAgICAgICVsbHUgYmxvY2tzIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplKTsKIAkJfQorCQlpZiAobWRkZXYtPnBlcnNpc3RlbnQpIHsKKwkJCWlmIChtZGRldi0+bWFqb3JfdmVyc2lvbiAhPSAwIHx8CisJCQkgICAgbWRkZXYtPm1pbm9yX3ZlcnNpb24gIT0gOTApIHsKKwkJCQlzZXFfcHJpbnRmKHNlcSwiIHN1cGVyICVkLiVkIiwKKwkJCQkJICAgbWRkZXYtPm1ham9yX3ZlcnNpb24sCisJCQkJCSAgIG1kZGV2LT5taW5vcl92ZXJzaW9uKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiBzdXBlciBub24tcGVyc2lzdGVudCIpOwogCiAJCWlmIChtZGRldi0+cGVycykgewogCQkJbWRkZXYtPnBlcnMtPnN0YXR1cyAoc2VxLCBtZGRldik7CkBAIC0zNDE2LDcgKzM1MDAsNiBAQAogICovCiB2b2lkIG1kX3dyaXRlX3N0YXJ0KG1kZGV2X3QgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaSkKIHsKLQlERUZJTkVfV0FJVCh3KTsKIAlpZiAoYmlvX2RhdGFfZGlyKGJpKSAhPSBXUklURSkKIAkJcmV0dXJuOwogCkBAIC0zNTMzLDcgKzM2MTYsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIm1kOiBzeW5jaW5nIFJBSUQgYXJyYXkgJXNcbiIsIG1kbmFtZShtZGRldikpOwogCXByaW50ayhLRVJOX0lORk8gIm1kOiBtaW5pbXVtIF9ndWFyYW50ZWVkXyByZWNvbnN0cnVjdGlvbiBzcGVlZDoiCiAJCSIgJWQgS0Ivc2VjL2Rpc2MuXG4iLCBzeXNjdGxfc3BlZWRfbGltaXRfbWluKTsKLQlwcmludGsoS0VSTl9JTkZPICJtZDogdXNpbmcgbWF4aW11bSBhdmFpbGFibGUgaWRsZSBJTyBiYW5kd2l0aCAiCisJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHVzaW5nIG1heGltdW0gYXZhaWxhYmxlIGlkbGUgSU8gYmFuZHdpZHRoICIKIAkgICAgICAgIihidXQgbm90IG1vcmUgdGhhbiAlZCBLQi9zZWMpIGZvciByZWNvbnN0cnVjdGlvbi5cbiIsCiAJICAgICAgIHN5c2N0bF9zcGVlZF9saW1pdF9tYXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL211bHRpcGF0aC5jIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwppbmRleCAyZDJjYTdmLi4yODYzNDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTE2OSw2ICsxNjksMTEgQEAKIAlzdHJ1Y3QgbXVsdGlwYXRoX2JoICogbXBfYmg7CiAJc3RydWN0IG11bHRpcGF0aF9pbmZvICptdWx0aXBhdGg7CiAKKwlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpIHsKKwkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRU9QTk9UU1VQUCk7CisJCXJldHVybiAwOworCX0KKwogCW1wX2JoID0gbWVtcG9vbF9hbGxvYyhjb25mLT5wb29sLCBHRlBfTk9JTyk7CiAKIAltcF9iaC0+bWFzdGVyX2JpbyA9IGJpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDAuYyBiL2RyaXZlcnMvbWQvcmFpZDAuYwppbmRleCAyMTIwNzEwLi5mNjc1NzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMC5jCkBAIC00MDQsNiArNDA0LDExIEBACiAJdW5zaWduZWQgbG9uZyBjaHVuazsKIAlzZWN0b3JfdCBibG9jaywgcnNlY3Q7CiAKKwlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpIHsKKwkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRU9QTk9UU1VQUCk7CisJCXJldHVybiAwOworCX0KKwogCWlmIChiaW9fZGF0YV9kaXIoYmlvKT09V1JJVEUpIHsKIAkJZGlza19zdGF0X2luYyhtZGRldi0+Z2VuZGlzaywgd3JpdGVzKTsKIAkJZGlza19zdGF0X2FkZChtZGRldi0+Z2VuZGlzaywgd3JpdGVfc2VjdG9ycywgYmlvX3NlY3RvcnMoYmlvKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggNTFkOTY0NS4uYTkzY2E0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMjIyLDggKzIyMiwxNyBAQAogewogCXN0cnVjdCBiaW8gKmJpbyA9IHIxX2Jpby0+bWFzdGVyX2JpbzsKIAotCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwKLQkJdGVzdF9iaXQoUjFCSU9fVXB0b2RhdGUsICZyMV9iaW8tPnN0YXRlKSA/IDAgOiAtRUlPKTsKKwkvKiBpZiBub2JvZHkgaGFzIGRvbmUgdGhlIGZpbmFsIGVuZGlvIHlldCwgZG8gaXQgbm93ICovCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFIxQklPX1JldHVybmVkLCAmcjFfYmlvLT5zdGF0ZSkpIHsKKwkJUFJJTlRLKEtFUk5fREVCVUcgInJhaWQxOiBzeW5jIGVuZCAlcyBvbiBzZWN0b3JzICVsbHUtJWxsdVxuIiwKKwkJCShiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgPyAid3JpdGUiIDogInJlYWQiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgYmlvLT5iaV9zZWN0b3IsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBiaW8tPmJpX3NlY3RvciArCisJCQkJKGJpby0+Ymlfc2l6ZSA+PiA5KSAtIDEpOworCisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwKKwkJCXRlc3RfYml0KFIxQklPX1VwdG9kYXRlLCAmcjFfYmlvLT5zdGF0ZSkgPyAwIDogLUVJTyk7CisJfQogCWZyZWVfcjFiaW8ocjFfYmlvKTsKIH0KIApAQCAtMjkyLDcgKzMwMSw3IEBACiB7CiAJaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CiAJcjFiaW9fdCAqIHIxX2JpbyA9IChyMWJpb190ICopKGJpby0+YmlfcHJpdmF0ZSk7Ci0JaW50IG1pcnJvcjsKKwlpbnQgbWlycm9yLCBiZWhpbmQ7CiAJY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihyMV9iaW8tPm1kZGV2KTsKIAogCWlmIChiaW8tPmJpX3NpemUpCkBAIC0zMjMsMTYgKzMzMiw0NiBAQAogCiAJdXBkYXRlX2hlYWRfcG9zKG1pcnJvciwgcjFfYmlvKTsKIAorCWJlaGluZCA9IHRlc3RfYml0KFIxQklPX0JlaGluZElPLCAmcjFfYmlvLT5zdGF0ZSk7CisJaWYgKGJlaGluZCkgeworCQlpZiAodGVzdF9iaXQoV3JpdGVNb3N0bHksICZjb25mLT5taXJyb3JzW21pcnJvcl0ucmRldi0+ZmxhZ3MpKQorCQkJYXRvbWljX2RlYygmcjFfYmlvLT5iZWhpbmRfcmVtYWluaW5nKTsKKworCQkvKiBJbiBiZWhpbmQgbW9kZSwgd2UgQUNLIHRoZSBtYXN0ZXIgYmlvIG9uY2UgdGhlIEkvTyBoYXMgc2FmZWx5CisJCSAqIHJlYWNoZWQgYWxsIG5vbi13cml0ZW1vc3RseSBkaXNrcy4gU2V0dGluZyB0aGUgUmV0dXJuZWQgYml0CisJCSAqIGVuc3VyZXMgdGhhdCB0aGlzIGdldHMgZG9uZSBvbmx5IG9uY2UgLS0gd2UgZG9uJ3QgZXZlciB3YW50IHRvCisJCSAqIHJldHVybiAtRUlPIGhlcmUsIGluc3RlYWQgd2UnbGwgd2FpdCAqLworCisJCWlmIChhdG9taWNfcmVhZCgmcjFfYmlvLT5iZWhpbmRfcmVtYWluaW5nKSA+PSAoYXRvbWljX3JlYWQoJnIxX2Jpby0+cmVtYWluaW5nKS0xKSAmJgorCQkgICAgdGVzdF9iaXQoUjFCSU9fVXB0b2RhdGUsICZyMV9iaW8tPnN0YXRlKSkgeworCQkJLyogTWF5YmUgd2UgY2FuIHJldHVybiBub3cgKi8KKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSMUJJT19SZXR1cm5lZCwgJnIxX2Jpby0+c3RhdGUpKSB7CisJCQkJc3RydWN0IGJpbyAqbWJpbyA9IHIxX2Jpby0+bWFzdGVyX2JpbzsKKwkJCQlQUklOVEsoS0VSTl9ERUJVRyAicmFpZDE6IGJlaGluZCBlbmQgd3JpdGUgc2VjdG9ycyAlbGx1LSVsbHVcbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1iaW8tPmJpX3NlY3RvciwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWJpby0+Ymlfc2VjdG9yICsKKwkJCQkgICAgICAgKG1iaW8tPmJpX3NpemUgPj4gOSkgLSAxKTsKKwkJCQliaW9fZW5kaW8obWJpbywgbWJpby0+Ymlfc2l6ZSwgMCk7CisJCQl9CisJCX0KKwl9CiAJLyoKIAkgKgogCSAqIExldCdzIHNlZSBpZiBhbGwgbWlycm9yZWQgd3JpdGUgb3BlcmF0aW9ucyBoYXZlIGZpbmlzaGVkCiAJICogYWxyZWFkeS4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcjFfYmlvLT5yZW1haW5pbmcpKSB7CisJCWlmICh0ZXN0X2JpdChSMUJJT19CZWhpbmRJTywgJnIxX2Jpby0+c3RhdGUpKSB7CisJCQkvKiBmcmVlIGV4dHJhIGNvcHkgb2YgdGhlIGRhdGEgcGFnZXMgKi8KKwkJCWludCBpID0gYmlvLT5iaV92Y250OworCQkJd2hpbGUgKGktLSkKKwkJCQlfX2ZyZWVfcGFnZShiaW8tPmJpX2lvX3ZlY1tpXS5idl9wYWdlKTsKKwkJfQogCQkvKiBjbGVhciB0aGUgYml0bWFwIGlmIGFsbCB3cml0ZXMgY29tcGxldGUgc3VjY2Vzc2Z1bGx5ICovCiAJCWJpdG1hcF9lbmR3cml0ZShyMV9iaW8tPm1kZGV2LT5iaXRtYXAsIHIxX2Jpby0+c2VjdG9yLAogCQkJCXIxX2Jpby0+c2VjdG9ycywKLQkJCQkhdGVzdF9iaXQoUjFCSU9fRGVncmFkZWQsICZyMV9iaW8tPnN0YXRlKSk7CisJCQkJIXRlc3RfYml0KFIxQklPX0RlZ3JhZGVkLCAmcjFfYmlvLT5zdGF0ZSksCisJCQkJYmVoaW5kKTsKIAkJbWRfd3JpdGVfZW5kKHIxX2Jpby0+bWRkZXYpOwogCQlyYWlkX2VuZF9iaW9faW8ocjFfYmlvKTsKIAl9CkBAIC0zNjAsMTMgKzM5OSwxNCBAQAogewogCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGhpc19zZWN0b3IgPSByMV9iaW8tPnNlY3RvcjsKIAlpbnQgbmV3X2Rpc2sgPSBjb25mLT5sYXN0X3VzZWQsIGRpc2sgPSBuZXdfZGlzazsKKwlpbnQgd29ubHlfZGlzayA9IC0xOwogCWNvbnN0IGludCBzZWN0b3JzID0gcjFfYmlvLT5zZWN0b3JzOwogCXNlY3Rvcl90IG5ld19kaXN0YW5jZSwgY3VycmVudF9kaXN0YW5jZTsKLQltZGtfcmRldl90ICpuZXdfcmRldiwgKnJkZXY7CisJbWRrX3JkZXZfdCAqcmRldjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAkvKgotCSAqIENoZWNrIGlmIGl0IGlmIHdlIGNhbiBiYWxhbmNlLiBXZSBjYW4gYmFsYW5jZSBvbiB0aGUgd2hvbGUKKwkgKiBDaGVjayBpZiB3ZSBjYW4gYmFsYW5jZS4gV2UgY2FuIGJhbGFuY2Ugb24gdGhlIHdob2xlCiAJICogZGV2aWNlIGlmIG5vIHJlc3luYyBpcyBnb2luZyBvbiwgb3IgYmVsb3cgdGhlIHJlc3luYyB3aW5kb3cuCiAJICogV2UgdGFrZSB0aGUgZmlyc3QgcmVhZGFibGUgZGlzayB3aGVuIGFib3ZlIHRoZSByZXN5bmMgd2luZG93LgogCSAqLwpAQCAtMzc2LDExICs0MTYsMTYgQEAKIAkJLyogQ2hvb3NlIHRoZSBmaXJzdCBvcGVyYXRpb24gZGV2aWNlLCBmb3IgY29uc2lzdGFuY3kgKi8KIAkJbmV3X2Rpc2sgPSAwOwogCi0JCXdoaWxlICgobmV3X3JkZXY9Y29uZi0+bWlycm9yc1tuZXdfZGlza10ucmRldikgPT0gTlVMTCB8fAotCQkgICAgICAgIW5ld19yZGV2LT5pbl9zeW5jKSB7Ci0JCQluZXdfZGlzaysrOwotCQkJaWYgKG5ld19kaXNrID09IGNvbmYtPnJhaWRfZGlza3MpIHsKLQkJCQluZXdfZGlzayA9IC0xOworCQlmb3IgKHJkZXYgPSBjb25mLT5taXJyb3JzW25ld19kaXNrXS5yZGV2OworCQkgICAgICFyZGV2IHx8ICFyZGV2LT5pbl9zeW5jCisJCQkgICAgIHx8IHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCQkgICAgIHJkZXYgPSBjb25mLT5taXJyb3JzWysrbmV3X2Rpc2tdLnJkZXYpIHsKKworCQkJaWYgKHJkZXYgJiYgcmRldi0+aW5fc3luYykKKwkJCQl3b25seV9kaXNrID0gbmV3X2Rpc2s7CisKKwkJCWlmIChuZXdfZGlzayA9PSBjb25mLT5yYWlkX2Rpc2tzIC0gMSkgeworCQkJCW5ld19kaXNrID0gd29ubHlfZGlzazsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMzg5LDE2ICs0MzQsMjYgQEAKIAogCiAJLyogbWFrZSBzdXJlIHRoZSBkaXNrIGlzIG9wZXJhdGlvbmFsICovCi0Jd2hpbGUgKChuZXdfcmRldj1jb25mLT5taXJyb3JzW25ld19kaXNrXS5yZGV2KSA9PSBOVUxMIHx8Ci0JICAgICAgICFuZXdfcmRldi0+aW5fc3luYykgeworCWZvciAocmRldiA9IGNvbmYtPm1pcnJvcnNbbmV3X2Rpc2tdLnJkZXY7CisJICAgICAhcmRldiB8fCAhcmRldi0+aW5fc3luYyB8fAorCQkgICAgIHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpOworCSAgICAgcmRldiA9IGNvbmYtPm1pcnJvcnNbbmV3X2Rpc2tdLnJkZXYpIHsKKworCQlpZiAocmRldiAmJiByZGV2LT5pbl9zeW5jKQorCQkJd29ubHlfZGlzayA9IG5ld19kaXNrOworCiAJCWlmIChuZXdfZGlzayA8PSAwKQogCQkJbmV3X2Rpc2sgPSBjb25mLT5yYWlkX2Rpc2tzOwogCQluZXdfZGlzay0tOwogCQlpZiAobmV3X2Rpc2sgPT0gZGlzaykgewotCQkJbmV3X2Rpc2sgPSAtMTsKLQkJCWdvdG8gcmJfb3V0OworCQkJbmV3X2Rpc2sgPSB3b25seV9kaXNrOworCQkJYnJlYWs7CiAJCX0KIAl9CisKKwlpZiAobmV3X2Rpc2sgPCAwKQorCQlnb3RvIHJiX291dDsKKwogCWRpc2sgPSBuZXdfZGlzazsKIAkvKiBub3cgZGlzayA9PSBuZXdfZGlzayA9PSBzdGFydGluZyBwb2ludCBmb3Igc2VhcmNoICovCiAKQEAgLTQxOSwzNyArNDc0LDQxIEBACiAJCQlkaXNrID0gY29uZi0+cmFpZF9kaXNrczsKIAkJZGlzay0tOwogCi0JCWlmICgocmRldj1jb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYpID09IE5VTEwgfHwKLQkJICAgICFyZGV2LT5pbl9zeW5jKQorCQlyZGV2ID0gY29uZi0+bWlycm9yc1tkaXNrXS5yZGV2OworCisJCWlmICghcmRldiB8fAorCQkgICAgIXJkZXYtPmluX3N5bmMgfHwKKwkJICAgIHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZykpIHsKIAkJCW5ld19kaXNrID0gZGlzazsKLQkJCW5ld19yZGV2ID0gcmRldjsKIAkJCWJyZWFrOwogCQl9CiAJCW5ld19kaXN0YW5jZSA9IGFicyh0aGlzX3NlY3RvciAtIGNvbmYtPm1pcnJvcnNbZGlza10uaGVhZF9wb3NpdGlvbik7CiAJCWlmIChuZXdfZGlzdGFuY2UgPCBjdXJyZW50X2Rpc3RhbmNlKSB7CiAJCQljdXJyZW50X2Rpc3RhbmNlID0gbmV3X2Rpc3RhbmNlOwogCQkJbmV3X2Rpc2sgPSBkaXNrOwotCQkJbmV3X3JkZXYgPSByZGV2OwogCQl9CiAJfSB3aGlsZSAoZGlzayAhPSBjb25mLT5sYXN0X3VzZWQpOwogCi1yYl9vdXQ6CisgcmJfb3V0OgogCiAKIAlpZiAobmV3X2Rpc2sgPj0gMCkgewotCQljb25mLT5uZXh0X3NlcV9zZWN0ID0gdGhpc19zZWN0b3IgKyBzZWN0b3JzOwotCQljb25mLT5sYXN0X3VzZWQgPSBuZXdfZGlzazsKLQkJYXRvbWljX2luYygmbmV3X3JkZXYtPm5yX3BlbmRpbmcpOwotCQlpZiAoIW5ld19yZGV2LT5pbl9zeW5jKSB7CisJCXJkZXYgPSBjb25mLT5taXJyb3JzW25ld19kaXNrXS5yZGV2OworCQlpZiAoIXJkZXYpCisJCQlnb3RvIHJldHJ5OworCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKKwkJaWYgKCFyZGV2LT5pbl9zeW5jKSB7CiAJCQkvKiBjYW5ub3QgcmlzayByZXR1cm5pbmcgYSBkZXZpY2UgdGhhdCBmYWlsZWQKIAkJCSAqIGJlZm9yZSB3ZSBpbmMnZWQgbnJfcGVuZGluZwogCQkJICovCi0JCQlhdG9taWNfZGVjKCZuZXdfcmRldi0+bnJfcGVuZGluZyk7CisJCQlhdG9taWNfZGVjKCZyZGV2LT5ucl9wZW5kaW5nKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KKwkJY29uZi0+bmV4dF9zZXFfc2VjdCA9IHRoaXNfc2VjdG9yICsgc2VjdG9yczsKKwkJY29uZi0+bGFzdF91c2VkID0gbmV3X2Rpc2s7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC01NDIsNiArNjAxLDM5IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CiB9CiAKKy8qIGR1cGxpY2F0ZSB0aGUgZGF0YSBwYWdlcyBmb3IgYmVoaW5kIEkvTyAqLworc3RhdGljIHN0cnVjdCBwYWdlICoqYWxsb2NfYmVoaW5kX3BhZ2VzKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0ga21hbGxvYyhiaW8tPmJpX3ZjbnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCQkJCUdGUF9OT0lPKTsKKwlpZiAodW5saWtlbHkoIXBhZ2VzKSkKKwkJZ290byBkb19zeW5jX2lvOworCisJbWVtc2V0KHBhZ2VzLCAwLCBiaW8tPmJpX3ZjbnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJCXBhZ2VzW2ldID0gYWxsb2NfcGFnZShHRlBfTk9JTyk7CisJCWlmICh1bmxpa2VseSghcGFnZXNbaV0pKQorCQkJZ290byBkb19zeW5jX2lvOworCQltZW1jcHkoa21hcChwYWdlc1tpXSkgKyBidmVjLT5idl9vZmZzZXQsCisJCQlrbWFwKGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4pOworCQlrdW5tYXAocGFnZXNbaV0pOworCQlrdW5tYXAoYnZlYy0+YnZfcGFnZSk7CisJfQorCisJcmV0dXJuIHBhZ2VzOworCitkb19zeW5jX2lvOgorCWlmIChwYWdlcykKKwkJZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudCAmJiBwYWdlc1tpXTsgaSsrKQorCQkJX19mcmVlX3BhZ2UocGFnZXNbaV0pOworCWtmcmVlKHBhZ2VzKTsKKwlQUklOVEsoIiVkQiBiZWhpbmQgYWxsb2MgZmFpbGVkLCBkb2luZyBzeW5jIEkvT1xuIiwgYmlvLT5iaV9zaXplKTsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGludCBtYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICogYmlvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtNTU0LDcgKzY0NiwxMiBAQAogCXN0cnVjdCBiaXRtYXAgKmJpdG1hcCA9IG1kZGV2LT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYmlvX2xpc3QgYmw7CisJc3RydWN0IHBhZ2UgKipiZWhpbmRfcGFnZXMgPSBOVUxMOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CiAKIAkvKgogCSAqIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWVzdCBhbmQgd2FpdCBpZiB0aGUgcmVjb25zdHJ1Y3Rpb24KQEAgLTU4OSw4ICs2ODYsNiBAQAogCXIxX2Jpby0+bWRkZXYgPSBtZGRldjsKIAlyMV9iaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCi0JcjFfYmlvLT5zdGF0ZSA9IDA7Ci0KIAlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgewogCQkvKgogCQkgKiByZWFkIGJhbGFuY2luZyBsb2dpYzoKQEAgLTY1MSwxMyArNzQ2LDIyIEBACiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCisJQlVHX09OKHRhcmdldHMgPT0gMCk7IC8qIHdlIG5ldmVyIGZhaWwgdGhlIGxhc3QgZGV2aWNlICovCisKIAlpZiAodGFyZ2V0cyA8IGNvbmYtPnJhaWRfZGlza3MpIHsKIAkJLyogYXJyYXkgaXMgZGVncmFkZWQsIHdlIHdpbGwgbm90IGNsZWFyIHRoZSBiaXRtYXAKIAkJICogb24gSS9PIGNvbXBsZXRpb24gKHNlZSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdCkgKi8KIAkJc2V0X2JpdChSMUJJT19EZWdyYWRlZCwgJnIxX2Jpby0+c3RhdGUpOwogCX0KIAorCS8qIGRvIGJlaGluZCBJL08gPyAqLworCWlmIChiaXRtYXAgJiYKKwkgICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+YmVoaW5kX3dyaXRlcykgPCBiaXRtYXAtPm1heF93cml0ZV9iZWhpbmQgJiYKKwkgICAgKGJlaGluZF9wYWdlcyA9IGFsbG9jX2JlaGluZF9wYWdlcyhiaW8pKSAhPSBOVUxMKQorCQlzZXRfYml0KFIxQklPX0JlaGluZElPLCAmcjFfYmlvLT5zdGF0ZSk7CisKIAlhdG9taWNfc2V0KCZyMV9iaW8tPnJlbWFpbmluZywgMCk7CisJYXRvbWljX3NldCgmcjFfYmlvLT5iZWhpbmRfcmVtYWluaW5nLCAwKTsKIAogCWJpb19saXN0X2luaXQoJmJsKTsKIAlmb3IgKGkgPSAwOyBpIDwgZGlza3M7IGkrKykgewpAQCAtNjc0LDEyICs3NzgsMzEgQEAKIAkJbWJpby0+YmlfcncgPSBXUklURTsKIAkJbWJpby0+YmlfcHJpdmF0ZSA9IHIxX2JpbzsKIAorCQlpZiAoYmVoaW5kX3BhZ2VzKSB7CisJCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwkJCWludCBqOworCisJCQkvKiBZZXMsIEkgcmVhbGx5IHdhbnQgdGhlICdfXycgdmVyc2lvbiBzbyB0aGF0CisJCQkgKiB3ZSBjbGVhciBhbnkgdW51c2VkIHBvaW50ZXIgaW4gdGhlIGlvX3ZlYywgcmF0aGVyCisJCQkgKiB0aGFuIGxlYXZlIHRoZW0gdW5jaGFuZ2VkLiAgVGhpcyBpcyBpbXBvcnRhbnQKKwkJCSAqIGJlY2F1c2Ugd2hlbiB3ZSBjb21lIHRvIGZyZWUgdGhlIHBhZ2VzLCB3ZSB3b24ndAorCQkJICoga25vdyB0aGUgb3JpZ2luaWFsIGJpX2lkeCwgc28gd2UganVzdCBmcmVlCisJCQkgKiB0aGVtIGFsbAorCQkJICovCisJCQlfX2Jpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIG1iaW8sIGosIDApCisJCQkJYnZlYy0+YnZfcGFnZSA9IGJlaGluZF9wYWdlc1tqXTsKKwkJCWlmICh0ZXN0X2JpdChXcml0ZU1vc3RseSwgJmNvbmYtPm1pcnJvcnNbaV0ucmRldi0+ZmxhZ3MpKQorCQkJCWF0b21pY19pbmMoJnIxX2Jpby0+YmVoaW5kX3JlbWFpbmluZyk7CisJCX0KKwogCQlhdG9taWNfaW5jKCZyMV9iaW8tPnJlbWFpbmluZyk7CiAKIAkJYmlvX2xpc3RfYWRkKCZibCwgbWJpbyk7CiAJfQorCWtmcmVlKGJlaGluZF9wYWdlcyk7IC8qIHRoZSBiZWhpbmQgcGFnZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSBiaW9zIG5vdyAqLwogCi0JYml0bWFwX3N0YXJ0d3JpdGUoYml0bWFwLCBiaW8tPmJpX3NlY3RvciwgcjFfYmlvLT5zZWN0b3JzKTsKKwliaXRtYXBfc3RhcnR3cml0ZShiaXRtYXAsIGJpby0+Ymlfc2VjdG9yLCByMV9iaW8tPnNlY3RvcnMsCisJCQkJdGVzdF9iaXQoUjFCSU9fQmVoaW5kSU8sICZyMV9iaW8tPnN0YXRlKSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJYmlvX2xpc3RfbWVyZ2UoJmNvbmYtPnBlbmRpbmdfYmlvX2xpc3QsICZibCk7CiAJYmlvX2xpc3RfaW5pdCgmYmwpOwpAQCAtMTEwNSw2ICsxMjI4LDcgQEAKIAlzZWN0b3JfdCBtYXhfc2VjdG9yLCBucl9zZWN0b3JzOwogCWludCBkaXNrOwogCWludCBpOworCWludCB3b25seTsKIAlpbnQgd3JpdGVfdGFyZ2V0cyA9IDA7CiAJaW50IHN5bmNfYmxvY2tzOwogCWludCBzdGlsbF9kZWdyYWRlZCA9IDA7CkBAIC0xMTYwLDE0ICsxMjg0LDIxIEBACiAJICovCiAJZGlzayA9IGNvbmYtPmxhc3RfdXNlZDsKIAkvKiBtYWtlIHN1cmUgZGlzayBpcyBvcGVyYXRpb25hbCAqLwotCisJd29ubHkgPSBkaXNrOwogCXdoaWxlIChjb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYgPT0gTlVMTCB8fAotCSAgICAgICAhY29uZi0+bWlycm9yc1tkaXNrXS5yZGV2LT5pbl9zeW5jKSB7CisJICAgICAgICFjb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYtPmluX3N5bmMgfHwKKwkgICAgICAgdGVzdF9iaXQoV3JpdGVNb3N0bHksICZjb25mLT5taXJyb3JzW2Rpc2tdLnJkZXYtPmZsYWdzKQorCQkpIHsKKwkJaWYgKGNvbmYtPm1pcnJvcnNbZGlza10ucmRldiAgJiYKKwkJICAgIGNvbmYtPm1pcnJvcnNbZGlza10ucmRldi0+aW5fc3luYykKKwkJCXdvbmx5ID0gZGlzazsKIAkJaWYgKGRpc2sgPD0gMCkKIAkJCWRpc2sgPSBjb25mLT5yYWlkX2Rpc2tzOwogCQlkaXNrLS07Ci0JCWlmIChkaXNrID09IGNvbmYtPmxhc3RfdXNlZCkKKwkJaWYgKGRpc2sgPT0gY29uZi0+bGFzdF91c2VkKSB7CisJCQlkaXNrID0gd29ubHk7CiAJCQlicmVhazsKKwkJfQogCX0KIAljb25mLT5sYXN0X3VzZWQgPSBkaXNrOwogCWF0b21pY19pbmMoJmNvbmYtPm1pcnJvcnNbZGlza10ucmRldi0+bnJfcGVuZGluZyk7CkBAIC0xNDM5LDYgKzE1NzAsMTcgQEAKIHN0YXRpYyBpbnQgc3RvcChtZGRldl90ICptZGRldikKIHsKIAljb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKKwlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOworCWludCBiZWhpbmRfd2FpdCA9IDA7CisKKwkvKiB3YWl0IGZvciBiZWhpbmQgd3JpdGVzIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKGJpdG1hcCAmJiBhdG9taWNfcmVhZCgmYml0bWFwLT5iZWhpbmRfd3JpdGVzKSA+IDApIHsKKwkJYmVoaW5kX3dhaXQrKzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDE6IGJlaGluZCB3cml0ZXMgaW4gcHJvZ3Jlc3Mgb24gZGV2aWNlICVzLCB3YWl0aW5nIHRvIHN0b3AgKCVkKVxuIiwgbWRuYW1lKG1kZGV2KSwgYmVoaW5kX3dhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFopOyAvKiB3YWl0IGEgc2Vjb25kICovCisJCS8qIG5lZWQgdG8ga2ljayBzb21ldGhpbmcgaGVyZSB0byBtYWtlIHN1cmUgSS9PIGdvZXM/ICovCisJfQogCiAJbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRkZXYtPnRocmVhZCk7CiAJbWRkZXYtPnRocmVhZCA9IE5VTEw7CkBAIC0xNTYxLDYgKzE3MDMsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcmFpZDFfcXVpZXNjZShtZGRldl90ICptZGRldiwgaW50IHN0YXRlKQoreworCWNvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOworCisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSAxOgorCQlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CisJCWNvbmYtPmJhcnJpZXIrKzsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2lkbGUsICFjb25mLT5ucl9wZW5kaW5nLAorCQkJCSAgICBjb25mLT5yZXN5bmNfbG9jaywgcmFpZDFfdW5wbHVnKG1kZGV2LT5xdWV1ZSkpOworCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPnJlc3luY19sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CisJCWNvbmYtPmJhcnJpZXItLTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CisJCXdha2VfdXAoJmNvbmYtPndhaXRfcmVzdW1lKTsKKwkJd2FrZV91cCgmY29uZi0+d2FpdF9pZGxlKTsKKwkJYnJlYWs7CisJfQorCWlmIChtZGRldi0+dGhyZWFkKSB7CisJCWlmIChtZGRldi0+Yml0bWFwKQorCQkJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IG1kZGV2LT5iaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOworCQllbHNlCisJCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJfQorfQorCiAKIHN0YXRpYyBtZGtfcGVyc29uYWxpdHlfdCByYWlkMV9wZXJzb25hbGl0eSA9CiB7CkBAIC0xNTc3LDYgKzE3NDgsNyBAQAogCS5zeW5jX3JlcXVlc3QJPSBzeW5jX3JlcXVlc3QsCiAJLnJlc2l6ZQkJPSByYWlkMV9yZXNpemUsCiAJLnJlc2hhcGUJPSByYWlkMV9yZXNoYXBlLAorCS5xdWllc2NlCT0gcmFpZDFfcXVpZXNjZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJhaWRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggNjJlYmIxYmMuLjViZDFlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtNTM4LDcgKzUzOCw4IEBACiAJfQogCiAKLQljdXJyZW50X2Rpc3RhbmNlID0gYWJzKHRoaXNfc2VjdG9yIC0gY29uZi0+bWlycm9yc1tkaXNrXS5oZWFkX3Bvc2l0aW9uKTsKKwljdXJyZW50X2Rpc3RhbmNlID0gYWJzKHIxMF9iaW8tPmRldnNbc2xvdF0uYWRkciAtCisJCQkgICAgICAgY29uZi0+bWlycm9yc1tkaXNrXS5oZWFkX3Bvc2l0aW9uKTsKIAogCS8qIEZpbmQgdGhlIGRpc2sgd2hvc2UgaGVhZCBpcyBjbG9zZXN0ICovCiAKQEAgLTY2OCw2ICs2NjksMTEgQEAKIAlpbnQgaTsKIAlpbnQgY2h1bmtfc2VjdHMgPSBjb25mLT5jaHVua19tYXNrICsgMTsKIAorCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaW8pKSkgeworCQliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIC1FT1BOT1RTVVBQKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogSWYgdGhpcyByZXF1ZXN0IGNyb3NzZXMgYSBjaHVuayBib3VuZGFyeSwgd2UgbmVlZCB0bwogCSAqIHNwbGl0IGl0LiAgVGhpcyB3aWxsIG9ubHkgaGFwcGVuIGZvciAxIFBBR0UgKG9yIGxlc3MpIHJlcXVlc3RzLgogCSAqLwpAQCAtOTAwLDYgKzkwNiwyNyBAQAogCWNvbmYtPnIxMGJ1Zl9wb29sID0gTlVMTDsKIH0KIAorLyogY2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCBkcml2ZXMgZm9yCisgKiBldmVyeSBibG9jayB0byBhcHBlYXIgb24gYXRsZWFzdCBvbmUKKyAqLworc3RhdGljIGludCBlbm91Z2goY29uZl90ICpjb25mKQoreworCWludCBmaXJzdCA9IDA7CisKKwlkbyB7CisJCWludCBuID0gY29uZi0+Y29waWVzOworCQlpbnQgY250ID0gMDsKKwkJd2hpbGUgKG4tLSkgeworCQkJaWYgKGNvbmYtPm1pcnJvcnNbZmlyc3RdLnJkZXYpCisJCQkJY250Kys7CisJCQlmaXJzdCA9IChmaXJzdCsxKSAlIGNvbmYtPnJhaWRfZGlza3M7CisJCX0KKwkJaWYgKGNudCA9PSAwKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoZmlyc3QgIT0gMCk7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgcmFpZDEwX3NwYXJlX2FjdGl2ZShtZGRldl90ICptZGRldikKIHsKIAlpbnQgaTsKQEAgLTkzOCw2ICs5NjUsOCBAQAogCQkgKiB2ZXJ5IGRpZmZlcmVudCBmcm9tIHJlc3luYwogCQkgKi8KIAkJcmV0dXJuIDA7CisJaWYgKCFlbm91Z2goY29uZikpCisJCXJldHVybiAwOwogCiAJZm9yIChtaXJyb3I9MDsgbWlycm9yIDwgbWRkZXYtPnJhaWRfZGlza3M7IG1pcnJvcisrKQogCQlpZiAoICEocD1jb25mLT5taXJyb3JzK21pcnJvciktPnJkZXYpIHsKQEAgLTE0NDUsNyArMTQ3NCwxMyBAQAogCQkJCQl9CiAJCQkJfQogCQkJCWlmIChqID09IGNvbmYtPmNvcGllcykgewotCQkJCQlCVUcoKTsKKwkJCQkJLyogQ2Fubm90IHJlY292ZXIsIHNvIGFib3J0IHRoZSByZWNvdmVyeSAqLworCQkJCQlwdXRfYnVmKHIxMF9iaW8pOworCQkJCQlyMTBfYmlvID0gcmIyOworCQkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfUkVDT1ZFUllfRVJSLCAmbWRkZXYtPnJlY292ZXJ5KSkKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gInJhaWQxMDogJXM6IGluc3VmZmljaWVudCB3b3JraW5nIGRldmljZXMgZm9yIHJlY292ZXJ5LlxuIiwKKwkJCQkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCQlpZiAoYmlvbGlzdCA9PSBOVUxMKSB7CkBAIC0xNjc4LDkgKzE3MTMsMTAgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb25mLT53YWl0X2lkbGUpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfcmVzdW1lKTsKIAotCWlmICghY29uZi0+d29ya2luZ19kaXNrcykgewotCQlwcmludGsoS0VSTl9FUlIgInJhaWQxMDogbm8gb3BlcmF0aW9uYWwgbWlycm9ycyBmb3IgJXNcbiIsCi0JCQltZG5hbWUobWRkZXYpKTsKKwkvKiBuZWVkIHRvIGNoZWNrIHRoYXQgZXZlcnkgYmxvY2sgaGFzIGF0IGxlYXN0IG9uZSB3b3JraW5nIG1pcnJvciAqLworCWlmICghZW5vdWdoKGNvbmYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFpZDEwOiBub3QgZW5vdWdoIG9wZXJhdGlvbmFsIG1pcnJvcnMgZm9yICVzXG4iLAorCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CiAJCWdvdG8gb3V0X2ZyZWVfY29uZjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCA0M2YyMzFhLi40NjgzY2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCisjaW5jbHVkZSA8bGludXgvcmFpZC9iaXRtYXAuaD4KKwogLyoKICAqIFN0cmlwZSBjYWNoZQogICovCkBAIC03OSw4ICs4MSwxMyBAQAogCQlpZiAodGVzdF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSkpIHsKIAkJCWlmICh0ZXN0X2JpdChTVFJJUEVfREVMQVlFRCwgJnNoLT5zdGF0ZSkpCiAJCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmRlbGF5ZWRfbGlzdCk7Ci0JCQllbHNlCisJCQllbHNlIGlmICh0ZXN0X2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKSAmJgorCQkJCSBjb25mLT5zZXFfd3JpdGUgPT0gc2gtPmJtX3NlcSkKKwkJCQlsaXN0X2FkZF90YWlsKCZzaC0+bHJ1LCAmY29uZi0+Yml0bWFwX2xpc3QpOworCQkJZWxzZSB7CisJCQkJY2xlYXJfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpOwogCQkJCWxpc3RfYWRkX3RhaWwoJnNoLT5scnUsICZjb25mLT5oYW5kbGVfbGlzdCk7CisJCQl9CiAJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOwogCQl9IGVsc2UgewogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7CkBAIC0yNDQsNiArMjUxLDkgQEAKIAlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAKIAlkbyB7CisJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9mb3Jfc3RyaXBlLAorCQkJCSAgICBjb25mLT5xdWllc2NlID09IDAsCisJCQkJICAgIGNvbmYtPmRldmljZV9sb2NrLCAvKiBub3RoaW5nICovKTsKIAkJc2ggPSBfX2ZpbmRfc3RyaXBlKGNvbmYsIHNlY3Rvcik7CiAJCWlmICghc2gpIHsKIAkJCWlmICghY29uZi0+aW5hY3RpdmVfYmxvY2tlZCkKQEAgLTgwMyw2ICs4MTMsNyBAQAogewogCXN0cnVjdCBiaW8gKipiaXA7CiAJcmFpZDVfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKKwlpbnQgZmlyc3R3cml0ZT0wOwogCiAJUFJJTlRLKCJhZGRpbmcgYmggYiMlbGx1IHRvIHN0cmlwZSBzIyVsbHVcbiIsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmktPmJpX3NlY3RvciwKQEAgLTgxMSw5ICs4MjIsMTEgQEAKIAogCXNwaW5fbG9jaygmc2gtPmxvY2spOwogCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQlpZiAoZm9yd3JpdGUpCisJaWYgKGZvcndyaXRlKSB7CiAJCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG93cml0ZTsKLQllbHNlCisJCWlmICgqYmlwID09IE5VTEwgJiYgc2gtPmRldltkZF9pZHhdLndyaXR0ZW4gPT0gTlVMTCkKKwkJCWZpcnN0d3JpdGUgPSAxOworCX0gZWxzZQogCQliaXAgPSAmc2gtPmRldltkZF9pZHhdLnRvcmVhZDsKIAl3aGlsZSAoKmJpcCAmJiAoKmJpcCktPmJpX3NlY3RvciA8IGJpLT5iaV9zZWN0b3IpIHsKIAkJaWYgKCgqYmlwKS0+Ymlfc2VjdG9yICsgKCgqYmlwKS0+Ymlfc2l6ZSA+PiA5KSA+IGJpLT5iaV9zZWN0b3IpCkBAIC04MzYsNiArODQ5LDEzIEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmktPmJpX3NlY3RvciwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBkZF9pZHgpOwogCisJaWYgKGNvbmYtPm1kZGV2LT5iaXRtYXAgJiYgZmlyc3R3cml0ZSkgeworCQlzaC0+Ym1fc2VxID0gY29uZi0+c2VxX3dyaXRlOworCQliaXRtYXBfc3RhcnR3cml0ZShjb25mLT5tZGRldi0+Yml0bWFwLCBzaC0+c2VjdG9yLAorCQkJCSAgU1RSSVBFX1NFQ1RPUlMsIDApOworCQlzZXRfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpOworCX0KKwogCWlmIChmb3J3cml0ZSkgewogCQkvKiBjaGVjayBpZiBwYWdlIGlzIGNvdmVyZWQgKi8KIAkJc2VjdG9yX3Qgc2VjdG9yID0gc2gtPmRldltkZF9pZHhdLnNlY3RvcjsKQEAgLTk1OCwxMiArOTc4LDEzIEBACiAJICogbmVlZCB0byBiZSBmYWlsZWQKIAkgKi8KIAlpZiAoZmFpbGVkID4gMSAmJiB0b19yZWFkK3RvX3dyaXRlK3dyaXR0ZW4pIHsKLQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQlmb3IgKGk9ZGlza3M7IGktLTsgKSB7CisJCQlpbnQgYml0bWFwX2VuZCA9IDA7CisJCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCQkvKiBmYWlsIGFsbCB3cml0ZXMgZmlyc3QgKi8KIAkJCWJpID0gc2gtPmRldltpXS50b3dyaXRlOwogCQkJc2gtPmRldltpXS50b3dyaXRlID0gTlVMTDsKLQkJCWlmIChiaSkgdG9fd3JpdGUtLTsKKwkJCWlmIChiaSkgeyB0b193cml0ZS0tOyBiaXRtYXBfZW5kID0gMTsgfQogCiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X092ZXJsYXAsICZzaC0+ZGV2W2ldLmZsYWdzKSkKIAkJCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKQEAgLTk4MSw2ICsxMDAyLDcgQEAKIAkJCS8qIGFuZCBmYWlsIGFsbCAnd3JpdHRlbicgKi8KIAkJCWJpID0gc2gtPmRldltpXS53cml0dGVuOwogCQkJc2gtPmRldltpXS53cml0dGVuID0gTlVMTDsKKwkJCWlmIChiaSkgYml0bWFwX2VuZCA9IDE7CiAJCQl3aGlsZSAoYmkgJiYgYmktPmJpX3NlY3RvciA8IHNoLT5kZXZbaV0uc2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQlzdHJ1Y3QgYmlvICpiaTIgPSByNV9uZXh0X2JpbyhiaSwgc2gtPmRldltpXS5zZWN0b3IpOwogCQkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwpAQCAtMTAwOSw4ICsxMDMxLDExIEBACiAJCQkJCWJpID0gbmV4dGJpOwogCQkJCX0KIAkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJaWYgKGJpdG1hcF9lbmQpCisJCQkJYml0bWFwX2VuZHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCisJCQkJCQlTVFJJUEVfU0VDVE9SUywgMCwgMCk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJfQogCWlmIChmYWlsZWQgPiAxICYmIHN5bmNpbmcpIHsKIAkJbWRfZG9uZV9zeW5jKGNvbmYtPm1kZGV2LCBTVFJJUEVfU0VDVE9SUywwKTsKQEAgLTEwMzgsNiArMTA2Myw3IEBACiAJCQkgdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSApIHsKIAkJCS8qIFdlIGNhbiByZXR1cm4gYW55IHdyaXRlIHJlcXVlc3RzICovCiAJCQkgICAgc3RydWN0IGJpbyAqd2JpLCAqd2JpMjsKKwkJCSAgICBpbnQgYml0bWFwX2VuZCA9IDA7CiAJCQkgICAgUFJJTlRLKCJSZXR1cm4gd3JpdGUgZm9yIGRpc2MgJWRcbiIsIGkpOwogCQkJICAgIHNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCSAgICB3YmkgPSBkZXYtPndyaXR0ZW47CkBAIC0xMDUxLDcgKzEwNzcsMTMgQEAKIAkJCQkgICAgfQogCQkJCSAgICB3YmkgPSB3YmkyOwogCQkJICAgIH0KKwkJCSAgICBpZiAoZGV2LT50b3dyaXRlID09IE5VTEwpCisJCQkJICAgIGJpdG1hcF9lbmQgPSAxOwogCQkJICAgIHNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJICAgIGlmIChiaXRtYXBfZW5kKQorCQkJCSAgICBiaXRtYXBfZW5kd3JpdGUoY29uZi0+bWRkZXYtPmJpdG1hcCwgc2gtPnNlY3RvciwKKwkJCQkJCSAgICBTVFJJUEVfU0VDVE9SUywKKwkJCQkJCSAgICAhdGVzdF9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKSwgMCk7CiAJCSAgICB9CiAJCX0KIAl9CkBAIC0xMTc1LDcgKzEyMDcsOCBAQAogCQkJCX0KIAkJCX0KIAkJLyogbm93IGlmIG5vdGhpbmcgaXMgbG9ja2VkLCBhbmQgaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgd2UgY2FuIHN0YXJ0IGEgd3JpdGUgcmVxdWVzdCAqLwotCQlpZiAobG9ja2VkID09IDAgJiYgKHJjdyA9PSAwIHx8cm13ID09IDApKSB7CisJCWlmIChsb2NrZWQgPT0gMCAmJiAocmN3ID09IDAgfHxybXcgPT0gMCkgJiYKKwkJICAgICF0ZXN0X2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKSkgewogCQkJUFJJTlRLKCJDb21wdXRpbmcgcGFyaXR5Li4uXG4iKTsKIAkJCWNvbXB1dGVfcGFyaXR5KHNoLCByY3c9PTAgPyBSRUNPTlNUUlVDVF9XUklURSA6IFJFQURfTU9ESUZZX1dSSVRFKTsKIAkJCS8qIG5vdyBldmVyeSBsb2NrZWQgYnVmZmVyIGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4gKi8KQEAgLTEyMzEsNiArMTI2NCw3IEBACiAJCQlkZXYgPSAmc2gtPmRldltmYWlsZWRfbnVtXTsKIAkJCXNldF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncyk7CiAJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CiAJCQlsb2NrZWQrKzsKIAkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CiAJCQlzZXRfYml0KFI1X1N5bmNpbywgJmRldi0+ZmxhZ3MpOwpAQCAtMTI5OCw2ICsxMzMyLDggQEAKIAkJCWJpLT5iaV9uZXh0ID0gTlVMTDsKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpKTsKIAkJfSBlbHNlIHsKKwkJCWlmIChydyA9PSAxKQorCQkJCXNldF9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKTsKIAkJCVBSSU5USygic2tpcCBvcCAlbGQgb24gZGlzYyAlZCBmb3Igc2VjdG9yICVsbHVcbiIsCiAJCQkJYmktPmJpX3J3LCBpLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwogCQkJY2xlYXJfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpOwpAQCAtMTMyMiw2ICsxMzU4LDIwIEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfYml0X2RlbGF5KHJhaWQ1X2NvbmZfdCAqY29uZikKK3sKKwkvKiBkZXZpY2VfbG9jayBpcyBoZWxkICovCisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWxpc3RfYWRkKCZoZWFkLCAmY29uZi0+Yml0bWFwX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmNvbmYtPmJpdG1hcF9saXN0KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmhlYWQpKSB7CisJCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2ggPSBsaXN0X2VudHJ5KGhlYWQubmV4dCwgc3RydWN0IHN0cmlwZV9oZWFkLCBscnUpOworCQlsaXN0X2RlbF9pbml0KCZzaC0+bHJ1KTsKKwkJYXRvbWljX2luYygmc2gtPmNvdW50KTsKKwkJX19yZWxlYXNlX3N0cmlwZShjb25mLCBzaCk7CisJfQorfQorCiBzdGF0aWMgdm9pZCB1bnBsdWdfc2xhdmVzKG1kZGV2X3QgKm1kZGV2KQogewogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwpAQCAtMTM1NCw4ICsxNDA0LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAotCWlmIChibGtfcmVtb3ZlX3BsdWcocSkpCisJaWYgKGJsa19yZW1vdmVfcGx1ZyhxKSkgeworCQljb25mLT5zZXFfZmx1c2grKzsKIAkJcmFpZDVfYWN0aXZhdGVfZGVsYXllZChjb25mKTsKKwl9CiAJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CkBAIC0xNDExLDYgKzE0NjMsMTEgQEAKIAlzZWN0b3JfdCBsb2dpY2FsX3NlY3RvciwgbGFzdF9zZWN0b3I7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKIAorCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaSkpKSB7CisJCWJpb19lbmRpbyhiaSwgYmktPmJpX3NpemUsIC1FT1BOT1RTVVBQKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpKTsKIAogCWlmIChiaW9fZGF0YV9kaXIoYmkpPT1XUklURSkgewpAQCAtMTQ4OCwxMCArMTU0NSwyMCBAQAogCXNlY3Rvcl90IGZpcnN0X3NlY3RvcjsKIAlpbnQgcmFpZF9kaXNrcyA9IGNvbmYtPnJhaWRfZGlza3M7CiAJaW50IGRhdGFfZGlza3MgPSByYWlkX2Rpc2tzLTE7CisJc2VjdG9yX3QgbWF4X3NlY3RvciA9IG1kZGV2LT5zaXplIDw8IDE7CisJaW50IHN5bmNfYmxvY2tzOwogCi0JaWYgKHNlY3Rvcl9uciA+PSBtZGRldi0+c2l6ZSA8PDEpIHsKKwlpZiAoc2VjdG9yX25yID49IG1heF9zZWN0b3IpIHsKIAkJLyoganVzdCBiZWluZyB0b2xkIHRvIGZpbmlzaCB1cCAuLiBub3RoaW5nIG11Y2ggdG8gZG8gKi8KIAkJdW5wbHVnX3NsYXZlcyhtZGRldik7CisKKwkJaWYgKG1kZGV2LT5jdXJyX3Jlc3luYyA8IG1heF9zZWN0b3IpIC8qIGFib3J0ZWQgKi8KKwkJCWJpdG1hcF9lbmRfc3luYyhtZGRldi0+Yml0bWFwLCBtZGRldi0+Y3Vycl9yZXN5bmMsCisJCQkJCSZzeW5jX2Jsb2NrcywgMSk7CisJCWVsc2UgLyogY29tcGVsdGVkIHN5bmMgKi8KKwkJCWNvbmYtPmZ1bGxzeW5jID0gMDsKKwkJYml0bWFwX2Nsb3NlX3N5bmMobWRkZXYtPmJpdG1hcCk7CisKIAkJcmV0dXJuIDA7CiAJfQogCS8qIGlmIHRoZXJlIGlzIDEgb3IgbW9yZSBmYWlsZWQgZHJpdmVzIGFuZCB3ZSBhcmUgdHJ5aW5nCkBAIC0xNTAzLDYgKzE1NzAsMTMgQEAKIAkJKnNraXBwZWQgPSAxOwogCQlyZXR1cm4gcnY7CiAJfQorCWlmICghYml0bWFwX3N0YXJ0X3N5bmMobWRkZXYtPmJpdG1hcCwgc2VjdG9yX25yLCAmc3luY19ibG9ja3MsIDEpICYmCisJICAgICFjb25mLT5mdWxsc3luYyAmJiBzeW5jX2Jsb2NrcyA+PSBTVFJJUEVfU0VDVE9SUykgeworCQkvKiB3ZSBjYW4gc2tpcCB0aGlzIGJsb2NrLCBhbmQgcHJvYmFibHkgbW9yZSAqLworCQlzeW5jX2Jsb2NrcyAvPSBTVFJJUEVfU0VDVE9SUzsKKwkJKnNraXBwZWQgPSAxOworCQlyZXR1cm4gc3luY19ibG9ja3MgKiBTVFJJUEVfU0VDVE9SUzsgLyoga2VlcCB0aGluZ3Mgcm91bmRlZCB0byB3aG9sZSBzdHJpcGVzICovCisJfQogCiAJeCA9IHNlY3Rvcl9ucjsKIAljaHVua19vZmZzZXQgPSBzZWN0b3JfZGl2KHgsIHNlY3RvcnNfcGVyX2NodW5rKTsKQEAgLTE1MjAsNiArMTU5NCw3IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJc2NoZWR1bGVfdGltZW91dCgxKTsKIAl9CisJYml0bWFwX3N0YXJ0X3N5bmMobWRkZXYtPmJpdG1hcCwgc2VjdG9yX25yLCAmc3luY19ibG9ja3MsIDApOwogCXNwaW5fbG9jaygmc2gtPmxvY2spOwkKIAlzZXRfYml0KFNUUklQRV9TWU5DSU5HLCAmc2gtPnN0YXRlKTsKIAljbGVhcl9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CkBAIC0xNTUzLDYgKzE2MjgsMTMgQEAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICpmaXJzdDsKIAorCQlpZiAoY29uZi0+c2VxX2ZsdXNoIC0gY29uZi0+c2VxX3dyaXRlID4gMCkgeworCQkJaW50IHNlcSA9IGNvbmYtPnNlcV9mbHVzaDsKKwkJCWJpdG1hcF91bnBsdWcobWRkZXYtPmJpdG1hcCk7CisJCQljb25mLT5zZXFfd3JpdGUgPSBzZXE7CisJCQlhY3RpdmF0ZV9iaXRfZGVsYXkoY29uZik7CisJCX0KKwogCQlpZiAobGlzdF9lbXB0eSgmY29uZi0+aGFuZGxlX2xpc3QpICYmCiAJCSAgICBhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPCBJT19USFJFU0hPTEQgJiYKIAkJICAgICFibGtfcXVldWVfcGx1Z2dlZChtZGRldi0+cXVldWUpICYmCkBAIC0xNTg2LDcgKzE2NjgsNyBAQAogCVBSSU5USygiLS0tIHJhaWQ1ZCBpbmFjdGl2ZVxuIik7CiB9CiAKLXN0YXRpYyBpbnQgcnVuIChtZGRldl90ICptZGRldikKK3N0YXRpYyBpbnQgcnVuKG1kZGV2X3QgKm1kZGV2KQogewogCXJhaWQ1X2NvbmZfdCAqY29uZjsKIAlpbnQgcmFpZF9kaXNrLCBtZW1vcnk7CkBAIC0xNjE2LDYgKzE2OTgsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwogCUlOSVRfTElTVF9IRUFEKCZjb25mLT5oYW5kbGVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmRlbGF5ZWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmJpdG1hcF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY29uZi0+aW5hY3RpdmVfbGlzdCk7CiAJYXRvbWljX3NldCgmY29uZi0+YWN0aXZlX3N0cmlwZXMsIDApOwogCWF0b21pY19zZXQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMsIDApOwpAQCAtMTcyNyw2ICsxODEwLDkgQEAKIAogCS8qIE9rLCBldmVyeXRoaW5nIGlzIGp1c3QgZmluZSBub3cgKi8KIAorCWlmIChtZGRldi0+Yml0bWFwKQorCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gbWRkZXYtPmJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CisKIAltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IHJhaWQ1X3VucGx1Z19kZXZpY2U7CiAJbWRkZXYtPnF1ZXVlLT5pc3N1ZV9mbHVzaF9mbiA9IHJhaWQ1X2lzc3VlX2ZsdXNoOwogCkBAIC0xOTA3LDYgKzE5OTMsOCBAQAogCQkJcmRldi0+aW5fc3luYyA9IDA7CiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSBkaXNrOwogCQkJZm91bmQgPSAxOworCQkJaWYgKHJkZXYtPnNhdmVkX3JhaWRfZGlzayAhPSBkaXNrKQorCQkJCWNvbmYtPmZ1bGxzeW5jID0gMTsKIAkJCXAtPnJkZXYgPSByZGV2OwogCQkJYnJlYWs7CiAJCX0KQEAgLTE5MzYsNiArMjAyNCwzNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCByYWlkNV9xdWllc2NlKG1kZGV2X3QgKm1kZGV2LCBpbnQgc3RhdGUpCit7CisJcmFpZDVfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CisKKwlzd2l0Y2goc3RhdGUpIHsKKwljYXNlIDE6IC8qIHN0b3AgYWxsIHdyaXRlcyAqLworCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCWNvbmYtPnF1aWVzY2UgPSAxOworCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGNvbmYtPndhaXRfZm9yX3N0cmlwZSwKKwkJCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKSA9PSAwLAorCQkJCSAgICBjb25mLT5kZXZpY2VfbG9jaywgLyogbm90aGluZyAqLyk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQlicmVhazsKKworCWNhc2UgMDogLyogcmUtZW5hYmxlIHdyaXRlcyAqLworCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCWNvbmYtPnF1aWVzY2UgPSAwOworCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9zdHJpcGUpOworCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJYnJlYWs7CisJfQorCWlmIChtZGRldi0+dGhyZWFkKSB7CisJCWlmIChtZGRldi0+Yml0bWFwKQorCQkJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IG1kZGV2LT5iaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOworCQllbHNlCisJCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJfQorfQogc3RhdGljIG1ka19wZXJzb25hbGl0eV90IHJhaWQ1X3BlcnNvbmFsaXR5PQogewogCS5uYW1lCQk9ICJyYWlkNSIsCkBAIC0xOTUwLDYgKzIwNjcsNyBAQAogCS5zcGFyZV9hY3RpdmUJPSByYWlkNV9zcGFyZV9hY3RpdmUsCiAJLnN5bmNfcmVxdWVzdAk9IHN5bmNfcmVxdWVzdCwKIAkucmVzaXplCQk9IHJhaWQ1X3Jlc2l6ZSwKKwkucXVpZXNjZQk9IHJhaWQ1X3F1aWVzY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByYWlkNV9pbml0ICh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNm1haW4uYyBiL2RyaXZlcnMvbWQvcmFpZDZtYWluLmMKaW5kZXggNDk1ZGVlMS4uMjY3ZWIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNm1haW4uYworKysgYi9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jCkBAIC0yOSw2ICsyOSw4IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgInJhaWQ2LmgiCiAKKyNpbmNsdWRlIDxsaW51eC9yYWlkL2JpdG1hcC5oPgorCiAvKgogICogU3RyaXBlIGNhY2hlCiAgKi8KQEAgLTk4LDggKzEwMCwxMyBAQAogCQlpZiAodGVzdF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSkpIHsKIAkJCWlmICh0ZXN0X2JpdChTVFJJUEVfREVMQVlFRCwgJnNoLT5zdGF0ZSkpCiAJCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmRlbGF5ZWRfbGlzdCk7Ci0JCQllbHNlCisJCQllbHNlIGlmICh0ZXN0X2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKSAmJgorCQkJCSBjb25mLT5zZXFfd3JpdGUgPT0gc2gtPmJtX3NlcSkKKwkJCQlsaXN0X2FkZF90YWlsKCZzaC0+bHJ1LCAmY29uZi0+Yml0bWFwX2xpc3QpOworCQkJZWxzZSB7CisJCQkJY2xlYXJfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpOwogCQkJCWxpc3RfYWRkX3RhaWwoJnNoLT5scnUsICZjb25mLT5oYW5kbGVfbGlzdCk7CisJCQl9CiAJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOwogCQl9IGVsc2UgewogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7CkBAIC0yNjIsNiArMjY5LDkgQEAKIAlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAKIAlkbyB7CisJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9mb3Jfc3RyaXBlLAorCQkJCSAgICBjb25mLT5xdWllc2NlID09IDAsCisJCQkJICAgIGNvbmYtPmRldmljZV9sb2NrLCAvKiBub3RoaW5nICovKTsKIAkJc2ggPSBfX2ZpbmRfc3RyaXBlKGNvbmYsIHNlY3Rvcik7CiAJCWlmICghc2gpIHsKIAkJCWlmICghY29uZi0+aW5hY3RpdmVfYmxvY2tlZCkKQEAgLTkwNiw2ICs5MTYsNyBAQAogewogCXN0cnVjdCBiaW8gKipiaXA7CiAJcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKKwlpbnQgZmlyc3R3cml0ZT0wOwogCiAJUFJJTlRLKCJhZGRpbmcgYmggYiMlbGx1IHRvIHN0cmlwZSBzIyVsbHVcbiIsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmktPmJpX3NlY3RvciwKQEAgLTkxNCw5ICs5MjUsMTEgQEAKIAogCXNwaW5fbG9jaygmc2gtPmxvY2spOwogCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQlpZiAoZm9yd3JpdGUpCisJaWYgKGZvcndyaXRlKSB7CiAJCWJpcCA9ICZzaC0+ZGV2W2RkX2lkeF0udG93cml0ZTsKLQllbHNlCisJCWlmICgqYmlwID09IE5VTEwgJiYgc2gtPmRldltkZF9pZHhdLndyaXR0ZW4gPT0gTlVMTCkKKwkJCWZpcnN0d3JpdGUgPSAxOworCX0gZWxzZQogCQliaXAgPSAmc2gtPmRldltkZF9pZHhdLnRvcmVhZDsKIAl3aGlsZSAoKmJpcCAmJiAoKmJpcCktPmJpX3NlY3RvciA8IGJpLT5iaV9zZWN0b3IpIHsKIAkJaWYgKCgqYmlwKS0+Ymlfc2VjdG9yICsgKCgqYmlwKS0+Ymlfc2l6ZSA+PiA5KSA+IGJpLT5iaV9zZWN0b3IpCkBAIC05MzksNiArOTUyLDEzIEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmktPmJpX3NlY3RvciwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBkZF9pZHgpOwogCisJaWYgKGNvbmYtPm1kZGV2LT5iaXRtYXAgJiYgZmlyc3R3cml0ZSkgeworCQlzaC0+Ym1fc2VxID0gY29uZi0+c2VxX3dyaXRlOworCQliaXRtYXBfc3RhcnR3cml0ZShjb25mLT5tZGRldi0+Yml0bWFwLCBzaC0+c2VjdG9yLAorCQkJCSAgU1RSSVBFX1NFQ1RPUlMsIDApOworCQlzZXRfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpOworCX0KKwogCWlmIChmb3J3cml0ZSkgewogCQkvKiBjaGVjayBpZiBwYWdlIGlzIGNvdmVyZWQgKi8KIAkJc2VjdG9yX3Qgc2VjdG9yID0gc2gtPmRldltkZF9pZHhdLnNlY3RvcjsKQEAgLTEwNjYsMTIgKzEwODYsMTMgQEAKIAkgKiBuZWVkIHRvIGJlIGZhaWxlZAogCSAqLwogCWlmIChmYWlsZWQgPiAyICYmIHRvX3JlYWQrdG9fd3JpdGUrd3JpdHRlbikgewotCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCWZvciAoaT1kaXNrczsgaS0tOyApIHsKKwkJCWludCBiaXRtYXBfZW5kID0gMDsKKwkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCS8qIGZhaWwgYWxsIHdyaXRlcyBmaXJzdCAqLwogCQkJYmkgPSBzaC0+ZGV2W2ldLnRvd3JpdGU7CiAJCQlzaC0+ZGV2W2ldLnRvd3JpdGUgPSBOVUxMOwotCQkJaWYgKGJpKSB0b193cml0ZS0tOworCQkJaWYgKGJpKSB7IHRvX3dyaXRlLS07IGJpdG1hcF9lbmQgPSAxOyB9CiAKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfT3ZlcmxhcCwgJnNoLT5kZXZbaV0uZmxhZ3MpKQogCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwpAQCAtMTA4OSw2ICsxMTEwLDcgQEAKIAkJCS8qIGFuZCBmYWlsIGFsbCAnd3JpdHRlbicgKi8KIAkJCWJpID0gc2gtPmRldltpXS53cml0dGVuOwogCQkJc2gtPmRldltpXS53cml0dGVuID0gTlVMTDsKKwkJCWlmIChiaSkgYml0bWFwX2VuZCA9IDE7CiAJCQl3aGlsZSAoYmkgJiYgYmktPmJpX3NlY3RvciA8IHNoLT5kZXZbaV0uc2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQlzdHJ1Y3QgYmlvICpiaTIgPSByNV9uZXh0X2JpbyhiaSwgc2gtPmRldltpXS5zZWN0b3IpOwogCQkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwpAQCAtMTExNyw4ICsxMTM5LDExIEBACiAJCQkJCWJpID0gbmV4dGJpOwogCQkJCX0KIAkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJaWYgKGJpdG1hcF9lbmQpCisJCQkJYml0bWFwX2VuZHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCisJCQkJCQlTVFJJUEVfU0VDVE9SUywgMCwgMCk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJfQogCWlmIChmYWlsZWQgPiAyICYmIHN5bmNpbmcpIHsKIAkJbWRfZG9uZV9zeW5jKGNvbmYtPm1kZGV2LCBTVFJJUEVfU0VDVE9SUywwKTsKQEAgLTExNTUsNiArMTE4MCw3IEBACiAJCQkJaWYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAmJgogCQkJCSAgICB0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICkgewogCQkJCQkvKiBXZSBjYW4gcmV0dXJuIGFueSB3cml0ZSByZXF1ZXN0cyAqLworCQkJCQlpbnQgYml0bWFwX2VuZCA9IDA7CiAJCQkJCXN0cnVjdCBiaW8gKndiaSwgKndiaTI7CiAJCQkJCVBSSU5USygiUmV0dXJuIHdyaXRlIGZvciBzdHJpcGUgJWxsdSBkaXNjICVkXG4iLAogCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpKTsKQEAgLTExNzAsNyArMTE5NiwxMyBAQAogCQkJCQkJfQogCQkJCQkJd2JpID0gd2JpMjsKIAkJCQkJfQorCQkJCQlpZiAoZGV2LT50b3dyaXRlID09IE5VTEwpCisJCQkJCQliaXRtYXBfZW5kID0gMTsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCQkJCWlmIChiaXRtYXBfZW5kKQorCQkJCQkJYml0bWFwX2VuZHdyaXRlKGNvbmYtPm1kZGV2LT5iaXRtYXAsIHNoLT5zZWN0b3IsCisJCQkJCQkJCVNUUklQRV9TRUNUT1JTLAorCQkJCQkJCQkhdGVzdF9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKSwgMCk7CiAJCQkJfQogCQkJfQogCX0KQEAgLTEyODUsNyArMTMxNyw4IEBACiAJCQkJfQogCQkJfQogCQkvKiBub3cgaWYgbm90aGluZyBpcyBsb2NrZWQsIGFuZCBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhLCB3ZSBjYW4gc3RhcnQgYSB3cml0ZSByZXF1ZXN0ICovCi0JCWlmIChsb2NrZWQgPT0gMCAmJiByY3cgPT0gMCkgeworCQlpZiAobG9ja2VkID09IDAgJiYgcmN3ID09IDAgJiYKKwkJICAgICF0ZXN0X2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKSkgewogCQkJaWYgKCBtdXN0X2NvbXB1dGUgPiAwICkgewogCQkJCS8qIFdlIGhhdmUgZmFpbGVkIGJsb2NrcyBhbmQgbmVlZCB0byBjb21wdXRlIHRoZW0gKi8KIAkJCQlzd2l0Y2ggKCBmYWlsZWQgKSB7CkBAIC0xMzg4LDYgKzE0MjEsNyBAQAogCQkJYmRldiA9ICZzaC0+ZGV2W2ZhaWxlZF9udW1bMV1dOwogCQkJbG9ja2VkICs9ICF0ZXN0X2JpdChSNV9MT0NLRUQsICZiZGV2LT5mbGFncyk7CiAJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmJkZXYtPmZsYWdzKTsKKwkJCWNsZWFyX2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpOwogCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZiZGV2LT5mbGFncyk7CiAKIAkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CkBAIC0xNDU3LDYgKzE0OTEsOCBAQAogCQkJYmktPmJpX25leHQgPSBOVUxMOwogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmkpOwogCQl9IGVsc2UgeworCQkJaWYgKHJ3ID09IDEpCisJCQkJc2V0X2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpOwogCQkJUFJJTlRLKCJza2lwIG9wICVsZCBvbiBkaXNjICVkIGZvciBzZWN0b3IgJWxsdVxuIiwKIAkJCQliaS0+YmlfcncsIGksICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CiAJCQljbGVhcl9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7CkBAIC0xNDgxLDYgKzE1MTcsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9iaXRfZGVsYXkocmFpZDZfY29uZl90ICpjb25mKQoreworCS8qIGRldmljZV9sb2NrIGlzIGhlbGQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJbGlzdF9hZGQoJmhlYWQsICZjb25mLT5iaXRtYXBfbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmY29uZi0+Yml0bWFwX2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eSgmaGVhZCkpIHsKKwkJc3RydWN0IHN0cmlwZV9oZWFkICpzaCA9IGxpc3RfZW50cnkoaGVhZC5uZXh0LCBzdHJ1Y3Qgc3RyaXBlX2hlYWQsIGxydSk7CisJCWxpc3RfZGVsX2luaXQoJnNoLT5scnUpOworCQlhdG9taWNfaW5jKCZzaC0+Y291bnQpOworCQlfX3JlbGVhc2Vfc3RyaXBlKGNvbmYsIHNoKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHVucGx1Z19zbGF2ZXMobWRkZXZfdCAqbWRkZXYpCiB7CiAJcmFpZDZfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CkBAIC0xNTEzLDggKzE1NjMsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGJsa19yZW1vdmVfcGx1ZyhxKSkKKwlpZiAoYmxrX3JlbW92ZV9wbHVnKHEpKSB7CisJCWNvbmYtPnNlcV9mbHVzaCsrOwogCQlyYWlkNl9hY3RpdmF0ZV9kZWxheWVkKGNvbmYpOworCX0KIAltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTE1NzAsNiArMTYyMiwxMSBAQAogCXNlY3Rvcl90IGxvZ2ljYWxfc2VjdG9yLCBsYXN0X3NlY3RvcjsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCisJaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpKSkpIHsKKwkJYmlvX2VuZGlvKGJpLCBiaS0+Ymlfc2l6ZSwgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CisKIAltZF93cml0ZV9zdGFydChtZGRldiwgYmkpOwogCiAJaWYgKGJpb19kYXRhX2RpcihiaSk9PVdSSVRFKSB7CkBAIC0xNjQ3LDEwICsxNzA0LDIwIEBACiAJc2VjdG9yX3QgZmlyc3Rfc2VjdG9yOwogCWludCByYWlkX2Rpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKIAlpbnQgZGF0YV9kaXNrcyA9IHJhaWRfZGlza3MgLSAyOworCXNlY3Rvcl90IG1heF9zZWN0b3IgPSBtZGRldi0+c2l6ZSA8PCAxOworCWludCBzeW5jX2Jsb2NrczsKIAotCWlmIChzZWN0b3JfbnIgPj0gbWRkZXYtPnNpemUgPDwxKSB7CisJaWYgKHNlY3Rvcl9uciA+PSBtYXhfc2VjdG9yKSB7CiAJCS8qIGp1c3QgYmVpbmcgdG9sZCB0byBmaW5pc2ggdXAgLi4gbm90aGluZyBtdWNoIHRvIGRvICovCiAJCXVucGx1Z19zbGF2ZXMobWRkZXYpOworCisJCWlmIChtZGRldi0+Y3Vycl9yZXN5bmMgPCBtYXhfc2VjdG9yKSAvKiBhYm9ydGVkICovCisJCQliaXRtYXBfZW5kX3N5bmMobWRkZXYtPmJpdG1hcCwgbWRkZXYtPmN1cnJfcmVzeW5jLAorCQkJCQkmc3luY19ibG9ja3MsIDEpOworCQllbHNlIC8qIGNvbXBlbHRlZCBzeW5jICovCisJCQljb25mLT5mdWxsc3luYyA9IDA7CisJCWJpdG1hcF9jbG9zZV9zeW5jKG1kZGV2LT5iaXRtYXApOworCiAJCXJldHVybiAwOwogCX0KIAkvKiBpZiB0aGVyZSBhcmUgMiBvciBtb3JlIGZhaWxlZCBkcml2ZXMgYW5kIHdlIGFyZSB0cnlpbmcKQEAgLTE2NjIsNiArMTcyOSwxMyBAQAogCQkqc2tpcHBlZCA9IDE7CiAJCXJldHVybiBydjsKIAl9CisJaWYgKCFiaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2NrcywgMSkgJiYKKwkgICAgIWNvbmYtPmZ1bGxzeW5jICYmIHN5bmNfYmxvY2tzID49IFNUUklQRV9TRUNUT1JTKSB7CisJCS8qIHdlIGNhbiBza2lwIHRoaXMgYmxvY2ssIGFuZCBwcm9iYWJseSBtb3JlICovCisJCXN5bmNfYmxvY2tzIC89IFNUUklQRV9TRUNUT1JTOworCQkqc2tpcHBlZCA9IDE7CisJCXJldHVybiBzeW5jX2Jsb2NrcyAqIFNUUklQRV9TRUNUT1JTOyAvKiBrZWVwIHRoaW5ncyByb3VuZGVkIHRvIHdob2xlIHN0cmlwZXMgKi8KKwl9CiAKIAl4ID0gc2VjdG9yX25yOwogCWNodW5rX29mZnNldCA9IHNlY3Rvcl9kaXYoeCwgc2VjdG9yc19wZXJfY2h1bmspOwpAQCAtMTY3OSw2ICsxNzUzLDcgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCX0KKwliaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLCBzZWN0b3JfbnIsICZzeW5jX2Jsb2NrcywgMCk7CiAJc3Bpbl9sb2NrKCZzaC0+bG9jayk7CiAJc2V0X2JpdChTVFJJUEVfU1lOQ0lORywgJnNoLT5zdGF0ZSk7CiAJY2xlYXJfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOwpAQCAtMTcxMiw2ICsxNzg3LDEzIEBACiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3Q7CiAKKwkJaWYgKGNvbmYtPnNlcV9mbHVzaCAtIGNvbmYtPnNlcV93cml0ZSA+IDApIHsKKwkJCWludCBzZXEgPSBjb25mLT5zZXFfZmx1c2g7CisJCQliaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApOworCQkJY29uZi0+c2VxX3dyaXRlID0gc2VxOworCQkJYWN0aXZhdGVfYml0X2RlbGF5KGNvbmYpOworCQl9CisKIAkJaWYgKGxpc3RfZW1wdHkoJmNvbmYtPmhhbmRsZV9saXN0KSAmJgogCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpIDwgSU9fVEhSRVNIT0xEICYmCiAJCSAgICAhYmxrX3F1ZXVlX3BsdWdnZWQobWRkZXYtPnF1ZXVlKSAmJgpAQCAtMTc0NSw3ICsxODI3LDcgQEAKIAlQUklOVEsoIi0tLSByYWlkNmQgaW5hY3RpdmVcbiIpOwogfQogCi1zdGF0aWMgaW50IHJ1biAobWRkZXZfdCAqbWRkZXYpCitzdGF0aWMgaW50IHJ1bihtZGRldl90ICptZGRldikKIHsKIAlyYWlkNl9jb25mX3QgKmNvbmY7CiAJaW50IHJhaWRfZGlzaywgbWVtb3J5OwpAQCAtMTc3NSw2ICsxODU3LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKIAlJTklUX0xJU1RfSEVBRCgmY29uZi0+aGFuZGxlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZjb25mLT5kZWxheWVkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjb25mLT5iaXRtYXBfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNvbmYtPmluYWN0aXZlX2xpc3QpOwogCWF0b21pY19zZXQoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzLCAwKTsKIAlhdG9taWNfc2V0KCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzLCAwKTsKQEAgLTE4OTQsNiArMTk3Nyw5IEBACiAJLyogT2ssIGV2ZXJ5dGhpbmcgaXMganVzdCBmaW5lIG5vdyAqLwogCW1kZGV2LT5hcnJheV9zaXplID0gIG1kZGV2LT5zaXplICogKG1kZGV2LT5yYWlkX2Rpc2tzIC0gMik7CiAKKwlpZiAobWRkZXYtPmJpdG1hcCkKKwkJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IG1kZGV2LT5iaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOworCiAJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkNl91bnBsdWdfZGV2aWNlOwogCW1kZGV2LT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSByYWlkNl9pc3N1ZV9mbHVzaDsKIAlyZXR1cm4gMDsKQEAgLTIwNzEsNiArMjE1Nyw4IEBACiAJCQlyZGV2LT5pbl9zeW5jID0gMDsKIAkJCXJkZXYtPnJhaWRfZGlzayA9IGRpc2s7CiAJCQlmb3VuZCA9IDE7CisJCQlpZiAocmRldi0+c2F2ZWRfcmFpZF9kaXNrICE9IGRpc2spCisJCQkJY29uZi0+ZnVsbHN5bmMgPSAxOwogCQkJcC0+cmRldiA9IHJkZXY7CiAJCQlicmVhazsKIAkJfQpAQCAtMjEwMCw2ICsyMTg4LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJhaWQ2X3F1aWVzY2UobWRkZXZfdCAqbWRkZXYsIGludCBzdGF0ZSkKK3sKKwlyYWlkNl9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKKworCXN3aXRjaChzdGF0ZSkgeworCWNhc2UgMTogLyogc3RvcCBhbGwgd3JpdGVzICovCisJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJY29uZi0+cXVpZXNjZSA9IDE7CisJCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9mb3Jfc3RyaXBlLAorCQkJCSAgICBhdG9taWNfcmVhZCgmY29uZi0+YWN0aXZlX3N0cmlwZXMpID09IDAsCisJCQkJICAgIGNvbmYtPmRldmljZV9sb2NrLCAvKiBub3RoaW5nICovKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSAwOiAvKiByZS1lbmFibGUgd3JpdGVzICovCisJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJY29uZi0+cXVpZXNjZSA9IDA7CisJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX3N0cmlwZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQlicmVhazsKKwl9CisJaWYgKG1kZGV2LT50aHJlYWQpIHsKKwkJaWYgKG1kZGV2LT5iaXRtYXApCisJCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gbWRkZXYtPmJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CisJCWVsc2UKKwkJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKKwl9Cit9CiBzdGF0aWMgbWRrX3BlcnNvbmFsaXR5X3QgcmFpZDZfcGVyc29uYWxpdHk9CiB7CiAJLm5hbWUJCT0gInJhaWQ2IiwKQEAgLTIxMTQsNiArMjIzMSw3IEBACiAJLnNwYXJlX2FjdGl2ZQk9IHJhaWQ2X3NwYXJlX2FjdGl2ZSwKIAkuc3luY19yZXF1ZXN0CT0gc3luY19yZXF1ZXN0LAogCS5yZXNpemUJCT0gcmFpZDZfcmVzaXplLAorCS5xdWllc2NlCT0gcmFpZDZfcXVpZXNjZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJhaWQ2X2luaXQgKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9NYWtlZmlsZQppbmRleCA3NzJkNjExLi5jNTc4YTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvTWFrZWZpbGUKQEAgLTIsNCArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIG11bHRpbWVkaWEgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLW9iai15ICAgICAgICA6PSB2aWRlby8gcmFkaW8vIGR2Yi8gY29tbW9uLworb2JqLXkgOj0gY29tbW9uLworb2JqLSQoQ09ORklHX1ZJREVPX0RFVikgKz0gdmlkZW8vCitvYmotJChDT05GSUdfVklERU9fREVWKSArPSByYWRpby8KK29iai0kKENPTkZJR19EVkIpICAgICAgICs9IGR2Yi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKaW5kZXggYWI3YTFmYi4uYTBlNzAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBpci1jb21tb24uYyx2IDEuMTEgMjAwNS8wNy8wNyAxNDo0NDo0MyBtY2hlaGFiIEV4cCAkCiAgKgogICogc29tZSBjb21tb24gc3RydWN0cyBhbmQgZnVuY3Rpb25zIHRvIGhhbmRsZSBpbmZyYXJlZCByZW1vdGVzIHZpYQogICogaW5wdXQgbGF5ZXIgLi4uCkBAIC0zMzUsNiArMzM0LDcyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGRlY29kZSByYXcgc2FtcGxlcywgcHVsc2UgZGlzdGFuY2UgY29kaW5nIHVzZWQgYnkgTkVDIHJlbW90ZXMgKi8KK2ludCBpcl9kZWNvZGVfcHVsc2VkaXN0YW5jZSh1MzIgKnNhbXBsZXMsIGludCBjb3VudCwgaW50IGxvdywgaW50IGhpZ2gpCit7CisJaW50IGksbGFzdCxiaXQsbGVuOworCXUzMiBjdXJCaXQ7CisJdTMyIHZhbHVlOworCisJLyogZmluZCBzdGFydCBidXJzdCAqLworCWZvciAoaSA9IGxlbiA9IDA7IGkgPCBjb3VudCAqIDMyOyBpKyspIHsKKwkJYml0ID0gZ2V0Yml0KHNhbXBsZXMsaSk7CisJCWlmIChiaXQpIHsKKwkJCWxlbisrOworCQl9IGVsc2UgeworCQkJaWYgKGxlbiA+PSAyOSkKKwkJCQlicmVhazsKKwkJCWxlbiA9IDA7CisJCX0KKwl9CisKKwkvKiBzdGFydCBidXJzdCB0byBzaG9ydCAqLworCWlmIChsZW4gPCAyOSkKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisKKwkvKiBmaW5kIHN0YXJ0IHNpbGVuY2UgKi8KKwlmb3IgKGxlbiA9IDA7IGkgPCBjb3VudCAqIDMyOyBpKyspIHsKKwkJYml0ID0gZ2V0Yml0KHNhbXBsZXMsaSk7CisJCWlmIChiaXQpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJbGVuKys7CisJCX0KKwl9CisKKwkvKiBzaWxlbmNlIHRvIHNob3J0ICovCisJaWYgKGxlbiA8IDcpCisJCXJldHVybiAweGZmZmZmZmZmOworCisJLyogZ28gZGVjb2RpbmcgKi8KKwlsZW4gICA9IDA7CisJbGFzdCA9IDE7CisJdmFsdWUgPSAwOyBjdXJCaXQgPSAxOworCWZvciAoOyBpIDwgY291bnQgKiAzMjsgaSsrKSB7CisJCWJpdCAgPSBnZXRiaXQoc2FtcGxlcyxpKTsKKwkJaWYgKGxhc3QpIHsKKwkJCWlmKGJpdCkgeworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlsZW4gPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJpdCkgeworCQkJCWlmIChsZW4gPiAobG93ICsgaGlnaCkgLzIpCisJCQkJCXZhbHVlIHw9IGN1ckJpdDsKKwkJCQljdXJCaXQgPDw9IDE7CisJCQkJaWYgKGN1ckJpdCA9PSAxKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbGVuKys7CisJCQl9CisJCX0KKwkJbGFzdCA9IGJpdDsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKIC8qIGRlY29kZSByYXcgc2FtcGxlcywgYmlwaGFzZSBjb2RpbmcsIHVzZWQgYnkgcmM1IGZvciBleGFtcGxlICovCiBpbnQgaXJfZGVjb2RlX2JpcGhhc2UodTMyICpzYW1wbGVzLCBpbnQgY291bnQsIGludCBsb3csIGludCBoaWdoKQogewpAQCAtMzgzLDYgKzQ0OCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChpcl9leHRyYWN0X2JpdHMpOwogRVhQT1JUX1NZTUJPTF9HUEwoaXJfZHVtcF9zYW1wbGVzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2RlY29kZV9iaXBoYXNlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2RlY29kZV9wdWxzZWRpc3RhbmNlKTsKIAogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMKaW5kZXggY2Q1ODI4Yi4uMjA2Y2MyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMKQEAgLTE2OCwxMCArMTY4LDggQEAKIAkJcmV0dXJuOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpLCBwdC0+c2l6ZSwgcHQtPmNwdSwgcHQtPmRtYSk7CiAJcHQtPmNwdSA9IE5VTEw7Ci0JaWYgKE5VTEwgIT0gcHQtPnNsaXN0KSB7Ci0JCWtmcmVlKHB0LT5zbGlzdCk7Ci0JCXB0LT5zbGlzdCA9IE5VTEw7Ci0JfQorCWtmcmVlKHB0LT5zbGlzdCk7CisJcHQtPnNsaXN0ID0gTlVMTDsKIH0KIAogaW50IHNhYTcxNDZfcGd0YWJsZV9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzE0Nl9wZ3RhYmxlICpwdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKaW5kZXggYzA0ZmQxMS4uMzc4ODg5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKQEAgLTEsNSArMSw0IEBACiAjaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2RlZmluZSBCT0FSRF9DQU5fRE9fVkJJKGRldikgICAoZGV2LT5yZXZpc2lvbiAhPSAwICYmIGRldi0+dnZfZGF0YS0+dmJpX21pbm9yICE9IC0xKSAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKaW5kZXggNjI4NDg5NC4uZmVjNmJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCkBAIC0xLDQgKzEsMyBAQAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CiAKIHN0YXRpYyB1MzIgc2FhNzE0Nl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00MDIsMTIgKzQwMSw5IEBACiAJc2FhNzE0Nl9pMmNfcmVzZXQoZGV2KTsKIAogCWlmKCBOVUxMICE9IGkyY19hZGFwdGVyICkgewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0JCWkyY19hZGFwdGVyLT5kYXRhID0gZGV2OwotI2Vsc2UKIAkJQlVHX09OKCFpMmNfYWRhcHRlci0+Y2xhc3MpOwogCQlpMmNfc2V0X2FkYXBkYXRhKGkyY19hZGFwdGVyLGRldik7Ci0jZW5kaWYKKwkJaTJjX2FkYXB0ZXItPmRldi5wYXJlbnQgICAgPSAmZGV2LT5wY2ktPmRldjsKIAkJaTJjX2FkYXB0ZXItPmFsZ28JICAgPSAmc2FhNzE0Nl9hbGdvOwogCQlpMmNfYWRhcHRlci0+YWxnb19kYXRhICAgICA9IE5VTEw7CiAJCWkyY19hZGFwdGVyLT5pZAkJICAgPSBJMkNfSFdfU0FBNzE0NjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKaW5kZXggMDQxMGNjOS4uNDdlMjhiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKQEAgLTE2NCwxMiArMTY0LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2Ftc3VuZ190Ym11MjQxMTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAl1OCBidWZbNF07CiAJdTMyIGRpdjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHg2MSwgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07Ci0Jc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGZlLT5kdmItPnByaXY7CiAKIAlkaXYgPSBwYXJhbXMtPmZyZXF1ZW5jeSAvIDEyNTsKIApAQCAtMTgwLDcgKzE3OSw3IEBACiAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwKSBidWZbM10gfD0gMHgxMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoJmZjLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzUsOCArMzM0LDEwMyBAQAogCS5wbGxfc2V0ID0gc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQsCiB9OwogCisKK3N0YXRpYyB1OCBhbHBzX3RkZWU0X3N0djAyOTdfaW5pdHRhYltdID0geworCTB4ODAsIDB4MDEsCisJMHg4MCwgMHgwMCwKKwkweDgxLCAweDAxLAorCTB4ODEsIDB4MDAsCisJMHgwMCwgMHgwOSwKKwkweDAxLCAweDY5LAorCTB4MDMsIDB4MDAsCisJMHgwNCwgMHgwMCwKKwkweDA3LCAweDAwLAorCTB4MDgsIDB4MDAsCisJMHgyMCwgMHgwMCwKKwkweDIxLCAweDQwLAorCTB4MjIsIDB4MDAsCisJMHgyMywgMHgwMCwKKwkweDI0LCAweDQwLAorCTB4MjUsIDB4ODgsCisJMHgzMCwgMHhmZiwKKwkweDMxLCAweDAwLAorCTB4MzIsIDB4ZmYsCisJMHgzMywgMHgwMCwKKwkweDM0LCAweDUwLAorCTB4MzUsIDB4N2YsCisJMHgzNiwgMHgwMCwKKwkweDM3LCAweDIwLAorCTB4MzgsIDB4MDAsCisJMHg0MCwgMHgxYywKKwkweDQxLCAweGZmLAorCTB4NDIsIDB4MjksCisJMHg0MywgMHgwMCwKKwkweDQ0LCAweGZmLAorCTB4NDUsIDB4MDAsCisJMHg0NiwgMHgwMCwKKwkweDQ5LCAweDA0LAorCTB4NGEsIDB4MDAsCisJMHg0YiwgMHhmOCwKKwkweDUyLCAweDMwLAorCTB4NTUsIDB4YWUsCisJMHg1NiwgMHg0NywKKwkweDU3LCAweGUxLAorCTB4NTgsIDB4M2EsCisJMHg1YSwgMHgxZSwKKwkweDViLCAweDM0LAorCTB4NjAsIDB4MDAsCisJMHg2MywgMHgwMCwKKwkweDY0LCAweDAwLAorCTB4NjUsIDB4MDAsCisJMHg2NiwgMHgwMCwKKwkweDY3LCAweDAwLAorCTB4NjgsIDB4MDAsCisJMHg2OSwgMHgwMCwKKwkweDZhLCAweDAyLAorCTB4NmIsIDB4MDAsCisJMHg3MCwgMHhmZiwKKwkweDcxLCAweDAwLAorCTB4NzIsIDB4MDAsCisJMHg3MywgMHgwMCwKKwkweDc0LCAweDBjLAorCTB4ODAsIDB4MDAsCisJMHg4MSwgMHgwMCwKKwkweDgyLCAweDAwLAorCTB4ODMsIDB4MDAsCisJMHg4NCwgMHgwNCwKKwkweDg1LCAweDgwLAorCTB4ODYsIDB4MjQsCisJMHg4NywgMHg3OCwKKwkweDg4LCAweDEwLAorCTB4ODksIDB4MDAsCisJMHg5MCwgMHgwMSwKKwkweDkxLCAweDAxLAorCTB4YTAsIDB4MDQsCisJMHhhMSwgMHgwMCwKKwkweGEyLCAweDAwLAorCTB4YjAsIDB4OTEsCisJMHhiMSwgMHgwYiwKKwkweGMwLCAweDUzLAorCTB4YzEsIDB4NzAsCisJMHhjMiwgMHgxMiwKKwkweGQwLCAweDAwLAorCTB4ZDEsIDB4MDAsCisJMHhkMiwgMHgwMCwKKwkweGQzLCAweDAwLAorCTB4ZDQsIDB4MDAsCisJMHhkNSwgMHgwMCwKKwkweGRlLCAweDAwLAorCTB4ZGYsIDB4MDAsCisJMHg2MSwgMHg0OSwKKwkweDYyLCAweDBiLAorCTB4NTMsIDB4MDgsCisJMHg1OSwgMHgwOCwKKwkweGZmLCAweGZmLAorfTsKKwogc3RhdGljIHN0cnVjdCBzdHYwMjk3X2NvbmZpZyBhbHBzX3RkZWU0X3N0djAyOTdfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgxYywKKwkuaW5pdHRhYiA9IGFscHNfdGRlZTRfc3R2MDI5N19pbml0dGFiLAogLy8JLmludmVydCA9IDEsCiAvLwkucGxsX3NldCA9IGFscHNfdGRlZTRfc3R2MDI5N19wbGxfc2V0LAogfTsKQEAgLTM3MCw3ICs0NjQsNyBAQAogCQlpbmZvKCJmb3VuZCB0aGUgYmNtMzUxMCBhdCBpMmMgYWRkcmVzczogMHglMDJ4IixhaXIycGNfYXRzY19maXJzdF9nZW5fY29uZmlnLmRlbW9kX2FkZHJlc3MpOwogCX0gZWxzZQogCS8qIHRyeSB0aGUgY2FibGUgZHZiIChzdHYwMjk3KSAqLwotCWlmICgoZmMtPmZlID0gc3R2MDI5N19hdHRhY2goJmFscHNfdGRlZTRfc3R2MDI5N19jb25maWcsICZmYy0+aTJjX2FkYXAsIDB4ZjgpKSAhPSBOVUxMKSB7CisJaWYgKChmYy0+ZmUgPSBzdHYwMjk3X2F0dGFjaCgmYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKIAkJZmMtPmRldl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgPSBGQ19DQUJMRTsKIAkJaW5mbygiZm91bmQgdGhlIHN0djAyOTcgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnCmluZGV4IGIxMjU0NWYuLjFlODVkMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIGNvbmZpZyBEVkJfQlQ4WFgKLQl0cmlzdGF0ZSAiTmVidWxhL1Bpbm5hY2xlIFBDVFYvVHdpbmhhbiBQQ0kgY2FyZHMiCisJdHJpc3RhdGUgIkJUOHh4IGJhc2VkIFBDSSBjYXJkcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBWSURFT19CVDg0OAogCXNlbGVjdCBEVkJfTVQzNTIKIAlzZWxlY3QgRFZCX1NQODg3WApAQCAtOCw4ICs4LDggQEAKIAlzZWxlY3QgRFZCX09SNTEyMTEKIAloZWxwCiAJICBTdXBwb3J0IGZvciBQQ0kgY2FyZHMgYmFzZWQgb24gdGhlIEJ0OHh4IFBDSSBicmlkZ2UuIEV4YW1wbGVzIGFyZQotCSAgdGhlIE5lYnVsYSBjYXJkcywgdGhlIFBpbm5hY2xlIFBDVFYgY2FyZHMsIHRoZSBUd2luaGFuIERTVCBjYXJkcyBhbmQKLQkgIHBjSERUViBIRDIwMDAgY2FyZHMuCisJICB0aGUgTmVidWxhIGNhcmRzLCB0aGUgUGlubmFjbGUgUENUViBjYXJkcywgdGhlIFR3aW5oYW4gRFNUIGNhcmRzLAorCSAgdGhlIHBjSERUViBIRDIwMDAgY2FyZHMsIGFuZCBjZXJ0YWluIEFWZXJNZWRpYSBjYXJkcy4KIAogCSAgU2luY2UgdGhlc2UgY2FyZHMgaGF2ZSBubyBNUEVHIGRlY29kZXIgb25ib2FyZCwgdGhleSB0cmFuc21pdAogCSAgb25seSBjb21wcmVzc2VkIE1QRUcgZGF0YSBvdmVyIHRoZSBQQ0kgYnVzLCBzbyB5b3UgbmVlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKaW5kZXggM2M1YThlMi4uZjI5NTcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGJ0ODc4LmM6IHBhcnQgb2YgdGhlIGRyaXZlciBmb3IgdGhlIFBpbm5hY2xlIFBDVFYgU2F0IERWQiBQQ0kgY2FyZAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBIZXR0a2FtcCA8cGV0ZXIuaGV0dGthbXBAdC1vbmxpbmUuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQGh0cC10ZWwuZGU+CiAgKgogICogbGFyZ2UgcGFydHMgYmFzZWQgb24gdGhlIGJ0dHYgZHJpdmVyCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AbWV0emxlcmJyb3MuZGUpCkBAIC0yMTksNyArMjE5LDcgQEAKIAljb250cm9scmVnICY9IH4weDFmOwogCWNvbnRyb2xyZWcgfD0gMHgxYjsKIAotCWJ0d3JpdGUoY3B1X3RvX2xlMzIoYnQtPnJpc2NfZG1hKSwgQlQ4NzhfQVJJU0NfU1RBUlQpOworCWJ0d3JpdGUoYnQtPnJpc2NfZG1hLCBCVDg3OF9BUklTQ19TVEFSVCk7CiAKIAkvKiBvcmlnaW5hbCBpbnQgbWFzayBoYWQgOgogCSAqICAgIDYgICAgMiAgICA4ICAgIDQgICAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmgKaW5kZXggODM3NjIzZi4uYTczYmFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgICBidDg3OC5oIC0gQnQ4NzggYXVkaW8gbW9kdWxlIChyZWdpc3RlciBvZmZzZXRzKQogCi0gICAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEB0LW9ubGluZS5kZT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQGh0cC10ZWwuZGU+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCmluZGV4IDA3YTBiMGEuLjM0YTgzN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLQogCUZyb250ZW5kL0NhcmQgZHJpdmVyIGZvciBUd2luSGFuIERTVCBGcm9udGVuZAogCUNvcHlyaWdodCAoQykgMjAwMyBKYW1pZSBIb25hbgogCUNvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBNYW51IEFicmFoYW0gKG1hbnVAa3JvbXRlay5jb20pCkBAIC0xOSw3ICsxOCw2IEBACiAJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yOCwzMSArMjYsNDUgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgImRzdF9wcml2LmgiCiAjaW5jbHVkZSAiZHN0X2NvbW1vbi5oIgogCi0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDE7CiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAxOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDAgKHllcykiKTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBkc3RfYWRkb25zOwogbW9kdWxlX3BhcmFtKGRzdF9hZGRvbnMsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRzdF9hZGRvbnMsICJDQSBkYXVnaHRlcmJvYXJkLCBkZWZhdWx0IGlzIDAgKE5vIGFkZG9ucykiKTsKIAotI2RlZmluZSBkcHJpbnRrCWlmIChkZWJ1ZykgcHJpbnRrCisjZGVmaW5lIEhBU19MT0NLCQkxCisjZGVmaW5lIEFUVEVNUFRfVFVORQkJMgorI2RlZmluZSBIQVNfUE9XRVIJCTQKIAotI2RlZmluZSBIQVNfTE9DSwkxCi0jZGVmaW5lIEFUVEVNUFRfVFVORQkyCi0jZGVmaW5lIEhBU19QT1dFUgk0CisjZGVmaW5lIERTVF9FUlJPUgkJMAorI2RlZmluZSBEU1RfTk9USUNFCQkxCisjZGVmaW5lIERTVF9JTkZPCQkyCisjZGVmaW5lIERTVF9ERUJVRwkJMwogCi1zdGF0aWMgdm9pZCBkc3RfcGFja3NpemUoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIGludCBwc2l6ZSkKKyNkZWZpbmUgZHByaW50ayh4LCB5LCB6LCBmb3JtYXQsIGFyZy4uLikgZG8gewkJCQkJCVwKKwlpZiAoeikgewkJCQkJCQkJCVwKKwkJaWYJKCh4ID4gRFNUX0VSUk9SKSAmJiAoeCA+IHkpKQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyNhcmcpOwlcCisJCWVsc2UgaWYJKCh4ID4gRFNUX05PVElDRSkgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCQllbHNlIGlmICgoeCA+IERTVF9JTkZPKSAmJiAoeCA+IHkpKQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCQllbHNlIGlmICgoeCA+IERTVF9ERUJVRykgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyNhcmcpOwlcCisJfSBlbHNlIHsJCQkJCQkJCQlcCisJCWlmICh4ID4geSkJCQkJCQkJCVwKKwkJCXByaW50ayhmb3JtYXQsICMjYXJnKTsJCQkJCQlcCisJfQkJCQkJCQkJCQlcCit9IHdoaWxlKDApCisKKworc3RhdGljIHZvaWQgZHN0X3BhY2tzaXplKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBpbnQgcHNpemUpCiB7CiAJdW5pb24gZHN0X2dwaW9fcGFja2V0IGJpdHM7CiAKQEAgLTYwLDcgKzcyLDcgQEAKIAlidDg3OF9kZXZpY2VfY29udHJvbChzdGF0ZS0+YnQsIERTVF9JR19UUywgJmJpdHMpOwogfQogCi1pbnQgZHN0X2dwaW9fb3V0YihzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgdTMyIG1hc2ssIHUzMiBlbmJiLCB1MzIgb3V0aGlnaCwgaW50IGRlbGF5KQoraW50IGRzdF9ncGlvX291dGIoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHUzMiBtYXNrLCB1MzIgZW5iYiwgdTMyIG91dGhpZ2gsIGludCBkZWxheSkKIHsKIAl1bmlvbiBkc3RfZ3Bpb19wYWNrZXQgZW5iOwogCXVuaW9uIGRzdF9ncGlvX3BhY2tldCBiaXRzOwpAQCAtNjgsNjMgKzgwLDU1IEBACiAKIAllbmIuZW5iLm1hc2sgPSBtYXNrOwogCWVuYi5lbmIuZW5hYmxlID0gZW5iYjsKLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIiVzOiBtYXNrPVslMDR4XSwgZW5iYj1bJTA0eF0sIG91dGhpZ2g9WyUwNHhdXG4iLCBfX0ZVTkNUSU9OX18sIG1hc2ssIGVuYmIsIG91dGhpZ2gpOwogCisJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIm1hc2s9WyUwNHhdLCBlbmJiPVslMDR4XSwgb3V0aGlnaD1bJTA0eF0iLCBtYXNrLCBlbmJiLCBvdXRoaWdoKTsKIAlpZiAoKGVyciA9IGJ0ODc4X2RldmljZV9jb250cm9sKHN0YXRlLT5idCwgRFNUX0lHX0VOQUJMRSwgJmVuYikpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fZW5iIGVycm9yIChlcnIgPT0gJWksIG1hc2sgPT0gJTAyeCwgZW5iID09ICUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgbWFzaywgZW5iYik7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJkc3RfZ3Bpb19lbmIgZXJyb3IgKGVyciA9PSAlaSwgbWFzayA9PSAlMDJ4LCBlbmIgPT0gJTAyeCkiLCBlcnIsIG1hc2ssIGVuYmIpOwogCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9CiAJdWRlbGF5KDEwMDApOwogCS8qIGJlY2F1c2UgY29tcGxldGUgZGlzYWJsaW5nIG1lYW5zIG5vIG91dHB1dCwgbm8gbmVlZCB0byBkbyBvdXRwdXQgcGFja2V0ICovCiAJaWYgKGVuYmIgPT0gMCkKIAkJcmV0dXJuIDA7Ci0KIAlpZiAoZGVsYXkpCiAJCW1zbGVlcCgxMCk7Ci0KIAliaXRzLm91dHAubWFzayA9IGVuYmI7CiAJYml0cy5vdXRwLmhpZ2h2YWxzID0gb3V0aGlnaDsKLQogCWlmICgoZXJyID0gYnQ4NzhfZGV2aWNlX2NvbnRyb2woc3RhdGUtPmJ0LCBEU1RfSUdfV1JJVEUsICZiaXRzKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIGVycm9yIChlcnIgPT0gJWksIGVuYmIgPT0gJTAyeCwgb3V0aGlnaCA9PSAlMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIGVuYmIsIG91dGhpZ2gpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiZHN0X2dwaW9fb3V0YiBlcnJvciAoZXJyID09ICVpLCBlbmJiID09ICUwMngsIG91dGhpZ2ggPT0gJTAyeCkiLCBlcnIsIGVuYmIsIG91dGhpZ2gpOwogCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHN0X2dwaW9fb3V0Yik7CiAKLWludCBkc3RfZ3Bpb19pbmIoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogcmVzdWx0KQoraW50IGRzdF9ncGlvX2luYihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgdTggKnJlc3VsdCkKIHsKIAl1bmlvbiBkc3RfZ3Bpb19wYWNrZXQgcmRfcGFja2V0OwogCWludCBlcnI7CiAKIAkqcmVzdWx0ID0gMDsKLQogCWlmICgoZXJyID0gYnQ4NzhfZGV2aWNlX2NvbnRyb2woc3RhdGUtPmJ0LCBEU1RfSUdfUkVBRCwgJnJkX3BhY2tldCkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9faW5iIGVycm9yIChlcnIgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9faW5iIGVycm9yIChlcnIgPT0gJWkpXG4iLCBlcnIpOwogCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9Ci0KIAkqcmVzdWx0ID0gKHU4KSByZF9wYWNrZXQucmQudmFsdWU7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHN0X2dwaW9faW5iKTsKIAogaW50IHJkY19yZXNldF9zdGF0ZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKLQlpZiAodmVyYm9zZSA+IDEpCi0JCWRwcmludGsoIiVzOiBSZXNldHRpbmcgc3RhdGUgbWFjaGluZVxuIiwgX19GVU5DVElPTl9fKTsKLQorCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJSZXNldHRpbmcgc3RhdGUgbWFjaGluZSIpOwogCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCBSRENfODgyMF9JTlQsIFJEQ184ODIwX0lOVCwgMCwgTk9fREVMQVkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fb3V0YiBFUlJPUiAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX291dGIgRVJST1IgISIpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJbXNsZWVwKDEwKTsKLQogCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCBSRENfODgyMF9JTlQsIFJEQ184ODIwX0lOVCwgUkRDXzg4MjBfSU5ULCBOT19ERUxBWSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9fb3V0YiBFUlJPUiAhIik7CiAJCW1zbGVlcCgxMCk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xMzUsMTYgKzEzOSwxNCBAQAogCiBpbnQgcmRjXzg4MjBfcmVzZXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JaWYgKHZlcmJvc2UgPiAxKQotCQlkcHJpbnRrKCIlczogUmVzZXR0aW5nIERTVFxuIiwgX19GVU5DVElPTl9fKTsKLQorCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiUmVzZXR0aW5nIERTVCIpOwogCWlmIChkc3RfZ3Bpb19vdXRiKHN0YXRlLCBSRENfODgyMF9SRVNFVCwgUkRDXzg4MjBfUkVTRVQsIDAsIE5PX0RFTEFZKSA8IDApIHsKLQkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJkc3RfZ3Bpb19vdXRiIEVSUk9SICEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAl1ZGVsYXkoMTAwMCk7CiAJaWYgKGRzdF9ncGlvX291dGIoc3RhdGUsIFJEQ184ODIwX1JFU0VULCBSRENfODgyMF9SRVNFVCwgUkRDXzg4MjBfUkVTRVQsIERFTEFZKSA8IDApIHsKLQkJZHByaW50aygiJXM6IGRzdF9ncGlvX291dGIgRVJST1IgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJkc3RfZ3Bpb19vdXRiIEVSUk9SICEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTU1LDEwICsxNTcsMTEgQEAKIGludCBkc3RfcGlvX2VuYWJsZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKIAlpZiAoZHN0X2dwaW9fb3V0YihzdGF0ZSwgfjAsIFJEQ184ODIwX1BJT18wX0VOQUJMRSwgMCwgTk9fREVMQVkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogZHN0X2dwaW9fb3V0YiBFUlJPUiAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX291dGIgRVJST1IgISIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXVkZWxheSgxMDAwKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChkc3RfcGlvX2VuYWJsZSk7CkBAIC0xNjYsNyArMTY5LDcgQEAKIGludCBkc3RfcGlvX2Rpc2FibGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJaWYgKGRzdF9ncGlvX291dGIoc3RhdGUsIH4wLCBSRENfODgyMF9QSU9fMF9ESVNBQkxFLCBSRENfODgyMF9QSU9fMF9ESVNBQkxFLCBOT19ERUxBWSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBkc3RfZ3Bpb19vdXRiIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9fb3V0YiBFUlJPUiAhIik7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCkBAIC0xODMsMTkgKzE4NiwxNiBAQAogCiAJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CiAJCWlmIChkc3RfZ3Bpb19pbmIoc3RhdGUsICZyZXBseSkgPCAwKSB7Ci0JCQlkcHJpbnRrKCIlczogZHN0X2dwaW9faW5iIEVSUk9SICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX2luYiBFUlJPUiAhIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQogCQlpZiAoKHJlcGx5ICYgUkRDXzg4MjBfUElPXzBfRU5BQkxFKSA9PSAwKSB7Ci0JCQlpZiAodmVyYm9zZSA+IDQpCi0JCQkJZHByaW50aygiJXM6IGRzdCB3YWl0IHJlYWR5IGFmdGVyICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImRzdCB3YWl0IHJlYWR5IGFmdGVyICVkIiwgaSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQltc2xlZXAoMTApOwogCX0KLQlpZiAodmVyYm9zZSA+IDEpCi0JCWRwcmludGsoIiVzOiBkc3Qgd2FpdCBOT1QgcmVhZHkgYWZ0ZXIgJWRcbiIsIF9fRlVOQ1RJT05fXywgaSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfTk9USUNFLCAxLCAiZHN0IHdhaXQgTk9UIHJlYWR5IGFmdGVyICVkIiwgaSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBpbnQgZHN0X2Vycm9yX3JlY292ZXJ5KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewotCWRwcmludGsoIiVzOiBUcnlpbmcgdG8gcmV0dXJuIGZyb20gcHJldmlvdXMgZXJyb3JzLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX05PVElDRSwgMSwgIlRyeWluZyB0byByZXR1cm4gZnJvbSBwcmV2aW91cyBlcnJvcnMuIik7CiAJZHN0X3Bpb19kaXNhYmxlKHN0YXRlKTsKIAltc2xlZXAoMTApOwogCWRzdF9waW9fZW5hYmxlKHN0YXRlKTsKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiBpbnQgZHN0X2Vycm9yX2JhaWxvdXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7Ci0JZHByaW50aygiJXM6IFRyeWluZyB0byBiYWlsb3V0IGZyb20gcHJldmlvdXMgZXJyb3IuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlRyeWluZyB0byBiYWlsb3V0IGZyb20gcHJldmlvdXMgZXJyb3IuIik7CiAJcmRjXzg4MjBfcmVzZXQoc3RhdGUpOwogCWRzdF9waW9fZGlzYWJsZShzdGF0ZSk7CiAJbXNsZWVwKDEwKTsKQEAgLTIyNCwxNyArMjI0LDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9lcnJvcl9iYWlsb3V0KTsKIAotCi1pbnQgZHN0X2NvbW1faW5pdChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSkKK2ludCBkc3RfY29tbV9pbml0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewotCWlmICh2ZXJib3NlID4gMSkKLQkJZHByaW50ayAoIiVzOiBJbml0aWFsaXppbmcgRFNULi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkluaXRpYWxpemluZyBEU1QuIik7CiAJaWYgKChkc3RfcGlvX2VuYWJsZShzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogUElPIEVuYWJsZSBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlBJTyBFbmFibGUgRmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKChyZGNfcmVzZXRfc3RhdGUoc3RhdGUpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IFJEQyA4ODIwIFN0YXRlIFJFU0VUIEZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiUkRDIDg4MjAgU3RhdGUgUkVTRVQgRmFpbGVkLiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18xKQpAQCAtMjQ2LDM2ICsyNDQsMzMgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHN0X2NvbW1faW5pdCk7CiAKLQogaW50IHdyaXRlX2RzdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgdTggKmRhdGEsIHU4IGxlbikKIHsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7Ci0JCS5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywuZmxhZ3MgPSAwLC5idWYgPSBkYXRhLC5sZW4gPSBsZW4KKwkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MgPSAwLAorCQkuYnVmID0gZGF0YSwKKwkJLmxlbiA9IGxlbgogCX07CiAKIAlpbnQgZXJyOwotCWludCBjbnQ7Ci0JaWYgKGRlYnVnICYmICh2ZXJib3NlID4gNCkpIHsKLQkJdTggaTsKLQkJaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCQlkcHJpbnRrKCIlcyB3cml0aW5nIFsgIiwgX19GVU5DVElPTl9fKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCQlkcHJpbnRrKCIlMDJ4ICIsIGRhdGFbaV0pOwotCQkJZHByaW50aygiXVxuIik7Ci0JCX0KLQl9CisJdTggY250LCBpOworCisJZHByaW50ayh2ZXJib3NlLCBEU1RfTk9USUNFLCAwLCAid3JpdGluZyBbICIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfTk9USUNFLCAwLCAiJTAyeCAiLCBkYXRhW2ldKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9OT1RJQ0UsIDAsICJdXG4iKTsKKwogCWZvciAoY250ID0gMDsgY250IDwgMjsgY250KyspIHsKIAkJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IF93cml0ZV9kc3QgZXJyb3IgKGVyciA9PSAlaSwgbGVuID09IDB4JTAyeCwgYjAgPT0gMHglMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIGxlbiwgZGF0YVswXSk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiX3dyaXRlX2RzdCBlcnJvciAoZXJyID09ICVpLCBsZW4gPT0gMHglMDJ4LCBiMCA9PSAweCUwMngpIiwgZXJyLCBsZW4sIGRhdGFbMF0pOwogCQkJZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UKIAkJCWJyZWFrOwogCX0KLQogCWlmIChjbnQgPj0gMikgewotCQlpZiAodmVyYm9zZSA+IDEpCi0JCQlwcmludGsoIiVzOiBSREMgODgyMCBSRVNFVC4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlJEQyA4ODIwIFJFU0VUIik7CiAJCWRzdF9lcnJvcl9iYWlsb3V0KHN0YXRlKTsKIAogCQlyZXR1cm4gLTE7CkBAIC0yODUsMzYgKzI4MCwzNyBAQAogfQogRVhQT1JUX1NZTUJPTCh3cml0ZV9kc3QpOwogCi1pbnQgcmVhZF9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICogcmV0LCB1OCBsZW4pCitpbnQgcmVhZF9kc3Qoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICpyZXQsIHU4IGxlbikKIHsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLC5mbGFncyA9IEkyQ19NX1JELC5idWYgPSByZXQsLmxlbiA9IGxlbiB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJLmJ1ZiA9IHJldCwKKwkJLmxlbiA9IGxlbgorCX07CisKIAlpbnQgZXJyOwogCWludCBjbnQ7CiAKIAlmb3IgKGNudCA9IDA7IGNudCA8IDI7IGNudCsrKSB7CiAJCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSA8IDApIHsKLQotCQkJZHByaW50aygiJXM6IHJlYWRfZHN0IGVycm9yIChlcnIgPT0gJWksIGxlbiA9PSAweCUwMngsIGIwID09IDB4JTAyeClcbiIsIF9fRlVOQ1RJT05fXywgZXJyLCBsZW4sIHJldFswXSk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAicmVhZF9kc3QgZXJyb3IgKGVyciA9PSAlaSwgbGVuID09IDB4JTAyeCwgYjAgPT0gMHglMDJ4KSIsIGVyciwgbGVuLCByZXRbMF0pOwogCQkJZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKTsKLQogCQkJY29udGludWU7CiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQogCWlmIChjbnQgPj0gMikgewotCQlpZiAodmVyYm9zZSA+IDEpCi0JCQlwcmludGsoIiVzOiBSREMgODgyMCBSRVNFVC4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlJEQyA4ODIwIFJFU0VUIik7CiAJCWRzdF9lcnJvcl9iYWlsb3V0KHN0YXRlKTsKIAogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChkZWJ1ZyAmJiAodmVyYm9zZSA+IDQpKSB7Ci0JCWRwcmludGsoIiVzIHJlcGx5IGlzIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgcmV0WzBdKTsKLQkJZm9yIChlcnIgPSAxOyBlcnIgPCBsZW47IGVycisrKQotCQkJZHByaW50aygiIDB4JXgiLCByZXRbZXJyXSk7Ci0JCWlmIChlcnIgPiAxKQotCQkJZHByaW50aygiXG4iKTsKLQl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJyZXBseSBpcyAweCV4IiwgcmV0WzBdKTsKKwlmb3IgKGVyciA9IDE7IGVyciA8IGxlbjsgZXJyKyspCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAwLCAiIDB4JXgiLCByZXRbZXJyXSk7CisJaWYgKGVyciA+IDEpCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAwLCAiXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzIzLDE5ICszMTksMTYgQEAKIHN0YXRpYyBpbnQgZHN0X3NldF9wb2xhcml6YXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJc3dpdGNoIChzdGF0ZS0+dm9sdGFnZSkgewotCQljYXNlIFNFQ19WT0xUQUdFXzEzOgkvLyB2ZXJ0aWNhbAotCQkJcHJpbnRrKCIlczogUG9sYXJpemF0aW9uPVtWZXJ0aWNhbF1cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHg0MDsgIC8vMQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTRUNfVk9MVEFHRV8xODoJLy8gaG9yaXpvbnRhbAotCQkJcHJpbnRrKCIlczogUG9sYXJpemF0aW9uPVtIb3Jpem9udGFsXVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4NDA7ICAvLyAwCi0JCQlicmVhazsKLQotCQljYXNlIFNFQ19WT0xUQUdFX09GRjoKLQotCQkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoJLyoJVmVydGljYWwJKi8KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlBvbGFyaXphdGlvbj1bVmVydGljYWxdIik7CisJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDQwOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzE4OgkvKglIb3Jpem9udGFsCSovCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJQb2xhcml6YXRpb249W0hvcml6b250YWxdIik7CisJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4NDA7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM0NCwxNCArMzM3LDEyIEBACiBzdGF0aWMgaW50IGRzdF9zZXRfZnJlcShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgdTMyIGZyZXEpCiB7CiAJc3RhdGUtPmZyZXF1ZW5jeSA9IGZyZXE7Ci0JaWYgKGRlYnVnID4gNCkKLQkJZHByaW50aygiJXM6IHNldCBGcmVxdWVuY3kgJXVcbiIsIF9fRlVOQ1RJT05fXywgZnJlcSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInNldCBGcmVxdWVuY3kgJXUiLCBmcmVxKTsKIAogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CiAJCWZyZXEgPSBmcmVxIC8gMTAwMDsKIAkJaWYgKGZyZXEgPCA5NTAgfHwgZnJlcSA+IDIxNTApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQogCQlzdGF0ZS0+dHhfdHVuYVsyXSA9IChmcmVxID4+IDgpOwogCQlzdGF0ZS0+dHhfdHVuYVszXSA9ICh1OCkgZnJlcTsKIAkJc3RhdGUtPnR4X3R1bmFbNF0gPSAweDAxOwpAQCAtMzYwLDI3ICszNTEsMjUgQEAKIAkJCWlmIChmcmVxIDwgMTUzMSkKIAkJCQlzdGF0ZS0+dHhfdHVuYVs4XSB8PSAweDA0OwogCQl9Ci0KIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CiAJCWZyZXEgPSBmcmVxIC8gMTAwMDsKIAkJaWYgKGZyZXEgPCAxMzcwMDAgfHwgZnJlcSA+IDg1ODAwMCkKIAkJCXJldHVybiAtRUlOVkFMOwotCiAJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKIAkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CiAJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOwotCiAJfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKKwkJZnJlcSA9IGZyZXEgLyAxMDAwOwogCQlzdGF0ZS0+dHhfdHVuYVsyXSA9IChmcmVxID4+IDE2KSAmIDB4ZmY7CiAJCXN0YXRlLT50eF90dW5hWzNdID0gKGZyZXEgPj4gOCkgJiAweGZmOwogCQlzdGF0ZS0+dHhfdHVuYVs0XSA9ICh1OCkgZnJlcTsKLQogCX0gZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfYmFuZHdpZHRoKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBmZV9iYW5kd2lkdGhfdCBiYW5kd2lkdGgpCitzdGF0aWMgaW50IGRzdF9zZXRfYmFuZHdpZHRoKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBmZV9iYW5kd2lkdGhfdCBiYW5kd2lkdGgpCiB7CiAJc3RhdGUtPmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKIApAQCAtMzg4LDEwMyArMzc3LDk1IEBACiAJCXJldHVybiAwOwogCiAJc3dpdGNoIChiYW5kd2lkdGgpIHsKLQkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6Ci0JCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCi0JCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA2OwotCQkJZWxzZSB7Ci0JCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA2OwotCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQkFORFdJRFRIXzdfTUhaOgotCQkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQotCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwNzsKLQkJCWVsc2UgewotCQkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwNzsKLQkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEJBTkRXSURUSF84X01IWjoKLQkJCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19DQSkKLQkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDg7Ci0JCQllbHNlIHsKLQkJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9IDB4MDg7Ci0JCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDY7CisJCWVsc2UgeworCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA2OworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQl9CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDc7CisJCWVsc2UgeworCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA3OworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQl9CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDg7CisJCWVsc2UgeworCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA4OworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfaW52ZXJzaW9uKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb24pCitzdGF0aWMgaW50IGRzdF9zZXRfaW52ZXJzaW9uKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb24pCiB7CiAJc3RhdGUtPmludmVyc2lvbiA9IGludmVyc2lvbjsKIAlzd2l0Y2ggKGludmVyc2lvbikgewotCQljYXNlIElOVkVSU0lPTl9PRkY6CS8vIEludmVyc2lvbiA9IE5vcm1hbAotCQkJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4ODA7Ci0JCQlicmVhazsKLQotCQljYXNlIElOVkVSU0lPTl9PTjoKLQkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4ODA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgSU5WRVJTSU9OX09GRjoJLyoJSW52ZXJzaW9uID0gTm9ybWFsCSovCisJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDgwOworCQlicmVhazsKKwljYXNlIElOVkVSU0lPTl9PTjoKKwkJc3RhdGUtPnR4X3R1bmFbOF0gfD0gMHg4MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF9mZWMoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIGZlX2NvZGVfcmF0ZV90IGZlYykKK3N0YXRpYyBpbnQgZHN0X3NldF9mZWMoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIGZlX2NvZGVfcmF0ZV90IGZlYykKIHsKIAlzdGF0ZS0+ZmVjID0gZmVjOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgZmVfY29kZV9yYXRlX3QgZHN0X2dldF9mZWMoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUpCitzdGF0aWMgZmVfY29kZV9yYXRlX3QgZHN0X2dldF9mZWMoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJcmV0dXJuIHN0YXRlLT5mZWM7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF9zeW1ib2xyYXRlKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCB1MzIgc3JhdGUpCitzdGF0aWMgaW50IGRzdF9zZXRfc3ltYm9scmF0ZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgdTMyIHNyYXRlKQogewotCXU4ICp2YWw7CiAJdTMyIHN5bWNhbGM7CiAJdTY0IHN2YWw7CiAKIAlzdGF0ZS0+c3ltYm9sX3JhdGUgPSBzcmF0ZTsKLQogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikgewogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKGRlYnVnID4gNCkKLQkJZHByaW50aygiJXM6IHNldCBzeW1yYXRlICV1XG4iLCBfX0ZVTkNUSU9OX18sIHNyYXRlKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAic2V0IHN5bXJhdGUgJXUiLCBzcmF0ZSk7CiAJc3JhdGUgLz0gMTAwMDsKLQl2YWwgPSAmc3RhdGUtPnR4X3R1bmFbMF07Ci0KIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfU1lNRElWKSB7CiAJCXN2YWwgPSBzcmF0ZTsKIAkJc3ZhbCA8PD0gMjA7CiAJCWRvX2RpdihzdmFsLCA4ODAwMCk7CiAJCXN5bWNhbGMgPSAodTMyKSBzdmFsOwotCi0JCWlmIChkZWJ1ZyA+IDQpCi0JCQlkcHJpbnRrKCIlczogc2V0IHN5bWNhbGMgJXVcbiIsIF9fRlVOQ1RJT05fXywgc3ltY2FsYyk7Ci0KLQkJdmFsWzVdID0gKHU4KSAoc3ltY2FsYyA+PiAxMik7Ci0JCXZhbFs2XSA9ICh1OCkgKHN5bWNhbGMgPj4gNCk7Ci0JCXZhbFs3XSA9ICh1OCkgKHN5bWNhbGMgPDwgNCk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJzZXQgc3ltY2FsYyAldSIsIHN5bWNhbGMpOworCQlzdGF0ZS0+dHhfdHVuYVs1XSA9ICh1OCkgKHN5bWNhbGMgPj4gMTIpOworCQlzdGF0ZS0+dHhfdHVuYVs2XSA9ICh1OCkgKHN5bWNhbGMgPj4gNCk7CisJCXN0YXRlLT50eF90dW5hWzddID0gKHU4KSAoc3ltY2FsYyA8PCA0KTsKIAl9IGVsc2UgewotCQl2YWxbNV0gPSAodTgpIChzcmF0ZSA+PiAxNikgJiAweDdmOwotCQl2YWxbNl0gPSAodTgpIChzcmF0ZSA+PiA4KTsKLQkJdmFsWzddID0gKHU4KSBzcmF0ZTsKKwkJc3RhdGUtPnR4X3R1bmFbNV0gPSAodTgpIChzcmF0ZSA+PiAxNikgJiAweDdmOworCQlzdGF0ZS0+dHhfdHVuYVs2XSA9ICh1OCkgKHNyYXRlID4+IDgpOworCQlzdGF0ZS0+dHhfdHVuYVs3XSA9ICh1OCkgc3JhdGU7CiAJfQotCXZhbFs4XSAmPSB+MHgyMDsKLQlpZiAoc3JhdGUgPiA4MDAwKQotCQl2YWxbOF0gfD0gMHgyMDsKKwlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHgyMDsKKwlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKKwkJaWYgKHNyYXRlID4gODAwMCkKKwkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4MjA7CisJfQogCXJldHVybiAwOwogfQogCkBAIC00OTYsMzIgKzQ3NywyNyBAQAogCiAJc3RhdGUtPm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uOwogCXN3aXRjaCAobW9kdWxhdGlvbikgewotCQljYXNlIFFBTV8xNjoKLQkJCXN0YXRlLT50eF90dW5hWzhdID0gMHgxMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUFNXzMyOgotCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDIwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRQU1fNjQ6Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4NDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFFBTV8xMjg6Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4ODA7Ci0JCQlicmVhazsKLQotCQljYXNlIFFBTV8yNTY6Ci0JCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFFQU0s6Ci0JCWNhc2UgUUFNX0FVVE86Ci0JCWNhc2UgVlNCXzg6Ci0JCWNhc2UgVlNCXzE2OgotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBRQU1fMTY6CisJCXN0YXRlLT50eF90dW5hWzhdID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMzI6CisJCXN0YXRlLT50eF90dW5hWzhdID0gMHgyMDsKKwkJYnJlYWs7CisJY2FzZSBRQU1fNjQ6CisJCXN0YXRlLT50eF90dW5hWzhdID0gMHg0MDsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMTI4OgorCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4ODA7CisJCWJyZWFrOworCWNhc2UgUUFNXzI1NjoKKwkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDAwOworCQlicmVhazsKKwljYXNlIFFQU0s6CisJY2FzZSBRQU1fQVVUTzoKKwljYXNlIFZTQl84OgorCWNhc2UgVlNCXzE2OgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCiAJfQogCkBAIC01MzQsNyArNTEwLDcgQEAKIH0KIAogCi11OCBkc3RfY2hlY2tfc3VtKHU4ICogYnVmLCB1MzIgbGVuKQordTggZHN0X2NoZWNrX3N1bSh1OCAqYnVmLCB1MzIgbGVuKQogewogCXUzMiBpOwogCXU4IHZhbCA9IDA7CkBAIC01NDksMjYgKzUyNSwyNCBAQAogCiBzdGF0aWMgdm9pZCBkc3RfdHlwZV9mbGFnc19wcmludCh1MzIgdHlwZV9mbGFncykKIHsKLQlwcmludGsoIkRTVCB0eXBlIGZsYWdzIDoiKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIkRTVCB0eXBlIGZsYWdzIDoiKTsKIAlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKQotCQlwcmludGsoIiAweCV4IG5ld3R1bmVyIiwgRFNUX1RZUEVfSEFTX05FV1RVTkUpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IG5ld3R1bmVyIiwgRFNUX1RZUEVfSEFTX05FV1RVTkUpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1RTMjA0KQotCQlwcmludGsoIiAweCV4IHRzMjA0IiwgRFNUX1RZUEVfSEFTX1RTMjA0KTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDAsICIgMHgleCB0czIwNCIsIERTVF9UWVBFX0hBU19UUzIwNCk7CiAJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfU1lNRElWKQotCQlwcmludGsoIiAweCV4IHN5bWRpdiIsIERTVF9UWVBFX0hBU19TWU1ESVYpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IHN5bWRpdiIsIERTVF9UWVBFX0hBU19TWU1ESVYpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCi0JCXByaW50aygiIDB4JXggZmlybXdhcmUgdmVyc2lvbiA9IDEiLCBEU1RfVFlQRV9IQVNfRldfMSk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggZmlybXdhcmUgdmVyc2lvbiA9IDEiLCBEU1RfVFlQRV9IQVNfRldfMSk7CiAJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMikKLQkJcHJpbnRrKCIgMHgleCBmaXJtd2FyZSB2ZXJzaW9uID0gMiIsIERTVF9UWVBFX0hBU19GV18yKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDAsICIgMHgleCBmaXJtd2FyZSB2ZXJzaW9uID0gMiIsIERTVF9UWVBFX0hBU19GV18yKTsKIAlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18zKQotCQlwcmludGsoIiAweCV4IGZpcm13YXJlIHZlcnNpb24gPSAzIiwgRFNUX1RZUEVfSEFTX0ZXXzMpOwotLy8JaWYgKCh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEKSAmJiBuZXdfZncpCi0KLQlwcmludGsoIlxuIik7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggZmlybXdhcmUgdmVyc2lvbiA9IDMiLCBEU1RfVFlQRV9IQVNfRldfMyk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDAsICJcbiIpOwogfQogCiAKLXN0YXRpYyBpbnQgZHN0X3R5cGVfcHJpbnQgKHU4IHR5cGUpCitzdGF0aWMgaW50IGRzdF90eXBlX3ByaW50KHU4IHR5cGUpCiB7CiAJY2hhciAqb3R5cGU7CiAJc3dpdGNoICh0eXBlKSB7CkBAIC01ODUsMTAgKzU1OSwxMCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50aygiJXM6IGludmFsaWQgZHN0IHR5cGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJpbnZhbGlkIGRzdCB0eXBlICVkIiwgdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwcmludGsoIkRTVCB0eXBlIDogJXNcbiIsIG90eXBlKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiRFNUIHR5cGU6ICVzIiwgb3R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MDAsNyArNjc0LDcgQEAKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX0NBQkxFLAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzEKLQkJCQkJCQl8IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxELAorCQkJCQkJCXwgRFNUX1RZUEVfSEFTX0ZXXzIsCiAJCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQQogCX0sCiAKQEAgLTcwOCw3ICs2ODIsNyBAQAogCQkuZGV2aWNlX2lkID0gIkRDVE5FVyIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19DQUJMRSwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18zLAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzMgfCBEU1RfVFlQRV9IQVNfRldfQlVJTEQsCiAJCS5kc3RfZmVhdHVyZSA9IDAKIAl9LAogCkBAIC03MTYsNyArNjkwLDcgQEAKIAkJLmRldmljZV9pZCA9ICJEVFQtQ0kiLAogCQkub2Zmc2V0ID0gMSwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfVEVSUiwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfRldfMiwKIAkJLmRzdF9mZWF0dXJlID0gMAogCX0sCiAKQEAgLTc1Niw2ICs3MzAsNzEgQEAKIAogfTsKIAorc3RhdGljIGludCBkc3RfZ2V0X21hYyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCBnZXRfbWFjW10gPSB7IDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlnZXRfbWFjWzddID0gZHN0X2NoZWNrX3N1bShnZXRfbWFjLCA3KTsKKwlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGdldF9tYWMsIDgpIDwgMCkgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVW5zdXBwb3J0ZWQgQ29tbWFuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldCgmc3RhdGUtPm1hY19hZGRyZXNzLCAnXDAnLCA4KTsKKwltZW1jcHkoJnN0YXRlLT5tYWNfYWRkcmVzcywgJnN0YXRlLT5yeGJ1ZmZlciwgNik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJNQUMgQWRkcmVzcz1bJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhdIiwKKwkJc3RhdGUtPm1hY19hZGRyZXNzWzBdLCBzdGF0ZS0+bWFjX2FkZHJlc3NbMV0sIHN0YXRlLT5tYWNfYWRkcmVzc1syXSwKKwkJc3RhdGUtPm1hY19hZGRyZXNzWzRdLCBzdGF0ZS0+bWFjX2FkZHJlc3NbNV0sIHN0YXRlLT5tYWNfYWRkcmVzc1s2XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3RfZndfdmVyKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCXU4IGdldF92ZXJbXSA9IHsgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCWdldF92ZXJbN10gPSBkc3RfY2hlY2tfc3VtKGdldF92ZXIsIDcpOworCWlmIChkc3RfY29tbWFuZChzdGF0ZSwgZ2V0X3ZlciwgOCkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJVbnN1cHBvcnRlZCBDb21tYW5kIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KCZzdGF0ZS0+ZndfdmVyc2lvbiwgJ1wwJywgOCk7CisJbWVtY3B5KCZzdGF0ZS0+ZndfdmVyc2lvbiwgJnN0YXRlLT5yeGJ1ZmZlciwgOCk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJGaXJtd2FyZSBWZXIgPSAleC4leCBCdWlsZCA9ICUwMngsIG9uICV4OiV4LCAleC0leC0yMCUwMngiLAorCQlzdGF0ZS0+ZndfdmVyc2lvblswXSA+PiA0LCBzdGF0ZS0+ZndfdmVyc2lvblswXSAmIDB4MGYsCisJCXN0YXRlLT5md192ZXJzaW9uWzFdLAorCQlzdGF0ZS0+ZndfdmVyc2lvbls1XSwgc3RhdGUtPmZ3X3ZlcnNpb25bNl0sCisJCXN0YXRlLT5md192ZXJzaW9uWzRdLCBzdGF0ZS0+ZndfdmVyc2lvblszXSwgc3RhdGUtPmZ3X3ZlcnNpb25bMl0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NhcmRfdHlwZShzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCBnZXRfdHlwZVtdID0geyAweDAwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisJZ2V0X3R5cGVbN10gPSBkc3RfY2hlY2tfc3VtKGdldF90eXBlLCA3KTsKKwlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGdldF90eXBlLCA4KSA8IDApIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlVuc3VwcG9ydGVkIENvbW1hbmQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoJnN0YXRlLT5jYXJkX2luZm8sICdcMCcsIDgpOworCW1lbWNweSgmc3RhdGUtPmNhcmRfaW5mbywgJnN0YXRlLT5yeGJ1ZmZlciwgOCk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJEZXZpY2UgTW9kZWw9WyVzXSIsICZzdGF0ZS0+Y2FyZF9pbmZvWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzdF9nZXRfdmVuZG9yKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCXU4IGdldF92ZW5kb3JbXSA9IHsgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCWdldF92ZW5kb3JbN10gPSBkc3RfY2hlY2tfc3VtKGdldF92ZW5kb3IsIDcpOworCWlmIChkc3RfY29tbWFuZChzdGF0ZSwgZ2V0X3ZlbmRvciwgOCkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJVbnN1cHBvcnRlZCBDb21tYW5kIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KCZzdGF0ZS0+dmVuZG9yLCAnXDAnLCA4KTsKKwltZW1jcHkoJnN0YXRlLT52ZW5kb3IsICZzdGF0ZS0+cnhidWZmZXIsIDgpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiVmVuZG9yPVslc10iLCAmc3RhdGUtPnZlbmRvclswXSk7CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBkc3RfZ2V0X2RldmljZV9pZChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKQEAgLTc3Miw1MyArODExLDQ1IEBACiAKIAlpZiAod3JpdGVfZHN0KHN0YXRlLCBkZXZpY2VfdHlwZSwgRklYRURfQ09NTSkpCiAJCXJldHVybiAtMTsJCS8qCVdyaXRlIGZhaWxlZAkJKi8KLQogCWlmICgoZHN0X3Bpb19kaXNhYmxlKHN0YXRlKSkgPCAwKQogCQlyZXR1cm4gLTE7Ci0KIAlpZiAocmVhZF9kc3Qoc3RhdGUsICZyZXBseSwgR0VUX0FDSykpCiAJCXJldHVybiAtMTsJCS8qCVJlYWQgZmFpbHVyZQkJKi8KLQogCWlmIChyZXBseSAhPSBBQ0spIHsKLQkJZHByaW50aygiJXM6IFdyaXRlIG5vdCBBY2tub3dsZWRnZWQhIFtSZXBseT0weCUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIHJlcGx5KTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIldyaXRlIG5vdCBBY2tub3dsZWRnZWQhIFtSZXBseT0weCUwMnhdIiwgcmVwbHkpOwogCQlyZXR1cm4gLTE7CQkvKglVbmFjaydkIHdyaXRlCQkqLwogCX0KLQogCWlmICghZHN0X3dhaXRfZHN0X3JlYWR5KHN0YXRlLCBERVZJQ0VfSU5JVCkpCiAJCXJldHVybiAtMTsJCS8qCURTVCBub3QgcmVhZHkgeWV0CSovCi0KIAlpZiAocmVhZF9kc3Qoc3RhdGUsIHN0YXRlLT5yeGJ1ZmZlciwgRklYRURfQ09NTSkpCiAJCXJldHVybiAtMTsKIAogCWRzdF9waW9fZGlzYWJsZShzdGF0ZSk7Ci0KIAlpZiAoc3RhdGUtPnJ4YnVmZmVyWzddICE9IGRzdF9jaGVja19zdW0oc3RhdGUtPnJ4YnVmZmVyLCA3KSkgewotCQlkcHJpbnRrKCIlczogQ2hlY2tzdW0gZmFpbHVyZSEgXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiQ2hlY2tzdW0gZmFpbHVyZSEiKTsKIAkJcmV0dXJuIC0xOwkJLyoJQ2hlY2tzdW0gZmFpbHVyZQkqLwogCX0KLQogCXN0YXRlLT5yeGJ1ZmZlcls3XSA9ICdcMCc7CiAKLQlmb3IgKGkgPSAwLCBwX2RzdF90eXBlID0gZHN0X3RsaXN0OyBpIDwgQVJSQVlfU0laRSAoZHN0X3RsaXN0KTsgaSsrLCBwX2RzdF90eXBlKyspIHsKKwlmb3IgKGkgPSAwLCBwX2RzdF90eXBlID0gZHN0X3RsaXN0OyBpIDwgQVJSQVlfU0laRShkc3RfdGxpc3QpOyBpKyssIHBfZHN0X3R5cGUrKykgewogCQlpZiAoIXN0cm5jbXAgKCZzdGF0ZS0+cnhidWZmZXJbcF9kc3RfdHlwZS0+b2Zmc2V0XSwgcF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCBzdHJsZW4gKHBfZHN0X3R5cGUtPmRldmljZV9pZCkpKSB7CiAJCQl1c2VfdHlwZV9mbGFncyA9IHBfZHN0X3R5cGUtPnR5cGVfZmxhZ3M7CiAJCQl1c2VfZHN0X3R5cGUgPSBwX2RzdF90eXBlLT5kc3RfdHlwZTsKIAogCQkJLyoJQ2FyZCBjYXBhYmlsaXRpZXMJKi8KIAkJCXN0YXRlLT5kc3RfaHdfY2FwID0gcF9kc3RfdHlwZS0+ZHN0X2ZlYXR1cmU7Ci0JCQlwcmludGsgKCIlczogUmVjb2duaXNlIFslc11cbiIsIF9fRlVOQ1RJT05fXywgcF9kc3RfdHlwZS0+ZGV2aWNlX2lkKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiUmVjb2duaXNlIFslc11cbiIsIHBfZHN0X3R5cGUtPmRldmljZV9pZCk7CiAKIAkJCWJyZWFrOwogCQl9CiAJfQogCiAJaWYgKGkgPj0gc2l6ZW9mIChkc3RfdGxpc3QpIC8gc2l6ZW9mIChkc3RfdGxpc3QgWzBdKSkgewotCQlwcmludGsoIiVzOiBVbmFibGUgdG8gcmVjb2duaXplICVzIG9yICVzXG4iLCBfX0ZVTkNUSU9OX18sICZzdGF0ZS0+cnhidWZmZXJbMF0sICZzdGF0ZS0+cnhidWZmZXJbMV0pOwotCQlwcmludGsoIiVzOiBwbGVhc2UgZW1haWwgbGludXgtZHZiQGxpbnV4dHYub3JnIHdpdGggdGhpcyB0eXBlIGluXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlVuYWJsZSB0byByZWNvZ25pemUgJXMgb3IgJXMiLCAmc3RhdGUtPnJ4YnVmZmVyWzBdLCAmc3RhdGUtPnJ4YnVmZmVyWzFdKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJwbGVhc2UgZW1haWwgbGludXgtZHZiQGxpbnV4dHYub3JnIHdpdGggdGhpcyB0eXBlIGluIik7CiAJCXVzZV9kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1NBVDsKIAkJdXNlX3R5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfU1lNRElWOwogCX0KLQogCWRzdF90eXBlX3ByaW50KHVzZV9kc3RfdHlwZSk7CiAJc3RhdGUtPnR5cGVfZmxhZ3MgPSB1c2VfdHlwZV9mbGFnczsKIAlzdGF0ZS0+ZHN0X3R5cGUgPSB1c2VfZHN0X3R5cGU7CkBAIC04MzQsNyArODY1LDcgQEAKIHN0YXRpYyBpbnQgZHN0X3Byb2JlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCWlmICgocmRjXzg4MjBfcmVzZXQoc3RhdGUpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IFJEQyA4ODIwIFJFU0VUIEZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiUkRDIDg4MjAgUkVTRVQgRmFpbGVkLiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChkc3RfYWRkb25zICYgRFNUX1RZUEVfSEFTX0NBKQpAQCAtODQzLDgwICs4NzQsODcgQEAKIAkJbXNsZWVwKDEwMCk7CiAKIAlpZiAoKGRzdF9jb21tX2luaXQoc3RhdGUpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IERTVCBJbml0aWFsaXphdGlvbiBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkRTVCBJbml0aWFsaXphdGlvbiBGYWlsZWQuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJbXNsZWVwKDEwMCk7CiAJaWYgKGRzdF9nZXRfZGV2aWNlX2lkKHN0YXRlKSA8IDApIHsKLQkJZHByaW50aygiJXM6IHVua25vd24gZGV2aWNlLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJ1bmtub3duIGRldmljZS4iKTsKIAkJcmV0dXJuIC0xOwogCX0KKwlpZiAoZHN0X2dldF9tYWMoc3RhdGUpIDwgMCkgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiTUFDOiBVbnN1cHBvcnRlZCBjb21tYW5kIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfQlVJTEQpIHsKKwkJaWYgKGRzdF9md192ZXIoc3RhdGUpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkZXOiBVbnN1cHBvcnRlZCBjb21tYW5kIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoZHN0X2NhcmRfdHlwZShzdGF0ZSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiQ2FyZDogVW5zdXBwb3J0ZWQgY29tbWFuZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRzdF9nZXRfdmVuZG9yKHN0YXRlKSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJWZW5kb3I6IFVuc3VwcG9ydGVkIGNvbW1hbmQiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBkc3RfY29tbWFuZChzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSwgdTggKiBkYXRhLCB1OCBsZW4pCitpbnQgZHN0X2NvbW1hbmQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHU4ICpkYXRhLCB1OCBsZW4pCiB7CiAJdTggcmVwbHk7CiAJaWYgKChkc3RfY29tbV9pbml0KHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBEU1QgQ29tbXVuaWNhdGlvbiBJbml0aWFsaXphdGlvbiBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9OT1RJQ0UsIDEsICJEU1QgQ29tbXVuaWNhdGlvbiBJbml0aWFsaXphdGlvbiBGYWlsZWQuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0KIAlpZiAod3JpdGVfZHN0KHN0YXRlLCBkYXRhLCBsZW4pKSB7Ci0JCWlmICh2ZXJib3NlID4gMSkKLQkJCWRwcmludGsoIiVzOiBUcmluZyB0byByZWNvdmVyLi4gXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVHJpbmcgdG8gcmVjb3Zlci4uICIpOwogCQlpZiAoKGRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IFJlY292ZXJ5IEZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJlY292ZXJ5IEZhaWxlZC4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlyZXR1cm4gLTE7CiAJfQogCWlmICgoZHN0X3Bpb19kaXNhYmxlKHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBQSU8gRGlzYWJsZSBGYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlBJTyBEaXNhYmxlIEZhaWxlZC4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfRldfMSkKIAkJdWRlbGF5KDMwMDApOwotCiAJaWYgKHJlYWRfZHN0KHN0YXRlLCAmcmVwbHksIEdFVF9BQ0spKSB7Ci0JCWlmICh2ZXJib3NlID4gMSkKLQkJCWRwcmludGsoIiVzOiBUcnlpbmcgdG8gcmVjb3Zlci4uIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJUcnlpbmcgdG8gcmVjb3Zlci4uICIpOwogCQlpZiAoKGRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IFJlY292ZXJ5IEZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiUmVjb3ZlcnkgRmFpbGVkLiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0KIAlpZiAocmVwbHkgIT0gQUNLKSB7Ci0JCWRwcmludGsoIiVzOiB3cml0ZSBub3QgYWNrbm93bGVkZ2VkIDB4JTAyeCBcbiIsIF9fRlVOQ1RJT05fXywgcmVwbHkpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAid3JpdGUgbm90IGFja25vd2xlZGdlZCAweCUwMnggIiwgcmVwbHkpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChsZW4gPj0gMiAmJiBkYXRhWzBdID09IDAgJiYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzFdID09IDMpKQogCQlyZXR1cm4gMDsKLQotLy8JdWRlbGF5KDMwMDApOwogCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19GV18xKQogCQl1ZGVsYXkoMzAwMCk7CiAJZWxzZQogCQl1ZGVsYXkoMjAwMCk7Ci0KIAlpZiAoIWRzdF93YWl0X2RzdF9yZWFkeShzdGF0ZSwgTk9fREVMQVkpKQogCQlyZXR1cm4gLTE7Ci0KIAlpZiAocmVhZF9kc3Qoc3RhdGUsIHN0YXRlLT5yeGJ1ZmZlciwgRklYRURfQ09NTSkpIHsKLQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJZHByaW50aygiJXM6IFRyeWluZyB0byByZWNvdmVyLi4gXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlRyeWluZyB0byByZWNvdmVyLi4gIik7CiAJCWlmICgoZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKSkgPCAwKSB7Ci0JCQlkcHJpbnRrKCIlczogUmVjb3ZlcnkgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJSZWNvdmVyeSBmYWlsZWQuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJcmV0dXJuIC0xOwogCX0KLQogCWlmIChzdGF0ZS0+cnhidWZmZXJbN10gIT0gZHN0X2NoZWNrX3N1bShzdGF0ZS0+cnhidWZmZXIsIDcpKSB7Ci0JCWRwcmludGsoIiVzOiBjaGVja3N1bSBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiY2hlY2tzdW0gZmFpbHVyZSIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05MjQsMTEgKzk2MiwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChkc3RfY29tbWFuZCk7CiAKLXN0YXRpYyBpbnQgZHN0X2dldF9zaWduYWwoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUpCitzdGF0aWMgaW50IGRzdF9nZXRfc2lnbmFsKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCWludCByZXR2YWw7CiAJdTggZ2V0X3NpZ25hbFtdID0geyAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZiIH07Ci0JZHByaW50aygiJXM6IEdldHRpbmcgU2lnbmFsIHN0cmVuZ3RoIGFuZCBvdGhlciBwYXJhbWV0ZXJzXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vZHByaW50aygiJXM6IEdldHRpbmcgU2lnbmFsIHN0cmVuZ3RoIGFuZCBvdGhlciBwYXJhbWV0ZXJzXG4iLCBfX0ZVTkNUSU9OX18pOwogCWlmICgoc3RhdGUtPmRpc2VxX2ZsYWdzICYgQVRURU1QVF9UVU5FKSA9PSAwKSB7CiAJCXN0YXRlLT5kZWNvZGVfbG9jayA9IHN0YXRlLT5kZWNvZGVfc3RyZW5ndGggPSBzdGF0ZS0+ZGVjb2RlX3NuciA9IDA7CiAJCXJldHVybiAwOwpAQCAtOTU1LDEzICs5OTMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3RfdG9uZV9wb3dlcl9jbWQoc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUpCitzdGF0aWMgaW50IGRzdF90b25lX3Bvd2VyX2NtZChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKIAl1OCBwYWtldFs4XSA9IHsgMHgwMCwgMHgwOSwgMHhmZiwgMHhmZiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKQogCQlyZXR1cm4gMDsKLQogCXBha2V0WzRdID0gc3RhdGUtPnR4X3R1bmFbNF07CiAJcGFrZXRbMl0gPSBzdGF0ZS0+dHhfdHVuYVsyXTsKIAlwYWtldFszXSA9IHN0YXRlLT50eF90dW5hWzNdOwpAQCAtOTcxLDYxICsxMDA4LDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X2dldF90dW5hKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlKQorc3RhdGljIGludCBkc3RfZ2V0X3R1bmEoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJaW50IHJldHZhbDsKIAogCWlmICgoc3RhdGUtPmRpc2VxX2ZsYWdzICYgQVRURU1QVF9UVU5FKSA9PSAwKQogCQlyZXR1cm4gMDsKLQogCXN0YXRlLT5kaXNlcV9mbGFncyAmPSB+KEhBU19MT0NLKTsKIAlpZiAoIWRzdF93YWl0X2RzdF9yZWFkeShzdGF0ZSwgTk9fREVMQVkpKQogCQlyZXR1cm4gMDsKLQotCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSB7CisJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCiAJCS8qIGhvdyB0byBnZXQgdmFyaWFibGUgbGVuZ3RoIHJlcGx5ID8/Pz8gKi8KIAkJcmV0dmFsID0gcmVhZF9kc3Qoc3RhdGUsIHN0YXRlLT5yeF90dW5hLCAxMCk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXJldHZhbCA9IHJlYWRfZHN0KHN0YXRlLCAmc3RhdGUtPnJ4X3R1bmFbMl0sIEZJWEVEX0NPTU0pOwotCX0KLQogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiByZWFkIG5vdCBzdWNjZXNzZnVsXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgInJlYWQgbm90IHN1Y2Nlc3NmdWwiKTsKIAkJcmV0dXJuIDA7CiAJfQotCiAJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKIAkJaWYgKHN0YXRlLT5yeF90dW5hWzldICE9IGRzdF9jaGVja19zdW0oJnN0YXRlLT5yeF90dW5hWzBdLCA5KSkgewotCQkJZHByaW50aygiJXM6IGNoZWNrc3VtIGZhaWx1cmU/XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImNoZWNrc3VtIGZhaWx1cmUgPyAiKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHN0YXRlLT5yeF90dW5hWzldICE9IGRzdF9jaGVja19zdW0oJnN0YXRlLT5yeF90dW5hWzJdLCA3KSkgewotCQkJZHByaW50aygiJXM6IGNoZWNrc3VtIGZhaWx1cmU/XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImNoZWNrc3VtIGZhaWx1cmU/ICIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAJaWYgKHN0YXRlLT5yeF90dW5hWzJdID09IDAgJiYgc3RhdGUtPnJ4X3R1bmFbM10gPT0gMCkKIAkJcmV0dXJuIDA7CiAJc3RhdGUtPmRlY29kZV9mcmVxID0gKChzdGF0ZS0+cnhfdHVuYVsyXSAmIDB4N2YpIDw8IDgpICsgc3RhdGUtPnJ4X3R1bmFbM107Ci0KIAlzdGF0ZS0+ZGVjb2RlX2xvY2sgPSAxOwogCXN0YXRlLT5kaXNlcV9mbGFncyB8PSBIQVNfTE9DSzsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKK3N0YXRpYyBpbnQgZHN0X3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOwogCi1zdGF0aWMgaW50IGRzdF93cml0ZV90dW5hKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQorc3RhdGljIGludCBkc3Rfd3JpdGVfdHVuYShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJldHZhbDsKIAl1OCByZXBseTsKIAotCWlmIChkZWJ1ZyA+IDQpCi0JCWRwcmludGsoIiVzOiB0eXBlX2ZsYWdzIDB4JXggXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlLT50eXBlX2ZsYWdzKTsKLQorCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJ0eXBlX2ZsYWdzIDB4JXggIiwgc3RhdGUtPnR5cGVfZmxhZ3MpOwogCXN0YXRlLT5kZWNvZGVfZnJlcSA9IDA7CiAJc3RhdGUtPmRlY29kZV9sb2NrID0gc3RhdGUtPmRlY29kZV9zdHJlbmd0aCA9IHN0YXRlLT5kZWNvZGVfc25yID0gMDsKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgewpAQCAtMTAzNSwzNSArMTA2NCwzMSBAQAogCXN0YXRlLT5kaXNlcV9mbGFncyAmPSB+KEhBU19MT0NLIHwgQVRURU1QVF9UVU5FKTsKIAogCWlmICgoZHN0X2NvbW1faW5pdChzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogRFNUIENvbW11bmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJEU1QgQ29tbXVuaWNhdGlvbiBpbml0aWFsaXphdGlvbiBmYWlsZWQuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0KIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgewogCQlzdGF0ZS0+dHhfdHVuYVs5XSA9IGRzdF9jaGVja19zdW0oJnN0YXRlLT50eF90dW5hWzBdLCA5KTsKIAkJcmV0dmFsID0gd3JpdGVfZHN0KHN0YXRlLCAmc3RhdGUtPnR4X3R1bmFbMF0sIDEwKTsKLQogCX0gZWxzZSB7CiAJCXN0YXRlLT50eF90dW5hWzldID0gZHN0X2NoZWNrX3N1bSgmc3RhdGUtPnR4X3R1bmFbMl0sIDcpOwogCQlyZXR2YWwgPSB3cml0ZV9kc3Qoc3RhdGUsICZzdGF0ZS0+dHhfdHVuYVsyXSwgRklYRURfQ09NTSk7CiAJfQogCWlmIChyZXR2YWwgPCAwKSB7CiAJCWRzdF9waW9fZGlzYWJsZShzdGF0ZSk7Ci0JCWRwcmludGsoIiVzOiB3cml0ZSBub3Qgc3VjY2Vzc2Z1bFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJ3cml0ZSBub3Qgc3VjY2Vzc2Z1bCIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQogCWlmICgoZHN0X3Bpb19kaXNhYmxlKHN0YXRlKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBEU1QgUElPIGRpc2FibGUgZmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiRFNUIFBJTyBkaXNhYmxlIGZhaWxlZCAhIik7CiAJCXJldHVybiAtMTsKIAl9Ci0KIAlpZiAoKHJlYWRfZHN0KHN0YXRlLCAmcmVwbHksIEdFVF9BQ0spIDwgMCkpIHsKLQkJZHByaW50aygiJXM6IHJlYWQgdmVyaWZ5IG5vdCBzdWNjZXNzZnVsLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJyZWFkIHZlcmlmeSBub3Qgc3VjY2Vzc2Z1bC4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAocmVwbHkgIT0gQUNLKSB7Ci0JCWRwcmludGsoIiVzOiB3cml0ZSBub3QgYWNrbm93bGVkZ2VkIDB4JTAyeCBcbiIsIF9fRlVOQ1RJT05fXywgcmVwbHkpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIndyaXRlIG5vdCBhY2tub3dsZWRnZWQgMHglMDJ4ICIsIHJlcGx5KTsKIAkJcmV0dXJuIDA7CiAJfQogCXN0YXRlLT5kaXNlcV9mbGFncyB8PSBBVFRFTVBUX1RVTkU7CkBAIC0xMDg1LDE0ICsxMTEwLDEzIEBACiAgKiBEaXNlcWMgNCAgICAweDAwLCAweDA4LCAweDA0LCAweGUwLCAweDEwLCAweDM4LCAweGZjLCAweGUwCiAgKi8KIAotc3RhdGljIGludCBkc3Rfc2V0X2Rpc2VxYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCogY21kKQorc3RhdGljIGludCBkc3Rfc2V0X2Rpc2VxYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqY21kKQogewotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCBwYWtldFs4XSA9IHsgMHgwMCwgMHgwOCwgMHgwNCwgMHhlMCwgMHgxMCwgMHgzOCwgMHhmMCwgMHhlYyB9OwogCiAJaWYgKHN0YXRlLT5kc3RfdHlwZSAhPSBEU1RfVFlQRV9JU19TQVQpCiAJCXJldHVybiAwOwotCiAJaWYgKGNtZC0+bXNnX2xlbiA9PSAwIHx8IGNtZC0+bXNnX2xlbiA+IDQpCiAJCXJldHVybiAtRUlOVkFMOwogCW1lbWNweSgmcGFrZXRbM10sIGNtZC0+bXNnLCBjbWQtPm1zZ19sZW4pOwpAQCAtMTEwMSw2NSArMTEyNSw2MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQorc3RhdGljIGludCBkc3Rfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlpbnQgbmVlZF9jbWQ7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJc3RhdGUtPnZvbHRhZ2UgPSB2b2x0YWdlOwotCiAJaWYgKHN0YXRlLT5kc3RfdHlwZSAhPSBEU1RfVFlQRV9JU19TQVQpCiAJCXJldHVybiAwOwogCiAJbmVlZF9jbWQgPSAwOworCiAJc3dpdGNoICh2b2x0YWdlKSB7Ci0JCWNhc2UgU0VDX1ZPTFRBR0VfMTM6Ci0JCWNhc2UgU0VDX1ZPTFRBR0VfMTg6Ci0JCQlpZiAoKHN0YXRlLT5kaXNlcV9mbGFncyAmIEhBU19QT1dFUikgPT0gMCkKLQkJCQluZWVkX2NtZCA9IDE7Ci0JCQlzdGF0ZS0+ZGlzZXFfZmxhZ3MgfD0gSEFTX1BPV0VSOwotCQkJc3RhdGUtPnR4X3R1bmFbNF0gPSAweDAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQlpZiAoKHN0YXRlLT5kaXNlcV9mbGFncyAmIEhBU19QT1dFUikgPT0gMCkKIAkJCW5lZWRfY21kID0gMTsKLQkJCXN0YXRlLT5kaXNlcV9mbGFncyAmPSB+KEhBU19QT1dFUiB8IEhBU19MT0NLIHwgQVRURU1QVF9UVU5FKTsKLQkJCXN0YXRlLT50eF90dW5hWzRdID0gMHgwMDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUtPmRpc2VxX2ZsYWdzIHw9IEhBU19QT1dFUjsKKwkJc3RhdGUtPnR4X3R1bmFbNF0gPSAweDAxOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJbmVlZF9jbWQgPSAxOworCQlzdGF0ZS0+ZGlzZXFfZmxhZ3MgJj0gfihIQVNfUE9XRVIgfCBIQVNfTE9DSyB8IEFUVEVNUFRfVFVORSk7CisJCXN0YXRlLT50eF90dW5hWzRdID0gMHgwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCiAJaWYgKG5lZWRfY21kKQogCQlkc3RfdG9uZV9wb3dlcl9jbWQoc3RhdGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKK3N0YXRpYyBpbnQgZHN0X3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlzdGF0ZS0+dG9uZSA9IHRvbmU7Ci0KIAlpZiAoc3RhdGUtPmRzdF90eXBlICE9IERTVF9UWVBFX0lTX1NBVCkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHRvbmUpIHsKLQkJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCi0JCQkgICAgc3RhdGUtPnR4X3R1bmFbMl0gPSAweDAwOwotCQkJZWxzZQotCQkJICAgIHN0YXRlLT50eF90dW5hWzJdID0gMHhmZjsKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQorCQkgICAgc3RhdGUtPnR4X3R1bmFbMl0gPSAweDAwOworCQllbHNlCisJCSAgICBzdGF0ZS0+dHhfdHVuYVsyXSA9IDB4ZmY7CisJCWJyZWFrOwogCi0JCQlicmVhazsKLQotCQljYXNlIFNFQ19UT05FX09OOgotCQkJc3RhdGUtPnR4X3R1bmFbMl0gPSAweDAyOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgU0VDX1RPTkVfT046CisJCXN0YXRlLT50eF90dW5hWzJdID0gMHgwMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRzdF90b25lX3Bvd2VyX2NtZChzdGF0ZSk7CiAKQEAgLTExNzIsMTYgKzExOTIsMTQgQEAKIAogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfU0FUKQogCQlyZXR1cm4gMDsKLQogCXN0YXRlLT5taW5pY21kID0gbWluaWNtZDsKLQogCXN3aXRjaCAobWluaWNtZCkgewotCQljYXNlIFNFQ19NSU5JX0E6Ci0JCQlzdGF0ZS0+dHhfdHVuYVszXSA9IDB4MDI7Ci0JCQlicmVhazsKLQkJY2FzZSBTRUNfTUlOSV9COgotCQkJc3RhdGUtPnR4X3R1bmFbM10gPSAweGZmOwotCQkJYnJlYWs7CisJY2FzZSBTRUNfTUlOSV9BOgorCQlzdGF0ZS0+dHhfdHVuYVszXSA9IDB4MDI7CisJCWJyZWFrOworCWNhc2UgU0VDX01JTklfQjoKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAweGZmOworCQlicmVhazsKIAl9CiAJZHN0X3RvbmVfcG93ZXJfY21kKHN0YXRlKTsKIApAQCAtMTE4OSw0MiArMTIwNywzNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgZHN0X2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCitzdGF0aWMgaW50IGRzdF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RhdGljIHU4IGluaV9zYXRjaV90dW5hW10gPSB7IDksIDAsIDMsIDB4YjYsIDEsIDAsIDB4NzMsIDB4MjEsIDAsIDAgfTsKLQlzdGF0aWMgdTggaW5pX3NhdGZ0YV90dW5hW10gPSB7IDAsIDAsIDMsIDB4YjYsIDEsIDB4NTUsIDB4YmQsIDB4NTAsIDAsIDAgfTsKLQlzdGF0aWMgdTggaW5pX3R2ZnRhX3R1bmFbXSA9IHsgMCwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKLQlzdGF0aWMgdTggaW5pX3R2Y2lfdHVuYVtdID0geyA5LCAwLCAzLCAweGI2LCAxLCA3LCAweDAsIDB4MCwgMCwgMCB9OwotCXN0YXRpYyB1OCBpbmlfY2FiZnRhX3R1bmFbXSA9IHsgMCwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKLQlzdGF0aWMgdTggaW5pX2NhYmNpX3R1bmFbXSA9IHsgOSwgMCwgMywgMHhiNiwgMSwgNywgMHgwLCAweDAsIDAsIDAgfTsKLS8vCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT047CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXN0YXRpYyB1OCBzYXRfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwMCwgMHg3MywgMHgyMSwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBzYXRfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHg1NSwgMHhiZCwgMHg1MCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCB0ZXJfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCB0ZXJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBjYWJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBjYWJfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCiAJc3RhdGUtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CiAJc3RhdGUtPnZvbHRhZ2UgPSBTRUNfVk9MVEFHRV8xMzsKIAlzdGF0ZS0+dG9uZSA9IFNFQ19UT05FX09GRjsKLQlzdGF0ZS0+c3ltYm9sX3JhdGUgPSAyOTQ3MzAwMDsKLQlzdGF0ZS0+ZmVjID0gRkVDX0FVVE87CiAJc3RhdGUtPmRpc2VxX2ZsYWdzID0gMDsKIAlzdGF0ZS0+azIyID0gMHgwMjsKIAlzdGF0ZS0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzdfTUhaOwogCXN0YXRlLT5jdXJfamlmZiA9IGppZmZpZXM7Ci0JaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKLQkJc3RhdGUtPmZyZXF1ZW5jeSA9IDk1MDAwMDsKLQkJbWVtY3B5KHN0YXRlLT50eF90dW5hLCAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpID8gaW5pX3NhdGNpX3R1bmEgOiBpbmlfc2F0ZnRhX3R1bmEpLCBzaXplb2YoaW5pX3NhdGZ0YV90dW5hKSk7Ci0JfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikgewotCQlzdGF0ZS0+ZnJlcXVlbmN5ID0gMTM3MDAwMDAwOwotCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgPyBpbmlfdHZjaV90dW5hIDogaW5pX3R2ZnRhX3R1bmEpLCBzaXplb2YoaW5pX3R2ZnRhX3R1bmEpKTsKLQl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgewotCQlzdGF0ZS0+ZnJlcXVlbmN5ID0gNTEwMDAwMDA7Ci0JCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IGluaV9jYWJjaV90dW5hIDogaW5pX2NhYmZ0YV90dW5hKSwgc2l6ZW9mKGluaV9jYWJmdGFfdHVuYSkpOwotCX0KKwlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkKKwkJbWVtY3B5KHN0YXRlLT50eF90dW5hLCAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpID8gc2F0X3R1bmFfMTg4IDogc2F0X3R1bmFfMjA0KSwgc2l6ZW9mIChzYXRfdHVuYV8yMDQpKTsKKwllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikKKwkJbWVtY3B5KHN0YXRlLT50eF90dW5hLCAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpID8gdGVyX3R1bmFfMTg4IDogdGVyX3R1bmFfMjA0KSwgc2l6ZW9mICh0ZXJfdHVuYV8yMDQpKTsKKwllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpCisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IGNhYl90dW5hXzE4OCA6IGNhYl90dW5hXzIwNCksIHNpemVvZiAoY2FiX3R1bmFfMjA0KSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3RfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCitzdGF0aWMgaW50IGRzdF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkqc3RhdHVzID0gMDsKIAlpZiAoc3RhdGUtPmRpc2VxX2ZsYWdzICYgSEFTX0xPQ0spIHsKQEAgLTEyMzYsOSArMTI0OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQorc3RhdGljIGludCBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJZHN0X2dldF9zaWduYWwoc3RhdGUpOwogCSpzdHJlbmd0aCA9IHN0YXRlLT5kZWNvZGVfc3RyZW5ndGg7CkBAIC0xMjQ2LDkgKzEyNTksOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzdF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCitzdGF0aWMgaW50IGRzdF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJZHN0X2dldF9zaWduYWwoc3RhdGUpOwogCSpzbnIgPSBzdGF0ZS0+ZGVjb2RlX3NucjsKQEAgLTEyNTYsMjggKzEyNjksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3Rfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCitzdGF0aWMgaW50IGRzdF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKLQlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAlkc3Rfc2V0X2ZyZXEoc3RhdGUsIHAtPmZyZXF1ZW5jeSk7Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCJTZXQgRnJlcXVlbmN5PVslZF1cbiIsIHAtPmZyZXF1ZW5jeSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJTZXQgRnJlcXVlbmN5PVslZF0iLCBwLT5mcmVxdWVuY3kpOwogCi0vLwlkc3Rfc2V0X2ludmVyc2lvbihzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgewogCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCiAJCQlkc3Rfc2V0X2ludmVyc2lvbihzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKLQogCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CiAJCWRzdF9zZXRfc3ltYm9scmF0ZShzdGF0ZSwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKIAkJZHN0X3NldF9wb2xhcml6YXRpb24oc3RhdGUpOwotCQlpZiAodmVyYm9zZSA+IDQpCi0JCQlkcHJpbnRrKCJTZXQgU3ltYm9scmF0ZT1bJWRdXG4iLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlNldCBTeW1ib2xyYXRlPVslZF0iLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOwogCi0JfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfVEVSUikgeworCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCiAJCWRzdF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBwLT51Lm9mZG0uYmFuZHdpZHRoKTsKLQl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgeworCWVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgewogCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xYW0uZmVjX2lubmVyKTsKIAkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CiAJCWRzdF9zZXRfbW9kdWxhdGlvbihzdGF0ZSwgcC0+dS5xYW0ubW9kdWxhdGlvbik7CkBAIC0xMjg3LDE2ICsxMjk2LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIGludCBkc3RfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0Jc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJcC0+ZnJlcXVlbmN5ID0gc3RhdGUtPmRlY29kZV9mcmVxOwotLy8JcC0+aW52ZXJzaW9uID0gc3RhdGUtPmludmVyc2lvbjsKIAlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgewogCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCiAJCQlwLT5pbnZlcnNpb24gPSBzdGF0ZS0+aW52ZXJzaW9uOwotCiAJCXAtPnUucXBzay5zeW1ib2xfcmF0ZSA9IHN0YXRlLT5zeW1ib2xfcmF0ZTsKIAkJcC0+dS5xcHNrLmZlY19pbm5lciA9IGRzdF9nZXRfZmVjKHN0YXRlKTsKIAl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKSB7CkBAIC0xMzA0LDE2ICsxMzExLDE1IEBACiAJfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKIAkJcC0+dS5xYW0uc3ltYm9sX3JhdGUgPSBzdGF0ZS0+c3ltYm9sX3JhdGU7CiAJCXAtPnUucWFtLmZlY19pbm5lciA9IGRzdF9nZXRfZmVjKHN0YXRlKTsKLS8vCQlwLT51LnFhbS5tb2R1bGF0aW9uID0gUUFNX0FVVE87CiAJCXAtPnUucWFtLm1vZHVsYXRpb24gPSBkc3RfZ2V0X21vZHVsYXRpb24oc3RhdGUpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkc3RfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3N0YXRpYyB2b2lkIGRzdF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewotCXN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlrZnJlZShzdGF0ZSk7CiB9CiAKQEAgLTEzMjEsOSArMTMyNyw4IEBACiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHN0X2R2YnNfb3BzOwogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9kdmJjX29wczsKIAotc3RydWN0IGRzdF9zdGF0ZSogZHN0X2F0dGFjaChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcikKK3N0cnVjdCBkc3Rfc3RhdGUgKmRzdF9hdHRhY2goc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIpCiB7Ci0KIAkvKiBjaGVjayBpZiB0aGUgQVNJQyBpcyB0aGVyZSAqLwogCWlmIChkc3RfcHJvYmUoc3RhdGUpIDwgMCkgewogCQlpZiAoc3RhdGUpCkBAIC0xMzM2LDE3ICsxMzQxLDE0IEBACiAJY2FzZSBEU1RfVFlQRV9JU19URVJSOgogCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZidF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKLQogCWNhc2UgRFNUX1RZUEVfSVNfQ0FCTEU6CiAJCW1lbWNweSgmc3RhdGUtPm9wcywgJmRzdF9kdmJjX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJCWJyZWFrOwotCiAJY2FzZSBEU1RfVFlQRV9JU19TQVQ6CiAJCW1lbWNweSgmc3RhdGUtPm9wcywgJmRzdF9kdmJzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCIlczogdW5rbm93biBEU1QgdHlwZS4gcGxlYXNlIHJlcG9ydCB0byB0aGUgTGludXhUVi5vcmcgRFZCIG1haWxpbmdsaXN0LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJ1bmtub3duIERTVCB0eXBlLiBwbGVhc2UgcmVwb3J0IHRvIHRoZSBMaW51eFRWLm9yZyBEVkIgbWFpbGluZ2xpc3QuIik7CiAJCWlmIChzdGF0ZSkKIAkJCWtmcmVlKHN0YXRlKTsKIApAQCAtMTM3NCwxMiArMTM3Niw5IEBACiAJfSwKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCi0KIAkuaW5pdCA9IGRzdF9pbml0LAotCiAJLnNldF9mcm9udGVuZCA9IGRzdF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGRzdF9nZXRfZnJvbnRlbmQsCi0KIAkucmVhZF9zdGF0dXMgPSBkc3RfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAogCS5yZWFkX3NuciA9IGRzdF9yZWFkX3NuciwKQEAgLTE0MDEsMTYgKzE0MDAsMTIgQEAKIAl9LAogCiAJLnJlbGVhc2UgPSBkc3RfcmVsZWFzZSwKLQogCS5pbml0ID0gZHN0X2luaXQsCi0KIAkuc2V0X2Zyb250ZW5kID0gZHN0X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gZHN0X2dldF9mcm9udGVuZCwKLQogCS5yZWFkX3N0YXR1cyA9IGRzdF9yZWFkX3N0YXR1cywKIAkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgsCiAJLnJlYWRfc25yID0gZHN0X3JlYWRfc25yLAotCiAJLmRpc2VxY19zZW5kX2J1cnN0ID0gZHN0X3NlbmRfYnVyc3QsCiAJLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBkc3Rfc2V0X2Rpc2VxYywKIAkuc2V0X3ZvbHRhZ2UgPSBkc3Rfc2V0X3ZvbHRhZ2UsCkBAIC0xNDMyLDE4ICsxNDI3LDE0IEBACiAJfSwKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCi0KIAkuaW5pdCA9IGRzdF9pbml0LAotCiAJLnNldF9mcm9udGVuZCA9IGRzdF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGRzdF9nZXRfZnJvbnRlbmQsCi0KIAkucmVhZF9zdGF0dXMgPSBkc3RfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAogCS5yZWFkX3NuciA9IGRzdF9yZWFkX3NuciwKIH07CiAKLQogTU9EVUxFX0RFU0NSSVBUSU9OKCJEU1QgRFZCLVMvVC9DIENvbWJvIEZyb250ZW5kIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiSmFtaWUgSG9uYW4sIE1hbnUgQWJyYWhhbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwppbmRleCBiZmFhY2Q1Li42Nzc2YTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYwpAQCAtMTgsMzAgKzE4LDQyIEBACiAJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2R2Yi9jYS5oPgogI2luY2x1ZGUgImR2YmRldi5oIgogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotCiAjaW5jbHVkZSAiZHN0X2NhLmgiCiAjaW5jbHVkZSAiZHN0X2NvbW1vbi5oIgogCisjZGVmaW5lIERTVF9DQV9FUlJPUgkJMAorI2RlZmluZSBEU1RfQ0FfTk9USUNFCQkxCisjZGVmaW5lIERTVF9DQV9JTkZPCQkyCisjZGVmaW5lIERTVF9DQV9ERUJVRwkJMworCisjZGVmaW5lIGRwcmludGsoeCwgeSwgeiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsJCQkJCQlcCisJaWYgKHopIHsJCQkJCQkJCQlcCisJCWlmCSgoeCA+IERTVF9DQV9FUlJPUikgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCQllbHNlIGlmCSgoeCA+IERTVF9DQV9OT1RJQ0UpICYmICh4ID4geSkpCQkJCVwKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCQllbHNlIGlmICgoeCA+IERTVF9DQV9JTkZPKSAmJiAoeCA+IHkpKQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAorCQllbHNlIGlmICgoeCA+IERTVF9DQV9ERUJVRykgJiYgKHggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyNhcmcpOwlcCisJfSBlbHNlIHsJCQkJCQkJCQlcCisJCWlmICh4ID4geSkJCQkJCQkJCVwKKwkJCXByaW50ayhmb3JtYXQsICMjIGFyZyk7CQkJCQkJXAorCX0JCQkJCQkJCQkJXAorfSB3aGlsZSgwKQorCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDU7CiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgInZlcmJvc2Ugc3RhcnR1cCBtZXNzYWdlcywgZGVmYXVsdCBpcyAxICh5ZXMpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAxOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKLQotI2RlZmluZSBkcHJpbnRrIGlmIChkZWJ1ZykgcHJpbnRrCi0KIC8qCU5lZWQgc29tZSBtb3JlIHdvcmsJKi8KIHN0YXRpYyBpbnQgY2Ffc2V0X3Nsb3RfZGVzY3Iodm9pZCkKIHsKQEAgLTYxLDI3ICs3MywyMCBAQAogewogCXU4IGkgPSAwLCBjaGVja3N1bSA9IDA7CiAKLQlpZiAodmVyYm9zZSA+IDMpIHsKLQkJZHByaW50aygiJXM6ID09PT09PT09PT09PT09PT09PT09PT09PT0gQ2hlY2tzdW0gY2FsY3VsYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlkcHJpbnRrKCIlczogU3RyaW5nIExlbmd0aD1bMHglMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiID09PT09PT09PT09PT09PT09PT09PT09PT0gQ2hlY2tzdW0gY2FsY3VsYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgU3RyaW5nIExlbmd0aD1bMHglMDJ4XSIsIGxlbmd0aCk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgU3RyaW5nPVsiKTsKIAotCQlkcHJpbnRrKCIlczogU3RyaW5nPVsiLCBfX0ZVTkNUSU9OX18pOwotCX0KIAl3aGlsZSAoaSA8IGxlbmd0aCkgewotCQlpZiAodmVyYm9zZSA+IDMpCi0JCQlkcHJpbnRrKCIgJTAyeCIsIGNoZWNrX3N0cmluZ1tpXSk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAwLCAiICUwMngiLCBjaGVja19zdHJpbmdbaV0pOwogCQljaGVja3N1bSArPSBjaGVja19zdHJpbmdbaV07CiAJCWkrKzsKIAl9Ci0JaWYgKHZlcmJvc2UgPiAzKSB7Ci0JCWRwcmludGsoIiBdXG4iKTsKLQkJZHByaW50aygiJXM6IFN1bT1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgY2hlY2tzdW0pOwotCX0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMCwgIiBdXG4iKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIlN1bT1bJTAyeF1cbiIsIGNoZWNrc3VtKTsKIAljaGVja19zdHJpbmdbbGVuZ3RoXSA9IH5jaGVja3N1bSArIDE7Ci0JaWYgKHZlcmJvc2UgPiAzKSB7Ci0JCWRwcmludGsoIiVzOiBDaGVja3N1bT1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgY2hlY2tfc3RyaW5nW2xlbmd0aF0pOwotCQlkcHJpbnRrKCIlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JfQorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIENoZWNrc3VtPVslMDJ4XSIsIGNoZWNrX3N0cmluZ1tsZW5ndGhdKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NCwzMCArOTksMjYgQEAKIAltc2xlZXAoNjUpOwogCiAJaWYgKHdyaXRlX2RzdChzdGF0ZSwgZGF0YSwgbGVuKSkgewotCQlkcHJpbnRrKCIlczogV3JpdGUgbm90IHN1Y2Nlc3NmdWwsIHRyeWluZyB0byByZWNvdmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIFdyaXRlIG5vdCBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gcmVjb3ZlciIpOwogCQlkc3RfZXJyb3JfcmVjb3Zlcnkoc3RhdGUpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJaWYgKChkc3RfcGlvX2Rpc2FibGUoc3RhdGUpKSA8IDApIHsKLQkJZHByaW50aygiJXM6IERTVCBQSU8gZGlzYWJsZSBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBEU1QgUElPIGRpc2FibGUgZmFpbGVkLiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCiAJaWYgKHJlYWRfZHN0KHN0YXRlLCAmcmVwbHksIEdFVF9BQ0spIDwgMCkgewotCQlkcHJpbnRrKCIlczogUmVhZCBub3Qgc3VjY2Vzc2Z1bCwgdHJ5aW5nIHRvIHJlY292ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgUmVhZCBub3Qgc3VjY2Vzc2Z1bCwgdHJ5aW5nIHRvIHJlY292ZXIiKTsKIAkJZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKTsKIAkJcmV0dXJuIC0xOwogCX0KLQogCWlmIChyZWFkKSB7CiAJCWlmICghIGRzdF93YWl0X2RzdF9yZWFkeShzdGF0ZSwgTE9OR19ERUxBWSkpIHsKLQkJCWRwcmludGsoIiVzOiA4ODIwIG5vdCByZWFkeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiA4ODIwIG5vdCByZWFkeSIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0KIAkJaWYgKHJlYWRfZHN0KHN0YXRlLCBjYV9zdHJpbmcsIDEyOCkgPCAwKSB7CS8qCVRyeSB0byBtYWtlIHRoaXMgZHluYW1pYwkqLwotCQkJZHByaW50aygiJXM6IFJlYWQgbm90IHN1Y2Nlc3NmdWwsIHRyeWluZyB0byByZWNvdmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBSZWFkIG5vdCBzdWNjZXNzZnVsLCB0cnlpbmcgdG8gcmVjb3ZlciIpOwogCQkJZHN0X2Vycm9yX3JlY292ZXJ5KHN0YXRlKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMTMzLDggKzEzNCw3IEBACiAKIAl3aGlsZSAoZHN0X2NhX2NvbW1fZXJyIDwgUkVUUklFUykgewogCQlkc3RfY29tbV9pbml0KHN0YXRlKTsKLQkJaWYgKHZlcmJvc2UgPiAyKQotCQkJZHByaW50aygiJXM6IFB1dCBDb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgUHV0IENvbW1hbmQiKTsKIAkJaWYgKGRzdF9jaV9jb21tYW5kKHN0YXRlLCBkYXRhLCBjYV9zdHJpbmcsIGxlbiwgcmVhZCkpIHsJLy8gSWYgZXJyb3IKIAkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CiAJCQlkc3RfY2FfY29tbV9lcnIrKzsgLy8gd29yayByZXF1aXJlZCBoZXJlLgpAQCAtMTUzLDE4ICsxNTMsMTUgQEAKIAogCXB1dF9jaGVja3N1bSgmY29tbWFuZFswXSwgY29tbWFuZFswXSk7CiAJaWYgKChkc3RfcHV0X2NpKHN0YXRlLCBjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIHN0YXRlLT5tZXNzYWdlcywgR0VUX1JFUExZKSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiAtLT5kc3RfcHV0X2NpIEZBSUxFRCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5kc3RfcHV0X2NpIEZBSUxFRCAhIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKHZlcmJvc2UgPiAxKSB7Ci0JCWRwcmludGsoIiVzOiAtLT5kc3RfcHV0X2NpIFNVQ0NFU1MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQlkcHJpbnRrKCIlczogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0kgTW9kdWxlIEFwcGxpY2F0aW9uIEluZm8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWRwcmludGsoIiVzOiBBcHBsaWNhdGlvbiBUeXBlPVslZF0sIEFwcGxpY2F0aW9uIFZlbmRvcj1bJWRdLCBWZW5kb3IgQ29kZT1bJWRdXG4lczogQXBwbGljYXRpb24gaW5mbz1bJXNdXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0ZS0+bWVzc2FnZXNbN10sIChzdGF0ZS0+bWVzc2FnZXNbOF0gPDwgOCkgfCBzdGF0ZS0+bWVzc2FnZXNbOV0sCi0JCQkoc3RhdGUtPm1lc3NhZ2VzWzEwXSA8PCA4KSB8IHN0YXRlLT5tZXNzYWdlc1sxMV0sIF9fRlVOQ1RJT05fXywgKGNoYXIgKikoJnN0YXRlLT5tZXNzYWdlc1sxMl0pKTsKLQkJZHByaW50aygiJXM6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBfX0ZVTkNUSU9OX18pOwotCX0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhIik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDSSBNb2R1bGUgQXBwbGljYXRpb24gSW5mbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgQXBwbGljYXRpb24gVHlwZT1bJWRdLCBBcHBsaWNhdGlvbiBWZW5kb3I9WyVkXSwgVmVuZG9yIENvZGU9WyVkXVxuJXM6IEFwcGxpY2F0aW9uIGluZm89WyVzXSIsCisJCXN0YXRlLT5tZXNzYWdlc1s3XSwgKHN0YXRlLT5tZXNzYWdlc1s4XSA8PCA4KSB8IHN0YXRlLT5tZXNzYWdlc1s5XSwKKwkJKHN0YXRlLT5tZXNzYWdlc1sxMF0gPDwgOCkgfCBzdGF0ZS0+bWVzc2FnZXNbMTFdLCBfX0ZVTkNUSU9OX18sIChjaGFyICopKCZzdGF0ZS0+bWVzc2FnZXNbMTJdKSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzcsMzEgKzE3NCwyNiBAQAogCiAJcHV0X2NoZWNrc3VtKCZzbG90X2NvbW1hbmRbMF0sIHNsb3RfY29tbWFuZFswXSk7CiAJaWYgKChkc3RfcHV0X2NpKHN0YXRlLCBzbG90X2NvbW1hbmQsIHNpemVvZiAoc2xvdF9jb21tYW5kKSwgc2xvdF9jYXAsIEdFVF9SRVBMWSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogLS0+ZHN0X3B1dF9jaSBGQUlMRUQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+ZHN0X3B1dF9jaSBGQUlMRUQgISIpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmICh2ZXJib3NlID4gMSkKLQkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiAtLT5kc3RfcHV0X2NpIFNVQ0NFU1MgISIpOwogCiAJLyoJV2lsbCBpbXBsZW1lbnQgdGhlIHJlc3Qgc29vbgkJKi8KIAotCWlmICh2ZXJib3NlID4gMSkgewotCQlkcHJpbnRrKCIlczogU2xvdCBjYXAgPSBbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3RfY2FwWzddKTsKLQkJZHByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJZHByaW50aygiICVkIiwgc2xvdF9jYXBbaV0pOwotCQlkcHJpbnRrKCJcbiIpOwotCX0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIFNsb3QgY2FwID0gWyVkXSIsIHNsb3RfY2FwWzddKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICIgJWQiLCBzbG90X2NhcFtpXSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIlxuIik7CiAKIAlwX2NhX2NhcHMtPnNsb3RfbnVtID0gMTsKIAlwX2NhX2NhcHMtPnNsb3RfdHlwZSA9IDE7CiAJcF9jYV9jYXBzLT5kZXNjcl9udW0gPSBzbG90X2NhcFs3XTsKIAlwX2NhX2NhcHMtPmRlc2NyX3R5cGUgPSAxOwogCi0KLQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgY2FfY2FwcyAqKWFyZywgcF9jYV9jYXBzLCBzaXplb2YgKHN0cnVjdCBjYV9jYXBzKSkpIHsKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgY2FfY2FwcyAqKWFyZywgcF9jYV9jYXBzLCBzaXplb2YgKHN0cnVjdCBjYV9jYXBzKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjIyLDQ2ICsyMTQsMzcgQEAKIAogCXB1dF9jaGVja3N1bSgmc2xvdF9jb21tYW5kWzBdLCA3KTsKIAlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIHNsb3RfY29tbWFuZCwgc2l6ZW9mIChzbG90X2NvbW1hbmQpLCBzbG90X2luZm8sIEdFVF9SRVBMWSkpIDwgMCkgewotCQlkcHJpbnRrKCIlczogLS0+ZHN0X3B1dF9jaSBGQUlMRUQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+ZHN0X3B1dF9jaSBGQUlMRUQgISIpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmICh2ZXJib3NlID4gMSkKLQkJZHByaW50aygiJXM6IC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+ZHN0X3B1dF9jaSBTVUNDRVNTICEiKTsKIAogCS8qCVdpbGwgaW1wbGVtZW50IHRoZSByZXN0IHNvb24JCSovCiAKLQlpZiAodmVyYm9zZSA+IDEpIHsKLQkJZHByaW50aygiJXM6IFNsb3QgaW5mbyA9IFslZF1cbiIsIF9fRlVOQ1RJT05fXywgc2xvdF9pbmZvWzNdKTsKLQkJZHByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJZHByaW50aygiICVkIiwgc2xvdF9pbmZvW2ldKTsKLQkJZHByaW50aygiXG4iKTsKLQl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBTbG90IGluZm8gPSBbJWRdIiwgc2xvdF9pbmZvWzNdKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICIgJWQiLCBzbG90X2luZm9baV0pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICJcbiIpOwogCiAJaWYgKHNsb3RfaW5mb1s0XSAmIDB4ODApIHsKIAkJcF9jYV9zbG90X2luZm8tPmZsYWdzID0gQ0FfQ0lfTU9EVUxFX1BSRVNFTlQ7CiAJCXBfY2Ffc2xvdF9pbmZvLT5udW0gPSAxOwogCQlwX2NhX3Nsb3RfaW5mby0+dHlwZSA9IENBX0NJOwotCX0KLQllbHNlIGlmIChzbG90X2luZm9bNF0gJiAweDQwKSB7CisJfSBlbHNlIGlmIChzbG90X2luZm9bNF0gJiAweDQwKSB7CiAJCXBfY2Ffc2xvdF9pbmZvLT5mbGFncyA9IENBX0NJX01PRFVMRV9SRUFEWTsKIAkJcF9jYV9zbG90X2luZm8tPm51bSA9IDE7CiAJCXBfY2Ffc2xvdF9pbmZvLT50eXBlID0gQ0FfQ0k7Ci0JfQotCWVsc2UgeworCX0gZWxzZQogCQlwX2NhX3Nsb3RfaW5mby0+ZmxhZ3MgPSAwOwotCX0KIAotCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBjYV9zbG90X2luZm8gKilhcmcsIHBfY2Ffc2xvdF9pbmZvLCBzaXplb2YgKHN0cnVjdCBjYV9zbG90X2luZm8pKSkgeworCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBjYV9zbG90X2luZm8gKilhcmcsIHBfY2Ffc2xvdF9pbmZvLCBzaXplb2YgKHN0cnVjdCBjYV9zbG90X2luZm8pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CiAKIAotCi0KIHN0YXRpYyBpbnQgY2FfZ2V0X21lc3NhZ2Uoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgdm9pZCAqYXJnKQogewogCXU4IGkgPSAwOwpAQCAtMjcwLDI0ICsyNTMsMjEgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIocF9jYV9tZXNzYWdlLCAodm9pZCAqKWFyZywgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0KIAlpZiAocF9jYV9tZXNzYWdlLT5tc2cpIHsKLQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJZHByaW50aygiTWVzc2FnZSA9IFslMDJ4ICUwMnggJTAyeF1cbiIsIHBfY2FfbWVzc2FnZS0+bXNnWzBdLCBwX2NhX21lc3NhZ2UtPm1zZ1sxXSwgcF9jYV9tZXNzYWdlLT5tc2dbMl0pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgTWVzc2FnZSA9IFslMDJ4ICUwMnggJTAyeF0iLCBwX2NhX21lc3NhZ2UtPm1zZ1swXSwgcF9jYV9tZXNzYWdlLT5tc2dbMV0sIHBfY2FfbWVzc2FnZS0+bXNnWzJdKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCQljb21tYW5kID0gY29tbWFuZCB8IHBfY2FfbWVzc2FnZS0+bXNnW2ldOwogCQkJaWYgKGkgPCAyKQogCQkJCWNvbW1hbmQgPSBjb21tYW5kIDw8IDg7CiAJCX0KLQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJZHByaW50aygiJXM6Q29tbWFuZD1bMHgleF1cbiIsIF9fRlVOQ1RJT05fXywgY29tbWFuZCk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiBDb21tYW5kPVsweCV4XSIsIGNvbW1hbmQpOwogCiAJCXN3aXRjaCAoY29tbWFuZCkgewotCQkJY2FzZSBDQV9BUFBfSU5GTzoKLQkJCQltZW1jcHkocF9jYV9tZXNzYWdlLT5tc2csIHN0YXRlLT5tZXNzYWdlcywgMTI4KTsKLQkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBwX2NhX21lc3NhZ2UsIHNpemVvZiAoc3RydWN0IGNhX21zZykpICkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWNhc2UgQ0FfQVBQX0lORk86CisJCQltZW1jcHkocF9jYV9tZXNzYWdlLT5tc2csIHN0YXRlLT5tZXNzYWdlcywgMTI4KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIHBfY2FfbWVzc2FnZSwgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yOTgsMTAgKzI3OCwxMyBAQAogc3RhdGljIGludCBoYW5kbGVfZHN0X3RhZyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHUzMiBsZW5ndGgpCiB7CiAJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX1NFU1NJT04pIHsKLQkJaHdfYnVmZmVyLT5tc2dbMl0gPSBwX2NhX21lc3NhZ2UtPm1zZ1sxXTsJCS8qCQlNU0IJCQkqLwotCQlod19idWZmZXItPm1zZ1szXSA9IHBfY2FfbWVzc2FnZS0+bXNnWzJdOwkJLyoJCUxTQgkJCSovCi0JfQotCWVsc2UgeworCQlod19idWZmZXItPm1zZ1syXSA9IHBfY2FfbWVzc2FnZS0+bXNnWzFdOwkvKglNU0IJKi8KKwkJaHdfYnVmZmVyLT5tc2dbM10gPSBwX2NhX21lc3NhZ2UtPm1zZ1syXTsJLyoJTFNCCSovCisJfSBlbHNlIHsKKwkJaWYgKGxlbmd0aCA+IDI0NykgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgTWVzc2FnZSB0b28gbG9uZyAhICoqKiBCYWlsaW5nIE91dCAqKiogISIpOworCQkJcmV0dXJuIC0xOworCQl9CiAJCWh3X2J1ZmZlci0+bXNnWzBdID0gKGxlbmd0aCAmIDB4ZmYpICsgNzsKIAkJaHdfYnVmZmVyLT5tc2dbMV0gPSAweDQwOwogCQlod19idWZmZXItPm1zZ1syXSA9IDB4MDM7CkBAIC0zMDksNiArMjkyLDExIEBACiAJCWh3X2J1ZmZlci0+bXNnWzRdID0gMHgwMzsKIAkJaHdfYnVmZmVyLT5tc2dbNV0gPSBsZW5ndGggJiAweGZmOwogCQlod19idWZmZXItPm1zZ1s2XSA9IDB4MDA7CisJCS8qCisJCSAqCU5lZWQgdG8gY29tcHV0ZSBsZW5ndGggZm9yIEVONTAyMjEgc2VjdGlvbiA4LjMuMiwgZm9yIHRoZSB0aW1lIGJlaW5nCisJCSAqCWFzc3VtaW5nIDguMy4yIGlzIG5vdCBhcHBsaWNhYmxlCisJCSAqLworCQltZW1jcHkoJmh3X2J1ZmZlci0+bXNnWzddLCAmcF9jYV9tZXNzYWdlLT5tc2dbNF0sIGxlbmd0aCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzE3LDEzICszMDUsMTIgQEAKIHN0YXRpYyBpbnQgd3JpdGVfdG9fODgyMChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCBsZW5ndGgsIHU4IHJlcGx5KQogewogCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgaHdfYnVmZmVyLT5tc2csIGxlbmd0aCwgaHdfYnVmZmVyLT5tc2csIHJlcGx5KSkgPCAwKSB7Ci0JCWRwcmludGsoIiVzOiBEU1QtQ0kgQ29tbWFuZCBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlkcHJpbnRrKCIlczogUmVzZXR0aW5nIERTVC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIERTVC1DSSBDb21tYW5kIGZhaWxlZC4iKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfTk9USUNFLCAxLCAiIFJlc2V0dGluZyBEU1QuIik7CiAJCXJkY19yZXNldF9zdGF0ZShzdGF0ZSk7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKHZlcmJvc2UgPiAyKQotCQlkcHJpbnRrKCIlczogRFNULUNJIENvbW1hbmQgc3VjY2VzLlxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgRFNULUNJIENvbW1hbmQgc3VjY2VzLiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzQsMTMwICszMjEsNDcgQEAKIAl1MzIgbGVuZ3RoID0gMDsKIAogCWxlbmd0aF9maWVsZCA9IGFzbl8xX2FycmF5WzBdOwotCWRwcmludGsoIiVzOiBMZW5ndGggZmllbGQ9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aF9maWVsZCk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgTGVuZ3RoIGZpZWxkPVslMDJ4XSIsIGxlbmd0aF9maWVsZCk7CiAJaWYgKGxlbmd0aF9maWVsZCA8IDB4ODApIHsKIAkJbGVuZ3RoID0gbGVuZ3RoX2ZpZWxkICYgMHg3ZjsKLQkJZHByaW50aygiJXM6IExlbmd0aD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgTGVuZ3RoPVslMDJ4XVxuIiwgbGVuZ3RoKTsKIAl9IGVsc2UgewogCQl3b3JkX2NvdW50ID0gbGVuZ3RoX2ZpZWxkICYgMHg3ZjsKIAkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgd29yZF9jb3VudDsgY291bnQrKykgewogCQkJbGVuZ3RoID0gKGxlbmd0aCB8IGFzbl8xX2FycmF5W2NvdW50ICsgMV0pIDw8IDg7Ci0JCQlkcHJpbnRrKCIlczogTGVuZ3RoPVslMDR4XVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgTGVuZ3RoPVslMDR4XSIsIGxlbmd0aCk7CiAJCX0KIAl9CiAJcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIGludCBpbml0X2J1ZmZlcih1OCAqYnVmZmVyLCB1MzIgbGVuZ3RoKQotewotCXUzMiBpOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJYnVmZmVyW2ldID0gMDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGRlYnVnX3N0cmluZyh1OCAqbXNnLCB1MzIgbGVuZ3RoLCB1MzIgb2Zmc2V0KQogewogCXUzMiBpOwogCi0JZHByaW50aygiIFN0cmluZz1bICIpOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAwLCAiIFN0cmluZz1bICIpOwogCWZvciAoaSA9IG9mZnNldDsgaSA8IGxlbmd0aDsgaSsrKQotCQlkcHJpbnRrKCIlMDJ4ICIsIG1zZ1tpXSk7Ci0JZHByaW50aygiXVxuIik7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAwLCAiJTAyeCAiLCBtc2dbaV0pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAwLCAiXVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjb3B5X3N0cmluZyh1OCAqZGVzdGluYXRpb24sIHU4ICpzb3VyY2UsIHUzMiBkZXN0X29mZnNldCwgdTMyIHNvdXJjZV9vZmZzZXQsIHUzMiBsZW5ndGgpCi17Ci0JdTMyIGk7Ci0JZHByaW50aygiJXM6IENvcHlpbmcgWyIsIF9fRlVOQ1RJT05fXyk7Ci0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWRlc3RpbmF0aW9uW2kgKyBkZXN0X29mZnNldF0gPSBzb3VyY2VbaSArIHNvdXJjZV9vZmZzZXRdOwotCQlkcHJpbnRrKCIgJTAyeCIsIHNvdXJjZVtpICsgc291cmNlX29mZnNldF0pOwotCX0KLQlkcHJpbnRrKCJdXG4iKTsKLQotCXJldHVybiBpOwotfQotCi1zdGF0aWMgaW50IG1vZGlmeV80X2JpdHModTggKm1lc3NhZ2UsIHUzMiBwb3MpCi17Ci0JbWVzc2FnZVtwb3NdICY9IDB4MGY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0KIHN0YXRpYyBpbnQgY2Ffc2V0X3BtdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IHJlcGx5LCB1OCBxdWVyeSkKIHsKLQl1MzIgbGVuZ3RoID0gMCwgY291bnQgPSAwOwotCXU4IGFzbl8xX3dvcmRzLCBwcm9ncmFtX2hlYWRlcl9sZW5ndGg7Ci0JdTE2IHByb2dyYW1faW5mb19sZW5ndGggPSAwLCBlc19pbmZvX2xlbmd0aCA9IDA7Ci0JdTMyIGh3X29mZnNldCA9IDAsIGJ1Zl9vZmZzZXQgPSAwLCBpOwotCXU4IGRzdF90YWdfbGVuZ3RoOworCXUzMiBsZW5ndGggPSAwOworCXU4IHRhZ19sZW5ndGggPSA4OwogCiAJbGVuZ3RoID0gYXNuXzFfZGVjb2RlKCZwX2NhX21lc3NhZ2UtPm1zZ1szXSk7Ci0JZHByaW50aygiJXM6IENBIE1lc3NhZ2UgbGVuZ3RoPVslZF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKLQlkcHJpbnRrKCIlczogQVNOLjEgIiwgX19GVU5DVElPTl9fKTsKLQlkZWJ1Z19zdHJpbmcoJnBfY2FfbWVzc2FnZS0+bXNnWzRdLCBsZW5ndGgsIDApOyAvLyBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSB0YWcgYW5kIGxlbmd0aAorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIENBIE1lc3NhZ2UgbGVuZ3RoPVslZF0iLCBsZW5ndGgpOworCWRlYnVnX3N0cmluZygmcF9jYV9tZXNzYWdlLT5tc2dbNF0sIGxlbmd0aCwgMCk7IC8qCWxlbmd0aCBpcyBleGNsdWRpbmcgdGFnICYgbGVuZ3RoCSovCiAKLQlpbml0X2J1ZmZlcihod19idWZmZXItPm1zZywgbGVuZ3RoKTsKKwltZW1zZXQoaHdfYnVmZmVyLT5tc2csICdcMCcsIGxlbmd0aCk7CiAJaGFuZGxlX2RzdF90YWcoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCBsZW5ndGgpOworCXB1dF9jaGVja3N1bShod19idWZmZXItPm1zZywgaHdfYnVmZmVyLT5tc2dbMF0pOwogCi0JaHdfb2Zmc2V0ID0gNzsKLQlhc25fMV93b3JkcyA9IDE7IC8vIGp1c3QgYSBoYWNrIHRvIHRlc3QsIHNob3VsZCBjb21wdXRlIHRoaXMgb25lCi0JYnVmX29mZnNldCA9IDM7Ci0JcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoID0gNjsKLQlkc3RfdGFnX2xlbmd0aCA9IDc7Ci0KLS8vCWRlYnVnX3R3aW5oYW5fY2FfcGFyYW1zKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgcmVwbHksIHF1ZXJ5LCBsZW5ndGgsIGh3X29mZnNldCwgYnVmX29mZnNldCk7Ci0vLwlkcHJpbnRrKCIlczogUHJvZ3JhbSBIZWFkZXIoQlVGKSIsIF9fRlVOQ1RJT05fXyk7Ci0vLwlkZWJ1Z19zdHJpbmcoJnBfY2FfbWVzc2FnZS0+bXNnWzRdLCBwcm9ncmFtX2hlYWRlcl9sZW5ndGgsIDApOwotLy8JZHByaW50aygiJXM6IENvcHlpbmcgUHJvZ3JhbSBoZWFkZXJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JY29weV9zdHJpbmcoaHdfYnVmZmVyLT5tc2csIHBfY2FfbWVzc2FnZS0+bXNnLCBod19vZmZzZXQsIChidWZfb2Zmc2V0ICsgYXNuXzFfd29yZHMpLCBwcm9ncmFtX2hlYWRlcl9sZW5ndGgpOwotCWJ1Zl9vZmZzZXQgKz0gcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoLCBod19vZmZzZXQgKz0gcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoOwotCW1vZGlmeV80X2JpdHMoaHdfYnVmZmVyLT5tc2csIChod19vZmZzZXQgLSAyKSk7Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0lOQ19DT1VOVCkgewkvLyB3b3JrYXJvdW5kCi0JCWRwcmludGsoIiVzOiBQcm9iYWJseSBhbiBBU0lDIGJ1ZyAhISFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgKGh3X29mZnNldCArIHByb2dyYW1faGVhZGVyX2xlbmd0aCksIDApOwotCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgLSAxXSArPSAxOwotCX0KLQotLy8JZHByaW50aygiJXM6IFByb2dyYW0gSGVhZGVyKEhXKSwgQ291bnQ9WyVkXSIsIF9fRlVOQ1RJT05fXywgY291bnQpOwotLy8JZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBod19vZmZzZXQsIDApOwotCi0JcHJvZ3JhbV9pbmZvX2xlbmd0aCA9ICAoKHByb2dyYW1faW5mb19sZW5ndGggfCAocF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCAtIDFdICYgMHgwZikpIDw8IDgpIHwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07Ci0JZHByaW50aygiJXM6IFByb2dyYW0gaW5mbyBsZW5ndGg9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIHByb2dyYW1faW5mb19sZW5ndGgpOwotCWlmIChwcm9ncmFtX2luZm9fbGVuZ3RoKSB7Ci0JCWNvdW50ID0gY29weV9zdHJpbmcoaHdfYnVmZmVyLT5tc2csIHBfY2FfbWVzc2FnZS0+bXNnLCBod19vZmZzZXQsIChidWZfb2Zmc2V0ICsgMSksIChwcm9ncmFtX2luZm9fbGVuZ3RoICsgMSkgKTsgLy8gY29weSBuZXh0IGVsZW0sIG5vdCBjdXJyZW50Ci0JCWJ1Zl9vZmZzZXQgKz0gY291bnQsIGh3X29mZnNldCArPSBjb3VudDsKLS8vCQlkcHJpbnRrKCIlczogUHJvZ3JhbSBsZXZlbCAiLCBfX0ZVTkNUSU9OX18pOwotLy8JCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgaHdfb2Zmc2V0LCAwKTsKLQl9Ci0KLQlidWZfb2Zmc2V0ICs9IDE7Ly8gaHdfb2Zmc2V0ICs9IDE7Ci0JZm9yIChpID0gYnVmX29mZnNldDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0vLwkJZHByaW50aygiJXM6IFN0cmVhbSBIZWFkZXIgIiwgX19GVU5DVElPTl9fKTsKLQkJY291bnQgPSBjb3B5X3N0cmluZyhod19idWZmZXItPm1zZywgcF9jYV9tZXNzYWdlLT5tc2csIGh3X29mZnNldCwgYnVmX29mZnNldCwgNSk7Ci0JCW1vZGlmeV80X2JpdHMoaHdfYnVmZmVyLT5tc2csIChod19vZmZzZXQgKyAzKSk7Ci0KLQkJaHdfb2Zmc2V0ICs9IDUsIGJ1Zl9vZmZzZXQgKz0gNSwgaSArPSA0OwotLy8JCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgaHdfb2Zmc2V0LCAoaHdfb2Zmc2V0IC0gNSkpOwotCQllc19pbmZvX2xlbmd0aCA9ICgoZXNfaW5mb19sZW5ndGggfCAocF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCAtIDFdICYgMHgwZikpIDw8IDgpIHwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldF07Ci0JCWRwcmludGsoIiVzOiBFUyBpbmZvIGxlbmd0aD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgZXNfaW5mb19sZW5ndGgpOwotCQlpZiAoZXNfaW5mb19sZW5ndGgpIHsKLQkJCS8vIGNvcHkgZGVzY3JpcHRvcnMgQCBTVFJFQU0gbGV2ZWwKLQkJCWRwcmludGsoIiVzOiBEZXNjcmlwdG9ycyBAIFNUUkVBTSBsZXZlbC4uLiEhISBcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCX0KLQotCX0KLQlod19idWZmZXItPm1zZ1tsZW5ndGggKyBkc3RfdGFnX2xlbmd0aF0gPSBkc3RfY2hlY2tfc3VtKGh3X2J1ZmZlci0+bXNnLCAobGVuZ3RoICsgZHN0X3RhZ19sZW5ndGgpKTsKLS8vCWRwcmludGsoIiVzOiBUb3RhbCBsZW5ndGg9WyVkXSwgQ2hlY2tzdW09WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIChsZW5ndGggKyBkc3RfdGFnX2xlbmd0aCksIGh3X2J1ZmZlci0+bXNnW2xlbmd0aCArIGRzdF90YWdfbGVuZ3RoXSk7Ci0JZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCAobGVuZ3RoICsgZHN0X3RhZ19sZW5ndGggKyAxKSwgMCk7CS8vIGRzdCB0YWdzIGFsc28KLQl3cml0ZV90b184ODIwKHN0YXRlLCBod19idWZmZXIsIChsZW5ndGggKyBkc3RfdGFnX2xlbmd0aCArIDEpLCByZXBseSk7CS8vIGNoZWNrc3VtCisJZGVidWdfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCAobGVuZ3RoICsgdGFnX2xlbmd0aCksIDApOyAvKgl0YWdzIHRvbwkqLworCXdyaXRlX3RvXzg4MjAoc3RhdGUsIGh3X2J1ZmZlciwgKGxlbmd0aCArIHRhZ19sZW5ndGgpLCByZXBseSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3MSwyNiArMzc1LDI0IEBACiAJLyoJRG8gdGVzdCBib2FyZAkJCSovCiAJLyoJTm90IHRoZXJlIHlldCBidXQgc29vbgkJKi8KIAotCiAJLyoJQ0EgUE1UIFJlcGx5IGNhcGFibGUJCSovCiAJaWYgKGNhX3BtdF9yZXBseV90ZXN0KSB7CiAJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDEsIEdFVF9SRVBMWSkpIDwgMCkgewotCQkJZHByaW50aygiJXM6IGNhX3NldF9wbXQuLiBmYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIGNhX3NldF9wbXQuLiBmYWlsZWQgISIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKIAkvKglQcm9jZXNzIENBIFBNVCBSZXBseQkJKi8KIAkvKgl3aWxsIGltcGxlbWVudCBzb29uCQkqLwotCQlkcHJpbnRrKCIlczogTm90IHRoZXJlIHlldFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgTm90IHRoZXJlIHlldCIpOwogCX0KIAkvKglDQSBQTVQgUmVwbHkgbm90IGNhcGFibGUJKi8KIAlpZiAoIWNhX3BtdF9yZXBseV90ZXN0KSB7CiAJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIE5PX1JFUExZKSkgPCAwKSB7Ci0JCQlkcHJpbnRrKCIlczogY2Ffc2V0X3BtdC4uIGZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgY2Ffc2V0X3BtdC4uIGZhaWxlZCAhIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJZHByaW50aygiJXM6IGNhX3NldF9wbXQuLiBzdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiBjYV9zZXRfcG10Li4gc3VjY2VzcyAhIik7CiAJLyoJcHV0IGEgZHVtbXkgbWVzc2FnZQkJKi8KIAogCX0KQEAgLTUwNiwxMSArNDA4LDEwIEBACiAJc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyOwogCiAJaWYgKChod19idWZmZXIgPSAoc3RydWN0IGNhX21zZyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX21zZyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlpZiAodmVyYm9zZSA+IDMpCi0JCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiICIpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKHBfY2FfbWVzc2FnZSwgKHZvaWQgKilhcmcsIHNpemVvZiAoc3RydWN0IGNhX21zZykpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTUyNSw1MSArNDI2LDM1IEBACiAJCQlpZiAoaSA8IDIpCiAJCQkJY29tbWFuZCA9IGNvbW1hbmQgPDwgODsKIAkJfQotCQlpZiAodmVyYm9zZSA+IDMpCi0JCQlkcHJpbnRrKCIlczpDb21tYW5kPVsweCV4XVxuIiwgX19GVU5DVElPTl9fLCBjb21tYW5kKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgQ29tbWFuZD1bMHgleF1cbiIsIGNvbW1hbmQpOwogCiAJCXN3aXRjaCAoY29tbWFuZCkgewotCQkJY2FzZSBDQV9QTVQ6Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotLy8JCQkJCWRwcmludGsoIkNvbW1hbmQgPSBTRU5EX0NBX1BNVFxuIik7Ci0JCQkJCWRwcmludGsoIkNvbW1hbmQgPSBTRU5EX0NBX1BNVFxuIik7Ci0vLwkJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7Ci0JCQkJaWYgKChjYV9zZXRfcG10KHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgMCwgMCkpIDwgMCkgewkvLyBjb2RlIHNpbXBsaWZpY2F0aW9uIHN0YXJ0ZWQKLQkJCQkJZHByaW50aygiJXM6IC0tPkNBX1BNVCBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpZiAodmVyYm9zZSA+IDMpCi0JCQkJCWRwcmludGsoIiVzOiAtLT5DQV9QTVQgU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOwotLy8JCQkJcmV0dmFsID0gZHVtbXlfc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIDApOworCQljYXNlIENBX1BNVDoKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiQ29tbWFuZCA9IFNFTkRfQ0FfUE1UIik7CisJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7CS8vIGNvZGUgc2ltcGxpZmljYXRpb24gc3RhcnRlZAorCQkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPkNBX1BNVCBGYWlsZWQgISIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfUE1UIFN1Y2Nlc3MgISIpOworCQkJYnJlYWs7CisJCWNhc2UgQ0FfUE1UX1JFUExZOgorCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIkNvbW1hbmQgPSBDQV9QTVRfUkVQTFkiKTsKKwkJCS8qICAgICAgSGF2ZSB0byBoYW5kbGUgdGhlIDIgYmFzaWMgdHlwZXMgb2YgY2FyZHMgaGVyZSAgKi8KKwkJCWlmICgoZHN0X2NoZWNrX2NhX3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIpKSA8IDApIHsKKwkJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9QTVRfUkVQTFkgRmFpbGVkICEiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIC0tPkNBX1BNVF9SRVBMWSBTdWNjZXNzICEiKTsKKwkJCWJyZWFrOworCQljYXNlIENBX0FQUF9JTkZPX0VOUVVJUlk6CQkvLyBvbmx5IGZvciBkZWJ1Z2dpbmcKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgR2V0dGluZyBDYW0gQXBwbGljYXRpb24gaW5mb3JtYXRpb24iKTsKIAotCQkJCWJyZWFrOwotCi0JCQljYXNlIENBX1BNVF9SRVBMWToKLQkJCQlpZiAodmVyYm9zZSA+IDMpCi0JCQkJCWRwcmludGsoIkNvbW1hbmQgPSBDQV9QTVRfUkVQTFlcbiIpOwotCQkJCS8qICAgICAgSGF2ZSB0byBoYW5kbGUgdGhlIDIgYmFzaWMgdHlwZXMgb2YgY2FyZHMgaGVyZSAgKi8KLQkJCQlpZiAoKGRzdF9jaGVja19jYV9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyKSkgPCAwKSB7Ci0JCQkJCWRwcmludGsoIiVzOiAtLT5DQV9QTVRfUkVQTFkgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfUE1UX1JFUExZIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJCS8qICAgICAgQ2VydGFpbiBib2FyZHMgZG8gYmVoYXZlIGRpZmZlcmVudCA/ICAgICAgICAgICAgKi8KLS8vCQkJCXJldHZhbCA9IGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAxLCAxKTsKLQotCQkJY2FzZSBDQV9BUFBfSU5GT19FTlFVSVJZOgkJLy8gb25seSBmb3IgZGVidWdnaW5nCi0JCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlkcHJpbnRrKCIlczogR2V0dGluZyBDYW0gQXBwbGljYXRpb24gaW5mb3JtYXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCQlpZiAoKGNhX2dldF9hcHBfaW5mbyhzdGF0ZSkpIDwgMCkgewotCQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpZiAodmVyYm9zZSA+IDMpCi0JCQkJCWRwcmludGsoIiVzOiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJCWJyZWFrOworCQkJaWYgKChjYV9nZXRfYXBwX2luZm8oc3RhdGUpKSA8IDApIHsKKwkJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIEZhaWxlZCAhIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgISIpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC01ODQsMTIxICs0NjksODggQEAKIAlzdHJ1Y3QgY2FfbXNnICpwX2NhX21lc3NhZ2U7CiAKIAlpZiAoKHBfY2FfbWVzc2FnZSA9IChzdHJ1Y3QgY2FfbXNnICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZHByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCiAJaWYgKChwX2NhX3Nsb3RfaW5mbyA9IChzdHJ1Y3QgY2Ffc2xvdF9pbmZvICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZHByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCiAJaWYgKChwX2NhX2NhcHMgPSAoc3RydWN0IGNhX2NhcHMgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9jYXBzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZHByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCiAJLyoJV2UgaGF2ZSBub3cgb25seSB0aGUgc3RhbmRhcmQgaW9jdGwncywgdGhlIGRyaXZlciBpcyB1cHBvc2VkIHRvIGhhbmRsZSBpbnRlcm5hbHMuCSovCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBDQV9TRU5EX01TRzoKLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogU2VuZGluZyBtZXNzYWdlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKChjYV9zZW5kX21lc3NhZ2Uoc3RhdGUsIHBfY2FfbWVzc2FnZSwgYXJnKSkgPCAwKSB7Ci0JCQkJZHByaW50aygiJXM6IC0tPkNBX1NFTkRfTVNHIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQV9HRVRfTVNHOgotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiBHZXR0aW5nIG1lc3NhZ2VcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoKGNhX2dldF9tZXNzYWdlKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGFyZykpIDwgMCkgewotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfTVNHIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX01TRyBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FfUkVTRVQ6Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IFJlc2V0dGluZyBEU1RcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlkc3RfZXJyb3JfYmFpbG91dChzdGF0ZSk7Ci0JCQltc2xlZXAoNDAwMCk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FfR0VUX1NMT1RfSU5GTzoKLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogR2V0dGluZyBTbG90IGluZm9cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoKGNhX2dldF9zbG90X2luZm8oc3RhdGUsIHBfY2Ffc2xvdF9pbmZvLCBhcmcpKSA8IDApIHsKLQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX1NMT1RfSU5GTyBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9TTE9UX0lORk8gU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCQlicmVhazsKLQotCQljYXNlIENBX0dFVF9DQVA6Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IEdldHRpbmcgU2xvdCBjYXBhYmlsaXRpZXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoKGNhX2dldF9zbG90X2NhcHMoc3RhdGUsIHBfY2FfY2FwcywgYXJnKSkgPCAwKSB7Ci0JCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9DQVAgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9HRVRfQ0FQIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQV9HRVRfREVTQ1JfSU5GTzoKLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogR2V0dGluZyBkZXNjcmFtYmxlciBkZXNjcmlwdGlvblxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWlmICgoY2FfZ2V0X3Nsb3RfZGVzY3Ioc3RhdGUsIHBfY2FfbWVzc2FnZSwgYXJnKSkgPCAwKSB7Ci0JCQkJZHByaW50aygiJXM6IC0tPkNBX0dFVF9ERVNDUl9JTkZPIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfR0VUX0RFU0NSX0lORk8gU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCQlicmVhazsKLQotCQljYXNlIENBX1NFVF9ERVNDUjoKLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogU2V0dGluZyBkZXNjcmFtYmxlclxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWlmICgoY2Ffc2V0X3Nsb3RfZGVzY3IoKSkgPCAwKSB7Ci0JCQkJZHByaW50aygiJXM6IC0tPkNBX1NFVF9ERVNDUiBGYWlsZWQgIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAodmVyYm9zZSA+IDEpCi0JCQkJZHByaW50aygiJXM6IC0tPkNBX1NFVF9ERVNDUiBTdWNjZXNzICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FfU0VUX1BJRDoKLQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQlkcHJpbnRrKCIlczogU2V0dGluZyBQSURcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoKGNhX3NldF9waWQoKSkgPCAwKSB7Ci0JCQkJZHByaW50aygiJXM6IC0tPkNBX1NFVF9QSUQgRmFpbGVkICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCWRwcmludGsoIiVzOiAtLT5DQV9TRVRfUElEIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQl9OworCWNhc2UgQ0FfU0VORF9NU0c6CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgU2VuZGluZyBtZXNzYWdlIik7CisJCWlmICgoY2Ffc2VuZF9tZXNzYWdlKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGFyZykpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfU0VORF9NU0cgRmFpbGVkICEiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVhazsKKwljYXNlIENBX0dFVF9NU0c6CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgR2V0dGluZyBtZXNzYWdlIik7CisJCWlmICgoY2FfZ2V0X21lc3NhZ2Uoc3RhdGUsIHBfY2FfbWVzc2FnZSwgYXJnKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9HRVRfTVNHIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9HRVRfTVNHIFN1Y2Nlc3MgISIpOworCQlicmVhazsKKwljYXNlIENBX1JFU0VUOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiBSZXNldHRpbmcgRFNUIik7CisJCWRzdF9lcnJvcl9iYWlsb3V0KHN0YXRlKTsKKwkJbXNsZWVwKDQwMDApOworCQlicmVhazsKKwljYXNlIENBX0dFVF9TTE9UX0lORk86CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgR2V0dGluZyBTbG90IGluZm8iKTsKKwkJaWYgKChjYV9nZXRfc2xvdF9pbmZvKHN0YXRlLCBwX2NhX3Nsb3RfaW5mbywgYXJnKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9HRVRfU0xPVF9JTkZPIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9HRVRfU0xPVF9JTkZPIFN1Y2Nlc3MgISIpOworCQlicmVhazsKKwljYXNlIENBX0dFVF9DQVA6CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgR2V0dGluZyBTbG90IGNhcGFiaWxpdGllcyIpOworCQlpZiAoKGNhX2dldF9zbG90X2NhcHMoc3RhdGUsIHBfY2FfY2FwcywgYXJnKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9HRVRfQ0FQIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9HRVRfQ0FQIFN1Y2Nlc3MgISIpOworCQlicmVhazsKKwljYXNlIENBX0dFVF9ERVNDUl9JTkZPOgorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIEdldHRpbmcgZGVzY3JhbWJsZXIgZGVzY3JpcHRpb24iKTsKKwkJaWYgKChjYV9nZXRfc2xvdF9kZXNjcihzdGF0ZSwgcF9jYV9tZXNzYWdlLCBhcmcpKSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPkNBX0dFVF9ERVNDUl9JTkZPIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9HRVRfREVTQ1JfSU5GTyBTdWNjZXNzICEiKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9TRVRfREVTQ1I6CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgU2V0dGluZyBkZXNjcmFtYmxlciIpOworCQlpZiAoKGNhX3NldF9zbG90X2Rlc2NyKCkpIDwgMCkgeworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfU0VUX0RFU0NSIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9TRVRfREVTQ1IgU3VjY2VzcyAhIik7CisJCWJyZWFrOworCWNhc2UgQ0FfU0VUX1BJRDoKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBTZXR0aW5nIFBJRCIpOworCQlpZiAoKGNhX3NldF9waWQoKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9FUlJPUiwgMSwgIiAtLT5DQV9TRVRfUElEIEZhaWxlZCAhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiAtLT5DQV9TRVRfUElEIFN1Y2Nlc3MgISIpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9OwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHN0X2NhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczpEZXZpY2Ugb3BlbmVkIFslcF1cbiIsIF9fRlVOQ1RJT05fXywgZmlsZSk7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfREVCVUcsIDEsICIgRGV2aWNlIG9wZW5lZCBbJXBdICIsIGZpbGUpOwogCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAogCXJldHVybiAwOwpAQCAtNzA2LDI3ICs1NTgsMjQgQEAKIAogc3RhdGljIGludCBkc3RfY2FfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIiVzOkRldmljZSBjbG9zZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIERldmljZSBjbG9zZWQuIik7CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc3RfY2FfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqIG9mZnNldCkKK3N0YXRpYyBpbnQgZHN0X2NhX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqb2Zmc2V0KQogewogCWludCBieXRlc19yZWFkID0gMDsKIAotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiJXM6RGV2aWNlIHJlYWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIERldmljZSByZWFkLiIpOwogCiAJcmV0dXJuIGJ5dGVzX3JlYWQ7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X2NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICogb2Zmc2V0KQorc3RhdGljIGludCBkc3RfY2Ffd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqb2Zmc2V0KQogewotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiJXM6RGV2aWNlIHdyaXRlLlxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9ERUJVRywgMSwgIiBEZXZpY2Ugd3JpdGUuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc1MSw4ICs2MDAsNyBAQAogaW50IGRzdF9jYV9hdHRhY2goc3RydWN0IGRzdF9zdGF0ZSAqZHN0LCBzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyKQogewogCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczpyZWdpc3RlcmluZyBEU1QtQ0EgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAicmVnaXN0ZXJpbmcgRFNULUNBIGRldmljZSIpOwogCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoZHZiX2FkYXB0ZXIsICZkdmJkZXYsICZkdmJkZXZfY2EsIGRzdCwgRFZCX0RFVklDRV9DQSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKaW5kZXggZWY1MzJhNi4uMzI4MWE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaApAQCAtNjEsNyArNjEsNiBAQAogI2RlZmluZQlEU1RfVFlQRV9IQVNfQU5BTE9HCTY0CS8qCUFuYWxvZyBpbnB1dHMJKi8KICNkZWZpbmUgRFNUX1RZUEVfSEFTX1NFU1NJT04JMTI4CiAKLQogI2RlZmluZSBSRENfODgyMF9QSU9fMF9ESVNBQkxFCTAKICNkZWZpbmUgUkRDXzg4MjBfUElPXzBfRU5BQkxFCTEKICNkZWZpbmUgUkRDXzg4MjBfSU5UCQkyCkBAIC0xMTQsNiArMTEzLDEwIEBACiAJZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZDsKIAlmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsKIAl1OCBtZXNzYWdlc1syNTZdOworCXU4IG1hY19hZGRyZXNzWzhdOworCXU4IGZ3X3ZlcnNpb25bOF07CisJdTggY2FyZF9pbmZvWzhdOworCXU4IHZlbmRvcls4XTsKIH07CiAKIHN0cnVjdCBkc3RfdHlwZXMgewpAQCAtMTI0LDE1ICsxMjcsMTIgQEAKIAl1MzIgZHN0X2ZlYXR1cmU7CiB9OwogCi0KLQogc3RydWN0IGRzdF9jb25maWcKIHsKIAkvKiB0aGUgQVNJQyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiB9OwogCi0KIGludCByZGNfcmVzZXRfc3RhdGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpOwogaW50IHJkY184ODIwX3Jlc2V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwppbmRleCA2Zjg1N2M2Li5jNWM3NjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwpAQCAtMzIsOSArMzIsNyBAQAogI2luY2x1ZGUgImR2YmRldi5oIgogI2luY2x1ZGUgImR2Yl9kZW11eC5oIgogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotCiAjaW5jbHVkZSAiZHZiLWJ0OHh4LmgiCi0KICNpbmNsdWRlICJidDg3OC5oIgogCiBzdGF0aWMgaW50IGRlYnVnOwpAQCAtNDMsOSArNDEsMTEgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKIAogI2RlZmluZSBkcHJpbnRrKCBhcmdzLi4uICkgXAotCWRvIHsgXAorCWRvIFwKIAkJaWYgKGRlYnVnKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgXAotCX0gd2hpbGUgKDApCisJd2hpbGUgKDApCisKKyNkZWZpbmUgSUZfRlJFUVVFTkNZeDYgMjE3ICAgIC8qIDYgKiAzNi4xNjY2NjY2NjY2N01IeiAqLwogCiBzdGF0aWMgdm9pZCBkdmJfYnQ4eHhfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CkBAIC0xMTksMTQgKzExOSwxMiBAQAogCXVuc2lnbmVkIGludCBjYXJkX25yOwogCiAJLyogSG1tLCBuIHNxdWFyZWQuIEhvcGUgbiBpcyBzbWFsbCAqLwotCWZvciAoY2FyZF9uciA9IDA7IGNhcmRfbnIgPCBidDg3OF9udW07IGNhcmRfbnIrKykgeworCWZvciAoY2FyZF9uciA9IDA7IGNhcmRfbnIgPCBidDg3OF9udW07IGNhcmRfbnIrKykKIAkJaWYgKGlzX3BjaV9zbG90X2VxKGJ0ODc4W2NhcmRfbnJdLmRldiwgYnR0dl9wY2lfZGV2KSkKIAkJCXJldHVybiAmYnQ4NzhbY2FyZF9ucl07Ci0JfQogCXJldHVybiBOVUxMOwogfQogCi0KIHN0YXRpYyBpbnQgdGhvbXNvbl9kdHQ3NTc5X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RhdGljIHU4IG10MzUyX2Nsb2NrX2NvbmZpZyBbXSA9IHsgMHg4OSwgMHgzOCwgMHgzOCB9OwpAQCAtMTU0LDE2ICsxNTIsMjEgQEAKIAl1bnNpZ25lZCBjaGFyIGJzID0gMDsKIAl1bnNpZ25lZCBjaGFyIGNwID0gMDsKIAotCSNkZWZpbmUgSUZfRlJFUVVFTkNZeDYgMjE3ICAgIC8qIDYgKiAzNi4xNjY2NjY2NjY2N01IeiAqLwogCWRpdiA9ICgoKHBhcmFtcy0+ZnJlcXVlbmN5ICsgODMzMzMpICogMykgLyA1MDAwMDApICsgSUZfRlJFUVVFTkNZeDY7CiAKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA1NDIwMDAwMDApIGNwID0gMHhiNDsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDc3MTAwMDAwMCkgY3AgPSAweGJjOwotCWVsc2UgY3AgPSAweGY0OworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDU0MjAwMDAwMCkKKwkJY3AgPSAweGI0OworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNzcxMDAwMDAwKQorCQljcCA9IDB4YmM7CisJZWxzZQorCQljcCA9IDB4ZjQ7CiAKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPT0gMCkgYnMgPSAweDAzOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDQzMjUwMDAwKSBicyA9IDB4MDI7Ci0JZWxzZSBicyA9IDB4MDg7CisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID09IDApCisJCWJzID0gMHgwMzsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ0MzI1MDAwMCkKKwkJYnMgPSAweDAyOworCWVsc2UKKwkJYnMgPSAweDA4OwogCiAJcGxsYnVmWzBdID0gMHhjMDsgLy8gTm90ZTogbm9uLWxpbnV4IHN0YW5kYXJkIFBMTCBpMmMgYWRkcmVzcwogCXBsbGJ1ZlsxXSA9IGRpdiA+PiA4OwpAQCAtMTc1LDcgKzE3OCw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHRob21zb25fZHR0NzU3OV9jb25maWcgPSB7Ci0KIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCiAJLmRlbW9kX2luaXQgPSB0aG9tc29uX2R0dDc1NzlfZGVtb2RfaW5pdCwKIAkucGxsX3NldCA9IHRob21zb25fZHR0NzU3OV9wbGxfc2V0LApAQCAtMTgzLDI1ICsxODUsMjYgQEAKIAogc3RhdGljIGludCBjeDI0MTA4X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewotICAgdTMyIGZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKKwl1MzIgZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5OwogCi0gICBpbnQgaSwgYSwgbiwgcHVtcDsKLSAgIHUzMiBiYW5kLCBwbGw7CisJaW50IGksIGEsIG4sIHB1bXA7CisJdTMyIGJhbmQsIHBsbDsKIAorCXUzMiBvc2NpW109ezk1MDAwMCwxMDE5MDAwLDEwNzUwMDAsMTE3ODAwMCwxMjk2MDAwLDE0MzIwMDAsCisJCTE1NzYwMDAsMTcxODAwMCwxODU2MDAwLDIwMzYwMDAsMjE1MDAwMH07CisJdTMyIGJhbmRzZWxbXT17MCwweDAwMDIwMDAwLDB4MDAwNDAwMDAsMHgwMDEwMDgwMCwweDAwMTAxMDAwLAorCQkweDAwMTAyMDAwLDB4MDAxMDQwMDAsMHgwMDEwODAwMCwweDAwMTEwMDAwLAorCQkweDAwMTIwMDAwLDB4MDAxNDAwMDB9OwogCi0gICB1MzIgb3NjaVtdPXs5NTAwMDAsMTAxOTAwMCwxMDc1MDAwLDExNzgwMDAsMTI5NjAwMCwxNDMyMDAwLAotCSAgICAgICAxNTc2MDAwLDE3MTgwMDAsMTg1NjAwMCwyMDM2MDAwLDIxNTAwMDB9OwotICAgdTMyIGJhbmRzZWxbXT17MCwweDAwMDIwMDAwLDB4MDAwNDAwMDAsMHgwMDEwMDgwMCwweDAwMTAxMDAwLAotCSAgICAgICAweDAwMTAyMDAwLDB4MDAxMDQwMDAsMHgwMDEwODAwMCwweDAwMTEwMDAwLAotCSAgICAgICAweDAwMTIwMDAwLDB4MDAxNDAwMDB9OwotCi0jZGVmaW5lIFhUQUwgMTAxMTEwMCAvKiBIeiwgcmVhbGx5IDEuMDExMSBNSHogYW5kIGEgLzEwIHByZXNjYWxlciAqLworCSNkZWZpbmUgWFRBTCAxMDExMTAwIC8qIEh6LCByZWFsbHkgMS4wMTExIE1IeiBhbmQgYSAvMTAgcHJlc2NhbGVyICovCiAJcHJpbnRrKCJjeDI0MTA4IGRlYnVnOiBlbnRlcmluZyBTZXRUdW5lckZyZXEsIGZyZXE9JWRcbiIsZnJlcSk7CiAKIAkvKiBUaGlzIGlzIHJlYWxseSB0aGUgYml0IGRyaXZpbmcgdGhlIHR1bmVyIGNoaXAgY3gyNDEwOCAqLwogCi0JaWYoZnJlcTw5NTAwMDApIGZyZXE9OTUwMDAwOyAvKiBrSHogKi8KLQlpZihmcmVxPjIxNTAwMDApIGZyZXE9MjE1MDAwMDsgLyogc2F0ZWxsaXRlIElGIGlzIDk1MC4uMjE1ME1IeiAqLworCWlmIChmcmVxPDk1MDAwMCkKKwkJZnJlcSA9IDk1MDAwMDsgLyoga0h6ICovCisJZWxzZSBpZiAoZnJlcT4yMTUwMDAwKQorCQlmcmVxID0gMjE1MDAwMDsgLyogc2F0ZWxsaXRlIElGIGlzIDk1MC4uMjE1ME1IeiAqLwogCiAJLyogZGVjaWRlIHdoaWNoIFZDTyB0byB1c2UgZm9yIHRoZSBpbnB1dCBmcmVxdWVuY3kgKi8KIAlmb3IoaT0xOyhpPHNpemVvZihvc2NpKS9zaXplb2Yob3NjaVswXSkpJiYob3NjaVtpXTxmcmVxKTtpKyspOwpAQCAtMjI4LDI1ICsyMzEsMjIgQEAKIAljeDI0MTEwX3BsbF93cml0ZShmZSwweDUwMGMwMDAwKTsKIAljeDI0MTEwX3BsbF93cml0ZShmZSwweDgzZjFmODAwKTsKIAljeDI0MTEwX3BsbF93cml0ZShmZSxwbGwpOwotLyogICAgICAgIHdyaXRlcmVnKGNsaWVudCwweDU2LDB4N2YpOyovCisJLy93cml0ZXJlZyhjbGllbnQsMHg1NiwweDdmKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBpbm5zYXRfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7Ci0gICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGN4MjQxMTBfY29uZmlnIHBjdHZzYXRfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDU1LAogCS5wbGxfaW5pdCA9IHBpbm5zYXRfcGxsX2luaXQsCiAJLnBsbF9zZXQgPSBjeDI0MTA4X3BsbF9zZXQsCiB9OwogCi0KIHN0YXRpYyBpbnQgbWljcm90dW5lX210NzIwMmR0Zl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7CkBAIC0yNTgsMTUgKzI1OCwyMyBAQAogCWRpdiA9ICgzNjAwMDAwMCArIHBhcmFtcy0+ZnJlcXVlbmN5ICsgODMzMzMpIC8gMTY2NjY2OwogCWNmZyA9IDB4ODg7CiAKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzUwMDAwMDApIGNwdW1wID0gMjsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDM5MDAwMDAwMCkgY3B1bXAgPSAxOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKSBjcHVtcCA9IDI7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3NTAwMDAwMDApIGNwdW1wID0gMjsKLQllbHNlIGNwdW1wID0gMzsKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzUwMDAwMDApCisJCWNwdW1wID0gMjsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDM5MDAwMDAwMCkKKwkJY3B1bXAgPSAxOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKQorCQljcHVtcCA9IDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3NTAwMDAwMDApCisJCWNwdW1wID0gMjsKKwllbHNlCisJCWNwdW1wID0gMzsKIAotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3NTAwMDAwMCkgYmFuZF9zZWxlY3QgPSAweDBlOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKSBiYW5kX3NlbGVjdCA9IDB4MDU7Ci0JZWxzZSBiYW5kX3NlbGVjdCA9IDB4MDM7CisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTc1MDAwMDAwKQorCQliYW5kX3NlbGVjdCA9IDB4MGU7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDApCisJCWJhbmRfc2VsZWN0ID0gMHgwNTsKKwllbHNlCisJCWJhbmRfc2VsZWN0ID0gMHgwMzsKIAogCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKIAlkYXRhWzFdID0gZGl2ICYgMHhmZjsKQEAgLTI4NSwxNCArMjkzLDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3A4ODd4X2NvbmZpZyBtaWNyb3R1bmVfbXQ3MjAyZHRmX2NvbmZpZyA9IHsKLQogCS5kZW1vZF9hZGRyZXNzID0gMHg3MCwKIAkucGxsX3NldCA9IG1pY3JvdHVuZV9tdDcyMDJkdGZfcGxsX3NldCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IG1pY3JvdHVuZV9tdDcyMDJkdGZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKLQotCiBzdGF0aWMgaW50IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdGF0aWMgdTggbXQzNTJfY2xvY2tfY29uZmlnIFtdID0geyAweDg5LCAweDM4LCAweDJkIH07CkBAIC0zMDMsNyArMzA4LDYgQEAKIAlzdGF0aWMgdTggbXQzNTJfYXY3NzFfZXh0cmFbXSA9IHsgMHhCNSwgMHg3QSB9OwogCXN0YXRpYyB1OCBtdDM1Ml9jYXB0X3JhbmdlX2NmZ1tdID0geyAweDc1LCAweDMyIH07CiAKLQogCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9jbG9ja19jb25maWcsIHNpemVvZihtdDM1Ml9jbG9ja19jb25maWcpKTsKIAl1ZGVsYXkoMjAwMCk7CiAJbXQzNTJfd3JpdGUoZmUsIG10MzUyX3Jlc2V0LCBzaXplb2YobXQzNTJfcmVzZXQpKTsKQEAgLTMyMywyOCArMzI3LDQ1IEBACiAJdW5zaWduZWQgY2hhciBicyA9IDA7CiAJdW5zaWduZWQgY2hhciBjcCA9IDA7CiAKLQkjZGVmaW5lIElGX0ZSRVFVRU5DWXg2IDIxNyAgICAvKiA2ICogMzYuMTY2NjY2NjY2NjdNSHogKi8KIAlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwogCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwKSBjcCA9IDB4QjQ7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzMwMDAwMDApIGNwID0gMHhCQzsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDI1MDAwMDAwMCkgY3AgPSAweEI0OwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDAwMDAwMDAwKSBjcCA9IDB4QkM7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MjAwMDAwMDApIGNwID0gMHhGNDsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkgY3AgPSAweEZDOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNjAwMDAwMDAwKSBjcCA9IDB4QkM7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3MzAwMDAwMDApIGNwID0gMHhGNDsKLQllbHNlIGNwID0gMHhGQzsKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwMDApCisJCWNwID0gMHhCNDsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3MzAwMDAwMCkKKwkJY3AgPSAweEJDOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMjUwMDAwMDAwKQorCQljcCA9IDB4QjQ7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MDAwMDAwMDApCisJCWNwID0gMHhCQzsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQyMDAwMDAwMCkKKwkJY3AgPSAweEY0OworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKQorCQljcCA9IDB4RkM7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA2MDAwMDAwMDApCisJCWNwID0gMHhCQzsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDczMDAwMDAwMCkKKwkJY3AgPSAweEY0OworCWVsc2UKKwkJY3AgPSAweEZDOwogCi0JaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwKSBicyA9IDB4MDE7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzMwMDAwMDApIGJzID0gMHgwMTsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDI1MDAwMDAwMCkgYnMgPSAweDAyOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDAwMDAwMDAwKSBicyA9IDB4MDI7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MjAwMDAwMDApIGJzID0gMHgwMjsKLQllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCkgYnMgPSAweDAyOwotCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNjAwMDAwMDAwKSBicyA9IDB4MDg7Ci0JZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA3MzAwMDAwMDApIGJzID0gMHgwODsKLQllbHNlIGJzID0gMHgwODsKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwMDApCisJCWJzID0gMHgwMTsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3MzAwMDAwMCkKKwkJYnMgPSAweDAxOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMjUwMDAwMDAwKQorCQlicyA9IDB4MDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MDAwMDAwMDApCisJCWJzID0gMHgwMjsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQyMDAwMDAwMCkKKwkJYnMgPSAweDAyOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDcwMDAwMDAwKQorCQlicyA9IDB4MDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA2MDAwMDAwMDApCisJCWJzID0gMHgwODsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDczMDAwMDAwMCkKKwkJYnMgPSAweDA4OworCWVsc2UKKwkJYnMgPSAweDA4OwogCiAJcGxsYnVmWzBdID0gMHhjMjsgLy8gTm90ZTogbm9uLWxpbnV4IHN0YW5kYXJkIFBMTCBpMmMgYWRkcmVzcwogCXBsbGJ1ZlsxXSA9IGRpdiA+PiA4OwpAQCAtMzU2LDE5ICszNzcsMTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcgPSB7Ci0KIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCiAJLmRlbW9kX2luaXQgPSBhZHZidDc3MV9zYW1zdW5nX3RkdGM5MjUxZGgwX2RlbW9kX2luaXQsCiAJLnBsbF9zZXQgPSBhZHZidDc3MV9zYW1zdW5nX3RkdGM5MjUxZGgwX3BsbF9zZXQsCiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgZHN0X2NvbmZpZyBkc3RfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDU1LAogfTsKIAotCiBzdGF0aWMgaW50IG9yNTEyMTFfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkKiBidCA9IChzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQqKSBmZS0+ZHZiLT5wcml2OwpAQCAtMzk4LDEwICs0MTUsOCBAQAogCSAqLwogCS8qIHJlc2V0ICYgUFJNMSwyJjQgYXJlIG91dHB1dHMgKi8KIAlpbnQgcmV0ID0gYnR0dl9ncGlvX2VuYWJsZShidC0+YnR0dl9uciwgMHgwMDFGLCAweDAwMUYpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMjExOiBJbml0IEVycm9yIC0gQ2FuJ3QgUmVzZXQgRFZSICIKLQkJICAgICAgICIoJWkpXG4iLCByZXQpOwotCX0KKwlpZiAocmV0ICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTEyMTE6IEluaXQgRXJyb3IgLSBDYW4ndCBSZXNldCBEVlIgKCVpKVxuIiwgcmV0KTsKIAlidHR2X3dyaXRlX2dwaW8oYnQtPmJ0dHZfbnIsIDB4MDAxRiwgMHgwMDAwKTsgICAvKiBSZXNldCAqLwogCW1zbGVlcCgyMCk7CiAJLyogTm93IHNldCBmb3Igbm9ybWFsIG9wZXJhdGlvbiAqLwpAQCAtNDE3LDcgKzQzMiw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb3I1MTIxMV9jb25maWcgb3I1MTIxMV9jb25maWcgPSB7Ci0KIAkuZGVtb2RfYWRkcmVzcyA9IDB4MTUsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBvcjUxMjExX3JlcXVlc3RfZmlybXdhcmUsCiAJLnNldG1vZGUgPSBvcjUxMjExX3NldG1vZGUsCkBAIC00MjUsNyArNDM5LDYgQEAKIAkuc2xlZXAgPSBvcjUxMjExX3NsZWVwLAogfTsKIAotCiBzdGF0aWMgaW50IHZwMzAyMV9hbHBzX3RkZWQ0X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKikgZmUtPmR2Yi0+cHJpdjsKQEAgLTQ1NCwxMiArNDY3LDg0IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcgdnAzMDIxX2FscHNfdGRlZDRfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDBhLAogCS5jbG9ja19pbnZlcnNpb24gPSAxLAogCS5wbGxfc2V0ID0gdnAzMDIxX2FscHNfdGRlZDRfcGxsX3NldCwKIH07CiAKK3N0YXRpYyBpbnQgZGlnaXR2X2FscHNfdGRlZDRfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdGF0aWMgdTggbXQzNTJfY2xvY2tfY29uZmlnIFtdID0geyAweDg5LCAweDM4LCAweDJkIH07CisJc3RhdGljIHU4IG10MzUyX3Jlc2V0IFtdID0geyAweDUwLCAweDgwIH07CisJc3RhdGljIHU4IG10MzUyX2FkY19jdGxfMV9jZmcgW10gPSB7IDB4OEUsIDB4NDAgfTsKKwlzdGF0aWMgdTggbXQzNTJfYWdjX2NmZyBbXSA9IHsgMHg2NywgMHgyMCwgMHhhMCB9OworCXN0YXRpYyB1OCBtdDM1Ml9jYXB0X3JhbmdlX2NmZ1tdID0geyAweDc1LCAweDMyIH07CisKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2xvY2tfY29uZmlnLCBzaXplb2YobXQzNTJfY2xvY2tfY29uZmlnKSk7CisJdWRlbGF5KDIwMDApOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yZXNldCwgc2l6ZW9mKG10MzUyX3Jlc2V0KSk7CisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FkY19jdGxfMV9jZmcsIHNpemVvZihtdDM1Ml9hZGNfY3RsXzFfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FnY19jZmcsc2l6ZW9mKG10MzUyX2FnY19jZmcpKTsKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2FwdF9yYW5nZV9jZmcsIHNpemVvZihtdDM1Ml9jYXB0X3JhbmdlX2NmZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlnaXR2X2FscHNfdGRlZDRfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYpCit7CisJdTMyIGRpdjsKKwlzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyAqb3AgPSAmcGFyYW1zLT51Lm9mZG07CisKKwlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OworCisJcGxsYnVmWzBdID0gMHhjMjsKKwlwbGxidWZbMV0gPSAoZGl2ID4+IDgpICYgMHg3RjsKKwlwbGxidWZbMl0gPSBkaXYgJiAweEZGOworCXBsbGJ1ZlszXSA9IDB4ODU7CisKKwlkcHJpbnRrKCJmcmVxdWVuY3kgJXUsIGRpdiAldVxuIiwgcGFyYW1zLT5mcmVxdWVuY3ksIGRpdik7CisKKwlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDApCisJCXBsbGJ1Zls0XSA9IDB4MDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPiA4MjMwMDAwMDApCisJCXBsbGJ1Zls0XSA9IDB4ODg7CisJZWxzZQorCQlwbGxidWZbNF0gPSAweDA4OworCisJaWYgKG9wLT5iYW5kd2lkdGggPT0gOCkKKwkJcGxsYnVmWzRdIHw9IDB4MDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlnaXR2X2FscHNfdGRlZDRfcmVzZXQoc3RydWN0IGR2Yl9idDh4eF9jYXJkICpidCkKK3sKKwkvKgorCSAqIFJlc2V0IHRoZSBmcm9udGVuZCwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRyeWluZworCSAqIHRvIGluaXRpYWxpc2UgdGhlIE1UMzUyIG9yIG10MzUyX2F0dGFjaAorCSAqIHdpbGwgZmFpbC4KKwkgKgorCSAqIFByZXN1bWFibHkgbm90IHJlcXVpcmVkIGZvciB0aGUgTlhUNjAwMCBmcm9udGVuZC4KKwkgKgorCSAqLworCisJaW50IHJldCA9IGJ0dHZfZ3Bpb19lbmFibGUoYnQtPmJ0dHZfbnIsIDB4MDgsIDB4MDgpOworCWlmIChyZXQgIT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGlnaXR2X2FscHNfdGRlZDQ6IEluaXQgRXJyb3IgLSBDYW4ndCBSZXNldCBEVlIgKCVpKVxuIiwgcmV0KTsKKworCS8qIFB1bHNlIHRoZSByZXNldCBsaW5lICovCisJYnR0dl93cml0ZV9ncGlvKGJ0LT5idHR2X25yLCAweDA4LCAweDA4KTsgLyogSGlnaCAqLworCWJ0dHZfd3JpdGVfZ3BpbyhidC0+YnR0dl9uciwgMHgwOCwgMHgwMCk7IC8qIExvdyAgKi8KKwltc2xlZXAoMTAwKTsKKworCWJ0dHZfd3JpdGVfZ3BpbyhidC0+YnR0dl9uciwgMHgwOCwgMHgwOCk7IC8qIEhpZ2ggKi8KK30KKworc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZGlnaXR2X2FscHNfdGRlZDRfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKKwkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQsCisJLnBsbF9zZXQgPSBkaWdpdHZfYWxwc190ZGVkNF9wbGxfc2V0LAorfTsKIAogc3RhdGljIHZvaWQgZnJvbnRlbmRfaW5pdChzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQsIHUzMiB0eXBlKQogewpAQCAtNDczLDcgKzU1OCw2IEBACiAJCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7CiAJCQljYXJkLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4gPSAxNzQwMDAwMDA7CiAJCQljYXJkLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDA7Ci0JCQlicmVhazsKIAkJfQogCQlicmVhazsKICNlbmRpZgpAQCAtNDgzLDE3ICs1NjcsMjggQEAKICNlbHNlCiAJY2FzZSBCVFRWX05FQlVMQV9ESUdJVFY6CiAjZW5kaWYKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGZyb250ZW5kIHVzaW5nIHRoZSBJMkMgYnVzIChzZWUgdGhlIE5lYnVsYSBTREspOworCQkgKiB0aGlzIHdvdWxkIGJlIGEgY2xlYW5lciBzb2x1dGlvbiB0aGFuIHRyeWluZyBlYWNoIGZyb250ZW5kIGluIHR1cm4uCisJCSAqLworCisJCS8qIE9sZCBOZWJ1bGEgKG1hcmtlZCAoYykyMDAzIG9uIGhpZ2ggcHJvZmlsZSBwY2kgY2FyZCkgaGFzIG54dDYwMDAgZGVtb2QgKi8KIAkJY2FyZC0+ZmUgPSBueHQ2MDAwX2F0dGFjaCgmdnAzMDIxX2FscHNfdGRlZDRfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7CiAJCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7CisJCQlkcHJpbnRrICgiZHZiX2J0OHh4OiBhbiBueHQ2MDAwIHdhcyBkZXRlY3RlZCBvbiB5b3VyIGRpZ2l0diBjYXJkXG4iKTsKIAkJCWJyZWFrOwogCQl9CisKKwkJLyogTmV3IE5lYnVsYSAobWFya2VkIChjKTIwMDUgb24gbG93IHByb2ZpbGUgcGNpIGNhcmQpIGhhcyBtdDM1MiBkZW1vZCAqLworCQlkaWdpdHZfYWxwc190ZGVkNF9yZXNldChjYXJkKTsKKwkJY2FyZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmRpZ2l0dl9hbHBzX3RkZWQ0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOworCisJCWlmIChjYXJkLT5mZSAhPSBOVUxMKQorCQkJZHByaW50ayAoImR2Yl9idDh4eDogYW4gbXQzNTIgd2FzIGRldGVjdGVkIG9uIHlvdXIgZGlnaXR2IGNhcmRcbiIpOwogCQlicmVhazsKIAogCWNhc2UgQlRUVl9BVkRWQlRfNzYxOgogCQljYXJkLT5mZSA9IHNwODg3eF9hdHRhY2goJm1pY3JvdHVuZV9tdDcyMDJkdGZfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7Ci0JCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9BVkRWQlRfNzcxOgpAQCAtNTAxLDcgKzU5Niw2IEBACiAJCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7CiAJCQljYXJkLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4gPSAxNzQwMDAwMDA7CiAJCQljYXJkLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDA7Ci0JCQlicmVhazsKIAkJfQogCQlicmVhazsKIApAQCAtNTIyLDU0ICs2MTYsNDEgQEAKIAogCQkvKglBdHRhY2ggb3RoZXIgRFNUIHBlcmlwaGVyYWxzIGlmIGFueQkJKi8KIAkJLyoJQ29uZGl0aW9uYWwgQWNjZXNzIGRldmljZQkJCSovCi0JCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19DQSkgeworCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCiAJCQlyZXQgPSBkc3RfY2FfYXR0YWNoKHN0YXRlLCAmY2FyZC0+ZHZiX2FkYXB0ZXIpOwotCQl9Ci0JCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9QSU5OQUNMRVNBVDoKIAkJY2FyZC0+ZmUgPSBjeDI0MTEwX2F0dGFjaCgmcGN0dnNhdF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKLQkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKLQkJCWJyZWFrOwotCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCVFRWX1BDX0hEVFY6CiAJCWNhcmQtPmZlID0gb3I1MTIxMV9hdHRhY2goJm9yNTEyMTFfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7Ci0JCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQogCQlicmVhazsKIAl9CiAKLQlpZiAoY2FyZC0+ZmUgPT0gTlVMTCkgeworCWlmIChjYXJkLT5mZSA9PSBOVUxMKQogCQlwcmludGsoImR2Yi1idDh4eDogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCBmb3IgZGV2aWNlICUwNHgvJTA0eCBzdWJzeXN0ZW0gJTA0eC8lMDR4XG4iLAogCQkgICAgICAgY2FyZC0+YnQtPmRldi0+dmVuZG9yLAogCQkgICAgICAgY2FyZC0+YnQtPmRldi0+ZGV2aWNlLAogCQkgICAgICAgY2FyZC0+YnQtPmRldi0+c3Vic3lzdGVtX3ZlbmRvciwKIAkJICAgICAgIGNhcmQtPmJ0LT5kZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwotCX0gZWxzZSB7CisJZWxzZQogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZjYXJkLT5kdmJfYWRhcHRlciwgY2FyZC0+ZmUpKSB7CiAJCQlwcmludGsoImR2Yi1idDh4eDogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwogCQkJaWYgKGNhcmQtPmZlLT5vcHMtPnJlbGVhc2UpCiAJCQkJY2FyZC0+ZmUtPm9wcy0+cmVsZWFzZShjYXJkLT5mZSk7CiAJCQljYXJkLT5mZSA9IE5VTEw7CiAJCX0KLQl9CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGR2Yl9idDh4eF9sb2FkX2NhcmQoc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkLCB1MzIgdHlwZSkKIHsKIAlpbnQgcmVzdWx0OwogCi0JaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIsIGNhcmQtPmNhcmRfbmFtZSwKLQkJCQkJICAgVEhJU19NT0RVTEUpKSA8IDApIHsKKwlpZiAoKHJlc3VsdCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZjYXJkLT5kdmJfYWRhcHRlciwgY2FyZC0+Y2FyZF9uYW1lLCBUSElTX01PRFVMRSkpIDwgMCkgewogCQlwcmludGsoImR2Yl9idDh4eDogZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwgcmVzdWx0KTsKIAkJcmV0dXJuIHJlc3VsdDsKLQogCX0KIAljYXJkLT5kdmJfYWRhcHRlci5wcml2ID0gY2FyZDsKIApAQCAtNjY0LDggKzc0NSw3IEBACiAJc3RybmNweShjYXJkLT5jYXJkX25hbWUsIHN1Yi0+Y29yZS0+bmFtZSwgc2l6ZW9mKHN1Yi0+Y29yZS0+bmFtZSkpOwogCWNhcmQtPmkyY19hZGFwdGVyID0gJnN1Yi0+Y29yZS0+aTJjX2FkYXA7CiAKLQlzd2l0Y2goc3ViLT5jb3JlLT50eXBlKQotCXsKKwlzd2l0Y2goc3ViLT5jb3JlLT50eXBlKSB7CiAJY2FzZSBCVFRWX1BJTk5BQ0xFU0FUOgogCQljYXJkLT5ncGlvX21vZGUgPSAweDA0MDBjMDYwOwogCQkvKiBzaG91bGQgYmU6IEJUODc4X0FfR0FJTj0wLEJUODc4X0FfUFdSRE4sQlQ4NzhfREFfRFBNLEJUODc4X0RBX1NCUiwKQEAgLTc1MSw3ICs4MzEsNiBAQAogCiAJCWtmcmVlKGNhcmQpOwogCQlyZXR1cm4gLUVGQVVMVDsKLQogCX0KIAogCWluaXRfTVVURVgoJmNhcmQtPmJ0LT5ncGlvX2xvY2spOwpAQCAtNzc5LDcgKzg1OCw4IEBACiAJY2FyZC0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmY2FyZC0+ZGVtdXguZG14LCAmY2FyZC0+ZmVfaHcpOwogCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2FyZC0+ZG14ZGV2KTsKIAlkdmJfZG14X3JlbGVhc2UoJmNhcmQtPmRlbXV4KTsKLQlpZiAoY2FyZC0+ZmUpIGR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGNhcmQtPmZlKTsKKwlpZiAoY2FyZC0+ZmUpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGNhcmQtPmZlKTsKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjYXJkLT5kdmJfYWRhcHRlcik7CiAKIAlrZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKaW5kZXggMjkyM2IzYi4uOWVjOGU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKQEAgLTIsNyArMiw3IEBACiAgKiBCdDh4eCBiYXNlZCBEVkIgYWRhcHRlciBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBGbG9yaWFuIFNjaGlybWVyIDxqb2x0QHR1eGJveC5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQHQtb25saW5lLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEBodHAtdGVsLmRlPgogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgUmFscGggIE1ldHpsZXIgJiBNYXJjdXMgTWV0emxlciBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSBDaHJpc3RpYW4gVGhlaXNzIDxtaXN0ZXJ0QHJ6LmZoLWF1Z3NidXJnLmRlPgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKaW5kZXggMjI2NzE0MC4uN2NmNGM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKQEAgLTc3LDcgKzc3LDcgQEAKIGNvbmZpZyBEVkJfQ0lORVJHWVQyX1JDX1FVRVJZX0lOVEVSVkFMCiAJaW50ICJJbmZyYXJlZCBSZW1vdGUgQ29udHJvbGxlciB1cGRhdGUgaW50ZXJ2YWwgW21pbGxpc2Vjb25kc10iCiAJZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORyAmJiBEVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKLSAgICAgICAgZGVmYXVsdCAiMTAwIgorICAgICAgICBkZWZhdWx0ICI1MCIKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIHZlcnkgZmFzdC1yZXBlYXRpbmcgcmVtb3RlIGNvbnRyb2wgeW91IGNhbiB0cnkgbG93ZXIKIAkgIHZhbHVlcywgZm9yIG5vcm1hbCBjb25zdW1lciByZWNlaXZlcnMgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKaW5kZXggOWVhNTc0Ny4uNmRiMDkyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMzYsNyArMzUsNiBAQAogI2luY2x1ZGUgImR2Yl9kZW11eC5oIgogI2luY2x1ZGUgImR2Yl9uZXQuaCIKIAotCiAjaWZkZWYgQ09ORklHX0RWQl9DSU5FUkdZVDJfVFVOSU5HCiAJI2RlZmluZSBTVFJFQU1fVVJCX0NPVU5UIChDT05GSUdfRFZCX0NJTkVSR1lUMl9TVFJFQU1fVVJCX0NPVU5UKQogCSNkZWZpbmUgU1RSRUFNX0JVRl9TSVpFIChDT05GSUdfRFZCX0NJTkVSR1lUMl9TVFJFQU1fQlVGX1NJWkUpCkBAIC00OSw3ICs0Nyw3IEBACiAJI2RlZmluZSBTVFJFQU1fVVJCX0NPVU5UICgzMikKIAkjZGVmaW5lIFNUUkVBTV9CVUZfU0laRSAoNTEyKQkvKiBieXRlcyAqLwogCSNkZWZpbmUgRU5BQkxFX1JDICgxKQotCSNkZWZpbmUgUkNfUVVFUllfSU5URVJWQUwgKDEwMCkJLyogbWlsbGlzZWNvbmRzICovCisJI2RlZmluZSBSQ19RVUVSWV9JTlRFUlZBTCAoNTApCS8qIG1pbGxpc2Vjb25kcyAqLwogCSNkZWZpbmUgUVVFUllfSU5URVJWQUwgKDMzMykJLyogbWlsbGlzZWNvbmRzICovCiAjZW5kaWYKIApAQCAtMTQyLDYgKzE0MCw4IEBACiAJc3RydWN0IGlucHV0X2RldiByY19pbnB1dF9kZXY7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJjX3F1ZXJ5X3dvcms7CiAJaW50IHJjX2lucHV0X2V2ZW50OworCXUzMiByY19sYXN0X2NvZGU7CisJdW5zaWduZWQgbG9uZyBsYXN0X2V2ZW50X2ppZmZpZXM7CiAjZW5kaWYKIH07CiAKQEAgLTE1Niw3ICsxNTYsNyBAQAogCXVpbnQzMl90IHZhbHVlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotc3RhdGljIGNvbnN0IHVpbnQzMl90IHJjX2tleXMgW10gPSB7CitzdGF0aWMgY29uc3QgdWludDMyX3QgcmNfa2V5c1tdID0gewogCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZTAxZWIwNCwJS0VZX1BPV0VSLAogCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZDAyZWIwNCwJS0VZXzEsCiAJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZjMDNlYjA0LAlLRVlfMiwKQEAgLTY4NSw1MiArNjg1LDY4IEBACiAjaWZkZWYgRU5BQkxFX1JDCiBzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnlfcmMgKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gKHN0cnVjdCBjaW5lcmd5dDIgKikgZGF0YTsKLQljaGFyIGJ1ZiBbMV0gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUyB9OworCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGRhdGE7CisJY2hhciBidWZbMV0gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUyB9OwogCXN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgcmNfZXZlbnRzWzEyXTsKLQlpbnQgbiwgbGVuOworCWludCBuLCBsZW4sIGk7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCiAJCXJldHVybjsKIAogCWxlbiA9IGNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgKGNoYXIgKikgcmNfZXZlbnRzLCBzaXplb2YocmNfZXZlbnRzKSk7CisJCQkJKGNoYXIgKikgcmNfZXZlbnRzLCBzaXplb2YocmNfZXZlbnRzKSk7CisJaWYgKGxlbiA8IDApCisJCWdvdG8gb3V0OworCWlmIChsZW4gPT0gMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBjaW5lcmd5dDItPmxhc3RfZXZlbnRfamlmZmllcyArCisJCQkgICAgICAgbXNlY3NfdG9famlmZmllcygxNTApKSkgeworCQkJLyogc3RvcCBrZXkgcmVwZWF0ICovCisJCQlpZiAoY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCAhPSBLRVlfTUFYKSB7CisJCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWQgVXBcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOworCQkJCWlucHV0X3JlcG9ydF9rZXkoJmNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAorCQkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDApOworCQkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOworCQkJfQorCQkJY2luZXJneXQyLT5yY19sYXN0X2NvZGUgPSB+MDsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisJY2luZXJneXQyLT5sYXN0X2V2ZW50X2ppZmZpZXMgPSBqaWZmaWVzOwogCi0JZm9yIChuPTA7IGxlbj4wICYmIG48KGxlbi9zaXplb2YocmNfZXZlbnRzWzBdKSk7IG4rKykgewotCQlpbnQgaTsKLQotLyoJCWRwcmludGsoMSwicmNfZXZlbnRzWyVkXS52YWx1ZSA9ICV4LCB0eXBlPSV4XG4iLG4sbGUzMl90b19jcHUocmNfZXZlbnRzW25dLnZhbHVlKSxyY19ldmVudHNbbl0udHlwZSk7Ki8KKwlmb3IgKG4gPSAwOyBuIDwgKGxlbiAvIHNpemVvZihyY19ldmVudHNbMF0pKTsgbisrKSB7CisJCWRwcmludGsoMSwgInJjX2V2ZW50c1slZF0udmFsdWUgPSAleCwgdHlwZT0leFxuIiwKKwkJCW4sIGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSksIHJjX2V2ZW50c1tuXS50eXBlKTsKIAogCQlpZiAocmNfZXZlbnRzW25dLnR5cGUgPT0gQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDICYmCi0JCSAgICByY19ldmVudHNbbl0udmFsdWUgPT0gfjApCi0JCXsKLQkJCS8qKgotCQkJICoga2V5cmVwZWF0IGJpdC4gSWYgd2Ugd291bGQgaGFuZGxlIHRoaXMgcHJvcGVybHkKLQkJCSAqIHdlIHdvdWxkIG5lZWQgdG8gZW1pdCBkb3duIGV2ZW50cyBhcyBsb25nIHRoZQotCQkJICoga2V5cmVwZWF0IGdvZXMsIGEgdXAgZXZlbnQgaWYgbm8gZnVydGhlcgotCQkJICogcmVwZWF0IGJpdHMgb2NjdXIuIFdvdWxkIG5lZWQgYSB0aW1lciB0byBpbXBsZW1lbnQKLQkJCSAqIGFuZCBubyBvdGhlciBkcml2ZXIgZG9lcyB0aGlzLCBzbyB3ZSBzaW1wbHkKLQkJCSAqIGVtaXQgdGhlIGxhc3Qga2V5IHVwL2Rvd24gc2VxdWVuY2UgYWdhaW4uCi0JCQkgKi8KKwkJICAgIHJjX2V2ZW50c1tuXS52YWx1ZSA9PSB+MCkgeworCQkJLyoga2V5cmVwZWF0IGJpdCAtPiBqdXN0IHJlcGVhdCBsYXN0IHJjX2lucHV0X2V2ZW50ICovCiAJCX0gZWxzZSB7CiAJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKLQkJCWZvciAoaT0wOyBpPHNpemVvZihyY19rZXlzKS9zaXplb2YocmNfa2V5c1swXSk7IGkrPTMpIHsKLQkJCQlpZiAocmNfa2V5c1tpKzBdID09IHJjX2V2ZW50c1tuXS50eXBlICYmCi0JCQkJICAgIHJjX2tleXNbaSsxXSA9PSBsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpKQotCQkJCXsKLQkJCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IHJjX2tleXNbaSsyXTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmNfa2V5cykgLyBzaXplb2YocmNfa2V5c1swXSk7IGkgKz0gMykgeworCQkJCWlmIChyY19rZXlzW2kgKyAwXSA9PSByY19ldmVudHNbbl0udHlwZSAmJgorCQkJCSAgICByY19rZXlzW2kgKyAxXSA9PSBsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpKSB7CisJCQkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSByY19rZXlzW2kgKyAyXTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCQl9CiAKIAkJaWYgKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgIT0gS0VZX01BWCkgewotCQkJaW5wdXRfcmVwb3J0X2tleSgmY2luZXJneXQyLT5yY19pbnB1dF9kZXYsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDEpOwotCQkJaW5wdXRfcmVwb3J0X2tleSgmY2luZXJneXQyLT5yY19pbnB1dF9kZXYsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDApOwotCQkJaW5wdXRfc3luYygmY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOworCQkJaWYgKHJjX2V2ZW50c1tuXS52YWx1ZSA9PSBjaW5lcmd5dDItPnJjX2xhc3RfY29kZSAmJgorCQkJICAgIGNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlICE9IH4wKSB7CisJCQkJLyogZW1pdCBhIGtleS11cCBzbyB0aGUgZG91YmxlIGV2ZW50IGlzIHJlY29nbml6ZWQgKi8KKwkJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZCBVUFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CisJCQkJaW5wdXRfcmVwb3J0X2tleSgmY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCisJCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMCk7CisJCQl9CisJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KCZjaW5lcmd5dDItPnJjX2lucHV0X2RldiwKKwkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDEpOworCQkJY2luZXJneXQyLT5yY19sYXN0X2NvZGUgPSByY19ldmVudHNbbl0udmFsdWU7CiAJCX0KIAl9CiAKK291dDoKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywKIAkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkNfUVVFUllfSU5URVJWQUwpKTsKIApAQCAtNzcyLDcgKzc4OCwxMCBAQAogCQkgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDI7Ci0JaW50IGksIGVycjsKKwlpbnQgZXJyOworI2lmZGVmIEVOQUJMRV9SQworCWludCBpOworI2VuZGlmCiAKIAlpZiAoIShjaW5lcmd5dDIgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IGNpbmVyZ3l0MiksIEdGUF9LRVJORUwpKSkgewogCQlkcHJpbnRrKDEsICJvdXQgb2YgbWVtb3J5PyE/XG4iKTsKQEAgLTgyOCwxOSArODQ3LDE4IEBACiAJCQkgICAgRFZCX0RFVklDRV9GUk9OVEVORCk7CiAKICNpZmRlZiBFTkFCTEVfUkMKLQlpbml0X2lucHV0X2RldigmY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOwotCi0JY2luZXJneXQyLT5yY19pbnB1dF9kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKLQljaW5lcmd5dDItPnJjX2lucHV0X2Rldi5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLQljaW5lcmd5dDItPnJjX2lucHV0X2Rldi5rZXljb2RlbWF4ID0gS0VZX01BWDsKKwljaW5lcmd5dDItPnJjX2lucHV0X2Rldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFUCk7CisJY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Y29kZXNpemUgPSAwOworCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LmtleWNvZGVtYXggPSAwOwogCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2Lm5hbWUgPSBEUklWRVJfTkFNRSAiIHJlbW90ZSBjb250cm9sIjsKIAotCWZvciAoaT0wOyBpPHNpemVvZihyY19rZXlzKS9zaXplb2YocmNfa2V5c1swXSk7IGkrPTMpCi0JCXNldF9iaXQocmNfa2V5c1tpKzJdLCBjaW5lcmd5dDItPnJjX2lucHV0X2Rldi5rZXliaXQpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmNfa2V5cykgLyBzaXplb2YocmNfa2V5c1swXSk7IGkgKz0gMykKKwkJc2V0X2JpdChyY19rZXlzW2kgKyAyXSwgY2luZXJneXQyLT5yY19pbnB1dF9kZXYua2V5Yml0KTsKIAogCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOwogCiAJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CisJY2luZXJneXQyLT5yY19sYXN0X2NvZGUgPSB+MDsKIAogCUlOSVRfV09SSygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBjaW5lcmd5dDJfcXVlcnlfcmMsIGNpbmVyZ3l0Mik7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZGVtdXguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RlbXV4LmgKaW5kZXggZmI1NWVhYS4uOTcxOWEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZGVtdXguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kZW11eC5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9kbXguaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBDb21tb24gZGVmaW5pdGlvbnMgKi8KQEAgLTEyNCw5ICsxMjUsNyBAQAogCQkgICAgdTE2IHBpZCwKIAkJICAgIGludCB0eXBlLAogCQkgICAgZW51bSBkbXhfdHNfcGVzIHBlc190eXBlLAotCQkgICAgc2l6ZV90IGNhbGxiYWNrX2xlbmd0aCwKIAkJICAgIHNpemVfdCBjaXJjdWxhcl9idWZmZXJfc2l6ZSwKLQkJICAgIGludCBkZXNjcmFtYmxlLAogCQkgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQpOwogICAgICAgICBpbnQgKCpzdGFydF9maWx0ZXJpbmcpIChzdHJ1Y3QgZG14X3RzX2ZlZWQqIGZlZWQpOwogICAgICAgICBpbnQgKCpzdG9wX2ZpbHRlcmluZykgKHN0cnVjdCBkbXhfdHNfZmVlZCogZmVlZCk7CkBAIC0xNTksNyArMTU4LDYgQEAKICAgICAgICAgaW50ICgqc2V0KSAoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQsCiAJCSAgICB1MTYgcGlkLAogCQkgICAgc2l6ZV90IGNpcmN1bGFyX2J1ZmZlcl9zaXplLAotCQkgICAgaW50IGRlc2NyYW1ibGUsCiAJCSAgICBpbnQgY2hlY2tfY3JjKTsKICAgICAgICAgaW50ICgqYWxsb2NhdGVfZmlsdGVyKSAoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQsCiAJCQkJc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlcioqIGZpbHRlcik7CkBAIC0yMDcsNyArMjA1LDYgQEAKICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBjb25uZWN0aXZpdHlfbGlzdDsgLyogTGlzdCBvZiBmcm9udC1lbmRzIHRoYXQgY2FuCiAJCQkJCSAgICAgICBiZSBjb25uZWN0ZWQgdG8gYSBwYXJ0aWN1bGFyCiAJCQkJCSAgICAgICBkZW11eCAqLwotICAgICAgICB2b2lkKiBwcml2OyAgICAgLyogUG9pbnRlciB0byBwcml2YXRlIGRhdGEgb2YgdGhlIEFQSSBjbGllbnQgKi8KICAgICAgICAgZW51bSBkbXhfZnJvbnRlbmRfc291cmNlIHNvdXJjZTsKIH07CiAKQEAgLTIyNSw4ICsyMjIsNiBAQAogI2RlZmluZSBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyAgICAgICAgICAgICAgOCAgICAvKiB3cml0ZSgpIGF2YWlsYWJsZSAqLwogI2RlZmluZSBETVhfQ1JDX0NIRUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgRE1YX1RTX0RFU0NSQU1CTElORyAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIERNWF9TRUNUSU9OX1BBWUxPQURfREVTQ1JBTUJMSU5HICAgICAgICA2NAotI2RlZmluZSBETVhfTUFDX0FERFJFU1NfREVTQ1JBTUJMSU5HICAgICAgICAgICAgMTI4CiAKIC8qCiAgKiBEZW11eCByZXNvdXJjZSB0eXBlIGlkZW50aWZpZXIuCkBAIC0yNDQsOSArMjM5LDcgQEAKIHN0cnVjdCBkbXhfZGVtdXggewogICAgICAgICB1MzIgY2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEJpdGZpZWxkIG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KICAgICAgICAgc3RydWN0IGRteF9mcm9udGVuZCogZnJvbnRlbmQ7ICAgIC8qIEZyb250LWVuZCBjb25uZWN0ZWQgdG8gdGhlIGRlbXV4ICovCi0gICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgcmVnX2xpc3Q7ICAgLyogTGlzdCBvZiByZWdpc3RlcmVkIGRlbXV4ZXMgKi8KICAgICAgICAgdm9pZCogcHJpdjsgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHByaXZhdGUgZGF0YSBvZiB0aGUgQVBJIGNsaWVudCAqLwotICAgICAgICBpbnQgdXNlcnM7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB1c2VycyAqLwogICAgICAgICBpbnQgKCpvcGVuKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgpOwogICAgICAgICBpbnQgKCpjbG9zZSkgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4KTsKICAgICAgICAgaW50ICgqd3JpdGUpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgY291bnQpOwpAQCAtMjYwLDE3ICsyNTMsNiBAQAogCQkJCSAgICAgIGRteF9zZWN0aW9uX2NiIGNhbGxiYWNrKTsKICAgICAgICAgaW50ICgqcmVsZWFzZV9zZWN0aW9uX2ZlZWQpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwKIAkJCQkgICAgIHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkKiBmZWVkKTsKLSAgICAgICAgaW50ICgqZGVzY3JhbWJsZV9tYWNfYWRkcmVzcykgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4LAotCQkJCSAgICAgICB1OCogYnVmZmVyMSwKLQkJCQkgICAgICAgc2l6ZV90IGJ1ZmZlcjFfbGVuZ3RoLAotCQkJCSAgICAgICB1OCogYnVmZmVyMiwKLQkJCQkgICAgICAgc2l6ZV90IGJ1ZmZlcjJfbGVuZ3RoLAotCQkJCSAgICAgICB1MTYgcGlkKTsKLSAgICAgICAgaW50ICgqZGVzY3JhbWJsZV9zZWN0aW9uX3BheWxvYWQpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwKLQkJCQkJICAgdTgqIGJ1ZmZlcjEsCi0JCQkJCSAgIHNpemVfdCBidWZmZXIxX2xlbmd0aCwKLQkJCQkJICAgdTgqIGJ1ZmZlcjIsIHNpemVfdCBidWZmZXIyX2xlbmd0aCwKLQkJCQkJICAgdTE2IHBpZCk7CiAgICAgICAgIGludCAoKmFkZF9mcm9udGVuZCkgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4LAogCQkJICAgICBzdHJ1Y3QgZG14X2Zyb250ZW5kKiBmcm9udGVuZCk7CiAgICAgICAgIGludCAoKnJlbW92ZV9mcm9udGVuZCkgKHN0cnVjdCBkbXhfZGVtdXgqIGRlbXV4LApAQCAtMjgyLDIwICsyNjQsMTIgQEAKIAogICAgICAgICBpbnQgKCpnZXRfcGVzX3BpZHMpIChzdHJ1Y3QgZG14X2RlbXV4KiBkZW11eCwgdTE2ICpwaWRzKTsKIAorCWludCAoKmdldF9jYXBzKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgsIHN0cnVjdCBkbXhfY2FwcyAqY2Fwcyk7CisKKwlpbnQgKCpzZXRfc291cmNlKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgsIGNvbnN0IGRteF9zb3VyY2VfdCAqc3JjKTsKKwogICAgICAgICBpbnQgKCpnZXRfc3RjKSAoc3RydWN0IGRteF9kZW11eCogZGVtdXgsIHVuc2lnbmVkIGludCBudW0sCiAJCQl1NjQgKnN0YywgdW5zaWduZWQgaW50ICpiYXNlKTsKIH07CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRGVtdXggZGlyZWN0b3J5ICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIERNWF9ESVJfRU5UUlkoKTogQ2FzdHMgZWxlbWVudHMgaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZAotICogZGVtdXhlcyBmcm9tIHRoZSBnZW5lcmljIHR5cGUgc3RydWN0IGxpc3RfaGVhZCogdG8gdGhlIHR5cGUgc3RydWN0IGRteF9kZW11eAotICouCi0gKi8KLQotI2RlZmluZSBETVhfRElSX0VOVFJZKGxpc3QpIGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRteF9kZW11eCwgcmVnX2xpc3QpCi0KICNlbmRpZiAvKiAjaWZuZGVmIF9fREVNVVhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYwppbmRleCA2ODA1MGNkLi44MDI4YzNhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCkBAIC01NzEsNyArNTcxLDcgQEAKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQogCi0JCQlyZXQ9KCpzZWNmZWVkKS0+c2V0KCpzZWNmZWVkLCBwYXJhLT5waWQsIDMyNzY4LCAwLAorCQkJcmV0PSgqc2VjZmVlZCktPnNldCgqc2VjZmVlZCwgcGFyYS0+cGlkLCAzMjc2OCwKIAkJCQkJICAgIChwYXJhLT5mbGFncyAmIERNWF9DSEVDS19DUkMpID8gMSA6IDApOwogCiAJCQlpZiAocmV0PDApIHsKQEAgLTY1NCw3ICs2NTQsNyBAQAogCQkoKnRzZmVlZCktPnByaXYgPSAodm9pZCAqKSBmaWx0ZXI7CiAKIAkJcmV0ID0gKCp0c2ZlZWQpLT5zZXQoKnRzZmVlZCwgcGFyYS0+cGlkLCB0c190eXBlLCB0c19wZXMsCi0JCQkJICAgICAxODgsIDMyNzY4LCAwLCB0aW1lb3V0KTsKKwkJCQkgICAgIDMyNzY4LCB0aW1lb3V0KTsKIAogCQlpZiAocmV0IDwgMCkgewogCQkJZG14ZGV2LT5kZW11eC0+cmVsZWFzZV90c19mZWVkKGRteGRldi0+ZGVtdXgsICp0c2ZlZWQpOwpAQCAtOTI5LDYgKzkyOSwyMiBAQAogCQlkbXhkZXYtPmRlbXV4LT5nZXRfcGVzX3BpZHMoZG14ZGV2LT5kZW11eCwgKHUxNiAqKXBhcmcpOwogCQlicmVhazsKIAorCWNhc2UgRE1YX0dFVF9DQVBTOgorCQlpZiAoIWRteGRldi0+ZGVtdXgtPmdldF9jYXBzKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gZG14ZGV2LT5kZW11eC0+Z2V0X2NhcHMoZG14ZGV2LT5kZW11eCwgcGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBETVhfU0VUX1NPVVJDRToKKwkJaWYgKCFkbXhkZXYtPmRlbXV4LT5zZXRfc291cmNlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gZG14ZGV2LT5kZW11eC0+c2V0X3NvdXJjZShkbXhkZXYtPmRlbXV4LCBwYXJnKTsKKwkJYnJlYWs7CisKIAljYXNlIERNWF9HRVRfU1RDOgogCQlpZiAoIWRteGRldi0+ZGVtdXgtPmdldF9zdGMpIHsKIAkJICAgICAgICByZXQ9LUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCmluZGV4IDBlYjlhYTcuLjg4NzU3ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYwpAQCAtNDcsNyArNDcsNyBAQAogCiAjZGVmaW5lIGRwcmludGsgaWYgKGR2Yl9jYV9lbjUwMjIxX2RlYnVnKSBwcmludGsKIAotI2RlZmluZSBJTklUX1RJTUVPVVRfU0VDUyA1CisjZGVmaW5lIElOSVRfVElNRU9VVF9TRUNTIDEwCiAKICNkZWZpbmUgSE9TVF9MSU5LX0JVRl9TSVpFIDB4MjAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKaW5kZXggYWM5ODg5ZC4uZGM0NzZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKQEAgLTM4LDgyICszOCw1MiBAQAogKi8KIC8vICNkZWZpbmUgRFZCX0RFTVVYX1NFQ1RJT05fTE9TU19MT0cKIAotCi1zdGF0aWMgTElTVF9IRUFEKGRteF9tdXhzKTsKLQotCi1zdGF0aWMgaW50IGRteF9yZWdpc3Rlcl9kZW11eChzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCkKLXsKLQlkZW11eC0+dXNlcnMgPSAwOwotCWxpc3RfYWRkKCZkZW11eC0+cmVnX2xpc3QsICZkbXhfbXV4cyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZG14X3VucmVnaXN0ZXJfZGVtdXgoc3RydWN0IGRteF9kZW11eCogZGVtdXgpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbiwgKmhlYWQ9JmRteF9tdXhzOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlIChwb3MsIG4sIGhlYWQpIHsKLQkJaWYgKERNWF9ESVJfRU5UUlkocG9zKSA9PSBkZW11eCkgewotCQkJaWYgKGRlbXV4LT51c2Vycz4wKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJbGlzdF9kZWwocG9zKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogc3RhdGljIGlubGluZWQgaGVscGVyIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiBzdGF0aWMgaW5saW5lIHUxNiBzZWN0aW9uX2xlbmd0aChjb25zdCB1OCAqYnVmKQogewotCXJldHVybiAzKygoYnVmWzFdJjB4MGYpPDw4KStidWZbMl07CisJcmV0dXJuIDMgKyAoKGJ1ZlsxXSAmIDB4MGYpIDw8IDgpICsgYnVmWzJdOwogfQogCi0KIHN0YXRpYyBpbmxpbmUgdTE2IHRzX3BpZChjb25zdCB1OCAqYnVmKQogewotCXJldHVybiAoKGJ1ZlsxXSYweDFmKTw8OCkrYnVmWzJdOworCXJldHVybiAoKGJ1ZlsxXSAmIDB4MWYpIDw8IDgpICsgYnVmWzJdOwogfQogCi0KIHN0YXRpYyBpbmxpbmUgdTggcGF5bG9hZChjb25zdCB1OCAqdHNwKQogewotCWlmICghKHRzcFszXSAmIDB4MTApKSAvLyBubyBwYXlsb2FkPworCWlmICghKHRzcFszXSAmIDB4MTApKQkvLyBubyBwYXlsb2FkPwogCQlyZXR1cm4gMDsKLQlpZiAodHNwWzNdICYgMHgyMCkgeyAgLy8gYWRhcHRhdGlvbiBmaWVsZD8KLQkJaWYgKHRzcFs0XSA+IDE4MykgICAgLy8gY29ycnVwdGVkIGRhdGE/CisKKwlpZiAodHNwWzNdICYgMHgyMCkgewkvLyBhZGFwdGF0aW9uIGZpZWxkPworCQlpZiAodHNwWzRdID4gMTgzKQkvLyBjb3JydXB0ZWQgZGF0YT8KIAkJCXJldHVybiAwOwogCQllbHNlCi0JCQlyZXR1cm4gMTg0LTEtdHNwWzRdOworCQkJcmV0dXJuIDE4NCAtIDEgLSB0c3BbNF07CiAJfQorCiAJcmV0dXJuIDE4NDsKIH0KIAotCi1zdGF0aWMgdTMyIGR2Yl9kbXhfY3JjMzIgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZiwgY29uc3QgdTggKnNyYywgc2l6ZV90IGxlbikKK3N0YXRpYyB1MzIgZHZiX2RteF9jcmMzMihzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYsIGNvbnN0IHU4ICpzcmMsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIChmLT5mZWVkLnNlYy5jcmNfdmFsID0gY3JjMzJfYmUgKGYtPmZlZWQuc2VjLmNyY192YWwsIHNyYywgbGVuKSk7CisJcmV0dXJuIChmLT5mZWVkLnNlYy5jcmNfdmFsID0gY3JjMzJfYmUoZi0+ZmVlZC5zZWMuY3JjX3ZhbCwgc3JjLCBsZW4pKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBkdmJfZG14X21lbWNvcHkgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZiwgdTggKmQsIGNvbnN0IHU4ICpzLCBzaXplX3QgbGVuKQorc3RhdGljIHZvaWQgZHZiX2RteF9tZW1jb3B5KHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZiwgdTggKmQsIGNvbnN0IHU4ICpzLAorCQkJICAgIHNpemVfdCBsZW4pCiB7Ci0JbWVtY3B5IChkLCBzLCBsZW4pOworCW1lbWNweShkLCBzLCBsZW4pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNvZnR3YXJlIGZpbHRlciBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbmxpbmUgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfcGF5bG9hZCAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmKQorc3RhdGljIGlubGluZSBpbnQgZHZiX2RteF9zd2ZpbHRlcl9wYXlsb2FkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwkJCQkJICAgY29uc3QgdTggKmJ1ZikKIHsKIAlpbnQgY291bnQgPSBwYXlsb2FkKGJ1Zik7CiAJaW50IHA7CkBAIC0xMjMsMzIgKzkzLDMxIEBACiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAtMTsKIAotCXAgPSAxODgtY291bnQ7CisJcCA9IDE4OCAtIGNvdW50OwogCiAJLyoKLQljYz1idWZbM10mMHgwZjsKLQljY29rPSgoZHZiZG14ZmVlZC0+Y2MrMSkmMHgwZik9PWNjID8gMSA6IDA7Ci0JZHZiZG14ZmVlZC0+Y2M9Y2M7CisJY2MgPSBidWZbM10gJiAweDBmOworCWNjb2sgPSAoKGZlZWQtPmNjICsgMSkgJiAweDBmKSA9PSBjYzsKKwlmZWVkLT5jYyA9IGNjOwogCWlmICghY2NvaykKIAkJcHJpbnRrKCJtaXNzZWQgcGFja2V0IVxuIik7CiAJKi8KIAotCWlmIChidWZbMV0gJiAweDQwKSAgLy8gUFVTSSA/CisJaWYgKGJ1ZlsxXSAmIDB4NDApCS8vIFBVU0kgPwogCQlmZWVkLT5wZXNsZW4gPSAweGZmZmE7CiAKIAlmZWVkLT5wZXNsZW4gKz0gY291bnQ7CiAKLQlyZXR1cm4gZmVlZC0+Y2IudHMgKCZidWZbcF0sIGNvdW50LCBOVUxMLCAwLCAmZmVlZC0+ZmVlZC50cywgRE1YX09LKTsKKwlyZXR1cm4gZmVlZC0+Y2IudHMoJmJ1ZltwXSwgY291bnQsIE5VTEwsIDAsICZmZWVkLT5mZWVkLnRzLCBETVhfT0spOwogfQogCi0KLXN0YXRpYyBpbnQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uZmlsdGVyIChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCi0JCQkJICAgIHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpmKQorc3RhdGljIGludCBkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25maWx0ZXIoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLAorCQkJCQkgIHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpmKQogewogCXU4IG5lcSA9IDA7CiAJaW50IGk7CiAKLQlmb3IgKGk9MDsgaTxEVkJfREVNVVhfTUFTS19NQVg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBEVkJfREVNVVhfTUFTS19NQVg7IGkrKykgewogCQl1OCB4b3IgPSBmLT5maWx0ZXIuZmlsdGVyX3ZhbHVlW2ldIF4gZmVlZC0+ZmVlZC5zZWMuc2VjYnVmW2ldOwogCiAJCWlmIChmLT5tYXNrYW5kbW9kZVtpXSAmIHhvcikKQEAgLTE2MCwxMiArMTI5LDExIEBACiAJaWYgKGYtPmRvbmVxICYmICFuZXEpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIGZlZWQtPmNiLnNlYyAoZmVlZC0+ZmVlZC5zZWMuc2VjYnVmLCBmZWVkLT5mZWVkLnNlYy5zZWNsZW4sCi0JCQkgICAgIE5VTEwsIDAsICZmLT5maWx0ZXIsIERNWF9PSyk7CisJcmV0dXJuIGZlZWQtPmNiLnNlYyhmZWVkLT5mZWVkLnNlYy5zZWNidWYsIGZlZWQtPmZlZWQuc2VjLnNlY2xlbiwKKwkJCSAgICBOVUxMLCAwLCAmZi0+ZmlsdGVyLCBETVhfT0spOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9mZWVkIChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCitzdGF0aWMgaW5saW5lIGludCBkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCiB7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZiA9IGZlZWQtPmZpbHRlcjsKQEAgLTE5NSwyNiArMTYzLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHZvaWQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX25ldyhzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCiB7CiAJc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgKnNlYyA9ICZmZWVkLT5mZWVkLnNlYzsKIAogI2lmZGVmIERWQl9ERU1VWF9TRUNUSU9OX0xPU1NfTE9HCi0JaWYoc2VjLT5zZWNidWZwIDwgc2VjLT50c2ZlZWRwKQotCXsKKwlpZiAoc2VjLT5zZWNidWZwIDwgc2VjLT50c2ZlZWRwKSB7CiAJCWludCBpLCBuID0gc2VjLT50c2ZlZWRwIC0gc2VjLT5zZWNidWZwOwogCi0JCS8qIHNlY3Rpb24gcGFkZGluZyBpcyBkb25lIHdpdGggMHhmZiBieXRlcyBlbnRpcmVseS4KLQkJKiogZHVlIHRvIHNwZWVkIHJlYXNvbnMsIHdlIHdvbid0IGNoZWNrIGFsbCBvZiB0aGVtCi0JCSoqIGJ1dCBqdXN0IGZpcnN0IGFuZCBsYXN0Ci0JCSovCi0JCWlmKHNlYy0+c2VjYnVmWzBdICE9IDB4ZmYgfHwgc2VjLT5zZWNidWZbbi0xXSAhPSAweGZmKQotCQl7CisJCS8qCisJCSAqIFNlY3Rpb24gcGFkZGluZyBpcyBkb25lIHdpdGggMHhmZiBieXRlcyBlbnRpcmVseS4KKwkJICogRHVlIHRvIHNwZWVkIHJlYXNvbnMsIHdlIHdvbid0IGNoZWNrIGFsbCBvZiB0aGVtCisJCSAqIGJ1dCBqdXN0IGZpcnN0IGFuZCBsYXN0LgorCQkgKi8KKwkJaWYgKHNlYy0+c2VjYnVmWzBdICE9IDB4ZmYgfHwgc2VjLT5zZWNidWZbbiAtIDFdICE9IDB4ZmYpIHsKIAkJCXByaW50aygiZHZiX2RlbXV4LmMgc2VjdGlvbiB0cyBwYWRkaW5nIGxvc3M6ICVkLyVkXG4iLAogCQkJICAgICAgIG4sIHNlYy0+dHNmZWVkcCk7CiAJCQlwcmludGsoImR2Yl9kZW11eC5jIHBhZCBkYXRhOiIpOwotCQkJZm9yKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKIAkJCQlwcmludGsoIiAlMDJ4Iiwgc2VjLT5zZWNidWZbaV0pOwogCQkJcHJpbnRrKCJcbiIpOwogCQl9CkBAIC0yMjYsODIgKzE5Miw4MSBAQAogfQogCiAvKgotKiogTG9zbGVzcyBTZWN0aW9uIERlbXV4IDEuNC4xIGJ5IEVtYXJkCi0qKiBWYWxzZWNjaGkgUGF0cmljazoKLSoqICAtIG1pZGRsZSBvZiBzZWN0aW9uIEEgIChubyBQVVNJKQotKiogIC0gZW5kIG9mIHNlY3Rpb24gQSBhbmQgc3RhcnQgb2Ygc2VjdGlvbiBCCi0qKiAgICAod2l0aCBQVVNJIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHNlY3Rpb24pCi0qKgotKiogIEluIHRoaXMgY2FzZSwgd2l0aG91dCBmZWVkLT5wdXNpX3NlZW4geW91J2xsIHJlY2VpdmUgYSBnYXJiYWdlIHNlY3Rpb24KLSoqICBjb25zaXN0aW5nIG9mIHRoZSBlbmQgb2Ygc2VjdGlvbiBBLiBCYXNpY2FsbHkgYmVjYXVzZSB0c2ZlZWRwCi0qKiAgaXMgaW5jZW1lbnRlZCBhbmQgdGhlIHVzZT0wIGNvbmRpdGlvbiBpcyBub3QgcmFpc2VkCi0qKiAgd2hlbiB0aGUgc2Vjb25kIHBhY2tldCBhcnJpdmVzLgotKioKLSoqIEZpeDoKLSoqIHdoZW4gZGVtdXggaXMgc3RhcnRlZCwgbGV0IGZlZWQtPnB1c2lfc2VlbiA9IDAgdG8KLSoqIHByZXZlbnQgaW5pdGlhbCBmZWVkaW5nIG9mIGdhcmJhZ2UgZnJvbSB0aGUgZW5kIG9mCi0qKiBwcmV2aW91cyBzZWN0aW9uLiBXaGVuIHlvdSBmb3IgdGhlIGZpcnN0IHRpbWUgc2VlIFBVU0k9MQotKiogdGhlbiBzZXQgZmVlZC0+cHVzaV9zZWVuID0gMQotKi8KLXN0YXRpYyBpbnQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2NvcHlfZHVtcChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsIGNvbnN0IHU4ICpidWYsIHU4IGxlbikKKyAqIExvc2xlc3MgU2VjdGlvbiBEZW11eCAxLjQuMSBieSBFbWFyZAorICogVmFsc2VjY2hpIFBhdHJpY2s6CisgKiAgLSBtaWRkbGUgb2Ygc2VjdGlvbiBBICAobm8gUFVTSSkKKyAqICAtIGVuZCBvZiBzZWN0aW9uIEEgYW5kIHN0YXJ0IG9mIHNlY3Rpb24gQgorICogICAgKHdpdGggUFVTSSBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBzZWN0aW9uKQorICoKKyAqICBJbiB0aGlzIGNhc2UsIHdpdGhvdXQgZmVlZC0+cHVzaV9zZWVuIHlvdSdsbCByZWNlaXZlIGEgZ2FyYmFnZSBzZWN0aW9uCisgKiAgY29uc2lzdGluZyBvZiB0aGUgZW5kIG9mIHNlY3Rpb24gQS4gQmFzaWNhbGx5IGJlY2F1c2UgdHNmZWVkcAorICogIGlzIGluY2VtZW50ZWQgYW5kIHRoZSB1c2U9MCBjb25kaXRpb24gaXMgbm90IHJhaXNlZAorICogIHdoZW4gdGhlIHNlY29uZCBwYWNrZXQgYXJyaXZlcy4KKyAqCisgKiBGaXg6CisgKiB3aGVuIGRlbXV4IGlzIHN0YXJ0ZWQsIGxldCBmZWVkLT5wdXNpX3NlZW4gPSAwIHRvCisgKiBwcmV2ZW50IGluaXRpYWwgZmVlZGluZyBvZiBnYXJiYWdlIGZyb20gdGhlIGVuZCBvZgorICogcHJldmlvdXMgc2VjdGlvbi4gV2hlbiB5b3UgZm9yIHRoZSBmaXJzdCB0aW1lIHNlZSBQVVNJPTEKKyAqIHRoZW4gc2V0IGZlZWQtPnB1c2lfc2VlbiA9IDEKKyAqLworc3RhdGljIGludCBkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fY29weV9kdW1wKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwkJCQkJICAgICAgY29uc3QgdTggKmJ1ZiwgdTggbGVuKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgKnNlYyA9ICZmZWVkLT5mZWVkLnNlYzsKIAl1MTYgbGltaXQsIHNlY2xlbiwgbjsKIAotCWlmKHNlYy0+dHNmZWVkcCA+PSBETVhfTUFYX1NFQ0ZFRURfU0laRSkKKwlpZiAoc2VjLT50c2ZlZWRwID49IERNWF9NQVhfU0VDRkVFRF9TSVpFKQogCQlyZXR1cm4gMDsKIAotCWlmKHNlYy0+dHNmZWVkcCArIGxlbiA+IERNWF9NQVhfU0VDRkVFRF9TSVpFKQotCXsKKwlpZiAoc2VjLT50c2ZlZWRwICsgbGVuID4gRE1YX01BWF9TRUNGRUVEX1NJWkUpIHsKICNpZmRlZiBEVkJfREVNVVhfU0VDVElPTl9MT1NTX0xPRwogCQlwcmludGsoImR2Yl9kZW11eC5jIHNlY3Rpb24gYnVmZmVyIGZ1bGwgbG9zczogJWQvJWRcbiIsCi0JCSAgICAgICBzZWMtPnRzZmVlZHAgKyBsZW4gLSBETVhfTUFYX1NFQ0ZFRURfU0laRSwgRE1YX01BWF9TRUNGRUVEX1NJWkUpOworCQkgICAgICAgc2VjLT50c2ZlZWRwICsgbGVuIC0gRE1YX01BWF9TRUNGRUVEX1NJWkUsCisJCSAgICAgICBETVhfTUFYX1NFQ0ZFRURfU0laRSk7CiAjZW5kaWYKIAkJbGVuID0gRE1YX01BWF9TRUNGRUVEX1NJWkUgLSBzZWMtPnRzZmVlZHA7CiAJfQogCi0JaWYobGVuIDw9IDApCisJaWYgKGxlbiA8PSAwKQogCQlyZXR1cm4gMDsKIAogCWRlbXV4LT5tZW1jb3B5KGZlZWQsIHNlYy0+c2VjYnVmX2Jhc2UgKyBzZWMtPnRzZmVlZHAsIGJ1ZiwgbGVuKTsKIAlzZWMtPnRzZmVlZHAgKz0gbGVuOwogCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkqKiBEdW1wIGFsbCB0aGUgc2VjdGlvbnMgd2UgY2FuIGZpbmQgaW4gdGhlIGRhdGEgKEVtYXJkKQotCSovCi0KKwkvKgorCSAqIER1bXAgYWxsIHRoZSBzZWN0aW9ucyB3ZSBjYW4gZmluZCBpbiB0aGUgZGF0YSAoRW1hcmQpCisJICovCiAJbGltaXQgPSBzZWMtPnRzZmVlZHA7Ci0JaWYobGltaXQgPiBETVhfTUFYX1NFQ0ZFRURfU0laRSkKLQkJcmV0dXJuIC0xOyAvKiBpbnRlcm5hbCBlcnJvciBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJaWYgKGxpbWl0ID4gRE1YX01BWF9TRUNGRUVEX1NJWkUpCisJCXJldHVybiAtMTsJLyogaW50ZXJuYWwgZXJyb3Igc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCiAJLyogdG8gYmUgc3VyZSBhbHdheXMgc2V0IHNlY2J1ZiAqLwogCXNlYy0+c2VjYnVmID0gc2VjLT5zZWNidWZfYmFzZSArIHNlYy0+c2VjYnVmcDsKIAotCWZvcihuID0gMDsgc2VjLT5zZWNidWZwICsgMiA8IGxpbWl0OyBuKyspCi0JeworCWZvciAobiA9IDA7IHNlYy0+c2VjYnVmcCArIDIgPCBsaW1pdDsgbisrKSB7CiAJCXNlY2xlbiA9IHNlY3Rpb25fbGVuZ3RoKHNlYy0+c2VjYnVmKTsKLQkJaWYoc2VjbGVuIDw9IDAgfHwgc2VjbGVuID4gRE1YX01BWF9TRUNGRUVEX1NJWkUKLQkJICAgfHwgc2VjbGVuICsgc2VjLT5zZWNidWZwID4gbGltaXQpCisJCWlmIChzZWNsZW4gPD0gMCB8fCBzZWNsZW4gPiBETVhfTUFYX1NFQ0ZFRURfU0laRQorCQkgICAgfHwgc2VjbGVuICsgc2VjLT5zZWNidWZwID4gbGltaXQpCiAJCQlyZXR1cm4gMDsKIAkJc2VjLT5zZWNsZW4gPSBzZWNsZW47CiAJCXNlYy0+Y3JjX3ZhbCA9IH4wOwogCQkvKiBkdW1wIFtzZWNidWYgLi4gc2VjYnVmK3NlY2xlbikgKi8KLQkJaWYoZmVlZC0+cHVzaV9zZWVuKQorCQlpZiAoZmVlZC0+cHVzaV9zZWVuKQogCQkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2ZlZWQoZmVlZCk7CiAjaWZkZWYgRFZCX0RFTVVYX1NFQ1RJT05fTE9TU19MT0cKIAkJZWxzZQogCQkJcHJpbnRrKCJkdmJfZGVtdXguYyBwdXNpIG5vdCBzZWVuLCBkaXNjYXJkaW5nIHNlY3Rpb24gZGF0YVxuIik7CiAjZW5kaWYKLQkJc2VjLT5zZWNidWZwICs9IHNlY2xlbjsgLyogc2VjYnVmcCBhbmQgc2VjYnVmIG1vdmluZyB0b2dldGhlciBpcyAqLwotCQlzZWMtPnNlY2J1ZiArPSBzZWNsZW47IC8qIHJlZHVuZGFuZCBidXQgc2F2ZXMgcG9pbnRlciBhcml0aG1ldGljICovCisJCXNlYy0+c2VjYnVmcCArPSBzZWNsZW47CS8qIHNlY2J1ZnAgYW5kIHNlY2J1ZiBtb3ZpbmcgdG9nZXRoZXIgaXMgKi8KKwkJc2VjLT5zZWNidWYgKz0gc2VjbGVuOwkvKiByZWR1bmRhbnQgYnV0IHNhdmVzIHBvaW50ZXIgYXJpdGhtZXRpYyAqLwogCX0KIAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX3BhY2tldChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsIGNvbnN0IHU4ICpidWYpCitzdGF0aWMgaW50IGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9wYWNrZXQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLAorCQkJCQkgICBjb25zdCB1OCAqYnVmKQogewogCXU4IHAsIGNvdW50OwogCWludCBjY29rLCBkY19pID0gMDsKQEAgLTMwOSwxMCArMjc0LDEwIEBACiAKIAljb3VudCA9IHBheWxvYWQoYnVmKTsKIAotCWlmIChjb3VudCA9PSAwKSAgLyogY291bnQgPT0gMCBpZiBubyBwYXlsb2FkIG9yIG91dCBvZiByYW5nZSAqLworCWlmIChjb3VudCA9PSAwKQkJLyogY291bnQgPT0gMCBpZiBubyBwYXlsb2FkIG9yIG91dCBvZiByYW5nZSAqLwogCQlyZXR1cm4gLTE7CiAKLQlwID0gMTg4IC0gY291bnQ7IC8qIHBheWxvYWQgc3RhcnQgKi8KKwlwID0gMTg4IC0gY291bnQ7CS8qIHBheWxvYWQgc3RhcnQgKi8KIAogCWNjID0gYnVmWzNdICYgMHgwZjsKIAljY29rID0gKChmZWVkLT5jYyArIDEpICYgMHgwZikgPT0gY2M7CkBAIC0zMjYsNTIgKzI5MSw1MyBAQAogCiAJaWYgKCFjY29rIHx8IGRjX2kpIHsKICNpZmRlZiBEVkJfREVNVVhfU0VDVElPTl9MT1NTX0xPRwotCQlwcmludGsoImR2Yl9kZW11eC5jIGRpc2NvbnRpbnVpdHkgZGV0ZWN0ZWQgJWQgYnl0ZXMgbG9zdFxuIiwgY291bnQpOwotCQkvKiB0aG9zZSBieXRlcyB1bmRlciBzdW1lIGNpcmN1bXN0YW5jZXMgd2lsbCBhZ2FpbiBiZSByZXBvcnRlZAotCQkqKiBpbiB0aGUgZm9sbG93aW5nIGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9uZXcKLQkJKi8KKwkJcHJpbnRrKCJkdmJfZGVtdXguYyBkaXNjb250aW51aXR5IGRldGVjdGVkICVkIGJ5dGVzIGxvc3RcbiIsCisJCSAgICAgICBjb3VudCk7CisJCS8qCisJCSAqIHRob3NlIGJ5dGVzIHVuZGVyIHN1bWUgY2lyY3Vtc3RhbmNlcyB3aWxsIGFnYWluIGJlIHJlcG9ydGVkCisJCSAqIGluIHRoZSBmb2xsb3dpbmcgZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX25ldworCQkgKi8KICNlbmRpZgotCQkvKiBEaXNjb250aW51aXR5IGRldGVjdGVkLiBSZXNldCBwdXNpX3NlZW4gPSAwIHRvCi0JCSoqIHN0b3AgZmVlZGluZyBvZiBzdXNwaWNpb3VzIGRhdGEgdW50aWwgbmV4dCBQVVNJPTEgYXJyaXZlcwotCQkqLworCQkvKgorCQkgKiBEaXNjb250aW51aXR5IGRldGVjdGVkLiBSZXNldCBwdXNpX3NlZW4gPSAwIHRvCisJCSAqIHN0b3AgZmVlZGluZyBvZiBzdXNwaWNpb3VzIGRhdGEgdW50aWwgbmV4dCBQVVNJPTEgYXJyaXZlcworCQkgKi8KIAkJZmVlZC0+cHVzaV9zZWVuID0gMDsKIAkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX25ldyhmZWVkKTsKLQkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGJ1ZlsxXSAmIDB4NDApIHsKLQkJLy8gUFVTST0xIChpcyBzZXQpLCBzZWN0aW9uIGJvdW5kYXJ5IGlzIGhlcmUKKwkJLyogUFVTST0xIChpcyBzZXQpLCBzZWN0aW9uIGJvdW5kYXJ5IGlzIGhlcmUgKi8KIAkJaWYgKGNvdW50ID4gMSAmJiBidWZbcF0gPCBjb3VudCkgewotCQkJY29uc3QgdTggKmJlZm9yZSA9IGJ1ZitwKzE7CisJCQljb25zdCB1OCAqYmVmb3JlID0gJmJ1ZltwICsgMV07CiAJCQl1OCBiZWZvcmVfbGVuID0gYnVmW3BdOwotCQkJY29uc3QgdTggKmFmdGVyID0gYmVmb3JlK2JlZm9yZV9sZW47Ci0JCQl1OCBhZnRlcl9sZW4gPSBjb3VudC0xLWJlZm9yZV9sZW47CisJCQljb25zdCB1OCAqYWZ0ZXIgPSAmYmVmb3JlW2JlZm9yZV9sZW5dOworCQkJdTggYWZ0ZXJfbGVuID0gY291bnQgLSAxIC0gYmVmb3JlX2xlbjsKIAotCQkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2NvcHlfZHVtcChmZWVkLCBiZWZvcmUsIGJlZm9yZV9sZW4pOworCQkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX2NvcHlfZHVtcChmZWVkLCBiZWZvcmUsCisJCQkJCQkJICAgYmVmb3JlX2xlbik7CiAJCQkvKiBiZWZvcmUgc3RhcnQgb2YgbmV3IHNlY3Rpb24sIHNldCBwdXNpX3NlZW4gPSAxICovCiAJCQlmZWVkLT5wdXNpX3NlZW4gPSAxOwogCQkJZHZiX2RteF9zd2ZpbHRlcl9zZWN0aW9uX25ldyhmZWVkKTsKLQkJCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9jb3B5X2R1bXAoZmVlZCwgYWZ0ZXIsIGFmdGVyX2xlbik7CisJCQlkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fY29weV9kdW1wKGZlZWQsIGFmdGVyLAorCQkJCQkJCSAgIGFmdGVyX2xlbik7CiAJCX0KICNpZmRlZiBEVkJfREVNVVhfU0VDVElPTl9MT1NTX0xPRwotCQllbHNlCi0JCQlpZiAoY291bnQgPiAwKQotCQkJCXByaW50aygiZHZiX2RlbXV4LmMgUFVTST0xIGJ1dCAlZCBieXRlcyBsb3N0XG4iLCBjb3VudCk7CisJCWVsc2UgaWYgKGNvdW50ID4gMCkKKwkJCXByaW50aygiZHZiX2RlbXV4LmMgUFVTST0xIGJ1dCAlZCBieXRlcyBsb3N0XG4iLCBjb3VudCk7CiAjZW5kaWYKIAl9IGVsc2UgewotCQkvLyBQVVNJPTAgKGlzIG5vdCBzZXQpLCBubyBzZWN0aW9uIGJvdW5kYXJ5Ci0JCWNvbnN0IHU4ICplbnRpcmUgPSBidWYrcDsKLQkJdTggZW50aXJlX2xlbiA9IGNvdW50OwotCi0JCWR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9jb3B5X2R1bXAoZmVlZCwgZW50aXJlLCBlbnRpcmVfbGVuKTsKKwkJLyogUFVTST0wIChpcyBub3Qgc2V0KSwgbm8gc2VjdGlvbiBib3VuZGFyeSAqLworCQlkdmJfZG14X3N3ZmlsdGVyX3NlY3Rpb25fY29weV9kdW1wKGZlZWQsICZidWZbcF0sIGNvdW50KTsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRfdHlwZShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsIGNvbnN0IHU4ICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRfdHlwZShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCisJCQkJCQljb25zdCB1OCAqYnVmKQogewotCXN3aXRjaChmZWVkLT50eXBlKSB7CisJc3dpdGNoIChmZWVkLT50eXBlKSB7CiAJY2FzZSBETVhfVFlQRV9UUzoKIAkJaWYgKCFmZWVkLT5mZWVkLnRzLmlzX2ZpbHRlcmluZykKIAkJCWJyZWFrOwpAQCAtMzc5LDcgKzM0NSw4IEBACiAJCQlpZiAoZmVlZC0+dHNfdHlwZSAmIFRTX1BBWUxPQURfT05MWSkKIAkJCQlkdmJfZG14X3N3ZmlsdGVyX3BheWxvYWQoZmVlZCwgYnVmKTsKIAkJCWVsc2UKLQkJCQlmZWVkLT5jYi50cyhidWYsIDE4OCwgTlVMTCwgMCwgJmZlZWQtPmZlZWQudHMsIERNWF9PSyk7CisJCQkJZmVlZC0+Y2IudHMoYnVmLCAxODgsIE5VTEwsIDAsICZmZWVkLT5mZWVkLnRzLAorCQkJCQkgICAgRE1YX09LKTsKIAkJfQogCQlpZiAoZmVlZC0+dHNfdHlwZSAmIFRTX0RFQ09ERVIpCiAJCQlpZiAoZmVlZC0+ZGVtdXgtPndyaXRlX3RvX2RlY29kZXIpCkBAIC0zOTAsNyArMzU3LDcgQEAKIAkJaWYgKCFmZWVkLT5mZWVkLnNlYy5pc19maWx0ZXJpbmcpCiAJCQlicmVhazsKIAkJaWYgKGR2Yl9kbXhfc3dmaWx0ZXJfc2VjdGlvbl9wYWNrZXQoZmVlZCwgYnVmKSA8IDApCi0JCQlmZWVkLT5mZWVkLnNlYy5zZWNsZW4gPSBmZWVkLT5mZWVkLnNlYy5zZWNidWZwPTA7CisJCQlmZWVkLT5mZWVkLnNlYy5zZWNsZW4gPSBmZWVkLT5mZWVkLnNlYy5zZWNidWZwID0gMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDA2LDcgKzM3Myw3IEBACiBzdGF0aWMgdm9pZCBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldChzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1ZikKIHsKIAlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqaGVhZD0mZGVtdXgtPmZlZWRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpoZWFkID0gJmRlbXV4LT5mZWVkX2xpc3Q7CiAJdTE2IHBpZCA9IHRzX3BpZChidWYpOwogCWludCBkdnJfZG9uZSA9IDA7CiAKQEAgLTQzMiwyMSArMzk5LDIxIEBACiAJfQogfQogCi12b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyhzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQordm9pZCBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsIGNvbnN0IHU4ICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJc3Bpbl9sb2NrKCZkZW11eC0+bG9jayk7CiAKIAl3aGlsZSAoY291bnQtLSkgewotCQlpZihidWZbMF0gPT0gMHg0NykgewotCQkgICAgICAgIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0KGRlbXV4LCBidWYpOwotCQl9CisJCWlmIChidWZbMF0gPT0gMHg0NykKKwkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0KGRlbXV4LCBidWYpOwogCQlidWYgKz0gMTg4OwogCX0KIAogCXNwaW5fdW5sb2NrKCZkZW11eC0+bG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyk7CiAKK0VYUE9SVF9TWU1CT0woZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKTsKIAogdm9pZCBkdmJfZG14X3N3ZmlsdGVyKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4LCBjb25zdCB1OCAqYnVmLCBzaXplX3QgY291bnQpCiB7CkBAIC00NTQsOCArNDIxLDEwIEBACiAKIAlzcGluX2xvY2soJmRlbXV4LT5sb2NrKTsKIAotCWlmICgoaSA9IGRlbXV4LT50c2J1ZnApKSB7Ci0JCWlmIChjb3VudCA8IChqPTE4OC1pKSkgeworCWlmIChkZW11eC0+dHNidWZwKSB7CisJCWkgPSBkZW11eC0+dHNidWZwOworCQlqID0gMTg4IC0gaTsKKwkJaWYgKGNvdW50IDwgaikgewogCQkJbWVtY3B5KCZkZW11eC0+dHNidWZbaV0sIGJ1ZiwgY291bnQpOwogCQkJZGVtdXgtPnRzYnVmcCArPSBjb3VudDsKIAkJCWdvdG8gYmFpbG91dDsKQEAgLTQ2OSwxMyArNDM4LDEzIEBACiAKIAl3aGlsZSAocCA8IGNvdW50KSB7CiAJCWlmIChidWZbcF0gPT0gMHg0NykgewotCQkJaWYgKGNvdW50LXAgPj0gMTg4KSB7Ci0JCQkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXQoZGVtdXgsIGJ1ZitwKTsKKwkJCWlmIChjb3VudCAtIHAgPj0gMTg4KSB7CisJCQkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXQoZGVtdXgsICZidWZbcF0pOwogCQkJCXAgKz0gMTg4OwogCQkJfSBlbHNlIHsKLQkJCQlpID0gY291bnQtcDsKLQkJCQltZW1jcHkoZGVtdXgtPnRzYnVmLCBidWYrcCwgaSk7Ci0JCQkJZGVtdXgtPnRzYnVmcD1pOworCQkJCWkgPSBjb3VudCAtIHA7CisJCQkJbWVtY3B5KGRlbXV4LT50c2J1ZiwgJmJ1ZltwXSwgaSk7CisJCQkJZGVtdXgtPnRzYnVmcCA9IGk7CiAJCQkJZ290byBiYWlsb3V0OwogCQkJfQogCQl9IGVsc2UKQEAgLTQ4NSwyNCArNDU0LDI5IEBACiBiYWlsb3V0OgogCXNwaW5fdW5sb2NrKCZkZW11eC0+bG9jayk7CiB9CisKIEVYUE9SVF9TWU1CT0woZHZiX2RteF9zd2ZpbHRlcik7CiAKIHZvaWQgZHZiX2RteF9zd2ZpbHRlcl8yMDQoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlpbnQgcCA9IDAsaSwgajsKKwlpbnQgcCA9IDAsIGksIGo7CiAJdTggdG1wcGFja1sxODhdOworCiAJc3Bpbl9sb2NrKCZkZW11eC0+bG9jayk7CiAKLQlpZiAoKGkgPSBkZW11eC0+dHNidWZwKSkgewotCQlpZiAoY291bnQgPCAoaj0yMDQtaSkpIHsKKwlpZiAoZGVtdXgtPnRzYnVmcCkgeworCQlpID0gZGVtdXgtPnRzYnVmcDsKKwkJaiA9IDIwNCAtIGk7CisJCWlmIChjb3VudCA8IGopIHsKIAkJCW1lbWNweSgmZGVtdXgtPnRzYnVmW2ldLCBidWYsIGNvdW50KTsKIAkJCWRlbXV4LT50c2J1ZnAgKz0gY291bnQ7CiAJCQlnb3RvIGJhaWxvdXQ7CiAJCX0KIAkJbWVtY3B5KCZkZW11eC0+dHNidWZbaV0sIGJ1Ziwgaik7Ci0JCWlmICgoZGVtdXgtPnRzYnVmWzBdID09IDB4NDcpfChkZW11eC0+dHNidWZbMF09PTB4QjgpKSAgeworCQlpZiAoKGRlbXV4LT50c2J1ZlswXSA9PSAweDQ3KSB8IChkZW11eC0+dHNidWZbMF0gPT0gMHhCOCkpIHsKIAkJCW1lbWNweSh0bXBwYWNrLCBkZW11eC0+dHNidWYsIDE4OCk7Ci0JCQlpZiAodG1wcGFja1swXSA9PSAweEI4KSB0bXBwYWNrWzBdID0gMHg0NzsKKwkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpCisJCQkJdG1wcGFja1swXSA9IDB4NDc7CiAJCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldChkZW11eCwgdG1wcGFjayk7CiAJCX0KIAkJZGVtdXgtPnRzYnVmcCA9IDA7CkBAIC01MTAsMTYgKzQ4NCwxNyBAQAogCX0KIAogCXdoaWxlIChwIDwgY291bnQpIHsKLQkJaWYgKChidWZbcF0gPT0gMHg0Nyl8KGJ1ZltwXSA9PSAweEI4KSkgewotCQkJaWYgKGNvdW50LXAgPj0gMjA0KSB7Ci0JCQkJbWVtY3B5KHRtcHBhY2ssIGJ1ZitwLCAxODgpOwotCQkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpIHRtcHBhY2tbMF0gPSAweDQ3OworCQlpZiAoKGJ1ZltwXSA9PSAweDQ3KSB8IChidWZbcF0gPT0gMHhCOCkpIHsKKwkJCWlmIChjb3VudCAtIHAgPj0gMjA0KSB7CisJCQkJbWVtY3B5KHRtcHBhY2ssICZidWZbcF0sIDE4OCk7CisJCQkJaWYgKHRtcHBhY2tbMF0gPT0gMHhCOCkKKwkJCQkJdG1wcGFja1swXSA9IDB4NDc7CiAJCQkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXQoZGVtdXgsIHRtcHBhY2spOwogCQkJCXAgKz0gMjA0OwogCQkJfSBlbHNlIHsKLQkJCQlpID0gY291bnQtcDsKLQkJCQltZW1jcHkoZGVtdXgtPnRzYnVmLCBidWYrcCwgaSk7Ci0JCQkJZGVtdXgtPnRzYnVmcD1pOworCQkJCWkgPSBjb3VudCAtIHA7CisJCQkJbWVtY3B5KGRlbXV4LT50c2J1ZiwgJmJ1ZltwXSwgaSk7CisJCQkJZGVtdXgtPnRzYnVmcCA9IGk7CiAJCQkJZ290byBiYWlsb3V0OwogCQkJfQogCQl9IGVsc2UgewpAQCAtNTMwLDE0ICs1MDUsMTQgQEAKIGJhaWxvdXQ6CiAJc3Bpbl91bmxvY2soJmRlbXV4LT5sb2NrKTsKIH0KKwogRVhQT1JUX1NZTUJPTChkdmJfZG14X3N3ZmlsdGVyXzIwNCk7CiAKLQotc3RhdGljIHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICogZHZiX2RteF9maWx0ZXJfYWxsb2Moc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgpCitzdGF0aWMgc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmR2Yl9kbXhfZmlsdGVyX2FsbG9jKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4KQogewogCWludCBpOwogCi0JZm9yIChpPTA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBkZW11eC0+ZmlsdGVybnVtOyBpKyspCiAJCWlmIChkZW11eC0+ZmlsdGVyW2ldLnN0YXRlID09IERNWF9TVEFURV9GUkVFKQogCQkJYnJlYWs7CiAKQEAgLTU0OSwxMSArNTI0LDExIEBACiAJcmV0dXJuICZkZW11eC0+ZmlsdGVyW2ldOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl9kZW11eF9mZWVkICogZHZiX2RteF9mZWVkX2FsbG9jKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4KQorc3RhdGljIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiX2RteF9mZWVkX2FsbG9jKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4KQogewogCWludCBpOwogCi0JZm9yIChpPTA7IGk8ZGVtdXgtPmZlZWRudW07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmZlZWRudW07IGkrKykKIAkJaWYgKGRlbXV4LT5mZWVkW2ldLnN0YXRlID09IERNWF9TVEFURV9GUkVFKQogCQkJYnJlYWs7CiAKQEAgLTU4MSw3ICs1NTYsNyBAQAogCXNwaW5fbG9ja19pcnEoJmZlZWQtPmRlbXV4LT5sb2NrKTsKIAlpZiAoZHZiX2RlbXV4X2ZlZWRfZmluZChmZWVkKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmZWVkIGFscmVhZHkgaW4gbGlzdCAodHlwZT0leCBzdGF0ZT0leCBwaWQ9JXgpXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgZmVlZC0+dHlwZSwgZmVlZC0+c3RhdGUsIGZlZWQtPnBpZCk7CisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGZlZWQtPnR5cGUsIGZlZWQtPnN0YXRlLCBmZWVkLT5waWQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTU5NSw3ICs1NzAsNyBAQAogCXNwaW5fbG9ja19pcnEoJmZlZWQtPmRlbXV4LT5sb2NrKTsKIAlpZiAoIShkdmJfZGVtdXhfZmVlZF9maW5kKGZlZWQpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmZWVkIG5vdCBpbiBsaXN0ICh0eXBlPSV4IHN0YXRlPSV4IHBpZD0leClcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBmZWVkLT50eXBlLCBmZWVkLT5zdGF0ZSwgZmVlZC0+cGlkKTsKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZmVlZC0+dHlwZSwgZmVlZC0+c3RhdGUsIGZlZWQtPnBpZCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNjA0LDE4ICs1NzksMTcgQEAKIAlzcGluX3VubG9ja19pcnEoJmZlZWQtPmRlbXV4LT5sb2NrKTsKIH0KIAotc3RhdGljIGludCBkbXhfdHNfZmVlZF9zZXQgKHN0cnVjdCBkbXhfdHNfZmVlZCogdHNfZmVlZCwgdTE2IHBpZCwgaW50IHRzX3R5cGUsCi0JCSAgICAgZW51bSBkbXhfdHNfcGVzIHBlc190eXBlLCBzaXplX3QgY2FsbGJhY2tfbGVuZ3RoLAotCQkgICAgIHNpemVfdCBjaXJjdWxhcl9idWZmZXJfc2l6ZSwgaW50IGRlc2NyYW1ibGUsCi0JCSAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQpCitzdGF0aWMgaW50IGRteF90c19mZWVkX3NldChzdHJ1Y3QgZG14X3RzX2ZlZWQgKnRzX2ZlZWQsIHUxNiBwaWQsIGludCB0c190eXBlLAorCQkJICAgZW51bSBkbXhfdHNfcGVzIHBlc190eXBlLAorCQkJICAgc2l6ZV90IGNpcmN1bGFyX2J1ZmZlcl9zaXplLCBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIHRzX2ZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKXRzX2ZlZWQ7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAogCWlmIChwaWQgPiBETVhfTUFYX1BJRCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZGVtdXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZW11eC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKHRzX3R5cGUgJiBUU19ERUNPREVSKSB7CkBAIC02MzgsMjAgKzYxMiwxMyBAQAogCiAJZmVlZC0+cGlkID0gcGlkOwogCWZlZWQtPmJ1ZmZlcl9zaXplID0gY2lyY3VsYXJfYnVmZmVyX3NpemU7Ci0JZmVlZC0+ZGVzY3JhbWJsZSA9IGRlc2NyYW1ibGU7CiAJZmVlZC0+dGltZW91dCA9IHRpbWVvdXQ7Ci0JZmVlZC0+Y2JfbGVuZ3RoID0gY2FsbGJhY2tfbGVuZ3RoOwogCWZlZWQtPnRzX3R5cGUgPSB0c190eXBlOwogCWZlZWQtPnBlc190eXBlID0gcGVzX3R5cGU7CiAKLQlpZiAoZmVlZC0+ZGVzY3JhbWJsZSkgewotCQl1cCgmZGVtdXgtPm11dGV4KTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCiAJaWYgKGZlZWQtPmJ1ZmZlcl9zaXplKSB7CiAjaWZkZWYgTk9CVUZTCi0JCWZlZWQtPmJ1ZmZlcj1OVUxMOworCQlmZWVkLT5idWZmZXIgPSBOVUxMOwogI2Vsc2UKIAkJZmVlZC0+YnVmZmVyID0gdm1hbGxvYyhmZWVkLT5idWZmZXJfc2l6ZSk7CiAJCWlmICghZmVlZC0+YnVmZmVyKSB7CkBAIC02NjcsMTQgKzYzNCwxMyBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgZG14X3RzX2ZlZWRfc3RhcnRfZmlsdGVyaW5nKHN0cnVjdCBkbXhfdHNfZmVlZCogdHNfZmVlZCkKK3N0YXRpYyBpbnQgZG14X3RzX2ZlZWRfc3RhcnRfZmlsdGVyaW5nKHN0cnVjdCBkbXhfdHNfZmVlZCAqdHNfZmVlZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIHRzX2ZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKXRzX2ZlZWQ7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAlpbnQgcmV0OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmIChmZWVkLT5zdGF0ZSAhPSBETVhfU1RBVEVfUkVBRFkgfHwgZmVlZC0+dHlwZSAhPSBETVhfVFlQRV9UUykgewpAQCAtNzAxLDEzICs2NjcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkbXhfdHNfZmVlZF9zdG9wX2ZpbHRlcmluZyhzdHJ1Y3QgZG14X3RzX2ZlZWQqIHRzX2ZlZWQpCitzdGF0aWMgaW50IGRteF90c19mZWVkX3N0b3BfZmlsdGVyaW5nKHN0cnVjdCBkbXhfdHNfZmVlZCAqdHNfZmVlZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIHRzX2ZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKXRzX2ZlZWQ7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAlpbnQgcmV0OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmIChmZWVkLT5zdGF0ZSA8IERNWF9TVEFURV9HTykgewpAQCAtNzMxLDEzICs2OTcsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGR2YmRteF9hbGxvY2F0ZV90c19mZWVkIChzdHJ1Y3QgZG14X2RlbXV4ICpkbXgsIHN0cnVjdCBkbXhfdHNfZmVlZCAqKnRzX2ZlZWQsCi0JCQkgICAgIGRteF90c19jYiBjYWxsYmFjaykKK3N0YXRpYyBpbnQgZHZiZG14X2FsbG9jYXRlX3RzX2ZlZWQoc3RydWN0IGRteF9kZW11eCAqZG14LAorCQkJCSAgIHN0cnVjdCBkbXhfdHNfZmVlZCAqKnRzX2ZlZWQsCisJCQkJICAgZG14X3RzX2NiIGNhbGxiYWNrKQogewotCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZG14OworCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkbXg7CiAJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmICghKGZlZWQgPSBkdmJfZG14X2ZlZWRfYWxsb2MoZGVtdXgpKSkgewpAQCAtNzYwLDcgKzcyNyw2IEBACiAJKCp0c19mZWVkKS0+c3RvcF9maWx0ZXJpbmcgPSBkbXhfdHNfZmVlZF9zdG9wX2ZpbHRlcmluZzsKIAkoKnRzX2ZlZWQpLT5zZXQgPSBkbXhfdHNfZmVlZF9zZXQ7CiAKLQogCWlmICghKGZlZWQtPmZpbHRlciA9IGR2Yl9kbXhfZmlsdGVyX2FsbG9jKGRlbXV4KSkpIHsKIAkJZmVlZC0+c3RhdGUgPSBETVhfU1RBVEVfRlJFRTsKIAkJdXAoJmRlbXV4LT5tdXRleCk7CkBAIC03NzYsMjIgKzc0MiwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR2YmRteF9yZWxlYXNlX3RzX2ZlZWQoc3RydWN0IGRteF9kZW11eCAqZG14LCBzdHJ1Y3QgZG14X3RzX2ZlZWQgKnRzX2ZlZWQpCitzdGF0aWMgaW50IGR2YmRteF9yZWxlYXNlX3RzX2ZlZWQoc3RydWN0IGRteF9kZW11eCAqZG14LAorCQkJCSAgc3RydWN0IGRteF90c19mZWVkICp0c19mZWVkKQogewotCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZG14OwotCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKikgdHNfZmVlZDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZG14OworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKil0c19mZWVkOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmIChmZWVkLT5zdGF0ZSA9PSBETVhfU1RBVEVfRlJFRSkgewogCQl1cCgmZGVtdXgtPm11dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCiAjaWZuZGVmIE5PQlVGUwogCXZmcmVlKGZlZWQtPmJ1ZmZlcik7Ci0JZmVlZC0+YnVmZmVyPTA7CisJZmVlZC0+YnVmZmVyID0gTlVMTDsKICNlbmRpZgogCiAJZmVlZC0+c3RhdGUgPSBETVhfU1RBVEVfRlJFRTsKQEAgLTgwOCwxOSArNzc0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZG14X3NlY3Rpb25fZmVlZCBBUEkgY2FsbHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgZG14X3NlY3Rpb25fZmVlZF9hbGxvY2F0ZV9maWx0ZXIoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQsCi0JCQkJICAgICBzdHJ1Y3QgZG14X3NlY3Rpb25fZmlsdGVyKiogZmlsdGVyKQorc3RhdGljIGludCBkbXhfc2VjdGlvbl9mZWVkX2FsbG9jYXRlX2ZpbHRlcihzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqZmVlZCwKKwkJCQkJICAgIHN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgKipmaWx0ZXIpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSBmZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKilmZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmR2YmRteGZpbHRlcjsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkdmJkZW11eC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRlbXV4LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlkdmJkbXhmaWx0ZXIgPSBkdmJfZG14X2ZpbHRlcl9hbGxvYyhkdmJkZW11eCk7CkBAIC04NDQsMzYgKzgwOSwyOSBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgZG14X3NlY3Rpb25fZmVlZF9zZXQoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQsCi0JCQkgdTE2IHBpZCwgc2l6ZV90IGNpcmN1bGFyX2J1ZmZlcl9zaXplLAotCQkJIGludCBkZXNjcmFtYmxlLCBpbnQgY2hlY2tfY3JjKQorc3RhdGljIGludCBkbXhfc2VjdGlvbl9mZWVkX3NldChzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqZmVlZCwKKwkJCQl1MTYgcGlkLCBzaXplX3QgY2lyY3VsYXJfYnVmZmVyX3NpemUsCisJCQkJaW50IGNoZWNrX2NyYykKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIGZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKWZlZWQ7CiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAKIAlpZiAocGlkID4gMHgxZmZmKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkdmJkbXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkdmJkbXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWR2Yl9kZW11eF9mZWVkX2FkZChkdmJkbXhmZWVkKTsKIAogCWR2YmRteGZlZWQtPnBpZCA9IHBpZDsKIAlkdmJkbXhmZWVkLT5idWZmZXJfc2l6ZSA9IGNpcmN1bGFyX2J1ZmZlcl9zaXplOwotCWR2YmRteGZlZWQtPmRlc2NyYW1ibGUgPSBkZXNjcmFtYmxlOwotCWlmIChkdmJkbXhmZWVkLT5kZXNjcmFtYmxlKSB7Ci0JCXVwKCZkdmJkbXgtPm11dGV4KTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCiAJZHZiZG14ZmVlZC0+ZmVlZC5zZWMuY2hlY2tfY3JjID0gY2hlY2tfY3JjOwogCiAjaWZkZWYgTk9CVUZTCiAJZHZiZG14ZmVlZC0+YnVmZmVyID0gTlVMTDsKICNlbHNlCi0JZHZiZG14ZmVlZC0+YnVmZmVyPXZtYWxsb2MoZHZiZG14ZmVlZC0+YnVmZmVyX3NpemUpOworCWR2YmRteGZlZWQtPmJ1ZmZlciA9IHZtYWxsb2MoZHZiZG14ZmVlZC0+YnVmZmVyX3NpemUpOwogCWlmICghZHZiZG14ZmVlZC0+YnVmZmVyKSB7CiAJCXVwKCZkdmJkbXgtPm11dGV4KTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC04ODUsNyArODQzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBwcmVwYXJlX3NlY2ZpbHRlcnMoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQogewogCWludCBpOwpAQCAtODkzLDEyICs4NTAsMTIgQEAKIAlzdHJ1Y3QgZG14X3NlY3Rpb25fZmlsdGVyICpzZjsKIAl1OCBtYXNrLCBtb2RlLCBkb25lcTsKIAotCWlmICghKGY9ZHZiZG14ZmVlZC0+ZmlsdGVyKSkKKwlpZiAoIShmID0gZHZiZG14ZmVlZC0+ZmlsdGVyKSkKIAkJcmV0dXJuOwogCWRvIHsKIAkJc2YgPSAmZi0+ZmlsdGVyOwogCQlkb25lcSA9IDA7Ci0JCWZvciAoaT0wOyBpPERWQl9ERU1VWF9NQVNLX01BWDsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBEVkJfREVNVVhfTUFTS19NQVg7IGkrKykgewogCQkJbW9kZSA9IHNmLT5maWx0ZXJfbW9kZVtpXTsKIAkJCW1hc2sgPSBzZi0+ZmlsdGVyX21hc2tbaV07CiAJCQlmLT5tYXNrYW5kbW9kZVtpXSA9IG1hc2sgJiBtb2RlOwpAQCAtOTA4LDE0ICs4NjUsMTMgQEAKIAl9IHdoaWxlICgoZiA9IGYtPm5leHQpKTsKIH0KIAotCiBzdGF0aWMgaW50IGRteF9zZWN0aW9uX2ZlZWRfc3RhcnRfZmlsdGVyaW5nKHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICpmZWVkKQogewotCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKikgZmVlZDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopZmVlZDsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlpbnQgcmV0OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRteC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRteC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKGZlZWQtPmlzX2ZpbHRlcmluZykgewpAQCAtOTU0LDE0ICs5MTAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGRteF9zZWN0aW9uX2ZlZWRfc3RvcF9maWx0ZXJpbmcoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQqIGZlZWQpCitzdGF0aWMgaW50IGRteF9zZWN0aW9uX2ZlZWRfc3RvcF9maWx0ZXJpbmcoc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgKmZlZWQpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSBmZWVkOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKilmZWVkOwogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCWludCByZXQ7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZG14LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZG14LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoIWR2YmRteC0+c3RvcF9mZWVkKSB7CkBAIC05ODAsMTUgKzkzNSwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIGludCBkbXhfc2VjdGlvbl9mZWVkX3JlbGVhc2VfZmlsdGVyKHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICpmZWVkLAotCQkJCXN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIqIGZpbHRlcikKKwkJCQkJICAgc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlciAqZmlsdGVyKQogewotCXN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpkdmJkbXhmaWx0ZXIgPSAoc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKikgZmlsdGVyLCAqZjsKLQlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopIGZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmR2YmRteGZpbHRlciA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqKWZpbHRlciwgKmY7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkID0gKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKWZlZWQ7CiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZG14LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZG14LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoZHZiZG14ZmlsdGVyLT5mZWVkICE9IGR2YmRteGZlZWQpIHsKQEAgLTEwMDUsNyArOTU5LDcgQEAKIAlpZiAoZiA9PSBkdmJkbXhmaWx0ZXIpIHsKIAkJZHZiZG14ZmVlZC0+ZmlsdGVyID0gZHZiZG14ZmlsdGVyLT5uZXh0OwogCX0gZWxzZSB7Ci0JCXdoaWxlKGYtPm5leHQgIT0gZHZiZG14ZmlsdGVyKQorCQl3aGlsZSAoZi0+bmV4dCAhPSBkdmJkbXhmaWx0ZXIpCiAJCQlmID0gZi0+bmV4dDsKIAkJZi0+bmV4dCA9IGYtPm5leHQtPm5leHQ7CiAJfQpAQCAtMTAyMCwxMCArOTc0LDEwIEBACiAJCQkJCXN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICoqZmVlZCwKIAkJCQkJZG14X3NlY3Rpb25fY2IgY2FsbGJhY2spCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQ7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZG14LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZG14LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoIShkdmJkbXhmZWVkID0gZHZiX2RteF9mZWVkX2FsbG9jKGR2YmRteCkpKSB7CkBAIC0xMDQxLDcgKzk5NSw3IEBACiAJZHZiZG14ZmVlZC0+ZmlsdGVyID0gTlVMTDsKIAlkdmJkbXhmZWVkLT5idWZmZXIgPSBOVUxMOwogCi0JKCpmZWVkKT0mZHZiZG14ZmVlZC0+ZmVlZC5zZWM7CisJKCpmZWVkKSA9ICZkdmJkbXhmZWVkLT5mZWVkLnNlYzsKIAkoKmZlZWQpLT5pc19maWx0ZXJpbmcgPSAwOwogCSgqZmVlZCktPnBhcmVudCA9IGRlbXV4OwogCSgqZmVlZCktPnByaXYgPSBOVUxMOwpAQCAtMTA1OSwyMSArMTAxMywyMSBAQAogc3RhdGljIGludCBkdmJkbXhfcmVsZWFzZV9zZWN0aW9uX2ZlZWQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsCiAJCQkJICAgICAgIHN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkICpmZWVkKQogewotCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCA9IChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKikgZmVlZDsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQgPSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopZmVlZDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRteC0+bXV0ZXgpKQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmR2YmRteC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JaWYgKGR2YmRteGZlZWQtPnN0YXRlPT1ETVhfU1RBVEVfRlJFRSkgeworCWlmIChkdmJkbXhmZWVkLT5zdGF0ZSA9PSBETVhfU1RBVEVfRlJFRSkgewogCQl1cCgmZHZiZG14LT5tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KICNpZm5kZWYgTk9CVUZTCiAJdmZyZWUoZHZiZG14ZmVlZC0+YnVmZmVyKTsKLQlkdmJkbXhmZWVkLT5idWZmZXI9MDsKKwlkdmJkbXhmZWVkLT5idWZmZXIgPSBOVUxMOwogI2VuZGlmCi0JZHZiZG14ZmVlZC0+c3RhdGU9RE1YX1NUQVRFX0ZSRUU7CisJZHZiZG14ZmVlZC0+c3RhdGUgPSBETVhfU1RBVEVfRlJFRTsKIAogCWR2Yl9kZW11eF9mZWVkX2RlbChkdmJkbXhmZWVkKTsKIApAQCAtMTA4MywxNCArMTAzNywxMyBAQAogCXJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGR2Yl9kZW11eCBrZXJuZWwgZGF0YSBBUEkgY2FsbHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQgZHZiZG14X29wZW4oc3RydWN0IGRteF9kZW11eCAqZGVtdXgpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAKIAlpZiAoZHZiZGVtdXgtPnVzZXJzID49IE1BWF9EVkJfREVNVVhfVVNFUlMpCiAJCXJldHVybiAtRVVTRVJTOwpAQCAtMTA5OSwxMCArMTA1Miw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBkdmJkbXhfY2xvc2Uoc3RydWN0IGRteF9kZW11eCAqZGVtdXgpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAKIAlpZiAoZHZiZGVtdXgtPnVzZXJzID09IDApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTExMiwxNSArMTA2NCwxNCBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgZHZiZG14X3dyaXRlKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eD0oc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAKIAlpZiAoKCFkZW11eC0+ZnJvbnRlbmQpIHx8IChkZW11eC0+ZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZGVtdXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkdmJkZW11eC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCWR2Yl9kbXhfc3dmaWx0ZXIoZHZiZGVtdXgsIGJ1ZiwgY291bnQpOwogCXVwKCZkdmJkZW11eC0+bXV0ZXgpOwpAQCAtMTEzMCwxMCArMTA4MSwxMCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotCi1zdGF0aWMgaW50IGR2YmRteF9hZGRfZnJvbnRlbmQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIHN0cnVjdCBkbXhfZnJvbnRlbmQgKmZyb250ZW5kKQorc3RhdGljIGludCBkdmJkbXhfYWRkX2Zyb250ZW5kKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4LAorCQkJICAgICAgIHN0cnVjdCBkbXhfZnJvbnRlbmQgKmZyb250ZW5kKQogewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZHZiZGVtdXgtPmZyb250ZW5kX2xpc3Q7CiAKIAlsaXN0X2FkZCgmKGZyb250ZW5kLT5jb25uZWN0aXZpdHlfbGlzdCksIGhlYWQpOwpAQCAtMTE0MSwxMyArMTA5MiwxMyBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgZHZiZG14X3JlbW92ZV9mcm9udGVuZChzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCwgc3RydWN0IGRteF9mcm9udGVuZCAqZnJvbnRlbmQpCitzdGF0aWMgaW50IGR2YmRteF9yZW1vdmVfZnJvbnRlbmQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsCisJCQkJICBzdHJ1Y3QgZG14X2Zyb250ZW5kICpmcm9udGVuZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRlbXV4OworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuLCAqaGVhZCA9ICZkdmJkZW11eC0+ZnJvbnRlbmRfbGlzdDsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZSAocG9zLCBuLCBoZWFkKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgaGVhZCkgewogCQlpZiAoRE1YX0ZFX0VOVFJZKHBvcykgPT0gZnJvbnRlbmQpIHsKIAkJCWxpc3RfZGVsKHBvcyk7CiAJCQlyZXR1cm4gMDsKQEAgLTExNTcsMjUgKzExMDgsMjUgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqIGR2YmRteF9nZXRfZnJvbnRlbmRzKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4KQorc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmR2YmRteF9nZXRfZnJvbnRlbmRzKHN0cnVjdCBkbXhfZGVtdXggKmRlbXV4KQogewotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKikgZGVtdXg7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKWRlbXV4OwogCiAJaWYgKGxpc3RfZW1wdHkoJmR2YmRlbXV4LT5mcm9udGVuZF9saXN0KSkKIAkJcmV0dXJuIE5VTEw7CisKIAlyZXR1cm4gJmR2YmRlbXV4LT5mcm9udGVuZF9saXN0OwogfQogCi0KLXN0YXRpYyBpbnQgZHZiZG14X2Nvbm5lY3RfZnJvbnRlbmQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIHN0cnVjdCBkbXhfZnJvbnRlbmQgKmZyb250ZW5kKQorc3RhdGljIGludCBkdmJkbXhfY29ubmVjdF9mcm9udGVuZChzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCwKKwkJCQkgICBzdHJ1Y3QgZG14X2Zyb250ZW5kICpmcm9udGVuZCkKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRlbXV4OworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAogCWlmIChkZW11eC0+ZnJvbnRlbmQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRlbXV4LT5tdXRleCkpCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHZiZGVtdXgtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWRlbXV4LT5mcm9udGVuZCA9IGZyb250ZW5kOwpAQCAtMTE4MywxMiArMTEzNCwxMSBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgZHZiZG14X2Rpc2Nvbm5lY3RfZnJvbnRlbmQoc3RydWN0IGRteF9kZW11eCAqZGVtdXgpCiB7Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAoc3RydWN0IGR2Yl9kZW11eCAqKSBkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopZGVtdXg7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZGVtdXgtPm11dGV4KSkKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkdmJkZW11eC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJZGVtdXgtPmZyb250ZW5kID0gTlVMTDsKQEAgLTExOTYsNDQgKzExNDYsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGR2YmRteF9nZXRfcGVzX3BpZHMoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIHUxNiAqcGlkcykKK3N0YXRpYyBpbnQgZHZiZG14X2dldF9wZXNfcGlkcyhzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCwgdTE2ICogcGlkcykKIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9IChzdHJ1Y3QgZHZiX2RlbXV4ICopIGRlbXV4OworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAotCW1lbWNweShwaWRzLCBkdmJkZW11eC0+cGlkcywgNSpzaXplb2YodTE2KSk7CisJbWVtY3B5KHBpZHMsIGR2YmRlbXV4LT5waWRzLCA1ICogc2l6ZW9mKHUxNikpOwogCXJldHVybiAwOwogfQogCi0KIGludCBkdmJfZG14X2luaXQoc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgpCiB7Ci0JaW50IGksIGVycjsKKwlpbnQgaTsKIAlzdHJ1Y3QgZG14X2RlbXV4ICpkbXggPSAmZHZiZGVtdXgtPmRteDsKIAogCWR2YmRlbXV4LT51c2VycyA9IDA7Ci0JZHZiZGVtdXgtPmZpbHRlciA9IHZtYWxsb2MoZHZiZGVtdXgtPmZpbHRlcm51bSpzaXplb2Yoc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIpKTsKKwlkdmJkZW11eC0+ZmlsdGVyID0gdm1hbGxvYyhkdmJkZW11eC0+ZmlsdGVybnVtICogc2l6ZW9mKHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyKSk7CiAKIAlpZiAoIWR2YmRlbXV4LT5maWx0ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZHZiZGVtdXgtPmZlZWQgPSB2bWFsbG9jKGR2YmRlbXV4LT5mZWVkbnVtKnNpemVvZihzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQpKTsKKwlkdmJkZW11eC0+ZmVlZCA9IHZtYWxsb2MoZHZiZGVtdXgtPmZlZWRudW0gKiBzaXplb2Yoc3RydWN0IGR2Yl9kZW11eF9mZWVkKSk7CiAJaWYgKCFkdmJkZW11eC0+ZmVlZCkgewogCQl2ZnJlZShkdmJkZW11eC0+ZmlsdGVyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWZvciAoaT0wOyBpPGR2YmRlbXV4LT5maWx0ZXJudW07IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkdmJkZW11eC0+ZmlsdGVybnVtOyBpKyspIHsKIAkJZHZiZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9IERNWF9TVEFURV9GUkVFOwogCQlkdmJkZW11eC0+ZmlsdGVyW2ldLmluZGV4ID0gaTsKIAl9Ci0JZm9yIChpPTA7IGk8ZHZiZGVtdXgtPmZlZWRudW07IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkdmJkZW11eC0+ZmVlZG51bTsgaSsrKSB7CiAJCWR2YmRlbXV4LT5mZWVkW2ldLnN0YXRlID0gRE1YX1NUQVRFX0ZSRUU7CiAJCWR2YmRlbXV4LT5mZWVkW2ldLmluZGV4ID0gaTsKIAl9Ci0JZHZiZGVtdXgtPmZyb250ZW5kX2xpc3QubmV4dD0KLQkgIGR2YmRlbXV4LT5mcm9udGVuZF9saXN0LnByZXY9Ci0JICAgICZkdmJkZW11eC0+ZnJvbnRlbmRfbGlzdDsKLQlmb3IgKGk9MDsgaTxETVhfVFNfUEVTX09USEVSOyBpKyspIHsKKworCUlOSVRfTElTVF9IRUFEKCZkdmJkZW11eC0+ZnJvbnRlbmRfbGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1YX1RTX1BFU19PVEhFUjsgaSsrKSB7CiAJCWR2YmRlbXV4LT5wZXNmaWx0ZXJbaV0gPSBOVUxMOwogCQlkdmJkZW11eC0+cGlkc1tpXSA9IDB4ZmZmZjsKIAl9CkBAIC0xMjQ3LDEyICsxMTk1LDExIEBACiAJaWYgKCFkdmJkZW11eC0+Y2hlY2tfY3JjMzIpCiAJCWR2YmRlbXV4LT5jaGVja19jcmMzMiA9IGR2Yl9kbXhfY3JjMzI7CiAKLQkgaWYgKCFkdmJkZW11eC0+bWVtY29weSkKLQkJIGR2YmRlbXV4LT5tZW1jb3B5ID0gZHZiX2RteF9tZW1jb3B5OworCWlmICghZHZiZGVtdXgtPm1lbWNvcHkpCisJCWR2YmRlbXV4LT5tZW1jb3B5ID0gZHZiX2RteF9tZW1jb3B5OwogCiAJZG14LT5mcm9udGVuZCA9IE5VTEw7Ci0JZG14LT5yZWdfbGlzdC5wcmV2ID0gZG14LT5yZWdfbGlzdC5uZXh0ID0gJmRteC0+cmVnX2xpc3Q7Ci0JZG14LT5wcml2ID0gKHZvaWQgKikgZHZiZGVtdXg7CisJZG14LT5wcml2ID0gZHZiZGVtdXg7CiAJZG14LT5vcGVuID0gZHZiZG14X29wZW47CiAJZG14LT5jbG9zZSA9IGR2YmRteF9jbG9zZTsKIAlkbXgtPndyaXRlID0gZHZiZG14X3dyaXRlOwpAQCAtMTI2MSw5ICsxMjA4LDYgQEAKIAlkbXgtPmFsbG9jYXRlX3NlY3Rpb25fZmVlZCA9IGR2YmRteF9hbGxvY2F0ZV9zZWN0aW9uX2ZlZWQ7CiAJZG14LT5yZWxlYXNlX3NlY3Rpb25fZmVlZCA9IGR2YmRteF9yZWxlYXNlX3NlY3Rpb25fZmVlZDsKIAotCWRteC0+ZGVzY3JhbWJsZV9tYWNfYWRkcmVzcyA9IE5VTEw7Ci0JZG14LT5kZXNjcmFtYmxlX3NlY3Rpb25fcGF5bG9hZCA9IE5VTEw7Ci0KIAlkbXgtPmFkZF9mcm9udGVuZCA9IGR2YmRteF9hZGRfZnJvbnRlbmQ7CiAJZG14LT5yZW1vdmVfZnJvbnRlbmQgPSBkdmJkbXhfcmVtb3ZlX2Zyb250ZW5kOwogCWRteC0+Z2V0X2Zyb250ZW5kcyA9IGR2YmRteF9nZXRfZnJvbnRlbmRzOwpAQCAtMTI3NCwyMSArMTIxOCwxNSBAQAogCXNlbWFfaW5pdCgmZHZiZGVtdXgtPm11dGV4LCAxKTsKIAlzcGluX2xvY2tfaW5pdCgmZHZiZGVtdXgtPmxvY2spOwogCi0JaWYgKChlcnIgPSBkbXhfcmVnaXN0ZXJfZGVtdXgoZG14KSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCiAJcmV0dXJuIDA7CiB9CisKIEVYUE9SVF9TWU1CT0woZHZiX2RteF9pbml0KTsKIAotCi1pbnQgZHZiX2RteF9yZWxlYXNlKHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4KQordm9pZCBkdmJfZG14X3JlbGVhc2Uoc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgpCiB7Ci0Jc3RydWN0IGRteF9kZW11eCAqZG14ID0gJmR2YmRlbXV4LT5kbXg7Ci0KLQlkbXhfdW5yZWdpc3Rlcl9kZW11eChkbXgpOwogCXZmcmVlKGR2YmRlbXV4LT5maWx0ZXIpOwogCXZmcmVlKGR2YmRlbXV4LT5mZWVkKTsKLQlyZXR1cm4gMDsKIH0KKwogRVhQT1JUX1NZTUJPTChkdmJfZG14X3JlbGVhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguaAppbmRleCBjMDliZWIzLi4wY2M4ODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguaApAQCAtMjAsNyArMjAsNiBAQAogICoKICAqLwogCi0KICNpZm5kZWYgX0RWQl9ERU1VWF9IXwogI2RlZmluZSBfRFZCX0RFTVVYX0hfCiAKQEAgLTQ0LDEwMyArNDMsOTggQEAKICNkZWZpbmUgRFZCX0RFTVVYX01BU0tfTUFYIDE4CiAKIHN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyIHsKLSAgICAgICAgc3RydWN0IGRteF9zZWN0aW9uX2ZpbHRlciBmaWx0ZXI7Ci0gICAgICAgIHU4IG1hc2thbmRtb2RlICAgIFtETVhfTUFYX0ZJTFRFUl9TSVpFXTsKLSAgICAgICAgdTggbWFza2FuZG5vdG1vZGUgW0RNWF9NQVhfRklMVEVSX1NJWkVdOworCXN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgZmlsdGVyOworCXU4IG1hc2thbmRtb2RlW0RNWF9NQVhfRklMVEVSX1NJWkVdOworCXU4IG1hc2thbmRub3Rtb2RlW0RNWF9NQVhfRklMVEVSX1NJWkVdOwogCWludCBkb25lcTsKIAotICAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqbmV4dDsKLSAgICAgICAgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOwotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIGludCBzdGF0ZTsKLSAgICAgICAgaW50IHR5cGU7Ci0JaW50IHBlc3RvOworCXN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpuZXh0OworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZDsKKwlpbnQgaW5kZXg7CisJaW50IHN0YXRlOworCWludCB0eXBlOwogCi0gICAgICAgIHUxNiBoYW5kbGU7Ci0gICAgICAgIHUxNiBod19oYW5kbGU7Ci0gICAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotCWludCB0c19zdGF0ZTsKKwl1MTYgaHdfaGFuZGxlOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogfTsKIAotCiAjZGVmaW5lIERNWF9GRUVEX0VOVFJZKHBvcykgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCwgbGlzdF9oZWFkKQogCiBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgewotICAgICAgICB1bmlvbiB7Ci0JICAgICAgICBzdHJ1Y3QgZG14X3RzX2ZlZWQgdHM7Ci0JICAgICAgICBzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCBzZWM7CisJdW5pb24geworCQlzdHJ1Y3QgZG14X3RzX2ZlZWQgdHM7CisJCXN0cnVjdCBkbXhfc2VjdGlvbl9mZWVkIHNlYzsKIAl9IGZlZWQ7CiAKLSAgICAgICAgdW5pb24gewotCSAgICAgICAgZG14X3RzX2NiIHRzOwotCSAgICAgICAgZG14X3NlY3Rpb25fY2Igc2VjOworCXVuaW9uIHsKKwkJZG14X3RzX2NiIHRzOworCQlkbXhfc2VjdGlvbl9jYiBzZWM7CiAJfSBjYjsKIAotICAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eDsKIAl2b2lkICpwcml2OwotICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgaW50IHN0YXRlOwotICAgICAgICB1MTYgcGlkOwotICAgICAgICB1OCAqYnVmZmVyOwotICAgICAgICBpbnQgYnVmZmVyX3NpemU7Ci0gICAgICAgIGludCBkZXNjcmFtYmxlOworCWludCB0eXBlOworCWludCBzdGF0ZTsKKwl1MTYgcGlkOworCXU4ICpidWZmZXI7CisJaW50IGJ1ZmZlcl9zaXplOwogCi0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0OwotICAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZmlsdGVyOwotICAgICAgICBpbnQgY2JfbGVuZ3RoOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0OworCXN0cnVjdCBkdmJfZGVtdXhfZmlsdGVyICpmaWx0ZXI7CiAKLSAgICAgICAgaW50IHRzX3R5cGU7Ci0gICAgICAgIGVudW0gZG14X3RzX3BlcyBwZXNfdHlwZTsKKwlpbnQgdHNfdHlwZTsKKwllbnVtIGRteF90c19wZXMgcGVzX3R5cGU7CiAKLSAgICAgICAgaW50IGNjOwotICAgICAgICBpbnQgcHVzaV9zZWVuOyAvKiBwcmV2ZW50cyBmZWVkaW5nIG9mIGdhcmJhZ2UgZnJvbSBwcmV2aW91cyBzZWN0aW9uICovCisJaW50IGNjOworCWludCBwdXNpX3NlZW47CQkvKiBwcmV2ZW50cyBmZWVkaW5nIG9mIGdhcmJhZ2UgZnJvbSBwcmV2aW91cyBzZWN0aW9uICovCiAKLSAgICAgICAgdTE2IHBlc2xlbjsKKwl1MTYgcGVzbGVuOwogCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2hlYWQ7Ci0JCWludCBpbmRleDsgLyogYSB1bmlxdWUgaW5kZXggZm9yIGVhY2ggZmVlZCAoY2FuIGJlIHVzZWQgYXMgaGFyZHdhcmUgcGlkIGZpbHRlciBpbmRleCkgKi8KKwl1bnNpZ25lZCBpbnQgaW5kZXg7CS8qIGEgdW5pcXVlIGluZGV4IGZvciBlYWNoIGZlZWQgKGNhbiBiZSB1c2VkIGFzIGhhcmR3YXJlIHBpZCBmaWx0ZXIgaW5kZXgpICovCiB9OwogCiBzdHJ1Y3QgZHZiX2RlbXV4IHsKLSAgICAgICAgc3RydWN0IGRteF9kZW11eCBkbXg7Ci0gICAgICAgIHZvaWQgKnByaXY7Ci0gICAgICAgIGludCBmaWx0ZXJudW07Ci0gICAgICAgIGludCBmZWVkbnVtOwotICAgICAgICBpbnQgKCpzdGFydF9mZWVkKSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKTsKLSAgICAgICAgaW50ICgqc3RvcF9mZWVkKSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKTsKLSAgICAgICAgaW50ICgqd3JpdGVfdG9fZGVjb2RlcikgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwlzdHJ1Y3QgZG14X2RlbXV4IGRteDsKKwl2b2lkICpwcml2OworCWludCBmaWx0ZXJudW07CisJaW50IGZlZWRudW07CisJaW50ICgqc3RhcnRfZmVlZCkoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKTsKKwlpbnQgKCpzdG9wX2ZlZWQpKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCk7CisJaW50ICgqd3JpdGVfdG9fZGVjb2Rlcikoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLAogCQkJCSBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKLQl1MzIgKCpjaGVja19jcmMzMikgKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwl1MzIgKCpjaGVja19jcmMzMikoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLAogCQkJICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOwotCXZvaWQgKCptZW1jb3B5KSAoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCB1OCAqZHN0LAorCXZvaWQgKCptZW1jb3B5KShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsIHU4ICpkc3QsCiAJCQkgY29uc3QgdTggKnNyYywgc2l6ZV90IGxlbik7CiAKLSAgICAgICAgaW50IHVzZXJzOworCWludCB1c2VyczsKICNkZWZpbmUgTUFYX0RWQl9ERU1VWF9VU0VSUyAxMAotICAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZmlsdGVyOwotICAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQ7CiAKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBmcm9udGVuZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZnJvbnRlbmRfbGlzdDsKIAotICAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKnBlc2ZpbHRlcltETVhfVFNfUEVTX09USEVSXTsKLSAgICAgICAgdTE2IHBpZHNbRE1YX1RTX1BFU19PVEhFUl07Ci0gICAgICAgIGludCBwbGF5aW5nOwotICAgICAgICBpbnQgcmVjb3JkaW5nOworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqcGVzZmlsdGVyW0RNWF9UU19QRVNfT1RIRVJdOworCXUxNiBwaWRzW0RNWF9UU19QRVNfT1RIRVJdOworCWludCBwbGF5aW5nOworCWludCByZWNvcmRpbmc7CiAKICNkZWZpbmUgRE1YX01BWF9QSUQgMHgyMDAwCiAJc3RydWN0IGxpc3RfaGVhZCBmZWVkX2xpc3Q7Ci0gICAgICAgIHU4IHRzYnVmWzIwNF07Ci0gICAgICAgIGludCB0c2J1ZnA7CisJdTggdHNidWZbMjA0XTsKKwlpbnQgdHNidWZwOwogCiAJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKIAlzcGlubG9ja190IGxvY2s7CiB9OwogCi0KIGludCBkdmJfZG14X2luaXQoc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgpOwotaW50IGR2Yl9kbXhfcmVsZWFzZShzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCk7Ci12b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyhzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXgsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudCk7Cit2b2lkIGR2Yl9kbXhfcmVsZWFzZShzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCk7Cit2b2lkIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyhzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXgsIGNvbnN0IHU4ICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQpOwogdm9pZCBkdmJfZG14X3N3ZmlsdGVyKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4LCBjb25zdCB1OCAqYnVmLCBzaXplX3QgY291bnQpOwotdm9pZCBkdmJfZG14X3N3ZmlsdGVyXzIwNChzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgZHZiX2RteF9zd2ZpbHRlcl8yMDQoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsIGNvbnN0IHU4ICpidWYsCisJCQkgIHNpemVfdCBjb3VudCk7CiAKICNlbmRpZiAvKiBfRFZCX0RFTVVYX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggNmE5NjhjMy4uODc5MzU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwpAQCAtNjIsNyArNjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlICJkdmJfZGVtdXguaCIKICNpbmNsdWRlICJkdmJfbmV0LmgiCkBAIC0xNzEsMTEgKzE3MCw3IEBACiAKIAlza2ItPm1hYy5yYXc9c2tiLT5kYXRhOwogCXNrYl9wdWxsKHNrYixkZXYtPmhhcmRfaGVhZGVyX2xlbik7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQotCWV0aCA9IHNrYi0+bWFjLmV0aGVybmV0OwotI2Vsc2UKIAlldGggPSBldGhfaGRyKHNrYik7Ci0jZW5kaWYKIAogCWlmICgqZXRoLT5oX2Rlc3QgJiAxKSB7CiAJCWlmKG1lbWNtcChldGgtPmhfZGVzdCxkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pPT0wKQpAQCAtOTA4LDcgKzkwMyw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJcmV0ID0gcHJpdi0+c2VjZmVlZC0+c2V0KHByaXYtPnNlY2ZlZWQsIHByaXYtPnBpZCwgMzI3NjgsIDAsIDEpOworCQlyZXQgPSBwcml2LT5zZWNmZWVkLT5zZXQocHJpdi0+c2VjZmVlZCwgcHJpdi0+cGlkLCAzMjc2OCwgMSk7CiAKIAkJaWYgKHJldDwwKSB7CiAJCQlwcmludGsoIiVzOiBjb3VsZCBub3Qgc2V0IHNlY3Rpb24gZmVlZFxuIiwgZGV2LT5uYW1lKTsKQEAgLTk2MCw5ICs5NTUsNyBAQAogCQlwcml2LT50c2ZlZWQtPnByaXYgPSAodm9pZCAqKWRldjsKIAkJcmV0ID0gcHJpdi0+dHNmZWVkLT5zZXQocHJpdi0+dHNmZWVkLCBwcml2LT5waWQsCiAJCQkJCVRTX1BBQ0tFVCwgRE1YX1RTX1BFU19PVEhFUiwKLQkJCQkJMTg4ICogMTAwLCAvKiBuci4gb2YgYnl0ZXMgZGVsaXZlcmVkIHBlciBjYWxsYmFjayAqLwogCQkJCQkzMjc2OCwgICAgIC8qIGNpcmN1bGFyIGJ1ZmZlciBzaXplICovCi0JCQkJCTAsICAgICAgICAgLyogZGVzY3JhbWJsZSAqLwogCQkJCQl0aW1lb3V0KTsKIAogCQlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCmluZGV4IDYxMmU1YjAuLjU0ZTJiMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKQEAgLTkzLDEzICs5MywzMCBAQAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBOZWJ1bGEgRWxlY3Ryb25pY3MgdURpZ2l0ViBVU0IyLjAgRFZCLVQgcmVjZWl2ZXIuCiAKIGNvbmZpZyBEVkJfVVNCX1ZQNzA0NQotCXRyaXN0YXRlICJUd2luaGFuRFRWIEFscGhhL01hZ2ljQm94SUkgYW5kIEROVFYgdGlueVVTQjIgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCisJdHJpc3RhdGUgIlR3aW5oYW5EVFYgQWxwaGEvTWFnaWNCb3hJSSwgRE5UViB0aW55VVNCMiwgQmVldGxlIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUKKwogCSAgICBUd2luaGFuRFRWIEFscGhhIChzdGljaykgKFZQLTcwNDUpLAotCQlUd2luaGFuRFRWIE1hZ2ljQm94IElJIChWUC03MDQ2KSBhbmQKLQkJRGlnaXRhbE5vdyBUaW55VVNCIDIgRFZCLXQgRFZCLVQgVVNCMi4wIHJlY2VpdmVycy4KKwkJVHdpbmhhbkRUViBNYWdpY0JveCBJSSAoVlAtNzA0NiksCisJCURpZ2l0YWxOb3cgVGlueVVTQiAyIERWQi10LAorCQlEaWdpdGFsUmlzZSBVU0IgMi4wIFRlciAoQmVldGxlKSBhbmQKKwkJVFlQSE9PTiBEVkItVCBVU0IgRFJJVkUKKworCSAgRFZCLVQgVVNCMi4wIHJlY2VpdmVycy4KKworY29uZmlnIERWQl9VU0JfVlA3MDJYCisJdHJpc3RhdGUgIlR3aW5oYW5EVFYgU3RhckJveCBhbmQgY2xvbmVzIERWQi1TIFVTQjIuMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gRFZCX1VTQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUKKworCSAgICBUd2luaGFuRFRWIFN0YXJCb3gsCisJCURpZ2l0YWxSaXNlIFVTQiBTdGFyYm94IGFuZAorCQlUWVBIT09OIERWQi1TIFVTQiAyLjAgQk9YCisKKwkgIERWQi1TIFVTQjIuMCByZWNlaXZlcnMuCiAKIGNvbmZpZyBEVkJfVVNCX05PVkFfVF9VU0IyCiAJdHJpc3RhdGUgIkhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiBEVkItVCBVU0IyLjAgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCmluZGV4IDc0NmQ4N2UuLjJkYzlhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQpAQCAtNCw2ICs0LDkgQEAKIGR2Yi11c2ItdnA3MDQ1LW9ianMgPSB2cDcwNDUubyB2cDcwNDUtZmUubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfVlA3MDQ1KSArPSBkdmItdXNiLXZwNzA0NS5vCiAKK2R2Yi11c2ItdnA3MDJ4LW9ianMgPSB2cDcwMngubyB2cDcwMngtZmUubworb2JqLSQoQ09ORklHX0RWQl9VU0JfVlA3MDJYKSArPSBkdmItdXNiLXZwNzAyeC5vCisKIGR2Yi11c2ItZHR0MjAwdS1vYmpzID0gZHR0MjAwdS5vIGR0dDIwMHUtZmUubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRFRUMjAwVSkgKz0gZHZiLXVzYi1kdHQyMDB1Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2E4MDAuYwppbmRleCBmMmZjYzJmLi5lNTUzMjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2E4MDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2E4MDAuYwpAQCAtOTAsNyArOTAsNyBAQAogc3RhdGljIGludCBhODAwX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0JcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmYTgwMF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZhODAwX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCk7CiB9CiAKIC8qIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBJRCB0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCmluZGV4IDllOTZhMTguLjNmZTM4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKQEAgLTQ4LDM1ICs0OCwyNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBJMkMgKi8KLXN0YXRpYyB2b2lkIGN4dXNiX3NldF9pMmNfcGF0aChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGVudW0gY3h1c2JfaTJjX3BhdGhlcyBwYXRoKQorLyogR1BJTyAqLworc3RhdGljIHZvaWQgY3h1c2JfZ3Bpb190dW5lcihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKIHsKIAlzdHJ1Y3QgY3h1c2Jfc3RhdGUgKnN0ID0gZC0+cHJpdjsKIAl1OCBvWzJdLGk7CiAKLQlpZiAocGF0aCA9PSBzdC0+Y3VyX2kyY19wYXRoKQorCWlmIChzdC0+Z3Bpb193cml0ZV9zdGF0ZVtHUElPX1RVTkVSXSA9PSBvbm9mZikKIAkJcmV0dXJuOwogCi0Jb1swXSA9IElPQ1RMX1NFVF9JMkNfUEFUSDsKLQlzd2l0Y2ggKHBhdGgpIHsKLQkJY2FzZSBQQVRIX0NYMjI3MDI6Ci0JCQlvWzFdID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIFBBVEhfVFVORVJfT1RIRVI6Ci0JCQlvWzFdID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyKCJ1bmtvd24gaTJjIHBhdGgiKTsKLQkJCXJldHVybjsKLQl9Ci0JY3h1c2JfY3RybF9tc2coZCxDTURfSU9DVEwsbywyLCZpLDEpOworCW9bMF0gPSBHUElPX1RVTkVSOworCW9bMV0gPSBvbm9mZjsKKwljeHVzYl9jdHJsX21zZyhkLENNRF9HUElPX1dSSVRFLG8sMiwmaSwxKTsKIAogCWlmIChpICE9IDB4MDEpCi0JCWRlYl9pbmZvKCJpMmNfcGF0aCBzZXR0aW5nIGZhaWxlZC5cbiIpOworCQlkZWJfaW5mbygiZ3Bpb193cml0ZSBmYWlsZWQuXG4iKTsKIAotCXN0LT5jdXJfaTJjX3BhdGggPSBwYXRoOworCXN0LT5ncGlvX3dyaXRlX3N0YXRlW0dQSU9fVFVORVJdID0gb25vZmY7CiB9CiAKKy8qIEkyQyAqLwogc3RhdGljIGludCBjeHVzYl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgbXNnW10saW50IG51bSkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwpAQCAtOTIsMTAgKzgzLDEwIEBACiAKIAkJc3dpdGNoIChtc2dbaV0uYWRkcikgewogCQkJY2FzZSAweDYzOgotCQkJCWN4dXNiX3NldF9pMmNfcGF0aChkLFBBVEhfQ1gyMjcwMik7CisJCQkJY3h1c2JfZ3Bpb190dW5lcihkLDApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX1RVTkVSX09USEVSKTsKKwkJCQljeHVzYl9ncGlvX3R1bmVyKGQsMSk7CiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQ3LDE2ICsxMzgsMjAgQEAKIAogc3RhdGljIGludCBjeHVzYl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQogewotCXJldHVybiAwOworCXU4IGIgPSAwOworCWlmIChvbm9mZikKKwkJcmV0dXJuIGN4dXNiX2N0cmxfbXNnKGQsIENNRF9QT1dFUl9PTiwgJmIsIDEsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIGN4dXNiX2N0cmxfbXNnKGQsIENNRF9QT1dFUl9PRkYsICZiLCAxLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIGludCBjeHVzYl9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKIHsKIAl1OCBidWZbMl0gPSB7IDB4MDMsIDB4MDAgfTsKIAlpZiAob25vZmYpCi0JCWN4dXNiX2N0cmxfbXNnKGQsMHgzNiwgYnVmLCAyLCBOVUxMLCAwKTsKKwkJY3h1c2JfY3RybF9tc2coZCxDTURfU1RSRUFNSU5HX09OLCBidWYsIDIsIE5VTEwsIDApOwogCWVsc2UKLQkJY3h1c2JfY3RybF9tc2coZCwweDM3LCBOVUxMLCAwLCBOVUxMLCAwKTsKKwkJY3h1c2JfY3RybF9tc2coZCxDTURfU1RSRUFNSU5HX09GRiwgTlVMTCwgMCwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MiwyMiArMTc3LDExIEBACiAKIHN0YXRpYyBpbnQgY3h1c2JfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQl1OCBidWZbMl0gPSB7IDB4MDMsIDB4MDAgfTsKLQl1OCBiID0gMDsKLQotCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LDAsMCkgPCAwKQotCQllcnIoInNldCBpbnRlcmZhY2UgdG8gYWx0cz0wIGZhaWxlZCIpOwotCi0JY3h1c2JfY3RybF9tc2coZCwweGRlLCZiLDAsTlVMTCwwKTsKLQljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX1RVTkVSX09USEVSKTsKLQljeHVzYl9jdHJsX21zZyhkLENNRF9QT1dFUl9PRkYsIE5VTEwsIDAsICZiLCAxKTsKLQorCXU4IGI7CiAJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGQtPnVkZXYsMCw2KSA8IDApCiAJCWVycigic2V0IGludGVyZmFjZSBmYWlsZWQiKTsKIAotCWN4dXNiX2N0cmxfbXNnKGQsMHgzNiwgYnVmLCAyLCBOVUxMLCAwKTsKLQljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX0NYMjI3MDIpOwotCWN4dXNiX2N0cmxfbXNnKGQsQ01EX1BPV0VSX09OLCBOVUxMLCAwLCAmYiwgMSk7CisJY3h1c2JfY3RybF9tc2coZCxDTURfRElHSVRBTCwgTlVMTCwgMCwgJmIsIDEpOwogCiAJaWYgKChkLT5mZSA9IGN4MjI3MDJfYXR0YWNoKCZjeHVzYl9jeDIyNzAyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CkBAIC0yMTEsNyArMTk1LDcgQEAKIHN0YXRpYyBpbnQgY3h1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3h1c2JfdGFibGUgW10gPSB7CkBAIC0yMzcsMTQgKzIyMSwxMiBAQAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCS51cmIgPSB7Ci0JCS50eXBlID0gRFZCX1VTQl9JU09DLAorCQkudHlwZSA9IERWQl9VU0JfQlVMSywKIAkJLmNvdW50ID0gNSwKIAkJLmVuZHBvaW50ID0gMHgwMiwKIAkJLnUgPSB7Ci0JCQkuaXNvYyA9IHsKLQkJCQkuZnJhbWVzcGVydXJiID0gMzIsCi0JCQkJLmZyYW1lc2l6ZSA9IDk0MCwKLQkJCQkuaW50ZXJ2YWwgPSA1LAorCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAogCQkJfQogCQl9CiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaAppbmRleCAxZDc5MDE2Li4xMzVjMmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5oCkBAIC0xLDMwICsxLDMxIEBACiAjaWZuZGVmIF9EVkJfVVNCX0NYVVNCX0hfCiAjZGVmaW5lIF9EVkJfVVNCX0NYVVNCX0hfCiAKLSNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkaWdpdHYiCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAiY3h1c2IiCiAjaW5jbHVkZSAiZHZiLXVzYi5oIgogCiBleHRlcm4gaW50IGR2Yl91c2JfY3h1c2JfZGVidWc7CiAjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2N4dXNiX2RlYnVnLDB4MDEsYXJncykKIAogLyogdXNiIGNvbW1hbmRzIC0gc29tZSBvZiBpdCBhcmUgZ3Vlc3NlcywgZG9uJ3QgaGF2ZSBhIHJlZmVyZW5jZSB5ZXQgKi8KLSNkZWZpbmUgQ01EX0kyQ19XUklURSAgICAweDA4Ci0jZGVmaW5lIENNRF9JMkNfUkVBRCAgICAgMHgwOQorI2RlZmluZSBDTURfSTJDX1dSSVRFICAgICAweDA4CisjZGVmaW5lIENNRF9JMkNfUkVBRCAgICAgIDB4MDkKIAotI2RlZmluZSBDTURfSU9DVEwgICAgICAgIDB4MGUKLSNkZWZpbmUgICAgSU9DVExfU0VUX0kyQ19QQVRIIDB4MDIKKyNkZWZpbmUgQ01EX0dQSU9fUkVBRCAgICAgMHgwZAorI2RlZmluZSBDTURfR1BJT19XUklURSAgICAweDBlCisjZGVmaW5lICAgICBHUElPX1RVTkVSICAgICAgICAgMHgwMgogCi0jZGVmaW5lIENNRF9QT1dFUl9PRkYgICAgMHg1MAotI2RlZmluZSBDTURfUE9XRVJfT04gICAgIDB4NTEKKyNkZWZpbmUgQ01EX1BPV0VSX09GRiAgICAgMHhkYworI2RlZmluZSBDTURfUE9XRVJfT04gICAgICAweGRlCiAKLWVudW0gY3h1c2JfaTJjX3BhdGhlcyB7Ci0JUEFUSF9VTkRFRiAgICAgICA9IDB4MDAsCi0JUEFUSF9DWDIyNzAyICAgICA9IDB4MDEsCi0JUEFUSF9UVU5FUl9PVEhFUiA9IDB4MDIsCi19OworI2RlZmluZSBDTURfU1RSRUFNSU5HX09OICAweDM2CisjZGVmaW5lIENNRF9TVFJFQU1JTkdfT0ZGIDB4MzcKKworI2RlZmluZSBDTURfQU5BTE9HICAgICAgICAweDUwCisjZGVmaW5lIENNRF9ESUdJVEFMICAgICAgIDB4NTEKIAogc3RydWN0IGN4dXNiX3N0YXRlIHsKLQllbnVtIGN4dXNiX2kyY19wYXRoZXMgY3VyX2kyY19wYXRoOworCXU4IGdwaW9fd3JpdGVfc3RhdGVbM107CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCmluZGV4IDgyOGI1MTguLjAwNTg1MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYwpAQCAtODYsOSArODYsOSBAQAogc3RhdGljIGludCBkaWJ1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlpZiAoZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IxXzFfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCB8fAotCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpYnVzYjFfMV9hbjIyMzVfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCB8fAotCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpYnVzYjJfMGJfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCkKKwlpZiAoZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IxXzFfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKSA9PSAwIHx8CisJCWR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlidXNiMV8xX2FuMjIzNV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpID09IDAgfHwKKwkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IyXzBiX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyNiwxMCArMTI2LDEyIEBACiAvKiAyNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LWUUsCQkJVVNCX1BJRF9LWUVfRFZCX1RfQ09MRCkgfSwKIC8qIDI2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tZRSwJCQlVU0JfUElEX0tZRV9EVkJfVF9XQVJNKSB9LAogCisvKiAyNyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LV09STEQsCQlVU0JfUElEX0tXT1JMRF9WU1RSRUFNX0NPTEQpIH0sCisKIC8vICNkZWZpbmUgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKIAogI2lmZGVmIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCi0vKiAyNyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BTkNIT1IsCQlVU0JfUElEX1VMVElNQV9UVkJPWF9BTkNIT1JfQ09MRCkgfSwKKy8qIDI4ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FOQ0hPUiwJCVVTQl9QSURfVUxUSU1BX1RWQk9YX0FOQ0hPUl9DT0xEKSB9LAogI2VuZGlmCiAJCQl7IH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwpAQCAtMjYyLDcgKzI2NCw3IEBACiAJCX0sCiAjaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKIAkJewkiQXJ0ZWMgVDEgVVNCMS4xIFRWQk9YIHdpdGggQU4yMjM1IChmYXVsdHkgVVNCIElEcykiLAotCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyN10sIE5VTEwgfSwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjhdLCBOVUxMIH0sCiAJCQl7IE5VTEwgfSwKIAkJfSwKICNlbmRpZgpAQCAtMzA2LDEyICszMDgsMTYgQEAKIAkJfQogCX0sCiAKLQkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLm51bV9kZXZpY2VfZGVzY3MgPSAyLAogCS5kZXZpY2VzID0gewotCQl7CSJLV29ybGQvQURTVGVjaCBJbnN0YW50IERWQi1UIFVTQiAyLjAiLAorCQl7CSJLV29ybGQvQURTVGVjaCBJbnN0YW50IERWQi1UIFVTQjIuMCIsCiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzIzXSwgTlVMTCB9LAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyNF0sIE5VTEwgfSwKIAkJfSwKKwkJewkiS1dvcmxkIFhwZXJ0IERWQi1UIFVTQjIuMCIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI3XSwgTlVMTCB9LAorCQkJeyBOVUxMIH0KKwkJfSwKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYwppbmRleCBlOWRhYzQzLi42YTA5MTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKQEAgLTIwLDcgKzIwLDcgQEAKIHN0YXRpYyBpbnQgZGlidXNiX21jX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0JcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlidXNiX21jX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpOworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpYnVzYl9tY19wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOwogfQogCiAvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCmluZGV4IGY3MGUwYmUuLjc0NTQ1ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYwpAQCAtMTExLDMxICsxMTEsMjggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZGlnaXR2X210MzUyX2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MCwgLyogaWdub3JlZCBieSB0aGUgZGlnaXR2IGFueXdheSAqLwogCS5kZW1vZF9pbml0ID0gZGlnaXR2X210MzUyX2RlbW9kX2luaXQsCiAJLnBsbF9zZXQgPSBkdmJfdXNiX3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG54dDYwMDBfY29uZmlnIGRpZ2l0dl9ueHQ2MDAwX2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MCwgLyogaWdub3JlZCBieSB0aGUgZGlnaXR2IGFueXdheSAqLwotCS5jbG9ja19pbnZlcnNpb24gPSAweDAsCitzdGF0aWMgaW50IGRpZ2l0dl9ueHQ2MDAwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGZlLT5kdmItPnByaXY7CisJdTggYls1XTsKKwlkdmJfdXNiX3BsbF9zZXQoZmUsZmVwLGIpOworCXJldHVybiBkaWdpdHZfY3RybF9tc2coZCxVU0JfV1JJVEVfVFVORVIsMCwmYlsxXSw0LE5VTEwsMCk7Cit9CiAKLQkucGxsX2luaXQgPSBOVUxMLAotCS5wbGxfc2V0ID0gTlVMTCwKK3N0YXRpYyBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcgZGlnaXR2X254dDYwMDBfY29uZmlnID0geworCS5jbG9ja19pbnZlcnNpb24gPSAxLAorCS5wbGxfc2V0ID0gZGlnaXR2X254dDYwMDBfcGxsX3NldCwKIH07CiAKIHN0YXRpYyBpbnQgZGlnaXR2X2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7Ci0JaWYgKChkLT5mZSA9IG10MzUyX2F0dGFjaCgmZGlnaXR2X210MzUyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlpZiAoKGQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfbXQzNTJfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMIHx8CisJCShkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCiAJCXJldHVybiAwOwotCWlmICgoZC0+ZmUgPSBueHQ2MDAwX2F0dGFjaCgmZGlnaXR2X254dDYwMDBfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKSB7Ci0KLQkJd2Fybigibnh0NjAwMCBzdXBwb3J0IGlzIG5vdCBkb25lIHlldCwgaW4gZmFjdCB5b3UgYXJlIG9uZSBvZiB0aGUgZmlyc3QgIgotCQkJCSJwZXJzb24gd2hvIHdhbnRzIHRvIHVzZSB0aGlzIGRldmljZSBpbiBMaW51eC4gUGxlYXNlIHJlcG9ydCB0byAiCi0JCQkJImxpbnV4LWR2YkBsaW51eHR2Lm9yZyIpOwotCi0JCXJldHVybiAwOwotCX0KIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTczLDcgKzE3MCwxOCBAQAogc3RhdGljIGludCBkaWdpdHZfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWdpdHZfcHJvcGVydGllcyxUSElTX01PRFVMRSk7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkOworCWludCByZXQ7CisJaWYgKChyZXQgPSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpZ2l0dl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLCZkKSkgPT0gMCkgeworCQl1OCBiWzRdID0geyAwIH07CisKKwkJYlswXSA9IDE7CisJCWRpZ2l0dl9jdHJsX21zZyhkLFVTQl9XUklURV9SRU1PVEVfVFlQRSwwLGIsNCxOVUxMLDApOworCisJCWJbMF0gPSAwOworCQlkaWdpdHZfY3RybF9tc2coZCxVU0JfV1JJVEVfUkVNT1RFLDAsYiw0LE5VTEwsMCk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkaWdpdHZfdGFibGUgW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCmluZGV4IGIwMzI1MjMuLjBhOTRlYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgZmVwOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogfTsKIAogc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCAqc3RhdCkKQEAgLTE2Myw4ICsxNjQsOSBAQAogCWRlYl9pbmZvKCJhdHRhY2hpbmcgZnJvbnRlbmQgZHR0MjAwdVxuIik7CiAKIAlzdGF0ZS0+ZCA9IGQ7CisJbWVtY3B5KCZzdGF0ZS0+b3BzLCZkdHQyMDB1X2ZlX29wcyxzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmZHR0MjAwdV9mZV9vcHM7CisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAlnb3RvIHN1Y2Nlc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCmluZGV4IDQ3ZGJhNmUuLjVhYTEyZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCkBAIC05OCwyMCArOTgsMTkgQEAKIHN0YXRpYyBpbnQgZHR0MjAwdV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlpZiAoZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkdHQyMDB1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDAgfHwKLQkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZ3dDIyMHVfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCkKKwlpZiAoZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkdHQyMDB1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCB8fAorCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnd0MjIwdV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpID09IDApCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkdHQyMDB1X3VzYl90YWJsZSBbXSA9IHsKLS8vCQl7IFVTQl9ERVZJQ0UoMHgwNGI0LDB4ODYxMykgfSwKLQkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfRFRUMjAwVV9DT0xEKSB9LAotCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9EVFQyMDBVX1dBUk0pIH0sCi0JCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX1dUMjIwVV9DT0xEKSAgfSwKLQkJeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfV1QyMjBVX1dBUk0pICB9LAotCSAgICB7IDAgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9EVFQyMDBVX0NPTEQpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfRFRUMjAwVV9XQVJNKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX1dUMjIwVV9DT0xEKSAgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9XVDIyMFVfV0FSTSkgIH0sCisJeyAwIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGR0dDIwMHVfdXNiX3RhYmxlKTsKIApAQCAtMTg5LDcgKzE4OCw3IEBACiAKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCiAJLmRldmljZXMgPSB7Ci0JCXsgLm5hbWUgPSAiV2lkZVZpZXcgV1QtMjIwVSBQZW5UeXBlIFJlY2VpdmVyIChhbmQgY2xvbmVzKSIsCisJCXsgLm5hbWUgPSAiV2lkZVZpZXcgV1QtMjIwVSBQZW5UeXBlIFJlY2VpdmVyIChUeXBob29uL0ZyZWVjb20pIiwKIAkJICAuY29sZF9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVsyXSwgTlVMTCB9LAogCQkgIC53YXJtX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzNdLCBOVUxMIH0sCiAJCX0sCkBAIC0yMDEsOSArMjAwLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkdHQyMDB1X3VzYl9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJkdmJfdXNiX2R0dDIwMHUiLAotCS5wcm9iZSAJCT0gZHR0MjAwdV91c2JfcHJvYmUsCisJLnByb2JlCQk9IGR0dDIwMHVfdXNiX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKLQkuaWRfdGFibGUgCT0gZHR0MjAwdV91c2JfdGFibGUsCisJLmlkX3RhYmxlCT0gZHR0MjAwdV91c2JfdGFibGUsCiB9OwogCiAvKiBtb2R1bGUgc3R1ZmYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCA3OTRkNTEzLi4wODE4OTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0yNCw4ICsyNCwxMCBAQAogI2RlZmluZSBVU0JfVklEX0hBTkZURUsJCQkJCQkweDE1ZjQKICNkZWZpbmUgVVNCX1ZJRF9IQVVQUEFVR0UJCQkJCTB4MjA0MAogI2RlZmluZSBVU0JfVklEX0hZUEVSX1BBTFRFSwkJCQkweDEwMjUKKyNkZWZpbmUgVVNCX1ZJRF9LV09STEQJCQkJCQkweGViMmEKICNkZWZpbmUgVVNCX1ZJRF9LWUUJCQkJCQkJMHgwNDU4CiAjZGVmaW5lIFVTQl9WSURfTUVESU9OCQkJCQkJMHgxNjYwCisjZGVmaW5lIFVTQl9WSURfUElOTkFDTEUJCQkJCTB4MjMwNAogI2RlZmluZSBVU0JfVklEX1ZJU0lPTlBMVVMJCQkJCTB4MTNkMwogI2RlZmluZSBVU0JfVklEX1RXSU5IQU4JCQkJCQkweDE4MjIKICNkZWZpbmUgVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQwkJCTB4MDVkOApAQCAtNTIsMTIgKzU0LDE0IEBACiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fV0FSTQkJCTB4MTdkZgogI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDQxX0NPTEQJCQkweDMyMDEKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzA0MV9XQVJNCQkJMHgzMjAyCisjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwMjBfQ09MRAkJCTB4MzIwMworI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDIwX1dBUk0JCQkweDMyMDQKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzA0NV9DT0xECQkJMHgzMjA1CiAjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDVfV0FSTQkJCTB4MzIwNgotI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfQ09MRAkJCTB4MzIyMwotI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfV0FSTQkJCTB4MzIyNAogI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDIxX0NPTEQJCQkweDMyMDcKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMV9XQVJNCQkJMHgzMjA4CisjZGVmaW5lIFVTQl9QSURfRE5UVl9USU5ZVVNCMl9DT0xECQkJMHgzMjIzCisjZGVmaW5lIFVTQl9QSURfRE5UVl9USU5ZVVNCMl9XQVJNCQkJMHgzMjI0CiAjZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX0NPTEQJCQkweDgxMDUKICNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfV0FSTQkJCTB4ODEwNgogI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9BTjIyMzVfQ09MRAkweDgxMDcKQEAgLTg1LDUgKzg5LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9NRURJT05fTUQ5NTcwMAkJCQkweDA5MzIKICNkZWZpbmUgVVNCX1BJRF9LWUVfRFZCX1RfQ09MRAkJCQkweDcwMWUKICNkZWZpbmUgVVNCX1BJRF9LWUVfRFZCX1RfV0FSTQkJCQkweDcwMWYKKyNkZWZpbmUgVVNCX1BJRF9QQ1RWXzIwMEUJCQkJCTB4MDIwZQorI2RlZmluZSBVU0JfUElEX1BDVFZfNDAwRQkJCQkJMHgwMjBmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKaW5kZXggNjVmMGMwOS4uYTkwMjA1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCkBAIC0xMjgsNyArMTI4LDkgQEAKIC8qCiAgKiBVU0IKICAqLwotaW50IGR2Yl91c2JfZGV2aWNlX2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgKnByb3BzLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKKworaW50IGR2Yl91c2JfZGV2aWNlX2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMKKwkJKnByb3BzLCBzdHJ1Y3QgbW9kdWxlICpvd25lcixzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKipkdSkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gTlVMTDsKQEAgLTE3MCw2ICsxNzIsOSBAQAogCiAJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZCk7CiAKKwkJaWYgKGR1ICE9IE5VTEwpCisJCQkqZHUgPSBkOworCiAJCXJldCA9IGR2Yl91c2JfaW5pdChkKTsKIAl9CiAKQEAgLTE5NiwxOSArMjAxLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHZiX3VzYl9kZXZpY2VfZXhpdCk7CiAKLS8qIG1vZHVsZSBzdHVmZiAqLwotc3RhdGljIGludCBfX2luaXQgZHZiX3VzYl9tb2R1bGVfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHZiX3VzYl9tb2R1bGVfZXhpdCh2b2lkKQotewotfQotCi1tb2R1bGVfaW5pdCAoZHZiX3VzYl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdCAoZHZiX3VzYl9tb2R1bGVfZXhpdCk7Ci0KIE1PRFVMRV9WRVJTSU9OKCIwLjMiKTsKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGxpYnJhcnkgbW9kdWxlIGNvbnRhaW5pbmcgY29tbW9ubHkgdXNlZCBVU0IgYW5kIERWQiBmdW5jdGlvbiBVU0IgRFZCIGRldmljZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKaW5kZXggYTgwNTY3Yy4uMGU0ZjEwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKQEAgLTEyNyw3ICsxMjcsNyBAQAogICogIGhlbHBlciBmdW5jdGlvbnMuCiAgKgogICogQHVyYjogZGVzY3JpYmVzIHRoZSBraW5kIG9mIFVTQiB0cmFuc2ZlciB1c2VkIGZvciBNUEVHMi1UUy1zdHJlYW1pbmcuCi0gKiAgQ3VycmVudGx5IG9ubHkgQlVMSyBpcyBpbXBsZW1lbnRlZAorICogIChCVUxLIG9yIElTT0MpCiAgKgogICogQG51bV9kZXZpY2VfZGVzY3M6IG51bWJlciBvZiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gaW4gQGRldmljZXMKICAqIEBkZXZpY2VzOiBhcnJheSBvZiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gY29tcGF0aWJsZXMgd2l0aCB0aGVzZQpAQCAtMzEwLDcgKzMxMCw3IEBACiAJdm9pZCAqcHJpdjsKIH07CiAKLWV4dGVybiBpbnQgZHZiX3VzYl9kZXZpY2VfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzICosIHN0cnVjdCBtb2R1bGUgKik7CitleHRlcm4gaW50IGR2Yl91c2JfZGV2aWNlX2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyAqLCBzdHJ1Y3QgbW9kdWxlICosIHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKik7CiBleHRlcm4gdm9pZCBkdmJfdXNiX2RldmljZV9leGl0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwogCiAvKiB0aGUgZ2VuZXJpYyByZWFkL3dyaXRlIG1ldGhvZCBmb3IgZGV2aWNlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYwppbmRleCAyNThhOTJiLi4xODQxYTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIHN0YXRpYyBpbnQgbm92YV90X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0JcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50Ziwmbm92YV90X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpOworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJm5vdmFfdF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOwogfQogCiAvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKaW5kZXggMjExMmFjMy4uNmZkNjc2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKQEAgLTc3LDcgKzc3LDcgQEAKIHN0YXRpYyBpbnQgdW10X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0JaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmdW10X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDApCisJaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmdW10X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjBkOGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYwpAQCAtMCwwICsxLDMzOSBAQAorLyogRFZCIGZyb250ZW5kIHBhcnQgb2YgdGhlIExpbnV4IGRyaXZlciBmb3IgdGhlIFR3aW5oYW5EVFYgU3RhckJveCBVU0IyLjAKKyAqIERWQi1TIHJlY2VpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSYWxwaCBNZXR6bGVyIDxyamttQG1ldHpsZXJicm9zLmRlPgorICogICAgICAgICAgICAgICAgICAgIE1ldHpsZXIgQnJvdGhlcnMgU3lzdGVtZW50d2lja2x1bmcgR2JSCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPgorICoKKyAqIFRoYW5rcyB0byBUd2luaGFuIHdobyBraW5kbHkgcHJvdmlkZWQgaGFyZHdhcmUgYW5kIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVtb3ZlZCBzb29uLCBhZnRlciB0aGUgRFNULWRyaXZlciBpcyByZXdyaXR0ZW4gdG8gcHJvdmljZQorICogdGhlIGZyb250ZW5kLWNvbnRyb2xsaW5nIHNlcGFyYXRlbHkuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKgorICovCisjaW5jbHVkZSAidnA3MDJ4LmgiCisKK3N0cnVjdCB2cDcwMnhfZmVfc3RhdGUgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZmU7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkOworCisJZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlOworCWZlX3NlY190b25lX21vZGVfdCB0b25lX21vZGU7CisKKwl1OCBsbmJfYnVmWzhdOworCisJdTggbG9jazsKKwl1OCBzaWc7CisJdTggc25yOworCisJdW5zaWduZWQgbG9uZyBuZXh0X3N0YXR1c19jaGVjazsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19jaGVja19pbnRlcnZhbDsKK307CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX3JlZnJlc2hfc3RhdGUoc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QpCit7CisJdTggYnVmWzEwXTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLHN0LT5uZXh0X3N0YXR1c19jaGVjaykpIHsKKwkJdnA3MDJ4X3VzYl9pbl9vcChzdC0+ZCxSRUFEX1NUQVRVUywwLDAsYnVmLDEwKTsKKworCQlzdC0+bG9jayA9IGJ1Zls0XTsKKwkJdnA3MDJ4X3VzYl9pbl9vcChzdC0+ZCxSRUFEX1RVTkVSX1JFR19SRVEsMHgxMSwwLCZzdC0+c25yLDEpOworCQl2cDcwMnhfdXNiX2luX29wKHN0LT5kLFJFQURfVFVORVJfUkVHX1JFUSwweDE1LDAsJnN0LT5zaWcsMSk7CisKKwkJc3QtPm5leHRfc3RhdHVzX2NoZWNrID0gamlmZmllcyArIChzdC0+c3RhdHVzX2NoZWNrX2ludGVydmFsKkhaKS8xMDAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IHZwNzAyeF9jaGtzdW0odTggKmJ1ZixpbnQgZiwgaW50IGNvdW50KQoreworCXU4IHMgPSAwOworCWludCBpOworCWZvciAoaSA9IGY7IGkgPCBmK2NvdW50OyBpKyspCisJCXMgKz0gYnVmW2ldOworCXJldHVybiB+cysxOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXZwNzAyeF9mZV9yZWZyZXNoX3N0YXRlKHN0KTsKKwlkZWJfZmUoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoc3QtPmxvY2sgPT0gMCkKKwkJKnN0YXR1cyA9IEZFX0hBU19MT0NLIHwgRkVfSEFTX1NZTkMgfCBGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfQ0FSUklFUjsKKwllbHNlCisJCSpzdGF0dXMgPSAwOworCisJZGViX2ZlKCJyZWFsIHN0YXRlOiAleFxuIiwqc3RhdHVzKTsKKwkqc3RhdHVzID0gMHgxZjsKKworCWlmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spCisJCXN0LT5zdGF0dXNfY2hlY2tfaW50ZXJ2YWwgPSAxMDAwOworCWVsc2UKKwkJc3QtPnN0YXR1c19jaGVja19pbnRlcnZhbCA9IDI1MDsKKwlyZXR1cm4gMDsKK30KKworLyogbm90IHN1cHBvcnRlZCBieSB0aGlzIEZyb250ZW5kICovCitzdGF0aWMgaW50IHZwNzAyeF9mZV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICpiZXIpCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl2cDcwMnhfZmVfcmVmcmVzaF9zdGF0ZShzdCk7CisJKmJlciA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBGcm9udGVuZCAqLworc3RhdGljIGludCB2cDcwMnhfZmVfcmVhZF91bmNfYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKnVuYykKK3sKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXZwNzAyeF9mZV9yZWZyZXNoX3N0YXRlKHN0KTsKKwkqdW5jID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl2cDcwMnhfZmVfcmVmcmVzaF9zdGF0ZShzdCk7CisKKwkqc3RyZW5ndGggPSAoc3QtPnNpZyA8PCA4KSB8IHN0LT5zaWc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnNucikKK3sKKwl1OCBfc25yOworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdnA3MDJ4X2ZlX3JlZnJlc2hfc3RhdGUoc3QpOworCisJX3NuciA9IChzdC0+c25yICYgMHgxZikgKiAweGZmIC8gMHgxZjsKKwkqc25yID0gKF9zbnIgPDwgOCkgfCBfc25yOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQoreworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKwl0dW5lLT5taW5fZGVsYXlfbXMgPSAyMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBmcmVxID0gZmVwLT5mcmVxdWVuY3kvMTAwMDsKKwkvKkNhbEZyZXF1ZW5jeSovCisvKgl1MTYgZnJlcXVlbmN5UmVmWzE2XSA9IHsgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNTYsIDI0LCA1LCAxMCwgMjAsIDQwLCA4MCwgMTYwLCAzMjAgfTsgKi8KKwl1NjQgc3I7CisJdTggY21kWzhdID0geyAwIH0saWJ1ZlsxMF07CisKKwljbWRbMF0gPSAoZnJlcSA+PiA4KSAmIDB4N2Y7CisJY21kWzFdID0gIGZyZXEgICAgICAgJiAweGZmOworCWNtZFsyXSA9IDE7IC8qIGRpdnJhdGUgPT0gNCAtPiBmcmVxdWVuY3lSZWZbMV0gLT4gMSBoZXJlICovCisKKwlzciA9ICh1NjQpIChmZXAtPnUucXBzay5zeW1ib2xfcmF0ZS8xMDAwKSA8PCAyMDsKKwlkb19kaXYoc3IsODgwMDApOworCWNtZFszXSA9IChzciA+PiAxMikgJiAweGZmOworCWNtZFs0XSA9IChzciA+PiA0KSAgJiAweGZmOworCWNtZFs1XSA9IChzciA8PCA0KSAgJiAweGYwOworCisJZGViX2ZlKCJzZXR0aW5nIGZyb250ZW5kIHRvOiAldSAtPiAldSAoJXgpIExOQi1iYXNlZCBHSHosIHN5bWJvbHJhdGU6ICVkIC0+ICVMdSAoJUx4KVxuIiwKKwkJCWZlcC0+ZnJlcXVlbmN5LGZyZXEsZnJlcSwgZmVwLT51LnFwc2suc3ltYm9sX3JhdGUsIHNyLCBzcik7CisKKy8qCWlmIChmZXAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fT04pCisJCWNtZFs2XSB8PSAweDgwOyAqLworCisJaWYgKHN0LT52b2x0YWdlID09IFNFQ19WT0xUQUdFXzE4KQorCQljbWRbNl0gfD0gMHg0MDsKKworLyoJaWYgKGZlcC0+dS5xcHNrLnN5bWJvbF9yYXRlID4gODAwMDAwMCkKKwkJY21kWzZdIHw9IDB4MjA7CisKKwlpZiAoZmVwLT5mcmVxdWVuY3kgPCAxNTMxMDAwKQorCQljbWRbNl0gfD0gMHgwNDsKKworCWlmIChzdC0+dG9uZV9tb2RlID09IFNFQ19UT05FX09OKQorCQljbWRbNl0gfD0gMHgwMTsqLworCisJY21kWzddID0gdnA3MDJ4X2Noa3N1bShjbWQsMCw3KTsKKworCXN0LT5zdGF0dXNfY2hlY2tfaW50ZXJ2YWwgPSAyNTA7CisJc3QtPm5leHRfc3RhdHVzX2NoZWNrID0gamlmZmllczsKKworCXZwNzAyeF91c2JfaW5fb3Aoc3QtPmQsIFJFU0VUX1RVTkVSLCAwLCAwLCBOVUxMLCAwKTsKKwltc2xlZXAoMzApOworCXZwNzAyeF91c2JfaW5vdXRfb3Aoc3QtPmQsY21kLDgsaWJ1ZiwxMCwxMDApOworCisJaWYgKGlidWZbMl0gPT0gMCAmJiBpYnVmWzNdID09IDApCisJCWRlYl9mZSgidHVuaW5nIGZhaWxlZC5cbiIpOworCWVsc2UKKwkJZGViX2ZlKCJ0dW5pbmcgc3VjY2VlZGVkLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCit7CisJZGViX2ZlKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9zZW5kX2Rpc2VxY19tc2cgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKm0pCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBjbWRbOF0saWJ1ZlsxMF07CisJbWVtc2V0KGNtZCwwLDgpOworCisJZGViX2ZlKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCisJaWYgKG0tPm1zZ19sZW4gPiA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZFsxXSA9IFNFVF9ESVNFUUNfQ01EOworCWNtZFsyXSA9IG0tPm1zZ19sZW47CisJbWVtY3B5KCZjbWRbM10sIG0tPm1zZywgbS0+bXNnX2xlbik7CisJY21kWzddID0gdnA3MDJ4X2Noa3N1bShjbWQsMCw3KTsKKworCXZwNzAyeF91c2JfaW5vdXRfb3Aoc3QtPmQsY21kLDgsaWJ1ZiwxMCwxMDApOworCisJaWYgKGlidWZbMl0gPT0gMCAmJiBpYnVmWzNdID09IDApCisJCWRlYl9mZSgiZGlzZXFjIGNtZCBmYWlsZWQuXG4iKTsKKwllbHNlCisJCWRlYl9mZSgiZGlzZXFjIGNtZCBzdWNjZWVkZWQuXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9mZV9zZW5kX2Rpc2VxY19idXJzdCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQoreworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwMnhfZmVfc2V0X3RvbmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggaWJ1ZlsxMF07CisJZGViX2ZlKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCisJc3QtPnRvbmVfbW9kZSA9IHRvbmU7CisKKwlpZiAodG9uZSA9PSBTRUNfVE9ORV9PTikKKwkJc3QtPmxuYl9idWZbMl0gPSAweDAyOworCWVsc2UKKwkJc3QtPmxuYl9idWZbMl0gPSAweDAwOworCisJc3QtPmxuYl9idWZbN10gPSB2cDcwMnhfY2hrc3VtKHN0LT5sbmJfYnVmLDAsNyk7CisKKwl2cDcwMnhfdXNiX2lub3V0X29wKHN0LT5kLHN0LT5sbmJfYnVmLDgsaWJ1ZiwxMCwxMDApOworCWlmIChpYnVmWzJdID09IDAgJiYgaWJ1ZlszXSA9PSAwKQorCQlkZWJfZmUoInNldF90b25lIGNtZCBmYWlsZWQuXG4iKTsKKwllbHNlCisJCWRlYl9mZSgic2V0X3RvbmUgY21kIHN1Y2NlZWRlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2ZlX3NldF92b2x0YWdlIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdAorCQl2b2x0YWdlKQoreworCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggaWJ1ZlsxMF07CisJZGViX2ZlKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCisJc3QtPnZvbHRhZ2UgPSB2b2x0YWdlOworCisJaWYgKHZvbHRhZ2UgIT0gU0VDX1ZPTFRBR0VfT0ZGKQorCQlzdC0+bG5iX2J1Zls0XSA9IDB4MDE7CisJZWxzZQorCQlzdC0+bG5iX2J1Zls0XSA9IDB4MDA7CisKKwlzdC0+bG5iX2J1Zls3XSA9IHZwNzAyeF9jaGtzdW0oc3QtPmxuYl9idWYsMCw3KTsKKworCXZwNzAyeF91c2JfaW5vdXRfb3Aoc3QtPmQsc3QtPmxuYl9idWYsOCxpYnVmLDEwLDEwMCk7CisJaWYgKGlidWZbMl0gPT0gMCAmJiBpYnVmWzNdID09IDApCisJCWRlYl9mZSgic2V0X3ZvbHRhZ2UgY21kIGZhaWxlZC5cbiIpOworCWVsc2UKKwkJZGViX2ZlKCJzZXRfdm9sdGFnZSBjbWQgc3VjY2VlZGVkLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA3MDJ4X2ZlX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB2cDcwMnhfZmVfb3BzOworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICogdnA3MDJ4X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cDcwMnhfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCW1lbXNldChzLDAsc2l6ZW9mKHN0cnVjdCB2cDcwMnhfZmVfc3RhdGUpKTsKKworCXMtPmQgPSBkOworCXMtPmZlLm9wcyA9ICZ2cDcwMnhfZmVfb3BzOworCXMtPmZlLmRlbW9kdWxhdG9yX3ByaXYgPSBzOworCisJcy0+bG5iX2J1ZlsxXSA9IFNFVF9MTkJfUE9XRVI7CisJcy0+bG5iX2J1ZlszXSA9IDB4ZmY7IC8qIDA9dG9uZSBidXJzdCwgMj1kYXRhIGJ1cnN0LCBmZj1vZmYgKi8KKworCWdvdG8gc3VjY2VzczsKK2Vycm9yOgorCXJldHVybiBOVUxMOworc3VjY2VzczoKKwlyZXR1cm4gJnMtPmZlOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB2cDcwMnhfZmVfb3BzID0geworCS5pbmZvID0geworCQkubmFtZSAgICAgICAgICAgPSAiVHdpbmhhbiBEU1QtbGlrZSBmcm9udGVuZCAoVlA3MDIxL1ZQNzAyMCkgRFZCLVMiLAorCQkudHlwZSAgICAgICAgICAgPSBGRV9RUFNLLAorCQkuZnJlcXVlbmN5X21pbiAgICAgICA9IDk1MDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggICAgICAgPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplICA9IDEwMDAsICAgLyoga0h6IGZvciBRUFNLIGZyb250ZW5kcyAqLworCQkuZnJlcXVlbmN5X3RvbGVyYW5jZSA9IDAsCisJCS5zeW1ib2xfcmF0ZV9taW4gICAgID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCAgICAgPSA0NTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSA9IDUwMCwgIC8qIHBwbSAqLworCQkuY2FwcyA9IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNCB8CisJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAorCQlGRV9DQU5fUVBTSyB8CisJCUZFX0NBTl9GRUNfQVVUTworCX0sCisJLnJlbGVhc2UgPSB2cDcwMnhfZmVfcmVsZWFzZSwKKworCS5pbml0ID0gTlVMTCwKKwkuc2xlZXAgPSBOVUxMLAorCisJLnNldF9mcm9udGVuZCA9IHZwNzAyeF9mZV9zZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZCA9IHZwNzAyeF9mZV9nZXRfZnJvbnRlbmQsCisJLmdldF90dW5lX3NldHRpbmdzID0gdnA3MDJ4X2ZlX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gdnA3MDJ4X2ZlX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IHZwNzAyeF9mZV9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSB2cDcwMnhfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gdnA3MDJ4X2ZlX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gdnA3MDJ4X2ZlX3JlYWRfdW5jX2Jsb2NrcywKKworCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gdnA3MDJ4X2ZlX3NlbmRfZGlzZXFjX21zZywKKwkuZGlzZXFjX3NlbmRfYnVyc3QgPSB2cDcwMnhfZmVfc2VuZF9kaXNlcWNfYnVyc3QsCisJLnNldF90b25lID0gdnA3MDJ4X2ZlX3NldF90b25lLAorCS5zZXRfdm9sdGFnZSA9IHZwNzAyeF9mZV9zZXRfdm9sdGFnZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEzYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYwpAQCAtMCwwICsxLDI5MCBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgTGludXggZHJpdmVyIGZvciB0aGUgVHdpbmhhbkRUViBTdGFyQm94IFVTQjIuMCBEVkItUworICogcmVjZWl2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJhbHBoIE1ldHpsZXIgPHJqa21AbWV0emxlcmJyb3MuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgTWV0emxlciBCcm90aGVycyBTeXN0ZW1lbnR3aWNrbHVuZyBHYlIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+CisgKgorICogVGhhbmtzIHRvIFR3aW5oYW4gd2hvIGtpbmRseSBwcm92aWRlZCBoYXJkd2FyZSBhbmQgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpbmNsdWRlICJ2cDcwMnguaCIKKworLyogZGVidWcgKi8KK2ludCBkdmJfdXNiX3ZwNzAyeF9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX3ZwNzAyeF9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8seGZlcj0yLHJjPTQgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKKworc3RydWN0IHZwNzAyeF9zdGF0ZSB7CisJdTggcGlkX3RhYmxlWzE3XTsgLyogWzE2XSBjb250cm9scyB0aGUgcGlkX3RhYmxlIHN0YXRlICovCit9OworCisvKiBjaGVjayBmb3IgbXV0ZXggRklYTUUgKi8KK2ludCB2cDcwMnhfdXNiX2luX29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKQoreworCWludCByZXQgPSAwLHRyeSA9IDA7CisKKwl3aGlsZSAocmV0ID49IDAgJiYgcmV0ICE9IGJsZW4gJiYgdHJ5IDwgMykgeworCQlyZXQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCXVzYl9yY3ZjdHJscGlwZShkLT51ZGV2LDApLAorCQkJcmVxLAorCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwKKwkJCXZhbHVlLGluZGV4LGIsYmxlbiwKKwkJCTIwMDApOworCQlkZWJfaW5mbygicmVhZGluZyBudW1iZXIgJWQgKHJldDogJWQpXG4iLHRyeSxyZXQpOworCQl0cnkrKzsKKwl9CisKKwlpZiAocmV0IDwgMCB8fCByZXQgIT0gYmxlbikgeworCQl3YXJuKCJ1c2IgaW4gb3BlcmF0aW9uIGZhaWxlZC4iKTsKKwkJcmV0ID0gLUVJTzsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCWRlYl94ZmVyKCJpbjogcmVxLiAleCwgdmFsOiAleCwgaW5kOiAleCwgYnVmZmVyOiAiLHJlcSx2YWx1ZSxpbmRleCk7CisJZGVidWdfZHVtcChiLGJsZW4sZGViX3hmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZwNzAyeF91c2Jfb3V0X29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKQoreworCWRlYl94ZmVyKCJvdXQ6IHJlcS4gJXgsIHZhbDogJXgsIGluZDogJXgsIGJ1ZmZlcjogIixyZXEsdmFsdWUsaW5kZXgpOworCWRlYnVnX2R1bXAoYixibGVuLGRlYl94ZmVyKTsKKworCWlmICh1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShkLT51ZGV2LDApLAorCQkJcmVxLAorCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQsCisJCQl2YWx1ZSxpbmRleCxiLGJsZW4sCisJCQkyMDAwKSAhPSBibGVuKSB7CisJCXdhcm4oInVzYiBvdXQgb3BlcmF0aW9uIGZhaWxlZC4iKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitpbnQgdnA3MDJ4X3VzYl9pbm91dF9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4ICpvLCBpbnQgb2xlbiwgdTggKmksIGludCBpbGVuLCBpbnQgbXNlYykKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmQtPnVzYl9zZW0pKSkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocmV0ID0gdnA3MDJ4X3VzYl9vdXRfb3AoZCxSRVFVRVNUX09VVCwwLDAsbyxvbGVuKSkgPCAwKQorCQlnb3RvIHVubG9jazsKKwltc2xlZXAobXNlYyk7CisJcmV0ID0gdnA3MDJ4X3VzYl9pbl9vcChkLFJFUVVFU1RfSU4sMCwwLGksaWxlbik7CisKK3VubG9jazoKKwl1cCgmZC0+dXNiX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdnA3MDJ4X3VzYl9pbm91dF9jbWQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBjbWQsIHU4ICpvLCBpbnQgb2xlbiwgdTggKmksIGludCBpbGVuLCBpbnQgbXNlYykKK3sKKwl1OCBib3V0W29sZW4rMl07CisJdTggYmluW2lsZW4rMV07CisJaW50IHJldCA9IDA7CisKKwlib3V0WzBdID0gMHgwMDsKKwlib3V0WzFdID0gY21kOworCW1lbWNweSgmYm91dFsyXSxvLG9sZW4pOworCisJcmV0ID0gdnA3MDJ4X3VzYl9pbm91dF9vcChkLCBib3V0LCBvbGVuKzIsIGJpbiwgaWxlbisxLG1zZWMpOworCisJaWYgKHJldCA9PSAwKQorCQltZW1jcHkoaSwmYmluWzFdLGlsZW4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cDcwMnhfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBpbmRleCwgdTE2IHBpZCwgaW50IG9ub2ZmKQoreworCXN0cnVjdCB2cDcwMnhfc3RhdGUgKnN0ID0gZC0+cHJpdjsKKwl1OCBidWZbOV07CisKKwlpZiAob25vZmYpIHsKKwkJc3QtPnBpZF90YWJsZVsxNl0gICB8PSAgIDEgPDwgaW5kZXg7CisJCXN0LT5waWRfdGFibGVbaW5kZXgqMl0gICA9IChwaWQgPj4gOCkgJiAweGZmOworCQlzdC0+cGlkX3RhYmxlW2luZGV4KjIrMV0gPSAgcGlkICAgICAgICYgMHhmZjsKKwl9IGVsc2UgeworCQlzdC0+cGlkX3RhYmxlWzE2XSAgICY9IH4oMSA8PCBpbmRleCk7CisJCXN0LT5waWRfdGFibGVbaW5kZXgqMl0gPSBzdC0+cGlkX3RhYmxlW2luZGV4KjIrMV0gPSAwOworCX0KKworCXJldHVybiB2cDcwMnhfdXNiX2lub3V0X2NtZChkLFNFVF9QSURfRklMVEVSLHN0LT5waWRfdGFibGUsMTcsYnVmLDksMTApOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCXZwNzAyeF91c2JfaW5fb3AoZCxSRVNFVF9UVU5FUiwwLDAsTlVMTCwwKTsKKworCXZwNzAyeF91c2JfaW5fb3AoZCxTRVRfVFVORVJfUE9XRVJfUkVRLDAsb25vZmYsTlVMTCwwKTsKKwlyZXR1cm4gdnA3MDJ4X3VzYl9pbl9vcChkLFNFVF9UVU5FUl9QT1dFUl9SRVEsMCxvbm9mZixOVUxMLDApOworfQorCisvKiBrZXlzIGZvciB0aGUgZW5jbG9zZWQgcmVtb3RlIGNvbnRyb2wgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgdnA3MDJ4X3JjX2tleXNbXSA9IHsKKwl7IDB4MDAsIDB4MDEsIEtFWV8xIH0sCisJeyAweDAwLCAweDAyLCBLRVlfMiB9LAorfTsKKworLyogcmVtb3RlIGNvbnRyb2wgc3R1ZmYgKGRvZXMgbm90IHdvcmsgd2l0aCBteSBib3gpICovCitzdGF0aWMgaW50IHZwNzAyeF9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCit7CisJdTgga2V5WzEwXTsKKwlpbnQgaTsKKworLyogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgcmV0dXJuIHRvIGVuYWJsZWQgcmVtb3RlIHF1ZXJ5aW5nICovCisJcmV0dXJuIDA7CisKKwl2cDcwMnhfdXNiX2luX29wKGQsUkVBRF9SRU1PVEVfUkVRLDAsMCxrZXksMTApOworCisJZGViX3JjKCJyZW1vdGUgcXVlcnkga2V5OiAleCAlZFxuIixrZXlbMV0sa2V5WzFdKTsKKworCWlmIChrZXlbMV0gPT0gMHg0NCkgeworCQkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZwNzAyeF9yY19rZXlzKTsgaSsrKQorCQlpZiAodnA3MDJ4X3JjX2tleXNbaV0uY3VzdG9tID09IGtleVsxXSkgeworCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOworCQkJKmV2ZW50ID0gdnA3MDJ4X3JjX2tleXNbaV0uZXZlbnQ7CisJCQlicmVhazsKKwkJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzAyeF9yZWFkX21hY19hZGRyKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCx1OCBtYWNbNl0pCit7CisJdTggbWFjYls5XTsKKwlpZiAodnA3MDJ4X3VzYl9pbm91dF9jbWQoZCwgR0VUX01BQ19BRERSRVNTLCBOVUxMLCAwLCBtYWNiLCA5LCAxMCkpCisJCXJldHVybiAtRUlPOworCW1lbWNweShtYWMsJm1hY2JbM10sNik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDJ4X2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJdTggYnVmWzldID0geyAwIH07CisKKwlpZiAodnA3MDJ4X3VzYl9pbm91dF9jbWQoZCwgR0VUX1NZU1RFTV9TVFJJTkcsIE5VTEwsIDAsIGJ1ZiwgOSwgMTApKQorCQlyZXR1cm4gLUVJTzsKKworCWJ1Zls4XSA9ICdcMCc7CisJaW5mbygic3lzdGVtIHN0cmluZzogJXMiLCZidWZbMV0pOworCisJZC0+ZmUgPSB2cDcwMnhfZmVfYXR0YWNoKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyB2cDcwMnhfcHJvcGVydGllczsKKworc3RhdGljIGludCB2cDcwMnhfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJdXNiX2NsZWFyX2hhbHQodWRldix1c2Jfc25kY3RybHBpcGUodWRldiwwKSk7CisJdXNiX2NsZWFyX2hhbHQodWRldix1c2JfcmN2Y3RybHBpcGUodWRldiwwKSk7CisKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZ2cDcwMnhfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHZwNzAyeF91c2JfdGFibGUgW10gPSB7CisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1ZJU0lPTlBMVVMsIFVTQl9QSURfVFdJTkhBTl9WUDcwMjFfQ09MRCkgfSwKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfVklTSU9OUExVUywgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMV9XQVJNKSB9LAorCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLCBVU0JfUElEX1RXSU5IQU5fVlA3MDIwX0NPTEQpIH0sCisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1ZJU0lPTlBMVVMsIFVTQl9QSURfVFdJTkhBTl9WUDcwMjBfV0FSTSkgfSwKKwkgICAgeyAwIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHZwNzAyeF91c2JfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyB2cDcwMnhfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX05FRURfUElEX0ZJTFRFUklORywKKwkucGlkX2ZpbHRlcl9jb3VudCA9IDgsIC8qICEhISAqLworCisJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCisJLmZpcm13YXJlID0gImR2Yi11c2ItdnA3MDJ4LTAxLmZ3IiwKKworCS5waWRfZmlsdGVyICAgICAgID0gdnA3MDJ4X3BpZF9maWx0ZXIsCisJLnBvd2VyX2N0cmwgICAgICAgPSB2cDcwMnhfcG93ZXJfY3RybCwKKwkuZnJvbnRlbmRfYXR0YWNoICA9IHZwNzAyeF9mcm9udGVuZF9hdHRhY2gsCisJLnJlYWRfbWFjX2FkZHJlc3MgPSB2cDcwMnhfcmVhZF9tYWNfYWRkciwKKworCS5yY19rZXlfbWFwICAgICAgID0gdnA3MDJ4X3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKHZwNzAyeF9yY19rZXlzKSwKKwkucmNfaW50ZXJ2YWwgICAgICA9IDQwMCwKKwkucmNfcXVlcnkgICAgICAgICA9IHZwNzAyeF9yY19xdWVyeSwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCB2cDcwMnhfc3RhdGUpLAorCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA3LAorCQkuZW5kcG9pbnQgPSAweDAyLAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJLmRldmljZXMgPSB7CisJCXsgLm5hbWUgPSAiVHdpbmhhbkRUViBTdGFyQm94IERWQi1TIFVTQjIuMCAoVlA3MDIxKSIsCisJCSAgLmNvbGRfaWRzID0geyAmdnA3MDJ4X3VzYl90YWJsZVswXSwgTlVMTCB9LAorCQkgIC53YXJtX2lkcyA9IHsgJnZwNzAyeF91c2JfdGFibGVbMV0sIE5VTEwgfSwKKwkJfSwKKwkJeyAubmFtZSA9ICJUd2luaGFuRFRWIFN0YXJCb3ggRFZCLVMgVVNCMi4wIChWUDcwMjApIiwKKwkJICAuY29sZF9pZHMgPSB7ICZ2cDcwMnhfdXNiX3RhYmxlWzJdLCBOVUxMIH0sCisJCSAgLndhcm1faWRzID0geyAmdnA3MDJ4X3VzYl90YWJsZVszXSwgTlVMTCB9LAorCQl9LAorCQl7IDAgfSwKKwl9Cit9OworCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdnA3MDJ4X3VzYl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJkdmItdXNiLXZwNzAyeCIsCisJLnByb2JlIAkJPSB2cDcwMnhfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUgCT0gdnA3MDJ4X3VzYl90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgdnA3MDJ4X3VzYl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJaWYgKChyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnZwNzAyeF91c2JfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiAoJWQpIixyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdnA3MDJ4X3VzYl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZ2cDcwMnhfdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHZwNzAyeF91c2JfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodnA3MDJ4X3VzYl9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFR3aW5oYW4gU3RhckJveCBEVkItUyBVU0IyLjAgYW5kIGNsb25lcyIpOworTU9EVUxFX1ZFUlNJT04oIjEuMC1hbHBoYSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzZThjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmgKQEAgLTAsMCArMSwxMDkgQEAKKyNpZm5kZWYgX0RWQl9VU0JfVlA3MDIxX0hfCisjZGVmaW5lIF9EVkJfVVNCX1ZQNzAyMV9IXworCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAidnA3MDJ4IgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworZXh0ZXJuIGludCBkdmJfdXNiX3ZwNzAyeF9kZWJ1ZzsKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgZHByaW50ayhkdmJfdXNiX3ZwNzAyeF9kZWJ1ZywweDAxLGFyZ3MpCisjZGVmaW5lIGRlYl94ZmVyKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl92cDcwMnhfZGVidWcsMHgwMixhcmdzKQorI2RlZmluZSBkZWJfcmMoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfdnA3MDJ4X2RlYnVnLDB4MDQsYXJncykKKyNkZWZpbmUgZGViX2ZlKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX3ZwNzAyeF9kZWJ1ZywweDA4LGFyZ3MpCisKKy8qIGNvbW1hbmRzIGFyZSByZWFkIGFuZCB3cml0dGVuIHdpdGggVVNCIGNvbnRyb2wgbWVzc2FnZXMgKi8KKworLyogY29uc2VjdXRpdmUgcmVhZC93cml0ZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgUkVRVUVTVF9PVVQgICAgICAgMHhCMgorI2RlZmluZSBSRVFVRVNUX0lOCQkgIDB4QjMKKworLyogdGhlIG91dC1idWZmZXIgb2YgdGhlc2UgY29uc2VjdXRpdmUgb3BlcmF0aW9ucyBjb250YWluIHN1Yi1jb21tYW5kcyB3aGVuIGJbMF0gPSAwCisgKiByZXF1ZXN0OiAweEIyOyBpOiAwOyB2OiAwOyBiWzBdID0gMCwgYlsxXSA9IHN1YmNtZCwgYWRkaXRpb25hbCBidWZmZXIKKyAqIHRoZSByZXR1cm5pbmcgYnVmZmVyIGxvb2tzIGFzIGZvbGxvd3MKKyAqIHJlcXVlc3Q6IDB4QjM7IGk6IDA7IHY6IDA7IGJbMF0gPSAweEIzLCBhZGRpdGlvbmFsIGJ1ZmZlciAqLworCisjZGVmaW5lIEdFVF9UVU5FUl9TVEFUVVMgIDB4MDUKKy8qIGFkZGl0aW9uYWwgaW4gYnVmZmVyOgorICogMCAgIDEgICAyICAgIDMgICAgICAgICAgICAgIDQgICA1ICAgNiAgICAgICAgICAgICAgIDcgICAgICAgOAorICogTi9BIE4vQSAweDA1IHNpZ25hbC1xdWFsaXR5IE4vQSBOL0Egc2lnbmFsLXN0cmVuZ3RoIGxvY2s9PTAgTi9BICovCisKKyNkZWZpbmUgR0VUX1NZU1RFTV9TVFJJTkcgMHgwNgorLyogYWRkaXRpb25hbCBpbiBidWZmZXI6CisgKiAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDgKKyAqIE4vQSAnVScgJ1MnICdCJyAnNycgJzAnICcyJyAnWCcgTi9BICovCisKKyNkZWZpbmUgU0VUX0RJU0VRQ19DTUQgICAgMHgwOAorLyogYWRkaXRpb25hbCBvdXQgYnVmZmVyOgorICogMCAgICAxICAyICAzICA0CisgKiBsZW4gIFgxIFgyIFgzIFg0CisgKiBhZGRpdGlvbmFsIGluIGJ1ZmZlcjoKKyAqIDAgICAxIDIKKyAqIE4vQSAwIDAgICBiWzFdID09IGJbMl0gPT0gMCAtPiBzdWNjZXNzIG90aGVyd2lzZSBub3QgKi8KKworI2RlZmluZSBTRVRfTE5CX1BPV0VSICAgICAweDA5CisvKiBhZGRpdGlvbmFsIG91dCBidWZmZXI6CisgKiAwICAgIDEgICAgMgorICogMHgwMCAweGZmIDEgPSBvbiwgMCA9IG9mZgorICogYWRkaXRpb25hbCBpbiBidWZmZXI6CisgKiAwICAgMSAyCisgKiBOL0EgMCAwICAgYlsxXSA9PSBiWzJdID09IDAgLT4gc3VjY2VzcyBvdGhlcndpc2Ugbm90ICovCisKKyNkZWZpbmUgR0VUX01BQ19BRERSRVNTICAgMHgwQQorLyogI2RlZmluZSBHRVRfTUFDX0FERFJFU1MgICAweDBCICovCisvKiBhZGRpdGlvbmFsIGluIGJ1ZmZlcjoKKyAqIDAgICAxICAgMiAgICAgICAgICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4CisgKiBOL0EgTi9BIDB4MEEgb3IgMHgwQiBNQUMwIE1BQzEgTUFDMiBNQUMzIE1BQzQgTUFDNSAqLworCisjZGVmaW5lIFNFVF9QSURfRklMVEVSICAgIDB4MTEKKy8qIGFkZGl0aW9uYWwgaW4gYnVmZmVyOgorICogMCAgICAgICAgMSAgICAgICAgLi4uIDE0ICAgICAgIDE1ICAgICAgIDE2CisgKiBQSUQwX01TQiBQSUQwX0xTQiAuLi4gUElEN19NU0IgUElEN19MU0IgUElEX2FjdGl2ZSAoYml0cykgKi8KKworLyogcmVxdWVzdDogMHhCMjsgaTogMDsgdjogMDsKKyAqIGJbMF0gIT0gMCAtPiB0dW5lIGFuZCBsb2NrIGEgY2hhbm5lbAorICogMCAgICAgMSAgICAgMiAgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgIDcKKyAqIGZyZXEwIGZyZXExIGRpdnN0ZXAgc3JhdGUwIHNyYXRlMSBzcmF0ZTIgZmxhZyBjaGtzdW0KKyAqLworCisKKy8qIG9uZSBkaXJlY3Rpb24gcmVxdWVzdHMgKi8KKyNkZWZpbmUgUkVBRF9SRU1PVEVfUkVRICAgICAgIDB4QjQKKy8qIElOICBpOiAwOyB2OiAwOyBiWzBdID09IHJlcXVlc3QsIGJbMV0gPT0ga2V5ICovCisKKyNkZWZpbmUgUkVBRF9QSURfTlVNQkVSX1JFUSAgIDB4QjUKKy8qIElOICBpOiAwOyB2OiAwOyBiWzBdID09IHJlcXVlc3QsIGJbMV0gPT0gMCwgYlsyXSA9IHBpZCBudW1iZXIgKi8KKworI2RlZmluZSBXUklURV9FRVBST01fUkVRICAgICAgMHhCNgorLyogT1VUIGk6IG9mZnNldDsgdjogdmFsdWUgdG8gd3JpdGU7IG5vIGV4dHJhIGJ1ZmZlciAqLworCisjZGVmaW5lIFJFQURfRUVQUk9NX1JFUSAgICAgICAweEI3CisvKiBJTiAgaTogYnVmZmVybGVuOyB2OiBvZmZzZXQ7IGJ1ZmZlciB3aXRoIGJ1ZmZlcmxlbiBieXRlcyAqLworCisjZGVmaW5lIFJFQURfU1RBVFVTICAgICAgICAgICAweEI4CisvKiBJTiAgaTogMDsgdjogMDsgYnVmZmVybGVuIDEwICovCisKKyNkZWZpbmUgUkVBRF9UVU5FUl9SRUdfUkVRICAgIDB4QjkKKy8qIElOICBpOiAwOyB2OiByZWdpc3RlcjsgYlswXSA9IHZhbHVlICovCisKKyNkZWZpbmUgUkVBRF9GWDJfUkVHX1JFUSAgICAgIDB4QkEKKy8qIElOICBpOiBvZmZzZXQ7IHY6IDA7IGJbMF0gPSB2YWx1ZSAqLworCisjZGVmaW5lIFdSSVRFX0ZYMl9SRUdfUkVRICAgICAweEJCCisvKiBPVVQgaTogb2Zmc2V0OyB2OiB2YWx1ZSB0byB3cml0ZTsgMSBieXRlIGV4dHJhIGJ1ZmZlciAqLworCisjZGVmaW5lIFNFVF9UVU5FUl9QT1dFUl9SRVEgICAweEJDCisvKiBJTiAgaTogMCA9IHBvd2VyIG9mZiwgMSA9IHBvd2VyIG9uICovCisKKyNkZWZpbmUgV1JJVEVfVFVORVJfUkVHX1JFUSAgIDB4QkQKKy8qIElOICBpOiByZWdpc3RlciwgdjogdmFsdWUgdG8gd3JpdGUsIG5vIGV4dHJhIGJ1ZmZlciAqLworCisjZGVmaW5lIFJFU0VUX1RVTkVSICAgICAgICAgICAweEJFCisvKiBJTiAgaTogMCwgdjogMCwgbm8gZXh0cmEgYnVmZmVyICovCisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogdnA3MDJ4X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOworCitleHRlcm4gaW50IHZwNzAyeF91c2JfaW5vdXRfb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCAqbywgaW50IG9sZW4sIHU4ICppLCBpbnQgaWxlbiwgaW50IG1zZWMpOworZXh0ZXJuIGludCB2cDcwMnhfdXNiX2lub3V0X2NtZChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IGNtZCwgdTggKm8sIGludCBvbGVuLCB1OCAqaSwgaW50IGlsZW4sIGludCBtc2VjKTsKK2V4dGVybiBpbnQgdnA3MDJ4X3VzYl9pbl9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbik7CitleHRlcm4gaW50IHZwNzAyeF91c2Jfb3V0X29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwppbmRleCA5YWM5NWY1Li4wZjU3YWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKQEAgLTE2NCw3ICsxNjQsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgdnA3MDQ1X3JlYWRfbWFjX2FkZHIoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLHU4IG1hY1s2XSkKIHsKIAlyZXR1cm4gdnA3MDQ1X3JlYWRfZWVwcm9tKGQsbWFjLCA2LCBNQUNfMF9BRERSKTsKQEAgLTE5OSw3ICsxOTgsNyBAQAogc3RhdGljIGludCB2cDcwNDVfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0JcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmdnA3MDQ1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpOworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnZwNzA0NV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdnA3MDQ1X3VzYl90YWJsZSBbXSA9IHsKQEAgLTI1Niw5ICsyNTUsOSBAQAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHZwNzA0NV91c2JfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAiZHZiX3VzYl92cDcwNDUiLAotCS5wcm9iZSAJCT0gdnA3MDQ1X3VzYl9wcm9iZSwKKwkucHJvYmUJCT0gdnA3MDQ1X3VzYl9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCi0JLmlkX3RhYmxlIAk9IHZwNzA0NV91c2JfdGFibGUsCisJLmlkX3RhYmxlCT0gdnA3MDQ1X3VzYl90YWJsZSwKIH07CiAKIC8qIG1vZHVsZSBzdHVmZiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKaW5kZXggODIyMmI4OC4uZDRiOTc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgICBjeDI0MTEwIC0gU2luZ2xlIENoaXAgU2F0ZWxsaXRlIENoYW5uZWwgUmVjZWl2ZXIgZHJpdmVyIG1vZHVsZQogCi0gICAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEB0LW9ubGluZS5kZT4gYmFzZWQgb24KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQGh0cC10ZWwuZGU+IGJhc2VkIG9uCiAgICAgd29yawogICAgIENvcHlyaWdodCAoQykgMTk5OSBDb252ZXJnZW5jZSBJbnRlZ3JhdGVkIE1lZGlhIEdtYkggPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgogCkBAIC0zODcsOCArMzg3LDkgQEAKIAogc3RhdGljIGludCBjeDI0MTEwX2Rpc2VxY19zZW5kX2J1cnN0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKIHsKLQlpbnQgcnYsIGJpdCwgaTsKKwlpbnQgcnYsIGJpdDsKIAlzdHJ1Y3QgY3gyNDExMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAlpZiAoYnVyc3QgPT0gU0VDX01JTklfQSkKIAkJYml0ID0gMHgwMDsKQEAgLTM5OCwxMiArMzk5LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJcnYgPSBjeDI0MTEwX3JlYWRyZWcoc3RhdGUsIDB4NzcpOwotCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIDB4NzcsIHJ2fDB4MDQpOworCWlmICghKHJ2ICYgMHgwNCkpCisJCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIDB4NzcsIHJ2IHwgMHgwNCk7CiAKIAlydiA9IGN4MjQxMTBfcmVhZHJlZyhzdGF0ZSwgMHg3Nik7CiAJY3gyNDExMF93cml0ZXJlZyhzdGF0ZSwgMHg3NiwgKChydiAmIDB4OTApIHwgMHg0MCB8IGJpdCkpOwotCWZvciAoaSA9IDUwMDsgaS0tID4gMCAmJiAhKGN4MjQxMTBfcmVhZHJlZyhzdGF0ZSwweDc2KSYweDQwKSA7ICkKLSAgICAgICAgICAgICAgOyAvKiB3YWl0IGZvciBMTkIgcmVhZHkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwl3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkgJiYgIShjeDI0MTEwX3JlYWRyZWcoc3RhdGUsIDB4NzYpICYgMHg0MCkpCisJCTsgLyogd2FpdCBmb3IgTE5CIHJlYWR5ICovCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxMywxNyArNDE2LDIyIEBACiB7CiAJaW50IGksIHJ2OwogCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCWZvciAoaSA9IDA7IGkgPCBjbWQtPm1zZ19sZW47IGkrKykKIAkJY3gyNDExMF93cml0ZXJlZyhzdGF0ZSwgMHg3OSArIGksIGNtZC0+bXNnW2ldKTsKIAogCXJ2ID0gY3gyNDExMF9yZWFkcmVnKHN0YXRlLCAweDc3KTsKLQljeDI0MTEwX3dyaXRlcmVnKHN0YXRlLCAweDc3LCBydnwweDA0KTsKKwlpZiAocnYgJiAweDA0KSB7CisJCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIDB4NzcsIHJ2ICYgfjB4MDQpOworCQltc2xlZXAoMzApOyAvKiByZXBvcnRlZGx5IGZpeGVzIHN3aXRjaGluZyBwcm9ibGVtcyAqLworCX0KIAogCXJ2ID0gY3gyNDExMF9yZWFkcmVnKHN0YXRlLCAweDc2KTsKIAogCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIDB4NzYsICgocnYgJiAweDkwKSB8IDB4NDApIHwgKChjbWQtPm1zZ19sZW4tMykgJiAzKSk7Ci0JZm9yIChpPTUwMDsgaS0tID4gMCAmJiAhKGN4MjQxMTBfcmVhZHJlZyhzdGF0ZSwweDc2KSYweDQwKTspCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpICYmICEoY3gyNDExMF9yZWFkcmVnKHN0YXRlLCAweDc2KSAmIDB4NDApKQogCQk7IC8qIHdhaXQgZm9yIExOQiByZWFkeSAqLwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaAppbmRleCA2YjY2M2Y0Li5iNjNlY2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICAgIGN4MjQxMTAgLSBTaW5nbGUgQ2hpcCBTYXRlbGxpdGUgQ2hhbm5lbCBSZWNlaXZlciBkcml2ZXIgbW9kdWxlCiAKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgSGV0dGthbXAgPHBldGVyLmhldHRrYW1wQHQtb25saW5lLmRlPiBiYXNlZCBvbgorICAgIENvcHlyaWdodCAoQykgMjAwMiBQZXRlciBIZXR0a2FtcCA8cGV0ZXIuaGV0dGthbXBAaHRwLXRlbC5kZT4gYmFzZWQgb24KICAgICB3b3JrCiAgICAgQ29weXJpZ2h0IChDKSAxOTk5IENvbnZlcmdlbmNlIEludGVncmF0ZWQgTWVkaWEgR21iSCA8cmFscGhAY29udmVyZ2VuY2UuZGU+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwppbmRleCBjZDQzNGI3Li4yMTQzM2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKaW5kZXggY2QzMzcwNS4uNDQxZGU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwpAQCAtMjIsNyArMjIsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYwppbmRleCAxZjFjZDdhLi43MTQyYjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYwpAQCAtNjksOCArNjksOCBAQAogfTsKIAogc3RhdGljIGludCBpMmNfd3JpdGVfZGVtb2RfYnl0ZXMgKHN0cnVjdCBsZ2R0MzMweF9zdGF0ZSogc3RhdGUsCi0JCQkgICB1OCAqYnVmLCAvKiBkYXRhIGJ5dGVzIHRvIHNlbmQgKi8KLQkJCSAgIGludCBsZW4gIC8qIG51bWJlciBvZiBieXRlcyB0byBzZW5kICovICkKKwkJCQkgIHU4ICpidWYsIC8qIGRhdGEgYnl0ZXMgdG8gc2VuZCAqLworCQkJCSAgaW50IGxlbiAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgKi8gKQogewogCXN0cnVjdCBpMmNfbXNnIG1zZyA9CiAJCXsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLApAQCAtMTI5LDEzICsxMjksMTMgQEAKIAl9OwogCiAJcmV0ID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLAotCQkJICAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CisJCQkJICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKIAlpZiAocmV0ID09IDApIHsKIAogCQkvKiBmb3JjZSByZXNldCBoaWdoIChpbmFjdGl2ZSkgYW5kIHVubWFzayBpbnRlcnJ1cHRzICovCiAJCXJlc2V0WzFdID0gMHg3ZjsKIAkJcmV0ID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLAotCQkJCSAgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOworCQkJCQkgICAgcmVzZXQsIHNpemVvZihyZXNldCkpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQ5LDEzICsxNDksMTMgQEAKIAl9OwogCiAJcmV0ID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLAotCQkJICAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CisJCQkJICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKIAlpZiAocmV0ID09IDApIHsKIAogCQkvKiBmb3JjZSByZXNldCBoaWdoIChpbmFjdGl2ZSkgKi8KIAkJcmVzZXRbMV0gPSAweDAxOwogCQlyZXQgPSBpMmNfd3JpdGVfZGVtb2RfYnl0ZXMoc3RhdGUsCi0JCQkJICAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CisJCQkJCSAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xNzIsNyArMTcyLDYgQEAKIAl9CiB9CiAKLQogc3RhdGljIGludCBsZ2R0MzMweF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCS8qIEhhcmR3YXJlIHJlc2V0IGlzIGRvbmUgdXNpbmcgZ3Bpb1swXSBvZiBjeDIzODgweCBjaGlwLgpAQCAtMjI5LDEzICsyMjgsMTMgQEAKIAljYXNlIExHRFQzMzAyOgogCQljaGlwX25hbWUgPSAiTEdEVDMzMDIiOwogCQllcnIgPSBpMmNfd3JpdGVfZGVtb2RfYnl0ZXMoc3RhdGUsIGxnZHQzMzAyX2luaXRfZGF0YSwKLQkJCQkJCQkJCXNpemVvZihsZ2R0MzMwMl9pbml0X2RhdGEpKTsKLSAgCQlicmVhazsKKwkJCQkJICAgIHNpemVvZihsZ2R0MzMwMl9pbml0X2RhdGEpKTsKKwkJYnJlYWs7CiAJY2FzZSBMR0RUMzMwMzoKIAkJY2hpcF9uYW1lID0gIkxHRFQzMzAzIjsKIAkJZXJyID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKHN0YXRlLCBsZ2R0MzMwM19pbml0X2RhdGEsCi0JCQkJCQkJCQlzaXplb2YobGdkdDMzMDNfaW5pdF9kYXRhKSk7Ci0gIAkJYnJlYWs7CisJCQkJCSAgICBzaXplb2YobGdkdDMzMDNfaW5pdF9kYXRhKSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNoaXBfbmFtZSA9ICJ1bmRlZmluZWQiOwogCQlwcmludGsgKEtFUk5fV0FSTklORyAiT25seSBMR0RUMzMwMiBhbmQgTEdEVDMzMDMgYXJlIHN1cHBvcnRlZCBjaGlwcy5cbiIpOwpAQCAtMjYyLDE1ICsyNjEsMTUgQEAKIAlzd2l0Y2ggKHN0YXRlLT5jb25maWctPmRlbW9kX2NoaXApIHsKIAljYXNlIExHRFQzMzAyOgogCQllcnIgPSBpMmNfcmVhZF9kZW1vZF9ieXRlcyhzdGF0ZSwgTEdEVDMzMDJfUEFDS0VUX0VSUl9DT1VOVEVSMSwKLQkJCQkJCQkJICBidWYsIHNpemVvZihidWYpKTsKLSAgCQlicmVhazsKKwkJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CisJCWJyZWFrOwogCWNhc2UgTEdEVDMzMDM6CiAJCWVyciA9IGkyY19yZWFkX2RlbW9kX2J5dGVzKHN0YXRlLCBMR0RUMzMwM19QQUNLRVRfRVJSX0NPVU5URVIxLAotCQkJCQkJCQkgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAJCWJyZWFrOworCQkJCQkgICBidWYsIHNpemVvZihidWYpKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgIk9ubHkgTEdEVDMzMDIgYW5kIExHRFQzMzAzIGFyZSBzdXBwb3J0ZWQgY2hpcHMuXG4iKTsKKwkJICAgICAgICJPbmx5IExHRFQzMzAyIGFuZCBMR0RUMzMwMyBhcmUgc3VwcG9ydGVkIGNoaXBzLlxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJfQogCkBAIC0zMzAsNyArMzI5LDcgQEAKIAogCQkJaWYgKHN0YXRlLT5jb25maWctPmRlbW9kX2NoaXAgPT0gTEdEVDMzMDMpIHsKIAkJCQllcnIgPSBpMmNfd3JpdGVfZGVtb2RfYnl0ZXMoc3RhdGUsIGxnZHQzMzAzXzh2c2JfNDRfZGF0YSwKLQkJCQkJCQkJCQkJc2l6ZW9mKGxnZHQzMzAzXzh2c2JfNDRfZGF0YSkpOworCQkJCQkJCSAgICBzaXplb2YobGdkdDMzMDNfOHZzYl80NF9kYXRhKSk7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMzc4LDE4ICszNzcsMTkgQEAKIAogCQkvKiBTZWxlY3QgdGhlIHJlcXVlc3RlZCBtb2RlICovCiAJCWkyY193cml0ZV9kZW1vZF9ieXRlcyhzdGF0ZSwgdG9wX2N0cmxfY2ZnLAotCQkJCQkJCSAgc2l6ZW9mKHRvcF9jdHJsX2NmZykpOwotCQlzdGF0ZS0+Y29uZmlnLT5zZXRfdHNfcGFyYW1zKGZlLCAwKTsKKwkJCQkgICAgICBzaXplb2YodG9wX2N0cmxfY2ZnKSk7CisJCWlmIChzdGF0ZS0+Y29uZmlnLT5zZXRfdHNfcGFyYW1zKQorCQkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CiAJCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbjsKIAl9CiAKLQkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIGNoYW5uZWwgKi8KLQlpZiAoc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ICE9IHBhcmFtLT5mcmVxdWVuY3kpIHsKLQkJLyogVHVuZSB0byB0aGUgbmV3IGZyZXF1ZW5jeSAqLworCS8qIFR1bmUgdG8gdGhlIHNwZWNpZmllZCBmcmVxdWVuY3kgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkKIAkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcGFyYW0pOwotCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBuZXcgZnJlcXVlbmN5ICovCi0JCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IHBhcmFtLT5mcmVxdWVuY3k7Ci0JfQorCisJLyogS2VlcCB0cmFjayBvZiB0aGUgbmV3IGZyZXF1ZW5jeSAqLworCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IHBhcmFtLT5mcmVxdWVuY3k7CisKIAlsZ2R0MzMweF9Td1Jlc2V0KHN0YXRlKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKaW5kZXggZDMyZGM0ZC4uY2MxYmMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKQEAgLTQ2Miw5ICs0NjIsMTEgQEAKIHsKIAlzdHJ1Y3QgbXQzNTJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQl1MTYgc2lnbmFsID0gKChtdDM1Ml9yZWFkX3JlZ2lzdGVyKHN0YXRlLCBBR0NfR0FJTl8xKSA8PCA4KSAmIDB4MGYpIHwKLQkJICAgICAgKG10MzUyX3JlYWRfcmVnaXN0ZXIoc3RhdGUsIEFHQ19HQUlOXzApKTsKKwkvKiBhbGlnbiB0aGUgMTIgYml0IEFHQyBnYWluIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyAqLworCXUxNiBzaWduYWwgPSAoKG10MzUyX3JlYWRfcmVnaXN0ZXIoc3RhdGUsIEFHQ19HQUlOXzEpICYgMHgwZikgPDwgMTIpIHwKKwkJKG10MzUyX3JlYWRfcmVnaXN0ZXIoc3RhdGUsIEFHQ19HQUlOXzApIDw8IDQpOwogCisJLyogaW52ZXJzZSBvZiBnYWluIGlzIHNpZ25hbCBzdHJlbmd0aCAqLwogCSpzdHJlbmd0aCA9IH5zaWduYWw7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYwppbmRleCA5NjZkZTk4Li44OGE1N2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKQEAgLTQ4Miw2ICs0ODIsNyBAQAogCWlmICgocmVzdWx0ID0gbnh0NjAwMF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwYXJhbS0+aW52ZXJzaW9uKSkgPCAwKQogCQlyZXR1cm4gcmVzdWx0OwogCisJbXNsZWVwKDUwMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyNSw2ICs1MjYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBueHQ2MDAwX2ZlX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gNTAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbnh0NjAwMF9vcHM7CiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQqIG54dDYwMDBfYXR0YWNoKGNvbnN0IHN0cnVjdCBueHQ2MDAwX2NvbmZpZyogY29uZmlnLApAQCAtNTc4LDYgKzU4NSw4IEBACiAKIAkuaW5pdCA9IG54dDYwMDBfaW5pdCwKIAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IG54dDYwMDBfZmVfZ2V0X3R1bmVfc2V0dGluZ3MsCisKIAkuc2V0X2Zyb250ZW5kID0gbnh0NjAwMF9zZXRfZnJvbnRlbmQsCiAKIAkucmVhZF9zdGF0dXMgPSBueHQ2MDAwX3JlYWRfc3RhdHVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKaW5kZXggY2MwYTc3Yy4uYjZkMGVlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCkBAIC0zNzAsMjIgKzM3MCwxOSBAQAogCQlvcjUxMTMyX3NldG1vZGUoZmUpOwogCX0KIAotCS8qIENoYW5nZSBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBjaGFuZ2luZyB0aGUgY2hhbm5lbCAqLwotCWlmIChzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgIT0gcGFyYW0tPmZyZXF1ZW5jeSkgewotCQlkdmJfcGxsX2NvbmZpZ3VyZShzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYywgYnVmLAotCQkJCSAgcGFyYW0tPmZyZXF1ZW5jeSwgMCk7Ci0JCWRwcmludGsoInNldF9wYXJhbWV0ZXJzIHR1bmVyIGJ5dGVzOiAweCUwMnggMHglMDJ4ICIKLQkJCSIweCUwMnggMHglMDJ4XG4iLGJ1ZlswXSxidWZbMV0sYnVmWzJdLGJ1ZlszXSk7Ci0JCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+cGxsX2FkZHJlc3MgLGJ1ZiwgNCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBzZXRfcGFyYW1ldGVycyBlcnJvciAiCi0JCQkgICAgICAgIndyaXRpbmcgdG8gdHVuZXJcbiIpOworCWR2Yl9wbGxfY29uZmlndXJlKHN0YXRlLT5jb25maWctPnBsbF9kZXNjLCBidWYsCisJCQkgIHBhcmFtLT5mcmVxdWVuY3ksIDApOworCWRwcmludGsoInNldF9wYXJhbWV0ZXJzIHR1bmVyIGJ5dGVzOiAweCUwMnggMHglMDJ4ICIKKwkJIjB4JTAyeCAweCUwMnhcbiIsYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzICxidWYsIDQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBzZXRfcGFyYW1ldGVycyBlcnJvciAiCisJCSAgICAgICAid3JpdGluZyB0byB0dW5lclxuIik7CiAKLQkJLyogU2V0IHRvIGN1cnJlbnQgbW9kZSAqLwotCQlvcjUxMTMyX3NldG1vZGUoZmUpOworCS8qIFNldCB0byBjdXJyZW50IG1vZGUgKi8KKwlvcjUxMTMyX3NldG1vZGUoZmUpOwogCi0JCS8qIFVwZGF0ZSBjdXJyZW50IGZyZXF1ZW5jeSAqLwotCQlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSBwYXJhbS0+ZnJlcXVlbmN5OwotCX0KKwkvKiBVcGRhdGUgY3VycmVudCBmcmVxdWVuY3kgKi8KKwlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSBwYXJhbS0+ZnJlcXVlbmN5OwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwppbmRleCA0ZjM5NmFjLi5jN2ZlMjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKQEAgLTQ4LDcgKzQ4LDggQEAKIH07CiAKIHN0YXRpYyB1MzIgczVoMTQyMF9nZXRzeW1ib2xyYXRlKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSk7Ci1zdGF0aWMgaW50IHM1aDE0MjBfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncyk7CitzdGF0aWMgaW50IHM1aDE0MjBfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpOwogCiAKIHN0YXRpYyBpbnQgZGVidWcgPSAwOwpAQCAtOTEsNyArOTIsOCBAQAogCiAJc3dpdGNoKHZvbHRhZ2UpIHsKIAljYXNlIFNFQ19WT0xUQUdFXzEzOgotCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDNjLCAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNjKSAmIDB4ZmUpIHwgMHgwMik7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MsCisJCQkJIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2MpICYgMHhmZSkgfCAweDAyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNFQ19WT0xUQUdFXzE4OgpAQCAtMTEyLDE4ICsxMTQsMjEgQEAKIAogCXN3aXRjaCh0b25lKSB7CiAJY2FzZSBTRUNfVE9ORV9PTjoKLQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDc0KSB8IDB4MDgpOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDNiLAorCQkJCSAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4NzQpIHwgMHgwOCk7CiAJCWJyZWFrOwogCiAJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3NCkgfCAweDAxKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwKKwkJCQkgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDc0KSB8IDB4MDEpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzNWgxNDIwX3NlbmRfbWFzdGVyX2NtZCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqIGNtZCkKK3N0YXRpYyBpbnQgczVoMTQyMF9zZW5kX21hc3Rlcl9jbWQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKiBjbWQpCiB7CiAJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggdmFsOwpAQCAtMTMxLDYgKzEzNiw5IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCByZXN1bHQgPSAwOwogCisJaWYgKGNtZC0+bXNnX2xlbiA+IDgpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogc2V0dXAgZm9yIERJU0VRQyAqLwogCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHgwMik7CkBAIC0xMzgsMTYgKzE0NiwxNyBAQAogCiAJLyogd3JpdGUgdGhlIERJU0VRQyBjb21tYW5kIGJ5dGVzICovCiAJZm9yKGk9MDsgaTwgY21kLT5tc2dfbGVuOyBpKyspIHsKLQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYyArIGksIGNtZC0+bXNnW2ldKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzZCArIGksIGNtZC0+bXNnW2ldKTsKIAl9CiAKIAkvKiBraWNrIG9mZiB0cmFuc21pc3Npb24gKi8KLQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDNiLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpIHwgKChjbWQtPm1zZ19sZW4tMSkgPDwgNCkgfCAweDA4KTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDNiLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpIHwKKwkJCQkgICAgICAoKGNtZC0+bXNnX2xlbi0xKSA8PCA0KSB8IDB4MDgpOwogCiAJLyogd2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlICovCiAJdGltZW91dCA9IGppZmZpZXMgKyAoKDEwMCpIWikgLyAxMDAwKTsKIAl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlpZiAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4MDgpCisJCWlmICghKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDA4KSkKIAkJCWJyZWFrOwogCiAJCW1zbGVlcCg1KTsKQEAgLTE2MSw3ICsxNzAsOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkqIHJlcGx5KQorc3RhdGljIGludCBzNWgxNDIwX3JlY3Zfc2xhdmVfcmVwbHkgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICAgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkqIHJlcGx5KQogewogCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHZhbDsKQEAgLTIwNSw3ICsyMTUsNyBAQAogCiAJLyogZXh0cmFjdCBkYXRhICovCiAJZm9yKGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKLQkJcmVwbHktPm1zZ1tpXSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYyArIGkpOworCQlyZXBseS0+bXNnW2ldID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNkICsgaSk7CiAJfQogCiBleGl0OgpAQCAtMjM2LDcgKzI0Niw3IEBACiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSB8IDB4MDgpOwogCiAJLyogd2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoKDIwKkhaKSAvIDEwMDApOworCXRpbWVvdXQgPSBqaWZmaWVzICsgKCgxMDAqSFopIC8gMTAwMCk7CiAJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJaWYgKCEoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4MDgpKQogCQkJYnJlYWs7CkBAIC0yNTksOSArMjY5LDkgQEAKIAogCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxNCk7CiAJaWYgKHZhbCAmIDB4MDIpCi0JCXN0YXR1cyB8PSAgRkVfSEFTX1NJR05BTDsgLy8gRklYTUU6IG5vdCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQKKwkJc3RhdHVzIHw9ICBGRV9IQVNfU0lHTkFMOwogCWlmICh2YWwgJiAweDAxKQotCQlzdGF0dXMgfD0gIEZFX0hBU19DQVJSSUVSOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCQlzdGF0dXMgfD0gIEZFX0hBU19DQVJSSUVSOwogCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzNik7CiAJaWYgKHZhbCAmIDB4MDEpCiAJCXN0YXR1cyB8PSAgRkVfSEFTX1ZJVEVSQkk7CkBAIC0yODQsOCArMjk0LDggQEAKIAkvKiBkZXRlcm1pbmUgbG9jayBzdGF0ZSAqLwogCSpzdGF0dXMgPSBzNWgxNDIwX2dldF9zdGF0dXNfYml0cyhzdGF0ZSk7CiAKLQkvKiBmaXggZm9yIEZFQyA1LzYgaW52ZXJzaW9uIGlzc3VlIC0gaWYgaXQgZG9lc24ndCBxdWl0ZSBsb2NrLCBpbnZlcnQgdGhlIGludmVyc2lvbiwKLQl3YWl0IGEgYml0IGFuZCBjaGVjayBhZ2FpbiAqLworCS8qIGZpeCBmb3IgRkVDIDUvNiBpbnZlcnNpb24gaXNzdWUgLSBpZiBpdCBkb2Vzbid0IHF1aXRlIGxvY2ssIGludmVydAorCXRoZSBpbnZlcnNpb24sIHdhaXQgYSBiaXQgYW5kIGNoZWNrIGFnYWluICovCiAJaWYgKCpzdGF0dXMgPT0gKEZFX0hBU19TSUdOQUx8RkVfSEFTX0NBUlJJRVJ8RkVfSEFTX1ZJVEVSQkkpKSB7CiAJCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMik7CiAJCWlmICgodmFsICYgMHgwNykgPT0gMHgwMykgewpAQCAtMzMwLDYgKzM0MCwxMCBAQAogCQkJdG1wID0gKHRtcCAqIDIgKiA3KSAvIDg7CiAJCQlicmVhazsKIAkJfQorCQlpZiAodG1wID09IDApIHsKKwkJCXByaW50aygiczVoMTQyMDogYXZvaWRlZCBkaXZpc2lvbiBieSAwXG4iKTsKKwkJCXRtcCA9IDE7CisJCX0KIAkJdG1wID0gc3RhdGUtPmZjbGsgLyB0bXA7CiAKIAkJLyogc2V0IHRoZSBNUEVHX0NMS19JTlRMIGZvciB0aGUgY2FsY3VsYXRlZCBkYXRhIHJhdGUgKi8KQEAgLTM2OCwxNiArMzgyLDIxIEBACiAKIAlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDQ2LCAweDFkKTsKIAltZGVsYXkoMjUpOwotCXJldHVybiAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ4KSA8PCA4KSB8IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0Nyk7CisKKwkqYmVyID0gKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0OCkgPDwgOCkgfCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgczVoMTQyMF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKIHsKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCXU4IHZhbCA9IDB4ZmYgLSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTUpOworCXU4IHZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxNSk7CiAKLQlyZXR1cm4gKGludCkgKCh2YWwgPDwgOCkgfCB2YWwpOworCSpzdHJlbmd0aCA9ICAodTE2KSAoKHZhbCA8PCA4KSB8IHZhbCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzNWgxNDIwX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCkBAIC0zODYsNyArNDA1LDEwIEBACiAKIAlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDQ2LCAweDFmKTsKIAltZGVsYXkoMjUpOwotCXJldHVybiAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ4KSA8PCA4KSB8IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0Nyk7CisKKwkqdWNibG9ja3MgPSAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ4KSA8PCA4KSB8IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHg0Nyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgczVoMTQyMF9yZXNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCkBAIC0zOTYsMTEgKzQxOCwxMiBAQAogCXVkZWxheSgxMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHM1aDE0MjBfc2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3N0YXRpYyB2b2lkIHM1aDE0MjBfc2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CiAJdTY0IHZhbDsKIAotCXZhbCA9IChwLT51LnFwc2suc3ltYm9sX3JhdGUgLyAxMDAwKSAqICgxPDwyNCk7CisJdmFsID0gKCh1NjQpIHAtPnUucXBzay5zeW1ib2xfcmF0ZSAvIDEwMDBVTEwpICogKDFVTEw8PDI0KTsKIAlpZiAocC0+dS5xcHNrLnN5bWJvbF9yYXRlIDw9IDIxMDAwMDAwKSB7CiAJCXZhbCAqPSAyOwogCX0KQEAgLTQxNSw3ICs0MzgsNyBAQAogCiBzdGF0aWMgdTMyIHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCiB7Ci0JdTY0IHZhbDsKKwl1NjQgdmFsID0gMDsKIAlpbnQgc2FtcGxpbmcgPSAyOwogCiAJaWYgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNSkgJiAweDIpCkBAIC00MjcsMTAgKzQ1MCwxMCBAQAogCXZhbCB8PSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTMpOwogCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgJiAweGY3KTsKIAotCXZhbCAqPSAoc3RhdGUtPmZjbGsgLyAxMDAwKTsKKwl2YWwgKj0gKHN0YXRlLT5mY2xrIC8gMTAwMFVMTCk7CiAJZG9fZGl2KHZhbCwgKCgxPDwyNCkgKiBzYW1wbGluZykpOwogCi0JcmV0dXJuICh1MzIpICh2YWwgKiAxMDAwKTsKKwlyZXR1cm4gKHUzMikgKHZhbCAqIDEwMDBVTEwpOwogfQogCiBzdGF0aWMgdm9pZCBzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBpbnQgZnJlcW9mZnNldCkKQEAgLTQ2Myw0NiArNDg2LDU1IEBACiAKIAkvKiByZW1lbWJlciBmcmVxb2Zmc2V0IGlzIGluIGtIeiwgYnV0IHRoZSBjaGlwIHdhbnRzIHRoZSBvZmZzZXQgaW4gSHosIHNvCiAJICogZGl2aWRlIGZjbGsgYnkgMTAwMDAwMCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuICovCi0JdmFsID0gLSAoKHZhbCAqIChzdGF0ZS0+ZmNsay8xMDAwMDAwKSkgLyAoMTw8MjQpKTsKKwl2YWwgPSAoKCgtdmFsKSAqIChzdGF0ZS0+ZmNsay8xMDAwMDAwKSkgLyAoMTw8MjQpKTsKIAogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHM1aDE0MjBfc2V0ZmVjKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIHZvaWQgczVoMTQyMF9zZXRmZWNfaW52ZXJzaW9uKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwKKwkJCSAgIAkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKKwl1OCBpbnZlcnNpb24gPSAwOworCisJaWYgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fT0ZGKSB7CisJCWludmVyc2lvbiA9IHN0YXRlLT5jb25maWctPmludmVydCA/IDB4MDggOiAwOworCX0gZWxzZSBpZiAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9PTikgeworCQlpbnZlcnNpb24gPSBzdGF0ZS0+Y29uZmlnLT5pbnZlcnQgPyAwIDogMHgwODsKKwl9CisKIAlpZiAoKHAtPnUucXBzay5mZWNfaW5uZXIgPT0gRkVDX0FVVE8pIHx8IChwLT5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX0FVVE8pKSB7Ci0JCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MDApOwogCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDNmKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgwMCB8IGludmVyc2lvbik7CiAJfSBlbHNlIHsKIAkJc3dpdGNoKHAtPnUucXBzay5mZWNfaW5uZXIpIHsKIAkJY2FzZSBGRUNfMV8yOgotCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMCk7CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDAxKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTAgfCBpbnZlcnNpb24pOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGRUNfMl8zOgotCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMSk7CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDAyKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTEgfCBpbnZlcnNpb24pOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGRUNfM180OgotCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMik7CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDA0KTsKLQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMiB8IGludmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogCQljYXNlIEZFQ181XzY6Ci0JCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDEzKTsKIAkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MDgpOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMyB8IGludmVyc2lvbik7CiAJCQlicmVhazsKIAogCQljYXNlIEZFQ182Xzc6Ci0JCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDE0KTsKIAkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MTApOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNCB8IGludmVyc2lvbik7CiAJCQlicmVhazsKIAogCQljYXNlIEZFQ183Xzg6Ci0JCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDE1KTsKIAkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MjApOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNSB8IGludmVyc2lvbik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtNTM2LDIyICs1NjgsNiBAQAogCXJldHVybiBGRUNfTk9ORTsKIH0KIAotc3RhdGljIHZvaWQgczVoMTQyMF9zZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCi17Ci0JaWYgKChwLT51LnFwc2suZmVjX2lubmVyID09IEZFQ19BVVRPKSB8fCAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9BVVRPKSkgewotCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDAwKTsKLQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgzZik7Ci0JfSBlbHNlIHsKLQkJdTggdG1wID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDMxKSAmIDB4Zjc7Ci0JCQl0bXAgfD0gMHgxMDsKLQotCQlpZiAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9PTikKLQkJCXRtcCB8PSAweDgwOwotCi0JCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIHRtcCk7Ci0JfQotfQotCiBzdGF0aWMgZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgczVoMTQyMF9nZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQogewogCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwOCkKQEAgLTU2MCwzNSArNTc2LDM1IEBACiAJcmV0dXJuIElOVkVSU0lPTl9PRkY7CiB9CiAKLXN0YXRpYyBpbnQgczVoMTQyMF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3N0YXRpYyBpbnQgczVoMTQyMF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewogCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXUzMiBmcmVxdWVuY3lfZGVsdGE7CisJaW50IGZyZXF1ZW5jeV9kZWx0YTsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgZmVzZXR0aW5nczsKKwl1MzIgdG1wOwogCiAJLyogY2hlY2sgaWYgd2Ugc2hvdWxkIGRvIGEgZmFzdC10dW5lICovCiAJbWVtY3B5KCZmZXNldHRpbmdzLnBhcmFtZXRlcnMsIHAsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpKTsKIAlzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKGZlLCAmZmVzZXR0aW5ncyk7CiAJZnJlcXVlbmN5X2RlbHRhID0gcC0+ZnJlcXVlbmN5IC0gc3RhdGUtPnR1bmVkZnJlcTsKLQlpZiAoKGZyZXF1ZW5jeV9kZWx0YSA+IC1mZXNldHRpbmdzLm1heF9kcmlmdCkgJiYgKGZyZXF1ZW5jeV9kZWx0YSA8IGZlc2V0dGluZ3MubWF4X2RyaWZ0KSAmJgorCWlmICgoZnJlcXVlbmN5X2RlbHRhID4gLWZlc2V0dGluZ3MubWF4X2RyaWZ0KSAmJgorCSAgICAoZnJlcXVlbmN5X2RlbHRhIDwgZmVzZXR0aW5ncy5tYXhfZHJpZnQpICYmCiAJICAgIChmcmVxdWVuY3lfZGVsdGEgIT0gMCkgJiYKIAkgICAgKHN0YXRlLT5mZWNfaW5uZXIgPT0gcC0+dS5xcHNrLmZlY19pbm5lcikgJiYKIAkgICAgKHN0YXRlLT5zeW1ib2xfcmF0ZSA9PSBwLT51LnFwc2suc3ltYm9sX3JhdGUpKSB7CiAKLQkJczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0YXRlLCBmcmVxdWVuY3lfZGVsdGEpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgeworCQkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOworCQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCwgJnRtcCk7CisJCQlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIHAtPmZyZXF1ZW5jeSAtIHRtcCk7CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogZmlyc3Qgb2YgYWxsLCBzb2Z0d2FyZSByZXNldCAqLwogCXM1aDE0MjBfcmVzZXQoc3RhdGUpOwogCi0JLyogc2V0IHR1bmVyIFBMTCAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KSB7Ci0JCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgfCAxKTsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCwgJnN0YXRlLT50dW5lZGZyZXEpOwotCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpICYgMHhmZSk7Ci0JfQotCiAJLyogc2V0IHM1aDE0MjAgZmNsayBQTEwgYWNjb3JkaW5nIHRvIGRlc2lyZWQgc3ltYm9sIHJhdGUgKi8KIAlpZiAocC0+dS5xcHNrLnN5bWJvbF9yYXRlID4gMjgwMDAwMDApIHsKIAkJc3RhdGUtPmZjbGsgPSA4ODAwMDAwMDsKQEAgLTYwOSw4ICs2MjUsOSBAQAogCiAJLyogc2V0IG1pc2MgcmVnaXN0ZXJzICovCiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwMiwgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNiwgMHgwMCk7CiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNywgMHhiMCk7Ci0JczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYSwgMHg2Nyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYSwgMHhlNyk7CiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYiwgMHg3OCk7CiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYywgMHg0OCk7CiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZCwgMHg2Yik7CkBAIC02MjYsMjEgKzY0MywyNiBAQAogCS8qIHN0YXJ0IFFQU0sgKi8KIAlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA1LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDUpIHwgMSk7CiAKLQkvKiBzZXQgdGhlIGZyZXF1ZW5jeSBvZmZzZXQgdG8gYWRqdXN0IGZvciBQTEwgaW5hY2N1cmFjeSAqLwotCXM1aDE0MjBfc2V0ZnJlcW9mZnNldChzdGF0ZSwgcC0+ZnJlcXVlbmN5IC0gc3RhdGUtPnR1bmVkZnJlcSk7CisJLyogc2V0IHR1bmVyIFBMTCAqLworCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KSB7CisJCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgfCAxKTsKKwkJc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCwgJnRtcCk7CisJCXM1aDE0MjBfc2V0ZnJlcW9mZnNldChzdGF0ZSwgMCk7CisJfQogCiAJLyogc2V0IHRoZSByZXNldCBvZiB0aGUgcGFyYW1ldGVycyAqLwogCXM1aDE0MjBfc2V0c3ltYm9scmF0ZShzdGF0ZSwgcCk7Ci0JczVoMTQyMF9zZXRpbnZlcnNpb24oc3RhdGUsIHApOwotCXM1aDE0MjBfc2V0ZmVjKHN0YXRlLCBwKTsKKwlzNWgxNDIwX3NldGZlY19pbnZlcnNpb24oc3RhdGUsIHApOwogCiAJc3RhdGUtPmZlY19pbm5lciA9IHAtPnUucXBzay5mZWNfaW5uZXI7CiAJc3RhdGUtPnN5bWJvbF9yYXRlID0gcC0+dS5xcHNrLnN5bWJvbF9yYXRlOwogCXN0YXRlLT5wb3N0bG9ja2VkID0gMDsKKwlzdGF0ZS0+dHVuZWRmcmVxID0gcC0+ZnJlcXVlbmN5OwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHM1aDE0MjBfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCitzdGF0aWMgaW50IHM1aDE0MjBfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIApAQCAtNjUyLDcgKzY3NCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVoMTQyMF9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKiBmZXNldHRpbmdzKQorc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKiBmZXNldHRpbmdzKQogewogCWlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDIwMDAwMDAwKSB7CiAJCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDUwOwpAQCAtNzE3LDcgKzc0MCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBzNWgxNDIwX29wczsKIAotc3RydWN0IGR2Yl9mcm9udGVuZCogczVoMTQyMF9hdHRhY2goY29uc3Qgc3RydWN0IHM1aDE0MjBfY29uZmlnKiBjb25maWcsIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQorc3RydWN0IGR2Yl9mcm9udGVuZCogczVoMTQyMF9hdHRhY2goY29uc3Qgc3RydWN0IHM1aDE0MjBfY29uZmlnKiBjb25maWcsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQogewogCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAJdTggaWRlbnRpdHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaAppbmRleCBiNjg3ZmM3Li44NzIwMjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKQEAgLTMwLDYgKzMwLDkgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKKwkvKiBkb2VzIHRoZSBpbnZlcnNpb24gcmVxdWlyZSBpbnZlcnNpb24/ICovCisJdTggaW52ZXJ0OjE7CisKIAkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KIAlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwogCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTMyKiBmcmVxb3V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCmluZGV4IDkyOGFjYTAuLjhkMDlhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYwpAQCAtMzUsNyArMzUsNiBAQAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAKIAl1bnNpZ25lZCBsb25nIGJhc2VfZnJlcTsKLQl1OCBwd207CiB9OwogCiAjaWYgMQpAQCAtNDYsOTQgKzQ1LDYgQEAKIAogI2RlZmluZSBTVFYwMjk3X0NMT0NLX0tIWiAgIDI4OTAwCiAKLXN0YXRpYyB1OCBpbml0X3RhYltdID0gewotCTB4MDAsIDB4MDksCi0JMHgwMSwgMHg2OSwKLQkweDAzLCAweDAwLAotCTB4MDQsIDB4MDAsCi0JMHgwNywgMHgwMCwKLQkweDA4LCAweDAwLAotCTB4MjAsIDB4MDAsCi0JMHgyMSwgMHg0MCwKLQkweDIyLCAweDAwLAotCTB4MjMsIDB4MDAsCi0JMHgyNCwgMHg0MCwKLQkweDI1LCAweDg4LAotCTB4MzAsIDB4ZmYsCi0JMHgzMSwgMHgwMCwKLQkweDMyLCAweGZmLAotCTB4MzMsIDB4MDAsCi0JMHgzNCwgMHg1MCwKLQkweDM1LCAweDdmLAotCTB4MzYsIDB4MDAsCi0JMHgzNywgMHgyMCwKLQkweDM4LCAweDAwLAotCTB4NDAsIDB4MWMsCi0JMHg0MSwgMHhmZiwKLQkweDQyLCAweDI5LAotCTB4NDMsIDB4MDAsCi0JMHg0NCwgMHhmZiwKLQkweDQ1LCAweDAwLAotCTB4NDYsIDB4MDAsCi0JMHg0OSwgMHgwNCwKLQkweDRhLCAweGZmLAotCTB4NGIsIDB4N2YsCi0JMHg1MiwgMHgzMCwKLQkweDU1LCAweGFlLAotCTB4NTYsIDB4NDcsCi0JMHg1NywgMHhlMSwKLQkweDU4LCAweDNhLAotCTB4NWEsIDB4MWUsCi0JMHg1YiwgMHgzNCwKLQkweDYwLCAweDAwLAotCTB4NjMsIDB4MDAsCi0JMHg2NCwgMHgwMCwKLQkweDY1LCAweDAwLAotCTB4NjYsIDB4MDAsCi0JMHg2NywgMHgwMCwKLQkweDY4LCAweDAwLAotCTB4NjksIDB4MDAsCi0JMHg2YSwgMHgwMiwKLQkweDZiLCAweDAwLAotCTB4NzAsIDB4ZmYsCi0JMHg3MSwgMHgwMCwKLQkweDcyLCAweDAwLAotCTB4NzMsIDB4MDAsCi0JMHg3NCwgMHgwYywKLQkweDgwLCAweDAwLAotCTB4ODEsIDB4MDAsCi0JMHg4MiwgMHgwMCwKLQkweDgzLCAweDAwLAotCTB4ODQsIDB4MDQsCi0JMHg4NSwgMHg4MCwKLQkweDg2LCAweDI0LAotCTB4ODcsIDB4NzgsCi0JMHg4OCwgMHgwMCwKLQkweDg5LCAweDAwLAotCTB4OTAsIDB4MDEsCi0JMHg5MSwgMHgwMSwKLQkweGEwLCAweDAwLAotCTB4YTEsIDB4MDAsCi0JMHhhMiwgMHgwMCwKLQkweGIwLCAweDkxLAotCTB4YjEsIDB4MGIsCi0JMHhjMCwgMHg1MywKLQkweGMxLCAweDcwLAotCTB4YzIsIDB4MTIsCi0JMHhkMCwgMHgwMCwKLQkweGQxLCAweDAwLAotCTB4ZDIsIDB4MDAsCi0JMHhkMywgMHgwMCwKLQkweGQ0LCAweDAwLAotCTB4ZDUsIDB4MDAsCi0JMHhkZSwgMHgwMCwKLQkweGRmLCAweDAwLAotCTB4NjEsIDB4NDksCi0JMHg2MiwgMHgwYiwKLQkweDUzLCAweDA4LAotCTB4NTksIDB4MDgsCi19OwotCiAKIHN0YXRpYyBpbnQgc3R2MDI5N193cml0ZXJlZyhzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTggZGF0YSkKIHsKQEAgLTM3OCwzNCArMjg5LDkgQEAKIAlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgaTsKIAotCS8qIHNvZnQgcmVzZXQgKi8KLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODAsIDEsIDEpOwotCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg4MCwgMSwgMCk7Ci0KLQkvKiByZXNldCBkZWludGVybGVhdmVyICovCi0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDgxLCAxLCAxKTsKLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODEsIDEsIDApOwotCiAJLyogbG9hZCBpbml0IHRhYmxlICovCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihpbml0X3RhYik7IGkgKz0gMikgewotCQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCBpbml0X3RhYltpXSwgaW5pdF90YWJbaSArIDFdKTsKLQl9Ci0KLQkvKiBzZXQgYSBkdW1teSBzeW1ib2wgcmF0ZSAqLwotCXN0djAyOTdfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIDY5MDApOwotCi0JLyogaW52ZXJ0IEFHQzEgcG9sYXJpdHkgKi8KLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODgsIDB4MTAsIDB4MTApOwotCi0JLyogc2V0dXAgYml0IGVycm9yIGNvdW50aW5nICovCi0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweEEwLCAweDgwLCAweDAwKTsKLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4QTAsIDB4MTAsIDB4MDApOwotCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHhBMCwgMHgwOCwgMHgwMCk7Ci0Jc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweEEwLCAweDA3LCAweDA0KTsKLQotCS8qIG1pbiArIG1heCBQV00gKi8KLQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDRhLCAweDAwKTsKLQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCAweDRiLCBzdGF0ZS0+cHdtKTsKKwlmb3IgKGk9MDsgIShzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2ldID09IDB4ZmYgJiYgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpKzFdID09IDB4ZmYpOyBpKz0yKQorCQlzdHYwMjk3X3dyaXRlcmVnKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2ldLCBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2krMV0pOwogCW1zbGVlcCgyMDApOwogCiAJaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KQpAQCAtNjA2LDcgKzQ5MiwxMyBAQAogCXN0djAyOTdfc2V0X2ludmVyc2lvbihzdGF0ZSwgaW52ZXJzaW9uKTsKIAogCS8qIGtpY2sgb2ZmIGxvY2sgKi8KLQlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODgsIDB4MDgsIDB4MDgpOworCS8qIERpc2FibGUgY29ybmVyIGRldGVjdGlvbiBmb3IgaGlnaGVyIFFBTXMgKi8KKwlpZiAocC0+dS5xYW0ubW9kdWxhdGlvbiA9PSBRQU1fMTI4IHx8CisJCXAtPnUucWFtLm1vZHVsYXRpb24gPT0gUUFNXzI1NikKKwkJc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDg4LCAweDA4LCAweDAwKTsKKwllbHNlCisJCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg4OCwgMHgwOCwgMHgwOCk7CisKIAlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4NWEsIDB4MjAsIDB4MDApOwogCXN0djAyOTdfd3JpdGVyZWdfbWFzayhzdGF0ZSwgMHg2YSwgMHgwMSwgMHgwMSk7CiAJc3R2MDI5N193cml0ZXJlZ19tYXNrKHN0YXRlLCAweDQzLCAweDQwLCAweDQwKTsKQEAgLTczMiw3ICs2MjQsNyBAQAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHN0djAyOTdfb3BzOwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzdHYwMjk3X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5N19jb25maWcgKmNvbmZpZywKLQkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGludCBwd20pCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQogewogCXN0cnVjdCBzdHYwMjk3X3N0YXRlICpzdGF0ZSA9IE5VTEw7CiAKQEAgLTc0Niw3ICs2MzgsNiBAQAogCXN0YXRlLT5pMmMgPSBpMmM7CiAJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmc3R2MDI5N19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5iYXNlX2ZyZXEgPSAwOwotCXN0YXRlLT5wd20gPSBwd207CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAoKHN0djAyOTdfcmVhZHJlZyhzdGF0ZSwgMHg4MCkgJiAweDcwKSAhPSAweDIwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmgKaW5kZXggM2JlNTM1OS4uOWU1M2YwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oCkBAIC0yOSw2ICsyOSwxMiBAQAogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKIAorCS8qIGluaXR0YWIgLSBhcnJheSBvZiBwYWlycyBvZiB2YWx1ZXMuCisJKiBGaXJzdCBvZiBlYWNoIHBhaXIgaXMgdGhlIHJlZ2lzdGVyLCBzZWNvbmQgaXMgdGhlIHZhbHVlLgorCSogTGlzdCBzaG91bGQgYmUgdGVybWluYXRlZCB3aXRoIGFuIDB4ZmYsIDB4ZmYgcGFpci4KKwkqLworCXU4KiBpbml0dGFiOworCiAJLyogZG9lcyB0aGUgImludmVyc2lvbiIgbmVlZCBpbnZlcnRlZD8gKi8KIAl1OCBpbnZlcnQ6MTsKIApAQCAtMzgsNyArNDQsNyBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHN0djAyOTdfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjk3X2NvbmZpZyogY29uZmlnLAotCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYywgaW50IHB3bSk7CisJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKIGV4dGVybiBpbnQgc3R2MDI5N19lbmFibGVfcGxsaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKIAogI2VuZGlmIC8vIFNUVjAyOTdfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKaW5kZXggY2ZhMzkyOC4uMmQ2MjkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCkBAIC02MywxMiArNjMsOCBAQAogCXUzMiB0dW5lcl9mcmVxdWVuY3k7CiAJdTMyIHN5bWJvbF9yYXRlOwogCWZlX2NvZGVfcmF0ZV90IGZlY19pbm5lcjsKLQlpbnQgZXJybW9kZTsKIH07CiAKLSNkZWZpbmUgU1RBVFVTX0JFUiAwCi0jZGVmaW5lIFNUQVRVU19VQ0JMT0NLUyAxCi0KIHN0YXRpYyBpbnQgZGVidWc7CiBzdGF0aWMgaW50IGRlYnVnX2xlZ2FjeV9kaXNoX3N3aXRjaDsKICNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCkBAIC00ODEsNyArNDc3LDcgQEAKIAogCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewogCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCi0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKKwkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUsIHN0YXRlLT5pMmMpOwogCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHgzNSk7CS8qICBkaXNhYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwogCX0KIApAQCAtNTIwLDcgKzUxNiw4IEBACiB7CiAgICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JaWYgKHN0YXRlLT5lcnJtb2RlICE9IFNUQVRVU19CRVIpIHJldHVybiAwOworCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDM0LCAoc3R2MDI5OV9yZWFkcmVnKHN0YXRlLCAweDM0KSAmIDB4Y2YpIHwgMHgxMCk7CisJbXNsZWVwKDEwMCk7CiAJKmJlciA9IChzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFkKSA8PCA4KSB8IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWUpOwogCiAJcmV0dXJuIDA7CkBAIC01NTksOCArNTU2LDkgQEAKIHsKICAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQlpZiAoc3RhdGUtPmVycm1vZGUgIT0gU1RBVFVTX1VDQkxPQ0tTKSAqdWNibG9ja3MgPSAwOwotCWVsc2UgKnVjYmxvY2tzID0gKHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWQpIDw8IDgpIHwgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZSk7CisJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MzQsIChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MzQpICYgMHhjZikgfCAweDMwKTsKKwltc2xlZXAoMTAwKTsKKwkqdWNibG9ja3MgPSAoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZCkgPDwgOCkgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjAzLDcgKzYwMSw3IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBBICJub3JtYWwiIHR1bmUgaXMgcmVxdWVzdGVkICovCiAJCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCi0JCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKKwkJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHN0YXRlLT5pMmMsIHApOwogCQkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOwkvKiAgZGlzYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KIAogCQkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MzIsIDB4ODApOwpAQCAtNjE1LDcgKzYxMyw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCi0JCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOworCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBzdGF0ZS0+aTJjLCBwKTsKIAkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOwkvKiAgZGlzYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KIAogCQlzdHYwMjk5X3NldF9GRUMgKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKQEAgLTcwOSw3ICs3MDcsNiBAQAogCXN0YXRlLT50dW5lcl9mcmVxdWVuY3kgPSAwOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IDA7CiAJc3RhdGUtPmZlY19pbm5lciA9IDA7Ci0Jc3RhdGUtPmVycm1vZGUgPSBTVEFUVVNfQkVSOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDIsIDB4MzQpOyAvKiBzdGFuZGJ5IG9mZiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKaW5kZXggNzk0NTdhOC4uZDBjNDQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCkBAIC05Miw4ICs5Miw4IEBACiAJaW50ICgqc2V0X3N5bWJvbF9yYXRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pOwogCiAJLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOworCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpOwogfTsKIAogZXh0ZXJuIGludCBzdHYwMjk5X3dyaXRlcmVnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTggcmVnLCB1OCBkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKaW5kZXggYWIwYzAzMi4uNzRjZWE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKQEAgLTEwNDYsOCArMTA0Niw3IEBACiAJdG1wID0gdGRhMTAwNHhfcmVhZF9ieXRlKHN0YXRlLCBUREExMDA0WF9TTlIpOwogCWlmICh0bXAgPCAwKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAodG1wKQotCQl0bXAgPSAyNTUgLSB0bXA7CisJdG1wID0gMjU1IC0gdG1wOwogCiAJKnNuciA9ICgodG1wIDw8IDgpIHwgdG1wKTsKIAlkcHJpbnRrKCIlczogc25yPTB4JXhcbiIsIF9fRlVOQ1RJT05fXywgKnNucik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYwppbmRleCA3MGZiNDRiLi5jNmQyNzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMKQEAgLTE5NCwxOSArMTk0LDE4IEBACiB7CiAJc3RydWN0IHZlczE4MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IGk7Ci0JaW50IHZhbDsKIAogCXZlczE4MjBfd3JpdGVyZWcoc3RhdGUsIDAsIDApOwogCi0JZm9yIChpID0gMDsgaSA8IDUzOyBpKyspIHsKLQkJdmFsID0gdmVzMTgyMF9pbml0dGFiW2ldOwotCQlpZiAoKGkgPT0gMikgJiYgKHN0YXRlLT5jb25maWctPnNlbGFnYykpIHZhbCB8PSAweDA4OwotCQl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCBpLCB2YWwpOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHZlczE4MjBfaW5pdHRhYik7IGkrKykKKwkJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgaSwgdmVzMTgyMF9pbml0dGFiW2ldKTsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+c2VsYWdjKQorCQl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCAyLCB2ZXMxODIwX2luaXR0YWJbMl0gfCAweDA4KTsKIAogCXZlczE4MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzQsIHN0YXRlLT5wd20pOwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSBzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CisJaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KQorCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNCw3ICsyMzMsNyBAQAogCXZlczE4MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDksIHJlZzB4MDlbcmVhbF9xYW1dKTsKIAogCXZlczE4MjBfc2V0dXBfcmVnMChzdGF0ZSwgcmVnMHgwMFtyZWFsX3FhbV0sIHAtPmludmVyc2lvbik7Ci0KKwl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCAyLCB2ZXMxODIwX2luaXR0YWJbMl0gfCAoc3RhdGUtPmNvbmZpZy0+c2VsYWdjID8gMHgwOCA6IDApKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYwppbmRleCBlNGM2ZTg3Li4yMmIyMDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYwpAQCAtMTY4LDcgKzE2OCw5IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcHJpbnRrKCJkdmItdHRwY2k6Y2Fubm90IHN3aXRjaCBvbiBTQ0FSVChBRCk6JWRcbiIscmV0KTsKIAkJaWYgKHJnYl9vbiAmJgotCQkgICAgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMTBhKSAmJiAoYXY3MTEwLT5kZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAwMDApKSB7CisJCSAgICAoKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMTBhKSB8fAorCQkgICAgIChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTNjMikpICYmCisJCSAgICAgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDAwKSkgewogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMSwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLy8gUkdCIG9uLCBTQ0FSVCBwaW4gMTYKIAkJCS8vc2FhNzE0Nl9zZXRncGlvKGRldiwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsgLy8gU0NBUlRwaW4gOAogCQl9CkBAIC0xNzcsOSArMTc5LDYgQEAKIAlyZXQgPSBhdjcxMTBfc2V0X3ZvbHVtZShhdjcxMTAsIGF2NzExMC0+bWl4ZXIudm9sdW1lX2xlZnQsIGF2NzExMC0+bWl4ZXIudm9sdW1lX3JpZ2h0KTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKCJkdmItdHRwY2k6Y2Fubm90IHNldCB2b2x1bWUgOiVkXG4iLHJldCk7Ci0JcmV0ID0gYXY3MTEwX3NldHVwX2lyY19jb25maWcoYXY3MTEwLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKCJkdmItdHRwY2k6Y2Fubm90IHNldHVwIGlyYyBjb25maWcgOiVkXG4iLHJldCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlY292ZXJfYXJtKHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKQEAgLTI2NSw2MCArMjY0LDYgQEAKIH0KIAogCi0vKioKLSAqICBIYWNrISB3ZSBzYXZlIHRoZSBsYXN0IGF2NzExMCBwdHIuIFRoaXMgc2hvdWxkIGJlIG9rLCBzaW5jZQotICogIHlvdSByYXJlbHkgd2lsbCB1c2UgbW9yZSB0aGVuIG9uZSBJUiBjb250cm9sLgotICoKLSAqICBJZiB3ZSB3YW50IHRvIHN1cHBvcnQgbXVsdGlwbGUgY29udHJvbHMgd2Ugd291bGQgaGF2ZSB0byBkbyBtdWNoIG1vcmUuLi4KLSAqLwotaW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdGF0aWMgc3RydWN0IGF2NzExMCAqbGFzdDsKLQotCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwotCi0JaWYgKCFhdjcxMTApCi0JCWF2NzExMCA9IGxhc3Q7Ci0JZWxzZQotCQlsYXN0ID0gYXY3MTEwOwotCi0JaWYgKGF2NzExMCkgewotCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOwotCQlhdjcxMTAtPmlyX2NvbmZpZyA9IGlyX2NvbmZpZzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgKCppcmNfaGFuZGxlcikodTMyKTsKLQotdm9pZCBhdjcxMTBfcmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpCi17Ci0JZHByaW50ayg0LCAicmVnaXN0ZXJpbmcgJXBcbiIsIGZ1bmMpOwotCWlyY19oYW5kbGVyID0gZnVuYzsKLX0KLQotdm9pZCBhdjcxMTBfdW5yZWdpc3Rlcl9pcmNfaGFuZGxlcih2b2lkICgqZnVuYykodTMyKSkKLXsKLQlkcHJpbnRrKDQsICJ1bnJlZ2lzdGVyaW5nICVwXG4iLCBmdW5jKTsKLQlpcmNfaGFuZGxlciA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ1bl9oYW5kbGVycyh1bnNpZ25lZCBsb25nIGlyY29tKQotewotCWlmIChpcmNfaGFuZGxlciAhPSBOVUxMKQotCQkoKmlyY19oYW5kbGVyKSgodTMyKSBpcmNvbSk7Ci19Ci0KLXN0YXRpYyBERUNMQVJFX1RBU0tMRVQoaXJ0YXNrLCBydW5faGFuZGxlcnMsIDApOwotCi1zdGF0aWMgdm9pZCBJUl9oYW5kbGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgaXJjb20pCi17Ci0JZHByaW50ayg0LCAiaXJjb21tYW5kID0gJTA4eFxuIiwgaXJjb20pOwotCWlydGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlyY29tOwotCXRhc2tsZXRfc2NoZWR1bGUoJmlydGFzayk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJUlEgaGFuZGxpbmcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzExLDggKzY1Niw5IEBACiAJCXJldHVybjsKIAogCWNhc2UgREFUQV9JUkNPTU1BTkQ6Ci0JCUlSX2hhbmRsZShhdjcxMTAsCi0JCQkgIHN3YWh3MzIoaXJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgUmVzZXJ2ZWQsIDAsIDQpKSk7CisJCWlmIChhdjcxMTAtPmlyX2hhbmRsZXIpCisJCQlhdjcxMTAtPmlyX2hhbmRsZXIoYXY3MTEwLAorCQkJCXN3YWh3MzIoaXJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgUmVzZXJ2ZWQsIDAsIDQpKSk7CiAJCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIFJYX0JVRkYsIDAsIDIpOwogCQlicmVhazsKIApAQCAtMTY2OCw5ICsxNjE0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbHBzX2JzcnU2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX2JzcnU2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKLQlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSAoc3RydWN0IGF2NzExMCopIGZlLT5kdmItPnByaXY7CiAJaW50IHJldDsKIAl1OCBkYXRhWzRdOwogCXUzMiBkaXY7CkBAIC0xNjg3LDcgKzE2MzIsNyBAQAogCiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkgZGF0YVszXSA9IDB4YzA7CiAKLQlyZXQgPSBpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpOworCXJldCA9IGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpOwogCWlmIChyZXQgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CkBAIC0xNzUxLDkgKzE2OTYsOCBAQAogCTB4ZmYsIDB4ZmYKIH07CiAKLXN0YXRpYyBpbnQgYWxwc19ic2JlMV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic2JlMV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7Ci0Jc3RydWN0IGF2NzExMCogYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBmZS0+ZHZiLT5wcml2OwogCWludCByZXQ7CiAJdTggZGF0YVs0XTsKIAl1MzIgZGl2OwpAQCAtMTc2OCw3ICsxNzEyLDcgQEAKIAlkYXRhWzJdID0gMHg4MCB8ICgoZGl2ICYgMHgxODAwMCkgPj4gMTApIHwgNDsKIAlkYXRhWzNdID0gKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkgPyAweEUwIDogMHhFNDsKIAotCXJldCA9IGkyY190cmFuc2ZlcigmYXY3MTEwLT5pMmNfYWRhcCwgJm1zZywgMSk7CisJcmV0ID0gaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSk7CiAJcmV0dXJuIChyZXQgIT0gMSkgPyAtRUlPIDogMDsKIH0KIApAQCAtMTkzNiw2ICsxODgwLDk4IEBACiB9OwogCiAKK3N0YXRpYyB1OCBuZXh1c2NhX3N0djAyOTdfaW5pdHRhYltdID0geworCTB4ODAsIDB4MDEsCisJMHg4MCwgMHgwMCwKKwkweDgxLCAweDAxLAorCTB4ODEsIDB4MDAsCisJMHgwMCwgMHgwOSwKKwkweDAxLCAweDY5LAorCTB4MDMsIDB4MDAsCisJMHgwNCwgMHgwMCwKKwkweDA3LCAweDAwLAorCTB4MDgsIDB4MDAsCisJMHgyMCwgMHgwMCwKKwkweDIxLCAweDQwLAorCTB4MjIsIDB4MDAsCisJMHgyMywgMHgwMCwKKwkweDI0LCAweDQwLAorCTB4MjUsIDB4ODgsCisJMHgzMCwgMHhmZiwKKwkweDMxLCAweDAwLAorCTB4MzIsIDB4ZmYsCisJMHgzMywgMHgwMCwKKwkweDM0LCAweDUwLAorCTB4MzUsIDB4N2YsCisJMHgzNiwgMHgwMCwKKwkweDM3LCAweDIwLAorCTB4MzgsIDB4MDAsCisJMHg0MCwgMHgxYywKKwkweDQxLCAweGZmLAorCTB4NDIsIDB4MjksCisJMHg0MywgMHgwMCwKKwkweDQ0LCAweGZmLAorCTB4NDUsIDB4MDAsCisJMHg0NiwgMHgwMCwKKwkweDQ5LCAweDA0LAorCTB4NGEsIDB4MDAsCisJMHg0YiwgMHg3YiwKKwkweDUyLCAweDMwLAorCTB4NTUsIDB4YWUsCisJMHg1NiwgMHg0NywKKwkweDU3LCAweGUxLAorCTB4NTgsIDB4M2EsCisJMHg1YSwgMHgxZSwKKwkweDViLCAweDM0LAorCTB4NjAsIDB4MDAsCisJMHg2MywgMHgwMCwKKwkweDY0LCAweDAwLAorCTB4NjUsIDB4MDAsCisJMHg2NiwgMHgwMCwKKwkweDY3LCAweDAwLAorCTB4NjgsIDB4MDAsCisJMHg2OSwgMHgwMCwKKwkweDZhLCAweDAyLAorCTB4NmIsIDB4MDAsCisJMHg3MCwgMHhmZiwKKwkweDcxLCAweDAwLAorCTB4NzIsIDB4MDAsCisJMHg3MywgMHgwMCwKKwkweDc0LCAweDBjLAorCTB4ODAsIDB4MDAsCisJMHg4MSwgMHgwMCwKKwkweDgyLCAweDAwLAorCTB4ODMsIDB4MDAsCisJMHg4NCwgMHgwNCwKKwkweDg1LCAweDgwLAorCTB4ODYsIDB4MjQsCisJMHg4NywgMHg3OCwKKwkweDg4LCAweDEwLAorCTB4ODksIDB4MDAsCisJMHg5MCwgMHgwMSwKKwkweDkxLCAweDAxLAorCTB4YTAsIDB4MDQsCisJMHhhMSwgMHgwMCwKKwkweGEyLCAweDAwLAorCTB4YjAsIDB4OTEsCisJMHhiMSwgMHgwYiwKKwkweGMwLCAweDUzLAorCTB4YzEsIDB4NzAsCisJMHhjMiwgMHgxMiwKKwkweGQwLCAweDAwLAorCTB4ZDEsIDB4MDAsCisJMHhkMiwgMHgwMCwKKwkweGQzLCAweDAwLAorCTB4ZDQsIDB4MDAsCisJMHhkNSwgMHgwMCwKKwkweGRlLCAweDAwLAorCTB4ZGYsIDB4MDAsCisJMHg2MSwgMHg0OSwKKwkweDYyLCAweDBiLAorCTB4NTMsIDB4MDgsCisJMHg1OSwgMHgwOCwKKwkweGZmLCAweGZmLAorfTsKIAogc3RhdGljIGludCBuZXh1c2NhX3N0djAyOTdfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CkBAIC0xOTg0LDYgKzIwMjAsNyBAQAogc3RhdGljIHN0cnVjdCBzdHYwMjk3X2NvbmZpZyBuZXh1c2NhX3N0djAyOTdfY29uZmlnID0gewogCiAJLmRlbW9kX2FkZHJlc3MgPSAweDFDLAorCS5pbml0dGFiID0gbmV4dXNjYV9zdHYwMjk3X2luaXR0YWIsCiAJLmludmVydCA9IDEsCiAJLnBsbF9zZXQgPSBuZXh1c2NhX3N0djAyOTdfcGxsX3NldCwKIH07CkBAIC0yMjYxLDcgKzIyOTgsNyBAQAogCiAJCWNhc2UgMHgwMDBBOiAvLyBIYXVwcGF1Z2UvVFQgTmV4dXMtQ0EgcmV2MS5YCiAKLQkJCWF2NzExMC0+ZmUgPSBzdHYwMjk3X2F0dGFjaCgmbmV4dXNjYV9zdHYwMjk3X2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXAsIDB4N2IpOworCQkJYXY3MTEwLT5mZSA9IHN0djAyOTdfYXR0YWNoKCZuZXh1c2NhX3N0djAyOTdfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewogCQkJCS8qIHNldCBUREE5ODE5IGludG8gRFZCIG1vZGUgKi8KIAkJCQlzYWE3MTQ2X3NldGdwaW8oYXY3MTEwLT5kZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRMTyk7IC8vIFREQTkxOTggcGluOShTVEQpCkBAIC0yNjkyLDcgKzI3MjksNyBAQAogCQlnb3RvIGVycl9hdjcxMTBfZXhpdF92NGxfMTI7CiAKICNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9FVkRFVikgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfRVZERVZfTU9EVUxFKQotCWF2NzExMF9pcl9pbml0KCk7CisJYXY3MTEwX2lyX2luaXQoYXY3MTEwKTsKICNlbmRpZgogCXByaW50ayhLRVJOX0lORk8gImR2Yi10dHBjaTogZm91bmQgYXY3MTEwLSVkLlxuIiwgYXY3MTEwX251bSk7CiAJYXY3MTEwX251bSsrOwpAQCAtMjczNCw2ICsyNzcxLDkgQEAKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSBzYWEtPmV4dF9wcml2OwogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCisjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfRVZERVYpIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWX01PRFVMRSkKKwlhdjcxMTBfaXJfZXhpdChhdjcxMTApOworI2VuZGlmCiAJaWYgKGJ1ZGdldHBhdGNoKSB7CiAJCS8qIERpc2FibGUgUlBTMSAqLwogCQlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBNQVNLXzI5KTsKQEAgLTI4MzAsNyArMjg3MCw3IEBACiAJLmV4dF9wcml2ID0geF9uYW1lLCBcCiAJLmV4dCA9ICZhdjcxMTBfZXh0ZW5zaW9uIH0KIAotTUFLRV9BVjcxMTBfSU5GTyh0dHNfMV9YLCAgICAiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIFdpblRWIERWQi1TIHJldjEuWCIpOworTUFLRV9BVjcxMTBfSU5GTyh0dHNfMV9YX2ZzYywiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIFdpblRWIERWQi1TIHJldjEuWCBvciBGdWppdHN1IFNpZW1lbnMgRFZCLUMiKTsKIE1BS0VfQVY3MTEwX0lORk8odHR0XzFfWCwgICAgIlRlY2hub3RyZW5kL0hhdXBwYXVnZSBXaW5UViBEVkItVCByZXYxLlgiKTsKIE1BS0VfQVY3MTEwX0lORk8odHRjXzFfWCwgICAgIlRlY2hub3RyZW5kL0hhdXBwYXVnZSBXaW5UViBOZXh1cy1DQSByZXYxLlgiKTsKIE1BS0VfQVY3MTEwX0lORk8odHRjXzJfWCwgICAgIlRlY2hub3RyZW5kL0hhdXBwYXVnZSBXaW5UViBEVkItQyByZXYyLlgiKTsKQEAgLTI4NDIsMTYgKzI4ODIsMTYgQEAKIE1BS0VfQVY3MTEwX0lORk8oZnNzLCAgICAgICAgIkZ1aml0c3UgU2llbWVucyBEVkItUyByZXYxLjYiKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKLQlNQUtFX0VYVEVOU0lPTl9QQ0koZnNjLCAgICAgICAweDExMGEsIDB4MDAwMCksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0c18xX1gsICAgMHgxM2MyLCAweDAwMDApLAotCU1BS0VfRVhURU5TSU9OX1BDSSh0dHRfMV9YLCAgIDB4MTNjMiwgMHgwMDAxKSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0kodHRjXzJfWCwgICAweDEzYzIsIDB4MDAwMiksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0c18yX1gsICAgMHgxM2MyLCAweDAwMDMpLAotCU1BS0VfRVhURU5TSU9OX1BDSShmc3MsICAgICAgIDB4MTNjMiwgMHgwMDA2KSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0kodHR0LCAgICAgICAweDEzYzIsIDB4MDAwOCksCi0JTUFLRV9FWFRFTlNJT05fUENJKHR0Y18xX1gsICAgMHgxM2MyLCAweDAwMGEpLAotCU1BS0VfRVhURU5TSU9OX1BDSSh0dHNfMl8zLCAgIDB4MTNjMiwgMHgwMDBlKSwKLQlNQUtFX0VYVEVOU0lPTl9QQ0kodHRzXzFfM3NlLCAweDEzYzIsIDB4MTAwMiksCisJTUFLRV9FWFRFTlNJT05fUENJKGZzYywgICAgICAgICAweDExMGEsIDB4MDAwMCksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0c18xX1hfZnNjLCAweDEzYzIsIDB4MDAwMCksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0dF8xX1gsICAgICAweDEzYzIsIDB4MDAwMSksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0Y18yX1gsICAgICAweDEzYzIsIDB4MDAwMiksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0c18yX1gsICAgICAweDEzYzIsIDB4MDAwMyksCisJTUFLRV9FWFRFTlNJT05fUENJKGZzcywgICAgICAgICAweDEzYzIsIDB4MDAwNiksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0dCwgICAgICAgICAweDEzYzIsIDB4MDAwOCksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0Y18xX1gsICAgICAweDEzYzIsIDB4MDAwYSksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0c18yXzMsICAgICAweDEzYzIsIDB4MDAwZSksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0c18xXzNzZSwgICAweDEzYzIsIDB4MTAwMiksCiAKIC8qCU1BS0VfRVhURU5TSU9OX1BDSSg/Pz8sIDB4MTNjMiwgMHgwMDA0KSwgVU5ERUZJTkVEIENBUkQgKi8gLy8gR2FsYXhpcyBEVkIgUEMtU2F0LUNhcnRlCiAvKglNQUtFX0VYVEVOU0lPTl9QQ0koPz8/LCAweDEzYzIsIDB4MDAwNSksIFVOREVGSU5FRCBDQVJEICovIC8vIFRlY2huaXNhdCBTa3lTdGFyMQpAQCAtMjg4OSw5ICsyOTI5LDYgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGF2NzExMF9leGl0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfRVZERVYpIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWX01PRFVMRSkKLQlhdjcxMTBfaXJfZXhpdCgpOwotI2VuZGlmCiAJc2FhNzE0Nl91bnJlZ2lzdGVyX2V4dGVuc2lvbigmYXY3MTEwX2V4dGVuc2lvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKaW5kZXggNTA4Yjc3My4uY2NlMDBlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKQEAgLTIyOCw3ICsyMjgsMTAgQEAKIAlzdHJ1Y3QgZHZiX3ZpZGVvX2V2ZW50cyAgdmlkZW9fZXZlbnRzOwogCXZpZGVvX3NpemVfdAkJIHZpZGVvX3NpemU7CiAKLQl1MzIJCSAgICBpcl9jb25maWc7CisJdTMyCQkJaXJfY29uZmlnOworCXUzMgkJCWlyX2NvbW1hbmQ7CisJdm9pZAkJCSgqaXJfaGFuZGxlcikoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgaXJjb20pOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlpcl90YXNrbGV0OwogCiAJLyogZmlybXdhcmUgc3R1ZmYgKi8KIAl1bnNpZ25lZCBjaGFyICpiaW5fZnc7CkBAIC0yNTcsMTIgKzI2MCwxMCBAQAogZXh0ZXJuIGludCBDaGFuZ2VQSURzKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2IHZwaWQsIHUxNiBhcGlkLCB1MTYgdHRwaWQsCiAJCSAgICAgICB1MTYgc3VicGlkLCB1MTYgcGNycGlkKTsKIAotZXh0ZXJuIHZvaWQgYXY3MTEwX3JlZ2lzdGVyX2lyY19oYW5kbGVyKHZvaWQgKCpmdW5jKSh1MzIpKTsKLWV4dGVybiB2b2lkIGF2NzExMF91bnJlZ2lzdGVyX2lyY19oYW5kbGVyKHZvaWQgKCpmdW5jKSh1MzIpKTsKIGV4dGVybiBpbnQgYXY3MTEwX3NldHVwX2lyY19jb25maWcgKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZyk7CiAKLWV4dGVybiBpbnQgYXY3MTEwX2lyX2luaXQgKHZvaWQpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX2lyX2V4aXQgKHZvaWQpOworZXh0ZXJuIGludCBhdjcxMTBfaXJfaW5pdChzdHJ1Y3QgYXY3MTEwICphdjcxMTApOworZXh0ZXJuIHZvaWQgYXY3MTEwX2lyX2V4aXQoc3RydWN0IGF2NzExMCAqYXY3MTEwKTsKIAogLyogbXNwMzQwMCBpMmMgc3ViYWRkcmVzc2VzICovCiAjZGVmaW5lIE1TUF9XUl9ERU0gMHgxMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaHcuYwppbmRleCAxMjIwODI2Li43NDQyZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaHcuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaHcuYwpAQCAtNDEsNiArNDEsOCBAQAogI2luY2x1ZGUgImF2NzExMC5oIgogI2luY2x1ZGUgImF2NzExMF9ody5oIgogCisjZGVmaW5lIF9OT0hBTkRTSEFLRQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogREVCSSBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzY0LDcgKzM2Niw4IEBACiAJCW1zbGVlcCgxKTsKIAl9CiAKLQl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIENPTV9JRl9MT0NLLCAweGZmZmYsIDIpOworCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPD0gMHgyNjFmKQorCQl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIENPTV9JRl9MT0NLLCAweGZmZmYsIDIpOwogCiAjaWZuZGVmIF9OT0hBTkRTSEFLRQogCXN0YXJ0ID0gamlmZmllczsKQEAgLTQzNyw3ICs0NDAsOCBAQAogCiAJd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01NQU5ELCAodTMyKSBidWZbMF0sIDIpOwogCi0Jd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHgwMDAwLCAyKTsKKwlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDw9IDB4MjYxZikKKwkJd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHgwMDAwLCAyKTsKIAogI2lmZGVmIENPTV9ERUJVRwogCXN0YXJ0ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9pci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKaW5kZXggNjY1Y2RiOC4uMzU3YTM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKQEAgLTcsMTYgKzcsMTYgQEAKICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAKICNpbmNsdWRlICJhdjcxMTAuaCIKKyNpbmNsdWRlICJhdjcxMTBfaHcuaCIKIAotI2RlZmluZSBVUF9USU1FT1VUIChIWi80KQorI2RlZmluZSBVUF9USU1FT1VUIChIWio3LzI1KQogCiAvKiBlbmFibGUgaXIgZGVidWdnaW5nIGJ5IG9yJ2luZyBkZWJ1ZyB3aXRoIDE2ICovCiAKLXN0YXRpYyBpbnQgaXJfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgaW50IGF2X2NudDsKK3N0YXRpYyBzdHJ1Y3QgYXY3MTEwICphdl9saXN0WzRdOwogc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgaW5wdXRfZGV2OwogCi1zdGF0aWMgdTMyIGlyX2NvbmZpZzsKLQogc3RhdGljIHUxNiBrZXlfbWFwIFsyNTZdID0gewogCUtFWV8wLCBLRVlfMSwgS0VZXzIsIEtFWV8zLCBLRVlfNCwgS0VZXzUsIEtFWV82LCBLRVlfNywKIAlLRVlfOCwgS0VZXzksIEtFWV9CQUNLLCAwLCBLRVlfUE9XRVIsIEtFWV9NVVRFLCAwLCBLRVlfSU5GTywKQEAgLTUzLDggKzUzLDExIEBACiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qga2V5dXBfdGltZXIgPSB7IC5mdW5jdGlvbiA9IGF2NzExMF9lbWl0X2tleXVwIH07CiAKIAotc3RhdGljIHZvaWQgYXY3MTEwX2VtaXRfa2V5KHUzMiBpcmNvbSkKK3N0YXRpYyB2b2lkIGF2NzExMF9lbWl0X2tleSh1bnNpZ25lZCBsb25nIHBhcm0pCiB7CisJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAgKikgcGFybTsKKwl1MzIgaXJfY29uZmlnID0gYXY3MTEwLT5pcl9jb25maWc7CisJdTMyIGlyY29tID0gYXY3MTEwLT5pcl9jb21tYW5kOwogCXU4IGRhdGE7CiAJdTggYWRkcjsKIAlzdGF0aWMgdTE2IG9sZF90b2dnbGUgPSAwOwpAQCAtNjIsMTkgKzY1LDMzIEBACiAJdTE2IGtleWNvZGU7CiAKIAkvKiBleHRyYWN0IGRldmljZSBhZGRyZXNzIGFuZCBkYXRhICovCi0JaWYgKGlyX2NvbmZpZyAmIDB4MDAwMSkgewotCQkvKiBUT0RPIFJDTU06ID8gYml0cyBkZXZpY2UgYWRkcmVzcywgOCBiaXRzIGRhdGEgKi8KLQkJZGF0YSA9IGlyY29tICYgMHhmZjsKLQkJYWRkciA9IChpcmNvbSA+PiA4KSAmIDB4ZmY7Ci0JfSBlbHNlIHsKLQkJLyogUkM1OiA1IGJpdHMgZGV2aWNlIGFkZHJlc3MsIDYgYml0cyBkYXRhICovCisJc3dpdGNoIChpcl9jb25maWcgJiAweDAwMDMpIHsKKwljYXNlIDA6CS8qIFJDNTogNSBiaXRzIGRldmljZSBhZGRyZXNzLCA2IGJpdHMgZGF0YSAqLwogCQlkYXRhID0gaXJjb20gJiAweDNmOwogCQlhZGRyID0gKGlyY29tID4+IDYpICYgMHgxZjsKKwkJYnJlYWs7CisKKwljYXNlIDE6CS8qIFJDTU06IDgoPykgYml0cyBkZXZpY2UgYWRkcmVzcywgOCg/KSBiaXRzIGRhdGEgKi8KKwkJZGF0YSA9IGlyY29tICYgMHhmZjsKKwkJYWRkciA9IChpcmNvbSA+PiA4KSAmIDB4ZmY7CisJCWJyZWFrOworCisJY2FzZSAyOgkvKiBleHRlbmRlZCBSQzU6IDUgYml0cyBkZXZpY2UgYWRkcmVzcywgNyBiaXRzIGRhdGEgKi8KKwkJZGF0YSA9IGlyY29tICYgMHgzZjsKKwkJYWRkciA9IChpcmNvbSA+PiA2KSAmIDB4MWY7CisJCS8qIGludmVydCA3dGggZGF0YSBiaXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBSQzUga2V5bWFwcyAqLworCQlpZiAoIShpcmNvbSAmIDB4MTAwMCkpCisJCQlkYXRhIHw9IDB4NDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpbnZhbGlkIGlyX2NvbmZpZyAleFxuIiwgaXJfY29uZmlnKTsKKwkJcmV0dXJuOwogCX0KIAogCWtleWNvZGUgPSBrZXlfbWFwW2RhdGFdOwogCi0JZHByaW50aygxNiwgIiMjIyMjIyMjIyUwOHgjIyMjIyMjIyMgYWRkciAlaSBkYXRhIDB4JTAyeCAoa2V5Y29kZSAlaSlcbiIsCisJZHByaW50aygxNiwgImNvZGUgJTA4eCAtPiBhZGRyICVpIGRhdGEgMHglMDJ4IC0+IGtleWNvZGUgJWlcbiIsCiAJCWlyY29tLCBhZGRyLCBkYXRhLCBrZXljb2RlKTsKIAogCS8qIGNoZWNrIGRldmljZSBhZGRyZXNzIChpZiBzZWxlY3RlZCkgKi8KQEAgLTg3LDEwICsxMDQsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChpcl9jb25maWcgJiAweDAwMDEpCisJaWYgKChpcl9jb25maWcgJiAweDAwMDMpID09IDEpCiAJCW5ld190b2dnbGUgPSAwOyAvKiBSQ01NICovCiAJZWxzZQotCQluZXdfdG9nZ2xlID0gKGlyY29tICYgMHg4MDApOyAvKiBSQzUgKi8KKwkJbmV3X3RvZ2dsZSA9IChpcmNvbSAmIDB4ODAwKTsgLyogUkM1LCBleHRlbmRlZCBSQzUgKi8KIAogCWlmICh0aW1lcl9wZW5kaW5nKCZrZXl1cF90aW1lcikpIHsKIAkJZGVsX3RpbWVyKCZrZXl1cF90aW1lcik7CkBAIC0xMzcsNiArMTU0LDggQEAKIHsKIAljaGFyICpwYWdlOwogCWludCBzaXplID0gNCArIDI1NiAqIHNpemVvZih1MTYpOworCXUzMiBpcl9jb25maWc7CisJaW50IGk7CiAKIAlpZiAoY291bnQgPCBzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1Myw2MCArMTcyLDk1IEBACiAJbWVtY3B5KCZpcl9jb25maWcsIHBhZ2UsIDQpOwogCW1lbWNweSgma2V5X21hcCwgcGFnZSArIDQsIDI1NiAqIHNpemVvZih1MTYpKTsKIAl2ZnJlZShwYWdlKTsKLQlhdjcxMTBfc2V0dXBfaXJjX2NvbmZpZyhOVUxMLCBpcl9jb25maWcpOworCWlmIChGV19WRVJTSU9OKGF2X2xpc3RbMF0tPmFybV9hcHApID49IDB4MjYyMCAmJiAhKGlyX2NvbmZpZyAmIDB4MDAwMSkpCisJCWlyX2NvbmZpZyB8PSAweDAwMDI7IC8qIGVuYWJsZSBleHRlbmRlZCBSQzUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXZfY250OyBpKyspCisJCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2X2xpc3RbaV0sIGlyX2NvbmZpZyk7CiAJaW5wdXRfcmVnaXN0ZXJfa2V5cygpOwogCXJldHVybiBjb3VudDsKIH0KIAogCi1pbnQgX19pbml0IGF2NzExMF9pcl9pbml0KHZvaWQpCitpbnQgYXY3MTEwX3NldHVwX2lyY19jb25maWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgaXJfY29uZmlnKQoreworCWludCByZXQgPSAwOworCisJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CisJaWYgKGF2NzExMCkgeworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOworCQlhdjcxMTAtPmlyX2NvbmZpZyA9IGlyX2NvbmZpZzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBpcl9oYW5kbGVyKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyY29tKQoreworCWRwcmludGsoNCwgImlyY29tbWFuZCA9ICUwOHhcbiIsIGlyY29tKTsKKwlhdjcxMTAtPmlyX2NvbW1hbmQgPSBpcmNvbTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZhdjcxMTAtPmlyX3Rhc2tsZXQpOworfQorCisKK2ludCBfX2luaXQgYXY3MTEwX2lyX2luaXQoc3RydWN0IGF2NzExMCAqYXY3MTEwKQogewogCXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CiAKLQlpZiAoaXJfaW5pdGlhbGl6ZWQpCi0JCXJldHVybiAwOworCWlmIChhdl9jbnQgPj0gc2l6ZW9mIGF2X2xpc3Qvc2l6ZW9mIGF2X2xpc3RbMF0pCisJCXJldHVybiAtRU5PU1BDOwogCi0JaW5pdF90aW1lcigma2V5dXBfdGltZXIpOwotCWtleXVwX3RpbWVyLmRhdGEgPSAwOworCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMHgwMDAxKTsKKwlhdl9saXN0W2F2X2NudCsrXSA9IGF2NzExMDsKIAotCWlucHV0X2Rldi5uYW1lID0gIkRWQiBvbi1jYXJkIElSIHJlY2VpdmVyIjsKKwlpZiAoYXZfY250ID09IDEpIHsKKwkJaW5pdF90aW1lcigma2V5dXBfdGltZXIpOworCQlrZXl1cF90aW1lci5kYXRhID0gMDsKIAotCS8qKgotCSAqICBlbmFibGUga2V5cwotCSAqLwotCXNldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYuZXZiaXQpOwotCXNldF9iaXQoRVZfUkVQLCBpbnB1dF9kZXYuZXZiaXQpOworCQlpbnB1dF9kZXYubmFtZSA9ICJEVkIgb24tY2FyZCBJUiByZWNlaXZlciI7CisJCXNldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYuZXZiaXQpOworCQlzZXRfYml0KEVWX1JFUCwgaW5wdXRfZGV2LmV2Yml0KTsKKwkJaW5wdXRfcmVnaXN0ZXJfa2V5cygpOworCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmlucHV0X2Rldik7CisJCWlucHV0X2Rldi50aW1lci5mdW5jdGlvbiA9IGlucHV0X3JlcGVhdF9rZXk7CiAKLQlpbnB1dF9yZWdpc3Rlcl9rZXlzKCk7Ci0KLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmlucHV0X2Rldik7Ci0JaW5wdXRfZGV2LnRpbWVyLmZ1bmN0aW9uID0gaW5wdXRfcmVwZWF0X2tleTsKLQotCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKE5VTEwsIDB4MDAwMSk7Ci0JYXY3MTEwX3JlZ2lzdGVyX2lyY19oYW5kbGVyKGF2NzExMF9lbWl0X2tleSk7Ci0KLQllID0gY3JlYXRlX3Byb2NfZW50cnkoImF2NzExMF9pciIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwgTlVMTCk7Ci0JaWYgKGUpIHsKLQkJZS0+d3JpdGVfcHJvYyA9IGF2NzExMF9pcl93cml0ZV9wcm9jOwotCQllLT5zaXplID0gNCArIDI1NiAqIHNpemVvZih1MTYpOworCQllID0gY3JlYXRlX3Byb2NfZW50cnkoImF2NzExMF9pciIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwgTlVMTCk7CisJCWlmIChlKSB7CisJCQllLT53cml0ZV9wcm9jID0gYXY3MTEwX2lyX3dyaXRlX3Byb2M7CisJCQllLT5zaXplID0gNCArIDI1NiAqIHNpemVvZih1MTYpOworCQl9CiAJfQogCi0JaXJfaW5pdGlhbGl6ZWQgPSAxOworCXRhc2tsZXRfaW5pdCgmYXY3MTEwLT5pcl90YXNrbGV0LCBhdjcxMTBfZW1pdF9rZXksICh1bnNpZ25lZCBsb25nKSBhdjcxMTApOworCWF2NzExMC0+aXJfaGFuZGxlciA9IGlyX2hhbmRsZXI7CisKIAlyZXR1cm4gMDsKIH0KIAogCi12b2lkIF9fZXhpdCBhdjcxMTBfaXJfZXhpdCh2b2lkKQordm9pZCBfX2V4aXQgYXY3MTEwX2lyX2V4aXQoc3RydWN0IGF2NzExMCAqYXY3MTEwKQogewotCWlmIChpcl9pbml0aWFsaXplZCA9PSAwKQorCWludCBpOworCisJaWYgKGF2X2NudCA9PSAwKQogCQlyZXR1cm47Ci0JZGVsX3RpbWVyX3N5bmMoJmtleXVwX3RpbWVyKTsKLQlyZW1vdmVfcHJvY19lbnRyeSgiYXY3MTEwX2lyIiwgTlVMTCk7Ci0JYXY3MTEwX3VucmVnaXN0ZXJfaXJjX2hhbmRsZXIoYXY3MTEwX2VtaXRfa2V5KTsKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmaW5wdXRfZGV2KTsKLQlpcl9pbml0aWFsaXplZCA9IDA7CisKKwlhdjcxMTAtPmlyX2hhbmRsZXIgPSBOVUxMOworCXRhc2tsZXRfa2lsbCgmYXY3MTEwLT5pcl90YXNrbGV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgYXZfY250OyBpKyspCisJCWlmIChhdl9saXN0W2ldID09IGF2NzExMCkgeworCQkJYXZfbGlzdFtpXSA9IGF2X2xpc3RbYXZfY250LTFdOworCQkJYXZfbGlzdFthdl9jbnQtMV0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCWlmIChhdl9jbnQgPT0gMSkgeworCQlkZWxfdGltZXJfc3luYygma2V5dXBfdGltZXIpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiYXY3MTEwX2lyIiwgTlVMTCk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZpbnB1dF9kZXYpOworCX0KKworCWF2X2NudC0tOwogfQogCiAvL01PRFVMRV9BVVRIT1IoIkhvbGdlciBXYWVjaHRsZXIgPGhvbGdlckBjb252ZXJnZW5jZS5kZT4iKTsKIC8vTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKaW5kZXggZTY1ZmMzNi4uNmFmNzRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYwpAQCAtNzAsNyArNzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHY0bDJfaW5wdXQgaW5wdXRzWzJdID0geworc3RhdGljIHN0cnVjdCB2NGwyX2lucHV0IGlucHV0c1s0XSA9IHsKIAl7CiAJCS5pbmRleAkJPSAwLAogCQkubmFtZQkJPSAiRFZCIiwKQEAgLTg3LDYgKzg3LDIyIEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3RkCQk9IFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sCiAJCS5zdGF0dXMJCT0gMCwKKwl9LCB7CisJCS5pbmRleAkJPSAyLAorCQkubmFtZQkJPSAiVmlkZW8iLAorCQkudHlwZQkJPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAorCQkuYXVkaW9zZXQJPSAwLAorCQkudHVuZXIJCT0gMCwKKwkJLnN0ZAkJPSBWNEwyX1NURF9QQUxfQkd8VjRMMl9TVERfTlRTQ19NLAorCQkuc3RhdHVzCQk9IDAsCisJfSwgeworCQkuaW5kZXgJCT0gMywKKwkJLm5hbWUJCT0gIlkvQyIsCisJCS50eXBlCQk9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCisJCS5hdWRpb3NldAk9IDAsCisJCS50dW5lcgkJPSAwLAorCQkuc3RkCQk9IFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sCisJCS5zdGF0dXMJCT0gMCwKIAl9CiB9OwogCkBAIC0yMTIsMjQgKzIyOCw0NCBAQAogCX0KIAogCWlmICgwICE9IGF2NzExMC0+Y3VycmVudF9pbnB1dCkgeworCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgdG8gYW5hbG9nIFRWOlxuIik7CiAJCWFkc3dpdGNoID0gMTsKIAkJc291cmNlID0gU0FBNzE0Nl9IUFNfU09VUkNFX1BPUlRfQjsKIAkJc3luYyA9IFNBQTcxNDZfSFBTX1NZTkNfUE9SVF9COwogCQltZW1jcHkoc3RhbmRhcmQsIGFuYWxvZ19zdGFuZGFyZCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTQ2X3N0YW5kYXJkKSAqIDIpOwotCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgdG8gYW5hbG9nIFRWXG4iKTsKLQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDA4LCAweDAwMDApOyAvLyBsb3Vkc3BlYWtlciBzb3VyY2UKLQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDA5LCAweDAwMDApOyAvLyBoZWFkcGhvbmUgc291cmNlCi0JCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwYSwgMHgwMDAwKTsgLy8gU0NBUlQgMSBzb3VyY2UKLQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDBlLCAweDMwMDApOyAvLyBGTSBtYXRyaXgsIG1vbm8KLQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDAwLCAweDRmMDApOyAvLyBsb3Vkc3BlYWtlciArIGhlYWRwaG9uZQotCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDcsIDB4NGYwMCk7IC8vIFNDQVJUIDEgdm9sdW1lCiAKLQkJaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1ZFUzE4MjApIHsKLQkJCWlmICh2ZXMxODIwX3dyaXRlcmVnKGRldiwgMHgwOSwgMHgwZiwgMHg2MCkpCi0JCQkJZHByaW50aygxLCAic2V0dGluZyBiYW5kIGluIGRlbW9kdWxhdG9yIGZhaWxlZC5cbiIpOwotCQl9IGVsc2UgaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1NUVjAyOTcpIHsKLQkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8vIFREQTkxOTggcGluOShTVEQpCi0JCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAzLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvLyBUREE5MTk4IHBpbjMwKFZJRikKKwkJc3dpdGNoIChhdjcxMTAtPmN1cnJlbnRfaW5wdXQpIHsKKwkJY2FzZSAxOgorCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gQW5hbG9nIFR1bmVyIElucHV0LlxuIik7CisJCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDgsIDB4MDAwMCk7IC8vIGxvdWRzcGVha2VyIHNvdXJjZQorCQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDA5LCAweDAwMDApOyAvLyBoZWFkcGhvbmUgc291cmNlCisJCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMGEsIDB4MDAwMCk7IC8vIFNDQVJUIDEgc291cmNlCisJCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMGUsIDB4MzAwMCk7IC8vIEZNIG1hdHJpeCwgbW9ubworCQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDAwLCAweDRmMDApOyAvLyBsb3Vkc3BlYWtlciArIGhlYWRwaG9uZQorCQkJbXNwX3dyaXRlcmVnKGF2NzExMCwgTVNQX1dSX0RTUCwgMHgwMDA3LCAweDRmMDApOyAvLyBTQ0FSVCAxIHZvbHVtZQorCisJCQlpZiAoYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgJiBBTkFMT0dfVFVORVJfVkVTMTgyMCkgeworCQkJCWlmICh2ZXMxODIwX3dyaXRlcmVnKGRldiwgMHgwOSwgMHgwZiwgMHg2MCkpCisJCQkJCWRwcmludGsoMSwgInNldHRpbmcgYmFuZCBpbiBkZW1vZHVsYXRvciBmYWlsZWQuXG4iKTsKKwkJCX0gZWxzZSBpZiAoYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgJiBBTkFMT0dfVFVORVJfU1RWMDI5NykgeworCQkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8vIFREQTkxOTggcGluOShTVEQpCisJCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMywgU0FBNzE0Nl9HUElPX09VVEhJKTsgLy8gVERBOTE5OCBwaW4zMChWSUYpCisJCQl9CisJCQlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg0OCwgMHgwMiwgMHhkMCkgIT0gMSkKKwkJCQlkcHJpbnRrKDEsICJzYWE3MTEzIHdyaXRlIGZhaWxlZCBAIGNhcmQgJWQiLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgQ1ZCUyBJbnB1dC5cbiIpOworCQkJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4NDgsIDB4MDIsIDB4ZDIpICE9IDEpCisJCQkJZHByaW50aygxLCAic2FhNzExMyB3cml0ZSBmYWlsZWQgQCBjYXJkICVkIiwgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWRwcmludGsoMSwgInN3aXRjaGluZyBTQUE3MTEzIHRvIFZpZGVvIEFWIFkvQyBJbnB1dC5cbiIpOworCQkJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4NDgsIDB4MDIsIDB4ZDkpICE9IDEpCisJCQkJZHByaW50aygxLCAic2FhNzExMyB3cml0ZSBmYWlsZWQgQCBjYXJkICVkIiwgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBJbnB1dDogQVY3MTEwOiBTQUE3MTEzOiBpbnZhbGlkIGlucHV0LlxuIik7CiAJCX0KIAl9IGVsc2UgewogCQlhZHN3aXRjaCA9IDA7CkBAIC0zMDAsNyArMzM2LDYgQEAKIAkJLy8gRklYTUU6IHN0YW5kYXJkIC8gc3RlcmVvIGRldGVjdGlvbiBpcyBzdGlsbCBicm9rZW4KIAkJbXNwX3JlYWRyZWcoYXY3MTEwLCBNU1BfUkRfREVNLCAweDAwN2UsICZzdGVyZW9fZGV0KTsKIAkJZHByaW50aygxLCAiVklESU9DX0dfVFVORVI6IG1zcDM0MDAgVFYgc3RhbmRhcmQgZGV0ZWN0aW9uOiAweCUwNHhcbiIsIHN0ZXJlb19kZXQpOwotCiAJCW1zcF9yZWFkcmVnKGF2NzExMCwgTVNQX1JEX0RTUCwgMHgwMDE4LCAmc3RlcmVvX2RldCk7CiAJCWRwcmludGsoMSwgIlZJRElPQ19HX1RVTkVSOiBtc3AzNDAwIHN0ZXJlbyBkZXRlY3Rpb246IDB4JTA0eFxuIiwgc3RlcmVvX2RldCk7CiAJCXN0ZXJlbyA9IChzOCkoc3RlcmVvX2RldCA+PiA4KTsKQEAgLTMxMCw3ICszNDUsNyBAQAogCQkJdC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAJCX0KIAkJZWxzZSBpZiAoc3RlcmVvIDwgLTB4MTApIHsKLQkJCS8qIGJpbGluZ3VhbCovCisJCQkvKiBiaWxpbmd1YWwgKi8KIAkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOwogCQkJdC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKIAkJfQpAQCAtMzQ0LDcgKzM3OSw3IEBACiAJCQlmbV9tYXRyaXggPSAweDMwMDA7IC8vIG1vbm8KIAkJCXNyYyA9IDB4MDAxMDsKIAkJCWJyZWFrOwotCQlkZWZhdWx0OiAvKiBjYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POiB7Ki8KKwkJZGVmYXVsdDogLyogY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzogKi8KIAkJCWRwcmludGsoMiwgIlZJRElPQ19TX1RVTkVSOiBUREE5ODQwX1NFVF9NT05PXG4iKTsKIAkJCWZtX21hdHJpeCA9IDB4MzAwMDsgLy8gbW9ubwogCQkJc3JjID0gMHgwMDMwOwpAQCAtNDA2LDcgKzQ0MSw3IEBACiAJCWRwcmludGsoMiwgIlZJRElPQ19FTlVNSU5QVVQ6ICVkXG4iLCBpLT5pbmRleCk7CiAKIAkJaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzKSB7Ci0JCQlpZiAoaS0+aW5kZXggPCAwIHx8IGktPmluZGV4ID49IDIpCisJCQlpZiAoaS0+aW5kZXggPCAwIHx8IGktPmluZGV4ID49IDQpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0gZWxzZSB7CiAJCQlpZiAoaS0+aW5kZXggIT0gMCkKQEAgLTQzMywxMCArNDY4LDkgQEAKIAkJaWYgKCFhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncykKIAkJCXJldHVybiAwOwogCi0JCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0gMikKKwkJaWYgKGlucHV0IDwgMCB8fCBpbnB1dCA+PSA0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJLyogRklYTUU6IHN3aXRjaCBpbnB1dHMgaGVyZSAqLwogCQlhdjcxMTAtPmN1cnJlbnRfaW5wdXQgPSBpbnB1dDsKIAkJcmV0dXJuIGF2NzExMF9kdmJfY19zd2l0Y2goZmgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggOTc0NmQyYi4uNzY5MmNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogewogCXN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdiA9IChzdHJ1Y3QgYnVkZ2V0X2F2ICopIGNhLT5kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwotCWludCB0aW1lb3V0ID0gNTA7IC8vIDUgc2Vjb25kcyAoNC40LjYgUmVhZHkpCisJaW50IHRpbWVvdXQgPSA1MDA7IC8vIDUgc2Vjb25kcyAoNC40LjYgUmVhZHkpCiAKIAlpZiAoc2xvdCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxNyw3ICsyMTcsNiBAQAogCXsKIAkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IGNhbSByZXNldCBmYWlsZWQgKHRpbWVvdXQpLlxuIik7CiAJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLwotCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvKiBWY2Mgb2ZmICovCiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIApAQCAtMjc2LDcgKzI3NSw2IEBACiAJCXsKIAkJCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGVqZWN0ZWRcbiIpOwogCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMiwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLyogZGlzYWJsZSBjYXJkICovCi0JCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvKiBWY2Mgb2ZmICovCiAJCQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKIAkJfQogCX0KQEAgLTQ1Myw5ICs0NTEsOSBAQAogfQogCiBzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAogCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYgPSAoc3RydWN0IGJ1ZGdldF9hdiAqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CiAJdTggYnVmWzRdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gYnVmLC5sZW4gPSBzaXplb2YoYnVmKSB9OwpAQCAtNDgxLDcgKzQ3OSw3IEBACiAJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAyMTUwMDAwKQogCQlidWZbM10gfD0gMHhDMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NSw2ICs3NDMsNyBAQAogCQljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTOgogCQljYXNlIFNVQklEX0RWQlRfS05DMV9QTFVTOgogCQkJLy8gRW5hYmxlIC8gUG93ZXJPTiBGcm9udGVuZAorCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVExPKTsKIAkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCmluZGV4IGExMjY3MDUuLjI5ODBkYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCkBAIC00MCw2ICs0MCw3IEBACiAKICNpbmNsdWRlICJkdmJfY2FfZW41MDIyMS5oIgogI2luY2x1ZGUgInN0djAyOTkuaCIKKyNpbmNsdWRlICJzdHYwMjk3LmgiCiAjaW5jbHVkZSAidGRhMTAwNHguaCIKIAogI2RlZmluZSBERUJJQUREUl9JUgkJMHgxMjM0CkBAIC01NDgsOSArNTQ5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbHBzX2JzcnU2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIGludCBhbHBzX2JzcnU2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGJ1Zls0XTsKIAl1MzIgZGl2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gYnVmLC5sZW4gPSBzaXplb2YoYnVmKSB9OwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkKIAkJYnVmWzNdID0gMHhjMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTY2OSw5ICs2NjksOSBAQAogfQogCiBzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4X3R0X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKIAkJCQkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewotCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKIAl1OCBidWZbNF07CiAJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSBidWYsLmxlbiA9IHNpemVvZihidWYpIH07CkBAIC02OTcsNyArNjk3LDcgQEAKIAllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDIxNTAwMDApCiAJCWJ1ZlszXSB8PSAweEMwOwogCi0JaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZtc2csIDEpICE9IDEpCisJaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQpAQCAtODQ4LDYgKzg0OCwxODAgQEAKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRtMTMxNmxfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKK3N0YXRpYyBpbnQgZHZiY19waGlsaXBzX3RkbTEzMTZsX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CisJdTggdHVuZXJfYnVmWzVdOworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MsCisJCQkJICAgIC5mbGFncyA9IDAsCisJCQkJICAgIC5idWYgPSB0dW5lcl9idWYsCisJCQkJICAgIC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OworCWludCB0dW5lcl9mcmVxdWVuY3kgPSAwOworCXU4IGJhbmQsIGNwLCBmaWx0ZXI7CisKKwkvLyBkZXRlcm1pbmUgY2hhcmdlIHB1bXAKKwl0dW5lcl9mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIDM2MTI1MDAwOworCWlmICh0dW5lcl9mcmVxdWVuY3kgPCA4NzAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMTMwMDAwMDAwKSB7CisJCWNwID0gMzsKKwkJYmFuZCA9IDE7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxNjAwMDAwMDApIHsKKwkJY3AgPSA1OworCQliYW5kID0gMTsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDIwMDAwMDAwMCkgeworCQljcCA9IDY7CisJCWJhbmQgPSAxOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMjkwMDAwMDAwKSB7CisJCWNwID0gMzsKKwkJYmFuZCA9IDI7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0MjAwMDAwMDApIHsKKwkJY3AgPSA1OworCQliYW5kID0gMjsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQ4MDAwMDAwMCkgeworCQljcCA9IDY7CisJCWJhbmQgPSAyOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNjIwMDAwMDAwKSB7CisJCWNwID0gMzsKKwkJYmFuZCA9IDQ7CisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4MzAwMDAwMDApIHsKKwkJY3AgPSA1OworCQliYW5kID0gNDsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg5NTAwMDAwMCkgeworCQljcCA9IDc7CisJCWJhbmQgPSA0OworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vIGFzc3VtZSBQTEwgZmlsdGVyIHNob3VsZCBhbHdheXMgYmUgOE1IeiBmb3IgdGhlIG1vbWVudC4KKwlmaWx0ZXIgPSAxOworCisJLy8gY2FsY3VsYXRlIGRpdmlzb3IKKwl0dW5lcl9mcmVxdWVuY3kgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyAzNjEyNTAwMCArICg2MjUwMC8yKSkgLyA2MjUwMDsKKworCS8vIHNldHVwIHR1bmVyIGJ1ZmZlcgorCXR1bmVyX2J1ZlswXSA9IHR1bmVyX2ZyZXF1ZW5jeSA+PiA4OworCXR1bmVyX2J1ZlsxXSA9IHR1bmVyX2ZyZXF1ZW5jeSAmIDB4ZmY7CisJdHVuZXJfYnVmWzJdID0gMHhjODsKKwl0dW5lcl9idWZbM10gPSAoY3AgPDwgNSkgfCAoZmlsdGVyIDw8IDMpIHwgYmFuZDsKKwl0dW5lcl9idWZbNF0gPSAweDgwOworCisJc3R2MDI5N19lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwltc2xlZXAoNTApOworCisJc3R2MDI5N19lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwltc2xlZXAoMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IGR2YmNfcGhpbGlwc190ZG0xMzE2bF9pbml0dGFiW10gPSB7CisJMHg4MCwgMHgwMSwKKwkweDgwLCAweDAwLAorCTB4ODEsIDB4MDEsCisJMHg4MSwgMHgwMCwKKwkweDAwLCAweDA5LAorCTB4MDEsIDB4NjksCisJMHgwMywgMHgwMCwKKwkweDA0LCAweDAwLAorCTB4MDcsIDB4MDAsCisJMHgwOCwgMHgwMCwKKwkweDIwLCAweDAwLAorCTB4MjEsIDB4NDAsCisJMHgyMiwgMHgwMCwKKwkweDIzLCAweDAwLAorCTB4MjQsIDB4NDAsCisJMHgyNSwgMHg4OCwKKwkweDMwLCAweGZmLAorCTB4MzEsIDB4MDAsCisJMHgzMiwgMHhmZiwKKwkweDMzLCAweDAwLAorCTB4MzQsIDB4NTAsCisJMHgzNSwgMHg3ZiwKKwkweDM2LCAweDAwLAorCTB4MzcsIDB4MjAsCisJMHgzOCwgMHgwMCwKKwkweDQwLCAweDFjLAorCTB4NDEsIDB4ZmYsCisJMHg0MiwgMHgyOSwKKwkweDQzLCAweDIwLAorCTB4NDQsIDB4ZmYsCisJMHg0NSwgMHgwMCwKKwkweDQ2LCAweDAwLAorCTB4NDksIDB4MDQsCisJMHg0YSwgMHgwMCwKKwkweDRiLCAweDdiLAorCTB4NTIsIDB4MzAsCisJMHg1NSwgMHhhZSwKKwkweDU2LCAweDQ3LAorCTB4NTcsIDB4ZTEsCisJMHg1OCwgMHgzYSwKKwkweDVhLCAweDFlLAorCTB4NWIsIDB4MzQsCisJMHg2MCwgMHgwMCwKKwkweDYzLCAweDAwLAorCTB4NjQsIDB4MDAsCisJMHg2NSwgMHgwMCwKKwkweDY2LCAweDAwLAorCTB4NjcsIDB4MDAsCisJMHg2OCwgMHgwMCwKKwkweDY5LCAweDAwLAorCTB4NmEsIDB4MDIsCisJMHg2YiwgMHgwMCwKKwkweDcwLCAweGZmLAorCTB4NzEsIDB4MDAsCisJMHg3MiwgMHgwMCwKKwkweDczLCAweDAwLAorCTB4NzQsIDB4MGMsCisJMHg4MCwgMHgwMCwKKwkweDgxLCAweDAwLAorCTB4ODIsIDB4MDAsCisJMHg4MywgMHgwMCwKKwkweDg0LCAweDA0LAorCTB4ODUsIDB4ODAsCisJMHg4NiwgMHgyNCwKKwkweDg3LCAweDc4LAorCTB4ODgsIDB4MTAsCisJMHg4OSwgMHgwMCwKKwkweDkwLCAweDAxLAorCTB4OTEsIDB4MDEsCisJMHhhMCwgMHgwNCwKKwkweGExLCAweDAwLAorCTB4YTIsIDB4MDAsCisJMHhiMCwgMHg5MSwKKwkweGIxLCAweDBiLAorCTB4YzAsIDB4NTMsCisJMHhjMSwgMHg3MCwKKwkweGMyLCAweDEyLAorCTB4ZDAsIDB4MDAsCisJMHhkMSwgMHgwMCwKKwkweGQyLCAweDAwLAorCTB4ZDMsIDB4MDAsCisJMHhkNCwgMHgwMCwKKwkweGQ1LCAweDAwLAorCTB4ZGUsIDB4MDAsCisJMHhkZiwgMHgwMCwKKwkweDYxLCAweDM4LAorCTB4NjIsIDB4MGEsCisJMHg1MywgMHgxMywKKwkweDU5LCAweDA4LAorCTB4ZmYsIDB4ZmYsCit9OworCitzdGF0aWMgc3RydWN0IHN0djAyOTdfY29uZmlnIGR2YmNfcGhpbGlwc190ZG0xMzE2bF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDFjLAorCS5pbml0dGFiID0gZHZiY19waGlsaXBzX3RkbTEzMTZsX2luaXR0YWIsCisJLmludmVydCA9IDAsCisJLnBsbF9zZXQgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKK307CisKKwogCiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpKQpAQCAtODY5LDYgKzEwNDMsMTUgQEAKIAkJfQogCQlicmVhazsKIAorCWNhc2UgMHgxMDEwOgkJLy8gVFQgRFZCLUMgQ0kgYnVkZ2V0IChzdHYwMjk3L1BoaWxpcHMgdGRtMTMxNmwodGRhNjY1MXR0KSkKKwkJYnVkZ2V0X2NpLT50dW5lcl9wbGxfYWRkcmVzcyA9IDB4NjE7CisJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CisJCQlzdHYwMjk3X2F0dGFjaCgmZHZiY19waGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKIAljYXNlIDB4MTAxMToJCS8vIEhhdXBwYXVnZS9UVCBOb3ZhLVQgYnVkZ2V0ICh0ZGExMDA0NS9QaGlsaXBzIHRkbTEzMTZsKHRkYTY2NTF0dCkgKyBUREE5ODg5KQogCQlidWRnZXRfY2ktPnR1bmVyX3BsbF9hZGRyZXNzID0gMHg2MzsKIAkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID0KQEAgLTg3OCw3ICsxMDYxLDcgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgMHgxMDEyOgkJLy8gSGF1cHBhdWdlL1RUIE5vdmEtVCBDSSBidWRnZXQgKHRkYTEwMDQ1L1BoaWxpcHMgdGRtMTMxNmwodGRhNjY1MXR0KSArIFREQTk4ODkpCisJY2FzZSAweDEwMTI6CQkvLyBUVCBEVkItVCBDSSBidWRnZXQgKHRkYTEwMDQ2L1BoaWxpcHMgdGRtMTMxNmwodGRhNjY1MXR0KSkKIAkJYnVkZ2V0X2NpLT50dW5lcl9wbGxfYWRkcmVzcyA9IDB4NjA7CiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQl0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdGRtMTMxNmxfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwpAQCAtOTY2LDEwICsxMTQ5LDEyIEBACiBNQUtFX0JVREdFVF9JTkZPKHR0YmNpLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtQ0kgUENJIiwgQlVER0VUX1RUX0hXX0RJU0VRQyk7CiBNQUtFX0JVREdFVF9JTkZPKHR0YnQyLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtVAkgUENJIiwgQlVER0VUX1RUKTsKIE1BS0VfQlVER0VUX0lORk8odHRidGNpLCAiVFQtQnVkZ2V0LVQtQ0kgUENJIiwgQlVER0VUX1RUKTsKK01BS0VfQlVER0VUX0lORk8odHRiY2NpLCAiVFQtQnVkZ2V0LUMtQ0kgUENJIiwgQlVER0VUX1RUKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBjKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBmKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2NpLCAweDEzYzIsIDB4MTAxMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKHR0YnQyLCAweDEzYzIsIDB4MTAxMSksCiAJTUFLRV9FWFRFTlNJT05fUENJKHR0YnRjaSwgMHgxM2MyLCAweDEwMTIpLAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKaW5kZXggODE0MmUyNi4uYjFmMjFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKQEAgLTM1Myw5ICszNTMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFscHNfYnNydTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewotCXN0cnVjdCBidWRnZXRfcGF0Y2gqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0X3BhdGNoKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCBkYXRhWzRdOwogCXUzMiBkaXY7CiAJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBkYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpIH07CkBAIC0zNzAsNyArMzY5LDcgQEAKIAogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IDE1MzAwMDApIGRhdGFbM10gPSAweGMwOwogCi0JaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwppbmRleCA5OTYxOTE3Li40M2Q2YzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwpAQCAtMzMyLDkgKzMzMiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7Ci0Jc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGRhdGFbNF07CiAJdTMyIGRpdjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHg2MSwgLmZsYWdzID0gMCwgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSkgfTsKQEAgLTM0OSw3ICszNDgsNyBAQAogCiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkgZGF0YVszXSA9IDB4YzA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisJaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCkBAIC00ODEsNiArNDgwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzNWgxNDIwX2NvbmZpZyBzNWgxNDIwX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NTMsCisJLmludmVydCA9IDEsCiAJLnBsbF9zZXQgPSBzNWgxNDIwX3BsbF9zZXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYwppbmRleCA3ZGFmN2IxLi5kMjAwYWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKQEAgLTU3MCw3ICs1NzEsOCBAQAogCQkJCSAgY29uc3QgdTggKiBkYXRhLCBpbnQgbGVuKTsKICNlbmRpZgogCi1zdGF0aWMgaW50IG51bXBrdCA9IDAsIGxhc3RqLCBudW10cywgbnVtc3R1ZmYsIG51bXNlYywgbnVtaW52YWxpZDsKK3N0YXRpYyBpbnQgbnVtcGt0ID0gMCwgbnVtdHMsIG51bXN0dWZmLCBudW1zZWMsIG51bWludmFsaWQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0ajsKIAogc3RhdGljIHZvaWQgdHR1c2JfcHJvY2Vzc19tdXhwYWNrKHN0cnVjdCB0dHVzYiAqdHR1c2IsIGNvbnN0IHU4ICogbXV4cGFjaywKIAkJCSAgIGludCBsZW4pCkBAIC03NzksNyArNzgxLDcgQEAKIAkJCXU4ICpkYXRhOwogCQkJaW50IGxlbjsKIAkJCW51bXBrdCsrOwotCQkJaWYgKChqaWZmaWVzIC0gbGFzdGopID49IEhaKSB7CisJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBsYXN0aiArIEhaKSkgewogI2lmIERFQlVHID4gMgogCQkJCXByaW50awogCQkJCSAgICAoImZyYW1lcy9zOiAlZCAodHM6ICVkLCBzdHVmZiAlZCwgc2VjOiAlZCwgaW52YWxpZDogJWQsIGFsbDogJWQpXG4iLApAQCAtMTI5OSw3ICsxMzAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3RzYTUwNTlfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdHNhNTA1OV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IHR0dXNiKiB0dHVzYiA9IChzdHJ1Y3QgdHR1c2IqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGJ1Zls0XTsKQEAgLTEzMjIsNyArMTMyNCw3IEBACiAJaWYgKHR0dXNiLT5yZXZpc2lvbiA9PSBUVFVTQl9SRVZfMl8yKQogCQlidWZbM10gfD0gMHgyMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA0NWM5YTlhLi4zZDA4ZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCAxNmM4NWMwLi45MzU3MDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0yMiwxMiArMjIsMjEgQEAKIAkgIHRoZSBNaXJvLCBIYXVwcGF1Z2UgYW5kIFNUQiBib2FyZHMuIFBsZWFzZSByZWFkIHRoZSBtYXRlcmlhbCBpbgogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2Lz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKLQkgIElmIHlvdSBzYXkgWSBvciBNIGhlcmUsIHlvdSBuZWVkIHRvIHNheSBZIG9yIE0gdG8gIkkyQyBzdXBwb3J0IiBhbmQKLQkgICJJMkMgYml0LWJhbmdpbmcgaW50ZXJmYWNlcyIgaW4gdGhlIGRldmljZSBkcml2ZXJzIHNlY3Rpb24uCi0KIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJ0dHYuCiAKK2NvbmZpZyBWSURFT19TQUE2NTg4CisJdHJpc3RhdGUgIlNBQTY1ODggUmFkaW8gQ2hpcCBSRFMgZGVjb2RlciBzdXBwb3J0IG9uIEJUODQ4IGNhcmRzIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIEkyQyAmJiBWSURFT19CVDg0OAorCisJaGVscAorCSAgU3VwcG9ydCBmb3IgIFJhZGlvIERhdGEgU3lzdGVtIChSRFMpIGRlY29kZXIuIFRoaXMgYWxsb3dzIHNlZWluZworCSAgcmFkaW8gc3RhdGlvbiBpZGVudGlmaWNhdGlvbiB0cmFuc21pdHRlZCB1c2luZyB0aGlzIHN0YW5kYXJkLgorCSAgQ3VycmVudGxseSwgaXQgd29ya3Mgb25seSB3aXRoIGJ0OHg4IGNoaXBzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYWE2NTg4LgorCiBjb25maWcgVklERU9fUE1TCiAJdHJpc3RhdGUgIk1lZGlhdmlzaW9uIFBybyBNb3ZpZSBTdHVkaW8gVmlkZW8gRm9yIExpbnV4IgogCWRlcGVuZHMgb24gVklERU9fREVWICYmIElTQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggODEwZTdhYS4uMDQ2YjgyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogYnR0di1vYmpzCTo9CWJ0dHYtZHJpdmVyLm8gYnR0di1jYXJkcy5vIGJ0dHYtaWYubyBcCiAJCQlidHR2LXJpc2MubyBidHR2LXZiaS5vIGJ0dHYtaTJjLm8gYnR0di1ncGlvLm8KIHpvcmFuLW9ianMgICAgICA6PQl6cjM2MTIwLm8genIzNjEyMF9pMmMubyB6cjM2MTIwX21lbS5vCityZHMtb2JqcyAgICAgICAgOj0Jc2FhNjU4OC5vCiB6cjM2MDY3LW9ianMJOj0Jem9yYW5fcHJvY2ZzLm8gem9yYW5fZGV2aWNlLm8gXAogCQkJem9yYW5fZHJpdmVyLm8gem9yYW5fY2FyZC5vCiB0dW5lci1vYmpzCTo9CXR1bmVyLWNvcmUubyB0dW5lci1zaW1wbGUubyBtdDIweHgubyB0ZGE4MjkwLm8gdGVhNTc2Ny5vCkBAIC0xNSw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfU09VTkRfVFZNSVhFUikgKz0gdHZtaXhlci5vCiAKIG9iai0kKENPTkZJR19WSURFT19aUjM2MTIwKSArPSB6b3Jhbi5vCitvYmotJChDT05GSUdfVklERU9fU0FBNjU4OCkgKz0gcmRzLm8KIG9iai0kKENPTkZJR19WSURFT19TQUE1MjQ2QSkgKz0gc2FhNTI0NmEubwogb2JqLSQoQ09ORklHX1ZJREVPX1NBQTUyNDkpICs9IHNhYTUyNDkubwogb2JqLSQoQ09ORklHX1ZJREVPX0NRQ0FNKSArPSBjLXFjYW0ubwpAQCAtMjksNyArMzEsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOKSArPSB6cjM2MDY3Lm8gdmlkZW9jb2RlYy5vCiBvYmotJChDT05GSUdfVklERU9fUE1TKSArPSBwbXMubwogb2JqLSQoQ09ORklHX1ZJREVPX1BMQU5CKSArPSBwbGFuYi5vCi1vYmotJChDT05GSUdfVklERU9fVklOTykgKz0gdmluby5vCitvYmotJChDT05GSUdfVklERU9fVklOTykgKz0gdmluby5vIHNhYTcxOTEubyBpbmR5Y2FtLm8KIG9iai0kKENPTkZJR19WSURFT19TVFJBRElTKSArPSBzdHJhZGlzLm8KIG9iai0kKENPTkZJR19WSURFT19DUElBKSArPSBjcGlhLm8KIG9iai0kKENPTkZJR19WSURFT19DUElBX1BQKSArPSBjcGlhX3BwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKaW5kZXggNTJlMzJmMC4uMWNhMmI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTc1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYwppbmRleCBiNWVkOTU0Li4xNzNiY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMKaW5kZXggYzZjZmE3Yy4uM2VlMGFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODU2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODU2LmMKaW5kZXggYzEzZDI4Ni4uOGViODcxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuYwppbmRleCA3ZjJkNTE1Li5hNDhkZTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICAgICRJZDogYnRjeC1yaXNjLmMsdiAxLjYgMjAwNS8wMi8yMSAxMzo1Nzo1OSBrcmF4ZWwgRXhwICQKIAogICAgIGJ0Y3gtcmlzYy5jCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5oCmluZGV4IDQxZjYwMzkuLjUwM2U2YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGJ0Y3gtcmlzYy5oLHYgMS4yIDIwMDQvMDkvMTUgMTY6MTU6MjQga3JheGVsIEV4cCAkCiAgKi8KIHN0cnVjdCBidGN4X3Jpc2NtZW0gewogCXVuc2lnbmVkIGludCAgIHNpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCmluZGV4IGE5N2I5YjkuLjE5MDk3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGJ0dHYtY2FyZHMuYyx2IDEuNTQgMjAwNS8wNy8xOSAxODoyNjo0NiBta3J1Zmt5IEV4cCAkCiAKICAgICBidHR2LWNhcmRzLmMKIApAQCAtMTY5LDEwICsxNjgsMTAgQEAKICAJeyAweGQwMTgxMGZjLCBCVFRWX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAogCiAJeyAweDAwMTIxMWJkLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIiB9LAotCS8vIHNvbWUgY2FyZHMgc2hpcCB3aXRoIGJ5dGVzd2FwcGVkIElEcyAuLi4KKwkvKiBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uICovCiAJeyAweDEyMDBiZDExLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIFtic3dhcF0iIH0sCiAJeyAweGZmMDBiZDExLCBCVFRWX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIFtic3dhcF0iIH0sCi0JLy8gdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4KKwkvKiB0aGlzIHNlZW1zIHRvIGhhcHBlbiBhcyB3ZWxsIC4uLiAqLwogCXsgMHhmZjEyMTFiZCwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKIAogCXsgMHgzMDAwMTIxYSwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LApAQCAtMjAwLDEyICsxOTksMTIgQEAKIAogCXsgMHgxMTIzMTUzYiwgQlRUVl9URVJSQVRWUkFESU8sICAiVGVycmF0ZWMgVFYgUmFkaW8rIiB9LAogCXsgMHgxMTI3MTUzYiwgQlRUVl9URVJSQVRWLCAgICAgICAiVGVycmF0ZWMgVFYrIChWMS4wNSkiICAgIH0sCi0JLy8gY2xhc2hlcyB3aXRoIEZseVZpZGVvCi0JLy97IDB4MTg1MjE4NTIsIEJUVFZfVEVSUkFUViwgICAgICJUZXJyYXRlYyBUVisgKFYxLjEwKSIgICAgfSwKKwkvKiBjbGFzaGVzIHdpdGggRmx5VmlkZW8KKwkgKnsgMHgxODUyMTg1MiwgQlRUVl9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LCAqLwogCXsgMHgxMTM0MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChMUjEwMikiIH0sCi0JeyAweDExMzUxNTNiLCBCVFRWX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8vIExSMTAyCi0JeyAweDUwMTgxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8vID8/Ci0JeyAweGZmM2IxNTNiLCBCVFRWX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8vID8/CisJeyAweDExMzUxNTNiLCBCVFRWX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8qIExSMTAyICovCisJeyAweDUwMTgxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8qID8/ICovCisJeyAweGZmM2IxNTNiLCBCVFRWX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8qID8/ICovCiAKIAl7IDB4NDAwMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCiAJeyAweDQwMGExNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIiB9LApAQCAtMjg3LDEwICsyODYsMTIgQEAKIAl7IDB4MDEwNzE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMyIgfSwKIAl7IDB4MDEwODE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjNCIgfSwKIAotCS8vIGxpa2VseSBicm9rZW4sIHZlbmRvciBpZCBkb2Vzbid0IG1hdGNoIHRoZSBvdGhlciBtYWdpYyB2aWV3cyAuLi4KLQkvL3sgMHhhMGZjYTA0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYzLCAiR3VpbGxlbW90IE1heGkgVFYgVmlkZW8gMyIgfSwKKwl7IDB4MTU0MDk1MTEsIEJUVFZfQUNPUlBfWTg3OEYsICJBY29ycCBZODc4RiIgfSwKIAotCS8vIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikKKwkvKiBsaWtlbHkgYnJva2VuLCB2ZW5kb3IgaWQgZG9lc24ndCBtYXRjaCB0aGUgb3RoZXIgbWFnaWMgdmlld3MgLi4uCisJICogeyAweGEwZmNhMDRmLCBCVFRWX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LCAqLworCisJLyogRFZCIGNhcmRzICh1c2luZyBwY2kgZnVuY3Rpb24gLjEgZm9yIG1wZWcgZGF0YSB4ZmVyKSAqLwogCXsgMHgwMTAxMDA3MSwgQlRUVl9ORUJVTEFfRElHSVRWLCAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIgfSwKIAl7IDB4MDc2MTE0NjEsIEJUVFZfQVZEVkJUXzc2MSwgICAgIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiB9LAogCXsgMHgwMDFjMTFiZCwgQlRUVl9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCkBAIC0yOTgsNyArMjk5LDggQEAKIAl7IDB4MDAwMTE4MjIsIEJUVFZfVFdJTkhBTl9EU1QsICAgIlR3aW5oYW4gVmlzaW9uUGx1cyBEVkIiIH0sCiAJeyAweGZjMDAyNzBmLCBCVFRWX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKIAl7IDB4MDc3MTE0NjEsIEJUVFZfQVZEVkJUXzc3MSwgICAgIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAotCXsgMHhkYjEwMThhYywgQlRUVl9EVklDT19EVkJUX0xJVEUsICAgICJEVklDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiIH0sCisJeyAweGRiMTAxOGFjLCBCVFRWX0RWSUNPX0RWQlRfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKKwl7IDB4ZDUwMDE4YWMsIEJUVFZfRFZJQ09fRlVTSU9OSERUVl81X0xJVEUsICAgICJEVmlDTyBGdXNpb25IRFRWIDUgTGl0ZSIgfSwKIAogCXsgMCwgLTEsIE5VTEwgfQogfTsKQEAgLTMxNiw2ICszMTgsNyBAQAogCS5zdmhzCQk9IDIsCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIk1JUk8gUENUViIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC0zMjcsNiArMzMwLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiSGF1cHBhdWdlIChidDg0OCkiLAogCS52aWRlb19pbnB1dHMJPSA0LApAQCAtMzM4LDYgKzM0Miw3IEBACiAJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiU1RCLCBHYXRld2F5IFAvTiA2MDAwNjk5IChidDg0OCkiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtMzUwLDYgKzM1NSw3IEBACiAJLm5vX21zcDM0eHgJPSAxLAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkuaGFzX3JhZGlvICAgICAgPSAxLAogfSx7CkBAIC0zNjUsNiArMzcxLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAgfSwKIAkubmVlZHNfdHZhdWRpbwk9IDAsCiAJLnR1bmVyX3R5cGUJPSA0LAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJEaWFtb25kIERUVjIwMDAiLAogCS52aWRlb19pbnB1dHMJPSA0LApAQCAtMzc2LDYgKzM4Myw3IEBACiAJLmF1ZGlvbXV4CT0geyAwLCAxLCAwLCAxLCAzfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtMzg4LDYgKzM5Niw3IEBACiAJLyogICAgICAgICAgICAgICAgMHgwNCBmb3Igc29tZSBjYXJkcyA/PyAqLwogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuYXVkaW9faG9vawk9IGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvLAogCS5oYXNfcmVtb3RlICAgICA9IDEsCiB9LHsKQEAgLTQwMSw2ICs0MTAsNyBAQAogCS5hdWRpb211eAk9IHswIH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDA4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQxNSw2ICs0MjUsNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJJTVMvSVhtaWNybyBUdXJib1RWIiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTQyNyw2ICs0MzgsNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMCwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiSGF1cHBhdWdlIChidDg3OCkiLAogCS52aWRlb19pbnB1dHMJPSA0LApAQCAtNDM5LDYgKzQ1MSw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIk1JUk8gUENUViBwcm8iLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtNDUwLDYgKzQ2Myw3IEBACiAJLmF1ZGlvbXV4CT0geyAweDIwMDAxLDB4MTAwMDEsIDAsIDAsMTB9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgwYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00NjMsNiArNDc3LDcgQEAKIAkuYXVkaW9tdXgJPSB7IDEzLCAxNCwgMTEsIDcsIDAsIDB9LAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTQ3Niw2ICs0OTEsNyBAQAogCS5tc3AzNHh4X2FsdCAgICA9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sgICAgID0gYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbywKIH0sewogCS5uYW1lCQk9ICJBaW1zbGFiIFZpZGVvIEhpZ2h3YXkgWHRyZW1lIChWSFgpIiwKQEAgLTQ4OSw2ICs1MDUsNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJab2x0cml4IFRWLU1heCIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC01MDAsNiArNTE3LDcgQEAKIAkuYXVkaW9tdXgJPSB7MCAsIDAsIDEgLCAwLCAxMH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDEwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTUxMCw3ICs1MjgsNyBAQAogCS5zdmhzCQk9IDIsCiAJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCS8vIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PgorCS8qIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PiAqLwogCS5hdWRpb211eCAgICAgICA9IHsgMHgwMDFlMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCkBAIC01MjYsNiArNTQ0LDcgQEAKIAkuYXVkaW9tdXgJPSB7IDB4NGZhMDA3LDB4Y2ZhMDA3LDB4Y2ZhMDA3LDB4Y2ZhMDA3LDB4Y2ZhMDA3LDB4Y2ZhMDA3fSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sJPSB3aW52aWV3X2F1ZGlvLAogCS5oYXNfcmFkaW8JPSAxLAogfSx7CkBAIC01MzksNiArNTU4LDcgQEAKIAkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIEVaIC9GbHlLaXQgTFIzOCBCdDg0OCAoY2FwdHVyZSBvbmx5KSIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC01NTAsNiArNTcwLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAgfSwKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTYwLDEwICs1ODEsMTEgQEAKIAkuc3ZocwkJPSAyLAogCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4LyBMdWNreSBTdGFyIEltYWdlIFdvcmxkIENvbmZlcmVuY2VUViBMUjUwIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKLQkuYXVkaW9faW5wdXRzCT0gMiwgIC8vIHR1bmVyLCBsaW5lIGluCisJLmF1ZGlvX2lucHV0cwk9IDIsICAvKiB0dW5lciwgbGluZSBpbiAqLwogCS50dW5lcgkJPSAwLAogCS5zdmhzCQk9IDIsCiAJLmdwaW9tYXNrCT0gMHgxODAwLApAQCAtNTcxLDYgKzU5Myw3IEBACiAJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCiAJLnZpZGVvX2lucHV0cwk9IDMsCkBAIC01ODMsNiArNjA2LDcgQEAKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYsIGJ0ODc4IiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTU5MSwxMSArNjE1LDEyIEBACiAJLnN2aHMJCT0gLTEsCiAJLmdwaW9tYXNrCT0gNywKIAkubXV4c2VsCQk9IHsgMiwgMywgLTEgfSwKLSAgICAgICAgLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKKwkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAogCS5hdWRpb211eAk9IHsgMCwgMCwgMCwgMCwgMCB9LAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUxQU19UU0JCNV9QQUxfSSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MTggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjEwLDYgKzYzNSw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmVtb3RlICAgICA9IDEsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjAgKEJ0ODQ4KS8gVGVycmEgVFZhbHVlIFZlcnNpb24gMS4wLyBWb2JpcyBUVi1Cb29zdGFyIiwKQEAgLTYyMiw2ICs2NDgsNyBAQAogCS5hdWRpb211eCAgICAgICA9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMCwgMHg0MDAwMH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAwLAogCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5hdWRpb19ob29rICAgICA9IHRlcnJhdHZfYXVkaW8sCiB9LHsKIAkubmFtZQkJPSAiSGF1cHBhdWdlIFdpbkNhbSBuZXdlciAoYnQ4NzgpIiwKQEAgLTYzNCw2ICs2NjEsNyBAQAogCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4LyBNQVhJIFRWIFZpZGVvIFBDSTIgTFI1MCIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCkBAIC02NDUsNiArNjczLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgxYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02NTgsMzcgKzY4NywzOCBAQAogCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMH0sCiAJLm5lZWRzX3R2YXVkaW8JPSAwLAogCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5hdWRpb19ob29rCT0gdGVycmF0dl9hdWRpbywKIAkvKiBHUElPIHdpcmluZzoKLSAgICAgICAgICAgICAgIEV4dGVybmFsIDIwIHBpbiBjb25uZWN0b3IgKGZvciBBY3RpdmUgUmFkaW8gVXBncmFkZSBib2FyZCkKLSAgICAgICAgICAgICAgIGdwaW8wMDogaTJjLXNkYQotICAgICAgICAgICAgICAgZ3BpbzAxOiBpMmMtc2NsCi0gICAgICAgICAgICAgICBncGlvMDI6IG9tNTYxMC1kYXRhCi0gICAgICAgICAgICAgICBncGlvMDM6IG9tNTYxMC1jbGsKLSAgICAgICAgICAgICAgIGdwaW8wNDogb201NjEwLXdyZQotICAgICAgICAgICAgICAgZ3BpbzA1OiBvbTU2MTAtc3RlcmVvCi0gICAgICAgICAgICAgICBncGlvMDY6IHJkczY1ODgtZGF2bgotICAgICAgICAgICAgICAgZ3BpbzA3OiBQaW4gNyBuLmMuCi0gICAgICAgICAgICAgICBncGlvMDg6IG5JT1cKLSAgICAgICAgICAgICAgIGdwaW8wOSsxMDogbklPUiwgblNFTCA/PyAoYnQ4NzgpCi0gICAgICAgICAgICAgICAgZ3BpbzA5OiBuSU9SIChidDg0OCkKLSAgICAgICAgICAgICAgICBncGlvMTA6IG5TRUwgKGJ0ODQ4KQotICAgICAgICAgICAgICBTb3VuZCBSb3V0aW5nOgotICAgICAgICAgICAgICAgZ3BpbzE2OiB1Mi1BMCAoMXN0IDQwNTJidCkKLSAgICAgICAgICAgICAgIGdwaW8xNzogdTItQTEKLSAgICAgICAgICAgICAgIGdwaW8xODogdTItbkVOCi0gICAgICAgICAgICAgICBncGlvMTk6IHU0LUEwICgybmQgNDA1MikKLSAgICAgICAgICAgICAgIGdwaW8yMDogdTQtQTEKLSAgICAgICAgICAgICAgICAgICAgICAgdTQtbkVOIC0gR05ECi0JICAgIEJ0c3B5OgotCSAgCTAwMDAwIDogQ2Ryb20gKGludGVybmFsIGF1ZGlvIGlucHV0KQorCUV4dGVybmFsIDIwIHBpbiBjb25uZWN0b3IgKGZvciBBY3RpdmUgUmFkaW8gVXBncmFkZSBib2FyZCkKKwlncGlvMDA6IGkyYy1zZGEKKwlncGlvMDE6IGkyYy1zY2wKKwlncGlvMDI6IG9tNTYxMC1kYXRhCisJZ3BpbzAzOiBvbTU2MTAtY2xrCisJZ3BpbzA0OiBvbTU2MTAtd3JlCisJZ3BpbzA1OiBvbTU2MTAtc3RlcmVvCisJZ3BpbzA2OiByZHM2NTg4LWRhdm4KKwlncGlvMDc6IFBpbiA3IG4uYy4KKwlncGlvMDg6IG5JT1cKKwlncGlvMDkrMTA6IG5JT1IsIG5TRUwgPz8gKGJ0ODc4KQorCQlncGlvMDk6IG5JT1IgKGJ0ODQ4KQorCQlncGlvMTA6IG5TRUwgKGJ0ODQ4KQorCVNvdW5kIFJvdXRpbmc6CisJZ3BpbzE2OiB1Mi1BMCAoMXN0IDQwNTJidCkKKwlncGlvMTc6IHUyLUExCisJZ3BpbzE4OiB1Mi1uRU4KKwlncGlvMTk6IHU0LUEwICgybmQgNDA1MikKKwlncGlvMjA6IHU0LUExCisJCXU0LW5FTiAtIEdORAorCUJ0c3B5OgorCQkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKIAkJMTAwMDAgOiBleHQuIFZpZGVvIGF1ZGlvIGlucHV0CiAJCTIwMDAwIDogVFYgTW9ubwogCQlhMDAwMCA6IFRWIE1vbm8vMgotCSAgICAgICAxYTAwMDAgOiBUViBTdGVyZW8KKwkxYTAwMDAgOiBUViBTdGVyZW8KIAkJMzAwMDAgOiBSYWRpbwogCQk0MDAwMCA6IE11dGUKLSAgICAgICAqLworKi8KIAogfSx7CiAJLyogSmFubmlrIEZyaXRzY2ggPGphbm5pa0B0ZWNoZmFrLnVuaS1iaWVsZWZlbGQuZGU+ICovCkBAIC03MDIsNiArNzMyLDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAgfSwKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKIAogfSx7CkBAIC03MTAsMTEgKzc0MSwxMiBAQAogCS5hdWRpb19pbnB1dHMJPSAxLAogCS50dW5lcgkJPSAwLAogCS5zdmhzCQk9IDIsCi0JLmdwaW9tYXNrCT0gMHgxODAwLCAgLy8weDhkZmUwMAorCS5ncGlvbWFzawk9IDB4MTgwMCwgIC8qIDB4OGRmZTAwICovCiAJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAogCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIkZvcm1hYyBpUHJvVFYsIEZvcm1hYyBQcm9UViBJIChidDg0OCkiLAogCS52aWRlb19pbnB1dHMJPSA0LApAQCAtNzI2LDYgKzc1OCw3IEBACiAJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDIwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTczOSw2ICs3NzIsNyBAQAogCS5hdWRpb211eAk9IHsgMCB9LAogCS5uZWVkc190dmF1ZGlvCT0gMCwKIAkudHVuZXJfdHlwZQk9IDQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFZhbHVlIFZlcnNpb24gQnQ4NzgiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtNzUxLDMxICs3ODUsMzMgQEAKIAkubmVlZHNfdHZhdWRpbwk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTGVhZHRlayBXaW5GYXN0IDIwMDAvIFdpbkZhc3QgMjAwMCBYUCIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCiAJLmF1ZGlvX2lucHV0cwk9IDEsCiAJLnR1bmVyCQk9IDAsCiAJLnN2aHMJCT0gMiwKLQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8vIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IKKwkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8qIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IgKi8KIAkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KIAkuZ3Bpb21hc2sJPSAweGIzMzAwMCwKIAkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKIAkvKiBBdWRpbyBSb3V0aW5nIGZvciAiV2luRmFzdCAyMDAwIFhQIiAobm8gdHYgc3RlcmVvICEpCiAJCWdwaW8yMyAtLSBoZWY0MDUyOm5FbmFibGUgKDB4ODAwMDAwKQogCQlncGlvMTIgLS0gaGVmNDA1MjpBMQotCSAgICAgICAgZ3BpbzEzIC0tIGhlZjQwNTI6QTAKLQkgICAgMHgwMDAwOiBleHRlcm5hbCBhdWRpbwotCSAgICAweDEwMDA6IEZNCi0JICAgIDB4MjAwMDogVFYKLQkgICAgMHgzMDAwOiBuLmMuCi0gICAgICAgICAgTm90ZTogVGhlcmUgZXhpc3RzIGFub3RoZXIgdmFyaWFudCAiV2luZmFzdCAyMDAwIiB3aXRoIHR2IHN0ZXJlbyAhPwotCSAgTm90ZTogZWVwcm9tIG9ubHkgY29udGFpbnMgRkYgYW5kIHBjaSBzdWJzeXN0ZW0gaWQgMTA3ZDo2NjA2Ci0JICovCisJCWdwaW8xMyAtLSBoZWY0MDUyOkEwCisJMHgwMDAwOiBleHRlcm5hbCBhdWRpbworCTB4MTAwMDogRk0KKwkweDIwMDA6IFRWCisJMHgzMDAwOiBuLmMuCisJTm90ZTogVGhlcmUgZXhpc3RzIGFub3RoZXIgdmFyaWFudCAiV2luZmFzdCAyMDAwIiB3aXRoIHR2IHN0ZXJlbyAhPworCU5vdGU6IGVlcHJvbSBvbmx5IGNvbnRhaW5zIEZGIGFuZCBwY2kgc3Vic3lzdGVtIGlkIDEwN2Q6NjYwNgorCSovCiAJLm5lZWRzX3R2YXVkaW8JPSAwLAogCS5wbGwJCT0gUExMXzI4LAogCS5oYXNfcmFkaW8JPSAxLAotCS50dW5lcl90eXBlCT0gNSwgLy8gZGVmYXVsdCBmb3Igbm93LCBncGlvIHJlYWRzIEJGRkYwNiBmb3IgUGFsIGJnK2RrCisJLnR1bmVyX3R5cGUJPSA1LCAvKiBkZWZhdWx0IGZvciBub3csIGdwaW8gcmVhZHMgQkZGRjA2IGZvciBQYWwgYmcrZGsgKi8KKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sJPSB3aW5mYXN0MjAwMF9hdWRpbywKIAkuaGFzX3JlbW90ZSAgICAgPSAxLAogfSx7CkBAIC03ODksNiArODI1LDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgyNCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MDIsNiArODM5LDcgQEAKIAkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yYWRpbwk9IDEsCiB9LHsKIAkubmFtZQkJPSAiUHJvbGluayBQaXhlbFZpZXcgUGxheVRWIHBybyIsCkBAIC04MTUsNiArODUzLDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiQXNrZXkgQ1BIMDZYIFRWaWV3OTkiLAogCS52aWRlb19pbnB1dHMJPSA0LApAQCAtODI3LDYgKzg2Niw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yZW1vdGUgICAgID0gMSwKIH0sewogCS5uYW1lCQk9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpby9SYXZlIiwKQEAgLTg0MCw2ICs4ODAsNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMCwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHgyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04NTQsNiArODk1LDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS5oYXNfcmFkaW8gICAgICA9IDEsCiB9LHsKQEAgLTg2OCw2ICs5MTAsNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JhZGlvCT0gMSwKIAkuYXVkaW9faG9vawk9IGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvLAogfSx7CkBAIC04ODMsNiArOTI2LDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSAxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJMaXR0bGUgT25BaXIgVFYiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtODk0LDYgKzkzOCw3IEBACiAJLmF1ZGlvbXV4CT0gezB4ZmY5ZmY2LCAweGZmOWZmNiwgMHhmZjFmZjcsIDAsIDB4ZmYzZmZjfSwKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTA4LDYgKzk1Myw3IEBACiAJLm5vX21zcDM0eHgJPSAxLAogCS5wbGwJCT0gUExMX05PTkUsCiAJLnR1bmVyX3R5cGUJPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZQkJPSAiTUFUUklYLVZpc2lvbiBNVi1EZWx0YSAyIiwKIAkudmlkZW9faW5wdXRzCT0gNSwKQEAgLTkyMCw2ICs5NjYsNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJab2x0cml4IEdlbmllIFRWL0ZNIiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTkzMiw2ICs5NzksNyBAQAogCS5ub19tc3AzNHh4CT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IDIxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJUZXJyYXRlYyBUVi9SYWRpbysiLAogCS52aWRlb19pbnB1dHMJPSAzLApAQCAtOTQ1LDYgKzk5Myw3IEBACiAJLm5vX21zcDM0eHgJPSAxLAogCS5wbGwJCT0gUExMXzM1LAogCS50dW5lcl90eXBlCT0gMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yYWRpbwk9IDEsCiB9LHsKIApAQCAtOTYwLDYgKzEwMDksNyBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS5uYW1lCQk9ICJJT0RBVEEgR1YtQkNUVjMvUENJIiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTk3Miw2ICsxMDIyLDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9BTFBTX1RTSEM2X05UU0MsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5hdWRpb19ob29rCT0gZ3ZiY3R2M3BjaV9hdWRpbywKIH0sewogCS5uYW1lCQk9ICJQcm9saW5rIFBWLUJUODc4UCs0RSAvIFBpeGVsVmlldyBQbGF5VFYgUEFLIC8gTGVuY28gTVhUVi05NTc4IENQIiwKQEAgLTk4Niw2ICsxMDM3LDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JlbW90ZQk9IDEsCiAJLyogR1BJTyB3aXJpbmc6IChkaWZmZXJlbnQgZnJvbSBSZXYuNEMgISkKIAkJR1BJTzE3OiBVNC5BMCAoZmlyc3QgaGVmNDA1MmJ0KQpAQCAtOTk0LDggKzEwNDYsOCBAQAogCQlHUElPMjE6IFU0Lm5FTgogCQlHUElPMjI6IEJUODMyIFJlc2V0IExpbmUKIAkJR1BJTzIzOiBBNSxBMCwgVTUsbkVOCi0JICAgTm90ZTogQXQgaTJjPTB4OGEgaXMgYSBCdDgzMiBjaGlwLCB3aGljaCBjaGFuZ2VzIHRvIDB4ODggYWZ0ZXIgYmVpbmcgcmVzZXQgdmlhIEdQSU8yMgotCSAqLworCU5vdGU6IEF0IGkyYz0weDhhIGlzIGEgQnQ4MzIgY2hpcCwgd2hpY2ggY2hhbmdlcyB0byAweDg4IGFmdGVyIGJlaW5nIHJlc2V0IHZpYSBHUElPMjIKKwkqLwogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIkVhZ2xlIFdpcmVsZXNzIENhcHJpY29ybjIgKGJ0ODc4QSkiLAogCS52aWRlb19pbnB1dHMgICA9IDQsCkBAIC0xMDA3LDYgKzEwNTksNyBAQAogCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xIC8qIFRVTkVSX0FMUFNfVE1ESDJfTlRTQyAqLywKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTAyMCwyMCArMTA3MywyMSBAQAogCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKIAkuYXVkaW9tdXgJPSB7IDEsIDB4ZDAwMDEsIDAsIDAsIDEwfSwKIAkJCS8qIHNvdW5kIHBhdGggKDUgc291cmNlcyk6Ci0JCQkgICBNVVgxIChtYXNrIDB4MDMpLCBFbmFibGUgUGluIDB4MDggKDA9ZW5hYmxlLCAxPWRpc2FibGUpCisJCQlNVVgxIChtYXNrIDB4MDMpLCBFbmFibGUgUGluIDB4MDggKDA9ZW5hYmxlLCAxPWRpc2FibGUpCiAJCQkJMD0gZXh0LiBBdWRpbyBJTgogCQkJCTE9IGZyb20gTVVYMgogCQkJCTI9IE1vbm8gVFYgc291bmQgZnJvbSBUdW5lcgogCQkJCTM9IG5vdCBjb25uZWN0ZWQKLQkJCSAgIE1VWDIgKG1hc2sgMHgzMDAwMCk6CisJCQlNVVgyIChtYXNrIDB4MzAwMDApOgogCQkJCTAsMiwzPSBmcm9tIE1TUDM0eHgKIAkJCQkxPSBGTSBzdGVyZW8gUmFkaW8gZnJvbSBUdW5lciAqLwogCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIENsYWFzIExhbmdiZWhuIDxjbGFhc0BiaWdmb290LmNvbT4sCi0JICAgU3ZlbiBHcm90aGtsYWdzIDxzdmVuQHVwYi5kZT4gKi8KKwlTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLwogCS5uYW1lCQk9ICJUeXBob29uIFRWaWV3IFJEUyArIEZNIFN0ZXJlbyAvIEtOQzEgVFYgU3RhdGlvbiBSRFMiLAogCS52aWRlb19pbnB1dHMJPSA0LAogCS5hdWRpb19pbnB1dHMJPSAzLApAQCAtMTA0NSwxMCArMTA5OSwxMSBAQAogCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX3JhZGlvCT0gMSwKIH0sewogCS8qIFRpbSBS9nN0ZXJtdW5kdCA8cm9zdGVybUB1bmktbXVlbnN0ZXIuZGU+Ci0JICAgaW4gZGUuY29tcC5vcy51bml4LmxpbnV4LmhhcmR3YXJlOgorCWluIGRlLmNvbXAub3MudW5peC5saW51eC5oYXJkd2FyZToKIAkJb3B0aW9ucyBidHR2IGNhcmQ9MCBwbGw9MSByYWRpbz0xIGdwaW9tYXNrPTB4MThlMAogCQlhdWRpb211eD0weDQ0YzcxZiwweDQ0ZDcxZiwwLDB4NDRkNzFmLDB4NDRkZmZmCiAJCW9wdGlvbnMgdHVuZXIgdHlwZT01ICovCkBAIC0xMDYwLDE1ICsxMTE1LDE2IEBACiAJLmdwaW9tYXNrCT0gMHgxOGUwLAogCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKIAkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4ZTAgfSwKLQkJICAgICAgIC8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKLQkJCSAgMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCi0JCQkgIDB4MDA4MDogVHVuZXIgQTIgU0FQIChzZWNvbmQgYXVkaW8gcHJvZ3JhbSA9IFp3ZWlrYW5hbHRvbikKLQkJCSAgMHgwODgwOiBUdW5lciBBMiBzdGVyZW8gKi8KKwkJLyogRm9yIGNhcmRzIHdpdGggdGRhOTgyMC90ZGE5ODIxOgorCQkJMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCisJCQkweDAwODA6IFR1bmVyIEEyIFNBUCAoc2Vjb25kIGF1ZGlvIHByb2dyYW0gPSBad2Vpa2FuYWx0b24pCisJCQkweDA4ODA6IFR1bmVyIEEyIHN0ZXJlbyAqLwogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KLQkgICBvbGQgRWFzeSBUViBCVDg0OCB2ZXJzaW9uIChtb2RlbCBDUEgwMzEpICovCisJb2xkIEVhc3kgVFYgQlQ4NDggdmVyc2lvbiAobW9kZWwgQ1BIMDMxKSAqLwogCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwMzEvIEJFU1RCVVkgRWFzeSBUViIsCiAJLnZpZGVvX2lucHV0cwk9IDQsCiAJLmF1ZGlvX2lucHV0cyAgID0gMSwKQEAgLTEwODAsNiArMTEzNiw3IEBACiAJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkucGxsCQk9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4MzggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTA5NCwxMCArMTE1MSwxMSBAQAogCS5hdWRpb211eCAgICAgICA9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gNSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBUaGlzIGlzIHRoZSB1bHRpbWF0ZSBjaGVhcG8gY2FwdHVyZSBjYXJkCi0JICoganVzdCBhIEJUODQ4QSBvbiBhIHNtYWxsIFBDQiEKLQkgKiBTdGV2ZSBIb3Nnb29kIDxzdGV2ZUBlcXVpaW5ldC5jb20+ICovCisJKiBqdXN0IGEgQlQ4NDhBIG9uIGEgc21hbGwgUENCIQorCSogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLwogCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyAnR3JhbmQgVmlkZW8gQ2FwdHVyZScgKEJ0ODQ4KSIsCiAJLnZpZGVvX2lucHV0cyAgID0gMiwKIAkuYXVkaW9faW5wdXRzICAgPSAwLApAQCAtMTExMCwxOSArMTE2OCwyMSBAQAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewotICAgICAgICAvKiBEYW5pZWwgSGVycmluZ3RvbiA8ZGFuaWVsLmhlcnJpbmd0b25AaG9tZS5jb20+ICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjAvIFBob2ViZSBUViBNYXN0ZXIgT25seSAoTm8gRk0pIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHhlMDAsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4ODAwLCAweDQwMCB9LAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQywKKwkvKiBEYW5pZWwgSGVycmluZ3RvbiA8ZGFuaWVsLmhlcnJpbmd0b25AaG9tZS5jb20+ICovCisJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MC8gUGhvZWJlIFRWIE1hc3RlciBPbmx5IChObyBGTSkiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHhlMDAsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDgwMCwgMHg0MDAgfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ180MDM2Rlk1X05UU0MsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLwogCS5uYW1lCQk9ICJBc2tleSBDUEgwM3ggVFYgQ2FwdHVyZXIiLApAQCAtMTEzMCwxMSArMTE5MCwxMiBAQAogCS5hdWRpb19pbnB1dHMJPSAxLAogCS50dW5lcgkJPSAwLAogCS5zdmhzCQk9IDIsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAorCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAogCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLDAsMCwwLDEgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDIsMCwwLDAsMSB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZQk9IDAsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDNjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExNDksNyArMTIxMCw3IEBACiAJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAxLCA4fSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMzUsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAotCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogQWRyaWFuIENveCA8YWRyaWFuQGh1bWJvbGR0LmNvLnVrICovCiAJLm5hbWUJICAgICAgICA9ICJBRyBFbGVjdHJvbmljcyBHTVYxIiwKQEAgLTExNjQsMTAgKzEyMjUsMTEgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5wbGwJICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgotCSAgIG5ldyBFYXN5IFRWIEJUODc4IHZlcnNpb24gKG1vZGVsIENQSDA2MSkKLQkgICBzcGVjaWFsIHRoYW5rcyB0byBJbmZvcm1hdGljYSBNaWVyZXMgZm9yIHByb3ZpZGluZyB0aGUgY2FyZCAqLworCW5ldyBFYXN5IFRWIEJUODc4IHZlcnNpb24gKG1vZGVsIENQSDA2MSkKKwlzcGVjaWFsIHRoYW5rcyB0byBJbmZvcm1hdGljYSBNaWVyZXMgZm9yIHByb3ZpZGluZyB0aGUgY2FyZCAqLwogCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjEvIEJFU1RCVVkgRWFzeSBUViAoYnQ4NzgpIiwKIAkudmlkZW9faW5wdXRzCT0gMywKIAkuYXVkaW9faW5wdXRzICAgPSAyLApAQCAtMTE3OSw2ICsxMjQxLDcgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KIAkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciIsCkBAIC0xMTkxLDYgKzEyNTQsNyBAQAogCS5hdWRpb211eAk9IHsgMHhiZmZlLCAwLCAweGJmZmYsIDAsIDB4YmZmZX0sCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4NDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTIwNiw2ICsxMjcwLDcgQEAKIAkubm9fbXNwMzR4eAk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBEZWVKYXkgPGRlZWpheUB3ZXN0ZWw5MDAubmV0ICgyMDAwUykgKi8KIAkubmFtZSAgICAgICAgICAgPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMFMgTFI5MCIsCkBAIC0xMjE2LDcgKzEyODEsNyBAQAogCS5ncGlvbWFzawk9IDB4MThlMCwKIAkubXV4c2VsCQk9IHsgMiwgMywgMCwgMX0sCiAJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCi0JCQkgICBGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KKwkJCUZseVZpZGVvMjAwMFMgaW4gLmh1IGhhcHB5IChnbSkqLwogCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCiAJLmF1ZGlvbXV4CT0geyAweDAwMDAsMHgwODAwLDB4MTAwMCwweDEwMDAsMHgxODAwLCAweDEwODAgfSwKIAkuYXVkaW9faG9vawk9IGZ2MjAwMHNfYXVkaW8sCkBAIC0xMjI1LDYgKzEyOTAsNyBAQAogCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IDUsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKIAkudmlkZW9faW5wdXRzCT0gMywKQEAgLTEyMzcsNiArMTMwMyw3IEBACiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmFkaW8JPSAxLAogfSx7CiAJLyogVEFOQUtBIEtlaSA8cGVnMDA2MjVAbmlmdHkuY29tPiAqLwpAQCAtMTI1MSwyNSArMTMxOCwyNyBAQAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuYXVkaW9faG9vayAgICAgPSBndmJjdHYzcGNpX2F1ZGlvLAogfSx7CiAKIC8qIC0tLS0gY2FyZCAweDQ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIjNEZnggVm9vZG9vVFYgRk0gKEV1cm8pLCBWb29kb29UViAyMDAgKFVTQSkiLAotCS8vIHRyeSAiaW5zbW9kIG1zcDM0MDAgc2ltcGxlPTAiIGlmIHlvdSBoYXZlCi0JLy8gc291bmQgcHJvYmxlbXMgd2l0aCB0aGlzIGNhcmQuCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDRmOGEwMCwKLQkvLyAweDEwMDAwMDogMT1NU1AgZW5hYmxlZCAoMD1kaXNhYmxlIGFnYWluKQotCS8vIDB4MDEwMDAwOiBDb25uZWN0ZWQgdG8gIlMwIiBvbiB0ZGE5ODgwICgwPVBhbC9CRywgMT1OVFNDKQotICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCi0JLy8gdHZ0dW5lciwgcmFkaW8sICAgZXh0ZXJuYWwsaW50ZXJuYWwsIG11dGUsICBzdGVyZW8KLQkvKiB0dW5lciwgQ29tcG9zaXQsIFNWaWQsIENvbXBvc2l0LW9uLVN2aWQtYWRhcHRlciovCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMX0sCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKKwkubmFtZSAgICAgICAgICAgPSAiM0RmeCBWb29kb29UViBGTSAoRXVybyksIFZvb2Rvb1RWIDIwMCAoVVNBKSIsCisJLyogdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKKwkqIHNvdW5kIHByb2JsZW1zIHdpdGggdGhpcyBjYXJkLiAqLworCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAorCS8qIDB4MTAwMDAwOiAxPU1TUCBlbmFibGVkICgwPWRpc2FibGUgYWdhaW4pCisJKiAweDAxMDAwMDogQ29ubmVjdGVkIHRvICJTMCIgb24gdGRhOTg4MCAoMD1QYWwvQkcsIDE9TlRTQykgKi8KKwkuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCisJLyogdHZ0dW5lciwgcmFkaW8sICAgZXh0ZXJuYWwsaW50ZXJuYWwsIG11dGUsICBzdGVyZW8KKwkqIHR1bmVyLCBDb21wb3NpdCwgU1ZpZCwgQ29tcG9zaXQtb24tU3ZpZC1hZGFwdGVyICovCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzICwwICwxfSwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5wbGwJCT0gUExMXzI4LAogCS5oYXNfcmFkaW8JPSAxLAogfSx7CkBAIC0xMjc5LDIyICsxMzQ4LDI0IEBACiAJLmF1ZGlvX2lucHV0cyAgID0gMCwKIAkudHVuZXIgICAgICAgICAgPSAtMSwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAogCS5ncGlvbWFzayAgICAgICA9IDAKIH0sewotICAgICAgICAvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVDg3OFArIChSZXYuNEMsOEUpIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMTUsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMTEsIDcsIDEzLCAwfSwgLy8gVFYgYW5kIFJhZGlvIHdpdGggc2FtZSBHUElPICEKLSAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAyNSwKKwkvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCisJLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gNCwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMTUsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDExLCA3LCAxMywgMH0sIC8qIFRWIGFuZCBSYWRpbyB3aXRoIHNhbWUgR1BJTyAhICovCisJLm5lZWRzX3R2YXVkaW8gID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gMjUsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmVtb3RlICAgICA9IDEsCiAJLyogR1BJTyB3aXJpbmc6CiAJCUdQSU8wOiBVNC5BMCAoaGVmNDA1MmJ0KQpAQCAtMTMwMiwxNiArMTM3MywxOCBAQAogCQlHUElPMjogVTQuQTEgKHNlY29uZCBoZWY0MDUyYnQpCiAJCUdQSU8zOiBVNC5uRU4sIFU1LkEwLCBBNS5uRU4KIAkJR1BJTzgtMTU6IHZyZDg2NmIgPwotCSAqLworCSovCiB9LHsKIAkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThFWiAoY2FwdHVyZSBvbmx5KSBMUjUxIiwKIAkudmlkZW9faW5wdXRzCT0gNCwKIAkuYXVkaW9faW5wdXRzICAgPSAwLAogCS50dW5lcgkJPSAtMSwKIAkuc3ZocwkJPSAyLAotCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwgLy8gQVYxLCBBVjIsIFNWSFMsIENWaWQgYWRhcHRlciBvbiBTVkhTCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LCAvKiBBVjEsIEFWMiwgU1ZIUywgQ1ZpZCBhZGFwdGVyIG9uIFNWSFMgKi8KIAkucGxsCQk9IFBMTF8yOCwKIAkubm9fbXNwMzR4eAk9IDEsCisJLnR1bmVyX3R5cGUJPSBVTlNFVCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogLyogLS0tLSBjYXJkIDB4NDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTMyOSw4ICsxNDAyLDkgQEAKIAkubm9fdGRhOTg3NQk9IDEsCiAJLnBsbAkJPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUJPSA1LAotCS5hdWRpb19ob29rCT0gcHZidDg3OHA5Yl9hdWRpbywgLy8gTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHN0ZXJlbwotCS5oYXNfcmFkaW8JPSAxLCAgLy8gTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHJhZGlvCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5hdWRpb19ob29rCT0gcHZidDg3OHA5Yl9hdWRpbywgLyogTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHN0ZXJlbyAqLworCS5oYXNfcmFkaW8JPSAxLCAgLyogTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHJhZGlvICovCiAJLmhhc19yZW1vdGUgICAgID0gMSwKIAkvKiBHUElPIHdpcmluZzoKIAkJR1BJTzA6IEEwIGhlZjQwNTIKQEAgLTEzMzgsNyArMTQxMiw3IEBACiAJCUdQSU8zOiBuRU4gaGVmNDA1MgogCQlHUElPOC0xNTogdnJkODY2YgogCQlHUElPMjAsMjIsMjM6IFIzMCxSMjksUjI4Ci0JICovCisJKi8KIH0sewogCS8qIENsYXkgS3VueiA8Y2t1bnpAbWFpbC5hcmMubmFzYS5nb3Y+ICovCiAJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwpAQCAtMTM1Miw2ICsxNDI2LDcgQEAKIAkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIE1pZ3VlbCBGcmVpdGFzIDxtaWd1ZWxAY2V0dWMucHVjLXJpby5icj4gKi8KIAkubmFtZSAgICAgICAgICAgPSAiUmVtb3RlVmlzaW9uIE1YIChSVjYwNSkiLApAQCAtMTM2Miw3MSArMTQzNyw3OCBAQAogCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCiAJLmdwaW9tYXNrMiAgICAgID0gMHgwN2ZmLAogCS5tdXhzZWwgICAgICAgICA9IHsgMHgzMywgMHgxMywgMHgyMywgMHg0MywgMHhmMywgMHg3MywgMHhlMywgMHgwMywKLQkJCSAgMHhkMywgMHhiMywgMHhjMywgMHg2MywgMHg5MywgMHg1MywgMHg4MywgMHhhMyB9LAorCQkJMHhkMywgMHhiMywgMHhjMywgMHg2MywgMHg5MywgMHg1MywgMHg4MywgMHhhMyB9LAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLm5vX3RkYTk4NzUgICAgID0gMSwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLm11eHNlbF9ob29rICAgID0gcnY2MDVfbXV4c2VsLAogfSx7Ci0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDIsCisJLm5hbWUgICAgICAgICAgID0gIlBvd2VyY29sb3IgTVRWODc4LyBNVFY4NzhSLyBNVFY4NzhGIiwKKwkudmlkZW9faW5wdXRzICAgPSAzLAorCS5hdWRpb19pbnB1dHMgICA9IDIsCiAJLnR1bmVyCQk9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MUM4MDBGLCAgLy8gQml0MC0yOiBBdWRpbyBzZWxlY3QsIDgtMTI6cmVtb3RlIGNvbnRyb2wgMTQ6cmVtb3RlIHZhbGlkIDE1OnJlbW90ZSByZXNldAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEsIH0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgNCB9LAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDB4MUM4MDBGLCAgLyogQml0MC0yOiBBdWRpbyBzZWxlY3QsIDgtMTI6cmVtb3RlIGNvbnRyb2wgMTQ6cmVtb3RlIHZhbGlkIDE1OnJlbW90ZSByZXNldCAqLworCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSwgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDQgfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkucGxsCQk9IFBMTF8yOCwKIAkuaGFzX3JhZGlvCT0gMSwKIH0sewogCiAvKiAtLS0tIGNhcmQgMHg0YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIC8qIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+ICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJDYW5vcHVzIFdpbkRWUiBQQ0kgKENPTVBBUSBQcmVzYXJpbyAzNTI0SlAsIDUxMTJKUCkiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDE0MDAwNywKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNCwgMCB9LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCi0gICAgICAgIC5hdWRpb19ob29rICAgICA9IHdpbmR2cl9hdWRpbywKKwkvKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPiAqLworCS5uYW1lICAgICAgICAgICA9ICJDYW5vcHVzIFdpbkRWUiBQQ0kgKENPTVBBUSBQcmVzYXJpbyAzNTI0SlAsIDUxMTJKUCkiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLmdwaW9tYXNrICAgICAgID0gMHgxNDAwMDcsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCisJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAzLCA0LCAwIH0sCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCiB9LHsKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjIE11bHRpIENhcHR1cmUgQ2FyZCAoQnQ4NzgpIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjIE11bHRpIENhcHR1cmUgQ2FyZCAoQnQ4NzgpIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gLTEsCisJLmdwaW9tYXNrICAgICAgID0gMCwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSmV0d2F5IFRWL0NhcHR1cmUgSlctVFY4NzgtRkJLLCBLd29ybGQgS1ctVFY4NzhSRiIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDMsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDcsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LCAgIC8vIFR1bmVyLCBTVmlkLCBTVkhTLCBTVmlkIHRvIFNWSFMgY29ubmVjdG9yCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCAsMCAsNCwgNCw0LDR9LC8vIFllcywgdGhpcyB0dW5lciB1c2VzIHRoZSBzYW1lIGF1ZGlvIG91dHB1dCBmb3IgVFYgYW5kIEZNIHJhZGlvIQotCQkJCQkgIC8vIFRoaXMgY2FyZCBsYWNrcyBleHRlcm5hbCBBdWRpbyBJbiwgc28gd2UgbXV0ZSBpdCBvbiBFeHQuICYgSW50LgotCQkJCQkgIC8vIFRoZSBQQ0IgY2FuIHRha2UgYSBzYngxNjM3L3NieDE2NzMsIHdpcmluZyB1bmtub3duLgotCQkJCQkgIC8vIFRoaXMgY2FyZCBsYWNrcyBQQ0kgc3Vic3lzdGVtIElELCBzaWdoLgotCQkJCQkgIC8vIGF1ZGlvbXV4PTE6IGxvd2VyIHZvbHVtZSwgMiszOiBtdXRlCi0JCQkJCSAgLy8gYnR3aW5jYXAgdXNlcyAweDgwMDAwLzB4ODAwMDMKLSAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LCAvLyBTYW1zdW5nIFRDUEE5MDk1UEMyN0EgKEJHK0RLKSwgcGhpbGlwcyBjb21wYXRpYmxlLCB3L0ZNLCBzdGVyZW8gYW5kCi0JCQkgICAvLyByYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuCi0JLmhhc19yYWRpbwkJPSAxLAorCS5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDMsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDcsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLyogVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IgKi8KKwkuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvKiBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKKwkJCQkJKiBUaGlzIGNhcmQgbGFja3MgZXh0ZXJuYWwgQXVkaW8gSW4sIHNvIHdlIG11dGUgaXQgb24gRXh0LiAmIEludC4KKwkJCQkJKiBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KKwkJCQkJKiBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KKwkJCQkJKiBhdWRpb211eD0xOiBsb3dlciB2b2x1bWUsIDIrMzogbXV0ZQorCQkJCQkqIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCisJCQkJCSovCisJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSA1LAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkvKiBTYW1zdW5nIFRDUEE5MDk1UEMyN0EgKEJHK0RLKSwgcGhpbGlwcyBjb21wYXRpYmxlLCB3L0ZNLCBzdGVyZW8gYW5kCisJcmFkaW8gc2lnbmFsIHN0cmVuZ3RoIGluZGljYXRvcnMgd29yayBmaW5lLiAqLworCS5oYXNfcmFkaW8JPSAxLAogCS8qIEdQSU8gSW5mbzoKIAkJR1BJTzAsMTogICBIRUY0MDUyIEEwLEExCiAJCUdQSU8yOiAgICAgSEVGNDA1MiBuRU5BQkxFCkBAIC0xNDM3LDI1ICsxNTE5LDI3IEBACiAJCUdQSU8yMiwyMzogPz8KIAkJPz8gICAgICAgOiBtdHU4YjU2ZXAgbWljcm9jb250cm9sbGVyIGZvciBJUiAoR1BJTyB3aXJpbmcgdW5rbm93bikqLwogfSx7Ci0gICAgICAgIC8qIEFydGh1ciBUZXR6bGFmZi1EZWFzLCBEU1AgRGVzaWduIEx0ZCA8c29mdHdhcmVAZHNwZGVzaWduLmNvbT4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAorCS8qIEFydGh1ciBUZXR6bGFmZi1EZWFzLCBEU1AgRGVzaWduIEx0ZCA8c29mdHdhcmVAZHNwZGVzaWduLmNvbT4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiRFNQIERlc2lnbiBUQ1ZJREVPIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCi0gICAgICAgIC8qIC0tLS0gY2FyZCAweDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiAtLS0tIGNhcmQgMHg1MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBQVlIiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDEsIDF9LAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDIsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKKwkubmVlZHNfdHZhdWRpbyAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAKIAkuZ3Bpb21hc2sgICAgICAgPSA3LAogCS5hdWRpb211eCAgICAgICA9IHs3fSwKQEAgLTE0NzEsNiArMTU1NSw3IEBACiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5hdWRpb19ob29rICAgICA9IGd2YmN0djVwY2lfYXVkaW8sCiAJLmhhc19yYWRpbyAgICAgID0gMSwKIH0sewpAQCAtMTQ4Miw5ICsxNTY3LDEwIEBACiAJLm11eHNlbCAgICAgICAgID0geyAzLCAyLCAwLCAxIH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODQ4KSIsIC8qIDB4MDQtNTRDMC1DMSAmIG9sZGVyIGJvYXJkcyAqLwogCS52aWRlb19pbnB1dHMgICA9IDMsCkBAIC0xNDk0LDkgKzE1ODAsMTAgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg1NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNTA4LDkgKzE1OTUsMTAgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDMsIDEgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIiwgICAgICAgLyogMHgxKDR8NSktMDAwNC1DNCAqLwogCS52aWRlb19pbnB1dHMgICA9IDEsCkBAIC0xNTIwLDkgKzE2MDgsMTAgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIHcvIHN2aWQiLCAgLyogMHgoMTZ8MTd8MjApLTAwQzQtQzEgKi8KIAkudmlkZW9faW5wdXRzICAgPSAyLApAQCAtMTUzMiw5ICsxNjIxLDEwIEBACiAJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzIwMS8yNTAvMjUxIiwgIC8qIDB4MSg4fDl8RXxGKS0wMDA0LUM0ICovCiAJLnZpZGVvX2lucHV0cyAgID0gMSwKQEAgLTE1NDMsMTAgKzE2MzMsMTEgQEAKIAkuc3ZocyAgICAgICAgICAgPSAtMSwKIAkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0JLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX3R5cGUJPSBVTlNFVCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDU4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE1NTcsMTAgKzE2NDgsMTEgQEAKIAkuc3ZocyAgICAgICAgICAgPSAxLAogCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSB9LAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLQkudHVuZXJfdHlwZSAgICAgPSAtMSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfdHlwZQk9IFVOU0VULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjEwLzIyMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLwogCS52aWRlb19pbnB1dHMgICA9IDIsCkBAIC0xNTY5LDEwICsxNjYxLDExIEBACiAJLnN2aHMgICAgICAgICAgID0gMSwKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0JLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX3R5cGUJPSBVTlNFVCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDUwMCIsICAgLyogNTAwICovCiAJLnZpZGVvX2lucHV0cyAgID0gMiwKQEAgLTE1ODIsMTkgKzE2NzUsMjEgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7Ci0gICAgICAgLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1NDAiLCAgIC8qIDU0MCAqLwotICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCisJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1NDAiLCAgIC8qIDU0MCAqLworCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5ub19tc3AzNHh4ICAgICA9IDEsCisJLm5vX3RkYTk4NzUgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjA1LDEwICsxNzAwLDExIEBACiAJLnN2aHMgICAgICAgICAgID0gMSwKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0JLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsICAgICAgLyogbXVzdCBhdm9pZCwgY29uZmxpY3RzIHdpdGggdGhlIGJ0ODYwICovCisJLnR1bmVyX3R5cGUJPSBVTlNFVCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsICAgICAgLyogbXVzdCBhdm9pZCwgY29uZmxpY3RzIHdpdGggdGhlIGJ0ODYwICovCiB9LHsKIAkvKiBNIEcgQmVyYmVyaWNoIDxiZXJiZXJpY0Bmb3J3aXNzLnVuaS1wYXNzYXUuZGU+ICovCiAJLm5hbWUgICAgICAgICAgID0gIklEUyBFYWdsZSIsCkBAIC0xNjE2LDYgKzE3MTIsNyBAQAogCS5hdWRpb19pbnB1dHMgICA9IDAsCiAJLnR1bmVyICAgICAgICAgID0gLTEsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5zdmhzICAgICAgICAgICA9IC0xLAogCS5ncGlvbWFzayAgICAgICA9IDAsCiAJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCkBAIC0xNjMwLDYgKzE3MjcsNyBAQAogCS5zdmhzICAgICAgICAgICA9IDEsCiAJLnR1bmVyICAgICAgICAgID0gLTEsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLm5vX3RkYTk4NzUgICAgID0gMSwKIAkubm9fdGRhNzQzMiAgICAgPSAxLApAQCAtMTY0MSwzOCArMTczOSw0MCBAQAogCS5ub19ncGlvaXJxICAgICA9IDEsCiAJLmhhc19kdmIgICAgICAgID0gMSwKIH0sewotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiRm9ybWFjIFByb1RWIElJIChidDg3OCkiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAzLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAyLAotCS8vIFRWLCBDb21wMSwgQ29tcG9zaXRlIG92ZXIgU1ZJRCBjb24sIFNWSUQKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLCAyLCAwLCAwLCAwIH0sCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkubmFtZSAgICAgICAgICAgPSAiRm9ybWFjIFByb1RWIElJIChidDg3OCkiLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IDMsCisJLmdwaW9tYXNrICAgICAgID0gMiwKKwkvKiBUViwgQ29tcDEsIENvbXBvc2l0ZSBvdmVyIFNWSUQgY29uLCBTVklEICovCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDIsIDIsIDAsIDAsIDAgfSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLmhhc19yYWRpbyAgICAgID0gMSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCi0gICAgICAvKiBzb3VuZCByb3V0aW5nOgotICAgICAgICAgICBHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQotICAgICAgICAgICAgICAweDAyOiBib3RoIFRWIGFuZCByYWRpbyAodHVuZXI6IEZNMTIxNi9JKQotICAgICAgICAgVGhlIGNhcmQgaGFzIG9uYm9hcmQgYXVkaW8gY29ubmVjdG9ycyBsYWJlbGVkICJjZHJvbSIgYW5kICJib2FyZCIsCi0JIG5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCi0gICAgICAgICBDYXJkIGxhY2tzOiBleHRlcm5hbCBhdWRpbyBpbiwgcGNpIHN1YnN5c3RlbSBpZC4KLSAgICAgICAqLworCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKy8qIHNvdW5kIHJvdXRpbmc6CisJR1BJTz0weDAwLDB4MDEsMHgwMzogbXV0ZSAoPykKKwkweDAyOiBib3RoIFRWIGFuZCByYWRpbyAodHVuZXI6IEZNMTIxNi9JKQorCVRoZSBjYXJkIGhhcyBvbmJvYXJkIGF1ZGlvIGNvbm5lY3RvcnMgbGFiZWxlZCAiY2Ryb20iIGFuZCAiYm9hcmQiLAorCW5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCisJQ2FyZCBsYWNrczogZXh0ZXJuYWwgYXVkaW8gaW4sIHBjaSBzdWJzeXN0ZW0gaWQuCisqLwogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg2MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSA3LAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAotICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDcsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAorCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLnR1bmVyX3R5cGUgICAgID0gNSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLnBsbCAgICAgICAgICAgID0gMSwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJFdXJlc3lzIFBpY29sbyIsCkBAIC0xNjg2LDYgKzE3ODYsOCBAQAogCS5ub190ZGE3NDMyICAgICA9IDEsCiAJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogTHVjIFZhbiBIb2V5bGFuZHQgPGx1Y0BlLW1hZ2ljLmJlPiAqLwogCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE1MCIsIC8qIDB4NGYgKi8KQEAgLTE2OTksNyArMTgwMSw4IEBACiAJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkubm9fbXNwMzR4eCAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLQkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4gKi8KIAkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCkBAIC0xNzE2LDc4ICsxODE5LDg1IEBACiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gMiwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmF1ZGlvX2hvb2sJPSBhZHR2azUwM19hdWRpbywKIH0sewogCiAJLyogLS0tLSBjYXJkIDB4NjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSGVyY3VsZXMgU21hcnQgVFYgU3RlcmVvIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMCwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCi0gICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwKKwkubmFtZSAgICAgICAgICAgPSAiSGVyY3VsZXMgU21hcnQgVFYgU3RlcmVvIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCisJLm5lZWRzX3R2YXVkaW8gID0gMSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSA1LAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkvKiBOb3RlczoKLQkgICAtIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElECi0JICAgLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCi0JICAgLSBBdWRpbyBSb3V0aW5nOgorCS0gY2FyZCBsYWNrcyBzdWJzeXN0ZW0gSUQKKwktIHN0ZXJlbyB2YXJpYW50IHcvIGRhdWdodGVyIGJvYXJkIHdpdGggdGRhOTg3NGEgQDB4YjAKKwktIEF1ZGlvIFJvdXRpbmc6CiAJCWFsd2F5cyBmcm9tIHRkYTk4NzQgaW5kZXBlbmRlbnQgb2YgR1BJTyAoPykKIAkJZXh0ZXJuYWwgbGluZSBpbjogdW5rbm93bgotCSAgIC0gT3RoZXIgY2hpcHM6IGVtNzhwMTU2ZWxwIEAgMHg5NiAocHJvYmFibHkgSVIgcmVtb3RlIGNvbnRyb2wpCi0JICAgICAgICAgICAgICBoZWY0MDUzIChpbnN0ZWFkIDQwNTIpIGZvciB1bmtub3duIGZ1bmN0aW9uCisJLSBPdGhlciBjaGlwczogZW03OHAxNTZlbHAgQCAweDk2IChwcm9iYWJseSBJUiByZW1vdGUgY29udHJvbCkKKwkJaGVmNDA1MyAoaW5zdGVhZCA0MDUyKSBmb3IgdW5rbm93biBmdW5jdGlvbgogCSovCiB9LHsKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBhY2UgVFYgJiBSYWRpbyBDYXJkIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwgLy8gVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvcgotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAotICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAotICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAxLAotICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC8qIEJ0ODc4LCBCdDgzMiwgRkkxMjQ2IHR1bmVyOyBubyBwY2kgc3Vic3lzdGVtIGlkCi0gICAgICAgICAgIG9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAotICAgICAgICAgICBSYWRpbyBtdXN0IGJlIGRlY29kZWQgYnkgbXNwMzQxMGQgKG5vdCByb3V0ZWQgdGhyb3VnaCkqLwotICAgICAgICAvLyAgICAgICAgIC5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsIC8vIHRvZG8hCisJLm5hbWUgICAgICAgICAgID0gIlBhY2UgVFYgJiBSYWRpbyBDYXJkIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sIC8qIFR1bmVyLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IgKi8KKwkuZ3Bpb21hc2sgICAgICAgPSAwLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKKwkudHVuZXJfdHlwZSAgICAgPSAxLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkuaGFzX3JhZGlvICAgICAgPSAxLAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkvKiBCdDg3OCwgQnQ4MzIsIEZJMTI0NiB0dW5lcjsgbm8gcGNpIHN1YnN5c3RlbSBpZAorCW9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAorCVJhZGlvIG11c3QgYmUgZGVjb2RlZCBieSBtc3AzNDEwZCAobm90IHJvdXRlZCB0aHJvdWdoKSovCisJLyoKKwkuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAgdG9kbyEKKwkqLwogfSx7Ci0gICAgICAgIC8qIENocmlzIFdpbGxpbmcgPGNocmlzQHZpc2xhYi51c3lkLmVkdS5hdT4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSAxLAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIgfSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS8qIENocmlzIFdpbGxpbmcgPGNocmlzQHZpc2xhYi51c3lkLmVkdS5hdT4gKi8KKwkubmFtZSAgICAgICAgICAgPSAiSVZDLTIwMCIsCisJLnZpZGVvX2lucHV0cyAgID0gMSwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAweGRmLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIH0sewogCS5uYW1lICAgICAgICAgICA9ICJHcmFuZCBYLUd1YXJkIC8gVHJ1c3QgODE0UENJIiwKIAkudmlkZW9faW5wdXRzICAgPSAxNiwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnN2aHMgICAgICAgICAgID0gLTEsCiAJLnR1bmVyX3R5cGUgICAgID0gNCwKLSAgICAgICAgLmdwaW9tYXNrMiAgICAgID0gMHhmZiwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLmdwaW9tYXNrMiAgICAgID0gMHhmZiwKIAkubXV4c2VsICAgICAgICAgPSB7IDIsMiwyLDIsIDMsMywzLDMsIDEsMSwxLDEsIDAsMCwwLDAgfSwKIAkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAogCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKKwkubm9fdGRhNzQzMiAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIH0sewogCiAJLyogLS0tLSBjYXJkIDB4NjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCS5uYW1lICAgICAgICAgICA9ICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiwKIAkudmlkZW9faW5wdXRzICAgPSAxLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKIAkuc3ZocyAgICAgICAgICAgPSAtMSwKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAogCS5ub19tc3AzNHh4ICAgICA9IDEsCkBAIC0xNzk1LDIyICsxOTA1LDI0IEBACiAJLm5vX3RkYTc0MzIgICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfZHZiICAgICAgICA9IDEsCiAJLm5vX2dwaW9pcnEgICAgID0gMSwKIH0sewogCS8qIEpvcmdlIEJvbmNvbXB0ZSAtIERUSTIgPGpvcmdlQGR0aTIubmV0PiAqLwogCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE0MyIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMCwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCB9LAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAwLAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAorCS52aWRlb19pbnB1dHMgICA9IDQsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkuZ3Bpb21hc2sgICAgICAgPSAwLAorCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAorCS5hdWRpb211eCAgICAgICA9IHsgMCB9LAorCS5uZWVkc190dmF1ZGlvICA9IDAsCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogfSx7CiAJLyogTS5LbGFockBwaHl0ZWMuZGUgKi8KIAkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBNaW5pRElOIChidDg3OCkiLApAQCAtMTgyNCw2ICsxOTM2LDcgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBDb21iaSAoYnQ4NzgpIiwKIAkudmlkZW9faW5wdXRzICAgPSA0LApAQCAtMTgzNiw2ICsxOTQ5LDcgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAogCS8qIC0tLS0gY2FyZCAweDZjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE4NDYsMTMgKzE5NjAsMTQgQEAKIAkuc3ZocyAgICAgICAgICAgPSA5LAogCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCiAJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KLQkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCi0JCQkJICAgeHRlcm5hbCB2aWRlby1tdXggKi8KKwkJCQl2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCisJCQkJeHRlcm5hbCB2aWRlby1tdXggKi8KIAkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDAgfSwKIAkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KIAkubmVlZHNfdHZhdWRpbyAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOSBDb21iaSAoYnQ4NzgpIiwKIAkudmlkZW9faW5wdXRzICAgPSAxMCwKQEAgLTE4NjEsMjMgKzE5NzYsMjUgQEAKIAkuc3ZocyAgICAgICAgICAgPSA5LAogCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCiAJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KLQkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCi0JCQkJICAgeHRlcm5hbCB2aWRlby1tdXggKi8KKwkJCQl2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCisJCQkJeHRlcm5hbCB2aWRlby1tdXggKi8KIAkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDEgfSwKIAkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KIAkubmVlZHNfdHZhdWRpbyAgPSAxLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAotICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAotICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKLSAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTAwIiwKKwkudmlkZW9faW5wdXRzICAgPSA0LAorCS5hdWRpb19pbnB1dHMgICA9IDAsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnR1bmVyX3R5cGUgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS5ncGlvbWFzayAgICAgICA9IDB4ZGYsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogfSx7CiAJLyogSVZDLTEyMEcgLSBBbGFuIEdhcmZpZWxkIDxhbGFuQGZyb21vcmJpdC5jb20+ICovCiAJLm5hbWUgICAgICAgICAgID0gIklWQy0xMjBHIiwKQEAgLTE4ODUsNiArMjAwMiw3IEBACiAJLmF1ZGlvX2lucHV0cyAgID0gMCwgICAgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KIAkudHVuZXIgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuc3ZocyAgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyBzdmhzICovCiAJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkubm9fbXNwMzR4eCAgICAgPSAxLApAQCAtMTg5Miw3ICsyMDEwLDcgQEAKIAkubm9fdGRhNzQzMiAgICAgPSAxLAogCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCiAJLm11eHNlbCAgICAgICAgID0geyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotCQkJICAgIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfSwKKwkJCTB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfSwKIAkubXV4c2VsX2hvb2sgICAgPSBpdmMxMjBfbXV4c2VsLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIH0sewpAQCAtMTkwNSw2ICsyMDIzLDcgQEAKIAkuc3ZocyAgICAgICAgICAgPSAyLAogCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19BVFNDLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX2R2YiAgICAgICAgPSAxLAogfSx7CiAJLm5hbWUgICAgICAgICAgID0gIlR3aW5oYW4gRFNUICsgY2xvbmVzIiwKQEAgLTE5MTIsMTkgKzIwMzEsMjEgQEAKIAkubm9fdGRhOTg3NSAgICAgPSAxLAogCS5ub190ZGE3NDMyICAgICA9IDEsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkubm9fdmlkZW8gICAgICAgPSAxLAogCS5oYXNfZHZiICAgICAgICA9IDEsCiB9LHsKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIldpbmZhc3QgVkMxMDAiLAorCS5uYW1lICAgICAgICAgICA9ICJXaW5mYXN0IFZDMTAwIiwKIAkudmlkZW9faW5wdXRzICAgPSAzLAogCS5hdWRpb19pbnB1dHMgICA9IDAsCiAJLnN2aHMgICAgICAgICAgID0gMSwKLQkudHVuZXIgICAgICAgICAgPSAtMSwgLy8gbm8gdHVuZXIKLQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDN9LCAvLyBWaWQgSW4sIFNWaWQgSW4sIFZpZCBvdmVyIFNWaWQgaW4gY29ubmVjdG9yCi0gICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCi0gICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDN9LCAvKiBWaWQgSW4sIFNWaWQgSW4sIFZpZCBvdmVyIFNWaWQgaW4gY29ubmVjdG9yICovCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiB9LHsKIAkubmFtZSAgICAgICAgICAgPSAiVGVwcHJvIFRFVi01NjAvSW50ZXJWaXNpb24gSVYtNTYwIiwKQEAgLTE5MzcsNDQgKzIwNTgsNDkgQEAKIAkuYXVkaW9tdXggICAgICAgPSB7IDEsIDEsIDEsIDEsIDB9LAogCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKIH0sewogCiAJLyogLS0tLSBjYXJkIDB4NzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAotICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyfSwKLSAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgzRiwKKwkubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAwLAorCS50dW5lciAgICAgICAgICA9IC0xLAorCS5zdmhzICAgICAgICAgICA9IC0xLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyfSwKKwkuZ3Bpb21hc2sgICAgICAgPSAweDNGLAogCS5tdXhzZWxfaG9vayAgICA9IGd2YzExMDBfbXV4c2VsLAogfSx7Ci0gICAgICAgIC8qIENhcmxvcyBTaWx2YSByM3Bla0ByM3Blay5ob21lbGludXgub3JnIHx8IGNhcmQgMHg3NSAqLwotICAgICAgICAubmFtZSAgICAgICAgICAgPSAiTkdTIE5HU1RWKyIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCi0gICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7MiwgMywgMCwgMH0sCi0gICAgICAgIC5hdWRpb211eCAgICAgICA9IHswLCAwLCAwLCAwLCAweDAwMDAwMywgMH0sCi0gICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCi0gICAgICAgIC5oYXNfcmVtb3RlICAgICA9IDEsCisJLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCisJLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAorCS52aWRlb19pbnB1dHMgICA9IDMsCisJLnR1bmVyICAgICAgICAgID0gMCwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAorCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKKwkuYXVkaW9tdXggICAgICAgPSB7MCwgMCwgMCwgMCwgMHgwMDAwMDMsIDB9LAorCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLmhhc19yZW1vdGUgICAgID0gMSwKIH0sewotICAgICAgICAvKiBodHRwOi8vbGludXhtZWRpYWxhYnMuY29tICovCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJMTUxCVDQiLAotICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LCAvKiBJTjEsSU4yLElOMyxJTjQgKi8KLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAotICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKLSAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKLSAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKLSAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkvKiBodHRwOi8vbGludXhtZWRpYWxhYnMuY29tICovCisJLm5hbWUgICAgICAgICAgID0gIkxNTEJUNCIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwgLyogSU4xLElOMixJTjMsSU40ICovCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKKwkubmVlZHNfdHZhdWRpbyAgPSAwLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIH0sewogCS8qIEhlbG1yb29zIEhhcnJpIDxoYXJyaS5oZWxtcm9vc0BwcC5pbmV0LmZpPiAqLwogCS5uYW1lICAgICAgICAgICA9ICJUZWtyYW0gTTIwNSBQUk8iLApAQCAtMTk4Miw2ICsyMTA4LDcgQEAKIAkuYXVkaW9faW5wdXRzICAgPSAxLAogCS50dW5lciAgICAgICAgICA9IDAsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5zdmhzICAgICAgICAgICA9IDIsCiAJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkuZ3Bpb21hc2sgICAgICAgPSAweDY4LApAQCAtMjAwNCw2ICsyMTMxLDcgQEAKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLmhhc19yZW1vdGUgICAgID0gMSwKIAkuaGFzX3JhZGlvICAgICAgPSAxLAogfSx7CkBAIC0yMDI2LDYgKzIxNTQsOCBAQAogCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkubmVlZHNfdHZhdWRpbyAgPSAwLAogCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KKwkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBTcGlyaXQgVFYgVHVuZXIgZnJvbSBodHRwOi8vc3Bpcml0bW9kZW1zLmNvbS5hdSAqLwogCS8qIFN0YWZmb3JkIEdvb2RzZWxsIDxzdXJnZUBnb2xpYXRoLmhvbWV1bml4Lm9yZz4gKi8KQEAgLTIwMzgsMjMgKzIxNjgsMjUgQEAKIAkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEgfSwKIAkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAogCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkubm9fdGRhOTg3NSAgICAgPSAxLAogfSx7CiAJLyogV29sZnJhbSBKb29zdCA8d29qb0Bmcm9rYXNjaHdlaS5kZT4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgNzcxIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMiwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAzICwgMyB9LAotICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAotICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAotICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0gICAgICAgIC5oYXNfZHZiICAgICAgICA9IDEsCi0gICAgICAgIC5ub19ncGlvaXJxICAgICA9IDEsCi0gICAgICAgIC5oYXNfcmVtb3RlICAgICA9IDEsCisJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgNzcxIiwKKwkudmlkZW9faW5wdXRzICAgPSAyLAorCS5zdmhzICAgICAgICAgICA9IDEsCisJLnR1bmVyICAgICAgICAgID0gLTEsCisJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubXV4c2VsICAgICAgICAgPSB7IDMgLCAzIH0sCisJLm5vX21zcDM0eHggICAgID0gMSwKKwkubm9fdGRhOTg3NSAgICAgPSAxLAorCS5ub190ZGE3NDMyICAgICA9IDEsCisJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCS5oYXNfZHZiICAgICAgICA9IDEsCisJLm5vX2dwaW9pcnEgICAgID0gMSwKKwkuaGFzX3JlbW90ZSAgICAgPSAxLAogfSx7CiAJLyogLS0tLSBjYXJkIDB4N2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCS8qIE1hdHQgSmVzc29uIDxkdmJAamVzc29uLmVjbGlwc2UuY28udWs+ICovCkBAIC0yMDY5LDYgKzIyMDEsNyBAQAogCS5ub190ZGE3NDMyICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuaGFzX2R2YiAgICAgICAgPSAxLAogCS5ub19ncGlvaXJxICAgICA9IDEsCiAJLmhhc19yZW1vdGUgICAgID0gMSwKQEAgLTIwODEsMTIgKzIyMTQsMTMgQEAKIAkuc3ZocyAgICAgICAgICAgICA9IC0xLAogCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAogCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotCQkJICAgICAgMywgMywgMywgMywgMywgMywgMywgMyB9LAorCQkJMywgMywgMywgMywgMywgMywgMywgMyB9LAogCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTUV9tdXhzZWwsCiAJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKIAkubm9fbXNwMzR4eCAgICAgICA9IDEsCiAJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgkgID0gQUREUl9VTlNFVCwKIH0sewogCS8qIGFuZHJlLnNjaHdhcnpAbWF0cml4LXZpc2lvbi5kZSAqLwogCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU0xDIiwKQEAgLTIxMDEsNiArMjIzNSw3IEBACiAJLm5vX21zcDM0eHggICAgICAgPSAxLAogCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAogCS50dW5lcl90eXBlICAgICAgID0gLTEsCisJLnR1bmVyX2FkZHIJICA9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBCVFRWX0FQQUNfVklFV0NPTVAgKi8KIAkvKiBBdHRpbGEgS29uZG9yb3MgPGF0dGlsYS5rb25kb3Jvc0BjaGVsbG8uaHU+ICovCkBAIC0yMTE2LDEzICsyMjUxLDE0IEBACiAJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmVtb3RlICAgICA9IDEsICAgLyogbWluaXJlbW90ZSB3b3Jrcywgc2VlIGlyLWtiZC1ncGlvLmMgKi8KIAkuaGFzX3JhZGlvICAgICAgPSAxLCAgIC8qIG5vdCBldmVyeSBjYXJkIGhhcyByYWRpbyAqLwogfSx7CiAKIAkvKiAtLS0tIGNhcmQgMHg4MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLyogQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4gKi8KLQkubmFtZSAgICAgICAgICAgPSAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiwKKwkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiwKIAkudHVuZXIgICAgICAgICAgPSAtMSwKIAkubm9fbXNwMzR4eCAgICAgPSAxLAogCS5ub190ZGE5ODc1ICAgICA9IDEsCkBAIC0yMTMxLDYgKzIyNjcsNyBAQAogCS5ub192aWRlbyAgICAgICA9IDEsCiAJLmhhc19kdmIgICAgICAgID0gMSwKIAkudHVuZXJfdHlwZSAgICAgPSAtMSwKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiB9LHsKIAkvKiBTdGV2ZW4gPHBob3RvbjM4QHBjaG9tZS5jb20udHc+ICovCiAJLm5hbWUgICAgICAgICAgID0gIlYtR2VhciBNeVZDRCIsCkBAIC0yMTQ0LDYyICsyMjgxLDY1IEBACiAJLm5vX21zcDM0eHggICAgID0gMSwKIAkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCS5oYXNfcmFkaW8gICAgICA9IDAsCi0JLy8gLmhhc19yZW1vdGUgICAgID0gMSwKIH0sewogCS8qIFJpY2sgQyA8Y3J5cHRkcmFnb29uQGdtYWlsLmNvbT4gKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlN1cGVyIFRWIFR1bmVyIiwKLSAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKLSAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKLSAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKLSAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKLSAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKLSAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAotICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKLSAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDAwMDAwMSwwLDAsIDB9LAotICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAotICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAorCS5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCisJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDAwMDAwMSwwLDAsIDB9LAorCS5uZWVkc190dmF1ZGlvICA9IDEsCisJLmhhc19yYWRpbyAgICAgID0gMSwKIH0sewotCQkvKiBDaHJpcyBGYW5uaW5nIDx2aWRlbzRsaW51eEBoYXlkb24ubmV0PiAqLwotCQkubmFtZSAgICAgICAgICAgPSAiVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IiwKLQkJLnZpZGVvX2lucHV0cyAgID0gMTYsCi0JCS5hdWRpb19pbnB1dHMgICA9IDAsCi0JCS50dW5lciAgICAgICAgICA9IC0xLAotCQkuc3ZocyAgICAgICAgICAgPSAtMSwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyIH0sCi0JCS5wbGwJCT0gUExMXzI4LAotCQkubm9fbXNwMzR4eCAgICAgPSAxLAotCQkubm9fdGRhOTg3NSAgICAgPSAxLAotCQkubm9fdGRhNzQzMgk9IDEsCi0JCS50dW5lcl90eXBlICAgICA9IC0xLAotCQkubXV4c2VsX2hvb2sgICAgPSB0aWJldENTMTZfbXV4c2VsLAorCS8qIENocmlzIEZhbm5pbmcgPHZpZGVvNGxpbnV4QGhheWRvbi5uZXQ+ICovCisJLm5hbWUgICAgICAgICAgID0gIlRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiIsCisJLnZpZGVvX2lucHV0cyAgID0gMTYsCisJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkudHVuZXIgICAgICAgICAgPSAtMSwKKwkuc3ZocyAgICAgICAgICAgPSAtMSwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfSwKKwkucGxsCQk9IFBMTF8yOCwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIJPSAxLAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkubXV4c2VsX2hvb2sgICAgPSB0aWJldENTMTZfbXV4c2VsLAogfSwKIHsKIAkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KIAkvKgotCSAqIE5vdGUgdGhhdCwgYmVjYXVzZSBvZiB0aGUgY2FyZCdzIHdpcmluZywgdGhlICJtYXN0ZXIiCi0JICogQlQ4NzhBIGNoaXAgKGkuZS4gdGhlIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaAotCSAqIGFuZCBtdXN0IHVzZSB0aGlzIGNhcmQgdHlwZSkgaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUKLQkgKiBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgY2FyZCB0eXBlIDB4ODUsIHdob3NlIGRlc2NyaXB0aW9uCi0JICogZm9sbG93cyB0aGlzIG9uZS4gIFRoZXJlIGlzIGEgRUVQUk9NIG9uIHRoZSBjYXJkICh3aGljaCBpcwotCSAqIGNvbm5lY3RlZCB0byB0aGUgSTJDIG9mIG9uZSBvZiB0aG9zZSBvdGhlciBjaGlwcyksIGJ1dCBpcwotCSAqIG5vdCBjdXJyZW50bHkgaGFuZGxlZC4gIFRoZXJlIGlzIGFsc28gYSBmYWNpbGl0eSBmb3IgYQotCSAqICJtb25pdG9yIiwgd2hpY2ggaXMgYWxzbyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgotCSAqLwotCS5uYW1lCQk9ICJLb2RpY29tIDQ0MDBSIChtYXN0ZXIpIiwKKwkqIE5vdGUgdGhhdCwgYmVjYXVzZSBvZiB0aGUgY2FyZCdzIHdpcmluZywgdGhlICJtYXN0ZXIiCisJKiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUgb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoCisJKiBhbmQgbXVzdCB1c2UgdGhpcyBjYXJkIHR5cGUpIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlCisJKiBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgY2FyZCB0eXBlIDB4ODUsIHdob3NlIGRlc2NyaXB0aW9uCisJKiBmb2xsb3dzIHRoaXMgb25lLiAgVGhlcmUgaXMgYSBFRVBST00gb24gdGhlIGNhcmQgKHdoaWNoIGlzCisJKiBjb25uZWN0ZWQgdG8gdGhlIEkyQyBvZiBvbmUgb2YgdGhvc2Ugb3RoZXIgY2hpcHMpLCBidXQgaXMKKwkqIG5vdCBjdXJyZW50bHkgaGFuZGxlZC4gIFRoZXJlIGlzIGFsc28gYSBmYWNpbGl0eSBmb3IgYQorCSogIm1vbml0b3IiLCB3aGljaCBpcyBhbHNvIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisJKi8KKwkubmFtZSAgICAgICAgICAgPSAiS29kaWNvbSA0NDAwUiAobWFzdGVyKSIsCiAJLnZpZGVvX2lucHV0cwk9IDE2LAogCS5hdWRpb19pbnB1dHMJPSAwLAogCS50dW5lcgkJPSAtMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuc3ZocwkJPSAtMSwKIAkvKiBHUElPIGJpdHMgMC05IHVzZWQgZm9yIGFuYWxvZyBzd2l0Y2g6Ci0JICogICAwMCAtIDAzOgljYW1lcmEgc2VsZWN0b3IKLQkgKiAgIDA0IC0gMDY6CWNoYW5uZWwgKGNvbnRyb2xsZXIpIHNlbGVjdG9yCi0JICogICAwNzoJZGF0YSAoMS0+b24sIDAtPm9mZikKLQkgKiAgIDA4OglzdHJvYmUKLQkgKiAgIDA5OglyZXNldAotCSAqIGJpdCAxNiBpcyBpbnB1dCBmcm9tIHN5bmMgc2VwYXJhdG9yIGZvciB0aGUgY2hhbm5lbAotCSAqLworCSogICAwMCAtIDAzOgljYW1lcmEgc2VsZWN0b3IKKwkqICAgMDQgLSAwNjoJY2hhbm5lbCAoY29udHJvbGxlcikgc2VsZWN0b3IKKwkqICAgMDc6CWRhdGEgKDEtPm9uLCAwLT5vZmYpCisJKiAgIDA4OglzdHJvYmUKKwkqICAgMDk6CXJlc2V0CisJKiBiaXQgMTYgaXMgaW5wdXQgZnJvbSBzeW5jIHNlcGFyYXRvciBmb3IgdGhlIGNoYW5uZWwKKwkqLwogCS5ncGlvbWFzawk9IDB4MDAwM2ZmLAogCS5ub19ncGlvaXJxICAgICA9IDEsCiAJLm11eHNlbAkJPSB7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKQEAgLTIyMTIsMTUgKzIzNTIsMTYgQEAKIHsKIAkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KIAkvKiBOb3RlIHRoYXQsIGZvciByZWFzb25zIHVua25vd24sIHRoZSAibWFzdGVyIiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUKLQkgKiBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBtdXN0IHVzZSB0aGUgY2FyZCB0eXBlKQotCSAqIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSB0aGlzIGNhcmQKLQkgKiB0eXBlCi0JICovCisJKiBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBtdXN0IHVzZSB0aGUgY2FyZCB0eXBlKQorCSogaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUgb3RoZXIgMyBjaGlwcyBzaG91bGQgdXNlIHRoaXMgY2FyZAorCSogdHlwZQorCSovCiAJLm5hbWUJCT0gIktvZGljb20gNDQwMFIgKHNsYXZlKSIsCiAJLnZpZGVvX2lucHV0cwk9IDE2LAogCS5hdWRpb19pbnB1dHMJPSAwLAogCS50dW5lcgkJPSAtMSwKIAkudHVuZXJfdHlwZQk9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkuc3ZocwkJPSAtMSwKIAkuZ3Bpb21hc2sJPSAweDAxMDAwMCwKIAkubm9fZ3Bpb2lycSAgICAgPSAxLApAQCAtMjIzMiwxOCArMjM3Myw1MSBAQAogCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCiB9LAogewotICAgICAgICAvKiAtLS0tIGNhcmQgMHg4NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgLyogTWljaGFlbCBIZW5zb24gPG1oZW5zb25AY2xhcml0eXZpLmNvbT4gKi8KLSAgICAgICAgLyogQWRsaW5rIFJUVjI0IHdpdGggc3BlY2lhbCB1bmxvY2sgY29kZXMgKi8KLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFkbGluayBSVFYyNCIsCi0gICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCi0gICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCi0gICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCi0gICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCi0gICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCi0gICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAotICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0KKwkvKiAtLS0tIGNhcmQgMHg4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBNaWNoYWVsIEhlbnNvbiA8bWhlbnNvbkBjbGFyaXR5dmkuY29tPiAqLworCS8qIEFkbGluayBSVFYyNCB3aXRoIHNwZWNpYWwgdW5sb2NrIGNvZGVzICovCisJLm5hbWUgICAgICAgICAgID0gIkFkbGluayBSVFYyNCIsCisJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkuYXVkaW9faW5wdXRzICAgPSAxLAorCS50dW5lciAgICAgICAgICA9IDAsCisJLnN2aHMgICAgICAgICAgID0gMiwKKwkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCS50dW5lcl90eXBlICAgICA9IC0xLAorCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkucGxsICAgICAgICAgICAgPSBQTExfMjgsCit9LAoreworCS8qIC0tLS0gY2FyZCAweDg3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QG0xay5uZXQ+ICovCisJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiwKKwkudHVuZXIgICAgICAgICAgPSAwLAorCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1REVlNfSDA2MkYsCisJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCS52aWRlb19pbnB1dHMgICA9IDIsCisJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkuc3ZocyAgICAgICAgICAgPSAyLAorCS5tdXhzZWwJCT0geyAyLCAzIH0sCisJLmdwaW9tYXNrICAgICAgID0gMHgwMGUwMDAwNywKKwkuYXVkaW9tdXggICAgICAgPSB7IDB4MDA0MDAwMDUsIDAsIDAsIDAsIDAsIDAgfSwKKwkubm9fbXNwMzR4eCAgICAgPSAxLAorCS5ub190ZGE5ODc1ICAgICA9IDEsCisJLm5vX3RkYTc0MzIgICAgID0gMSwKK30seworCS8qIC0tLS0gY2FyZCAweDg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4gKi8KKwkubmFtZQkJPSAiQWNvcnAgWTg3OEYiLAorCS52aWRlb19pbnB1dHMJPSAzLAorCS5hdWRpb19pbnB1dHMJPSAxLAorCS50dW5lcgkJPSAwLAorCS5zdmhzCQk9IDIsCisJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCisJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCS5hdWRpb211eCAgICAgICA9IHsgMHgwMDFlMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKKwkubmVlZHNfdHZhdWRpbwk9IDEsCisJLnBsbAkJPSBQTExfMjgsCisJLnR1bmVyX3R5cGUJPSBUVU5FUl9ZTUVDX1RWRjY2VDVfQl9ERkYsCisJLnR1bmVyX2FkZHIJPSAweGMxID4+MSwKKwkuaGFzX3JhZGlvCT0gMSwKIH19OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJ0dHZfbnVtX3R2Y2FyZHMgPSBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcyk7CkBAIC0yMzU1LDMyICsyNTI5LDMyIEBACiAJaW50IHR1bmVyPS0xLHR0eXBlOwogCiAJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7Ci0JdWRlbGF5KDgpOyAgLy8gd2l0aG91dCB0aGlzIHdlIHdvdWxkIHNlZSB0aGUgMHgxODAwIG1hc2sKKwl1ZGVsYXkoOCk7ICAvKiB3aXRob3V0IHRoaXMgd2Ugd291bGQgc2VlIHRoZSAweDE4MDAgbWFzayAqLwogCWdwaW8gPSBncGlvX3JlYWQoKTsKIAkvKiBGSVhNRTogbXVzdCByZXN0b3JlIE9VUl9FTiA/Pz8gKi8KIAotCS8vIGFsbCBjYXJkcyBwcm92aWRlIEdQSU8gaW5mbywgc29tZSBoYXZlIGFuIGFkZGl0aW9uYWwgZWVwcm9tCi0JLy8gTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKLQkvLyAgICAgICBDUDk9R1BJTzIzIC4uIENQMT1HUElPMTU7IHdoZW4gT1BFTiwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZWFkcyAxLgotCS8vICAgICAgIEdQSU8xNC0xMjogbi5jLgotCS8vIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQorCS8qIGFsbCBjYXJkcyBwcm92aWRlIEdQSU8gaW5mbywgc29tZSBoYXZlIGFuIGFkZGl0aW9uYWwgZWVwcm9tCisJICogTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKKwkgKiAgICAgICBDUDk9R1BJTzIzIC4uIENQMT1HUElPMTU7IHdoZW4gT1BFTiwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZWFkcyAxLgorCSAqICAgICAgIEdQSU8xNC0xMjogbi5jLgorCSAqIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQogCi0JLy8gbG93ZXN0IDMgYnl0ZXMgYXJlIHJlbW90ZSBjb250cm9sIGNvZGVzIChubyBoYW5kc2hha2UgbmVlZGVkKQotICAgICAgICAvLyB4eHhGRkY6IE5vIHJlbW90ZSBjb250cm9sIGNoaXAgc29sZGVyZWQKLSAgICAgICAgLy8geHh4RjAwKExSMjYvTFI1MCksIHh4eEZFMChMUjkwKTogUmVtb3RlIGNvbnRyb2wgY2hpcCAoTFZBMDAxIG9yIENGNDUpIHNvbGRlcmVkCi0JLy8gTm90ZTogU29tZSBiaXRzIGFyZSBBdWRpb19NYXNrICEKLQorCSAqIGxvd2VzdCAzIGJ5dGVzIGFyZSByZW1vdGUgY29udHJvbCBjb2RlcyAobm8gaGFuZHNoYWtlIG5lZWRlZCkKKwkgKiB4eHhGRkY6IE5vIHJlbW90ZSBjb250cm9sIGNoaXAgc29sZGVyZWQKKwkgKiB4eHhGMDAoTFIyNi9MUjUwKSwgeHh4RkUwKExSOTApOiBSZW1vdGUgY29udHJvbCBjaGlwIChMVkEwMDEgb3IgQ0Y0NSkgc29sZGVyZWQKKwkgKiBOb3RlOiBTb21lIGJpdHMgYXJlIEF1ZGlvX01hc2sgIQorCSAqLwogCXR0eXBlPShncGlvJjB4MGYwMDAwKT4+MTY7CiAJc3dpdGNoKHR0eXBlKSB7Ci0JY2FzZSAweDA6IHR1bmVyPTI7IC8vIE5UU0MsIGUuZy4gVFBJOE5TUjExUAorCWNhc2UgMHgwOiB0dW5lcj0yOyAvKiBOVFNDLCBlLmcuIFRQSThOU1IxMVAgKi8KIAkJYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgyOiB0dW5lcj0zOTsvLyBMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1INzAxUAorICAgICAgICBjYXNlIDB4MjogdHVuZXI9Mzk7LyogTEcgTlRTQyAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtSDcwMVAgKi8KIAkJYnJlYWs7Ci0JY2FzZSAweDQ6IHR1bmVyPTU7IC8vIFBoaWxpcHMgUEFMIFRQSThQU0IwMlAsIFRQSThQU0IxMlAsIFRQSThQU0IxMkQgb3IgRkkxMjE2LCBGTTEyMTYKKwljYXNlIDB4NDogdHVuZXI9NTsgLyogUGhpbGlwcyBQQUwgVFBJOFBTQjAyUCwgVFBJOFBTQjEyUCwgVFBJOFBTQjEyRCBvciBGSTEyMTYsIEZNMTIxNiAqLwogCQlicmVhazsKLQljYXNlIDB4NjogdHVuZXI9Mzc7IC8vIExHIFBBTCAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtRzcwMlAKKwljYXNlIDB4NjogdHVuZXI9Mzc7LyogTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUCAqLwogCQlicmVhazsKLQljYXNlIDB4QzogdHVuZXI9MzsgLy8gUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRgorCQljYXNlIDB4QzogdHVuZXI9MzsgLyogUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRiAqLwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7CkBAIC0yMzg4LDE1ICsyNTYyLDE2IEBACiAKIAloYXNfcmVtb3RlICAgICAgICAgID0gICBncGlvICYgMHg4MDAwMDA7CiAJaGFzX3JhZGlvCSAgICA9ICAgZ3BpbyAmIDB4NDAwMDAwOwotCS8vICAgdW5rbm93biAgICAgICAgICAgICAgICAgICAweDIwMDAwMDsKLQkvLyAgIHVua25vd24yICAgICAgICAgICAgICAgICAgMHgxMDAwMDA7Ci0gICAgICAgIGlzX2NhcHR1cmVfb25seSAgICAgPSAhKGdwaW8gJiAweDAwODAwMCk7IC8vR1BJTzE1CisJLyogICB1bmtub3duICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwOworCSAqICAgdW5rbm93bjIgICAgICAgICAgICAgICAgICAweDEwMDAwMDsgKi8KKyAgICAgICAgaXNfY2FwdHVyZV9vbmx5ICAgICA9ICEoZ3BpbyAmIDB4MDA4MDAwKTsgLyogR1BJTzE1ICovCiAJaGFzX3RkYTk4MjBfdGRhOTgyMSA9ICEoZ3BpbyAmIDB4MDA0MDAwKTsKLQlpc19scjkwICAgICAgICAgICAgID0gIShncGlvICYgMHgwMDIwMDApOyAvLyBlbHNlIExSMjYvTFI1MCAoTFIzOC9MUjUxIGYuIGNhcHR1cmUgb25seSkKLSAgICAgICAgLy8JCSAgICAgICAgZ3BpbyAmIDB4MDAxMDAwIC8vIG91dHB1dCBiaXQgZm9yIGF1ZGlvIHJvdXRpbmcKKwlpc19scjkwICAgICAgICAgICAgID0gIShncGlvICYgMHgwMDIwMDApOyAvKiBlbHNlIExSMjYvTFI1MCAoTFIzOC9MUjUxIGYuIGNhcHR1cmUgb25seSkgKi8KKwkvKgorCSAqIGdwaW8gJiAweDAwMTAwMCAgICBvdXRwdXQgYml0IGZvciBhdWRpbyByb3V0aW5nICovCiAKIAlpZihpc19jYXB0dXJlX29ubHkpCi0JCXR1bmVyPTQ7IC8vIE5vIHR1bmVyIHByZXNlbnQKKwkJdHVuZXI9NDsgLyogTm8gdHVuZXIgcHJlc2VudCAqLwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyBSYWRpbz0lcyBSZW1vdGVDb250cm9sPSVzIFR1bmVyPSVkIGdwaW89MHglMDZ4XG4iLAogCSAgICAgICBidHYtPmMubnIsIGhhc19yYWRpbz8gInllcyI6Im5vICIsIGhhc19yZW1vdGU/ICJ5ZXMiOiJubyAiLCB0dW5lciwgZ3Bpbyk7CkBAIC0yNDA0LDE1ICsyNTc5LDE1IEBACiAJCWJ0di0+Yy5uciwgaXNfbHI5MD8ieWVzIjoibm8gIiwgaGFzX3RkYTk4MjBfdGRhOTgyMT8ieWVzIjoibm8gIiwKIAkJaXNfY2FwdHVyZV9vbmx5PyJ5ZXMiOiJubyAiKTsKIAotCWlmKHR1bmVyIT0gLTEpIC8vIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoCisJaWYodHVuZXIhPSAtMSkgLyogb25seSBzZXQgaWYga25vd24gdHVuZXIgYXV0b2RldGVjdGVkLCBlbHNlIGxldCBpbnNtb2Qgb3B0aW9uIHRocm91Z2ggKi8KIAkJYnR2LT50dW5lcl90eXBlID0gdHVuZXI7CiAJYnR2LT5oYXNfcmFkaW8gPSBoYXNfcmFkaW87CiAKLQkvLyBMUjkwIEF1ZGlvIFJvdXRpbmcgaXMgZG9uZSBieSAyIGhlZjQwNTIsIHNvIEF1ZGlvX01hc2sgaGFzIDQgYml0czogMHgwMDFjODAKLSAgICAgICAgLy8gTFIyNi9MUjUwIG9ubHkgaGFzIDEgaGVmNDA1MiwgQXVkaW9fTWFzayAweDAwMGMwMAotCS8vIEF1ZGlvIG9wdGlvbnM6IGZyb20gdHVuZXIsIGZyb20gdGRhOTgyMS90ZGE5ODIxKG1vbm8sc3RlcmVvLHNhcCksIGZyb20gdGRhOTg3NCwgZXh0LiwgbXV0ZQorCS8qIExSOTAgQXVkaW8gUm91dGluZyBpcyBkb25lIGJ5IDIgaGVmNDA1Miwgc28gQXVkaW9fTWFzayBoYXMgNCBiaXRzOiAweDAwMWM4MAorCSAqIExSMjYvTFI1MCBvbmx5IGhhcyAxIGhlZjQwNTIsIEF1ZGlvX01hc2sgMHgwMDBjMDAKKwkgKiBBdWRpbyBvcHRpb25zOiBmcm9tIHR1bmVyLCBmcm9tIHRkYTk4MjEvdGRhOTgyMShtb25vLHN0ZXJlbyxzYXApLCBmcm9tIHRkYTk4NzQsIGV4dC4sIG11dGUgKi8KIAlpZihoYXNfdGRhOTgyMF90ZGE5ODIxKSBidHYtPmF1ZGlvX2hvb2sgPSBsdDk0MTVfYXVkaW87Ci0JLy90b2RvOiBpZihoYXNfdGRhOTg3NCkgYnR2LT5hdWRpb19ob29rID0gZnYyMDAwc19hdWRpbzsKKwkvKiB0b2RvOiBpZihoYXNfdGRhOTg3NCkgYnR2LT5hdWRpb19ob29rID0gZnYyMDAwc19hdWRpbzsgKi8KIH0KIAogc3RhdGljIGludCBtaXJvX3R1bmVybWFwW10gPSB7IDAsNiwyLDMsICAgNCw1LDYsMCwgIDMsMCw0LDUsICA1LDIsMTYsMSwKQEAgLTI2MzMsNiArMjgwOCw4IEBACiB2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDIoc3RydWN0IGJ0dHYgKmJ0dikKIHsKIAlpbnQgdGRhOTg4NzsKKwlpbnQgYWRkcj1BRERSX1VOU0VUOworCiAgICAgICAgIGJ0di0+dHVuZXJfdHlwZSA9IC0xOwogCiAJaWYgKEJUVFZfVU5LTk9XTiA9PSBidHYtPmMudHlwZSkgewpAQCAtMjc3Myw5ICsyOTUwLDEyIEBACiAJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKIAogCS8qIHR1bmVyIGNvbmZpZ3VyYXRpb24gKGZyb20gY2FyZCBsaXN0IC8gYXV0b2RldGVjdCAvIGluc21vZCBvcHRpb24pICovCi0gCWlmIChVTlNFVCAhPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGUpCisJaWYgKEFERFJfVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl9hZGRyKQorCQlhZGRyID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl9hZGRyOworCisJaWYgKFVOU0VUICE9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZSkKIAkJaWYoVU5TRVQgPT0gYnR2LT50dW5lcl90eXBlKQotICAgICAgICAgICAgICAgIAlidHYtPnR1bmVyX3R5cGUgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGU7CisgICAgICAgIAkgICAgICAgCWJ0di0+dHVuZXJfdHlwZSA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZTsKIAlpZiAoVU5TRVQgIT0gdHVuZXJbYnR2LT5jLm5yXSkKIAkJYnR2LT50dW5lcl90eXBlID0gdHVuZXJbYnR2LT5jLm5yXTsKIAlwcmludGsoImJ0dHYlZDogdXNpbmcgdHVuZXI9JWRcbiIsYnR2LT5jLm5yLGJ0di0+dHVuZXJfdHlwZSk7CkBAIC0yNzg3LDcgKzI5NjcsNyBAQAogCiAJICAgICAgICB0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOwogCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKLQkJdHVuX3NldHVwLmFkZHIgPSBBRERSX1VOU0VUOworCQl0dW5fc2V0dXAuYWRkciA9IGFkZHI7CiAKIAkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CiAJfQpAQCAtMjg4MCw3ICszMDYwLDcgQEAKIHsKIAlzdHJ1Y3QgdHZlZXByb20gdHY7CiAKLQl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZ0diwgZWVwcm9tX2RhdGEpOworCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coJmJ0di0+aTJjX2NsaWVudCwgJnR2LCBlZXByb21fZGF0YSk7CiAJYnR2LT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKIAlidHYtPmhhc19yYWRpbyAgPSB0di5oYXNfcmFkaW87CiB9CkBAIC0yOTAyLDcgKzMwODIsNyBAQAogCWJ0di0+bWJveF9jc2VsICAgID0gMSA8PCAxMDsKIAogCWZyZXE9ODgwMDAvNjIuNTsKLQl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8vIHdyaXRlIDB4MWVkOAorCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCiAJaWYgKDB4MWVkOCA9PSB0ZWE1NzU3X3JlYWQoYnR2KSkgewogCQlwcmludGsoImJ0dHYlZDogVGVycmF0ZWMgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgZm91bmQuXG4iLAogCQkgICAgICAgYnR2LT5jLm5yKTsKQEAgLTMwNzMsNyArMzI1Myw3IEBACiAJICAgICAgIGNhc2UgMHgwMDYwOgogCSAgICAgICBjYXNlIDB4MDA3MDoKIAkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkyeDA7Ci0JCSAgICAgICAvL2VuYWJsZSBvdXRwdXQgb24gc2VsZWN0IGNvbnRyb2wgbGluZXMKKwkJICAgICAgIC8qIGVuYWJsZSBvdXRwdXQgb24gc2VsZWN0IGNvbnRyb2wgbGluZXMgKi8KIAkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwogCQkgICAgICAgYnJlYWs7CiAJICAgICAgIGRlZmF1bHQ6CkBAIC0zMTA1LDcgKzMyODUsNyBAQAogICAgICAgICBUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLAogCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCiAJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKLSAgICAgICAgVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfNDAxMkZZNSwgLy9UVU5FUl9URU1JQ19TRUNBTQorICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvKiBUVU5FUl9URU1JQ19TRUNBTSAqLwogICAgICAgICBUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ19QQUx9OwogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQpAQCAtMzEyNiw3ICszMzA2LDcgQEAKIAogCWlmICh0dW5lcl9tYWtlID09IDQpCiAJCWlmKHR1bmVyX2Zvcm1hdCA9PSAweDA5KQotCQkJdHVuZXIgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDOyAvLyBUQVBDLUc3MDJQCisJCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8qIFRBUEMtRzcwMlAgKi8KIAogCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogQXZlcm1lZGlhIGVlcHJvbVsweCUwMnglMDJ4XTogdHVuZXI9IiwKIAkJYnR2LT5jLm5yLGVlcHJvbV9kYXRhWzB4NDFdLGVlcHJvbV9kYXRhWzB4NDJdKTsKQEAgLTMxNDMsNyArMzMyMyw3IEBACiAvKiB1c2VkIG9uIFZvb2RvbyBUVi9GTSAoVm9vZG9vIDIwMCksIFMwIHdpcmVkIHRvIDB4MTAwMDAgKi8KIHZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pCiB7Ci0JLy8gZml4IHVwIG91ciBjYXJkIGVudHJ5CisJLyogZml4IHVwIG91ciBjYXJkIGVudHJ5ICovCiAJaWYobm9ybT09VklERU9fTU9ERV9OVFNDKSB7CiAJCWJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk1N2ZmZjsKIAkJYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzRdPTB4OTU3ZmZmOwpAQCAtMzE1NCw3ICszMzM0LDcgQEAKICAgICAgICAgICAgICAgICBidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NDdmZmY7CiAJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIFBBTFxuIik7CiAJfQotCS8vIHNldCBHUElPIGFjY29yZGluZworCS8qIHNldCBHUElPIGFjY29yZGluZyAqLwogCWdwaW9fYml0cyhidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrLAogCQkgIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbYnR2LT5hdWRpb10pOwogfQpAQCAtMzQ0Nyw3ICszNjI3LDcgQEAKIAl1ZGVsYXkoMTApOwogCXRpbWVvdXQ9IGppZmZpZXMgKyBIWjsKIAotCS8vIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QKKwkvKiB3YWl0IGZvciBEQVRBIGxpbmUgdG8gZ28gbG93OyBlcnJvciBpZiBpdCBkb2Vzbid0ICovCiAJd2hpbGUgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQogCQlzY2hlZHVsZSgpOwogCWlmIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSkgewpAQCAtMzU3NCw4ICszNzU0LDggQEAKIAkJCWNvbiA9IDB4MzAwOwogCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKIAkJCWNvbiA9IDB4MjAwOwotLy8JCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKLS8vCQkJY29uID0gMHgxMDA7CisvKgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQorICoJCQljb24gPSAweDEwMDsgKi8KIAkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOwogCX0gZWxzZSB7CiAJCXYtPm1vZGUgPSBWSURFT19TT1VORF9TVEVSRU8gfApAQCAtMzcxOCw3ICszODk4LDcgQEAKICAgICAgICAgfQogfQogCi0vLyBUREE5ODIxIG9uIFRlcnJhVFYrIEJ0ODQ4LCBCdDg3OAorLyogVERBOTgyMSBvbiBUZXJyYVRWKyBCdDg0OCwgQnQ4NzggKi8KIHN0YXRpYyB2b2lkCiB0ZXJyYXR2X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKIHsKQEAgLTM4MTgsNyArMzk5OCw3IEBACiAJCX0KIAkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQogCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7Ci0JCQl2YWwgPSAweDEwODA7IC8vLWRrLT8/PzogMHgwODgwLCAweDAwODAsIDB4MTgwMCAuLi4KKwkJCXZhbCA9IDB4MTA4MDsgLyotZGstPz8/OiAweDA4ODAsIDB4MDA4MCwgMHgxODAwIC4uLiAqLwogCQl9CiAJCWlmICh2YWwgIT0gMHhmZmZmKSB7CiAJCQlncGlvX2JpdHMoMHgxODAwLCB2YWwpOwpAQCAtMzg2OSwxMCArNDA0OSwxMCBAQAogewogCXVuc2lnbmVkIGludCBjb24gPSAweGZmZmZmZjsKIAotCS8vYnRhb3IoMHgxZTAwMDAsIH4weDFlMDAwMCwgQlQ4NDhfR1BJT19PVVRfRU4pOworCS8qIGJ0YW9yKDB4MWUwMDAwLCB+MHgxZTAwMDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsgKi8KIAogCWlmIChzZXQpIHsKLQkJLy9idG9yKCoqKiwgQlQ4NDhfR1BJT19PVVRfRU4pOworCQkvKiBidG9yKCoqKiwgQlQ4NDhfR1BJT19PVVRfRU4pOyAqLwogCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQogCQkJY29uID0gMHgwMDAwMDAwMDsKIAkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKQEAgLTQwNzksMTQgKzQyNTksMTQgQEAKIAltYXN0ZXJbYnR2LT5jLm5yKzJdID0gYnR2OwogfQogCi0vLyBUaGUgR3JhbmR0ZWMgWC1HdWFyZCBmcmFtZWdyYWJiZXIgY2FyZCB1c2VzIHR3byBEdWFsIDQtY2hhbm5lbAotLy8gdmlkZW8gbXVsdGlwbGV4ZXJzIHRvIHByb3ZpZGUgdXAgdG8gMTYgdmlkZW8gaW5wdXRzLiBUaGVzZQotLy8gbXVsdGlwbGV4ZXJzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBsb3dlciA4IEdQSU8gcGlucyBvZiB0aGUKLS8vIGJ0ODc4LiBUaGUgbXVsdGlwbGV4ZXJzIHByb2JhYmx5IFBlcmljb20gUEk1VjMzMVEgb3Igc2ltaWxhci4KKy8qIFRoZSBHcmFuZHRlYyBYLUd1YXJkIGZyYW1lZ3JhYmJlciBjYXJkIHVzZXMgdHdvIER1YWwgNC1jaGFubmVsCisgKiB2aWRlbyBtdWx0aXBsZXhlcnMgdG8gcHJvdmlkZSB1cCB0byAxNiB2aWRlbyBpbnB1dHMuIFRoZXNlCisgKiBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQorICogYnQ4NzguIFRoZSBtdWx0aXBsZXhlcnMgcHJvYmFibHkgUGVyaWNvbSBQSTVWMzMxUSBvciBzaW1pbGFyLgogCi0vLyB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCi0vLyB5eXkxIGlzIHBpbiB5eXkgb2YgbXVsdGlwbGV4ZXIgVTIKLQorICogeHh4MCBpcyBwaW4geHh4IG9mIG11bHRpcGxleGVyIFU1LAorICogeXl5MSBpcyBwaW4geXl5IG9mIG11bHRpcGxleGVyIFUyCisgKi8KICNkZWZpbmUgRU5BMCAgICAweDAxCiAjZGVmaW5lIEVOQjAgICAgMHgwMgogI2RlZmluZSBFTkExICAgIDB4MDQKQEAgLTQxNTcsMTQgKzQzMzcsMTQgQEAKIAogc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCiB7Ci0JLy8gU2ltcGxlIG1hdGhzCisJLyogU2ltcGxlIG1hdGhzICovCiAJaW50IGtleSA9IGlucHV0ICUgNDsKIAlpbnQgbWF0cml4ID0gaW5wdXQgLyA0OwogCiAJZHByaW50aygiYnR0diVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAogCQlidHYtPmMubnIsIGlucHV0LCBtYXRyaXgsIGtleSk7CiAKLQkvLyBIYW5kbGVzIHRoZSBpbnB1dCBzZWxlY3Rpb24gb24gdGhlIFREQTg1NDAncworCS8qIEhhbmRsZXMgdGhlIGlucHV0IHNlbGVjdGlvbiBvbiB0aGUgVERBODU0MCdzICovCiAJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDAsCiAJCSAgICAgICgobWF0cml4ID09IDMpID8gKGtleSB8IGtleSA8PCAyKSA6IDB4MDApLCAxKTsKIAlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMCwKQEAgLTQxNzQsMTcgKzQzNTQsMTcgQEAKIAlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMCwKIAkJICAgICAgKChtYXRyaXggPT0gMikgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwogCi0JLy8gSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncworCS8qIEhhbmRsZXMgdGhlIG91dHB1dCBlbmFibGVzIG9uIHRoZSBUREE4NTQwJ3MgKi8KIAlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMiwKLQkJICAgICAgKChtYXRyaXggPT0gMykgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gMTMgLSAxNgorCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiAxMyAtIDE2ICovCiAJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDIsCi0JCSAgICAgICgobWF0cml4ID09IDApID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDEtNAorCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiAxLTQgKi8KIAlidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMiwKLQkJICAgICAgKChtYXRyaXggPT0gMSkgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gNS04CisJCSAgICAgICgobWF0cml4ID09IDEpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDUtOCAqLwogCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAyLAotCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyA5LTEyCisJCSAgICAgICgobWF0cml4ID09IDIpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDktMTIgKi8KIAotCS8vIFNlbGVjdHMgTVVYMCBmb3IgaW5wdXQgb24gdGhlIDg3OAorCS8qIFNlbGVjdHMgTVVYMCBmb3IgaW5wdXQgb24gdGhlIDg3OCAqLwogCWJ0YW9yKCgwKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKaW5kZXggMDg3ZWZiNC4uYTU2NDMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2LWRyaXZlci5jLHYgMS41MiAyMDA1LzA4LzA0IDAwOjU1OjE2IG1jaGVoYWIgRXhwICQKIAogICAgIGJ0dHYgLSBCdDg0OCBmcmFtZSBncmFiYmVyIGRyaXZlcgogCkBAIC00Miw2ICs0MSw5IEBACiAKICNpbmNsdWRlICJidHR2cC5oIgogCisjaW5jbHVkZSAicmRzLmgiCisKKwogdW5zaWduZWQgaW50IGJ0dHZfbnVtOwkJCS8qIG51bWJlciBvZiBCdDg0OHMgaW4gdXNlICovCiBzdHJ1Y3QgYnR0diBidHR2c1tCVFRWX01BWF07CiAKQEAgLTMxMjgsMTUgKzMxMzAsMTIgQEAKIAogCWRwcmludGsoImJ0dHYlZDogb3BlbiBjYWxsZWQgKHJhZGlvKVxuIixidHYtPmMubnIpOwogCWRvd24oJmJ0di0+bG9jayk7Ci0JaWYgKGJ0di0+cmFkaW9fdXNlcikgewotCQl1cCgmYnR2LT5sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisKIAlidHYtPnJhZGlvX3VzZXIrKzsKKwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ0djsKIAotCWkyY192aWRpb2NzY2hhbihidHYpOwotICAgICAgICBidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LEFVRENfU0VUX1JBRElPLCZidHYtPnR1bmVyX3R5cGUpOworCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsQVVEQ19TRVRfUkFESU8sJmJ0di0+dHVuZXJfdHlwZSk7CiAJYXVkaW9fbXV4KGJ0dixBVURJT19SQURJTyk7CiAKIAl1cCgmYnR2LT5sb2NrKTsKQEAgLTMxNDUsOSArMzE0NCwxMyBAQAogCiBzdGF0aWMgaW50IHJhZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGJ0dHYgICAgKmJ0diA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYnR0diAgICAgICAgKmJ0diA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcmRzX2NvbW1hbmQgY21kOwogCiAJYnR2LT5yYWRpb191c2VyLS07CisKKwlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBSRFNfQ01EX0NMT1NFLCAmY21kKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zMjAzLDEzICszMjA2LDQyIEBACiAJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcmFkaW9fZG9faW9jdGwpOwogfQogCitzdGF0aWMgc3NpemVfdCByYWRpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYnR0diAgICAqYnR2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCByZHNfY29tbWFuZCBjbWQ7CisJY21kLmJsb2NrX2NvdW50ID0gY291bnQvMzsKKwljbWQuYnVmZmVyID0gZGF0YTsKKwljbWQuaW5zdGFuY2UgPSBmaWxlOworCWNtZC5yZXN1bHQgPSAtRU5PREVWOworCisJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgUkRTX0NNRF9SRUFELCAmY21kKTsKKworCXJldHVybiBjbWQucmVzdWx0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGJ0dHYgICAgKmJ0diA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcmRzX2NvbW1hbmQgY21kOworCWNtZC5pbnN0YW5jZSA9IGZpbGU7CisJY21kLmV2ZW50X2xpc3QgPSB3YWl0OworCWNtZC5yZXN1bHQgPSAtRU5PREVWOworCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFJEU19DTURfUE9MTCwgJmNtZCk7CisKKwlyZXR1cm4gY21kLnJlc3VsdDsKK30KKwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmFkaW9fZm9wcyA9CiB7CiAJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKIAkub3BlbgkgID0gcmFkaW9fb3BlbiwKKwkucmVhZCAgICAgPSByYWRpb19yZWFkLAogCS5yZWxlYXNlICA9IHJhZGlvX3JlbGVhc2UsCiAJLmlvY3RsCSAgPSByYWRpb19pb2N0bCwKIAkubGxzZWVrCSAgPSBub19sbHNlZWssCisJLnBvbGwgICAgID0gcmFkaW9fcG9sbCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHJhZGlvX3RlbXBsYXRlID0KQEAgLTQwNDcsNiArNDA3OSw3IEBACiAJc3RydWN0IGJ0dHZfYnVmZmVyX3NldCBpZGxlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlkcHJpbnRrKCJidHR2JWQ6IHN1c3BlbmQgJWRcbiIsIGJ0di0+Yy5uciwgc3RhdGUuZXZlbnQpOwogCiAJLyogc3RvcCBkbWEgKyBpcnFzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKQEAgLTQwNzksMTUgKzQxMTIsMjkgQEAKIHsKICAgICAgICAgc3RydWN0IGJ0dHYgKmJ0diA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CiAKIAlkcHJpbnRrKCJidHR2JWQ6IHJlc3VtZVxuIiwgYnR2LT5jLm5yKTsKIAogCS8qIHJlc3RvcmUgcGNpIHN0YXRlICovCiAJaWYgKGJ0di0+c3RhdGUuZGlzYWJsZWQpIHsKLQkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWVycj1wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBDYW4ndCBlbmFibGUgZGV2aWNlLlxuIiwKKwkJCQkJCQkJYnR2LT5jLm5yKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAkJYnR2LT5zdGF0ZS5kaXNhYmxlZCA9IDA7CiAJfQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwllcnI9cGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCWlmIChlcnIpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IENhbid0IGVuYWJsZSBkZXZpY2UuXG4iLAorCQkJCQkJCWJ0di0+Yy5ucik7CisJCWJ0di0+c3RhdGUuZGlzYWJsZWQgPSAxOworCQlyZXR1cm4gZXJyOworCX0KKwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwogCiAJLyogcmVzdG9yZSBidDg3OCBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1ncGlvLmMKaW5kZXggNzczMjBjZC4uNmIyODBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGJ0dHYtZ3Bpby5jLHYgMS43IDIwMDUvMDIvMTYgMTI6MTQ6MTAga3JheGVsIEV4cCAkCiAKICAgICBidHR2LWdwaW8uYyAgLS0gIGdwaW8gc3ViIGRyaXZlcnMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCmluZGV4IDcwNmRjNDguLmU2ODRkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICAgICRJZDogYnR0di1pMmMuYyx2IDEuMjUgMjAwNS8wNy8wNSAxNzozNzozNSBuc2ggRXhwICQKIAogICAgIGJ0dHYtaTJjLmMgIC0tICBhbGwgdGhlIGkyYyBjb2RlIGlzIGhlcmUKIApAQCAtMzgxLDYgKzM4MCw3IEBACiB9CiAKIHN0YXRpYyBjaGFyICppMmNfZGV2c1sxMjhdID0geworCVsgMHgxYyA+PiAxIF0gPSAibGdkdDMzMHgiLAogCVsgMHgzMCA+PiAxIF0gPSAiSVIgKGhhdXBwYXVnZSkiLAogCVsgMHg4MCA+PiAxIF0gPSAibXNwMzR4eCIsCiAJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKaW5kZXggZjdiNTU0My4uZThhYWRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlmLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICAgICRJZDogYnR0di1pZi5jLHYgMS40IDIwMDQvMTEvMTcgMTg6NDc6NDcga3JheGVsIEV4cCAkCiAKICAgICBidHR2LWlmLmMgIC0tICBvbGQgZ3BpbyBpbnRlcmZhY2UgdG8gb3RoZXIga2VybmVsIG1vZHVsZXMKICAgICAgICAgICAgICAgICAgICBkb24ndCB1c2UgaW4gbmV3IGNvZGUsIHdpbGwgZ28gYXdheSBpbiAyLjcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jCmluZGV4IDllZDIxZmQuLmE1ZWQ5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2LXJpc2MuYyx2IDEuMTAgMjAwNC8xMS8xOSAxODowNzoxMiBrcmF4ZWwgRXhwICQKIAogICAgIGJ0dHYtcmlzYy5jICAtLSAgaW50ZXJmYWNlcyB0byBvdGhlciBrZXJuZWwgbW9kdWxlcwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtdmJpLmMKaW5kZXggMDZmM2U2Mi4uZjRmNThjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di12YmkuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2LXZiaS5jLHYgMS45IDIwMDUvMDEvMTMgMTc6MjI6MzMga3JheGVsIEV4cCAkCiAKICAgICBidHR2IC0gQnQ4NDggZnJhbWUgZ3JhYmJlciBkcml2ZXIKICAgICB2YmkgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCmluZGV4IGYyYWY5ZTEuLmQyNTRlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogYnR0di5oLHYgMS4yMiAyMDA1LzA3LzI4IDE4OjQxOjIxIG1jaGVoYWIgRXhwICQKICAqCiAgKiAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCiAgKgpAQCAtMjE4LDYgKzIxNyw4IEBACiAjZGVmaW5lIFBMTF8zNSAgIDIKIAogCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCB0dW5lcl9hZGRyOworCiAJdW5zaWduZWQgaW50IGhhc19yYWRpbzsKIAl2b2lkICgqYXVkaW9faG9vaykoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKIAl2b2lkICgqbXV4c2VsX2hvb2spKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmgKaW5kZXggYWFiMDk0Yi4uOWIwYjdjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2cC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBidHR2cC5oLHYgMS4yMSAyMDA1LzA3LzE1IDIxOjQ0OjE0IG1jaGVoYWIgRXhwICQKIAogICAgIGJ0dHYgLSBCdDg0OCBmcmFtZSBncmFiYmVyIGRyaXZlcgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKaW5kZXggY2RkYTQyMy4uOTc3NGU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV91c2IuYwpAQCAtNDQ1LDEwICs0NDUsOCBAQAogCQl1Y3BpYS0+c2J1ZlsxXS51cmIgPSBOVUxMOwogCX0KIAotCWlmICh1Y3BpYS0+c2J1ZlsxXS5kYXRhKSB7Ci0JCWtmcmVlKHVjcGlhLT5zYnVmWzFdLmRhdGEpOwotCQl1Y3BpYS0+c2J1ZlsxXS5kYXRhID0gTlVMTDsKLQl9CisJa2ZyZWUodWNwaWEtPnNidWZbMV0uZGF0YSk7CisJdWNwaWEtPnNidWZbMV0uZGF0YSA9IE5VTEw7CiAgCiAJaWYgKHVjcGlhLT5zYnVmWzBdLnVyYikgewogCQl1c2Jfa2lsbF91cmIodWNwaWEtPnNidWZbMF0udXJiKTsKQEAgLTQ1NiwxMCArNDU0LDggQEAKIAkJdWNwaWEtPnNidWZbMF0udXJiID0gTlVMTDsKIAl9CiAKLQlpZiAodWNwaWEtPnNidWZbMF0uZGF0YSkgewotCQlrZnJlZSh1Y3BpYS0+c2J1ZlswXS5kYXRhKTsKLQkJdWNwaWEtPnNidWZbMF0uZGF0YSA9IE5VTEw7Ci0JfQorCWtmcmVlKHVjcGlhLT5zYnVmWzBdLmRhdGEpOworCXVjcGlhLT5zYnVmWzBdLmRhdGEgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IGNwaWFfdXNiX2Nsb3NlKHZvaWQgKnByaXZkYXRhKQpAQCAtNjIzLDIwICs2MTksMTQgQEAKIAogCXVjcGlhLT5jdXJidWZmID0gdWNwaWEtPndvcmtidWZmID0gTlVMTDsKIAotCWlmICh1Y3BpYS0+YnVmZmVyc1syXSkgewotCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1syXSk7Ci0JCXVjcGlhLT5idWZmZXJzWzJdID0gTlVMTDsKLQl9CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMl0pOworCXVjcGlhLT5idWZmZXJzWzJdID0gTlVMTDsKIAotCWlmICh1Y3BpYS0+YnVmZmVyc1sxXSkgewotCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1sxXSk7Ci0JCXVjcGlhLT5idWZmZXJzWzFdID0gTlVMTDsKLQl9CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMV0pOworCXVjcGlhLT5idWZmZXJzWzFdID0gTlVMTDsKIAotCWlmICh1Y3BpYS0+YnVmZmVyc1swXSkgewotCQl2ZnJlZSh1Y3BpYS0+YnVmZmVyc1swXSk7Ci0JCXVjcGlhLT5idWZmZXJzWzBdID0gTlVMTDsKLQl9CisJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMF0pOworCXVjcGlhLT5idWZmZXJzWzBdID0gTlVMTDsKIAogCWNhbS0+bG93bGV2ZWxfZGF0YSA9IE5VTEw7CiAJa2ZyZWUodWNwaWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwppbmRleCA0ZjM5Njg4Li4wYzBjNTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtYmxhY2tiaXJkLmMsdiAxLjI3IDIwMDUvMDYvMDMgMTM6MzE6NTAgbWNoZWhhYiBFeHAgJAogICoKICAqICBTdXBwb3J0IGZvciBhIGN4MjM0MTYgbXBlZyBlbmNvZGVyIHZpYSBjeDIzODh4IGhvc3QgcG9ydC4KICAqICAiYmxhY2tiaXJkIiByZWZlcmVuY2UgZGVzaWduLgpAQCAtNjIsNyArNjEsNiBAQAogI2RlZmluZSBJVlRWX0NNRF9IV19CTE9DS1NfUlNUIDB4RkZGRkZGRkYKIAogLyogRmlybXdhcmUgQVBJIGNvbW1hbmRzICovCi0vKiAjZGVmaW5lIElWVFZfQVBJX1NURF9USU1FT1VUIDB4MDAwMTAwMDAgLy8gNjU1MzYsIHVuaXRzPz8gKi8KICNkZWZpbmUgSVZUVl9BUElfU1REX1RJTUVPVVQgNTAwCiAKICNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9QSU5HICAgICAgICAgICAgICAgMHg4MApAQCAtNjk2LDcgKzY5NCw2IEBACiAKIAkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KIAlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1NUUkVBTV9UWVBFLCAxLCAwLCBCTEFDS0JJUkRfU1RSRUFNX1BST0dSQU0pOwotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUsIDEsIDAsIEJMQUNLQklSRF9TVFJFQU1fVFJBTlNQT1JUKTsgKi8KIAogCS8qIGFzc2lnbiBvdXRwdXQgcG9ydCAqLwogCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfT1VUUFVUX1BPUlQsIDEsIDAsIEJMQUNLQklSRF9PVVRQVVRfUE9SVF9TVFJFQU1JTkcpOyAvKiBIb3N0ICovCkBAIC04MjQsNyArODIxLDggQEAKIAkJCUJMQUNLQklSRF9DVVNUT01fRVhURU5TSU9OX1VTUl9EQVRBLAogCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCwgMCwgMCk7IC8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGlucHV0ICovCisJLyogaW5pdGlhbGl6ZSB0aGUgdmlkZW8gaW5wdXQgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCwgMCwgMCk7CiAKIAltc2xlZXAoMSk7CiAKQEAgLTgzMywxMSArODMxLDEyIEBACiAJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX01VVEVfQVVESU8sIDEsIDAsIEJMQUNLQklSRF9VTk1VVEUpOwogCW1zbGVlcCgxKTsKIAotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFLCAyLCAwLCAwLCAweDEzKTsgLy8gc3RhcnQgY2FwdHVyaW5nIHRvIHRoZSBob3N0IGludGVyZmFjZSAqLworCS8qIHN0YXJ0IGNhcHR1cmluZyB0byB0aGUgaG9zdCBpbnRlcmZhY2UgKi8KKwkvKiBibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfQkVHSU5fQ0FQVFVSRSwgMiwgMCwgMCwgMHgxMyk7ICovCiAJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX0JFR0lOX0NBUFRVUkUsIDIsIDAsCiAJCQlCTEFDS0JJUkRfTVBFR19DQVBUVVJFLAogCQkJQkxBQ0tCSVJEX1JBV19CSVRTX05PTkUKLQkJKTsgLyogc3RhcnQgY2FwdHVyaW5nIHRvIHRoZSBob3N0IGludGVyZmFjZSAqLworCQkpOwogCW1zbGVlcCgxMCk7CiAKIAlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfUkVGUkVTSF9JTlBVVCwgMCwwKTsKQEAgLTg1MSw4ICs4NTAsOCBAQAogewogCXN0cnVjdCBjeDg4MDJfZmggKmZoID0gcS0+cHJpdl9kYXRhOwogCi0JZmgtPmRldi0+dHNfcGFja2V0X3NpemUgID0gNTEyOwotCWZoLT5kZXYtPnRzX3BhY2tldF9jb3VudCA9IDEwMDsKKwlmaC0+ZGV2LT50c19wYWNrZXRfc2l6ZSAgPSAxODggKiA0OyAvKiB3YXM6IDUxMiAqLworCWZoLT5kZXYtPnRzX3BhY2tldF9jb3VudCA9IDMyOyAvKiB3YXM6IDEwMCAqLwogCiAJKnNpemUgPSBmaC0+ZGV2LT50c19wYWNrZXRfc2l6ZSAqIGZoLT5kZXYtPnRzX3BhY2tldF9jb3VudDsKIAlpZiAoMCA9PSAqY291bnQpCkBAIC05MDAsMTIgKzg5OSwzNiBAQAogewogCXN0cnVjdCBjeDg4MDJfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGN4ODhfY29yZSAgKmNvcmUgPSBkZXYtPmNvcmU7CiAKIAlpZiAoZGVidWcgPiAxKQotCQljeDg4X3ByaW50X2lvY3RsKGRldi0+Y29yZS0+bmFtZSxjbWQpOworCQljeDg4X3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKKwkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOworCisJCW1lbXNldChjYXAsMCxzaXplb2YoKmNhcCkpOworCQlzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDg4X2JsYWNrYmlyZCIpOworCQlzdHJsY3B5KGNhcC0+Y2FyZCwgY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUsc2l6ZW9mKGNhcC0+Y2FyZCkpOworCQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIscGNpX25hbWUoZGV2LT5wY2kpKTsKKwkJY2FwLT52ZXJzaW9uID0gQ1g4OF9WRVJTSU9OX0NPREU7CisJCWNhcC0+Y2FwYWJpbGl0aWVzID0KKwkJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CisJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKKwkJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFICAgfAorCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSB8CisJCQkwOworCQlpZiAoVU5TRVQgIT0gY29yZS0+dHVuZXJfdHlwZSkKKwkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCisJCXJldHVybiAwOworCX0KKwogCS8qIC0tLSBjYXB0dXJlIGlvY3RscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CiAJewpAQCAtOTM1LDcgKzk1OCwxMSBAQAogCQlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGRldi0+d2lkdGg7CiAJCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gZGV2LT5oZWlnaHQ7CiAJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX01QRUc7Ci0JCWYtPmZtdC5waXguc2l6ZWltYWdlICAgID0gMTAyNCAqIDUxMiAvKiBGSVhNRTogQlVGRkVSX1NJWkUgKi87CisJCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gVjRMMl9GSUVMRF9OT05FOworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlICAgID0gMTg4ICogNCAqIDEwMjQ7IC8qIDEwMjQgKiA1MTIgKi8gLyogRklYTUU6IEJVRkZFUl9TSVpFICovOworCQlmLT5mbXQucGl4LmNvbG9yc3BhY2UgICA9IDA7CisJCXJldHVybiAwOwogCX0KIAogCS8qIC0tLSBzdHJlYW1pbmcgY2FwdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC05NTksMTUgKzk4NiwyNSBAQAogCQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+bXBlZ3EpOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBjeDg4X2RvX2lvY3RsKCBpbm9kZSwgZmlsZSwgMCwgZGV2LT5jb3JlLCBjbWQsIGFyZywgY3g4OF9pb2N0bF9ob29rICk7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1wZWdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCAoKmN4ODhfaW9jdGxfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwordW5zaWduZWQgaW50ICgqY3g4OF9pb2N0bF90cmFuc2xhdG9yKSh1bnNpZ25lZCBpbnQgY21kKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtcGVnX3RyYW5zbGF0ZV9pb2N0bCh1bnNpZ25lZCBpbnQgY21kKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIG1wZWdfZG9faW9jdGwpOworCXJldHVybiBjbWQ7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNtZCA9IGN4ODhfaW9jdGxfdHJhbnNsYXRvciggY21kICk7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgY3g4OF9pb2N0bF9ob29rKTsKIH0KIAogc3RhdGljIGludCBtcGVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xMTM1LDcgKzExNzIsNyBAQAogCWRldi0+cGNpID0gcGNpX2RldjsKIAlkZXYtPmNvcmUgPSBjb3JlOwogCWRldi0+d2lkdGggPSA3MjA7Ci0JZGV2LT5oZWlnaHQgPSA0ODA7CisJZGV2LT5oZWlnaHQgPSA1NzY7CiAKIAllcnIgPSBjeDg4MDJfaW5pdF9jb21tb24oZGV2KTsKIAlpZiAoMCAhPSBlcnIpCkBAIC0xMTQ4LDYgKzExODUsOSBAQAogCiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCZjeDg4MDJfZGV2bGlzdCk7CiAJYmxhY2tiaXJkX3JlZ2lzdGVyX3ZpZGVvKGRldik7CisKKwkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uOiBuZWVkZWQgPyAqLworCiAJcmV0dXJuIDA7CiAKICBmYWlsX2ZyZWU6CkBAIC0xMjAyLDYgKzEyNDIsOCBAQAogCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCiAJICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7CiAjZW5kaWYKKwljeDg4X2lvY3RsX2hvb2sgPSBtcGVnX2RvX2lvY3RsOworCWN4ODhfaW9jdGxfdHJhbnNsYXRvciA9IG1wZWdfdHJhbnNsYXRlX2lvY3RsOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZibGFja2JpcmRfcGNpX2RyaXZlcik7CiB9CiAKQEAgLTEyMTMsNiArMTI1NSw5IEBACiBtb2R1bGVfaW5pdChibGFja2JpcmRfaW5pdCk7CiBtb2R1bGVfZXhpdChibGFja2JpcmRfZmluaSk7CiAKK0VYUE9SVF9TWU1CT0woY3g4OF9pb2N0bF9ob29rKTsKK0VYUE9SVF9TWU1CT0woY3g4OF9pb2N0bF90cmFuc2xhdG9yKTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCBlYmYwMmE3Li40ZGE5MWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LWNhcmRzLmMsdiAxLjkwIDIwMDUvMDcvMjggMDI6NDc6NDIgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiBjYXJkLXNwZWNpZmljIHN0dWZmLgpAQCAtNDk5LDkgKzQ5OCw2IEBACiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKICAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAotCQl9LHsKLQkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICA9IDIsCiAgICAgICAgICAgICAgICAgfX0sCiAJCS5kdmIgICAgICAgICAgICA9IDEsCiAJfSwKQEAgLTYxNCwxMiArNjEwLDEyIEBACiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKLQkJCS5ncGlvMCAgPSAweGVkMTIsICAvLyBpbnRlcm5hbCBkZWNvZGVyCisJCQkuZ3BpbzAgID0gMHhlZDEyLCAgLyogaW50ZXJuYWwgZGVjb2RlciAqLwogCQkJLmdwaW8yICA9IDB4MDBmZiwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RFQlVHLAogCQkJLnZtdXggICA9IDAsCi0JCQkuZ3BpbzAgID0gMHhmZjAxLCAgLy8gbW9ubyBmcm9tIHR1bmVyIGNoaXAKKwkJCS5ncGlvMCAgPSAweGZmMDEsICAvKiBtb25vIGZyb20gdHVuZXIgY2hpcCAqLwogCQl9LHsKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgPSAxLApAQCAtNzE1LDE5ICs3MTEsMTggQEAKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAotCQkvKiAgU2VlIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgZm9yIEdQSU8gZG9jdW1lbnRhdGlvbi4gICovCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMGQsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHg5N2VkLAogICAgICAgICAgICAgICAgIH0sewogICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4OTdlOSwKICAgICAgICAgICAgICAgICB9LHsKICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4OTdlOSwKICAgICAgICAgICAgICAgICB9fSwKIAkJLmR2YiAgICAgICAgICAgID0gMSwKICAgICAgICAgfSwKQEAgLTc2NSwyMCArNzYwLDIxIEBACiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKLQkJLyogIFNlZSBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1RIGZvciBHUElPIGRvY3VtZW50YXRpb24uICAqLworCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMGQsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHg4N2ZkLAogICAgICAgICAgICAgICAgIH0sewogICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4ODdmOSwKICAgICAgICAgICAgICAgICB9LHsKICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwZjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4ODdmOSwKICAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9ib2FyZHMpOwpAQCAtOTQ5LDcgKzk0NSw3IEBACiB7CiAJc3RydWN0IHR2ZWVwcm9tIHR2OwogCi0JdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKKwl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZjb3JlLT5pMmNfY2xpZW50LCAmdHYsIGVlcHJvbV9kYXRhKTsKIAljb3JlLT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKIAljb3JlLT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCmluZGV4IDVlODY4ZjUuLmRjNWM1YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LWNvcmUuYyx2IDEuMzMgMjAwNS8wNy8wNyAxNDoxNzo0NyBtY2hlaGFiIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIGRyaXZlciBjb3JlCkBAIC04NzYsNyArODc1LDcgQEAKIAogCWN4X2FuZG9yKE1PX0FGRUNGR19JTywgMHgxZiwgMHgwKTsKIAljeDg4X3NldF90dmF1ZGlvKGNvcmUpOwotCS8vIGN4ODhfc2V0X3N0ZXJlbyhkZXYsVjRMMl9UVU5FUl9NT0RFX1NURVJFTyk7CisJLyogY3g4OF9zZXRfc3RlcmVvKGRldixWNEwyX1RVTkVSX01PREVfU1RFUkVPKTsgKi8KIAogCWN4X3dyaXRlKE1PX0FVRERfTE5HVEgsICAgIDEyOCk7IC8qIGZpZm8gc2l6ZSAqLwogCWN4X3dyaXRlKE1PX0FVRFJfTE5HVEgsICAgIDEyOCk7IC8qIGZpZm8gc2l6ZSAqLwpAQCAtMTA4NywxMCArMTA4NiwxNyBAQAogCWNvcmUtPnBjaV9idXMgID0gcGNpLT5idXMtPm51bWJlcjsKIAljb3JlLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBjaS0+ZGV2Zm4pOwogCWNvcmUtPnBjaV9pcnFtYXNrID0gMHgwMGZjMDA7CisJaW5pdF9NVVRFWCgmY29yZS0+bG9jayk7CiAKIAljb3JlLT5uciA9IGN4ODhfZGV2Y291bnQrKzsKIAlzcHJpbnRmKGNvcmUtPm5hbWUsImN4ODhbJWRdIixjb3JlLT5ucik7CiAJaWYgKDAgIT0gZ2V0X3Jlc3NvdXJjZXMoY29yZSxwY2kpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ09SRSAlcyBObyBtb3JlIFBDSSByZXNzb3VyY2VzIGZvciAiCisJCQkic3Vic3lzdGVtOiAlMDR4OiUwNHgsIGJvYXJkOiAlc1xuIiwKKwkJCWNvcmUtPm5hbWUscGNpLT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJcGNpLT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkJY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUpOworCiAJCWN4ODhfZGV2Y291bnQtLTsKIAkJZ290byBmYWlsX2ZyZWU7CiAJfQpAQCAtMTExNCwxMSArMTEyMCwxMSBAQAogCQljb3JlLT5ib2FyZCA9IENYODhfQk9BUkRfVU5LTk9XTjsKIAkJY3g4OF9jYXJkX2xpc3QoY29yZSxwY2kpOwogCX0KLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN1YnN5c3RlbTogJTA0eDolMDR4LCBib2FyZDogJXMgW2NhcmQ9JWQsJXNdXG4iLAotCSAgICAgICBjb3JlLT5uYW1lLHBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKLQkgICAgICAgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlLGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5uYW1lLAotCSAgICAgICBjb3JlLT5ib2FyZCwgY2FyZFtjb3JlLT5ucl0gPT0gY29yZS0+Ym9hcmQgPwotCSAgICAgICAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ09SRSAlczogc3Vic3lzdGVtOiAlMDR4OiUwNHgsIGJvYXJkOiAlcyBbY2FyZD0lZCwlc11cbiIsCisJCWNvcmUtPm5hbWUscGNpLT5zdWJzeXN0ZW1fdmVuZG9yLAorCQlwY2ktPnN1YnN5c3RlbV9kZXZpY2UsY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUsCisJCWNvcmUtPmJvYXJkLCBjYXJkW2NvcmUtPm5yXSA9PSBjb3JlLT5ib2FyZCA/CisJCSJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKIAogCWNvcmUtPnR1bmVyX3R5cGUgPSB0dW5lcltjb3JlLT5ucl07CiAJY29yZS0+cmFkaW9fdHlwZSA9IHJhZGlvW2NvcmUtPm5yXTsKQEAgLTEyMDIsNCArMTIwOCw1IEBACiAgKiBMb2NhbCB2YXJpYWJsZXM6CiAgKiBjLWJhc2ljLW9mZnNldDogOAogICogRW5kOgorICoga2F0ZTogZW9sICJ1bml4IjsgaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10cmFpbGluZy1zcGFjZS1zYXZlIG9uOyB0YWItd2lkdGggODsgcmVwbGFjZS10YWJzIG9mZjsgc3BhY2UtaW5kZW50IG9mZjsgbWl4ZWQtaW5kZW50IG9mZgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IDc4ZDIyMzIuLmM5MTA2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogY3g4OC1kdmIuYyx2IDEuNTggMjAwNS8wOC8wNyAwOToyNDowOCBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIE1QRUcgVHJhbnNwb3J0IFN0cmVhbSAoRFZCKSByb3V0aW5lcwpAQCAtMjksNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCiAKICNpbmNsdWRlICJjeDg4LmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgpAQCAtMjEwLDE2ICsyMDksMjYgQEAKIHN0YXRpYyBpbnQgbGdkdDMzMHhfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKIAkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKKwkvKiBGSVhNRSBtYWtlIHRoaXMgcm91dGluZSB1c2UgdGhlIHR1bmVyLXNpbXBsZSBjb2RlLgorCSAqIEl0IGNvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIGEgbnVtYmVyIG9mIEFUU0MKKwkgKiBmcm9udGVuZHMuIE1hbnkgc2hhcmUgdGhlIHNhbWUgdHVuZXIgd2l0aCBhbmFsb2cgVFYuICovCisKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAJdTggYnVmWzRdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9CiAJCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwogCWludCBlcnI7CiAKLQlkdmJfcGxsX2NvbmZpZ3VyZShkZXYtPmNvcmUtPnBsbF9kZXNjLCBidWYsIHBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKKwkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLworCWlmIChjb3JlLT50ZGE5ODg3X2NvbmYpIHsKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzIChkZXYtPmNvcmUsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKKwl9CisKKwlkdmJfcGxsX2NvbmZpZ3VyZShjb3JlLT5wbGxfZGVzYywgYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7CiAJZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCQkJX19GVU5DVElPTl9fLCBtc2cuYWRkciwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKLQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmZGV2LT5jb3JlLT5pMmNfYWRhcCwgJm1zZywgMSkpICE9IDEpIHsKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmY29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImN4ODgtZHZiOiAlcyBlcnJvciAiCiAJCQkgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCiAJCQkgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwpAQCAtMjI4LDYgKzIzNywxMyBAQAogCQllbHNlCiAJCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9CisJaWYgKGNvcmUtPnR1bmVyX3R5cGUgPT0gVFVORVJfTEdfVERWU19IMDYyRikgeworCQkvKiBTZXQgdGhlIEF1eGlsaWFyeSBCeXRlLiAqLworCQlidWZbMl0gJj0gfjB4MjA7CisJCWJ1ZlsyXSB8PSAweDE4OworCQlidWZbM10gPSAweDUwOworCQlpMmNfdHJhbnNmZXIoJmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MSw2ICsyNzcsMTQgQEAKIAkucGxsX3NldCAgICAgICAgICA9IGxnZHQzMzB4X3BsbF9zZXQsCiAJLnNldF90c19wYXJhbXMgICAgPSBsZ2R0MzMweF9zZXRfdHNfcGFyYW0sCiB9OworCitzdGF0aWMgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyBmdXNpb25oZHR2XzVfZ29sZCA9IHsKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGUsCisJLmRlbW9kX2NoaXAgICAgICAgPSBMR0RUMzMwMywKKwkuc2VyaWFsX21wZWcgICAgICA9IDB4NDAsIC8qIFRQU0VSSUFMIGZvciAzMzAzIGluIFRPUF9DT05UUk9MICovCisJLnBsbF9zZXQgICAgICAgICAgPSBsZ2R0MzMweF9wbGxfc2V0LAorCS5zZXRfdHNfcGFyYW1zICAgID0gbGdkdDMzMHhfc2V0X3RzX3BhcmFtLAorfTsKICNlbmRpZgogCiBzdGF0aWMgaW50IGR2Yl9yZWdpc3RlcihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQpAQCAtMzQ2LDYgKzM3MCwyMiBAQAogCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJfQogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTEQ6CisJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwODsKKwkJeworCQkvKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9mIGNoaXAgYmVmb3JlIHVzaW5nIGl0LiAqLworCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMSk7CisJCW1kZWxheSgxMDApOworCQljeF9zZXQoTU9fR1AwX0lPLCAxKTsKKwkJbWRlbGF5KDIwMCk7CisJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOworCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGR2c190dWE2MDM0OworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl81X2dvbGQsCisJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQl9CisJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKIAkJcHJpbnRrKCIlczogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iLApAQCAtMzYyLDExICs0MDIsNiBAQAogCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXggPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5tYXg7CiAJfQogCi0JLyogQ29weSB0aGUgYm9hcmQgbmFtZSBpbnRvIHRoZSBEVkIgc3RydWN0dXJlICovCi0Jc3RybGNweShkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLm5hbWUsCi0JCWN4ODhfYm9hcmRzW2Rldi0+Y29yZS0+Ym9hcmRdLm5hbWUsCi0JCXNpemVvZihkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLm5hbWUpKTsKLQogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KIAlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCmluZGV4IDdmNTk4MDMuLjc2MWNlYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAgICAkSWQ6IGN4ODgtaTJjLmMsdiAxLjMwIDIwMDUvMDcvMjUgMDU6MTA6MTMgbWtydWZreSBFeHAgJAogCiAgICAgY3g4OC1pMmMuYyAgLS0gIGFsbCB0aGUgaTJjIGNvZGUgaXMgaGVyZQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwppbmRleCAyMTQ4ODc3Li5kODFiMjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LWlucHV0LmMsdiAxLjE1IDIwMDUvMDcvMDcgMTM6NTg6MzggbWNoZWhhYiBFeHAgJAogICoKICAqIERldmljZSBkcml2ZXIgZm9yIEdQSU8gYXR0YWNoZWQgcmVtb3RlIGNvbnRyb2wgaW50ZXJmYWNlcwogICogb24gQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYvRFZCIGNhcmRzLgpAQCAtMjEyLDYgKzIxMSw1MyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKy8qIENpbmVyZ3kgMTQwMCBEVkItVCAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2NpbmVyZ3lfMTQwMFtJUl9LRVlUQUJfU0laRV0gPSB7CisJWzB4MDFdID0gS0VZX1BPV0VSLAorCVsweDAyXSA9IEtFWV8xLAorCVsweDAzXSA9IEtFWV8yLAorCVsweDA0XSA9IEtFWV8zLAorCVsweDA1XSA9IEtFWV80LAorCVsweDA2XSA9IEtFWV81LAorCVsweDA3XSA9IEtFWV82LAorCVsweDA4XSA9IEtFWV83LAorCVsweDA5XSA9IEtFWV84LAorCVsweDBhXSA9IEtFWV85LAorCVsweDBjXSA9IEtFWV8wLAorCisJWzB4MGJdID0gS0VZX1ZJREVPLAorCVsweDBkXSA9IEtFWV9SRUZSRVNILAorCVsweDBlXSA9IEtFWV9TRUxFQ1QsCisJWzB4MGZdID0gS0VZX0VQRywKKwlbMHgxMF0gPSBLRVlfVVAsCisJWzB4MTFdID0gS0VZX0xFRlQsCisJWzB4MTJdID0gS0VZX09LLAorCVsweDEzXSA9IEtFWV9SSUdIVCwKKwlbMHgxNF0gPSBLRVlfRE9XTiwKKwlbMHgxNV0gPSBLRVlfVEVYVCwKKwlbMHgxNl0gPSBLRVlfSU5GTywKKworCVsweDE3XSA9IEtFWV9SRUQsCisJWzB4MThdID0gS0VZX0dSRUVOLAorCVsweDE5XSA9IEtFWV9ZRUxMT1csCisJWzB4MWFdID0gS0VZX0JMVUUsCisKKwlbMHgxYl0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDFjXSA9IEtFWV9WT0xVTUVVUCwKKwlbMHgxZF0gPSBLRVlfTVVURSwKKwlbMHgxZV0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbMHgxZl0gPSBLRVlfQ0hBTk5FTERPV04sCisKKwlbMHg0MF0gPSBLRVlfUEFVU0UsCisJWzB4NGNdID0gS0VZX1BMQVksCisJWzB4NThdID0gS0VZX1JFQ09SRCwKKwlbMHg1NF0gPSBLRVlfUFJFVklPVVMsCisJWzB4NDhdID0gS0VZX1NUT1AsCisJWzB4NWNdID0gS0VZX05FWFQsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIHN0cnVjdCBjeDg4X0lSIHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlOwogCXN0cnVjdCBpbnB1dF9kZXYgaW5wdXQ7CkBAIC0yNDEsNyArMjg3LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaXJfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSXSIpOwogCiAjZGVmaW5lIGlyX2RwcmludGsoZm10LCBhcmcuLi4pCWlmIChpcl9kZWJ1ZykgXAotCXByaW50ayhLRVJOX0RFQlVHICIlcyBJUjogIiBmbXQgLCBpci0+Y29yZS0+bmFtZSwgIyMgYXJnKQorCXByaW50ayhLRVJOX0RFQlVHICIlcyBJUjogIiBmbXQgLCBpci0+Y29yZS0+bmFtZSAsICMjYXJnKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTMyOSw2ICszNzUsMTEgQEAKIAkJaXItPm1hc2tfa2V5dXAgPSAweDYwOwogCQlpci0+cG9sbGluZyA9IDUwOyAvKiBtcyAqLwogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMToKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc19jaW5lcmd5XzE0MDA7CisJCWlyX3R5cGUgPSBJUl9UWVBFX1BEOworCQlpci0+c2FtcGxpbmcgPSAxOworCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgogCQlpcl9jb2RlcyA9IGlyX2NvZGVzX2hhdXBwYXVnZV9uZXc7CkBAIC0zOTQsNiArNDQ1LDcgQEAKIAkJaXItPmlucHV0LmlkLnZlbmRvciA9IHBjaS0+dmVuZG9yOwogCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHBjaS0+ZGV2aWNlOwogCX0KKwlpci0+aW5wdXQuZGV2ID0gJnBjaS0+ZGV2OwogCiAJLyogcmVjb3JkIGhhbmRsZXMgdG8gb3Vyc2VsZiAqLwogCWlyLT5jb3JlID0gY29yZTsKQEAgLTQ0NSw3ICs0OTcsNyBAQAogdm9pZCBjeDg4X2lyX2lycShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQogewogCXN0cnVjdCBjeDg4X0lSICppciA9IGNvcmUtPmlyOwotCXUzMiBzYW1wbGVzLCByYzU7CisJdTMyIHNhbXBsZXMsIGlyY29kZTsKIAlpbnQgaTsKIAogCWlmIChOVUxMID09IGlyKQpAQCAtNDc3LDEzICs1MjksNDQgQEAKIAogCS8qIGRlY29kZSBpdCAqLwogCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKKwljYXNlIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMToKKwkJaXJjb2RlID0gaXJfZGVjb2RlX3B1bHNlZGlzdGFuY2UoaXItPnNhbXBsZXMsIGlyLT5zY291bnQsIDEsIDQpOworCisJCWlmIChpcmNvZGUgPT0gMHhmZmZmZmZmZikgeyAvKiBkZWNvZGluZyBlcnJvciAqLworCQkJaXJfZHByaW50aygicHVsc2UgZGlzdGFuY2UgZGVjb2RpbmcgZXJyb3JcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpcl9kcHJpbnRrKCJwdWxzZSBkaXN0YW5jZSBkZWNvZGVkOiAleFxuIiwgaXJjb2RlKTsKKworCQlpZiAoaXJjb2RlID09IDApIHsgLyoga2V5IHN0aWxsIHByZXNzZWQgKi8KKwkJCWlyX2RwcmludGsoInB1bHNlIGRpc3RhbmNlIGRlY29kZWQgcmVwZWF0IGNvZGVcbiIpOworCQkJaXItPnJlbGVhc2UgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMjApOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGlyY29kZSAmIDB4ZmZmZikgIT0gMHhlYjA0KSB7IC8qIHdyb25nIGFkZHJlc3MgKi8KKwkJCWlyX2RwcmludGsoInB1bHNlIGRpc3RhbmNlIGRlY29kZWQgd3JvbmcgYWRkcmVzc1xuIik7CisgCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKCh+aXJjb2RlID4+IDI0KSAmIDB4ZmYpICE9ICgoaXJjb2RlID4+IDE2KSAmIDB4ZmYpKSB7IC8qIHdyb25nIGNoZWNrc3VtICovCisJCQlpcl9kcHJpbnRrKCJwdWxzZSBkaXN0YW5jZSBkZWNvZGVkIHdyb25nIGNoZWNrIHN1bVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlyX2RwcmludGsoIktleSBDb2RlOiAleFxuIiwgKGlyY29kZSA+PiAxNikgJiAweDdmKTsKKworCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsICZpci0+aXIsIChpcmNvZGUgPj4gMTYpICYgMHg3ZiwgKGlyY29kZSA+PiAxNikgJiAweGZmKTsKKwkJaXItPnJlbGVhc2UgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMjApOworCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgotCQlyYzUgPSBpcl9kZWNvZGVfYmlwaGFzZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgNSwgNyk7Ci0JCWlyX2RwcmludGsoImJpcGhhc2UgZGVjb2RlZDogJXhcbiIsIHJjNSk7Ci0JCWlmICgocmM1ICYgMHhmZmZmZjAwMCkgIT0gMHgzMDAwKQorCQlpcmNvZGUgPSBpcl9kZWNvZGVfYmlwaGFzZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgNSwgNyk7CisJCWlyX2RwcmludGsoImJpcGhhc2UgZGVjb2RlZDogJXhcbiIsIGlyY29kZSk7CisJCWlmICgoaXJjb2RlICYgMHhmZmZmZjAwMCkgIT0gMHgzMDAwKQogCQkJYnJlYWs7Ci0JCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwgJmlyLT5pciwgcmM1ICYgMHgzZiwgcmM1KTsKKwkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCAmaXItPmlyLCBpcmNvZGUgJiAweDNmLCBpcmNvZGUpOwogCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCBmZTI3NjdjLi5lZTIzMDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogY3g4OC1tcGVnLmMsdiAxLjMxIDIwMDUvMDcvMDcgMTQ6MTc6NDcgbWNoZWhhYiBFeHAgJAogICoKICAqICBTdXBwb3J0IGZvciB0aGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHRyYW5zZmVycwogICogIFBDSSBmdW5jdGlvbiAjMiBvZiB0aGUgY3gyMzg4eC4KQEAgLTczLDExICs3MiwxNSBAQAogCQl1ZGVsYXkoMTAwKTsKIAkJY3hfd3JpdGUoTU9fUElOTVVYX0lPLCAweDAwKTsKIAkJY3hfd3JpdGUoVFNfSFdfU09QX0NOVFJMLDB4NDc8PDE2fDE4ODw8NHwweDAxKTsKLQkJaWYgKChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1EpIHx8Ci0JCSAgICAoY29yZS0+Ym9hcmQgPT0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9UKSkgeworCQlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CisJCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9ROgorCQljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVDoKKwkJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9HT0xEOgogCQkJY3hfd3JpdGUoVFNfU09QX1NUQVQsIDE8PDEzKTsKLQkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJY3hfd3JpdGUoVFNfU09QX1NUQVQsIDB4MDApOworCQkJYnJlYWs7CiAJCX0KIAkJY3hfd3JpdGUoVFNfR0VOX0NOVFJMLCBkZXYtPnRzX2dlbl9jbnRybCk7CiAJCXVkZWxheSgxMDApOwpAQCAtODYsMTIgKzg5LDEwIEBACiAJaWYgKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5ibGFja2JpcmQpIHsKIAkJY3hfd3JpdGUoTU9fUElOTVVYX0lPLCAweDg4KTsgLyogZW5hYmxlIE1QRUcgcGFyYWxsZWwgSU8gKi8KIAotCQkvLyBjeF93cml0ZShUU19GMl9DTURfU1RBVF9NTSwgMHgyOTAwMTA2KTsgLyogRjJfQ01EX1NUQVRfTU0gZGVmYXVsdHMgKyBtYXN0ZXIgKyBtZW1vcnkgc3BhY2UgKi8KIAkJY3hfd3JpdGUoVFNfR0VOX0NOVFJMLCAweDQ2KTsgLyogcHVuY3R1cmVkIGNsb2NrIFRTICYgcG9zZWRnZSBkcml2ZW4gJiBzb2Z0d2FyZSByZXNldCAqLwogCQl1ZGVsYXkoMTAwKTsKIAogCQljeF93cml0ZShUU19IV19TT1BfQ05UUkwsIDB4NDA4KTsgLyogbXBlZyBzdGFydCBieXRlICovCi0JCS8vY3hfd3JpdGUoVFNfSFdfU09QX0NOVFJMLCAweDJGMEJDMCk7IC8qIG1wZWcgc3RhcnQgYnl0ZSB0czogMHgyRjBCQzAgPyAqLwogCQljeF93cml0ZShUU19WQUxFUlJfQ05UUkwsIDB4MjAwMCk7CiAKIAkJY3hfd3JpdGUoVFNfR0VOX0NOVFJMLCAweDA2KTsgLyogcHVuY3R1cmVkIGNsb2NrIFRTICYgcG9zZWRnZSBkcml2ZW4gKi8KQEAgLTEwNiw3ICsxMDcsNiBAQAogCWRwcmludGsoIDAsICJzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFza1xuIiApOwogCWN4X3NldChNT19QQ0lfSU5UTVNLLCBjb3JlLT5wY2lfaXJxbWFzayB8IDB4MDQpOwogCWN4X3NldChNT19UU19JTlRNU0ssICAweDFmMDAxMSk7Ci0JLy9jeF93cml0ZShNT19UU19JTlRNU0ssICAweDBmMDAxMSk7CiAKIAkvKiBzdGFydCBkbWEgKi8KIAljeF9zZXQoTU9fREVWX0NOVFJMMiwgKDE8PDUpKTsKQEAgLTIwNiw3ICsyMDYsNiBAQAogCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOwogCQlkcHJpbnRrKDAsIlslcC8lZF0gJXMgLSBmaXJzdCBhY3RpdmVcbiIsCiAJCQlidWYsIGJ1Zi0+dmIuaSwgX19GVU5DVElPTl9fKTsKLQkJLy91ZGVsYXkoMTAwKTsKIAogCX0gZWxzZSB7CiAJCWRwcmludGsoIDEsICJxdWV1ZSBpcyBub3QgZW1wdHkgLSBhcHBlbmQgdG8gYWN0aXZlXG4iICk7CkBAIC0yMTcsNyArMjE2LDYgQEAKIAkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKIAkJZHByaW50ayggMSwgIlslcC8lZF0gJXMgLSBhcHBlbmQgdG8gYWN0aXZlXG4iLAogCQkJYnVmLCBidWYtPnZiLmksIF9fRlVOQ1RJT05fXyk7Ci0JCS8vdWRlbGF5KDEwMCk7CiAJfQogfQogCkBAIC0zODcsNyArMzg1LDYgQEAKIAkgICAgICAgZGV2LT5wY2lfbGF0LHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBjaSwwKSk7CiAKIAkvKiBpbml0aWFsaXplIGRyaXZlciBzdHJ1Y3QgKi8KLSAgICAgICAgaW5pdF9NVVRFWCgmZGV2LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CiAKIAkvKiBpbml0IGRtYSBxdWV1ZSAqLwpAQCAtNDU4LDE0ICs0NTUsMjggQEAKIAogaW50IGN4ODgwMl9yZXN1bWVfY29tbW9uKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewotICAgICAgICBzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwlpbnQgZXJyOwogCiAJaWYgKGRldi0+c3RhdGUuZGlzYWJsZWQpIHsKLQkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWVycj1wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZW5hYmxlIGRldmljZVxuIiwKKwkJCQkJICAgICAgIGRldi0+Y29yZS0+bmFtZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJCWRldi0+c3RhdGUuZGlzYWJsZWQgPSAwOwogCX0KLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJZXJyPXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGVuYWJsZSBkZXZpY2VcbiIsCisJCQkJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWRldi0+c3RhdGUuZGlzYWJsZWQgPSAxOworCisJCXJldHVybiBlcnI7CisJfQogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwogCiAJLyogRklYTUU6IHJlLWluaXRpYWxpemUgaGFyZHdhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKaW5kZXggMzdmODI2Ni4uMGEzYTYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICAgICRJZDogY3g4OC1yZWcuaCx2IDEuOCAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKIAogICAgIGN4ODh4LWh3LmggLSBDWDIzODh4IHJlZ2lzdGVyIG9mZnNldHMKIApAQCAtNDAsNiArMzksMjkgQEAKICNkZWZpbmUgQ1g4OFhfRU5fVEJGWCAweDAyCiAjZGVmaW5lIENYODhYX0VOX1ZTRlggMHgwNAogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBQQ0kgY29udHJvbGxlciByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBGMF9DTURfU1RBVF9NTSAgICAgIDB4MmYwMDA0CisjZGVmaW5lIEYxX0NNRF9TVEFUX01NICAgICAgMHgyZjAxMDQKKyNkZWZpbmUgRjJfQ01EX1NUQVRfTU0gICAgICAweDJmMDIwNAorI2RlZmluZSBGM19DTURfU1RBVF9NTSAgICAgIDB4MmYwMzA0CisjZGVmaW5lIEY0X0NNRF9TVEFUX01NICAgICAgMHgyZjA0MDQKKworLyogRGV2aWNlIENvbnRyb2wgIzEgKi8KKyNkZWZpbmUgRjBfREVWX0NOVFJMMV9NTSAgICAweDJmMDA0MAorI2RlZmluZSBGMV9ERVZfQ05UUkwxX01NICAgIDB4MmYwMTQwCisjZGVmaW5lIEYyX0RFVl9DTlRSTDFfTU0gICAgMHgyZjAyNDAKKyNkZWZpbmUgRjNfREVWX0NOVFJMMV9NTSAgICAweDJmMDM0MAorI2RlZmluZSBGNF9ERVZfQ05UUkwxX01NICAgIDB4MmYwNDQwCisKKy8qIERldmljZSBDb250cm9sICMxICovCisjZGVmaW5lIEYwX0JBUjBfTU0gICAgICAgICAgMHgyZjAwMTAKKyNkZWZpbmUgRjFfQkFSMF9NTSAgICAgICAgICAweDJmMDExMAorI2RlZmluZSBGMl9CQVIwX01NICAgICAgICAgIDB4MmYwMjEwCisjZGVmaW5lIEYzX0JBUjBfTU0gICAgICAgICAgMHgyZjAzMTAKKyNkZWZpbmUgRjRfQkFSMF9NTSAgICAgICAgICAweDJmMDQxMAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBETUEgQ29udHJvbGxlciByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggOTEyMDdmMS4uMjc2NWFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gICAgJElkOiBjeDg4LXR2YXVkaW8uYyx2IDEuMzcgMjAwNS8wNy8wNyAxMzo1ODozOCBtY2hlaGFiIEV4cCAkCiAKICAgICBjeDg4eC1hdWRpby5jIC0gQ29uZXhhbnQgQ1gyMzg4MC8yMzg4MSBhdWRpbyBkb3duc3RyZWFtIGRyaXZlciBkcml2ZXIKIApAQCAtMTIxLDI1ICsxMjAsMTkgQEAKIH0KIAogc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YXJ0KHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCi0JCQkgICAgdTMyIG1vZGUsIHUzMiBjdGwpCisJCQl1MzIgbW9kZSkKIHsKIAkvLyBtdXRlCiAJY3hfd3JpdGUoQVVEX1ZPTF9DVEwsICAgICAgICgxIDw8IDYpKTsKIAotCS8vICBpbmNyZWFzZSBsZXZlbCBvZiBpbnB1dCBieSAxMmRCCi0vLwljeF93cml0ZShBVURfQUZFXzEyREJfRU4sICAgMHgwMDAxKTsKLQljeF93cml0ZShBVURfQUZFXzEyREJfRU4sICAgMHgwMDAwKTsKLQogCS8vIHN0YXJ0IHByb2dyYW1taW5nCiAJY3hfd3JpdGUoQVVEX0NUTCwgICAgICAgICAgIDB4MDAwMCk7CiAJY3hfd3JpdGUoQVVEX0lOSVQsICAgICAgICAgIG1vZGUpOwogCWN4X3dyaXRlKEFVRF9JTklUX0xELCAgICAgICAweDAwMDEpOwogCWN4X3dyaXRlKEFVRF9TT0ZUX1JFU0VULCAgICAweDAwMDEpOwotCi0JY3hfd3JpdGUoQVVEX0NUTCwgICAgICAgICAgIGN0bCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9hdWRpb19maW5pc2goc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19maW5pc2goc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIGN0bCkKIHsKIAl1MzIgdm9sdW1lOwogCkBAIC0xNTQsMjUgKzE0NywyNSBAQAogCQljeF93cml0ZShBVURfSTJTT1VUUFVUQ05UTCwgMSk7CiAJCWN4X3dyaXRlKEFVRF9JMlNDTlRMLCAwKTsKIAkJLy9jeF93cml0ZShBVURfQVBCX0lOX1JBVEVfQURKLCAwKTsKKwl9IGVsc2UgeworCWN0bCB8PSBFTl9EQUNfRU5BQkxFOworCWN4X3dyaXRlKEFVRF9DVEwsIGN0bCk7CiAJfQogCi0JLy8gZmluaXNoIHByb2dyYW1taW5nCisJLyogZmluaXNoIHByb2dyYW1taW5nICovCiAJY3hfd3JpdGUoQVVEX1NPRlRfUkVTRVQsIDB4MDAwMCk7CiAKLQkvLyBzdGFydCBhdWRpbyBwcm9jZXNzaW5nCi0JY3hfc2V0KEFVRF9DVEwsIEVOX0RBQ19FTkFCTEUpOwotCi0JLy8gdW5tdXRlCisJLyogdW5tdXRlICovCiAJdm9sdW1lID0gY3hfc3JlYWQoU0hBRE9XX0FVRF9WT0xfQ1RMKTsKIAljeF9zd3JpdGUoU0hBRE9XX0FVRF9WT0xfQ1RMLCBBVURfVk9MX0NUTCwgdm9sdW1lKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0Moc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IHNhcCkKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9CVFNDKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHVuc2lnbmVkIGludCBzYXAsIHUzMiBtb2RlKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYnRzY1tdID0gewotCQkvKiBmcm9tIGRzY2FsZXIgKi8KKwl7IEFVRF9BRkVfMTJEQl9FTiwgICAgICAgICAgICAgMHgwMDAwMDAwMSB9LAogCQl7IEFVRF9PVVQxX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAxMyB9LAogCQl7IEFVRF9PVVQxX1NISUZULCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAogCQl7IEFVRF9QT0xZMF9ERFNfQ09OU1RBTlQsICAgICAgMHgwMDEyMDEwYyB9LApAQCAtMjA2LDkgKzE5OSwxMCBAQAogCQl7IEFVRF9SRFNJX1NISUZULCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAogCQl7IEFVRF9SRFNRX1NISUZULCAgICAgICAgICAgICAgMHgwMDAwMDAwMCB9LAogCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAgICAgMHgwMDAwMDAwMyB9LAotICAgICAgICAgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwkJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAogCX07CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBidHNjX3NhcFtdID0geworCXsgQVVEX0FGRV8xMkRCX0VOLCAgICAgICAgICAgICAweDAwMDAwMDAxIH0sCiAJCXsgQVVEX0RCWF9JTl9HQUlOLCAgICAgICAgICAgICAweDAwMDA3MjAwIH0sCiAJCXsgQVVEX0RCWF9XQkVfR0FJTiwgICAgICAgICAgICAweDAwMDA2MjAwIH0sCiAJCXsgQVVEX0RCWF9TRV9HQUlOLCAgICAgICAgICAgICAweDAwMDA2MjAwIH0sCkBAIC0yNTksMzcxICsyNTMsNDAwIEBACiAJCXsgQVVEX1JEU0lfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCiAJCXsgQVVEX1JEU1FfU0hJRlQsICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCiAJCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgICAgICAweDAwMDAwMDAzIH0sCi0gICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiAJfTsKIAotCS8vIGRzY2FsZXI6IGV4YWN0bHkgdGFrZW4gZnJvbSBkcml2ZXIsCi0JLy8gZHNjYWxlcjogZG9uJ3Qga25vdyB3aHkgdG8gc2V0IEVOX0ZNUkFESU9fRU5fUkRTCisJbW9kZSB8PSBFTl9GTVJBRElPX0VOX1JEUzsKKwogCWlmIChzYXApIHsKIAkJZHByaW50aygiJXMgU0FQIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMDEsCi0JCQkJRU5fRk1SQURJT19FTl9SRFMgfCBFTl9CVFNDX0ZPUkNFX1NBUCk7CisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9TQVApOwogCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGJ0c2Nfc2FwKTsKKwkJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCBtb2RlKTsKIAl9IGVsc2UgewogCQlkcHJpbnRrKCIlcyAoc3RhdHVzOiBrbm93bi1nb29kKVxuIixfX0ZVTkNUSU9OX18pOwotCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDAxLAotCQkJCUVOX0ZNUkFESU9fRU5fUkRTIHwgRU5fQlRTQ19BVVRPX1NURVJFTyk7CisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9CVFNDKTsKIAkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBidHNjKTsKKwkJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCBtb2RlKTsKIAl9Ci0Jc2V0X2F1ZGlvX2ZpbmlzaChjb3JlKTsKIH0KIAogCiBzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU1fTChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBpbnQgc3RlcmVvKQogewotICAgICAgICAvKiBUaGlzIGlzIHByb2JhYmx5IHdlaXJkLi4KLSAgICAgICAgICogTGV0J3Mgb3BlcmF0ZSBhbmQgZmluZCBvdXQuICovCisJLyogVGhpcyBpcyBwcm9iYWJseSB3ZWlyZC4uCisJKiBMZXQncyBvcGVyYXRlIGFuZCBmaW5kIG91dC4gKi8KIAotICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2xfbW9ub1tdID0gewotICAgICAgICAgICAgICAgIHsgQVVEX0VSUkxPR1BFUklPRF9SLCAgICAgMHgwMDAwMDA2NCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgMHgwMDAwMEZGRiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgMHgwMDAwMDAxRiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgMHgwMDAwMDAwRiB9LAorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgbmljYW1fbF9tb25vW10gPSB7CisJCXsgQVVEX0VSUkxPR1BFUklPRF9SLCAgICAgMHgwMDAwMDA2NCB9LAorCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsIDB4MDAwMDBGRkYgfSwKKwkJeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAweDAwMDAwMDFGIH0sCisJCXsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgMHgwMDAwMDAwRiB9LAogCi0gICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAweDQ4IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUxLCAweDNEIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUUFNX01PREUsICAgICAgICAgICAweDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAweGY1IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAweDNhIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAweDRhIH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgMHg0OCB9LAorCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTEsIDB4M0QgfSwKKwkJeyBBVURfUUFNX01PREUsICAgICAgICAgICAweDAwIH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgMHhmNSB9LAorCQl7IEFVRF9QSEFDQ19GUkVRXzhNU0IsICAgIDB4M2EgfSwKKwkJeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAweDRhIH0sCiAKLSAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhHQUlOX1IsIDB4NjY4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSE5VTUVSMV9SLCAweDM1M0RFIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBITlVNRVIyX1IsIDB4MUIxIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBIREVOT00xX1IsIDB4MEYzRDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhERU5PTTJfUiwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRk1fTU9ERV9FTkFCTEUsIDB4NyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsIDB4MyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0FGRV8xMkRCX0VOLCAweDEgfSwKLSAgICAgICAgICAgICAgICB7IEFBR0NfR0FJTiwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBQUdDX0hZU1QsIDB4MTggfSwKLSAgICAgICAgICAgICAgICB7IEFBR0NfREVGLCAweDIwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRE4wX0ZSRVEsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BPTFkwX0REU19DT05TVEFOVCwgMHgwRTREQjIgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9EQ09DXzBfU1JDLCAweDIxIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV8wX1NFTCwgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV8wX1NISUZULCAweDcgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzFfU0VMLCAweDIgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzFfU0hJRlQsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RDT0NfMV9TUkMsIDB4MyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RDT0MxX1NISUZULCAweDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9EQ09DX1BBU1NfSU4sIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfMl9TRUwsIDB4MjMgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIxXzJfU0hJRlQsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfM19TRUwsIDB4NCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0lJUjFfM19TSElGVCwgMHg3IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV80X1NFTCwgMHg1IH0sCi0gICAgICAgICAgICAgICAgeyBBVURfSUlSMV80X1NISUZULCAweDcgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIzXzBfU0VMLCAweDcgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9JSVIzXzBfU0hJRlQsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfU1JDX1NFTCwgMHgxMSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfU0hJRlQsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfRzAsIDB4NzAwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQTAsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQjAsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQTEsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDBfQjEsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfU1JDX1NFTCwgMHgxMSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfU0hJRlQsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfRzAsIDB4NzAwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQTAsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQjAsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQTEsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSDFfQjEsIDB4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX09VVDBfU0VMLCAweDNGIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfT1VUMV9TRUwsIDB4M0YgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ETURfUkFfRERTLCAweDBGNUMyODUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QTExfSU5ULCAweDFFIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUExMX0REUywgMHgwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUExMX0ZSQUMsIDB4MEU1NDIgfSwKKwkJeyBBVURfREVFTVBIR0FJTl9SLCAweDY2ODAgfSwKKwkJeyBBVURfREVFTVBITlVNRVIxX1IsIDB4MzUzREUgfSwKKwkJeyBBVURfREVFTVBITlVNRVIyX1IsIDB4MUIxIH0sCisJCXsgQVVEX0RFRU1QSERFTk9NMV9SLCAweDBGM0QwIH0sCisJCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAweDAgfSwKKwkJeyBBVURfRk1fTU9ERV9FTkFCTEUsIDB4NyB9LAorCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAweDMgfSwKKwkJeyBBVURfQUZFXzEyREJfRU4sIDB4MSB9LAorCQl7IEFBR0NfR0FJTiwgMHgwIH0sCisJCXsgQUFHQ19IWVNULCAweDE4IH0sCisJCXsgQUFHQ19ERUYsIDB4MjAgfSwKKwkJeyBBVURfRE4wX0ZSRVEsIDB4MCB9LAorCQl7IEFVRF9QT0xZMF9ERFNfQ09OU1RBTlQsIDB4MEU0REIyIH0sCisJCXsgQVVEX0RDT0NfMF9TUkMsIDB4MjEgfSwKKwkJeyBBVURfSUlSMV8wX1NFTCwgMHgwIH0sCisJCXsgQVVEX0lJUjFfMF9TSElGVCwgMHg3IH0sCisJCXsgQVVEX0lJUjFfMV9TRUwsIDB4MiB9LAorCQl7IEFVRF9JSVIxXzFfU0hJRlQsIDB4MCB9LAorCQl7IEFVRF9EQ09DXzFfU1JDLCAweDMgfSwKKwkJeyBBVURfRENPQzFfU0hJRlQsIDB4MCB9LAorCQl7IEFVRF9EQ09DX1BBU1NfSU4sIDB4MCB9LAorCQl7IEFVRF9JSVIxXzJfU0VMLCAweDIzIH0sCisJCXsgQVVEX0lJUjFfMl9TSElGVCwgMHgwIH0sCisJCXsgQVVEX0lJUjFfM19TRUwsIDB4NCB9LAorCQl7IEFVRF9JSVIxXzNfU0hJRlQsIDB4NyB9LAorCQl7IEFVRF9JSVIxXzRfU0VMLCAweDUgfSwKKwkJeyBBVURfSUlSMV80X1NISUZULCAweDcgfSwKKwkJeyBBVURfSUlSM18wX1NFTCwgMHg3IH0sCisJCXsgQVVEX0lJUjNfMF9TSElGVCwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDBfU1JDX1NFTCwgMHgxMSB9LAorCQl7IEFVRF9ERUVNUEgwX1NISUZULCAweDAgfSwKKwkJeyBBVURfREVFTVBIMF9HMCwgMHg3MDAwIH0sCisJCXsgQVVEX0RFRU1QSDBfQTAsIDB4MCB9LAorCQl7IEFVRF9ERUVNUEgwX0IwLCAweDAgfSwKKwkJeyBBVURfREVFTVBIMF9BMSwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDBfQjEsIDB4MCB9LAorCQl7IEFVRF9ERUVNUEgxX1NSQ19TRUwsIDB4MTEgfSwKKwkJeyBBVURfREVFTVBIMV9TSElGVCwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDFfRzAsIDB4NzAwMCB9LAorCQl7IEFVRF9ERUVNUEgxX0EwLCAweDAgfSwKKwkJeyBBVURfREVFTVBIMV9CMCwgMHgwIH0sCisJCXsgQVVEX0RFRU1QSDFfQTEsIDB4MCB9LAorCQl7IEFVRF9ERUVNUEgxX0IxLCAweDAgfSwKKwkJeyBBVURfT1VUMF9TRUwsIDB4M0YgfSwKKwkJeyBBVURfT1VUMV9TRUwsIDB4M0YgfSwKKwkJeyBBVURfRE1EX1JBX0REUywgMHgwRjVDMjg1IH0sCisJCXsgQVVEX1BMTF9JTlQsIDB4MUUgfSwKKwkJeyBBVURfUExMX0REUywgMHgwIH0sCisJCXsgQVVEX1BMTF9GUkFDLCAweDBFNTQyIH0sCiAKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBRQU0gcmVnaXN0ZXJzCi0gICAgICAgICAgICAgICAgeyBBVURfUkFURV9BREoxLCAgICAgIDB4MDAwMDAxMDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjIsICAgICAgMHgwMDAwMDIwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfQURKMywgICAgICAweDAwMDAwMzAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUkFURV9BREo0LCAgICAgIDB4MDAwMDA0MDAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjUsICAgICAgMHgwMDAwMDUwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfVEhSRVNfRE1ELCAweDAwMDAwMEMwIH0sCi0gICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAotICAgICAgICB9OworCQkvLyBzZXR1cCBRQU0gcmVnaXN0ZXJzCisJCXsgQVVEX1JBVEVfQURKMSwgICAgICAweDAwMDAwMTAwIH0sCisJCXsgQVVEX1JBVEVfQURKMiwgICAgICAweDAwMDAwMjAwIH0sCisJCXsgQVVEX1JBVEVfQURKMywgICAgICAweDAwMDAwMzAwIH0sCisJCXsgQVVEX1JBVEVfQURKNCwgICAgICAweDAwMDAwNDAwIH0sCisJCXsgQVVEX1JBVEVfQURKNSwgICAgICAweDAwMDAwNTAwIH0sCisJCXsgQVVEX1JBVEVfVEhSRVNfRE1ELCAweDAwMDAwMEMwIH0sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OwogCi0gICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgbmljYW1fbFtdID0gewotICAgICAgICAgICAgICAgIC8vIHNldHVwIFFBTSByZWdpc3RlcnMKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjEsIDB4MDAwMDAwNjAgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjIsIDB4MDAwMDAwRjkgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjMsIDB4MDAwMDAxQ0MgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjQsIDB4MDAwMDAyQjMgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9SQVRFX0FESjUsIDB4MDAwMDA3MjYgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9ERUVNUEhERU5PTTFfUiwgMHgwMDAwRjNEMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSERFTk9NMl9SLCAweDAwMDAwMDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRVJSTE9HUEVSSU9EX1IsIDB4MDAwMDAwNjQgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsIDB4MDAwMDBGRkYgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9FUlJJTlRSUFRUSFNITEQyX1IsIDB4MDAwMDAwMUYgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9FUlJJTlRSUFRUSFNITEQzX1IsIDB4MDAwMDAwMEYgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAweDAwMDAwMDAzIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfRE1EX1JBX0REUywgMHgwMEMwMDAwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BMTF9JTlQsIDB4MDAwMDAwMUUgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QTExfRERTLCAweDAwMDAwMDAwIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfUExMX0ZSQUMsIDB4MDAwMEU1NDIgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9TVEFSVF9USU1FUiwgMHgwMDAwMDAwMCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSE5VTUVSMV9SLCAweDAwMDM1M0RFIH0sCi0gICAgICAgICAgICAgICAgeyBBVURfREVFTVBITlVNRVIyX1IsIDB4MDAwMDAxQjEgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTIsIDB4MDYgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTEsIDB4ODIgfSwKLSAgICAgICAgICAgICAgICB7IEFVRF9RQU1fTU9ERSwgMHgwNSB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgMHgxMiB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgMHgzNCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1BIQUNDX0ZSRVFfOExTQiwgMHg0QyB9LAotICAgICAgICAgICAgICAgIHsgQVVEX0RFRU1QSEdBSU5fUiwgMHgwMDAwNjY4MCB9LAotICAgICAgICAgICAgICAgIHsgQVVEX1JBVEVfVEhSRVNfRE1ELCAweDAwMDAwMEMwICB9LAotICAgICAgICAgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwKLSAgICAgICAgfSA7Ci0gICAgICAgIGRwcmludGsoIiVzIChzdGF0dXM6IGRldmVsKSwgc3RlcmVvIDogJWRcbiIsX19GVU5DVElPTl9fLHN0ZXJlbyk7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9sW10gPSB7CisJCS8vIHNldHVwIFFBTSByZWdpc3RlcnMKKwkJeyBBVURfUkFURV9BREoxLCAweDAwMDAwMDYwIH0sCisJCXsgQVVEX1JBVEVfQURKMiwgMHgwMDAwMDBGOSB9LAorCQl7IEFVRF9SQVRFX0FESjMsIDB4MDAwMDAxQ0MgfSwKKwkJeyBBVURfUkFURV9BREo0LCAweDAwMDAwMkIzIH0sCisJCXsgQVVEX1JBVEVfQURKNSwgMHgwMDAwMDcyNiB9LAorCQl7IEFVRF9ERUVNUEhERU5PTTFfUiwgMHgwMDAwRjNEMCB9LAorCQl7IEFVRF9ERUVNUEhERU5PTTJfUiwgMHgwMDAwMDAwMCB9LAorCQl7IEFVRF9FUlJMT0dQRVJJT0RfUiwgMHgwMDAwMDA2NCB9LAorCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsIDB4MDAwMDBGRkYgfSwKKwkJeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAweDAwMDAwMDFGIH0sCisJCXsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgMHgwMDAwMDAwRiB9LAorCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAweDAwMDAwMDAzIH0sCisJCXsgQVVEX0RNRF9SQV9ERFMsIDB4MDBDMDAwMDAgfSwKKwkJeyBBVURfUExMX0lOVCwgMHgwMDAwMDAxRSB9LAorCQl7IEFVRF9QTExfRERTLCAweDAwMDAwMDAwIH0sCisJCXsgQVVEX1BMTF9GUkFDLCAweDAwMDBFNTQyIH0sCisJCXsgQVVEX1NUQVJUX1RJTUVSLCAweDAwMDAwMDAwIH0sCisJCXsgQVVEX0RFRU1QSE5VTUVSMV9SLCAweDAwMDM1M0RFIH0sCisJCXsgQVVEX0RFRU1QSE5VTUVSMl9SLCAweDAwMDAwMUIxIH0sCisJCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgMHgwNiB9LAorCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTEsIDB4ODIgfSwKKwkJeyBBVURfUUFNX01PREUsIDB4MDUgfSwKKwkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAweDEyIH0sCisJCXsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgMHgzNCB9LAorCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsIDB4NEMgfSwKKwkJeyBBVURfREVFTVBIR0FJTl9SLCAweDAwMDA2NjgwIH0sCisJCXsgQVVEX1JBVEVfVEhSRVNfRE1ELCAweDAwMDAwMEMwICB9LAorCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJfSA7CisJZHByaW50aygiJXMgKHN0YXR1czogZGV2ZWwpLCBzdGVyZW8gOiAlZFxuIixfX0ZVTkNUSU9OX18sc3RlcmVvKTsKIAotICAgICAgICBpZiAoIXN0ZXJlbykgewotCQkvKiBBTSBtb25vIHNvdW5kICovCi0gICAgICAgICAgICAgICAgc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAwNCwKLQkJCQkweDEwMGMgLyogRklYTUUgYWdhaW4gKi8pOwotICAgICAgICAgICAgICAgIHNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fbF9tb25vKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDEwLAotCQkJCTB4MTkyNCAvKiBGSVhNRSBhZ2FpbiAqLyk7Ci0gICAgICAgICAgICAgICAgc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBuaWNhbV9sKTsKLSAgICAgICAgfQotICAgICAgICBzZXRfYXVkaW9fZmluaXNoKGNvcmUpOwotCisJaWYgKCFzdGVyZW8pIHsKKwkvKiBBTSBNb25vICovCisJCXNldF9hdWRpb19zdGFydChjb3JlLCBTRUxfQTIpOworCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIG5pY2FtX2xfbW9ubyk7CisJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCBFTl9BMl9GT1JDRV9NT05PMSk7CisJfSBlbHNlIHsKKwkvKiBOaWNhbSBTdGVyZW8gKi8KKwkJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9OSUNBTSk7CisJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fbCk7CisJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCAweDE5MjQpOyAvKiBGSVhNRSAqLworCX0KIH0KIAogc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX1BBTF9JKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGludCBzdGVyZW8pCiB7CiAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBwYWxfaV9mbV9tb25vW10gPSB7Ci0gICAgICAgICAgICB7QVVEX0VSUkxPR1BFUklPRF9SLCAgICAgICAweDAwMDAwMDY0fSwKLSAgICAgICAgICAgIHtBVURfRVJSSU5UUlBUVEhTSExEMV9SLCAgIDB4MDAwMDBmZmZ9LAotICAgICAgICAgICAge0FVRF9FUlJJTlRSUFRUSFNITEQyX1IsICAgMHgwMDAwMDAxZn0sCi0gICAgICAgICAgICB7QVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgICAweDAwMDAwMDBmfSwKLSAgICAgICAgICAgIHtBVURfUERGX0REU19DTlNUX0JZVEUyLCAgIDB4MDZ9LAotICAgICAgICAgICAge0FVRF9QREZfRERTX0NOU1RfQllURTEsICAgMHg4Mn0sCi0gICAgICAgICAgICB7QVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgICAweDEyfSwKLSAgICAgICAgICAgIHtBVURfUUFNX01PREUsICAgICAgICAgICAgIDB4MDV9LAotICAgICAgICAgICAge0FVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAgMHgzYX0sCi0gICAgICAgICAgICB7QVVEX1BIQUNDX0ZSRVFfOExTQiwgICAgICAweDkzfSwKLSAgICAgICAgICAgIHtBVURfRE1EX1JBX0REUywgICAgICAgICAgIDB4MDAyYTRmMmZ9LAotICAgICAgICAgICAge0FVRF9QTExfSU5ULCAgICAgICAgICAgICAgMHgwMDAwMDAxZX0sCi0gICAgICAgICAgICB7QVVEX1BMTF9ERFMsICAgICAgICAgICAgICAweDAwMDAwMDA0fSwKLSAgICAgICAgICAgIHtBVURfUExMX0ZSQUMsICAgICAgICAgICAgIDB4MDAwMGU1NDJ9LAotICAgICAgICAgICAge0FVRF9SQVRFX0FESjEsICAgICAgICAgICAgMHgwMDAwMDEwMH0sCi0gICAgICAgICAgICB7QVVEX1JBVEVfQURKMiwgICAgICAgICAgICAweDAwMDAwMjAwfSwKLSAgICAgICAgICAgIHtBVURfUkFURV9BREozLCAgICAgICAgICAgIDB4MDAwMDAzMDB9LAotICAgICAgICAgICAge0FVRF9SQVRFX0FESjQsICAgICAgICAgICAgMHgwMDAwMDQwMH0sCi0gICAgICAgICAgICB7QVVEX1JBVEVfQURKNSwgICAgICAgICAgICAweDAwMDAwNTAwfSwKLSAgICAgICAgICAgIHtBVURfVEhSX0ZSLCAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMV9LMCwgICAgICAgMHgwMDAwNzU1Yn0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8xX0sxLCAgICAgICAweDAwNTUxMzQwfSwKLSAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzFfSzIsICAgICAgIDB4MDA2ZDMwYmV9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMV9LMywgICAgICAgMHhmZmQzOTRhZn0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8xX0s0LCAgICAgICAweDAwNDAwMDAwfSwKLSAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzJfSzAsICAgICAgIDB4MDAwNDAwMDB9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMl9LMSwgICAgICAgMHgwMDJhNDg0MX0sCi0gICAgICAgICAgICB7QVVEX1BJTE9UX0JRRF8yX0syLCAgICAgICAweDAwNDAwMDAwfSwKLSAgICAgICAgICAgIHtBVURfUElMT1RfQlFEXzJfSzMsICAgICAgIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAge0FVRF9QSUxPVF9CUURfMl9LNCwgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7QVVEX01PREVfQ0hHX1RJTUVSLCAgICAgICAweDAwMDAwMDYwfSwKLSAgICAgICAgICAgIHtBVURfQUZFXzEyREJfRU4sICAgICAgICAgIDB4MDAwMDAwMDF9LAotICAgICAgICAgICAge0FBR0NfSFlTVCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwYX0sCi0gICAgICAgICAgICB7QVVEX0NPUkRJQ19TSElGVF8wLCAgICAgICAweDAwMDAwMDA3fSwKLSAgICAgICAgICAgIHtBVURfQ09SRElDX1NISUZUXzEsICAgICAgIDB4MDAwMDAwMDd9LAotICAgICAgICAgICAge0FVRF9DMV9VUF9USFIsICAgICAgICAgICAgMHgwMDAwNzAwMH0sCi0gICAgICAgICAgICB7QVVEX0MxX0xPX1RIUiwgICAgICAgICAgICAweDAwMDA1NDAwfSwKLSAgICAgICAgICAgIHtBVURfQzJfVVBfVEhSLCAgICAgICAgICAgIDB4MDAwMDU0MDB9LAotICAgICAgICAgICAge0FVRF9DMl9MT19USFIsICAgICAgICAgICAgMHgwMDAwMzAwMH0sCi0gICAgICAgICAgICB7QVVEX0RDT0NfMF9TUkMsICAgICAgICAgICAweDAwMDAwMDFhfSwKLSAgICAgICAgICAgIHtBVURfRENPQzBfU0hJRlQsICAgICAgICAgIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAge0FVRF9EQ09DXzBfU0hJRlRfSU4wLCAgICAgMHgwMDAwMDAwYX0sCi0gICAgICAgICAgICB7QVVEX0RDT0NfMF9TSElGVF9JTjEsICAgICAweDAwMDAwMDA4fSwKLSAgICAgICAgICAgIHtBVURfRENPQ19QQVNTX0lOLCAgICAgICAgIDB4MDAwMDAwMDN9LAotICAgICAgICAgICAge0FVRF9JSVIzXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAyMX0sCi0gICAgICAgICAgICB7QVVEX0ROMl9BRkMsICAgICAgICAgICAgICAweDAwMDAwMDAyfSwKLSAgICAgICAgICAgIHtBVURfRENPQ18xX1NSQywgICAgICAgICAgIDB4MDAwMDAwMWJ9LAotICAgICAgICAgICAge0FVRF9EQ09DMV9TSElGVCwgICAgICAgICAgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICB7QVVEX0RDT0NfMV9TSElGVF9JTjAsICAgICAweDAwMDAwMDBhfSwKLSAgICAgICAgICAgIHtBVURfRENPQ18xX1NISUZUX0lOMSwgICAgIDB4MDAwMDAwMDh9LAotICAgICAgICAgICAge0FVRF9JSVIzXzFfU0VMLCAgICAgICAgICAgMHgwMDAwMDAyM30sCi0gICAgICAgICAgICB7QVVEX0ROMF9GUkVRLCAgICAgICAgICAgICAweDAwMDAzNWEzfSwKLSAgICAgICAgICAgIHtBVURfRE4yX0ZSRVEsICAgICAgICAgICAgIDB4MDAwMDI5Yzd9LAotICAgICAgICAgICAge0FVRF9DUkRDMF9TUkNfU0VMLCAgICAgICAgMHgwMDAwMDUxMX0sCi0gICAgICAgICAgICB7QVVEX0lJUjFfMF9TRUwsICAgICAgICAgICAweDAwMDAwMDAxfSwKLSAgICAgICAgICAgIHtBVURfSUlSMV8xX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAge0FVRF9JSVIzXzJfU0VMLCAgICAgICAgICAgMHgwMDAwMDAwM30sCi0gICAgICAgICAgICB7QVVEX0lJUjNfMl9TSElGVCwgICAgICAgICAweDAwMDAwMDAwfSwKLSAgICAgICAgICAgIHtBVURfSUlSM18wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDJ9LAotICAgICAgICAgICAge0FVRF9JSVIyXzBfU0VMLCAgICAgICAgICAgMHgwMDAwMDAyMX0sCi0gICAgICAgICAgICB7QVVEX0lJUjJfMF9TSElGVCwgICAgICAgICAweDAwMDAwMDAyfSwKLSAgICAgICAgICAgIHtBVURfREVFTVBIMF9TUkNfU0VMLCAgICAgIDB4MDAwMDAwMGJ9LAotICAgICAgICAgICAge0FVRF9ERUVNUEgxX1NSQ19TRUwsICAgICAgMHgwMDAwMDAwYn0sCi0gICAgICAgICAgICB7QVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgICAweDAwMDAwMDAxfSwKLSAgICAgICAgICAgIHtBVURfU1RBUlRfVElNRVIsICAgICAgICAgIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCXtBVURfRVJSTE9HUEVSSU9EX1IsICAgICAgIDB4MDAwMDAwNjR9LAorCXtBVURfRVJSSU5UUlBUVEhTSExEMV9SLCAgIDB4MDAwMDBmZmZ9LAorCXtBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgIDB4MDAwMDAwMWZ9LAorCXtBVURfRVJSSU5UUlBUVEhTSExEM19SLCAgIDB4MDAwMDAwMGZ9LAorCXtBVURfUERGX0REU19DTlNUX0JZVEUyLCAgIDB4MDZ9LAorCXtBVURfUERGX0REU19DTlNUX0JZVEUxLCAgIDB4ODJ9LAorCXtBVURfUERGX0REU19DTlNUX0JZVEUwLCAgIDB4MTJ9LAorCXtBVURfUUFNX01PREUsICAgICAgICAgICAgIDB4MDV9LAorCXtBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgIDB4M2F9LAorCXtBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgIDB4OTN9LAorCXtBVURfRE1EX1JBX0REUywgICAgICAgICAgIDB4MDAyYTRmMmZ9LAorCXtBVURfUExMX0lOVCwgICAgICAgICAgICAgIDB4MDAwMDAwMWV9LAorCXtBVURfUExMX0REUywgICAgICAgICAgICAgIDB4MDAwMDAwMDR9LAorCXtBVURfUExMX0ZSQUMsICAgICAgICAgICAgIDB4MDAwMGU1NDJ9LAorCXtBVURfUkFURV9BREoxLCAgICAgICAgICAgIDB4MDAwMDAxMDB9LAorCXtBVURfUkFURV9BREoyLCAgICAgICAgICAgIDB4MDAwMDAyMDB9LAorCXtBVURfUkFURV9BREozLCAgICAgICAgICAgIDB4MDAwMDAzMDB9LAorCXtBVURfUkFURV9BREo0LCAgICAgICAgICAgIDB4MDAwMDA0MDB9LAorCXtBVURfUkFURV9BREo1LCAgICAgICAgICAgIDB4MDAwMDA1MDB9LAorCXtBVURfVEhSX0ZSLCAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzFfSzAsICAgICAgIDB4MDAwMDc1NWJ9LAorCXtBVURfUElMT1RfQlFEXzFfSzEsICAgICAgIDB4MDA1NTEzNDB9LAorCXtBVURfUElMT1RfQlFEXzFfSzIsICAgICAgIDB4MDA2ZDMwYmV9LAorCXtBVURfUElMT1RfQlFEXzFfSzMsICAgICAgIDB4ZmZkMzk0YWZ9LAorCXtBVURfUElMT1RfQlFEXzFfSzQsICAgICAgIDB4MDA0MDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzAsICAgICAgIDB4MDAwNDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzEsICAgICAgIDB4MDAyYTQ4NDF9LAorCXtBVURfUElMT1RfQlFEXzJfSzIsICAgICAgIDB4MDA0MDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzMsICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzQsICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfTU9ERV9DSEdfVElNRVIsICAgICAgIDB4MDAwMDAwNjB9LAorCXtBVURfQUZFXzEyREJfRU4sICAgICAgICAgIDB4MDAwMDAwMDF9LAorCXtBQUdDX0hZU1QsICAgICAgICAgICAgICAgIDB4MDAwMDAwMGF9LAorCXtBVURfQ09SRElDX1NISUZUXzAsICAgICAgIDB4MDAwMDAwMDd9LAorCXtBVURfQ09SRElDX1NISUZUXzEsICAgICAgIDB4MDAwMDAwMDd9LAorCXtBVURfQzFfVVBfVEhSLCAgICAgICAgICAgIDB4MDAwMDcwMDB9LAorCXtBVURfQzFfTE9fVEhSLCAgICAgICAgICAgIDB4MDAwMDU0MDB9LAorCXtBVURfQzJfVVBfVEhSLCAgICAgICAgICAgIDB4MDAwMDU0MDB9LAorCXtBVURfQzJfTE9fVEhSLCAgICAgICAgICAgIDB4MDAwMDMwMDB9LAorCXtBVURfRENPQ18wX1NSQywgICAgICAgICAgIDB4MDAwMDAwMWF9LAorCXtBVURfRENPQzBfU0hJRlQsICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfRENPQ18wX1NISUZUX0lOMCwgICAgIDB4MDAwMDAwMGF9LAorCXtBVURfRENPQ18wX1NISUZUX0lOMSwgICAgIDB4MDAwMDAwMDh9LAorCXtBVURfRENPQ19QQVNTX0lOLCAgICAgICAgIDB4MDAwMDAwMDN9LAorCXtBVURfSUlSM18wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMjF9LAorCXtBVURfRE4yX0FGQywgICAgICAgICAgICAgIDB4MDAwMDAwMDJ9LAorCXtBVURfRENPQ18xX1NSQywgICAgICAgICAgIDB4MDAwMDAwMWJ9LAorCXtBVURfRENPQzFfU0hJRlQsICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfRENPQ18xX1NISUZUX0lOMCwgICAgIDB4MDAwMDAwMGF9LAorCXtBVURfRENPQ18xX1NISUZUX0lOMSwgICAgIDB4MDAwMDAwMDh9LAorCXtBVURfSUlSM18xX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMjN9LAorCXtBVURfRE4wX0ZSRVEsICAgICAgICAgICAgIDB4MDAwMDM1YTN9LAorCXtBVURfRE4yX0ZSRVEsICAgICAgICAgICAgIDB4MDAwMDI5Yzd9LAorCXtBVURfQ1JEQzBfU1JDX1NFTCwgICAgICAgIDB4MDAwMDA1MTF9LAorCXtBVURfSUlSMV8wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDF9LAorCXtBVURfSUlSMV8xX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfSUlSM18yX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDN9LAorCXtBVURfSUlSM18yX1NISUZULCAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfSUlSM18wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMDJ9LAorCXtBVURfSUlSMl8wX1NFTCwgICAgICAgICAgIDB4MDAwMDAwMjF9LAorCXtBVURfSUlSMl8wX1NISUZULCAgICAgICAgIDB4MDAwMDAwMDJ9LAorCXtBVURfREVFTVBIMF9TUkNfU0VMLCAgICAgIDB4MDAwMDAwMGJ9LAorCXtBVURfREVFTVBIMV9TUkNfU0VMLCAgICAgIDB4MDAwMDAwMGJ9LAorCXtBVURfUE9MWVBIODBTQ0FMRUZBQywgICAgIDB4MDAwMDAwMDF9LAorCXtBVURfU1RBUlRfVElNRVIsICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKICAgICAgICB9OwogCiAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBwYWxfaV9uaWNhbVtdID0gewotICAgICAgICAgICB7IEFVRF9SQVRFX0FESjEsICAgICAgICAgICAweDAwMDAwMDEwIH0sCi0gICAgICAgICAgIHsgQVVEX1JBVEVfQURKMiwgICAgICAgICAgIDB4MDAwMDAwNDAgfSwKLSAgICAgICAgICAgeyBBVURfUkFURV9BREozLCAgICAgICAgICAgMHgwMDAwMDEwMCB9LAotICAgICAgICAgICB7IEFVRF9SQVRFX0FESjQsICAgICAgICAgICAweDAwMDAwNDAwIH0sCi0gICAgICAgICAgIHsgQVVEX1JBVEVfQURKNSwgICAgICAgICAgIDB4MDAwMDEwMDAgfSwKLQkgICAvLyAgICAgeyBBVURfRE1EX1JBX0REUywgICAgICAgICAgMHgwMGMwZDVjZSB9LAotCSAgIHsgQVVEX0RFRU1QSEdBSU5fUiwgICAgICAgIDB4MDAwMDIzYzIgfSwKLQkgICB7IEFVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAweDAwMDJhN2JjIH0sCi0JICAgeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDAzMDIzZSB9LAotCSAgIHsgQVVEX0RFRU1QSERFTk9NMV9SLCAgICAgIDB4MDAwMGYzZDAgfSwKLQkgICB7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCi0JICAgeyBBVURfREVFTVBIREVOT00yX1IsICAgICAgMHgwMDAwMDAwMCB9LAotCSAgIHsgQVVEX0VSUkxPR1BFUklPRF9SLCAgICAgIDB4MDAwMDBmZmYgfSwKLQkgICB7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAweDAwMDAwM2ZmIH0sCi0JICAgeyBBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgMHgwMDAwMDBmZiB9LAotCSAgIHsgQVVEX0VSUklOVFJQVFRIU0hMRDNfUiwgIDB4MDAwMDAwM2YgfSwKLQkgICB7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAweDAwMDAwMDAzIH0sCi0JICAgeyBBVURfUERGX0REU19DTlNUX0JZVEUyLCAgMHgwNiB9LAotCSAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgIDB4ODIgfSwKLQkgICB7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDE2IH0sCi0JICAgeyBBVURfUUFNX01PREUsICAgICAgICAgICAgMHgwNSB9LAotCSAgIHsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTIgfSwKLQkgICB7IEFVRF9QSEFDQ19GUkVRXzhNU0IsICAgICAweDNhIH0sCi0JICAgeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgMHg5MyB9LAotICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAotICAgICAgICB9OworCXsgQVVEX1JBVEVfQURKMSwgICAgICAgICAgIDB4MDAwMDAwMTAgfSwKKwl7IEFVRF9SQVRFX0FESjIsICAgICAgICAgICAweDAwMDAwMDQwIH0sCisJeyBBVURfUkFURV9BREozLCAgICAgICAgICAgMHgwMDAwMDEwMCB9LAorCXsgQVVEX1JBVEVfQURKNCwgICAgICAgICAgIDB4MDAwMDA0MDAgfSwKKwl7IEFVRF9SQVRFX0FESjUsICAgICAgICAgICAweDAwMDAxMDAwIH0sCisJLy8gICAgIHsgQVVEX0RNRF9SQV9ERFMsICAgICAgICAgIDB4MDBjMGQ1Y2UgfSwKKwl7IEFVRF9ERUVNUEhHQUlOX1IsICAgICAgICAweDAwMDAyM2MyIH0sCisJeyBBVURfREVFTVBITlVNRVIxX1IsICAgICAgMHgwMDAyYTdiYyB9LAorCXsgQVVEX0RFRU1QSE5VTUVSMl9SLCAgICAgIDB4MDAwMzAyM2UgfSwKKwl7IEFVRF9ERUVNUEhERU5PTTFfUiwgICAgICAweDAwMDBmM2QwIH0sCisJeyBBVURfREVFTVBIREVOT00yX1IsICAgICAgMHgwMDAwMDAwMCB9LAorCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMDAwMDAgfSwKKwl7IEFVRF9FUlJMT0dQRVJJT0RfUiwgICAgICAweDAwMDAwZmZmIH0sCisJeyBBVURfRVJSSU5UUlBUVEhTSExEMV9SLCAgMHgwMDAwMDNmZiB9LAorCXsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgIDB4MDAwMDAwZmYgfSwKKwl7IEFVRF9FUlJJTlRSUFRUSFNITEQzX1IsICAweDAwMDAwMDNmIH0sCisJeyBBVURfUE9MWVBIODBTQ0FMRUZBQywgICAgMHgwMDAwMDAwMyB9LAorCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgIDB4MDYgfSwKKwl7IEFVRF9QREZfRERTX0NOU1RfQllURTEsICAweDgyIH0sCisJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgMHgxNiB9LAorCXsgQVVEX1FBTV9NT0RFLCAgICAgICAgICAgIDB4MDUgfSwKKwl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDEyIH0sCisJeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgMHgzYSB9LAorCXsgQVVEX1BIQUNDX0ZSRVFfOExTQiwgICAgIDB4OTMgfSwKKwl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJfTsKIAotICAgICAgICBkcHJpbnRrKCIlcyAoc3RhdHVzOiBkZXZlbCksIHN0ZXJlbyA6ICVkXG4iLF9fRlVOQ1RJT05fXyxzdGVyZW8pOworCWRwcmludGsoIiVzIChzdGF0dXM6IGRldmVsKSwgc3RlcmVvIDogJWRcbiIsX19GVU5DVElPTl9fLHN0ZXJlbyk7CiAKLSAgICAgICAgaWYgKCFzdGVyZW8pIHsKLQkJLy8gRk0gbW9ubwotCQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDA0LCBFTl9ETVRSWF9TVU1ESUZGIHwgRU5fQTJfRk9SQ0VfTU9OTzEpOworCWlmICghc3RlcmVvKSB7CisJLyogRk0gTW9ubyAqLworCXNldF9hdWRpb19zdGFydChjb3JlLCBTRUxfQTIpOwogCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIHBhbF9pX2ZtX21vbm8pOwotICAgICAgICB9IGVsc2UgewotCQkvLyBOaWNhbSBTdGVyZW8KLQkJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAxMCwgRU5fRE1UUlhfTFIgfCBFTl9ETVRSWF9CWVBBU1MgfCBFTl9OSUNBTV9BVVRPX1NURVJFTyk7CisJCXNldF9hdWRpb19maW5pc2goY29yZSwgRU5fRE1UUlhfU1VNRElGRiB8IEVOX0EyX0ZPUkNFX01PTk8xKTsKKwl9IGVsc2UgeworCS8qIE5pY2FtIFN0ZXJlbyAqLworCXNldF9hdWRpb19zdGFydChjb3JlLCBTRUxfTklDQU0pOwogCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIHBhbF9pX25pY2FtKTsKLSAgICAgICAgfQotICAgICAgICBzZXRfYXVkaW9fZmluaXNoKGNvcmUpOworCQlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIEVOX0RNVFJYX0xSIHwgRU5fRE1UUlhfQllQQVNTIHwgRU5fTklDQU1fQVVUT19TVEVSRU8pOworCX0KIH0KIAotc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0EyKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCitzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfQTIoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIG1vZGUpCiB7Ci0JLyogZnJvbSBkc2NhbGVyIGN2cyAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfY29tbW9uW10gPSB7Ci0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgICAgIDB4MDYgfSwKLQkJeyBBVURfUERGX0REU19DTlNUX0JZVEUxLCAgICAgMHg4MiB9LAotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAgICAweDEyIH0sCi0JCXsgQVVEX1FBTV9NT0RFLAkJICAgICAgMHgwNSB9LAotCQl7IEFVRF9QSEFDQ19GUkVRXzhNU0IsCSAgICAgIDB4MzQgfSwKLQkJeyBBVURfUEhBQ0NfRlJFUV84TFNCLAkgICAgICAweDRjIH0sCisJe0FVRF9FUlJMT0dQRVJJT0RfUiwgICAgICAgICAgICAweDAwMDAwMDY0fSwKKwl7QVVEX0VSUklOVFJQVFRIU0hMRDFfUiwgICAgICAgIDB4MDAwMDBmZmZ9LAorCXtBVURfRVJSSU5UUlBUVEhTSExEMl9SLCAgICAgICAgMHgwMDAwMDAxZn0sCisJe0FVRF9FUlJJTlRSUFRUSFNITEQzX1IsICAgICAgICAweDAwMDAwMDBmfSwKKwl7QVVEX1BERl9ERFNfQ05TVF9CWVRFMiwgICAgICAgIDB4MDZ9LAorCXtBVURfUERGX0REU19DTlNUX0JZVEUxLCAgICAgICAgMHg4Mn0sCisJe0FVRF9QREZfRERTX0NOU1RfQllURTAsICAgICAgICAweDEyfSwKKwl7QVVEX1FBTV9NT0RFLCAgICAgICAgICAgICAgICAgIDB4MDV9LAorCXtBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgICAgICAgMHgzNH0sCisJe0FVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAgICAgICAweDRjfSwKKwl7QVVEX1JBVEVfQURKMSwgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDB9LAorCXtBVURfUkFURV9BREoyLCAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMH0sCisJe0FVRF9SQVRFX0FESjMsICAgICAgICAgICAgICAgICAweDAwMDAwMzAwfSwKKwl7QVVEX1JBVEVfQURKNCwgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDB9LAorCXtBVURfUkFURV9BREo1LCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMH0sCisJe0FVRF9USFJfRlIsICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwfSwKKwl7QUFHQ19IWVNULCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWF9LAorCXtBVURfUElMT1RfQlFEXzFfSzAsICAgICAgICAgICAgMHgwMDAwNzU1Yn0sCisJe0FVRF9QSUxPVF9CUURfMV9LMSwgICAgICAgICAgICAweDAwNTUxMzQwfSwKKwl7QVVEX1BJTE9UX0JRRF8xX0syLCAgICAgICAgICAgIDB4MDA2ZDMwYmV9LAorCXtBVURfUElMT1RfQlFEXzFfSzMsICAgICAgICAgICAgMHhmZmQzOTRhZn0sCisJe0FVRF9QSUxPVF9CUURfMV9LNCwgICAgICAgICAgICAweDAwNDAwMDAwfSwKKwl7QVVEX1BJTE9UX0JRRF8yX0swLCAgICAgICAgICAgIDB4MDAwNDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzEsICAgICAgICAgICAgMHgwMDJhNDg0MX0sCisJe0FVRF9QSUxPVF9CUURfMl9LMiwgICAgICAgICAgICAweDAwNDAwMDAwfSwKKwl7QVVEX1BJTE9UX0JRRF8yX0szLCAgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfUElMT1RfQlFEXzJfSzQsICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9NT0RFX0NIR19USU1FUiwgICAgICAgICAgICAweDAwMDAwMDQwfSwKKwl7QVVEX0FGRV8xMkRCX0VOLCAgICAgICAgICAgICAgIDB4MDAwMDAwMDF9LAorCXtBVURfQ09SRElDX1NISUZUXzAsICAgICAgICAgICAgMHgwMDAwMDAwN30sCisJe0FVRF9DT1JESUNfU0hJRlRfMSwgICAgICAgICAgICAweDAwMDAwMDA3fSwKKwl7QVVEX0RFRU1QSDBfRzAsICAgICAgICAgICAgICAgIDB4MDAwMDAzODB9LAorCXtBVURfREVFTVBIMV9HMCwgICAgICAgICAgICAgICAgMHgwMDAwMDM4MH0sCisJe0FVRF9EQ09DXzBfU1JDLCAgICAgICAgICAgICAgICAweDAwMDAwMDFhfSwKKwl7QVVEX0RDT0MwX1NISUZULCAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfRENPQ18wX1NISUZUX0lOMCwgICAgICAgICAgMHgwMDAwMDAwYX0sCisJe0FVRF9EQ09DXzBfU0hJRlRfSU4xLCAgICAgICAgICAweDAwMDAwMDA4fSwKKwl7QVVEX0RDT0NfUEFTU19JTiwgICAgICAgICAgICAgIDB4MDAwMDAwMDN9LAorCXtBVURfSUlSM18wX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAyMX0sCisJe0FVRF9ETjJfQUZDLCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyfSwKKwl7QVVEX0RDT0NfMV9TUkMsICAgICAgICAgICAgICAgIDB4MDAwMDAwMWJ9LAorCXtBVURfRENPQzFfU0hJRlQsICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9EQ09DXzFfU0hJRlRfSU4wLCAgICAgICAgICAweDAwMDAwMDBhfSwKKwl7QVVEX0RDT0NfMV9TSElGVF9JTjEsICAgICAgICAgIDB4MDAwMDAwMDh9LAorCXtBVURfSUlSM18xX1NFTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAyM30sCisJe0FVRF9SRFNJX1NFTCwgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3fSwKKwl7QVVEX1JEU0lfU0hJRlQsICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9LAorCXtBVURfUkRTUV9TRUwsICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxN30sCisJe0FVRF9SRFNRX1NISUZULCAgICAgICAgICAgICAgICAweDAwMDAwMDAwfSwKKwl7QVVEX1BMTF9JTlQsICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWV9LAorCXtBVURfUExMX0REUywgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJe0FVRF9QTExfRlJBQywgICAgICAgICAgICAgICAgICAweDAwMDBlNTQyfSwKKwl7QVVEX1BPTFlQSDgwU0NBTEVGQUMsICAgICAgICAgIDB4MDAwMDAwMDF9LAorCXtBVURfU1RBUlRfVElNRVIsICAgICAgICAgICAgICAgMHgwMDAwMDAwMH0sCisJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CiAKLQkJeyBBVURfUkFURV9BREoxLAkweDAwMDAxMDAwIH0sCi0JCXsgQVVEX1JBVEVfQURKMiwJMHgwMDAwMjAwMCB9LAotCQl7IEFVRF9SQVRFX0FESjMsCTB4MDAwMDMwMDAgfSwKLQkJeyBBVURfUkFURV9BREo0LAkweDAwMDA0MDAwIH0sCi0JCXsgQVVEX1JBVEVfQURKNSwJMHgwMDAwNTAwMCB9LAotCQl7IEFVRF9USFJfRlIsCQkweDAwMDAwMDAwIH0sCi0JCXsgQUFHQ19IWVNULAkJMHgwMDAwMDAxYSB9LAotCQl7IEFVRF9QSUxPVF9CUURfMV9LMCwJMHgwMDAwNzU1YiB9LAotCQl7IEFVRF9QSUxPVF9CUURfMV9LMSwJMHgwMDU1MTM0MCB9LAotCQl7IEFVRF9QSUxPVF9CUURfMV9LMiwJMHgwMDZkMzBiZSB9LAotCQl7IEFVRF9QSUxPVF9CUURfMV9LMywJMHhmZmQzOTRhZiB9LAotCQl7IEFVRF9QSUxPVF9CUURfMV9LNCwJMHgwMDQwMDAwMCB9LAotCQl7IEFVRF9QSUxPVF9CUURfMl9LMCwJMHgwMDA0MDAwMCB9LAotCQl7IEFVRF9QSUxPVF9CUURfMl9LMSwJMHgwMDJhNDg0MSB9LAotCQl7IEFVRF9QSUxPVF9CUURfMl9LMiwJMHgwMDQwMDAwMCB9LAotCQl7IEFVRF9QSUxPVF9CUURfMl9LMywJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9QSUxPVF9CUURfMl9LNCwJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9NT0RFX0NIR19USU1FUiwJMHgwMDAwMDA0MCB9LAotCQl7IEFVRF9TVEFSVF9USU1FUiwJMHgwMDAwMDIwMCB9LAotCQl7IEFVRF9BRkVfMTJEQl9FTiwJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9DT1JESUNfU0hJRlRfMCwJMHgwMDAwMDAwNyB9LAotCQl7IEFVRF9DT1JESUNfU0hJRlRfMSwJMHgwMDAwMDAwNyB9LAotCQl7IEFVRF9ERUVNUEgwX0cwLAkweDAwMDAwMzgwIH0sCi0JCXsgQVVEX0RFRU1QSDFfRzAsCTB4MDAwMDAzODAgfSwKLQkJeyBBVURfRENPQ18wX1NSQywJMHgwMDAwMDAxYSB9LAotCQl7IEFVRF9EQ09DMF9TSElGVCwJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9EQ09DXzBfU0hJRlRfSU4wLAkweDAwMDAwMDBhIH0sCi0JCXsgQVVEX0RDT0NfMF9TSElGVF9JTjEsCTB4MDAwMDAwMDggfSwKLQkJeyBBVURfRENPQ19QQVNTX0lOLAkweDAwMDAwMDAzIH0sCi0JCXsgQVVEX0lJUjNfMF9TRUwsCTB4MDAwMDAwMjEgfSwKLQkJeyBBVURfRE4yX0FGQywJCTB4MDAwMDAwMDIgfSwKLQkJeyBBVURfRENPQ18xX1NSQywJMHgwMDAwMDAxYiB9LAotCQl7IEFVRF9EQ09DMV9TSElGVCwJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9EQ09DXzFfU0hJRlRfSU4wLAkweDAwMDAwMDBhIH0sCi0JCXsgQVVEX0RDT0NfMV9TSElGVF9JTjEsCTB4MDAwMDAwMDggfSwKLQkJeyBBVURfSUlSM18xX1NFTCwJMHgwMDAwMDAyMyB9LAotCQl7IEFVRF9SRFNJX1NFTCwJCTB4MDAwMDAwMTcgfSwKLQkJeyBBVURfUkRTSV9TSElGVCwJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9SRFNRX1NFTCwJCTB4MDAwMDAwMTcgfSwKLQkJeyBBVURfUkRTUV9TSElGVCwJMHgwMDAwMDAwMCB9LAotCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLAkweDAwMDAwMDAxIH0sCi0KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGEyX2JnW10gPSB7CisJe0FVRF9ETURfUkFfRERTLCAgICAgICAgICAgICAgICAweDAwMmE0ZjJmfSwKKwl7QVVEX0MxX1VQX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDcwMDB9LAorCXtBVURfQzFfTE9fVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwNTQwMH0sCisJe0FVRF9DMl9VUF9USFIsICAgICAgICAgICAgICAgICAweDAwMDA1NDAwfSwKKwl7QVVEX0MyX0xPX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDMwMDB9LAogCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiAJfTsKIAotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfdGFibGUxW10gPSB7Ci0JCS8vIFBBTC1CRwotCQl7IEFVRF9ETURfUkFfRERTLAkweDAwMmE3M2JkIH0sCi0JCXsgQVVEX0MxX1VQX1RIUiwJMHgwMDAwNzAwMCB9LAotCQl7IEFVRF9DMV9MT19USFIsCTB4MDAwMDU0MDAgfSwKLQkJeyBBVURfQzJfVVBfVEhSLAkweDAwMDA1NDAwIH0sCi0JCXsgQVVEX0MyX0xPX1RIUiwJMHgwMDAwMzAwMCB9LAorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfZGtbXSA9IHsKKwl7QVVEX0RNRF9SQV9ERFMsICAgICAgICAgICAgICAgIDB4MDAyYTRmMmZ9LAorCXtBVURfQzFfVVBfVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwNzAwMH0sCisJe0FVRF9DMV9MT19USFIsICAgICAgICAgICAgICAgICAweDAwMDA1NDAwfSwKKwl7QVVEX0MyX1VQX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDU0MDB9LAorCXtBVURfQzJfTE9fVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwMzAwMH0sCisJe0FVRF9ETjBfRlJFUSwgICAgICAgICAgICAgICAgICAweDAwMDAzYTFjfSwKKwl7QVVEX0ROMl9GUkVRLCAgICAgICAgICAgICAgICAgIDB4MDAwMGQyZTB9LAogCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiAJfTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGEyX3RhYmxlMltdID0gewotCQkvLyBQQUwtREsKLQkJeyBBVURfRE1EX1JBX0REUywJMHgwMDJhNzNiZCB9LAotCQl7IEFVRF9DMV9VUF9USFIsCTB4MDAwMDcwMDAgfSwKLQkJeyBBVURfQzFfTE9fVEhSLAkweDAwMDA1NDAwIH0sCi0JCXsgQVVEX0MyX1VQX1RIUiwJMHgwMDAwNTQwMCB9LAotCQl7IEFVRF9DMl9MT19USFIsCTB4MDAwMDMwMDAgfSwKLQkJeyBBVURfRE4wX0ZSRVEsCQkweDAwMDAzYTFjIH0sCi0JCXsgQVVEX0ROMl9GUkVRLAkJMHgwMDAwZDJlMCB9LAotCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0JfTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGEyX3RhYmxlM1tdID0gewotCQkvLyB1bmtub3duLCBwcm9iYWJseSBOVFNDLU0KLQkJeyBBVURfRE1EX1JBX0REUywJMHgwMDJhMjg3MyB9LAotCQl7IEFVRF9DMV9VUF9USFIsCTB4MDAwMDNjMDAgfSwKLQkJeyBBVURfQzFfTE9fVEhSLAkweDAwMDAzMDAwIH0sCi0JCXsgQVVEX0MyX1VQX1RIUiwJMHgwMDAwNjAwMCB9LAotCQl7IEFVRF9DMl9MT19USFIsCTB4MDAwMDNjMDAgfSwKLQkJeyBBVURfRE4wX0ZSRVEsCQkweDAwMDAyODM2IH0sCi0JCXsgQVVEX0ROMV9GUkVRLAkJMHgwMDAwMzQxOCB9LAotCQl7IEFVRF9ETjJfRlJFUSwJCTB4MDAwMDI5YzcgfSwKLQkJeyBBVURfUE9MWTBfRERTX0NPTlNUQU5ULCAweDAwMGE3NTQwIH0sCisvKiB1bmtub3duLCBwcm9iYWJseSBOVFNDLU0gKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGEyX21bXSA9IHsKKwl7QVVEX0RNRF9SQV9ERFMsICAgICAgICAgICAgICAgIDB4MDAyYTA0MjV9LAorCXtBVURfQzFfVVBfVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwM2MwMH0sCisJe0FVRF9DMV9MT19USFIsICAgICAgICAgICAgICAgICAweDAwMDAzMDAwfSwKKwl7QVVEX0MyX1VQX1RIUiwgICAgICAgICAgICAgICAgIDB4MDAwMDYwMDB9LAorCXtBVURfQzJfTE9fVEhSLCAgICAgICAgICAgICAgICAgMHgwMDAwM2MwMH0sCisJe0FVRF9ERUVNUEgwX0EwLCAgICAgICAgICAgICAgICAweDAwMDA3YTgwfSwKKwl7QVVEX0RFRU1QSDFfQTAsICAgICAgICAgICAgICAgIDB4MDAwMDdhODB9LAorCXtBVURfREVFTVBIMF9HMCwgICAgICAgICAgICAgICAgMHgwMDAwMTIwMH0sCisJe0FVRF9ERUVNUEgxX0cwLCAgICAgICAgICAgICAgICAweDAwMDAxMjAwfSwKKwl7QVVEX0ROMF9GUkVRLCAgICAgICAgICAgICAgICAgIDB4MDAwMDI4M2J9LAorCXtBVURfRE4xX0ZSRVEsICAgICAgICAgICAgICAgICAgMHgwMDAwMzQxOH0sCisJe0FVRF9ETjJfRlJFUSwgICAgICAgICAgICAgICAgICAweDAwMDAyOWM3fSwKKwl7QVVEX1BPTFkwX0REU19DT05TVEFOVCwgICAgICAgIDB4MDAwYTc1NDB9LAogCQl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiAJfTsKIAotCXNldF9hdWRpb19zdGFydChjb3JlLCAweDAwMDQsIEVOX0RNVFJYX1NVTURJRkYgfCBFTl9BMl9BVVRPX1NURVJFTyk7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBhMl9kZWVtcGg1MFtdID0geworCXtBVURfREVFTVBIMF9HMCwgICAgICAgICAgICAgICAgMHgwMDAwMDM4MH0sCisJe0FVRF9ERUVNUEgxX0cwLCAgICAgICAgICAgICAgICAweDAwMDAwMzgwfSwKKwl7QVVEX0RFRU1QSEdBSU5fUiwgICAgICAgICAgICAgIDB4MDAwMDExZTF9LAorCXtBVURfREVFTVBITlVNRVIxX1IsICAgICAgICAgICAgMHgwMDAyYTdiY30sCisJe0FVRF9ERUVNUEhOVU1FUjJfUiwgICAgICAgICAgICAweDAwMDMwMjNjfSwKKwl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCisJfTsKKworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgYTJfZGVlbXBoNzVbXSA9IHsKKwl7QVVEX0RFRU1QSDBfRzAsICAgICAgICAgICAgICAgIDB4MDAwMDA0ODB9LAorCXtBVURfREVFTVBIMV9HMCwgICAgICAgICAgICAgICAgMHgwMDAwMDQ4MH0sCisJe0FVRF9ERUVNUEhHQUlOX1IsICAgICAgICAgICAgICAweDAwMDA5MDAwfSwKKwl7QVVEX0RFRU1QSE5VTUVSMV9SLCAgICAgICAgICAgIDB4MDAwMzUzZGV9LAorCXtBVURfREVFTVBITlVNRVIyX1IsICAgICAgICAgICAgMHgwMDAwMDFiMX0sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OworCisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9BMik7CiAJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl9jb21tb24pOwogCXN3aXRjaCAoY29yZS0+dHZhdWRpbykgewogCWNhc2UgV1dfQTJfQkc6CiAJCWRwcmludGsoIiVzIFBBTC1CRyBBMiAoc3RhdHVzOiBrbm93bi1nb29kKVxuIixfX0ZVTkNUSU9OX18pOwotCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX3RhYmxlMSk7CisJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl9iZyk7CisJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl9kZWVtcGg1MCk7CiAJCWJyZWFrOwogCWNhc2UgV1dfQTJfREs6CiAJCWRwcmludGsoIiVzIFBBTC1ESyBBMiAoc3RhdHVzOiBrbm93bi1nb29kKVxuIixfX0ZVTkNUSU9OX18pOwotCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX3RhYmxlMik7CisJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl9kayk7CisJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBhMl9kZWVtcGg1MCk7CiAJCWJyZWFrOwogCWNhc2UgV1dfQTJfTToKIAkJZHByaW50aygiJXMgTlRTQy1NIEEyIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYTJfdGFibGUzKTsKKwlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGEyX20pOworCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgYTJfZGVlbXBoNzUpOwogCQlicmVhazsKIAl9OwotCXNldF9hdWRpb19maW5pc2goY29yZSk7CisKKwltb2RlIHw9IEVOX0ZNUkFESU9fRU5fUkRTIHwgRU5fRE1UUlhfU1VNRElGRjsKKwlzZXRfYXVkaW9fZmluaXNoKGNvcmUsIG1vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfRUlBSihzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQpAQCAtNjM1LDkgKzY1OCw5IEBACiAJfTsKIAlkcHJpbnRrKCIlcyAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOwogCi0Jc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIDB4MDAwMiwgRU5fRUlBSl9BVVRPX1NURVJFTyk7CisJc2V0X2F1ZGlvX3N0YXJ0KGNvcmUsIFNFTF9FSUFKKTsKIAlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGVpYWopOwotCXNldF9hdWRpb19maW5pc2goY29yZSk7CisJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlLCBFTl9FSUFKX0FVVE9fU1RFUkVPKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0ZNKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGVudW0gY3g4OF9kZWVtcGhfdHlwZSBkZWVtcGgpCkBAIC02ODMsNyArNzA2LDcgQEAKIAl9OwogCiAJZHByaW50aygiJXMgKHN0YXR1czogdW5rbm93bilcbiIsX19GVU5DVElPTl9fKTsKLQlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDIwLCBFTl9GTVJBRElPX0FVVE9fU1RFUkVPKTsKKwlzZXRfYXVkaW9fc3RhcnQoY29yZSwgU0VMX0ZNUkFESU8pOwogCiAJc3dpdGNoIChkZWVtcGgpCiAJewpAQCAtNzAwLDcgKzcyMyw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlzZXRfYXVkaW9fZmluaXNoKGNvcmUpOworCXNldF9hdWRpb19maW5pc2goY29yZSwgRU5fRk1SQURJT19BVVRPX1NURVJFTyk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03MDksNyArNzMyLDcgQEAKIHsKIAlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKIAljYXNlIFdXX0JUU0M6Ci0JCXNldF9hdWRpb19zdGFuZGFyZF9CVFNDKGNvcmUsMCk7CisJCXNldF9hdWRpb19zdGFuZGFyZF9CVFNDKGNvcmUsIDAsIEVOX0JUU0NfQVVUT19TVEVSRU8pOwogCQlicmVhazsKIAljYXNlIFdXX05JQ0FNX0JHREtMOgogCQlzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU1fTChjb3JlLDApOwpAQCAtNzIwLDcgKzc0Myw3IEBACiAJY2FzZSBXV19BMl9CRzoKIAljYXNlIFdXX0EyX0RLOgogCWNhc2UgV1dfQTJfTToKLQkJc2V0X2F1ZGlvX3N0YW5kYXJkX0EyKGNvcmUpOworCXNldF9hdWRpb19zdGFuZGFyZF9BMihjb3JlLCBFTl9BMl9GT1JDRV9NT05PMSk7CiAJCWJyZWFrOwogCWNhc2UgV1dfRUlBSjoKIAkJc2V0X2F1ZGlvX3N0YW5kYXJkX0VJQUooY29yZSk7CkBAIC03MzQsNyArNzU3LDcgQEAKIAljYXNlIFdXX05PTkU6CiAJZGVmYXVsdDoKIAkJcHJpbnRrKCIlcy8wOiB1bmtub3duIHR2IGF1ZGlvIG1vZGUgWyVkXVxuIiwKLQkJICAgICAgIGNvcmUtPm5hbWUsIGNvcmUtPnR2YXVkaW8pOworCQljb3JlLT5uYW1lLCBjb3JlLT50dmF1ZGlvKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybjsKQEAgLTc2OSw2ICs3OTIsMTMgQEAKIAkJCWF1ZF9jdGxfbmFtZXNbY3hfcmVhZChBVURfQ1RMKSAmIDYzXSk7CiAJY29yZS0+YXN0YXQgPSByZWc7CiAKKy8qIFRPRE8KKyAgICAgICBSZWFkaW5nIGZyb20gQVVEX1NUQVRVUyBpcyBub3QgZW5vdWdoCisgICAgICAgZm9yIGF1dG8tZGV0ZWN0aW5nIHNhcC9kdWFsLWZtL25pY2FtLgorICAgICAgIEFkZCBzb21lIGNvZGUgaGVyZSBsYXRlci4KKyovCisKKyMgaWYgMAogCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfCBWNEwyX1RVTkVSX0NBUF9TQVAgfAogCQlWNEwyX1RVTkVSX0NBUF9MQU5HMSB8IFY0TDJfVFVORVJfQ0FQX0xBTkcyOwogCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwpAQCAtNzc5LDcgKzgwOSw3IEBACiAJCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAogCQkJVjRMMl9UVU5FUl9DQVBfU0FQOwogCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotIAkJaWYgKDEgPT0gcGlsb3QpIHsKKwkJaWYgKDEgPT0gcGlsb3QpIHsKIAkJCS8qIFNBUCAqLwogCQkJdC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TQVA7CiAJCX0KQEAgLTc4NywxMyArODE3LDEzIEBACiAJY2FzZSBXV19BMl9CRzoKIAljYXNlIFdXX0EyX0RLOgogCWNhc2UgV1dfQTJfTToKLSAJCWlmICgxID09IHBpbG90KSB7CisJCWlmICgxID09IHBpbG90KSB7CiAJCQkvKiBzdGVyZW8gKi8KIAkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwogCQkJaWYgKDAgPT0gbW9kZSkKIAkJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAkJfQotIAkJaWYgKDIgPT0gcGlsb3QpIHsKKwkJaWYgKDIgPT0gcGlsb3QpIHsKIAkJCS8qIGR1YWwgbGFuZ3VhZ2UgLS0gRklYTUUgKi8KIAkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOwogCQkJdC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKQEAgLTgwNSwxNiArODM1LDE3IEBACiAJCQl0LT5yeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKIAkJfQogCQlicmVhazsKLSAgICAgICAgY2FzZSBXV19TWVNURU1fTF9BTToKLSAgICAgICAgICAgICAgICBpZiAoMHgwID09IG1vZGUgJiYgIShjeF9yZWFkKEFVRF9JTklUKSAmIDB4MDQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwljYXNlIFdXX1NZU1RFTV9MX0FNOgorCQlpZiAoMHgwID09IG1vZGUgJiYgIShjeF9yZWFkKEFVRF9JTklUKSAmIDB4MDQpKSB7CisJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAkJCXQtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwogCQl9Ci0gICAgICAgICAgICAgICAgYnJlYWsgOworCQlicmVhayA7CiAJZGVmYXVsdDoKIAkJLyogbm90aGluZyAqLwogCQlicmVhazsKIAl9CisjIGVuZGlmCiAJcmV0dXJuOwogfQogCkBAIC04MzUsMTYgKzg2NiwxNiBAQAogCWNhc2UgV1dfQlRTQzoKIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86Ci0JCQljdGwgID0gRU5fQlRTQ19GT1JDRV9NT05POwotCQkJbWFzayA9IDB4M2Y7CisJCQlzZXRfYXVkaW9fc3RhbmRhcmRfQlRTQyhjb3JlLCAwLCBFTl9CVFNDX0ZPUkNFX01PTk8pOwogCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NBUDoKLQkJCWN0bCAgPSBFTl9CVFNDX0ZPUkNFX1NBUDsKLQkJCW1hc2sgPSAweDNmOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwkJCXNldF9hdWRpb19zdGFuZGFyZF9CVFNDKGNvcmUsIDAsIEVOX0JUU0NfQVVUT19TVEVSRU8pOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgorCQkJc2V0X2F1ZGlvX3N0YW5kYXJkX0JUU0MoY29yZSwgMSwgRU5fQlRTQ19GT1JDRV9TQVApOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKLQkJCWN0bCAgPSBFTl9CVFNDX0FVVE9fU1RFUkVPOwotCQkJbWFzayA9IDB4M2Y7CisJCQlzZXRfYXVkaW9fc3RhbmRhcmRfQlRTQyhjb3JlLCAwLCBFTl9CVFNDX0ZPUkNFX1NURVJFTyk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTg1NCwxNiArODg1LDEzIEBACiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgogCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKLQkJCWN0bCAgPSBFTl9BMl9GT1JDRV9NT05PMTsKLQkJCW1hc2sgPSAweDNmOworCQlzZXRfYXVkaW9fc3RhbmRhcmRfQTIoY29yZSwgRU5fQTJfRk9SQ0VfTU9OTzEpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgotCQkJY3RsICA9IEVOX0EyX0FVVE9fTU9OTzI7Ci0JCQltYXNrID0gMHgzZjsKKwkJc2V0X2F1ZGlvX3N0YW5kYXJkX0EyKGNvcmUsIEVOX0EyX0ZPUkNFX01PTk8yKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86Ci0JCQljdGwgID0gRU5fQTJfQVVUT19TVEVSRU8gfCBFTl9ETVRSWF9TVU1SOwotCQkJbWFzayA9IDB4OGJmOworCQlzZXRfYXVkaW9fc3RhbmRhcmRfQTIoY29yZSwgRU5fQTJfRk9SQ0VfU1RFUkVPKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12YmkuYwppbmRleCAzMjBkNTc4Li45YmM2Yzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12YmkuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtdmJpLmMsdiAxLjE3IDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCA1ZjU4YzEwLi4zZGJjMDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBjeDg4LXZpZGVvLmMsdiAxLjgyIDIwMDUvMDcvMjIgMDU6MTM6MzQgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKQEAgLTY2LDcgKzY1LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0ModmlkX2xpbWl0LCJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKIAogI2RlZmluZSBkcHJpbnRrKGxldmVsLGZtdCwgYXJnLi4uKQlpZiAodmlkZW9fZGVidWcgPj0gbGV2ZWwpIFwKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMvMDogIiBmbXQsIGRldi0+Y29yZS0+bmFtZSAsICMjIGFyZykKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMvMDogIiBmbXQsIGNvcmUtPm5hbWUgLCAjIyBhcmcpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0zMjYsMjIgKzMyNSwyMyBAQAogCiBzdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCiB7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAlpZiAoZmgtPnJlc291cmNlcyAmIGJpdCkKIAkJLyogaGF2ZSBpdCBhbHJlYWR5IGFsbG9jYXRlZCAqLwogCQlyZXR1cm4gMTsKIAogCS8qIGlzIGl0IGZyZWU/ICovCi0JZG93bigmZGV2LT5sb2NrKTsKKwlkb3duKCZjb3JlLT5sb2NrKTsKIAlpZiAoZGV2LT5yZXNvdXJjZXMgJiBiaXQpIHsKIAkJLyogbm8sIHNvbWVvbmUgZWxzZSB1c2VzIGl0ICovCi0JCXVwKCZkZXYtPmxvY2spOworCQl1cCgmY29yZS0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIAkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KIAlmaC0+cmVzb3VyY2VzICB8PSBiaXQ7CiAJZGV2LT5yZXNvdXJjZXMgfD0gYml0OwogCWRwcmludGsoMSwicmVzOiBnZXQgJWRcbiIsYml0KTsKLQl1cCgmZGV2LT5sb2NrKTsKKwl1cCgmY29yZS0+bG9jayk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTM2MCwyNyArMzYwLDI5IEBACiBzdGF0aWMKIHZvaWQgcmVzX2ZyZWUoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXRzKQogeworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAJaWYgKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cykKIAkJQlVHKCk7CiAKLQlkb3duKCZkZXYtPmxvY2spOworCWRvd24oJmNvcmUtPmxvY2spOwogCWZoLT5yZXNvdXJjZXMgICY9IH5iaXRzOwogCWRldi0+cmVzb3VyY2VzICY9IH5iaXRzOwogCWRwcmludGsoMSwicmVzOiBwdXQgJWRcbiIsYml0cyk7Ci0JdXAoJmRldi0+bG9jayk7CisJdXAoJmNvcmUtPmxvY2spOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCB2aWRlb19tdXgoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQorLyogc3RhdGljIGludCB2aWRlb19tdXgoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KSAqLworc3RhdGljIGludCB2aWRlb19tdXgoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IGlucHV0KQogewotCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJLyogc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsgKi8KIAogCWRwcmludGsoMSwidmlkZW9fbXV4OiAlZCBbdm11eD0lZCxncGlvPTB4JXgsMHgleCwweCV4LDB4JXhdXG4iLAogCQlpbnB1dCwgSU5QVVQoaW5wdXQpLT52bXV4LAogCQlJTlBVVChpbnB1dCktPmdwaW8wLElOUFVUKGlucHV0KS0+Z3BpbzEsCiAJCUlOUFVUKGlucHV0KS0+Z3BpbzIsSU5QVVQoaW5wdXQpLT5ncGlvMyk7Ci0JZGV2LT5jb3JlLT5pbnB1dCA9IGlucHV0OworCWNvcmUtPmlucHV0ID0gaW5wdXQ7CiAJY3hfYW5kb3IoTU9fSU5QVVRfRk9STUFULCAweDAzIDw8IDE0LCBJTlBVVChpbnB1dCktPnZtdXggPDwgMTQpOwogCWN4X3dyaXRlKE1PX0dQM19JTywgSU5QVVQoaW5wdXQpLT5ncGlvMyk7CiAJY3hfd3JpdGUoTU9fR1AwX0lPLCBJTlBVVChpbnB1dCktPmdwaW8wKTsKQEAgLTQxMyw5ICs0MTUsOSBAQAogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAKIAkvKiBzZXR1cCBmaWZvICsgZm9ybWF0ICovCi0JY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoZGV2LT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0sCisJY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoY29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjFdLAogCQkJCWJ1Zi0+YnBsLCBidWYtPnJpc2MuZG1hKTsKLQljeDg4X3NldF9zY2FsZShkZXYtPmNvcmUsIGJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCBidWYtPnZiLmZpZWxkKTsKKwljeDg4X3NldF9zY2FsZShjb3JlLCBidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCwgYnVmLT52Yi5maWVsZCk7CiAJY3hfd3JpdGUoTU9fQ09MT1JfQ1RSTCwgYnVmLT5mbXQtPmN4Zm9ybWF0IHwgQ29sb3JGb3JtYXRHYW1tYSk7CiAKIAkvKiByZXNldCBjb3VudGVyICovCkBAIC00MjQsNiArNDI2LDE0IEBACiAKIAkvKiBlbmFibGUgaXJxcyAqLwogCWN4X3NldChNT19QQ0lfSU5UTVNLLCBjb3JlLT5wY2lfaXJxbWFzayB8IDB4MDEpOworCisJLyogRW5hYmxlcyBjb3JyZXNwb25kaW5nIGJpdHMgYXQgUENJX0lOVF9TVEFUOgorCQliaXRzIDAgdG8gNDogdmlkZW8sIGF1ZGlvLCB0cmFuc3BvcnQgc3RyZWFtLCBWSVAsIEhvc3QKKwkJYml0IDc6IHRpbWVyCisJCWJpdHMgOCBhbmQgOTogRE1BIGNvbXBsZXRlIGZvcjogU1JDLCBEU1QKKwkJYml0cyAxMCBhbmQgMTE6IEJFUlIgc2lnbmFsIGFzc2VydGVkIGZvciBSSVNDOiBSRCwgV1IKKwkJYml0cyAxMiB0byAxNTogQkVSUiBzaWduYWwgYXNzZXJ0ZWQgZm9yOiBCUkRHLCBTUkMsIERTVCwgSVBCCisJICovCiAJY3hfc2V0KE1PX1ZJRF9JTlRNU0ssIDB4MGYwMDExKTsKIAogCS8qIGVuYWJsZSBjYXB0dXJlICovCkBAIC00MzEsNyArNDQxLDcgQEAKIAogCS8qIHN0YXJ0IGRtYSAqLwogCWN4X3NldChNT19ERVZfQ05UUkwyLCAoMTw8NSkpOwotCWN4X3NldChNT19WSURfRE1BQ05UUkwsIDB4MTEpOworCWN4X3NldChNT19WSURfRE1BQ05UUkwsIDB4MTEpOyAvKiBQbGFuYXIgWSBhbmQgcGFja2VkIEZJRk8gYW5kIFJJU0MgZW5hYmxlICovCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1NSw2ICs0NjUsNyBAQAogc3RhdGljIGludCByZXN0YXJ0X3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGN4ODhfZG1hcXVldWUgKnEpCiB7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZiwgKnByZXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKIApAQCAtNTI0LDEyICs1MzUsMTMgQEAKIHsKIAlzdHJ1Y3QgY3g4ODAwX2ZoICAgKmZoICA9IHEtPnByaXZfZGF0YTsKIAlzdHJ1Y3QgY3g4ODAwX2RldiAgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2YixzdHJ1Y3QgY3g4OF9idWZmZXIsdmIpOwogCWludCByYywgaW5pdF9idWZmZXIgPSAwOwogCiAJQlVHX09OKE5VTEwgPT0gZmgtPmZtdCk7Ci0JaWYgKGZoLT53aWR0aCAgPCA0OCB8fCBmaC0+d2lkdGggID4gbm9ybV9tYXh3KGRldi0+Y29yZS0+dHZub3JtKSB8fAotCSAgICBmaC0+aGVpZ2h0IDwgMzIgfHwgZmgtPmhlaWdodCA+IG5vcm1fbWF4aChkZXYtPmNvcmUtPnR2bm9ybSkpCisJaWYgKGZoLT53aWR0aCAgPCA0OCB8fCBmaC0+d2lkdGggID4gbm9ybV9tYXh3KGNvcmUtPnR2bm9ybSkgfHwKKwkgICAgZmgtPmhlaWdodCA8IDMyIHx8IGZoLT5oZWlnaHQgPiBub3JtX21heGgoY29yZS0+dHZub3JtKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJYnVmLT52Yi5zaXplID0gKGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKIAlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICAmJiAgYnVmLT52Yi5ic2l6ZSA8IGJ1Zi0+dmIuc2l6ZSkKQEAgLTYwOSw2ICs2MjEsNyBAQAogCXN0cnVjdCBjeDg4X2J1ZmZlciAgICAqcHJldjsKIAlzdHJ1Y3QgY3g4ODAwX2ZoICAgICAgKmZoICAgPSB2cS0+cHJpdl9kYXRhOwogCXN0cnVjdCBjeDg4MDBfZGV2ICAgICAqZGV2ICA9IGZoLT5kZXY7CisJc3RydWN0IGN4ODhfY29yZSAgICAgICpjb3JlID0gZGV2LT5jb3JlOwogCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAqcSAgICA9ICZkZXYtPnZpZHE7CiAKIAkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCkBAIC03MDEsNiArNzE0LDcgQEAKIHsKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCXN0cnVjdCBjeDg4MDBfZGV2ICpoLCpkZXYgPSBOVUxMOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CiAJc3RydWN0IGN4ODgwMF9maCAqZmg7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CkBAIC03MjUsNiArNzM5LDggQEAKIAlpZiAoTlVMTCA9PSBkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCisJY29yZSA9IGRldi0+Y29yZTsKKwogCWRwcmludGsoMSwib3BlbiBtaW5vcj0lZCByYWRpbz0lZCB0eXBlPSVzXG4iLAogCQltaW5vcixyYWRpbyx2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwogCkBAIC03NTUsMTcgKzc3MSwxNiBAQAogCQkJICAgIGZoKTsKIAogCWlmIChmaC0+cmFkaW8pIHsKLQkJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAkJaW50IGJvYXJkID0gY29yZS0+Ym9hcmQ7CiAJCWRwcmludGsoMSwidmlkZW9fb3Blbjogc2V0dGluZyByYWRpbyBkZXZpY2VcbiIpOwogCQljeF93cml0ZShNT19HUDNfSU8sIGN4ODhfYm9hcmRzW2JvYXJkXS5yYWRpby5ncGlvMyk7CiAJCWN4X3dyaXRlKE1PX0dQMF9JTywgY3g4OF9ib2FyZHNbYm9hcmRdLnJhZGlvLmdwaW8wKTsKIAkJY3hfd3JpdGUoTU9fR1AxX0lPLCBjeDg4X2JvYXJkc1tib2FyZF0ucmFkaW8uZ3BpbzEpOwogCQljeF93cml0ZShNT19HUDJfSU8sIGN4ODhfYm9hcmRzW2JvYXJkXS5yYWRpby5ncGlvMik7Ci0JCWRldi0+Y29yZS0+dHZhdWRpbyA9IFdXX0ZNOworCQljb3JlLT50dmF1ZGlvID0gV1dfRk07CiAJCWN4ODhfc2V0X3R2YXVkaW8oY29yZSk7CiAJCWN4ODhfc2V0X3N0ZXJlbyhjb3JlLFY0TDJfVFVORVJfTU9ERV9TVEVSRU8sMSk7Ci0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsQVVEQ19TRVRfUkFESU8sTlVMTCk7CisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLEFVRENfU0VUX1JBRElPLE5VTEwpOwogCX0KIAogICAgICAgICByZXR1cm4gMDsKQEAgLTg1Nyw2ICs4NzIsOSBAQAogCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZiaXEpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAJa2ZyZWUoZmgpOworCisJY3g4OF9jYWxsX2kyY19jbGllbnRzIChkZXYtPmNvcmUsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKKwogCXJldHVybiAwOwogfQogCkBAIC04NzAsOSArODg4LDEwIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IGdldF9jb250cm9sKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKKy8qIHN0YXRpYyBpbnQgZ2V0X2NvbnRyb2woc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKSAqLworc3RhdGljIGludCBnZXRfY29udHJvbChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCiB7Ci0Jc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwkvKiBzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOyAqLwogCXN0cnVjdCBjeDg4X2N0cmwgKmMgPSBOVUxMOwogCXUzMiB2YWx1ZTsKIAlpbnQgaTsKQEAgLTg5OCw5ICs5MTcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZXRfY29udHJvbChzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCisvKiBzdGF0aWMgaW50IHNldF9jb250cm9sKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkgKi8KK3N0YXRpYyBpbnQgc2V0X2NvbnRyb2woc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQogewotCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJLyogc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsgKi8KIAlzdHJ1Y3QgY3g4OF9jdHJsICpjID0gTlVMTDsKICAgICAgICAgdTMyIHZfc2F0X3ZhbHVlOwogCXUzMiB2YWx1ZTsKQEAgLTkxMyw5ICs5MzMsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjdGwtPnZhbHVlIDwgYy0+di5taW5pbXVtKQotCQlyZXR1cm4gLUVSQU5HRTsKKwkJY3RsLT52YWx1ZSA9IGMtPnYubWluaW11bTsKIAlpZiAoY3RsLT52YWx1ZSA+IGMtPnYubWF4aW11bSkKLQkJcmV0dXJuIC1FUkFOR0U7CisJCWN0bC0+dmFsdWUgPSBjLT52Lm1heGltdW07CiAJc3dpdGNoIChjdGwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgogCQl2YWx1ZSA9IChjdGwtPnZhbHVlIDwgMHg0MCkgPyAoMHg0MCAtIGN0bC0+dmFsdWUpIDogY3RsLT52YWx1ZTsKQEAgLTk0Niw3ICs5NjYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X2NvbnRyb2xzKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYpCisvKiBzdGF0aWMgdm9pZCBpbml0X2NvbnRyb2xzKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYpICovCitzdGF0aWMgdm9pZCBpbml0X2NvbnRyb2xzKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCiB7CiAJc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgbXV0ZSA9IHsKIAkJLmlkICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKQEAgLTk2OSwxMSArOTkwLDExIEBACiAJCS52YWx1ZSA9IDB4ODAsCiAJfTsKIAotCXNldF9jb250cm9sKGRldiwmbXV0ZSk7Ci0Jc2V0X2NvbnRyb2woZGV2LCZ2b2x1bWUpOwotCXNldF9jb250cm9sKGRldiwmaHVlKTsKLQlzZXRfY29udHJvbChkZXYsJmNvbnRyYXN0KTsKLQlzZXRfY29udHJvbChkZXYsJmJyaWdodG5lc3MpOworCXNldF9jb250cm9sKGNvcmUsJm11dGUpOworCXNldF9jb250cm9sKGNvcmUsJnZvbHVtZSk7CisJc2V0X2NvbnRyb2woY29yZSwmaHVlKTsKKwlzZXRfY29udHJvbChjb3JlLCZjb250cmFzdCk7CisJc2V0X2NvbnRyb2woY29yZSwmYnJpZ2h0bmVzcyk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTAwNCw2ICsxMDI1LDggQEAKIHN0YXRpYyBpbnQgY3g4ODAwX3RyeV9mbXQoc3RydWN0IGN4ODgwMF9kZXYgKmRldiwgc3RydWN0IGN4ODgwMF9maCAqZmgsCiAJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCiAJc3dpdGNoIChmLT50eXBlKSB7CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CiAJewpAQCAtMTAxNiw4ICsxMDM5LDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKLQkJbWF4dyAgPSBub3JtX21heHcoZGV2LT5jb3JlLT50dm5vcm0pOwotCQltYXhoICA9IG5vcm1fbWF4aChkZXYtPmNvcmUtPnR2bm9ybSk7CisJCW1heHcgID0gbm9ybV9tYXh3KGNvcmUtPnR2bm9ybSk7CisJCW1heGggID0gbm9ybV9tYXhoKGNvcmUtPnR2bm9ybSk7CiAKIAkJaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB7CiAJCQlmaWVsZCA9IChmLT5mbXQucGl4LmhlaWdodCA+IG1heGgvMikKQEAgLTExMDEsMTIgKzExMjQsMTQgQEAKIAlpZiAodmlkZW9fZGVidWcgPiAxKQogCQljeDg4X3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKIAlzd2l0Y2ggKGNtZCkgeworCisJLyogLS0tIGNhcGFiaWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAljYXNlIFZJRElPQ19RVUVSWUNBUDoKIAl7CiAJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKIAogCQltZW1zZXQoY2FwLDAsc2l6ZW9mKCpjYXApKTsKLSAgICAgICAgICAgICAgICBzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDg4MDAiKTsKKwkJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CiAJCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubmFtZSwKIAkJCXNpemVvZihjYXAtPmNhcmQpKTsKIAkJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLHBjaV9uYW1lKGRldi0+cGNpKSk7CkBAIC0xMTE2LDEwNyArMTE0MSwxMyBAQAogCQkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CiAJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKIAkJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFICAgfAorCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSB8CiAJCQkwOwogCQlpZiAoVU5TRVQgIT0gY29yZS0+dHVuZXJfdHlwZSkKIAkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiAtLS0tLS0tLS0tIHR2IG5vcm1zIC0tLS0tLS0tLS0gKi8KLQljYXNlIFZJRElPQ19FTlVNU1REOgotCXsKLQkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKmUgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCWkgPSBlLT5pbmRleDsKLQkJaWYgKGkgPj0gQVJSQVlfU0laRSh0dm5vcm1zKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllcnIgPSB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QoZSwgdHZub3Jtc1tlLT5pbmRleF0uaWQsCi0JCQkJCSAgICAgICB0dm5vcm1zW2UtPmluZGV4XS5uYW1lKTsKLQkJZS0+aW5kZXggPSBpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19HX1NURDoKLQl7Ci0JCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKLQotCQkqaWQgPSBjb3JlLT50dm5vcm0tPmlkOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUodHZub3Jtcyk7IGkrKykKLQkJCWlmICgqaWQgJiB0dm5vcm1zW2ldLmlkKQotCQkJCWJyZWFrOwotCQlpZiAoaSA9PSBBUlJBWV9TSVpFKHR2bm9ybXMpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJZG93bigmZGV2LT5sb2NrKTsKLQkJY3g4OF9zZXRfdHZub3JtKGRldi0+Y29yZSwmdHZub3Jtc1tpXSk7Ci0JCXVwKCZkZXYtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAtLS0tLS0gaW5wdXQgc3dpdGNoaW5nIC0tLS0tLS0tLS0gKi8KLQljYXNlIFZJRElPQ19FTlVNSU5QVVQ6Ci0JewotCQlzdGF0aWMgY29uc3QgY2hhciAqaW5hbWVbXSA9IHsKLQkJCVsgQ1g4OF9WTVVYX0NPTVBPU0lURTEgXSA9ICJDb21wb3NpdGUxIiwKLQkJCVsgQ1g4OF9WTVVYX0NPTVBPU0lURTIgXSA9ICJDb21wb3NpdGUyIiwKLQkJCVsgQ1g4OF9WTVVYX0NPTVBPU0lURTMgXSA9ICJDb21wb3NpdGUzIiwKLQkJCVsgQ1g4OF9WTVVYX0NPTVBPU0lURTQgXSA9ICJDb21wb3NpdGU0IiwKLQkJCVsgQ1g4OF9WTVVYX1NWSURFTyAgICAgXSA9ICJTLVZpZGVvIiwKLQkJCVsgQ1g4OF9WTVVYX1RFTEVWSVNJT04gXSA9ICJUZWxldmlzaW9uIiwKLQkJCVsgQ1g4OF9WTVVYX0NBQkxFICAgICAgXSA9ICJDYWJsZSBUViIsCi0JCQlbIENYODhfVk1VWF9EVkIgICAgICAgIF0gPSAiRFZCIiwKLQkJCVsgQ1g4OF9WTVVYX0RFQlVHICAgICAgXSA9ICJmb3IgZGVidWcgb25seSIsCi0JCX07Ci0JCXN0cnVjdCB2NGwyX2lucHV0ICppID0gYXJnOwotCQl1bnNpZ25lZCBpbnQgbjsKLQotCQluID0gaS0+aW5kZXg7Ci0JCWlmIChuID49IDQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKDAgPT0gSU5QVVQobiktPnR5cGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGksMCxzaXplb2YoKmkpKTsKLQkJaS0+aW5kZXggPSBuOwotCQlpLT50eXBlICA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JCXN0cmNweShpLT5uYW1lLGluYW1lW0lOUFVUKG4pLT50eXBlXSk7Ci0JCWlmICgoQ1g4OF9WTVVYX1RFTEVWSVNJT04gPT0gSU5QVVQobiktPnR5cGUpIHx8Ci0JCSAgICAoQ1g4OF9WTVVYX0NBQkxFICAgICAgPT0gSU5QVVQobiktPnR5cGUpKQotCQkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKLQkJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUodHZub3Jtcyk7IG4rKykKLQkJCWktPnN0ZCB8PSB0dm5vcm1zW25dLmlkOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfR19JTlBVVDoKLQl7Ci0JCXVuc2lnbmVkIGludCAqaSA9IGFyZzsKLQotCQkqaSA9IGRldi0+Y29yZS0+aW5wdXQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCXsKLQkJdW5zaWduZWQgaW50ICppID0gYXJnOwotCi0JCWlmICgqaSA+PSA0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmRldi0+bG9jayk7Ci0JCWN4ODhfbmV3c3RhdGlvbihjb3JlKTsKLQkJdmlkZW9fbXV4KGRldiwqaSk7Ci0JCXVwKCZkZXYtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCiAJLyogLS0tIGNhcHR1cmUgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAljYXNlIFZJRElPQ19FTlVNX0ZNVDoKIAl7CkBAIC0xMjU3LDYgKzExODgsMTc2IEBACiAJCXJldHVybiBjeDg4MDBfdHJ5X2ZtdChkZXYsZmgsZik7CiAJfQogCisJLyogLS0tIHN0cmVhbWluZyBjYXB0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKm1idWYgPSBhcmc7CisJCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcTsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlxID0gZ2V0X3F1ZXVlKGZoKTsKKwkJbWVtc2V0KCZyZXEsMCxzaXplb2YocmVxKSk7CisJCXJlcS50eXBlICAgPSBxLT50eXBlOworCQlyZXEuY291bnQgID0gODsKKwkJcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJCWVyciA9IHZpZGVvYnVmX3JlcWJ1ZnMocSwmcmVxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQltZW1zZXQobWJ1ZiwwLHNpemVvZigqbWJ1ZikpOworCQltYnVmLT5mcmFtZXMgPSByZXEuY291bnQ7CisJCW1idWYtPnNpemUgICA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBtYnVmLT5mcmFtZXM7IGkrKykgeworCQkJbWJ1Zi0+b2Zmc2V0c1tpXSAgPSBxLT5idWZzW2ldLT5ib2ZmOworCQkJbWJ1Zi0+c2l6ZSAgICAgICArPSBxLT5idWZzW2ldLT5ic2l6ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfUkVRQlVGUzoKKwkJcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoZ2V0X3F1ZXVlKGZoKSwgYXJnKTsKKworCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCQlyZXR1cm4gdmlkZW9idWZfcXVlcnlidWYoZ2V0X3F1ZXVlKGZoKSwgYXJnKTsKKworCWNhc2UgVklESU9DX1FCVUY6CisJCXJldHVybiB2aWRlb2J1Zl9xYnVmKGdldF9xdWV1ZShmaCksIGFyZyk7CisKKwljYXNlIFZJRElPQ19EUUJVRjoKKwkJcmV0dXJuIHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIGFyZywKKwkJCQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCisJY2FzZSBWSURJT0NfU1RSRUFNT046CisJeworCQlpbnQgcmVzID0gZ2V0X3Jlc3NvdXJjZShmaCk7CisKKwkJaWYgKCFyZXNfZ2V0KGRldixmaCxyZXMpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOworCX0KKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6CisJeworCQlpbnQgcmVzID0gZ2V0X3Jlc3NvdXJjZShmaCk7CisKKwkJZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKGdldF9xdWV1ZShmaCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXJlc19mcmVlKGRldixmaCxyZXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gY3g4OF9kb19pb2N0bCggaW5vZGUsIGZpbGUsIGZoLT5yYWRpbywgY29yZSwgY21kLCBhcmcsIHZpZGVvX2RvX2lvY3RsICk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY3g4OF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHJhZGlvLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnLCB2NGwyX2tpb2N0bCBkcml2ZXJfaW9jdGwpCit7CisJaW50IGVycjsKKworCWlmICh2aWRlb19kZWJ1ZyA+IDEpCisJCWN4ODhfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOworCXByaW50ayggS0VSTl9JTkZPICJDT1JFIElPQ1RMOiAweCV4XG4iLCBjbWQgKTsKKwljeDg4X3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKKwlkcHJpbnRrKCAxLCAiQ09SRSBJT0NUTDogMHgleFxuIiwgY21kICk7CisKKwlzd2l0Y2ggKGNtZCkgeworCS8qIC0tLS0tLS0tLS0gdHYgbm9ybXMgLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1TVEQ6CisJeworCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqZSA9IGFyZzsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJaSA9IGUtPmluZGV4OworCQlpZiAoaSA+PSBBUlJBWV9TSVpFKHR2bm9ybXMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChlLCB0dm5vcm1zW2UtPmluZGV4XS5pZCwKKwkJCQkJICAgICAgIHR2bm9ybXNbZS0+aW5kZXhdLm5hbWUpOworCQllLT5pbmRleCA9IGk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCisJCSppZCA9IGNvcmUtPnR2bm9ybS0+aWQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dm5vcm1zKTsgaSsrKQorCQkJaWYgKCppZCAmIHR2bm9ybXNbaV0uaWQpCisJCQkJYnJlYWs7CisJCWlmIChpID09IEFSUkFZX1NJWkUodHZub3JtcykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkb3duKCZjb3JlLT5sb2NrKTsKKwkJY3g4OF9zZXRfdHZub3JtKGNvcmUsJnR2bm9ybXNbaV0pOworCQl1cCgmY29yZS0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCS8qIC0tLS0tLSBpbnB1dCBzd2l0Y2hpbmcgLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwl7CisJCXN0YXRpYyBjb25zdCBjaGFyICppbmFtZVtdID0geworCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFMSBdID0gIkNvbXBvc2l0ZTEiLAorCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFMiBdID0gIkNvbXBvc2l0ZTIiLAorCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFMyBdID0gIkNvbXBvc2l0ZTMiLAorCQkJWyBDWDg4X1ZNVVhfQ09NUE9TSVRFNCBdID0gIkNvbXBvc2l0ZTQiLAorCQkJWyBDWDg4X1ZNVVhfU1ZJREVPICAgICBdID0gIlMtVmlkZW8iLAorCQkJWyBDWDg4X1ZNVVhfVEVMRVZJU0lPTiBdID0gIlRlbGV2aXNpb24iLAorCQkJWyBDWDg4X1ZNVVhfQ0FCTEUgICAgICBdID0gIkNhYmxlIFRWIiwKKwkJCVsgQ1g4OF9WTVVYX0RWQiAgICAgICAgXSA9ICJEVkIiLAorCQkJWyBDWDg4X1ZNVVhfREVCVUcgICAgICBdID0gImZvciBkZWJ1ZyBvbmx5IiwKKwkJfTsKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisJCXVuc2lnbmVkIGludCBuOworCisJCW4gPSBpLT5pbmRleDsKKwkJaWYgKG4gPj0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoMCA9PSBJTlBVVChuKS0+dHlwZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQoaSwwLHNpemVvZigqaSkpOworCQlpLT5pbmRleCA9IG47CisJCWktPnR5cGUgID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJc3RyY3B5KGktPm5hbWUsaW5hbWVbSU5QVVQobiktPnR5cGVdKTsKKwkJaWYgKChDWDg4X1ZNVVhfVEVMRVZJU0lPTiA9PSBJTlBVVChuKS0+dHlwZSkgfHwKKwkJICAgIChDWDg4X1ZNVVhfQ0FCTEUgICAgICA9PSBJTlBVVChuKS0+dHlwZSkpCisJCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCQlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRSh0dm5vcm1zKTsgbisrKQorCQkJaS0+c3RkIHw9IHR2bm9ybXNbbl0uaWQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCXsKKwkJdW5zaWduZWQgaW50ICppID0gYXJnOworCisJCSppID0gY29yZS0+aW5wdXQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCXsKKwkJdW5zaWduZWQgaW50ICppID0gYXJnOworCisJCWlmICgqaSA+PSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRvd24oJmNvcmUtPmxvY2spOworCQljeDg4X25ld3N0YXRpb24oY29yZSk7CisJCXZpZGVvX211eChjb3JlLCppKTsKKwkJdXAoJmNvcmUtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKworCiAJLyogLS0tIGNvbnRyb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6CiAJewpAQCAtMTI3Nyw5ICsxMzc4LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJcmV0dXJuIGdldF9jb250cm9sKGRldixhcmcpOworCQlyZXR1cm4gZ2V0X2NvbnRyb2woY29yZSxhcmcpOwogCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJcmV0dXJuIHNldF9jb250cm9sKGRldixhcmcpOworCQlyZXR1cm4gc2V0X2NvbnRyb2woY29yZSxhcmcpOwogCiAJLyogLS0tIHR1bmVyIGlvY3RscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAljYXNlIFZJRElPQ19HX1RVTkVSOgpAQCAtMTMyMywxMCArMTQyNCwxMSBAQAogCQlpZiAoVU5TRVQgPT0gY29yZS0+dHVuZXJfdHlwZSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWYtPnR5cGUgPSBmaC0+cmFkaW8gPyBWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCWYtPmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKKwkJLyogZi0+dHlwZSA9IGZoLT5yYWRpbyA/IFY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsgKi8KKwkJZi0+dHlwZSA9IHJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQlmLT5mcmVxdWVuY3kgPSBjb3JlLT5mcmVxOwogCi0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DX0dfRlJFUVVFTkNZLGYpOworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NfR19GUkVRVUVOQ1ksZik7CiAKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTMzOCw4MyArMTQ0MCwyNiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChmLT50dW5lciAhPSAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgwID09IGZoLT5yYWRpbyAmJiBmLT50eXBlICE9IFY0TDJfVFVORVJfQU5BTE9HX1RWKQorCQlpZiAoMCA9PSByYWRpbyAmJiBmLT50eXBlICE9IFY0TDJfVFVORVJfQU5BTE9HX1RWKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgxID09IGZoLT5yYWRpbyAmJiBmLT50eXBlICE9IFY0TDJfVFVORVJfUkFESU8pCisJCWlmICgxID09IHJhZGlvICYmIGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9SQURJTykKIAkJCXJldHVybiAtRUlOVkFMOwotCQlkb3duKCZkZXYtPmxvY2spOwotCQlkZXYtPmZyZXEgPSBmLT5mcmVxdWVuY3k7CisJCWRvd24oJmNvcmUtPmxvY2spOworCQljb3JlLT5mcmVxID0gZi0+ZnJlcXVlbmN5OwogCQljeDg4X25ld3N0YXRpb24oY29yZSk7Ci0JCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DX1NfRlJFUVVFTkNZLGYpOworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NfU19GUkVRVUVOQ1ksZik7CiAKIAkJLyogV2hlbiBjaGFuZ2luZyBjaGFubmVscyBpdCBpcyByZXF1aXJlZCB0byByZXNldCBUVkFVRElPICovCiAJCW1zbGVlcCAoMTApOwogCQljeDg4X3NldF90dmF1ZGlvKGNvcmUpOwogCi0JCXVwKCZkZXYtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAtLS0gc3RyZWFtaW5nIGNhcHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DR01CVUY6Ci0JewotCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqbWJ1ZiA9IGFyZzsKLQkJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxOwotCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXE7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCXEgPSBnZXRfcXVldWUoZmgpOwotCQltZW1zZXQoJnJlcSwwLHNpemVvZihyZXEpKTsKLQkJcmVxLnR5cGUgICA9IHEtPnR5cGU7Ci0JCXJlcS5jb3VudCAgPSA4OwotCQlyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQkJZXJyID0gdmlkZW9idWZfcmVxYnVmcyhxLCZyZXEpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCW1lbXNldChtYnVmLDAsc2l6ZW9mKCptYnVmKSk7Ci0JCW1idWYtPmZyYW1lcyA9IHJlcS5jb3VudDsKLQkJbWJ1Zi0+c2l6ZSAgID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IG1idWYtPmZyYW1lczsgaSsrKSB7Ci0JCQltYnVmLT5vZmZzZXRzW2ldICA9IHEtPmJ1ZnNbaV0tPmJvZmY7Ci0JCQltYnVmLT5zaXplICAgICAgICs9IHEtPmJ1ZnNbaV0tPmJzaXplOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19SRVFCVUZTOgotCQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcyhnZXRfcXVldWUoZmgpLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZihnZXRfcXVldWUoZmgpLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfUUJVRjoKLQkJcmV0dXJuIHZpZGVvYnVmX3FidWYoZ2V0X3F1ZXVlKGZoKSwgYXJnKTsKLQotCWNhc2UgVklESU9DX0RRQlVGOgotCQlyZXR1cm4gdmlkZW9idWZfZHFidWYoZ2V0X3F1ZXVlKGZoKSwgYXJnLAotCQkJCSAgICAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQotCWNhc2UgVklESU9DX1NUUkVBTU9OOgotCXsKLQkJaW50IHJlcyA9IGdldF9yZXNzb3VyY2UoZmgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFyZXNfZ2V0KGRldixmaCxyZXMpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotCX0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JewotCQlpbnQgcmVzID0gZ2V0X3Jlc3NvdXJjZShmaCk7Ci0KLQkJZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKGdldF9xdWV1ZShmaCkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCXJlc19mcmVlKGRldixmaCxyZXMpOworCQl1cCgmY29yZS0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIAogCWRlZmF1bHQ6CiAJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsCi0JCQkJCQkgIHZpZGVvX2RvX2lvY3RsKTsKKwkJCQkJCSAgZHJpdmVyX2lvY3RsKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDYxLDcgKzE1MDYsNyBAQAogCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwogCQlzdHJjcHkodC0+bmFtZSwgIlJhZGlvIik7CiAKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfR19UVU5FUix0KTsKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGNvcmUsVklESU9DX0dfVFVORVIsdCk7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CkBAIC0xNTAxLDggKzE1NDYsOCBAQAogCQlpZiAodi0+dHVuZXIpIC8qIE9ubHkgdHVuZXIgMCAqLwogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NTVFVORVIsdik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLFZJRElPQ1NUVU5FUix2KTsKKwkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfVFVORVI6CiAJewpAQCAtMTUxMSw3ICsxNTU2LDcgQEAKIAkJaWYgKDAgIT0gdC0+aW5kZXgpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ19TX1RVTkVSLHQpOworCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NfU19UVU5FUix0KTsKIAogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNTY5LDcgKzE2MTQsNyBAQAogCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGRldi0+Y29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjFdKTsKKwljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDIxXSk7CiAKIAljeF9jbGVhcihNT19WSURfRE1BQ05UUkwsIDB4MTEpOwogCWN4X2NsZWFyKFZJRF9DQVBUVVJFX0NPTlRST0wsIDB4MDYpOwpAQCAtMTYxNCwxNCArMTY1OSwxNCBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8wOiB2aWRlbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsY29yZS0+bmFtZSk7CiAJCWN4X2NsZWFyKE1PX1ZJRF9ETUFDTlRSTCwgMHgxMSk7CiAJCWN4X2NsZWFyKFZJRF9DQVBUVVJFX0NPTlRST0wsIDB4MDYpOwotCQljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGRldi0+Y29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjFdKTsKKwkJY3g4OF9zcmFtX2NoYW5uZWxfZHVtcChjb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyMV0pOwogCX0KIAogCS8qIHJpc2MxIHkgKi8KIAlpZiAoc3RhdHVzICYgMHgwMSkgewogCQlzcGluX2xvY2soJmRldi0+c2xvY2spOwogCQljb3VudCA9IGN4X3JlYWQoTU9fVklEWV9HUENOVCk7Ci0JCWN4ODhfd2FrZXVwKGRldi0+Y29yZSwgJmRldi0+dmlkcSwgY291bnQpOworCQljeDg4X3dha2V1cChjb3JlLCAmZGV2LT52aWRxLCBjb3VudCk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAl9CiAKQEAgLTE2MjksNyArMTY3NCw3IEBACiAJaWYgKHN0YXR1cyAmIDB4MDgpIHsKIAkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKIAkJY291bnQgPSBjeF9yZWFkKE1PX1ZCSV9HUENOVCk7Ci0JCWN4ODhfd2FrZXVwKGRldi0+Y29yZSwgJmRldi0+dmJpcSwgY291bnQpOworCQljeDg4X3dha2V1cChjb3JlLCAmZGV2LT52YmlxLCBjb3VudCk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAl9CiAKQEAgLTE3OTgsNyArMTg0Myw2IEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSBkcml2ZXIgc3RydWN0ICovCi0gICAgICAgIGluaXRfTVVURVgoJmRldi0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwogCWNvcmUtPnR2bm9ybSA9IHR2bm9ybXM7CiAKQEAgLTE4MzUsNiArMTg3OSw3IEBACiAJCXJlcXVlc3RfbW9kdWxlKCJ0dW5lciIpOwogCWlmIChjb3JlLT50ZGE5ODg3X2NvbmYpCiAJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODg3Iik7CisKIAkvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLwogCWRldi0+dmlkZW9fZGV2ID0gY3g4OF92ZGV2X2luaXQoY29yZSxkZXYtPnBjaSwKIAkJCQkJJmN4ODgwMF92aWRlb190ZW1wbGF0ZSwidmlkZW8iKTsKQEAgLTE4NzgsMTEgKzE5MjMsMTEgQEAKIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldixkZXYpOwogCiAJLyogaW5pdGlhbCBkZXZpY2UgY29uZmlndXJhdGlvbiAqLwotCWRvd24oJmRldi0+bG9jayk7Ci0JaW5pdF9jb250cm9scyhkZXYpOwotCWN4ODhfc2V0X3R2bm9ybShkZXYtPmNvcmUsdHZub3Jtcyk7Ci0JdmlkZW9fbXV4KGRldiwwKTsKLQl1cCgmZGV2LT5sb2NrKTsKKwlkb3duKCZjb3JlLT5sb2NrKTsKKwlpbml0X2NvbnRyb2xzKGNvcmUpOworCWN4ODhfc2V0X3R2bm9ybShjb3JlLHR2bm9ybXMpOworCXZpZGVvX211eChjb3JlLDApOworCXVwKCZjb3JlLT5sb2NrKTsKIAogCS8qIHN0YXJ0IHR2YXVkaW8gdGhyZWFkICovCiAJaWYgKGNvcmUtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKQpAQCAtMTkwMiwxNCArMTk0NywxNSBAQAogc3RhdGljIHZvaWQgX19kZXZleGl0IGN4ODgwMF9maW5pZGV2KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewogICAgICAgICBzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAKIAkvKiBzdG9wIHRocmVhZCAqLwotCWlmIChkZXYtPmNvcmUtPmt0aHJlYWQpIHsKLQkJa3RocmVhZF9zdG9wKGRldi0+Y29yZS0+a3RocmVhZCk7Ci0JCWRldi0+Y29yZS0+a3RocmVhZCA9IE5VTEw7CisJaWYgKGNvcmUtPmt0aHJlYWQpIHsKKwkJa3RocmVhZF9zdG9wKGNvcmUtPmt0aHJlYWQpOworCQljb3JlLT5rdGhyZWFkID0gTlVMTDsKIAl9CiAKLQljeDg4X3NodXRkb3duKGRldi0+Y29yZSk7IC8qIEZJWE1FICovCisJY3g4OF9zaHV0ZG93bihjb3JlKTsgLyogRklYTUUgKi8KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CiAKIAkvKiB1bnJlZ2lzdGVyIHN0dWZmICovCkBAIC0xOTIxLDcgKzE5NjcsNyBAQAogCS8qIGZyZWUgbWVtb3J5ICovCiAJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksJmRldi0+dmlkcS5zdG9wcGVyKTsKIAlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKLQljeDg4X2NvcmVfcHV0KGRldi0+Y29yZSxkZXYtPnBjaSk7CisJY3g4OF9jb3JlX3B1dChjb3JlLGRldi0+cGNpKTsKIAlrZnJlZShkZXYpOwogfQogCkBAIC0xOTQ1LDcgKzE5OTEsNyBAQAogCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAogCS8qIEZJWE1FIC0tIHNodXRkb3duIGRldmljZSAqLwotCWN4ODhfc2h1dGRvd24oZGV2LT5jb3JlKTsKKwljeDg4X3NodXRkb3duKGNvcmUpOwogCiAJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CiAJaWYgKDAgIT0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSkpIHsKQEAgLTE5NTksMTYgKzIwMDUsMzIgQEAKIHsKIAlzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJaW50IGVycjsKIAogCWlmIChkZXYtPnN0YXRlLmRpc2FibGVkKSB7Ci0JCXBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCQllcnI9cGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGVuYWJsZSBkZXZpY2VcbiIsCisJCQkJCQkgICAgICAgY29yZS0+bmFtZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKIAkJZGV2LT5zdGF0ZS5kaXNhYmxlZCA9IDA7CiAJfQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwllcnI9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGVuYWJsZSBkZXZpY2VcbiIsCisJCQkJICAgICAgIGNvcmUtPm5hbWUpOworCisJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwkJZGV2LT5zdGF0ZS5kaXNhYmxlZCA9IDE7CisKKwkJcmV0dXJuIGVycjsKKwl9CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAKIAkvKiBGSVhNRTogcmUtaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwotCWN4ODhfcmVzZXQoZGV2LT5jb3JlKTsKKwljeDg4X3Jlc2V0KGNvcmUpOwogCiAJLyogcmVzdGFydCB2aWRlbyt2YmkgY2FwdHVyZSAqLwogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CkBAIC0yMDMwLDYgKzIwOTIsOCBAQAogbW9kdWxlX2luaXQoY3g4ODAwX2luaXQpOwogbW9kdWxlX2V4aXQoY3g4ODAwX2ZpbmkpOwogCitFWFBPUlRfU1lNQk9MKGN4ODhfZG9faW9jdGwpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGRhNjVkYzkuLmY0OGRkNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGN4ODguaCx2IDEuNzAgMjAwNS8wNy8yNCAxNzo0NDowOSBta3J1Zmt5IEV4cCAkCiAgKgogICogdjRsMiBkZXZpY2UgZHJpdmVyIGZvciBjeDIzODh4IGJhc2VkIFRWIGNhcmRzCiAgKgpAQCAtMzUsNyArMzQsNyBAQAogI2luY2x1ZGUgImJ0Y3gtcmlzYy5oIgogI2luY2x1ZGUgImN4ODgtcmVnLmgiCiAKLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2RlZmluZSBDWDg4X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDAsNSkKIAogI2lmbmRlZiBUUlVFCkBAIC00OCw2ICs0Nyw5IEBACiAKICNkZWZpbmUgQ1g4OF9NQVhCT0FSRFMgOAogCisvKiBNYXggbnVtYmVyIG9mIGlucHV0cyBieSBjYXJkICovCisjZGVmaW5lIE1BWF9DWDg4X0lOUFVUIDgKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGRlZmluZXMgYW5kIGVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTE5OSw3ICsyMDEsNyBAQAogCXVuc2lnbmVkIGNoYXIJCXR1bmVyX2FkZHI7CiAJdW5zaWduZWQgY2hhcgkJcmFkaW9fYWRkcjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICB0ZGE5ODg3X2NvbmY7Ci0Jc3RydWN0IGN4ODhfaW5wdXQgICAgICAgaW5wdXRbOF07CisJc3RydWN0IGN4ODhfaW5wdXQgICAgICAgaW5wdXRbTUFYX0NYODhfSU5QVVRdOwogCXN0cnVjdCBjeDg4X2lucHV0ICAgICAgIHJhZGlvOwogCWludCAgICAgICAgICAgICAgICAgICAgIGJsYWNrYmlyZDoxOwogCWludCAgICAgICAgICAgICAgICAgICAgIGR2YjoxOwpAQCAtMjg4LDYgKzI5MCwxMSBAQAogCiAJLyogSVIgcmVtb3RlIGNvbnRyb2wgc3RhdGUgKi8KIAlzdHJ1Y3QgY3g4OF9JUiAgICAgICAgICAgICAqaXI7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICAgICBsb2NrOworCisJLyogdmFyaW91cyB2NGwgY29udHJvbHMgKi8KKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICBmcmVxOwogfTsKIAogc3RydWN0IGN4ODgwMF9kZXY7CkBAIC0zMjMsOCArMzMwLDcgQEAKIHN0cnVjdCBjeDg4MDBfZGV2IHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICAgICAgICAgICAqY29yZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICBkZXZsaXN0OwotICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICAgICBsb2NrOwotICAgICAgIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKIAogCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZXNvdXJjZXM7CkBAIC0zNDIsNyArMzQ4LDYgQEAKIAlzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAgICAgICB2YmlxOwogCiAJLyogdmFyaW91cyB2NGwgY29udHJvbHMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICBmcmVxOwogCiAJLyogb3RoZXIgZ2xvYmFsIHN0YXRlIGluZm8gKi8KIAlzdHJ1Y3QgY3g4ODAwX3N1c3BlbmRfc3RhdGUgc3RhdGU7CkBAIC0zNTAsMTQgKzM1NSw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBmdW5jdGlvbiAxOiBhdWRpby9hbHNhIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT4gbW92ZWQgdG8gY3g4OC1hbHNhLmMgPD09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotc3RydWN0IGN4ODgwMV9kZXYgewotCXN0cnVjdCBjeDg4X2NvcmUgICAgICAgICAgICpjb3JlOwotCi0JLyogcGNpIGkvbyAqLwotCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICpwY2k7Ci0JdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgcGNpX3JldixwY2lfbGF0OwotfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGZ1bmN0aW9uIDI6IG1wZWcgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNzMsOCArMzcyLDcgQEAKIAogc3RydWN0IGN4ODgwMl9kZXYgewogCXN0cnVjdCBjeDg4X2NvcmUgICAgICAgICAgICpjb3JlOwotICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICAgICBsb2NrOwotICAgICAgIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKIAogCS8qIHBjaSBpL28gKi8KIAlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAqcGNpOwpAQCAtNTUzLDggKzU1MSwyMSBAQAogaW50IGN4ODgwMl9zdXNwZW5kX2NvbW1vbihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIGludCBjeDg4MDJfcmVzdW1lX2NvbW1vbihzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjeDg4LXZpZGVvLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIGludCBjeDg4X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgcmFkaW8sCisJCQkJc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl2b2lkICphcmcsIHY0bDJfa2lvY3RsIGRyaXZlcl9pb2N0bCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjeDg4LWJsYWNrYmlyZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIGludCAoKmN4ODhfaW9jdGxfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgKCpjeDg4X2lvY3RsX3RyYW5zbGF0b3IpKHVuc2lnbmVkIGludCBjbWQpOworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogYy1iYXNpYy1vZmZzZXQ6IDgKICAqIEVuZDoKKyAqIGthdGU6IGVvbCAidW5peCI7IGluZGVudC13aWR0aCAzOyByZW1vdmUtdHJhaWxpbmctc3BhY2Ugb247IHJlcGxhY2UtdHJhaWxpbmctc3BhY2Utc2F2ZSBvbjsgdGFiLXdpZHRoIDg7IHJlcGxhY2UtdGFicyBvZmY7IHNwYWNlLWluZGVudCBvZmY7IG1peGVkLWluZGVudCBvZmYKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pbmR5Y2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIwMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pbmR5Y2FtLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiAgaW5keWNhbS5jIC0gU2lsaWNvbiBHcmFwaGljcyBJbmR5Q2FtIGRpZ2l0YWwgY2FtZXJhIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pa2FlbCBOb3VzaWFpbmVuIDx0bW5vdXNpYUBjYy5odXQuZmk+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisvKiBJbmR5Q2FtIGRlY29kZXMgc3RyZWFtIG9mIHBob3RvbnMgaW50byBkaWdpdGFsIGltYWdlIHJlcHJlc2VudGF0aW9uIDstKSAqLworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgImluZHljYW0uaCIKKworLy8jZGVmaW5lIElORFlDQU1fREVCVUcKKworI2RlZmluZSBJTkRZQ0FNX01PRFVMRV9WRVJTSU9OICIwLjAuMyIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgSW5keUNhbSBkcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKElORFlDQU1fTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiTWlrYWVsIE5vdXNpYWluZW4gPHRtbm91c2lhQGNjLmh1dC5maT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIElORFlDQU1fREVCVUcKKyNkZWZpbmUgZHByaW50ayh4Li4uKSBwcmludGsoIkluZHlDYW06ICIgeCk7CisjZGVmaW5lIGluZHljYW1fcmVnZHVtcChjbGllbnQpIGluZHljYW1fcmVnZHVtcF9kZWJ1ZyhjbGllbnQpCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKHguLi4pCisjZGVmaW5lIGluZHljYW1fcmVnZHVtcChjbGllbnQpCisjZW5kaWYKKworI2RlZmluZSBWSU5PX0FEQVBURVIJKEkyQ19BTEdPX1NHSSB8IEkyQ19IV19TR0lfVklOTykKKworc3RydWN0IGluZHljYW0geworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJaW50IHZlcnNpb247Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9pbmR5Y2FtOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0c2VxW10gPSB7CisJSU5EWUNBTV9DT05UUk9MX0FHQ0VOQSwJCS8qIElORFlDQU1fQ09OVFJPTCAqLworCUlORFlDQU1fU0hVVFRFUl9ERUZBVUxULAkvKiBJTkRZQ0FNX1NIVVRURVIgKi8KKwlJTkRZQ0FNX0dBSU5fREVGQVVMVCwJCS8qIElORFlDQU1fR0FJTiAqLworCTB4MDAsCQkJCS8qIElORFlDQU1fQlJJR0hUTkVTUyAocmVhZC1vbmx5KSAqLworCUlORFlDQU1fUkVEX0JBTEFOQ0VfREVGQVVMVCwJLyogSU5EWUNBTV9SRURfQkFMQU5DRSAqLworCUlORFlDQU1fQkxVRV9CQUxBTkNFX0RFRkFVTFQsCS8qIElORFlDQU1fQkxVRV9CQUxBTkNFICovCisJSU5EWUNBTV9SRURfU0FUVVJBVElPTl9ERUZBVUxULAkvKiBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OICovCisJSU5EWUNBTV9CTFVFX1NBVFVSQVRJT05fREVGQVVMVCwvKiBJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTiAqLworfTsKKworLyogSW5keUNhbSByZWdpc3RlciBoYW5kbGluZyAqLworCitzdGF0aWMgaW50IGluZHljYW1fcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciByZWcsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQoreworCWludCByZXQ7CisKKwlpZiAocmVnID09IElORFlDQU1fUkVTRVQpIHsKKwkJZHByaW50aygiaW5keWNhbV9yZWFkX3JlZygpOiAiCisJCQkic2tpcHBpbmcgd3JpdGUtb25seSByZWdpc3RlciAlZFxuIiwgcmVnKTsKKwkJKnZhbHVlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkluZHlDYW06IGluZHljYW1fcmVhZF9yZWcoKTogcmVhZCBmYWlsZWQsICIKKwkJICAgICAgICJyZWdpc3RlciA9IDB4JTAyeFxuIiwgcmVnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqdmFsdWUgPSAodW5zaWduZWQgY2hhcilyZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbmR5Y2FtX3dyaXRlX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjaGFyIHJlZywKKwkJCSAgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKChyZWcgPT0gSU5EWUNBTV9CUklHSFRORVNTKQorCSAgICB8fCAocmVnID09IElORFlDQU1fVkVSU0lPTikpIHsKKwkJZHByaW50aygiaW5keWNhbV93cml0ZV9yZWcoKTogIgorCQkJInNraXBwaW5nIHJlYWQtb25seSByZWdpc3RlciAlZFxuIiwgcmVnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZHByaW50aygiV3JpdGluZyBSZWcgJWQgPSAweCUwMnhcbiIsIHJlZywgdmFsdWUpOworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW5keUNhbTogaW5keWNhbV93cml0ZV9yZWcoKTogd3JpdGUgZmFpbGVkLCAiCisJCSAgICAgICAicmVnaXN0ZXIgPSAweCUwMngsIHZhbHVlID0gMHglMDJ4XG4iLCByZWcsIHZhbHVlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbmR5Y2FtX3dyaXRlX2Jsb2NrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJCXVuc2lnbmVkIGNoYXIgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgaTsKKwlpbnQgZXJyOworCisJZm9yIChpID0gcmVnOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZXJyID0gaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCByZWcgKyBpLCBkYXRhW2ldKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KKworI2lmZGVmIElORFlDQU1fREVCVUcKK3N0YXRpYyB2b2lkIGluZHljYW1fcmVnZHVtcF9kZWJ1ZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworCQlpbmR5Y2FtX3JlYWRfcmVnKGNsaWVudCwgaSwgJnZhbCk7CisJCWRwcmludGsoIlJlZyAlZCA9IDB4JTAyeFxuIiwgaSwgdmFsKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpbmR5Y2FtX2dldF9jb250cm9scyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCXN0cnVjdCBpbmR5Y2FtX2NvbnRyb2wgKmN0cmwpCit7CisJdW5zaWduZWQgY2hhciBjdHJsX3JlZzsKKworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX0NPTlRST0wsICZjdHJsX3JlZyk7CisJY3RybC0+YWdjID0gKGN0cmxfcmVnICYgSU5EWUNBTV9DT05UUk9MX0FHQ0VOQSkKKwkJPyBJTkRZQ0FNX1ZBTFVFX0VOQUJMRUQKKwkJOiBJTkRZQ0FNX1ZBTFVFX0RJU0FCTEVEOworCWN0cmwtPmF3YiA9IChjdHJsX3JlZyAmIElORFlDQU1fQ09OVFJPTF9BV0JDVEwpCisJCT8gSU5EWUNBTV9WQUxVRV9FTkFCTEVECisJCTogSU5EWUNBTV9WQUxVRV9ESVNBQkxFRDsKKwlpbmR5Y2FtX3JlYWRfcmVnKGNsaWVudCwgSU5EWUNBTV9TSFVUVEVSLAorCQkJICh1bnNpZ25lZCBjaGFyICopJmN0cmwtPnNodXR0ZXIpOworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX0dBSU4sCisJCQkgKHVuc2lnbmVkIGNoYXIgKikmY3RybC0+Z2Fpbik7CisJaW5keWNhbV9yZWFkX3JlZyhjbGllbnQsIElORFlDQU1fUkVEX0JBTEFOQ0UsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikmY3RybC0+cmVkX2JhbGFuY2UpOworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX0JMVUVfQkFMQU5DRSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSZjdHJsLT5ibHVlX2JhbGFuY2UpOworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OLAorCQkJICh1bnNpZ25lZCBjaGFyICopJmN0cmwtPnJlZF9zYXR1cmF0aW9uKTsKKwlpbmR5Y2FtX3JlYWRfcmVnKGNsaWVudCwgSU5EWUNBTV9CTFVFX1NBVFVSQVRJT04sCisJCQkgKHVuc2lnbmVkIGNoYXIgKikmY3RybC0+Ymx1ZV9zYXR1cmF0aW9uKTsKKwlpbmR5Y2FtX3JlYWRfcmVnKGNsaWVudCwgSU5EWUNBTV9HQU1NQSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSZjdHJsLT5nYW1tYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbmR5Y2FtX3NldF9jb250cm9scyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCXN0cnVjdCBpbmR5Y2FtX2NvbnRyb2wgKmN0cmwpCit7CisJdW5zaWduZWQgY2hhciBjdHJsX3JlZzsKKworCWluZHljYW1fcmVhZF9yZWcoY2xpZW50LCBJTkRZQ0FNX0NPTlRST0wsICZjdHJsX3JlZyk7CisJaWYgKGN0cmwtPmFnYyAhPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRCkgeworCQlpZiAoY3RybC0+YWdjKQorCQkJY3RybF9yZWcgfD0gSU5EWUNBTV9DT05UUk9MX0FHQ0VOQTsKKwkJZWxzZQorCQkJY3RybF9yZWcgJj0gfklORFlDQU1fQ09OVFJPTF9BR0NFTkE7CisJfQorCWlmIChjdHJsLT5hd2IgIT0gSU5EWUNBTV9WQUxVRV9VTkNIQU5HRUQpIHsKKwkJaWYgKGN0cmwtPmF3YikKKwkJCWN0cmxfcmVnIHw9IElORFlDQU1fQ09OVFJPTF9BV0JDVEw7CisJCWVsc2UKKwkJCWN0cmxfcmVnICY9IH5JTkRZQ0FNX0NPTlRST0xfQVdCQ1RMOworCX0KKwlpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIElORFlDQU1fQ09OVFJPTCwgY3RybF9yZWcpOworCisJaWYgKGN0cmwtPnNodXR0ZXIgPj0gMCkKKwkJaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX1NIVVRURVIsIGN0cmwtPnNodXR0ZXIpOworCWlmIChjdHJsLT5nYWluID49IDApCisJCWluZHljYW1fd3JpdGVfcmVnKGNsaWVudCwgSU5EWUNBTV9HQUlOLCBjdHJsLT5nYWluKTsKKwlpZiAoY3RybC0+cmVkX2JhbGFuY2UgPj0gMCkKKwkJaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX1JFRF9CQUxBTkNFLAorCQkJCSAgY3RybC0+cmVkX2JhbGFuY2UpOworCWlmIChjdHJsLT5ibHVlX2JhbGFuY2UgPj0gMCkKKwkJaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX0JMVUVfQkFMQU5DRSwKKwkJCQkgIGN0cmwtPmJsdWVfYmFsYW5jZSk7CisJaWYgKGN0cmwtPnJlZF9zYXR1cmF0aW9uID49IDApCisJCWluZHljYW1fd3JpdGVfcmVnKGNsaWVudCwgSU5EWUNBTV9SRURfU0FUVVJBVElPTiwKKwkJCQkgIGN0cmwtPnJlZF9zYXR1cmF0aW9uKTsKKwlpZiAoY3RybC0+Ymx1ZV9zYXR1cmF0aW9uID49IDApCisJCWluZHljYW1fd3JpdGVfcmVnKGNsaWVudCwgSU5EWUNBTV9CTFVFX1NBVFVSQVRJT04sCisJCQkJICBjdHJsLT5ibHVlX3NhdHVyYXRpb24pOworCWlmIChjdHJsLT5nYW1tYSA+PSAwKQorCQlpbmR5Y2FtX3dyaXRlX3JlZyhjbGllbnQsIElORFlDQU1fR0FNTUEsIGN0cmwtPmdhbW1hKTsKKworCXJldHVybiAwOworfQorCisvKiBJMkMtaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQgaW5keWNhbV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGluZHljYW0gKmNhbWVyYTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJcHJpbnRrKEtFUk5fSU5GTyAiU0dJIEluZHlDYW0gZHJpdmVyIHZlcnNpb24gJXNcbiIsCisJICAgICAgIElORFlDQU1fTU9EVUxFX1ZFUlNJT04pOworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2FtZXJhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGluZHljYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbWVyYSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NsaWVudDsKKwl9CisKKwltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKwltZW1zZXQoY2FtZXJhLCAwLCBzaXplb2Yoc3RydWN0IGluZHljYW0pKTsKKworCWNsaWVudC0+YWRkciA9IGFkZHI7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcDsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX2luZHljYW07CisJY2xpZW50LT5mbGFncyA9IDA7CisJc3RyY3B5KGNsaWVudC0+bmFtZSwgIkluZHlDYW0gY2xpZW50Iik7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2FtZXJhKTsKKworCWNhbWVyYS0+Y2xpZW50ID0gY2xpZW50OworCisJZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2NhbWVyYTsKKworCWNhbWVyYS0+dmVyc2lvbiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIElORFlDQU1fVkVSU0lPTik7CisJaWYgKGNhbWVyYS0+dmVyc2lvbiAhPSBDQU1FUkFfVkVSU0lPTl9JTkRZICYmCisJICAgIGNhbWVyYS0+dmVyc2lvbiAhPSBDQU1FUkFfVkVSU0lPTl9NT09TRSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9kZXRhY2hfY2xpZW50OworCX0KKwlwcmludGsoS0VSTl9JTkZPICJJbmR5Q2FtIHYlZC4lZCBkZXRlY3RlZFxuIiwKKwkgICAgICAgSU5EWUNBTV9WRVJTSU9OX01BSk9SKGNhbWVyYS0+dmVyc2lvbiksCisJICAgICAgIElORFlDQU1fVkVSU0lPTl9NSU5PUihjYW1lcmEtPnZlcnNpb24pKTsKKworCWluZHljYW1fcmVnZHVtcChjbGllbnQpOworCisJLy8gaW5pdGlhbGl6ZQorCWVyciA9IGluZHljYW1fd3JpdGVfYmxvY2soY2xpZW50LCAwLCBzaXplb2YoaW5pdHNlcSksCisJCQkJICAodW5zaWduZWQgY2hhciAqKSZpbml0c2VxKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW5keUNhbSBpbml0YWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2RldGFjaF9jbGllbnQ7CisJfQorCisJaW5keWNhbV9yZWdkdW1wKGNsaWVudCk7CisKKwkvLyB3aGl0ZSBiYWxhbmNlCisJZXJyID0gaW5keWNhbV93cml0ZV9yZWcoY2xpZW50LCBJTkRZQ0FNX0NPTlRST0wsCisJCQkgIElORFlDQU1fQ09OVFJPTF9BR0NFTkEgfCBJTkRZQ0FNX0NPTlRST0xfQVdCQ1RMKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW5keUNhbSB3aGl0ZSBiYWxhbmNlICIKKwkJICAgICAgICJpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9kZXRhY2hfY2xpZW50OworCX0KKworCWluZHljYW1fcmVnZHVtcChjbGllbnQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5keUNhbSBpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKKworb3V0X2RldGFjaF9jbGllbnQ6CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKK291dF9mcmVlX2NhbWVyYToKKwlrZnJlZShjYW1lcmEpOworb3V0X2ZyZWVfY2xpZW50OgorCWtmcmVlKGNsaWVudCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbmR5Y2FtX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwkvKiBJbmR5IHNwZWNpZmljIGNyYXAgKi8KKwlpZiAoYWRhcC0+aWQgPT0gVklOT19BREFQVEVSKQorCQlyZXR1cm4gaW5keWNhbV9hdHRhY2goYWRhcCwgSU5EWUNBTV9BRERSLCAwKTsKKwkvKiBGZWVsIGZyZWUgdG8gYWRkIHByb2JlIGhlcmUgOi0pICovCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgaW5keWNhbV9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaW5keWNhbSAqY2FtZXJhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKGNhbWVyYSk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbmR5Y2FtX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHZvaWQgKmFyZykKK3sKKwkvLyBzdHJ1Y3QgaW5keWNhbSAqY2FtZXJhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwkvKiBUaGUgb2xkIHZpZGVvX2RlY29kZXIgaW50ZXJmYWNlIGp1c3QgaXNuJ3QgZW5vdWdoLAorCSAqIHNvIHdlJ2xsIHVzZSBzb21lIGN1c3RvbSBjb21tYW5kcy4gKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTOiB7CisJCXN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKKworCQljYXAtPmZsYWdzICA9IFZJREVPX0RFQ09ERVJfTlRTQzsKKwkJY2FwLT5pbnB1dHMgPSAxOworCQljYXAtPm91dHB1dHMgPSAxOworCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX0dFVF9TVEFUVVM6IHsKKwkJaW50ICppYXJnID0gYXJnOworCisJCSppYXJnID0gREVDT0RFUl9TVEFUVVNfR09PRCB8IERFQ09ERVJfU1RBVFVTX05UU0MgfAorCQkJREVDT0RFUl9TVEFUVVNfQ09MT1I7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0VUX05PUk06IHsKKwkJaW50ICppYXJnID0gYXJnOworCisJCXN3aXRjaCAoKmlhcmcpIHsKKwkJY2FzZSBWSURFT19NT0RFX05UU0M6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlpZiAoKmlhcmcgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX1NFVF9PVVRQVVQ6IHsKKwkJaW50ICppYXJnID0gYXJnOworCisJCWlmICgqaWFyZyAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDogeworCQkvKiBBbHdheXMgZW5hYmxlZCAqLworCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX1NFVF9QSUNUVVJFOiB7CisJCS8vIHN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisJCS8qIFRPRE86IGNvbnZlcnQgdmFsdWVzIGZvciBpbmR5Y2FtX3NldF9jb250cm9scygpICovCisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfSU5EWUNBTV9HRVRfQ09OVFJPTFM6IHsKKwkJc3RydWN0IGluZHljYW1fY29udHJvbCAqY3RybCA9IGFyZzsKKwkJaW5keWNhbV9nZXRfY29udHJvbHMoY2xpZW50LCBjdHJsKTsKKwl9CisJY2FzZSBERUNPREVSX0lORFlDQU1fU0VUX0NPTlRST0xTOiB7CisJCXN0cnVjdCBpbmR5Y2FtX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCWluZHljYW1fc2V0X2NvbnRyb2xzKGNsaWVudCwgY3RybCk7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9pbmR5Y2FtID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAJCT0gImluZHljYW0iLAorCS5pZCAJCT0gSTJDX0RSSVZFUklEX0lORFlDQU0sCisJLmZsYWdzIAkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IGluZHljYW1fcHJvYmUsCisJLmRldGFjaF9jbGllbnQgCT0gaW5keWNhbV9kZXRhY2gsCisJLmNvbW1hbmQgCT0gaW5keWNhbV9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5keWNhbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX2luZHljYW0pOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW5keWNhbV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfaW5keWNhbSk7Cit9CisKK21vZHVsZV9pbml0KGluZHljYW1faW5pdCk7Cittb2R1bGVfZXhpdChpbmR5Y2FtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pbmR5Y2FtLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRkYjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pbmR5Y2FtLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAgaW5keWNhbS5oIC0gU2lsaWNvbiBHcmFwaGljcyBJbmR5Q2FtIGRpZ2l0YWwgY2FtZXJhIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pa2FlbCBOb3VzaWFpbmVuIDx0bW5vdXNpYUBjYy5odXQuZmk+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9JTkRZQ0FNX0hfCisjZGVmaW5lIF9JTkRZQ0FNX0hfCisKKy8qIEkyQyBhZGRyZXNzIGZvciB0aGUgR3Vpbm5lc3MgQ2FtZXJhICovCisjZGVmaW5lIElORFlDQU1fQUREUgkJCTB4NTYKKworLyogQ2FtZXJhIHZlcnNpb24gKi8KKyNkZWZpbmUgQ0FNRVJBX1ZFUlNJT05fSU5EWQkJMHgxMAkvKiB2MS4wICovCisjZGVmaW5lIENBTUVSQV9WRVJTSU9OX01PT1NFCQkweDEyCS8qIHYxLjIgKi8KKyNkZWZpbmUgSU5EWUNBTV9WRVJTSU9OX01BSk9SKHgpCSgoKHgpICYgMHhmMCkgPj4gNCkKKyNkZWZpbmUgSU5EWUNBTV9WRVJTSU9OX01JTk9SKHgpCSgoeCkgJiAweDBmKQorCisvKiBSZWdpc3RlciBidXMgYWRkcmVzc2VzICovCisjZGVmaW5lIElORFlDQU1fQ09OVFJPTAkJCTB4MDAKKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSCQkJMHgwMQorI2RlZmluZSBJTkRZQ0FNX0dBSU4JCQkweDAyCisjZGVmaW5lIElORFlDQU1fQlJJR0hUTkVTUwkJMHgwMyAvKiByZWFkLW9ubHkgKi8KKyNkZWZpbmUgSU5EWUNBTV9SRURfQkFMQU5DRQkJMHgwNAorI2RlZmluZSBJTkRZQ0FNX0JMVUVfQkFMQU5DRQkJMHgwNQorI2RlZmluZSBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OCQkweDA2CisjZGVmaW5lIElORFlDQU1fQkxVRV9TQVRVUkFUSU9OCQkweDA3CisjZGVmaW5lIElORFlDQU1fR0FNTUEJCQkweDA4CisjZGVmaW5lIElORFlDQU1fVkVSU0lPTgkJCTB4MGUgLyogcmVhZC1vbmx5ICovCisjZGVmaW5lIElORFlDQU1fUkVTRVQJCQkweDBmIC8qIHdyaXRlLW9ubHkgKi8KKworI2RlZmluZSBJTkRZQ0FNX0xFRAkJCTB4NDYKKyNkZWZpbmUgSU5EWUNBTV9PUklFTlRBVElPTgkJMHg0NworI2RlZmluZSBJTkRZQ0FNX0JVVFRPTgkJCTB4NDgKKworLyogRmllbGQgZGVmaW5pdGlvbnMgb2YgcmVnaXN0ZXJzICovCisjZGVmaW5lIElORFlDQU1fQ09OVFJPTF9BR0NFTkEJCSgxPDwwKSAvKiBhdXRvbWF0aWMgZ2FpbiBjb250cm9sICovCisjZGVmaW5lIElORFlDQU1fQ09OVFJPTF9BV0JDVEwJCSgxPDwxKSAvKiBhdXRvbWF0aWMgd2hpdGUgYmFsYW5jZSAqLworCQkJCQkJLyogMi0zIGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBJTkRZQ0FNX0NPTlRST0xfRVZORkxECQkoMTw8NCkJLyogcmVhZC1vbmx5ICovCisKKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzEwMDAwCQkweDAyCS8qIDEvMTAwMDAgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl80MDAwCQkweDA0CS8qIDEvNDAwMCBzZWNvbmQgKi8KKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSXzIwMDAJCTB4MDgJLyogMS8yMDAwIHNlY29uZCAqLworI2RlZmluZSBJTkRZQ0FNX1NIVVRURVJfMTAwMAkJMHgxMAkvKiAxLzEwMDAgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl81MDAJCTB4MjAJLyogMS81MDAgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl8yNTAJCTB4M2YJLyogMS8yNTAgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl8xMjUJCTB4N2UJLyogMS8xMjUgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl8xMDAJCTB4OWUJLyogMS8xMDAgc2Vjb25kICovCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl82MAkJMHgwMAkvKiAxLzYwIHNlY29uZCAqLworCisjZGVmaW5lIElORFlDQU1fTEVEX0FDVElWRQkJCTB4MTAKKyNkZWZpbmUgSU5EWUNBTV9MRURfSU5BQ1RJVkUJCQkweDMwCisjZGVmaW5lIElORFlDQU1fT1JJRU5UQVRJT05fQk9UVE9NX1RPX1RPUAkweDQwCisjZGVmaW5lIElORFlDQU1fQlVUVE9OX1JFTEVBU0VECQkJMHgxMAorCisjZGVmaW5lIElORFlDQU1fU0hVVFRFUl9NSU4JCTB4MDAKKyNkZWZpbmUgSU5EWUNBTV9TSFVUVEVSX01BWAkJMHhmZgorI2RlZmluZSBJTkRZQ0FNX0dBSU5fTUlOICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSU5EWUNBTV9HQUlOX01BWCAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIElORFlDQU1fUkVEX0JBTEFOQ0VfTUlOIAkweDAwIC8qIHRoZSBlZmZlY3QgaXMgdGhlIG9wcG9zaXRlPyAqLworI2RlZmluZSBJTkRZQ0FNX1JFRF9CQUxBTkNFX01BWCAJMHhmZgorI2RlZmluZSBJTkRZQ0FNX0JMVUVfQkFMQU5DRV9NSU4gICAgICAgIDB4MDAgLyogdGhlIGVmZmVjdCBpcyB0aGUgb3Bwb3NpdGU/ICovCisjZGVmaW5lIElORFlDQU1fQkxVRV9CQUxBTkNFX01BWCAgICAgICAgMHhmZgorI2RlZmluZSBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OX01JTiAgICAgIDB4MDAKKyNkZWZpbmUgSU5EWUNBTV9SRURfU0FUVVJBVElPTl9NQVggICAgICAweGZmCisjZGVmaW5lIElORFlDQU1fQkxVRV9TQVRVUkFUSU9OX01JTgkweDAwCisjZGVmaW5lIElORFlDQU1fQkxVRV9TQVRVUkFUSU9OX01BWAkweGZmCisjZGVmaW5lIElORFlDQU1fR0FNTUFfTUlOCQkweDAwCisjZGVmaW5lIElORFlDQU1fR0FNTUFfTUFYCQkweGZmCisKKy8qIERyaXZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBJTkRZQ0FNX1ZBTFVFX0VOQUJMRUQJCTEKKyNkZWZpbmUgSU5EWUNBTV9WQUxVRV9ESVNBQkxFRAkJMAorI2RlZmluZSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRAkJLTEKKworLyogV2hlbiBzZXR0aW5nIGNvbnRyb2xzLCBhIHZhbHVlIG9mIC0xIGxlYXZlcyB0aGUgY29udHJvbCB1bmNoYW5nZWQuICovCitzdHJ1Y3QgaW5keWNhbV9jb250cm9sIHsKKwlpbnQgYWdjOwkvKiBib29sZWFuICovCisJaW50IGF3YjsJLyogYm9vbGVhbiAqLworCWludCBzaHV0dGVyOworCWludCBnYWluOworCWludCByZWRfYmFsYW5jZTsKKwlpbnQgYmx1ZV9iYWxhbmNlOworCWludCByZWRfc2F0dXJhdGlvbjsKKwlpbnQgYmx1ZV9zYXR1cmF0aW9uOworCWludCBnYW1tYTsKK307CisKKyNkZWZpbmUJREVDT0RFUl9JTkRZQ0FNX0dFVF9DT05UUk9MUwlfSU9SKCdkJywgMTkzLCBzdHJ1Y3QgaW5keWNhbV9jb250cm9sKQorI2RlZmluZQlERUNPREVSX0lORFlDQU1fU0VUX0NPTlRST0xTCV9JT1coJ2QnLCAxOTQsIHN0cnVjdCBpbmR5Y2FtX2NvbnRyb2wpCisKKy8qIERlZmF1bHQgdmFsdWVzIGZvciBjb250cm9scyAqLworCisjZGVmaW5lIElORFlDQU1fQUdDX0RFRkFVTFQJCUlORFlDQU1fVkFMVUVfRU5BQkxFRAorI2RlZmluZSBJTkRZQ0FNX0FXQl9ERUZBVUxUCQlJTkRZQ0FNX1ZBTFVFX0VOQUJMRUQKKworI2RlZmluZSBJTkRZQ0FNX1NIVVRURVJfREVGQVVMVAkJSU5EWUNBTV9TSFVUVEVSXzYwCisjZGVmaW5lIElORFlDQU1fR0FJTl9ERUZBVUxUCQkweDgwCisjZGVmaW5lIElORFlDQU1fUkVEX0JBTEFOQ0VfREVGQVVMVAkweDE4CisjZGVmaW5lIElORFlDQU1fQkxVRV9CQUxBTkNFX0RFRkFVTFQJMHhhNAorI2RlZmluZSBJTkRZQ0FNX1JFRF9TQVRVUkFUSU9OX0RFRkFVTFQJMHg4MAorI2RlZmluZSBJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTl9ERUZBVUxUCTB4YzAKKyNkZWZpbmUgSU5EWUNBTV9HQU1NQV9ERUZBVUxUCQkweDgwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtZ3Bpby5jCmluZGV4IGE1NjU4MjMuLmNmMjkyZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBpci1rYmQtZ3Bpby5jLHYgMS4xMyAyMDA1LzA1LzE1IDE5OjAxOjI2IG1jaGVoYWIgRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgR2VyZCBLbm9ycgogICogQ29weXJpZ2h0IChjKSAyMDAzIFBhdmVsIE1hY2hlawpAQCAtMzU0LDYgKzM1Myw3IEBACiAJCWlyLT5pbnB1dC5pZC52ZW5kb3IgID0gc3ViLT5jb3JlLT5wY2ktPnZlbmRvcjsKIAkJaXItPmlucHV0LmlkLnByb2R1Y3QgPSBzdWItPmNvcmUtPnBjaS0+ZGV2aWNlOwogCX0KKwlpci0+aW5wdXQuZGV2ID0gJnN1Yi0+Y29yZS0+cGNpLT5kZXY7CiAKIAlpZiAoaXItPnBvbGxpbmcpIHsKIAkJSU5JVF9XT1JLKCZpci0+d29yaywgaXJfd29yaywgaXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCAxZTI3M2ZmLi42NzEwNWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGlyLWtiZC1pMmMuYyx2IDEuMTEgMjAwNS8wNy8wNyAxNjo0MjoxMSBtY2hlaGFiIEV4cCAkCiAgKgogICoga2V5Ym9hcmQgaW5wdXQgZHJpdmVyIGZvciBpMmMgSVIgcmVtb3RlIGNvbnRyb2xzCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYwppbmRleCBmZTE5NDAxLi4zZjJhODgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlICJtZXllLmgiCiAjaW5jbHVkZSA8bGludXgvbWV5ZS5oPgpAQCAtMTIxLDcgKzEyMiw3IEBACiAJbWVtc2V0KG1leWUubWNoaXBfcHRhYmxlLCAwLCBzaXplb2YobWV5ZS5tY2hpcF9wdGFibGUpKTsKIAogCS8qIGdpdmUgb25seSAzMiBiaXQgRE1BIGFkZHJlc3NlcyAqLwotCWlmIChkbWFfc2V0X21hc2soJm1leWUubWNoaXBfZGV2LT5kZXYsIDB4ZmZmZmZmZmYpKQorCWlmIChkbWFfc2V0X21hc2soJm1leWUubWNoaXBfZGV2LT5kZXYsIERNQV8zMkJJVF9NQVNLKSkKIAkJcmV0dXJuIC0xOwogCiAJbWV5ZS5tY2hpcF9wdGFibGVfdG9jID0gZG1hX2FsbG9jX2NvaGVyZW50KCZtZXllLm1jaGlwX2Rldi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYwppbmRleCBjYTAyZjZmLi5mMGQ0M2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYwpAQCAtMTI0LDEwICsxMjQsMTQgQEAKIG1vZHVsZV9wYXJhbShhbXNvdW5kLCAgICAgICAgICBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGRvbGJ5LCAgICAgICAgICAgIGludCwgMDY0NCk7CiAKK01PRFVMRV9QQVJNX0RFU0Mob3Btb2RlLCAiRm9yY2VzIGEgTVNQMzQwMCBvcG1vZGUuIDA9TWFudWFsLCAxPVNpbXBsZSwgMj1TaW1wbGVyIik7CiBNT0RVTEVfUEFSTV9ERVNDKG9uY2UsICJObyBjb250aW51b3VzIHN0ZXJlbyBtb25pdG9yaW5nIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CitNT0RVTEVfUEFSTV9ERVNDKHN0ZXJlb190aHJlc2hvbGQsICJTZXRzIHNpZ25hbCB0aHJlc2hvbGQgdG8gYWN0aXZhdGUgc3RlcmVvIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YW5kYXJkLCAiU3BlY2lmeSBhdWRpbyBzdGFuZGFyZDogMzIgPSBOVFNDLCA2NCA9IHJhZGlvLCBEZWZhdWx0OiBBdXRvZGV0ZWN0Iik7CiBNT0RVTEVfUEFSTV9ERVNDKGFtc291bmQsICJIYXJkd2lyZSBBTSBzb3VuZCBhdCA2LjVIeiAoRnJhbmNlKSwgRk0gY2FuIGF1dG9zY2FuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRvbGJ5LCAiQWN0aXZhdGVzIERvbGJ5IHByb2Nlc3NzaW5nIik7CisKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkZXZpY2UgZHJpdmVyIGZvciBtc3AzNHh4IFRWIHNvdW5kIHByb2Nlc3NvciIpOwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOwpAQCAtMTQ1Miw3ICsxNDU2LDcgQEAKICAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwogCiAgICAgICAgIGlmICgtMSA9PSBtc3AzNDAwY19yZXNldCgmY2xpZW50X3RlbXBsYXRlKSkgewotICAgICAgICAgICAgICAgIGRwcmludGsoIm1zcDM0MDA6IG5vIGNoaXAgZm91bmRcbiIpOworICAgICAgICAgICAgICAgIGRwcmludGsoIm1zcDM0eHg6IG5vIGNoaXAgZm91bmRcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCkBAIC0xNDc4LDcgKzE0ODIsNyBAQAogCWlmICgtMSA9PSBtc3AzNDAwY19yZXNldChjKSkgewogCQlrZnJlZShtc3ApOwogCQlrZnJlZShjKTsKLQkJZHByaW50aygibXNwMzQwMDogbm8gY2hpcCBmb3VuZFxuIik7CisJCWRwcmludGsoIm1zcDM0eHg6IG5vIGNoaXAgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNDg4LDcgKzE0OTIsNyBAQAogCWlmICgoLTEgPT0gbXNwLT5yZXYxKSB8fCAoMCA9PSBtc3AtPnJldjEgJiYgMCA9PSBtc3AtPnJldjIpKSB7CiAJCWtmcmVlKG1zcCk7CiAJCWtmcmVlKGMpOwotCQlwcmludGsoIm1zcDM0MDA6IGVycm9yIHdoaWxlIHJlYWRpbmcgY2hpcCB2ZXJzaW9uXG4iKTsKKwkJZHByaW50aygibXNwMzR4eDogZXJyb3Igd2hpbGUgcmVhZGluZyBjaGlwIHZlcnNpb25cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCmluZGV4IDAyM2YzMzAuLjJkOWZmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogbXNwMzQwMC5oLHYgMS4zIDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAogICovCiAKICNpZm5kZWYgTVNQMzQwMF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYwppbmRleCAyZmI3YzJkLi45NzJhYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBtdDIweHguYyx2IDEuNSAyMDA1LzA2LzE2IDA4OjI5OjQ5IG5zaCBFeHAgJAogICoKICAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSBkcml2ZXIKICAqIGNvbnRyb2xzIG1pY3JvdHVuZSB0dW5lcnMsIG10MjAzMiArIG10MjA1MCBhdCB0aGUgbW9tZW50LgpAQCAtNDk0LDYgKzQ5Myw3IEBACiAJbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKIAl0LT50dl9mcmVxICAgID0gTlVMTDsKIAl0LT5yYWRpb19mcmVxID0gTlVMTDsKKwl0LT5zdGFuZGJ5ICAgID0gTlVMTDsKIAluYW1lID0gInVua25vd24iOwogCiAgICAgICAgIGkyY19tYXN0ZXJfc2VuZChjLGJ1ZiwxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmRzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Jkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzM3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Jkcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisKKyAgICBUeXBlcyBhbmQgZGVmaW5lcyBuZWVkZWQgZm9yIFJEUy4gVGhpcyBpcyBpbmNsdWRlZCBieQorICAgIHNhYTY1ODguYyBhbmQgZXZlcnkgZHJpdmVyIChlLmcuIGJ0dHYtZHJpdmVyLmMpIHRoYXQgd2FudHMKKyAgICB0byB1c2UgdGhlIHNhYTY1ODggbW9kdWxlLgorCisgICAgSW5zdGVhZCBvZiBoYXZpbmcgYSBzZXBlcmF0ZSByZHMuaCwgSSdkIHByZWZlciB0byBpbmNsdWRlCisgICAgdGhpcyBzdHVmZiBpbiBvbmUgb2YgdGhlIGFscmVhZHkgZXhpc3RpbmcgZmlsZXMgbGlrZSB0dW5lci5oCisKKyAgICAoYykgMjAwNSBieSBIYW5zIEouIEtvY2gKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9SRFNfSAorI2RlZmluZSBfUkRTX0gKKworc3RydWN0IHJkc19jb21tYW5kIHsKKwl1bnNpZ25lZCBpbnQgIGJsb2NrX2NvdW50OworCWludCAgICAgICAgICAgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgZmlsZSAgICppbnN0YW5jZTsKKwlwb2xsX3RhYmxlICAgICpldmVudF9saXN0OworfTsKKworI2RlZmluZSBSRFNfQ01EX09QRU4JX0lPVygnUicsMSxpbnQpCisjZGVmaW5lIFJEU19DTURfQ0xPU0UJX0lPVygnUicsMixpbnQpCisjZGVmaW5lIFJEU19DTURfUkVBRAlfSU9SKCdSJywzLGludCkKKyNkZWZpbmUgUkRTX0NNRF9QT0xMCV9JT1IoJ1InLDQsaW50KQorCisjZW5kaWYKKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE2NTg4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTY1ODguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY1N2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE2NTg4LmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qCisgICAgRHJpdmVyIGZvciBTQUE2NTg4IFJEUyBkZWNvZGVyCisKKyAgICAoYykgMjAwNSBIYW5zIEouIEtvY2gKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9pZC5oPgorCisjaW5jbHVkZSAicmRzLmgiCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCTB4MjAgPj4gMSwKKwkweDIyID4+IDEsCisJSTJDX0NMSUVOVF9FTkQsCit9OworCitJMkNfQ0xJRU5UX0lOU01PRDsKKworLyogaW5zbW9kIG9wdGlvbnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB4dGFsID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmJkcyA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHBsdmwgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBidWZibG9ja3MgPSAxMDA7CisKK01PRFVMRV9QQVJNKGRlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworTU9EVUxFX1BBUk0oeHRhbCwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoeHRhbCwgInNlbGVjdCBvc2NpbGxhdG9yIGZyZXF1ZW5jeSAoMC4uMyksIGRlZmF1bHQgMCIpOworTU9EVUxFX1BBUk0ocmJkcywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MocmJkcywgInNlbGVjdCBtb2RlLCAwPVJEUywgMT1SQkRTLCBkZWZhdWx0IDAiKTsKK01PRFVMRV9QQVJNKHBsdmwsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHBsdmwsICJzZWxlY3QgcGF1c2UgbGV2ZWwgKDAuLjMpLCBkZWZhdWx0IDAiKTsKK01PRFVMRV9QQVJNKGJ1ZmJsb2NrcywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmYmxvY2tzLCAibnVtYmVyIG9mIGJ1ZmZlcmVkIGJsb2NrcywgZGVmYXVsdCAxMDAiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIFNBQTY1ODggUkRTIGRlY29kZXIiKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgSi4gS29jaCA8a29jaEBoamstYXouZGU+Iik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFVOU0VUICAgICAgICgtMVUpCisjZGVmaW5lIFBSRUZJWCAgICAgICJzYWE2NTg4OiAiCisjZGVmaW5lIGRwcmludGsgICAgIGlmIChkZWJ1ZykgcHJpbnRrCisKK3N0cnVjdCBzYWE2NTg4IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisJdW5zaWduZWQgaW50IHJkX2luZGV4OworCXVuc2lnbmVkIGludCB3cl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfY291bnQ7CisJdW5zaWduZWQgY2hhciBsYXN0X2Jsb2NrbnVtOworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfcXVldWU7CisJaW50IGRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkOworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNBQTY1ODggZGVmaW5lcworICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBtb2RlIGNvbnRyb2wgYnl0ZSAoMHcpICovCisKKy8qIGJpdCAwKzEgKERBQzAvREFDMSkgKi8KKyNkZWZpbmUgY01vZGVTdGFuZGFyZCAgICAgICAgICAgMHgwMAorI2RlZmluZSBjTW9kZUZhc3RQSSAgICAgICAgICAgICAweDAxCisjZGVmaW5lIGNNb2RlUmVkdWNlZFJlcXVlc3QgICAgIDB4MDIKKyNkZWZpbmUgY01vZGVJbnZhbGlkICAgICAgICAgICAgMHgwMworCisvKiBiaXQgMiAoUkJEUykgKi8KKyNkZWZpbmUgY1Byb2Nlc3NpbmdNb2RlUkRTICAgICAgMHgwMAorI2RlZmluZSBjUHJvY2Vzc2luZ01vZGVSQkRTICAgICAweDA0CisKKy8qIGJpdCAzKzQgKFNZTTAvU1lNMSkgKi8KKyNkZWZpbmUgY0VyckNvcnJlY3Rpb25Ob25lICAgICAgMHgwMAorI2RlZmluZSBjRXJyQ29ycmVjdGlvbjJCaXRzICAgICAweDA4CisjZGVmaW5lIGNFcnJDb3JyZWN0aW9uNUJpdHMgICAgIDB4MTAKKyNkZWZpbmUgY0VyckNvcnJlY3Rpb25Ob25lUkJEUyAgMHgxOAorCisvKiBiaXQgNSAoTldTWSkgKi8KKyNkZWZpbmUgY1N5bmNOb3JtYWwgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBjU3luY1Jlc3RhcnQgICAgICAgICAgICAweDIwCisKKy8qIGJpdCA2IChUU1FEKSAqLworI2RlZmluZSBjU2lnUXVhbGl0eURldGVjdE9GRiAgICAweDAwCisjZGVmaW5lIGNTaWdRdWFsaXR5RGV0ZWN0T04gICAgIDB4NDAKKworLyogYml0IDcgKFNRQ00pICovCisjZGVmaW5lIGNTaWdRdWFsaXR5VHJpZ2dlcmVkICAgIDB4MDAKKyNkZWZpbmUgY1NpZ1F1YWxpdHlDb250aW5vdXMgICAgMHg4MAorCisvKiBQYXVzZSBsZXZlbCBhbmQgZmx5d2hlZWwgY29udHJvbCBieXRlICgxdykgKi8KKworLyogYml0cyAwLi41IChGRUIwLi5GRUI1KSAqLworI2RlZmluZSBjRmx5d2hlZWxNYXhCbG9ja3NNYXNrICAweDNGCisjZGVmaW5lIGNGbHl3aGVlbERlZmF1bHQgICAgICAgIDB4MjAKKworLyogYml0cyA2KzcgKFBMMC9QTDEpICovCisjZGVmaW5lIGNQYXVzZUxldmVsXzExbVYJMHgwMAorI2RlZmluZSBjUGF1c2VMZXZlbF8xN21WICAgICAgICAweDQwCisjZGVmaW5lIGNQYXVzZUxldmVsXzI3bVYgICAgICAgIDB4ODAKKyNkZWZpbmUgY1BhdXNlTGV2ZWxfNDNtViAgICAgICAgMHhDMAorCisvKiBQYXVzZSB0aW1lL29zY2lsbGF0b3IgZnJlcXVlbmN5L3F1YWxpdHkgZGV0ZWN0b3IgY29udHJvbCBieXRlICgxdykgKi8KKworLyogYml0cyAwLi40IChTUVMwLi5TUVM0KSAqLworI2RlZmluZSBjUXVhbGl0eURldGVjdFNlbnNNYXNrICAweDFGCisjZGVmaW5lIGNRdWFsaXR5RGV0ZWN0RGVmYXVsdCAgIDB4MEYKKworLyogYml0IDUgKFNPU0MpICovCisjZGVmaW5lIGNTZWxlY3RPc2NGcmVxT0ZGCTB4MDAKKyNkZWZpbmUgY1NlbGVjdE9zY0ZyZXFPTgkweDIwCisKKy8qIGJpdCA2KzcgKFBURjAvUFRGMSkgKi8KKyNkZWZpbmUgY09zY0ZyZXFfNDMzMmtIegkweDAwCisjZGVmaW5lIGNPc2NGcmVxXzg2NjRrSHoJMHg0MAorI2RlZmluZSBjT3NjRnJlcV8xMjk5NmtIegkweDgwCisjZGVmaW5lIGNPc2NGcmVxXzE3MzI4a0h6CTB4QzAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJsb2NrX3RvX3VzZXJfYnVmKHN0cnVjdCBzYWE2NTg4ICpzLCB1bnNpZ25lZCBjaGFyICp1c2VyX2J1ZikKK3sKKwlpbnQgaTsKKworCWlmIChzLT5yZF9pbmRleCA9PSBzLT53cl9pbmRleCkgeworCQlpZiAoZGVidWcgPiAyKQorCQkJZHByaW50ayhQUkVGSVggIlJlYWQ6IGJ1ZmZlciBlbXB0eS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGVidWcgPiAyKSB7CisJCWRwcmludGsoUFJFRklYICJSZWFkOiAiKTsKKwkJZm9yIChpID0gcy0+cmRfaW5kZXg7IGkgPCBzLT5yZF9pbmRleCArIDM7IGkrKykKKwkJCWRwcmludGsoIjB4JTAyeCAiLCBzLT5idWZmZXJbaV0pOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIodXNlcl9idWYsICZzLT5idWZmZXJbcy0+cmRfaW5kZXhdLCAzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzLT5yZF9pbmRleCArPSAzOworCWlmIChzLT5yZF9pbmRleCA+PSBzLT5idWZfc2l6ZSkKKwkJcy0+cmRfaW5kZXggPSAwOworCXMtPmJsb2NrX2NvdW50LS07CisKKwlpZiAoZGVidWcgPiAyKQorCQlkcHJpbnRrKCIlZCBibG9ja3MgdG90YWwuXG4iLCBzLT5ibG9ja19jb3VudCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9mcm9tX2J1ZihzdHJ1Y3Qgc2FhNjU4OCAqcywgc3RydWN0IHJkc19jb21tYW5kICphKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl1bnNpZ25lZCBjaGFyICpidWZfcHRyID0gYS0+YnVmZmVyOwkvKiBUaGlzIGlzIGEgdXNlciBzcGFjZSBidWZmZXIhICovCisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IHJkX2Jsb2NrczsKKworCWEtPnJlc3VsdCA9IDA7CisJaWYgKCFhLT5idWZmZXIpCisJCXJldHVybjsKKworCXdoaWxlICghcy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQpIHsKKwkJaW50IHJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzLT5yZWFkX3F1ZXVlLAorCQkJCQkgICAgIHMtPmRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkKTsKKwkJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCWEtPnJlc3VsdCA9IC1FSU5UUjsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcmRfYmxvY2tzID0gYS0+YmxvY2tfY291bnQ7CisJaWYgKHJkX2Jsb2NrcyA+IHMtPmJsb2NrX2NvdW50KQorCQlyZF9ibG9ja3MgPSBzLT5ibG9ja19jb3VudDsKKworCWlmICghcmRfYmxvY2tzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgcmRfYmxvY2tzOyBpKyspIHsKKwkJaWYgKGJsb2NrX3RvX3VzZXJfYnVmKHMsIGJ1Zl9wdHIpKSB7CisJCQlidWZfcHRyICs9IDM7CisJCQlhLT5yZXN1bHQrKzsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJYS0+cmVzdWx0ICo9IDM7CisJcy0+ZGF0YV9hdmFpbGFibGVfZm9yX3JlYWQgPSAocy0+YmxvY2tfY291bnQgPiAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGJsb2NrX3RvX2J1ZihzdHJ1Y3Qgc2FhNjU4OCAqcywgdW5zaWduZWQgY2hhciAqYmxvY2tidWYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoZGVidWcgPiAzKQorCQlkcHJpbnRrKFBSRUZJWCAiTmV3IGJsb2NrOiAiKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKwkJaWYgKGRlYnVnID4gMykKKwkJCWRwcmludGsoIjB4JTAyeCAiLCBibG9ja2J1ZltpXSk7CisJCXMtPmJ1ZmZlcltzLT53cl9pbmRleF0gPSBibG9ja2J1ZltpXTsKKwkJcy0+d3JfaW5kZXgrKzsKKwl9CisKKwlpZiAocy0+d3JfaW5kZXggPj0gcy0+YnVmX3NpemUpCisJCXMtPndyX2luZGV4ID0gMDsKKworCWlmIChzLT53cl9pbmRleCA9PSBzLT5yZF9pbmRleCkgeworCQlzLT5yZF9pbmRleCsrOworCQlpZiAocy0+cmRfaW5kZXggPj0gcy0+YnVmX3NpemUpCisJCQlzLT5yZF9pbmRleCA9IDA7CisJfSBlbHNlCisJCXMtPmJsb2NrX2NvdW50Kys7CisKKwlpZiAoZGVidWcgPiAzKQorCQlkcHJpbnRrKCIlZCBibG9ja3MgdG90YWwuXG4iLCBzLT5ibG9ja19jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhYTY1ODhfaTJjX3BvbGwoc3RydWN0IHNhYTY1ODggKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHRtcGJ1Zls2XTsKKwl1bnNpZ25lZCBjaGFyIGJsb2NrbnVtOworCXVuc2lnbmVkIGNoYXIgdG1wOworCisJLyogQWx0aG91Z2ggd2Ugb25seSBuZWVkIDMgYnl0ZXMsIHdlIGhhdmUgdG8gcmVhZCBhdCBsZWFzdCA2LgorCSAgIFNBQTY1ODggcmV0dXJucyBnYXJiYWdlIG90aGVyd2lzZSAqLworCWlmICg2ICE9IGkyY19tYXN0ZXJfcmVjdigmcy0+Y2xpZW50LCAmdG1wYnVmWzBdLCA2KSkgeworCQlpZiAoZGVidWcgPiAxKQorCQkJZHByaW50ayhQUkVGSVggInJlYWQgZXJyb3IhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJsb2NrbnVtID0gdG1wYnVmWzBdID4+IDU7CisJaWYgKGJsb2NrbnVtID09IHMtPmxhc3RfYmxvY2tudW0pIHsKKwkJaWYgKGRlYnVnID4gMykKKwkJCWRwcmludGsoIlNhdyBibG9jayAlZCBhZ2Fpbi5cbiIsIGJsb2NrbnVtKTsKKwkJcmV0dXJuOworCX0KKworCXMtPmxhc3RfYmxvY2tudW0gPSBibG9ja251bTsKKworCS8qCisJICAgQnl0ZSBvcmRlciBhY2NvcmRpbmcgdG8gdjRsMiBzcGVjaWZpY2F0aW9uOgorCisJICAgQnl0ZSAwOiBMZWFzdCBTaWduaWZpY2FudCBCeXRlIG9mIFJEUyBCbG9jaworCSAgIEJ5dGUgMTogTW9zdCBTaWduaWZpY2FudCBCeXRlIG9mIFJEUyBCbG9jaworCSAgIEJ5dGUgMiBCaXQgNzogRXJyb3IgYml0LiBJbmRpY2F0ZXMgdGhhdCBhbiB1bmNvcnJlY3RhYmxlIGVycm9yCisJICAgb2NjdXJyZWQgZHVyaW5nIHJlY2VwdGlvbiBvZiB0aGlzIGJsb2NrLgorCSAgIEJpdCA2OiBDb3JyZWN0ZWQgYml0LiBJbmRpY2F0ZXMgdGhhdCBhbiBlcnJvciB3YXMKKwkgICBjb3JyZWN0ZWQgZm9yIHRoaXMgZGF0YSBibG9jay4KKwkgICBCaXRzIDUtMzogUmVjZWl2ZWQgT2Zmc2V0LiBJbmRpY2F0ZXMgdGhlIG9mZnNldCByZWNlaXZlZAorCSAgIGJ5IHRoZSBzeW5jIHN5c3RlbS4KKwkgICBCaXRzIDItMDogT2Zmc2V0IE5hbWUuIEluZGljYXRlcyB0aGUgb2Zmc2V0IGFwcGxpZWQgdG8gdGhpcyBkYXRhLgorCisJICAgU0FBNjU4OCBieXRlIG9yZGVyIGlzIFN0YXR1cy1NU0ItTFNCLCBzbyB3ZSBoYXZlIHRvIHN3YXAgdGhlCisJICAgZmlyc3QgYW5kIHRoZSBsYXN0IG9mIHRoZSAzIGJ5dGVzIGJsb2NrLgorCSAqLworCisJdG1wID0gdG1wYnVmWzJdOworCXRtcGJ1ZlsyXSA9IHRtcGJ1ZlswXTsKKwl0bXBidWZbMF0gPSB0bXA7CisKKwl0bXAgPSBibG9ja251bTsKKwl0bXAgfD0gYmxvY2tudW0gPDwgMzsJLyogUmVjZWl2ZWQgb2Zmc2V0ID09IE9mZnNldCBOYW1lIChPSyA/KSAqLworCWlmICgodG1wYnVmWzJdICYgMHgwMykgPT0gMHgwMykKKwkJdG1wIHw9IDB4ODA7CS8qIHVuY29ycmVjdGFibGUgZXJyb3IgKi8KKwllbHNlIGlmICgodG1wYnVmWzJdICYgMHgwMykgIT0gMHgwMCkKKwkJdG1wIHw9IDB4NDA7CS8qIGNvcnJlY3RlZCBlcnJvciAqLworCXRtcGJ1ZlsyXSA9IHRtcDsJLyogSXMgdGhpcyBlbm91Z2ggPyBTaG91bGQgd2UgYWxzbyBjaGVjayBvdGhlciBiaXRzID8gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJYmxvY2tfdG9fYnVmKHMsIHRtcGJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnMtPnJlYWRfcXVldWUpOworfQorCitzdGF0aWMgdm9pZCBzYWE2NTg4X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2FhNjU4OCAqcyA9IChzdHJ1Y3Qgc2FhNjU4OCAqKWRhdGE7CisKKwlzY2hlZHVsZV93b3JrKCZzLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgc2FhNjU4OF93b3JrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNhYTY1ODggKnMgPSAoc3RydWN0IHNhYTY1ODggKilkYXRhOworCisJc2FhNjU4OF9pMmNfcG9sbChzKTsKKwltb2RfdGltZXIoJnMtPnRpbWVyLCBqaWZmaWVzICsgSFogLyA1MCk7CS8qIDIwIG1zZWMgKi8KK30KKworc3RhdGljIGludCBzYWE2NTg4X2NvbmZpZ3VyZShzdHJ1Y3Qgc2FhNjU4OCAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKKwlpbnQgcmM7CisKKwlidWZbMF0gPSBjU3luY1Jlc3RhcnQ7CisJaWYgKHJiZHMpCisJCWJ1ZlswXSB8PSBjUHJvY2Vzc2luZ01vZGVSQkRTOworCisJYnVmWzFdID0gY0ZseXdoZWVsRGVmYXVsdDsKKwlzd2l0Y2ggKHBsdmwpIHsKKwljYXNlIDA6CisJCWJ1ZlsxXSB8PSBjUGF1c2VMZXZlbF8xMW1WOworCQlicmVhazsKKwljYXNlIDE6CisJCWJ1ZlsxXSB8PSBjUGF1c2VMZXZlbF8xN21WOworCQlicmVhazsKKwljYXNlIDI6CisJCWJ1ZlsxXSB8PSBjUGF1c2VMZXZlbF8yN21WOworCQlicmVhazsKKwljYXNlIDM6CisJCWJ1ZlsxXSB8PSBjUGF1c2VMZXZlbF80M21WOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwlidWZbMl0gPSBjUXVhbGl0eURldGVjdERlZmF1bHQgfCBjU2VsZWN0T3NjRnJlcU9OOworCisJc3dpdGNoICh4dGFsKSB7CisJY2FzZSAwOgorCQlidWZbMl0gfD0gY09zY0ZyZXFfNDMzMmtIejsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlidWZbMl0gfD0gY09zY0ZyZXFfODY2NGtIejsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlidWZbMl0gfD0gY09zY0ZyZXFfMTI5OTZrSHo7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYnVmWzJdIHw9IGNPc2NGcmVxXzE3MzI4a0h6OworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwlkcHJpbnRrKFBSRUZJWCAid3JpdGluZzogMHc9MHglMDJ4IDF3PTB4JTAyeCAydz0weCUwMnhcbiIsCisJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pOworCisJaWYgKDMgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKCZzLT5jbGllbnQsIGJ1ZiwgMykpKQorCQlwcmludGsoUFJFRklYICJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDMpXG4iLCByYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNhYTY1ODhfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBzYWE2NTg4ICpzOworCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKKwljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7CisKKwlwcmludGsoUFJFRklYICJjaGlwIGZvdW5kIEAgMHgleFxuIiwgYWRkciA8PCAxKTsKKworCWlmIChOVUxMID09IChzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJcy0+YnVmX3NpemUgPSBidWZibG9ja3MgKiAzOworCisJaWYgKE5VTEwgPT0gKHMtPmJ1ZmZlciA9IGttYWxsb2Mocy0+YnVmX3NpemUsIEdGUF9LRVJORUwpKSkgeworCQlrZnJlZShzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXMtPmNsaWVudCA9IGNsaWVudF90ZW1wbGF0ZTsKKwlzLT5ibG9ja19jb3VudCA9IDA7CisJcy0+d3JfaW5kZXggPSAwOworCXMtPnJkX2luZGV4ID0gMDsKKwlzLT5sYXN0X2Jsb2NrbnVtID0gMHhmZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5yZWFkX3F1ZXVlKTsKKwlzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCA9IDA7CisJaTJjX3NldF9jbGllbnRkYXRhKCZzLT5jbGllbnQsIHMpOworCWkyY19hdHRhY2hfY2xpZW50KCZzLT5jbGllbnQpOworCisJc2FhNjU4OF9jb25maWd1cmUocyk7CisKKwkvKiBzdGFydCBwb2xsaW5nIHZpYSBldmVudGQgKi8KKwlJTklUX1dPUksoJnMtPndvcmssIHNhYTY1ODhfd29yaywgcyk7CisJaW5pdF90aW1lcigmcy0+dGltZXIpOworCXMtPnRpbWVyLmZ1bmN0aW9uID0gc2FhNjU4OF90aW1lcjsKKwlzLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpczsKKwlzY2hlZHVsZV93b3JrKCZzLT53b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTY1ODhfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKKwlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHNhYTY1ODhfYXR0YWNoKTsKKyNlbHNlCisJc3dpdGNoIChhZGFwLT5pZCkgeworCWNhc2UgSTJDX0FMR09fQklUIHwgSTJDX0hXX0JfQlQ4NDg6CisJY2FzZSBJMkNfQUxHT19CSVQgfCBJMkNfSFdfQl9SSVZBOgorCWNhc2UgSTJDX0FMR09fU0FBNzEzNDoKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBzYWE2NTg4X2F0dGFjaCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTY1ODhfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNhYTY1ODggKnMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRlbF90aW1lcl9zeW5jKCZzLT50aW1lcik7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUocy0+YnVmZmVyKTsKKwlrZnJlZShzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE2NTg4X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHNhYTY1ODggKnMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgcmRzX2NvbW1hbmQgKmEgPSAoc3RydWN0IHJkc19jb21tYW5kICopYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwkJLyogLS0tIG9wZW4oKSBmb3IgL2Rldi9yYWRpbyAtLS0gKi8KKwljYXNlIFJEU19DTURfT1BFTjoKKwkJYS0+cmVzdWx0ID0gMDsJLyogcmV0dXJuIGVycm9yIGlmIGNoaXAgZG9lc24ndCB3b3JrID8/PyAqLworCQlicmVhazsKKwkJLyogLS0tIGNsb3NlKCkgZm9yIC9kZXYvcmFkaW8gLS0tICovCisJY2FzZSBSRFNfQ01EX0NMT1NFOgorCQlzLT5kYXRhX2F2YWlsYWJsZV9mb3JfcmVhZCA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcy0+cmVhZF9xdWV1ZSk7CisJCWEtPnJlc3VsdCA9IDA7CisJCWJyZWFrOworCQkvKiAtLS0gcmVhZCgpIGZvciAvZGV2L3JhZGlvIC0tLSAqLworCWNhc2UgUkRTX0NNRF9SRUFEOgorCQlyZWFkX2Zyb21fYnVmKHMsIGEpOworCQlicmVhazsKKwkJLyogLS0tIHBvbGwoKSBmb3IgL2Rldi9yYWRpbyAtLS0gKi8KKwljYXNlIFJEU19DTURfUE9MTDoKKwkJYS0+cmVzdWx0ID0gMDsKKwkJaWYgKHMtPmRhdGFfYXZhaWxhYmxlX2Zvcl9yZWFkKSB7CisJCQlhLT5yZXN1bHQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfQorCQlwb2xsX3dhaXQoYS0+aW5zdGFuY2UsICZzLT5yZWFkX3F1ZXVlLCBhLT5ldmVudF9saXN0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBub3RoaW5nICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJpMmMgc2FhNjU4OCBkcml2ZXIiLAorCS5pZCA9IC0xLAkJLyogRklYTUUgKi8KKwkuZmxhZ3MgPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IHNhYTY1ODhfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgPSBzYWE2NTg4X2RldGFjaCwKKwkuY29tbWFuZCA9IHNhYTY1ODhfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAic2FhNjU4OCIsCisJLmZsYWdzID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCisJLmRyaXZlciA9ICZkcml2ZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYWE2NTg4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2FhNjU4OF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYWE2NTg4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHNhYTY1ODhfY2xlYW51cF9tb2R1bGUpOworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKaW5kZXggZjE4ZGY1My4uZmU4YTVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTQuYwppbmRleCBlMGM3MGY1Li5kOWY1MGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTQuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwppbmRleCA4OGI3MWEyLi5hY2M3YTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LWNhcmRzLmMsdiAxLjgwIDIwMDUvMDcvMDcgMDE6NDk6MzAgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogY2FyZC1zcGVjaWZpYyBzdHVmZi4KQEAgLTEzNzMsNyArMTM3Miw3IEBACiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCiAJCQkudm11eCA9IDEsCi0JCQkuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDMsCkBAIC0xMzgyLDcgKzEzODEsNyBAQAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCi0JCQkuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLApAQCAtMjAwMSw2ICsyMDAwLDExNSBAQAogCQkJLmdwaW8gPSAweDAwMCwKIAkJfSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX0ZMWVRWX0RJR0lNQVRSSVhdID0geworCQkubmFtZQkJPSAiRmx5VFYgbWluaSBBc3VzIERpZ2ltYXRyaXgiLAorCQkuYXVkaW9fY2xvY2sJPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX0xHX05UU0NfVEFMTl9NSU5JLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCQkvKiByYWRpbyB1bmNvbmZpcm1lZCAqLworCQkJLmFtdXggPSBMSU5FMiwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0tXT1JMRF9URVJNSU5BVE9SXSA9IHsKKwkJLyogS3dvcmxkIFYtU3RyZWFtIFN0dWRpbyBUViBUZXJtaW5hdG9yICovCisJCS8qICJKYW1lcyBXZWJiIDxqcndlYmJAcXdlc3QubmV0PiAqLworCQkubmFtZSAgICAgICAgICAgPSAiVi1TdHJlYW0gU3R1ZGlvIFRWIFRlcm1pbmF0b3IiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sgICAgICAgPSAxIDw8IDIxLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMDAwMDAwLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwgICAgIC8qIENvbXBvc2l0ZSBpbnB1dCAqLworCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMDAwMDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sICAgIC8qIFMtVmlkZW8gaW5wdXQgKi8KKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAwMDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDIwMDAwMCwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1lVQU5fVFVOOTAwXSA9IHsKKwkJLyogRklYTUU6CisJCSAqIFMtVmlkZW8gYW5kIGNvbXBvc2l0ZSBzb3VyY2VzIHVudGVzdGVkLgorCQkgKiBSYWRpbyBub3Qgd29ya2luZy4KKwkJICogUmVtb3RlIGNvbnRyb2wgbm90IHlldCBpbXBsZW1lbnRlZC4KKwkJICogRnJvbSA6IGNvZGVtYXN0ZXJAd2ViZ2Vla3MuYmUgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIll1YW4gVFVOLTkwMCAoc2FhNzEzNSkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcj0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHI9IEFERFJfVU5TRVQsCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDAwMTAwMDMsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQkJLmdwaW8gPSAweDAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNiwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDAwMDEwMDAzLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMSwKKwkJfSwKKwl9LAogfTsKIAogCkBAIC0yMjcyLDEyICsyMzgwLDYgQEAKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUiwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLQkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotCQkuc3VidmVuZG9yICAgID0gMHgxMTMxLAotCQkuc3ViZGV2aWNlICAgID0gMCwKLQkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNLAotCX0sewotCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCiAJCS5zdWJkZXZpY2UgICAgPSAweDk3MTUsCkBAIC0yMzQ2LDYgKzI0NDgsMTggQEAKIAkJLnN1YnZlbmRvciAgICA9IDB4NGU0MiwKIAkJLnN1YmRldmljZSAgICA9IDB4MDUwMiwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVEhZUEhPT05fRFZCVF9EVU9fQ0FSREJVUywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxMDQzLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMjEwLAkJLyogbWluaSBwY2kgTlRTQyB2ZXJzaW9uICovCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVRWX0RJR0lNQVRSSVgsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA0MywKKwkJLnN1YmRldmljZSAgICA9IDB4MDIxMCwJCS8qIG1pbmkgcGNpIFBBTC9TRUNBTSB2ZXJzaW9uICovCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVRWX0RJR0lNQVRSSVgsCiAKIAl9LHsKIAkJLyogLS0tIGJvYXJkcyB3aXRob3V0IGVlcHJvbSArIHN1YnN5c3RlbSBJRCAtLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwppbmRleCAxZGJlNjE3Li5lNWUzNmYzYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LWNvcmUuYyx2IDEuMzkgMjAwNS8wNy8wNSAxNzozNzozNSBuc2ggRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIGRyaXZlciBjb3JlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IDhiZTZhOTAuLjYzOWFlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1kdmIuYyx2IDEuMjMgMjAwNS8wNy8yNCAyMjoxMjo0NyBta3J1Zmt5IEV4cCAkCiAgKgogICogKGMpIDIwMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXQogICoKQEAgLTI5LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKIAogI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKaW5kZXggYzg1MzQ4ZDAuLjc3YjYyN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LWVtcHJlc3MuYyx2IDEuMTEgMjAwNS8wNS8yMiAxOToyMzozOSBuc2ggRXhwICQKICAqCiAgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwppbmRleCBlYWU2YjUyLi43MTFhYThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtaTJjLmMsdiAxLjIyIDIwMDUvMDcvMjIgMDQ6MDk6NDEgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogaTJjIGludGVyZmFjZSBzdXBwb3J0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwppbmRleCAyMTM3NDAxLi4xZjQ1NmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LWlucHV0LmMsdiAxLjIxIDIwMDUvMDYvMjIgMjM6Mzc6MzQgbnNoIEV4cCAkCiAgKgogICogaGFuZGxlIHNhYTcxMzQgSVIgcmVtb3RlcyB2aWEgbGludXgga2VybmVsIGlucHV0IGxheWVyLgogICoKQEAgLTU2NSw2ICs1NjQsNyBAQAogCQlpci0+ZGV2LmlkLnZlbmRvciAgPSBkZXYtPnBjaS0+dmVuZG9yOwogCQlpci0+ZGV2LmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+ZGV2aWNlOwogCX0KKwlpci0+ZGV2LmRldiA9ICZkZXYtPnBjaS0+ZGV2OwogCiAJLyogYWxsIGRvbmUgKi8KIAlkZXYtPnJlbW90ZSA9IGlyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwppbmRleCBiNWJlZGU5Li5jMjA2MzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtb3NzLmMsdiAxLjE3IDIwMDUvMDYvMjggMjM6NDE6NDcgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogb3NzIGRzcCBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtcmVnLmgKaW5kZXggODc3MzRmMi4uYWUwYzdhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtcmVnLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LXJlZy5oLHYgMS4yIDIwMDQvMDkvMTUgMTY6MTU6MjQga3JheGVsIEV4cCAkCiAgKgogICogcGhpbGlwcyBzYWE3MTM0IHJlZ2lzdGVycwogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYwppbmRleCA0ZGQ5ZjFiLi40NjM4ODU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LXRzLmMsdiAxLjE1IDIwMDUvMDYvMTQgMjI6NDg6MTggaGhhY2ttYW5uIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYwppbmRleCBlZWFmYTVhLi5iYWRmMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC10dmF1ZGlvLmMsdiAxLjMwIDIwMDUvMDYvMjggMjM6NDE6NDcgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogdHYgYXVkaW8gZGVjb2RlciAoZm0gc3RlcmVvLCBuaWNhbSwgLi4uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYwppbmRleCAyOWU1MWNhLi5mNGFlZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdmJpLmMsdiAxLjcgMjAwNS8wNS8yNCAyMzoxMzowNiBuc2ggRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKaW5kZXggYTRjMmY3NS4uMzVlNWU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogc2FhNzEzNC12aWRlby5jLHYgMS4zNiAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpAQCAtMTM2OCwyOSArMTM2Nyw3IEBACiAJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfREFUQV9BLCAweDFmLCAwKTsKIAlzYWFfYW5kb3JiKFNBQTcxMzRfT0ZNVF9EQVRBX0IsIDB4MWYsIDApOwogCi0JaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX1REQTgyOTApIHsKLQkJdTggZGF0YVsyXTsKLQkJaW50IHJldDsKLQkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPUkyQ19BRERSX1REQTgyOTAsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSAyfTsKLQkJZGF0YVswXSA9IDB4MjE7Ci0JCWRhdGFbMV0gPSAweGMwOwotCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwotCQlpZiAocmV0ICE9IDEpCi0JCQlwcmludGsoS0VSTl9FUlIgIlREQTgyOTAgYWNjZXNzIGZhaWx1cmVcbiIpOwotCQltc2cuYWRkciA9IEkyQ19BRERSX1REQTgyNzU7Ci0JCWRhdGFbMF0gPSAweDMwOwotCQlkYXRhWzFdID0gMHhkMDsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQkJaWYgKHJldCAhPSAxKQotCQkJcHJpbnRrKEtFUk5fRVJSICJUREE4Mjc1IGFjY2VzcyBmYWlsdXJlXG4iKTsKLQkJbXNnLmFkZHIgPSBJMkNfQUREUl9UREE4MjkwOwotCQlkYXRhWzBdID0gMHgyMTsKLQkJZGF0YVsxXSA9IDB4ODA7Ci0JCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7Ci0JCWRhdGFbMF0gPSAweDAwOwotCQlkYXRhWzFdID0gMHgwMjsKLQkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQl9CisJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOwogCiAJLyogZnJlZSBzdHVmZiAqLwogCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPmNhcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCAyYWYwY2IyLi4zZWEwOTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBzYWE3MTM0LmgsdiAxLjQ5IDIwMDUvMDcvMTMgMTc6MjU6MjUgbWNoZWhhYiBFeHAgJAogICoKICAqIHY0bDIgZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKgpAQCAtMTg1LDYgKzE4NCw5IEBACiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSCA2MQogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSSA2MgogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVCA2MworI2RlZmluZSBTQUE3MTM0X0JPQVJEX0ZMWVRWX0RJR0lNQVRSSVggNjQKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9LV09STERfVEVSTUlOQVRPUiA2NQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1lVQU5fVFVOOTAwIDY2CiAKICNkZWZpbmUgU0FBNzEzNF9NQVhCT0FSRFMgOAogI2RlZmluZSBTQUE3MTM0X0lOUFVUX01BWCA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxODUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE4NS5jCmluZGV4IGU5MzQxMmYuLjEzMmFhNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE4NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE4NS5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5MS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ZjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5MS5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogIHNhYTcxOTEuYyAtIFBoaWxpcHMgU0FBNzE5MSB2aWRlbyBkZWNvZGVyIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pa2FlbCBOb3VzaWFpbmVuIDx0bW5vdXNpYUBjYy5odXQuZmk+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSAic2FhNzE5MS5oIgorCisjZGVmaW5lIFNBQTcxOTFfTU9EVUxFX1ZFUlNJT04gIjAuMC4zIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNzE5MSB2aWRlbyBkZWNvZGVyIGRyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oU0FBNzE5MV9NT0RVTEVfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJNaWthZWwgTm91c2lhaW5lbiA8dG1ub3VzaWFAY2MuaHV0LmZpPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFZJTk9fQURBUFRFUgkoSTJDX0FMR09fU0dJIHwgSTJDX0hXX1NHSV9WSU5PKQorCitzdHJ1Y3Qgc2FhNzE5MSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKworCS8qIHRoZSByZWdpc3RlciB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlIGFzIHRoZSBhY3R1YWwKKwkgKiBJMkMtcmVnaXN0ZXJzIGFyZSB3cml0ZS1vbmx5ICovCisJdW5zaWduZWQgY2hhciByZWdbMjVdOworCisJdW5zaWduZWQgY2hhciBub3JtOworCXVuc2lnbmVkIGNoYXIgaW5wdXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9zYWE3MTkxOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0c2VxW10gPSB7CisJMCwJLyogU3ViYWRkcmVzcyAqLworCTB4NTAsCS8qIFNBQTcxOTFfUkVHX0lERUwgKi8KKwkweDMwLAkvKiBTQUE3MTkxX1JFR19IU1lCICovCisJMHgwMCwJLyogU0FBNzE5MV9SRUdfSFNZUyAqLworCTB4ZTgsCS8qIFNBQTcxOTFfUkVHX0hDTEIgKi8KKwkweGI2LAkvKiBTQUE3MTkxX1JFR19IQ0xTICovCisJMHhmNCwJLyogU0FBNzE5MV9SRUdfSFBISSAqLworCTB4MDEsCS8qIFNBQTcxOTFfUkVHX0xVTUEgLSBjaHJvbWluYW5jZSB0cmFwIGFjdGl2ZSAoQ1ZCUykgKi8KKwkweDAwLAkvKiBTQUE3MTkxX1JFR19IVUVDICovCisJMHhmOCwJLyogU0FBNzE5MV9SRUdfQ0tUUSAqLworCTB4ZjgsCS8qIFNBQTcxOTFfUkVHX0NLVFMgKi8KKwkweDkwLAkvKiBTQUE3MTkxX1JFR19QTFNFICovCisJMHg5MCwJLyogU0FBNzE5MV9SRUdfU0VTRSAqLworCTB4MDAsCS8qIFNBQTcxOTFfUkVHX0dBSU4gKi8KKwkweDBjLAkvKiBTQUE3MTkxX1JFR19TVERDIC0gbm90IFNFQ0FNLCBzbG93IHRpbWUgY29uc3RhbnQgKi8KKwkweDc4LAkvKiBTQUE3MTkxX1JFR19JT0NLIC0gY2hyb21pbmFuY2UgZnJvbSBDVkJTLCBHUFNXMSAmIDIgb2ZmICovCisJMHg5OSwJLyogU0FBNzE5MV9SRUdfQ1RMMyAtIGF1dG9tYXRpYyBmaWVsZCBkZXRlY3Rpb24gKi8KKwkweDAwLAkvKiBTQUE3MTkxX1JFR19DVEw0ICovCisJMHgyYywJLyogU0FBNzE5MV9SRUdfQ0hDViAqLworCTB4MDAsCS8qIHVudXNlZCAqLworCTB4MDAsCS8qIHVudXNlZCAqLworCTB4MzQsCS8qIFNBQTcxOTFfUkVHX0hTNkIgKi8KKwkweDBhLAkvKiBTQUE3MTkxX1JFR19IUzZTICovCisJMHhmNCwJLyogU0FBNzE5MV9SRUdfSEM2QiAqLworCTB4Y2UsCS8qIFNBQTcxOTFfUkVHX0hDNlMgKi8KKwkweGY0LAkvKiBTQUE3MTkxX1JFR19IUDZJICovCit9OworCisvKiBTQUE3MTkxIHJlZ2lzdGVyIGhhbmRsaW5nICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNhYTcxOTFfcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlyZXR1cm4gKChzdHJ1Y3Qgc2FhNzE5MSAqKWkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKS0+cmVnW3JlZ107Cit9CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9yZWFkX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCB2YWx1ZSwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTQUE3MTkxOiBzYWE3MTkxX3JlYWRfc3RhdHVzKCk6IHJlYWQgZmFpbGVkIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzYWE3MTkxX3dyaXRlX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjaGFyIHJlZywKKwkJCSAgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKworCSgoc3RydWN0IHNhYTcxOTEgKilpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSktPnJlZ1tyZWddID0gdmFsdWU7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworLyogdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBtdXN0IGJlIHRoZSBmaXJzdCBzdWJhZGRyZXNzIG51bWJlciAocmVnaXN0ZXIpICovCitzdGF0aWMgaW50IHNhYTcxOTFfd3JpdGVfYmxvY2soc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJc3RydWN0IHNhYTcxOTEgKmRlY29kZXIgPSAoc3RydWN0IHNhYTcxOTEgKilpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aCAtIDEpOyBpKyspIHsKKwkJZGVjb2Rlci0+cmVnW2RhdGFbMF0gKyBpXSA9IGRhdGFbaSArIDFdOworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGRhdGEsIGxlbmd0aCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTQUE3MTkxOiBzYWE3MTkxX3dyaXRlX2Jsb2NrKCk6ICIKKwkJICAgICAgICJ3cml0ZSBmYWlsZWQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHNhYTcxOTFfc2V0X2lucHV0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBpbnB1dCkKK3sKKwl1bnNpZ25lZCBjaGFyIGx1bWEgPSBzYWE3MTkxX3JlYWRfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfTFVNQSk7CisJdW5zaWduZWQgY2hhciBpb2NrID0gc2FhNzE5MV9yZWFkX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0lPQ0spOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGlucHV0KSB7CisJY2FzZSBTQUE3MTkxX0lOUFVUX0NPTVBPU0lURTogLyogU2V0IENvbXBvc2l0ZSBpbnB1dCAqLworCQlpb2NrICY9IH4oU0FBNzE5MV9JT0NLX0NIUlMgfCBTQUE3MTkxX0lPQ0tfR1BTVzEKKwkJCSAgfCBTQUE3MTkxX0lPQ0tfR1BTVzIpOworCQkvKiBDaHJvbWluYW5jZSB0cmFwIGFjdGl2ZSAqLworCQlsdW1hICY9IH5TQUE3MTkxX0xVTUFfQllQUzsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTkxX0lOUFVUX1NWSURFTzogLyogU2V0IFMtVmlkZW8gaW5wdXQgKi8KKwkJaW9jayB8PSBTQUE3MTkxX0lPQ0tfQ0hSUyB8IFNBQTcxOTFfSU9DS19HUFNXMjsKKwkJLyogQ2hyb21pbmFuY2UgdHJhcCBieXBhc3NlZCAqLworCQlsdW1hIHw9IFNBQTcxOTFfTFVNQV9CWVBTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0xVTUEsIGx1bWEpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCWVyciA9IHNhYTcxOTFfd3JpdGVfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfSU9DSywgaW9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE3MTkxX3NldF9ub3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBub3JtKQoreworCXN0cnVjdCBzYWE3MTkxICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgY2hhciBzdGRjID0gc2FhNzE5MV9yZWFkX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX1NUREMpOworCXVuc2lnbmVkIGNoYXIgY3RsMyA9IHNhYTcxOTFfcmVhZF9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19DVEwzKTsKKwl1bnNpZ25lZCBjaGFyIGNoY3YgPSBzYWE3MTkxX3JlYWRfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfQ0hDVik7CisJaW50IGVycjsKKworCXN3aXRjaChub3JtKSB7CisJY2FzZSBTQUE3MTkxX05PUk1fQVVUTzogeworCQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCQkvLyBkb2VzIHN0YXR1cyBkZXBlbmQgb24gY3VycmVudCBub3JtID8KKwkJaWYgKHNhYTcxOTFfcmVhZF9zdGF0dXMoY2xpZW50LCAmc3RhdHVzKSkKKwkJCXJldHVybiAtRUlPOworCisJCXN0ZGMgJj0gflNBQTcxOTFfU1REQ19TRUNTOworCQljdGwzICY9IH5TQUE3MTkxX0NUTDNfRlNFTDsKKwkJY3RsMyB8PSBTQUE3MTkxX0NUTDNfQVVGRDsKKwkJY2hjdiA9IChzdGF0dXMgJiBTQUE3MTkxX1NUQVRVU19GSURUKQorCQkJICAgICAgID8gU0FBNzE5MV9DSENWX05UU0MgOiBTQUE3MTkxX0NIQ1ZfUEFMOworCQlicmVhazsKKwl9CisJY2FzZSBTQUE3MTkxX05PUk1fUEFMOgorCQlzdGRjICY9IH5TQUE3MTkxX1NURENfU0VDUzsKKwkJY3RsMyAmPSB+KFNBQTcxOTFfQ1RMM19BVUZEIHwgU0FBNzE5MV9DVEwzX0ZTRUwpOworCQljaGN2ID0gU0FBNzE5MV9DSENWX1BBTDsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTkxX05PUk1fTlRTQzoKKwkJc3RkYyAmPSB+U0FBNzE5MV9TVERDX1NFQ1M7CisJCWN0bDMgJj0gflNBQTcxOTFfQ1RMM19BVUZEOworCQljdGwzIHw9IFNBQTcxOTFfQ1RMM19GU0VMOworCQljaGN2ID0gU0FBNzE5MV9DSENWX05UU0M7CisJCWJyZWFrOworCWNhc2UgU0FBNzE5MV9OT1JNX1NFQ0FNOgorCQlzdGRjIHw9IFNBQTcxOTFfU1REQ19TRUNTOworCQljdGwzICY9IH4oU0FBNzE5MV9DVEwzX0FVRkQgfCBTQUE3MTkxX0NUTDNfRlNFTCk7CisJCWNoY3YgPSBTQUE3MTkxX0NIQ1ZfUEFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0NUTDMsIGN0bDMpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCWVyciA9IHNhYTcxOTFfd3JpdGVfcmVnKGNsaWVudCwgU0FBNzE5MV9SRUdfU1REQywgc3RkYyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisJZXJyID0gc2FhNzE5MV93cml0ZV9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19DSENWLCBjaGN2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCWRlY29kZXItPm5vcm0gPSBub3JtOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9nZXRfY29udHJvbHMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQlzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sICpjdHJsKQoreworCXVuc2lnbmVkIGNoYXIgaHVlID0gc2FhNzE5MV9yZWFkX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0hVRUMpOworCXVuc2lnbmVkIGNoYXIgc3RkYyA9IHNhYTcxOTFfcmVhZF9yZWcoY2xpZW50LCBTQUE3MTkxX1JFR19TVERDKTsKKworCWlmIChodWUgPCAweDgwKSB7CisJCWh1ZSArPSAweDgwOworCX0gZWxzZSB7CisJCWh1ZSAtPSAweDgwOworCX0KKwljdHJsLT5odWUgPSBodWU7CisKKwljdHJsLT52dHJjID0gKHN0ZGMgJiBTQUE3MTkxX1NURENfVlRSQykKKwkJPyBTQUE3MTkxX1ZBTFVFX0VOQUJMRUQgOiBTQUE3MTkxX1ZBTFVFX0RJU0FCTEVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9zZXRfY29udHJvbHMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQlzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sICpjdHJsKQoreworCWludCBlcnI7CisKKwlpZiAoY3RybC0+aHVlID49IDApIHsKKwkJdW5zaWduZWQgY2hhciBodWUgPSBjdHJsLT5odWUgJiAweGZmOworCQlpZiAoaHVlIDwgMHg4MCkgeworCQkJaHVlICs9IDB4ODA7CisJCX0gZWxzZSB7CisJCQlodWUgLT0gMHg4MDsKKwkJfQorCQllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0hVRUMsIGh1ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGN0cmwtPnZ0cmMgPj0gMCkgeworCQl1bnNpZ25lZCBjaGFyIHN0ZGMgPQorCQkJc2FhNzE5MV9yZWFkX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX1NUREMpOworCisJCWlmIChjdHJsLT52dHJjKSB7CisJCQlzdGRjIHw9IFNBQTcxOTFfU1REQ19WVFJDOworCQl9IGVsc2UgeworCQkJc3RkYyAmPSB+U0FBNzE5MV9TVERDX1ZUUkM7CisJCX0KKworCQllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX1NUREMsIHN0ZGMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEkyQy1pbnRlcmZhY2UgKi8KKworc3RhdGljIGludCBzYWE3MTkxX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qgc2FhNzE5MSAqZGVjb2RlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJcHJpbnRrKEtFUk5fSU5GTyAiUGhpbGlwcyBTQUE3MTkxIGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBTQUE3MTkxX01PRFVMRV9WRVJTSU9OKTsKKworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGVjb2RlciA9IGttYWxsb2Moc2l6ZW9mKCpkZWNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWNvZGVyKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfY2xpZW50OworCX0KKworCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCW1lbXNldChkZWNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IHNhYTcxOTEpKTsKKworCWNsaWVudC0+YWRkciA9IGFkZHI7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcDsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxOTE7CisJY2xpZW50LT5mbGFncyA9IDA7CisJc3RyY3B5KGNsaWVudC0+bmFtZSwgInNhYTcxOTEgY2xpZW50Iik7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGVjb2Rlcik7CisKKwlkZWNvZGVyLT5jbGllbnQgPSBjbGllbnQ7CisKKwllcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfZGVjb2RlcjsKKworCWRlY29kZXItPmlucHV0ID0gU0FBNzE5MV9JTlBVVF9DT01QT1NJVEU7CisJZGVjb2Rlci0+bm9ybSA9IFNBQTcxOTFfTk9STV9BVVRPOworCisJZXJyID0gc2FhNzE5MV93cml0ZV9ibG9jayhjbGllbnQsIHNpemVvZihpbml0c2VxKSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopaW5pdHNlcSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIlNBQTcxOTEgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfZGV0YWNoX2NsaWVudDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJTQUE3MTkxIGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworCitvdXRfZGV0YWNoX2NsaWVudDoKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworb3V0X2ZyZWVfZGVjb2RlcjoKKwlrZnJlZShkZWNvZGVyKTsKK291dF9mcmVlX2NsaWVudDoKKwlrZnJlZShjbGllbnQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzE5MV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJLyogQWx3YXlzIGNvbm5lY3RlZCB0byBWSU5PICovCisJaWYgKGFkYXAtPmlkID09IFZJTk9fQURBUFRFUikKKwkJcmV0dXJuIHNhYTcxOTFfYXR0YWNoKGFkYXAsIFNBQTcxOTFfQUREUiwgMCk7CisJLyogRmVlbCBmcmVlIHRvIGFkZCBwcm9iZSBoZXJlIDotKSAqLworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHNhYTcxOTFfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNhYTcxOTEgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoZGVjb2Rlcik7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE3MTkxX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc2FhNzE5MSAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUzogeworCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJY2FwLT5mbGFncyAgPSBWSURFT19ERUNPREVSX1BBTCB8IFZJREVPX0RFQ09ERVJfTlRTQyB8CisJCQkgICAgICBWSURFT19ERUNPREVSX1NFQ0FNIHwgVklERU9fREVDT0RFUl9BVVRPOworCQljYXAtPmlucHV0cyA9IChjbGllbnQtPmFkYXB0ZXItPmlkID09IFZJTk9fQURBUFRFUikgPyAyIDogMTsKKwkJY2FwLT5vdXRwdXRzID0gMTsKKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9HRVRfU1RBVFVTOiB7CisJCWludCAqaWFyZyA9IGFyZzsKKwkJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJCWludCByZXMgPSAwOworCisJCWlmIChzYWE3MTkxX3JlYWRfc3RhdHVzKGNsaWVudCwgJnN0YXR1cykpIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmICgoc3RhdHVzICYgU0FBNzE5MV9TVEFUVVNfSExDSykgPT0gMCkKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19HT09EOworCQlpZiAoc3RhdHVzICYgU0FBNzE5MV9TVEFUVVNfQ09ERSkKKwkJCXJlcyB8PSBERUNPREVSX1NUQVRVU19DT0xPUjsKKwkJc3dpdGNoIChkZWNvZGVyLT5ub3JtKSB7CisJCWNhc2UgU0FBNzE5MV9OT1JNX05UU0M6CisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfTlRTQzsKKwkJCWJyZWFrOworCQljYXNlIFNBQTcxOTFfTk9STV9QQUw6CisJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfUEFMOworCQkJYnJlYWs7CisJCWNhc2UgU0FBNzE5MV9OT1JNX1NFQ0FNOgorCQkJcmVzIHw9IERFQ09ERVJfU1RBVFVTX1NFQ0FNOworCQkJYnJlYWs7CisJCWNhc2UgU0FBNzE5MV9OT1JNX0FVVE86CisJCWRlZmF1bHQ6CisJCQlpZiAoc3RhdHVzICYgU0FBNzE5MV9TVEFUVVNfRklEVCkKKwkJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfTlRTQzsKKwkJCWVsc2UKKwkJCQlyZXMgfD0gREVDT0RFUl9TVEFUVVNfUEFMOworCQkJYnJlYWs7CisJCX0KKwkJKmlhcmcgPSByZXM7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0VUX05PUk06IHsKKwkJaW50ICppYXJnID0gYXJnOworCisJCXN3aXRjaCAoKmlhcmcpIHsKKwkJY2FzZSBWSURFT19NT0RFX0FVVE86CisJCQlyZXR1cm4gc2FhNzE5MV9zZXRfbm9ybShjbGllbnQsIFNBQTcxOTFfTk9STV9BVVRPKTsKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCXJldHVybiBzYWE3MTkxX3NldF9ub3JtKGNsaWVudCwgU0FBNzE5MV9OT1JNX1BBTCk7CisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJcmV0dXJuIHNhYTcxOTFfc2V0X25vcm0oY2xpZW50LCBTQUE3MTkxX05PUk1fTlRTQyk7CisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCXJldHVybiBzYWE3MTkxX3NldF9ub3JtKGNsaWVudCwgU0FBNzE5MV9OT1JNX1NFQ0FNKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfU0VUX0lOUFVUOgl7CisJCWludCAqaWFyZyA9IGFyZzsKKworCQlzd2l0Y2ggKGNsaWVudC0+YWRhcHRlci0+aWQpIHsKKwkJY2FzZSBWSU5PX0FEQVBURVI6CisJCQlyZXR1cm4gc2FhNzE5MV9zZXRfaW5wdXQoY2xpZW50LCAqaWFyZyk7CisJCWRlZmF1bHQ6CisJCQlpZiAoKmlhcmcgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX1NFVF9PVVRQVVQ6IHsKKwkJaW50ICppYXJnID0gYXJnOworCisJCS8qIG5vdCBtdWNoIGNob2ljZSBvZiBvdXRwdXRzICovCisJCWlmICgqaWFyZyAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDogeworCQkvKiBBbHdheXMgZW5hYmxlZCAqLworCQlicmVhazsKKwl9CisJY2FzZSBERUNPREVSX1NFVF9QSUNUVVJFOiB7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisJCXVuc2lnbmVkIHZhbDsKKwkJaW50IGVycjsKKworCQl2YWwgPSAocGljLT5odWUgPj4gOCkgLSAweDgwOworCQllcnIgPSBzYWE3MTkxX3dyaXRlX3JlZyhjbGllbnQsIFNBQTcxOTFfUkVHX0hVRUMsIHZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJfQorCWNhc2UgREVDT0RFUl9TQUE3MTkxX0dFVF9TVEFUVVM6IHsKKwkJc3RydWN0IHNhYTcxOTFfc3RhdHVzICpzdGF0dXMgPSBhcmc7CisJCXVuc2lnbmVkIGNoYXIgc3RhdHVzX3JlZzsKKworCQlpZiAoc2FhNzE5MV9yZWFkX3N0YXR1cyhjbGllbnQsICZzdGF0dXNfcmVnKSkKKwkJCXJldHVybiAtRUlPOworCQlzdGF0dXMtPnNpZ25hbCA9ICgoc3RhdHVzX3JlZyAmIFNBQTcxOTFfU1RBVFVTX0hMQ0spID09IDApCisJCQk/IFNBQTcxOTFfVkFMVUVfRU5BQkxFRCA6IFNBQTcxOTFfVkFMVUVfRElTQUJMRUQ7CisJCXN0YXR1cy0+bnRzYyA9IChzdGF0dXNfcmVnICYgU0FBNzE5MV9TVEFUVVNfRklEVCkKKwkJCT8gU0FBNzE5MV9WQUxVRV9FTkFCTEVEIDogU0FBNzE5MV9WQUxVRV9ESVNBQkxFRDsKKwkJc3RhdHVzLT5jb2xvciA9IChzdGF0dXNfcmVnICYgU0FBNzE5MV9TVEFUVVNfQ09ERSkKKwkJCT8gU0FBNzE5MV9WQUxVRV9FTkFCTEVEIDogU0FBNzE5MV9WQUxVRV9ESVNBQkxFRDsKKworCQlzdGF0dXMtPmlucHV0ID0gZGVjb2Rlci0+aW5wdXQ7CisJCXN0YXR1cy0+bm9ybSA9IGRlY29kZXItPm5vcm07CisJfQorCWNhc2UgREVDT0RFUl9TQUE3MTkxX1NFVF9OT1JNOiB7CisJCWludCAqbm9ybSA9IGFyZzsKKwkJcmV0dXJuIHNhYTcxOTFfc2V0X25vcm0oY2xpZW50LCAqbm9ybSk7CisJfQorCWNhc2UgREVDT0RFUl9TQUE3MTkxX0dFVF9DT05UUk9MUzogeworCQlzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sICpjdHJsID0gYXJnOworCQlyZXR1cm4gc2FhNzE5MV9nZXRfY29udHJvbHMoY2xpZW50LCBjdHJsKTsKKwl9CisJY2FzZSBERUNPREVSX1NBQTcxOTFfU0VUX0NPTlRST0xTOiB7CisJCXN0cnVjdCBzYWE3MTkxX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCXJldHVybiBzYWE3MTkxX3NldF9jb250cm9scyhjbGllbnQsIGN0cmwpOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfc2FhNzE5MSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUgCQk9ICJzYWE3MTkxIiwKKwkuaWQgCQk9IEkyQ19EUklWRVJJRF9TQUE3MTkxLAorCS5mbGFncyAJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE3MTkxX3Byb2JlLAorCS5kZXRhY2hfY2xpZW50IAk9IHNhYTcxOTFfZGV0YWNoLAorCS5jb21tYW5kIAk9IHNhYTcxOTFfY29tbWFuZAorfTsKKworc3RhdGljIGludCBzYWE3MTkxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmkyY19kcml2ZXJfc2FhNzE5MSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhYTcxOTFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX3NhYTcxOTEpOworfQorCittb2R1bGVfaW5pdChzYWE3MTkxX2luaXQpOworbW9kdWxlX2V4aXQoc2FhNzE5MV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5MS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTkxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyMDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE5MS5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogIHNhYTcxOTEuaCAtIFBoaWxpcHMgU0FBNzE5MSB2aWRlbyBkZWNvZGVyIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pa2FlbCBOb3VzaWFpbmVuIDx0bW5vdXNpYUBjYy5odXQuZmk+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9TQUE3MTkxX0hfCisjZGVmaW5lIF9TQUE3MTkxX0hfCisKKy8qIFBoaWxpcHMgU0FBNzE5MSBETVNEIEkyQyBidXMgYWRkcmVzcyAqLworI2RlZmluZSBTQUE3MTkxX0FERFIJCTB4OGEKKworLyogUmVnaXN0ZXIgc3ViYWRkcmVzc2VzLiAqLworI2RlZmluZSBTQUE3MTkxX1JFR19JREVMCTB4MDAKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSFNZQgkweDAxCisjZGVmaW5lIFNBQTcxOTFfUkVHX0hTWVMJMHgwMgorI2RlZmluZSBTQUE3MTkxX1JFR19IQ0xCCTB4MDMKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSENMUwkweDA0CisjZGVmaW5lIFNBQTcxOTFfUkVHX0hQSEkJMHgwNQorI2RlZmluZSBTQUE3MTkxX1JFR19MVU1BCTB4MDYKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSFVFQwkweDA3CisjZGVmaW5lIFNBQTcxOTFfUkVHX0NLVFEJMHgwOAorI2RlZmluZSBTQUE3MTkxX1JFR19DS1RTCTB4MDkKKyNkZWZpbmUgU0FBNzE5MV9SRUdfUExTRQkweDBhCisjZGVmaW5lIFNBQTcxOTFfUkVHX1NFU0UJMHgwYgorI2RlZmluZSBTQUE3MTkxX1JFR19HQUlOCTB4MGMKKyNkZWZpbmUgU0FBNzE5MV9SRUdfU1REQwkweDBkCisjZGVmaW5lIFNBQTcxOTFfUkVHX0lPQ0sJMHgwZQorI2RlZmluZSBTQUE3MTkxX1JFR19DVEwzCTB4MGYKKyNkZWZpbmUgU0FBNzE5MV9SRUdfQ1RMNAkweDEwCisjZGVmaW5lIFNBQTcxOTFfUkVHX0NIQ1YJMHgxMQorI2RlZmluZSBTQUE3MTkxX1JFR19IUzZCCTB4MTQKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSFM2UwkweDE1CisjZGVmaW5lIFNBQTcxOTFfUkVHX0hDNkIJMHgxNgorI2RlZmluZSBTQUE3MTkxX1JFR19IQzZTCTB4MTcKKyNkZWZpbmUgU0FBNzE5MV9SRUdfSFA2SQkweDE4CisjZGVmaW5lIFNBQTcxOTFfUkVHX1NUQVRVUwkweGZmCS8qIG5vdCByZWFsbHkgYSBzdWJhZGRyZXNzICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTQUE3MTkxX1NUQVRVU19DT0RFCTB4MDEJLyogY29sb3IgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBTQUE3MTkxX1NUQVRVU19GSURUCTB4MjAJLyogZm9ybWF0IHR5cGUgTlRTQy9QQUwgKi8KKyNkZWZpbmUgU0FBNzE5MV9TVEFUVVNfSExDSwkweDQwCS8qIFBMTCB1bmxvY2tlZC9sb2NrZWQgKi8KKyNkZWZpbmUgU0FBNzE5MV9TVEFUVVNfU1RUQwkweDgwCS8qIHR2L3Z0ciB0aW1lIGNvbnN0YW50ICovCisKKy8qIEx1bWluYW5jZSBDb250cm9sIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNBQTcxOTFfTFVNQV9CWVBTCTB4ODAKKworLyogQ2hyb21hIEdhaW4gQ29udHJvbCBTZXR0aW5ncyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworLyogMD1hdXRvbWF0aWMgY29sb3VyLWtpbGxlciBlbmFibGVkLCAxPWZvcmNlZCBjb2xvdXIgb24gKi8KKyNkZWZpbmUgU0FBNzE5MV9HQUlOX0NPTE8JMHg4MAorCisvKiBTdGFuZGFyZC9Nb2RlIENvbnRyb2wgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKy8qIHR2L3Z0ciBtb2RlIGJpdDogMD1UViBtb2RlIChzbG93IHRpbWUgY29uc3RhbnQpLAorICogMT1WVFIgbW9kZSAoZmFzdCB0aW1lIGNvbnN0YW50KSAqLworI2RlZmluZSBTQUE3MTkxX1NURENfVlRSQwkweDgwCisvKiBTRUNBTSBtb2RlIGJpdDogMD1vdGhlciBzdGFuZGFyZHMsIDE9U0VDQU0gKi8KKyNkZWZpbmUgU0FBNzE5MV9TVERDX1NFQ1MJMHgwMQorLyogdGhlIGJpdCBmaWVsZHMgYWJvdmUgbXVzdCBiZSBvcidkIHdpdGggdGhpcyB2YWx1ZSAqLworI2RlZmluZSBTQUE3MTkxX1NURENfVkFMVUUJMHgwYworCisvKiBJL08gYW5kIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKy8qIGhvcml6b250YWwgY2xvY2sgUExMOiAwPVBMTCBjbG9zZWQsCisgKiAxPVBMTCBjaXJjdWl0IG9wZW4gYW5kIGhvcml6b250YWwgZnJlcSBmaXhlZCAqLworI2RlZmluZSBTQUE3MTkxX0lPQ0tfSFBMTAkweDgwCisvKiBTLVZIUyBiaXQgKGNocm9taW5hbmNlIGZyb20gQ1ZCUyBvciBmcm9tIGNocm9taW5hbmNlIGlucHV0KToKKyAqIDA9Y29udHJvbGxlZCBieSBCWVBTLWJpdCwgMT1mcm9tIGNocm9taW5hbmNlIGlucHV0ICovCisjZGVmaW5lIFNBQTcxOTFfSU9DS19DSFJTCTB4MDQKKy8qIGdlbmVyYWwgcHVycG9zZSBzd2l0Y2ggMgorICogVklOTy1zcGVjaWZpYzogMD11c2VkIHdpdGggQ1ZCUywgMT11c2VkIHdpdGggUy1WaWRlbyAqLworI2RlZmluZSBTQUE3MTkxX0lPQ0tfR1BTVzIJMHgwMgorLyogZ2VuZXJhbCBwdXJwb3NlIHN3aXRjaCAxICovCisvKiBWSU5PLXNwZWNpZmljOiAwPWFsd2F5cywgMT1ub3QgdXNlZCEqLworI2RlZmluZSBTQUE3MTkxX0lPQ0tfR1BTVzEJMHgwMQorCisvKiBNaXNjZWxsYW5lb3VzIENvbnRyb2wgIzEgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKy8qIGF1dG9tYXRpYyBmaWVsZCBkZXRlY3Rpb24gKDUwLzYwSHogc3RhbmRhcmQpICovCisjZGVmaW5lIFNBQTcxOTFfQ1RMM19BVUZECTB4ODAKKy8qIGZpZWxkIHNlbGVjdDogKGlmIEFVRkQ9MCkKKyAqIDA9NTBIeiAoNjI1IGxpbmVzKSwgMT02MEh6ICg1MjUgbGluZXMpICovCisjZGVmaW5lIFNBQTcxOTFfQ1RMM19GU0VMCTB4NDAKKy8qIHRoZSBiaXQgZmllbGRzIGFib3ZlIG11c3QgYmUgb3InZCB3aXRoIHRoaXMgdmFsdWUgKi8KKyNkZWZpbmUgU0FBNzE5MV9DVEwzX1ZBTFVFCTB4MTkKKworLyogQ2hyb21pbmFuY2UgR2FpbiBDb250cm9sIFJlZ2lzdGVyIGRlZmluaXRpb25zCisgKiAobm9taW5hbCB2YWx1ZSBmb3IgVVYgQ0NJUiBsZXZlbCkgKi8KKyNkZWZpbmUgU0FBNzE5MV9DSENWX05UU0MJMHgyYworI2RlZmluZSBTQUE3MTkxX0NIQ1ZfUEFMCTB4NTkKKworLyogRHJpdmVyIGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTQUE3MTkxX0lOUFVUX0NPTVBPU0lURQkwCisjZGVmaW5lIFNBQTcxOTFfSU5QVVRfU1ZJREVPCTEKKworI2RlZmluZSBTQUE3MTkxX05PUk1fQVVUTwkwCisjZGVmaW5lIFNBQTcxOTFfTk9STV9QQUwJMQorI2RlZmluZSBTQUE3MTkxX05PUk1fTlRTQwkyCisjZGVmaW5lIFNBQTcxOTFfTk9STV9TRUNBTQkzCisKKyNkZWZpbmUgU0FBNzE5MV9WQUxVRV9FTkFCTEVECQkxCisjZGVmaW5lIFNBQTcxOTFfVkFMVUVfRElTQUJMRUQJCTAKKyNkZWZpbmUgU0FBNzE5MV9WQUxVRV9VTkNIQU5HRUQJCS0xCisKK3N0cnVjdCBzYWE3MTkxX3N0YXR1cyB7CisJLyogMD1ubyBzaWduYWwsIDE9c2lnbmFsIGFjdGl2ZSovCisJaW50IHNpZ25hbDsKKwkvKiAwPTUwaHogKHBhbCkgc2lnbmFsLCAxPTYwaHogKG50c2MpIHNpZ25hbCAqLworCWludCBudHNjOworCS8qIDA9bm8gY29sb3IgZGV0ZWN0ZWQsIDE9Y29sb3IgZGV0ZWN0ZWQgKi8KKwlpbnQgY29sb3I7CisKKwkvKiBjdXJyZW50IFNBQTcxOTFfSU5QVVRfICovCisJaW50IGlucHV0OworCS8qIGN1cnJlbnQgU0FBNzE5MV9OT1JNXyAqLworCWludCBub3JtOworfTsKKworI2RlZmluZSBTQUE3MTkxX0hVRV9NSU4JCTB4MDAKKyNkZWZpbmUgU0FBNzE5MV9IVUVfTUFYCQkweGZmCisjZGVmaW5lIFNBQTcxOTFfSFVFX0RFRkFVTFQJMHg4MAorCisjZGVmaW5lIFNBQTcxOTFfVlRSQ19NSU4JMHgwMAorI2RlZmluZSBTQUE3MTkxX1ZUUkNfTUFYCTB4MDEKKyNkZWZpbmUgU0FBNzE5MV9WVFJDX0RFRkFVTFQJMHgwMAorCitzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sIHsKKwlpbnQgaHVlOworCWludCB2dHJjOworfTsKKworI2RlZmluZQlERUNPREVSX1NBQTcxOTFfR0VUX1NUQVRVUwlfSU9SKCdkJywgMTk1LCBzdHJ1Y3Qgc2FhNzE5MV9zdGF0dXMpCisjZGVmaW5lCURFQ09ERVJfU0FBNzE5MV9TRVRfTk9STQlfSU9XKCdkJywgMTk2LCBpbnQpCisjZGVmaW5lCURFQ09ERVJfU0FBNzE5MV9HRVRfQ09OVFJPTFMJX0lPUignZCcsIDE5Nywgc3RydWN0IHNhYTcxOTFfY29udHJvbCkKKyNkZWZpbmUJREVDT0RFUl9TQUE3MTkxX1NFVF9DT05UUk9MUwlfSU9XKCdkJywgMTk4LCBzdHJ1Y3Qgc2FhNzE5MV9jb250cm9sKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKaW5kZXggYjU3NzQzNS4uZDQ0OTdkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKQEAgLTIxODQsMzAgKzIxODQsMTggQEAKIAkJdmZyZWUoc2FhLT52aWRidWYpOwogCQl2ZnJlZShzYWEtPmF1ZGJ1Zik7CiAJCXZmcmVlKHNhYS0+b3NkYnVmKTsKLQkJaWYgKHNhYS0+ZG1hdmlkMikKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hdmlkMik7CisJCWtmcmVlKHNhYS0+ZG1hdmlkMik7CiAJCXNhYS0+YXVkYnVmID0gc2FhLT52aWRidWYgPSBzYWEtPm9zZGJ1ZiA9IE5VTEw7CiAJCXNhYS0+ZG1hdmlkMiA9IE5VTEw7Ci0JCWlmIChzYWEtPmRtYWRlYmkpCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYWRlYmkpOwotCQlpZiAoc2FhLT5kbWF2aWQxKQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWF2aWQxKTsKLQkJaWYgKHNhYS0+ZG1hdmlkMikKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hdmlkMik7Ci0JCWlmIChzYWEtPmRtYXZpZDMpCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYXZpZDMpOwotCQlpZiAoc2FhLT5kbWFhMWluKQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFhMWluKTsKLQkJaWYgKHNhYS0+ZG1hYTFvdXQpCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYWExb3V0KTsKLQkJaWYgKHNhYS0+ZG1hYTJpbikKLQkJCWtmcmVlKCh2b2lkICopIHNhYS0+ZG1hYTJpbik7Ci0JCWlmIChzYWEtPmRtYWEyb3V0KQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFhMm91dCk7Ci0JCWlmIChzYWEtPmRtYVJQUzEpCi0JCQlrZnJlZSgodm9pZCAqKSBzYWEtPmRtYVJQUzEpOwotCQlpZiAoc2FhLT5kbWFSUFMyKQotCQkJa2ZyZWUoKHZvaWQgKikgc2FhLT5kbWFSUFMyKTsKKwkJa2ZyZWUoc2FhLT5kbWFkZWJpKTsKKwkJa2ZyZWUoc2FhLT5kbWF2aWQxKTsKKwkJa2ZyZWUoc2FhLT5kbWF2aWQzKTsKKwkJa2ZyZWUoc2FhLT5kbWFhMWluKTsKKwkJa2ZyZWUoc2FhLT5kbWFhMW91dCk7CisJCWtmcmVlKHNhYS0+ZG1hYTJpbik7CisJCWtmcmVlKHNhYS0+ZG1hYTJvdXQpOworCQlrZnJlZShzYWEtPmRtYVJQUzEpOworCQlrZnJlZShzYWEtPmRtYVJQUzIpOwogCQlmcmVlX2lycShzYWEtPmlycSwgc2FhKTsKIAkJaWYgKHNhYS0+c2FhNzE0Nl9tZW0pCiAJCQlpb3VubWFwKHNhYS0+c2FhNzE0Nl9tZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTgyOTAuYwppbmRleCBhOGI2YThkLi5jNjVmMGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTgyOTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTgyOTAuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHRkYTgyOTAuYyx2IDEuMTUgMjAwNS8wNy8wOCAyMDoyMTozMyBtY2hlaGFiIEV4cCAkCiAgKgogICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgogICogY29udHJvbHMgdGhlIHBoaWxpcHMgdGRhODI5MCs3NSB0dW5lciBjaGlwIGNvbWJvLgpAQCAtOSw2ICs4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAKKyNkZWZpbmUgSTJDX0FERFJfVERBODI5MCAgICAgICAgMHg0YgorI2RlZmluZSBJMkNfQUREUl9UREE4Mjc1ICAgICAgICAweDYxCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IGZyZXFfZW50cnkgewpAQCAtNzUsMTAgKzc3LDEyIEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfc2V0X1ZTWzJdID0gCQl7IDB4MzAsIDB4NkYgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19zZXRfR1AwMV9DRlsyXSA9IAl7IDB4MjAsIDB4MEIgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY190ZGE4MjkwX3Jlc2V0WzJdID0JeyAweDAwLCAweDAwIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfdGRhODI5MF9zdGFuZGJ5WzJdID0JeyAweDAwLCAweDAyIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfZ2FpbnNldF9vZmZbMl0gPQl7IDB4MjgsIDB4MTQgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19nYWluc2V0X29uWzJdID0JeyAweDI4LCAweDU0IH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfYWdjM18wMFsyXSA9CQl7IDB4ODAsIDB4MDAgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19hZ2MyX0JGWzJdID0JCXsgMHg2MCwgMHhCRiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2NiMV9EMFsyXSA9CQl7IDB4MzAsIDB4RDAgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19jYjFfRDJbMl0gPQkJeyAweDMwLCAweEQyIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfY2IxXzU2WzJdID0JCXsgMHgzMCwgMHg1NiB9Owogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2NiMV81MlsyXSA9CQl7IDB4MzAsIDB4NTIgfTsKQEAgLTExNyw2ICsxMjEsMTMgQEAKIAl7IEkyQ19BRERSX1REQTgyOTAsIDAsIEFSUkFZX1NJWkUoaTJjX2dhaW5zZXRfb24pLCBpMmNfZ2FpbnNldF9vbiB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfbXNnIGkyY19tc2dfc3RhbmRieVtdID0geworCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfZW5hYmxlX2JyaWRnZSksIGkyY19lbmFibGVfYnJpZGdlIH0sCisJeyBJMkNfQUREUl9UREE4Mjc1LCAwLCBBUlJBWV9TSVpFKGkyY19jYjFfRDApLCBpMmNfY2IxX0QwIH0sCisJeyBJMkNfQUREUl9UREE4MjkwLCAwLCBBUlJBWV9TSVpFKGkyY19kaXNhYmxlX2JyaWRnZSksIGkyY19kaXNhYmxlX2JyaWRnZSB9LAorCXsgSTJDX0FERFJfVERBODI5MCwgMCwgQVJSQVlfU0laRShpMmNfdGRhODI5MF9zdGFuZGJ5KSwgaTJjX3RkYTgyOTBfc3RhbmRieSB9LAorfTsKKwogc3RhdGljIGludCB0ZGE4MjkwX3R1bmUoc3RydWN0IGkyY19jbGllbnQgKmMpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwpAQCAtMjA1LDYgKzIxNiwxMSBAQAogCXJldHVybiAoYWZjICYgMHg4MCk/IDY1NTM1OjA7CiB9CiAKK3N0YXRpYyB2b2lkIHN0YW5kYnkoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsIGkyY19tc2dfc3RhbmRieSwgQVJSQVlfU0laRShpMmNfbXNnX3N0YW5kYnkpKTsKK30KKwogaW50IHRkYTgyOTBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CkBAIC0yMTQsNiArMjMwLDcgQEAKIAl0LT50dl9mcmVxICAgID0gc2V0X3R2X2ZyZXE7CiAJdC0+cmFkaW9fZnJlcSA9IHNldF9yYWRpb19mcmVxOwogCXQtPmhhc19zaWduYWwgPSBoYXNfc2lnbmFsOworCXQtPnN0YW5kYnkgPSBzdGFuZGJ5OwogCiAJaTJjX21hc3Rlcl9zZW5kKGMsIGkyY19lbmFibGVfYnJpZGdlLCBBUlJBWV9TSVpFKGkyY19lbmFibGVfYnJpZGdlKSk7CiAJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsIGkyY19tc2dfaW5pdCwgQVJSQVlfU0laRShpMmNfbXNnX2luaXQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKaW5kZXggZDYwZmM1Ni4uMDQ1NmRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMKQEAgLTIzLDYgKzIzLDcgQEAKICAgICAgIFREQTk4ODcgKHdvcmxkKSwgVERBOTg4NSAoVVNBKQogICAgICAgTm90ZTogT1AyIG9mIHRkYTk4OHggbXVzdCBiZSBzZXQgdG8gMSwgZWxzZSBNVDIwMzIgaXMgZGlzYWJsZWQhCiAgICAtIEtOQyBPbmUgVFYtU3RhdGlvbiBSRFMgKHNhYTcxMzQpCisgICAtIEhhdXBwYXVnZSBQVlItMTUwLzUwMCAocG9zc2libHkgbW9yZSkKICovCiAKIApAQCAtNDksNyArNTAsNyBAQAogc3RydWN0IHRkYTk4ODcgewogCXN0cnVjdCBpMmNfY2xpZW50ICBjbGllbnQ7CiAJdjRsMl9zdGRfaWQgICAgICAgIHN0ZDsKLQl1bnNpZ25lZCBpbnQgICAgICAgcmFkaW87CisJZW51bSB0dW5lcl9tb2RlICAgIG1vZGU7CiAJdW5zaWduZWQgaW50ICAgICAgIGNvbmZpZzsKIAl1bnNpZ25lZCBpbnQgICAgICAgcGlubmFjbGVfaWQ7CiAJdW5zaWduZWQgaW50ICAgICAgIHVzaW5nX3Y0bDI7CkBAIC0xOTYsNyArMTk3LDcgQEAKIAkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAogCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJCSAgIGNEZWVtcGhhc2lzNTAgICksCisJCQkgICBjRGVlbXBoYXNpczc1ICApLAogCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYgICAgIHwKIAkJCSAgIGNBdWRpb0lGXzRfNSAgIHwKIAkJCSAgIGNWaWRlb0lGXzQ1Xzc1ICksCkBAIC0zNjQsNyArMzY1LDcgQEAKIAlzdHJ1Y3QgdHZub3JtICpub3JtID0gTlVMTDsKIAlpbnQgaTsKIAotCWlmICh0LT5yYWRpbykgeworCWlmICh0LT5tb2RlID09IFRfUkFESU8pIHsKIAkJaWYgKHQtPnJhZGlvX21vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCiAJCQlub3JtID0gJnJhZGlvX21vbm87CiAJCWVsc2UKQEAgLTM3OCw3ICszNzksNyBAQAogCQl9CiAJfQogCWlmIChOVUxMID09IG5vcm0pIHsKLQkJZHByaW50ayhQUkVGSVggIk9vcHM6IG5vIHR2bm9ybSBlbnRyeSBmb3VuZFxuIik7CisJCWRwcmludGsoUFJFRklYICJVbnN1cHBvcnRlZCB0dm5vcm0gZW50cnkgLSBhdWRpbyBtdXRlZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTUxOSw2ICs1MjAsMTIgQEAKIAkJCWRwcmludGsoUFJFRklYICJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtREtcbiIpOwogCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0RLOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKFBSRUZJWCAicGFsPSBhcmd1bWVudCBub3QgcmVjb2duaXNlZFxuIik7CisJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSA9PSBWNEwyX1NURF9TRUNBTSkgewpAQCAtNTM1LDYgKzU0MiwxMiBAQAogCQkJZHByaW50ayhQUkVGSVggImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKFBSRUZJWCAic2VjYW09IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNTY5LDYgKzU4MiwxMCBAQAogCXRkYTk4ODdfc2V0X2NvbmZpZyh0LGJ1Zik7CiAJdGRhOTg4N19zZXRfaW5zbW9kKHQsYnVmKTsKIAorCWlmICh0LT5tb2RlID09IFRfU1RBTkRCWSkgeworCQlidWZbMV0gfD0gY0ZvcmNlZE11dGVBdWRpb09OOworCX0KKwogCiAJZHByaW50ayhQUkVGSVggIndyaXRpbmc6IGI9MHglMDJ4IGM9MHglMDJ4IGU9MHglMDJ4XG4iLAogCQlidWZbMV0sYnVmWzJdLGJ1ZlszXSk7CkBAIC02NTMsMTAgKzY3MCwxNyBAQAogCiAJLyogLS0tIGNvbmZpZ3VyYXRpb24gLS0tICovCiAJY2FzZSBBVURDX1NFVF9SQURJTzoKLQkJdC0+cmFkaW8gPSAxOworCXsKKwkJdC0+bW9kZSA9IFRfUkFESU87CiAJCXRkYTk4ODdfY29uZmlndXJlKHQpOwogCQlicmVhazsKLQorCX0KKwljYXNlIFRVTkVSX1NFVF9TVEFOREJZOgorCXsKKwkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKKwkJdGRhOTg4N19jb25maWd1cmUodCk7CisJCWJyZWFrOworCX0KIAljYXNlIEFVRENfQ09ORklHX1BJTk5BQ0xFOgogCXsKIAkJaW50ICppID0gYXJnOwpAQCAtNjg5LDcgKzcxMyw3IEBACiAJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKIAogCQlDSEVDS19WNEwyOwotCQl0LT5yYWRpbyA9IDA7CisJCXQtPm1vZGUgPSBUX0FOQUxPR19UVjsKIAkJaWYgKHZjLT5ub3JtIDwgQVJSQVlfU0laRShtYXApKQogCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKIAkJdGRhOTg4N19maXh1cF9zdGQodCk7CkBAIC03MDEsNyArNzI1LDcgQEAKIAkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOwogCiAJCVNXSVRDSF9WNEwyOwotCQl0LT5yYWRpbyA9IDA7CisJCXQtPm1vZGUgPSBUX0FOQUxPR19UVjsKIAkJdC0+c3RkICAgPSAqaWQ7CiAJCXRkYTk4ODdfZml4dXBfc3RkKHQpOwogCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKQEAgLTcxMywxNCArNzM3LDE0IEBACiAKIAkJU1dJVENIX1Y0TDI7CiAJCWlmIChWNEwyX1RVTkVSX0FOQUxPR19UViA9PSBmLT50eXBlKSB7Ci0JCQlpZiAodC0+cmFkaW8gPT0gMCkKKwkJCWlmICh0LT5tb2RlID09IFRfQU5BTE9HX1RWKQogCQkJCXJldHVybiAwOwotCQkJdC0+cmFkaW8gPSAwOworCQkJdC0+bW9kZSA9IFRfQU5BTE9HX1RWOwogCQl9CiAJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IGYtPnR5cGUpIHsKLQkJCWlmICh0LT5yYWRpbyA9PSAxKQorCQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykKIAkJCQlyZXR1cm4gMDsKLQkJCXQtPnJhZGlvID0gMTsKKwkJCXQtPm1vZGUgPSBUX1JBRElPOwogCQl9CiAJCXRkYTk4ODdfY29uZmlndXJlKHQpOwogCQlicmVhazsKQEAgLTczNSw3ICs3NTksNyBAQAogCQl9OwogCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7CiAKLQkJaWYgKHQtPnJhZGlvKSB7CisJCWlmICh0LT5tb2RlID09IFRfUkFESU8pIHsKIAkJCV9fdTggcmVnID0gMDsKIAkJCXR1bmVyLT5hZmM9MDsKIAkJCWlmICgxID09IGkyY19tYXN0ZXJfcmVjdigmdC0+Y2xpZW50LCZyZWcsMSkpCkBAIC03NDcsNyArNzcxLDcgQEAKIAl7CiAJCXN0cnVjdCB2NGwyX3R1bmVyKiB0dW5lciA9IGFyZzsKIAotCQlpZiAodC0+cmFkaW8pIHsKKwkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykgewogCQkJdC0+cmFkaW9fbW9kZSA9IHR1bmVyLT5hdWRtb2RlOwogCQkJdGRhOTg4N19jb25maWd1cmUgKHQpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jCmluZGV4IGNlYmNjMWYuLjM4YmY1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jCkBAIC0yLDcgKzIsNiBAQAogICogRm9yIFBoaWxpcHMgVEVBNTc2NyBGTSBDaGlwIHVzZWQgb24gc29tZSBUViBDYXJkcyBsaWtlIFByb2xpbmsgUGl4ZWx2aWV3CiAgKiBJMkMgYWRkcmVzcyBpcyBhbGx3YXlzIDB4QzAuCiAgKgotICogJElkOiB0ZWE1NzY3LmMsdiAxLjI3IDIwMDUvMDcvMzEgMTI6MTA6NTYgbWNoZWhhYiBFeHAgJAogICoKICAqIENvcHlyaWdodCAoYykgMjAwNSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgKG1jaGVoYWJAYnJ0dXJiby5jb20uYnIpCiAgKiBUaGlzIGNvZGUgaXMgcGxhY2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTIwNSwxMSArMjA0LDYgQEAKIAkJICAgIFRFQTU3NjdfU1RfTk9JU0VfQ1RMIHwgVEVBNTc2N19KQVBBTl9CQU5EOwogCWJ1ZmZlcls0XSA9IDA7CiAKLQlpZiAodC0+bW9kZSA9PSBUX1NUQU5EQlkpIHsKLQkJdHVuZXJfZGJnKCJURUE1NzY3IHNldCB0byBzdGFuZGJ5IG1vZGVcbiIpOwotCQlidWZmZXJbM10gfD0gVEVBNTc2N19TVERCWTsKLQl9Ci0KIAlpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykgewogCQl0dW5lcl9kYmcoIlRFQTU3Njcgc2V0IHRvIG1vbm9cbiIpOwogCQlidWZmZXJbMl0gfD0gVEVBNTc2N19NT05POwpAQCAtMjkwLDEzICsyODQsMzEgQEAKIAlyZXR1cm4gKChidWZmZXJbMl0gJiBURUE1NzY3X1NURVJFT19NQVNLKSA/IFY0TDJfVFVORVJfU1VCX1NURVJFTyA6IDApOwogfQogCitzdGF0aWMgdm9pZCB0ZWE1NzY3X3N0YW5kYnkoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNV07CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXVuc2lnbmVkIGRpdiwgcmM7CisKKwlkaXYgPSAoODc1MDAgKiA0ICsgNzAwICsgMjI1ICsgMjUpIC8gNTA7IC8qIFNldCBmcmVxdWVuY3kgdG8gODcuNSBNSHogKi8KKwlidWZmZXJbMF0gPSAoZGl2ID4+IDgpICYgMHgzZjsKKwlidWZmZXJbMV0gPSBkaXYgJiAweGZmOworCWJ1ZmZlclsyXSA9IFRFQTU3NjdfUE9SVDFfSElHSDsKKwlidWZmZXJbM10gPSBURUE1NzY3X1BPUlQyX0hJR0ggfCBURUE1NzY3X0hJR0hfQ1VUX0NUUkwgfAorCQkgICAgVEVBNTc2N19TVF9OT0lTRV9DVEwgfCBURUE1NzY3X0pBUEFOX0JBTkQgfCBURUE1NzY3X1NUREJZOworCWJ1ZmZlcls0XSA9IDA7CisKKwlpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCA1KSkpCisJCXR1bmVyX3dhcm4oImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNSlcbiIsIHJjKTsKK30KKwogaW50IHRlYTU3NjdfYXV0b2RldGVjdGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqYykKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls3XSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OwogCWludCByYzsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKLQlpZiAoNyAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYywgYnVmZmVyLCA3KSkpIHsKKwlpZiAoKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsIGJ1ZmZlciwgNykpPCA1KSB7CiAJCXR1bmVyX3dhcm4oIkl0IGlzIG5vdCBhIFRFQTU3NjcuIFJlY2VpdmVkICVpIGJ5dGVzLlxuIiwgcmMpOwogCQlyZXR1cm4gRUlOVkFMOwogCX0KQEAgLTMxMywxNSArMzI1LDEwIEBACiAJICogICAgICAgICAgYml0IDAgICA6IGludGVybmFsbHkgc2V0IHRvIDAKIAkgKiAgQnl0ZSA1OiBiaXQgNzowIDogPT0gMAogCSAqLwotCWlmICghKChidWZmZXJbM10gJiAweDBmKSA9PSAweDAwKSAmJiAoYnVmZmVyWzRdID09IDB4MDApKSB7CisJaWYgKCgoYnVmZmVyWzNdICYgMHgwZikgIT0gMHgwMCkgfHwgKGJ1ZmZlcls0XSAhPSAweDAwKSkgewogCQl0dW5lcl93YXJuKCJDaGlwIElEIGlzIG5vdCB6ZXJvLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iKTsKIAkJcmV0dXJuIEVJTlZBTDsKIAl9Ci0JLyogSXQgc2VlbXMgdGhhdCB0ZWE1NzY3IHJldHVybnMgMHhmZiBhZnRlciB0aGUgNXRoIGJ5dGUgKi8KLQlpZiAoKGJ1ZmZlcls1XSAhPSAweGZmKSB8fCAoYnVmZmVyWzZdICE9IDB4ZmYpKSB7Ci0JCXR1bmVyX3dhcm4oIlJldHVybmVkIG1vcmUgdGhhbiA1IGJ5dGVzLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iKTsKLQkJcmV0dXJuIEVJTlZBTDsKLQl9CiAKIAkvKiBJdCBzZWVtcyB0aGF0IHRlYTU3NjcgcmV0dXJucyAweGZmIGFmdGVyIHRoZSA1dGggYnl0ZSAqLwogCWlmICgoYnVmZmVyWzVdICE9IDB4ZmYpIHx8IChidWZmZXJbNl0gIT0gMHhmZikpIHsKQEAgLTMzNywxNCArMzQ0LDE0IEBACiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCi0JdHVuZXJfaW5mbygidHlwZSBzZXQgdG8gJWQgKCVzKVxuIiwgdC0+dHlwZSwKLQkJCSJQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbyIpOworCXR1bmVyX2luZm8oInR5cGUgc2V0IHRvICVkICglcylcbiIsIHQtPnR5cGUsICJQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbyIpOwogCXN0cmxjcHkoYy0+bmFtZSwgInRlYTU3NjciLCBzaXplb2YoYy0+bmFtZSkpOwogCiAJdC0+dHZfZnJlcSA9IHNldF90dl9mcmVxOwogCXQtPnJhZGlvX2ZyZXEgPSBzZXRfcmFkaW9fZnJlcTsKIAl0LT5oYXNfc2lnbmFsID0gdGVhNTc2N19zaWduYWw7CiAJdC0+aXNfc3RlcmVvID0gdGVhNTc2N19zdGVyZW87CisJdC0+c3RhbmRieSA9IHRlYTU3Njdfc3RhbmRieTsKIAogCXJldHVybiAoMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDNiMTg5M2MuLjA1NTcyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdHVuZXItY29yZS5jLHYgMS42MyAyMDA1LzA3LzI4IDE4OjE5OjU1IG1jaGVoYWIgRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb3JlIGNvcmUsIGkuZS4ga2VybmVsIGludGVyZmFjZXMsIHJlZ2lzdGVyaW5nIGFuZCBzbyBvbgpAQCAtMTgyLDYgKzE4MSwxNCBAQAogCQlpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCA0KTsKIAkJZGVmYXVsdF90dW5lcl9pbml0KGMpOwogCQlicmVhazsKKwljYXNlIFRVTkVSX0xHX1REVlNfSDA2MkY6CisJCS8qIFNldCB0aGUgQXV4aWxpYXJ5IEJ5dGUuICovCisJCWJ1ZmZlclsyXSAmPSB+MHgyMDsKKwkJYnVmZmVyWzJdIHw9IDB4MTg7CisJCWJ1ZmZlclszXSA9IDB4MjA7CisJCWkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDQpOworCQlkZWZhdWx0X3R1bmVyX2luaXQoYyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7CkBAIC0yMDgsMzEgKzIxNSwzMSBAQAogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAotCWlmICh0dW5fc2V0dXAtPmFkZHIgPT0gQUREUl9VTlNFVCkgewotCQlpZiAodC0+bW9kZV9tYXNrICYgdHVuX3NldHVwLT5tb2RlX21hc2spCisJaWYgKCh0dW5fc2V0dXAtPmFkZHIgPT0gQUREUl9VTlNFVCAmJgorCQkodC0+bW9kZV9tYXNrICYgdHVuX3NldHVwLT5tb2RlX21hc2spKSB8fAorCQl0dW5fc2V0dXAtPmFkZHIgPT0gYy0+YWRkcikgewogCQkJc2V0X3R5cGUoYywgdHVuX3NldHVwLT50eXBlLCB0dW5fc2V0dXAtPm1vZGVfbWFzayk7Ci0JfSBlbHNlIGlmICh0dW5fc2V0dXAtPmFkZHIgPT0gYy0+YWRkcikgewotCQlzZXRfdHlwZShjLCB0dW5fc2V0dXAtPnR5cGUsIHR1bl9zZXR1cC0+bW9kZV9tYXNrKTsKIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21vZGUoc3RydWN0IHR1bmVyICp0LCBjaGFyICpjbWQpCiB7Ci0JaWYgKDEgPDwgdC0+bW9kZSAmIHQtPm1vZGVfbWFzaykgewotCQlzd2l0Y2ggKHQtPm1vZGUpIHsKLQkJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgotCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIHJhZGlvXG4iLCBjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6Ci0JCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgYW5hbG9nIFRWXG4iLCBjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgotCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIGRpZ2l0YWwgVFZcbiIsIGNtZCk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gMDsKKwlpZiAoKDEgPDwgdC0+bW9kZSAmIHQtPm1vZGVfbWFzaykgPT0gMCkgeworCQlyZXR1cm4gRUlOVkFMOwogCX0KLQlyZXR1cm4gRUlOVkFMOworCisJc3dpdGNoICh0LT5tb2RlKSB7CisJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgorCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgcmFkaW9cbiIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CisJCXR1bmVyX2RiZygiQ21kICVzIGFjY2VwdGVkIGZvciBhbmFsb2cgVFZcbiIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgorCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgZGlnaXRhbCBUVlxuIiwgY21kKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgY2hhciBwYWxbXSA9ICItIjsKQEAgLTI3NCw2ICsyODEsMTIgQEAKIAkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1OXG4iKTsKIAkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9OOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHVuZXJfd2FybiAoInBhbD0gYXJndW1lbnQgbm90IHJlY29nbmlzZWRcbiIpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9TRUNBTSkgPT0gVjRMMl9TVERfU0VDQU0pIHsKQEAgLTI5MCw2ICszMDMsMTIgQEAKIAkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MOwogCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHVuZXJfd2FybiAoInNlY2FtPSBhcmd1bWVudCBub3QgcmVjb2duaXNlZFxuIik7CisJCQlicmVhazsKIAkJfQogCX0KIApAQCAtNDA2LDIwICs0MjUsMTggQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2V0X21vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHR1bmVyICp0LCBpbnQgbW9kZSwgY2hhciAqY21kKQogewotCWlmIChtb2RlICE9IHQtPm1vZGUpIHsKKyAJaWYgKG1vZGUgPT0gdC0+bW9kZSkKKyAJCXJldHVybiAwOwogCi0JCXQtPm1vZGUgPSBtb2RlOwotCQlpZiAoY2hlY2tfbW9kZSh0LCBjbWQpID09IEVJTlZBTCkgewotCQkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKLQkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IG1vZGUpIHsKLQkJCQlzZXRfdHZfZnJlcShjbGllbnQsIDQwMCAqIDE2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0X3JhZGlvX2ZyZXEoY2xpZW50LCA4Ny41ICogMTYwMDApOwotCQkJfQotCQkJcmV0dXJuIEVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAJdC0+bW9kZSA9IG1vZGU7CisKKyAJaWYgKGNoZWNrX21vZGUodCwgY21kKSA9PSBFSU5WQUwpIHsKKyAJCXQtPm1vZGUgPSBUX1NUQU5EQlk7CisgCQlpZiAodC0+c3RhbmRieSkKKyAJCQl0LT5zdGFuZGJ5IChjbGllbnQpOworIAkJcmV0dXJuIEVJTlZBTDsKKyAgCX0KKyAgCXJldHVybiAwOwogfQogCiAjZGVmaW5lIHN3aXRjaF92NGwyKCkJaWYgKCF0LT51c2luZ192NGwyKSBcCkBAIC00NTMsNiArNDcwLDE0IEBACiAJY2FzZSBBVURDX1NFVF9SQURJTzoKIAkJc2V0X21vZGUoY2xpZW50LHQsVjRMMl9UVU5FUl9SQURJTywgIkFVRENfU0VUX1JBRElPIik7CiAJCWJyZWFrOworCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CisJCXsKKwkJCWlmIChjaGVja19tb2RlKHQsICJUVU5FUl9TRVRfU1RBTkRCWSIpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICh0LT5zdGFuZGJ5KQorCQkJCXQtPnN0YW5kYnkgKGNsaWVudCk7CisJCQlicmVhazsKKwkJfQogCWNhc2UgQVVEQ19DT05GSUdfUElOTkFDTEU6CiAJCWlmIChjaGVja19tb2RlKHQsICJBVURDX0NPTkZJR19QSU5OQUNMRSIpID09IEVJTlZBTCkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKaW5kZXggZGUwYzkzYS4uOGVkZDczYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdHVuZXItc2ltcGxlLmMsdiAxLjQzIDIwMDUvMDcvMjggMTg6NDE6MjEgbWNoZWhhYiBFeHAgJAogICoKICAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSBkcml2ZXIKICAqIGNvbnRyb2xzIGFsbCB0aG9zZSBzaW1wbGUgNC1jb250cm9sLWJ5dGVzIHN0eWxlIHR1bmVycy4KQEAgLTEwMiw2ICsxMDEsNyBAQAogICoJIm5vIGZsb2F0IGluIGtlcm5lbCIgcnVsZS4KICAqLwogc3RhdGljIHN0cnVjdCB0dW5lcnR5cGUgdHVuZXJzW10gPSB7CisJLyogMC05ICovCiAgICAgICAgIHsgIlRlbWljIFBBTCAoNDAwMiBGSDUpIiwgVEVNSUMsIFBBTCwKIAkgIDE2KjE0MC4yNSwxNio0NjMuMjUsMHgwMiwweDA0LDB4MDEsMHg4ZSw2MjN9LAogCXsgIlBoaWxpcHMgUEFMX0kgKEZJMTI0NiBhbmQgY29tcGF0aWJsZXMpIiwgUGhpbGlwcywgUEFMX0ksCkBAIC0xMTAsNyArMTEwLDYgQEAKIAkgIDE2KjE1Ny4yNSwxNio0NTEuMjUsMHhBMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAogCXsgIlBoaWxpcHMgKFNFQ0FNK1BBTF9CRykgKEZJMTIxNk1GLCBGTTEyMTZNRiwgRlIxMjE2TUYpIiwgUGhpbGlwcywgU0VDQU0sCiAJICAxNioxNjguMjUsMTYqNDQ3LjI1LDB4QTcsMHg5NywweDM3LDB4OGUsNjIzfSwKLQogCXsgIk5vVHVuZXIiLCBOb1R1bmVyLCBOT1RVTkVSLAogCSAgMCwwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sCiAJeyAiUGhpbGlwcyBQQUxfQkcgKEZJMTIxNiBhbmQgY29tcGF0aWJsZXMpIiwgUGhpbGlwcywgUEFMLApAQCAtMTE5LDM0ICsxMTgsMzQgQEAKIAkgIDE2KjE1Ny4yNSwxNio0NjMuMjUsMHgwMiwweDA0LDB4MDEsMHg4ZSw3MzJ9LAogCXsgIlRlbWljIFBBTF9JICg0MDYyIEZZNSkiLCBURU1JQywgUEFMX0ksCiAJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4MDIsMHgwNCwweDAxLDB4OGUsNjIzfSwKLQogIAl7ICJUZW1pYyBOVFNDICg0MDM2IEZZNSkiLCBURU1JQywgTlRTQywKIAkgIDE2KjE1Ny4yNSwxNio0NjMuMjUsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAogICAgICAgICB7ICJBbHBzIEhTQkgxIiwgVEVNSUMsIE5UU0MsCiAJICAxNioxMzcuMjUsMTYqMzg1LjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyfSwKLSAgICAgICAgeyAiQWxwcyBUU0JFMSIsVEVNSUMsUEFMLAorCisJLyogMTAtMTkgKi8KKyAgICAgICAgeyAiQWxwcyBUU0JFMSIsIFRFTUlDLCBQQUwsCiAJICAxNioxMzcuMjUsMTYqMzg1LjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyfSwKICAgICAgICAgeyAiQWxwcyBUU0JCNSIsIEFscHMsIFBBTF9JLCAvKiB0ZXN0ZWQgKFVLIFVIRikgd2l0aCBNb2R1bGFydGVjaCBNTTIwNSAqLwogCSAgMTYqMTMzLjI1LDE2KjM1MS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDYzMn0sCi0KICAgICAgICAgeyAiQWxwcyBUU0JFNSIsIEFscHMsIFBBTCwgLyogdW50ZXN0ZWQgLSBkYXRhIHNoZWV0IGd1ZXNzLiBPbmx5IElGIGRpZmZlcnMuICovCiAJICAxNioxMzMuMjUsMTYqMzUxLjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNjIyfSwKICAgICAgICAgeyAiQWxwcyBUU0JDNSIsIEFscHMsIFBBTCwgLyogdW50ZXN0ZWQgLSBkYXRhIHNoZWV0IGd1ZXNzLiBPbmx5IElGIGRpZmZlcnMuICovCiAJICAxNioxMzMuMjUsMTYqMzUxLjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNjA4fSwKIAl7ICJUZW1pYyBQQUxfQkcgKDQwMDZGSDUpIiwgVEVNSUMsIFBBTCwKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotICAJeyAiQWxwcyBUU0NINiIsQWxwcyxOVFNDLAorICAJeyAiQWxwcyBUU0NINiIsIEFscHMsIE5UU0MsCiAgIAkgIDE2KjEzNy4yNSwxNiozODUuMjUsMHgxNCwweDEyLDB4MTEsMHg4ZSw3MzJ9LAotCi0gIAl7ICJUZW1pYyBQQUxfREsgKDQwMTYgRlk1KSIsVEVNSUMsUEFMLAorICAJeyAiVGVtaWMgUEFMX0RLICg0MDE2IEZZNSkiLCBURU1JQywgUEFMLAogICAJICAxNioxNjguMjUsMTYqNDU2LjI1LDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLSAgCXsgIlBoaWxpcHMgTlRTQ19NIChNSzIpIixQaGlsaXBzLE5UU0MsCisgIAl7ICJQaGlsaXBzIE5UU0NfTSAoTUsyKSIsIFBoaWxpcHMsIE5UU0MsCiAgIAkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAogICAgICAgICB7ICJUZW1pYyBQQUxfSSAoNDA2NiBGWTUpIiwgVEVNSUMsIFBBTF9JLAogICAgICAgICAgIDE2KjE2OS4wMCwgMTYqNDU0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAgICAgICAgIHsgIlRlbWljIFBBTCogYXV0byAoNDAwNiBGTjUpIiwgVEVNSUMsIFBBTCwKICAgICAgICAgICAxNioxNjkuMDAsIDE2KjQ1NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCisJLyogMjAtMjkgKi8KICAgICAgICAgeyAiVGVtaWMgUEFMX0JHICg0MDA5IEZSNSkgb3IgUEFMX0kgKDQwNjkgRlI1KSIsIFRFTUlDLCBQQUwsCiAgICAgICAgICAgMTYqMTQxLjAwLCAxNio0NjQuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKICAgICAgICAgeyAiVGVtaWMgTlRTQyAoNDAzOSBGUjUpIiwgVEVNSUMsIE5UU0MsCkBAIC0xNTUsNyArMTU0LDYgQEAKICAgICAgICAgICAxNioxNjkuMDAsIDE2KjQ1NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogICAgICAgICB7ICJQaGlsaXBzIFBBTF9ESyAoRkkxMjU2IGFuZCBjb21wYXRpYmxlcykiLCBQaGlsaXBzLCBQQUwsCiAJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQogCXsgIlBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZNRSkiLCBQaGlsaXBzLCBQQUwsCiAJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKIAl7ICJMRyBQQUxfSStGTSAoVEFQQy1JMDAxRCkiLCBMR0lOTk9URUssIFBBTF9JLApAQCAtMTY0LDI1ICsxNjIsMjQgQEAKIAkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCXsgIkxHIE5UU0MrRk0gKFRQSThOU1IwMUYpIiwgTEdJTk5PVEVLLCBOVFNDLAogCSAgMTYqMjEwLjAwLDE2KjQ5Ny4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCi0KIAl7ICJMRyBQQUxfQkcrRk0gKFRQSThQU0IwMUQpIiwgTEdJTk5PVEVLLCBQQUwsCiAJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKIAl7ICJMRyBQQUxfQkcgKFRQSThQU0IxMUQpIiwgTEdJTk5PVEVLLCBQQUwsCiAJICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKKworCS8qIDMwLTM5ICovCiAJeyAiVGVtaWMgUEFMKiBhdXRvICsgRk0gKDQwMDkgRk41KSIsIFRFTUlDLCBQQUwsCiAJICAxNioxNDEuMDAsIDE2KjQ2NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCXsgIlNIQVJQIE5UU0NfSlAgKDJVNUpGNTU0MCkiLCBTSEFSUCwgTlRTQywgLyogOTQwPTE2KjU4Ljc1IE5UU0NASmFwYW4gKi8KIAkgIDE2KjEzNy4yNSwxNiozMTcuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw5NDAgfSwKLQotCXsgIlNhbXN1bmcgUEFMIFRDUE05MDkxUEQyNyIsIFNhbXN1bmcsIFBBTCwgIC8qIGZyb20gc291cmNlZm9yZ2UgdjN0diAqLworCXsgIlNhbXN1bmcgUEFMIFRDUE05MDkxUEQyNyIsIFNhbXN1bmcsIFBBTCwgLyogZnJvbSBzb3VyY2Vmb3JnZSB2M3R2ICovCiAgICAgICAgICAgMTYqMTY5LDE2KjQ2NCwweEEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiTVQyMHh4IHVuaXZlcnNhbCIsIE1pY3JvdHVuZSxQQUx8TlRTQywKKwl7ICJNVDIweHggdW5pdmVyc2FsIiwgTWljcm90dW5lLCBQQUx8TlRTQywKIAkgIC8qIHNlZSBtdDIweHguYyBmb3IgZGV0YWlscyAqLyB9LAogCXsgIlRlbWljIFBBTF9CRyAoNDEwNiBGSDUpIiwgVEVNSUMsIFBBTCwKICAgICAgICAgICAxNioxNDEuMDAsIDE2KjQ2NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCXsgIlRlbWljIFBBTF9ESy9TRUNBTV9MICg0MDEyIEZZNSkiLCBURU1JQywgUEFMLAogICAgICAgICAgIDE2KjE0MC4yNSwgMTYqNDYzLjI1LCAweDAyLDB4MDQsMHgwMSwweDhlLDYyM30sCi0KIAl7ICJUZW1pYyBOVFNDICg0MTM2IEZZNSkiLCBURU1JQywgTlRTQywKICAgICAgICAgICAxNioxNTguMDAsIDE2KjQ1My4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAogICAgICAgICB7ICJMRyBQQUwgKG5ld2VyIFRBUEMgc2VyaWVzKSIsIExHSU5OT1RFSywgUEFMLApAQCAtMTkyLDQyICsxODksNDEgQEAKIAl7ICJMRyBOVFNDIChuZXdlciBUQVBDIHNlcmllcykiLCBMR0lOTk9URUssIE5UU0MsCiAgICAgICAgICAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyfSwKIAorCS8qIDQwLTQ5ICovCiAJeyAiSElUQUNISSBWNy1KMTgwQVQiLCBISVRBQ0hJLCBOVFNDLAogCSAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4OGUsOTQwIH0sCiAJeyAiUGhpbGlwcyBQQUxfTUsgKEZJMTIxNiBNSykiLCBQaGlsaXBzLCBQQUwsCiAJICAxNioxNDAuMjUsMTYqNDYzLjI1LDB4MDEsMHhjMiwweGNmLDB4OGUsNjIzfSwKLQl7ICJQaGlsaXBzIDEyMzZEIEFUU0MvTlRTQyBkYXVsIGluIixQaGlsaXBzLEFUU0MsCisJeyAiUGhpbGlwcyAxMjM2RCBBVFNDL05UU0MgZGF1bCBpbiIsIFBoaWxpcHMsIEFUU0MsCiAJICAxNioxNTcuMjUsMTYqNDU0LjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNzMyfSwKICAgICAgICAgeyAiUGhpbGlwcyBOVFNDIE1LMyAoRk0xMjM2TUszIG9yIEZNMTIzNi9GKSIsIFBoaWxpcHMsIE5UU0MsCiAgICAgICAgICAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMn0sCi0KICAgICAgICAgeyAiUGhpbGlwcyA0IGluIDEgKEFUSSBUViBXb25kZXIgUHJvL0NvbmV4YW50KSIsIFBoaWxpcHMsIE5UU0MsCiAgICAgICAgICAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMn0sCi0JeyAiTWljcm90dW5lIDQwNDkgRk01IixNaWNyb3R1bmUsUEFMLAorCXsgIk1pY3JvdHVuZSA0MDQ5IEZNNSIsIE1pY3JvdHVuZSwgUEFMLAogCSAgMTYqMTQxLjAwLDE2KjQ2NC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCiAJeyAiUGFuYXNvbmljIFZQMjdzL0VOR0U0MzI0RCIsIFBhbmFzb25pYywgTlRTQywKIAkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDgsMHhjZSw5NDB9LAogICAgICAgICB7ICJMRyBOVFNDIChUQVBFIHNlcmllcykiLCBMR0lOTk9URUssIE5UU0MsCiAgICAgICAgICAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMiB9LAotCiAgICAgICAgIHsgIlRlbm5hIFRORiA4ODMxIEJHRkYpIiwgUGhpbGlwcywgUEFMLAogICAgICAgICAgIDE2KjE2MS4yNSwxNio0NjMuMjUsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAogCXsgIk1pY3JvdHVuZSA0MDQyIEZJNSBBVFNDL05UU0MgZHVhbCBpbiIsIE1pY3JvdHVuZSwgTlRTQywKIAkgIDE2KjE2Mi4wMCwxNio0NTcuMDAsMHhhMiwweDk0LDB4MzEsMHg4ZSw3MzJ9LAorCisJLyogNTAtNTkgKi8KICAgICAgICAgeyAiVENMIDIwMDJOIiwgVENMLCBOVFNDLAogICAgICAgICAgIDE2KjE3Mi4wMCwxNio0NDguMDAsMHgwMSwweDAyLDB4MDgsMHg4ZSw3MzJ9LAogCXsgIlBoaWxpcHMgUEFML1NFQ0FNX0QgKEZNIDEyNTYgSS1IMykiLCBQaGlsaXBzLCBQQUwsCiAJICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNjIzIH0sCi0KIAl7ICJUaG9tc29uIEREVCA3NjEwIChBVFNDL05UU0MpIiwgVEhPTVNPTiwgQVRTQywKIAkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgzOSwweDNhLDB4M2MsMHg4ZSw3MzJ9LAogCXsgIlBoaWxpcHMgRlExMjg2IiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHg0MSwweDQyLDB4MDQsMHg4ZSw5NDB9LCAvLyBVSEYgYmFuZCB1bnRlc3RlZAotCXsgInRkYTgyOTArNzUiLCBQaGlsaXBzLFBBTHxOVFNDLAorCSAgMTYqMTYwLjAwLDE2KjQ1NC4wMCwweDQxLDB4NDIsMHgwNCwweDhlLDk0MH0sIC8qIFVIRiBiYW5kIHVudGVzdGVkICovCisJeyAidGRhODI5MCs3NSIsIFBoaWxpcHMsIFBBTHxOVFNDLAogCSAgLyogc2VlIHRkYTgyOTAuYyBmb3IgZGV0YWlscyAqLyB9LAogCXsgIkxHIFBBTCAoVEFQRSBzZXJpZXMpIiwgTEdJTk5PVEVLLCBQQUwsCiAgICAgICAgICAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4Y2UsNjIzfSwKLQogCXsgIlBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZBTUUgTUs0KSIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw2MjMgfSwKIAl7ICJQaGlsaXBzIEZRMTIzNkEgTUs0IiwgUGhpbGlwcywgTlRTQywKQEAgLTIzNyw2ICsyMzMsNyBAQAogCXsgIlltZWMgVFZpc2lvbiBUVkYtNTUzM01GIiwgUGhpbGlwcywgTlRTQywKIAkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAogCisJLyogNjAtNjYgKi8KIAl7ICJUaG9tc29uIEREVCA3NjExIChBVFNDL05UU0MpIiwgVEhPTVNPTiwgQVRTQywKIAkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgzOSwweDNhLDB4M2MsMHg4ZSw3MzJ9LAogCXsgIlRlbmEgVE5GOTUzMy1EL0lGL1RORjk1MzMtQi9ERiIsIFBoaWxpcHMsIFBBTCwKQEAgLTI0NSwxMiArMjQyLDEyIEBACiAgICAgICAgICAgLyogc2VlIHRlYTU3NjcuYyBmb3IgZGV0YWlscyAqL30sCiAJeyAiUGhpbGlwcyBGTUQxMjE2TUUgTUszIEh5YnJpZCBUdW5lciIsIFBoaWxpcHMsIFBBTCwKIAkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHg1MSwweDUyLDB4NTQsMHg4Niw2MjMgfSwKLQotCXsgIkxHIFREVlMtSDA2MkYvVFVBNjAzNCIsIExHSU5OT1RFSywgTlRTQywKKwl7ICJMRyBURFZTLUgwNjJGL1RVQTYwMzQiLCBMR0lOTk9URUssIEFUU0MsCiAJICAxNioxNjAuMDAsMTYqNDU1LjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyfSwKLQogCXsgIlltZWMgVFZGNjZUNS1CL0RGRiIsIFBoaWxpcHMsIFBBTCwKICAgICAgICAgICAxNioxNjAuMjUsMTYqNDY0LjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNjIzfSwKKyAJeyAiTEcgTlRTQyAoVEFMTiBtaW5pIHNlcmllcykiLCBMR0lOTk9URUssIE5UU0MsCisJICAxNioxMzcuMjUsMTYqMzczLjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyIH0sCiB9OwogCiB1bnNpZ25lZCBjb25zdCBpbnQgdHVuZXJfY291bnQgPSBBUlJBWV9TSVpFKHR1bmVycyk7CkBAIC00NzEsNiArNDY4LDEwIEBACiAJY2FzZSBUVU5FUl9MR19QQUxfRk06CiAJCWJ1ZmZlclszXSA9IDB4YTU7CiAJCWJyZWFrOworCWNhc2UgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTU6CisJCWRpdiA9ICgyMCAqIGZyZXEpIC8gMTYwMDAgKyAoaW50KSgzMy4zICogMjApOyAvKiBJRiAzMy4zIE1IeiAqLworCQlidWZmZXJbM10gPSAweGE0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlidWZmZXJbM10gPSAweGE0OwogCQlicmVhazsKQEAgLTQ5Nyw2ICs0OTgsNyBAQAogCXQtPnJhZGlvX2ZyZXEgPSBkZWZhdWx0X3NldF9yYWRpb19mcmVxOwogCXQtPmhhc19zaWduYWwgPSB0dW5lcl9zaWduYWw7CiAJdC0+aXNfc3RlcmVvICA9IHR1bmVyX3N0ZXJlbzsKKwl0LT5zdGFuZGJ5ID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwppbmRleCAyNTg3MjRiLi4xYzMxZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwpAQCAtNDYsNyArNDYsMTcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBVTlNFVCAgICAoLTFVKQotI2RlZmluZSBkcHJpbnRrICBpZiAoZGVidWcpIHByaW50aworCisjZGVmaW5lIHR2YXVkaW9faW5mbyhmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvICVkLSUwNHg6ICIgZm10LCBcCisJCQljaGlwLT5jLmFkYXB0ZXItPm5yLCBjaGlwLT5jLmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHR2YXVkaW9fd2FybihmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ0dmF1ZGlvICVkLSUwNHg6ICIgZm10LCBcCisJCQljaGlwLT5jLmFkYXB0ZXItPm5yLCBjaGlwLT5jLmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHR2YXVkaW9fZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAorCWlmIChkZWJ1ZykgXAorCQlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvICVkLSUwNHg6ICIgZm10LCBcCisJCQljaGlwLT5jLmFkYXB0ZXItPm5yLCBjaGlwLT5jLmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIG91ciBzdHJ1Y3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE2MiwyMyArMTcyLDI0IEBACiAJdW5zaWduZWQgY2hhciBidWZmZXJbMl07CiAKIAlpZiAoLTEgPT0gc3ViYWRkcikgewotCQlkcHJpbnRrKCIlczogY2hpcF93cml0ZTogMHgleFxuIiwgY2hpcC0+Yy5uYW1lLCB2YWwpOworCQl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfd3JpdGU6IDB4JXhcbiIsCisJCQljaGlwLT5jLm5hbWUsIHZhbCk7CiAJCWNoaXAtPnNoYWRvdy5ieXRlc1sxXSA9IHZhbDsKIAkJYnVmZmVyWzBdID0gdmFsOwogCQlpZiAoMSAhPSBpMmNfbWFzdGVyX3NlbmQoJmNoaXAtPmMsYnVmZmVyLDEpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSS9PIGVycm9yICh3cml0ZSAweCV4KVxuIiwKLQkJCSAgICAgICBjaGlwLT5jLm5hbWUsIHZhbCk7CisJCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKHdyaXRlIDB4JXgpXG4iLAorCQkJCWNoaXAtPmMubmFtZSwgdmFsKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRwcmludGsoIiVzOiBjaGlwX3dyaXRlOiByZWclZD0weCV4XG4iLAorCQl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfd3JpdGU6IHJlZyVkPTB4JXhcbiIsCiAJCQljaGlwLT5jLm5hbWUsIHN1YmFkZHIsIHZhbCk7CiAJCWNoaXAtPnNoYWRvdy5ieXRlc1tzdWJhZGRyKzFdID0gdmFsOwogCQlidWZmZXJbMF0gPSBzdWJhZGRyOwogCQlidWZmZXJbMV0gPSB2YWw7CiAJCWlmICgyICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxidWZmZXIsMikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKHdyaXRlIHJlZyVkPTB4JXgpXG4iLAotCQkJICAgICAgIGNoaXAtPmMubmFtZSwgc3ViYWRkciwgdmFsKTsKKwkJCXR2YXVkaW9fd2FybigiJXM6IEkvTyBlcnJvciAod3JpdGUgcmVnJWQ9MHgleClcbiIsCisJCQkJCQljaGlwLT5jLm5hbWUsIHN1YmFkZHIsIHZhbCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC0yMDIsMjkgKzIxMywzMCBAQAogCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwogCiAJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KCZjaGlwLT5jLCZidWZmZXIsMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEkvTyBlcnJvciAocmVhZClcbiIsIGNoaXAtPmMubmFtZSk7CisJCXR2YXVkaW9fd2FybigiJXM6IEkvTyBlcnJvciAocmVhZClcbiIsCisJCWNoaXAtPmMubmFtZSk7CiAJCXJldHVybiAtMTsKIAl9Ci0JZHByaW50aygiJXM6IGNoaXBfcmVhZDogMHgleFxuIiwgY2hpcC0+Yy5uYW1lLCBidWZmZXIpOworCXR2YXVkaW9fZGJnKCIlczogY2hpcF9yZWFkOiAweCV4XG4iLGNoaXAtPmMubmFtZSxidWZmZXIpOwogCXJldHVybiBidWZmZXI7CiB9CiAKIHN0YXRpYyBpbnQgY2hpcF9yZWFkMihzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgc3ViYWRkcikKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciB3cml0ZVsxXTsKLSAgICAgICAgdW5zaWduZWQgY2hhciByZWFkWzFdOwotICAgICAgICBzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0gewotICAgICAgICAgICAgICAgIHsgY2hpcC0+Yy5hZGRyLCAwLCAgICAgICAgMSwgd3JpdGUgfSwKLSAgICAgICAgICAgICAgICB7IGNoaXAtPmMuYWRkciwgSTJDX01fUkQsIDEsIHJlYWQgIH0KLSAgICAgICAgfTsKLSAgICAgICAgd3JpdGVbMF0gPSBzdWJhZGRyOworCXVuc2lnbmVkIGNoYXIgd3JpdGVbMV07CisJdW5zaWduZWQgY2hhciByZWFkWzFdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisJCXsgY2hpcC0+Yy5hZGRyLCAwLCAgICAgICAgMSwgd3JpdGUgfSwKKwkJeyBjaGlwLT5jLmFkZHIsIEkyQ19NX1JELCAxLCByZWFkICB9CisJfTsKKwl3cml0ZVswXSA9IHN1YmFkZHI7CiAKIAlpZiAoMiAhPSBpMmNfdHJhbnNmZXIoY2hpcC0+Yy5hZGFwdGVyLG1zZ3MsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEkvTyBlcnJvciAocmVhZDIpXG4iLCBjaGlwLT5jLm5hbWUpOworCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKHJlYWQyKVxuIiwgY2hpcC0+Yy5uYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlkcHJpbnRrKCIlczogY2hpcF9yZWFkMjogcmVnJWQ9MHgleFxuIiwKLQkJY2hpcC0+Yy5uYW1lLCBzdWJhZGRyLCByZWFkWzBdKTsKKwl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfcmVhZDI6IHJlZyVkPTB4JXhcbiIsCisJCQljaGlwLT5jLm5hbWUsc3ViYWRkcixyZWFkWzBdKTsKIAlyZXR1cm4gcmVhZFswXTsKIH0KIApAQCAtMjM2LDE3ICsyNDgsMTkgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiB1cGRhdGUgb3VyIHNoYWRvdyByZWdpc3RlciBzZXQ7IHByaW50IGJ5dGVzIGlmIChkZWJ1ZyA+IDApICovCi0JZHByaW50aygiJXM6IGNoaXBfY21kKCVzKTogcmVnPSVkLCBkYXRhOiIsCi0JCWNoaXAtPmMubmFtZSwgbmFtZSwgY21kLT5ieXRlc1swXSk7CisJdHZhdWRpb19kYmcoIiVzOiBjaGlwX2NtZCglcyk6IHJlZz0lZCwgZGF0YToiLAorCQljaGlwLT5jLm5hbWUsbmFtZSxjbWQtPmJ5dGVzWzBdKTsKIAlmb3IgKGkgPSAxOyBpIDwgY21kLT5jb3VudDsgaSsrKSB7Ci0JCWRwcmludGsoIiAweCV4IixjbWQtPmJ5dGVzW2ldKTsKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKCIgMHgleCIsY21kLT5ieXRlc1tpXSk7CiAJCWNoaXAtPnNoYWRvdy5ieXRlc1tpK2NtZC0+Ynl0ZXNbMF1dID0gY21kLT5ieXRlc1tpXTsKIAl9Ci0JZHByaW50aygiXG4iKTsKKwlpZiAoZGVidWcpCisJCXByaW50aygiXG4iKTsKIAogCS8qIHNlbmQgZGF0YSB0byB0aGUgY2hpcCAqLwogCWlmIChjbWQtPmNvdW50ICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxjbWQtPmJ5dGVzLGNtZC0+Y291bnQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJL08gZXJyb3IgKCVzKVxuIiwgY2hpcC0+Yy5uYW1lLCBuYW1lKTsKKwkJdHZhdWRpb193YXJuKCIlczogSS9PIGVycm9yICglcylcbiIsIGNoaXAtPmMubmFtZSwgbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yNjEsMTkgKzI3NSwxOSBAQAogCiBzdGF0aWMgdm9pZCBjaGlwX3RocmVhZF93YWtlKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSAgICAgICAgc3RydWN0IENISVBTVEFURSAqY2hpcCA9IChzdHJ1Y3QgQ0hJUFNUQVRFKilkYXRhOworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSAoc3RydWN0IENISVBTVEFURSopZGF0YTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoaXAtPndxKTsKIH0KIAogc3RhdGljIGludCBjaGlwX3RocmVhZCh2b2lkICpkYXRhKQogewogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotICAgICAgICBzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gZGF0YTsKKwlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gZGF0YTsKIAlzdHJ1Y3QgQ0hJUERFU0MgICpkZXNjID0gY2hpcGxpc3QgKyBjaGlwLT50eXBlOwogCiAJZGFlbW9uaXplKCIlcyIsIGNoaXAtPmMubmFtZSk7CiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCWRwcmludGsoIiVzOiB0aHJlYWQgc3RhcnRlZFxuIiwgY2hpcC0+Yy5uYW1lKTsKKwl0dmF1ZGlvX2RiZygiJXM6IHRocmVhZCBzdGFydGVkXG4iLCBjaGlwLT5jLm5hbWUpOwogCiAJZm9yICg7OykgewogCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKQEAgLTI4NSw3ICsyOTksNyBAQAogCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmIChjaGlwLT5kb25lIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7Ci0JCWRwcmludGsoIiVzOiB0aHJlYWQgd2FrZXVwXG4iLCBjaGlwLT5jLm5hbWUpOworCQl0dmF1ZGlvX2RiZygiJXM6IHRocmVhZCB3YWtldXBcbiIsIGNoaXAtPmMubmFtZSk7CiAKIAkJLyogZG9uJ3QgZG8gYW55dGhpbmcgZm9yIHJhZGlvIG9yIGlmIG1vZGUgIT0gYXV0byAqLwogCQlpZiAoY2hpcC0+bm9ybSA9PSBWSURFT19NT0RFX1JBRElPIHx8IGNoaXAtPm1vZGUgIT0gMCkKQEAgLTI5OCw4ICszMTIsOCBAQAogCQltb2RfdGltZXIoJmNoaXAtPnd0LCBqaWZmaWVzKzIqSFopOwogCX0KIAotCWRwcmludGsoIiVzOiB0aHJlYWQgZXhpdGluZ1xuIiwgY2hpcC0+Yy5uYW1lKTsKLSAgICAgICAgY29tcGxldGVfYW5kX2V4aXQoJmNoaXAtPnRleGl0LCAwKTsKKwl0dmF1ZGlvX2RiZygiJXM6IHRocmVhZCBleGl0aW5nXG4iLCBjaGlwLT5jLm5hbWUpOworCWNvbXBsZXRlX2FuZF9leGl0KCZjaGlwLT50ZXhpdCwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwOSw5ICszMjMsOSBAQAogCWludCBtb2RlID0gZGVzYy0+Z2V0bW9kZShjaGlwKTsKIAogCWlmIChtb2RlID09IGNoaXAtPnByZXZtb2RlKQotCSAgICByZXR1cm47CisJCXJldHVybjsKIAotCWRwcmludGsoIiVzOiB0aHJlYWQgY2hlY2ttb2RlXG4iLCBjaGlwLT5jLm5hbWUpOworCXR2YXVkaW9fZGJnKCIlczogdGhyZWFkIGNoZWNrbW9kZVxuIiwgY2hpcC0+Yy5uYW1lKTsKIAljaGlwLT5wcmV2bW9kZSA9IG1vZGU7CiAKIAlpZiAobW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKQEAgLTM1OCw4ICszNzIsOCBAQAogCWlmICh2YWwgJiBUREE5ODQwX1NUX1NURVJFTykKIAkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CiAKLQlkcHJpbnRrICgidGRhOTg0MF9nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6ICVkLCByZXR1cm46ICVkXG4iLAotCQkgdmFsLCBtb2RlKTsKKwl0dmF1ZGlvX2RiZyAoInRkYTk4NDBfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKKwkJdmFsLCBtb2RlKTsKIAlyZXR1cm4gbW9kZTsKIH0KIApAQCAtNjU0LDggKzY2OCw4IEBACiAJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOwogCWlmICh2YWwgJiBUREE5ODczX0RVQUwpCiAJCW1vZGUgfD0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKLQlkcHJpbnRrICgidGRhOTg3M19nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6ICVkLCByZXR1cm46ICVkXG4iLAotCQkgdmFsLCBtb2RlKTsKKwl0dmF1ZGlvX2RiZyAoInRkYTk4NzNfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKKwkJdmFsLCBtb2RlKTsKIAlyZXR1cm4gbW9kZTsKIH0KIApAQCAtNjY1LDEyICs2NzksMTIgQEAKIAkvKglpbnQgYWRqX2RhdGEgPSBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBOTg3M19BRCsxXSA7ICovCiAKIAlpZiAoKHN3X2RhdGEgJiBUREE5ODczX0lOUF9NQVNLKSAhPSBUREE5ODczX0lOVEVSTkFMKSB7Ci0JCWRwcmludGsoInRkYTk4NzNfc2V0bW9kZSgpOiBleHRlcm5hbCBpbnB1dFxuIik7CisJCXR2YXVkaW9fZGJnKCJ0ZGE5ODczX3NldG1vZGUoKTogZXh0ZXJuYWwgaW5wdXRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JZHByaW50aygidGRhOTg3M19zZXRtb2RlKCk6IGNoaXAtPnNoYWRvdy5ieXRlc1slZF0gPSAlZFxuIiwgVERBOTg3M19TVysxLCBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBOTg3M19TVysxXSk7Ci0JZHByaW50aygidGRhOTg3M19zZXRtb2RlKCk6IHN3X2RhdGEgID0gJWRcbiIsIHN3X2RhdGEpOworCXR2YXVkaW9fZGJnKCJ0ZGE5ODczX3NldG1vZGUoKTogY2hpcC0+c2hhZG93LmJ5dGVzWyVkXSA9ICVkXG4iLCBUREE5ODczX1NXKzEsIGNoaXAtPnNoYWRvdy5ieXRlc1tUREE5ODczX1NXKzFdKTsKKwl0dmF1ZGlvX2RiZygidGRhOTg3M19zZXRtb2RlKCk6IHN3X2RhdGEgID0gJWRcbiIsIHN3X2RhdGEpOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBWSURFT19TT1VORF9NT05POgpAQCAtNjkxLDcgKzcwNSw3IEBACiAJfQogCiAJY2hpcF93cml0ZShjaGlwLCBUREE5ODczX1NXLCBzd19kYXRhKTsKLQlkcHJpbnRrKCJ0ZGE5ODczX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBjaGlwX3dyaXRlOiAlZFxuIiwKKwl0dmF1ZGlvX2RiZygidGRhOTg3M19zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgY2hpcF93cml0ZTogJWRcbiIsCiAJCW1vZGUsIHN3X2RhdGEpOwogfQogCkBAIC04MjgsOSArODQyLDkgQEAKIAl9IGVsc2UgeyAvKiBkaWMgPT0gMHgwNyAqLwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FNQ09OUiwgMHhmYik7CiAJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfU0RBQ09TUiwgKHRkYTk4NzRhX21vZGUpID8gMHg4MToweDgwKTsKLQkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BT1NSLCAweDAwKTsgLy8gb3IgMHgxMAorCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIDB4MDApOyAvKiBvciAweDEwICovCiAJfQotCWRwcmludGsoInRkYTk4NzRhX3NldHVwKCk6ICVzIFsweCUwMlhdLlxuIiwKKwl0dmF1ZGlvX2RiZygidGRhOTg3NGFfc2V0dXAoKTogJXMgWzB4JTAyWF0uXG4iLAogCQl0ZGE5ODc0YV9tb2RlbGlzdFt0ZGE5ODc0YV9TVERdLm5hbWUsdGRhOTg3NGFfU1REKTsKIAlyZXR1cm4gMTsKIH0KQEAgLTg3Myw3ICs4ODcsNyBAQAogCQkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogCX0KIAotCWRwcmludGsoInRkYTk4NzRhX2dldG1vZGUoKTogRFNSPTB4JVgsIE5TUj0weCVYLCBORUNSPTB4JVgsIHJldHVybjogJWQuXG4iLAorCXR2YXVkaW9fZGJnKCJ0ZGE5ODc0YV9nZXRtb2RlKCk6IERTUj0weCVYLCBOU1I9MHglWCwgTkVDUj0weCVYLCByZXR1cm46ICVkLlxuIiwKIAkJIGRzciwgbnNyLCBuZWNyLCBtb2RlKTsKIAlyZXR1cm4gbW9kZTsKIH0KQEAgLTkxOSw3ICs5MzMsNyBAQAogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIGFvc3IpOwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX01EQUNPU1IsIG1kYWNvc3IpOwogCi0JCWRwcmludGsoInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBBT1NSPTB4JVgsIE1EQUNPU1I9MHglWC5cbiIsCisJCXR2YXVkaW9fZGJnKCJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgQU9TUj0weCVYLCBNREFDT1NSPTB4JVguXG4iLAogCQkJbW9kZSwgYW9zciwgbWRhY29zcik7CiAKIAl9IGVsc2UgeyAvKiBkaWMgPT0gMHgwNyAqLwpAQCAtOTU0LDcgKzk2OCw3IEBACiAJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfRk1NUiwgZm1tcik7CiAJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQU9TUiwgYW9zcik7CiAKLQkJZHByaW50aygidGRhOTg3NGFfc2V0bW9kZSgpOiByZXEuIG1vZGUgJWQ7IEZNTVI9MHglWCwgQU9TUj0weCVYLlxuIiwKKwkJdHZhdWRpb19kYmcoInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBGTU1SPTB4JVgsIEFPU1I9MHglWC5cbiIsCiAJCQltb2RlLCBmbW1yLCBhb3NyKTsKIAl9CiB9CkBAIC05NjgsMTAgKzk4MiwxMCBAQAogCWlmKC0xID09IChzaWMgPSBjaGlwX3JlYWQyKGNoaXAsVERBOTg3NEFfU0lDKSkpCiAJCXJldHVybiAwOwogCi0JZHByaW50aygidGRhOTg3NGFfY2hlY2tpdCgpOiBESUM9MHglWCwgU0lDPTB4JVguXG4iLCBkaWMsIHNpYyk7CisJdHZhdWRpb19kYmcoInRkYTk4NzRhX2NoZWNraXQoKTogRElDPTB4JVgsIFNJQz0weCVYLlxuIiwgZGljLCBzaWMpOwogCiAJaWYoKGRpYyA9PSAweDExKXx8KGRpYyA9PSAweDA3KSkgewotCQlwcmludGsoInR2YXVkaW86IGZvdW5kIHRkYTk4NzQlcy5cbiIsIChkaWMgPT0gMHgxMSkgPyAiYSI6ImgiKTsKKwkJdHZhdWRpb19pbmZvKCJmb3VuZCB0ZGE5ODc0JXMuXG4iLCAoZGljID09IDB4MTEpID8gImEiOiJoIik7CiAJCXRkYTk4NzRhX2RpYyA9IGRpYzsJLyogcmVtZW1iZXIgZGV2aWNlIGlkLiAqLwogCQlyZXR1cm4gMTsKIAl9CkBAIC0xMTQ2LDcgKzExNjAsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogYXVkaW8gY2hpcCBkZXNjcmlwdGlvbnMgLSBkZWZpbmVzK2Z1bmN0aW9ucyBmb3IgVEE4ODc0WiAgICAgICAgICAgICAgICAqLwogCi0vLyB3cml0ZSAxc3QgYnl0ZQorLyogd3JpdGUgMXN0IGJ5dGUgKi8KICNkZWZpbmUgVEE4ODc0Wl9MRURfU1RFCTB4ODAKICNkZWZpbmUgVEE4ODc0Wl9MRURfQklMCTB4NDAKICNkZWZpbmUgVEE4ODc0Wl9MRURfRVhUCTB4MjAKQEAgLTExNTYsMjEgKzExNzAsMjIgQEAKICNkZWZpbmUgVEE4ODc0Wl9NT0RFX1NVQgkweDAyCiAjZGVmaW5lIFRBODg3NFpfTU9ERV9NQUlOCTB4MDEKIAotLy8gd3JpdGUgMm5kIGJ5dGUKLS8vI2RlZmluZSBUQTg4NzRaX1RJCTB4ODAgIC8vIHRlc3QgbW9kZQorLyogd3JpdGUgMm5kIGJ5dGUgKi8KKy8qI2RlZmluZSBUQTg4NzRaX1RJCTB4ODAgICovIC8qIHRlc3QgbW9kZSAqLwogI2RlZmluZSBUQTg4NzRaX1NFUEFSQVRJT04JMHgzZgogI2RlZmluZSBUQTg4NzRaX1NFUEFSQVRJT05fREVGQVVMVAkweDEwCiAKLS8vIHJlYWQKKy8qIHJlYWQgKi8KICNkZWZpbmUgVEE4ODc0Wl9CMQkweDgwCiAjZGVmaW5lIFRBODg3NFpfQjAJMHg0MAogI2RlZmluZSBUQTg4NzRaX0NIQUdfRkxBRwkweDIwCiAKLS8vICAgICAgICBCMSBCMAotLy8gbW9ubyAgICBMICBICi0vLyBzdGVyZW8gIEwgIEwKLS8vIEJJTCAgICAgSCAgTAotCisvKgorICogICAgICAgIEIxIEIwCisgKiBtb25vICAgIEwgIEgKKyAqIHN0ZXJlbyAgTCAgTAorICogQklMICAgICBIICBMCisgKi8KIHN0YXRpYyBpbnQgdGE4ODc0el9nZXRtb2RlKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCiB7CiAJaW50IHZhbCwgbW9kZTsKQEAgLTExODIsNyArMTE5Nyw3IEBACiAJfWVsc2UgaWYgKCEodmFsICYgVEE4ODc0Wl9CMCkpewogCQltb2RlIHw9IFZJREVPX1NPVU5EX1NURVJFTzsKIAl9Ci0JLy9kcHJpbnRrICgidGE4ODc0el9nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6IDB4JTAyeCwgcmV0dXJuOiAweCUwMnhcbiIsIHZhbCwgbW9kZSk7CisJLyogdHZhdWRpb19kYmcgKCJ0YTg4NzR6X2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogMHglMDJ4LCByZXR1cm46IDB4JTAyeFxuIiwgdmFsLCBtb2RlKTsgKi8KIAlyZXR1cm4gbW9kZTsKIH0KIApAQCAtMTE5NSw3ICsxMjEwLDcgQEAKIHsKIAlpbnQgdXBkYXRlID0gMTsKIAlhdWRpb2NtZCAqdCA9IE5VTEw7Ci0JZHByaW50aygidGE4ODc0el9zZXRtb2RlKCk6IG1vZGU6IDB4JTAyeFxuIiwgbW9kZSk7CisJdHZhdWRpb19kYmcoInRhODg3NHpfc2V0bW9kZSgpOiBtb2RlOiAweCUwMnhcbiIsIG1vZGUpOwogCiAJc3dpdGNoKG1vZGUpewogCWNhc2UgVklERU9fU09VTkRfTU9OTzoKQEAgLTEyMzUsMTEgKzEyNTAsMTEgQEAKIHN0YXRpYyBpbnQgdGRhOTg1NSAgPSAxOwogc3RhdGljIGludCB0ZGE5ODczICA9IDE7CiBzdGF0aWMgaW50IHRkYTk4NzRhID0gMTsKLXN0YXRpYyBpbnQgdGVhNjMwMCAgPSAwOyAgLy8gYWRkcmVzcyBjbGFzaCB3aXRoIG1zcDM0eHgKLXN0YXRpYyBpbnQgdGVhNjMyMCAgPSAwOyAgLy8gYWRkcmVzcyBjbGFzaCB3aXRoIG1zcDM0eHgKK3N0YXRpYyBpbnQgdGVhNjMwMCAgPSAwOyAgLyogYWRkcmVzcyBjbGFzaCB3aXRoIG1zcDM0eHggKi8KK3N0YXRpYyBpbnQgdGVhNjMyMCAgPSAwOyAgLyogYWRkcmVzcyBjbGFzaCB3aXRoIG1zcDM0eHggKi8KIHN0YXRpYyBpbnQgdGVhNjQyMCAgPSAxOwogc3RhdGljIGludCBwaWMxNmM1NCA9IDE7Ci1zdGF0aWMgaW50IHRhODg3NHogID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCB0ZGE5ODQwCitzdGF0aWMgaW50IHRhODg3NHogID0gMDsgIC8qIGFkZHJlc3MgY2xhc2ggd2l0aCB0ZGE5ODQwICovCiAKIG1vZHVsZV9wYXJhbSh0ZGE4NDI1LCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHRkYTk4NDAsIGludCwgMDQ0NCk7CkBAIC0xNDQxLDcgKzE0NTYsNyBAQAogCXsKIAkJLm5hbWUgICAgICAgPSAidGE4ODc0eiIsCiAJCS5pZCAgICAgICAgID0gLTEsCi0JCS8vLmlkICAgICAgICAgPSBJMkNfRFJJVkVSSURfVEE4ODc0WiwKKwkJLyouaWQgICAgICAgICA9IEkyQ19EUklWRVJJRF9UQTg4NzRaLCAqLwogCQkuY2hlY2tpdCAgICA9IHRhODg3NHpfY2hlY2tpdCwKIAkJLmluc21vZG9wdCAgPSAmdGE4ODc0eiwKIAkJLmFkZHJfbG8gICAgPSBJMkNfVERBOTg0MCA+PiAxLApAQCAtMTQ3Niw3ICsxNDkxLDcgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoJmNoaXAtPmMsIGNoaXApOwogCiAJLyogZmluZCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoaXAgKi8KLQlkcHJpbnRrKCJ0dmF1ZGlvOiBjaGlwIGZvdW5kIEAgaTJjLWFkZHI9MHgleFxuIiwgYWRkcjw8MSk7CisJdHZhdWRpb19kYmcoImNoaXAgZm91bmQgQCAweCV4XG4iLCBhZGRyPDwxKTsKIAlmb3IgKGRlc2MgPSBjaGlwbGlzdDsgZGVzYy0+bmFtZSAhPSBOVUxMOyBkZXNjKyspIHsKIAkJaWYgKDAgPT0gKihkZXNjLT5pbnNtb2RvcHQpKQogCQkJY29udGludWU7CkBAIC0xNDg4LDE3ICsxNTAzLDE5IEBACiAJCWJyZWFrOwogCX0KIAlpZiAoZGVzYy0+bmFtZSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoInR2YXVkaW86IG5vIG1hdGNoaW5nIGNoaXAgZGVzY3JpcHRpb24gZm91bmRcbiIpOworCQl0dmF1ZGlvX2RiZygibm8gbWF0Y2hpbmcgY2hpcCBkZXNjcmlwdGlvbiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQlwcmludGsoInR2YXVkaW86IGZvdW5kICVzIEAgMHgleFxuIiwgZGVzYy0+bmFtZSwgYWRkcjw8MSk7Ci0JZHByaW50aygidHZhdWRpbzogbWF0Y2hlczolcyVzJXMuXG4iLAotCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19WT0xVTUUpICAgICA/ICIgdm9sdW1lIiAgICAgIDogIiIsCi0JCShkZXNjLT5mbGFncyAmIENISVBfSEFTX0JBU1NUUkVCTEUpID8gIiBiYXNzL3RyZWJsZSIgOiAiIiwKLQkJKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfSU5QVVRTRUwpICAgPyAiIGF1ZGlvbXV4IiAgICA6ICIiKTsKKwl0dmF1ZGlvX2luZm8oIiVzIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBkZXNjLT5uYW1lLCBhZGRyPDwxLCBhZGFwLT5uYW1lKTsKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzKSB7CisgICAgICAgICAgICAgICAgdHZhdWRpb19kYmcoIm1hdGNoZXM6JXMlcyVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5mbGFncyAmIENISVBfSEFTX1ZPTFVNRSkgICAgID8gIiB2b2x1bWUiICAgICAgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5mbGFncyAmIENISVBfSEFTX0JBU1NUUkVCTEUpID8gIiBiYXNzL3RyZWJsZSIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5mbGFncyAmIENISVBfSEFTX0lOUFVUU0VMKSAgID8gIiBhdWRpb211eCIgICAgOiAiIik7CisgICAgICAgIH0KIAogCS8qIGZpbGwgcmVxdWlyZWQgZGF0YSBzdHJ1Y3R1cmVzICovCi0Jc3RyY3B5KGNoaXAtPmMubmFtZSwgZGVzYy0+bmFtZSk7CisJc3RyY3B5KGNoaXAtPmMubmFtZSxkZXNjLT5uYW1lKTsKIAljaGlwLT50eXBlID0gZGVzYy1jaGlwbGlzdDsKIAljaGlwLT5zaGFkb3cuY291bnQgPSBkZXNjLT5yZWdpc3RlcnMrMTsKICAgICAgICAgY2hpcC0+cHJldm1vZGUgPSAtMTsKQEAgLTE1MzQsNyArMTU1MSw3IEBACiAJCWluaXRfY29tcGxldGlvbigmY2hpcC0+dGV4aXQpOwogCQljaGlwLT50cGlkID0ga2VybmVsX3RocmVhZChjaGlwX3RocmVhZCwodm9pZCAqKWNoaXAsMCk7CiAJCWlmIChjaGlwLT50cGlkIDwgMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iLAorCQkJdHZhdWRpb193YXJuKCIlczoga2VybmVsX3RocmVhZCgpIGZhaWxlZFxuIiwKIAkJCSAgICAgICBjaGlwLT5jLm5hbWUpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoaXAtPndxKTsKIAl9CkBAIC0xNTQ1LDcgKzE1NjIsNyBAQAogewogCS8qIGRvbid0IGF0dGFjaCBvbiBzYWE3MTQ2IGJhc2VkIGNhcmRzLAogCSAgIGJlY2F1c2UgZGVkaWNhdGVkIGRyaXZlcnMgYXJlIHVzZWQgKi8KLQlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX1NBQTcxNDYpCisJaWYgKChhZGFwLT5pZCA9PSBJMkNfSFdfU0FBNzE0NikpCiAJCXJldHVybiAwOwogI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQpAQCAtMTU4NCwxMSArMTYwMSwxMSBAQAogc3RhdGljIGludCBjaGlwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKLSAgICAgICAgX191MTYgKnNhcmcgPSBhcmc7CisJX191MTYgKnNhcmcgPSBhcmc7CiAJc3RydWN0IENISVBTVEFURSAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwbGlzdCArIGNoaXAtPnR5cGU7CiAKLQlkcHJpbnRrKCIlczogY2hpcF9jb21tYW5kIDB4JXhcbiIsIGNoaXAtPmMubmFtZSwgY21kKTsKKwl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfY29tbWFuZCAweCV4XG4iLGNoaXAtPmMubmFtZSxjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEFVRENfU0VUX0lOUFVUOgpAQCAtMTYwMSw3ICsxNjE4LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQlkcHJpbnRrKEtFUk5fREVCVUcgInR2YXVkaW86IEFVRENfU0VUX1JBRElPXG4iKTsKIAkJY2hpcC0+bm9ybSA9IFZJREVPX01PREVfUkFESU87CiAJCWNoaXAtPndhdGNoX3N0ZXJlbyA9IDA7CiAJCS8qIGRlbF90aW1lcigmY2hpcC0+d3QpOyAqLwpAQCAtMTYwOSw3ICsxNjI1LDcgQEAKIAogCS8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLwogCS8qIHRha2UgY2FyZTogYnR0diBkb2VzIHVzZXJzcGFjZSBjb3B5aW5nLCB3ZSdsbCBnZXQgYQotCSAgIGtlcm5lbCBwb2ludGVyIGhlcmUuLi4gKi8KKwkJCQkJa2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwogCWNhc2UgVklESU9DR0FVRElPOgogCXsKIAkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKQEAgLTE2NDMsOSArMTY1OSw5IEBACiAKIAkJaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSB7CiAJCQljaGlwLT5sZWZ0ID0gKG1pbig2NTUzNiAtIHZhLT5iYWxhbmNlLDMyNzY4KSAqCi0JCQkJICAgICAgdmEtPnZvbHVtZSkgLyAzMjc2ODsKKwkJCQl2YS0+dm9sdW1lKSAvIDMyNzY4OwogCQkJY2hpcC0+cmlnaHQgPSAobWluKHZhLT5iYWxhbmNlLChfX3UxNikzMjc2OCkgKgotCQkJCSAgICAgICB2YS0+dm9sdW1lKSAvIDMyNzY4OworCQkJCXZhLT52b2x1bWUpIC8gMzI3Njg7CiAJCQljaGlwX3dyaXRlKGNoaXAsZGVzYy0+bGVmdHJlZyxkZXNjLT52b2xmdW5jKGNoaXAtPmxlZnQpKTsKIAkJCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5yaWdodHJlZyxkZXNjLT52b2xmdW5jKGNoaXAtPnJpZ2h0KSk7CiAJCX0KQEAgLTE2NjcsMTcgKzE2ODMsMTYgQEAKIAl7CiAJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKIAotCQlkcHJpbnRrKEtFUk5fREVCVUcgInR2YXVkaW86IFZJRElPQ1NDSEFOXG4iKTsKIAkJY2hpcC0+bm9ybSA9IHZjLT5ub3JtOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NTRlJFUToKIAl7Ci0JICAgIAljaGlwLT5tb2RlID0gMDsgLyogYXV0b21hdGljICovCisJCWNoaXAtPm1vZGUgPSAwOyAvKiBhdXRvbWF0aWMgKi8KIAkJaWYgKGRlc2MtPmNoZWNrbW9kZSkgewogCQkJZGVzYy0+c2V0bW9kZShjaGlwLFZJREVPX1NPVU5EX01PTk8pOwotCQkgICAgCWlmIChjaGlwLT5wcmV2bW9kZSAhPSBWSURFT19TT1VORF9NT05PKQotCQkgICAgCQljaGlwLT5wcmV2bW9kZSA9IC0xOyAvKiByZXNldCBwcmV2aW91cyBtb2RlICovCisJCQlpZiAoY2hpcC0+cHJldm1vZGUgIT0gVklERU9fU09VTkRfTU9OTykKKwkJCQljaGlwLT5wcmV2bW9kZSA9IC0xOyAvKiByZXNldCBwcmV2aW91cyBtb2RlICovCiAJCQltb2RfdGltZXIoJmNoaXAtPnd0LCBqaWZmaWVzKzIqSFopOwogCQkJLyogdGhlIHRocmVhZCB3aWxsIGNhbGwgY2hlY2ttb2RlKCkgbGF0ZXIgKi8KIAkJfQpAQCAtMTY4OSwyOSArMTcwNCwzMiBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewogCS5vd25lciAgICAgICAgICAgPSBUSElTX01PRFVMRSwKLSAgICAgICAgLm5hbWUgICAgICAgICAgICA9ICJnZW5lcmljIGkyYyBhdWRpbyBkcml2ZXIiLAotICAgICAgICAuaWQgICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWQVVESU8sCi0gICAgICAgIC5mbGFncyAgICAgICAgICAgPSBJMkNfREZfTk9USUZZLAotICAgICAgICAuYXR0YWNoX2FkYXB0ZXIgID0gY2hpcF9wcm9iZSwKLSAgICAgICAgLmRldGFjaF9jbGllbnQgICA9IGNoaXBfZGV0YWNoLAotICAgICAgICAuY29tbWFuZCAgICAgICAgID0gY2hpcF9jb21tYW5kLAorCS5uYW1lICAgICAgICAgICAgPSAiZ2VuZXJpYyBpMmMgYXVkaW8gZHJpdmVyIiwKKwkuaWQgICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RWQVVESU8sCisJLmZsYWdzICAgICAgICAgICA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyICA9IGNoaXBfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgICA9IGNoaXBfZGV0YWNoLAorCS5jb21tYW5kICAgICAgICAgPSBjaGlwX2NvbW1hbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KIHsKIAkubmFtZSAgICAgICA9ICIodW5zZXQpIiwKIAkuZmxhZ3MgICAgICA9IEkyQ19DTElFTlRfQUxMT1dfVVNFLAotICAgICAgICAuZHJpdmVyICAgICA9ICZkcml2ZXIsCisJLmRyaXZlciAgICAgPSAmZHJpdmVyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXVkaW9jaGlwX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJc3RydWN0IENISVBERVNDICAqZGVzYzsKLQlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvOiBUViBhdWRpbyBkZWNvZGVyICsgYXVkaW8vdmlkZW8gbXV4IGRyaXZlclxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbzoga25vd24gY2hpcHM6ICIpOwotCWZvciAoZGVzYyA9IGNoaXBsaXN0OyBkZXNjLT5uYW1lICE9IE5VTEw7IGRlc2MrKykKLQkJcHJpbnRrKCIlcyVzIiwgKGRlc2MgPT0gY2hpcGxpc3QpID8gIiIgOiAiLCIsZGVzYy0+bmFtZSk7Ci0JcHJpbnRrKCJcbiIpOworCisJaWYgKGRlYnVnKSB7CisJCXByaW50ayhLRVJOX0lORk8gInR2YXVkaW86IFRWIGF1ZGlvIGRlY29kZXIgKyBhdWRpby92aWRlbyBtdXggZHJpdmVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbzoga25vd24gY2hpcHM6ICIpOworCQlmb3IgKGRlc2MgPSBjaGlwbGlzdDsgZGVzYy0+bmFtZSAhPSBOVUxMOyBkZXNjKyspCisJCQlwcmludGsoIiVzJXMiLCAoZGVzYyA9PSBjaGlwbGlzdCkgPyAiIiA6ICIsICIsIGRlc2MtPm5hbWUpOworCQlwcmludGsoIlxuIik7CisJfQogCiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCmluZGV4IDNjMzM1NmEuLjUzNDRkNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKQEAgLTQ3LDE4ICs0NywyMSBAQAogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0yKSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7CiAKICNkZWZpbmUgU1RSTShhcnJheSxpKSAoaSA8IHNpemVvZihhcnJheSkvc2l6ZW9mKGNoYXIqKSA/IGFycmF5W2ldIDogInVua25vd24iKQogCi0jZGVmaW5lIGRwcmludGsobnVtLCBhcmdzLi4uKSBcCi0JZG8geyBcCi0JCWlmIChkZWJ1ZyA+PSBudW0pIFwKLQkJCXByaW50ayhLRVJOX0lORk8gInR2ZWVwcm9tOiAiIGFyZ3MpOyBcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHZlZXByb21faW5mbyhmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbSAlZC0lMDR4OiAiIGZtdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+YWRhcHRlci0+bnIsIGMtPmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHR2ZWVwcm9tX3dhcm4oZm10LCBhcmcuLi4pIGRvIHtcCisJcHJpbnRrKEtFUk5fV0FSTklORyAidHZlZXByb20gJWQtJTA0eDogIiBmbXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFkYXB0ZXItPm5yLCBjLT5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQorI2RlZmluZSB0dmVlcHJvbV9kYmcoZm10LCBhcmcuLi4pIGRvIHtcCisJaWYgKGRlYnVnKSBcCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb20gJWQtJTA0eDogIiBmbXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFkYXB0ZXItPm5yLCBjLT5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFRWRUVQUk9NX0tFUk5fRVJSKGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAidHZlZXByb206ICIgYXJncyk7Ci0jZGVmaW5lIFRWRUVQUk9NX0tFUk5fSU5GTyhhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbTogIiBhcmdzKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHNvbWUgaGF1cHBhdWdlIHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03MCwxNCArNzMsMTQgQEAKIH0KIGhhdXBwYXVnZV90dW5lcl9mbXRbXSA9CiB7Ci0JeyAweDAwMDAwMDAwLCAidW5rbm93bjEiIH0sCi0JeyAweDAwMDAwMDAwLCAidW5rbm93bjIiIH0sCi0JeyAweDAwMDAwMDA3LCAiUEFMKEIvRykiIH0sCi0JeyAweDAwMDAxMDAwLCAiTlRTQyhNKSIgfSwKLQl7IDB4MDAwMDAwMTAsICJQQUwoSSkiIH0sCi0JeyAweDAwNDAwMDAwLCAiU0VDQU0oTC9MtCkiIH0sCi0JeyAweDAwMDAwZTAwLCAiUEFMKEQvSykiIH0sCi0JeyAweDAzMDAwMDAwLCAiQVRTQyBEaWdpdGFsIiB9LAorCXsgMHgwMDAwMDAwMCwgIiB1bmtub3duMSIgfSwKKwl7IDB4MDAwMDAwMDAsICIgdW5rbm93bjIiIH0sCisJeyAweDAwMDAwMDA3LCAiIFBBTChCL0cpIiB9LAorCXsgMHgwMDAwMTAwMCwgIiBOVFNDKE0pIiB9LAorCXsgMHgwMDAwMDAxMCwgIiBQQUwoSSkiIH0sCisJeyAweDAwNDAwMDAwLCAiIFNFQ0FNKEwvTCcpIiB9LAorCXsgMHgwMDAwMGUwMCwgIiBQQUwoRC9LKSIgfSwKKwl7IDB4MDMwMDAwMDAsICIgQVRTQyBEaWdpdGFsIiB9LAogfTsKIAogLyogVGhpcyBpcyB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHR1bmVycy4gTWFueSB0aGFua3MgdG8gSGF1cHBhdWdlIGZvcgpAQCAtMTUyLDEzICsxNTUsMTMgQEAKIAl7IFRVTkVSX01JQ1JPVFVORV80MDQ5Rk01LCAiTWljcm90dW5lIDQwNDkgRk01In0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVFBJOE5TUjExRiJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIk1pY3JvdHVuZSA0MDQ5IEZNNSBBbHQgSTJDIn0sCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMTZNRSBNSzMifSwKKwl7IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLCAiUGhpbGlwcyBGUTEyMTZNRSBNSzMifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZJMTIzNiBNSzMifSwKIAl7IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLCAiUGhpbGlwcyBGTTEyMTYgTUUgTUszIn0sCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGTTEyMzYgTUszIn0sCisJeyBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMsICJQaGlsaXBzIEZNMTIzNiBNSzMifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZNMTIxNk1QIE1LMyJ9LAogCS8qIDYwLTY5ICovCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgUzAwMUQgTUszIn0sCisJeyBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywgIkxHIFMwMDFEIE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIE0wMDFEIE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFM3MDFEIE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIE03MDFEIE1LMyJ9LApAQCAtMTY3LDcgKzE3MCw3IEBACiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVGVtaWMgNDEwNkZINSJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TE1QIE1LMyJ9LAogCXsgVFVORVJfTEdfTlRTQ19UQVBFLCAgIkxHIFRBUEUgSDAwMUYgTUszIn0sCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFQRSBINzAxRiBNSzMifSwKKwl7IFRVTkVSX0xHX05UU0NfVEFQRSwgICJMRyBUQVBFIEg3MDFGIE1LMyJ9LAogCS8qIDcwLTc5ICovCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgVEFMTiBIMjAwVCJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBTE4gSDI1MFQifSwKQEAgLTE4Myw4ICsxODYsOCBAQAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TE1FIE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkxHIFRBUEMgRzcwMUQifSwKIAl7IFRVTkVSX0xHX05UU0NfTkVXX1RBUEMsICJMRyBUQVBDIEg3OTFGIn0sCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIDIwMDJNQiAzIn0sCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIDIwMDJNSSAzIn0sCisJeyBUVU5FUl9MR19QQUxfTkVXX1RBUEMsICJUQ0wgMjAwMk1CIDMifSwKKwl7IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywgIlRDTCAyMDAyTUkgMyJ9LAogCXsgVFVORVJfVENMXzIwMDJOLCAgICAgIlRDTCAyMDAyTiA2QSJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjM2IE1LMyJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQTiAyMTIxUDMwQSJ9LApAQCAtMTk5LDE3ICsyMDIsNTEgQEAKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZRMTIzNiBNSzUifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJVbnNwZWNpZmllZCJ9LAogCXsgVFVORVJfTEdfUEFMX1RBUEUsICAgIkxHIFBBTCAoVEFQRSBTZXJpZXMpIn0sCisgICAgICAgIHsgVFVORVJfQUJTRU5ULCAgICAgICAgIlVuc3BlY2lmaWVkIn0sCisgICAgICAgIHsgVFVORVJfVENMXzIwMDJOLCAgICAgIlRDTCAyMDAyTiA1SCJ9LAorCS8qIDEwMC0xMDMgKi8KKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJVbnNwZWNpZmllZCJ9LAorICAgICAgICB7IFRVTkVSX1RFQTU3NjcsICAgICAgICJQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbyJ9LAorICAgICAgICB7IFRVTkVSX0FCU0VOVCwgICAgICAgICJVbnNwZWNpZmllZCJ9LAorICAgICAgICB7IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMywgIlRDTCBNRk5NMDUgNCJ9LAogfTsKIAotc3RhdGljIGNoYXIgKnNuZHR5cGVbXSA9IHsKLQkiTm9uZSIsICJURUE2MzAwIiwgIlRFQTYzMjAiLCAiVERBOTg1MCIsICJNU1AzNDAwQyIsICJNU1AzNDEwRCIsCi0JIk1TUDM0MTUiLCAiTVNQMzQzMCIsICJNU1AzNDM4IiwgIkNTNTMzMSIsICJNU1AzNDM1IiwgIk1TUDM0NDAiLAotCSJNU1AzNDQ1IiwgIk1TUDM0MTEiLCAiTVNQMzQxNiIsICJNU1AzNDI1IiwKKy8qIFRoaXMgbGlzdCBpcyBzdXBwbGllZCBieSBIYXVwcGF1Z2UuIFRoYW5rcyEgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphdWRpb0lDW10gPSB7CisgICAgICAgIC8qIDAtNCAqLworICAgICAgICAiTm9uZSIsICJURUE2MzAwIiwgIlRFQTYzMjAiLCAiVERBOTg1MCIsICJNU1AzNDAwQyIsCisgICAgICAgIC8qIDUtOSAqLworICAgICAgICAiTVNQMzQxMEQiLCAiTVNQMzQxNSIsICJNU1AzNDMwIiwgIk1TUDM0MzgiLCAiQ1M1MzMxIiwKKyAgICAgICAgLyogMTAtMTQgKi8KKyAgICAgICAgIk1TUDM0MzUiLCAiTVNQMzQ0MCIsICJNU1AzNDQ1IiwgIk1TUDM0MTEiLCAiTVNQMzQxNiIsCisgICAgICAgIC8qIDE1LTE5ICovCisgICAgICAgICJNU1AzNDI1IiwgIk1TUDM0NTEiLCAiTVNQMzQxOCIsICJUeXBlIDB4MTIiLCAiT0tJNzcxNiIsCisgICAgICAgIC8qIDIwLTI0ICovCisgICAgICAgICJNU1A0NDEwIiwgIk1TUDQ0MjAiLCAiTVNQNDQ0MCIsICJNU1A0NDUwIiwgIk1TUDQ0MDgiLAorICAgICAgICAvKiAyNS0yOSAqLworICAgICAgICAiTVNQNDQxOCIsICJNU1A0NDI4IiwgIk1TUDQ0NDgiLCAiTVNQNDQ1OCIsICJUeXBlIDB4MWQiLAorICAgICAgICAvKiAzMC0zNCAqLworICAgICAgICAiQ1g4ODAiLCAiQ1g4ODEiLCAiQ1g4ODMiLCAiQ1g4ODIiLCAiQ1gyNTg0MCIsCisgICAgICAgIC8qIDM1LTM4ICovCisgICAgICAgICJDWDI1ODQxIiwgIkNYMjU4NDIiLCAiQ1gyNTg0MyIsICJDWDIzNDE4IiwKK307CiAKLQkiVHlwZSAweDEwIiwiVHlwZSAweDExIiwiVHlwZSAweDEyIiwiVHlwZSAweDEzIiwKLQkiVHlwZSAweDE0IiwiVHlwZSAweDE1IiwiVHlwZSAweDE2IiwiVHlwZSAweDE3IiwKLQkiVHlwZSAweDE4IiwiTVNQNDQxOCIsIlR5cGUgMHgxYSIsIk1TUDQ0NDgiLAotCSJUeXBlIDB4MWMiLCJUeXBlIDB4MWQiLCJUeXBlIDB4MWUiLCJUeXBlIDB4MWYiLAorLyogVGhpcyBsaXN0IGlzIHN1cHBsaWVkIGJ5IEhhdXBwYXVnZS4gVGhhbmtzISAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRlY29kZXJJQ1tdID0geworICAgICAgICAvKiAwLTQgKi8KKyAgICAgICAgIk5vbmUiLCAiQlQ4MTUiLCAiQlQ4MTciLCAiQlQ4MTkiLCAiQlQ4MTVBIiwKKyAgICAgICAgLyogNS05ICovCisgICAgICAgICJCVDgxN0EiLCAiQlQ4MTlBIiwgIkJUODI3IiwgIkJUODI5IiwgIkJUODQ4IiwKKyAgICAgICAgLyogMTAtMTQgKi8KKyAgICAgICAgIkJUODQ4QSIsICJCVDg0OUEiLCAiQlQ4MjlBIiwgIkJUODI3QSIsICJCVDg3OCIsCisgICAgICAgIC8qIDE1LTE5ICovCisgICAgICAgICJCVDg3OSIsICJCVDg4MCIsICJWUFgzMjI2RSIsICJTQUE3MTE0IiwgIlNBQTcxMTUiLAorICAgICAgICAvKiAyMC0yNCAqLworICAgICAgICAiQ1g4ODAiLCAiQ1g4ODEiLCAiQ1g4ODMiLCAiU0FBNzExMSIsICJTQUE3MTEzIiwKKyAgICAgICAgLyogMjUtMjkgKi8KKyAgICAgICAgIkNYODgyIiwgIlRWUDUxNTBBIiwgIkNYMjU4NDAiLCAiQ1gyNTg0MSIsICJDWDI1ODQyIiwKKyAgICAgICAgLyogMzAtMzEgKi8KKyAgICAgICAgIkNYMjU4NDMiLCAiQ1gyMzQxOCIsCiB9OwogCiBzdGF0aWMgaW50IGhhc1JhZGlvVHVuZXIoaW50IHR1bmVyVHlwZSkKQEAgLTI1MCw3ICsyODcsOCBAQAogICAgICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCB0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKHN0cnVjdCB0dmVlcHJvbSAqdHZlZSwgdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGEpCit2b2lkIHR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCB0dmVlcHJvbSAqdHZlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGEpCiB7CiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSoqIFRoZSBoYXVwcGF1Z2UgZWVwcm9tIGZvcm1hdCBpcyB0YWdnZWQKQEAgLTI2MCwxMCArMjk4LDExIEBACiAJKiogaWYgcGFja2V0WzBdICYgZjggPT0gZjgsIHRoZW4gRU9EIGFuZCBwYWNrZXRbMV0gPT0gY2hlY2tzdW0KIAkqKgogCSoqIEluIG91ciAoaXZ0dikgY2FzZSB3ZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBmb2xsb3dpbmc6Ci0JKiogdHVuZXIgdHlwZTogdGFnIFswMF0uMDUgb3IgWzBhXS4wMSAoaW5kZXggaW50byBoYXVwcGF1Z2VfdHVuZXIpCi0JKiogdHVuZXIgZm10czogdGFnIFswMF0uMDQgb3IgWzBhXS4wMCAoYml0bWFzayBpbmRleCBpbnRvIGhhdXBwYXVnZV90dW5lcl9mbXQpCi0JKiogcmFkaW86ICAgICAgdGFnIFswMF0ue2xhc3R9IG9yIFswZV0uMDAgIChiaXRtYXNrLiAgYml0Mj1GTSkKLQkqKiBhdWRpbyBwcm9jOiB0YWcgWzAyXS4wMSBvciBbMDVdLjAwIChsb3dlciBuaWJibGUgaW5kZXhlcyBsdXQ/KQorCSoqIHR1bmVyIHR5cGU6ICAgdGFnIFswMF0uMDUgb3IgWzBhXS4wMSAoaW5kZXggaW50byBoYXVwcGF1Z2VfdHVuZXIpCisJKiogdHVuZXIgZm10czogICB0YWcgWzAwXS4wNCBvciBbMGFdLjAwIChiaXRtYXNrIGluZGV4IGludG8gaGF1cHBhdWdlX3R1bmVyX2ZtdCkKKwkqKiByYWRpbzogICAgICAgIHRhZyBbMDBdLntsYXN0fSBvciBbMGVdLjAwICAoYml0bWFzay4gIGJpdDI9Rk0pCisJKiogYXVkaW8gcHJvYzogICB0YWcgWzAyXS4wMSBvciBbMDVdLjAwIChtYXNrIHdpdGggMHg3ZikKKwkqKiBkZWNvZGVyIHByb2M6IHRhZyBbMDldLjAxKQogCiAJKiogRnVuIGluZm86CiAJKiogbW9kZWw6ICAgICAgdGFnIFswMF0uMDctMDggb3IgWzA2XS4wMC0wMQpAQCAtMjczLDIwICszMTIsMjQgQEAKIAkqKiAjIG9mIGlucHV0cy9vdXRwdXRzID8/PwogCSovCiAKLQlpbnQgaSwgaiwgbGVuLCBkb25lLCBiZWVuaGVyZSwgdGFnLCB0dW5lciA9IDAsIHRfZm9ybWF0ID0gMDsKLQljaGFyICp0X25hbWUgPSBOVUxMLCAqdF9mbXRfbmFtZSA9IE5VTEw7CisJaW50IGksIGosIGxlbiwgZG9uZSwgYmVlbmhlcmUsIHRhZzsKIAotCWRwcmludGsoMSwgIiVzXG4iLF9fRlVOQ1RJT05fXyk7Ci0JdHZlZS0+cmV2aXNpb24gPSBkb25lID0gbGVuID0gYmVlbmhlcmUgPSAwOworICAgICAgICBpbnQgdHVuZXIxID0gMCwgdF9mb3JtYXQxID0gMDsKKwljaGFyICp0X25hbWUxID0gTlVMTDsKKyAgICAgICAgY29uc3QgY2hhciAqdF9mbXRfbmFtZTFbOF0gPSB7ICIgbm9uZSIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiIH07CisKKyAgICAgICAgaW50IHR1bmVyMiA9IDAsIHRfZm9ybWF0MiA9IDA7CisJY2hhciAqdF9uYW1lMiA9IE5VTEw7CisgICAgICAgIGNvbnN0IGNoYXIgKnRfZm10X25hbWUyWzhdID0geyAiIG5vbmUiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiB9OworCisgICAgICAgIG1lbXNldCh0dmVlLCAwLCBzaXplb2YoKnR2ZWUpKTsKKwlkb25lID0gbGVuID0gYmVlbmhlcmUgPSAwOwogCWZvciAoaSA9IDA7ICFkb25lICYmIGkgPCAyNTY7IGkgKz0gbGVuKSB7Ci0JCWRwcmludGsoMiwgInByb2Nlc3NpbmcgcG9zID0gJTAyeCAoJTAyeCwgJTAyeClcbiIsCi0JCQlpLCBlZXByb21fZGF0YVtpXSwgZWVwcm9tX2RhdGFbaSArIDFdKTsKLQogCQlpZiAoZWVwcm9tX2RhdGFbaV0gPT0gMHg4NCkgewogCQkJbGVuID0gZWVwcm9tX2RhdGFbaSArIDFdICsgKGVlcHJvbV9kYXRhW2kgKyAyXSA8PCA4KTsKLQkJCWkrPTM7CisJCQlpICs9IDM7CiAJCX0gZWxzZSBpZiAoKGVlcHJvbV9kYXRhW2ldICYgMHhmMCkgPT0gMHg3MCkgewotCQkJaWYgKChlZXByb21fZGF0YVtpXSAmIDB4MDgpKSB7CisJCQlpZiAoZWVwcm9tX2RhdGFbaV0gJiAweDA4KSB7CiAJCQkJLyogdmVyaWZ5IGNoZWNrc3VtISAqLwogCQkJCWRvbmUgPSAxOwogCQkJCWJyZWFrOwpAQCAtMjk0LDI0ICszMzcsMzAgQEAKIAkJCWxlbiA9IGVlcHJvbV9kYXRhW2ldICYgMHgwNzsKIAkJCSsraTsKIAkJfSBlbHNlIHsKLQkJCVRWRUVQUk9NX0tFUk5fRVJSKCJFbmNvdW50ZXJlZCBiYWQgcGFja2V0IGhlYWRlciBbJTAyeF0uICIKKwkJCXR2ZWVwcm9tX3dhcm4oIkVuY291bnRlcmVkIGJhZCBwYWNrZXQgaGVhZGVyIFslMDJ4XS4gIgogCQkJCSAgICJDb3JydXB0IG9yIG5vdCBhIEhhdXBwYXVnZSBlZXByb20uXG4iLCBlZXByb21fZGF0YVtpXSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlkcHJpbnRrKDEsICIlM2QgWyUwMnhdICIsIGxlbiwgZWVwcm9tX2RhdGFbaV0pOwotCQlmb3IoaiA9IDE7IGogPCBsZW47IGorKykgewotCQkJZHByaW50aygxLCAiJTAyeCAiLCBlZXByb21fZGF0YVtpICsgal0pOwotCQl9Ci0JCWRwcmludGsoMSwgIlxuIik7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCJUYWcgWyUwMnhdICsgJWQgYnl0ZXM6IiwgZWVwcm9tX2RhdGFbaV0sIGxlbiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgJTAyeCIsIGVlcHJvbV9kYXRhW2kgKyBqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgfQogCiAJCS8qIHByb2Nlc3MgYnkgdGFnICovCiAJCXRhZyA9IGVlcHJvbV9kYXRhW2ldOwogCQlzd2l0Y2ggKHRhZykgewogCQljYXNlIDB4MDA6Ci0JCQl0dW5lciA9IGVlcHJvbV9kYXRhW2krNl07Ci0JCQl0X2Zvcm1hdCA9IGVlcHJvbV9kYXRhW2krNV07CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWc6ICdDb21wcmVoZW5zaXZlJyAqLworCQkJdHVuZXIxID0gZWVwcm9tX2RhdGFbaSs2XTsKKwkJCXRfZm9ybWF0MSA9IGVlcHJvbV9kYXRhW2krNV07CiAJCQl0dmVlLT5oYXNfcmFkaW8gPSBlZXByb21fZGF0YVtpK2xlbi0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9sZCBzdHlsZSB0YWcsIGRvbid0IGtub3cgaG93IHRvIGRldGVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVIgcHJlc2VuY2UsIG1hcmsgYXMgdW5rbm93bi4gKi8KKwkJCXR2ZWUtPmhhc19pciA9IDI7CiAJCQl0dmVlLT5tb2RlbCA9CiAJCQkJZWVwcm9tX2RhdGFbaSs4XSArCiAJCQkJKGVlcHJvbV9kYXRhW2krOV0gPDwgOCk7CkBAIC0zMTksMjUgKzM2OCw0MyBAQAogCQkJCShlZXByb21fZGF0YVtpKzExXSA8PCA4KSArCiAJCQkJKGVlcHJvbV9kYXRhW2krMTJdIDw8IDE2KTsKIAkJCWJyZWFrOworCiAJCWNhc2UgMHgwMToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZzogJ1NlcmlhbElEJyAqLwogCQkJdHZlZS0+c2VyaWFsX251bWJlciA9CiAJCQkJZWVwcm9tX2RhdGFbaSs2XSArCiAJCQkJKGVlcHJvbV9kYXRhW2krN10gPDwgOCkgKwogCQkJCShlZXByb21fZGF0YVtpKzhdIDw8IDE2KTsKIAkJCWJyZWFrOworCiAJCWNhc2UgMHgwMjoKLQkJCXR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2krMl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdBdWRpb0luZm8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIG1hc2sgd2l0aCAweDdGLCBoaWdoIGJpdCB1c2VkIG9uIHNvbWUgb2xkZXIgbW9kZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSA0MDUyIG11eCB3YXMgcmVtb3ZlZCBpbiBmYXZvciBvZiB1c2luZyBNU1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cyBkaXJlY3RseS4gKi8KKwkJCXR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2krMl0gJiAweDdmOwogCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiBjYXNlIDB4MDM6IHRhZyAnRUVJbmZvJyAqLworCiAJCWNhc2UgMHgwNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZyAnU2VyaWFsSUQyJyAqLwogCQkJdHZlZS0+c2VyaWFsX251bWJlciA9CiAJCQkJZWVwcm9tX2RhdGFbaSs1XSArCiAJCQkJKGVlcHJvbV9kYXRhW2krNl0gPDwgOCkgKwogCQkJCShlZXByb21fZGF0YVtpKzddIDw8IDE2KTsKIAkJCWJyZWFrOworCiAJCWNhc2UgMHgwNToKLQkJCXR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2krMV0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdBdWRpbzInCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIG1hc2sgd2l0aCAweDdGLCBoaWdoIGJpdCB1c2VkIG9uIHNvbWUgb2xkZXIgbW9kZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSA0MDUyIG11eCB3YXMgcmVtb3ZlZCBpbiBmYXZvciBvZiB1c2luZyBNU1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cyBkaXJlY3RseS4gKi8KKwkJCXR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciA9IGVlcHJvbV9kYXRhW2krMV0gJiAweDdmOwogCQkJYnJlYWs7CisKIAkJY2FzZSAweDA2OgorICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFnICdNb2RlbFJldicgKi8KIAkJCXR2ZWUtPm1vZGVsID0KIAkJCQllZXByb21fZGF0YVtpKzFdICsKIAkJCQkoZWVwcm9tX2RhdGFbaSsyXSA8PCA4KTsKQEAgLTM0NSwyNyArNDEyLDY2IEBACiAJCQkJKGVlcHJvbV9kYXRhW2krNl0gPDwgOCkgKwogCQkJCShlZXByb21fZGF0YVtpKzddIDw8IDE2KTsKIAkJCWJyZWFrOworCisJCWNhc2UgMHgwNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZyAnRGV0YWlscyc6IGFjY29yZGluZyB0byBIYXVwcGF1Z2Ugbm90IGludGVyZXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhbnkgUENJLWVyYSBvciBsYXRlciBib2FyZHMuICovCisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIC8qIHRoZXJlIGlzIG5vIHRhZyAweDA4IGRlZmluZWQgKi8KKworCQljYXNlIDB4MDk6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWcgJ1ZpZGVvJyAqLworCQkJdHZlZS0+ZGVjb2Rlcl9wcm9jZXNzb3IgPSBlZXByb21fZGF0YVtpICsgMV07CisJCQlicmVhazsKKwogCQljYXNlIDB4MGE6Ci0JCQlpZihiZWVuaGVyZSA9PSAwKSB7Ci0JCQkJdHVuZXIgPSBlZXByb21fZGF0YVtpKzJdOwotCQkJCXRfZm9ybWF0ID0gZWVwcm9tX2RhdGFbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZyAnVHVuZXInICovCisJCQlpZiAoYmVlbmhlcmUgPT0gMCkgeworCQkJCXR1bmVyMSA9IGVlcHJvbV9kYXRhW2krMl07CisJCQkJdF9mb3JtYXQxID0gZWVwcm9tX2RhdGFbaSsxXTsKIAkJCQliZWVuaGVyZSA9IDE7Ci0JCQkJYnJlYWs7CiAJCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhIHNlY29uZCAocmFkaW8pIHR1bmVyIG1heSBiZSBwcmVzZW50ICovCisJCQkJdHVuZXIyID0gZWVwcm9tX2RhdGFbaSsyXTsKKwkJCQl0X2Zvcm1hdDIgPSBlZXByb21fZGF0YVtpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodF9mb3JtYXQyID09IDApIHsgIC8qIG5vdCBhIFRWIHR1bmVyPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2ZWUtPmhhc19yYWRpbyA9IDE7IC8qIG11c3QgYmUgcmFkaW8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDB4MGI6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWcgJ0lucHV0cyc6IGFjY29yZGluZyB0byBIYXVwcGF1Z2UgdGhpcyBpcyBzcGVjaWZpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZWFjaCBkcml2ZXIgZmFtaWx5LCBzbyBubyBnb29kIGFzc3VtcHRpb25zIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFkZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogY2FzZSAweDBjOiB0YWcgJ0JhbHVuJyAqLworICAgICAgICAgICAgICAgIC8qIGNhc2UgMHgwZDogdGFnICdUZWxldGV4dCcgKi8KKwogCQljYXNlIDB4MGU6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWc6ICdSYWRpbycgKi8KIAkJCXR2ZWUtPmhhc19yYWRpbyA9IGVlcHJvbV9kYXRhW2krMV07CiAJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMHgwZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhZyAnSVJJbmZvJyAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+aGFzX2lyID0gZWVwcm9tX2RhdGFbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogY2FzZSAweDEwOiB0YWcgJ1ZCSUluZm8nICovCisgICAgICAgICAgICAgICAgLyogY2FzZSAweDExOiB0YWcgJ1FDSW5mbycgKi8KKyAgICAgICAgICAgICAgICAvKiBjYXNlIDB4MTI6IHRhZyAnSW5mb0JpdHMnICovCisKIAkJZGVmYXVsdDoKLQkJCWRwcmludGsoMSwgIk5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCB0YWcgWyUwMnhdXG4iLCB0YWcpOworCQkJdHZlZXByb21fZGJnKCJOb3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGFnIFslMDJ4XVxuIiwgdGFnKTsKIAkJCS8qIGR1bXAgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldD8gKi8KIAkJfQotCiAJfQogCiAJaWYgKCFkb25lKSB7Ci0JCVRWRUVQUk9NX0tFUk5fRVJSKCJSYW4gb3V0IG9mIGRhdGEhXG4iKTsKKwkJdHZlZXByb21fd2FybigiUmFuIG91dCBvZiBkYXRhIVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM3Nyw0NyArNDgzLDcyIEBACiAJCXR2ZWUtPnJldl9zdHJbNF0gPSAwOwogCX0KIAotICAgICAgICBpZiAoaGFzUmFkaW9UdW5lcih0dW5lcikgJiYgIXR2ZWUtPmhhc19yYWRpbykgewotCSAgICBUVkVFUFJPTV9LRVJOX0lORk8oIlRoZSBlZXByb20gc2F5cyBubyByYWRpbyBpcyBwcmVzZW50LCBidXQgdGhlIHR1bmVyIHR5cGVcbiIpOwotCSAgICBUVkVFUFJPTV9LRVJOX0lORk8oImluZGljYXRlcyBvdGhlcndpc2UuIEkgd2lsbCBhc3N1bWUgdGhhdCByYWRpbyBpcyBwcmVzZW50LlxuIik7CisgICAgICAgIGlmIChoYXNSYWRpb1R1bmVyKHR1bmVyMSkgJiYgIXR2ZWUtPmhhc19yYWRpbykgeworCSAgICB0dmVlcHJvbV9pbmZvKCJUaGUgZWVwcm9tIHNheXMgbm8gcmFkaW8gaXMgcHJlc2VudCwgYnV0IHRoZSB0dW5lciB0eXBlXG4iKTsKKwkgICAgdHZlZXByb21faW5mbygiaW5kaWNhdGVzIG90aGVyd2lzZS4gSSB3aWxsIGFzc3VtZSB0aGF0IHJhZGlvIGlzIHByZXNlbnQuXG4iKTsKICAgICAgICAgICAgIHR2ZWUtPmhhc19yYWRpbyA9IDE7CiAgICAgICAgIH0KIAotCWlmICh0dW5lciA8IHNpemVvZihoYXVwcGF1Z2VfdHVuZXIpL3NpemVvZihzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSKSkgewotCQl0dmVlLT50dW5lcl90eXBlID0gaGF1cHBhdWdlX3R1bmVyW3R1bmVyXS5pZDsKLQkJdF9uYW1lID0gaGF1cHBhdWdlX3R1bmVyW3R1bmVyXS5uYW1lOworCWlmICh0dW5lcjEgPCBzaXplb2YoaGF1cHBhdWdlX3R1bmVyKS9zaXplb2Yoc3RydWN0IEhBVVBQQVVHRV9UVU5FUikpIHsKKwkJdHZlZS0+dHVuZXJfdHlwZSA9IGhhdXBwYXVnZV90dW5lclt0dW5lcjFdLmlkOworCQl0X25hbWUxID0gaGF1cHBhdWdlX3R1bmVyW3R1bmVyMV0ubmFtZTsKIAl9IGVsc2UgewotCQl0X25hbWUgPSAiPHVua25vd24+IjsKKwkJdF9uYW1lMSA9ICJ1bmtub3duIjsKKwl9CisKKwlpZiAodHVuZXIyIDwgc2l6ZW9mKGhhdXBwYXVnZV90dW5lcikvc2l6ZW9mKHN0cnVjdCBIQVVQUEFVR0VfVFVORVIpKSB7CisJCXR2ZWUtPnR1bmVyMl90eXBlID0gaGF1cHBhdWdlX3R1bmVyW3R1bmVyMl0uaWQ7CisJCXRfbmFtZTIgPSBoYXVwcGF1Z2VfdHVuZXJbdHVuZXIyXS5uYW1lOworCX0gZWxzZSB7CisJCXRfbmFtZTIgPSAidW5rbm93biI7CiAJfQogCiAJdHZlZS0+dHVuZXJfZm9ybWF0cyA9IDA7Ci0JdF9mbXRfbmFtZSA9ICI8bm9uZT4iOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKHRfZm9ybWF0ICYgKDE8PGkpKSB7CisJdHZlZS0+dHVuZXIyX2Zvcm1hdHMgPSAwOworCWZvciAoaSA9IGogPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmICh0X2Zvcm1hdDEgJiAoMSA8PCBpKSkgewogCQkJdHZlZS0+dHVuZXJfZm9ybWF0cyB8PSBoYXVwcGF1Z2VfdHVuZXJfZm10W2ldLmlkOwotCQkJLyogeXVjayAqLwotCQkJdF9mbXRfbmFtZSA9IGhhdXBwYXVnZV90dW5lcl9mbXRbaV0ubmFtZTsKKwkJCXRfZm10X25hbWUxW2orK10gPSBoYXVwcGF1Z2VfdHVuZXJfZm10W2ldLm5hbWU7CiAJCX0KKyAgICAgICAgICAgICAgICBpZiAodF9mb3JtYXQyICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR2ZWUtPnR1bmVyMl9mb3JtYXRzIHw9IGhhdXBwYXVnZV90dW5lcl9mbXRbaV0uaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0X2ZtdF9uYW1lMltqKytdID0gaGF1cHBhdWdlX3R1bmVyX2ZtdFtpXS5uYW1lOworICAgICAgICAgICAgICAgIH0KIAl9CiAKLQotCVRWRUVQUk9NX0tFUk5fSU5GTygiSGF1cHBhdWdlOiBtb2RlbCA9ICVkLCByZXYgPSAlcywgc2VyaWFsIyA9ICVkXG4iLAotCQkgICB0dmVlLT5tb2RlbCwKLQkJICAgdHZlZS0+cmV2X3N0ciwKLQkJICAgdHZlZS0+c2VyaWFsX251bWJlcik7Ci0JVFZFRVBST01fS0VSTl9JTkZPKCJ0dW5lciA9ICVzIChpZHggPSAlZCwgdHlwZSA9ICVkKVxuIiwKLQkJICAgdF9uYW1lLAotCQkgICB0dW5lciwKLQkJICAgdHZlZS0+dHVuZXJfdHlwZSk7Ci0JVFZFRVBST01fS0VSTl9JTkZPKCJ0dW5lciBmbXQgPSAlcyAoZWVwcm9tID0gMHglMDJ4LCB2NGwyID0gMHglMDh4KVxuIiwKLQkJICAgdF9mbXRfbmFtZSwKLQkJICAgdF9mb3JtYXQsCi0JCSAgIHR2ZWUtPnR1bmVyX2Zvcm1hdHMpOwotCi0JVFZFRVBST01fS0VSTl9JTkZPKCJhdWRpb19wcm9jZXNzb3IgPSAlcyAodHlwZSA9ICVkKVxuIiwKLQkJICAgU1RSTShzbmR0eXBlLHR2ZWUtPmF1ZGlvX3Byb2Nlc3NvciksCisJdHZlZXByb21faW5mbygiSGF1cHBhdWdlIG1vZGVsICVkLCByZXYgJXMsIHNlcmlhbCMgJWRcbiIsCisJCSAgIHR2ZWUtPm1vZGVsLCB0dmVlLT5yZXZfc3RyLCB0dmVlLT5zZXJpYWxfbnVtYmVyKTsKKwl0dmVlcHJvbV9pbmZvKCJ0dW5lciBtb2RlbCBpcyAlcyAoaWR4ICVkLCB0eXBlICVkKVxuIiwKKwkJICAgdF9uYW1lMSwgdHVuZXIxLCB0dmVlLT50dW5lcl90eXBlKTsKKwl0dmVlcHJvbV9pbmZvKCJUViBzdGFuZGFyZHMlcyVzJXMlcyVzJXMlcyVzIChlZXByb20gMHglMDJ4KVxuIiwKKwkJICAgdF9mbXRfbmFtZTFbMF0sIHRfZm10X25hbWUxWzFdLCB0X2ZtdF9uYW1lMVsyXSwgdF9mbXRfbmFtZTFbM10sCisJCSAgIHRfZm10X25hbWUxWzRdLCB0X2ZtdF9uYW1lMVs1XSwgdF9mbXRfbmFtZTFbNl0sIHRfZm10X25hbWUxWzddLAorICAgICAgICAgICAgICAgICAgIHRfZm9ybWF0MSk7CisgICAgICAgIGlmICh0dW5lcjIpIHsKKyAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCJzZWNvbmQgdHVuZXIgbW9kZWwgaXMgJXMgKGlkeCAlZCwgdHlwZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0X25hbWUyLCB0dW5lcjIsIHR2ZWUtPnR1bmVyMl90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodF9mb3JtYXQyKSB7CisgICAgICAgICAgICAgICAgdHZlZXByb21faW5mbygiVFYgc3RhbmRhcmRzJXMlcyVzJXMlcyVzJXMlcyAoZWVwcm9tIDB4JTAyeClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZtdF9uYW1lMlswXSwgdF9mbXRfbmFtZTJbMV0sIHRfZm10X25hbWUyWzJdLCB0X2ZtdF9uYW1lMlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZm10X25hbWUyWzRdLCB0X2ZtdF9uYW1lMls1XSwgdF9mbXRfbmFtZTJbNl0sIHRfZm10X25hbWUyWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mb3JtYXQyKTsKKyAgICAgICAgfQorCXR2ZWVwcm9tX2luZm8oImF1ZGlvIHByb2Nlc3NvciBpcyAlcyAoaWR4ICVkKVxuIiwKKwkJICAgU1RSTShhdWRpb0lDLCB0dmVlLT5hdWRpb19wcm9jZXNzb3IpLAogCQkgICB0dmVlLT5hdWRpb19wcm9jZXNzb3IpOwotCisgICAgICAgIGlmICh0dmVlLT5kZWNvZGVyX3Byb2Nlc3NvcikgeworICAgICAgICAgICAgICAgIHR2ZWVwcm9tX2luZm8oImRlY29kZXIgcHJvY2Vzc29yIGlzICVzIChpZHggJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSTShkZWNvZGVySUMsIHR2ZWUtPmRlY29kZXJfcHJvY2Vzc29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2ZWUtPmRlY29kZXJfcHJvY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHZlZS0+aGFzX2lyID09IDIpCisgICAgICAgICAgICAgICAgdHZlZXByb21faW5mbygiaGFzICVzcmFkaW9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2ZWUtPmhhc19yYWRpbyA/ICIiIDogIm5vICIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHZlZXByb21faW5mbygiaGFzICVzcmFkaW8sIGhhcyAlc0lSIHJlbW90ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+aGFzX3JhZGlvID8gIiIgOiAibm8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZlZS0+aGFzX2lyID8gIiIgOiAibm8gIik7CiB9CiBFWFBPUlRfU1lNQk9MKHR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2cpOwogCkBAIC00MjksNDAgKzU2MCwzMSBAQAogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCBlcnI7CiAKLQlkcHJpbnRrKDEsICIlc1xuIixfX0ZVTkNUSU9OX18pOwogCWJ1ZiA9IDA7Ci0JaWYgKDEgIT0gKGVyciA9IGkyY19tYXN0ZXJfc2VuZChjLCZidWYsMSkpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInR2ZWVwcm9tKCVzKTogSHVoLCBubyBlZXByb20gcHJlc2VudCAoZXJyPSVkKT9cbiIsCi0JCSAgICAgICBjLT5uYW1lLGVycik7CisJaWYgKDEgIT0gKGVyciA9IGkyY19tYXN0ZXJfc2VuZChjLCAmYnVmLCAxKSkpIHsKKwkJdHZlZXByb21faW5mbygiSHVoLCBubyBlZXByb20gcHJlc2VudCAoZXJyPSVkKT9cbiIsIGVycik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKGxlbiAhPSAoZXJyID0gaTJjX21hc3Rlcl9yZWN2KGMsZWVkYXRhLGxlbikpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInR2ZWVwcm9tKCVzKTogaTJjIGVlcHJvbSByZWFkIGVycm9yIChlcnI9JWQpXG4iLAotCQkgICAgICAgYy0+bmFtZSxlcnIpOworCWlmIChsZW4gIT0gKGVyciA9IGkyY19tYXN0ZXJfcmVjdihjLCBlZWRhdGEsIGxlbikpKSB7CisJCXR2ZWVwcm9tX3dhcm4oImkyYyBlZXByb20gcmVhZCBlcnJvciAoZXJyPSVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIC0xOwogCX0KKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICB0dmVlcHJvbV9pbmZvKCJmdWxsIDI1Ni1ieXRlIGVlcHJvbSBkdW1wOlxuIik7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSAoaSAlIDE2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZlZXByb21faW5mbygiJTAyeDoiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiICUwMngiLCBlZWRhdGFbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDE1ID09IChpICUgMTYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHR2ZWVwcm9tX3JlYWQpOwogCi0jaWYgMAotaW50IHR2ZWVwcm9tX2R1bXAodW5zaWduZWQgY2hhciAqZWVkYXRhLCBpbnQgbGVuKQotewotCWludCBpOwotCi0JZHByaW50aygxLCAiJXNcbiIsX19GVU5DVElPTl9fKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKDAgPT0gKGkgJSAxNikpCi0JCQlwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbTogJTAyeDoiLGkpOwotCQlwcmludGsoIiAlMDJ4IixlZWRhdGFbaV0pOwotCQlpZiAoMTUgPT0gKGkgJSAxNikpCi0JCQlwcmludGsoIlxuIik7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh0dmVlcHJvbV9kdW1wKTsKLSNlbmRpZiAgLyogIDAgICovCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBuZWVkZWQgZm9yIGl2dHYuc2YubmV0IGF0IHRoZSBtb21lbnQuICBTaG91bGQgZ28gYXdheSBpbiB0aGUgbG9uZyAgICAgICAqLwogLyogcnVuLCBqdXN0IGNhbGwgdGhlIGV4cG9ydGVkIHR2ZWVwcm9tXyogZGlyZWN0bHksIHRoZXJlIGlzIG5vIHBvaW50IGluICAgKi8KQEAgLTQ5NSwxMiArNjE3LDEzIEBACiAJCWJ1ZiA9IGttYWxsb2MoMjU2LEdGUF9LRVJORUwpOwogCQltZW1zZXQoYnVmLDAsMjU2KTsKIAkJdHZlZXByb21fcmVhZChjbGllbnQsYnVmLDI1Nik7Ci0JCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coJmVlcHJvbSxidWYpOworCQl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKGNsaWVudCwgJmVlcHJvbSxidWYpOwogCQlrZnJlZShidWYpOwogCQllZXByb21fcHJvcHNbMF0gPSBlZXByb20udHVuZXJfdHlwZTsKIAkJZWVwcm9tX3Byb3BzWzFdID0gZWVwcm9tLnR1bmVyX2Zvcm1hdHM7CiAJCWVlcHJvbV9wcm9wc1syXSA9IGVlcHJvbS5tb2RlbDsKIAkJZWVwcm9tX3Byb3BzWzNdID0gZWVwcm9tLnJldmlzaW9uOworCQllZXByb21fcHJvcHNbNF0gPSBlZXByb20uaGFzX3JhZGlvOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUxNSw4ICs2MzgsNiBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAKLQlkcHJpbnRrKDEsIiVzOiBpZCAweCV4IEAgMHgleFxuIixfX0ZVTkNUSU9OX18sCi0JICAgICAgIGFkYXB0ZXItPmlkLCBhZGRyZXNzIDw8IDEpOwogCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gY2xpZW50KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTUzMyw3ICs2NTQsNiBAQAogc3RhdGljIGludAogdHZlZXByb21fYXR0YWNoX2FkYXB0ZXIgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlkcHJpbnRrKDEsIiVzOiBpZCAweCV4XG4iLF9fRlVOQ1RJT05fXyxhZGFwdGVyLT5pZCk7CiAJaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19IV19CX0JUODQ4KQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHR2ZWVwcm9tX2RldGVjdF9jbGllbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwppbmRleCBhNDMzMDFhLi5kODZlMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHR2bWl4ZXIuYyx2IDEuOCAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggNzBlY2JkYi4uNTliYjcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IHY0bDEtY29tcGF0LmMsdiAxLjkgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCiAgKgogICoJVmlkZW8gZm9yIExpbnV4IFR3bwogICoJQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBMYXllcgpAQCAtNjA0LDkgKzYwMyw2IEBACiAJCQlkcHJpbnRrKCJWSURJT0NHUElDVCAvIFZJRElPQ19HX0ZNVDogJWRcbiIsZXJyKTsKIAkJCWJyZWFrOwogCQl9Ci0jaWYgMCAvKiBGSVhNRSAqLwotCQlwaWN0LT5kZXB0aCAgID0gZm10Mi0+Zm10LnBpeC5kZXB0aDsKLSNlbmRpZgogCQlwaWN0LT5wYWxldHRlID0gcGl4ZWxmb3JtYXRfdG9fcGFsZXR0ZSgKIAkJCWZtdDItPmZtdC5waXgucGl4ZWxmb3JtYXQpOwogCQlicmVhazsKQEAgLTcwNywxMyArNzAzLDcgQEAKIAl9CiAJY2FzZSBWSURJT0NTVFVORVI6IC8qICBzZWxlY3QgYSB0dW5lciBpbnB1dCAgKi8KIAl7Ci0jaWYgMCAvKiBGSVhNRSAqLwotCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0lOUFVULCAmaSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZHByaW50aygiVklESU9DU1RVTkVSIC8gVklESU9DX1NfSU5QVVQ6ICVkXG4iLGVycik7Ci0jZWxzZQogCQllcnIgPSAwOwotI2VuZGlmCiAJCWJyZWFrOwogCX0KIAljYXNlIFZJRElPQ0dGUkVROiAvKiAgZ2V0IGZyZXF1ZW5jeSAgKi8KQEAgLTg1MiwxMiArODQyLDYgQEAKIAkJZXJyID0gMDsKIAkJYnJlYWs7CiAJfQotI2lmIDAKLQljYXNlIFZJRElPQ0dNQlVGOgotCQkvKiB2NGwyIGRyaXZlcnMgbXVzdCBpbXBsZW1lbnQgdGhhdCB0aGVtc2VsZi4gIFRoZQotCQkgICBtbWFwKCkgZGlmZmVyZW5jZXMgY2FuJ3QgYmUgdHJhbnNsYXRlZCBmdWxseQotCQkgICB0cmFuc3BhcmVudCwgdGh1cyB0aGVyZSBpcyBubyBwb2ludCB0byB0cnkgdGhhdCAqLwotI2VuZGlmCiAJY2FzZSBWSURJT0NNQ0FQVFVSRTogLyogIGNhcHR1cmUgYSBmcmFtZSAgKi8KIAl7CiAJCXN0cnVjdCB2aWRlb19tbWFwCSptbSA9IGFyZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwppbmRleCBiNWUwY2YzLi41OTdiOGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCkBAIC04NCwyMCArODQsNiBAQAogICogIFZpZGVvIFN0YW5kYXJkIE9wZXJhdGlvbnMgKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgU2NoaW1laykKICAqLwogCi0jaWYgMCAvKiBzZWVtcyB0byBoYXZlIG5vIHVzZXJzICovCi0vKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtZXRob2QgdG8gZGVhbCB3aXRoIHRoZSBmcmFtZXJhdGUgZmllbGRzLiBNb3JlCi0gICBzb3BoaXN0aWNhdGVkIGRyaXZlcnMgd2lsbCBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4gKi8KLXVuc2lnbmVkIGludAotdjRsMl92aWRlb19zdGRfZnBzKHN0cnVjdCB2NGwyX3N0YW5kYXJkICp2cykKLXsKLQlpZiAodnMtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA+IDApCi0JCXJldHVybiAoKCh2cy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPDwgOCkgLwotCQkJIHZzLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IpICsKLQkJCSgxIDw8IDcpKSAvICgxIDw8IDgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh2NGwyX3ZpZGVvX3N0ZF9mcHMpOwotI2VuZGlmCiAKIC8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiBhIHY0bDJfc3RhbmRhcmQgc3RydWN0dXJlIGFjY29yZGluZyB0byB0aGUKICAgICdpZCcgYW5kICd0cmFuc21pc3Npb24nIHBhcmFtZXRlcnMuICBSZXR1cm5zIG5lZ2F0aXZlIG9uIGVycm9yLiAgKi8KQEAgLTIxMywxMCArMTk5LDYgQEAKIAlbX0lPQ19OUihWSURJT0NfRU5VTV9GTVQpXSAgICAgICA9ICJWSURJT0NfRU5VTV9GTVQiLAogCVtfSU9DX05SKFZJRElPQ19HX0ZNVCldICAgICAgICAgID0gIlZJRElPQ19HX0ZNVCIsCiAJW19JT0NfTlIoVklESU9DX1NfRk1UKV0gICAgICAgICAgPSAiVklESU9DX1NfRk1UIiwKLSNpZiAwCi0JW19JT0NfTlIoVklESU9DX0dfQ09NUCldICAgICAgICAgPSAiVklESU9DX0dfQ09NUCIsCi0JW19JT0NfTlIoVklESU9DX1NfQ09NUCldICAgICAgICAgPSAiVklESU9DX1NfQ09NUCIsCi0jZW5kaWYKIAlbX0lPQ19OUihWSURJT0NfUkVRQlVGUyldICAgICAgICA9ICJWSURJT0NfUkVRQlVGUyIsCiAJW19JT0NfTlIoVklESU9DX1FVRVJZQlVGKV0gICAgICAgPSAiVklESU9DX1FVRVJZQlVGIiwKIAlbX0lPQ19OUihWSURJT0NfR19GQlVGKV0gICAgICAgICA9ICJWSURJT0NfR19GQlVGIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKaW5kZXggMTVmNWJiNC4uNTVmMTI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiB2aWRlby1idWYtZHZiLmMsdiAxLjcgMjAwNC8xMi8wOSAxMjo1MTozNSBrcmF4ZWwgRXhwICQKICAqCiAgKiBzb21lIGhlbHBlciBmdW5jdGlvbiBmb3Igc2ltcGxlIERWQiBjYXJkcyB3aGljaCBzaW1wbHkgRE1BIHRoZQogICogY29tcGxldGUgdHJhbnNwb3J0IHN0cmVhbSBhbmQgbGV0IHRoZSBjb21wdXRlciBzb3J0IGV2ZXJ5dGhpbmcgZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLmMKaW5kZXggNWFmZGM3OC4uNTc0YjhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogdmlkZW8tYnVmLmMsdiAxLjE4IDIwMDUvMDIvMjQgMTM6MzI6MzAga3JheGVsIEV4cCAkCiAgKgogICogZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIGZvciB2aWRlbzRsaW51eCBjYXB0dXJlIGJ1ZmZlcnMsIHRvIGhhbmRsZQogICogbWVtb3J5IG1hbmFnZW1lbnQgYW5kIFBDSSBETUEuICBSaWdodCBub3cgYnR0diArIHNhYTcxMzQgdXNlIGl0LgpAQCAtMjY4LDEwICsyNjcsMTAgQEAKIAkJa2ZyZWUoZG1hLT5wYWdlcyk7CiAJCWRtYS0+cGFnZXMgPSBOVUxMOwogCX0KLQlpZiAoZG1hLT52bWFsbG9jKSB7Ci0JCXZmcmVlKGRtYS0+dm1hbGxvYyk7Ci0JCWRtYS0+dm1hbGxvYyA9IE5VTEw7Ci0JfQorCisJdmZyZWUoZG1hLT52bWFsbG9jKTsKKwlkbWEtPnZtYWxsb2MgPSBOVUxMOworCiAJaWYgKGRtYS0+YnVzX2FkZHIpIHsKIAkJZG1hLT5idXNfYWRkciA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwppbmRleCA3NmU4NjgxLi5kOGEwZjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwpAQCAtMSw4MCArMSw2MDYgQEAKIC8qCi0gKiAoaW5jb21wbGV0ZSkgRHJpdmVyIGZvciB0aGUgVklOTyAoVmlkZW8gSW4gTm8gT3V0KSBzeXN0ZW0gZm91bmQgaW4gU0dJIEluZHlzLgorICogRHJpdmVyIGZvciB0aGUgVklOTyAoVmlkZW8gSW4gTm8gT3V0KSBzeXN0ZW0gZm91bmQgaW4gU0dJIEluZHlzLgogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSBNaWthZWwgTm91c2lhaW5lbiA8dG1ub3VzaWFAY2MuaHV0LmZpPgorICoKKyAqIEJhc2VkIG9uIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgZm9yIDIuNCBrZXJuZWxzIGJ5OgogICogQ29weXJpZ2h0IChDKSAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisvKgorICogVE9ETzoKKyAqIC0gcmVtb3ZlICJoYWNrcyIgZnJvbSBtZW1vcnkgYWxsb2NhdGlvbiBjb2RlIGFuZCBpbXBsZW1lbnQgbm9wYWdlKCkKKyAqIC0gY2hlY2sgZGVjaW1hdGlvbiwgY2FsY3VsYXRpbmcgYW5kIHJlcG9ydGluZyBpbWFnZSBzaXplIHdoZW4KKyAqICAgdXNpbmcgZGVjaW1hdGlvbgorICogLSBjaGVjayB2aW5vX2FjcXVpcmVfaW5wdXQoKSwgdmlub19zZXRfaW5wdXQoKSBhbmQgY2hhbm5lbAorICogICBvd25lcnNoaXAgaGFuZGxpbmcKKyAqIC0gcmVwb3J0IFZJTk8gZXJyb3ItaW50ZXJydXB0cyB2aWEgaW9jdGxzID8KKyAqIC0gaW1wbGVtZW50IHBpY3R1cmUgY29udHJvbHMgKGFsbCBpbXBsZW1lbnRlZD8pCisgKiAtIHVzZSBtYWNyb3MgZm9yIGJvb2xlYW4gdmFsdWVzICg/KQorICogLSBpbXBsZW1lbnQgdXNlciBtb2RlIGJ1ZmZlcnMgYW5kIG92ZXJsYXkgKD8pCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dyYXBwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXNnaS5oPgogCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorCiAjaW5jbHVkZSA8YXNtL3BhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2dpL2lwMjIuaD4KLSNpbmNsdWRlIDxhc20vc2dpL2hwYzMuaD4KICNpbmNsdWRlIDxhc20vc2dpL21jLmg+CiAKICNpbmNsdWRlICJ2aW5vLmgiCisjaW5jbHVkZSAic2FhNzE5MS5oIgorI2luY2x1ZGUgImluZHljYW0uaCIKIAotLyogZGVidWdnaW5nPyAqLwotI2lmIDEKLSNkZWZpbmUgREVCVUcoeC4uLikgICAgIHByaW50ayh4KTsKKy8qIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZ2V0IGxvdHMgYW5kIGxvdHMgb2YgKG1vc3RseSB1c2VsZXNzKQorICogZGVidWcgaW5mby4KKyAqIE5vdGUgdGhhdCB0aGUgZGVidWcgb3V0cHV0IGFsc28gc2xvd3MgZG93biB0aGUgZHJpdmVyIHNpZ25pZmljYW50bHkgKi8KKy8vICNkZWZpbmUgVklOT19ERUJVRworCisjZGVmaW5lIFZJTk9fTU9EVUxFX1ZFUlNJT04gIjAuMC4zIgorI2RlZmluZSBWSU5PX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCAzKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBWSU5PIFZpZGVvNExpbnV4MiBkcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKFZJTk9fTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiTWlrYWVsIE5vdXNpYWluZW4gPHRtbm91c2lhQGNjLmh1dC5maT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBtZW1fbWFwX3Jlc2VydmUocCkgc2V0X2JpdChQR19yZXNlcnZlZCwgJigocCktPmZsYWdzKSkKKyNkZWZpbmUgbWVtX21hcF91bnJlc2VydmUocCkgY2xlYXJfYml0KFBHX3Jlc2VydmVkLCAmKChwKS0+ZmxhZ3MpKQorCisjaWZkZWYgVklOT19ERUJVRworI2RlZmluZSBkcHJpbnRrKHguLi4pIHByaW50aygiVklOTzogIiB4KTsKICNlbHNlCi0jZGVmaW5lIERFQlVHKHguLi4pCisjZGVmaW5lIGRwcmludGsoeC4uLikKICNlbmRpZgogCisjZGVmaW5lIFZJTk9fTk9fQ0hBTk5FTAkJCTAKKyNkZWZpbmUgVklOT19DSEFOTkVMX0EJCQkxCisjZGVmaW5lIFZJTk9fQ0hBTk5FTF9CCQkJMgogCi0vKiBWSU5PIEFTSUMgcmVnaXN0ZXJzICovCi1zdHJ1Y3Qgc2dpX3Zpbm8gKnZpbm87CisjZGVmaW5lIFZJTk9fUEFMX1dJRFRICQkJNzY4CisjZGVmaW5lIFZJTk9fUEFMX0hFSUdIVAkJCTU3NgorI2RlZmluZSBWSU5PX05UU0NfV0lEVEgJCQk2NDAKKyNkZWZpbmUgVklOT19OVFNDX0hFSUdIVAkJNDgwCiAKLXN0YXRpYyBjb25zdCBjaGFyICp2aW5vc3RyID0gIlZJTk8gSW5keUNhbS9UViI7Ci1zdGF0aWMgaW50IHRocmVzaG9sZF9hID0gNTEyOwotc3RhdGljIGludCB0aHJlc2hvbGRfYiA9IDUxMjsKKyNkZWZpbmUgVklOT19NSU5fV0lEVEgJCQkzMgorI2RlZmluZSBWSU5PX01JTl9IRUlHSFQJCQkzMgogCi1zdHJ1Y3Qgdmlub19kZXZpY2UgewotCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKLSNkZWZpbmUgVklOT19DSEFOX0EJCTEKLSNkZWZpbmUgVklOT19DSEFOX0IJCTIKLQlpbnQgY2hhbjsKKyNkZWZpbmUgVklOT19DTElQUElOR19TVEFSVF9PRERfRDEJMQorI2RlZmluZSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9QQUwJMQorI2RlZmluZSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9OVFNDCTEKKworI2RlZmluZSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fRDEJMgorI2RlZmluZSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fUEFMCTIKKyNkZWZpbmUgVklOT19DTElQUElOR19TVEFSVF9FVkVOX05UU0MJMgorCisjZGVmaW5lIFZJTk9fSU5QVVRfQ0hBTk5FTF9DT1VOVAkzCisKKyNkZWZpbmUgVklOT19JTlBVVF9OT05FCQkJLTEKKyNkZWZpbmUgVklOT19JTlBVVF9DT01QT1NJVEUJCTAKKyNkZWZpbmUgVklOT19JTlBVVF9TVklERU8JCTEKKyNkZWZpbmUgVklOT19JTlBVVF9EMQkJCTIKKworI2RlZmluZSBWSU5PX1BBR0VfUkFUSU8JCQkoUEFHRV9TSVpFIC8gVklOT19QQUdFX1NJWkUpCisKKyNkZWZpbmUgVklOT19GSUZPX1RIUkVTSE9MRF9ERUZBVUxUCTUxMgorCisvKiNkZWZpbmUgVklOT19GUkFNRUJVRkZFUl9TSVpFCQkoVklOT19QQUxfV0lEVEggKiBWSU5PX1BBTF9IRUlHSFQgKiA0IFwKKyAgKyAyICogUEFHRV9TSVpFKSovCisjZGVmaW5lIFZJTk9fRlJBTUVCVUZGRVJfU0laRQkJKChWSU5PX1BBTF9XSURUSCBcCisJCQkJCSAgKiBWSU5PX1BBTF9IRUlHSFQgKiA0IFwKKwkJCQkJICArIDMgKiBQQUdFX1NJWkUpICYgfihQQUdFX1NJWkUgLSAxKSkKKworI2RlZmluZSBWSU5PX0ZSQU1FQlVGRkVSX01BWF9DT1VOVAk4CisKKyNkZWZpbmUgVklOT19GUkFNRUJVRkZFUl9VTlVTRUQJCTAKKyNkZWZpbmUgVklOT19GUkFNRUJVRkZFUl9JTl9VU0UJCTEKKyNkZWZpbmUgVklOT19GUkFNRUJVRkZFUl9SRUFEWQkJMgorCisjZGVmaW5lIFZJTk9fUVVFVUVfRVJST1IJCS0xCisjZGVmaW5lIFZJTk9fUVVFVUVfTUFHSUMJCTB4MjAwNTAxMjUKKworI2RlZmluZSBWSU5PX01FTU9SWV9OT05FCQkwCisjZGVmaW5lIFZJTk9fTUVNT1JZX01NQVAJCTEKKyNkZWZpbmUgVklOT19NRU1PUllfVVNFUlBUUgkJMgorCisjZGVmaW5lIFZJTk9fRFVNTVlfREVTQ19DT1VOVAkJNAorI2RlZmluZSBWSU5PX0RFU0NfRkVUQ0hfREVMQVkJCTUJLyogbWljcm9zZWNvbmRzICovCisKKy8qIHRoZSBudW1iZXIgaXMgdGhlIGluZGV4IGZvciB2aW5vX2RhdGFfZm9ybWF0cyAqLworI2RlZmluZSBWSU5PX0RBVEFfRk1UX05PTkUJCS0xCisjZGVmaW5lIFZJTk9fREFUQV9GTVRfR1JFWQkJMAorI2RlZmluZSBWSU5PX0RBVEFfRk1UX1JHQjMzMgkJMQorI2RlZmluZSBWSU5PX0RBVEFfRk1UX1JHQjMyCQkyCisjZGVmaW5lIFZJTk9fREFUQV9GTVRfWVVWCQkzCisvLyNkZWZpbmUgVklOT19EQVRBX0ZNVF9SR0IyNAkJNAorCisjZGVmaW5lIFZJTk9fREFUQV9GTVRfQ09VTlQJCTQKKworI2RlZmluZSBWSU5PX0RBVEFfTk9STV9OT05FCQktMQorI2RlZmluZSBWSU5PX0RBVEFfTk9STV9OVFNDCQkwCisjZGVmaW5lIFZJTk9fREFUQV9OT1JNX1BBTAkJMQorI2RlZmluZSBWSU5PX0RBVEFfTk9STV9TRUNBTQkJMgorI2RlZmluZSBWSU5PX0RBVEFfTk9STV9EMQkJMworLyogVGhlIGZvbGxvd2luZyBpcyBhIHNwZWNpYWwgZW50cnkgdGhhdCBjYW4gYmUgdXNlZCB0bworICogYXV0b2RldGVjdCB0aGUgbm9ybS4gKi8KKyNkZWZpbmUgVklOT19EQVRBX05PUk1fQVVUTwkJMHhmZgorCisjZGVmaW5lIFZJTk9fREFUQV9OT1JNX0NPVU5UCQk0CisKKy8qIEludGVybmFsIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zICovCisKK3N0cnVjdCB2aW5vX2lucHV0IHsKKwljaGFyICpuYW1lOworCXY0bDJfc3RkX2lkIHN0ZDsKK307CisKK3N0cnVjdCB2aW5vX2NsaXBwaW5nIHsKKwl1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOworfTsKKworc3RydWN0IHZpbm9fZGF0YV9mb3JtYXQgeworCS8qIHRoZSBkZXNjcmlwdGlvbiAqLworCWNoYXIgKmRlc2NyaXB0aW9uOworCS8qIGJ5dGVzIHBlciBwaXhlbCAqLworCXVuc2lnbmVkIGludCBicHA7CisJLyogVjRMMiBmb3VyY2MgY29kZSAqLworCV9fdTMyIHBpeGVsZm9ybWF0OworCS8qIFY0TDIgY29sb3JzcGFjZSAoZHVoISkgKi8KKwllbnVtIHY0bDJfY29sb3JzcGFjZSBjb2xvcnNwYWNlOworfTsKKworc3RydWN0IHZpbm9fZGF0YV9ub3JtIHsKKwljaGFyICpkZXNjcmlwdGlvbjsKKwl1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKwlzdHJ1Y3Qgdmlub19jbGlwcGluZyBvZGQ7CisJc3RydWN0IHZpbm9fY2xpcHBpbmcgZXZlbjsKKworCXY0bDJfc3RkX2lkIHN0ZDsKKwl1bnNpZ25lZCBpbnQgZnBzX21pbiwgZnBzX21heDsKKwlfX3UzMiBmcmFtZWxpbmVzOworfTsKKworc3RydWN0IHZpbm9fZGVzY3JpcHRvcl90YWJsZSB7CisJLyogdGhlIG51bWJlciBvZiBQQUdFX1NJWkUgc2l6ZWQgcGFnZXMgaW4gdGhlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBwYWdlX2NvdW50OworCS8qIHZpcnR1YWwgKGttYWxsb2MnZCkgcG9pbnRlcnMgdG8gdGhlIGFjdHVhbCBkYXRhCisJICogKGluIFBBR0VfU0laRSBjaHVua3MsIHVzZWQgd2l0aCBtbWFwIHN0cmVhbWluZykgKi8KKwl1bnNpZ25lZCBsb25nICp2aXJ0dWFsOworCisJLyogY3B1IGFkZHJlc3MgZm9yIHRoZSBWSU5PIGRlc2NyaXB0b3IgdGFibGUKKwkgKiAoY29udGFpbnMgRE1BIGFkZHJlc3NlcywgVklOT19QQUdFX1NJWkUgY2h1bmtzKSAqLworCXVuc2lnbmVkIGxvbmcgKmRtYV9jcHU7CisJLyogZG1hIGFkZHJlc3MgZm9yIHRoZSBWSU5PIGRlc2NyaXB0b3IgdGFibGUKKwkgKiAoY29udGFpbnMgRE1BIGFkZHJlc3NlcywgVklOT19QQUdFX1NJWkUgY2h1bmtzKSAqLworCWRtYV9hZGRyX3QgZG1hOworfTsKKworc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgeworCS8qIGlkZW50aWZpZXIgbnVibWVyICovCisJdW5zaWduZWQgaW50IGlkOworCS8qIHRoZSBsZW5ndGggb2YgdGhlIHdob2xlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIHRoZSBsZW5ndGggb2YgYWN0dWFsIGRhdGEgaW4gYnVmZmVyICovCisJdW5zaWduZWQgaW50IGRhdGFfc2l6ZTsKKwkvKiB0aGUgZGF0YSBmb3JtYXQgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9mb3JtYXQ7CisJLyogdGhlIHN0YXRlIG9mIGJ1ZmZlciBkYXRhICovCisJdW5zaWduZWQgaW50IHN0YXRlOworCS8qIGlzIHRoZSBidWZmZXIgbWFwcGVkIGluIHVzZXIgc3BhY2U/ICovCisJdW5zaWduZWQgaW50IG1hcF9jb3VudDsKKwkvKiBtZW1vcnkgb2Zmc2V0IGZvciBtbWFwKCkgKi8KKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCS8qIGZyYW1lIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgZnJhbWVfY291bnRlcjsKKwkvKiB0aW1lc3RhbXAgKHdyaXR0ZW4gd2hlbiBpbWFnZSBjYXB0dXJlIGZpbmlzaGVzKSAqLworCXN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKKworCXN0cnVjdCB2aW5vX2Rlc2NyaXB0b3JfdGFibGUgZGVzY190YWJsZTsKKworCXNwaW5sb2NrX3Qgc3RhdGVfbG9jazsKK307CisKK3N0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8geworCXVuc2lnbmVkIGludCBsZW5ndGg7CisKKwl1bnNpZ25lZCBpbnQgdXNlZDsKKwl1bnNpZ25lZCBpbnQgaGVhZDsKKwl1bnNpZ25lZCBpbnQgdGFpbDsKKworCXVuc2lnbmVkIGludCBkYXRhW1ZJTk9fRlJBTUVCVUZGRVJfTUFYX0NPVU5UXTsKK307CisKK3N0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBWSU5PX01FTU9SWV9OT05FLCBWSU5PX01FTU9SWV9NTUFQIG9yIFZJTk9fTUVNT1JZX1VTRVJQVFIgKi8KKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisJLyogZGF0YSBmaWVsZCBvZiBpbiBhbmQgb3V0IGNvbnRhaW4gaW5kZXggbnVtYmVycyBmb3IgYnVmZmVyICovCisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyBpbjsKKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvIG91dDsKKworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpidWZmZXJbVklOT19GUkFNRUJVRkZFUl9NQVhfQ09VTlRdOworCisJc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgcXVldWVfc2VtOworCXdhaXRfcXVldWVfaGVhZF90IGZyYW1lX3dhaXRfcXVldWU7Cit9OworCitzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzIHsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworCWludCBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgZGF0YV9mb3JtYXQ7CisJdW5zaWduZWQgaW50IGRhdGFfbm9ybTsKKwlzdHJ1Y3Qgdmlub19jbGlwcGluZyBjbGlwcGluZzsKKwl1bnNpZ25lZCBpbnQgZGVjaW1hdGlvbjsKKwl1bnNpZ25lZCBpbnQgbGluZV9zaXplOworCXVuc2lnbmVkIGludCBhbHBoYTsKKwl1bnNpZ25lZCBpbnQgZnBzOworCXVuc2lnbmVkIGludCBmcmFtZXJ0X3JlZzsKKworCXVuc2lnbmVkIGludCBmaWZvX3RocmVzaG9sZDsKKworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlIGZiX3F1ZXVlOworCisJLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGZpZWxkICovCisJdW5zaWduZWQgaW50IGZpZWxkOworCisJLyogcmVhZCBpbiBwcm9ncmVzcyAqLworCWludCByZWFkaW5nOworCS8qIHN0cmVhbWluZyBpcyBhY3RpdmUgKi8KKwlpbnQgc3RyZWFtaW5nOworCS8qIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgdGhlIHF1ZXVlICovCisJaW50IGNhcHR1cmluZzsKKworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCXNwaW5sb2NrX3QgY2FwdHVyZV9sb2NrOworCisJdW5zaWduZWQgaW50IHVzZXJzOworCisJLyogVjRMIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2NGxfZGV2aWNlOwogfTsKIAogc3RydWN0IHZpbm9fY2xpZW50IHsKKwkvKiB0aGUgY2hhbm5lbCB3aGljaCBvd25zIHRoaXMgY2xpZW50OgorCSAqIFZJTk9fTk9fQ0hBTk5FTCwgVklOT19DSEFOTkVMX0Egb3IgVklOT19DSEFOTkVMX0IgKi8KKwl1bnNpZ25lZCBpbnQgb3duZXI7CiAJc3RydWN0IGkyY19jbGllbnQgKmRyaXZlcjsKLQlpbnQgb3duZXI7CiB9OwogCi1zdHJ1Y3Qgdmlub192aWRlbyB7Ci0Jc3RydWN0IHZpbm9fZGV2aWNlIGNoQTsKLQlzdHJ1Y3Qgdmlub19kZXZpY2UgY2hCOworc3RydWN0IHZpbm9fc2V0dGluZ3MgeworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgYTsKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzIGI7CiAKIAlzdHJ1Y3Qgdmlub19jbGllbnQgZGVjb2RlcjsKIAlzdHJ1Y3Qgdmlub19jbGllbnQgY2FtZXJhOwogCi0Jc3RydWN0IHNlbWFwaG9yZSBpbnB1dF9sb2NrOworCS8qIGEgbG9jayBmb3IgdmlubyByZWdpc3RlciBhY2Nlc3MgKi8KKwlzcGlubG9ja190IHZpbm9fbG9jazsKKwkvKiBhIGxvY2sgZm9yIGNoYW5uZWwgaW5wdXQgY2hhbmdlcyAqLworCXNwaW5sb2NrX3QgaW5wdXRfbG9jazsKIAotCS8qIExvYWRlZCBpbnRvIFZJTk8gZGVzY3JpcHRvcnMgdG8gY2xlYXIgRW5kIE9mIERlc2NyaXB0b3JzIHRhYmxlCi0JICogaW50ZXJ1cHQgY29uZGl0aW9uICovCiAJdW5zaWduZWQgbG9uZyBkdW1teV9wYWdlOwotCXVuc2lnbmVkIGludCBkdW1teV9idWZbNF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCB2aW5vX2Rlc2NyaXB0b3JfdGFibGUgZHVtbXlfZGVzY190YWJsZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgdmlub192aWRlbyAqVmlubzsKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKKy8qCisgKiBVc2luZyB2aW5vX3BpeGVsX2NvbnZlcnNpb24gdGhlIEFSR0IzMi1mb3JtYXQgcGl4ZWxzIHN1cHBsaWVkCisgKiBieSB0aGUgVklOTyBjaGlwIGNhbiBiZSBjb252ZXJ0ZWQgdG8gbW9yZSBjb21tb24gZm9ybWF0cworICogbGlrZSBSR0JBMzIgKG9yIHByb2JhYmx5IFJHQjI0IGluIHRoZSBmdXR1cmUpLiBUaGlzIHdheSB3ZQorICogY2FuIGdpdmUgb3V0IGRhdGEgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGNvcnJlY3RseSB3aXRoCisgKiB0aGUgVjRMMi1kZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgcGl4ZWwgZm9ybWF0IGlzIHNwZWNpZmllZCBhcyBSR0JBMzIgd2hlbiBubyBjb252ZXJzaW9uCisgKiBpcyB1c2VkLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIG9ubHkgYWZmZWN0cyB0aGUgMzItYml0IGJpdCBkZXB0aC4KKyAqCisgKiBVc2Ugbm9uLXplcm8gdmFsdWUgdG8gZW5hYmxlIGNvbnZlcnNpb24uCisgKi8KK3N0YXRpYyBpbnQgdmlub19waXhlbF9jb252ZXJzaW9uID0gMDsKK21vZHVsZV9wYXJhbV9uYW1lZChwaXhlbGNvbnYsIHZpbm9fcGl4ZWxfY29udmVyc2lvbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGl4ZWxjb252LAorCQkgImVuYWJsZSBwaXhlbCBjb252ZXJzaW9uIChub24temVybyB2YWx1ZSBlbmFibGVzKSIpOworCisvKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KKworc3RhdGljIHN0cnVjdCBzZ2lfdmlubyAqdmlubzsKKworc3RhdGljIHN0cnVjdCB2aW5vX3NldHRpbmdzICp2aW5vX2RydmRhdGE7CisKK3N0YXRpYyBjb25zdCBjaGFyICp2aW5vX2RyaXZlcl9uYW1lID0gInZpbm8iOworc3RhdGljIGNvbnN0IGNoYXIgKnZpbm9fZHJpdmVyX2Rlc2NyaXB0aW9uID0gIlNHSSBWSU5PIjsKK3N0YXRpYyBjb25zdCBjaGFyICp2aW5vX2J1c19uYW1lID0gIkdJTzY0IGJ1cyI7CitzdGF0aWMgY29uc3QgY2hhciAqdmlub192NGxfZGV2aWNlX25hbWVfYSA9ICJTR0kgVklOTyBDaGFubmVsIEEiOworc3RhdGljIGNvbnN0IGNoYXIgKnZpbm9fdjRsX2RldmljZV9uYW1lX2IgPSAiU0dJIFZJTk8gQ2hhbm5lbCBCIjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aW5vX2lucHV0IHZpbm9faW5wdXRzW10gPSB7CisJeworCQkubmFtZQkJPSAiQ29tcG9zaXRlIiwKKwkJLnN0ZAkJPSBWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0sCisJfSx7CisJCS5uYW1lCQk9ICJTLVZpZGVvIiwKKwkJLnN0ZAkJPSBWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0sCisJfSx7CisJCS5uYW1lCQk9ICJEMSAoSW5keUNhbSkiLAorCQkuc3RkCQk9IFY0TDJfU1REX05UU0MsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aW5vX2RhdGFfZm9ybWF0IHZpbm9fZGF0YV9mb3JtYXRzW10gPSB7CisJeworCQkuZGVzY3JpcHRpb24JPSAiOC1iaXQgZ3JleXNjYWxlIiwKKwkJLmJwcAkJPSAxLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfR1JFWSwKKwkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNLAorCX0seworCQkuZGVzY3JpcHRpb24JPSAiOC1iaXQgZGl0aGVyZWQgUkdCIDMtMy0yIiwKKwkJLmJwcAkJPSAxLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCMzMyLAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCX0seworCQkuZGVzY3JpcHRpb24JPSAiMzItYml0IFJHQiIsCisJCS5icHAJCT0gNCwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjMyLAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCX0seworCQkuZGVzY3JpcHRpb24JPSAiWVVWIDQ6MjoyIiwKKwkJLmJwcAkJPSA0LAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVVZViwgLy8gWFhYOiBzd2FwcGVkPworCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0sCisJfS8qLHsKKwkJLmRlc2NyaXB0aW9uCT0gIjI0LWJpdCBSR0IiLAorCQkuYnBwCQk9IDMsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9SR0IyNCwKKwkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJfSovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpbm9fZGF0YV9ub3JtIHZpbm9fZGF0YV9ub3Jtc1tdID0geworCXsKKwkJLmRlc2NyaXB0aW9uCT0gIk5UU0MiLAorCQkuc3RkCQk9IFY0TDJfU1REX05UU0MsCisJCS5mcHNfbWluCT0gNiwKKwkJLmZwc19tYXgJPSAzMCwKKwkJLmZyYW1lbGluZXMJPSA1MjUsCisJCS53aWR0aAkJPSBWSU5PX05UU0NfV0lEVEgsCisJCS5oZWlnaHQJCT0gVklOT19OVFNDX0hFSUdIVCwKKwkJLm9kZAkJPSB7CisJCQkudG9wIAk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX05UU0MsCisJCQkubGVmdCAJPSAwLAorCQkJLmJvdHRvbQk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX05UU0MKKwkJCSsgVklOT19OVFNDX0hFSUdIVCAvIDIgLSAxLAorCQkJLnJpZ2h0IAk9IFZJTk9fTlRTQ19XSURUSCwKKwkJfSwKKwkJLmV2ZW4JCT0geworCQkJLnRvcCAJPSBWSU5PX0NMSVBQSU5HX1NUQVJUX0VWRU5fTlRTQywKKwkJCS5sZWZ0IAk9IDAsCisJCQkuYm90dG9tCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX05UU0MKKwkJCSsgVklOT19OVFNDX0hFSUdIVCAvIDIgLSAxLAorCQkJLnJpZ2h0IAk9IFZJTk9fTlRTQ19XSURUSCwKKwkJfSwKKwl9LHsKKwkJLmRlc2NyaXB0aW9uCT0gIlBBTCIsCisJCS5zdGQJCT0gVjRMMl9TVERfUEFMLAorCQkuZnBzX21pbgk9IDUsCisJCS5mcHNfbWF4CT0gMjUsCisJCS5mcmFtZWxpbmVzCT0gNjI1LAorCQkud2lkdGgJCT0gVklOT19QQUxfV0lEVEgsCisJCS5oZWlnaHQJCT0gVklOT19QQUxfSEVJR0hULAorCQkub2RkCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9PRERfUEFMLAorCQkJLmxlZnQgCT0gMCwKKwkJCS5ib3R0b20JPSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9QQUwKKwkJCSsgVklOT19QQUxfSEVJR0hUIC8gMiAtIDEsCisJCQkucmlnaHQgCT0gVklOT19QQUxfV0lEVEgsCisJCX0sCisJCS5ldmVuCQk9IHsKKwkJCS50b3AgCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX1BBTCwKKwkJCS5sZWZ0IAk9IDAsCisJCQkuYm90dG9tCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX1BBTAorCQkJKyBWSU5PX1BBTF9IRUlHSFQgLyAyIC0gMSwKKwkJCS5yaWdodCAJPSBWSU5PX1BBTF9XSURUSCwKKwkJfSwKKwl9LHsKKwkJLmRlc2NyaXB0aW9uCT0gIlNFQ0FNIiwKKwkJLnN0ZAkJPSBWNEwyX1NURF9TRUNBTSwKKwkJLmZwc19taW4JPSA1LAorCQkuZnBzX21heAk9IDI1LAorCQkuZnJhbWVsaW5lcwk9IDYyNSwKKwkJLndpZHRoCQk9IFZJTk9fUEFMX1dJRFRILAorCQkuaGVpZ2h0CQk9IFZJTk9fUEFMX0hFSUdIVCwKKwkJLm9kZAkJPSB7CisJCQkudG9wIAk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX1BBTCwKKwkJCS5sZWZ0IAk9IDAsCisJCQkuYm90dG9tCT0gVklOT19DTElQUElOR19TVEFSVF9PRERfUEFMCisJCQkrIFZJTk9fUEFMX0hFSUdIVCAvIDIgLSAxLAorCQkJLnJpZ2h0IAk9IFZJTk9fUEFMX1dJRFRILAorCQl9LAorCQkuZXZlbgkJPSB7CisJCQkudG9wIAk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfRVZFTl9QQUwsCisJCQkubGVmdCAJPSAwLAorCQkJLmJvdHRvbQk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfRVZFTl9QQUwKKwkJCSsgVklOT19QQUxfSEVJR0hUIC8gMiAtIDEsCisJCQkucmlnaHQgCT0gVklOT19QQUxfV0lEVEgsCisJCX0sCisJfSx7CisJCS5kZXNjcmlwdGlvbgk9ICJOVFNDIChEMSBpbnB1dCkiLAorCQkuc3RkCQk9IFY0TDJfU1REX05UU0MsCisJCS5mcHNfbWluCT0gNiwKKwkJLmZwc19tYXgJPSAzMCwKKwkJLmZyYW1lbGluZXMJPSA1MjUsCisJCS53aWR0aAkJPSBWSU5PX05UU0NfV0lEVEgsCisJCS5oZWlnaHQJCT0gVklOT19OVFNDX0hFSUdIVCwKKwkJLm9kZAkJPSB7CisJCQkudG9wIAk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfT0REX0QxLAorCQkJLmxlZnQgCT0gMCwKKwkJCS5ib3R0b20JPSBWSU5PX0NMSVBQSU5HX1NUQVJUX09ERF9EMQorCQkJKyBWSU5PX05UU0NfSEVJR0hUIC8gMiAtIDEsCisJCQkucmlnaHQgCT0gVklOT19OVFNDX1dJRFRILAorCQl9LAorCQkuZXZlbgkJPSB7CisJCQkudG9wIAk9IFZJTk9fQ0xJUFBJTkdfU1RBUlRfRVZFTl9EMSwKKwkJCS5sZWZ0IAk9IDAsCisJCQkuYm90dG9tCT0gVklOT19DTElQUElOR19TVEFSVF9FVkVOX0QxCisJCQkrIFZJTk9fTlRTQ19IRUlHSFQgLyAyIC0gMSwKKwkJCS5yaWdodCAJPSBWSU5PX05UU0NfV0lEVEgsCisJCX0sCisJfQorfTsKKworI2RlZmluZSBWSU5PX0lORFlDQU1fVjRMMl9DT05UUk9MX0NPVU5UCQk5CisKK3N0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2aW5vX2luZHljYW1fdjRsMl9jb250cm9sc1tdID0geworCXsKKwkJLmlkID0gVjRMMl9DSURfQVVUT0dBSU4sCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiQXV0b21hdGljIEdhaW4gQ29udHJvbCIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9BR0NfREVGQVVMVCwKKwkJLmZsYWdzID0gMCwKKwkJLnJlc2VydmVkID0geyAwLCAwIH0sCisJfSx7CisJCS5pZCA9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJBdXRvbWF0aWMgV2hpdGUgQmFsYW5jZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9BV0JfREVGQVVMVCwKKwkJLmZsYWdzID0gMCwKKwkJLnJlc2VydmVkID0geyAwLCAwIH0sCisJfSx7CisJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiR2FpbiIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9HQUlOX01JTiwKKwkJLm1heGltdW0gPSBJTkRZQ0FNX0dBSU5fTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9HQUlOX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0seworCQkuaWQgPSBWNEwyX0NJRF9QUklWQVRFX0JBU0UsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiUmVkIFNhdHVyYXRpb24iLAorCQkubWluaW11bSA9IElORFlDQU1fUkVEX1NBVFVSQVRJT05fTUlOLAorCQkubWF4aW11bSA9IElORFlDQU1fUkVEX1NBVFVSQVRJT05fTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9SRURfU0FUVVJBVElPTl9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJCbHVlIFNhdHVyYXRpb24iLAorCQkubWluaW11bSA9IElORFlDQU1fQkxVRV9TQVRVUkFUSU9OX01JTiwKKwkJLm1heGltdW0gPSBJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTl9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkRZQ0FNX0JMVUVfU0FUVVJBVElPTl9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiUmVkIEJhbGFuY2UiLAorCQkubWluaW11bSA9IElORFlDQU1fUkVEX0JBTEFOQ0VfTUlOLAorCQkubWF4aW11bSA9IElORFlDQU1fUkVEX0JBTEFOQ0VfTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9SRURfQkFMQU5DRV9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkJsdWUgQmFsYW5jZSIsCisJCS5taW5pbXVtID0gSU5EWUNBTV9CTFVFX0JBTEFOQ0VfTUlOLAorCQkubWF4aW11bSA9IElORFlDQU1fQkxVRV9CQUxBTkNFX01BWCwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IElORFlDQU1fQkxVRV9CQUxBTkNFX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0seworCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJTaHV0dGVyIENvbnRyb2wiLAorCQkubWluaW11bSA9IElORFlDQU1fU0hVVFRFUl9NSU4sCisJCS5tYXhpbXVtID0gSU5EWUNBTV9TSFVUVEVSX01BWCwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IElORFlDQU1fU0hVVFRFUl9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9LHsKKwkJLmlkID0gVjRMMl9DSURfR0FNTUEsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiR2FtbWEiLAorCQkubWluaW11bSA9IElORFlDQU1fR0FNTUFfTUlOLAorCQkubWF4aW11bSA9IElORFlDQU1fR0FNTUFfTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gSU5EWUNBTV9HQU1NQV9ERUZBVUxULAorCQkuZmxhZ3MgPSAwLAorCQkucmVzZXJ2ZWQgPSB7IDAsIDAgfSwKKwl9Cit9OworCisjZGVmaW5lIFZJTk9fU0FBNzE5MV9WNEwyX0NPTlRST0xfQ09VTlQJCTIKKworc3RydWN0IHY0bDJfcXVlcnljdHJsIHZpbm9fc2FhNzE5MV92NGwyX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWQgPSBWNEwyX0NJRF9IVUUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiSHVlIiwKKwkJLm1pbmltdW0gPSBTQUE3MTkxX0hVRV9NSU4sCisJCS5tYXhpbXVtID0gU0FBNzE5MV9IVUVfTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gU0FBNzE5MV9IVUVfREVGQVVMVCwKKwkJLmZsYWdzID0gMCwKKwkJLnJlc2VydmVkID0geyAwLCAwIH0sCisJfSx7CisJCS5pZCA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJWVFIgVGltZSBDb25zdGFudCIsCisJCS5taW5pbXVtID0gU0FBNzE5MV9WVFJDX01JTiwKKwkJLm1heGltdW0gPSBTQUE3MTkxX1ZUUkNfTUFYLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gU0FBNzE5MV9WVFJDX0RFRkFVTFQsCisJCS5mbGFncyA9IDAsCisJCS5yZXNlcnZlZCA9IHsgMCwgMCB9LAorCX0KK307CisKKy8qIFZJTk8gSTJDIGJ1cyBmdW5jdGlvbnMgKi8KIAogdW5zaWduZWQgaTJjX3Zpbm9fZ2V0Y3RybCh2b2lkICpkYXRhKQogewpAQCAtMTEyLDQ5ICs2MzgsNDkgQEAKICAqLwogc3RhdGljIGludCBpMmNfdmlub19jbGllbnRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaW50IHJlcyA9IDA7CisJaW50IHJldCA9IDA7CiAKLQlkb3duKCZWaW5vLT5pbnB1dF9sb2NrKTsKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CiAJc3dpdGNoIChjbGllbnQtPmRyaXZlci0+aWQpIHsKIAljYXNlIEkyQ19EUklWRVJJRF9TQUE3MTkxOgotCQlpZiAoVmluby0+ZGVjb2Rlci5kcml2ZXIpCi0JCQlyZXMgPSAtRUJVU1k7CisJCWlmICh2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyKQorCQkJcmV0ID0gLUVCVVNZOwogCQllbHNlCi0JCQlWaW5vLT5kZWNvZGVyLmRyaXZlciA9IGNsaWVudDsKKwkJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIgPSBjbGllbnQ7CiAJCWJyZWFrOwogCWNhc2UgSTJDX0RSSVZFUklEX0lORFlDQU06Ci0JCWlmIChWaW5vLT5jYW1lcmEuZHJpdmVyKQotCQkJcmVzID0gLUVCVVNZOworCQlpZiAodmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyKQorCQkJcmV0ID0gLUVCVVNZOwogCQllbHNlCi0JCQlWaW5vLT5jYW1lcmEuZHJpdmVyID0gY2xpZW50OworCQkJdmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyID0gY2xpZW50OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXMgPSAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOwogCX0KLQl1cCgmVmluby0+aW5wdXRfbG9jayk7CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaTJjX3Zpbm9fY2xpZW50X3VucmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaW50IHJlcyA9IDA7CisJaW50IHJldCA9IDA7CiAKLQlkb3duKCZWaW5vLT5pbnB1dF9sb2NrKTsKLQlpZiAoY2xpZW50ID09IFZpbm8tPmRlY29kZXIuZHJpdmVyKSB7Ci0JCWlmIChWaW5vLT5kZWNvZGVyLm93bmVyKQotCQkJcmVzID0gLUVCVVNZOworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwlpZiAoY2xpZW50ID09IHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpIHsKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciAhPSBWSU5PX05PX0NIQU5ORUwpCisJCQlyZXQgPSAtRUJVU1k7CiAJCWVsc2UKLQkJCVZpbm8tPmRlY29kZXIuZHJpdmVyID0gTlVMTDsKLQl9IGVsc2UgaWYgKGNsaWVudCA9PSBWaW5vLT5jYW1lcmEuZHJpdmVyKSB7Ci0JCWlmIChWaW5vLT5jYW1lcmEub3duZXIpCi0JCQlyZXMgPSAtRUJVU1k7CisJCQl2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyID0gTlVMTDsKKwl9IGVsc2UgaWYgKGNsaWVudCA9PSB2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpIHsKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyICE9IFZJTk9fTk9fQ0hBTk5FTCkKKwkJCXJldCA9IC1FQlVTWTsKIAkJZWxzZQotCQkJVmluby0+Y2FtZXJhLmRyaXZlciA9IE5VTEw7CisJCQl2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIgPSBOVUxMOwogCX0KLQl1cCgmVmluby0+aW5wdXRfbG9jayk7CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgdmlub19pMmNfYWRhcHRlciA9CkBAIC0xNzYsMTcyICs3MDIsMzU5MSBAQAogCXJldHVybiBpMmNfc2dpX2RlbF9idXMoJnZpbm9faTJjX2FkYXB0ZXIpOwogfQogCi0KLXN0YXRpYyB2b2lkIHZpbm9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IGkyY19jYW1lcmFfY29tbWFuZCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CisJcmV0dXJuIHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlci0+CisJCWRyaXZlci0+Y29tbWFuZCh2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIsCisJCQkJY21kLCBhcmcpOwogfQogCi1zdGF0aWMgaW50IHZpbm9fb3BlbihzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIGludCBmbGFncykKK3N0YXRpYyBpbnQgaTJjX2RlY29kZXJfY29tbWFuZCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHZpbm9fZGV2aWNlICp2aWRldiA9IChzdHJ1Y3Qgdmlub19kZXZpY2UgKilkZXY7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlci0+CisJCWRyaXZlci0+Y29tbWFuZCh2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyLAorCQkJCWNtZCwgYXJnKTsKIH0KIAotc3RhdGljIHZvaWQgdmlub19jbG9zZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYpCisvKiBWSU5PIGZyYW1lYnVmZmVyL0RNQSBkZXNjcmlwdG9yIG1hbmFnZW1lbnQgKi8KKworc3RhdGljIHZvaWQgdmlub19mcmVlX2J1ZmZlcl93aXRoX2NvdW50KHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKIHsKLQlzdHJ1Y3Qgdmlub19kZXZpY2UgKnZpZGV2ID0gKHN0cnVjdCB2aW5vX2RldmljZSAqKWRldjsKLX0KKwl1bnNpZ25lZCBpbnQgaTsKIAotc3RhdGljIGludCB2aW5vX21tYXAoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICphZHIsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB2aW5vX2RldmljZSAqdmlkZXYgPSAoc3RydWN0IHZpbm9fZGV2aWNlICopZGV2OworCWRwcmludGsoInZpbm9fZnJlZV9idWZmZXJfd2l0aF9jb3VudCgpOiBjb3VudCA9ICVkXG4iLCBjb3VudCk7CiAKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCB2aW5vX2lvY3RsKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB2aW5vX2RldmljZSAqdmlkZXYgPSAoc3RydWN0IHZpbm9fZGV2aWNlICopZGV2OwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpbm9fZGV2aWNlID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkudHlwZQkJPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU1VCQ0FQVFVSRSwKLQkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfVklOTywKLQkubmFtZQkJPSAiVklOTyIsCi0JLm9wZW4JCT0gdmlub19vcGVuLAotCS5jbG9zZQkJPSB2aW5vX2Nsb3NlLAotCS5pb2N0bAkJPSB2aW5vX2lvY3RsLAotCS5tbWFwCQk9IHZpbm9fbW1hcCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZpbm9faW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcmV2OwotCWludCBpLCByZXQgPSAwOwotCi0JLyogVklOTyBpcyBJbmR5IHNwZWNpZmljIGJlYXN0ICovCi0JaWYgKGlwMjJfaXNfZnVsbGhvdXNlKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyoKLQkgKiBWSU5PIGlzIGluIHRoZSBFSVNBIGFkZHJlc3Mgc3BhY2UsIHNvIHRoZSBzeXNpZCByZWdpc3RlciB3aWxsIHRlbGwKLQkgKiB1cyBpZiB0aGUgRUlTQV9QUkVTRU5UIHBpbiBvbiBNQyBoYXMgYmVlbiBwdWxsZWQgbG93LgotCSAqCi0JICogSWYgRUlTQV9QUkVTRU5UIGlzIG5vdCBzZXQgd2UgZGVmaW5pdGVseSBkb24ndCBoYXZlIGEgVklOTyBlcXVpcGVkCi0JICogc3lzdGVtLgotCSAqLwotCWlmICghKHNnaW1jLT5zeXN0ZW1pZCAmIFNHSU1DX1NZU0lEX0VQUkVTRU5UKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gbm90IGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJbWVtX21hcF91bnJlc2VydmUodmlydF90b19wYWdlKGZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0pKTsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLAorCQkJCSBmYi0+ZGVzY190YWJsZS5kbWFfY3B1W1ZJTk9fUEFHRV9SQVRJTyAqIGldLAorCQkJCSBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWZyZWVfcGFnZShmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKTsKIAl9CiAKLQl2aW5vID0gKHN0cnVjdCBzZ2lfdmlubyAqKWlvcmVtYXAoVklOT19CQVNFLCBzaXplb2Yoc3RydWN0IHNnaV92aW5vKSk7Ci0JaWYgKCF2aW5vKQotCQlyZXR1cm4gLUVJTzsKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLAorCQkJICBWSU5PX1BBR0VfUkFUSU8gKiAoZmItPmRlc2NfdGFibGUucGFnZV9jb3VudCArIDQpICoKKwkJCSAgc2l6ZW9mKGRtYV9hZGRyX3QpLCAodm9pZCAqKWZiLT5kZXNjX3RhYmxlLmRtYV9jcHUsCisJCQkgIGZiLT5kZXNjX3RhYmxlLmRtYSk7CisJa2ZyZWUoZmItPmRlc2NfdGFibGUudmlydHVhbCk7CiAKLQkvKiBPa2F5LCBvbmNlIHdlIGtub3cgdGhhdCBWSU5PIGlzIHByZXNlbnQgd2UnbGwgcmVhZCBpdHMgcmV2aXNpb24KLQkgKiBzYWZlIHdheS4gT25lIG5ldmVyIGtub3dzLi4uICovCi0JaWYgKGdldF9kYmUocmV2LCAmKHZpbm8tPnJldl9pZCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVklOTzogZmFpbGVkIHRvIHJlYWQgcmV2aXNpb24gcmVnaXN0ZXJcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0JaWYgKFZJTk9fSURfVkFMVUUocmV2KSAhPSBWSU5PX0NISVBfSUQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWSU5PIGlzIG5vdCBWSU5PIChSZXYvSUQ6IDB4JTA0bHgpXG4iLCByZXYpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVklOTyBSZXY6IDB4JTAybHhcbiIsIFZJTk9fUkVWX05VTShyZXYpKTsKKwltZW1zZXQoZmIsIDAsIHNpemVvZihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcikpOworfQogCi0JVmlubyA9IChzdHJ1Y3Qgdmlub192aWRlbyAqKQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdmlub192aWRlbyksIEdGUF9LRVJORUwpOwotCWlmICghVmlubykgeworc3RhdGljIHZvaWQgdmlub19mcmVlX2J1ZmZlcihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIpCit7CisJdmlub19mcmVlX2J1ZmZlcl93aXRoX2NvdW50KGZiLCBmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50KTsKK30KKworc3RhdGljIGludCB2aW5vX2FsbG9jYXRlX2J1ZmZlcihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIsCisJCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGNvdW50LCBpLCBqOworCWludCByZXQgPSAwOworCisJZHByaW50aygidmlub19hbGxvY2F0ZV9idWZmZXIoKTpcbiIpOworCisJaWYgKHNpemUgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChmYiwgMCwgc2l6ZW9mKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyKSk7CisKKwljb3VudCA9ICgoc2l6ZSAvIFBBR0VfU0laRSkgKyA0KSAmIH4zOworCisJZHByaW50aygidmlub19hbGxvY2F0ZV9idWZmZXIoKTogc2l6ZSA9ICVkLCBjb3VudCA9ICVkXG4iLAorCQlzaXplLCBjb3VudCk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhYmxlIHdpdGggdmlydHVhbCAocGFnZSkgYWRkcmVzc2VzICovCisJZmItPmRlc2NfdGFibGUudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nICopCisJCWttYWxsb2MoY291bnQgKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCWlmICghZmItPmRlc2NfdGFibGUudmlydHVhbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhYmxlIHdpdGggZG1hIGFkZHJlc3NlcworCSAqIChoYXMgc3BhY2UgZm9yIGZvdXIgZXh0cmEgZGVzY3JpcHRvcnMpICovCisJZmItPmRlc2NfdGFibGUuZG1hX2NwdSA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBWSU5PX1BBR0VfUkFUSU8gKiAoY291bnQgKyA0KSAqCisJCQkJICAgc2l6ZW9mKGRtYV9hZGRyX3QpLCAmZmItPmRlc2NfdGFibGUuZG1hLAorCQkJCSAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWZiLT5kZXNjX3RhYmxlLmRtYV9jcHUpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfdW5tYXA7CisJCWdvdG8gb3V0X2ZyZWVfdmlydHVhbDsKIAl9CiAKLQlWaW5vLT5kdW1teV9wYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoIVZpbm8tPmR1bW15X3BhZ2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZV92aW5vOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQlWaW5vLT5kdW1teV9idWZbaV0gPSBQSFlTQUREUihWaW5vLT5kdW1teV9wYWdlKTsKKwkvKiBhbGxvY2F0ZSBwYWdlcyBmb3IgdGhlIGJ1ZmZlciBhbmQgYWNxdWlyZSB0aGUgYWNjb3JkaW5nCisJICogZG1hIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRtYV9hZGRyX3QgZG1hX2RhdGFfYWRkcjsKIAotCXZpbm8tPmNvbnRyb2wgPSAwOwotCS8qIHByZXZlbnQgVklOTyBmcm9tIHRocm93aW5nIHNwdXJpb3VzIGludGVycnVwdHMgKi8KLQl2aW5vLT5hLm5leHRfNF9kZXNjID0gUEhZU0FERFIoVmluby0+ZHVtbXlfYnVmKTsKLQl2aW5vLT5iLm5leHRfNF9kZXNjID0gUEhZU0FERFIoVmluby0+ZHVtbXlfYnVmKTsKLQl1ZGVsYXkoNSk7Ci0Jdmluby0+aW50cl9zdGF0dXMgPSAwOwotICAgICAgICAvKiBzZXQgdGhyZXNob2xkIGxldmVsICovCi0gICAgICAgIHZpbm8tPmEuZmlmb190aHJlcyA9IHRocmVzaG9sZF9hOwotCXZpbm8tPmIuZmlmb190aHJlcyA9IHRocmVzaG9sZF9iOworCQlmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldID0KKwkJCWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJCWlmICghZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkgeworCQkJcmV0ID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQogCi0JaW5pdF9NVVRFWCgmVmluby0+aW5wdXRfbG9jayk7CisJCWRtYV9kYXRhX2FkZHIgPQorCQkJZG1hX21hcF9zaW5nbGUoTlVMTCwKKwkJCQkgICAgICAgKHZvaWQgKilmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldLAorCQkJCSAgICAgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAKLQlpZiAocmVxdWVzdF9pcnEoU0dJX1ZJTk9fSVJRLCB2aW5vX2ludGVycnVwdCwgMCwgdmlub3N0ciwgTlVMTCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiBpcnElMDJkIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCi0JCSAgICAgICBTR0lfVklOT19JUlEpOwotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dF9mcmVlX3BhZ2U7CisJCWZvciAoaiA9IDA7IGogPCBWSU5PX1BBR0VfUkFUSU87IGorKykgeworCQkJZmItPmRlc2NfdGFibGUuZG1hX2NwdVtWSU5PX1BBR0VfUkFUSU8gKiBpICsgal0gPQorCQkJCWRtYV9kYXRhX2FkZHIgKyBWSU5PX1BBR0VfU0laRSAqIGo7CisJCX0KKworCQltZW1fbWFwX3Jlc2VydmUodmlydF90b19wYWdlKGZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0pKTsKIAl9CiAKLQlyZXQgPSB2aW5vX2kyY19hZGRfYnVzKCk7CisJLyogcGFnZV9jb3VudCBuZWVkcyB0byBiZSBzZXQgYW55d2F5LCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIHRhYmxlIGhhcworCSAqIGJlZW4gYWxsb2NhdGVkIGFjY29yZGluZyB0byB0aGlzIG51bWJlciAqLworCWZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQgPSBjb3VudDsKKwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiBJMkMgYnVzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9mcmVlX2lycTsKKwkJLyogdGhlIGRlc2NyaXB0b3Igd2l0aCBpbmRleCBpIGRvZXNuJ3QgY29udGFpbgorCQkgKiBhIHZhbGlkIGFkZHJlc3MgeWV0ICovCisJCXZpbm9fZnJlZV9idWZmZXJfd2l0aF9jb3VudChmYiwgaSk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hBLnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKSA8IDApIHsKLQkJcHJpbnRrKCIlcywgY2hubCAlZDogZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuXG4iLAotCQkJVmluby0+Y2hBLnZkZXYubmFtZSwgVmluby0+Y2hBLmNoYW4pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9pMmNfZGVsX2J1czsKKwkvL2ZiLT5zaXplID0gc2l6ZTsKKwlmYi0+c2l6ZSA9IGNvdW50ICogUEFHRV9TSVpFOworCWZiLT5kYXRhX2Zvcm1hdCA9IFZJTk9fREFUQV9GTVRfTk9ORTsKKworCS8qIHNldCB0aGUgZG1hIHN0b3AtYml0IGZvciB0aGUgbGFzdCAoY291bnQrMSl0aCBkZXNjcmlwdG9yICovCisJZmItPmRlc2NfdGFibGUuZG1hX2NwdVtWSU5PX1BBR0VfUkFUSU8gKiBjb3VudF0gPSBWSU5PX0RFU0NfU1RPUDsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX3ZpcnR1YWw6CisJa2ZyZWUoZmItPmRlc2NfdGFibGUudmlydHVhbCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKKy8qIHVzZXIgYnVmZmVycyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgeWV0ICovCitzdGF0aWMgaW50IHZpbm9fcHJlcGFyZV91c2VyX2J1ZmZlcihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgICB2b2lkICp1c2VyLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGNvdW50LCBpLCBqOworCWludCByZXQgPSAwOworCisJZHByaW50aygidmlub19wcmVwYXJlX3VzZXJfYnVmZmVyKCk6XG4iKTsKKworCWlmIChzaXplIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoZmIsIDAsIHNpemVvZihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcikpOworCisJY291bnQgPSAoKHNpemUgLyBQQUdFX1NJWkUpKSAmIH4zOworCisJZHByaW50aygidmlub19wcmVwYXJlX3VzZXJfYnVmZmVyKCk6IHNpemUgPSAlZCwgY291bnQgPSAlZFxuIiwKKwkJc2l6ZSwgY291bnQpOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0YWJsZSB3aXRoIHZpcnR1YWwgKHBhZ2UpIGFkZHJlc3NlcyAqLworCWZiLT5kZXNjX3RhYmxlLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZyAqKQorCQlrbWFsbG9jKGNvdW50ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZiLT5kZXNjX3RhYmxlLnZpcnR1YWwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0YWJsZSB3aXRoIGRtYSBhZGRyZXNzZXMKKwkgKiAoaGFzIHNwYWNlIGZvciBmb3VyIGV4dHJhIGRlc2NyaXB0b3JzKSAqLworCWZiLT5kZXNjX3RhYmxlLmRtYV9jcHUgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgVklOT19QQUdFX1JBVElPICogKGNvdW50ICsgNCkgKgorCQkJCSAgIHNpemVvZihkbWFfYWRkcl90KSwgJmZiLT5kZXNjX3RhYmxlLmRtYSwKKwkJCQkgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFmYi0+ZGVzY190YWJsZS5kbWFfY3B1KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfdmlydHVhbDsKIAl9Ci0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hCLnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKSA8IDApIHsKLQkJcHJpbnRrKCIlcywgY2hubCAlZDogZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuXG4iLAotCQkJVmluby0+Y2hCLnZkZXYubmFtZSwgVmluby0+Y2hCLmNoYW4pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyX3ZkZXY7CisKKwkvKiBhbGxvY2F0ZSBwYWdlcyBmb3IgdGhlIGJ1ZmZlciBhbmQgYWNxdWlyZSB0aGUgYWNjb3JkaW5nCisJICogZG1hIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRtYV9hZGRyX3QgZG1hX2RhdGFfYWRkcjsKKworCQlmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldID0KKwkJCWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJCWlmICghZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkgeworCQkJcmV0ID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCisJCWRtYV9kYXRhX2FkZHIgPQorCQkJZG1hX21hcF9zaW5nbGUoTlVMTCwKKwkJCQkgICAgICAgKHZvaWQgKilmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldLAorCQkJCSAgICAgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisKKwkJZm9yIChqID0gMDsgaiA8IFZJTk9fUEFHRV9SQVRJTzsgaisrKSB7CisJCQlmYi0+ZGVzY190YWJsZS5kbWFfY3B1W1ZJTk9fUEFHRV9SQVRJTyAqIGkgKyBqXSA9CisJCQkJZG1hX2RhdGFfYWRkciArIFZJTk9fUEFHRV9TSVpFICogajsKKwkJfQorCisJCW1lbV9tYXBfcmVzZXJ2ZSh2aXJ0X3RvX3BhZ2UoZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkpOworCX0KKworCS8qIHBhZ2VfY291bnQgbmVlZHMgdG8gYmUgc2V0IGFueXdheSwgYmVjYXVzZSB0aGUgZGVzY3JpcHRvciB0YWJsZSBoYXMKKwkgKiBiZWVuIGFsbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhpcyBudW1iZXIgKi8KKwlmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50ID0gY291bnQ7CisKKwlpZiAocmV0KSB7CisJCS8qIHRoZSBkZXNjcmlwdG9yIHdpdGggaW5kZXggaSBkb2Vzbid0IGNvbnRhaW4KKwkJICogYSB2YWxpZCBhZGRyZXNzIHlldCAqLworCQl2aW5vX2ZyZWVfYnVmZmVyX3dpdGhfY291bnQoZmIsIGkpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8vZmItPnNpemUgPSBzaXplOworCWZiLT5zaXplID0gY291bnQgKiBQQUdFX1NJWkU7CisKKwkvKiBzZXQgdGhlIGRtYSBzdG9wLWJpdCBmb3IgdGhlIGxhc3QgKGNvdW50KzEpdGggZGVzY3JpcHRvciAqLworCWZiLT5kZXNjX3RhYmxlLmRtYV9jcHVbVklOT19QQUdFX1JBVElPICogY291bnRdID0gVklOT19ERVNDX1NUT1A7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV92aXJ0dWFsOgorCWtmcmVlKGZiLT5kZXNjX3RhYmxlLnZpcnR1YWwpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdmlub19zeW5jX2J1ZmZlcihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIpCit7CisJaW50IGk7CisKKwlkcHJpbnRrKCJ2aW5vX3N5bmNfYnVmZmVyKCk6XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50OyBpKyspCisJCWRtYV9zeW5jX3NpbmdsZShOVUxMLAorCQkJCWZiLT5kZXNjX3RhYmxlLmRtYV9jcHVbVklOT19QQUdFX1JBVElPICogaV0sCisJCQkJUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworfQorCisvKiBGcmFtZWJ1ZmZlciBmaWZvIGZ1bmN0aW9ucyAobmVlZCB0byBiZSBsb2NrZWQgZXh0ZXJuYWxseSkgKi8KKworc3RhdGljIHZvaWQgdmlub19maWZvX2luaXQoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyAqZiwKKwkJCSAgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJZi0+bGVuZ3RoID0gMDsKKwlmLT51c2VkID0gMDsKKwlmLT5oZWFkID0gMDsKKwlmLT50YWlsID0gMDsKKworCWlmIChsZW5ndGggPiBWSU5PX0ZSQU1FQlVGRkVSX01BWF9DT1VOVCkKKwkJbGVuZ3RoID0gVklOT19GUkFNRUJVRkZFUl9NQVhfQ09VTlQ7CisKKwlmLT5sZW5ndGggPSBsZW5ndGg7Cit9CisKKy8qIHJldHVybnMgdHJ1ZS9mYWxzZSAqLworc3RhdGljIGludCB2aW5vX2ZpZm9faGFzX2lkKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8gKmYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSBmLT5oZWFkOyBpID09IChmLT50YWlsIC0gMSk7IGkgPSAoaSArIDEpICUgZi0+bGVuZ3RoKSB7CisJCWlmIChmLT5kYXRhW2ldID09IGlkKQorCQkJcmV0dXJuIDE7CiAJfQogCiAJcmV0dXJuIDA7Cit9CiAKLW91dF91bnJlZ2lzdGVyX3ZkZXY6Ci0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJlZpbm8tPmNoQS52ZGV2KTsKLW91dF9pMmNfZGVsX2J1czoKLQl2aW5vX2kyY19kZWxfYnVzKCk7Ci1vdXRfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoU0dJX1ZJTk9fSVJRLCBOVUxMKTsKLW91dF9mcmVlX3BhZ2U6Ci0JZnJlZV9wYWdlKFZpbm8tPmR1bW15X3BhZ2UpOwotb3V0X2ZyZWVfdmlubzoKLQlrZnJlZShWaW5vKTsKLW91dF91bm1hcDoKLQlpb3VubWFwKHZpbm8pOworLyogcmV0dXJucyB0cnVlL2ZhbHNlICovCitzdGF0aWMgaW50IHZpbm9fZmlmb19mdWxsKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8gKmYpCit7CisJcmV0dXJuIChmLT51c2VkID09IGYtPmxlbmd0aCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlub19maWZvX2dldF91c2VkKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8gKmYpCit7CisJcmV0dXJuIGYtPnVzZWQ7Cit9CisKK3N0YXRpYyBpbnQgdmlub19maWZvX2VucXVldWUoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbyAqZiwgdW5zaWduZWQgaW50IGlkKQoreworCWlmIChpZCA+PSBmLT5sZW5ndGgpIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJaWYgKHZpbm9fZmlmb19oYXNfaWQoZiwgaWQpKSB7CisJCXJldHVybiBWSU5PX1FVRVVFX0VSUk9SOworCX0KKworCWlmIChmLT51c2VkIDwgZi0+bGVuZ3RoKSB7CisJCWYtPmRhdGFbZi0+dGFpbF0gPSBpZDsKKwkJZi0+dGFpbCA9IChmLT50YWlsICsgMSkgJSBmLT5sZW5ndGg7CisJCWYtPnVzZWQrKzsKKwl9IGVsc2UgeworCQlyZXR1cm4gVklOT19RVUVVRV9FUlJPUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX2ZpZm9fcGVlayhzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9maWZvICpmLCB1bnNpZ25lZCBpbnQgKmlkKQoreworCWlmIChmLT51c2VkID4gMCkgeworCQkqaWQgPSBmLT5kYXRhW2YtPmhlYWRdOworCX0gZWxzZSB7CisJCXJldHVybiBWSU5PX1FVRVVFX0VSUk9SOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fZmlmb19kZXF1ZXVlKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX2ZpZm8gKmYsIHVuc2lnbmVkIGludCAqaWQpCit7CisJaWYgKGYtPnVzZWQgPiAwKSB7CisJCSppZCA9IGYtPmRhdGFbZi0+aGVhZF07CisJCWYtPmhlYWQgPSAoZi0+aGVhZCArIDEpICUgZi0+bGVuZ3RoOworCQlmLT51c2VkLS07CisJfSBlbHNlIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEZyYW1lYnVmZmVyIHF1ZXVlIGZ1bmN0aW9ucyAqLworCisvKiBleGVjdXRlIHdpdGggcXVldWVfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fcXVldWVfZnJlZV93aXRoX2NvdW50KHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBpOworCisJcS0+bGVuZ3RoID0gMDsKKwltZW1zZXQoJnEtPmluLCAwLCBzaXplb2Yoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbykpOworCW1lbXNldCgmcS0+b3V0LCAwLCBzaXplb2Yoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfZmlmbykpOworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2ZyZWVfd2l0aF9jb3VudCgpOiBmcmVlaW5nIGJ1ZmZlciAlZFxuIiwKKwkJCWkpOworCQl2aW5vX2ZyZWVfYnVmZmVyKHEtPmJ1ZmZlcltpXSk7CisJCWtmcmVlKHEtPmJ1ZmZlcltpXSk7CisJfQorCisJcS0+dHlwZSA9IFZJTk9fTUVNT1JZX05PTkU7CisJcS0+bWFnaWMgPSAwOworfQorCitzdGF0aWMgdm9pZCB2aW5vX3F1ZXVlX2ZyZWUoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEpCit7CisJZHByaW50aygidmlub19xdWV1ZV9mcmVlKCk6XG4iKTsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKQorCQlyZXR1cm47CisJaWYgKHEtPnR5cGUgIT0gVklOT19NRU1PUllfTU1BUCkKKwkJcmV0dXJuOworCisJZG93bigmcS0+cXVldWVfc2VtKTsKKworCXZpbm9fcXVldWVfZnJlZV93aXRoX2NvdW50KHEsIHEtPmxlbmd0aCk7CisKKwl1cCgmcS0+cXVldWVfc2VtKTsKK30KKworc3RhdGljIGludCB2aW5vX3F1ZXVlX2luaXQoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkgICB1bnNpZ25lZCBpbnQgKmxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoInZpbm9fcXVldWVfaW5pdCgpOiBsZW5ndGggPSAlZFxuIiwgKmxlbmd0aCk7CisKKwlpZiAocS0+bWFnaWMgPT0gVklOT19RVUVVRV9NQUdJQykgeworCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2luaXQoKTogcXVldWUgYWxyZWFkeSBpbml0aWFsaXplZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocS0+dHlwZSAhPSBWSU5PX01FTU9SWV9OT05FKSB7CisJCWRwcmludGsoInZpbm9fcXVldWVfaW5pdCgpOiBxdWV1ZSBhbHJlYWR5IGluaXRpYWxpemVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqbGVuZ3RoIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZxLT5xdWV1ZV9zZW0pOworCisJaWYgKCpsZW5ndGggPiBWSU5PX0ZSQU1FQlVGRkVSX01BWF9DT1VOVCkKKwkJKmxlbmd0aCA9IFZJTk9fRlJBTUVCVUZGRVJfTUFYX0NPVU5UOworCisJcS0+bGVuZ3RoID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoOyBpKyspIHsKKwkJZHByaW50aygidmlub19xdWV1ZV9pbml0KCk6IGFsbG9jYXRpbmcgYnVmZmVyICVkXG4iLCBpKTsKKwkJcS0+YnVmZmVyW2ldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpbm9fZnJhbWVidWZmZXIpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFxLT5idWZmZXJbaV0pIHsKKwkJCWRwcmludGsoInZpbm9fcXVldWVfaW5pdCgpOiBrbWFsbG9jKCkgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IHZpbm9fYWxsb2NhdGVfYnVmZmVyKHEtPmJ1ZmZlcltpXSwKKwkJCQkJICAgVklOT19GUkFNRUJVRkZFUl9TSVpFKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocS0+YnVmZmVyW2ldKTsKKwkJCWRwcmludGsoInZpbm9fcXVldWVfaW5pdCgpOiAiCisJCQkJInZpbm9fYWxsb2NhdGVfYnVmZmVyKCkgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcS0+YnVmZmVyW2ldLT5pZCA9IGk7CisJCWlmIChpID4gMCkgeworCQkJcS0+YnVmZmVyW2ldLT5vZmZzZXQgPSBxLT5idWZmZXJbaSAtIDFdLT5vZmZzZXQgKworCQkJCXEtPmJ1ZmZlcltpIC0gMV0tPnNpemU7CisJCX0gZWxzZSB7CisJCQlxLT5idWZmZXJbaV0tPm9mZnNldCA9IDA7CisJCX0KKworCQlzcGluX2xvY2tfaW5pdCgmcS0+YnVmZmVyW2ldLT5zdGF0ZV9sb2NrKTsKKworCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2luaXQoKTogYnVmZmVyID0gJWQsIG9mZnNldCA9ICVkLCAiCisJCQkic2l6ZSA9ICVkXG4iLCBpLCBxLT5idWZmZXJbaV0tPm9mZnNldCwKKwkJCXEtPmJ1ZmZlcltpXS0+c2l6ZSk7CisJfQorCisJaWYgKHJldCkgeworCQl2aW5vX3F1ZXVlX2ZyZWVfd2l0aF9jb3VudChxLCBpKTsKKwkJKmxlbmd0aCA9IDA7CisJfSBlbHNlIHsKKwkJcS0+bGVuZ3RoID0gKmxlbmd0aDsKKwkJdmlub19maWZvX2luaXQoJnEtPmluLCBxLT5sZW5ndGgpOworCQl2aW5vX2ZpZm9faW5pdCgmcS0+b3V0LCBxLT5sZW5ndGgpOworCQlxLT50eXBlID0gVklOT19NRU1PUllfTU1BUDsKKwkJcS0+bWFnaWMgPSBWSU5PX1FVRVVFX01BR0lDOworCX0KKworCXVwKCZxLT5xdWV1ZV9zZW0pOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHZpbm9fZXhpdCh2b2lkKQorc3RhdGljIHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICp2aW5vX3F1ZXVlX2FkZChzdHJ1Y3QKKwkJCQkJICAgICAgIHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJlZpbm8tPmNoQS52ZGV2KTsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmVmluby0+Y2hCLnZkZXYpOwotCXZpbm9faTJjX2RlbF9idXMoKTsKLQlmcmVlX2lycShTR0lfVklOT19JUlEsIE5VTEwpOwotCWZyZWVfcGFnZShWaW5vLT5kdW1teV9wYWdlKTsKLQlrZnJlZShWaW5vKTsKLQlpb3VubWFwKHZpbm8pOworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGludCB0b3RhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHByaW50aygidmlub19xdWV1ZV9hZGQoKTogaWQgPSAlZFxuIiwgaWQpOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKHEtPmxlbmd0aCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChpZCA+PSBxLT5sZW5ndGgpCisJCWdvdG8gb3V0OworCisJLyogbm90IG5lZWRlZD86IGlmICh2aW5vX2ZpZm9fZnVsbCgmcS0+b3V0KSkgeworCQlnb3RvIG91dDsKKwkJfSovCisJLyogY2hlY2sgdGhhdCBvdXRnb2luZyBxdWV1ZSBpc24ndCBhbHJlYWR5IGZ1bGwKKwkgKiAob3IgdGhhdCBpdCB3b24ndCBiZWNvbWUgZnVsbCkgKi8KKwl0b3RhbCA9IHZpbm9fZmlmb19nZXRfdXNlZCgmcS0+aW4pICsKKwkJdmlub19maWZvX2dldF91c2VkKCZxLT5vdXQpOworCWlmICh0b3RhbCA+PSBxLT5sZW5ndGgpCisJCWdvdG8gb3V0OworCisJaWYgKHZpbm9fZmlmb19lbnF1ZXVlKCZxLT5pbiwgaWQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IHEtPmJ1ZmZlcltpZF07CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OwogfQogCi1tb2R1bGVfaW5pdCh2aW5vX2luaXQpOwotbW9kdWxlX2V4aXQodmlub19leGl0KTsKK3N0YXRpYyBzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqdmlub19xdWV1ZV90cmFuc2ZlcihzdHJ1Y3QKKwkJCQkJCSAgICB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxKQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpyZXQgPSBOVUxMOworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKwlpbnQgaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbzRMaW51eCBkcml2ZXIgZm9yIFNHSSBJbmR5IFZJTk8gKEluZHlDYW0pIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CisJZHByaW50aygidmlub19xdWV1ZV90cmFuc2ZlcigpOlxuIik7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJLy8gbm93IHRoaXMgYWN0dWFsbHkgcmVtb3ZlcyBhbiBlbnRyeSBmcm9tIHRoZSBpbmNvbWluZyBxdWV1ZQorCWlmICh2aW5vX2ZpZm9fZGVxdWV1ZSgmcS0+aW4sICZpZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJZHByaW50aygidmlub19xdWV1ZV90cmFuc2ZlcigpOiBpZCA9ICVkXG4iLCBpZCk7CisJZmIgPSBxLT5idWZmZXJbaWRdOworCisJLy8gd2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgb3V0Z29pbmcgcXVldWUgaXMgbm90IGZ1bGwsIGJ1dC4uLgorCWlmICh2aW5vX2ZpZm9fZW5xdWV1ZSgmcS0+b3V0LCBpZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2aW5vX3F1ZXVlX3RyYW5zZmVyKCk6ICIKKwkJICAgICAgICJvdXRnb2luZyBxdWV1ZSBpcyBmdWxsLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4hXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZmI7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyogcmV0dXJucyB0cnVlL2ZhbHNlICovCitzdGF0aWMgaW50IHZpbm9fcXVldWVfaW5jb21pbmdfY29udGFpbnMoc3RydWN0IHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJCXVuc2lnbmVkIGludCBpZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKHEtPmxlbmd0aCA9PSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IHZpbm9fZmlmb19oYXNfaWQoJnEtPmluLCBpZCk7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiByZXR1cm5zIHRydWUvZmFsc2UgKi8KK3N0YXRpYyBpbnQgdmlub19xdWV1ZV9vdXRnb2luZ19jb250YWlucyhzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkJdW5zaWduZWQgaW50IGlkKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gdmlub19maWZvX2hhc19pZCgmcS0+b3V0LCBpZCk7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpbm9fcXVldWVfZ2V0X2luY29taW5nKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxLAorCQkJCSAgIHVuc2lnbmVkIGludCAqdXNlZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpIHsKKwkJcmV0dXJuIFZJTk9fUVVFVUVfRVJST1I7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChxLT5sZW5ndGggPT0gMCkgeworCQlyZXQgPSBWSU5PX1FVRVVFX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CisKKwkqdXNlZCA9IHZpbm9fZmlmb19nZXRfdXNlZCgmcS0+aW4pOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aW5vX3F1ZXVlX2dldF9vdXRnb2luZyhzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnVzZWQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiBWSU5PX1FVRVVFX0VSUk9SOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApIHsKKwkJcmV0ID0gVklOT19RVUVVRV9FUlJPUjsKKwkJZ290byBvdXQ7CisJfQorCisJKnVzZWQgPSB2aW5vX2ZpZm9fZ2V0X3VzZWQoJnEtPm91dCk7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpbm9fcXVldWVfZ2V0X3RvdGFsKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxLAorCQkJCXVuc2lnbmVkIGludCAqdG90YWwpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChxLT5tYWdpYyAhPSBWSU5PX1FVRVVFX01BR0lDKSB7CisJCXJldHVybiBWSU5PX1FVRVVFX0VSUk9SOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApIHsKKwkJcmV0ID0gVklOT19RVUVVRV9FUlJPUjsKKwkJZ290byBvdXQ7CisJfQorCisJKnRvdGFsID0gdmlub19maWZvX2dldF91c2VkKCZxLT5pbikgKworCQl2aW5vX2ZpZm9fZ2V0X3VzZWQoJnEtPm91dCk7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnZpbm9fcXVldWVfcGVlayhzdHJ1Y3QKKwkJCQkJCXZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJCQl1bnNpZ25lZCBpbnQgKmlkKQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKHZpbm9fZmlmb19wZWVrKCZxLT5pbiwgaWQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHEtPmJ1ZmZlclsqaWRdOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqdmlub19xdWV1ZV9yZW1vdmUoc3RydWN0CisJCQkJCQkgIHZpbm9fZnJhbWVidWZmZXJfcXVldWUgKnEsCisJCQkJCQkgIHVuc2lnbmVkIGludCAqaWQpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkcHJpbnRrKCJ2aW5vX3F1ZXVlX3JlbW92ZSgpOlxuIik7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKHZpbm9fZmlmb19kZXF1ZXVlKCZxLT5vdXQsIGlkKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlkcHJpbnRrKCJ2aW5vX3F1ZXVlX3JlbW92ZSgpOiBpZCA9ICVkXG4iLCAqaWQpOworCXJldCA9IHEtPmJ1ZmZlclsqaWRdOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QKK3Zpbm9fZnJhbWVidWZmZXIgKnZpbm9fcXVldWVfZ2V0X2J1ZmZlcihzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSwKKwkJCQkJdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bGVuZ3RoID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKGlkID49IHEtPmxlbmd0aCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBxLT5idWZmZXJbaWRdOworIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHZpbm9fcXVldWVfZ2V0X2xlbmd0aChzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlcl9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHEtPm1hZ2ljICE9IFZJTk9fUVVFVUVfTUFHSUMpIHsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWxlbmd0aCA9IHEtPmxlbmd0aDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgaW50IHZpbm9fcXVldWVfaGFzX21hcHBlZF9idWZmZXJzKHN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyX3F1ZXVlICpxKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocS0+bWFnaWMgIT0gVklOT19RVUVVRV9NQUdJQykgeworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IHEtPmxlbmd0aDsgaSsrKSB7CisJCWlmIChxLT5idWZmZXJbaV0tPm1hcF9jb3VudCA+IDApIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBWSU5PIGZ1bmN0aW9ucyAqLworCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fdXBkYXRlX2xpbmVfc2l6ZShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJdW5zaWduZWQgaW50IHcgPSB2Y3MtPmNsaXBwaW5nLnJpZ2h0IC0gdmNzLT5jbGlwcGluZy5sZWZ0OworCXVuc2lnbmVkIGludCBkID0gdmNzLT5kZWNpbWF0aW9uOworCXVuc2lnbmVkIGludCBicHAgPSB2aW5vX2RhdGFfZm9ybWF0c1t2Y3MtPmRhdGFfZm9ybWF0XS5icHA7CisgICAgICAgIHVuc2lnbmVkIGludCBsc2l6ZTsKKworCWRwcmludGsoInVwZGF0ZV9saW5lX3NpemUoKTogYmVmb3JlOiB3ID0gJWQsIGQgPSAlZCwgIgorCQkibGluZV9zaXplID0gJWRcbiIsIHcsIGQsIHZjcy0+bGluZV9zaXplKTsKKyAgICAgICAgLyogbGluZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgOCBieXRlcyAqLworCWxzaXplID0gKGJwcCAqICh3IC8gZCkpICYgfjc7CisJdyA9IChsc2l6ZSAvIGJwcCkgKiBkOworCisJdmNzLT5jbGlwcGluZy5yaWdodCA9IHZjcy0+Y2xpcHBpbmcubGVmdCArIHc7CisJdmNzLT5saW5lX3NpemUgPSBsc2l6ZTsKKwlkcHJpbnRrKCJ1cGRhdGVfbGluZV9zaXplKCk6IGFmdGVyOiB3ID0gJWQsIGQgPSAlZCwgIgorCQkibGluZV9zaXplID0gJWRcbiIsIHcsIGQsIHZjcy0+bGluZV9zaXplKTsKK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgdm9pZCB2aW5vX3NldF9jbGlwcGluZyhzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgpCit7CisJdW5zaWduZWQgaW50IG1heHdpZHRoLCBtYXhoZWlnaHQ7CisJdW5zaWduZWQgaW50IGQ7CisKKwltYXh3aWR0aCA9IHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0ud2lkdGg7CisJbWF4aGVpZ2h0ID0gdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5oZWlnaHQ7CisJZCA9IHZjcy0+ZGVjaW1hdGlvbjsKKworCXkgJj0gfjE7CS8qIG9kZC9ldmVuIGZpZWxkcyAqLworCisJaWYgKHggPiBtYXh3aWR0aCkgeworCQl4ID0gMDsKKwl9CisJaWYgKHkgPiBtYXhoZWlnaHQpIHsKKwkJeSA9IDA7CisJfQorCisJaWYgKCgodyAvIGQpIDwgVklOT19NSU5fV0lEVEgpCisJICAgIHx8ICgoaCAvIGQpIDwgVklOT19NSU5fSEVJR0hUKSkgeworCQl3ID0gVklOT19NSU5fV0lEVEggKiBkOworCQloID0gVklOT19NSU5fSEVJR0hUICogZDsKKwl9CisKKwlpZiAoKHggKyB3KSA+IG1heHdpZHRoKSB7CisJCXcgPSBtYXh3aWR0aCAtIHg7CisJCWlmICgodyAvIGQpIDwgVklOT19NSU5fV0lEVEgpCisJCQl4ID0gbWF4d2lkdGggLSBWSU5PX01JTl9XSURUSCAqIGQ7CisJfQorCWlmICgoeSArIGgpID4gbWF4aGVpZ2h0KSB7CisJCWggPSBtYXhoZWlnaHQgLSB5OworCQlpZiAoKGggLyBkKSA8IFZJTk9fTUlOX0hFSUdIVCkKKwkJCXkgPSBtYXhoZWlnaHQgLSBWSU5PX01JTl9IRUlHSFQgKiBkOworCX0KKworCXZjcy0+Y2xpcHBpbmcubGVmdCA9IHg7CisJdmNzLT5jbGlwcGluZy50b3AgPSB5OworCXZjcy0+Y2xpcHBpbmcucmlnaHQgPSB4ICsgdzsKKwl2Y3MtPmNsaXBwaW5nLmJvdHRvbSA9IHkgKyBoOworCisJdmlub191cGRhdGVfbGluZV9zaXplKHZjcyk7CisKKwlkcHJpbnRrKCJjbGlwcGluZyAlZCwgJWQsICVkLCAlZCAvICVkIC0gJWRcbiIsCisJCXZjcy0+Y2xpcHBpbmcubGVmdCwgdmNzLT5jbGlwcGluZy50b3AsIHZjcy0+Y2xpcHBpbmcucmlnaHQsCisJCXZjcy0+Y2xpcHBpbmcuYm90dG9tLCB2Y3MtPmRlY2ltYXRpb24sIHZjcy0+bGluZV9zaXplKTsKK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgdm9pZCB2aW5vX3NldF9kZWZhdWx0X2NsaXBwaW5nKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl2aW5vX3NldF9jbGlwcGluZyh2Y3MsIDAsIDAsIHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0ud2lkdGgsCisJCQkgIHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uaGVpZ2h0KTsKK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgdm9pZCB2aW5vX3NldF9zY2FsaW5nKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgdW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoKQoreworCXVuc2lnbmVkIGludCB4LCB5LCBjdXJ3LCBjdXJoLCBkOworCisJeCA9IHZjcy0+Y2xpcHBpbmcubGVmdDsKKwl5ID0gdmNzLT5jbGlwcGluZy50b3A7CisJY3VydyA9IHZjcy0+Y2xpcHBpbmcucmlnaHQgLSB2Y3MtPmNsaXBwaW5nLmxlZnQ7CisJY3VyaCA9IHZjcy0+Y2xpcHBpbmcuYm90dG9tIC0gdmNzLT5jbGlwcGluZy50b3A7CisKKwlkID0gbWF4KGN1cncgLyB3LCBjdXJoIC8gaCk7CisKKwlkcHJpbnRrKCJzY2FsaW5nIHc6ICVkLCBoOiAlZCwgY3VydzogJWQsIGN1cmg6ICVkLCBkOiAlZFxuIiwKKwkJdywgaCwgY3VydywgY3VyaCwgZCk7CisKKwlpZiAoZCA8IDEpIHsKKwkJZCA9IDE7CisJfQorCWlmIChkID4gOCkgeworCQlkID0gODsKKwl9CisKKwl2Y3MtPmRlY2ltYXRpb24gPSBkOworCXZpbm9fc2V0X2NsaXBwaW5nKHZjcywgeCwgeSwgdyAqIGQsIGggKiBkKTsKKworCWRwcmludGsoInNjYWxpbmcgJWQsICVkLCAlZCwgJWQgLyAlZCAtICVkXG4iLCB2Y3MtPmNsaXBwaW5nLmxlZnQsCisJCXZjcy0+Y2xpcHBpbmcudG9wLCB2Y3MtPmNsaXBwaW5nLnJpZ2h0LCB2Y3MtPmNsaXBwaW5nLmJvdHRvbSwKKwkJdmNzLT5kZWNpbWF0aW9uLCB2Y3MtPmxpbmVfc2l6ZSk7Cit9CisKKy8qIGV4ZWN1dGUgd2l0aCBpbnB1dF9sb2NrIGxvY2tlZCAqLworc3RhdGljIHZvaWQgdmlub19yZXNldF9zY2FsaW5nKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl2aW5vX3NldF9zY2FsaW5nKHZjcywgdmNzLT5jbGlwcGluZy5yaWdodCAtIHZjcy0+Y2xpcHBpbmcubGVmdCwKKwkJCSB2Y3MtPmNsaXBwaW5nLmJvdHRvbSAtIHZjcy0+Y2xpcHBpbmcudG9wKTsKK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgdm9pZCB2aW5vX3NldF9mcmFtZXJhdGUoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBmcHMpCit7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlzd2l0Y2ggKHZjcy0+ZGF0YV9ub3JtKSB7CisJY2FzZSBWSU5PX0RBVEFfTk9STV9OVFNDOgorCWNhc2UgVklOT19EQVRBX05PUk1fRDE6CisJCWZwcyA9ICh1bnNpZ25lZCBpbnQpKGZwcyAvIDYpICogNjsgLy8gRklYTUU6IHJvdW5kIQorCisJCWlmIChmcHMgPCB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19taW4pCisJCQlmcHMgPSB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19taW47CisJCWlmIChmcHMgPiB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19tYXgpCisJCQlmcHMgPSB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19tYXg7CisKKwkJc3dpdGNoIChmcHMpIHsKKwkJY2FzZSA2OgorCQkJbWFzayA9IDB4MDAzOworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQltYXNrID0gMHgwYzM7CisJCQlicmVhazsKKwkJY2FzZSAxODoKKwkJCW1hc2sgPSAweDMzMzsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJbWFzayA9IDB4M2ZmOworCQkJYnJlYWs7CisJCWNhc2UgMzA6CisJCQltYXNrID0gMHhmZmY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1hc2sgPSBWSU5PX0ZSQU1FUlRfRlVMTDsKKwkJfQorCQl2Y3MtPmZyYW1lcnRfcmVnID0gVklOT19GUkFNRVJUX1JUKG1hc2spOworCQlicmVhazsKKwljYXNlIFZJTk9fREFUQV9OT1JNX1BBTDoKKwljYXNlIFZJTk9fREFUQV9OT1JNX1NFQ0FNOgorCQlmcHMgPSAodW5zaWduZWQgaW50KShmcHMgLyA1KSAqIDU7IC8vIEZJWE1FOiByb3VuZCEKKworCQlpZiAoZnBzIDwgdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5mcHNfbWluKQorCQkJZnBzID0gdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5mcHNfbWluOworCQlpZiAoZnBzID4gdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5mcHNfbWF4KQorCQkJZnBzID0gdmlub19kYXRhX25vcm1zW3Zjcy0+ZGF0YV9ub3JtXS5mcHNfbWF4OworCisJCXN3aXRjaCAoZnBzKSB7CisJCWNhc2UgNToKKwkJCW1hc2sgPSAweDAwMzsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJbWFzayA9IDB4MGMzOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQltYXNrID0gMHgzMzM7CisJCQlicmVhazsKKwkJY2FzZSAyMDoKKwkJCW1hc2sgPSAweDBmZjsKKwkJCWJyZWFrOworCQljYXNlIDI1OgorCQkJbWFzayA9IDB4M2ZmOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltYXNrID0gVklOT19GUkFNRVJUX0ZVTEw7CisJCX0KKwkJdmNzLT5mcmFtZXJ0X3JlZyA9IFZJTk9fRlJBTUVSVF9SVChtYXNrKSB8IFZJTk9fRlJBTUVSVF9QQUw7CisJCWJyZWFrOworCX0KKworCXZjcy0+ZnBzID0gZnBzOworfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyB2b2lkIHZpbm9fc2V0X2RlZmF1bHRfZnJhbWVyYXRlKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl2aW5vX3NldF9mcmFtZXJhdGUodmNzLCB2aW5vX2RhdGFfbm9ybXNbdmNzLT5kYXRhX25vcm1dLmZwc19tYXgpOworfQorCisvKgorICogUHJlcGFyZSBWSU5PIGZvciBETUEgdHJhbnNmZXIuLi4KKyAqIChleGVjdXRlIG9ubHkgd2l0aCB2aW5vX2xvY2sgYW5kIGlucHV0X2xvY2sgbG9ja2VkKQorICovCitzdGF0aWMgaW50IHZpbm9fZG1hX3NldHVwKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiKQoreworCXUzMiBjdHJsLCBpbnRyOworCXN0cnVjdCBzZ2lfdmlub19jaGFubmVsICpjaDsKKwljb25zdCBzdHJ1Y3Qgdmlub19kYXRhX25vcm0gKm5vcm07CisKKwlkcHJpbnRrKCJ2aW5vX2RtYV9zZXR1cCgpOlxuIik7CisKKwl2Y3MtPmZpZWxkID0gMDsKKwlmYi0+ZnJhbWVfY291bnRlciA9IDA7CisKKwljaCA9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8gJnZpbm8tPmEgOiAmdmluby0+YjsKKwlub3JtID0gJnZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV07CisKKwljaC0+cGFnZV9pbmRleCA9IDA7CisJY2gtPmxpbmVfY291bnQgPSAwOworCisJLyogVklOTyBsaW5lIHNpemUgcmVnaXN0ZXIgaXMgc2V0IDggYnl0ZXMgbGVzcyB0aGFuIGFjdHVhbCAqLworCWNoLT5saW5lX3NpemUgPSB2Y3MtPmxpbmVfc2l6ZSAtIDg7CisKKwkvKiBsZXQgVklOTyBrbm93IHdoZXJlIHRvIHRyYW5zZmVyIGRhdGEgKi8KKwljaC0+c3RhcnRfZGVzY190YmwgPSBmYi0+ZGVzY190YWJsZS5kbWE7CisJY2gtPm5leHRfNF9kZXNjID0gZmItPmRlc2NfdGFibGUuZG1hOworCisJLyogZ2l2ZSB2aW5vIHRpbWUgdG8gZmV0Y2ggdGhlIGZpcnN0IGZvdXIgZGVzY3JpcHRvcnMsIDUgdXNlYworCSAqIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoIHRpbWUgKi8KKwl1ZGVsYXkoVklOT19ERVNDX0ZFVENIX0RFTEFZKTsKKworCS8qIHNldCB0aGUgYWxwaGEgcmVnaXN0ZXIgKi8KKwljaC0+YWxwaGEgPSB2Y3MtPmFscGhhOworCisJLyogc2V0IGNsaXBwaW5nIHJlZ2lzdGVycyAqLworCWNoLT5jbGlwX3N0YXJ0ID0gVklOT19DTElQX09ERChub3JtLT5vZGQudG9wICsgdmNzLT5jbGlwcGluZy50b3AgLyAyKSB8CisJCVZJTk9fQ0xJUF9FVkVOKG5vcm0tPmV2ZW4udG9wICsKKwkJCSAgICAgICB2Y3MtPmNsaXBwaW5nLnRvcCAvIDIpIHwKKwkJVklOT19DTElQX1godmNzLT5jbGlwcGluZy5sZWZ0KTsKKwljaC0+Y2xpcF9lbmQgPSBWSU5PX0NMSVBfT0REKG5vcm0tPm9kZC50b3AgKworCQkJCSAgICAgdmNzLT5jbGlwcGluZy5ib3R0b20gLyAyIC0gMSkgfAorCQlWSU5PX0NMSVBfRVZFTihub3JtLT5ldmVuLnRvcCArCisJCQkgICAgICAgdmNzLT5jbGlwcGluZy5ib3R0b20gLyAyIC0gMSkgfAorCQlWSU5PX0NMSVBfWCh2Y3MtPmNsaXBwaW5nLnJpZ2h0KTsKKwkvKiBGSVhNRTogZW5kLW9mLWZpZWxkIGJ1ZyB3b3JrYXJvdW5kCisJCSAgICAgICBWSU5PX0NMSVBfWChWSU5PX1BBTF9XSURUSCk7CisJICovCisKKwkvKiBzZXQgdGhlIHNpemUgb2YgYWN0dWFsIGNvbnRlbnQgaW4gdGhlIGJ1ZmZlciAoREVDSU1BVElPTiAhKSAqLworCWZiLT5kYXRhX3NpemUgPSAoKHZjcy0+Y2xpcHBpbmcucmlnaHQgLSB2Y3MtPmNsaXBwaW5nLmxlZnQpIC8KKwkJCSB2Y3MtPmRlY2ltYXRpb24pICoKKwkJKCh2Y3MtPmNsaXBwaW5nLmJvdHRvbSAtIHZjcy0+Y2xpcHBpbmcudG9wKSAvCisJCSB2Y3MtPmRlY2ltYXRpb24pICoKKwkJdmlub19kYXRhX2Zvcm1hdHNbdmNzLT5kYXRhX2Zvcm1hdF0uYnBwOworCisJY2gtPmZyYW1lX3JhdGUgPSB2Y3MtPmZyYW1lcnRfcmVnOworCisJY3RybCA9IHZpbm8tPmNvbnRyb2w7CisJaW50ciA9IHZpbm8tPmludHJfc3RhdHVzOworCisJaWYgKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgeworCQkvKiBBbGwgaW50ZXJydXB0IGNvbmRpdGlvbnMgZm9yIHRoaXMgY2hhbm5lbCB3YXMgY2xlYXJlZAorCQkgKiBzbyBjbGVhciB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBhbmQgZW5hYmxlCisJCSAqIGludGVycnVwdHMgKi8KKwkJaW50ciAmPQl+VklOT19JTlRTVEFUX0E7CisJCWN0cmwgfD0gVklOT19DVFJMX0FfSU5UOworCisJCS8qIGVuYWJsZSBzeW5jaHJvbml6YXRpb24gKi8KKwkJY3RybCB8PSBWSU5PX0NUUkxfQV9TWU5DX0VOQkw7CisKKwkJLyogZW5hYmxlIGZyYW1lIGFzc2VtYmx5ICovCisJCWN0cmwgfD0gVklOT19DVFJMX0FfSU5URVJMRUFWRV9FTkJMOworCisJCS8qIHNldCBkZWNpbWF0aW9uIHVzZWQgKi8KKwkJaWYgKHZjcy0+ZGVjaW1hdGlvbiA8IDIpCisJCQljdHJsICY9IH5WSU5PX0NUUkxfQV9ERUNfRU5CTDsKKwkJZWxzZSB7CisJCQljdHJsIHw9IFZJTk9fQ1RSTF9BX0RFQ19FTkJMOworCQkJY3RybCAmPSB+VklOT19DVFJMX0FfREVDX1NDQUxFX01BU0s7CisJCQljdHJsIHw9ICh2Y3MtPmRlY2ltYXRpb24gLSAxKSA8PAorCQkJCVZJTk9fQ1RSTF9BX0RFQ19TQ0FMRV9TSElGVDsKKwkJfQorCisJCS8qIHNlbGVjdCBpbnB1dCBpbnRlcmZhY2UgKi8KKwkJaWYgKHZjcy0+aW5wdXQgPT0gVklOT19JTlBVVF9EMSkKKwkJCWN0cmwgfD0gVklOT19DVFJMX0FfU0VMRUNUOworCQllbHNlCisJCQljdHJsICY9IH5WSU5PX0NUUkxfQV9TRUxFQ1Q7CisKKwkJLyogcGFsZXR0ZSAqLworCQljdHJsICY9IH4oVklOT19DVFJMX0FfTFVNQV9PTkxZIHwgVklOT19DVFJMX0FfUkdCIHwKKwkJCSAgVklOT19DVFJMX0FfRElUSEVSKTsKKwl9IGVsc2UgeworCQlpbnRyICY9IH5WSU5PX0lOVFNUQVRfQjsKKwkJY3RybCB8PSBWSU5PX0NUUkxfQl9JTlQ7CisKKwkJY3RybCB8PSBWSU5PX0NUUkxfQl9TWU5DX0VOQkw7CisJCWN0cmwgfD0gVklOT19DVFJMX0JfSU5URVJMRUFWRV9FTkJMOworCisJCWlmICh2Y3MtPmRlY2ltYXRpb24gPCAyKQorCQkJY3RybCAmPSB+VklOT19DVFJMX0JfREVDX0VOQkw7CisJCWVsc2UgeworCQkJY3RybCB8PSBWSU5PX0NUUkxfQl9ERUNfRU5CTDsKKwkJCWN0cmwgJj0gflZJTk9fQ1RSTF9CX0RFQ19TQ0FMRV9NQVNLOworCQkJY3RybCB8PSAodmNzLT5kZWNpbWF0aW9uIC0gMSkgPDwKKwkJCQlWSU5PX0NUUkxfQl9ERUNfU0NBTEVfU0hJRlQ7CisKKwkJfQorCQlpZiAodmNzLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0QxKQorCQkJY3RybCB8PSBWSU5PX0NUUkxfQl9TRUxFQ1Q7CisJCWVsc2UKKwkJCWN0cmwgJj0gflZJTk9fQ1RSTF9CX1NFTEVDVDsKKworCQljdHJsICY9IH4oVklOT19DVFJMX0JfTFVNQV9PTkxZIHwgVklOT19DVFJMX0JfUkdCIHwKKwkJCSAgVklOT19DVFJMX0JfRElUSEVSKTsKKwl9CisKKwkvKiBzZXQgcGFsZXR0ZSAqLworCWZiLT5kYXRhX2Zvcm1hdCA9IHZjcy0+ZGF0YV9mb3JtYXQ7CisKKwlzd2l0Y2ggKHZjcy0+ZGF0YV9mb3JtYXQpIHsKKwkJY2FzZSBWSU5PX0RBVEFfRk1UX0dSRVk6CisJCQljdHJsIHw9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8KKwkJCQlWSU5PX0NUUkxfQV9MVU1BX09OTFkgOiBWSU5PX0NUUkxfQl9MVU1BX09OTFk7CisJCQlicmVhazsKKwkJY2FzZSBWSU5PX0RBVEFfRk1UX1JHQjMyOgorCQkJY3RybCB8PSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCQkJVklOT19DVFJMX0FfUkdCIDogVklOT19DVFJMX0JfUkdCOworCQkJYnJlYWs7CisJCWNhc2UgVklOT19EQVRBX0ZNVF9ZVVY6CisJCQkvKiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgKi8KKwkJCWJyZWFrOworCQljYXNlIFZJTk9fREFUQV9GTVRfUkdCMzMyOgorCQkJY3RybCB8PSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCQkJVklOT19DVFJMX0FfUkdCIHwgVklOT19DVFJMX0FfRElUSEVSIDoKKwkJCQlWSU5PX0NUUkxfQl9SR0IgfCBWSU5PX0NUUkxfQl9ESVRIRVI7CisJCQlicmVhazsKKwl9CisKKwl2aW5vLT5pbnRyX3N0YXR1cyA9IGludHI7CisJdmluby0+Y29udHJvbCA9IGN0cmw7CisKKwlyZXR1cm4gMDsKK30KKworLyogKGV4ZWN1dGUgb25seSB3aXRoIHZpbm9fbG9jayBsb2NrZWQpICovCitzdGF0aWMgdm9pZCB2aW5vX2RtYV9zdGFydChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJdTMyIGN0cmwgPSB2aW5vLT5jb250cm9sOworCisJZHByaW50aygidmlub19kbWFfc3RhcnQoKTpcbiIpOworCWN0cmwgfD0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPworCQlWSU5PX0NUUkxfQV9ETUFfRU5CTCA6IFZJTk9fQ1RSTF9CX0RNQV9FTkJMOworCXZpbm8tPmNvbnRyb2wgPSBjdHJsOworfQorCisvKiAoZXhlY3V0ZSBvbmx5IHdpdGggdmlub19sb2NrIGxvY2tlZCkgKi8KK3N0YXRpYyB2b2lkIHZpbm9fZG1hX3N0b3Aoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXUzMiBjdHJsID0gdmluby0+Y29udHJvbDsKKworCWN0cmwgJj0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPworCQl+VklOT19DVFJMX0FfRE1BX0VOQkwgOiB+VklOT19DVFJMX0JfRE1BX0VOQkw7CisJdmluby0+Y29udHJvbCA9IGN0cmw7CisJZHByaW50aygidmlub19kbWFfc3RvcCgpOlxuIik7Cit9CisKKy8qCisgKiBMb2FkIGR1bW15IHBhZ2UgdG8gZGVzY3JpcHRvciByZWdpc3RlcnMuIFRoaXMgcHJldmVudHMgZ2VuZXJhdGluZyBvZgorICogc3B1cmlvdXMgaW50ZXJydXB0cy4gKGV4ZWN1dGUgb25seSB3aXRoIHZpbm9fbG9jayBsb2NrZWQpCisgKi8KK3N0YXRpYyB2b2lkIHZpbm9fY2xlYXJfaW50ZXJydXB0KHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwlzdHJ1Y3Qgc2dpX3Zpbm9fY2hhbm5lbCAqY2g7CisKKwljaCA9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8gJnZpbm8tPmEgOiAmdmluby0+YjsKKworCWNoLT5wYWdlX2luZGV4ID0gMDsKKwljaC0+bGluZV9jb3VudCA9IDA7CisKKwljaC0+c3RhcnRfZGVzY190YmwgPSB2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hOworCWNoLT5uZXh0XzRfZGVzYyA9IHZpbm9fZHJ2ZGF0YS0+ZHVtbXlfZGVzY190YWJsZS5kbWE7CisKKwl1ZGVsYXkoVklOT19ERVNDX0ZFVENIX0RFTEFZKTsKKwlkcHJpbnRrKCJjaGFubmVsICVjIGNsZWFyIGludGVycnVwdCBjb25kaXRpb25cbiIsCisJICAgICAgICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8gJ0EnOidCJyk7Cit9CisKK3N0YXRpYyBpbnQgdmlub19jYXB0dXJlKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmItPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCWlmIChmYi0+c3RhdGUgPT0gVklOT19GUkFNRUJVRkZFUl9JTl9VU0UpCisJCWVyciA9IC1FQlVTWTsKKwlmYi0+c3RhdGUgPSBWSU5PX0ZSQU1FQlVGRkVSX0lOX1VTRTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpbm9fZHJ2ZGF0YS0+dmlub19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jaywgZmxhZ3MyKTsKKworCXZpbm9fZG1hX3NldHVwKHZjcywgZmIpOworCXZpbm9fZG1hX3N0YXJ0KHZjcyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2ssIGZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYworc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKnZpbm9fY2FwdHVyZV9lbnF1ZXVlKHN0cnVjdAorCQkJCQkgICAgICB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGluZGV4KQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHByaW50aygidmlub19jYXB0dXJlX2VucXVldWUoKTpcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlmYiA9IHZpbm9fcXVldWVfYWRkKCZ2Y3MtPmZiX3F1ZXVlLCBpbmRleCk7CisJaWYgKGZiID09IE5VTEwpIHsKKwkJZHByaW50aygidmlub19jYXB0dXJlX2VucXVldWUoKTogdmlub19xdWV1ZV9hZGQoKSBmYWlsZWQsICIKKwkJCSJxdWV1ZSBmdWxsP1xuIik7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGZiOworfQorCitzdGF0aWMgaW50IHZpbm9fY2FwdHVyZV9uZXh0KHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywgaW50IHN0YXJ0KQoreworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKwl1bnNpZ25lZCBpbnQgaW5jb21pbmcsIGlkOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMjsKKworCWRwcmludGsoInZpbm9fY2FwdHVyZV9uZXh0KCk6XG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXJ0KSB7CisJCS8qIHN0YXJ0IGNhcHR1cmUgb25seSBpZiBjYXB0dXJlIGlzbid0IGluIHByb2dyZXNzIGFscmVhZHkgKi8KKwkJaWYgKHZjcy0+Y2FwdHVyaW5nKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIGNhcHR1cmUgbmV4dCBmcmFtZToKKwkJICogc3RvcCBjYXB0dXJlIGlmIGNhcHR1cmluZyBpcyBub3Qgc2V0ICovCisJCWlmICghdmNzLT5jYXB0dXJpbmcpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWVyciA9IHZpbm9fcXVldWVfZ2V0X2luY29taW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmaW5jb21pbmcpOworCWlmIChlcnIpIHsKKwkJZHByaW50aygidmlub19jYXB0dXJlX25leHQoKTogdmlub19xdWV1ZV9nZXRfaW5jb21pbmcoKSAiCisJCQkiZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChpbmNvbWluZyA9PSAwKSB7CisJCWRwcmludGsoInZpbm9fY2FwdHVyZV9uZXh0KCk6IG5vIGJ1ZmZlcnMgYXZhaWxhYmxlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZmIgPSB2aW5vX3F1ZXVlX3BlZWsoJnZjcy0+ZmJfcXVldWUsICZpZCk7CisJaWYgKGZiID09IE5VTEwpIHsKKwkJZHByaW50aygidmlub19jYXB0dXJlX25leHQoKTogdmlub19xdWV1ZV9wZWVrKCkgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFnczIpOworCWZiLT5zdGF0ZSA9IFZJTk9fRlJBTUVCVUZGRVJfVU5VU0VEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFnczIpOworCisJaWYgKHN0YXJ0KSB7CisJCXZjcy0+Y2FwdHVyaW5nID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCisJZXJyID0gdmlub19jYXB0dXJlKHZjcywgZmIpOworCisJcmV0dXJuIGVycjsKKworb3V0OgorCXZjcy0+Y2FwdHVyaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2aW5vX2lzX2NhcHR1cmluZyhzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlyZXQgPSB2Y3MtPmNhcHR1cmluZzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjcy0+Y2FwdHVyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiB3YWl0cyB1bnRpbCBhIGZyYW1lIGlzIGNhcHR1cmVkICovCitzdGF0aWMgaW50IHZpbm9fd2FpdF9mb3JfZnJhbWUoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXdhaXRfcXVldWVfdCB3YWl0OworCWludCBlcnIgPSAwOworCisJZHByaW50aygidmlub193YWl0X2Zvcl9mcmFtZSgpOlxuIik7CisKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJLyogYWRkIG91cnNlbHZlcyBpbnRvIHdhaXQgcXVldWUgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmdmNzLT5mYl9xdWV1ZS5mcmFtZV93YWl0X3F1ZXVlLCAmd2FpdCk7CisJLyogYW5kIHNldCBjdXJyZW50IHN0YXRlICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCS8qIHRvIGVuc3VyZSB0aGF0IHNjaGVkdWxlX3RpbWVvdXQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkKKwkgKiBpZiBWSU5PIGludGVycnVwdCB3YXMgdHJpZ2dyZWQgbWVhbndoaWxlICovCisJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJZXJyID0gLUVJTlRSOworCisJcmVtb3ZlX3dhaXRfcXVldWUoJnZjcy0+ZmJfcXVldWUuZnJhbWVfd2FpdF9xdWV1ZSwgJndhaXQpOworCisJZHByaW50aygidmlub193YWl0X2Zvcl9mcmFtZSgpOiB3YWl0aW5nIGZvciBmcmFtZSAlc1xuIiwKKwkJZXJyID8gImZhaWxlZCIgOiAib2siKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIHRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgUEFHRV9TSVpFICUgNCA9PSAwICovCitzdGF0aWMgdm9pZCB2aW5vX2NvbnZlcnRfdG9fcmdiYShzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIpIHsKKwl1bnNpZ25lZCBjaGFyICpwYWdlcHRyOworCXVuc2lnbmVkIGludCBwYWdlLCBpOworCXVuc2lnbmVkIGNoYXIgYTsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50OyBwYWdlKyspIHsKKwkJcGFnZXB0ciA9ICh1bnNpZ25lZCBjaGFyICopZmItPmRlc2NfdGFibGUudmlydHVhbFtwYWdlXTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFOyBpICs9IDQpIHsKKwkJCWEgPSBwYWdlcHRyWzBdOworCQkJcGFnZXB0clswXSA9IHBhZ2VwdHJbM107CisJCQlwYWdlcHRyWzFdID0gcGFnZXB0clsyXTsKKwkJCXBhZ2VwdHJbMl0gPSBwYWdlcHRyWzFdOworCQkJcGFnZXB0clszXSA9IGE7CisJCQlwYWdlcHRyICs9IDQ7CisJCX0KKwl9Cit9CisKKy8qIGNoZWNrcyBpZiB0aGUgYnVmZmVyIGlzIGluIGNvcnJlY3Qgc3RhdGUgYW5kIHN5bmNzIGRhdGEgKi8KK3N0YXRpYyBpbnQgdmlub19jaGVja19idWZmZXIoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICBzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIpCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRwcmludGsoInZpbm9fY2hlY2tfYnVmZmVyKCk6XG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmYi0+c3RhdGVfbG9jaywgZmxhZ3MpOworCXN3aXRjaCAoZmItPnN0YXRlKSB7CisJY2FzZSBWSU5PX0ZSQU1FQlVGRkVSX0lOX1VTRToKKwkJZXJyID0gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBWSU5PX0ZSQU1FQlVGRkVSX1JFQURZOgorCQl2aW5vX3N5bmNfYnVmZmVyKGZiKTsKKwkJZmItPnN0YXRlID0gVklOT19GUkFNRUJVRkZFUl9VTlVTRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWVycikgeworCQlpZiAodmlub19waXhlbF9jb252ZXJzaW9uCisJCSAgICAmJiAoZmItPmRhdGFfZm9ybWF0ID09IFZJTk9fREFUQV9GTVRfUkdCMzIpKSB7CisJCQl2aW5vX2NvbnZlcnRfdG9fcmdiYShmYik7CisJCX0KKwl9IGVsc2UgaWYgKGVyciAmJiAoZXJyICE9IC1FSU5WQUwpKSB7CisJCWRwcmludGsoInZpbm9fY2hlY2tfYnVmZmVyKCk6IGJ1ZmZlciBub3QgcmVhZHlcbiIpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jaywgZmxhZ3MpOworCQl2aW5vX2RtYV9zdG9wKHZjcyk7CisJCXZpbm9fY2xlYXJfaW50ZXJydXB0KHZjcyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpbm9fZHJ2ZGF0YS0+dmlub19sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogZm9yY2VmdWxseSB0ZXJtaW5hdGVzIGNhcHR1cmUgKi8KK3N0YXRpYyB2b2lkIHZpbm9fY2FwdHVyZV9zdG9wKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl1bnNpZ25lZCBpbnQgaW5jb21pbmcgPSAwLCBvdXRnb2luZyA9IDAsIGlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMjsKKworCWRwcmludGsoInZpbm9fY2FwdHVyZV9zdG9wKCk6XG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCS8qIHVuc2V0IGNhcHR1cmluZyB0byBzdG9wIHF1ZXVlIHByb2Nlc3NpbmcgKi8KKwl2Y3MtPmNhcHR1cmluZyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzMik7CisKKwl2aW5vX2RtYV9zdG9wKHZjcyk7CisJdmlub19jbGVhcl9pbnRlcnJ1cHQodmNzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpbm9fZHJ2ZGF0YS0+dmlub19sb2NrLCBmbGFnczIpOworCisJLyogcmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBxdWV1ZSAqLworCWlmICh2aW5vX3F1ZXVlX2dldF9pbmNvbWluZygmdmNzLT5mYl9xdWV1ZSwgJmluY29taW5nKSkgeworCQlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfc3RvcCgpOiAiCisJCQkidmlub19xdWV1ZV9nZXRfaW5jb21pbmcoKSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisJd2hpbGUgKGluY29taW5nID4gMCkgeworCQl2aW5vX3F1ZXVlX3RyYW5zZmVyKCZ2Y3MtPmZiX3F1ZXVlKTsKKworCQlpZiAodmlub19xdWV1ZV9nZXRfaW5jb21pbmcoJnZjcy0+ZmJfcXVldWUsICZpbmNvbWluZykpIHsKKwkJCWRwcmludGsoInZpbm9fY2FwdHVyZV9zdG9wKCk6ICIKKwkJCQkidmlub19xdWV1ZV9nZXRfaW5jb21pbmcoKSBmYWlsZWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAodmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoJnZjcy0+ZmJfcXVldWUsICZvdXRnb2luZykpIHsKKwkJZHByaW50aygidmlub19jYXB0dXJlX3N0b3AoKTogIgorCQkJInZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCkgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXdoaWxlIChvdXRnb2luZyA+IDApIHsKKwkJdmlub19xdWV1ZV9yZW1vdmUoJnZjcy0+ZmJfcXVldWUsICZpZCk7CisKKwkJaWYgKHZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmb3V0Z29pbmcpKSB7CisJCQlkcHJpbnRrKCJ2aW5vX2NhcHR1cmVfc3RvcCgpOiAiCisJCQkJInZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCkgZmFpbGVkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB2aW5vX2NhcHR1cmVfZmFpbGVkKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJZHByaW50aygidmlub19jYXB0dXJlX2ZhaWxlZCgpOlxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzKTsKKworCXZpbm9fZG1hX3N0b3AodmNzKTsKKwl2aW5vX2NsZWFyX2ludGVycnVwdCh2Y3MpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlub19kcnZkYXRhLT52aW5vX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IHZpbm9fcXVldWVfZ2V0X2luY29taW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmaSk7CisJaWYgKHJldCA9PSBWSU5PX1FVRVVFX0VSUk9SKSB7CisJCWRwcmludGsoInZpbm9fcXVldWVfZ2V0X2luY29taW5nKCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChpID09IDApIHsKKwkJLyogbm8gYnVmZmVycyB0byBwcm9jZXNzICovCisJCXJldHVybiAwOworCX0KKworCWZiID0gdmlub19xdWV1ZV9wZWVrKCZ2Y3MtPmZiX3F1ZXVlLCAmaSk7CisJaWYgKGZiID09IE5VTEwpIHsKKwkJZHByaW50aygidmlub19xdWV1ZV9wZWVrKCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKGZiLT5zdGF0ZSA9PSBWSU5PX0ZSQU1FQlVGRkVSX0lOX1VTRSkgeworCQlmYi0+c3RhdGUgPSBWSU5PX0ZSQU1FQlVGRkVSX1VOVVNFRDsKKwkJdmlub19xdWV1ZV90cmFuc2ZlcigmdmNzLT5mYl9xdWV1ZSk7CisJCXZpbm9fcXVldWVfcmVtb3ZlKCZ2Y3MtPmZiX3F1ZXVlLCAmaSk7CisJCS8qIHdlIHNob3VsZCBhY3R1YWxseSBkaXNjYXJkIHRoZSBuZXdlc3QgZnJhbWUsCisJCSAqIGJ1dCB3aG8gY2FyZXMgLi4uICovCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlub19mcmFtZV9kb25lKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICB1bnNpZ25lZCBpbnQgZmMpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKKwlmYiA9IHZpbm9fcXVldWVfdHJhbnNmZXIoJnZjcy0+ZmJfcXVldWUpOworCWlmICghZmIpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmNzLT5jYXB0dXJlX2xvY2ssIGZsYWdzKTsKKwkJZHByaW50aygidmlub19mcmFtZV9kb25lKCk6IHZpbm9fcXVldWVfdHJhbnNmZXIoKSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Y3MtPmNhcHR1cmVfbG9jaywgZmxhZ3MpOworCisJZmItPmZyYW1lX2NvdW50ZXIgPSBmYzsKKwlkb19nZXR0aW1lb2ZkYXkoJmZiLT50aW1lc3RhbXApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZiLT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKGZiLT5zdGF0ZSA9PSBWSU5PX0ZSQU1FQlVGRkVSX0lOX1VTRSkKKwkJZmItPnN0YXRlID0gVklOT19GUkFNRUJVRkZFUl9SRUFEWTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYi0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJd2FrZV91cCgmdmNzLT5mYl9xdWV1ZS5mcmFtZV93YWl0X3F1ZXVlKTsKKworCXZpbm9fY2FwdHVyZV9uZXh0KHZjcywgMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aW5vX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBpbnRyOworCXVuc2lnbmVkIGludCBmY19hLCBmY19iOworCWludCBkb25lX2EgPSAwOworCWludCBkb25lX2IgPSAwOworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jayk7CisKKwlpbnRyID0gdmluby0+aW50cl9zdGF0dXM7CisJZmNfYSA9IHZpbm8tPmEuZmllbGRfY291bnRlciAvIDI7CisJZmNfYiA9IHZpbm8tPmIuZmllbGRfY291bnRlciAvIDI7CisKKwkvLyBUT0RPOiBoYW5kbGUgZXJyb3ItaW50ZXJydXB0cyBpbiBzb21lIHNwZWNpYWwgd2F5ID8KKworIAlpZiAoaW50ciAmIFZJTk9fSU5UU1RBVF9BKSB7CisJCWlmIChpbnRyICYgVklOT19JTlRTVEFUX0FfRU9GKSB7CisJCQl2aW5vX2RydmRhdGEtPmEuZmllbGQrKzsKKwkJCWlmICh2aW5vX2RydmRhdGEtPmEuZmllbGQgPiAxKSB7CisJCQkJdmlub19kbWFfc3RvcCgmdmlub19kcnZkYXRhLT5hKTsKKwkJCQl2aW5vX2NsZWFyX2ludGVycnVwdCgmdmlub19kcnZkYXRhLT5hKTsKKwkJCQl2aW5vX2RydmRhdGEtPmEuZmllbGQgPSAwOworCQkJCWRvbmVfYSA9IDE7CisJCQl9CisJCQlkcHJpbnRrKCJpbnRyOiBjaGFubmVsIEEgZW5kLW9mLWZpZWxkIGludGVycnVwdDogIgorCQkJCSIlMDR4XG4iLCBpbnRyKTsKKwkJfSBlbHNlIHsKKwkJCXZpbm9fZG1hX3N0b3AoJnZpbm9fZHJ2ZGF0YS0+YSk7CisJCQl2aW5vX2NsZWFyX2ludGVycnVwdCgmdmlub19kcnZkYXRhLT5hKTsKKwkJCWRvbmVfYSA9IDE7CisJCQlkcHJpbnRrKCJjaGFubmVsIEEgZXJyb3IgaW50ZXJydXB0OiAlMDR4XG4iLCBpbnRyKTsKKwkJfQorCX0KKwlpZiAoaW50ciAmIFZJTk9fSU5UU1RBVF9CKSB7CisJCWlmIChpbnRyICYgVklOT19JTlRTVEFUX0JfRU9GKSB7CisJCQl2aW5vX2RydmRhdGEtPmIuZmllbGQrKzsKKwkJCWlmICh2aW5vX2RydmRhdGEtPmIuZmllbGQgPiAxKSB7CisJCQkJdmlub19kbWFfc3RvcCgmdmlub19kcnZkYXRhLT5iKTsKKwkJCQl2aW5vX2NsZWFyX2ludGVycnVwdCgmdmlub19kcnZkYXRhLT5iKTsKKwkJCQl2aW5vX2RydmRhdGEtPmIuZmllbGQgPSAwOworCQkJCWRvbmVfYiA9IDE7CisJCQl9CisJCQlkcHJpbnRrKCJpbnRyOiBjaGFubmVsIEIgZW5kLW9mLWZpZWxkIGludGVycnVwdDogIgorCQkJCSIlMDR4XG4iLCBpbnRyKTsKKwkJfSBlbHNlIHsKKwkJCXZpbm9fZG1hX3N0b3AoJnZpbm9fZHJ2ZGF0YS0+Yik7CisJCQl2aW5vX2NsZWFyX2ludGVycnVwdCgmdmlub19kcnZkYXRhLT5iKTsKKwkJCWRvbmVfYiA9IDE7CisJCQlkcHJpbnRrKCJjaGFubmVsIEIgZXJyb3IgaW50ZXJydXB0OiAlMDR4XG4iLCBpbnRyKTsKKwkJfQorCX0KKworCS8qIGFsd2F5cyByZW1lbWJlciB0byBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJdmluby0+aW50cl9zdGF0dXMgPSB+aW50cjsKKworCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPnZpbm9fbG9jayk7CisKKwlpZiAoZG9uZV9hKSB7CisJCXZpbm9fZnJhbWVfZG9uZSgmdmlub19kcnZkYXRhLT5hLCBmY19hKTsKKwkJZHByaW50aygiY2hhbm5lbCBBIGZyYW1lIGRvbmUsIGludGVycnVwdDogJWRcbiIsIGludHIpOworCX0KKwlpZiAoZG9uZV9iKSB7CisJCXZpbm9fZnJhbWVfZG9uZSgmdmlub19kcnZkYXRhLT5iLCBmY19iKTsKKwkJZHByaW50aygiY2hhbm5lbCBCIGZyYW1lIGRvbmUsIGludGVycnVwdDogJWRcbiIsIGludHIpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogVklOTyB2aWRlbyBpbnB1dCBtYW5hZ2VtZW50ICovCisKK3N0YXRpYyBpbnQgdmlub19nZXRfc2FhNzE5MV9pbnB1dChpbnQgaW5wdXQpCit7CisJc3dpdGNoIChpbnB1dCkgeworCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJCXJldHVybiBTQUE3MTkxX0lOUFVUX0NPTVBPU0lURTsKKwljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCQlyZXR1cm4gU0FBNzE5MV9JTlBVVF9TVklERU87CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5POiB2aW5vX2dldF9zYWE3MTkxX2lucHV0KCk6ICIKKwkJICAgICAgICJpbnZhbGlkIGlucHV0IVxuIik7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmlub19nZXRfc2FhNzE5MV9ub3JtKGludCBub3JtKQoreworCXN3aXRjaCAobm9ybSkgeworCWNhc2UgVklOT19EQVRBX05PUk1fQVVUTzoKKwkJcmV0dXJuIFNBQTcxOTFfTk9STV9BVVRPOworCWNhc2UgVklOT19EQVRBX05PUk1fUEFMOgorCQlyZXR1cm4gU0FBNzE5MV9OT1JNX1BBTDsKKwljYXNlIFZJTk9fREFUQV9OT1JNX05UU0M6CisJCXJldHVybiBTQUE3MTkxX05PUk1fTlRTQzsKKwljYXNlIFZJTk9fREFUQV9OT1JNX1NFQ0FNOgorCQlyZXR1cm4gU0FBNzE5MV9OT1JNX1NFQ0FNOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiVklOTzogdmlub19nZXRfc2FhNzE5MV9ub3JtKCk6ICIKKwkJICAgICAgICJpbnZhbGlkIG5vcm0hXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KK30KKworLyogZXhlY3V0ZSB3aXRoIGlucHV0X2xvY2sgbG9ja2VkICovCitzdGF0aWMgaW50IHZpbm9faXNfaW5wdXRfb3duZXIoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXN3aXRjaCh2Y3MtPmlucHV0KSB7CisJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCQlyZXR1cm4gKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9PSB2Y3MtPmNoYW5uZWwpOworCWNhc2UgVklOT19JTlBVVF9EMToKKwkJcmV0dXJuICh2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9PSB2Y3MtPmNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCB2aW5vX2FjcXVpcmVfaW5wdXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCWludCByZXQgPSAwOworCisJZHByaW50aygidmlub19hY3F1aXJlX2lucHV0KCk6XG4iKTsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCS8qIEZpcnN0IHRyeSBEMSBhbmQgdGhlbiBTQUE3MTkxICovCisJaWYgKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlcgorCSAgICAmJiAodmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPT0gVklOT19OT19DSEFOTkVMKSkgeworCQlpZiAoaTJjX3VzZV9jbGllbnQodmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyKSkgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPSB2Y3MtPmNoYW5uZWw7CisJCXZjcy0+aW5wdXQgPSBWSU5PX0lOUFVUX0QxOworCQl2Y3MtPmRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX0QxOworCX0gZWxzZSBpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLmRyaXZlcgorCQkgICAmJiAodmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID09IFZJTk9fTk9fQ0hBTk5FTCkpIHsKKwkJaW50IHNhYTcxOTFfaW5wdXQ7CisJCWludCBzYWE3MTkxX25vcm07CisKKwkJaWYgKGkyY191c2VfY2xpZW50KHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKworCQl2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPSB2Y3MtPmNoYW5uZWw7CisJCXZjcy0+aW5wdXQgPSBWSU5PX0lOUFVUX0NPTVBPU0lURTsKKwkJdmNzLT5kYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9QQUw7CisKKwkJc2FhNzE5MV9pbnB1dCA9IHZpbm9fZ2V0X3NhYTcxOTFfaW5wdXQodmNzLT5pbnB1dCk7CisJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TRVRfSU5QVVQsICZzYWE3MTkxX2lucHV0KTsKKworCQlzYWE3MTkxX25vcm0gPSB2aW5vX2dldF9zYWE3MTkxX25vcm0odmNzLT5kYXRhX25vcm0pOworCQlpMmNfZGVjb2Rlcl9jb21tYW5kKERFQ09ERVJfU0FBNzE5MV9TRVRfTk9STSwgJnNhYTcxOTFfbm9ybSk7CisJfSBlbHNlIHsKKwkJdmNzLT5pbnB1dCA9ICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8KKwkJCXZpbm9fZHJ2ZGF0YS0+Yi5pbnB1dCA6IHZpbm9fZHJ2ZGF0YS0+YS5pbnB1dDsKKwkJdmNzLT5kYXRhX25vcm0gPSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCQl2aW5vX2RydmRhdGEtPmIuZGF0YV9ub3JtIDogdmlub19kcnZkYXRhLT5hLmRhdGFfbm9ybTsKKwl9CisKKwlpZiAodmNzLT5pbnB1dCA9PSBWSU5PX0lOUFVUX05PTkUpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHZpbm9faXNfaW5wdXRfb3duZXIodmNzKSkgeworCQl2aW5vX3NldF9kZWZhdWx0X2NsaXBwaW5nKHZjcyk7CisJCXZpbm9fc2V0X2RlZmF1bHRfZnJhbWVyYXRlKHZjcyk7CisJfQorCisJZHByaW50aygidmlub19hY3F1aXJlX2lucHV0KCk6ICVzXG4iLCB2aW5vX2lucHV0c1t2Y3MtPmlucHV0XS5uYW1lKTsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aW5vX3NldF9pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsIGludCBpbnB1dCkKK3sKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MyID0gKHZjcy0+Y2hhbm5lbCA9PSBWSU5PX0NIQU5ORUxfQSkgPworCQkmdmlub19kcnZkYXRhLT5iIDogJnZpbm9fZHJ2ZGF0YS0+YTsKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoInZpbm9fc2V0X2lucHV0KCk6XG4iKTsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCWlmICh2Y3MtPmlucHV0ID09IGlucHV0KQorCQlnb3RvIG91dDsKKworCXN3aXRjaChpbnB1dCkgeworCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJY2FzZSBWSU5PX0lOUFVUX1NWSURFTzoKKwkJaWYgKCF2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAodmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID09IFZJTk9fTk9fQ0hBTk5FTCkgeworCQkJaWYgKGkyY191c2VfY2xpZW50KHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpKSB7CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9IHZjcy0+Y2hhbm5lbDsKKwkJfQorCisJCWlmICh2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPT0gdmNzLT5jaGFubmVsKSB7CisJCQlpbnQgc2FhNzE5MV9pbnB1dDsKKwkJCWludCBzYWE3MTkxX25vcm07CisKKwkJCXZjcy0+aW5wdXQgPSBpbnB1dDsKKwkJCXZjcy0+ZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fUEFMOworCisJCQlzYWE3MTkxX2lucHV0ID0gdmlub19nZXRfc2FhNzE5MV9pbnB1dCh2Y3MtPmlucHV0KTsKKwkJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TRVRfSU5QVVQsICZzYWE3MTkxX2lucHV0KTsKKwkJCXNhYTcxOTFfbm9ybSA9IHZpbm9fZ2V0X3NhYTcxOTFfbm9ybSh2Y3MtPmRhdGFfbm9ybSk7CisJCQlpMmNfZGVjb2Rlcl9jb21tYW5kKERFQ09ERVJfU0FBNzE5MV9TRVRfTk9STSwKKwkJCQkJICAgICZzYWE3MTkxX25vcm0pOworCQl9IGVsc2UgeworCQkJaWYgKHZjczItPmlucHV0ICE9IGlucHV0KSB7CisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQl2Y3MtPmlucHV0ID0gaW5wdXQ7CisJCQl2Y3MtPmRhdGFfbm9ybSA9IHZjczItPmRhdGFfbm9ybTsKKwkJfQorCisJCWlmICh2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9PSB2Y3MtPmNoYW5uZWwpIHsKKwkJCS8qIFRyYW5zZmVyIHRoZSBvd25lcnNoaXAgb3IgcmVsZWFzZSB0aGUgaW5wdXQgKi8KKwkJCWlmICh2Y3MyLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0QxKSB7CisJCQkJdmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPSB2Y3MyLT5jaGFubmVsOworCQkJfSBlbHNlIHsKKwkJCQlpMmNfcmVsZWFzZV9jbGllbnQodmlub19kcnZkYXRhLT4KKwkJCQkJCSAgIGNhbWVyYS5kcml2ZXIpOworCQkJCXZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID0gVklOT19OT19DSEFOTkVMOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgVklOT19JTlBVVF9EMToKKwkJaWYgKCF2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICh2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9PSBWSU5PX05PX0NIQU5ORUwpIHsKKwkJCWlmIChpMmNfdXNlX2NsaWVudCh2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpKSB7CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID0gdmNzLT5jaGFubmVsOworCQl9CisKKwkJaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9PSB2Y3MtPmNoYW5uZWwpIHsKKwkJCS8qIFRyYW5zZmVyIHRoZSBvd25lcnNoaXAgb3IgcmVsZWFzZSB0aGUgaW5wdXQgKi8KKwkJCWlmICgodmNzMi0+aW5wdXQgPT0gVklOT19JTlBVVF9DT01QT1NJVEUpIHx8CisJCQkJICh2Y3MyLT5pbnB1dCA9PSBWSU5PX0lOUFVUX1NWSURFTykpIHsKKwkJCQl2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPSB2Y3MyLT5jaGFubmVsOworCQkJfSBlbHNlIHsKKwkJCQlpMmNfcmVsZWFzZV9jbGllbnQodmlub19kcnZkYXRhLT4KKwkJCQkJCSAgIGRlY29kZXIuZHJpdmVyKTsKKwkJCQl2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPSBWSU5PX05PX0NIQU5ORUw7CisJCQl9CisJCX0KKworCQl2Y3MtPmlucHV0ID0gaW5wdXQ7CisJCXZjcy0+ZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fRDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXZpbm9fc2V0X2RlZmF1bHRfY2xpcHBpbmcodmNzKTsKKwl2aW5vX3NldF9kZWZhdWx0X2ZyYW1lcmF0ZSh2Y3MpOworCisJZHByaW50aygidmlub19zZXRfaW5wdXQoKTogJXNcbiIsIHZpbm9faW5wdXRzW3Zjcy0+aW5wdXRdLm5hbWUpOworCitvdXQ6CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2aW5vX3JlbGVhc2VfaW5wdXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjczIgPSAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/CisJCSZ2aW5vX2RydmRhdGEtPmIgOiAmdmlub19kcnZkYXRhLT5hOworCisJZHByaW50aygidmlub19yZWxlYXNlX2lucHV0KCk6XG4iKTsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCS8qIFJlbGVhc2Ugb3duZXJzaGlwIG9mIHRoZSBjaGFubmVsCisJICogYW5kIGlmIHRoZSBvdGhlciBjaGFubmVsIHRha2VzIGlucHV0IGZyb20KKwkgKiB0aGUgc2FtZSBzb3VyY2UsIHRyYW5zZmVyIHRoZSBvd25lcnNoaXAgKi8KKwlpZiAodmlub19kcnZkYXRhLT5jYW1lcmEub3duZXIgPT0gdmNzLT5jaGFubmVsKSB7CisJCWlmICh2Y3MyLT5pbnB1dCA9PSBWSU5PX0lOUFVUX0QxKSB7CisJCQl2aW5vX2RydmRhdGEtPmNhbWVyYS5vd25lciA9IHZjczItPmNoYW5uZWw7CisJCX0gZWxzZSB7CisJCQlpMmNfcmVsZWFzZV9jbGllbnQodmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyKTsKKwkJCXZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLm93bmVyID0gVklOT19OT19DSEFOTkVMOworCQl9CisJfSBlbHNlIGlmICh2aW5vX2RydmRhdGEtPmRlY29kZXIub3duZXIgPT0gdmNzLT5jaGFubmVsKSB7CisJCWlmICgodmNzMi0+aW5wdXQgPT0gVklOT19JTlBVVF9DT01QT1NJVEUpIHx8CisJCQkgKHZjczItPmlucHV0ID09IFZJTk9fSU5QVVRfU1ZJREVPKSkgeworCQkJdmlub19kcnZkYXRhLT5kZWNvZGVyLm93bmVyID0gdmNzMi0+Y2hhbm5lbDsKKwkJfSBlbHNlIHsKKwkJCWkyY19yZWxlYXNlX2NsaWVudCh2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyKTsKKwkJCXZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5vd25lciA9IFZJTk9fTk9fQ0hBTk5FTDsKKwkJfQorCX0KKwl2Y3MtPmlucHV0ID0gVklOT19JTlBVVF9OT05FOworCisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7Cit9CisKKy8qIGV4ZWN1dGUgd2l0aCBpbnB1dF9sb2NrIGxvY2tlZCAqLworc3RhdGljIGludCB2aW5vX3NldF9kYXRhX25vcm0oc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICAgdW5zaWduZWQgaW50IGRhdGFfbm9ybSkKK3sKKwlpbnQgc2FhNzE5MV9ub3JtOworCisJc3dpdGNoICh2Y3MtPmlucHV0KSB7CisJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQkvKiBvbmx5IG9uZSAibm9ybSIgc3VwcG9ydGVkICovCisJCWlmIChkYXRhX25vcm0gIT0gVklOT19EQVRBX05PUk1fRDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCisJCXNhYTcxOTFfbm9ybSA9IHZpbm9fZ2V0X3NhYTcxOTFfbm9ybShkYXRhX25vcm0pOworCisJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TQUE3MTkxX1NFVF9OT1JNLCAmc2FhNzE5MV9ub3JtKTsKKwkJdmNzLT5kYXRhX25vcm0gPSBkYXRhX25vcm07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBWNEwyIGhlbHBlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCB2aW5vX2ZpbmRfZGF0YV9mb3JtYXQoX191MzIgcGl4ZWxmb3JtYXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVklOT19EQVRBX0ZNVF9DT1VOVDsgaSsrKSB7CisJCWlmICh2aW5vX2RhdGFfZm9ybWF0c1tpXS5waXhlbGZvcm1hdCA9PSBwaXhlbGZvcm1hdCkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiBWSU5PX0RBVEFfRk1UX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgdmlub19lbnVtX2RhdGFfbm9ybShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsIF9fdTMyIGluZGV4KQoreworCWludCBkYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9OT05FOworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCXN3aXRjaCh2Y3MtPmlucHV0KSB7CisJY2FzZSBWSU5PX0lOUFVUX0NPTVBPU0lURToKKwljYXNlIFZJTk9fSU5QVVRfU1ZJREVPOgorCQlpZiAoaW5kZXggPT0gMCkgeworCQkJZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fUEFMOworCQl9IGVsc2UgaWYgKGluZGV4ID09IDEpIHsKKwkJCWRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX05UU0M7CisJCX0gZWxzZSBpZiAoaW5kZXggPT0gMikgeworCQkJZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fU0VDQU07CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQlpZiAoaW5kZXggPT0gMCkgeworCQkJZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fRDE7CisJCX0KKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0dXJuIGRhdGFfbm9ybTsKK30KKworc3RhdGljIGludCB2aW5vX2VudW1faW5wdXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLCBfX3UzMiBpbmRleCkKK3sKKwlpbnQgaW5wdXQgPSBWSU5PX0lOUFVUX05PTkU7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIgJiYgdmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyKSB7CisJCXN3aXRjaCAoaW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJaW5wdXQgPSBWSU5PX0lOUFVUX0NPTVBPU0lURTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpbnB1dCA9IFZJTk9fSU5QVVRfU1ZJREVPOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlucHV0ID0gVklOT19JTlBVVF9EMTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICh2aW5vX2RydmRhdGEtPmRlY29kZXIuZHJpdmVyKSB7CisJCXN3aXRjaCAoaW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJaW5wdXQgPSBWSU5PX0lOUFVUX0NPTVBPU0lURTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpbnB1dCA9IFZJTk9fSU5QVVRfU1ZJREVPOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHZpbm9fZHJ2ZGF0YS0+Y2FtZXJhLmRyaXZlcikgeworCQlzd2l0Y2ggKGluZGV4KSB7CisJCWNhc2UgMDoKKwkJCWlucHV0ID0gVklOT19JTlBVVF9EMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0dXJuIGlucHV0OworfQorCisvKiBleGVjdXRlIHdpdGggaW5wdXRfbG9jayBsb2NrZWQgKi8KK3N0YXRpYyBfX3UzMiB2aW5vX2ZpbmRfaW5wdXRfaW5kZXgoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCV9fdTMyIGluZGV4ID0gMDsKKwkvLyBGSVhNRTogZGV0ZWN0IHdoZW4gbm8gaW5wdXRzIGF2YWlsYWJsZQorCisJaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIgJiYgdmlub19kcnZkYXRhLT5jYW1lcmEuZHJpdmVyKSB7CisJCXN3aXRjaCAodmNzLT5pbnB1dCkgeworCQljYXNlIFZJTk9fSU5QVVRfQ09NUE9TSVRFOgorCQkJaW5kZXggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgVklOT19JTlBVVF9TVklERU86CisJCQlpbmRleCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQkJaW5kZXggPSAyOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHZpbm9fZHJ2ZGF0YS0+ZGVjb2Rlci5kcml2ZXIpIHsKKwkJc3dpdGNoICh2Y3MtPmlucHV0KSB7CisJCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJCQlpbmRleCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWSU5PX0lOUFVUX1NWSURFTzoKKwkJCWluZGV4ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICh2aW5vX2RydmRhdGEtPmNhbWVyYS5kcml2ZXIpIHsKKwkJc3dpdGNoICh2Y3MtPmlucHV0KSB7CisJCWNhc2UgVklOT19JTlBVVF9EMToKKwkJCWluZGV4ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGluZGV4OworfQorCisvKiBWNEwyIGlvY3RscyAqLworCitzdGF0aWMgdm9pZCB2aW5vX3Y0bDJfcXVlcnljYXAoc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCW1lbXNldChjYXAsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5KSk7CisKKwlzdHJjcHkoY2FwLT5kcml2ZXIsIHZpbm9fZHJpdmVyX25hbWUpOworCXN0cmNweShjYXAtPmNhcmQsIHZpbm9fZHJpdmVyX2Rlc2NyaXB0aW9uKTsKKwlzdHJjcHkoY2FwLT5idXNfaW5mbywgdmlub19idXNfbmFtZSk7CisJY2FwLT52ZXJzaW9uID0gVklOT19WRVJTSU9OX0NPREU7CisJY2FwLT5jYXBhYmlsaXRpZXMgPQorCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJVjRMMl9DQVBfU1RSRUFNSU5HOworCS8vIFY0TDJfQ0FQX09WRVJMQVksIFY0TDJfQ0FQX1JFQURXUklURQorfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9lbnVtaW5wdXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQoreworCV9fdTMyIGluZGV4ID0gaS0+aW5kZXg7CisJaW50IGlucHV0OworCWRwcmludGsoInJlcXVlc3RlZCBpbmRleCA9ICVkXG4iLCBpbmRleCk7CisKKwlpbnB1dCA9IHZpbm9fZW51bV9pbnB1dCh2Y3MsIGluZGV4KTsKKwlpZiAoaW5wdXQgPT0gVklOT19JTlBVVF9OT05FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChpLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKKworCWktPmluZGV4ID0gaW5kZXg7CisJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJaS0+c3RkID0gdmlub19pbnB1dHNbaW5wdXRdLnN0ZDsKKwlzdHJjcHkoaS0+bmFtZSwgdmlub19pbnB1dHNbaW5wdXRdLm5hbWUpOworCisJaWYgKChpbnB1dCA9PSBWSU5PX0lOUFVUX0NPTVBPU0lURSkKKwkgICAgfHwgKGlucHV0ID09IFZJTk9fSU5QVVRfU1ZJREVPKSkgeworCQlzdHJ1Y3Qgc2FhNzE5MV9zdGF0dXMgc3RhdHVzOworCQlpMmNfZGVjb2Rlcl9jb21tYW5kKERFQ09ERVJfU0FBNzE5MV9HRVRfU1RBVFVTLCAmc3RhdHVzKTsKKwkJaS0+c3RhdHVzIHw9IHN0YXR1cy5zaWduYWwgPyAwIDogVjRMMl9JTl9TVF9OT19TSUdOQUw7CisJCWktPnN0YXR1cyB8PSBzdGF0dXMuY29sb3IgPyAwIDogVjRMMl9JTl9TVF9OT19DT0xPUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZ19pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQoreworCV9fdTMyIGluZGV4OworCWludCBpbnB1dDsKKworCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwlpbnB1dCA9IHZjcy0+aW5wdXQ7CisJaW5kZXggPSB2aW5vX2ZpbmRfaW5wdXRfaW5kZXgodmNzKTsKKwlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCWRwcmludGsoImlucHV0ID0gJWRcbiIsIGlucHV0KTsKKworCWlmIChpbnB1dCA9PSBWSU5PX0lOUFVUX05PTkUpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGksIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOworCisJaS0+aW5kZXggPSBpbmRleDsKKwlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlpLT5zdGQgPSB2aW5vX2lucHV0c1tpbnB1dF0uc3RkOworCXN0cmNweShpLT5uYW1lLCB2aW5vX2lucHV0c1tpbnB1dF0ubmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfc19pbnB1dChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQoreworCWludCBpbnB1dDsKKwlkcHJpbnRrKCJyZXF1ZXN0ZWQgaW5wdXQgPSAlZFxuIiwgaS0+aW5kZXgpOworCisJaW5wdXQgPSB2aW5vX2VudW1faW5wdXQodmNzLCBpLT5pbmRleCk7CisJaWYgKGlucHV0ID09IFZJTk9fSU5QVVRfTk9ORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmlub19zZXRfaW5wdXQodmNzLCBpbnB1dCk7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2VudW1zdGQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqcykKK3sKKwlpbnQgaW5kZXggPSBzLT5pbmRleDsKKwlpbnQgZGF0YV9ub3JtID0gdmlub19lbnVtX2RhdGFfbm9ybSh2Y3MsIGluZGV4KTsKKwlkcHJpbnRrKCJzdGFuZGFyZCBpbmRleCA9ICVkXG4iLCBpbmRleCk7CisKKwlpZiAoZGF0YV9ub3JtID09IFZJTk9fREFUQV9OT1JNX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJZHByaW50aygic3RhbmRhcmQgbmFtZSA9ICVzXG4iLAorCSAgICAgICB2aW5vX2RhdGFfbm9ybXNbZGF0YV9ub3JtXS5kZXNjcmlwdGlvbik7CisKKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSk7CisJcy0+aW5kZXggPSBpbmRleDsKKworCXMtPmlkID0gdmlub19kYXRhX25vcm1zW2RhdGFfbm9ybV0uc3RkOworCXMtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CisJcy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPQorCQl2aW5vX2RhdGFfbm9ybXNbZGF0YV9ub3JtXS5mcHNfbWF4OworCXMtPmZyYW1lbGluZXMgPQorCQl2aW5vX2RhdGFfbm9ybXNbZGF0YV9ub3JtXS5mcmFtZWxpbmVzOworCXN0cmNweShzLT5uYW1lLAorCSAgICAgICB2aW5vX2RhdGFfbm9ybXNbZGF0YV9ub3JtXS5kZXNjcmlwdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZ19zdGQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJZHByaW50aygiY3VycmVudCBzdGFuZGFyZCA9ICVkXG4iLCB2Y3MtPmRhdGFfbm9ybSk7CisJKnN0ZCA9IHZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV0uc3RkOworCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3Nfc3RkKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgIHY0bDJfc3RkX2lkICpzdGQpCit7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwkvKiBjaGVjayBpZiB0aGUgc3RhbmRhcmQgaXMgdmFsaWQgZm9yIHRoZSBjdXJyZW50IGlucHV0ICovCisJaWYgKHZpbm9faXNfaW5wdXRfb3duZXIodmNzKQorCSAgICAmJiAodmlub19pbnB1dHNbdmNzLT5pbnB1dF0uc3RkICYgKCpzdGQpKSkgeworCQlkcHJpbnRrKCJzdGFuZGFyZCBhY2NlcHRlZFxuIik7CisKKwkJLyogY2hhbmdlIHRoZSB2aWRlbyBub3JtIGZvciBTQUE3MTkxCisJCSAqIGFuZCBhY2NlcHQgTlRTQyBmb3IgRDEgKGRvIG5vdGhpbmcpICovCisKKwkJaWYgKHZjcy0+aW5wdXQgPT0gVklOT19JTlBVVF9EMSkKKwkJCWdvdG8gb3V0OworCisJCWlmICgoKnN0ZCkgJiBWNEwyX1NURF9QQUwpIHsKKwkJCXZpbm9fc2V0X2RhdGFfbm9ybSh2Y3MsIFZJTk9fREFUQV9OT1JNX1BBTCk7CisJCQl2Y3MtPmRhdGFfbm9ybSA9IFZJTk9fREFUQV9OT1JNX1BBTDsKKwkJfSBlbHNlIGlmICgoKnN0ZCkgJiBWNEwyX1NURF9OVFNDKSB7CisJCQl2aW5vX3NldF9kYXRhX25vcm0odmNzLCBWSU5PX0RBVEFfTk9STV9OVFNDKTsKKwkJCXZjcy0+ZGF0YV9ub3JtID0gVklOT19EQVRBX05PUk1fTlRTQzsKKwkJfSBlbHNlIGlmICgoKnN0ZCkgJiBWNEwyX1NURF9TRUNBTSkgeworCQkJdmlub19zZXRfZGF0YV9ub3JtKHZjcywgVklOT19EQVRBX05PUk1fU0VDQU0pOworCQkJdmNzLT5kYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9TRUNBTTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZW51bV9mbXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZmQpCit7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSBmZC0+dHlwZTsKKwlpbnQgaW5kZXggPSBmZC0+aW5kZXg7CisJZHByaW50aygiZm9ybWF0IGluZGV4ID0gJWRcbiIsIGluZGV4KTsKKworCXN3aXRjaCAoZmQtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJaWYgKChmZC0+aW5kZXggPCAwKSB8fAorCQkgICAgKGZkLT5pbmRleCA+PSBWSU5PX0RBVEFfRk1UX0NPVU5UKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkcHJpbnRrKCJmb3JtYXQgbmFtZSA9ICVzXG4iLAorCQkgICAgICAgdmlub19kYXRhX2Zvcm1hdHNbaW5kZXhdLmRlc2NyaXB0aW9uKTsKKworCQltZW1zZXQoZmQsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSk7CisJCWZkLT5pbmRleCA9IGluZGV4OworCQlmZC0+dHlwZSA9IHR5cGU7CisJCWZkLT5waXhlbGZvcm1hdCA9IHZpbm9fZGF0YV9mb3JtYXRzW2luZGV4XS5waXhlbGZvcm1hdDsKKwkJc3RyY3B5KGZkLT5kZXNjcmlwdGlvbiwgdmlub19kYXRhX2Zvcm1hdHNbaW5kZXhdLmRlc2NyaXB0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3RyeV9mbXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyB0ZW1wdmNzOworCisJc3dpdGNoIChmLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGYgPSAmZi0+Zm10LnBpeDsKKworCQlkcHJpbnRrKCJyZXF1ZXN0ZWQ6IHcgPSAlZCwgaCA9ICVkXG4iLAorCQkgICAgICAgcGYtPndpZHRoLCBwZi0+aGVpZ2h0KTsKKworCQlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJCW1lbWNweSgmdGVtcHZjcywgdmNzLCBzaXplb2Yoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncykpOworCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCQl0ZW1wdmNzLmRhdGFfZm9ybWF0ID0gdmlub19maW5kX2RhdGFfZm9ybWF0KHBmLT5waXhlbGZvcm1hdCk7CisJCWlmICh0ZW1wdmNzLmRhdGFfZm9ybWF0ID09IFZJTk9fREFUQV9GTVRfTk9ORSkgeworCQkJdGVtcHZjcy5kYXRhX2Zvcm1hdCA9IFZJTk9fREFUQV9GTVRfUkdCMzI7CisJCQlwZi0+cGl4ZWxmb3JtYXQgPQorCQkJCXZpbm9fZGF0YV9mb3JtYXRzW3RlbXB2Y3MuZGF0YV9mb3JtYXRdLgorCQkJCXBpeGVsZm9ybWF0OworCQl9CisKKwkJLyogZGF0YSBmb3JtYXQgbXVzdCBiZSBzZXQgYmVmb3JlIGNsaXBwaW5nL3NjYWxpbmcgKi8KKwkJdmlub19zZXRfc2NhbGluZygmdGVtcHZjcywgcGYtPndpZHRoLCBwZi0+aGVpZ2h0KTsKKworCQlkcHJpbnRrKCJkYXRhIGZvcm1hdCA9ICVzXG4iLAorCQkgICAgICAgdmlub19kYXRhX2Zvcm1hdHNbdGVtcHZjcy5kYXRhX2Zvcm1hdF0uZGVzY3JpcHRpb24pOworCisJCXBmLT53aWR0aCA9ICh0ZW1wdmNzLmNsaXBwaW5nLnJpZ2h0IC0gdGVtcHZjcy5jbGlwcGluZy5sZWZ0KSAvCisJCQl0ZW1wdmNzLmRlY2ltYXRpb247CisJCXBmLT5oZWlnaHQgPSAodGVtcHZjcy5jbGlwcGluZy5ib3R0b20gLSB0ZW1wdmNzLmNsaXBwaW5nLnRvcCkgLworCQkJdGVtcHZjcy5kZWNpbWF0aW9uOworCisJCXBmLT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJcGYtPmJ5dGVzcGVybGluZSA9IHRlbXB2Y3MubGluZV9zaXplOworCQlwZi0+c2l6ZWltYWdlID0gdGVtcHZjcy5saW5lX3NpemUgKgorCQkJKHRlbXB2Y3MuY2xpcHBpbmcuYm90dG9tIC0gdGVtcHZjcy5jbGlwcGluZy50b3ApIC8KKwkJCXRlbXB2Y3MuZGVjaW1hdGlvbjsKKwkJcGYtPmNvbG9yc3BhY2UgPQorCQkJdmlub19kYXRhX2Zvcm1hdHNbdGVtcHZjcy5kYXRhX2Zvcm1hdF0uY29sb3JzcGFjZTsKKworCQlwZi0+cHJpdiA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfZ19mbXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBmID0gJmYtPmZtdC5waXg7CisJCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCQlwZi0+d2lkdGggPSAodmNzLT5jbGlwcGluZy5yaWdodCAtIHZjcy0+Y2xpcHBpbmcubGVmdCkgLworCQkJdmNzLT5kZWNpbWF0aW9uOworCQlwZi0+aGVpZ2h0ID0gKHZjcy0+Y2xpcHBpbmcuYm90dG9tIC0gdmNzLT5jbGlwcGluZy50b3ApIC8KKwkJCXZjcy0+ZGVjaW1hdGlvbjsKKwkJcGYtPnBpeGVsZm9ybWF0ID0KKwkJCXZpbm9fZGF0YV9mb3JtYXRzW3Zjcy0+ZGF0YV9mb3JtYXRdLnBpeGVsZm9ybWF0OworCisJCXBmLT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJcGYtPmJ5dGVzcGVybGluZSA9IHZjcy0+bGluZV9zaXplOworCQlwZi0+c2l6ZWltYWdlID0gdmNzLT5saW5lX3NpemUgKgorCQkJKHZjcy0+Y2xpcHBpbmcuYm90dG9tIC0gdmNzLT5jbGlwcGluZy50b3ApIC8KKwkJCXZjcy0+ZGVjaW1hdGlvbjsKKwkJcGYtPmNvbG9yc3BhY2UgPQorCQkJdmlub19kYXRhX2Zvcm1hdHNbdmNzLT5kYXRhX2Zvcm1hdF0uY29sb3JzcGFjZTsKKworCQlwZi0+cHJpdiA9IDA7CisKKwkJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfc19mbXQoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWludCBkYXRhX2Zvcm1hdDsKKworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBmID0gJmYtPmZtdC5waXg7CisJCXNwaW5fbG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKworCQlpZiAoIXZpbm9faXNfaW5wdXRfb3duZXIodmNzKSkgeworCQkJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRhdGFfZm9ybWF0ID0gdmlub19maW5kX2RhdGFfZm9ybWF0KHBmLT5waXhlbGZvcm1hdCk7CisJCWlmIChkYXRhX2Zvcm1hdCA9PSBWSU5PX0RBVEFfRk1UX05PTkUpIHsKKwkJCXZjcy0+ZGF0YV9mb3JtYXQgPSBWSU5PX0RBVEFfRk1UX1JHQjMyOworCQkJcGYtPnBpeGVsZm9ybWF0ID0KKwkJCQl2aW5vX2RhdGFfZm9ybWF0c1t2Y3MtPmRhdGFfZm9ybWF0XS4KKwkJCQlwaXhlbGZvcm1hdDsKKwkJfSBlbHNlIHsKKwkJCXZjcy0+ZGF0YV9mb3JtYXQgPSBkYXRhX2Zvcm1hdDsKKwkJfQorCisJCS8qIGRhdGEgZm9ybWF0IG11c3QgYmUgc2V0IGJlZm9yZSBjbGlwcGluZy9zY2FsaW5nICovCisJCXZpbm9fc2V0X3NjYWxpbmcodmNzLCBwZi0+d2lkdGgsIHBmLT5oZWlnaHQpOworCisJCWRwcmludGsoImRhdGEgZm9ybWF0ID0gJXNcbiIsCisJCSAgICAgICB2aW5vX2RhdGFfZm9ybWF0c1t2Y3MtPmRhdGFfZm9ybWF0XS5kZXNjcmlwdGlvbik7CisKKwkJcGYtPndpZHRoID0gdmNzLT5jbGlwcGluZy5yaWdodCAtIHZjcy0+Y2xpcHBpbmcubGVmdDsKKwkJcGYtPmhlaWdodCA9IHZjcy0+Y2xpcHBpbmcuYm90dG9tIC0gdmNzLT5jbGlwcGluZy50b3A7CisKKwkJcGYtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQlwZi0+Ynl0ZXNwZXJsaW5lID0gdmNzLT5saW5lX3NpemU7CisJCXBmLT5zaXplaW1hZ2UgPSB2Y3MtPmxpbmVfc2l6ZSAqCisJCQkodmNzLT5jbGlwcGluZy5ib3R0b20gLSB2Y3MtPmNsaXBwaW5nLnRvcCkgLworCQkJdmNzLT5kZWNpbWF0aW9uOworCQlwZi0+Y29sb3JzcGFjZSA9CisJCQl2aW5vX2RhdGFfZm9ybWF0c1t2Y3MtPmRhdGFfZm9ybWF0XS5jb2xvcnNwYWNlOworCisJCXBmLT5wcml2ID0gMDsKKworCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9jcm9wY2FwKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY2NhcCkKK3sKKwljb25zdCBzdHJ1Y3Qgdmlub19kYXRhX25vcm0gKm5vcm07CisKKwlzd2l0Y2ggKGNjYXAtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQlub3JtID0gJnZpbm9fZGF0YV9ub3Jtc1t2Y3MtPmRhdGFfbm9ybV07CisJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCWNjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKKwkJY2NhcC0+Ym91bmRzLnRvcCA9IDA7CisJCWNjYXAtPmJvdW5kcy53aWR0aCA9IG5vcm0tPndpZHRoOworCQljY2FwLT5ib3VuZHMuaGVpZ2h0ID0gbm9ybS0+aGVpZ2h0OworCQltZW1jcHkoJmNjYXAtPmRlZnJlY3QsICZjY2FwLT5ib3VuZHMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHY0bDJfcmVjdCkpOworCisJCWNjYXAtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9IDE7CisJCWNjYXAtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yID0gMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2dfY3JvcChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgc3RydWN0IHY0bDJfY3JvcCAqYykKK3sKKwlzd2l0Y2ggKGMtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCWMtPmMubGVmdCA9IHZjcy0+Y2xpcHBpbmcubGVmdDsKKwkJYy0+Yy50b3AgPSB2Y3MtPmNsaXBwaW5nLnRvcDsKKwkJYy0+Yy53aWR0aCA9IHZjcy0+Y2xpcHBpbmcucmlnaHQgLSB2Y3MtPmNsaXBwaW5nLmxlZnQ7CisJCWMtPmMuaGVpZ2h0ID0gdmNzLT5jbGlwcGluZy5ib3R0b20gLSB2Y3MtPmNsaXBwaW5nLnRvcDsKKworCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3NfY3JvcChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgc3RydWN0IHY0bDJfY3JvcCAqYykKK3sKKwlzd2l0Y2ggKGMtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCWlmICghdmlub19pc19pbnB1dF9vd25lcih2Y3MpKSB7CisJCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXZpbm9fc2V0X2NsaXBwaW5nKHZjcywgYy0+Yy5sZWZ0LCBjLT5jLnRvcCwKKwkJCQkgIGMtPmMud2lkdGgsIGMtPmMuaGVpZ2h0KTsKKworCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX2dfcGFybShzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqc3ApCit7CisJc3dpdGNoIChzcC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtICpjcCA9ICZzcC0+cGFybS5jYXB0dXJlOworCQltZW1zZXQoY3AsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSkpOworCisJCWNwLT5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCQljcC0+dGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDE7CisKKwkJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCQljcC0+dGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gdmNzLT5mcHM7CisJCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJCS8vIFRPRE86IGNwLT5yZWFkYnVmZmVycyA9IHh4eDsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9zX3Bhcm0oc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnNwKQoreworCXN3aXRjaCAoc3AtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogeworCQlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSAqY3AgPSAmc3AtPnBhcm0uY2FwdHVyZTsKKworCQlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisJCWlmICghdmlub19pc19pbnB1dF9vd25lcih2Y3MpKSB7CisJCQlzcGluX3VubG9jaygmdmlub19kcnZkYXRhLT5pbnB1dF9sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKChjcC0+dGltZXBlcmZyYW1lLm51bWVyYXRvciA9PSAwKSB8fAorCQkgICAgKGNwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPT0gMCkpIHsKKwkJCS8qIHJlc2V0IGZyYW1lcmF0ZSAqLworCQkJdmlub19zZXRfZGVmYXVsdF9mcmFtZXJhdGUodmNzKTsKKwkJfSBlbHNlIHsKKwkJCXZpbm9fc2V0X2ZyYW1lcmF0ZSh2Y3MsIGNwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgLworCQkJCQkgICBjcC0+dGltZXBlcmZyYW1lLm51bWVyYXRvcik7CisJCX0KKwkJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwkJLy8gVE9ETzogc2V0IGJ1ZmZlcnMgYWNjb3JkaW5nIHRvIGNwLT5yZWFkYnVmZmVycworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3JlcWJ1ZnMoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmIpCit7CisJaWYgKHZjcy0+cmVhZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAocmItPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogeworCQkvLyBUT0RPOiBjaGVjayBxdWV1ZSB0eXBlCisJCWlmIChyYi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJCWRwcmludGsoInR5cGUgbm90IG1tYXBcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodmlub19pc19jYXB0dXJpbmcodmNzKSkgeworCQkJZHByaW50aygiYnVzeSwgY2FwdHVyaW5nXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlkcHJpbnRrKCJjb3VudCA9ICVkXG4iLCByYi0+Y291bnQpOworCQlpZiAocmItPmNvdW50ID4gMCkgeworCQkJaWYgKHZpbm9fcXVldWVfaGFzX21hcHBlZF9idWZmZXJzKCZ2Y3MtPmZiX3F1ZXVlKSkgeworCQkJCWRwcmludGsoImJ1c3ksIGJ1ZmZlcnMgc3RpbGwgbWFwcGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfSBlbHNlIHsKKwkJCQl2aW5vX3F1ZXVlX2ZyZWUoJnZjcy0+ZmJfcXVldWUpOworCQkJCXZpbm9fcXVldWVfaW5pdCgmdmNzLT5mYl9xdWV1ZSwgJnJiLT5jb3VudCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2aW5vX2NhcHR1cmVfc3RvcCh2Y3MpOworCQkJdmlub19xdWV1ZV9mcmVlKCZ2Y3MtPmZiX3F1ZXVlKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpbm9fdjRsMl9nZXRfYnVmZmVyX3N0YXR1cyhzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkJCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkJc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCWlmICh2aW5vX3F1ZXVlX291dGdvaW5nX2NvbnRhaW5zKCZ2Y3MtPmZiX3F1ZXVlLAorCQkJCQkgZmItPmlkKSkgeworCQliLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwl9IGVsc2UgaWYgKHZpbm9fcXVldWVfaW5jb21pbmdfY29udGFpbnMoJnZjcy0+ZmJfcXVldWUsCisJCQkJICAgICAgIGZiLT5pZCkpIHsKKwkJYi0+ZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJYi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJfSBlbHNlIHsKKwkJYi0+ZmxhZ3MgJj0gfihWNEwyX0JVRl9GTEFHX0RPTkUgfAorCQkJICAgICAgVjRMMl9CVUZfRkxBR19RVUVVRUQpOworCX0KKworCWItPmZsYWdzICY9IH4oVjRMMl9CVUZfRkxBR19USU1FQ09ERSk7CisKKwlpZiAoZmItPm1hcF9jb3VudCA+IDApCisJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCisJYi0+aW5kZXggPSBmYi0+aWQ7CisJYi0+bWVtb3J5ID0gKHZjcy0+ZmJfcXVldWUudHlwZSA9PSBWSU5PX01FTU9SWV9NTUFQKSA/CisJCVY0TDJfTUVNT1JZX01NQVAgOiBWNEwyX01FTU9SWV9VU0VSUFRSOworCWItPm0ub2Zmc2V0ID0gZmItPm9mZnNldDsKKwliLT5ieXRlc3VzZWQgPSBmYi0+ZGF0YV9zaXplOworCWItPmxlbmd0aCA9IGZiLT5zaXplOworCWItPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCWItPnNlcXVlbmNlID0gZmItPmZyYW1lX2NvdW50ZXI7CisJbWVtY3B5KCZiLT50aW1lc3RhbXAsICZmYi0+dGltZXN0YW1wLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwkvLyBiLT5pbnB1dCA/CisKKwlkcHJpbnRrKCJidWZmZXIgJWQ6IGxlbmd0aCA9ICVkLCBieXRlc3VzZWQgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsCisJCWZiLT5pZCwgZmItPnNpemUsIGZiLT5kYXRhX3NpemUsIGZiLT5vZmZzZXQpOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9xdWVyeWJ1ZihzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJaWYgKHZjcy0+cmVhZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoYi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKworCQkvLyBUT0RPOiBjaGVjayBxdWV1ZSB0eXBlCisJCWlmIChiLT5pbmRleCA+PSB2aW5vX3F1ZXVlX2dldF9sZW5ndGgoJnZjcy0+ZmJfcXVldWUpKSB7CisJCQlkcHJpbnRrKCJpbnZhbGlkIGluZGV4ID0gJWRcbiIsCisJCQkgICAgICAgYi0+aW5kZXgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmYiA9IHZpbm9fcXVldWVfZ2V0X2J1ZmZlcigmdmNzLT5mYl9xdWV1ZSwKKwkJCQkJICAgYi0+aW5kZXgpOworCQlpZiAoZmIgPT0gTlVMTCkgeworCQkJZHByaW50aygidmlub19xdWV1ZV9nZXRfYnVmZmVyKCkgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXZpbm9fdjRsMl9nZXRfYnVmZmVyX3N0YXR1cyh2Y3MsIGZiLCBiKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9xYnVmKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCWlmICh2Y3MtPnJlYWRpbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKGItPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogeworCQlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmI7CisJCWludCByZXQ7CisKKwkJLy8gVE9ETzogY2hlY2sgcXVldWUgdHlwZQorCQlpZiAoYi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJCWRwcmludGsoInR5cGUgbm90IG1tYXBcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmYiA9IHZpbm9fY2FwdHVyZV9lbnF1ZXVlKHZjcywgYi0+aW5kZXgpOworCQlpZiAoZmIgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZpbm9fdjRsMl9nZXRfYnVmZmVyX3N0YXR1cyh2Y3MsIGZiLCBiKTsKKworCQlpZiAodmNzLT5zdHJlYW1pbmcpIHsKKwkJCXJldCA9IHZpbm9fY2FwdHVyZV9uZXh0KHZjcywgMSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9kcWJ1ZihzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIsCisJCQkgICB1bnNpZ25lZCBpbnQgbm9uYmxvY2tpbmcpCit7CisJaWYgKHZjcy0+cmVhZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoYi0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiB7CisJCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYjsKKwkJdW5zaWduZWQgaW50IGluY29taW5nLCBvdXRnb2luZzsKKwkJaW50IGVycjsKKworCQkvLyBUT0RPOiBjaGVjayBxdWV1ZSB0eXBlCisKKwkJZXJyID0gdmlub19xdWV1ZV9nZXRfaW5jb21pbmcoJnZjcy0+ZmJfcXVldWUsICZpbmNvbWluZyk7CisJCWlmIChlcnIpIHsKKwkJCWRwcmludGsoInZpbm9fcXVldWVfZ2V0X2luY29taW5nKCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWVyciA9IHZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmb3V0Z29pbmcpOworCQlpZiAoZXJyKSB7CisJCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX2dldF9vdXRnb2luZygpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWRwcmludGsoImluY29taW5nID0gJWQsIG91dGdvaW5nID0gJWRcbiIsIGluY29taW5nLCBvdXRnb2luZyk7CisKKwkJaWYgKG91dGdvaW5nID09IDApIHsKKwkJCWlmIChpbmNvbWluZyA9PSAwKSB7CisJCQkJZHByaW50aygibm8gaW5jb21pbmcgb3Igb3V0Z29pbmcgYnVmZmVyc1xuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAobm9uYmxvY2tpbmcpIHsKKwkJCQlkcHJpbnRrKCJub24tYmxvY2tpbmcgSS9PIHdhcyBzZWxlY3RlZCBhbmQgIgorCQkJCQkidGhlcmUgYXJlIG5vIGJ1ZmZlcnMgdG8gZGVxdWV1ZVxuIik7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCWVyciA9IHZpbm9fd2FpdF9mb3JfZnJhbWUodmNzKTsKKwkJCWlmIChlcnIpIHsKKwkJCQllcnIgPSB2aW5vX3dhaXRfZm9yX2ZyYW1lKHZjcyk7CisJCQkJaWYgKGVycikgeworCQkJCQkvKiBpbnRlcnJ1cHRlZCAqLworCQkJCQl2aW5vX2NhcHR1cmVfZmFpbGVkKHZjcyk7CisJCQkJCXJldHVybiAtRUlPOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZiID0gdmlub19xdWV1ZV9yZW1vdmUoJnZjcy0+ZmJfcXVldWUsICZiLT5pbmRleCk7CisJCWlmIChmYiA9PSBOVUxMKSB7CisJCQlkcHJpbnRrKCJ2aW5vX3F1ZXVlX3JlbW92ZSgpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWVyciA9IHZpbm9fY2hlY2tfYnVmZmVyKHZjcywgZmIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FSU87CisKKwkJdmlub192NGwyX2dldF9idWZmZXJfc3RhdHVzKHZjcywgZmIsIGIpOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3N0cmVhbW9uKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcykKK3sKKwl1bnNpZ25lZCBpbnQgaW5jb21pbmc7CisJaW50IHJldDsKKwlpZiAodmNzLT5yZWFkaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHZjcy0+c3RyZWFtaW5nKQorCQlyZXR1cm4gMDsKKworCS8vIFRPRE86IGNoZWNrIHF1ZXVlIHR5cGUKKworCWlmICh2aW5vX3F1ZXVlX2dldF9sZW5ndGgoJnZjcy0+ZmJfcXVldWUpIDwgMSkgeworCQlkcHJpbnRrKCJubyBidWZmZXJzIGFsbG9jYXRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHZpbm9fcXVldWVfZ2V0X2luY29taW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmaW5jb21pbmcpOworCWlmIChyZXQpIHsKKwkJZHByaW50aygidmlub19xdWV1ZV9nZXRfaW5jb21pbmcoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2Y3MtPnN0cmVhbWluZyA9IDE7CisKKwlpZiAoaW5jb21pbmcgPiAwKSB7CisJCXJldCA9IHZpbm9fY2FwdHVyZV9uZXh0KHZjcywgMSk7CisJCWlmIChyZXQpIHsKKwkJCXZjcy0+c3RyZWFtaW5nID0gMDsKKworCQkJZHByaW50aygiY291bGRuJ3Qgc3RhcnQgY2FwdHVyZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9zdHJlYW1vZmYoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzKQoreworCWlmICh2Y3MtPnJlYWRpbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXZjcy0+c3RyZWFtaW5nKQorCQlyZXR1cm4gMDsKKworCXZpbm9fY2FwdHVyZV9zdG9wKHZjcyk7CisJdmNzLT5zdHJlYW1pbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlub192NGwyX3F1ZXJ5Y3RybChzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MsCisJCQkgICAgICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxdWVyeWN0cmwpCit7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlzd2l0Y2ggKHZjcy0+aW5wdXQpIHsKKwljYXNlIFZJTk9fSU5QVVRfRDE6CisJCWZvciAoaSA9IDA7IGkgPCBWSU5PX0lORFlDQU1fVjRMMl9DT05UUk9MX0NPVU5UOyBpKyspIHsKKwkJCWlmICh2aW5vX2luZHljYW1fdjRsMl9jb250cm9sc1tpXS5pZCA9PQorCQkJICAgIHF1ZXJ5Y3RybC0+aWQpIHsKKwkJCQltZW1jcHkocXVlcnljdHJsLAorCQkJCSAgICAgICAmdmlub19pbmR5Y2FtX3Y0bDJfY29udHJvbHNbaV0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpKTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisKKwkJZXJyID0gIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgVklOT19JTlBVVF9DT01QT1NJVEU6CisJY2FzZSBWSU5PX0lOUFVUX1NWSURFTzoKKwkJZm9yIChpID0gMDsgaSA8IFZJTk9fU0FBNzE5MV9WNEwyX0NPTlRST0xfQ09VTlQ7IGkrKykgeworCQkJaWYgKHZpbm9fc2FhNzE5MV92NGwyX2NvbnRyb2xzW2ldLmlkID09CisJCQkgICAgcXVlcnljdHJsLT5pZCkgeworCQkJCW1lbWNweShxdWVyeWN0cmwsCisJCQkJICAgICAgICZ2aW5vX3NhYTcxOTFfdjRsMl9jb250cm9sc1tpXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKworCQllcnIgPSAgLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gIC1FSU5WQUw7CisJfQorCisgZm91bmQ6CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZpbm9fdjRsMl9nX2N0cmwoc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzLAorCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJc3RydWN0IGluZHljYW1fY29udHJvbCBpbmR5Y2FtX2N0cmw7CisJc3RydWN0IHNhYTcxOTFfY29udHJvbCBzYWE3MTkxX2N0cmw7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlzd2l0Y2ggKHZjcy0+aW5wdXQpIHsKKwljYXNlIFZJTk9fSU5QVVRfRDE6CisJCWkyY19jYW1lcmFfY29tbWFuZChERUNPREVSX0lORFlDQU1fR0VUX0NPTlRST0xTLAorCQkJCSAgICZpbmR5Y2FtX2N0cmwpOworCisJCXN3aXRjaChjb250cm9sLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQkJY29udHJvbC0+dmFsdWUgPSBpbmR5Y2FtX2N0cmwuYWdjOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQkJY29udHJvbC0+dmFsdWUgPSBpbmR5Y2FtX2N0cmwuYXdiOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJCWNvbnRyb2wtPnZhbHVlID0gaW5keWNhbV9jdHJsLmdhaW47CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0JBU0U6CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5yZWRfc2F0dXJhdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDE6CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5ibHVlX3NhdHVyYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJCWNvbnRyb2wtPnZhbHVlID0gaW5keWNhbV9jdHJsLnJlZF9iYWxhbmNlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQkJY29udHJvbC0+dmFsdWUgPSBpbmR5Y2FtX2N0cmwuYmx1ZV9iYWxhbmNlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5zaHV0dGVyOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfR0FNTUE6CisJCQljb250cm9sLT52YWx1ZSA9IGluZHljYW1fY3RybC5nYW1tYTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFZJTk9fSU5QVVRfQ09NUE9TSVRFOgorCWNhc2UgVklOT19JTlBVVF9TVklERU86CisJCWkyY19kZWNvZGVyX2NvbW1hbmQoREVDT0RFUl9TQUE3MTkxX0dFVF9DT05UUk9MUywKKwkJCQkgICAmc2FhNzE5MV9jdHJsKTsKKworCQlzd2l0Y2goY29udHJvbC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQljb250cm9sLT52YWx1ZSA9IHNhYTcxOTFfY3RybC5odWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0JBU0U6CisJCQljb250cm9sLT52YWx1ZSA9IHNhYTcxOTFfY3RybC52dHJjOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9ICAtRUlOVkFMOworCX0KKworCXNwaW5fdW5sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2aW5vX3Y0bDJfc19jdHJsKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCSAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjb250cm9sKQoreworCXN0cnVjdCBpbmR5Y2FtX2NvbnRyb2wgaW5keWNhbV9jdHJsOworCXN0cnVjdCBzYWE3MTkxX2NvbnRyb2wgc2FhNzE5MV9jdHJsOworCWludCBpOworCWludCBlcnIgPSAwOworCisJc3Bpbl9sb2NrKCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJc3dpdGNoICh2Y3MtPmlucHV0KSB7CisJY2FzZSBWSU5PX0lOUFVUX0QxOgorCQlmb3IgKGkgPSAwOyBpIDwgVklOT19JTkRZQ0FNX1Y0TDJfQ09OVFJPTF9DT1VOVDsgaSsrKSB7CisJCQlpZiAodmlub19pbmR5Y2FtX3Y0bDJfY29udHJvbHNbaV0uaWQgPT0KKwkJCSAgICBjb250cm9sLT5pZCkgeworCQkJCWlmICgoY29udHJvbC0+dmFsdWUgPj0KKwkJCQkgICAgIHZpbm9faW5keWNhbV92NGwyX2NvbnRyb2xzW2ldLm1pbmltdW0pCisJCQkJICAgICYmIChjb250cm9sLT52YWx1ZSA8PQorCQkJCQl2aW5vX2luZHljYW1fdjRsMl9jb250cm9sc1tpXS4KKwkJCQkJbWF4aW11bSkpIHsKKwkJCQkJZ290byBvazE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyID0gLUVSQU5HRTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisJCX0KKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKworb2sxOgorCQlpbmR5Y2FtX2N0cmwuYWdjID0gSU5EWUNBTV9WQUxVRV9VTkNIQU5HRUQ7CisJCWluZHljYW1fY3RybC5hd2IgPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLnNodXR0ZXIgPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLmdhaW4gPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLnJlZF9iYWxhbmNlID0gSU5EWUNBTV9WQUxVRV9VTkNIQU5HRUQ7CisJCWluZHljYW1fY3RybC5ibHVlX2JhbGFuY2UgPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLnJlZF9zYXR1cmF0aW9uID0gSU5EWUNBTV9WQUxVRV9VTkNIQU5HRUQ7CisJCWluZHljYW1fY3RybC5ibHVlX3NhdHVyYXRpb24gPSBJTkRZQ0FNX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJaW5keWNhbV9jdHJsLmdhbW1hID0gSU5EWUNBTV9WQUxVRV9VTkNIQU5HRUQ7CisKKwkJc3dpdGNoKGNvbnRyb2wtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisJCQlpbmR5Y2FtX2N0cmwuYWdjID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCQlpbmR5Y2FtX2N0cmwuYXdiID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQkJaW5keWNhbV9jdHJsLmdhaW4gPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRToKKwkJCWluZHljYW1fY3RybC5yZWRfc2F0dXJhdGlvbiA9IGNvbnRyb2wtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMToKKwkJCWluZHljYW1fY3RybC5ibHVlX3NhdHVyYXRpb24gPSBjb250cm9sLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQkJaW5keWNhbV9jdHJsLnJlZF9iYWxhbmNlID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJCQlpbmR5Y2FtX2N0cmwuYmx1ZV9iYWxhbmNlID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJCWluZHljYW1fY3RybC5zaHV0dGVyID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9HQU1NQToKKwkJCWluZHljYW1fY3RybC5nYW1tYSA9IGNvbnRyb2wtPnZhbHVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAgLUVJTlZBTDsKKwkJfQorCisJCWlmICghZXJyKQorCQkJaTJjX2NhbWVyYV9jb21tYW5kKERFQ09ERVJfSU5EWUNBTV9TRVRfQ09OVFJPTFMsCisJCQkJCSAgICZpbmR5Y2FtX2N0cmwpOworCQlicmVhazsKKwljYXNlIFZJTk9fSU5QVVRfQ09NUE9TSVRFOgorCWNhc2UgVklOT19JTlBVVF9TVklERU86CisJCWZvciAoaSA9IDA7IGkgPCBWSU5PX1NBQTcxOTFfVjRMMl9DT05UUk9MX0NPVU5UOyBpKyspIHsKKwkJCWlmICh2aW5vX3NhYTcxOTFfdjRsMl9jb250cm9sc1tpXS5pZCA9PQorCQkJICAgIGNvbnRyb2wtPmlkKSB7CisJCQkJaWYgKChjb250cm9sLT52YWx1ZSA+PQorCQkJCSAgICAgdmlub19zYWE3MTkxX3Y0bDJfY29udHJvbHNbaV0ubWluaW11bSkKKwkJCQkgICAgJiYgKGNvbnRyb2wtPnZhbHVlIDw9CisJCQkJCXZpbm9fc2FhNzE5MV92NGwyX2NvbnRyb2xzW2ldLgorCQkJCQltYXhpbXVtKSkgeworCQkJCQlnb3RvIG9rMjsKKwkJCQl9IGVsc2UgeworCQkJCQllcnIgPSAtRVJBTkdFOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKwkJfQorCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCitvazI6CisJCXNhYTcxOTFfY3RybC5odWUgPSBTQUE3MTkxX1ZBTFVFX1VOQ0hBTkdFRDsKKwkJc2FhNzE5MV9jdHJsLnZ0cmMgPSBTQUE3MTkxX1ZBTFVFX1VOQ0hBTkdFRDsKKworCQlzd2l0Y2goY29udHJvbC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQlzYWE3MTkxX2N0cmwuaHVlID0gY29udHJvbC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0JBU0U6CisJCQlzYWE3MTkxX2N0cmwudnRyYyA9IGNvbnRyb2wtPnZhbHVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAgLUVJTlZBTDsKKwkJfQorCisJCWlmICghZXJyKQorCQkJaTJjX2RlY29kZXJfY29tbWFuZChERUNPREVSX1NBQTcxOTFfU0VUX0NPTlRST0xTLAorCQkJCQkgICAgJnNhYTcxOTFfY3RybCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9ICAtRUlOVkFMOworCX0KKworZXJyb3I6CisJc3Bpbl91bmxvY2soJnZpbm9fZHJ2ZGF0YS0+aW5wdXRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBGaWxlIG9wZXJhdGlvbnMgKi8KKworc3RhdGljIGludCB2aW5vX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCWRwcmludGsoIm9wZW4oKTogY2hhbm5lbCA9ICVjXG4iLAorCSAgICAgICAodmNzLT5jaGFubmVsID09IFZJTk9fQ0hBTk5FTF9BKSA/ICdBJyA6ICdCJyk7CisKKwlkb3duKCZ2Y3MtPnNlbSk7CisKKwlpZiAodmNzLT51c2VycykgeworCQlkcHJpbnRrKCJvcGVuKCk6IGRyaXZlciBidXN5XG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB2aW5vX2FjcXVpcmVfaW5wdXQodmNzKTsKKwlpZiAocmV0KSB7CisJCWRwcmludGsoIm9wZW4oKTogdmlub19hY3F1aXJlX2lucHV0KCkgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdmNzLT51c2VycysrOworCisgb3V0OgorCXVwKCZ2Y3MtPnNlbSk7CisKKwlkcHJpbnRrKCJvcGVuKCk6ICVzIVxuIiwgcmV0ID8gImZhaWxlZCIgOiAiY29tcGxldGUiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlub19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJZHByaW50aygiY2xvc2UoKTpcbiIpOworCisJZG93bigmdmNzLT5zZW0pOworCisJdmNzLT51c2Vycy0tOworCisJaWYgKCF2Y3MtPnVzZXJzKSB7CisJCXZpbm9fcmVsZWFzZV9pbnB1dCh2Y3MpOworCisJCS8qIHN0b3AgRE1BIGFuZCBmcmVlIGJ1ZmZlcnMgKi8KKwkJdmlub19jYXB0dXJlX3N0b3AodmNzKTsKKwkJdmlub19xdWV1ZV9mcmVlKCZ2Y3MtPmZiX3F1ZXVlKTsKKwl9CisKKwl1cCgmdmNzLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpbm9fdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdmlub19mcmFtZWJ1ZmZlciAqZmIgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKworCWZiLT5tYXBfY291bnQrKzsKKwlkcHJpbnRrKCJ2aW5vX3ZtX29wZW4oKTogY291bnQgPSAlZFxuIiwgZmItPm1hcF9jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpbm9fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZpbm9fZnJhbWVidWZmZXIgKmZiID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlmYi0+bWFwX2NvdW50LS07CisJZHByaW50aygidmlub192bV9jbG9zZSgpOiBjb3VudCA9ICVkXG4iLCBmYi0+bWFwX2NvdW50KTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2aW5vX3ZtX29wcyA9IHsKKwkub3Blbgk9IHZpbm9fdm1fb3BlbiwKKwkuY2xvc2UJPSB2aW5vX3ZtX2Nsb3NlLAorfTsKKworc3RhdGljIGludCB2aW5vX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKworCXN0cnVjdCB2aW5vX2ZyYW1lYnVmZmVyICpmYiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGksIGxlbmd0aDsKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoIm1tYXAoKTpcbiIpOworCisJLy8gVE9ETzogcmVqZWN0IG1tYXAgaWYgYWxyZWFkeSBtYXBwZWQKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnZjcy0+c2VtKSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCWlmICh2Y3MtPnJlYWRpbmcpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvLyBUT0RPOiBjaGVjayBxdWV1ZSB0eXBlCisKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKSB7CisJCWRwcmludGsoIm1tYXAoKTogYXBwIGJ1ZzogUFJPVF9XUklURSBwbGVhc2VcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpIHsKKwkJZHByaW50aygibW1hcCgpOiBhcHAgYnVnOiBNQVBfU0hBUkVEIHBsZWFzZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGZpbmQgdGhlIGNvcnJlY3QgYnVmZmVyIHVzaW5nIG9mZnNldCAqLworCWxlbmd0aCA9IHZpbm9fcXVldWVfZ2V0X2xlbmd0aCgmdmNzLT5mYl9xdWV1ZSk7CisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCWRwcmludGsoIm1tYXAoKTogcXVldWUgbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWZiID0gdmlub19xdWV1ZV9nZXRfYnVmZmVyKCZ2Y3MtPmZiX3F1ZXVlLCBpKTsKKwkJaWYgKGZiID09IE5VTEwpIHsKKwkJCWRwcmludGsoIm1tYXAoKTogdmlub19xdWV1ZV9nZXRfYnVmZmVyKCkgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChmYi0+b2Zmc2V0ID09IG9mZnNldCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJZHByaW50aygibW1hcCgpOiBpbnZhbGlkIG9mZnNldCA9ICVsdVxuIiwgb2Zmc2V0KTsKKwlyZXQgPSAtRUlOVkFMOworCWdvdG8gb3V0OworCitmb3VuZDoKKwlkcHJpbnRrKCJtbWFwKCk6IGJ1ZmZlciA9ICVkXG4iLCBpKTsKKworCWlmIChzaXplID4gKGZiLT5kZXNjX3RhYmxlLnBhZ2VfY291bnQgKiBQQUdFX1NJWkUpKSB7CisJCWRwcmludGsoIm1tYXAoKTogZmFpbGVkOiBzaXplID0gJWx1ID4gJWx1XG4iLAorCQkJc2l6ZSwgZmItPmRlc2NfdGFibGUucGFnZV9jb3VudCAqIFBBR0VfU0laRSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmYi0+ZGVzY190YWJsZS5wYWdlX2NvdW50OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPQorCQkJdmlydF90b19waHlzKCh2b2lkICopZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkgPj4KKwkJCVBBR0VfU0hJRlQ7CisKKwkJaWYgKHNpemUgPCBQQUdFX1NJWkUpCisJCQlicmVhazsKKworCQkvLyBwcm90ZWN0aW9uIHdhczogUEFHRV9SRUFET05MWQorCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBmbiwgUEFHRV9TSVpFLAorCQkJCSAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJCWRwcmludGsoIm1tYXAoKTogcmVtYXBfcGZuX3JhbmdlKCkgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCisJZmItPm1hcF9jb3VudCA9IDE7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQgfCBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzICY9IH5WTV9JTzsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IGZiOworCXZtYS0+dm1fZmlsZSA9IGZpbGU7CisJdm1hLT52bV9vcHMgPSAmdmlub192bV9vcHM7CisKK291dDoKKwl1cCgmdmNzLT5zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB2aW5vX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgb3V0Z29pbmc7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwkvLyBsb2NrIG11dGV4ICg/KQorCS8vIFRPRE86IHRoaXMgaGFzIHRvIGJlIGNvcnJlY3RlZCBmb3IgZGlmZmVyZW50IHJlYWQgbW9kZXMKKworCWRwcmludGsoInBvbGwoKTpcbiIpOworCisJaWYgKHZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmb3V0Z29pbmcpKSB7CisJCWRwcmludGsoInBvbGwoKTogdmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoKSBmYWlsZWRcbiIpOworCQlyZXQgPSBQT0xMRVJSOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAob3V0Z29pbmcgPiAwKQorCQlnb3RvIG92ZXI7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnZjcy0+ZmJfcXVldWUuZnJhbWVfd2FpdF9xdWV1ZSwgcHQpOworCisJaWYgKHZpbm9fcXVldWVfZ2V0X291dGdvaW5nKCZ2Y3MtPmZiX3F1ZXVlLCAmb3V0Z29pbmcpKSB7CisJCWRwcmludGsoInBvbGwoKTogdmlub19xdWV1ZV9nZXRfb3V0Z29pbmcoKSBmYWlsZWRcbiIpOworCQlyZXQgPSBQT0xMRVJSOworCQlnb3RvIGVycm9yOworCX0KKworb3ZlcjoKKwlkcHJpbnRrKCJwb2xsKCk6IGRhdGEgJXNhdmFpbGFibGVcbiIsCisJCShvdXRnb2luZyA+IDApID8gIiIgOiAibm90ICIpOworCWlmIChvdXRnb2luZyA+IDApIHsKKwkJcmV0ID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisKK2Vycm9yOgorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aW5vX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCisJc3dpdGNoIChfSU9DX1RZUEUoY21kKSkgeworCWNhc2UgJ3YnOgorCQlkcHJpbnRrKCJpb2N0bCgpOiBWNEwxIHVuc3VwcG9ydGVkICgweCUwOHgpXG4iLCBjbWQpOworCQlicmVhazsKKwljYXNlICdWJzoKKwkJZHByaW50aygiaW9jdGwoKTogVjRMMiAlcyAoMHglMDh4KVxuIiwKKwkJCXY0bDJfaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSwgY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHByaW50aygiaW9jdGwoKTogdW5zdXBwb3J0ZWQgY29tbWFuZCAweCUwOHhcbiIsIGNtZCk7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwkvKiBUT0RPOiBWNEwxIGludGVyZmFjZSAodXNlIGNvbXBhdGliaWxpdHkgbGF5ZXI/KSAqLworCS8qIFY0TDIgaW50ZXJmYWNlICovCisJY2FzZSBWSURJT0NfUVVFUllDQVA6IHsKKwkJdmlub192NGwyX3F1ZXJ5Y2FwKGFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9lbnVtaW5wdXQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19HX0lOUFVUOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZ19pbnB1dCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1NfSU5QVVQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zX2lucHV0KHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfRU5VTVNURDogeworCQlyZXR1cm4gdmlub192NGwyX2VudW1zdGQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19HX1NURDogeworCQlyZXR1cm4gdmlub192NGwyX2dfc3RkKHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfU19TVEQ6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zX3N0ZCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0VOVU1fRk1UOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZW51bV9mbXQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19UUllfRk1UOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfdHJ5X2ZtdCh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0dfRk1UOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZ19mbXQodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19TX0ZNVDogeworCQlyZXR1cm4gdmlub192NGwyX3NfZm10KHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfQ1JPUENBUDogeworCQlyZXR1cm4gdmlub192NGwyX2Nyb3BjYXAodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19HX0NST1A6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9nX2Nyb3AodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19TX0NST1A6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zX2Nyb3AodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19HX1BBUk06IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9nX3Bhcm0odmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19TX1BBUk06IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zX3Bhcm0odmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19SRVFCVUZTOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfcmVxYnVmcyh2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQlVGOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfcXVlcnlidWYodmNzLCBhcmcpOworCX0KKwljYXNlIFZJRElPQ19RQlVGOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfcWJ1Zih2Y3MsIGFyZyk7CisJfQorCWNhc2UgVklESU9DX0RRQlVGOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZHFidWYodmNzLCBhcmcsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwl9CisJY2FzZSBWSURJT0NfU1RSRUFNT046IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zdHJlYW1vbih2Y3MpOworCX0KKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6IHsKKwkJcmV0dXJuIHZpbm9fdjRsMl9zdHJlYW1vZmYodmNzKTsKKwl9CisJY2FzZSBWSURJT0NfUVVFUllDVFJMOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfcXVlcnljdHJsKHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfR19DVFJMOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfZ19jdHJsKHZjcywgYXJnKTsKKwl9CisJY2FzZSBWSURJT0NfU19DVFJMOiB7CisJCXJldHVybiB2aW5vX3Y0bDJfc19jdHJsKHZjcywgYXJnKTsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnZjcy0+c2VtKSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJldCA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgdmlub19kb19pb2N0bCk7CisKKwl1cCgmdmNzLT5zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgKi8KKworLy8gX19pbml0ZGF0YQorc3RhdGljIGludCB2aW5vX2luaXRfc3RhZ2UgPSAwOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aW5vX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHZpbm9fb3BlbiwKKwkucmVsZWFzZQk9IHZpbm9fY2xvc2UsCisJLmlvY3RsCQk9IHZpbm9faW9jdGwsCisJLm1tYXAJCT0gdmlub19tbWFwLAorCS5wb2xsCQk9IHZpbm9fcG9sbCwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHY0bF9kZXZpY2VfdGVtcGxhdGUgPSB7CisJLm5hbWUJCT0gIk5PVCBTRVQiLAorCS8vLnR5cGUJCT0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX1NVQkNBUFRVUkUgfAorCS8vCVZJRF9UWVBFX0NMSVBQSU5HIHwgVklEX1RZUEVfU0NBTEVTLCBWSURfVFlQRV9PVkVSTEFZCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1ZJTk8sCisJLmZvcHMJCT0gJnZpbm9fZm9wcywKKwkubWlub3IJCT0gLTEsCit9OworCitzdGF0aWMgdm9pZCB2aW5vX21vZHVsZV9jbGVhbnVwKGludCBzdGFnZSkKK3sKKwlzd2l0Y2goc3RhZ2UpIHsKKwljYXNlIDEwOgorCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2aW5vX2RydmRhdGEtPmIudjRsX2RldmljZSk7CisJCXZpbm9fZHJ2ZGF0YS0+Yi52NGxfZGV2aWNlID0gTlVMTDsKKwljYXNlIDk6CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZpbm9fZHJ2ZGF0YS0+YS52NGxfZGV2aWNlKTsKKwkJdmlub19kcnZkYXRhLT5hLnY0bF9kZXZpY2UgPSBOVUxMOworCWNhc2UgODoKKwkJdmlub19pMmNfZGVsX2J1cygpOworCWNhc2UgNzoKKwkJZnJlZV9pcnEoU0dJX1ZJTk9fSVJRLCBOVUxMKTsKKwljYXNlIDY6CisJCWlmICh2aW5vX2RydmRhdGEtPmIudjRsX2RldmljZSkgeworCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2Uodmlub19kcnZkYXRhLT5iLnY0bF9kZXZpY2UpOworCQkJdmlub19kcnZkYXRhLT5iLnY0bF9kZXZpY2UgPSBOVUxMOworCQl9CisJY2FzZSA1OgorCQlpZiAodmlub19kcnZkYXRhLT5hLnY0bF9kZXZpY2UpIHsKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKHZpbm9fZHJ2ZGF0YS0+YS52NGxfZGV2aWNlKTsKKwkJCXZpbm9fZHJ2ZGF0YS0+YS52NGxfZGV2aWNlID0gTlVMTDsKKwkJfQorCWNhc2UgNDoKKwkJLyogYWxsIGVudHJpZXMgaW4gZG1hX2NwdSBkdW1teSB0YWJsZSBoYXZlIHRoZSBzYW1lIGFkZHJlc3MgKi8KKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLAorCQkJCSB2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hX2NwdVswXSwKKwkJCQkgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBWSU5PX0RVTU1ZX0RFU0NfQ09VTlQKKwkJCQkgICogc2l6ZW9mKGRtYV9hZGRyX3QpLAorCQkJCSAgKHZvaWQgKil2aW5vX2RydmRhdGEtPgorCQkJCSAgZHVtbXlfZGVzY190YWJsZS5kbWFfY3B1LAorCQkJCSAgdmlub19kcnZkYXRhLT5kdW1teV9kZXNjX3RhYmxlLmRtYSk7CisJY2FzZSAzOgorCQlmcmVlX3BhZ2Uodmlub19kcnZkYXRhLT5kdW1teV9wYWdlKTsKKwljYXNlIDI6CisJCWtmcmVlKHZpbm9fZHJ2ZGF0YSk7CisJY2FzZSAxOgorCQlpb3VubWFwKHZpbm8pOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHByaW50aygidmlub19tb2R1bGVfY2xlYW51cCgpOiBpbnZhbGlkIGNsZWFudXAgc3RhZ2UgPSAlZFxuIiwKKwkJCXN0YWdlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmlub19wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcmV2X2lkOworCisJaWYgKGlwMjJfaXNfZnVsbGhvdXNlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5PIGRvZXNuJ3QgZXhpc3QgaW4gSVAyMiBGdWxsaG91c2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIShzZ2ltYy0+c3lzdGVtaWQgJiBTR0lNQ19TWVNJRF9FUFJFU0VOVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU5PIGlzIG5vdCBmb3VuZCAoRUlTQSBCVVMgbm90IHByZXNlbnQpXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdmlubyA9IChzdHJ1Y3Qgc2dpX3Zpbm8gKilpb3JlbWFwKFZJTk9fQkFTRSwgc2l6ZW9mKHN0cnVjdCBzZ2lfdmlubykpOworCWlmICghdmlubykgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk86IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdmlub19pbml0X3N0YWdlKys7CisKKwlpZiAoZ2V0X2RiZShyZXZfaWQsICYodmluby0+cmV2X2lkKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVhZCBWSU5PIHJldmlzaW9uIHJlZ2lzdGVyXG4iKTsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoVklOT19JRF9WQUxVRShyZXZfaWQpICE9IFZJTk9fQ0hJUF9JRCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gVklOTyBjaGlwIElEIChSZXYvSUQ6IDB4JTAybHgpXG4iLAorCQkgICAgICAgcmV2X2lkKTsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJWSU5PIHdpdGggY2hpcCBJRCAlbGQsIHJldmlzaW9uICVsZCBmb3VuZFxuIiwKKwkgICAgICAgVklOT19JRF9WQUxVRShyZXZfaWQpLCBWSU5PX1JFVl9OVU0ocmV2X2lkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aW5vX2luaXQodm9pZCkKK3sKKwlkbWFfYWRkcl90IGRtYV9kdW1teV9hZGRyZXNzOworCWludCBpOworCisJdmlub19kcnZkYXRhID0gKHN0cnVjdCB2aW5vX3NldHRpbmdzICopCisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aW5vX3NldHRpbmdzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aW5vX2RydmRhdGEpIHsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHZpbm9fZHJ2ZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB2aW5vX3NldHRpbmdzKSk7CisJdmlub19pbml0X3N0YWdlKys7CisKKwkvKiBjcmVhdGUgYSBkdW1teSBkbWEgZGVzY3JpcHRvciAqLworCXZpbm9fZHJ2ZGF0YS0+ZHVtbXlfcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCF2aW5vX2RydmRhdGEtPmR1bW15X3BhZ2UpIHsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdmlub19pbml0X3N0YWdlKys7CisKKwkvLyBUT0RPOiB1c2UgcGFnZV9jb3VudCBpbiBkdW1teV9kZXNjX3RhYmxlCisKKwl2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hX2NwdSA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLAorCQlWSU5PX0RVTU1ZX0RFU0NfQ09VTlQgKiBzaXplb2YoZG1hX2FkZHJfdCksCisJCSZ2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hLAorCQlHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCF2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hX2NwdSkgeworCQl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCWRtYV9kdW1teV9hZGRyZXNzID0gZG1hX21hcF9zaW5nbGUoTlVMTCwKKwkJCQkJICAgKHZvaWQgKil2aW5vX2RydmRhdGEtPmR1bW15X3BhZ2UsCisJCQkJCVBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlmb3IgKGkgPSAwOyBpIDwgVklOT19EVU1NWV9ERVNDX0NPVU5UOyBpKyspIHsKKwkJdmlub19kcnZkYXRhLT5kdW1teV9kZXNjX3RhYmxlLmRtYV9jcHVbaV0gPSBkbWFfZHVtbXlfYWRkcmVzczsKKwl9CisKKwkvKiBpbml0aWFsaXplIFZJTk8gKi8KKworCXZpbm8tPmNvbnRyb2wgPSAwOworCXZpbm8tPmEubmV4dF80X2Rlc2MgPSB2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hOworCXZpbm8tPmIubmV4dF80X2Rlc2MgPSB2aW5vX2RydmRhdGEtPmR1bW15X2Rlc2NfdGFibGUuZG1hOworCXVkZWxheShWSU5PX0RFU0NfRkVUQ0hfREVMQVkpOworCisJdmluby0+aW50cl9zdGF0dXMgPSAwOworCisJdmluby0+YS5maWZvX3RocmVzID0gVklOT19GSUZPX1RIUkVTSE9MRF9ERUZBVUxUOworCXZpbm8tPmIuZmlmb190aHJlcyA9IFZJTk9fRklGT19USFJFU0hPTERfREVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpbm9faW5pdF9jaGFubmVsX3NldHRpbmdzKHN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcywKKwkJCQkgdW5zaWduZWQgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdmNzLT5jaGFubmVsID0gY2hhbm5lbDsKKwl2Y3MtPmlucHV0ID0gVklOT19JTlBVVF9OT05FOworCXZjcy0+YWxwaGEgPSAwOworCXZjcy0+dXNlcnMgPSAwOworCXZjcy0+ZGF0YV9mb3JtYXQgPSBWSU5PX0RBVEFfRk1UX0dSRVk7CisJdmNzLT5kYXRhX25vcm0gPSBWSU5PX0RBVEFfTk9STV9OVFNDOworCXZjcy0+ZGVjaW1hdGlvbiA9IDE7CisJdmlub19zZXRfZGVmYXVsdF9jbGlwcGluZyh2Y3MpOworCXZpbm9fc2V0X2RlZmF1bHRfZnJhbWVyYXRlKHZjcyk7CisKKwl2Y3MtPmNhcHR1cmluZyA9IDA7CisKKwlpbml0X01VVEVYKCZ2Y3MtPnNlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnZjcy0+Y2FwdHVyZV9sb2NrKTsKKworCWluaXRfTVVURVgoJnZjcy0+ZmJfcXVldWUucXVldWVfc2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmdmNzLT5mYl9xdWV1ZS5xdWV1ZV9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Y3MtPmZiX3F1ZXVlLmZyYW1lX3dhaXRfcXVldWUpOworCisJdmNzLT52NGxfZGV2aWNlID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCF2Y3MtPnY0bF9kZXZpY2UpIHsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdmlub19pbml0X3N0YWdlKys7CisKKwltZW1jcHkodmNzLT52NGxfZGV2aWNlLCAmdjRsX2RldmljZV90ZW1wbGF0ZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpKTsKKwlzdHJjcHkodmNzLT52NGxfZGV2aWNlLT5uYW1lLCBuYW1lKTsKKwl2Y3MtPnY0bF9kZXZpY2UtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKworCXZpZGVvX3NldF9kcnZkYXRhKHZjcy0+djRsX2RldmljZSwgdmNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB2aW5vX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIlNHSSBWSU5PIGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBWSU5PX01PRFVMRV9WRVJTSU9OKTsKKworCXJldCA9IHZpbm9fcHJvYmUoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdmlub19pbml0KCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzICovCisKKwlzcGluX2xvY2tfaW5pdCgmdmlub19kcnZkYXRhLT52aW5vX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ2aW5vX2RydmRhdGEtPmlucHV0X2xvY2spOworCisJcmV0ID0gdmlub19pbml0X2NoYW5uZWxfc2V0dGluZ3MoJnZpbm9fZHJ2ZGF0YS0+YSwgVklOT19DSEFOTkVMX0EsCisJCQkJICAgIHZpbm9fdjRsX2RldmljZV9uYW1lX2EpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB2aW5vX2luaXRfY2hhbm5lbF9zZXR0aW5ncygmdmlub19kcnZkYXRhLT5iLCBWSU5PX0NIQU5ORUxfQiwKKwkJCQkgICAgdmlub192NGxfZGV2aWNlX25hbWVfYik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGluaXRpYWxpemUgaGFyZHdhcmUgYW5kIHJlZ2lzdGVyIFY0TCBkZXZpY2VzICovCisKKwlyZXQgPSByZXF1ZXN0X2lycShTR0lfVklOT19JUlEsIHZpbm9faW50ZXJydXB0LCAwLAorCQl2aW5vX2RyaXZlcl9kZXNjcmlwdGlvbiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk86IHJlcXVlc3RpbmcgSVJRICUwMmQgZmFpbGVkXG4iLAorCQkgICAgICAgU0dJX1ZJTk9fSVJRKTsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJdmlub19pbml0X3N0YWdlKys7CisKKwlyZXQgPSB2aW5vX2kyY19hZGRfYnVzKCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gSTJDIGJ1cyByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gcmV0OworCX0KKwl2aW5vX2luaXRfc3RhZ2UrKzsKKworCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2aW5vX2RydmRhdGEtPmEudjRsX2RldmljZSwKKwkJCQkgICAgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklOTyBjaGFubmVsIEEgVmlkZW80TGludXgtZGV2aWNlICIKKwkJICAgICAgICJyZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmlub19pbml0X3N0YWdlKys7CisKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2Uodmlub19kcnZkYXRhLT5iLnY0bF9kZXZpY2UsCisJCQkJICAgIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTk8gY2hhbm5lbCBCIFZpZGVvNExpbnV4LWRldmljZSAiCisJCSAgICAgICAicmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXZpbm9fbW9kdWxlX2NsZWFudXAodmlub19pbml0X3N0YWdlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZpbm9faW5pdF9zdGFnZSsrOworCisjaWYgZGVmaW5lZChDT05GSUdfS01PRCkgJiYgZGVmaW5lZChNT0RVTEUpCisJcmVxdWVzdF9tb2R1bGUoInNhYTcxOTEiKTsKKwlyZXF1ZXN0X21vZHVsZSgiaW5keWNhbSIpOworI2VuZGlmCisKKwlkcHJpbnRrKCJpbml0IGNvbXBsZXRlIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZpbm9fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlkcHJpbnRrKCJleGl0aW5nLCBzdGFnZSA9ICVkIC4uLlxuIiwgdmlub19pbml0X3N0YWdlKTsKKwl2aW5vX21vZHVsZV9jbGVhbnVwKHZpbm9faW5pdF9zdGFnZSk7CisJZHByaW50aygiY2xlYW51cCBjb21wbGV0ZSwgZXhpdCFcbiIpOworfQorCittb2R1bGVfaW5pdCh2aW5vX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHZpbm9fbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uaAppbmRleCBkMmZjZTQ3Li5kZTJkNjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uaApAQCAtMSwxMyArMSwxOSBAQAogLyoKKyAqIERyaXZlciBmb3IgdGhlIFZJTk8gKFZpZGVvIEluIE5vIE91dCkgc3lzdGVtIGZvdW5kIGluIFNHSSBJbmR5cy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgogICogQ29weXJpZ2h0IChDKSAxOTk5IFVsZiBLYXJsc3NvbiA8dWxmY0BidW4uZmFsa2VuYmVyZy5zZT4KICAqIENvcHlyaWdodCAoQykgMjAwMyBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CiAgKi8KIAotI2lmbmRlZiBWSU5PX0gKLSNkZWZpbmUgVklOT19ICisjaWZuZGVmIF9WSU5PX0hfCisjZGVmaW5lIF9WSU5PX0hfCiAKICNkZWZpbmUgVklOT19CQVNFCTB4MDAwODAwMDAJLyogVmlubyBpcyBpbiB0aGUgRUlTQSBhZGRyZXNzIHNwYWNlLAogCQkJCQkgKiBidXQgaXQgaXMgbm90IGFuIEVJU0EgYnVzIGNhcmQgKi8KKyNkZWZpbmUgVklOT19QQUdFX1NJWkUJNDA5NgogCiBzdHJ1Y3Qgc2dpX3Zpbm9fY2hhbm5lbCB7CiAJdTMyIF9wYWRfYWxwaGE7CkBAIC0yMSw4ICsyNyw5IEBACiAJdTMyIF9wYWRfY2xpcF9lbmQ7CiAJdm9sYXRpbGUgdTMyIGNsaXBfZW5kOwogCisjZGVmaW5lIFZJTk9fRlJBTUVSVF9GVUxMCTB4ZmZmCiAjZGVmaW5lIFZJTk9fRlJBTUVSVF9QQUwJKDE8PDApCQkJLyogMD1OVFNDIDE9UEFMICovCi0jZGVmaW5lIFZJTk9fRlJBTUVSVF9SVCh4KQkoKCh4KSAmIDB4MWZmZikgPDwgMSkJLyogYml0cyAxOjEyICovCisjZGVmaW5lIFZJTk9fRlJBTUVSVF9SVCh4KQkoKCh4KSAmIDB4ZmZmKSA8PCAxKQkvKiBiaXRzIDE6MTIgKi8KIAl1MzIgX3BhZF9mcmFtZV9yYXRlOwogCXZvbGF0aWxlIHUzMiBmcmFtZV9yYXRlOwogCkBAIC02NywxOCArNzQsMTggQEAKIAl2b2xhdGlsZSB1MzIgcmV2X2lkOwogCiAjZGVmaW5lIFZJTk9fQ1RSTF9MSVRUTEVfRU5ESUFOCQkoMTw8MCkKLSNkZWZpbmUgVklOT19DVFJMX0FfRklFTERfVFJBTlNfSU5UCSgxPDwxKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KLSNkZWZpbmUgVklOT19DVFJMX0FfRklGT19PRl9JTlQJCSgxPDwyKQkvKiBGSUZPIG92ZXJmbG93IGludCAqLwotI2RlZmluZSBWSU5PX0NUUkxfQV9FTkRfREVTQ19UQkxfSU5UCSgxPDwzKQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KLSNkZWZpbmUgVklOT19DVFJMX0FfSU5UCQkJKFZJTk9fQ1RSTF9BX0ZJRUxEX1RSQU5TX0lOVCB8IFwKLQkJCQkJIFZJTk9fQ1RSTF9BX0ZJRk9fT0ZfSU5UIHwgXAotCQkJCQkgVklOT19DVFJMX0FfRU5EX0RFU0NfVEJMX0lOVCkKLSNkZWZpbmUgVklOT19DVFJMX0JfRklFTERfVFJBTlNfSU5UCSgxPDw0KQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KLSNkZWZpbmUgVklOT19DVFJMX0JfRklGT19PRl9JTlQJCSgxPDw1KQkvKiBGSUZPIG92ZXJmbG93IGludCAqLwotI2RlZmluZSBWSU5PX0NUUkxfQl9FTkRfREVTQ19UQkxfSU5UCSgxPDw2KQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KLSNkZWZpbmUgVklOT19DVFJMX0JfSU5UCQkJKFZJTk9fQ1RSTF9CX0ZJRUxEX1RSQU5TX0lOVCB8IFwKLQkJCQkJIFZJTk9fQ1RSTF9CX0ZJRk9fT0ZfSU5UIHwgXAotCQkJCQkgVklOT19DVFJMX0JfRU5EX0RFU0NfVEJMX0lOVCkKKyNkZWZpbmUgVklOT19DVFJMX0FfRU9GX0lOVAkJKDE8PDEpCS8qIEZpZWxkIHRyYW5zZmVycmVkIGludCAqLworI2RlZmluZSBWSU5PX0NUUkxfQV9GSUZPX0lOVAkJKDE8PDIpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCisjZGVmaW5lIFZJTk9fQ1RSTF9BX0VPRF9JTlQJCSgxPDwzKQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0FfSU5UCQkJKFZJTk9fQ1RSTF9BX0VPRl9JTlQgfCBcCisJCQkJCSBWSU5PX0NUUkxfQV9GSUZPX0lOVCB8IFwKKwkJCQkJIFZJTk9fQ1RSTF9BX0VPRF9JTlQpCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0VPRl9JTlQJCSgxPDw0KQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KKyNkZWZpbmUgVklOT19DVFJMX0JfRklGT19JTlQJCSgxPDw1KQkvKiBGSUZPIG92ZXJmbG93IGludCAqLworI2RlZmluZSBWSU5PX0NUUkxfQl9FT0RfSU5UCQkoMTw8NikJLyogRW5kIG9mIGRlc2MgdGFibGUgaW50ICovCisjZGVmaW5lIFZJTk9fQ1RSTF9CX0lOVAkJCShWSU5PX0NUUkxfQl9FT0ZfSU5UIHwgXAorCQkJCQkgVklOT19DVFJMX0JfRklGT19JTlQgfCBcCisJCQkJCSBWSU5PX0NUUkxfQl9FT0RfSU5UKQogI2RlZmluZSBWSU5PX0NUUkxfQV9ETUFfRU5CTAkJKDE8PDcpCiAjZGVmaW5lIFZJTk9fQ1RSTF9BX0lOVEVSTEVBVkVfRU5CTAkoMTw8OCkKICNkZWZpbmUgVklOT19DVFJMX0FfU1lOQ19FTkJMCQkoMTw8OSkKQEAgLTEwNCwxOCArMTExLDE4IEBACiAJdTMyIF9wYWRfY29udHJvbDsKIAl2b2xhdGlsZSB1MzIgY29udHJvbDsKIAotI2RlZmluZSBWSU5PX0lOVFNUQVRfQV9GSUVMRF9UUkFOUwkoMTw8MCkJLyogRmllbGQgdHJhbnNmZXJyZWQgaW50ICovCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0ZJRk9fT0YJCSgxPDwxKQkvKiBGSUZPIG92ZXJmbG93IGludCAqLwotI2RlZmluZSBWSU5PX0lOVFNUQVRfQV9FTkRfREVTQ19UQkwJKDE8PDIpCS8qIEVuZCBvZiBkZXNjIHRhYmxlIGludCAqLwotI2RlZmluZSBWSU5PX0lOVFNUQVRfQQkJCShWSU5PX0lOVFNUQVRfQV9GSUVMRF9UUkFOUyB8IFwKLQkJCQkJIFZJTk9fSU5UU1RBVF9BX0ZJRk9fT0YgfCBcCi0JCQkJCSBWSU5PX0lOVFNUQVRfQV9FTkRfREVTQ19UQkwpCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9CX0ZJRUxEX1RSQU5TCSgxPDwzKQkvKiBGaWVsZCB0cmFuc2ZlcnJlZCBpbnQgKi8KLSNkZWZpbmUgVklOT19JTlRTVEFUX0JfRklGT19PRgkJKDE8PDQpCS8qIEZJRk8gb3ZlcmZsb3cgaW50ICovCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9CX0VORF9ERVNDX1RCTAkoMTw8NSkJLyogRW5kIG9mIGRlc2MgdGFibGUgaW50ICovCi0jZGVmaW5lIFZJTk9fSU5UU1RBVF9CCQkJKFZJTk9fSU5UU1RBVF9CX0ZJRUxEX1RSQU5TIHwgXAotCQkJCQkgVklOT19JTlRTVEFUX0JfRklGT19PRiB8IFwKLQkJCQkJIFZJTk9fSU5UU1RBVF9CX0VORF9ERVNDX1RCTCkKKyNkZWZpbmUgVklOT19JTlRTVEFUX0FfRU9GCQkoMTw8MCkJLyogRmllbGQgdHJhbnNmZXJyZWQgaW50ICovCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9BX0ZJRk8JCSgxPDwxKQkvKiBGSUZPIG92ZXJmbG93IGludCAqLworI2RlZmluZSBWSU5PX0lOVFNUQVRfQV9FT0QJCSgxPDwyKQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0EJCQkoVklOT19JTlRTVEFUX0FfRU9GIHwgXAorCQkJCQkgVklOT19JTlRTVEFUX0FfRklGTyB8IFwKKwkJCQkJIFZJTk9fSU5UU1RBVF9BX0VPRCkKKyNkZWZpbmUgVklOT19JTlRTVEFUX0JfRU9GCQkoMTw8MykJLyogRmllbGQgdHJhbnNmZXJyZWQgaW50ICovCisjZGVmaW5lIFZJTk9fSU5UU1RBVF9CX0ZJRk8JCSgxPDw0KQkvKiBGSUZPIG92ZXJmbG93IGludCAqLworI2RlZmluZSBWSU5PX0lOVFNUQVRfQl9FT0QJCSgxPDw1KQkvKiBFbmQgb2YgZGVzYyB0YWJsZSBpbnQgKi8KKyNkZWZpbmUgVklOT19JTlRTVEFUX0IJCQkoVklOT19JTlRTVEFUX0JfRU9GIHwgXAorCQkJCQkgVklOT19JTlRTVEFUX0JfRklGTyB8IFwKKwkJCQkJIFZJTk9fSU5UU1RBVF9CX0VPRCkKIAl1MzIgX3BhZF9pbnRyX3N0YXR1czsKIAl2b2xhdGlsZSB1MzIgaW50cl9zdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCmluZGV4IGJhODM4YTQuLjUzYWRlYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYwpAQCAtNjUwLDcgKzY1MCw3IEBACiAJCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQogCQkJCQlDbGVhclBhZ2VSZXNlcnZlZChNQVBfTlIKIAkJCQkJCQkgIChtZW0gKyBvZmYpKTsKLQkJCQlrZnJlZSgodm9pZCAqKSBtZW0pOworCQkJCWtmcmVlKG1lbSk7CiAJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlswXSA9IDA7CiAJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsxXSA9IDA7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMC5jCmluZGV4IGMzMzUzMzEuLjA3Mjg2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMC5jCkBAIC04MjAsMTEgKzgyMCw5IEBACiAgICAgICAgIG1zbGVlcCgxMDApOwkJCS8qIFdhaXQgMS8xMHRoIG9mIGEgc2Vjb25kICovCiAKIAkvKiBmcmVlIHRoZSBhbGxvY2F0ZWQgZnJhbWVidWZmZXIgKi8KLQlpZiAoenR2LT5mYnVmZmVyKQotCQliZnJlZSggenR2LT5mYnVmZmVyLCBaT1JBTl9NQVhfRkJVRlNJWkUgKTsKKwliZnJlZSh6dHYtPmZidWZmZXIsIFpPUkFOX01BWF9GQlVGU0laRSk7CiAJenR2LT5mYnVmZmVyID0gMDsKLQlpZiAoenR2LT5vdmVyaW5mby5vdmVybGF5KQotCQlrZnJlZSggenR2LT5vdmVyaW5mby5vdmVybGF5ICk7CisJa2ZyZWUoenR2LT5vdmVyaW5mby5vdmVybGF5KTsKIAl6dHYtPm92ZXJpbmZvLm92ZXJsYXkgPSAwOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waS5oCmluZGV4IDlmOTgzMzQuLmI2MWUzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waS5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waS5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgTWVzc2FnZSBpbmRlcGVuZGVudCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwogICogIENyZWF0aW9uIERhdGU6ICBKdWx5IDI3LCAyMDAwCiAgKgotICogICAgbXBpLmggVmVyc2lvbjogIDAxLjA1LjA3CisgKiAgICBtcGkuaCBWZXJzaW9uOiAgMDEuMDUuMDgKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC03MSw2ICs3MSw5IEBACiAgKiAgMDMtMTEtMDUgIDAxLjA1LjA3ICBSZW1vdmVkIGZ1bmN0aW9uIGNvZGVzIGZvciBTQ1NJIElPIDMyIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgcmVxdWVzdHMuCiAgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIEVFRFAgSU9DU3RhdHVzIGNvZGVzLgorICogIDA2LTI0LTA1ICAwMS4wNS4wOCAgQWRkZWQgZnVuY3Rpb24gY29kZXMgZm9yIFNDU0kgSU8gMzIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBc3Npc3RFeHRlbmRlZCByZXF1ZXN0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEVFRFAgSU9DU3RhdHVzIGNvZGVzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMTAxLDcgKzEwNCw3IEBACiAvKiBOb3RlOiBUaGUgbWFqb3IgdmVyc2lvbnMgb2YgMHhlMCB0aHJvdWdoIDB4ZmYgYXJlIHJlc2VydmVkICovCiAKIC8qIHZlcnNpb25pbmcgZm9yIHRoaXMgTVBJIGhlYWRlciBzZXQgKi8KLSNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAgKDB4MDkpCisjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgICgweDBBKQogI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fREVWICAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVRfTUFTSyAgICAgICAgKDB4RkYwMCkKICNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVRfU0hJRlQgICAgICAgKDgpCkBAIC0yOTIsMTAgKzI5NSwxMyBAQAogI2RlZmluZSBNUElfRlVOQ1RJT05fRElBR19CVUZGRVJfUE9TVCAgICAgICAgICAgICAgICgweDFEKQogI2RlZmluZSBNUElfRlVOQ1RJT05fRElBR19SRUxFQVNFICAgICAgICAgICAgICAgICAgICgweDFFKQogCisjZGVmaW5lIE1QSV9GVU5DVElPTl9TQ1NJX0lPXzMyICAgICAgICAgICAgICAgICAgICAgKDB4MUYpCisKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX0xBTl9TRU5EICAgICAgICAgICAgICAgICAgICAgICAoMHgyMCkKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX0xBTl9SRUNFSVZFICAgICAgICAgICAgICAgICAgICAoMHgyMSkKICNkZWZpbmUgTVBJX0ZVTkNUSU9OX0xBTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAoMHgyMikKIAorI2RlZmluZSBNUElfRlVOQ1RJT05fVEFSR0VUX0FTU0lTVF9FWFRFTkRFRCAgICAgICAgICgweDIzKQogI2RlZmluZSBNUElfRlVOQ1RJT05fVEFSR0VUX0NNRF9CVUZfQkFTRV9QT1NUICAgICAgICgweDI0KQogI2RlZmluZSBNUElfRlVOQ1RJT05fVEFSR0VUX0NNRF9CVUZfTElTVF9QT1NUICAgICAgICgweDI1KQogCkBAIC02ODEsNiArNjg3LDE1IEBACiAjZGVmaW5lIE1QSV9JT0NTVEFUVVNfU0NTSV9FWFRfVEVSTUlOQVRFRCAgICAgICAoMHgwMDRDKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGb3IgdXNlIGJ5IFNDU0kgSW5pdGlhdG9yIGFuZCBTQ1NJIFRhcmdldCBlbmQtdG8tZW5kIGRhdGEgcHJvdGVjdGlvbiAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19FRURQX0dVQVJEX0VSUk9SICAgICAgICAgICgweDAwNEQpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfRUVEUF9SRUZfVEFHX0VSUk9SICAgICAgICAoMHgwMDRFKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0VFRFBfQVBQX1RBR19FUlJPUiAgICAgICAgKDB4MDA0RikKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICBTQ1NJIFRhcmdldCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCmluZGV4IDE1YjEyYjAuLmQ4MzM5ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2NuZmcuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIENvbmZpZyBtZXNzYWdlLCBzdHJ1Y3R1cmVzLCBhbmQgUGFnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVseSAyNywgMjAwMAogICoKLSAqICAgIG1waV9jbmZnLmggVmVyc2lvbjogIDAxLjA1LjA4CisgKiAgICBtcGlfY25mZy5oIFZlcnNpb246ICAwMS4wNS4wOQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTIzMiw2ICsyMzIsMjMgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIE5ldyBwaHlzaWNhbCBtYXBwaW5nIG1vZGUgaW4gU0FTIElPIFVuaXQgUGFnZSAyLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQ09ORklHX1BBR0VfU0FTX0VOQ0xPU1VSRV8wLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU2xvdCBhbmQgRW5jbG9zdXJlIGZpZWxkcyB0byBTQVMgRGV2aWNlIFBhZ2UgMC4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDkgIEFkZGVkIEVFRFAgZGVmaW5lcyB0byBJT0MgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBSQUlEIHR5cGUgZGVmaW5lcyB0byBJT0MgUGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUG9ydCBFbmFibGUgRGVsYXkgc2V0dGluZ3MgdG8gQklPUyBQYWdlIDEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBCYWQgQmxvY2sgVGFibGUgRnVsbCBkZWZpbmUgdG8gUkFJRCBWb2x1bWUgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUHJldmlvdXMgU3RhdGUgZGVmaW5lcyB0byBSQUlEIFBoeXNpY2FsIERpc2sKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heCBTYXRhIFRhcmdldHMgZGVmaW5lIGZvciBEaXNjb3ZlcnlTdGF0dXMgZmllbGQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFNBUyBJTyBVbml0IFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIERldmljZSBTZWxmIFRlc3QgdG8gQ29udHJvbCBGbGFncyBvZiBTQVMgSU8gVW5pdAorICogICAgICAgICAgICAgICAgICAgICAgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRGlyZWN0IEF0dGFjaCBTdGFydGluZyBTbG90IE51bWJlciBkZWZpbmUgZm9yIFNBUworICogICAgICAgICAgICAgICAgICAgICAgSU8gVW5pdCBQYWdlIDIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgZmllbGRzIGluIFNBUyBEZXZpY2UgUGFnZSAyIGZvciBlbmNsb3N1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBPd25lckRldkhhbmRsZSBhbmQgRmxhZ3MgZmllbGQgdG8gU0FTIFBIWSBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJT0MgR1BJTyBGbGFncyBkZWZpbmUgdG8gU0FTIEVuY2xvc3VyZSBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCB0aGUgdmFsdWUgZm9yIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVRBX1NVUFBPUlQuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC00NzcsNiArNDk0LDcgQEAKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkyOVggICAgICAgICAgICAoMHgwNjI2KQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTM5WCAgICAgICAgICAgICgweDA2NDIpCiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5NDlYICAgICAgICAgICAgKDB4MDY0MCkKKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzk0OUVTICAgICAgICAgICAoMHgwNjQ2KQogLyogU0NTSSAqLwogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzUzQzEwMzAgICAgICAgICAgICAgICgweDAwMzApCiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfNTNDMTAzMFpDICAgICAgICAgICAgKDB4MDAzMSkKQEAgLTc2OSw5ICs3ODcsMTMgQEAKIH0gQ09ORklHX1BBR0VfSU9DXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9JT0NfMSwKICAgSU9DUGFnZTFfdCwgTVBJX1BPSU5URVIgcElPQ1BhZ2UxX3Q7CiAKLSNkZWZpbmUgTVBJX0lPQ1BBR0UxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAzKQogCiAvKiBkZWZpbmVzIGZvciB0aGUgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0lPQ1BBR0UxX0VFRFBfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4MDcwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9FRURQX01PREVfT0ZGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfSU9DUEFHRTFfRUVEUF9NT0RFX1QxMCAgICAgICAgICAgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgTVBJX0lPQ1BBR0UxX0VFRFBfTU9ERV9MU0lfMSAgICAgICAgICAgICAgICAgICAgKDB4MDIwMDAwMDApCiAjZGVmaW5lIE1QSV9JT0NQQUdFMV9JTklUSUFUT1JfQ09OVEVYVF9SRVBMWV9ESVNBQkxFICAgICgweDAwMDAwMDEwKQogI2RlZmluZSBNUElfSU9DUEFHRTFfUkVQTFlfQ09BTEVTQ0lORyAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKIApAQCAtNzk1LDYgKzgxNywxMSBAQAogI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9JUyAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9JTUUgICAgICAgICAgICAgICAgICAgICAgICgweDAxKQogI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9JTSAgICAgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9SQUlEXzUgICAgICAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9SQUlEXzYgICAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9SQUlEXzEwICAgICAgICAgICAgICAgICAgICgweDA1KQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9SQUlEXzUwICAgICAgICAgICAgICAgICAgICgweDA2KQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICgweEZGKQogCiAvKiBJT0MgUGFnZSAyIFZvbHVtZSBGbGFncyB2YWx1ZXMgKi8KIApAQCAtODIwLDEzICs4NDcsMTcgQEAKIH0gQ09ORklHX1BBR0VfSU9DXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9JT0NfMiwKICAgSU9DUGFnZTJfdCwgTVBJX1BPSU5URVIgcElPQ1BhZ2UyX3Q7CiAKLSNkZWZpbmUgTVBJX0lPQ1BBR0UyX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9JT0NQQUdFMl9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAzKQogCiAvKiBJT0MgUGFnZSAyIENhcGFiaWxpdGllcyBmbGFncyAqLwogCiAjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfSVNfU1VQUE9SVCAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQogI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX0lNRV9TVVBQT1JUICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKICNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19JTV9TVVBQT1JUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfUkFJRF81X1NVUFBPUlQgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX1JBSURfNl9TVVBQT1JUICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19SQUlEXzEwX1NVUFBPUlQgICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfUkFJRF81MF9TVVBQT1JUICAgICAgICAgICgweDAwMDAwMDQwKQogI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX1NFU19TVVBQT1JUICAgICAgICAgICAgICAoMHgyMDAwMDAwMCkKICNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19TQUZURV9TVVBQT1JUICAgICAgICAgICAgKDB4NDAwMDAwMDApCiAjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfQ1JPU1NfQ0hBTk5FTF9TVVBQT1JUICAgICgweDgwMDAwMDAwKQpAQCAtOTQ1LDcgKzk3Niw3IEBACiB9IENPTkZJR19QQUdFX0JJT1NfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0JJT1NfMSwKICAgQklPU1BhZ2UxX3QsIE1QSV9QT0lOVEVSIHBCSU9TUGFnZTFfdDsKIAotI2RlZmluZSBNUElfQklPU1BBR0UxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCiAKIC8qIHZhbHVlcyBmb3IgdGhlIEJpb3NPcHRpb25zIGZpZWxkICovCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfT1BUSU9OU19TUElfRU5BQkxFICAgICAgICAgICAgICAgICgweDAwMDAwNDAwKQpAQCAtOTU0LDYgKzk4NSw4IEBACiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfT1BUSU9OU19ESVNBQkxFX0JJT1MgICAgICAgICAgICAgICgweDAwMDAwMDAxKQogCiAvKiB2YWx1ZXMgZm9yIHRoZSBJT0NTZXR0aW5ncyBmaWVsZCAqLworI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9NQVNLX1BPUlRfRU5BQkxFX0RFTEFZICAgICAoMHgwMEYwMDAwMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfU0hJRlRfUE9SVF9FTkFCTEVfREVMQVkgICAgKDIwKQogI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9NQVNLX0JPT1RfUFJFRkVSRU5DRSAgICAgICAoMHgwMDAzMDAwMCkKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfRU5DTE9TVVJFX1NMT1RfQk9PVCAgICAgICAgKDB4MDAwMDAwMDApCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX1NBU19BRERSRVNTX0JPT1QgICAgICAgICAgICgweDAwMDEwMDAwKQpAQCAtMTE2Nyw2ICsxMjAwLDcgQEAKICNkZWZpbmUgTVBJX0JJT1NQQUdFMl9GT1JNX1BDSV9TTE9UX05VTUJFUiAgICAgICAgICAgICAgKDB4MDMpCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTJfRk9STV9GQ19XV04gICAgICAgICAgICAgICAgICAgICAgICgweDA0KQogI2RlZmluZSBNUElfQklPU1BBR0UyX0ZPUk1fU0FTX1dXTiAgICAgICAgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMl9GT1JNX0VOQ0xPU1VSRV9TTE9UICAgICAgICAgICAgICAgKDB4MDYpCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5NTcsMTEgKzE5OTEsMTEgQEAKICAgUmFpZFZvbDBTdGF0dXNfdCwgTVBJX1BPSU5URVIgcFJhaWRWb2wwU3RhdHVzX3Q7CiAKIC8qIFJBSUQgVm9sdW1lIFBhZ2UgMCBWb2x1bWVTdGF0dXMgZGVmaW5lcyAqLwotCiAjZGVmaW5lIE1QSV9SQUlEVk9MMF9TVEFUVVNfRkxBR19FTkFCTEVEICAgICAgICAgICAgICAgICgweDAxKQogI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX0ZMQUdfUVVJRVNDRUQgICAgICAgICAgICAgICAoMHgwMikKICNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19GTEFHX1JFU1lOQ19JTl9QUk9HUkVTUyAgICAgKDB4MDQpCiAjZGVmaW5lIE1QSV9SQUlEVk9MMF9TVEFUVVNfRkxBR19WT0xVTUVfSU5BQ1RJVkUgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX0ZMQUdfQkFEX0JMT0NLX1RBQkxFX0ZVTEwgICAoMHgxMCkKIAogI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX1NUQVRFX09QVElNQUwgICAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19TVEFURV9ERUdSQURFRCAgICAgICAgICAgICAgKDB4MDEpCkBAIC0yMDI1LDcgKzIwNTksNyBAQAogfSBDT05GSUdfUEFHRV9SQUlEX1ZPTF8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfUkFJRF9WT0xfMCwKICAgUmFpZFZvbHVtZVBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBSYWlkVm9sdW1lUGFnZTBfdDsKIAotI2RlZmluZSBNUElfUkFJRFZPTFBBR0UwX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1JBSURWT0xQQUdFMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDUpCiAKIC8qIHZhbHVlcyBmb3IgUkFJRCBWb2x1bWUgUGFnZSAwIEluYWN0aXZlU3RhdHVzIGZpZWxkICovCiAjZGVmaW5lIE1QSV9SQUlEVk9MUEFHRTBfVU5LTk9XTl9JTkFDVElWRSAgICAgICAgICAgICAgICgweDAwKQpAQCAtMjEwNCw2ICsyMTM4LDggQEAKICNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfRkxBR19PVVRfT0ZfU1lOQyAgICAgICAgICAgKDB4MDEpCiAjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX0ZMQUdfUVVJRVNDRUQgICAgICAgICAgICAgICgweDAyKQogI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19GTEFHX0lOQUNUSVZFX1ZPTFVNRSAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfRkxBR19PUFRJTUFMX1BSRVZJT1VTICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX0ZMQUdfTk9UX09QVElNQUxfUFJFVklPVVMgICgweDA4KQogCiAjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX09OTElORSAgICAgICAgICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19NSVNTSU5HICAgICAgICAgICAgICAgICAgICAoMHgwMSkKQEAgLTIxMzIsNyArMjE2OCw3IEBACiB9IENPTkZJR19QQUdFX1JBSURfUEhZU19ESVNLXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9SQUlEX1BIWVNfRElTS18wLAogICBSYWlkUGh5c0Rpc2tQYWdlMF90LCBNUElfUE9JTlRFUiBwUmFpZFBoeXNEaXNrUGFnZTBfdDsKIAotI2RlZmluZSBNUElfUkFJRFBIWVNESVNLUEFHRTBfUEFHRVZFUlNJT04gICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfUkFJRFBIWVNESVNLUEFHRTBfUEFHRVZFUlNJT04gICAgICAgICAgICgweDAyKQogCiAKIHR5cGVkZWYgc3RydWN0IF9SQUlEX1BIWVNfRElTSzFfUEFUSApAQCAtMjI2Myw3ICsyMjk5LDcgQEAKIH0gQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1NBU19JT19VTklUXzAsCiAgIFNhc0lPVW5pdFBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBTYXNJT1VuaXRQYWdlMF90OwogCi0jZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMF9QQUdFVkVSU0lPTiAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0FTSU9VTklUUEFHRTBfUEFHRVZFUlNJT04gICAgICAoMHgwMykKIAogLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDAgUG9ydEZsYWdzICovCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9QT1JUX0ZMQUdTX0RJU0NPVkVSWV9JTl9QUk9HUkVTUyAgICAoMHgwOCkKQEAgLTIyOTksNiArMjMzNSw3IEBACiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9EU19TVUJUUkFDVElWRV9MSU5LICAgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQwX0RTX1RBQkxFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNDAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfRFNfVU5TVVBQT1JURURfREVWSUNFICAgICAgICAgICAgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9EU19NQVhfU0FUQV9UQVJHRVRTICAgICAgICAgICAgICAgICAoMHgwMDAwMTAwMCkKIAogCiB0eXBlZGVmIHN0cnVjdCBfTVBJX1NBU19JT19VTklUMV9QSFlfREFUQQpAQCAtMjMzNiw2ICsyMzczLDcgQEAKICNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UxX1BBR0VWRVJTSU9OICAgICAgKDB4MDQpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIENvbnRyb2xGbGFncyAqLworI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZJQ0VfU0VMRl9URVNUICAgICAgICAoMHg4MDAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzNfMF9NQVggICAgICAgICAgICAoMHg0MDAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzFfNV9NQVggICAgICAgICAgICAoMHgyMDAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX1NXX1BSRVNFUlZFICAgICAgICAoMHgxMDAwKQpAQCAtMjM0NSw5ICsyMzgzLDggQEAKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0hJRlRfREVWX1NVUFBPUlQgICAgICAgKDkpCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TVVBQT1JUX0JPVEggICAgICAgICgweDAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU0FTX1NVUFBPUlQgICAgICAgICAoMHgwMSkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBVEFfU1VQUE9SVCAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVRBX1NVUFBPUlQgICAgICAgICgweDAyKQogCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0FVVE9fUE9SVF9TQU1FX1NBU19BRERSICgweDAxMDApCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfNDhCSVRfTEJBX1JFUVVJUkVEICgweDAwODApCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfU01BUlRfUkVRVUlSRUQgICAgICgweDAwNDApCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfTkNRX1JFUVVJUkVEICAgICAgICgweDAwMjApCkBAIC0yMzkwLDcgKzI0MjcsNyBAQAogfSBDT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8yLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMiwKICAgU2FzSU9Vbml0UGFnZTJfdCwgTVBJX1BPSU5URVIgcFNhc0lPVW5pdFBhZ2UyX3Q7CiAKLSNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UyX1BBR0VWRVJTSU9OICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMl9QQUdFVkVSU0lPTiAgICAgICgweDA0KQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMiBTdGF0dXMgZmllbGQgKi8KICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX1NUQVRVU19ESVNBQkxFRF9QRVJTSVNURU5UX01BUFBJTkdTICgweDAyKQpAQCAtMjQwNiw2ICsyNDQzLDcgQEAKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0VOQ0xPU1VSRV9TTE9UX1BIWVNfTUFQICAgICAgICgweDAyKQogCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9GTEFHU19SRVNFUlZFX0lEXzBfRk9SX0JPT1QgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0RBX1NUQVJUSU5HX1NMT1QgICAgICAgICAgICAgICgweDIwKQogCiAKIHR5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8zCkBAIC0yNTg0LDExICsyNjIyLDE5IEBACiB7CiAgICAgQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSICAgICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgLyogMDBoICovCiAgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxJZGVudGlmaWVyOyAgICAgLyogMDhoICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jbG9zdXJlTWFwcGluZzsgICAgICAgLyogMTBoICovCiB9IENPTkZJR19QQUdFX1NBU19ERVZJQ0VfMiwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1NBU19ERVZJQ0VfMiwKICAgU2FzRGV2aWNlUGFnZTJfdCwgTVBJX1BPSU5URVIgcFNhc0RldmljZVBhZ2UyX3Q7CiAKLSNkZWZpbmUgTVBJX1NBU0RFVklDRTJfUEFHRVZFUlNJT04gICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TQVNERVZJQ0UyX1BBR0VWRVJTSU9OICAgICAgICAgICgweDAxKQorCisvKiBkZWZpbmVzIGZvciBTQVMgRGV2aWNlIFBhZ2UgMiBFbmNsb3N1cmVNYXBwaW5nIGZpZWxkICovCisjZGVmaW5lIE1QSV9TQVNERVZJQ0UyX0VOQ19NQVBfTUFTS19NSVNTSU5HX0NPVU5UICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBNUElfU0FTREVWSUNFMl9FTkNfTUFQX1NISUZUX01JU1NJTkdfQ09VTlQgICAgICAoMCkKKyNkZWZpbmUgTVBJX1NBU0RFVklDRTJfRU5DX01BUF9NQVNLX05VTV9TTE9UUyAgICAgICAgICAgKDB4MDAwMDA3RjApCisjZGVmaW5lIE1QSV9TQVNERVZJQ0UyX0VOQ19NQVBfU0hJRlRfTlVNX1NMT1RTICAgICAgICAgICg0KQorI2RlZmluZSBNUElfU0FTREVWSUNFMl9FTkNfTUFQX01BU0tfU1RBUlRfSU5ERVggICAgICAgICAoMHgwMDFGRjgwMCkKKyNkZWZpbmUgTVBJX1NBU0RFVklDRTJfRU5DX01BUF9TSElGVF9TVEFSVF9JTkRFWCAgICAgICAgKDExKQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNTk4LDcgKzI2NDQsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NBU19QSFlfMAogewogICAgIENPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLwotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVyRGV2SGFuZGxlOyAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDBBaCAqLwogICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgICAgIC8qIDBDaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaGVkRGV2SGFuZGxlOyAgICAgIC8qIDE0aCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaGVkUGh5SWRlbnRpZmllcjsgIC8qIDE2aCAqLwpAQCAtMjYwNywxMiArMjY1NCwxMiBAQAogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1tZWRMaW5rUmF0ZTsgICAgIC8qIDIwaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh3TGlua1JhdGU7ICAgICAgICAgICAgIC8qIDIxaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUNvdW50OyAgICAgICAgICAgIC8qIDIyaCAqLwotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDIzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIDIzaCAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeUluZm87ICAgICAgICAgICAgICAgIC8qIDI0aCAqLwogfSBDT05GSUdfUEFHRV9TQVNfUEhZXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfUEhZXzAsCiAgIFNhc1BoeVBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBTYXNQaHlQYWdlMF90OwogCi0jZGVmaW5lIE1QSV9TQVNQSFkwX1BBR0VWRVJTSU9OICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0FTUEhZMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAoMHgwMSkKIAogLyogdmFsdWVzIGZvciBTQVMgUEhZIFBhZ2UgMCBQcm9ncmFtbWVkTGlua1JhdGUgZmllbGQgKi8KICNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoMHhGMCkKQEAgLTI2MzIsNiArMjY3OSw5IEBACiAjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUlOX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDgpCiAjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUlOX1JBVEVfM18wICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDkpCiAKKy8qIHZhbHVlcyBmb3IgU0FTIFBIWSBQYWdlIDAgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX1NBU19QSFkwX0ZMQUdTX1NHUElPX0RJUkVDVF9BVFRBQ0hfRU5DICAgICAgICAgICAgICAoMHgwMSkKKwogLyogdmFsdWVzIGZvciBTQVMgUEhZIFBhZ2UgMCBQaHlJbmZvIGZpZWxkICovCiAjZGVmaW5lIE1QSV9TQVNfUEhZMF9QSFlJTkZPX1NBVEFfUE9SVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgKDB4MDAwMDQwMDApCiAjZGVmaW5lIE1QSV9TQVNfUEhZMF9QSFlJTkZPX1NBVEFfUE9SVF9TRUxFQ1RPUiAgICAgICAgICAgICAgICAgKDB4MDAwMDIwMDApCkBAIC0yNjkwLDcgKzI3NDAsNyBAQAogfSBDT05GSUdfUEFHRV9TQVNfRU5DTE9TVVJFXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfRU5DTE9TVVJFXzAsCiAgIFNhc0VuY2xvc3VyZVBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBTYXNFbmNsb3N1cmVQYWdlMF90OwogCi0jZGVmaW5lIE1QSV9TQVNFTkNMT1NVUkUwX1BBR0VWRVJTSU9OICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0FTRU5DTE9TVVJFMF9QQUdFVkVSU0lPTiAgICAgICAoMHgwMSkKIAogLyogdmFsdWVzIGZvciBTQVMgRW5jbG9zdXJlIFBhZ2UgMCBGbGFncyBmaWVsZCAqLwogI2RlZmluZSBNUElfU0FTX0VOQ0xTMF9GTEFHU19TRVBfQlVTX0lEX1ZBTElEICAgICAgICgweDAwMjApCkBAIC0yNzAyLDYgKzI3NTIsNyBAQAogI2RlZmluZSBNUElfU0FTX0VOQ0xTMF9GTEFHU19NTkdfSU9DX1NHUElPICAgICAgICAgICgweDAwMDIpCiAjZGVmaW5lIE1QSV9TQVNfRU5DTFMwX0ZMQUdTX01OR19FWFBfU0dQSU8gICAgICAgICAgKDB4MDAwMykKICNkZWZpbmUgTVBJX1NBU19FTkNMUzBfRkxBR1NfTU5HX1NFU19FTkNMT1NVUkUgICAgICAoMHgwMDA0KQorI2RlZmluZSBNUElfU0FTX0VOQ0xTMF9GTEFHU19NTkdfSU9DX0dQSU8gICAgICAgICAgICgweDAwMDUpCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dAppbmRleCBjOWVkYmVlLi4xYTMwZWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2hpc3RvcnkudHh0CkBAIC02LDE3ICs2LDE3IEBACiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgogCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSGVhZGVyIFNldCBSZWxlYXNlIFZlcnNpb246ICAgIDAxLjA1LjA5CisgSGVhZGVyIFNldCBSZWxlYXNlIFZlcnNpb246ICAgIDAxLjA1LjEwCiAgSGVhZGVyIFNldCBSZWxlYXNlIERhdGU6ICAgICAgIDAzLTExLTA1CiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICBGaWxlbmFtZSAgICAgICAgICAgICAgIEN1cnJlbnQgdmVyc2lvbiAgICAgUHJpb3IgdmVyc2lvbgogIC0tLS0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tCi0gbXBpLmggICAgICAgICAgICAgICAgICAwMS4wNS4wNyAgICAgICAgICAgIDAxLjA1LjA2Ci0gbXBpX2lvYy5oICAgICAgICAgICAgICAwMS4wNS4wOCAgICAgICAgICAgIDAxLjA1LjA3Ci0gbXBpX2NuZmcuaCAgICAgICAgICAgICAwMS4wNS4wOCAgICAgICAgICAgIDAxLjA1LjA3Ci0gbXBpX2luaXQuaCAgICAgICAgICAgICAwMS4wNS4wNCAgICAgICAgICAgIDAxLjA1LjAzCi0gbXBpX3RhcmcuaCAgICAgICAgICAgICAwMS4wNS4wNCAgICAgICAgICAgIDAxLjA1LjAzCisgbXBpLmggICAgICAgICAgICAgICAgICAwMS4wNS4wOCAgICAgICAgICAgIDAxLjA1LjA3CisgbXBpX2lvYy5oICAgICAgICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA4CisgbXBpX2NuZmcuaCAgICAgICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA4CisgbXBpX2luaXQuaCAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA0CisgbXBpX3RhcmcuaCAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA0CiAgbXBpX2ZjLmggICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX2xhbi5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX3JhaWQuaCAgICAgICAgICAgICAwMS4wNS4wMiAgICAgICAgICAgIDAxLjA1LjAyCkBAIC0yNCw3ICsyNCw3IEBACiAgbXBpX2luYi5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX3Nhcy5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX3R5cGUuaCAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCi0gbXBpX2hpc3RvcnkudHh0ICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA4CisgbXBpX2hpc3RvcnkudHh0ICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA5CiAKIAogICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KQEAgLTg4LDYgKzg4LDkgQEAKICAqICAwMy0xMS0wNSAgMDEuMDUuMDcgIFJlbW92ZWQgZnVuY3Rpb24gY29kZXMgZm9yIFNDU0kgSU8gMzIgYW5kCiAgKiAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBc3Npc3RFeHRlbmRlZCByZXF1ZXN0cy4KICAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgRUVEUCBJT0NTdGF0dXMgY29kZXMuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA4ICBBZGRlZCBmdW5jdGlvbiBjb2RlcyBmb3IgU0NTSSBJTyAzMiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEFzc2lzdEV4dGVuZGVkIHJlcXVlc3RzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRUVEUCBJT0NTdGF0dXMgY29kZXMuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX2lvYy5oCkBAIC0xNTksNiArMTYyLDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgIFJlcGx5IGFuZCBJT0MgSW5pdCBSZXF1ZXN0LgogICogIDAzLTExLTA1ICAwMS4wNS4wOCAgQWRkZWQgZmFtaWx5IGNvZGUgZm9yIDEwNjhFIGZhbWlseS4KICAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgSU9DRmFjdHMgUmVwbHkgRUVEUCBDYXBhYmlsaXR5IGJpdC4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDkgIEFkZGVkIDUgbmV3IElPQ0ZhY3RzIFJlcGx5IElPQ0NhcGFiaWxpdGllcyBiaXRzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTWF4IFNBVEEgVGFyZ2V0cyB0byBTQVMgRGlzY292ZXJ5IEVycm9yIGV2ZW50LgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9jbmZnLmgKQEAgLTM4MCw2ICszODUsMjMgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIE5ldyBwaHlzaWNhbCBtYXBwaW5nIG1vZGUgaW4gU0FTIElPIFVuaXQgUGFnZSAyLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQ09ORklHX1BBR0VfU0FTX0VOQ0xPU1VSRV8wLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU2xvdCBhbmQgRW5jbG9zdXJlIGZpZWxkcyB0byBTQVMgRGV2aWNlIFBhZ2UgMC4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDkgIEFkZGVkIEVFRFAgZGVmaW5lcyB0byBJT0MgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBSQUlEIHR5cGUgZGVmaW5lcyB0byBJT0MgUGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUG9ydCBFbmFibGUgRGVsYXkgc2V0dGluZ3MgdG8gQklPUyBQYWdlIDEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBCYWQgQmxvY2sgVGFibGUgRnVsbCBkZWZpbmUgdG8gUkFJRCBWb2x1bWUgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUHJldmlvdXMgU3RhdGUgZGVmaW5lcyB0byBSQUlEIFBoeXNpY2FsIERpc2sKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heCBTYXRhIFRhcmdldHMgZGVmaW5lIGZvciBEaXNjb3ZlcnlTdGF0dXMgZmllbGQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFNBUyBJTyBVbml0IFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIERldmljZSBTZWxmIFRlc3QgdG8gQ29udHJvbCBGbGFncyBvZiBTQVMgSU8gVW5pdAorICogICAgICAgICAgICAgICAgICAgICAgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRGlyZWN0IEF0dGFjaCBTdGFydGluZyBTbG90IE51bWJlciBkZWZpbmUgZm9yIFNBUworICogICAgICAgICAgICAgICAgICAgICAgSU8gVW5pdCBQYWdlIDIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgZmllbGRzIGluIFNBUyBEZXZpY2UgUGFnZSAyIGZvciBlbmNsb3N1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBPd25lckRldkhhbmRsZSBhbmQgRmxhZ3MgZmllbGQgdG8gU0FTIFBIWSBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJT0MgR1BJTyBGbGFncyBkZWZpbmUgdG8gU0FTIEVuY2xvc3VyZSBQYWdlIDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCB0aGUgdmFsdWUgZm9yIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVRBX1NVUFBPUlQuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX2luaXQuaApAQCAtNDE4LDYgKzQ0MCw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBTQ1NJIEVuY2xvc3VyZSBQcm9jZXNzb3IgUmVxdWVzdCBhbmQgUmVwbHkgdG8KICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgRW5jbG9zdXJlL1Nsb3QgYWRkcmVzc2luZyByYXRoZXIgdGhhbiBXV0lECiAgKiAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nLgorICogIDA2LTI0LTA1ICAwMS4wNS4wNSAgQWRkZWQgU0NTSSBJTyAzMiBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZm91ciBuZXcgZGVmaW5lcyBmb3IgU0VQIFNsb3RTdGF0dXMuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX3RhcmcuaApAQCAtNDYxLDYgKzQ4NSw3IEBACiAgKiAgMTAtMDUtMDQgIDAxLjA1LjAyICBNU0dfVEFSR0VUX0NNRF9CVUZGRVJfUE9TVF9CQVNFX0xJU1RfUkVQTFkgYWRkZWQuCiAgKiAgMDItMjItMDUgIDAxLjA1LjAzICBDaGFuZ2VkIGEgY29tbWVudC4KICAqICAwMy0xMS0wNSAgMDEuMDUuMDQgIFJlbW92ZWQgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgUmVxdWVzdC4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDUgIEFkZGVkIFRhcmdldEFzc2lzdEV4dGVuZGVkIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX2ZjLmgKQEAgLTU3MSwyMCArNTk2LDIwIEBACiAKIG1waV9oaXN0b3J5LnR4dCAgICAgICAgIFBhcnRzIGxpc3QgaGlzdG9yeQogCi1GaWxlbmFtZSAgICAwMS4wNS4wOQotLS0tLS0tLS0tLSAgLS0tLS0tLS0KLW1waS5oICAgICAgIDAxLjA1LjA3Ci1tcGlfaW9jLmggICAwMS4wNS4wOAotbXBpX2NuZmcuaCAgMDEuMDUuMDgKLW1waV9pbml0LmggIDAxLjA1LjA0Ci1tcGlfdGFyZy5oICAwMS4wNS4wNAotbXBpX2ZjLmggICAgMDEuMDUuMDEKLW1waV9sYW4uaCAgIDAxLjA1LjAxCi1tcGlfcmFpZC5oICAwMS4wNS4wMgotbXBpX3Rvb2wuaCAgMDEuMDUuMDMKLW1waV9pbmIuaCAgIDAxLjA1LjAxCi1tcGlfc2FzLmggICAwMS4wNS4wMQotbXBpX3R5cGUuaCAgMDEuMDUuMDEKK0ZpbGVuYW1lICAgIDAxLjA1LjEwICAwMS4wNS4wOQorLS0tLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tCittcGkuaCAgICAgICAwMS4wNS4wOCAgMDEuMDUuMDcKK21waV9pb2MuaCAgIDAxLjA1LjA5ICAwMS4wNS4wOAorbXBpX2NuZmcuaCAgMDEuMDUuMDkgIDAxLjA1LjA4CittcGlfaW5pdC5oICAwMS4wNS4wNSAgMDEuMDUuMDQKK21waV90YXJnLmggIDAxLjA1LjA1ICAwMS4wNS4wNAorbXBpX2ZjLmggICAgMDEuMDUuMDEgIDAxLjA1LjAxCittcGlfbGFuLmggICAwMS4wNS4wMSAgMDEuMDUuMDEKK21waV9yYWlkLmggIDAxLjA1LjAyICAwMS4wNS4wMgorbXBpX3Rvb2wuaCAgMDEuMDUuMDMgIDAxLjA1LjAzCittcGlfaW5iLmggICAwMS4wNS4wMSAgMDEuMDUuMDEKK21waV9zYXMuaCAgIDAxLjA1LjAxICAwMS4wNS4wMQorbXBpX3R5cGUuaCAgMDEuMDUuMDEgIDAxLjA1LjAxCiAKIEZpbGVuYW1lICAgIDAxLjA1LjA4ICAgMDEuMDUuMDcgICAwMS4wNS4wNiAgIDAxLjA1LjA1ICAgMDEuMDUuMDQgICAwMS4wNS4wMwogLS0tLS0tLS0tLSAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaAppbmRleCBhY2EwMzU4Li5kNWFmNzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbml0LmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBpbml0aWF0b3IgbW9kZSBtZXNzYWdlcyBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDgsIDIwMDAKICAqCi0gKiAgICBtcGlfaW5pdC5oIFZlcnNpb246ICAwMS4wNS4wNAorICogICAgbXBpX2luaXQuaCBWZXJzaW9uOiAgMDEuMDUuMDUKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC00OCw2ICs0OCw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBTQ1NJIEVuY2xvc3VyZSBQcm9jZXNzb3IgUmVxdWVzdCBhbmQgUmVwbHkgdG8KICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgRW5jbG9zdXJlL1Nsb3QgYWRkcmVzc2luZyByYXRoZXIgdGhhbiBXV0lECiAgKiAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nLgorICogIDA2LTI0LTA1ICAwMS4wNS4wNSAgQWRkZWQgU0NTSSBJTyAzMiBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZm91ciBuZXcgZGVmaW5lcyBmb3IgU0VQIFNsb3RTdGF0dXMuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0yMDMsNiArMjA1LDE5NyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNDU0kgSU8gMzIgbWVzc2FnZXMgYW5kIGFzc29jaWF0ZWQgc3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDREJbMjBdOyAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeVJlZmVyZW5jZVRhZzsgICAgICAgIC8qIDE0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlBcHBsaWNhdGlvblRhZzsgICAgICAvKiAxOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5QXBwbGljYXRpb25UYWdNYXNrOyAgLyogMUFoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJMZW5ndGg7ICAgICAgICAgICAgIC8qIDFDaCAqLworfSBNUElfU0NTSV9JTzMyX0NEQl9FRURQMzIsIE1QSV9QT0lOVEVSIFBUUl9NUElfU0NTSV9JTzMyX0NEQl9FRURQMzIsCisgIE1waVNjc2lJbzMyQ2RiRWVkcDMyX3QsIE1QSV9QT0lOVEVSIHBNcGlTY3NpSW8zMkNkYkVlZHAzMl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENEQlsxNl07ICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeVJlZmVyZW5jZVRhZzsgICAgICAgIC8qIDE0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlBcHBsaWNhdGlvblRhZzsgICAgICAvKiAxOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5QXBwbGljYXRpb25UYWdNYXNrOyAgLyogMUFoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJMZW5ndGg7ICAgICAgICAgICAgIC8qIDFDaCAqLworfSBNUElfU0NTSV9JTzMyX0NEQl9FRURQMTYsIE1QSV9QT0lOVEVSIFBUUl9NUElfU0NTSV9JTzMyX0NEQl9FRURQMTYsCisgIE1waVNjc2lJbzMyQ2RiRWVkcDE2X3QsIE1QSV9QT0lOVEVSIHBNcGlTY3NpSW8zMkNkYkVlZHAxNl90OworCit0eXBlZGVmIHVuaW9uCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgIENEQjMyWzMyXTsKKyAgICBNUElfU0NTSV9JTzMyX0NEQl9FRURQMzIgRUVEUDMyOworICAgIE1QSV9TQ1NJX0lPMzJfQ0RCX0VFRFAxNiBFRURQMTY7CisgICAgU0dFX1NJTVBMRV9VTklPTiAgICAgICAgIFNHRTsKK30gTVBJX1NDU0lfSU8zMl9DREJfVU5JT04sIE1QSV9QT0lOVEVSIFBUUl9NUElfU0NTSV9JTzMyX0NEQl9VTklPTiwKKyAgTXBpU2NzaUlvMzJDZGJfdCwgTVBJX1BPSU5URVIgcE1waVNjc2lJbzMyQ2RiX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdXM7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNGggKi8KK30gTVBJX1NDU0lfSU8zMl9CVVNfVEFSR0VUX0lEX0ZPUk0sIE1QSV9QT0lOVEVSIFBUUl9NUElfU0NTSV9JTzMyX0JVU19UQVJHRVRfSURfRk9STSwKKyAgTXBpU2NzaUlvMzJCdXNUYXJnZXRJZEZvcm1fdCwgTVBJX1BPSU5URVIgcE1waVNjc2lJbzMyQnVzVGFyZ2V0SWRGb3JtX3Q7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBNUElfU0NTSV9JTzMyX0JVU19UQVJHRVRfSURfRk9STSAgICBTQ1NJSUQ7CisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1dJRDsKK30gTVBJX1NDU0lfSU8zMl9BRERSRVNTLCBNUElfUE9JTlRFUiBQVFJfTVBJX1NDU0lfSU8zMl9BRERSRVNTLAorICBNcGlTY3NpSW8zMkFkZHJlc3NfdCwgTVBJX1BPSU5URVIgcE1waVNjc2lJbzMyQWRkcmVzc190OworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NDU0lfSU8zMl9SRVFVRVNUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIENEQkxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFNlbnNlQnVmZmVyTGVuZ3RoOyAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIExVTls4XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMTRoICovCisgICAgTVBJX1NDU0lfSU8zMl9DREJfVU5JT04gICAgIENEQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgLyogMzhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIEJpZGlyZWN0aW9uYWxEYXRhTGVuZ3RoOyAgICAgICAgLyogM0NoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZGFyeVJlZmVyZW5jZVRhZzsgICAgICAgICAgLyogNDBoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZGFyeUFwcGxpY2F0aW9uVGFnOyAgICAgICAgLyogNDRoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgLyogNDZoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIEVFRFBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogNDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uVGFnVHJhbnNsYXRpb25NYXNrOyAgLyogNEFoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIEVFRFBCbG9ja1NpemU7ICAgICAgICAgICAgICAgICAgLyogNENoICovCisgICAgTVBJX1NDU0lfSU8zMl9BRERSRVNTICAgICAgIERldmljZUFkZHJlc3M7ICAgICAgICAgICAgICAgICAgLyogNTBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFNHTE9mZnNldDA7ICAgICAgICAgICAgICAgICAgICAgLyogNThoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFNHTE9mZnNldDE7ICAgICAgICAgICAgICAgICAgICAgLyogNTloICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFNHTE9mZnNldDI7ICAgICAgICAgICAgICAgICAgICAgLyogNUFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFNHTE9mZnNldDM7ICAgICAgICAgICAgICAgICAgICAgLyogNUJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgLyogNUNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAgICAgLyogNjBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFNlbnNlQnVmZmVyTG93QWRkcjsgICAgICAgICAgICAgLyogNjRoICovCisgICAgU0dFX0lPX1VOSU9OICAgICAgICAgICAgICAgIFNHTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjhoICovCit9IE1TR19TQ1NJX0lPMzJfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19TQ1NJX0lPMzJfUkVRVUVTVCwKKyAgU0NTSUlPMzJSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBTQ1NJSU8zMlJlcXVlc3RfdDsKKworLyogU0NTSSBJTyAzMiBNc2dGbGFncyBiaXRzICovCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX1dJRFRIICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9XSURUSF8zMiAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfV0lEVEhfNjQgICAgICAgICAgICAgKDB4MDEpCisKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfTE9DQVRJT04gICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX0xPQ19IT1NUICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9MT0NfSU9DICAgICAgICAgICAgICAoMHgwMikKKworI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19DTURfREVURVJNSU5FU19EQVRBX0RJUiAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0dMX09GRlNFVFNfQ0hBSU5TICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX01VTFRJQ0FTVCAgICAgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19CSURJUkVDVElPTkFMICAgICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfTEFSR0VfQ0RCICAgICAgICAgICAgICAgICAgKDB4NDApCisKKy8qIFNDU0kgSU8gMzIgRmxhZ3MgYml0cyAqLworI2RlZmluZSBNUElfU0NTSUlPMzJfRkxBR1NfRk9STV9NQVNLICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0ZMQUdTX0ZPUk1fU0NTSUlEICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9GTEFHU19GT1JNX1dXSUQgICAgICAgICAgICAgICAgICAgICgweDAxKQorCisvKiBTQ1NJIElPIDMyIExVTiBmaWVsZHMgKi8KKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0xVTl9GSVJTVF9MRVZFTF9BRERSRVNTSU5HICAgICAoMHgwMDAwRkZGRikKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0xVTl9TRUNPTkRfTEVWRUxfQUREUkVTU0lORyAgICAoMHhGRkZGMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0xVTl9USElSRF9MRVZFTF9BRERSRVNTSU5HICAgICAoMHgwMDAwRkZGRikKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0xVTl9GT1VSVEhfTEVWRUxfQUREUkVTU0lORyAgICAoMHhGRkZGMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0xVTl9MRVZFTF8xX1dPUkQgICAgICAgICAgICAgICAoMHhGRjAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfTFVOX0xFVkVMXzFfRFdPUkQgICAgICAgICAgICAgICgweDAwMDBGRjAwKQorCisvKiBTQ1NJIElPIDMyIENvbnRyb2wgYml0cyAqLworI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9EQVRBRElSRUNUSU9OX01BU0sgICAgICgweDAzMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9OT0RBVEFUUkFOU0ZFUiAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9XUklURSAgICAgICAgICAgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9SRUFEICAgICAgICAgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfQ09OVFJPTF9CSURJUkVDVElPTkFMICAgICAgICAgICgweDAzMDAwMDAwKQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0FERENEQkxFTl9NQVNLICAgICAgICAgKDB4RkMwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0FERENEQkxFTl9TSElGVCAgICAgICAgKDI2KQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1RBU0tBVFRSSUJVVEVfTUFTSyAgICAgKDB4MDAwMDA3MDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1NJTVBMRVEgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0hFQURPRlEgICAgICAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX09SREVSRURRICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX0FDQVEgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX1VOVEFHR0VEICAgICAgICAgICAgICAgKDB4MDAwMDA1MDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9DT05UUk9MX05PX0RJU0NPTk5FQ1QgICAgICAgICAgKDB4MDAwMDA3MDApCisKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfVEFTS01BTkFHRV9NQVNLICAgICAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfT0JTT0xFVEUgICAgICAgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfQ0xFQVJfQUNBX1JTViAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfVEFSR0VUX1JFU0VUICAgICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfTFVOX1JFU0VUX1JTViAgICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfUkVTRVJWRUQgICAgICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfQ0xSX1RBU0tfU0VUX1JTViAgICAgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfQUJPUlRfVEFTS19TRVQgICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0NPTlRST0xfUkVTRVJWRUQyICAgICAgICAgICAgICAoMHgwMDAxMDAwMCkKKworLyogU0NTSSBJTyAzMiBFRURQRmxhZ3MgKi8KKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19NQVNLX09QICAgICAgICAgICAgICAoMHgwMDA3KQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX05PT1BfT1AgICAgICAgICAgICAgICgweDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfQ0hLX09QICAgICAgICAgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19TVFJJUF9PUCAgICAgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0NIS1JNX09QICAgICAgICAgICAgICgweDAwMDMpCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfSU5TRVJUX09QICAgICAgICAgICAgKDB4MDAwNCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19SRVBMQUNFX09QICAgICAgICAgICAoMHgwMDA2KQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0NIS1JFR0VOX09QICAgICAgICAgICgweDAwMDcpCisKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19QQVNTX1JFRl9UQUcgICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTXzhfOVRIU19NT0RFICAgICAgICAgICgweDAwMTApCisKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19UMTBfQ0hLX01BU0sgICAgICAgICAoMHgwNzAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX1QxMF9DSEtfR1VBUkQgICAgICAgICgweDAxMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfVDEwX0NIS19SRUZUQUcgICAgICAgKDB4MDIwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19UMTBfQ0hLX0xCQVRBRyAgICAgICAoMHgwNDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX1QxMF9DSEtfU0hJRlQgICAgICAgICg4KQorCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfSU5DX1NFQ19BUFBUQUcgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX0VFRFBGTEFHU19JTkNfUFJJX0FQUFRBRyAgICAgICAoMHgyMDAwKQorI2RlZmluZSBNUElfU0NTSUlPMzJfRUVEUEZMQUdTX0lOQ19TRUNfUkVGVEFHICAgICAgICgweDQwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9FRURQRkxBR1NfSU5DX1BSSV9SRUZUQUcgICAgICAgKDB4ODAwMCkKKworCisvKiBTQ1NJSU8zMiBJTyByZXBseSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfU0NTSUlPMzJfSU9fUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQb3J0OyAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ0RCTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNlbnNlQnVmZmVyTGVuZ3RoOyAgICAgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTQ1NJU3RhdHVzOyAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0NTSVN0YXRlOyAgICAgICAgICAgICAgICAgIC8qIDBEaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDb3VudDsgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFNlbnNlQ291bnQ7ICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZUluZm87ICAgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgVGFza1RhZzsgICAgICAgICAgICAgICAgICAgIC8qIDIwaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAyMmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBCaWRpcmVjdGlvbmFsVHJhbnNmZXJDb3VudDsgLyogMjRoICovCit9IE1TR19TQ1NJSU8zMl9JT19SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19TQ1NJSU8zMl9JT19SRVBMWSwKKyAgU0NTSUlPMzJSZXBseV90LCBNUElfUE9JTlRFUiBwU0NTSUlPMzJSZXBseV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogIFNDU0kgVGFzayBNYW5hZ2VtZW50IG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzEwLDEwICs1MDMsMTQgQEAKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgICAgKDB4MDAwMDAwODApCiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfSE9UX1NQQVJFICAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQogI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1JFQlVJTERfU1RPUFBFRCAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19SRVFfQ09OU0lTVEVOQ1lfQ0hFQ0sgICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfRElTQUJMRSAgICAgICAgICAgICAgICAgICgweDAwMDAyMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1JFUV9SRVNFUlZFRF9ERVZJQ0UgICAgICAoMHgwMDAwNDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19JREVOVElGWV9SRVFVRVNUICAgICAgICAgKDB4MDAwMjAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfUkVRVUVTVF9SRU1PVkUgICAgICAgICAgICgweDAwMDQwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1JFUVVFU1RfSU5TRVJUICAgICAgICAgICAoMHgwMDA4MDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19ET19OT1RfTU9WRSAgICAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAgICAgICgweDAwODAwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0JfRU5BQkxFX0JZUEFTUyAgICAgICAgICAoMHgwNDAwMDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19BX0VOQUJMRV9CWVBBU1MgICAgICAgICAgKDB4MDgwMDAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfREVWX09GRiAgICAgICAgICAgICAgICAgICgweDEwMDAwMDAwKQpAQCAtMzUyLDExICs1NDksMTUgQEAKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1VOQ09ORklHVVJFRCAgICAgICAgICAgKDB4MDAwMDAwODApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19IT1RfU1BBUkUgICAgICAgICAgICAgICgweDAwMDAwMTAwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfUkVCVUlMRF9TVE9QUEVEICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0NPTlNJU1RFTkNZX0NIRUNLICAgICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19ESVNBQkxFICAgICAgICAgICAgICAgICgweDAwMDAyMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfUkVTRVJWRURfREVWSUNFICAgICAgICAoMHgwMDAwNDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1JFUE9SVCAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19JREVOVElGWV9SRVFVRVNUICAgICAgICgweDAwMDIwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfUkVNT1ZFX1JFQURZICAgICAgICAgICAoMHgwMDA0MDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0lOU0VSVF9SRUFEWSAgICAgICAgICAgKDB4MDAwODAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19ET19OT1RfUkVNT1ZFICAgICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAgICAoMHgwMDgwMDAwMCkKICNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0JfQllQQVNTX0VOQUJMRUQgICAgICAgKDB4MDEwMDAwMDApCiAjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19BX0JZUEFTU19FTkFCTEVEICAgICAgICgweDAyMDAwMDAwKQogI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfQl9FTkFCTEVfQllQQVNTICAgICAgICAoMHgwNDAwMDAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaAppbmRleCBmOTFlYjRlLi45M2I3MGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgQXVndXN0IDExLCAyMDAwCiAgKgotICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS4wOAorICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS4wOQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTgxLDYgKzgxLDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgIFJlcGx5IGFuZCBJT0MgSW5pdCBSZXF1ZXN0LgogICogIDAzLTExLTA1ICAwMS4wNS4wOCAgQWRkZWQgZmFtaWx5IGNvZGUgZm9yIDEwNjhFIGZhbWlseS4KICAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgSU9DRmFjdHMgUmVwbHkgRUVEUCBDYXBhYmlsaXR5IGJpdC4KKyAqICAwNi0yNC0wNSAgMDEuMDUuMDkgIEFkZGVkIDUgbmV3IElPQ0ZhY3RzIFJlcGx5IElPQ0NhcGFiaWxpdGllcyBiaXRzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTWF4IFNBVEEgVGFyZ2V0cyB0byBTQVMgRGlzY292ZXJ5IEVycm9yIGV2ZW50LgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMjYxLDcgKzI2MywxMSBAQAogI2RlZmluZSBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9ESUFHX1RSQUNFX0JVRkZFUiAgICAgICAoMHgwMDAwMDAwOCkKICNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfU05BUFNIT1RfQlVGRkVSICAgICAgICAgKDB4MDAwMDAwMTApCiAjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0VYVEVOREVEX0JVRkZFUiAgICAgICAgICgweDAwMDAwMDIwKQotCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0VFRFAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9CSURJUkVDVElPTkFMICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfTVVMVElDQVNUICAgICAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX1NDU0lJTzMyICAgICAgICAgICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9OT19TQ1NJSU8xNiAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY3Nyw2ICs2ODMsNyBAQAogI2RlZmluZSBNUElfRVZFTlRfRFNDVlJZX0VSUl9EU19NVUxUUExfU1VCVFJBQ1RJVkUgICAgICAgICAgKDB4MDAwMDAyMDApCiAjZGVmaW5lIE1QSV9FVkVOVF9EU0NWUllfRVJSX0RTX1RBQkxFX1RPX1RBQkxFICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKICNkZWZpbmUgTVBJX0VWRU5UX0RTQ1ZSWV9FUlJfRFNfTVVMVFBMX1BBVEhTICAgICAgICAgICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBNUElfRVZFTlRfRFNDVlJZX0VSUl9EU19NQVhfU0FUQV9UQVJHRVRTICAgICAgICAgICAgKDB4MDAwMDEwMDApCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdGFyZy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaAppbmRleCA2MjM5MDFmLi4zZjQ2Mjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdGFyZy5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90YXJnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBUYXJnZXQgbW9kZSBtZXNzYWdlcyBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDIyLCAyMDAwCiAgKgotICogICAgbXBpX3RhcmcuaCBWZXJzaW9uOiAgMDEuMDUuMDQKKyAqICAgIG1waV90YXJnLmggVmVyc2lvbjogIDAxLjA1LjA1CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNTMsNiArNTMsNyBAQAogICogIDEwLTA1LTA0ICAwMS4wNS4wMiAgTVNHX1RBUkdFVF9DTURfQlVGRkVSX1BPU1RfQkFTRV9MSVNUX1JFUExZIGFkZGVkLgogICogIDAyLTIyLTA1ICAwMS4wNS4wMyAgQ2hhbmdlZCBhIGNvbW1lbnQuCiAgKiAgMDMtMTEtMDUgIDAxLjA1LjA0ICBSZW1vdmVkIFRhcmdldEFzc2lzdEV4dGVuZGVkIFJlcXVlc3QuCisgKiAgMDYtMjQtMDUgIDAxLjA1LjA1ICBBZGRlZCBUYXJnZXRBc3Npc3RFeHRlbmRlZCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMzcxLDYgKzM3Miw3NyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGFyZ2V0IEFzc2lzdCBFeHRlbmRlZCBSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19UQVJHRVRfQVNTSVNUX0VYVF9SRVFVRVNUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQ29kZTsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBc3Npc3RGbGFnczsgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBRdWV1ZVRhZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlcGx5V29yZDsgICAgICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTFVOWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZWxhdGl2ZU9mZnNldDsgICAgICAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgICAgICAvKiAyMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5UmVmZXJlbmNlVGFnOyAgICAgICAgICAgIC8qIDI0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlBcHBsaWNhdGlvblRhZzsgICAgICAgICAgLyogMjhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUFwcGxpY2F0aW9uVGFnTWFzazsgICAgICAvKiAyQWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDJDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgLyogMzBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQmlkaXJlY3Rpb25hbERhdGFMZW5ndGg7ICAgICAgICAvKiAzNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlSZWZlcmVuY2VUYWc7ICAgICAgICAgIC8qIDM4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFNlY29uZGFyeUFwcGxpY2F0aW9uVGFnOyAgICAgICAgLyogM0NoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgICAgICAgICAvKiAzRWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBFRURQRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDQwaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uVGFnVHJhbnNsYXRpb25NYXNrOyAgLyogNDJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRUVEUEJsb2NrU2l6ZTsgICAgICAgICAgICAgICAgICAvKiA0NGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQwOyAgICAgICAgICAgICAgICAgICAgIC8qIDQ4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNHTE9mZnNldDE7ICAgICAgICAgICAgICAgICAgICAgLyogNDloICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0dMT2Zmc2V0MjsgICAgICAgICAgICAgICAgICAgICAvKiA0QWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTR0xPZmZzZXQzOyAgICAgICAgICAgICAgICAgICAgIC8qIDRCaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNjsgICAgICAgICAgICAgICAgICAgICAgLyogNENoICovCisgICAgU0dFX0lPX1VOSU9OICAgICAgICAgICAgU0dMWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1MGggKi8KK30gTVNHX1RBUkdFVF9BU1NJU1RfRVhUX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfVEFSR0VUX0FTU0lTVF9FWFRfUkVRVUVTVCwKKyAgVGFyZ2V0QXNzaXN0RXh0UmVxdWVzdF90LCBNUElfUE9JTlRFUiBwVGFyZ2V0QXNzaXN0RXh0UmVxdWVzdF90OworCisvKiBzZWUgdGhlIGRlZmluZXMgYWZ0ZXIgTVNHX1RBUkdFVF9BU1NJU1RfUkVRVUVTVCBmb3IgVGFyZ2V0QXNzaXN0RmxhZ3MgKi8KKworLyogZGVmaW5lcyBmb3IgdGhlIE1zZ0ZsYWdzIGZpZWxkICovCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX01TR0ZMQUdTX0JJRElSRUNUSU9OQUwgICAgICAgICgweDIwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9NU0dGTEFHU19NVUxUSUNBU1QgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfTVNHRkxBR1NfU0dMX09GRlNFVF9DSEFJTlMgICAgKDB4MDgpCisKKy8qIGRlZmluZXMgZm9yIHRoZSBFRURQRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9NQVNLX09QICAgICAgICAgICgweDAwMDcpCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfTk9PUF9PUCAgICAgICAgICAoMHgwMDAwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX0NIS19PUCAgICAgICAgICAgKDB4MDAwMSkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9TVFJJUF9PUCAgICAgICAgICgweDAwMDIpCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfQ0hLUk1fT1AgICAgICAgICAoMHgwMDAzKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX0lOU0VSVF9PUCAgICAgICAgKDB4MDAwNCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9SRVBMQUNFX09QICAgICAgICgweDAwMDYpCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfQ0hLUkVHRU5fT1AgICAgICAoMHgwMDA3KQorCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfUEFTU19SRUZfVEFHICAgICAoMHgwMDA4KQorCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfVDEwX0NIS19NQVNLICAgICAoMHgwNzAwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX1QxMF9DSEtfR1VBUkQgICAgKDB4MDEwMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9UMTBfQ0hLX0FQUFRBRyAgICgweDAyMDApCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfVDEwX0NIS19SRUZUQUcgICAoMHgwNDAwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX1QxMF9DSEtfU0hJRlQgICAgKDgpCisKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9JTkNfU0VDX0FQUFRBRyAgICgweDEwMDApCisjZGVmaW5lIFRBUkdFVF9BU1NJU1RfRVhUX0VFRFBfSU5DX1BSSV9BUFBUQUcgICAoMHgyMDAwKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0VYVF9FRURQX0lOQ19TRUNfUkVGVEFHICAgKDB4NDAwMCkKKyNkZWZpbmUgVEFSR0VUX0FTU0lTVF9FWFRfRUVEUF9JTkNfUFJJX1JFRlRBRyAgICgweDgwMDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBUYXJnZXQgU3RhdHVzIFNlbmQgUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IGZmYmU2ZjQuLmY1MTdkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC0yMTgsOCArMjE4LDcgQEAKICAqCShhbHNvIHJlZmVycmVkIHRvIGFzIGEgSU8gQ29udHJvbGxlciBvciBJT0MpLgogICoJVGhpcyByb3V0aW5lIG11c3QgY2xlYXIgdGhlIGludGVycnVwdCBmcm9tIHRoZSBhZGFwdGVyIGFuZCBkb2VzCiAgKglzbyBieSByZWFkaW5nIHRoZSByZXBseSBGSUZPLiAgTXVsdGlwbGUgcmVwbGllcyBtYXkgYmUgcHJvY2Vzc2VkCi0gKglwZXIgc2luZ2xlIGNhbGwgdG8gdGhpcyByb3V0aW5lOyB1cCB0byBNUFRfTUFYX1JFUExJRVNfUEVSX0lTUgotICoJd2hpY2ggaXMgY3VycmVudGx5IHNldCB0byAzMiBpbiBtcHRiYXNlLmguCisgKglwZXIgc2luZ2xlIGNhbGwgdG8gdGhpcyByb3V0aW5lLgogICoKICAqCVRoaXMgcm91dGluZSBoYW5kbGVzIHJlZ2lzdGVyLWxldmVsIGFjY2VzcyBvZiB0aGUgYWRhcHRlciBidXQKICAqCWRpc3BhdGNoZXMgKGNhbGxzKSBhIHByb3RvY29sLXNwZWNpZmljIGNhbGxiYWNrIHJvdXRpbmUgdG8gaGFuZGxlCkBAIC0yNzksMTEgKzI3OCwxMSBAQAogCQkJY2JfaWR4ID0gbXItPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5mbGQuY2JfaWR4OwogCQkJbWYgPSBNUFRfSU5ERVhfMl9NRlBUUihpb2MsIHJlcV9pZHgpOwogCi0JCQlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkdvdCBub24tVFVSQk8gcmVwbHk9JXAgcmVxX2lkeD0leFxuIiwKLQkJCQkJaW9jLT5uYW1lLCBtciwgcmVxX2lkeCkpOworCQkJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJHb3Qgbm9uLVRVUkJPIHJlcGx5PSVwIHJlcV9pZHg9JXggY2JfaWR4PSV4IEZ1bmN0aW9uPSV4XG4iLAorCQkJCQlpb2MtPm5hbWUsIG1yLCByZXFfaWR4LCBjYl9pZHgsIG1yLT51Lmhkci5GdW5jdGlvbikpOwogCQkJREJHX0RVTVBfUkVQTFlfRlJBTUUobXIpCiAKLQkJCS8qICBDaGVjay9sb2cgSU9DIGxvZyBpbmZvCisJCQkgLyogIENoZWNrL2xvZyBJT0MgbG9nIGluZm8KIAkJCSAqLwogCQkJaW9jX3N0YXQgPSBsZTE2X3RvX2NwdShtci0+dS5yZXBseS5JT0NTdGF0dXMpOwogCQkJaWYgKGlvY19zdGF0ICYgTVBJX0lPQ1NUQVRVU19GTEFHX0xPR19JTkZPX0FWQUlMQUJMRSkgewpAQCAtMzQ1LDcgKzM0NCw3IEBACiAJCQlpZiAoKG1mKSAmJiAoKG1mID49IE1QVF9JTkRFWF8yX01GUFRSKGlvYywgaW9jLT5yZXFfZGVwdGgpKQogCQkJCXx8IChtZiA8IGlvYy0+cmVxX2ZyYW1lcykpICkgewogCQkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCi0JCQkJCSJtcHRfaW50ZXJydXB0OiBJbnZhbGlkIG1mICglcCkgcmVxX2lkeCAoJWQpIVxuIiwgaW9jLT5uYW1lLCAodm9pZCAqKW1mLCByZXFfaWR4KTsKKwkJCQkJIm1wdF9pbnRlcnJ1cHQ6IEludmFsaWQgbWYgKCVwKSFcbiIsIGlvYy0+bmFtZSwgKHZvaWQgKiltZik7CiAJCQkJY2JfaWR4ID0gMDsKIAkJCQlwYSA9IDA7CiAJCQkJZnJlZW1lID0gMDsKQEAgLTM5OSw3ICszOTgsNyBAQAogICoJQG1mOiBQb2ludGVyIHRvIG9yaWdpbmFsIE1QVCByZXF1ZXN0IGZyYW1lCiAgKglAcmVwbHk6IFBvaW50ZXIgdG8gTVBUIHJlcGx5IGZyYW1lIChOVUxMIGlmIFR1cmJvUmVwbHkpCiAgKgotCSoJUmV0dXJucyAxIGluZGljYXRpbmcgb3JpZ2luYWwgYWxsb2MnZCByZXF1ZXN0IGZyYW1lIHB0cgorICoJUmV0dXJucyAxIGluZGljYXRpbmcgb3JpZ2luYWwgYWxsb2MnZCByZXF1ZXN0IGZyYW1lIHB0cgogICoJc2hvdWxkIGJlIGZyZWVkLCBvciAwIGlmIGl0IHNob3VsZG4ndC4KICAqLwogc3RhdGljIGludApAQCAtNDA4LDI4ICs0MDcsMTcgQEAKIAlpbnQgZnJlZXJlcSA9IDE7CiAJdTggZnVuYzsKIAotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIm1wdF9iYXNlX3JlcGx5KCkgY2FsbGVkXG4iLCBpb2MtPm5hbWUpKTsKKwlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIm1wdF9iYXNlX3JlcGx5KCkgY2FsbGVkXG4iLCBpb2MtPm5hbWUpKTsKIAotCWlmICgobWYgPT0gTlVMTCkgfHwKLQkgICAgKG1mID49IE1QVF9JTkRFWF8yX01GUFRSKGlvYywgaW9jLT5yZXFfZGVwdGgpKSkgewotCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJOVUxMIG9yIEJBRCByZXF1ZXN0IGZyYW1lIHB0ciEgKD0lcClcbiIsCi0JCQkJaW9jLT5uYW1lLCAodm9pZCAqKW1mKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHJlcGx5ID09IE5VTEwpIHsKLQkJZHByaW50aygoTVlJT0Nfc19FUlJfRk1UICJVbmV4cGVjdGVkIE5VTEwgRXZlbnQgKHR1cmJvPykgcmVwbHkhXG4iLAotCQkJCWlvYy0+bmFtZSkpOwotCQlyZXR1cm4gMTsKLQl9Ci0KKyNpZiBkZWZpbmVkKE1QVF9ERUJVR19NU0dfRlJBTUUpCiAJaWYgKCEocmVwbHktPnUuaGRyLk1zZ0ZsYWdzICYgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSkpIHsKIAkJZG1mcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogT3JpZ2luYWwgcmVxdWVzdCBmcmFtZSAoQCVwKSBoZWFkZXJcbiIsIG1mKSk7CiAJCURCR19EVU1QX1JFUVVFU1RfRlJBTUVfSERSKG1mKQogCX0KKyNlbmRpZgogCiAJZnVuYyA9IHJlcGx5LT51Lmhkci5GdW5jdGlvbjsKLQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtcHRfYmFzZV9yZXBseSwgRnVuY3Rpb249JTAyWGhcbiIsCisJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtcHRfYmFzZV9yZXBseSwgRnVuY3Rpb249JTAyWGhcbiIsCiAJCQlpb2MtPm5hbWUsIGZ1bmMpKTsKIAogCWlmIChmdW5jID09IE1QSV9GVU5DVElPTl9FVkVOVF9OT1RJRklDQVRJT04pIHsKQEAgLTQ0OCw4ICs0MzYsMTQgQEAKIAkJICoJSG1tbS4uLiAgSXQgc2VlbXMgdGhhdCBFdmVudE5vdGlmaWNhdGlvblJlcGx5IGlzIGFuIGV4Y2VwdGlvbgogCQkgKgl0byB0aGUgcnVsZSBvZiBvbmUgcmVwbHkgcGVyIHJlcXVlc3QuCiAJCSAqLwotCQlpZiAocEV2UmVwbHktPk1zZ0ZsYWdzICYgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSkKKwkJaWYgKHBFdlJlcGx5LT5Nc2dGbGFncyAmIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkpIHsKIAkJCWZyZWVyZXEgPSAwOworCQkJZGV2dHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiRVZFTlRfTk9USUZJQ0FUSU9OIHJlcGx5ICVwIGRvZXMgbm90IHJldHVybiBSZXF1ZXN0IGZyYW1lXG4iLAorCQkJCWlvYy0+bmFtZSwgcEV2UmVwbHkpKTsKKwkJfSBlbHNlIHsKKwkJCWRldnRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIkVWRU5UX05PVElGSUNBVElPTiByZXBseSAlcCByZXR1cm5zIFJlcXVlc3QgZnJhbWVcbiIsCisJCQkJaW9jLT5uYW1lLCBwRXZSZXBseSkpOworCQl9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogLy8JCUxvZ0V2ZW50KGlvYywgcEV2UmVwbHkpOwpAQCAtNDkxLDEwICs0ODUsMjEgQEAKIAogCQkJCXBDZmctPnN0YXR1cyA9IHN0YXR1czsKIAkJCQlpZiAoc3RhdHVzID09IE1QSV9JT0NTVEFUVVNfU1VDQ0VTUykgewotCQkJCQlwQ2ZnLT5oZHItPlBhZ2VWZXJzaW9uID0gcFJlcGx5LT5IZWFkZXIuUGFnZVZlcnNpb247Ci0JCQkJCXBDZmctPmhkci0+UGFnZUxlbmd0aCA9IHBSZXBseS0+SGVhZGVyLlBhZ2VMZW5ndGg7Ci0JCQkJCXBDZmctPmhkci0+UGFnZU51bWJlciA9IHBSZXBseS0+SGVhZGVyLlBhZ2VOdW1iZXI7Ci0JCQkJCXBDZmctPmhkci0+UGFnZVR5cGUgPSBwUmVwbHktPkhlYWRlci5QYWdlVHlwZTsKKwkJCQkJaWYgKChwUmVwbHktPkhlYWRlci5QYWdlVHlwZSAmCisJCQkJCSAgICBNUElfQ09ORklHX1BBR0VUWVBFX01BU0spID09CisJCQkJCSAgICBNUElfQ09ORklHX1BBR0VUWVBFX0VYVEVOREVEKSB7CisJCQkJCQlwQ2ZnLT5jZmdoZHIuZWhkci0+RXh0UGFnZUxlbmd0aCA9CisJCQkJCQkgICAgbGUxNl90b19jcHUocFJlcGx5LT5FeHRQYWdlTGVuZ3RoKTsKKwkJCQkJCXBDZmctPmNmZ2hkci5laGRyLT5FeHRQYWdlVHlwZSA9CisJCQkJCQkgICAgcFJlcGx5LT5FeHRQYWdlVHlwZTsKKwkJCQkJfQorCQkJCQlwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlVmVyc2lvbiA9IHBSZXBseS0+SGVhZGVyLlBhZ2VWZXJzaW9uOworCisJCQkJCS8qIElmIHRoaXMgaXMgYSByZWd1bGFyIGhlYWRlciwgc2F2ZSBQYWdlTGVuZ3RoLiAqLworCQkJCQkvKiBMTVAgRG8gdGhpcyBiZXR0ZXIgc28gbm90IHVzaW5nIGEgcmVzZXJ2ZWQgZmllbGQhICovCisJCQkJCXBDZmctPmNmZ2hkci5oZHItPlBhZ2VMZW5ndGggPSBwUmVwbHktPkhlYWRlci5QYWdlTGVuZ3RoOworCQkJCQlwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlTnVtYmVyID0gcFJlcGx5LT5IZWFkZXIuUGFnZU51bWJlcjsKKwkJCQkJcENmZy0+Y2ZnaGRyLmhkci0+UGFnZVR5cGUgPSBwUmVwbHktPkhlYWRlci5QYWdlVHlwZTsKIAkJCQl9CiAJCQl9CiAKQEAgLTcwNSw3ICs3MTAsNyBAQAogCQlpZiAoZGRfY2JmdW5jLT5yZW1vdmUpCiAJCQlkZF9jYmZ1bmMtPnJlbW92ZShpb2MtPnBjaWRldik7CiAJfQotCQorCiAJTXB0RGV2aWNlRHJpdmVySGFuZGxlcnNbY2JfaWR4XSA9IE5VTEw7CiB9CiAKQEAgLTgxOCw3ICs4MjMsNyBAQAogCX0KICNlbmRpZgogCi0JbWZfZG1hX2FkZHIgPSAoaW9jLT5yZXFfZnJhbWVzX2xvd19kbWEgKyByZXFfb2Zmc2V0KSB8IGlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdOyAgCisJbWZfZG1hX2FkZHIgPSAoaW9jLT5yZXFfZnJhbWVzX2xvd19kbWEgKyByZXFfb2Zmc2V0KSB8IGlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdOwogCWRzZ3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAibWZfZG1hX2FkZHI9JXggcmVxX2lkeD0lZCBSZXF1ZXN0TkI9JXhcbiIsIGlvYy0+bmFtZSwgbWZfZG1hX2FkZHIsIHJlcV9pZHgsIGlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdKSk7CiAJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPlJlcXVlc3RGaWZvLCBtZl9kbWFfYWRkcik7CiB9CkBAIC05MjAsNyArOTI1LDcgQEAKIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gZG9vcmJlbGxzICovCiAJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7Ci0JCisKIAlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwsCiAJCQkoKE1QSV9GVU5DVElPTl9IQU5EU0hBS0U8PE1QSV9ET09SQkVMTF9GVU5DVElPTl9TSElGVCkgfAogCQkJICgocmVxQnl0ZXMvNCk8PE1QSV9ET09SQkVMTF9BRERfRFdPUkRTX1NISUZUKSkpOwpAQCAtOTM1LDE0ICs5NDAsMTQgQEAKIAkJcmV0dXJuIC01OwogCiAJZGhzcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0IHN0YXJ0LCBXYWl0Q250PSVkXG4iLAotCQkJaW9jLT5uYW1lLCBpaSkpOworCQlpb2MtPm5hbWUsIGlpKSk7CiAKIAlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKIAogCWlmICgociA9IFdhaXRGb3JEb29yYmVsbEFjayhpb2MsIDUsIHNsZWVwRmxhZykpIDwgMCkgewogCQlyZXR1cm4gLTI7CiAJfQotCQkKKwogCS8qIFNlbmQgcmVxdWVzdCB2aWEgZG9vcmJlbGwgaGFuZHNoYWtlICovCiAJcmVxX2FzX2J5dGVzID0gKHU4ICopIHJlcTsKIAlmb3IgKGlpID0gMDsgaWkgPCByZXFCeXRlcy80OyBpaSsrKSB7CkBAIC05ODgsOSArOTkzLDkgQEAKIAkJaWYgKGlvYy0+aWQgPT0gaW9jaWQpIHsKIAkJCSppb2NwcCA9aW9jOwogCQkJcmV0dXJuIGlvY2lkOwotCQl9IAorCQl9CiAJfQotCQorCiAJKmlvY3BwID0gTlVMTDsKIAlyZXR1cm4gLTE7CiB9CkBAIC0xMDMyLDkgKzEwMzcsOSBAQAogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQogCQlyZXR1cm4gcjsKLQkKKwogCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogbXB0X2FkYXB0ZXJfaW5zdGFsbFxuIikpOwotCQorCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgewogCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KIAkJCSI6IDY0IEJJVCBQQ0kgQlVTIERNQSBBRERSRVNTSU5HIFNVUFBPUlRFRFxuIikpOwpAQCAtMTA1OSw3ICsxMDY0LDcgQEAKIAlpb2MtPmFsbG9jX3RvdGFsID0gc2l6ZW9mKE1QVF9BREFQVEVSKTsKIAlpb2MtPnJlcV9zeiA9IE1QVF9ERUZBVUxUX0ZSQU1FX1NJWkU7CQkvKiBhdm9pZCBkaXYgYnkgemVybyEgKi8KIAlpb2MtPnJlcGx5X3N6ID0gTVBUX1JFUExZX0ZSQU1FX1NJWkU7Ci0JCisKIAlpb2MtPnBjaWRldiA9IHBkZXY7CiAJaW9jLT5kaWFnUGVuZGluZyA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJmlvYy0+ZGlhZ0xvY2spOwpAQCAtMTA4OCw3ICsxMDkzLDcgQEAKIAkvKiBGaW5kIGxvb2t1cCBzbG90LiAqLwogCUlOSVRfTElTVF9IRUFEKCZpb2MtPmxpc3QpOwogCWlvYy0+aWQgPSBtcHRfaWRzKys7Ci0JCisKIAltZW1fcGh5cyA9IG1zaXplID0gMDsKIAlwb3J0ID0gcHNpemUgPSAwOwogCWZvciAoaWk9MDsgaWkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGlpKyspIHsKQEAgLTExNDMsNyArMTE0OCw3IEBACiAJCWlvYy0+cHJvZF9uYW1lID0gIkxTSUZDOTA5IjsKIAkJaW9jLT5idXNfdHlwZSA9IEZDOwogCX0KLQlpZiAocGRldi0+ZGV2aWNlID09IE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MjkpIHsKKwllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkyOSkgewogCQlpb2MtPnByb2RfbmFtZSA9ICJMU0lGQzkyOSI7CiAJCWlvYy0+YnVzX3R5cGUgPSBGQzsKIAl9CkBAIC0xMzIyLDcgKzEzMjcsNyBAQAogCXJlbW92ZV9wcm9jX2VudHJ5KHBuYW1lLCBOVUxMKTsKIAlzcHJpbnRmKHBuYW1lLCBNUFRfUFJPQ0ZTX01QVEJBU0VESVIgIi8lcyIsIGlvYy0+bmFtZSk7CiAJcmVtb3ZlX3Byb2NfZW50cnkocG5hbWUsIE5VTEwpOwotCQorCiAJLyogY2FsbCBwZXIgZGV2aWNlIGRyaXZlciByZW1vdmUgZW50cnkgcG9pbnQgKi8KIAlmb3IoaWk9MDsgaWk8TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyBpaSsrKSB7CiAJCWlmKE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXSAmJgpAQCAtMTMzMCw3ICsxMzM1LDcgQEAKIAkJCU1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXS0+cmVtb3ZlKHBkZXYpOwogCQl9CiAJfQotCQorCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzISAqLwogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCAweEZGRkZGRkZGKTsKIApAQCAtMTQwMyw3ICsxNDA4LDcgQEAKIAl1MzIgZGV2aWNlX3N0YXRlID0gcGRldi0+Y3VycmVudF9zdGF0ZTsKIAlpbnQgcmVjb3Zlcnlfc3RhdGU7CiAJaW50IGlpOwotCQorCiAJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQKIAkicGNpLXJlc3VtZTogcGRldj0weCVwLCBzbG90PSVzLCBQcmV2aW91cyBvcGVyYXRpbmcgc3RhdGUgW0QlZF1cbiIsCiAJCWlvYy0+bmFtZSwgcGRldiwgcGNpX25hbWUocGRldiksIGRldmljZV9zdGF0ZSk7CkBAIC0xNTM0LDcgKzE1MzksNyBAQAogCQlpZiAoKHJjID0gR2V0SW9jRmFjdHMoaW9jLCBzbGVlcEZsYWcsIHJlYXNvbikpID09IDApCiAJCQlicmVhazsKIAl9Ci0JCisKIAogCWlmIChpaSA9PSA1KSB7CiAJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXRyeSBJb2NGYWN0cyBmYWlsZWQgcmM9JXhcbiIsIGlvYy0+bmFtZSwgcmMpKTsKQEAgLTE1NDIsNyArMTU0Nyw3IEBACiAJfSBlbHNlIGlmIChyZWFzb24gPT0gTVBUX0hPU1RFVkVOVF9JT0NfQlJJTkdVUCkgewogCQlNcHREaXNwbGF5SW9jQ2FwYWJpbGl0aWVzKGlvYyk7CiAJfQotCQorCiAJaWYgKGFsdF9pb2NfcmVhZHkpIHsKIAkJaWYgKChyYyA9IEdldElvY0ZhY3RzKGlvYy0+YWx0X2lvYywgc2xlZXBGbGFnLCByZWFzb24pKSAhPSAwKSB7CiAJCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSW5pdGlhbCBBbHQgSW9jRmFjdHMgZmFpbGVkIHJjPSV4XG4iLCBpb2MtPm5hbWUsIHJjKSk7CkBAIC0xNjEzLDcgKzE2MTgsNyBAQAogCiAJaWYgKHJlc2V0X2FsdF9pb2NfYWN0aXZlICYmIGlvYy0+YWx0X2lvYykgewogCQkvKiAocmUpRW5hYmxlIGFsdC1JT0MhIChyZXBseSBpbnRlcnJ1cHQpICovCi0JCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBhbHQtJXMgcmVwbHkgaXJxIHJlLWVuYWJsZWRcbiIsCisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogYWx0LSVzIHJlcGx5IGlycSByZS1lbmFibGVkXG4iLAogCQkJCWlvYy0+YWx0X2lvYy0+bmFtZSkpOwogCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+SW50TWFzaywgfihNUElfSElNX1JJTSkpOwogCQlpb2MtPmFsdF9pb2MtPmFjdGl2ZSA9IDE7CkBAIC0xNjcwLDcgKzE2NzUsNyBAQAogCiAJCQkvKiBGaW5kIElNIHZvbHVtZXMKIAkJCSAqLwotCQkJaWYgKGlvYy0+ZmFjdHMuTXNnVmVyc2lvbiA+PSAweDAxMDIpCisJCQlpZiAoaW9jLT5mYWN0cy5Nc2dWZXJzaW9uID49IE1QSV9WRVJTSU9OXzAxXzAyKQogCQkJCW1wdF9maW5kSW1Wb2x1bWVzKGlvYyk7CiAKIAkJCS8qIENoZWNrLCBhbmQgcG9zc2libHkgcmVzZXQsIHRoZSBjb2FsZXNjaW5nIHZhbHVlCkBAIC0xNzAwLDcgKzE3MDUsNyBAQAogCQkJfQogCiAJCQlpZiAoYWx0X2lvY19yZWFkeSAmJiBNcHRSZXNldEhhbmRsZXJzW2lpXSkgewotCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgYWx0LSVzIHBvc3RfcmVzZXQgaGFuZGxlciAjJWRcbiIsCisJCQkJZHJzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIGFsdC0lcyBwb3N0X3Jlc2V0IGhhbmRsZXIgIyVkXG4iLAogCQkJCQkJaW9jLT5uYW1lLCBpb2MtPmFsdF9pb2MtPm5hbWUsIGlpKSk7CiAJCQkJcmMgKz0gKCooTXB0UmVzZXRIYW5kbGVyc1tpaV0pKShpb2MtPmFsdF9pb2MsIE1QVF9JT0NfUE9TVF9SRVNFVCk7CiAJCQkJaGFuZGxlcnMrKzsKQEAgLTE3MzMsOCArMTczOCw4IEBACiAKIAlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJQQ0kgZGV2aWNlICVzIGRldmZuPSV4LyV4LCIKIAkgICAgIiBzZWFyY2hpbmcgZm9yIGRldmZuIG1hdGNoIG9uICV4IG9yICV4XG4iLAotCQlpb2MtPm5hbWUsIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5kZXZmbiwKLQkJZnVuYy0xLCBmdW5jKzEpKTsKKwkJaW9jLT5uYW1lLCBwY2lfbmFtZShwZGV2KSwgcGRldi0+YnVzLT5udW1iZXIsCisJCXBkZXYtPmRldmZuLCBmdW5jLTEsIGZ1bmMrMSkpOwogCiAJcGVlciA9IHBjaV9nZXRfc2xvdChwZGV2LT5idXMsIFBDSV9ERVZGTihzbG90LGZ1bmMtMSkpOwogCWlmICghcGVlcikgewpAQCAtMTg2MSwzNiArMTg2NiwzOSBAQAogc3RhdGljIHZvaWQKIG1wdF9hZGFwdGVyX2Rpc3Bvc2UoTVBUX0FEQVBURVIgKmlvYykKIHsKLQlpZiAoaW9jICE9IE5VTEwpIHsKLQkJaW50IHN6X2ZpcnN0LCBzel9sYXN0OworCWludCBzel9maXJzdCwgc3pfbGFzdDsKIAotCQlzel9maXJzdCA9IGlvYy0+YWxsb2NfdG90YWw7CisJaWYgKGlvYyA9PSBOVUxMKQorCQlyZXR1cm47CiAKLQkJbXB0X2FkYXB0ZXJfZGlzYWJsZShpb2MpOworCXN6X2ZpcnN0ID0gaW9jLT5hbGxvY190b3RhbDsKIAotCQlpZiAoaW9jLT5wY2lfaXJxICE9IC0xKSB7Ci0JCQlmcmVlX2lycShpb2MtPnBjaV9pcnEsIGlvYyk7Ci0JCQlpb2MtPnBjaV9pcnEgPSAtMTsKLQkJfQorCW1wdF9hZGFwdGVyX2Rpc2FibGUoaW9jKTsKIAotCQlpZiAoaW9jLT5tZW1tYXAgIT0gTlVMTCkKLQkJCWlvdW5tYXAoaW9jLT5tZW1tYXApOworCWlmIChpb2MtPnBjaV9pcnEgIT0gLTEpIHsKKwkJZnJlZV9pcnEoaW9jLT5wY2lfaXJxLCBpb2MpOworCQlpb2MtPnBjaV9pcnEgPSAtMTsKKwl9CisKKwlpZiAoaW9jLT5tZW1tYXAgIT0gTlVMTCkgeworCQlpb3VubWFwKGlvYy0+bWVtbWFwKTsKKwkJaW9jLT5tZW1tYXAgPSBOVUxMOworCX0KIAogI2lmIGRlZmluZWQoQ09ORklHX01UUlIpICYmIDAKLQkJaWYgKGlvYy0+bXRycl9yZWcgPiAwKSB7Ci0JCQltdHJyX2RlbChpb2MtPm10cnJfcmVnLCAwLCAwKTsKLQkJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogTVRSUiByZWdpb24gZGUtcmVnaXN0ZXJlZFxuIiwgaW9jLT5uYW1lKSk7Ci0JCX0KKwlpZiAoaW9jLT5tdHJyX3JlZyA+IDApIHsKKwkJbXRycl9kZWwoaW9jLT5tdHJyX3JlZywgMCwgMCk7CisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogTVRSUiByZWdpb24gZGUtcmVnaXN0ZXJlZFxuIiwgaW9jLT5uYW1lKSk7CisJfQogI2VuZGlmCiAKLQkJLyogIFphcCB0aGUgYWRhcHRlciBsb29rdXAgcHRyISAgKi8KLQkJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CisJLyogIFphcCB0aGUgYWRhcHRlciBsb29rdXAgcHRyISAgKi8KKwlsaXN0X2RlbCgmaW9jLT5saXN0KTsKIAotCQlzel9sYXN0ID0gaW9jLT5hbGxvY190b3RhbDsKLQkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBmcmVlJ2QgJWQgb2YgJWQgYnl0ZXNcbiIsCi0JCQkJaW9jLT5uYW1lLCBzel9maXJzdC1zel9sYXN0KyhpbnQpc2l6ZW9mKCppb2MpLCBzel9maXJzdCkpOwotCQlrZnJlZShpb2MpOwotCX0KKwlzel9sYXN0ID0gaW9jLT5hbGxvY190b3RhbDsKKwlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IGZyZWUnZCAlZCBvZiAlZCBieXRlc1xuIiwKKwkJCWlvYy0+bmFtZSwgc3pfZmlyc3Qtc3pfbGFzdCsoaW50KXNpemVvZigqaW9jKSwgc3pfZmlyc3QpKTsKKwlrZnJlZShpb2MpOwogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCkBAIC0xOTc3LDcgKzE5ODUsNyBAQAogCX0KIAogCS8qIElzIGl0IGFscmVhZHkgUkVBRFk/ICovCi0JaWYgKCFzdGF0ZWZhdWx0ICYmIChpb2Nfc3RhdGUgJiBNUElfSU9DX1NUQVRFX01BU0spID09IE1QSV9JT0NfU1RBVEVfUkVBRFkpIAorCWlmICghc3RhdGVmYXVsdCAmJiAoaW9jX3N0YXRlICYgTVBJX0lPQ19TVEFURV9NQVNLKSA9PSBNUElfSU9DX1NUQVRFX1JFQURZKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC0xOTk1LDcgKzIwMDMsNyBAQAogCSAqCUhtbW0uLi4gIERpZCBpdCBnZXQgbGVmdCBvcGVyYXRpb25hbD8KIAkgKi8KIAlpZiAoKGlvY19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykgPT0gTVBJX0lPQ19TVEFURV9PUEVSQVRJT05BTCkgewotCQlkaW5pdHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiSU9DIG9wZXJhdGlvbmFsIHVuZXhwZWN0ZWRcbiIsCisJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJT0Mgb3BlcmF0aW9uYWwgdW5leHBlY3RlZFxuIiwKIAkJCQlpb2MtPm5hbWUpKTsKIAogCQkvKiBDaGVjayBXaG9Jbml0LgpAQCAtMjAwNCw4ICsyMDEyLDggQEAKIAkJICogRWxzZSwgZmFsbCB0aHJvdWdoIHRvIEtpY2tTdGFydCBjYXNlCiAJCSAqLwogCQl3aG9pbml0ID0gKGlvY19zdGF0ZSAmIE1QSV9ET09SQkVMTF9XSE9fSU5JVF9NQVNLKSA+PiBNUElfRE9PUkJFTExfV0hPX0lOSVRfU0hJRlQ7Ci0JCWRwcmludGsoKEtFUk5fV0FSTklORyBNWU5BTQotCQkJIjogd2hvaW5pdCAweCV4XG4gc3RhdGVmYXVsdCAlZCBmb3JjZSAlZFxuIiwKKwkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCQkJIjogd2hvaW5pdCAweCV4IHN0YXRlZmF1bHQgJWQgZm9yY2UgJWRcbiIsCiAJCQl3aG9pbml0LCBzdGF0ZWZhdWx0LCBmb3JjZSkpOwogCQlpZiAod2hvaW5pdCA9PSBNUElfV0hPSU5JVF9QQ0lfUEVFUikKIAkJCXJldHVybiAtNDsKQEAgLTIxNDAsOCArMjE0OCw4IEBACiAJZ2V0X2ZhY3RzLkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0lPQ19GQUNUUzsKIAkvKiBBc3NlcnQ6IEFsbCBvdGhlciBnZXRfZmFjdHMgZmllbGRzIGFyZSB6ZXJvISAqLwogCi0JZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgCi0JICAgICJTZW5kaW5nIGdldCBJb2NGYWN0cyByZXF1ZXN0IHJlcV9zej0lZCByZXBseV9zej0lZFxuIiwgCisJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkgICAgIlNlbmRpbmcgZ2V0IElvY0ZhY3RzIHJlcXVlc3QgcmVxX3N6PSVkIHJlcGx5X3N6PSVkXG4iLAogCSAgICBpb2MtPm5hbWUsIHJlcV9zeiwgcmVwbHlfc3opKTsKIAogCS8qIE5vIG5vbi16ZXJvIGZpZWxkcyBpbiB0aGUgZ2V0X2ZhY3RzIHJlcXVlc3QgYXJlIGdyZWF0ZXIgdGhhbgpAQCAtMjE3NCw3ICsyMTgyLDcgQEAKIAkJZmFjdHMtPklPQ0V4Y2VwdGlvbnMgPSBsZTE2X3RvX2NwdShmYWN0cy0+SU9DRXhjZXB0aW9ucyk7CiAJCWZhY3RzLT5JT0NTdGF0dXMgPSBsZTE2X3RvX2NwdShmYWN0cy0+SU9DU3RhdHVzKTsKIAkJZmFjdHMtPklPQ0xvZ0luZm8gPSBsZTMyX3RvX2NwdShmYWN0cy0+SU9DTG9nSW5mbyk7Ci0JCXN0YXR1cyA9IGZhY3RzLT5JT0NTdGF0dXMgJiBNUElfSU9DU1RBVFVTX01BU0s7CisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGZhY3RzLT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOwogCQkvKiBDSEVDS01FISBJT0NTdGF0dXMsIElPQ0xvZ0luZm8gKi8KIAogCQlmYWN0cy0+UmVwbHlRdWV1ZURlcHRoID0gbGUxNl90b19jcHUoZmFjdHMtPlJlcGx5UXVldWVEZXB0aCk7CkBAIC0yMjIxLDcgKzIyMjksNyBAQAogCQlpZiAoIHN6ICYgMHgwMiApCiAJCQlzeiArPSAyOwogCQlmYWN0cy0+RldJbWFnZVNpemUgPSBzejsKLQkJCisKIAkJaWYgKCFmYWN0cy0+UmVxdWVzdEZyYW1lU2l6ZSkgewogCQkJLyogIFNvbWV0aGluZyBpcyB3cm9uZyEgICovCiAJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJJT0MgcmVwb3J0ZWQgaW52YWxpZCAwIHJlcXVlc3Qgc2l6ZSFcbiIsCkBAIC0yMjQwLDcgKzIyNDgsNyBAQAogCQlpb2MtPk5CU2hpZnRGYWN0b3IgID0gc2hpZnRGYWN0b3I7CiAJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJOQl9mb3JfNjRfYnl0ZV9mcmFtZT0leCBOQlNoaWZ0RmFjdG9yPSV4IEJsb2NrU2l6ZT0leFxuIiwKIAkJCQkJaW9jLT5uYW1lLCB2diwgc2hpZnRGYWN0b3IsIHIpKTsKLSAgICAKKwogCQlpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApIHsKIAkJCS8qCiAJCQkgKiBTZXQgdmFsdWVzIGZvciB0aGlzIElPQydzIHJlcXVlc3QgJiByZXBseSBmcmFtZSBzaXplcywKQEAgLTIyNjEsNyArMjI2OSw3IEBACiAJCQkJcmV0dXJuIHI7CiAJCX0KIAl9IGVsc2UgewotCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UIAorCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCSAgICAgIkludmFsaWQgSU9DIGZhY3RzIHJlcGx5LCBtc2dMZW5ndGg9JWQgb2Zmc2V0b2Y9JXpkIVxuIiwKIAkJICAgICBpb2MtPm5hbWUsIGZhY3RzLT5Nc2dMZW5ndGgsIChvZmZzZXRvZihJT0NGYWN0c1JlcGx5X3QsCiAJCSAgICAgUmVxdWVzdEZyYW1lU2l6ZSkvc2l6ZW9mKHUzMikpKTsKQEAgLTI0MTMsOSArMjQyMSwxMSBAQAogCiAJZGhzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTZW5kaW5nIFBvcnRFbmFibGUgKHJlcSBAICVwKVxuIiwKIAkJCWlvYy0+bmFtZSwgJmlvY19pbml0KSk7Ci0JCi0JaWYgKChyID0gU2VuZFBvcnRFbmFibGUoaW9jLCAwLCBzbGVlcEZsYWcpKSAhPSAwKQorCisJaWYgKChyID0gU2VuZFBvcnRFbmFibGUoaW9jLCAwLCBzbGVlcEZsYWcpKSAhPSAwKSB7CisJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIlNlbmRpbmcgUG9ydEVuYWJsZSBmYWlsZWQoJWQpIVxuIixpb2MtPm5hbWUsIHIpOwogCQlyZXR1cm4gcjsKKwl9CiAKIAkvKiBZSUtFUyEgIFNVUEVSIElNUE9SVEFOVCEhIQogCSAqICBQb2xsIElvY1N0YXRlIHVudGlsIF9PUEVSQVRJT05BTCB3aGlsZSBJT0MgaXMgZG9pbmcKQEAgLTI0NDAsNyArMjQ1MCw3IEBACiAJCXN0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMSk7CiAJCWNvdW50Kys7CiAJfQotCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSU5GTyAtIFdhaXQgSU9DX09QRVJBVElPTkFMIHN0YXRlIChjbnQ9JWQpXG4iLAorCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJTkZPIC0gV2FpdCBJT0NfT1BFUkFUSU9OQUwgc3RhdGUgKGNudD0lZClcbiIsCiAJCQlpb2MtPm5hbWUsIGNvdW50KSk7CiAKIAlyZXR1cm4gcjsKQEAgLTI1MjksNyArMjUzOSw3IEBACiAJaW50IHN6OwogCiAJc3ogPSBpb2MtPmZhY3RzLkZXSW1hZ2VTaXplOwotCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gImZyZWVfZndfbWVtb3J5OiBGVyBJbWFnZSAgQCAlcFslcF0sIHN6PSVkWyV4XSBieXRlc1xuIiwKKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJmcmVlX2Z3X21lbW9yeTogRlcgSW1hZ2UgIEAgJXBbJXBdLCBzej0lZFsleF0gYnl0ZXNcbiIsCiAJCSBpb2MtPmNhY2hlZF9mdywgKHZvaWQgKikodWxvbmcpaW9jLT5jYWNoZWRfZndfZG1hLCBzeiwgc3opKTsKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBzeiwKIAkJCWlvYy0+Y2FjaGVkX2Z3LCBpb2MtPmNhY2hlZF9md19kbWEpOwpAQCAtMjU3Myw5ICsyNTgzLDkgQEAKIAogCW1wdF9hbGxvY19md19tZW1vcnkoaW9jLCBzeik7CiAKLQlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IEZXIEltYWdlICBAICVwWyVwXSwgc3o9JWRbJXhdIGJ5dGVzXG4iLAorCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogRlcgSW1hZ2UgIEAgJXBbJXBdLCBzej0lZFsleF0gYnl0ZXNcbiIsCiAJCSBpb2MtPmNhY2hlZF9mdywgKHZvaWQgKikodWxvbmcpaW9jLT5jYWNoZWRfZndfZG1hLCBzeiwgc3opKTsKLQkKKwogCWlmIChpb2MtPmNhY2hlZF9mdyA9PSBOVUxMKSB7CiAJCS8qIE1ham9yIEZhaWx1cmUuCiAJCSAqLwpAQCAtMjYwNSwxNCArMjYxNSwxNCBAQAogCW1wdF9hZGRfc2dlKCZyZXF1ZXN0W3NnZW9mZnNldF0sIGZsYWdzTGVuZ3RoLCBpb2MtPmNhY2hlZF9md19kbWEpOwogCiAJc2dlb2Zmc2V0ICs9IHNpemVvZih1MzIpICsgc2l6ZW9mKGRtYV9hZGRyX3QpOwotCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIlNlbmRpbmcgRlcgVXBsb2FkIChyZXEgQCAlcCkgc2dlb2Zmc2V0PSVkIFxuIiwKKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IFNlbmRpbmcgRlcgVXBsb2FkIChyZXEgQCAlcCkgc2dlb2Zmc2V0PSVkIFxuIiwKIAkJCXByZXF1ZXN0LCBzZ2VvZmZzZXQpKTsKIAlEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKHByZXF1ZXN0KQogCiAJaWkgPSBtcHRfaGFuZHNoYWtlX3JlcV9yZXBseV93YWl0KGlvYywgc2dlb2Zmc2V0LCAodTMyKilwcmVxdWVzdCwKIAkJCQlyZXBseV9zeiwgKHUxNiopcHJlcGx5LCA2NSAvKnNlY29uZHMqLywgc2xlZXBGbGFnKTsKIAotCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIkZXIFVwbG9hZCBjb21wbGV0ZWQgcmM9JXggXG4iLCBpaSkpOworCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogRlcgVXBsb2FkIGNvbXBsZXRlZCByYz0leCBcbiIsIGlpKSk7CiAKIAljbWRTdGF0dXMgPSAtRUZBVUxUOwogCWlmIChpaSA9PSAwKSB7CkBAIC0yNjI3LDEwICsyNjM3LDEwIEBACiAJCQkJY21kU3RhdHVzID0gMDsKIAkJfQogCX0KLQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiOiBkb191cGxvYWQgc3RhdHVzICVkIFxuIiwKKwlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiOiBkb191cGxvYWQgY21kU3RhdHVzPSVkIFxuIiwKIAkJCWlvYy0+bmFtZSwgY21kU3RhdHVzKSk7CiAKLQkKKwogCWlmIChjbWRTdGF0dXMpIHsKIAogCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIjogZncgdXBsb2FkIGZhaWxlZCwgZnJlZWluZyBpbWFnZSBcbiIsCkBAIC0yNzYxLDggKzI3NzEsOCBAQAogCQlmd1NpemUgPSAocEV4dEltYWdlLT5JbWFnZVNpemUgKyAzKSA+PiAyOwogCQlwdHJGdyA9ICh1MzIgKilwRXh0SW1hZ2U7CiAKLQkJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJXcml0ZSBFeHQgSW1hZ2U6IDB4JXggYnl0ZXMgQCAlcCBsb2FkX2FkZHI9JXhcbiIsCi0JCQkJCQlpb2MtPm5hbWUsIGZ3U2l6ZSo0LCBwdHJGdywgbG9hZF9hZGRyKSk7CisJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV3JpdGUgRXh0IEltYWdlOiAweCV4ICglZCkgYnl0ZXMgQCAlcCBsb2FkX2FkZHI9JXhcbiIsCisJCQkJCQlpb2MtPm5hbWUsIGZ3U2l6ZSo0LCBmd1NpemUqNCwgcHRyRncsIGxvYWRfYWRkcikpOwogCQlDSElQUkVHX1BJT19XUklURTMyKCZpb2MtPnBpb19jaGlwLT5EaWFnUndBZGRyZXNzLCBsb2FkX2FkZHIpOwogCiAJCXdoaWxlIChmd1NpemUtLSkgewpAQCAtMjg0NSw5ICsyODU1LDkgQEAKICAqCQkJICAwIGVsc2UKICAqCiAgKglSZXR1cm5zOgotICoJCSAxIC0gaGFyZCByZXNldCwgUkVBRFkJCi0gKgkJIDAgLSBubyByZXNldCBkdWUgdG8gSGlzdG9yeSBiaXQsIFJFQURZCQotICoJCS0xIC0gbm8gcmVzZXQgZHVlIHRvIEhpc3RvcnkgYml0IGJ1dCBub3QgUkVBRFkJCisgKgkJIDEgLSBoYXJkIHJlc2V0LCBSRUFEWQorICoJCSAwIC0gbm8gcmVzZXQgZHVlIHRvIEhpc3RvcnkgYml0LCBSRUFEWQorICoJCS0xIC0gbm8gcmVzZXQgZHVlIHRvIEhpc3RvcnkgYml0IGJ1dCBub3QgUkVBRFkKICAqCQkgICAgIE9SIHJlc2V0IGJ1dCBmYWlsZWQgdG8gY29tZSBSRUFEWQogICoJCS0yIC0gbm8gcmVzZXQsIGNvdWxkIG5vdCBlbnRlciBESUFHIG1vZGUKICAqCQktMyAtIHJlc2V0IGJ1dCBiYWQgRlcgYml0CkBAIC0yOTkwLDcgKzMwMDAsNyBAQAogCQkgKgogCQkgKi8KIAkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMsIGRpYWcwdmFsIHwgTVBJX0RJQUdfRElTQUJMRV9BUk0pOwotCQltZGVsYXkgKDEpOworCQltZGVsYXkoMSk7CiAKIAkJLyoKIAkJICogTm93IGhpdCB0aGUgcmVzZXQgYml0IGluIHRoZSBEaWFnbm9zdGljIHJlZ2lzdGVyCkBAIC0zMTcwLDcgKzMxODAsNyBAQAogCXUzMiBzdGF0ZTsKIAlpbnQgY250ZG4sIGNvdW50OwogCi0JZHJzcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFNlbmRpbmcgSU9DIHJlc2V0KDB4JTAyeCkhXG4iLAorCWRyc3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBTZW5kaW5nIElPQyByZXNldCgweCUwMngpIVxuIiwKIAkJCWlvYy0+bmFtZSwgcmVzZXRfdHlwZSkpOwogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCwgcmVzZXRfdHlwZTw8TVBJX0RPT1JCRUxMX0ZVTkNUSU9OX1NISUZUKTsKIAlpZiAoKHIgPSBXYWl0Rm9yRG9vcmJlbGxBY2soaW9jLCA1LCBzbGVlcEZsYWcpKSA8IDApCkBAIC0zMzc0LDYgKzMzODQsOSBAQAogCQlpb2MtPnJlcGx5X2ZyYW1lcyA9IChNUFRfRlJBTUVfSERSICopIG1lbTsKIAkJaW9jLT5yZXBseV9mcmFtZXNfbG93X2RtYSA9ICh1MzIpIChhbGxvY19kbWEgJiAweEZGRkZGRkZGKTsKIAorCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIFJlcGx5QnVmZmVycyBAICVwWyVwXVxuIiwKKwkgCQlpb2MtPm5hbWUsIGlvYy0+cmVwbHlfZnJhbWVzLCAodm9pZCAqKSh1bG9uZylhbGxvY19kbWEpKTsKKwogCQlhbGxvY19kbWEgKz0gcmVwbHlfc3o7CiAJCW1lbSArPSByZXBseV9zejsKIApAQCAtMzM4Miw3ICszMzk1LDcgQEAKIAkJaW9jLT5yZXFfZnJhbWVzID0gKE1QVF9GUkFNRV9IRFIgKikgbWVtOwogCQlpb2MtPnJlcV9mcmFtZXNfZG1hID0gYWxsb2NfZG1hOwogCi0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVxdWVzdEJ1ZmZlcnMgQCAlcFslcF1cbiIsCisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgUmVxdWVzdEJ1ZmZlcnMgQCAlcFslcF1cbiIsCiAJCQkgCWlvYy0+bmFtZSwgbWVtLCAodm9pZCAqKSh1bG9uZylhbGxvY19kbWEpKTsKIAogCQlpb2MtPnJlcV9mcmFtZXNfbG93X2RtYSA9ICh1MzIpIChhbGxvY19kbWEgJiAweEZGRkZGRkZGKTsKQEAgLTM0MDgsNyArMzQyMSw3IEBACiAJCWlvYy0+Q2hhaW5CdWZmZXIgPSBtZW07CiAJCWlvYy0+Q2hhaW5CdWZmZXJETUEgPSBhbGxvY19kbWE7CiAKLQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiIDolcy5DaGFpbkJ1ZmZlcnMgQCAlcCglcClcbiIsCisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIiA6JXMgQ2hhaW5CdWZmZXJzIEAgJXAoJXApXG4iLAogCQkJaW9jLT5uYW1lLCBpb2MtPkNoYWluQnVmZmVyLCAodm9pZCAqKSh1bG9uZylpb2MtPkNoYWluQnVmZmVyRE1BKSk7CiAKIAkJLyogSW5pdGlhbGl6ZSB0aGUgZnJlZSBjaGFpbiBRLgpAQCAtMzUxMyw3ICszNTI2LDcgQEAKICAqLwogc3RhdGljIGludAogbXB0X2hhbmRzaGFrZV9yZXFfcmVwbHlfd2FpdChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcmVxQnl0ZXMsIHUzMiAqcmVxLAotCQkJCWludCByZXBseUJ5dGVzLCB1MTYgKnUxNnJlcGx5LCBpbnQgbWF4d2FpdCwgaW50IHNsZWVwRmxhZykKKwkJaW50IHJlcGx5Qnl0ZXMsIHUxNiAqdTE2cmVwbHksIGludCBtYXh3YWl0LCBpbnQgc2xlZXBGbGFnKQogewogCU1QSURlZmF1bHRSZXBseV90ICptcHRSZXBseTsKIAlpbnQgZmFpbGNudCA9IDA7CkBAIC0zNTg4LDcgKzM2MDEsNyBAQAogCQkgKi8KIAkJaWYgKCFmYWlsY250ICYmICh0ID0gV2FpdEZvckRvb3JiZWxsUmVwbHkoaW9jLCBtYXh3YWl0LCBzbGVlcEZsYWcpKSA8IDApCiAJCQlmYWlsY250Kys7Ci0JCQorCiAJCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGFuZFNoYWtlIHJlcGx5IGNvdW50PSVkJXNcbiIsCiAJCQkJaW9jLT5uYW1lLCB0LCBmYWlsY250ID8gIiAtIE1JU1NJTkcgRE9PUkJFTEwgUkVQTFkhIiA6ICIiKSk7CiAKQEAgLTM3NDcsNyArMzc2MCw3IEBACiAJfQogCiAJZGhzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJXYWl0Q250PSVkIEZpcnN0IGhhbmRzaGFrZSByZXBseSB3b3JkPSUwOHglc1xuIiwKLQkJCWlvYy0+bmFtZSwgdCwgbGUzMl90b19jcHUoKih1MzIgKiloc19yZXBseSksIAorCQkJaW9jLT5uYW1lLCB0LCBsZTMyX3RvX2NwdSgqKHUzMiAqKWhzX3JlcGx5KSwKIAkJCWZhaWxjbnQgPyAiIC0gTUlTU0lORyBET09SQkVMTCBIQU5EU0hBS0UhIiA6ICIiKSk7CiAKIAkvKgpAQCAtMzgxOSw3ICszODMyLDcgQEAKIAloZHIuUGFnZUxlbmd0aCA9IDA7CiAJaGRyLlBhZ2VOdW1iZXIgPSAwOwogCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfTEFOOwotCWNmZy5oZHIgPSAmaGRyOworCWNmZy5jZmdoZHIuaGRyID0gJmhkcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CiAJY2ZnLmRpciA9IDA7CkBAIC0zODYzLDcgKzM4NzYsNyBAQAogCWhkci5QYWdlTGVuZ3RoID0gMDsKIAloZHIuUGFnZU51bWJlciA9IDE7CiAJaGRyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9MQU47Ci0JY2ZnLmhkciA9ICZoZHI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKIAljZmcuZGlyID0gMDsKQEAgLTM5MzAsNyArMzk0Myw3IEBACiAJaGRyLlBhZ2VMZW5ndGggPSAwOwogCWhkci5QYWdlTnVtYmVyID0gMDsKIAloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0ZDX1BPUlQ7Ci0JY2ZnLmhkciA9ICZoZHI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKIAljZmcuZGlyID0gMDsKQEAgLTQwMTIsNyArNDAyNSw3IEBACiAJaGRyLlBhZ2VMZW5ndGggPSAwOwogCWhkci5QYWdlTnVtYmVyID0gMjsKIAloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0lPX1VOSVQ7Ci0JY2ZnLmhkciA9ICZoZHI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKIAljZmcuZGlyID0gMDsKQEAgLTQxMDIsNyArNDExNSw3IEBACiAJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOwogCWhlYWRlci5QYWdlTnVtYmVyID0gMDsKIAloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfUE9SVDsKLQljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gcG9ydG51bTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC00MTIyLDYgKzQxMzUsOCBAQAogCQkJCWlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvciA9IE1QVF9BU1lOQzsKIAkJCQlpb2MtPnNwaV9kYXRhLmJ1c1R5cGUgPSBNUFRfSE9TVF9CVVNfVU5LTk9XTjsKIAkJCQlyYyA9IDE7CisJCQkJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJVbmFibGUgdG8gcmVhZCBQb3J0UGFnZTAgbWluU3luY0ZhY3Rvcj0leFxuIiwKKwkJCQkJaW9jLT5uYW1lLCBpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IpKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogU2F2ZSB0aGUgUG9ydCBQYWdlIDAgZGF0YQogCQkJCSAqLwpAQCAtNDEzMSw3ICs0MTQ2LDcgQEAKIAogCQkJCWlmICggKHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9RQVMpID09IDAgKSB7CiAJCQkJCWlvYy0+c3BpX2RhdGEubm9RYXMgfD0gTVBUX1RBUkdFVF9OT19ORUdPX1FBUzsKLQkJCQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiIDolcyBub1FhcyBkdWUgdG8gQ2FwYWJpbGl0aWVzPSV4XG4iLAorCQkJCQlkZHZwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiIDolcyBub1FhcyBkdWUgdG8gQ2FwYWJpbGl0aWVzPSV4XG4iLAogCQkJCQkJaW9jLT5uYW1lLCBwUFAwLT5DYXBhYmlsaXRpZXMpKTsKIAkJCQl9CiAJCQkJaW9jLT5zcGlfZGF0YS5tYXhCdXNXaWR0aCA9IHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9XSURFID8gMSA6IDA7CkBAIC00MTQwLDYgKzQxNTUsOCBAQAogCQkJCQlpb2MtPnNwaV9kYXRhLm1heFN5bmNPZmZzZXQgPSAodTgpIChkYXRhID4+IDE2KTsKIAkJCQkJZGF0YSA9IHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NSU5fU1lOQ19QRVJJT0RfTUFTSzsKIAkJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gKHU4KSAoZGF0YSA+PiA4KTsKKwkJCQkJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJQb3J0UGFnZTAgbWluU3luY0ZhY3Rvcj0leFxuIiwKKwkJCQkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaW9jLT5zcGlfZGF0YS5tYXhTeW5jT2Zmc2V0ID0gMDsKIAkJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gTVBUX0FTWU5DOwpAQCAtNDE1Miw4ICs0MTY5LDExIEBACiAJCQkJaWYgKChpb2MtPnNwaV9kYXRhLmJ1c1R5cGUgPT0gTVBJX1NDU0lQT1JUUEFHRTBfUEhZX1NJR05BTF9IVkQpIHx8CiAJCQkJCShpb2MtPnNwaV9kYXRhLmJ1c1R5cGUgPT0gTVBJX1NDU0lQT1JUUEFHRTBfUEhZX1NJR05BTF9TRSkpICB7CiAKLQkJCQlpZiAoaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yIDwgTVBUX1VMVFJBKQorCQkJCQlpZiAoaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yIDwgTVBUX1VMVFJBKSB7CiAJCQkJCQlpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IgPSBNUFRfVUxUUkE7CisJCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhWRCBvciBTRSBkZXRlY3RlZCwgbWluU3luY0ZhY3Rvcj0leFxuIiwKKwkJCQkJCQlpb2MtPm5hbWUsIGlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvcikpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJaWYgKHBidWYpIHsKQEAgLTQxNjgsNyArNDE4OCw3IEBACiAJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOwogCWhlYWRlci5QYWdlTnVtYmVyID0gMjsKIAloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfUE9SVDsKLQljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gcG9ydG51bTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC00MjM2LDcgKzQyNTYsNyBAQAogCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKIAloZWFkZXIuUGFnZU51bWJlciA9IDE7CiAJaGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX0RFVklDRTsKLQljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gcG9ydG51bTsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC00MjQ1LDggKzQyNjUsOCBAQAogCWlmIChtcHRfY29uZmlnKGlvYywgJmNmZykgIT0gMCkKIAkJIHJldHVybiAtRUZBVUxUOwogCi0JaW9jLT5zcGlfZGF0YS5zZHAxdmVyc2lvbiA9IGNmZy5oZHItPlBhZ2VWZXJzaW9uOwotCWlvYy0+c3BpX2RhdGEuc2RwMWxlbmd0aCA9IGNmZy5oZHItPlBhZ2VMZW5ndGg7CisJaW9jLT5zcGlfZGF0YS5zZHAxdmVyc2lvbiA9IGNmZy5jZmdoZHIuaGRyLT5QYWdlVmVyc2lvbjsKKwlpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGggPSBjZmcuY2ZnaGRyLmhkci0+UGFnZUxlbmd0aDsKIAogCWhlYWRlci5QYWdlVmVyc2lvbiA9IDA7CiAJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOwpAQCAtNDI1NSw4ICs0Mjc1LDggQEAKIAlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCiAJCSByZXR1cm4gLUVGQVVMVDsKIAotCWlvYy0+c3BpX2RhdGEuc2RwMHZlcnNpb24gPSBjZmcuaGRyLT5QYWdlVmVyc2lvbjsKLQlpb2MtPnNwaV9kYXRhLnNkcDBsZW5ndGggPSBjZmcuaGRyLT5QYWdlTGVuZ3RoOworCWlvYy0+c3BpX2RhdGEuc2RwMHZlcnNpb24gPSBjZmcuY2ZnaGRyLmhkci0+UGFnZVZlcnNpb247CisJaW9jLT5zcGlfZGF0YS5zZHAwbGVuZ3RoID0gY2ZnLmNmZ2hkci5oZHItPlBhZ2VMZW5ndGg7CiAKIAlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGVhZGVyczogMDogdmVyc2lvbiAlZCBsZW5ndGggJWRcbiIsCiAJCQlpb2MtPm5hbWUsIGlvYy0+c3BpX2RhdGEuc2RwMHZlcnNpb24sIGlvYy0+c3BpX2RhdGEuc2RwMGxlbmd0aCkpOwpAQCAtNDI5OCw3ICs0MzE4LDcgQEAKIAloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CiAJaGVhZGVyLlBhZ2VOdW1iZXIgPSAyOwogCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfSU9DOwotCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcucGFnZUFkZHIgPSAwOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKQEAgLTQzOTQsNyArNDQxNCw3IEBACiAJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOwogCWhlYWRlci5QYWdlTnVtYmVyID0gMzsKIAloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0lPQzsKLQljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gMDsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC00NDQ2LDcgKzQ0NjYsNyBAQAogCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKIAloZWFkZXIuUGFnZU51bWJlciA9IDQ7CiAJaGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9JT0M7Ci0JY2ZnLmhkciA9ICZoZWFkZXI7CisJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyOwogCWNmZy5waHlzQWRkciA9IC0xOwogCWNmZy5wYWdlQWRkciA9IDA7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwpAQCAtNDQ5OCw3ICs0NTE4LDcgQEAKIAloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CiAJaGVhZGVyLlBhZ2VOdW1iZXIgPSAxOwogCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfSU9DOwotCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjsKIAljZmcucGh5c0FkZHIgPSAtMTsKIAljZmcucGFnZUFkZHIgPSAwOwogCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKQEAgLTQ1ODAsMTMgKzQ2MDAsMTMgQEAKIAogCWV2bnAgPSAoRXZlbnROb3RpZmljYXRpb25fdCAqKSBtcHRfZ2V0X21zZ19mcmFtZShtcHRfYmFzZV9pbmRleCwgaW9jKTsKIAlpZiAoZXZucCA9PSBOVUxMKSB7Ci0JCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCByZXF1ZXN0IGZyYW1lIVxuIiwKKwkJZGV2dHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiVW5hYmxlIHRvIGFsbG9jYXRlIGV2ZW50IHJlcXVlc3QgZnJhbWUhXG4iLAogCQkJCWlvYy0+bmFtZSkpOwogCQlyZXR1cm4gMDsKIAl9CiAJbWVtc2V0KGV2bnAsIDAsIHNpemVvZigqZXZucCkpOwogCi0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBFdmVudE5vdGlmaWNhdGlvbiglZClcbiIsIGlvYy0+bmFtZSwgRXZTd2l0Y2gpKTsKKwlkZXZ0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTZW5kaW5nIEV2ZW50Tm90aWZpY2F0aW9uICglZCkgcmVxdWVzdCAlcFxuIiwgaW9jLT5uYW1lLCBFdlN3aXRjaCwgZXZucCkpOwogCiAJZXZucC0+RnVuY3Rpb24gPSBNUElfRlVOQ1RJT05fRVZFTlRfTk9USUZJQ0FUSU9OOwogCWV2bnAtPkNoYWluT2Zmc2V0ID0gMDsKQEAgLTQ2MTAsOCArNDYzMCwxMCBAQAogCUV2ZW50QWNrX3QJKnBBY2s7CiAKIAlpZiAoKHBBY2sgPSAoRXZlbnRBY2tfdCAqKSBtcHRfZ2V0X21zZ19mcmFtZShtcHRfYmFzZV9pbmRleCwgaW9jKSkgPT0gTlVMTCkgewotCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiVW5hYmxlIHRvIGFsbG9jYXRlIGV2ZW50IEFDSyByZXF1ZXN0IGZyYW1lIVxuIiwKLQkJCQlpb2MtPm5hbWUpOworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiVW5hYmxlIHRvIGFsbG9jYXRlIGV2ZW50IEFDSyAiCisJCQkicmVxdWVzdCBmcmFtZSBmb3IgRXZlbnQ9JXggRXZlbnRDb250ZXh0PSV4IEV2ZW50RGF0YT0leCFcbiIsCisJCQlpb2MtPm5hbWUsIGV2bnAtPkV2ZW50LCBsZTMyX3RvX2NwdShldm5wLT5FdmVudENvbnRleHQpLAorCQkJbGUzMl90b19jcHUoZXZucC0+RGF0YVswXSkpOwogCQlyZXR1cm4gLTE7CiAJfQogCW1lbXNldChwQWNrLCAwLCBzaXplb2YoKnBBY2spKTsKQEAgLTQ2NDcsMTAgKzQ2NjksMTEgQEAKIG1wdF9jb25maWcoTVBUX0FEQVBURVIgKmlvYywgQ09ORklHUEFSTVMgKnBDZmcpCiB7CiAJQ29uZmlnX3QJKnBSZXE7CisJQ29uZmlnRXh0ZW5kZWRQYWdlSGVhZGVyX3QgICpwRXh0SGRyID0gTlVMTDsKIAlNUFRfRlJBTUVfSERSCSptZjsKIAl1bnNpZ25lZCBsb25nCSBmbGFnczsKIAlpbnQJCSBpaSwgcmM7Ci0JdTMyCQkgZmxhZ3NMZW5ndGg7CisJaW50CQkgZmxhZ3NMZW5ndGg7CiAJaW50CQkgaW5faXNyOwogCiAJLyoJUHJldmVudCBjYWxsaW5nIHdhaXRfZXZlbnQoKSAoYmVsb3cpLCBpZiBjYWxsZXIgaGFwcGVucwpAQCAtNDY3NSwxNiArNDY5OCwzMCBAQAogCXBSZXEtPlJlc2VydmVkID0gMDsKIAlwUmVxLT5DaGFpbk9mZnNldCA9IDA7CiAJcFJlcS0+RnVuY3Rpb24gPSBNUElfRlVOQ1RJT05fQ09ORklHOworCisJLyogQXNzdW1lIHBhZ2UgdHlwZSBpcyBub3QgZXh0ZW5kZWQgYW5kIGNsZWFyICJyZXNlcnZlZCIgZmllbGRzLiAqLwogCXBSZXEtPkV4dFBhZ2VMZW5ndGggPSAwOwogCXBSZXEtPkV4dFBhZ2VUeXBlID0gMDsKIAlwUmVxLT5Nc2dGbGFncyA9IDA7CisKIAlmb3IgKGlpPTA7IGlpIDwgODsgaWkrKykKIAkJcFJlcS0+UmVzZXJ2ZWQyW2lpXSA9IDA7CiAKLQlwUmVxLT5IZWFkZXIuUGFnZVZlcnNpb24gPSBwQ2ZnLT5oZHItPlBhZ2VWZXJzaW9uOwotCXBSZXEtPkhlYWRlci5QYWdlTGVuZ3RoID0gcENmZy0+aGRyLT5QYWdlTGVuZ3RoOwotCXBSZXEtPkhlYWRlci5QYWdlTnVtYmVyID0gcENmZy0+aGRyLT5QYWdlTnVtYmVyOwotCXBSZXEtPkhlYWRlci5QYWdlVHlwZSA9IChwQ2ZnLT5oZHItPlBhZ2VUeXBlICYgTVBJX0NPTkZJR19QQUdFVFlQRV9NQVNLKTsKKwlwUmVxLT5IZWFkZXIuUGFnZVZlcnNpb24gPSBwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlVmVyc2lvbjsKKwlwUmVxLT5IZWFkZXIuUGFnZUxlbmd0aCA9IHBDZmctPmNmZ2hkci5oZHItPlBhZ2VMZW5ndGg7CisJcFJlcS0+SGVhZGVyLlBhZ2VOdW1iZXIgPSBwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlTnVtYmVyOworCXBSZXEtPkhlYWRlci5QYWdlVHlwZSA9IChwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlVHlwZSAmIE1QSV9DT05GSUdfUEFHRVRZUEVfTUFTSyk7CisKKwlpZiAoKHBDZmctPmNmZ2hkci5oZHItPlBhZ2VUeXBlICYgTVBJX0NPTkZJR19QQUdFVFlQRV9NQVNLKSA9PSBNUElfQ09ORklHX1BBR0VUWVBFX0VYVEVOREVEKSB7CisJCXBFeHRIZHIgPSAoQ29uZmlnRXh0ZW5kZWRQYWdlSGVhZGVyX3QgKilwQ2ZnLT5jZmdoZHIuZWhkcjsKKwkJcFJlcS0+RXh0UGFnZUxlbmd0aCA9IGNwdV90b19sZTE2KHBFeHRIZHItPkV4dFBhZ2VMZW5ndGgpOworCQlwUmVxLT5FeHRQYWdlVHlwZSA9IHBFeHRIZHItPkV4dFBhZ2VUeXBlOworCQlwUmVxLT5IZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0VYVEVOREVEOworCisJCS8qIFBhZ2UgTGVuZ3RoIG11c3QgYmUgdHJlYXRlZCBhcyBhIHJlc2VydmVkIGZpZWxkIGZvciB0aGUgZXh0ZW5kZWQgaGVhZGVyLiAqLworCQlwUmVxLT5IZWFkZXIuUGFnZUxlbmd0aCA9IDA7CisJfQorCiAJcFJlcS0+UGFnZUFkZHJlc3MgPSBjcHVfdG9fbGUzMihwQ2ZnLT5wYWdlQWRkcik7CiAKIAkvKiBBZGQgYSBTR0UgdG8gdGhlIGNvbmZpZyByZXF1ZXN0LgpAQCAtNDY5NCwxMyArNDczMSwyMSBAQAogCWVsc2UKIAkJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfUkVBRDsKIAotCWZsYWdzTGVuZ3RoIHw9IHBDZmctPmhkci0+UGFnZUxlbmd0aCAqIDQ7CisJaWYgKChwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlVHlwZSAmIE1QSV9DT05GSUdfUEFHRVRZUEVfTUFTSykgPT0gTVBJX0NPTkZJR19QQUdFVFlQRV9FWFRFTkRFRCkgeworCQlmbGFnc0xlbmd0aCB8PSBwRXh0SGRyLT5FeHRQYWdlTGVuZ3RoICogNDsKKworCQlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb25maWcgcmVxdWVzdCB0eXBlICVkLCBwYWdlICVkIGFuZCBhY3Rpb24gJWRcbiIsCisJCQlpb2MtPm5hbWUsIHBSZXEtPkV4dFBhZ2VUeXBlLCBwUmVxLT5IZWFkZXIuUGFnZU51bWJlciwgcFJlcS0+QWN0aW9uKSk7CisJfQorCWVsc2UgeworCQlmbGFnc0xlbmd0aCB8PSBwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoICogNDsKKworCQlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb25maWcgcmVxdWVzdCB0eXBlICVkLCBwYWdlICVkIGFuZCBhY3Rpb24gJWRcbiIsCisJCQlpb2MtPm5hbWUsIHBSZXEtPkhlYWRlci5QYWdlVHlwZSwgcFJlcS0+SGVhZGVyLlBhZ2VOdW1iZXIsIHBSZXEtPkFjdGlvbikpOworCX0KIAogCW1wdF9hZGRfc2dlKChjaGFyICopJnBSZXEtPlBhZ2VCdWZmZXJTR0UsIGZsYWdzTGVuZ3RoLCBwQ2ZnLT5waHlzQWRkcik7CiAKLQlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb25maWcgcmVxdWVzdCB0eXBlICVkLCBwYWdlICVkIGFuZCBhY3Rpb24gJWRcbiIsCi0JCWlvYy0+bmFtZSwgcFJlcS0+SGVhZGVyLlBhZ2VUeXBlLCBwUmVxLT5IZWFkZXIuUGFnZU51bWJlciwgcFJlcS0+QWN0aW9uKSk7Ci0KIAkvKiBBcHBlbmQgcENmZyBwb2ludGVyIHRvIGVuZCBvZiBtZgogCSAqLwogCSooKHZvaWQgKiopICgoKHU4ICopIG1mKSArIChpb2MtPnJlcV9zeiAtIHNpemVvZih2b2lkICopKSkpID0gICh2b2lkICopIHBDZmc7CkBAIC00Nzg5LDggKzQ4MzQsOCBAQAogCXBSZXEtPlJlc2VydmVkMyA9IDA7CiAJcFJlcS0+TnVtQWRkcmVzc0J5dGVzID0gMHgwMTsKIAlwUmVxLT5SZXNlcnZlZDQgPSAwOwotCXBSZXEtPkRhdGFMZW5ndGggPSAweDA0OwotCXBkZXYgPSAoc3RydWN0IHBjaV9kZXYgKikgaW9jLT5wY2lkZXY7CisJcFJlcS0+RGF0YUxlbmd0aCA9IGNwdV90b19sZTE2KDB4MDQpOworCXBkZXYgPSBpb2MtPnBjaWRldjsKIAlpZiAocGRldi0+ZGV2Zm4gJiAxKQogCQlwUmVxLT5EZXZpY2VBZGRyID0gMHhCMjsKIAllbHNlCkBAIC01NTA0LDYgKzU1NDksOCBAQAogCSAqICBJZiBuZWVkZWQsIHNlbmQgKGEgc2luZ2xlKSBFdmVudEFjay4KIAkgKi8KIAlpZiAocEV2ZW50UmVwbHktPkFja1JlcXVpcmVkID09IE1QSV9FVkVOVF9OT1RJRklDQVRJT05fQUNLX1JFUVVJUkVEKSB7CisJCWRldnRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCSJFdmVudEFjayByZXF1aXJlZFxuIixpb2MtPm5hbWUpKTsKIAkJaWYgKChpaSA9IFNlbmRFdmVudEFjayhpb2MsIHBFdmVudFJlcGx5KSkgIT0gMCkgewogCQkJZGV2dHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiU2VuZEV2ZW50QWNrIHJldHVybmVkICVkXG4iLAogCQkJCQlpb2MtPm5hbWUsIGlpKSk7CkBAIC01NTg0LDcgKzU2MzEsNyBAQAogCWNhc2UgMHgwMDA4MDAwMDoKIAkJZGVzYyA9ICJPdXRib3VuZCBETUEgT3ZlcnJ1biI7CiAJCWJyZWFrOwotCQorCiAJY2FzZSAweDAwMDkwMDAwOgogCQlkZXNjID0gIlRhc2sgTWFuYWdlbWVudCI7CiAJCWJyZWFrOwpAQCAtNTYwMCw3ICs1NjQ3LDcgQEAKIAljYXNlIDB4MDAwQzAwMDA6CiAJCWRlc2MgPSAiVW50YWdnZWQgVGFibGUgU2l6ZSI7CiAJCWJyZWFrOwotCQorCiAJfQogCiAJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQgIkxvZ0luZm8oMHglMDh4KTogRi9XOiAlc1xuIiwgaW9jLT5uYW1lLCBsb2dfaW5mbywgZGVzYyk7CkBAIC01NjkyLDcgKzU3MzksNyBAQAogCQlicmVhazsKIAogCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU46IC8qIDB4MDA0NSAqLwotCQkvKiBUaGlzIGVycm9yIGlzIGNoZWNrZWQgaW4gc2NzaV9pb19kb25lKCkuIFNraXAuIAorCQkvKiBUaGlzIGVycm9yIGlzIGNoZWNrZWQgaW4gc2NzaV9pb19kb25lKCkuIFNraXAuCiAJCWRlc2MgPSAiU0NTSSBEYXRhIFVuZGVycnVuIjsKIAkJKi8KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCmluZGV4IDg0OGZiMjM2Li5mNDgyN2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaApAQCAtOTE1LDcgKzkxNSwxMCBAQAogdHlwZWRlZiBzdHJ1Y3QgX3hfY29uZmlnX3Bhcm1zIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSBsaW5rYWdlOwkvKiBsaW5rZWQgbGlzdCAqLwogCXN0cnVjdCB0aW1lcl9saXN0CSB0aW1lcjsJCS8qIHRpbWVyIGZ1bmN0aW9uIGZvciB0aGlzIHJlcXVlc3QgICovCi0JQ29uZmlnUGFnZUhlYWRlcl90CSpoZHI7CisJdW5pb24geworCQlDb25maWdFeHRlbmRlZFBhZ2VIZWFkZXJfdAkqZWhkcjsKKwkJQ29uZmlnUGFnZUhlYWRlcl90CSpoZHI7CisJfSBjZmdoZHI7CiAJZG1hX2FkZHJfdAkJIHBoeXNBZGRyOwogCWludAkJCSB3YWl0X2RvbmU7CS8qIHdhaXQgZm9yIHRoaXMgcmVxdWVzdCAqLwogCXUzMgkJCSBwYWdlQWRkcjsJLyogcHJvcGVybHkgZm9ybWF0dGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYwppbmRleCAwNWVhNTk0Li43NTc3YzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCQkvKiBTZXQgdGhlIGNvbW1hbmQgc3RhdHVzIHRvIEdPT0QgaWYgSU9DIFN0YXR1cyBpcyBHT09ECiAJCSAqIE9SIGlmIFNDU0kgSS9PIGNtZCBhbmQgZGF0YSB1bmRlcnJ1biBvciByZWNvdmVyZWQgZXJyb3IuCiAJCSAqLwotCQlpb2NTdGF0dXMgPSByZXBseS0+dS5yZXBseS5JT0NTdGF0dXMgJiBNUElfSU9DU1RBVFVTX01BU0s7CisJCWlvY1N0YXR1cyA9IGxlMTZfdG9fY3B1KHJlcGx5LT51LnJlcGx5LklPQ1N0YXR1cykgJiBNUElfSU9DU1RBVFVTX01BU0s7CiAJCWlmIChpb2NTdGF0dXMgID09IE1QSV9JT0NTVEFUVVNfU1VDQ0VTUykKIAkJCWlvYy0+aW9jdGwtPnN0YXR1cyB8PSBNUFRfSU9DVExfU1RBVFVTX0NPTU1BTkRfR09PRDsKIApAQCAtMjMyNCw3ICsyMzI0LDcgQEAKIAloZHIuUGFnZUxlbmd0aCA9IDA7CiAJaGRyLlBhZ2VOdW1iZXIgPSAwOwogCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfTUFOVUZBQ1RVUklORzsKLQljZmcuaGRyID0gJmhkcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZHI7CiAJY2ZnLnBoeXNBZGRyID0gLTE7CiAJY2ZnLnBhZ2VBZGRyID0gMDsKIAljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CkBAIC0yMzMzLDcgKzIzMzMsNyBAQAogCiAJc3RybmNweShrYXJnLnNlcmlhbF9udW1iZXIsICIgIiwgMjQpOwogCWlmIChtcHRfY29uZmlnKGlvYywgJmNmZykgPT0gMCkgewotCQlpZiAoY2ZnLmhkci0+UGFnZUxlbmd0aCA+IDApIHsKKwkJaWYgKGNmZy5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoID4gMCkgewogCQkJLyogSXNzdWUgdGhlIHNlY29uZCBjb25maWcgcGFnZSByZXF1ZXN0ICovCiAJCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CiAKQEAgLTI0NzksNyArMjQ3OSw3IEBACiAJCWhkci5QYWdlTnVtYmVyID0gMDsKIAkJaGRyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX0RFVklDRTsKIAotCQljZmcuaGRyID0gJmhkcjsKKwkJY2ZnLmNmZ2hkci5oZHIgPSAmaGRyOwogCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CiAJCWNmZy5kaXIgPSAwOwogCQljZmcudGltZW91dCA9IDA7CkBAIC0yNTI3LDE1ICsyNTI3LDE1IEBACiAJaGRyLlBhZ2VOdW1iZXIgPSAzOwogCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7CiAKLQljZmcuaGRyID0gJmhkcjsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZHI7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOwogCWNmZy5kaXIgPSAwOwogCWNmZy50aW1lb3V0ID0gMDsKIAljZmcucGh5c0FkZHIgPSAtMTsKLQlpZiAoKG1wdF9jb25maWcoaW9jLCAmY2ZnKSA9PSAwKSAmJiAoY2ZnLmhkci0+UGFnZUxlbmd0aCA+IDApKSB7CisJaWYgKChtcHRfY29uZmlnKGlvYywgJmNmZykgPT0gMCkgJiYgKGNmZy5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoID4gMCkpIHsKIAkJLyogSXNzdWUgdGhlIHNlY29uZCBjb25maWcgcGFnZSByZXF1ZXN0ICovCiAJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKLQkJZGF0YV9zeiA9IChpbnQpIGNmZy5oZHItPlBhZ2VMZW5ndGggKiA0OworCQlkYXRhX3N6ID0gKGludCkgY2ZnLmNmZ2hkci5oZHItPlBhZ2VMZW5ndGggKiA0OwogCQlwZzNfYWxsb2MgPSAoU0NTSURldmljZVBhZ2UzX3QgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoCiAJCQkJCQkJaW9jLT5wY2lkZXYsIGRhdGFfc3osICZwYWdlX2RtYSk7CiAJCWlmIChwZzNfYWxsb2MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwppbmRleCBiOWQ0Zjc4Li40YTAwM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCkBAIC0yODEsMTIgKzI4MSwxMiBAQAogCQlvZmZzZXQgPSAodTggKiljaGFpbkJ1ZiAtICh1OCAqKWlvYy0+Q2hhaW5CdWZmZXI7CiAJCWNoYWluX2lkeCA9IG9mZnNldCAvIGlvYy0+cmVxX3N6OwogCQlyYyA9IFNVQ0NFU1M7Ci0JCWRzZ3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZ2V0RnJlZUNoYWluQnVmZmVyIChpbmRleCAlZCksIGdvdCBidWY9JXBcbiIsCi0JCQlpb2MtPm5hbWUsICpyZXRJbmRleCwgY2hhaW5CdWYpKTsKKwkJZHNncHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciBjaGFpbkJ1Zj0lcCBDaGFpbkJ1ZmZlcj0lcCBvZmZzZXQ9JWQgY2hhaW5faWR4PSVkXG4iLAorCQkJaW9jLT5uYW1lLCBjaGFpbkJ1ZiwgaW9jLT5DaGFpbkJ1ZmZlciwgb2Zmc2V0LCBjaGFpbl9pZHgpKTsKIAl9IGVsc2UgewogCQlyYyA9IEZBSUxFRDsKIAkJY2hhaW5faWR4ID0gTVBUX0hPU1RfTk9fQ0hBSU47Ci0JCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciBmYWlsZWRcbiIsCisJCWRmYWlscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgZmFpbGVkXG4iLAogCQkJaW9jLT5uYW1lKSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CkBAIC00MzIsNyArNDMyLDcgQEAKIAkJCSAqLwogCQkJcFJlcS0+Q2hhaW5PZmZzZXQgPSAwOwogCQkJUmVxdWVzdE5CID0gKCgoc2dlT2Zmc2V0IC0gMSkgPj4gaW9jLT5OQlNoaWZ0RmFjdG9yKSAgKyAxKSAmIDB4MDM7Ci0JCQlkc2dwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAKKwkJCWRzZ3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAogCQkJICAgICJTaW5nbGUgQnVmZmVyIFJlcXVlc3ROQj0leCwgc2dlT2Zmc2V0PSVkXG4iLCBpb2MtPm5hbWUsIFJlcXVlc3ROQiwgc2dlT2Zmc2V0KSk7CiAJCQlpb2MtPlJlcXVlc3ROQltyZXFfaWR4XSA9IFJlcXVlc3ROQjsKIAkJfQpAQCAtNDkxLDExICs0OTEsMTIgQEAKIAkJLyogTk9URTogcHNnZSBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhaW4gZWxlbWVudAogCQkgKiBpbiBjdXJyZW50IGJ1ZmZlci4gR2V0IGEgY2hhaW4gYnVmZmVyLgogCQkgKi8KLQkJZHNncHJpbnRrKChNWUlPQ19zX0lORk9fRk1UIAotCQkgICAgImNhbGxpbmcgZ2V0RnJlZUNoYWluQnVmZmVyIFNDU0kgY21kPSUwMnggKCVwKVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgcFJlcS0+Q0RCWzBdLCBTQ3BudCkpOwotCQlpZiAoKG1wdHNjc2loX2dldEZyZWVDaGFpbkJ1ZmZlcihpb2MsICZuZXdJbmRleCkpID09IEZBSUxFRCkKKwkJaWYgKChtcHRzY3NpaF9nZXRGcmVlQ2hhaW5CdWZmZXIoaW9jLCAmbmV3SW5kZXgpKSA9PSBGQUlMRUQpIHsKKwkJCWRmYWlscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCQkgICAgImdldEZyZWVDaGFpbkJ1ZmZlciBGQUlMRUQgU0NTSSBjbWQ9JTAyeCAoJXApXG4iLAorIAkJCSAgICBpb2MtPm5hbWUsIHBSZXEtPkNEQlswXSwgU0NwbnQpKTsKIAkJCXJldHVybiBGQUlMRUQ7CisJCX0KIAogCQkvKiBVcGRhdGUgdGhlIHRyYWNraW5nIGFycmF5cy4KIAkJICogSWYgY2hhaW5TZ2UgPT0gTlVMTCwgdXBkYXRlIFJlcVRvQ2hhaW4sIGVsc2UgQ2hhaW5Ub0NoYWluCkBAIC01NzcsMTQgKzU3OCwyMCBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKLQkJIlNjc2lEb25lIChtZj0lcCxtcj0lcCxzYz0lcCxpZHg9JWQpXG4iLAotCQlpb2MtPm5hbWUsIG1mLCBtciwgc2MsIHJlcV9pZHgpKTsKLQogCXNjLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CQkvKiBTZXQgZGVmYXVsdCByZXBseSBhcyBPSyAqLwogCXBTY3NpUmVxID0gKFNDU0lJT1JlcXVlc3RfdCAqKSBtZjsKIAlwU2NzaVJlcGx5ID0gKFNDU0lJT1JlcGx5X3QgKikgbXI7CiAKKwlpZigoaW9jLT5mYWN0cy5Nc2dWZXJzaW9uID49IE1QSV9WRVJTSU9OXzAxXzA1KSAmJiBwU2NzaVJlcGx5KXsKKwkJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCQkiU2NzaURvbmUgKG1mPSVwLG1yPSVwLHNjPSVwLGlkeD0lZCx0YXNrLXRhZz0lZClcbiIsCisJCQlpb2MtPm5hbWUsIG1mLCBtciwgc2MsIHJlcV9pZHgsIHBTY3NpUmVwbHktPlRhc2tUYWcpKTsKKwl9ZWxzZXsKKwkJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCQkiU2NzaURvbmUgKG1mPSVwLG1yPSVwLHNjPSVwLGlkeD0lZClcbiIsCisJCQlpb2MtPm5hbWUsIG1mLCBtciwgc2MsIHJlcV9pZHgpKTsKKwl9CisKIAlpZiAocFNjc2lSZXBseSA9PSBOVUxMKSB7CiAJCS8qIHNwZWNpYWwgY29udGV4dCByZXBseSBoYW5kbGluZyAqLwogCQk7CkBAIC02NTgsOCArNjY1LDggQEAKIAkJCQkvKiBTdWZmaWNpZW50IGRhdGEgdHJhbnNmZXIgb2NjdXJyZWQgKi8KIAkJCQlzYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzY3NpX3N0YXR1czsKIAkJCX0gZWxzZSBpZiAoIHhmZXJfY250ID09IDAgKSB7Ci0JCQkJLyogQSBDUkMgRXJyb3IgY2F1c2VzIHRoaXMgY29uZGl0aW9uOyByZXRyeSAqLyAKLQkJCQlzYy0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCkgfCAoRElEX09LIDw8IDE2KSB8IAorCQkJCS8qIEEgQ1JDIEVycm9yIGNhdXNlcyB0aGlzIGNvbmRpdGlvbjsgcmV0cnkgKi8KKwkJCQlzYy0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCkgfCAoRElEX09LIDw8IDE2KSB8CiAJCQkJCShDSEVDS19DT05ESVRJT04gPDwgMSk7CiAJCQkJc2MtPnNlbnNlX2J1ZmZlclswXSA9IDB4NzA7CiAJCQkJc2MtPnNlbnNlX2J1ZmZlclsyXSA9IE5PX1NFTlNFOwpAQCAtNjY4LDcgKzY3NSw5IEBACiAJCQl9IGVsc2UgewogCQkJCXNjLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKIAkJCX0KLQkJCWRyZXBseXByaW50aygoS0VSTl9OT1RJQ0UgIlJFU0lEVUFMX01JU01BVENIOiByZXN1bHQ9JXggb24gaWQ9JWRcbiIsIHNjLT5yZXN1bHQsIHNjLT50YXJnZXQpKTsKKwkJCWRyZXBseXByaW50aygoS0VSTl9OT1RJQ0UKKwkJCSAgICAiUkVTSURVQUxfTUlTTUFUQ0g6IHJlc3VsdD0leCBvbiBpZD0lZFxuIiwKKwkJCSAgICBzYy0+cmVzdWx0LCBzYy0+ZGV2aWNlLT5pZCkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfREFUQV9VTkRFUlJVTjoJCS8qIDB4MDA0NSAqLwpAQCAtNzk2LDcgKzgwNSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogLyoKICAqCW1wdHNjc2loX2ZsdXNoX3J1bm5pbmdfY21kcyAtIEZvciBlYWNoIGNvbW1hbmQgZm91bmQsIHNlYXJjaAogICoJCVNjc2lfSG9zdCBpbnN0YW5jZSB0YXNrUSBhbmQgcmVwbHkgdG8gT1MuCkBAIC0xMDE3LDcgKzEwMjUsNyBAQAogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CiAKIAltcHRfZGV0YWNoKHBkZXYpOwotCQorCiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KQEAgLTEwNzIsNyArMTA4MCw3IEBACiAJTVBUX1NDU0lfSE9TVAkJKmhkOwogCiAJbXB0X3Jlc3VtZShwZGV2KTsKLQkKKwogCWlmKCFob3N0KQogCQlyZXR1cm4gMDsKIApAQCAtMTIxNCw4ICsxMjIyLDggQEAKIAlpbnQgc2l6ZSA9IDA7CiAKIAlpZiAoZnVuYykgewotCQkvKiAKLQkJICogd3JpdGUgaXMgbm90IHN1cHBvcnRlZCAKKwkJLyoKKwkJICogd3JpdGUgaXMgbm90IHN1cHBvcnRlZAogCQkgKi8KIAl9IGVsc2UgewogCQlpZiAoc3RhcnQpCkBAIC0xNTM1LDE3ICsxNTQzLDE3IEBACiAJICovCiAJaWYgKG1wdHNjc2loX3RtX3BlbmRpbmdfd2FpdChoZCkgPT0gRkFJTEVEKSB7CiAJCWlmICh0eXBlID09IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQUJPUlRfVEFTSykgewotCQkJZHRtcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFRNSGFuZGxlciBhYm9ydDogIgorCQkJZHRtcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IFRNSGFuZGxlciBhYm9ydDogIgogCQkJICAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBsYXN0IFRNICglZCkgdG8gY29tcGxldGUhIFxuIiwKIAkJCSAgIGhkLT5pb2MtPm5hbWUsIGhkLT50bVBlbmRpbmcpKTsKIAkJCXJldHVybiBGQUlMRUQ7CiAJCX0gZWxzZSBpZiAodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1RBUkdFVF9SRVNFVCkgewotCQkJZHRtcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFRNSGFuZGxlciB0YXJnZXQgcmVzZXQ6ICIKKwkJCWR0bXByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgdGFyZ2V0IHJlc2V0OiAiCiAJCQkgICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGxhc3QgVE0gKCVkKSB0byBjb21wbGV0ZSEgXG4iLAogCQkJICAgaGQtPmlvYy0+bmFtZSwgaGQtPnRtUGVuZGluZykpOwogCQkJcmV0dXJuIEZBSUxFRDsKIAkJfSBlbHNlIGlmICh0eXBlID09IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfUkVTRVRfQlVTKSB7Ci0JCQlkdG1wcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlczogVE1IYW5kbGVyIGJ1cyByZXNldDogIgorCQkJZHRtcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IFRNSGFuZGxlciBidXMgcmVzZXQ6ICIKIAkJCSAgICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbGFzdCBUTSAoJWQpIHRvIGNvbXBsZXRlISBcbiIsCiAJCQkgICBoZC0+aW9jLT5uYW1lLCBoZC0+dG1QZW5kaW5nKSk7CiAJCQlpZiAoaGQtPnRtUGVuZGluZyAmICgxIDw8IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfUkVTRVRfQlVTKSkKQEAgLTE2MzEsOCArMTYzOSw3IEBACiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKGhkLT5pb2MtPlRhc2tDdHgsIGhkLT5pb2MpKSA9PSBOVUxMKSB7CiAJCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIklzc3VlVGFza01nbXQsIG5vIG1zZyBmcmFtZXMhIVxuIiwKIAkJCQloZC0+aW9jLT5uYW1lKSk7Ci0JCS8vcmV0dXJuIEZBSUxFRDsKLQkJcmV0dXJuIC05OTk7CisJCXJldHVybiBGQUlMRUQ7CiAJfQogCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSXNzdWVUYXNrTWdtdCByZXF1ZXN0IEAgJXBcbiIsCiAJCQloZC0+aW9jLT5uYW1lLCBtZikpOwpAQCAtMTY2MSw5ICsxNjY4LDggQEAKIAogCXBTY3NpVG0tPlRhc2tNc2dDb250ZXh0ID0gY3R4MmFib3J0OwogCi0JZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCi0JCSJJc3N1ZVRhc2tNZ210OiBjdHgyYWJvcnQgKDB4JTA4eCkgdHlwZT0lZFxuIiwKLQkJaGQtPmlvYy0+bmFtZSwgY3R4MmFib3J0LCB0eXBlKSk7CisJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZVRhc2tNZ210OiBjdHgyYWJvcnQgKDB4JTA4eCkgdHlwZT0lZFxuIiwKKwkJCWhkLT5pb2MtPm5hbWUsIGN0eDJhYm9ydCwgdHlwZSkpOwogCiAJREJHX0RVTVBfVE1fUkVRVUVTVF9GUkFNRSgodTMyICopcFNjc2lUbSk7CiAKQEAgLTE5MDIsMTMgKzE5MDgsMTMgQEAKIAogCS8qICBJZiB3ZSBjYW4ndCBsb2NhdGUgdGhlIGhvc3QgdG8gcmVzZXQsIHRoZW4gd2UgZmFpbGVkLiAqLwogCWlmICgoaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkgPT0gTlVMTCl7Ci0JCWR0bXByaW50ayggKCBLRVJOX1dBUk5JTkcgTVlOQU0gIjogbXB0c2NzaWhfaG9zdF9yZXNldDogIgorCQlkdG1wcmludGsoICggS0VSTl9JTkZPIE1ZTkFNICI6IG1wdHNjc2loX2hvc3RfcmVzZXQ6ICIKIAkJCSAgICAgIkNhbid0IGxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLAogCQkJICAgICBTQ3BudCApICk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlczogPj4gQXR0ZW1wdGluZyBob3N0IHJlc2V0ISAoc2M9JXApXG4iLAorCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IEF0dGVtcHRpbmcgaG9zdCByZXNldCEgKHNjPSVwKVxuIiwKIAkgICAgICAgaGQtPmlvYy0+bmFtZSwgU0NwbnQpOwogCiAJLyogIElmIG91ciBhdHRlbXB0cyB0byByZXNldCB0aGUgaG9zdCBmYWlsZWQsIHRoZW4gcmV0dXJuIGEgZmFpbGVkCkBAIC0xOTI0LDcgKzE5MzAsNyBAQAogCQloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX05PTkU7CiAJfQogCi0JZHRtcHJpbnRrKCAoIEtFUk5fV0FSTklORyBNWU5BTSAiOiBtcHRzY3NpaF9ob3N0X3Jlc2V0OiAiCisJZHRtcHJpbnRrKCAoIEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRzY3NpaF9ob3N0X3Jlc2V0OiAiCiAJCSAgICAgIlN0YXR1cyA9ICVzXG4iLAogCQkgICAgIChzdGF0dXMgPT0gU1VDQ0VTUykgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIiApICk7CiAKQEAgLTE5NTEsOCArMTk1Nyw4IEBACiAJCWlmIChoZC0+dG1TdGF0ZSA9PSBUTV9TVEFURV9OT05FKSB7CiAJCQloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX0lOX1BST0dSRVNTOwogCQkJaGQtPnRtUGVuZGluZyA9IDE7Ci0JCQlzdGF0dXMgPSBTVUNDRVNTOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCQlzdGF0dXMgPSBTVUNDRVNTOwogCQkJYnJlYWs7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CkBAIC0xOTgwLDcgKzE5ODYsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CiAJCWlmKGhkLT50bVBlbmRpbmcgPT0gMCkgewogCQkJc3RhdHVzID0gU1VDQ0VTUzsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CkBAIC0yMzE4LDEwICsyMzI0LDEwIEBACiAJaWYgKHBUYXJnZXQgPT0gTlVMTCkgewogCQkvKiBEcml2ZXIgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgZGV2aWNlLgogCQkgKiBLZXJuZWwgbWF5IGdlbmVyYXRlIGEgIkR1bW15IEx1biAwIiB3aGljaAotCQkgKiBtYXkgYmVjb21lIGEgcmVhbCBMdW4gaWYgYSAKKwkJICogbWF5IGJlY29tZSBhIHJlYWwgTHVuIGlmIGEKIAkJICogInNjc2kgYWRkLXNpbmdsZS1kZXZpY2UiIGNvbW1hbmQgaXMgZXhlY3V0ZWQKLQkJICogd2hpbGUgdGhlIGRyaXZlciBpcyBhY3RpdmUgKGhvdC1wbHVnIGEgCi0JCSAqIGRldmljZSkuICBMU0kgUmFpZCBjb250cm9sbGVycyBuZWVkIAorCQkgKiB3aGlsZSB0aGUgZHJpdmVyIGlzIGFjdGl2ZSAoaG90LXBsdWcgYQorCQkgKiBkZXZpY2UpLiAgTFNJIFJhaWQgY29udHJvbGxlcnMgbmVlZAogCQkgKiBxdWV1ZV9kZXB0aCBzZXQgdG8gREVWX0hJR0ggZm9yIHRoaXMgcmVhc29uLgogCQkgKi8KIAkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLCBNU0dfU0lNUExFX1RBRywKQEAgLTI2OTEsNyArMjY5Nyw3IEBACiAJICogSWYgdGhlIHBlcmlwaGVyYWwgcXVhbGlmaWVyIGZpbHRlciBpcyBlbmFibGVkIHRoZW4gaWYgdGhlIHRhcmdldCByZXBvcnRzIGEgMHgxCiAJICogKGkuZS4gVGhlIHRhcmdlciBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGRldmljZSB0eXBlCiAJICogb24gdGhpcyBsb2dpY2FsIHVuaXQ7IGhvd2V2ZXIsIHRoZSBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQKLQkgKiB0byB0aGlzIGxvZ2ljYWwgdW5pdCkgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSAweDMgKGkuZS4gVGhlIHRhcmdldCBpcyBub3QgCisJICogdG8gdGhpcyBsb2dpY2FsIHVuaXQpIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgMHgzIChpLmUuIFRoZSB0YXJnZXQgaXMgbm90CiAJICogY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGEgcGh5c2ljYWwgZGV2aWNlIG9uIHRoaXMgbG9naWNhbCB1bml0KS4gVGhpcyBpcyB0byB3b3JrCiAJICogYXJvdW5kIGEgYnVnIGluIHRoIGVtaWQtbGF5ZXIgaW4gc29tZSBkaXN0cmlidXRpb25zIGluIHdoaWNoIHRoZSBtaWQtbGF5ZXIgd2lsbAogCSAqIGNvbnRpbnVlIHRvIHRyeSB0byBjb21tdW5pY2F0ZSB0byB0aGUgTFVOIGFuZCBldm50dWFsbHkgY3JlYXRlIGEgZHVtbXkgTFVOLgpAQCAtMzE5NCw4ICszMjAwLDggQEAKIAkJLyogR2V0IGEgTUYgZm9yIHRoaXMgY29tbWFuZC4KIAkJICovCiAJCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShpb2MtPkRvbmVDdHgsIGlvYykpID09IE5VTEwpIHsKLQkJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIndyaXRlIFNEUDE6IG5vIG1zZyBmcmFtZXMhXG4iLAotCQkJCQkJaW9jLT5uYW1lKSk7CisJCQlkZmFpbHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAid3JpdGUgU0RQMTogbm8gbXNnIGZyYW1lcyFcbiIsCisJCQkJaW9jLT5uYW1lKSk7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCkBAIC0zMjg5LDcgKzMyOTUsNyBAQAogCS8qIEdldCBhIE1GIGZvciB0aGlzIGNvbW1hbmQuCiAJICovCiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKGlvYy0+RG9uZUN0eCwgaW9jKSkgPT0gTlVMTCkgewotCQlkcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJ3cml0ZUlPQ1BhZ2U0IDogbm8gbXNnIGZyYW1lcyFcbiIsCisJCWRmYWlscHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJ3cml0ZUlPQ1BhZ2U0IDogbm8gbXNnIGZyYW1lcyFcbiIsCiAJCQkJCWlvYy0+bmFtZSkpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC0zNDQ3LDcgKzM0NTMsNyBAQAogCQkJCSAqIHNvbWUgdHlwZSBvZiBlcnJvciBvY2N1cnJlZC4KIAkJCQkgKi8KIAkJCQlNcGlSYWlkQWN0aW9uUmVwbHlfdAkqcHIgPSAoTXBpUmFpZEFjdGlvblJlcGx5X3QgKiltcjsKLQkJCQlpZiAocHItPkFjdGlvblN0YXR1cyA9PSBNUElfUkFJRF9BQ1RJT05fQVNUQVRVU19TVUNDRVNTKQorCQkJCWlmIChsZTE2X3RvX2NwdShwci0+QWN0aW9uU3RhdHVzKSA9PSBNUElfUkFJRF9BQ1RJT05fQVNUQVRVU19TVUNDRVNTKQogCQkJCQljb21wbGV0aW9uQ29kZSA9IE1QVF9TQ0FORFZfR09PRDsKIAkJCQllbHNlCiAJCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9TT01FX0VSUk9SOwpAQCAtMzk1NSw3ICszOTYxLDcgQEAKIAkJCQloZWFkZXIxLlBhZ2VMZW5ndGggPSBpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGg7CiAJCQkJaGVhZGVyMS5QYWdlTnVtYmVyID0gMTsKIAkJCQloZWFkZXIxLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX0RFVklDRTsKLQkJCQljZmcuaGRyID0gJmhlYWRlcjE7CisJCQkJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyMTsKIAkJCQljZmcucGh5c0FkZHIgPSBjZmcxX2RtYV9hZGRyOwogCQkJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1dSSVRFX0NVUlJFTlQ7CiAJCQkJY2ZnLmRpciA9IDE7CkBAIC0zOTk2LDkgKzQwMDIsOSBAQAogCQkJZG5lZ29wcmludGsoKCJzeW5jcm9uaXplIGNhY2hlOiBpZD0lZCB3aWR0aD0wIGZhY3Rvcj1NUFRfQVNZTkMgIgogCQkJCSJvZmZzZXQ9MCBuZWdvRmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCiAJCQkJaWQsIGZsYWdzLCByZXF1ZXN0ZWQsIGNvbmZpZ3VyYXRpb24pKTsKLQkJCXBjZmcxRGF0YS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGxlMzJfdG9fY3B1KHJlcXVlc3RlZCk7CisJCQlwY2ZnMURhdGEtPlJlcXVlc3RlZFBhcmFtZXRlcnMgPSBjcHVfdG9fbGUzMihyZXF1ZXN0ZWQpOwogCQkJcGNmZzFEYXRhLT5SZXNlcnZlZCA9IDA7Ci0JCQlwY2ZnMURhdGEtPkNvbmZpZ3VyYXRpb24gPSBsZTMyX3RvX2NwdShjb25maWd1cmF0aW9uKTsKKwkJCXBjZmcxRGF0YS0+Q29uZmlndXJhdGlvbiA9IGNwdV90b19sZTMyKGNvbmZpZ3VyYXRpb24pOwogCQkJY2ZnLnBhZ2VBZGRyID0gKGJ1czw8OCkgfCBpZDsKIAkJCW1wdF9jb25maWcoaGQtPmlvYywgJmNmZyk7CiAJCX0KQEAgLTQzNTMsNyArNDM1OSw3IEBACiAJLyogUHJlcCBjZmcgc3RydWN0dXJlCiAJICovCiAJY2ZnLnBhZ2VBZGRyID0gKGJ1czw8OCkgfCBpZDsKLQljZmcuaGRyID0gTlVMTDsKKwljZmcuY2ZnaGRyLmhkciA9IE5VTEw7CiAKIAkvKiBQcmVwIFNEUDAgaGVhZGVyCiAJICovCkBAIC00Mzk5LDcgKzQ0MDUsNyBAQAogCXBjZmcxRGF0YSA9IChTQ1NJRGV2aWNlUGFnZTFfdCAqKSAocER2QnVmICsgc3opOwogCWNmZzFfZG1hX2FkZHIgPSBkdmJ1Zl9kbWEgKyBzejsKIAotCS8qIFNraXAgdGhpcyBJRD8gU2V0IGNmZy5oZHIgdG8gZm9yY2UgY29uZmlnIHBhZ2Ugd3JpdGUKKwkvKiBTa2lwIHRoaXMgSUQ/IFNldCBjZmcuY2ZnaGRyLmhkciB0byBmb3JjZSBjb25maWcgcGFnZSB3cml0ZQogCSAqLwogCXsKIAkJU2NzaUNmZ0RhdGEgKnBzcGlfZGF0YSA9ICZoZC0+aW9jLT5zcGlfZGF0YTsKQEAgLTQ0MTcsNyArNDQyMyw3IEBACiAKIAkJCQlkdi5jbWQgPSBNUFRfU0VUX01BWDsKIAkJCQltcHRzY3NpaF9kdl9wYXJtcyhoZCwgJmR2LCAodm9pZCAqKXBjZmcxRGF0YSk7Ci0JCQkJY2ZnLmhkciA9ICZoZWFkZXIxOworCQkJCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjE7CiAKIAkJCQkvKiBTYXZlIHRoZSBmaW5hbCBuZWdvdGlhdGVkIHNldHRpbmdzIHRvCiAJCQkJICogU0NTSSBkZXZpY2UgcGFnZSAxLgpAQCAtNDQ4Myw3ICs0NDg5LDcgQEAKIAkJZHYuY21kID0gTVBUX1NFVF9NSU47CiAJCW1wdHNjc2loX2R2X3Bhcm1zKGhkLCAmZHYsICh2b2lkICopcGNmZzFEYXRhKTsKIAotCQljZmcuaGRyID0gJmhlYWRlcjE7CisJCWNmZy5jZmdoZHIuaGRyID0gJmhlYWRlcjE7CiAJCWNmZy5waHlzQWRkciA9IGNmZzFfZG1hX2FkZHI7CiAJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1dSSVRFX0NVUlJFTlQ7CiAJCWNmZy5kaXIgPSAxOwpAQCAtNDU5Niw4ICs0NjAyLDggQEAKIAkJCQlpZiAoKHBidWYxWzU2XSAmIDB4MDIpID09IDApIHsKIAkJCQkJcFRhcmdldC0+bmVnb0ZsYWdzIHw9IE1QVF9UQVJHRVRfTk9fTkVHT19RQVM7CiAJCQkJCWhkLT5pb2MtPnNwaV9kYXRhLm5vUWFzID0gTVBUX1RBUkdFVF9OT19ORUdPX1FBUzsKLQkJCQkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UIAotCQkJCQkgICAgIkRWOiBTdGFydCBCYXNpYyBub1FhcyBvbiBpZD0lZCBkdWUgdG8gcGJ1ZjFbNTZdPSV4XG4iLCAKKwkJCQkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UCisJCQkJCSAgICAiRFY6IFN0YXJ0IEJhc2ljIG5vUWFzIG9uIGlkPSVkIGR1ZSB0byBwYnVmMVs1Nl09JXhcbiIsCiAJCQkJCSAgICBpb2MtPm5hbWUsIGlkLCBwYnVmMVs1Nl0pKTsKIAkJCQl9CiAJCQl9CkBAIC00NjM3LDcgKzQ2NDMsNyBAQAogCQkJCQl1MzIgc2RwMF9pbmZvOwogCQkJCQl1MzIgc2RwMF9uZWdvOwogCi0JCQkJCWNmZy5oZHIgPSAmaGVhZGVyMDsKKwkJCQkJY2ZnLmNmZ2hkci5oZHIgPSAmaGVhZGVyMDsKIAkJCQkJY2ZnLnBoeXNBZGRyID0gY2ZnMF9kbWFfYWRkcjsKIAkJCQkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOwogCQkJCQljZmcuZGlyID0gMDsKQEAgLTQ2NzMsNyArNDY3OSw3IEBACiAJCQkJCQlpZiAoIWZpcnN0UGFzcykKIAkJCQkJCQlkb0ZhbGxiYWNrID0gMTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVCAKKwkJCQkJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVAogCQkJCQkJICAgICJEVjpJbnF1aXJ5IGNvbXBhcmVkIGlkPSVkLCBjYWxsaW5nIGluaXRUYXJnZXRcbiIsIGlvYy0+bmFtZSwgaWQpKTsKIAkJCQkJCWhkLT5pb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lkXSAmPSB+TVBUX1NDU0lDRkdfRFZfTk9UX0RPTkU7CiAJCQkJCQltcHRzY3NpaF9pbml0VGFyZ2V0KGhkLApAQCAtNDY4OSw4ICs0Njk1LDggQEAKIAogCQkJfSBlbHNlIGlmIChyYyA9PSBNUFRfU0NBTkRWX0lTU1VFX1NFTlNFKQogCQkJCWRvRmFsbGJhY2sgPSAxOwkvKiBzZXQgZmFsbGJhY2sgZmxhZyAqLwotCQkJZWxzZSBpZiAoKHJjID09IE1QVF9TQ0FORFZfRElEX1JFU0VUKSB8fCAKLQkJCQkgKHJjID09IE1QVF9TQ0FORFZfU0VOU0UpIHx8IAorCQkJZWxzZSBpZiAoKHJjID09IE1QVF9TQ0FORFZfRElEX1JFU0VUKSB8fAorCQkJCSAocmMgPT0gTVBUX1NDQU5EVl9TRU5TRSkgfHwKIAkJCQkgKHJjID09IE1QVF9TQ0FORFZfRkFMTEJBQ0spKQogCQkJCWRvRmFsbGJhY2sgPSAxOwkvKiBzZXQgZmFsbGJhY2sgZmxhZyAqLwogCQkJZWxzZQpAQCAtNDcyMiw3ICs0NzI4LDcgQEAKIAkgKiA0KSByZWxlYXNlCiAJICogNSkgdXBkYXRlIG5lZ28gcGFybXMgdG8gdGFyZ2V0IHN0cnVjdAogCSAqLwotCWNmZy5oZHIgPSAmaGVhZGVyMTsKKwljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXIxOwogCWNmZy5waHlzQWRkciA9IGNmZzFfZG1hX2FkZHI7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVDsKIAljZmcuZGlyID0gMTsKQEAgLTUxMjEsMTIgKzUxMjcsMTIgQEAKIAogCS8qIFNldCBpZiBjZmcxX2RtYV9hZGRyIGNvbnRlbnRzIGlzIHZhbGlkCiAJICovCi0JaWYgKChjZmcuaGRyICE9IE5VTEwpICYmIChyZXRjb2RlID09IDApKXsKKwlpZiAoKGNmZy5jZmdoZHIuaGRyICE9IE5VTEwpICYmIChyZXRjb2RlID09IDApKXsKIAkJLyogSWYgZGlzaywgbm90IFUzMjAsIGRpc2FibGUgUUFTCiAJCSAqLwogCQlpZiAoKGlucTAgPT0gMCkgJiYgKGR2Lm5vdy5mYWN0b3IgPiBNUFRfVUxUUkEzMjApKSB7CiAJCQloZC0+aW9jLT5zcGlfZGF0YS5ub1FhcyA9IE1QVF9UQVJHRVRfTk9fTkVHT19RQVM7Ci0JCQlkZHZwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQgCisJCQlkZHZwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQKIAkJCSAgICAibm9RYXMgc2V0IGR1ZSB0byBpZD0lZCBoYXMgZmFjdG9yPSV4XG4iLCBpb2MtPm5hbWUsIGlkLCBkdi5ub3cuZmFjdG9yKSk7CiAJCX0KIApAQCAtNTEzNyw3ICs1MTQzLDcgQEAKIAkJICogc2tpcCBzYXZlIG9mIHRoZSBmaW5hbCBuZWdvdGlhdGVkIHNldHRpbmdzIHRvCiAJCSAqIFNDU0kgZGV2aWNlIHBhZ2UgMS4KIAkJICoKLQkJY2ZnLmhkciA9ICZoZWFkZXIxOworCQljZmcuY2ZnaGRyLmhkciA9ICZoZWFkZXIxOwogCQljZmcucGh5c0FkZHIgPSBjZmcxX2RtYV9hZGRyOwogCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9XUklURV9DVVJSRU5UOwogCQljZmcuZGlyID0gMTsKQEAgLTUyNDgsNyArNTI1NCw3IEBACiAJCS8qIFVwZGF0ZSB0bWF4IHZhbHVlcyB3aXRoIHRob3NlIGZyb20gRGV2aWNlIFBhZ2UgMC4qLwogCQlwUGFnZTAgPSAoU0NTSURldmljZVBhZ2UwX3QgKikgcFBhZ2U7CiAJCWlmIChwUGFnZTApIHsKLQkJCXZhbCA9IGNwdV90b19sZTMyKHBQYWdlMC0+TmVnb3RpYXRlZFBhcmFtZXRlcnMpOworCQkJdmFsID0gbGUzMl90b19jcHUocFBhZ2UwLT5OZWdvdGlhdGVkUGFyYW1ldGVycyk7CiAJCQlkdi0+bWF4LndpZHRoID0gdmFsICYgTVBJX1NDU0lERVZQQUdFMF9OUF9XSURFID8gMSA6IDA7CiAJCQlkdi0+bWF4Lm9mZnNldCA9ICh2YWwmTVBJX1NDU0lERVZQQUdFMF9OUF9ORUdfU1lOQ19PRkZTRVRfTUFTSykgPj4gMTY7CiAJCQlkdi0+bWF4LmZhY3RvciA9ICh2YWwmTVBJX1NDU0lERVZQQUdFMF9OUF9ORUdfU1lOQ19QRVJJT0RfTUFTSykgPj4gODsKQEAgLTUyNzYsMTIgKzUyODIsMTIgQEAKIAkJCQlkdi0+bm93Lm9mZnNldCwgJnZhbCwgJmNvbmZpZ3VyYXRpb24sIGR2LT5ub3cuZmxhZ3MpOwogCQkJZG5lZ29wcmludGsoKCJTZXR0aW5nIE1heDogaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCBuZWdvRmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCiAJCQkJaWQsIGR2LT5ub3cud2lkdGgsIGR2LT5ub3cuZmFjdG9yLCBkdi0+bm93Lm9mZnNldCwgZHYtPm5vdy5mbGFncywgdmFsLCBjb25maWd1cmF0aW9uKSk7Ci0JCQlwUGFnZTEtPlJlcXVlc3RlZFBhcmFtZXRlcnMgPSBsZTMyX3RvX2NwdSh2YWwpOworCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gY3B1X3RvX2xlMzIodmFsKTsKIAkJCXBQYWdlMS0+UmVzZXJ2ZWQgPSAwOwotCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gbGUzMl90b19jcHUoY29uZmlndXJhdGlvbik7CisJCQlwUGFnZTEtPkNvbmZpZ3VyYXRpb24gPSBjcHVfdG9fbGUzMihjb25maWd1cmF0aW9uKTsKIAkJfQogCi0JCWRkdnByaW50aygoImlkPSVkIHdpZHRoPSVkIGZhY3Rvcj0leCBvZmZzZXQ9JXggZmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWd1cmF0aW9uPSV4XG4iLAorCQlkZHZwcmludGsoKCJpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IG5lZ29GbGFncz0leCByZXF1ZXN0PSV4IGNvbmZpZ3VyYXRpb249JXhcbiIsCiAJCQkJaWQsIGR2LT5ub3cud2lkdGgsIGR2LT5ub3cuZmFjdG9yLCBkdi0+bm93Lm9mZnNldCwgZHYtPm5vdy5mbGFncywgdmFsLCBjb25maWd1cmF0aW9uKSk7CiAJCWJyZWFrOwogCkBAIC01MzAxLDkgKzUzMDcsOSBAQAogCQkJCW9mZnNldCwgJnZhbCwgJmNvbmZpZ3VyYXRpb24sIG5lZ29GbGFncyk7CiAJCQlkbmVnb3ByaW50aygoIlNldHRpbmcgTWluOiBpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IG5lZ29GbGFncz0leCByZXF1ZXN0PSV4IGNvbmZpZz0leFxuIiwKIAkJCQlpZCwgd2lkdGgsIGZhY3Rvciwgb2Zmc2V0LCBuZWdvRmxhZ3MsIHZhbCwgY29uZmlndXJhdGlvbikpOwotCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gbGUzMl90b19jcHUodmFsKTsKKwkJCXBQYWdlMS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGNwdV90b19sZTMyKHZhbCk7CiAJCQlwUGFnZTEtPlJlc2VydmVkID0gMDsKLQkJCXBQYWdlMS0+Q29uZmlndXJhdGlvbiA9IGxlMzJfdG9fY3B1KGNvbmZpZ3VyYXRpb24pOworCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gY3B1X3RvX2xlMzIoY29uZmlndXJhdGlvbik7CiAJCX0KIAkJZGR2cHJpbnRrKCgiaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCByZXF1ZXN0PSV4IGNvbmZpZz0leCBuZWdvRmxhZ3M9JXhcbiIsCiAJCQkJaWQsIHdpZHRoLCBmYWN0b3IsIG9mZnNldCwgdmFsLCBjb25maWd1cmF0aW9uLCBuZWdvRmxhZ3MpKTsKQEAgLTUzNzcsMTIgKzUzODMsMTIgQEAKIAkJaWYgKHBQYWdlMSkgewogCQkJbXB0c2NzaWhfc2V0RGV2aWNlUGFnZTFGbGFncyAod2lkdGgsIGZhY3Rvciwgb2Zmc2V0LCAmdmFsLAogCQkJCQkJJmNvbmZpZ3VyYXRpb24sIGR2LT5ub3cuZmxhZ3MpOwotCQkJZG5lZ29wcmludGsoKCJGaW5pc2g6IGlkPSVkIHdpZHRoPSVkIG9mZnNldD0lZCBmYWN0b3I9JXggZmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCisJCQlkbmVnb3ByaW50aygoIkZpbmlzaDogaWQ9JWQgd2lkdGg9JWQgb2Zmc2V0PSVkIGZhY3Rvcj0leCBuZWdvRmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCiAJCQkgICAgIGlkLCB3aWR0aCwgb2Zmc2V0LCBmYWN0b3IsIGR2LT5ub3cuZmxhZ3MsIHZhbCwgY29uZmlndXJhdGlvbikpOwogCi0JCQlwUGFnZTEtPlJlcXVlc3RlZFBhcmFtZXRlcnMgPSBsZTMyX3RvX2NwdSh2YWwpOworCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gY3B1X3RvX2xlMzIodmFsKTsKIAkJCXBQYWdlMS0+UmVzZXJ2ZWQgPSAwOwotCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gbGUzMl90b19jcHUoY29uZmlndXJhdGlvbik7CisJCQlwUGFnZTEtPkNvbmZpZ3VyYXRpb24gPSBjcHVfdG9fbGUzMihjb25maWd1cmF0aW9uKTsKIAkJfQogCiAJCWRkdnByaW50aygoIkZpbmlzaDogaWQ9JWQgb2Zmc2V0PSVkIGZhY3Rvcj0leCB3aWR0aD0lZCByZXF1ZXN0PSV4IGNvbmZpZz0leFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCmluZGV4IGRmYTg4MDYuLjU4N2QxMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwpAQCAtMTYyLDE1ICsxNjIsMTUgQEAKIAl1OAkJCSptZW07CiAJaW50CQkJZXJyb3I9MDsKIAlpbnQJCQlyOwotCQorCiAJaWYgKChyID0gbXB0X2F0dGFjaChwZGV2LGlkKSkgIT0gMCkKIAkJcmV0dXJuIHI7Ci0JCisKIAlpb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW9jLT5Eb25lQ3R4ID0gbXB0c3BpRG9uZUN0eDsKIAlpb2MtPlRhc2tDdHggPSBtcHRzcGlUYXNrQ3R4OwogCWlvYy0+SW50ZXJuYWxDdHggPSBtcHRzcGlJbnRlcm5hbEN0eDsKLQkKKwogCS8qICBBZGRlZCBzYW5pdHkgY2hlY2sgb24gcmVhZGluZXNzIG9mIHRoZSBNUFQgYWRhcHRlci4KIAkgKi8KIAlpZiAoaW9jLT5sYXN0X3N0YXRlICE9IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IDE1ODhhNTkuLjU1MGYyOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtMTMsNCArMTMsMTMgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwCiAJc2VsZWN0IE1DUAogCisjIENoaXAgZHJpdmVycworY29uZmlnIE1DUF9VQ0IxMjAwCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFVDQjEyMDAgLyBVQ0IxMzAwIgorCWRlcGVuZHMgb24gTUNQCisKK2NvbmZpZyBNQ1BfVUNCMTIwMF9UUworCXRyaXN0YXRlICJUb3VjaHNjcmVlbiBpbnRlcmZhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1DUF9VQ0IxMjAwICYmIElOUFVUCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxlIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKaW5kZXggOThiZGQ2YS4uYWRiMjliNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKQEAgLTQsMyArNCw5IEBACiAKIG9iai0kKENPTkZJR19NQ1ApCQkrPSBtY3AtY29yZS5vCiBvYmotJChDT05GSUdfTUNQX1NBMTFYMCkJKz0gbWNwLXNhMTF4MC5vCitvYmotJChDT05GSUdfTUNQX1VDQjEyMDApCSs9IHVjYjF4MDAtY29yZS5vCitvYmotJChDT05GSUdfTUNQX1VDQjEyMDBfVFMpCSs9IHVjYjF4MDAtdHMubworCitpZmVxICgkKENPTkZJR19TQTExMDBfQVNTQUJFVCkseSkKK29iai0kKENPTkZJR19NQ1BfVUNCMTIwMCkJKz0gdWNiMXgwMC1hc3NhYmV0Lm8KK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLWFzc2FiZXQuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtYXNzYWJldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjVmYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWFzc2FiZXQuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbWZkL3VjYjF4MDAtYXNzYWJldC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJ1c3NlbGwgS2luZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFdlIGhhbmRsZSB0aGUgbWFjaGluZS1zcGVjaWZpYyBiaXRzIG9mIHRoZSBVQ0IxeDAwIGRyaXZlciBoZXJlLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAidWNiMXgwMC5oIgorCisjZGVmaW5lIFVDQjFYMDBfQVRUUihuYW1lLGlucHV0KVwKK3N0YXRpYyBzc2l6ZV90IG5hbWUjI19zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQlcCisJc3RydWN0IHVjYjF4MDAgKnVjYiA9IGNsYXNzZGV2X3RvX3VjYjF4MDAoZGV2KTsJCVwKKwlpbnQgdmFsOwkJCQkJCVwKKwl1Y2IxeDAwX2FkY19lbmFibGUodWNiKTsJCQkJXAorCXZhbCA9IHVjYjF4MDBfYWRjX3JlYWQodWNiLCBpbnB1dCwgVUNCX05PU1lOQyk7CQlcCisJdWNiMXgwMF9hZGNfZGlzYWJsZSh1Y2IpOwkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsMDQ0NCxuYW1lIyNfc2hvdyxOVUxMKQorCitVQ0IxWDAwX0FUVFIodmJhdHQsIFVDQl9BRENfSU5QX0FEMSk7CitVQ0IxWDAwX0FUVFIodmNoYXJnZXIsIFVDQl9BRENfSU5QX0FEMCk7CitVQ0IxWDAwX0FUVFIoYmF0dF90ZW1wLCBVQ0JfQURDX0lOUF9BRDIpOworCitzdGF0aWMgaW50IHVjYjF4MDBfYXNzYWJldF9hZGQoc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYpCit7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPnVjYi0+Y2RldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZiYXR0KTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+dWNiLT5jZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmNoYXJnZXIpOworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmZGV2LT51Y2ItPmNkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9iYXR0X3RlbXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1Y2IxeDAwX2Fzc2FiZXRfcmVtb3ZlKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQoreworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2LT51Y2ItPmNkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9iYXR0X3RlbXApOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2LT51Y2ItPmNkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92Y2hhcmdlcik7CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPnVjYi0+Y2RldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZiYXR0KTsKK30KKworc3RhdGljIHN0cnVjdCB1Y2IxeDAwX2RyaXZlciB1Y2IxeDAwX2Fzc2FiZXRfZHJpdmVyID0geworCS5hZGQJPSB1Y2IxeDAwX2Fzc2FiZXRfYWRkLAorCS5yZW1vdmUJPSB1Y2IxeDAwX2Fzc2FiZXRfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdWNiMXgwMF9hc3NhYmV0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdWNiMXgwMF9yZWdpc3Rlcl9kcml2ZXIoJnVjYjF4MDBfYXNzYWJldF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdWNiMXgwMF9hc3NhYmV0X2V4aXQodm9pZCkKK3sKKwl1Y2IxeDAwX3VucmVnaXN0ZXJfZHJpdmVyKCZ1Y2IxeDAwX2Fzc2FiZXRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodWNiMXgwMF9hc3NhYmV0X2luaXQpOworbW9kdWxlX2V4aXQodWNiMXgwMF9hc3NhYmV0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBc3NhYmV0IG5vZGR5IHRlc3Rpbmcgb25seSBleGFtcGxlIEFEQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jIGIvZHJpdmVycy9tZmQvdWNiMXgwMC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmNmNlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCkBAIC0wLDAgKzEsNjY1IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGUgVUNCMXgwMCBjb3JlIGRyaXZlciBwcm92aWRlcyBiYXNpYyBzZXJ2aWNlcyBmb3IgaGFuZGxpbmcgSU8sCisgKiAgdGhlIEFEQywgaW50ZXJydXB0cywgYW5kIGFjY2Vzc2luZyByZWdpc3RlcnMuICBJdCBpcyBkZXNpZ25lZAorICogIHN1Y2ggdGhhdCBldmVyeXRoaW5nIGdvZXMgdGhyb3VnaCB0aGlzIGxheWVyLCB0aGVyZWJ5IHByb3ZpZGluZworICogIGEgY29uc2lzdGVudCBsb2NraW5nIG1ldGhvZG9sb2d5LCBhcyB3ZWxsIGFzIGFsbG93aW5nIHRoZSBkcml2ZXJzCisgKiAgdG8gYmUgdXNlZCBvbiBvdGhlciBub24tTUNQLWVuYWJsZWQgaGFyZHdhcmUgcGxhdGZvcm1zLgorICoKKyAqICBOb3RlIHRoYXQgYWxsIGxvY2tzIGFyZSBwcml2YXRlIHRvIHRoaXMgZmlsZS4gIE5vdGhpbmcgZWxzZSBtYXkKKyAqICB0b3VjaCB0aGVtLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInVjYjF4MDAuaCIKKworc3RhdGljIERFQ0xBUkVfTVVURVgodWNiMXgwMF9zZW0pOworc3RhdGljIExJU1RfSEVBRCh1Y2IxeDAwX2RyaXZlcnMpOworc3RhdGljIExJU1RfSEVBRCh1Y2IxeDAwX2RldmljZXMpOworCisvKioKKyAqCXVjYjF4MDBfaW9fc2V0X2RpciAtIHNldCBJTyBkaXJlY3Rpb24KKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQGluOiAgYml0ZmllbGQgb2YgSU8gcGlucyB0byBiZSBzZXQgYXMgaW5wdXRzCisgKglAb3V0OiBiaXRmaWVsZCBvZiBJTyBwaW5zIHRvIGJlIHNldCBhcyBvdXRwdXRzCisgKgorICoJU2V0IHRoZSBJTyBkaXJlY3Rpb24gb2YgdGhlIHRlbiBnZW5lcmFsIHB1cnBvc2UgSU8gcGlucyBvbgorICoJdGhlIFVDQjF4MDAgY2hpcC4gIFRoZSBAaW4gYml0ZmllbGQgaGFzIHByaW9yaXR5IG92ZXIgdGhlCisgKglAb3V0IGJpdGZpZWxkLCBpbiB0aGF0IGlmIHlvdSBzcGVjaWZ5IGEgcGluIGFzIGJvdGggaW5wdXQKKyAqCWFuZCBvdXRwdXQsIGl0IHdpbGwgZW5kIHVwIGFzIGFuIGlucHV0LgorICoKKyAqCXVjYjF4MDBfZW5hYmxlIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCB0byBlbmFibGUgdGhlIGNvbW1zCisgKgliZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc3BpbmxvY2ssIGRpc2FibGluZyBpbnRlcnJ1cHRzLgorICovCit2b2lkIHVjYjF4MDBfaW9fc2V0X2RpcihzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgaW4sIHVuc2lnbmVkIGludCBvdXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1Y2ItPmlvX2xvY2ssIGZsYWdzKTsKKwl1Y2ItPmlvX2RpciB8PSBvdXQ7CisJdWNiLT5pb19kaXIgJj0gfmluOworCisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSU9fRElSLCB1Y2ItPmlvX2Rpcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWNiLT5pb19sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9pb193cml0ZSAtIHNldCBvciBjbGVhciBJTyBvdXRwdXRzCisgKglAdWNiOiAgIFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQHNldDogICBiaXRmaWVsZCBvZiBJTyBwaW5zIHRvIHNldCB0byBsb2dpYyAnMScKKyAqCUBjbGVhcjogYml0ZmllbGQgb2YgSU8gcGlucyB0byBzZXQgdG8gbG9naWMgJzAnCisgKgorICoJU2V0IHRoZSBJTyBvdXRwdXQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBJTyBwaW5zLiAgVGhlIHZhbHVlCisgKglpcyByZXRhaW5lZCBpZiB0aGUgcGlucyBhcmUgc3Vic2VxdWVudGx5IGNvbmZpZ3VyZWQgYXMgaW5wdXRzLgorICoJVGhlIEBjbGVhciBiaXRmaWVsZCBoYXMgcHJpb3JpdHkgb3ZlciB0aGUgQHNldCBiaXRmaWVsZCAtCisgKglvdXRwdXRzIHdpbGwgYmUgY2xlYXJlZC4KKyAqCisgKgl1Y2IxeDAwX2VuYWJsZSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgdG8gZW5hYmxlIHRoZSBjb21tcworICoJYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICoJVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNwaW5sb2NrLCBkaXNhYmxpbmcgaW50ZXJydXB0cy4KKyAqLwordm9pZCB1Y2IxeDAwX2lvX3dyaXRlKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVjYi0+aW9fbG9jaywgZmxhZ3MpOworCXVjYi0+aW9fb3V0IHw9IHNldDsKKwl1Y2ItPmlvX291dCAmPSB+Y2xlYXI7CisKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JT19EQVRBLCB1Y2ItPmlvX291dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWNiLT5pb19sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9pb19yZWFkIC0gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgSU8gcGlucworICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKgorICoJUmV0dXJuIGEgYml0ZmllbGQgZGVzY3JpYmluZyB0aGUgbG9naWMgc3RhdGUgb2YgdGhlIHRlbgorICoJZ2VuZXJhbCBwdXJwb3NlIElPIHBpbnMuCisgKgorICoJdWNiMXgwMF9lbmFibGUgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIHRvIGVuYWJsZSB0aGUgY29tbXMKKyAqCWJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSBhbnkgc2VtYXBob3JlcyBvciBzcGlubG9ja3MuCisgKi8KK3Vuc2lnbmVkIGludCB1Y2IxeDAwX2lvX3JlYWQoc3RydWN0IHVjYjF4MDAgKnVjYikKK3sKKwlyZXR1cm4gdWNiMXgwMF9yZWdfcmVhZCh1Y2IsIFVDQl9JT19EQVRBKTsKK30KKworLyoKKyAqIFVDQjEzMDAgZGF0YSBzaGVldCBzYXlzIHdlIG11c3Q6CisgKiAgMS4gZW5hYmxlIEFEQwk9PiA1dXMgKGluY2x1ZGluZyByZWZlcmVuY2Ugc3RhcnR1cCB0aW1lKQorICogIDIuIHNlbGVjdCBpbnB1dAk9PiA1MSp0c2liY2xrICA9PiA0LjN1cworICogIDMuIHN0YXJ0IGNvbnZlcnNpb24JPT4gMTAyKnRzaWJjbGsgPT4gOC41dXMKKyAqICh0c2liY2xrID0gMS8xMTk4MTAwMCkKKyAqIFBlcmlvZCBiZXR3ZWVuIFNJQiAxMjgtYml0IGZyYW1lcyA9IDEwLjd1cworICovCisKKy8qKgorICoJdWNiMXgwMF9hZGNfZW5hYmxlIC0gZW5hYmxlIHRoZSBBREMgY29udmVydGVyCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCisgKglFbmFibGUgdGhlIHVjYjF4MDAgYW5kIEFEQyBjb252ZXJ0ZXIgb24gdGhlIFVDQjF4MDAgZm9yIHVzZS4KKyAqCUFueSBjb2RlIHdpc2hpbmcgdG8gdXNlIHRoZSBBREMgY29udmVydGVyIG11c3QgY2FsbCB0aGlzCisgKglmdW5jdGlvbiBwcmlvciB0byB1c2luZyBpdC4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBBREMgc2VtYXBob3JlIHRvIHByZXZlbnQgdHdvIG9yIG1vcmUKKyAqCWNvbmN1cnJlbnQgdXNlcywgYW5kIHRoZXJlZm9yZSBtYXkgc2xlZXAuICBBcyBhIHJlc3VsdCwgaXQKKyAqCWNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCwgbm90IGludGVycnVwdAorICoJY29udGV4dC4KKyAqCisgKglZb3Ugc2hvdWxkIHJlbGVhc2UgdGhlIEFEQyBhcyBzb29uIGFzIHBvc3NpYmxlIHVzaW5nCisgKgl1Y2IxeDAwX2FkY19kaXNhYmxlLgorICovCit2b2lkIHVjYjF4MDBfYWRjX2VuYWJsZShzdHJ1Y3QgdWNiMXgwMCAqdWNiKQoreworCWRvd24oJnVjYi0+YWRjX3NlbSk7CisKKwl1Y2ItPmFkY19jciB8PSBVQ0JfQURDX0VOQTsKKworCXVjYjF4MDBfZW5hYmxlKHVjYik7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCB1Y2ItPmFkY19jcik7Cit9CisKKy8qKgorICoJdWNiMXgwMF9hZGNfcmVhZCAtIHJlYWQgdGhlIHNwZWNpZmllZCBBREMgY2hhbm5lbAorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKglAYWRjX2NoYW5uZWw6IEFEQyBjaGFubmVsIG1hc2sKKyAqCUBzeW5jOiB3YWl0IGZvciBzeW5jcm9uaXNhdGlvbiBwdWxzZS4KKyAqCisgKglTdGFydCBhbiBBREMgY29udmVyc2lvbiBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdC4gIE5vdGUgdGhhdAorICoJc3luY2hyb25pc2VkIEFEQyBjb252ZXJzaW9ucyAodmlhIHRoZSBBRENTWU5DIHBpbikgbXVzdCB3YWl0CisgKgl1bnRpbCB0aGUgdHJpZ2dlciBpcyBhc3NlcnRlZCBhbmQgdGhlIGNvbnZlcnNpb24gaXMgZmluaXNoZWQuCisgKgorICoJVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgc3BpbnMgd2FpdGluZyBmb3IgdGhlIGNvbnZlcnNpb24gdG8KKyAqCWNvbXBsZXRlICgyIGZyYW1lcyBtYXggd2l0aG91dCBzeW5jKS4KKyAqCisgKglJZiBjYWxsZWQgZm9yIGEgc3luY2hyb25pc2VkIEFEQyBjb252ZXJzaW9uLCBpdCBtYXkgc2xlZXAKKyAqCXdpdGggdGhlIEFEQyBzZW1hcGhvcmUgaGVsZC4KKyAqLwordW5zaWduZWQgaW50IHVjYjF4MDBfYWRjX3JlYWQoc3RydWN0IHVjYjF4MDAgKnVjYiwgaW50IGFkY19jaGFubmVsLCBpbnQgc3luYykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKHN5bmMpCisJCWFkY19jaGFubmVsIHw9IFVDQl9BRENfU1lOQ19FTkE7CisKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIHVjYi0+YWRjX2NyIHwgYWRjX2NoYW5uZWwpOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgdWNiLT5hZGNfY3IgfCBhZGNfY2hhbm5lbCB8IFVDQl9BRENfU1RBUlQpOworCisJZm9yICg7OykgeworCQl2YWwgPSB1Y2IxeDAwX3JlZ19yZWFkKHVjYiwgVUNCX0FEQ19EQVRBKTsKKwkJaWYgKHZhbCAmIFVDQl9BRENfREFUX1ZBTCkKKwkJCWJyZWFrOworCQkvKiB5aWVsZCB0byBvdGhlciBwcm9jZXNzZXMgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlyZXR1cm4gVUNCX0FEQ19EQVQodmFsKTsKK30KKworLyoqCisgKgl1Y2IxeDAwX2FkY19kaXNhYmxlIC0gZGlzYWJsZSB0aGUgQURDIGNvbnZlcnRlcgorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKgorICoJRGlzYWJsZSB0aGUgQURDIGNvbnZlcnRlciBhbmQgcmVsZWFzZSB0aGUgQURDIHNlbWFwaG9yZS4KKyAqLwordm9pZCB1Y2IxeDAwX2FkY19kaXNhYmxlKHN0cnVjdCB1Y2IxeDAwICp1Y2IpCit7CisJdWNiLT5hZGNfY3IgJj0gflVDQl9BRENfRU5BOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgdWNiLT5hZGNfY3IpOworCXVjYjF4MDBfZGlzYWJsZSh1Y2IpOworCisJdXAoJnVjYi0+YWRjX3NlbSk7Cit9CisKKy8qCisgKiBVQ0IxeDAwIEludGVycnVwdCBoYW5kbGluZy4KKyAqCisgKiBUaGUgVUNCMXgwMCBjYW4gZ2VuZXJhdGUgaW50ZXJydXB0cyB3aGVuIHRoZSBTSUJDTEsgaXMgc3RvcHBlZC4KKyAqIFNpbmNlIHdlIG5lZWQgdG8gcmVhZCBhbiBpbnRlcm5hbCByZWdpc3Rlciwgd2UgbXVzdCByZS1lbmFibGUKKyAqIFNJQkNMSyB0byB0YWxrIHRvIHRoZSBjaGlwLiAgV2UgbGVhdmUgdGhlIGNsb2NrIHJ1bm5pbmcgdW50aWwKKyAqIHdlIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZyBhbGwgaW50ZXJydXB0cyBmcm9tIHRoZSBjaGlwLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdWNiMXgwMF9pcnEoaW50IGlycW5yLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVjYjF4MDAgKnVjYiA9IGRldmlkOworCXN0cnVjdCB1Y2IxeDAwX2lycSAqaXJxOworCXVuc2lnbmVkIGludCBpc3IsIGk7CisKKwl1Y2IxeDAwX2VuYWJsZSh1Y2IpOworCWlzciA9IHVjYjF4MDBfcmVnX3JlYWQodWNiLCBVQ0JfSUVfU1RBVFVTKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9DTEVBUiwgaXNyKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9DTEVBUiwgMCk7CisKKwlmb3IgKGkgPSAwLCBpcnEgPSB1Y2ItPmlycV9oYW5kbGVyOyBpIDwgMTYgJiYgaXNyOyBpKyssIGlzciA+Pj0gMSwgaXJxKyspCisJCWlmIChpc3IgJiAxICYmIGlycS0+Zm4pCisJCQlpcnEtPmZuKGksIGlycS0+ZGV2aWQpOworCXVjYjF4MDBfZGlzYWJsZSh1Y2IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqCXVjYjF4MDBfaG9va19pcnEgLSBob29rIGEgVUNCMXgwMCBpbnRlcnJ1cHQKKyAqCUB1Y2I6ICAgVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKglAaWR4OiAgIGludGVycnVwdCBpbmRleAorICoJQGZuOiAgICBmdW5jdGlvbiB0byBjYWxsIHdoZW4gaW50ZXJydXB0IGlzIHRyaWdnZXJlZAorICoJQGRldmlkOiBkZXZpY2UgaWQgdG8gcGFzcyB0byBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqCUhvb2sgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQuICBZb3UgY2FuIG9ubHkgcmVnaXN0ZXIgb25lIGhhbmRsZXIKKyAqCWZvciBlYWNoIGludGVycnVwdCBzb3VyY2UuICBUaGUgaW50ZXJydXB0IHNvdXJjZSBpcyBub3QgZW5hYmxlZAorICoJYnkgdGhpcyBmdW5jdGlvbjsgdXNlIHVjYjF4MDBfZW5hYmxlX2lycSBpbnN0ZWFkLgorICoKKyAqCUludGVycnVwdCBoYW5kbGVycyB3aWxsIGJlIGNhbGxlZCB3aXRoIG90aGVyIGludGVycnVwdHMgZW5hYmxlZC4KKyAqCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzOgorICoJIC1FSU5WQUwgaWYgdGhlIGludGVycnVwdCBpbmRleCBpcyBpbnZhbGlkCisgKgkgLUVCVVNZIGlmIHRoZSBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgYmVlbiBob29rZWQKKyAqLworaW50IHVjYjF4MDBfaG9va19pcnEoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGlkeCwgdm9pZCAoKmZuKShpbnQsIHZvaWQgKiksIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCB1Y2IxeDAwX2lycSAqaXJxOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGlkeCA8IDE2KSB7CisJCWlycSA9IHVjYi0+aXJxX2hhbmRsZXIgKyBpZHg7CisJCXJldCA9IC1FQlVTWTsKKworCQlzcGluX2xvY2tfaXJxKCZ1Y2ItPmxvY2spOworCQlpZiAoaXJxLT5mbiA9PSBOVUxMKSB7CisJCQlpcnEtPmRldmlkID0gZGV2aWQ7CisJCQlpcnEtPmZuID0gZm47CisJCQlyZXQgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmdWNiLT5sb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl1Y2IxeDAwX2VuYWJsZV9pcnEgLSBlbmFibGUgYW4gVUNCMXgwMCBpbnRlcnJ1cHQgc291cmNlCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBpZHg6IGludGVycnVwdCBpbmRleAorICoJQGVkZ2VzOiBpbnRlcnJ1cHQgZWRnZXMgdG8gZW5hYmxlCisgKgorICoJRW5hYmxlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRvIHRyaWdnZXIgb24gJVVDQl9SSVNJTkcsCisgKgklVUNCX0ZBTExJTkcgb3IgYm90aCBlZGdlcy4gIFRoZSBpbnRlcnJ1cHQgc2hvdWxkIGhhdmUgYmVlbgorICoJaG9va2VkIGJ5IHVjYjF4MDBfaG9va19pcnEuCisgKi8KK3ZvaWQgdWNiMXgwMF9lbmFibGVfaXJxKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBpZHgsIGludCBlZGdlcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGlkeCA8IDE2KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ1Y2ItPmxvY2ssIGZsYWdzKTsKKworCQl1Y2IxeDAwX2VuYWJsZSh1Y2IpOworCQlpZiAoZWRnZXMgJiBVQ0JfUklTSU5HKSB7CisJCQl1Y2ItPmlycV9yaXNfZW5ibCB8PSAxIDw8IGlkeDsKKwkJCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX1JJUywgdWNiLT5pcnFfcmlzX2VuYmwpOworCQl9CisJCWlmIChlZGdlcyAmIFVDQl9GQUxMSU5HKSB7CisJCQl1Y2ItPmlycV9mYWxfZW5ibCB8PSAxIDw8IGlkeDsKKwkJCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0ZBTCwgdWNiLT5pcnFfZmFsX2VuYmwpOworCQl9CisJCXVjYjF4MDBfZGlzYWJsZSh1Y2IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1Y2ItPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qKgorICoJdWNiMXgwMF9kaXNhYmxlX2lycSAtIGRpc2FibGUgYW4gVUNCMXgwMCBpbnRlcnJ1cHQgc291cmNlCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBlZGdlczogaW50ZXJydXB0IGVkZ2VzIHRvIGRpc2FibGUKKyAqCisgKglEaXNhYmxlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRyaWdnZXJpbmcgb24gdGhlIHNwZWNpZmllZAorICoJKCVVQ0JfUklTSU5HLCAlVUNCX0ZBTExJTkcgb3IgYm90aCkgZWRnZXMuCisgKi8KK3ZvaWQgdWNiMXgwMF9kaXNhYmxlX2lycShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgaWR4LCBpbnQgZWRnZXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpZHggPCAxNikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdWNiLT5sb2NrLCBmbGFncyk7CisKKwkJdWNiMXgwMF9lbmFibGUodWNiKTsKKwkJaWYgKGVkZ2VzICYgVUNCX1JJU0lORykgeworCQkJdWNiLT5pcnFfcmlzX2VuYmwgJj0gfigxIDw8IGlkeCk7CisJCQl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9SSVMsIHVjYi0+aXJxX3Jpc19lbmJsKTsKKwkJfQorCQlpZiAoZWRnZXMgJiBVQ0JfRkFMTElORykgeworCQkJdWNiLT5pcnFfZmFsX2VuYmwgJj0gfigxIDw8IGlkeCk7CisJCQl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIHVjYi0+aXJxX2ZhbF9lbmJsKTsKKwkJfQorCQl1Y2IxeDAwX2Rpc2FibGUodWNiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWNiLT5sb2NrLCBmbGFncyk7CisJfQorfQorCisvKioKKyAqCXVjYjF4MDBfZnJlZV9pcnEgLSBkaXNhYmxlIGFuZCBmcmVlIHRoZSBzcGVjaWZpZWQgVUNCMXgwMCBpbnRlcnJ1cHQKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQGlkeDogaW50ZXJydXB0IGluZGV4CisgKglAZGV2aWQ6IGRldmljZSBpZC4KKyAqCisgKglEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlIGFuZCByZW1vdmUgdGhlIGhhbmRsZXIuICBkZXZpZCBtdXN0CisgKgltYXRjaCB0aGUgZGV2aWQgcGFzc2VkIHdoZW4gaG9va2luZyB0aGUgaW50ZXJydXB0LgorICoKKyAqCVJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnM6CisgKgkgLUVJTlZBTCBpZiB0aGUgaW50ZXJydXB0IGluZGV4IGlzIGludmFsaWQKKyAqCSAtRU5PRU5UIGlmIGRldmlkIGRvZXMgbm90IG1hdGNoCisgKi8KK2ludCB1Y2IxeDAwX2ZyZWVfaXJxKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBpZHgsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCB1Y2IxeDAwX2lycSAqaXJxOworCWludCByZXQ7CisKKwlpZiAoaWR4ID49IDE2KQorCQlnb3RvIGJhZDsKKworCWlycSA9IHVjYi0+aXJxX2hhbmRsZXIgKyBpZHg7CisJcmV0ID0gLUVOT0VOVDsKKworCXNwaW5fbG9ja19pcnEoJnVjYi0+bG9jayk7CisJaWYgKGlycS0+ZGV2aWQgPT0gZGV2aWQpIHsKKwkJdWNiLT5pcnFfcmlzX2VuYmwgJj0gfigxIDw8IGlkeCk7CisJCXVjYi0+aXJxX2ZhbF9lbmJsICY9IH4oMSA8PCBpZHgpOworCisJCXVjYjF4MDBfZW5hYmxlKHVjYik7CisJCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX1JJUywgdWNiLT5pcnFfcmlzX2VuYmwpOworCQl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIHVjYi0+aXJxX2ZhbF9lbmJsKTsKKwkJdWNiMXgwMF9kaXNhYmxlKHVjYik7CisKKwkJaXJxLT5mbiA9IE5VTEw7CisJCWlycS0+ZGV2aWQgPSBOVUxMOworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJnVjYi0+bG9jayk7CisJcmV0dXJuIHJldDsKKworYmFkOgorCXByaW50ayhLRVJOX0VSUiAiRnJlZWluZyBiYWQgVUNCMXgwMCBpcnEgJWRcbiIsIGlkeCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdWNiMXgwMF9hZGRfZGV2KHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHN0cnVjdCB1Y2IxeDAwX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2OworCWludCByZXQgPSAtRU5PTUVNOworCisJZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVjYjF4MDBfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldikgeworCQlkZXYtPnVjYiA9IHVjYjsKKwkJZGV2LT5kcnYgPSBkcnY7CisKKwkJcmV0ID0gZHJ2LT5hZGQoZGV2KTsKKworCQlpZiAocmV0ID09IDApIHsKKwkJCWxpc3RfYWRkKCZkZXYtPmRldl9ub2RlLCAmdWNiLT5kZXZzKTsKKwkJCWxpc3RfYWRkKCZkZXYtPmRydl9ub2RlLCAmZHJ2LT5kZXZzKTsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKGRldik7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdWNiMXgwMF9yZW1vdmVfZGV2KHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQoreworCWRldi0+ZHJ2LT5yZW1vdmUoZGV2KTsKKwlsaXN0X2RlbCgmZGV2LT5kZXZfbm9kZSk7CisJbGlzdF9kZWwoJmRldi0+ZHJ2X25vZGUpOworCWtmcmVlKGRldik7Cit9CisKKy8qCisgKiBUcnkgdG8gcHJvYmUgb3VyIGludGVycnVwdCwgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBsb3RzIG9mCisgKiBoYXJkLWNvZGVkIG1hY2hpbmUgZGVwZW5kZW5jaWVzLiAgRm9yIHJlZmVyZW5jZSwgdGhlIGV4cGVjdGVkCisgKiBJUlEgbWFwcGluZ3MgYXJlOgorICoKKyAqICAJTWFjaGluZQkJRGVmYXVsdCBJUlEKKyAqCWFkc2JpdHN5CUlSUV9HUENJTjQKKyAqCWNlcmYJCUlSUV9HUElPX1VDQjEyMDBfSVJRCisgKglmbGV4YW5ldAlJUlFfR1BJT19HVUkKKyAqCWZyZWViaXJkCUlSUV9HUElPX0ZSRUVCSVJEX1VDQjEzMDBfSVJRCisgKglncmFwaGljc2NsaWVudAlBRFNfRVhUX0lSUSg4KQorICoJZ3JhcGhpY3NtYXN0ZXIJQURTX0VYVF9JUlEoOCkKKyAqCWxhcnQJCUxBUlRfSVJRX1VDQjEyMDAKKyAqCW9tbmltZXRlcglJUlFfR1BJTzIzCisgKglwZnMxNjgJCUlSUV9HUElPX1VDQjEzMDBfSVJRCisgKglzaW1wYWQJCUlSUV9HUElPX1VDQjEzMDBfSVJRCisgKglzaGFubm9uCQlTSEFOTk9OX0lSUV9HUElPX0lSUV9DT0RFQworICoJeW9weQkJSVJRX0dQSU9fVUNCMTIwMF9JUlEKKyAqLworc3RhdGljIGludCB1Y2IxeDAwX2RldGVjdF9pcnEoc3RydWN0IHVjYjF4MDAgKnVjYikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwltYXNrID0gcHJvYmVfaXJxX29uKCk7CisJaWYgKCFtYXNrKQorCQlyZXR1cm4gTk9fSVJROworCisJLyoKKwkgKiBFbmFibGUgdGhlIEFEQyBpbnRlcnJ1cHQuCisJICovCisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfUklTLCBVQ0JfSUVfQURDKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIFVDQl9JRV9BREMpOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAweGZmZmYpOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAwKTsKKworCS8qCisJICogQ2F1c2UgYW4gQURDIGludGVycnVwdC4KKwkgKi8KKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BIHwgVUNCX0FEQ19TVEFSVCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBjb252ZXJzaW9uIHRvIGNvbXBsZXRlLgorCSAqLworCXdoaWxlICgodWNiMXgwMF9yZWdfcmVhZCh1Y2IsIFVDQl9BRENfREFUQSkgJiBVQ0JfQURDX0RBVF9WQUwpID09IDApOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgMCk7CisKKwkvKgorCSAqIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdC4KKwkgKi8KKwl1Y2IxeDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9SSVMsIDApOworCXVjYjF4MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0ZBTCwgMCk7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDB4ZmZmZik7CisJdWNiMXgwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDApOworCisJLyoKKwkgKiBSZWFkIHRyaWdnZXJlZCBpbnRlcnJ1cHQuCisJICovCisJcmV0dXJuIHByb2JlX2lycV9vZmYobWFzayk7Cit9CisKK3N0YXRpYyBpbnQgdWNiMXgwMF9wcm9iZShzdHJ1Y3QgbWNwICptY3ApCit7CisJc3RydWN0IHVjYjF4MDAgKnVjYjsKKwlzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgKmRydjsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwltY3BfZW5hYmxlKG1jcCk7CisJaWQgPSBtY3BfcmVnX3JlYWQobWNwLCBVQ0JfSUQpOworCisJaWYgKGlkICE9IFVDQl9JRF8xMjAwICYmIGlkICE9IFVDQl9JRF8xMzAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVDQjF4MDAgSUQgbm90IGZvdW5kOiAlMDR4XG4iLCBpZCk7CisJCWdvdG8gZXJyX2Rpc2FibGU7CisJfQorCisJdWNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVjYjF4MDApLCBHRlBfS0VSTkVMKTsKKwlyZXQgPSAtRU5PTUVNOworCWlmICghdWNiKQorCQlnb3RvIGVycl9kaXNhYmxlOworCisJbWVtc2V0KHVjYiwgMCwgc2l6ZW9mKHN0cnVjdCB1Y2IxeDAwKSk7CisKKwl1Y2ItPmNkZXYuY2xhc3MgPSAmdWNiMXgwMF9jbGFzczsKKwl1Y2ItPmNkZXYuZGV2ID0gJm1jcC0+YXR0YWNoZWRfZGV2aWNlOworCXN0cmxjcHkodWNiLT5jZGV2LmNsYXNzX2lkLCAidWNiMXgwMCIsIHNpemVvZih1Y2ItPmNkZXYuY2xhc3NfaWQpKTsKKworCXNwaW5fbG9ja19pbml0KCZ1Y2ItPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZ1Y2ItPmlvX2xvY2spOworCXNlbWFfaW5pdCgmdWNiLT5hZGNfc2VtLCAxKTsKKworCXVjYi0+aWQgID0gaWQ7CisJdWNiLT5tY3AgPSBtY3A7CisJdWNiLT5pcnEgPSB1Y2IxeDAwX2RldGVjdF9pcnEodWNiKTsKKwlpZiAodWNiLT5pcnEgPT0gTk9fSVJRKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVUNCMXgwMDogSVJRIHByb2JlIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEodWNiLT5pcnEsIHVjYjF4MDBfaXJxLCAwLCAiVUNCMXgwMCIsIHVjYik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInVjYjF4MDA6IHVuYWJsZSB0byBncmFiIGlycSVkOiAlZFxuIiwKKwkJCXVjYi0+aXJxLCByZXQpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXNldF9pcnFfdHlwZSh1Y2ItPmlycSwgSVJRVF9SSVNJTkcpOworCW1jcF9zZXRfZHJ2ZGF0YShtY3AsIHVjYik7CisKKwlyZXQgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJnVjYi0+Y2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaXJxOworCisJSU5JVF9MSVNUX0hFQUQoJnVjYi0+ZGV2cyk7CisJZG93bigmdWNiMXgwMF9zZW0pOworCWxpc3RfYWRkKCZ1Y2ItPm5vZGUsICZ1Y2IxeDAwX2RldmljZXMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJ2LCAmdWNiMXgwMF9kcml2ZXJzLCBub2RlKSB7CisJCXVjYjF4MDBfYWRkX2Rldih1Y2IsIGRydik7CisJfQorCXVwKCZ1Y2IxeDAwX3NlbSk7CisJZ290byBvdXQ7CisKKyBlcnJfaXJxOgorCWZyZWVfaXJxKHVjYi0+aXJxLCB1Y2IpOworIGVycl9mcmVlOgorCWtmcmVlKHVjYik7CisgZXJyX2Rpc2FibGU6CisJbWNwX2Rpc2FibGUobWNwKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdWNiMXgwMF9yZW1vdmUoc3RydWN0IG1jcCAqbWNwKQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBtY3BfZ2V0X2RydmRhdGEobWNwKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKworCWRvd24oJnVjYjF4MDBfc2VtKTsKKwlsaXN0X2RlbCgmdWNiLT5ub2RlKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbiwgJnVjYi0+ZGV2cykgeworCQlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldiA9IGxpc3RfZW50cnkobCwgc3RydWN0IHVjYjF4MDBfZGV2LCBkZXZfbm9kZSk7CisJCXVjYjF4MDBfcmVtb3ZlX2RldihkZXYpOworCX0KKwl1cCgmdWNiMXgwMF9zZW0pOworCisJZnJlZV9pcnEodWNiLT5pcnEsIHVjYik7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnVjYi0+Y2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHVjYjF4MDBfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVjYjF4MDAgKnVjYiA9IGNsYXNzZGV2X3RvX3VjYjF4MDAoZGV2KTsKKwlrZnJlZSh1Y2IpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHVjYjF4MDBfY2xhc3MgPSB7CisJLm5hbWUJCT0gInVjYjF4MDAiLAorCS5yZWxlYXNlCT0gdWNiMXgwMF9yZWxlYXNlLAorfTsKKworaW50IHVjYjF4MDBfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1Y2IxeDAwX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2I7CisKKwlJTklUX0xJU1RfSEVBRCgmZHJ2LT5kZXZzKTsKKwlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbGlzdF9hZGQoJmRydi0+bm9kZSwgJnVjYjF4MDBfZHJpdmVycyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1Y2IsICZ1Y2IxeDAwX2RldmljZXMsIG5vZGUpIHsKKwkJdWNiMXgwMF9hZGRfZGV2KHVjYiwgZHJ2KTsKKwl9CisJdXAoJnVjYjF4MDBfc2VtKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB1Y2IxeDAwX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1Y2IxeDAwX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm4sICpsOworCisJZG93bigmdWNiMXgwMF9zZW0pOworCWxpc3RfZGVsKCZkcnYtPm5vZGUpOworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmZHJ2LT5kZXZzKSB7CisJCXN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2ID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgdWNiMXgwMF9kZXYsIGRydl9ub2RlKTsKKwkJdWNiMXgwMF9yZW1vdmVfZGV2KGRldik7CisJfQorCXVwKCZ1Y2IxeDAwX3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgdWNiMXgwMF9zdXNwZW5kKHN0cnVjdCBtY3AgKm1jcCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBtY3BfZ2V0X2RydmRhdGEobWNwKTsKKwlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldjsKKworCWRvd24oJnVjYjF4MDBfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnVjYi0+ZGV2cywgZGV2X25vZGUpIHsKKwkJaWYgKGRldi0+ZHJ2LT5zdXNwZW5kKQorCQkJZGV2LT5kcnYtPnN1c3BlbmQoZGV2LCBzdGF0ZSk7CisJfQorCXVwKCZ1Y2IxeDAwX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWNiMXgwMF9yZXN1bWUoc3RydWN0IG1jcCAqbWNwKQoreworCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBtY3BfZ2V0X2RydmRhdGEobWNwKTsKKwlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldjsKKworCWRvd24oJnVjYjF4MDBfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnVjYi0+ZGV2cywgZGV2X25vZGUpIHsKKwkJaWYgKGRldi0+ZHJ2LT5yZXN1bWUpCisJCQlkZXYtPmRydi0+cmVzdW1lKGRldik7CisJfQorCXVwKCZ1Y2IxeDAwX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWNwX2RyaXZlciB1Y2IxeDAwX2RyaXZlciA9IHsKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAidWNiMXgwMCIsCisJfSwKKwkucHJvYmUJCT0gdWNiMXgwMF9wcm9iZSwKKwkucmVtb3ZlCQk9IHVjYjF4MDBfcmVtb3ZlLAorCS5zdXNwZW5kCT0gdWNiMXgwMF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdWNiMXgwMF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1Y2IxeDAwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gY2xhc3NfcmVnaXN0ZXIoJnVjYjF4MDBfY2xhc3MpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBtY3BfZHJpdmVyX3JlZ2lzdGVyKCZ1Y2IxeDAwX2RyaXZlcik7CisJCWlmIChyZXQpCisJCQljbGFzc191bnJlZ2lzdGVyKCZ1Y2IxeDAwX2NsYXNzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVjYjF4MDBfZXhpdCh2b2lkKQoreworCW1jcF9kcml2ZXJfdW5yZWdpc3RlcigmdWNiMXgwMF9kcml2ZXIpOworCWNsYXNzX3VucmVnaXN0ZXIoJnVjYjF4MDBfY2xhc3MpOworfQorCittb2R1bGVfaW5pdCh1Y2IxeDAwX2luaXQpOworbW9kdWxlX2V4aXQodWNiMXgwMF9leGl0KTsKKworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2NsYXNzKTsKKworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2lvX3NldF9kaXIpOworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2lvX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9pb19yZWFkKTsKKworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2FkY19lbmFibGUpOworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2FkY19yZWFkKTsKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9hZGNfZGlzYWJsZSk7CisKK0VYUE9SVF9TWU1CT0wodWNiMXgwMF9ob29rX2lycSk7CitFWFBPUlRfU1lNQk9MKHVjYjF4MDBfZnJlZV9pcnEpOworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2VuYWJsZV9pcnEpOworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX2Rpc2FibGVfaXJxKTsKKworRVhQT1JUX1NZTUJPTCh1Y2IxeDAwX3JlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKHVjYjF4MDBfdW5yZWdpc3Rlcl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVQ0IxeDAwIGNvcmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqICBUb3VjaHNjcmVlbiBkcml2ZXIgZm9yIFVDQjF4MDAtYmFzZWQgdG91Y2hzY3JlZW5zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFBhdmVsIE1hY2hlaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogMjEtSmFuLTIwMDIgPGpjb0BpY3QuZXM+IDoKKyAqCisgKiBBZGRlZCBzdXBwb3J0IGZvciBzeW5jaHJvbm91cyBBL0QgbW9kZS4gVGhpcyBtb2RlIGlzIHVzZWZ1bCB0bworICogYXZvaWQgbm9pc2UgaW5kdWNlZCBpbiB0aGUgdG91Y2hwYW5lbCBieSB0aGUgTENELCBwcm92aWRlZCB0aGF0CisgKiB0aGUgVUNCMXgwMCBoYXMgYSB2YWxpZCBMQ0Qgc3luYyBzaWduYWwgcm91dGVkIHRvIGl0cyBBRENTWU5DIHBpbi4KKyAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIHNpZ25hbCBjb25uZWN0ZWQgdG8gdGhlIEFEQ1NZTkMKKyAqIHBpbiBzaG91bGQgcHJvdmlkZSBwdWxzZXMgZXZlbiB3aGVuIHRoZSBMQ0QgaXMgYmxhbmtlZCwgb3RoZXJ3aXNlCisgKiBhIHBlbiB0b3VjaCBuZWVkZWQgdG8gdW5ibGFuayB0aGUgTENEIHdpbGwgbmV2ZXIgYmUgcmVhZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgInVjYjF4MDAuaCIKKworCitzdHJ1Y3QgdWNiMXgwMF90cyB7CisJc3RydWN0IGlucHV0X2RldglpZGV2OworCXN0cnVjdCB1Y2IxeDAwCQkqdWNiOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJaXJxX3dhaXQ7CisJc3RydWN0IHRhc2tfc3RydWN0CSpydGFzazsKKwl1MTYJCQl4X3JlczsKKwl1MTYJCQl5X3JlczsKKworCWludAkJCXJlc3RhcnQ6MTsKKwlpbnQJCQlhZGNzeW5jOjE7Cit9OworCitzdGF0aWMgaW50IGFkY3N5bmM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxeDAwX3RzX2V2dF9hZGQoc3RydWN0IHVjYjF4MDBfdHMgKnRzLCB1MTYgcHJlc3N1cmUsIHUxNiB4LCB1MTYgeSkKK3sKKwlpbnB1dF9yZXBvcnRfYWJzKCZ0cy0+aWRldiwgQUJTX1gsIHgpOworCWlucHV0X3JlcG9ydF9hYnMoJnRzLT5pZGV2LCBBQlNfWSwgeSk7CisJaW5wdXRfcmVwb3J0X2FicygmdHMtPmlkZXYsIEFCU19QUkVTU1VSRSwgcHJlc3N1cmUpOworCWlucHV0X3N5bmMoJnRzLT5pZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjF4MDBfdHNfZXZlbnRfcmVsZWFzZShzdHJ1Y3QgdWNiMXgwMF90cyAqdHMpCit7CisJaW5wdXRfcmVwb3J0X2FicygmdHMtPmlkZXYsIEFCU19QUkVTU1VSRSwgMCk7CisJaW5wdXRfc3luYygmdHMtPmlkZXYpOworfQorCisvKgorICogU3dpdGNoIHRvIGludGVycnVwdCBtb2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF90c19tb2RlX2ludChzdHJ1Y3QgdWNiMXgwMF90cyAqdHMpCit7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVhfUE9XIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX0dORCB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9JTlQpOworfQorCisvKgorICogU3dpdGNoIHRvIHByZXNzdXJlIG1vZGUsIGFuZCByZWFkIHByZXNzdXJlLiAgV2UgZG9uJ3QgbmVlZCB0byB3YWl0CisgKiBoZXJlLCBzaW5jZSBib3RoIHBsYXRlcyBhcmUgYmVpbmcgZHJpdmVuLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxeDAwX3RzX3JlYWRfcHJlc3N1cmUoc3RydWN0IHVjYjF4MDBfdHMgKnRzKQoreworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01YX1BPVyB8IFVDQl9UU19DUl9UU1BYX1BPVyB8CisJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9HTkQgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisKKwlyZXR1cm4gdWNiMXgwMF9hZGNfcmVhZCh0cy0+dWNiLCBVQ0JfQURDX0lOUF9UU1BZLCB0cy0+YWRjc3luYyk7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gWCBwb3NpdGlvbiBtb2RlIGFuZCBtZWFzdXJlIFkgcGxhdGUuICBXZSBzd2l0Y2ggdGhlIHBsYXRlCisgKiBjb25maWd1cmF0aW9uIGluIHByZXNzdXJlIG1vZGUsIHRoZW4gc3dpdGNoIHRvIHBvc2l0aW9uIG1vZGUuICBUaGlzCisgKiBnaXZlcyBhIGZhc3RlciByZXNwb25zZSB0aW1lLiAgRXZlbiBzbywgd2UgbmVlZCB0byB3YWl0IGFib3V0IDU1dXMKKyAqIGZvciB0aGluZ3MgdG8gc3RhYmlsaXNlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxeDAwX3RzX3JlYWRfeHBvcyhzdHJ1Y3QgdWNiMXgwMF90cyAqdHMpCit7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVhfR05EIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01YX0dORCB8IFVDQl9UU19DUl9UU1BYX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh0cy0+dWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUE9TIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKworCXVkZWxheSg1NSk7CisKKwlyZXR1cm4gdWNiMXgwMF9hZGNfcmVhZCh0cy0+dWNiLCBVQ0JfQURDX0lOUF9UU1BZLCB0cy0+YWRjc3luYyk7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gWSBwb3NpdGlvbiBtb2RlIGFuZCBtZWFzdXJlIFggcGxhdGUuICBXZSBzd2l0Y2ggdGhlIHBsYXRlCisgKiBjb25maWd1cmF0aW9uIGluIHByZXNzdXJlIG1vZGUsIHRoZW4gc3dpdGNoIHRvIHBvc2l0aW9uIG1vZGUuICBUaGlzCisgKiBnaXZlcyBhIGZhc3RlciByZXNwb25zZSB0aW1lLiAgRXZlbiBzbywgd2UgbmVlZCB0byB3YWl0IGFib3V0IDU1dXMKKyAqIGZvciB0aGluZ3MgdG8gc3RhYmlsaXNlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxeDAwX3RzX3JlYWRfeXBvcyhzdHJ1Y3QgdWNiMXgwMF90cyAqdHMpCit7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCXVjYjF4MDBfcmVnX3dyaXRlKHRzLT51Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwl1Y2IxeDAwX3JlZ193cml0ZSh0cy0+dWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUE9TIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKworCXVkZWxheSg1NSk7CisKKwlyZXR1cm4gdWNiMXgwMF9hZGNfcmVhZCh0cy0+dWNiLCBVQ0JfQURDX0lOUF9UU1BYLCB0cy0+YWRjc3luYyk7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gWCBwbGF0ZSByZXNpc3RhbmNlIG1vZGUuICBTZXQgTVggdG8gZ3JvdW5kLCBQWCB0bworICogc3VwcGx5LiAgTWVhc3VyZSBjdXJyZW50LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxeDAwX3RzX3JlYWRfeHJlcyhzdHJ1Y3QgdWNiMXgwMF90cyAqdHMpCit7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVhfR05EIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCXJldHVybiB1Y2IxeDAwX2FkY19yZWFkKHRzLT51Y2IsIDAsIHRzLT5hZGNzeW5jKTsKK30KKworLyoKKyAqIFN3aXRjaCB0byBZIHBsYXRlIHJlc2lzdGFuY2UgbW9kZS4gIFNldCBNWSB0byBncm91bmQsIFBZIHRvCisgKiBzdXBwbHkuICBNZWFzdXJlIGN1cnJlbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjF4MDBfdHNfcmVhZF95cmVzKHN0cnVjdCB1Y2IxeDAwX3RzICp0cykKK3sKKwl1Y2IxeDAwX3JlZ193cml0ZSh0cy0+dWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisJcmV0dXJuIHVjYjF4MDBfYWRjX3JlYWQodHMtPnVjYiwgMCwgdHMtPmFkY3N5bmMpOworfQorCisvKgorICogVGhpcyBpcyBhIFJUIGtlcm5lbCB0aHJlYWQgdGhhdCBoYW5kbGVzIHRoZSBBREMgYWNjZXNzZXMKKyAqIChtYWlubHkgc28gd2UgY2FuIHVzZSBzZW1hcGhvcmVzIGluIHRoZSBVQ0IxMjAwIGNvcmUgY29kZQorICogdG8gc2VyaWFsaXNlIGFjY2Vzc2VzIHRvIHRoZSBBREMpLgorICovCitzdGF0aWMgaW50IHVjYjF4MDBfdGhyZWFkKHZvaWQgKl90cykKK3sKKwlzdHJ1Y3QgdWNiMXgwMF90cyAqdHMgPSBfdHM7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJaW50IHZhbGlkOworCisJLyoKKwkgKiBXZSBjb3VsZCBydW4gYXMgYSByZWFsLXRpbWUgdGhyZWFkLiAgSG93ZXZlciwgdGh1cyBmYXIKKwkgKiB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkuCisJICovCisvLwl0c2stPnBvbGljeSA9IFNDSEVEX0ZJRk87CisvLwl0c2stPnJ0X3ByaW9yaXR5ID0gMTsKKworCXZhbGlkID0gMDsKKworCWFkZF93YWl0X3F1ZXVlKCZ0cy0+aXJxX3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQl1bnNpZ25lZCBpbnQgeCwgeSwgcCwgdmFsOworCQlzaWduZWQgbG9uZyB0aW1lb3V0OworCisJCXRzLT5yZXN0YXJ0ID0gMDsKKworCQl1Y2IxeDAwX2FkY19lbmFibGUodHMtPnVjYik7CisKKwkJeCA9IHVjYjF4MDBfdHNfcmVhZF94cG9zKHRzKTsKKwkJeSA9IHVjYjF4MDBfdHNfcmVhZF95cG9zKHRzKTsKKwkJcCA9IHVjYjF4MDBfdHNfcmVhZF9wcmVzc3VyZSh0cyk7CisKKwkJLyoKKwkJICogU3dpdGNoIGJhY2sgdG8gaW50ZXJydXB0IG1vZGUuCisJCSAqLworCQl1Y2IxeDAwX3RzX21vZGVfaW50KHRzKTsKKwkJdWNiMXgwMF9hZGNfZGlzYWJsZSh0cy0+dWNiKTsKKworCQltc2xlZXAoMTApOworCisJCXVjYjF4MDBfZW5hYmxlKHRzLT51Y2IpOworCQl2YWwgPSB1Y2IxeDAwX3JlZ19yZWFkKHRzLT51Y2IsIFVDQl9UU19DUik7CisKKwkJaWYgKHZhbCAmIChVQ0JfVFNfQ1JfVFNQWF9MT1cgfCBVQ0JfVFNfQ1JfVFNNWF9MT1cpKSB7CisJCQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJCXVjYjF4MDBfZW5hYmxlX2lycSh0cy0+dWNiLCBVQ0JfSVJRX1RTUFgsIFVDQl9GQUxMSU5HKTsKKwkJCXVjYjF4MDBfZGlzYWJsZSh0cy0+dWNiKTsKKworCQkJLyoKKwkJCSAqIElmIHdlIHNwYXQgb3V0IGEgdmFsaWQgc2FtcGxlIHNldCBsYXN0IHRpbWUsCisJCQkgKiBzcGl0IG91dCBhICJwZW4gb2ZmIiBzYW1wbGUgaGVyZS4KKwkJCSAqLworCQkJaWYgKHZhbGlkKSB7CisJCQkJdWNiMXgwMF90c19ldmVudF9yZWxlYXNlKHRzKTsKKwkJCQl2YWxpZCA9IDA7CisJCQl9CisKKwkJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJfSBlbHNlIHsKKwkJCXVjYjF4MDBfZGlzYWJsZSh0cy0+dWNiKTsKKworCQkJLyoKKwkJCSAqIEZpbHRlcmluZyBpcyBwb2xpY3kuICBQb2xpY3kgYmVsb25ncyBpbiB1c2VyCisJCQkgKiBzcGFjZS4gIFdlIHRoZXJlZm9yZSBsZWF2ZSBpdCB0byB1c2VyIHNwYWNlCisJCQkgKiB0byBkbyBhbnkgZmlsdGVyaW5nIHRoZXkgcGxlYXNlLgorCQkJICovCisJCQlpZiAoIXRzLT5yZXN0YXJ0KSB7CisJCQkJdWNiMXgwMF90c19ldnRfYWRkKHRzLCBwLCB4LCB5KTsKKwkJCQl2YWxpZCA9IDE7CisJCQl9CisKKwkJCXNldF90YXNrX3N0YXRlKHRzaywgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXRpbWVvdXQgPSBIWiAvIDEwMDsKKwkJfQorCisJCXRyeV90b19mcmVlemUoKTsKKworCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZ0cy0+aXJxX3dhaXQsICZ3YWl0KTsKKworCXRzLT5ydGFzayA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBvbmx5IGRldGVjdCB0b3VjaCBzY3JlZW4gX3RvdWNoZXNfIHdpdGggdGhpcyBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIsIGFuZCBldmVuIHRoZW4gd2UganVzdCBzY2hlZHVsZSBvdXIgdGFzay4KKyAqLworc3RhdGljIHZvaWQgdWNiMXgwMF90c19pcnEoaW50IGlkeCwgdm9pZCAqaWQpCit7CisJc3RydWN0IHVjYjF4MDBfdHMgKnRzID0gaWQ7CisJdWNiMXgwMF9kaXNhYmxlX2lycSh0cy0+dWNiLCBVQ0JfSVJRX1RTUFgsIFVDQl9GQUxMSU5HKTsKKwl3YWtlX3VwKCZ0cy0+aXJxX3dhaXQpOworfQorCitzdGF0aWMgaW50IHVjYjF4MDBfdHNfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCB1Y2IxeDAwX3RzICp0cyA9IChzdHJ1Y3QgdWNiMXgwMF90cyAqKWlkZXY7CisJaW50IHJldCA9IDA7CisKKwlCVUdfT04odHMtPnJ0YXNrKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRzLT5pcnFfd2FpdCk7CisJcmV0ID0gdWNiMXgwMF9ob29rX2lycSh0cy0+dWNiLCBVQ0JfSVJRX1RTUFgsIHVjYjF4MDBfdHNfaXJxLCB0cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB3ZSBkbyB0aGlzIGF0IGFsbCwgd2Ugc2hvdWxkIGFsbG93IHRoZSB1c2VyIHRvCisJICogbWVhc3VyZSBhbmQgcmVhZCB0aGUgWCBhbmQgWSByZXNpc3RhbmNlIGF0IGFueSB0aW1lLgorCSAqLworCXVjYjF4MDBfYWRjX2VuYWJsZSh0cy0+dWNiKTsKKwl0cy0+eF9yZXMgPSB1Y2IxeDAwX3RzX3JlYWRfeHJlcyh0cyk7CisJdHMtPnlfcmVzID0gdWNiMXgwMF90c19yZWFkX3lyZXModHMpOworCXVjYjF4MDBfYWRjX2Rpc2FibGUodHMtPnVjYik7CisKKwl0cy0+cnRhc2sgPSBrdGhyZWFkX3J1bih1Y2IxeDAwX3RocmVhZCwgdHMsICJrdHNkIik7CisJaWYgKCFJU19FUlIodHMtPnJ0YXNrKSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXVjYjF4MDBfZnJlZV9pcnEodHMtPnVjYiwgVUNCX0lSUV9UU1BYLCB0cyk7CisJCXRzLT5ydGFzayA9IE5VTEw7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRvdWNoc2NyZWVuIHJlc291cmNlcy4gIERpc2FibGUgSVJRcy4KKyAqLworc3RhdGljIHZvaWQgdWNiMXgwMF90c19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCB1Y2IxeDAwX3RzICp0cyA9IChzdHJ1Y3QgdWNiMXgwMF90cyAqKWlkZXY7CisKKwlpZiAodHMtPnJ0YXNrKQorCQlrdGhyZWFkX3N0b3AodHMtPnJ0YXNrKTsKKworCXVjYjF4MDBfZW5hYmxlKHRzLT51Y2IpOworCXVjYjF4MDBfZnJlZV9pcnEodHMtPnVjYiwgVUNCX0lSUV9UU1BYLCB0cyk7CisJdWNiMXgwMF9yZWdfd3JpdGUodHMtPnVjYiwgVUNCX1RTX0NSLCAwKTsKKwl1Y2IxeDAwX2Rpc2FibGUodHMtPnVjYik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgdWNiMXgwMF90c19yZXN1bWUoc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYpCit7CisJc3RydWN0IHVjYjF4MDBfdHMgKnRzID0gZGV2LT5wcml2OworCisJaWYgKHRzLT5ydGFzayAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFJlc3RhcnQgdGhlIFRTIHRocmVhZCB0byBlbnN1cmUgdGhlCisJCSAqIFRTIGludGVycnVwdCBtb2RlIGlzIHNldCB1cCBhZ2FpbgorCQkgKiBhZnRlciBzbGVlcC4KKwkJICovCisJCXRzLT5yZXN0YXJ0ID0gMTsKKwkJd2FrZV91cCgmdHMtPmlycV93YWl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB1Y2IxeDAwX3RzX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGlzYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgdWNiMXgwMF90c19hZGQoc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYpCit7CisJc3RydWN0IHVjYjF4MDBfdHMgKnRzOworCisJdHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWNiMXgwMF90cyksIEdGUF9LRVJORUwpOworCWlmICghdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHRzLCAwLCBzaXplb2Yoc3RydWN0IHVjYjF4MDBfdHMpKTsKKworCXRzLT51Y2IgPSBkZXYtPnVjYjsKKwl0cy0+YWRjc3luYyA9IGFkY3N5bmMgPyBVQ0JfU1lOQyA6IFVDQl9OT1NZTkM7CisKKwl0cy0+aWRldi5uYW1lICAgICAgID0gIlRvdWNoc2NyZWVuIHBhbmVsIjsKKwl0cy0+aWRldi5pZC5wcm9kdWN0ID0gdHMtPnVjYi0+aWQ7CisJdHMtPmlkZXYub3BlbiAgICAgICA9IHVjYjF4MDBfdHNfb3BlbjsKKwl0cy0+aWRldi5jbG9zZSAgICAgID0gdWNiMXgwMF90c19jbG9zZTsKKworCV9fc2V0X2JpdChFVl9BQlMsIHRzLT5pZGV2LmV2Yml0KTsKKwlfX3NldF9iaXQoQUJTX1gsIHRzLT5pZGV2LmFic2JpdCk7CisJX19zZXRfYml0KEFCU19ZLCB0cy0+aWRldi5hYnNiaXQpOworCV9fc2V0X2JpdChBQlNfUFJFU1NVUkUsIHRzLT5pZGV2LmFic2JpdCk7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnRzLT5pZGV2KTsKKworCWRldi0+cHJpdiA9IHRzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVjYjF4MDBfdHNfcmVtb3ZlKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQoreworCXN0cnVjdCB1Y2IxeDAwX3RzICp0cyA9IGRldi0+cHJpdjsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmdHMtPmlkZXYpOworCWtmcmVlKHRzKTsKK30KKworc3RhdGljIHN0cnVjdCB1Y2IxeDAwX2RyaXZlciB1Y2IxeDAwX3RzX2RyaXZlciA9IHsKKwkuYWRkCQk9IHVjYjF4MDBfdHNfYWRkLAorCS5yZW1vdmUJCT0gdWNiMXgwMF90c19yZW1vdmUsCisJLnJlc3VtZQkJPSB1Y2IxeDAwX3RzX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVjYjF4MDBfdHNfaW5pdCh2b2lkKQoreworCXJldHVybiB1Y2IxeDAwX3JlZ2lzdGVyX2RyaXZlcigmdWNiMXgwMF90c19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdWNiMXgwMF90c19leGl0KHZvaWQpCit7CisJdWNiMXgwMF91bnJlZ2lzdGVyX2RyaXZlcigmdWNiMXgwMF90c19kcml2ZXIpOworfQorCittb2R1bGVfcGFyYW0oYWRjc3luYywgaW50LCAwNDQ0KTsKK21vZHVsZV9pbml0KHVjYjF4MDBfdHNfaW5pdCk7Cittb2R1bGVfZXhpdCh1Y2IxeDAwX3RzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVQ0IxeDAwIHRvdWNoc2NyZWVuIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC5oIGIvZHJpdmVycy9tZmQvdWNiMXgwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjMyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tZmQvdWNiMXgwMC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIFVDQjEyMDBfSAorI2RlZmluZSBVQ0IxMjAwX0gKKworI2RlZmluZSBVQ0JfSU9fREFUQQkweDAwCisjZGVmaW5lIFVDQl9JT19ESVIJMHgwMQorCisjZGVmaW5lIFVDQl9JT18wCQkoMSA8PCAwKQorI2RlZmluZSBVQ0JfSU9fMQkJKDEgPDwgMSkKKyNkZWZpbmUgVUNCX0lPXzIJCSgxIDw8IDIpCisjZGVmaW5lIFVDQl9JT18zCQkoMSA8PCAzKQorI2RlZmluZSBVQ0JfSU9fNAkJKDEgPDwgNCkKKyNkZWZpbmUgVUNCX0lPXzUJCSgxIDw8IDUpCisjZGVmaW5lIFVDQl9JT182CQkoMSA8PCA2KQorI2RlZmluZSBVQ0JfSU9fNwkJKDEgPDwgNykKKyNkZWZpbmUgVUNCX0lPXzgJCSgxIDw8IDgpCisjZGVmaW5lIFVDQl9JT185CQkoMSA8PCA5KQorCisjZGVmaW5lIFVDQl9JRV9SSVMJMHgwMgorI2RlZmluZSBVQ0JfSUVfRkFMCTB4MDMKKyNkZWZpbmUgVUNCX0lFX1NUQVRVUwkweDA0CisjZGVmaW5lIFVDQl9JRV9DTEVBUgkweDA0CisjZGVmaW5lIFVDQl9JRV9BREMJCSgxIDw8IDExKQorI2RlZmluZSBVQ0JfSUVfVFNQWAkJKDEgPDwgMTIpCisjZGVmaW5lIFVDQl9JRV9UU01YCQkoMSA8PCAxMykKKyNkZWZpbmUgVUNCX0lFX1RDTElQCQkoMSA8PCAxNCkKKyNkZWZpbmUgVUNCX0lFX0FDTElQCQkoMSA8PCAxNSkKKworI2RlZmluZSBVQ0JfSVJRX1RTUFgJCTEyCisKKyNkZWZpbmUgVUNCX1RDX0EJMHgwNQorI2RlZmluZSBVQ0JfVENfQV9MT09QCQkoMSA8PCA3KQkvKiBVQ0IxMjAwICovCisjZGVmaW5lIFVDQl9UQ19BX0FNUEwJCSgxIDw8IDcpCS8qIFVDQjEzMDAgKi8KKworI2RlZmluZSBVQ0JfVENfQgkweDA2CisjZGVmaW5lIFVDQl9UQ19CX1ZPSUNFX0VOQQkoMSA8PCAzKQorI2RlZmluZSBVQ0JfVENfQl9DTElQCQkoMSA8PCA0KQorI2RlZmluZSBVQ0JfVENfQl9BVFQJCSgxIDw8IDYpCisjZGVmaW5lIFVDQl9UQ19CX1NJREVfRU5BCSgxIDw8IDExKQorI2RlZmluZSBVQ0JfVENfQl9NVVRFCQkoMSA8PCAxMykKKyNkZWZpbmUgVUNCX1RDX0JfSU5fRU5BCQkoMSA8PCAxNCkKKyNkZWZpbmUgVUNCX1RDX0JfT1VUX0VOQQkoMSA8PCAxNSkKKworI2RlZmluZSBVQ0JfQUNfQQkweDA3CisjZGVmaW5lIFVDQl9BQ19CCTB4MDgKKyNkZWZpbmUgVUNCX0FDX0JfTE9PUAkJKDEgPDwgOCkKKyNkZWZpbmUgVUNCX0FDX0JfTVVURQkJKDEgPDwgMTMpCisjZGVmaW5lIFVDQl9BQ19CX0lOX0VOQQkJKDEgPDwgMTQpCisjZGVmaW5lIFVDQl9BQ19CX09VVF9FTkEJKDEgPDwgMTUpCisKKyNkZWZpbmUgVUNCX1RTX0NSCTB4MDkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVhfUE9XCSgxIDw8IDApCisjZGVmaW5lIFVDQl9UU19DUl9UU1BYX1BPVwkoMSA8PCAxKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWV9QT1cJKDEgPDwgMikKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFlfUE9XCSgxIDw8IDMpCisjZGVmaW5lIFVDQl9UU19DUl9UU01YX0dORAkoMSA8PCA0KQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWF9HTkQJKDEgPDwgNSkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVlfR05ECSgxIDw8IDYpCisjZGVmaW5lIFVDQl9UU19DUl9UU1BZX0dORAkoMSA8PCA3KQorI2RlZmluZSBVQ0JfVFNfQ1JfTU9ERV9JTlQJKDAgPDwgOCkKKyNkZWZpbmUgVUNCX1RTX0NSX01PREVfUFJFUwkoMSA8PCA4KQorI2RlZmluZSBVQ0JfVFNfQ1JfTU9ERV9QT1MJKDIgPDwgOCkKKyNkZWZpbmUgVUNCX1RTX0NSX0JJQVNfRU5BCSgxIDw8IDExKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWF9MT1cJKDEgPDwgMTIpCisjZGVmaW5lIFVDQl9UU19DUl9UU01YX0xPVwkoMSA8PCAxMykKKworI2RlZmluZSBVQ0JfQURDX0NSCTB4MGEKKyNkZWZpbmUgVUNCX0FEQ19TWU5DX0VOQQkoMSA8PCAwKQorI2RlZmluZSBVQ0JfQURDX1ZSRUZCWVBfQ09OCSgxIDw8IDEpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTUFgJKDAgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfVFNNWAkoMSA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9UU1BZCSgyIDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTTVkJKDMgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQwCQkoNCA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9BRDEJCSg1IDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX0FEMgkJKDYgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQzCQkoNyA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0VYVF9SRUYJCSgxIDw8IDUpCisjZGVmaW5lIFVDQl9BRENfU1RBUlQJCSgxIDw8IDcpCisjZGVmaW5lIFVDQl9BRENfRU5BCQkoMSA8PCAxNSkKKworI2RlZmluZSBVQ0JfQURDX0RBVEEJMHgwYgorI2RlZmluZSBVQ0JfQURDX0RBVF9WQUwJCSgxIDw8IDE1KQorI2RlZmluZSBVQ0JfQURDX0RBVCh4KQkJKCgoeCkgJiAweDdmZTApID4+IDUpCisKKyNkZWZpbmUgVUNCX0lECQkweDBjCisjZGVmaW5lIFVDQl9JRF8xMjAwCQkweDEwMDQKKyNkZWZpbmUgVUNCX0lEXzEzMDAJCTB4MTAwNQorCisjZGVmaW5lIFVDQl9NT0RFCTB4MGQKKyNkZWZpbmUgVUNCX01PREVfRFlOX1ZGTEFHX0VOQQkoMSA8PCAxMikKKyNkZWZpbmUgVUNCX01PREVfQVVEX09GRl9DQU4JKDEgPDwgMTMpCisKKyNpbmNsdWRlICJtY3AuaCIKKworc3RydWN0IHVjYjF4MDBfaXJxIHsKKwl2b2lkICpkZXZpZDsKKwl2b2lkICgqZm4pKGludCwgdm9pZCAqKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgdWNiMXgwMF9jbGFzczsKKworc3RydWN0IHVjYjF4MDAgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IG1jcAkJKm1jcDsKKwl1bnNpZ25lZCBpbnQJCWlycTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCWFkY19zZW07CisJc3BpbmxvY2tfdAkJaW9fbG9jazsKKwl1MTYJCQlpZDsKKwl1MTYJCQlpb19kaXI7CisJdTE2CQkJaW9fb3V0OworCXUxNgkJCWFkY19jcjsKKwl1MTYJCQlpcnFfZmFsX2VuYmw7CisJdTE2CQkJaXJxX3Jpc19lbmJsOworCXN0cnVjdCB1Y2IxeDAwX2lycQlpcnFfaGFuZGxlclsxNl07CisJc3RydWN0IGNsYXNzX2RldmljZQljZGV2OworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWRldnM7Cit9OworCitzdHJ1Y3QgdWNiMXgwMF9kcml2ZXI7CisKK3N0cnVjdCB1Y2IxeDAwX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZAlkZXZfbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWRydl9ub2RlOworCXN0cnVjdCB1Y2IxeDAwCQkqdWNiOworCXN0cnVjdCB1Y2IxeDAwX2RyaXZlcgkqZHJ2OworCXZvaWQJCQkqcHJpdjsKK307CisKK3N0cnVjdCB1Y2IxeDAwX2RyaXZlciB7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJZGV2czsKKwlpbnQJKCphZGQpKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KTsKKwl2b2lkCSgqcmVtb3ZlKShzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldik7CisJaW50CSgqc3VzcGVuZCkoc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50CSgqcmVzdW1lKShzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldik7Cit9OworCisjZGVmaW5lIGNsYXNzZGV2X3RvX3VjYjF4MDAoY2QpCWNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHVjYjF4MDAsIGNkZXYpCisKK2ludCB1Y2IxeDAwX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgKik7Cit2b2lkIHVjYjF4MDBfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVjYjF4MDBfZHJpdmVyICopOworCisvKioKKyAqCXVjYjF4MDBfY2xrcmF0ZSAtIHJldHVybiB0aGUgVUNCMXgwMCBTSUIgY2xvY2sgcmF0ZQorICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKgorICoJUmV0dXJuIHRoZSBTSUIgY2xvY2sgcmF0ZSBpbiBIei4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMXgwMF9jbGtyYXRlKHN0cnVjdCB1Y2IxeDAwICp1Y2IpCit7CisJcmV0dXJuIG1jcF9nZXRfc2Nsa19yYXRlKHVjYi0+bWNwKTsKK30KKworLyoqCisgKgl1Y2IxeDAwX2VuYWJsZSAtIGVuYWJsZSB0aGUgVUNCMXgwMCBTSUIgY2xvY2sKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoKKyAqCUVuYWJsZSB0aGUgU0lCIGNsb2NrLiAgVGhpcyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMXgwMF9lbmFibGUoc3RydWN0IHVjYjF4MDAgKnVjYikKK3sKKwltY3BfZW5hYmxlKHVjYi0+bWNwKTsKK30KKworLyoqCisgKgl1Y2IxeDAwX2Rpc2FibGUgLSBkaXNhYmxlIHRoZSBVQ0IxeDAwIFNJQiBjbG9jaworICoJQHVjYjogVUNCMXgwMCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBjaGlwCisgKgorICoJRGlzYWJsZSB0aGUgU0lCIGNsb2NrLiAgVGhlIFNJQiBjbG9jayB3aWxsIG9ubHkgYmUgZGlzYWJsZWQKKyAqCXdoZW4gdGhlIG51bWJlciBvZiB1Y2IxeDAwX2VuYWJsZSBjYWxscyBtYXRjaCB0aGUgbnVtYmVyIG9mCisgKgl1Y2IxeDAwX2Rpc2FibGUgY2FsbHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxeDAwX2Rpc2FibGUoc3RydWN0IHVjYjF4MDAgKnVjYikKK3sKKwltY3BfZGlzYWJsZSh1Y2ItPm1jcCk7Cit9CisKKy8qKgorICoJdWNiMXgwMF9yZWdfd3JpdGUgLSB3cml0ZSBhIFVDQjF4MDAgcmVnaXN0ZXIKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQHJlZzogVUNCMXgwMCA0LWJpdCByZWdpc3RlciBpbmRleCB0byB3cml0ZQorICoJQHZhbDogVUNCMXgwMCAxNi1iaXQgdmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZSB0aGUgVUNCMXgwMCByZWdpc3RlciBAcmVnIHdpdGggdmFsdWUgQHZhbC4gIFRoZSBTSUIKKyAqCWNsb2NrIG11c3QgYmUgcnVubmluZyBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxeDAwX3JlZ193cml0ZShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW1jcF9yZWdfd3JpdGUodWNiLT5tY3AsIHJlZywgdmFsKTsKK30KKworLyoqCisgKgl1Y2IxeDAwX3JlZ19yZWFkIC0gcmVhZCBhIFVDQjF4MDAgcmVnaXN0ZXIKKyAqCUB1Y2I6IFVDQjF4MDAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpcAorICoJQHJlZzogVUNCMXgwMCA0LWJpdCByZWdpc3RlciBpbmRleCB0byB3cml0ZQorICoKKyAqCVJlYWQgdGhlIFVDQjF4MDAgcmVnaXN0ZXIgQHJlZyBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4gIFRoZSBTSUIKKyAqCWNsb2NrIG11c3QgYmUgcnVubmluZyBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjF4MDBfcmVnX3JlYWQoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gbWNwX3JlZ19yZWFkKHVjYi0+bWNwLCByZWcpOworfQorLyoqCisgKgl1Y2IxeDAwX3NldF9hdWRpb19kaXZpc29yIC0gCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBkaXY6IFNJQiBjbG9jayBkaXZpc29yCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxeDAwX3NldF9hdWRpb19kaXZpc29yKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCBkaXYpCit7CisJbWNwX3NldF9hdWRpb19kaXZpc29yKHVjYi0+bWNwLCBkaXYpOworfQorCisvKioKKyAqCXVjYjF4MDBfc2V0X3RlbGVjb21fZGl2aXNvciAtCisgKglAdWNiOiBVQ0IxeDAwIHN0cnVjdHVyZSBkZXNjcmliaW5nIGNoaXAKKyAqCUBkaXY6IFNJQiBjbG9jayBkaXZpc29yCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxeDAwX3NldF90ZWxlY29tX2Rpdmlzb3Ioc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGRpdikKK3sKKwltY3Bfc2V0X3RlbGVjb21fZGl2aXNvcih1Y2ItPm1jcCwgZGl2KTsKK30KKwordm9pZCB1Y2IxeDAwX2lvX3NldF9kaXIoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordm9pZCB1Y2IxeDAwX2lvX3dyaXRlKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3Vuc2lnbmVkIGludCB1Y2IxeDAwX2lvX3JlYWQoc3RydWN0IHVjYjF4MDAgKnVjYik7CisKKyNkZWZpbmUgVUNCX05PU1lOQwkoMCkKKyNkZWZpbmUgVUNCX1NZTkMJKDEpCisKK3Vuc2lnbmVkIGludCB1Y2IxeDAwX2FkY19yZWFkKHN0cnVjdCB1Y2IxeDAwICp1Y2IsIGludCBhZGNfY2hhbm5lbCwgaW50IHN5bmMpOwordm9pZCB1Y2IxeDAwX2FkY19lbmFibGUoc3RydWN0IHVjYjF4MDAgKnVjYik7Cit2b2lkIHVjYjF4MDBfYWRjX2Rpc2FibGUoc3RydWN0IHVjYjF4MDAgKnVjYik7CisKKy8qCisgKiBXaGljaCBlZGdlcyBvZiB0aGUgSVJRIGRvIHlvdSB3YW50IHRvIGNvbnRyb2wgdG9kYXk/CisgKi8KKyNkZWZpbmUgVUNCX1JJU0lORwkoMSA8PCAwKQorI2RlZmluZSBVQ0JfRkFMTElORwkoMSA8PCAxKQorCitpbnQgdWNiMXgwMF9ob29rX2lycShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgaWR4LCB2b2lkICgqZm4pKGludCwgdm9pZCAqKSwgdm9pZCAqZGV2aWQpOwordm9pZCB1Y2IxeDAwX2VuYWJsZV9pcnEoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGlkeCwgaW50IGVkZ2VzKTsKK3ZvaWQgdWNiMXgwMF9kaXNhYmxlX2lycShzdHJ1Y3QgdWNiMXgwMCAqdWNiLCB1bnNpZ25lZCBpbnQgaWR4LCBpbnQgZWRnZXMpOworaW50IHVjYjF4MDBfZnJlZV9pcnEoc3RydWN0IHVjYjF4MDAgKnVjYiwgdW5zaWduZWQgaW50IGlkeCwgdm9pZCAqZGV2aWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggZGVhNjU4OS4uN2ZjNjkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAKIGNvbmZpZyBJQk1fQVNNCiAJdHJpc3RhdGUgIkRldmljZSBkcml2ZXIgZm9yIElCTSBSU0Egc2VydmljZSBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBYODYgJiYgUENJICYmIEVYUEVSSU1FTlRBTCAmJiBCUk9LRU4KKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBkZXZpY2UgZHJpdmVyIHN1cHBvcnQgZm9yIGluLWJhbmQgYWNjZXNzIHRvIHRoZQogCSAgSUJNIFJTQSAoQ29uZG9yKSBzZXJ2aWNlIHByb2Nlc3NvciBpbiBlU2VydmVyIHhTZXJpZXMgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9oZHB1ZnRycy9oZHB1X2NwdXN0YXRlLmMgYi9kcml2ZXJzL21pc2MvaGRwdWZ0cnMvaGRwdV9jcHVzdGF0ZS5jCmluZGV4IDc1MDFmYWIuLjQ2ZGU1YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9oZHB1ZnRycy9oZHB1X2NwdXN0YXRlLmMKKysrIGIvZHJpdmVycy9taXNjL2hkcHVmdHJzL2hkcHVfY3B1c3RhdGUuYwpAQCAtMTkyLDIyICsxOTIsMzcgQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRkZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kZTsKKwlpbnQgcmV0OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAljcHVzdGF0ZS5zZXRfYWRkciA9ICh1bnNpZ25lZCBsb25nICopcmVzLT5zdGFydDsKIAljcHVzdGF0ZS5jbHJfYWRkciA9ICh1bnNpZ25lZCBsb25nICopcmVzLT5lbmQgLSAxOwogCi0JbWlzY19yZWdpc3RlcigmY3B1c3RhdGVfZGV2KTsKLQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJza3lfY3B1c3RhdGUiLCAwLCAwLCBjcHVzdGF0ZV9yZWFkX3Byb2MsIE5VTEwpOworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmNwdXN0YXRlX2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJza3lfY3B1c3RhdGU6IFVuYWJsZSB0byByZWdpc3RlciBtaXNjICIKKwkJCQkJImRldmljZS5cbiIpOworCQljcHVzdGF0ZS5zZXRfYWRkciA9IE5VTEw7CisJCWNwdXN0YXRlLmNscl9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcm9jX2RlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic2t5X2NwdXN0YXRlIiwgMCwgMCwKKwkJCQkJY3B1c3RhdGVfcmVhZF9wcm9jLCBOVUxMKTsKKwlpZiAocHJvY19kZSA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJza3lfY3B1c3RhdGU6IFVuYWJsZSB0byBjcmVhdGUgcHJvYyAiCisJCQkJCSJkaXIgZW50cnlcbiIpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiU2t5IENQVSBTdGF0ZSBEcml2ZXIgdiIgU0tZX0NQVVNUQVRFX1ZFUlNJT04gIlxuIik7CiAJcmV0dXJuIDA7CiB9CisKIHN0YXRpYyBpbnQgaGRwdV9jcHVzdGF0ZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGRldikKIHsKIAotCWNwdXN0YXRlLnNldF9hZGRyID0gMDsKLQljcHVzdGF0ZS5jbHJfYWRkciA9IDA7CisJY3B1c3RhdGUuc2V0X2FkZHIgPSBOVUxMOworCWNwdXN0YXRlLmNscl9hZGRyID0gTlVMTDsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KCJza3lfY3B1c3RhdGUiLCBOVUxMKTsKIAltaXNjX2RlcmVnaXN0ZXIoJmNwdXN0YXRlX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vdWFydC5jCmluZGV4IDkxNDgwNDUuLjdlOTg0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vdWFydC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vdWFydC5jCkBAIC0yNSwxNSArMjUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlICJpYm1hc20uaCIKICNpbmNsdWRlICJsb3dsZXZlbC5oIgogCiAKIHZvaWQgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKIHsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJpYWw7CisJc3RydWN0IHVhcnRfcG9ydCB1cG9ydDsKIAl2b2lkIF9faW9tZW0gKmlvbWVtX2Jhc2U7CiAKIAlpb21lbV9iYXNlID0gc3AtPmJhc2VfYWRkcmVzcyArIFNDT1VUX0NPTV9CX0JBU0U7CkBAIC00NywxNCArNDcsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCW1lbXNldCgmc2VyaWFsLCAwLCBzaXplb2Yoc2VyaWFsKSk7Ci0Jc2VyaWFsLmlycQkJPSBzcC0+aXJxOwotCXNlcmlhbC5iYXVkX2Jhc2UJPSAzNjg2NDAwIC8gMTY7Ci0Jc2VyaWFsLmZsYWdzCQk9IFVQRl9BVVRPUFJPQkUgfCBVUEZfU0hBUkVfSVJROwotCXNlcmlhbC5pb190eXBlCQk9IFVQSU9fTUVNOwotCXNlcmlhbC5pb21lbV9iYXNlCT0gaW9tZW1fYmFzZTsKKwltZW1zZXQoJnVwb3J0LCAwLCBzaXplb2Yoc3RydWN0IHVhcnRfcG9ydCkpOworCXVwb3J0LmlycQk9IHNwLT5pcnE7CisJdXBvcnQudWFydGNsawk9IDM2ODY0MDA7CisJdXBvcnQuZmxhZ3MJPSBVUEZfQVVUT1BST0JFIHwgVVBGX1NIQVJFX0lSUTsKKwl1cG9ydC5pb3R5cGUJPSBVUElPX01FTTsKKwl1cG9ydC5tZW1iYXNlCT0gaW9tZW1fYmFzZTsKIAotCXNwLT5zZXJpYWxfbGluZSA9IHJlZ2lzdGVyX3NlcmlhbCgmc2VyaWFsKTsKKwlzcC0+c2VyaWFsX2xpbmUgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnVwb3J0KTsKIAlpZiAoc3AtPnNlcmlhbF9saW5lIDwgMCkgewogCQlkZXZfZXJyKHNwLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIHBvcnRcbiIpOwogCQlyZXR1cm47CkBAIC02OCw1ICs2OCw1IEBACiAJCXJldHVybjsKIAogCWRpc2FibGVfdWFydF9pbnRlcnJ1cHRzKHNwLT5iYXNlX2FkZHJlc3MpOwotCXVucmVnaXN0ZXJfc2VyaWFsKHNwLT5zZXJpYWxfbGluZSk7CisJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoc3AtPnNlcmlhbF9saW5lKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tYy5jIGIvZHJpdmVycy9tbWMvbW1jLmMKaW5kZXggMGE4MTY1OS4uY2VhZTM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jLmMKQEAgLTIsNiArMiw4IEBACiAgKiAgbGludXgvZHJpdmVycy9tbWMvbW1jLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUnVzc2VsbCBLaW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogIFNEIHN1cHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0IElhbiBNb2x0b24sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgU0Qgc3VwcG9ydCBDb3B5cmlnaHQgKEMpIDIwMDUgUGllcnJlIE9zc21hbiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTE2LDYgKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgpAQCAtMTcyLDcgKzE3Niw4MSBAQAogCiBFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9jbWQpOwogCisvKioKKyAqCW1tY193YWl0X2Zvcl9hcHBfY21kIC0gc3RhcnQgYW4gYXBwbGljYXRpb24gY29tbWFuZCBhbmQgd2FpdCBmb3IKKyAJCQkgICAgICAgY29tcGxldGlvbgorICoJQGhvc3Q6IE1NQyBob3N0IHRvIHN0YXJ0IGNvbW1hbmQKKyAqCUByY2E6IFJDQSB0byBzZW5kIE1NQ19BUFBfQ01EIHRvCisgKglAY21kOiBNTUMgY29tbWFuZCB0byBzdGFydAorICoJQHJldHJpZXM6IG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMKKyAqCisgKglTZW5kcyBhIE1NQ19BUFBfQ01ELCBjaGVja3MgdGhlIGNhcmQgcmVzcG9uc2UsIHNlbmRzIHRoZSBjb21tYW5kCisgKglpbiB0aGUgcGFyYW1ldGVyIGFuZCB3YWl0cyBmb3IgaXQgdG8gY29tcGxldGUuIFJldHVybiBhbnkgZXJyb3IKKyAqCXRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGluZy4gIERvIG5vdCBhdHRlbXB0IHRvCisgKglwYXJzZSB0aGUgcmVzcG9uc2UuCisgKi8KK2ludCBtbWNfd2FpdF9mb3JfYXBwX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCByY2EsCisJc3RydWN0IG1tY19jb21tYW5kICpjbWQsIGludCByZXRyaWVzKQoreworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnE7CisJc3RydWN0IG1tY19jb21tYW5kIGFwcGNtZDsKIAorCWludCBpLCBlcnI7CisKKwlCVUdfT04oaG9zdC0+Y2FyZF9idXN5ID09IE5VTEwpOworCUJVR19PTihyZXRyaWVzIDwgMCk7CisKKwllcnIgPSBNTUNfRVJSX0lOVkFMSUQ7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gcmVzZW5kIE1NQ19BUFBfQ01EIGZvciBlYWNoIGF0dGVtcHQgc28KKwkgKiB3ZSBjYW5ub3QgdXNlIHRoZSByZXRyaWVzIGZpZWxkIGluIG1tY19jb21tYW5kLgorCSAqLworCWZvciAoaSA9IDA7aSA8PSByZXRyaWVzO2krKykgeworCQltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCisJCWFwcGNtZC5vcGNvZGUgPSBNTUNfQVBQX0NNRDsKKwkJYXBwY21kLmFyZyA9IHJjYSA8PCAxNjsKKwkJYXBwY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKwkJYXBwY21kLnJldHJpZXMgPSAwOworCQltZW1zZXQoYXBwY21kLnJlc3AsIDAsIHNpemVvZihhcHBjbWQucmVzcCkpOworCQlhcHBjbWQuZGF0YSA9IE5VTEw7CisKKwkJbXJxLmNtZCA9ICZhcHBjbWQ7CisJCWFwcGNtZC5kYXRhID0gTlVMTDsKKworCQltbWNfd2FpdF9mb3JfcmVxKGhvc3QsICZtcnEpOworCisJCWlmIChhcHBjbWQuZXJyb3IpIHsKKwkJCWVyciA9IGFwcGNtZC5lcnJvcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2hlY2sgdGhhdCBjYXJkIHN1cHBvcnRlZCBhcHBsaWNhdGlvbiBjb21tYW5kcyAqLworCQlpZiAoIShhcHBjbWQucmVzcFswXSAmIFIxX0FQUF9DTUQpKQorCQkJcmV0dXJuIE1NQ19FUlJfRkFJTEVEOworCisJCW1lbXNldCgmbXJxLCAwLCBzaXplb2Yoc3RydWN0IG1tY19yZXF1ZXN0KSk7CisKKwkJbWVtc2V0KGNtZC0+cmVzcCwgMCwgc2l6ZW9mKGNtZC0+cmVzcCkpOworCQljbWQtPnJldHJpZXMgPSAwOworCisJCW1ycS5jbWQgPSBjbWQ7CisJCWNtZC0+ZGF0YSA9IE5VTEw7CisKKwkJbW1jX3dhaXRfZm9yX3JlcShob3N0LCAmbXJxKTsKKworCQllcnIgPSBjbWQtPmVycm9yOworCQlpZiAoY21kLT5lcnJvciA9PSBNTUNfRVJSX05PTkUpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9hcHBfY21kKTsKKworc3RhdGljIGludCBtbWNfc2VsZWN0X2NhcmQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwogCiAvKioKICAqCV9fbW1jX2NsYWltX2hvc3QgLSBleGNsdXNpdmVseSBjbGFpbSBhIGhvc3QKQEAgLTIwNiwxNiArMjg0LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCXJlbW92ZV93YWl0X3F1ZXVlKCZob3N0LT53cSwgJndhaXQpOwogCi0JaWYgKGNhcmQgIT0gKHZvaWQgKiktMSAmJiBob3N0LT5jYXJkX3NlbGVjdGVkICE9IGNhcmQpIHsKLQkJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKLQotCQlob3N0LT5jYXJkX3NlbGVjdGVkID0gY2FyZDsKLQotCQljbWQub3Bjb2RlID0gTU1DX1NFTEVDVF9DQVJEOwotCQljbWQuYXJnID0gY2FyZC0+cmNhIDw8IDE2OwotCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOwotCi0JCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgQ01EX1JFVFJJRVMpOworCWlmIChjYXJkICE9ICh2b2lkICopLTEpIHsKKwkJZXJyID0gbW1jX3NlbGVjdF9jYXJkKGhvc3QsIGNhcmQpOworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTI0NSw2ICszMTcsNjMgQEAKIAogRVhQT1JUX1NZTUJPTChtbWNfcmVsZWFzZV9ob3N0KTsKIAorc3RhdGljIGludCBtbWNfc2VsZWN0X2NhcmQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCisJQlVHX09OKGhvc3QtPmNhcmRfYnVzeSA9PSBOVUxMKTsKKworCWlmIChob3N0LT5jYXJkX3NlbGVjdGVkID09IGNhcmQpCisJCXJldHVybiBNTUNfRVJSX05PTkU7CisKKwlob3N0LT5jYXJkX3NlbGVjdGVkID0gY2FyZDsKKworCWNtZC5vcGNvZGUgPSBNTUNfU0VMRUNUX0NBUkQ7CisJY21kLmFyZyA9IGNhcmQtPnJjYSA8PCAxNjsKKwljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCisJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChob3N0LCAmY21kLCBDTURfUkVUUklFUyk7CisJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIERlZmF1bHQgYnVzIHdpZHRoIGlzIDEgYml0LgorCSAqLworCWhvc3QtPmlvcy5idXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzE7CisKKwkvKgorCSAqIFdlIGNhbiBvbmx5IGNoYW5nZSB0aGUgYnVzIHdpZHRoIG9mIHRoZSBzZWxlY3RlZAorCSAqIGNhcmQgc28gdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHV0IHRoZSBoYW5kbGluZworCSAqIGhlcmUuCisJICovCisJaWYgKGhvc3QtPmNhcHMgJiBNTUNfQ0FQXzRfQklUX0RBVEEpIHsKKwkJLyoKKwkJICogVGhlIGNhcmQgaXMgaW4gMSBiaXQgbW9kZSBieSBkZWZhdWx0IHNvCisJCSAqIHdlIG9ubHkgbmVlZCB0byBjaGFuZ2UgaWYgaXQgc3VwcG9ydHMgdGhlCisJCSAqIHdpZGVyIHZlcnNpb24uCisJCSAqLworCQlpZiAobW1jX2NhcmRfc2QoY2FyZCkgJiYKKwkJCShjYXJkLT5zY3IuYnVzX3dpZHRocyAmIFNEX1NDUl9CVVNfV0lEVEhfNCkpIHsKKwkJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJCQljbWQub3Bjb2RlID0gU0RfQVBQX1NFVF9CVVNfV0lEVEg7CisJCQljbWQuYXJnID0gU0RfQlVTX1dJRFRIXzQ7CisJCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCisJCQllcnIgPSBtbWNfd2FpdF9mb3JfYXBwX2NtZChob3N0LCBjYXJkLT5yY2EsICZjbWQsCisJCQkJQ01EX1JFVFJJRVMpOworCQkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCQkJcmV0dXJuIGVycjsKKworCQkJaG9zdC0+aW9zLmJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfNDsKKwkJfQorCX0KKworCWhvc3QtPm9wcy0+c2V0X2lvcyhob3N0LCAmaG9zdC0+aW9zKTsKKworCXJldHVybiBNTUNfRVJSX05PTkU7Cit9CisKIC8qCiAgKiBFbnN1cmUgdGhhdCBubyBjYXJkIGlzIHNlbGVjdGVkLgogICovCkBAIC0zMjIsNDggKzQ1MSw2OSBAQAogCiAJbWVtc2V0KCZjYXJkLT5jaWQsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2NpZCkpOwogCi0JLyoKLQkgKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSBmb3JtYXQgaGVyZSBpcyBndWVzc3dvcmsgYmFzZWQgdXBvbgotCSAqIGluZm9ybWF0aW9uIHBlb3BsZSBoYXZlIHNlbnQgdG8gZGF0ZS4KLQkgKi8KLQlzd2l0Y2ggKGNhcmQtPmNzZC5tbWNhX3ZzbikgewotCWNhc2UgMDogLyogTU1DIHYxLj8gKi8KLQljYXNlIDE6IC8qIE1NQyB2MS40ICovCi0JCWNhcmQtPmNpZC5tYW5maWQJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTA0LCAyNCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbMF0JPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzFdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDg4LCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVsyXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4MCwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbM10JPSBVTlNUVUZGX0JJVFMocmVzcCwgNzIsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzRdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDY0LCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVs1XQk9IFVOU1RVRkZfQklUUyhyZXNwLCA1NiwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbNl0JPSBVTlNUVUZGX0JJVFMocmVzcCwgNDgsIDgpOwotCQljYXJkLT5jaWQuaHdyZXYJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ0LCA0KTsKLQkJY2FyZC0+Y2lkLmZ3cmV2CQk9IFVOU1RVRkZfQklUUyhyZXNwLCA0MCwgNCk7Ci0JCWNhcmQtPmNpZC5zZXJpYWwJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTYsIDI0KTsKLQkJY2FyZC0+Y2lkLm1vbnRoCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMiwgNCk7Ci0JCWNhcmQtPmNpZC55ZWFyCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4LCA0KSArIDE5OTc7Ci0JCWJyZWFrOworCWlmIChtbWNfY2FyZF9zZChjYXJkKSkgeworCQkvKgorCQkgKiBTRCBkb2Vzbid0IGN1cnJlbnRseSBoYXZlIGEgdmVyc2lvbiBmaWVsZCBzbyB3ZSB3aWxsCisJCSAqIGhhdmUgdG8gYXNzdW1lIHdlIGNhbiBwYXJzZSB0aGlzLgorCQkgKi8KKwkJY2FyZC0+Y2lkLm1hbmZpZAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIwLCA4KTsKKwkJY2FyZC0+Y2lkLm9lbWlkCQkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTA0LCAxNik7CisJCWNhcmQtPmNpZC5wcm9kX25hbWVbMF0JCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDk2LCA4KTsKKwkJY2FyZC0+Y2lkLnByb2RfbmFtZVsxXQkJPSBVTlNUVUZGX0JJVFMocmVzcCwgODgsIDgpOworCQljYXJkLT5jaWQucHJvZF9uYW1lWzJdCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA4MCwgOCk7CisJCWNhcmQtPmNpZC5wcm9kX25hbWVbM10JCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDcyLCA4KTsKKwkJY2FyZC0+Y2lkLnByb2RfbmFtZVs0XQkJPSBVTlNUVUZGX0JJVFMocmVzcCwgNjQsIDgpOworCQljYXJkLT5jaWQuaHdyZXYJCQk9IFVOU1RVRkZfQklUUyhyZXNwLCA2MCwgNCk7CisJCWNhcmQtPmNpZC5md3JldgkJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDU2LCA0KTsKKwkJY2FyZC0+Y2lkLnNlcmlhbAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMjQsIDMyKTsKKwkJY2FyZC0+Y2lkLnllYXIJCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMiwgOCk7CisJCWNhcmQtPmNpZC5tb250aAkJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgsIDQpOwogCi0JY2FzZSAyOiAvKiBNTUMgdjIueCA/ICovCi0JY2FzZSAzOiAvKiBNTUMgdjMueCA/ICovCi0JCWNhcmQtPmNpZC5tYW5maWQJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIwLCA4KTsKLQkJY2FyZC0+Y2lkLm9lbWlkCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMDQsIDE2KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVswXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA5NiwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbMV0JPSBVTlNUVUZGX0JJVFMocmVzcCwgODgsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzJdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgwLCA4KTsKLQkJY2FyZC0+Y2lkLnByb2RfbmFtZVszXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA3MiwgOCk7Ci0JCWNhcmQtPmNpZC5wcm9kX25hbWVbNF0JPSBVTlNUVUZGX0JJVFMocmVzcCwgNjQsIDgpOwotCQljYXJkLT5jaWQucHJvZF9uYW1lWzVdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDU2LCA4KTsKLQkJY2FyZC0+Y2lkLnNlcmlhbAk9IFVOU1RVRkZfQklUUyhyZXNwLCAxNiwgMzIpOwotCQljYXJkLT5jaWQubW9udGgJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyLCA0KTsKLQkJY2FyZC0+Y2lkLnllYXIJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDgsIDQpICsgMTk5NzsKLQkJYnJlYWs7CisJCWNhcmQtPmNpZC55ZWFyICs9IDIwMDA7IC8qIFNEIGNhcmRzIHllYXIgb2Zmc2V0ICovCisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHNlbGVjdGlvbiBvZiB0aGUgZm9ybWF0IGhlcmUgaXMgYmFzZWQgdXBvbiBwdWJsaXNoZWQKKwkJICogc3BlY3MgZnJvbSBzYW5kaXNrIGFuZCBmcm9tIHdoYXQgcGVvcGxlIGhhdmUgcmVwb3J0ZWQuCisJCSAqLworCQlzd2l0Y2ggKGNhcmQtPmNzZC5tbWNhX3ZzbikgeworCQljYXNlIDA6IC8qIE1NQyB2MS4wIC0gdjEuMiAqLworCQljYXNlIDE6IC8qIE1NQyB2MS40ICovCisJCQljYXJkLT5jaWQubWFuZmlkCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgMjQpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVswXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA5NiwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzFdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDg4LCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbMl0JPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVszXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA3MiwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzRdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDY0LCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbNV0JPSBVTlNUVUZGX0JJVFMocmVzcCwgNTYsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVs2XQk9IFVOU1RVRkZfQklUUyhyZXNwLCA0OCwgOCk7CisJCQljYXJkLT5jaWQuaHdyZXYJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ0LCA0KTsKKwkJCWNhcmQtPmNpZC5md3JldgkJPSBVTlNUVUZGX0JJVFMocmVzcCwgNDAsIDQpOworCQkJY2FyZC0+Y2lkLnNlcmlhbAk9IFVOU1RVRkZfQklUUyhyZXNwLCAxNiwgMjQpOworCQkJY2FyZC0+Y2lkLm1vbnRoCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMiwgNCk7CisJCQljYXJkLT5jaWQueWVhcgkJPSBVTlNUVUZGX0JJVFMocmVzcCwgOCwgNCkgKyAxOTk3OworCQkJYnJlYWs7CiAKLQlkZWZhdWx0OgotCQlwcmludGsoIiVzOiBjYXJkIGhhcyB1bmtub3duIE1NQ0EgdmVyc2lvbiAlZFxuIiwKLQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY2FyZC0+Y3NkLm1tY2FfdnNuKTsKLQkJbW1jX2NhcmRfc2V0X2JhZChjYXJkKTsKLQkJYnJlYWs7CisJCWNhc2UgMjogLyogTU1DIHYyLjAgLSB2Mi4yICovCisJCWNhc2UgMzogLyogTU1DIHYzLjEgLSB2My4zICovCisJCQljYXJkLT5jaWQubWFuZmlkCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyMCwgOCk7CisJCQljYXJkLT5jaWQub2VtaWQJCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgMTYpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVswXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA5NiwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzFdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDg4LCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbMl0JPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDgpOworCQkJY2FyZC0+Y2lkLnByb2RfbmFtZVszXQk9IFVOU1RVRkZfQklUUyhyZXNwLCA3MiwgOCk7CisJCQljYXJkLT5jaWQucHJvZF9uYW1lWzRdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDY0LCA4KTsKKwkJCWNhcmQtPmNpZC5wcm9kX25hbWVbNV0JPSBVTlNUVUZGX0JJVFMocmVzcCwgNTYsIDgpOworCQkJY2FyZC0+Y2lkLnNlcmlhbAk9IFVOU1RVRkZfQklUUyhyZXNwLCAxNiwgMzIpOworCQkJY2FyZC0+Y2lkLm1vbnRoCQk9IFVOU1RVRkZfQklUUyhyZXNwLCAxMiwgNCk7CisJCQljYXJkLT5jaWQueWVhcgkJPSBVTlNUVUZGX0JJVFMocmVzcCwgOCwgNCkgKyAxOTk3OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiJXM6IGNhcmQgaGFzIHVua25vd24gTU1DQSB2ZXJzaW9uICVkXG4iLAorCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY2FyZC0+Y3NkLm1tY2FfdnNuKTsKKwkJCW1tY19jYXJkX3NldF9iYWQoY2FyZCk7CisJCQlicmVhazsKKwkJfQogCX0KIH0KIApAQCAtMzc2LDM0ICs1MjYsODYgQEAKIAl1bnNpZ25lZCBpbnQgZSwgbSwgY3NkX3N0cnVjdDsKIAl1MzIgKnJlc3AgPSBjYXJkLT5yYXdfY3NkOwogCi0JLyoKLQkgKiBXZSBvbmx5IHVuZGVyc3RhbmQgQ1NEIHN0cnVjdHVyZSB2MS4xIGFuZCB2Mi4KLQkgKiB2MiBoYXMgZXh0cmEgaW5mb3JtYXRpb24gaW4gYml0cyAxNSwgMTEgYW5kIDEwLgotCSAqLwotCWNzZF9zdHJ1Y3QgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTI2LCAyKTsKLQlpZiAoY3NkX3N0cnVjdCAhPSAxICYmIGNzZF9zdHJ1Y3QgIT0gMikgewotCQlwcmludGsoIiVzOiB1bnJlY29nbmlzZWQgQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAotCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjc2Rfc3RydWN0KTsKKwlpZiAobW1jX2NhcmRfc2QoY2FyZCkpIHsKKwkJY3NkX3N0cnVjdCA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMjYsIDIpOworCQlpZiAoY3NkX3N0cnVjdCAhPSAwKSB7CisJCQlwcmludGsoIiVzOiB1bnJlY29nbmlzZWQgQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY3NkX3N0cnVjdCk7CisJCQltbWNfY2FyZF9zZXRfYmFkKGNhcmQpOworCQkJcmV0dXJuOworCQl9CisKKwkJbSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMTUsIDQpOworCQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDExMiwgMyk7CisJCWNzZC0+dGFjY19ucwkgPSAodGFjY19leHBbZV0gKiB0YWNjX21hbnRbbV0gKyA5KSAvIDEwOworCQljc2QtPnRhY2NfY2xrcwkgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTA0LCA4KSAqIDEwMDsKKworCQltID0gVU5TVFVGRl9CSVRTKHJlc3AsIDk5LCA0KTsKKwkJZSA9IFVOU1RVRkZfQklUUyhyZXNwLCA5NiwgMyk7CisJCWNzZC0+bWF4X2R0cgkgID0gdHJhbl9leHBbZV0gKiB0cmFuX21hbnRbbV07CisJCWNzZC0+Y21kY2xhc3MJICA9IFVOU1RVRkZfQklUUyhyZXNwLCA4NCwgMTIpOworCisJCWUgPSBVTlNUVUZGX0JJVFMocmVzcCwgNDcsIDMpOworCQltID0gVU5TVFVGRl9CSVRTKHJlc3AsIDYyLCAxMik7CisJCWNzZC0+Y2FwYWNpdHkJICA9ICgxICsgbSkgPDwgKGUgKyAyKTsKKworCQljc2QtPnJlYWRfYmxrYml0cyA9IFVOU1RVRkZfQklUUyhyZXNwLCA4MCwgNCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2Ugb25seSB1bmRlcnN0YW5kIENTRCBzdHJ1Y3R1cmUgdjEuMSBhbmQgdjEuMi4KKwkJICogdjEuMiBoYXMgZXh0cmEgaW5mb3JtYXRpb24gaW4gYml0cyAxNSwgMTEgYW5kIDEwLgorCQkgKi8KKwkJY3NkX3N0cnVjdCA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMjYsIDIpOworCQlpZiAoY3NkX3N0cnVjdCAhPSAxICYmIGNzZF9zdHJ1Y3QgIT0gMikgeworCQkJcHJpbnRrKCIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwkJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNzZF9zdHJ1Y3QpOworCQkJbW1jX2NhcmRfc2V0X2JhZChjYXJkKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNzZC0+bW1jYV92c24JID0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyMiwgNCk7CisJCW0gPSBVTlNUVUZGX0JJVFMocmVzcCwgMTE1LCA0KTsKKwkJZSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMTIsIDMpOworCQljc2QtPnRhY2NfbnMJID0gKHRhY2NfZXhwW2VdICogdGFjY19tYW50W21dICsgOSkgLyAxMDsKKwkJY3NkLT50YWNjX2Nsa3MJID0gVU5TVFVGRl9CSVRTKHJlc3AsIDEwNCwgOCkgKiAxMDA7CisKKwkJbSA9IFVOU1RVRkZfQklUUyhyZXNwLCA5OSwgNCk7CisJCWUgPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDMpOworCQljc2QtPm1heF9kdHIJICA9IHRyYW5fZXhwW2VdICogdHJhbl9tYW50W21dOworCQljc2QtPmNtZGNsYXNzCSAgPSBVTlNUVUZGX0JJVFMocmVzcCwgODQsIDEyKTsKKworCQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ3LCAzKTsKKwkJbSA9IFVOU1RVRkZfQklUUyhyZXNwLCA2MiwgMTIpOworCQljc2QtPmNhcGFjaXR5CSAgPSAoMSArIG0pIDw8IChlICsgMik7CisKKwkJY3NkLT5yZWFkX2Jsa2JpdHMgPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDQpOworCX0KK30KKworLyoKKyAqIEdpdmVuIGEgNjQtYml0IHJlc3BvbnNlLCBkZWNvZGUgdG8gb3VyIGNhcmQgU0NSIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgbW1jX2RlY29kZV9zY3Ioc3RydWN0IG1tY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBzZF9zY3IgKnNjciA9ICZjYXJkLT5zY3I7CisJdW5zaWduZWQgaW50IHNjcl9zdHJ1Y3Q7CisJdTMyIHJlc3BbNF07CisKKwlCVUdfT04oIW1tY19jYXJkX3NkKGNhcmQpKTsKKworCXJlc3BbM10gPSBjYXJkLT5yYXdfc2NyWzFdOworCXJlc3BbMl0gPSBjYXJkLT5yYXdfc2NyWzBdOworCisJc2NyX3N0cnVjdCA9IFVOU1RVRkZfQklUUyhyZXNwLCA2MCwgNCk7CisJaWYgKHNjcl9zdHJ1Y3QgIT0gMCkgeworCQlwcmludGsoIiVzOiB1bnJlY29nbmlzZWQgU0NSIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBzY3Jfc3RydWN0KTsKIAkJbW1jX2NhcmRfc2V0X2JhZChjYXJkKTsKIAkJcmV0dXJuOwogCX0KIAotCWNzZC0+bW1jYV92c24JID0gVU5TVFVGRl9CSVRTKHJlc3AsIDEyMiwgNCk7Ci0JbSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMTUsIDQpOwotCWUgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTEyLCAzKTsKLQljc2QtPnRhY2NfbnMJID0gKHRhY2NfZXhwW2VdICogdGFjY19tYW50W21dICsgOSkgLyAxMDsKLQljc2QtPnRhY2NfY2xrcwkgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTA0LCA4KSAqIDEwMDsKLQotCW0gPSBVTlNUVUZGX0JJVFMocmVzcCwgOTksIDQpOwotCWUgPSBVTlNUVUZGX0JJVFMocmVzcCwgOTYsIDMpOwotCWNzZC0+bWF4X2R0cgkgID0gdHJhbl9leHBbZV0gKiB0cmFuX21hbnRbbV07Ci0JY3NkLT5jbWRjbGFzcwkgID0gVU5TVFVGRl9CSVRTKHJlc3AsIDg0LCAxMik7Ci0KLQllID0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ3LCAzKTsKLQltID0gVU5TVFVGRl9CSVRTKHJlc3AsIDYyLCAxMik7Ci0JY3NkLT5jYXBhY2l0eQkgID0gKDEgKyBtKSA8PCAoZSArIDIpOwotCi0JY3NkLT5yZWFkX2Jsa2JpdHMgPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDQpOworCXNjci0+c2RhX3ZzbiA9IFVOU1RVRkZfQklUUyhyZXNwLCA1NiwgNCk7CisJc2NyLT5idXNfd2lkdGhzID0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ4LCA0KTsKIH0KIAogLyoKQEAgLTQ4Nyw2ICs2ODksNyBAQAogCWhvc3QtPmlvcy5idXNfbW9kZSA9IE1NQ19CVVNNT0RFX09QRU5EUkFJTjsKIAlob3N0LT5pb3MuY2hpcF9zZWxlY3QgPSBNTUNfQ1NfRE9OVENBUkU7CiAJaG9zdC0+aW9zLnBvd2VyX21vZGUgPSBNTUNfUE9XRVJfVVA7CisJaG9zdC0+aW9zLmJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfMTsKIAlob3N0LT5vcHMtPnNldF9pb3MoaG9zdCwgJmhvc3QtPmlvcyk7CiAKIAltbWNfZGVsYXkoMSk7CkBAIC01MDUsNiArNzA4LDcgQEAKIAlob3N0LT5pb3MuYnVzX21vZGUgPSBNTUNfQlVTTU9ERV9PUEVORFJBSU47CiAJaG9zdC0+aW9zLmNoaXBfc2VsZWN0ID0gTU1DX0NTX0RPTlRDQVJFOwogCWhvc3QtPmlvcy5wb3dlcl9tb2RlID0gTU1DX1BPV0VSX09GRjsKKwlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF8xOwogCWhvc3QtPm9wcy0+c2V0X2lvcyhob3N0LCAmaG9zdC0+aW9zKTsKIH0KIApAQCAtNTM2LDYgKzc0MCwzNCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbW1jX3NlbmRfYXBwX29wX2NvbmQoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1MzIgb2NyLCB1MzIgKnJvY3IpCit7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKwlpbnQgaSwgZXJyID0gMDsKKworCWNtZC5vcGNvZGUgPSBTRF9BUFBfT1BfQ09ORDsKKwljbWQuYXJnID0gb2NyOworCWNtZC5mbGFncyA9IE1NQ19SU1BfUjM7CisKKwlmb3IgKGkgPSAxMDA7IGk7IGktLSkgeworCQllcnIgPSBtbWNfd2FpdF9mb3JfYXBwX2NtZChob3N0LCAwLCAmY21kLCBDTURfUkVUUklFUyk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJYnJlYWs7CisKKwkJaWYgKGNtZC5yZXNwWzBdICYgTU1DX0NBUkRfQlVTWSB8fCBvY3IgPT0gMCkKKwkJCWJyZWFrOworCisJCWVyciA9IE1NQ19FUlJfVElNRU9VVDsKKworCQltbWNfZGVsYXkoMTApOworCX0KKworCWlmIChyb2NyKQorCQkqcm9jciA9IGNtZC5yZXNwWzBdOworCisJcmV0dXJuIGVycjsKK30KKwogLyoKICAqIERpc2NvdmVyIGNhcmRzIGJ5IHJlcXVlc3RpbmcgdGhlaXIgQ0lELiAgSWYgdGhpcyBjb21tYW5kCiAgKiB0aW1lcyBvdXQsIGl0IGlzIG5vdCBhbiBlcnJvcjsgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgY2FyZHMKQEAgLTU3OSwxMyArODExLDM4IEBACiAKIAkJY2FyZC0+c3RhdGUgJj0gfk1NQ19TVEFURV9ERUFEOwogCi0JCWNtZC5vcGNvZGUgPSBNTUNfU0VUX1JFTEFUSVZFX0FERFI7Ci0JCWNtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTY7Ci0JCWNtZC5mbGFncyA9IE1NQ19SU1BfUjE7CisJCWlmIChob3N0LT5tb2RlID09IE1NQ19NT0RFX1NEKSB7CisJCQltbWNfY2FyZF9zZXRfc2QoY2FyZCk7CiAKLQkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChob3N0LCAmY21kLCBDTURfUkVUUklFUyk7Ci0JCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQotCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCQljbWQub3Bjb2RlID0gU0RfU0VORF9SRUxBVElWRV9BRERSOworCQkJY21kLmFyZyA9IDA7CisJCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCisJCQllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGhvc3QsICZjbWQsIENNRF9SRVRSSUVTKTsKKwkJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJZWxzZSB7CisJCQkJY2FyZC0+cmNhID0gY21kLnJlc3BbMF0gPj4gMTY7CisKKwkJCQlpZiAoIWhvc3QtPm9wcy0+Z2V0X3JvKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRvZXMgbm90ICIKKwkJCQkJCSJzdXBwb3J0IHJlYWRpbmcgcmVhZC1vbmx5ICIKKwkJCQkJCSJzd2l0Y2guIGFzc3VtaW5nIHdyaXRlLWVuYWJsZS5cbiIsCisJCQkJCQltbWNfaG9zdG5hbWUoaG9zdCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChob3N0LT5vcHMtPmdldF9ybyhob3N0KSkKKwkJCQkJCW1tY19jYXJkX3NldF9yZWFkb25seShjYXJkKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQljbWQub3Bjb2RlID0gTU1DX1NFVF9SRUxBVElWRV9BRERSOworCQkJY21kLmFyZyA9IGNhcmQtPnJjYSA8PCAxNjsKKwkJCWNtZC5mbGFncyA9IE1NQ19SU1BfUjE7CisKKwkJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgQ01EX1JFVFJJRVMpOworCQkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCX0KIAl9CiB9CiAKQEAgLTYxNyw2ICs4NzQsNzkgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIG1tY19yZWFkX3NjcnMoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCWludCBlcnI7CisJc3RydWN0IG1tY19jYXJkICpjYXJkOworCisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCXN0cnVjdCBtbWNfZGF0YSBkYXRhOworCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYXJkLCAmaG9zdC0+Y2FyZHMsIG5vZGUpIHsKKwkJaWYgKGNhcmQtPnN0YXRlICYgKE1NQ19TVEFURV9ERUFEfE1NQ19TVEFURV9QUkVTRU5UKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1tY19jYXJkX3NkKGNhcmQpKQorCQkJY29udGludWU7CisKKwkJZXJyID0gbW1jX3NlbGVjdF9jYXJkKGhvc3QsIGNhcmQpOworCQlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkgeworCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lbXNldCgmY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7CisKKwkJY21kLm9wY29kZSA9IE1NQ19BUFBfQ01EOworCQljbWQuYXJnID0gY2FyZC0+cmNhIDw8IDE2OworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCisJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgMCk7CisJCWlmICgoZXJyICE9IE1NQ19FUlJfTk9ORSkgfHwgIShjbWQucmVzcFswXSAmIFIxX0FQUF9DTUQpKSB7CisJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2NvbW1hbmQpKTsKKworCQljbWQub3Bjb2RlID0gU0RfQVBQX1NFTkRfU0NSOworCQljbWQuYXJnID0gMDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKworCQltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2RhdGEpKTsKKworCQlkYXRhLnRpbWVvdXRfbnMgPSBjYXJkLT5jc2QudGFjY19ucyAqIDEwOworCQlkYXRhLnRpbWVvdXRfY2xrcyA9IGNhcmQtPmNzZC50YWNjX2Nsa3MgKiAxMDsKKwkJZGF0YS5ibGtzel9iaXRzID0gMzsKKwkJZGF0YS5ibG9ja3MgPSAxOworCQlkYXRhLmZsYWdzID0gTU1DX0RBVEFfUkVBRDsKKwkJZGF0YS5zZyA9ICZzZzsKKwkJZGF0YS5zZ19sZW4gPSAxOworCisJCW1lbXNldCgmbXJxLCAwLCBzaXplb2Yoc3RydWN0IG1tY19yZXF1ZXN0KSk7CisKKwkJbXJxLmNtZCA9ICZjbWQ7CisJCW1ycS5kYXRhID0gJmRhdGE7CisKKwkJc2dfaW5pdF9vbmUoJnNnLCAodTgqKWNhcmQtPnJhd19zY3IsIDgpOworCisJCWVyciA9IG1tY193YWl0X2Zvcl9yZXEoaG9zdCwgJm1ycSk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2FyZC0+cmF3X3NjclswXSA9IG50b2hsKGNhcmQtPnJhd19zY3JbMF0pOworCQljYXJkLT5yYXdfc2NyWzFdID0gbnRvaGwoY2FyZC0+cmF3X3NjclsxXSk7CisKKwkJbW1jX2RlY29kZV9zY3IoY2FyZCk7CisJfQorCisJbW1jX2Rlc2VsZWN0X2NhcmRzKGhvc3QpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IG1tY19jYWxjdWxhdGVfY2xvY2soc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKQEAgLTY2OSwxMiArOTk5LDI0IEBACiAJCWludCBlcnI7CiAJCXUzMiBvY3I7CiAKKwkJaG9zdC0+bW9kZSA9IE1NQ19NT0RFX1NEOworCiAJCW1tY19wb3dlcl91cChob3N0KTsKIAkJbW1jX2lkbGVfY2FyZHMoaG9zdCk7CiAKLQkJZXJyID0gbW1jX3NlbmRfb3BfY29uZChob3N0LCAwLCAmb2NyKTsKLQkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCi0JCQlyZXR1cm47CisJCWVyciA9IG1tY19zZW5kX2FwcF9vcF9jb25kKGhvc3QsIDAsICZvY3IpOworCisJCS8qCisJCSAqIElmIHdlIGZhaWwgdG8gZGV0ZWN0IGFueSBTRCBjYXJkcyB0aGVuIHRyeQorCQkgKiBzZWFyY2hpbmcgZm9yIE1NQyBjYXJkcy4KKwkJICovCisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQlob3N0LT5tb2RlID0gTU1DX01PREVfTU1DOworCisJCQllcnIgPSBtbWNfc2VuZF9vcF9jb25kKGhvc3QsIDAsICZvY3IpOworCQkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCQkJcmV0dXJuOworCQl9CiAKIAkJaG9zdC0+b2NyID0gbW1jX3NlbGVjdF92b2x0YWdlKGhvc3QsIG9jcik7CiAKQEAgLTcxNCw3ICsxMDU2LDEwIEBACiAJICogYWxsIGdldCB0aGUgaWRlYSB0aGF0IHRoZXkgc2hvdWxkIGJlIHJlYWR5IGZvciBDTUQyLgogCSAqIChNeSBTYW5EaXNrIGNhcmQgc2VlbXMgdG8gbmVlZCB0aGlzLikKIAkgKi8KLQltbWNfc2VuZF9vcF9jb25kKGhvc3QsIGhvc3QtPm9jciwgTlVMTCk7CisJaWYgKGhvc3QtPm1vZGUgPT0gTU1DX01PREVfU0QpCisJCW1tY19zZW5kX2FwcF9vcF9jb25kKGhvc3QsIGhvc3QtPm9jciwgTlVMTCk7CisJZWxzZQorCQltbWNfc2VuZF9vcF9jb25kKGhvc3QsIGhvc3QtPm9jciwgTlVMTCk7CiAKIAltbWNfZGlzY292ZXJfY2FyZHMoaG9zdCk7CiAKQEAgLTcyNSwxOSArMTA3MCwyNiBAQAogCWhvc3QtPm9wcy0+c2V0X2lvcyhob3N0LCAmaG9zdC0+aW9zKTsKIAogCW1tY19yZWFkX2NzZHMoaG9zdCk7CisKKwlpZiAoaG9zdC0+bW9kZSA9PSBNTUNfTU9ERV9TRCkKKwkJbW1jX3JlYWRfc2Nycyhob3N0KTsKIH0KIAogCiAvKioKICAqCW1tY19kZXRlY3RfY2hhbmdlIC0gcHJvY2VzcyBjaGFuZ2Ugb2Ygc3RhdGUgb24gYSBNTUMgc29ja2V0CiAgKglAaG9zdDogaG9zdCB3aGljaCBjaGFuZ2VkIHN0YXRlLgorICoJQGRlbGF5OiBvcHRpb25hbCBkZWxheSB0byB3YWl0IGJlZm9yZSBkZXRlY3Rpb24gKGppZmZpZXMpCiAgKgogICoJQWxsIHdlIGtub3cgaXMgdGhhdCBjYXJkKHMpIGhhdmUgYmVlbiBpbnNlcnRlZCBvciByZW1vdmVkCiAgKglmcm9tIHRoZSBzb2NrZXQocykuICBXZSBkb24ndCBrbm93IHdoaWNoIHNvY2tldCBvciBjYXJkcy4KICAqLwotdm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit2b2lkIG1tY19kZXRlY3RfY2hhbmdlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdW5zaWduZWQgbG9uZyBkZWxheSkKIHsKLQlzY2hlZHVsZV93b3JrKCZob3N0LT5kZXRlY3QpOworCWlmIChkZWxheSkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0LT5kZXRlY3QsIGRlbGF5KTsKKwllbHNlCisJCXNjaGVkdWxlX3dvcmsoJmhvc3QtPmRldGVjdCk7CiB9CiAKIEVYUE9SVF9TWU1CT0wobW1jX2RldGVjdF9jaGFuZ2UpOwpAQCAtODQxLDcgKzExOTMsNyBAQAogCXJldCA9IG1tY19hZGRfaG9zdF9zeXNmcyhob3N0KTsKIAlpZiAocmV0ID09IDApIHsKIAkJbW1jX3Bvd2VyX29mZihob3N0KTsKLQkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdCk7CisJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QsIDApOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC05MTEsNyArMTI2Myw3IEBACiAgKi8KIGludCBtbWNfcmVzdW1lX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewotCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QpOworCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QsIDApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYyBiL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCmluZGV4IGQ0ZWVlOTkuLmZhODNmMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL21tY19ibG9jay5jCkBAIC05NSw2ICs5NSwxMCBAQAogCQlpZiAobWQtPnVzYWdlID09IDIpCiAJCQljaGVja19kaXNrX2NoYW5nZShpbm9kZS0+aV9iZGV2KTsKIAkJcmV0ID0gMDsKKworCQlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJbW1jX2NhcmRfcmVhZG9ubHkobWQtPnF1ZXVlLmNhcmQpKQorCQkJcmV0ID0gLUVST0ZTOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC00MDMsOSArNDA3LDEwIEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgJXMgJWRLaUJcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzICVzICVkS2lCICVzXG4iLAogCQltZC0+ZGlzay0+ZGlza19uYW1lLCBtbWNfY2FyZF9pZChjYXJkKSwgbW1jX2NhcmRfbmFtZShjYXJkKSwKLQkJKGNhcmQtPmNzZC5jYXBhY2l0eSA8PCBjYXJkLT5jc2QucmVhZF9ibGtiaXRzKSAvIDEwMjQpOworCQkoY2FyZC0+Y3NkLmNhcGFjaXR5IDw8IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMpIC8gMTAyNCwKKwkJbW1jX2NhcmRfcmVhZG9ubHkoY2FyZCk/IihybykiOiIiKTsKIAogCW1tY19zZXRfZHJ2ZGF0YShjYXJkLCBtZCk7CiAJYWRkX2Rpc2sobWQtPmRpc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwppbmRleCBhZDg5NDk4Li4zZjRhNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYworKysgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwpAQCAtMzQsNiArMzQsNyBAQAogCWNhcmQtPnJhd19jaWRbMl0sIGNhcmQtPnJhd19jaWRbM10pOwogTU1DX0FUVFIoY3NkLCAiJTA4eCUwOHglMDh4JTA4eFxuIiwgY2FyZC0+cmF3X2NzZFswXSwgY2FyZC0+cmF3X2NzZFsxXSwKIAljYXJkLT5yYXdfY3NkWzJdLCBjYXJkLT5yYXdfY3NkWzNdKTsKK01NQ19BVFRSKHNjciwgIiUwOHglMDh4XG4iLCBjYXJkLT5yYXdfc2NyWzBdLCBjYXJkLT5yYXdfc2NyWzFdKTsKIE1NQ19BVFRSKGRhdGUsICIlMDJkLyUwNGRcbiIsIGNhcmQtPmNpZC5tb250aCwgY2FyZC0+Y2lkLnllYXIpOwogTU1DX0FUVFIoZndyZXYsICIweCV4XG4iLCBjYXJkLT5jaWQuZndyZXYpOwogTU1DX0FUVFIoaHdyZXYsICIweCV4XG4iLCBjYXJkLT5jaWQuaHdyZXYpOwpAQCAtNTcsNiArNTgsOCBAQAogCV9fQVRUUl9OVUxMCiB9OwogCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgbW1jX2Rldl9hdHRyX3NjciA9IE1NQ19BVFRSX1JPKHNjcik7CisKIAogc3RhdGljIHZvaWQgbW1jX3JlbGVhc2VfY2FyZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0yMDcsMTAgKzIxMCwyMCBAQAogICovCiBpbnQgbW1jX3JlZ2lzdGVyX2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKQogeworCWludCByZXQ7CisKIAlzbnByaW50ZihjYXJkLT5kZXYuYnVzX2lkLCBzaXplb2YoY2FyZC0+ZGV2LmJ1c19pZCksCiAJCSAiJXM6JTA0eCIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY2FyZC0+cmNhKTsKIAotCXJldHVybiBkZXZpY2VfYWRkKCZjYXJkLT5kZXYpOworCXJldCA9IGRldmljZV9hZGQoJmNhcmQtPmRldik7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChtbWNfY2FyZF9zZChjYXJkKSkgeworCQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjYXJkLT5kZXYsICZtbWNfZGV2X2F0dHJfc2NyKTsKKwkJCWlmIChyZXQpCisJCQkJZGV2aWNlX2RlbCgmY2FyZC0+ZGV2KTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMjE5LDggKzIzMiwxMiBAQAogICovCiB2b2lkIG1tY19yZW1vdmVfY2FyZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCiB7Ci0JaWYgKG1tY19jYXJkX3ByZXNlbnQoY2FyZCkpCisJaWYgKG1tY19jYXJkX3ByZXNlbnQoY2FyZCkpIHsKKwkJaWYgKG1tY19jYXJkX3NkKGNhcmQpKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZjYXJkLT5kZXYsICZtbWNfZGV2X2F0dHJfc2NyKTsKKwogCQlkZXZpY2VfZGVsKCZjYXJkLT5kZXYpOworCX0KIAogCXB1dF9kZXZpY2UoJmNhcmQtPmRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNpLmMgYi9kcml2ZXJzL21tYy9tbWNpLmMKaW5kZXggNzE2YzRlZi4uOTFjNzQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL21tY2kuYwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAKIAlzdGF0dXMgPSBob3N0LT5wbGF0LT5zdGF0dXMobW1jX2Rldihob3N0LT5tbWMpKTsKIAlpZiAoc3RhdHVzIF4gaG9zdC0+b2xkc3RhdCkKLQkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jKTsKKwkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCAwKTsKIAogCWhvc3QtPm9sZHN0YXQgPSBzdGF0dXM7CiAJbW9kX3RpbWVyKCZob3N0LT50aW1lciwgamlmZmllcyArIEhaKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3B4YW1jaS5jIGIvZHJpdmVycy9tbWMvcHhhbWNpLmMKaW5kZXggYjc4YmViMS4uYjUzYWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvcHhhbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvcHhhbWNpLmMKQEAgLTM2Miw2ICszNjIsMTYgQEAKIAlweGFtY2lfc3RhcnRfY21kKGhvc3QsIG1ycS0+Y21kLCBjbWRhdCk7CiB9CiAKK3N0YXRpYyBpbnQgcHhhbWNpX2dldF9ybyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3sKKwlzdHJ1Y3QgcHhhbWNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCisJaWYgKGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5nZXRfcm8pCisJCXJldHVybiBob3N0LT5wZGF0YS0+Z2V0X3JvKG1tYy0+ZGV2KTsKKwkvKiBIb3N0IGRvZXNuJ3Qgc3VwcG9ydCByZWFkIG9ubHkgZGV0ZWN0aW9uIHNvIGFzc3VtZSB3cml0ZWFibGUgKi8KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgcHhhbWNpX3NldF9pb3Moc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfaW9zICppb3MpCiB7CiAJc3RydWN0IHB4YW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKQEAgLTQwMSw2ICs0MTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBweGFtY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gcHhhbWNpX3JlcXVlc3QsCisJLmdldF9ybwkJPSBweGFtY2lfZ2V0X3JvLAogCS5zZXRfaW9zCT0gcHhhbWNpX3NldF9pb3MsCiB9OwogCkBAIC00MTIsNyArNDIzLDkgQEAKIAogc3RhdGljIGlycXJldHVybl90IHB4YW1jaV9kZXRlY3RfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQltbWNfZGV0ZWN0X2NoYW5nZShkZXZpZCk7CisJc3RydWN0IHB4YW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYoZGV2aWQpOworCisJbW1jX2RldGVjdF9jaGFuZ2UoZGV2aWQsIGhvc3QtPnBkYXRhLT5kZXRlY3RfZGVsYXkpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvd2JzZC5jIGIvZHJpdmVycy9tbWMvd2JzZC5jCmluZGV4IDA4YWUyMmEuLmUxMWU1NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL3dic2QuYworKysgYi9kcml2ZXJzL21tYy93YnNkLmMKQEAgLTcyMCwxMSArNzIwLDI4IEBACiAJICogY2FsY3VsYXRlIENSQy4KIAkgKgogCSAqIFNwYWNlIGZvciBDUkMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgc2l6ZS4KKwkgKiBUd28gYnl0ZXMgYXJlIG5lZWRlZCBmb3IgZWFjaCBkYXRhIGxpbmUuCiAJICovCi0JYmxrc2l6ZSA9ICgxIDw8IGRhdGEtPmJsa3N6X2JpdHMpICsgMjsKKwlpZiAoaG9zdC0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfMSkKKwl7CisJCWJsa3NpemUgPSAoMSA8PCBkYXRhLT5ibGtzel9iaXRzKSArIDI7CisKKwkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9QQlNNU0IsIChibGtzaXplID4+IDQpICYgMHhGMCk7CisJCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUEJTTFNCLCBibGtzaXplICYgMHhGRik7CisJfQorCWVsc2UgaWYgKGhvc3QtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpCisJeworCQlibGtzaXplID0gKDEgPDwgZGF0YS0+Ymxrc3pfYml0cykgKyAyICogNDsKIAkKLQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1BCU01TQiwgKGJsa3NpemUgPj4gNCkgJiAweEYwKTsKLQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1BCU0xTQiwgYmxrc2l6ZSAmIDB4RkYpOworCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1BCU01TQiwgKChibGtzaXplID4+IDQpICYgMHhGMCkKKwkJCXwgV0JTRF9EQVRBX1dJRFRIKTsKKwkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9QQlNMU0IsIGJsa3NpemUgJiAweEZGKTsKKwl9CisJZWxzZQorCXsKKwkJZGF0YS0+ZXJyb3IgPSBNTUNfRVJSX0lOVkFMSUQ7CisJCXJldHVybjsKKwl9CiAKIAkvKgogCSAqIENsZWFyIHRoZSBGSUZPLiBUaGlzIGlzIG5lZWRlZCBldmVuIGZvciBETUEKQEAgLTk2MCw5ICs5NzcsOSBAQAogCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSBtbWNfcHJpdihtbWMpOwogCXU4IGNsaywgc2V0dXAsIHB3cjsKIAkKLQlEQkdGKCJjbG9jayAldUh6IGJ1c21vZGUgJXUgcG93ZXJtb2RlICV1IGNzICV1IFZkZCAldVxuIiwKLQkJaW9zLT5jbG9jaywgaW9zLT5idXNfbW9kZSwgaW9zLT5wb3dlcl9tb2RlLCBpb3MtPmNoaXBfc2VsZWN0LAotCQlpb3MtPnZkZCk7CisJREJHRigiY2xvY2sgJXVIeiBidXNtb2RlICV1IHBvd2VybW9kZSAldSBjcyAldSBWZGQgJXUgd2lkdGggJXVcbiIsCisJICAgICBpb3MtPmNsb2NrLCBpb3MtPmJ1c19tb2RlLCBpb3MtPnBvd2VyX21vZGUsIGlvcy0+Y2hpcF9zZWxlY3QsCisJICAgICBpb3MtPnZkZCwgaW9zLT5idXNfd2lkdGgpOwogCiAJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKIApAQCAtMTAxMCw2ICsxMDI3LDcgQEAKIAlzZXR1cCA9IHdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9TRVRVUCk7CiAJaWYgKGlvcy0+Y2hpcF9zZWxlY3QgPT0gTU1DX0NTX0hJR0gpCiAJeworCQlCVUdfT04oaW9zLT5idXNfd2lkdGggIT0gTU1DX0JVU19XSURUSF8xKTsKIAkJc2V0dXAgfD0gV0JTRF9EQVQzX0g7CiAJCWhvc3QtPmZsYWdzIHw9IFdCU0RfRklHTk9SRV9ERVRFQ1Q7CiAJfQpAQCAtMTAyNSwxMiArMTA0Myw0MSBAQAogCX0KIAl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1NFVFVQLCBzZXR1cCk7CiAJCisJLyoKKwkgKiBTdG9yZSBidXMgd2lkdGggZm9yIGxhdGVyLiBXaWxsIGJlIHVzZWQgd2hlbgorCSAqIHNldHRpbmcgdXAgdGhlIGRhdGEgdHJhbnNmZXIuCisJICovCisJaG9zdC0+YnVzX3dpZHRoID0gaW9zLT5idXNfd2lkdGg7CisKIAlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CiB9CiAKK3N0YXRpYyBpbnQgd2JzZF9nZXRfcm8oc3RydWN0IG1tY19ob3N0KiBtbWMpCit7CisJc3RydWN0IHdic2RfaG9zdCogaG9zdCA9IG1tY19wcml2KG1tYyk7CisJdTggY3NyOworCisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKworCWNzciA9IGluYihob3N0LT5iYXNlICsgV0JTRF9DU1IpOworCWNzciB8PSBXQlNEX01TTEVEOworCW91dGIoY3NyLCBob3N0LT5iYXNlICsgV0JTRF9DU1IpOworCisJbWRlbGF5KDEpOworCisJY3NyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUik7CisJY3NyICY9IH5XQlNEX01TTEVEOworCW91dGIoY3NyLCBob3N0LT5iYXNlICsgV0JTRF9DU1IpOworCisJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOworCisJcmV0dXJuIGNzciAmIFdCU0RfV1JQVDsKK30KKwogc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgd2JzZF9vcHMgPSB7CiAJLnJlcXVlc3QJPSB3YnNkX3JlcXVlc3QsCiAJLnNldF9pb3MJPSB3YnNkX3NldF9pb3MsCisJLmdldF9ybwkJPSB3YnNkX2dldF9ybywKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKQEAgLTEwNjUsMjAgKzExMTIsNiBAQAogfQogCiAvKgotICogSGVscGVyIGZ1bmN0aW9uIGZvciBjYXJkIGRldGVjdGlvbgotICovCi1zdGF0aWMgdm9pZCB3YnNkX2RldGVjdF9jYXJkKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QqKWRhdGE7Ci0JCi0JQlVHX09OKGhvc3QgPT0gTlVMTCk7Ci0JCi0JREJHKCJFeGVjdXRpbmcgY2FyZCBkZXRlY3Rpb25cbiIpOwotCQotCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYyk7CQotfQotCi0vKgogICogVGFza2xldHMKICAqLwogCkBAIC0xMTIyLDE0ICsxMTU1LDE2IEBACiAJCQlEQkcoIkNhcmQgaW5zZXJ0ZWRcbiIpOwogCQkJaG9zdC0+ZmxhZ3MgfD0gV0JTRF9GQ0FSRF9QUkVTRU5UOwogCQkJCisJCQlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisKIAkJCS8qCiAJCQkgKiBEZWxheSBjYXJkIGRldGVjdGlvbiB0byBhbGxvdyBlbGVjdHJpY2FsIGNvbm5lY3Rpb25zCiAJCQkgKiB0byBzdGFiaWxpc2UuCiAJCQkgKi8KLQkJCW1vZF90aW1lcigmaG9zdC0+ZGV0ZWN0X3RpbWVyLCBqaWZmaWVzICsgSFovMik7CisJCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CiAJCX0KLQkJCi0JCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKKwkJZWxzZQorCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCX0KIAllbHNlIGlmIChob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkKIAl7CkBAIC0xMTUxLDcgKzExODYsNyBAQAogCQkgKi8KIAkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCi0JCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYyk7CisJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgMCk7CiAJfQogCWVsc2UKIAkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwpAQCAtMTM1NSwxNiArMTM5MCwxMyBAQAogCW1tYy0+Zl9taW4gPSAzNzUwMDA7CiAJbW1jLT5mX21heCA9IDI0MDAwMDAwOwogCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0OworCW1tYy0+Y2FwcyA9IE1NQ19DQVBfNF9CSVRfREFUQTsKIAkKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CiAJCiAJLyoKIAkgKiBTZXQgdXAgdGltZXJzCiAJICovCi0JaW5pdF90aW1lcigmaG9zdC0+ZGV0ZWN0X3RpbWVyKTsKLQlob3N0LT5kZXRlY3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWhvc3Q7Ci0JaG9zdC0+ZGV0ZWN0X3RpbWVyLmZ1bmN0aW9uID0gd2JzZF9kZXRlY3RfY2FyZDsKLQogCWluaXRfdGltZXIoJmhvc3QtPmlnbm9yZV90aW1lcik7CiAJaG9zdC0+aWdub3JlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylob3N0OwogCWhvc3QtPmlnbm9yZV90aW1lci5mdW5jdGlvbiA9IHdic2RfcmVzZXRfaWdub3JlOwpAQCAtMTQwNiw3ICsxNDM4LDYgQEAKIAlCVUdfT04oaG9zdCA9PSBOVUxMKTsKIAkKIAlkZWxfdGltZXJfc3luYygmaG9zdC0+aWdub3JlX3RpbWVyKTsKLQlkZWxfdGltZXJfc3luYygmaG9zdC0+ZGV0ZWN0X3RpbWVyKTsKIAkKIAltbWNfZnJlZV9ob3N0KG1tYyk7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy93YnNkLmggYi9kcml2ZXJzL21tYy93YnNkLmgKaW5kZXggOGFmNDM1NC4uOTAwNWI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5oCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuaApAQCAtMTA2LDYgKzEwNiw4IEBACiAjZGVmaW5lIFdCU0RfQ0xLXzE2TQkJMHgwMgogI2RlZmluZSBXQlNEX0NMS18yNE0JCTB4MDMKIAorI2RlZmluZSBXQlNEX0RBVEFfV0lEVEgJCTB4MDEKKwogI2RlZmluZSBXQlNEX0RBVDNfSAkJMHgwOAogI2RlZmluZSBXQlNEX0ZJRk9fUkVTRVQJCTB4MDQKICNkZWZpbmUgV0JTRF9TT0ZUX1JFU0VUCQkweDAyCkBAIC0xNjQsNiArMTY2LDcgQEAKIAlpbnQJCQlmaXJzdGVycjsJLyogU2VlIGZpZm8gZnVuY3Rpb25zICovCiAJCiAJdTgJCQljbGs7CQkvKiBDdXJyZW50IGNsb2NrIHNwZWVkICovCisJdW5zaWduZWQgY2hhcgkJYnVzX3dpZHRoOwkvKiBDdXJyZW50IGJ1cyB3aWR0aCAqLwogCQogCWludAkJCWNvbmZpZzsJCS8qIENvbmZpZyBwb3J0ICovCiAJdTgJCQl1bmxvY2tfY29kZTsJLyogQ29kZSB0byB1bmxvY2sgY29uZmlnICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYwppbmRleCBiYjcxM2ZlLi4xNDQzMTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMKQEAgLTkxLDggKzkxLDcgQEAKIHsKIAlpZiAobXRkX2luZm8pIHsKIAkJZGVsX210ZF9kZXZpY2UobXRkX2luZm8pOwotCQlpZiAobXRkX2luZm8tPnByaXYpCi0JCQl2ZnJlZShtdGRfaW5mby0+cHJpdik7CisJCXZmcmVlKG10ZF9pbmZvLT5wcml2KTsKIAkJa2ZyZWUobXRkX2luZm8pOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2Z0bC5jIGIvZHJpdmVycy9tdGQvZnRsLmMKaW5kZXggZDlhYjYwYi4uZDMyYzFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvZnRsLmMKQEAgLTEwMTcsMjcgKzEwMTcsMTYgQEAKIAogdm9pZCBmdGxfZnJlZXBhcnQocGFydGl0aW9uX3QgKnBhcnQpCiB7Ci0gICAgaWYgKHBhcnQtPlZpcnR1YWxCbG9ja01hcCkgewogCXZmcmVlKHBhcnQtPlZpcnR1YWxCbG9ja01hcCk7CiAJcGFydC0+VmlydHVhbEJsb2NrTWFwID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBhcnQtPlZpcnR1YWxQYWdlTWFwKSB7CiAJa2ZyZWUocGFydC0+VmlydHVhbFBhZ2VNYXApOwogCXBhcnQtPlZpcnR1YWxQYWdlTWFwID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBhcnQtPkVVTkluZm8pIHsKIAlrZnJlZShwYXJ0LT5FVU5JbmZvKTsKIAlwYXJ0LT5FVU5JbmZvID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBhcnQtPlhmZXJJbmZvKSB7CiAJa2ZyZWUocGFydC0+WGZlckluZm8pOwogCXBhcnQtPlhmZXJJbmZvID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBhcnQtPmJhbV9jYWNoZSkgewogCWtmcmVlKHBhcnQtPmJhbV9jYWNoZSk7CiAJcGFydC0+YmFtX2NhY2hlID0gTlVMTDsKLSAgICB9Ci0gICAgCiB9IC8qIGZ0bF9mcmVlcGFydCAqLwogCiBzdGF0aWMgdm9pZCBmdGxfYWRkX210ZChzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyAqdHIsIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKaW5kZXggZWVlNTExNS4uMDRlNTQzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCkBAIC01MjYsNiArNTI2LDcgQEAKIAlkbyB7CiAJCWlmICh0aGlzLT5kZXZfcmVhZHkobXRkKSkKIAkJCXJldHVybjsKKwkJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvKSk7CQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzU5eC5jIGIvZHJpdmVycy9uZXQvM2M1OXguYwppbmRleCAwNzc0NmI5Li40NTViYTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzU5eC5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKQEAgLTk3Myw2ICs5NzMsMTEgQEAKIAkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKIAkJCXZvcnRleF9kb3duKGRldiwgMSk7CiAJCX0KKwkJcGNpX3NhdmVfc3RhdGUocGRldik7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgMCk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTk4MCw4ICs5ODUsMTkgQEAKIHN0YXRpYyBpbnQgdm9ydGV4X3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChkZXYgJiYgZGV2LT5wcml2KSB7CisJaWYgKGRldiAmJiB2cCkgeworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgdnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCA/CisJCQkJJmJvb21lcmFuZ19pbnRlcnJ1cHQgOiAmdm9ydGV4X2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCByZXNlcnZlIElSUSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CiAJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJCXZvcnRleF91cChkZXYpOwogCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwpAQCAtMTg3Myw2ICsxODg5LDcgQEAKIAkJewogCQkJc3Bpbl9sb2NrX2JoKCZ2cC0+bG9jayk7CiAJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgdnAtPnBoeXNbMF0sIDEpOworCQkJbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCAxKTsKIAkJCW9rID0gMTsKIAkJCWlmICh2b3J0ZXhfZGVidWcgPiAyKQogCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIHRyYW5zY2VpdmVyIGhhcyBzdGF0dXMgJTQuNHguXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggYWU5ZTdhNS4uNmJiOTIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yMDU4LDYgKzIwNTgsMTMgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGJueDIuICBUaGlzIGlzIHJlY29tbWVuZGVkLgogCitjb25maWcgU1BJREVSX05FVAorCXRyaXN0YXRlICJTcGlkZXIgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kgJiYgUFBDX0JQQQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBHaWdhYml0IEV0aGVybmV0IGNoaXBzIHByZXNlbnQgb24gdGhlCisJICBDZWxsIFByb2Nlc3Nvci1CYXNlZCBCbGFkZXMgZnJvbSBJQk0uCisKIGNvbmZpZyBHSUFORkFSCiAJdHJpc3RhdGUgIkdpYW5mYXIgRXRoZXJuZXQiCiAJZGVwZW5kcyBvbiA4NXh4IHx8IDgzeHgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggNWJhYWZjZC4uODY0NWM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTU0LDYgKzU0LDggQEAKIG9iai0kKENPTkZJR19GRUFMTlgpICs9IGZlYWxueC5vCiBvYmotJChDT05GSUdfVElHT04zKSArPSB0ZzMubwogb2JqLSQoQ09ORklHX0JOWDIpICs9IGJueDIubworc3BpZGVybmV0LXkgKz0gc3BpZGVyX25ldC5vIHNwaWRlcl9uZXRfZXRodG9vbC5vIHN1bmdlbV9waHkubworb2JqLSQoQ09ORklHX1NQSURFUl9ORVQpICs9IHNwaWRlcm5ldC5vCiBvYmotJChDT05GSUdfVEMzNTgxNSkgKz0gdGMzNTgxNS5vCiBvYmotJChDT05GSUdfU0tHRSkgKz0gc2tnZS5vCiBvYmotJChDT05GSUdfU0s5OExJTikgKz0gc2s5OGxpbi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FjMzIwMC5jIGIvZHJpdmVycy9uZXQvYWMzMjAwLmMKaW5kZXggOTE3OTFiYS4uOGEwYWY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYWMzMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvYWMzMjAwLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogCXJldHVybiAwOwogb3V0MjoKIAlpZiAoZWlfc3RhdHVzLnJlZzApCi0JCWlvdW5tYXAoKHZvaWQgKilkZXYtPm1lbV9zdGFydCk7CisJCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CiBvdXQxOgogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCmluZGV4IDRmOWY2OWUuLjEyZWY1MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCXN0cnVjdCBBcmNQcm90byAqcHJvdG87CiAJaW50IHR4YnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGZyZWVza2IgPSAwOworCWludCBmcmVlc2tiLCByZXR2YWw7CiAKIAlCVUdNU0coRF9EVVJJTkcsCiAJICAgICAgICJ0cmFuc21pdCByZXF1ZXN0ZWQgKHN0YXR1cz0lWGgsIHR4YnVmcz0lZC8lZCwgbGVuPSVkLCBwcm90b2NvbCAleClcbiIsCkBAIC02MTUsNyArNjE1LDcgQEAKIAlpZiAoc2tiLT5sZW4gLSBBUkNfSERSX1NJWkUgPiBYTVRVICYmICFwcm90by0+Y29udGludWVfdHgpIHsKIAkJQlVHTVNHKERfTk9STUFMLCAiZml4bWU6IHBhY2tldCB0b28gbGFyZ2U6IGNvbXBlbnNhdGluZyBiYWRseSFcbiIpOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwkvKiBkb24ndCB0cnkgYWdhaW4gKi8KKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsJLyogZG9uJ3QgdHJ5IGFnYWluICovCiAJfQogCiAJLyogV2UncmUgYnVzeSB0cmFuc21pdHRpbmcgYSBwYWNrZXQuLi4gKi8KQEAgLTYyMyw4ICs2MjMsMTEgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOwogCUFJTlRNQVNLKDApOwotCi0JdHhidWYgPSBnZXRfYXJjYnVmKGRldik7CisJaWYobHAtPm5leHRfdHggPT0gLTEpCisJCXR4YnVmID0gZ2V0X2FyY2J1ZihkZXYpOworCWVsc2UgeworCQl0eGJ1ZiA9IC0xOworCX0KIAlpZiAodHhidWYgIT0gLTEpIHsKIAkJaWYgKHByb3RvLT5wcmVwYXJlX3R4KGRldiwgcGt0LCBza2ItPmxlbiwgdHhidWYpICYmCiAJCSAgICAhcHJvdG8tPmFja190eCkgewpAQCAtNjM4LDYgKzY0MSw4IEBACiAJCQlscC0+b3V0Z29pbmcuc2tiID0gc2tiOwogCQkJbHAtPm91dGdvaW5nLnBrdCA9IHBrdDsKIAorCQkJZnJlZXNrYiA9IDA7CisKIAkJCWlmIChwcm90by0+Y29udGludWVfdHggJiYKIAkJCSAgICBwcm90by0+Y29udGludWVfdHgoZGV2LCB0eGJ1ZikpIHsKIAkJCSAgQlVHTVNHKERfTk9STUFMLApAQCAtNjQ1LDEwICs2NTAsMTIgQEAKIAkJCQkgIihwcm90bz0nJWMnKVxuIiwgcHJvdG8tPnN1ZmZpeCk7CiAJCQl9CiAJCX0KLQorCQlyZXR2YWwgPSBORVRERVZfVFhfT0s7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCQlscC0+bmV4dF90eCA9IHR4YnVmOwogCX0gZWxzZSB7Ci0JCWZyZWVza2IgPSAxOworCQlyZXR2YWwgPSBORVRERVZfVFhfQlVTWTsKKwkJZnJlZXNrYiA9IDA7CiAJfQogCiAJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzLCBzdGF0dXM6ICV4XG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyxBU1RBVFVTKCkpOwpAQCAtNjY0LDcgKzY3MSw3IEBACiAJaWYgKGZyZWVza2IpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCX0KLQlyZXR1cm4gMDsJCS8qIG5vIG5lZWQgdG8gdHJ5IGFnYWluICovCisJcmV0dXJuIHJldHZhbDsJCS8qIG5vIG5lZWQgdG8gdHJ5IGFnYWluICovCiB9CiAKIApAQCAtNjkwLDcgKzY5Nyw2IEBACiAJLyogc3RhcnQgc2VuZGluZyAqLwogCUFDT01NQU5EKFRYY21kIHwgKGxwLT5jdXJfdHggPDwgMykpOwogCi0JZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAlscC0+bGFzdHRyYW5zX2Rlc3QgPSBscC0+bGFzdGxvYWRfZGVzdDsKIAlscC0+bGFzdGxvYWRfZGVzdCA9IDA7CkBAIC05MTcsNiArOTIzLDkgQEAKIAogCQkJQlVHTVNHKERfUkVDT04sICJOZXR3b3JrIHJlY29uZmlndXJhdGlvbiBkZXRlY3RlZCAoc3RhdHVzPSVYaClcbiIsCiAJCQkgICAgICAgc3RhdHVzKTsKKwkJCS8qIE1ZUkVDT04gYml0IGlzIGF0IGJpdCA3IG9mIGRpYWdzdGF0dXMgKi8KKwkJCWlmKGRpYWdzdGF0dXMgJiAweDgwKQorCQkJCUJVR01TRyhEX1JFQ09OLCJQdXQgb3V0IHRoYXQgcmVjb24gbXlzZWxmXG4iKTsKIAogCQkJLyogaXMgdGhlIFJFQ09OIGluZm8gZW1wdHkgb3Igb2xkPyAqLwogCQkJaWYgKCFscC0+Zmlyc3RfcmVjb24gfHwgIWxwLT5sYXN0X3JlY29uIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jCmluZGV4IDE3OThjZTcuLjAwOTUzODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYworKysgYi9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBiaW9uZXRfdGljayh1bnNpZ25lZCBsb25nKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGJpb25ldF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKGJpb25ldF90aWNrLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoYmlvbmV0X3RpbWVyLCBiaW9uZXRfdGljaywgMCwgMCk7CiAKICNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIDB4ZmYwMDAwMDApID09IDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYwppbmRleCA4MWMzNjJjLi44Yjk5NzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IHBhbXNuZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcGFtc25ldF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKHBhbXNuZXRfdGljaywgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHBhbXNuZXRfdGltZXIsIHBhbXNuZXRfdGljaywgMCwgMCk7CiAKICNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIDB4ZmYwMDAwMDApID09IDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYwppbmRleCBhZDAxMTIxLi5lMDFiNmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCkBAIC0yMzUsNyArMjM1LDcgQEAKICNkZWZpbmUJTUVNCQlscC0+bWVtCiAjZGVmaW5lCURSRUcJSU8tPmRhdGEKICNkZWZpbmUJQVJFRwlJTy0+YWRkcgotI2RlZmluZQlSRUdBKGEpCSggQVJFRyA9IChhKSwgRFJFRyApCisjZGVmaW5lCVJFR0EoYSkJKCooIEFSRUcgPSAoYSksICZEUkVHICkpCiAKIC8qIERlZmluaXRpb25zIGZvciBwYWNrZXQgYnVmZmVyIGFjY2VzczogKi8KICNkZWZpbmUgUEtUX0JVRl9TWgkJMTU0NApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5jIGIvZHJpdmVycy9uZXQvYm54Mi5jCmluZGV4IDU1YTcyYzcuLjgzNTk4ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ibngyLmMKQEAgLTE0LDggKzE0LDggQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyIgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjIuMjAiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiQXVndXN0IDIyLCAyMDA1IgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMi4yMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJTZXB0ZW1iZXIgNywgMjAwNSIKIAogI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCiAKQEAgLTE1MzMsNiArMTUzMyw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKIAlzdHJ1Y3QgYm54MiAqYnAgPSBkZXYtPnByaXY7CiAKKwlwcmVmZXRjaChicC0+c3RhdHVzX2Jsayk7CiAJUkVHX1dSKGJwLCBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRCwKIAkJQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfVVNFX0lOVF9IQ19QQVJBTSB8CiAJCUJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01EX01BU0tfSU5UKTsKQEAgLTE1NTgsNyArMTU1OSw3IEBACiAJICogV2hlbiB1c2luZyBNU0ksIHRoZSBNU0kgbWVzc2FnZSB3aWxsIGFsd2F5cyBjb21wbGV0ZSBhZnRlcgogCSAqIHRoZSBzdGF0dXMgYmxvY2sgd3JpdGUuCiAJICovCi0JaWYgKChicC0+c3RhdHVzX2Jsay0+c3RhdHVzX2lkeCA9PSBicC0+bGFzdF9zdGF0dXNfaWR4KSB8fAorCWlmICgoYnAtPnN0YXR1c19ibGstPnN0YXR1c19pZHggPT0gYnAtPmxhc3Rfc3RhdHVzX2lkeCkgJiYKIAkgICAgKFJFR19SRChicCwgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVMpICYKIAkgICAgIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX0lOVEFfVkFMVUUpKQogCQlyZXR1cm4gSVJRX05PTkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmggYi9kcml2ZXJzL25ldC9ibngyLmgKaW5kZXggOWFkM2Y1Ny4uNjI4NTdiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Mi5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDIuaApAQCAtNTAsNiArNTAsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCiAvKiBIYXJkd2FyZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlZ2lzdGVyIGRlZmluaXRpb25zIGF1dG9tYXRpY2FsbHkKICAqIGdlbmVyYXRlZCBmcm9tIFJUTCBjb2RlLiBEbyBub3QgbW9kaWZ5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYnNkX2NvbXAuYyBiL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMKaW5kZXggM2Q4OGFkNi4uZmI0MDk4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYnNkX2NvbXAuYworKysgYi9kcml2ZXJzL25ldC9ic2RfY29tcC5jCkBAIC0zMjMsMzMgKzMyMywyNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIGJzZF9mcmVlICh2b2lkICpzdGF0ZSkKLSAgewotICAgIHN0cnVjdCBic2RfZGIgKmRiID0gKHN0cnVjdCBic2RfZGIgKikgc3RhdGU7Cit7CisJc3RydWN0IGJzZF9kYiAqZGIgPSBzdGF0ZTsKICAgICAKLSAgICBpZiAoZGIpCi0gICAgICB7CisJaWYgKCFkYikKKwkJcmV0dXJuOworCiAvKgogICogUmVsZWFzZSB0aGUgZGljdGlvbmFyeQogICovCi0JaWYgKGRiLT5kaWN0KQotCSAgewotCSAgICB2ZnJlZSAoZGItPmRpY3QpOwotCSAgICBkYi0+ZGljdCA9IE5VTEw7Ci0JICB9CisJdmZyZWUoZGItPmRpY3QpOworCWRiLT5kaWN0ID0gTlVMTDsKIC8qCiAgKiBSZWxlYXNlIHRoZSBzdHJpbmcgYnVmZmVyCiAgKi8KLQlpZiAoZGItPmxlbnMpCi0JICB7Ci0JICAgIHZmcmVlIChkYi0+bGVucyk7Ci0JICAgIGRiLT5sZW5zID0gTlVMTDsKLQkgIH0KKwl2ZnJlZShkYi0+bGVucyk7CisJZGItPmxlbnMgPSBOVUxMOwogLyoKICAqIEZpbmFsbHkgcmVsZWFzZSB0aGUgc3RydWN0dXJlIGl0c2VsZi4KICAqLwotCWtmcmVlIChkYik7Ci0gICAgICB9Ci0gIH0KKwlrZnJlZShkYik7Cit9CiAKIC8qCiAgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSAoZGUpIGNvbXByZXNzb3IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCmluZGV4IDQ0MjY3MDguLmI2OGI5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC0zODQsOCArMzg0LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0d29ya190cl9jdHJsX3NoYWRvdyA9IDA7CiAKIC8qIE5ldHdvcmsgc3BlZWQgaW5kaWNhdGlvbi4gKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzcGVlZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNsZWFyX2xlZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzcGVlZF90aW1lciwgTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGNsZWFyX2xlZF90aW1lciwgTlVMTCwgMCwgMCk7CiBzdGF0aWMgaW50IGN1cnJlbnRfc3BlZWQ7IC8qIFNwZWVkIHJlYWQgZnJvbSB0cmFuc2NlaXZlciAqLwogc3RhdGljIGludCBjdXJyZW50X3NwZWVkX3NlbGVjdGlvbjsgLyogU3BlZWQgc2VsZWN0ZWQgYnkgdXNlciAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGVkX25leHRfdGltZTsKQEAgLTM5Myw3ICszOTMsNyBAQAogc3RhdGljIGludCByeF9xdWV1ZV9sZW47CiAKIC8qIER1cGxleCAqLwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGR1cGxleF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkdXBsZXhfdGltZXIsIE5VTEwsIDAsIDApOwogc3RhdGljIGludCBmdWxsX2R1cGxleDsKIHN0YXRpYyBlbnVtIGR1cGxleCBjdXJyZW50X2R1cGxleDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmMgYi9kcml2ZXJzL25ldC9jczg5eDAuYwppbmRleCBiNzgwMzA3Li5jZGMwN2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jczg5eDAuYworKysgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpAQCAtMjQ3LDYgKzI0Nyw5IEBACiBzdGF0aWMgaW50IGdldF9lZXByb21fY2tzdW0oaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpOwogc3RhdGljIGludCBzZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CiBzdGF0aWMgdm9pZCBjb3VudF9yeF9lcnJvcnMoaW50IHN0YXR1cywgc3RydWN0IG5ldF9sb2NhbCAqbHApOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuZXRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCiAjaWYgQUxMT1dfRE1BCiBzdGF0aWMgdm9pZCBnZXRfZG1hX2NoYW5uZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCByZWxlYXNlX2RtYV9idWZmKHN0cnVjdCBuZXRfbG9jYWwgKmxwKTsKQEAgLTQwNSw2ICs0MDgsMTkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgbmV0Y29uc29sZSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICogdG8gYWxsb3cgbmV0d29yayBpL28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBuZXRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCW5ldF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKwogLyogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiAgTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKICAgIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAogICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCkBAIC03NjAsNiArNzc2LDkgQEAKIAlkZXYtPmdldF9zdGF0cwkJPSBuZXRfZ2V0X3N0YXRzOwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OwogCWRldi0+c2V0X21hY19hZGRyZXNzIAk9IHNldF9tYWNfYWRkcmVzczsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyCT0gbmV0X3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgogCiAJcHJpbnRrKCJcbiIpOwogCWlmIChuZXRfZGVidWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCmluZGV4IDY0NDBhODkuLmU1NGZjMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1kbTkwMDBfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK2RtOTAwMF9kcnZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggN2Q5Mzk0OC4uZDZlZWZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTEzNzIsNyArMTM3Miw3IEBACiAKIAkvKiBzeW5jaHJvbml6ZWQgYWdhaW5zdCBvcGVuIDogcnRubF9sb2NrKCkgaGVsZCBieSBjYWxsZXIgKi8KIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXU4ICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCQl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCQkvKgogCQkgKiBJdCBzZWVtcyB0aGF0IHRoZSBuaWMgcHJlbG9hZHMgdmFsaWQgcmluZyBlbnRyaWVzIGludG8gYW4KIAkJICogaW50ZXJuYWwgYnVmZmVyLiBUaGUgcHJvY2VkdXJlIGZvciBmbHVzaGluZyBldmVyeXRoaW5nIGlzCkBAIC0xNDIzLDcgKzE0MjMsNyBAQAogCiBzdGF0aWMgdm9pZCBudl9jb3B5X21hY190b19odyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXU4ICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CiAJdTMyIG1hY1syXTsKIAogCW1hY1swXSA9IChkZXYtPmRldl9hZGRyWzBdIDw8IDApICsgKGRldi0+ZGV2X2FkZHJbMV0gPDwgOCkgKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCmluZGV4IGQ5ZGYxZDkuLmJjOWEzYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYworKysgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKQEAgLTIwNCw2ICsyMDQsMTAgQEAKIAogI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCiAKKyNpZm5kZWYgQUREUkxFTgorI2RlZmluZSBBRERSTEVOIDMyCisjZW5kaWYKKwogLyogQ29uZGVuc2VkIGJ1cytlbmRpYW4gcG9ydGFiaWxpdHkgb3BlcmF0aW9ucy4gKi8KICNpZiBBRERSTEVOID09IDY0CiAjZGVmaW5lIGNwdV90b19sZVhYKGFkZHIpCWNwdV90b19sZTY0KGFkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jCmluZGV4IDQxMjEzZWYuLmY1MmVlMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIHN0YXRpYyBjaGFyIGF4MjVfdGVzdFs3XSA9CiB7J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDF9OwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgeWFtX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHlhbV90aW1lciwgTlVMTCwgMCwgMCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKaW5kZXggNDZlMDAyMi4uNmM3NjZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIElSREFfVVNCX1NQRUVEX01UVSwKICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9idWxrX2NhbGxiYWNrLCBzZWxmKTsKIAl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBVU0JfSVJEQV9IRUFERVI7Ci0JdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CisJdXJiLT50cmFuc2Zlcl9mbGFncyA9IDA7CiAKIAkvKiBJcnEgZGlzYWJsZWQgLT4gR0ZQX0FUT01JQyAqLwogCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKQEAgLTQwMSwxNSArNDAxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kYXRhLCBJUkRBX1NLQl9NQVhfTVRVLAogICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1bGtfY2FsbGJhY2ssIHNrYik7CiAJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2tiLT5sZW47Ci0JLyogTm90ZSA6IHVubGluayAqbXVzdCogYmUgQXN5bmNocm9ub3VzIGJlY2F1c2Ugb2YgdGhlIGNvZGUgaW4gCi0JICogaXJkYV91c2JfbmV0X3RpbWVvdXQoKSAtPiBjYWxsIGluIGlycSAtIEplYW4gSUkgKi8KLQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKIAkvKiBUaGlzIGZsYWcgKFVSQl9aRVJPX1BBQ0tFVCkgaW5kaWNhdGVzIHRoYXQgd2hhdCB3ZSBzZW5kIGlzIG5vdAogCSAqIGEgY29udGludW91cyBzdHJlYW0gb2YgZGF0YSBidXQgc2VwYXJhdGUgcGFja2V0cy4KIAkgKiBJbiB0aGlzIGNhc2UsIHRoZSBVU0IgbGF5ZXIgd2lsbCBpbnNlcnQgYW4gZW1wdHkgVVNCIGZyYW1lIChURCkKIAkgKiBhZnRlciBlYWNoIG9mIG91ciBwYWNrZXRzIHRoYXQgaXMgZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuCiAJICogVGhpcyBpcyBob3cgdGhlIGRvbmdsZSB3aWxsIGRldGVjdCB0aGUgZW5kIG9mIHBhY2tldCAtIEplYW4gSUkgKi8KLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX1pFUk9fUEFDS0VUOwogCiAJLyogR2VuZXJhdGUgbWluIHR1cm4gdGltZS4gRklYTUU6IGNhbiB3ZSBkbyBiZXR0ZXIgdGhhbiB0aGlzPyAqLwogCS8qIFRyeWluZyB0byBhIHR1cm5hcm91bmQgdGltZSBhdCB0aGlzIGxldmVsIGlzIHRyeWluZyB0byBtZWFzdXJlCkBAIC02MzAsOCArNjI3LDYgQEAKIAkJCSAqIGluIGNvbXBsZXRpb24gaGFuZGxlciwgYmVjYXVzZSB1cmItPnN0YXR1cyB3aWxsCiAJCQkgKiBiZSAtRU5PRU5ULiBXZSB3aWxsIGZpeCB0aGF0IGF0IHRoZSBuZXh0IHdhdGNoZG9nLAogCQkJICogbGVhdmluZyBtb3JlIHRpbWUgdG8gVVNCIHRvIHJlY292ZXIuLi4KLQkJCSAqIEFsc28sIHdlIGFyZSBpbiBpbnRlcnJ1cHQsIHNvIHdlIG5lZWQgdG8gaGF2ZQotCQkJICogVVJCX0FTWU5DX1VOTElOSyB0byB3b3JrIHByb3Blcmx5Li4uCiAJCQkgKiBKZWFuIElJICovCiAJCQlkb25lID0gMTsKIAkJCWJyZWFrOwpAQCAtMTAwOCw5ICsxMDAzLDcgQEAKIAkJfQogCX0KIAkvKiBDYW5jZWwgVHggYW5kIHNwZWVkIFVSQiAtIG5lZWQgdG8gYmUgc3luY2hyb25vdXMgdG8gYXZvaWQgcmFjZXMgKi8KLQlzZWxmLT50eF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOwogCXVzYl9raWxsX3VyYihzZWxmLT50eF91cmIpOwotCXNlbGYtPnNwZWVkX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJdXNiX2tpbGxfdXJiKHNlbGYtPnNwZWVkX3VyYik7CiAKIAkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KQEAgLTE1MjEsOSArMTUxNCw3IEBACiAJCQl1c2Jfa2lsbF91cmIoc2VsZi0+cnhfdXJiW2ldKTsKIAkJLyogQ2FuY2VsIFR4IGFuZCBzcGVlZCBVUkIuCiAJCSAqIFRvZ2dsZSBmbGFncyB0byBtYWtlIHN1cmUgaXQncyBzeW5jaHJvbm91cy4gKi8KLQkJc2VsZi0+dHhfdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKIAkJdXNiX2tpbGxfdXJiKHNlbGYtPnR4X3VyYik7Ci0JCXNlbGYtPnNwZWVkX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXVzYl9raWxsX3VyYihzZWxmLT5zcGVlZF91cmIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYwppbmRleCAxMDEyNWExLi5kZDg5YmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYwpAQCAtNCwxMCArNCwxMCBAQAogICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgU01DIEluZnJhcmVkIENvbW11bmljYXRpb25zIENvbnRyb2xsZXIKICAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICAqIEF1dGhvcjogICAgICAgIERhbmllbGUgUGVyaSAocGVyaUBjc2FpLnVuaXBhLml0KQotICogQ3JlYXRlZCBhdDogICAgCi0gKiBNb2RpZmllZCBhdDogICAKLSAqIE1vZGlmaWVkIGJ5OiAgIAotICogCisgKiBDcmVhdGVkIGF0OgorICogTW9kaWZpZWQgYXQ6CisgKiBNb2RpZmllZCBieToKKyAqCiAgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyICAgICAgRGFuaWVsZSBQZXJpCiAgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgICAgICBKZWFuIFRvdXJyaWxoZXMKQEAgLTE3LDI2ICsxNywyNiBAQAogICoKICAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgICAgICBTdGVmYW5pIFNlaWJvbGQKICAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBEYWcgQnJhdHRsaQotICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRob21hcyBEYXZpcywgCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhvbWFzIERhdmlzLAogICoKICAqCWFuZCBpcnBvcnQuYzoKICAqCiAgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKLSAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKLSAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02OCwyNCArNjgsNDIgQEAKICNpbmNsdWRlICJzbXNjLWlyY2MyLmgiCiAjaW5jbHVkZSAic21zYy1zaW8uaCIKIAorCitNT0RVTEVfQVVUSE9SKCJEYW5pZWxlIFBlcmkgPHBlcmlAY3NhaS51bmlwYS5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01DIElyQ0MgU0lSL0ZJUiBjb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGlyY2NfZG1hID0gMjU1OworbW9kdWxlX3BhcmFtKGlyY2NfZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2RtYSwgIkRNQSBjaGFubmVsIik7CisKK3N0YXRpYyBpbnQgaXJjY19pcnEgPSAyNTU7Cittb2R1bGVfcGFyYW0oaXJjY19pcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfaXJxLCAiSVJRIGxpbmUiKTsKKworc3RhdGljIGludCBpcmNjX2ZpcjsKK21vZHVsZV9wYXJhbShpcmNjX2ZpciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19maXIsICJGSVIgQmFzZSBBZGRyZXNzIik7CisKK3N0YXRpYyBpbnQgaXJjY19zaXI7Cittb2R1bGVfcGFyYW0oaXJjY19zaXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2Nfc2lyLCAiU0lSIEJhc2UgQWRkcmVzcyIpOworCitzdGF0aWMgaW50IGlyY2NfY2ZnOworbW9kdWxlX3BhcmFtKGlyY2NfY2ZnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2NmZywgIkNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIik7CisKK3N0YXRpYyBpbnQgaXJjY190cmFuc2NlaXZlcjsKK21vZHVsZV9wYXJhbShpcmNjX3RyYW5zY2VpdmVyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX3RyYW5zY2VpdmVyLCAiVHJhbnNjZWl2ZXIgdHlwZSIpOworCiAvKiBUeXBlcyAqLwogCiBzdHJ1Y3Qgc21zY190cmFuc2NlaXZlciB7CiAJY2hhciAqbmFtZTsKLQl2b2lkICgqc2V0X2Zvcl9zcGVlZCkoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpOwkKKwl2b2lkICgqc2V0X2Zvcl9zcGVlZCkoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpOwogCWludCAgKCpwcm9iZSkoaW50IGZpcl9iYXNlKTsKIH07Ci10eXBlZGVmIHN0cnVjdCBzbXNjX3RyYW5zY2VpdmVyIHNtc2NfdHJhbnNjZWl2ZXJfdDsKLQotI2lmIDAKLXN0cnVjdCBzbWNfY2hpcCB7Ci0JY2hhciAqbmFtZTsKLQl1MTYgZmxhZ3M7Ci0JdTggZGV2aWQ7Ci0JdTggcmV2OwotfTsKLXR5cGVkZWYgc3RydWN0IHNtY19jaGlwIHNtY19jaGlwX3Q7Ci0jZW5kaWYKIAogc3RydWN0IHNtc2NfY2hpcCB7CiAJY2hhciAqbmFtZTsKQEAgLTk2LDIwICsxMTQsMTggQEAKIAl1OCBkZXZpZDsKIAl1OCByZXY7CiB9OwotdHlwZWRlZiBzdHJ1Y3Qgc21zY19jaGlwIHNtc2NfY2hpcF90OwogCiBzdHJ1Y3Qgc21zY19jaGlwX2FkZHJlc3MgewogCXVuc2lnbmVkIGludCBjZmdfYmFzZTsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKIH07Ci10eXBlZGVmIHN0cnVjdCBzbXNjX2NoaXBfYWRkcmVzcyBzbXNjX2NoaXBfYWRkcmVzc190OwogCiAvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KIHN0cnVjdCBzbXNjX2lyY2NfY2IgewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotCQorCiAJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCiAJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCiAJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KQEAgLTExOSw3ICsxMzUsNyBAQAogCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCiAKIAlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLwotCQorCiAJX191MzIgbmV3X3NwZWVkOwogCV9fdTMyIGZsYWdzOyAgICAgICAgICAgICAgIC8qIEludGVyZmFjZSBmbGFncyAqLwogCkBAIC0xMjcsMTggKzE0MywyMCBAQAogCWludCB0eF9sZW47ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgaW4gdHhfYnVmZiAqLwogCiAJaW50IHRyYW5zY2VpdmVyOwotCXN0cnVjdCBwbV9kZXYgKnBtZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OwogfTsKIAogLyogQ29uc3RhbnRzICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJzbXNjLWlyY2MyIjsKLSNkZWZpbmUJRElNKHgpCShzaXplb2YoeCkvKHNpemVvZigqKHgpKSkpCisjZGVmaW5lIFNNU0NfSVJDQzJfRFJJVkVSX05BTUUJCQkic21zYy1pcmNjMiIKKwogI2RlZmluZSBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRAk5NjAwCiAjZGVmaW5lIFNNU0NfSVJDQzJfQ19ERUZBVUxUX1RSQU5TQ0VJVkVSCTEKLSNkZWZpbmUgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCQkJMAorI2RlZmluZSBTTVNDX0lSQ0MyX0NfTkVUX1RJTUVPVVQJCTAKICNkZWZpbmUgU01TQ19JUkNDMl9DX1NJUl9TVE9QCQkJMAogCitzdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSBTTVNDX0lSQ0MyX0RSSVZFUl9OQU1FOworCiAvKiBQcm90b3R5cGVzICovCiAKIHN0YXRpYyBpbnQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcmJhc2UsIHVuc2lnbmVkIGludCBzaXJiYXNlLCB1OCBkbWEsIHU4IGlycSk7CkBAIC0xNDcsMTUgKzE2NSwxNSBAQAogc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX3FvcyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19pbml0X2NoaXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CiBzdGF0aWMgaW50IF9fZXhpdCBzbXNjX2lyY2NfY2xvc2Uoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7Ci1zdGF0aWMgaW50ICBzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7IAotc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIGludCAgc21zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwogc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwogc3RhdGljIGludCAgc21zY19pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlLCBpbnQgYm9mcyk7Ci1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7Ci1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIHUzMiBzcGVlZCk7Ci1zdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZCh2b2lkICpwcml2LCB1MzIgc3BlZWQpOworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBib2ZzKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdTMyIHNwZWVkKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCk7CiBzdGF0aWMgaXJxcmV0dXJuX3Qgc21zY19pcmNjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBzbXNjX2lyY2NfaW50ZXJydXB0X3NpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfc3RhcnQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CkBAIC0xNzEsNyArMTg5LDYgQEAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCAgc21zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKIHN0YXRpYyBpbnQgc21zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCk7CkBAIC0xNzksOSArMTk2LDkgQEAKIAogLyogUHJvYmluZyAqLwogc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX2xvb2tfZm9yX2NoaXBzKHZvaWQpOwotc3RhdGljIGNvbnN0IHNtc2NfY2hpcF90ICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSx1OCByZWcsY29uc3Qgc21zY19jaGlwX3QgKmNoaXAsY2hhciAqdHlwZSk7Ci1zdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKLXN0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19wYWdlZChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdTggcmVnLCBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mbGF0KGNvbnN0IHN0cnVjdCBzbXNjX2NoaXAgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fcGFnZWQoY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKIHN0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mZGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOwogc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2xwYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSk7CiAKQEAgLTE5NiwyMSArMjEzLDI2IEBACiAKIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KIAotc3RhdGljIHZvaWQgc21zY19pcmNjX3N1c3BlbmQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7Ci1zdGF0aWMgdm9pZCBzbXNjX2lyY2Nfd2FrZXVwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOwotc3RhdGljIGludCBzbXNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBzbXNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKTsKK3N0YXRpYyBpbnQgc21zY19pcmNjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCk7CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzbXNjX2lyY2NfZHJpdmVyID0geworCS5uYW1lCQk9IFNNU0NfSVJDQzJfRFJJVkVSX05BTUUsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnN1c3BlbmQJPSBzbXNjX2lyY2Nfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNtc2NfaXJjY19yZXN1bWUsCit9OwogCiAvKiBUcmFuc2NlaXZlcnMgZm9yIFNNU0MtaXJjYyAqLwogCi1zdGF0aWMgc21zY190cmFuc2NlaXZlcl90IHNtc2NfdHJhbnNjZWl2ZXJzW109CitzdGF0aWMgc3RydWN0IHNtc2NfdHJhbnNjZWl2ZXIgc21zY190cmFuc2NlaXZlcnNbXSA9CiB7Ci0JeyAiVG9zaGliYSBTYXRlbGxpdGUgMTgwMCAoR1AgZGF0YSBwaW4gc2VsZWN0KSIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwLCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwfSwKLQl7ICJGYXN0IHBpbiBzZWxlY3QiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QsIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0fSwKLQl7ICJBVEMgSVJNb2RlIiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjLCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0Y30sCi0JeyBOVUxMLCBOVUxMfQorCXsgIlRvc2hpYmEgU2F0ZWxsaXRlIDE4MDAgKEdQIGRhdGEgcGluIHNlbGVjdCkiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMCwgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMCB9LAorCXsgIkZhc3QgcGluIHNlbGVjdCIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdCwgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QgfSwKKwl7ICJBVEMgSVJNb2RlIiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjLCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyB9LAorCXsgTlVMTCwgTlVMTCB9CiB9OwotI2RlZmluZSBTTVNDX0lSQ0MyX0NfTlVNQkVSX09GX1RSQU5TQ0VJVkVSUyAoRElNKHNtc2NfdHJhbnNjZWl2ZXJzKS0xKQorI2RlZmluZSBTTVNDX0lSQ0MyX0NfTlVNQkVSX09GX1RSQU5TQ0VJVkVSUyAoQVJSQVlfU0laRShzbXNjX3RyYW5zY2VpdmVycykgLSAxKQogCiAvKiAgU01DIFN1cGVySU8gY2hpcHNldHMgZGVmaW5pdGlvbnMgKi8KIApAQCAtMjIxLDcgKzI0Myw3IEBACiAjZGVmaW5lCUZJUgk0CS8qIFN1cGVySU8gQ2hpcCBoYXMgZmFzdCBJUkRBICovCiAjZGVmaW5lCVNFUng0CTgJLyogU3VwZXJJTyBDaGlwIHN1cHBvcnRzIDExNSwyIEtCYXVkICogND00NjAsOCBLQmF1ZCAqLwogCi1zdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBmZGNfY2hpcHNfZmxhdFtdPQorc3RhdGljIHN0cnVjdCBzbXNjX2NoaXAgX19pbml0ZGF0YSBmZGNfY2hpcHNfZmxhdFtdID0KIHsKIAkvKiBCYXNlIGFkZHJlc3MgMHgzZjAgb3IgMHgzNzAgKi8KIAl7ICIzN0M0NCIsCUtFWTU1XzF8Tm9JUkRBLAkJMHgwMCwgMHgwMCB9LCAvKiBUaGlzIGNoaXAgY2Fubm90IGJlIGRldGVjdGVkICovCkBAIC0yMzUsNyArMjU3LDcgQEAKIAl7IE5VTEwgfQogfTsKIAotc3RhdGljIHNtc2NfY2hpcF90IF9faW5pdGRhdGEgZmRjX2NoaXBzX3BhZ2VkW109CitzdGF0aWMgc3RydWN0IHNtc2NfY2hpcCBfX2luaXRkYXRhIGZkY19jaGlwc19wYWdlZFtdID0KIHsKIAkvKiBCYXNlIGFkZHJlc3MgMHgzZjAgb3IgMHgzNzAgKi8KIAl7ICIzN0I3MlgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0YywgMHgwMCB9LApAQCAtMjU0LDcgKzI3Niw3IEBACiAJeyBOVUxMIH0KIH07CiAKLXN0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGxwY19jaGlwc19mbGF0W109CitzdGF0aWMgc3RydWN0IHNtc2NfY2hpcCBfX2luaXRkYXRhIGxwY19jaGlwc19mbGF0W10gPQogewogCS8qIEJhc2UgYWRkcmVzcyAweDJFIG9yIDB4NEUgKi8KIAl7ICI0N04yMjciLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHg1YSwgMHgwMCB9LApAQCAtMjYyLDcgKzI4NCw3IEBACiAJeyBOVUxMIH0KIH07CiAKLXN0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGxwY19jaGlwc19wYWdlZFtdPQorc3RhdGljIHN0cnVjdCBzbXNjX2NoaXAgX19pbml0ZGF0YSBscGNfY2hpcHNfcGFnZWRbXSA9CiB7CiAJLyogQmFzZSBhZGRyZXNzIDB4MkUgb3IgMHg0RSAqLwogCXsgIjQ3QjI3WCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDUxLCAweDAwIH0sCkBAIC0yODEsMzMgKzMwMywyNSBAQAogI2RlZmluZSBTTVNDU0lPX1RZUEVfRkxBVAk0CiAjZGVmaW5lIFNNU0NTSU9fVFlQRV9QQUdFRAk4CiAKLXN0YXRpYyBzbXNjX2NoaXBfYWRkcmVzc190IF9faW5pdGRhdGEgcG9zc2libGVfYWRkcmVzc2VzW109CitzdGF0aWMgc3RydWN0IHNtc2NfY2hpcF9hZGRyZXNzIF9faW5pdGRhdGEgcG9zc2libGVfYWRkcmVzc2VzW10gPQogewotCXsweDNmMCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAotCXsweDM3MCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAotCXsweGUwLCBTTVNDU0lPX1RZUEVfRkRDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCi0JezB4MmUsIFNNU0NTSU9fVFlQRV9MUEN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKLQl7MHg0ZSwgU01TQ1NJT19UWVBFX0xQQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAotCXswLDB9CisJeyAweDNmMCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUQgfSwKKwl7IDB4MzcwLCBTTVNDU0lPX1RZUEVfRkRDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRCB9LAorCXsgMHhlMCwgIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEIH0sCisJeyAweDJlLCAgU01TQ1NJT19UWVBFX0xQQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUQgfSwKKwl7IDB4NGUsICBTTVNDU0lPX1RZUEVfTFBDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRCB9LAorCXsgMCwgMCB9CiB9OwogCiAvKiBHbG9iYWxzICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc21zY19pcmNjX2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMfTsKLQotc3RhdGljIGludCBpcmNjX2lycT0yNTU7Ci1zdGF0aWMgaW50IGlyY2NfZG1hPTI1NTsKLXN0YXRpYyBpbnQgaXJjY19maXI9MDsKLXN0YXRpYyBpbnQgaXJjY19zaXI9MDsKLXN0YXRpYyBpbnQgaXJjY19jZmc9MDsKLXN0YXRpYyBpbnQgaXJjY190cmFuc2NlaXZlcj0wOwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJZGV2X2NvdW50PTA7CitzdGF0aWMgc3RydWN0IHNtc2NfaXJjY19jYiAqZGV2X3NlbGZbXSA9IHsgTlVMTCwgTlVMTCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGRldl9jb3VudDsKIAogc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX2JhbmsoaW50IGlvYmFzZSwgaW50IGJhbmspCiB7Ci0gICAgICAgIG91dGIoKChpbmIoaW9iYXNlK0lSQ0NfTUFTVEVSKSAmIDB4ZjApIHwgKGJhbmsgJiAweDA3KSksCi0gICAgICAgICAgICAgICBpb2Jhc2UrSVJDQ19NQVNURVIpOworICAgICAgICBvdXRiKCgoaW5iKGlvYmFzZSArIElSQ0NfTUFTVEVSKSAmIDB4ZjApIHwgKGJhbmsgJiAweDA3KSksCisgICAgICAgICAgICAgICBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiB9CiAKIApAQCAtMzI3LDM0ICszNDEsNDQgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0PS1FTk9ERVY7CisJaW50IHJldDsKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JZGV2X2NvdW50PTA7Ci0gCi0JaWYgKChpcmNjX2Zpcj4wKSYmKGlyY2Nfc2lyPjApKSB7CisJcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZzbXNjX2lyY2NfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCUlSREFfRVJST1IoIiVzLCBDYW4ndCByZWdpc3RlciBkcml2ZXIhXG4iLCBkcml2ZXJfbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2NvdW50ID0gMDsKKworCWlmIChpcmNjX2ZpciA+IDAgJiYgaXJjY19zaXIgPiAwKSB7CiAJCUlSREFfTUVTU0FHRSgiIE92ZXJyaWRpbmcgRklSIGFkZHJlc3MgMHglMDR4XG4iLCBpcmNjX2Zpcik7CiAJCUlSREFfTUVTU0FHRSgiIE92ZXJyaWRpbmcgU0lSIGFkZHJlc3MgMHglMDR4XG4iLCBpcmNjX3Npcik7CiAKLQkJaWYgKHNtc2NfaXJjY19vcGVuKGlyY2NfZmlyLCBpcmNjX3NpciwgaXJjY19kbWEsIGlyY2NfaXJxKSA9PSAwKQotCQkJcmV0dXJuIDA7CisJCWlmIChzbXNjX2lyY2Nfb3BlbihpcmNjX2ZpciwgaXJjY19zaXIsIGlyY2NfZG1hLCBpcmNjX2lycSkpCisJCQlyZXQgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9ERVY7CiAKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCQkvKiB0cnkgdXNlciBwcm92aWRlZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCQlpZiAoaXJjY19jZmcgPiAwKSB7CisJCQlJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyAiCisJCQkJICAgICAiMHglMDR4XG4iLCBpcmNjX2NmZyk7CisJCQlpZiAoIXNtc2Nfc3VwZXJpb19mZGMoaXJjY19jZmcpKQorCQkJCXJldCA9IDA7CisJCQlpZiAoIXNtc2Nfc3VwZXJpb19scGMoaXJjY19jZmcpKQorCQkJCXJldCA9IDA7CisJCX0KIAotCS8qIHRyeSB1c2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCi0JaWYgKGlyY2NfY2ZnPjApIHsKLQkgICAgICAgIElSREFfTUVTU0FHRSgiIE92ZXJyaWRpbmcgY29uZmlndXJhdGlvbiBhZGRyZXNzIDB4JTA0eFxuIiwKLQkJCSAgICAgaXJjY19jZmcpOwotCQlpZiAoIXNtc2Nfc3VwZXJpb19mZGMoaXJjY19jZmcpKQotCQkJcmV0ID0gMDsKLQkJaWYgKCFzbXNjX3N1cGVyaW9fbHBjKGlyY2NfY2ZnKSkKKwkJaWYgKHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcygpID4gMCkKIAkJCXJldCA9IDA7CiAJfQotCQotCWlmKHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcygpPjApIHJldCA9IDA7Ci0JCisKKwlpZiAocmV0KQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmc21zY19pcmNjX2RyaXZlcik7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNjksMTUgKzM5MywxNSBAQAogCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgZXJyOwotCQorCiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAllcnIgPSBzbXNjX2lyY2NfcHJlc2VudChmaXJfYmFzZSwgc2lyX2Jhc2UpOwotCWlmKGVycikgCisJaWYgKGVycikKIAkJZ290byBlcnJfb3V0OwotCQkKKwogCWVyciA9IC1FTk9NRU07Ci0JaWYgKGRldl9jb3VudCA+IERJTShkZXZfc2VsZikpIHsKKwlpZiAoZGV2X2NvdW50ID49IEFSUkFZX1NJWkUoZGV2X3NlbGYpKSB7CiAJICAgICAgICBJUkRBX1dBUk5JTkcoIiVzKCksIHRvbyBtYW55IGRldmljZXMhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycl9vdXQxOwogCX0KQEAgLTM5NiwxNCArNDIwLDE0IEBACiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzbXNjX2lyY2NfaGFyZF94bWl0X3NpcjsKICNpZiBTTVNDX0lSQ0MyX0NfTkVUX1RJTUVPVVQKIAlkZXYtPnR4X3RpbWVvdXQJICAgICA9IHNtc2NfaXJjY190aW1lb3V0OwotCWRldi0+d2F0Y2hkb2dfdGltZW8gID0gSFoqMjsgIC8qIEFsbG93IGVub3VnaCB0aW1lIGZvciBzcGVlZCBjaGFuZ2UgKi8KKwlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaICogMjsgIC8qIEFsbG93IGVub3VnaCB0aW1lIGZvciBzcGVlZCBjaGFuZ2UgKi8KICNlbmRpZgogCWRldi0+b3BlbiAgICAgICAgICAgID0gc21zY19pcmNjX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gc21zY19pcmNjX25ldF9jbG9zZTsKIAlkZXYtPmRvX2lvY3RsICAgICAgICA9IHNtc2NfaXJjY19uZXRfaW9jdGw7CiAJZGV2LT5nZXRfc3RhdHMJICAgICA9IHNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzOwotCQotCXNlbGYgPSBkZXYtPnByaXY7CisKKwlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzZWxmLT5uZXRkZXYgPSBkZXY7CiAKIAkvKiBNYWtlIGlmY29uZmlnIGRpc3BsYXkgc29tZSBkZXRhaWxzICovCkBAIC00MTEsMTAgKzQzNSwxMCBAQAogCWRldi0+aXJxID0gc2VsZi0+aW8uaXJxID0gaXJxOwogCiAJLyogTmVlZCB0byBzdG9yZSBzZWxmIHNvbWV3aGVyZSAqLwotCWRldl9zZWxmW2Rldl9jb3VudCsrXSA9IHNlbGY7CisJZGV2X3NlbGZbZGV2X2NvdW50XSA9IHNlbGY7CiAJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOwogCi0Jc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IFNNU0NfSVJDQzJfUlhfQlVGRl9UUlVFU0laRTsgCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IFNNU0NfSVJDQzJfUlhfQlVGRl9UUlVFU0laRTsKIAlzZWxmLT50eF9idWZmLnRydWVzaXplID0gU01TQ19JUkNDMl9UWF9CVUZGX1RSVUVTSVpFOwogCiAJc2VsZi0+cnhfYnVmZi5oZWFkID0KQEAgLTQ0MiwzMyArNDY2LDQwIEBACiAJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CiAJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOwogCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKLQkgICAKKwogCXNtc2NfaXJjY19zZXR1cF9pbyhzZWxmLCBmaXJfYmFzZSwgc2lyX2Jhc2UsIGRtYSwgaXJxKTsKLQogCXNtc2NfaXJjY19zZXR1cF9xb3Moc2VsZik7Ci0KIAlzbXNjX2lyY2NfaW5pdF9jaGlwKHNlbGYpOwotCQotCWlmKGlyY2NfdHJhbnNjZWl2ZXIgPiAwICAmJiAKLQkgICBpcmNjX3RyYW5zY2VpdmVyIDwgU01TQ19JUkNDMl9DX05VTUJFUl9PRl9UUkFOU0NFSVZFUlMpCisKKwlpZiAoaXJjY190cmFuc2NlaXZlciA+IDAgICYmCisJICAgIGlyY2NfdHJhbnNjZWl2ZXIgPCBTTVNDX0lSQ0MyX0NfTlVNQkVSX09GX1RSQU5TQ0VJVkVSUykKIAkJc2VsZi0+dHJhbnNjZWl2ZXIgPSBpcmNjX3RyYW5zY2VpdmVyOwogCWVsc2UKIAkJc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyKHNlbGYpOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7Ci0JaWYoZXJyKSB7CisJaWYgKGVycikgewogCQlJUkRBX0VSUk9SKCIlcywgTmV0d29yayBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIsCiAJCQkgICBkcml2ZXJfbmFtZSk7CiAJCWdvdG8gZXJyX291dDQ7CiAJfQogCi0Jc2VsZi0+cG1kZXYgPSBwbV9yZWdpc3RlcihQTV9TWVNfREVWLCBQTV9TWVNfSVJEQSwgc21zY19pcmNjX3BtcHJvYyk7Ci0JaWYgKHNlbGYtPnBtZGV2KQotCQlzZWxmLT5wbWRldi0+ZGF0YSA9IHNlbGY7CisJc2VsZi0+cGxkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFNNU0NfSVJDQzJfRFJJVkVSX05BTUUsCisJCQkJCQkgICAgICBkZXZfY291bnQsIE5VTEwsIDApOworCWlmIChJU19FUlIoc2VsZi0+cGxkZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoc2VsZi0+cGxkZXYpOworCQlnb3RvIGVycl9vdXQ1OworCX0KKwlkZXZfc2V0X2RydmRhdGEoJnNlbGYtPnBsZGV2LT5kZXYsIHNlbGYpOwogCiAJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKwlkZXZfY291bnQrKzsKIAogCXJldHVybiAwOworCisgZXJyX291dDU6CisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwogIGVycl9vdXQ0OgogCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCiAJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOwpAQCAtNDc3LDcgKzUwOCw3IEBACiAJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOwogIGVycl9vdXQyOgogCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7Ci0JZGV2X3NlbGZbLS1kZXZfY291bnRdID0gTlVMTDsKKwlkZXZfc2VsZltkZXZfY291bnRdID0gTlVMTDsKICBlcnJfb3V0MToKIAlyZWxlYXNlX3JlZ2lvbihmaXJfYmFzZSwgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQpOwogCXJlbGVhc2VfcmVnaW9uKHNpcl9iYXNlLCBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVCk7CkBAIC01MTEsMTYgKzU0MiwxNiBAQAogCiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMyk7CiAKLQloaWdoICAgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSURfSElHSCk7Ci0JbG93ICAgICA9IGluYihmaXJfYmFzZStJUkNDX0lEX0xPVyk7Ci0JY2hpcCAgICA9IGluYihmaXJfYmFzZStJUkNDX0NISVBfSUQpOwotCXZlcnNpb24gPSBpbmIoZmlyX2Jhc2UrSVJDQ19WRVJTSU9OKTsKLQljb25maWcgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSU5URVJGQUNFKTsKKwloaWdoICAgID0gaW5iKGZpcl9iYXNlICsgSVJDQ19JRF9ISUdIKTsKKwlsb3cgICAgID0gaW5iKGZpcl9iYXNlICsgSVJDQ19JRF9MT1cpOworCWNoaXAgICAgPSBpbmIoZmlyX2Jhc2UgKyBJUkNDX0NISVBfSUQpOworCXZlcnNpb24gPSBpbmIoZmlyX2Jhc2UgKyBJUkNDX1ZFUlNJT04pOworCWNvbmZpZyAgPSBpbmIoZmlyX2Jhc2UgKyBJUkNDX0lOVEVSRkFDRSk7CiAJZG1hICAgICA9IGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0RNQV9NQVNLOwogCWlycSAgICAgPSAoY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0spID4+IDQ7CiAKLQlpZiAoaGlnaCAhPSAweDEwIHx8IGxvdyAhPSAweGI4IHx8IChjaGlwICE9IDB4ZjEgJiYgY2hpcCAhPSAweGYyKSkgeyAKLQkgICAgICAgIElSREFfV0FSTklORygiJXMoKSwgYWRkciAweCUwNHggLSBubyBkZXZpY2UgZm91bmQhXG4iLAorCWlmIChoaWdoICE9IDB4MTAgfHwgbG93ICE9IDB4YjggfHwgKGNoaXAgIT0gMHhmMSAmJiBjaGlwICE9IDB4ZjIpKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgYWRkciAweCUwNHggLSBubyBkZXZpY2UgZm91bmQhXG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18sIGZpcl9iYXNlKTsKIAkJZ290byBvdXQzOwogCX0KQEAgLTUyOSw2ICs1NjAsNyBAQAogCQkgICAgIGNoaXAgJiAweDBmLCB2ZXJzaW9uLCBmaXJfYmFzZSwgc2lyX2Jhc2UsIGRtYSwgaXJxKTsKIAogCXJldHVybiAwOworCiAgb3V0MzoKIAlyZWxlYXNlX3JlZ2lvbihzaXJfYmFzZSwgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQpOwogIG91dDI6CkBAIC01NDMsMTYgKzU3NSwxNiBAQAogICogICAgU2V0dXAgSS9PCiAgKgogICovCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0dXBfaW8oc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIAorc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX2lvKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsCiAJCQkgICAgICAgdTggZG1hLCB1OCBpcnEpCiB7CiAJdW5zaWduZWQgY2hhciBjb25maWcsIGNoaXBfZG1hLCBjaGlwX2lycTsKIAogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDMpOwotCWNvbmZpZyAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19JTlRFUkZBQ0UpOwotCWNoaXBfZG1hICAgICA9IGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0RNQV9NQVNLOwotCWNoaXBfaXJxICAgICA9IChjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSykgPj4gNDsKKwljb25maWcgPSBpbmIoZmlyX2Jhc2UgKyBJUkNDX0lOVEVSRkFDRSk7CisJY2hpcF9kbWEgPSBjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSzsKKwljaGlwX2lycSA9IChjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSykgPj4gNDsKIAogCXNlbGYtPmlvLmZpcl9iYXNlICA9IGZpcl9iYXNlOwogCXNlbGYtPmlvLnNpcl9iYXNlICA9IHNpcl9iYXNlOwpAQCAtNTY2LDE3ICs1OTgsMTUgQEAKIAkJCUlSREFfTUVTU0FHRSgiJXMsIE92ZXJyaWRpbmcgSVJRIC0gY2hpcCBzYXlzICVkLCB1c2luZyAlZFxuIiwKIAkJCQkgICAgIGRyaXZlcl9uYW1lLCBjaGlwX2lycSwgaXJxKTsKIAkJc2VsZi0+aW8uaXJxID0gaXJxOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXNlbGYtPmlvLmlycSA9IGNoaXBfaXJxOwotCQorCiAJaWYgKGRtYSA8IDI1NSkgewogCQlpZiAoZG1hICE9IGNoaXBfZG1hKQogCQkJSVJEQV9NRVNTQUdFKCIlcywgT3ZlcnJpZGluZyBETUEgLSBjaGlwIHNheXMgJWQsIHVzaW5nICVkXG4iLAogCQkJCSAgICAgZHJpdmVyX25hbWUsIGNoaXBfZG1hLCBkbWEpOwogCQlzZWxmLT5pby5kbWEgPSBkbWE7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJc2VsZi0+aW8uZG1hID0gY2hpcF9kbWE7CiAKIH0KQEAgLTU5MSw3ICs2MjEsNyBAQAogewogCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLwogCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvcyk7Ci0JCisKIAlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfAogCQlJUl8xMTUyMDB8SVJfNTc2MDAwfElSXzExNTIwMDB8KElSXzQwMDAwMDAgPDwgOCk7CiAKQEAgLTYwOCw0MyArNjM4LDQzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19pbml0X2NoaXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKIHsKLQlpbnQgaW9iYXNlLCBpcl9tb2RlLCBjdHJsLCBmYXN0OyAKLQkKLQlJUkRBX0FTU0VSVCggc2VsZiAhPSBOVUxMLCByZXR1cm47ICk7Ci0JaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJaW50IGlvYmFzZSwgaXJfbW9kZSwgY3RybCwgZmFzdDsKIAorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAlpcl9tb2RlID0gSVJDQ19DRkdBX0lSREFfU0lSX0E7CiAJY3RybCA9IDA7CiAJZmFzdCA9IDA7CiAKIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0Jb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKLQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisJb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgaW9iYXNlICsgSVJDQ19NQVNURVIpOworCW91dGIoMHgwMCwgaW9iYXNlICsgSVJDQ19NQVNURVIpOwogCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOwotCW91dGIoKChpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0EpICYgMHg4NykgfCBpcl9tb2RlKSwgCi0JICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQSk7CisJb3V0YigoKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdBKSAmIDB4ODcpIHwgaXJfbW9kZSksCisJICAgICBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdBKTsKIAogI2lmZGVmIHNtc2NfNjY5IC8qIFVzZXMgcGluIDg4Lzg5IGZvciBSeC9UeCAqLwotCW91dGIoKChpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0NPTSksIAotCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOwotI2Vsc2UJCi0Jb3V0YigoKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfSVIpLAotCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOwotI2VuZGlmCQotCSh2b2lkKSBpbmIoaW9iYXNlK0lSQ0NfRklGT19USFJFU0hPTEQpOwotCW91dGIoU01TQ19JUkNDMl9GSUZPX1RIUkVTSE9MRCwgaW9iYXNlK0lSQ0NfRklGT19USFJFU0hPTEQpOwotCQorCW91dGIoKChpbmIoaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfQ09NKSwKKwkgICAgIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOworI2Vsc2UKKwlvdXRiKCgoaW5iKGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0lSKSwKKwkgICAgIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOworI2VuZGlmCisJKHZvaWQpIGluYihpb2Jhc2UgKyBJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKKwlvdXRiKFNNU0NfSVJDQzJfRklGT19USFJFU0hPTEQsIGlvYmFzZSArIElSQ0NfRklGT19USFJFU0hPTEQpOworCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDQpOwotCW91dGIoKGluYihpb2Jhc2UrSVJDQ19DT05UUk9MKSAmIDB4MzApIHwgY3RybCwgaW9iYXNlK0lSQ0NfQ09OVFJPTCk7Ci0JCisJb3V0YigoaW5iKGlvYmFzZSArIElSQ0NfQ09OVFJPTCkgJiAweDMwKSB8IGN0cmwsIGlvYmFzZSArIElSQ0NfQ09OVFJPTCk7CisKIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0Jb3V0YihmYXN0LCBpb2Jhc2UrSVJDQ19MQ1JfQSk7CisJb3V0YihmYXN0LCBpb2Jhc2UgKyBJUkNDX0xDUl9BKTsKIAogCXNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHNlbGYsIFNNU0NfSVJDQzJfQ19JUkRBX0ZBTExCQUNLX1NQRUVEKTsKLQkKKwogCS8qIFBvd2VyIG9uIGRldmljZSAqLwotCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKDB4MDAsIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKIH0KIAogLyoKQEAgLTY2MiwxMiArNjkyLDEyIEBACiAKIAlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAKLQlzZWxmID0gZGV2LT5wcml2OworCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAogCUlSREFfREVCVUcoMiwgIiVzKCksICVzLCAoY21kPTB4JVgpXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwgY21kKTsKLQkKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLwogCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCkBAIC03MDMsMTQgKzczMywxNCBAQAogCWRlZmF1bHQ6CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCX0KLQkKKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OwotCQorCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJcmV0dXJuICZzZWxmLT5zdGF0czsKIH0KIApAQCAtNzI0LDExICs3NTQsOSBAQAogCiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7Ci0JCiAJSVJEQV9XQVJOSU5HKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBjaGFuZ2luZyBzcGVlZCB0bzogJWRcbiIsCiAJCSAgICAgZGV2LT5uYW1lLCBzZWxmLT5pby5zcGVlZCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKQEAgLTc1MSwyNiArNzc5LDIzIEBACiB7CiAJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpb2Jhc2U7CiAJczMyIHNwZWVkOwogCiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKLQkKLQlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCisJc2VsZiA9IG5ldGRldl9wcml2KGRldik7CiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOwogCi0JaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7Ci0KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCisKIAkvKiBNYWtlIHN1cmUgdGVzdCBvZiBzZWxmLT5pby5zcGVlZCAmIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKIAogCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLwogCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOwotCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwlpZiAoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQgJiYgc3BlZWQgIT0gLTEpIHsKIAkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCiAJCWlmICghc2tiLT5sZW4pIHsKIAkJCS8qCkBAIC03ODcsMjcgKzgxMiwyNiBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKIAkJfQorCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKIAl9CiAKIAkvKiBJbml0IHR4IGJ1ZmZlciAqLwogCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKIAogCS8qIENvcHkgc2tiIHRvIHR4X2J1ZmYgd2hpbGUgd3JhcHBpbmcsIHN0dWZmaW5nIGFuZCBtYWtpbmcgQ1JDICovCi0Jc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCisJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwKIAkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7Ci0JCisKIAlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKIAogCS8qIFR1cm4gb24gdHJhbnNtaXQgZmluaXNoZWQgaW50ZXJydXB0LiBXaWxsIGZpcmUgaW1tZWRpYXRlbHkhICAqLwotCW91dGIoVUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsgCisJb3V0YihVQVJUX0lFUl9USFJJLCBzZWxmLT5pby5zaXJfYmFzZSArIFVBUlRfSUVSKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKIAogCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkKKwogCXJldHVybiAwOwogfQogCkBAIC04MjYsOSArODUwLDkgQEAKIAogCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CiAKLQlzd2l0Y2goc3BlZWQpIHsKKwlzd2l0Y2ggKHNwZWVkKSB7CiAJZGVmYXVsdDoKLQljYXNlIDU3NjAwMDoJCQorCWNhc2UgNTc2MDAwOgogCQlpcl9tb2RlID0gSVJDQ19DRkdBX0lSREFfSERMQzsKIAkJY3RybCA9IElSQ0NfQ1JDOwogCQlmYXN0ID0gMDsKQEAgLTg1MywxNCArODc3LDE0IEBACiAJTm93IGluIHRyYW5jZWl2ZXIhCiAJLyogVGhpcyBjYXVzZXMgYW4gaW50ZXJydXB0ICovCiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7Ci0Jb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdCwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7CisJb3V0YigoaW5iKGZpcl9iYXNlICsgSVJDQ19MQ1JfQSkgJiAgMHhiZikgfCBmYXN0LCBmaXJfYmFzZSArIElSQ0NfTENSX0EpOwogCSNlbmRpZgotCQorCiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMSk7Ci0Jb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdBKSAmIElSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0spIHwgaXJfbW9kZSksIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpOwotCQorCW91dGIoKChpbmIoZmlyX2Jhc2UgKyBJUkNDX1NDRV9DRkdBKSAmIElSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0spIHwgaXJfbW9kZSksIGZpcl9iYXNlICsgSVJDQ19TQ0VfQ0ZHQSk7CisKIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCA0KTsKLQlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19DT05UUk9MKSAmIDB4MzApIHwgY3RybCwgZmlyX2Jhc2UrSVJDQ19DT05UUk9MKTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UgKyBJUkNDX0NPTlRST0wpICYgMHgzMCkgfCBjdHJsLCBmaXJfYmFzZSArIElSQ0NfQ09OVFJPTCk7CiB9CiAKIC8qCkBAIC04ODUsMzEgKzkwOSwzMSBAQAogCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgKi8KIAogCS8qIEluc3RhbGwgRklSIHRyYW5zbWl0IGhhbmRsZXIgKi8KLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNtc2NfaXJjY19oYXJkX3htaXRfZmlyOwkKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNtc2NfaXJjY19oYXJkX3htaXRfZmlyOwogCiAJLyogQ2xlYXIgRklGTyAqLwotCW91dGIoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpfElSQ0NfTENSX0FfRklGT19SRVNFVCwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7CisJb3V0YihpbmIoZmlyX2Jhc2UgKyBJUkNDX0xDUl9BKSB8IElSQ0NfTENSX0FfRklGT19SRVNFVCwgZmlyX2Jhc2UgKyBJUkNDX0xDUl9BKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KLQkvKm91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FfElSQ0NfSUVSX0VPTSwgZmlyX2Jhc2UrSVJDQ19JRVIpOyovCisJLypvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGZpcl9iYXNlICsgSVJDQ19JRVIpOyovCiAKIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAxKTsKIAotCS8qIFNlbGVjdCB0aGUgVFgvUlggaW50ZXJmYWNlICovCQorCS8qIFNlbGVjdCB0aGUgVFgvUlggaW50ZXJmYWNlICovCiAjaWZkZWYgU01TQ182NjkgLyogVXNlcyBwaW4gODgvODkgZm9yIFJ4L1R4ICovCi0Jb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9DT00pLCAKLQkgICAgIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpOwotI2Vsc2UJCi0Jb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9JUiksCi0JICAgICBmaXJfYmFzZStJUkNDX1NDRV9DRkdCKTsKLSNlbmRpZgkKLQkodm9pZCkgaW5iKGZpcl9iYXNlK0lSQ0NfRklGT19USFJFU0hPTEQpOworCW91dGIoKChpbmIoZmlyX2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9DT00pLAorCSAgICAgZmlyX2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKKyNlbHNlCisJb3V0YigoKGluYihmaXJfYmFzZSArIElSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0lSKSwKKwkgICAgIGZpcl9iYXNlICsgSVJDQ19TQ0VfQ0ZHQik7CisjZW5kaWYKKwkodm9pZCkgaW5iKGZpcl9iYXNlICsgSVJDQ19GSUZPX1RIUkVTSE9MRCk7CiAKIAkvKiBFbmFibGUgU0NFIGludGVycnVwdHMgKi8KLQlvdXRiKDAsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKDAsIGZpcl9iYXNlICsgSVJDQ19NQVNURVIpOwogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOwotCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FfElSQ0NfSUVSX0VPTSwgZmlyX2Jhc2UrSVJDQ19JRVIpOwotCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBmaXJfYmFzZStJUkNDX01BU1RFUik7CisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGZpcl9iYXNlICsgSVJDQ19JRVIpOworCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBmaXJfYmFzZSArIElSQ0NfTUFTVEVSKTsKIH0KIAogLyoKQEAgLTkyMywxMyArOTQ3LDEzIEBACiAJaW50IGZpcl9iYXNlOwogCiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCisKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwogCiAJZmlyX2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKLQkvKm91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsqLwkKLQlvdXRiKGluYihmaXJfYmFzZStJUkNDX0xDUl9CKSAmIElSQ0NfTENSX0JfU0lQX0VOQUJMRSwgZmlyX2Jhc2UrSVJDQ19MQ1JfQik7CisJLypvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBmaXJfYmFzZSArIElSQ0NfTUFTVEVSKTsqLworCW91dGIoaW5iKGZpcl9iYXNlICsgSVJDQ19MQ1JfQikgJiBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIGZpcl9iYXNlICsgSVJDQ19MQ1JfQik7CiB9CiAKIApAQCAtOTQxLDE4ICs5NjUsMTUgQEAKICAqIFRoaXMgZnVuY3Rpb24gKm11c3QqIGJlIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQsIGJlY2F1c2UgaXQgbWF5CiAgKiBiZSBjYWxsZWQgZnJvbSB0aGUgaXJxIGhhbmRsZXIuIC0gSmVhbiBJSQogICovCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIHUzMiBzcGVlZCkKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdTMyIHNwZWVkKQogewotCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBwcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGlvYmFzZTsKIAlpbnQgbGFzdF9zcGVlZF93YXNfc2lyOwotCQorCiAJSVJEQV9ERUJVRygwLCAiJXMoKSBjaGFuZ2luZyBzcGVlZCB0bzogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlkZXYgPSBzZWxmLT5uZXRkZXY7Ci0JaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAKIAlsYXN0X3NwZWVkX3dhc19zaXIgPSBzZWxmLT5pby5zcGVlZCA8PSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQ7CiAKQEAgLTk2MSwzMCArOTgyLDMwIEBACiAJc3BlZWQ9IDExNTIwMDA7CiAJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKIAlsYXN0X3NwZWVkX3dhc19zaXIgPSAwOwotCXNtc2NfaXJjY19maXJfc3RhcnQoc2VsZik7CQorCXNtc2NfaXJjY19maXJfc3RhcnQoc2VsZik7CiAJI2VuZGlmCi0JCi0JaWYoc2VsZi0+aW8uc3BlZWQgPT0gMCkKKworCWlmIChzZWxmLT5pby5zcGVlZCA9PSAwKQogCQlzbXNjX2lyY2Nfc2lyX3N0YXJ0KHNlbGYpOwogCiAJI2lmIDAKLQlpZighbGFzdF9zcGVlZF93YXNfc2lyKSBzcGVlZCA9IHNlbGYtPmlvLnNwZWVkOworCWlmICghbGFzdF9zcGVlZF93YXNfc2lyKSBzcGVlZCA9IHNlbGYtPmlvLnNwZWVkOwogCSNlbmRpZgogCi0JaWYoc2VsZi0+aW8uc3BlZWQgIT0gc3BlZWQpIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwlpZiAoc2VsZi0+aW8uc3BlZWQgIT0gc3BlZWQpCisJCXNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHNlbGYsIHNwZWVkKTsKIAogCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7Ci0JCi0JaWYoc3BlZWQgPD0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEKSB7Ci0JCWlmKCFsYXN0X3NwZWVkX3dhc19zaXIpIHsKKworCWlmIChzcGVlZCA8PSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQpIHsKKwkJaWYgKCFsYXN0X3NwZWVkX3dhc19zaXIpIHsKIAkJCXNtc2NfaXJjY19maXJfc3RvcChzZWxmKTsKIAkJCXNtc2NfaXJjY19zaXJfc3RhcnQoc2VsZik7CiAJCX0KLQkJc21zY19pcmNjX3NldF9zaXJfc3BlZWQoc2VsZiwgc3BlZWQpOyAKLQl9Ci0JZWxzZSB7Ci0JCWlmKGxhc3Rfc3BlZWRfd2FzX3NpcikgewotCQkJI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAkJCisJCXNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwl9IGVsc2UgeworCQlpZiAobGFzdF9zcGVlZF93YXNfc2lyKSB7CisJCQkjaWYgU01TQ19JUkNDMl9DX1NJUl9TVE9QCiAJCQlzbXNjX2lyY2Nfc2lyX3N0b3Aoc2VsZik7CiAJCQkjZW5kaWYKIAkJCXNtc2NfaXJjY19maXJfc3RhcnQoc2VsZik7CkBAIC05OTQsMTMgKzEwMTUsMTMgQEAKIAkJI2lmIDAKIAkJc2VsZi0+dHhfYnVmZi5sZW4gPSAxMDsKIAkJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOwotCQkKLQkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSwgNDAwMCk7CisKKwkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIDQwMDApOwogCQkjZW5kaWYKIAkJLyogQmUgcmVhZHkgZm9yIGluY29taW5nIGZyYW1lcyAqLwotCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZiwgaW9iYXNlKTsKKwkJc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOwogCX0KLQkKKwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIH0KIApAQCAtMTAxMCwxMCArMTAzMSw5IEBACiAgKiAgICBTZXQgc3BlZWQgb2YgSXJEQSBwb3J0IHRvIHNwZWNpZmllZCBiYXVkcmF0ZQogICoKICAqLwotdm9pZCBzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZCh2b2lkICpwcml2LCBfX3UzMiBzcGVlZCkKK3ZvaWQgc21zY19pcmNjX3NldF9zaXJfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgX191MzIgc3BlZWQpCiB7Ci0Jc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIHByaXY7Ci0JaW50IGlvYmFzZTsgCisJaW50IGlvYmFzZTsKIAlpbnQgZmNyOyAgICAvKiBGSUZPIGNvbnRyb2wgcmVnICovCiAJaW50IGxjcjsgICAgLyogTGluZSBjb250cm9sIHJlZyAqLwogCWludCBkaXZpc29yOwpAQCAtMTAyMiwzOCArMTA0MiwzNiBAQAogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKLQkKKwogCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KIAlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOwogCiAJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLwotCW91dGIoMCwgaW9iYXNlK1VBUlRfSUVSKTsgCisJb3V0YigwLCBpb2Jhc2UgKyBVQVJUX0lFUik7CiAKLQlkaXZpc29yID0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEL3NwZWVkOwotCQorCWRpdmlzb3IgPSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQgLyBzcGVlZDsKKwogCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOwogCi0JLyogCisJLyoKIAkgKiBVc2UgdHJpZ2dlciBsZXZlbCAxIHRvIGF2b2lkIDMgbXMuIHRpbWVvdXQgZGVsYXkgYXQgOTYwMCBicHMsIGFuZAogCSAqIGFsbW9zdCAxLDcgbXMgYXQgMTkyMDAgYnBzLiBBdCBzcGVlZHMgYWJvdmUgdGhhdCB3ZSBjYW4ganVzdCBmb3JnZXQKLQkgKiBhYm91dCB0aGlzIHRpbWVvdXQgc2luY2UgaXQgd2lsbCBhbHdheXMgYmUgZmFzdCBlbm91Z2guIAorCSAqIGFib3V0IHRoaXMgdGltZW91dCBzaW5jZSBpdCB3aWxsIGFsd2F5cyBiZSBmYXN0IGVub3VnaC4KIAkgKi8KLQlpZiAoc2VsZi0+aW8uc3BlZWQgPCAzODQwMCkKLQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKLQllbHNlIAotCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKLSAgICAgICAgCisJZmNyIHw9IHNlbGYtPmlvLnNwZWVkIDwgMzg0MDAgPworCQlVQVJUX0ZDUl9UUklHR0VSXzEgOiBVQVJUX0ZDUl9UUklHR0VSXzE0OworCiAJLyogSXJEQSBwb3J0cyB1c2UgOE4xICovCiAJbGNyID0gVUFSVF9MQ1JfV0xFTjg7Ci0JCi0Jb3V0YihVQVJUX0xDUl9ETEFCIHwgbGNyLCBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgRExBQiAqLwotCW91dGIoZGl2aXNvciAmIDB4ZmYsICAgICAgaW9iYXNlK1VBUlRfRExMKTsgLyogU2V0IHNwZWVkICovCi0Jb3V0YihkaXZpc29yID4+IDgsCSAgaW9iYXNlK1VBUlRfRExNKTsKLQlvdXRiKGxjciwJCSAgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IDhOMQkqLwotCW91dGIoZmNyLAkJICBpb2Jhc2UrVUFSVF9GQ1IpOyAvKiBFbmFibGUgRklGTydzICovCisKKwlvdXRiKFVBUlRfTENSX0RMQUIgfCBsY3IsIGlvYmFzZSArIFVBUlRfTENSKTsgLyogU2V0IERMQUIgKi8KKwlvdXRiKGRpdmlzb3IgJiAweGZmLCAgICAgIGlvYmFzZSArIFVBUlRfRExMKTsgLyogU2V0IHNwZWVkICovCisJb3V0YihkaXZpc29yID4+IDgsCSAgaW9iYXNlICsgVUFSVF9ETE0pOworCW91dGIobGNyLAkJICBpb2Jhc2UgKyBVQVJUX0xDUik7IC8qIFNldCA4TjEgKi8KKwlvdXRiKGZjciwJCSAgaW9iYXNlICsgVUFSVF9GQ1IpOyAvKiBFbmFibGUgRklGTydzICovCiAKIAkvKiBUdXJuIG9uIGludGVycnVwcyAqLwotCW91dGIoVUFSVF9JRVJfUkxTSXxVQVJUX0lFUl9SREl8VUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsKKwlvdXRiKFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfCBVQVJUX0lFUl9USFJJLCBpb2Jhc2UgKyBVQVJUX0lFUik7CiAKIAlJUkRBX0RFQlVHKDIsICIlcygpIHNwZWVkIGNoYW5nZWQgdG86ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKIH0KQEAgLTEwNzAsMTUgKzEwODgsMTIgQEAKIAlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJczMyIHNwZWVkOwotCWludCBpb2Jhc2U7CiAJaW50IG10dDsKIAogCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gMDspOwotCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJc2VsZiA9IG5ldGRldl9wcml2KGRldik7CiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOwogCi0JaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7Ci0KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAkvKiBNYWtlIHN1cmUgdGVzdCBvZiBzZWxmLT5pby5zcGVlZCAmIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCkBAIC0xMDg2LDMwICsxMTAxLDMxIEBACiAKIAkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgYWZ0ZXIgdGhpcyBmcmFtZSAqLwogCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOwotCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwlpZiAoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQgJiYgc3BlZWQgIT0gLTEpIHsKIAkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCiAJCWlmICghc2tiLT5sZW4pIHsKIAkJCS8qIE5vdGUgOiB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHNwZWVkIGNoYW5nZXMKIAkJCSAqIGFyZSBub3QgZ29pbmcgdG8gY29ycnVwdCBhbnkgb3V0Z29pbmcgZnJhbWUuCiAJCQkgKiBMb29rIGF0IG5zYy1pcmNjIGZvciB0aGUgZ29yeSBkZXRhaWxzIC0gSmVhbiBJSSAqLwotCQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7IAorCQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gMDsKLQkJfSBlbHNlCi0JCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwkJfQorCisJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOwogCX0KLQkKKwogCW1lbWNweShzZWxmLT50eF9idWZmLmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCiAJc2VsZi0+dHhfYnVmZi5sZW4gPSBza2ItPmxlbjsKIAlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7Ci0JCi0JbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CQorCisJbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CiAJaWYgKG10dCkgewogCQlpbnQgYm9mczsKIAotCQkvKiAKKwkJLyoKIAkJICogQ29tcHV0ZSBob3cgbWFueSBCT0ZzIChTVEEgb3IgUEEncykgd2UgbmVlZCB0byB3YXN0ZSB0aGUKIAkJICogbWluIHR1cm4gdGltZSBnaXZlbiB0aGUgc3BlZWQgb2YgdGhlIGxpbmsuCiAJCSAqLwpAQCAtMTExNywxMSArMTEzMywxMiBAQAogCQlpZiAoYm9mcyA+IDQwOTUpCiAJCQlib2ZzID0gNDA5NTsKIAotCQlzbXNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlLCBib2ZzKTsKKwkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIGJvZnMpOwogCX0gZWxzZSB7CiAJCS8qIFRyYW5zbWl0IGZyYW1lICovCi0JCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UsIDApOworCQlzbXNjX2lyY2NfZG1hX3htaXQoc2VsZiwgMCk7CiAJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwogCWRldl9rZnJlZV9za2Ioc2tiKTsKIApAQCAtMTEyOSw0MyArMTE0Niw0NCBAQAogfQogCiAvKgotICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV94bWl0IChzZWxmLCBpb2Jhc2UpCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3htaXQgKHNlbGYsIGJvZnMpCiAgKgogICogICAgVHJhbnNtaXQgZGF0YSB1c2luZyBETUEKICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlLCBpbnQgYm9mcykKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgYm9mcykKIHsKKwlpbnQgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAJdTggY3RybDsKIAogCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogI2lmIDEKIAkvKiBEaXNhYmxlIFJ4ICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTENSX0IpOworCW91dGIoMHgwMCwgaW9iYXNlICsgSVJDQ19MQ1JfQik7CiAjZW5kaWYKIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7Ci0Jb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLCAKLQkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKwlvdXRiKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwKKwkgICAgIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOwogCiAJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKIAogCS8qIFNldCBCT0YgYWRkaXRpb25hbCBjb3VudCBmb3IgZ2VuZXJhdGluZyB0aGUgbWluIHR1cm4gdGltZSAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCA0KTsKLQlvdXRiKGJvZnMgJiAweGZmLCBpb2Jhc2UrSVJDQ19CT0ZfQ09VTlRfTE8pOwotCWN0cmwgPSBpbmIoaW9iYXNlK0lSQ0NfQ09OVFJPTCkgJiAweGYwOwotCW91dGIoY3RybCB8ICgoYm9mcyA+PiA4KSAmIDB4MGYpLCBpb2Jhc2UrSVJDQ19CT0ZfQ09VTlRfSEkpOworCW91dGIoYm9mcyAmIDB4ZmYsIGlvYmFzZSArIElSQ0NfQk9GX0NPVU5UX0xPKTsKKwljdHJsID0gaW5iKGlvYmFzZSArIElSQ0NfQ09OVFJPTCkgJiAweGYwOworCW91dGIoY3RybCB8ICgoYm9mcyA+PiA4KSAmIDB4MGYpLCBpb2Jhc2UgKyBJUkNDX0JPRl9DT1VOVF9ISSk7CiAKIAkvKiBTZXQgbWF4IFR4IGZyYW1lIHNpemUgKi8KLQlvdXRiKHNlbGYtPnR4X2J1ZmYubGVuID4+IDgsIGlvYmFzZStJUkNDX1RYX1NJWkVfSEkpOwotCW91dGIoc2VsZi0+dHhfYnVmZi5sZW4gJiAweGZmLCBpb2Jhc2UrSVJDQ19UWF9TSVpFX0xPKTsKKwlvdXRiKHNlbGYtPnR4X2J1ZmYubGVuID4+IDgsIGlvYmFzZSArIElSQ0NfVFhfU0laRV9ISSk7CisJb3V0YihzZWxmLT50eF9idWZmLmxlbiAmIDB4ZmYsIGlvYmFzZSArIElSQ0NfVFhfU0laRV9MTyk7CiAKIAkvKm91dGIoVUFSVF9NQ1JfT1VUMiwgc2VsZi0+aW8uc2lyX2Jhc2UgKyBVQVJUX01DUik7Ki8KLQkKKwogCS8qIEVuYWJsZSBidXJzdCBtb2RlIGNoaXAgVHggRE1BICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOwotCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSB8IElSQ0NfQ0ZHQl9ETUFfRU5BQkxFIHwKLQkgICAgIElSQ0NfQ0ZHQl9ETUFfQlVSU1QsIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKwlvdXRiKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSB8IElSQ0NfQ0ZHQl9ETUFfRU5BQkxFIHwKKwkgICAgIElSQ0NfQ0ZHQl9ETUFfQlVSU1QsIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOwogCiAJLyogU2V0dXAgRE1BIGNvbnRyb2xsZXIgKG11c3QgYmUgZG9uZSBhZnRlciBlbmFibGluZyBjaGlwIERNQSkgKi8KIAlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnR4X2J1ZmZfZG1hLCBzZWxmLT50eF9idWZmLmxlbiwKQEAgLTExNzQsNTAgKzExOTIsNTIgQEAKIAkvKiBFbmFibGUgaW50ZXJydXB0ICovCiAKIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0Jb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGlvYmFzZStJUkNDX0lFUik7Ci0Jb3V0YihJUkNDX01BU1RFUl9JTlRfRU4sIGlvYmFzZStJUkNDX01BU1RFUik7Ci0JCisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGlvYmFzZSArIElSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgaW9iYXNlICsgSVJDQ19NQVNURVIpOworCiAJLyogRW5hYmxlIHRyYW5zbWl0ICovCi0Jb3V0YihJUkNDX0xDUl9CX1NDRV9UUkFOU01JVCB8IElSQ0NfTENSX0JfU0lQX0VOQUJMRSwgaW9iYXNlK0lSQ0NfTENSX0IpOworCW91dGIoSVJDQ19MQ1JfQl9TQ0VfVFJBTlNNSVQgfCBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIGlvYmFzZSArIElSQ0NfTENSX0IpOwogfQogCiAvKgogICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQogICoKLSAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZyYW1lIGluIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgCisgKiAgICBUaGUgdHJhbnNmZXIgb2YgYSBmcmFtZSBpbiBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkCiAgKiAgICBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQorc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCiB7CisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCiAJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAjaWYgMAogCS8qIERpc2FibGUgVHggKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0Jb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX0xDUl9CKTsKICNlbmRpZgotCXJlZ2lzdGVyX2Jhbmsoc2VsZi0+aW8uZmlyX2Jhc2UsIDEpOwotCW91dGIoaW5iKHNlbGYtPmlvLmZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLAotCSAgICAgc2VsZi0+aW8uZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoaW5iKGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLAorCSAgICAgaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQik7CiAKIAkvKiBDaGVjayBmb3IgdW5kZXJydW4hICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCWlmIChpbmIoaW9iYXNlK0lSQ0NfTFNSKSAmIElSQ0NfTFNSX1VOREVSUlVOKSB7CisJaWYgKGluYihpb2Jhc2UgKyBJUkNDX0xTUikgJiBJUkNDX0xTUl9VTkRFUlJVTikgewogCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAogCQkvKiBSZXNldCBlcnJvciBjb25kaXRpb24gKi8KIAkJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCQlvdXRiKElSQ0NfTUFTVEVSX0VSUk9SX1JFU0VULCBpb2Jhc2UrSVJDQ19NQVNURVIpOwotCQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisJCW91dGIoSVJDQ19NQVNURVJfRVJST1JfUkVTRVQsIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKKwkJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiAJfSBlbHNlIHsKIAkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSAgc2VsZi0+dHhfYnVmZi5sZW47CisJCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCX0KIAogCS8qIENoZWNrIGlmIGl0J3MgdGltZSB0byBjaGFuZ2UgdGhlIHNwZWVkICovCiAJaWYgKHNlbGYtPm5ld19zcGVlZCkgewotCQlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CQkKKwkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOwogCQlzZWxmLT5uZXdfc3BlZWQgPSAwOwogCX0KIApAQCAtMTIzMSwzMSArMTI1MSwzMiBAQAogICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KICAqCiAgKi8KLXN0YXRpYyBpbnQgc21zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpIAorc3RhdGljIGludCBzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKIHsKKwlpbnQgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAjaWYgMAogCS8qIFR1cm4gb2ZmIGNoaXAgRE1BICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOwotCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwgCi0JICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisJb3V0YihpbmIoaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsCisJICAgICBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKICNlbmRpZgotCQorCiAJLyogRGlzYWJsZSBUeCAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKwlvdXRiKDB4MDAsIGlvYmFzZSArIElSQ0NfTENSX0IpOwogCiAJLyogVHVybiBvZmYgY2hpcCBETUEgKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7Ci0Jb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLCAKLQkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKwlvdXRiKGluYihpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwKKwkgICAgIGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpOwogCiAJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKIAlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CiAKIAkvKiBTZXQgbWF4IFJ4IGZyYW1lIHNpemUgKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgNCk7Ci0Jb3V0YigoMjA1MCA+PiA4KSAmIDB4MGYsIGlvYmFzZStJUkNDX1JYX1NJWkVfSEkpOwotCW91dGIoMjA1MCAmIDB4ZmYsIGlvYmFzZStJUkNDX1JYX1NJWkVfTE8pOworCW91dGIoKDIwNTAgPj4gOCkgJiAweDBmLCBpb2Jhc2UgKyBJUkNDX1JYX1NJWkVfSEkpOworCW91dGIoMjA1MCAmIDB4ZmYsIGlvYmFzZSArIElSQ0NfUlhfU0laRV9MTyk7CiAKIAkvKiBTZXR1cCBETUEgY29udHJvbGxlciAqLwogCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+cnhfYnVmZl9kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCkBAIC0xMjYzLDgzICsxMjg0LDgzIEBACiAKIAkvKiBFbmFibGUgYnVyc3QgbW9kZSBjaGlwIFJ4IERNQSAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKLQlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgfCBJUkNDX0NGR0JfRE1BX0VOQUJMRSB8IAotCSAgICAgSVJDQ19DRkdCX0RNQV9CVVJTVCwgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCW91dGIoaW5iKGlvYmFzZSArIElSQ0NfU0NFX0NGR0IpIHwgSVJDQ19DRkdCX0RNQV9FTkFCTEUgfAorCSAgICAgSVJDQ19DRkdCX0RNQV9CVVJTVCwgaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQik7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0ICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBpb2Jhc2UrSVJDQ19JRVIpOwotCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBpb2Jhc2UrSVJDQ19NQVNURVIpOwotCisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGlvYmFzZSArIElSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgaW9iYXNlICsgSVJDQ19NQVNURVIpOwogCiAJLyogRW5hYmxlIHJlY2VpdmVyICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoSVJDQ19MQ1JfQl9TQ0VfUkVDRUlWRSB8IElSQ0NfTENSX0JfU0lQX0VOQUJMRSwgCi0JICAgICBpb2Jhc2UrSVJDQ19MQ1JfQik7Ci0JCisJb3V0YihJUkNDX0xDUl9CX1NDRV9SRUNFSVZFIHwgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFLAorCSAgICAgaW9iYXNlICsgSVJDQ19MQ1JfQik7CisKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZikKICAqCiAgKiAgICBGaW5pc2hlZCB3aXRoIHJlY2VpdmluZyBmcmFtZXMKICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQorc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgbGVuLCBtc2djbnQsIGxzcjsKLQkKKwlpbnQgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7Ci0JCisKIAlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKICNpZiAwCiAJLyogRGlzYWJsZSBSeCAqLwogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKwlvdXRiKDB4MDAsIGlvYmFzZSArIElSQ0NfTENSX0IpOwogI2VuZGlmCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoaW5iKGlvYmFzZStJUkNDX0xTQVIpICYgfklSQ0NfTFNBUl9BRERSRVNTX01BU0ssIGlvYmFzZStJUkNDX0xTQVIpOwotCWxzcj0gaW5iKGlvYmFzZStJUkNDX0xTUik7Ci0JbXNnY250ID0gaW5iKGlvYmFzZStJUkNDX0xDUl9CKSAmIDB4MDg7CisJb3V0YihpbmIoaW9iYXNlICsgSVJDQ19MU0FSKSAmIH5JUkNDX0xTQVJfQUREUkVTU19NQVNLLCBpb2Jhc2UgKyBJUkNDX0xTQVIpOworCWxzcj0gaW5iKGlvYmFzZSArIElSQ0NfTFNSKTsKKwltc2djbnQgPSBpbmIoaW9iYXNlICsgSVJDQ19MQ1JfQikgJiAweDA4OwogCiAJSVJEQV9ERUJVRygyLCAiJXM6IGRtYSBjb3VudCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCSAgIGdldF9kbWFfcmVzaWR1ZShzZWxmLT5pby5kbWEpKTsKIAogCWxlbiA9IHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgLSBnZXRfZG1hX3Jlc2lkdWUoc2VsZi0+aW8uZG1hKTsKIAotCS8qIExvb2sgZm9yIGVycm9ycyAKLQkgKi8JCi0KLQlpZihsc3IgJiAoSVJDQ19MU1JfRlJBTUVfRVJST1IgfCBJUkNDX0xTUl9DUkNfRVJST1IgfCBJUkNDX0xTUl9TSVpFX0VSUk9SKSkgeworCS8qIExvb2sgZm9yIGVycm9ycyAqLworCWlmIChsc3IgJiAoSVJDQ19MU1JfRlJBTUVfRVJST1IgfCBJUkNDX0xTUl9DUkNfRVJST1IgfCBJUkNDX0xTUl9TSVpFX0VSUk9SKSkgewogCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJaWYobHNyICYgSVJDQ19MU1JfRlJBTUVfRVJST1IpIHNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCQlpZihsc3IgJiBJUkNDX0xTUl9DUkNfRVJST1IpIHNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJaWYobHNyICYgSVJDQ19MU1JfU0laRV9FUlJPUikgc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQlpZihsc3IgJiAoSVJDQ19MU1JfVU5ERVJSVU4gfCBJUkNDX0xTUl9PVkVSUlVOKSkgc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAobHNyICYgSVJDQ19MU1JfRlJBTUVfRVJST1IpCisJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKGxzciAmIElSQ0NfTFNSX0NSQ19FUlJPUikKKwkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKGxzciAmIElSQ0NfTFNSX1NJWkVfRVJST1IpCisJCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChsc3IgJiAoSVJDQ19MU1JfVU5ERVJSVU4gfCBJUkNDX0xTUl9PVkVSUlVOKSkKKwkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KLQkvKiBSZW1vdmUgQ1JDICovCi0JaWYgKHNlbGYtPmlvLnNwZWVkIDwgNDAwMDAwMCkKLQkJbGVuIC09IDI7Ci0JZWxzZQotCQlsZW4gLT0gNDsKIAotCWlmICgobGVuIDwgMikgfHwgKGxlbiA+IDIwNTApKSB7CisJLyogUmVtb3ZlIENSQyAqLworCWxlbiAtPSBzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDAgPyAyIDogNDsKKworCWlmIChsZW4gPCAyIHx8IGxlbiA+IDIwNTApIHsKIAkJSVJEQV9XQVJOSU5HKCIlcygpLCBib2d1cyBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKIAkJcmV0dXJuOwogCX0KIAlJUkRBX0RFQlVHKDIsICIlczogbXNnY250ID0gJWQsIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCBtc2djbnQsIGxlbik7CiAKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKLQlpZiAoIXNrYikgIHsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEpOworCWlmICghc2tiKSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIGZyYW1lLlxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwotCX0JCQkKKwl9CiAJLyogTWFrZSBzdXJlIElQIGhlYWRlciBnZXRzIGFsaWduZWQgKi8KLQlza2JfcmVzZXJ2ZShza2IsIDEpOyAKKwlza2JfcmVzZXJ2ZShza2IsIDEpOwogCiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbik7CiAJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtMTM1Nyw3ICsxMzc4LDcgQEAKICAqICAgIFJlY2VpdmUgb25lIGZyYW1lIGZyb20gdGhlIGluZnJhcmVkIHBvcnQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKSAKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQogewogCWludCBib2d1c2NvdW50ID0gMDsKIAlpbnQgaW9iYXNlOwpAQCAtMTM2NiwyMCArMTM4NywyMCBAQAogCiAJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CiAKLQkvKiAgCi0JICogUmVjZWl2ZSBhbGwgY2hhcmFjdGVycyBpbiBSeCBGSUZPLCB1bndyYXAgYW5kIHVuc3R1ZmYgdGhlbS4gCi0gICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzICAKKwkvKgorCSAqIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTywgdW53cmFwIGFuZCB1bnN0dWZmIHRoZW0uCisgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzCiAJICovCiAJZG8gewotCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAotCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwKKwkJCQkgIGluYihpb2Jhc2UgKyBVQVJUX1JYKSk7CiAKIAkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCiAJCWlmIChib2d1c2NvdW50KysgPiAzMikgewogCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgYnJlYWtpbmchXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJYnJlYWs7CiAJCX0KLQl9IHdoaWxlIChpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKTsJCisJfSB3aGlsZSAoaW5iKGlvYmFzZSArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKTsKIH0KIAogCkBAIC0xMzk3LDE4ICsxNDE4LDE5IEBACiAJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CiAKIAlpZiAoZGV2ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLAogCQkgICAgICAgZHJpdmVyX25hbWUsIGlycSk7CiAJCWdvdG8gaXJxX3JldDsKIAl9Ci0Jc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKworCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIElSUV9OT05FOyk7CiAKIAkvKiBTZXJpYWxpc2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGluIHZhcmlvdXMgQ1BVcywgc3RvcCBUeCBwYXRoICovCi0Jc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsJCisJc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsKIAogCS8qIENoZWNrIGlmIHdlIHNob3VsZCB1c2UgdGhlIFNJUiBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWlmIChzZWxmLT5pby5zcGVlZCA8PSAgU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEKSB7CisJaWYgKHNlbGYtPmlvLnNwZWVkIDw9IFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRCkgewogCQlyZXQgPSBzbXNjX2lyY2NfaW50ZXJydXB0X3NpcihkZXYpOwogCQlnb3RvIGlycV9yZXRfdW5sb2NrOwogCX0KQEAgLTE0MTYsMjUgKzE0MzgsMjUgQEAKIAlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAogCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKLQlpaXIgPSBpbmIoaW9iYXNlK0lSQ0NfSUlSKTsKLQlpZiAoaWlyID09IDApIAorCWlpciA9IGluYihpb2Jhc2UgKyBJUkNDX0lJUik7CisJaWYgKGlpciA9PSAwKQogCQlnb3RvIGlycV9yZXRfdW5sb2NrOwogCXJldCA9IElSUV9IQU5ETEVEOwogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCi0Jb3V0YigwLCBpb2Jhc2UrSVJDQ19JRVIpOwotCWxjcmEgPSBpbmIoaW9iYXNlK0lSQ0NfTENSX0EpOwotCWxzciA9IGluYihpb2Jhc2UrSVJDQ19MU1IpOwotCQorCW91dGIoMCwgaW9iYXNlICsgSVJDQ19JRVIpOworCWxjcmEgPSBpbmIoaW9iYXNlICsgSVJDQ19MQ1JfQSk7CisJbHNyID0gaW5iKGlvYmFzZSArIElSQ0NfTFNSKTsKKwogCUlSREFfREVCVUcoMiwgIiVzKCksIGlpciA9IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBpaXIpOwogCiAJaWYgKGlpciAmIElSQ0NfSUlSX0VPTSkgewogCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1JFQ1YpCi0JCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKTsKKwkJCXNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmKTsKIAkJZWxzZQotCQkJc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHNlbGYsIGlvYmFzZSk7Ci0JCQotCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZiwgaW9iYXNlKTsKKwkJCXNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzZWxmKTsKKworCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CiAJfQogCiAJaWYgKGlpciAmIElSQ0NfSUlSX0FDVElWRV9GUkFNRSkgewpAQCAtMTQ0NCw3ICsxNDY2LDcgQEAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyBhZ2FpbiAqLwogCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FfElSQ0NfSUVSX0VPTSwgaW9iYXNlK0lSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRSB8IElSQ0NfSUVSX0VPTSwgaW9iYXNlICsgSVJDQ19JRVIpOwogCiAgaXJxX3JldF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJnNlbGYtPmxvY2spOwpAQCAtMTQ1OSw3ICsxNDgxLDcgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IHNtc2NfaXJjY19pbnRlcnJ1cHRfc2lyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgYm9ndXNjb3VudCA9IDA7CiAJaW50IGlvYmFzZTsKIAlpbnQgaWlyLCBsc3I7CkBAIC0xNDY5LDE0ICsxNDkxLDE0IEBACiAKIAlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKIAotCWlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpICYgVUFSVF9JSVJfSUQ7CisJaWlyID0gaW5iKGlvYmFzZSArIFVBUlRfSUlSKSAmIFVBUlRfSUlSX0lEOwogCWlmIChpaXIgPT0gMCkKIAkJcmV0dXJuIElSUV9OT05FOwogCXdoaWxlIChpaXIpIHsKIAkJLyogQ2xlYXIgaW50ZXJydXB0ICovCi0JCWxzciA9IGluYihpb2Jhc2UrVUFSVF9MU1IpOworCQlsc3IgPSBpbmIoaW9iYXNlICsgVUFSVF9MU1IpOwogCi0JCUlSREFfREVCVUcoNCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwKIAkJCSAgICBfX0ZVTkNUSU9OX18sIGlpciwgbHNyLCBpb2Jhc2UpOwogCiAJCXN3aXRjaCAoaWlyKSB7CkBAIC0xNDk2LDEzICsxNTE4LDEzIEBACiAJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmhhbmRsZWQgSUlSPSUjeFxuIiwKIAkJCQkgICBfX0ZVTkNUSU9OX18sIGlpcik7CiAJCQlicmVhazsKLQkJfSAKLQkJCisJCX0KKwogCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvIGxvbmcgKi8KIAkJaWYgKGJvZ3VzY291bnQrKyA+IDEwMCkKIAkJCWJyZWFrOwogCi0gCSAgICAgICAgaWlyID0gaW5iKGlvYmFzZSArIFVBUlRfSUlSKSAmIFVBUlRfSUlSX0lEOworCSAgICAgICAgaWlyID0gaW5iKGlvYmFzZSArIFVBUlRfSUlSKSAmIFVBUlRfSUlSX0lEOwogCX0KIAkvKnNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsqLwogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE1MjksNyArMTU1MSw3IEBACiAJCSAgIGdldF9kbWFfcmVzaWR1ZShzZWxmLT5pby5kbWEpKTsKIAogCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOwotCQorCiAJcmV0dXJuIHN0YXR1czsKIH0KICNlbmRpZiAvKiB1bnVzZWQgKi8KQEAgLTE1NDQsMTkgKzE1NjYsMTYgQEAKIHN0YXRpYyBpbnQgc21zY19pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKLQlpbnQgaW9iYXNlOwogCWNoYXIgaHduYW1lWzE2XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCi0JSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOwotCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7Ci0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOwotCQotCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwogCi0JaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgc21zY19pcmNjX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCAKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IG5ldGRldl9wcml2KGRldik7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgc21zY19pcmNjX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLAogCQkJKHZvaWQgKikgZGV2KSkgewogCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLAogCQkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5pcnEpOwpAQCAtMTU2OCwxNCArMTU4NywxNCBAQAogCXNlbGYtPmlvLnNwZWVkID0gMDsKIAlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIFNNU0NfSVJDQzJfQ19JUkRBX0ZBTExCQUNLX1NQRUVEKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7Ci0JCisKIAkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCiAJLyogSXQgd291bGQgYmUgY29vbCB0byBvZmZlciB0aGUgY2hpcCByZXZpc2lvbiBoZXJlIC0gSmVhbiBJSSAqLwogCXNwcmludGYoaHduYW1lLCAiU01TQyBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKIAotCS8qIAorCS8qCiAJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCi0JICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkKIAkgKi8KIAlzZWxmLT5pcmxhcCA9IGlybGFwX29wZW4oZGV2LCAmc2VsZi0+cW9zLCBod25hbWUpOwogCkBAIC0xNTkwLDcgKzE2MDksNyBAQAogCQkJICAgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmRtYSk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KLQkKKwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTE2MDUsNzMgKzE2MjQsNTMgQEAKIHN0YXRpYyBpbnQgc21zY19pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7Ci0JaW50IGlvYmFzZTsKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCQorCiAJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOwotCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CQorCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKLQkKLQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAogCS8qIFN0b3AgZGV2aWNlICovCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQorCiAJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCiAJaWYgKHNlbGYtPmlybGFwKQogCQlpcmxhcF9jbG9zZShzZWxmLT5pcmxhcCk7CiAJc2VsZi0+aXJsYXAgPSBOVUxMOwogCiAJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOwotCiAJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKLQogCWZyZWVfZG1hKHNlbGYtPmlvLmRtYSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQorc3RhdGljIGludCBzbXNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQogeworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwogCUlSREFfTUVTU0FHRSgiJXMsIFN1c3BlbmRpbmdcbiIsIGRyaXZlcl9uYW1lKTsKIAotCWlmIChzZWxmLT5pby5zdXNwZW5kZWQpCi0JCXJldHVybjsKKwlpZiAobGV2ZWwgPT0gU1VTUEVORF9ESVNBQkxFICYmICFzZWxmLT5pby5zdXNwZW5kZWQpIHsKKwkJc21zY19pcmNjX25ldF9jbG9zZShzZWxmLT5uZXRkZXYpOworCQlzZWxmLT5pby5zdXNwZW5kZWQgPSAxOworCX0KIAotCXNtc2NfaXJjY19uZXRfY2xvc2Uoc2VsZi0+bmV0ZGV2KTsKLQotCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDE7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNtc2NfaXJjY193YWtldXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3N0YXRpYyBpbnQgc21zY19pcmNjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKIHsKLQlpZiAoIXNlbGYtPmlvLnN1c3BlbmRlZCkKLQkJcmV0dXJuOworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCS8qIFRoZSBjb2RlIHdhcyBkb2luZyBhICJjbGkoKSIgaGVyZSwgYnV0IHRoaXMgY2FuJ3QgYmUgcmlnaHQuCi0JICogSWYgeW91IG5lZWQgcHJvdGVjdGlvbiwgZG8gaXQgaW4gbmV0X29wZW4gd2l0aCBhIHNwaW5sb2NrCi0JICogb3IgZ2l2ZSBhIGdvb2QgcmVhc29uLiAtIEplYW4gSUkgKi8KKwlpZiAobGV2ZWwgPT0gUkVTVU1FX0VOQUJMRSAmJiBzZWxmLT5pby5zdXNwZW5kZWQpIHsKIAotCXNtc2NfaXJjY19uZXRfb3BlbihzZWxmLT5uZXRkZXYpOwotCQotCUlSREFfTUVTU0FHRSgiJXMsIFdha2luZyB1cFxuIiwgZHJpdmVyX25hbWUpOwotfQorCQlzbXNjX2lyY2NfbmV0X29wZW4oc2VsZi0+bmV0ZGV2KTsKKwkJc2VsZi0+aW8uc3VzcGVuZGVkID0gMDsKIAotc3RhdGljIGludCBzbXNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCi17Ci0gICAgICAgIHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiopIGRldi0+ZGF0YTsKLSAgICAgICAgaWYgKHNlbGYpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJxc3QpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBNX1NVU1BFTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbXNjX2lyY2Nfc3VzcGVuZChzZWxmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUE1fUkVTVU1FOgotICAgICAgICAgICAgICAgICAgICAgICAgc21zY19pcmNjX3dha2V1cChzZWxmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlJUkRBX01FU1NBR0UoIiVzLCBXYWtpbmcgdXBcbiIsIGRyaXZlcl9uYW1lKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2OTAsMTAgKzE2ODksNyBAQAogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAotCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwotCi0JaWYgKHNlbGYtPnBtZGV2KQotCQlwbV91bnJlZ2lzdGVyKHNlbGYtPnBtZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZWxmLT5wbGRldik7CiAKIAkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCiAJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKQEAgLTE3MDIsMTUgKzE2OTgsMTYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOwogCiAJLyogU3RvcCBpbnRlcnJ1cHRzICovCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOwotCW91dGIoMCwgaW9iYXNlK0lSQ0NfSUVSKTsKLQlvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBpb2Jhc2UrSVJDQ19NQVNURVIpOwotCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKDAsIGlvYmFzZSArIElSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CisJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiAjaWYgMAogCS8qIFJlc2V0IHRvIFNJUiBtb2RlICovCiAJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOwotICAgICAgICBvdXRiKElSQ0NfQ0ZHQV9JUkRBX1NJUl9BfElSQ0NfQ0ZHQV9UWF9QT0xBUklUWSwgaW9iYXNlK0lSQ0NfU0NFX0NGR0EpOwotICAgICAgICBvdXRiKElSQ0NfQ0ZHQl9JUiwgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworICAgICAgICBvdXRiKElSQ0NfQ0ZHQV9JUkRBX1NJUl9BfElSQ0NfQ0ZHQV9UWF9QT0xBUklUWSwgaW9iYXNlICsgSVJDQ19TQ0VfQ0ZHQSk7CisgICAgICAgIG91dGIoSVJDQ19DRkdCX0lSLCBpb2Jhc2UgKyBJUkNDX1NDRV9DRkdCKTsKICNlbmRpZgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTcyMCw3ICsxNzE3LDcgQEAKIAogCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKIAotCUlSREFfREVCVUcoMCwgIiVzKCksIHJlbGVhc2luZyAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywgCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVsZWFzaW5nIDB4JTAzeFxuIiwgX19GVU5DVElPTl9fLAogCQkgICBzZWxmLT5pby5zaXJfYmFzZSk7CiAKIAlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5zaXJfYmFzZSwgc2VsZi0+aW8uc2lyX2V4dCk7CkBAIC0xNzI4LDcgKzE3MjUsNyBAQAogCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCiAJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCiAJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKLQkKKwogCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCiAJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCiAJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKQEAgLTE3NDQsMTAgKzE3NDEsMTIgQEAKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JZm9yIChpPTA7IGkgPCAyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCWlmIChkZXZfc2VsZltpXSkKIAkJCXNtc2NfaXJjY19jbG9zZShkZXZfc2VsZltpXSk7CiAJfQorCisJZHJpdmVyX3VucmVnaXN0ZXIoJnNtc2NfaXJjY19kcml2ZXIpOwogfQogCiAvKgpAQCAtMTc2MywzNCArMTc2MiwzNCBAQAogCiAJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwkKLQlkZXY9IHNlbGYtPm5ldGRldjsKLQlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuOyk7CQkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCWRldiA9IHNlbGYtPm5ldGRldjsKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc21zY19pcmNjX2hhcmRfeG1pdF9zaXI7CiAKIAlmaXJfYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwogCXNpcl9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CiAKIAkvKiBSZXNldCBldmVyeXRoaW5nICovCi0Jb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOworCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGZpcl9iYXNlICsgSVJDQ19NQVNURVIpOwogCiAJI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAogCS8qc21zY19pcmNjX3Npcl9zdG9wKHNlbGYpOyovCiAJI2VuZGlmCiAKIAlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAxKTsKLQlvdXRiKCgoaW5iKGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpICYgSVJDQ19TQ0VfQ0ZHQV9CTE9DS19DVFJMX0JJVFNfTUFTSykgfCBJUkNDX0NGR0FfSVJEQV9TSVJfQSksIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpOworCW91dGIoKChpbmIoZmlyX2Jhc2UgKyBJUkNDX1NDRV9DRkdBKSAmIElSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0spIHwgSVJDQ19DRkdBX0lSREFfU0lSX0EpLCBmaXJfYmFzZSArIElSQ0NfU0NFX0NGR0EpOwogCiAJLyogSW5pdGlhbGl6ZSBVQVJUICovCi0Jb3V0YihVQVJUX0xDUl9XTEVOOCwgc2lyX2Jhc2UrVUFSVF9MQ1IpOyAgLyogUmVzZXQgRExBQiAqLwotCW91dGIoKFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpLCBzaXJfYmFzZStVQVJUX01DUik7Ci0JCisJb3V0YihVQVJUX0xDUl9XTEVOOCwgc2lyX2Jhc2UgKyBVQVJUX0xDUik7ICAvKiBSZXNldCBETEFCICovCisJb3V0YigoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMiksIHNpcl9iYXNlICsgVUFSVF9NQ1IpOworCiAJLyogVHVybiBvbiBpbnRlcnJ1cHMgKi8KLQlvdXRiKFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfFVBUlRfSUVSX1RIUkksIHNpcl9iYXNlK1VBUlRfSUVSKTsKKwlvdXRiKFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfFVBUlRfSUVSX1RIUkksIHNpcl9iYXNlICsgVUFSVF9JRVIpOwogCiAJSVJEQV9ERUJVRygzLCAiJXMoKSAtIGV4aXRcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlvdXRiKDB4MDAsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKDB4MDAsIGZpcl9iYXNlICsgSVJDQ19NQVNURVIpOwogfQogCiAjaWYgU01TQ19JUkNDMl9DX1NJUl9TVE9QCkBAIC0xODAyLDEwICsxODAxLDEwIEBACiAJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CiAKIAkvKiBSZXNldCBVQVJUICovCi0Jb3V0YigwLCBpb2Jhc2UrVUFSVF9NQ1IpOwotCQorCW91dGIoMCwgaW9iYXNlICsgVUFSVF9NQ1IpOworCiAJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLwotCW91dGIoMCwgaW9iYXNlK1VBUlRfSUVSKTsKKwlvdXRiKDAsIGlvYmFzZSArIFVBUlRfSUVSKTsKIH0KICNlbmRpZgogCkBAIC0xODMxLDE2ICsxODMwLDE2IEBACiAJLyogRmluaXNoZWQgd2l0aCBmcmFtZT8gICovCiAJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgIHsKIAkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLwotCQlhY3R1YWwgPSBzbXNjX2lyY2Nfc2lyX3dyaXRlKGlvYmFzZSwgc2VsZi0+aW8uZmlmb19zaXplLCAKKwkJYWN0dWFsID0gc21zY19pcmNjX3Npcl93cml0ZShpb2Jhc2UsIHNlbGYtPmlvLmZpZm9fc2l6ZSwKIAkJCQkgICAgICBzZWxmLT50eF9idWZmLmRhdGEsIHNlbGYtPnR4X2J1ZmYubGVuKTsKIAkJc2VsZi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKIAkJc2VsZi0+dHhfYnVmZi5sZW4gIC09IGFjdHVhbDsKIAl9IGVsc2UgewotCQorCiAJLyppZiAoc2VsZi0+dHhfYnVmZi5sZW4gPT0wKSAgeyovCi0JCQotCQkvKiAKLQkJICogIE5vdyBzZXJpYWwgYnVmZmVyIGlzIGFsbW9zdCBmcmVlICYgd2UgY2FuIHN0YXJ0IAorCisJCS8qCisJCSAqICBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydAogCQkgKiAgdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0LiBCdXQgZmlyc3Qgd2UgbXVzdCBjaGVjawogCQkgKiAgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBoYXJkd2FyZQogCQkgKi8KQEAgLTE4NTYsMjEgKzE4NTUsMTkgQEAKIAkJfQogCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CiAKLQkJaWYoc2VsZi0+aW8uc3BlZWQgPD0gMTE1MjAwKSB7Ci0JCS8qIAotCQkgKiBSZXNldCBSeCBGSUZPIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCByZWZsZWN0ZWQgdHJhbnNtaXQgZGF0YQotCQkgKiBpcyBkaXNjYXJkZWQuIFRoaXMgaXMgbmVlZGVkIGZvciBoYWxmIGR1cGxleCBvcGVyYXRpb24KLQkJICovCi0JCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUjsKLQkJaWYgKHNlbGYtPmlvLnNwZWVkIDwgMzg0MDApCi0JCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOwotCQllbHNlIAotCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisJCWlmIChzZWxmLT5pby5zcGVlZCA8PSAxMTUyMDApIHsKKwkJCS8qCisJCQkgKiBSZXNldCBSeCBGSUZPIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCByZWZsZWN0ZWQgdHJhbnNtaXQgZGF0YQorCQkJICogaXMgZGlzY2FyZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgaGFsZiBkdXBsZXggb3BlcmF0aW9uCisJCQkgKi8KKwkJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUjsKKwkJCWZjciB8PSBzZWxmLT5pby5zcGVlZCA8IDM4NDAwID8KKwkJCQkJVUFSVF9GQ1JfVFJJR0dFUl8xIDogVUFSVF9GQ1JfVFJJR0dFUl8xNDsKIAotCQlvdXRiKGZjciwgaW9iYXNlK1VBUlRfRkNSKTsKKwkJCW91dGIoZmNyLCBpb2Jhc2UgKyBVQVJUX0ZDUik7CiAKLQkJLyogVHVybiBvbiByZWNlaXZlIGludGVycnVwdHMgKi8KLQkJb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7CisJCQkvKiBUdXJuIG9uIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCQkJb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZSArIFVBUlRfSUVSKTsKIAkJfQogCX0KIH0KQEAgLTE4ODQsMTcgKzE4ODEsMTcgQEAKIHN0YXRpYyBpbnQgc21zY19pcmNjX3Npcl93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pCiB7CiAJaW50IGFjdHVhbCA9IDA7Ci0JCisKIAkvKiBUeCBGSUZPIHNob3VsZCBiZSBlbXB0eSEgKi8KLQlpZiAoIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkUpKSB7CisJaWYgKCEoaW5iKGlvYmFzZSArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkUpKSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgZmFpbGVkLCBmaWZvIG5vdCBlbXB0eSFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAwOwogCX0KLSAgICAgICAgCisKIAkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCi0Jd2hpbGUgKChmaWZvX3NpemUtLSA+IDApICYmIChhY3R1YWwgPCBsZW4pKSB7CisJd2hpbGUgKGZpZm9fc2l6ZS0tID4gMCAmJiBhY3R1YWwgPCBsZW4pIHsKIAkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCi0JCW91dGIoYnVmW2FjdHVhbF0sIGlvYmFzZStVQVJUX1RYKTsKKwkJb3V0YihidWZbYWN0dWFsXSwgaW9iYXNlICsgVUFSVF9UWCk7CiAJCWFjdHVhbCsrOwogCX0KIAlyZXR1cm4gYWN0dWFsOwpAQCAtMTkyMSwyMCArMTkxOCwyMSBAQAogc3RhdGljIHZvaWQgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCiB7CiAJdW5zaWduZWQgaW50CWk7Ci0JCisKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwotCQotCWZvcihpPTA7IHNtc2NfdHJhbnNjZWl2ZXJzW2ldLm5hbWUhPU5VTEw7IGkrKykgCi0JCWlmKCgqc21zY190cmFuc2NlaXZlcnNbaV0ucHJvYmUpKHNlbGYtPmlvLmZpcl9iYXNlKSkgeworCisJZm9yIChpID0gMDsgc21zY190cmFuc2NlaXZlcnNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCWlmIChzbXNjX3RyYW5zY2VpdmVyc1tpXS5wcm9iZShzZWxmLT5pby5maXJfYmFzZSkpIHsKIAkJCUlSREFfTUVTU0FHRSgiICVzIHRyYW5zY2VpdmVyIGZvdW5kXG4iLAogCQkJCSAgICAgc21zY190cmFuc2NlaXZlcnNbaV0ubmFtZSk7Ci0JCQlzZWxmLT50cmFuc2NlaXZlcj0gaSsxOworCQkJc2VsZi0+dHJhbnNjZWl2ZXI9IGkgKyAxOwogCQkJcmV0dXJuOwogCQl9CisKIAlJUkRBX01FU1NBR0UoIk5vIHRyYW5zY2VpdmVyIGZvdW5kLiBEZWZhdWx0aW5nIHRvICVzXG4iLAogCQkgICAgIHNtc2NfdHJhbnNjZWl2ZXJzW1NNU0NfSVJDQzJfQ19ERUZBVUxUX1RSQU5TQ0VJVkVSXS5uYW1lKTsKLQkJCQotCXNlbGYtPnRyYW5zY2VpdmVyPSBTTVNDX0lSQ0MyX0NfREVGQVVMVF9UUkFOU0NFSVZFUjsKKworCXNlbGYtPnRyYW5zY2VpdmVyID0gU01TQ19JUkNDMl9DX0RFRkFVTFRfVFJBTlNDRUlWRVI7CiB9CiAKIApAQCAtMTk0Nyw5ICsxOTQ1LDEwIEBACiBzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpCiB7CiAJdW5zaWduZWQgaW50IHRyeDsKLQkKKwogCXRyeCA9IHNlbGYtPnRyYW5zY2VpdmVyOwotCWlmKHRyeD4wKSAoKnNtc2NfdHJhbnNjZWl2ZXJzW3RyeC0xXS5zZXRfZm9yX3NwZWVkKShzZWxmLT5pby5maXJfYmFzZSwgc3BlZWQpOworCWlmICh0cnggPiAwKQorCQlzbXNjX3RyYW5zY2VpdmVyc1t0cnggLSAxXS5zZXRfZm9yX3NwZWVkKHNlbGYtPmlvLmZpcl9iYXNlLCBzcGVlZCk7CiB9CiAKIC8qCkBAIC0xOTc3LDE2ICsxOTc2LDE0IEBACiAKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKIHsKLQlpbnQgaW9iYXNlOworCWludCBpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKIAlpbnQgY291bnQgPSBTTVNDX0lSQ0MyX0hXX1RSQU5TTUlUVEVSX1RJTUVPVVRfVVM7Ci0JCi0JaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7Ci0JCisKIAkvKiBDYWxpYnJhdGVkIGJ1c3kgbG9vcCAqLwotCXdoaWxlKChjb3VudC0tID4gMCkgJiYgIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCXdoaWxlIChjb3VudC0tID4gMCAmJiAhKGluYihpb2Jhc2UgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKIAkJdWRlbGF5KDEpOwogCi0JaWYoY291bnQgPT0gMCkKKwlpZiAoY291bnQgPT0gMCkKIAkJSVJEQV9ERUJVRygwLCAiJXMoKTogc3R1Y2sgdHJhbnNtaXR0ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKQEAgLTE5OTgsNDAgKzE5OTUsNDIgQEAKIAogc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX2xvb2tfZm9yX2NoaXBzKHZvaWQpCiB7Ci0Jc21zY19jaGlwX2FkZHJlc3NfdCAqYWRkcmVzczsKLQljaGFyCSp0eXBlOworCXN0cnVjdCBzbXNjX2NoaXBfYWRkcmVzcyAqYWRkcmVzczsKKwljaGFyICp0eXBlOwogCXVuc2lnbmVkIGludCBjZmdfYmFzZSwgZm91bmQ7Ci0JCisKIAlmb3VuZCA9IDA7CiAJYWRkcmVzcyA9IHBvc3NpYmxlX2FkZHJlc3NlczsKLQkKLQl3aGlsZShhZGRyZXNzLT5jZmdfYmFzZSl7CisKKwl3aGlsZSAoYWRkcmVzcy0+Y2ZnX2Jhc2UpIHsKIAkJY2ZnX2Jhc2UgPSBhZGRyZXNzLT5jZmdfYmFzZTsKLQkJCisKIAkJLypwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBwcm9iaW5nOiAweCUwMnggZm9yOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UsIGFkZHJlc3MtPnR5cGUpOyovCi0JCQotCQlpZiggYWRkcmVzcy0+dHlwZSAmIFNNU0NTSU9fVFlQRV9GREMpeworCisJCWlmIChhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX0ZEQykgewogCQkJdHlwZSA9ICJGREMiOwotCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX0ZMQVQpIHsKLQkJCQlpZighc21zY19zdXBlcmlvX2ZsYXQoZmRjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsIHR5cGUpKSBmb3VuZCsrOwotCQkJfQotCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX1BBR0VEKSB7Ci0JCQkJaWYoIXNtc2Nfc3VwZXJpb19wYWdlZChmZGNfY2hpcHNfcGFnZWQsY2ZnX2Jhc2UsIHR5cGUpKSBmb3VuZCsrOwkJCi0JCQl9CQkJCisJCQlpZiAoYWRkcmVzcy0+dHlwZSAmIFNNU0NTSU9fVFlQRV9GTEFUKQorCQkJCWlmICghc21zY19zdXBlcmlvX2ZsYXQoZmRjX2NoaXBzX2ZsYXQsIGNmZ19iYXNlLCB0eXBlKSkKKwkJCQkJZm91bmQrKzsKKworCQkJaWYgKGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfUEFHRUQpCisJCQkJaWYgKCFzbXNjX3N1cGVyaW9fcGFnZWQoZmRjX2NoaXBzX3BhZ2VkLCBjZmdfYmFzZSwgdHlwZSkpCisJCQkJCWZvdW5kKys7CiAJCX0KLQkJaWYoIGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfTFBDKXsKKwkJaWYgKGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfTFBDKSB7CiAJCQl0eXBlID0gIkxQQyI7Ci0JCQlpZigoYWRkcmVzcy0+dHlwZSkgJiBTTVNDU0lPX1RZUEVfRkxBVCkgewotCQkJCWlmKCFzbXNjX3N1cGVyaW9fZmxhdChscGNfY2hpcHNfZmxhdCxjZmdfYmFzZSx0eXBlKSkgZm91bmQrKzsKLQkJCX0KLQkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9QQUdFRCkgewotCQkJCWlmKCFzbXNjX3N1cGVyaW9fcGFnZWQobHBjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCJMUEMiKSkgZm91bmQrKzsJCQotCQkJfQkJCQorCQkJaWYgKGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfRkxBVCkKKwkJCQlpZiAoIXNtc2Nfc3VwZXJpb19mbGF0KGxwY19jaGlwc19mbGF0LCBjZmdfYmFzZSwgdHlwZSkpCisJCQkJCWZvdW5kKys7CisKKwkJCWlmIChhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX1BBR0VEKQorCQkJCWlmICghc21zY19zdXBlcmlvX3BhZ2VkKGxwY19jaGlwc19wYWdlZCwgY2ZnX2Jhc2UsIHR5cGUpKQorCQkJCQlmb3VuZCsrOwogCQl9CiAJCWFkZHJlc3MrKzsKIAl9CiAJcmV0dXJuIGZvdW5kOwotfSAKK30KIAogLyoKICAqIEZ1bmN0aW9uIHNtc2Nfc3VwZXJpb19mbGF0IChjaGlwLCBiYXNlLCB0eXBlKQpAQCAtMjAzOSw3ICsyMDM4LDcgQEAKICAqICAgIFRyeSB0byBnZXQgY29uZmlndXJhdGlvbiBvZiBhIHNtYyBTdXBlcklPIGNoaXAgd2l0aCBmbGF0IHJlZ2lzdGVyIG1vZGVsCiAgKgogICovCi1zdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ2Jhc2UsIGNoYXIgKnR5cGUpCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnYmFzZSwgY2hhciAqdHlwZSkKIHsKIAl1bnNpZ25lZCBzaG9ydCBmaXJiYXNlLCBzaXJiYXNlOwogCXU4IG1vZGUsIGRtYSwgaXJxOwpAQCAtMjA0NywzOSArMjA0NiwzNyBAQAogCiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoc21zY19pcmNjX3Byb2JlKGNmZ2Jhc2UsIFNNU0NTSU9GTEFUX0RFVklDRUlEX1JFRywgY2hpcHMsIHR5cGUpPT1OVUxMKQorCWlmIChzbXNjX2lyY2NfcHJvYmUoY2ZnYmFzZSwgU01TQ1NJT0ZMQVRfREVWSUNFSURfUkVHLCBjaGlwcywgdHlwZSkgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAogCW91dGIoU01TQ1NJT0ZMQVRfVUFSVE1PREUwQ19SRUcsIGNmZ2Jhc2UpOwotCW1vZGUgPSBpbmIoY2ZnYmFzZSsxKTsKLQkKKwltb2RlID0gaW5iKGNmZ2Jhc2UgKyAxKTsKKwogCS8qcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogbW9kZTogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIG1vZGUpOyovCi0JCi0JaWYoIShtb2RlICYgU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX1ZBTF9JUkRBKSkKKworCWlmICghKG1vZGUgJiBTTVNDU0lPRkxBVF9VQVJUMk1PREVfVkFMX0lSREEpKQogCQlJUkRBX1dBUk5JTkcoIiVzKCk6IElyREEgbm90IGVuYWJsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlvdXRiKFNNU0NTSU9GTEFUX1VBUlQyQkFTRUFERFJfUkVHLCBjZmdiYXNlKTsKLQlzaXJiYXNlID0gaW5iKGNmZ2Jhc2UrMSkgPDwgMjsKKwlzaXJiYXNlID0gaW5iKGNmZ2Jhc2UgKyAxKSA8PCAyOwogCi0gICAJLyogRklSIGlvYmFzZSAqLworCS8qIEZJUiBpb2Jhc2UgKi8KIAlvdXRiKFNNU0NTSU9GTEFUX0ZJUkJBU0VBRERSX1JFRywgY2ZnYmFzZSk7Ci0JZmlyYmFzZSA9IGluYihjZmdiYXNlKzEpIDw8IDM7CisJZmlyYmFzZSA9IGluYihjZmdiYXNlICsgMSkgPDwgMzsKIAogCS8qIERNQSAqLwogCW91dGIoU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX1JFRywgY2ZnYmFzZSk7Ci0JZG1hID0gaW5iKGNmZ2Jhc2UrMSkgJiBTTVNDU0lPRkxBVF9GSVJETUFTRUxFQ1RfTUFTSzsKLQkKKwlkbWEgPSBpbmIoY2ZnYmFzZSArIDEpICYgU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX01BU0s7CisKIAkvKiBJUlEgKi8KIAlvdXRiKFNNU0NTSU9GTEFUX1VBUlRJUlFTRUxFQ1RfUkVHLCBjZmdiYXNlKTsKLQlpcnEgPSBpbmIoY2ZnYmFzZSsxKSAmIFNNU0NTSU9GTEFUX1VBUlQySVJRU0VMRUNUX01BU0s7CisJaXJxID0gaW5iKGNmZ2Jhc2UgKyAxKSAmIFNNU0NTSU9GTEFUX1VBUlQySVJRU0VMRUNUX01BU0s7CiAKIAlJUkRBX01FU1NBR0UoIiVzKCk6IGZpcjogMHglMDJ4LCBzaXI6IDB4JTAyeCwgZG1hOiAlMDJkLCBpcnE6ICVkLCBtb2RlOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgZmlyYmFzZSwgc2lyYmFzZSwgZG1hLCBpcnEsIG1vZGUpOwogCi0JaWYgKGZpcmJhc2UpIHsKLQkJaWYgKHNtc2NfaXJjY19vcGVuKGZpcmJhc2UsIHNpcmJhc2UsIGRtYSwgaXJxKSA9PSAwKQotCQkJcmV0PTA7IAotCX0KLQkKKwlpZiAoZmlyYmFzZSAmJiBzbXNjX2lyY2Nfb3BlbihmaXJiYXNlLCBzaXJiYXNlLCBkbWEsIGlycSkgPT0gMCkKKwkJcmV0ID0gMDsKKwogCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLwogCW91dGIoU01TQ1NJT19DRkdFWElUS0VZLCBjZmdiYXNlKTsKIApAQCAtMjA5MiwyNiArMjA4OSwyNiBAQAogICogICAgVHJ5ICB0byBnZXQgY29uZmlndXJhdGlvbiBvZiBhIHNtYyBTdXBlcklPIGNoaXAgd2l0aCBwYWdlZCByZWdpc3RlciBtb2RlbAogICoKICAqLwotc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fcGFnZWQoY29uc3Qgc3RydWN0IHNtc2NfY2hpcCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKQogewogCXVuc2lnbmVkIHNob3J0IGZpcl9pbywgc2lyX2lvOwogCWludCByZXQgPSAtRU5PREVWOwotCQorCiAJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoc21zY19pcmNjX3Byb2JlKGNmZ19iYXNlLDB4MjAsY2hpcHMsdHlwZSk9PU5VTEwpCisJaWYgKHNtc2NfaXJjY19wcm9iZShjZmdfYmFzZSwgMHgyMCwgY2hpcHMsIHR5cGUpID09IE5VTEwpCiAJCXJldHVybiByZXQ7Ci0JCisKIAkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgKFVBUlQyKSAqLwogCW91dGIoMHgwNywgY2ZnX2Jhc2UpOwogCW91dGIoMHgwNSwgY2ZnX2Jhc2UgKyAxKTsKLQkJCisKIAkvKiBTSVIgaW9iYXNlICovCiAJb3V0YigweDYwLCBjZmdfYmFzZSk7Ci0Jc2lyX2lvICA9IGluYihjZmdfYmFzZSArIDEpIDw8IDg7CisJc2lyX2lvID0gaW5iKGNmZ19iYXNlICsgMSkgPDwgODsKIAlvdXRiKDB4NjEsIGNmZ19iYXNlKTsKIAlzaXJfaW8gfD0gaW5iKGNmZ19iYXNlICsgMSk7Ci0JCQorCiAJLyogUmVhZCBGSVIgYmFzZSAqLwogCW91dGIoMHg2MiwgY2ZnX2Jhc2UpOwogCWZpcl9pbyA9IGluYihjZmdfYmFzZSArIDEpIDw8IDg7CkBAIC0yMTE5LDExICsyMTE2LDkgQEAKIAlmaXJfaW8gfD0gaW5iKGNmZ19iYXNlICsgMSk7CiAJb3V0YigweDJiLCBjZmdfYmFzZSk7IC8qID8/PyAqLwogCi0JaWYgKGZpcl9pbykgewotCQlpZiAoc21zY19pcmNjX29wZW4oZmlyX2lvLCBzaXJfaW8sIGlyY2NfZG1hLCBpcmNjX2lycSkgPT0gMCkKLQkJCXJldD0wOyAKLQl9Ci0JCisJaWYgKGZpcl9pbyAmJiBzbXNjX2lyY2Nfb3BlbihmaXJfaW8sIHNpcl9pbywgaXJjY19kbWEsIGlyY2NfaXJxKSA9PSAwKQorCQlyZXQgPSAwOworCiAJLyogRXhpdCBjb25maWd1cmF0aW9uICovCiAJb3V0YihTTVNDU0lPX0NGR0VYSVRLRVksIGNmZ19iYXNlKTsKIApAQCAtMjEzMSwyMSArMjEyNiwxNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19pbml0IHNtc2NfYWNjZXNzKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLHVuc2lnbmVkIGNoYXIgcmVnKQorc3RhdGljIGludCBfX2luaXQgc21zY19hY2Nlc3ModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIHVuc2lnbmVkIGNoYXIgcmVnKQogewogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJb3V0YihyZWcsIGNmZ19iYXNlKTsKLQotCWlmIChpbmIoY2ZnX2Jhc2UpIT1yZWcpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOworCXJldHVybiBpbmIoY2ZnX2Jhc2UpICE9IHJlZyA/IC0xIDogMDsKIH0KIAotc3RhdGljIGNvbnN0IHNtc2NfY2hpcF90ICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSx1OCByZWcsY29uc3Qgc21zY19jaGlwX3QgKmNoaXAsY2hhciAqdHlwZSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgdTggcmVnLCBjb25zdCBzdHJ1Y3Qgc21zY19jaGlwICpjaGlwLCBjaGFyICp0eXBlKQogewotCXU4IGRldmlkLHhkZXZpZCxyZXY7IAorCXU4IGRldmlkLCB4ZGV2aWQsIHJldjsKIAogCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0yMTU4LDcgKzIxNDksNyBAQAogCiAJb3V0YihyZWcsIGNmZ19iYXNlKTsKIAotCXhkZXZpZD1pbmIoY2ZnX2Jhc2UrMSk7CisJeGRldmlkID0gaW5iKGNmZ19iYXNlICsgMSk7CiAKIAkvKiBFbnRlciBjb25maWd1cmF0aW9uICovCiAKQEAgLTIxNjgsNTEgKzIxNTksNDkgQEAKIAlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UsMHg1NSkpCS8qIHNlbmQgc2Vjb25kIGtleSBhbmQgY2hlY2sgKi8KIAkJcmV0dXJuIE5VTEw7CiAJI2VuZGlmCi0JCisKIAkvKiBwcm9iZSBkZXZpY2UgSUQgKi8KIAotCWlmIChzbXNjX2FjY2VzcyhjZmdfYmFzZSxyZWcpKQorCWlmIChzbXNjX2FjY2VzcyhjZmdfYmFzZSwgcmVnKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkZXZpZD1pbmIoY2ZnX2Jhc2UrMSk7Ci0JCi0JaWYgKGRldmlkPT0wKQkJCS8qIHR5cGljYWwgdmFsdWUgZm9yIHVudXNlZCBwb3J0ICovCi0JCXJldHVybiBOVUxMOworCWRldmlkID0gaW5iKGNmZ19iYXNlICsgMSk7CiAKLQlpZiAoZGV2aWQ9PTB4ZmYpCQkvKiB0eXBpY2FsIHZhbHVlIGZvciB1bnVzZWQgcG9ydCAqLworCWlmIChkZXZpZCA9PSAwIHx8IGRldmlkID09IDB4ZmYpCS8qIHR5cGljYWwgdmFsdWVzIGZvciB1bnVzZWQgcG9ydCAqLwogCQlyZXR1cm4gTlVMTDsKIAogCS8qIHByb2JlIHJldmlzaW9uIElEICovCiAKLQlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UscmVnKzEpKQorCWlmIChzbXNjX2FjY2VzcyhjZmdfYmFzZSwgcmVnICsgMSkpCiAJCXJldHVybiBOVUxMOwogCi0JcmV2PWluYihjZmdfYmFzZSsxKTsKKwlyZXYgPSBpbmIoY2ZnX2Jhc2UgKyAxKTsKIAotCWlmIChyZXY+PTEyOCkJCQkvKiBpIHRoaW5rIHRoaXMgd2lsbCBtYWtlIG5vIHNlbnNlICovCisJaWYgKHJldiA+PSAxMjgpCQkJLyogaSB0aGluayB0aGlzIHdpbGwgbWFrZSBubyBzZW5zZSAqLwogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChkZXZpZD09eGRldmlkKQkJLyogcHJvdGVjdGlvbiBhZ2FpbnN0IGZhbHNlIHBvc2l0aXZlcyAqLyAgICAgICAgCisJaWYgKGRldmlkID09IHhkZXZpZCkJCS8qIHByb3RlY3Rpb24gYWdhaW5zdCBmYWxzZSBwb3NpdGl2ZXMgKi8KIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBDaGVjayBmb3IgZXhwZWN0ZWQgZGV2aWNlIElEOyBhcmUgdGhlcmUgb3RoZXJzPyAqLwogCi0Jd2hpbGUoY2hpcC0+ZGV2aWQhPWRldmlkKSB7CisJd2hpbGUgKGNoaXAtPmRldmlkICE9IGRldmlkKSB7CiAKIAkJY2hpcCsrOwogCi0JCWlmIChjaGlwLT5uYW1lPT1OVUxMKQorCQlpZiAoY2hpcC0+bmFtZSA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7CiAJfQogCi0JSVJEQV9NRVNTQUdFKCJmb3VuZCBTTUMgU3VwZXJJTyBDaGlwIChkZXZpZD0weCUwMnggcmV2PSUwMlggYmFzZT0weCUwNHgpOiAlcyVzXG4iLGRldmlkLHJldixjZmdfYmFzZSx0eXBlLGNoaXAtPm5hbWUpOworCUlSREFfTUVTU0FHRSgiZm91bmQgU01DIFN1cGVySU8gQ2hpcCAoZGV2aWQ9MHglMDJ4IHJldj0lMDJYIGJhc2U9MHglMDR4KTogJXMlc1xuIiwKKwkJICAgICBkZXZpZCwgcmV2LCBjZmdfYmFzZSwgdHlwZSwgY2hpcC0+bmFtZSk7CiAKLQlpZiAoY2hpcC0+cmV2PnJldil7Ci0JCUlSREFfTUVTU0FHRSgiUmV2aXNpb24gaGlnaGVyIHRoYW4gZXhwZWN0ZWRcbiIpOwkKKwlpZiAoY2hpcC0+cmV2ID4gcmV2KSB7CisJCUlSREFfTUVTU0FHRSgiUmV2aXNpb24gaGlnaGVyIHRoYW4gZXhwZWN0ZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JCi0JaWYgKGNoaXAtPmZsYWdzJk5vSVJEQSkKKworCWlmIChjaGlwLT5mbGFncyAmIE5vSVJEQSkKIAkJSVJEQV9NRVNTQUdFKCJjaGlwc2V0IGRvZXMgbm90IHN1cHBvcnQgSVJEQVxuIik7CiAKIAlyZXR1cm4gY2hpcDsKQEAgLTIyMjYsOCArMjIxNSw4IEBACiAJCUlSREFfV0FSTklORygiJXM6IGNhbid0IGdldCBjZmdfYmFzZSBvZiAweCUwM3hcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOwogCX0gZWxzZSB7Ci0JCWlmICghc21zY19zdXBlcmlvX2ZsYXQoZmRjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsIkZEQyIpCi0JCSAgICB8fCFzbXNjX3N1cGVyaW9fcGFnZWQoZmRjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCJGREMiKSkKKwkJaWYgKCFzbXNjX3N1cGVyaW9fZmxhdChmZGNfY2hpcHNfZmxhdCwgY2ZnX2Jhc2UsICJGREMiKSB8fAorCQkgICAgIXNtc2Nfc3VwZXJpb19wYWdlZChmZGNfY2hpcHNfcGFnZWQsIGNmZ19iYXNlLCAiRkRDIikpCiAJCQlyZXQgPSAgMDsKIAogCQlyZWxlYXNlX3JlZ2lvbihjZmdfYmFzZSwgMik7CkBAIC0yMjQ0LDkgKzIyMzMsMTAgQEAKIAkJSVJEQV9XQVJOSU5HKCIlczogY2FuJ3QgZ2V0IGNmZ19iYXNlIG9mIDB4JTAzeFxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fLCBjZmdfYmFzZSk7CiAJfSBlbHNlIHsKLQkJaWYgKCFzbXNjX3N1cGVyaW9fZmxhdChscGNfY2hpcHNfZmxhdCxjZmdfYmFzZSwiTFBDIikKLQkJICAgIHx8IXNtc2Nfc3VwZXJpb19wYWdlZChscGNfY2hpcHNfcGFnZWQsY2ZnX2Jhc2UsIkxQQyIpKQorCQlpZiAoIXNtc2Nfc3VwZXJpb19mbGF0KGxwY19jaGlwc19mbGF0LCBjZmdfYmFzZSwgIkxQQyIpIHx8CisJCSAgICAhc21zY19zdXBlcmlvX3BhZ2VkKGxwY19jaGlwc19wYWdlZCwgY2ZnX2Jhc2UsICJMUEMiKSkKIAkJCXJldCA9IDA7CisKIAkJcmVsZWFzZV9yZWdpb24oY2ZnX2Jhc2UsIDIpOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMjI2OSwxOCArMjI1OSwyMyBAQAogc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKQogewogCXVuc2lnbmVkIGxvbmcgamlmZmllc19ub3csIGppZmZpZXNfdGltZW91dDsKLQl1OAl2YWw7Ci0JCi0JamlmZmllc19ub3c9IGppZmZpZXM7Ci0JamlmZmllc190aW1lb3V0PSBqaWZmaWVzK1NNU0NfSVJDQzJfQVRDX1BST0dSQU1NSU5HX1RJTUVPVVRfSklGRklFUzsKLQkKKwl1OCB2YWw7CisKKwlqaWZmaWVzX25vdyA9IGppZmZpZXM7CisJamlmZmllc190aW1lb3V0ID0gamlmZmllcyArIFNNU0NfSVJDQzJfQVRDX1BST0dSQU1NSU5HX1RJTUVPVVRfSklGRklFUzsKKwogCS8qIEFUQyAqLwogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDQpOwotCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0FUQykgJiBJUkNDX0FUQ19NQVNLKSB8SVJDQ19BVENfblBST0dSRUFEWXxJUkNDX0FUQ19FTkFCTEUsIGZpcl9iYXNlK0lSQ0NfQVRDKTsKLQl3aGlsZSgodmFsPShpbmIoZmlyX2Jhc2UrSVJDQ19BVEMpICYgSVJDQ19BVENfblBST0dSRUFEWSkpICYmICF0aW1lX2FmdGVyKGppZmZpZXMsIGppZmZpZXNfdGltZW91dCkpOwotCWlmKHZhbCkKKwlvdXRiKChpbmIoZmlyX2Jhc2UgKyBJUkNDX0FUQykgJiBJUkNDX0FUQ19NQVNLKSB8IElSQ0NfQVRDX25QUk9HUkVBRFl8SVJDQ19BVENfRU5BQkxFLAorCSAgICAgZmlyX2Jhc2UgKyBJUkNDX0FUQyk7CisKKwl3aGlsZSAoKHZhbCA9IChpbmIoZmlyX2Jhc2UgKyBJUkNDX0FUQykgJiBJUkNDX0FUQ19uUFJPR1JFQURZKSkgJiYKKwkJIXRpbWVfYWZ0ZXIoamlmZmllcywgamlmZmllc190aW1lb3V0KSkKKwkJLyogZW1wdHkgKi87CisKKwlpZiAodmFsKQogCQlJUkRBX1dBUk5JTkcoIiVzKCk6IEFUQzogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgIGluYihmaXJfYmFzZStJUkNDX0FUQykpOworCQkJICAgICBpbmIoZmlyX2Jhc2UgKyBJUkNDX0FUQykpOwogfQogCiAvKgpAQCAtMjI5OCwzNCArMjI5MywzMiBAQAogLyoKICAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChzZWxmLCBzcGVlZCkKICAqCi0gKiAgICBTZXQgdHJhbnNjZWl2ZXIgCisgKiAgICBTZXQgdHJhbnNjZWl2ZXIKICAqCiAgKi8KIAogc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKQogewotCXU4CWZhc3RfbW9kZTsKLQkKLQlzd2l0Y2goc3BlZWQpCi0JewotCQlkZWZhdWx0OgotCQljYXNlIDU3NjAwMCA6Ci0JCWZhc3RfbW9kZSA9IDA7IAorCXU4IGZhc3RfbW9kZTsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgNTc2MDAwIDoKKwkJZmFzdF9tb2RlID0gMDsKIAkJYnJlYWs7Ci0JCWNhc2UgMTE1MjAwMCA6Ci0JCWNhc2UgNDAwMDAwMCA6CisJY2FzZSAxMTUyMDAwIDoKKwljYXNlIDQwMDAwMDAgOgogCQlmYXN0X21vZGUgPSBJUkNDX0xDUl9BX0ZBU1Q7CiAJCWJyZWFrOwotCQkKIAl9CiAJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7Ci0Jb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdF9tb2RlLCBmaXJfYmFzZStJUkNDX0xDUl9BKTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UgKyBJUkNDX0xDUl9BKSAmIDB4YmYpIHwgZmFzdF9tb2RlLCBmaXJfYmFzZSArIElSQ0NfTENSX0EpOwogfQogCiAvKgogICogRnVuY3Rpb24gc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QoZmlyX2Jhc2UpCiAgKgotICogICAgUHJvYmUgdHJhbnNjZWl2ZXIgCisgKiAgICBQcm9iZSB0cmFuc2NlaXZlcgogICoKICAqLwogCkBAIC0yMzM3LDM1ICsyMzMwLDM0IEBACiAvKgogICogRnVuY3Rpb24gc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoZmlyX2Jhc2UsIHNwZWVkKQogICoKLSAqICAgIFNldCB0cmFuc2NlaXZlciAKKyAqICAgIFNldCB0cmFuc2NlaXZlcgogICoKICAqLwogCiBzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCkKIHsKLQl1OAlmYXN0X21vZGU7Ci0JCi0Jc3dpdGNoKHNwZWVkKQotCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSA1NzYwMDAgOgotCQlmYXN0X21vZGUgPSAwOyAKKwl1OCBmYXN0X21vZGU7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDU3NjAwMCA6CisJCWZhc3RfbW9kZSA9IDA7CiAJCWJyZWFrOwotCQljYXNlIDExNTIwMDAgOgotCQljYXNlIDQwMDAwMDAgOgorCWNhc2UgMTE1MjAwMCA6CisJY2FzZSA0MDAwMDAwIDoKIAkJZmFzdF9tb2RlID0gLypJUkNDX0xDUl9BX0ZBU1QgfCovIElSQ0NfTENSX0FfR1BfREFUQTsKIAkJYnJlYWs7Ci0JCQorCiAJfQogCS8qIFRoaXMgY2F1c2VzIGFuIGludGVycnVwdCAqLwogCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOwotCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKSAmICAweGJmKSB8IGZhc3RfbW9kZSwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7CisJb3V0YigoaW5iKGZpcl9iYXNlICsgSVJDQ19MQ1JfQSkgJiAgMHhiZikgfCBmYXN0X21vZGUsIGZpcl9iYXNlICsgSVJDQ19MQ1JfQSk7CiB9CiAKIC8qCiAgKiBGdW5jdGlvbiBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGZpcl9iYXNlKQogICoKLSAqICAgIFByb2JlIHRyYW5zY2VpdmVyIAorICogICAgUHJvYmUgdHJhbnNjZWl2ZXIKICAqCiAgKi8KIApAQCAtMjM3NywyMCArMjM2OSwzIEBACiAKIG1vZHVsZV9pbml0KHNtc2NfaXJjY19pbml0KTsKIG1vZHVsZV9leGl0KHNtc2NfaXJjY19jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiRGFuaWVsZSBQZXJpIDxwZXJpQGNzYWkudW5pcGEuaXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNNQyBJckNDIFNJUi9GSVIgY29udHJvbGxlciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotbW9kdWxlX3BhcmFtKGlyY2NfZG1hLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpcmNjX2RtYSwgIkRNQSBjaGFubmVsIik7Ci1tb2R1bGVfcGFyYW0oaXJjY19pcnEsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlyY2NfaXJxLCAiSVJRIGxpbmUiKTsKLW1vZHVsZV9wYXJhbShpcmNjX2ZpciwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJjY19maXIsICJGSVIgQmFzZSBBZGRyZXNzIik7Ci1tb2R1bGVfcGFyYW0oaXJjY19zaXIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlyY2Nfc2lyLCAiU0lSIEJhc2UgQWRkcmVzcyIpOwotbW9kdWxlX3BhcmFtKGlyY2NfY2ZnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpcmNjX2NmZywgIkNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIik7Ci1tb2R1bGVfcGFyYW0oaXJjY190cmFuc2NlaXZlciwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJjY190cmFuc2NlaXZlciwgIlRyYW5zY2VpdmVyIHR5cGUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmgKaW5kZXggNDU4NjExYy4uMGMzNjI4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmgKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAkSWQ6IHNtc2MtaXJjYzIuaCx2IDEuMTIuMi4xIDIwMDIvMTAvMjcgMTA6NTI6MzcgZGlwIEV4cCAkICAgICAgICAgICAgICAgCisgKiAkSWQ6IHNtc2MtaXJjYzIuaCx2IDEuMTIuMi4xIDIwMDIvMTAvMjcgMTA6NTI6MzcgZGlwIEV4cCAkCiAgKgogICogRGVzY3JpcHRpb246ICAgRGVmaW5pdGlvbnMgZm9yIHRoZSBTTUMgSXJDQyBjaGlwc2V0CiAgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCkBAIC05LDI1ICs5LDI1IEBACiAgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBCYXNlZCBvbiBzbWMtaXJjYy5oOgotICogCisgKgogICogICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwLCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTksIFRob21hcyBEYXZpcyAodGFkYXZpc0BqcHMubmV0PgogICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAqCi0gKiAgICAgIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKKyAqCiAgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCi0gKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCi0gKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogICogICAgIE1BIDAyMTExLTEzMDcgVVNBCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTEyLDEwICsxMTIsMTAgQEAKIAogI2RlZmluZSAgIElSQ0NfQ0ZHQV9DT00JCQkJMHgwMAogI2RlZmluZQkJSVJDQ19TQ0VfQ0ZHQV9CTE9DS19DVFJMX0JJVFNfTUFTSwkweDg3Ci0jZGVmaW5lICAgCUlSQ0NfQ0ZHQV9JUkRBX1NJUl9BCTB4MDgKLSNkZWZpbmUgICAJSVJDQ19DRkdBX0FTS19TSVIJCTB4MTAKLSNkZWZpbmUgICAJSVJDQ19DRkdBX0lSREFfU0lSX0IJMHgxOAotI2RlZmluZSAgIAlJUkNDX0NGR0FfSVJEQV9IRExDCQkweDIwCisjZGVmaW5lCQlJUkNDX0NGR0FfSVJEQV9TSVJfQQkweDA4CisjZGVmaW5lCQlJUkNDX0NGR0FfQVNLX1NJUgkJMHgxMAorI2RlZmluZQkJSVJDQ19DRkdBX0lSREFfU0lSX0IJMHgxOAorI2RlZmluZQkJSVJDQ19DRkdBX0lSREFfSERMQwkJMHgyMAogI2RlZmluZQkJSVJDQ19DRkdBX0lSREFfNFBQTQkJMHgyOAogI2RlZmluZQkJSVJDQ19DRkdBX0NPTlNVTUVSCQkweDMwCiAjZGVmaW5lCQlJUkNDX0NGR0FfUkFXX0lSCQkweDM4CkBAIC0xMzAsNyArMTMwLDcgQEAKICNkZWZpbmUgSVJDQ19DRkdCX0xQQkNLX1RYX0NSQwkgICAweDEwCiAjZGVmaW5lIElSQ0NfQ0ZHQl9OT1dBSVQJICAgMHgwOAogI2RlZmluZSBJUkNDX0NGR0JfU1RSSU5HX01PVkUJICAgMHgwNAotI2RlZmluZSBJUkNDX0NGR0JfRE1BX0JVUlNUIAkgICAweDAyCisjZGVmaW5lIElSQ0NfQ0ZHQl9ETUFfQlVSU1QJICAgMHgwMgogI2RlZmluZSBJUkNDX0NGR0JfRE1BX0VOQUJMRQkgICAweDAxCiAKICNkZWZpbmUgSVJDQ19DRkdCX01VWF9DT00gICAgICAgICAgMHgwMApAQCAtMTQxLDExICsxNDEsMTEgQEAKIC8qIFJlZ2lzdGVyIGJsb2NrIDMgLSBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcnMhICovCiAjZGVmaW5lIElSQ0NfSURfSElHSAkgICAgICAgICAgIDB4MDAgICAvKiAweDEwICovCiAjZGVmaW5lIElSQ0NfSURfTE9XCSAgICAgICAgICAgMHgwMSAgIC8qIDB4QjggKi8KLSNkZWZpbmUgSVJDQ19DSElQX0lEIAkgICAgICAgICAgIDB4MDIgICAvKiAweEYxICovCisjZGVmaW5lIElSQ0NfQ0hJUF9JRAkgICAgICAgICAgIDB4MDIgICAvKiAweEYxICovCiAjZGVmaW5lIElSQ0NfVkVSU0lPTgkgICAgICAgICAgIDB4MDMgICAvKiAweDAxICovCiAjZGVmaW5lIElSQ0NfSU5URVJGQUNFCSAgICAgICAgICAgMHgwNCAgIC8qIGxvdyA0ID0gRE1BLCBoaWdoIDQgPSBJUlEgKi8KLSNkZWZpbmUgCUlSQ0NfSU5URVJGQUNFX0RNQV9NQVNLCTB4MEYgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCi0jZGVmaW5lIAlJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSwkweEYwICAgLyogbG93IDQgPSBETUEsIGhpZ2ggNCA9IElSUSAqLworI2RlZmluZQkJSVJDQ19JTlRFUkZBQ0VfRE1BX01BU0sJMHgwRiAgIC8qIGxvdyA0ID0gRE1BLCBoaWdoIDQgPSBJUlEgKi8KKyNkZWZpbmUJCUlSQ0NfSU5URVJGQUNFX0lSUV9NQVNLCTB4RjAgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCiAKIC8qIFJlZ2lzdGVyIGJsb2NrIDQgLSBJckRBICovCiAjZGVmaW5lIElSQ0NfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDAKQEAgLTE2MywxMCArMTYzLDEwIEBACiAKIC8qIFJlZ2lzdGVyIGJsb2NrIDUgLSBJckRBICovCiAjZGVmaW5lIElSQ0NfQVRDCQkJCQkweDAwCi0jZGVmaW5lIAlJUkNDX0FUQ19uUFJPR1JFQURZCQkweDgwCi0jZGVmaW5lIAlJUkNDX0FUQ19TUEVFRAkJCTB4NDAKLSNkZWZpbmUgCUlSQ0NfQVRDX0VOQUJMRQkJCTB4MjAKLSNkZWZpbmUgCUlSQ0NfQVRDX01BU0sJCQkweEUwCisjZGVmaW5lCQlJUkNDX0FUQ19uUFJPR1JFQURZCQkweDgwCisjZGVmaW5lCQlJUkNDX0FUQ19TUEVFRAkJCTB4NDAKKyNkZWZpbmUJCUlSQ0NfQVRDX0VOQUJMRQkJCTB4MjAKKyNkZWZpbmUJCUlSQ0NfQVRDX01BU0sJCQkweEUwCiAKIAogI2RlZmluZSBJUkNDX0lSSEFMRkRVUExFWF9USU1FT1VUCTB4MDEKQEAgLTE3OCw4ICsxNzgsOCBAQAogICovCiAKICNkZWZpbmUgU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVECQkxMTUyMDAKLSNkZWZpbmUgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQgCTgKLSNkZWZpbmUgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQgCTgKKyNkZWZpbmUgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQJOAorI2RlZmluZSBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVAk4CiAjZGVmaW5lIFNNU0NfSVJDQzJfRklGT19TSVpFCQkJMTYKICNkZWZpbmUgU01TQ19JUkNDMl9GSUZPX1RIUkVTSE9MRAkJNjQKIC8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCmluZGV4IDQxNDY5NGEuLjc0MWFlY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCkBAIC02OSwxNCArNjksOCBAQAogCiAjZWxzZSAvKiAyLjUgb3IgbGF0ZXIgKi8KIAotLyogcmVjZW50IDIuNS8yLjYgc3RvcmVzIHBjaSBkZXZpY2UgbmFtZXMgYXQgdmFyeWluZyBwbGFjZXMgOy0pICovCi0jaWZkZWYgQ09ORklHX1BDSV9OQU1FUwotLyogaHVtYW4gcmVhZGFibGUgbmFtZSAqLwotI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkoKHBkZXYpLT5wcmV0dHlfbmFtZSkKLSNlbHNlCiAvKiB3aGF0ZXZlciB3ZSBnZXQgZnJvbSB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgZGV2aWNlIC0gYnVzOnNsb3Q6ZGV2LmZuIGlkICovCiAjZGVmaW5lIFBDSURFVl9OQU1FKHBkZXYpCShwY2lfbmFtZShwZGV2KSkKLSNlbmRpZgogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwppbmRleCBkYzVkMDg5Li4zZDU2Y2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYworKysgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwpAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMSBLeWxlIEEuIEx1Y2tlIChrbHVja2VAdXMuaWJtLmNvbSksIElCTSBDb3JwLgogICogU3Vic3RhbnRpYWxseSBjbGVhbmVkIHVwIGJ5OgogICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdpYnNvbiA8ZHdnQGF1MS5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCA3YzlkYmM4Li4yNWM5YTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTk0LDcgKzk0LDcgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKm12NjQzeHhfZXRoX3NoYXJlZF9iYXNlOwogCiAvKiB1c2VkIHRvIHByb3RlY3QgTVY2NDNYWF9FVEhfU01JX1JFRywgd2hpY2ggaXMgc2hhcmVkIGFjcm9zcyBwb3J0cyAqLwotc3RhdGljIHNwaW5sb2NrX3QgbXY2NDN4eF9ldGhfcGh5X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG12NjQzeHhfZXRoX3BoeV9sb2NrKTsKIAogc3RhdGljIGlubGluZSB1MzIgbXZfcmVhZChpbnQgb2Zmc2V0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKaW5kZXggYmI3MTYzOC4uMGRmN2U5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCkBAIC0xMjMyLDkgKzEyMzIsNyBAQAogCW5hdmFpbCA9IDA7CS8qIHRvdGFsICMgb2YgdXNhYmxlIGNoYW5uZWxzIChub3QgZGVyZWdpc3RlcmVkKSAqLwogCWhkcmxlbiA9IChwcHAtPmZsYWdzICYgU0NfTVBfWFNIT1JUU0VRKT8gTVBIRFJMRU5fU1NOOiBNUEhEUkxFTjsKIAlpID0gMDsKLQlsaXN0ID0gJnBwcC0+Y2hhbm5lbHM7Ci0Jd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gJnBwcC0+Y2hhbm5lbHMpIHsKLQkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgY2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNoLCAmcHBwLT5jaGFubmVscywgY2xpc3QpIHsKIAkJbmF2YWlsICs9IHBjaC0+YXZhaWwgPSAocGNoLT5jaGFuICE9IE5VTEwpOwogCQlpZiAocGNoLT5hdmFpbCkgewogCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcGNoLT5maWxlLnhxKSB8fApAQCAtMTI4MCw2ICsxMjc4LDcgQEAKIAogCS8qIHNraXAgdG8gdGhlIGNoYW5uZWwgYWZ0ZXIgdGhlIG9uZSB3ZSBsYXN0IHVzZWQKIAkgICBhbmQgc3RhcnQgYXQgdGhhdCBvbmUgKi8KKwlsaXN0ID0gJnBwcC0+Y2hhbm5lbHM7CiAJZm9yIChpID0gMDsgaSA8IHBwcC0+bnhjaGFuOyArK2kpIHsKIAkJbGlzdCA9IGxpc3QtPm5leHQ7CiAJCWlmIChsaXN0ID09ICZwcHAtPmNoYW5uZWxzKSB7CkBAIC0xNzMwLDcgKzE3MjksNyBAQAogcHBwX3JlY2VpdmVfbXBfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2hhbm5lbCAqcGNoKQogewogCXUzMiBtYXNrLCBzZXE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgY2hhbm5lbCAqY2g7CiAJaW50IG1waGRybGVuID0gKHBwcC0+ZmxhZ3MgJiBTQ19NUF9TSE9SVFNFUSk/IE1QSERSTEVOX1NTTjogTVBIRFJMRU47CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBtcGhkcmxlbikgfHwgcHBwLT5tcnJ1ID09IDApCkBAIC0xNzg0LDggKzE3ODMsNyBAQAogCSAqIFRoZSBsaXN0IG9mIGNoYW5uZWxzIGNhbid0IGNoYW5nZSBiZWNhdXNlIHdlIGhhdmUgdGhlIHJlY2VpdmUKIAkgKiBzaWRlIG9mIHRoZSBwcHAgdW5pdCBsb2NrZWQuCiAJICovCi0JZm9yIChsID0gcHBwLT5jaGFubmVscy5uZXh0OyBsICE9ICZwcHAtPmNoYW5uZWxzOyBsID0gbC0+bmV4dCkgewotCQlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnBwcC0+Y2hhbm5lbHMsIGNsaXN0KSB7CiAJCWlmIChzZXFfYmVmb3JlKGNoLT5sYXN0c2VxLCBzZXEpKQogCQkJc2VxID0gY2gtPmxhc3RzZXE7CiAJfQpAQCAtMjI3MSwxMCArMjI2OSw4IEBACiBmaW5kX2NvbXBfZW50cnkoaW50IHByb3RvKQogewogCXN0cnVjdCBjb21wcmVzc29yX2VudHJ5ICpjZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJmNvbXByZXNzb3JfbGlzdDsKIAotCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZjb21wcmVzc29yX2xpc3QpIHsKLQkJY2UgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjb21wcmVzc29yX2VudHJ5LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNlLCAmY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CiAJCWlmIChjZS0+Y29tcC0+Y29tcHJlc3NfcHJvdG8gPT0gcHJvdG8pCiAJCQlyZXR1cm4gY2U7CiAJfQpAQCAtMjU0MCwyMCArMjUzNiwxNSBAQAogcHBwX2ZpbmRfY2hhbm5lbChpbnQgdW5pdCkKIHsKIAlzdHJ1Y3QgY2hhbm5lbCAqcGNoOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAKLQlsaXN0ID0gJm5ld19jaGFubmVsczsKLQl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmbmV3X2NoYW5uZWxzKSB7Ci0JCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNoLCAmbmV3X2NoYW5uZWxzLCBsaXN0KSB7CiAJCWlmIChwY2gtPmZpbGUuaW5kZXggPT0gdW5pdCkgewogCQkJbGlzdF9kZWwoJnBjaC0+bGlzdCk7CiAJCQlsaXN0X2FkZCgmcGNoLT5saXN0LCAmYWxsX2NoYW5uZWxzKTsKIAkJCXJldHVybiBwY2g7CiAJCX0KIAl9Ci0JbGlzdCA9ICZhbGxfY2hhbm5lbHM7Ci0Jd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gJmFsbF9jaGFubmVscykgewotCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaCwgJmFsbF9jaGFubmVscywgbGlzdCkgewogCQlpZiAocGNoLT5maWxlLmluZGV4ID09IHVuaXQpCiAJCQlyZXR1cm4gcGNoOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8tcmVncy5oIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKaW5kZXggMjIzNGE4Zi4uN2NlZmU1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiByZWdzLmg6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBTMklPIDEwR2JFIFNlcnZlciBOSUMKKyAqIHJlZ3MuaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIE5ldGVyaW9uIDEwR2JFIFNlcnZlciBOSUMKICAqIENvcHlyaWdodChjKSAyMDAyLTIwMDUgTmV0ZXJpb24gSW5jLgogCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCkBAIC03MTMsMTMgKzcxMywxNiBAQAogCXU2NCBtY19lcnJfcmVnOwogI2RlZmluZSBNQ19FUlJfUkVHX0VDQ19EQl9FUlJfTCAgICAgICAgICAgIEJJVCgxNCkKICNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfREJfRVJSX1UgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIE1DX0VSUl9SRUdfTUlSSV9FQ0NfREJfRVJSXzAgICAgICAgQklUKDE4KQorI2RlZmluZSBNQ19FUlJfUkVHX01JUklfRUNDX0RCX0VSUl8xICAgICAgIEJJVCgyMCkKICNkZWZpbmUgTUNfRVJSX1JFR19NSVJJX0NSSV9FUlJfMCAgICAgICAgICBCSVQoMjIpCiAjZGVmaW5lIE1DX0VSUl9SRUdfTUlSSV9DUklfRVJSXzEgICAgICAgICAgQklUKDIzKQogI2RlZmluZSBNQ19FUlJfUkVHX1NNX0VSUiAgICAgICAgICAgICAgICAgIEJJVCgzMSkKLSNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfQUxMX1NORwkJICAgKEJJVCg2KSB8IFwKLQkJCQkJQklUKDcpIHwgQklUKDE3KSB8IEJJVCgxOSkpCi0jZGVmaW5lIE1DX0VSUl9SRUdfRUNDX0FMTF9EQkwJCSAgIChCSVQoMTQpIHwgXAotCQkJCQlCSVQoMTUpIHwgQklUKDE4KSB8IEJJVCgyMCkpCisjZGVmaW5lIE1DX0VSUl9SRUdfRUNDX0FMTF9TTkcJCSAgIChCSVQoMikgfCBCSVQoMykgfCBCSVQoNCkgfCBCSVQoNSkgfFwKKwkJCQkJICAgIEJJVCg2KSB8IEJJVCg3KSB8IEJJVCgxNykgfCBCSVQoMTkpKQorI2RlZmluZSBNQ19FUlJfUkVHX0VDQ19BTExfREJMCQkgICAoQklUKDEwKSB8IEJJVCgxMSkgfCBCSVQoMTIpIHxcCisJCQkJCSAgICBCSVQoMTMpIHwgQklUKDE0KSB8IEJJVCgxNSkgfFwKKwkJCQkJICAgIEJJVCgxOCkgfCBCSVQoMjApKQogCXU2NCBtY19lcnJfbWFzazsKIAl1NjQgbWNfZXJyX2FsYXJtOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggNWRkYTA0My4uYzgyOWU2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHMyaW8uYzogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIFMySU8gMTBHYkUgU2VydmVyIE5JQworICogczJpby5jOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgTmV0ZXJpb24gMTBHYkUgU2VydmVyIE5JQwogICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCiAKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKQEAgLTI4LDcgKzI4LDcgQEAKICAqIGV4cGxhaW5hdGlvbiBvZiBhbGwgdGhlIHZhcmlhYmxlcy4KICAqIHJ4X3JpbmdfbnVtIDogVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9ncmFtIHRoZSBudW1iZXIgb2YgcmVjZWl2ZSByaW5ncyB1c2VkCiAgKiBpbiB0aGUgZHJpdmVyLgotICogcnhfcmluZ19sZW46IFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGVhY2ggcmluZyBjYW4gaGF2ZS4gVGhpcworICogcnhfcmluZ19zejogVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZWFjaCByaW5nIGNhbiBoYXZlLiBUaGlzCiAgKiBpcyBhbHNvIGFuIGFycmF5IG9mIHNpemUgOC4KICAqIHR4X2ZpZm9fbnVtOiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBUeCBGSUZPcyB0aGF0cyB1c2VkIGludCB0aGUgZHJpdmVyLgogICogdHhfZmlmb19sZW46IFRoaXMgdG9vIGlzIGFuIGFycmF5IG9mIDguIEVhY2ggZWxlbWVudCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKQEAgLTY3LDcgKzY3LDcgQEAKIAogLyogUzJpbyBEcml2ZXIgbmFtZSAmIHZlcnNpb24uICovCiBzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl9uYW1lW10gPSAiTmV0ZXJpb24iOwotc3RhdGljIGNoYXIgczJpb19kcml2ZXJfdmVyc2lvbltdID0gIlZlcnNpb24gMi4wLjMuMSI7CitzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl92ZXJzaW9uW10gPSAiVmVyc2lvbiAyLjAuOC4xIjsKIAogc3RhdGljIGlubGluZSBpbnQgUlhEX0lTX1VQMkRUKFJ4RF90ICpyeGRwKQogewpAQCAtMzU0LDcgKzM1NCw3IEBACiAJaW50IGxzdF9zaXplLCBsc3RfcGVyX3BhZ2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OwogI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCi0JdTY0IHRtcDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKIAlidWZmQWRkX3QgKmJhOwogI2VuZGlmCiAKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQkgICAgY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxOwogCQltYWNfY29udHJvbC0+Zmlmb3NbaV0uZmlmb19ubyA9IGk7CiAJCW1hY19jb250cm9sLT5maWZvc1tpXS5uaWMgPSBuaWM7Ci0JCW1hY19jb250cm9sLT5maWZvc1tpXS5tYXhfdHhkcyA9IE1BWF9TS0JfRlJBR1M7CisJCW1hY19jb250cm9sLT5maWZvc1tpXS5tYXhfdHhkcyA9IE1BWF9TS0JfRlJBR1MgKyAxOwogCiAJCWZvciAoaiA9IDA7IGogPCBwYWdlX251bTsgaisrKSB7CiAJCQlpbnQgayA9IDA7CkBAIC00MTgsNiArNDE4LDI2IEBACiAJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgZm9yIFR4RExcbiIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQorCQkJLyogSWYgd2UgZ290IGEgemVybyBETUEgYWRkcmVzcyhjYW4gaGFwcGVuIG9uCisJCQkgKiBjZXJ0YWluIHBsYXRmb3JtcyBsaWtlIFBQQyksIHJlYWxsb2NhdGUuCisJCQkgKiBTdG9yZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgcGFnZSB3ZSBkb24ndCB3YW50LAorCQkJICogdG8gYmUgZnJlZWQgbGF0ZXIuCisJCQkgKi8KKwkJCWlmICghdG1wX3ApIHsKKwkJCQltYWNfY29udHJvbC0+emVyb2RtYV92aXJ0X2FkZHIgPSB0bXBfdjsKKwkJCQlEQkdfUFJJTlQoSU5JVF9EQkcsIAorCQkJCSIlczogWmVybyBETUEgYWRkcmVzcyBmb3IgVHhETC4gIiwgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoSU5JVF9EQkcsIAorCQkJCSJWaXJ0dWFsIGFkZHJlc3MgJWxseFxuIiwgKHU2NCl0bXBfdik7CisJCQkJdG1wX3YgPSBwY2lfYWxsb2NfY29uc2lzdGVudChuaWMtPnBkZXYsCisJCQkJCQkgICAgIFBBR0VfU0laRSwgJnRtcF9wKTsKKwkJCQlpZiAoIXRtcF92KSB7CisJCQkJCURCR19QUklOVChFUlJfREJHLAorCQkJCQkgICJwY2lfYWxsb2NfY29uc2lzdGVudCAiKTsKKwkJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgZm9yIFR4RExcbiIpOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQl9CiAJCQl3aGlsZSAoayA8IGxzdF9wZXJfcGFnZSkgewogCQkJCWludCBsID0gKGogKiBsc3RfcGVyX3BhZ2UpICsgazsKIAkJCQlpZiAobCA9PSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbikKQEAgLTU0MiwxOCArNTYyLDE4IEBACiAJCQkJICAgIChCVUYwX0xFTiArIEFMSUdOX1NJWkUsIEdGUF9LRVJORUwpOwogCQkJCWlmICghYmEtPmJhXzBfb3JnKQogCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl0bXAgPSAodTY0KSBiYS0+YmFfMF9vcmc7CisJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGJhLT5iYV8wX29yZzsKIAkJCQl0bXAgKz0gQUxJR05fU0laRTsKLQkJCQl0bXAgJj0gfigodTY0KSBBTElHTl9TSVpFKTsKKwkJCQl0bXAgJj0gfigodW5zaWduZWQgbG9uZykgQUxJR05fU0laRSk7CiAJCQkJYmEtPmJhXzAgPSAodm9pZCAqKSB0bXA7CiAKIAkJCQliYS0+YmFfMV9vcmcgPSAodm9pZCAqKSBrbWFsbG9jCiAJCQkJICAgIChCVUYxX0xFTiArIEFMSUdOX1NJWkUsIEdGUF9LRVJORUwpOwogCQkJCWlmICghYmEtPmJhXzFfb3JnKQogCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl0bXAgPSAodTY0KSBiYS0+YmFfMV9vcmc7CisJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGJhLT5iYV8xX29yZzsKIAkJCQl0bXAgKz0gQUxJR05fU0laRTsKLQkJCQl0bXAgJj0gfigodTY0KSBBTElHTl9TSVpFKTsKKwkJCQl0bXAgJj0gfigodW5zaWduZWQgbG9uZykgQUxJR05fU0laRSk7CiAJCQkJYmEtPmJhXzEgPSAodm9pZCAqKSB0bXA7CiAJCQkJaysrOwogCQkJfQpAQCAtNjAwLDcgKzYyMCw3IEBACiAJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOwotCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OwogCiAJaWYgKCFuaWMpCiAJCXJldHVybjsKQEAgLTYxNiw5ICs2MzYsMTAgQEAKIAkJCQkJCWxzdF9wZXJfcGFnZSk7CiAJCWZvciAoaiA9IDA7IGogPCBwYWdlX251bTsgaisrKSB7CiAJCQlpbnQgbWVtX2Jsa3MgPSAoaiAqIGxzdF9wZXJfcGFnZSk7Ci0JCQlpZiAoKCFtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvKSB8fAotCQkJCSghbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mb1ttZW1fYmxrc10uCi0JCQkJIGxpc3RfdmlydF9hZGRyKSkKKwkJCWlmICghbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mbykKKwkJCQlyZXR1cm47CQorCQkJaWYgKCFtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvW21lbV9ibGtzXS4KKwkJCQkgbGlzdF92aXJ0X2FkZHIpCiAJCQkJYnJlYWs7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgUEFHRV9TSVpFLAogCQkJCQkgICAgbWFjX2NvbnRyb2wtPmZpZm9zW2ldLgpAQCAtNjI4LDYgKzY0OSwxOCBAQAogCQkJCQkgICAgbGlzdF9pbmZvW21lbV9ibGtzXS4KIAkJCQkJICAgIGxpc3RfcGh5X2FkZHIpOwogCQl9CisJCS8qIElmIHdlIGdvdCBhIHplcm8gRE1BIGFkZHJlc3MgZHVyaW5nIGFsbG9jYXRpb24sCisJCSAqIGZyZWUgdGhlIHBhZ2Ugbm93CisJCSAqLworCQlpZiAobWFjX2NvbnRyb2wtPnplcm9kbWFfdmlydF9hZGRyKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgbWFjX2NvbnRyb2wtPnplcm9kbWFfdmlydF9hZGRyLAorCQkJCQkgICAgKGRtYV9hZGRyX3QpMCk7CisJCQlEQkdfUFJJTlQoSU5JVF9EQkcsIAorCQkJIiVzOiBGcmVlaW5nIFR4REwgd2l0aCB6ZXJvIERNQSBhZGRyLiAiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKElOSVRfREJHLCAiVmlydHVhbCBhZGRyZXNzICVsbHhcbiIsCisJCQkodTY0KShtYWNfY29udHJvbC0+emVyb2RtYV92aXJ0X2FkZHIpKTsKKwkJfQogCQlrZnJlZShtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvKTsKIAl9CiAKQEAgLTI0NzksOSArMjUxMiwxMCBAQAogI2VuZGlmCiAJc3Bpbl9sb2NrKCZuaWMtPnJ4X2xvY2spOwogCWlmIChhdG9taWNfcmVhZCgmbmljLT5jYXJkX3N0YXRlKSA9PSBDQVJEX0RPV04pIHsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogJXMgZ29pbmcgZG93biBmb3IgcmVzZXRcbiIsCisJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiAlcyBnb2luZyBkb3duIGZvciByZXNldFxuIiwKIAkJCSAgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUpOwogCQlzcGluX3VubG9jaygmbmljLT5yeF9sb2NrKTsKKwkJcmV0dXJuOwogCX0KIAogCWdldF9pbmZvID0gcmluZ19kYXRhLT5yeF9jdXJyX2dldF9pbmZvOwpAQCAtMjU5Niw4ICsyNjMwLDE0IEBACiAJCWlmICh0eGRscC0+Q29udHJvbF8xICYgVFhEX1RfQ09ERSkgewogCQkJdW5zaWduZWQgbG9uZyBsb25nIGVycjsKIAkJCWVyciA9IHR4ZGxwLT5Db250cm9sXzEgJiBUWERfVF9DT0RFOwotCQkJREJHX1BSSU5UKEVSUl9EQkcsICIqKipUeEQgZXJyb3IgJWxseFxuIiwKLQkJCQkgIGVycik7CisJCQlpZiAoKGVyciA+PiA0OCkgPT0gMHhBKSB7CisJCQkJREJHX1BSSU5UKFRYX0RCRywgIlR4RCByZXR1cm5lZCBkdWUgXAorCQkJCQkJdG8gbG9zcyBvZiBsaW5rXG4iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiKioqVHhEIGVycm9yIFwKKwkJCQkJCSVsbHhcbiIsIGVycik7CisJCQl9CiAJCX0KIAogCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCh1bnNpZ25lZCBsb25nKQpAQCAtMjY4OSwxMiArMjcyOSwxNiBAQAogCQlpZiAodmFsNjQgJiBNQ19FUlJfUkVHX0VDQ19BTExfREJMKSB7CiAJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCiAJCQkJZG91YmxlX2VjY19lcnJzKys7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBEZXZpY2UgaW5kaWNhdGVzICIsCisJCQlEQkdfUFJJTlQoSU5JVF9EQkcsICIlczogRGV2aWNlIGluZGljYXRlcyAiLAogCQkJCSAgZGV2LT5uYW1lKTsKLQkJCURCR19QUklOVChFUlJfREJHLCAiZG91YmxlIEVDQyBlcnJvciEhXG4iKTsKKwkJCURCR19QUklOVChJTklUX0RCRywgImRvdWJsZSBFQ0MgZXJyb3IhIVxuIik7CiAJCQlpZiAobmljLT5kZXZpY2VfdHlwZSAhPSBYRlJBTUVfSUlfREVWSUNFKSB7Ci0JCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQkJCXNjaGVkdWxlX3dvcmsoJm5pYy0+cnN0X3RpbWVyX3Rhc2spOworCQkJCS8qIFJlc2V0IFhmcmFtZUkgb25seSBpZiBjcml0aWNhbCBlcnJvciAqLworCQkJCWlmICh2YWw2NCAmIChNQ19FUlJfUkVHX01JUklfRUNDX0RCX0VSUl8wIHwKKwkJCQkJICAgICBNQ19FUlJfUkVHX01JUklfRUNDX0RCX0VSUl8xKSkgeworCQkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkJCXNjaGVkdWxlX3dvcmsoJm5pYy0+cnN0X3RpbWVyX3Rhc2spOworCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKIAkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KQEAgLTI3MDYsNyArMjc1MCw4IEBACiAJdmFsNjQgPSByZWFkcSgmYmFyMC0+c2Vycl9zb3VyY2UpOwogCWlmICh2YWw2NCAmIFNFUlJfU09VUkNFX0FOWSkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBEZXZpY2UgaW5kaWNhdGVzICIsIGRldi0+bmFtZSk7Ci0JCURCR19QUklOVChFUlJfREJHLCAic2VyaW91cyBlcnJvciEhXG4iKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJzZXJpb3VzIGVycm9yICVsbHghIVxuIiwgCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsNjQpOwogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJCXNjaGVkdWxlX3dvcmsoJm5pYy0+cnN0X3RpbWVyX3Rhc2spOwogCX0KQEAgLTMxMzAsNyArMzE3NSw3IEBACiAJcXVldWVfbGVuID0gbWFjX2NvbnRyb2wtPmZpZm9zW3F1ZXVlXS50eF9jdXJyX3B1dF9pbmZvLmZpZm9fbGVuICsgMTsKIAkvKiBBdm9pZCAicHV0IiBwb2ludGVyIGdvaW5nIGJleW9uZCAiZ2V0IiBwb2ludGVyICovCiAJaWYgKHR4ZHAtPkhvc3RfQ29udHJvbCB8fCAoKChwdXRfb2ZmICsgMSkgJSBxdWV1ZV9sZW4pID09IGdldF9vZmYpKSB7Ci0JCURCR19QUklOVChFUlJfREJHLCAiRXJyb3IgaW4geG1pdCwgTm8gZnJlZSBUWERzLlxuIik7CisJCURCR19QUklOVChUWF9EQkcsICJFcnJvciBpbiB4bWl0LCBObyBmcmVlIFRYRHMuXG4iKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CkBAIC0zNTI4LDcgKzM1NzMsNyBAQAogCiAJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOwogCQlzcC0+cHJvbWlzY19mbGcgPSAxOwotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGVcbiIsCisJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGVcbiIsCiAJCQkgIGRldi0+bmFtZSk7CiAJfSBlbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKHNwLT5wcm9taXNjX2ZsZykpIHsKIAkJLyogIFJlbW92ZSB0aGUgTklDIGZyb20gcHJvbWlzY3VvdXMgbW9kZSAqLwpAQCAtMzU0Myw3ICszNTg4LDcgQEAKIAogCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfY2ZnKTsKIAkJc3AtPnByb21pc2NfZmxnID0gMDsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogbGVmdCBwcm9taXNjdW91cyBtb2RlXG4iLAorCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogbGVmdCBwcm9taXNjdW91cyBtb2RlXG4iLAogCQkJICBkZXYtPm5hbWUpOwogCX0KIApAQCAtNTMyNSw3ICs1MzcwLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCWNvbmZpZy0+bWF4X3R4ZHMgPSBNQVhfU0tCX0ZSQUdTOworCWNvbmZpZy0+bWF4X3R4ZHMgPSBNQVhfU0tCX0ZSQUdTICsgMTsKIAogCS8qIFJ4IHNpZGUgcGFyYW1ldGVycy4gKi8KIAlpZiAocnhfcmluZ19zelswXSA9PSAwKQpAQCAtNTUyNSw5ICs1NTcwLDE0IEBACiAJaWYgKHNwLT5kZXZpY2VfdHlwZSAmIFhGUkFNRV9JSV9ERVZJQ0UpIHsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTmV0ZXJpb24gWGZyYW1lIElJIDEwR2JFIGFkYXB0ZXIgIiwKIAkJCSAgZGV2LT5uYW1lKTsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICIocmV2ICVkKSwgRHJpdmVyICVzXG4iLAorCQlEQkdfUFJJTlQoRVJSX0RCRywgIihyZXYgJWQpLCAlcyIsCiAJCQkJZ2V0X3hlbmFfcmV2X2lkKHNwLT5wZGV2KSwKIAkJCQlzMmlvX2RyaXZlcl92ZXJzaW9uKTsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQlEQkdfUFJJTlQoRVJSX0RCRywgIiwgQnVmZmVyIG1vZGUgJWQiLDIpOworI2VuZGlmCisKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJcbkNvcHlyaWdodChjKSAyMDAyLTIwMDUgTmV0ZXJpb24gSW5jLlxuIik7CiAJCURCR19QUklOVChFUlJfREJHLCAiTUFDIEFERFI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAogCQkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzBdLAogCQkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzFdLApAQCAtNTU0NCw5ICs1NTk0LDEzIEBACiAJfSBlbHNlIHsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTmV0ZXJpb24gWGZyYW1lIEkgMTBHYkUgYWRhcHRlciAiLAogCQkJICBkZXYtPm5hbWUpOwotCQlEQkdfUFJJTlQoRVJSX0RCRywgIihyZXYgJWQpLCBEcml2ZXIgJXNcbiIsCisJCURCR19QUklOVChFUlJfREJHLCAiKHJldiAlZCksICVzIiwKIAkJCQkJZ2V0X3hlbmFfcmV2X2lkKHNwLT5wZGV2KSwKIAkJCQkJczJpb19kcml2ZXJfdmVyc2lvbik7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIsIEJ1ZmZlciBtb2RlICVkIiwyKTsKKyNlbmRpZgorCQlEQkdfUFJJTlQoRVJSX0RCRywgIlxuQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuXG4iKTsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICJNQUMgQUREUjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAJCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMF0sCiAJCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMV0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKaW5kZXggYmM2NGQ5Ni4uODkxNTFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5oCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHMyaW8uaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIFMySU8gMTBHYkUgU2VydmVyIE5JQworICogczJpby5oOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgTmV0ZXJpb24gMTBHYkUgU2VydmVyIE5JQwogICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCiAKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKQEAgLTYyMiw2ICs2MjIsOSBAQAogCS8qIEZpZm8gc3BlY2lmaWMgc3RydWN0dXJlICovCiAJZmlmb19pbmZvX3QgZmlmb3NbTUFYX1RYX0ZJRk9TXTsKIAorCS8qIFNhdmUgdmlydHVhbCBhZGRyZXNzIG9mIFR4RCBwYWdlIHdpdGggemVybyBETUEgYWRkcihpZiBhbnkpICovCisJdm9pZCAqemVyb2RtYV92aXJ0X2FkZHI7CisKIC8qIHJ4IHNpZGUgc3R1ZmYgKi8KIAkvKiBSaW5nIHNwZWNpZmljIHN0cnVjdHVyZSAqLwogCXJpbmdfaW5mb190IHJpbmdzW01BWF9SWF9SSU5HU107CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCmluZGV4IGE5YjA2YjguLmFjOWNlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCkBAIC05ODYsNyArOTg2LDcgQEAKIAl9KQogI2VuZGlmCiAKLSNpZiBTTUNfQ0FOX1VTRV9EQVRBQ1MKKyNpZmRlZiBTTUNfQ0FOX1VTRV9EQVRBQ1MKICNkZWZpbmUgU01DX1BVU0hfREFUQShwLCBsKQkJCQkJCVwKIAlpZiAoIGxwLT5kYXRhY3MgKSB7CQkJCQkJXAogCQl1bnNpZ25lZCBjaGFyICpfX3B0ciA9IChwKTsJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTkyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKQEAgLTAsMCArMSwyMzM0IEBACisvKgorICogTmV0d29yayBkZXZpY2UgZHJpdmVyIGZvciBDZWxsIFByb2Nlc3Nvci1CYXNlZCBCbGFkZQorICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUKKyAqCisgKiBBdXRob3JzIDogVXR6IEJhY2hlciA8dXR6LmJhY2hlckBkZS5pYm0uY29tPgorICogICAgICAgICAgIEplbnMgT3N0ZXJrYW1wIDxKZW5zLk9zdGVya2FtcEBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgInNwaWRlcl9uZXQuaCIKKworTU9EVUxFX0FVVEhPUigiVXR6IEJhY2hlciA8dXR6LmJhY2hlckBkZS5pYm0uY29tPiBhbmQgSmVucyBPc3RlcmthbXAgIiBcCisJICAgICAgIjxKZW5zLk9zdGVya2FtcEBkZS5pYm0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGlkZXIgU291dGhicmlkZ2UgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCByeF9kZXNjcmlwdG9ycyA9IFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfREVGQVVMVDsKK3N0YXRpYyBpbnQgdHhfZGVzY3JpcHRvcnMgPSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX0RFRkFVTFQ7CisKK21vZHVsZV9wYXJhbShyeF9kZXNjcmlwdG9ycywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbSh0eF9kZXNjcmlwdG9ycywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhyeF9kZXNjcmlwdG9ycywgIm51bWJlciBvZiBkZXNjcmlwdG9ycyB1c2VkICIgXAorCQkgImluIHJ4IGNoYWlucyIpOworTU9EVUxFX1BBUk1fREVTQyh0eF9kZXNjcmlwdG9ycywgIm51bWJlciBvZiBkZXNjcmlwdG9ycyB1c2VkICIgXAorCQkgImluIHR4IGNoYWluIik7CisKK2NoYXIgc3BpZGVyX25ldF9kcml2ZXJfbmFtZVtdID0gInNwaWRlcm5ldCI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzcGlkZXJfbmV0X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQV8yLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfU1BJREVSX05FVCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNwaWRlcl9uZXRfcGNpX3RibCk7CisKKy8qKgorICogc3BpZGVyX25ldF9yZWFkX3JlZyAtIHJlYWRzIGFuIFNNTUlPIHJlZ2lzdGVyIG9mIGEgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqIEByZWc6IHJlZ2lzdGVyIHRvIHJlYWQgZnJvbQorICoKKyAqIHJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBTTU1JTyByZWdpc3Rlci4KKyAqLworc3RhdGljIHUzMgorc3BpZGVyX25ldF9yZWFkX3JlZyhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLCB1MzIgcmVnKQoreworCXUzMiB2YWx1ZTsKKworCXZhbHVlID0gcmVhZGwoY2FyZC0+cmVncyArIHJlZyk7CisJdmFsdWUgPSBsZTMyX3RvX2NwdSh2YWx1ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF93cml0ZV9yZWcgLSB3cml0ZXMgdG8gYW4gU01NSU8gcmVnaXN0ZXIgb2YgYSBjYXJkCisgKiBAY2FyZDogZGV2aWNlIHN0cnVjdHVyZQorICogQHJlZzogcmVnaXN0ZXIgdG8gd3JpdGUgdG8KKyAqIEB2YWx1ZTogdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgc3BlY2lmaWVkIFNNTUlPIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3dyaXRlX3JlZyhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgdmFsdWUpCit7CisJdmFsdWUgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisJd3JpdGVsKHZhbHVlLCBjYXJkLT5yZWdzICsgcmVnKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jIC0gd3JpdGVzIHRvIGFuIFNNTUlPIHJlZ2lzdGVyIG9mIGEgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqIEByZWc6IHJlZ2lzdGVyIHRvIHdyaXRlIHRvCisgKiBAdmFsdWU6IHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIHNwZWNpZmllZCBTTU1JTyByZWdpc3RlcgorICoKKyAqIFVubGlrZSBzcGlkZXJfbmV0X3dyaXRlX3JlZywgdGhpcyB3aWxsIGFsc28gbWFrZSBzdXJlIHRoZQorICogZGF0YSBhcnJpdmVzIG9uIHRoZSBjYXJkIGJ5IHJlYWRpbmcgdGhlIHJlZyBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfd3JpdGVfcmVnX3N5bmMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCXZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOworCXdyaXRlbCh2YWx1ZSwgY2FyZC0+cmVncyArIHJlZyk7CisJKHZvaWQpcmVhZGwoY2FyZC0+cmVncyArIHJlZyk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9yeF9pcnFfb2ZmIC0gc3dpdGNoIG9mZiByeCBpcnEgb24gdGhpcyBzcGlkZXIgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBzd2l0Y2hlcyBvZmYgcnggaXJxIGJ5IG1hc2tpbmcgdGhlbSBvdXQgaW4gdGhlIEdISUlOVG5NU0sgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfcnhfaXJxX29mZihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXUzMiByZWd2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworCXJlZ3ZhbHVlID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0spOworCXJlZ3ZhbHVlICY9IH5TUElERVJfTkVUX1JYSU5UOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnX3N5bmMoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLLCByZWd2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50bWFza19sb2NrLCBmbGFncyk7Cit9CisKKy8qKiBzcGlkZXJfbmV0X3dyaXRlX3BoeSAtIHdyaXRlIHRvIHBoeSByZWdpc3RlcgorICogQG5ldGRldjogYWRhcHRlciB0byBiZSB3cml0dGVuIHRvCisgKiBAbWlpX2lkOiBpZCBvZiBNSUkKKyAqIEByZWc6IFBIWSByZWdpc3RlcgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbiB0byBwaHkgcmVnaXN0ZXIKKyAqCisgKiBzcGlkZXJfbmV0X3dyaXRlX3BoeV9yZWdpc3RlciB3cml0ZXMgdG8gYW4gYXJiaXRyYXJ5IFBIWQorICogcmVnaXN0ZXIgdmlhIHRoZSBzcGlkZXIgR1BDV09QQ01EIHJlZ2lzdGVyLiBXZSBhc3N1bWUgdGhlIHF1ZXVlIGRvZXMKKyAqIG5vdCBydW4gZnVsbCAobm90IG1vcmUgdGhhbiAxNSBjb21tYW5kcyBvdXRzdGFuZGluZykuCisgKiovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF93cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG1paV9pZCwKKwkJICAgICBpbnQgcmVnLCBpbnQgdmFsKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiB3cml0ZXZhbHVlOworCisJd3JpdGV2YWx1ZSA9ICgodTMyKW1paV9pZCA8PCAyMSkgfAorCQkoKHUzMilyZWcgPDwgMTYpIHwgKCh1MzIpdmFsKTsKKworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1BDV09QQ01ELCB3cml0ZXZhbHVlKTsKK30KKworLyoqIHNwaWRlcl9uZXRfcmVhZF9waHkgLSByZWFkIGZyb20gcGh5IHJlZ2lzdGVyCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGRldmljZSB0byBiZSByZWFkIGZyb20KKyAqIEBtaWlfaWQ6IGlkIG9mIE1JSQorICogQHJlZzogUEhZIHJlZ2lzdGVyCisgKgorICogUmV0dXJucyB2YWx1ZSByZWFkIGZyb20gUEhZIHJlZ2lzdGVyCisgKgorICogc3BpZGVyX25ldF93cml0ZV9waHkgcmVhZHMgZnJvbSBhbiBhcmJpdHJhcnkgUEhZCisgKiByZWdpc3RlciB2aWEgdGhlIHNwaWRlciBHUENST1BDTUQgcmVnaXN0ZXIKKyAqKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfcmVhZF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG1paV9pZCwgaW50IHJlZykKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgcmVhZHZhbHVlOworCisJcmVhZHZhbHVlID0gKCh1MzIpbWlpX2lkIDw8IDIxKSB8ICgodTMyKXJlZyA8PCAxNik7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HUENST1BDTUQsIHJlYWR2YWx1ZSk7CisKKwkvKiB3ZSBkb24ndCB1c2Ugc2VtYXBob3JlcyB0byB3YWl0IGZvciBhbiBTUElERVJfTkVUX0dQUk9QQ01QSU5UCisJICogaW50ZXJydXB0LCBhcyB3ZSBwb2xsIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgcmVhZCBvcGVyYXRpb24KKwkgKiBpbiBzcGlkZXJfbmV0X3JlYWRfcGh5LiBTaG91bGQgdGFrZSBhYm91dCA1MCB1cyAqLworCWRvIHsKKwkJcmVhZHZhbHVlID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dQQ1JPUENNRCk7CisJfSB3aGlsZSAocmVhZHZhbHVlICYgU1BJREVSX05FVF9HUFJFWEVDKTsKKworCXJlYWR2YWx1ZSAmPSBTUElERVJfTkVUX0dQUkRBVF9NQVNLOworCisJcmV0dXJuIHJlYWR2YWx1ZTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3J4X2lycV9vbiAtIHN3aXRjaCBvbiByeCBpcnEgb24gdGhpcyBzcGlkZXIgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBzd2l0Y2hlcyBvbiByeCBpcnEgYnkgZW5hYmxpbmcgdGhlbSBpbiB0aGUgR0hJSU5Ubk1TSyByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9yeF9pcnFfb24oc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgcmVndmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKKwlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLKTsKKwlyZWd2YWx1ZSB8PSBTUElERVJfTkVUX1JYSU5UOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnX3N5bmMoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLLCByZWd2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50bWFza19sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF90eF9pcnFfb2ZmIC0gc3dpdGNoIG9mZiB0eCBpcnEgb24gdGhpcyBzcGlkZXIgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBzd2l0Y2hlcyBvZmYgdHggaXJxIGJ5IG1hc2tpbmcgdGhlbSBvdXQgaW4gdGhlIEdISUlOVG5NU0sgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfdHhfaXJxX29mZihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXUzMiByZWd2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworCXJlZ3ZhbHVlID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0spOworCXJlZ3ZhbHVlICY9IH5TUElERVJfTkVUX1RYSU5UOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnX3N5bmMoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLLCByZWd2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50bWFza19sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF90eF9pcnFfb24gLSBzd2l0Y2ggb24gdHggaXJxIG9uIHRoaXMgc3BpZGVyIGNhcmQKKyAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogc3dpdGNoZXMgb24gdHggaXJxIGJ5IGVuYWJsaW5nIHRoZW0gaW4gdGhlIEdISUlOVG5NU0sgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfdHhfaXJxX29uKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJdTMyIHJlZ3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50bWFza19sb2NrLCBmbGFncyk7CisJcmVndmFsdWUgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSyk7CisJcmVndmFsdWUgfD0gU1BJREVSX05FVF9UWElOVDsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfc2V0X3Byb21pc2MgLSBzZXRzIHRoZSB1bmljYXN0IGFkZHJlc3Mgb3IgdGhlIHByb21pc2N1b3VzIG1vZGUKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfc2V0X3Byb21pc2Mgc2V0cyB0aGUgdW5pY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzIGZpbHRlciBhbmQKKyAqIHRodXMgZWl0aGVyIGFsbG93cyBmb3Igbm9uLXByb21pc2MgbW9kZSBvciBwcm9taXNjIG1vZGUKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfc2V0X3Byb21pc2Moc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgbWFjdSwgbWFjbDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY2FyZC0+bmV0ZGV2OworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBjbGVhciBkZXN0aW5hdGlvbiBlbnRyeSAwICovCisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01SVUFGSUxuUiwgMCk7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01SVUFGSUxuUiArIDB4MDQsIDApOworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBMEZJTDE1UiwKKwkJCQkgICAgIFNQSURFUl9ORVRfUFJPTUlTQ19WQUxVRSk7CisJfSBlbHNlIHsKKwkJbWFjdSA9IG5ldGRldi0+ZGV2X2FkZHJbMF07CisJCW1hY3UgPDw9IDg7CisJCW1hY3UgfD0gbmV0ZGV2LT5kZXZfYWRkclsxXTsKKwkJbWVtY3B5KCZtYWNsLCAmbmV0ZGV2LT5kZXZfYWRkclsyXSwgc2l6ZW9mKG1hY2wpKTsKKworCQltYWN1IHw9IFNQSURFUl9ORVRfVUFfREVTQ1JfVkFMVUU7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01SVUFGSUxuUiwgbWFjdSk7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01SVUFGSUxuUiArIDB4MDQsIG1hY2wpOworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBMEZJTDE1UiwKKwkJCQkgICAgIFNQSURFUl9ORVRfTk9OUFJPTUlTQ19WQUxVRSk7CisJfQorfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZ2V0X21hY19hZGRyZXNzIC0gcmVhZCBtYWMgYWRkcmVzcyBmcm9tIHNwaWRlciBjYXJkCisgKiBAY2FyZDogZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJlYWRzIE1BQyBhZGRyZXNzIGZyb20gR01BQ1VOSU1BQ1UgYW5kIEdNQUNVTklNQUNMIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiBtYWNsLCBtYWN1OworCisJbWFjbCA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDVU5JTUFDTCk7CisJbWFjdSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDVU5JTUFDVSk7CisKKwluZXRkZXYtPmRldl9hZGRyWzBdID0gKG1hY3UgPj4gMjQpICYgMHhmZjsKKwluZXRkZXYtPmRldl9hZGRyWzFdID0gKG1hY3UgPj4gMTYpICYgMHhmZjsKKwluZXRkZXYtPmRldl9hZGRyWzJdID0gKG1hY3UgPj4gOCkgJiAweGZmOworCW5ldGRldi0+ZGV2X2FkZHJbM10gPSBtYWN1ICYgMHhmZjsKKwluZXRkZXYtPmRldl9hZGRyWzRdID0gKG1hY2wgPj4gOCkgJiAweGZmOworCW5ldGRldi0+ZGV2X2FkZHJbNV0gPSBtYWNsICYgMHhmZjsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcigmbmV0ZGV2LT5kZXZfYWRkclswXSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzIC0tIHJldHVybnMgdGhlIHN0YXR1cyBvZiBhIGRlc2NyaXB0b3IKKyAqIEBkZXNjcjogZGVzY3JpcHRvciB0byBsb29rIGF0CisgKgorICogcmV0dXJucyB0aGUgc3RhdHVzIGFzIGluIHRoZSBkbWFjX2NtZF9zdGF0dXMgZmllbGQgb2YgdGhlIGRlc2NyaXB0b3IKKyAqLworc3RhdGljIGVudW0gc3BpZGVyX25ldF9kZXNjcl9zdGF0dXMKK3NwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3IpCit7CisJdTMyIGNtZF9zdGF0dXM7CisJcm1iKCk7CisJY21kX3N0YXR1cyA9IGRlc2NyLT5kbWFjX2NtZF9zdGF0dXM7CisJcm1iKCk7CisJY21kX3N0YXR1cyA+Pj0gU1BJREVSX05FVF9ERVNDUl9JTkRfUFJPQ19TSElGVDsKKwkvKiBubyBuZWVkIHRvIG1hc2sgb3V0IGFueSBiaXRzLCBhcyBjbWRfc3RhdHVzIGlzIDMyIGJpdHMgd2lkZSBvbmx5CisJICogKGFuZCB1bnNpZ25lZCkgKi8KKwlyZXR1cm4gY21kX3N0YXR1czsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldF9kZXNjcl9zdGF0dXMgLS0gc2V0cyB0aGUgc3RhdHVzIG9mIGEgZGVzY3JpcHRvcgorICogQGRlc2NyOiBkZXNjcmlwdG9yIHRvIGNoYW5nZQorICogQHN0YXR1czogc3RhdHVzIHRvIHNldCBpbiB0aGUgZGVzY3JpcHRvcgorICoKKyAqIGNoYW5nZXMgdGhlIHN0YXR1cyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBEb2Vzbid0IGNoYW5nZSBvdGhlciBiaXRzCisgKiBpbiB0aGUgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3NldF9kZXNjcl9zdGF0dXMoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyLAorCQkJICAgIGVudW0gc3BpZGVyX25ldF9kZXNjcl9zdGF0dXMgc3RhdHVzKQoreworCXUzMiBjbWRfc3RhdHVzOworCS8qIHJlYWQgdGhlIHN0YXR1cyAqLworCW1iKCk7CisJY21kX3N0YXR1cyA9IGRlc2NyLT5kbWFjX2NtZF9zdGF0dXM7CisJLyogY2xlYW4gdGhlIHVwcGVyIDQgYml0cyAqLworCWNtZF9zdGF0dXMgJj0gU1BJREVSX05FVF9ERVNDUl9JTkRfUFJPQ19NQVNLTzsKKwkvKiBhZGQgdGhlIHN0YXR1cyB0byBpdCAqLworCWNtZF9zdGF0dXMgfD0gKCh1MzIpc3RhdHVzKTw8U1BJREVSX05FVF9ERVNDUl9JTkRfUFJPQ19TSElGVDsKKwkvKiBhbmQgd3JpdGUgaXQgYmFjayAqLworCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBjbWRfc3RhdHVzOworCXdtYigpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZnJlZV9jaGFpbiAtIGZyZWUgZGVzY3JpcHRvciBjaGFpbgorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAY2hhaW46IGFkZHJlc3Mgb2YgY2hhaW4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2ZyZWVfY2hhaW4oc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwKKwkJICAgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gKmNoYWluKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcjsKKworCWZvciAoZGVzY3IgPSBjaGFpbi0+dGFpbDsgIWRlc2NyLT5idXNfYWRkcjsgZGVzY3IgPSBkZXNjci0+bmV4dCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idXNfYWRkciwKKwkJCQkgU1BJREVSX05FVF9ERVNDUl9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlkZXNjci0+YnVzX2FkZHIgPSAwOworCX0KK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2luaXRfY2hhaW4gLSBsaW5rcyBkZXNjcmlwdG9yIGNoYWluCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqIEBjaGFpbjogYWRkcmVzcyBvZiBjaGFpbgorICogQHN0YXJ0X2Rlc2NyOiBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgYXJyYXkKKyAqIEBubzogbnVtYmVyIG9mIGRlc2NyaXB0b3JzCisgKgorICogd2UgbWFuYWdlIGEgY2lyY3VsYXIgbGlzdCB0aGF0IG1pcnJvcnMgdGhlIGhhcmR3YXJlIHN0cnVjdHVyZSwKKyAqIGV4Y2VwdCB0aGF0IHRoZSBoYXJkd2FyZSB1c2VzIGJ1cyBhZGRyZXNzZXMuCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9pbml0X2NoYWluKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW4sCisJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqc3RhcnRfZGVzY3IsIGludCBubykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CisKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+Y2hhaW5fbG9jayk7CisKKwlkZXNjciA9IHN0YXJ0X2Rlc2NyOworCW1lbXNldChkZXNjciwgMCwgc2l6ZW9mKCpkZXNjcikgKiBubyk7CisKKwkvKiBzZXQgdXAgdGhlIGhhcmR3YXJlIHBvaW50ZXJzIGluIGVhY2ggZGVzY3JpcHRvciAqLworCWZvciAoaT0wOyBpPG5vOyBpKyssIGRlc2NyKyspIHsKKwkJc3BpZGVyX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLCBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpOworCisJCWRlc2NyLT5idXNfYWRkciA9CisJCQlwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjciwKKwkJCQkgICAgICAgU1BJREVSX05FVF9ERVNDUl9TSVpFLAorCQkJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJCWlmIChkZXNjci0+YnVzX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpCisJCQlnb3RvIGlvbW11X2Vycm9yOworCisJCWRlc2NyLT5uZXh0ID0gZGVzY3IgKyAxOworCQlkZXNjci0+cHJldiA9IGRlc2NyIC0gMTsKKworCX0KKwkvKiBkbyBhY3R1YWwgY2lyY3VsYXIgbGlzdCAqLworCShkZXNjci0xKS0+bmV4dCA9IHN0YXJ0X2Rlc2NyOworCXN0YXJ0X2Rlc2NyLT5wcmV2ID0gZGVzY3ItMTsKKworCWRlc2NyID0gc3RhcnRfZGVzY3I7CisJZm9yIChpPTA7IGkgPCBubzsgaSsrLCBkZXNjcisrKSB7CisJCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSBkZXNjci0+bmV4dC0+YnVzX2FkZHI7CisJfQorCisJY2hhaW4tPmhlYWQgPSBzdGFydF9kZXNjcjsKKwljaGFpbi0+dGFpbCA9IHN0YXJ0X2Rlc2NyOworCisJcmV0dXJuIDA7CisKK2lvbW11X2Vycm9yOgorCWRlc2NyID0gc3RhcnRfZGVzY3I7CisJZm9yIChpPTA7IGkgPCBubzsgaSsrLCBkZXNjcisrKQorCQlpZiAoZGVzY3ItPmJ1c19hZGRyKQorCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVzX2FkZHIsCisJCQkJCSBTUElERVJfTkVUX0RFU0NSX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9mcmVlX3J4X2NoYWluX2NvbnRlbnRzIC0gZnJlZXMgZGVzY3IgY29udGVudHMgaW4gcnggY2hhaW4KKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2ZyZWVfcnhfY2hhaW5fY29udGVudHMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CisKKwlkZXNjciA9IGNhcmQtPnJ4X2NoYWluLmhlYWQ7CisJd2hpbGUgKGRlc2NyLT5uZXh0ICE9IGNhcmQtPnJ4X2NoYWluLmhlYWQpIHsKKwkJaWYgKGRlc2NyLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2IoZGVzY3ItPnNrYik7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idWZfYWRkciwKKwkJCQkJIFNQSURFUl9ORVRfTUFYX01UVSwKKwkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCX0KKwkJZGVzY3IgPSBkZXNjci0+bmV4dDsKKwl9Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9wcmVwYXJlX3J4X2Rlc2NyIC0gcmVpbml0aWFsaXplcyBhIHJ4IGRlc2NyaXB0b3IKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQGRlc2NyOiBkZXNjcmlwdG9yIHRvIHJlLWluaXQKKyAqCisgKiByZXR1cm4gMCBvbiBzdWNjZXMsIDwwIG9uIGZhaWx1cmUKKyAqCisgKiBhbGxvY2F0ZXMgYSBuZXcgcnggc2tiLCBpb21tdS1tYXBzIGl0IGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgZGVzY3JpcHRvci4KKyAqIEFjdGl2YXRlIHRoZSBkZXNjcmlwdG9yIHN0YXRlLXdpc2UKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9wcmVwYXJlX3J4X2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCQkgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyKQoreworCWludCBlcnJvciA9IDA7CisJaW50IG9mZnNldDsKKwlpbnQgYnVmc2l6ZTsKKworCS8qIHdlIG5lZWQgdG8gcm91bmQgdXAgdGhlIGJ1ZmZlciBzaXplIHRvIGEgbXVsdGlwbGUgb2YgMTI4ICovCisJYnVmc2l6ZSA9IChTUElERVJfTkVUX01BWF9NVFUgKyBTUElERVJfTkVUX1JYQlVGX0FMSUdOIC0gMSkgJgorCQkofihTUElERVJfTkVUX1JYQlVGX0FMSUdOIC0gMSkpOworCisJLyogYW5kIHdlIG5lZWQgdG8gaGF2ZSBpdCAxMjggYnl0ZSBhbGlnbmVkLCB0aGVyZWZvcmUgd2UgYWxsb2NhdGUgYQorCSAqIGJpdCBtb3JlICovCisJLyogYWxsb2NhdGUgYW4gc2tiICovCisJZGVzY3ItPnNrYiA9IGRldl9hbGxvY19za2IoYnVmc2l6ZSArIFNQSURFUl9ORVRfUlhCVUZfQUxJR04gLSAxKTsKKwlpZiAoIWRlc2NyLT5za2IpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGNhcmQpKQorCQkJCXByX2VycigiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgIgorCQkJCQkicnggYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRlc2NyLT5idWZfc2l6ZSA9IGJ1ZnNpemU7CisJZGVzY3ItPnJlc3VsdF9zaXplID0gMDsKKwlkZXNjci0+dmFsaWRfc2l6ZSA9IDA7CisJZGVzY3ItPmRhdGFfc3RhdHVzID0gMDsKKwlkZXNjci0+ZGF0YV9lcnJvciA9IDA7CisKKwlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpZGVzY3ItPnNrYi0+ZGF0YSkgJgorCQkoU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpOworCWlmIChvZmZzZXQpCisJCXNrYl9yZXNlcnZlKGRlc2NyLT5za2IsIFNQSURFUl9ORVRfUlhCVUZfQUxJR04gLSBvZmZzZXQpOworCS8qIGlvLW1tdS1tYXAgdGhlIHNrYiAqLworCWRlc2NyLT5idWZfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5za2ItPmRhdGEsCisJCQkJCSBTUElERVJfTkVUX01BWF9NVFUsCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChkZXNjci0+YnVmX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoZGVzY3ItPnNrYik7CisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGNhcmQpKQorCQkJcHJfZXJyKCJDb3VsZCBub3QgaW9tbXUtbWFwIHJ4IGJ1ZmZlclxuIik7CisJCXNwaWRlcl9uZXRfc2V0X2Rlc2NyX3N0YXR1cyhkZXNjciwgU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKTsKKwl9IGVsc2UgeworCQlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gU1BJREVSX05FVF9ETUFDX1JYX0NBUkRPV05FRDsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9lbmFibGVfcnhjdGFpbHMgLSBzZXRzIFJYIGRtYWMgY2hhaW4gdGFpbCBhZGRyZXNzZXMKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4Y3RhaWxzIHNldHMgdGhlIFJYIERNQUMgY2hhaW4gdGFpbCBhZHJlc3NlcyBpbiB0aGUKKyAqIGNoaXAgYnkgd3JpdGluZyB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIuIERNQSBpcyBlbmFibGVkIGluCisgKiBzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMuCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2VuYWJsZV9yeGNodGFpbHMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwkvKiBhc3N1bWUgY2hhaW4gaXMgYWxpZ25lZCBjb3JyZWN0bHkgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEQURDSEEgLAorCQkJICAgICBjYXJkLT5yeF9jaGFpbi50YWlsLT5idXNfYWRkcik7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjIC0gZW5hYmxlcyBhIHJlY2VpdmUgRE1BIGNvbnRyb2xsZXIKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyBlbmFibGVzIHRoZSBETUEgY29udHJvbGxlciBieSBzZXR0aW5nIFJYX0RNQV9FTgorICogaW4gdGhlIEdEQURNQUNDTlRSIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEQURNQUNDTlRSLAorCQkJICAgICBTUElERVJfTkVUX0RNQV9SWF9WQUxVRSk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4gLSByZWZpbGxzIGRlc2NyaXB0b3JzL3NrYnMgaW4gdGhlIHJ4IGNoYWlucworICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogcmVmaWxscyBkZXNjcmlwdG9ycyBpbiBhbGwgY2hhaW5zIChsYXN0IHVzZWQgY2hhaW4gZmlyc3QpOiBhbGxvY2F0ZXMgc2ticworICogYW5kIGlvbW11LW1hcHMgdGhlbS4KKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gKmNoYWluOworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNoYWluID0gJmNhcmQtPnJ4X2NoYWluOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNoYWluX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGNoYWluLT5oZWFkKSA9PQorCQkJCVNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSkgeworCQlpZiAoc3BpZGVyX25ldF9wcmVwYXJlX3J4X2Rlc2NyKGNhcmQsIGNoYWluLT5oZWFkKSkKKwkJCWJyZWFrOworCQljb3VudCsrOworCQljaGFpbi0+aGVhZCA9IGNoYWluLT5oZWFkLT5uZXh0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jaGFpbl9sb2NrLCBmbGFncyk7CisKKwkvKiBjb3VsZCBiZSBvcHRpbWl6ZWQsIG9ubHkgZG8gdGhhdCwgaWYgd2Uga25vdyB0aGUgRE1BIHByb2Nlc3NpbmcKKwkgKiBoYXMgdGVybWluYXRlZCAqLworCWlmIChjb3VudCkKKwkJc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfYWxsb2Nfcnhfc2ticyAtIGFsbG9jYXRlcyByeCBza2JzIGluIHJ4IGRlc2NyaXB0b3IgY2hhaW5zCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X2FsbG9jX3J4X3NrYnMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluICpjaGFpbjsKKworCXJlc3VsdCA9IC1FTk9NRU07CisKKwljaGFpbiA9ICZjYXJkLT5yeF9jaGFpbjsKKwkvKiBwdXQgYXQgbGVhc3Qgb25lIGJ1ZmZlciBpbnRvIHRoZSBjaGFpbi4gaWYgdGhpcyBmYWlscywKKwkgKiB3ZSd2ZSBnb3QgYSBwcm9ibGVtLiBpZiBub3QsIHNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluCisJICogd2lsbCBkbyB0aGUgcmVzdCBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gKi8KKwlpZiAoc3BpZGVyX25ldF9wcmVwYXJlX3J4X2Rlc2NyKGNhcmQsIGNoYWluLT5oZWFkKSkKKwkJZ290byBlcnJvcjsKKwllbHNlCisJCWNoYWluLT5oZWFkID0gY2hhaW4tPmhlYWQtPm5leHQ7CisKKwkvKiB0aGlzIHdpbGwgYWxsb2NhdGUgdGhlIHJlc3Qgb2YgdGhlIHJ4IGJ1ZmZlcnM7IGlmIG5vdCwgaXQncworCSAqIGJ1c2luZXNzIGFzIHVzdWFsIGxhdGVyIG9uICovCisJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXNwaWRlcl9uZXRfZnJlZV9yeF9jaGFpbl9jb250ZW50cyhjYXJkKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcmVsZWFzZV90eF9kZXNjciAtIHByb2Nlc3NlcyBhIHVzZWQgdHggZGVzY3JpcHRvcgorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAZGVzY3I6IGRlc2NyaXB0b3IgdG8gcmVsZWFzZQorICoKKyAqIHJlbGVhc2VzIGEgdXNlZCB0eCBkZXNjcmlwdG9yICh1bm1hcHBpbmcsIGZyZWVpbmcgb2Ygc2tiKQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9yZWxlYXNlX3R4X2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCQkgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiB1bm1hcCB0aGUgc2tiICovCisJc2tiID0gZGVzY3ItPnNrYjsKKwlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idWZfYWRkciwgc2tiLT5sZW4sCisJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwkvKiBzZXQgc3RhdHVzIHRvIG5vdCB1c2VkICovCisJc3BpZGVyX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLCBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbiAtIHByb2Nlc3NlcyBzZW50IHR4IGRlc2NyaXB0b3JzCisgKiBAY2FyZDogYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBicnV0YWw6IGlmIHNldCwgZG9uJ3QgY2FyZSBhYm91dCB3aGV0aGVyIGRlc2NyaXB0b3Igc2VlbXMgdG8gYmUgaW4gdXNlCisgKgorICogcmVsZWFzZXMgdGhlIHR4IGRlc2NyaXB0b3JzIHRoYXQgc3BpZGVyIGhhcyBmaW5pc2hlZCB3aXRoIChpZiBub24tYnJ1dGFsKQorICogb3Igc2ltcGx5IHJlbGVhc2UgdHggZGVzY3JpcHRvcnMgKGlmIGJydXRhbCkKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLCBpbnQgYnJ1dGFsKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluICp0eF9jaGFpbiA9ICZjYXJkLT50eF9jaGFpbjsKKwllbnVtIHNwaWRlcl9uZXRfZGVzY3Jfc3RhdHVzIHN0YXR1czsKKworCXNwaWRlcl9uZXRfdHhfaXJxX29mZihjYXJkKTsKKworCS8qIG5vIGxvY2sgZm9yIGNoYWluIG5lZWRlZCwgaWYgdGhpcyBpcyBvbmx5IGV4ZWN1dGVkIG9uY2UgYXQgYSB0aW1lICovCithZ2FpbjoKKwlmb3IgKDs7KSB7CisJCXN0YXR1cyA9IHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyh0eF9jaGFpbi0+dGFpbCk7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9DQVJET1dORUQ6CisJCQlpZiAoIWJydXRhbCkgZ290byBvdXQ7CisJCQkvKiBmYWxsdGhyb3VnaCwgaWYgd2UgcmVsZWFzZSB0aGUgZGVzY3JpcHRvcnMKKwkJCSAqIGJydXRhbGx5ICh0aGVuIHdlIGRvbid0IGNhcmUgYWJvdXQKKwkJCSAqIFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKSAqLworCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfUkVTUE9OU0VfRVJST1I6CisJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9QUk9URUNUSU9OX0VSUk9SOgorCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfRk9SQ0VfRU5EOgorCQkJaWYgKG5ldGlmX21zZ190eF9lcnIoY2FyZCkpCisJCQkJcHJfZXJyKCIlczogZm9yY2luZyBlbmQgb2YgdHggZGVzY3JpcHRvciAiCisJCQkJICAgICAgICJ3aXRoIHN0YXR1cyB4JTAyeFxuIiwKKwkJCQkgICAgICAgY2FyZC0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9DT01QTEVURToKKwkJCWNhcmQtPm5ldGRldl9zdGF0cy50eF9wYWNrZXRzKys7CisJCQljYXJkLT5uZXRkZXZfc3RhdHMudHhfYnl0ZXMgKz0KKwkJCQl0eF9jaGFpbi0+dGFpbC0+c2tiLT5sZW47CisJCQlicmVhazsKKworCQlkZWZhdWx0OiAvKiBhbnkgb3RoZXIgdmFsdWUgKD09IFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSkgKi8KKwkJCWdvdG8gb3V0OworCQl9CisJCXNwaWRlcl9uZXRfcmVsZWFzZV90eF9kZXNjcihjYXJkLCB0eF9jaGFpbi0+dGFpbCk7CisJCXR4X2NoYWluLT50YWlsID0gdHhfY2hhaW4tPnRhaWwtPm5leHQ7CisJfQorb3V0OgorCW5ldGlmX3dha2VfcXVldWUoY2FyZC0+bmV0ZGV2KTsKKworCWlmICghYnJ1dGFsKSB7CisJCS8qIHN3aXRjaCBvbiB0eCBpcnFzICh3aGlsZSB3ZSBhcmUgc3RpbGwgaW4gdGhlIGludGVycnVwdAorCQkgKiBoYW5kbGVyLCBzbyB3ZSBkb24ndCBnZXQgYW4gaW50ZXJydXB0KSwgY2hlY2sgYWdhaW4KKwkJICogZm9yIGRvbmUgZGVzY3JpcHRvcnMuIFRoaXMgcmVzdWx0cyBpbiBmZXdlciBpbnRlcnJ1cHRzICovCisJCXNwaWRlcl9uZXRfdHhfaXJxX29uKGNhcmQpOworCQlzdGF0dXMgPSBzcGlkZXJfbmV0X2dldF9kZXNjcl9zdGF0dXModHhfY2hhaW4tPnRhaWwpOworCQlzd2l0Y2ggKHN0YXR1cykgeworCQkJY2FzZSBTUElERVJfTkVUX0RFU0NSX1JFU1BPTlNFX0VSUk9SOgorCQkJY2FzZSBTUElERVJfTkVUX0RFU0NSX1BST1RFQ1RJT05fRVJST1I6CisJCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfRk9SQ0VfRU5EOgorCQkJY2FzZSBTUElERVJfTkVUX0RFU0NSX0NPTVBMRVRFOgorCQkJCWdvdG8gYWdhaW47CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCit9CisKKy8qKgorICogc3BpZGVyX25ldF9nZXRfbXVsdGljYXN0X2hhc2ggLSBnZW5lcmF0ZXMgaGFzaCBmb3IgbXVsdGljYXN0IGZpbHRlciB0YWJsZQorICogQGFkZHI6IG11bHRpY2FzdCBhZGRyZXNzCisgKgorICogcmV0dXJucyB0aGUgaGFzaCB2YWx1ZS4KKyAqCisgKiBzcGlkZXJfbmV0X2dldF9tdWx0aWNhc3RfaGFzaCBjYWxjdWxhdGVzIGEgaGFzaCB2YWx1ZSBmb3IgYSBnaXZlbiBtdWx0aWNhc3QKKyAqIGFkZHJlc3MsIHRoYXQgaXMgdXNlZCB0byBzZXQgdGhlIG11bHRpY2FzdCBmaWx0ZXIgdGFibGVzCisgKi8KK3N0YXRpYyB1OAorc3BpZGVyX25ldF9nZXRfbXVsdGljYXN0X2hhc2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgX191OCAqYWRkcikKK3sKKwkvKiBGSVhNRTogYW4gYWRkciBvZiAwMTowMDo1ZTowMDowMDowMSBtdXN0IHJlc3VsdCBpbiAweGE5LAorCSAqIGZmOmZmOmZmOmZmOmZmOmZmIG11c3QgcmVzdWx0IGluIDB4ZmQgKi8KKwl1MzIgY3JjOworCXU4IGhhc2g7CisKKwljcmMgPSBjcmMzMl9iZSh+MCwgYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwloYXNoID0gKGNyYyA+PiAyNyk7CisJaGFzaCA8PD0gMzsKKwloYXNoIHw9IGNyYyAmIDc7CisKKwlyZXR1cm4gaGFzaDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldF9tdWx0aSAtIHNldHMgbXVsdGljYXN0IGFkZHJlc3NlcyBhbmQgcHJvbWlzYyBmbGFncworICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X3NldF9tdWx0aSBjb25maWd1cmVzIG11bHRpY2FzdCBhZGRyZXNzZXMgYXMgbmVlZGVkIGZvciB0aGUKKyAqIG5ldGRldiBpbnRlcmZhY2UuIEl0IGFsc28gc2V0cyB1cCBtdWx0aWNhc3QsIGFsbG11bHRpIGFuZCBwcm9taXNjCisgKiBmbGFncyBhcHByb3ByaWF0ZWx5CisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWM7CisJdTggaGFzaDsKKwlpbnQgaTsKKwl1MzIgcmVnOworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgYml0bWFza1tTUElERVJfTkVUX01VTFRJQ0FTVF9IQVNIRVMgLyBCSVRTX1BFUl9MT05HXSA9CisJCXswLCB9OworCisJc3BpZGVyX25ldF9zZXRfcHJvbWlzYyhjYXJkKTsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTUElERVJfTkVUX01VTFRJQ0FTVF9IQVNIRVM7IGkrKykgeworCQkJc2V0X2JpdChpLCBiaXRtYXNrKTsKKwkJfQorCQlnb3RvIHdyaXRlX2hhc2g7CisJfQorCisJLyogd2VsbCwgd2Uga25vdywgd2hhdCB0aGUgYnJvYWRjYXN0IGhhc2ggdmFsdWUgaXM6IGl0J3MgeGZkCisJaGFzaCA9IHNwaWRlcl9uZXRfZ2V0X211bHRpY2FzdF9oYXNoKG5ldGRldiwgbmV0ZGV2LT5icm9hZGNhc3QpOyAqLworCXNldF9iaXQoMHhmZCwgYml0bWFzayk7CisKKwlmb3IgKG1jID0gbmV0ZGV2LT5tY19saXN0OyBtYzsgbWMgPSBtYy0+bmV4dCkgeworCQloYXNoID0gc3BpZGVyX25ldF9nZXRfbXVsdGljYXN0X2hhc2gobmV0ZGV2LCBtYy0+ZG1pX2FkZHIpOworCQlzZXRfYml0KGhhc2gsIGJpdG1hc2spOworCX0KKword3JpdGVfaGFzaDoKKwlmb3IgKGkgPSAwOyBpIDwgU1BJREVSX05FVF9NVUxUSUNBU1RfSEFTSEVTIC8gNDsgaSsrKSB7CisJCXJlZyA9IDA7CisJCWlmICh0ZXN0X2JpdChpICogNCwgYml0bWFzaykpCisJCQlyZWcgKz0gMHgwODsKKwkJcmVnIDw8PSA4OworCQlpZiAodGVzdF9iaXQoaSAqIDQgKyAxLCBiaXRtYXNrKSkKKwkJCXJlZyArPSAweDA4OworCQlyZWcgPDw9IDg7CisJCWlmICh0ZXN0X2JpdChpICogNCArIDIsIGJpdG1hc2spKQorCQkJcmVnICs9IDB4MDg7CisJCXJlZyA8PD0gODsKKwkJaWYgKHRlc3RfYml0KGkgKiA0ICsgMywgYml0bWFzaykpCisJCQlyZWcgKz0gMHgwODsKKworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUk1IRklMblIgKyBpICogNCwgcmVnKTsKKwl9Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9kaXNhYmxlX3J4ZG1hYyAtIGRpc2FibGVzIHRoZSByZWNlaXZlIERNQSBjb250cm9sbGVyCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqCisgKiBzcGlkZXJfbmV0X2Rpc2FibGVfcnhkbWFjIHRlcm1pbmF0ZXMgcHJvY2Vzc2luZyBvbiB0aGUgRE1BIGNvbnRyb2xsZXIgYnkKKyAqIHR1cmluZyBvZmYgRE1BIGFuZCBpc3N1ZWluZyBhIGZvcmNlIGVuZAorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9kaXNhYmxlX3J4ZG1hYyhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0RBRE1BQ0NOVFIsCisJCQkgICAgIFNQSURFUl9ORVRfRE1BX1JYX0ZFTkRfVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfc3RvcCAtIGNhbGxlZCB1cG9uIGlmY29uZmlnIGRvd24KKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogYWx3YXlzIHJldHVybnMgMAorICovCitpbnQKK3NwaWRlcl9uZXRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0aWZfcG9sbF9kaXNhYmxlKG5ldGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBkaXNhYmxlL21hc2sgYWxsIGludGVycnVwdHMgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0ssIDApOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMU1TSywgMCk7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQyTVNLLCAwKTsKKworCS8qIGZyZWVfaXJxKG5ldGRldi0+aXJxLCBuZXRkZXYpOyovCisJZnJlZV9pcnEodG9fcGNpX2RldihuZXRkZXYtPmNsYXNzX2Rldi5kZXYpLT5pcnEsIG5ldGRldik7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEVERNQUNDTlRSLAorCQkJICAgICBTUElERVJfTkVUX0RNQV9UWF9GRU5EX1ZBTFVFKTsKKworCS8qIHR1cm4gb2ZmIERNQSwgZm9yY2UgZW5kICovCisJc3BpZGVyX25ldF9kaXNhYmxlX3J4ZG1hYyhjYXJkKTsKKworCS8qIHJlbGVhc2UgY2hhaW5zICovCisJc3BpZGVyX25ldF9yZWxlYXNlX3R4X2NoYWluKGNhcmQsIDEpOworCisJc3BpZGVyX25ldF9mcmVlX2NoYWluKGNhcmQsICZjYXJkLT50eF9jaGFpbik7CisJc3BpZGVyX25ldF9mcmVlX2NoYWluKGNhcmQsICZjYXJkLT5yeF9jaGFpbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X2dldF9uZXh0X3R4X2Rlc2NyIC0gcmV0dXJucyB0aGUgbmV4dCBhdmFpbGFibGUgdHggZGVzY3JpcHRvcgorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUgdG8gZ2V0IGRlc2NyaXB0b3IgZnJvbQorICoKKyAqIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgZGVzY3JpcHRvciwgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlLgorICovCitzdGF0aWMgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKgorc3BpZGVyX25ldF9nZXRfbmV4dF90eF9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCS8qIGNoZWNrLCBpZiBoZWFkIHBvaW50cyB0byBub3QtaW4tdXNlIGRlc2NyICovCisJaWYgKCBzcGlkZXJfbmV0X2dldF9kZXNjcl9zdGF0dXMoY2FyZC0+dHhfY2hhaW4uaGVhZCkgPT0KKwkgICAgIFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSApIHsKKwkJcmV0dXJuIGNhcmQtPnR4X2NoYWluLmhlYWQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKioKKyAqIHNwaWRlcl9uZXRfc2V0X3R4ZGVzY3JfY21kc3RhdCAtIHNldHMgdGhlIHR4IGRlc2NyaXB0b3IgY29tbWFuZCBmaWVsZAorICogQGRlc2NyOiBkZXNjcmlwdG9yIHN0cnVjdHVyZSB0byBmaWxsIG91dAorICogQHNrYjogcGFja2V0IHRvIGNvbnNpZGVyCisgKgorICogZmlsbHMgb3V0IHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgZmllbGQgb2YgdGhlIGRlc2NyaXB0b3Igc3RydWN0dXJlLAorICogZGVwZW5kaW5nIG9uIGhhcmR3YXJlIGNoZWNrc3VtIHNldHRpbmdzLiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgYSB3bWIoKQorICogaGFzIGV4ZWN1dGVkIGJlZm9yZS4KKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfc2V0X3R4ZGVzY3JfY21kc3RhdChzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3IsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fSFcpIHsKKwkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX05PQ1M7CisJCXJldHVybjsKKwl9CisKKwkvKiBpcyBwYWNrZXQgaXA/CisJICogaWYgeWVzOiB0Y3A/IHVkcD8gKi8KKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX1RDUENTOworCQl9IGVsc2UgaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX1VEUENTOworCQl9IGVsc2UgeyAvKiB0aGUgc3RhY2sgc2hvdWxkIGNoZWNrc3VtIG5vbi10Y3AgYW5kIG5vbi11ZHAKKwkJCSAgICBwYWNrZXRzIG9uIGhpcyBvd246IE5FVElGX0ZfSVBfQ1NVTSAqLworCQkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX05PQ1M7CisJCX0KKwl9Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9wcmVwYXJlX3R4X2Rlc2NyIC0gZmlsbCB0eCBkZXNjcmlwdG9yIHdpdGggc2tiIGRhdGEKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQGRlc2NyOiBkZXNjcmlwdG9yIHN0cnVjdHVyZSB0byBmaWxsIG91dAorICogQHNrYjogcGFja2V0IHRvIHVzZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgorICoKKyAqIGZpbGxzIG91dCB0aGUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgd2l0aCBza2IgZGF0YSBhbmQgbGVuLiBDb3BpZXMgZGF0YSwKKyAqIGlmIG5lZWRlZCAoMzJiaXQgRE1BISkKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9wcmVwYXJlX3R4X2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCisJCQkgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyLAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJZGVzY3ItPmJ1Zl9hZGRyID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKGRlc2NyLT5idWZfYWRkciA9PSBETUFfRVJST1JfQ09ERSkgeworCQlpZiAobmV0aWZfbXNnX3R4X2VycihjYXJkKSkKKwkJCXByX2VycigiY291bGQgbm90IGlvbW11LW1hcCBwYWNrZXQgKCVwLCAlaSkuICIKKwkJCQkgICJEcm9wcGluZyBwYWNrZXRcbiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXNjci0+YnVmX3NpemUgPSBza2ItPmxlbjsKKwlkZXNjci0+c2tiID0gc2tiOworCWRlc2NyLT5kYXRhX3N0YXR1cyA9IDA7CisKKwkvKiBtYWtlIHN1cmUgdGhlIGFib3ZlIHZhbHVlcyBhcmUgaW4gbWVtb3J5IGJlZm9yZSB3ZSBjaGFuZ2UgdGhlCisJICogc3RhdHVzICovCisJd21iKCk7CisKKwlzcGlkZXJfbmV0X3NldF90eGRlc2NyX2NtZHN0YXQoZGVzY3Isc2tiKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfa2lja190eF9kbWEgLSBlbmFibGVzIFRYIERNQSBwcm9jZXNzaW5nCisgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqIEBkZXNjcjogZGVzY3JpcHRvciBhZGRyZXNzIHRvIGVuYWJsZSBUWCBwcm9jZXNzaW5nIGF0CisgKgorICogc3BpZGVyX25ldF9raWNrX3R4X2RtYSB3cml0ZXMgdGhlIGN1cnJlbnQgdHggY2hhaW4gaGVhZCBhcyBzdGFydCBhZGRyZXNzCisgKiBvZiB0aGUgdHggZGVzY3JpcHRvciBjaGFpbiBhbmQgZW5hYmxlcyB0aGUgdHJhbnNtaXNzaW9uIERNQSBlbmdpbmUKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfa2lja190eF9kbWEoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwKKwkJICAgICAgIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcikKK3sKKwkvKiB0aGlzIGlzIHRoZSBvbmx5IGRlc2NyaXB0b3IgaW4gdGhlIG91dHB1dCBjaGFpbi4KKwkgKiBFbmFibGUgVFggRE1BICovCisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEVERDSEEsCisJCQkgICAgIGRlc2NyLT5idXNfYWRkcik7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEVERNQUNDTlRSLAorCQkJICAgICBTUElERVJfTkVUX0RNQV9UWF9WQUxVRSk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF94bWl0IC0gdHJhbnNtaXRzIGEgZnJhbWUgb3ZlciB0aGUgZGV2aWNlCisgKiBAc2tiOiBwYWNrZXQgdG8gc2VuZCBvdXQKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOworCWludCByZXN1bHQ7CisKKwlkZXNjciA9IHNwaWRlcl9uZXRfZ2V0X25leHRfdHhfZGVzY3IoY2FyZCk7CisKKwlpZiAoIWRlc2NyKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCQlkZXNjciA9IHNwaWRlcl9uZXRfZ2V0X25leHRfdHhfZGVzY3IoY2FyZCk7CisJCWlmICghZGVzY3IpCisJCQlnb3RvIGVycm9yOworCQllbHNlCisJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCX0KKworCXJlc3VsdCA9IHNwaWRlcl9uZXRfcHJlcGFyZV90eF9kZXNjcihjYXJkLCBkZXNjciwgc2tiKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVycm9yOworCisJY2FyZC0+dHhfY2hhaW4uaGVhZCA9IGNhcmQtPnR4X2NoYWluLmhlYWQtPm5leHQ7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHN0YXR1cyBmcm9tIHNwaWRlcl9uZXRfcHJlcGFyZV90eF9kZXNjciBpcyBpbgorCSAqIG1lbW9yeSBiZWZvcmUgd2UgY2hlY2sgb3V0IHRoZSBwcmV2aW91cyBkZXNjcmlwdG9yICovCisJd21iKCk7CisKKwlpZiAoc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLT5wcmV2KSAhPQorCSAgICBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRCkKKwkJc3BpZGVyX25ldF9raWNrX3R4X2RtYShjYXJkLCBkZXNjcik7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitlcnJvcjoKKwljYXJkLT5uZXRkZXZfc3RhdHMudHhfZHJvcHBlZCsrOworCXJldHVybiBORVRERVZfVFhfTE9DS0VEOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZG9faW9jdGwgLSBjYWxsZWQgZm9yIGRldmljZSBpb2N0bHMKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaWZyOiByZXF1ZXN0IHBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIGlvY3RsCisgKiBAY21kOiBjb21tYW5kIGNvZGUgZm9yIGlvY3RsCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuIEN1cnJlbnRseSwgd2UgaGF2ZSBubyBzcGVjaWFsIGlvY3Rscy4KKyAqIC1FT1BOT1RTVVBQIGlzIHJldHVybmVkLCBpZiBhbiB1bmtub3duIGlvY3RsIHdhcyByZXF1ZXN0ZWQKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9wYXNzX3NrYl91cCAtIHRha2VzIGFuIHNrYiBmcm9tIGEgZGVzY3JpcHRvciBhbmQgcGFzc2VzIGl0IG9uCisgKiBAZGVzY3I6IGRlc2NyaXB0b3IgdG8gcHJvY2VzcworICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgaWYgbm8gcGFja2V0IHdhcyBwYXNzZWQgdG8gdGhlIHN0YWNrCisgKgorICogaW9tbXUtdW5tYXBzIHRoZSBza2IsIGZpbGxzIG91dCBza2Igc3RydWN0dXJlIGFuZCBwYXNzZXMgdGhlIGRhdGEgdG8gdGhlCisgKiBzdGFjay4gVGhlIGRlc2NyaXB0b3Igc3RhdGUgaXMgbm90IGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfcGFzc19za2JfdXAoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyLAorCQkgICAgICAgc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJdTMyIGRhdGFfc3RhdHVzLCBkYXRhX2Vycm9yOworCisJZGF0YV9zdGF0dXMgPSBkZXNjci0+ZGF0YV9zdGF0dXM7CisJZGF0YV9lcnJvciA9IGRlc2NyLT5kYXRhX2Vycm9yOworCisJbmV0ZGV2ID0gY2FyZC0+bmV0ZGV2OworCisJLyogY2hlY2sgZm9yIGVycm9ycyBpbiB0aGUgZGF0YV9lcnJvciBmbGFnICovCisJaWYgKChkYXRhX2Vycm9yICYgU1BJREVSX05FVF9EQVRBX0VSUk9SX01BU0spICYmCisJICAgIG5ldGlmX21zZ19yeF9lcnIoY2FyZCkpCisJCXByX2VycigiZXJyb3IgaW4gcmVjZWl2ZWQgZGVzY3JpcHRvciBmb3VuZCwgIgorCQkgICAgICAgImRhdGFfc3RhdHVzPXglMDh4LCBkYXRhX2Vycm9yPXglMDh4XG4iLAorCQkgICAgICAgZGF0YV9zdGF0dXMsIGRhdGFfZXJyb3IpOworCisJLyogcHJlcGFyZSBza2IsIHVubWFwIGRlc2NyaXB0b3IgKi8KKwlza2IgPSBkZXNjci0+c2tiOworCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGRldiwgZGVzY3ItPmJ1Zl9hZGRyLCBTUElERVJfTkVUX01BWF9NVFUsCisJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCS8qIHRoZSBjYXNlcyB3ZSdsbCB0aHJvdyBhd2F5IHRoZSBwYWNrZXQgaW1tZWRpYXRlbHkgKi8KKwlpZiAoZGF0YV9lcnJvciAmIFNQSURFUl9ORVRfREVTVFJPWV9SWF9GTEFHUykKKwkJcmV0dXJuIDA7CisKKwlza2ItPmRldiA9IG5ldGRldjsKKwlza2JfcHV0KHNrYiwgZGVzY3ItPnZhbGlkX3NpemUpOworCisJLyogdGhlIGNhcmQgc2VlbXMgdG8gYWRkIDIgYnl0ZXMgb2YganVuayBpbiBmcm9udAorCSAqIG9mIHRoZSBldGhlcm5ldCBmcmFtZSAqLworI2RlZmluZSBTUElERVJfTUlTQUxJR04JCTIKKwlza2JfcHVsbChza2IsIFNQSURFUl9NSVNBTElHTik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKKworCS8qIGNoZWNrc3VtIG9mZmxvYWQgKi8KKwlpZiAoY2FyZC0+b3B0aW9ucy5yeF9jc3VtKSB7CisJCWlmICggKGRhdGFfc3RhdHVzICYgU1BJREVSX05FVF9EQVRBX1NUQVRVU19DSEtfTUFTSykgJiYKKwkJICAgICAoIShkYXRhX2Vycm9yICYgU1BJREVSX05FVF9EQVRBX0VSUk9SX0NIS19NQVNLKSkgKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJZWxzZQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0gZWxzZSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwl9CisKKwlpZiAoZGF0YV9zdGF0dXMgJiBTUElERVJfTkVUX1ZMQU5fUEFDS0VUKSB7CisJCS8qIGZ1cnRoZXIgZW5oYW5jZW1lbnRzOiBIVy1hY2NlbCBWTEFOCisJCSAqIHZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYgorCQkgKi8KKwl9CisKKwkvKiBwYXNzIHNrYiB1cCB0byBzdGFjayAqLworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwkvKiB1cGRhdGUgbmV0ZGV2aWNlIHN0YXRpc3RpY3MgKi8KKwljYXJkLT5uZXRkZXZfc3RhdHMucnhfcGFja2V0cysrOworCWNhcmQtPm5ldGRldl9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZGVjb2RlX2Rlc2NyIC0gcHJvY2Vzc2VzIGFuIHJ4IGRlc2NyaXB0b3IKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgMSBpZiBhIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvIHRoZSBzdGFjaywgb3RoZXJ3aXNlIDAKKyAqCisgKiBwcm9jZXNzZXMgYW4gcnggZGVzY3JpcHRvciBieSBpb21tdS11bm1hcHBpbmcgdGhlIGRhdGEgYnVmZmVyIGFuZCBwYXNzaW5nCisgKiB0aGUgcGFja2V0IHVwIHRvIHRoZSBzdGFjaworICovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X2RlY29kZV9vbmVfZGVzY3Ioc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwllbnVtIHNwaWRlcl9uZXRfZGVzY3Jfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CisJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gKmNoYWluOworCWludCByZXN1bHQ7CisKKwljaGFpbiA9ICZjYXJkLT5yeF9jaGFpbjsKKwlkZXNjciA9IGNoYWluLT50YWlsOworCisJc3RhdHVzID0gc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGRlc2NyKTsKKworCWlmIChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9DQVJET1dORUQpIHsKKwkJLyogbm90aGluZyBpbiB0aGUgZGVzY3JpcHRvciB5ZXQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpIHsKKwkJLyogbm90IGluaXRpYWxpemVkIHlldCwgSSBiZXQgY2hhaW4tPnRhaWwgPT0gY2hhaW4tPmhlYWQKKwkJICogYW5kIHRoZSByaW5nIGlzIGVtcHR5ICovCisJCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkZXNjcmlwdG9yIGRlZmluaXRpdmVseSB1c2VkIC0tIG1vdmUgb24gaGVhZCAqLworCWNoYWluLT50YWlsID0gZGVzY3ItPm5leHQ7CisKKwlyZXN1bHQgPSAwOworCWlmICggKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX1JFU1BPTlNFX0VSUk9SKSB8fAorCSAgICAgKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX1BST1RFQ1RJT05fRVJST1IpIHx8CisJICAgICAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfRk9SQ0VfRU5EKSApIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoY2FyZCkpCisJCQlwcl9lcnIoIiVzOiBkcm9wcGluZyBSWCBkZXNjcmlwdG9yIHdpdGggc3RhdGUgJWRcbiIsCisJCQkgICAgICAgY2FyZC0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworCQljYXJkLT5uZXRkZXZfc3RhdHMucnhfZHJvcHBlZCsrOworCQlnb3RvIHJlZmlsbDsKKwl9CisKKwlpZiAoIChzdGF0dXMgIT0gU1BJREVSX05FVF9ERVNDUl9DT01QTEVURSkgJiYKKwkgICAgIChzdGF0dXMgIT0gU1BJREVSX05FVF9ERVNDUl9GUkFNRV9FTkQpICkgeworCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSkKKwkJCXByX2VycigiJXM6IFJYIGRlc2NyaXB0b3Igd2l0aCBzdGF0ZSAlZFxuIiwKKwkJCSAgICAgICBjYXJkLT5uZXRkZXYtPm5hbWUsIHN0YXR1cyk7CisJCWdvdG8gcmVmaWxsOworCX0KKworCS8qIG9rLCB3ZSd2ZSBnb3QgYSBwYWNrZXQgaW4gZGVzY3IgKi8KKwlyZXN1bHQgPSBzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwKGRlc2NyLCBjYXJkKTsKK3JlZmlsbDoKKwlzcGlkZXJfbmV0X3NldF9kZXNjcl9zdGF0dXMoZGVzY3IsIFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSk7CisJLyogY2hhbmdlIHRoZSBkZXNjcmlwdG9yIHN0YXRlOiAqLworCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3BvbGwgLSBOQVBJIHBvbGwgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBzdGFjayB0byByZXR1cm4gcGFja2V0cworICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWRnZXQ6IG51bWJlciBvZiBwYWNrZXRzIHdlIGNhbiBwYXNzIHRvIHRoZSBzdGFjayBhdCBtb3N0CisgKgorICogcmV0dXJucyAwIGlmIG5vIG1vcmUgcGFja2V0cyBhdmFpbGFibGUgdG8gdGhlIGRyaXZlci9zdGFjay4gUmV0dXJucyAxLAorICogaWYgdGhlIHF1b3RhIGlzIGV4Y2VlZGVkLCBidXQgdGhlIGRyaXZlciBoYXMgc3RpbGwgcGFja2V0cy4KKyAqCisgKiBzcGlkZXJfbmV0X3BvbGwgcmV0dXJucyBhbGwgcGFja2V0cyBmcm9tIHRoZSByeCBkZXNjcmlwdG9ycyB0byB0aGUgc3RhY2sKKyAqICh1c2luZyBuZXRpZl9yZWNlaXZlX3NrYikuIElmIGFsbC9lbm91Z2ggcGFja2V0cyBhcmUgdXAsIHRoZSBkcml2ZXIKKyAqIHJlZW5hYmxlcyBpbnRlcnJ1cHRzIGFuZCByZXR1cm5zIDAuIElmIG5vdCwgMSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBwYWNrZXRzX3RvX2RvLCBwYWNrZXRzX2RvbmUgPSAwOworCWludCBub19tb3JlX3BhY2tldHMgPSAwOworCisJcGFja2V0c190b19kbyA9IG1pbigqYnVkZ2V0LCBuZXRkZXYtPnF1b3RhKTsKKworCXdoaWxlIChwYWNrZXRzX3RvX2RvKSB7CisJCWlmIChzcGlkZXJfbmV0X2RlY29kZV9vbmVfZGVzY3IoY2FyZCkpIHsKKwkJCXBhY2tldHNfZG9uZSsrOworCQkJcGFja2V0c190b19kby0tOworCQl9IGVsc2UgeworCQkJLyogbm8gbW9yZSBwYWNrZXRzIGZvciB0aGUgc3RhY2sgKi8KKwkJCW5vX21vcmVfcGFja2V0cyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCW5ldGRldi0+cXVvdGEgLT0gcGFja2V0c19kb25lOworCSpidWRnZXQgLT0gcGFja2V0c19kb25lOworCisJLyogaWYgYWxsIHBhY2tldHMgYXJlIGluIHRoZSBzdGFjaywgZW5hYmxlIGludGVycnVwdHMgYW5kIHJldHVybiAwICovCisJLyogaWYgbm90LCByZXR1cm4gMSAqLworCWlmIChub19tb3JlX3BhY2tldHMpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJc3BpZGVyX25ldF9yeF9pcnFfb24oY2FyZCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfdmxhbl9yeF9yZWcgLSBpbml0aWFsaXplcyBWTEFOIHN0cnVjdHVyZXMgaW4gdGhlIGRyaXZlciBhbmQgY2FyZAorICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBncnA6IHZsYW5fZ3JvdXAgc3RydWN0dXJlIHRoYXQgaXMgcmVnaXN0ZXJlZCAoTlVMTCBvbiBkZXN0cm95aW5nIGludGVyZmFjZSkKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfdmxhbl9yeF9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwkvKiBmdXJ0aGVyIGVuaGFuY2VtZW50Li4uIHlldCB0byBkbyAqLworCXJldHVybjsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3ZsYW5fcnhfYWRkIC0gYWRkcyBWTEFOIGlkIHRvIHRoZSBjYXJkIGZpbHRlcgorICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB2aWQ6IFZMQU4gaWQgdG8gYWRkCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3ZsYW5fcnhfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCkKK3sKKwkvKiBmdXJ0aGVyIGVuaGFuY2VtZW50Li4uIHlldCB0byBkbyAqLworCS8qIGFkZCB2aWQgdG8gY2FyZCdzIFZMQU4gZmlsdGVyIHRhYmxlICovCisJcmV0dXJuOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfdmxhbl9yeF9raWxsIC0gcmVtb3ZlcyBWTEFOIGlkIHRvIHRoZSBjYXJkIGZpbHRlcgorICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB2aWQ6IFZMQU4gaWQgdG8gcmVtb3ZlCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3ZsYW5fcnhfa2lsbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCB2aWQpCit7CisJLyogZnVydGhlciBlbmhhbmNlbWVudC4uLiB5ZXQgdG8gZG8gKi8KKwkvKiByZW1vdmUgdmlkIGZyb20gY2FyZCdzIFZMQU4gZmlsdGVyIHRhYmxlICovCit9CisKKy8qKgorICogc3BpZGVyX25ldF9nZXRfc3RhdHMgLSBnZXQgaW50ZXJmYWNlIHN0YXRpc3RpY3MKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyB0aGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MgcmVzaWRpbmcgaW4gdGhlIHNwaWRlcl9uZXRfY2FyZCBzdHJ1Y3QKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3NwaWRlcl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmNhcmQtPm5ldGRldl9zdGF0czsKKwlyZXR1cm4gc3RhdHM7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9jaGFuZ2VfbXR1IC0gY2hhbmdlcyB0aGUgTVRVIG9mIGFuIGludGVyZmFjZQorICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfbXR1OiBuZXcgTVRVIHZhbHVlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorc3BpZGVyX25ldF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCS8qIG5vIG5lZWQgdG8gcmUtYWxsb2Mgc2ticyBvciBzbyAtLSB0aGUgbWF4IG10dSBpcyBhYm91dCAyLjNrCisJICogYW5kIG10dSBpcyBvdXRib3VuZCBvbmx5IGFueXdheSAqLworCWlmICggKG5ld19tdHUgPCBTUElERVJfTkVUX01JTl9NVFUgKSB8fAorCQkobmV3X210dSA+IFNQSURFUl9ORVRfTUFYX01UVSkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9zZXRfbWFjIC0gc2V0cyB0aGUgTUFDIG9mIGFuIGludGVyZmFjZQorICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwdHI6IHBvaW50ZXIgdG8gbmV3IE1BQyBhZGRyZXNzCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuIEN1cnJlbnRseSwgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzCisgKiBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIEVPUE5PVFNVUFAuCisgKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiBtYWNsLCBtYWN1LCByZWd2YWx1ZTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwkvKiBzd2l0Y2ggb2ZmIEdNQUNUUEUgYW5kIEdNQUNSUEUgKi8KKwlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDT1BFTUQpOworCXJlZ3ZhbHVlICY9IH4oKDEgPDwgNSkgfCAoMSA8PCA2KSk7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDT1BFTUQsIHJlZ3ZhbHVlKTsKKworCS8qIHdyaXRlIG1hYyAqLworCW1hY3UgPSAoYWRkci0+c2FfZGF0YVswXTw8MjQpICsgKGFkZHItPnNhX2RhdGFbMV08PDE2KSArCisJCShhZGRyLT5zYV9kYXRhWzJdPDw4KSArIChhZGRyLT5zYV9kYXRhWzNdKTsKKwltYWNsID0gKGFkZHItPnNhX2RhdGFbNF08PDgpICsgKGFkZHItPnNhX2RhdGFbNV0pOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ1VOSU1BQ1UsIG1hY3UpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ1VOSU1BQ0wsIG1hY2wpOworCisJLyogc3dpdGNoIEdNQUNUUEUgYW5kIEdNQUNSUEUgYmFjayBvbiAqLworCXJlZ3ZhbHVlID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNQUNPUEVNRCk7CisJcmVndmFsdWUgfD0gKCgxIDw8IDUpIHwgKDEgPDwgNikpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR01BQ09QRU1ELCByZWd2YWx1ZSk7CisKKwlzcGlkZXJfbmV0X3NldF9wcm9taXNjKGNhcmQpOworCisJLyogbG9vayB1cCwgd2hldGhlciB3ZSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bCAqLworCWlmIChzcGlkZXJfbmV0X2dldF9tYWNfYWRkcmVzcyhuZXRkZXYpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJaWYgKG1lbWNtcChuZXRkZXYtPmRldl9hZGRyLGFkZHItPnNhX2RhdGEsbmV0ZGV2LT5hZGRyX2xlbikpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3R4ZG1hYyAtIGVuYWJsZXMgYSBUWCBETUEgY29udHJvbGxlcgorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogc3BpZGVyX25ldF9lbmFibGVfdHhkbWFjIGVuYWJsZXMgdGhlIFRYIERNQSBjb250cm9sbGVyIGJ5IHNldHRpbmcgdGhlCisgKiBkZXNjcmlwdG9yIGNoYWluIHRhaWwgYWRkcmVzcworICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9lbmFibGVfdHhkbWFjKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJLyogYXNzdW1lIGNoYWluIGlzIGFsaWduZWQgY29ycmVjdGx5ICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFREQ0hBLAorCQkJICAgICBjYXJkLT50eF9jaGFpbi50YWlsLT5idXNfYWRkcik7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9oYW5kbGVfZXJyb3JfaXJxIC0gaGFuZGxlcyBlcnJvcnMgcmFpc2VkIGJ5IGFuIGludGVycnVwdAorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAc3RhdHVzX3JlZzogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAwIChHSElJTlQwU1RTKQorICoKKyAqIHNwaWRlcl9uZXRfaGFuZGxlX2Vycm9yX2lycSB0cmVhdHMgb3IgaWdub3JlcyBhbGwgZXJyb3IgY29uZGl0aW9ucworICogZm91bmQgd2hlbiBhbiBpbnRlcnJ1cHQgaXMgcHJlc2VudGVkCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2hhbmRsZV9lcnJvcl9pcnEoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwgdTMyIHN0YXR1c19yZWcpCit7CisJdTMyIGVycm9yX3JlZzEsIGVycm9yX3JlZzI7CisJdTMyIGk7CisJaW50IHNob3dfZXJyb3IgPSAxOworCisJZXJyb3JfcmVnMSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQxU1RTKTsKKwllcnJvcl9yZWcyID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDJTVFMpOworCisJLyogY2hlY2sgR0hJSU5UMFNUUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKHN0YXR1c19yZWcpCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkJaWYgKHN0YXR1c19yZWcgJiAoMTw8aSkpCisJCQkJc3dpdGNoIChpKQorCXsKKwkvKiBsZXQgZXJyb3JfcmVnMSBhbmQgZXJyb3JfcmVnMiBldmFsdWF0aW9uIGRlY2lkZSwgd2hhdCB0byBkbworCWNhc2UgU1BJREVSX05FVF9QSFlJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQUMySU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUFDMUlOVDoKKwljYXNlIFNQSURFUl9ORVRfR0lQU0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR0ZJRk9JTlQ6CisJY2FzZSBTUElERVJfTkVUX0RNQUNJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dTWVNJTlQ6CisJCWJyZWFrOyAqLworCisJY2FzZSBTUElERVJfTkVUX0dQV09QQ01QSU5UOgorCQkvKiBQSFkgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlZCAqLworCQlzaG93X2Vycm9yID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTUElERVJfTkVUX0dQUk9QQ01QSU5UOgorCQkvKiBQSFkgcmVhZCBvcGVyYXRpb24gY29tcGxldGVkICovCisJCS8qIHdlIGRvbid0IHVzZSBzZW1hcGhvcmVzLCBhcyB3ZSBwb2xsIGZvciB0aGUgY29tcGxldGlvbgorCQkgKiBvZiB0aGUgcmVhZCBvcGVyYXRpb24gaW4gc3BpZGVyX25ldF9yZWFkX3BoeS4gU2hvdWxkIHRha2UKKwkJICogYWJvdXQgNTAgdXMgKi8KKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCWNhc2UgU1BJREVSX05FVF9HUFdGRklOVDoKKwkJLyogUEhZIGNvbW1hbmQgcXVldWUgZnVsbCAqLworCQlpZiAobmV0aWZfbXNnX2ludHIoY2FyZCkpCisJCQlwcl9lcnIoIlBIWSB3cml0ZSBxdWV1ZSBmdWxsXG4iKTsKKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCisJLyogY2FzZSBTUElERVJfTkVUX0dSTURBRFJJTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR1JNQVJQSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dSTU1QSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisKKwljYXNlIFNQSURFUl9ORVRfR0RUREVOMElOVDoKKwkJLyogc29tZW9uZSBoYXMgc2V0IFRYX0RNQV9FTiB0byAwICovCisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKworCWNhc2UgU1BJREVSX05FVF9HRERERU4wSU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HRENERU4wSU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HREJERU4wSU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HREFERU4wSU5UOgorCQkvKiBzb21lb25lIGhhcyBzZXQgUlhfRE1BX0VOIHRvIDAgKi8KKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCisJLyogUlggaW50ZXJydXB0cyAqLworCWNhc2UgU1BJREVSX05FVF9HRERGRENJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dEQ0ZEQ0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR0RCRkRDSU5UOgorCWNhc2UgU1BJREVSX05FVF9HREFGRENJTlQ6CisJLyogY2FzZSBTUElERVJfTkVUX0dETk1JTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0NOTUlOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HQk5NSU5UOiBub3QgdXNlZC4gcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dBTk1JTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR1JGTk1JTlQ6IG5vdCB1c2VkLiBwcmludCBhIG1lc3NhZ2UgKi8KKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCisJLyogVFggaW50ZXJydXB0cyAqLworCWNhc2UgU1BJREVSX05FVF9HRFRGRENJTlQ6CisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKwljYXNlIFNQSURFUl9ORVRfR1RURURJTlQ6CisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKwljYXNlIFNQSURFUl9ORVRfR0RURENFSU5UOgorCQkvKiBjaGFpbiBlbmQuIElmIGEgZGVzY3JpcHRvciBzaG91bGQgYmUgc2VudCwga2ljayBvZmYKKwkJICogdHggZG1hCisJCWlmIChjYXJkLT50eF9jaGFpbi50YWlsID09IGNhcmQtPnR4X2NoYWluLmhlYWQpCisJCQlzcGlkZXJfbmV0X2tpY2tfdHhfZG1hKGNhcmQpOworCQlzaG93X2Vycm9yID0gMDsgKi8KKwkJYnJlYWs7CisKKwkvKiBjYXNlIFNQSURFUl9ORVRfRzFUTUNOVElOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HRlJFRUNOVElOVDogbm90IHVzZWQuIHByaW50IGEgbWVzc2FnZSAqLworCX0KKworCS8qIGNoZWNrIEdISUlOVDFTVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChlcnJvcl9yZWcxKQorCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCWlmIChlcnJvcl9yZWcxICYgKDE8PGkpKQorCQkJCXN3aXRjaCAoaSkKKwl7CisJY2FzZSBTUElERVJfTkVUX0dUTUZMTElOVDoKKwkJaWYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKQorCQkJcHJfZXJyKCJTcGlkZXIgVFggUkFNIGZ1bGxcbiIpOworCQlzaG93X2Vycm9yID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTUElERVJfTkVUX0dSTUZMTElOVDoKKwkJaWYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKQorCQkJcHJfZXJyKCJTcGlkZXIgUlggUkFNIGZ1bGwsIGluY29taW5nIHBhY2tldHMgIgorCQkJICAgICAgICJtaWdodCBiZSBkaXNjYXJkZWQgIVxuIik7CisJCW5ldGlmX3J4X3NjaGVkdWxlKGNhcmQtPm5ldGRldik7CisJCXNwaWRlcl9uZXRfZW5hYmxlX3J4Y2h0YWlscyhjYXJkKTsKKwkJc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOworCQlicmVhazsKKworCS8qIGNhc2UgU1BJREVSX05FVF9HVE1TSFRJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCWNhc2UgU1BJREVSX05FVF9HRFRJTlZESU5UOgorCQkvKiBhbGxyaWdodHkuIHR4IGZyb20gcHJldmlvdXMgZGVzY3Igb2sgKi8KKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCS8qIGNhc2UgU1BJREVSX05FVF9HUkZERkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HUkZDRkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HUkZCRkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HUkZBRkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLworCisJLyogY2hhaW4gZW5kICovCisJY2FzZSBTUElERVJfTkVUX0dERERDRUlOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR0RDRENFSU5UOiAvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU1BJREVSX05FVF9HREJEQ0VJTlQ6IC8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTUElERVJfTkVUX0dEQURDRUlOVDoKKwkJaWYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKQorCQkJcHJfZXJyKCJnb3QgZGVzY3JpcHRvciBjaGFpbiBlbmQgaW50ZXJydXB0LCAiCisJCQkgICAgICAgInJlc3RhcnRpbmcgRE1BQyAlYy5cbiIsCisJCQkgICAgICAgJ0QnK2ktU1BJREVSX05FVF9HREREQ0VJTlQpOworCQlzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbihjYXJkKTsKKwkJc2hvd19lcnJvciA9IDA7CisJCWJyZWFrOworCisJLyogaW52YWxpZCBkZXNjcmlwdG9yICovCisJY2FzZSBTUElERVJfTkVUX0dERElOVkRJTlQ6IC8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTUElERVJfTkVUX0dEQ0lOVkRJTlQ6IC8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTUElERVJfTkVUX0dEQklOVkRJTlQ6IC8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTUElERVJfTkVUX0dEQUlOVkRJTlQ6CisJCS8qIGNvdWxkIGhhcHBlbiB3aGVuIHJ4IGNoYWluIGlzIGZ1bGwgKi8KKwkJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7CisJCXNob3dfZXJyb3IgPSAwOworCQlicmVhazsKKworCS8qIGNhc2UgU1BJREVSX05FVF9HRFRSU0VSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0REUlNFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dEQ1JTRVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HREJSU0VSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0RBUlNFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dEU0VSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0RUUFRFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dERFBURVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCS8qIGNhc2UgU1BJREVSX05FVF9HRENQVEVSSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KKwkvKiBjYXNlIFNQSURFUl9ORVRfR0RCUFRFUklOVDogcHJvYmxlbSwgcHJpbnQgYSBtZXNzYWdlICovCisJLyogY2FzZSBTUElERVJfTkVUX0dEQVBURVJJTlQ6IHByb2JsZW0sIHByaW50IGEgbWVzc2FnZSAqLworCWRlZmF1bHQ6CisJCXNob3dfZXJyb3IgPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBjaGVjayBHSElJTlQyU1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoZXJyb3JfcmVnMikKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlpZiAoZXJyb3JfcmVnMiAmICgxPDxpKSkKKwkJCQlzd2l0Y2ggKGkpCisJeworCS8qIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuICh3YW50ICB0bykgZG8gYXQgdGhpcyB0aW1lLiBMb2cgYQorCSAqIG1lc3NhZ2UsIHdlIGNhbiBzd2l0Y2ggb24gYW5kIG9mZiB0aGUgc3BlY2lmaWMgdmFsdWVzIGxhdGVyIG9uCisJY2FzZSBTUElERVJfTkVUX0dQUk9QRVJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1RDUlNOR0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR01DVExDT0xJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1RUTU9USU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNSQ0FFUklOVDoKKwljYXNlIFNQSURFUl9ORVRfR01DUkNBTEVSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HTUNSQUxORVJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1JPVlJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1JSTlRJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dNQ1JSWEVSSU5UOgorCWNhc2UgU1BJREVSX05FVF9HVElUQ1NFUklOVDoKKwljYXNlIFNQSURFUl9ORVRfR1RJRk1URVJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dUSVBLVFJWS0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR1RJU1BJTkdJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dUSVNBRE5HSU5UOgorCWNhc2UgU1BJREVSX05FVF9HVElTUEROR0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR1JJRk1URVJJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dSSVBLVFJWS0lOVDoKKwljYXNlIFNQSURFUl9ORVRfR1JJU1BJTkdJTlQ6CisJY2FzZSBTUElERVJfTkVUX0dSSVNBRE5HSU5UOgorCWNhc2UgU1BJREVSX05FVF9HUklTUEROR0lOVDoKKwkJYnJlYWs7CisJKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCWlmICgoc2hvd19lcnJvcikgJiYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKSkKKwkJcHJfZXJyKCJHb3QgZXJyb3IgaW50ZXJydXB0LCBHSElJTlQwU1RTID0gMHglMDh4LCAiCisJCSAgICAgICAiR0hJSU5UMVNUUyA9IDB4JTA4eCwgR0hJSU5UMlNUUyA9IDB4JTA4eFxuIiwKKwkJICAgICAgIHN0YXR1c19yZWcsIGVycm9yX3JlZzEsIGVycm9yX3JlZzIpOworCisJLyogY2xlYXIgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDFTVFMsIGVycm9yX3JlZzEpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMlNUUywgZXJyb3JfcmVnMik7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9pbnRlcnJ1cHQgLSBpbnRlcnJ1cHQgaGFuZGxlciBmb3Igc3BpZGVyX25ldAorICogQGlycTogaW50ZXJ1cHQgbnVtYmVyCisgKiBAcHRyOiBwb2ludGVyIHRvIG5ldF9kZXZpY2UKKyAqIEByZWdzOiBQVSByZWdpc3RlcnMKKyAqCisgKiByZXR1cm5zIElSUV9IQU5ETEVELCBpZiBpbnRlcnJ1cHQgd2FzIGZvciBkcml2ZXIsIG9yIElSUV9OT05FLCBpZiBubworICogaW50ZXJydXB0IGZvdW5kIHJhaXNlZCBieSBjYXJkLgorICoKKyAqIFRoaXMgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB0aGF0IHR1cm5zIG9mZgorICogaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UgYW5kIG1ha2VzIHRoZSBzdGFjayBwb2xsIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIGlycXJldHVybl90CitzcGlkZXJfbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwdHI7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHN0YXR1c19yZWc7CisKKwlzdGF0dXNfcmVnID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBTVFMpOworCisJaWYgKCFzdGF0dXNfcmVnKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAoc3RhdHVzX3JlZyAmIFNQSURFUl9ORVRfVFhJTlQpCisJCXNwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbihjYXJkLCAwKTsKKworCWlmIChzdGF0dXNfcmVnICYgU1BJREVSX05FVF9SWElOVCApIHsKKwkJc3BpZGVyX25ldF9yeF9pcnFfb2ZmKGNhcmQpOworCQluZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCX0KKworCS8qIHdlIGRvIHRoaXMgYWZ0ZXIgcnggYW5kIHR4IHByb2Nlc3NpbmcsIGFzIHdlIHdhbnQgdGhlIHR4IGNoYWluCisJICogcHJvY2Vzc2VkIHRvIHNlZSwgd2hldGhlciB3ZSBzaG91bGQgcmVzdGFydCB0eCBkbWEgcHJvY2Vzc2luZyAqLworCXNwaWRlcl9uZXRfaGFuZGxlX2Vycm9yX2lycShjYXJkLCBzdGF0dXNfcmVnKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzb3VyY2VzICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwU1RTLCBzdGF0dXNfcmVnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKioKKyAqIHNwaWRlcl9uZXRfcG9sbF9jb250cm9sbGVyIC0gYXJ0aWZpY2lhbCBpbnRlcnJ1cHQgZm9yIG5ldGNvbnNvbGUgZXRjLgorICogQG5ldGRldjogaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0CisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCWRpc2FibGVfaXJxKG5ldGRldi0+aXJxKTsKKwlzcGlkZXJfbmV0X2ludGVycnVwdChuZXRkZXYtPmlycSwgbmV0ZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKG5ldGRldi0+aXJxKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiAqLworCisvKioKKyAqIHNwaWRlcl9uZXRfaW5pdF9jYXJkIC0gaW5pdGlhbGl6ZXMgdGhlIGNhcmQKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfaW5pdF9jYXJkIGluaXRpYWxpemVzIHRoZSBjYXJkIHNvIHRoYXQgb3RoZXIgcmVnaXN0ZXJzIGNhbgorICogYmUgdXNlZAorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9pbml0X2NhcmQoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0NLUkNUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9TVE9QX1ZBTFVFKTsKKworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfQ0tSQ1RSTCwKKwkJCSAgICAgU1BJREVSX05FVF9DS1JDVFJMX1JVTl9WQUxVRSk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9lbmFibGVfY2FyZCAtIGVuYWJsZXMgdGhlIGNhcmQgYnkgc2V0dGluZyBhbGwga2luZHMgb2YgcmVncworICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogc3BpZGVyX25ldF9lbmFibGVfY2FyZCBzZXRzIGEgbG90IG9mIFNNTUlPIHJlZ2lzdGVycyB0byBlbmFibGUgdGhlIGRldmljZQorICovCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9lbmFibGVfY2FyZChzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCWludCBpOworCS8qIHRoZSBmb2xsb3dpbmcgYXJyYXkgY29uc2lzdHMgb2YgKHJlZ2lzdGVyKSwodmFsdWUpIHBhaXJzCisJICogdGhhdCBhcmUgc2V0IGluIHRoaXMgZnVuY3Rpb24uIEEgcmVnaXN0ZXIgb2YgMCBlbmRzIHRoZSBsaXN0ICovCisJdTMyIHJlZ3NbXVsyXSA9IHsKKwkJeyBTUElERVJfTkVUX0dSRVNVTUlOVE5VTSwgMCB9LAorCQl7IFNQSURFUl9ORVRfR1JFSU5UTlVNLCAwIH0sCisKKwkJLyogc2V0IGludGVycnVwdCBmcmFtZSBudW1iZXIgcmVnaXN0ZXJzICovCisJCS8qIGNsZWFyIHRoZSBzaW5nbGUgRE1BIGVuZ2luZSByZWdpc3RlcnMgZmlyc3QgKi8KKwkJeyBTUElERVJfTkVUX0dGQUZSTU5VTSwgU1BJREVSX05FVF9HRlhGUkFNRVNfVkFMVUUgfSwKKwkJeyBTUElERVJfTkVUX0dGQkZSTU5VTSwgU1BJREVSX05FVF9HRlhGUkFNRVNfVkFMVUUgfSwKKwkJeyBTUElERVJfTkVUX0dGQ0ZSTU5VTSwgU1BJREVSX05FVF9HRlhGUkFNRVNfVkFMVUUgfSwKKwkJeyBTUElERVJfTkVUX0dGREZSTU5VTSwgU1BJREVSX05FVF9HRlhGUkFNRVNfVkFMVUUgfSwKKwkJLyogdGhlbiBzZXQsIHdoYXQgd2UgcmVhbGx5IG5lZWQgKi8KKwkJeyBTUElERVJfTkVUX0dGRlJNTlVNLCBTUElERVJfTkVUX0ZSQU1FTlVNX1ZBTFVFIH0sCisKKwkJLyogdGltZXIgY291bnRlciByZWdpc3RlcnMgYW5kIHN0dWZmICovCisJCXsgU1BJREVSX05FVF9HRlJFRUNOTlVNLCAwIH0sCisJCXsgU1BJREVSX05FVF9HT05FVElNRU5VTSwgMCB9LAorCQl7IFNQSURFUl9ORVRfR1RPVVRGUk1OVU0sIDAgfSwKKworCQkvKiBSWCBtb2RlIHNldHRpbmcgKi8KKwkJeyBTUElERVJfTkVUX0dSWE1EU0VULCBTUElERVJfTkVUX1JYTU9ERV9WQUxVRSB9LAorCQkvKiBUWCBtb2RlIHNldHRpbmcgKi8KKwkJeyBTUElERVJfTkVUX0dUWE1EU0VULCBTUElERVJfTkVUX1RYTU9ERV9WQUxVRSB9LAorCQkvKiBJUFNFQyBtb2RlIHNldHRpbmcgKi8KKwkJeyBTUElERVJfTkVUX0dJUFNFQ0lOSVQsIFNQSURFUl9ORVRfSVBTRUNJTklUX1ZBTFVFIH0sCisKKwkJeyBTUElERVJfTkVUX0dGVFJFU1RSVCwgU1BJREVSX05FVF9SRVNUQVJUX1ZBTFVFIH0sCisKKwkJeyBTUElERVJfTkVUX0dNUldPTENUUkwsIDAgfSwKKwkJeyBTUElERVJfTkVUX0dURVNUTUQsIDAgfSwKKworCQl7IFNQSURFUl9ORVRfR01BQ0lOVEVOLCAwIH0sCisKKwkJLyogZmxvdyBjb250cm9sIHN0dWZmICovCisJCXsgU1BJREVSX05FVF9HTUFDQVBBVVNFLCBTUElERVJfTkVUX01BQ0FQQVVTRV9WQUxVRSB9LAorCQl7IFNQSURFUl9ORVRfR01BQ1RYUEFVU0UsIFNQSURFUl9ORVRfVFhQQVVTRV9WQUxVRSB9LAorCisJCXsgU1BJREVSX05FVF9HTUFDQlNUTE1ULCBTUElERVJfTkVUX0JVUlNUTE1UX1ZBTFVFIH0sCisJCXsgMCwgMH0KKwl9OworCisJaSA9IDA7CisJd2hpbGUgKHJlZ3NbaV1bMF0pIHsKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgcmVnc1tpXVswXSwgcmVnc1tpXVsxXSk7CisJCWkrKzsKKwl9CisKKwkvKiBjbGVhciB1bmljYXN0IGZpbHRlciB0YWJsZSBlbnRyaWVzIDEgdG8gMTQgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IDE0OyBpKyspIHsKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwKKwkJCQkgICAgIFNQSURFUl9ORVRfR01SVUFGSUxuUiArIGkgKiA4LAorCQkJCSAgICAgMHgwMDA4MDAwMCk7CisJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsCisJCQkJICAgICBTUElERVJfTkVUX0dNUlVBRklMblIgKyBpICogOCArIDQsCisJCQkJICAgICAweDAwMDAwMDAwKTsKKwl9CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNUlVBMEZJTDE1UiwgMHgwODA4MDAwMCk7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0VDTU9ERSwgU1BJREVSX05FVF9FQ01PREVfVkFMVUUpOworCisJLyogc2V0IGNoYWluIHRhaWwgYWRyZXNzIGZvciBSWCBjaGFpbnMgYW5kCisJICogZW5hYmxlIERNQSAqLworCXNwaWRlcl9uZXRfZW5hYmxlX3J4Y2h0YWlscyhjYXJkKTsKKwlzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoY2FyZCk7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dSWERNQUVOLCBTUElERVJfTkVUX1dPTF9WQUxVRSk7CisKKwkvKiBzZXQgY2hhaW4gdGFpbCBhZHJlc3MgZm9yIFRYIGNoYWluICovCisJc3BpZGVyX25ldF9lbmFibGVfdHhkbWFjKGNhcmQpOworCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDTEVOTE1ULAorCQkJICAgICBTUElERVJfTkVUX0xFTkxNVF9WQUxVRSk7CisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HTUFDTU9ERSwKKwkJCSAgICAgU1BJREVSX05FVF9NQUNNT0RFX1ZBTFVFKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dNQUNPUEVNRCwKKwkJCSAgICAgU1BJREVSX05FVF9PUE1PREVfVkFMVUUpOworCisJLyogc2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVycyAqLworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywKKwkJCSAgICAgU1BJREVSX05FVF9JTlQwX01BU0tfVkFMVUUpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMU1TSywKKwkJCSAgICAgU1BJREVSX05FVF9JTlQxX01BU0tfVkFMVUUpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UMk1TSywKKwkJCSAgICAgU1BJREVSX05FVF9JTlQyX01BU0tfVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfb3BlbiAtIGNhbGxlZCB1cG9uIGlmb25maWcgdXAKKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqCisgKiBzcGlkZXJfbmV0X29wZW4gYWxsb2NhdGVzIGFsbCB0aGUgZGVzY3JpcHRvcnMgYW5kIG1lbW9yeSBuZWVkZWQgZm9yCisgKiBvcGVyYXRpb24sIHNldHMgdXAgbXVsdGljYXN0IGxpc3QgYW5kIGVuYWJsZXMgaW50ZXJydXB0cworICovCitpbnQKK3NwaWRlcl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmIChzcGlkZXJfbmV0X2luaXRfY2hhaW4oY2FyZCwgJmNhcmQtPnR4X2NoYWluLAorCQkJICBjYXJkLT5kZXNjciwgdHhfZGVzY3JpcHRvcnMpKQorCQlnb3RvIGFsbG9jX3R4X2ZhaWxlZDsKKwlpZiAoc3BpZGVyX25ldF9pbml0X2NoYWluKGNhcmQsICZjYXJkLT5yeF9jaGFpbiwKKwkJCSAgY2FyZC0+ZGVzY3IgKyB0eF9kZXNjcmlwdG9ycywgcnhfZGVzY3JpcHRvcnMpKQorCQlnb3RvIGFsbG9jX3J4X2ZhaWxlZDsKKworCS8qIGFsbG9jYXRlIHJ4IHNrYnMgKi8KKwlpZiAoc3BpZGVyX25ldF9hbGxvY19yeF9za2JzKGNhcmQpKQorCQlnb3RvIGFsbG9jX3NrYnNfZmFpbGVkOworCisJc3BpZGVyX25ldF9zZXRfbXVsdGkobmV0ZGV2KTsKKworCS8qIGZ1cnRoZXIgZW5oYW5jZW1lbnQ6IHNldHVwIGh3IHZsYW4sIGlmIG5lZWRlZCAqLworCisJcmVzdWx0ID0gLUVCVVNZOworCWlmIChyZXF1ZXN0X2lycShuZXRkZXYtPmlycSwgc3BpZGVyX25ldF9pbnRlcnJ1cHQsCisJCQkgICAgIFNBX1NISVJRLCBuZXRkZXYtPm5hbWUsIG5ldGRldikpCisJCWdvdG8gcmVnaXN0ZXJfaW50X2ZhaWxlZDsKKworCXNwaWRlcl9uZXRfZW5hYmxlX2NhcmQoY2FyZCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwluZXRpZl9wb2xsX2VuYWJsZShuZXRkZXYpOworCisJcmV0dXJuIDA7CisKK3JlZ2lzdGVyX2ludF9mYWlsZWQ6CisJc3BpZGVyX25ldF9mcmVlX3J4X2NoYWluX2NvbnRlbnRzKGNhcmQpOworYWxsb2Nfc2tic19mYWlsZWQ6CisJc3BpZGVyX25ldF9mcmVlX2NoYWluKGNhcmQsICZjYXJkLT5yeF9jaGFpbik7CithbGxvY19yeF9mYWlsZWQ6CisJc3BpZGVyX25ldF9mcmVlX2NoYWluKGNhcmQsICZjYXJkLT50eF9jaGFpbik7CithbGxvY190eF9mYWlsZWQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldHVwX3BoeSAtIHNldHVwIFBIWQorICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKKyAqCisgKiBzcGlkZXJfbmV0X3NldHVwX3BoeSBpcyB1c2VkIGFzIHBhcnQgb2Ygc3BpZGVyX25ldF9wcm9iZS4gU2V0cworICogdGhlIFBIWSB0byAxMDAwIE1icHMKKyAqKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfc2V0dXBfcGh5KHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IG1paV9waHkgKnBoeSA9ICZjYXJkLT5waHk7CisKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEVERNQVNFTCwKKwkJCSAgICAgU1BJREVSX05FVF9ETUFTRUxfVkFMVUUpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1BDQ1RSTCwKKwkJCSAgICAgU1BJREVSX05FVF9QSFlfQ1RSTF9WQUxVRSk7CisJcGh5LT5taWlfaWQgPSAxOworCXBoeS0+ZGV2ID0gY2FyZC0+bmV0ZGV2OworCXBoeS0+bWRpb19yZWFkID0gc3BpZGVyX25ldF9yZWFkX3BoeTsKKwlwaHktPm1kaW9fd3JpdGUgPSBzcGlkZXJfbmV0X3dyaXRlX3BoeTsKKworCW1paV9waHlfcHJvYmUocGh5LCBwaHktPm1paV9pZCk7CisKKwlpZiAocGh5LT5kZWYtPm9wcy0+c2V0dXBfZm9yY2VkKQorCQlwaHktPmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQocGh5LCBTUEVFRF8xMDAwLCBEVVBMRVhfRlVMTCk7CisKKwkvKiB0aGUgZm9sbG93aW5nIHR3byB3cml0ZXMgY291bGQgYmUgbW92ZWQgdG8gc3VuZ2VtX3BoeS5jICovCisJLyogZW5hYmxlIGZpYmVyIG1vZGUgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3BoeShjYXJkLT5uZXRkZXYsIDEsIE1JSV9OQ09ORklHLCAweDkwMjApOworCS8qIExFRHMgYWN0aXZlIGluIGJvdGggbW9kZXMsIGF1dG9zZW5zZSBwcmlvID0gZmliZXIgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3BoeShjYXJkLT5uZXRkZXYsIDEsIE1JSV9OQ09ORklHLCAweDk0NWYpOworCisJcGh5LT5kZWYtPm9wcy0+cmVhZF9saW5rKHBoeSk7CisJcHJfaW5mbygiRm91bmQgJXMgd2l0aCAlaSBNYnBzLCAlcy1kdXBsZXguXG4iLCBwaHktPmRlZi0+bmFtZSwKKwkJcGh5LT5zcGVlZCwgcGh5LT5kdXBsZXg9PTEgPyAiRnVsbCIgOiAiSGFsZiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9kb3dubG9hZF9maXJtd2FyZSAtIGxvYWRzIGZpcm13YXJlIGludG8gdGhlIGFkYXB0ZXIKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICogQGZpcm13YXJlOiBmaXJtd2FyZSBwb2ludGVyCisgKgorICogc3BpZGVyX25ldF9kb3dubG9hZF9maXJtd2FyZSBsb2FkcyB0aGUgZmlybXdhcmUgb3BlbmVkIGJ5CisgKiBzcGlkZXJfbmV0X2luaXRfZmlybXdhcmUgaW50byB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSkKK3sKKwlpbnQgc2VxdWVuY2VyLCBpOworCXUzMiAqZndfcHRyID0gKHUzMiAqKWZpcm13YXJlLT5kYXRhOworCisJLyogc3RvcCBzZXF1ZW5jZXJzICovCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HU0lOSVQsCisJCQkgICAgIFNQSURFUl9ORVRfU1RPUF9TRVFfVkFMVUUpOworCisJZm9yIChzZXF1ZW5jZXIgPSAwOyBzZXF1ZW5jZXIgPCA2OyBzZXF1ZW5jZXIrKykgeworCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLAorCQkJCSAgICAgU1BJREVSX05FVF9HU25QUkdBRFIgKyBzZXF1ZW5jZXIgKiA4LCAwKTsKKwkJZm9yIChpID0gMDsgaSA8IFNQSURFUl9ORVRfRklSTVdBUkVfTEVOOyBpKyspIHsKKwkJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NuUFJHREFUICsKKwkJCQkJICAgICBzZXF1ZW5jZXIgKiA4LCAqZndfcHRyKTsKKwkJCWZ3X3B0cisrOworCQl9CisJfQorCisJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HU0lOSVQsCisJCQkgICAgIFNQSURFUl9ORVRfUlVOX1NFUV9WQUxVRSk7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9pbml0X2Zpcm13YXJlIC0gcmVhZHMgaW4gZmlybXdhcmUgcGFydHMKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKgorICogc3BpZGVyX25ldF9pbml0X2Zpcm13YXJlIG9wZW5zIHRoZSBzZXF1ZW5jZXIgZmlybXdhcmUgYW5kIGRvZXMgc29tZSBiYXNpYworICogY2hlY2tzLiBUaGlzIGZ1bmN0aW9uIG9wZW5zIGFuZCByZWxlYXNlcyB0aGUgZmlybXdhcmUgc3RydWN0dXJlLiBBIGNhbGwKKyAqIHRvIGRvd25sb2FkIHRoZSBmaXJtd2FyZSBpcyBwZXJmb3JtZWQgYmVmb3JlIHRoZSByZWxlYXNlLgorICoKKyAqIEZpcm13YXJlIGZvcm1hdAorICogPT09PT09PT09PT09PT09CisgKiBzcGlkZXJfZncuYmluIGlzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZSBjb250YWluaW5nIDYqMTAyNCo0IGJ5dGVzLCA0ayBiZWluZworICogdGhlIHByb2dyYW0gZm9yIGVhY2ggc2VxdWVuY2VyLiBVc2UgdGhlIGNvbW1hbmQKKyAqICAgIHRhaWwgLXEgLW4gKzIgU2VxX2NvZGUxXzB4MDg4LnR4dCBTZXFfY29kZTJfMHgwOTAudHh0ICAgICAgICAgICAgICBcCisgKiAgICAgICAgIFNlcV9jb2RlM18weDA5OC50eHQgU2VxX2NvZGU0XzB4MEEwLnR4dCBTZXFfY29kZTVfMHgwQTgudHh0ICAgXAorICogICAgICAgICBTZXFfY29kZTZfMHgwQjAudHh0IHwgeHhkIC1yIC1wIC1jNCA+IHNwaWRlcl9mdy5iaW4KKyAqCisgKiB0byBnZW5lcmF0ZSBzcGlkZXJfZncuYmluLCBpZiB5b3UgaGF2ZSBzZXF1ZW5jZXIgcHJvZ3JhbXMgd2l0aCBzb21ldGhpbmcKKyAqIGxpa2UgdGhlIGZvbGxvd2luZyBjb250ZW50cyBmb3IgZWFjaCBzZXF1ZW5jZXI6CisgKiAgICA8T05FIExJTkUgQ09NTUVOVD4KKyAqICAgIDxGSVJTVCA0LUJZVEVTLVdPUkQgRk9SIFNFUVVFTkNFUj4KKyAqICAgIDxTRUNPTkQgNC1CWVRFUy1XT1JEIEZPUiBTRVFVRU5DRVI+CisgKiAgICAgLi4uCisgKiAgICA8MTAyNHRoIDQtQllURVMtV09SRCBGT1IgU0VRVUVOQ0VSPgorICovCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X2luaXRfZmlybXdhcmUoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCWludCBlcnIgPSAtRUlPOworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLAorCQkJICAgICBTUElERVJfTkVUX0ZJUk1XQVJFX05BTUUsICZjYXJkLT5wZGV2LT5kZXYpIDwgMCkgeworCQlpZiAobmV0aWZfbXNnX3Byb2JlKGNhcmQpKQorCQkJcHJfZXJyKCJDb3VsZG4ndCByZWFkIGluIHNlcXVlbmNlciBkYXRhIGZpbGUgJXMuXG4iLAorCQkJICAgICAgIFNQSURFUl9ORVRfRklSTVdBUkVfTkFNRSk7CisJCWZpcm13YXJlID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZpcm13YXJlLT5zaXplICE9IDYgKiBTUElERVJfTkVUX0ZJUk1XQVJFX0xFTiAqIHNpemVvZih1MzIpKSB7CisJCWlmIChuZXRpZl9tc2dfcHJvYmUoY2FyZCkpCisJCQlwcl9lcnIoIkludmFsaWQgc2l6ZSBvZiBzZXF1ZW5jZXIgZGF0YSBmaWxlICVzLlxuIiwKKwkJCSAgICAgICBTUElERVJfTkVUX0ZJUk1XQVJFX05BTUUpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGlkZXJfbmV0X2Rvd25sb2FkX2Zpcm13YXJlKGNhcmQsIGZpcm13YXJlKTsKKworCWVyciA9IDA7CitvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfd29ya2Fyb3VuZF9yeHJhbWZ1bGwgLSB3b3JrIGFyb3VuZCBmaXJtd2FyZSBidWcKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIG5vIHJldHVybiB2YWx1ZQorICoqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfd29ya2Fyb3VuZF9yeHJhbWZ1bGwoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaSwgc2VxdWVuY2VyID0gMDsKKworCS8qIGNhbmNlbCByZXNldCAqLworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfQ0tSQ1RSTCwKKwkJCSAgICAgU1BJREVSX05FVF9DS1JDVFJMX1JVTl9WQUxVRSk7CisKKwkvKiBlbXB0eSBzZXF1ZW5jZXIgZGF0YSAqLworCWZvciAoc2VxdWVuY2VyID0gMDsgc2VxdWVuY2VyIDwgNjsgc2VxdWVuY2VyKyspIHsKKwkJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HU25QUkdEQVQgKworCQkJCSAgICAgc2VxdWVuY2VyICogOCwgMHgwKTsKKwkJZm9yIChpID0gMDsgaSA8IFNQSURFUl9ORVRfRklSTVdBUkVfTEVOOyBpKyspIHsKKwkJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NuUFJHREFUICsKKwkJCQkJICAgICBzZXF1ZW5jZXIgKiA4LCAweDApOworCQl9CisJfQorCisJLyogc2V0IHNlcXVlbmNlciBvcGVyYXRpb24gKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTSU5JVCwgMHgwMDAwMDBmZSk7CisKKwkvKiByZXNldCAqLworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfQ0tSQ1RSTCwKKwkJCSAgICAgU1BJREVSX05FVF9DS1JDVFJMX1NUT1BfVkFMVUUpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfdHhfdGltZW91dF90YXNrIC0gdGFzayBzY2hlZHVsZWQgYnkgdGhlIHdhdGNoZG9nIHRpbWVvdXQKKyAqIGZ1bmN0aW9uICh0byBiZSBjYWxsZWQgbm90IHVuZGVyIGludGVycnVwdCBzdGF0dXMpCisgKiBAZGF0YTogZGF0YSwgaXMgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBjYWxsZWQgYXMgdGFzayB3aGVuIHR4IGhhbmdzLCByZXNldHMgaW50ZXJmYWNlIChpZiBpbnRlcmZhY2UgaXMgdXApCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3R4X3RpbWVvdXRfdGFzayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKCEobmV0ZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCWdvdG8gb3V0OworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCXNwaWRlcl9uZXRfc3RvcChuZXRkZXYpOworCisJc3BpZGVyX25ldF93b3JrYXJvdW5kX3J4cmFtZnVsbChjYXJkKTsKKwlzcGlkZXJfbmV0X2luaXRfY2FyZChjYXJkKTsKKworCWlmIChzcGlkZXJfbmV0X3NldHVwX3BoeShjYXJkKSkKKwkJZ290byBvdXQ7CisJaWYgKHNwaWRlcl9uZXRfaW5pdF9maXJtd2FyZShjYXJkKSkKKwkJZ290byBvdXQ7CisKKwlzcGlkZXJfbmV0X29wZW4obmV0ZGV2KTsKKwlzcGlkZXJfbmV0X2tpY2tfdHhfZG1hKGNhcmQsIGNhcmQtPnR4X2NoYWluLmhlYWQpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKworb3V0OgorCWF0b21pY19kZWMoJmNhcmQtPnR4X3RpbWVvdXRfdGFza19jb3VudGVyKTsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3R4X3RpbWVvdXQgLSBjYWxsZWQgd2hlbiB0aGUgdHggdGltZW91dCB3YXRjaGRvZyBraWNrcyBpbi4KKyAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogY2FsbGVkLCBpZiB0eCBoYW5ncy4gU2NoZWR1bGVzIGEgdGFzayB0aGF0IHJlc2V0cyB0aGUgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCisJY2FyZCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYXRvbWljX2luYygmY2FyZC0+dHhfdGltZW91dF90YXNrX2NvdW50ZXIpOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlzY2hlZHVsZV93b3JrKCZjYXJkLT50eF90aW1lb3V0X3Rhc2spOworCWVsc2UKKwkJYXRvbWljX2RlYygmY2FyZC0+dHhfdGltZW91dF90YXNrX2NvdW50ZXIpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfc2V0dXBfbmV0ZGV2X29wcyAtIGluaXRpYWxpemF0aW9uIG9mIG5ldF9kZXZpY2Ugb3BlcmF0aW9ucworICogQG5ldGRldjogbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBmaWxscyBvdXQgZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3NldHVwX25ldGRldl9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwluZXRkZXYtPm9wZW4gPSAmc3BpZGVyX25ldF9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZzcGlkZXJfbmV0X3N0b3A7CisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3BpZGVyX25ldF94bWl0OworCW5ldGRldi0+Z2V0X3N0YXRzID0gJnNwaWRlcl9uZXRfZ2V0X3N0YXRzOworCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNwaWRlcl9uZXRfc2V0X211bHRpOworCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gJnNwaWRlcl9uZXRfc2V0X21hYzsKKwluZXRkZXYtPmNoYW5nZV9tdHUgPSAmc3BpZGVyX25ldF9jaGFuZ2VfbXR1OworCW5ldGRldi0+ZG9faW9jdGwgPSAmc3BpZGVyX25ldF9kb19pb2N0bDsKKwkvKiB0eCB3YXRjaGRvZyAqLworCW5ldGRldi0+dHhfdGltZW91dCA9ICZzcGlkZXJfbmV0X3R4X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IFNQSURFUl9ORVRfV0FUQ0hET0dfVElNRU9VVDsKKwkvKiBOQVBJICovCisJbmV0ZGV2LT5wb2xsID0gJnNwaWRlcl9uZXRfcG9sbDsKKwluZXRkZXYtPndlaWdodCA9IFNQSURFUl9ORVRfTkFQSV9XRUlHSFQ7CisJLyogSFcgVkxBTiAqLworCW5ldGRldi0+dmxhbl9yeF9yZWdpc3RlciA9ICZzcGlkZXJfbmV0X3ZsYW5fcnhfcmVnOworCW5ldGRldi0+dmxhbl9yeF9hZGRfdmlkID0gJnNwaWRlcl9uZXRfdmxhbl9yeF9hZGQ7CisJbmV0ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gJnNwaWRlcl9uZXRfdmxhbl9yeF9raWxsOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLyogcG9sbCBjb250cm9sbGVyICovCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmc3BpZGVyX25ldF9wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYgLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KKwkvKiBldGh0b29sIG9wcyAqLworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmc3BpZGVyX25ldF9ldGh0b29sX29wczsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3NldHVwX25ldGRldiAtIGluaXRpYWxpemF0aW9uIG9mIG5ldF9kZXZpY2UKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIDwwIG9uIGZhaWx1cmUKKyAqCisgKiBzcGlkZXJfbmV0X3NldHVwX25ldGRldiBpbml0aWFsaXplcyB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyBpbnQKK3NwaWRlcl9uZXRfc2V0dXBfbmV0ZGV2KHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY2FyZC0+bmV0ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisJc3RydWN0IHNvY2thZGRyIGFkZHI7CisJdTggKm1hYzsKKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZjYXJkLT5wZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKGNhcmQtPnBkZXYsIG5ldGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmludG1hc2tfbG9jayk7CisJbmV0ZGV2LT5pcnEgPSBjYXJkLT5wZGV2LT5pcnE7CisKKwljYXJkLT5vcHRpb25zLnJ4X2NzdW0gPSBTUElERVJfTkVUX1JYX0NTVU1fREVGQVVMVDsKKworCXNwaWRlcl9uZXRfc2V0dXBfbmV0ZGV2X29wcyhuZXRkZXYpOworCisJbmV0ZGV2LT5mZWF0dXJlcyA9IDA7CisJLyogc29tZSB0aW1lOiBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlggfAorCSAqCQlORVRJRl9GX0hXX1ZMQU5fRklMVEVSICovCisKKwluZXRkZXYtPmlycSA9IGNhcmQtPnBkZXYtPmlycTsKKworCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGNhcmQtPnBkZXYpOworCWlmICghZG4pCisJCXJldHVybiAtRUlPOworCisJbWFjID0gKHU4ICopZ2V0X3Byb3BlcnR5KGRuLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKKwlpZiAoIW1hYykKKwkJcmV0dXJuIC1FSU87CisJbWVtY3B5KGFkZHIuc2FfZGF0YSwgbWFjLCBFVEhfQUxFTik7CisKKwlyZXN1bHQgPSBzcGlkZXJfbmV0X3NldF9tYWMobmV0ZGV2LCAmYWRkcik7CisJaWYgKChyZXN1bHQpICYmIChuZXRpZl9tc2dfcHJvYmUoY2FyZCkpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgTUFDIGFkZHJlc3M6ICVpXG4iLCByZXN1bHQpOworCisJcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKHJlc3VsdCkgeworCQlpZiAobmV0aWZfbXNnX3Byb2JlKGNhcmQpKQorCQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBuZXRfZGV2aWNlOiAlaVxuIiwKKwkJCQkgIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJaWYgKG5ldGlmX21zZ19wcm9iZShjYXJkKSkKKwkJcHJfaW5mbygiSW5pdGlhbGl6ZWQgZGV2aWNlICVzLlxuIiwgbmV0ZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfYWxsb2NfY2FyZCAtIGFsbG9jYXRlcyBuZXRfZGV2aWNlIGFuZCBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgdGhlIGNhcmQgc3RydWN0dXJlIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcnMKKyAqCisgKiB0aGUgY2FyZCBhbmQgbmV0X2RldmljZSBzdHJ1Y3R1cmVzIGFyZSBsaW5rZWQgdG8gZWFjaCBvdGhlcgorICovCitzdGF0aWMgc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqCitzcGlkZXJfbmV0X2FsbG9jX2NhcmQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQ7CisJc2l6ZV90IGFsbG9jX3NpemU7CisKKwlhbGxvY19zaXplID0gc2l6ZW9mICgqY2FyZCkgKworCQlzaXplb2YgKHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyKSAqIHJ4X2Rlc2NyaXB0b3JzICsKKwkJc2l6ZW9mIChzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcikgKiB0eF9kZXNjcmlwdG9yczsKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihhbGxvY19zaXplKTsKKwlpZiAoIW5ldGRldikKKwkJcmV0dXJuIE5VTEw7CisKKwljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwljYXJkLT5uZXRkZXYgPSBuZXRkZXY7CisJY2FyZC0+bXNnX2VuYWJsZSA9IFNQSURFUl9ORVRfREVGQVVMVF9NU0c7CisJSU5JVF9XT1JLKCZjYXJkLT50eF90aW1lb3V0X3Rhc2ssIHNwaWRlcl9uZXRfdHhfdGltZW91dF90YXNrLCBuZXRkZXYpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPndhaXRxKTsKKwlhdG9taWNfc2V0KCZjYXJkLT50eF90aW1lb3V0X3Rhc2tfY291bnRlciwgMCk7CisKKwlyZXR1cm4gY2FyZDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3VuZG9fcGNpX3NldHVwIC0gcmVsZWFzZXMgUENJIHJlc3NvdXJjZXMKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfdW5kb19wY2lfc2V0dXAgcmVsZWFzZXMgdGhlIG1hcHBlZCByZWdpb25zCisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X3VuZG9fcGNpX3NldHVwKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJaW91bm1hcChjYXJkLT5yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGNhcmQtPnBkZXYpOworfQorCisvKioKKyAqIHNwaWRlcl9uZXRfc2V0dXBfcGNpX2RldiAtIHNldHMgdXAgdGhlIGRldmljZSBpbiB0ZXJtcyBvZiBQQ0kgb3BlcmF0aW9ucworICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAcGRldjogUENJIGRldmljZQorICoKKyAqIFJldHVybnMgdGhlIGNhcmQgc3RydWN0dXJlIG9yIE5VTEwgaWYgYW55IGVycm9ycyBvY2N1cgorICoKKyAqIHNwaWRlcl9uZXRfc2V0dXBfcGNpX2RldiBpbml0aWFsaXplcyBwZGV2IGFuZCB0b2dldGhlciB3aXRoIHRoZQorICogZnVuY3Rpb25zIGNhbGxlZCBpbiBzcGlkZXJfbmV0X29wZW4gY29uZmlndXJlcyB0aGUgZGV2aWNlIHNvIHRoYXQKKyAqIGRhdGEgY2FuIGJlIHRyYW5zZmVycmVkIG92ZXIgaXQKKyAqIFRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSBpcyBhdHRhY2hlZCB0byB0aGUgY2FyZCBzdHJ1Y3R1cmUsIGlmIHRoZQorICogZnVuY3Rpb24gcmV0dXJucyB3aXRob3V0IGVycm9yLgorICoqLworc3RhdGljIHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKgorc3BpZGVyX25ldF9zZXR1cF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2xlbjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQlwcl9lcnIoIkNvdWxkbid0IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByX2VycigiQ291bGRuJ3QgZmluZCBwcm9wZXIgUENJIGRldmljZSBiYXNlIGFkZHJlc3MuXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXY7CisJfQorCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgc3BpZGVyX25ldF9kcml2ZXJfbmFtZSkpIHsKKwkJcHJfZXJyKCJDb3VsZG4ndCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXY7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwljYXJkID0gc3BpZGVyX25ldF9hbGxvY19jYXJkKCk7CisJaWYgKCFjYXJkKSB7CisJCXByX2VycigiQ291bGRuJ3QgYWxsb2NhdGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUsICIKKwkJCSAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uczsKKwl9CisJY2FyZC0+cGRldiA9IHBkZXY7CisKKwkvKiBmZXRjaCBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBmaXJzdCByZXNvdXJjZSAqLworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCisJY2FyZC0+bmV0ZGV2LT5tZW1fc3RhcnQgPSBtbWlvX3N0YXJ0OworCWNhcmQtPm5ldGRldi0+bWVtX2VuZCA9IG1taW9fc3RhcnQgKyBtbWlvX2xlbjsKKwljYXJkLT5yZWdzID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisKKwlpZiAoIWNhcmQtPnJlZ3MpIHsKKwkJcHJfZXJyKCJDb3VsZG4ndCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKworCXJldHVybiBjYXJkOworCitvdXRfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitvdXRfZGlzYWJsZV9kZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBzcGlkZXJfbmV0X3Byb2JlIC0gaW5pdGlhbGl6YXRpb24gb2YgYSBkZXZpY2UKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlCisgKiBAZW50OiBlbnRyeSBpbiB0aGUgZGV2aWNlIGlkIGxpc3QKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICoKKyAqIHNwaWRlcl9uZXRfcHJvYmUgaW5pdGlhbGl6ZXMgcGRldiBhbmQgcmVnaXN0ZXJzIGEgbmV0X2RldmljZQorICogc3RydWN0dXJlIGZvciBpdC4gQWZ0ZXIgdGhhdCwgdGhlIGRldmljZSBjYW4gYmUgaWZjb25maWcnZWQgdXAKKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitzcGlkZXJfbmV0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAtRUlPOworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQ7CisKKwljYXJkID0gc3BpZGVyX25ldF9zZXR1cF9wY2lfZGV2KHBkZXYpOworCWlmICghY2FyZCkKKwkJZ290byBvdXQ7CisKKwlzcGlkZXJfbmV0X3dvcmthcm91bmRfcnhyYW1mdWxsKGNhcmQpOworCXNwaWRlcl9uZXRfaW5pdF9jYXJkKGNhcmQpOworCisJZXJyID0gc3BpZGVyX25ldF9zZXR1cF9waHkoY2FyZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5kb19wY2k7CisKKwllcnIgPSBzcGlkZXJfbmV0X2luaXRfZmlybXdhcmUoY2FyZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5kb19wY2k7CisKKwllcnIgPSBzcGlkZXJfbmV0X3NldHVwX25ldGRldihjYXJkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmRvX3BjaTsKKworCXJldHVybiAwOworCitvdXRfdW5kb19wY2k6CisJc3BpZGVyX25ldF91bmRvX3BjaV9zZXR1cChjYXJkKTsKKwlmcmVlX25ldGRldihjYXJkLT5uZXRkZXYpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9yZW1vdmUgLSByZW1vdmFsIG9mIGEgZGV2aWNlCisgKiBAcGRldjogUENJIGRldmljZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCisgKgorICogc3BpZGVyX25ldF9yZW1vdmUgaXMgY2FsbGVkIHRvIHJlbW92ZSB0aGUgZGV2aWNlIGFuZCB1bnJlZ2lzdGVycyB0aGUKKyAqIG5ldF9kZXZpY2UKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorc3BpZGVyX25ldF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCisJbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJd2FpdF9ldmVudChjYXJkLT53YWl0cSwKKwkJICAgYXRvbWljX3JlYWQoJmNhcmQtPnR4X3RpbWVvdXRfdGFza19jb3VudGVyKSA9PSAwKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwkvKiBzd2l0Y2ggb2ZmIGNhcmQgKi8KKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0NLUkNUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9TVE9QX1ZBTFVFKTsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0NLUkNUUkwsCisJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9SVU5fVkFMVUUpOworCisJc3BpZGVyX25ldF91bmRvX3BjaV9zZXR1cChjYXJkKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3BpZGVyX25ldF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9IHNwaWRlcl9uZXRfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gc3BpZGVyX25ldF9wY2lfdGJsLAorCS5wcm9iZQkJPSBzcGlkZXJfbmV0X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3BpZGVyX25ldF9yZW1vdmUpCit9OworCisvKioKKyAqIHNwaWRlcl9uZXRfaW5pdCAtIGluaXQgZnVuY3Rpb24gd2hlbiB0aGUgZHJpdmVyIGlzIGxvYWRlZAorICoKKyAqIHNwaWRlcl9uZXRfaW5pdCByZWdpc3RlcnMgdGhlIGRldmljZSBkcml2ZXIKKyAqLworc3RhdGljIGludCBfX2luaXQgc3BpZGVyX25ldF9pbml0KHZvaWQpCit7CisJaWYgKHJ4X2Rlc2NyaXB0b3JzIDwgU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NSU4pIHsKKwkJcnhfZGVzY3JpcHRvcnMgPSBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX01JTjsKKwkJcHJfaW5mbygiYWRqdXN0aW5nIHJ4IGRlc2NyaXB0b3JzIHRvICVpLlxuIiwgcnhfZGVzY3JpcHRvcnMpOworCX0KKwlpZiAocnhfZGVzY3JpcHRvcnMgPiBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX01BWCkgeworCQlyeF9kZXNjcmlwdG9ycyA9IFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUFYOworCQlwcl9pbmZvKCJhZGp1c3RpbmcgcnggZGVzY3JpcHRvcnMgdG8gJWkuXG4iLCByeF9kZXNjcmlwdG9ycyk7CisJfQorCWlmICh0eF9kZXNjcmlwdG9ycyA8IFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUlOKSB7CisJCXR4X2Rlc2NyaXB0b3JzID0gU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19NSU47CisJCXByX2luZm8oImFkanVzdGluZyB0eCBkZXNjcmlwdG9ycyB0byAlaS5cbiIsIHR4X2Rlc2NyaXB0b3JzKTsKKwl9CisJaWYgKHR4X2Rlc2NyaXB0b3JzID4gU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19NQVgpIHsKKwkJdHhfZGVzY3JpcHRvcnMgPSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX01BWDsKKwkJcHJfaW5mbygiYWRqdXN0aW5nIHR4IGRlc2NyaXB0b3JzIHRvICVpLlxuIiwgdHhfZGVzY3JpcHRvcnMpOworCX0KKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzcGlkZXJfbmV0X2RyaXZlcik7Cit9CisKKy8qKgorICogc3BpZGVyX25ldF9jbGVhbnVwIC0gZXhpdCBmdW5jdGlvbiB3aGVuIGRyaXZlciBpcyB1bmxvYWRlZAorICoKKyAqIHNwaWRlcl9uZXRfY2xlYW51cCB1bnJlZ2lzdGVycyB0aGUgZGV2aWNlIGRyaXZlcgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BpZGVyX25ldF9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGlkZXJfbmV0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNwaWRlcl9uZXRfaW5pdCk7Cittb2R1bGVfZXhpdChzcGlkZXJfbmV0X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjJmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmgKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBOZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIENlbGwgUHJvY2Vzc29yLUJhc2VkIEJsYWRlCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIEF1dGhvcnMgOiBVdHogQmFjaGVyIDx1dHouYmFjaGVyQGRlLmlibS5jb20+CisgKiAgICAgICAgICAgSmVucyBPc3RlcmthbXAgPEplbnMuT3N0ZXJrYW1wQGRlLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfU1BJREVSX05FVF9ICisjZGVmaW5lIF9TUElERVJfTkVUX0gKKworI2luY2x1ZGUgInN1bmdlbV9waHkuaCIKKworZXh0ZXJuIGludCBzcGlkZXJfbmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitleHRlcm4gaW50IHNwaWRlcl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKKworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBzcGlkZXJfbmV0X2V0aHRvb2xfb3BzOworCitleHRlcm4gY2hhciBzcGlkZXJfbmV0X2RyaXZlcl9uYW1lW107CisKKyNkZWZpbmUgU1BJREVSX05FVF9NQVhfTVRVCQkJMjMwOAorI2RlZmluZSBTUElERVJfTkVUX01JTl9NVFUJCQk2NAorCisjZGVmaW5lIFNQSURFUl9ORVRfUlhCVUZfQUxJR04JCQkxMjgKKworI2RlZmluZSBTUElERVJfTkVUX1JYX0RFU0NSSVBUT1JTX0RFRkFVTFQJNjQKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NSU4JCTE2CisjZGVmaW5lIFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUFYCQkyNTYKKworI2RlZmluZSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX0RFRkFVTFQJNjQKKyNkZWZpbmUgU1BJREVSX05FVF9UWF9ERVNDUklQVE9SU19NSU4JCTE2CisjZGVmaW5lIFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUFYCQkyNTYKKworI2RlZmluZSBTUElERVJfTkVUX1JYX0NTVU1fREVGQVVMVAkJMQorCisjZGVmaW5lIFNQSURFUl9ORVRfV0FUQ0hET0dfVElNRU9VVCA1KkhaCisjZGVmaW5lIFNQSURFUl9ORVRfTkFQSV9XRUlHSFQgNjQKKworI2RlZmluZSBTUElERVJfTkVUX0ZJUk1XQVJFX0xFTgkJMTAyNAorI2RlZmluZSBTUElERVJfTkVUX0ZJUk1XQVJFX05BTUUJInNwaWRlcl9mdy5iaW4iCisKKy8qKiBzcGlkZXJfbmV0IFNNTUlPIHJlZ2lzdGVycyAqLworI2RlZmluZSBTUElERVJfTkVUX0dISUlOVDBTVFMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9HSElJTlQxU1RTCQkweDAwMDAwMDA0CisjZGVmaW5lIFNQSURFUl9ORVRfR0hJSU5UMlNUUwkJMHgwMDAwMDAwOAorI2RlZmluZSBTUElERVJfTkVUX0dISUlOVDBNU0sJCTB4MDAwMDAwMTAKKyNkZWZpbmUgU1BJREVSX05FVF9HSElJTlQxTVNLCQkweDAwMDAwMDE0CisjZGVmaW5lIFNQSURFUl9ORVRfR0hJSU5UMk1TSwkJMHgwMDAwMDAxOAorCisjZGVmaW5lIFNQSURFUl9ORVRfR1JFU1VNSU5UTlVNCQkweDAwMDAwMDIwCisjZGVmaW5lIFNQSURFUl9ORVRfR1JFSU5UTlVNCQkweDAwMDAwMDI0CisKKyNkZWZpbmUgU1BJREVSX05FVF9HRkZSTU5VTQkJMHgwMDAwMDAyOAorI2RlZmluZSBTUElERVJfTkVUX0dGQUZSTU5VTQkJMHgwMDAwMDAyYworI2RlZmluZSBTUElERVJfTkVUX0dGQkZSTU5VTQkJMHgwMDAwMDAzMAorI2RlZmluZSBTUElERVJfTkVUX0dGQ0ZSTU5VTQkJMHgwMDAwMDAzNAorI2RlZmluZSBTUElERVJfTkVUX0dGREZSTU5VTQkJMHgwMDAwMDAzOAorCisvKiBjbGVhciB0aGVtIChkb24ndCB1c2UgaXQpICovCisjZGVmaW5lIFNQSURFUl9ORVRfR0ZSRUVDTk5VTQkJMHgwMDAwMDAzYworI2RlZmluZSBTUElERVJfTkVUX0dPTkVUSU1FTlVNCQkweDAwMDAwMDQwCisKKyNkZWZpbmUgU1BJREVSX05FVF9HVE9VVEZSTU5VTQkJMHgwMDAwMDA0NAorCisjZGVmaW5lIFNQSURFUl9ORVRfR1RYTURTRVQJCTB4MDAwMDAwNTAKKyNkZWZpbmUgU1BJREVSX05FVF9HUENDVFJMCQkweDAwMDAwMDU0CisjZGVmaW5lIFNQSURFUl9ORVRfR1JYTURTRVQJCTB4MDAwMDAwNTgKKyNkZWZpbmUgU1BJREVSX05FVF9HSVBTRUNJTklUCQkweDAwMDAwMDVjCisjZGVmaW5lIFNQSURFUl9ORVRfR0ZUUkVTVFJUCQkweDAwMDAwMDYwCisjZGVmaW5lIFNQSURFUl9ORVRfR1JYRE1BRU4JCTB4MDAwMDAwNjQKKyNkZWZpbmUgU1BJREVSX05FVF9HTVJXT0xDVFJMCQkweDAwMDAwMDY4CisjZGVmaW5lIFNQSURFUl9ORVRfR1BDV09QQ01ECQkweDAwMDAwMDZjCisjZGVmaW5lIFNQSURFUl9ORVRfR1BDUk9QQ01ECQkweDAwMDAwMDcwCisjZGVmaW5lIFNQSURFUl9ORVRfR1RURlJNQ05UCQkweDAwMDAwMDc4CisjZGVmaW5lIFNQSURFUl9ORVRfR1RFU1RNRAkJMHgwMDAwMDA3YworCisjZGVmaW5lIFNQSURFUl9ORVRfR1NJTklUCQkweDAwMDAwMDgwCisjZGVmaW5lIFNQSURFUl9ORVRfR1NuUFJHQURSCQkweDAwMDAwMDg0CisjZGVmaW5lIFNQSURFUl9ORVRfR1NuUFJHREFUCQkweDAwMDAwMDg4CisKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDT1BFTUQJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDTEVOTE1UCQkweDAwMDAwMTA4CisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ0lOVEVOCQkweDAwMDAwMTE4CisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ1BIWUNUUkwJCTB4MDAwMDAxMjAKKworI2RlZmluZSBTUElERVJfTkVUX0dNQUNBUEFVU0UJCTB4MDAwMDAxNTQKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDVFhQQVVTRQkJMHgwMDAwMDE2NAorCisjZGVmaW5lIFNQSURFUl9ORVRfR01BQ01PREUJCTB4MDAwMDAxYjAKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDQlNUTE1UCQkweDAwMDAwMWI0CisKKyNkZWZpbmUgU1BJREVSX05FVF9HTUFDVU5JTUFDVQkJMHgwMDAwMDFjMAorI2RlZmluZSBTUElERVJfTkVUX0dNQUNVTklNQUNMCQkweDAwMDAwMWM4CisKKyNkZWZpbmUgU1BJREVSX05FVF9HTVJNSEZJTG5SCQkweDAwMDAwNDAwCisjZGVmaW5lIFNQSURFUl9ORVRfTVVMVElDQVNUX0hBU0hFUwkyNTYKKworI2RlZmluZSBTUElERVJfTkVUX0dNUlVBRklMblIJCTB4MDAwMDA1MDAKKyNkZWZpbmUgU1BJREVSX05FVF9HTVJVQTBGSUwxNVIJCTB4MDAwMDA1NzgKKworLyogUlggRE1BIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLCBhbGwgMHgwMDAwMGEuLiBhcmUgZm9yIERNQSBjb250cm9sbGVyIEEsCisgKiAweDAwMDAwYi4uIGZvciBETUEgY29udHJvbGxlciBCLCBldGMuICovCisjZGVmaW5lIFNQSURFUl9ORVRfR0RBRENIQQkJMHgwMDAwMGEwMAorI2RlZmluZSBTUElERVJfTkVUX0dEQURNQUNDTlRSCQkweDAwMDAwYTA0CisjZGVmaW5lIFNQSURFUl9ORVRfR0RBQ1REUEEJCTB4MDAwMDBhMDgKKyNkZWZpbmUgU1BJREVSX05FVF9HREFDVERDTlQJCTB4MDAwMDBhMGMKKyNkZWZpbmUgU1BJREVSX05FVF9HREFDREJBRERSCQkweDAwMDAwYTIwCisjZGVmaW5lIFNQSURFUl9ORVRfR0RBQ0RCU0laRQkJMHgwMDAwMGEyNAorI2RlZmluZSBTUElERVJfTkVUX0dEQUNORVhUREEJCTB4MDAwMDBhMjgKKyNkZWZpbmUgU1BJREVSX05FVF9HREFDQ09NU1QJCTB4MDAwMDBhMmMKKyNkZWZpbmUgU1BJREVSX05FVF9HREFXQkNPTVNUCQkweDAwMDAwYTMwCisjZGVmaW5lIFNQSURFUl9ORVRfR0RBV0JSU0laRQkJMHgwMDAwMGEzNAorI2RlZmluZSBTUElERVJfTkVUX0dEQVdCVlNJWkUJCTB4MDAwMDBhMzgKKyNkZWZpbmUgU1BJREVSX05FVF9HREFXQlRSU1QJCTB4MDAwMDBhM2MKKyNkZWZpbmUgU1BJREVSX05FVF9HREFXQlRSRVJSCQkweDAwMDAwYTQwCisKKy8qIFRYIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBTUElERVJfTkVUX0dEVERDSEEJCTB4MDAwMDBlMDAKKyNkZWZpbmUgU1BJREVSX05FVF9HRFRETUFDQ05UUgkJMHgwMDAwMGUwNAorI2RlZmluZSBTUElERVJfTkVUX0dEVENEUEEJCTB4MDAwMDBlMDgKKyNkZWZpbmUgU1BJREVSX05FVF9HRFRETUFTRUwJCTB4MDAwMDBlMTQKKworI2RlZmluZSBTUElERVJfTkVUX0VDTU9ERQkJMHgwMDAwMGYwMAorLyogY2xvY2sgYW5kIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9DS1JDVFJMCQkweDAwMDAwZmYwCisKKy8qKiBTQ09ORklHIHJlZ2lzdGVycyAqLworI2RlZmluZSBTUElERVJfTkVUX1NDT05GSUdfSU9BQ1RFCTB4MDAwMDI4MTAKKworLyoqIGhhcmRjb2RlZCByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9JTlQwX01BU0tfVkFMVUUJMHgzZjdmZTNmZgorI2RlZmluZSBTUElERVJfTkVUX0lOVDFfTUFTS19WQUxVRQkweGZmZmZmZmZmCisvKiBubyBNQUMgYWJvcnRzIC0+IGF1dG8gcmV0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgU1BJREVSX05FVF9JTlQyX01BU0tfVkFMVUUJMHhmZmZmZmZmMQorCisvKiBjbGVhciBjb3VudGVyIHdoZW4gaW50ZXJydXB0IHNvdXJjZXMgYXJlIGNsZWFyZWQKKyNkZWZpbmUgU1BJREVSX05FVF9GUkFNRU5VTV9WQUxVRQkweDAwMDFmMDAxICovCisvKiB3ZSByZWx5IG9uIGZsYWdnZWQgZGVzY3JpcHRvciBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFNQSURFUl9ORVRfRlJBTUVOVU1fVkFMVUUJMHgwMDAwMDAwMAorLyogc2V0IHRoaXMgZmlyc3QsIHRoZW4gdGhlIEZSQU1FTlVNX1ZBTFVFICovCisjZGVmaW5lIFNQSURFUl9ORVRfR0ZYRlJBTUVTX1ZBTFVFCTB4MDAwMDAwMDAKKworI2RlZmluZSBTUElERVJfTkVUX1NUT1BfU0VRX1ZBTFVFCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9SVU5fU0VRX1ZBTFVFCTB4MDAwMDAwN2UKKworI2RlZmluZSBTUElERVJfTkVUX1BIWV9DVFJMX1ZBTFVFCTB4MDAwNDAwNDAKKy8qICNkZWZpbmUgU1BJREVSX05FVF9QSFlfQ1RSTF9WQUxVRQkweDAxMDcwMDgwKi8KKyNkZWZpbmUgU1BJREVSX05FVF9SWE1PREVfVkFMVUUJCTB4MDAwMDAwMTEKKy8qIGF1dG8gcmV0cmFuc21pc3Npb24gaW4gY2FzZSBvZiBNQUMgYWJvcnRzICovCisjZGVmaW5lIFNQSURFUl9ORVRfVFhNT0RFX1ZBTFVFCQkweDAwMDEwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfUkVTVEFSVF9WQUxVRQkweDAwMDAwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfV09MX1ZBTFVFCQkweDAwMDAxMTExCisjaWYgMAorI2RlZmluZSBTUElERVJfTkVUX1dPTF9WQUxVRQkJMHgwMDAwMDAwMAorI2VuZGlmCisjZGVmaW5lIFNQSURFUl9ORVRfSVBTRUNJTklUX1ZBTFVFCTB4MDBmMDAwZjgKKworLyogcGF1c2UgZnJhbWVzOiBhdXRvbWF0aWMsIG5vIHVwcGVyIHJldHJhbnNtaXNzaW9uIGNvdW50ICovCisvKiBvdXRzaWRlIGxvb3BiYWNrIG1vZGU6IEVUT01PRCBzaWduYWwgZG9udCBtYXR0ZXIsIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9PUE1PREVfVkFMVUUJCTB4MDAwMDAwNjMKKy8qI2RlZmluZSBTUElERVJfTkVUX09QTU9ERV9WQUxVRQkJMHgwMDFiMDA2MiovCisjZGVmaW5lIFNQSURFUl9ORVRfTEVOTE1UX1ZBTFVFCQkweDAwMDAwOTA4CisKKyNkZWZpbmUgU1BJREVSX05FVF9NQUNBUEFVU0VfVkFMVUUJMHgwMDAwMDgwMCAvKiBhYm91dCAxIG1zICovCisjZGVmaW5lIFNQSURFUl9ORVRfVFhQQVVTRV9WQUxVRQkweDAwMDAwMDAwCisKKyNkZWZpbmUgU1BJREVSX05FVF9NQUNNT0RFX1ZBTFVFCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1BJREVSX05FVF9CVVJTVExNVF9WQUxVRQkweDAwMDAwMjAwIC8qIGFib3V0IDE2IHVzICovCisKKy8qIDEoMCkJCQkJCWVuYWJsZSByL3R4IGRtYQorICogIDAwMDAwMDAJCQkJZml4ZWQgdG8gMAorICoKKyAqICAgICAgICAgMDAwMDAwCQkJZml4ZWQgdG8gMAorICogICAgICAgICAgICAgICAwKDEpCQkJZW4vZGlzYWJsZSBkZXNjciB3cml0ZWJhY2sgb24gZm9yY2UgZW5kCisgKiAgICAgICAgICAgICAgICAwKDEpCQkJZm9yY2UgZW5kCisgKgorICogICAgICAgICAgICAgICAgIDAwMDAwMAkJZml4ZWQgdG8gMAorICogICAgICAgICAgICAgICAgICAgICAgIDAwCQlidXJzdCBhbGlnbm1lbnQ6IDEyOCBieXRlcworICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAlkZXNjciB3cml0ZWJhY2sgc2l6ZSAzMiBieXRlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCgxKQlkZXNjciBjaGFpbiBlbmQgaW50ZXJydXB0IGVuYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAoMSkJZGVzY3Igc3RhdHVzIHdyaXRlYmFjayBlbmFibGUgKi8KKworLyogdG8gc2V0IFJYX0RNQV9FTiAqLworI2RlZmluZSBTUElERVJfTkVUX0RNQV9SWF9WQUxVRQkJMHg4MDAwMDAwMAorI2RlZmluZSBTUElERVJfTkVUX0RNQV9SWF9GRU5EX1ZBTFVFCTB4MDAwMzAwMDMKKy8qIHRvIHNldCBUWF9ETUFfRU4gKi8KKyNkZWZpbmUgU1BJREVSX05FVF9ETUFfVFhfVkFMVUUJCTB4ODAwMDAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9ETUFfVFhfRkVORF9WQUxVRQkweDAwMDMwMDAzCisKKy8qIFNQSURFUl9ORVRfVUFfREVTQ1JfVkFMVUUgaXMgT1InZWQgd2l0aCB0aGUgdW5pY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIFNQSURFUl9ORVRfVUFfREVTQ1JfVkFMVUUJMHgwMDA4MDAwMAorI2RlZmluZSBTUElERVJfTkVUX1BST01JU0NfVkFMVUUJMHgwMDA4MDAwMAorI2RlZmluZSBTUElERVJfTkVUX05PTlBST01JU0NfVkFMVUUJMHgwMDAwMDAwMAorCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BU0VMX1ZBTFVFCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgU1BJREVSX05FVF9FQ01PREVfVkFMVUUJCTB4MDAwMDAwMDAKKworI2RlZmluZSBTUElERVJfTkVUX0NLUkNUUkxfUlVOX1ZBTFVFCTB4MWZmZjAxMGYKKyNkZWZpbmUgU1BJREVSX05FVF9DS1JDVFJMX1NUT1BfVkFMVUUJMHgwMDAwMDEwZgorCisjZGVmaW5lIFNQSURFUl9ORVRfU0JJTVNUQVRFX1ZBTFVFCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9TQlRNU1RBVEVfVkFMVUUJMHgwMDAwMDAwMAorCisvKiBTUElERVJfTkVUX0dISUlOVDBTVFMgYml0cywgaW4gcmV2ZXJzZSBvcmRlciBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQKKyAqIHdpdGggMSA8PCBTUElERVJfTkVUXy4uLiAqLworZW51bSBzcGlkZXJfbmV0X2ludDBfc3RhdHVzIHsKKwlTUElERVJfTkVUX0dQSFlJTlQgPSAwLAorCVNQSURFUl9ORVRfR01BQzJJTlQsCisJU1BJREVSX05FVF9HTUFDMUlOVCwKKwlTUElERVJfTkVUX0dJUFNJTlQsCisJU1BJREVSX05FVF9HRklGT0lOVCwKKwlTUElERVJfTkVUX0dETUFDSU5ULAorCVNQSURFUl9ORVRfR1NZU0lOVCwKKwlTUElERVJfTkVUX0dQV09QQ01QSU5ULAorCVNQSURFUl9ORVRfR1BST1BDTVBJTlQsCisJU1BJREVSX05FVF9HUFdGRklOVCwKKwlTUElERVJfTkVUX0dSTURBRFJJTlQsCisJU1BJREVSX05FVF9HUk1BUlBJTlQsCisJU1BJREVSX05FVF9HUk1NUElOVCwKKwlTUElERVJfTkVUX0dEVERFTjBJTlQsCisJU1BJREVSX05FVF9HRERERU4wSU5ULAorCVNQSURFUl9ORVRfR0RDREVOMElOVCwKKwlTUElERVJfTkVUX0dEQkRFTjBJTlQsCisJU1BJREVSX05FVF9HREFERU4wSU5ULAorCVNQSURFUl9ORVRfR0RURkRDSU5ULAorCVNQSURFUl9ORVRfR0RERkRDSU5ULAorCVNQSURFUl9ORVRfR0RDRkRDSU5ULAorCVNQSURFUl9ORVRfR0RCRkRDSU5ULAorCVNQSURFUl9ORVRfR0RBRkRDSU5ULAorCVNQSURFUl9ORVRfR1RURURJTlQsCisJU1BJREVSX05FVF9HRFREQ0VJTlQsCisJU1BJREVSX05FVF9HUkZETk1JTlQsCisJU1BJREVSX05FVF9HUkZDTk1JTlQsCisJU1BJREVSX05FVF9HUkZCTk1JTlQsCisJU1BJREVSX05FVF9HUkZBTk1JTlQsCisJU1BJREVSX05FVF9HUkZOTUlOVCwKKwlTUElERVJfTkVUX0cxVE1DTlRJTlQsCisJU1BJREVSX05FVF9HRlJFRUNOVElOVAorfTsKKy8qIEdISUlOVDFTVFMgYml0cyAqLworZW51bSBzcGlkZXJfbmV0X2ludDFfc3RhdHVzIHsKKwlTUElERVJfTkVUX0dUTUZMTElOVCA9IDAsCisJU1BJREVSX05FVF9HUk1GTExJTlQsCisJU1BJREVSX05FVF9HVE1TSFRJTlQsCisJU1BJREVSX05FVF9HRFRJTlZESU5ULAorCVNQSURFUl9ORVRfR1JGREZMTElOVCwKKwlTUElERVJfTkVUX0dERERDRUlOVCwKKwlTUElERVJfTkVUX0dERElOVkRJTlQsCisJU1BJREVSX05FVF9HUkZDRkxMSU5ULAorCVNQSURFUl9ORVRfR0RDRENFSU5ULAorCVNQSURFUl9ORVRfR0RDSU5WRElOVCwKKwlTUElERVJfTkVUX0dSRkJGTExJTlQsCisJU1BJREVSX05FVF9HREJEQ0VJTlQsCisJU1BJREVSX05FVF9HREJJTlZESU5ULAorCVNQSURFUl9ORVRfR1JGQUZMTElOVCwKKwlTUElERVJfTkVUX0dEQURDRUlOVCwKKwlTUElERVJfTkVUX0dEQUlOVkRJTlQsCisJU1BJREVSX05FVF9HRFRSU0VSSU5ULAorCVNQSURFUl9ORVRfR0REUlNFUklOVCwKKwlTUElERVJfTkVUX0dEQ1JTRVJJTlQsCisJU1BJREVSX05FVF9HREJSU0VSSU5ULAorCVNQSURFUl9ORVRfR0RBUlNFUklOVCwKKwlTUElERVJfTkVUX0dEU0VSSU5ULAorCVNQSURFUl9ORVRfR0RUUFRFUklOVCwKKwlTUElERVJfTkVUX0dERFBURVJJTlQsCisJU1BJREVSX05FVF9HRENQVEVSSU5ULAorCVNQSURFUl9ORVRfR0RCUFRFUklOVCwKKwlTUElERVJfTkVUX0dEQVBURVJJTlQKK307CisvKiBHSElJTlQyU1RTIGJpdHMgKi8KK2VudW0gc3BpZGVyX25ldF9pbnQyX3N0YXR1cyB7CisJU1BJREVSX05FVF9HUFJPUEVSSU5UID0gMCwKKwlTUElERVJfTkVUX0dNQ1RDUlNOR0lOVCwKKwlTUElERVJfTkVUX0dNQ1RMQ09MSU5ULAorCVNQSURFUl9ORVRfR01DVFRNT1RJTlQsCisJU1BJREVSX05FVF9HTUNSQ0FFUklOVCwKKwlTUElERVJfTkVUX0dNQ1JDQUxFUklOVCwKKwlTUElERVJfTkVUX0dNQ1JBTE5FUklOVCwKKwlTUElERVJfTkVUX0dNQ1JPVlJJTlQsCisJU1BJREVSX05FVF9HTUNSUk5USU5ULAorCVNQSURFUl9ORVRfR01DUlJYRVJJTlQsCisJU1BJREVSX05FVF9HVElUQ1NFUklOVCwKKwlTUElERVJfTkVUX0dUSUZNVEVSSU5ULAorCVNQSURFUl9ORVRfR1RJUEtUUlZLSU5ULAorCVNQSURFUl9ORVRfR1RJU1BJTkdJTlQsCisJU1BJREVSX05FVF9HVElTQUROR0lOVCwKKwlTUElERVJfTkVUX0dUSVNQRE5HSU5ULAorCVNQSURFUl9ORVRfR1JJRk1URVJJTlQsCisJU1BJREVSX05FVF9HUklQS1RSVktJTlQsCisJU1BJREVSX05FVF9HUklTUElOR0lOVCwKKwlTUElERVJfTkVUX0dSSVNBRE5HSU5ULAorCVNQSURFUl9ORVRfR1JJU1BETkdJTlQKK307CisKKyNkZWZpbmUgU1BJREVSX05FVF9UWElOVAkoICgxIDw8IFNQSURFUl9ORVRfR1RURURJTlQpIHwgXAorCQkJCSAgKDEgPDwgU1BJREVSX05FVF9HRFREQ0VJTlQpIHwgXAorCQkJCSAgKDEgPDwgU1BJREVSX05FVF9HRFRGRENJTlQpICkKKworLyogd2UgcmVseSBvbiBmbGFnZ2VkIGRlc2NyaXB0b3IgaW50ZXJydXB0cyovCisjZGVmaW5lIFNQSURFUl9ORVRfUlhJTlQJKCAoMSA8PCBTUElERVJfTkVUX0dEQUZEQ0lOVCkgfCBcCisJCQkJICAoMSA8PCBTUElERVJfTkVUX0dSTUZMTElOVCkgKQorCisjZGVmaW5lIFNQSURFUl9ORVRfR1BSRVhFQwkJMHg4MDAwMDAwMAorI2RlZmluZSBTUElERVJfTkVUX0dQUkRBVF9NQVNLCQkweDAwMDBmZmZmCisKKy8qIGRlc2NyaXB0b3IgYml0cworICoKKyAqIDEwMTAJCQkJCWRlc2NyaXB0b3IgcmVhZHkKKyAqICAgICAwCQkJCWRlc2NyIGluIG1pZGRsZSBvZiBjaGFpbgorICogICAgICAwMDAJCQkJZml4ZWQgdG8gMAorICoKKyAqICAgICAgICAgMAkJCQlubyBpbnRlcnJ1cHQgb24gY29tcGxldGlvbgorICogICAgICAgICAgMDAwCQkJCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgIDEJCQlubyBpcHNlYyBwcm9jZXNzaW5nCisgKiAgICAgICAgICAgICAgMQkJCWxhc3QgZGVzY3JpcHRvciBmb3IgdGhpcyBmcmFtZQorICogICAgICAgICAgICAgICAwMAkJCW5vIGNoZWNrc3VtCisgKiAgICAgICAgICAgICAgIDEwCQkJdGNwIGNoZWNrc3VtCisgKiAgICAgICAgICAgICAgIDExCQkJdWRwIGNoZWNrc3VtCisgKgorICogICAgICAgICAgICAgICAgIDAwCQkJZml4ZWQgdG8gMAorICogICAgICAgICAgICAgICAgICAgMAkJCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgICAgICAgICAwCQkJbm8gaW50ZXJydXB0IG9uIHJlc3BvbnNlIGVycm9ycworICogICAgICAgICAgICAgICAgICAgICAwCQlubyBpbnRlcnJ1cHQgb24gaW52YWxpZCBkZXNjcgorICogICAgICAgICAgICAgICAgICAgICAgMAkJbm8gaW50ZXJydXB0IG9uIGRtYSBwcm9jZXNzIHRlcm1pbmF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgMAkJbm8gaW50ZXJydXB0IG9uIGRlc2NyIGNoYWluIGVuZAorICogICAgICAgICAgICAgICAgICAgICAgICAwCQlubyBpbnRlcnJ1cHQgb24gZGVzY3IgY29tcGxldGUKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAwMDAJCWZpeGVkIHRvIDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAJCXJlc3BvbnNlIGVycm9yIGludGVycnVwdCBzdGF0dXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCWludmFsaWQgZGVzY3Igc3RhdHVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAJZG1hIHRlcm1pbmF0aW9uIHN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAlkZXNjciBjaGFpbiBlbmQgc3RhdHVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAlkZXNjciBjb21wbGV0ZSBzdGF0dXMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9ETUFDX0NNRFNUQVRfTk9DUwkweGEwMGMwMDAwCisjZGVmaW5lIFNQSURFUl9ORVRfRE1BQ19DTURTVEFUX1RDUENTCTB4YTAwZTAwMDAKKyNkZWZpbmUgU1BJREVSX05FVF9ETUFDX0NNRFNUQVRfVURQQ1MJMHhhMDBmMDAwMAorI2RlZmluZSBTUElERVJfTkVUX0RFU0NSX0lORF9QUk9DX1NISUZUCTI4CisjZGVmaW5lIFNQSURFUl9ORVRfREVTQ1JfSU5EX1BST0NfTUFTS08JMHgwZmZmZmZmZgorCisvKiBkZXNjciByZWFkeSwgZGVzY3IgaXMgaW4gbWlkZGxlIG9mIGNoYWluLCBnZXQgaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgU1BJREVSX05FVF9ETUFDX1JYX0NBUkRPV05FRAkweGEwODAwMDAwCisKKy8qIG11bHRpY2FzdCBpcyBubyBwcm9ibGVtICovCisjZGVmaW5lIFNQSURFUl9ORVRfREFUQV9FUlJPUl9NQVNLCTB4ZmZmZmJmZmYKKworZW51bSBzcGlkZXJfbmV0X2Rlc2NyX3N0YXR1cyB7CisJU1BJREVSX05FVF9ERVNDUl9DT01QTEVURQkJPSAweDAwLCAvKiB1c2VkIGluIHJ4IGFuZCB0eCAqLworCVNQSURFUl9ORVRfREVTQ1JfUkVTUE9OU0VfRVJST1IJCT0gMHgwMSwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KKwlTUElERVJfTkVUX0RFU0NSX1BST1RFQ1RJT05fRVJST1IJPSAweDAyLCAvKiB1c2VkIGluIHJ4IGFuZCB0eCAqLworCVNQSURFUl9ORVRfREVTQ1JfRlJBTUVfRU5ECQk9IDB4MDQsIC8qIHVzZWQgaW4gcnggKi8KKwlTUElERVJfTkVUX0RFU0NSX0ZPUkNFX0VORAkJPSAweDA1LCAvKiB1c2VkIGluIHJ4IGFuZCB0eCAqLworCVNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVECQk9IDB4MGEsIC8qIHVzZWQgaW4gcnggYW5kIHR4ICovCisJU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFIC8qIGFueSBvdGhlciB2YWx1ZSAqLworfTsKKworc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgeworCS8qIGFzIGRlZmluZWQgYnkgdGhlIGhhcmR3YXJlICovCisJZG1hX2FkZHJfdCBidWZfYWRkcjsKKwl1MzIgYnVmX3NpemU7CisJZG1hX2FkZHJfdCBuZXh0X2Rlc2NyX2FkZHI7CisJdTMyIGRtYWNfY21kX3N0YXR1czsKKwl1MzIgcmVzdWx0X3NpemU7CisJdTMyIHZhbGlkX3NpemU7CS8qIGFsbCB6ZXJvZXMgZm9yIHR4ICovCisJdTMyIGRhdGFfc3RhdHVzOworCXUzMiBkYXRhX2Vycm9yOwkvKiBhbGwgemVyb2VzIGZvciB0eCAqLworCisJLyogdXNlZCBpbiB0aGUgZHJpdmVyICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IGJ1c19hZGRyOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpuZXh0OworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpwcmV2OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCitzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiB7CisJLyogd2Ugd2FsayBmcm9tIHRhaWwgdG8gaGVhZCAqLworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpoZWFkOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICp0YWlsOworfTsKKworLyogZGVzY3JpcHRvciBkYXRhX3N0YXR1cyBiaXRzICovCisjZGVmaW5lIFNQSURFUl9ORVRfUlhJUENISwkJMjkKKyNkZWZpbmUgU1BJREVSX05FVF9UQ1BVRFBJUENISwkJMjgKKyNkZWZpbmUgU1BJREVSX05FVF9EQVRBX1NUQVRVU19DSEtfTUFTSwkoMSA8PCBTUElERVJfTkVUX1JYSVBDSEsgfCBcCisJCQkJCSAxIDw8IFNQSURFUl9ORVRfVENQVURQSVBDSEspCisKKyNkZWZpbmUgU1BJREVSX05FVF9WTEFOX1BBQ0tFVAkJMjEKKworLyogZGVzY3JpcHRvciBkYXRhX2Vycm9yIGJpdHMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9SWElQQ0hLRVJSCQkyNworI2RlZmluZSBTUElERVJfTkVUX1JYVENQQ0hLRVJSCQkyNgorI2RlZmluZSBTUElERVJfTkVUX0RBVEFfRVJST1JfQ0hLX01BU0sJKDEgPDwgU1BJREVSX05FVF9SWElQQ0hLRVJSIHwgXAorCQkJCQkgMSA8PCBTUElERVJfTkVUX1JYVENQQ0hLRVJSKQorCisvKiB0aGUgY2FzZXMgd2UgZG9uJ3QgcGFzcyB0aGUgcGFja2V0IHRvIHRoZSBzdGFjayAqLworI2RlZmluZSBTUElERVJfTkVUX0RFU1RST1lfUlhfRkxBR1MJMHg3MDEzODAwMAorCisjZGVmaW5lIFNQSURFUl9ORVRfREVTQ1JfU0laRQkJMzIKKworLyogdGhpcyB3aWxsIGJlIGJpZ2dlciBzb21lIHRpbWUgKi8KK3N0cnVjdCBzcGlkZXJfbmV0X29wdGlvbnMgeworCWludCByeF9jc3VtOyAvKiBmb3Igcng6IGlmIDAgaXBfc3VtbWVkPU5PTkUsCisJCQlpZiAxIGFuZCBodyBoYXMgdmVyaWZpZWQsIGlwX3N1bW1lZD1VTk5FQ0VTU0FSWSAqLworfTsKKworI2RlZmluZSBTUElERVJfTkVUX0RFRkFVTFRfTVNHCQkoIE5FVElGX01TR19EUlYgfCBcCisJCQkJCSAgTkVUSUZfTVNHX1BST0JFIHwgXAorCQkJCQkgIE5FVElGX01TR19MSU5LIHwgXAorCQkJCQkgIE5FVElGX01TR19USU1FUiB8IFwKKwkJCQkJICBORVRJRl9NU0dfSUZET1dOIHwgXAorCQkJCQkgIE5FVElGX01TR19JRlVQIHwgXAorCQkJCQkgIE5FVElGX01TR19SWF9FUlIgfCBcCisJCQkJCSAgTkVUSUZfTVNHX1RYX0VSUiB8IFwKKwkJCQkJICBORVRJRl9NU0dfVFhfUVVFVUVEIHwgXAorCQkJCQkgIE5FVElGX01TR19JTlRSIHwgXAorCQkJCQkgIE5FVElGX01TR19UWF9ET05FIHwgXAorCQkJCQkgIE5FVElGX01TR19SWF9TVEFUVVMgfCBcCisJCQkJCSAgTkVUSUZfTVNHX1BLVERBVEEgfCBcCisJCQkJCSAgTkVUSUZfTVNHX0hXIHwgXAorCQkJCQkgIE5FVElGX01TR19XT0wgKQorCitzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBtaWlfcGh5IHBoeTsKKworCXZvaWQgX19pb21lbSAqcmVnczsKKworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluIHR4X2NoYWluOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluIHJ4X2NoYWluOworCXNwaW5sb2NrX3QgY2hhaW5fbG9jazsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldGRldl9zdGF0czsKKworCXN0cnVjdCBzcGlkZXJfbmV0X29wdGlvbnMgb3B0aW9uczsKKworCXNwaW5sb2NrX3QgaW50bWFza19sb2NrOworCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKKwlhdG9taWNfdCB0eF90aW1lb3V0X3Rhc2tfY291bnRlcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKworCS8qIGZvciBldGh0b29sICovCisJaW50IG1zZ19lbmFibGU7CisKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciBkZXNjclswXTsKK307CisKKyNkZWZpbmUgcHJfZXJyKGZtdCxhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgZm10ICwjI2FyZykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXRfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0X2V0aHRvb2wuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIE5ldHdvcmsgZGV2aWNlIGRyaXZlciBmb3IgQ2VsbCBQcm9jZXNzb3ItQmFzZWQgQmxhZGUKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1CisgKgorICogQXV0aG9ycyA6IFV0eiBCYWNoZXIgPHV0ei5iYWNoZXJAZGUuaWJtLmNvbT4KKyAqICAgICAgICAgICBKZW5zIE9zdGVya2FtcCA8SmVucy5Pc3RlcmthbXBAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAic3BpZGVyX25ldC5oIgorCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZDsKKwljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWNtZC0+c3VwcG9ydGVkICAgPSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSAgICAgU1VQUE9SVEVEX0ZJQlJFKTsKKwljbWQtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJICAgICBBRFZFUlRJU0VEX0ZJQlJFKTsKKwljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCWNtZC0+c3BlZWQgPSBjYXJkLT5waHkuc3BlZWQ7CisJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCWNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogY2xlYXIgYW5kIGZpbGwgb3V0IGluZm8gKi8KKwltZW1zZXQoZHJ2aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBldGh0b29sX2RydmluZm8pKTsKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgc3BpZGVyX25ldF9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgIjAuMSIsIDMyKTsKKwlzdHJjcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIm5vIGluZm9ybWF0aW9uIik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoY2FyZC0+cGRldiksIDMyKTsKK30KKworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfZXRodG9vbF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKQoreworCS8qIG5vIHN1cHBvcnQgZm9yIHdvbCAqLworCXdvbGluZm8tPnN1cHBvcnRlZCA9IDA7CisJd29saW5mby0+d29sb3B0cyA9IDA7Cit9CisKK3N0YXRpYyB1MzIKK3NwaWRlcl9uZXRfZXRodG9vbF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCWNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBjYXJkLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZAorc3BpZGVyX25ldF9ldGh0b29sX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOworCWNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWNhcmQtPm1zZ19lbmFibGUgPSBsZXZlbDsKK30KKworc3RhdGljIGludAorc3BpZGVyX25ldF9ldGh0b29sX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCXNwaWRlcl9uZXRfc3RvcChuZXRkZXYpOworCQlzcGlkZXJfbmV0X29wZW4obmV0ZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIKK3NwaWRlcl9uZXRfZXRodG9vbF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXYtPnByaXY7CisKKwlyZXR1cm4gY2FyZC0+b3B0aW9ucy5yeF9jc3VtOworfQorCitzdGF0aWMgaW50CitzcGlkZXJfbmV0X2V0aHRvb2xfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIG4pCit7CisJc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCA9IG5ldGRldi0+cHJpdjsKKworCWNhcmQtPm9wdGlvbnMucnhfY3N1bSA9IG47CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBzcGlkZXJfbmV0X2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gc3BpZGVyX25ldF9ldGh0b29sX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gc3BpZGVyX25ldF9ldGh0b29sX2dldF9kcnZpbmZvLAorCS5nZXRfd29sCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfd29sLAorCS5nZXRfbXNnbGV2ZWwJCT0gc3BpZGVyX25ldF9ldGh0b29sX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9zZXRfbXNnbGV2ZWwsCisJLm53YXlfcmVzZXQJCT0gc3BpZGVyX25ldF9ldGh0b29sX253YXlfcmVzZXQsCisJLmdldF9yeF9jc3VtCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JCT0gc3BpZGVyX25ldF9ldGh0b29sX3NldF9yeF9jc3VtLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwppbmRleCAxZjQzYmJmLi41YzhmY2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAjZGVmaW5lCU1FTQlscC0+bWVtCiAjZGVmaW5lCURSRUcJbHAtPmlvYmFzZVswXQogI2RlZmluZQlBUkVHCWxwLT5pb2Jhc2VbMV0KLSNkZWZpbmUJUkVHQShhKQkoIEFSRUcgPSAoYSksIERSRUcgKQorI2RlZmluZQlSRUdBKGEpCSgqKCBBUkVHID0gKGEpLCAmRFJFRyApKQogCiAvKiBEZWZpbml0aW9ucyBmb3IgdGhlIExhbmNlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggM2Y2N2E0Mi4uZGUzOTk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTI4MTcsNyArMjgxNyw3IEBACiAKICNpZiAoIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpKQogLyogRmV0Y2ggTUFDIGFkZHJlc3MgZnJvbSB2aXRhbCBwcm9kdWN0IGRhdGEgb2YgUENJIFJPTS4gKi8KLXN0YXRpYyB2b2lkIGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQorc3RhdGljIGludCBmaW5kX2V0aF9hZGRyX2luX3ZwZCh2b2lkIF9faW9tZW0gKnJvbV9iYXNlLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKIHsKIAlpbnQgdGhpc19vZmZzZXQ7CiAKQEAgLTI4MzgsMzUgKzI4MzgsMjcgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkJZGV2X2FkZHJbaV0gPSByZWFkYihwICsgaSk7Ci0JCWJyZWFrOworCQlyZXR1cm4gMTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGdldF9nZW1fbWFjX25vbm9icChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCiB7Ci0JdTMyIHJvbV9yZWdfb3JpZzsKLQl2b2lkIF9faW9tZW0gKnA7CisJc2l6ZV90IHNpemU7CisJdm9pZCBfX2lvbWVtICpwID0gcGNpX21hcF9yb20ocGRldiwgJnNpemUpOwogCi0JaWYgKHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnBhcmVudCA9PSBOVUxMKSB7Ci0JCWlmIChwY2lfYXNzaWduX3Jlc291cmNlKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpIDwgMCkKLQkJCWdvdG8gdXNlX3JhbmRvbTsKKwlpZiAocCkgeworCQkJaW50IGZvdW5kOworCisJCWZvdW5kID0gcmVhZGIocCkgPT0gMHg1NSAmJgorCQkJcmVhZGIocCArIDEpID09IDB4YWEgJiYKKwkJCWZpbmRfZXRoX2FkZHJfaW5fdnBkKHAsICg2NCAqIDEwMjQpLCBkZXZfYWRkcik7CisJCXBjaV91bm1hcF9yb20ocGRldiwgcCk7CisJCWlmIChmb3VuZCkKKwkJCXJldHVybjsKIAl9CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCAmcm9tX3JlZ19vcmlnKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywKLQkJCSAgICAgICByb21fcmVnX29yaWcgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKLQotCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSwgKDY0ICogMTAyNCkpOwotCWlmIChwICE9IE5VTEwgJiYgcmVhZGIocCkgPT0gMHg1NSAmJiByZWFkYihwICsgMSkgPT0gMHhhYSkKLQkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGRldl9hZGRyKTsKLQotCWlmIChwICE9IE5VTEwpCi0JCWlvdW5tYXAocCk7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX3JlZ19vcmlnKTsKLQlyZXR1cm47Ci0KLXVzZV9yYW5kb206CiAJLyogU3VuIE1BQyBwcmVmaXggdGhlbiAzIHJhbmRvbSBieXRlcy4gKi8KIAlkZXZfYWRkclswXSA9IDB4MDg7CiAJZGV2X2FkZHJbMV0gPSAweDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwppbmRleCBmMDJmZTQxLi45ZjA0NmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5obWUuYworKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMjk1NCw3ICsyOTU0LDcgQEAKIH0KIAogLyogRmV0Y2ggTUFDIGFkZHJlc3MgZnJvbSB2aXRhbCBwcm9kdWN0IGRhdGEgb2YgUENJIFJPTS4gKi8KLXN0YXRpYyB2b2lkIGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCitzdGF0aWMgaW50IGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCiB7CiAJaW50IHRoaXNfb2Zmc2V0OwogCkBAIC0yOTc3LDQyICsyOTc3LDMzIEBACiAKIAkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCQkJZGV2X2FkZHJbaV0gPSByZWFkYihwICsgaSk7Ci0JCQlicmVhazsKKwkJCXJldHVybiAxOwogCQl9CiAJCWluZGV4LS07CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBnZXRfaG1lX21hY19ub25zcGFyYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCiB7Ci0JdTMyIHJvbV9yZWdfb3JpZzsKLQl2b2lkIF9faW9tZW0gKnA7Ci0JaW50IGluZGV4OworCXNpemVfdCBzaXplOworCXZvaWQgX19pb21lbSAqcCA9IHBjaV9tYXBfcm9tKHBkZXYsICZzaXplKTsKIAotCWluZGV4ID0gMDsKLQlpZiAoaXNfcXVhdHRyb19wKHBkZXYpKQotCQlpbmRleCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwlpZiAocCkgeworCQlpbnQgaW5kZXggPSAwOworCQlpbnQgZm91bmQ7CiAKLQlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0ucGFyZW50ID09IE5VTEwpIHsKLQkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGRldiwgUENJX1JPTV9SRVNPVVJDRSkgPCAwKQotCQkJZ290byB1c2VfcmFuZG9tOworCQlpZiAoaXNfcXVhdHRyb19wKHBkZXYpKQorCQkJaW5kZXggPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisKKwkJZm91bmQgPSByZWFkYihwKSA9PSAweDU1ICYmCisJCQlyZWFkYihwICsgMSkgPT0gMHhhYSAmJgorCQkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGluZGV4LCBkZXZfYWRkcik7CisJCXBjaV91bm1hcF9yb20ocGRldiwgcCk7CisJCWlmIChmb3VuZCkKKwkJCXJldHVybjsKIAl9CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCAmcm9tX3JlZ19vcmlnKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywKLQkJCSAgICAgICByb21fcmVnX29yaWcgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKLQotCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSwgKDY0ICogMTAyNCkpOwotCWlmIChwICE9IE5VTEwgJiYgcmVhZGIocCkgPT0gMHg1NSAmJiByZWFkYihwICsgMSkgPT0gMHhhYSkKLQkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGluZGV4LCBkZXZfYWRkcik7Ci0KLQlpZiAocCAhPSBOVUxMKQotCQlpb3VubWFwKHApOwotCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsIHJvbV9yZWdfb3JpZyk7Ci0JcmV0dXJuOwotCi11c2VfcmFuZG9tOgogCS8qIFN1biBNQUMgcHJlZml4IHRoZW4gMyByYW5kb20gYnl0ZXMuICovCiAJZGV2X2FkZHJbMF0gPSAweDA4OwogCWRldl9hZGRyWzFdID0gMHgwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCmluZGV4IDkzODAwYzEuLmVlNDhiZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMjE0NCw5ICsyMTQ0LDkgQEAKICAgICB1X2xvbmcgaW9iYXNlID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB1cHBlciAzMiBiaXRzIGluIEFscGhhcyAqLwogICAgIGludCBpLCBqLCBjZnJ2OwogICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqd2FsayA9ICZwZGV2LT5idXNfbGlzdDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3YWxrOwogCi0gICAgZm9yICh3YWxrID0gd2Fsay0+bmV4dDsgd2FsayAhPSAmcGRldi0+YnVzX2xpc3Q7IHdhbGsgPSB3YWxrLT5uZXh0KSB7CisgICAgbGlzdF9mb3JfZWFjaCh3YWxrLCAmcGRldi0+YnVzX2xpc3QpIHsKIAlzdHJ1Y3QgcGNpX2RldiAqdGhpc19kZXYgPSBwY2lfZGV2X2Iod2Fsayk7CiAKIAkvKiBTa2lwIHRoZSBwY2lfYnVzIGxpc3QgZW50cnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMgYi9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jCmluZGV4IGY1OGM3OTQuLmI1NmE3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwpAQCAtMTQ0MCw2ICsxNDQwLDcgQEAKICAqCUBza2I6CVRoZSBidWZmZXIgdG8gcHJvY2VzcwogICoJQGRldjoJVGhlIGRldmljZSBpdCBhcnJpdmVkIG9uCiAgKglAcDogVW51c2VkCisgKglAb3JpZ19kZXY6IFVudXNlZAogICoKICAqCVByb3RvY29sIGdsdWUuIFRoaXMgZHJpdmVzIHRoZSBkZWZlcnJlZCBwcm9jZXNzaW5nIG1vZGUgdGhlIHBvb3JlcgogICoJY2FyZHMgdXNlLiBUaGlzIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2FyZHMgdGhhdCBkbyBub3QgaGF2ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IGRiY2I1YThhLi4yYmU2NWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC0zMjU4LDcgKzMyNTgsNyBAQAogCQkJCXdzdGF0cy5ub2lzZSA9IGFwcml2LT53c3RhdHMucXVhbC5ub2lzZTsKIAkJCQl3c3RhdHMudXBkYXRlZCA9IElXX1FVQUxfTEVWRUxfVVBEQVRFRAogCQkJCQl8IElXX1FVQUxfUVVBTF9VUERBVEVECi0JCQkJCXwgSVdfUVVBTF9OT0lTRV9VUERBVEVEOworCQkJCQl8IElXX1FVQUxfREJNOwogCQkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLwogCQkJCXdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBzYSwgJndzdGF0cyk7CiAJCQl9CkBAIC0zNjA0LDcgKzM2MDQsNyBAQAogCQl3c3RhdHMubm9pc2UgPSBhaS0+d3N0YXRzLnF1YWwubm9pc2U7CiAJCXdzdGF0cy51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQKIAkJCXwgSVdfUVVBTF9MRVZFTF9VUERBVEVECi0JCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKKwkJCXwgSVdfUVVBTF9EQk07CiAJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLwogCQl3aXJlbGVzc19zcHlfdXBkYXRlKGFpLT5kZXYsIHNhLCAmd3N0YXRzKTsKIAl9CkBAIC02NDg5LDIyICs2NDg5LDIwIEBACiAJCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwkvKiAlICovCiAJZWxzZQogCQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IGFpcm9fZ2V0X21heF9xdWFsaXR5KCZjYXBfcmlkKTsKLQlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOwkvKiAwIG1lYW5zIHdlIHVzZSBkQm0gICovCi0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKLQlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMHgxMDAgLSAxMjA7CS8qIC0xMjAgZEJtICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMHgxMDAgLSAxMjA7CS8qIC0xMjAgZEJtICovCiAKIAkvKiBFeHBlcmltZW50YWwgbWVhc3VyZW1lbnRzIC0gYm91bmRhcnkgMTEvNS41IE1iL3MgKi8KIAkvKiBOb3RlIDogd2l0aCBvciB3aXRob3V0IHRoZSAobG9jYWwtPnJzc2kpLCByZXN1bHRzCiAJICogYXJlIHNvbWV3aGF0IGRpZmZlcmVudC4gLSBKZWFuIElJICovCiAJaWYgKGxvY2FsLT5yc3NpKSB7Ci0JCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNTA7CS8qICUgKi8KLQkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMTg2OwkvKiAtNzAgZEJtICovCisJCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNTA7CQkvKiAlICovCisJCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDB4MTAwIC0gNzA7CS8qIC03MCBkQm0gKi8KIAl9IGVsc2UgewogCQlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IGFpcm9fZ2V0X2F2Z19xdWFsaXR5KCZjYXBfcmlkKTsKLQkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMTc2OwkvKiAtODAgZEJtICovCisJCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDB4MTAwIC0gODA7CS8qIC04MCBkQm0gKi8KIAl9Ci0JcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKLQlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMHgxMDAgLSA4NTsJCS8qIC04NSBkQm0gKi8KIAogCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CiAJCXJhbmdlLT5iaXRyYXRlW2ldID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXSAqIDUwMDAwMDsKQEAgLTY3MjcsMTUgKzY3MjUsMTcgQEAKIAkJaWYgKGxvY2FsLT5yc3NpKSB7CiAJCQlxdWFsW2ldLmxldmVsID0gMHgxMDAgLSBCU1NMaXN0LmRCbTsKIAkJCXF1YWxbaV0ucXVhbCA9IGFpcm9fZGJtX3RvX3BjdCggbG9jYWwtPnJzc2ksIEJTU0xpc3QuZEJtICk7Ci0JCQlxdWFsW2ldLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfVVBEQVRFRDsKKwkJCXF1YWxbaV0udXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVECisJCQkJCXwgSVdfUVVBTF9MRVZFTF9VUERBVEVECisJCQkJCXwgSVdfUVVBTF9EQk07CiAJCX0gZWxzZSB7CiAJCQlxdWFsW2ldLmxldmVsID0gKEJTU0xpc3QuZEJtICsgMzIxKSAvIDI7CiAJCQlxdWFsW2ldLnF1YWwgPSAwOwotCQkJcXVhbFtpXS51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJCQlxdWFsW2ldLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfSU5WQUxJRAorCQkJCQl8IElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJCQl8IElXX1FVQUxfREJNOwogCQl9CiAJCXF1YWxbaV0ubm9pc2UgPSBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2U7Ci0JCXF1YWxbaV0udXBkYXRlZCA9IElXX1FVQUxfTEVWRUxfVVBEQVRFRAotCQkJCXwgSVdfUVVBTF9OT0lTRV9VUERBVEVEOwogCQlpZiAoQlNTTGlzdC5pbmRleCA9PSAweGZmZmYpCiAJCQlicmVhazsKIAl9CkBAIC02ODYxLDE1ICs2ODYxLDE3IEBACiAJaWYgKGFpLT5yc3NpKSB7CiAJCWl3ZS51LnF1YWwubGV2ZWwgPSAweDEwMCAtIGJzcy0+ZEJtOwogCQlpd2UudS5xdWFsLnF1YWwgPSBhaXJvX2RibV90b19wY3QoIGFpLT5yc3NpLCBic3MtPmRCbSApOwotCQlpd2UudS5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfVVBEQVRFRDsKKwkJaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQKKwkJCQl8IElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJCXwgSVdfUVVBTF9EQk07CiAJfSBlbHNlIHsKIAkJaXdlLnUucXVhbC5sZXZlbCA9IChic3MtPmRCbSArIDMyMSkgLyAyOwogCQlpd2UudS5xdWFsLnF1YWwgPSAwOwotCQlpd2UudS5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfSU5WQUxJRDsKKwkJaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQKKwkJCQl8IElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJCXwgSVdfUVVBTF9EQk07CiAJfQogCWl3ZS51LnF1YWwubm9pc2UgPSBhaS0+d3N0YXRzLnF1YWwubm9pc2U7Ci0JaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9MRVZFTF9VUERBVEVECi0JCQl8IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKIAljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwogCiAJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLwpAQCAtNzIyMiwxMyArNzIyNCwxMiBAQAogCQlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSAoc3RhdHVzX3JpZC5ub3JtYWxpemVkU2lnbmFsU3RyZW5ndGggKyAzMjEpIC8gMjsKIAkJbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBhaXJvX2dldF9xdWFsaXR5KCZzdGF0dXNfcmlkLCAmY2FwX3JpZCk7CiAJfQotCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQgfCBJV19RVUFMX0xFVkVMX1VQREFURUQ7CiAJaWYgKHN0YXR1c19yaWQubGVuID49IDEyNCkgewogCQlsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSAweDEwMCAtIHN0YXR1c19yaWQubm9pc2VkQm07Ci0JCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfVVBEQVRFRDsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CiAJfSBlbHNlIHsKIAkJbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gMDsKLQkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCQlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVEIHwgSVdfUVVBTF9OT0lTRV9JTlZBTElEIHwgSVdfUVVBTF9EQk07CiAJfQogCiAJLyogUGFja2V0cyBkaXNjYXJkZWQgaW4gdGhlIHdpcmVsZXNzIGFkYXB0ZXIgZHVlIHRvIHdpcmVsZXNzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwppbmRleCBmNDhhNmU3Li41ODc4NjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTE1OTMsNyArMTU5Myw2IEBACiAJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBhdG1lbF9zZXRfbWFjX2FkZHJlc3M7CiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGFydF90eDsKIAlkZXYtPmdldF9zdGF0cyA9IGF0bWVsX2dldF9zdGF0czsKLQlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IGF0bWVsX2dldF93aXJlbGVzc19zdGF0czsKIAlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZhdG1lbF9oYW5kbGVyX2RlZjsKIAlkZXYtPmRvX2lvY3RsID0gYXRtZWxfaW9jdGw7CiAJZGV2LT5pcnEgPSBpcnE7CkBAIC0yNDExLDcgKzI0MTAsOCBAQAogCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLCAKIAkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9oYW5kbGVyLAogCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgYXRtZWxfcHJpdmF0ZV9oYW5kbGVyLCAKLQkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgYXRtZWxfcHJpdmF0ZV9hcmdzCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIGF0bWVsX3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gYXRtZWxfZ2V0X3dpcmVsZXNzX3N0YXRzCiB9OwogCiBzdGF0aWMgaW50IGF0bWVsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCkBAIC0yNDI0LDE5ICsyNDI0LDYgQEAKIAljaGFyIGRvbWFpbltSRUdET01BSU5TWisxXTsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DR0lXUFJJVjoKLQkJaWYod3JxLT51LmRhdGEucG9pbnRlcikgewotCQkJLyogU2V0IHRoZSBudW1iZXIgb2YgaW9jdGwgYXZhaWxhYmxlICovCi0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3NbMF0pOwotCQkJCi0JCQkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkJICh1X2NoYXIgKikgYXRtZWxfcHJpdmF0ZV9hcmdzLAotCQkJCQkgc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQogCWNhc2UgQVRNRUxJRElGQzoKIAkJd3JxLT51LnBhcmFtLnZhbHVlID0gQVRNRUxNQUdJQzsJCQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwppbmRleCAyYTNiZDYwLi5iN2YyNzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCkBAIC03Miw3ICs3Miw4IEBACiBzdGF0aWMgaW50IGlwd191cChzdHJ1Y3QgaXB3X3ByaXYgKik7CiBzdGF0aWMgdm9pZCBpcHdfZG93bihzdHJ1Y3QgaXB3X3ByaXYgKik7CiBzdGF0aWMgaW50IGlwd19jb25maWcoc3RydWN0IGlwd19wcml2ICopOwotc3RhdGljIGludCBpbml0X3N1cHBvcnRlZF9yYXRlcyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpwcmF0ZXMpOworc3RhdGljIGludCBpbml0X3N1cHBvcnRlZF9yYXRlcyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgKnByYXRlcyk7CiAKIHN0YXRpYyB1OCBiYW5kX2JfYWN0aXZlX2NoYW5uZWxbTUFYX0JfQ0hBTk5FTFNdID0gewogCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMApAQCAtMTAyLDcgKzEwMyw3IEBACiB9CiAKIHN0YXRpYyBjaGFyICpzbnByaW50X2xpbmUoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgIGNvbnN0IHU4ICpkYXRhLCB1MzIgbGVuLCB1MzIgb2ZzKQorCQkJICBjb25zdCB1OCAqIGRhdGEsIHUzMiBsZW4sIHUzMiBvZnMpCiB7CiAJaW50IG91dCwgaSwgaiwgbDsKIAljaGFyIGM7CkBAIC0xMzYsNyArMTM3LDcgQEAKIAlyZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgdm9pZCBwcmludGtfYnVmKGludCBsZXZlbCwgY29uc3QgdTggKmRhdGEsIHUzMiBsZW4pCitzdGF0aWMgdm9pZCBwcmludGtfYnVmKGludCBsZXZlbCwgY29uc3QgdTggKiBkYXRhLCB1MzIgbGVuKQogewogCWNoYXIgbGluZVs4MV07CiAJdTMyIG9mcyA9IDA7CkBAIC0xNjEsMjEgKzE2MiwyNCBAQAogc3RhdGljIHZvaWQgX2lwd193cml0ZV9yZWc4KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTggdmFsdWUpOwogc3RhdGljIGlubGluZSB2b2lkIGlwd193cml0ZV9yZWc4KHN0cnVjdCBpcHdfcHJpdiAqYSwgdTMyIGIsIHU4IGMpCiB7Ci0JSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfaW5kaXJlY3Q4KDB4JTA4WCwgMHglMDhYKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCAodTMyKShiKSwgKHUzMikoYykpOworCUlQV19ERUJVR19JTygiJXMgJWQ6IHdyaXRlX2luZGlyZWN0OCgweCUwOFgsIDB4JTA4WClcbiIsIF9fRklMRV9fLAorCQkgICAgIF9fTElORV9fLCAodTMyKSAoYiksICh1MzIpIChjKSk7CiAJX2lwd193cml0ZV9yZWc4KGEsIGIsIGMpOwogfQogCiBzdGF0aWMgdm9pZCBfaXB3X3dyaXRlX3JlZzE2KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTE2IHZhbHVlKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfd3JpdGVfcmVnMTYoc3RydWN0IGlwd19wcml2ICphLCB1MzIgYiwgdTE2IGMpCiB7Ci0JSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfaW5kaXJlY3QxNigweCUwOFgsIDB4JTA4WClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgKHUzMikoYiksICh1MzIpKGMpKTsKKwlJUFdfREVCVUdfSU8oIiVzICVkOiB3cml0ZV9pbmRpcmVjdDE2KDB4JTA4WCwgMHglMDhYKVxuIiwgX19GSUxFX18sCisJCSAgICAgX19MSU5FX18sICh1MzIpIChiKSwgKHUzMikgKGMpKTsKIAlfaXB3X3dyaXRlX3JlZzE2KGEsIGIsIGMpOwogfQogCiBzdGF0aWMgdm9pZCBfaXB3X3dyaXRlX3JlZzMyKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbHVlKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfd3JpdGVfcmVnMzIoc3RydWN0IGlwd19wcml2ICphLCB1MzIgYiwgdTMyIGMpCiB7Ci0JSVBXX0RFQlVHX0lPKCIlcyAlZDogd3JpdGVfaW5kaXJlY3QzMigweCUwOFgsIDB4JTA4WClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgKHUzMikoYiksICh1MzIpKGMpKTsKKwlJUFdfREVCVUdfSU8oIiVzICVkOiB3cml0ZV9pbmRpcmVjdDMyKDB4JTA4WCwgMHglMDhYKVxuIiwgX19GSUxFX18sCisJCSAgICAgX19MSU5FX18sICh1MzIpIChiKSwgKHUzMikgKGMpKTsKIAlfaXB3X3dyaXRlX3JlZzMyKGEsIGIsIGMpOwogfQogCkBAIC0xOTUsMjQgKzE5OSwzMCBAQAogIF9pcHdfd3JpdGUzMihpcHcsIG9mcywgdmFsKQogCiAjZGVmaW5lIF9pcHdfcmVhZDgoaXB3LCBvZnMpIHJlYWRiKChpcHcpLT5od19iYXNlICsgKG9mcykpCi1zdGF0aWMgaW5saW5lIHU4IF9faXB3X3JlYWQ4KGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXB3X3ByaXYgKmlwdywgdTMyIG9mcykgewotCUlQV19ERUJVR19JTygiJXMgJWQ6IHJlYWRfZGlyZWN0OCgweCUwOFgpXG4iLCBmLCBsLCAodTMyKShvZnMpKTsKK3N0YXRpYyBpbmxpbmUgdTggX19pcHdfcmVhZDgoY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpcHdfcHJpdiAqaXB3LCB1MzIgb2ZzKQoreworCUlQV19ERUJVR19JTygiJXMgJWQ6IHJlYWRfZGlyZWN0OCgweCUwOFgpXG4iLCBmLCBsLCAodTMyKSAob2ZzKSk7CiAJcmV0dXJuIF9pcHdfcmVhZDgoaXB3LCBvZnMpOwogfQorCiAjZGVmaW5lIGlwd19yZWFkOChpcHcsIG9mcykgX19pcHdfcmVhZDgoX19GSUxFX18sIF9fTElORV9fLCBpcHcsIG9mcykKIAogI2RlZmluZSBfaXB3X3JlYWQxNihpcHcsIG9mcykgcmVhZHcoKGlwdyktPmh3X2Jhc2UgKyAob2ZzKSkKLXN0YXRpYyBpbmxpbmUgdTE2IF9faXB3X3JlYWQxNihjaGFyICpmLCB1MzIgbCwgc3RydWN0IGlwd19wcml2ICppcHcsIHUzMiBvZnMpIHsKLQlJUFdfREVCVUdfSU8oIiVzICVkOiByZWFkX2RpcmVjdDE2KDB4JTA4WClcbiIsIGYsIGwsICh1MzIpKG9mcykpOworc3RhdGljIGlubGluZSB1MTYgX19pcHdfcmVhZDE2KGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXB3X3ByaXYgKmlwdywgdTMyIG9mcykKK3sKKwlJUFdfREVCVUdfSU8oIiVzICVkOiByZWFkX2RpcmVjdDE2KDB4JTA4WClcbiIsIGYsIGwsICh1MzIpIChvZnMpKTsKIAlyZXR1cm4gX2lwd19yZWFkMTYoaXB3LCBvZnMpOwogfQorCiAjZGVmaW5lIGlwd19yZWFkMTYoaXB3LCBvZnMpIF9faXB3X3JlYWQxNihfX0ZJTEVfXywgX19MSU5FX18sIGlwdywgb2ZzKQogCiAjZGVmaW5lIF9pcHdfcmVhZDMyKGlwdywgb2ZzKSByZWFkbCgoaXB3KS0+aHdfYmFzZSArIChvZnMpKQotc3RhdGljIGlubGluZSB1MzIgX19pcHdfcmVhZDMyKGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXB3X3ByaXYgKmlwdywgdTMyIG9mcykgewotCUlQV19ERUJVR19JTygiJXMgJWQ6IHJlYWRfZGlyZWN0MzIoMHglMDhYKVxuIiwgZiwgbCwgKHUzMikob2ZzKSk7CitzdGF0aWMgaW5saW5lIHUzMiBfX2lwd19yZWFkMzIoY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpcHdfcHJpdiAqaXB3LCB1MzIgb2ZzKQoreworCUlQV19ERUJVR19JTygiJXMgJWQ6IHJlYWRfZGlyZWN0MzIoMHglMDhYKVxuIiwgZiwgbCwgKHUzMikgKG9mcykpOwogCXJldHVybiBfaXB3X3JlYWQzMihpcHcsIG9mcyk7CiB9CisKICNkZWZpbmUgaXB3X3JlYWQzMihpcHcsIG9mcykgX19pcHdfcmVhZDMyKF9fRklMRV9fLCBfX0xJTkVfXywgaXB3LCBvZnMpCiAKIHN0YXRpYyB2b2lkIF9pcHdfcmVhZF9pbmRpcmVjdChzdHJ1Y3QgaXB3X3ByaXYgKiwgdTMyLCB1OCAqLCBpbnQpOwpAQCAtMjIwLDM0ICsyMzAsMzAgQEAKIAlJUFdfREVCVUdfSU8oIiVzICVkOiByZWFkX2luZGRpcmVjdCgweCUwOFgpICVkIGJ5dGVzXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICh1MzIpKGIpLCBkKTsgXAogCV9pcHdfcmVhZF9pbmRpcmVjdChhLCBiLCBjLCBkKQogCi1zdGF0aWMgdm9pZCBfaXB3X3dyaXRlX2luZGlyZWN0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHU4ICpkYXRhLCBpbnQgbnVtKTsKK3N0YXRpYyB2b2lkIF9pcHdfd3JpdGVfaW5kaXJlY3Qoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgYWRkciwgdTggKiBkYXRhLAorCQkJCWludCBudW0pOwogI2RlZmluZSBpcHdfd3JpdGVfaW5kaXJlY3QoYSwgYiwgYywgZCkgXAogCUlQV19ERUJVR19JTygiJXMgJWQ6IHdyaXRlX2luZGlyZWN0KDB4JTA4WCkgJWQgYnl0ZXNcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgKHUzMikoYiksIGQpOyBcCiAgICAgICAgIF9pcHdfd3JpdGVfaW5kaXJlY3QoYSwgYiwgYywgZCkKIAogLyogaW5kaXJlY3Qgd3JpdGUgcyAqLwotc3RhdGljIHZvaWQgX2lwd193cml0ZV9yZWczMihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiByZWcsCi0JCQkgICAgIHUzMiB2YWx1ZSkKK3N0YXRpYyB2b2lkIF9pcHdfd3JpdGVfcmVnMzIoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgdmFsdWUpCiB7Ci0JSVBXX0RFQlVHX0lPKCIgJXAgOiByZWcgPSAweCU4WCA6IHZhbHVlID0gMHglOFhcbiIsCi0JCSAgICAgcHJpdiwgcmVnLCB2YWx1ZSk7CisJSVBXX0RFQlVHX0lPKCIgJXAgOiByZWcgPSAweCU4WCA6IHZhbHVlID0gMHglOFhcbiIsIHByaXYsIHJlZywgdmFsdWUpOwogCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfSU5ESVJFQ1RfQUREUiwgcmVnKTsKIAlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lORElSRUNUX0RBVEEsIHZhbHVlKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfaXB3X3dyaXRlX3JlZzgoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgcmVnLCB1OCB2YWx1ZSkKIHsKIAlJUFdfREVCVUdfSU8oIiByZWcgPSAweCU4WCA6IHZhbHVlID0gMHglOFhcbiIsIHJlZywgdmFsdWUpOwogCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfSU5ESVJFQ1RfQUREUiwgcmVnICYgQ1gyX0lORElSRUNUX0FERFJfTUFTSyk7CiAJX2lwd193cml0ZTgocHJpdiwgQ1gyX0lORElSRUNUX0RBVEEsIHZhbHVlKTsKIAlJUFdfREVCVUdfSU8oIiByZWcgPSAweCU4bFggOiB2YWx1ZSA9IDB4JThYXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nKShwcml2LT5od19iYXNlICsgQ1gyX0lORElSRUNUX0RBVEEpLAotCQkgICAgIHZhbHVlKTsKKwkJICAgICAodW5zaWduZWQgbG9uZykocHJpdi0+aHdfYmFzZSArIENYMl9JTkRJUkVDVF9EQVRBKSwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZCBfaXB3X3dyaXRlX3JlZzE2KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIHJlZywKLQkJCSAgICAgdTE2IHZhbHVlKQorc3RhdGljIHZvaWQgX2lwd193cml0ZV9yZWcxNihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiByZWcsIHUxNiB2YWx1ZSkKIHsKIAlJUFdfREVCVUdfSU8oIiByZWcgPSAweCU4WCA6IHZhbHVlID0gMHglOFhcbiIsIHJlZywgdmFsdWUpOwogCV9pcHdfd3JpdGUzMihwcml2LCBDWDJfSU5ESVJFQ1RfQUREUiwgcmVnICYgQ1gyX0lORElSRUNUX0FERFJfTUFTSyk7CkBAIC0yNjIsNyArMjY4LDcgQEAKIAlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0lORElSRUNUX0FERFIsIHJlZyAmIENYMl9JTkRJUkVDVF9BRERSX01BU0spOwogCUlQV19ERUJVR19JTygiIHJlZyA9IDB4JThYIDogXG4iLCByZWcpOwogCXdvcmQgPSBfaXB3X3JlYWQzMihwcml2LCBDWDJfSU5ESVJFQ1RfREFUQSk7Ci0JcmV0dXJuICh3b3JkID4+ICgocmVnICYgMHgzKSo4KSkgJiAweGZmOworCXJldHVybiAod29yZCA+PiAoKHJlZyAmIDB4MykgKiA4KSkgJiAweGZmOwogfQogCiBzdGF0aWMgdTMyIF9pcHdfcmVhZF9yZWczMihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiByZWcpCkBAIC0zMDIsNyArMzA4LDcgQEAKIAlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0FVVE9JTkNfQUREUiwgYWxpZ25lZF9hZGRyKTsKIAlhbGlnbmVkX2xlbiA9IG51bSAmIENYMl9JTkRJUkVDVF9BRERSX01BU0s7CiAJZm9yIChpID0gMDsgaSA8IGFsaWduZWRfbGVuOyBpICs9IDQsIGJ1ZiArPSA0LCBhbGlnbmVkX2FkZHIgKz0gNCkKLQkJKih1MzIqKWJ1ZiA9IGlwd19yZWFkMzIocHJpdiwgQ1gyX0FVVE9JTkNfREFUQSk7CisJCSoodTMyICopIGJ1ZiA9IGlwd19yZWFkMzIocHJpdiwgQ1gyX0FVVE9JTkNfREFUQSk7CiAKIAkvKiBDb3B5IHRoZSBsYXN0IG5pYmJsZSAqLwogCWRpZl9sZW4gPSBudW0gLSBhbGlnbmVkX2xlbjsKQEAgLTMxMSw3ICszMTcsNyBAQAogCQkqYnVmID0gaXB3X3JlYWQ4KHByaXYsIENYMl9JTkRJUkVDVF9EQVRBICsgaSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9pcHdfd3JpdGVfaW5kaXJlY3Qoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgYWRkciwgdTggKmJ1ZiwKK3N0YXRpYyB2b2lkIF9pcHdfd3JpdGVfaW5kaXJlY3Qoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgYWRkciwgdTggKiBidWYsCiAJCQkJaW50IG51bSkKIHsKIAl1MzIgYWxpZ25lZF9hZGRyID0gYWRkciAmIENYMl9JTkRJUkVDVF9BRERSX01BU0s7CkBAIC0zMzUsNyArMzQxLDcgQEAKIAlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0FVVE9JTkNfQUREUiwgYWxpZ25lZF9hZGRyKTsKIAlhbGlnbmVkX2xlbiA9IG51bSAmIENYMl9JTkRJUkVDVF9BRERSX01BU0s7CiAJZm9yIChpID0gMDsgaSA8IGFsaWduZWRfbGVuOyBpICs9IDQsIGJ1ZiArPSA0LCBhbGlnbmVkX2FkZHIgKz0gNCkKLQkJX2lwd193cml0ZTMyKHByaXYsIENYMl9BVVRPSU5DX0RBVEEsICoodTMyKilidWYpOworCQlfaXB3X3dyaXRlMzIocHJpdiwgQ1gyX0FVVE9JTkNfREFUQSwgKih1MzIgKikgYnVmKTsKIAogCS8qIENvcHkgdGhlIGxhc3QgbmliYmxlICovCiAJZGlmX2xlbiA9IG51bSAtIGFsaWduZWRfbGVuOwpAQCAtNDI4LDIwICs0MzQsMTggQEAKIAl9CiAKIAlmb3IgKGkgPSBFUlJPUl9TVEFSVF9PRkZTRVQ7Ci0JICAgICBpIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFOwotCSAgICAgaSArPSBFUlJPUl9FTEVNX1NJWkUpIHsKLQkJZGVzYyAgID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkpOwotCQl0aW1lICAgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDEqc2l6ZW9mKHUzMikpOwotCQlibGluazEgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDIqc2l6ZW9mKHUzMikpOwotCQlibGluazIgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDMqc2l6ZW9mKHUzMikpOwotCQlpbGluazEgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDQqc2l6ZW9mKHUzMikpOwotCQlpbGluazIgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDUqc2l6ZW9mKHUzMikpOwotCQlpZGF0YSA9ICBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDYqc2l6ZW9mKHUzMikpOworCSAgICAgaSA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRTsgaSArPSBFUlJPUl9FTEVNX1NJWkUpIHsKKwkJZGVzYyA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpKTsKKwkJdGltZSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpICsgMSAqIHNpemVvZih1MzIpKTsKKwkJYmxpbmsxID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyAyICogc2l6ZW9mKHUzMikpOworCQlibGluazIgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDMgKiBzaXplb2YodTMyKSk7CisJCWlsaW5rMSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpICsgNCAqIHNpemVvZih1MzIpKTsKKwkJaWxpbmsyID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgYmFzZSArIGkgKyA1ICogc2l6ZW9mKHUzMikpOworCQlpZGF0YSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpICsgNiAqIHNpemVvZih1MzIpKTsKIAotCQlJUFdfRVJST1IoCi0JCQkiJXMgJWkgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsCi0JCQlpcHdfZXJyb3JfZGVzYyhkZXNjKSwgdGltZSwgYmxpbmsxLCBibGluazIsCi0JCQlpbGluazEsIGlsaW5rMiwgaWRhdGEpOworCQlJUFdfRVJST1IoIiVzICVpIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLAorCQkJICBpcHdfZXJyb3JfZGVzYyhkZXNjKSwgdGltZSwgYmxpbmsxLCBibGluazIsCisJCQkgIGlsaW5rMSwgaWxpbmsyLCBpZGF0YSk7CiAJfQogfQogCkBAIC00NTYsMTEgKzQ2MCwxMCBAQAogCQlJUFdfRVJST1IoIlN0YXJ0IElQVyBFdmVudCBMb2cgRHVtcDpcbiIpOwogCiAJZm9yIChpID0gRVZFTlRfU1RBUlRfT0ZGU0VUOwotCSAgICAgaSA8PSBjb3VudCAqIEVWRU5UX0VMRU1fU0laRTsKLQkgICAgIGkgKz0gRVZFTlRfRUxFTV9TSVpFKSB7CisJICAgICBpIDw9IGNvdW50ICogRVZFTlRfRUxFTV9TSVpFOyBpICs9IEVWRU5UX0VMRU1fU0laRSkgewogCQlldiA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpKTsKLQkJdGltZSAgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDEqc2l6ZW9mKHUzMikpOwotCQlkYXRhICA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGJhc2UgKyBpICsgMipzaXplb2YodTMyKSk7CisJCXRpbWUgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDEgKiBzaXplb2YodTMyKSk7CisJCWRhdGEgPSBpcHdfcmVhZF9yZWczMihwcml2LCBiYXNlICsgaSArIDIgKiBzaXplb2YodTMyKSk7CiAKICNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCiAJCUlQV19FUlJPUigiJWlcdDB4JTA4eFx0JWlcbiIsIHRpbWUsIGRhdGEsIGV2KTsKQEAgLTQ2OCw4ICs0NzEsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBpcHdfZ2V0X29yZGluYWwoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgb3JkLCB2b2lkICp2YWwsCi0JCQkgICB1MzIgKmxlbikKK3N0YXRpYyBpbnQgaXB3X2dldF9vcmRpbmFsKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIG9yZCwgdm9pZCAqdmFsLCB1MzIgKiBsZW4pCiB7CiAJdTMyIGFkZHIsIGZpZWxkX2luZm8sIGZpZWxkX2xlbiwgZmllbGRfY291bnQsIHRvdGFsX2xlbjsKIApAQCAtNTEzLDExICs1MTUsMTEgQEAKIAkJfQogCiAJCUlQV19ERUJVR19PUkQoIlJlYWRpbmcgVEFCTEUwWyVpXSBmcm9tIG9mZnNldCAweCUwOHhcbiIsCi0JCQkgICAgICBvcmQsIHByaXYtPnRhYmxlMF9hZGRyICsgKG9yZCAgPDwgMikpOworCQkJICAgICAgb3JkLCBwcml2LT50YWJsZTBfYWRkciArIChvcmQgPDwgMikpOwogCiAJCSpsZW4gPSBzaXplb2YodTMyKTsKIAkJb3JkIDw8PSAyOwotCQkqKCh1MzIgKil2YWwpID0gaXB3X3JlYWQzMihwcml2LCBwcml2LT50YWJsZTBfYWRkciArIG9yZCk7CisJCSooKHUzMiAqKSB2YWwpID0gaXB3X3JlYWQzMihwcml2LCBwcml2LT50YWJsZTBfYWRkciArIG9yZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBJUFdfT1JEX1RBQkxFXzFfTUFTSzoKQEAgLTU0NSw3ICs1NDcsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQkqKCh1MzIgKil2YWwpID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgKHByaXYtPnRhYmxlMV9hZGRyICsgKG9yZCA8PCAyKSkpOworCQkqKCh1MzIgKikgdmFsKSA9CisJCSAgICBpcHdfcmVhZF9yZWczMihwcml2LCAocHJpdi0+dGFibGUxX2FkZHIgKyAob3JkIDw8IDIpKSk7CiAJCSpsZW4gPSBzaXplb2YodTMyKTsKIAkJYnJlYWs7CiAKQEAgLTU3MywxMyArNTc2LDE2IEBACiAKIAkJLyogZ2V0IHRoZSBzZWNvbmQgRFcgb2Ygc3RhdGlzdGljcyA7CiAJCSAqIHR3byAxNi1iaXQgd29yZHMgLSBmaXJzdCBpcyBsZW5ndGgsIHNlY29uZCBpcyBjb3VudCAqLwotCQlmaWVsZF9pbmZvID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgcHJpdi0+dGFibGUyX2FkZHIgKyAob3JkIDw8IDMpICsgc2l6ZW9mKHUzMikpOworCQlmaWVsZF9pbmZvID0KKwkJICAgIGlwd19yZWFkX3JlZzMyKHByaXYsCisJCQkJICAgcHJpdi0+dGFibGUyX2FkZHIgKyAob3JkIDw8IDMpICsKKwkJCQkgICBzaXplb2YodTMyKSk7CiAKIAkJLyogZ2V0IGVhY2ggZW50cnkgbGVuZ3RoICovCi0JCWZpZWxkX2xlbiA9ICooKHUxNiAqKSZmaWVsZF9pbmZvKTsKKwkJZmllbGRfbGVuID0gKigodTE2ICopICYgZmllbGRfaW5mbyk7CiAKIAkJLyogZ2V0IG51bWJlciBvZiBlbnRyaWVzICovCi0JCWZpZWxkX2NvdW50ID0gKigoKHUxNiAqKSZmaWVsZF9pbmZvKSArIDEpOworCQlmaWVsZF9jb3VudCA9ICooKCh1MTYgKikgJiBmaWVsZF9pbmZvKSArIDEpOwogCiAJCS8qIGFib3J0IGlmIG5vdCBlbm91Z2h0IG1lbW9yeSAqLwogCQl0b3RhbF9sZW4gPSBmaWVsZF9sZW4gKiBmaWVsZF9jb3VudDsKQEAgLTYwNCw3ICs2MTAsNiBAQAogCiAJfQogCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjI0LDcgKzYyOSw3IEBACiAKIAlwcml2LT50YWJsZTJfYWRkciA9IGlwd19yZWFkMzIocHJpdiwgSVBXX09SRElOQUxTX1RBQkxFXzIpOwogCXByaXYtPnRhYmxlMl9sZW4gPSBpcHdfcmVhZF9yZWczMihwcml2LCBwcml2LT50YWJsZTJfYWRkcik7Ci0JcHJpdi0+dGFibGUyX2xlbiAmPSAweDAwMDBmZmZmOyAvKiB1c2UgZmlyc3QgdHdvIGJ5dGVzICovCisJcHJpdi0+dGFibGUyX2xlbiAmPSAweDAwMDBmZmZmOwkvKiB1c2UgZmlyc3QgdHdvIGJ5dGVzICovCiAKIAlJUFdfREVCVUdfT1JEKCJ0YWJsZSAyIG9mZnNldCBhdCAweCUwOHgsIGxlbiA9ICVpXG4iLAogCQkgICAgICBwcml2LT50YWJsZTJfYWRkciwgcHJpdi0+dGFibGUyX2xlbik7CkBAIC02NDMsNyArNjQ4LDcgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOFhcbiIsIGlwd19kZWJ1Z19sZXZlbCk7CiB9CiBzdGF0aWMgc3NpemVfdCBzdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZCwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJY2hhciAqcCA9IChjaGFyICopYnVmOwogCXUzMiB2YWw7CkBAIC02NjgsMTEgKzY3MywxMiBAQAogCQkgICBzaG93X2RlYnVnX2xldmVsLCBzdG9yZV9kZWJ1Z19sZXZlbCk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIChpbnQpcC0+c3RhdHVzKTsKIH0KKwogc3RhdGljIERFVklDRV9BVFRSKHN0YXR1cywgU19JUlVHTywgc2hvd19zdGF0dXMsIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCBzaG93X2NmZyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTY4MSwxMCArNjg3LDExIEBACiAJc3RydWN0IGlwd19wcml2ICpwID0gZC0+ZHJpdmVyX2RhdGE7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCAoaW50KXAtPmNvbmZpZyk7CiB9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihjZmcsIFNfSVJVR08sIHNob3dfY2ZnLCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd19uaWNfdHlwZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKIAl1OCB0eXBlID0gcC0+ZWVwcm9tW0VFUFJPTV9OSUNfVFlQRV07CkBAIC03MDQsNDQgKzcxMSw1MCBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiVU5LTk9XTlxuIik7CiB9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihuaWNfdHlwZSwgU19JUlVHTywgc2hvd19uaWNfdHlwZSwgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IGR1bXBfZXJyb3JfbG9nKHN0cnVjdCBkZXZpY2UgKmQsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJY2hhciAqcCA9IChjaGFyICopYnVmOwogCiAJaWYgKHBbMF0gPT0gJzEnKQotCQlpcHdfZHVtcF9uaWNfZXJyb3JfbG9nKChzdHJ1Y3QgaXB3X3ByaXYqKWQtPmRyaXZlcl9kYXRhKTsKKwkJaXB3X2R1bXBfbmljX2Vycm9yX2xvZygoc3RydWN0IGlwd19wcml2ICopZC0+ZHJpdmVyX2RhdGEpOwogCiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7CiB9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihkdW1wX2Vycm9ycywgU19JV1VTUiwgTlVMTCwgZHVtcF9lcnJvcl9sb2cpOwogCiBzdGF0aWMgc3NpemVfdCBkdW1wX2V2ZW50X2xvZyhzdHJ1Y3QgZGV2aWNlICpkLAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKIAogCWlmIChwWzBdID09ICcxJykKLQkJaXB3X2R1bXBfbmljX2V2ZW50X2xvZygoc3RydWN0IGlwd19wcml2KilkLT5kcml2ZXJfZGF0YSk7CisJCWlwd19kdW1wX25pY19ldmVudF9sb2coKHN0cnVjdCBpcHdfcHJpdiAqKWQtPmRyaXZlcl9kYXRhKTsKIAogCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwogfQorCiBzdGF0aWMgREVWSUNFX0FUVFIoZHVtcF9ldmVudHMsIFNfSVdVU1IsIE5VTEwsIGR1bXBfZXZlbnRfbG9nKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd191Y29kZV92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1MzIgbGVuID0gc2l6ZW9mKHUzMiksIHRtcCA9IDA7CiAJc3RydWN0IGlwd19wcml2ICpwID0gZC0+ZHJpdmVyX2RhdGE7CiAKLQlpZihpcHdfZ2V0X29yZGluYWwocCwgSVBXX09SRF9TVEFUX1VDT0RFX1ZFUlNJT04sICZ0bXAsICZsZW4pKQorCWlmIChpcHdfZ2V0X29yZGluYWwocCwgSVBXX09SRF9TVEFUX1VDT0RFX1ZFUlNJT04sICZ0bXAsICZsZW4pKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgdG1wKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUih1Y29kZV92ZXJzaW9uLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfdWNvZGVfdmVyc2lvbiwgTlVMTCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUih1Y29kZV92ZXJzaW9uLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd191Y29kZV92ZXJzaW9uLCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd19ydGMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljaGFyICpidWYpCkBAIC03NDksMzYgKzc2MiwzOCBAQAogCXUzMiBsZW4gPSBzaXplb2YodTMyKSwgdG1wID0gMDsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKIAotCWlmKGlwd19nZXRfb3JkaW5hbChwLCBJUFdfT1JEX1NUQVRfUlRDLCAmdG1wLCAmbGVuKSkKKwlpZiAoaXB3X2dldF9vcmRpbmFsKHAsIElQV19PUkRfU1RBVF9SVEMsICZ0bXAsICZsZW4pKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgdG1wKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihydGMsIFNfSVdVU1J8U19JUlVHTywgc2hvd19ydGMsIE5VTEwpOworCitzdGF0aWMgREVWSUNFX0FUVFIocnRjLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19ydGMsIE5VTEwpOwogCiAvKgogICogQWRkIGEgZGV2aWNlIGF0dHJpYnV0ZSB0byB2aWV3L2NvbnRyb2wgdGhlIGRlbGF5IGJldHdlZW4gZWVwcm9tCiAgKiBvcGVyYXRpb25zLgogICovCiBzdGF0aWMgc3NpemVfdCBzaG93X2VlcHJvbV9kZWxheShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlpbnQgbiA9ICgoc3RydWN0IGlwd19wcml2KilkLT5kcml2ZXJfZGF0YSktPmVlcHJvbV9kZWxheTsKKwlpbnQgbiA9ICgoc3RydWN0IGlwd19wcml2ICopZC0+ZHJpdmVyX2RhdGEpLT5lZXByb21fZGVsYXk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIG4pOwogfQogc3RhdGljIHNzaXplX3Qgc3RvcmVfZWVwcm9tX2RlbGF5KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJc2l6ZV90IGNvdW50KQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKIAlzc2NhbmYoYnVmLCAiJWkiLCAmcC0+ZWVwcm9tX2RlbGF5KTsKIAlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihlZXByb21fZGVsYXksIFNfSVdVU1J8U19JUlVHTywKLQkJICAgc2hvd19lZXByb21fZGVsYXksc3RvcmVfZWVwcm9tX2RlbGF5KTsKKworc3RhdGljIERFVklDRV9BVFRSKGVlcHJvbV9kZWxheSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfZWVwcm9tX2RlbGF5LCBzdG9yZV9lZXByb21fZGVsYXkpOwogCiBzdGF0aWMgc3NpemVfdCBzaG93X2NvbW1hbmRfZXZlbnRfcmVnKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJdTMyIHJlZyA9IDA7CiAJc3RydWN0IGlwd19wcml2ICpwID0gZC0+ZHJpdmVyX2RhdGE7CkBAIC03ODcsOCArODAyLDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIHJlZyk7CiB9CiBzdGF0aWMgc3NpemVfdCBzdG9yZV9jb21tYW5kX2V2ZW50X3JlZyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50KQorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdTMyIHJlZzsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBkLT5kcml2ZXJfZGF0YTsKQEAgLTc5NywxMSArODEyLDEyIEBACiAJaXB3X3dyaXRlX3JlZzMyKHAsIENYMl9JTlRFUk5BTF9DTURfRVZFTlQsIHJlZyk7CiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoY29tbWFuZF9ldmVudF9yZWcsIFNfSVdVU1J8U19JUlVHTywKLQkJICAgc2hvd19jb21tYW5kX2V2ZW50X3JlZyxzdG9yZV9jb21tYW5kX2V2ZW50X3JlZyk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjb21tYW5kX2V2ZW50X3JlZywgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfY29tbWFuZF9ldmVudF9yZWcsIHN0b3JlX2NvbW1hbmRfZXZlbnRfcmVnKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd19tZW1fZ3Bpb19yZWcoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXUzMiByZWcgPSAwOwogCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGQtPmRyaXZlcl9kYXRhOwpAQCAtODEwLDggKzgyNiw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCByZWcpOwogfQogc3RhdGljIHNzaXplX3Qgc3RvcmVfbWVtX2dwaW9fcmVnKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJc2l6ZV90IGNvdW50KQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1MzIgcmVnOwogCXN0cnVjdCBpcHdfcHJpdiAqcCA9IGQtPmRyaXZlcl9kYXRhOwpAQCAtODIwLDExICs4MzYsMTIgQEAKIAlpcHdfd3JpdGVfcmVnMzIocCwgMHgzMDExMDAsIHJlZyk7CiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIobWVtX2dwaW9fcmVnLCBTX0lXVVNSfFNfSVJVR08sCi0JCSAgIHNob3dfbWVtX2dwaW9fcmVnLHN0b3JlX21lbV9ncGlvX3JlZyk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihtZW1fZ3Bpb19yZWcsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X21lbV9ncGlvX3JlZywgc3RvcmVfbWVtX2dwaW9fcmVnKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd19pbmRpcmVjdF9kd29yZChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1MzIgcmVnID0gMDsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKQEAgLTgzNiw4ICs4NTMsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgcmVnKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2luZGlyZWN0X2R3b3JkKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQpCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKIApAQCAtODQ1LDExICs4NjIsMTIgQEAKIAlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0lORElSRUNUX0RXT1JEOwogCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGluZGlyZWN0X2R3b3JkLCBTX0lXVVNSfFNfSVJVR08sCi0JCSAgIHNob3dfaW5kaXJlY3RfZHdvcmQsc3RvcmVfaW5kaXJlY3RfZHdvcmQpOworCitzdGF0aWMgREVWSUNFX0FUVFIoaW5kaXJlY3RfZHdvcmQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X2luZGlyZWN0X2R3b3JkLCBzdG9yZV9pbmRpcmVjdF9kd29yZCk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfaW5kaXJlY3RfYnl0ZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJdTggcmVnID0gMDsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKQEAgLTg2MSw4ICs4NzksOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgcmVnKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2luZGlyZWN0X2J5dGUoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCkKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKIApAQCAtODcwLDExICs4ODgsMTIgQEAKIAlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0lORElSRUNUX0JZVEU7CiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW5kaXJlY3RfYnl0ZSwgU19JV1VTUnxTX0lSVUdPLAorCitzdGF0aWMgREVWSUNFX0FUVFIoaW5kaXJlY3RfYnl0ZSwgU19JV1VTUiB8IFNfSVJVR08sCiAJCSAgIHNob3dfaW5kaXJlY3RfYnl0ZSwgc3RvcmVfaW5kaXJlY3RfYnl0ZSk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfZGlyZWN0X2R3b3JkKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1MzIgcmVnID0gMDsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKQEAgLTg4Nyw4ICs5MDYsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgcmVnKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2RpcmVjdF9kd29yZChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCXNpemVfdCBjb3VudCkKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGlwd19wcml2ICpwcml2ID0gZC0+ZHJpdmVyX2RhdGE7CiAKQEAgLTg5Niw5ICs5MTUsOSBAQAogCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfRElSRUNUX0RXT1JEOwogCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGRpcmVjdF9kd29yZCwgU19JV1VTUnxTX0lSVUdPLAotCQkgICBzaG93X2RpcmVjdF9kd29yZCxzdG9yZV9kaXJlY3RfZHdvcmQpOwogCitzdGF0aWMgREVWSUNFX0FUVFIoZGlyZWN0X2R3b3JkLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd19kaXJlY3RfZHdvcmQsIHN0b3JlX2RpcmVjdF9kd29yZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJmX2tpbGxfYWN0aXZlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKQEAgLTkxMSw3ICs5MzAsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X3JmX2tpbGwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQorCQkJICAgIGNoYXIgKmJ1ZikKIHsKIAkvKiAwIC0gUkYga2lsbCBub3QgZW5hYmxlZAogCSAgIDEgLSBTVyBiYXNlZCBSRiBraWxsIGFjdGl2ZSAoc3lzZnMpCkBAIC05MTksNyArOTM4LDcgQEAKIAkgICAzIC0gQm90aCBIVyBhbmQgU1cgYmFlZCBSRiBraWxsIGFjdGl2ZSAqLwogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGQtPmRyaXZlcl9kYXRhOwogCWludCB2YWwgPSAoKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX1NXKSA/IDB4MSA6IDB4MCkgfAotCQkocmZfa2lsbF9hY3RpdmUocHJpdikgPyAweDIgOiAweDApOworCSAgICAocmZfa2lsbF9hY3RpdmUocHJpdikgPyAweDIgOiAweDApOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCB2YWwpOwogfQogCkBAIC05MjcsNyArOTQ2LDcgQEAKIHsKIAlpZiAoKGRpc2FibGVfcmFkaW8gPyAxIDogMCkgPT0KIAkgICAgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX1NXID8gMSA6IDApKQotCQlyZXR1cm4gMCA7CisJCXJldHVybiAwOwogCiAJSVBXX0RFQlVHX1JGX0tJTEwoIk1hbnVhbCBTVyBSRiBLaWxsIHNldCB0bzogUkFESU8gICVzXG4iLAogCQkJICBkaXNhYmxlX3JhZGlvID8gIk9GRiIgOiAiT04iKTsKQEAgLTk1Niw4ICs5NzUsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yZl9raWxsKHN0cnVjdCBkZXZpY2UgKmQsICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JmX2tpbGwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGQtPmRyaXZlcl9kYXRhOwogCkBAIC05NjUsNyArOTg0LDggQEAKIAogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihyZl9raWxsLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfcmZfa2lsbCwgc3RvcmVfcmZfa2lsbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihyZl9raWxsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19yZl9raWxsLCBzdG9yZV9yZl9raWxsKTsKIAogc3RhdGljIHZvaWQgaXB3X2lycV90YXNrbGV0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKQEAgLTk5MCw3ICsxMDEwLDcgQEAKIAogCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1RYX0NNRF9RVUVVRSkgewogCQlJUFdfREVCVUdfSEMoIkNvbW1hbmQgY29tcGxldGVkLlxuIik7Ci0JCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0oIHByaXYsICZwcml2LT50eHFfY21kLCAtMSk7CisJCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0ocHJpdiwgJnByaXYtPnR4cV9jbWQsIC0xKTsKIAkJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfSENNRF9BQ1RJVkU7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKIAkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfVFhfQ01EX1FVRVVFOwpAQCAtOTk4LDI1ICsxMDE4LDI1IEBACiAKIAlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9UWF9RVUVVRV8xKSB7CiAJCUlQV19ERUJVR19UWCgiVFhfUVVFVUVfMVxuIik7Ci0JCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0oIHByaXYsICZwcml2LT50eHFbMF0sIDApOworCQlyYyA9IGlwd19xdWV1ZV90eF9yZWNsYWltKHByaXYsICZwcml2LT50eHFbMF0sIDApOwogCQloYW5kbGVkIHw9IENYMl9JTlRBX0JJVF9UWF9RVUVVRV8xOwogCX0KIAogCWlmIChpbnRhICYgQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzIpIHsKIAkJSVBXX0RFQlVHX1RYKCJUWF9RVUVVRV8yXG4iKTsKLQkJcmMgPSBpcHdfcXVldWVfdHhfcmVjbGFpbSggcHJpdiwgJnByaXYtPnR4cVsxXSwgMSk7CisJCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0ocHJpdiwgJnByaXYtPnR4cVsxXSwgMSk7CiAJCWhhbmRsZWQgfD0gQ1gyX0lOVEFfQklUX1RYX1FVRVVFXzI7CiAJfQogCiAJaWYgKGludGEgJiBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMykgewogCQlJUFdfREVCVUdfVFgoIlRYX1FVRVVFXzNcbiIpOwotCQlyYyA9IGlwd19xdWV1ZV90eF9yZWNsYWltKCBwcml2LCAmcHJpdi0+dHhxWzJdLCAyKTsKKwkJcmMgPSBpcHdfcXVldWVfdHhfcmVjbGFpbShwcml2LCAmcHJpdi0+dHhxWzJdLCAyKTsKIAkJaGFuZGxlZCB8PSBDWDJfSU5UQV9CSVRfVFhfUVVFVUVfMzsKIAl9CiAKIAlpZiAoaW50YSAmIENYMl9JTlRBX0JJVF9UWF9RVUVVRV80KSB7CiAJCUlQV19ERUJVR19UWCgiVFhfUVVFVUVfNFxuIik7Ci0JCXJjID0gaXB3X3F1ZXVlX3R4X3JlY2xhaW0oIHByaXYsICZwcml2LT50eHFbM10sIDMpOworCQlyYyA9IGlwd19xdWV1ZV90eF9yZWNsYWltKHByaXYsICZwcml2LT50eHFbM10sIDMpOwogCQloYW5kbGVkIHw9IENYMl9JTlRBX0JJVF9UWF9RVUVVRV80OwogCX0KIApAQCAtMTA3NCw4ICsxMDk0LDcgQEAKIAl9CiAKIAlpZiAoaGFuZGxlZCAhPSBpbnRhKSB7Ci0JCUlQV19FUlJPUigiVW5oYW5kbGVkIElOVEEgYml0cyAweCUwOHhcbiIsCi0JCQkJaW50YSAmIH5oYW5kbGVkKTsKKwkJSVBXX0VSUk9SKCJVbmhhbmRsZWQgSU5UQSBiaXRzIDB4JTA4eFxuIiwgaW50YSAmIH5oYW5kbGVkKTsKIAl9CiAKIAkvKiBlbmFibGUgYWxsIGludGVycnVwdHMgKi8KQEAgLTExNDMsNyArMTE2Miw3IEBACiAJCXJldHVybiAiVU5LTk9XTiI7CiAJfQogfQotI2VuZGlmIC8qIENPTkZJR19JUFdfREVCVUcgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfSVBXX0RFQlVHICovCiAKICNkZWZpbmUgSE9TVF9DT01QTEVURV9USU1FT1VUIEhaCiBzdGF0aWMgaW50IGlwd19zZW5kX2NtZChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBob3N0X2NtZCAqY21kKQpAQCAtMTE1OSwxNSArMTE3OCwxNiBAQAogCiAJSVBXX0RFQlVHX0hDKCJTZW5kaW5nICVzIGNvbW1hbmQgKCMlZCksICVkIGJ5dGVzXG4iLAogCQkgICAgIGdldF9jbWRfc3RyaW5nKGNtZC0+Y21kKSwgY21kLT5jbWQsIGNtZC0+bGVuKTsKLQlwcmludGtfYnVmKElQV19ETF9IT1NUX0NPTU1BTkQsICh1OCopY21kLT5wYXJhbSwgY21kLT5sZW4pOworCXByaW50a19idWYoSVBXX0RMX0hPU1RfQ09NTUFORCwgKHU4ICopIGNtZC0+cGFyYW0sIGNtZC0+bGVuKTsKIAogCXJjID0gaXB3X3F1ZXVlX3R4X2hjbWQocHJpdiwgY21kLT5jbWQsICZjbWQtPnBhcmFtLCBjbWQtPmxlbiwgMCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQlwcml2LT53YWl0X2NvbW1hbmRfcXVldWUsICEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0hDTURfQUNUSVZFKSwKLQkJSE9TVF9DT01QTEVURV9USU1FT1VUKTsKKwlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSwKKwkJCQkJICAgICAgIShwcml2LT4KKwkJCQkJCXN0YXR1cyAmIFNUQVRVU19IQ01EX0FDVElWRSksCisJCQkJCSAgICAgIEhPU1RfQ09NUExFVEVfVElNRU9VVCk7CiAJaWYgKHJjID09IDApIHsKIAkJSVBXX0RFQlVHX0lORk8oIkNvbW1hbmQgY29tcGxldGlvbiBmYWlsZWQgb3V0IGFmdGVyICVkbXMuXG4iLAogCQkJICAgICAgIGppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7CkBAIC0xMjE1LDcgKzEyMzUsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JbWVtY3B5KCZjbWQucGFyYW0sY29uZmlnLHNpemVvZigqY29uZmlnKSk7CisJbWVtY3B5KCZjbWQucGFyYW0sIGNvbmZpZywgc2l6ZW9mKCpjb25maWcpKTsKIAlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CiAJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgU1lTVEVNX0NPTkZJRyBjb21tYW5kXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTIyNCw3ICsxMjQ0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpcHdfc2VuZF9zc2lkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKnNzaWQsIGludCBsZW4pCitzdGF0aWMgaW50IGlwd19zZW5kX3NzaWQoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIHNzaWQsIGludCBsZW4pCiB7CiAJc3RydWN0IGhvc3RfY21kIGNtZCA9IHsKIAkJLmNtZCA9IElQV19DTURfU1NJRCwKQEAgLTEyNDUsNyArMTI2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXB3X3NlbmRfYWRhcHRlcl9hZGRyZXNzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKm1hYykKK3N0YXRpYyBpbnQgaXB3X3NlbmRfYWRhcHRlcl9hZGRyZXNzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBtYWMpCiB7CiAJc3RydWN0IGhvc3RfY21kIGNtZCA9IHsKIAkJLmNtZCA9IElQV19DTURfQURBUFRFUl9BRERSRVNTLApAQCAtMTI4NCw5ICsxMzA0LDYgQEAKIAl9CiB9CiAKLQotCi0KICNkZWZpbmUgSVBXX1NDQU5fQ0hFQ0tfV0FUQ0hET0cgKDUgKiBIWikKIAogc3RhdGljIHZvaWQgaXB3X3NjYW5fY2hlY2sodm9pZCAqZGF0YSkKQEAgLTEzMTMsNyArMTMzMCw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQltZW1jcHkoJmNtZC5wYXJhbSxyZXF1ZXN0LHNpemVvZigqcmVxdWVzdCkpOworCW1lbWNweSgmY21kLnBhcmFtLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKTsKIAlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CiAJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgU0NBTl9SRVFVRVNUX0VYVCBjb21tYW5kXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTM1MSw3ICsxMzY4LDcgQEAKIAkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXB3X3NlbnNpdGl2aXR5X2NhbGliKQogCX07CiAJc3RydWN0IGlwd19zZW5zaXRpdml0eV9jYWxpYiAqY2FsaWIgPSAoc3RydWN0IGlwd19zZW5zaXRpdml0eV9jYWxpYiAqKQotCQkmY21kLnBhcmFtOworCSAgICAmY21kLnBhcmFtOwogCWNhbGliLT5iZWFjb25fcnNzaV9yYXcgPSBzZW5zOwogCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKIAkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBTRU5TSVRJVklUWSBDQUxJQiBjb21tYW5kXG4iKTsKQEAgLTEzNzQsNyArMTM5MSw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQltZW1jcHkoJmNtZC5wYXJhbSxhc3NvY2lhdGUsc2l6ZW9mKCphc3NvY2lhdGUpKTsKKwltZW1jcHkoJmNtZC5wYXJhbSwgYXNzb2NpYXRlLCBzaXplb2YoKmFzc29jaWF0ZSkpOwogCWlmIChpcHdfc2VuZF9jbWQocHJpdiwgJmNtZCkpIHsKIAkJSVBXX0VSUk9SKCJmYWlsZWQgdG8gc2VuZCBBU1NPQ0lBVEUgY29tbWFuZFxuIik7CiAJCXJldHVybiAtMTsKQEAgLTEzOTYsNyArMTQxMyw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQltZW1jcHkoJmNtZC5wYXJhbSxyYXRlcyxzaXplb2YoKnJhdGVzKSk7CisJbWVtY3B5KCZjbWQucGFyYW0sIHJhdGVzLCBzaXplb2YoKnJhdGVzKSk7CiAJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgewogCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIFNVUFBPUlRFRF9SQVRFUyBjb21tYW5kXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTQ0MCw3ICsxNDU3LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCSooKHUzMiopJmNtZC5wYXJhbSkgPSBwaHlfb2ZmOworCSooKHUzMiAqKSAmIGNtZC5wYXJhbSkgPSBwaHlfb2ZmOwogCiAJaWYgKGlwd19zZW5kX2NtZChwcml2LCAmY21kKSkgewogCQlJUFdfRVJST1IoImZhaWxlZCB0byBzZW5kIENBUkRfRElTQUJMRSBjb21tYW5kXG4iKTsKQEAgLTE0NTEsOCArMTQ2OCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBpcHdfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpcHdfdHhfcG93ZXIgKnBvd2VyKQorc3RhdGljIGludCBpcHdfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBpcHdfdHhfcG93ZXIgKnBvd2VyKQogewogCXN0cnVjdCBob3N0X2NtZCBjbWQgPSB7CiAJCS5jbWQgPSBJUFdfQ01EX1RYX1BPV0VSLApAQCAtMTQ2NCw3ICsxNDgwLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCW1lbWNweSgmY21kLnBhcmFtLHBvd2VyLHNpemVvZigqcG93ZXIpKTsKKwltZW1jcHkoJmNtZC5wYXJhbSwgcG93ZXIsIHNpemVvZigqcG93ZXIpKTsKIAlpZiAoaXB3X3NlbmRfY21kKHByaXYsICZjbWQpKSB7CiAJCUlQV19FUlJPUigiZmFpbGVkIHRvIHNlbmQgVFhfUE9XRVIgY29tbWFuZFxuIik7CiAJCXJldHVybiAtMTsKQEAgLTE1MjcsNyArMTU0Myw3IEBACiAJCS5jbWQgPSBJUFdfQ01EX1BPV0VSX01PREUsCiAJCS5sZW4gPSBzaXplb2YodTMyKQogCX07Ci0JdTMyICpwYXJhbSA9ICh1MzIqKSgmY21kLnBhcmFtKTsKKwl1MzIgKnBhcmFtID0gKHUzMiAqKSAoJmNtZC5wYXJhbSk7CiAKIAlpZiAoIXByaXYpIHsKIAkJSVBXX0VSUk9SKCJJbnZhbGlkIGFyZ3NcbiIpOwpAQCAtMTU4NSw2NyArMTYwMSw2NyBAQAogfQogCiAvKiBwZXJmb3JtIGEgY2hpcCBzZWxlY3Qgb3BlcmF0aW9uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2NzKHN0cnVjdCBpcHdfcHJpdiogcHJpdikKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZXByb21fY3Moc3RydWN0IGlwd19wcml2ICpwcml2KQogewotCWVlcHJvbV93cml0ZV9yZWcocHJpdiwwKTsKLQllZXByb21fd3JpdGVfcmVnKHByaXYsRUVQUk9NX0JJVF9DUyk7Ci0JZWVwcm9tX3dyaXRlX3JlZyhwcml2LEVFUFJPTV9CSVRfQ1N8RUVQUk9NX0JJVF9TSyk7Ci0JZWVwcm9tX3dyaXRlX3JlZyhwcml2LEVFUFJPTV9CSVRfQ1MpOworCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgMCk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX0NTKTsKKwllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MgfCBFRVBST01fQklUX1NLKTsKKwllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MpOwogfQogCiAvKiBwZXJmb3JtIGEgY2hpcCBzZWxlY3Qgb3BlcmF0aW9uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2Rpc2FibGVfY3Moc3RydWN0IGlwd19wcml2KiBwcml2KQorc3RhdGljIGlubGluZSB2b2lkIGVlcHJvbV9kaXNhYmxlX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKLQllZXByb21fd3JpdGVfcmVnKHByaXYsRUVQUk9NX0JJVF9DUyk7Ci0JZWVwcm9tX3dyaXRlX3JlZyhwcml2LDApOwotCWVlcHJvbV93cml0ZV9yZWcocHJpdixFRVBST01fQklUX1NLKTsKKwllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MpOworCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgMCk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX1NLKTsKIH0KIAogLyogcHVzaCBhIHNpbmdsZSBiaXQgZG93biB0byB0aGUgZWVwcm9tICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX3dyaXRlX2JpdChzdHJ1Y3QgaXB3X3ByaXYgKnAsdTggYml0KQorc3RhdGljIGlubGluZSB2b2lkIGVlcHJvbV93cml0ZV9iaXQoc3RydWN0IGlwd19wcml2ICpwLCB1OCBiaXQpCiB7Ci0JaW50IGQgPSAoIGJpdCA/IEVFUFJPTV9CSVRfREkgOiAwKTsKLQllZXByb21fd3JpdGVfcmVnKHAsRUVQUk9NX0JJVF9DU3xkKTsKLQllZXByb21fd3JpdGVfcmVnKHAsRUVQUk9NX0JJVF9DU3xkfEVFUFJPTV9CSVRfU0spOworCWludCBkID0gKGJpdCA/IEVFUFJPTV9CSVRfREkgOiAwKTsKKwllZXByb21fd3JpdGVfcmVnKHAsIEVFUFJPTV9CSVRfQ1MgfCBkKTsKKwllZXByb21fd3JpdGVfcmVnKHAsIEVFUFJPTV9CSVRfQ1MgfCBkIHwgRUVQUk9NX0JJVF9TSyk7CiB9CiAKIC8qIHB1c2ggYW4gb3Bjb2RlIGZvbGxvd2VkIGJ5IGFuIGFkZHJlc3MgZG93biB0byB0aGUgZWVwcm9tICovCi1zdGF0aWMgdm9pZCBlZXByb21fb3Aoc3RydWN0IGlwd19wcml2KiBwcml2LCB1OCBvcCwgdTggYWRkcikKK3N0YXRpYyB2b2lkIGVlcHJvbV9vcChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4IG9wLCB1OCBhZGRyKQogewogCWludCBpOwogCiAJZWVwcm9tX2NzKHByaXYpOwotCWVlcHJvbV93cml0ZV9iaXQocHJpdiwxKTsKLQllZXByb21fd3JpdGVfYml0KHByaXYsb3AmMik7Ci0JZWVwcm9tX3dyaXRlX2JpdChwcml2LG9wJjEpOwotCWZvciAoIGk9NzsgaT49MDsgaS0tICkgewotCQllZXByb21fd3JpdGVfYml0KHByaXYsYWRkciYoMTw8aSkpOworCWVlcHJvbV93cml0ZV9iaXQocHJpdiwgMSk7CisJZWVwcm9tX3dyaXRlX2JpdChwcml2LCBvcCAmIDIpOworCWVlcHJvbV93cml0ZV9iaXQocHJpdiwgb3AgJiAxKTsKKwlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQllZXByb21fd3JpdGVfYml0KHByaXYsIGFkZHIgJiAoMSA8PCBpKSk7CiAJfQogfQogCiAvKiBwdWxsIDE2IGJpdHMgb2ZmIHRoZSBlZXByb20sIG9uZSBiaXQgYXQgYSB0aW1lICovCi1zdGF0aWMgdTE2IGVlcHJvbV9yZWFkX3UxNihzdHJ1Y3QgaXB3X3ByaXYqIHByaXYsIHU4IGFkZHIpCitzdGF0aWMgdTE2IGVlcHJvbV9yZWFkX3UxNihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4IGFkZHIpCiB7CiAJaW50IGk7Ci0JdTE2IHI9MDsKKwl1MTYgciA9IDA7CiAKIAkvKiBTZW5kIFJFQUQgT3Bjb2RlICovCi0JZWVwcm9tX29wKHByaXYsRUVQUk9NX0NNRF9SRUFELGFkZHIpOworCWVlcHJvbV9vcChwcml2LCBFRVBST01fQ01EX1JFQUQsIGFkZHIpOwogCiAJLyogU2VuZCBkdW1teSBiaXQgKi8KLQllZXByb21fd3JpdGVfcmVnKHByaXYsRUVQUk9NX0JJVF9DUyk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX0NTKTsKIAogCS8qIFJlYWQgdGhlIGJ5dGUgb2ZmIHRoZSBlZXByb20gb25lIGJpdCBhdCBhIHRpbWUgKi8KLQlmb3IgKCBpPTA7IGk8MTY7IGkrKyApIHsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQl1MzIgZGF0YSA9IDA7Ci0JCWVlcHJvbV93cml0ZV9yZWcocHJpdixFRVBST01fQklUX0NTfEVFUFJPTV9CSVRfU0spOwotCQllZXByb21fd3JpdGVfcmVnKHByaXYsRUVQUk9NX0JJVF9DUyk7Ci0JCWRhdGEgPSBpcHdfcmVhZF9yZWczMihwcml2LEZXX01FTV9SRUdfRUVQUk9NX0FDQ0VTUyk7Ci0JCXIgPSAocjw8MSkgfCAoKGRhdGEgJiBFRVBST01fQklUX0RPKT8xOjApOworCQllZXByb21fd3JpdGVfcmVnKHByaXYsIEVFUFJPTV9CSVRfQ1MgfCBFRVBST01fQklUX1NLKTsKKwkJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCBFRVBST01fQklUX0NTKTsKKwkJZGF0YSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIEZXX01FTV9SRUdfRUVQUk9NX0FDQ0VTUyk7CisJCXIgPSAociA8PCAxKSB8ICgoZGF0YSAmIEVFUFJPTV9CSVRfRE8pID8gMSA6IDApOwogCX0KIAogCS8qIFNlbmQgYW5vdGhlciBkdW1teSBiaXQgKi8KLQllZXByb21fd3JpdGVfcmVnKHByaXYsMCk7CisJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCAwKTsKIAllZXByb21fZGlzYWJsZV9jcyhwcml2KTsKIAogCXJldHVybiByOwpAQCAtMTY1Myw5ICsxNjY5LDkgQEAKIAogLyogaGVscGVyIGZ1bmN0aW9uIGZvciBwdWxsaW5nIHRoZSBtYWMgYWRkcmVzcyBvdXQgb2YgdGhlIHByaXZhdGUgKi8KIC8qIGRhdGEncyBjb3B5IG9mIHRoZSBlZXByb20gZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgdm9pZCBlZXByb21fcGFyc2VfbWFjKHN0cnVjdCBpcHdfcHJpdiogcHJpdiwgdTgqIG1hYykKK3N0YXRpYyB2b2lkIGVlcHJvbV9wYXJzZV9tYWMoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIG1hYykKIHsKLQl1OCogZWUgPSAodTgqKXByaXYtPmVlcHJvbTsKKwl1OCAqZWUgPSAodTggKikgcHJpdi0+ZWVwcm9tOwogCW1lbWNweShtYWMsICZlZVtFRVBST01fTUFDX0FERFJFU1NdLCA2KTsKIH0KIApAQCAtMTY3MCwyNiArMTY4NiwyNSBAQAogc3RhdGljIHZvaWQgaXB3X2VlcHJvbV9pbml0X3NyYW0oc3RydWN0IGlwd19wcml2ICpwcml2KQogewogCWludCBpOwotCXUxNiAqZWVwcm9tID0gKHUxNiAqKXByaXYtPmVlcHJvbTsKKwl1MTYgKmVlcHJvbSA9ICh1MTYgKikgcHJpdi0+ZWVwcm9tOwogCiAJSVBXX0RFQlVHX1RSQUNFKCI+PlxuIik7CiAKIAkvKiByZWFkIGVudGlyZSBjb250ZW50cyBvZiBlZXByb20gaW50byBwcml2YXRlIGJ1ZmZlciAqLwotCWZvciAoIGk9MDsgaTwxMjg7IGkrKyApCi0JCWVlcHJvbVtpXSA9IGVlcHJvbV9yZWFkX3UxNihwcml2LCh1OClpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisJCWVlcHJvbVtpXSA9IGVlcHJvbV9yZWFkX3UxNihwcml2LCAodTgpIGkpOwogCiAJLyoKIAkgICBJZiB0aGUgZGF0YSBsb29rcyBjb3JyZWN0LCB0aGVuIGNvcHkgaXQgdG8gb3VyIHByaXZhdGUKIAkgICBjb3B5LiAgT3RoZXJ3aXNlIGxldCB0aGUgZmlybXdhcmUga25vdyB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24KIAkgICBvbiBpdCdzIG93bgotCSovCisJICovCiAJaWYgKChwcml2LT5lZXByb20gKyBFRVBST01fVkVSU0lPTikgIT0gMCkgewogCQlJUFdfREVCVUdfSU5GTygiV3JpdGluZyBFRVBST00gZGF0YSBpbnRvIFNSQU1cbiIpOwogCiAJCS8qIHdyaXRlIHRoZSBlZXByb20gZGF0YSB0byBzcmFtICovCi0JCWZvciggaT0wOyBpPENYMl9FRVBST01fSU1BR0VfU0laRTsgaSsrICkKLQkJCWlwd193cml0ZTgocHJpdiwgSVBXX0VFUFJPTV9EQVRBICsgaSwKLQkJCQkgICBwcml2LT5lZXByb21baV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQ1gyX0VFUFJPTV9JTUFHRV9TSVpFOyBpKyspCisJCQlpcHdfd3JpdGU4KHByaXYsIElQV19FRVBST01fREFUQSArIGksIHByaXYtPmVlcHJvbVtpXSk7CiAKIAkJLyogRG8gbm90IGxvYWQgZWVwcm9tIGRhdGEgb24gZmF0YWwgZXJyb3Igb3Igc3VzcGVuZCAqLwogCQlpcHdfd3JpdGUzMihwcml2LCBJUFdfRUVQUk9NX0xPQURfRElTQUJMRSwgMCk7CkBAIC0xNzAzLDExICsxNzE4LDExIEBACiAJSVBXX0RFQlVHX1RSQUNFKCI8PFxuIik7CiB9CiAKLQogc3RhdGljIGlubGluZSB2b2lkIGlwd196ZXJvX21lbW9yeShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBzdGFydCwgdTMyIGNvdW50KQogewogCWNvdW50ID4+PSAyOwotCWlmICghY291bnQpIHJldHVybjsKKwlpZiAoIWNvdW50KQorCQlyZXR1cm47CiAJX2lwd193cml0ZTMyKHByaXYsIENYMl9BVVRPSU5DX0FERFIsIHN0YXJ0KTsKIAl3aGlsZSAoY291bnQtLSkKIAkJX2lwd193cml0ZTMyKHByaXYsIENYMl9BVVRPSU5DX0RBVEEsIDApOwpAQCAtMTcyMSw3ICsxNzM2LDcgQEAKIH0KIAogc3RhdGljIGludCBpcHdfZndfZG1hX2VuYWJsZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCi17IC8qIHN0YXJ0IGRtYSBlbmdpbmUgYnV0IG5vIHRyYW5zZmVycyB5ZXQqLworewkJCQkvKiBzdGFydCBkbWEgZW5naW5lIGJ1dCBubyB0cmFuc2ZlcnMgeWV0ICovCiAKIAlJUFdfREVCVUdfRlcoIj4+IDogXG4iKTsKIApAQCAtMTc0OSwxMiArMTc2NCwxNiBAQAogCUlQV19ERUJVR19GVygiPDwgXG4iKTsKIH0KIAotc3RhdGljIGludCBpcHdfZndfZG1hX3dyaXRlX2NvbW1hbmRfYmxvY2soc3RydWN0IGlwd19wcml2ICpwcml2LCBpbnQgaW5kZXgsIHN0cnVjdCBjb21tYW5kX2Jsb2NrICpjYikKK3N0YXRpYyBpbnQgaXB3X2Z3X2RtYV93cml0ZV9jb21tYW5kX2Jsb2NrKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgaW50IGluZGV4LAorCQkJCQkgIHN0cnVjdCBjb21tYW5kX2Jsb2NrICpjYikKIHsKLQl1MzIgYWRkcmVzcyA9IENYMl9TSEFSRURfU1JBTV9ETUFfQ09OVFJPTCArIChzaXplb2Yoc3RydWN0IGNvbW1hbmRfYmxvY2spICogaW5kZXgpOworCXUzMiBhZGRyZXNzID0KKwkgICAgQ1gyX1NIQVJFRF9TUkFNX0RNQV9DT05UUk9MICsKKwkgICAgKHNpemVvZihzdHJ1Y3QgY29tbWFuZF9ibG9jaykgKiBpbmRleCk7CiAJSVBXX0RFQlVHX0ZXKCI+PiA6XG4iKTsKIAotCWlwd193cml0ZV9pbmRpcmVjdChwcml2LCBhZGRyZXNzLCAodTgqKWNiLCAoaW50KXNpemVvZihzdHJ1Y3QgY29tbWFuZF9ibG9jaykpOworCWlwd193cml0ZV9pbmRpcmVjdChwcml2LCBhZGRyZXNzLCAodTggKikgY2IsCisJCQkgICAoaW50KXNpemVvZihzdHJ1Y3QgY29tbWFuZF9ibG9jaykpOwogCiAJSVBXX0RFQlVHX0ZXKCI8PCA6XG4iKTsKIAlyZXR1cm4gMDsKQEAgLTE3NjQsMTcgKzE3ODMsMjAgQEAKIHN0YXRpYyBpbnQgaXB3X2Z3X2RtYV9raWNrKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAl1MzIgY29udHJvbCA9IDA7Ci0JdTMyIGluZGV4PTA7CisJdTMyIGluZGV4ID0gMDsKIAogCUlQV19ERUJVR19GVygiPj4gOlxuIik7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwcml2LT5zcmFtX2Rlc2MubGFzdF9jYl9pbmRleDsgaW5kZXgrKykKLQkJaXB3X2Z3X2RtYV93cml0ZV9jb21tYW5kX2Jsb2NrKHByaXYsIGluZGV4LCAmcHJpdi0+c3JhbV9kZXNjLmNiX2xpc3RbaW5kZXhdKTsKKwkJaXB3X2Z3X2RtYV93cml0ZV9jb21tYW5kX2Jsb2NrKHByaXYsIGluZGV4LAorCQkJCQkgICAgICAgJnByaXYtPnNyYW1fZGVzYy5jYl9saXN0W2luZGV4XSk7CiAKIAkvKiBFbmFibGUgdGhlIERNQSBpbiB0aGUgQ1NSIHJlZ2lzdGVyICovCi0JaXB3X2NsZWFyX2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLENYMl9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVEIHwgQ1gyX1JFU0VUX1JFR19TVE9QX01BU1RFUik7CisJaXB3X2NsZWFyX2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLAorCQkgICAgICBDWDJfUkVTRVRfUkVHX01BU1RFUl9ESVNBQkxFRCB8CisJCSAgICAgIENYMl9SRVNFVF9SRUdfU1RPUF9NQVNURVIpOwogCi0gICAgICAgIC8qIFNldCB0aGUgU3RhcnQgYml0LiAqLworCS8qIFNldCB0aGUgU3RhcnQgYml0LiAqLwogCWNvbnRyb2wgPSBETUFfQ09OVFJPTF9TTUFMTF9DQl9DT05TVF9WQUxVRSB8IERNQV9DQl9TVEFSVDsKIAlpcHdfd3JpdGVfcmVnMzIocHJpdiwgQ1gyX0RNQV9JX0RNQV9DT05UUk9MLCBjb250cm9sKTsKIApAQCAtMTc4NSwyNSArMTgwNywyNSBAQAogc3RhdGljIHZvaWQgaXB3X2Z3X2RtYV9kdW1wX2NvbW1hbmRfYmxvY2soc3RydWN0IGlwd19wcml2ICpwcml2KQogewogCXUzMiBhZGRyZXNzOwotCXUzMiByZWdpc3Rlcl92YWx1ZT0wOwotCXUzMiBjYl9maWVsZHNfYWRkcmVzcz0wOworCXUzMiByZWdpc3Rlcl92YWx1ZSA9IDA7CisJdTMyIGNiX2ZpZWxkc19hZGRyZXNzID0gMDsKIAogCUlQV19ERUJVR19GVygiPj4gOlxuIik7Ci0JYWRkcmVzcyA9IGlwd19yZWFkX3JlZzMyKHByaXYsQ1gyX0RNQV9JX0NVUlJFTlRfQ0IpOwotCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIGlzIDB4JXggXG4iLGFkZHJlc3MpOworCWFkZHJlc3MgPSBpcHdfcmVhZF9yZWczMihwcml2LCBDWDJfRE1BX0lfQ1VSUkVOVF9DQik7CisJSVBXX0RFQlVHX0ZXX0lORk8oIkN1cnJlbnQgQ0IgaXMgMHgleCBcbiIsIGFkZHJlc3MpOwogCiAJLyogUmVhZCB0aGUgRE1BIENvbnRyb2xvciByZWdpc3RlciAqLwogCXJlZ2lzdGVyX3ZhbHVlID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgQ1gyX0RNQV9JX0RNQV9DT05UUk9MKTsKLQlJUFdfREVCVUdfRldfSU5GTygiQ1gyX0RNQV9JX0RNQV9DT05UUk9MIGlzIDB4JXggXG4iLHJlZ2lzdGVyX3ZhbHVlKTsKKwlJUFdfREVCVUdfRldfSU5GTygiQ1gyX0RNQV9JX0RNQV9DT05UUk9MIGlzIDB4JXggXG4iLCByZWdpc3Rlcl92YWx1ZSk7CiAKLQkvKiBQcmludCB0aGUgQ0IgdmFsdWVzKi8KKwkvKiBQcmludCB0aGUgQ0IgdmFsdWVzICovCiAJY2JfZmllbGRzX2FkZHJlc3MgPSBhZGRyZXNzOwogCXJlZ2lzdGVyX3ZhbHVlID0gaXB3X3JlYWRfcmVnMzIocHJpdiwgY2JfZmllbGRzX2FkZHJlc3MpOwotCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIENvbnRyb2xGaWVsZCBpcyAweCV4IFxuIixyZWdpc3Rlcl92YWx1ZSk7CisJSVBXX0RFQlVHX0ZXX0lORk8oIkN1cnJlbnQgQ0IgQ29udHJvbEZpZWxkIGlzIDB4JXggXG4iLCByZWdpc3Rlcl92YWx1ZSk7CiAKIAljYl9maWVsZHNfYWRkcmVzcyArPSBzaXplb2YodTMyKTsKIAlyZWdpc3Rlcl92YWx1ZSA9IGlwd19yZWFkX3JlZzMyKHByaXYsIGNiX2ZpZWxkc19hZGRyZXNzKTsKLQlJUFdfREVCVUdfRldfSU5GTygiQ3VycmVudCBDQiBTb3VyY2UgRmllbGQgaXMgMHgleCBcbiIscmVnaXN0ZXJfdmFsdWUpOworCUlQV19ERUJVR19GV19JTkZPKCJDdXJyZW50IENCIFNvdXJjZSBGaWVsZCBpcyAweCV4IFxuIiwgcmVnaXN0ZXJfdmFsdWUpOwogCiAJY2JfZmllbGRzX2FkZHJlc3MgKz0gc2l6ZW9mKHUzMik7CiAJcmVnaXN0ZXJfdmFsdWUgPSBpcHdfcmVhZF9yZWczMihwcml2LCBjYl9maWVsZHNfYWRkcmVzcyk7CkBAIC0xODEyLDcgKzE4MzQsNyBAQAogCiAJY2JfZmllbGRzX2FkZHJlc3MgKz0gc2l6ZW9mKHUzMik7CiAJcmVnaXN0ZXJfdmFsdWUgPSBpcHdfcmVhZF9yZWczMihwcml2LCBjYl9maWVsZHNfYWRkcmVzcyk7Ci0JSVBXX0RFQlVHX0ZXX0lORk8oIkN1cnJlbnQgQ0IgU3RhdHVzIEZpZWxkIGlzIDB4JXggXG4iLHJlZ2lzdGVyX3ZhbHVlKTsKKwlJUFdfREVCVUdfRldfSU5GTygiQ3VycmVudCBDQiBTdGF0dXMgRmllbGQgaXMgMHgleCBcbiIsIHJlZ2lzdGVyX3ZhbHVlKTsKIAogCUlQV19ERUJVR19GVygiPj4gOlxuIik7CiB9CkBAIC0xODIzLDEzICsxODQ1LDEzIEBACiAJdTMyIGN1cnJlbnRfY2JfaW5kZXggPSAwOwogCiAJSVBXX0RFQlVHX0ZXKCI8PCA6XG4iKTsKLQljdXJyZW50X2NiX2FkZHJlc3M9IGlwd19yZWFkX3JlZzMyKHByaXYsIENYMl9ETUFfSV9DVVJSRU5UX0NCKTsKKwljdXJyZW50X2NiX2FkZHJlc3MgPSBpcHdfcmVhZF9yZWczMihwcml2LCBDWDJfRE1BX0lfQ1VSUkVOVF9DQik7CiAKLQljdXJyZW50X2NiX2luZGV4ID0gKGN1cnJlbnRfY2JfYWRkcmVzcyAtIENYMl9TSEFSRURfU1JBTV9ETUFfQ09OVFJPTCApLwotCQlzaXplb2YgKHN0cnVjdCBjb21tYW5kX2Jsb2NrKTsKKwljdXJyZW50X2NiX2luZGV4ID0gKGN1cnJlbnRfY2JfYWRkcmVzcyAtIENYMl9TSEFSRURfU1JBTV9ETUFfQ09OVFJPTCkgLworCSAgICBzaXplb2Yoc3RydWN0IGNvbW1hbmRfYmxvY2spOwogCiAJSVBXX0RFQlVHX0ZXX0lORk8oIkN1cnJlbnQgQ0IgaW5kZXggMHgleCBhZGRyZXNzID0gMHglWCBcbiIsCi0JCQkgIGN1cnJlbnRfY2JfaW5kZXgsIGN1cnJlbnRfY2JfYWRkcmVzcyApOworCQkJICBjdXJyZW50X2NiX2luZGV4LCBjdXJyZW50X2NiX2FkZHJlc3MpOwogCiAJSVBXX0RFQlVHX0ZXKCI+PiA6XG4iKTsKIAlyZXR1cm4gY3VycmVudF9jYl9pbmRleDsKQEAgLTE4NDAsMTUgKzE4NjIsMTQgQEAKIAkJCQkJdTMyIHNyY19hZGRyZXNzLAogCQkJCQl1MzIgZGVzdF9hZGRyZXNzLAogCQkJCQl1MzIgbGVuZ3RoLAotCQkJCQlpbnQgaW50ZXJydXB0X2VuYWJsZWQsCi0JCQkJCWludCBpc19sYXN0KQorCQkJCQlpbnQgaW50ZXJydXB0X2VuYWJsZWQsIGludCBpc19sYXN0KQogewogCiAJdTMyIGNvbnRyb2wgPSBDQl9WQUxJRCB8IENCX1NSQ19MRSB8IENCX0RFU1RfTEUgfCBDQl9TUkNfQVVUT0lOQyB8Ci0JCUNCX1NSQ19JT19HQVRFRCB8IENCX0RFU1RfQVVUT0lOQyB8IENCX1NSQ19TSVpFX0xPTkcgfAotCQlDQl9ERVNUX1NJWkVfTE9ORzsKKwkgICAgQ0JfU1JDX0lPX0dBVEVEIHwgQ0JfREVTVF9BVVRPSU5DIHwgQ0JfU1JDX1NJWkVfTE9ORyB8CisJICAgIENCX0RFU1RfU0laRV9MT05HOwogCXN0cnVjdCBjb21tYW5kX2Jsb2NrICpjYjsKLQl1MzIgbGFzdF9jYl9lbGVtZW50PTA7CisJdTMyIGxhc3RfY2JfZWxlbWVudCA9IDA7CiAKIAlJUFdfREVCVUdfRldfSU5GTygic3JjX2FkZHJlc3M9MHgleCBkZXN0X2FkZHJlc3M9MHgleCBsZW5ndGg9MHgleFxuIiwKIAkJCSAgc3JjX2FkZHJlc3MsIGRlc3RfYWRkcmVzcywgbGVuZ3RoKTsKQEAgLTE4NjEsNyArMTg4Miw3IEBACiAJcHJpdi0+c3JhbV9kZXNjLmxhc3RfY2JfaW5kZXgrKzsKIAogCS8qIENhbGN1bGF0ZSB0aGUgbmV3IENCIGNvbnRyb2wgd29yZCAqLwotCWlmIChpbnRlcnJ1cHRfZW5hYmxlZCApCisJaWYgKGludGVycnVwdF9lbmFibGVkKQogCQljb250cm9sIHw9IENCX0lOVF9FTkFCTEVEOwogCiAJaWYgKGlzX2xhc3QpCkBAIC0xODcwLDcgKzE4OTEsNyBAQAogCWNvbnRyb2wgfD0gbGVuZ3RoOwogCiAJLyogQ2FsY3VsYXRlIHRoZSBDQiBFbGVtZW50J3MgY2hlY2tzdW0gdmFsdWUgKi8KLQljYi0+c3RhdHVzID0gY29udHJvbCBec3JjX2FkZHJlc3MgXmRlc3RfYWRkcmVzczsKKwljYi0+c3RhdHVzID0gY29udHJvbCBeIHNyY19hZGRyZXNzIF4gZGVzdF9hZGRyZXNzOwogCiAJLyogQ29weSB0aGUgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KIAljYi0+ZGVzdF9hZGRyID0gZGVzdF9hZGRyZXNzOwpAQCAtMTg4MywyMiArMTkwNCwyMSBAQAogfQogCiBzdGF0aWMgaW50IGlwd19md19kbWFfYWRkX2J1ZmZlcihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCi0JCQkJIHUzMiBzcmNfcGh5cywKLQkJCQkgdTMyIGRlc3RfYWRkcmVzcywKLQkJCQkgdTMyIGxlbmd0aCkKKwkJCQkgdTMyIHNyY19waHlzLCB1MzIgZGVzdF9hZGRyZXNzLCB1MzIgbGVuZ3RoKQogewogCXUzMiBieXRlc19sZWZ0ID0gbGVuZ3RoOwotCXUzMiBzcmNfb2Zmc2V0PTA7Ci0JdTMyIGRlc3Rfb2Zmc2V0PTA7CisJdTMyIHNyY19vZmZzZXQgPSAwOworCXUzMiBkZXN0X29mZnNldCA9IDA7CiAJaW50IHN0YXR1cyA9IDA7CiAJSVBXX0RFQlVHX0ZXKCI+PiBcbiIpOwogCUlQV19ERUJVR19GV19JTkZPKCJzcmNfcGh5cz0weCV4IGRlc3RfYWRkcmVzcz0weCV4IGxlbmd0aD0weCV4XG4iLAogCQkJICBzcmNfcGh5cywgZGVzdF9hZGRyZXNzLCBsZW5ndGgpOwogCXdoaWxlIChieXRlc19sZWZ0ID4gQ0JfTUFYX0xFTkdUSCkgewotCQlzdGF0dXMgPSBpcHdfZndfZG1hX2FkZF9jb21tYW5kX2Jsb2NrKCBwcml2LAotCQkJCQkJICAgICAgIHNyY19waHlzICsgc3JjX29mZnNldCwKLQkJCQkJCSAgICAgICBkZXN0X2FkZHJlc3MgKyBkZXN0X29mZnNldCwKLQkJCQkJCSAgICAgICBDQl9NQVhfTEVOR1RILCAwLCAwKTsKKwkJc3RhdHVzID0gaXB3X2Z3X2RtYV9hZGRfY29tbWFuZF9ibG9jayhwcml2LAorCQkJCQkJICAgICAgc3JjX3BoeXMgKyBzcmNfb2Zmc2V0LAorCQkJCQkJICAgICAgZGVzdF9hZGRyZXNzICsKKwkJCQkJCSAgICAgIGRlc3Rfb2Zmc2V0LAorCQkJCQkJICAgICAgQ0JfTUFYX0xFTkdUSCwgMCwgMCk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCUlQV19ERUJVR19GV19JTkZPKCI6IEZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLTE7CkBAIC0xOTEyLDE4ICsxOTMyLDE4IEBACiAKIAkvKiBhZGQgdGhlIGJ1ZmZlciB0YWlsICovCiAJaWYgKGJ5dGVzX2xlZnQgPiAwKSB7Ci0JCXN0YXR1cyA9IGlwd19md19kbWFfYWRkX2NvbW1hbmRfYmxvY2soCi0JCQlwcml2LCBzcmNfcGh5cyArIHNyY19vZmZzZXQsCi0JCQlkZXN0X2FkZHJlc3MgKyBkZXN0X29mZnNldCwKLQkJCWJ5dGVzX2xlZnQsIDAsIDApOworCQlzdGF0dXMgPQorCQkgICAgaXB3X2Z3X2RtYV9hZGRfY29tbWFuZF9ibG9jayhwcml2LCBzcmNfcGh5cyArIHNyY19vZmZzZXQsCisJCQkJCQkgZGVzdF9hZGRyZXNzICsgZGVzdF9vZmZzZXQsCisJCQkJCQkgYnl0ZXNfbGVmdCwgMCwgMCk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCUlQV19ERUJVR19GV19JTkZPKCI6IEZhaWxlZCBvbiB0aGUgYnVmZmVyIHRhaWxcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9IGVsc2UKLQkJCUlQV19ERUJVR19GV19JTkZPKCI6IEFkZGluZyBuZXcgY2IgLSB0aGUgYnVmZmVyIHRhaWxcbiIpOworCQkJSVBXX0RFQlVHX0ZXX0lORk8KKwkJCSAgICAoIjogQWRkaW5nIG5ldyBjYiAtIHRoZSBidWZmZXIgdGFpbFxuIik7CiAJfQogCi0KIAlJUFdfREVCVUdfRlcoIjw8IFxuIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTM3LDcgKzE5NTcsNyBAQAogCiAJY3VycmVudF9pbmRleCA9IGlwd19md19kbWFfY29tbWFuZF9ibG9ja19pbmRleChwcml2KTsKIAlJUFdfREVCVUdfRldfSU5GTygic3JhbV9kZXNjLmxhc3RfY2JfaW5kZXg6MHglOFhcbiIsCi0JCQkgIChpbnQpIHByaXYtPnNyYW1fZGVzYy5sYXN0X2NiX2luZGV4KTsKKwkJCSAgKGludClwcml2LT5zcmFtX2Rlc2MubGFzdF9jYl9pbmRleCk7CiAKIAl3aGlsZSAoY3VycmVudF9pbmRleCA8IHByaXYtPnNyYW1fZGVzYy5sYXN0X2NiX2luZGV4KSB7CiAJCXVkZWxheSg1MCk7CkBAIC0xOTU1LDggKzE5NzUsOCBAQAogCiAJaXB3X2Z3X2RtYV9hYm9ydChwcml2KTsKIAotCS8qRGlzYWJsZSB0aGUgRE1BIGluIHRoZSBDU1IgcmVnaXN0ZXIqLwotIAlpcHdfc2V0X2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLAorCS8qRGlzYWJsZSB0aGUgRE1BIGluIHRoZSBDU1IgcmVnaXN0ZXIgKi8KKwlpcHdfc2V0X2JpdChwcml2LCBDWDJfUkVTRVRfUkVHLAogCQkgICAgQ1gyX1JFU0VUX1JFR19NQVNURVJfRElTQUJMRUQgfCBDWDJfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKIAogCUlQV19ERUJVR19GVygiPDwgZG1hV2FpdFN5bmMgXG4iKTsKQEAgLTIwMTEsOCArMjAzMSw3IEBACiAgKiBpbWFnZSBhbmQgdGhlIGNhbGxlciBpcyBoYW5kbGluZyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGNsZWFuIHVwLgogICovCiAKLQotc3RhdGljIGludCBpcHdfc3RvcF9tYXN0ZXIoc3RydWN0IGlwd19wcml2ICogcHJpdikKK3N0YXRpYyBpbnQgaXB3X3N0b3BfbWFzdGVyKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmM7CiAKQEAgLTIwNzEsMTQgKzIwOTAsMTMgQEAKICNkZWZpbmUgSVBXX0ZXX05BTUUoeCkgImlwdzIyMDBfIiB4ICIuZnciCiAjZW5kaWYKIAotc3RhdGljIGludCBpcHdfbG9hZF91Y29kZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogZGF0YSwKLQkJCSAgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgaXB3X2xvYWRfdWNvZGUoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGRhdGEsIHNpemVfdCBsZW4pCiB7CiAJaW50IHJjID0gMCwgaSwgYWRkcjsKIAl1OCBjciA9IDA7CiAJdTE2ICppbWFnZTsKIAotCWltYWdlID0gKHUxNiAqKWRhdGE7CisJaW1hZ2UgPSAodTE2ICopIGRhdGE7CiAKIAlJUFdfREVCVUdfVFJBQ0UoIj4+IFxuIik7CiAKQEAgLTIwODcsNyArMjEwNSw3IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0vLwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworLy8gICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJZm9yIChhZGRyID0gQ1gyX1NIQVJFRF9MT1dFUl9CT1VORDsKIAkgICAgIGFkZHIgPCBDWDJfUkVHSVNURVJfRE9NQUlOMV9FTkQ7IGFkZHIgKz0gNCkgewpAQCAtMjA5OSw3ICsyMTE3LDcgQEAKIAkvKiBkZXN0cm95IERNQSBxdWV1ZXMgKi8KIAkvKiByZXNldCBzZXF1ZW5jZSAqLwogCi0JaXB3X3dyaXRlX3JlZzMyKHByaXYsIENYMl9NRU1fSEFMVF9BTkRfUkVTRVQgLENYMl9CSVRfSEFMVF9SRVNFVF9PTik7CisJaXB3X3dyaXRlX3JlZzMyKHByaXYsIENYMl9NRU1fSEFMVF9BTkRfUkVTRVQsIENYMl9CSVRfSEFMVF9SRVNFVF9PTik7CiAJaXB3X2FyY19yZWxlYXNlKHByaXYpOwogCWlwd193cml0ZV9yZWczMihwcml2LCBDWDJfTUVNX0hBTFRfQU5EX1JFU0VULCBDWDJfQklUX0hBTFRfUkVTRVRfT0ZGKTsKIAltZGVsYXkoMSk7CkBAIC0yMTI4LDEzICsyMTQ2LDExIEBACiAJZm9yIChpID0gMDsgaSA8IGxlbiAvIDI7IGkrKykKIAkJaXB3X3dyaXRlX3JlZzE2KHByaXYsIENYMl9CQVNFQkFORF9DT05UUk9MX1NUT1JFLCBpbWFnZVtpXSk7CiAKLQogCS8qIGVuYWJsZSBESU5PICovCiAJaXB3X3dyaXRlX3JlZzgocHJpdiwgQ1gyX0JBU0VCQU5EX0NPTlRST0xfU1RBVFVTLCAwKTsKLQlpcHdfd3JpdGVfcmVnOChwcml2LCBDWDJfQkFTRUJBTkRfQ09OVFJPTF9TVEFUVVMsCi0JCSAgICAgICBESU5PX0VOQUJMRV9TWVNURU0gKTsKKwlpcHdfd3JpdGVfcmVnOChwcml2LCBDWDJfQkFTRUJBTkRfQ09OVFJPTF9TVEFUVVMsIERJTk9fRU5BQkxFX1NZU1RFTSk7CiAKLQkvKiB0aGlzIGlzIHdoZXJlIHRoZSBpZ3ggLyB3aW4gZHJpdmVyIGRldmVhdGVzIGZyb20gdGhlIFZBUCBkcml2ZXIuKi8KKwkvKiB0aGlzIGlzIHdoZXJlIHRoZSBpZ3ggLyB3aW4gZHJpdmVyIGRldmVhdGVzIGZyb20gdGhlIFZBUCBkcml2ZXIuICovCiAKIAkvKiB3YWl0IGZvciBhbGl2ZSByZXNwb25zZSAqLwogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewpAQCAtMjE1MSwyNSArMjE2NywyNCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlc3BvbnNlX2J1ZmZlcik7IGkrKykKIAkJCXJlc3BvbnNlX2J1ZmZlcltpXSA9Ci0JCQkJaXB3X3JlYWRfcmVnMzIocHJpdiwKLQkJCQkJICAgICAgIENYMl9CQVNFQkFORF9SWF9GSUZPX1JFQUQpOworCQkJICAgIGlwd19yZWFkX3JlZzMyKHByaXYsIENYMl9CQVNFQkFORF9SWF9GSUZPX1JFQUQpOwogCQltZW1jcHkoJnByaXYtPmRpbm9fYWxpdmUsIHJlc3BvbnNlX2J1ZmZlciwKIAkJICAgICAgIHNpemVvZihwcml2LT5kaW5vX2FsaXZlKSk7CiAJCWlmIChwcml2LT5kaW5vX2FsaXZlLmFsaXZlX2NvbW1hbmQgPT0gMQogCQkgICAgJiYgcHJpdi0+ZGlub19hbGl2ZS51Y29kZV92YWxpZCA9PSAxKSB7CiAJCQlyYyA9IDA7Ci0JCQlJUFdfREVCVUdfSU5GTygKLQkJCQkiTWljcm9jb2RlIE9LLCByZXYuICVkICgweCV4KSBkZXYuICVkICgweCV4KSAiCi0JCQkJIm9mICUwMmQvJTAyZC8lMDJkICUwMmQ6JTAyZFxuIiwKLQkJCQlwcml2LT5kaW5vX2FsaXZlLnNvZnR3YXJlX3JldmlzaW9uLAotCQkJCXByaXYtPmRpbm9fYWxpdmUuc29mdHdhcmVfcmV2aXNpb24sCi0JCQkJcHJpdi0+ZGlub19hbGl2ZS5kZXZpY2VfaWRlbnRpZmllciwKLQkJCQlwcml2LT5kaW5vX2FsaXZlLmRldmljZV9pZGVudGlmaWVyLAotCQkJCXByaXYtPmRpbm9fYWxpdmUudGltZV9zdGFtcFswXSwKLQkJCQlwcml2LT5kaW5vX2FsaXZlLnRpbWVfc3RhbXBbMV0sCi0JCQkJcHJpdi0+ZGlub19hbGl2ZS50aW1lX3N0YW1wWzJdLAotCQkJCXByaXYtPmRpbm9fYWxpdmUudGltZV9zdGFtcFszXSwKLQkJCQlwcml2LT5kaW5vX2FsaXZlLnRpbWVfc3RhbXBbNF0pOworCQkJSVBXX0RFQlVHX0lORk8KKwkJCSAgICAoIk1pY3JvY29kZSBPSywgcmV2LiAlZCAoMHgleCkgZGV2LiAlZCAoMHgleCkgIgorCQkJICAgICAib2YgJTAyZC8lMDJkLyUwMmQgJTAyZDolMDJkXG4iLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLnNvZnR3YXJlX3JldmlzaW9uLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLnNvZnR3YXJlX3JldmlzaW9uLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLmRldmljZV9pZGVudGlmaWVyLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLmRldmljZV9pZGVudGlmaWVyLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLnRpbWVfc3RhbXBbMF0sCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUudGltZV9zdGFtcFsxXSwKKwkJCSAgICAgcHJpdi0+ZGlub19hbGl2ZS50aW1lX3N0YW1wWzJdLAorCQkJICAgICBwcml2LT5kaW5vX2FsaXZlLnRpbWVfc3RhbXBbM10sCisJCQkgICAgIHByaXYtPmRpbm9fYWxpdmUudGltZV9zdGFtcFs0XSk7CiAJCX0gZWxzZSB7CiAJCQlJUFdfREVCVUdfSU5GTygiTWljcm9jb2RlIGlzIG5vdCBhbGl2ZVxuIik7CiAJCQlyYyA9IC1FSU5WQUw7CkBAIC0yMTgzLDEzICsyMTk4LDEyIEBACiAJICAgZmlybXdhcmUgaGF2ZSBwcm9ibGVtIGdldHRpbmcgYWxpdmUgcmVzcC4gKi8KIAlpcHdfd3JpdGVfcmVnOChwcml2LCBDWDJfQkFTRUJBTkRfQ09OVFJPTF9TVEFUVVMsIDApOwogCi0vLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisvLyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBpcHdfbG9hZF9maXJtd2FyZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogZGF0YSwKLQkJCSAgICAgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgaXB3X2xvYWRfZmlybXdhcmUoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGRhdGEsIHNpemVfdCBsZW4pCiB7CiAJaW50IHJjID0gLTE7CiAJaW50IG9mZnNldCA9IDA7CkBAIC0yMjMxLDcgKzIyNDUsNyBAQAogCQlvZmZzZXQgKz0gY2h1bmstPmxlbmd0aDsKIAl9IHdoaWxlIChvZmZzZXQgPCBsZW4pOwogCi0JLyogUnVuIHRoZSBETUEgYW5kIHdhaXQgZm9yIHRoZSBhbnN3ZXIqLworCS8qIFJ1biB0aGUgRE1BIGFuZCB3YWl0IGZvciB0aGUgYW5zd2VyICovCiAJcmMgPSBpcHdfZndfZG1hX2tpY2socHJpdik7CiAJaWYgKHJjKSB7CiAJCUlQV19FUlJPUigiZG1hS2ljayBGYWlsZWRcbiIpOwpAQCAtMjI0Myw4ICsyMjU3LDggQEAKIAkJSVBXX0VSUk9SKCJkbWFXYWl0U3luYyBGYWlsZWRcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0gb3V0OgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoIHByaXYtPnBjaV9kZXYsIGxlbiwgc2hhcmVkX3ZpcnQsIHNoYXJlZF9waHlzKTsKKyAgICAgIG91dDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaV9kZXYsIGxlbiwgc2hhcmVkX3ZpcnQsIHNoYXJlZF9waHlzKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIyNTMsNyArMjI2Nyw3IEBACiB7CiAJaW50IHJjID0gMDsKIAotCS8qIHN0b3AqLworCS8qIHN0b3AgKi8KIAlpcHdfd3JpdGUzMihwcml2LCBDWDJfUkVTRVRfUkVHLCBDWDJfUkVTRVRfUkVHX1NUT1BfTUFTVEVSKTsKIAogCXJjID0gaXB3X3BvbGxfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsCkBAIC0yMjcyLDE0ICsyMjg2LDE1IEBACiB7CiAJSVBXX0RFQlVHX1RSQUNFKCI+PlxuIik7CiAKLQkvKiBwcnZId1N0YXJ0TmljICByZWxlYXNlIEFSQyovCisJLyogcHJ2SHdTdGFydE5pYyAgcmVsZWFzZSBBUkMgKi8KIAlpcHdfY2xlYXJfYml0KHByaXYsIENYMl9SRVNFVF9SRUcsCiAJCSAgICAgIENYMl9SRVNFVF9SRUdfTUFTVEVSX0RJU0FCTEVEIHwKIAkJICAgICAgQ1gyX1JFU0VUX1JFR19TVE9QX01BU1RFUiB8CiAJCSAgICAgIENCRF9SRVNFVF9SRUdfUFJJTkNFVE9OX1JFU0VUKTsKIAogCS8qIGVuYWJsZSBwb3dlciBtYW5hZ2VtZW50ICovCi0JaXB3X3NldF9iaXQocHJpdiwgQ1gyX0dQX0NOVFJMX1JXLCBDWDJfR1BfQ05UUkxfQklUX0hPU1RfQUxMT1dTX1NUQU5EQlkpOworCWlwd19zZXRfYml0KHByaXYsIENYMl9HUF9DTlRSTF9SVywKKwkJICAgIENYMl9HUF9DTlRSTF9CSVRfSE9TVF9BTExPV1NfU1RBTkRCWSk7CiAKIAlJUFdfREVCVUdfVFJBQ0UoIjw8XG4iKTsKIH0KQEAgLTIyOTUsMTIgKzIzMTAsMTMgQEAKIAlpcHdfc2V0X2JpdChwcml2LCBDWDJfR1BfQ05UUkxfUlcsIENYMl9HUF9DTlRSTF9CSVRfSU5JVF9ET05FKTsKIAogCS8qIGxvdy1sZXZlbCBQTEwgYWN0aXZhdGlvbiAqLwotCWlwd193cml0ZTMyKHByaXYsIENYMl9SRUFEX0lOVF9SRUdJU1RFUiwgIENYMl9CSVRfSU5UX0hPU1RfU1JBTV9SRUFEX0lOVF9SRUdJU1RFUik7CisJaXB3X3dyaXRlMzIocHJpdiwgQ1gyX1JFQURfSU5UX1JFR0lTVEVSLAorCQkgICAgQ1gyX0JJVF9JTlRfSE9TVF9TUkFNX1JFQURfSU5UX1JFR0lTVEVSKTsKIAogCS8qIHdhaXQgZm9yIGNsb2NrIHN0YWJpbGl6YXRpb24gKi8KIAlyYyA9IGlwd19wb2xsX2JpdChwcml2LCBDWDJfR1BfQ05UUkxfUlcsCiAJCQkgIENYMl9HUF9DTlRSTF9CSVRfQ0xPQ0tfUkVBRFksIDI1MCk7Ci0JaWYgKHJjIDwgMCApCisJaWYgKHJjIDwgMCkKIAkJSVBXX0RFQlVHX0lORk8oIkZBSUxFRCB3YWl0IGZvciBjbG9jayBzdGFibGl6YXRpb25cbiIpOwogCiAJLyogYXNzZXJ0IFNXIHJlc2V0ICovCkBAIC0yMzE1LDcgKzIzMzEsNiBAQAogCXJldHVybiAwOwogfQogCi0KIC8qIENhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIHByb2Nlc3MgY29udGV4dCwgaXQgd2lsbCBzbGVlcCBpbiByZXF1ZXN0X2Zpcm13YXJlLgogICogUHJvYmUgaXMgYW4gb2sgcGxhY2UgdG8gY2FsbCB0aGlzIGZyb20uCiAgKi8KQEAgLTIzODMsOCArMjM5OCw3IEBACiAJCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLwogCQlpZiAocnhxLT5wb29sW2ldLnNrYiAhPSBOVUxMKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5kbWFfYWRkciwKLQkJCQkJIENYMl9SWF9CVUZfU0laRSwKLQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCSBDWDJfUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKHJ4cS0+cG9vbFtpXS5za2IpOwogCQl9CiAJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKQEAgLTI0MzgsMTIgKzI0NTIsMTIgQEAKIAkJCWlmIChyYykKIAkJCQlnb3RvIGVycm9yOwogCi0JCQlyYyA9IGlwd19nZXRfZncocHJpdiwgJmZpcm13YXJlLCBJUFdfRldfTkFNRSgic25pZmZlciIpKTsKKwkJCXJjID0gaXB3X2dldF9mdyhwcml2LCAmZmlybXdhcmUsCisJCQkJCUlQV19GV19OQU1FKCJzbmlmZmVyIikpOwogCQkJYnJlYWs7CiAjZW5kaWYKIAkJY2FzZSBJV19NT0RFX0lORlJBOgotCQkJcmMgPSBpcHdfZ2V0X2Z3KHByaXYsICZ1Y29kZSwKLQkJCQkJSVBXX0ZXX05BTUUoImJzc191Y29kZSIpKTsKKwkJCXJjID0gaXB3X2dldF9mdyhwcml2LCAmdWNvZGUsIElQV19GV19OQU1FKCJic3NfdWNvZGUiKSk7CiAJCQlpZiAocmMpCiAJCQkJZ290byBlcnJvcjsKIApAQCAtMjQ3MSw3ICsyNDg1LDcgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLSByZXRyeToKKyAgICAgIHJldHJ5OgogCS8qIEVuc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLwogCWlwd193cml0ZTMyKHByaXYsIENYMl9JTlRBX01BU0tfUiwgfkNYMl9JTlRBX01BU0tfQUxMKTsKIAlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19JTlRfRU5BQkxFRDsKQEAgLTI1MjgsNyArMjU0Miw3IEBACiAJcmMgPSBpcHdfbG9hZF9maXJtd2FyZShwcml2LCBmaXJtd2FyZS0+ZGF0YSArCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpLAogCQkJICAgICAgIGZpcm13YXJlLT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpKTsKLQlpZiAocmMgPCAwICkgeworCWlmIChyYyA8IDApIHsKIAkJSVBXX0VSUk9SKCJVbmFibGUgdG8gbG9hZCBmaXJtd2FyZVxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMjU5Myw3ICsyNjA3LDcgQEAKICNlbmRpZgogCXJldHVybiAwOwogCi0gZXJyb3I6CisgICAgICBlcnJvcjoKIAlpZiAocHJpdi0+cnhxKSB7CiAJCWlwd19yeF9xdWV1ZV9mcmVlKHByaXYsIHByaXYtPnJ4cSk7CiAJCXByaXYtPnJ4cSA9IE5VTEw7CkBAIC0yNjcxLDggKzI2ODUsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBvZmZzZXQgd2l0aGluIEJBUiwgZnVsbCBhZGRyZXNzKQogICovCiBzdGF0aWMgdm9pZCBpcHdfcXVldWVfaW5pdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBjbHgyX3F1ZXVlICpxLAotCQkJICAgaW50IGNvdW50LCB1MzIgcmVhZCwgdTMyIHdyaXRlLAotCQkJICAgdTMyIGJhc2UsIHUzMiBzaXplKQorCQkJICAgaW50IGNvdW50LCB1MzIgcmVhZCwgdTMyIHdyaXRlLCB1MzIgYmFzZSwgdTMyIHNpemUpCiB7CiAJcS0+bl9iZCA9IGNvdW50OwogCkBAIC0yNjk4LDggKzI3MTEsNyBAQAogCiBzdGF0aWMgaW50IGlwd19xdWV1ZV90eF9pbml0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKIAkJCSAgICAgc3RydWN0IGNseDJfdHhfcXVldWUgKnEsCi0JCQkgICAgIGludCBjb3VudCwgdTMyIHJlYWQsIHUzMiB3cml0ZSwKLQkJCSAgICAgdTMyIGJhc2UsIHUzMiBzaXplKQorCQkJICAgICBpbnQgY291bnQsIHUzMiByZWFkLCB1MzIgd3JpdGUsIHUzMiBiYXNlLCB1MzIgc2l6ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcHJpdi0+cGNpX2RldjsKIApAQCAtMjcwOSwxMCArMjcyMSwxMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlxLT5iZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldixzaXplb2YocS0+YmRbMF0pKmNvdW50LCAmcS0+cS5kbWFfYWRkcik7CisJcS0+YmQgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIHNpemVvZihxLT5iZFswXSkgKiBjb3VudCwgJnEtPnEuZG1hX2FkZHIpOwogCWlmICghcS0+YmQpIHsKIAkJSVBXX0VSUk9SKCJwY2lfYWxsb2NfY29uc2lzdGVudCglemQpIGZhaWxlZFxuIiwKLQkJCQlzaXplb2YocS0+YmRbMF0pICogY291bnQpOworCQkJICBzaXplb2YocS0+YmRbMF0pICogY291bnQpOwogCQlrZnJlZShxLT50eGIpOwogCQlxLT50eGIgPSBOVUxMOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI3NjgsOCArMjc4MSw3IEBACiAgKiBAcGFyYW0gZGV2CiAgKiBAcGFyYW0gcQogICovCi1zdGF0aWMgdm9pZCBpcHdfcXVldWVfdHhfZnJlZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGNseDJfdHhfcXVldWUgKnR4cSkKK3N0YXRpYyB2b2lkIGlwd19xdWV1ZV90eF9mcmVlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgc3RydWN0IGNseDJfdHhfcXVldWUgKnR4cSkKIHsKIAlzdHJ1Y3QgY2x4Ml9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHByaXYtPnBjaV9kZXY7CkBAIC0yNzg0LDcgKzI3OTYsNyBAQAogCX0KIAogCS8qIGZyZWUgYnVmZmVycyBiZWxvbmdpbmcgdG8gcXVldWUgaXRzZWxmICovCi0JcGNpX2ZyZWVfY29uc2lzdGVudChkZXYsIHNpemVvZih0eHEtPmJkWzBdKSpxLT5uX2JkLCB0eHEtPmJkLAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBzaXplb2YodHhxLT5iZFswXSkgKiBxLT5uX2JkLCB0eHEtPmJkLAogCQkJICAgIHEtPmRtYV9hZGRyKTsKIAlrZnJlZSh0eHEtPnR4Yik7CiAKQEAgLTI3OTIsNyArMjgwNCw2IEBACiAJbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKIH0KIAotCiAvKioKICAqIERlc3Ryb3kgYWxsIERNQSBxdWV1ZXMgYW5kIHN0cnVjdHVyZXMKICAqCkBAIC0yODI1LDcgKzI4MzYsNyBAQAogCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfY3JlYXRlX2Jzc2lkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQorc3RhdGljIGlubGluZSB2b2lkIGlwd19jcmVhdGVfYnNzaWQoc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQogewogCS8qIEZpcnN0IDMgYnl0ZXMgYXJlIG1hbnVmYWN0dXJlciAqLwogCWJzc2lkWzBdID0gcHJpdi0+bWFjX2FkZHJbMF07CkBAIC0yODMzLDEzICsyODQ0LDEzIEBACiAJYnNzaWRbMl0gPSBwcml2LT5tYWNfYWRkclsyXTsKIAogCS8qIExhc3QgYnl0ZXMgYXJlIHJhbmRvbSAqLwotICAgICAgICBnZXRfcmFuZG9tX2J5dGVzKCZic3NpZFszXSwgRVRIX0FMRU4tMyk7CisJZ2V0X3JhbmRvbV9ieXRlcygmYnNzaWRbM10sIEVUSF9BTEVOIC0gMyk7CiAKLSAgICAgICAgYnNzaWRbMF0gJj0gMHhmZTsgICAgICAgLyogY2xlYXIgbXVsdGljYXN0IGJpdCAqLwotICAgICAgICBic3NpZFswXSB8PSAweDAyOyAgICAgICAvKiBzZXQgbG9jYWwgYXNzaWdubWVudCBiaXQgKElFRUU4MDIpICovCisJYnNzaWRbMF0gJj0gMHhmZTsJLyogY2xlYXIgbXVsdGljYXN0IGJpdCAqLworCWJzc2lkWzBdIHw9IDB4MDI7CS8qIHNldCBsb2NhbCBhc3NpZ25tZW50IGJpdCAoSUVFRTgwMikgKi8KIH0KIAotc3RhdGljIGlubGluZSB1OCBpcHdfYWRkX3N0YXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqYnNzaWQpCitzdGF0aWMgaW5saW5lIHU4IGlwd19hZGRfc3RhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCiB7CiAJc3RydWN0IGlwd19zdGF0aW9uX2VudHJ5IGVudHJ5OwogCWludCBpOwpAQCAtMjg2NiwxNCArMjg3NywxMyBAQAogCW1lbWNweShlbnRyeS5tYWNfYWRkciwgYnNzaWQsIEVUSF9BTEVOKTsKIAltZW1jcHkocHJpdi0+c3RhdGlvbnNbaV0sIGJzc2lkLCBFVEhfQUxFTik7CiAJaXB3X3dyaXRlX2RpcmVjdChwcml2LCBJUFdfU1RBVElPTl9UQUJMRV9MT1dFUiArIGkgKiBzaXplb2YoZW50cnkpLAotCQkJICZlbnRyeSwKLQkJCSBzaXplb2YoZW50cnkpKTsKKwkJCSAmZW50cnksIHNpemVvZihlbnRyeSkpOwogCXByaXYtPm51bV9zdGF0aW9ucysrOwogCiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggaXB3X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICpic3NpZCkKK3N0YXRpYyBpbmxpbmUgdTggaXB3X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCiB7CiAJaW50IGk7CiAKQEAgLTI5NDQsMjYgKzI5NTQsMzQgQEAKIAkgImFzc29jaWF0aW9uIGV4aXN0cyJ9LAogCXsweDBDLCAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZWFzb24gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyAiCiAJICJzdGFuZGFyZCJ9LAotCXsweDBELCAiUmVzcG9uZGluZyBzdGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBhdXRoZW50aWNhdGlvbiAiCisJezB4MEQsCisJICJSZXNwb25kaW5nIHN0YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGF1dGhlbnRpY2F0aW9uICIKIAkgImFsZ29yaXRobSJ9LAotCXsweDBFLCAiUmVjZWl2ZWQgYW4gQXV0aGVudGljYXRpb24gZnJhbWUgd2l0aCBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZSAiCisJezB4MEUsCisJICJSZWNlaXZlZCBhbiBBdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoIGF1dGhlbnRpY2F0aW9uIHNlcXVlbmNlICIKIAkgInRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciBvdXQgb2YgZXhwZWN0ZWQgc2VxdWVuY2UifSwKIAl7MHgwRiwgIkF1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGJlY2F1c2Ugb2YgY2hhbGxlbmdlIGZhaWx1cmUifSwKIAl7MHgxMCwgIkF1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGR1ZSB0byB0aW1lb3V0IHdhaXRpbmcgZm9yIG5leHQgIgogCSAiZnJhbWUgaW4gc2VxdWVuY2UifSwKIAl7MHgxMSwgIkFzc29jaWF0aW9uIGRlbmllZCBiZWNhdXNlIEFQIGlzIHVuYWJsZSB0byBoYW5kbGUgYWRkaXRpb25hbCAiCiAJICJhc3NvY2lhdGVkIHN0YXRpb25zIn0sCi0JezB4MTIsICJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyBhbGwgIgorCXsweDEyLAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgYWxsICIKIAkgIm9mIHRoZSBkYXRhcmF0ZXMgaW4gdGhlIEJTU0Jhc2ljU2VydmljZVNldCBQYXJhbWV0ZXIifSwKLQl7MHgxMywgIkFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nICIKKwl7MHgxMywKKwkgIkFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gcmVxdWVzdGluZyBzdGF0aW9uIG5vdCBzdXBwb3J0aW5nICIKIAkgInNob3J0IHByZWFtYmxlIG9wZXJhdGlvbiJ9LAotCXsweDE0LCAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgorCXsweDE0LAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgogCSAiUEJDQyBlbmNvZGluZyJ9LAotCXsweDE1LCAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgorCXsweDE1LAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgogCSAiY2hhbm5lbCBhZ2lsaXR5In0sCi0JezB4MTksICJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyAiCisJezB4MTksCisJICJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyAiCiAJICJzaG9ydCBzbG90IG9wZXJhdGlvbiJ9LAotCXsweDFBLCAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgorCXsweDFBLAorCSAiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgIgogCSAiRFNTUy1PRkRNIG9wZXJhdGlvbiJ9LAogCXsweDI4LCAiSW52YWxpZCBJbmZvcm1hdGlvbiBFbGVtZW50In0sCiAJezB4MjksICJHcm91cCBDaXBoZXIgaXMgbm90IHZhbGlkIn0sCkBAIC0zMDQzLDcgKzMwNjEsNiBAQAogCiB9CiAKLQogc3RhdGljIGlubGluZSB1MzIgaXB3X2dldF9tYXhfcmF0ZShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCiB7CiAJdTMyIGkgPSAweDgwMDAwMDAwOwpAQCAtMzA1NiwyMCArMzA3MywyMSBAQAogCS8qIFRPRE86IFZlcmlmeSB0aGF0IHRoZSByYXRlIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCByYXRlcwogCSAqIGxpc3QuICovCiAKLQl3aGlsZSAoaSAmJiAhKG1hc2sgJiBpKSkgaSA+Pj0gMTsKKwl3aGlsZSAoaSAmJiAhKG1hc2sgJiBpKSkKKwkJaSA+Pj0gMTsKIAlzd2l0Y2ggKGkpIHsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSzogcmV0dXJuIDEwMDAwMDA7Ci0JY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CX01BU0s6IHJldHVybiAyMDAwMDAwOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLOiByZXR1cm4gNTUwMDAwMDsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0s6IHJldHVybiA2MDAwMDAwOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSzogcmV0dXJuIDkwMDAwMDA7Ci0JY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLOiByZXR1cm4gMTEwMDAwMDA7Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSzogcmV0dXJuIDEyMDAwMDAwOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0s6IHJldHVybiAxODAwMDAwMDsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLOiByZXR1cm4gMjQwMDAwMDA7Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUJfTUFTSzogcmV0dXJuIDM2MDAwMDAwOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0s6IHJldHVybiA0ODAwMDAwMDsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLOiByZXR1cm4gNTQwMDAwMDA7CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0s6CXJldHVybiAxMDAwMDAwOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLOglyZXR1cm4gMjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSzoJcmV0dXJuIDU1MDAwMDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLOglyZXR1cm4gNjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0s6CXJldHVybiA5MDAwMDAwOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSzoJcmV0dXJuIDExMDAwMDAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0s6CXJldHVybiAxMjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLOglyZXR1cm4gMTgwMDAwMDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSzoJcmV0dXJuIDI0MDAwMDAwOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0s6CXJldHVybiAzNjAwMDAwMDsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLOglyZXR1cm4gNDgwMDAwMDA7CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSzoJcmV0dXJuIDU0MDAwMDAwOwogCX0KIAogCWlmIChwcml2LT5pZWVlLT5tb2RlID09IElFRUVfQikKQEAgLTMwOTcsMTggKzMxMTUsMTggQEAKIAkJcmV0dXJuIGlwd19nZXRfbWF4X3JhdGUocHJpdik7CiAKIAlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIElQV19UWF9SQVRFXzFNQjogIHJldHVybiAgMTAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzJNQjogIHJldHVybiAgMjAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzVNQjogIHJldHVybiAgNTUwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzZNQjogIHJldHVybiAgNjAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzlNQjogIHJldHVybiAgOTAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzExTUI6IHJldHVybiAxMTAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzEyTUI6IHJldHVybiAxMjAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzE4TUI6IHJldHVybiAxODAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzI0TUI6IHJldHVybiAyNDAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzM2TUI6IHJldHVybiAzNjAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzQ4TUI6IHJldHVybiA0ODAwMDAwMDsKLQljYXNlIElQV19UWF9SQVRFXzU0TUI6IHJldHVybiA1NDAwMDAwMDsKKwljYXNlIElQV19UWF9SQVRFXzFNQjoJcmV0dXJuIDEwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV8yTUI6CXJldHVybiAyMDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfNU1COglyZXR1cm4gNTUwMDAwMDsKKwljYXNlIElQV19UWF9SQVRFXzZNQjoJcmV0dXJuIDYwMDAwMDA7CisJY2FzZSBJUFdfVFhfUkFURV85TUI6CXJldHVybiA5MDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfMTFNQjoJcmV0dXJuIDExMDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfMTJNQjoJcmV0dXJuIDEyMDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfMThNQjoJcmV0dXJuIDE4MDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfMjRNQjoJcmV0dXJuIDI0MDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfMzZNQjoJcmV0dXJuIDM2MDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfNDhNQjoJcmV0dXJuIDQ4MDAwMDAwOworCWNhc2UgSVBXX1RYX1JBVEVfNTRNQjoJcmV0dXJuIDU0MDAwMDAwOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzEyNiw3ICszMTQ0LDcgQEAKIAl1MzIgbGVuID0gc2l6ZW9mKHUzMik7CiAJczE2IHJzc2k7CiAJdTMyIGJlYWNvbl9xdWFsaXR5LCBzaWduYWxfcXVhbGl0eSwgdHhfcXVhbGl0eSwgcnhfcXVhbGl0eSwKLQkJcmF0ZV9xdWFsaXR5OworCSAgICByYXRlX3F1YWxpdHk7CiAKIAlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkpIHsKIAkJcHJpdi0+cXVhbGl0eSA9IDA7CkBAIC0zMTM2LDEzICszMTU0LDEyIEBACiAJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzICovCiAJaXB3X2dldF9vcmRpbmFsKHByaXYsIElQV19PUkRfU1RBVF9NSVNTRURfQkVBQ09OUywKIAkJCSZwcml2LT5taXNzZWRfYmVhY29ucywgJmxlbik7Ci0JbWlzc2VkX2JlYWNvbnNfZGVsdGEgPSBwcml2LT5taXNzZWRfYmVhY29ucyAtCi0JCXByaXYtPmxhc3RfbWlzc2VkX2JlYWNvbnM7CisJbWlzc2VkX2JlYWNvbnNfZGVsdGEgPSBwcml2LT5taXNzZWRfYmVhY29ucyAtIHByaXYtPmxhc3RfbWlzc2VkX2JlYWNvbnM7CiAJcHJpdi0+bGFzdF9taXNzZWRfYmVhY29ucyA9IHByaXYtPm1pc3NlZF9iZWFjb25zOwogCWlmIChwcml2LT5hc3NvY19yZXF1ZXN0LmJlYWNvbl9pbnRlcnZhbCkgewogCQltaXNzZWRfYmVhY29uc19wZXJjZW50ID0gbWlzc2VkX2JlYWNvbnNfZGVsdGEgKgotCQkJKEhaICogcHJpdi0+YXNzb2NfcmVxdWVzdC5iZWFjb25faW50ZXJ2YWwpIC8KLQkJCShJUFdfU1RBVFNfSU5URVJWQUwgKiAxMCk7CisJCSAgICAoSFogKiBwcml2LT5hc3NvY19yZXF1ZXN0LmJlYWNvbl9pbnRlcnZhbCkgLworCQkgICAgKElQV19TVEFUU19JTlRFUlZBTCAqIDEwKTsKIAl9IGVsc2UgewogCQltaXNzZWRfYmVhY29uc19wZXJjZW50ID0gMDsKIAl9CkBAIC0zMTc5LDI4ICszMTk2LDI2IEBACiAJCWJlYWNvbl9xdWFsaXR5ID0gMDsKIAllbHNlCiAJCWJlYWNvbl9xdWFsaXR5ID0gKGJlYWNvbl9xdWFsaXR5IC0gQkVBQ09OX1RIUkVTSE9MRCkgKiAxMDAgLwotCQkJKDEwMCAtIEJFQUNPTl9USFJFU0hPTEQpOworCQkgICAgKDEwMCAtIEJFQUNPTl9USFJFU0hPTEQpOwogCUlQV19ERUJVR19TVEFUUygiTWlzc2VkIGJlYWNvbjogJTNkJSUgKCVkJSUpXG4iLAogCQkJYmVhY29uX3F1YWxpdHksIG1pc3NlZF9iZWFjb25zX3BlcmNlbnQpOwogCiAJcHJpdi0+bGFzdF9yYXRlID0gaXB3X2dldF9jdXJyZW50X3JhdGUocHJpdik7Ci0JcmF0ZV9xdWFsaXR5ID0gIHByaXYtPmxhc3RfcmF0ZSAqIDQwIC8gcHJpdi0+bGFzdF9yYXRlICsgNjA7CisJcmF0ZV9xdWFsaXR5ID0gcHJpdi0+bGFzdF9yYXRlICogNDAgLyBwcml2LT5sYXN0X3JhdGUgKyA2MDsKIAlJUFdfREVCVUdfU1RBVFMoIlJhdGUgcXVhbGl0eSA6ICUzZCUlICglZE1icylcbiIsCiAJCQlyYXRlX3F1YWxpdHksIHByaXYtPmxhc3RfcmF0ZSAvIDEwMDAwMDApOwogCi0JaWYgKHJ4X3BhY2tldHNfZGVsdGEgPiAxMDAgJiYKLQkgICAgcnhfcGFja2V0c19kZWx0YSArIHJ4X2Vycl9kZWx0YSkKKwlpZiAocnhfcGFja2V0c19kZWx0YSA+IDEwMCAmJiByeF9wYWNrZXRzX2RlbHRhICsgcnhfZXJyX2RlbHRhKQogCQlyeF9xdWFsaXR5ID0gMTAwIC0gKHJ4X2Vycl9kZWx0YSAqIDEwMCkgLwotCQkJKHJ4X3BhY2tldHNfZGVsdGEgKyByeF9lcnJfZGVsdGEpOworCQkgICAgKHJ4X3BhY2tldHNfZGVsdGEgKyByeF9lcnJfZGVsdGEpOwogCWVsc2UKIAkJcnhfcXVhbGl0eSA9IDEwMDsKIAlJUFdfREVCVUdfU1RBVFMoIlJ4IHF1YWxpdHkgICA6ICUzZCUlICgldSBlcnJvcnMsICV1IHBhY2tldHMpXG4iLAogCQkJcnhfcXVhbGl0eSwgcnhfZXJyX2RlbHRhLCByeF9wYWNrZXRzX2RlbHRhKTsKIAotCWlmICh0eF9wYWNrZXRzX2RlbHRhID4gMTAwICYmCi0JICAgIHR4X3BhY2tldHNfZGVsdGEgKyB0eF9mYWlsdXJlc19kZWx0YSkKKwlpZiAodHhfcGFja2V0c19kZWx0YSA+IDEwMCAmJiB0eF9wYWNrZXRzX2RlbHRhICsgdHhfZmFpbHVyZXNfZGVsdGEpCiAJCXR4X3F1YWxpdHkgPSAxMDAgLSAodHhfZmFpbHVyZXNfZGVsdGEgKiAxMDApIC8KLQkJCSh0eF9wYWNrZXRzX2RlbHRhICsgdHhfZmFpbHVyZXNfZGVsdGEpOworCQkgICAgKHR4X3BhY2tldHNfZGVsdGEgKyB0eF9mYWlsdXJlc19kZWx0YSk7CiAJZWxzZQogCQl0eF9xdWFsaXR5ID0gMTAwOwogCUlQV19ERUJVR19TVEFUUygiVHggcXVhbGl0eSAgIDogJTNkJSUgKCV1IGVycm9ycywgJXUgcGFja2V0cylcbiIsCkBAIC0zMjEzLDcgKzMyMjgsNyBAQAogCQlzaWduYWxfcXVhbGl0eSA9IDA7CiAJZWxzZQogCQlzaWduYWxfcXVhbGl0eSA9IChyc3NpIC0gV09SU1RfUlNTSSkgKiAxMDAgLwotCQkJKFBFUkZFQ1RfUlNTSSAtIFdPUlNUX1JTU0kpOworCQkgICAgKFBFUkZFQ1RfUlNTSSAtIFdPUlNUX1JTU0kpOwogCUlQV19ERUJVR19TVEFUUygiU2lnbmFsIGxldmVsIDogJTNkJSUgKCVkIGRCbSlcbiIsCiAJCQlzaWduYWxfcXVhbGl0eSwgcnNzaSk7CiAKQEAgLTMyMjEsMjUgKzMyMzYsMjAgQEAKIAkJICAgICAgbWluKHJhdGVfcXVhbGl0eSwKIAkJCSAgbWluKHR4X3F1YWxpdHksIG1pbihyeF9xdWFsaXR5LCBzaWduYWxfcXVhbGl0eSkpKSk7CiAJaWYgKHF1YWxpdHkgPT0gYmVhY29uX3F1YWxpdHkpCi0JCUlQV19ERUJVR19TVEFUUygKLQkJCSJRdWFsaXR5ICglZCUlKTogQ2xhbXBlZCB0byBtaXNzZWQgYmVhY29ucy5cbiIsCi0JCQlxdWFsaXR5KTsKKwkJSVBXX0RFQlVHX1NUQVRTKCJRdWFsaXR5ICglZCUlKTogQ2xhbXBlZCB0byBtaXNzZWQgYmVhY29ucy5cbiIsCisJCQkJcXVhbGl0eSk7CiAJaWYgKHF1YWxpdHkgPT0gcmF0ZV9xdWFsaXR5KQotCQlJUFdfREVCVUdfU1RBVFMoCi0JCQkiUXVhbGl0eSAoJWQlJSk6IENsYW1wZWQgdG8gcmF0ZSBxdWFsaXR5LlxuIiwKLQkJCXF1YWxpdHkpOworCQlJUFdfREVCVUdfU1RBVFMoIlF1YWxpdHkgKCVkJSUpOiBDbGFtcGVkIHRvIHJhdGUgcXVhbGl0eS5cbiIsCisJCQkJcXVhbGl0eSk7CiAJaWYgKHF1YWxpdHkgPT0gdHhfcXVhbGl0eSkKLQkJSVBXX0RFQlVHX1NUQVRTKAotCQkJIlF1YWxpdHkgKCVkJSUpOiBDbGFtcGVkIHRvIFR4IHF1YWxpdHkuXG4iLAotCQkJcXVhbGl0eSk7CisJCUlQV19ERUJVR19TVEFUUygiUXVhbGl0eSAoJWQlJSk6IENsYW1wZWQgdG8gVHggcXVhbGl0eS5cbiIsCisJCQkJcXVhbGl0eSk7CiAJaWYgKHF1YWxpdHkgPT0gcnhfcXVhbGl0eSkKLQkJSVBXX0RFQlVHX1NUQVRTKAotCQkJIlF1YWxpdHkgKCVkJSUpOiBDbGFtcGVkIHRvIFJ4IHF1YWxpdHkuXG4iLAotCQkJcXVhbGl0eSk7CisJCUlQV19ERUJVR19TVEFUUygiUXVhbGl0eSAoJWQlJSk6IENsYW1wZWQgdG8gUnggcXVhbGl0eS5cbiIsCisJCQkJcXVhbGl0eSk7CiAJaWYgKHF1YWxpdHkgPT0gc2lnbmFsX3F1YWxpdHkpCi0JCUlQV19ERUJVR19TVEFUUygKLQkJCSJRdWFsaXR5ICglZCUlKTogQ2xhbXBlZCB0byBzaWduYWwgcXVhbGl0eS5cbiIsCi0JCQlxdWFsaXR5KTsKKwkJSVBXX0RFQlVHX1NUQVRTKCJRdWFsaXR5ICglZCUlKTogQ2xhbXBlZCB0byBzaWduYWwgcXVhbGl0eS5cbiIsCisJCQkJcXVhbGl0eSk7CiAKIAlwcml2LT5xdWFsaXR5ID0gcXVhbGl0eTsKIApAQCAtMzI1MSw3OSArMzI2MSwyMDYgQEAKICAqIEhhbmRsZSBob3N0IG5vdGlmaWNhdGlvbiBwYWNrZXQuCiAgKiBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgcm91dGluZQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X3J4X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXB3X3ByaXYqIHByaXYsCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3X3J4X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCiAJCQkJICAgICAgIHN0cnVjdCBpcHdfcnhfbm90aWZpY2F0aW9uICpub3RpZikKIHsKLQlJUFdfREVCVUdfTk9USUYoInR5cGUgPSAlaSAoJWQgYnl0ZXMpXG4iLAotCQkJbm90aWYtPnN1YnR5cGUsIG5vdGlmLT5zaXplKTsKKwlJUFdfREVCVUdfTk9USUYoInR5cGUgPSAlaSAoJWQgYnl0ZXMpXG4iLCBub3RpZi0+c3VidHlwZSwgbm90aWYtPnNpemUpOwogCiAJc3dpdGNoIChub3RpZi0+c3VidHlwZSkgewotCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0FTU09DSUFURUQ6IHsKLQkJc3RydWN0IG5vdGlmX2Fzc29jaWF0aW9uICphc3NvYyA9ICZub3RpZi0+dS5hc3NvYzsKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19BU1NPQ0lBVEVEOnsKKwkJCXN0cnVjdCBub3RpZl9hc3NvY2lhdGlvbiAqYXNzb2MgPSAmbm90aWYtPnUuYXNzb2M7CiAKLQkJc3dpdGNoIChhc3NvYy0+c3RhdGUpIHsKLQkJY2FzZSBDTUFTX0FTU09DSUFURUQ6IHsKLQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfCBJUFdfRExfQVNTT0MsCi0JCQkJICAiYXNzb2NpYXRlZDogJyVzJyAiIE1BQ19GTVQgIiBcbiIsCi0JCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbiksCi0JCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7CisJCQlzd2l0Y2ggKGFzc29jLT5zdGF0ZSkgeworCQkJY2FzZSBDTUFTX0FTU09DSUFURUQ6eworCQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJCSAgSVBXX0RMX0FTU09DLAorCQkJCQkJICAiYXNzb2NpYXRlZDogJyVzJyAiIE1BQ19GTVQKKwkJCQkJCSAgIiBcbiIsCisJCQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwKKwkJCQkJCQkgICAgICAgcHJpdi0+ZXNzaWRfbGVuKSwKKwkJCQkJCSAgTUFDX0FSRyhwcml2LT5ic3NpZCkpOwogCi0JCQlzd2l0Y2ggKHByaXYtPmllZWUtPml3X21vZGUpIHsKLQkJCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJCQltZW1jcHkocHJpdi0+aWVlZS0+YnNzaWQsIHByaXYtPmJzc2lkLAotCQkJCSAgICAgICBFVEhfQUxFTik7Ci0JCQkJYnJlYWs7CisJCQkJCXN3aXRjaCAocHJpdi0+aWVlZS0+aXdfbW9kZSkgeworCQkJCQljYXNlIElXX01PREVfSU5GUkE6CisJCQkJCQltZW1jcHkocHJpdi0+aWVlZS0+YnNzaWQsCisJCQkJCQkgICAgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJCQkJCWJyZWFrOwogCi0JCQljYXNlIElXX01PREVfQURIT0M6Ci0JCQkJbWVtY3B5KHByaXYtPmllZWUtPmJzc2lkLCBwcml2LT5ic3NpZCwKLQkJCQkgICAgICAgRVRIX0FMRU4pOworCQkJCQljYXNlIElXX01PREVfQURIT0M6CisJCQkJCQltZW1jcHkocHJpdi0+aWVlZS0+YnNzaWQsCisJCQkJCQkgICAgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKIAotCQkJCS8qIGNsZWFyIG91dCB0aGUgc3RhdGlvbiB0YWJsZSAqLwotCQkJCXByaXYtPm51bV9zdGF0aW9ucyA9IDA7CisJCQkJCQkvKiBjbGVhciBvdXQgdGhlIHN0YXRpb24gdGFibGUgKi8KKwkJCQkJCXByaXYtPm51bV9zdGF0aW9ucyA9IDA7CiAKLQkJCQlJUFdfREVCVUdfQVNTT0MoInF1ZXVlaW5nIGFkaG9jIGNoZWNrXG4iKTsKLQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkJICAgJnByaXYtPmFkaG9jX2NoZWNrLAotCQkJCQkJICAgcHJpdi0+YXNzb2NfcmVxdWVzdC5iZWFjb25faW50ZXJ2YWwpOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCQkJSVBXX0RFQlVHX0FTU09DCisJCQkJCQkgICAgKCJxdWV1ZWluZyBhZGhvYyBjaGVja1xuIik7CisJCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+CisJCQkJCQkJCSAgIHdvcmtxdWV1ZSwKKwkJCQkJCQkJICAgJnByaXYtPgorCQkJCQkJCQkgICBhZGhvY19jaGVjaywKKwkJCQkJCQkJICAgcHJpdi0+CisJCQkJCQkJCSAgIGFzc29jX3JlcXVlc3QuCisJCQkJCQkJCSAgIGJlYWNvbl9pbnRlcnZhbCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQogCi0JCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19BU1NPQ0lBVElORzsKLQkJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfQVNTT0NJQVRFRDsKKwkJCQkJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfQVNTT0NJQVRJTkc7CisJCQkJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfQVNTT0NJQVRFRDsKIAotCQkJbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRfZGV2KTsKLQkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldF9kZXYpKSB7Ci0JCQkJSVBXX0RFQlVHX05PVElGKCJ3YWtpbmcgcXVldWVcbiIpOwotCQkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmV0X2Rldik7Ci0JCQl9IGVsc2UgewotCQkJCUlQV19ERUJVR19OT1RJRigic3RhcnRpbmcgcXVldWVcbiIpOwotCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPm5ldF9kZXYpOwotCQkJfQorCQkJCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPm5ldF9kZXYpOworCQkJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5uZXRfZGV2KSkgeworCQkJCQkJSVBXX0RFQlVHX05PVElGCisJCQkJCQkgICAgKCJ3YWtpbmcgcXVldWVcbiIpOworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZXRfZGV2KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUlQV19ERUJVR19OT1RJRgorCQkJCQkJICAgICgic3RhcnRpbmcgcXVldWVcbiIpOworCQkJCQkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+CisJCQkJCQkJCSAgbmV0X2Rldik7CisJCQkJCX0KIAotCQkJaXB3X3Jlc2V0X3N0YXRzKHByaXYpOwotCQkJLyogRW5zdXJlIHRoZSByYXRlIGlzIHVwZGF0ZWQgaW1tZWRpYXRlbHkgKi8KLQkJCXByaXYtPmxhc3RfcmF0ZSA9IGlwd19nZXRfY3VycmVudF9yYXRlKHByaXYpOwotCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+Z2F0aGVyX3N0YXRzKTsKLQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKKwkJCQkJaXB3X3Jlc2V0X3N0YXRzKHByaXYpOworCQkJCQkvKiBFbnN1cmUgdGhlIHJhdGUgaXMgdXBkYXRlZCBpbW1lZGlhdGVseSAqLworCQkJCQlwcml2LT5sYXN0X3JhdGUgPQorCQkJCQkgICAgaXB3X2dldF9jdXJyZW50X3JhdGUocHJpdik7CisJCQkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPmdhdGhlcl9zdGF0cyk7CisJCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKIAogLyoJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAogCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLAogCQkJCQkgICBTQ0FOX0FTU09DSUFURURfSU5URVJWQUwpOwogKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIENNQVNfQVVUSEVOVElDQVRFRDp7CisJCQkJCWlmIChwcml2LT4KKwkJCQkJICAgIHN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8CisJCQkJCQkgICAgICBTVEFUVVNfQVVUSCkpIHsKKyNpZmRlZiBDT05GSUdfSVBXX0RFQlVHCisJCQkJCQlzdHJ1Y3Qgbm90aWZfYXV0aGVudGljYXRlICphdXRoCisJCQkJCQkgICAgPSAmbm90aWYtPnUuYXV0aDsKKwkJCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfAorCQkJCQkJCSAgSVBXX0RMX1NUQVRFIHwKKwkJCQkJCQkgIElQV19ETF9BU1NPQywKKwkJCQkJCQkgICJkZWF1dGhlbnRpY2F0ZWQ6ICclcycgIgorCQkJCQkJCSAgTUFDX0ZNVAorCQkJCQkJCSAgIjogKDB4JTA0WCkgLSAlcyBcbiIsCisJCQkJCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+CisJCQkJCQkJCSAgICAgICBlc3NpZCwKKwkJCQkJCQkJICAgICAgIHByaXYtPgorCQkJCQkJCQkgICAgICAgZXNzaWRfbGVuKSwKKwkJCQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpLAorCQkJCQkJCSAgbnRvaHMoYXV0aC0+c3RhdHVzKSwKKwkJCQkJCQkgIGlwd19nZXRfc3RhdHVzX2NvZGUKKwkJCQkJCQkgIChudG9ocworCQkJCQkJCSAgIChhdXRoLT5zdGF0dXMpKSk7CisjZW5kaWYKKworCQkJCQkJcHJpdi0+c3RhdHVzICY9CisJCQkJCQkgICAgfihTVEFUVVNfQVNTT0NJQVRJTkcgfAorCQkJCQkJICAgICAgU1RBVFVTX0FVVEggfAorCQkJCQkJICAgICAgU1RBVFVTX0FTU09DSUFURUQpOworCisJCQkJCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT4KKwkJCQkJCQkJICBuZXRfZGV2KTsKKwkJCQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0X2Rldik7CisJCQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuKTsKKwkJCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCQkgIElQV19ETF9BU1NPQywKKwkJCQkJCSAgImF1dGhlbnRpY2F0ZWQ6ICclcycgIiBNQUNfRk1UCisJCQkJCQkgICJcbiIsCisJCQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwKKwkJCQkJCQkgICAgICAgcHJpdi0+ZXNzaWRfbGVuKSwKKwkJCQkJCSAgTUFDX0FSRyhwcml2LT5ic3NpZCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgQ01BU19JTklUOnsKKwkJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCQkgIElQV19ETF9BU1NPQywKKwkJCQkJCSAgImRpc2Fzc29jaWF0ZWQ6ICclcycgIiBNQUNfRk1UCisJCQkJCQkgICIgXG4iLAorCQkJCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsCisJCQkJCQkJICAgICAgIHByaXYtPmVzc2lkX2xlbiksCisJCQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKKworCQkJCQlwcml2LT5zdGF0dXMgJj0KKwkJCQkJICAgIH4oU1RBVFVTX0RJU0FTU09DSUFUSU5HIHwKKwkJCQkJICAgICAgU1RBVFVTX0FTU09DSUFUSU5HIHwKKwkJCQkJICAgICAgU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVVUSCk7CisKKwkJCQkJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRfZGV2KTsKKwkJCQkJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JPQU1JTkcpKSB7CisJCQkJCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT4KKwkJCQkJCQkJICBuZXRfZGV2KTsKKwkJCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKKworCQkJCQkJLyogQ2FuY2VsIGFueSBxdWV1ZWQgd29yayAuLi4gKi8KKwkJCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPgorCQkJCQkJCQkgICAgcmVxdWVzdF9zY2FuKTsKKwkJCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPgorCQkJCQkJCQkgICAgYWRob2NfY2hlY2spOworCisJCQkJCQkvKiBRdWV1ZSB1cCBhbm90aGVyIHNjYW4uLi4gKi8KKwkJCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAorCQkJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4pOworCisJCQkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT4KKwkJCQkJCQkJICAgIGdhdGhlcl9zdGF0cyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JPQU1JTkc7CisJCQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuKTsKKwkJCQkJfQorCisJCQkJCWlwd19yZXNldF9zdGF0cyhwcml2KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCUlQV19FUlJPUigiYXNzb2M6IHVua25vd24gKCVkKVxuIiwKKwkJCQkJICBhc3NvYy0+c3RhdGUpOworCQkJCWJyZWFrOworCQkJfQorCiAJCQlicmVhazsKIAkJfQogCi0JCWNhc2UgQ01BU19BVVRIRU5USUNBVEVEOiB7Ci0JCQlpZiAocHJpdi0+c3RhdHVzICYgKFNUQVRVU19BU1NPQ0lBVEVEIHwgU1RBVFVTX0FVVEgpKSB7Ci0jaWZkZWYgQ09ORklHX0lQV19ERUJVRwotCQkJCXN0cnVjdCBub3RpZl9hdXRoZW50aWNhdGUgKmF1dGggPSAmbm90aWYtPnUuYXV0aDsKLQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCQkgICJkZWF1dGhlbnRpY2F0ZWQ6ICclcycgIiBNQUNfRk1UICI6ICgweCUwNFgpIC0gJXMgXG4iLAotCQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKSwKLQkJCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSwKLQkJCQkJICBudG9ocyhhdXRoLT5zdGF0dXMpLAotCQkJCQkgIGlwd19nZXRfc3RhdHVzX2NvZGUobnRvaHMoYXV0aC0+c3RhdHVzKSkpOwotI2VuZGlmCisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfQVVUSEVOVElDQVRFOnsKKwkJCXN0cnVjdCBub3RpZl9hdXRoZW50aWNhdGUgKmF1dGggPSAmbm90aWYtPnUuYXV0aDsKKwkJCXN3aXRjaCAoYXV0aC0+c3RhdGUpIHsKKwkJCWNhc2UgQ01BU19BVVRIRU5USUNBVEVEOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUsCisJCQkJCSAgImF1dGhlbnRpY2F0ZWQ6ICclcycgIiBNQUNfRk1UICIgXG4iLAorCQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwKKwkJCQkJCSAgICAgICBwcml2LT5lc3NpZF9sZW4pLAorCQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKKwkJCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX0FVVEg7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01BU19JTklUOgorCQkJCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVVUSCkgeworCQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJCSAgSVBXX0RMX0FTU09DLAorCQkJCQkJICAiYXV0aGVudGljYXRpb24gZmFpbGVkICgweCUwNFgpOiAlc1xuIiwKKwkJCQkJCSAgbnRvaHMoYXV0aC0+c3RhdHVzKSwKKwkJCQkJCSAgaXB3X2dldF9zdGF0dXNfY29kZShudG9ocworCQkJCQkJCQkgICAgICAoYXV0aC0+CisJCQkJCQkJCSAgICAgICBzdGF0dXMpKSk7CisJCQkJfQorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywKKwkJCQkJICAiZGVhdXRoZW50aWNhdGVkOiAnJXMnICIgTUFDX0ZNVCAiXG4iLAorCQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwKKwkJCQkJCSAgICAgICBwcml2LT5lc3NpZF9sZW4pLAorCQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKIAogCQkJCXByaXYtPnN0YXR1cyAmPSB+KFNUQVRVU19BU1NPQ0lBVElORyB8CiAJCQkJCQkgIFNUQVRVU19BVVRIIHwKQEAgLTMzMzEsMzIyICszNDY4LDI0NyBAQAogCiAJCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0X2Rldik7CiAJCQkJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRfZGV2KTsKLQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4pOwogCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKIAkJCQlicmVhazsKKworCQkJY2FzZSBDTUFTX1RYX0FVVEhfU0VRXzE6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiQVVUSF9TRVFfMVxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfUlhfQVVUSF9TRVFfMjoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsICJBVVRIX1NFUV8yXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19BVVRIX1NFUV8xX1BBU1M6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiQVVUSF9TRVFfMV9QQVNTXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19BVVRIX1NFUV8xX0ZBSUw6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiQVVUSF9TRVFfMV9GQUlMXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19UWF9BVVRIX1NFUV8zOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFVVEhfU0VRXzNcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBDTUFTX1JYX0FVVEhfU0VRXzQ6CisJCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8CisJCQkJCSAgSVBXX0RMX0FTU09DLCAiUlhfQVVUSF9TRVFfNFxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfQVVUSF9TRVFfMl9QQVNTOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFVVEhfU0VRXzJfUEFTU1xuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfQVVUSF9TRVFfMl9GQUlMOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFVVF9TRVFfMl9GQUlMXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19UWF9BU1NPQzoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsICJUWF9BU1NPQ1xuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIENNQVNfUlhfQVNTT0NfUkVTUDoKKwkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwKKwkJCQkJICBJUFdfRExfQVNTT0MsICJSWF9BU1NPQ19SRVNQXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01BU19BU1NPQ0lBVEVEOgorCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfAorCQkJCQkgIElQV19ETF9BU1NPQywgIkFTU09DSUFURURcbiIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlJUFdfREVCVUdfTk9USUYoImF1dGg6IGZhaWx1cmUgLSAlZFxuIiwKKwkJCQkJCWF1dGgtPnN0YXRlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19TQ0FOX0NIQU5ORUxfUkVTVUxUOnsKKwkJCXN0cnVjdCBub3RpZl9jaGFubmVsX3Jlc3VsdCAqeCA9CisJCQkgICAgJm5vdGlmLT51LmNoYW5uZWxfcmVzdWx0OworCisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19ERUJVR19TQ0FOKCJTY2FuIHJlc3VsdCBmb3IgY2hhbm5lbCAlZFxuIiwKKwkJCQkJICAgICAgIHgtPmNoYW5uZWxfbnVtKTsKKwkJCX0gZWxzZSB7CisJCQkJSVBXX0RFQlVHX1NDQU4oIlNjYW4gcmVzdWx0IG9mIHdyb25nIHNpemUgJWQgIgorCQkJCQkgICAgICAgIihzaG91bGQgYmUgJXpkKVxuIiwKKwkJCQkJICAgICAgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19TQ0FOX0NPTVBMRVRFRDp7CisJCQlzdHJ1Y3Qgbm90aWZfc2Nhbl9jb21wbGV0ZSAqeCA9ICZub3RpZi0+dS5zY2FuX2NvbXBsZXRlOworCQkJaWYgKG5vdGlmLT5zaXplID09IHNpemVvZigqeCkpIHsKKwkJCQlJUFdfREVCVUdfU0NBTgorCQkJCSAgICAoIlNjYW4gY29tcGxldGVkOiB0eXBlICVkLCAlZCBjaGFubmVscywgIgorCQkJCSAgICAgIiVkIHN0YXR1c1xuIiwgeC0+c2Nhbl90eXBlLAorCQkJCSAgICAgeC0+bnVtX2NoYW5uZWxzLCB4LT5zdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlJUFdfRVJST1IoIlNjYW4gY29tcGxldGVkIG9mIHdyb25nIHNpemUgJWQgIgorCQkJCQkgICIoc2hvdWxkIGJlICV6ZClcbiIsCisJCQkJCSAgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOworCQkJfQorCisJCQlwcml2LT5zdGF0dXMgJj0KKwkJCSAgICB+KFNUQVRVU19TQ0FOTklORyB8IFNUQVRVU19TQ0FOX0FCT1JUSU5HKTsKKworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+c2Nhbl9jaGVjayk7CisKKwkJCWlmICghKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8CisJCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVElORyB8CisJCQkJCSAgICAgIFNUQVRVU19ST0FNSU5HIHwKKwkJCQkJICAgICAgU1RBVFVTX0RJU0FTU09DSUFUSU5HKSkpCisJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5hc3NvY2lhdGUpOworCQkJZWxzZSBpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JPQU1JTkcpIHsKKwkJCQkvKiBJZiBhIHNjYW4gY29tcGxldGVkIGFuZCB3ZSBhcmUgaW4gcm9hbSBtb2RlLCB0aGVuCisJCQkJICogdGhlIHNjYW4gdGhhdCBjb21wbGV0ZWQgd2FzIHRoZSBvbmUgcmVxdWVzdGVkIGFzIGEKKwkJCQkgKiByZXN1bHQgb2YgZW50ZXJpbmcgcm9hbS4uLiBzbywgc2NoZWR1bGUgdGhlCisJCQkJICogcm9hbSB3b3JrICovCisJCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yb2FtKTsKKwkJCX0gZWxzZSBpZiAocHJpdi0+c3RhdHVzICYgU1RBVFVTX1NDQU5fUEVORElORykKKwkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisKKwkJCXByaXYtPmllZWUtPnNjYW5zKys7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfRlJBR19MRU5HVEg6eworCQkJc3RydWN0IG5vdGlmX2ZyYWdfbGVuZ3RoICp4ID0gJm5vdGlmLT51LmZyYWdfbGVuOworCisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19FUlJPUigiRnJhZyBsZW5ndGg6ICVkXG4iLCB4LT5mcmFnX2xlbmd0aCk7CisJCQl9IGVsc2UgeworCQkJCUlQV19FUlJPUigiRnJhZyBsZW5ndGggb2Ygd3Jvbmcgc2l6ZSAlZCAiCisJCQkJCSAgIihzaG91bGQgYmUgJXpkKVxuIiwKKwkJCQkJICBub3RpZi0+c2l6ZSwgc2l6ZW9mKCp4KSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfTElOS19ERVRFUklPUkFUSU9OOnsKKwkJCXN0cnVjdCBub3RpZl9saW5rX2RldGVyaW9yYXRpb24gKnggPQorCQkJICAgICZub3RpZi0+dS5saW5rX2RldGVyaW9yYXRpb247CisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUsCisJCQkJCSAgImxpbmsgZGV0ZXJpb3JhdGlvbjogJyVzJyAiIE1BQ19GTVQKKwkJCQkJICAiIFxuIiwgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLAorCQkJCQkJCSAgICAgIHByaXYtPmVzc2lkX2xlbiksCisJCQkJCSAgTUFDX0FSRyhwcml2LT5ic3NpZCkpOworCQkJCW1lbWNweSgmcHJpdi0+bGFzdF9saW5rX2RldGVyaW9yYXRpb24sIHgsCisJCQkJICAgICAgIHNpemVvZigqeCkpOworCQkJfSBlbHNlIHsKKwkJCQlJUFdfRVJST1IoIkxpbmsgRGV0ZXJpb3JhdGlvbiBvZiB3cm9uZyBzaXplICVkICIKKwkJCQkJICAiKHNob3VsZCBiZSAlemQpXG4iLAorCQkJCQkgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX0RJTk9fQ09ORklHX1JFU1BPTlNFOnsKKwkJCUlQV19FUlJPUigiRGlubyBjb25maWdcbiIpOworCQkJaWYgKHByaXYtPmhjbWQKKwkJCSAgICAmJiBwcml2LT5oY21kLT5jbWQgPT0gSE9TVF9DTURfRElOT19DT05GSUcpIHsKKwkJCQkvKiBUT0RPOiBEbyBhbnl0aGluZyBzcGVjaWFsPyAqLworCQkJfSBlbHNlIHsKKwkJCQlJUFdfRVJST1IoIlVuZXhwZWN0ZWQgRElOT19DT05GSUdfUkVTUE9OU0VcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0JFQUNPTl9TVEFURTp7CisJCQlzdHJ1Y3Qgbm90aWZfYmVhY29uX3N0YXRlICp4ID0gJm5vdGlmLT51LmJlYWNvbl9zdGF0ZTsKKwkJCWlmIChub3RpZi0+c2l6ZSAhPSBzaXplb2YoKngpKSB7CisJCQkJSVBXX0VSUk9SCisJCQkJICAgICgiQmVhY29uIHN0YXRlIG9mIHdyb25nIHNpemUgJWQgKHNob3VsZCAiCisJCQkJICAgICAiYmUgJXpkKVxuIiwgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOworCQkJCWJyZWFrOwogCQkJfQogCi0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgImF1dGhlbnRpY2F0ZWQ6ICclcycgIiBNQUNfRk1UICJcbiIsCi0JCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbiksCi0JCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7Ci0JCQlicmVhazsKLQkJfQorCQkJaWYgKHgtPnN0YXRlID09IEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19CRUFDT05fTUlTU0lORykgeworCQkJCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfU0NBTk5JTkcpIHsKKwkJCQkJLyogU3RvcCBzY2FuIHRvIGtlZXAgZncgZnJvbSBnZXR0aW5nCisJCQkJCSAqIHN0dWNrLi4uICovCisJCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAorCQkJCQkJICAgJnByaXYtPmFib3J0X3NjYW4pOworCQkJCX0KIAotCQljYXNlIENNQVNfSU5JVDogewotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkgICJkaXNhc3NvY2lhdGVkOiAnJXMnICIgTUFDX0ZNVCAiIFxuIiwKLQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKSwKLQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKKwkJCQlpZiAoeC0+bnVtYmVyID4gcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgJiYKKwkJCQkgICAgcHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpIHsKKwkJCQkJSVBXX0RFQlVHKElQV19ETF9JTkZPIHwgSVBXX0RMX05PVElGIHwKKwkJCQkJCSAgSVBXX0RMX1NUQVRFLAorCQkJCQkJICAiTWlzc2VkIGJlYWNvbjogJWQgLSBkaXNhc3NvY2lhdGVcbiIsCisJCQkJCQkgIHgtPm51bWJlcik7CisJCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAorCQkJCQkJICAgJnByaXYtPmRpc2Fzc29jaWF0ZSk7CisJCQkJfSBlbHNlIGlmICh4LT5udW1iZXIgPiBwcml2LT5yb2FtaW5nX3RocmVzaG9sZCkgeworCQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFLAorCQkJCQkJICAiTWlzc2VkIGJlYWNvbjogJWQgLSBpbml0aWF0ZSAiCisJCQkJCQkgICJyb2FtaW5nXG4iLCB4LT5udW1iZXIpOworCQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCSAgICZwcml2LT5yb2FtKTsKKwkJCQl9IGVsc2UgeworCQkJCQlJUFdfREVCVUdfTk9USUYoIk1pc3NlZCBiZWFjb246ICVkXG4iLAorCQkJCQkJCXgtPm51bWJlcik7CisJCQkJfQogCi0JCQlwcml2LT5zdGF0dXMgJj0gfigKLQkJCQlTVEFUVVNfRElTQVNTT0NJQVRJTkcgfAotCQkJCVNUQVRVU19BU1NPQ0lBVElORyB8Ci0JCQkJU1RBVFVTX0FTU09DSUFURUQgfAotCQkJCVNUQVRVU19BVVRIKTsKKwkJCQlwcml2LT5ub3RpZl9taXNzZWRfYmVhY29ucyA9IHgtPm51bWJlcjsKIAotCQkJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRfZGV2KTsKLQkJCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19ST0FNSU5HKSkgewotCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldF9kZXYpOwotCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2KTsKLQotCQkJCS8qIENhbmNlbCBhbnkgcXVldWVkIHdvcmsgLi4uICovCi0JCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmVxdWVzdF9zY2FuKTsKLQkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hZGhvY19jaGVjayk7Ci0KLQkJCQkvKiBRdWV1ZSB1cCBhbm90aGVyIHNjYW4uLi4gKi8KLQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKLQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7Ci0KLQkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5nYXRoZXJfc3RhdHMpOwotCQkJfSBlbHNlIHsKLQkJCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1JPQU1JTkc7Ci0JCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCi0JCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4pOwogCQkJfQogCi0JCQlpcHdfcmVzZXRfc3RhdHMocHJpdik7CiAJCQlicmVhazsKIAkJfQogCi0JCWRlZmF1bHQ6Ci0JCQlJUFdfRVJST1IoImFzc29jOiB1bmtub3duICglZClcbiIsCi0JCQkJICBhc3NvYy0+c3RhdGUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0KLQljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19BVVRIRU5USUNBVEU6IHsKLQkJc3RydWN0IG5vdGlmX2F1dGhlbnRpY2F0ZSAqYXV0aCA9ICZub3RpZi0+dS5hdXRoOwotCQlzd2l0Y2ggKGF1dGgtPnN0YXRlKSB7Ci0JCWNhc2UgQ01BU19BVVRIRU5USUNBVEVEOgotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSwKLQkJCQkgICJhdXRoZW50aWNhdGVkOiAnJXMnICIgTUFDX0ZNVCAiIFxuIiwKLQkJCQkgIGVzY2FwZV9lc3NpZChwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKSwKLQkJCQkgIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKLQkJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfQVVUSDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01BU19JTklUOgotCQkJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BVVRIKSB7Ci0JCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkJICAiYXV0aGVudGljYXRpb24gZmFpbGVkICgweCUwNFgpOiAlc1xuIiwKLQkJCQkJICBudG9ocyhhdXRoLT5zdGF0dXMpLAotCQkJCQkgIGlwd19nZXRfc3RhdHVzX2NvZGUobnRvaHMoYXV0aC0+c3RhdHVzKSkpOwotCQkJfQotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkgICJkZWF1dGhlbnRpY2F0ZWQ6ICclcycgIiBNQUNfRk1UICJcbiIsCi0JCQkJICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbiksCi0JCQkJICBNQUNfQVJHKHByaXYtPmJzc2lkKSk7Ci0KLQkJCXByaXYtPnN0YXR1cyAmPSB+KFNUQVRVU19BU1NPQ0lBVElORyB8Ci0JCQkJCSAgU1RBVFVTX0FVVEggfAotCQkJCQkgIFNUQVRVU19BU1NPQ0lBVEVEKTsKLQotCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0X2Rldik7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldF9kZXYpOwotCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXF1ZXN0X3NjYW4pOwotCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHByaXYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTUFTX1RYX0FVVEhfU0VRXzE6Ci0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgIkFVVEhfU0VRXzFcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01BU19SWF9BVVRIX1NFUV8yOgotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkgICJBVVRIX1NFUV8yXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIENNQVNfQVVUSF9TRVFfMV9QQVNTOgotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkgICJBVVRIX1NFUV8xX1BBU1NcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01BU19BVVRIX1NFUV8xX0ZBSUw6Ci0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgIkFVVEhfU0VRXzFfRkFJTFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBDTUFTX1RYX0FVVEhfU0VRXzM6Ci0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgIkFVVEhfU0VRXzNcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01BU19SWF9BVVRIX1NFUV80OgotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkgICJSWF9BVVRIX1NFUV80XG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIENNQVNfQVVUSF9TRVFfMl9QQVNTOgotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSB8IElQV19ETF9BU1NPQywKLQkJCQkgICJBVVRIX1NFUV8yX1BBU1NcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01BU19BVVRIX1NFUV8yX0ZBSUw6Ci0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgIkFVVF9TRVFfMl9GQUlMXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIENNQVNfVFhfQVNTT0M6Ci0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgIlRYX0FTU09DXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIENNQVNfUlhfQVNTT0NfUkVTUDoKLQkJCUlQV19ERUJVRyhJUFdfRExfTk9USUYgfCBJUFdfRExfU1RBVEUgfCBJUFdfRExfQVNTT0MsCi0JCQkJICAiUlhfQVNTT0NfUkVTUFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBDTUFTX0FTU09DSUFURUQ6Ci0JCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFIHwgSVBXX0RMX0FTU09DLAotCQkJCSAgIkFTU09DSUFURURcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlJUFdfREVCVUdfTk9USUYoImF1dGg6IGZhaWx1cmUgLSAlZFxuIiwgYXV0aC0+c3RhdGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfU0NBTl9DSEFOTkVMX1JFU1VMVDogewotCQlzdHJ1Y3Qgbm90aWZfY2hhbm5lbF9yZXN1bHQgKnggPSAmbm90aWYtPnUuY2hhbm5lbF9yZXN1bHQ7Ci0KLQkJaWYgKG5vdGlmLT5zaXplID09IHNpemVvZigqeCkpIHsKLQkJCUlQV19ERUJVR19TQ0FOKCJTY2FuIHJlc3VsdCBmb3IgY2hhbm5lbCAlZFxuIiwKLQkJCQkgICAgICAgeC0+Y2hhbm5lbF9udW0pOwotCQl9IGVsc2UgewotCQkJSVBXX0RFQlVHX1NDQU4oIlNjYW4gcmVzdWx0IG9mIHdyb25nIHNpemUgJWQgIgotCQkJCSAgICAgICAiKHNob3VsZCBiZSAlemQpXG4iLAotCQkJCSAgICAgICBub3RpZi0+c2l6ZSwgc2l6ZW9mKCp4KSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfU0NBTl9DT01QTEVURUQ6IHsKLQkJc3RydWN0IG5vdGlmX3NjYW5fY29tcGxldGUqIHggPSAmbm90aWYtPnUuc2Nhbl9jb21wbGV0ZTsKLQkJaWYgKG5vdGlmLT5zaXplID09IHNpemVvZigqeCkpIHsKLQkJCUlQV19ERUJVR19TQ0FOKCJTY2FuIGNvbXBsZXRlZDogdHlwZSAlZCwgJWQgY2hhbm5lbHMsICIKLQkJCQkgICAgICAgIiVkIHN0YXR1c1xuIiwKLQkJCQkgICAgICAgeC0+c2Nhbl90eXBlLAotCQkJCSAgICAgICB4LT5udW1fY2hhbm5lbHMsCi0JCQkJICAgICAgIHgtPnN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlJUFdfRVJST1IoIlNjYW4gY29tcGxldGVkIG9mIHdyb25nIHNpemUgJWQgIgotCQkJCSAgIihzaG91bGQgYmUgJXpkKVxuIiwKLQkJCQkgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKLQkJfQotCi0JCXByaXYtPnN0YXR1cyAmPSB+KFNUQVRVU19TQ0FOTklORyB8IFNUQVRVU19TQ0FOX0FCT1JUSU5HKTsKLQotCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKLQotCQlpZiAoIShwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfAotCQkJCSAgICAgIFNUQVRVU19BU1NPQ0lBVElORyB8Ci0JCQkJICAgICAgU1RBVFVTX1JPQU1JTkcgfAotCQkJCSAgICAgIFNUQVRVU19ESVNBU1NPQ0lBVElORykpKQotCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5hc3NvY2lhdGUpOwotCQllbHNlIGlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfUk9BTUlORykgewotCQkJLyogSWYgYSBzY2FuIGNvbXBsZXRlZCBhbmQgd2UgYXJlIGluIHJvYW0gbW9kZSwgdGhlbgotCQkJICogdGhlIHNjYW4gdGhhdCBjb21wbGV0ZWQgd2FzIHRoZSBvbmUgcmVxdWVzdGVkIGFzIGEKLQkJCSAqIHJlc3VsdCBvZiBlbnRlcmluZyByb2FtLi4uIHNvLCBzY2hlZHVsZSB0aGUKLQkJCSAqIHJvYW0gd29yayAqLwotCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yb2FtKTsKLQkJfSBlbHNlIGlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfU0NBTl9QRU5ESU5HKQotCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXF1ZXN0X3NjYW4pOwotCi0JCXByaXYtPmllZWUtPnNjYW5zKys7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0ZSQUdfTEVOR1RIOiB7Ci0JCXN0cnVjdCBub3RpZl9mcmFnX2xlbmd0aCAqeCA9ICZub3RpZi0+dS5mcmFnX2xlbjsKLQotCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgewotCQkJSVBXX0VSUk9SKCJGcmFnIGxlbmd0aDogJWRcbiIsIHgtPmZyYWdfbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCUlQV19FUlJPUigiRnJhZyBsZW5ndGggb2Ygd3Jvbmcgc2l6ZSAlZCAiCi0JCQkJICAiKHNob3VsZCBiZSAlemQpXG4iLAotCQkJCSAgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSE9TVF9OT1RJRklDQVRJT05fU1RBVFVTX0xJTktfREVURVJJT1JBVElPTjogewotCQlzdHJ1Y3Qgbm90aWZfbGlua19kZXRlcmlvcmF0aW9uICp4ID0KLQkJCSZub3RpZi0+dS5saW5rX2RldGVyaW9yYXRpb247Ci0JCWlmIChub3RpZi0+c2l6ZT09c2l6ZW9mKCp4KSkgewotCQkJSVBXX0RFQlVHKElQV19ETF9OT1RJRiB8IElQV19ETF9TVEFURSwKLQkJCQkgICJsaW5rIGRldGVyaW9yYXRpb246ICclcycgIiBNQUNfRk1UICIgXG4iLAotCQkJCSAgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pLAotCQkJCSAgTUFDX0FSRyhwcml2LT5ic3NpZCkpOwotCQkJbWVtY3B5KCZwcml2LT5sYXN0X2xpbmtfZGV0ZXJpb3JhdGlvbiwgeCwgc2l6ZW9mKCp4KSk7Ci0JCX0gZWxzZSB7Ci0JCQlJUFdfRVJST1IoIkxpbmsgRGV0ZXJpb3JhdGlvbiBvZiB3cm9uZyBzaXplICVkICIKLQkJCQkgICIoc2hvdWxkIGJlICV6ZClcbiIsCi0JCQkJICBub3RpZi0+c2l6ZSwgc2l6ZW9mKCp4KSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBIT1NUX05PVElGSUNBVElPTl9ESU5PX0NPTkZJR19SRVNQT05TRTogewotCQlJUFdfRVJST1IoIkRpbm8gY29uZmlnXG4iKTsKLQkJaWYgKHByaXYtPmhjbWQgJiYgcHJpdi0+aGNtZC0+Y21kID09IEhPU1RfQ01EX0RJTk9fQ09ORklHKSB7Ci0JCQkvKiBUT0RPOiBEbyBhbnl0aGluZyBzcGVjaWFsPyAqLwotCQl9IGVsc2UgewotCQkJSVBXX0VSUk9SKCJVbmV4cGVjdGVkIERJTk9fQ09ORklHX1JFU1BPTlNFXG4iKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19CRUFDT05fU1RBVEU6IHsKLQkJc3RydWN0IG5vdGlmX2JlYWNvbl9zdGF0ZSAqeCA9ICZub3RpZi0+dS5iZWFjb25fc3RhdGU7Ci0JCWlmIChub3RpZi0+c2l6ZSAhPSBzaXplb2YoKngpKSB7Ci0JCQlJUFdfRVJST1IoIkJlYWNvbiBzdGF0ZSBvZiB3cm9uZyBzaXplICVkIChzaG91bGQgIgotCQkJCSAgImJlICV6ZClcbiIsIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHgtPnN0YXRlID09IEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19CRUFDT05fTUlTU0lORykgewotCQkJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19TQ0FOTklORykgewotCQkJCS8qIFN0b3Agc2NhbiB0byBrZWVwIGZ3IGZyb20gZ2V0dGluZwotCQkJCSAqIHN0dWNrLi4uICovCi0JCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCi0JCQkJCSAgICZwcml2LT5hYm9ydF9zY2FuKTsKKwljYXNlIEhPU1RfTk9USUZJQ0FUSU9OX1NUQVRVU19UR0lfVFhfS0VZOnsKKwkJCXN0cnVjdCBub3RpZl90Z2lfdHhfa2V5ICp4ID0gJm5vdGlmLT51LnRnaV90eF9rZXk7CisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCUlQV19FUlJPUigiVEdpIFR4IEtleTogc3RhdGUgMHglMDJ4IHNlYyB0eXBlICIKKwkJCQkJICAiMHglMDJ4IHN0YXRpb24gJWRcbiIsCisJCQkJCSAgeC0+a2V5X3N0YXRlLCB4LT5zZWN1cml0eV90eXBlLAorCQkJCQkgIHgtPnN0YXRpb25faW5kZXgpOworCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAoeC0+bnVtYmVyID4gcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgJiYKLQkJCSAgICBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkgewotCQkJCUlQV19ERUJVRyhJUFdfRExfSU5GTyB8IElQV19ETF9OT1RJRiB8Ci0JCQkJCSAgSVBXX0RMX1NUQVRFLAotCQkJCQkgICJNaXNzZWQgYmVhY29uOiAlZCAtIGRpc2Fzc29jaWF0ZVxuIiwKLQkJCQkJICB4LT5udW1iZXIpOwotCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkgICAmcHJpdi0+ZGlzYXNzb2NpYXRlKTsKLQkJCX0gZWxzZSBpZiAoeC0+bnVtYmVyID4gcHJpdi0+cm9hbWluZ190aHJlc2hvbGQpIHsKLQkJCQlJUFdfREVCVUcoSVBXX0RMX05PVElGIHwgSVBXX0RMX1NUQVRFLAotCQkJCQkgICJNaXNzZWQgYmVhY29uOiAlZCAtIGluaXRpYXRlICIKLQkJCQkJICAicm9hbWluZ1xuIiwKLQkJCQkJICB4LT5udW1iZXIpOwotCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkgICAmcHJpdi0+cm9hbSk7Ci0JCQl9IGVsc2UgewotCQkJCUlQV19ERUJVR19OT1RJRigiTWlzc2VkIGJlYWNvbjogJWRcbiIsCi0JCQkJCQl4LT5udW1iZXIpOworCQkJSVBXX0VSUk9SCisJCQkgICAgKCJUR2kgVHggS2V5IG9mIHdyb25nIHNpemUgJWQgKHNob3VsZCBiZSAlemQpXG4iLAorCQkJICAgICBub3RpZi0+c2l6ZSwgc2l6ZW9mKCp4KSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9DQUxJQl9LRUVQX1JFU1VMVFM6eworCQkJc3RydWN0IG5vdGlmX2NhbGlicmF0aW9uICp4ID0gJm5vdGlmLT51LmNhbGlicmF0aW9uOworCisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKCp4KSkgeworCQkJCW1lbWNweSgmcHJpdi0+Y2FsaWIsIHgsIHNpemVvZigqeCkpOworCQkJCUlQV19ERUJVR19JTkZPKCJUT0RPOiBDYWxpYnJhdGlvblxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXByaXYtPm5vdGlmX21pc3NlZF9iZWFjb25zID0geC0+bnVtYmVyOwotCi0gICAgICAgICAgICAgICAgfQotCi0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBIT1NUX05PVElGSUNBVElPTl9TVEFUVVNfVEdJX1RYX0tFWTogewotCQlzdHJ1Y3Qgbm90aWZfdGdpX3R4X2tleSAqeCA9ICZub3RpZi0+dS50Z2lfdHhfa2V5OwotCQlpZiAobm90aWYtPnNpemU9PXNpemVvZigqeCkpIHsKLQkJCUlQV19FUlJPUigiVEdpIFR4IEtleTogc3RhdGUgMHglMDJ4IHNlYyB0eXBlICIKLQkJCQkgICIweCUwMnggc3RhdGlvbiAlZFxuIiwKLQkJCQkgIHgtPmtleV9zdGF0ZSx4LT5zZWN1cml0eV90eXBlLAotCQkJCSAgeC0+c3RhdGlvbl9pbmRleCk7CisJCQlJUFdfRVJST1IKKwkJCSAgICAoIkNhbGlicmF0aW9uIG9mIHdyb25nIHNpemUgJWQgKHNob3VsZCBiZSAlemQpXG4iLAorCQkJICAgICBub3RpZi0+c2l6ZSwgc2l6ZW9mKCp4KSk7CiAJCQlicmVhazsKIAkJfQogCi0JCUlQV19FUlJPUigiVEdpIFR4IEtleSBvZiB3cm9uZyBzaXplICVkIChzaG91bGQgYmUgJXpkKVxuIiwKLQkJCSAgbm90aWYtPnNpemUsIHNpemVvZigqeCkpOwotCQlicmVhazsKLQl9CisJY2FzZSBIT1NUX05PVElGSUNBVElPTl9OT0lTRV9TVEFUUzp7CisJCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKHUzMikpIHsKKwkJCQlwcml2LT5sYXN0X25vaXNlID0KKwkJCQkgICAgKHU4KSAobm90aWYtPnUubm9pc2UudmFsdWUgJiAweGZmKTsKKwkJCQlhdmVyYWdlX2FkZCgmcHJpdi0+YXZlcmFnZV9ub2lzZSwKKwkJCQkJICAgIHByaXYtPmxhc3Rfbm9pc2UpOworCQkJCWJyZWFrOworCQkJfQogCi0JY2FzZSBIT1NUX05PVElGSUNBVElPTl9DQUxJQl9LRUVQX1JFU1VMVFM6IHsKLQkJc3RydWN0IG5vdGlmX2NhbGlicmF0aW9uICp4ID0gJm5vdGlmLT51LmNhbGlicmF0aW9uOwotCi0JCWlmIChub3RpZi0+c2l6ZSA9PSBzaXplb2YoKngpKSB7Ci0JCQltZW1jcHkoJnByaXYtPmNhbGliLCB4LCBzaXplb2YoKngpKTsKLQkJCUlQV19ERUJVR19JTkZPKCJUT0RPOiBDYWxpYnJhdGlvblxuIik7CisJCQlJUFdfRVJST1IKKwkJCSAgICAoIk5vaXNlIHN0YXQgaXMgd3Jvbmcgc2l6ZSAlZCAoc2hvdWxkIGJlICV6ZClcbiIsCisJCQkgICAgIG5vdGlmLT5zaXplLCBzaXplb2YodTMyKSk7CiAJCQlicmVhazsKIAkJfQogCi0JCUlQV19FUlJPUigiQ2FsaWJyYXRpb24gb2Ygd3Jvbmcgc2l6ZSAlZCAoc2hvdWxkIGJlICV6ZClcbiIsCi0JCQkgIG5vdGlmLT5zaXplLCBzaXplb2YoKngpKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBIT1NUX05PVElGSUNBVElPTl9OT0lTRV9TVEFUUzogewotCQlpZiAobm90aWYtPnNpemUgPT0gc2l6ZW9mKHUzMikpIHsKLQkJCXByaXYtPmxhc3Rfbm9pc2UgPSAodTgpKG5vdGlmLT51Lm5vaXNlLnZhbHVlICYgMHhmZik7Ci0JCQlhdmVyYWdlX2FkZCgmcHJpdi0+YXZlcmFnZV9ub2lzZSwgcHJpdi0+bGFzdF9ub2lzZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCUlQV19FUlJPUigiTm9pc2Ugc3RhdCBpcyB3cm9uZyBzaXplICVkIChzaG91bGQgYmUgJXpkKVxuIiwKLQkJCSAgbm90aWYtPnNpemUsIHNpemVvZih1MzIpKTsKLQkJYnJlYWs7Ci0JfQotCiAJZGVmYXVsdDoKIAkJSVBXX0VSUk9SKCJVbmtub3duIG5vdGlmaWNhdGlvbjogIgogCQkJICAic3VidHlwZT0lZCxmbGFncz0weCUyeCxzaXplPSVkXG4iLApAQCAtMzY4MCw4ICszNzQyLDcgQEAKIAlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFbMF0sIG5UeCwKIAkJCSAgICAgICBDWDJfVFhfUVVFVUVfMF9SRUFEX0lOREVYLAogCQkJICAgICAgIENYMl9UWF9RVUVVRV8wX1dSSVRFX0lOREVYLAotCQkJICAgICAgIENYMl9UWF9RVUVVRV8wX0JEX0JBU0UsCi0JCQkgICAgICAgQ1gyX1RYX1FVRVVFXzBfQkRfU0laRSk7CisJCQkgICAgICAgQ1gyX1RYX1FVRVVFXzBfQkRfQkFTRSwgQ1gyX1RYX1FVRVVFXzBfQkRfU0laRSk7CiAJaWYgKHJjKSB7CiAJCUlQV19FUlJPUigiVHggMCBxdWV1ZSBpbml0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CkBAIC0zNjg5LDggKzM3NTAsNyBAQAogCXJjID0gaXB3X3F1ZXVlX3R4X2luaXQocHJpdiwgJnByaXYtPnR4cVsxXSwgblR4LAogCQkJICAgICAgIENYMl9UWF9RVUVVRV8xX1JFQURfSU5ERVgsCiAJCQkgICAgICAgQ1gyX1RYX1FVRVVFXzFfV1JJVEVfSU5ERVgsCi0JCQkgICAgICAgQ1gyX1RYX1FVRVVFXzFfQkRfQkFTRSwKLQkJCSAgICAgICBDWDJfVFhfUVVFVUVfMV9CRF9TSVpFKTsKKwkJCSAgICAgICBDWDJfVFhfUVVFVUVfMV9CRF9CQVNFLCBDWDJfVFhfUVVFVUVfMV9CRF9TSVpFKTsKIAlpZiAocmMpIHsKIAkJSVBXX0VSUk9SKCJUeCAxIHF1ZXVlIGluaXQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKQEAgLTM2OTgsOCArMzc1OCw3IEBACiAJcmMgPSBpcHdfcXVldWVfdHhfaW5pdChwcml2LCAmcHJpdi0+dHhxWzJdLCBuVHgsCiAJCQkgICAgICAgQ1gyX1RYX1FVRVVFXzJfUkVBRF9JTkRFWCwKIAkJCSAgICAgICBDWDJfVFhfUVVFVUVfMl9XUklURV9JTkRFWCwKLQkJCSAgICAgICBDWDJfVFhfUVVFVUVfMl9CRF9CQVNFLAotCQkJICAgICAgIENYMl9UWF9RVUVVRV8yX0JEX1NJWkUpOworCQkJICAgICAgIENYMl9UWF9RVUVVRV8yX0JEX0JBU0UsIENYMl9UWF9RVUVVRV8yX0JEX1NJWkUpOwogCWlmIChyYykgewogCQlJUFdfRVJST1IoIlR4IDIgcXVldWUgaW5pdCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwpAQCAtMzcwNyw4ICszNzY2LDcgQEAKIAlyYyA9IGlwd19xdWV1ZV90eF9pbml0KHByaXYsICZwcml2LT50eHFbM10sIG5UeCwKIAkJCSAgICAgICBDWDJfVFhfUVVFVUVfM19SRUFEX0lOREVYLAogCQkJICAgICAgIENYMl9UWF9RVUVVRV8zX1dSSVRFX0lOREVYLAotCQkJICAgICAgIENYMl9UWF9RVUVVRV8zX0JEX0JBU0UsCi0JCQkgICAgICAgQ1gyX1RYX1FVRVVFXzNfQkRfU0laRSk7CisJCQkgICAgICAgQ1gyX1RYX1FVRVVFXzNfQkRfQkFTRSwgQ1gyX1RYX1FVRVVFXzNfQkRfU0laRSk7CiAJaWYgKHJjKSB7CiAJCUlQV19FUlJPUigiVHggMyBxdWV1ZSBpbml0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CkBAIC0zNzE4LDcgKzM3NzYsNyBAQAogCXByaXYtPnJ4X3BlbmRfbWF4ID0gMDsKIAlyZXR1cm4gcmM7CiAKLSBlcnJvcjoKKyAgICAgIGVycm9yOgogCWlwd190eF9xdWV1ZV9mcmVlKHByaXYpOwogCXJldHVybiByYzsKIH0KQEAgLTM3NDYsOCArMzgwNCw4IEBACiAJaHdfdGFpbCA9IGlwd19yZWFkMzIocHJpdiwgcS0+cmVnX3IpOwogCWlmIChod190YWlsID49IHEtPm5fYmQpIHsKIAkJSVBXX0VSUk9SCi0JCQkoIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSAoJWQpIGlzIG91dCBvZiByYW5nZSBbMC0lZClcbiIsCi0JCQkgaHdfdGFpbCwgcS0+bl9iZCk7CisJCSAgICAoIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSAoJWQpIGlzIG91dCBvZiByYW5nZSBbMC0lZClcbiIsCisJCSAgICAgaHdfdGFpbCwgcS0+bl9iZCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAJZm9yICg7IHEtPmxhc3RfdXNlZCAhPSBod190YWlsOwpAQCAtMzc1NSw3ICszODEzLDcgQEAKIAkJaXB3X3F1ZXVlX3R4X2ZyZWVfdGZkKHByaXYsIHR4cSk7CiAJCXByaXYtPnR4X3BhY2tldHMrKzsKIAl9Ci0gZG9uZToKKyAgICAgIGRvbmU6CiAJaWYgKGlwd19xdWV1ZV9zcGFjZShxKSA+IHEtPmxvd19tYXJrICYmIHFpbmRleCA+PSAwKSB7CiAJCV9fbWF5YmVfd2FrZV90eChwcml2KTsKIAl9CkBAIC0zNzk1LDggKzM4NTMsNiBAQAogCXJldHVybiAwOwogfQogCi0KLQogLyoKICAqIFJ4IHRoZW9yeSBvZiBvcGVyYXRpb24KICAqCkBAIC0zOTMzLDkgKzM5ODksOSBAQAogCQlsaXN0X2RlbChlbGVtZW50KTsKIAogCQlyeGItPnJ4YiA9IChzdHJ1Y3QgaXB3X3J4X2J1ZmZlciAqKXJ4Yi0+c2tiLT5kYXRhOwotCQlyeGItPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoCi0JCQlwcml2LT5wY2lfZGV2LCByeGItPnNrYi0+ZGF0YSwgQ1gyX1JYX0JVRl9TSVpFLAotCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcnhiLT5kbWFfYWRkciA9CisJCSAgICBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCByeGItPnNrYi0+ZGF0YSwKKwkJCQkgICBDWDJfUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF9mcmVlKTsKIAkJcnhxLT5mcmVlX2NvdW50Kys7CkBAIC0zOTUwLDggKzQwMDYsNyBAQAogICogVGhpcyBmcmVlIHJvdXRpbmUgd2Fsa3MgdGhlIGxpc3Qgb2YgUE9PTCBlbnRyaWVzIGFuZCBpZiBTS0IgaXMgc2V0IHRvCiAgKiBub24gTlVMTCBpdCBpcyB1bm1hcHBlZCBhbmQgZnJlZWQKICAqLwotc3RhdGljIHZvaWQgaXB3X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGlwd19wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGlwd19yeF9xdWV1ZSAqcnhxKQorc3RhdGljIHZvaWQgaXB3X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGlwd19wcml2ICpwcml2LCBzdHJ1Y3QgaXB3X3J4X3F1ZXVlICpyeHEpCiB7CiAJaW50IGk7CiAKQEAgLTM5NjEsOCArNDAxNiw3IEBACiAJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlM7IGkrKykgewogCQlpZiAocnhxLT5wb29sW2ldLnNrYiAhPSBOVUxMKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5kbWFfYWRkciwKLQkJCQkJIENYMl9SWF9CVUZfU0laRSwKLQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCSBDWDJfUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKHJ4cS0+cG9vbFtpXS5za2IpOwogCQl9CiAJfQpAQCAtNDAwMSwyOCArNDA1NSwyOCBAQAogCQlzd2l0Y2ggKHJhdGUpIHsKIAkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKIAkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyA/Ci0JCQkJMSA6IDA7CisJCQkgICAgMSA6IDA7CiAJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CiAJCQlyZXR1cm4gcHJpdi0+cmF0ZXNfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJICAgIDEgOiAwOwogCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLQkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyA/IDEgOiAwOwogCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKLQkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSyA/IDEgOiAwOwogCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKLQkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8yNE1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSyA/IDEgOiAwOwogCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKLQkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUJfTUFTSyA/IDEgOiAwOwogCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKLQkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSyA/IDEgOiAwOwogCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKLQkJCXJldHVybiBwcml2LT5yYXRlc19tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sgPwotCQkJCTEgOiAwOworCQkJcmV0dXJuIHByaXYtPgorCQkJICAgIHJhdGVzX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSyA/IDEgOiAwOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTQwNzQsMTAgKzQxMjgsMTEgQEAKIAlpbnQgbnVtX3JhdGVzLCBpOwogCiAJbWVtc2V0KHJhdGVzLCAwLCBzaXplb2YoKnJhdGVzKSk7Ci0JbnVtX3JhdGVzID0gbWluKG5ldHdvcmstPnJhdGVzX2xlbiwgKHU4KUlQV19NQVhfUkFURVMpOworCW51bV9yYXRlcyA9IG1pbihuZXR3b3JrLT5yYXRlc19sZW4sICh1OCkgSVBXX01BWF9SQVRFUyk7CiAJcmF0ZXMtPm51bV9yYXRlcyA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG51bV9yYXRlczsgaSsrKSB7Ci0JCWlmICghaXB3X2lzX3JhdGVfaW5fbWFzayhwcml2LCBuZXR3b3JrLT5tb2RlLCBuZXR3b3JrLT5yYXRlc1tpXSkpIHsKKwkJaWYgKCFpcHdfaXNfcmF0ZV9pbl9tYXNrCisJCSAgICAocHJpdiwgbmV0d29yay0+bW9kZSwgbmV0d29yay0+cmF0ZXNbaV0pKSB7CiAJCQlJUFdfREVCVUdfU0NBTigiUmF0ZSAlMDJYIG1hc2tlZCA6IDB4JTA4WFxuIiwKIAkJCQkgICAgICAgbmV0d29yay0+cmF0ZXNbaV0sIHByaXYtPnJhdGVzX21hc2spOwogCQkJY29udGludWU7CkBAIC00MDg2LDE1ICs0MTQxLDE4IEBACiAJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9IG5ldHdvcmstPnJhdGVzW2ldOwogCX0KIAotCW51bV9yYXRlcyA9IG1pbihuZXR3b3JrLT5yYXRlc19leF9sZW4sICh1OCkoSVBXX01BWF9SQVRFUyAtIG51bV9yYXRlcykpOworCW51bV9yYXRlcyA9CisJICAgIG1pbihuZXR3b3JrLT5yYXRlc19leF9sZW4sICh1OCkgKElQV19NQVhfUkFURVMgLSBudW1fcmF0ZXMpKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3JhdGVzOyBpKyspIHsKLQkJaWYgKCFpcHdfaXNfcmF0ZV9pbl9tYXNrKHByaXYsIG5ldHdvcmstPm1vZGUsIG5ldHdvcmstPnJhdGVzX2V4W2ldKSkgeworCQlpZiAoIWlwd19pc19yYXRlX2luX21hc2sKKwkJICAgIChwcml2LCBuZXR3b3JrLT5tb2RlLCBuZXR3b3JrLT5yYXRlc19leFtpXSkpIHsKIAkJCUlQV19ERUJVR19TQ0FOKCJSYXRlICUwMlggbWFza2VkIDogMHglMDhYXG4iLAogCQkJCSAgICAgICBuZXR3b3JrLT5yYXRlc19leFtpXSwgcHJpdi0+cmF0ZXNfbWFzayk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9IG5ldHdvcmstPnJhdGVzX2V4W2ldOworCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPQorCQkgICAgbmV0d29yay0+cmF0ZXNfZXhbaV07CiAJfQogCiAJcmV0dXJuIHJhdGVzLT5udW1fcmF0ZXM7CkBAIC00MTEzLDY1ICs0MTcxLDY1IEBACiAgKiBtYXNrIHNob3VsZCBldmVyIGJlIHVzZWQgLS0gcmlnaHQgbm93IGFsbCBjYWxsZXJzIHRvIGFkZCB0aGUgc2NhbiByYXRlcyBhcmUKICAqIHNldCB3aXRoIHRoZSBtb2R1bGF0aW9uID0gQ0NLLCBzbyBCQVNJQ19SQVRFX01BU0sgaXMgbmV2ZXIgc2V0Li4uICovCiBzdGF0aWMgdm9pZCBpcHdfYWRkX2Nja19zY2FuX3JhdGVzKHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpyYXRlcywKLQkJCSAgICAgICB1OCBtb2R1bGF0aW9uLCB1MzIgcmF0ZV9tYXNrKQorCQkJCSAgIHU4IG1vZHVsYXRpb24sIHUzMiByYXRlX21hc2spCiB7CiAJdTggYmFzaWNfbWFzayA9IChJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OID09IG1vZHVsYXRpb24pID8KLQkJSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyA6IDA7CisJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgOiAwOwogCiAJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSykKIAkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0KLQkJCUlFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COworCQkgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CiAKIAlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQogCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPQotCQkJSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKIAogCWlmIChyYXRlX21hc2sgJiBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CX01BU0spCiAJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9IGJhc2ljX21hc2sgfAotCQkJSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKKwkJICAgIElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CiAKIAlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSykKIAkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0gYmFzaWNfbWFzayB8Ci0JCQlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKKwkJICAgIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COwogfQogCiBzdGF0aWMgdm9pZCBpcHdfYWRkX29mZG1fc2Nhbl9yYXRlcyhzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqcmF0ZXMsCi0JCQkJdTggbW9kdWxhdGlvbiwgdTMyIHJhdGVfbWFzaykKKwkJCQkgICAgdTggbW9kdWxhdGlvbiwgdTMyIHJhdGVfbWFzaykKIHsKIAl1OCBiYXNpY19tYXNrID0gKElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gPT0gbW9kdWxhdGlvbikgPwotCQlJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIDogMDsKKwkgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyA6IDA7CiAKIAlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSykKIAkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0gYmFzaWNfbWFzayB8Ci0JCQlJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwogCiAJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0spCiAJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9Ci0JCQlJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKwkJICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COwogCiAJaWYgKHJhdGVfbWFzayAmIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLKQogCQlyYXRlcy0+c3VwcG9ydGVkX3JhdGVzW3JhdGVzLT5udW1fcmF0ZXMrK10gPSBiYXNpY19tYXNrIHwKLQkJCUlFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKKwkJICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKIAogCWlmIChyYXRlX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSykKIAkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0KLQkJCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKIAogCWlmIChyYXRlX21hc2sgJiBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKIAkJcmF0ZXMtPnN1cHBvcnRlZF9yYXRlc1tyYXRlcy0+bnVtX3JhdGVzKytdID0gYmFzaWNfbWFzayB8Ci0JCQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CiAKIAlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0spCiAJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9Ci0JCQlJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CiAKIAlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0spCiAJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9Ci0JCQlJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CiAKIAlpZiAocmF0ZV9tYXNrICYgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0spCiAJCXJhdGVzLT5zdXBwb3J0ZWRfcmF0ZXNbcmF0ZXMtPm51bV9yYXRlcysrXSA9Ci0JCQlJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisJCSAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CiB9CiAKIHN0cnVjdCBpcHdfbmV0d29ya19tYXRjaCB7CkBAIC00MTc5LDExICs0MjM3LDkgQEAKIAlzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyByYXRlczsKIH07CiAKLXN0YXRpYyBpbnQgaXB3X2Jlc3RfbmV0d29yaygKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCi0Jc3RydWN0IGlwd19uZXR3b3JrX21hdGNoICptYXRjaCwKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCi0JaW50IHJvYW1pbmcpCitzdGF0aWMgaW50IGlwd19iZXN0X25ldHdvcmsoc3RydWN0IGlwd19wcml2ICpwcml2LAorCQkJICAgIHN0cnVjdCBpcHdfbmV0d29ya19tYXRjaCAqbWF0Y2gsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLCBpbnQgcm9hbWluZykKIHsKIAlzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyByYXRlczsKIApAQCAtNDIzMSwyMSArNDI4NywyMSBAQAogCQkgICAgIG1lbWNtcChuZXR3b3JrLT5zc2lkLCBwcml2LT5lc3NpZCwKIAkJCSAgICBtaW4obmV0d29yay0+c3NpZF9sZW4sIHByaXYtPmVzc2lkX2xlbikpKSkgewogCQkJY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOwotCQkJc3RybmNweShlc2NhcGVkLCBlc2NhcGVfZXNzaWQoCi0JCQkJCW5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSwKKwkJCXN0cm5jcHkoZXNjYXBlZCwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pLAogCQkJCXNpemVvZihlc2NhcGVkKSk7CiAJCQlJUFdfREVCVUdfQVNTT0MoIk5ldHdvcmsgJyVzICgiIE1BQ19GTVQgIiknIGV4Y2x1ZGVkICIKIAkJCQkJImJlY2F1c2Ugb2YgRVNTSUQgbWlzbWF0Y2g6ICclcycuXG4iLAogCQkJCQllc2NhcGVkLCBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKLQkJCQkJZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pKTsKKwkJCQkJZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLAorCQkJCQkJICAgICBwcml2LT5lc3NpZF9sZW4pKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCiAJLyogSWYgdGhlIG9sZCBuZXR3b3JrIHJhdGUgaXMgYmV0dGVyIHRoYW4gdGhpcyBvbmUsIGRvbid0IGJvdGhlcgogCSAqIHRlc3RpbmcgZXZlcnl0aGluZyBlbHNlLiAqLwotCWlmIChtYXRjaC0+bmV0d29yayAmJiBtYXRjaC0+bmV0d29yay0+c3RhdHMucnNzaSA+Ci0JICAgIG5ldHdvcmstPnN0YXRzLnJzc2kpIHsKKwlpZiAobWF0Y2gtPm5ldHdvcmsgJiYgbWF0Y2gtPm5ldHdvcmstPnN0YXRzLnJzc2kgPiBuZXR3b3JrLT5zdGF0cy5yc3NpKSB7CiAJCWNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKIAkJc3RybmNweShlc2NhcGVkLAogCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSwKQEAgLTQzMDMsNyArNDM1OSw3IEBACiAJCQkJcHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OID8gIm9uIiA6CiAJCQkJIm9mZiIsCiAJCQkJbmV0d29yay0+Y2FwYWJpbGl0eSAmCi0JCQkJV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgPyJvbiIgOiAib2ZmIik7CisJCQkJV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgPyAib24iIDogIm9mZiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQzMTIsOCArNDM2OCw3IEBACiAJCUlQV19ERUJVR19BU1NPQygiTmV0d29yayAnJXMgKCIgTUFDX0ZNVCAiKScgZXhjbHVkZWQgIgogCQkJCSJiZWNhdXNlIG9mIEJTU0lEIG1pc21hdGNoOiAiIE1BQ19GTVQgIi5cbiIsCiAJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSwKLQkJCQlNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKLQkJCQlNQUNfQVJHKHByaXYtPmJzc2lkKSk7CisJCQkJTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCksIE1BQ19BUkcocHJpdi0+YnNzaWQpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00MzUxLDkgKzQ0MDYsOCBAQAogCXJldHVybiAxOwogfQogCi0KIHN0YXRpYyB2b2lkIGlwd19hZGhvY19jcmVhdGUoc3RydWN0IGlwd19wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQogewogCS8qCiAJICogRm9yIHRoZSBwdXJwb3NlcyBvZiBzY2FubmluZywgd2UgY2FuIHNldCBvdXIgd2lyZWxlc3MgbW9kZQpAQCAtNDM5Myw4ICs0NDQ3LDcgQEAKIAlpZiAocHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OKQogCQluZXR3b3JrLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwogCW5ldHdvcmstPnJhdGVzX2xlbiA9IG1pbihwcml2LT5yYXRlcy5udW1fcmF0ZXMsIE1BWF9SQVRFU19MRU5HVEgpOwotCW1lbWNweShuZXR3b3JrLT5yYXRlcywgcHJpdi0+cmF0ZXMuc3VwcG9ydGVkX3JhdGVzLAotCSAgICAgICBuZXR3b3JrLT5yYXRlc19sZW4pOworCW1lbWNweShuZXR3b3JrLT5yYXRlcywgcHJpdi0+cmF0ZXMuc3VwcG9ydGVkX3JhdGVzLCBuZXR3b3JrLT5yYXRlc19sZW4pOwogCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IHByaXYtPnJhdGVzLm51bV9yYXRlcyAtIG5ldHdvcmstPnJhdGVzX2xlbjsKIAltZW1jcHkobmV0d29yay0+cmF0ZXNfZXgsCiAJICAgICAgICZwcml2LT5yYXRlcy5zdXBwb3J0ZWRfcmF0ZXNbbmV0d29yay0+cmF0ZXNfbGVuXSwKQEAgLTQ0MDQsMTMgKzQ0NTcsMTMgQEAKIAluZXR3b3JrLT5sYXN0X2Fzc29jaWF0ZSA9IDA7CiAJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IDA7CiAJbmV0d29yay0+dGltZV9zdGFtcFsxXSA9IDA7Ci0JbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gMTAwOyAvKiBEZWZhdWx0ICovCi0JbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMTA7ICAvKiBEZWZhdWx0ICovCi0JbmV0d29yay0+YXRpbV93aW5kb3cgPSAwOyAgICAgICAvKiBEZWZhdWx0ICovCisJbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gMTAwOwkvKiBEZWZhdWx0ICovCisJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMTA7CS8qIERlZmF1bHQgKi8KKwluZXR3b3JrLT5hdGltX3dpbmRvdyA9IDA7CS8qIERlZmF1bHQgKi8KICNpZmRlZiBDT05GSUdfSUVFRTgwMjExX1dQQQogCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOwogCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOwotI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFfV1BBICovCisjZW5kaWYJCQkJLyogQ09ORklHX0lFRUU4MDIxMV9XUEEgKi8KIH0KIAogc3RhdGljIHZvaWQgaXB3X3NlbmRfd2VwX2tleXMoc3RydWN0IGlwd19wcml2ICpwcml2KQpAQCAtNDQ2NCwxNCArNDUxNywxMiBAQAogCUlQV19ERUJVR19JTkZPKCJTY2FuIGNvbXBsZXRlZCwgbm8gdmFsaWQgQVBzIG1hdGNoZWQgIgogCQkgICAgICAgIltDRkcgMHglMDhYXVxuIiwgcHJpdi0+Y29uZmlnKTsKIAlpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19DSEFOTkVMKQotCQlJUFdfREVCVUdfSU5GTygiQ2hhbm5lbCBsb2NrZWQgdG8gJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+Y2hhbm5lbCk7CisJCUlQV19ERUJVR19JTkZPKCJDaGFubmVsIGxvY2tlZCB0byAlZFxuIiwgcHJpdi0+Y2hhbm5lbCk7CiAJZWxzZQogCQlJUFdfREVCVUdfSU5GTygiQ2hhbm5lbCB1bmxvY2tlZC5cbiIpOwogCWlmIChwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0VTU0lEKQogCQlJUFdfREVCVUdfSU5GTygiRVNTSUQgbG9ja2VkIHRvICclcydcbiIsCi0JCQkgICAgICAgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLAotCQkJCQkgICAgcHJpdi0+ZXNzaWRfbGVuKSk7CisJCQkgICAgICAgZXNjYXBlX2Vzc2lkKHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pKTsKIAllbHNlCiAJCUlQV19ERUJVR19JTkZPKCJFU1NJRCB1bmxvY2tlZC5cbiIpOwogCWlmIChwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0JTU0lEKQpAQCAtNDUwMiw3ICs0NTUzLDcgQEAKIAkgKiBUeCByYXRlcyAqLwogCiAJc3dpdGNoIChwcml2LT5pZWVlLT5mcmVxX2JhbmQpIHsKLQljYXNlIElFRUU4MDIxMV81MkdIWl9CQU5EOiAvKiBBIG9ubHkgKi8KKwljYXNlIElFRUU4MDIxMV81MkdIWl9CQU5EOgkvKiBBIG9ubHkgKi8KIAkJLyogSUVFRV9BICovCiAJCWlmIChwcml2LT5yYXRlc19tYXNrICYgfklFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0spIHsKIAkJCS8qIEludmFsaWQgZml4ZWQgcmF0ZSBtYXNrICovCkBAIC00NTEzLDcgKzQ1NjQsNyBAQAogCQlmci50eF9yYXRlcyA+Pj0gSUVFRTgwMjExX09GRE1fU0hJRlRfTUFTS19BOwogCQlicmVhazsKIAotCWRlZmF1bHQ6IC8qIDIuNEdoeiBvciBNaXhlZCAqLworCWRlZmF1bHQ6CQkvKiAyLjRHaHogb3IgTWl4ZWQgKi8KIAkJLyogSUVFRV9CICovCiAJCWlmIChuZXR3b3JrLT5tb2RlID09IElFRUVfQikgewogCQkJaWYgKGZyLnR4X3JhdGVzICYgfklFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSykgewpAQCAtNDU1MSwxMyArNDYwMiwxMiBAQAogCX0KIAogCXJlZyA9IGlwd19yZWFkMzIocHJpdiwgSVBXX01FTV9GSVhFRF9PVkVSUklERSk7Ci0JaXB3X3dyaXRlX3JlZzMyKHByaXYsIHJlZywgKih1MzIqKSZmcik7CisJaXB3X3dyaXRlX3JlZzMyKHByaXYsIHJlZywgKih1MzIgKikgJiBmcik7CiB9CiAKIHN0YXRpYyBpbnQgaXB3X2Fzc29jaWF0ZV9uZXR3b3JrKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAotCQkJCSBzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqcmF0ZXMsCi0JCQkJIGludCByb2FtaW5nKQorCQkJCSBzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqcmF0ZXMsIGludCByb2FtaW5nKQogewogCWludCBlcnI7CiAKQEAgLTQ1NjYsNyArNDYxNiw3IEBACiAKIAlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfU1RBVElDX0VTU0lEKSkgewogCQlwcml2LT5lc3NpZF9sZW4gPSBtaW4obmV0d29yay0+c3NpZF9sZW4sCi0JCQkJICAgICAgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQkgICAgICAodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKIAkJbWVtY3B5KHByaXYtPmVzc2lkLCBuZXR3b3JrLT5zc2lkLCBwcml2LT5lc3NpZF9sZW4pOwogCX0KIApAQCAtNDYxMiwxMyArNDY2MiwxMSBAQAogCQkJcHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OID8gIiBrZXk9IiA6ICIiLAogCQkJcHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OID8KIAkJCScxJyArIHByaXYtPnNlYy5hY3RpdmVfa2V5IDogJy4nLAotCQkJcHJpdi0+Y2FwYWJpbGl0eSAmIENBUF9QUklWQUNZX09OID8KLQkJCScuJyA6ICcgJyk7CisJCQlwcml2LT5jYXBhYmlsaXR5ICYgQ0FQX1BSSVZBQ1lfT04gPyAnLicgOiAnICcpOwogCiAJcHJpdi0+YXNzb2NfcmVxdWVzdC5iZWFjb25faW50ZXJ2YWwgPSBuZXR3b3JrLT5iZWFjb25faW50ZXJ2YWw7CiAJaWYgKChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmCi0JICAgIChuZXR3b3JrLT50aW1lX3N0YW1wWzBdID09IDApICYmCi0JICAgIChuZXR3b3JrLT50aW1lX3N0YW1wWzFdID09IDApKSB7CisJICAgIChuZXR3b3JrLT50aW1lX3N0YW1wWzBdID09IDApICYmIChuZXR3b3JrLT50aW1lX3N0YW1wWzFdID09IDApKSB7CiAJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHlwZSA9IEhDX0lCU1NfU1RBUlQ7CiAJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHNmX21zdyA9IDA7CiAJCXByaXYtPmFzc29jX3JlcXVlc3QuYXNzb2NfdHNmX2xzdyA9IDA7CkBAIC00NjM3LDggKzQ2ODUsNyBAQAogCQltZW1zZXQoJnByaXYtPmFzc29jX3JlcXVlc3QuZGVzdCwgMHhGRiwgRVRIX0FMRU4pOwogCQlwcml2LT5hc3NvY19yZXF1ZXN0LmF0aW1fd2luZG93ID0gbmV0d29yay0+YXRpbV93aW5kb3c7CiAJfSBlbHNlIHsKLQkJbWVtY3B5KCZwcml2LT5hc3NvY19yZXF1ZXN0LmRlc3QsIG5ldHdvcmstPmJzc2lkLAotCQkgICAgICAgRVRIX0FMRU4pOworCQltZW1jcHkoJnByaXYtPmFzc29jX3JlcXVlc3QuZGVzdCwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKIAkJcHJpdi0+YXNzb2NfcmVxdWVzdC5hdGltX3dpbmRvdyA9IDA7CiAJfQogCkBAIC00NzcyLDE0ICs0ODE5LDEzIEBACiAKIAlpZiAoIShwcml2LT5jb25maWcgJiBDRkdfQVNTT0NJQVRFKSAmJgogCSAgICAhKHByaXYtPmNvbmZpZyAmIChDRkdfU1RBVElDX0VTU0lEIHwKLQkJCSAgICAgIENGR19TVEFUSUNfQ0hBTk5FTCB8Ci0JCQkgICAgICBDRkdfU1RBVElDX0JTU0lEKSkpIHsKKwkJCSAgICAgIENGR19TVEFUSUNfQ0hBTk5FTCB8IENGR19TVEFUSUNfQlNTSUQpKSkgewogCQlJUFdfREVCVUdfQVNTT0MoIk5vdCBhdHRlbXB0aW5nIGFzc29jaWF0aW9uIChhc3NvY2lhdGU9MClcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmcHJpdi0+aWVlZS0+bmV0d29ya19saXN0LCBsaXN0KQotCQlpcHdfYmVzdF9uZXR3b3JrKHByaXYsICZtYXRjaCwgbmV0d29yaywgMCk7CisJICAgIGlwd19iZXN0X25ldHdvcmsocHJpdiwgJm1hdGNoLCBuZXR3b3JrLCAwKTsKIAogCW5ldHdvcmsgPSBtYXRjaC5uZXR3b3JrOwogCXJhdGVzID0gJm1hdGNoLnJhdGVzOwpAQCAtNDc5MCw4ICs0ODM2LDcgQEAKIAkgICAgcHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCAmJgogCSAgICAhbGlzdF9lbXB0eSgmcHJpdi0+aWVlZS0+bmV0d29ya19mcmVlX2xpc3QpKSB7CiAJCWVsZW1lbnQgPSBwcml2LT5pZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0OwotCQluZXR3b3JrID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmssCi0JCQkJICAgICBsaXN0KTsKKwkJbmV0d29yayA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrLCBsaXN0KTsKIAkJaXB3X2FkaG9jX2NyZWF0ZShwcml2LCBuZXR3b3JrKTsKIAkJcmF0ZXMgPSAmcHJpdi0+cmF0ZXM7CiAJCWxpc3RfZGVsKGVsZW1lbnQpOwpAQCAtNDgxMyw4ICs0ODU4LDggQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGlwd19oYW5kbGVfZGF0YV9wYWNrZXQoc3RydWN0IGlwd19wcml2ICpwcml2LAotCQkJCQkgICAgICBzdHJ1Y3QgaXB3X3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCisJCQkJCSAgc3RydWN0IGlwd19yeF9tZW1fYnVmZmVyICpyeGIsCisJCQkJCSAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCiB7CiAJc3RydWN0IGlwd19yeF9wYWNrZXQgKnBrdCA9IChzdHJ1Y3QgaXB3X3J4X3BhY2tldCAqKXJ4Yi0+c2tiLT5kYXRhOwogCkBAIC00ODQ2LDExICs0ODkxLDEwIEBACiAKIAlpZiAoIWllZWU4MDIxMV9yeChwcml2LT5pZWVlLCByeGItPnNrYiwgc3RhdHMpKQogCQlwcml2LT5pZWVlLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQllbHNlIC8qIGllZWU4MDIxMV9yeCBzdWNjZWVkZWQsIHNvIGl0IG5vdyBvd25zIHRoZSBTS0IgKi8KKwllbHNlCQkJLyogaWVlZTgwMjExX3J4IHN1Y2NlZWRlZCwgc28gaXQgbm93IG93bnMgdGhlIFNLQiAqLwogCQlyeGItPnNrYiA9IE5VTEw7CiB9CiAKLQogLyoKICAqIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2lldmluZyBhIHBhY2tldCB3aXRoIDgwMjExIGhlYWRlcnMuICBUaGlzCiAgKiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gZXZlciB0aGUgRlcgaGFzIG5vdGlmaWVkIHVzIHRoYXQgdGhlcmUgaXMgYSBuZXcKQEAgLTQ4ODUsMTI1ICs0OTI5LDE1MiBAQAogCQlwa3QgPSAoc3RydWN0IGlwd19yeF9wYWNrZXQgKilyeGItPnNrYi0+ZGF0YTsKIAkJSVBXX0RFQlVHX1JYKCJQYWNrZXQ6IHR5cGU9JTAyWCBzZXE9JTAyWCBiaXRzPSUwMlhcbiIsCiAJCQkgICAgIHBrdC0+aGVhZGVyLm1lc3NhZ2VfdHlwZSwKLQkJCSAgICAgcGt0LT5oZWFkZXIucnhfc2VxX251bSwKLQkJCSAgICAgcGt0LT5oZWFkZXIuY29udHJvbF9iaXRzKTsKKwkJCSAgICAgcGt0LT5oZWFkZXIucnhfc2VxX251bSwgcGt0LT5oZWFkZXIuY29udHJvbF9iaXRzKTsKIAogCQlzd2l0Y2ggKHBrdC0+aGVhZGVyLm1lc3NhZ2VfdHlwZSkgewotCQljYXNlIFJYX0ZSQU1FX1RZUEU6IC8qIDgwMi4xMSBmcmFtZSAqLyB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzID0gewotCQkJCS5yc3NpID0gcGt0LT51LmZyYW1lLnJzc2lfZGJtIC0KLQkJCQlJUFdfUlNTSV9UT19EQk0sCi0JCQkJLnNpZ25hbCA9IHBrdC0+dS5mcmFtZS5zaWduYWwsCi0JCQkJLnJhdGUgPSBwa3QtPnUuZnJhbWUucmF0ZSwKLQkJCQkubWFjX3RpbWUgPSBqaWZmaWVzLAotCSAgICAgICAJCQkucmVjZWl2ZWRfY2hhbm5lbCA9Ci0JCQkJcGt0LT51LmZyYW1lLnJlY2VpdmVkX2NoYW5uZWwsCi0JCQkJLmZyZXEgPSAocGt0LT51LmZyYW1lLmNvbnRyb2wgJiAoMTw8MCkpID8KLQkJCQlJRUVFODAyMTFfMjRHSFpfQkFORCA6IElFRUU4MDIxMV81MkdIWl9CQU5ELAotCQkJCS5sZW4gPSBwa3QtPnUuZnJhbWUubGVuZ3RoLAotCQkJfTsKKwkJY2FzZSBSWF9GUkFNRV9UWVBFOgkvKiA4MDIuMTEgZnJhbWUgKi8gIHsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzID0geworCQkJCQkucnNzaSA9IHBrdC0+dS5mcmFtZS5yc3NpX2RibSAtCisJCQkJCSAgICBJUFdfUlNTSV9UT19EQk0sCisJCQkJCS5zaWduYWwgPSBwa3QtPnUuZnJhbWUuc2lnbmFsLAorCQkJCQkucmF0ZSA9IHBrdC0+dS5mcmFtZS5yYXRlLAorCQkJCQkubWFjX3RpbWUgPSBqaWZmaWVzLAorCQkJCQkucmVjZWl2ZWRfY2hhbm5lbCA9CisJCQkJCSAgICBwa3QtPnUuZnJhbWUucmVjZWl2ZWRfY2hhbm5lbCwKKwkJCQkJLmZyZXEgPQorCQkJCQkgICAgKHBrdC0+dS5mcmFtZS4KKwkJCQkJICAgICBjb250cm9sICYgKDEgPDwgMCkpID8KKwkJCQkJICAgIElFRUU4MDIxMV8yNEdIWl9CQU5EIDoKKwkJCQkJICAgIElFRUU4MDIxMV81MkdIWl9CQU5ELAorCQkJCQkubGVuID0gcGt0LT51LmZyYW1lLmxlbmd0aCwKKwkJCQl9OwogCi0JCQlpZiAoc3RhdHMucnNzaSAhPSAwKQotCQkJCXN0YXRzLm1hc2sgfD0gSUVFRTgwMjExX1NUQVRNQVNLX1JTU0k7Ci0JCQlpZiAoc3RhdHMuc2lnbmFsICE9IDApCi0JCQkJc3RhdHMubWFzayB8PSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMOwotCQkJaWYgKHN0YXRzLnJhdGUgIT0gMCkKLQkJCQlzdGF0cy5tYXNrIHw9IElFRUU4MDIxMV9TVEFUTUFTS19SQVRFOworCQkJCWlmIChzdGF0cy5yc3NpICE9IDApCisJCQkJCXN0YXRzLm1hc2sgfD0gSUVFRTgwMjExX1NUQVRNQVNLX1JTU0k7CisJCQkJaWYgKHN0YXRzLnNpZ25hbCAhPSAwKQorCQkJCQlzdGF0cy5tYXNrIHw9IElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUw7CisJCQkJaWYgKHN0YXRzLnJhdGUgIT0gMCkKKwkJCQkJc3RhdHMubWFzayB8PSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURTsKIAotCQkJcHJpdi0+cnhfcGFja2V0cysrOworCQkJCXByaXYtPnJ4X3BhY2tldHMrKzsKIAogI2lmZGVmIENPTkZJR19JUFdfUFJPTUlTQwotCQkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCQkJaXB3X2hhbmRsZV9kYXRhX3BhY2tldChwcml2LCByeGIsICZzdGF0cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCQkJCWlwd19oYW5kbGVfZGF0YV9wYWNrZXQocHJpdiwgcnhiLAorCQkJCQkJCSAgICAgICAmc3RhdHMpOworCQkJCQlicmVhazsKKwkJCQl9CiAjZW5kaWYKIAotCQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHJ4Yi0+c2tiLT5kYXRhICsKLQkJCQkJCQkgIElQV19SWF9GUkFNRV9TSVpFKTsKKwkJCQloZWFkZXIgPQorCQkJCSAgICAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocnhiLT5za2ItPmRhdGEgKworCQkJCQkJCSAgICAgSVBXX1JYX0ZSQU1FX1NJWkUpOwogCQkJCS8qIFRPRE86IENoZWNrIEFkLUhvYyBkZXN0L3NvdXJjZSBhbmQgbWFrZSBzdXJlCiAJCQkJICogdGhhdCB3ZSBhcmUgYWN0dWFsbHkgcGFyc2luZyB0aGVzZSBwYWNrZXRzCiAJCQkJICogY29ycmVjdGx5IC0tIHdlIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlCiAJCQkJICogZnJhbWUgY29udHJvbCBvZiB0aGUgcGFja2V0IGFuZCBkaXNyZWdhcmQKIAkJCQkgKiB0aGUgY3VycmVudCBpd19tb2RlICovCi0JCQlzd2l0Y2ggKHByaXYtPmllZWUtPml3X21vZGUpIHsKLQkJCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkJCQluZXR3b3JrX3BhY2tldCA9Ci0JCQkJCSFtZW1jbXAoaGVhZGVyLT5hZGRyMSwKLQkJCQkJCXByaXYtPm5ldF9kZXYtPmRldl9hZGRyLAotCQkJCQkJRVRIX0FMRU4pIHx8Ci0JCQkJCSFtZW1jbXAoaGVhZGVyLT5hZGRyMywKLQkJCQkJCXByaXYtPmJzc2lkLCBFVEhfQUxFTikgfHwKLQkJCQkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkgfHwKLQkJCQkJaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSk7Ci0JCQkJYnJlYWs7CisJCQkJc3dpdGNoIChwcml2LT5pZWVlLT5pd19tb2RlKSB7CisJCQkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJCQluZXR3b3JrX3BhY2tldCA9CisJCQkJCSAgICAhbWVtY21wKGhlYWRlci0+YWRkcjEsCisJCQkJCQkgICAgcHJpdi0+bmV0X2Rldi0+ZGV2X2FkZHIsCisJCQkJCQkgICAgRVRIX0FMRU4pIHx8CisJCQkJCSAgICAhbWVtY21wKGhlYWRlci0+YWRkcjMsCisJCQkJCQkgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKSB8fAorCQkJCQkgICAgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT4KKwkJCQkJCQkJICAgIGFkZHIxKQorCQkJCQkgICAgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT4KKwkJCQkJCQkJICAgICAgIGFkZHIxKTsKKwkJCQkJYnJlYWs7CiAKLQkJCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJCWRlZmF1bHQ6Ci0JCQkJbmV0d29ya19wYWNrZXQgPQotCQkJCQkhbWVtY21wKGhlYWRlci0+YWRkcjMsCi0JCQkJCQlwcml2LT5ic3NpZCwgRVRIX0FMRU4pIHx8Ci0JCQkJCSFtZW1jbXAoaGVhZGVyLT5hZGRyMSwKLQkJCQkJCXByaXYtPm5ldF9kZXYtPmRldl9hZGRyLAotCQkJCQkJRVRIX0FMRU4pIHx8Ci0JCQkJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpIHx8Ci0JCQkJCWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpOworCQkJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCQlkZWZhdWx0OgorCQkJCQluZXR3b3JrX3BhY2tldCA9CisJCQkJCSAgICAhbWVtY21wKGhlYWRlci0+YWRkcjMsCisJCQkJCQkgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKSB8fAorCQkJCQkgICAgIW1lbWNtcChoZWFkZXItPmFkZHIxLAorCQkJCQkJICAgIHByaXYtPm5ldF9kZXYtPmRldl9hZGRyLAorCQkJCQkJICAgIEVUSF9BTEVOKSB8fAorCQkJCQkgICAgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT4KKwkJCQkJCQkJICAgIGFkZHIxKQorCQkJCQkgICAgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT4KKwkJCQkJCQkJICAgICAgIGFkZHIxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKG5ldHdvcmtfcGFja2V0ICYmIHByaXYtPmFzc29jX25ldHdvcmspIHsKKwkJCQkJcHJpdi0+YXNzb2NfbmV0d29yay0+c3RhdHMucnNzaSA9CisJCQkJCSAgICBzdGF0cy5yc3NpOworCQkJCQlhdmVyYWdlX2FkZCgmcHJpdi0+YXZlcmFnZV9yc3NpLAorCQkJCQkJICAgIHN0YXRzLnJzc2kpOworCQkJCQlwcml2LT5sYXN0X3J4X3Jzc2kgPSBzdGF0cy5yc3NpOworCQkJCX0KKworCQkJCUlQV19ERUJVR19SWCgiRnJhbWU6IGxlbj0ldVxuIiwKKwkJCQkJICAgICBwa3QtPnUuZnJhbWUubGVuZ3RoKTsKKworCQkJCWlmIChwa3QtPnUuZnJhbWUubGVuZ3RoIDwgZnJhbWVfaGRyX2xlbihoZWFkZXIpKSB7CisJCQkJCUlQV19ERUJVR19EUk9QCisJCQkJCSAgICAoIlJlY2VpdmVkIHBhY2tldCBpcyB0b28gc21hbGwuICIKKwkJCQkJICAgICAiRHJvcHBpbmcuXG4iKTsKKwkJCQkJcHJpdi0+aWVlZS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCXByaXYtPndzdGF0cy5kaXNjYXJkLm1pc2MrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSkgeworCQkJCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CisJCQkJCWllZWU4MDIxMV9yeF9tZ3QocHJpdi0+aWVlZSwgaGVhZGVyLAorCQkJCQkJCSAmc3RhdHMpOworCQkJCQlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DCisJCQkJCSAgICAmJgorCQkJCQkgICAgKChXTEFOX0ZDX0dFVF9TVFlQRQorCQkJCQkgICAgICAoaGVhZGVyLT5mcmFtZV9jdGwpID09CisJCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKQorCQkJCQkgICAgIHx8CisJCQkJCSAgICAgKFdMQU5fRkNfR0VUX1NUWVBFCisJCQkJCSAgICAgIChoZWFkZXItPmZyYW1lX2N0bCkgPT0KKwkJCQkJICAgICAgSUVFRTgwMjExX1NUWVBFX0JFQUNPTikpCisJCQkJCSAgICAmJiAhbWVtY21wKGhlYWRlci0+YWRkcjMsCisJCQkJCQkgICAgICAgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKSkKKwkJCQkJCWlwd19hZGRfc3RhdGlvbihwcml2LAorCQkJCQkJCQloZWFkZXItPmFkZHIyKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJCQkJaWYgKG5ldHdvcmtfcGFja2V0KQorCQkJCQkJaXB3X2hhbmRsZV9kYXRhX3BhY2tldChwcml2LAorCQkJCQkJCQkgICAgICAgcnhiLAorCQkJCQkJCQkgICAgICAgJnN0YXRzKTsKKwkJCQkJZWxzZQorCQkJCQkJSVBXX0RFQlVHX0RST1AoIkRyb3BwaW5nOiAiCisJCQkJCQkJICAgICAgIE1BQ19GTVQgIiwgIgorCQkJCQkJCSAgICAgICBNQUNfRk1UICIsICIKKwkJCQkJCQkgICAgICAgTUFDX0ZNVCAiXG4iLAorCQkJCQkJCSAgICAgICBNQUNfQVJHKGhlYWRlci0+CisJCQkJCQkJCSAgICAgICBhZGRyMSksCisJCQkJCQkJICAgICAgIE1BQ19BUkcoaGVhZGVyLT4KKwkJCQkJCQkJICAgICAgIGFkZHIyKSwKKwkJCQkJCQkgICAgICAgTUFDX0FSRyhoZWFkZXItPgorCQkJCQkJCQkgICAgICAgYWRkcjMpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAobmV0d29ya19wYWNrZXQgJiYgcHJpdi0+YXNzb2NfbmV0d29yaykgewotCQkJCXByaXYtPmFzc29jX25ldHdvcmstPnN0YXRzLnJzc2kgPSBzdGF0cy5yc3NpOwotCQkJCWF2ZXJhZ2VfYWRkKCZwcml2LT5hdmVyYWdlX3Jzc2ksCi0JCQkJCSAgICBzdGF0cy5yc3NpKTsKLQkJCQlwcml2LT5sYXN0X3J4X3Jzc2kgPSBzdGF0cy5yc3NpOwotCQkJfQotCi0JCQlJUFdfREVCVUdfUlgoIkZyYW1lOiBsZW49JXVcbiIsIHBrdC0+dS5mcmFtZS5sZW5ndGgpOwotCi0JCQlpZiAocGt0LT51LmZyYW1lLmxlbmd0aCA8IGZyYW1lX2hkcl9sZW4oaGVhZGVyKSkgewotCQkJCUlQV19ERUJVR19EUk9QKCJSZWNlaXZlZCBwYWNrZXQgaXMgdG9vIHNtYWxsLiAiCi0JCQkJCSAgICAgICAiRHJvcHBpbmcuXG4iKTsKLQkJCQlwcml2LT5pZWVlLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKLQkJCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6Ci0JCQkJaWVlZTgwMjExX3J4X21ndChwcml2LT5pZWVlLCBoZWFkZXIsICZzdGF0cyk7Ci0JCQkJaWYgKHByaXYtPmllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyAmJgotCQkJCSAgICAoKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSA9PQotCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKSB8fAotCQkJCSAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSA9PQotCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9CRUFDT04pKSAmJgotCQkJCSAgICAhbWVtY21wKGhlYWRlci0+YWRkcjMsIHByaXYtPmJzc2lkLCBFVEhfQUxFTikpCi0JCQkJCWlwd19hZGRfc3RhdGlvbihwcml2LCBoZWFkZXItPmFkZHIyKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgotCQkJCWlmIChuZXR3b3JrX3BhY2tldCkKLQkJCQkJaXB3X2hhbmRsZV9kYXRhX3BhY2tldChwcml2LCByeGIsICZzdGF0cyk7Ci0JCQkJZWxzZQotCQkJCQlJUFdfREVCVUdfRFJPUCgiRHJvcHBpbmc6ICIgTUFDX0ZNVAotCQkJCQkJICAgICAgICIsICIgTUFDX0ZNVCAiLCAiIE1BQ19GTVQgIlxuIiwKLQkJCQkJCSAgICAgICBNQUNfQVJHKGhlYWRlci0+YWRkcjEpLCBNQUNfQVJHKGhlYWRlci0+YWRkcjIpLAotCQkJCQkJICAgICAgIE1BQ19BUkcoaGVhZGVyLT5hZGRyMykpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFJYX0hPU1RfTk9USUZJQ0FUSU9OX1RZUEU6IHsKLQkJCUlQV19ERUJVR19SWCgiTm90aWZpY2F0aW9uOiBzdWJ0eXBlPSUwMlggZmxhZ3M9JTAyWCBzaXplPSVkXG4iLAorCQljYXNlIFJYX0hPU1RfTk9USUZJQ0FUSU9OX1RZUEU6eworCQkJCUlQV19ERUJVR19SWAorCQkJCSAgICAoIk5vdGlmaWNhdGlvbjogc3VidHlwZT0lMDJYIGZsYWdzPSUwMlggc2l6ZT0lZFxuIiwKIAkJCQkgICAgIHBrdC0+dS5ub3RpZmljYXRpb24uc3VidHlwZSwKIAkJCQkgICAgIHBrdC0+dS5ub3RpZmljYXRpb24uZmxhZ3MsCiAJCQkJICAgICBwa3QtPnUubm90aWZpY2F0aW9uLnNpemUpOwotCQkJaXB3X3J4X25vdGlmaWNhdGlvbihwcml2LCAmcGt0LT51Lm5vdGlmaWNhdGlvbik7Ci0JCQlicmVhazsKLQkJfQorCQkJCWlwd19yeF9ub3RpZmljYXRpb24ocHJpdiwgJnBrdC0+dS5ub3RpZmljYXRpb24pOworCQkJCWJyZWFrOworCQkJfQogCiAJCWRlZmF1bHQ6CiAJCQlJUFdfREVCVUdfUlgoIkJhZCBSeCBwYWNrZXQgb2YgdHlwZSAlZFxuIiwKQEAgLTUwODgsMTAgKzUxNTksMTAgQEAKIAkvKiBJZiB3ZSBhcmUgcm9hbWluZywgdGhlbiBtYWtlIHRoaXMgYSBkaXJlY3RlZCBzY2FuIGZvciB0aGUgY3VycmVudAogCSAqIG5ldHdvcmsuICBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IGV2ZXJ5IG90aGVyIHNjYW4gaXMgYSBmYXN0CiAJICogY2hhbm5lbCBob3Agc2NhbiAqLwotCWlmICgocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JPQU1JTkcpIHx8ICgKLQkJICAgICEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpICYmCi0JCSAgICAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCkgJiYKLQkJICAgIChzY2FuLmZ1bGxfc2Nhbl9pbmRleCAlIDIpKSkgeworCWlmICgocHJpdi0+c3RhdHVzICYgU1RBVFVTX1JPQU1JTkcpCisJICAgIHx8ICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKQorCQkmJiAocHJpdi0+Y29uZmlnICYgQ0ZHX1NUQVRJQ19FU1NJRCkKKwkJJiYgKHNjYW4uZnVsbF9zY2FuX2luZGV4ICUgMikpKSB7CiAJCWVyciA9IGlwd19zZW5kX3NzaWQocHJpdiwgcHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbik7CiAJCWlmIChlcnIpIHsKIAkJCUlQV19ERUJVR19IQygiQXR0ZW1wdCB0byBzZW5kIFNTSUQgY29tbWFuZCBmYWlsZWQuXG4iKTsKQEAgLTUxMDMsNyArNTE3NCw3IEBACiAJCXNjYW5fdHlwZSA9IElQV19TQ0FOX0FDVElWRV9CUk9BRENBU1RfU0NBTjsKIAl9CiAKLSAgICAgICAgaWYgKHByaXYtPmllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSB7CisJaWYgKHByaXYtPmllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSB7CiAJCWludCBzdGFydCA9IGNoYW5uZWxfaW5kZXg7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfQV9DSEFOTkVMUzsgaSsrKSB7CiAJCQlpZiAoYmFuZF9hX2FjdGl2ZV9jaGFubmVsW2ldID09IDApCkBAIC01MTEzLDE4ICs1MTg0LDE4IEBACiAJCQkJY29udGludWU7CiAJCQljaGFubmVsX2luZGV4Kys7CiAJCQlzY2FuLmNoYW5uZWxzX2xpc3RbY2hhbm5lbF9pbmRleF0gPQotCQkJCWJhbmRfYV9hY3RpdmVfY2hhbm5lbFtpXTsKKwkJCSAgICBiYW5kX2FfYWN0aXZlX2NoYW5uZWxbaV07CiAJCQlpcHdfc2V0X3NjYW5fdHlwZSgmc2NhbiwgY2hhbm5lbF9pbmRleCwgc2Nhbl90eXBlKTsKIAkJfQogCiAJCWlmIChzdGFydCAhPSBjaGFubmVsX2luZGV4KSB7Ci0JCQlzY2FuLmNoYW5uZWxzX2xpc3Rbc3RhcnRdID0gKHU4KShJUFdfQV9NT0RFIDw8IDYpIHwKLQkJCQkoY2hhbm5lbF9pbmRleCAtIHN0YXJ0KTsKKwkJCXNjYW4uY2hhbm5lbHNfbGlzdFtzdGFydF0gPSAodTgpIChJUFdfQV9NT0RFIDw8IDYpIHwKKwkJCSAgICAoY2hhbm5lbF9pbmRleCAtIHN0YXJ0KTsKIAkJCWNoYW5uZWxfaW5kZXgrKzsKIAkJfQogCX0KIAotICAgICAgICBpZiAocHJpdi0+aWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpIHsKKwlpZiAocHJpdi0+aWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpIHsKIAkJaW50IHN0YXJ0ID0gY2hhbm5lbF9pbmRleDsKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9CX0NIQU5ORUxTOyBpKyspIHsKIAkJCWlmIChiYW5kX2JfYWN0aXZlX2NoYW5uZWxbaV0gPT0gMCkKQEAgLTUxMzQsMjAgKzUyMDUsMTkgQEAKIAkJCQljb250aW51ZTsKIAkJCWNoYW5uZWxfaW5kZXgrKzsKIAkJCXNjYW4uY2hhbm5lbHNfbGlzdFtjaGFubmVsX2luZGV4XSA9Ci0JCQkJYmFuZF9iX2FjdGl2ZV9jaGFubmVsW2ldOworCQkJICAgIGJhbmRfYl9hY3RpdmVfY2hhbm5lbFtpXTsKIAkJCWlwd19zZXRfc2Nhbl90eXBlKCZzY2FuLCBjaGFubmVsX2luZGV4LCBzY2FuX3R5cGUpOwogCQl9CiAKIAkJaWYgKHN0YXJ0ICE9IGNoYW5uZWxfaW5kZXgpIHsKLQkJCXNjYW4uY2hhbm5lbHNfbGlzdFtzdGFydF0gPSAodTgpKElQV19CX01PREUgPDwgNikgfAotCQkJCShjaGFubmVsX2luZGV4IC0gc3RhcnQpOworCQkJc2Nhbi5jaGFubmVsc19saXN0W3N0YXJ0XSA9ICh1OCkgKElQV19CX01PREUgPDwgNikgfAorCQkJICAgIChjaGFubmVsX2luZGV4IC0gc3RhcnQpOwogCQl9CiAJfQogCiAJZXJyID0gaXB3X3NlbmRfc2Nhbl9yZXF1ZXN0X2V4dChwcml2LCAmc2Nhbik7CiAJaWYgKGVycikgewotCQlJUFdfREVCVUdfSEMoIlNlbmRpbmcgc2NhbiBjb21tYW5kIGZhaWxlZDogJTA4WFxuIiwKLQkJCSAgICAgZXJyKTsKKwkJSVBXX0RFQlVHX0hDKCJTZW5kaW5nIHNjYW4gY29tbWFuZCBmYWlsZWQ6ICUwOFhcbiIsIGVycik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNTE5OSw5ICs1MjY5LDggQEAKIAlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19DSEFOTkVMOwogCiAJaWYgKHByaXYtPmNoYW5uZWwgPT0gY2hhbm5lbCkgewotCQlJUFdfREVCVUdfSU5GTygKLQkJCSJSZXF1ZXN0IHRvIHNldCBjaGFubmVsIHRvIGN1cnJlbnQgdmFsdWUgKCVkKVxuIiwKLQkJCWNoYW5uZWwpOworCQlJUFdfREVCVUdfSU5GTygiUmVxdWVzdCB0byBzZXQgY2hhbm5lbCB0byBjdXJyZW50IHZhbHVlICglZClcbiIsCisJCQkgICAgICAgY2hhbm5lbCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNTIyOSw4ICs1Mjk4LDcgQEAKIAogCS8qIGlmIHNldHRpbmcgYnkgZnJlcSBjb252ZXJ0IHRvIGNoYW5uZWwgKi8KIAlpZiAoZndycS0+ZSA9PSAxKSB7Ci0JCWlmICgoZndycS0+bSA+PSAoaW50KSAyLjQxMmU4ICYmCi0JCSAgICAgZndycS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkgeworCQlpZiAoKGZ3cnEtPm0gPj0gKGludCkyLjQxMmU4ICYmIGZ3cnEtPm0gPD0gKGludCkyLjQ4N2U4KSkgewogCQkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOwogCQkJaW50IGMgPSAwOwogCkBAIC01MjQ4LDEyICs1MzE2LDExIEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCUlQV19ERUJVR19XWCgiU0VUIEZyZXEvQ2hhbm5lbCAtPiAlZCBcbiIsIGZ3cnEtPm0pOwotCXJldHVybiBpcHdfc2V0X2NoYW5uZWwocHJpdiwgKHU4KWZ3cnEtPm0pOworCXJldHVybiBpcHdfc2V0X2NoYW5uZWwocHJpdiwgKHU4KSBmd3JxLT5tKTsKIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgaXB3X3d4X2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCkBAIC01MzA2LDcgKzUzNzMsNyBAQAogCiAJaWYgKHdycXUtPm1vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQogCQlwcml2LT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKLSNlbmRpZiAvKiBDT05GSUdfSVBXX1BST01JU0MgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfSVBXX1BST01JU0MgKi8KIAogI2lmZGVmIENPTkZJR19QTQogCS8qIEZyZWUgdGhlIGV4aXN0aW5nIGZpcm13YXJlIGFuZCByZXNldCB0aGUgZndfbG9hZGVkCkBAIC01MzI0LDEyICs1MzkxLDEyIEBACiAJcHJpdi0+aWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CiAJaXB3X2FkYXB0ZXJfcmVzdGFydChwcml2KTsKIAotIAlyZXR1cm4gZXJyOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgaXB3X3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC01MzM5LDcgKzU0MDYsNiBAQAogCXJldHVybiAwOwogfQogCi0KICNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAyMzA0VQogI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAgICAgICAgIDFVCiAjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgMjMwNFUKQEAgLTUzODMsMTkgKzU0NDksMTkgQEAKIAkvKiBUT0RPOiBGaW5kIHJlYWwgbWF4IFJTU0kgYW5kIHN0aWNrIGhlcmUgKi8KIAlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOwogCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7Ci0JcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsJLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNzA7CiAJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLwotCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDA7IC8qIEZJWE1FIHRvIHJlYWwgYXZlcmFnZSBsZXZlbCAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDA7CS8qIEZJWE1FIHRvIHJlYWwgYXZlcmFnZSBsZXZlbCAqLwogCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7Ci0JcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsJLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAotCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBtaW4ocHJpdi0+cmF0ZXMubnVtX3JhdGVzLCAodTgpSVdfTUFYX0JJVFJBVEVTKTsKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gbWluKHByaXYtPnJhdGVzLm51bV9yYXRlcywgKHU4KSBJV19NQVhfQklUUkFURVMpOwogCiAJZm9yIChpID0gMDsgaSA8IHJhbmdlLT5udW1fYml0cmF0ZXM7IGkrKykKIAkJcmFuZ2UtPmJpdHJhdGVbaV0gPSAocHJpdi0+cmF0ZXMuc3VwcG9ydGVkX3JhdGVzW2ldICYgMHg3RikgKgotCQkJNTAwMDAwOworCQkgICAgNTAwMDAwOwogCiAJcmFuZ2UtPm1heF9ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CiAJcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOwpAQCAtNTQxMCw3ICs1NDc2LDcgQEAKIAlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKIAlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNjsKIAotICAgICAgICByYW5nZS0+bnVtX2NoYW5uZWxzID0gRlJFUV9DT1VOVDsKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gRlJFUV9DT1VOVDsKIAogCXZhbCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IEZSRVFfQ09VTlQ7IGkrKykgewpAQCAtNTUwNiw3ICs1NTcyLDcgQEAKIAkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWNoYXIgKmVzc2lkID0gIiI7IC8qIEFOWSAqLworCWNoYXIgKmVzc2lkID0gIiI7CS8qIEFOWSAqLwogCWludCBsZW5ndGggPSAwOwogCiAJaWYgKHdycXUtPmVzc2lkLmZsYWdzICYmIHdycXUtPmVzc2lkLmxlbmd0aCkgewpAQCAtNTU2NywxMSArNTYzMywxMSBAQAogCQkJICAgICBlc2NhcGVfZXNzaWQocHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX2xlbikpOwogCQltZW1jcHkoZXh0cmEsIHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9sZW4pOwogCQl3cnF1LT5lc3NpZC5sZW5ndGggPSBwcml2LT5lc3NpZF9sZW47Ci0JCXdycXUtPmVzc2lkLmZsYWdzID0gMTsgLyogYWN0aXZlICovCisJCXdycXUtPmVzc2lkLmZsYWdzID0gMTsJLyogYWN0aXZlICovCiAJfSBlbHNlIHsKIAkJSVBXX0RFQlVHX1dYKCJHZXR0aW5nIGVzc2lkOiBBTllcbiIpOwogCQl3cnF1LT5lc3NpZC5sZW5ndGggPSAwOwotCQl3cnF1LT5lc3NpZC5mbGFncyA9IDA7IC8qIGFjdGl2ZSAqLworCQl3cnF1LT5lc3NpZC5mbGFncyA9IDA7CS8qIGFjdGl2ZSAqLwogCX0KIAogCXJldHVybiAwOwpAQCAtNTU4NywxNSArNTY1MywxNCBAQAogCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQogCQlyZXR1cm4gLUUyQklHOwogCi0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBtaW4oKHNpemVfdCl3cnF1LT5kYXRhLmxlbmd0aCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IG1pbigoc2l6ZV90KSB3cnF1LT5kYXRhLmxlbmd0aCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKIAltZW1zZXQocHJpdi0+bmljaywgMCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKLQltZW1jcHkocHJpdi0+bmljaywgZXh0cmEsICB3cnF1LT5kYXRhLmxlbmd0aCk7CisJbWVtY3B5KHByaXYtPm5pY2ssIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CiAJSVBXX0RFQlVHX1RSQUNFKCI8PFxuIik7CiAJcmV0dXJuIDA7CiAKIH0KIAotCiBzdGF0aWMgaW50IGlwd193eF9nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQpAQCAtNTYwNCwxMSArNTY2OSwxMCBAQAogCUlQV19ERUJVR19XWCgiR2V0dGluZyBuaWNrXG4iKTsKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihwcml2LT5uaWNrKSArIDE7CiAJbWVtY3B5KGV4dHJhLCBwcml2LT5uaWNrLCB3cnF1LT5kYXRhLmxlbmd0aCk7Ci0Jd3JxdS0+ZGF0YS5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLworCXdycXUtPmRhdGEuZmxhZ3MgPSAxOwkvKiBhY3RpdmUgKi8KIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IGlwd193eF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQpAQCAtNTYyMSwxNCArNTY4NSwxMyBAQAogCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBpcHdfcHJpdiAqIHByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHByaXYtPmxhc3RfcmF0ZTsKIAogCUlQV19ERUJVR19XWCgiR0VUIFJhdGUgLT4gJWQgXG4iLCB3cnF1LT5iaXRyYXRlLnZhbHVlKTsKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IGlwd193eF9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQpAQCAtNTY1NywxNCArNTcyMCwxMiBAQAogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJd3JxdS0+cnRzLnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaG9sZDsKIAl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLwotCXdycXUtPnJ0cy5kaXNhYmxlZCA9Ci0JCSh3cnF1LT5ydHMudmFsdWUgPT0gREVGQVVMVF9SVFNfVEhSRVNIT0xEKTsKKwl3cnF1LT5ydHMuZGlzYWJsZWQgPSAod3JxdS0+cnRzLnZhbHVlID09IERFRkFVTFRfUlRTX1RIUkVTSE9MRCk7CiAKIAlJUFdfREVCVUdfV1goIkdFVCBSVFMgVGhyZXNob2xkIC0+ICVkIFxuIiwgd3JxdS0+cnRzLnZhbHVlKTsKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IGlwd193eF9zZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQpAQCAtNTY3OSw4ICs1NzQwLDcgQEAKIAlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgIT0gSVdfVFhQT1dfREJNKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICgod3JxdS0+cG93ZXIudmFsdWUgPiAyMCkgfHwKLQkgICAgKHdycXUtPnBvd2VyLnZhbHVlIDwgLTEyKSkKKwlpZiAoKHdycXUtPnBvd2VyLnZhbHVlID4gMjApIHx8ICh3cnF1LT5wb3dlci52YWx1ZSA8IC0xMikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJpdi0+dHhfcG93ZXIgPSB3cnF1LT5wb3dlci52YWx1ZTsKQEAgLTU3MDQsMTEgKzU3NjQsMTAgQEAKIAogCXJldHVybiAwOwogCi0gZXJyb3I6CisgICAgICBlcnJvcjoKIAlyZXR1cm4gLUVJTzsKIH0KIAotCiBzdGF0aWMgaW50IGlwd193eF9nZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQpAQCAtNTcyMSwxNSArNTc4MCwxNCBAQAogCXdycXUtPnBvd2VyLmRpc2FibGVkID0gKHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0spID8gMSA6IDA7CiAKIAlJUFdfREVCVUdfV1goIkdFVCBUWCBQb3dlciAtPiAlcyAlZCBcbiIsCi0JCSAgICAgd3JxdS0+cG93ZXIuZGlzYWJsZWQgPyAiT04iIDogIk9GRiIsCi0JCSAgICAgd3JxdS0+cG93ZXIudmFsdWUpOworCQkgICAgIHdycXUtPnBvd2VyLmRpc2FibGVkID8gIk9OIiA6ICJPRkYiLCB3cnF1LT5wb3dlci52YWx1ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpcHdfd3hfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTU3NDksMTQgKzU4MDcsMTMgQEAKIH0KIAogc3RhdGljIGludCBpcHdfd3hfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPmllZWUtPmZ0czsKIAl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KLQl3cnF1LT5mcmFnLmRpc2FibGVkID0KLQkJKHdycXUtPmZyYWcudmFsdWUgPT0gREVGQVVMVF9GVFMpOworCXdycXUtPmZyYWcuZGlzYWJsZWQgPSAod3JxdS0+ZnJhZy52YWx1ZSA9PSBERUZBVUxUX0ZUUyk7CiAKIAlJUFdfREVCVUdfV1goIkdFVCBGcmFnIFRocmVzaG9sZCAtPiAlZCBcbiIsIHdycXUtPmZyYWcudmFsdWUpOwogCkBAIC01NzcxLDcgKzU4MjgsNiBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotCiBzdGF0aWMgaW50IGlwd193eF9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQpAQCAtNTc4MCw3ICs1ODM2LDYgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLQogc3RhdGljIGludCBpcHdfd3hfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKQEAgLTU4MDEsMjQgKzU4NTYsMjQgQEAKIH0KIAogc3RhdGljIGludCBpcHdfd3hfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXJldHVybiBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShwcml2LT5pZWVlLCBpbmZvLCB3cnF1LCBrZXkpOwogfQogCiBzdGF0aWMgaW50IGlwd193eF9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHByaXYtPmllZWUsIGluZm8sIHdycXUsIGtleSk7CiB9CiAKIHN0YXRpYyBpbnQgaXB3X3d4X3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IGVycjsKQEAgLTU4MzcsMTEgKzU4OTIsMTEgQEAKIAl9CiAKIAlzd2l0Y2ggKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgewotCWNhc2UgSVdfUE9XRVJfT046ICAgIC8qIElmIG5vdCBzcGVjaWZpZWQgKi8KLQljYXNlIElXX1BPV0VSX01PREU6ICAvKiBJZiBzZXQgYWxsIG1hc2sgKi8KLQljYXNlIElXX1BPV0VSX0FMTF9SOiAvKiBJZiBleHBsaWNpdGVseSBzdGF0ZSBhbGwgKi8KKwljYXNlIElXX1BPV0VSX09OOgkvKiBJZiBub3Qgc3BlY2lmaWVkICovCisJY2FzZSBJV19QT1dFUl9NT0RFOgkvKiBJZiBzZXQgYWxsIG1hc2sgKi8KKwljYXNlIElXX1BPV0VSX0FMTF9SOgkvKiBJZiBleHBsaWNpdGVseSBzdGF0ZSBhbGwgKi8KIAkJYnJlYWs7Ci0JZGVmYXVsdDogLyogT3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgaXQgKi8KKwlkZWZhdWx0OgkJLyogT3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgaXQgKi8KIAkJSVBXX0RFQlVHX1dYKCJTRVQgUE0gTW9kZTogJVggbm90IHN1cHBvcnRlZC5cbiIsCiAJCQkgICAgIHdycXUtPnBvd2VyLmZsYWdzKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtNTg0OSw3ICs1OTA0LDcgQEAKIAogCS8qIElmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgYSBwb3dlciBtYW5hZ2VtZW50IG1vZGUgeWV0LCBkZWZhdWx0CiAJICogdG8gQkFUVEVSWSAqLwotICAgICAgICBpZiAoSVBXX1BPV0VSX0xFVkVMKHByaXYtPnBvd2VyX21vZGUpID09IElQV19QT1dFUl9BQykKKwlpZiAoSVBXX1BPV0VSX0xFVkVMKHByaXYtPnBvd2VyX21vZGUpID09IElQV19QT1dFUl9BQykKIAkJcHJpdi0+cG93ZXJfbW9kZSA9IElQV19QT1dFUl9FTkFCTEVEIHwgSVBXX1BPV0VSX0JBVFRFUlk7CiAJZWxzZQogCQlwcml2LT5wb3dlcl9tb2RlID0gSVBXX1BPV0VSX0VOQUJMRUQgfCBwcml2LT5wb3dlcl9tb2RlOwpAQCAtNTg1OSwxNSArNTkxNCwxNCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCUlQV19ERUJVR19XWCgiU0VUIFBvd2VyIE1hbmFnZW1lbnQgTW9kZSAtPiAweCUwMlhcbiIsCi0JCSAgICAgcHJpdi0+cG93ZXJfbW9kZSk7CisJSVBXX0RFQlVHX1dYKCJTRVQgUG93ZXIgTWFuYWdlbWVudCBNb2RlIC0+IDB4JTAyWFxuIiwgcHJpdi0+cG93ZXJfbW9kZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpcHdfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtNTg4Myw4ICs1OTM3LDggQEAKIH0KIAogc3RhdGljIGludCBpcHdfd3hfc2V0X3Bvd2VybW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IG1vZGUgPSAqKGludCAqKWV4dHJhOwpAQCAtNTkxMSw4ICs1OTY1LDggQEAKIAogI2RlZmluZSBNQVhfV1hfU1RSSU5HIDgwCiBzdGF0aWMgaW50IGlwd193eF9nZXRfcG93ZXJtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpbnQgbGV2ZWwgPSBJUFdfUE9XRVJfTEVWRUwocHJpdi0+cG93ZXJfbW9kZSk7CkBAIC01OTM1LDcgKzU5ODksNyBAQAogCX0KIAogCWlmICghKHByaXYtPnBvd2VyX21vZGUgJiBJUFdfUE9XRVJfRU5BQkxFRCkpCi0JCXAgKz0gc25wcmludGYocCwgTUFYX1dYX1NUUklORyAtIChwIC0gZXh0cmEpLCIgT0ZGIik7CisJCXAgKz0gc25wcmludGYocCwgTUFYX1dYX1NUUklORyAtIChwIC0gZXh0cmEpLCAiIE9GRiIpOwogCiAJd3JxdS0+ZGF0YS5sZW5ndGggPSBwIC0gZXh0cmEgKyAxOwogCkBAIC01OTQzLDE2ICs1OTk3LDE1IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB3X3d4X3NldF93aXJlbGVzc19tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotICAgICAgICBzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IG1vZGUgPSAqKGludCAqKWV4dHJhOwogCXU4IGJhbmQgPSAwLCBtb2R1bGF0aW9uID0gMDsKIAogCWlmIChtb2RlID09IDAgfHwgbW9kZSAmIH5JRUVFX01PREVfTUFTSykgewotCQlJUFdfV0FSTklORygiQXR0ZW1wdCB0byBzZXQgaW52YWxpZCB3aXJlbGVzcyBtb2RlOiAlZFxuIiwKLQkJCSAgICBtb2RlKTsKKwkJSVBXX1dBUk5JTkcoIkF0dGVtcHQgdG8gc2V0IGludmFsaWQgd2lyZWxlc3MgbW9kZTogJWRcbiIsIG1vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTU5ODgsMzEgKzYwNDEsMzAgQEAKIAlwcml2LT5pZWVlLT5tb2RlID0gbW9kZTsKIAlwcml2LT5pZWVlLT5mcmVxX2JhbmQgPSBiYW5kOwogCXByaXYtPmllZWUtPm1vZHVsYXRpb24gPSBtb2R1bGF0aW9uOwotICAgICAgCWluaXRfc3VwcG9ydGVkX3JhdGVzKHByaXYsICZwcml2LT5yYXRlcyk7CisJaW5pdF9zdXBwb3J0ZWRfcmF0ZXMocHJpdiwgJnByaXYtPnJhdGVzKTsKIAogCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCwgb3IgdHJ5aW5nIHRvIGFzc29jaWF0ZQotICAgICAgICAgKiB0aGVuIHNlZSBpZiB0aGlzIGlzIGEgbmV3IGNvbmZpZ3VyYXRpb24gKGNhdXNpbmcgdXMgdG8KKwkgKiB0aGVuIHNlZSBpZiB0aGlzIGlzIGEgbmV3IGNvbmZpZ3VyYXRpb24gKGNhdXNpbmcgdXMgdG8KIAkgKiBkaXNhc3NvY2lhdGUpICovCi0gICAgICAgIGlmIChwcml2LT5zdGF0dXMgJiAoU1RBVFVTX0FTU09DSUFURUQgfCBTVEFUVVNfQVNTT0NJQVRJTkcpKSB7CisJaWYgKHByaXYtPnN0YXR1cyAmIChTVEFUVVNfQVNTT0NJQVRFRCB8IFNUQVRVU19BU1NPQ0lBVElORykpIHsKIAkJLyogVGhlIHJlc3VsdGluZyBhc3NvY2lhdGlvbiB3aWxsIHRyaWdnZXIKIAkJICogdGhlIG5ldyByYXRlcyB0byBiZSBzZW50IHRvIHRoZSBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICBJUFdfREVCVUdfQVNTT0MoIkRpc2Fzc29jaWF0aW5nIGR1ZSB0byBtb2RlIGNoYW5nZS5cbiIpOwotICAgICAgICAgICAgICAgIGlwd19kaXNhc3NvY2lhdGUocHJpdik7CisJCUlQV19ERUJVR19BU1NPQygiRGlzYXNzb2NpYXRpbmcgZHVlIHRvIG1vZGUgY2hhbmdlLlxuIik7CisJCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CiAJfSBlbHNlCiAJCWlwd19zZW5kX3N1cHBvcnRlZF9yYXRlcyhwcml2LCAmcHJpdi0+cmF0ZXMpOwogCiAJSVBXX0RFQlVHX1dYKCJQUklWIFNFVCBNT0RFOiAlYyVjJWNcbiIsCiAJCSAgICAgbW9kZSAmIElFRUVfQSA/ICdhJyA6ICcuJywKLQkJICAgICBtb2RlICYgSUVFRV9CID8gJ2InIDogJy4nLAotCQkgICAgIG1vZGUgJiBJRUVFX0cgPyAnZycgOiAnLicpOworCQkgICAgIG1vZGUgJiBJRUVFX0IgPyAnYicgOiAnLicsIG1vZGUgJiBJRUVFX0cgPyAnZycgOiAnLicpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlwd193eF9nZXRfd2lyZWxlc3NfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLSAgICAgICAgc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJc3dpdGNoIChwcml2LT5pZWVlLT5mcmVxX2JhbmQpIHsKIAljYXNlIElFRUU4MDIxMV8yNEdIWl9CQU5EOgpAQCAtNjAzMyw3ICs2MDg1LDcgQEAKIAkJc3RybmNweShleHRyYSwgIjgwMi4xMWEgKDEpIiwgTUFYX1dYX1NUUklORyk7CiAJCWJyZWFrOwogCi0JZGVmYXVsdDogLyogTWl4ZWQgQmFuZCAqLworCWRlZmF1bHQ6CQkvKiBNaXhlZCBCYW5kICovCiAJCXN3aXRjaCAocHJpdi0+aWVlZS0+bW9kdWxhdGlvbikgewogCQljYXNlIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTjoKIAkJCXN0cm5jcHkoZXh0cmEsICI4MDIuMTFhYiAoMykiLCBNQVhfV1hfU1RSSU5HKTsKQEAgLTYwNTAsOSArNjEwMiw5IEBACiAKIAlJUFdfREVCVUdfV1goIlBSSVYgR0VUIE1PREU6ICVzXG4iLCBleHRyYSk7CiAKLSAgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0lQV19QUk9NSVNDCkBAIC02MDgxLDcgKzYxMzMsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgaXB3X3d4X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCkBAIC02MDkxLDQwICs2MTQyLDM5IEBACiAJaXB3X2FkYXB0ZXJfcmVzdGFydChwcml2KTsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvLyBDT05GSUdfSVBXX1BST01JU0MKKyNlbmRpZgkJCQkvLyBDT05GSUdfSVBXX1BST01JU0MKIAogLyogUmViYXNlIHRoZSBXRSBJT0NUTHMgdG8gemVybyBmb3IgdGhlIGhhbmRsZXIgYXJyYXkgKi8KICNkZWZpbmUgSVdfSU9DVEwoeCkgWyh4KS1TSU9DU0lXQ09NTUlUXQotc3RhdGljIGl3X2hhbmRsZXIgaXB3X3d4X2hhbmRsZXJzW10gPQotewotCUlXX0lPQ1RMKFNJT0NHSVdOQU1FKSAgID0gaXB3X3d4X2dldF9uYW1lLAotCUlXX0lPQ1RMKFNJT0NTSVdGUkVRKSAgID0gaXB3X3d4X3NldF9mcmVxLAotCUlXX0lPQ1RMKFNJT0NHSVdGUkVRKSAgID0gaXB3X3d4X2dldF9mcmVxLAotCUlXX0lPQ1RMKFNJT0NTSVdNT0RFKSAgID0gaXB3X3d4X3NldF9tb2RlLAotCUlXX0lPQ1RMKFNJT0NHSVdNT0RFKSAgID0gaXB3X3d4X2dldF9tb2RlLAotCUlXX0lPQ1RMKFNJT0NHSVdSQU5HRSkgID0gaXB3X3d4X2dldF9yYW5nZSwKLQlJV19JT0NUTChTSU9DU0lXQVApICAgICA9IGlwd193eF9zZXRfd2FwLAotCUlXX0lPQ1RMKFNJT0NHSVdBUCkgICAgID0gaXB3X3d4X2dldF93YXAsCi0JSVdfSU9DVEwoU0lPQ1NJV1NDQU4pICAgPSBpcHdfd3hfc2V0X3NjYW4sCi0JSVdfSU9DVEwoU0lPQ0dJV1NDQU4pICAgPSBpcHdfd3hfZ2V0X3NjYW4sCi0JSVdfSU9DVEwoU0lPQ1NJV0VTU0lEKSAgPSBpcHdfd3hfc2V0X2Vzc2lkLAotCUlXX0lPQ1RMKFNJT0NHSVdFU1NJRCkgID0gaXB3X3d4X2dldF9lc3NpZCwKLQlJV19JT0NUTChTSU9DU0lXTklDS04pICA9IGlwd193eF9zZXRfbmljaywKLQlJV19JT0NUTChTSU9DR0lXTklDS04pICA9IGlwd193eF9nZXRfbmljaywKLQlJV19JT0NUTChTSU9DU0lXUkFURSkgICA9IGlwd193eF9zZXRfcmF0ZSwKLQlJV19JT0NUTChTSU9DR0lXUkFURSkgICA9IGlwd193eF9nZXRfcmF0ZSwKLQlJV19JT0NUTChTSU9DU0lXUlRTKSAgICA9IGlwd193eF9zZXRfcnRzLAotCUlXX0lPQ1RMKFNJT0NHSVdSVFMpICAgID0gaXB3X3d4X2dldF9ydHMsCi0JSVdfSU9DVEwoU0lPQ1NJV0ZSQUcpICAgPSBpcHdfd3hfc2V0X2ZyYWcsCi0JSVdfSU9DVEwoU0lPQ0dJV0ZSQUcpICAgPSBpcHdfd3hfZ2V0X2ZyYWcsCi0JSVdfSU9DVEwoU0lPQ1NJV1RYUE9XKSAgPSBpcHdfd3hfc2V0X3R4cG93LAotCUlXX0lPQ1RMKFNJT0NHSVdUWFBPVykgID0gaXB3X3d4X2dldF90eHBvdywKLQlJV19JT0NUTChTSU9DU0lXUkVUUlkpICA9IGlwd193eF9zZXRfcmV0cnksCi0JSVdfSU9DVEwoU0lPQ0dJV1JFVFJZKSAgPSBpcHdfd3hfZ2V0X3JldHJ5LAotCUlXX0lPQ1RMKFNJT0NTSVdFTkNPREUpID0gaXB3X3d4X3NldF9lbmNvZGUsCi0JSVdfSU9DVEwoU0lPQ0dJV0VOQ09ERSkgPSBpcHdfd3hfZ2V0X2VuY29kZSwKLQlJV19JT0NUTChTSU9DU0lXUE9XRVIpICA9IGlwd193eF9zZXRfcG93ZXIsCi0JSVdfSU9DVEwoU0lPQ0dJV1BPV0VSKSAgPSBpcHdfd3hfZ2V0X3Bvd2VyLAorc3RhdGljIGl3X2hhbmRsZXIgaXB3X3d4X2hhbmRsZXJzW10gPSB7CisJSVdfSU9DVEwoU0lPQ0dJV05BTUUpCT0gaXB3X3d4X2dldF9uYW1lLAorCUlXX0lPQ1RMKFNJT0NTSVdGUkVRKQk9IGlwd193eF9zZXRfZnJlcSwKKwlJV19JT0NUTChTSU9DR0lXRlJFUSkJPSBpcHdfd3hfZ2V0X2ZyZXEsCisJSVdfSU9DVEwoU0lPQ1NJV01PREUpCT0gaXB3X3d4X3NldF9tb2RlLAorCUlXX0lPQ1RMKFNJT0NHSVdNT0RFKQk9IGlwd193eF9nZXRfbW9kZSwKKwlJV19JT0NUTChTSU9DR0lXUkFOR0UpCT0gaXB3X3d4X2dldF9yYW5nZSwKKwlJV19JT0NUTChTSU9DU0lXQVApCT0gaXB3X3d4X3NldF93YXAsCisJSVdfSU9DVEwoU0lPQ0dJV0FQKQk9IGlwd193eF9nZXRfd2FwLAorCUlXX0lPQ1RMKFNJT0NTSVdTQ0FOKQk9IGlwd193eF9zZXRfc2NhbiwKKwlJV19JT0NUTChTSU9DR0lXU0NBTikJPSBpcHdfd3hfZ2V0X3NjYW4sCisJSVdfSU9DVEwoU0lPQ1NJV0VTU0lEKQk9IGlwd193eF9zZXRfZXNzaWQsCisJSVdfSU9DVEwoU0lPQ0dJV0VTU0lEKQk9IGlwd193eF9nZXRfZXNzaWQsCisJSVdfSU9DVEwoU0lPQ1NJV05JQ0tOKQk9IGlwd193eF9zZXRfbmljaywKKwlJV19JT0NUTChTSU9DR0lXTklDS04pCT0gaXB3X3d4X2dldF9uaWNrLAorCUlXX0lPQ1RMKFNJT0NTSVdSQVRFKQk9IGlwd193eF9zZXRfcmF0ZSwKKwlJV19JT0NUTChTSU9DR0lXUkFURSkJPSBpcHdfd3hfZ2V0X3JhdGUsCisJSVdfSU9DVEwoU0lPQ1NJV1JUUykJPSBpcHdfd3hfc2V0X3J0cywKKwlJV19JT0NUTChTSU9DR0lXUlRTKQk9IGlwd193eF9nZXRfcnRzLAorCUlXX0lPQ1RMKFNJT0NTSVdGUkFHKQk9IGlwd193eF9zZXRfZnJhZywKKwlJV19JT0NUTChTSU9DR0lXRlJBRykJPSBpcHdfd3hfZ2V0X2ZyYWcsCisJSVdfSU9DVEwoU0lPQ1NJV1RYUE9XKQk9IGlwd193eF9zZXRfdHhwb3csCisJSVdfSU9DVEwoU0lPQ0dJV1RYUE9XKQk9IGlwd193eF9nZXRfdHhwb3csCisJSVdfSU9DVEwoU0lPQ1NJV1JFVFJZKQk9IGlwd193eF9zZXRfcmV0cnksCisJSVdfSU9DVEwoU0lPQ0dJV1JFVFJZKQk9IGlwd193eF9nZXRfcmV0cnksCisJSVdfSU9DVEwoU0lPQ1NJV0VOQ09ERSkJPSBpcHdfd3hfc2V0X2VuY29kZSwKKwlJV19JT0NUTChTSU9DR0lXRU5DT0RFKQk9IGlwd193eF9nZXRfZW5jb2RlLAorCUlXX0lPQ1RMKFNJT0NTSVdQT1dFUikJPSBpcHdfd3hfc2V0X3Bvd2VyLAorCUlXX0lPQ1RMKFNJT0NHSVdQT1dFUikJPSBpcHdfd3hfZ2V0X3Bvd2VyLAogfTsKIAogI2RlZmluZSBJUFdfUFJJVl9TRVRfUE9XRVIJU0lPQ0lXRklSU1RQUklWCkBAIC02MTM0LDM4ICs2MTg0LDMxIEBACiAjZGVmaW5lIElQV19QUklWX1NFVF9QUk9NSVNDCVNJT0NJV0ZJUlNUUFJJVis0CiAjZGVmaW5lIElQV19QUklWX1JFU0VUCQlTSU9DSVdGSVJTVFBSSVYrNQogCi0KIHN0YXRpYyBzdHJ1Y3QgaXdfcHJpdl9hcmdzIGlwd19wcml2X2FyZ3NbXSA9IHsKIAl7Ci0JCS5jbWQgPSBJUFdfUFJJVl9TRVRfUE9XRVIsCi0JCS5zZXRfYXJncyA9IElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkubmFtZSA9ICJzZXRfcG93ZXIiCi0JfSwKKwkgLmNtZCA9IElQV19QUklWX1NFVF9QT1dFUiwKKwkgLnNldF9hcmdzID0gSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIC5uYW1lID0gInNldF9wb3dlciJ9LAogCXsKLQkJLmNtZCA9IElQV19QUklWX0dFVF9QT1dFUiwKLQkJLmdldF9hcmdzID0gSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCBNQVhfV1hfU1RSSU5HLAotCQkubmFtZSA9ICJnZXRfcG93ZXIiCi0JfSwKKwkgLmNtZCA9IElQV19QUklWX0dFVF9QT1dFUiwKKwkgLmdldF9hcmdzID0gSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCBNQVhfV1hfU1RSSU5HLAorCSAubmFtZSA9ICJnZXRfcG93ZXIifSwKIAl7Ci0JCS5jbWQgPSBJUFdfUFJJVl9TRVRfTU9ERSwKLQkJLnNldF9hcmdzID0gSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JCS5uYW1lID0gInNldF9tb2RlIgotCX0sCisJIC5jbWQgPSBJUFdfUFJJVl9TRVRfTU9ERSwKKwkgLnNldF9hcmdzID0gSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIC5uYW1lID0gInNldF9tb2RlIn0sCiAJewotCQkuY21kID0gSVBXX1BSSVZfR0VUX01PREUsCi0JCS5nZXRfYXJncyA9IElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgTUFYX1dYX1NUUklORywKLQkJLm5hbWUgPSAiZ2V0X21vZGUiCi0JfSwKKwkgLmNtZCA9IElQV19QUklWX0dFVF9NT0RFLAorCSAuZ2V0X2FyZ3MgPSBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IE1BWF9XWF9TVFJJTkcsCisJIC5uYW1lID0gImdldF9tb2RlIn0sCiAjaWZkZWYgQ09ORklHX0lQV19QUk9NSVNDCiAJewotCQlJUFdfUFJJVl9TRVRfUFJPTUlTQywKLQkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsIDAsICJtb25pdG9yIgotCX0sCisJIElQV19QUklWX1NFVF9QUk9NSVNDLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgMCwgIm1vbml0b3IifSwKIAl7Ci0JCUlQV19QUklWX1JFU0VULAotCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMCwgMCwgInJlc2V0IgotCX0sCi0jZW5kaWYgLyogQ09ORklHX0lQV19QUk9NSVNDICovCisJIElQV19QUklWX1JFU0VULAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMCwgMCwgInJlc2V0In0sCisjZW5kaWYJCQkJLyogQ09ORklHX0lQV19QUk9NSVNDICovCiB9OwogCiBzdGF0aWMgaXdfaGFuZGxlciBpcHdfcHJpdl9oYW5kbGVyW10gPSB7CkBAIC02MTc5LDI1ICs2MjIyLDIxIEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaXB3X3d4X2hhbmRsZXJfZGVmID0KLXsKLQkuc3RhbmRhcmQgCT0gaXB3X3d4X2hhbmRsZXJzLAotCS5udW1fc3RhbmRhcmQJPSBBUlJBWV9TSVpFKGlwd193eF9oYW5kbGVycyksCi0JLm51bV9wcml2YXRlCT0gQVJSQVlfU0laRShpcHdfcHJpdl9oYW5kbGVyKSwKLSAJLm51bV9wcml2YXRlX2FyZ3MgPSBBUlJBWV9TSVpFKGlwd19wcml2X2FyZ3MpLAotCS5wcml2YXRlCT0gaXB3X3ByaXZfaGFuZGxlciwKLQkucHJpdmF0ZV9hcmdzCT0gaXB3X3ByaXZfYXJncywKK3N0YXRpYyBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaXB3X3d4X2hhbmRsZXJfZGVmID0geworCS5zdGFuZGFyZAkJPSBpcHdfd3hfaGFuZGxlcnMsCisJLm51bV9zdGFuZGFyZAkJPSBBUlJBWV9TSVpFKGlwd193eF9oYW5kbGVycyksCisJLm51bV9wcml2YXRlCQk9IEFSUkFZX1NJWkUoaXB3X3ByaXZfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MJPSBBUlJBWV9TSVpFKGlwd19wcml2X2FyZ3MpLAorCS5wcml2YXRlCQk9IGlwd19wcml2X2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwkJPSBpcHdfcHJpdl9hcmdzLAogfTsKIAotCi0KLQogLyoKICAqIEdldCB3aXJlbGVzcyBzdGF0aXN0aWNzLgogICogQ2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcwogICogQWxzbyBjYWxsZWQgYnkgU0lPQ0dJV1NUQVRTCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaXB3X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaXB3X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0czsKQEAgLTYyMTcsNyArNjI1Niw3IEBACiAJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IDA7CiAJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gNzsKIAkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEIHwKLQkJCUlXX1FVQUxfUVVBTF9JTlZBTElEIHwgSVdfUVVBTF9MRVZFTF9JTlZBTElEOworCQkgICAgSVdfUVVBTF9RVUFMX0lOVkFMSUQgfCBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CiAJCXJldHVybiB3c3RhdHM7CiAJfQogCkBAIC02MjI1LDcgKzYyNjQsNyBAQAogCXdzdGF0cy0+cXVhbC5sZXZlbCA9IGF2ZXJhZ2VfdmFsdWUoJnByaXYtPmF2ZXJhZ2VfcnNzaSk7CiAJd3N0YXRzLT5xdWFsLm5vaXNlID0gYXZlcmFnZV92YWx1ZSgmcHJpdi0+YXZlcmFnZV9ub2lzZSk7CiAJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfVVBEQVRFRCB8IElXX1FVQUxfTEVWRUxfVVBEQVRFRCB8Ci0JCUlXX1FVQUxfTk9JU0VfVVBEQVRFRDsKKwkgICAgSVdfUVVBTF9OT0lTRV9VUERBVEVEOwogCiAJd3N0YXRzLT5taXNzLmJlYWNvbiA9IGF2ZXJhZ2VfdmFsdWUoJnByaXYtPmF2ZXJhZ2VfbWlzc2VkX2JlYWNvbnMpOwogCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gcHJpdi0+bGFzdF90eF9mYWlsdXJlczsKQEAgLTYyMzgsMTMgKzYyNzcsMTIgQEAKIAlyZXR1cm4gd3N0YXRzOwogfQogCi0KIC8qIG5ldCBkZXZpY2Ugc3R1ZmYgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGluaXRfc3lzX2NvbmZpZyhzdHJ1Y3QgaXB3X3N5c19jb25maWcgKnN5c19jb25maWcpCiB7Ci0gICAgICAgIG1lbXNldChzeXNfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGlwd19zeXNfY29uZmlnKSk7Ci0Jc3lzX2NvbmZpZy0+YnRfY29leGlzdGVuY2UgPSAxOyAvKiBXZSBtYXkgbmVlZCB0byBsb29rIGludG8gcHJ2U3RhQnRDb25maWcgKi8KKwltZW1zZXQoc3lzX2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBpcHdfc3lzX2NvbmZpZykpOworCXN5c19jb25maWctPmJ0X2NvZXhpc3RlbmNlID0gMTsJLyogV2UgbWF5IG5lZWQgdG8gbG9vayBpbnRvIHBydlN0YUJ0Q29uZmlnICovCiAJc3lzX2NvbmZpZy0+YW5zd2VyX2Jyb2FkY2FzdF9zc2lkX3Byb2JlID0gMDsKIAlzeXNfY29uZmlnLT5hY2NlcHRfYWxsX2RhdGFfZnJhbWVzID0gMDsKIAlzeXNfY29uZmlnLT5hY2NlcHRfbm9uX2RpcmVjdGVkX2ZyYW1lcyA9IDE7CkBAIC02MjUzLDcgKzYyOTEsNyBAQAogCXN5c19jb25maWctPmV4Y2x1ZGVfbXVsdGljYXN0X3VuZW5jcnlwdGVkID0gMDsKIAlzeXNfY29uZmlnLT5kaXNhYmxlX211bHRpY2FzdF9kZWNyeXB0aW9uID0gMTsKIAlzeXNfY29uZmlnLT5hbnRlbm5hX2RpdmVyc2l0eSA9IENGR19TWVNfQU5URU5OQV9CT1RIOwotCXN5c19jb25maWctPnBhc3NfY3JjX3RvX2hvc3QgPSAwOyAvKiBUT0RPOiBTZWUgaWYgMSBnaXZlcyB1cyBGQ1MgKi8KKwlzeXNfY29uZmlnLT5wYXNzX2NyY190b19ob3N0ID0gMDsJLyogVE9ETzogU2VlIGlmIDEgZ2l2ZXMgdXMgRkNTICovCiAJc3lzX2NvbmZpZy0+ZG90MTFnX2F1dG9fZGV0ZWN0aW9uID0gMDsKIAlzeXNfY29uZmlnLT5lbmFibGVfY3RzX3RvX3NlbGYgPSAwOwogCXN5c19jb25maWctPmJ0X2NvZXhpc3RfY29sbGlzaW9uX3RociA9IDA7CkBAIC02Mjg4LDcgKzYzMjYsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGlwd190eF9za2Ioc3RydWN0IGlwd19wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikKLQkJdHhiLT5mcmFnbWVudHNbMF0tPmRhdGE7CisJICAgIHR4Yi0+ZnJhZ21lbnRzWzBdLT5kYXRhOwogCWludCBpID0gMDsKIAlzdHJ1Y3QgdGZkX2ZyYW1lICp0ZmQ7CiAJc3RydWN0IGNseDJfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbMF07CkBAIC02MzAwLDcgKzYzMzgsNyBAQAogCWNhc2UgSVdfTU9ERV9BREhPQzoKIAkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CiAJCXVuaWNhc3QgPSAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgJiYKLQkJCSFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKTsKKwkJICAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKTsKIAkJaWQgPSBpcHdfZmluZF9zdGF0aW9uKHByaXYsIGhkci0+YWRkcjEpOwogCQlpZiAoaWQgPT0gSVBXX0lOVkFMSURfU1RBVElPTikgewogCQkJaWQgPSBpcHdfYWRkX3N0YXRpb24ocHJpdiwgaGRyLT5hZGRyMSk7CkBAIC02MzE2LDcgKzYzNTQsNyBAQAogCWNhc2UgSVdfTU9ERV9JTkZSQToKIAlkZWZhdWx0OgogCQl1bmljYXN0ID0gIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjMpICYmCi0JCQkhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMyk7CisJCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMyk7CiAJCWhkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOwogCQlpZCA9IDA7CiAJCWJyZWFrOwpAQCAtNjM0OSw3ICs2Mzg3LDcgQEAKIAltZW1jcHkoJnRmZC0+dS5kYXRhLnRmZC50ZmRfMjQubWNoZHIsIGhkciwgaGRyX2xlbik7CiAKIAkvKiBwYXlsb2FkICovCi0JdGZkLT51LmRhdGEubnVtX2NodW5rcyA9IG1pbigodTgpKE5VTV9URkRfQ0hVTktTIC0gMiksIHR4Yi0+bnJfZnJhZ3MpOworCXRmZC0+dS5kYXRhLm51bV9jaHVua3MgPSBtaW4oKHU4KSAoTlVNX1RGRF9DSFVOS1MgLSAyKSwgdHhiLT5ucl9mcmFncyk7CiAJZm9yIChpID0gMDsgaSA8IHRmZC0+dS5kYXRhLm51bV9jaHVua3M7IGkrKykgewogCQlJUFdfREVCVUdfVFgoIkR1bXBpbmcgVFggcGFja2V0IGZyYWcgJWkgb2YgJWkgKCVkIGJ5dGVzKTpcbiIsCiAJCQkgICAgIGksIHRmZC0+dS5kYXRhLm51bV9jaHVua3MsCkBAIC02MzU3LDkgKzYzOTUsMTEgQEAKIAkJcHJpbnRrX2J1ZihJUFdfRExfVFgsIHR4Yi0+ZnJhZ21lbnRzW2ldLT5kYXRhICsgaGRyX2xlbiwKIAkJCSAgIHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW4gLSBoZHJfbGVuKTsKIAotCQl0ZmQtPnUuZGF0YS5jaHVua19wdHJbaV0gPSBwY2lfbWFwX3NpbmdsZSgKLQkJCXByaXYtPnBjaV9kZXYsIHR4Yi0+ZnJhZ21lbnRzW2ldLT5kYXRhICsgaGRyX2xlbiwKLQkJCXR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW4gLSBoZHJfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdGZkLT51LmRhdGEuY2h1bmtfcHRyW2ldID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCisJCQkJICAgdHhiLT5mcmFnbWVudHNbaV0tPmRhdGEgKyBoZHJfbGVuLAorCQkJCSAgIHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW4gLSBoZHJfbGVuLAorCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQl0ZmQtPnUuZGF0YS5jaHVua19sZW5baV0gPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuIC0gaGRyX2xlbjsKIAl9CiAKQEAgLTYzNzksMTYgKzY0MTksMTYgQEAKIAkJCWZvciAoaiA9IGk7IGogPCB0eGItPm5yX2ZyYWdzOyBqKyspIHsKIAkJCQlpbnQgc2l6ZSA9IHR4Yi0+ZnJhZ21lbnRzW2pdLT5sZW4gLSBoZHJfbGVuOwogCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZGluZyBmcmFnICVkICVkLi4uXG4iLAotCQkJCQlqLCBzaXplKTsKKwkJCQkgICAgICAgaiwgc2l6ZSk7CiAJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSwKLQkJCQkJdHhiLT5mcmFnbWVudHNbal0tPmRhdGEgKyBoZHJfbGVuLAotCQkJCQlzaXplKTsKKwkJCQkgICAgICAgdHhiLT5mcmFnbWVudHNbal0tPmRhdGEgKyBoZHJfbGVuLCBzaXplKTsKIAkJCX0KIAkJCWRldl9rZnJlZV9za2JfYW55KHR4Yi0+ZnJhZ21lbnRzW2ldKTsKIAkJCXR4Yi0+ZnJhZ21lbnRzW2ldID0gc2tiOwotCQkJdGZkLT51LmRhdGEuY2h1bmtfcHRyW2ldID0gcGNpX21hcF9zaW5nbGUoCi0JCQkJcHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhLAotCQkJCXRmZC0+dS5kYXRhLmNodW5rX2xlbltpXSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQl0ZmQtPnUuZGF0YS5jaHVua19wdHJbaV0gPQorCQkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgdGZkLT51LmRhdGEuY2h1bmtfbGVuW2ldLAorCQkJCQkgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJCXRmZC0+dS5kYXRhLm51bV9jaHVua3MrKzsKIAkJfQogCX0KQEAgLTY0MDIsNyArNjQ0Miw3IEBACiAKIAlyZXR1cm47CiAKLSBkcm9wOgorICAgICAgZHJvcDoKIAlJUFdfREVCVUdfRFJPUCgiU2lsZW50bHkgZHJvcHBpbmcgVHggcGFja2V0LlxuIik7CiAJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CiB9CkBAIC02NDI5LDcgKzY0NjksNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIAotIGZhaWxfdW5sb2NrOgorICAgICAgZmFpbF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAxOwogfQpAQCAtNjQ3OCw3ICs2NTE4LDcgQEAKIAlsZW4gPSBzaXplb2YoZGF0ZSk7CiAJaXB3X2dldF9vcmRpbmFsKHAsIElQV19PUkRfU1RBVF9GV19EQVRFLCBkYXRlLCAmbGVuKTsKIAotCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwiJXMgKCVzKSIsCisJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLCAiJXMgKCVzKSIsCiAJCSB2ZXJzLCBkYXRlKTsKIAlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHAtPnBjaV9kZXYpKTsKIAlpbmZvLT5lZWR1bXBfbGVuID0gQ1gyX0VFUFJPTV9JTUFHRV9TSVpFOwpAQCAtNjQ5NiwxOSArNjUzNiwxOSBAQAogfQogCiBzdGF0aWMgaW50IGlwd19ldGh0b29sX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKiBieXRlcykKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJaWYgKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4gPiBDWDJfRUVQUk9NX0lNQUdFX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtY3B5KGJ5dGVzLCAmKCh1OCAqKXAtPmVlcHJvbSlbZWVwcm9tLT5vZmZzZXRdLCBlZXByb20tPmxlbik7CisJbWVtY3B5KGJ5dGVzLCAmKCh1OCAqKSBwLT5lZXByb20pW2VlcHJvbS0+b2Zmc2V0XSwgZWVwcm9tLT5sZW4pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlwd19ldGh0b29sX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKiBieXRlcykKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnAgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCWludCBpOwpAQCAtNjUxNiwyMSArNjU1NiwyMCBAQAogCWlmIChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuID4gQ1gyX0VFUFJPTV9JTUFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbWNweSgmKCh1OCAqKXAtPmVlcHJvbSlbZWVwcm9tLT5vZmZzZXRdLCBieXRlcywgZWVwcm9tLT5sZW4pOworCW1lbWNweSgmKCh1OCAqKSBwLT5lZXByb20pW2VlcHJvbS0+b2Zmc2V0XSwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKIAlmb3IgKGkgPSBJUFdfRUVQUk9NX0RBVEE7Ci0JICAgICBpIDwgSVBXX0VFUFJPTV9EQVRBICsgQ1gyX0VFUFJPTV9JTUFHRV9TSVpFOwotCSAgICAgaSsrKQorCSAgICAgaSA8IElQV19FRVBST01fREFUQSArIENYMl9FRVBST01fSU1BR0VfU0laRTsgaSsrKQogCQlpcHdfd3JpdGU4KHAsIGksIHAtPmVlcHJvbVtpXSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBpcHdfZXRodG9vbF9vcHMgPSB7Ci0JIC5nZXRfbGluayAgICAgICA9IGlwd19ldGh0b29sX2dldF9saW5rLAotCSAuZ2V0X2RydmluZm8JID0gaXB3X2V0aHRvb2xfZ2V0X2RydmluZm8sCi0JIC5nZXRfZWVwcm9tX2xlbiA9IGlwd19ldGh0b29sX2dldF9lZXByb21fbGVuLAotCSAuZ2V0X2VlcHJvbQkgPSBpcHdfZXRodG9vbF9nZXRfZWVwcm9tLAotCSAuc2V0X2VlcHJvbQkgPSBpcHdfZXRodG9vbF9zZXRfZWVwcm9tLAorCS5nZXRfbGluawk9IGlwd19ldGh0b29sX2dldF9saW5rLAorCS5nZXRfZHJ2aW5mbwk9IGlwd19ldGh0b29sX2dldF9kcnZpbmZvLAorCS5nZXRfZWVwcm9tX2xlbgk9IGlwd19ldGh0b29sX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCT0gaXB3X2V0aHRvb2xfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbQk9IGlwd19ldGh0b29sX3NldF9lZXByb20sCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXB3X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTY1NzQsMTAgKzY2MTMsMTAgQEAKIAogCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90YXNrbGV0KTsKIAotIAlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwotIG5vbmU6CisgICAgICBub25lOgogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAlyZXR1cm4gSVJRX05PTkU7CiB9CkBAIC02NjA5LDcgKzY2NDgsNyBAQAogCQlJUFdfREVCVUdfUkZfS0lMTCgiSFcgUkYgS2lsbCBkZWFjdGl2YXRlZC4gIFNXIFJGIEtpbGwgc3RpbGwgIgogCQkJCSAgImVuYWJsZWRcbiIpOwogCi0gZXhpdF91bmxvY2s6CisgICAgICBleGl0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTY2NDIsNyArNjY4MSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgdm9pZCBzaGltX19zZXRfc2VjdXJpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpCiB7CkBAIC02NjgzLDggKzY3MjEsNyBAQAogCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CiAJfQogCi0JaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfRU5BQkxFRCAmJgotCSAgICBwcml2LT5zZWMuZW5hYmxlZCAhPSBzZWMtPmVuYWJsZWQpIHsKKwlpZiAoc2VjLT5mbGFncyAmIFNFQ19FTkFCTEVEICYmIHByaXYtPnNlYy5lbmFibGVkICE9IHNlYy0+ZW5hYmxlZCkgewogCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CiAJCXByaXYtPnNlYy5lbmFibGVkID0gc2VjLT5lbmFibGVkOwogCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CkBAIC02Njk0LDggKzY3MzEsNyBAQAogCQkJcHJpdi0+Y2FwYWJpbGl0eSAmPSB+Q0FQX1BSSVZBQ1lfT047CiAJfQogCi0JaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfTEVWRUwgJiYKLQkgICAgcHJpdi0+c2VjLmxldmVsICE9IHNlYy0+bGV2ZWwpIHsKKwlpZiAoc2VjLT5mbGFncyAmIFNFQ19MRVZFTCAmJiBwcml2LT5zZWMubGV2ZWwgIT0gc2VjLT5sZXZlbCkgewogCQlwcml2LT5zZWMubGV2ZWwgPSBzZWMtPmxldmVsOwogCQlwcml2LT5zZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQlwcml2LT5zdGF0dXMgfD0gU1RBVFVTX1NFQ1VSSVRZX1VQREFURUQ7CkBAIC02NzA5LDcgKzY3NDUsNyBAQAogCSAgICAoKChwcml2LT5hc3NvY19yZXF1ZXN0LmNhcGFiaWxpdHkgJgogCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgJiYgIXNlYy0+ZW5hYmxlZCkgfHwKIAkgICAgICghKHByaXYtPmFzc29jX3JlcXVlc3QuY2FwYWJpbGl0eSAmCi0JCSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgJiYgc2VjLT5lbmFibGVkKSkpIHsKKwkJV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpICYmIHNlYy0+ZW5hYmxlZCkpKSB7CiAJCUlQV19ERUJVR19BU1NPQygiRGlzYXNzb2NpYXRpbmcgZHVlIHRvIGNhcGFiaWxpdHkgIgogCQkJCSJjaGFuZ2UuXG4iKTsKIAkJaXB3X2Rpc2Fzc29jaWF0ZShwcml2KTsKQEAgLTY3MjMsNyArNjc1OSw3IEBACiAJLyogVE9ETzogTWFzayBvdXQgcmF0ZXMgYmFzZWQgb24gcHJpdi0+cmF0ZXNfbWFzayAqLwogCiAJbWVtc2V0KHJhdGVzLCAwLCBzaXplb2YoKnJhdGVzKSk7Ci0gICAgICAgIC8qIGNvbmZpZ3VyZSBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwkvKiBjb25maWd1cmUgc3VwcG9ydGVkIHJhdGVzICovCiAJc3dpdGNoIChwcml2LT5pZWVlLT5mcmVxX2JhbmQpIHsKIAljYXNlIElFRUU4MDIxMV81MkdIWl9CQU5EOgogCQlyYXRlcy0+aWVlZV9tb2RlID0gSVBXX0FfTU9ERTsKQEAgLTY3MzIsNyArNjc2OCw3IEBACiAJCQkJCUlFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyk7CiAJCWJyZWFrOwogCi0JZGVmYXVsdDogLyogTWl4ZWQgb3IgMi40R2h6ICovCisJZGVmYXVsdDoJCS8qIE1peGVkIG9yIDIuNEdoeiAqLwogCQlyYXRlcy0+aWVlZV9tb2RlID0gSVBXX0dfTU9ERTsKIAkJcmF0ZXMtPnB1cnBvc2UgPSBJUFdfUkFURV9DQVBBQklMSVRJRVM7CiAJCWlwd19hZGRfY2NrX3NjYW5fcmF0ZXMocmF0ZXMsIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiwKQEAgLTY3ODMsOCArNjgxOSw4IEBACiAJaWYgKGlwd19zZW5kX3N5c3RlbV9jb25maWcocHJpdiwgJnByaXYtPnN5c19jb25maWcpKQogCQlnb3RvIGVycm9yOwogCi0gICAgICAgIGluaXRfc3VwcG9ydGVkX3JhdGVzKHByaXYsICZwcml2LT5yYXRlcyk7Ci0gICAgICAgIGlmIChpcHdfc2VuZF9zdXBwb3J0ZWRfcmF0ZXMocHJpdiwgJnByaXYtPnJhdGVzKSkKKwlpbml0X3N1cHBvcnRlZF9yYXRlcyhwcml2LCAmcHJpdi0+cmF0ZXMpOworCWlmIChpcHdfc2VuZF9zdXBwb3J0ZWRfcmF0ZXMocHJpdiwgJnByaXYtPnJhdGVzKSkKIAkJZ290byBlcnJvcjsKIAogCS8qIFNldCByZXF1ZXN0LXRvLXNlbmQgdGhyZXNob2xkICovCkBAIC02ODA2LDcgKzY4NDIsNyBAQAogCiAJcmV0dXJuIDA7CiAKLSBlcnJvcjoKKyAgICAgIGVycm9yOgogCXJldHVybiAtRUlPOwogfQogCkBAIC02ODE4LDEzICs2ODU0LDEyIEBACiAJaWYgKHByaXYtPnN0YXR1cyAmIFNUQVRVU19FWElUX1BFTkRJTkcpCiAJCXJldHVybiAtRUlPOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IV19SRVNUQVJUUzsgaSsrICkgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgewogCQkvKiBMb2FkIHRoZSBtaWNyb2NvZGUsIGZpcm13YXJlLCBhbmQgZWVwcm9tLgogCQkgKiBBbHNvIHN0YXJ0IHRoZSBjbG9ja3MuICovCiAJCXJjID0gaXB3X2xvYWQocHJpdik7CiAJCWlmIChyYykgewotCQkJSVBXX0VSUk9SKCJVbmFibGUgdG8gbG9hZCBmaXJtd2FyZTogMHglMDhYXG4iLAotCQkJCQlyYyk7CisJCQlJUFdfRVJST1IoIlVuYWJsZSB0byBsb2FkIGZpcm13YXJlOiAweCUwOFhcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQogCkBAIC02ODU3LDggKzY4OTIsNyBAQAogCiAJLyogdHJpZWQgdG8gcmVzdGFydCBhbmQgY29uZmlnIHRoZSBkZXZpY2UgZm9yIGFzIGxvbmcgYXMgb3VyCiAJICogcGF0aWVuY2UgY291bGQgd2l0aHN0YW5kICovCi0JSVBXX0VSUk9SKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLAotCQkgIGkpOworCUlQV19FUlJPUigiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlIGFmdGVyICVkIGF0dGVtcHRzLlxuIiwgaSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTY5MjMsMTAgKzY5NTcsMTAgQEAKIAl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDQzLCAweDgwODYsIDB4Mjc2MSwgMCwgMCwgMH0sCiAJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA0MywgMHg4MDg2LCAweDI3NjIsIDAsIDAsIDB9LAogCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNGYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDQyMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCAvKiBCRyAqLwotCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDQyMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCAvKiAyMjI1QkcgKi8KLQl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg0MjIzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgLyogQUJHICovCi0Je1BDSV9WRU5ET1JfSURfSU5URUwsIDB4NDIyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIC8qIEFCRyAqLworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDQyMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAkvKiBCRyAqLworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDQyMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAkvKiAyMjI1QkcgKi8KKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg0MjIzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwJLyogQUJHICovCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIDB4NDIyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCS8qIEFCRyAqLwogCiAJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLwogCXswLH0KQEAgLTY5NTQsMTEgKzY5ODgsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXB3X2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkubmFtZSA9IE5VTEwsCQkvKiBwdXQgaW4gZGV2aWNlIGRpcmVjdG9yeSAqLwotCS5hdHRycwk9IGlwd19zeXNmc19lbnRyaWVzLAorCS5hdHRycyA9IGlwd19zeXNmc19lbnRyaWVzLAogfTsKIAotc3RhdGljIGludCBpcHdfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCitzdGF0aWMgaW50IGlwd19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CkBAIC03MDUxLDcgKzcwODQsNyBAQAogCQlwcml2LT5jb25maWcgfD0gQ0ZHX1NUQVRJQ19DSEFOTkVMOwogCQlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKIAkJSVBXX0RFQlVHX0lORk8oIkJpbmQgdG8gc3RhdGljIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOwotIAkJSVBXX0RFQlVHX0lORk8oIkJpbmQgdG8gc3RhdGljIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlJUFdfREVCVUdfSU5GTygiQmluZCB0byBzdGF0aWMgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CiAJCS8qIFRPRE86IFZhbGlkYXRlIHRoYXQgcHJvdmlkZWQgY2hhbm5lbCBpcyBpbiByYW5nZSAqLwogCX0KIApAQCAtNzA3OCw5ICs3MTExLDkgQEAKIAkJcHJpdi0+aWVlZS0+YWJnX3R1cmUgPSAxOwogCQliYW5kID0gSUVFRTgwMjExXzUyR0haX0JBTkQgfCBJRUVFODAyMTFfMjRHSFpfQkFORDsKIAkJbW9kdWxhdGlvbiA9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gfAotCQkJSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOworCQkgICAgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOwogCQlwcml2LT5hZGFwdGVyID0gSVBXXzI5MTVBQkc7Ci0JCXByaXYtPmllZWUtPm1vZGUgPSBJRUVFX0F8SUVFRV9HfElFRUVfQjsKKwkJcHJpdi0+aWVlZS0+bW9kZSA9IElFRUVfQSB8IElFRUVfRyB8IElFRUVfQjsKIAl9IGVsc2UgewogCQlpZiAocHJpdi0+cGNpX2Rldi0+ZGV2aWNlID09IDB4NDIyMSkKIAkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKQEAgLTcwOTQsOSArNzEyNyw5IEBACiAJCXByaXYtPmllZWUtPmFiZ190dXJlID0gMDsKIAkJYmFuZCA9IElFRUU4MDIxMV8yNEdIWl9CQU5EOwogCQltb2R1bGF0aW9uID0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiB8Ci0JCQlJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJCSAgICBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CiAJCXByaXYtPmFkYXB0ZXIgPSBJUFdfMjIwMEJHOwotCQlwcml2LT5pZWVlLT5tb2RlID0gSUVFRV9HfElFRUVfQjsKKwkJcHJpdi0+aWVlZS0+bW9kZSA9IElFRUVfRyB8IElFRUVfQjsKIAl9CiAKIAlwcml2LT5pZWVlLT5mcmVxX2JhbmQgPSBiYW5kOwpAQCAtNzExMCwxMSArNzE0MywxMCBAQAogCXByaXYtPnJ0c190aHJlc2hvbGQgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CiAKIAkvKiBJZiBwb3dlciBtYW5hZ2VtZW50IGlzIHR1cm5lZCBvbiwgZGVmYXVsdCB0byBBQyBtb2RlICovCi0gICAgICAgIHByaXYtPnBvd2VyX21vZGUgPSBJUFdfUE9XRVJfQUM7CisJcHJpdi0+cG93ZXJfbW9kZSA9IElQV19QT1dFUl9BQzsKIAlwcml2LT50eF9wb3dlciA9IElQV19ERUZBVUxUX1RYX1BPV0VSOwogCi0JZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpcHdfaXNyLCBTQV9TSElSUSwgRFJWX05BTUUsCi0JCQkgIHByaXYpOworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaXB3X2lzciwgU0FfU0hJUlEsIERSVl9OQU1FLCBwcml2KTsKIAlpZiAoZXJyKSB7CiAJCUlQV19FUlJPUigiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCWdvdG8gb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOwpAQCAtNzEzNiw3ICs3MTY4LDcgQEAKIAluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZpcHdfd3hfaGFuZGxlcl9kZWY7CiAJbmV0X2Rldi0+ZXRodG9vbF9vcHMgPSAmaXB3X2V0aHRvb2xfb3BzOwogCW5ldF9kZXYtPmlycSA9IHBkZXYtPmlycTsKLQluZXRfZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyApcHJpdi0+aHdfYmFzZTsKKwluZXRfZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylwcml2LT5od19iYXNlOwogCW5ldF9kZXYtPm1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAluZXRfZGV2LT5tZW1fZW5kID0gbmV0X2Rldi0+bWVtX3N0YXJ0ICsgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSAtIDE7CiAKQEAgLTcxNTQsMjMgKzcxODYsMjMgQEAKIAogCXJldHVybiAwOwogCi0gb3V0X3JlbW92ZV9ncm91cDoKKyAgICAgIG91dF9yZW1vdmVfZ3JvdXA6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmlwd19hdHRyaWJ1dGVfZ3JvdXApOwotIG91dF9yZWxlYXNlX2lycToKKyAgICAgIG91dF9yZWxlYXNlX2lycToKIAlmcmVlX2lycShwZGV2LT5pcnEsIHByaXYpOwotIG91dF9kZXN0cm95X3dvcmtxdWV1ZToKKyAgICAgIG91dF9kZXN0cm95X3dvcmtxdWV1ZToKIAlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwogCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7Ci0gb3V0X2lvdW5tYXA6CisgICAgICBvdXRfaW91bm1hcDoKIAlpb3VubWFwKHByaXYtPmh3X2Jhc2UpOwotIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOgorICAgICAgb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOgorICAgICAgb3V0X3BjaV9kaXNhYmxlX2RldmljZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotIG91dF9mcmVlX2llZWU4MDIxMToKKyAgICAgIG91dF9mcmVlX2llZWU4MDIxMToKIAlmcmVlX2llZWU4MDIxMShwcml2LT5uZXRfZGV2KTsKLSBvdXQ6CisgICAgICBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzIyMyw3ICs3MjU1LDYgQEAKICNlbmRpZgogfQogCi0KICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgaXB3X3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CkBAIC03MjMyLDcgKzcyNjMsNyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdvaW5nIGludG8gc3VzcGVuZC4uLlxuIiwgZGV2LT5uYW1lKTsKIAotIAkvKiBUYWtlIGRvd24gdGhlIGRldmljZTsgcG93ZXJzIGl0IG9mZiwgZXRjLiAqLworCS8qIFRha2UgZG93biB0aGUgZGV2aWNlOyBwb3dlcnMgaXQgb2ZmLCBldGMuICovCiAJaXB3X2Rvd24ocHJpdik7CiAKIAkvKiBSZW1vdmUgdGhlIFBSRVNFTlQgc3RhdGUgb2YgdGhlIGRldmljZSAqLwpAQCAtNzMwNiw4ICs3MzM3LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmlwd19kcml2ZXIuZHJpdmVyLAotCQkJCSAmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwpOworCXJldCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmaXB3X2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z19sZXZlbCk7CiAJaWYgKHJldCkgewogCQlJUFdfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgZHJpdmVyIHN5c2ZzIGZpbGVcbiIpOwogCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlwd19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oCmluZGV4IDY2YmI1OTAuLjViMDA4ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmgKQEAgLTU2LDggKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogLyogQXV0aGVudGljYXRpb24gIGFuZCBBc3NvY2lhdGlvbiBTdGF0ZXMgKi8KLWVudW0gY29ubmVjdGlvbl9tYW5hZ2VyX2Fzc29jX3N0YXRlcwoteworZW51bSBjb25uZWN0aW9uX21hbmFnZXJfYXNzb2Nfc3RhdGVzIHsKIAlDTUFTX0lOSVQgPSAwLAogCUNNQVNfVFhfQVVUSF9TRVFfMSwKIAlDTUFTX1JYX0FVVEhfU0VRXzIsCkBAIC03NCw3ICs3Myw2IEBACiAJQ01BU19MQVNUCiB9OwogCi0KICNkZWZpbmUgSVBXX1dBSVQgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKICNkZWZpbmUgSVBXX1FVSUVUICAgICAgICAgICAgICAgICAgICAoMTw8MSkKICNkZWZpbmUgSVBXX1JPQU1JTkcgICAgICAgICAgICAgICAgICAoMTw8MikKQEAgLTE5MCw3ICsxODgsNiBAQAogI2RlZmluZSBEQ1RfRkxBR19FWFRfTU9ERV9DQ0sgIDB4MDEKICNkZWZpbmUgRENUX0ZMQUdfRVhUX01PREVfT0ZETSAweDAwCiAKLQogI2RlZmluZSBUWF9SWF9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkYKICNkZWZpbmUgVFhfRlJBTUVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIFRYX0hPU1RfQ09NTUFORF9UWVBFICAgICAgICAgICAgICAgMHgwMQpAQCAtMjQyLDEwNyArMjM5LDk3IEBACiAgKiBDb250YWlucyBjb21tb24gZGF0YSBmb3IgUnggYW5kIFR4IHF1ZXVlcwogICovCiBzdHJ1Y3QgY2x4Ml9xdWV1ZSB7Ci0JaW50IG5fYmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIEJEcyBpbiB0aGlzIHF1ZXVlICovCi0JaW50IGZpcnN0X2VtcHR5OyAgICAgICAgICAgICAgIC8qKjwgMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpICovCi0JaW50IGxhc3RfdXNlZDsgICAgICAgICAgICAgICAgIC8qKjwgbGFzdCB1c2VkIGVudHJ5IChpbmRleCkgKi8KLQl1MzIgcmVnX3c7ICAgICAgICAgICAgICAgICAgIC8qKjwgJ3dyaXRlJyByZWcgKHF1ZXVlIGhlYWQpLCBhZGRyIGluIGRvbWFpbiAxICovCi0JdTMyIHJlZ19yOyAgICAgICAgICAgICAgICAgICAvKio8ICdyZWFkJyByZWcgKHF1ZXVlIHRhaWwpLCBhZGRyIGluIGRvbWFpbiAxICovCi0JZG1hX2FkZHJfdCBkbWFfYWRkcjsgICAgICAgICAgICAvKio8IHBoeXNpY2FsIGFkZHIgZm9yIEJEJ3MgKi8KLQlpbnQgbG93X21hcms7ICAgICAgICAgICAgICAgICAgLyoqPCBsb3cgd2F0ZXJtYXJrLCByZXN1bWUgcXVldWUgaWYgZnJlZSBzcGFjZSBtb3JlIHRoYW4gdGhpcyAqLwotCWludCBoaWdoX21hcms7ICAgICAgICAgICAgICAgICAvKio8IGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbGVzcyB0aGFuIHRoaXMgKi8KKwlpbnQgbl9iZDsJCSAgICAgICAvKio8IG51bWJlciBvZiBCRHMgaW4gdGhpcyBxdWV1ZSAqLworCWludCBmaXJzdF9lbXB0eTsJICAgICAgIC8qKjwgMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpICovCisJaW50IGxhc3RfdXNlZDsJCSAgICAgICAvKio8IGxhc3QgdXNlZCBlbnRyeSAoaW5kZXgpICovCisJdTMyIHJlZ193OwkJICAgICAvKio8ICd3cml0ZScgcmVnIChxdWV1ZSBoZWFkKSwgYWRkciBpbiBkb21haW4gMSAqLworCXUzMiByZWdfcjsJCSAgICAgLyoqPCAncmVhZCcgcmVnIChxdWV1ZSB0YWlsKSwgYWRkciBpbiBkb21haW4gMSAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CQkvKio8IHBoeXNpY2FsIGFkZHIgZm9yIEJEJ3MgKi8KKwlpbnQgbG93X21hcms7CQkgICAgICAgLyoqPCBsb3cgd2F0ZXJtYXJrLCByZXN1bWUgcXVldWUgaWYgZnJlZSBzcGFjZSBtb3JlIHRoYW4gdGhpcyAqLworCWludCBoaWdoX21hcms7CQkgICAgICAgLyoqPCBoaWdoIHdhdGVybWFyaywgc3RvcCBxdWV1ZSBpZiBmcmVlIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IG1hY2hkcjMyCi17CitzdHJ1Y3QgbWFjaGRyMzIgewogCXUxNiBmcmFtZV9jdGw7Ci0JdTE2IGR1cmF0aW9uOyAgICAgLy8gd2F0Y2ggb3V0IGZvciBlbmRpYW5zIQotCXU4IGFkZHIxWyBNQUNBRFJSX0JZVEVfTEVOIF07Ci0JdTggYWRkcjJbIE1BQ0FEUlJfQllURV9MRU4gXTsKLQl1OCBhZGRyM1sgTUFDQURSUl9CWVRFX0xFTiBdOwotCXUxNiBzZXFfY3RybDsgICAgIC8vIG1vcmUgZW5kaWFucyEKLQl1OCBhZGRyNFsgTUFDQURSUl9CWVRFX0xFTiBdOworCXUxNiBkdXJhdGlvbjsJCS8vIHdhdGNoIG91dCBmb3IgZW5kaWFucyEKKwl1OCBhZGRyMVtNQUNBRFJSX0JZVEVfTEVOXTsKKwl1OCBhZGRyMltNQUNBRFJSX0JZVEVfTEVOXTsKKwl1OCBhZGRyM1tNQUNBRFJSX0JZVEVfTEVOXTsKKwl1MTYgc2VxX2N0cmw7CQkvLyBtb3JlIGVuZGlhbnMhCisJdTggYWRkcjRbTUFDQURSUl9CWVRFX0xFTl07CiAJdTE2IHFvc19jdHJsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBtYWNoZHIzMAoteworc3RydWN0IG1hY2hkcjMwIHsKIAl1MTYgZnJhbWVfY3RsOwotCXUxNiBkdXJhdGlvbjsgICAgIC8vIHdhdGNoIG91dCBmb3IgZW5kaWFucyEKLQl1OCBhZGRyMVsgTUFDQURSUl9CWVRFX0xFTiBdOwotCXU4IGFkZHIyWyBNQUNBRFJSX0JZVEVfTEVOIF07Ci0JdTggYWRkcjNbIE1BQ0FEUlJfQllURV9MRU4gXTsKLQl1MTYgc2VxX2N0cmw7ICAgICAvLyBtb3JlIGVuZGlhbnMhCi0JdTggYWRkcjRbIE1BQ0FEUlJfQllURV9MRU4gXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKKwl1MTYgZHVyYXRpb247CQkvLyB3YXRjaCBvdXQgZm9yIGVuZGlhbnMhCisJdTggYWRkcjFbTUFDQURSUl9CWVRFX0xFTl07CisJdTggYWRkcjJbTUFDQURSUl9CWVRFX0xFTl07CisJdTggYWRkcjNbTUFDQURSUl9CWVRFX0xFTl07CisJdTE2IHNlcV9jdHJsOwkJLy8gbW9yZSBlbmRpYW5zIQorCXU4IGFkZHI0W01BQ0FEUlJfQllURV9MRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBtYWNoZHIyNgoteworc3RydWN0IG1hY2hkcjI2IHsKIAl1MTYgZnJhbWVfY3RsOwotCXUxNiBkdXJhdGlvbjsgICAgIC8vIHdhdGNoIG91dCBmb3IgZW5kaWFucyEKLQl1OCBhZGRyMVsgTUFDQURSUl9CWVRFX0xFTiBdOwotCXU4IGFkZHIyWyBNQUNBRFJSX0JZVEVfTEVOIF07Ci0JdTggYWRkcjNbIE1BQ0FEUlJfQllURV9MRU4gXTsKLQl1MTYgc2VxX2N0cmw7ICAgICAvLyBtb3JlIGVuZGlhbnMhCisJdTE2IGR1cmF0aW9uOwkJLy8gd2F0Y2ggb3V0IGZvciBlbmRpYW5zIQorCXU4IGFkZHIxW01BQ0FEUlJfQllURV9MRU5dOworCXU4IGFkZHIyW01BQ0FEUlJfQllURV9MRU5dOworCXU4IGFkZHIzW01BQ0FEUlJfQllURV9MRU5dOworCXUxNiBzZXFfY3RybDsJCS8vIG1vcmUgZW5kaWFucyEKIAl1MTYgcW9zX2N0cmw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IG1hY2hkcjI0Ci17CitzdHJ1Y3QgbWFjaGRyMjQgewogCXUxNiBmcmFtZV9jdGw7Ci0JdTE2IGR1cmF0aW9uOyAgICAgLy8gd2F0Y2ggb3V0IGZvciBlbmRpYW5zIQotCXU4IGFkZHIxWyBNQUNBRFJSX0JZVEVfTEVOIF07Ci0JdTggYWRkcjJbIE1BQ0FEUlJfQllURV9MRU4gXTsKLQl1OCBhZGRyM1sgTUFDQURSUl9CWVRFX0xFTiBdOwotCXUxNiBzZXFfY3RybDsgICAgIC8vIG1vcmUgZW5kaWFucyEKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKKwl1MTYgZHVyYXRpb247CQkvLyB3YXRjaCBvdXQgZm9yIGVuZGlhbnMhCisJdTggYWRkcjFbTUFDQURSUl9CWVRFX0xFTl07CisJdTggYWRkcjJbTUFDQURSUl9CWVRFX0xFTl07CisJdTggYWRkcjNbTUFDQURSUl9CWVRFX0xFTl07CisJdTE2IHNlcV9jdHJsOwkJLy8gbW9yZSBlbmRpYW5zIQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8vIFRYIFRGRCB3aXRoIDMyIGJ5dGUgTUFDIEhlYWRlcgotc3RydWN0IHR4X3RmZF8zMgotewotCXN0cnVjdCBtYWNoZHIzMiAgICBtY2hkcjsgICAgICAgICAgICAgICAgICAgICAgLy8gMzIKLQl1MzIgICAgICAgICAgICAgICAgdWl2cGxhY2Vob2xkZXJbMl07ICAgICAgICAgIC8vIDgKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKK3N0cnVjdCB0eF90ZmRfMzIgeworCXN0cnVjdCBtYWNoZHIzMiBtY2hkcjsJLy8gMzIKKwl1MzIgdWl2cGxhY2Vob2xkZXJbMl07CS8vIDgKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvLyBUWCBURkQgd2l0aCAzMCBieXRlIE1BQyBIZWFkZXIKLXN0cnVjdCB0eF90ZmRfMzAKLXsKLQlzdHJ1Y3QgbWFjaGRyMzAgICAgbWNoZHI7ICAgICAgICAgICAgICAgICAgICAgIC8vIDMwCi0JdTggICAgICAgICAgICAgICAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgICAgICAvLyAyCi0JdTMyICAgICAgICAgICAgICAgIHVpdnBsYWNlaG9sZGVyWzJdOyAgICAgICAgICAvLyA4Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7CitzdHJ1Y3QgdHhfdGZkXzMwIHsKKwlzdHJ1Y3QgbWFjaGRyMzAgbWNoZHI7CS8vIDMwCisJdTggcmVzZXJ2ZWRbMl07CQkvLyAyCisJdTMyIHVpdnBsYWNlaG9sZGVyWzJdOwkvLyA4Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLy8gdHggdGZkIHdpdGggMjYgYnl0ZSBtYWMgaGVhZGVyCi1zdHJ1Y3QgdHhfdGZkXzI2Ci17Ci0Jc3RydWN0IG1hY2hkcjI2ICAgIG1jaGRyOyAgICAgICAgICAgICAgICAgICAgICAvLyAyNgotCXU4ICAgICAgICAgICAgICAgICByZXNlcnZlZDFbMl07ICAgICAgICAgICAgICAgLy8gMgotCXUzMiAgICAgICAgICAgICAgICB1aXZwbGFjZWhvbGRlclsyXTsgICAgICAgICAgLy8gOAotCXU4ICAgICAgICAgICAgICAgICByZXNlcnZlZDJbNF07ICAgICAgICAgICAgICAgLy8gNAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOworc3RydWN0IHR4X3RmZF8yNiB7CisJc3RydWN0IG1hY2hkcjI2IG1jaGRyOwkvLyAyNgorCXU4IHJlc2VydmVkMVsyXTsJLy8gMgorCXUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAorCXU4IHJlc2VydmVkMls0XTsJLy8gNAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8vIHR4IHRmZCB3aXRoIDI0IGJ5dGUgbWFjIGhlYWRlcgotc3RydWN0IHR4X3RmZF8yNAotewotCXN0cnVjdCBtYWNoZHIyNCAgICBtY2hkcjsgICAgICAgICAgICAgICAgICAgICAgLy8gMjQKLQl1MzIgICAgICAgICAgICAgICAgdWl2cGxhY2Vob2xkZXJbMl07ICAgICAgICAgIC8vIDgKLQl1OCAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbOF07ICAgICAgICAgICAgICAgIC8vIDgKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKLQorc3RydWN0IHR4X3RmZF8yNCB7CisJc3RydWN0IG1hY2hkcjI0IG1jaGRyOwkvLyAyNAorCXUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAorCXU4IHJlc2VydmVkWzhdOwkJLy8gOAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKICNkZWZpbmUgRENUX1dFUF9LRVlfRklFTERfTEVOR1RIIDE2CiAKLXN0cnVjdCB0ZmRfY29tbWFuZAoteworc3RydWN0IHRmZF9jb21tYW5kIHsKIAl1OCBpbmRleDsKIAl1OCBsZW5ndGg7CiAJdTE2IHJlc2VydmVkOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHRmZF9kYXRhIHsKIAkvKiBIZWFkZXIgKi8KIAl1MzIgd29ya19hcmVhX3B0cjsKLQl1OCBzdGF0aW9uX251bWJlcjsgLyogMCBmb3IgQlNTICovCisJdTggc3RhdGlvbl9udW1iZXI7CS8qIDAgZm9yIEJTUyAqLwogCXU4IHJlc2VydmVkMTsKIAl1MTYgcmVzZXJ2ZWQyOwogCkBAIC0zNTksMTQgKzM0NiwxMyBAQAogCXU4IGFudGVubmE7CiAJdTE2IG5leHRfcGFja2V0X2R1cmF0aW9uOwogCXUxNiBuZXh0X2ZyYWdfbGVuOwotCXUxNiBiYWNrX29mZl9jb3VudGVyOyAvLy8vLy90eG9wOworCXUxNiBiYWNrX29mZl9jb3VudGVyOwkvLy8vLy90eG9wOwogCXU4IHJldHJ5bGltaXQ7CiAJdTE2IGN3Y3VycmVudDsKIAl1OCByZXNlcnZlZDM7CiAKIAkvKiA4MDIuMTEgTUFDIEhlYWRlciAqLwotCXVuaW9uCi0JeworCXVuaW9uIHsKIAkJc3RydWN0IHR4X3RmZF8yNCB0ZmRfMjQ7CiAJCXN0cnVjdCB0eF90ZmRfMjYgdGZkXzI2OwogCQlzdHJ1Y3QgdHhfdGZkXzMwIHRmZF8zMDsKQEAgLTM3OSw4ICszNjUsNyBAQAogCXUxNiBjaHVua19sZW5bTlVNX1RGRF9DSFVOS1NdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCB0eHJ4X2NvbnRyb2xfZmxhZ3MKLXsKK3N0cnVjdCB0eHJ4X2NvbnRyb2xfZmxhZ3MgewogCXU4IG1lc3NhZ2VfdHlwZTsKIAl1OCByeF9zZXFfbnVtOwogCXU4IGNvbnRyb2xfYml0czsKQEAgLTM5MCwxNyArMzc1LDE2IEBACiAjZGVmaW5lICBURkRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSAgVEZEX0NNRF9JTU1FRElBVEVfUEFZTE9BRF9MRU5HVEggICAoVEZEX1NJWkUgLSBzaXplb2Yoc3RydWN0IHR4cnhfY29udHJvbF9mbGFncykpCiAKLXN0cnVjdCB0ZmRfZnJhbWUKLXsKK3N0cnVjdCB0ZmRfZnJhbWUgewogCXN0cnVjdCB0eHJ4X2NvbnRyb2xfZmxhZ3MgY29udHJvbF9mbGFnczsKIAl1bmlvbiB7CiAJCXN0cnVjdCB0ZmRfZGF0YSBkYXRhOwogCQlzdHJ1Y3QgdGZkX2NvbW1hbmQgY21kOwogCQl1OCByYXdbVEZEX0NNRF9JTU1FRElBVEVfUEFZTE9BRF9MRU5HVEhdOwogCX0gdTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHZvaWQgZGVzdHJ1Y3Rvcl9mdW5jKGNvbnN0IHZvaWQqKTsKK3R5cGVkZWYgdm9pZCBkZXN0cnVjdG9yX2Z1bmMoY29uc3Qgdm9pZCAqKTsKIAogLyoqCiAgKiBUeCBRdWV1ZSBmb3IgRE1BLiBRdWV1ZSBjb25zaXN0cyBvZiBjaXJjdWxhciBidWZmZXIgb2YKQEAgLTQwOCw3ICszOTIsNyBAQAogICovCiBzdHJ1Y3QgY2x4Ml90eF9xdWV1ZSB7CiAJc3RydWN0IGNseDJfcXVldWUgcTsKLQlzdHJ1Y3QgdGZkX2ZyYW1lKiBiZDsKKwlzdHJ1Y3QgdGZkX2ZyYW1lICpiZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKnR4YjsKIH07CiAKQEAgLTQyMyw4ICs0MDcsNyBAQAogI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgKDEyKQogCiAvLyBVc2VkIGZvciBwYXNzaW5nIHRvIGRyaXZlciBudW1iZXIgb2Ygc3VjY2Vzc2VzIGFuZCBmYWlsdXJlcyBwZXIgcmF0ZQotc3RydWN0IHJhdGVfaGlzdG9ncmFtCi17CitzdHJ1Y3QgcmF0ZV9oaXN0b2dyYW0gewogCXVuaW9uIHsKIAkJdTMyIGFbU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFNdOwogCQl1MzIgYltTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMU107CkBAIC00NzUsMTIgKzQ1OCwxMiBAQAogCXU4IG51bV9jaGFubmVsczsKIAl1OCBzdGF0dXM7CiAJdTggcmVzZXJ2ZWQ7Ci19ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IG5vdGlmX2ZyYWdfbGVuZ3RoIHsKIAl1MTYgZnJhZ19sZW5ndGg7CiAJdTE2IHJlc2VydmVkOwotfSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBub3RpZl9iZWFjb25fc3RhdGUgewogCXUzMiBzdGF0ZTsKQEAgLTU0MywxMSArNTI2LDExIEBACiAKIHN0cnVjdCBpcHdfcnhfZnJhbWUgewogCXUzMiByZXNlcnZlZDE7Ci0JdTggcGFyZW50X3RzZls0XTsgICAgIC8vIGZ3X3VzZVswXSBpcyBib29sZWFuIGZvciBPVVJfVFNGX0lTX0dSRUFURVIKLQl1OCByZWNlaXZlZF9jaGFubmVsOyAgLy8gVGhlIGNoYW5uZWwgdGhhdCB0aGlzIGZyYW1lIHdhcyByZWNlaXZlZCBvbi4KLQkJCSAgICAgIC8vIE5vdGUgdGhhdCBmb3IgLjExYiB0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUKLQkgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgYXMgdGhlIGNoYW5uZWwgdGhhdCBpdCB3YXMgc2VudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGxlZCBieSBMTUFDCisJdTggcGFyZW50X3RzZls0XTsJLy8gZndfdXNlWzBdIGlzIGJvb2xlYW4gZm9yIE9VUl9UU0ZfSVNfR1JFQVRFUgorCXU4IHJlY2VpdmVkX2NoYW5uZWw7CS8vIFRoZSBjaGFubmVsIHRoYXQgdGhpcyBmcmFtZSB3YXMgcmVjZWl2ZWQgb24uCisJLy8gTm90ZSB0aGF0IGZvciAuMTFiIHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZQorCS8vIHRoZSBzYW1lIGFzIHRoZSBjaGFubmVsIHRoYXQgaXQgd2FzIHNlbnQuCisJLy8gRmlsbGVkIGJ5IExNQUMKIAl1OCBmcmFtZVN0YXR1czsKIAl1OCByYXRlOwogCXU4IHJzc2k7CkBAIC01NTYsMTAgKzUzOSwxMCBAQAogCXUxNiBzaWduYWw7CiAJdTE2IG5vaXNlOwogCXU4IGFudGVubmFBbmRQaHk7Ci0JdTggY29udHJvbDsgICAgICAgICAgIC8vIGNvbnRyb2wgYml0IHNob3VsZCBiZSBvbiBpbiBiZwotCXU4IHJ0c2N0c19yYXRlOyAgICAgICAvLyByYXRlIG9mIHJ0cyBvciBjdHMgKGluIHJ0cyBjdHMgc2VxdWVuY2UgcmF0ZQotCSAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpZGVudGljYWwpCi0JdTggcnRzY3RzX3NlZW47ICAgICAgIC8vIDB4MSBSVFMgc2VlbiA7IDB4MiBDVFMgc2VlbgorCXU4IGNvbnRyb2w7CQkvLyBjb250cm9sIGJpdCBzaG91bGQgYmUgb24gaW4gYmcKKwl1OCBydHNjdHNfcmF0ZTsJCS8vIHJhdGUgb2YgcnRzIG9yIGN0cyAoaW4gcnRzIGN0cyBzZXF1ZW5jZSByYXRlCisJLy8gaXMgaWRlbnRpY2FsKQorCXU4IHJ0c2N0c19zZWVuOwkJLy8gMHgxIFJUUyBzZWVuIDsgMHgyIENUUyBzZWVuCiAJdTE2IGxlbmd0aDsKIAl1OCBkYXRhWzBdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CkBAIC01NzEsOCArNTU0LDcgQEAKIAl1OCByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X3J4X3BhY2tldAoteworc3RydWN0IGlwd19yeF9wYWNrZXQgewogCXN0cnVjdCBpcHdfcnhfaGVhZGVyIGhlYWRlcjsKIAl1bmlvbiB7CiAJCXN0cnVjdCBpcHdfcnhfZnJhbWUgZnJhbWU7CkBAIC01ODksMjEgKzU3MSwyMCBAQAogCXN0cnVjdCBpcHdfcnhfYnVmZmVyICpyeGI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OyAvKiBOb3QgdHJhbnNmZXJyZWQgb3ZlciBuZXR3b3JrLCBzbyBub3QgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqLworfTsJCQkJLyogTm90IHRyYW5zZmVycmVkIG92ZXIgbmV0d29yaywgc28gbm90ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgKi8KIAogc3RydWN0IGlwd19yeF9xdWV1ZSB7CiAJc3RydWN0IGlwd19yeF9tZW1fYnVmZmVyIHBvb2xbUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSU107CiAJc3RydWN0IGlwd19yeF9tZW1fYnVmZmVyICpxdWV1ZVtSWF9RVUVVRV9TSVpFXTsKLQl1MzIgcHJvY2Vzc2VkOyAvKiBJbnRlcm5hbCBpbmRleCB0byBsYXN0IGhhbmRsZWQgUnggcGFja2V0ICovCi0JdTMyIHJlYWQ7ICAgICAgLyogU2hhcmVkIGluZGV4IHRvIG5ld2VzdCBhdmFpbGFibGUgUnggYnVmZmVyICovCi0JdTMyIHdyaXRlOyAgICAgLyogU2hhcmVkIGluZGV4IHRvIG9sZGVzdCB3cml0dGVuIFJ4IHBhY2tldCAqLwotCXUzMiBmcmVlX2NvdW50Oy8qIE51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gcnhfZnJlZSAqLworCXUzMiBwcm9jZXNzZWQ7CQkvKiBJbnRlcm5hbCBpbmRleCB0byBsYXN0IGhhbmRsZWQgUnggcGFja2V0ICovCisJdTMyIHJlYWQ7CQkvKiBTaGFyZWQgaW5kZXggdG8gbmV3ZXN0IGF2YWlsYWJsZSBSeCBidWZmZXIgKi8KKwl1MzIgd3JpdGU7CQkvKiBTaGFyZWQgaW5kZXggdG8gb2xkZXN0IHdyaXR0ZW4gUnggcGFja2V0ICovCisJdTMyIGZyZWVfY291bnQ7CQkvKiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGluIHJ4X2ZyZWUgKi8KIAkvKiBFYWNoIG9mIHRoZXNlIGxpc3RzIGlzIHVzZWQgYXMgYSBGSUZPIGZvciBpcHdfcnhfbWVtX2J1ZmZlcnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2ZyZWU7ICAvKiBPd24gYW4gU0tCcyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgcnhfdXNlZDsgIC8qIE5vIFNLQiBhbGxvY2F0ZWQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2ZyZWU7CS8qIE93biBhbiBTS0JzICovCisJc3RydWN0IGxpc3RfaGVhZCByeF91c2VkOwkvKiBObyBTS0IgYWxsb2NhdGVkICovCiAJc3BpbmxvY2tfdCBsb2NrOwotfTsgLyogTm90IHRyYW5zZmVycmVkIG92ZXIgbmV0d29yaywgc28gbm90ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgKi8KLQorfTsJCQkJLyogTm90IHRyYW5zZmVycmVkIG92ZXIgbmV0d29yaywgc28gbm90ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgKi8KIAogc3RydWN0IGFsaXZlX2NvbW1hbmRfcmVzcG9uY2UgewogCXU4IGFsaXZlX2NvbW1hbmQ7CkBAIC02MjcsOCArNjA4LDcgQEAKIAl1OCByYXRlc1tJUFdfTUFYX1JBVEVTXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgY29tbWFuZF9ibG9jawoteworc3RydWN0IGNvbW1hbmRfYmxvY2sgewogCXVuc2lnbmVkIGludCBjb250cm9sOwogCXUzMiBzb3VyY2VfYWRkcjsKIAl1MzIgZGVzdF9hZGRyOwpAQCAtNjM2LDE4ICs2MTYsMTYgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAjZGVmaW5lIENCX05VTUJFUl9PRl9FTEVNRU5UU19TTUFMTCA2NAotc3RydWN0IGZ3X2ltYWdlX2Rlc2MKLXsKK3N0cnVjdCBmd19pbWFnZV9kZXNjIHsKIAl1bnNpZ25lZCBsb25nIGxhc3RfY2JfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBjdXJyZW50X2NiX2luZGV4OwogCXN0cnVjdCBjb21tYW5kX2Jsb2NrIGNiX2xpc3RbQ0JfTlVNQkVSX09GX0VMRU1FTlRTX1NNQUxMXTsKLQl2b2lkICogdl9hZGRyOworCXZvaWQgKnZfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHBfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGxlbjsKIH07CiAKLXN0cnVjdCBpcHdfc3lzX2NvbmZpZwoteworc3RydWN0IGlwd19zeXNfY29uZmlnIHsKIAl1OCBidF9jb2V4aXN0ZW5jZTsKIAl1OCByZXNlcnZlZDE7CiAJdTggYW5zd2VyX2Jyb2FkY2FzdF9zc2lkX3Byb2JlOwpAQCAtNjcwLDggKzY0OCw3IEBACiAJdTggcmVzZXJ2ZWQzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBpcHdfbXVsdGljYXN0X2FkZHIKLXsKK3N0cnVjdCBpcHdfbXVsdGljYXN0X2FkZHIgewogCXU4IG51bV9vZl9tdWx0aWNhc3RfYWRkcmVzc2VzOwogCXU4IHJlc2VydmVkWzNdOwogCXU4IG1hYzFbNl07CkBAIC02ODAsOCArNjU3LDcgQEAKIAl1OCBtYWM0WzZdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBpcHdfd2VwX2tleQoteworc3RydWN0IGlwd193ZXBfa2V5IHsKIAl1OCBjbWRfaWQ7CiAJdTggc2VxX251bTsKIAl1OCBrZXlfaW5kZXg7CkBAIC02ODksOCArNjY1LDcgQEAKIAl1OCBrZXlbMTZdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBpcHdfdGdpX3R4X2tleQoteworc3RydWN0IGlwd190Z2lfdHhfa2V5IHsKIAl1OCBrZXlfaWQ7CiAJdTggc2VjdXJpdHlfdHlwZTsKIAl1OCBzdGF0aW9uX2luZGV4OwpAQCAtNzAxLDggKzY3Niw3IEBACiAKICNkZWZpbmUgSVBXX1NDQU5fQ0hBTk5FTFMgNTQKIAotc3RydWN0IGlwd19zY2FuX3JlcXVlc3QKLXsKK3N0cnVjdCBpcHdfc2Nhbl9yZXF1ZXN0IHsKIAl1OCBzY2FuX3R5cGU7CiAJdTE2IGR3ZWxsX3RpbWU7CiAJdTggY2hhbm5lbHNfbGlzdFtJUFdfU0NBTl9DSEFOTkVMU107CkBAIC03MTgsOCArNjkyLDcgQEAKIAlJUFdfU0NBTl9UWVBFUwogfTsKIAotc3RydWN0IGlwd19zY2FuX3JlcXVlc3RfZXh0Ci17CitzdHJ1Y3QgaXB3X3NjYW5fcmVxdWVzdF9leHQgewogCXUzMiBmdWxsX3NjYW5faW5kZXg7CiAJdTggY2hhbm5lbHNfbGlzdFtJUFdfU0NBTl9DSEFOTkVMU107CiAJdTggc2Nhbl90eXBlW0lQV19TQ0FOX0NIQU5ORUxTIC8gMl07CkBAIC03NDAsMTkgKzcxMywxNiBAQAogewogCWlmIChpbmRleCAlIDIpCiAJCXNjYW4tPnNjYW5fdHlwZVtpbmRleCAvIDJdID0KLQkJCShzY2FuLT5zY2FuX3R5cGVbaW5kZXggLyAyXSAmIDB4RjApIHwKLQkJCShzY2FuX3R5cGUgJiAweDBGKTsKKwkJICAgIChzY2FuLT5zY2FuX3R5cGVbaW5kZXggLyAyXSAmIDB4RjApIHwgKHNjYW5fdHlwZSAmIDB4MEYpOwogCWVsc2UKIAkJc2Nhbi0+c2Nhbl90eXBlW2luZGV4IC8gMl0gPQotCQkJKHNjYW4tPnNjYW5fdHlwZVtpbmRleCAvIDJdICYgMHgwRikgfAotCQkJKChzY2FuX3R5cGUgJiAweDBGKSA8PCA0KTsKKwkJICAgIChzY2FuLT5zY2FuX3R5cGVbaW5kZXggLyAyXSAmIDB4MEYpIHwKKwkJICAgICgoc2Nhbl90eXBlICYgMHgwRikgPDwgNCk7CiB9CiAKLXN0cnVjdCBpcHdfYXNzb2NpYXRlCi17CitzdHJ1Y3QgaXB3X2Fzc29jaWF0ZSB7CiAJdTggY2hhbm5lbDsKLQl1OCBhdXRoX3R5cGU6NCwKLQkgICBhdXRoX2tleTo0OworCXU4IGF1dGhfdHlwZTo0LCBhdXRoX2tleTo0OwogCXU4IGFzc29jX3R5cGU7CiAJdTggcmVzZXJ2ZWQ7CiAJdTE2IHBvbGljeV9zdXBwb3J0OwpAQCAtNzcxLDggKzc0MSw3IEBACiAJdTE2IHJlc2VydmVkMjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcwoteworc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgewogCXU4IGllZWVfbW9kZTsKIAl1OCBudW1fcmF0ZXM7CiAJdTggcHVycG9zZTsKQEAgLTc4MCw0MiArNzQ5LDM2IEBACiAJdTggc3VwcG9ydGVkX3JhdGVzW0lQV19NQVhfUkFURVNdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBpcHdfcnRzX3RocmVzaG9sZAoteworc3RydWN0IGlwd19ydHNfdGhyZXNob2xkIHsKIAl1MTYgcnRzX3RocmVzaG9sZDsKIAl1MTYgcmVzZXJ2ZWQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IGlwd19mcmFnX3RocmVzaG9sZAoteworc3RydWN0IGlwd19mcmFnX3RocmVzaG9sZCB7CiAJdTE2IGZyYWdfdGhyZXNob2xkOwogCXUxNiByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X3JldHJ5X2xpbWl0Ci17CitzdHJ1Y3QgaXB3X3JldHJ5X2xpbWl0IHsKIAl1OCBzaG9ydF9yZXRyeV9saW1pdDsKIAl1OCBsb25nX3JldHJ5X2xpbWl0OwogCXUxNiByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X2Rpbm9fY29uZmlnCi17CitzdHJ1Y3QgaXB3X2Rpbm9fY29uZmlnIHsKIAl1MzIgZGlub19jb25maWdfYWRkcjsKIAl1MTYgZGlub19jb25maWdfc2l6ZTsKIAl1OCBkaW5vX3Jlc3BvbnNlOwogCXU4IHJlc2VydmVkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBpcHdfYWlyb25ldF9pbmZvCi17CitzdHJ1Y3QgaXB3X2Fpcm9uZXRfaW5mbyB7CiAJdTggaWQ7CiAJdTggbGVuZ3RoOwogCXUxNiByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X3J4X2tleQoteworc3RydWN0IGlwd19yeF9rZXkgewogCXU4IHN0YXRpb25faW5kZXg7CiAJdTgga2V5X3R5cGU7CiAJdTgga2V5X2lkOwpAQCAtODI2LDIzICs3ODksMjAgQEAKIAl1OCByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X2NvdW50cnlfY2hhbm5lbF9pbmZvCi17CitzdHJ1Y3QgaXB3X2NvdW50cnlfY2hhbm5lbF9pbmZvIHsKIAl1OCBmaXJzdF9jaGFubmVsOwogCXU4IG5vX2NoYW5uZWxzOwogCXM4IG1heF90eF9wb3dlcjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X2NvdW50cnlfaW5mbwoteworc3RydWN0IGlwd19jb3VudHJ5X2luZm8gewogCXU4IGlkOwogCXU4IGxlbmd0aDsKIAl1OCBjb3VudHJ5X3N0clszXTsKIAlzdHJ1Y3QgaXB3X2NvdW50cnlfY2hhbm5lbF9pbmZvIGdyb3Vwc1s3XTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X2NoYW5uZWxfdHhfcG93ZXIKLXsKK3N0cnVjdCBpcHdfY2hhbm5lbF90eF9wb3dlciB7CiAJdTggY2hhbm5lbF9udW1iZXI7CiAJczggdHhfcG93ZXI7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKQEAgLTg1MiwxNSArODEyLDEzIEBACiAjZGVmaW5lIE1BWF9BX0NIQU5ORUxTICAzNwogI2RlZmluZSBNQVhfQl9DSEFOTkVMUyAgMTQKIAotc3RydWN0IGlwd190eF9wb3dlcgoteworc3RydWN0IGlwd190eF9wb3dlciB7CiAJdTggbnVtX2NoYW5uZWxzOwogCXU4IGllZWVfbW9kZTsKIAlzdHJ1Y3QgaXB3X2NoYW5uZWxfdHhfcG93ZXIgY2hhbm5lbHNfdHhfcG93ZXJbTUFYX0FfQ0hBTk5FTFNdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBpcHdfcW9zX3BhcmFtZXRlcnMKLXsKK3N0cnVjdCBpcHdfcW9zX3BhcmFtZXRlcnMgewogCXUxNiBjd19taW5bNF07CiAJdTE2IGN3X21heFs0XTsKIAl1OCBhaWZzWzRdOwpAQCAtODY4LDE1ICs4MjYsMTMgQEAKIAl1MTYgdHhfb3BfbGltaXRbNF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IGlwd19yc25fY2FwYWJpbGl0aWVzCi17CitzdHJ1Y3QgaXB3X3Jzbl9jYXBhYmlsaXRpZXMgewogCXU4IGlkOwogCXU4IGxlbmd0aDsKIAl1MTYgdmVyc2lvbjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgaXB3X3NlbnNpdGl2aXR5X2NhbGliCi17CitzdHJ1Y3QgaXB3X3NlbnNpdGl2aXR5X2NhbGliIHsKIAl1MTYgYmVhY29uX3Jzc2lfcmF3OwogCXUxNiByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwpAQCAtODk1LDEwICs4NTEsMTEgQEAKICAqIC0gXGEgcGFyYW0gZmlsbGVkIHdpdGggc3RhdHVzIHBhcmFtZXRlcnMuCiAgKi8KIHN0cnVjdCBpcHdfY21kIHsKLSAgdTMyIGNtZDsgICAgICAgICAvKio8IEhvc3QgY29tbWFuZCAqLwotICB1MzIgc3RhdHVzOyAgICAgIC8qKjwgU3RhdHVzICovCi0gIHUzMiBzdGF0dXNfbGVuOyAgLyoqPCBIb3cgbWFueSAzMiBiaXQgcGFyYW1ldGVycyBpbiB0aGUgc3RhdHVzICovCi0gIHUzMiBsZW47ICAgICAgICAgLyoqPCBpbmNvbWluZyBwYXJhbWV0ZXJzIGxlbmd0aCwgYnl0ZXMgKi8KKwl1MzIgY21kOyAgIC8qKjwgSG9zdCBjb21tYW5kICovCisJdTMyIHN0YXR1czsvKio8IFN0YXR1cyAqLworCXUzMiBzdGF0dXNfbGVuOworCQkgICAvKio8IEhvdyBtYW55IDMyIGJpdCBwYXJhbWV0ZXJzIGluIHRoZSBzdGF0dXMgKi8KKwl1MzIgbGVuOyAgIC8qKjwgaW5jb21pbmcgcGFyYW1ldGVycyBsZW5ndGgsIGJ5dGVzICovCiAgIC8qKgogICAgKiBjb21tYW5kIHBhcmFtZXRlcnMuCiAgICAqIFRoZXJlIHNob3VsZCBiZSBlbm91Z2ggc3BhY2UgZm9yIGluY29taW5nIGFuZApAQCAtOTA2LDEwICs4NjMsMTAgQEAKICAgICogSW5jb21pbmcgcGFyYW1ldGVycyBsaXN0ZWQgMS1zdCwgZm9sbG93ZWQgYnkgb3V0Y29taW5nIHBhcmFtcy4KICAgICogblBhcmFtcz0obGVuKzMpLzQrc3RhdHVzX2xlbgogICAgKi8KLSAgdTMyIHBhcmFtWzBdOworCXUzMiBwYXJhbVswXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi0jZGVmaW5lIFNUQVRVU19IQ01EX0FDVElWRSAgICAgICgxPDwwKSAgLyoqPCBob3N0IGNvbW1hbmQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgU1RBVFVTX0hDTURfQUNUSVZFICAgICAgKDE8PDApCS8qKjwgaG9zdCBjb21tYW5kIGluIHByb2dyZXNzICovCiAKICNkZWZpbmUgU1RBVFVTX0lOVF9FTkFCTEVEICAgICAgKDE8PDEpCiAjZGVmaW5lIFNUQVRVU19SRl9LSUxMX0hXICAgICAgICgxPDwyKQpAQCAtOTMyLDE1ICs4ODksMTUgQEAKICNkZWZpbmUgU1RBVFVTX1NDQU5OSU5HICAgICAgICAgKDE8PDIxKQogI2RlZmluZSBTVEFUVVNfU0NBTl9BQk9SVElORyAgICAoMTw8MjIpCiAKLSNkZWZpbmUgU1RBVFVTX0lORElSRUNUX0JZVEUgICAgKDE8PDI4KSAvKiBzeXNmcyBlbnRyeSBjb25maWd1cmVkIGZvciBhY2Nlc3MgKi8KLSNkZWZpbmUgU1RBVFVTX0lORElSRUNUX0RXT1JEICAgKDE8PDI5KSAvKiBzeXNmcyBlbnRyeSBjb25maWd1cmVkIGZvciBhY2Nlc3MgKi8KLSNkZWZpbmUgU1RBVFVTX0RJUkVDVF9EV09SRCAgICAgKDE8PDMwKSAvKiBzeXNmcyBlbnRyeSBjb25maWd1cmVkIGZvciBhY2Nlc3MgKi8KKyNkZWZpbmUgU1RBVFVTX0lORElSRUNUX0JZVEUgICAgKDE8PDI4KQkvKiBzeXNmcyBlbnRyeSBjb25maWd1cmVkIGZvciBhY2Nlc3MgKi8KKyNkZWZpbmUgU1RBVFVTX0lORElSRUNUX0RXT1JEICAgKDE8PDI5KQkvKiBzeXNmcyBlbnRyeSBjb25maWd1cmVkIGZvciBhY2Nlc3MgKi8KKyNkZWZpbmUgU1RBVFVTX0RJUkVDVF9EV09SRCAgICAgKDE8PDMwKQkvKiBzeXNmcyBlbnRyeSBjb25maWd1cmVkIGZvciBhY2Nlc3MgKi8KIAotI2RlZmluZSBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRCAoMTw8MzEpIC8qIFNlY3VyaXR5IHN5bmMgbmVlZGVkICovCisjZGVmaW5lIFNUQVRVU19TRUNVUklUWV9VUERBVEVEICgxPDwzMSkJLyogU2VjdXJpdHkgc3luYyBuZWVkZWQgKi8KIAotI2RlZmluZSBDRkdfU1RBVElDX0NIQU5ORUwgICAgICAoMTw8MCkgLyogUmVzdHJpY3QgYXNzb2MuIHRvIHNpbmdsZSBjaGFubmVsICovCi0jZGVmaW5lIENGR19TVEFUSUNfRVNTSUQgICAgICAgICgxPDwxKSAvKiBSZXN0cmljdCBhc3NvYy4gdG8gc2luZ2xlIFNTSUQgKi8KLSNkZWZpbmUgQ0ZHX1NUQVRJQ19CU1NJRCAgICAgICAgKDE8PDIpIC8qIFJlc3RyaWN0IGFzc29jLiB0byBzaW5nbGUgQlNTSUQgKi8KKyNkZWZpbmUgQ0ZHX1NUQVRJQ19DSEFOTkVMICAgICAgKDE8PDApCS8qIFJlc3RyaWN0IGFzc29jLiB0byBzaW5nbGUgY2hhbm5lbCAqLworI2RlZmluZSBDRkdfU1RBVElDX0VTU0lEICAgICAgICAoMTw8MSkJLyogUmVzdHJpY3QgYXNzb2MuIHRvIHNpbmdsZSBTU0lEICovCisjZGVmaW5lIENGR19TVEFUSUNfQlNTSUQgICAgICAgICgxPDwyKQkvKiBSZXN0cmljdCBhc3NvYy4gdG8gc2luZ2xlIEJTU0lEICovCiAjZGVmaW5lIENGR19DVVNUT01fTUFDICAgICAgICAgICgxPDwzKQogI2RlZmluZSBDRkdfUFJFQU1CTEUgICAgICAgICAgICAoMTw8NCkKICNkZWZpbmUgQ0ZHX0FESE9DX1BFUlNJU1QgICAgICAgKDE8PDUpCkBAIC05NDgsOCArOTA1LDggQEAKICNkZWZpbmUgQ0ZHX0ZJWEVEX1JBVEUgICAgICAgICAgKDE8PDcpCiAjZGVmaW5lIENGR19BREhPQ19DUkVBVEUgICAgICAgICgxPDw4KQogCi0jZGVmaW5lIENBUF9TSEFSRURfS0VZICAgICAgICAgICgxPDwwKSAvKiBPZmYgPSBPUEVOICovCi0jZGVmaW5lIENBUF9QUklWQUNZX09OICAgICAgICAgICgxPDwxKSAvKiBPZmYgPSBObyBwcml2YWN5ICovCisjZGVmaW5lIENBUF9TSEFSRURfS0VZICAgICAgICAgICgxPDwwKQkvKiBPZmYgPSBPUEVOICovCisjZGVmaW5lIENBUF9QUklWQUNZX09OICAgICAgICAgICgxPDwxKQkvKiBPZmYgPSBObyBwcml2YWN5ICovCiAKICNkZWZpbmUgTUFYX1NUQVRJT05TICAgICAgICAgICAgMzIKICNkZWZpbmUgSVBXX0lOVkFMSURfU1RBVElPTiAgICAgKDB4ZmYpCkBAIC05ODksOCArOTQ2LDggQEAKIAkvKiByZXN1bHQgb2YgdWNvZGUgZG93bmxvYWQgKi8KIAlzdHJ1Y3QgYWxpdmVfY29tbWFuZF9yZXNwb25jZSBkaW5vX2FsaXZlOwogCi0gIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2NvbW1hbmRfcXVldWU7Ci0gIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3N0YXRlOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfY29tbWFuZF9xdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3N0YXRlOwogCiAJLyogUnggYW5kIFR4IERNQSBwcm9jZXNzaW5nIHF1ZXVlcyAqLwogCXN0cnVjdCBpcHdfcnhfcXVldWUgKnJ4cTsKQEAgLTEwMDYsOSArOTYzLDkgQEAKIAlzdHJ1Y3QgYXZlcmFnZSBhdmVyYWdlX3Jzc2k7CiAJc3RydWN0IGF2ZXJhZ2UgYXZlcmFnZV9ub2lzZTsKIAl1MzIgcG9ydF90eXBlOwotCWludCByeF9idWZzX21pbjsgICAgICAgICAgLyoqPCBtaW5pbXVtIG51bWJlciBvZiBidWZzIGluIFJ4IHF1ZXVlICovCi0JaW50IHJ4X3BlbmRfbWF4OyAgICAgICAgICAvKio8IG1heGltdW0gcGVuZGluZyBidWZmZXJzIGZvciBvbmUgSVJRICovCi0JdTMyIGhjbWRfc2VxOyAgICAgICAgICAgICAvKio8IHNlcXVlbmNlIG51bWJlciBmb3IgaGNtZCAqLworCWludCByeF9idWZzX21pbjsJICAvKio8IG1pbmltdW0gbnVtYmVyIG9mIGJ1ZnMgaW4gUnggcXVldWUgKi8KKwlpbnQgcnhfcGVuZF9tYXg7CSAgLyoqPCBtYXhpbXVtIHBlbmRpbmcgYnVmZmVycyBmb3Igb25lIElSUSAqLworCXUzMiBoY21kX3NlcTsJCSAgLyoqPCBzZXF1ZW5jZSBudW1iZXIgZm9yIGhjbWQgKi8KIAl1MzIgbWlzc2VkX2JlYWNvbl90aHJlc2hvbGQ7CiAJdTMyIHJvYW1pbmdfdGhyZXNob2xkOwogCkBAIC0xMDE3LDE3ICs5NzQsMTcgQEAKIAogCXVuc2lnbmVkIGxvbmcgdHNfc2Nhbl9hYm9ydDsKIAlzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyByYXRlczsKLQlzdHJ1Y3QgaXB3X3JhdGVzIHBoeVszXTsgICAgICAgICAgIC8qKjwgUEhZIHJlc3RyaWN0aW9ucywgcGVyIGJhbmQgKi8KLQlzdHJ1Y3QgaXB3X3JhdGVzIHN1cHA7ICAgICAgICAgICAgIC8qKjwgc29mdHdhcmUgZGVmaW5lZCAqLwotCXN0cnVjdCBpcHdfcmF0ZXMgZXh0ZW5kZWQ7ICAgICAgICAgLyoqPCB1c2UgZm9yIGNvcnJlc3AuIElFLCBBUCBvbmx5ICovCisJc3RydWN0IGlwd19yYXRlcyBwaHlbM107CSAgIC8qKjwgUEhZIHJlc3RyaWN0aW9ucywgcGVyIGJhbmQgKi8KKwlzdHJ1Y3QgaXB3X3JhdGVzIHN1cHA7CQkgICAvKio8IHNvZnR3YXJlIGRlZmluZWQgKi8KKwlzdHJ1Y3QgaXB3X3JhdGVzIGV4dGVuZGVkOwkgICAvKio8IHVzZSBmb3IgY29ycmVzcC4gSUUsIEFQIG9ubHkgKi8KIAogCXN0cnVjdCBub3RpZl9saW5rX2RldGVyaW9yYXRpb24gbGFzdF9saW5rX2RldGVyaW9yYXRpb247IC8qKiBmb3Igc3RhdGlzdGljcyAqLwotCXN0cnVjdCBpcHdfY21kKiBoY21kOyAvKio8IGhvc3QgY29tbWFuZCBjdXJyZW50bHkgZXhlY3V0ZWQgKi8KKwlzdHJ1Y3QgaXB3X2NtZCAqaGNtZDsgLyoqPCBob3N0IGNvbW1hbmQgY3VycmVudGx5IGV4ZWN1dGVkICovCiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBoY21kX3dxOyAgICAgLyoqPCBob3N0IGNvbW1hbmQgd2FpdHMgZm9yIGV4ZWN1dGlvbiAqLwotCXUzMiB0c2ZfYmNuWzJdOyAgICAgICAgICAgICAgLyoqPCBUU0YgZnJvbSBsYXRlc3QgYmVhY29uICovCisJdTMyIHRzZl9iY25bMl07CQkgICAgIC8qKjwgVFNGIGZyb20gbGF0ZXN0IGJlYWNvbiAqLwogCi0Jc3RydWN0IG5vdGlmX2NhbGlicmF0aW9uIGNhbGliOyAvKio8IGxhc3QgY2FsaWJyYXRpb24gKi8KKwlzdHJ1Y3Qgbm90aWZfY2FsaWJyYXRpb24gY2FsaWI7CS8qKjwgbGFzdCBjYWxpYnJhdGlvbiAqLwogCiAJLyogb3JkaW5hbCBpbnRlcmZhY2Ugd2l0aCBmaXJtd2FyZSAqLwogCXUzMiB0YWJsZTBfYWRkcjsKQEAgLTEwNjcsOCArMTAyNCw4IEBACiAJdTMyIHR4X3BhY2tldHM7CiAJdTMyIHF1YWxpdHk7CiAKLSAgICAgICAgLyogZWVwcm9tICovCi0JdTggZWVwcm9tWzB4MTAwXTsgIC8qIDI1NiBieXRlcyBvZiBlZXByb20gKi8KKwkvKiBlZXByb20gKi8KKwl1OCBlZXByb21bMHgxMDBdOwkvKiAyNTYgYnl0ZXMgb2YgZWVwcm9tICovCiAJaW50IGVlcHJvbV9kZWxheTsKIAogCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKQEAgLTEwOTEsNyArMTA0OCw2IEBACiAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3Rhc2tsZXQ7CiAKLQogI2RlZmluZSBJUFdfMjIwMEJHICAxCiAjZGVmaW5lIElQV18yOTE1QUJHIDIKIAl1OCBhZGFwdGVyOwpAQCAtMTExNCw3ICsxMDcwLDYgQEAKIAl1MzIgaW5kaXJlY3RfYnl0ZTsKIH07CQkJCS8qaXB3X3ByaXYgKi8KIAotCiAvKiBkZWJ1ZyBtYWNyb3MgKi8KIAogI2lmZGVmIENPTkZJR19JUFdfREVCVUcKQEAgLTExNzAsNyArMTEyNSw2IEBACiAjZGVmaW5lIElQV19ETF9SRl9LSUxMICAgICAgICgxPDwxNykKICNkZWZpbmUgSVBXX0RMX0ZXX0VSUk9SUyAgICAgKDE8PDE4KQogCi0KICNkZWZpbmUgSVBXX0RMX09SRCAgICAgICAgICAgKDE8PDIwKQogCiAjZGVmaW5lIElQV19ETF9GUkFHICAgICAgICAgICgxPDwyMSkKQEAgLTExODQsNyArMTEzOCw2IEBACiAKICNkZWZpbmUgSVBXX0RMX1NUQVRTICAgICAgICAgKDE8PDI5KQogCi0KICNkZWZpbmUgSVBXX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAiIGYsICMjIGEpCiAjZGVmaW5lIElQV19XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogIiBmLCAjIyBhKQogI2RlZmluZSBJUFdfREVCVUdfSU5GTyhmLCBhLi4uKSAgICBJUFdfREVCVUcoSVBXX0RMX0lORk8sIGYsICMjIGEpCkBAIC0xMjUzLDEyICsxMjA2LDEyIEBACiAvKgogICogUkVTRVQgUmVnaXN0ZXIgQml0IEluZGV4ZXMKICAqLwotI2RlZmluZSBDQkRfUkVTRVRfUkVHX1BSSU5DRVRPTl9SRVNFVCAweDAwMDAwMDAxICAvKiBCaXQgMCAoTFNCKSAqLwotI2RlZmluZSBDWDJfUkVTRVRfUkVHX1NXX1JFU0VUICAgICAgICAweDAwMDAwMDgwICAvKiBCaXQgNyAgICAgICAqLwotI2RlZmluZSBDWDJfUkVTRVRfUkVHX01BU1RFUl9ESVNBQkxFRCAweDAwMDAwMTAwICAvKiBCaXQgOCAgICAgICAqLwotI2RlZmluZSBDWDJfUkVTRVRfUkVHX1NUT1BfTUFTVEVSICAgICAweDAwMDAwMjAwICAvKiBCaXQgOSAgICAgICAqLwotI2RlZmluZSBDWDJfQVJDX0tFU0hFVF9DT05GSUcgICAgICAgICAweDA4MDAwMDAwICAvKiBCaXQgMjcgICAgICAqLwotI2RlZmluZSBDWDJfU1RBUlRfU1RBTkRCWSAgICAgICAgICAgICAweDAwMDAwMDA0ICAvKiBCaXQgMiAgICAgICAqLworI2RlZmluZSBDQkRfUkVTRVRfUkVHX1BSSU5DRVRPTl9SRVNFVCAweDAwMDAwMDAxCS8qIEJpdCAwIChMU0IpICovCisjZGVmaW5lIENYMl9SRVNFVF9SRUdfU1dfUkVTRVQgICAgICAgIDB4MDAwMDAwODAJLyogQml0IDcgICAgICAgKi8KKyNkZWZpbmUgQ1gyX1JFU0VUX1JFR19NQVNURVJfRElTQUJMRUQgMHgwMDAwMDEwMAkvKiBCaXQgOCAgICAgICAqLworI2RlZmluZSBDWDJfUkVTRVRfUkVHX1NUT1BfTUFTVEVSICAgICAweDAwMDAwMjAwCS8qIEJpdCA5ICAgICAgICovCisjZGVmaW5lIENYMl9BUkNfS0VTSEVUX0NPTkZJRyAgICAgICAgIDB4MDgwMDAwMDAJLyogQml0IDI3ICAgICAgKi8KKyNkZWZpbmUgQ1gyX1NUQVJUX1NUQU5EQlkgICAgICAgICAgICAgMHgwMDAwMDAwNAkvKiBCaXQgMiAgICAgICAqLwogCiAjZGVmaW5lIENYMl9DU1JfQ0lTX1VQUEVSX0JPVU5ECTB4MDAwMDAyMDAKICNkZWZpbmUgQ1gyX0RPTUFJTl8wX0VORCAweDEwMDAKQEAgLTEyODksMTQgKzEyNDIsMTIgQEAKICNkZWZpbmUgQ0JfU1JDX1NJWkVfTE9ORyAgMHgwMDIwMDAwMAogI2RlZmluZSBDQl9ERVNUX1NJWkVfTE9ORyAweDAwMDIwMDAwCiAKLQogLyogRE1BIERFRklORVMgKi8KIAogI2RlZmluZSBETUFfQ09OVFJPTF9TTUFMTF9DQl9DT05TVF9WQUxVRSAweDAwNTQwMDAwCiAjZGVmaW5lIERNQV9DQl9TVE9QX0FORF9BQk9SVCAgICAgICAgICAgIDB4MDAwMDBDMDAKICNkZWZpbmUgRE1BX0NCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAogCi0KICNkZWZpbmUgQ1gyX1NIQVJFRF9TUkFNX1NJWkUgICAgICAgICAgICAgICAweDAwMDMwMDAwCiAjZGVmaW5lIENYMl9TSEFSRURfU1JBTV9ETUFfQ09OVFJPTCAgICAgICAgMHgwMDAyNzAwMAogI2RlZmluZSBDQl9NQVhfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgIDB4MUZGRgpAQCAtMTMwNCw3ICsxMjU1LDYgQEAKICNkZWZpbmUgQ1gyX0hPU1RfRUVQUk9NX0RBVEFfU1JBTV9TSVpFIDB4QTE4CiAjZGVmaW5lIENYMl9FRVBST01fSU1BR0VfU0laRSAgICAgICAgICAweDEwMAogCi0KIC8qIERNQSBkZWZzICovCiAjZGVmaW5lIENYMl9ETUFfSV9DVVJSRU5UX0NCICAweDAwMzAwMEQwCiAjZGVmaW5lIENYMl9ETUFfT19DVVJSRU5UX0NCICAweDAwMzAwMEQ0CkBAIC0xMzU2LDcgKzEzMDYsNiBAQAogI2RlZmluZSBJUFdfV0hPX0lTX0FXQUtFICAgICAgICAgICAgIChDWDJfU0hBUkVEX0xPV0VSX0JPVU5EICsgMHhCMTQpCiAjZGVmaW5lIElQV19EVVJJTkdfQVRJTV9XSU5ET1cgICAgICAgKENYMl9TSEFSRURfTE9XRVJfQk9VTkQgKyAweEIxOCkKIAotCiAjZGVmaW5lIE1TQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBMU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgV09SRF9UT19CWVRFKF93b3JkKSAgICAgICAgICAgICAoKF93b3JkKSAqIHNpemVvZih1MTYpKQpAQCAtMTM2NSwxNiArMTMxNCwxNiBAQAogICAgICggV09SRF9UT19CWVRFKF93b3Jkb2Zmc2V0KSArIChfYnl0ZW9mZnNldCkgKQogCiAvKiBFRVBST00gYWNjZXNzIGJ5IEJZVEUgKi8KLSNkZWZpbmUgRUVQUk9NX1BNRV9DQVBBQklMSVRZICAgKEdFVF9FRVBST01fQUREUigweDA5LE1TQikpICAgICAvKiAxIGJ5dGUgICAqLwotI2RlZmluZSBFRVBST01fTUFDX0FERFJFU1MgICAgICAoR0VUX0VFUFJPTV9BRERSKDB4MjEsTFNCKSkgICAgIC8qIDYgYnl0ZSAgICovCi0jZGVmaW5lIEVFUFJPTV9WRVJTSU9OICAgICAgICAgIChHRVRfRUVQUk9NX0FERFIoMHgyNCxNU0IpKSAgICAgLyogMSBieXRlICAgKi8KLSNkZWZpbmUgRUVQUk9NX05JQ19UWVBFICAgICAgICAgKEdFVF9FRVBST01fQUREUigweDI1LExTQikpICAgICAvKiAxIGJ5dGUgICAqLwotI2RlZmluZSBFRVBST01fU0tVX0NBUEFCSUxJVFkgICAoR0VUX0VFUFJPTV9BRERSKDB4MjUsTVNCKSkgICAgIC8qIDEgYnl0ZSAgICovCi0jZGVmaW5lIEVFUFJPTV9DT1VOVFJZX0NPREUgICAgIChHRVRfRUVQUk9NX0FERFIoMHgyNixMU0IpKSAgICAgLyogMyBieXRlcyAgKi8KLSNkZWZpbmUgRUVQUk9NX0lCU1NfQ0hBTk5FTFNfQkcgKEdFVF9FRVBST01fQUREUigweDI4LExTQikpICAgICAvKiAyIGJ5dGVzICAqLwotI2RlZmluZSBFRVBST01fSUJTU19DSEFOTkVMU19BICAoR0VUX0VFUFJPTV9BRERSKDB4MjksTVNCKSkgICAgIC8qIDUgYnl0ZXMgICovCi0jZGVmaW5lIEVFUFJPTV9CU1NfQ0hBTk5FTFNfQkcgIChHRVRfRUVQUk9NX0FERFIoMHgyYyxMU0IpKSAgICAgLyogMiBieXRlcyAgKi8KLSNkZWZpbmUgRUVQUk9NX0hXX1ZFUlNJT04gICAgICAgKEdFVF9FRVBST01fQUREUigweDcyLExTQikpICAgICAvKiAyIGJ5dGVzICAqLworI2RlZmluZSBFRVBST01fUE1FX0NBUEFCSUxJVFkgICAoR0VUX0VFUFJPTV9BRERSKDB4MDksTVNCKSkJLyogMSBieXRlICAgKi8KKyNkZWZpbmUgRUVQUk9NX01BQ19BRERSRVNTICAgICAgKEdFVF9FRVBST01fQUREUigweDIxLExTQikpCS8qIDYgYnl0ZSAgICovCisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OICAgICAgICAgIChHRVRfRUVQUk9NX0FERFIoMHgyNCxNU0IpKQkvKiAxIGJ5dGUgICAqLworI2RlZmluZSBFRVBST01fTklDX1RZUEUgICAgICAgICAoR0VUX0VFUFJPTV9BRERSKDB4MjUsTFNCKSkJLyogMSBieXRlICAgKi8KKyNkZWZpbmUgRUVQUk9NX1NLVV9DQVBBQklMSVRZICAgKEdFVF9FRVBST01fQUREUigweDI1LE1TQikpCS8qIDEgYnl0ZSAgICovCisjZGVmaW5lIEVFUFJPTV9DT1VOVFJZX0NPREUgICAgIChHRVRfRUVQUk9NX0FERFIoMHgyNixMU0IpKQkvKiAzIGJ5dGVzICAqLworI2RlZmluZSBFRVBST01fSUJTU19DSEFOTkVMU19CRyAoR0VUX0VFUFJPTV9BRERSKDB4MjgsTFNCKSkJLyogMiBieXRlcyAgKi8KKyNkZWZpbmUgRUVQUk9NX0lCU1NfQ0hBTk5FTFNfQSAgKEdFVF9FRVBST01fQUREUigweDI5LE1TQikpCS8qIDUgYnl0ZXMgICovCisjZGVmaW5lIEVFUFJPTV9CU1NfQ0hBTk5FTFNfQkcgIChHRVRfRUVQUk9NX0FERFIoMHgyYyxMU0IpKQkvKiAyIGJ5dGVzICAqLworI2RlZmluZSBFRVBST01fSFdfVkVSU0lPTiAgICAgICAoR0VUX0VFUFJPTV9BRERSKDB4NzIsTFNCKSkJLyogMiBieXRlcyAgKi8KIAogLyogTklDIHR5cGUgYXMgZm91bmQgaW4gdGhlIG9uZSBieXRlIEVFUFJPTV9OSUNfVFlQRSAgb2Zmc2V0Ki8KICNkZWZpbmUgRUVQUk9NX05JQ19UWVBFX1NUQU5EQVJEICAgICAgICAwCkBAIC0xNDc5LDcgKzE0MjgsNiBAQAogI2RlZmluZSBJUFdfUkFURV9DQVBBQklMSVRJRVMgMQogI2RlZmluZSBJUFdfUkFURV9DT05ORUNUICAgICAgMAogCi0KIC8qCiAgKiBSYXRlIHZhbHVlcyBhbmQgbWFza3MKICAqLwpAQCAtMTUyNCwxMiArMTQ3Miw2IEBACiAJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0JfMTEsCiAJLyogSG9sZSAqLwogCi0KLQotCi0KLQotCiAJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0dfMSA9IElQV19PUkRfVEFCTEVfMF9NQVNLICsgMTksCiAJSVBXX09SRF9TVEFUX1RYX0RJUl9EQVRBX0dfMiwKIAlJUFdfT1JEX1NUQVRfVFhfRElSX0RBVEFfR181XzUsCkBAIC0xNTQ5LDEyICsxNDkxLDYgQEAKIAlJUFdfT1JEX1NUQVRfVFhfTk9OX0RJUl9EQVRBX0JfMTEsCiAJLyogSG9sZSAqLwogCi0KLQotCi0KLQotCiAJSVBXX09SRF9TVEFUX1RYX05PTl9ESVJfREFUQV9HXzEgPSBJUFdfT1JEX1RBQkxFXzBfTUFTSyArIDQ0LAogCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEFfR18yLAogCUlQV19PUkRfU1RBVF9UWF9OT05fRElSX0RBVEFfR181XzUsCkBAIC0xNjg1LDcgKzE2MjEsNyBAQAogI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfV01FX09WRVJfQlQgICAgICAgICAgMHgwOAogI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfT09CICAgICAgICAgICAgICAgICAgMHgxMAogI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfTUFYICAgICAgICAgICAgICAgICAgMHhGRgotI2RlZmluZSBDRkdfQlRfQ09FWElTVEVOQ0VfREVGICAgICAgICAgICAgICAgICAgMHg4MCAvKiByZWFkIEJ0IGZyb20gRUVQUk9NKi8KKyNkZWZpbmUgQ0ZHX0JUX0NPRVhJU1RFTkNFX0RFRiAgICAgICAgICAgICAgICAgIDB4ODAJLyogcmVhZCBCdCBmcm9tIEVFUFJPTSAqLwogCiAjZGVmaW5lIENGR19DVFNfVE9fSVRTRUxGX0VOQUJMRURfTUlOCTB4MAogI2RlZmluZSBDRkdfQ1RTX1RPX0lUU0VMRl9FTkFCTEVEX01BWAkweDEKQEAgLTE3MjcsMTEgKzE2NjMsMTEgQEAKIAlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKIAogCS8qCi0JICogRnVuY3Rpb24JVG9EUwlGcm9tRFMKLQkgKiBJQlNTCQkwCTAKLQkgKiBUbyBBUAkxCTAKLQkgKiBGcm9tIEFQCTAJMQotCSAqIFdEUyAoYnJpZGdlKQkxCTEKKwkgKiBGdW5jdGlvbiAgICAgVG9EUyAgICBGcm9tRFMKKwkgKiBJQlNTICAgICAgICAgMCAgICAgICAwCisJICogVG8gQVAgICAgICAgIDEgICAgICAgMAorCSAqIEZyb20gQVAgICAgICAwICAgICAgIDEKKwkgKiBXRFMgKGJyaWRnZSkgMSAgICAgICAxCiAJICoKIAkgKiBPbmx5IFdEUyBmcmFtZXMgdXNlIEFkZHJlc3M0IGFtb25nIHRoZW0uIC0tWVoKIAkgKi8KQEAgLTE3NDEsNCArMTY3Nyw0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotI2VuZGlmIC8qIF9faXB3MjIwMF9oX18gKi8KKyNlbmRpZgkJCQkvKiBfX2lwdzIyMDBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKaW5kZXggNWY1MDdjNC4uY2E2YzAzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwpAQCAtNDcxLDEyICs0NzEsMTIgQEAKICAgICBkZXYtPmdldF9zdGF0cyAgPSAmbmV0d2F2ZV9nZXRfc3RhdHM7CiAgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwogICAgIC8qIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBXSVJFTEVTU19FWFQKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTYKICAgICBkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9ICZuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPD0gMTYgKi8KICNpZiBXSVJFTEVTU19FWFQgPiAxMgogICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJm5ldHdhdmVfaGFuZGxlcl9kZWY7CiAjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KICAgICBkZXYtPmRvX2lvY3RsID0gJm5ldHdhdmVfaW9jdGw7CiAKICAgICBkZXYtPnR4X3RpbWVvdXQgPSAmbmV0d2F2ZV93YXRjaGRvZzsKQEAgLTgzOSw2ICs4MzksOSBAQAogCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIG5ldHdhdmVfaGFuZGxlciwKIAkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIG5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyLAogCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBuZXR3YXZlX3ByaXZhdGVfYXJncywKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLwogfTsKICNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCAwZjI5YTljLi45YTg3OTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTI3MjcsNiArMjcyNyw5IEBACiAJLnN0YW5kYXJkID0gKGl3X2hhbmRsZXIgKikgcHJpc201NF9oYW5kbGVyLAogCS5wcml2YXRlID0gKGl3X2hhbmRsZXIgKikgcHJpc201NF9wcml2YXRlX2hhbmRsZXIsCiAJLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXNtNTRfcHJpdmF0ZV9hcmdzLAorI2lmIFdJUkVMRVNTX0VYVCA+IDE2CisJLmdldF93aXJlbGVzc19zdGF0cyA9IHByaXNtNTRfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCiAjaWYgV0lSRUxFU1NfRVhUID09IDE2CiAJLnNweV9vZmZzZXQgPSBvZmZzZXRvZihpc2xwY2lfcHJpdmF0ZSwgc3B5X2RhdGEpLAogI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA9PSAxNiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwppbmRleCBlZmFiMDdlLi42ZjEzZDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwpAQCAtODE1LDcgKzgxNSw2IEBACiAJbmRldi0+b3BlbiA9ICZpc2xwY2lfb3BlbjsKIAluZGV2LT5zdG9wID0gJmlzbHBjaV9jbG9zZTsKIAluZGV2LT5nZXRfc3RhdHMgPSAmaXNscGNpX3N0YXRpc3RpY3M7Ci0JbmRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gJnByaXNtNTRfZ2V0X3dpcmVsZXNzX3N0YXRzOwogCW5kZXYtPmRvX2lvY3RsID0gJnByaXNtNTRfaW9jdGw7CiAJbmRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPQogCSAgICAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZwcmlzbTU0X2hhbmRsZXJfZGVmOwpAQCAtODQ0LDYgKzg0Myw4IEBACiAJLyogQWRkIHBvaW50ZXJzIHRvIGVuYWJsZSBpd3NweSBzdXBwb3J0LiAqLwogCXByaXYtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmcHJpdi0+c3B5X2RhdGE7CiAJbmRldi0+d2lyZWxlc3NfZGF0YSA9ICZwcml2LT53aXJlbGVzc19kYXRhOworI2Vsc2UgIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCisJbmRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gJnByaXNtNTRfZ2V0X3dpcmVsZXNzX3N0YXRzOwogI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCiAKIAkvKiBzYXZlIHRoZSBzdGFydCBhbmQgZW5kIGFkZHJlc3Mgb2YgdGhlIFBDSSBtZW1vcnkgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwppbmRleCAwZTBiYTYxLi5lOWM1ZWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9tZW1fb3AuaD4KIAorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC02NCw3ICs2NSw2IEBACiAjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogRW5hYmxlIHNweWluZyBhZGRyZXNzZXMgKi8KIC8qIERlZmluaXRpb25zIHdlIG5lZWQgZm9yIHNweSAqLwogdHlwZWRlZiBzdHJ1Y3QgaXdfc3RhdGlzdGljcwlpd19zdGF0czsKLXR5cGVkZWYgc3RydWN0IGl3X3F1YWxpdHkJaXdfcXVhbDsKIHR5cGVkZWYgdV9jaGFyCW1hY19hZGRyW0VUSF9BTEVOXTsJLyogSGFyZHdhcmUgYWRkcmVzcyAqLwogCiAjaW5jbHVkZSAicmF5Y3RsLmgiCkBAIC0xMDEsNyArMTAxLDYgQEAKIHN0YXRpYyBpbnQgcmF5X2Rldl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyYXlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCByYXlfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHJheV9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKIApAQCAtMTE0LDkgKzExMyw4IEBACiBzdGF0aWMgdm9pZCByYXlfYnVpbGRfaGVhZGVyKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LCBVQ0hBUiBtc2dfdHlwZSwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhKTsKIHN0YXRpYyB2b2lkIHVudHJhbnNsYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pOwotI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KIHN0YXRpYyBpd19zdGF0cyAqIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpOwotI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJcmF5X2hhbmRsZXJfZGVmOwogCiAvKioqKiogUHJvdG90eXBlcyBmb3IgcmF5bGluayBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IGFzY190b19pbnQoY2hhciBhKTsKQEAgLTM3MywxMSArMzcxLDEyIEBACiAgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmcmF5X2Rldl9zdGFydF94bWl0OwogICAgIGRldi0+c2V0X2NvbmZpZyA9ICZyYXlfZGV2X2NvbmZpZzsKICAgICBkZXYtPmdldF9zdGF0cyAgPSAmcmF5X2dldF9zdGF0czsKLSAgICBkZXYtPmRvX2lvY3RsID0gJnJheV9kZXZfaW9jdGw7CiAgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7Ci0jaWYgV0lSRUxFU1NfRVhUID4gNwkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLwotICAgIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcmF5X2dldF93aXJlbGVzc19zdGF0czsKLSNlbmRpZgorICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcmF5X2hhbmRsZXJfZGVmOworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgIGxvY2FsLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmxvY2FsLT5zcHlfZGF0YTsKKyAgICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbG9jYWwtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCiAKICAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CiAKQEAgLTEyMDEsNDM2ICsxMjAwLDQyMCBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotc3RhdGljIGludCByYXlfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcHJvdG9jb2wgbmFtZQorICovCitzdGF0aWMgaW50IHJheV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCWNoYXIgKmN3cnEsCisJCQljaGFyICpleHRyYSkKIHsKLSAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKLSAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKLSAgICBpbnQgZXJyID0gMDsKLSNpZiBXSVJFTEVTU19FWFQgPiA3Ci0gICAgc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKLSNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCi0jaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgc3RydWN0IHNvY2thZGRyCWFkZHJlc3NbSVdfTUFYX1NQWV07Ci0jZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCisJc3RyY3B5KGN3cnEsICJJRUVFIDgwMi4xMS1GSCIpOworCXJldHVybiAwOworfQogCi0gICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKLSAgICAgICAgREVCVUcoMiwicmF5X2Rldl9pb2N0bCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgREVCVUcoMiwicmF5X2NzIElPQ1RMIGRldj0lcCwgaWZyPSVwLCBjbWQgPSAweCV4XG4iLGRldixpZnIsY21kKTsKLSAgICAvKiBWYWxpZGF0ZSB0aGUgY29tbWFuZCAqLwotICAgIHN3aXRjaCAoY21kKQotICAgIHsKLSNpZiBXSVJFTEVTU19FWFQgPiA3Ci0gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVhURU5TSU9OUyAtLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIC8qIEdldCBuYW1lICovCi0gICAgY2FzZSBTSU9DR0lXTkFNRToKLSAgICAgIHN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLUZIIik7Ci0gICAgICBicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHJheV9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisJaW50IGVyciA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KIAotICAgICAgLyogR2V0IGZyZXF1ZW5jeS9jaGFubmVsICovCi0gICAgY2FzZSBTSU9DR0lXRlJFUToKLSAgICAgIHdycS0+dS5mcmVxLm0gPSBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfcGF0dGVybjsKLSAgICAgIHdycS0+dS5mcmVxLmUgPSAwOwotICAgICAgYnJlYWs7CisJLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworCWlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCQlyZXR1cm4gLUVCVVNZOwogCi0gICAgICAvKiBTZXQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KLSAgICBjYXNlIFNJT0NTSVdGUkVROgotICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLwotICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCi0JewotCSAgZXJyID0gLUVCVVNZOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCi0gICAgICBpZiAoKHdycS0+dS5mcmVxLm0gPiBVU0FfSE9QX01PRCkgfHwgKHdycS0+dS5mcmVxLmUgPiAwKSkKLQllcnIgPSAtRU9QTk9UU1VQUDsKLSAgICAgIGVsc2UKLQkgIGxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuID0gd3JxLT51LmZyZXEubTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBHZXQgY3VycmVudCBuZXR3b3JrIG5hbWUgKEVTU0lEKSAqLwotICAgIGNhc2UgU0lPQ0dJV0VTU0lEOgotICAgICAgaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCi0JewotCSAgY2hhciBlc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOwotCSAgLyogR2V0IHRoZSBlc3NpZCB0aGF0IHdhcyBzZXQgKi8KLQkgIG1lbWNweShlc3NpZCwgbG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWQsCi0JCSBJV19FU1NJRF9NQVhfU0laRSk7Ci0JICBlc3NpZFtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOwotCi0JICAvKiBQdXNoIGl0IG91dCAhICovCi0JICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oZXNzaWQpICsgMTsKLQkgIHdycS0+dS5kYXRhLmZsYWdzID0gMTsgLyogYWN0aXZlICovCi0JICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGVzc2lkLCBzaXplb2YoZXNzaWQpKSkKLQkJICBlcnIgPSAtRUZBVUxUOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBTZXQgZGVzaXJlZCBuZXR3b3JrIG5hbWUgKEVTU0lEKSAqLwotICAgIGNhc2UgU0lPQ1NJV0VTU0lEOgotICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLwotICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCi0JewotCSAgZXJyID0gLUVCVVNZOwotCSAgYnJlYWs7Ci0JfQotCi0JaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCi0JewotCSAgICBjaGFyCWNhcmRfZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKLQkgICAgCi0JICAgIC8qIENoZWNrIGlmIHdlIGFza2VkIGZvciBgYW55JyAqLwotCSAgICBpZih3cnEtPnUuZGF0YS5mbGFncyA9PSAwKQotCSAgICB7Ci0JCS8qIENvcmV5IDogY2FuIHlvdSBkbyB0aGF0ID8gKi8KKwkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCisJaWYgKChmd3JxLT5tID4gVVNBX0hPUF9NT0QpIHx8IChmd3JxLT5lID4gMCkpCiAJCWVyciA9IC1FT1BOT1RTVVBQOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgeworCWVsc2UKKwkJbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm4gPSBmd3JxLT5tOworCisJcmV0dXJuIGVycjsKK30KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHJheV9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisKKwlmd3JxLT5tID0gbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm47CisJZndycS0+ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEVTU0lECisgKi8KK3N0YXRpYyBpbnQgcmF5X3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisJLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworCWlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJaWYoZHdycS0+ZmxhZ3MgPT0gMCkgeworCQkvKiBDb3JleSA6IGNhbiB5b3UgZG8gdGhhdCA/ICovCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgewogCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCi0JCWlmKHdycS0+dS5kYXRhLmxlbmd0aCA+Ci0JCSAgIElXX0VTU0lEX01BWF9TSVpFICsgMSkKLQkJewotCQkgICAgZXJyID0gLUUyQklHOwotCQkgICAgYnJlYWs7CisJCWlmKGR3cnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFICsgMSkgeworCQkJcmV0dXJuIC1FMkJJRzsKIAkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY2FyZF9lc3NpZCwKLQkJCQkgICB3cnEtPnUuZGF0YS5wb2ludGVyLAotCQkJCSAgIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQljYXJkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CiAKIAkJLyogU2V0IHRoZSBFU1NJRCBpbiB0aGUgY2FyZCAqLwotCQltZW1jcHkobG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWQsIGNhcmRfZXNzaWQsCi0JCSAgICAgICBJV19FU1NJRF9NQVhfU0laRSk7Ci0JICAgIH0KKwkJbWVtc2V0KGxvY2FsLT5zcGFybS5iNS5hX2N1cnJlbnRfZXNzX2lkLCAwLCBJV19FU1NJRF9NQVhfU0laRSk7CisJCW1lbWNweShsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CiAJfQotCWJyZWFrOwogCi0gICAgICAvKiBHZXQgY3VycmVudCBBY2Nlc3MgUG9pbnQgKEJTU0lEIGluIG91ciBjYXNlKSAqLwotICAgIGNhc2UgU0lPQ0dJV0FQOgotICAgICAgbWVtY3B5KHdycS0+dS5hcF9hZGRyLnNhX2RhdGEsIGxvY2FsLT5ic3NfaWQsIEVUSF9BTEVOKTsKLSAgICAgIHdycS0+dS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLSAgICAgIGJyZWFrOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CiAKLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCBiaXQtcmF0ZSAqLwotICAgIGNhc2UgU0lPQ0dJV1JBVEU6Ci0gICAgICBpZihsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9PSAzKQotCXdycS0+dS5iaXRyYXRlLnZhbHVlID0gMjAwMDAwMDsJCS8qIEh1bS4uLiAqLwotICAgICAgZWxzZQotCXdycS0+dS5iaXRyYXRlLnZhbHVlID0gbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgKiA1MDAwMDA7Ci0gICAgICB3cnEtPnUuYml0cmF0ZS5maXhlZCA9IDA7CQkvKiBXZSBhcmUgaW4gYXV0byBtb2RlICovCi0gICAgICBicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEVTU0lECisgKi8KK3N0YXRpYyBpbnQgcmF5X2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OwogCi0gICAgICAvKiBTZXQgdGhlIGRlc2lyZWQgYml0LXJhdGUgKi8KLSAgICBjYXNlIFNJT0NTSVdSQVRFOgotICAgICAgLyogQ2hlY2sgaWYgcmF0ZSBpcyBpbiByYW5nZSAqLwotICAgICAgaWYoKHdycS0+dS5iaXRyYXRlLnZhbHVlICE9IDEwMDAwMDApICYmCi0JICh3cnEtPnUuYml0cmF0ZS52YWx1ZSAhPSAyMDAwMDAwKSkKLQl7Ci0JICBlcnIgPSAtRUlOVkFMOwotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogSGFjayBmb3IgMS41IE1iL3MgaW5zdGVhZCBvZiAyIE1iL3MgKi8KLSAgICAgIGlmKChsb2NhbC0+ZndfdmVyID09IDB4NTUpICYmCQkvKiBQbGVhc2UgY2hlY2sgKi8KLQkgKHdycS0+dS5iaXRyYXRlLnZhbHVlID09IDIwMDAwMDApKQotCWxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID0gMzsKLSAgICAgIGVsc2UKLQlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IHdycS0+dS5iaXRyYXRlLnZhbHVlLzUwMDAwMDsKLSAgICAgIGJyZWFrOworCS8qIEdldCB0aGUgZXNzaWQgdGhhdCB3YXMgc2V0ICovCisJbWVtY3B5KGV4dHJhLCBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCWV4dHJhW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CiAKLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCBSVFMgdGhyZXNob2xkICovCi0gICAgY2FzZSBTSU9DR0lXUlRTOgotICAgICAgd3JxLT51LnJ0cy52YWx1ZSA9IChsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzBdIDw8IDgpCi0JKyBsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzFdOwotI2lmIFdJUkVMRVNTX0VYVCA+IDgKLSAgICAgIHdycS0+dS5ydHMuZGlzYWJsZWQgPSAod3JxLT51LnJ0cy52YWx1ZSA9PSAzMjc2Nyk7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLwotICAgICAgd3JxLT51LnJ0cy5maXhlZCA9IDE7Ci0gICAgICBicmVhazsKKwkvKiBQdXNoIGl0IG91dCAhICovCisJZHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisJZHdycS0+ZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KIAotICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIFJUUyB0aHJlc2hvbGQgKi8KLSAgICBjYXNlIFNJT0NTSVdSVFM6Ci0gICAgewotCWludCBydGhyID0gd3JxLT51LnJ0cy52YWx1ZTsKKwlyZXR1cm4gMDsKK30KIAotICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLwotICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCi0JewotCSAgZXJyID0gLUVCVVNZOwotCSAgYnJlYWs7Ci0JfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQVAgYWRkcmVzcworICovCitzdGF0aWMgaW50IHJheV9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNvY2thZGRyICphd3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisKKwltZW1jcHkoYXdycS0+c2FfZGF0YSwgbG9jYWwtPmJzc19pZCwgRVRIX0FMRU4pOworCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBCaXQtUmF0ZQorICovCitzdGF0aWMgaW50IHJheV9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisJLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworCWlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQ2hlY2sgaWYgcmF0ZSBpcyBpbiByYW5nZSAqLworCWlmKCh2d3JxLT52YWx1ZSAhPSAxMDAwMDAwKSAmJiAodndycS0+dmFsdWUgIT0gMjAwMDAwMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSGFjayBmb3IgMS41IE1iL3MgaW5zdGVhZCBvZiAyIE1iL3MgKi8KKwlpZigobG9jYWwtPmZ3X3ZlciA9PSAweDU1KSAmJgkJLyogUGxlYXNlIGNoZWNrICovCisJICAgKHZ3cnEtPnZhbHVlID09IDIwMDAwMDApKQorCQlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IDM7CisJZWxzZQorCQlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IHZ3cnEtPnZhbHVlLzUwMDAwMDsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBCaXQtUmF0ZQorICovCitzdGF0aWMgaW50IHJheV9nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisJaWYobG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPT0gMykKKwkJdndycS0+dmFsdWUgPSAyMDAwMDAwOwkJLyogSHVtLi4uICovCisJZWxzZQorCQl2d3JxLT52YWx1ZSA9IGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlICogNTAwMDAwOworCXZ3cnEtPmZpeGVkID0gMDsJCS8qIFdlIGFyZSBpbiBhdXRvIG1vZGUgKi8KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBSVFMgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgcmF5X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCSAgICAgICBjaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKwlpbnQgcnRociA9IHZ3cnEtPnZhbHVlOworCisJLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworCWlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCQlyZXR1cm4gLUVCVVNZOwogCiAJLyogaWYod3JxLT51LnJ0cy5maXhlZCA9PSAwKSB3ZSBzaG91bGQgY29tcGxhaW4gKi8KLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0JaWYod3JxLT51LnJ0cy5kaXNhYmxlZCkKLQkgICAgcnRociA9IDMyNzY3OwotCWVsc2UKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0JICAgIGlmKChydGhyIDwgMCkgfHwgKHJ0aHIgPiAyMzQ3KSkgLyogV2hhdCdzIHRoZSBtYXggcGFja2V0IHNpemUgPz8/ICovCi0JICAgIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JICAgIH0KKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJcnRociA9IDMyNzY3OworCWVsc2UgeworCQlpZigocnRociA8IDApIHx8IChydGhyID4gMjM0NykpIC8qIFdoYXQncyB0aGUgbWF4IHBhY2tldCBzaXplID8/PyAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWxvY2FsLT5zcGFybS5iNS5hX3J0c190aHJlc2hvbGRbMF0gPSAocnRociA+PiA4KSAmIDB4RkY7CiAJbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFsxXSA9IHJ0aHIgJiAweEZGOwotICAgIH0KLSAgICBicmVhazsKIAotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCi0gICAgY2FzZSBTSU9DR0lXRlJBRzoKLSAgICAgIHdycS0+dS5mcmFnLnZhbHVlID0gKGxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzBdIDw8IDgpCi0JKyBsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFsxXTsKLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0gICAgICB3cnEtPnUuZnJhZy5kaXNhYmxlZCA9ICh3cnEtPnUuZnJhZy52YWx1ZSA9PSAzMjc2Nyk7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLwotICAgICAgd3JxLT51LmZyYWcuZml4ZWQgPSAxOwotICAgICAgYnJlYWs7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KIAotICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCi0gICAgY2FzZSBTSU9DU0lXRlJBRzoKLSAgICB7Ci0JaW50IGZ0aHIgPSB3cnEtPnUuZnJhZy52YWx1ZTsKIAotICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLwotICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCi0JewotCSAgZXJyID0gLUVCVVNZOwotCSAgYnJlYWs7Ci0JfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgUlRTIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHJheV9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkgICAgICAgY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisKKwl2d3JxLT52YWx1ZSA9IChsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzBdIDw8IDgpCisJCSsgbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFsxXTsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA9PSAzMjc2Nyk7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEZyYWdtZW50YXRpb24gdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgcmF5X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisJaW50IGZ0aHIgPSB2d3JxLT52YWx1ZTsKKworCS8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKwlpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIGlmKHdycS0+dS5mcmFnLmZpeGVkID09IDApIHNob3VsZCBjb21wbGFpbiAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDgKLQlpZih3cnEtPnUuZnJhZy5kaXNhYmxlZCkKLQkgICAgZnRociA9IDMyNzY3OwotCWVsc2UKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0JICAgIGlmKChmdGhyIDwgMjU2KSB8fCAoZnRociA+IDIzNDcpKSAvKiBUbyBjaGVjayBvdXQgISAqLwotCSAgICB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCSAgICB9CisJaWYodndycS0+ZGlzYWJsZWQpCisJCWZ0aHIgPSAzMjc2NzsKKwllbHNlIHsKKwkJaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjM0NykpIC8qIFRvIGNoZWNrIG91dCAhICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJbG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMF0gPSAoZnRociA+PiA4KSAmIDB4RkY7CiAJbG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMV0gPSBmdGhyICYgMHhGRjsKLSAgICB9Ci0gICAgYnJlYWs7CiAKLSNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCi0jaWYgV0lSRUxFU1NfRVhUID4gOAorCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CiAKLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiAqLwotICAgIGNhc2UgU0lPQ0dJV01PREU6Ci0gICAgICBpZihsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUpCi0Jd3JxLT51Lm1vZGUgPSBJV19NT0RFX0lORlJBOwotICAgICAgZWxzZQotCXdycS0+dS5tb2RlID0gSVdfTU9ERV9BREhPQzsKLSAgICAgIGJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgRnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCByYXlfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKIAotICAgICAgLyogU2V0IHRoZSBjdXJyZW50IG1vZGUgb2Ygb3BlcmF0aW9uICovCi0gICAgY2FzZSBTSU9DU0lXTU9ERToKLSAgICB7CisJdndycS0+dmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMF0gPDwgOCkKKwkJKyBsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFsxXTsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA9PSAzMjc2Nyk7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE1vZGUgb2YgT3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgcmF5X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJX191MzIgKnV3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKwlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogCWNoYXIgY2FyZF9tb2RlID0gMTsKLQkKLSAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KLSAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQotCXsKLQkgIGVyciA9IC1FQlVTWTsKLQkgIGJyZWFrOwotCX0KIAotCXN3aXRjaCAod3JxLT51Lm1vZGUpCisJLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworCWlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoICgqdXdycSkKIAl7CiAJY2FzZSBJV19NT0RFX0FESE9DOgotCSAgICBjYXJkX21vZGUgPSAwOwotCSAgICAvLyBGYWxsIHRocm91Z2gKKwkJY2FyZF9tb2RlID0gMDsKKwkJLy8gRmFsbCB0aHJvdWdoCiAJY2FzZSBJV19NT0RFX0lORlJBOgotCSAgICBsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPSBjYXJkX21vZGU7Ci0JICAgIGJyZWFrOworCQlsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPSBjYXJkX21vZGU7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JICAgIGVyciA9IC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CiAJfQotICAgIH0KLSAgICBicmVhazsKIAotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KLSNpZiBXSVJFTEVTU19FWFQgPiA3Ci0gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gSVdTUFkgU1VQUE9SVCAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIC8qIERlZmluZSB0aGUgcmFuZ2UgKHZhcmlhdGlvbnMpIG9mIGFib3ZlIHBhcmFtZXRlcnMgKi8KLSAgICBjYXNlIFNJT0NHSVdSQU5HRToKLSAgICAgIC8qIEJhc2ljIGNoZWNraW5nLi4uICovCi0gICAgICBpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKQotCXsKLQkgIHN0cnVjdCBpd19yYW5nZQlyYW5nZTsKLQkgIG1lbXNldCgoY2hhciAqKSAmcmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKwlyZXR1cm4gZXJyOworfQogCi0JICAvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCi0JICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE1vZGUgb2YgT3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgcmF5X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJX191MzIgKnV3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlyYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDEwCi0JICAvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLwotCSAgcmFuZ2Uud2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQkgIHJhbmdlLndlX3ZlcnNpb25fc291cmNlID0gOTsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLworCWlmKGxvY2FsLT5zcGFybS5iNS5hX25ldHdvcmtfdHlwZSkKKwkJKnV3cnEgPSBJV19NT0RFX0lORlJBOworCWVsc2UKKwkJKnV3cnEgPSBJV19NT0RFX0FESE9DOwogCi0JICAvKiBTZXQgaW5mb3JtYXRpb24gaW4gdGhlIHJhbmdlIHN0cnVjdCAqLwotCSAgcmFuZ2UudGhyb3VnaHB1dCA9IDEuMSAqIDEwMDAgKiAxMDAwOwkvKiBQdXQgdGhlIHJpZ2h0IG51bWJlciBoZXJlICovCi0JICByYW5nZS5udW1fY2hhbm5lbHMgPSBob3BfcGF0dGVybl9sZW5ndGhbKGludCljb3VudHJ5XTsgCi0JICByYW5nZS5udW1fZnJlcXVlbmN5ID0gMDsKLQkgIHJhbmdlLm1heF9xdWFsLnF1YWwgPSAwOwotCSAgcmFuZ2UubWF4X3F1YWwubGV2ZWwgPSAyNTU7CS8qIFdoYXQncyB0aGUgY29ycmVjdCB2YWx1ZSA/ICovCi0JICByYW5nZS5tYXhfcXVhbC5ub2lzZSA9IDI1NTsJLyogSWRlbSAqLwotCSAgcmFuZ2UubnVtX2JpdHJhdGVzID0gMjsKLQkgIHJhbmdlLmJpdHJhdGVbMF0gPSAxMDAwMDAwOwkvKiAxIE1iL3MgKi8KLQkgIHJhbmdlLmJpdHJhdGVbMV0gPSAyMDAwMDAwOwkvKiAyIE1iL3MgKi8KKwlyZXR1cm4gMDsKK30KIAotCSAgLyogQ29weSBzdHJ1Y3R1cmUgdG8gdGhlIHVzZXIgYnVmZmVyICovCi0JICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnJhbmdlLAotCQkJICBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSkpCi0JICAgIGVyciA9IC1FRkFVTFQ7Ci0JfQotICAgICAgYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCByYW5nZSBpbmZvCisgKi8KK3N0YXRpYyBpbnQgcmF5X2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOwogCi0jaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgICAvKiBTZXQgYWRkcmVzc2VzIHRvIHNweSAqLwotICAgIGNhc2UgU0lPQ1NJV1NQWToKLSAgICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCi0gICAgICBpZih3cnEtPnUuZGF0YS5sZW5ndGggPiBJV19NQVhfU1BZKQotCXsKLQkgIGVyciA9IC1FMkJJRzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGxvY2FsLT5zcHlfbnVtYmVyID0gd3JxLT51LmRhdGEubGVuZ3RoOworCW1lbXNldCgoY2hhciAqKSByYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOwogCi0gICAgICAvKiBJZiB0aGVyZSBpcyBzb21lIGFkZHJlc3NlcyB0byBjb3B5ICovCi0gICAgICBpZihsb2NhbC0+c3B5X251bWJlciA+IDApCi0JewotCSAgaW50CQkJaTsKKwkvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisJZHdycS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CiAKLQkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBkcml2ZXIgKi8KLQkgIGlmKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHdycS0+dS5kYXRhLnBvaW50ZXIsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCi0JICAgIHsKLQkgICAgICBlcnIgPSAtRUZBVUxUOwotCSAgICAgIGJyZWFrOwotCSAgICB9CisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSA5OwogCi0JICAvKiBDb3B5IGFkZHJlc3NlcyB0byB0aGUgbHAgc3RydWN0dXJlICovCi0JICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQotCSAgICBtZW1jcHkobG9jYWwtPnNweV9hZGRyZXNzW2ldLCBhZGRyZXNzW2ldLnNhX2RhdGEsIEVUSF9BTEVOKTsKKwkvKiBTZXQgaW5mb3JtYXRpb24gaW4gdGhlIHJhbmdlIHN0cnVjdCAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gMS4xICogMTAwMCAqIDEwMDA7CS8qIFB1dCB0aGUgcmlnaHQgbnVtYmVyIGhlcmUgKi8KKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV07IAorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMjU1OwkvKiBXaGF0J3MgdGhlIGNvcnJlY3QgdmFsdWUgPyAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDI1NTsJLyogSWRlbSAqLworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSAyOworCXJhbmdlLT5iaXRyYXRlWzBdID0gMTAwMDAwMDsJLyogMSBNYi9zICovCisJcmFuZ2UtPmJpdHJhdGVbMV0gPSAyMDAwMDAwOwkvKiAyIE1iL3MgKi8KKwlyZXR1cm4gMDsKK30KIAotCSAgLyogUmVzZXQgc3RydWN0dXJlLi4uICovCi0JICBtZW1zZXQobG9jYWwtPnNweV9zdGF0LCAweDAwLCBzaXplb2YoaXdfcXVhbCkgKiBJV19NQVhfU1BZKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBzZXQgZnJhbWluZyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgcmF5X3NldF9mcmFtaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXRyYW5zbGF0ZSA9ICooZXh0cmEpOwkvKiBTZXQgZnJhbWluZyBtb2RlICovCiAKLSNpZmRlZiBERUJVR19JT0NUTF9JTkZPCi0JICBwcmludGsoS0VSTl9ERUJVRyAiU2V0U3B5IC0gU2V0IG9mIG5ldyBhZGRyZXNzZXMgaXMgOlxuIik7Ci0JICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQotCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCi0JCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVswXSwKLQkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzFdLAotCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bMl0sCi0JCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVszXSwKLQkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzRdLAotCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bNV0pOwotI2VuZGlmCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KLQl9Ci0gICAgICBicmVhazsKKwlyZXR1cm4gMDsKK30KIAotICAgICAgLyogR2V0IHRoZSBzcHkgbGlzdCBhbmQgc3B5IHN0YXRzICovCi0gICAgY2FzZSBTSU9DR0lXU1BZOgotICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCi0gICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBsb2NhbC0+c3B5X251bWJlcjsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgZnJhbWluZyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgcmF5X2dldF9mcmFtaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCSooZXh0cmEpID0gdHJhbnNsYXRlOwogCi0gICAgICAvKiBJZiB0aGUgdXNlciB3YW50IHRvIGhhdmUgdGhlIGFkZHJlc3NlcyBiYWNrLi4uICovCi0gICAgICBpZigobG9jYWwtPnNweV9udW1iZXIgPiAwKSAmJiAod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkpCi0JewotCSAgaW50CQkJaTsKKwlyZXR1cm4gMDsKK30KIAotCSAgLyogQ29weSBhZGRyZXNzZXMgZnJvbSB0aGUgbHAgc3RydWN0dXJlICovCi0JICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQotCSAgICB7Ci0JICAgICAgbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwgbG9jYWwtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTik7Ci0JICAgICAgYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JICAgIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgY291bnRyeQorICovCitzdGF0aWMgaW50IHJheV9nZXRfY291bnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwkqKGV4dHJhKSA9IGNvdW50cnk7CiAKLQkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGFkZHJlc3MsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIGxvY2FsLT5zcHlfbnVtYmVyKSkKLQkgICAgewotCSAgICAgIGVyciA9IC1FRkFVTFQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KKwlyZXR1cm4gMDsKK30KIAotCSAgLyogQ29weSBzdGF0cyB0byB0aGUgdXNlciBidWZmZXIgKGp1c3QgYWZ0ZXIpICovCi0JICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciArCi0JCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlciksCi0JCSAgICAgICBsb2NhbC0+c3B5X3N0YXQsIHNpemVvZihpd19xdWFsKSAqIGxvY2FsLT5zcHlfbnVtYmVyKSkKLQkgICAgewotCSAgICAgIGVyciA9IC1FRkFVTFQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb21taXQgaGFuZGxlciA6IGNhbGxlZCBhZnRlciBhIGJ1bmNoIG9mIFNFVCBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgcmF5X2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAkvKiBOVUxMICovCisJCSAgICAgIHZvaWQgKnp3cnEsCQkJLyogTlVMTCAqLworCQkgICAgICBjaGFyICpleHRyYSkJCQkvKiBOVUxMICovCit7CisJcmV0dXJuIDA7Cit9CiAKLQkgIC8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MgKi8KLQkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCi0JICAgIGxvY2FsLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMHgwOwotCX0JLyogaWYocG9pbnRlciAhPSBOVUxMKSAqLwotCi0gICAgICBicmVhazsKLSNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KLQotICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgSU9DVEwgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0jaWZuZGVmIFNJT0NJV0ZJUlNUUFJJVgotI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJU0lPQ0RFVlBSSVZBVEUKLSNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KLSNkZWZpbmUgU0lPQ1NJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWCQkvKiBTZXQgZnJhbWluZyBtb2RlICovCi0jZGVmaW5lIFNJT0NHSVBGUkFNSU5HCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IGZyYW1pbmcgbW9kZSAqLwotI2RlZmluZSBTSU9DR0lQQ09VTlRSWQlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBjb3VudHJ5IGNvZGUgKi8KLSAgICBjYXNlIFNJT0NTSVBGUkFNSU5HOgotICAgICAgaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCS8qIEZvciBwcml2YXRlIElPQ1RMcywgd2UgbmVlZCB0byBjaGVjayBwZXJtaXNzaW9ucyAqLwotCXsKLQkgIGVyciA9IC1FUEVSTTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHRyYW5zbGF0ZSA9ICood3JxLT51Lm5hbWUpOwkvKiBTZXQgZnJhbWluZyBtb2RlICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIFNJT0NHSVBGUkFNSU5HOgotICAgICAgKih3cnEtPnUubmFtZSkgPSB0cmFuc2xhdGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNJT0NHSVBDT1VOVFJZOgotICAgICAgKih3cnEtPnUubmFtZSkgPSBjb3VudHJ5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU9DR0lXUFJJVjoKLSAgICAgIC8qIEV4cG9ydCBvdXIgInByaXZhdGUiIGludGVyY2FjZSAqLwotICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKLQl7Ci0JICBzdHJ1Y3QgaXdfcHJpdl9hcmdzCXByaXZbXSA9Ci0JICB7CS8qIGNtZCwJCXNldF9hcmdzLAlnZXRfYXJncywJbmFtZSAqLwotCSAgICB7IFNJT0NTSVBGUkFNSU5HLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfZnJhbWluZyIgfSwKLQkgICAgeyBTSU9DR0lQRlJBTUlORywgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2ZyYW1pbmciIH0sCi0JICAgIHsgU0lPQ0dJUENPVU5UUlksIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9jb3VudHJ5IiB9LAotCSAgfTsKLQkgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGlvY3RsIGF2YWlsYWJsZSAqLwotCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gMzsKLQkgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICh1X2NoYXIgKikgcHJpdiwKLQkJICAgICAgIHNpemVvZihwcml2KSkpCi0JICAgIGVyciA9IC1FRkFVTFQ7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLwotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERFQlVHKDAsInJheV9kZXZfaW9jdGwgY21kID0gMHgleFxuIiwgY21kKTsKLSAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfSAvKiBlbmQgcmF5X2Rldl9pb2N0bCAqLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGF0cyBoYW5kbGVyIDogcmV0dXJuIFdpcmVsZXNzIFN0YXRzCisgKi8KIHN0YXRpYyBpd19zdGF0cyAqIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCiB7CiAgIHJheV9kZXZfdCAqCWxvY2FsID0gKHJheV9kZXZfdCAqKSBkZXYtPnByaXY7CkBAIC0xNjQyLDEzICsxNjI1LDEzIEBACiAKICAgbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CiAjaWZkZWYgV0lSRUxFU1NfU1BZCi0gIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmIChsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPT0gMCkpCisgIGlmKChsb2NhbC0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApICYmIChsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPT0gMCkpCiAgICAgewogICAgICAgLyogR2V0IGl0IGZyb20gdGhlIGZpcnN0IG5vZGUgaW4gc3B5IGxpc3QgKi8KLSAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gbG9jYWwtPnNweV9zdGF0WzBdLnF1YWw7Ci0gICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubGV2ZWw7Ci0gICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubm9pc2U7Ci0gICAgICBsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IGxvY2FsLT5zcHlfc3RhdFswXS51cGRhdGVkOworICAgICAgbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBsb2NhbC0+c3B5X2RhdGEuc3B5X3N0YXRbMF0ucXVhbDsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IGxvY2FsLT5zcHlfZGF0YS5zcHlfc3RhdFswXS5sZXZlbDsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IGxvY2FsLT5zcHlfZGF0YS5zcHlfc3RhdFswXS5ub2lzZTsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gbG9jYWwtPnNweV9kYXRhLnNweV9zdGF0WzBdLnVwZGF0ZWQ7CiAgICAgfQogI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLwogCkBAIC0xNjU5LDcgKzE2NDIsNjUgQEAKIAogICByZXR1cm4gJmxvY2FsLT53c3RhdHM7CiB9IC8qIGVuZCByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzICovCi0jZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJcmF5X2hhbmRsZXJbXSA9IHsKKwlbU0lPQ1NJV0NPTU1JVC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9jb21taXQsCisJW1NJT0NHSVdOQU1FICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X25hbWUsCisJW1NJT0NTSVdGUkVRICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfc2V0X2ZyZXEsCisJW1NJT0NHSVdGUkVRICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X2ZyZXEsCisJW1NJT0NTSVdNT0RFICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfc2V0X21vZGUsCisJW1NJT0NHSVdNT0RFICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X21vZGUsCisJW1NJT0NHSVdSQU5HRSAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X3JhbmdlLAorI2lmZGVmIFdJUkVMRVNTX1NQWQorIAlbU0lPQ1NJV1NQWSAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIGl3X2hhbmRsZXJfc2V0X3NweSwKKwlbU0lPQ0dJV1NQWSAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIGl3X2hhbmRsZXJfZ2V0X3NweSwKKwlbU0lPQ1NJV1RIUlNQWS1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIGl3X2hhbmRsZXJfc2V0X3RocnNweSwKKwlbU0lPQ0dJV1RIUlNQWS1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIGl3X2hhbmRsZXJfZ2V0X3RocnNweSwKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKwlbU0lPQ0dJV0FQICAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9nZXRfd2FwLAorCVtTSU9DU0lXRVNTSUQgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X3NldF9lc3NpZCwKKwlbU0lPQ0dJV0VTU0lEIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9nZXRfZXNzaWQsCisJW1NJT0NTSVdSQVRFICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfc2V0X3JhdGUsCisJW1NJT0NHSVdSQVRFICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfZ2V0X3JhdGUsCisJW1NJT0NTSVdSVFMgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSByYXlfc2V0X3J0cywKKwlbU0lPQ0dJV1JUUyAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIHJheV9nZXRfcnRzLAorCVtTSU9DU0lXRlJBRyAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X3NldF9mcmFnLAorCVtTSU9DR0lXRlJBRyAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgcmF5X2dldF9mcmFnLAorfTsKKworI2RlZmluZSBTSU9DU0lQRlJBTUlORwlTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBmcmFtaW5nIG1vZGUgKi8KKyNkZWZpbmUgU0lPQ0dJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWICsgMQkvKiBHZXQgZnJhbWluZyBtb2RlICovCisjZGVmaW5lIFNJT0NHSVBDT1VOVFJZCVNJT0NJV0ZJUlNUUFJJViArIDMJLyogR2V0IGNvdW50cnkgY29kZSAqLworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcglyYXlfcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisJWzBdIChpd19oYW5kbGVyKSByYXlfc2V0X2ZyYW1pbmcsCisJWzFdIChpd19oYW5kbGVyKSByYXlfZ2V0X2ZyYW1pbmcsCisJWzNdIChpd19oYW5kbGVyKSByYXlfZ2V0X2NvdW50cnksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncwlyYXlfcHJpdmF0ZV9hcmdzW10gPSB7CisvKiBjbWQsCQlzZXRfYXJncywJZ2V0X2FyZ3MsCW5hbWUgKi8KK3sgU0lPQ1NJUEZSQU1JTkcsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9mcmFtaW5nIiB9LAoreyBTSU9DR0lQRlJBTUlORywgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2ZyYW1pbmciIH0sCit7IFNJT0NHSVBDT1VOVFJZLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfY291bnRyeSIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJcmF5X2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJheV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKHJheV9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihyYXlfcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gcmF5X2hhbmRsZXIsCisJLnByaXZhdGUJPSByYXlfcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSByYXlfcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogc3RhdGljIGludCByYXlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMjM5MiwyMCArMjQzMywxNSBAQAogCS8qbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gbm9uZSA/ICovCiAJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSAweDI7CiAgICAgICB9Ci0gICAgLyogTm93LCBmb3IgdGhlIGFkZHJlc3NlcyBpbiB0aGUgc3B5IGxpc3QgKi8KKyAgICAvKiBOb3csIHVwZGF0ZSB0aGUgc3B5IHN0dWZmICovCiAgICAgewotICAgICAgaW50CWk7Ci0gICAgICAvKiBMb29rIGFsbCBhZGRyZXNzZXMgKi8KLSAgICAgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCi0JLyogSWYgbWF0Y2ggKi8KLQlpZighbWVtY21wKGxpbmtzcmNhZGRyLCBsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKSkKLQkgIHsKLQkgICAgLyogVXBkYXRlIHN0YXRpc3RpY3MgKi8KLQkgICAgLypsb2NhbC0+c3B5X3N0YXRbaV0ucXVhbCA9IG5vbmUgPyAqLwotCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0ubGV2ZWwgPSBzaWdsZXY7Ci0JICAgIC8qbG9jYWwtPnNweV9zdGF0W2ldLm5vaXNlID0gbm9uZSA/ICovCi0JICAgIGxvY2FsLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMHgyOwotCSAgfQorCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwl3c3RhdHMubGV2ZWwgPSBzaWdsZXY7CisJLyogd3N0YXRzLm5vaXNlID0gbm9uZSA/ICovCisJLyogd3N0YXRzLnF1YWwgPSBub25lID8gKi8KKwl3c3RhdHMudXBkYXRlZCA9IDB4MjsKKwkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgbGlua3NyY2FkZHIsICZ3c3RhdHMpOwogICAgIH0KICNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KIH0gLyogZW5kIHJ4X2RhdGEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKaW5kZXggYzc3YWZhMS4uNDI2NjBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKQEAgLTYzLDEzICs2MywxMCBAQAogICAgIFVDSEFSIGxhc3RfcnNsOwogICAgIGludCBiZWFjb25fcnhlZDsKICAgICBzdHJ1Y3QgYmVhY29uX3J4IGxhc3RfYmNuOwotI2lmZGVmIFdJUkVMRVNTX0VYVAogICAgIGl3X3N0YXRzCXdzdGF0czsJCS8qIFdpcmVsZXNzIHNwZWNpZmljIHN0YXRzICovCi0jZW5kaWYKICNpZmRlZiBXSVJFTEVTU19TUFkKLSAgICBpbnQJCXNweV9udW1iZXI7CQkvKiBOdW1iZXIgb2YgYWRkcmVzc2VzIHRvIHNweSAqLwotICAgIG1hY19hZGRyCXNweV9hZGRyZXNzW0lXX01BWF9TUFkgKyAxXTsJLyogVGhlIGFkZHJlc3NlcyB0byBzcHkgKi8KLSAgICBpd19xdWFsCXNweV9zdGF0W0lXX01BWF9TUFkgKyAxXTsJLyogU3RhdGlzdGljcyBnYXRoZXJlZCAqLworICAgIHN0cnVjdCBpd19zcHlfZGF0YQkJc3B5X2RhdGE7CisgICAgc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CiAjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCiAKIH0gcmF5X2Rldl90OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaAppbmRleCBiNTcxOTQzLi43ZmNiZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaApAQCAtNjA5LDYgKzYwOSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgCXN0YXRzOwogCXN0cnVjdCBpd19zdGF0aXN0aWNzCQl3c3RhdHM7CiAJc3RydWN0IGl3X3NweV9kYXRhCQlzcHlfZGF0YTsKKwlzdHJ1Y3QgaXdfcHVibGljX2RhdGEJCXdpcmVsZXNzX2RhdGE7CiAJc3RydWN0IGRldl9ub2RlX3QJCW5vZGU7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCmluZGV4IDdjYzVlZGIuLjNmOGMyN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCkBAIC0xOTQ0LDcgKzE5NDQsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bDM1MDFfaGFuZGxlcl9kZWYgPSB7CiAJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3bDM1MDFfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCiAJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKil3bDM1MDFfaGFuZGxlciwKLQkuc3B5X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCB3bDM1MDFfY2FyZCwgc3B5X2RhdGEpLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzLAogfTsKIAogLyoqCkBAIC0xOTYxLDYgKzE5NjEsNyBAQAogCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOwogCWRldl9saW5rX3QgKmxpbms7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXM7CiAJaW50IHJldDsKIAogCS8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCkBAIC0xOTk1LDcgKzE5OTYsOSBAQAogCWRldi0+dHhfdGltZW91dAkJPSB3bDM1MDFfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOwogCWRldi0+Z2V0X3N0YXRzCQk9IHdsMzUwMV9nZXRfc3RhdHM7Ci0JZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzOworCXRoaXMgPSBkZXYtPnByaXY7CisJdGhpcy0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZ0aGlzLT5zcHlfZGF0YTsKKwlkZXYtPndpcmVsZXNzX2RhdGEJPSAmdGhpcy0+d2lyZWxlc3NfZGF0YTsKIAlkZXYtPndpcmVsZXNzX2hhbmRsZXJzCT0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3bDM1MDFfaGFuZGxlcl9kZWY7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jIGIvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCmluZGV4IDkxZGYwYmYuLjdhNTdjMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYworKysgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogI2RlZmluZSBJT1NBUElDX0lSRFRfSURfRUlEX1NISUZUICAgICAgICAgICAgICAweDEwCiAKIAotc3RhdGljIHNwaW5sb2NrX3QgaW9zYXBpY19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhpb3NhcGljX2xvY2spOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9zYXBpY19lb2kodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2xhc2kuYyBiL2RyaXZlcnMvcGFyaXNjL2xhc2kuYwppbmRleCA3MzE4NTUwLi5jYjg0YTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9sYXNpLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvbGFzaS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jIGIvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKaW5kZXggNjk0YmFlMS4uNWI4ODdiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQlyZXR1cm4gMTsKIAogCS8qIDQwbXMgb2Ygc2xvdyBwb2xsaW5nLiAqLwotCWRlYWRsaW5lID0gamlmZmllcyArIChIWiArIDI0KSAvIDI1OworCWRlYWRsaW5lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNDApOwogCXdoaWxlICh0aW1lX2JlZm9yZSAoamlmZmllcywgZGVhZGxpbmUpKSB7CiAJCWludCByZXQ7CiAKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCS8qIFdhaXQgZm9yIDEwbXMgKG9yIHVudGlsIGFuIGludGVycnVwdCBvY2N1cnMgaWYKIAkJICogdGhlIGhhbmRsZXIgaXMgc2V0KSAqLwotCQlpZiAoKHJldCA9IHBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgKEhaICsgOTkpIC8gMTAwKSkgPCAwKQorCQlpZiAoKHJldCA9IHBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgbXNlY3NfdG9famlmZmllcygxMCkpKSA8IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCXN0YXR1cyA9IHBhcnBvcnRfcmVhZF9zdGF0dXMgKHBvcnQpOwpAQCAtMjE2LDggKzIxNiw3IEBACiAJCQkvKiBwYXJwb3J0X3dhaXRfZXZlbnQgZGlkbid0IHRpbWUgb3V0LCBidXQgdGhlCiAJCQkgKiBwZXJpcGhlcmFsIHdhc24ndCBhY3R1YWxseSByZWFkeSBlaXRoZXIuCiAJCQkgKiBXYWl0IGZvciBhbm90aGVyIDEwbXMuICovCi0JCQlfX3NldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCAoKEhaKyA5OSkgLyAxMDApOworCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0X29wcy5jIGIvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0X29wcy5jCmluZGV4IDY2MjQyNzguLmNlMWUyYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NF9vcHMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODRfb3BzLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlwYXJwb3J0X2RhdGFfZm9yd2FyZCAocG9ydCk7CiAJd2hpbGUgKGNvdW50IDwgbGVuKSB7CiAJCXVuc2lnbmVkIGxvbmcgZXhwaXJlID0gamlmZmllcyArIGRldi0+dGltZW91dDsKLQkJbG9uZyB3YWl0ID0gKEhaICsgOTkpIC8gMTAwOworCQlsb25nIHdhaXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsKIAkJdW5zaWduZWQgY2hhciBtYXNrID0gKFBBUlBPUlRfU1RBVFVTX0VSUk9SCiAJCQkJICAgICAgfCBQQVJQT1JUX1NUQVRVU19CVVNZKTsKIAkJdW5zaWduZWQgY2hhciB2YWwgPSAoUEFSUE9SVF9TVEFUVVNfRVJST1IKQEAgLTk3LDggKzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91ciBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQuICovCiAJCQlpZiAoY291bnQgJiYgbm9faXJxKSB7CiAJCQkJcGFycG9ydF9yZWxlYXNlIChkZXYpOwotCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCAod2FpdCk7CisJCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHdhaXQpOwogCQkJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKGRldik7CiAJCQl9CiAJCQllbHNlCkBAIC01NDIsMTMgKzU0MSwxMiBAQAogCQkJLyogWWllbGQgdGhlIHBvcnQgZm9yIGEgd2hpbGUuICovCiAJCQlpZiAoY291bnQgJiYgZGV2LT5wb3J0LT5pcnEgIT0gUEFSUE9SVF9JUlFfTk9ORSkgewogCQkJCXBhcnBvcnRfcmVsZWFzZSAoZGV2KTsKLQkJCQlfX3NldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCXNjaGVkdWxlX3RpbWVvdXQgKChIWiArIDI0KSAvIDI1KTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyg0MCkpOwogCQkJCXBhcnBvcnRfY2xhaW1fb3JfYmxvY2sgKGRldik7CiAJCQl9CiAJCQllbHNlCiAJCQkJLyogV2UgbXVzdCBoYXZlIHRoZSBkZXZpY2UgY2xhaW1lZCBoZXJlLiAqLwotCQkJCXBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgKEhaICsgMjQpIC8gMjUpOworCQkJCXBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgbXNlY3NfdG9famlmZmllcyg0MCkpOwogCiAJCQkvKiBJcyB0aGVyZSBhIHNpZ25hbCBwZW5kaW5nPyAqLwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCmluZGV4IDQ1OThjNmEuLmM2NDkzYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwpAQCAtMTczLDggKzE3Myw3IEBACiAJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsIGV4cGlyZSkpCiAJCQkJCS8qIFRoZSBGSUZPIGlzIHN0dWNrLiAqLwogCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCAoKEhaICsgOTkpIC8gMTAwKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMCkpOwogCQkJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpCiAJCQkJCWJyZWFrOwogCQkJfQpAQCAtMjczOSw2ICsyNzM4LDcgQEAKIAlzeWJhXzJwX2VwcCwKIAlzeWJhXzFwX2VjcCwKIAl0aXRhbl8wMTBsLAorCXRpdGFuXzEyODRwMSwKIAl0aXRhbl8xMjg0cDIsCiAJYXZsYWJfMXAsCiAJYXZsYWJfMnAsCkBAIC0yODExLDYgKzI4MTEsNyBAQAogCS8qIHN5YmFfMnBfZXBwIEFQMTM4QiAqLwl7IDIsIHsgeyAwLCAweDA3OCB9LCB7IDAsIDB4MTc4IH0sIH0gfSwKIAkvKiBzeWJhXzFwX2VjcCBXODM3ODcgKi8JeyAxLCB7IHsgMCwgMHgwNzggfSwgfSB9LAogCS8qIHRpdGFuXzAxMGwgKi8JCXsgMSwgeyB7IDMsIC0xIH0sIH0gfSwKKwkvKiB0aXRhbl8xMjg0cDEgKi8gICAgICAgICAgICAgIHsgMSwgeyB7IDAsIDEgfSwgfSB9LAogCS8qIHRpdGFuXzEyODRwMiAqLwkJeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSwgfSB9LAogCS8qIGF2bGFiXzFwCQkqLwl7IDEsIHsgeyAwLCAxfSwgfSB9LAogCS8qIGF2bGFiXzJwCQkqLwl7IDIsIHsgeyAwLCAxfSwgeyAyLCAzIH0sfSB9LApAQCAtMjg4NCw2ICsyODg1LDcgQEAKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN5YmFfMXBfZWNwIH0sCiAJeyBQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzAxMEwsCiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB0aXRhbl8wMTBsIH0sCisJeyAweDk3MTAsIDB4OTgwNSwgMHgxMDAwLCAweDAwMTAsIDAsIDAsIHRpdGFuXzEyODRwMSB9LAogCXsgMHg5NzEwLCAweDk4MTUsIDB4MTAwMCwgMHgwMDIwLCAwLCAwLCB0aXRhbl8xMjg0cDIgfSwKIAkvKiBQQ0lfVkVORE9SX0lEX0FWTEFCL0ludGVrMjEgaGFzIGFub3RoZXIgYnVuY2ggb2YgY2FyZHMgLi4uKi8KIAl7IDB4MTRkYiwgMHgyMTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBhdmxhYl8xcH0sIC8qIEFGQVZMQUJfVEs5OTAyICovCkBAIC0zMDA3LDcgKzMwMDksNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAotCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgewogCQlpZCA9IHBjaV9tYXRjaF9pZChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoaWQgPT0gTlVMTCB8fCBpZC0+ZHJpdmVyX2RhdGEgPj0gbGFzdF9zaW8pCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IDdmMzE5OTEuLmYxODdmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMzAsMjMgKzMwLDYgQEAKIAogCSAgV2hlbiBpbiBkb3VidCwgc2F5IE4uCiAKLWNvbmZpZyBQQ0lfTkFNRVMKLQlib29sICJQQ0kgZGV2aWNlIG5hbWUgZGF0YWJhc2UiCi0JZGVwZW5kcyBvbiBQQ0kKLQktLS1oZWxwLS0tCi0JICBCeSBkZWZhdWx0LCB0aGUga2VybmVsIGNvbnRhaW5zIGEgZGF0YWJhc2Ugb2YgYWxsIGtub3duIFBDSSBkZXZpY2UKLQkgIG5hbWVzIHRvIG1ha2UgdGhlIGluZm9ybWF0aW9uIGluIC9wcm9jL3BjaSwgL3Byb2MvaW9wb3J0cyBhbmQKLQkgIHNpbWlsYXIgZmlsZXMgY29tcHJlaGVuc2libGUgdG8gdGhlIHVzZXIuIAotCi0JICBUaGlzIGRhdGFiYXNlIGluY3JlYXNlcyBzaXplIG9mIHRoZSBrZXJuZWwgaW1hZ2UgYnkgYWJvdXQgODBLQi4gVGhpcyAKLQkgIG1lbW9yeSBpcyBmcmVlZCBhZnRlciB0aGUgc3lzdGVtIGJvb3RzIHVwIGlmIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQuCi0KLQkgIEFueXdheSwgaWYgeW91IGFyZSBidWlsZGluZyBhbiBpbnN0YWxsYXRpb24gZmxvcHB5IG9yIGtlcm5lbCBmb3IgYW4gCi0JICBlbWJlZGRlZCBzeXN0ZW0gd2hlcmUga2VybmVsIGltYWdlIHNpemUgcmVhbGx5IG1hdHRlcnMsIHlvdSBjYW4gZGlzYWJsZSAKLQkgIHRoaXMgZmVhdHVyZSBhbmQgeW91J2xsIGdldCBkZXZpY2UgSUQgbnVtYmVycyBpbnN0ZWFkIG9mIG5hbWVzLgotCi0JICBXaGVuIGluIGRvdWJ0LCBzYXkgWS4KLQogY29uZmlnIFBDSV9ERUJVRwogCWJvb2wgIlBDSSBEZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBQQ0kgJiYgREVCVUdfS0VSTkVMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDM2NTdmNjEuLjcxNmRmMDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMywxNCArMyw5IEBACiAjCiAKIG9iai15CQkrPSBhY2Nlc3MubyBidXMubyBwcm9iZS5vIHJlbW92ZS5vIHBjaS5vIHF1aXJrcy5vIFwKLQkJCW5hbWVzLm8gcGNpLWRyaXZlci5vIHNlYXJjaC5vIHBjaS1zeXNmcy5vIFwKLQkJCXJvbS5vCisJCQlwY2ktZHJpdmVyLm8gc2VhcmNoLm8gcGNpLXN5c2ZzLm8gcm9tLm8gc2V0dXAtcmVzLm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKSArPSBwcm9jLm8KIAotaWZuZGVmIENPTkZJR19TUEFSQzY0Ci1vYmoteSArPSBzZXR1cC1yZXMubwotZW5kaWYKLQogb2JqLSQoQ09ORklHX0hPVFBMVUcpICs9IGhvdHBsdWcubwogCiAjIEJ1aWxkIHRoZSBQQ0kgSG90cGx1ZyBkcml2ZXJzIGlmIHdlIHdlcmUgYXNrZWQgdG8KQEAgLTQ2LDIxICs0MSw2IEBACiBFWFRSQV9DRkxBR1MgKz0gLURERUJVRwogZW5kaWYKIAotaG9zdHByb2dzLXkgOj0gZ2VuLWRldmxpc3QKLQotIyBEZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKLSQob2JqKS9uYW1lcy5vOiAkKG9iaikvZGV2bGlzdC5oICQob2JqKS9jbGFzc2xpc3QuaAotJChvYmopL2NsYXNzbGlzdC5oOiAkKG9iaikvZGV2bGlzdC5oCi0KLSMgQW5kIHRoYXQncyBob3cgdG8gZ2VuZXJhdGUgdGhlbQotcXVpZXRfY21kX2Rldmxpc3QgPSBERVZMSVNUICRACi0gICAgICBjbWRfZGV2bGlzdCA9ICggY2QgJChvYmopOyAuL2dlbi1kZXZsaXN0ICkgPCAkPAotJChvYmopL2Rldmxpc3QuaDogJChzcmMpL3BjaS5pZHMgJChvYmopL2dlbi1kZXZsaXN0Ci0JJChjYWxsIGNtZCxkZXZsaXN0KQotCi0jIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCi1jbGVhbi1maWxlcyA6PSBkZXZsaXN0LmggY2xhc3NsaXN0LmgKLQogIyBCdWlsZCBQQ0kgRXhwcmVzcyBzdHVmZiBpZiBuZWVkZWQKIG9iai0kKENPTkZJR19QQ0lFUE9SVEJVUykgKz0gcGNpZS8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCBmYjlhMTEyLi5lZWQ2N2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtMTQwLDE2ICsxNDAsNjUgQEAKIHZvaWQgcGNpX2VuYWJsZV9icmlkZ2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgcmV0dmFsOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCQlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCQkJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAkJCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJCQlwY2lfZW5hYmxlX2JyaWRnZXMoZGV2LT5zdWJvcmRpbmF0ZSk7CiAJCX0KIAl9CiB9CiAKKy8qKiBwY2lfd2Fsa19idXMgLSB3YWxrIGRldmljZXMgb24vdW5kZXIgYnVzLCBjYWxsaW5nIGNhbGxiYWNrLgorICogIEB0b3AgICAgICBidXMgd2hvc2UgZGV2aWNlcyBzaG91bGQgYmUgd2Fsa2VkCisgKiAgQGNiICAgICAgIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBkZXZpY2UgZm91bmQKKyAqICBAdXNlcmRhdGEgYXJiaXRyYXJ5IHBvaW50ZXIgdG8gYmUgcGFzc2VkIHRvIGNhbGxiYWNrLgorICoKKyAqICBXYWxrIHRoZSBnaXZlbiBidXMsIGluY2x1ZGluZyBhbnkgYnJpZGdlZCBkZXZpY2VzCisgKiAgb24gYnVzZXMgdW5kZXIgdGhpcyBidXMuICBDYWxsIHRoZSBwcm92aWRlZCBjYWxsYmFjaworICogIG9uIGVhY2ggZGV2aWNlIGZvdW5kLgorICovCit2b2lkIHBjaV93YWxrX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqdG9wLCB2b2lkICgqY2IpKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgKiksCisJCSAgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlidXMgPSB0b3A7CisJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCW5leHQgPSB0b3AtPmRldmljZXMubmV4dDsKKwlmb3IgKDs7KSB7CisJCWlmIChuZXh0ID09ICZidXMtPmRldmljZXMpIHsKKwkJCS8qIGVuZCBvZiB0aGlzIGJ1cywgZ28gdXAgb3IgZmluaXNoICovCisJCQlpZiAoYnVzID09IHRvcCkKKwkJCQlicmVhazsKKwkJCW5leHQgPSBidXMtPnNlbGYtPmJ1c19saXN0Lm5leHQ7CisJCQlidXMgPSBidXMtPnNlbGYtPmJ1czsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRldiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKKwkJcGNpX2Rldl9nZXQoZGV2KTsKKwkJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKKwkJCS8qIHRoaXMgaXMgYSBwY2ktcGNpIGJyaWRnZSwgZG8gaXRzIGRldmljZXMgbmV4dCAqLworCQkJbmV4dCA9IGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMubmV4dDsKKwkJCWJ1cyA9IGRldi0+c3Vib3JkaW5hdGU7CisJCX0gZWxzZQorCQkJbmV4dCA9IGRldi0+YnVzX2xpc3QubmV4dDsKKwkJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisKKwkJLyogUnVuIGRldmljZSByb3V0aW5lcyB3aXRoIHRoZSBidXMgdW5sb2NrZWQgKi8KKwkJY2IoZGV2LCB1c2VyZGF0YSk7CisKKwkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQlwY2lfZGV2X3B1dChkZXYpOworCX0KKwlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV93YWxrX2J1cyk7CisKIEVYUE9SVF9TWU1CT0wocGNpX2J1c19hbGxvY19yZXNvdXJjZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfYnVzX2FkZF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChwY2lfYnVzX2FkZF9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2dlbi1kZXZsaXN0LmMgYi9kcml2ZXJzL3BjaS9nZW4tZGV2bGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWJmYzQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2dlbi1kZXZsaXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqCUdlbmVyYXRlIGRldmxpc3QuaCBhbmQgY2xhc3NsaXN0LmggZnJvbSB0aGUgUENJIElEIGZpbGUuCi0gKgotICoJKGMpIDE5OTktLTIwMDIgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+Ci0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTUFYX05BTUVfU0laRSAyMDAKLQotc3RhdGljIHZvaWQKLXBxKEZJTEUgKmYsIGNvbnN0IGNoYXIgKmMsIGludCBsZW4pCi17Ci0JaW50IGkgPSAxOwotCXdoaWxlICgqYyAmJiBpICE9IGxlbikgewotCQlpZiAoKmMgPT0gJyInKQotCQkJZnByaW50ZihmLCAiXFxcIiIpOwotCQllbHNlIHsKLQkJCWZwdXRjKCpjLCBmKTsKLQkJCWlmICgqYyA9PSAnPycgJiYgY1sxXSA9PSAnPycpIHsKLQkJCQkvKiBBdm9pZCB0cmlncmFwaHMgKi8KLQkJCQlmcHJpbnRmKGYsICJcIiBcIiIpOwotCQkJfQotCQl9Ci0JCWMrKzsKLQkJaSsrOwotCX0KLX0KLQotaW50Ci1tYWluKHZvaWQpCi17Ci0JY2hhciBsaW5lWzEwMjRdLCAqYywgKmJyYSwgdmVuZFs4XTsKLQlpbnQgdmVuZG9ycyA9IDA7Ci0JaW50IG1vZGUgPSAwOwotCWludCBsaW5vID0gMDsKLQlpbnQgdmVuZG9yX2xlbiA9IDA7Ci0JRklMRSAqZGV2ZiwgKmNsc2Y7Ci0KLQlkZXZmID0gZm9wZW4oImRldmxpc3QuaCIsICJ3Iik7Ci0JY2xzZiA9IGZvcGVuKCJjbGFzc2xpc3QuaCIsICJ3Iik7Ci0JaWYgKCFkZXZmIHx8ICFjbHNmKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZSFcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLTEsIHN0ZGluKSkgewotCQlsaW5vKys7Ci0JCWlmICgoYyA9IHN0cmNocihsaW5lLCAnXG4nKSkpCi0JCQkqYyA9IDA7Ci0JCWlmICghbGluZVswXSB8fCBsaW5lWzBdID09ICcjJykKLQkJCWNvbnRpbnVlOwotCQlpZiAobGluZVsxXSA9PSAnICcpIHsKLQkJCWlmIChsaW5lWzBdID09ICdDJyAmJiBzdHJsZW4obGluZSkgPiA0ICYmIGxpbmVbNF0gPT0gJyAnKSB7Ci0JCQkJdmVuZFswXSA9IGxpbmVbMl07Ci0JCQkJdmVuZFsxXSA9IGxpbmVbM107Ci0JCQkJdmVuZFsyXSA9IDA7Ci0JCQkJbW9kZSA9IDI7Ci0JCQl9IGVsc2UgZ290byBlcnI7Ci0JCX0KLQkJZWxzZSBpZiAobGluZVswXSA9PSAnXHQnKSB7Ci0JCQlpZiAobGluZVsxXSA9PSAnXHQnKQotCQkJCWNvbnRpbnVlOwotCQkJc3dpdGNoIChtb2RlKSB7Ci0JCQljYXNlIDE6Ci0JCQkJaWYgKHN0cmxlbihsaW5lKSA+IDUgJiYgbGluZVs1XSA9PSAnICcpIHsKLQkJCQkJYyA9IGxpbmUgKyA1OwotCQkJCQl3aGlsZSAoKmMgPT0gJyAnKQotCQkJCQkJKmMrKyA9IDA7Ci0JCQkJCWlmICh2ZW5kb3JfbGVuICsgc3RybGVuKGMpICsgMSA+IE1BWF9OQU1FX1NJWkUpIHsKLQkJCQkJCS8qIFRvbyBsb25nLCB0cnkgY3V0dGluZyBvZmYgbG9uZyBkZXNjcmlwdGlvbiAqLwotCQkJCQkJYnJhID0gc3RyY2hyKGMsICdbJyk7Ci0JCQkJCQlpZiAoYnJhICYmIGJyYSA+IGMgJiYgYnJhWy0xXSA9PSAnICcpCi0JCQkJCQkJYnJhWy0xXSA9IDA7Ci0JCQkJCQlpZiAodmVuZG9yX2xlbiArIHN0cmxlbihjKSArIDEgPiBNQVhfTkFNRV9TSVpFKSB7Ci0JCQkJCQkJZnByaW50ZihzdGRlcnIsICJMaW5lICVkOiBEZXZpY2UgbmFtZSB0b28gbG9uZy4gTmFtZSB0cnVuY2F0ZWQuXG4iLCBsaW5vKTsKLQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBjKTsKLQkJCQkJCQkvKnJldHVybiAxOyovCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZnByaW50ZihkZXZmLCAiXHRERVZJQ0UoJXMsJXMsXCIiLCB2ZW5kLCBsaW5lKzEpOwotCQkJCQlwcShkZXZmLCBjLCBNQVhfTkFNRV9TSVpFIC0gdmVuZG9yX2xlbiAtIDEpOwotCQkJCQlmcHV0cygiXCIpXG4iLCBkZXZmKTsKLQkJCQl9IGVsc2UgZ290byBlcnI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJaWYgKHN0cmxlbihsaW5lKSA+IDMgJiYgbGluZVszXSA9PSAnICcpIHsKLQkJCQkJYyA9IGxpbmUgKyAzOwotCQkJCQl3aGlsZSAoKmMgPT0gJyAnKQotCQkJCQkJKmMrKyA9IDA7Ci0JCQkJCWZwcmludGYoY2xzZiwgIkNMQVNTKCVzJXMsIFwiJXNcIilcbiIsIHZlbmQsIGxpbmUrMSwgYyk7Ci0JCQkJfSBlbHNlIGdvdG8gZXJyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdHJsZW4obGluZSkgPiA0ICYmIGxpbmVbNF0gPT0gJyAnKSB7Ci0JCQljID0gbGluZSArIDQ7Ci0JCQl3aGlsZSAoKmMgPT0gJyAnKQotCQkJCSpjKysgPSAwOwotCQkJaWYgKHZlbmRvcnMpCi0JCQkJZnB1dHMoIkVORFZFTkRPUigpXG5cbiIsIGRldmYpOwotCQkJdmVuZG9ycysrOwotCQkJc3RyY3B5KHZlbmQsIGxpbmUpOwotCQkJdmVuZG9yX2xlbiA9IHN0cmxlbihjKTsKLQkJCWlmICh2ZW5kb3JfbGVuICsgMjQgPiBNQVhfTkFNRV9TSVpFKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJMaW5lICVkOiBWZW5kb3IgbmFtZSB0b28gbG9uZ1xuIiwgbGlubyk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlmcHJpbnRmKGRldmYsICJWRU5ET1IoJXMsXCIiLCB2ZW5kKTsKLQkJCXBxKGRldmYsIGMsIDApOwotCQkJZnB1dHMoIlwiKVxuIiwgZGV2Zik7Ci0JCQltb2RlID0gMTsKLQkJfSBlbHNlIHsKLQkJZXJyOgotCQkJZnByaW50ZihzdGRlcnIsICJMaW5lICVkOiBTeW50YXggZXJyb3IgaW4gbW9kZSAlZDogJXNcbiIsIGxpbm8sIG1vZGUsIGxpbmUpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JZnB1dHMoIkVORFZFTkRPUigpXG5cCi1cblwKLSN1bmRlZiBWRU5ET1JcblwKLSN1bmRlZiBERVZJQ0VcblwKLSN1bmRlZiBFTkRWRU5ET1JcbiIsIGRldmYpOwotCWZwdXRzKCJcbiN1bmRlZiBDTEFTU1xuIiwgY2xzZik7Ci0KLQlmY2xvc2UoZGV2Zik7Ci0JZmNsb3NlKGNsc2YpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnLmMKaW5kZXggYjg0NGJjOS4uMTA0NDQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcuYwpAQCAtMjAsNDYgKzIwLDM1IEBACiAKIAlzY3JhdGNoID0gYnVmZmVyOwogCi0JLyogc3R1ZmYgd2Ugd2FudCB0byBwYXNzIHRvIC9zYmluL2hvdHBsdWcgKi8KLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLCAiUENJX0NMQVNTPSUwNFgiLAotCQkJICAgIHBkZXYtPmNsYXNzKTsKLQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JKytsZW5ndGg7Ci0Jc2NyYXRjaCArPSBsZW5ndGg7CiAKLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLCAiUENJX0lEPSUwNFg6JTA0WCIsCi0JCQkgICAgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpOwotCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQotCQlyZXR1cm4gLUVOT01FTTsKLQkrK2xlbmd0aDsKLQlzY3JhdGNoICs9IGxlbmd0aDsKLQotCWVudnBbaSsrXSA9IHNjcmF0Y2g7Ci0JbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsCi0JCQkgICAgIlBDSV9TVUJTWVNfSUQ9JTA0WDolMDRYIiwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKLQkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKLQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JKytsZW5ndGg7Ci0Jc2NyYXRjaCArPSBsZW5ndGg7Ci0KLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLCAiUENJX1NMT1RfTkFNRT0lcyIsCi0JCQkgICAgcGNpX25hbWUocGRldikpOwotCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJQQ0lfQ0xBU1M9JTA0WCIsIHBkZXYtPmNsYXNzKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLAotCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKLQkJCSAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKLQkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAotCQkJICAgICh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLAotCQkJICAgICh1OCkocGRldi0+Y2xhc3MpKTsKLQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwlpZiAoYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiUENJX0lEPSUwNFg6JTA0WCIsIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiUENJX1NVQlNZU19JRD0lMDRYOiUwNFgiLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJQQ0lfU0xPVF9OQU1FPSVzIiwgcGNpX25hbWUocGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKKwkJCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKKwkJCQlwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkJCSh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLAorCQkJCSh1OCkocGRldi0+Y2xhc3MpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAllbnZwW2ldID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZwppbmRleCA5YzRhMzllLi4yZjEyODllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnCkBAIC03OCw3ICs3OCw3IEBACiAKIGNvbmZpZyBIT1RQTFVHX1BDSV9BQ1BJCiAJdHJpc3RhdGUgIkFDUEkgUENJIEhvdHBsdWcgZHJpdmVyIgotCWRlcGVuZHMgb24gQUNQSV9CVVMgJiYgSE9UUExVR19QQ0kKKwlkZXBlbmRzIG9uIEFDUEkgJiYgSE9UUExVR19QQ0kKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgUENJIEhvdHBsdWcgdXNpbmcKIAkgIEFDUEkuCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogY29uZmlnIEhPVFBMVUdfUENJX1NIUENfUEhQUk1fTEVHQUNZCiAJYm9vbCAiRm9yIEFNRCBTSFBDIG9ubHk6IFVzZSAkSFJUIGZvciByZXNvdXJjZS9jb25maWd1cmF0aW9uIgotCWRlcGVuZHMgb24gSE9UUExVR19QQ0lfU0hQQyAmJiAhQUNQSV9CVVMgCisJZGVwZW5kcyBvbiBIT1RQTFVHX1BDSV9TSFBDICYmICFBQ1BJIAogCWhlbHAKIAkgIFNheSBZIGhlcmUgZm9yIEFNRCBTSFBDLiBZb3UgaGF2ZSB0byBzZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGFyZSAKIAkgIHVzaW5nIHRoaXMgZHJpdmVyIG9uIHBsYXRmb3JtIHdpdGggQU1EIFNIUEMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCAzMWEzMDcwLi4zYzcxZTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTQxLDggKzQxLDcgQEAKIAogcnBhcGhwLW9ianMJCTo9CXJwYXBocF9jb3JlLm8JXAogCQkJCXJwYXBocF9wY2kubwlcCi0JCQkJcnBhcGhwX3Nsb3QubwlcCi0JCQkJcnBhcGhwX3Zpby5vCisJCQkJcnBhcGhwX3Nsb3QubwogCiBycGFkbHBhcl9pby1vYmpzCTo9CXJwYWRscGFyX2NvcmUubyBcCiAJCQkJcnBhZGxwYXJfc3lzZnMubwpAQCAtNTEsNyArNTAsNyBAQAogCQkJCXBjaWVocF9jdHJsLm8JXAogCQkJCXBjaWVocF9wY2kubwlcCiAJCQkJcGNpZWhwX2hwYy5vCi1pZmRlZiBDT05GSUdfQUNQSV9CVVMKK2lmZGVmIENPTkZJR19BQ1BJCiAJcGNpZWhwLW9ianMgKz0gcGNpZWhwcm1fYWNwaS5vCiBlbHNlCiAJcGNpZWhwLW9ianMgKz0gcGNpZWhwcm1fbm9uYWNwaS5vCkBAIC02Miw3ICs2MSw3IEBACiAJCQkJc2hwY2hwX3BjaS5vCVwKIAkJCQlzaHBjaHBfc3lzZnMubwlcCiAJCQkJc2hwY2hwX2hwYy5vCi1pZmRlZiBDT05GSUdfQUNQSV9CVVMKK2lmZGVmIENPTkZJR19BQ1BJCiAJc2hwY2hwLW9ianMgKz0gc2hwY2hwcm1fYWNwaS5vCiBlbHNlCiAJaWZkZWYgQ09ORklHX0hPVFBMVUdfUENJX1NIUENfUEhQUk1fTEVHQUNZCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCAyYjkyYjllLi4wNjFlYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTMwMiw3ICszMDIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9zbG90X25hbWUoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIHN0cnVjdCBzbG90ICpzbG90KQogewotCXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlZCIsIHNsb3QtPm51bWJlcik7CisJc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiUwNGRfJTA0ZCIsIHNsb3QtPmJ1cywgc2xvdC0+bnVtYmVyKTsKIH0KIAogZW51bSBwaHBfY3Rscl90eXBlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwcm1fYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKaW5kZXggMzA1YjQ3ZS4uMTQwNmRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKQEAgLTE2OTYsMTUgKzE2OTYsMTUgQEAKIAlwY2lfYnVzLT5udW1iZXIgPSBmdW5jLT5idXM7CiAJZGV2Zm4gPSBQQ0lfREVWRk4oZnVuYy0+ZGV2aWNlLCBmdW5jLT5mdW5jdGlvbik7CiAKLQlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfd29yZChwY2lfYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKKwlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfd29yZChwY2lfYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOwogCiAJaWYgKGNhcmRfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7Ci0JCXJjID0gcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBjaV9idXMsIGRldmZuLCBQQ0lfQlJJREdFX0NPTlRST0wsICZiY29tbWFuZCk7CisJCXJjID0gcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBjaV9idXMsIGRldmZuLCBQQ0lfQlJJREdFX0NPTlRST0wsICZiY21kKTsKIAl9CiAKLQljbWQgPSBjb21tYW5kICA9IGNvbW1hbmQgfCBQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCisJY29tbWFuZCAgPSBjbWQgfCBQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCiAJCXwgUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JYmNtZCA9IGJjb21tYW5kICA9IGJjb21tYW5kIHwgUENJX0JSSURHRV9DVExfTk9fSVNBOworCWJjb21tYW5kICA9IGJjbWQgfCBQQ0lfQlJJREdFX0NUTF9OT19JU0E7CiAKIAlhYiA9IGZpbmRfYWNwaV9icmlkZ2VfYnlfYnVzKGFjcGlfYnJpZGdlc19oZWFkLCBjdHJsLT5zZWcsIGN0cmwtPmJ1cyk7CiAJaWYgKGFiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCmluZGV4IDg2YjM4NGUuLmFkMTAxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCkBAIC0xOSwzMyArMTksMzYgQEAKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KICNpbmNsdWRlICIuLi9wY2kuaCIKICNpbmNsdWRlICJycGFwaHAuaCIKICNpbmNsdWRlICJycGFkbHBhci5oIgogCiBzdGF0aWMgREVDTEFSRV9NVVRFWChycGFkbHBhcl9zZW0pOwogCisjZGVmaW5lIERMUEFSX01PRFVMRV9OQU1FICJycGFkbHBhcl9pbyIKKwogI2RlZmluZSBOT0RFX1RZUEVfVklPICAxCiAjZGVmaW5lIE5PREVfVFlQRV9TTE9UIDIKICNkZWZpbmUgTk9ERV9UWVBFX1BIQiAgMwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpmaW5kX3BocF9zbG90X3Zpb19ub2RlKGNoYXIgKmRyY19uYW1lKQorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmluZF92aW9fc2xvdF9ub2RlKGNoYXIgKmRyY19uYW1lKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmRldmljZSIpOwotCWNoYXIgKmxvY19jb2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBOVUxMOworCWNoYXIgKm5hbWU7CisJaW50IHJjOwogCiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBOVUxMOwogCi0JZm9yIChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgTlVMTCk7Ci0JCWNoaWxkOyBjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgY2hpbGQpKSB7Ci0JCWxvY19jb2RlID0gZ2V0X3Byb3BlcnR5KGNoaWxkLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7Ci0JCWlmIChsb2NfY29kZSAmJiAhc3RybmNtcChsb2NfY29kZSwgZHJjX25hbWUsIHN0cmxlbihkcmNfbmFtZSkpKQotCQkJcmV0dXJuIGNoaWxkOworCXdoaWxlICgoZG4gPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIGRuKSkpIHsKKwkJcmMgPSBycGFwaHBfZ2V0X2RyY19wcm9wcyhkbiwgTlVMTCwgJm5hbWUsIE5VTEwsIE5VTEwpOworCQlpZiAoKHJjID09IDApICYmICghc3RyY21wKGRyY19uYW1lLCBuYW1lKSkpCisJCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZG47CiB9CiAKIC8qIEZpbmQgZGxwYXItY2FwYWJsZSBwY2kgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdHlwZSAqLwpAQCAtNjcsNyArNzAsNyBAQAogCXJldHVybiBucDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmluZF9uZXdseV9hZGRlZF9ub2RlKGNoYXIgKmRyY19uYW1lLCBpbnQgKm5vZGVfdHlwZSkKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfZGxwYXJfbm9kZShjaGFyICpkcmNfbmFtZSwgaW50ICpub2RlX3R5cGUpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIApAQCAtODMsNyArODYsNyBAQAogCQlyZXR1cm4gZG47CiAJfQogCi0JZG4gPSBmaW5kX3BocF9zbG90X3Zpb19ub2RlKGRyY19uYW1lKTsKKwlkbiA9IGZpbmRfdmlvX3Nsb3Rfbm9kZShkcmNfbmFtZSk7CiAJaWYgKGRuKSB7CiAJCSpub2RlX3R5cGUgPSBOT0RFX1RZUEVfVklPOwogCQlyZXR1cm4gZG47CkBAIC05MiwxNCArOTUsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbG90ICpmaW5kX3Nsb3QoY2hhciAqZHJjX25hbWUpCitzdGF0aWMgc3RydWN0IHNsb3QgKmZpbmRfc2xvdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm47CiAJc3RydWN0IHNsb3QgKnNsb3Q7CiAKICAgICAgICAgbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbiwgJnJwYXBocF9zbG90X2hlYWQpIHsKICAgICAgICAgICAgICAgICBzbG90ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbG90LCBycGFwaHBfc2xvdF9saXN0KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHNsb3QtPmxvY2F0aW9uLCBkcmNfbmFtZSkgPT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoc2xvdC0+ZG4gPT0gZG4pCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvdDsKICAgICAgICAgfQogCkBAIC0xMzEsNyArMTM0LDggQEAKIHN0YXRpYyBpbnQgcGNpX2FkZF9zZWNvbmRhcnlfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sCiAJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2KQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRuLT5waGI7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGRuLT5waGI7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCXU4IHNlY19idXNubzsKIApAQCAtMTU2LDcgKzE2MCw3IEBACiAJaWYgKGhvc2UtPmxhc3RfYnVzbm8gPCBjaGlsZC0+bnVtYmVyKQogCQlob3NlLT5sYXN0X2J1c25vID0gY2hpbGQtPm51bWJlcjsKIAotCWRuLT5idXNzdWJubyA9IGNoaWxkLT5udW1iZXI7CisJcGRuLT5idXNzdWJubyA9IGNoaWxkLT5udW1iZXI7CiAKIAkvKiBpb3JlbWFwKCkgZm9yIGNoaWxkIGJ1cywgd2hpY2ggbWF5IG9yIG1heSBub3Qgc3VjY2VlZCAqLwogCXJlbWFwX2J1c19yYW5nZShjaGlsZCk7CkBAIC0xNjQsMTMgKzE2OCwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmRscGFyX2ZpbmRfbmV3X2RldihzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldl9kbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqdG1wID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkX2RuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZwYXJlbnQtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWNoaWxkX2RuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHRtcCk7CisJCWlmIChjaGlsZF9kbiA9PSBkZXZfZG4pCisJCQlyZXR1cm4gdG1wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpkbHBhcl9wY2lfYWRkX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRuLT5waGI7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGRuLT5waGI7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CiAKIAkvKiBTY2FuIHBoYiBidXMgZm9yIEVBRFMgZGV2aWNlLCBhZGRpbmcgbmV3IG9uZSB0byBidXMtPmRldmljZXMgKi8KLQlpZiAoIXBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoaG9zZS0+YnVzLCBkbi0+ZGV2Zm4pKSB7CisJaWYgKCFwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKGhvc2UtPmJ1cywgcGRuLT5kZXZmbikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZm91bmQgbm8gZGV2aWNlIG9uIGJ1c1xuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTc5LDQ5ICsxOTgsMjggQEAKIAlwY2lfYnVzX2FkZF9kZXZpY2VzKGhvc2UtPmJ1cyk7CiAKIAkvKiBDb25maXJtIG5ldyBicmlkZ2UgZGV2IHdhcyBjcmVhdGVkICovCi0JZGV2ID0gcnBhcGhwX2ZpbmRfcGNpX2Rldihkbik7Ci0JaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFkZCBwY2kgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJZGV2ID0gZGxwYXJfZmluZF9uZXdfZGV2KGhvc2UtPmJ1cywgZG4pOworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+aGRyX3R5cGUgIT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBoZWFkZXIgdHlwZSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRldi0+aGRyX3R5cGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAotCWlmIChkZXYtPmhkcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBoZWFkZXIgdHlwZSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgZGV2LT5oZHJfdHlwZSk7Ci0JCXJldHVybiBOVUxMOworCQlpZiAocGNpX2FkZF9zZWNvbmRhcnlfYnVzKGRuLCBkZXYpKQorCQkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKHBjaV9hZGRfc2Vjb25kYXJ5X2J1cyhkbiwgZGV2KSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlyZXR1cm4gZGV2OwogfQogCi1zdGF0aWMgaW50IGRscGFyX3BjaV9yZW1vdmVfYnVzKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2KQotewotCXN0cnVjdCBwY2lfYnVzICpzZWNvbmRhcnlfYnVzOwotCi0JaWYgKCFicmlkZ2VfZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuZXhwZWN0ZWQgbnVsbCBkZXZpY2VcbiIsCi0JCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZWNvbmRhcnlfYnVzID0gYnJpZGdlX2Rldi0+c3Vib3JkaW5hdGU7Ci0KLQlpZiAodW5tYXBfYnVzX3JhbmdlKHNlY29uZGFyeV9idXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byB1bm1hcCBidXMgcmFuZ2VcbiIsCi0JCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVSQU5HRTsKLQl9Ci0KLQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoYnJpZGdlX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRscGFyX2FkZF9wY2lfc2xvdChjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKK3N0YXRpYyBpbnQgZGxwYXJfYWRkX3BjaV9zbG90KGNoYXIgKmRyY19uYW1lLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJaW50IHJjOworCisJaWYgKHJwYXBocF9maW5kX3BjaV9idXMoZG4pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEFkZCBwY2kgYnVzICovCiAJZGV2ID0gZGxwYXJfcGNpX2FkZF9idXMoZG4pOwpAQCAtMjMxLDYgKzIyOSwyMSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwlpZiAoZG4tPmNoaWxkKSB7CisJCXJjID0gcnBhcGhwX2NvbmZpZ19wY2lfYWRhcHRlcihkZXYtPnN1Ym9yZGluYXRlKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGVuYWJsZSBzbG90ICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBBZGQgaG90cGx1ZyBzbG90ICovCisJaWYgKHJwYXBocF9hZGRfc2xvdChkbikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFkZCBob3RwbHVnIHNsb3QgJXNcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRyY19uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXJldHVybiAwOwogfQogCkBAIC0yNTUsNDcgKzI2OCw2OSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRscGFyX3JlbW92ZV9waGIoc3RydWN0IHNsb3QgKnNsb3QpCitzdGF0aWMgaW50IGRscGFyX3JlbW92ZV9waGIoY2hhciAqZHJjX25hbWUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CiAJaW50IHJjID0gMDsKIAotCWRuID0gc2xvdC0+ZG47Ci0JaWYgKCFkbikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIE5VTEwgc2xvdCBkZXZpY2Ugbm9kZVxuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXJwYXBocF9maW5kX3BjaV9idXMoZG4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNsb3QgPSBmaW5kX3Nsb3QoZG4pOworCWlmIChzbG90KSB7CisJCS8qIFJlbW92ZSBob3RwbHVnIHNsb3QgKi8KKwkJaWYgKHJwYXBocF9yZW1vdmVfc2xvdChzbG90KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiB1bmFibGUgdG8gcmVtb3ZlIGhvdHBsdWcgc2xvdCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRyY19uYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJfQogCi0JcGhiID0gZG4tPnBoYjsKLQlpZiAoIXBoYikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIE5VTEwgcGhiIHBvaW50ZXJcbiIsCi0JCQkJX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKHJwYXBocF9yZW1vdmVfc2xvdChzbG90KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVtb3ZlIGhvdHBsdWcgc2xvdCAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+bG9jYXRpb24pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyYyA9IGRscGFyX3JlbW92ZV9yb290X2J1cyhwaGIpOworCXBkbiA9IGRuLT5kYXRhOworCUJVR19PTighcGRuIHx8ICFwZG4tPnBoYik7CisJcmMgPSBkbHBhcl9yZW1vdmVfcm9vdF9idXMocGRuLT5waGIpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAorCXBkbi0+cGhiID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRscGFyX2FkZF9waGIoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3N0YXRpYyBpbnQgZGxwYXJfYWRkX3BoYihjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKIAorCWlmIChQQ0lfRE4oZG4pLT5waGIpIHsKKwkJLyogUEhCIGFscmVhZHkgZXhpc3RzICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXBoYiA9IGluaXRfcGhiX2R5bmFtaWMoZG4pOwogCWlmICghcGhiKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChycGFwaHBfYWRkX3Nsb3QoZG4pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhZGQgaG90cGx1ZyBzbG90ICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbHBhcl9hZGRfdmlvX3Nsb3QoY2hhciAqZHJjX25hbWUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCit7CisJaWYgKHZpb19maW5kX25vZGUoZG4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghdmlvX3JlZ2lzdGVyX2RldmljZV9ub2RlKGRuKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIHZpbyBub2RlICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzE2LDE4ICszNTEsMTMgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKIAlpbnQgbm9kZV90eXBlOwotCWludCByYyA9IDA7CisJaW50IHJjID0gLUVJTzsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJnJwYWRscGFyX3NlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQkvKiBDaGVjayBmb3IgZXhpc3RpbmcgaG90cGx1ZyBzbG90ICovCi0JaWYgKGZpbmRfc2xvdChkcmNfbmFtZSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZG4gPSBmaW5kX25ld2x5X2FkZGVkX25vZGUoZHJjX25hbWUsICZub2RlX3R5cGUpOworCS8qIEZpbmQgbmV3bHkgYWRkZWQgbm9kZSAqLworCWRuID0gZmluZF9kbHBhcl9ub2RlKGRyY19uYW1lLCAmbm9kZV90eXBlKTsKIAlpZiAoIWRuKSB7CiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwpAQCAtMzM1LDI0ICszNjUsMTcgQEAKIAogCXN3aXRjaCAobm9kZV90eXBlKSB7CiAJCWNhc2UgTk9ERV9UWVBFX1ZJTzoKLQkJCS8qIEp1c3QgYWRkIGhvdHBsdWcgc2xvdCAqLworCQkJcmMgPSBkbHBhcl9hZGRfdmlvX3Nsb3QoZHJjX25hbWUsIGRuKTsKIAkJCWJyZWFrOwogCQljYXNlIE5PREVfVFlQRV9TTE9UOgogCQkJcmMgPSBkbHBhcl9hZGRfcGNpX3Nsb3QoZHJjX25hbWUsIGRuKTsKIAkJCWJyZWFrOwogCQljYXNlIE5PREVfVFlQRV9QSEI6Ci0JCQlyYyA9IGRscGFyX2FkZF9waGIoZG4pOworCQkJcmMgPSBkbHBhcl9hZGRfcGhiKGRyY19uYW1lLCBkbik7CiAJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiJXM6IHVuZXhwZWN0ZWQgbm9kZSB0eXBlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKCFyYyAmJiBycGFwaHBfYWRkX3Nsb3QoZG4pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhZGQgaG90cGx1ZyBzbG90ICVzXG4iLAotCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7Ci0JCXJjID0gLUVJTzsKLQl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNsb3QgJXMgYWRkZWRcbiIsIERMUEFSX01PRFVMRV9OQU1FLCBkcmNfbmFtZSk7CiBleGl0OgogCXVwKCZycGFkbHBhcl9zZW0pOwogCXJldHVybiByYzsKQEAgLTM2NiwxNyArMzg5LDE3IEBACiAgKiBvZiBhbiBJL08gU2xvdC4KICAqIFJldHVybiBDb2RlczoKICAqIDAJCQlTdWNjZXNzCi0gKiAtRUlPCQkJSW50ZXJuYWwgIEVycm9yCisgKiAtRUlOVkFMCQlWaW8gZGV2IGRvZXNuJ3QgZXhpc3QKICAqLwotaW50IGRscGFyX3JlbW92ZV92aW9fc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCwgY2hhciAqZHJjX25hbWUpCitzdGF0aWMgaW50IGRscGFyX3JlbW92ZV92aW9fc2xvdChjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKLQkvKiBSZW1vdmUgaG90cGx1ZyBzbG90ICovCisJc3RydWN0IHZpb19kZXYgKnZpb19kZXY7CiAKLQlpZiAocnBhcGhwX3JlbW92ZV9zbG90KHNsb3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZW1vdmUgaG90cGx1ZyBzbG90ICVzXG4iLAotCQkJX19GVU5DVElPTl9fLCBkcmNfbmFtZSk7Ci0JCXJldHVybiAtRUlPOwotCX0KKwl2aW9fZGV2ID0gdmlvX2ZpbmRfbm9kZShkbik7CisJaWYgKCF2aW9fZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZpb191bnJlZ2lzdGVyX2RldmljZSh2aW9fZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzkxLDMxICs0MTQsMzQgQEAKICAqIC1FTk9ERVYJCU5vdCBhIHZhbGlkIGRyY19uYW1lCiAgKiAtRUlPCQkJSW50ZXJuYWwgUENJIEVycm9yCiAgKi8KLWludCBkbHBhcl9yZW1vdmVfcGNpX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QsIGNoYXIgKmRyY19uYW1lKQoraW50IGRscGFyX3JlbW92ZV9wY2lfc2xvdChjaGFyICpkcmNfbmFtZSwgc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlX2RldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBzbG90ICpzbG90OwogCi0JYnJpZGdlX2RldiA9IHNsb3QtPmJyaWRnZTsKLQlpZiAoIWJyaWRnZV9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBudWxsIGJyaWRnZSBkZXZpY2VcbiIsCisJYnVzID0gcnBhcGhwX2ZpbmRfcGNpX2J1cyhkbik7CisJaWYgKCFidXMpCisJCXJldHVybiAtRUlOVkFMOworCisJc2xvdCA9IGZpbmRfc2xvdChkbik7CisJaWYgKHNsb3QpIHsKKwkJLyogUmVtb3ZlIGhvdHBsdWcgc2xvdCAqLworCQlpZiAocnBhcGhwX3JlbW92ZV9zbG90KHNsb3QpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IHVuYWJsZSB0byByZW1vdmUgaG90cGx1ZyBzbG90ICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlpZiAodW5tYXBfYnVzX3JhbmdlKGJ1cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIGJ1cyByYW5nZVxuIiwKIAkJCV9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKLQkvKiBSZW1vdmUgaG90cGx1ZyBzbG90ICovCi0JaWYgKHJwYXBocF9yZW1vdmVfc2xvdChzbG90KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVtb3ZlIGhvdHBsdWcgc2xvdCAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBSZW1vdmUgcGNpIGJ1cyAqLwotCi0JaWYgKGRscGFyX3BjaV9yZW1vdmVfYnVzKGJyaWRnZV9kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZW1vdmUgcGNpIGJ1cyAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgZHJjX25hbWUpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJQlVHX09OKCFidXMtPnNlbGYpOworCXBjaV9yZW1vdmVfYnVzX2RldmljZShidXMtPnNlbGYpOwogCXJldHVybiAwOwogfQogCkBAIC00MzQsMzggKzQ2MCwzMSBAQAogICovCiBpbnQgZGxwYXJfcmVtb3ZlX3Nsb3QoY2hhciAqZHJjX25hbWUpCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3Q7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlpbnQgbm9kZV90eXBlOwogCWludCByYyA9IDA7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZycGFkbHBhcl9zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JaWYgKCFmaW5kX3BocF9zbG90X3Zpb19ub2RlKGRyY19uYW1lKSAmJgotCSAgICAhZmluZF9waHBfc2xvdF9wY2lfbm9kZShkcmNfbmFtZSwgIlNMT1QiKSAmJgotCSAgICAhZmluZF9waHBfc2xvdF9wY2lfbm9kZShkcmNfbmFtZSwgIlBIQiIpKSB7CisJZG4gPSBmaW5kX2RscGFyX25vZGUoZHJjX25hbWUsICZub2RlX3R5cGUpOworCWlmICghZG4pIHsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0Jc2xvdCA9IGZpbmRfc2xvdChkcmNfbmFtZSk7Ci0JaWYgKCFzbG90KSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OworCXN3aXRjaCAobm9kZV90eXBlKSB7CisJCWNhc2UgTk9ERV9UWVBFX1ZJTzoKKwkJCXJjID0gZGxwYXJfcmVtb3ZlX3Zpb19zbG90KGRyY19uYW1lLCBkbik7CisJCQlicmVhazsKKwkJY2FzZSBOT0RFX1RZUEVfUEhCOgorCQkJcmMgPSBkbHBhcl9yZW1vdmVfcGhiKGRyY19uYW1lLCBkbik7CisJCQlicmVhazsKKwkJY2FzZSBOT0RFX1RZUEVfU0xPVDoKKwkJCXJjID0gZGxwYXJfcmVtb3ZlX3BjaV9zbG90KGRyY19uYW1lLCBkbik7CisJCQlicmVhazsKIAl9Ci0JCi0JaWYgKHNsb3QtPnR5cGUgPT0gUEhCKSB7Ci0JCXJjID0gZGxwYXJfcmVtb3ZlX3BoYihzbG90KTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKHNsb3QtPmRldl90eXBlKSB7Ci0JCQljYXNlIFBDSV9ERVY6Ci0JCQkJcmMgPSBkbHBhcl9yZW1vdmVfcGNpX3Nsb3Qoc2xvdCwgZHJjX25hbWUpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFZJT19ERVY6Ci0JCQkJcmMgPSBkbHBhcl9yZW1vdmVfdmlvX3Nsb3Qoc2xvdCwgZHJjX25hbWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBzbG90ICVzIHJlbW92ZWRcbiIsIERMUEFSX01PRFVMRV9OQU1FLCBkcmNfbmFtZSk7CiBleGl0OgogCXVwKCZycGFkbHBhcl9zZW0pOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocC5oCmluZGV4IDgxNzQ2ZTYuLjYxZDk0ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHAuaApAQCAtMzAsMTAgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogCi0jZGVmaW5lCVBIQiAgICAgMgotI2RlZmluZQlIT1RQTFVHCTEKLSNkZWZpbmUJRU1CRURERUQgMAotCiAjZGVmaW5lIERSX0lORElDQVRPUiA5MDAyCiAjZGVmaW5lIERSX0VOVElUWV9TRU5TRSA5MDAzCiAKQEAgLTYxLDEwICs1Nyw2IEBACiAjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZvcm1hdCwgTVlfTkFNRSAsICMjIGFyZykKICNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIgZm9ybWF0LCBNWV9OQU1FICwgIyMgYXJnKQogCi0vKiBzbG90IHR5cGVzICovCi0jZGVmaW5lIFZJT19ERVYJMQotI2RlZmluZSBQQ0lfREVWCTIKLQogLyogc2xvdCBzdGF0ZXMgKi8KIAogI2RlZmluZQlOT1RfVkFMSUQJMwpAQCAtNzIsMTEgKzY0LDYgQEAKICNkZWZpbmUJQ09ORklHVVJFRAkxCiAjZGVmaW5lCUVNUFRZCQkwCiAKLXN0cnVjdCBycGFwaHBfcGNpX2Z1bmMgewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgc2libGluZzsKLX07Ci0KIC8qCiAgKiBzdHJ1Y3Qgc2xvdCAtIHNsb3QgaW5mb3JtYXRpb24gZm9yIGVhY2ggKnBoeXNpY2FsKiBzbG90CiAgKi8KQEAgLTg4LDE1ICs3NSw5IEBACiAJdTMyIHBvd2VyX2RvbWFpbjsKIAljaGFyICpuYW1lOwogCWNoYXIgKmxvY2F0aW9uOwotCXU4IHJlbW92YWJsZTsKLQl1OCBkZXZfdHlwZTsJCS8qIFZJTyBvciBQQ0kgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwkvKiBzbG90J3MgZGV2aWNlX25vZGUgaW4gT0ZEVCAqLwotCQkJCS8qIGRuIGhhcyBwaGIgaW5mbyAqLwotCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CS8qIHNsb3QncyBwY2lfZGV2IGluIHBjaV9kZXZpY2VzICovCi0JdW5pb24gewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwY2lfZGV2czsgLyogcGNpX2RldnMgaW4gUENJIHNsb3QgKi8KLQkJc3RydWN0IHZpb19kZXYgKnZpb19kZXY7IC8qIHZpb19kZXYgaW4gVklPIHNsb3QgKi8KLQl9IGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IGxpc3RfaGVhZCAqcGNpX2RldnM7CiAJc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90OwogfTsKIApAQCAtMTA3LDEzICs4OCwxMyBAQAogLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogCiAvKiBycGFwaHBfcGNpLmMgKi8KLWV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqcnBhcGhwX2ZpbmRfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKK2V4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcnBhcGhwX2ZpbmRfcGNpX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIGV4dGVybiBpbnQgcnBhcGhwX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSk7CiBleHRlcm4gaW50IHJwYXBocF9lbmFibGVfcGNpX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9wY2lfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCk7CiBleHRlcm4gaW50IHJwYXBocF91bmNvbmZpZ19wY2lfYWRhcHRlcihzdHJ1Y3Qgc2xvdCAqc2xvdCk7CiBleHRlcm4gaW50IHJwYXBocF9nZXRfcGNpX2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCBpbnQgaXNfaW5pdCwgdTggKiB2YWx1ZSk7Ci1leHRlcm4gc3RydWN0IGhvdHBsdWdfc2xvdCAqcnBhcGhwX2ZpbmRfaG90cGx1Z19zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIGludCBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBycGFwaHBfY29yZS5jICovCiBleHRlcm4gaW50IHJwYXBocF9hZGRfc2xvdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKQEAgLTEyMSwxMiArMTAyLDYgQEAKIGV4dGVybiBpbnQgcnBhcGhwX2dldF9kcmNfcHJvcHMoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50ICpkcmNfaW5kZXgsCiAJCWNoYXIgKipkcmNfbmFtZSwgY2hhciAqKmRyY190eXBlLCBpbnQgKmRyY19wb3dlcl9kb21haW4pOwogCi0vKiBycGFwaHBfdmlvLmMgKi8KLWV4dGVybiBpbnQgcnBhcGhwX2dldF92aW9fYWRhcHRlcl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIGludCBpc19pbml0LCB1OCAqIHZhbHVlKTsKLWV4dGVybiBpbnQgcnBhcGhwX3VuY29uZmlnX3Zpb19hZGFwdGVyKHN0cnVjdCBzbG90ICpzbG90KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfdmlvX3Nsb3Qoc3RydWN0IGRldmljZV9ub2RlICpkbik7Ci1leHRlcm4gaW50IHJwYXBocF9lbmFibGVfdmlvX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwotCiAvKiBycGFwaHBfc2xvdC5jICovCiBleHRlcm4gdm9pZCBkZWFsbG9jX3Nsb3Rfc3RydWN0KHN0cnVjdCBzbG90ICpzbG90KTsKIGV4dGVybiBzdHJ1Y3Qgc2xvdCAqYWxsb2Nfc2xvdF9zdHJ1Y3Qoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50IGRyY19pbmRleCwgY2hhciAqZHJjX25hbWUsIGludCBwb3dlcl9kb21haW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCmluZGV4IDI5MTE3YTMuLmM4MzBmZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9jb3JlLmMKQEAgLTE1MiwxNyArMTUyLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCWRvd24oJnJwYXBocF9zZW0pOwotCS8qICBoYXZlIHRvIGdvIHRocm91Z2ggdGhpcyAqLwotCXN3aXRjaCAoc2xvdC0+ZGV2X3R5cGUpIHsKLQljYXNlIFBDSV9ERVY6Ci0JCXJldHZhbCA9IHJwYXBocF9nZXRfcGNpX2FkYXB0ZXJfc3RhdHVzKHNsb3QsIDAsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBWSU9fREVWOgotCQlyZXR2YWwgPSBycGFwaHBfZ2V0X3Zpb19hZGFwdGVyX3N0YXR1cyhzbG90LCAwLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JfQorCXJldHZhbCA9IHJwYXBocF9nZXRfcGNpX2FkYXB0ZXJfc3RhdHVzKHNsb3QsIDAsIHZhbHVlKTsKIAl1cCgmcnBhcGhwX3NlbSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTMxNywzNCArMzA3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpc19kcl9kbihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBpbnQgKippbmRleGVzLCBpbnQgKipuYW1lcywKLQkJaW50ICoqdHlwZXMsIGludCAqKnBvd2VyX2RvbWFpbnMsIGludCAqKm15X2RyY19pbmRleCkKLXsKLQlpbnQgcmM7Ci0KLQkqbXlfZHJjX2luZGV4ID0gKGludCAqKSBnZXRfcHJvcGVydHkoZG4sICJpYm0sbXktZHJjLWluZGV4IiwgTlVMTCk7Ci0JaWYoISpteV9kcmNfaW5kZXgpCi0JCXJldHVybiAoMCk7Ci0KLQlpZiAoIWRuLT5wYXJlbnQpCi0JCXJldHVybiAoMCk7Ci0KLQlyYyA9IGdldF9jaGlsZHJlbl9wcm9wcyhkbi0+cGFyZW50LCBpbmRleGVzLCBuYW1lcywgdHlwZXMsCi0JCQkJcG93ZXJfZG9tYWlucyk7Ci0JcmV0dXJuIChyYyA+PSAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXNfdmRldmljZV9yb290KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCi17Ci0JcmV0dXJuICFzdHJjbXAoZG4tPm5hbWUsICJ2ZGV2aWNlIik7Ci19Ci0KLWludCBpc19kbHBhcl90eXBlKGNvbnN0IGNoYXIgKnR5cGVfc3RyKQotewotCS8qIE9ubHkgcmVnaXN0ZXIgRExQQVItY2FwYWJsZSBub2RlcyBvZiBkcmMtdHlwZSBQSEIgb3IgU0xPVCAqLwotCXJldHVybiAoIXN0cmNtcCh0eXBlX3N0ciwgIlBIQiIpIHx8ICFzdHJjbXAodHlwZV9zdHIsICJTTE9UIikpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJcnBhcGhwIG5vdCBvbmx5IHJlZ2lzdGVycyBQQ0kgaG90cGx1ZyBzbG90cyhIT1RQTFVHKSwgCiAgKglidXQgYWxzbyBsb2dpY2FsIERSIHNsb3RzKEVNQkVEREVEKS4KQEAgLTM1Niw1NCArMzE4LDMzIEBACiB7CiAJc3RydWN0IHNsb3QgKnNsb3Q7CiAJaW50IHJldHZhbCA9IDA7Ci0JaW50IGksICpteV9kcmNfaW5kZXgsIHNsb3RfdHlwZTsKKwlpbnQgaTsKIAlpbnQgKmluZGV4ZXMsICpuYW1lcywgKnR5cGVzLCAqcG93ZXJfZG9tYWluczsKIAljaGFyICpuYW1lLCAqdHlwZTsKIAogCWRiZygiRW50cnkgJXM6IGRuLT5mdWxsX25hbWU9JXNcbiIsIF9fRlVOQ1RJT05fXywgZG4tPmZ1bGxfbmFtZSk7CiAKLQlpZiAoZG4tPnBhcmVudCAmJiBpc192ZGV2aWNlX3Jvb3QoZG4tPnBhcmVudCkpIHsKLQkJLyogcmVnaXN0ZXIgYSBWSU8gZGV2aWNlICovCi0JCXJldHZhbCA9IHJlZ2lzdGVyX3Zpb19zbG90KGRuKTsKLQkJZ290byBleGl0OwotCX0KLQogCS8qIHJlZ2lzdGVyIFBDSSBkZXZpY2VzICovCiAJaWYgKGRuLT5uYW1lICE9IDAgJiYgc3RyY21wKGRuLT5uYW1lLCAicGNpIikgPT0gMCkgewotCQlpZiAoaXNfcGhwX2RuKGRuLCAmaW5kZXhlcywgJm5hbWVzLCAmdHlwZXMsICZwb3dlcl9kb21haW5zKSkgIAotCQkJc2xvdF90eXBlID0gSE9UUExVRzsKLQkJZWxzZSBpZiAoaXNfZHJfZG4oZG4sICZpbmRleGVzLCAmbmFtZXMsICZ0eXBlcywgJnBvd2VyX2RvbWFpbnMsICZteV9kcmNfaW5kZXgpKSAKLQkJCXNsb3RfdHlwZSA9IEVNQkVEREVEOwotCQllbHNlIGdvdG8gZXhpdDsKKwkJaWYgKCFpc19waHBfZG4oZG4sICZpbmRleGVzLCAmbmFtZXMsICZ0eXBlcywgJnBvd2VyX2RvbWFpbnMpKQorCQkJZ290byBleGl0OwogCiAJCW5hbWUgPSAoY2hhciAqKSAmbmFtZXNbMV07CiAJCXR5cGUgPSAoY2hhciAqKSAmdHlwZXNbMV07CiAJCWZvciAoaSA9IDA7IGkgPCBpbmRleGVzWzBdOyBpKyssCi0JICAgICAJCW5hbWUgKz0gKHN0cmxlbihuYW1lKSArIDEpLCB0eXBlICs9IChzdHJsZW4odHlwZSkgKyAxKSkgeworCSAgICAgCQluYW1lICs9IChzdHJsZW4obmFtZSkgKyAxKSwgdHlwZSArPSAoc3RybGVuKHR5cGUpICsgMSkpIAkJewogCi0JCQlpZiAoc2xvdF90eXBlID09IEhPVFBMVUcgfHwKLQkJCSAgICAoc2xvdF90eXBlID09IEVNQkVEREVEICYmCi0JCQkgICAgIGluZGV4ZXNbaSArIDFdID09IG15X2RyY19pbmRleFswXSAmJgotCQkJICAgICBpc19kbHBhcl90eXBlKHR5cGUpKSkgewotCQkJCWlmICghKHNsb3QgPSBhbGxvY19zbG90X3N0cnVjdChkbiwgaW5kZXhlc1tpICsgMV0sIG5hbWUsCi0JCQkJCSAgICAgICBwb3dlcl9kb21haW5zW2kgKyAxXSkpKSB7Ci0JCQkJCXJldHZhbCA9IC1FTk9NRU07Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9Ci0JCQkJaWYgKCFzdHJjbXAodHlwZSwgIlBIQiIpKQotCQkJCQlzbG90LT50eXBlID0gUEhCOwotCQkJCWVsc2UgaWYgKHNsb3RfdHlwZSA9PSBFTUJFRERFRCkKLQkJCQkJc2xvdC0+dHlwZSA9IEVNQkVEREVEOwotCQkJCWVsc2UKLQkJCQkJc2xvdC0+dHlwZSA9IHNpbXBsZV9zdHJ0b3VsKHR5cGUsIE5VTEwsIDEwKTsKKwkJCWlmICghKHNsb3QgPSBhbGxvY19zbG90X3N0cnVjdChkbiwgaW5kZXhlc1tpICsgMV0sIG5hbWUsCisJCQkJICAgICAgIHBvd2VyX2RvbWFpbnNbaSArIDFdKSkpIHsKKwkJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCXNsb3QtPnR5cGUgPSBzaW1wbGVfc3RydG91bCh0eXBlLCBOVUxMLCAxMCk7CiAJCQkJCi0JCQkJZGJnKCIgICAgRm91bmQgZHJjLWluZGV4OjB4JXggZHJjLW5hbWU6JXMgZHJjLXR5cGU6JXNcbiIsCisJCQlkYmcoIkZvdW5kIGRyYy1pbmRleDoweCV4IGRyYy1uYW1lOiVzIGRyYy10eXBlOiVzXG4iLAogCQkJCQlpbmRleGVzW2kgKyAxXSwgbmFtZSwgdHlwZSk7CiAKLQkJCQlyZXR2YWwgPSByZWdpc3Rlcl9wY2lfc2xvdChzbG90KTsKLQkJCQlpZiAoc2xvdF90eXBlID09IEVNQkVEREVEKQotCQkJCQlnb3RvIGV4aXQ7Ci0JCQl9CisJCQlyZXR2YWwgPSByZWdpc3Rlcl9wY2lfc2xvdChzbG90KTsKIAkJfQogCX0KIGV4aXQ6CkBAIC00MTIsMzEgKzM1Myw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoKLSAqIGluaXRfc2xvdHMgLSBpbml0aWFsaXplICdzdHJ1Y3Qgc2xvdCcgc3RydWN0dXJlcyBmb3IgZWFjaCBzbG90Ci0gKgotICovCi1zdGF0aWMgdm9pZCBpbml0X3Nsb3RzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQotCWZvciAoZG4gPSBmaW5kX2FsbF9ub2RlcygpOyBkbjsgZG4gPSBkbi0+bmV4dCkKLQkJcnBhcGhwX2FkZF9zbG90KGRuKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9ycGEodm9pZCkKLXsKLQotCWluaXRfTVVURVgoJnJwYXBocF9zZW0pOwotCi0JLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBldGMuICovCi0JaW5pdF9zbG90cygpOwotCWlmICghbnVtX3Nsb3RzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zbG90cyh2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm47CkBAIC00NTgsMTAgKzM3NCwxOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBycGFwaHBfaW5pdCh2b2lkKQogewotCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBOVUxMOwogCi0JLyogcmVhZCBhbGwgdGhlIFBSQSBpbmZvIGZyb20gdGhlIHN5c3RlbSAqLwotCXJldHVybiBpbml0X3JwYSgpOworCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCWluaXRfTVVURVgoJnJwYXBocF9zZW0pOworCisJd2hpbGUgKChkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCAicGNpIikpKQorCQlycGFwaHBfYWRkX3Nsb3QoZG4pOworCisJaWYgKCFudW1fc2xvdHMpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBycGFwaHBfZXhpdCh2b2lkKQpAQCAtNDgxLDE2ICs0MDUsNyBAQAogCiAJZGJnKCJFTkFCTElORyBTTE9UICVzXG4iLCBzbG90LT5uYW1lKTsKIAlkb3duKCZycGFwaHBfc2VtKTsKLQlzd2l0Y2ggKHNsb3QtPmRldl90eXBlKSB7Ci0JY2FzZSBQQ0lfREVWOgotCQlyZXR2YWwgPSBycGFwaHBfZW5hYmxlX3BjaV9zbG90KHNsb3QpOwotCQlicmVhazsKLQljYXNlIFZJT19ERVY6Ci0JCXJldHZhbCA9IHJwYXBocF9lbmFibGVfdmlvX3Nsb3Qoc2xvdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JfQorCXJldHZhbCA9IHJwYXBocF9lbmFibGVfcGNpX3Nsb3Qoc2xvdCk7CiAJdXAoJnJwYXBocF9zZW0pOwogZXhpdDoKIAlkYmcoIiVzIC0gRXhpdDogcmNbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CkBAIC01MTEsMTYgKzQyNiw3IEBACiAKIAlkYmcoIkRJU0FCTElORyBTTE9UICVzXG4iLCBzbG90LT5uYW1lKTsKIAlkb3duKCZycGFwaHBfc2VtKTsKLQlzd2l0Y2ggKHNsb3QtPmRldl90eXBlKSB7Ci0JY2FzZSBQQ0lfREVWOgotCQlyZXR2YWwgPSBycGFwaHBfdW5jb25maWdfcGNpX2FkYXB0ZXIoc2xvdCk7Ci0JCWJyZWFrOwotCWNhc2UgVklPX0RFVjoKLQkJcmV0dmFsID0gcnBhcGhwX3VuY29uZmlnX3Zpb19hZGFwdGVyKHNsb3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR2YWwgPSAtRU5PREVWOwotCX0KKwlyZXR2YWwgPSBycGFwaHBfdW5jb25maWdfcGNpX2FkYXB0ZXIoc2xvdCk7CiAJdXAoJnJwYXBocF9zZW0pOwogZXhpdDoKIAlkYmcoIiVzIC0gRXhpdDogcmNbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jCmluZGV4IGQ4MzA1YTkuLjQ5ZTRkMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jCkBAIC0zMCwyMiArMzAsMzUgQEAKIAogI2luY2x1ZGUgInJwYXBocC5oIgogCi1zdHJ1Y3QgcGNpX2RldiAqcnBhcGhwX2ZpbmRfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQorc3RhdGljIHN0cnVjdCBwY2lfYnVzICpmaW5kX2J1c19hbW9uZ19jaGlsZHJlbihzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCWNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXTsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c2RuOwogCi0Jc3ByaW50ZihidXNfaWQsICIlMDR4OiUwMng6JTAyeC4lZCIsIGRuLT5waGItPmdsb2JhbF9udW1iZXIsCi0JCWRuLT5idXNubywgUENJX1NMT1QoZG4tPmRldmZuKSwgUENJX0ZVTkMoZG4tPmRldmZuKSk7Ci0JZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKLQkJaWYgKCFzdHJjbXAocGNpX25hbWUoZGV2KSwgYnVzX2lkKSkgeworCWJ1c2RuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisJaWYgKGJ1c2RuID09IGRuKQorCQlyZXR1cm4gYnVzOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZidXMtPmNoaWxkcmVuKSB7CisJCWNoaWxkID0gZmluZF9idXNfYW1vbmdfY2hpbGRyZW4ocGNpX2J1c19iKHRtcCksIGRuKTsKKwkJaWYgKGNoaWxkKQogCQkJYnJlYWs7Ci0JCX0KIAl9Ci0JcmV0dXJuIGRldjsKKwlyZXR1cm4gY2hpbGQ7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9maW5kX3BjaV9kZXYpOworc3RydWN0IHBjaV9idXMgKnJwYXBocF9maW5kX3BjaV9idXMoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBkbi0+ZGF0YTsKKworCWlmICghcGRuICB8fCAhcGRuLT5waGIgfHwgIXBkbi0+cGhiLT5idXMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZpbmRfYnVzX2Ftb25nX2NoaWxkcmVuKHBkbi0+cGhiLT5idXMsIGRuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9maW5kX3BjaV9idXMpOwogCiBpbnQgcnBhcGhwX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSkKIHsKQEAgLTY5LDExICs4Miw2IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9jbGFpbV9yZXNvdXJjZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqcnBhcGhwX2ZpbmRfYnJpZGdlX3BkZXYoc3RydWN0IHNsb3QgKnNsb3QpCi17Ci0JcmV0dXJuIHJwYXBocF9maW5kX3BjaV9kZXYoc2xvdC0+ZG4pOwotfQotCiBzdGF0aWMgaW50IHJwYXBocF9nZXRfc2Vuc29yX3N0YXRlKHN0cnVjdCBzbG90ICpzbG90LCBpbnQgKnN0YXRlKQogewogCWludCByYzsKQEAgLTExNiwzOSArMTI0LDI3IEBACiAgKi8KIGludCBycGFwaHBfZ2V0X3BjaV9hZGFwdGVyX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgaW50IGlzX2luaXQsIHU4ICogdmFsdWUpCiB7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAlpbnQgc3RhdGUsIHJjOwotIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkX2RuOwotIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGRfZGV2ID0gTlVMTDsKIAogCSp2YWx1ZSA9IE5PVF9WQUxJRDsKIAlyYyA9IHJwYXBocF9nZXRfc2Vuc29yX3N0YXRlKHNsb3QsICZzdGF0ZSk7CiAJaWYgKHJjKQogCQlnb3RvIGV4aXQ7CiAKLSAJaWYgKChzdGF0ZSA9PSBFTVBUWSkgfHwgKHNsb3QtPnR5cGUgPT0gUEhCKSkgewotIAkJZGJnKCJzbG90IGlzIGVtcHR5XG4iKTsKKyAJaWYgKHN0YXRlID09IEVNUFRZKQogIAkJKnZhbHVlID0gRU1QVFk7Ci0gCX0KICAJZWxzZSBpZiAoc3RhdGUgPT0gUFJFU0VOVCkgewogCQlpZiAoIWlzX2luaXQpIHsKIAkJCS8qIGF0IHJ1bi10aW1lIHNsb3QtPnN0YXRlIGNhbiBiZSBjaGFuZ2VkIGJ5ICovCiAJCQkvKiBjb25maWcvdW5jb25maWcgYWRhcHRlciAqLwogCQkJKnZhbHVlID0gc2xvdC0+c3RhdGU7CiAJCX0gZWxzZSB7Ci0gCQkJY2hpbGRfZG4gPSBzbG90LT5kbi0+Y2hpbGQ7Ci0gCQkJaWYgKGNoaWxkX2RuKQotIAkJCQljaGlsZF9kZXYgPSBycGFwaHBfZmluZF9wY2lfZGV2KGNoaWxkX2RuKTsKLQotIAkJCWlmIChjaGlsZF9kZXYpCi0gCQkJCSp2YWx1ZSA9IENPTkZJR1VSRUQ7Ci0gCQkJZWxzZSBpZiAoIWNoaWxkX2RuKQotCQkJCWRiZygiJXM6ICVzIGlzIG5vdCB2YWxpZCBPRkRUIG5vZGVcbiIsCi0JCQkJICAgIF9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPmZ1bGxfbmFtZSk7Ci0JCQllbHNlIHsKLQkJCQllcnIoIiVzOiBjYW4ndCBmaW5kIHBkZXYgb2YgYWRhcHRlciBpbiBzbG90WyVzXVxuIiwgCi0JCQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPmZ1bGxfbmFtZSk7CisJCQlidXMgPSBycGFwaHBfZmluZF9wY2lfYnVzKHNsb3QtPmRuKTsKKwkJCWlmIChidXMgJiYgIWxpc3RfZW1wdHkoJmJ1cy0+ZGV2aWNlcykpCisJCQkJKnZhbHVlID0gQ09ORklHVVJFRDsKKwkJCWVsc2UKIAkJCQkqdmFsdWUgPSBOT1RfQ09ORklHVVJFRDsKLQkJCX0KIAkJfQogCX0KIGV4aXQ6CkBAIC0xODYsMzkgKzE4Miw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJwYXBocF9wY2lfY29uZmlnX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gcnBhcGhwX3BjaV9jb25maWdfc2xvdCgpIHdpbGwgIGNvbmZpZ3VyZSBhbGwgZGV2aWNlcyB1bmRlciB0aGUgCi0gZ2l2ZW4gc2xvdC0+ZG4gYW5kIHJldHVybiB0aGUgdGhlIGZpcnN0IHBjaV9kZXYuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKgotcnBhcGhwX3BjaV9jb25maWdfc2xvdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZWFkc19maXJzdF9jaGlsZCA9IGRuLT5jaGlsZDsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgbnVtOwotCQotCWRiZygiRW50ZXIgJXM6IGRuPSVzIGJ1cz0lc1xuIiwgX19GVU5DVElPTl9fLCBkbi0+ZnVsbF9uYW1lLCBidXMtPm5hbWUpOwotCi0JaWYgKGVhZHNfZmlyc3RfY2hpbGQpIHsKLQkJLyogcGNpX3NjYW5fc2xvdCBzaG91bGQgZmluZCBhbGwgY2hpbGRyZW4gb2YgRUFEcyAqLwotCQludW0gPSBwY2lfc2Nhbl9zbG90KGJ1cywgUENJX0RFVkZOKFBDSV9TTE9UKGVhZHNfZmlyc3RfY2hpbGQtPmRldmZuKSwgMCkpOwotCQlpZiAobnVtKSB7Ci0JCQlycGFwaHBfZml4dXBfbmV3X3BjaV9kZXZpY2VzKGJ1cywgMSk7IAotCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwotCQl9Ci0JCWRldiA9IHJwYXBocF9maW5kX3BjaV9kZXYoZWFkc19maXJzdF9jaGlsZCk7Ci0JCWlmICghZGV2KSB7Ci0JCQllcnIoIk5vIG5ldyBkZXZpY2UgZm91bmRcbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgCi0JCQlycGFwaHBfcGNpX2NvbmZpZ19icmlkZ2UoZGV2KTsKLQl9Ci0JcmV0dXJuIGRldjsKLX0KLQogc3RhdGljIGludCBycGFwaHBfcGNpX2NvbmZpZ19icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCBzZWNfYnVzbm87CkBAIC0yNTIsNiArMjE1LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHJwYXBocF9wY2lfY29uZmlnX3Nsb3QoKSB3aWxsICBjb25maWd1cmUgYWxsIGRldmljZXMgdW5kZXIgdGhlCisgZ2l2ZW4gc2xvdC0+ZG4gYW5kIHJldHVybiB0aGUgdGhlIGZpcnN0IHBjaV9kZXYuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKgorcnBhcGhwX3BjaV9jb25maWdfc2xvdChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgc2xvdG5vOworCWludCBudW07CisKKwlkYmcoIkVudGVyICVzOiBkbj0lcyBidXM9JXNcbiIsIF9fRlVOQ1RJT05fXywgZG4tPmZ1bGxfbmFtZSwgYnVzLT5uYW1lKTsKKwlpZiAoIWRuIHx8ICFkbi0+Y2hpbGQpCisJCXJldHVybiBOVUxMOworCisJc2xvdG5vID0gUENJX1NMT1QoUENJX0ROKGRuLT5jaGlsZCktPmRldmZuKTsKKworCS8qIHBjaV9zY2FuX3Nsb3Qgc2hvdWxkIGZpbmQgYWxsIGNoaWxkcmVuICovCisJbnVtID0gcGNpX3NjYW5fc2xvdChidXMsIFBDSV9ERVZGTihzbG90bm8sIDApKTsKKwlpZiAobnVtKSB7CisJCXJwYXBocF9maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmYnVzLT5kZXZpY2VzKSkgeworCQllcnIoIiVzOiBObyBuZXcgZGV2aWNlIGZvdW5kXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpCisJCQlycGFwaHBfcGNpX2NvbmZpZ19icmlkZ2UoZGV2KTsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCiBzdGF0aWMgdm9pZCBlbmFibGVfZWVoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpzaWI7CkBAIC0yNjMsNDkgKzI2Miw0NCBAQAogCQogfQogCi1zdGF0aWMgdm9pZCBwcmludF9zbG90X3BjaV9mdW5jcyhzdHJ1Y3Qgc2xvdCAqc2xvdCkKK3N0YXRpYyB2b2lkIHByaW50X3Nsb3RfcGNpX2Z1bmNzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCi0JaWYgKHNsb3QtPmRldl90eXBlID09IFBDSV9ERVYpIHsKLQkJZGJnKCIlczogcGNpX2RldnMgb2Ygc2xvdFslc11cbiIsIF9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkgKGRldiwgc2xvdC0+ZGV2LnBjaV9kZXZzLCBidXNfbGlzdCkKLQkJCWRiZygiXHQlc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0JfQorCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisJaWYgKCFkbikKKwkJcmV0dXJuOworCisJZGJnKCIlczogcGNpX2RldnMgb2Ygc2xvdFslc11cbiIsIF9fRlVOQ1RJT05fXywgZG4tPmZ1bGxfbmFtZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSAoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKKwkJZGJnKCJcdCVzXG4iLCBwY2lfbmFtZShkZXYpKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgcnBhcGhwX2NvbmZpZ19wY2lfYWRhcHRlcihzdHJ1Y3Qgc2xvdCAqc2xvdCkKK2ludCBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0Jc3RydWN0IHBjaV9idXMgKnBjaV9idXM7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJaW50IHJjID0gLUVOT0RFVjsKIAotCWRiZygiRW50cnkgJXM6IHNsb3RbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOworCWRiZygiRW50cnkgJXM6IHNsb3RbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIGRuLT5mdWxsX25hbWUpOworCWlmICghZG4pCisJCWdvdG8gZXhpdDsKIAotCWlmIChzbG90LT5icmlkZ2UpIHsKLQotCQlwY2lfYnVzID0gc2xvdC0+YnJpZGdlLT5zdWJvcmRpbmF0ZTsKLQkJaWYgKCFwY2lfYnVzKSB7Ci0JCQllcnIoIiVzOiBjYW4ndCBmaW5kIGJ1cyBzdHJ1Y3R1cmVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJZW5hYmxlX2VlaChzbG90LT5kbik7Ci0JCWRldiA9IHJwYXBocF9wY2lfY29uZmlnX3Nsb3Qoc2xvdC0+ZG4sIHBjaV9idXMpOwotCQlpZiAoIWRldikgewotCQkJZXJyKCIlczogY2FuJ3QgZmluZCBhbnkgZGV2aWNlcy5cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJpbnRfc2xvdF9wY2lfZnVuY3Moc2xvdCk7Ci0JCXJjID0gMDsKLQl9IGVsc2UgewotCQkvKiBzbG90IGlzIG5vdCBlbmFibGVkICovCi0JCWVycigic2xvdCBkb2Vzbid0IGhhdmUgcGNpX2RldiBzdHJ1Y3R1cmVcbiIpOworCWVuYWJsZV9lZWgoZG4pOworCWRldiA9IHJwYXBocF9wY2lfY29uZmlnX3Nsb3QoYnVzKTsKKwlpZiAoIWRldikgeworCQllcnIoIiVzOiBjYW4ndCBmaW5kIGFueSBkZXZpY2VzLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBleGl0OwogCX0KKwlwcmludF9zbG90X3BjaV9mdW5jcyhidXMpOworCXJjID0gMDsKIGV4aXQ6CiAJZGJnKCJFeGl0ICVzOiAgcmM9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9jb25maWdfcGNpX2FkYXB0ZXIpOwogCiBzdGF0aWMgdm9pZCBycGFwaHBfZWVoX3JlbW92ZV9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMjcsMTMgKzMyMSwxNCBAQAogCiBpbnQgcnBhcGhwX3VuY29uZmlnX3BjaV9hZGFwdGVyKHN0cnVjdCBzbG90ICpzbG90KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldiwgKnRtcDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCBzbG90LT5kZXYucGNpX2RldnMsIGJ1c19saXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgc2xvdC0+cGNpX2RldnMsIGJ1c19saXN0KSB7CiAJCXJwYXBocF9lZWhfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJfQogCi0JcGNpX3JlbW92ZV9iZWhpbmRfYnJpZGdlKHNsb3QtPmJyaWRnZSk7CiAJc2xvdC0+c3RhdGUgPSBOT1RfQ09ORklHVVJFRDsKIAlpbmZvKCIlczogZGV2aWNlcyBpbiBzbG90WyVzXSB1bmNvbmZpZ3VyZWQuXG4iLCBfX0ZVTkNUSU9OX18sCiAJICAgICBzbG90LT5uYW1lKTsKQEAgLTM1Niw2NiArMzUxLDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3BoYl9zbG90X25hbWUoc3RydWN0IHNsb3QgKnNsb3QpCitzdGF0aWMgdm9pZCBzZXRfc2xvdF9uYW1lKHN0cnVjdCBzbG90ICpzbG90KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gc2xvdC0+YnVzOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CiAKLQlkbiA9IHNsb3QtPmRuOwotCWlmICghZG4pIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBoYiA9IGRuLT5waGI7Ci0JaWYgKCFwaGIpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWJ1cyA9IHBoYi0+YnVzOwotCWlmICghYnVzKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNwcmludGYoc2xvdC0+bmFtZSwgIiUwNHg6JTAyeDolMDJ4LiV4IiwgcGNpX2RvbWFpbl9ucihidXMpLAotCQkJYnVzLT5udW1iZXIsIDAsIDApOwotCXJldHVybiAwOworCWJyaWRnZSA9IGJ1cy0+c2VsZjsKKwlpZiAoYnJpZGdlKQorCQlzdHJjcHkoc2xvdC0+bmFtZSwgcGNpX25hbWUoYnJpZGdlKSk7CisJZWxzZQorCQlzcHJpbnRmKHNsb3QtPm5hbWUsICIlMDR4OiUwMng6MDAuMCIsIHBjaV9kb21haW5fbnIoYnVzKSwKKwkJCWJ1cy0+bnVtYmVyKTsKIH0KIAogc3RhdGljIGludCBzZXR1cF9wY2lfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gc2xvdC0+ZG47CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgcmM7CiAKLQlpZiAoc2xvdC0+dHlwZSA9PSBQSEIpIHsKLQkJcmMgPSBzZXRfcGhiX3Nsb3RfbmFtZShzbG90KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZXJyKCIlczogZmFpbGVkIHRvIHNldCBwaGIgc2xvdCBuYW1lXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJZ290byBleGl0X3JjOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2xvdC0+YnJpZGdlID0gcnBhcGhwX2ZpbmRfYnJpZGdlX3BkZXYoc2xvdCk7Ci0JCWlmICghc2xvdC0+YnJpZGdlKSB7Ci0JCQkvKiBzbG90IGJlaW5nIGFkZGVkIGRvZXNuJ3QgaGF2ZSBwY2lfZGV2IHlldCAqLwotCQkJZXJyKCIlczogbm8gcGNpX2RldiBmb3IgYnJpZGdlIGRuICVzXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwotCQkJZ290byBleGl0X3JjOwotCQl9Ci0KLQkJYnVzID0gc2xvdC0+YnJpZGdlLT5zdWJvcmRpbmF0ZTsKLQkJaWYgKCFidXMpCi0JCQlnb3RvIGV4aXRfcmM7Ci0JCXNsb3QtPmRldi5wY2lfZGV2cyA9ICZidXMtPmRldmljZXM7Ci0KLQkJZGJnKCIlcyBzZXQgc2xvdC0+bmFtZSB0byAlc1xuIiwgIF9fRlVOQ1RJT05fXywKLQkJCQlwY2lfbmFtZShzbG90LT5icmlkZ2UpKTsKLQkJc3RyY3B5KHNsb3QtPm5hbWUsIHBjaV9uYW1lKHNsb3QtPmJyaWRnZSkpOworCUJVR19PTighZG4pOworCWJ1cyA9IHJwYXBocF9maW5kX3BjaV9idXMoZG4pOworCWlmICghYnVzKSB7CisJCWVycigiJXM6IG5vIHBjaV9idXMgZm9yIGRuICVzXG4iLCBfX0ZVTkNUSU9OX18sIGRuLT5mdWxsX25hbWUpOworCQlnb3RvIGV4aXRfcmM7CiAJfQogCisJc2xvdC0+YnVzID0gYnVzOworCXNsb3QtPnBjaV9kZXZzID0gJmJ1cy0+ZGV2aWNlczsKKwlzZXRfc2xvdF9uYW1lKHNsb3QpOworCiAJLyogZmluZCBzbG90J3MgcGNpX2RldiBpZiBpdCdzIG5vdCBlbXB0eSAqLwogCWlmIChzbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzID09IEVNUFRZKSB7CiAJCXNsb3QtPnN0YXRlID0gRU1QVFk7CS8qIHNsb3QgaXMgZW1wdHkgKi8KIAl9IGVsc2UgewogCQkvKiBzbG90IGlzIG9jY3VwaWVkICovCi0JCWlmICghKHNsb3QtPmRuLT5jaGlsZCkpIHsKKwkJaWYgKCFkbi0+Y2hpbGQpIHsKIAkJCS8qIG5vbi1lbXB0eSBzbG90IGhhcyB0byBoYXZlIGNoaWxkICovCiAJCQllcnIoIiVzOiBzbG90WyVzXSdzIGRldmljZV9ub2RlIGRvZXNuJ3QgaGF2ZSBjaGlsZCBmb3IgYWRhcHRlclxuIiwgCiAJCQkJX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKQEAgLTQyNSw3ICszOTUsNyBAQAogCQlpZiAoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5hZGFwdGVyX3N0YXR1cyA9PSBOT1RfQ09ORklHVVJFRCkgewogCQkJZGJnKCIlcyBDT05GSUdVUklORyBwY2kgYWRhcHRlciBpbiBzbG90WyVzXVxuIiwgIAogCQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSk7Ci0JCQlpZiAocnBhcGhwX2NvbmZpZ19wY2lfYWRhcHRlcihzbG90KSkgeworCQkJaWYgKHJwYXBocF9jb25maWdfcGNpX2FkYXB0ZXIoc2xvdC0+YnVzKSkgewogCQkJCWVycigiJXM6IENPTkZJRyBwY2kgYWRhcHRlciBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQkJZ290byBleGl0X3JjOwkJCiAJCQl9CkBAIC00MzUsOCArNDA1LDggQEAKIAkJCQlfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwogCQkJZ290byBleGl0X3JjOwogCQl9Ci0JCXByaW50X3Nsb3RfcGNpX2Z1bmNzKHNsb3QpOwotCQlpZiAoIWxpc3RfZW1wdHkoc2xvdC0+ZGV2LnBjaV9kZXZzKSkgeworCQlwcmludF9zbG90X3BjaV9mdW5jcyhzbG90LT5idXMpOworCQlpZiAoIWxpc3RfZW1wdHkoc2xvdC0+cGNpX2RldnMpKSB7CiAJCQlzbG90LT5zdGF0ZSA9IENPTkZJR1VSRUQ7CiAJCX0gZWxzZSB7CiAJCQkvKiBETFBBUiBhZGQgYXMgb3Bwb3NlZCB0byAKQEAgLTQ1NCwxMSArNDI0LDYgQEAKIHsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCi0Jc2xvdC0+ZGV2X3R5cGUgPSBQQ0lfREVWOwotCWlmICgoc2xvdC0+dHlwZSA9PSBFTUJFRERFRCkgfHwgKHNsb3QtPnR5cGUgPT0gUEhCKSkKLQkJc2xvdC0+cmVtb3ZhYmxlID0gMDsKLQllbHNlCi0JCXNsb3QtPnJlbW92YWJsZSA9IDE7CiAJaWYgKHNldHVwX3BjaV9ob3RwbHVnX3Nsb3RfaW5mbyhzbG90KSkKIAkJZ290byBleGl0X3JjOwogCWlmIChzZXR1cF9wY2lfc2xvdChzbG90KSkKQEAgLTQ3OSw3ICs0NDQsNyBAQAogCS8qIGlmIHNsb3QgaXMgbm90IGVtcHR5LCBlbmFibGUgdGhlIGFkYXB0ZXIgKi8KIAlpZiAoc3RhdGUgPT0gUFJFU0VOVCkgewogCQlkYmcoIiVzIDogc2xvdFslc10gaXMgb2NjdXBpZWQuXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwotCQlyZXR2YWwgPSBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHNsb3QpOworCQlyZXR2YWwgPSBycGFwaHBfY29uZmlnX3BjaV9hZGFwdGVyKHNsb3QtPmJ1cyk7CiAJCWlmICghcmV0dmFsKSB7CiAJCQlzbG90LT5zdGF0ZSA9IENPTkZJR1VSRUQ7CiAJCQlkYmcoIiVzOiBQQ0kgZGV2aWNlcyBpbiBzbG90WyVzXSBoYXMgYmVlbiBjb25maWd1cmVkXG4iLCAKQEAgLTUwMiwzNyArNDY3LDMgQEAKIAlkYmcoIiVzIC0gRXhpdDogcmNbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KLQotc3RydWN0IGhvdHBsdWdfc2xvdCAqcnBhcGhwX2ZpbmRfaG90cGx1Z19zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkqdG1wLCAqbjsKLQlzdHJ1Y3Qgc2xvdAkJKnNsb3Q7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBuLCAmcnBhcGhwX3Nsb3RfaGVhZCkgewotCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKLQotCQlzbG90ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbG90LCBycGFwaHBfc2xvdF9saXN0KTsKLQkJaWYgKHNsb3QtPmJyaWRnZSA9PSBOVUxMKSB7Ci0JCQlpZiAoc2xvdC0+ZGV2X3R5cGUgPT0gUENJX0RFVikgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSSBzbG90IG1pc3NpbmcgYnJpZGdlICVzICVzIFxuIiwgCi0JCQkJICAgICAgICAgICAgICAgICAgICBzbG90LT5uYW1lLCBzbG90LT5sb2NhdGlvbik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWJ1cyA9IHNsb3QtPmJyaWRnZS0+c3Vib3JkaW5hdGU7Ci0JCWlmICghYnVzKSB7Ci0JCQljb250aW51ZTsgIC8qIHNob3VsZCBuZXZlciBoYXBwZW4/ICovCi0JCX0KLQkJZm9yIChsbiA9IGJ1cy0+ZGV2aWNlcy5uZXh0OyBsbiAhPSAmYnVzLT5kZXZpY2VzOyBsbiA9IGxuLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGNpX2Rldl9iKGxuKTsKLQkJCQlpZiAocGRldiA9PSBkZXYpCi0JCQkJCXJldHVybiBzbG90LT5ob3RwbHVnX3Nsb3Q7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwocnBhcGhwX2ZpbmRfaG90cGx1Z19zbG90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYwppbmRleCBmZjJjYmYwLi4wZTg4MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jCkBAIC0zMCwzNSArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSAicnBhcGhwLmgiCiAKLXN0YXRpYyBzc2l6ZV90IHJlbW92YWJsZV9yZWFkX2ZpbGUgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnBocF9zbG90LCBjaGFyICpidWYpCi17Ci0JdTggdmFsdWU7Ci0JaW50IHJldHZhbCA9IC1FTk9FTlQ7Ci0Jc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilwaHBfc2xvdC0+cHJpdmF0ZTsKLQotCWlmICghc2xvdCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXZhbHVlID0gc2xvdC0+cmVtb3ZhYmxlOwotCXJldHZhbCA9IHNwcmludGYgKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHN0cnVjdCBob3RwbHVnX3Nsb3RfYXR0cmlidXRlIGhvdHBsdWdfc2xvdF9hdHRyX3JlbW92YWJsZSA9IHsKLQkuYXR0ciA9IHsubmFtZSA9ICJwaHlfcmVtb3ZhYmxlIiwgLm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHT30sCi0JLnNob3cgPSByZW1vdmFibGVfcmVhZF9maWxlLAotfTsKLQotc3RhdGljIHZvaWQgcnBhcGhwX3N5c2ZzX2FkZF9hdHRyX3JlbW92YWJsZSAoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCkKLXsKLQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3JlbW92YWJsZS5hdHRyKTsKLX0KLQotc3RhdGljIHZvaWQgcnBhcGhwX3N5c2ZzX3JlbW92ZV9hdHRyX3JlbW92YWJsZSAoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCkKLXsKLQlzeXNmc19yZW1vdmVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3JlbW92YWJsZS5hdHRyKTsKLX0KLQogc3RhdGljIHNzaXplX3QgbG9jYXRpb25fcmVhZF9maWxlIChzdHJ1Y3QgaG90cGx1Z19zbG90ICpwaHBfc2xvdCwgY2hhciAqYnVmKQogewogICAgICAgICBjaGFyICp2YWx1ZTsKQEAgLTE3Niw5ICsxNDcsNiBAQAogCS8qIHJlbW92ZSAicGh5X2xvY2F0aW9uIiBmaWxlICovCiAJcnBhcGhwX3N5c2ZzX3JlbW92ZV9hdHRyX2xvY2F0aW9uKHBocF9zbG90KTsKIAotCS8qIHJlbW92ZSAicGh5X3JlbW92YWJsZSIgZmlsZSAqLwotCXJwYXBocF9zeXNmc19yZW1vdmVfYXR0cl9yZW1vdmFibGUocGhwX3Nsb3QpOwotCiAJcmV0dmFsID0gcGNpX2hwX2RlcmVnaXN0ZXIocGhwX3Nsb3QpOwogCWlmIChyZXR2YWwpCiAJCWVycigiUHJvYmxlbSB1bnJlZ2lzdGVyaW5nIGEgc2xvdCAlc1xuIiwgc2xvdC0+bmFtZSk7CkBAIC0yMTIsMjEgKzE4MCwxMyBAQAogCS8qIGNyZWF0ZSAicGh5X2xvY2F0b2luIiBmaWxlICovCiAJcnBhcGhwX3N5c2ZzX2FkZF9hdHRyX2xvY2F0aW9uKHNsb3QtPmhvdHBsdWdfc2xvdCk7CQogCi0JLyogY3JlYXRlICJwaHlfcmVtb3ZhYmxlIiBmaWxlICovCi0JcnBhcGhwX3N5c2ZzX2FkZF9hdHRyX3JlbW92YWJsZShzbG90LT5ob3RwbHVnX3Nsb3QpOwkKLQogCS8qIGFkZCBzbG90IHRvIG91ciBpbnRlcm5hbCBsaXN0ICovCiAJZGJnKCIlcyBhZGRpbmcgc2xvdFslc10gdG8gcnBhcGhwX3Nsb3RfbGlzdFxuIiwKIAkgICAgX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKIAogCWxpc3RfYWRkKCZzbG90LT5ycGFwaHBfc2xvdF9saXN0LCAmcnBhcGhwX3Nsb3RfaGVhZCk7Ci0KLQlpZiAoc2xvdC0+ZGV2X3R5cGUgPT0gVklPX0RFVikKLQkJaW5mbygiU2xvdCBbJXNdKFZJTyBsb2NhdGlvbj0lcykgcmVnaXN0ZXJlZFxuIiwKLQkJICAgICBzbG90LT5uYW1lLCBzbG90LT5sb2NhdGlvbik7Ci0JZWxzZQotCQlpbmZvKCJTbG90IFslc10oUENJIGxvY2F0aW9uPSVzKSByZWdpc3RlcmVkXG4iLAotCQkgICAgIHNsb3QtPm5hbWUsIHNsb3QtPmxvY2F0aW9uKTsKKwlpbmZvKCJTbG90IFslc10oUENJIGxvY2F0aW9uPSVzKSByZWdpc3RlcmVkXG4iLCBzbG90LT5uYW1lLAorCQkJc2xvdC0+bG9jYXRpb24pOwogCW51bV9zbG90cysrOwogCXJldHVybiAwOwogfQpAQCAtMjM1LDIxICsxOTUsMTcgQEAKIHsKIAlpbnQgcmMgPSAwLCBsZXZlbDsKIAkKLQlpZiAoc2xvdC0+dHlwZSA9PSBIT1RQTFVHKSB7Ci0JCXJjID0gcnRhc19nZXRfcG93ZXJfbGV2ZWwoc2xvdC0+cG93ZXJfZG9tYWluLCAmbGV2ZWwpOwotCQlpZiAoIXJjKSB7Ci0JCQlkYmcoIiVzIHRoZSBwb3dlciBsZXZlbCBvZiBzbG90ICVzKHB3ZC1kb21haW46MHgleCkgaXMgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBzbG90LT5uYW1lLCBzbG90LT5wb3dlcl9kb21haW4sIGxldmVsKTsKLQkJCSp2YWx1ZSA9IGxldmVsOwotCQl9IGVsc2UKLQkJCWVycigiZmFpbGVkIHRvIGdldCBwb3dlci1sZXZlbCBmb3Igc2xvdCglcyksIHJjPTB4JXhcbiIsCi0JCQkJc2xvdC0+bG9jYXRpb24sIHJjKTsKLQl9IGVsc2UgewotCQlkYmcoIiVzIHJlcG9ydCBQT1dFUl9PTiBmb3IgRU1CRURERUQgb3IgUEhCIHNsb3QgJXNcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHNsb3QtPmxvY2F0aW9uKTsKLQkJKnZhbHVlID0gKHU4KSBQT1dFUl9PTjsKKwlyYyA9IHJ0YXNfZ2V0X3Bvd2VyX2xldmVsKHNsb3QtPnBvd2VyX2RvbWFpbiwgJmxldmVsKTsKKwlpZiAocmMgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGdldCBwb3dlci1sZXZlbCBmb3Igc2xvdCglcyksIHJjPTB4JXhcbiIsCisJCQlzbG90LT5sb2NhdGlvbiwgcmMpOworCQlyZXR1cm4gcmM7CiAJfQogCisJZGJnKCIlcyB0aGUgcG93ZXIgbGV2ZWwgb2Ygc2xvdCAlcyhwd2QtZG9tYWluOjB4JXgpIGlzICVkXG4iLAorCQlfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUsIHNsb3QtPnBvd2VyX2RvbWFpbiwgbGV2ZWwpOworCSp2YWx1ZSA9IGxldmVsOworCiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF92aW8uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Zpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRmNmEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Zpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBSUEEgSG90IFBsdWcgVmlydHVhbCBJL08gZGV2aWNlIGZ1bmN0aW9ucyAKLSAqIENvcHlyaWdodCAoQykgMjAwNCBMaW5kYSBYaWUgPGx4aWVAdXMuaWJtLmNvbT4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGx4aWVAdXMuaWJtLmNvbT4KLSAqCi0gKi8KLSNpbmNsdWRlIDxhc20vdmlvLmg+Ci0jaW5jbHVkZSAicnBhcGhwLmgiCi0KLS8qCi0gKiBnZXRfdmlvX2FkYXB0ZXJfc3RhdHVzIC0gZ2V0ICB0aGUgc3RhdHVzIG9mIGEgc2xvdAotICogCi0gKiBzdGF0dXM6Ci0gKiAKLSAqIDEtLSBhZGFwdGVyIGlzIGNvbmZpZ3VyZWQKLSAqIDItLSBhZGFwdGVyIGlzIG5vdCBjb25maWd1cmVkCi0gKiAzLS0gbm90IHZhbGlkCi0gKi8KLWlubGluZSBpbnQgcnBhcGhwX2dldF92aW9fYWRhcHRlcl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIGludCBpc19pbml0LCB1OCAqdmFsdWUpCi17Ci0JKnZhbHVlID0gc2xvdC0+c3RhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBycGFwaHBfdW5jb25maWdfdmlvX2FkYXB0ZXIoc3RydWN0IHNsb3QgKnNsb3QpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlkYmcoIkVudHJ5ICVzOiBzbG90WyVzXVxuIiwgX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKLQlpZiAoIXNsb3QtPmRldi52aW9fZGV2KSB7Ci0JCWluZm8oIiVzOiBubyBWSU9BIGluIHNsb3RbJXNdXG4iLCBfX0ZVTkNUSU9OX18sIHNsb3QtPm5hbWUpOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCS8qIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIHZpbyBjb3JlICovCi0JdmlvX3VucmVnaXN0ZXJfZGV2aWNlKHNsb3QtPmRldi52aW9fZGV2KTsKLQlzbG90LT5zdGF0ZSA9IE5PVF9DT05GSUdVUkVEOwotCWluZm8oIiVzOiBhZGFwdGVyIGluIHNsb3RbJXNdIHVuY29uZmlndXJlZC5cbiIsIF9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSk7Ci1leGl0OgotCWRiZygiRXhpdCAlcywgcmM9MHgleFxuIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfdmlvX2hvdHBsdWdfc2xvdF9pbmZvKHN0cnVjdCBzbG90ICpzbG90KQotewotCXNsb3QtPmhvdHBsdWdfc2xvdC0+aW5mby0+cG93ZXJfc3RhdHVzID0gMTsKLQlycGFwaHBfZ2V0X3Zpb19hZGFwdGVyX3N0YXR1cyhzbG90LCAxLAotCQkmc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5hZGFwdGVyX3N0YXR1cyk7IAotCXJldHVybiAwOwotfQotCi1pbnQgcmVnaXN0ZXJfdmlvX3Nsb3Qoc3RydWN0IGRldmljZV9ub2RlICpkbikKLXsKLQl1MzIgKmluZGV4OwotCWNoYXIgKm5hbWU7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IE5VTEw7Ci0JCi0JcmMgPSBycGFwaHBfZ2V0X2RyY19wcm9wcyhkbiwgTlVMTCwgJm5hbWUsIE5VTEwsIE5VTEwpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXhpdF9yYzsKLQlpbmRleCA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLG15LWRyYy1pbmRleCIsIE5VTEwpOwotCWlmICghaW5kZXgpCi0JCWdvdG8gZXhpdF9yYzsKLQlpZiAoIShzbG90ID0gYWxsb2Nfc2xvdF9zdHJ1Y3QoZG4sICppbmRleCwgbmFtZSwgMCkpKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBleGl0X3JjOwotCX0KLQlzbG90LT5kZXZfdHlwZSA9IFZJT19ERVY7Ci0Jc2xvdC0+ZGV2LnZpb19kZXYgPSB2aW9fZmluZF9ub2RlKGRuKTsKLQlpZiAoc2xvdC0+ZGV2LnZpb19kZXYpIHsKLQkJLyoKLQkJICogcnBhcGhwIGlzIHRoZSBvbmx5IG93bmVyIG9mIHZpbyBkZXZpY2VzIGFuZAotCQkgKiBkb2VzIG5vdCBuZWVkIGV4dHJhIHJlZmVyZW5jZSB0YWtlbiBieQotCQkgKiB2aW9fZmluZF9ub2RlCi0JCSAqLwotCQlwdXRfZGV2aWNlKCZzbG90LT5kZXYudmlvX2Rldi0+ZGV2KTsKLQl9IGVsc2UKLQkJc2xvdC0+ZGV2LnZpb19kZXYgPSB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoZG4pOwotCWlmIChzbG90LT5kZXYudmlvX2RldikKLQkJc2xvdC0+c3RhdGUgPSBDT05GSUdVUkVEOwotCWVsc2UKLQkJc2xvdC0+c3RhdGUgPSBOT1RfQ09ORklHVVJFRDsKLQlpZiAoc2V0dXBfdmlvX2hvdHBsdWdfc2xvdF9pbmZvKHNsb3QpKQotCQlnb3RvIGV4aXRfcmM7Ci0Jc3RyY3B5KHNsb3QtPm5hbWUsIHNsb3QtPmRldi52aW9fZGV2LT5kZXYuYnVzX2lkKTsKLQlpbmZvKCIlczogcmVnaXN0ZXJlZCBWSU8gZGV2aWNlW25hbWU9JXMgdmlvX2Rldj0lcF1cbiIsCi0JCV9fRlVOQ1RJT05fXywgc2xvdC0+bmFtZSwgc2xvdC0+ZGV2LnZpb19kZXYpOyAKLQlyYyA9IHJlZ2lzdGVyX3Nsb3Qoc2xvdCk7Ci1leGl0X3JjOgotCWlmIChyYyAmJiBzbG90KQotCQlkZWFsbG9jX3Nsb3Rfc3RydWN0KHNsb3QpOwotCXJldHVybiAocmMpOwotfQotCi1pbnQgcnBhcGhwX2VuYWJsZV92aW9fc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWlmICgoc2xvdC0+ZGV2LnZpb19kZXYgPSB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoc2xvdC0+ZG4pKSkgewotCQlpbmZvKCIlczogVklPIGFkYXB0ZXIgJXMgaW4gc2xvdFslc10gaGFzIGJlZW4gY29uZmlndXJlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPm5hbWUsIHNsb3QtPm5hbWUpOwotCQlzbG90LT5zdGF0ZSA9IENPTkZJR1VSRUQ7Ci0JfSBlbHNlIHsKLQkJaW5mbygiJXM6IG5vIHZpb19kZXYgc3RydWN0IGZvciBhZGFwdGVyIGluIHNsb3RbJXNdXG4iLAotCQkJX19GVU5DVElPTl9fLCBzbG90LT5uYW1lKTsKLQkJc2xvdC0+c3RhdGUgPSBOT1RfQ09ORklHVVJFRDsKLQl9Ci0JCi0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwppbmRleCAzMjMwNDFmLi5iMTQwOTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0zMiwxNCArMzIsMTUgQEAKIE1PRFVMRV9BVVRIT1IoIlNHSSAocHJhcml0QHNnaS5jb20sIGRpY2tpZUBzZ2kuY29tLCBoYWJlY2tAc2dpLmNvbSkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IEhvdCBQbHVnIFBDSSBDb250cm9sbGVyIERyaXZlciIpOwogCi0jZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQSAgICAgNAotI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX1VQICAgICAgIDIgICAgIC8qIHNsb3QgYWxyZWFkeSB1cCAqLwotI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX0RPV04gICAgIDMgICAgIC8qIHNsb3QgYWxyZWFkeSBkb3duICovCi0jZGVmaW5lIFBDSV9MMV9FUlIgICAgICAgICAgICAgICAgNyAgICAgLyogTDEgY29uc29sZSBjb21tYW5kIGVycm9yICovCi0jZGVmaW5lIFBDSV9FTVBUWV8zM01IWiAgICAgICAgICAxNSAgICAgLyogZW1wdHkgMzMgTUh6IGJ1cyAqLwotI2RlZmluZSBQQ0lfTDFfUVNJWkUgICAgICAgICAgICAxMjggICAgIC8qIG91ciBMMSBtZXNzYWdlIGJ1ZmZlciBzaXplICovCi0jZGVmaW5lIFNOX01BWF9IUF9TTE9UUwkJIDMyCS8qIG1heCBudW1iZXIgb2YgaG90cGx1ZyBzbG90cyAqLwotI2RlZmluZSBTR0lfSE9UUExVR19QUk9NX1JFVgkweDA0MjAgIC8qIE1pbi4gcmVxdWlyZWQgUFJPTSB2ZXJzaW9uICovCisjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQQkJNAorI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX1VQCQkyCS8qIHNsb3QgYWxyZWFkeSB1cCAqLworI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX0RPV04JCTMJLyogc2xvdCBhbHJlYWR5IGRvd24gKi8KKyNkZWZpbmUgUENJX0wxX0VSUgkJCTcJLyogTDEgY29uc29sZSBjb21tYW5kIGVycm9yICovCisjZGVmaW5lIFBDSV9FTVBUWV8zM01IWgkJCTE1CS8qIGVtcHR5IDMzIE1IeiBidXMgKi8KKyNkZWZpbmUgUENJX0wxX1FTSVpFCQkJMTI4CS8qIG91ciBMMSBtZXNzYWdlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIFNOX01BWF9IUF9TTE9UUwkJCTMyCS8qIG1heCBob3RwbHVnIHNsb3RzICovCisjZGVmaW5lIFNHSV9IT1RQTFVHX1BST01fUkVWCQkweDA0MzAJLyogTWluLiByZXF1aXJlZCBQUk9NIHZlcnNpb24gKi8KKyNkZWZpbmUgU05fU0xPVF9OQU1FX1NJWkUJCTMzCS8qIHNpemUgb2YgbmFtZSBzdHJpbmcgKi8KIAogLyogaW50ZXJuYWwgbGlzdCBoZWFkICovCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzbl9ocF9saXN0OwpAQCAtNTEsNiArNTIsNyBAQAogCS8qIHRoaXMgc3RydWN0IGZvciBnbHVlIGludGVybmFsIG9ubHkgKi8KIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBocF9saXN0OworCWNoYXIgcGh5c2ljYWxfcGF0aFtTTl9TTE9UX05BTUVfU0laRV07CiB9OwogCiBzdHJ1Y3QgcGNpYnJfc2xvdF9lbmFibGVfcmVzcCB7CkBAIC03MCw3ICs3Miw3IEBACiAKIHN0YXRpYyBpbnQgZW5hYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CiBzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKLXN0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworc3RhdGljIGlubGluZSBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOwogCiBzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgc25faG90cGx1Z19zbG90X29wcyA9IHsKIAkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLApAQCAtODEsNiArODMsMjEgQEAKIAogc3RhdGljIERFQ0xBUkVfTVVURVgoc25faG90cGx1Z19zZW0pOwogCitzdGF0aWMgc3NpemVfdCBwYXRoX3Nob3cgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJICAgICAgIAkJICBjaGFyICpidWYpCit7CisJaW50IHJldHZhbCA9IC1FTk9FTlQ7CisJc3RydWN0IHNsb3QgKnNsb3QgPSBic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCisJaWYgKCFzbG90KQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gc3ByaW50ZiAoYnVmLCAiJXNcbiIsIHNsb3QtPnBoeXNpY2FsX3BhdGgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90X2F0dHJpYnV0ZSBzbl9zbG90X3BhdGhfYXR0ciA9IF9fQVRUUl9STyhwYXRoKTsKKwogc3RhdGljIGludCBzbl9wY2lfc2xvdF92YWxpZChzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgaW50IGRldmljZSkKIHsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwpAQCAtMTIwLDE1ICsxMzcsMTUgQEAKIAkvKiBPbmx5IHJlZ2lzdGVyIHNsb3RzIGluIEkvTyBCcmlja3MgdGhhdCBzdXBwb3J0IGhvdHBsdWcgKi8KIAlicmlja3R5cGUgPSBNT0RVTEVfR0VUX0JUWVBFKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpOwogCXN3aXRjaCAoYnJpY2t0eXBlKSB7Ci0JY2FzZSBMMV9CUklDS1RZUEVfSVg6Ci0JY2FzZSBMMV9CUklDS1RZUEVfUFg6Ci0JY2FzZSBMMV9CUklDS1RZUEVfSUE6Ci0JY2FzZSBMMV9CUklDS1RZUEVfUEE6Ci0JCXJldHVybiAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVQRVJNOwotCQlicmVhazsKKwkJY2FzZSBMMV9CUklDS1RZUEVfSVg6CisJCWNhc2UgTDFfQlJJQ0tUWVBFX1BYOgorCQljYXNlIEwxX0JSSUNLVFlQRV9JQToKKwkJY2FzZSBMMV9CUklDS1RZUEVfUEE6CisJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybiAtRUlPOwpAQCAtMTQyLDEzICsxNTksMTIgQEAKIAogCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKTsKIAotCWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc2xvdCksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpCisJc2xvdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzbG90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbG90KQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlic3NfaG90cGx1Z19zbG90LT5wcml2YXRlID0gc2xvdDsKIAotCWJzc19ob3RwbHVnX3Nsb3QtPm5hbWUgPSBrbWFsbG9jKDMzLCBHRlBfS0VSTkVMKTsKKwlic3NfaG90cGx1Z19zbG90LT5uYW1lID0ga21hbGxvYyhTTl9TTE9UX05BTUVfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFic3NfaG90cGx1Z19zbG90LT5uYW1lKSB7CiAJCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE1NiwxNiArMTcyLDE2IEBACiAKIAlzbG90LT5kZXZpY2VfbnVtID0gZGV2aWNlOwogCXNsb3QtPnBjaV9idXMgPSBwY2lfYnVzOwotCi0Jc3ByaW50Zihic3NfaG90cGx1Z19zbG90LT5uYW1lLCAibW9kdWxlXyVjJWMlYyVjJS4yZF9iXyVkX3NfJWQiLAorCXNwcmludGYoYnNzX2hvdHBsdWdfc2xvdC0+bmFtZSwgIiUwNHg6JTAyeDolMDJ4IiwKKwkJcGNpX2RvbWFpbl9ucihwY2lfYnVzKSwKKwkJKChpbnQpcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0pICYgMHhmLAorCQlkZXZpY2UgKyAxKTsKKwlzcHJpbnRmKHNsb3QtPnBoeXNpY2FsX3BhdGgsICJtb2R1bGVfJWMlYyVjJWMlLjJkIiwKIAkJJzAnK1JBQ0tfR0VUX0NMQVNTKE1PRFVMRV9HRVRfUkFDSyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSksCiAJCScwJytSQUNLX0dFVF9HUk9VUChNT0RVTEVfR0VUX1JBQ0socGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCkpLAogCQknMCcrUkFDS19HRVRfTlVNKE1PRFVMRV9HRVRfUkFDSyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSksCiAJCU1PRFVMRV9HRVRfQlRDSEFSKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpLAotCQlNT0RVTEVfR0VUX0JQT1MocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCksCi0JCSgoaW50KXBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtKSAmIDB4ZiwKLQkJZGV2aWNlICsgMSk7Ci0KKwkJTU9EVUxFX0dFVF9CUE9TKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKTsKIAlzbG90LT5ob3RwbHVnX3Nsb3QgPSBic3NfaG90cGx1Z19zbG90OwogCWxpc3RfYWRkKCZzbG90LT5ocF9saXN0LCAmc25faHBfbGlzdCk7CiAKQEAgLTE3NSwxNCArMTkxLDE0IEBACiBzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdCAqIHNuX2hwX2Rlc3Ryb3kodm9pZCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmc25faHBfbGlzdCkgewotCQlzbG90ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc2xvdCwgaHBfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbG90LCAmc25faHBfbGlzdCwgaHBfbGlzdCkgewogCQlic3NfaG90cGx1Z19zbG90ID0gc2xvdC0+aG90cGx1Z19zbG90OwogCQlsaXN0X2RlbCgmKChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpLT4KIAkJCSBocF9saXN0KTsKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJmJzc19ob3RwbHVnX3Nsb3QtPmtvYmosCisJCQkJICAmc25fc2xvdF9wYXRoX2F0dHIuYXR0cik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gYnNzX2hvdHBsdWdfc2xvdDsKQEAgLTE5MCw3ICsyMDYsNiBAQAogCiBzdGF0aWMgdm9pZCBzbl9idXNfYWxsb2NfZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CiAJc3RydWN0IHBjaV9idXMgKnN1Ym9yZGluYXRlX2J1czsKIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGQ7CiAKQEAgLTE5OSw2NiArMjE0LDI5IEBACiAJLyogUmVjdXJzaXZlbHkgc2V0cyB1cCB0aGUgc25faXJxX2luZm8gc3RydWN0cyAqLwogCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7CiAJCXN1Ym9yZGluYXRlX2J1cyA9IGRldi0+c3Vib3JkaW5hdGU7Ci0JCWxpc3RfZm9yX2VhY2gobm9kZSwgJnN1Ym9yZGluYXRlX2J1cy0+ZGV2aWNlcykgewotCQkJY2hpbGQgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBwY2lfZGV2LCBidXNfbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMsIGJ1c19saXN0KQogCQkJc25fYnVzX2FsbG9jX2RhdGEoY2hpbGQpOwotCQl9CiAJfQogfQogCiBzdGF0aWMgdm9pZCBzbl9idXNfZnJlZV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2J1cyAqc3Vib3JkaW5hdGVfYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpjaGlsZDsKIAogCS8qIFJlY3Vyc2l2ZWx5IGNsZWFuIHVwIHNuX2lycV9pbmZvIHN0cnVjdHMgKi8KIAlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgewogCQlzdWJvcmRpbmF0ZV9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOwotCQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZzdWJvcmRpbmF0ZV9idXMtPmRldmljZXMpIHsKLQkJCWNoaWxkID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgcGNpX2RldiwgYnVzX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKIAkJCXNuX2J1c19mcmVlX2RhdGEoY2hpbGQpOwotCQl9CiAJfQogCXNuX3BjaV91bmZpeHVwX3Nsb3QoZGV2KTsKIH0KIAotc3RhdGljIHU4IHNuX3Bvd2VyX3N0YXR1c19nZXQoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKLXsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0Jc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKLQl1OCByZXR2YWw7Ci0KLQlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7Ci0JcmV0dmFsID0gcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgJiAoMSA8PCBzbG90LT5kZXZpY2VfbnVtKTsKLQotCXJldHVybiByZXR2YWwgPyAxIDogMDsKLX0KLQotc3RhdGljIHZvaWQgc25fc2xvdF9tYXJrX2VuYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAotCQkJCWludCBkZXZpY2VfbnVtKQotewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwotCi0JcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHNsb3QtPnBjaV9idXMpOwotCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzIHw9ICgxIDw8IGRldmljZV9udW0pOwotfQotCi1zdGF0aWMgdm9pZCBzbl9zbG90X21hcmtfZGlzYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAotCQkJCSBpbnQgZGV2aWNlX251bSkKLXsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0Jc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKLQotCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKLQlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyAmPSB+KDEgPDwgZGV2aWNlX251bSk7Ci19Ci0KIHN0YXRpYyBpbnQgc25fc2xvdF9lbmFibGUoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKIAkJCSAgaW50IGRldmljZV9udW0pCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBzbG90ICpzbG90ID0gYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwogCXN0cnVjdCBwY2licl9zbG90X2VuYWJsZV9yZXNwIHJlc3A7CiAJaW50IHJjOwpAQCAtMjczLDcgKzI1MSw3IEBACiAKIAlpZiAocmMgPT0gUENJX1NMT1RfQUxSRUFEWV9VUCkgewogCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJpcyBhbHJlYWR5IGFjdGl2ZVxuIik7Ci0JCXJldHVybiAtRVBFUk07CisJCXJldHVybiAxOyAvKiByZXR1cm4gMSB0byB1c2VyICovCiAJfQogCiAJaWYgKHJjID09IFBDSV9MMV9FUlIpIHsKQEAgLTI5MCw3ICsyNjgsOCBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlzbl9zbG90X21hcmtfZW5hYmxlKGJzc19ob3RwbHVnX3Nsb3QsIGRldmljZV9udW0pOworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKwlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyB8PSAoMSA8PCBkZXZpY2VfbnVtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjk4LDcgKzI3Nyw3IEBACiBzdGF0aWMgaW50IHNuX3Nsb3RfZGlzYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAogCQkJICAgaW50IGRldmljZV9udW0sIGludCBhY3Rpb24pCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBzbG90ICpzbG90ID0gYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwogCXN0cnVjdCBwY2licl9zbG90X2Rpc2FibGVfcmVzcCByZXNwOwogCWludCByYzsKQEAgLTMwNyw0MyArMjg2LDQ0IEBACiAKIAlyYyA9IHNhbF9wY2licl9zbG90X2Rpc2FibGUocGNpYnVzX2luZm8sIGRldmljZV9udW0sIGFjdGlvbiwgJnJlc3ApOwogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX1NMT1RfQUxSRUFEWV9ET1dOKSB7CisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFKSAmJgorCSAgICAocmMgPT0gUENJX1NMT1RfQUxSRUFEWV9ET1dOKSkgewogCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJTbG90ICVzIGFscmVhZHkgaW5hY3RpdmVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIDE7IC8qIHJldHVybiAxIHRvIHVzZXIgKi8KIAl9CiAKLQlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiByYyA9PSBQQ0lfRU1QVFlfMzNNSFopIHsKKwlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmIChyYyA9PSBQQ0lfRU1QVFlfMzNNSFopKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKIAkJCSJDYW5ub3QgcmVtb3ZlIGxhc3QgMzNNSHogY2FyZFxuIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX0wxX0VSUikgeworCWlmICgoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSkgJiYgKHJjID09IFBDSV9MMV9FUlIpKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKIAkJCSJMMSBmYWlsdXJlICVkIHdpdGggbWVzc2FnZSBcbiVzXG4iLAogCQkJcmVzcC5yZXNwX3N1Yl9lcnJubywgcmVzcC5yZXNwX2wxX21zZyk7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMpIHsKKwlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmIHJjKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKIAkJCSJyZW1vdmUgZmFpbGVkIHdpdGggZXJyb3IgJWQgc3ViLWVycm9yICVkXG4iLAogCQkJcmMsIHJlc3AucmVzcF9zdWJfZXJybm8pOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiAhcmMpCisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFKSAmJiAhcmMpCiAJCXJldHVybiAwOwogCi0JaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRElTQUJMRSAmJiAhcmMpIHsKLQkJc25fc2xvdF9tYXJrX2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgZGV2aWNlX251bSk7CisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUpICYmICFyYykgeworCQlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisJCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzICY9IH4oMSA8PCBkZXZpY2VfbnVtKTsKIAkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAicmVtb3ZlIHN1Y2Nlc3NmdWxcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9ESVNBQkxFICYmIHJjKSB7CisJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUpICYmIHJjKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwicmVtb3ZlIGZhaWxlZCByYyA9ICVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0zNTEsNyArMzMxLDcgQEAKIAogc3RhdGljIGludCBlbmFibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQogewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CiAJc3RydWN0IHBjaV9idXMgKm5ld19idXMgPSBOVUxMOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJaW50IGZ1bmMsIG51bV9mdW5jczsKQEAgLTM3MSw4ICszNTEsOCBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JbnVtX2Z1bmNzID0gcGNpX3NjYW5fc2xvdChzbG90LT5wY2lfYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlX251bSsxLAotCQkJCQkJCSAgIFBDSV9GVU5DKDApKSk7CisJbnVtX2Z1bmNzID0gcGNpX3NjYW5fc2xvdChzbG90LT5wY2lfYnVzLAorCQkJCSAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLCAwKSk7CiAJaWYgKCFudW1fZnVuY3MpIHsKIAkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAibm8gZGV2aWNlIGluIHNsb3RcbiIpOwogCQl1cCgmc25faG90cGx1Z19zZW0pOwpAQCAtMzkxLDggKzM3MSw2IEBACiAJCWRldiA9IHBjaV9nZXRfc2xvdChzbG90LT5wY2lfYnVzLAogCQkJCSAgIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtICsgMSwKIAkJCQkJICAgICBQQ0lfRlVOQyhmdW5jKSkpOwotCi0KIAkJaWYgKGRldikgewogCQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewogCQkJCXVuc2lnbmVkIGNoYXIgc2VjX2J1czsKQEAgLTQzMSw3ICs0MDksNyBAQAogCiBzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQogewotCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAlpbnQgZnVuYzsKIAlpbnQgcmM7CkBAIC00NDgsNyArNDI2LDcgQEAKIAkvKiBGcmVlIHRoZSBTTiByZXNvdXJjZXMgYXNzaWduZWQgdG8gdGhlIExpbnV4IGRldmljZS4qLwogCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyAgZnVuYysrKSB7CiAJCWRldiA9IHBjaV9nZXRfc2xvdChzbG90LT5wY2lfYnVzLAotCQkJCSAgIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtKzEsCisJCQkJICAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLAogCQkJCSAgIAkgICAgIFBDSV9GVU5DKGZ1bmMpKSk7CiAJCWlmIChkZXYpIHsKIAkJCS8qCkBAIC00NzcsMTAgKzQ1NSwxNSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBnZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKKwkJCQkgICB1OCAqdmFsdWUpCiB7CisJc3RydWN0IHNsb3QgKnNsb3QgPSBic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CiAJZG93bigmc25faG90cGx1Z19zZW0pOwotCSp2YWx1ZSA9IHNuX3Bvd2VyX3N0YXR1c19nZXQoYnNzX2hvdHBsdWdfc2xvdCk7CisJKnZhbHVlID0gcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgJiAoMSA8PCBzbG90LT5kZXZpY2VfbnVtKTsKIAl1cCgmc25faG90cGx1Z19zZW0pOwogCXJldHVybiAwOwogfQpAQCAtNTA4LDcgKzQ5MSw3IEBACiAJCWlmIChzbl9wY2lfc2xvdF92YWxpZChwY2lfYnVzLCBkZXZpY2UpICE9IDEpCiAJCQljb250aW51ZTsKIAotCQlic3NfaG90cGx1Z19zbG90ID0ga2NhbGxvYygxLHNpemVvZihzdHJ1Y3QgaG90cGx1Z19zbG90KSwKKwkJYnNzX2hvdHBsdWdfc2xvdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpic3NfaG90cGx1Z19zbG90KSwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnNzX2hvdHBsdWdfc2xvdCkgewogCQkJcmMgPSAtRU5PTUVNOwpAQCAtNTE2LDcgKzQ5OSw3IEBACiAJCX0KIAogCQlic3NfaG90cGx1Z19zbG90LT5pbmZvID0KLQkJCWtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvKSwKKwkJCWtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghYnNzX2hvdHBsdWdfc2xvdC0+aW5mbykgewogCQkJcmMgPSAtRU5PTUVNOwpAQCAtNTM1LDYgKzUxOCwxMSBAQAogCQlyYyA9IHBjaV9ocF9yZWdpc3Rlcihic3NfaG90cGx1Z19zbG90KTsKIAkJaWYgKHJjKQogCQkJZ290byByZWdpc3Rlcl9lcnI7CisKKwkJcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmYnNzX2hvdHBsdWdfc2xvdC0+a29iaiwKKwkJCQkgICAgICAgJnNuX3Nsb3RfcGF0aF9hdHRyLmF0dHIpOworCQlpZiAocmMpCisJCQlnb3RvIHJlZ2lzdGVyX2VycjsKIAl9CiAJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAiUmVnaXN0ZXJlZCBidXMgd2l0aCBob3RwbHVnXG4iKTsKIAlyZXR1cm4gcmM7CkBAIC01NjQsMTQgKzU1MiwxNCBAQAogCWludCByYzsKIAlpbnQgcmVnaXN0ZXJlZCA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmc25faHBfbGlzdCk7Ci0KIAlpZiAoc25fc2FsX3JldigpIDwgU0dJX0hPVFBMVUdfUFJPTV9SRVYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogUFJPTSB2ZXJzaW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQuMDVcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBST00gdmVyc2lvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0LjMwXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmc25faHBfbGlzdCk7CisKIAl3aGlsZSAoKHBjaV9idXMgPSBwY2lfZmluZF9uZXh0X2J1cyhwY2lfYnVzKSkpIHsKIAkJaWYgKCFwY2lfYnVzLT5zeXNkYXRhKQogCQkJY29udGludWU7CkBAIC01ODQsOSArNTcyLDkgQEAKIAkJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAidmFsaWQgaG90cGx1ZyBidXNcbiIpOwogCiAJCXJjID0gc25faG90cGx1Z19zbG90X3JlZ2lzdGVyKHBjaV9idXMpOwotCQlpZiAoIXJjKQorCQlpZiAoIXJjKSB7CiAJCQlyZWdpc3RlcmVkID0gMTsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlyZWdpc3RlcmVkID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC01OTksOSArNTg3LDggQEAKIHsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90OwogCi0Jd2hpbGUgKChic3NfaG90cGx1Z19zbG90ID0gc25faHBfZGVzdHJveSgpKSkgeworCXdoaWxlICgoYnNzX2hvdHBsdWdfc2xvdCA9IHNuX2hwX2Rlc3Ryb3koKSkpCiAJCXBjaV9ocF9kZXJlZ2lzdGVyKGJzc19ob3RwbHVnX3Nsb3QpOwotCX0KIAogCWlmICghbGlzdF9lbXB0eSgmc25faHBfbGlzdCkpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludGVybmFsIGxpc3QgaXMgbm90IGVtcHR5XG4iLCBfX0ZJTEVfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaAppbmRleCBmZTRkNjUzLi5iN2QxYzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKQEAgLTQxMSw3ICs0MTEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWFrZV9zbG90X25hbWUoY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIHN0cnVjdCBzbG90ICpzbG90KQogewotCXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlZCIsIHNsb3QtPm51bWJlcik7CisJc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiUwNGRfJTA0ZCIsIHNsb3QtPmJ1cywgc2xvdC0+bnVtYmVyKTsKIH0KIAogZW51bSBwaHBfY3Rscl90eXBlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggMmI4NWFhMy4uZWU4Njc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLmMKQEAgLTkxLDYgKzkxLDcgQEAKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCXN0cnVjdCBtc2dfYWRkcmVzcyBhZGRyZXNzOworCXVuc2lnbmVkIGludCBpcnEgPSB2ZWN0b3I7CiAKIAllbnRyeSA9IChzdHJ1Y3QgbXNpX2Rlc2MgKiltc2lfZGVzY1t2ZWN0b3JdOwogCWlmICghZW50cnkgfHwgIWVudHJ5LT5kZXYpCkBAIC0xMTIsNiArMTEzLDcgQEAKIAkJZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPSBjcHVfbWFza190b19hcGljaWQoY3B1X21hc2spOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGVudHJ5LT5kZXYsIG1zaV9sb3dlcl9hZGRyZXNzX3JlZyhwb3MpLAogCQkJYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlKTsKKwkJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIGNwdV9tYXNrKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgUENJX0NBUF9JRF9NU0lYOgpAQCAtMTI1LDIyICsxMjcsMTMgQEAKIAkJCU1TSV9UQVJHRVRfQ1BVX1NISUZUKTsKIAkJZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPSBjcHVfbWFza190b19hcGljaWQoY3B1X21hc2spOwogCQl3cml0ZWwoYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlLCBlbnRyeS0+bWFza19iYXNlICsgb2Zmc2V0KTsKKwkJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIGNwdV9tYXNrKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIH0KLQotI2lmZGVmIENPTkZJR19JUlFCQUxBTkNFCi1zdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9tc2koaW50IHZlY3RvcikKLXsKLQlpZiAoIWNwdXNfZW1wdHkocGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW3ZlY3Rvcl0pKSB7Ci0JCXNldF9tc2lfYWZmaW5pdHkodmVjdG9yLCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbdmVjdG9yXSk7Ci0JCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW3ZlY3Rvcl0pOwotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfSVJRQkFMQU5DRSAqLwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIHZvaWQgbWFza19NU0lfaXJxKHVuc2lnbmVkIGludCB2ZWN0b3IpCkBAIC0xOTEsMTMgKzE4NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfbXNpX2lycV93b19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCiB7Ci0JbW92ZV9tc2kodmVjdG9yKTsKKwltb3ZlX25hdGl2ZV9pcnEodmVjdG9yKTsKIAlhY2tfQVBJQ19pcnEoKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX21zaV9pcnFfd19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCiB7Ci0JbW92ZV9tc2kodmVjdG9yKTsKKwltb3ZlX25hdGl2ZV9pcnEodmVjdG9yKTsKIAl1bm1hc2tfTVNJX2lycSh2ZWN0b3IpOwogCWFja19BUElDX2lycSgpOwogfQpAQCAtNDQ2LDEwICs0MzksNyBAQAogCX0KICAgICAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpIHsKIAkJLyogUENJIEV4cHJlc3MgRW5kcG9pbnQgZGV2aWNlIGRldGVjdGVkICovCi0JCXUxNiBjbWQ7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgfD0gUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwkJcGNpX2ludHgoZGV2LCAwKTsgIC8qIGRpc2FibGUgaW50eCAqLwogCX0KIH0KIApAQCAtNDY4LDEwICs0NTgsNyBAQAogCX0KICAgICAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpIHsKIAkJLyogUENJIEV4cHJlc3MgRW5kcG9pbnQgZGV2aWNlIGRldGVjdGVkICovCi0JCXUxNiBjbWQ7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJCXBjaV9pbnR4KGRldiwgMSk7ICAvKiBlbmFibGUgaW50eCAqLwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmggYi9kcml2ZXJzL3BjaS9tc2kuaAppbmRleCAzOTBmMTg1Li40MDIxMzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuaAorKysgYi9kcml2ZXJzL3BjaS9tc2kuaApAQCAtMTksNyArMTksNiBAQAogI2RlZmluZSBOUl9IUF9SRVNFUlZFRF9WRUNUT1JTIAkyMAogCiBleHRlcm4gaW50IHZlY3Rvcl9pcnFbTlJfVkVDVE9SU107Ci1leHRlcm4gY3B1bWFza190IHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tOUl9JUlFTXTsKIGV4dGVybiB2b2lkICgqaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKTsKIGV4dGVybiBpbnQgcGNpX3ZlY3Rvcl9yZXNvdXJjZXMoaW50IGxhc3QsIGludCBucl9yZWxlYXNlZCk7CiAKQEAgLTI5LDEwICsyOCw2IEBACiAjZGVmaW5lIHNldF9tc2lfaXJxX2FmZmluaXR5CU5VTEwKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19JUlFCQUxBTkNFCi1zdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9tc2koaW50IHZlY3Rvcikge30KLSNlbmRpZgotCiAvKgogICogTVNJLVggQWRkcmVzcyBSZWdpc3RlcgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9uYW1lcy5jIGIvZHJpdmVycy9wY2kvbmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyMjRhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BjaS9uYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKglQQ0kgQ2xhc3MgYW5kIERldmljZSBOYW1lIFRhYmxlcwotICoKLSAqCUNvcHlyaWdodCAxOTkzLS0xOTk5IERyZXcgRWNraGFyZHQsIEZyZWRlcmljIFBvdHRlciwKLSAqCURhdmlkIE1vc2Jlcmdlci1UYW5nLCBNYXJ0aW4gTWFyZXMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpZmRlZiBDT05GSUdfUENJX05BTUVTCi0KLXN0cnVjdCBwY2lfZGV2aWNlX2luZm8gewotCXVuc2lnbmVkIHNob3J0IGRldmljZTsKLQl1bnNpZ25lZCBzaG9ydCBzZWVuOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3QgcGNpX3ZlbmRvcl9pbmZvIHsKLQl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7Ci0JdW5zaWduZWQgc2hvcnQgbnI7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgcGNpX2RldmljZV9pbmZvICpkZXZpY2VzOwotfTsKLQotLyoKLSAqIFRoaXMgaXMgcmlkaWN1bG91cywgYnV0IHdlIHdhbnQgdGhlIHN0cmluZ3MgaW4KLSAqIHRoZSAuaW5pdCBzZWN0aW9uIHNvIHRoYXQgdGhleSBkb24ndCB0YWtlIHVwCi0gKiByZWFsIG1lbW9yeS4uIFBhcnNlIHRoZSBzYW1lIGZpbGUgbXVsdGlwbGUgdGltZXMKLSAqIHRvIGdldCBhbGwgdGhlIGluZm8uCi0gKi8KLSNkZWZpbmUgVkVORE9SKCB2ZW5kb3IsIG5hbWUgKQkJc3RhdGljIGNoYXIgX192ZW5kb3JzdHJfIyN2ZW5kb3JbXSBfX2RldmluaXRkYXRhID0gbmFtZTsKLSNkZWZpbmUgRU5EVkVORE9SKCkKLSNkZWZpbmUgREVWSUNFKCB2ZW5kb3IsIGRldmljZSwgbmFtZSApIAlzdGF0aWMgY2hhciBfX2RldmljZXN0cl8jI3ZlbmRvciMjZGV2aWNlW10gX19kZXZpbml0ZGF0YSA9IG5hbWU7Ci0jaW5jbHVkZSAiZGV2bGlzdC5oIgotCi0KLSNkZWZpbmUgVkVORE9SKCB2ZW5kb3IsIG5hbWUgKQkJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2luZm8gX19kZXZpY2VzXyMjdmVuZG9yW10gX19kZXZpbml0ZGF0YSA9IHsKLSNkZWZpbmUgRU5EVkVORE9SKCkJCQl9OwotI2RlZmluZSBERVZJQ0UoIHZlbmRvciwgZGV2aWNlLCBuYW1lICkJeyAweCMjZGV2aWNlLCAwLCBfX2RldmljZXN0cl8jI3ZlbmRvciMjZGV2aWNlIH0sCi0jaW5jbHVkZSAiZGV2bGlzdC5oIgotCi1zdGF0aWMgc3RydWN0IHBjaV92ZW5kb3JfaW5mbyBfX2RldmluaXRkYXRhIHBjaV92ZW5kb3JfbGlzdFtdID0gewotI2RlZmluZSBWRU5ET1IoIHZlbmRvciwgbmFtZSApCQl7IDB4IyN2ZW5kb3IsIHNpemVvZihfX2RldmljZXNfIyN2ZW5kb3IpIC8gc2l6ZW9mKHN0cnVjdCBwY2lfZGV2aWNlX2luZm8pLCBfX3ZlbmRvcnN0cl8jI3ZlbmRvciwgX19kZXZpY2VzXyMjdmVuZG9yIH0sCi0jZGVmaW5lIEVORFZFTkRPUigpCi0jZGVmaW5lIERFVklDRSggdmVuZG9yLCBkZXZpY2UsIG5hbWUgKQotI2luY2x1ZGUgImRldmxpc3QuaCIKLX07Ci0KLSNkZWZpbmUgVkVORE9SUyAoc2l6ZW9mKHBjaV92ZW5kb3JfbGlzdCkvc2l6ZW9mKHN0cnVjdCBwY2lfdmVuZG9yX2luZm8pKQotCi12b2lkIF9fZGV2aW5pdCBwY2lfbmFtZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgcGNpX3ZlbmRvcl9pbmZvICp2ZW5kb3JfcCA9IHBjaV92ZW5kb3JfbGlzdDsKLQlpbnQgaSA9IFZFTkRPUlM7Ci0JY2hhciAqbmFtZSA9IGRldi0+cHJldHR5X25hbWU7Ci0KLQlkbyB7Ci0JCWlmICh2ZW5kb3JfcC0+dmVuZG9yID09IGRldi0+dmVuZG9yKQotCQkJZ290byBtYXRjaF92ZW5kb3I7Ci0JCXZlbmRvcl9wKys7Ci0JfSB3aGlsZSAoLS1pKTsKLQotCS8qIENvdWxkbid0IGZpbmQgZWl0aGVyIHRoZSB2ZW5kb3Igbm9yIHRoZSBkZXZpY2UgKi8KLQlzcHJpbnRmKG5hbWUsICJQQ0kgZGV2aWNlICUwNHg6JTA0eCIsIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSk7Ci0JcmV0dXJuOwotCi0JbWF0Y2hfdmVuZG9yOiB7Ci0JCXN0cnVjdCBwY2lfZGV2aWNlX2luZm8gKmRldmljZV9wID0gdmVuZG9yX3AtPmRldmljZXM7Ci0JCWludCBpID0gdmVuZG9yX3AtPm5yOwotCi0JCXdoaWxlIChpID4gMCkgewotCQkJaWYgKGRldmljZV9wLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpCi0JCQkJZ290byBtYXRjaF9kZXZpY2U7Ci0JCQlkZXZpY2VfcCsrOwotCQkJaS0tOwotCQl9Ci0KLQkJLyogT2ssIGZvdW5kIHRoZSB2ZW5kb3IsIGJ1dCB1bmtub3duIGRldmljZSAqLwotCQlzcHJpbnRmKG5hbWUsICJQQ0kgZGV2aWNlICUwNHg6JTA0eCAoJS4iIFBDSV9OQU1FX0hBTEYgInMpIiwKLQkJCQlkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UsIHZlbmRvcl9wLT5uYW1lKTsKLQkJcmV0dXJuOwotCi0JCS8qIEZ1bGwgbWF0Y2ggKi8KLQkJbWF0Y2hfZGV2aWNlOiB7Ci0JCQljaGFyICpuID0gbmFtZSArIHNwcmludGYobmFtZSwgIiVzICVzIiwKLQkJCQkJdmVuZG9yX3AtPm5hbWUsIGRldmljZV9wLT5uYW1lKTsKLQkJCWludCBuciA9IGRldmljZV9wLT5zZWVuICsgMTsKLQkJCWRldmljZV9wLT5zZWVuID0gbnI7Ci0JCQlpZiAobnIgPiAxKQotCQkJCXNwcmludGYobiwgIiAoIyVkKSIsIG5yKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqICBDbGFzcyBuYW1lcy4gTm90IGluIC5pbml0IHNlY3Rpb24gYXMgdGhleSBhcmUgbmVlZGVkIGluIHJ1bnRpbWUuCi0gKi8KLQotc3RhdGljIHUxNiBwY2lfY2xhc3NfbnVtYmVyc1tdID0gewotI2RlZmluZSBDTEFTUyh4LHkpIDB4IyN4LAotI2luY2x1ZGUgImNsYXNzbGlzdC5oIgotfTsKLQotc3RhdGljIGNoYXIgKnBjaV9jbGFzc19uYW1lc1tdID0gewotI2RlZmluZSBDTEFTUyh4LHkpIHksCi0jaW5jbHVkZSAiY2xhc3NsaXN0LmgiCi19OwotCi1jaGFyICoKLXBjaV9jbGFzc19uYW1lKHUzMiBjbGFzcykKLXsKLQlpbnQgaTsKLQotCWZvcihpPTA7IGk8c2l6ZW9mKHBjaV9jbGFzc19udW1iZXJzKS9zaXplb2YocGNpX2NsYXNzX251bWJlcnNbMF0pOyBpKyspCi0JCWlmIChwY2lfY2xhc3NfbnVtYmVyc1tpXSA9PSBjbGFzcykKLQkJCXJldHVybiBwY2lfY2xhc3NfbmFtZXNbaV07Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbHNlCi0KLXZvaWQgX19kZXZpbml0IHBjaV9uYW1lX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotfQotCi1jaGFyICoKLXBjaV9jbGFzc19uYW1lKHUzMiBjbGFzcykKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19QQ0lfTkFNRVMgKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IGU0MTE1YTAuLjBkMGQ1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAvKgpAQCAtMTYzLDYgKzE2NCwzNCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IHBjaV9jYWxsX3Byb2JlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyb3I7CisjaWZkZWYgQ09ORklHX05VTUEKKwkvKiBFeGVjdXRlIGRyaXZlciBpbml0aWFsaXphdGlvbiBvbiBub2RlIHdoZXJlIHRoZQorCSAgIGRldmljZSdzIGJ1cyBpcyBhdHRhY2hlZCB0by4gIFRoaXMgd2F5IHRoZSBkcml2ZXIgbGlrZWx5CisJICAgYWxsb2NhdGVzIGl0cyBsb2NhbCBtZW1vcnkgb24gdGhlIHJpZ2h0IG5vZGUgd2l0aG91dAorCSAgIGFueSBuZWVkIHRvIGNoYW5nZSBpdC4gKi8KKwlzdHJ1Y3QgbWVtcG9saWN5ICpvbGRwb2w7CisJY3B1bWFza190IG9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJaW50IG5vZGUgPSBwY2lidXNfdG9fbm9kZShkZXYtPmJ1cyk7CisJaWYgKG5vZGUgPj0gMCAmJiBub2RlX29ubGluZShub2RlKSkKKwkgICAgc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBub2RlX3RvX2NwdW1hc2sobm9kZSkpOworCS8qIEFuZCBzZXQgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY3kgKi8KKwlvbGRwb2wgPSBjdXJyZW50LT5tZW1wb2xpY3k7CisJY3VycmVudC0+bWVtcG9saWN5ID0gJmRlZmF1bHRfcG9saWN5OworCW1wb2xfZ2V0KGN1cnJlbnQtPm1lbXBvbGljeSk7CisjZW5kaWYKKwllcnJvciA9IGRydi0+cHJvYmUoZGV2LCBpZCk7CisjaWZkZWYgQ09ORklHX05VTUEKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCW1wb2xfZnJlZShjdXJyZW50LT5tZW1wb2xpY3kpOworCWN1cnJlbnQtPm1lbXBvbGljeSA9IG9sZHBvbDsKKyNlbmRpZgorCXJldHVybiBlcnJvcjsKK30KKwogLyoqCiAgKiBfX3BjaV9kZXZpY2VfcHJvYmUoKQogICogCkBAIC0xODAsNyArMjA5LDcgQEAKIAogCQlpZCA9IHBjaV9tYXRjaF9kZXZpY2UoZHJ2LCBwY2lfZGV2KTsKIAkJaWYgKGlkKQotCQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsIGlkKTsKKwkJCWVycm9yID0gcGNpX2NhbGxfcHJvYmUoZHJ2LCBwY2lfZGV2LCBpZCk7CiAJCWlmIChlcnJvciA+PSAwKSB7CiAJCQlwY2lfZGV2LT5kcml2ZXIgPSBkcnY7CiAJCQllcnJvciA9IDA7CkBAIC0yNDMsMTcgKzI3MiwxOSBAQAogfQogCiAKLS8qIAorLyoKICAqIERlZmF1bHQgcmVzdW1lIG1ldGhvZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgbm8gZHJpdmVyIHByb3ZpZGVkIHJlc3VtZSwKICAqIG9yIG5vdCBldmVuIGEgZHJpdmVyIGF0IGFsbC4KICAqLwogc3RhdGljIHZvaWQgcGNpX2RlZmF1bHRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogeworCWludCByZXR2YWw7CisKIAkvKiByZXN0b3JlIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAJLyogaWYgdGhlIGRldmljZSB3YXMgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZCwgcmVlbmFibGUgKi8KIAlpZiAocGNpX2Rldi0+aXNfZW5hYmxlZCkKLQkJcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOwogCS8qIGlmIHRoZSBkZXZpY2Ugd2FzIGJ1c21hc3RlciBiZWZvcmUgdGhlIHN1c3BlbmQsIG1ha2UgaXQgYnVzbWFzdGVyIGFnYWluICovCiAJaWYgKHBjaV9kZXYtPmlzX2J1c21hc3RlcikKIAkJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGNjOWQ2NTMuLjU2YTNiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC00NCwxMCArNDQsMTQgQEAKIHBjaV9jb25maWdfYXR0cihjbGFzcywgIjB4JTA2eFxuIik7CiBwY2lfY29uZmlnX2F0dHIoaXJxLCAiJXVcbiIpOwogCi1zdGF0aWMgc3NpemVfdCBsb2NhbF9jcHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbG9jYWxfY3B1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CQkKLQljcHVtYXNrX3QgbWFzayA9IHBjaWJ1c190b19jcHVtYXNrKHRvX3BjaV9kZXYoZGV2KS0+YnVzKTsKLQlpbnQgbGVuID0gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgbWFzayk7CisJY3B1bWFza190IG1hc2s7CisJaW50IGxlbjsKKworCW1hc2sgPSBwY2lidXNfdG9fY3B1bWFzayh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisJbGVuID0gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgbWFzayk7CiAJc3RyY2F0KGJ1ZiwiXG4iKTsgCiAJcmV0dXJuIDErbGVuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBjNjJkMmYwLi45OTJkYjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMjIyLDYgKzIyMiwzNyBAQAogfQogCiAvKioKKyAqIHBjaV9yZXN0b3JlX2JhcnMgLSByZXN0b3JlIGEgZGV2aWNlcyBCQVIgdmFsdWVzIChlLmcuIGFmdGVyIHdha2UtdXApCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGhhdmUgaXRzIEJBUnMgcmVzdG9yZWQKKyAqCisgKiBSZXN0b3JlIHRoZSBCQVIgdmFsdWVzIGZvciBhIGdpdmVuIGRldmljZSwgc28gYXMgdG8gbWFrZSBpdAorICogYWNjZXNzaWJsZSBieSBpdHMgZHJpdmVyLgorICovCit2b2lkCitwY2lfcmVzdG9yZV9iYXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGksIG51bXJlczsKKworCXN3aXRjaCAoZGV2LT5oZHJfdHlwZSkgeworCWNhc2UgUENJX0hFQURFUl9UWVBFX05PUk1BTDoKKwkJbnVtcmVzID0gNjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOgorCQludW1yZXMgPSAyOworCQlicmVhazsKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTOgorCQludW1yZXMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLi4gKi8KKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1yZXM7IGkgKyspCisJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCAmZGV2LT5yZXNvdXJjZVtpXSwgaSk7Cit9CisKKy8qKgogICogcGNpX3NldF9wb3dlcl9zdGF0ZSAtIFNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAogICogQHN0YXRlOiBQQ0kgcG93ZXIgc3RhdGUgKEQwLCBEMSwgRDIsIEQzaG90LCBEM2NvbGQpIHdlJ3JlIGVudGVyaW5nCkBAIC0yMzksNyArMjcwLDcgQEAKIGludAogcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKLQlpbnQgcG07CisJaW50IHBtLCBuZWVkX3Jlc3RvcmUgPSAwOwogCXUxNiBwbWNzciwgcG1jOwogCiAJLyogYm91bmQgdGhlIHN0YXRlIHdlJ3JlIGVudGVyaW5nICovCkBAIC0yNjMsNyArMjk0LDcgQEAKIAkJcmV0dXJuIC1FSU87IAogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LHBtICsgUENJX1BNX1BNQywmcG1jKTsKLQlpZiAoKHBtYyAmIFBDSV9QTV9DQVBfVkVSX01BU0spID4gMikgeworCWlmICgocG1jICYgUENJX1BNX0NBUF9WRVJfTUFTSykgPiAzKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAgICAgICAiUENJOiAlcyBoYXMgdW5zdXBwb3J0ZWQgUE0gY2FwIHJlZ3MgdmVyc2lvbiAoJXUpXG4iLAogCQkgICAgICAgcGNpX25hbWUoZGV2KSwgcG1jICYgUENJX1BNX0NBUF9WRVJfTUFTSyk7CkBAIC0yNzEsMjEgKzMwMiwyMiBAQAogCX0KIAogCS8qIGNoZWNrIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHRoZSBkZXNpcmVkIHN0YXRlICovCi0JaWYgKHN0YXRlID09IFBDSV9EMSB8fCBzdGF0ZSA9PSBQQ0lfRDIpIHsKLQkJaWYgKHN0YXRlID09IFBDSV9EMSAmJiAhKHBtYyAmIFBDSV9QTV9DQVBfRDEpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWVsc2UgaWYgKHN0YXRlID09IFBDSV9EMiAmJiAhKHBtYyAmIFBDSV9QTV9DQVBfRDIpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQorCWlmIChzdGF0ZSA9PSBQQ0lfRDEgJiYgIShwbWMgJiBQQ0lfUE1fQ0FQX0QxKSkKKwkJcmV0dXJuIC1FSU87CisJZWxzZSBpZiAoc3RhdGUgPT0gUENJX0QyICYmICEocG1jICYgUENJX1BNX0NBUF9EMikpCisJCXJldHVybiAtRUlPOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwbSArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOwogCiAJLyogSWYgd2UncmUgaW4gRDMsIGZvcmNlIGVudGlyZSB3b3JkIHRvIDAuCiAJICogVGhpcyBkb2Vzbid0IGFmZmVjdCBQTUVfU3RhdHVzLCBkaXNhYmxlcyBQTUVfRW4sIGFuZAogCSAqIHNldHMgUG93ZXJTdGF0ZSB0byAwLgogCSAqLwotCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPj0gUENJX0QzaG90KQorCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPj0gUENJX0QzaG90KSB7CisJCWlmICghKHBtY3NyICYgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVCkpCisJCQluZWVkX3Jlc3RvcmUgPSAxOwogCQlwbWNzciA9IDA7Ci0JZWxzZSB7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG0gKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKKwl9IGVsc2UgewogCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKIAkJcG1jc3IgfD0gc3RhdGU7CiAJfQpAQCAtMzA4LDYgKzM0MCwyMiBAQAogCQlwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgc3RhdGUpOwogCiAJZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGU7CisKKwkvKiBBY2NvcmRpbmcgdG8gc2VjdGlvbiA1LjQuMSBvZiB0aGUgIlBDSSBCVVMgUE9XRVIgTUFOQUdFTUVOVAorCSAqIElOVEVSRkFDRSBTUEVDSUZJQ0FUSU9OLCBSRVYuIDEuMiIsIGEgZGV2aWNlIHRyYW5zaXRpb25pbmcKKwkgKiBmcm9tIEQzaG90IHRvIEQwIF9tYXlfIHBlcmZvcm0gYW4gaW50ZXJuYWwgcmVzZXQsIHRoZXJlYnkKKwkgKiBnb2luZyB0byAiRDAgVW5pbml0aWFsaXplZCIgcmF0aGVyIHRoYW4gIkQwIEluaXRpYWxpemVkIi4KKwkgKiBGb3IgZXhhbXBsZSwgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiB0aGUgM2M5MDVCIGFuZCB0aGUKKwkgKiAzYzU1NkIgZXhoaWJpdCB0aGlzIGJlaGF2aW91ci4KKwkgKgorCSAqIEF0IGxlYXN0IHNvbWUgbGFwdG9wIEJJT1NlbiAoZS5nLiB0aGUgVGhpbmtwYWQgVDIxKSBsZWF2ZQorCSAqIGRldmljZXMgaW4gYSBEM2hvdCBzdGF0ZSBhdCBib290LiAgQ29uc2VxdWVudGx5LCB3ZSBuZWVkIHRvCisJICogcmVzdG9yZSBhdCBsZWFzdCB0aGUgQkFScyBzbyB0aGF0IHRoZSBkZXZpY2Ugd2lsbCBiZQorCSAqIGFjY2Vzc2libGUgdG8gaXRzIGRyaXZlci4KKwkgKi8KKwlpZiAobmVlZF9yZXN0b3JlKQorCQlwY2lfcmVzdG9yZV9iYXJzKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk0LDggKzQ0MiwxMSBAQAogewogCWludCBlcnI7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QwKTsKLQlpZiAoKGVyciA9IHBjaWJpb3NfZW5hYmxlX2RldmljZShkZXYsIGJhcnMpKSA8IDApCisJZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CisJaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FSU8pCisJCXJldHVybiBlcnI7CisJZXJyID0gcGNpYmlvc19lbmFibGVfZGV2aWNlKGRldiwgYmFycyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIDA7CiB9CkBAIC03NDcsNiArNzk4LDMxIEBACiAJfQogfQogCisvKioKKyAqIHBjaV9pbnR4IC0gZW5hYmxlcy9kaXNhYmxlcyBQQ0kgSU5UeCBmb3IgZGV2aWNlIGRldgorICogQGRldjogdGhlIFBDSSBkZXZpY2UgdG8gb3BlcmF0ZSBvbgorICogQGVuYWJsZTogYm9vbGVhbgorICoKKyAqIEVuYWJsZXMvZGlzYWJsZXMgUENJIElOVHggZm9yIGRldmljZSBkZXYKKyAqLwordm9pZAorcGNpX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBlbmFibGUpCit7CisJdTE2IHBjaV9jb21tYW5kLCBuZXc7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKKworCWlmIChlbmFibGUpIHsKKwkJbmV3ID0gcGNpX2NvbW1hbmQgJiB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCX0gZWxzZSB7CisJCW5ldyA9IHBjaV9jb21tYW5kIHwgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCX0KKworCWlmIChuZXcgIT0gcGNpX2NvbW1hbmQpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBuZXcpOworCX0KK30KKwogI2lmbmRlZiBIQVZFX0FSQ0hfUENJX1NFVF9ETUFfTUFTSwogLyoKICAqIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGFyY2gtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCkBAIC04MDksNiArODg1LDcgQEAKIEVYUE9SVF9TWU1CT0woaXNhX2JyaWRnZSk7CiAjZW5kaWYKIAorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3Jlc3RvcmVfYmFycyk7CiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfZGV2aWNlX2JhcnMpOwogRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9kaXNhYmxlX2RldmljZSk7CkBAIC04MjMsNiArOTAwLDcgQEAKIEVYUE9SVF9TWU1CT0wocGNpX3NldF9tYXN0ZXIpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X213aSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9td2kpOworRVhQT1JUX1NZTUJPTF9HUEwocGNpX2ludHgpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X2RtYV9tYXNrKTsKIEVYUE9SVF9TWU1CT0wocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKTsKIEVYUE9SVF9TWU1CT0wocGNpX2Fzc2lnbl9yZXNvdXJjZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaCBiL2RyaXZlcnMvcGNpL3BjaS5oCmluZGV4IGQwMDE2OGIuLmQzZjNkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5oCkBAIC0yOSw3ICsyOSw2IEBACiAjZW5kaWYKIAogLyogRnVuY3Rpb25zIGZvciBQQ0kgSG90cGx1ZyBkcml2ZXJzIHRvIHVzZSAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICogcGNpX2FkZF9uZXdfYnVzKHN0cnVjdCBwY2lfYnVzICpwYXJlbnQsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBidXNucik7CiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9kb19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIGV4dGVybiBpbnQgcGNpX3JlbW92ZV9kZXZpY2Vfc2FmZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHBjaV9tYXhfYnVzbnIodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaWRzIGIvZHJpdmVycy9wY2kvcGNpLmlkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyZWYxZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaWRzCisrKyAvZGV2L251bGwKQEAgLTEsMTAxODAgKzAsMCBAQAotIwotIwlMaXN0IG9mIFBDSSBJRCdzCi0jCi0jCU1haW50YWluZWQgYnkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+IGFuZCBvdGhlciB2b2x1bnRlZXJzIGZyb20gdGhlCi0jCUxpbnV4IFBDSSBJRCdzIFByb2plY3QgYXQgaHR0cDovL3BjaWlkcy5zZi5uZXQvLiBOZXcgZGF0YSBhcmUgYWx3YXlzCi0jCXdlbGNvbWUgKGlmIHRoZXkgYXJlIGFjY3VyYXRlKSwgd2UncmUgZWFnZXJseSBleHBlY3RpbmcgbmV3IGVudHJpZXMsCi0jCXNvIGlmIHlvdSBoYXZlIGFueXRoaW5nIHRvIGNvbnRyaWJ1dGUsIHBsZWFzZSB2aXNpdCB0aGUgaG9tZSBwYWdlIG9yCi0jCXNlbmQgYSBkaWZmIC11IGFnYWluc3QgdGhlIG1vc3QgcmVjZW50IHBjaS5pZHMgdG8gcGNpLWlkc0B1Y3cuY3ouCi0jCi0jCURhaWx5IHNuYXBzaG90IG9uIFR1ZSAyMDA1LTAzLTA4IDEwOjExOjQ4Ci0jCi0KLSMgVmVuZG9ycywgZGV2aWNlcyBhbmQgc3Vic3lzdGVtcy4gUGxlYXNlIGtlZXAgc29ydGVkLgotCi0jIFN5bnRheDoKLSMgdmVuZG9yICB2ZW5kb3JfbmFtZQotIwlkZXZpY2UgIGRldmljZV9uYW1lCQkJCTwtLSBzaW5nbGUgdGFiCi0jCQlzdWJ2ZW5kb3Igc3ViZGV2aWNlICBzdWJzeXN0ZW1fbmFtZQk8LS0gdHdvIHRhYnMKLQotMDAwMCAgR2FtbWFncmFwaHgsIEluYy4KLTAwMWEgIEFzY2VuZCBDb21tdW5pY2F0aW9ucywgSW5jLgotMDAzMyAgUGFyYWR5bmUgY29ycC4KLTAwM2QgIExvY2toZWVkIE1hcnRpbi1NYXJpZXR0YSBDb3JwCi0jIFJlYWwgVEpOIElEIGlzIGUxNTksIGJ1dCB0aGV5IGdvdCBpdCB3cm9uZyBzZXZlcmFsIHRpbWVzIC0tbWoKLTAwNTkgIFRpZ2VyIEpldCBOZXR3b3JrIEluYy4gKFdyb25nIElEKQotMDA3MCAgSGF1cHBhdWdlIGNvbXB1dGVyIHdvcmtzIEluYy4KLQk0MDAwICBXaW5UViBQVlItMzUwCi0JNDAwMSAgV2luVFYgUFZSLTI1MCAodjEpCi0JNDAwOSAgV2luVFYgUFZSLTI1MAotCTQ4MDEgIFdpblRWIFBWUi0yNTAgTUNFCi0wMDcxICBOZWJ1bGEgRWxlY3Ryb25pY3MgTHRkLgotMDA5NSAgU2lsaWNvbiBJbWFnZSwgSW5jLiAoV3JvbmcgSUQpCi0JMDY4MCAgVWx0cmEgQVRBLzEzMyBJREUgUkFJRCBDT05UUk9MTEVSIENBUkQKLTAxMDAgIE5jaXBoZXIgQ29ycCBMdGQKLSMgMDE4YSBpcyBub3QgTGV2ZWxPbmUgYnV0IHRoZXJlIGlzIGEgYm9hcmQgbWlzcHJvZ3JhbW1lZAotMDE4YSAgTGV2ZWxPbmUKLQkwMTA2ICBGUEMtMDEwNlRYIG1pc3Byb2dyYW1tZWQgW1JUTDgxeHhdCi0jIDAyMWIgaXMgbm90IENvbXBhcSBidXQgdGhlcmUgaXMgYSBib2FyZCBtaXNwcm9ncmFtbWVkCi0wMjFiICBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24KLQk4MTM5ICBITkUtMzAwIChSZWFsVGVrIFJUTDgxMzljKSBbaVBhcSBOZXR3b3JraW5nXQotIyBodHRwOi8vd3d3LmRhdmljb20uY29tLnR3LwotMDI5MSAgRGF2aWNvbSBTZW1pY29uZHVjdG9yLCBJbmMuCi0JODIxMiAgRE05MTAyQShETTkxMDJBRSwgU005MTAyQUYpIEV0aGVybmV0IDEwMC8xMCBNQml0KFJldiA0MCkKLSMgU3BlZWRTdHJlYW0gaXMgRWZmaWNpZW50IE5ldHdvcmtzLCBJbmMsIGEgU2llbWVucyBDb21wYW55Ci0wMmFjICBTcGVlZFN0cmVhbQotCTEwMTIgIDEwMTIgUENNQ0lBIDEwLzEwMCBFdGhlcm5ldCBDYXJkIFtSVEw4MXh4XQotMDM1NyAgVFRUZWNoIEFHCi0JMDAwYSAgVFRQLU1vbml0b3JpbmcgQ2FyZCBWMi4wCi0wNDMyICBTQ00gTWljcm9zeXN0ZW1zLCBJbmMuCi0JMDAwMSAgUGx1dG8yIERWQi1UIFJlY2VpdmVyIGZvciBQQ01DSUEgW0Vhc3lXYXRjaCBNb2JpbFNldF0KLTA1ZTMgIEN5YmVyRG9vcgotCTA3MDEgIENCRDUxNgotMDY3NSAgRHluYWxpbmsKLQkxNzAwICBJUzY0UEggSVNETiBBZGFwdGVyCi0JMTcwMiAgSVM2NFBIIElTRE4gQWRhcHRlcgotIyBXcm9uZyBJRCB1c2VkIGluIHN1YnN5c3RlbSBJRCBvZiBWSUEgVVNCIGNvbnRyb2xsZXJzLgotMDkyNSAgVklBIFRlY2hub2xvZ2llcywgSW5jLiAoV3JvbmcgSUQpCi0wOWMxICBBcnJpcwotCTA3MDQgIENNIDIwMEUgQ2FibGUgTW9kZW0KLTBhODkgIEJSRUEgVGVjaG5vbG9naWVzIEluYwotMGI0OSAgQVNDSUkgQ29ycG9yYXRpb24KLSMgc2VlIGh0dHA6Ly9ob21lcGFnZTEubmlmdHkuY29tL21jbi9sYWIvbWFjaGluZXMvdHJhbmNlX3ZpYnJhdG9yL3VzYnZpZXcudmliLnR4dAotCTA2NGYgIFRyYW5jZSBWaWJyYXRvcgotMGUxMSAgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0JMDAwMSAgUENJIHRvIEVJU0EgQnJpZGdlCi0JMDAwMiAgUENJIHRvIElTQSBCcmlkZ2UKLQkwMDQ2ICBTbWFydCBBcnJheSA2NHh4Ci0JCTBlMTEgNDA5YSAgU21hcnQgQXJyYXkgNjQxCi0JCTBlMTEgNDA5YiAgU21hcnQgQXJyYXkgNjQyCi0JCTBlMTEgNDA5YyAgU21hcnQgQXJyYXkgNjQwMAotCQkwZTExIDQwOWQgIFNtYXJ0IEFycmF5IDY0MDAgRU0KLQkwMDQ5ICBOQzcxMzIgR2lnYWJpdCBVcGdyYWRlIE1vZHVsZQotCTAwNGEgIE5DNjEzNiBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0JMDA3YyAgTkM3NzcwIDEwMDBCYXNlVFgKLQkwMDdkICBOQzY3NzAgMTAwMEJhc2VUWAotCTAwODUgIE5DNzc4MCAxMDAwQmFzZVRYCi0JMDBiYiAgTkM3NzYwCi0JMDBjYSAgTkM3NzcxCi0JMDBjYiAgTkM3NzgxCi0JMDBjZiAgTkM3NzcyCi0JMDBkMCAgTkM3NzgyCi0JMDBkMSAgTkM3NzgzCi0JMDBlMyAgTkM3NzYxCi0JMDUwOCAgTmV0ZWxsaWdlbnQgNC8xNiBUb2tlbiBSaW5nCi0JMTAwMCAgVHJpZmxleC9QZW50aXVtIEJyaWRnZSwgTW9kZWwgMTAwMAotCTIwMDAgIFRyaWZsZXgvUGVudGl1bSBCcmlkZ2UsIE1vZGVsIDIwMDAKLQkzMDMyICBRVmlzaW9uIDEyODAvcAotCTMwMzMgIFFWaXNpb24gMTI4MC9wCi0JMzAzNCAgUVZpc2lvbiAxMjgwL3AKLQk0MDAwICA0MDAwIFtUcmlmbGV4XQotCTQwMzAgIFNNQVJULTIvUAotCTQwMzEgIFNNQVJULTJTTAotCTQwMzIgIFNtYXJ0IEFycmF5IDMyMDAKLQk0MDMzICBTbWFydCBBcnJheSAzMTAwRVMKLQk0MDM0ICBTbWFydCBBcnJheSAyMjEKLQk0MDQwICBJbnRlZ3JhdGVkIEFycmF5Ci0JNDA0OCAgQ29tcGFxIFJhaWQgTEMyCi0JNDA1MCAgU21hcnQgQXJyYXkgNDIwMAotCTQwNTEgIFNtYXJ0IEFycmF5IDQyNTBFUwotCTQwNTggIFNtYXJ0IEFycmF5IDQzMQotCTQwNzAgIFNtYXJ0IEFycmF5IDUzMDAKLQk0MDgwICBTbWFydCBBcnJheSA1aQotCTQwODIgIFNtYXJ0IEFycmF5IDUzMgotCTQwODMgIFNtYXJ0IEFycmF5IDUzMTIKLQk0MDkxICBTbWFydCBBcnJheSA2aQotCTQwOWEgIFNtYXJ0IEFycmF5IDY0MQotCTQwOWIgIFNtYXJ0IEFycmF5IDY0MgotCTQwOWMgIFNtYXJ0IEFycmF5IDY0MDAKLQk0MDlkICBTbWFydCBBcnJheSA2NDAwIEVNCi0JNjAxMCAgSG90UGx1ZyBQQ0kgQnJpZGdlIDYwMTAKLQk3MDIwICBVU0IgQ29udHJvbGxlcgotCWEwZWMgIEZpYnJlIENoYW5uZWwgSG9zdCBDb250cm9sbGVyCi0JYTBmMCAgQWR2YW5jZWQgU3lzdGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlcgotCWEwZjMgIFRyaWZsZXggUENJIHRvIElTQSBCcmlkZ2UKLQlhMGY3ICBQQ0kgSG90cGx1ZyBDb250cm9sbGVyCi0JCTgwODYgMDAyYSAgUENJIEhvdHBsdWcgQ29udHJvbGxlciBBCi0JCTgwODYgMDAyYiAgUENJIEhvdHBsdWcgQ29udHJvbGxlciBCCi0JYTBmOCAgWkZNaWNybyBDaGlwc2V0IFVTQgotCWEwZmMgIEZpYnJlQ2hhbm5lbCBIQkEgVGFjaHlvbgotCWFlMTAgIFNtYXJ0LTIvUCBSQUlEIENvbnRyb2xsZXIKLQkJMGUxMSA0MDMwICBTbWFydC0yL1AgQXJyYXkgQ29udHJvbGxlcgotCQkwZTExIDQwMzEgIFNtYXJ0LTJTTCBBcnJheSBDb250cm9sbGVyCi0JCTBlMTEgNDAzMiAgU21hcnQgQXJyYXkgQ29udHJvbGxlcgotCQkwZTExIDQwMzMgIFNtYXJ0IDMxMDBFUyBBcnJheSBDb250cm9sbGVyCi0JYWUyOSAgTUlTLUwKLQlhZTJhICBNUEMKLQlhZTJiICBNSVMtRQotCWFlMzEgIFN5c3RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQlhZTMyICBOZXRlbGxpZ2VudCAxMC8xMDAgVFggUENJIFVUUAotCWFlMzMgIFRyaWZsZXggRHVhbCBFSURFIENvbnRyb2xsZXIKLQlhZTM0ICBOZXRlbGxpZ2VudCAxMCBUIFBDSSBVVFAKLQlhZTM1ICBJbnRlZ3JhdGVkIE5ldEZsZXgtMy9QCi0JYWU0MCAgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUAotCWFlNDMgIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUAotCWFlNjkgIENFVFVTLUwKLQlhZTZjICBOb3J0aHN0YXIKLQlhZTZkICBOb3J0aFN0YXIgQ1BVIHRvIFBDSSBCcmlkZ2UKLQliMDExICBOZXRlbGxpZ2VudCAxMC8xMDAgVFggRW1iZWRkZWQgVVRQCi0JYjAxMiAgTmV0ZWxsaWdlbnQgMTAgVC8yIFBDSSBVVFAvQ29heAotCWIwMWUgIE5DMzEyMCBGYXN0IEV0aGVybmV0IE5JQwotCWIwMWYgIE5DMzEyMiBGYXN0IEV0aGVybmV0IE5JQwotCWIwMmYgIE5DMTEyMCBFdGhlcm5ldCBOSUMKLQliMDMwICBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQCi0JYjA0YSAgMTAvMTAwIFRYIFBDSSBJbnRlbCBXT0wgVVRQIENvbnRyb2xsZXIKLQliMDYwICBTbWFydCBBcnJheSA1MzAwIENvbnRyb2xsZXIKLQliMGM2ICBOQzMxNjEgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGM3ICBOQzMxNjAgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGQ3ICBOQzMxMjEgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGRkICBOQzMxMzEgRmFzdCBFdGhlcm5ldCBOSUMKLQliMGRlICBOQzMxMzIgRmFzdCBFdGhlcm5ldCBNb2R1bGUKLQliMGRmICBOQzYxMzIgR2lnYWJpdCBNb2R1bGUKLQliMGUwICBOQzYxMzMgR2lnYWJpdCBNb2R1bGUKLQliMGUxICBOQzMxMzMgRmFzdCBFdGhlcm5ldCBNb2R1bGUKLQliMTIzICBOQzYxMzQgR2lnYWJpdCBOSUMKLQliMTM0ICBOQzMxNjMgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTNjICBOQzMxNjIgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTQ0ICBOQzMxMjMgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTYzICBOQzMxMzQgRmFzdCBFdGhlcm5ldCBOSUMKLQliMTY0ICBOQzMxNjUgRmFzdCBFdGhlcm5ldCBVcGdyYWRlIE1vZHVsZQotCWIxNzggIFNtYXJ0IEFycmF5IDVpLzUzMgotCQkwZTExIDQwODAgIFNtYXJ0IEFycmF5IDVpCi0JCTBlMTEgNDA4MiAgU21hcnQgQXJyYXkgNTMyCi0JCTBlMTEgNDA4MyAgU21hcnQgQXJyYXkgNTMxMgotCWIxYTQgIE5DNzEzMSBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0jIEhQIE1lbW9yeSBIb3QtUGx1ZyBDb250cm9sbGVyCi0JYjIwMCAgTWVtb3J5IEhvdC1QbHVnIENvbnRyb2xsZXIKLQliMjAzICBJbnRlZ3JhdGVkIExpZ2h0cyBPdXQgQ29udHJvbGxlcgotCWIyMDQgIEludGVncmF0ZWQgTGlnaHRzIE91dCAgUHJvY2Vzc29yCi0JZjEzMCAgTmV0RmxleC0zL1AgVGh1bmRlckxBTiAxLjAKLQlmMTUwICBOZXRGbGV4LTMvUCBUaHVuZGVyTEFOIDIuMwotMGU1NSAgSGFTb1RlYyBHbWJICi0jIEZvcm1lcmx5IE5DUgotMTAwMCAgTFNJIExvZ2ljIC8gU3ltYmlvcyBMb2dpYwotCTAwMDEgIDUzYzgxMAotCQkxMDAwIDEwMDAgIExTSTUzQzgxMEFFIFBDSSB0byBTQ1NJIEkvTyBQcm9jZXNzb3IKLQkwMDAyICA1M2M4MjAKLQkwMDAzICA1M2M4MjUKLQkJMTAwMCAxMDAwICBMU0k1M0M4MjVBRSBQQ0kgdG8gU0NTSSBJL08gUHJvY2Vzc29yIChVbHRyYSBXaWRlKQotCTAwMDQgIDUzYzgxNQotCTAwMDUgIDUzYzgxMEFQCi0JMDAwNiAgNTNjODYwCi0JCTEwMDAgMTAwMCAgTFNJNTNDODYwRSBQQ0kgdG8gVWx0cmEgU0NTSSBJL08gUHJvY2Vzc29yCi0JMDAwYSAgNTNjMTUxMAotCQkxMDAwIDEwMDAgIExTSTUzQzE1MTAgUENJIHRvIER1YWwgQ2hhbm5lbCBXaWRlIFVsdHJhMiBTQ1NJIENvbnRyb2xsZXIgKE5vbmludGVsbGlnZW50IG1vZGUpCi0JMDAwYiAgNTNDODk2Lzg5NwotCQkwZTExIDYwMDQgIEVPQjAwMyBTZXJpZXMgU0NTSSBob3N0IGFkYXB0ZXIKLQkJMTAwMCAxMDAwICBMU0k1M0M4OTYvNyBQQ0kgdG8gRHVhbCBDaGFubmVsIFVsdHJhMiBTQ1NJIE11bHRpZnVuY3Rpb24gQ29udHJvbGxlcgotCQkxMDAwIDEwMTAgIExTSTIyOTEwIFBDSSB0byBEdWFsIENoYW5uZWwgVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyCi0JCTEwMDAgMTAyMCAgTFNJMjEwMDIgUENJIHRvIER1YWwgQ2hhbm5lbCBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIKLSMgbXVsdGlmdW5jdGlvbiBQQ0kgY2FyZDogRHVhbCBVMlcgU0NTSSwgZHVhbCAxMC8xMDBUWCwgZ3JhcGhpY3MKLQkJMTNlOSAxMDAwICA2MjIxTC00VQotCTAwMGMgIDUzYzg5NQotCQkxMDAwIDEwMTAgIExTSTg5NTFVIFBDSSB0byBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIKLQkJMTAwMCAxMDIwICBMU0k4OTUyVSBQQ0kgdG8gVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyCi0JCTFkZTEgMzkwNiAgREMtMzkwVTJCIFNDU0kgYWRhcHRlcgotCQkxZGUxIDM5MDcgIERDLTM5MFUyVwotCTAwMGQgIDUzYzg4NQotCTAwMGYgIDUzYzg3NQotCQkwZTExIDcwMDQgIEVtYmVkZGVkIFVsdHJhIFdpZGUgU0NTSSBDb250cm9sbGVyCi0JCTEwMDAgMTAwMCAgTFNJNTNDODc2L0UgUENJIHRvIER1YWwgQ2hhbm5lbCBTQ1NJIENvbnRyb2xsZXIKLQkJMTAwMCAxMDEwICBMU0kyMjgwMSBQQ0kgdG8gRHVhbCBDaGFubmVsIFVsdHJhIFNDU0kgaG9zdCBhZGFwdGVyCi0JCTEwMDAgMTAyMCAgTFNJMjI4MDIgUENJIHRvIER1YWwgQ2hhbm5lbCBVbHRyYSBTQ1NJIGhvc3QgYWRhcHRlcgotCQkxMDkyIDg3NjAgIEZpcmVQb3J0IDQwIER1YWwgU0NTSSBDb250cm9sbGVyCi0JCTFkZTEgMzkwNCAgREMzOTBGL1UgVWx0cmEgV2lkZSBTQ1NJIEFkYXB0ZXIKLQkJNGM1MyAxMDAwICBDQzcvQ1I3L0NQNy9WQzcvVlA3L1ZSNyBtYWluYm9hcmQKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JMDAxMCAgNTNDMTUxMAotCQkwZTExIDQwNDAgIEludGVncmF0ZWQgQXJyYXkgQ29udHJvbGxlcgotCQkwZTExIDQwNDggIFJBSUQgTEMyIENvbnRyb2xsZXIKLQkJMTAwMCAxMDAwICA1M0MxNTEwIFBDSSB0byBEdWFsIENoYW5uZWwgV2lkZSBVbHRyYTIgU0NTSSBDb250cm9sbGVyIChJbnRlbGxpZ2VudCBtb2RlKQotCTAwMTIgIDUzYzg5NWEKLQkJMTAwMCAxMDAwICBMU0k1M0M4OTVBIFBDSSB0byBVbHRyYTIgU0NTSSBDb250cm9sbGVyCi0JMDAxMyAgNTNjODc1YQotCQkxMDAwIDEwMDAgIExTSTUzQzg3NUEgUENJIHRvIFVsdHJhIFNDU0kgQ29udHJvbGxlcgotCTAwMjAgIDUzYzEwMTAgVWx0cmEzIFNDU0kgQWRhcHRlcgotCQkxMDAwIDEwMDAgIExTSTUzQzEwMTAtMzMgUENJIHRvIER1YWwgQ2hhbm5lbCBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkJMWRlMSAxMDIwICBEQy0zOTBVM1cKLQkwMDIxICA1M2MxMDEwIDY2TUh6ICBVbHRyYTMgU0NTSSBBZGFwdGVyCi0JCTEwMDAgMTAwMCAgTFNJNTNDMTAwMC8xMDAwUi8xMDEwUi8xMDEwLTY2IFBDSSB0byBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkJMTAwMCAxMDEwICBBc3VzIFRSLURMUyBvbmJvYXJkIDUzQzEwMTAtNjYKLQkJMTI0YiAxMDcwICBQTUMtVVNDU0kzCi0JCTRjNTMgMTA4MCAgQ1Q4IG1haW5ib2FyZAotCQk0YzUzIDEzMDAgIFAwMTcgbWV6emFuaW5lICgzMi1iaXQgUE1DKQotCQk0YzUzIDEzMTAgIFAwMTcgbWV6emFuaW5lICg2NC1iaXQgUE1DKQotCTAwMzAgIDUzYzEwMzAgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkJMTAyOCAwMTIzICBQb3dlckVkZ2UgMjYwMAotCQkxMDI4IDAxNGEgIFBvd2VyRWRnZSAxNzUwCi0JCTEwMjggMDE2YyAgUG93ZXJFZGdlIDE4NTAgTVBUIEZ1c2lvbiBTQ1NJL1JBSUQgKFBlcmMgNCkKLQkJMTAyOCAwMTgzICBQb3dlckVkZ2UgMTgwMAotCQkxMDI4IDEwMTAgIExTSSBVMzIwIFNDU0kgQ29udHJvbGxlcgotCTAwMzEgIDUzYzEwMzBaQyBQQ0ktWCBGdXNpb24tTVBUIER1YWwgVWx0cmEzMjAgU0NTSQotCTAwMzIgIDUzYzEwMzUgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkJMTAwMCAxMDAwICBMU0k1M0MxMDIwLzEwMzAgUENJLVggdG8gVWx0cmEzMjAgU0NTSSBDb250cm9sbGVyCi0JMDAzMyAgMTAzMFpDXzUzYzEwMzUgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkwMDQwICA1M2MxMDM1IFBDSS1YIEZ1c2lvbi1NUFQgRHVhbCBVbHRyYTMyMCBTQ1NJCi0JCTEwMDAgMDAzMyAgTWVnYVJBSUQgU0NTSSAzMjAtMlhSCi0JCTEwMDAgMDA2NiAgTWVnYVJBSUQgU0NTSSAzMjAtMlhSV1MKLQkwMDQxICA1M0MxMDM1WkMgUENJLVggRnVzaW9uLU1QVCBEdWFsIFVsdHJhMzIwIFNDU0kKLQkwMDhmICA1M2M4NzVKCi0JCTEwOTIgODAwMCAgRmlyZVBvcnQgNDAgU0NTSSBDb250cm9sbGVyCi0JCTEwOTIgODc2MCAgRmlyZVBvcnQgNDAgRHVhbCBTQ1NJIEhvc3QgQWRhcHRlcgotCTA0MDcgIE1lZ2FSQUlECi0JCTEwMDAgMDUzMCAgTWVnYVJBSUQgNTMwIFNDU0kgMzIwLTBYIFJBSUQgQ29udHJvbGxlcgotCQkxMDAwIDA1MzEgIE1lZ2FSQUlEIDUzMSBTQ1NJIDMyMC00WCBSQUlEIENvbnRyb2xsZXIKLQkJMTAwMCAwNTMyICBNZWdhUkFJRCA1MzIgU0NTSSAzMjAtMlggUkFJRCBDb250cm9sbGVyCi0JCTEwMjggMDUzMSAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDQvUUMKLQkJMTAyOCAwNTMzICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgNC9RQwotCQk4MDg2IDA1MzAgIE1lZ2FSQUlEIEludGVsIFJBSUQgQ29udHJvbGxlciBTUkNaQ1JYCi0JCTgwODYgMDUzMiAgTWVnYVJBSUQgSW50ZWwgUkFJRCBDb250cm9sbGVyIFNSQ1U0MlgKLQkwNDA4ICBNZWdhUkFJRAotCQkxMDAwIDAwMDEgIE1lZ2FSQUlEIFNDU0kgMzIwLTFFIFJBSUQgQ29udHJvbGxlcgotCQkxMDAwIDAwMDIgIE1lZ2FSQUlEIFNDU0kgMzIwLTJFIFJBSUQgQ29udHJvbGxlcgotCQkxMDI1IDAwNGQgIE1lZ2FSQUlEIEFDRVIgUk9NQi0yRSBSQUlEIENvbnRyb2xsZXIKLQkJMTAyOCAwMDAxICBQb3dlckVkZ2UgUkFJRCBDb250cm9sbGVyIFBFUkM0ZS9TQwotCQkxMDI4IDAwMDIgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgUEVSQzRlL0RDCi0JCTE3MzQgMTA2NSAgRlNDIE1lZ2FSQUlEIFBDSSBFeHByZXNzIFJPTUIKLQkJODA4NiAwMDAyICBNZWdhUkFJRCBJbnRlbCBSQUlEIENvbnRyb2xsZXIgU1JDVTQyRQotCTA0MDkgIE1lZ2FSQUlECi0JCTEwMDAgMzAwNCAgTWVnYVJBSUQgU0FUQSAzMDAtNFggUkFJRCBDb250cm9sbGVyCi0JCTEwMDAgMzAwOCAgTWVnYVJBSUQgU0FUQSAzMDAtOFggUkFJRCBDb250cm9sbGVyCi0JCTgwODYgMzAwOCAgTWVnYVJBSUQgUkFJRCBDb250cm9sbGVyIFNSQ1MyOFgKLQkJODA4NiAzNDMxICBNZWdhUkFJRCBSQUlEIENvbnRyb2xsZXIgQWxpZWYgU1JPTUJVNDJFCi0JCTgwODYgMzQ5OSAgTWVnYVJBSUQgUkFJRCBDb250cm9sbGVyIEhhcndpY2ggU1JPTUJVNDJFCi0JMDYyMSAgRkM5MDkgRmlicmUgQ2hhbm5lbCBBZGFwdGVyCi0JMDYyMiAgRkM5MjkgRmlicmUgQ2hhbm5lbCBBZGFwdGVyCi0JCTEwMDAgMTAyMCAgNDQ5MjkgTyBEdWFsIEZpYnJlIENoYW5uZWwgY2FyZAotCTA2MjMgIEZDOTI5IExBTgotCTA2MjQgIEZDOTE5IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCTA2MjUgIEZDOTE5IExBTgotCTA2MjYgIEZDOTI5WCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkJMTAwMCAxMDEwICA3MjAyLVhQLUxDIER1YWwgRmlicmUgQ2hhbm5lbCBjYXJkCi0JMDYyNyAgRkM5MjlYIExBTgotCTA2MjggIEZDOTE5WCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkwNjI5ICBGQzkxOVggTEFOCi0JMDcwMSAgODNDODg1IE5UNTAgRGlnaXRhbFNjYXBlIEZhc3QgRXRoZXJuZXQKLQkwNzAyICBZZWxsb3dmaW4gRy1OSUMgZ2lnYWJpdCBldGhlcm5ldAotCQkxMzE4IDAwMDAgIFBFSTEwMFgKLQkwODA0ICBTQTIwMTAKLQkwODA1ICBTQTIwMTBaQwotCTA4MDYgIFNBMjAyMAotCTA4MDcgIFNBMjAyMFpDCi0JMDkwMSAgNjFDMTAyCi0JMTAwMCAgNjNDODE1Ci0JMTk2MCAgTWVnYVJBSUQKLQkJMTAwMCAwNTE4ICBNZWdhUkFJRCA1MTggU0NTSSAzMjAtMiBDb250cm9sbGVyCi0JCTEwMDAgMDUyMCAgTWVnYVJBSUQgNTIwIFNDU0kgMzIwLTEgQ29udHJvbGxlcgotCQkxMDAwIDA1MjIgIE1lZ2FSQUlEIDUyMiBpNCAxMzMgUkFJRCBDb250cm9sbGVyCi0JCTEwMDAgMDUyMyAgTWVnYVJBSUQgU0FUQSAxNTAtNiBSQUlEIENvbnRyb2xsZXIKLQkJMTAwMCA0NTIzICBNZWdhUkFJRCBTQVRBIDE1MC00IFJBSUQgQ29udHJvbGxlcgotCQkxMDAwIGE1MjAgIE1lZ2FSQUlEIFpDUiBTQ1NJIDMyMC0wIENvbnRyb2xsZXIKLQkJMTAyOCAwNTE4ICBNZWdhUkFJRCA1MTggREVMTCBQRVJDIDQvREMgUkFJRCBDb250cm9sbGVyCi0JCTEwMjggMDUyMCAgTWVnYVJBSUQgNTIwIERFTEwgUEVSQyA0L1NDIFJBSUQgQ29udHJvbGxlcgotCQkxMDI4IDA1MzEgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0L1FDCi0JCTEwMjggMDUzMyAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDQvUUMKLQkJODA4NiAwNTIwICBNZWdhUkFJRFJBSUQgQ29udHJvbGxlciBTUkNVNDFMCi0JCTgwODYgMDUyMyAgTWVnYVJBSUQgUkFJRCBDb250cm9sbGVyIFNSQ1MxNgotMTAwMSAgS29sdGVyIEVsZWN0cm9uaWMKLQkwMDEwICBQQ0kgMTYxNiBNZWFzdXJlbWVudCBjYXJkIHdpdGggMzIgZGlnaXRhbCBJL08gbGluZXMKLQkwMDExICBPUFRPLVBDSSBPcHRvLUlzb2xhdGVkIGRpZ2l0YWwgSS9PIGJvYXJkCi0JMDAxMiAgUENJLUFEL0RBIEFuYWxvZ3VlIEkvTyBib2FyZAotCTAwMTMgIFBDSS1PUFRPLVJFTEFJUyBEaWdpdGFsIEkvTyBib2FyZCB3aXRoIHJlbGF5IG91dHB1dHMKLQkwMDE0ICBQQ0ktQ291bnRlci9UaW1lciBDb3VudGVyIFRpbWVyIGJvYXJkCi0JMDAxNSAgUENJLURBQzQxNiBBbmFsb2d1ZSBvdXRwdXQgYm9hcmQKLQkwMDE2ICBQQ0ktTUZCIEFuYWxvZ3VlIEkvTyBib2FyZAotCTAwMTcgIFBST1RPLTMgUENJIFByb3RvdHlwaW5nIGJvYXJkCi0JOTEwMCAgSU5JLTkxMDAvOTEwMFcgU0NTSSBIb3N0Ci0xMDAyICBBVEkgVGVjaG5vbG9naWVzIEluYwotCTMxNTAgIE0yNCAxUCBbUmFkZW9uIE1vYmlsaXR5IFg2MDBdCi0JMzE1NCAgTTI0IDFUIFtGaXJlR0wgTTI0IEdMXQotCTNlNTAgIFJWMzgwIDB4M2U1MCBbUmFkZW9uIFg2MDBdCi0JM2U1NCAgUlYzODAgMHgzZTU0IFtGaXJlR0wgVjMyMDBdCi0JM2U3MCAgUlYzODAgW1JhZGVvbiBYNjAwXSBTZWNvbmRhcnkKLQk0MTM2ICBSYWRlb24gSUdQIDMyMCBNCi0JNDEzNyAgUmFkZW9uIElHUDMzMC8zNDAvMzUwCi0JNDE0NCAgUjMwMCBBRCBbUmFkZW9uIDk1MDAgUHJvXQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zIChjb3JyZWN0aW9uIHRvIGFib3ZlKQotCTQxNDUgIFIzMDAgQUUgW1JhZGVvbiA5NzAwIFByb10KLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucyAob29wcywgY29ycmVjdGlvbiB0byBhYm92ZSkKLQk0MTQ2ICBSMzAwIEFGIFtSYWRlb24gOTcwMCBQcm9dCi0JNDE0NyAgUjMwMCBBRyBbRmlyZUdMIFoxL1gxXQotCTQxNDggIFIzNTAgQUggW1JhZGVvbiA5ODAwXQotCTQxNDkgIFIzNTAgQUkgW1JhZGVvbiA5ODAwXQotCTQxNGEgIFIzNTAgQUogW1JhZGVvbiA5ODAwXQotCTQxNGIgIFIzNTAgQUsgW0ZpcmUgR0wgWDJdCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTUwICBSVjM1MCBBUCBbUmFkZW9uIDk2MDBdCi0JCTEwMDIgMDAwMiAgUjk2MDAgUHJvIHByaW1hcnkgKEFzdXMgT0VNIGZvciBIUCkKLQkJMTAwMiAwMDAzICBSOTYwMCBQcm8gc2Vjb25kYXJ5IChBc3VzIE9FTSBmb3IgSFApCi0JCTE0NTggNDAyNCAgR2lnYS1CeXRlIEdWLVI5NjEyOEQgUHJpbWFyeQotCQkxNDhjIDIwNjQgIFBvd2VyQ29sb3IgUjk2QS1DM04KLQkJMTQ4YyAyMDY2ICBQb3dlckNvbG9yIFI5NkEtQzNOCi0JCTE3NGIgN2MxOSAgU2FwcGhpcmUgQXRsYW50aXMgUmFkZW9uIDk2MDAgUHJvCi0JCTE3NGIgN2MyOSAgR0MtUjk2MDBQUk8gUHJpbWFyeSBbU2FwcGhpcmVdCi0JCTE3ZWUgMjAwMiAgUmFkZW9uIDk2MDAgMjU2TWIgUHJpbWFyeQotCQkxOGJjIDAxMDEgIEdDLVI5NjAwUFJPIFByaW1hcnkKLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucwotCTQxNTEgIFJWMzUwIEFRIFtSYWRlb24gOTYwMF0KLQkJMTA0MyBjMDA0ICBBOTYwMFNFCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTUyICBSVjM1MCBBUiBbUmFkZW9uIDk2MDBdCi0JCTEwMDIgMDAwMiAgUmFkZW9uIDk2MDBYVAotCQkxMDQzIGMwMDIgIFJhZGVvbiA5NjAwIFhUIFRWRAotCQkxNzRiIDdjMjkgIFNhcHBoaXJlIFJhZGVvbiA5NjAwWFQKLQkJMTc4NyA0MDAyICBSYWRlb24gOTYwMCBYVAotCTQxNTMgIFJWMzUwIEFTIFtSYWRlb24gOTYwMCBBU10KLQk0MTU0ICBSVjM1MCBBVCBbRmlyZSBHTCBUMl0KLQk0MTU1ICBSVjM1MCBBVSBbRmlyZSBHTCBUMl0KLQk0MTU2ICBSVjM1MCBBViBbRmlyZSBHTCBUMl0KLQk0MTU3ICBSVjM1MCBBVyBbRmlyZSBHTCBUMl0KLQk0MTU4ICA2ODgwMEFYIFtNYWNoMzJdCi0jIFRoZSBQQ0kgSUQgaXMgdW5yZWxhdGVkIHRvIGFueSBEVkkgb3V0cHV0LgotCTQxNjQgIFIzMDAgQUQgW1JhZGVvbiA5NTAwIFByb10gKFNlY29uZGFyeSkKLSMgTmV3IFBDSSBJRCBpbmZvIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNDE2NSAgUjMwMCBBRSBbUmFkZW9uIDk3MDAgUHJvXSAoU2Vjb25kYXJ5KQotIyBOZXcgUENJIElEIGluZm8gcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTY2ICBSMzAwIEFGIFtSYWRlb24gOTcwMCBQcm9dIChTZWNvbmRhcnkpCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMKLQk0MTY4ICBSYWRlb24gUjM1MCBbUmFkZW9uIDk4MDBdIChTZWNvbmRhcnkpCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMgKGNvcnJlY3Rpb24gdG8gYWJvdmUpCi0JNDE3MCAgUlYzNTAgQVAgW1JhZGVvbiA5NjAwXSAoU2Vjb25kYXJ5KQotCQkxNDU4IDQwMjUgIEdpZ2EtQnl0ZSBHVi1SOTYxMjhEIFNlY29uZGFyeQotCQkxNDhjIDIwNjcgIFBvd2VyQ29sb3IgUjk2QS1DM04gKFNlY29uZGFyeSkKLQkJMTc0YiA3YzI4ICBHQy1SOTYwMFBSTyBTZWNvbmRhcnkgW1NhcHBoaXJlXQotCQkxN2VlIDIwMDMgIFJhZGVvbiA5NjAwIDI1Nk1iIFNlY29uZGFyeQotCQkxOGJjIDAxMDAgIEdDLVI5NjAwUFJPIFNlY29uZGFyeQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zIChjb3JyZWN0aW9uIHRvIGFib3ZlKQotCTQxNzEgIFJWMzUwIEFRIFtSYWRlb24gOTYwMF0gKFNlY29uZGFyeSkKLQkJMTA0MyBjMDA1ICBBOTYwMFNFIChTZWNvbmRhcnkpCi0jIE5ldyBQQ0kgSUQgcHJvdmlkZWQgYnkgQVRJIGRldmVsb3BlciByZWxhdGlvbnMgKGNvcnJlY3Rpb24gdG8gYWJvdmUpCi0JNDE3MiAgUlYzNTAgQVIgW1JhZGVvbiA5NjAwXSAoU2Vjb25kYXJ5KQotCQkxMDAyIDAwMDMgIFJhZGVvbiA5NjAwWFQgKFNlY29uZGFyeSkKLQkJMTA0MyBjMDAzICBBOTYwMFhUIChTZWNvbmRhcnkpCi0JCTE3NGIgN2MyOCAgU2FwcGhpcmUgUmFkZW9uIDk2MDBYVCAoU2Vjb25kYXJ5KQotCQkxNzg3IDQwMDMgIFJhZGVvbiA5NjAwIFhUIChTZWNvbmRhcnkpCi0JNDE3MyAgUlYzNTAgPz8gW1JhZGVvbiA5NTUwXSAoU2Vjb25kYXJ5KQotCTQyMzcgIFJhZGVvbiA3MDAwIElHUAotCTQyNDIgIFIyMDAgQkIgW1JhZGVvbiBBbGwgaW4gV29uZGVyIDg1MDBEVl0KLQkJMTAwMiAwMmFhICBSYWRlb24gODUwMCBBSVcgRFYgRWRpdGlvbgotCTQyNDMgIFIyMDAgQkMgW1JhZGVvbiBBbGwgaW4gV29uZGVyIDg1MDBdCi0JNDMzNiAgUmFkZW9uIE1vYmlsaXR5IFUxCi0JCTEwM2MgMDAyNCAgUGF2aWxpb24gemU0NDAwIGJ1aWx0aW4gVmlkZW8KLQk0MzM3ICBSYWRlb24gSUdQIDMzME0vMzQwTS8zNTBNCi0JCTEwMTQgMDUzYSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gVkdBIGNvbnRyb2xsZXIKLQkJMTAzYyAwODUwICBSYWRlb24gSUdQIDM0NU0KLQk0MzQxICBJWFAxNTAgQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCTQzNDUgIEVIQ0kgVVNCIENvbnRyb2xsZXIKLQk0MzQ3ICBPSENJIFVTQiBDb250cm9sbGVyICMxCi0JNDM0OCAgT0hDSSBVU0IgQ29udHJvbGxlciAjMgotCTQzNDkgIEFUSSBEdWFsIENoYW5uZWwgQnVzIE1hc3RlciBQQ0kgSURFIENvbnRyb2xsZXIKLQk0MzRkICBJWFAgQUMnOTcgTW9kZW0KLQk0MzUzICBBVEkgU01CdXMKLQk0MzU0ICAyMTVDVCBbTWFjaDY0IENUXQotCTQzNTggIDIxMDg4OENYIFtNYWNoNjQgQ1hdCi0JNDM2MyAgQVRJIFNNQnVzCi0JNDM2ZSAgQVRJIDQzNkUgU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JNDM3MiAgQVRJIFNNQnVzCi0JNDM3NiAgU3RhbmRhcmQgRHVhbCBDaGFubmVsIFBDSSBJREUgQ29udHJvbGxlciBBVEkKLQk0Mzc5ICBBVEkgNDM3OSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQk0MzdhICBBVEkgNDM3QSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQk0NDM3ICBSYWRlb24gTW9iaWxpdHkgNzAwMCBJR1AKLQk0NTU0ICAyMTA4ODhFVCBbTWFjaDY0IEVUXQotCTQ2NTQgIE1hY2g2NCBWVAotCTQ3NDIgIDNEIFJhZ2UgUHJvIEFHUCAxWC8yWAotCQkxMDAyIDAwNDAgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDAwNDQgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDAwNjEgIFJhZ2UgUHJvIEFJVyBBR1AgMlgKLQkJMTAwMiAwMDYyICBSYWdlIFBybyBBSVcgQUdQIDJYCi0JCTEwMDIgMDA2MyAgUmFnZSBQcm8gQUlXIEFHUCAyWAotCQkxMDAyIDAwODAgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDAwODQgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDQ3NDIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDAyIDgwMDEgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDI4IDAwODIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDI4IDQwODIgIE9wdGlwbGV4IEdYMSBPbmJvYXJkIERpc3BsYXkgQWRhcHRlcgotCQkxMDI4IDgwODIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQkxMDI4IGMwODIgIFJhZ2UgUHJvIFR1cmJvIEFHUCAyWAotCQk4MDg2IDQxNTIgIFhwZXJ0IDk4RCBBR1AgMlgKLQkJODA4NiA0NjRhICBSYWdlIFBybyBUdXJibyBBR1AgMlgKLQk0NzQ0ICAzRCBSYWdlIFBybyBBR1AgMVgKLQkJMTAwMiA0NzQ0ICBSYWdlIFBybyBUdXJibyBBR1AKLQk0NzQ3ICAzRCBSYWdlIFBybwotCTQ3NDkgIDNEIFJhZ2UgUHJvCi0JCTEwMDIgMDA2MSAgUmFnZSBQcm8gQUlXCi0JCTEwMDIgMDA2MiAgUmFnZSBQcm8gQUlXCi0JNDc0YyAgUmFnZSBYQwotCTQ3NGQgIFJhZ2UgWEwgQUdQIDJYCi0JCTEwMDIgMDAwNCAgWHBlcnQgOTggUlhMIEFHUCAyWAotCQkxMDAyIDAwMDggIFhwZXJ0IDk4IFJYTCBBR1AgMlgKLQkJMTAwMiAwMDgwICBSYWdlIFhMIEFHUCAyWAotCQkxMDAyIDAwODQgIFhwZXJ0IDk4IEFHUCAyWAotCQkxMDAyIDQ3NGQgIFJhZ2UgWEwgQUdQCi0JCTEwMzMgODA2YSAgUmFnZSBYTCBBR1AKLQk0NzRlICBSYWdlIFhDIEFHUAotCQkxMDAyIDQ3NGUgIFJhZ2UgWEMgQUdQCi0JNDc0ZiAgUmFnZSBYTAotCQkxMDAyIDAwMDggIFJhZ2UgWEwKLQkJMTAwMiA0NzRmICBSYWdlIFhMCi0JNDc1MCAgM0QgUmFnZSBQcm8gMjE1R1AKLQkJMTAwMiAwMDQwICBSYWdlIFBybyBUdXJibwotCQkxMDAyIDAwNDQgIFJhZ2UgUHJvIFR1cmJvCi0JCTEwMDIgMDA4MCAgUmFnZSBQcm8gVHVyYm8KLQkJMTAwMiAwMDg0ICBSYWdlIFBybyBUdXJibwotCQkxMDAyIDQ3NTAgIFJhZ2UgUHJvIFR1cmJvCi0JNDc1MSAgM0QgUmFnZSBQcm8gMjE1R1EKLQk0NzUyICBSYWdlIFhMCi0JCTEwMDIgMDAwOCAgUmFnZSBYTAotCQkxMDAyIDQ3NTIgIFJhZ2UgWEwKLQkJMTAwMiA4MDA4ICBSYWdlIFhMCi0JCTEwMjggMDBjZSAgUG93ZXJFZGdlIDE0MDAKLQkJMTAyOCAwMGQxICBQb3dlckVkZ2UgMjU1MAotCQkxMDI4IDAwZDkgIFBvd2VyRWRnZSAyNTAwCi0JCTgwODYgMzQxMSAgU0RTMiBNYWluYm9hcmQKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JNDc1MyAgUmFnZSBYQwotCQkxMDAyIDQ3NTMgIFJhZ2UgWEMKLQk0NzU0ICAzRCBSYWdlIEkvSUkgMjE1R1QgW01hY2g2NCBHVF0KLQk0NzU1ICAzRCBSYWdlIElJKyAyMTVHVEIgW01hY2g2NCBHVEJdCi0JNDc1NiAgM0QgUmFnZSBJSUMgMjE1SUlDIFtNYWNoNjQgR1QgSUlDXQotCQkxMDAyIDQ3NTYgIFJhZ2UgSUlDCi0JNDc1NyAgM0QgUmFnZSBJSUMgQUdQCi0JCTEwMDIgNDc1NyAgUmFnZSBJSUMgQUdQCi0JCTEwMjggMDA4OSAgUmFnZSAzRCBJSUMKLQkJMTAyOCA0MDgyICBSYWdlIDNEIElJQwotCQkxMDI4IDgwODIgIFJhZ2UgM0QgSUlDCi0JCTEwMjggYzA4MiAgUmFnZSAzRCBJSUMKLQk0NzU4ICAyMTA4ODhHWCBbTWFjaDY0IEdYXQotCTQ3NTkgIDNEIFJhZ2UgSUlDCi0JNDc1YSAgM0QgUmFnZSBJSUMgQUdQCi0JCTEwMDIgMDA4NCAgUmFnZSAzRCBQcm8gQUdQIDJ4IFhQRVJUIDk4Ci0JCTEwMDIgMDA4NyAgUmFnZSAzRCBJSUMKLQkJMTAwMiA0NzVhICBSYWdlIElJQyBBR1AKLQk0OTY0ICBSYWRlb24gUlYyNTAgSWQgW1JhZGVvbiA5MDAwXQotCTQ5NjUgIFJhZGVvbiBSVjI1MCBJZSBbUmFkZW9uIDkwMDBdCi0JNDk2NiAgUmFkZW9uIFJWMjUwIElmIFtSYWRlb24gOTAwMF0KLQkJMTBmMSAwMDAyICBSVjI1MCBJZiBbVGFjaHlvbiBHOTAwMCBQUk9dCi0JCTE0OGMgMjAzOSAgUlYyNTAgSWYgW1JhZGVvbiA5MDAwIFBybyAiRXZpbCBDb21tYW5kbyJdCi0JCTE1MDkgOWEwMCAgUlYyNTAgSWYgW1JhZGVvbiA5MDAwICJBVDAwOSJdCi0jIE5ldyBzdWJkZXZpY2UgLSAzRCBQcm9waGV0IDkwMDAgUENJIGJ5IEhlcmN1bGVzLiBBR1AgdmVyc2lvbiBwcm9iYWJseSB3b3VsZCBoYXZlIHNhbWUgSUQsIHNvIG5vdCBzcGVjaWZpZWQuCi0JCTE2ODEgMDA0MCAgUlYyNTAgSWYgWzNEIHByb3BoZXQgOTAwMF0KLQkJMTc0YiA3MTc2ICBSVjI1MCBJZiBbU2FwcGhpcmUgUmFkZW9uIDkwMDAgUHJvXQotCQkxNzRiIDcxOTIgIFJWMjUwIElmIFtSYWRlb24gOTAwMCAiQXRsYW50aXMiXQotCQkxN2FmIDIwMDUgIFJWMjUwIElmIFtFeGNhbGlidXIgUmFkZW9uIDkwMDAgUHJvXQotCQkxN2FmIDIwMDYgIFJWMjUwIElmIFtFeGNhbGlidXIgUmFkZW9uIDkwMDBdCi0JNDk2NyAgUmFkZW9uIFJWMjUwIElnIFtSYWRlb24gOTAwMF0KLQk0OTZlICBSYWRlb24gUlYyNTAgW1JhZGVvbiA5MDAwXSAoU2Vjb25kYXJ5KQotCTRhNDggIFI0MjAgSkggW1JhZGVvbiBYODAwXQotCTRhNDkgIFI0MjAgSkkgW1JhZGVvbiBYODAwUFJPXQotCTRhNGEgIFI0MjAgSkogW1JhZGVvbiBYODAwU0VdCi0JNGE0YiAgUjQyMCBKSyBbUmFkZW9uIFg4MDBdCi0JNGE0YyAgUjQyMCBKTCBbUmFkZW9uIFg4MDBdCi0JNGE0ZCAgUjQyMCBKTSBbRmlyZUdMIFgzXQotCTRhNGUgIE0xOCBKTiBbUmFkZW9uIE1vYmlsaXR5IDk4MDBdCi0JNGE1MCAgUjQyMCBKUCBbUmFkZW9uIFg4MDBYVF0KLQk0YTcwICBSNDIwIFtYODAwWFQtUEVdIChTZWNvbmRhcnkpCi0JNGM0MiAgM0QgUmFnZSBMVCBQcm8gQUdQLTEzMwotCQkwZTExIGIwZTcgIFJhZ2UgTFQgUHJvIChDb21wYXEgUHJlc2FyaW8gNTI0MCkKLQkJMGUxMSBiMGU4ICBSYWdlIDNEIExUIFBybwotCQkwZTExIGIxMGUgIDNEIFJhZ2UgTFQgUHJvIChDb21wYXEgQXJtYWRhIDE3NTApCi0JCTEwMDIgMDA0MCAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMDIgMDA0NCAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMDIgNGM0MiAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMDIgODAwMSAgUmFnZSBMVCBQcm8gQUdQIDJYCi0JCTEwMjggMDA4NSAgUmFnZSAzRCBMVCBQcm8KLQk0YzQ0ICAzRCBSYWdlIExUIFBybyBBR1AtNjYKLQk0YzQ1ICBSYWdlIE1vYmlsaXR5IE0zIEFHUAotCTRjNDYgIFJhZ2UgTW9iaWxpdHkgTTMgQUdQIDJ4Ci0JCTEwMjggMDBiMSAgTGF0aXR1ZGUgQzYwMAotCTRjNDcgIDNEIFJhZ2UgTFQtRyAyMTVMRwotCTRjNDkgIDNEIFJhZ2UgTFQgUHJvCi0JCTEwMDIgMDAwNCAgUmFnZSBMVCBQcm8KLQkJMTAwMiAwMDQwICBSYWdlIExUIFBybwotCQkxMDAyIDAwNDQgIFJhZ2UgTFQgUHJvCi0JCTEwMDIgNGM0OSAgUmFnZSBMVCBQcm8KLQk0YzRkICBSYWdlIE1vYmlsaXR5IFAvTSBBR1AgMngKLQkJMGUxMSBiMTExICBBcm1hZGEgTTcwMAotCQkwZTExIGIxNjAgIEFybWFkYSBFNTAwCi0JCTEwMDIgMDA4NCAgWHBlcnQgOTggQUdQIDJYIChNb2JpbGl0eSkKLQkJMTAxNCAwMTU0ICBUaGlua1BhZCBBMjBtCi0JCTEwMjggMDBhYSAgTGF0aXR1ZGUgQ1B0Ci0JCTEwMjggMDBiYiAgTGF0aXR1ZGUgQ1B4Ci0JNGM0ZSAgUmFnZSBNb2JpbGl0eSBMIEFHUCAyeAotCTRjNTAgIDNEIFJhZ2UgTFQgUHJvCi0JCTEwMDIgNGM1MCAgUmFnZSBMVCBQcm8KLQk0YzUxICAzRCBSYWdlIExUIFBybwotCTRjNTIgIFJhZ2UgTW9iaWxpdHkgUC9NCi0JCTEwMzMgODExMiAgVmVyc2EgTm90ZSBWWGkKLQk0YzUzICBSYWdlIE1vYmlsaXR5IEwKLQk0YzU0ICAyNjRMVCBbTWFjaDY0IExUXQotCTRjNTcgIFJhZGVvbiBNb2JpbGl0eSBNNyBMVyBbUmFkZW9uIE1vYmlsaXR5IDc1MDBdCi0JCTEwMTQgMDUxNyAgVGhpbmtQYWQgVDMwCi0JCTEwMjggMDBlNiAgUmFkZW9uIE1vYmlsaXR5IE03IExXIChEZWxsIEluc3Bpcm9uIDgxMDApCi0JCTEwMjggMDEyYSAgTGF0aXR1ZGUgQzY0MAotCQkxNDRkIGMwMDYgIFJhZGVvbiBNb2JpbGl0eSBNNyBMVyBpbiB2cHIgTWF0cml4IDE3MEI0Ci0JNGM1OCAgUmFkZW9uIFJWMjAwIExYIFtNb2JpbGl0eSBGaXJlR0wgNzgwMCBNN10KLQk0YzU5ICBSYWRlb24gTW9iaWxpdHkgTTYgTFkKLQkJMTAxNCAwMjM1ICBUaGlua1BhZCBBMzAvQTMwcCAoMjY1Mi8yNjUzKQotCQkxMDE0IDAyMzkgIFRoaW5rUGFkIFgyMi9YMjMvWDI0Ci0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JNGM1YSAgUmFkZW9uIE1vYmlsaXR5IE02IExaCi0JNGM2NCAgUmFkZW9uIFIyNTAgTGQgW1JhZGVvbiBNb2JpbGl0eSA5MDAwIE05XQotCTRjNjUgIFJhZGVvbiBSMjUwIExlIFtSYWRlb24gTW9iaWxpdHkgOTAwMCBNOV0KLQk0YzY2ICBSYWRlb24gUjI1MCBMZiBbRmlyZUdMIDkwMDBdCi0JNGM2NyAgUmFkZW9uIFIyNTAgTGcgW1JhZGVvbiBNb2JpbGl0eSA5MDAwIE05XQotIyBTZWNvbmRhcnkgY2hpcCB0byB0aGUgTGYKLQk0YzZlICBSYWRlb24gUjI1MCBMbiBbUmFkZW9uIE1vYmlsaXR5IDkwMDAgTTldIFtTZWNvbmRhcnldCi0JNGQ0NiAgUmFnZSBNb2JpbGl0eSBNNCBBR1AKLQk0ZDRjICBSYWdlIE1vYmlsaXR5IE00IEFHUAotCTRlNDQgIFJhZGVvbiBSMzAwIE5EIFtSYWRlb24gOTcwMCBQcm9dCi0JNGU0NSAgUmFkZW9uIFIzMDAgTkUgW1JhZGVvbiA5NTAwIFByb10KLQkJMTAwMiAwMDAyICBSYWRlb24gUjMwMCBORSBbUmFkZW9uIDk1MDAgUHJvXQotCQkxNjgxIDAwMDIgIEhlcmN1bGVzIDNEIFByb3BoZXQgOTUwMCBQUk8gW1JhZGVvbiA5NTAwIFByb10KLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucyAoY29ycmVjdGlvbiB0byBhYm92ZSkKLQk0ZTQ2ICBSVjM1MCBORiBbUmFkZW9uIDk2MDBdCi0JNGU0NyAgUmFkZW9uIFIzMDAgTkcgW0ZpcmVHTCBYMV0KLSMgKGFkZGVkIHBybykKLQk0ZTQ4ICBSYWRlb24gUjM1MCBbUmFkZW9uIDk4MDAgUHJvXQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNGU0OSAgUmFkZW9uIFIzNTAgW1JhZGVvbiA5ODAwXQotCTRlNGEgIFJWMzUwIE5KIFtSYWRlb24gOTgwMCBYVF0KLQk0ZTRiICBSMzUwIE5LIFtGaXJlIEdMIFgyXQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNGU1MCAgUlYzNTAgW01vYmlsaXR5IFJhZGVvbiA5NjAwIE0xMF0KLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTE3MzQgMTA1NSAgQW1pbG8gTTE0MjBXCi0JNGU1MSAgTTEwIE5RIFtSYWRlb24gTW9iaWxpdHkgOTYwMF0KLQk0ZTUyICBSVjM1MCBbTW9iaWxpdHkgUmFkZW9uIDk2MDAgTTEwXQotCTRlNTMgIE0xMCBOUyBbUmFkZW9uIE1vYmlsaXR5IDk2MDBdCi0JNGU1NCAgTTEwIE5UIFtGaXJlR0wgTW9iaWxpdHkgVDJdCi0JNGU1NiAgTTExIE5WIFtGaXJlR0wgTW9iaWxpdHkgVDJlXQotCTRlNjQgIFJhZGVvbiBSMzAwIFtSYWRlb24gOTcwMCBQcm9dIChTZWNvbmRhcnkpCi0JNGU2NSAgUmFkZW9uIFIzMDAgW1JhZGVvbiA5NTAwIFByb10gKFNlY29uZGFyeSkKLQkJMTAwMiAwMDAzICBSYWRlb24gUjMwMCBORSBbUmFkZW9uIDk1MDAgUHJvXQotCQkxNjgxIDAwMDMgIEhlcmN1bGVzIDNEIFByb3BoZXQgOTUwMCBQUk8gW1JhZGVvbiA5NTAwIFByb10gKFNlY29uZGFyeSkKLSMgTmV3IFBDSSBJRCBwcm92aWRlZCBieSBBVEkgZGV2ZWxvcGVyIHJlbGF0aW9ucyAoY29ycmVjdGlvbiB0byBhYm92ZSkKLQk0ZTY2ICBSVjM1MCBORiBbUmFkZW9uIDk2MDBdIChTZWNvbmRhcnkpCi0JNGU2NyAgUmFkZW9uIFIzMDAgW0ZpcmVHTCBYMV0gKFNlY29uZGFyeSkKLSMgKGFkZGVkIHBybykKLQk0ZTY4ICBSYWRlb24gUjM1MCBbUmFkZW9uIDk4MDAgUHJvXSAoU2Vjb25kYXJ5KQotIyBOZXcgUENJIElEIHByb3ZpZGVkIGJ5IEFUSSBkZXZlbG9wZXIgcmVsYXRpb25zCi0JNGU2OSAgUmFkZW9uIFIzNTAgW1JhZGVvbiA5ODAwXSAoU2Vjb25kYXJ5KQotCTRlNmEgIFJWMzUwIE5KIFtSYWRlb24gOTgwMCBYVF0gKFNlY29uZGFyeSkKLQkJMTAwMiA0ZTcxICBBVEkgVGVjaG5vbG9naWVzIEluYyBNMTAgTlEgW1JhZGVvbiBNb2JpbGl0eSA5NjAwXQotCTUwNDEgIFJhZ2UgMTI4IFBBL1BSTwotCTUwNDIgIFJhZ2UgMTI4IFBCL1BSTyBBR1AgMngKLQk1MDQzICBSYWdlIDEyOCBQQy9QUk8gQUdQIDR4Ci0JNTA0NCAgUmFnZSAxMjggUEQvUFJPIFRNRFMKLQkJMTAwMiAwMDI4ICBSYWdlIDEyOCBBSVcKLQkJMTAwMiAwMDI5ICBSYWdlIDEyOCBBSVcKLQk1MDQ1ICBSYWdlIDEyOCBQRS9QUk8gQUdQIDJ4IFRNRFMKLQk1MDQ2ICBSYWdlIDEyOCBQRi9QUk8gQUdQIDR4IFRNRFMKLQkJMTAwMiAwMDA0ICBSYWdlIEZ1cnkgUHJvCi0JCTEwMDIgMDAwOCAgUmFnZSBGdXJ5IFByby9YcGVydCAyMDAwIFBybwotCQkxMDAyIDAwMTQgIFJhZ2UgRnVyeSBQcm8KLQkJMTAwMiAwMDE4ICBSYWdlIEZ1cnkgUHJvL1hwZXJ0IDIwMDAgUHJvCi0JCTEwMDIgMDAyOCAgUmFnZSAxMjggUHJvIEFJVyBBR1AKLQkJMTAwMiAwMDJhICBSYWdlIDEyOCBQcm8gQUlXIEFHUAotCQkxMDAyIDAwNDggIFJhZ2UgRnVyeSBQcm8KLQkJMTAwMiAyMDAwICBSYWdlIEZ1cnkgTUFYWCBBR1AgNHggKFRNRFMpIChWR0EgZGV2aWNlKQotCQkxMDAyIDIwMDEgIFJhZ2UgRnVyeSBNQVhYIEFHUCA0eCAoVE1EUykgKEV4dHJhIGRldmljZT8hKQotCTUwNDcgIFJhZ2UgMTI4IFBHL1BSTwotCTUwNDggIFJhZ2UgMTI4IFBIL1BSTyBBR1AgMngKLQk1MDQ5ICBSYWdlIDEyOCBQSS9QUk8gQUdQIDR4Ci0JNTA0YSAgUmFnZSAxMjggUEovUFJPIFRNRFMKLQk1MDRiICBSYWdlIDEyOCBQSy9QUk8gQUdQIDJ4IFRNRFMKLQk1MDRjICBSYWdlIDEyOCBQTC9QUk8gQUdQIDR4IFRNRFMKLQk1MDRkICBSYWdlIDEyOCBQTS9QUk8KLQk1MDRlICBSYWdlIDEyOCBQTi9QUk8gQUdQIDJ4Ci0JNTA0ZiAgUmFnZSAxMjggUE8vUFJPIEFHUCA0eAotCTUwNTAgIFJhZ2UgMTI4IFBQL1BSTyBUTURTIFtYcGVydCAxMjhdCi0JCTEwMDIgMDAwOCAgWHBlcnQgMTI4Ci0JNTA1MSAgUmFnZSAxMjggUFEvUFJPIEFHUCAyeCBUTURTCi0JNTA1MiAgUmFnZSAxMjggUFIvUFJPIEFHUCA0eCBUTURTCi0JNTA1MyAgUmFnZSAxMjggUFMvUFJPCi0JNTA1NCAgUmFnZSAxMjggUFQvUFJPIEFHUCAyeAotCTUwNTUgIFJhZ2UgMTI4IFBVL1BSTyBBR1AgNHgKLQk1MDU2ICBSYWdlIDEyOCBQVi9QUk8gVE1EUwotCTUwNTcgIFJhZ2UgMTI4IFBXL1BSTyBBR1AgMnggVE1EUwotCTUwNTggIFJhZ2UgMTI4IFBYL1BSTyBBR1AgNHggVE1EUwotCTUxNDQgIFJhZGVvbiBSMTAwIFFEIFtSYWRlb24gNzIwMF0KLQkJMTAwMiAwMDA4ICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMDA5ICBSYWRlb24gNzAwMC9SYWRlb24KLQkJMTAwMiAwMDBhICBSYWRlb24gNzAwMC9SYWRlb24KLQkJMTAwMiAwMDFhICBSYWRlb24gNzAwMC9SYWRlb24KLQkJMTAwMiAwMDI5ICBSYWRlb24gQUlXCi0JCTEwMDIgMDAzOCAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDAzOSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDA4YSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDBiYSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDEzOSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDI4YSAgUmFkZW9uIDcwMDAvUmFkZW9uCi0JCTEwMDIgMDJhYSAgUmFkZW9uIEFJVwotCQkxMDAyIDA1M2EgIFJhZGVvbiA3MDAwL1JhZGVvbgotCTUxNDUgIFJhZGVvbiBSMTAwIFFFCi0JNTE0NiAgUmFkZW9uIFIxMDAgUUYKLQk1MTQ3ICBSYWRlb24gUjEwMCBRRwotCTUxNDggIFJhZGVvbiBSMjAwIFFIIFtSYWRlb24gODUwMF0KLQkJMTAwMiAwMTBhICBGaXJlR0wgODgwMCA2NE1iCi0JCTEwMDIgMDE1MiAgRmlyZUdMIDg4MDAgMTI4TWIKLQkJMTAwMiAwMTYyICBGaXJlR0wgODcwMCAzMk1iCi0JCTEwMDIgMDE3MiAgRmlyZUdMIDg3MDAgNjRNYgotCTUxNDkgIFJhZGVvbiBSMjAwIFFJCi0JNTE0YSAgUmFkZW9uIFIyMDAgUUoKLQk1MTRiICBSYWRlb24gUjIwMCBRSwotCTUxNGMgIFJhZGVvbiBSMjAwIFFMIFtSYWRlb24gODUwMCBMRV0KLQkJMTAwMiAwMDNhICBSYWRlb24gUjIwMCBRTCBbUmFkZW9uIDg1MDAgTEVdCi0JCTEwMDIgMDEzYSAgUmFkZW9uIDg1MDAKLQkJMTQ4YyAyMDI2ICBSMjAwIFFMIFtSYWRlb24gODUwMCBFdmlsIE1hc3RlciBJSSBNdWx0aSBEaXNwbGF5IEVkaXRpb25dCi0JCTE2ODEgMDAxMCAgUmFkZW9uIDg1MDAgWzNEIFByb3BoZXQgODUwMCAxMjhNYl0KLQkJMTc0YiA3MTQ5ICBSYWRlb24gUjIwMCBRTCBbU2FwcGhpcmUgUmFkZW9uIDg1MDAgTEVdCi0JNTE0ZCAgUmFkZW9uIFIyMDAgUU0gW1JhZGVvbiA5MTAwXQotCTUxNGUgIFJhZGVvbiBSMjAwIFFOIFtSYWRlb24gODUwMExFXQotCTUxNGYgIFJhZGVvbiBSMjAwIFFPIFtSYWRlb24gODUwMExFXQotCTUxNTQgIFIyMDAgUVQgW1JhZGVvbiA4NTAwXQotCTUxNTUgIFIyMDAgUVUgW1JhZGVvbiA5MTAwXQotCTUxNTcgIFJhZGVvbiBSVjIwMCBRVyBbUmFkZW9uIDc1MDBdCi0JCTEwMDIgMDEzYSAgUmFkZW9uIDc1MDAKLQkJMTAwMiAxMDNhICBEZWxsIE9wdGlwbGV4IEdYMjYwCi0JCTE0NTggNDAwMCAgUlYyMDAgUVcgW1JBREVPTiA3NTAwIFBSTyBNQVlBIEFSXQotCQkxNDhjIDIwMjQgIFJWMjAwIFFXIFtSYWRlb24gNzUwMExFIER1YWwgRGlzcGxheV0KLQkJMTQ4YyAyMDI1ICBSVjIwMCBRVyBbUmFkZW9uIDc1MDAgRXZpbCBNYXN0ZXIgTXVsdGkgRGlzcGxheSBFZGl0aW9uXQotCQkxNDhjIDIwMzYgIFJWMjAwIFFXIFtSYWRlb24gNzUwMCBQQ0kgRHVhbCBEaXNwbGF5XQotCQkxNzRiIDcxNDYgIFJWMjAwIFFXIFtSYWRlb24gNzUwMCBMRV0KLQkJMTc0YiA3MTQ3ICBSVjIwMCBRVyBbU2FwcGhpcmUgUmFkZW9uIDc1MDBMRV0KLQkJMTc0YiA3MTYxICBSYWRlb24gUlYyMDAgUVcgW1JhZGVvbiA3NTAwIExFXQotCQkxN2FmIDAyMDIgIFJWMjAwIFFXIFtFeGNhbGlidXIgUmFkZW9uIDc1MDBMRV0KLQk1MTU4ICBSYWRlb24gUlYyMDAgUVggW1JhZGVvbiA3NTAwXQotCTUxNTkgIFJhZGVvbiBSVjEwMCBRWSBbUmFkZW9uIDcwMDAvVkVdCi0JCTEwMDIgMDAwYSAgUmFkZW9uIDcwMDAvUmFkZW9uIFZFCi0JCTEwMDIgMDAwYiAgUmFkZW9uIDcwMDAKLQkJMTAwMiAwMDM4ICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMDNhICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMGJhICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTAwMiAwMTNhICBSYWRlb24gNzAwMC9SYWRlb24gVkUKLQkJMTQ1OCA0MDAyICBSVjEwMCBRWSBbUkFERU9OIDcwMDAgUFJPIE1BWUEgQVYgU2VyaWVzXQotCQkxNDhjIDIwMDMgIFJWMTAwIFFZIFtSYWRlb24gNzAwMCBNdWx0aS1EaXNwbGF5IEVkaXRpb25dCi0JCTE0OGMgMjAyMyAgUlYxMDAgUVkgW1JhZGVvbiA3MDAwIEV2aWwgTWFzdGVyIE11bHRpLURpc3BsYXldCi0JCTE3NGIgNzExMiAgUlYxMDAgUVkgW1NhcHBoaXJlIFJhZGVvbiBWRSA3MDAwXQotCQkxNzRiIDdjMjggIFNhcHBoaXJlIFJhZGVvbiBWRSA3MDAwIEREUgotCQkxNzg3IDAyMDIgIFJWMTAwIFFZIFtFeGNhbGlidXIgUmFkZW9uIDcwMDBdCi0JNTE1YSAgUmFkZW9uIFJWMTAwIFFaIFtSYWRlb24gNzAwMC9WRV0KLQk1MTY4ICBSYWRlb24gUjIwMCBRaAotCTUxNjkgIFJhZGVvbiBSMjAwIFFpCi0JNTE2YSAgUmFkZW9uIFIyMDAgUWoKLQk1MTZiICBSYWRlb24gUjIwMCBRawotIyBUaGlzIG9uZSBpcyBub3QgaW4gQVRJIGRvY3VtZW50YXRpb24sIGJ1dCBpcyBpbiBYRnJlZTg2IHNvdXJjZSBjb2RlCi0JNTE2YyAgUmFkZW9uIFIyMDAgUWwKLQk1MjQ1ICBSYWdlIDEyOCBSRS9TRwotCQkxMDAyIDAwMDggIFhwZXJ0IDEyOAotCQkxMDAyIDAwMjggIFJhZ2UgMTI4IEFJVwotCQkxMDAyIDAwMjkgIFJhZ2UgMTI4IEFJVwotCQkxMDAyIDAwNjggIFJhZ2UgMTI4IEFJVwotCTUyNDYgIFJhZ2UgMTI4IFJGL1NHIEFHUAotCQkxMDAyIDAwMDQgIE1hZ251bS9YcGVydCAxMjgvWHBlcnQgOTkKLQkJMTAwMiAwMDA4ICBNYWdudW0vWHBlcnQxMjgvWDk5L1hwZXJ0MjAwMAotCQkxMDAyIDAwMjggIFJhZ2UgMTI4IEFJVyBBR1AKLQkJMTAwMiAwMDQ0ICBSYWdlIEZ1cnkvWHBlcnQgMTI4L1hwZXJ0IDIwMDAKLQkJMTAwMiAwMDY4ICBSYWdlIDEyOCBBSVcgQUdQCi0JCTEwMDIgMDQ0OCAgUmFnZSBGdXJ5Ci0JNTI0NyAgUmFnZSAxMjggUkcKLQk1MjRiICBSYWdlIDEyOCBSSy9WUgotCTUyNGMgIFJhZ2UgMTI4IFJML1ZSIEFHUAotCQkxMDAyIDAwMDggIFhwZXJ0IDk5L1hwZXJ0IDIwMDAKLQkJMTAwMiAwMDg4ICBYcGVydCA5OQotCTUzNDUgIFJhZ2UgMTI4IFNFLzR4Ci0JNTM0NiAgUmFnZSAxMjggU0YvNHggQUdQIDJ4Ci0JCTEwMDIgMDA0OCAgUkFHRSAxMjggMTZNQiBWR0EgVFZPVVQgQU1DIFBBTAotCTUzNDcgIFJhZ2UgMTI4IFNHLzR4IEFHUCA0eAotCTUzNDggIFJhZ2UgMTI4IFNICi0JNTM0YiAgUmFnZSAxMjggU0svNHgKLQk1MzRjICBSYWdlIDEyOCBTTC80eCBBR1AgMngKLQk1MzRkICBSYWdlIDEyOCBTTS80eCBBR1AgNHgKLQkJMTAwMiAwMDA4ICBYcGVydCA5OS9YcGVydCAyMDAwCi0JCTEwMDIgMDAxOCAgWHBlcnQgMjAwMAotCTUzNGUgIFJhZ2UgMTI4IDR4Ci0JNTM1NCAgTWFjaCA2NCBWVAotCQkxMDAyIDU2NTQgIE1hY2ggNjQgcmVmZXJlbmNlCi0JNTQ0NiAgUmFnZSAxMjggUHJvIFVsdHJhIFRGCi0JCTEwMDIgMDAwNCAgUmFnZSBGdXJ5IFBybwotCQkxMDAyIDAwMDggIFJhZ2UgRnVyeSBQcm8vWHBlcnQgMjAwMCBQcm8KLQkJMTAwMiAwMDE4ICBSYWdlIEZ1cnkgUHJvL1hwZXJ0IDIwMDAgUHJvCi0JCTEwMDIgMDAyOCAgUmFnZSAxMjggQUlXIFBybyBBR1AKLQkJMTAwMiAwMDI5ICBSYWdlIDEyOCBBSVcKLQkJMTAwMiAwMDJhICBSYWdlIDEyOCBBSVcgUHJvIEFHUAotCQkxMDAyIDAwMmIgIFJhZ2UgMTI4IEFJVwotCQkxMDAyIDAwNDggIFhwZXJ0IDIwMDAgUHJvCi0JNTQ0YyAgUmFnZSAxMjggUHJvIFVsdHJhIFRMCi0JNTQ1MiAgUmFnZSAxMjggUHJvIFVsdHJhIFRSCi0JCTEwMDIgMDAxYyAgUmFnZSAxMjggUHJvIDRYTAotCQkxMDNjIDEyNzkgIFJhZ2UgMTI4IFBybyA0WEwKLQk1NDUzICBSYWdlIDEyOCBQcm8gVWx0cmEgVFMKLQk1NDU0ICBSYWdlIDEyOCBQcm8gVWx0cmEgVFQKLQk1NDU1ICBSYWdlIDEyOCBQcm8gVWx0cmEgVFUKLQk1NDYwICBNMjIgW1JhZGVvbiBNb2JpbGl0eSBNMzAwXQotCTU0NjQgIE0yMiBbRmlyZUdMIEdMXQotCTU1NDggIFI0MjMgVUggW1JhZGVvbiBYODAwIChQQ0lFKV0KLQk1NTQ5ICBSNDIzIFVJIFtSYWRlb24gWDgwMFBSTyAoUENJRSldCi0JNTU0YSAgUjQyMyBVSiBbUmFkZW9uIFg4MDBMRSAoUENJRSldCi0JNTU0YiAgUjQyMyBVSyBbUmFkZW9uIFg4MDBTRSAoUENJRSldCi0JNTU1MSAgUjQyMyBVUSBbRmlyZUdMIFY3MjAwIChQQ0lFKV0KLQk1NTUyICBSNDIzIFVSIFtGaXJlR0wgVjUxMDAgKFBDSUUpXQotCTU1NTQgIFI0MjMgVVQgW0ZpcmVHTCBWNzEwMCAoUENJRSldCi0JNTU2YiAgUmFkZW9uIFI0MjMgVUsgKFBDSUUpIFtYODAwIFNFXSAoU2Vjb25kYXJ5KQotCTU2NTQgIDI2NFZUIFtNYWNoNjQgVlRdCi0JCTEwMDIgNTY1NCAgTWFjaDY0VlQgUmVmZXJlbmNlCi0JNTY1NSAgMjY0VlQzIFtNYWNoNjQgVlQzXQotCTU2NTYgIDI2NFZUNCBbTWFjaDY0IFZUNF0KLQk1ODMwICBSUzMwMCBIb3N0IEJyaWRnZQotCTU4MzEgIFJTMzAwIEhvc3QgQnJpZGdlCi0JNTgzMiAgUlMzMDAgSG9zdCBCcmlkZ2UKLQk1ODMzICBSYWRlb24gOTEwMCBJR1AgSG9zdCBCcmlkZ2UKLQk1ODM0ICBSYWRlb24gOTEwMCBJR1AKLQk1ODM1ICBSUzMwME0gQUdQIFtSYWRlb24gTW9iaWxpdHkgOTEwMElHUF0KLQk1ODM4ICBSYWRlb24gOTEwMCBJR1AgQUdQIEJyaWRnZQotCTU5NDEgIFJWMjgwIFtSYWRlb24gOTIwMF0gKFNlY29uZGFyeSkKLQkJMTQ1OCA0MDE5ICBHaWdhYnl0ZSBSYWRlb24gOTIwMAotCQkxNzRiIDdjMTIgIFNhcHBoaXJlIFJhZGVvbiA5MjAwCi0jIGh0dHA6Ly93d3cuaGlnaHRlY2guY29tLmhrL2h0bWwvOTIwMC5odG0KLQkJMTdhZiAyMDBkICBFeGNhbGlidXIgUmFkZW9uIDkyMDAKLQkJMThiYyAwMDUwICBHZVhjdWJlIEdDLVI5MjAwLUMzIChTZWNvbmRhcnkpCi0JNTk0NCAgUlYyODAgW1JhZGVvbiA5MjAwIFNFIChQQ0kpXQotCTU5NjAgIFJWMjgwIFtSYWRlb24gOTIwMCBQUk9dCi0JNTk2MSAgUlYyODAgW1JhZGVvbiA5MjAwXQotCQkxMDAyIDJmNzIgIEFsbC1pbi1Xb25kZXIgOTIwMCBTZXJpZXMKLQkJMTAxOSA0YzMwICBSYWRlb24gOTIwMCBWSVZPCi0JCTEyYWIgNTk2MSAgWVVBTiBTTUFSVFZHQSBSYWRlb24gOTIwMAotCQkxNDU4IDQwMTggIEdpZ2FieXRlIFJhZGVvbiA5MjAwCi0JCTE3NGIgN2MxMyAgU2FwcGhpcmUgUmFkZW9uIDkyMDAKLSMgaHR0cDovL3d3dy5oaWdodGVjaC5jb20uaGsvaHRtbC85MjAwLmh0bQotCQkxN2FmIDIwMGMgIEV4Y2FsaWJ1ciBSYWRlb24gOTIwMAotCQkxOGJjIDAwNTAgIFJhZGVvbiA5MjAwIEdhbWUgQnVzdGVyCi0JCTE4YmMgMDA1MSAgR2VYY3ViZSBHQy1SOTIwMC1DMwotCQkxOGJjIDAwNTMgIFJhZGVvbiA5MjAwIEdhbWUgQnVzdGVyIFZJVk8KLQk1OTYyICBSVjI4MCBbUmFkZW9uIDkyMDBdCi0JNTk2NCAgUlYyODAgW1JhZGVvbiA5MjAwIFNFXQotCQkxMDQzIGMwMDYgIEFTVVMgUmFkZW9uIDkyMDAgU0UgLyBURCAvIDEyOE0KLQkJMTQ1OCA0MDE4ICBSYWRlb24gOTIwMCBTRQotCQkxNDhjIDIwNzMgIENOLUFHOTJFCi0JCTE3NGIgN2MxMyAgU2FwcGhpcmUgUmFkZW9uIDkyMDAgU0UKLQkJMTc4NyA1OTY0ICBFeGNhbGlidXIgOTIwMFNFIFZJVk8gMTI4TQotCQkxN2FmIDIwMTIgIFJhZGVvbiA5MjAwIFNFIEV4Y2FsaWJ1cgotCQkxOGJjIDAxNzAgIFNhcHBoaXJlIFJhZGVvbiA5MjAwIFNFIDEyOE1CIEdhbWUgQnVzdGVyCi0jIDEyOE1CIEREUiwgRFZJL1ZHQS9UViBvdXQKLQkJMThiYyAwMTczICBHQy1SOTIwMEwoU0UpLUMzSCBbUmFkZW9uIDkyMDAgR2FtZSBCdXN0ZXJdCi0JNWI2MCAgUlYzNzAgNUI2MCBbUmFkZW9uIFgzMDAgKFBDSUUpXQotCQkxMDQzIDAwMmEgIEV4dHJlbWUgQVgzMDBTRS1YCi0JCTEwNDMgMDMyZSAgRXh0cmVtZSBBWDMwMC9URAotCTViNjIgIFJWMzcwIDVCNjIgW1JhZGVvbiBYNjAwIChQQ0lFKV0KLQk1YjY0ICBSVjM3MCA1QjY0IFtGaXJlR0wgVjMxMDAgKFBDSUUpXQotCTViNjUgIFJWMzcwIDVCNjUgW0ZpcmVHTCBEMTEwMCAoUENJRSldCi0JNWM2MSAgTTkrIDVDNjEgW1JhZGVvbiBNb2JpbGl0eSA5MjAwIChBR1ApXQotCTVjNjMgIE05KyA1QzYzIFtSYWRlb24gTW9iaWxpdHkgOTIwMCAoQUdQKV0KLQk1ZDQ0ICBSVjI4MCBbUmFkZW9uIDkyMDAgU0VdIChTZWNvbmRhcnkpCi0JCTE0NTggNDAxOSAgUmFkZW9uIDkyMDAgU0UgKFNlY29uZGFyeSkKLQkJMTc0YiA3YzEyICBTYXBwaGlyZSBSYWRlb24gOTIwMCBTRSAoU2Vjb25kYXJ5KQotCQkxNzg3IDU5NjUgIEV4Y2FsaWJ1ciA5MjAwU0UgVklWTyAxMjhNIChTZWNvbmRhcnkpCi0JCTE3YWYgMjAxMyAgUmFkZW9uIDkyMDAgU0UgRXhjYWxpYnVyIChTZWNvbmRhcnkpCi0JCTE4YmMgMDE3MSAgUmFkZW9uIDkyMDAgU0UgMTI4TUIgR2FtZSBCdXN0ZXIgKFNlY29uZGFyeSkKLQkJMThiYyAwMTcyICBHQy1SOTIwMEwoU0UpLUMzSCBbUmFkZW9uIDkyMDAgR2FtZSBCdXN0ZXJdCi0JNWQ0ZCAgUjQ4MCBbUmFkZW9uIFg4NTBYVCBQbGF0aW51bV0KLQk1ZDU3ICBSNDIzIDVGNTcgW1JhZGVvbiBYODAwWFQgKFBDSUUpXQotCTcwMGYgIFBDSSBCcmlkZ2UgW0lHUCAzMjBNXQotCTcwMTAgIFBDSSBCcmlkZ2UgW0lHUCAzNDBNXQotCTc4MzQgIFJhZGVvbiA5MTAwIFBSTyBJR1AKLQk3ODM1ICBSYWRlb24gTW9iaWxpdHkgOTIwMCBJR1AKLQk3YzM3ICBSVjM1MCBBUSBbUmFkZW9uIDk2MDAgU0VdCi0JY2FiMCAgQUdQIEJyaWRnZSBbSUdQIDMyME1dCi0JY2FiMiAgUlMyMDAvUlMyMDBNIEFHUCBCcmlkZ2UgW0lHUCAzNDBNXQotCWNiYjIgIFJTMjAwL1JTMjAwTSBBR1AgQnJpZGdlIFtJR1AgMzQwTV0KLTEwMDMgIFVMU0kgU3lzdGVtcwotCTAyMDEgIFVTMjAxCi0xMDA0ICBWTFNJIFRlY2hub2xvZ3kgSW5jCi0JMDAwNSAgODJDNTkyLUZDMQotCTAwMDYgIDgyQzU5My1GQzEKLQkwMDA3ICA4MkM1OTQtQUZDMgotCTAwMDggIDgyQzU5Ni83IFtXaWxkY2F0XQotCTAwMDkgIDgyQzU5Ny1BRkMyCi0JMDAwYyAgODJDNTQxIFtMeW54XQotCTAwMGQgIDgyQzU0MyBbTHlueF0KLQkwMTAxICA4MkM1MzIKLQkwMTAyICA4MkM1MzQgW0VhZ2xlXQotCTAxMDMgIDgyQzUzOAotCTAxMDQgIDgyQzUzNQotCTAxMDUgIDgyQzE0NwotCTAyMDAgIDgyQzk3NQotCTAyODAgIDgyQzkyNQotCTAzMDQgIFFTb3VuZCBUaHVuZGVyQmlyZCBQQ0kgQXVkaW8KLQkJMTAwNCAwMzA0ICBRU291bmQgVGh1bmRlckJpcmQgUENJIEF1ZGlvCi0JCTEyMmQgMTIwNiAgRFNQMzY4IEF1ZGlvCi0JCTE0ODMgNTAyMCAgWFdhdmUgVGh1bmRlciAzRCBBdWRpbwotCTAzMDUgIFFTb3VuZCBUaHVuZGVyQmlyZCBQQ0kgQXVkaW8gR2FtZXBvcnQKLQkJMTAwNCAwMzA1ICBRU291bmQgVGh1bmRlckJpcmQgUENJIEF1ZGlvIEdhbWVwb3J0Ci0JCTEyMmQgMTIwNyAgRFNQMzY4IEF1ZGlvIEdhbWVwb3J0Ci0JCTE0ODMgNTAyMSAgWFdhdmUgVGh1bmRlciAzRCBBdWRpbyBHYW1lcG9ydAotCTAzMDYgIFFTb3VuZCBUaHVuZGVyQmlyZCBQQ0kgQXVkaW8gU3VwcG9ydCBSZWdpc3RlcnMKLQkJMTAwNCAwMzA2ICBRU291bmQgVGh1bmRlckJpcmQgUENJIEF1ZGlvIFN1cHBvcnQgUmVnaXN0ZXJzCi0JCTEyMmQgMTIwOCAgRFNQMzY4IEF1ZGlvIFN1cHBvcnQgUmVnaXN0ZXJzCi0JCTE0ODMgNTAyMiAgWFdhdmUgVGh1bmRlciAzRCBBdWRpbyBTdXBwb3J0IFJlZ2lzdGVycwotCTAzMDcgIFRodW5kZXJiaXJkCi0JMDMwOCAgVGh1bmRlcmJpcmQKLQkwNzAyICBWQVM5NjAxMSBbR29sZGVuIEdhdGUgSUldCi0JMDcwMyAgVG9sbGdhdGUKLTEwMDUgIEF2YW5jZSBMb2dpYyBJbmMuIFtBTEldCi0JMjA2NCAgQUxHMjAzMi8yMDY0Ci0JMjEyOCAgQUxHMjM2NEEKLQkyMzAxICBBTEcyMzAxCi0JMjMwMiAgQUxHMjMwMgotCTIzNjQgIEFMRzIzNjQKLQkyNDY0ICBBTEcyMzY0QQotCTI1MDEgIEFMRzI1NjRBLzI1MTI4QQotMTAwNiAgUmVwbHkgR3JvdXAKLTEwMDcgIE5ldEZyYW1lIFN5c3RlbXMgSW5jCi0xMDA4ICBFcHNvbgotMTAwYSAgUGhvZW5peCBUZWNobm9sb2dpZXMKLTEwMGIgIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgQ29ycG9yYXRpb24KLQkwMDAxICBEUDgzODEwCi0JMDAwMiAgODc0MTUvODc1NjAgSURFCi0JMDAwZSAgODc1NjAgTGVnYWN5IEkvTwotCTAwMGYgIEZpcmVXaXJlIENvbnRyb2xsZXIKLQkwMDExICBOUzg3NTYwIE5hdGlvbmFsIFBDSSBTeXN0ZW0gSS9PCi0JMDAxMiAgVVNCIENvbnRyb2xsZXIKLQkwMDIwICBEUDgzODE1IChNYWNQaHl0ZXIpIEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBOZXR3b3JrCi0JCTEzODUgZjMxMSAgRkEzMTEgLyBGQTMxMiAoRkEzMTEgd2l0aCBXb0wgSFcpCi0JMDAyMiAgRFA4MzgyMCAxMC8xMDAvMTAwMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDAyOCAgR2VvZGUgR1gyIEhvc3QgQnJpZGdlCi0JMDAyYSAgQ1M1NTM1IFNvdXRoIEJyaWRnZQotCTAwMmIgIENTNTUzNSBJU0EgYnJpZGdlCi0JMDAyZCAgQ1M1NTM1IElERQotCTAwMmUgIENTNTUzNSBBdWRpbwotCTAwMmYgIENTNTUzNSBVU0IKLQkwMDMwICBHZW9kZSBHWDIgR3JhcGhpY3MgUHJvY2Vzc29yCi0JMDAzNSAgRFA4MzA2NSBbU2F0dXJuXSAxMC8xMDAvMTAwMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDUwMCAgU0N4MjAwIEJyaWRnZQotCTA1MDEgIFNDeDIwMCBTTUkKLQkwNTAyICBTQ3gyMDAgSURFCi0JMDUwMyAgU0N4MjAwIEF1ZGlvCi0JMDUwNCAgU0N4MjAwIFZpZGVvCi0JMDUwNSAgU0N4MjAwIFhCdXMKLQkwNTEwICBTQzExMDAgQnJpZGdlCi0JMDUxMSAgU0MxMTAwIFNNSQotCTA1MTUgIFNDMTEwMCBYQnVzCi0JZDAwMSAgODc0MTAgSURFCi0xMDBjICBUc2VuZyBMYWJzIEluYwotCTMyMDIgIEVUNDAwMC9XMzJwIHJldiBBCi0JMzIwNSAgRVQ0MDAwL1czMnAgcmV2IEIKLQkzMjA2ICBFVDQwMDAvVzMycCByZXYgQwotCTMyMDcgIEVUNDAwMC9XMzJwIHJldiBECi0JMzIwOCAgRVQ2MDAwCi0JNDcwMiAgRVQ2MzAwCi0xMDBkICBBU1QgUmVzZWFyY2ggSW5jCi0xMDBlICBXZWl0ZWsKLQk5MDAwICBQOTAwMCBWaXBlcgotCTkwMDEgIFA5MDAwIFZpcGVyCi0JOTAwMiAgUDkwMDAgVmlwZXIKLQk5MTAwICBQOTEwMCBWaXBlciBQcm8vU0UKLTEwMTAgIFZpZGVvIExvZ2ljLCBMdGQuCi0xMDExICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgotCTAwMDEgIERFQ2NoaXAgMjEwNTAKLQkwMDAyICBERUNjaGlwIDIxMDQwIFtUdWxpcF0KLQkwMDA0ICBERUNjaGlwIDIxMDMwIFtUR0FdCi0JMDAwNyAgTlZSQU0gW1plcGh5ciBOVlJBTV0KLQkwMDA4ICBLWlBTQSBbS1pQU0FdCi0JMDAwOSAgREVDY2hpcCAyMTE0MCBbRmFzdGVyTmV0XQotCQkxMDI1IDAzMTAgIDIxMTQwIEZhc3QgRXRoZXJuZXQKLQkJMTBiOCAyMDAxICBTTUM5MzMyQkRUIEV0aGVyUG93ZXIgMTAvMTAwCi0JCTEwYjggMjAwMiAgU01DOTMzMkJWVCBFdGhlclBvd2VyIFQ0IDEwLzEwMAotCQkxMGI4IDIwMDMgIFNNQzkzMzRCRFQgRXRoZXJQb3dlciAxMC8xMDAgKDEtcG9ydCkKLQkJMTEwOSAyNDAwICBBTkEtNjk0NEEvVFggRmFzdCBFdGhlcm5ldAotCQkxMTEyIDIzMDAgIFJOUzIzMDAgRmFzdCBFdGhlcm5ldAotCQkxMTEyIDIzMjAgIFJOUzIzMjAgRmFzdCBFdGhlcm5ldAotCQkxMTEyIDIzNDAgIFJOUzIzNDAgRmFzdCBFdGhlcm5ldAotCQkxMTEzIDEyMDcgIEVOLTEyMDctVFggRmFzdCBFdGhlcm5ldAotCQkxMTg2IDExMDAgIERGRS01MDBUWCBGYXN0IEV0aGVybmV0Ci0JCTExODYgMTExMiAgREZFLTU3MFRYIEZhc3QgRXRoZXJuZXQKLQkJMTE4NiAxMTQwICBERkUtNjYwIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExODYgMTE0MiAgREZFLTY2MCBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMWY2IDA1MDMgIEZyZWVkb21saW5lIEZhc3QgRXRoZXJuZXQKLQkJMTI4MiA5MTAwICBBRUYtMzgwVFhEIEZhc3QgRXRoZXJuZXQKLQkJMTM4NSAxMTAwICBGQTMxMFRYIEZhc3QgRXRoZXJuZXQKLQkJMjY0NiAwMDAxICBLTkUxMDBUWCBGYXN0IEV0aGVybmV0Ci0JMDAwYSAgMjEyMzAgVmlkZW8gQ29kZWMKLQkwMDBkICBQQlhHQiBbVEdBMl0KLQkwMDBmICBERUZQQQotCTAwMTQgIERFQ2NoaXAgMjEwNDEgW1R1bGlwIFBhc3MgM10KLQkJMTE4NiAwMTAwICBERS01MzArCi0JMDAxNiAgREdMUEIgW09QUE9dCi0JMDAxNyAgUFYtUENJIEdyYXBoaWNzIENvbnRyb2xsZXIgKFpMWHAtTCkKLQkwMDE5ICBERUNjaGlwIDIxMTQyLzQzCi0JCTEwMTEgNTAwYSAgREU1MDBBIEZhc3QgRXRoZXJuZXQKLQkJMTAxMSA1MDBiICBERTUwMEIgRmFzdCBFdGhlcm5ldAotCQkxMDE0IDAwMDEgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzCi0JCTEwMjUgMDMxNSAgQUxOMzE1IEZhc3QgRXRoZXJuZXQKLQkJMTAzMyA4MDBjICBQQy05ODIxLUNTMDEgMTAwQkFTRS1UWCBJbnRlcmZhY2UgQ2FyZAotCQkxMDMzIDgwMGQgIFBDLTk4MjFOUi1CMDYgMTAwQkFTRS1UWCBJbnRlcmZhY2UgQ2FyZAotCQkxMDhkIDAwMTYgIFJhcGlkZmlyZSAyMzI3IDEwLzEwMCBFdGhlcm5ldAotCQkxMDhkIDAwMTcgIEdvQ2FyZCAyMjUwIEV0aGVybmV0IDEwLzEwMCBDYXJkYnVzCi0JCTEwYjggMjAwNSAgU01DODAzMkRUIEV4dHJlbWUgRXRoZXJuZXQgMTAvMTAwCi0JCTEwYjggODAzNCAgU01DODAzNCBFeHRyZW1lIEV0aGVybmV0IDEwLzEwMAotCQkxMGVmIDgxNjkgIENhcmRidXMgRmFzdCBFdGhlcm5ldAotCQkxMTA5IDJhMDAgIEFOQS02OTExQS9UWCBGYXN0IEV0aGVybmV0Ci0JCTExMDkgMmIwMCAgQU5BLTY5MTFBL1RYQyBGYXN0IEV0aGVybmV0Ci0JCTExMDkgMzAwMCAgQU5BLTY5MjIvVFggRmFzdCBFdGhlcm5ldAotCQkxMTEzIDEyMDcgIENoZWV0YWggRmFzdCBFdGhlcm5ldAotCQkxMTEzIDIyMjAgIENhcmRidXMgRmFzdCBFdGhlcm5ldAotCQkxMTVkIDAwMDIgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExNzkgMDIwMyAgRmFzdCBFdGhlcm5ldAotCQkxMTc5IDAyMDQgIENhcmRidXMgRmFzdCBFdGhlcm5ldAotCQkxMTg2IDExMDAgIERGRS01MDBUWCBGYXN0IEV0aGVybmV0Ci0JCTExODYgMTEwMSAgREZFLTUwMFRYIEZhc3QgRXRoZXJuZXQKLQkJMTE4NiAxMTAyICBERkUtNTAwVFggRmFzdCBFdGhlcm5ldAotCQkxMTg2IDExMTIgIERGRS01NzBUWCBRdWFkIEZhc3QgRXRoZXJuZXQKLQkJMTI1OSAyODAwICBBVC0yODAwVHggRmFzdCBFdGhlcm5ldAotCQkxMjY2IDAwMDQgIEVhZ2xlIEZhc3QgRXRoZXJNQVgKLQkJMTJhZiAwMDE5ICBOZXRGbHllciBDYXJkYnVzIEZhc3QgRXRoZXJuZXQKLQkJMTM3NCAwMDAxICBDYXJkYnVzIEV0aGVybmV0IENhcmQgMTAvMTAwCi0JCTEzNzQgMDAwMiAgQ2FyZGJ1cyBFdGhlcm5ldCBDYXJkIDEwLzEwMAotCQkxMzc0IDAwMDcgIENhcmRidXMgRXRoZXJuZXQgQ2FyZCAxMC8xMDAKLQkJMTM3NCAwMDA4ICBDYXJkYnVzIEV0aGVybmV0IENhcmQgMTAvMTAwCi0JCTEzODUgMjEwMCAgRkE1MTAKLQkJMTM5NSAwMDAxICAxMC8xMDAgRXRoZXJuZXQgQ2FyZEJ1cyBQQyBDYXJkCi0JCTEzZDEgYWIwMSAgRXRoZXJGYXN0IDEwLzEwMCBDYXJkYnVzIChQQ01QQzIwMCkKLQkJMTRjYiAwMTAwICBMTkRMLTEwME4gMTAwQmFzZS1UWCBFdGhlcm5ldCBQQyBDYXJkCi0JCTgwODYgMDAwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgTW9iaWxlIENhcmRCdXMgMzIKLQkwMDFhICBGYXJhbGxvbiBQTjkwMDBTWCBHaWdhYml0IEV0aGVybmV0Ci0JMDAyMSAgREVDY2hpcCAyMTA1MgotCTAwMjIgIERFQ2NoaXAgMjExNTAKLQkwMDIzICBERUNjaGlwIDIxMTUwCi0JMDAyNCAgREVDY2hpcCAyMTE1MgotCTAwMjUgIERFQ2NoaXAgMjExNTMKLQkwMDI2ICBERUNjaGlwIDIxMTU0Ci0JMDAzNCAgNTZrIE1vZGVtIENhcmRidXMKLQkJMTM3NCAwMDAzICA1NmsgTW9kZW0gQ2FyZGJ1cwotCTAwNDUgIERFQ2NoaXAgMjE1NTMKLQkwMDQ2ICBERUNjaGlwIDIxNTU0Ci0JCTBlMTEgNDA1MCAgSW50ZWdyYXRlZCBTbWFydCBBcnJheQotCQkwZTExIDQwNTEgIEludGVncmF0ZWQgU21hcnQgQXJyYXkKLQkJMGUxMSA0MDU4ICBJbnRlZ3JhdGVkIFNtYXJ0IEFycmF5Ci0JCTEwM2MgMTBjMiAgSGV3bGV0dC1QYWNrYXJkIE5ldFJBSUQtNE0KLQkJMTJkOSAwMDBhICBJUCBUZWxlcGhvbnkgY2FyZAotCQk0YzUzIDEwNTAgIENUNyBtYWluYm9hcmQKLQkJNGM1MyAxMDUxICBDRTcgbWFpbmJvYXJkCi0JCTkwMDUgMDM2NCAgNTQwMFMgKE11c3RhbmcpCi0JCTkwMDUgMDM2NSAgNTQwMFMgKE11c3RhbmcpCi0JCTkwMDUgMTM2NCAgRGVsbCBQb3dlckVkZ2UgUkFJRCBDb250cm9sbGVyIDIKLQkJOTAwNSAxMzY1ICBEZWxsIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMgotCQllNGJmIDEwMDAgIENDOC0xLUJMVUVTCi0JMTA2NSAgU3Ryb25nQVJNIERDMjEyODUKLQkJMTA2OSAwMDIwICBEQUM5NjBQIC8gREFDMTE2NFAKLTEwMTIgIE1pY3JvbmljcyBDb21wdXRlcnMgSW5jCi0xMDEzICBDaXJydXMgTG9naWMKLQkwMDM4ICBHRCA3NTQ4Ci0JMDA0MCAgR0QgNzU1NSBGbGF0IFBhbmVsIEdVSSBBY2NlbGVyYXRvcgotCTAwNGMgIEdEIDc1NTYgVmlkZW8vR3JhcGhpY3MgTENEL0NSVCBDdHJscgotCTAwYTAgIEdEIDU0MzAvNDAgW0FscGluZV0KLQkwMGEyICBHRCA1NDMyIFtBbHBpbmVdCi0JMDBhNCAgR0QgNTQzNC00IFtBbHBpbmVdCi0JMDBhOCAgR0QgNTQzNC04IFtBbHBpbmVdCi0JMDBhYyAgR0QgNTQzNiBbQWxwaW5lXQotCTAwYjAgIEdEIDU0NDAKLQkwMGI4ICBHRCA1NDQ2Ci0JMDBiYyAgR0QgNTQ4MAotCQkxMDEzIDAwYmMgIENMLUdENTQ4MAotCTAwZDAgIEdEIDU0NjIKLQkwMGQyICBHRCA1NDYyIFtMYWd1bmEgSV0KLQkwMGQ0ICBHRCA1NDY0IFtMYWd1bmFdCi0JMDBkNSAgR0QgNTQ2NCBCRCBbTGFndW5hXQotCTAwZDYgIEdEIDU0NjUgW0xhZ3VuYV0KLQkJMTNjZSA4MDMxICBCYXJjbyBNZXRoZXVzIDIgTWVnYXBpeGVsLCBEdWFsIEhlYWQKLQkJMTNjZiA4MDMxICBCYXJjbyBNZXRoZXVzIDIgTWVnYXBpeGVsLCBEdWFsIEhlYWQKLQkwMGU4ICBHRCA1NDM2VQotCTExMDAgIENMIDY3MjkKLQkxMTEwICBQRCA2ODMyIFBDTUNJQS9DYXJkQnVzIEN0cmxyCi0JMTExMiAgUEQgNjgzNCBQQ01DSUEvQ2FyZEJ1cyBDdHJscgotCTExMTMgIFBEIDY4MzMgUENNQ0lBL0NhcmRCdXMgQ3RybHIKLQkxMjAwICBHRCA3NTQyIFtOb3JkaWNdCi0JMTIwMiAgR0QgNzU0MyBbVmlraW5nXQotCTEyMDQgIEdEIDc1NDEgW05vcmRpYyBMaWdodF0KLQk0MDAwICBNRCA1NjIwIFtDTE0gRGF0YSBGYXggVm9pY2VdCi0JNDQwMCAgQ0QgNDQwMAotCTYwMDEgIENTIDQ2MTAvMTEgW0NyeXN0YWxDbGVhciBTb3VuZEZ1c2lvbiBBdWRpbyBBY2NlbGVyYXRvcl0KLQkJMTAxNCAxMDEwICBDUzQ2MTAgU291bmRGdXNpb24gQXVkaW8gQWNjZWxlcmF0b3IKLQk2MDAzICBDUyA0NjE0LzIyLzI0IFtDcnlzdGFsQ2xlYXIgU291bmRGdXNpb24gQXVkaW8gQWNjZWxlcmF0b3JdCi0JCTEwMTMgNDI4MCAgQ3J5c3RhbCBTb3VuZEZ1c2lvbiBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTUzYiAxMTM2ICBTaVhQYWNrIDUuMSsKLQkJMTY4MSAwMDUwICBHYW1lIFRoZWF0ZXIgWFAKLQkJMTY4MSBhMDExICBGb3J0aXNzaW1vIElJSSA3LjEKLQk2MDA0ICBDUyA0NjE0LzIyLzI0IFtDcnlzdGFsQ2xlYXIgU291bmRGdXNpb24gQXVkaW8gQWNjZWxlcmF0b3JdCi0JNjAwNSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwMTMgNDI4MSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhOCAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhOSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhYSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhYiAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhYyAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBhZCAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTEwY2YgMTBiNCAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTExNzkgMDAwMSAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0JCTE0YzAgMDAwYyAgQ3J5c3RhbCBDUzQyODEgUENJIEF1ZGlvCi0xMDE0ICBJQk0KLQkwMDAyICBQQ0kgdG8gTUNBIEJyaWRnZQotCTAwMDUgIEFsdGEgTGl0ZQotCTAwMDcgIEFsdGEgTVAKLQkwMDBhICBGaXJlIENvcmFsCi0JMDAxNyAgQ1BVIHRvIFBDSSBCcmlkZ2UKLQkwMDE4ICBUUiBBdXRvIExBTnN0cmVhbWVyCi0JMDAxYiAgR1hULTE1MFAKLQkwMDFjICBDYXJyZXJhCi0JMDAxZCAgODJHMjY3NQotCTAwMjAgIEdYVDEwMDAgR3JhcGhpY3MgQWRhcHRlcgotCTAwMjIgIElCTTI3LTgyMzUxCi0JMDAyZCAgUHl0aG9uCi0jIFtvZmZpY2lhbCBuYW1lIGluIEFJWCA1XQotCTAwMmUgIFNDU0kgUkFJRCBBZGFwdGVyIFtTZXJ2ZVJBSURdCi0JCTEwMTQgMDAyZSAgU2VydmVSQUlELTN4Ci0JCTEwMTQgMDIyZSAgU2VydmVSQUlELTRICi0JMDAzMSAgMiBQb3J0IFNlcmlhbCBBZGFwdGVyCi0jIEFTNDAwIGlTZXJpZXMgUENJIHN5bmMgc2VyaWFsIGNhcmQKLQkJMTAxNCAwMDMxICAyNzIxIFdBTiBJT0EgLSAyIFBvcnQgU3luYyBTZXJpYWwgQWRhcHRlcgotCTAwMzYgIE1pYW1pCi0JMDAzNyAgODI2NjAgQ1BVIHRvIFBDSSBCcmlkZ2UKLQkwMDNhICBDUFUgdG8gUENJIEJyaWRnZQotCTAwM2MgIEdYVDI1MFAvR1hUMjU1UCBHcmFwaGljcyBBZGFwdGVyCi0JMDAzZSAgMTYvNCBUb2tlbiByaW5nIFVUUC9TVFAgY29udHJvbGxlcgotCQkxMDE0IDAwM2UgIFRva2VuLVJpbmcgQWRhcHRlcgotCQkxMDE0IDAwY2QgIFRva2VuLVJpbmcgQWRhcHRlciArIFdha2UtT24tTEFOCi0JCTEwMTQgMDBjZSAgMTYvNCBUb2tlbi1SaW5nIEFkYXB0ZXIgMgotCQkxMDE0IDAwY2YgIDE2LzQgVG9rZW4tUmluZyBBZGFwdGVyIFNwZWNpYWwKLQkJMTAxNCAwMGU0ICBIaWdoLVNwZWVkIDEwMC8xNi80IFRva2VuLVJpbmcgQWRhcHRlcgotCQkxMDE0IDAwZTUgIDE2LzQgVG9rZW4tUmluZyBBZGFwdGVyIDIgKyBXYWtlLU9uLUxBTgotCQkxMDE0IDAxNmQgIGlTZXJpZXMgMjc0NCBDYXJkCi0JMDA0NSAgU1NBIEFkYXB0ZXIKLQkwMDQ2ICBNUElDIGludGVycnVwdCBjb250cm9sbGVyCi0JMDA0NyAgUENJIHRvIFBDSSBCcmlkZ2UKLQkwMDQ4ICBQQ0kgdG8gUENJIEJyaWRnZQotCTAwNDkgIFdhcmhlYWQgU0NTSSBDb250cm9sbGVyCi0JMDA0ZSAgQVRNIENvbnRyb2xsZXIgKDE0MTA0ZTAwKQotCTAwNGYgIEFUTSBDb250cm9sbGVyICgxNDEwNGYwMCkKLQkwMDUwICBBVE0gQ29udHJvbGxlciAoMTQxMDUwMDApCi0JMDA1MyAgMjUgTUJpdCBBVE0gQ29udHJvbGxlcgotCTAwNTQgIEdYVDUwMFAvR1hUNTUwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDA1NyAgTVBFRyBQQ0kgQnJpZGdlCi0JMDA1YyAgaTgyNTU3QiAxMC8xMDAKLQkwMDVlICBHWFQ4MDBQIEdyYXBoaWNzIEFkYXB0ZXIKLQkwMDdjICBBVE0gQ29udHJvbGxlciAoMTQxMDdjMDApCi0JMDA3ZCAgMzc4MElEU1AgW01XYXZlXQotCTAwOGIgIEVBRFMgUENJIHRvIFBDSSBCcmlkZ2UKLQkwMDhlICBHWFQzMDAwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDA5MCAgR1hUIDMwMDBQCi0JCTEwMTQgMDA4ZSAgR1hULTMwMDBQCi0JMDA5MSAgU1NBIEFkYXB0ZXIKLQkwMDk1ICAyMEgyOTk5IFBDSSBEb2NraW5nIEJyaWRnZQotCTAwOTYgIENodWthciBjaGlwc2V0IFNDU0kgY29udHJvbGxlcgotCQkxMDE0IDAwOTcgIGlTZXJpZXMgMjc3OCBEQVNEIElPQQotCQkxMDE0IDAwOTggIGlTZXJpZXMgMjc2MyBEQVNEIElPQQotCQkxMDE0IDAwOTkgIGlTZXJpZXMgMjc0OCBEQVNEIElPQQotCTAwOWYgIFBDSSA0NzU4IENyeXB0b2dyYXBoaWMgQWNjZWxlcmF0b3IKLQkwMGE1ICBBVE0gQ29udHJvbGxlciAoMTQxMGE1MDApCi0JMDBhNiAgQVRNIDE1NU1CUFMgTU0gQ29udHJvbGxlciAoMTQxMGE2MDApCi0JMDBiNyAgMjU2LWJpdCBHcmFwaGljcyBSYXN0ZXJpemVyIFtGaXJlIEdMMV0KLQkJMTA5MiAwMGI4ICBGaXJlR0wxIEFHUCAzMk1iCi0JMDBiOCAgR1hUMjAwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAwYmUgIEFUTSA2MjJNQlBTIENvbnRyb2xsZXIgKDE0MTBiZTAwKQotCTAwZGMgIEFkdmFuY2VkIFN5c3RlbXMgTWFuYWdlbWVudCBBZGFwdGVyIChBU01BKQotCTAwZmMgIENQQzcxMCBEdWFsIEJyaWRnZSBhbmQgTWVtb3J5IENvbnRyb2xsZXIgKFBDSS02NCkKLQkwMTA0ICBHaWdhYml0IEV0aGVybmV0LVNYIEFkYXB0ZXIKLQkwMTA1ICBDUEM3MTAgRHVhbCBCcmlkZ2UgYW5kIE1lbW9yeSBDb250cm9sbGVyIChQQ0ktMzIpCi0JMDEwZiAgUmVtb3RlIFN1cGVydmlzb3IgQWRhcHRlciAoUlNBKQotCTAxNDIgIFlvdHRhIFZpZGVvIENvbXBvc2l0b3IgSW5wdXQKLQkJMTAxNCAwMTQzICBZb3R0YSBJbnB1dCBDb250cm9sbGVyICh5dGluKQotCTAxNDQgIFlvdHRhIFZpZGVvIENvbXBvc2l0b3IgT3V0cHV0Ci0JCTEwMTQgMDE0NSAgWW90dGEgT3V0cHV0IENvbnRyb2xsZXIgKHl0b3V0KQotCTAxNTYgIDQwNUdQIFBMQiB0byBQQ0kgQnJpZGdlCi0JMDE1ZSAgNjIyTWJwcyBBVE0gUENJIEFkYXB0ZXIKLQkwMTYwICA2NGJpdC82Nk1IeiBQQ0kgQVRNIDE1NSBNTUYKLQkwMTZlICBHWFQ0MDAwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDE3MCAgR1hUNjAwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAxN2QgIEdYVDMwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAxODAgIFNuaXBlIGNoaXBzZXQgU0NTSSBjb250cm9sbGVyCi0JCTEwMTQgMDI0MSAgaVNlcmllcyAyNzU3IERBU0QgSU9BCi0JCTEwMTQgMDI2NCAgUXVhZCBDaGFubmVsIFBDSS1YIFUzMjAgU0NTSSBSQUlEIEFkYXB0ZXIgKDI3ODApCi0JMDE4OCAgRUFEUy1YIFBDSS1YIHRvIFBDSS1YIEJyaWRnZQotCTAxYTcgIFBDSS1YIHRvIFBDSS1YIEJyaWRnZQotCTAxYmQgIFNlcnZlUkFJRCBDb250cm9sbGVyCi0JCTEwMTQgMDFiZSAgU2VydmVSQUlELTRNCi0JCTEwMTQgMDFiZiAgU2VydmVSQUlELTRMCi0JCTEwMTQgMDIwOCAgU2VydmVSQUlELTRNeAotCQkxMDE0IDAyMGUgIFNlcnZlUkFJRC00THgKLQkJMTAxNCAwMjJlICBTZXJ2ZVJBSUQtNEgKLQkJMTAxNCAwMjU4ICBTZXJ2ZVJBSUQtNWkKLQkJMTAxNCAwMjU5ICBTZXJ2ZVJBSUQtNWkKLQkwMWMxICA2NGJpdC82Nk1IeiBQQ0kgQVRNIDE1NSBVVFAKLQkwMWU2ICBDcnlwdG9ncmFwaGljIEFjY2VsZXJhdG9yCi0JMDFmZiAgMTAvMTAwIE1icHMgRXRoZXJuZXQKLQkwMjE5ICBNdWx0aXBvcnQgU2VyaWFsIEFkYXB0ZXIKLQkJMTAxNCAwMjFhICBEdWFsIFJWWAotCQkxMDE0IDAyNTEgIEludGVybmFsIE1vZGVtL1JWWAotCQkxMDE0IDAyNTIgIFF1YWQgSW50ZXJuYWwgTW9kZW0KLQkwMjFiICBHWFQ2NTAwUCBHcmFwaGljcyBBZGFwdGVyCi0JMDIxYyAgR1hUNDUwMFAgR3JhcGhpY3MgQWRhcHRlcgotCTAyMzMgIEdYVDEzNVAgR3JhcGhpY3MgQWRhcHRlcgotCTAyNjYgIFBDSS1YIER1YWwgQ2hhbm5lbCBTQ1NJCi0JMDI2OCAgR2lnYWJpdCBFdGhlcm5ldC1TWCBBZGFwdGVyIChQQ0ktWCkKLQkwMjY5ICAxMC8xMDAvMTAwMCBCYXNlLVRYIEV0aGVybmV0IEFkYXB0ZXIgKFBDSS1YKQotCTAyOGMgIENpdHJpbmUgY2hpcHNldCBTQ1NJIGNvbnRyb2xsZXIKLQkJMTAxNCAwMjhEICBEdWFsIENoYW5uZWwgUENJLVggRERSIFNBUyBSQUlEIEFkYXB0ZXIgKDU3MkUpCi0JCTEwMTQgMDJCRSAgRHVhbCBDaGFubmVsIFBDSS1YIEREUiBVMzIwIFNDU0kgUkFJRCBBZGFwdGVyICg1NzFCKQotCQkxMDE0IDAyQzAgIER1YWwgQ2hhbm5lbCBQQ0ktWCBERFIgVTMyMCBTQ1NJIEFkYXB0ZXIgKDU3MUEpCi0JMDMwMiAgWC1BcmNoaXRlY3R1cmUgQnJpZGdlIFtTdW1taXRdCi0JMDMxNCAgWklTQyAwMzYgTmV1cmFsIGFjY2VsZXJhdG9yIGNhcmQKLQlmZmZmICBNUElDLTIgaW50ZXJydXB0IGNvbnRyb2xsZXIKLTEwMTUgIExTSSBMb2dpYyBDb3JwIG9mIENhbmFkYQotMTAxNiAgSUNMIFBlcnNvbmFsIFN5c3RlbXMKLTEwMTcgIFNQRUEgU29mdHdhcmUgQUcKLQk1MzQzICBTUEVBIDNEIEFjY2VsZXJhdG9yCi0xMDE4ICBVbmlzeXMgU3lzdGVtcwotMTAxOSAgRWxpdGVncm91cCBDb21wdXRlciBTeXN0ZW1zCi0xMDFhICBBVCZUIEdJUyAoTkNSKQotCTAwMDUgIDEwMFZHIGV0aGVybmV0Ci0xMDFiICBWaXRlc3NlIFNlbWljb25kdWN0b3IKLTEwMWMgIFdlc3Rlcm4gRGlnaXRhbAotCTAxOTMgIDMzQzE5M0EKLQkwMTk2ICAzM0MxOTZBCi0JMDE5NyAgMzNDMTk3QQotCTAyOTYgIDMzQzI5NkEKLQkzMTkzICA3MTkzCi0JMzE5NyAgNzE5NwotCTMyOTYgIDMzQzI5NkEKLQk0Mjk2ICAzNEMyOTYKLQk5NzEwICBQaXBlbGluZSA5NzEwCi0JOTcxMiAgUGlwZWxpbmUgOTcxMgotCWMyNGEgIDkwQwotMTAxZSAgQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuCi0JMTk2MCAgTWVnYVJBSUQKLQkJMTAxZSAwNDcxICBNZWdhUkFJRCA0NzEgRW50ZXJwcmlzZSAxNjAwIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA0NzUgIE1lZ2FSQUlEIDQ3NSBFeHByZXNzIDUwMC81MDBMQyBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDc3ICBNZWdhUkFJRCA0NzcgRWxpdGUgMzEwMCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDkzICBNZWdhUkFJRCA0OTMgRWxpdGUgMTYwMCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDk0ICBNZWdhUkFJRCA0OTQgRWxpdGUgMTY1MCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNTAzICBNZWdhUkFJRCA1MDMgRW50ZXJwcmlzZSAxNjUwIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA1MTEgIE1lZ2FSQUlEIDUxMSBpNCBJREUgUkFJRCBDb250cm9sbGVyCi0JCTEwMWUgMDUyMiAgTWVnYVJBSUQgNTIyIGk0MTMzIFJBSUQgQ29udHJvbGxlcgotCQkxMDI4IDA0NzEgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMy9RQwotCQkxMDI4IDA0NzUgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMy9TQwotCQkxMDI4IDA0OTMgIFBvd2VyRWRnZSBSQUlEIENvbnRyb2xsZXIgMy9EQwotCQkxMDI4IDA1MTEgIFBvd2VyRWRnZSBDb3N0IEVmZmVjdGl2ZSBSQUlEIENvbnRyb2xsZXIgQVRBMTAwLzRDaAotCTkwMTAgIE1lZ2FSQUlEIDQyOCBVbHRyYSBSQUlEIENvbnRyb2xsZXIKLQk5MDMwICBFSURFIENvbnRyb2xsZXIKLQk5MDMxICBFSURFIENvbnRyb2xsZXIKLQk5MDMyICBFSURFICYgU0NTSSBDb250cm9sbGVyCi0JOTAzMyAgU0NTSSBDb250cm9sbGVyCi0JOTA0MCAgTXVsdGltZWRpYSBjYXJkCi0JOTA2MCAgTWVnYVJBSUQgNDM0IFVsdHJhIEdUIFJBSUQgQ29udHJvbGxlcgotCTkwNjMgIE1lZ2FSQUMKLQkJMTAxZSAwNzY3ICBEZWxsIFJlbW90ZSBBc3Npc3RhbnQgQ2FyZCAyCi0xMDFmICBQaWN0dXJlVGVsCi0xMDIwICBIaXRhY2hpIENvbXB1dGVyIFByb2R1Y3RzCi0xMDIxICBPS0kgRWxlY3RyaWMgSW5kdXN0cnkgQ28uIEx0ZC4KLTEwMjIgIEFkdmFuY2VkIE1pY3JvIERldmljZXMgW0FNRF0KLQkxMTAwICBLOCBbQXRobG9uNjQvT3B0ZXJvbl0gSHlwZXJUcmFuc3BvcnQgVGVjaG5vbG9neSBDb25maWd1cmF0aW9uCi0JMTEwMSAgSzggW0F0aGxvbjY0L09wdGVyb25dIEFkZHJlc3MgTWFwCi0JMTEwMiAgSzggW0F0aGxvbjY0L09wdGVyb25dIERSQU0gQ29udHJvbGxlcgotCTExMDMgIEs4IFtBdGhsb242NC9PcHRlcm9uXSBNaXNjZWxsYW5lb3VzIENvbnRyb2wKLQkyMDAwICA3OWM5NzAgW1BDbmV0MzIgTEFOQ0VdCi0JCTEwMTQgMjAwMCAgTmV0RmluaXR5IDEwLzEwMCBGYXN0IEV0aGVybmV0Ci0JCTEwMjIgMjAwMCAgUENuZXQgLSBGYXN0IDc5Qzk3MQotCQkxMDNjIDEwNGMgIEV0aGVybmV0IHdpdGggTEFOIHJlbW90ZSBwb3dlciBBZGFwdGVyCi0JCTEwM2MgMTA2NCAgRXRoZXJuZXQgd2l0aCBMQU4gcmVtb3RlIHBvd2VyIEFkYXB0ZXIKLQkJMTAzYyAxMDY1ICBFdGhlcm5ldCB3aXRoIExBTiByZW1vdGUgcG93ZXIgQWRhcHRlcgotCQkxMDNjIDEwNmMgIEV0aGVybmV0IHdpdGggTEFOIHJlbW90ZSBwb3dlciBBZGFwdGVyCi0JCTEwM2MgMTA2ZSAgRXRoZXJuZXQgd2l0aCBMQU4gcmVtb3RlIHBvd2VyIEFkYXB0ZXIKLQkJMTAzYyAxMGVhICBFdGhlcm5ldCB3aXRoIExBTiByZW1vdGUgcG93ZXIgQWRhcHRlcgotCQkxMTEzIDEyMjAgIEVOMTIyMCAxMC8xMDAgRmFzdCBFdGhlcm5ldAotCQkxMjU5IDI0NTAgIEFULTI0NTAgMTAvMTAwIEZhc3QgRXRoZXJuZXQKLQkJMTI1OSAyNDU0ICBBVC0yNDUwdjQgMTBNYiBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyNTkgMjcwMCAgQVQtMjcwMFRYIDEwLzEwMCBGYXN0IEV0aGVybmV0Ci0JCTEyNTkgMjcwMSAgQVQtMjcwMEZYIDEwME1iIEV0aGVybmV0Ci0JCTRjNTMgMTAwMCAgQ0M3L0NSNy9DUDcvVkM3L1ZQNy9WUjcgbWFpbmJvYXJkCi0JCTRjNTMgMTAxMCAgQ1A1L0NSNiBtYWluYm9hcmQKLQkJNGM1MyAxMDIwICBWUjYgbWFpbmJvYXJkCi0JCTRjNTMgMTAzMCAgUEM1IG1haW5ib2FyZAotCQk0YzUzIDEwNDAgIENMNyBtYWluYm9hcmQKLQkJNGM1MyAxMDYwICBQQzcgbWFpbmJvYXJkCi0JMjAwMSAgNzljOTc4IFtIb21lUE5BXQotCQkxMDkyIDBhNzggIE11bHRpbWVkaWEgSG9tZSBOZXR3b3JrIEFkYXB0ZXIKLQkJMTY2OCAwMjk5ICBBY3Rpb25MaW5rIEhvbWUgTmV0d29yayBBZGFwdGVyCi0JMjAwMyAgQW0gMTc3MSBNQlcgW0FsY2hlbXldCi0JMjAyMCAgNTNjOTc0IFtQQ3Njc2ldCi0JMjA0MCAgNzljOTc0Ci0JMzAwMCAgRUxhblNDNTIwIE1pY3JvY29udHJvbGxlcgotCTcwMDYgIEFNRC03NTEgW0lyb25nYXRlXSBTeXN0ZW0gQ29udHJvbGxlcgotCTcwMDcgIEFNRC03NTEgW0lyb25nYXRlXSBBR1AgQnJpZGdlCi0JNzAwYSAgQU1ELUlHUjQgQUdQIEhvc3QgdG8gUENJIEJyaWRnZQotCTcwMGIgIEFNRC1JR1I0IFBDSSB0byBQQ0kgQnJpZGdlCi0JNzAwYyAgQU1ELTc2MCBNUCBbSUdENC0yUF0gU3lzdGVtIENvbnRyb2xsZXIKLQk3MDBkICBBTUQtNzYwIE1QIFtJR0Q0LTJQXSBBR1AgQnJpZGdlCi0JNzAwZSAgQU1ELTc2MCBbSUdENC0xUF0gU3lzdGVtIENvbnRyb2xsZXIKLQk3MDBmICBBTUQtNzYwIFtJR0Q0LTFQXSBBR1AgQnJpZGdlCi0JNzQwMCAgQU1ELTc1NSBbQ29icmFdIElTQQotCTc0MDEgIEFNRC03NTUgW0NvYnJhXSBJREUKLQk3NDAzICBBTUQtNzU1IFtDb2JyYV0gQUNQSQotCTc0MDQgIEFNRC03NTUgW0NvYnJhXSBVU0IKLQk3NDA4ICBBTUQtNzU2IFtWaXBlcl0gSVNBCi0JNzQwOSAgQU1ELTc1NiBbVmlwZXJdIElERQotCTc0MGIgIEFNRC03NTYgW1ZpcGVyXSBBQ1BJCi0JNzQwYyAgQU1ELTc1NiBbVmlwZXJdIFVTQgotCTc0MTAgIEFNRC03NjYgW1ZpcGVyUGx1c10gSVNBCi0JNzQxMSAgQU1ELTc2NiBbVmlwZXJQbHVzXSBJREUKLQk3NDEzICBBTUQtNzY2IFtWaXBlclBsdXNdIEFDUEkKLQk3NDE0ICBBTUQtNzY2IFtWaXBlclBsdXNdIFVTQgotCTc0NDAgIEFNRC03NjggW09wdXNdIElTQQotCQkxMDQzIDgwNDQgIEE3TS1EIE1haW5ib2FyZAotCTc0NDEgIEFNRC03NjggW09wdXNdIElERQotCTc0NDMgIEFNRC03NjggW09wdXNdIEFDUEkKLQkJMTA0MyA4MDQ0ICBBN00tRCBNYWluYm9hcmQKLQk3NDQ1ICBBTUQtNzY4IFtPcHVzXSBBdWRpbwotCTc0NDYgIEFNRC03NjggW09wdXNdIE1DOTcgTW9kZW0gKFNtYXJ0IExpbmsgSEFNUjU2MDAgY29tcGF0aWJsZSkKLQk3NDQ4ICBBTUQtNzY4IFtPcHVzXSBQQ0kKLQk3NDQ5ICBBTUQtNzY4IFtPcHVzXSBVU0IKLQk3NDUwICBBTUQtODEzMSBQQ0ktWCBCcmlkZ2UKLQk3NDUxICBBTUQtODEzMSBQQ0ktWCBBUElDCi0JNzQ1NCAgQU1ELTgxNTEgU3lzdGVtIENvbnRyb2xsZXIKLQk3NDU1ICBBTUQtODE1MSBBR1AgQnJpZGdlCi0JNzQ2MCAgQU1ELTgxMTEgUENJCi0JCTE2MWYgMzAxNyAgSERBTUIKLQk3NDYxICBBTUQtODExMSBVU0IKLQk3NDYyICBBTUQtODExMSBFdGhlcm5ldAotCTc0NjQgIEFNRC04MTExIFVTQgotCQkxNjFmIDMwMTcgIEhEQU1CCi0JNzQ2OCAgQU1ELTgxMTEgTFBDCi0JCTE2MWYgMzAxNyAgSERBTUIKLQk3NDY5ICBBTUQtODExMSBJREUKLQkJMTYxZiAzMDE3ICBIREFNQgotCTc0NmEgIEFNRC04MTExIFNNQnVzIDIuMAotCTc0NmIgIEFNRC04MTExIEFDUEkKLQkJMTYxZiAzMDE3ICBIREFNQgotCTc0NmQgIEFNRC04MTExIEFDOTcgQXVkaW8KLQkJMTYxZiAzMDE3ICBIREFNQgotCTc0NmUgIEFNRC04MTExIE1DOTcgTW9kZW0KLQk3NTZiICBBTUQtODExMSBBQ1BJCi0xMDIzICBUcmlkZW50IE1pY3Jvc3lzdGVtcwotCTAxOTQgIDgyQzE5NAotCTIwMDAgIDREV2F2ZSBEWAotCTIwMDEgIDREV2F2ZSBOWAotCQkxMjJkIDE0MDAgIFRyaWRlbnQgUENJMjg4LVEzRElJIChOWCkKLQkyMTAwICBDeWJlckJsYWRlIFhQNG0zMgotCTIyMDAgIFhHSSBWb2xhcmkgWFA1Ci0JODQwMCAgQ3liZXJCbGFkZS9pNwotCQkxMDIzIDg0MDAgIEN5YmVyQmxhZGUgaTcgQUdQCi0JODQyMCAgQ3liZXJCbGFkZS9pN2QKLQkJMGUxMSBiMTVhICBDeWJlckJsYWRlIGk3IEFHUAotCTg1MDAgIEN5YmVyQmxhZGUvaTEKLQk4NTIwICBDeWJlckJsYWRlIGkxCi0JCTBlMTEgYjE2ZSAgQ3liZXJCbGFkZSBpMSBBR1AKLQkJMTAyMyA4NTIwICBDeWJlckJsYWRlIGkxIEFHUAotCTg2MjAgIEN5YmVyQmxhZGUvaTEKLQkJMTAxNCAwNTAyICBUaGlua1BhZCBSMzAvVDMwCi0JODgyMCAgQ3liZXJCbGFkZSBYUEFpMQotCTkzMjAgIFRHVUkgOTMyMAotCTkzNTAgIEdVSSBBY2NlbGVyYXRvcgotCTkzNjAgIEZsYXQgcGFuZWwgR1VJIEFjY2VsZXJhdG9yCi0JOTM4MiAgQ3liZXIgOTM4MiBbUmVmZXJlbmNlIGRlc2lnbl0KLQk5MzgzICBDeWJlciA5MzgzIFtSZWZlcmVuY2UgZGVzaWduXQotCTkzODUgIEN5YmVyIDkzODUgW1JlZmVyZW5jZSBkZXNpZ25dCi0JOTM4NiAgQ3liZXIgOTM4NgotCTkzODggIEN5YmVyIDkzODgKLQk5Mzk3ICBDeWJlciA5Mzk3Ci0JOTM5YSAgQ3liZXIgOTM5N0RWRAotCTk0MjAgIFRHVUkgOTQyMAotCTk0MzAgIFRHVUkgOTQzMAotCTk0NDAgIFRHVUkgOTQ0MAotCTk0NjAgIFRHVUkgOTQ2MAotCTk0NzAgIFRHVUkgOTQ3MAotCTk1MjAgIEN5YmVyIDk1MjAKLQk5NTI1ICBDeWJlciA5NTI1Ci0JCTEwY2YgMTA5NCAgTGlmZWJvb2sgQzYxNTUKLQk5NTQwICBDeWJlciA5NTQwCi0JOTY2MCAgVEdVSSA5NjYwLzkzOHgvOTY4eAotCTk2ODAgIFRHVUkgOTY4MAotCTk2ODIgIFRHVUkgOTY4MgotCTk2ODMgIFRHVUkgOTY4MwotCTk2ODUgIFByb1ZJRElBIDk2ODUKLQk5NzUwICAzREltYWdlIDk3NTAKLQkJMTAxNCA5NzUwICAzREltYWdlIDk3NTAKLQkJMTAyMyA5NzUwICAzREltYWdlIDk3NTAKLQk5NzUzICBUR1VJIDk3NTMKLQk5NzU0ICBUR1VJIDk3NTQKLQk5NzU5ICBUR1VJIDk3NQotCTk3ODMgIFRHVUkgOTc4MwotCTk3ODUgIFRHVUkgOTc4NQotCTk4NTAgIDNESW1hZ2UgOTg1MAotCTk4ODAgIEJsYWRlIDNEIFBDSS9BR1AKLQkJMTAyMyA5ODgwICBCbGFkZSAzRAotCTk5MTAgIEN5YmVyQmxhZGUvWFAKLQk5OTMwICBDeWJlckJsYWRlL1hQbQotMTAyNCAgWmVuaXRoIERhdGEgU3lzdGVtcwotMTAyNSAgQWNlciBJbmNvcnBvcmF0ZWQgW0FMSV0KLQkxNDM1ICBNMTQzNQotCTE0NDUgIE0xNDQ1Ci0JMTQ0OSAgTTE0NDkKLQkxNDUxICBNMTQ1MQotCTE0NjEgIE0xNDYxCi0JMTQ4OSAgTTE0ODkKLQkxNTExICBNMTUxMQotCTE1MTIgIEFMSSBNMTUxMiBBbGFkZGluCi0JMTUxMyAgTTE1MTMKLQkxNTIxICBBTEkgTTE1MjEgQWxhZGRpbiBJSUkgQ1BVIEJyaWRnZQotCQkxMGI5IDE1MjEgIEFMSSBNMTUyMSBBbGFkZGluIElJSSBDUFUgQnJpZGdlCi0JMTUyMyAgQUxJIE0xNTIzIElTQSBCcmlkZ2UKLQkJMTBiOSAxNTIzICBBTEkgTTE1MjMgSVNBIEJyaWRnZQotCTE1MzEgIE0xNTMxIE5vcnRoYnJpZGdlIFtBbGFkZGluIElWL0lWK10KLQkxNTMzICBNMTUzMyBQQ0ktdG8tSVNBIEJyaWRnZQotCQkxMGI5IDE1MzMgIEFMSSBNMTUzMyBBbGFkZGluIElWL1YgSVNBIFNvdXRoIEJyaWRnZQotCTE1MzUgIE0xNTM1IFBDSSBCcmlkZ2UgKyBTdXBlciBJL08gKyBGSVIKLQkxNTQxICBNMTU0MSBOb3J0aGJyaWRnZSBbQWxhZGRpbiBWXQotCQkxMGI5IDE1NDEgIEFMSSBNMTU0MSBBbGFkZGluIFYvVisgQUdQK1BDSSBOb3J0aCBCcmlkZ2UKLQkxNTQyICBNMTU0MiBOb3J0aGJyaWRnZSBbQWxhZGRpbiBWXQotCTE1NDMgIE0xNTQzIFBDSS10by1JU0EgQnJpZGdlICsgU3VwZXIgSS9PICsgRklSCi0JMTU2MSAgTTE1NjEgTm9ydGhicmlkZ2UgW0FsYWRkaW4gN10KLQkxNjIxICBNMTYyMSBOb3J0aGJyaWRnZSBbQWxhZGRpbi1Qcm8gSUldCi0JMTYzMSAgTTE2MzEgTm9ydGhicmlkZ2UrM0QgR3JhcGhpY3MgW0FsYWRkaW4gVE5UMl0KLQkxNjQxICBNMTY0MSBOb3J0aGJyaWRnZSBbQWxhZGRpbi1Qcm8gSVZdCi0JMTY0NyAgTTE2NDcgW01hR2lLMV0gUENJIE5vcnRoIEJyaWRnZQotCTE2NzEgIE0xNjcxIE5vcnRoYnJpZGdlIFtBTEFERGlOLVA0XQotCTE2NzIgIE5vcnRoYnJpZGdlIFtDeWJlckFMQUREaU4tUDRdCi0JMzE0MSAgTTMxNDEKLQkzMTQzICBNMzE0MwotCTMxNDUgIE0zMTQ1Ci0JMzE0NyAgTTMxNDcKLQkzMTQ5ICBNMzE0OQotCTMxNTEgIE0zMTUxCi0JMzMwNyAgTTMzMDcgTVBFRy1JIFZpZGVvIENvbnRyb2xsZXIKLQkzMzA5ICBNMzMwOSBNUEVHLUlJIFZpZGVvIHcvIFNvZnR3YXJlIEF1ZGlvIERlY29kZXIKLQkzMzIxICBNMzMyMSBNUEVHLUlJIEF1ZGlvL1ZpZGVvIERlY29kZXIKLQk1MjEyICBNNDgwMwotCTUyMTUgIEFMSSBQQ0kgRUlERSBDb250cm9sbGVyCi0JNTIxNyAgTTUyMTdICi0JNTIxOSAgTTUyMTkKLQk1MjI1ICBNNTIyNQotCTUyMjkgIE01MjI5Ci0JNTIzNSAgTTUyMzUKLQk1MjM3ICBNNTIzNyBQQ0kgVVNCIEhvc3QgQ29udHJvbGxlcgotCTUyNDAgIEVJREUgQ29udHJvbGxlcgotCTUyNDEgIFBDTUNJQSBCcmlkZ2UKLQk1MjQyICBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbGxlcgotCTUyNDMgIFBDSSB0byBQQ0kgQnJpZGdlIENvbnRyb2xsZXIKLQk1MjQ0ICBGbG9wcHkgRGlzayBDb250cm9sbGVyCi0JNTI0NyAgTTE1NDEgUENJIHRvIFBDSSBCcmlkZ2UKLQk1MjUxICBNNTI1MSBQMTM5NCBDb250cm9sbGVyCi0JNTQyNyAgUENJIHRvIEFHUCBCcmlkZ2UKLQk1NDUxICBNNTQ1MSBQQ0kgQUMtTGluayBDb250cm9sbGVyIEF1ZGlvIERldmljZQotCTU0NTMgIE01NDUzIFBDSSBBQy1MaW5rIENvbnRyb2xsZXIgTW9kZW0gRGV2aWNlCi0JNzEwMSAgTTcxMDEgUENJIFBNVSBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQkJMTBiOSA3MTAxICBNNzEwMSBQQ0kgUE1VIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbGxlcgotMTAyOCAgRGVsbAotCTAwMDEgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciAyL1NpCi0JCTEwMjggMDAwMSAgUG93ZXJFZGdlIDI0MDAKLQkwMDAyICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMy9EaQotCQkxMDI4IDAwMDIgIFBvd2VyRWRnZSA0NDAwCi0JMDAwMyAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDMvU2kKLQkJMTAyOCAwMDAzICBQb3dlckVkZ2UgMjQ1MAotCTAwMDYgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciAzL0RpCi0JMDAwNyAgUmVtb3RlIEFjY2VzcyBDYXJkIElJSQotCTAwMDggIFJlbW90ZSBBY2Nlc3MgQ2FyZCBJSUkKLQkwMDA5ICBSZW1vdGUgQWNjZXNzIENhcmQgSUlJOiBCTUMvU01JQyBkZXZpY2Ugbm90IHByZXNlbnQKLQkwMDBhICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMy9EaQotCTAwMGMgIEVtYmVkZGVkIFJlbW90ZSBBY2Nlc3Mgb3IgRVJBL08KLQkwMDBkICBFbWJlZGRlZCBSZW1vdGUgQWNjZXNzOiBCTUMvU01JQyBkZXZpY2UKLQkwMDBlICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIGNvbnRyb2xsZXIgNC9EaQotCTAwMGYgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgY29udHJvbGxlciA0L0RpCi0JMDAxMCAgUmVtb3RlIEFjY2VzcyBDYXJkIDQKLQkwMDExICBSZW1vdGUgQWNjZXNzIENhcmQgNCBEYXVnaHRlciBDYXJkCi0JMDAxMiAgUmVtb3RlIEFjY2VzcyBDYXJkIDQgRGF1Z2h0ZXIgQ2FyZCBWaXJ0dWFsIFVBUlQKLQkwMDEzICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIGNvbnRyb2xsZXIgNAotCQkxMDI4IDAxNmMgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9TaQotCQkxMDI4IDAxNmQgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCQkxMDI4IDAxNmUgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCQkxMDI4IDAxNmYgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCQkxMDI4IDAxNzAgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciA0ZS9EaQotCTAwMTQgIFJlbW90ZSBBY2Nlc3MgQ2FyZCA0IERhdWdodGVyIENhcmQgU01JQyBpbnRlcmZhY2UKLTEwMjkgIFNpZW1lbnMgTml4ZG9yZiBJUwotMTAyYSAgTFNJIExvZ2ljCi0JMDAwMCAgSFlEUkEKLQkwMDEwICBBU1BFTgotCTAwMWYgIEFIQS0yOTQwVTIvVTJXIC83ODkwLzc4OTEgU0NTSSBDb250cm9sbGVycwotCQk5MDA1IDAwMGYgIDI5NDBVMlcgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgMDEwNiAgMjk0MFUyVyBTQ1NJIENvbnRyb2xsZXIKLQkJOTAwNSBhMTgwICAyOTQwVTJXIFNDU0kgQ29udHJvbGxlcgotCTAwYzUgIEFJQy03ODk5IFUxNjAvbSBTQ1NJIENvbnRyb2xsZXIKLQkJMTAyOCAwMGM1ICBQb3dlckVkZ2UgMjU1MC8yNjUwLzQ2MDAKLQkwMGNmICBBSUMtNzg5OVAgVTE2MC9tCi0JCTEwMjggMDEwNiAgUG93ZXJFZGdlIDQ2MDAKLQkJMTAyOCAwMTIxICBQb3dlckVkZ2UgMjY1MAotMTAyYiAgTWF0cm94IEdyYXBoaWNzLCBJbmMuCi0jIERKOiBJJ3ZlIGEgc3VzcGljaW9uIHRoYXQgMDAxMCBpcyBhIGR1cGxpY2F0ZSBvZiAwZDEwLgotCTAwMTAgIE1HQS1JIFtJbXByZXNzaW9uP10KLQkwMTAwICBNR0EgMTA2NFNHIFtNeXN0aXF1ZV0KLQkwNTE4ICBNR0EtSUkgW0F0aGVuYV0KLQkwNTE5ICBNR0EgMjA2NFcgW01pbGxlbm5pdW1dCi0JMDUxYSAgTUdBIDEwNjRTRyBbTXlzdGlxdWVdCi0JCTEwMmIgMDEwMCAgTUdBLTEwNjRTRyBNeXN0aXF1ZQotCQkxMDJiIDExMDAgIE1HQS0xMDg0U0cgTXlzdGlxdWUKLQkJMTAyYiAxMjAwICBNR0EtMTA4NFNHIE15c3RpcXVlCi0JCTExMDAgMTAyYiAgTUdBLTEwODRTRyBNeXN0aXF1ZQotCQkxMTBhIDAwMTggIFNjZW5pYyBQcm8gQzUgKEQxMDI1KQotCTA1MWIgIE1HQSAyMTY0VyBbTWlsbGVubml1bSBJSV0KLQkJMTAyYiAwNTFiICBNR0EtMjE2NFcgTWlsbGVubml1bSBJSQotCQkxMDJiIDExMDAgIE1HQS0yMTY0VyBNaWxsZW5uaXVtIElJCi0JCTEwMmIgMTIwMCAgTUdBLTIxNjRXIE1pbGxlbm5pdW0gSUkKLQkwNTFlICBNR0EgMTA2NFNHIFtNeXN0aXF1ZV0gQUdQCi0JMDUxZiAgTUdBIDIxNjRXIFtNaWxsZW5uaXVtIElJXSBBR1AKLQkwNTIwICBNR0EgRzIwMAotCQkxMDJiIGRiYzIgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiYzggIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZTIgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZTggIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGZmMDMgIE1pbGxlbm5pdW0gRzIwMCBTRAotCQkxMDJiIGZmMDQgIE1hcnZlbCBHMjAwCi0JMDUyMSAgTUdBIEcyMDAgQUdQCi0JCTEwMTQgZmYwMyAgTWlsbGVubml1bSBHMjAwIEFHUAotCQkxMDJiIDQ4ZTkgIE15c3RpcXVlIEcyMDAgQUdQCi0JCTEwMmIgNDhmOCAgTWlsbGVubml1bSBHMjAwIFNEIEFHUAotCQkxMDJiIDRhNjAgIE1pbGxlbm5pdW0gRzIwMCBMRSBBR1AKLQkJMTAyYiA0YTY0ICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgYzkzYyAgTWlsbGVubml1bSBHMjAwIEFHUAotCQkxMDJiIGM5YjAgIE1pbGxlbm5pdW0gRzIwMCBBR1AKLQkJMTAyYiBjOWJjICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgY2E2MCAgTWlsbGVubml1bSBHMjUwIExFIEFHUAotCQkxMDJiIGNhNmMgIE1pbGxlbm5pdW0gRzI1MCBBR1AKLQkJMTAyYiBkYmJjICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgZGJjMiAgTWlsbGVubml1bSBHMjAwIE1NUyAoRHVhbCBHMjAwKQotCQkxMDJiIGRiYzMgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiYzggIE1pbGxlbm5pdW0gRzIwMCBNTVMgKER1YWwgRzIwMCkKLQkJMTAyYiBkYmQyICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQzICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ0ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ1ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ4ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmQ5ICBHMjAwIE11bHRpLU1vbml0b3IKLQkJMTAyYiBkYmUyICBNaWxsZW5uaXVtIEcyMDAgTU1TIChRdWFkIEcyMDApCi0JCTEwMmIgZGJlMyAgRzIwMCBNdWx0aS1Nb25pdG9yCi0JCTEwMmIgZGJlOCAgTWlsbGVubml1bSBHMjAwIE1NUyAoUXVhZCBHMjAwKQotCQkxMDJiIGRiZjIgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjMgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjQgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjUgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjggIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGRiZjkgIEcyMDAgTXVsdGktTW9uaXRvcgotCQkxMDJiIGY4MDYgIE15c3RpcXVlIEcyMDAgVmlkZW8gQUdQCi0JCTEwMmIgZmYwMCAgTUdBLUcyMDAgQUdQCi0JCTEwMmIgZmYwMiAgTXlzdGlxdWUgRzIwMCBBR1AKLQkJMTAyYiBmZjAzICBNaWxsZW5uaXVtIEcyMDAgQUdQCi0JCTEwMmIgZmYwNCAgTWFydmVsIEcyMDAgQUdQCi0JCTExMGEgMDAzMiAgTUdBLUcyMDAgQUdQCi0JMDUyNSAgTUdBIEc0MDAgQUdQCi0JCTBlMTEgYjE2ZiAgTUdBLUc0MDAgQUdQCi0JCTEwMmIgMDMyOCAgTWlsbGVubml1bSBHNDAwIDE2TWIgU0RSQU0KLQkJMTAyYiAwMzM4ICBNaWxsZW5uaXVtIEc0MDAgMTZNYiBTRFJBTQotCQkxMDJiIDAzNzggIE1pbGxlbm5pdW0gRzQwMCAzMk1iIFNEUkFNCi0JCTEwMmIgMDU0MSAgTWlsbGVubml1bSBHNDUwIER1YWwgSGVhZAotCQkxMDJiIDA1NDIgIE1pbGxlbm5pdW0gRzQ1MCBEdWFsIEhlYWQgTFgKLQkJMTAyYiAwNTQzICBNaWxsZW5uaXVtIEc0NTAgU2luZ2xlIEhlYWQgTFgKLQkJMTAyYiAwNjQxICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBTRFJBTSBEdWFsIEhlYWQKLQkJMTAyYiAwNjQyICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBTRFJBTSBEdWFsIEhlYWQgTFgKLQkJMTAyYiAwNjQzICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBTRFJBTSBTaW5nbGUgSGVhZCBMWAotCQkxMDJiIDA3YzAgIE1pbGxlbm5pdW0gRzQ1MCBEdWFsIEhlYWQgTEUKLQkJMTAyYiAwN2MxICBNaWxsZW5uaXVtIEc0NTAgU0RSIER1YWwgSGVhZCBMRQotCQkxMDJiIDBkNDEgIE1pbGxlbm5pdW0gRzQ1MCBEdWFsIEhlYWQgUENJCi0JCTEwMmIgMGQ0MiAgTWlsbGVubml1bSBHNDUwIER1YWwgSGVhZCBMWCBQQ0kKLQkJMTAyYiAwZDQzICBNaWxsZW5uaXVtIEc0NTAgMzJNYiBEdWFsIEhlYWQgUENJCi0JCTEwMmIgMGUwMCAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGUwMSAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGUwMiAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGUwMyAgTWFydmVsIEc0NTAgZVRWCi0JCTEwMmIgMGY4MCAgTWlsbGVubml1bSBHNDUwIExvdyBQcm9maWxlCi0JCTEwMmIgMGY4MSAgTWlsbGVubml1bSBHNDUwIExvdyBQcm9maWxlCi0JCTEwMmIgMGY4MiAgTWlsbGVubml1bSBHNDUwIExvdyBQcm9maWxlIERWSQotCQkxMDJiIDBmODMgIE1pbGxlbm5pdW0gRzQ1MCBMb3cgUHJvZmlsZSBEVkkKLQkJMTAyYiAxOWQ4ICBNaWxsZW5uaXVtIEc0MDAgMTZNYiBTR1JBTQotCQkxMDJiIDE5ZjggIE1pbGxlbm5pdW0gRzQwMCAzMk1iIFNHUkFNCi0JCTEwMmIgMjE1OSAgTWlsbGVubml1bSBHNDAwIER1YWwgSGVhZCAxNk1iCi0JCTEwMmIgMjE3OSAgTWlsbGVubml1bSBHNDAwIE1BWC9EdWFsIEhlYWQgMzJNYgotCQkxMDJiIDIxN2QgIE1pbGxlbm5pdW0gRzQwMCBEdWFsIEhlYWQgTWF4Ci0JCTEwMmIgMjNjMCAgTWlsbGVubml1bSBHNDUwCi0JCTEwMmIgMjNjMSAgTWlsbGVubml1bSBHNDUwCi0JCTEwMmIgMjNjMiAgTWlsbGVubml1bSBHNDUwIERWSQotCQkxMDJiIDIzYzMgIE1pbGxlbm5pdW0gRzQ1MCBEVkkKLQkJMTAyYiAyZjU4ICBNaWxsZW5uaXVtIEc0MDAKLQkJMTAyYiAyZjc4ICBNaWxsZW5uaXVtIEc0MDAKLQkJMTAyYiAzNjkzICBNYXJ2ZWwgRzQwMCBBR1AKLQkJMTAyYiA1ZGQwICA0U2lnaHQgSUkKLQkJMTAyYiA1ZjUwICA0U2lnaHQgSUkKLQkJMTAyYiA1ZjUxICA0U2lnaHQgSUkKLQkJMTAyYiA1ZjUyICA0U2lnaHQgSUkKLQkJMTAyYiA5MDEwICBNaWxsZW5uaXVtIEc0MDAgRHVhbCBIZWFkCi0JCTE0NTggMDQwMCAgR0EtRzQwMAotCQkxNzA1IDAwMDEgIE1pbGxlbm5pdW0gRzQ1MCAzMk1CIFNHUkFNCi0JCTE3MDUgMDAwMiAgTWlsbGVubml1bSBHNDUwIDE2TUIgU0dSQU0KLQkJMTcwNSAwMDAzICBNaWxsZW5uaXVtIEc0NTAgMzJNQgotCQkxNzA1IDAwMDQgIE1pbGxlbm5pdW0gRzQ1MCAxNk1CCi0JMDUyNyAgTUdBIFBhcmhlbGlhIEFHUAotCQkxMDJiIDA4NDAgIFBhcmhlbGlhIDEyOE1iCi0JMGQxMCAgTUdBIFVsdGltYS9JbXByZXNzaW9uCi0JMTAwMCAgTUdBIEcxMDAgW1Byb2R1Y3RpdmFdCi0JCTEwMmIgZmYwMSAgUHJvZHVjdGl2YSBHMTAwCi0JCTEwMmIgZmYwNSAgUHJvZHVjdGl2YSBHMTAwIE11bHRpLU1vbml0b3IKLQkxMDAxICBNR0EgRzEwMCBbUHJvZHVjdGl2YV0gQUdQCi0JCTEwMmIgMTAwMSAgTUdBLUcxMDAgQUdQCi0JCTEwMmIgZmYwMCAgTUdBLUcxMDAgQUdQCi0JCTEwMmIgZmYwMSAgTUdBLUcxMDAgUHJvZHVjdGl2YSBBR1AKLQkJMTAyYiBmZjAzICBNaWxsZW5uaXVtIEcxMDAgQUdQCi0JCTEwMmIgZmYwNCAgTUdBLUcxMDAgQUdQCi0JCTEwMmIgZmYwNSAgTUdBLUcxMDAgUHJvZHVjdGl2YSBBR1AgTXVsdGktTW9uaXRvcgotCQkxMTBhIDAwMWUgIE1HQS1HMTAwIEFHUAotCTIwMDcgIE1HQSBNaXN0cmFsCi0JMjUyNyAgTUdBIEc1NTAgQUdQCi0JCTEwMmIgMGY4MyAgTWlsbGVubml1bSBHNTUwCi0JCTEwMmIgMGY4NCAgTWlsbGVubml1bSBHNTUwIER1YWwgSGVhZCBERFIgMzJNYgotCQkxMDJiIDFlNDEgIE1pbGxlbm5pdW0gRzU1MAotCTI1MzcgIE1HQSBHNjUwIEFHUAotCTQ1MzYgIFZJQSBGcmFtZWdyYWJiZXIKLQk2NTczICBTaGFyayAxMC8xMDAgTXVsdGlwb3J0IFN3aXRjaE5JQwotMTAyYyAgQ2hpcHMgYW5kIFRlY2hub2xvZ2llcwotCTAwYjggIEY2NDMxMAotCTAwYzAgIEY2OTAwMCBIaVFWaWRlbwotCQkxMDJjIDAwYzAgIEY2OTAwMCBIaVFWaWRlbwotCQk0YzUzIDEwMDAgIENDNy9DUjcvQ1A3L1ZDNy9WUDcvVlI3IG1haW5ib2FyZAotCQk0YzUzIDEwMTAgIENQNS9DUjYgbWFpbmJvYXJkCi0JCTRjNTMgMTAyMCAgVlI2IG1haW5ib2FyZAotCQk0YzUzIDEwMzAgIFBDNSBtYWluYm9hcmQKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCTAwZDAgIEY2NTU0NQotCTAwZDggIEY2NTU0NQotCTAwZGMgIEY2NTU0OAotCTAwZTAgIEY2NTU1MAotCTAwZTQgIEY2NTU1NAotCTAwZTUgIEY2NTU1NSBIaVFWUHJvCi0JCTBlMTEgYjA0OSAgQXJtYWRhIDE3MDAgTGFwdG9wIERpc3BsYXkgQ29udHJvbGxlcgotCTAwZjAgIEY2ODU1NAotCTAwZjQgIEY2ODU1NCBIaVFWaXNpb24KLQkwMGY1ICBGNjg1NTUKLQkwYzMwICBGNjkwMzAKLQkJNGM1MyAxMDAwICBDQzcvQ1I3L0NQNy9WQzcvVlA3L1ZSNyBtYWluYm9hcmQKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotIyBDNUMgcHJvamVjdCBjYW5jZWxsZWQKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0xMDJkICBXeXNlIFRlY2hub2xvZ3kgSW5jLgotCTUwZGMgIDMzMjggQXVkaW8KLTEwMmUgIE9saXZldHRpIEFkdmFuY2VkIFRlY2hub2xvZ3kKLTEwMmYgIFRvc2hpYmEgQW1lcmljYQotCTAwMDkgIHI0eDAwCi0JMDAwYSAgVFgzOTI3IE1JUFMgUklTQyBQQ0kgQ29udHJvbGxlcgotCTAwMjAgIEFUTSBNZXRlb3IgMTU1Ci0JCTEwMmYgMDBmOCAgQVRNIE1ldGVvciAxNTUKLQkwMDMwICBUQzM1ODE1Q0YgUENJIDEwLzEwMCBNYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkwMDMxICBUQzM1ODE1Q0YgUENJIDEwLzEwMCBNYml0IEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBXT0wKLQkwMTA1ICBUQzg2QzAwMSBbZ29rdS1zXSBJREUKLQkwMTA2ICBUQzg2QzAwMSBbZ29rdS1zXSBVU0IgMS4xIEhvc3QKLQkwMTA3ICBUQzg2QzAwMSBbZ29rdS1zXSBVU0IgRGV2aWNlIENvbnRyb2xsZXIKLQkwMTA4ICBUQzg2QzAwMSBbZ29rdS1zXSBJMkMvU0lPL0dQSU8gQ29udHJvbGxlcgotCTAxODAgIFRYNDkyNy8zOCBNSVBTIFJJU0MgUENJIENvbnRyb2xsZXIKLQkwMTgxICBUWDQ5MjUgTUlQUyBSSVNDIFBDSSBDb250cm9sbGVyCi0JMDE4MiAgVFg0OTM3IE1JUFMgUklTQyBQQ0kgQ29udHJvbGxlcgotMTAzMCAgVE1DIFJlc2VhcmNoCi0xMDMxICBNaXJvIENvbXB1dGVyIFByb2R1Y3RzIEFHCi0JNTYwMSAgREMyMCBBU0lDCi0JNTYwNyAgVmlkZW8gSS9PICYgbW90aW9uIEpQRUcgY29tcHJlc3NvcgotCTU2MzEgIE1lZGlhIDNECi0JNjA1NyAgTWlyb1ZpZGVvIERDMTAvREMzMCsKLTEwMzIgIENvbXBhcQotMTAzMyAgTkVDIENvcnBvcmF0aW9uCi0JMDAwMCAgVnI0MTgxQSBVU0IgSG9zdCBvciBGdW5jdGlvbiBDb250cm9sIFVuaXQKLQkwMDAxICBQQ0kgdG8gNDg2LWxpa2UgYnVzIEJyaWRnZQotCTAwMDIgIFBDSSB0byBWTDk4IEJyaWRnZQotCTAwMDMgIEFUTSBDb250cm9sbGVyCi0JMDAwNCAgUjQwMDAgUENJIEJyaWRnZQotCTAwMDUgIFBDSSB0byA0ODYtbGlrZSBidXMgQnJpZGdlCi0JMDAwNiAgUEMtOTgwMCBHcmFwaGljIEFjY2VsZXJhdG9yCi0JMDAwNyAgUENJIHRvIFVYLUJ1cyBCcmlkZ2UKLQkwMDA4ICBQQy05ODAwIEdyYXBoaWMgQWNjZWxlcmF0b3IKLQkwMDA5ICBQQ0kgdG8gUEM5ODAwIENvcmUtR3JhcGggQnJpZGdlCi0JMDAxNiAgUENJIHRvIFZMIEJyaWRnZQotCTAwMWEgIFtOaWxlIElJXQotCTAwMjEgIFZyYzQzNzMgW05pbGUgSV0KLQkwMDI5ICBQb3dlclZSIFBDWDEKLQkwMDJhICBQb3dlclZSIDNECi0JMDAyYyAgU3RhciBBbHBoYSAyCi0JMDAyZCAgUENJIHRvIEMtYnVzIEJyaWRnZQotCTAwMzUgIFVTQgotCQkxMTc5IDAwMDEgIFVTQgotCQkxMmVlIDcwMDAgIFJvb3QgSHViCi0JCTE3OTkgMDAwMSAgUm9vdCBIdWIKLQkJODA3ZCAwMDM1ICBQQ0ktVVNCMiAoT0hDSSBzdWJzeXN0ZW0pCi0JMDAzYiAgUENJIHRvIEMtYnVzIEJyaWRnZQotCTAwM2UgIE5BUENDQVJEIENhcmRidXMgQ29udHJvbGxlcgotCTAwNDYgIFBvd2VyVlIgUENYMiBbbWlkYXNdCi0JMDA1YSAgVnJjNTA3NCBbTmlsZSA0XQotCTAwNjMgIEZpcmV3YXJkZW4KLQkwMDY3ICBQb3dlclZSIE5lb24gMjUwIENoaXBzZXQKLQkJMTAxMCAwMDIwICBQb3dlclZSIE5lb24gMjUwIEFHUCAzMk1iCi0JCTEwMTAgMDA4MCAgUG93ZXJWUiBOZW9uIDI1MCBBR1AgMTZNYgotCQkxMDEwIDAwODggIFBvd2VyVlIgTmVvbiAyNTAgMTZNYgotCQkxMDEwIDAwOTAgIFBvd2VyVlIgTmVvbiAyNTAgQUdQIDE2TWIKLQkJMTAxMCAwMDk4ICBQb3dlclZSIE5lb24gMjUwIDE2TWIKLQkJMTAxMCAwMGEwICBQb3dlclZSIE5lb24gMjUwIEFHUCAzMk1iCi0JCTEwMTAgMDBhOCAgUG93ZXJWUiBOZW9uIDI1MCAzMk1iCi0JCTEwMTAgMDEyMCAgUG93ZXJWUiBOZW9uIDI1MCBBR1AgMzJNYgotCTAwNzIgIHVQRDcyODc0IElFRUUxMzk0IE9IQ0kgMS4xIDMtcG9ydCBQSFktTGluayBDdHJscgotCTAwNzQgIDU2ayBWb2ljZSBNb2RlbQotCQkxMDMzIDgwMTQgIFJDVjU2QUNGIDU2ayBWb2ljZSBNb2RlbQotCTAwOWIgIFZyYzU0NzYKLQkwMGE1ICBWUkM0MTczCi0JMDBhNiAgVlJDNTQ3NyBBQzk3Ci0JMDBjZCAgSUVFRSAxMzk0IFtPcmFuZ2VMaW5rXSBIb3N0IENvbnRyb2xsZXIKLQkJMTJlZSA4MDExICBSb290IGh1YgotCTAwY2UgIElFRUUgMTM5NCBIb3N0IENvbnRyb2xsZXIKLQkwMGRmICBWcjQxMzEKLQkwMGUwICBVU0IgMi4wCi0JCTBlZTQgMzM4MyAgU2l0ZWNvbSBJRUVFIDEzOTQgLyBVU0IyLjAgQ29tYm8gQ2FyZAotCQkxMmVlIDcwMDEgIFJvb3QgaHViCi0JCTE3OTkgMDAwMiAgUm9vdCBIdWIKLQkJODA3ZCAxMDQzICBQQ0ktVVNCMiAoRUhDSSBzdWJzeXN0ZW0pCi0JMDBlNyAgSUVFRSAxMzk0IEhvc3QgQ29udHJvbGxlcgotCTAwZjIgIHVQRDcyODc0IElFRUUxMzk0IE9IQ0kgMS4xIDMtcG9ydCBQSFktTGluayBDdHJscgotCTAwZjMgIHVQRDYxMTN4IE11bHRpbWVkaWEgRGVjb2Rlci9Qcm9jZXNzb3IgW0VNTUEyXQotCTAxMGMgIFZSNzcwMQotMTAzNCAgRnJhbWF0b21lIENvbm5lY3RvcnMgVVNBIEluYy4KLTEwMzUgIENvbXAuICYgQ29tbS4gUmVzZWFyY2ggTGFiCi0xMDM2ICBGdXR1cmUgRG9tYWluIENvcnAuCi0JMDAwMCAgVE1DLTE4QzMwIFszNkM3MF0KLTEwMzcgIEhpdGFjaGkgTWljcm8gU3lzdGVtcwotMTAzOCAgQU1QLCBJbmMKLTEwMzkgIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIFtTaVNdCi0JMDAwMSAgVmlydHVhbCBQQ0ktdG8tUENJIGJyaWRnZSAoQUdQKQotCTAwMDIgIFNHODZDMjAyCi0JMDAwNiAgODVDNTAxLzIvMwotCTAwMDggIFNpUzg1QzUwMy81NTEzIChMUEMgQnJpZGdlKQotCTAwMDkgIEFDUEkKLSMgc291cmNlOiBodHRwOi8vbWVtYmVycy5kYXRhZmFzdC5uZXQuYXUvZGZ0MDgwMi9kb3dubG9hZHMvcGNpZGV2cy50eHQKLQkwMDE2ICBTaVM5NjEvMiBTTUJ1cyBDb250cm9sbGVyCi0JMDAxOCAgU2lTODVDNTAzLzU1MTMgKExQQyBCcmlkZ2UpCi0jIENvbnRyb2xsZXIgZm9yIDIgUEFUQSBhbmQgMiBTQVRBIGNoYW5uZWxzCi0JMDE4MCAgUkFJRCBidXMgY29udHJvbGxlciAxODAgU0FUQS9QQVRBICBbU2lTXQotCTAxODEgIFNpUyBTQVRBCi0JMDIwMCAgNTU5Ny81NTk4LzYzMjYgVkdBCi0JCTEwMzkgMDAwMCAgU2lTNTU5NyBTVkdBIChTaGFyZWQgUkFNKQotCTAyMDQgIDgyQzIwNAotCTAyMDUgIFNHODZDMjA1Ci0JMDMwMCAgMzAwLzMwNSBQQ0kvQUdQIFZHQSBEaXNwbGF5IEFkYXB0ZXIKLQkJMTA3ZCAyNzIwICBMZWFkdGVrIFdpbkZhc3QgVlIzMDAKLQkwMzEwICAzMTVIIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCTAzMTUgIDMxNSBQQ0kvQUdQIFZHQSBEaXNwbGF5IEFkYXB0ZXIKLQkwMzI1ICAzMTVQUk8gUENJL0FHUCBWR0EgRGlzcGxheSBBZGFwdGVyCi0JMDMzMCAgMzMwIFtYYWJyZV0gUENJL0FHUCBWR0EgRGlzcGxheSBBZGFwdGVyCi0JMDQwNiAgODVDNTAxLzIKLQkwNDk2ICA4NUM0OTYKLQkwNTMwICA1MzAgSG9zdAotCTA1NDAgIDU0MCBIb3N0Ci0JMDU1MCAgNTUwIEhvc3QKLQkwNTk3ICA1NTEzQwotCTA2MDEgIDg1QzYwMQotCTA2MjAgIDYyMCBIb3N0Ci0JMDYzMCAgNjMwIEhvc3QKLQkwNjMzICA2MzMgSG9zdAotCTA2MzUgIDYzNSBIb3N0Ci0JMDY0NSAgU2lTNjQ1IEhvc3QgJiBNZW1vcnkgJiBBR1AgQ29udHJvbGxlcgotCTA2NDYgIFNpUzY0NURYIEhvc3QgJiBNZW1vcnkgJiBBR1AgQ29udHJvbGxlcgotCTA2NDggIFNpUyA2NDV4eAotCTA2NTAgIDY1MC9NNjUwIEhvc3QKLQkwNjUxICA2NTEgSG9zdAotCTA2NTUgIDY1NSBIb3N0Ci0JMDY2MCAgNjYwIEhvc3QKLQkwNjYxICA2NjFGWC9NNjYxRlgvTTY2MU1YIEhvc3QKLQkwNzMwICA3MzAgSG9zdAotCTA3MzMgIDczMyBIb3N0Ci0JMDczNSAgNzM1IEhvc3QKLQkwNzQwICA3NDAgSG9zdAotCTA3NDEgIDc0MS83NDFHWC9NNzQxIEhvc3QKLQkwNzQ1ICA3NDUgSG9zdAotCTA3NDYgIDc0NiBIb3N0Ci0JMDc1NSAgNzU1IEhvc3QKLQkwNzYwICA3NjAvTTc2MCBIb3N0Ci0JMDkwMCAgU2lTOTAwIFBDSSBGYXN0IEV0aGVybmV0Ci0JCTEwMTkgMGExNCAgSzdTNUEgbW90aGVyYm9hcmQKLQkJMTAzOSAwOTAwICBTaVM5MDAgMTAvMTAwIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA0MyA4MDM1ICBDVVNJLUZYIG1vdGhlcmJvYXJkCi0JMDk2MSAgU2lTOTYxIFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2MiAgU2lTOTYyIFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2MyAgU2lTOTYzIFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2NCAgU2lTOTY0IFtNdVRJT0wgTWVkaWEgSU9dCi0JMDk2NSAgU2lTOTY1IFtNdVRJT0wgTWVkaWEgSU9dCi0JMzYwMiAgODNDNjAyCi0JNTEwNyAgNTEwNwotCTUzMDAgIFNpUzU0MCBQQ0kgRGlzcGxheSBBZGFwdGVyCi0JNTMxNSAgNTUwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCTU0MDEgIDQ4NiBQQ0kgQ2hpcHNldAotCTU1MTEgIDU1MTEvNTUxMgotCTU1MTMgIDU1MTMgW0lERV0KLQkJMTAxOSAwOTcwICBQNlNUUC1GTCBtb3RoZXJib2FyZAotCQkxMDM5IDU1MTMgIFNpUzU1MTMgRUlERSBDb250cm9sbGVyIChBLEIgc3RlcCkKLQkJMTA0MyA4MDM1ICBDVVNJLUZYIG1vdGhlcmJvYXJkCi0JNTUxNyAgNTUxNwotCTU1NzEgIDU1NzEKLQk1NTgxICA1NTgxIFBlbnRpdW0gQ2hpcHNldAotCTU1ODIgIDU1ODIKLQk1NTkxICA1NTkxLzU1OTIgSG9zdAotCTU1OTYgIDU1OTYgUGVudGl1bSBDaGlwc2V0Ci0JNTU5NyAgNTU5NyBbU2lTNTU4Ml0KLQk1NjAwICA1NjAwIEhvc3QKLQk2MjA0ICBWaWRlbyBkZWNvZGVyICYgTVBFRyBpbnRlcmZhY2UKLQk2MjA1ICBWR0EgQ29udHJvbGxlcgotCTYyMzYgIDYyMzYgM0QtQUdQCi0JNjMwMCAgNjMwLzczMCBQQ0kvQUdQIFZHQSBEaXNwbGF5IEFkYXB0ZXIKLQkJMTAxOSAwOTcwICBQNlNUUC1GTCBtb3RoZXJib2FyZAotCQkxMDQzIDgwMzUgIENVU0ktRlggbW90aGVyYm9hcmQKLQk2MzA2ICA1MzAvNjIwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCQkxMDM5IDYzMDYgIFNpUzUzMCw2MjAgR1VJIEFjY2VsZXJhdG9yKzNECi0JNjMyNSAgNjV4L002NTAvNzQwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCTYzMjYgIDg2QzMyNiA1NTk4LzYzMjYKLQkJMTAzOSA2MzI2ICBTaVM2MzI2IEdVSSBBY2NlbGVyYXRvcgotCQkxMDkyIDBhNTAgIFNwZWVkU3RhciBBNTAKLQkJMTA5MiAwYTcwICBTcGVlZFN0YXIgQTcwCi0JCTEwOTIgNDkxMCAgU3BlZWRTdGFyIEE3MAotCQkxMDkyIDQ5MjAgIFNwZWVkU3RhciBBNzAKLQkJMTU2OSA2MzI2ICBTaVM2MzI2IEdVSSBBY2NlbGVyYXRvcgotCTYzMzAgIDY2MS83NDEvNzYwIFBDSS9BR1AgVkdBIERpc3BsYXkgQWRhcHRlcgotCQkxMDM5IDYzMzAgIFtNXTY2MXhYL1tNXTc0MVtHWF0vW01dNzYwIFBDSS9BR1AgVkdBIEFkYXB0ZXIKLQk3MDAxICBVU0IgMS4wIENvbnRyb2xsZXIKLQkJMTAxOSAwYTE0ICBLN1M1QSBtb3RoZXJib2FyZAotCQkxMDM5IDcwMDAgIE9uYm9hcmQgVVNCIENvbnRyb2xsZXIKLQk3MDAyICBVU0IgMi4wIENvbnRyb2xsZXIKLQkJMTUwOSA3MDAyICBPbmJvYXJkIFVTQiBDb250cm9sbGVyCi0JNzAwNyAgRmlyZVdpcmUgQ29udHJvbGxlcgotCTcwMTIgIFNvdW5kIENvbnRyb2xsZXIKLSMgVGhlcmUgYXJlIG1heSBiZSBkaWZmZXJlbnQgbW9kZW0gY29kZWNzIGhlcmUgKEludGVsNTM3IGNvbXBhdGlibGUgYW5kIGluY29tcGF0aWJsZSkKLQk3MDEzICBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JNzAxNiAgU2lTNzAxNiBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwMzkgNzAxNiAgU2lTNzAxNiAxMC8xMDAgRXRoZXJuZXQgQWRhcHRlcgotCTcwMTggIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTAxNCAwMWI2ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTEwMTQgMDFiNyAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDE5IDcwMTggIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTAyNSAwMDBlICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTEwMjUgMDAxOCAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDM5IDcwMTggIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTA0MyA4MDBiICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTEwNTQgNzAxOCAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDdkIDUzMzAgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTA3ZCA1MzUwICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTExNzAgMzIwOSAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxNDYyIDQwMGEgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTRhNCAyMDg5ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTE0Y2QgMjE5NCAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxNGZmIDExMDAgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTUyZCA4ODA4ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTE1NTggMTEwMyAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxNTU4IDIyMDAgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJMTU2MyA3MDE4ICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JCTE1YzUgMDExMSAgU2lTIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkyNzBmIGExNzEgIFNpUyBQQ0kgQXVkaW8gQWNjZWxlcmF0b3IKLQkJYTBhMCAwMDIyICBTaVMgUENJIEF1ZGlvIEFjY2VsZXJhdG9yCi0JNzAxOSAgU2lTNzAxOSBBdWRpbyBBY2NlbGVyYXRvcgotMTAzYSAgU2Vpa28gRXBzb24gQ29ycG9yYXRpb24KLTEwM2IgIFRhdHVuZyBDby4gb2YgQW1lcmljYQotMTAzYyAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLQkxMDA1ICBBNDk3N0EgVmlzdWFsaXplIEVHCi0JMTAwNiAgVmlzdWFsaXplIEZYNgotCTEwMDggIFZpc3VhbGl6ZSBGWDQKLQkxMDBhICBWaXN1YWxpemUgRlgyCi0JMTAyOCAgVGFjaCBUTCBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotCTEwMjkgIFRhY2ggWEwyIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JCTEwN2UgMDAwZiAgSW50ZXJwaGFzZSA1NTYwIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCQk5MDA0IDkyMTAgIDFHYi8yR2IgRmFtaWx5IEZpYnJlIENoYW5uZWwgQ29udHJvbGxlcgotCQk5MDA0IDkyMTEgIDFHYi8yR2IgRmFtaWx5IEZpYnJlIENoYW5uZWwgQ29udHJvbGxlcgotCTEwMmEgIFRhY2ggVFMgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQkJMTA3ZSAwMDBlICBJbnRlcnBoYXNlIDU1NDAvNTU0MSBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkJOTAwNCA5MTEwICAxR2IvMkdiIEZhbWlseSBGaWJyZSBDaGFubmVsIENvbnRyb2xsZXIKLQkJOTAwNCA5MTExICAxR2IvMkdiIEZhbWlseSBGaWJyZSBDaGFubmVsIENvbnRyb2xsZXIKLQkxMDMwICBKMjU4NUEgRGVza0RpcmVjdCAxMC8xMDBWRyBOSUMKLQkxMDMxICBKMjU4NUIgSFAgMTAvMTAwVkcgUENJIExBTiBBZGFwdGVyCi0JCTEwM2MgMTA0MCAgSjI5NzNBIERlc2tEaXJlY3QgMTBCYXNlVCBOSUMKLQkJMTAzYyAxMDQxICBKMjU4NUIgRGVza0RpcmVjdCAxMC8xMDBWRyBOSUMKLQkJMTAzYyAxMDQyICBKMjk3MEEgRGVza0RpcmVjdCAxMEJhc2VULzIgTklDCi0JMTA0MCAgSjI5NzNBIERlc2tEaXJlY3QgMTBCYXNlVCBOSUMKLQkxMDQxICBKMjU4NUIgRGVza0RpcmVjdCAxMC8xMDAgTklDCi0JMTA0MiAgSjI5NzBBIERlc2tEaXJlY3QgMTBCYXNlVC8yIE5JQwotCTEwNDggIERpdmEgU2VyaWFsIFtHU1BdIE11bHRpcG9ydCBVQVJUCi0JCTEwM2MgMTA0OSAgVG9zY2EgQ29uc29sZQotCQkxMDNjIDEwNGEgIFRvc2NhIFNlY29uZGFyeQotCQkxMDNjIDEwNGIgIE1hZXN0cm8gU1AyCi0JCTEwM2MgMTIyMyAgU3VwZXJkb21lIENvbnNvbGUKLQkJMTAzYyAxMjI2ICBLZXlzdG9uZSBTUDIKLQkJMTAzYyAxMjI3ICBQb3dlcmJhciBTUDIKLQkJMTAzYyAxMjgyICBFdmVyZXN0IFNQMgotCQkxMDNjIDEzMDEgIERpdmEgUk1QMwotCTEwNTQgIFBDSSBMb2NhbCBCdXMgQWRhcHRlcgotCTEwNjQgIDc5Qzk3MCBQQ25ldCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTA4YiAgVmlzdWFsaXplIEZYZQotCTEwYzEgIE5ldFNlcnZlciBTbWFydCBJUlEgUm91dGVyCi0JMTBlZCAgVG9wVG9vbHMgUmVtb3RlIENvbnRyb2wKLQkxMGYwICByaW8gU3lzdGVtIEJ1cyBBZGFwdGVyCi0JMTBmMSAgcmlvIEkvTyBDb250cm9sbGVyCi0JMTIwMCAgODI1NTdCIDEwLzEwMCBOSUMKLQkxMjE5ICBOZXRTZXJ2ZXIgUENJIEhvdC1QbHVnIENvbnRyb2xsZXIKLQkxMjFhICBOZXRTZXJ2ZXIgU01JQyBDb250cm9sbGVyCi0JMTIxYiAgTmV0U2VydmVyIExlZ2FjeSBDT00gUG9ydCBEZWNvZGVyCi0JMTIxYyAgTmV0U2VydmVyIFBDSSBDT00gUG9ydCBEZWNvZGVyCi0JMTIyOSAgengxIFN5c3RlbSBCdXMgQWRhcHRlcgotCTEyMmEgIHp4MSBJL08gQ29udHJvbGxlcgotCTEyMmUgIHp4MSBMb2NhbCBCdXMgQWRhcHRlcgotCTEyN2MgIHN4MTAwMCBJL08gQ29udHJvbGxlcgotCTEyOTAgIEF1eGlsaWFyeSBEaXZhIFNlcmlhbCBQb3J0Ci0JMTJiNCAgengxIFF1aWNrU2lsdmVyIEFHUDh4IExvY2FsIEJ1cyBBZGFwdGVyCi0JMjkxMCAgRTI5MTBBIFBDSUJ1cyBFeGVyY2lzZXIKLQkyOTI1ICBFMjkyNUEgMzIgQml0LCAzMyBNSHpQQ0kgRXhlcmNpc2VyICYgQW5hbHl6ZXIKLTEwM2UgIFNvbGxpZGF5IEVuZ2luZWVyaW5nCi0xMDNmICBTeW5vcHN5cy9Mb2dpYyBNb2RlbGluZyBHcm91cAotMTA0MCAgQWNjZWxncmFwaGljcyBJbmMuCi0xMDQxICBDb21wdXRyZW5kCi0xMDQyICBNaWNyb24KLQkxMDAwICBQQyBUZWNoIFJaMTAwMAotCTEwMDEgIFBDIFRlY2ggUloxMDAxCi0JMzAwMCAgU2FtdXJhaV8wCi0JMzAxMCAgU2FtdXJhaV8xCi0JMzAyMCAgU2FtdXJhaV9JREUKLTEwNDMgIEFTVVNUZUsgQ29tcHV0ZXIgSW5jLgotCTA2NzUgIElTRE5MaW5rIFAtSU4xMDAtU1QtRAotCTQwMTUgIHY3MTAwIFNEUkFNIFtHZUZvcmNlMiBNWF0KLQk0MDIxICB2NzEwMCBDb21ibyBEZWx1eGUgW0dlRm9yY2UyIE1YICsgVFYgdHVuZXJdCi0JNDA1NyAgdjgyMDAgR2VGb3JjZSAzCi0JODA0MyAgdjgyNDAgUEFMIDEyOE0gW1A0VF0gTW90aGVyYm9hcmQKLQk4MDdiICB2OTI4MC9URCBbR2Vmb3JjZTQgVEk0MjAwIDhYIFdpdGggVFYtT3V0IGFuZCBEVkldCi0JODBiYiAgdjkxODAgTWFnaWMvVCBbR2VGb3JjZTQgTVg0NDAgQUdQIDh4IDY0TUIgVFYtb3V0XQotCTgwYzUgIG5Gb3JjZTMgY2hpcHNldCBtb3RoZXJib2FyZCBbU0s4Tl0KLQk4MGRmICB2OTUyMCBNYWdpYy9UCi0xMDQ0ICBBZGFwdGVjIChmb3JtZXJseSBEUFQpCi0JMTAxMiAgRG9taW5vIFJBSUQgRW5naW5lCi0JYTQwMCAgU21hcnRDYWNoZS9SYWlkIEktSVYgQ29udHJvbGxlcgotCWE1MDAgIFBDSSBCcmlkZ2UKLQlhNTAxICBTbWFydFJBSUQgViBDb250cm9sbGVyCi0JCTEwNDQgYzAwMSAgUE0xNTU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwMiAgUE0xNjU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwMyAgUE0xNTY0VTMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwNCAgUE0xNTY0VTMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMDUgIFBNMTU1NFUyIFVsdHJhMiBTaW5nbGUgQ2hhbm5lbCAoTk9OIEFDUEkpCi0JCTEwNDQgYzAwYSAgUE0yNTU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwYiAgUE0yNjU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwYyAgUE0yNjY0VTMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAwZCAgUE0yNjY0VTMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMGUgIFBNMjU1NFUyIFVsdHJhMiBTaW5nbGUgQ2hhbm5lbCAoTk9OIEFDUEkpCi0JCTEwNDQgYzAwZiAgUE0yNjU0VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsIChOT04gQUNQSSkKLQkJMTA0NCBjMDE0ICBQTTM3NTRVMiBVbHRyYTIgU2luZ2xlIENoYW5uZWwgKE5PTiBBQ1BJKQotCQkxMDQ0IGMwMTUgIFBNMzc1NVUyQiBVbHRyYTIgU2luZ2xlIENoYW5uZWwgKE5PTiBBQ1BJKQotCQkxMDQ0IGMwMTYgIFBNMzc1NUYgRmlicmUgQ2hhbm5lbCAoTk9OIEFDUEkpCi0JCTEwNDQgYzAxZSAgUE0zNzU3VTIgVWx0cmEyIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAxZiAgUE0zNzU3VTIgVWx0cmEyIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMjAgIFBNMzc2N1UzIFVsdHJhMyBEdWFsIENoYW5uZWwKLQkJMTA0NCBjMDIxICBQTTM3NjdVMyBVbHRyYTMgUXVhZCBDaGFubmVsCi0JCTEwNDQgYzAyOCAgUE0yODY1VTMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzAyOSAgUE0yODY1VTMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwMmEgIFBNMjg2NUYgRmlicmUgQ2hhbm5lbAotCQkxMDQ0IGMwM2MgIDIwMDBTIFVsdHJhMyBTaW5nbGUgQ2hhbm5lbAotCQkxMDQ0IGMwM2QgIDIwMDBTIFVsdHJhMyBEdWFsIENoYW5uZWwKLQkJMTA0NCBjMDNlICAyMDAwRiBGaWJyZSBDaGFubmVsCi0JCTEwNDQgYzA0NiAgMzAwMFMgVWx0cmEzIFNpbmdsZSBDaGFubmVsCi0JCTEwNDQgYzA0NyAgMzAwMFMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwNDggIDMwMDBGIEZpYnJlIENoYW5uZWwKLQkJMTA0NCBjMDUwICA1MDAwUyBVbHRyYTMgU2luZ2xlIENoYW5uZWwKLQkJMTA0NCBjMDUxICA1MDAwUyBVbHRyYTMgRHVhbCBDaGFubmVsCi0JCTEwNDQgYzA1MiAgNTAwMEYgRmlicmUgQ2hhbm5lbAotCQkxMDQ0IGMwNWEgIDI0MDBBIFVETUEgRm91ciBDaGFubmVsCi0JCTEwNDQgYzA1YiAgMjQwMEEgVURNQSBGb3VyIENoYW5uZWwgREFDCi0JCTEwNDQgYzA2NCAgMzAxMFMgVWx0cmEzIER1YWwgQ2hhbm5lbAotCQkxMDQ0IGMwNjUgIDM0MTBTIFVsdHJhMTYwIEZvdXIgQ2hhbm5lbAotCQkxMDQ0IGMwNjYgIDMwMTBTIEZpYnJlIENoYW5uZWwKLQlhNTExICBTbWFydFJBSUQgViBDb250cm9sbGVyCi0JCTEwNDQgYzAzMiAgQVNSLTIwMDVTIEkyTyBaZXJvIENoYW5uZWwKLTEwNDUgIE9QVGkgSW5jLgotCWEwZjggIDgyQzc1MCBbVmVuZGV0dGFdIFVTQiBDb250cm9sbGVyCi0JYzEwMSAgOTJDMjY0Ci0JYzE3OCAgOTJDMTc4Ci0JYzU1NiAgODJYNTU2IFtWaXBlcl0KLQljNTU3ICA4MkM1NTcgW1ZpcGVyLU1dCi0JYzU1OCAgODJDNTU4IFtWaXBlci1NIElTQStJREVdCi0JYzU2NyAgODJDNzUwIFtWZW5kZXR0YV0sIGRldmljZSAwCi0JYzU2OCAgODJDNzUwIFtWZW5kZXR0YV0sIGRldmljZSAxCi0JYzU2OSAgODJDNTc5IFtWaXBlciBYUHJlc3MrIENoaXBzZXRdCi0JYzYyMSAgODJDNjIxIFtWaXBlci1NL04rXQotCWM3MDAgIDgyQzcwMCBbRmlyZVN0YXJdCi0JYzcwMSAgODJDNzAxIFtGaXJlU3RhciBQbHVzXQotCWM4MTQgIDgyQzgxNCBbRmlyZWJyaWRnZSAxXQotCWM4MjIgIDgyQzgyMgotCWM4MjQgIDgyQzgyNAotCWM4MjUgIDgyQzgyNSBbRmlyZWJyaWRnZSAyXQotCWM4MzIgIDgyQzgzMgotCWM4NjEgIDgyQzg2MQotCWM4OTUgIDgyQzg5NQotCWM5MzUgIEVWMTkzNSBFQ1RJVkEgTWFjaE9uZSBQQ0lBdWRpbwotCWQ1NjggIDgyQzgyNSBbRmlyZWJyaWRnZSAyXQotCWQ3MjEgIElERSBbRmlyZVN0YXJdCi0xMDQ2ICBJUEMgQ29ycG9yYXRpb24sIEx0ZC4KLTEwNDcgIEdlbm9hIFN5c3RlbXMgQ29ycAotMTA0OCAgRWxzYSBBRwotCTBjNjAgIEdsYWRpYWMgTVgKLQkwZDIyICBRdWFkcm80IDkwMFhHTCBbRUxTQSBHTG9yaWE0IDkwMFhHTF0KLQkxMDAwICBRdWlja1N0ZXAgMTAwMAotCTMwMDAgIFF1aWNrU3RlcCAzMDAwCi0JODkwMSAgR2xvcmlhIFhMCi0xMDQ5ICBGb3VudGFpbiBUZWNobm9sb2dpZXMsIEluYy4KLSMgIyBuZWUgU0dTIFRob21zb24gTWljcm9lbGVjdHJvbmljcwotMTA0YSAgU1RNaWNyb2VsZWN0cm9uaWNzCi0JMDAwOCAgU1RHIDIwMDBYCi0JMDAwOSAgU1RHIDE3NjRYCi0JMDAxMCAgU1RHNDAwMCBbM0QgUHJvcGhldCBLeXJvIFNlcmllc10KLQkwMjA5ICBTVFBDIENvbnN1bWVyL0luZHVzdHJpYWwgTm9ydGgtIGFuZCBTb3V0aGJyaWRnZQotCTAyMGEgIFNUUEMgQXRsYXMvQ29uc3VtZXJTL0NvbnN1bWVyIElJQSBOb3J0aGJyaWRnZQotIyBGcm9tIDxodHRwOi8vZ2F0ZWtlZXBlci5kZWMuY29tL3B1Yi9CU0QvRnJlZUJTRC9GcmVlQlNELXN0YWJsZS9zcmMvc2hhcmUvbWlzYy9wY2lfdmVuZG9ycz4KLQkwMjEwICBTVFBDIEF0bGFzIElTQSBCcmlkZ2UKLQkwMjFhICBTVFBDIENvbnN1bWVyIFMgU291dGhicmlkZ2UKLQkwMjFiICBTVFBDIENvbnN1bWVyIElJQSBTb3V0aGJyaWRnZQotCTA1MDAgIFNUNzAxMzcgW1VuaWNvcm5dIEFEU0wgRE1UIFRyYW5zY2VpdmVyCi0JMDU2NCAgU1RQQyBDbGllbnQgTm9ydGhicmlkZ2UKLQkwOTgxICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkxNzQ2ICBTVEcgMTc2NFgKLQkyNzc0ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkzNTIwICBNUEVHLUlJIGRlY29kZXIgY2FyZAotCTU1Y2MgIFNUUEMgQ2xpZW50IFNvdXRoYnJpZGdlCi0xMDRiICBCdXNMb2dpYwotCTAxNDAgIEJULTk0NkMgKG9sZCkgW211bHRpbWFzdGVyICAwMV0KLQkxMDQwICBCVC05NDZDIChCQTgwQzMwKSBbTXVsdGlNYXN0ZXIgMTBdCi0JODEzMCAgRmxhc2hwb2ludCBMVAotMTA0YyAgVGV4YXMgSW5zdHJ1bWVudHMKLQkwNTAwICAxMDAgTUJpdCBMQU4gQ29udHJvbGxlcgotCTA1MDggIFRNUzM4MEMyWCBDb21wcmVzc29yIEludGVyZmFjZQotCTEwMDAgIEVhZ2xlIGkvZiBBUwotCTEwNGMgIFBDSTE1MTAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQkzZDA0ICBUVlA0MDEwIFtQZXJtZWRpYV0KLQkzZDA3ICBUVlA0MDIwIFtQZXJtZWRpYSAyXQotCQkxMDExIDRkMTAgIENvbWV0Ci0JCTEwNDAgMDAwZiAgQWNjZWxTdGFyIElJCi0JCTEwNDAgMDAxMSAgQWNjZWxTdGFyIElJCi0JCTEwNDggMGEzMSAgV0lOTkVSIDIwMDAKLQkJMTA0OCAwYTMyICBHTG9yaWEgU3luZXJneQotCQkxMDQ4IDBhMzUgIEdMb3JpYSBTeW5lcmd5Ci0JCTEwN2QgMjYzMyAgV2luRmFzdCAzRCBMMjMwMAotCQkxMDkyIDAxMjcgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTM2ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTIgMDE0MSAgRklSRSBHTCAxMDAwIFBSTwotCQkxMDkyIDAxNDYgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTQ4ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTIgMDE0OSAgRklSRSBHTCAxMDAwIFBSTwotCQkxMDkyIDAxNTIgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTU0ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTIgMDE1NSAgRklSRSBHTCAxMDAwIFBSTwotCQkxMDkyIDAxNTYgIEZJUkUgR0wgMTAwMCBQUk8KLQkJMTA5MiAwMTU3ICBGSVJFIEdMIDEwMDAgUFJPCi0JCTEwOTcgM2QwMSAgSmVyb25pbW8gUHJvCi0JCTExMDIgMTAwZiAgR3JhcGhpY3MgQmxhc3RlciBFeHRyZW1lCi0JCTNkM2QgMDEwMCAgUmVmZXJlbmNlIFBlcm1lZGlhIDIgM0QKLQk4MDAwICBQQ0lMeW54L1BDSUx5bngyIElFRUUgMTM5NCBMaW5rIExheWVyIENvbnRyb2xsZXIKLQkJZTRiZiAxMDEwICBDRjEtMS1TTkFSRQotCQllNGJmIDEwMjAgIENGMS0yLVNOQVJFCi0JODAwOSAgRmlyZVdpcmUgQ29udHJvbGxlcgotCQkxMDRkIDgwMzIgIDgwMzIgT0hDSSBpLkxJTksgKElFRUUgMTM5NCkgQ29udHJvbGxlcgotCTgwMTcgIFBDSTQ0MTAgRmlyZVdpcmUgQ29udHJvbGxlcgotCTgwMTkgIFRTQjEyTFYyMyBJRUVFLTEzOTQgQ29udHJvbGxlcgotCQkxMWJkIDAwMGEgIFN0dWRpbyBEVjUwMC0xMzk0Ci0JCTExYmQgMDAwZSAgU3R1ZGlvIERWCi0JCWU0YmYgMTAxMCAgQ0YyLTEtQ1lNQkFMCi0JODAyMCAgVFNCMTJMVjI2IElFRUUtMTM5NCBDb250cm9sbGVyIChMaW5rKQotCQkxMWJkIDAwMGYgIFN0dWRpbyBEVjUwMC0xMzk0Ci0JODAyMSAgVFNCNDNBQTIyIElFRUUtMTM5NCBDb250cm9sbGVyIChQSFkvTGluayBJbnRlZ3JhdGVkKQotCQkxMDRkIDgwZGYgIFZhaW8gUENHLUZYNDAzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JODAyMiAgVFNCNDNBQjIyIElFRUUtMTM5NGEtMjAwMCBDb250cm9sbGVyIChQSFkvTGluaykKLQk4MDIzICBUU0I0M0FCMjIvQSBJRUVFLTEzOTRhLTIwMDAgQ29udHJvbGxlciAoUEhZL0xpbmspCi0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCTgwMjQgIFRTQjQzQUIyMyBJRUVFLTEzOTRhLTIwMDAgQ29udHJvbGxlciAoUEhZL0xpbmspCi0JODAyNSAgVFNCODJBQTIgSUVFRS0xMzk0YiBMaW5rIExheWVyIENvbnRyb2xsZXIKLQkJNTVhYSA1NWFhICBGaXJlV2lyZSA4MDAgUENJIENhcmQKLQk4MDI2ICBUU0I0M0FCMjEgSUVFRS0xMzk0YS0yMDAwIENvbnRyb2xsZXIgKFBIWS9MaW5rKQotCTgwMjcgIFBDSTQ0NTEgSUVFRS0xMzk0IENvbnRyb2xsZXIKLQkJMTAyOCAwMGU2ICBQQ0k0NDUxIElFRUUtMTM5NCBDb250cm9sbGVyIChEZWxsIEluc3Bpcm9uIDgxMDApCi0JODAyOSAgUENJNDUxMCBJRUVFLTEzOTQgQ29udHJvbGxlcgotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJMTA3MSA4MTYwICBNSU0yOTAwCi0JODAyYiAgUENJNzQxMCw3NTEwLDc2MTAgT0hDSS1MeW54IENvbnRyb2xsZXIKLQkJMTAyOCAwMTRlICBQQ0k3NDEwLDc1MTAsNzYxMCBPSENJLUx5bnggQ29udHJvbGxlciAoRGVsbCBMYXRpdHVkZSBEODAwKQotCTgwMmUgIFBDSTd4MjAgMTM5NGEtMjAwMCBPSENJIFR3by1Qb3J0IFBIWS9MaW5rLUxheWVyIENvbnRyb2xsZXIKLQk4MDMxICBUZXhhcyBJbnN0cnVtZW50cyBQQ0l4eDIxL3g1MTUgQ2FyZGJ1cyBDb250cm9sbGVyCi0JODAzMiAgVGV4YXMgSW5zdHJ1bWVudHMgT0hDSSBDb21wbGlhbnQgSUVFRSAxMzk0IEhvc3QgQ29udHJvbGxlcgotCTgwMzMgIFRleGFzIEluc3RydW1lbnRzIFBDSXh4MjEgSW50ZWdyYXRlZCBGbGFzaE1lZGlhIENvbnRyb2xsZXIKLQk4MDM0ICBUZXhhcyBJbnN0cnVtZW50cyBQQ0k2NDExLCBQQ0k2NDIxLCBQQ0k2NjExLCBQQ0k2NjIxLCBQQ0k3NDExLCBQQ0k3NDIxLCBQQ0k3NjExLCBQQ0k3NjIxIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29udHJvbGxlcgotCTgwMzUgIFRleGFzIEluc3RydW1lbnRzIFBDSTY0MTEsIFBDSTY0MjEsIFBDSTY2MTEsIFBDSTY2MjEsIFBDSTc0MTEsIFBDSTc0MjEsIFBDSTc2MTEsIFBDSTc2MjEgU21hcnQgQ2FyZCBDb250cm9sbGVyIChTTUMpCi0JODIwMSAgUENJMTYyMCBGaXJtd2FyZSBMb2FkaW5nIEZ1bmN0aW9uCi0JODIwNCAgUENJNzQxMCw3NTEwLDc2MTAgUENJIEZpcm13YXJlIExvYWRpbmcgRnVuY3Rpb24KLQkJMTAyOCAwMTRlICBMYXRpdHVkZSBEODAwCi0JODQwMCAgQUNYIDEwMCAyMk1icHMgV2lyZWxlc3MgSW50ZXJmYWNlCi0JCTAwZmMgMTZlYyAgVS5TLiBSb2JvdGljcyAyMiBNYnBzIFdpcmVsZXNzIFBDIENhcmQgKG1vZGVsIDIyMTApCi0JCTAwZmQgMTZlYyAgVS5TLiBSb2JvdGljcyAyMk1icHMgV2lyZWxlc3MgUENJIEFkYXB0ZXIgKG1vZGVsIDIyMTYpCi0JCTExODYgM2IwMCAgRFdMLTY1MCsgUEMgQ2FyZCBjYXJkYnVzIDIyTWJzIFdpcmVsZXNzIEFkYXB0ZXIgW0FpclBsdXNdCi0JCTExODYgM2IwMSAgRFdMLTUyMCsgMjJNYnBzIFBDSSBXaXJlbGVzcyBBZGFwdGVyCi0JODQwMSAgQUNYIDEwMCAyMk1icHMgV2lyZWxlc3MgSW50ZXJmYWNlCi0jIE9LLCB0aGlzIGluZm8gaXMgYWxtb3N0IHVzZWxlc3MgYXMgaXMsIGJ1dCBhdCBsZWFzdCBpdCdzIGtub3duIHRoYXQgaXQncyBhIHdpcmVsZXNzIGNhcmQuIE1vcmUgaW5mbyByZXF1ZXN0ZWQgZnJvbSByZXBvcnRlciAod2hpCi0JOTAwMCAgV2lyZWxlc3MgSW50ZXJmYWNlIChvZiB1bmtub3duIHR5cGUpCi0JOTA2NiAgQUNYIDExMSA1NE1icHMgV2lyZWxlc3MgSW50ZXJmYWNlCi0JYTAwMSAgVERDMTU3MAotCWExMDAgIFREQzE1NjEKLQlhMTAyICBUTkVUQTE1NzUgSHlwZXJTQVIgUGx1cyB3L1BDSSBIb3N0IGkvZiAmIFVUT1BJQSBpL2YKLQlhMTA2ICBUTVMzMjBDNjIwNSBGaXhlZCBQb2ludCBEU1AKLQkJMTc1YyA1MDAwICBBU0k1MHh4IEF1ZGlvIEFkYXB0ZXIKLQkJMTc1YyA4NzAwICBBU0k4N3h4IFJhZGlvIFR1bmVyIGNhcmQKLQlhYzEwICBQQ0kxMDUwCi0JYWMxMSAgUENJMTA1MwotCWFjMTIgIFBDSTExMzAKLQlhYzEzICBQQ0kxMDMxCi0JYWMxNSAgUENJMTEzMQotCWFjMTYgIFBDSTEyNTAKLQkJMTAxNCAwMDkyICBUaGlua1BhZCA2MDAKLQlhYzE3ICBQQ0kxMjIwCi0JYWMxOCAgUENJMTI2MAotCWFjMTkgIFBDSTEyMjEKLQlhYzFhICBQQ0kxMjEwCi0JYWMxYiAgUENJMTQ1MAotCQkwZTExIGIxMTMgIEFybWFkYSBNNzAwCi0JYWMxYyAgUENJMTIyNQotCQkwZTExIGIxMjEgIEFybWFkYSBFNTAwCi0JCTEwMjggMDA4OCAgRGVsbCAgQ29tcHV0ZXIgQ29ycG9yYXRpb24gIExhdGl0dWRlIENQaSBBNDAwWFQKLQlhYzFkICBQQ0kxMjUxQQotCWFjMWUgIFBDSTEyMTEKLQlhYzFmICBQQ0kxMjUxQgotCWFjMjAgIFRJIDIwMzAKLQlhYzIxICBQQ0kyMDMxCi0JYWMyMiAgUENJMjAzMiBQQ0kgRG9ja2luZyBCcmlkZ2UKLQlhYzIzICBQQ0kyMjUwIFBDSS10by1QQ0kgQnJpZGdlCi0JYWMyOCAgUENJMjA1MCBQQ0ktdG8tUENJIEJyaWRnZQotCWFjMzAgIFBDSTEyNjAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQlhYzQwICBQQ0k0NDUwIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JYWM0MSAgUENJNDQxMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCWFjNDIgIFBDSTQ0NTEgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQkJMTAyOCAwMGU2ICBQQ0k0NDUxIFBDIGNhcmQgQ2FyZEJ1cyBDb250cm9sbGVyIChEZWxsIEluc3Bpcm9uIDgxMDApCi0JYWM0NCAgUENJNDUxMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JYWM0NiAgUENJNDUyMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCWFjNDcgIFBDSTc1MTAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQkJMTAyOCAwMTRlICBMYXRpdHVkZSBEODAwCi0JYWM0YSAgUENJNzUxMCw3NjEwIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JCTEwMjggMDE0ZSAgTGF0aXR1ZGUgRDgwMAotCWFjNTAgIFBDSTE0MTAgUEMgY2FyZCBDYXJkYnVzIENvbnRyb2xsZXIKLQlhYzUxICBQQ0kxNDIwCi0JCTEwMTQgMDIzYiAgVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykKLQkJMTAyOCAwMGIxICBMYXRpdHVkZSBDNjAwCi0JCTEwMjggMDEyYSAgTGF0aXR1ZGUgQzY0MAotCQkxMDMzIDgwY2QgIFZlcnNhIE5vdGUgVlhpCi0JCTEwY2YgMTA5NSAgTGlmZWJvb2sgQzYxNTUKLQkJZTRiZiAxMDAwICBDUDItMi1ISVBIT1AKLQlhYzUyICBQQ0kxNDUxIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JYWM1MyAgUENJMTQyMSBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCWFjNTQgIFBDSTE2MjAgUEMgQ2FyZCBDb250cm9sbGVyCi0JYWM1NSAgUENJMTUyMCBQQyBjYXJkIENhcmRidXMgQ29udHJvbGxlcgotCQkxMDE0IDA1MTIgIFRoaW5rUGFkIFQzMC9UNDAKLQlhYzU2ICBQQ0kxNTEwIFBDIGNhcmQgQ2FyZGJ1cyBDb250cm9sbGVyCi0JCTEwMTQgMDUyOCAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIENhcmRidXMgQ29udHJvbGxlcgotCWFjNjAgIFBDSTIwNDAgUENJIHRvIERTUCBCcmlkZ2UgQ29udHJvbGxlcgotCQkxNzVjIDUxMDAgIEFTSTUxeHggQXVkaW8gQWRhcHRlcgotCQkxNzVjIDYxMDAgIEFTSTYxeHggQXVkaW8gQWRhcHRlcgotCQkxNzVjIDYyMDAgIEFTSTYyeHggQXVkaW8gQWRhcHRlcgotCWFjOGQgIFBDSSA3NjIwCi0JYWM4ZSAgUENJNzQyMCBDYXJkQnVzIENvbnRyb2xsZXIKLQlhYzhmICBQQ0k3NDIwL1BDSTc2MjAgRHVhbCBTb2NrZXQgQ2FyZEJ1cyBhbmQgU21hcnQgQ2FyZCBDb250LiB3LyAxMzk0YS0yMDAwIE9IQ0kgVHdvLVBvcnQgIFBIWS9MaW5rLUxheWVyIENvbnQuIGFuZCBTRC9NUy1Qcm8gU29ja2V0cwotCWZlMDAgIEZpcmVXaXJlIEhvc3QgQ29udHJvbGxlcgotCWZlMDMgIDEyQzAxQSBGaXJlV2lyZSBIb3N0IENvbnRyb2xsZXIKLTEwNGQgIFNvbnkgQ29ycG9yYXRpb24KLQk4MDA0ICBEVEwtSDI1MDAgW1BsYXlzdGF0aW9uIGRldmVsb3BtZW50IGJvYXJkXQotCTgwMDkgIENYRDE5NDdRIGkuTElOSyBDb250cm9sbGVyCi0JODAzOSAgQ1hEMzIyMiBpLkxJTksgQ29udHJvbGxlcgotCTgwNTYgIFJvY2t3ZWxsIEhDRiA1NksgbW9kZW0KLQk4MDhhICBNZW1vcnkgU3RpY2sgQ29udHJvbGxlcgotMTA0ZSAgT2FrIFRlY2hub2xvZ3ksIEluYwotCTAwMTcgIE9USS02NDAxNwotCTAxMDcgIE9USS0xMDcgW1NwaXRmaXJlXQotCTAxMDkgIFZpZGVvIEFkYXB0ZXIKLQkwMTExICBPVEktNjQxMTEgW1NwaXRmaXJlXQotCTAyMTcgIE9USS02NDIxNwotCTAzMTcgIE9USS02NDMxNwotMTA0ZiAgQ28tdGltZSBDb21wdXRlciBMdGQKLTEwNTAgIFdpbmJvbmQgRWxlY3Ryb25pY3MgQ29ycAotCTAwMDAgIE5FMjAwMAotCTAwMDEgIFc4Mzc2OUYKLQkwMTA1ICBXODJDMTA1Ci0JMDg0MCAgVzg5Qzg0MAotCQkxMDUwIDAwMDEgIFc4OUM4NDAgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDUwIDA4NDAgIFc4OUM4NDAgRXRoZXJuZXQgQWRhcHRlcgotCTA5NDAgIFc4OUM5NDAKLQk1YTVhICBXODlDOTQwRgotCTY2OTIgIFc2NjkyCi0JOTkyMSAgVzk5MjAwRiBNUEVHLTEgVmlkZW8gRW5jb2RlcgotCTk5MjIgIFc5OTIwMEYvVzk5MjJQRiBNUEVHLTEvMiBWaWRlbyBFbmNvZGVyCi0JOTk3MCAgVzk5NzBDRgotMTA1MSAgQW5pZ21hLCBJbmMuCi0xMDUyICA/WW91bmcgTWljcm8gU3lzdGVtcwotMTA1MyAgWW91bmcgTWljcm8gU3lzdGVtcwotMTA1NCAgSGl0YWNoaSwgTHRkCi0xMDU1ICBFZmFyIE1pY3Jvc3lzdGVtcwotCTkxMzAgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIElERQotCTk0NjAgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIElTQQotCTk0NjIgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIFVTQgotCTk0NjMgIFNMQzkwRTY2IFtWaWN0b3J5NjZdIEFDUEkKLTEwNTYgIElDTAotIyBNb3Rvcm9sYSBtYWRlIGEgbWlzdGFrZSBhbmQgdXNlZCAxNTA3IGluc3RlYWQgb2YgMTA1NyBpbiBzb21lIGNoaXBzLiBQbGVhc2UgbG9vayBhdCB0aGUgMTUwNyBlbnRyeSBhcyB3ZWxsIHdoZW4gdXBkYXRpbmcgdGhpcy4KLTEwNTcgIE1vdG9yb2xhCi0JMDAwMSAgTVBDMTA1IFtFYWdsZV0KLQkwMDAyICBNUEMxMDYgW0dyYWNrbGVdCi0JMDAwMyAgTVBDODI0MCBbS2FobHVhXQotCTAwMDQgIE1QQzEwNwotCTAwMDYgIE1QQzgyNDUgW1VuaXR5XQotCTAwMDggIE1QQzg1NDAKLQkwMDA5ICBNUEM4NTYwCi0JMDEwMCAgTUMxNDU1NzUgW0hGQy1QQ0ldCi0JMDQzMSAgS1RJODI5YyAxMDBWRwotCTE4MDEgIERTUDU2MzAxIERpZ2l0YWwgU2lnbmFsIFByb2Nlc3NvcgotCQkxNGZiIDAxMDEgIFRyYW5zYXMgUmFkYXIgSW1pdGF0b3IgQm9hcmQgW1JJTV0KLQkJMTRmYiAwMTAyICBUcmFuc2FzIFJhZGFyIEltaXRhdG9yIEJvYXJkIFtSSU0tMl0KLQkJMTRmYiAwMjAyICBUcmFuc2FzIFJhZGFyIEludGVncmF0b3IgQm9hcmQgW1JJQi0yXQotCQkxNGZiIDA2MTEgIDEgY2hhbm5lbCBDQU4gYnVzIENvbnRyb2xsZXIgW0NhblBjaS0xXQotCQkxNGZiIDA2MTIgIDIgY2hhbm5lbHMgQ0FOIGJ1cyBDb250cm9sbGVyIFtDYW5QY2ktMl0KLQkJMTRmYiAwNjEzICAzIGNoYW5uZWxzIENBTiBidXMgQ29udHJvbGxlciBbQ2FuUGNpLTNdCi0JCTE0ZmIgMDYxNCAgNCBjaGFubmVscyBDQU4gYnVzIENvbnRyb2xsZXIgW0NhblBjaS00XQotCQkxNGZiIDA2MjEgIDEgY2hhbm5lbCBDQU4gYnVzIENvbnRyb2xsZXIgW0NhblBjaTItMV0KLQkJMTRmYiAwNjIyICAyIGNoYW5uZWxzIENBTiBidXMgQ29udHJvbGxlciBbQ2FuUGNpMi0yXQotCQkxNGZiIDA4MTAgIFRyYW5zYXMgVlRTIFJhZGFyIEludGVncmF0b3IgQm9hcmQgW1JJQi00XQotCQkxNzVjIDQyMDAgIEFTSTQyMTUgQXVkaW8gQWRhcHRlcgotCQkxNzVjIDQzMDAgIEFTSTQzeHggQXVkaW8gQWRhcHRlcgotCQkxNzVjIDQ0MDAgIEFTSTQ0MDEgQXVkaW8gQWRhcHRlcgotCQllY2MwIDAwMTAgIERhcmxhCi0JCWVjYzAgMDAyMCAgR2luYQotCQllY2MwIDAwMzAgIExheWxhIHJldi4wCi0JCWVjYzAgMDAzMSAgTGF5bGEgcmV2LjEKLQkJZWNjMCAwMDQwICBEYXJsYTI0IHJldi4wCi0JCWVjYzAgMDA0MSAgRGFybGEyNCByZXYuMQotCQllY2MwIDAwNTAgIEdpbmEyNCByZXYuMAotCQllY2MwIDAwNTEgIEdpbmEyNCByZXYuMQotCQllY2MwIDAwNzAgIE1vbmEgcmV2LjAKLQkJZWNjMCAwMDcxICBNb25hIHJldi4xCi0JCWVjYzAgMDA3MiAgTW9uYSByZXYuMgotCTE4YzAgIE1QQzgyNjVBL01QQzgyNjYKLQkxOGMxICBNUEM4MjcxL01QQzgyNzIKLQkzNDEwICBEU1A1NjM2MSBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzb3IKLQkJZWNjMCAwMDUwICBHaW5hMjQgcmV2LjAKLQkJZWNjMCAwMDUxICBHaW5hMjQgcmV2LjEKLQkJZWNjMCAwMDYwICBMYXlsYTI0Ci0JCWVjYzAgMDA3MCAgTW9uYSByZXYuMAotCQllY2MwIDAwNzEgIE1vbmEgcmV2LjEKLQkJZWNjMCAwMDcyICBNb25hIHJldi4yCi0JCWVjYzAgMDA4MCAgTWlhIHJldi4wCi0JCWVjYzAgMDA4MSAgTWlhIHJldi4xCi0JCWVjYzAgMDA5MCAgSW5kaWdvCi0JCWVjYzAgMDBhMCAgSW5kaWdvIElPCi0JCWVjYzAgMDBiMCAgSW5kaWdvIERKCi0JCWVjYzAgMDEwMCAgM0cKLQk0ODAxICBSYXZlbgotCTQ4MDIgIEZhbGNvbgotCTQ4MDMgIEhhd2sKLQk0ODA2ICBDUFg4MjE2Ci0JNGQ2OCAgMjAyNjgKLQk1NjAwICBTTTU2IFBDSSBNb2RlbQotCQkxMDU3IDAzMDAgIFNNNTYgUENJIFNwZWFrZXJwaG9uZSBNb2RlbQotCQkxMDU3IDAzMDEgIFNNNTYgUENJIFZvaWNlIE1vZGVtCi0JCTEwNTcgMDMwMiAgU001NiBQQ0kgRmF4IE1vZGVtCi0JCTEwNTcgNTYwMCAgU001NiBQQ0kgVm9pY2UgbW9kZW0KLQkJMTNkMiAwMzAwICBTTTU2IFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkJMTNkMiAwMzAxICBTTTU2IFBDSSBWb2ljZSBtb2RlbQotCQkxM2QyIDAzMDIgIFNNNTYgUENJIEZheCBNb2RlbQotCQkxNDM2IDAzMDAgIFNNNTYgUENJIFNwZWFrZXJwaG9uZSBNb2RlbQotCQkxNDM2IDAzMDEgIFNNNTYgUENJIFZvaWNlIG1vZGVtCi0JCTE0MzYgMDMwMiAgU001NiBQQ0kgRmF4IE1vZGVtCi0JCTE0NGYgMTAwYyAgU001NiBQQ0kgRmF4IE1vZGVtCi0JCTE0OTQgMDMwMCAgU001NiBQQ0kgU3BlYWtlcnBob25lIE1vZGVtCi0JCTE0OTQgMDMwMSAgU001NiBQQ0kgVm9pY2UgbW9kZW0KLQkJMTRjOCAwMzAwICBTTTU2IFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkJMTRjOCAwMzAyICBTTTU2IFBDSSBGYXggTW9kZW0KLQkJMTY2OCAwMzAwICBTTTU2IFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkJMTY2OCAwMzAyICBTTTU2IFBDSSBGYXggTW9kZW0KLQk1ODAzICBNUEM1MjAwCi0JNjQwMCAgTVBDMTkwIFNlY3VyaXR5IFByb2Nlc3NvciAoUzEgZmFtaWx5LCBlbmNyeXB0aW9uKQotCTY0MDUgIE1QQzE4NCBTZWN1cml0eSBQcm9jZXNzb3IgKFMxIGZhbWlseSkKLTEwNTggIEVsZWN0cm9uaWNzICYgVGVsZWNvbW11bmljYXRpb25zIFJTSAotMTA1OSAgVGVrbm9yIEluZHVzdHJpYWwgQ29tcHV0ZXJzIEluYwotMTA1YSAgUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuCi0jIG1vcmUgY29ycmVjdCBkZXNjcmlwdGlvbiBmcm9tIHByb21pc2UgbGludXggc291cmNlcwotCTBkMzAgIFBEQzIwMjY1IChGYXN0VHJhazEwMCBMaXRlL1VsdHJhMTAwKQotCQkxMDVhIDRkMzMgIFVsdHJhMTAwCi0JMGQzOCAgMjAyNjMKLQkJMTA1YSA0ZDM5ICBGYXN0dHJhazY2Ci0JMTI3NSAgMjAyNzUKLQkzMzE4ICBQREMyMDMxOCAoU0FUQTE1MCBUWDQpCi0JMzMxOSAgUERDMjAzMTkgKEZhc3RUcmFrIFMxNTAgVFg0KQotCQk4MDg2IDM0MjcgIFM4NzVXUDEtRSBtYWluYm9hcmQKLQkzMzcxICBQREMyMDM3MSAoRmFzdFRyYWsgUzE1MCBUWDJwbHVzKQotCTMzNzMgIFBEQzIwMzc4IChGYXN0VHJhayAzNzgvU0FUQSAzNzgpCi0JCTEwNDMgODBmNSAgSzhWIERlbHV4ZS9QQy1ETCBEZWx1eGUgbW90aGVyYm9hcmQKLQkJMTQ2MiA3MDJlICBLOFQgTkVPIEZJUzJSIG1vdGhlcmJvYXJkCi0JMzM3NSAgUERDMjAzNzUgKFNBVEExNTAgVFgycGx1cykKLQkzMzc2ICBQREMyMDM3NiAoRmFzdFRyYWsgMzc2KQotCQkxMDQzIDgwOWUgIEE3VjhYIG1vdGhlcmJvYXJkCi0JMzU3NCAgUERDMjA1NzkgU0FUQUlJIDE1MCBJREUgQ29udHJvbGxlcgotCTNkMTggIFBEQzIwNTE4L1BEQzQwNTE4IChTQVRBSUkgMTUwIFRYNCkKLQkzZDc1ICBQREMyMDU3NSAoU0FUQUlJMTUwIFRYMnBsdXMpCi0JNGQzMCAgUERDMjAyNjcgKEZhc3RUcmFrMTAwL1VsdHJhMTAwKQotCQkxMDVhIDRkMzMgIFVsdHJhMTAwCi0JCTEwNWEgNGQzOSAgRmFzdFRyYWsxMDAKLQk0ZDMzICAyMDI0NgotCQkxMDVhIDRkMzMgIDIwMjQ2IElERSBDb250cm9sbGVyCi0JNGQzOCAgUERDMjAyNjIgKEZhc3RUcmFrNjYvVWx0cmE2NikKLQkJMTA1YSA0ZDMwICBVbHRyYSBEZXZpY2Ugb24gU3VwZXJUcmFrCi0JCTEwNWEgNGQzMyAgVWx0cmE2NgotCQkxMDVhIDRkMzkgIEZhc3RUcmFrNjYKLQk0ZDY4ICBQREMyMDI2OCAoVWx0cmExMDAgVFgyKQotCQkxMDVhIDRkNjggIFVsdHJhMTAwVFgyCi0JNGQ2OSAgMjAyNjkKLQkJMTA1YSA0ZDY4ICBVbHRyYTEzM1RYMgotCTUyNzUgIFBEQzIwMjc2IChNQkZhc3RUcmFrMTMzIExpdGUpCi0JCTEwNWEgMDI3NSAgU3VwZXJUcmFrIFNYNjAwMCBJREUKLQkJMTA1YSAxMjc1ICBNQkZhc3RUcmFrMTMzIExpdGUgKHRtKSBDb250cm9sbGVyIChSQUlEIG1vZGUpCi0JCTE0NTggYjAwMSAgTUJVbHRyYSAxMzMKLQk1MzAwICBEQzUzMDAKLQk2MjY4ICBQREMyMDI3MCAoRmFzdFRyYWsxMDAgTFAvVFgyL1RYNCkKLQkJMTA1YSA0ZDY4ICBGYXN0VHJhazEwMCBUWDIKLQk2MjY5ICBQREMyMDI3MSAoRmFzdFRyYWsgVFgyMDAwKQotCQkxMDVhIDYyNjkgIEZhc3RUcmFrIFRYMi9UWDIwMDAKLQk2NjIxICBQREMyMDYyMSAoRmFzdFRyYWsgUzE1MCBTWDQvRmFzdFRyYWsgU1g0MDAwIGxpdGUpCi0JNjYyMiAgUERDMjA2MjEgW1NBVEExNTAgU1g0XSA0IENoYW5uZWwgSURFIFJBSUQgQ29udHJvbGxlcgotCTY2MjYgIFBEQzIwNjE4IChVbHRyYSA2MTgpCi0JNjYyOSAgUERDMjA2MTkgKEZhc3RUcmFrIFRYNDAwMCkKLQk3Mjc1ICBQREMyMDI3NyAoU0JGYXN0VHJhazEzMyBMaXRlKQotMTA1YiAgRm94Y29ubiBJbnRlcm5hdGlvbmFsLCBJbmMuCi0xMDVjICBXaXBybyBJbmZvdGVjaCBMaW1pdGVkCi0xMDVkICBOdW1iZXIgOSBDb21wdXRlciBDb21wYW55Ci0JMjMwOSAgSW1hZ2luZSAxMjgKLQkyMzM5ICBJbWFnaW5lIDEyOC1JSQotCQkxMDVkIDAwMDAgIEltYWdpbmUgMTI4IHNlcmllcyAyIDRNYiBWUkFNCi0JCTEwNWQgMDAwMSAgSW1hZ2luZSAxMjggc2VyaWVzIDIgNE1iIFZSQU0KLQkJMTA1ZCAwMDAyICBJbWFnaW5lIDEyOCBzZXJpZXMgMiA0TWIgVlJBTQotCQkxMDVkIDAwMDMgIEltYWdpbmUgMTI4IHNlcmllcyAyIDRNYiBWUkFNCi0JCTEwNWQgMDAwNCAgSW1hZ2luZSAxMjggc2VyaWVzIDIgNE1iIFZSQU0KLQkJMTA1ZCAwMDA1ICBJbWFnaW5lIDEyOCBzZXJpZXMgMiA0TWIgVlJBTQotCQkxMDVkIDAwMDYgIEltYWdpbmUgMTI4IHNlcmllcyAyIDRNYiBWUkFNCi0JCTEwNWQgMDAwNyAgSW1hZ2luZSAxMjggc2VyaWVzIDIgNE1iIFZSQU0KLQkJMTA1ZCAwMDA4ICBJbWFnaW5lIDEyOCBzZXJpZXMgMmUgNE1iIERSQU0KLQkJMTA1ZCAwMDA5ICBJbWFnaW5lIDEyOCBzZXJpZXMgMmUgNE1iIERSQU0KLQkJMTA1ZCAwMDBhICBJbWFnaW5lIDEyOCBzZXJpZXMgMiA4TWIgVlJBTQotCQkxMDVkIDAwMGIgIEltYWdpbmUgMTI4IHNlcmllcyAyIDhNYiBILVZSQU0KLQkJMTFhNCAwMDBhICBCYXJjbyBNZXRoZXVzIDUgTWVnYXBpeGVsCi0JCTEzY2MgMDAwMCAgQmFyY28gTWV0aGV1cyA1IE1lZ2FwaXhlbAotCQkxM2NjIDAwMDQgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwKLQkJMTNjYyAwMDA1ICBCYXJjbyBNZXRoZXVzIDUgTWVnYXBpeGVsCi0JCTEzY2MgMDAwNiAgQmFyY28gTWV0aGV1cyA1IE1lZ2FwaXhlbAotCQkxM2NjIDAwMDggIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwKLQkJMTNjYyAwMDA5ICBCYXJjbyBNZXRoZXVzIDUgTWVnYXBpeGVsCi0JCTEzY2MgMDAwYSAgQmFyY28gTWV0aGV1cyA1IE1lZ2FwaXhlbAotCQkxM2NjIDAwMGMgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwKLQk0OTNkICBJbWFnaW5lIDEyOCBUMlIgW1RpY2tldCB0byBSaWRlXQotCQkxMWE0IDAwMGEgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxMWE0IDAwMGIgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDIgIEJhcmNvIE1ldGhldXMgNCBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDMgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDcgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDggIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMDkgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCQkxM2NjIDAwMGEgIEJhcmNvIE1ldGhldXMgNSBNZWdhcGl4ZWwsIER1YWwgSGVhZAotCTUzNDggIFJldm9sdXRpb24gNAotCQkxMDVkIDAwMzcgIFJldm9sdXRpb24gSVYtRlAgQUdQIChGb3IgU0dJIDE2MDBTVykKLTEwNWUgIFZ0ZWNoIENvbXB1dGVycyBMdGQKLTEwNWYgIEluZm90cm9uaWMgQW1lcmljYSBJbmMKLTEwNjAgIFVuaXRlZCBNaWNyb2VsZWN0cm9uaWNzIFtVTUNdCi0JMDAwMSAgVU04MkM4ODEKLQkwMDAyICBVTTgyQzg4NgotCTAxMDEgIFVNODY3M0YKLQkwODgxICBVTTg4ODEKLQkwODg2ICBVTTg4ODZGCi0JMDg5MSAgVU04ODkxQQotCTEwMDEgIFVNODg2QQotCTY3M2EgIFVNODg4NkJGCi0JNjczYiAgRUlERSBNYXN0ZXIvRE1BCi0JODcxMCAgVU04NzEwCi0JODg2YSAgVU04ODg2QQotCTg4ODEgIFVNODg4MUYKLQk4ODg2ICBVTTg4ODZGCi0JODg4YSAgVU04ODg2QQotCTg4OTEgIFVNODg5MUEKLQk5MDE3ICBVTTkwMTdGCi0JOTAxOCAgVU05MDE4Ci0JOTAyNiAgVU05MDI2Ci0JZTg4MSAgVU04ODgxTgotCWU4ODYgIFVNODg4Nk4KLQllODhhICBVTTg4ODZOCi0JZTg5MSAgVU04ODkxTgotMTA2MSAgSS5JLlQuCi0JMDAwMSAgQUdYMDE2Ci0JMDAwMiAgSUlUMzIwNC8zNTAxCi0xMDYyICBNYXNwYXIgQ29tcHV0ZXIgQ29ycAotMTA2MyAgT2NlYW4gT2ZmaWNlIEF1dG9tYXRpb24KLTEwNjQgIEFsY2F0ZWwKLTEwNjUgIFRleGFzIE1pY3Jvc3lzdGVtcwotMTA2NiAgUGljb1Bvd2VyIFRlY2hub2xvZ3kKLQkwMDAwICBQVDgwQzgyNgotCTAwMDEgIFBUODZDNTIxIFtWZXN1dml1cyB2MV0gSG9zdCBCcmlkZ2UKLQkwMDAyICBQVDg2QzUyMyBbVmVzdXZpdXMgdjNdIFBDSS1JU0EgQnJpZGdlIE1hc3RlcgotCTAwMDMgIFBUODZDNTI0IFtOaWxlXSBQQ0ktdG8tUENJIEJyaWRnZQotCTAwMDQgIFBUODZDNTI1IFtOaWxlLUlJXSBQQ0ktdG8tUENJIEJyaWRnZQotCTAwMDUgIE5hdGlvbmFsIFBDODc1NTAgU3lzdGVtIENvbnRyb2xsZXIKLQk4MDAyICBQVDg2QzUyMyBbVmVzdXZpdXMgdjNdIFBDSS1JU0EgQnJpZGdlIFNsYXZlCi0xMDY3ICBNaXRzdWJpc2hpIEVsZWN0cmljCi0JMDMwMSAgQWNjZWxHcmFwaGljcyBBY2NlbEVDTElQU0UKLQkwMzA0ICBBY2NlbEdBTEFYWSBBMjEwMCBbT0VNIEV2YW5zICYgU3V0aGVybGFuZF0KLQkwMzA4ICBUb3JuYWRvIDMwMDAgW09FTSBFdmFucyAmIFN1dGhlcmxhbmRdCi0JMTAwMiAgVkc1MDAgW1ZvbHVtZVBybyBWb2x1bWUgUmVuZGVyaW5nIEFjY2VsZXJhdG9yXQotMTA2OCAgRGl2ZXJzaWZpZWQgVGVjaG5vbG9neQotMTA2OSAgTXlsZXggQ29ycG9yYXRpb24KLQkwMDAxICBEQUM5NjBQCi0JMDAwMiAgREFDOTYwUEQKLQkwMDEwICBEQUM5NjBQRwotCTAwMjAgIERBQzk2MExBCi0JMDA1MCAgQWNjZWxlUkFJRCAzNTIvMTcwLzE2MCBzdXBwb3J0IERldmljZQotCWIxNjYgIEdlbXN0b25lIGNoaXBzZXQgU0NTSSBjb250cm9sbGVyCi0JCTEwMTQgMDI0MiAgaVNlcmllcyAyODcyIERBU0QgSU9BCi0JCTEwMTQgMDI2NiAgRHVhbCBDaGFubmVsIFBDSS1YIFUzMjAgU0NTSSBBZGFwdGVyCi0JCTEwMTQgMDI3OCAgRHVhbCBDaGFubmVsIFBDSS1YIFUzMjAgU0NTSSBSQUlEIEFkYXB0ZXIKLQkJMTAxNCAwMmQzICBEdWFsIENoYW5uZWwgUENJLVggVTMyMCBTQ1NJIEFkYXB0ZXIKLQkJMTAxNCAwMmQ0ICBEdWFsIENoYW5uZWwgUENJLVggVTMyMCBTQ1NJIFJBSUQgQWRhcHRlcgotCWJhNTUgIGVYdHJlbWVSQUlEIDExMDAgc3VwcG9ydCBEZXZpY2UKLQliYTU2ICBlWHRyZW1lUkFJRCAyMDAwLzMwMDAgc3VwcG9ydCBEZXZpY2UKLTEwNmEgIEF0ZW4gUmVzZWFyY2ggSW5jCi0xMDZiICBBcHBsZSBDb21wdXRlciBJbmMuCi0JMDAwMSAgQmFuZGl0IFBvd2VyUEMgaG9zdCBicmlkZ2UKLQkwMDAyICBHcmFuZCBDZW50cmFsIEkvTwotCTAwMDMgIENvbnRyb2wgVmlkZW8KLQkwMDA0ICBQbGFuQiBWaWRlby1JbgotCTAwMDcgIE8nSGFyZSBJL08KLQkwMDBjICBET1Mgb24gTWFjCi0JMDAwZSAgSHlkcmEgTWFjIEkvTwotCTAwMTAgIEhlYXRocm93IE1hYyBJL08KLQkwMDE3ICBQYWRkaW5ndG9uIE1hYyBJL08KLQkwMDE4ICBVbmlOb3J0aCBGaXJlV2lyZQotCTAwMTkgIEtleUxhcmdvIFVTQgotCTAwMWUgIFVuaU5vcnRoIEludGVybmFsIFBDSQotCTAwMWYgIFVuaU5vcnRoIFBDSQotCTAwMjAgIFVuaU5vcnRoIEFHUAotCTAwMjEgIFVuaU5vcnRoIEdNQUMgKFN1biBHRU0pCi0JMDAyMiAgS2V5TGFyZ28gTWFjIEkvTwotCTAwMjQgIFVuaU5vcnRoL1BhbmdlYSBHTUFDIChTdW4gR0VNKQotCTAwMjUgIEtleUxhcmdvL1BhbmdlYSBNYWMgSS9PCi0JMDAyNiAgS2V5TGFyZ28vUGFuZ2VhIFVTQgotCTAwMjcgIFVuaU5vcnRoL1BhbmdlYSBBR1AKLQkwMDI4ICBVbmlOb3J0aC9QYW5nZWEgUENJCi0JMDAyOSAgVW5pTm9ydGgvUGFuZ2VhIEludGVybmFsIFBDSQotCTAwMmQgIFVuaU5vcnRoIDEuNSBBR1AKLQkwMDJlICBVbmlOb3J0aCAxLjUgUENJCi0JMDAyZiAgVW5pTm9ydGggMS41IEludGVybmFsIFBDSQotCTAwMzAgIFVuaU5vcnRoL1BhbmdlYSBGaXJlV2lyZQotCTAwMzEgIFVuaU5vcnRoIDIgRmlyZVdpcmUKLQkwMDMyICBVbmlOb3J0aCAyIEdNQUMgKFN1biBHRU0pCi0JMDAzMyAgVW5pTm9ydGggMiBBVEEvMTAwCi0JMDAzNCAgVW5pTm9ydGggMiBBR1AKLQkwMDM1ICBVbmlOb3J0aCAyIFBDSQotCTAwMzYgIFVuaU5vcnRoIDIgSW50ZXJuYWwgUENJCi0JMDAzYiAgVW5pTm9ydGgvSW50cmVwaWQgQVRBLzEwMAotCTAwM2UgIEtleUxhcmdvL0ludHJlcGlkIE1hYyBJL08KLQkwMDNmICBLZXlMYXJnby9JbnRyZXBpZCBVU0IKLQkwMDQwICBLMiBLZXlMYXJnbyBVU0IKLQkwMDQxICBLMiBLZXlMYXJnbyBNYWMvSU8KLQkwMDQyICBLMiBGaXJlV2lyZQotCTAwNDMgIEsyIEFUQS8xMDAKLQkwMDQ1ICBLMiBIVC1QQ0kgQnJpZGdlCi0JMDA0NiAgSzIgSFQtUENJIEJyaWRnZQotCTAwNDcgIEsyIEhULVBDSSBCcmlkZ2UKLQkwMDQ4ICBLMiBIVC1QQ0kgQnJpZGdlCi0JMDA0OSAgSzIgSFQtUENJIEJyaWRnZQotCTAwNGIgIFUzIEFHUAotCTAwNGMgIEsyIEdNQUMgKFN1biBHRU0pCi0JMDA0ZiAgU2hhc3RhIE1hYyBJL08KLQkwMDUwICBTaGFzdGEgSURFCi0JMDA1MSAgU2hhc3RhIChTdW4gR0VNKQotCTAwNTIgIFNoYXN0YSBGaXJld2lyZQotCTAwNTMgIFNoYXN0YSBQQ0kgQnJpZGdlCi0JMDA1NCAgU2hhc3RhIFBDSSBCcmlkZ2UKLQkwMDU1ICBTaGFzdGEgUENJIEJyaWRnZQotCTAwNTggIFUzTCBBR1AgQnJpZGdlCi0JMTY0NSAgVGlnb24zIEdpZ2FiaXQgRXRoZXJuZXQgTklDIChCQ001NzAxKQotMTA2YyAgSHluaXggU2VtaWNvbmR1Y3RvcgotCTg4MDEgIER1YWwgUGVudGl1bSBJU0EvUENJIE1vdGhlcmJvYXJkCi0JODgwMiAgUG93ZXJQQyBJU0EvUENJIE1vdGhlcmJvYXJkCi0JODgwMyAgRHVhbCBXaW5kb3cgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQk4ODA0ICBMQU4gQ29udHJvbGxlcgotCTg4MDUgIDEwMC1CYXNlVCBMQU4KLTEwNmQgIFNlcXVlbnQgQ29tcHV0ZXIgU3lzdGVtcwotMTA2ZSAgREZJLCBJbmMKLTEwNmYgIENpdHkgR2F0ZSBEZXZlbG9wbWVudCBMdGQKLTEwNzAgIERhZXdvbyBUZWxlY29tIEx0ZAotMTA3MSAgTWl0YWMKLQk4MTYwICBNaXRhYyA4MDYwQiBNb2JpbGUgUGxhdGZvcm0KLTEwNzIgIEdJVCBDbyBMdGQKLTEwNzMgIFlhbWFoYSBDb3Jwb3JhdGlvbgotCTAwMDEgIDNEIEdVSSBBY2NlbGVyYXRvcgotCTAwMDIgIFlHVjYxNSBbUlBBMyAzRC1HcmFwaGljcyBDb250cm9sbGVyXQotCTAwMDMgIFlNRi03NDAKLQkwMDA0ICBZTUYtNzI0Ci0JCTEwNzMgMDAwNCAgWU1GNzI0LUJhc2VkIFBDSSBBdWRpbyBBZGFwdGVyCi0JMDAwNSAgRFMxIEF1ZGlvCi0JCTEwNzMgMDAwNSAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAwNiAgRFMxIEF1ZGlvCi0JMDAwOCAgRFMxIEF1ZGlvCi0JCTEwNzMgMDAwOCAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAwYSAgRFMxTCBBdWRpbwotCQkxMDczIDAwMDQgIERTLVhHIFBDSSBBdWRpbyBDT0RFQwotCQkxMDczIDAwMGEgIERTLVhHIFBDSSBBdWRpbyBDT0RFQwotCTAwMGMgIFlNRi03NDBDIFtEUy0xTCBBdWRpbyBDb250cm9sbGVyXQotCQkxMDdhIDAwMGMgIERTLVhHIFBDSSBBdWRpbyBDT0RFQwotCTAwMGQgIFlNRi03MjRGIFtEUy0xIEF1ZGlvIENvbnRyb2xsZXJdCi0JCTEwNzMgMDAwZCAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAxMCAgWU1GLTc0NEIgW0RTLTFTIEF1ZGlvIENvbnRyb2xsZXJdCi0JCTEwNzMgMDAwNiAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JCTEwNzMgMDAxMCAgRFMtWEcgUENJIEF1ZGlvIENPREVDCi0JMDAxMiAgWU1GLTc1NCBbRFMtMUUgQXVkaW8gQ29udHJvbGxlcl0KLQkJMTA3MyAwMDEyICBEUy1YRyBQQ0kgQXVkaW8gQ29kZWMKLQkwMDIwICBEUy0xIEF1ZGlvCi0JMjAwMCAgRFMyNDE2IERpZ2l0YWwgTWl4aW5nIENhcmQKLQkJMTA3MyAyMDAwICBEUzI0MTYgRGlnaXRhbCBNaXhpbmcgQ2FyZAotMTA3NCAgTmV4R2VuIE1pY3Jvc3lzdGVtcwotCTRlNzggIDgyYzUwMC8xCi0xMDc1ICBBZHZhbmNlZCBJbnRlZ3JhdGlvbnMgUmVzZWFyY2gKLTEwNzYgIENoYWludGVjaCBDb21wdXRlciBDby4gTHRkCi0xMDc3ICBRTG9naWMgQ29ycC4KLQkxMDE2ICBJU1AxMDE2MCBTaW5nbGUgQ2hhbm5lbCBVbHRyYTMgU0NTSSBQcm9jZXNzb3IKLQkxMDIwICBJU1AxMDIwIEZhc3Qtd2lkZSBTQ1NJCi0JMTAyMiAgSVNQMTAyMiBGYXN0LXdpZGUgU0NTSQotCTEwODAgIElTUDEwODAgU0NTSSBIb3N0IEFkYXB0ZXIKLQkxMjE2ICBJU1AxMjE2MCBEdWFsIENoYW5uZWwgVWx0cmEzIFNDU0kgUHJvY2Vzc29yCi0JCTEwMWUgODQ3MSAgUUxBMTIxNjAgb24gQU1JIE1lZ2FSQUlECi0JCTEwMWUgODQ5MyAgUUxBMTIxNjAgb24gQU1JIE1lZ2FSQUlECi0JMTI0MCAgSVNQMTI0MCBTQ1NJIEhvc3QgQWRhcHRlcgotCTEyODAgIElTUDEyODAgU0NTSSBIb3N0IEFkYXB0ZXIKLQkyMDIwICBJU1AyMDIwQSBGYXN0IVNDU0kgQmFzaWMgQWRhcHRlcgotCTIxMDAgIFFMQTIxMDAgNjQtYml0IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCQkxMDc3IDAwMDEgIFFMQTIxMDAgNjQtYml0IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCTIyMDAgIFFMQTIyMDAgNjQtYml0IEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCQkxMDc3IDAwMDIgIFFMQTIyMDAKLQkyMzAwICBRTEEyMzAwIDY0LWJpdCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkyMzEyICBRTEEyMzEyIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotMTA3OCAgQ3lyaXggQ29ycG9yYXRpb24KLQkwMDAwICA1NTEwIFtHcmFwcGFdCi0JMDAwMSAgUENJIE1hc3RlcgotCTAwMDIgIDU1MjAgW0NvZ25hY10KLQkwMTAwICA1NTMwIExlZ2FjeSBbS2FobHVhXQotCTAxMDEgIDU1MzAgU01JIFtLYWhsdWFdCi0JMDEwMiAgNTUzMCBJREUgW0thaGx1YV0KLQkwMTAzICA1NTMwIEF1ZGlvIFtLYWhsdWFdCi0JMDEwNCAgNTUzMCBWaWRlbyBbS2FobHVhXQotCTA0MDAgIFpGTWljcm8gUENJIEJyaWRnZQotCTA0MDEgIFpGTWljcm8gQ2hpcHNldCBTTUkKLQkwNDAyICBaRk1pY3JvIENoaXBzZXQgSURFCi0JMDQwMyAgWkZNaWNybyBFeHBhbnNpb24gQnVzCi0xMDc5ICBJLUJ1cwotMTA3YSAgTmV0V29ydGgKLTEwN2IgIEdhdGV3YXkgMjAwMAotMTA3YyAgTEcgRWxlY3Ryb25pY3MgW0x1Y2t5IEdvbGRzdGFyIENvLiBMdGRdCi0xMDdkICBMZWFkVGVrIFJlc2VhcmNoIEluYy4KLQkwMDAwICBQODZDODUwCi0JMjEzNCAgV2luRmFzdCAzRCBTMzIwIElJCi0JMjk3MSAgW0dlRm9yY2UgRlggNTkwMF0gV2luRmFzdCBBMzUwIFRESCBNeVZpVm8KLTEwN2UgIEludGVycGhhc2UgQ29ycG9yYXRpb24KLQkwMDAxICA1NTE1IEFUTSBBZGFwdGVyIFtGbGlwcGVyXQotCTAwMDIgIDEwMCBWRyBBbnlMYW4gQ29udHJvbGxlcgotCTAwMDQgIDU1MjYgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQkwMDA1ICB4NTI2IEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JMDAwOCAgNTUyNS81NTc1IEFUTSBBZGFwdGVyICgxNTUgTWJpdCkgW0F0bGFudGljXQotCTkwMDMgIDU1MzUtNFAtQlJJLVNUCi0JOTAwNyAgNTUzNS00UC1CUkktVQotCTkwMDggIDU1MzUtMVAtU1IKLQk5MDBjICA1NTM1LTFQLVNSLVNUCi0JOTAwZSAgNTUzNS0xUC1TUi1VCi0JOTAxMSAgNTUzNS0xUC1QUkkKLQk5MDEzICA1NTM1LTJQLVBSSQotCTkwMjMgIDU1MzYtNFAtQlJJLVNUCi0JOTAyNyAgNTUzNi00UC1CUkktVQotCTkwMzEgIDU1MzYtMVAtUFJJCi0JOTAzMyAgNTUzNi0yUC1QUkkKLTEwN2YgIERhdGEgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgotCTA4MDIgIFNMODJDMTA1Ci0xMDgwICBDb250YXEgTWljcm9zeXN0ZW1zCi0JMDYwMCAgODJDNTk5Ci0JYzY5MSAgQ3lwcmVzcyBDWTgyQzY5MQotCWM2OTMgIDgyYzY5MwotMTA4MSAgU3VwZXJtYWMgVGVjaG5vbG9neQotCTBkNDcgIFJhZGl1cyBQQ0kgdG8gTnVCVVMgQnJpZGdlCi0xMDgyICBFRkEgQ29ycG9yYXRpb24gb2YgQW1lcmljYQotMTA4MyAgRm9yZXggQ29tcHV0ZXIgQ29ycG9yYXRpb24KLQkwMDAxICBGUjcxMAotMTA4NCAgUGFyYWRvcgotMTA4NSAgVHVsaXAgQ29tcHV0ZXJzIEludC5CLlYuCi0xMDg2ICBKLiBCb25kIENvbXB1dGVyIFN5c3RlbXMKLTEwODcgIENhY2hlIENvbXB1dGVyCi0xMDg4ICBNaWNyb2NvbXB1dGVyIFN5c3RlbXMgKE0pIFNvbgotMTA4OSAgRGF0YSBHZW5lcmFsIENvcnBvcmF0aW9uCi0jIEZvcm1lcmx5IEJpdDMgQ29tcHV0ZXIgQ29ycC4KLTEwOGEgIFNCUyBUZWNobm9sb2dpZXMKLQkwMDAxICBWTUUgQnJpZGdlIE1vZGVsIDYxNwotCTAwMTAgIFZNRSBCcmlkZ2UgTW9kZWwgNjE4Ci0JMDA0MCAgZGF0YUJMSVpaQVJECi0JMzAwMCAgVk1FIEJyaWRnZSBNb2RlbCAyNzA2Ci0xMDhjICBPYWtsZWlnaCBTeXN0ZW1zIEluYy4KLTEwOGQgIE9saWNvbQotCTAwMDEgIFRva2VuLVJpbmcgMTYvNCBQQ0kgQWRhcHRlciAoMzEzNi8zMTM3KQotCTAwMDIgIDE2LzQgVG9rZW4gUmluZwotCTAwMDQgIFJhcGlkRmlyZSAzMTM5IFRva2VuLVJpbmcgMTYvNCBQQ0kgQWRhcHRlcgotCQkxMDhkIDAwMDQgIE9DLTMxMzkvMzE0MCBSYXBpZEZpcmUgVG9rZW4tUmluZyAxNi80IEFkYXB0ZXIKLQkwMDA1ICBHb0NhcmQgMzI1MCBUb2tlbi1SaW5nIDE2LzQgQ2FyZEJ1cyBQQyBDYXJkCi0JMDAwNiAgT0MtMzUzMCBSYXBpZEZpcmUgVG9rZW4tUmluZyAxMDAKLQkwMDA3ICBSYXBpZEZpcmUgMzE0MSBUb2tlbi1SaW5nIDE2LzQgUENJIEZpYmVyIEFkYXB0ZXIKLQkJMTA4ZCAwMDA3ICBPQy0zMTQxIFJhcGlkRmlyZSBUb2tlbi1SaW5nIDE2LzQgQWRhcHRlcgotCTAwMDggIFJhcGlkRmlyZSAzNTQwIEhTVFIgMTAwLzE2LzQgUENJIEFkYXB0ZXIKLQkJMTA4ZCAwMDA4ICBPQy0zNTQwIFJhcGlkRmlyZSBIU1RSIDEwMC8xNi80IEFkYXB0ZXIKLQkwMDExICBPQy0yMzE1Ci0JMDAxMiAgT0MtMjMyNQotCTAwMTMgIE9DLTIxODMvMjE4NQotCTAwMTQgIE9DLTIzMjYKLQkwMDE5ICBPQy0yMzI3LzIyNTAgMTAvMTAwIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA4ZCAwMDE2ICBPQy0yMzI3IFJhcGlkZmlyZSAxMC8xMDAgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDhkIDAwMTcgIE9DLTIyNTAgR29DYXJkIDEwLzEwMCBFdGhlcm5ldCBBZGFwdGVyCi0JMDAyMSAgT0MtNjE1MS82MTUyIFtSYXBpZEZpcmUgQVRNIDE1NV0KLQkwMDIyICBBVE0gQWRhcHRlcgotMTA4ZSAgU3VuIE1pY3Jvc3lzdGVtcyBDb21wdXRlciBDb3JwLgotCTAwMDEgIEVCVVMKLQkxMDAwICBFQlVTCi0JMTAwMSAgSGFwcHkgTWVhbAotCTExMDAgIFJJTyBFQlVTCi0JMTEwMSAgUklPIEdFTQotCTExMDIgIFJJTyAxMzk0Ci0JMTEwMyAgUklPIFVTQgotCTE2NDggIFtiZ2VdIEdpZ2FiaXQgRXRoZXJuZXQKLQkyYmFkICBHRU0KLQk1MDAwICBTaW1iYSBBZHZhbmNlZCBQQ0kgQnJpZGdlCi0JNTA0MyAgU3VuUENJIENvLXByb2Nlc3NvcgotCTgwMDAgIFBzeWNobyBQQ0kgQnVzIE1vZHVsZQotCTgwMDEgIFNjaGl6byBQQ0kgQnVzIE1vZHVsZQotCTgwMDIgIFNjaGl6bysgUENJIEJ1cyBNb2R1bGUKLQlhMDAwICBVbHRyYSBJSWkKLQlhMDAxICBVbHRyYSBJSWUKLQlhODAxICBUb21hdGlsbG8gUENJIEJ1cyBNb2R1bGUKLQlhYmJhICBDYXNzaW5pIDEwLzEwMC8xMDAwCi0xMDhmICBTeXN0ZW1zb2Z0Ci0xMDkwICBFbmNvcmUgQ29tcHV0ZXIgQ29ycG9yYXRpb24KLTEwOTEgIEludGVyZ3JhcGggQ29ycG9yYXRpb24KLQkwMDIwICAzRCBncmFwaGljcyBwcm9jZXNzb3IKLQkwMDIxICAzRCBncmFwaGljcyBwcm9jZXNzb3Igdy9UZXh0dXJpbmcKLQkwMDQwICAzRCBncmFwaGljcyBmcmFtZSBidWZmZXIKLQkwMDQxICAzRCBncmFwaGljcyBmcmFtZSBidWZmZXIKLQkwMDYwICBQcm9wcmlldGFyeSBidXMgYnJpZGdlCi0JMDBlNCAgUG93ZXJzdG9ybSA0RDUwVAotCTA3MjAgIE1vdGlvbiBKUEVHIGNvZGVjCi0JMDdhMCAgU3VuIEV4cGVydDNELUxpdGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQkxMDkxICBTdW4gRXhwZXJ0M0QgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLTEwOTIgIERpYW1vbmQgTXVsdGltZWRpYSBTeXN0ZW1zCi0JMDBhMCAgU3BlZWRzdGFyIFBybyBTRQotCTAwYTggIFNwZWVkc3RhciA2NAotCTA1NTAgIFZpcGVyIFY1NTAKLQkwOGQ0ICBTdXByYSAyMjYwIE1vZGVtCi0JMDk0YyAgU3VwcmFFeHByZXNzIDU2aSBQcm8KLQkxMDkyICBWaXBlciBWMzMwCi0JNjEyMCAgTWF4aW11bSBEVkQKLQk4ODEwICBTdGVhbHRoIFNFCi0JODgxMSAgU3RlYWx0aCA2NC9TRQotCTg4ODAgIFN0ZWFsdGgKLQk4ODgxICBTdGVhbHRoCi0JODhiMCAgU3RlYWx0aCA2NAotCTg4YjEgIFN0ZWFsdGggNjQKLQk4OGMwICBTdGVhbHRoIDY0Ci0JODhjMSAgU3RlYWx0aCA2NAotCTg4ZDAgIFN0ZWFsdGggNjQKLQk4OGQxICBTdGVhbHRoIDY0Ci0JODhmMCAgU3RlYWx0aCA2NAotCTg4ZjEgIFN0ZWFsdGggNjQKLQk5OTk5ICBETUQtSTA5MjgtMSAiTW9uc3RlciBzb3VuZCIgc291bmQgY2hpcAotMTA5MyAgTmF0aW9uYWwgSW5zdHJ1bWVudHMKLQkwMTYwICBQQ0ktRElPLTk2Ci0JMDE2MiAgUENJLU1JTy0xNlhFLTUwCi0JMTE3MCAgUENJLU1JTy0xNlhFLTEwCi0JMTE4MCAgUENJLU1JTy0xNkUtMQotCTExOTAgIFBDSS1NSU8tMTZFLTQKLQkxMzEwICBQQ0ktNjYwMgotCTEzMzAgIFBDSS02MDMxRQotCTEzNTAgIFBDSS02MDcxRQotCTE0ZTAgIFBDSS02MTEwCi0JMTRmMCAgUENJLTYxMTEKLQkxN2QwICBQQ0ktNjUwMwotCTE4NzAgIFBDSS02NzEzCi0JMTg4MCAgUENJLTY3MTEKLQkxOGIwICBQQ0ktNjA1MkUKLQkyNDEwICBQQ0ktNjczMwotCTI4OTAgIFBDSS02MDM2RQotCTJhNjAgIFBDSS02MDIzRQotCTJhNzAgIFBDSS02MDI0RQotCTJhODAgIFBDSS02MDI1RQotCTJjODAgIFBDSS02MDM1RQotCTJjYTAgIFBDSS02MDM0RQotCTcwYjggIFBDSS02MjUxIFtNIFNlcmllcyAtIEhpZ2ggU3BlZWQgTXVsdGlmdW5jdGlvbiBEQVFdCi0JYjAwMSAgSU1BUS1QQ0ktMTQwOAotCWIwMTEgIElNQVEtUFhJLTE0MDgKLQliMDIxICBJTUFRLVBDSS0xNDI0Ci0JYjAzMSAgSU1BUS1QQ0ktMTQxMwotCWIwNDEgIElNQVEtUENJLTE0MDcKLQliMDUxICBJTUFRLVBYSS0xNDA3Ci0JYjA2MSAgSU1BUS1QQ0ktMTQxMQotCWIwNzEgIElNQVEtUENJLTE0MjIKLQliMDgxICBJTUFRLVBYSS0xNDIyCi0JYjA5MSAgSU1BUS1QWEktMTQxMQotCWM4MDEgIFBDSS1HUElCCi0JYzgzMSAgUENJLUdQSUIgYnJpZGdlCi0xMDk0ICBGaXJzdCBJbnRlcm5hdGlvbmFsIENvbXB1dGVycyBbRklDXQotMTA5NSAgU2lsaWNvbiBJbWFnZSwgSW5jLiAoZm9ybWVybHkgQ01EIFRlY2hub2xvZ3kgSW5jKQotCTAyNDAgIEFkYXB0ZWMgQUFSLTEyMTBTQSBTQVRBIEhvc3RSQUlEIENvbnRyb2xsZXIKLQkwNjQwICBQQ0kwNjQwCi0JMDY0MyAgUENJMDY0MwotCTA2NDYgIFBDSTA2NDYKLQkwNjQ3ICBQQ0kwNjQ3Ci0JMDY0OCAgUENJMDY0OAotCTA2NDkgIFNpSSAwNjQ5IFVsdHJhIEFUQS8xMDAgUENJIHRvIEFUQSBIb3N0IENvbnRyb2xsZXIKLQkJMGUxMSAwMDVkICBJbnRlZ3JhdGVkIFVsdHJhIEFUQS0xMDAgRHVhbCBDaGFubmVsIENvbnRyb2xsZXIKLQkJMGUxMSAwMDdlICBJbnRlZ3JhdGVkIFVsdHJhIEFUQS0xMDAgSURFIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA2NDkgIEFNSSBNZWdhUkFJRCBJREUgMTAwIENvbnRyb2xsZXIKLQkwNjUwICBQQkMwNjUwQQotCTA2NzAgIFVTQjA2NzAKLQkJMTA5NSAwNjcwICBVU0IwNjcwCi0JMDY3MyAgVVNCMDY3MwotCTA2ODAgIFBDSTA2ODAgVWx0cmEgQVRBLTEzMyBIb3N0IENvbnRyb2xsZXIKLQkJMTA5NSAzNjgwICBXaW5pYyBXLTY4MCAoU2lsaWNvbiBJbWFnZSA2ODAgYmFzZWQpCi0JMzExMiAgU2lJIDMxMTIgW1NBVEFMaW5rL1NBVEFSYWlkXSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkJMTA5NSAzMTEyICBTaUkgMzExMiBTQVRBTGluayBDb250cm9sbGVyCi0JCTEwOTUgNjExMiAgU2lJIDMxMTIgU0FUQVJhaWQgQ29udHJvbGxlcgotCTMxMTQgIFNpSSAzMTE0IFtTQVRBTGluay9TQVRBUmFpZF0gU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JCTEwOTUgMzExNCAgU2lJIDMxMTQgU0FUQUxpbmsgQ29udHJvbGxlcgotCQkxMDk1IDYxMTQgIFNpSSAzMTE0IFNBVEFSYWlkIENvbnRyb2xsZXIKLQkzMTI0ICBTaUkgMzEyNCBQQ0ktWCBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkJMTA5NSAzMTI0ICBTaUkgMzEyNCBQQ0ktWCBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkzNTEyICBTaUkgMzUxMiBbU0FUQUxpbmsvU0FUQVJhaWRdIFNlcmlhbCBBVEEgQ29udHJvbGxlcgotCQkxMDk1IDM1MTIgIFNpSSAzNTEyIFNBVEFMaW5rIENvbnRyb2xsZXIKLQkJMTA5NSA2NTEyICBTaUkgMzUxMiBTQVRBUmFpZCBDb250cm9sbGVyCi0xMDk2ICBBbGFjcm9uCi0xMDk3ICBBcHBpYW4gVGVjaG5vbG9neQotMTA5OCAgUXVhbnR1bSBEZXNpZ25zIChILksuKSBMdGQKLQkwMDAxICBRRC04NTAwCi0JMDAwMiAgUUQtODU4MAotMTA5OSAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAotMTA5YSAgUGFja2FyZCBCZWxsCi0xMDliICBHZW1saWdodCBDb21wdXRlciBMdGQuCi0xMDljICBNZWdhY2hpcHMgQ29ycG9yYXRpb24KLTEwOWQgIFppZGEgVGVjaG5vbG9naWVzIEx0ZC4KLTEwOWUgIEJyb29rdHJlZSBDb3Jwb3JhdGlvbgotCTAzNTAgIEJ0ODQ4IFZpZGVvIENhcHR1cmUKLQkwMzUxICBCdDg0OUEgVmlkZW8gY2FwdHVyZQotCTAzNjkgIEJ0ODc4IFZpZGVvIENhcHR1cmUKLQkJMTAwMiAwMDAxICBUVi1Xb25kZXIKLQkJMTAwMiAwMDAzICBUVi1Xb25kZXIvVkUKLQkwMzZjICBCdDg3OSg/PykgVmlkZW8gQ2FwdHVyZQotCQkxM2U5IDAwNzAgIFdpbi9UViAoVmlkZW8gU2VjdGlvbikKLQkwMzZlICBCdDg3OCBWaWRlbyBDYXB0dXJlCi0JCTAwNzAgMTNlYiAgV2luVFYgU2VyaWVzCi0JCTAwNzAgZmYwMSAgVmlld2Nhc3QgT3NwcmV5IDIwMAotCQkwMDcxIDAxMDEgIERpZ2lUViBQQ0kKLQkJMTA3ZCA2NjA2ICBXaW5GYXN0IFRWIDIwMDAKLQkJMTFiZCAwMDEyICBQQ1RWIHBybyAoVFYgKyBGTSBzdGVyZW8gcmVjZWl2ZXIpCi0JCTExYmQgMDAxYyAgUENUViBTYXQgKERCQyByZWNlaXZlcikKLQkJMTI3YSAwMDAxICBCdDg3OCBNZWRpYXN0cmVhbSBDb250cm9sbGVyIE5UU0MKLQkJMTI3YSAwMDAyICBCdDg3OCBNZWRpYXN0cmVhbSBDb250cm9sbGVyIFBBTCBCRwotCQkxMjdhIDAwMDMgIEJ0ODc4YSBNZWRpYXN0cmVhbSBDb250cm9sbGVyIFBBTCBCRwotCQkxMjdhIDAwNDggIEJ0ODc4LzgzMiBNZWRpYXN0cmVhbSBDb250cm9sbGVyCi0JCTE0NGYgMzAwMCAgTWFnaWNUVmlldyBDUEgwNjAgLSBWaWRlbwotCQkxNDYxIDAwMDIgIFRWOTggU2VyaWVzIChUVi9ObyBGTS9SZW1vdGUpCi0JCTE0NjEgMDAwMyAgQXZlck1lZGlhIFVsdHJhVFYgUENJIDM1MAotCQkxNDYxIDAwMDQgIEFWZXJUViBXRE0gVmlkZW8gQ2FwdHVyZQotCQkxNDYxIDA3NjEgIEF2ZXJUViBEVkItVAotCQkxNGYxIDAwMDEgIEJ0ODc4IE1lZGlhc3RyZWFtIENvbnRyb2xsZXIgTlRTQwotCQkxNGYxIDAwMDIgIEJ0ODc4IE1lZGlhc3RyZWFtIENvbnRyb2xsZXIgUEFMIEJHCi0JCTE0ZjEgMDAwMyAgQnQ4NzhhIE1lZGlhc3RyZWFtIENvbnRyb2xsZXIgUEFMIEJHCi0JCTE0ZjEgMDA0OCAgQnQ4NzgvODMyIE1lZGlhc3RyZWFtIENvbnRyb2xsZXIKLQkJMTgyMiAwMDAxICBWaXNpb25QbHVzIERWQiBjYXJkCi0JCTE4NTEgMTg1MCAgRmx5VmlkZW8nOTggLSBWaWRlbwotCQkxODUxIDE4NTEgIEZseVZpZGVvIElJCi0JCTE4NTIgMTg1MiAgRmx5VmlkZW8nOTggLSBWaWRlbyAod2l0aCBGTSBUdW5lcikKLQkJMjcwZiBmYzAwICBEaWdpdG9wIERUVC0xMDAwCi0JCWJkMTEgMTIwMCAgUENUViBwcm8gKFRWICsgRk0gc3RlcmVvIHJlY2VpdmVyKQotCTAzNmYgIEJ0ODc5IFZpZGVvIENhcHR1cmUKLQkJMTI3YSAwMDQ0ICBCdDg3OSBWaWRlbyBDYXB0dXJlIE5UU0MKLQkJMTI3YSAwMTIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIFBBTCBJCi0JCTEyN2EgMDE0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMDIyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBQQUwgQkcKLQkJMTI3YSAwMjQ0ICBCdDg3OWEgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMDMyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMDQyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMTEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBQQUwgSQotCQkxMjdhIDEyMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgUEFMIEJHCi0JCTEyN2EgMTMyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTEyN2EgMTUyMiAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgUEFMIEkKLQkJMTI3YSAxNjIyICBCdDg3OWEgVmlkZW8gQ2FwdHVyZSBQQUwgQkcKLQkJMTI3YSAxNzIyICBCdDg3OWEgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTE0ZjEgMDA0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBOVFNDCi0JCTE0ZjEgMDEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSBQQUwgSQotCQkxNGYxIDAxNDQgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDAyMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgUEFMIEJHCi0JCTE0ZjEgMDI0NCAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDAzMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDA0MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDExMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgUEFMIEkKLQkJMTRmMSAxMjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIFBBTCBCRwotCQkxNGYxIDEzMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgTlRTQwotCQkxNGYxIDE1MjIgIEJ0ODc5YSBWaWRlbyBDYXB0dXJlIFBBTCBJCi0JCTE0ZjEgMTYyMiAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgUEFMIEJHCi0JCTE0ZjEgMTcyMiAgQnQ4NzlhIFZpZGVvIENhcHR1cmUgTlRTQwotCQkxODUxIDE4NTAgIEZseVZpZGVvJzk4IC0gVmlkZW8KLQkJMTg1MSAxODUxICBGbHlWaWRlbyBJSQotCQkxODUyIDE4NTIgIEZseVZpZGVvJzk4IC0gVmlkZW8gKHdpdGggRk0gVHVuZXIpCi0JMDM3MCAgQnQ4ODAgVmlkZW8gQ2FwdHVyZQotCQkxODUxIDE4NTAgIEZseVZpZGVvJzk4Ci0JCTE4NTEgMTg1MSAgRmx5VmlkZW8nOTggRVogLSB2aWRlbwotCQkxODUyIDE4NTIgIEZseVZpZGVvJzk4ICh3aXRoIEZNIFR1bmVyKQotCTA4NzggIEJ0ODc4IEF1ZGlvIENhcHR1cmUKLQkJMDA3MCAxM2ViICBXaW5UViBTZXJpZXMKLQkJMDA3MCBmZjAxICBWaWV3Y2FzdCBPc3ByZXkgMjAwCi0JCTAwNzEgMDEwMSAgRGlnaVRWIFBDSQotCQkxMDAyIDAwMDEgIFRWLVdvbmRlcgotCQkxMDAyIDAwMDMgIFRWLVdvbmRlci9WRQotCQkxMWJkIDAwMTIgIFBDVFYgcHJvIChUViArIEZNIHN0ZXJlbyByZWNlaXZlciwgYXVkaW8gc2VjdGlvbikKLQkJMTFiZCAwMDFjICBQQ1RWIFNhdCAoREJDIHJlY2VpdmVyKQotCQkxMjdhIDAwMDEgIEJ0ODc4IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMDAwMiAgQnQ4NzggVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAwMDAzICBCdDg3OCBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDAwNDggIEJ0ODc4IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEzZTkgMDA3MCAgV2luL1RWIChBdWRpbyBTZWN0aW9uKQotCQkxNDRmIDMwMDAgIE1hZ2ljVFZpZXcgQ1BIMDYwIC0gQXVkaW8KLQkJMTQ2MSAwMDA0ICBBVmVyVFYgV0RNIEF1ZGlvIENhcHR1cmUKLQkJMTQ2MSAwNzYxICBBVmVyVFYgRFZCLVQKLQkJMTRmMSAwMDAxICBCdDg3OCBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDAwMDIgIEJ0ODc4IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMDAwMyAgQnQ4NzggVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAwMDQ4ICBCdDg3OCBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxODIyIDAwMDEgIFZpc2lvblBsdXMgRFZCIENhcmQKLQkJMjcwZiBmYzAwICBEaWdpdG9wIERUVC0xMDAwCi0JCWJkMTEgMTIwMCAgUENUViBwcm8gKFRWICsgRk0gc3RlcmVvIHJlY2VpdmVyLCBhdWRpbyBzZWN0aW9uKQotCTA4NzkgIEJ0ODc5IEF1ZGlvIENhcHR1cmUKLQkJMTI3YSAwMDQ0ICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDAxMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMDE0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAwMjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDAyNDQgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMDMyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAwNDIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDExMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMTIyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAxMzIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxMjdhIDE1MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTEyN2EgMTYyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTI3YSAxNzIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDAwNDQgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMDEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAwMTQ0ICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDAyMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMDI0NCAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAwMzIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDA0MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMTEyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAxMjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDEzMjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JCTE0ZjEgMTUyMiAgQnQ4NzkgVmlkZW8gQ2FwdHVyZSAoQXVkaW8gU2VjdGlvbikKLQkJMTRmMSAxNjIyICBCdDg3OSBWaWRlbyBDYXB0dXJlIChBdWRpbyBTZWN0aW9uKQotCQkxNGYxIDE3MjIgIEJ0ODc5IFZpZGVvIENhcHR1cmUgKEF1ZGlvIFNlY3Rpb24pCi0JMDg4MCAgQnQ4ODAgQXVkaW8gQ2FwdHVyZQotCTIxMTUgIEJ0ViAyMTE1IE1lZGlhc3RyZWFtIGNvbnRyb2xsZXIKLQkyMTI1ICBCdFYgMjEyNSBNZWRpYXN0cmVhbSBjb250cm9sbGVyCi0JMjE2NCAgQnRWIDIxNjQKLQkyMTY1ICBCdFYgMjE2NQotCTgyMzAgIEJ0ODIzMCBBVE0gU2VnbWVudC9SZWFzc2VtYmx5IEN0cmxyIChTUkMpCi0JODQ3MiAgQnQ4NDcyCi0JODQ3NCAgQnQ4NDc0Ci0xMDlmICBUcmlnZW0gQ29tcHV0ZXIgSW5jLgotMTBhMCAgTWVpZGVuc2hhIENvcnBvcmF0aW9uCi0xMGExICBKdWtvIEVsZWN0cm9uaWNzIEluZC4gQ28uIEx0ZAotMTBhMiAgUXVhbnR1bSBDb3Jwb3JhdGlvbgotMTBhMyAgRXZlcmV4IFN5c3RlbXMgSW5jCi0xMGE0ICBHbG9iZSBNYW51ZmFjdHVyaW5nIFNhbGVzCi0xMGE1ICBTbWFydCBMaW5rIEx0ZC4KLQkzMDUyICBTbWFydFBDSTU2MiA1NksgTW9kZW0KLQk1NDQ5ICBTbWFydFBDSTU2MSBtb2RlbQotMTBhNiAgSW5mb3JtdGVjaCBJbmR1c3RyaWFsIEx0ZC4KLTEwYTcgIEJlbmNobWFycSBNaWNyb2VsZWN0cm9uaWNzCi0xMGE4ICBTaWVycmEgU2VtaWNvbmR1Y3RvcgotCTAwMDAgIFNUQiBIb3Jpem9uIDY0Ci0xMGE5ICBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0JMDAwMSAgQ3Jvc3N0YWxrIHRvIFBDSSBCcmlkZ2UKLQkwMDAyICBMaW5jIEkvTyBjb250cm9sbGVyCi0JMDAwMyAgSU9DMyBJL08gY29udHJvbGxlcgotCTAwMDQgIE8yIE1BQ0UKLQkwMDA1ICBSQUQgQXVkaW8KLQkwMDA2ICBIUENFWAotCTAwMDcgIFJQQ0VYCi0JMDAwOCAgRGlWTyBWSVAKLQkwMDA5ICBBY2VOSUMgR2lnYWJpdCBFdGhlcm5ldAotCQkxMGE5IDgwMDIgIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0Ci0JMDAxMCAgQU1QIFZpZGVvIEkvTwotCTAwMTEgIEdSSVAKLQkwMDEyICBTR0ggUFNIQUMgR1NOCi0JMTAwMSAgTWFnaWMgQ2FycGV0Ci0JMTAwMiAgTGl0aGl1bQotCTEwMDMgIER1YWwgSlBFRyAxCi0JMTAwNCAgRHVhbCBKUEVHIDIKLQkxMDA1ICBEdWFsIEpQRUcgMwotCTEwMDYgIER1YWwgSlBFRyA0Ci0JMTAwNyAgRHVhbCBKUEVHIDUKLQkxMDA4ICBDZXNpdW0KLQkxMDBhICBJT0M0IEkvTyBjb250cm9sbGVyCi0JMjAwMSAgRmlicmUgQ2hhbm5lbAotCTIwMDIgIEFTREUKLQk4MDAxICBPMiAxMzk0Ci0JODAwMiAgRy1uZXQgTlQKLTEwYWEgIEFDQyBNaWNyb2VsZWN0cm9uaWNzCi0JMDAwMCAgQUNDTSAyMTg4Ci0xMGFiICBEaWdpY29tCi0xMGFjICBIb25leXdlbGwgSUFDCi0xMGFkICBTeW1waG9ueSBMYWJzCi0JMDAwMSAgVzgzNzY5RgotCTAwMDMgIFNMODJDMTAzCi0JMDAwNSAgU0w4MkMxMDUKLQkwMTAzICBTTDgyYzEwMwotCTAxMDUgIFNMODJjMTA1Ci0JMDU2NSAgVzgzQzU1MwotMTBhZSAgQ29ybmVyc3RvbmUgVGVjaG5vbG9neQotMTBhZiAgTWljcm8gQ29tcHV0ZXIgU3lzdGVtcyBJbmMKLTEwYjAgIENhcmRFeHBlcnQgVGVjaG5vbG9neQotMTBiMSAgQ2FibGV0cm9uIFN5c3RlbXMgSW5jCi0xMGIyICBSYXl0aGVvbiBDb21wYW55Ci0xMGIzICBEYXRhYm9vayBJbmMKLQkzMTA2ICBEQjg3MTQ0Ci0JYjEwNiAgREI4NzE0NAotMTBiNCAgU1RCIFN5c3RlbXMgSW5jCi0JMWIxZCAgVmVsb2NpdHkgMTI4IDNECi0JCTEwYjQgMjM3ZSAgVmVsb2NpdHkgNDQwMAotMTBiNSAgUExYIFRlY2hub2xvZ3ksIEluYy4KLQkwMDAxICBpOTYwIFBDSSBidXMgaW50ZXJmYWNlCi0JMTA3NiAgVlNjb20gODAwIDggcG9ydCBzZXJpYWwgYWRhcHRvcgotCTEwNzcgIFZTY29tIDQwMCA0IHBvcnQgc2VyaWFsIGFkYXB0b3IKLQkxMDc4ICBWU2NvbSAyMTAgMiBwb3J0IHNlcmlhbCBhbmQgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQkxMTAzICBWU2NvbSAyMDAgMiBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JMTE0NiAgVlNjb20gMDEwIDEgcG9ydCBwYXJhbGxlbCBhZGFwdG9yCi0JMTE0NyAgVlNjb20gMDIwIDIgcG9ydCBwYXJhbGxlbCBhZGFwdG9yCi0JMjcyNCAgVGhhbGVzIFBDU00gU2VjdXJpdHkgQ2FyZAotCTg1MTYgIFBFWCA4NTE2ICBWZXJzYXRpbGUgUENJIEV4cHJlc3MgU3dpdGNoCi0JODUzMiAgUEVYIDg1MzIgIFZlcnNhdGlsZSBQQ0kgRXhwcmVzcyBTd2l0Y2gKLQk5MDMwICBQQ0kgPC0+IElPQnVzIEJyaWRnZSBIb3QgU3dhcAotCQkxMGI1IDI4NjIgIEFscGVybWFubitWZWx0ZSBQQ0wgUENJIExWICgzVi81Vik6IFRpbWVjb2RlIFJlYWRlciBCb2FyZAotCQkxMGI1IDI5MDYgIEFscGVybWFubitWZWx0ZSBQQ0kgVFMgKDNWLzVWKTogVGltZSBTeW5jaHJvbmlzYXRpb24gQm9hcmQKLQkJMTBiNSAyOTQwICBBbHBlcm1hbm4rVmVsdGUgUENMIFBDSSBEICgzVi81Vik6IFRpbWVjb2RlIFJlYWRlciBCb2FyZAotCQkxMGI1IDMwMjUgIEFscGVybWFubitWZWx0ZSBQQ0wgUENJIEwgKDNWLzVWKTogVGltZWNvZGUgUmVhZGVyIEJvYXJkCi0JCTEwYjUgMzA2OCAgQWxwZXJtYW5uK1ZlbHRlIFBDTCBQQ0kgSEQgKDNWLzVWKTogVGltZWNvZGUgUmVhZGVyIEJvYXJkCi0JCTE1ZWQgMTAwMiAgTUNDUyA4LXBvcnQgU2VyaWFsIEhvdCBTd2FwCi0JCTE1ZWQgMTAwMyAgTUNDUyAxNi1wb3J0IFNlcmlhbCBIb3QgU3dhcAotCTkwMzYgIDkwMzYKLQk5MDUwICBQQ0kgPC0+IElPQnVzIEJyaWRnZQotCQkxMGI1IDEwNjcgIElYWEFUIENBTiBpMTY1Ci0JCTEwYjUgMTE3MiAgSUsyMjAgKEhlaWRlbmhhaW4pCi0JCTEwYjUgMjAzNiAgU2F0UGFrIEdQUwotCQkxMGI1IDIyMjEgIEFscGVybWFubitWZWx0ZSBQQ0wgUENJIExWOiBUaW1lY29kZSBSZWFkZXIgQm9hcmQKLQkJMTBiNSAyMjczICBTSC1BUkMgU29IYXJkIEFSQ25ldCBjYXJkCi0JCTEwYjUgMjQzMSAgQWxwZXJtYW5uK1ZlbHRlIFBDTCBQQ0kgRDogVGltZWNvZGUgUmVhZGVyIEJvYXJkCi0JCTEwYjUgMjkwNSAgQWxwZXJtYW5uK1ZlbHRlIFBDSSBUUzogVGltZSBTeW5jaHJvbmlzYXRpb24gQm9hcmQKLQkJMTBiNSA5MDUwICBNUDkwNTAKLQkJMTQ5OCAwMzYyICBUUE1DODY2IDggQ2hhbm5lbCBTZXJpYWwgQ2FyZAotCQkxNTIyIDAwMDEgIFJvY2tGb3JjZSA0IFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMDIgIFJvY2tGb3JjZSAyIFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMDMgIFJvY2tGb3JjZSA2IFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMDQgIFJvY2tGb3JjZSA4IFBvcnQgVi45MCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDAwMTAgIFJvY2tGb3JjZTIwMDAgNCBQb3J0IFYuOTAgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTUyMiAwMDIwICBSb2NrRm9yY2UyMDAwIDIgUG9ydCBWLjkwIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JCTE1ZWQgMTAwMCAgTWFjcm9saW5rIE1DQ1MgOC1wb3J0IFNlcmlhbAotCQkxNWVkIDEwMDEgIE1hY3JvbGluayBNQ0NTIDE2LXBvcnQgU2VyaWFsCi0JCTE1ZWQgMTAwMiAgTWFjcm9saW5rIE1DQ1MgOC1wb3J0IFNlcmlhbCBIb3QgU3dhcAotCQkxNWVkIDEwMDMgIE1hY3JvbGluayBNQ0NTIDE2LXBvcnQgU2VyaWFsIEhvdCBTd2FwCi0jIFNvcnJ5LCB0aGVyZSB3YXMgYSB0eXBvCi0JCTU2NTQgMjAzNiAgT3BlblN3aXRjaCA2IFRlbGVwaG9ueSBjYXJkCi0jIFNvcnJ5LCB0aGVyZSB3YXMgYSB0eXBvCi0JCTU2NTQgMzEzMiAgT3BlblN3aXRjaCAxMiBUZWxlcGhvbnkgY2FyZAotCQk1NjU0IDU2MzQgIE9wZW5MaW5lNCBUZWxlcGhvbnkgQ2FyZAotCQlkNTMxIGMwMDIgIFBDSW50ZWxsaUNBTiAyeFNKQTEwMDAgQ0FOIGJ1cwotCQlkODRkIDQwMDYgIEVYLTQwMDYgMVAKLQkJZDg0ZCA0MDA4ICBFWC00MDA4IDFQIEVQUC9FQ1AKLQkJZDg0ZCA0MDE0ICBFWC00MDE0IDJQCi0JCWQ4NGQgNDAxOCAgRVgtNDAxOCAzUCBFUFAvRUNQCi0JCWQ4NGQgNDAyNSAgRVgtNDAyNSAxUygxNkM1NTApIFJTLTIzMgotCQlkODRkIDQwMjcgIEVYLTQwMjcgMVMoMTZDNjUwKSBSUy0yMzIKLQkJZDg0ZCA0MDI4ICBFWC00MDI4IDFTKDE2Qzg1MCkgUlMtMjMyCi0JCWQ4NGQgNDAzNiAgRVgtNDAzNiAyUygxNkM2NTApIFJTLTIzMgotCQlkODRkIDQwMzcgIEVYLTQwMzcgMlMoMTZDNjUwKSBSUy0yMzIKLQkJZDg0ZCA0MDM4ICBFWC00MDM4IDJTKDE2Qzg1MCkgUlMtMjMyCi0JCWQ4NGQgNDA1MiAgRVgtNDA1MiAxUygxNkM1NTApIFJTLTQyMi80ODUKLQkJZDg0ZCA0MDUzICBFWC00MDUzIDJTKDE2QzU1MCkgUlMtNDIyLzQ4NQotCQlkODRkIDQwNTUgIEVYLTQwNTUgNFMoMTZDNTUwKSBSUy0yMzIKLQkJZDg0ZCA0MDU4ICBFWC00MDU1IDRTKDE2QzY1MCkgUlMtMjMyCi0JCWQ4NGQgNDA2NSAgRVgtNDA2NSA4UygxNkM1NTApIFJTLTIzMgotCQlkODRkIDQwNjggIEVYLTQwNjggOFMoMTZDNjUwKSBSUy0yMzIKLQkJZDg0ZCA0MDc4ICBFWC00MDc4IDJTKDE2QzU1MikgUlMtMjMyKzFQCi0JOTA1NCAgUENJIDwtPiBJT0J1cyBCcmlkZ2UKLQkJMTBiNSAyNDU1ICBXZXNzZXggVGVjaG9sb2d5IFBISUwtUENJCi0JCTEwYjUgMjY5NiAgSW5uZXMgQ29ycCBBTSBSYWRjYXAgY2FyZAotCQkxMGI1IDI3MTcgIElubmVzIENvcnAgQXVyaWNvbiBjYXJkCi0JCTEwYjUgMjg0NCAgSW5uZXMgQ29ycCBUVlMgRW5jb2RlciBjYXJkCi0JCTEyZDkgMDAwMiAgUENJIFByb3NvZHkgQ2FyZCByZXYgMS41Ci0JCTE2ZGYgMDAxMSAgUElLQSBQcmltZU5ldCBNTSBQQ0kKLQkJMTZkZiAwMDEyICBQSUtBIFByaW1lTmV0IE1NIGNQQ0kgOAotCQkxNmRmIDAwMTMgIFBJS0EgUHJpbWVOZXQgTU0gY1BDSSA4ICh3aXRob3V0IENBUyBTaWduYWxpbmcgT3B0aW9uKQotCQkxNmRmIDAwMTQgIFBJS0EgUHJpbWVOZXQgTU0gY1BDSSA0Ci0JCTE2ZGYgMDAxNSAgUElLQSBEYXl0b25hIE1NCi0JCTE2ZGYgMDAxNiAgUElLQSBJbkxpbmUgTU0KLQk5MDU2ICBGcmFuY29pcwotCQkxMGI1IDI5NzkgIENlbGxpbmtCbGFkZSAxMSAtIENQQ0kgYm9hcmQgVm9BVE0gQUFMMQotCTkwNjAgIDkwNjAKLQk5MDZkICA5MDYwU0QKLQkJMTI1YyAwNjQwICBBcmllcyAxNjAwMFAKLQk5MDZlICA5MDYwRVMKLQk5MDgwICA5MDgwCi0JCTEwM2MgMTBlYiAgKEFnaWxlbnQpIEUyNzc3QiA4M0sgU2VyaWVzIFBDSSBiYXNlZCBPcHRpY2FsIENvbW11bmljYXRpb24gSW50ZXJmYWNlCi0JCTEwM2MgMTBlYyAgKEFnaWxlbnQpIEU2OTc4LTY2NDQyIFBDSSBDSUMKLQkJMTBiNSA5MDgwICA5MDgwIFtyZWFsIHN1YnN5c3RlbSBJRCBub3Qgc2V0XQotCQkxMjlkIDAwMDIgIEFjdWxhYiBQQ0kgUHJvc2lkeSBjYXJkCi0JCTEyZDkgMDAwMiAgUENJIFByb3NvZHkgQ2FyZAotCQkxMmRmIDQ0MjIgIDQ0MjJQQ0kgWyJEby1BbGwiIFRlbGVtZXRyeSBEYXRhIEFxdWlzaXRpb24gU3lzdGVtXQotCWJiMDQgIEImQiAzUENJT1NEMUEgSXNvbGF0ZWQgUENJIFNlcmlhbAotMTBiNiAgTWFkZ2UgTmV0d29ya3MKLQkwMDAxICBTbWFydCAxNi80IFBDSSBSaW5nbm9kZQotCTAwMDIgIFNtYXJ0IDE2LzQgUENJIFJpbmdub2RlIE1rMgotCQkxMGI2IDAwMDIgIFNtYXJ0IDE2LzQgUENJIFJpbmdub2RlIE1rMgotCQkxMGI2IDAwMDYgIDE2LzQgQ2FyZEJ1cyBBZGFwdGVyCi0JMDAwMyAgU21hcnQgMTYvNCBQQ0kgUmluZ25vZGUgTWszCi0JCTBlMTEgYjBmZCAgQ29tcGFxIE5DNDYyMSBQQ0ksIDQvMTYsIFdPTAotCQkxMGI2IDAwMDMgIFNtYXJ0IDE2LzQgUENJIFJpbmdub2RlIE1rMwotCQkxMGI2IDAwMDcgIFByZXN0byBQQ0kgUGx1cyBBZGFwdGVyCi0JMDAwNCAgU21hcnQgMTYvNCBQQ0kgUmluZ25vZGUgTWsxCi0JMDAwNiAgMTYvNCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTBiNiAwMDA2ICAxNi80IENhcmRCdXMgQWRhcHRlcgotCTAwMDcgIFByZXN0byBQQ0kgQWRhcHRlcgotCQkxMGI2IDAwMDcgIFByZXN0byBQQ0kKLQkwMDA5ICBTbWFydCAxMDAvMTYvNCBQQ0ktSFMgUmluZ25vZGUKLQkJMTBiNiAwMDA5ICBTbWFydCAxMDAvMTYvNCBQQ0ktSFMgUmluZ25vZGUKLQkwMDBhICBTbWFydCAxMDAvMTYvNCBQQ0kgUmluZ25vZGUKLQkJMTBiNiAwMDBhICBTbWFydCAxMDAvMTYvNCBQQ0kgUmluZ25vZGUKLQkwMDBiICAxNi80IENhcmRCdXMgQWRhcHRlciBNazIKLQkJMTBiNiAwMDA4ICAxNi80IENhcmRCdXMgQWRhcHRlciBNazIKLQkJMTBiNiAwMDBiICAxNi80IENhcmRidXMgQWRhcHRlciBNazIKLQkwMDBjICBSYXBpZEZpcmUgMzE0MFYyIDE2LzQgVFIgQWRhcHRlcgotCQkxMGI2IDAwMGMgIFJhcGlkRmlyZSAzMTQwVjIgMTYvNCBUUiBBZGFwdGVyCi0JMTAwMCAgQ29sbGFnZSAyNS8xNTUgQVRNIENsaWVudCBBZGFwdGVyCi0JMTAwMSAgQ29sbGFnZSAxNTUgQVRNIFNlcnZlciBBZGFwdGVyCi0xMGI3ICAzQ29tIENvcnBvcmF0aW9uCi0JMDAwMSAgM2M5ODUgMTAwMEJhc2VTWCAoU1gvVFgpCi0JMDAxMyAgQVI1MjEyIDgwMi4xMWFiZyBOSUMgKDNDUkRBRzY3NSkKLQkJMTBiNyAyMDMxICAzQ1JEQUc2NzUgMTFhL2IvZyBXaXJlbGVzcyBQQ0kgQWRhcHRlcgotCTA5MTAgIDNDOTEwLUEwMQotCTEwMDYgIE1JTkkgUENJIHR5cGUgM0IgRGF0YSBGYXggTW9kZW0KLQkxMDA3ICBNaW5pIFBDSSA1NmsgV2lubW9kZW0KLQkJMTBiNyA2MTVjICBNaW5pIFBDSSA1NksgTW9kZW0KLQkxMjAxICAzYzk4Mi1UWE0gMTAvMTAwYmFzZVRYIER1YWwgUG9ydCBBIFtIeWRyYV0KLQkxMjAyICAzYzk4Mi1UWE0gMTAvMTAwYmFzZVRYIER1YWwgUG9ydCBCIFtIeWRyYV0KLQkxNzAwICAzYzk0MCAxMC8xMDAvMTAwMEJhc2UtVCBbTWFydmVsbF0KLQkJMTA0MyA4MGViICBQNFA4MDAvSzhWIERlbHV4ZSBtb3RoZXJib2FyZAotCQkxMGI3IDAwMTAgIDNDOTQwIEdpZ2FiaXQgTE9NIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTBiNyAwMDIwICAzQzk0MSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkzMzkwICAzYzMzOSBUb2tlbkxpbmsgVmVsb2NpdHkKLQkzNTkwICAzYzM1OSBUb2tlbkxpbmsgVmVsb2NpdHkgWEwKLQkJMTBiNyAzNTkwICBUb2tlbkxpbmsgVmVsb2NpdHkgWEwgQWRhcHRlciAoM0MzNTkvMzU5QikKLQk0NTAwICAzYzQ1MCBIb21lUE5BIFtUb3JuYWRvXQotCTUwNTUgIDNjNTU1IExhcHRvcCBIdXJyaWNhbmUKLQk1MDU3ICAzYzU3NSBNZWdhaGVydHogMTAvMTAwIExBTiBDYXJkQnVzIFtCb29tZXJhbmddCi0JCTEwYjcgNWE1NyAgM0M1NzUgTWVnYWhlcnR6IDEwLzEwMCBMQU4gQ2FyZGJ1cyBQQyBDYXJkCi0JNTE1NyAgM2NDRkU1NzVCVCBNZWdhaGVydHogMTAvMTAwIExBTiBDYXJkQnVzIFtDeWNsb25lXQotCQkxMGI3IDViNTcgIDNDNTc1IE1lZ2FoZXJ0eiAxMC8xMDAgTEFOIENhcmRidXMgUEMgQ2FyZAotCTUyNTcgIDNjQ0ZFNTc1Q1QgQ2FyZEJ1cyBbQ3ljbG9uZV0KLQkJMTBiNyA1YzU3ICBGRTU3NUMtM0NvbSAxMC8xMDAgTEFOIENhcmRCdXMtRmFzdCBFdGhlcm5ldAotCTU5MDAgIDNjNTkwIDEwQmFzZVQgW1ZvcnRleF0KLQk1OTIwICAzYzU5MiBFSVNBIDEwbWJwcyBEZW1vbi9Wb3J0ZXgKLQk1OTUwICAzYzU5NSAxMDBCYXNlVFggW1ZvcnRleF0KLQk1OTUxICAzYzU5NSAxMDBCYXNlVDQgW1ZvcnRleF0KLQk1OTUyICAzYzU5NSAxMDBCYXNlLU1JSSBbVm9ydGV4XQotCTU5NzAgIDNjNTk3IEVJU0EgRmFzdCBEZW1vbi9Wb3J0ZXgKLQk1YjU3ICAzYzU5NSBNZWdhaGVydHogMTAvMTAwIExBTiBDYXJkQnVzIFtCb29tZXJhbmddCi0JCTEwYjcgNWI1NyAgM0M1NzUgTWVnYWhlcnR6IDEwLzEwMCBMQU4gQ2FyZGJ1cyBQQyBDYXJkCi0JNjAwMCAgM0NSU0hQVzc5NiBbT2ZmaWNlQ29ubmVjdCBXaXJlbGVzcyBDYXJkQnVzXQotCTYwMDEgIDNjb20gM0NSV0UxNTRHNzIgW09mZmljZSBDb25uZWN0IFdpcmVsZXNzIExBTiBBZGFwdGVyXQotCTYwNTUgIDNjNTU2IEh1cnJpY2FuZSBDYXJkQnVzIFtDeWNsb25lXQotCTYwNTYgIDNjNTU2QiBDYXJkQnVzIFtUb3JuYWRvXQotCQkxMGI3IDY1NTYgIDEwLzEwMCBNaW5pIFBDSSBFdGhlcm5ldCBBZGFwdGVyCi0JNjU2MCAgM2NDRkU2NTYgQ2FyZEJ1cyBbQ3ljbG9uZV0KLQkJMTBiNyA2NTZhICAzQ0NGRU02NTYgMTAvMTAwIExBTis1NksgTW9kZW0gQ2FyZEJ1cwotCTY1NjEgIDNjQ0ZFTTY1NiAxMC8xMDAgTEFOKzU2SyBNb2RlbSBDYXJkQnVzCi0JCTEwYjcgNjU2YiAgM0NDRkVNNjU2IDEwLzEwMCBMQU4rNTZLIE1vZGVtIENhcmRCdXMKLQk2NTYyICAzY0NGRU02NTZCIDEwLzEwMCBMQU4rV2lubW9kZW0gQ2FyZEJ1cyBbQ3ljbG9uZV0KLQkJMTBiNyA2NTZiICAzQ0NGRU02NTZCIDEwLzEwMCBMQU4rNTZLIE1vZGVtIENhcmRCdXMKLQk2NTYzICAzY0NGRU02NTZCIDEwLzEwMCBMQU4rNTZLIE1vZGVtIENhcmRCdXMKLQkJMTBiNyA2NTZiICAzQ0NGRU02NTYgMTAvMTAwIExBTis1NksgTW9kZW0gQ2FyZEJ1cwotCTY1NjQgIDNjWEZFTTY1NkMgMTAvMTAwIExBTitXaW5tb2RlbSBDYXJkQnVzIFtUb3JuYWRvXQotCTc2NDYgIDNjU09ITzEwMC1UWCBIdXJyaWNhbmUKLQk3NzcwICAzQ1JXRTc3NyBQQ0koUExYKSBXaXJlbGVzcyBBZGFwdG9yIFtBaXJjb25uZWN0XQotCTc5NDAgIDNjODAzIEZERElMaW5rIFVUUCBDb250cm9sbGVyCi0JNzk4MCAgM2M4MDQgRkRESUxpbmsgU0FTIENvbnRyb2xsZXIKLQk3OTkwICAzYzgwNSBGRERJTGluayBEQVMgQ29udHJvbGxlcgotCTgwZWIgIDNjOTQwQiAxMC8xMDAvMTAwMEJhc2UtVAotCTg4MTEgIFRva2VuIHJpbmcKLQk5MDAwICAzYzkwMCAxMEJhc2VUIFtCb29tZXJhbmddCi0JOTAwMSAgM2M5MDAgMTBNYnBzIENvbWJvIFtCb29tZXJhbmddCi0JOTAwNCAgM2M5MDBCLVRQTyBFdGhlcmxpbmsgWEwgW0N5Y2xvbmVdCi0JCTEwYjcgOTAwNCAgM0M5MDBCLVRQTyBFdGhlcmxpbmsgWEwgVFBPIDEwTWIKLQk5MDA1ICAzYzkwMEItQ29tYm8gRXRoZXJsaW5rIFhMIFtDeWNsb25lXQotCQkxMGI3IDkwMDUgIDNDOTAwQi1Db21ibyBFdGhlcmxpbmsgWEwgQ29tYm8KLQk5MDA2ICAzYzkwMEItVFBDIEV0aGVybGluayBYTCBbQ3ljbG9uZV0KLQk5MDBhICAzYzkwMEItRkwgMTBiYXNlLUZMIFtDeWNsb25lXQotCTkwNTAgIDNjOTA1IDEwMEJhc2VUWCBbQm9vbWVyYW5nXQotCTkwNTEgIDNjOTA1IDEwMEJhc2VUNCBbQm9vbWVyYW5nXQotCTkwNTUgIDNjOTA1QiAxMDBCYXNlVFggW0N5Y2xvbmVdCi0JCTEwMjggMDA4MCAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwODEgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDgyICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA4MyAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwODQgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDg1ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA4NiAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwODcgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDg4ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA4OSAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTAgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDkxICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA5MiAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTMgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDk0ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA5NSAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTYgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTAyOCAwMDk3ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JCTEwMjggMDA5OCAgM0M5MDVCIEZhc3QgRXRoZXJsaW5rIFhMIDEwLzEwMAotCQkxMDI4IDAwOTkgIDNDOTA1QiBGYXN0IEV0aGVybGluayBYTCAxMC8xMDAKLQkJMTBiNyA5MDU1ICAzQzkwNUIgRmFzdCBFdGhlcmxpbmsgWEwgMTAvMTAwCi0JOTA1NiAgM2M5MDVCLVQ0IEZhc3QgRXRoZXJMaW5rIFhMIFtDeWNsb25lXQotCTkwNTggIDNjOTA1QiBEZWx1eGUgRXRoZXJsaW5rIDEwLzEwMC9CTkMgW0N5Y2xvbmVdCi0JOTA1YSAgM2M5MDVCLUZYIEZhc3QgRXRoZXJsaW5rIFhMIEZYIDEwMGJhc2VGeCBbQ3ljbG9uZV0KLQk5MjAwICAzYzkwNUMtVFgvVFgtTSBbVG9ybmFkb10KLQkJMTAyOCAwMDk1ICAzQzkyMCBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDI4IDAwOTcgIDNDOTIwIEludGVncmF0ZWQgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMjggMDBmZSAgT3B0aXBsZXggR1gyNDAKLQkJMTAyOCAwMTJhICAzQzkyMCBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciBbTGF0aXR1ZGUgQzY0MF0KLQkJMTBiNyAxMDAwICAzQzkwNUMtVFggRmFzdCBFdGhlcmxpbmsgZm9yIFBDIE1hbmFnZW1lbnQgTklDCi0JCTEwYjcgNzAwMCAgMTAvMTAwIE1pbmkgUENJIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTBmMSAyNDY2ICBUaWdlciBNUFggUzI0NjYgKDNDOTIwIEludGVncmF0ZWQgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyKQotCTkyMDEgIDNDOTIwQi1FTUIgSW50ZWdyYXRlZCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgW1Rvcm5hZG9dCi0JCTEwNDMgODBhYiAgQTdOOFggRGVsdXhlIG9uYm9hcmQgM0M5MjBCLUVNQiBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotCTkyMDIgIDNDb20gM0M5MjBCLUVNQi1XTk0gSW50ZWdyYXRlZCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQk5MjEwICAzQzkyMEItRU1CLVdOTSBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotCTkzMDAgIDNDU09ITzEwMEItVFggOTEwLUEwMSBbdHVsaXBdCi0JOTgwMCAgM2M5ODAtVFggRmFzdCBFdGhlcmxpbmsgWEwgU2VydmVyIEFkYXB0ZXIgW0N5Y2xvbmVdCi0JCTEwYjcgOTgwMCAgM2M5ODAtVFggRmFzdCBFdGhlcmxpbmsgWEwgU2VydmVyIEFkYXB0ZXIKLQk5ODA1ICAzYzk4MC1DIDEwLzEwMGJhc2VUWCBOSUMgW1B5dGhvbi1UXQotCQkxMGI3IDEyMDEgIEV0aGVyTGluayBTZXJ2ZXIgMTAvMTAwIER1YWwgUG9ydCBBCi0JCTEwYjcgMTIwMiAgRXRoZXJMaW5rIFNlcnZlciAxMC8xMDAgRHVhbCBQb3J0IEIKLQkJMTBiNyA5ODA1ICAzYzk4MCAxMC8xMDBiYXNlVFggTklDIFtQeXRob24tVF0KLQkJMTBmMSAyNDYyICBUaHVuZGVyIEs3IFMyNDYyCi0JOTkwMCAgM0M5OTAtVFggW1R5cGhvb25dCi0JOTkwMiAgM0NSOTkwLVRYLTk1IFtUeXBob29uIDU2LWJpdF0KLQk5OTAzICAzQ1I5OTAtVFgtOTcgW1R5cGhvb24gMTY4LWJpdF0KLQk5OTA0ICAzQzk5MEItVFgtTS8zQzk5MEJTVlIgW1R5cGhvb24yXQotCQkxMGI3IDEwMDAgIDNDUjk5MEItVFgtTSBbVHlwaG9vbjJdCi0JCTEwYjcgMjAwMCAgM0NSOTkwQlNWUiBbVHlwaG9vbjIgU2VydmVyXQotCTk5MDUgIDNDUjk5MC1GWC05NS85Ny85NSBbVHlwaG9uIEZpYmVyXQotCQkxMGI3IDExMDEgIDNDUjk5MC1GWC05NSBbVHlwaG9vbiBGaWJlciA1Ni1iaXRdCi0JCTEwYjcgMTEwMiAgM0NSOTkwLUZYLTk3IFtUeXBob29uIEZpYmVyIDE2OC1iaXRdCi0JCTEwYjcgMjEwMSAgM0NSOTkwLUZYLTk1IFNlcnZlciBbVHlwaG9vbiBGaWJlciA1Ni1iaXRdCi0JCTEwYjcgMjEwMiAgM0NSOTkwLUZYLTk3IFNlcnZlciBbVHlwaG9vbiBGaWJlciAxNjgtYml0XQotCTk5MDggIDNDUjk5MFNWUjk1IFtUeXBob29uIFNlcnZlciA1Ni1iaXRdCi0JOTkwOSAgM0NSOTkwU1ZSOTcgW1R5cGhvb24gU2VydmVyIDE2OC1iaXRdCi0JOTkwYSAgM0M5OTBTVlIgW1R5cGhvb24gU2VydmVyXQotCTk5MGIgIDNDOTkwU1ZSIFtUeXBob29uIFNlcnZlcl0KLTEwYjggIFN0YW5kYXJkIE1pY3Jvc3lzdGVtcyBDb3JwIFtTTUNdCi0JMDAwNSAgODNjMTcwIEVQSUMvMTAwIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDU1IGUwMDAgIExBTkVQSUMgMTAvMTAwIFtFVkIxNzFRLVBDSV0KLQkJMTA1NSBlMDAyICBMQU5FUElDIDEwLzEwMCBbRVZCMTcxRy1QQ0ldCi0JCTEwYjggYTAxMSAgRXRoZXJQb3dlciBJSSAxMC8xMDAKLQkJMTBiOCBhMDE0ICBFdGhlclBvd2VyIElJIDEwLzEwMAotCQkxMGI4IGEwMTUgIEV0aGVyUG93ZXIgSUkgMTAvMTAwCi0JCTEwYjggYTAxNiAgRXRoZXJQb3dlciBJSSAxMC8xMDAKLQkJMTBiOCBhMDE3ICBFdGhlclBvd2VyIElJIDEwLzEwMAotCTAwMDYgIDgzYzE3NSBFUElDLzEwMCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA1NSBlMTAwICBMQU5FUElDIENhcmRidXMgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwNTUgZTEwMiAgTEFORVBJQyBDYXJkYnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDU1IGUzMDAgIExBTkVQSUMgQ2FyZGJ1cyBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTA1NSBlMzAyICBMQU5FUElDIENhcmRidXMgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwYjggYTAxMiAgTEFORVBJQyBDYXJkYnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxM2EyIDgwMDIgIExBTkVQSUMgQ2FyZGJ1cyBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTNhMiA4MDA2ICBMQU5FUElDIENhcmRidXMgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0JMTAwMCAgRkRDIDM3YzY2NQotCTEwMDEgIEZEQyAzN0M5MjIKLSMgODAyLjExZyBjYXJkCi0JMjgwMiAgU01DMjgwMlcgW0VaIENvbm5lY3QgZ10KLQlhMDExICA4M0MxNzBRRgotCWIxMDYgIFNNQzM0QzkwCi0xMGI5ICBBTGkgQ29ycG9yYXRpb24KLQkwMTAxICBDTUk4MzM4L0MzRFggUENJIEF1ZGlvIERldmljZQotCTAxMTEgIEMtTWVkaWEgQ01JODczOC9DM0RYIEF1ZGlvIERldmljZSAoT0VNKQotCQkxMGI5IDAxMTEgIEMtTWVkaWEgQ01JODczOC9DM0RYIEF1ZGlvIERldmljZSAoT0VNKQotCTA3ODAgIE11bHRpLUlPIENhcmQKLQkwNzgyICBNdWx0aS1JTyBDYXJkCi0JMTQzNSAgTTE0MzUKLQkxNDQ1ICBNMTQ0NQotCTE0NDkgIE0xNDQ5Ci0JMTQ1MSAgTTE0NTEKLQkxNDYxICBNMTQ2MQotCTE0ODkgIE0xNDg5Ci0JMTUxMSAgTTE1MTEgW0FsYWRkaW5dCi0JMTUxMiAgTTE1MTIgW0FsYWRkaW5dCi0JMTUxMyAgTTE1MTMgW0FsYWRkaW5dCi0JMTUyMSAgTTE1MjEgW0FsYWRkaW4gSUlJXQotCQkxMGI5IDE1MjEgIEFMSSBNMTUyMSBBbGFkZGluIElJSSBDUFUgQnJpZGdlCi0JMTUyMyAgTTE1MjMKLQkJMTBiOSAxNTIzICBBTEkgTTE1MjMgSVNBIEJyaWRnZQotCTE1MzEgIE0xNTMxIFtBbGFkZGluIElWXQotCTE1MzMgIE0xNTMzIFBDSSB0byBJU0EgQnJpZGdlIFtBbGFkZGluIElWXQotCQkxMDE0IDA1M2IgIFRoaW5rUGFkIFI0MGUgKDI2ODQtSFZHKSBQQ0kgdG8gSVNBIEJyaWRnZQotCQkxMGI5IDE1MzMgIEFMSSBNMTUzMyBBbGFkZGluIElWIElTQSBCcmlkZ2UKLQkxNTQxICBNMTU0MQotCQkxMGI5IDE1NDEgIEFMSSBNMTU0MSBBbGFkZGluIFYvVisgQUdQIFN5c3RlbSBDb250cm9sbGVyCi0JMTU0MyAgTTE1NDMKLQkxNTYzICBNMTU2MyBIeXBlclRyYW5zcG9ydCBTb3V0aCBCcmlkZ2UKLQkxNjIxICBNMTYyMQotCTE2MzEgIEFMSSBNMTYzMSBQQ0kgTm9ydGggQnJpZGdlIEFsYWRkaW4gUHJvIElJSQotCTE2MzIgIE0xNjMyTSBOb3J0aGJyaWRnZStUcmlkZW50Ci0JMTY0MSAgQUxJIE0xNjQxIFBDSSBOb3J0aCBCcmlkZ2UgQWxhZGRpbiBQcm8gSVYKLQkxNjQ0ICBNMTY0NC9NMTY0NFQgTm9ydGhicmlkZ2UrVHJpZGVudAotCTE2NDYgIE0xNjQ2IE5vcnRoYnJpZGdlK1RyaWRlbnQKLQkxNjQ3ICBNMTY0NyBOb3J0aGJyaWRnZSBbTUFHaUsgMSAvIE1vYmlsZU1BR2lLIDFdCi0JMTY1MSAgTTE2NTEvTTE2NTFUIE5vcnRoYnJpZGdlIFtBbGFkZGluLVBybyA1LzVNLEFsYWRkaW4tUHJvIDVULzVUTV0KLQkxNjcxICBNMTY3MSBTdXBlciBQNCBOb3J0aGJyaWRnZSBbQUdQNFgsUENJIGFuZCBTRFIvRERSXQotCTE2NzIgIE0xNjcyIE5vcnRoYnJpZGdlIFtDeWJlckFMQUREaU4tUDRdCi0JMTY4MSAgTTE2ODEgUDQgTm9ydGhicmlkZ2UgW0FHUDhYLEh5cGVyVHJhbnNwb3J0IGFuZCBTRFIvRERSXQotCTE2ODcgIE0xNjg3IEs4IE5vcnRoYnJpZGdlIFtBR1A4WCBhbmQgSHlwZXJUcmFuc3BvcnRdCi0JMTY4OSAgTTE2ODkgSzggTm9ydGhicmlkZ2UgW1N1cGVyIEs4IFNpbmdsZSBDaGlwXQotCTMxNDEgIE0zMTQxCi0JMzE0MyAgTTMxNDMKLQkzMTQ1ICBNMzE0NQotCTMxNDcgIE0zMTQ3Ci0JMzE0OSAgTTMxNDkKLQkzMTUxICBNMzE1MQotCTMzMDcgIE0zMzA3Ci0JMzMwOSAgTTMzMDkKLQkzMzIzICBNMzMyNSBWaWRlby9BdWRpbyBEZWNvZGVyCi0JNTIxMiAgTTQ4MDMKLQk1MjE1ICBNUzQ4MDMKLQk1MjE3ICBNNTIxN0gKLQk1MjE5ICBNNTIxOQotCTUyMjUgIE01MjI1Ci0JNTIyOCAgTTUyMjggQUxpIEFUQS9SQUlEIENvbnRyb2xsZXIKLQk1MjI5ICBNNTIyOSBJREUKLQkJMTAxNCAwNTBmICBUaGlua1BhZCBSMzAKLQkJMTAxNCAwNTNkICBUaGlua1BhZCBSNDBlICgyNjg0LUhWRykgYnVpbHRpbiBJREUKLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBJREUKLQkJMTA0MyA4MDUzICBBN0EyNjYgTW90aGVyYm9hcmQgSURFCi0JNTIzNSAgTTUyMjUKLQk1MjM3ICBVU0IgMS4xIENvbnRyb2xsZXIKLQkJMTAxNCAwNTQwICBUaGlua1BhZCBSNDBlICgyNjg0LUhWRykgYnVpbHRpbiBVU0IKLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBVU0IKLQk1MjM5ICBVU0IgMi4wIENvbnRyb2xsZXIKLQk1MjQzICBNMTU0MSBQQ0kgdG8gQUdQIENvbnRyb2xsZXIKLQk1MjQ2ICBBR1A4WCBDb250cm9sbGVyCi0JNTI0NyAgUENJIHRvIEFHUCBDb250cm9sbGVyCi0JNTI0OSAgTTUyNDkgSFRUIHRvIFBDSSBCcmlkZ2UKLQk1MjUxICBNNTI1MSBQMTM5NCBPSENJIDEuMCBDb250cm9sbGVyCi0JNTI1MyAgTTUyNTMgUDEzOTQgT0hDSSAxLjEgQ29udHJvbGxlcgotCTUyNjEgIE01MjYxIEV0aGVybmV0IENvbnRyb2xsZXIKLQk1MjYzICBNNTI2MyBFdGhlcm5ldCBDb250cm9sbGVyCi0JNTI4MSAgQUxpIE01MjgxIFNlcmlhbCBBVEEgLyBSQUlEIEhvc3QgQ29udHJvbGxlcgotCTUyODcgIFVMaSA1Mjg3IFNBVEEKLQk1Mjg5ICBVTGkgNTI4OSBTQVRBCi0JNTQ1MCAgTHVjZW50IFRlY2hub2xvZ2llcyBTb2Z0IE1vZGVtIEFNUgotCTU0NTEgIE01NDUxIFBDSSBBQy1MaW5rIENvbnRyb2xsZXIgQXVkaW8gRGV2aWNlCi0JCTEwMTQgMDUwNiAgVGhpbmtQYWQgUjMwCi0JCTEwMTQgMDUzZSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gQXVkaW8KLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBBdWRpbwotCQkxMGI5IDU0NTEgIEhQIENvbXBhcSBuYzQwMTAgKERZODg1QUEjQUJOKQotCTU0NTMgIE01NDUzIFBDSSBBQy1MaW5rIENvbnRyb2xsZXIgTW9kZW0gRGV2aWNlCi0JNTQ1NSAgTTU0NTUgUENJIEFDLUxpbmsgQ29udHJvbGxlciBBdWRpbyBEZXZpY2UKLQk1NDU3ICBNNTQ1NyBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JCTEwMTQgMDUzNSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gbW9kZW0KLQkJMTAzYyAwMDI0ICBQYXZpbGlvbiB6ZTQ0MDAgYnVpbHRpbiBNb2RlbSBEZXZpY2UKLSMgU2FtZSBidXQgbW9yZSB1c2VmdWxsIGZvciBkcml2ZXIncyBsb29rdXAKLQk1NDU5ICBTbWFydExpbmsgU21hcnRQQ0k1NjEgNTZLIE1vZGVtCi0jIFNtYXJ0TGluayBQQ0kgU29mdE1vZGVtCi0JNTQ1YSAgU21hcnRMaW5rIFNtYXJ0UENJNTYzIDU2SyBNb2RlbQotCTU0NzEgIE01NDcxIE1lbW9yeSBTdGljayBDb250cm9sbGVyCi0JNTQ3MyAgTTU0NzMgU0QtTU1DIENvbnRyb2xsZXIKLQk3MTAxICBNNzEwMSBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xsZXIgW1BNVV0KLQkJMTAxNCAwNTEwICBUaGlua1BhZCBSMzAKLQkJMTAxNCAwNTNjICBUaGlua1BhZCBSNDBlICgyNjg0LUhWRykgUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyCi0JCTEwM2MgMDAyNCAgUGF2aWxpb24gemU0NDAwCi0xMGJhICBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuCi0JMDMwMSAgQWNjZWxHcmFwaGljcyBBY2NlbEVDTElQU0UKLQkwMzA0ICBBY2NlbEdBTEFYWSBBMjEwMCBbT0VNIEV2YW5zICYgU3V0aGVybGFuZF0KLQkwMzA4ICBUb3JuYWRvIDMwMDAgW09FTSBFdmFucyAmIFN1dGhlcmxhbmRdCi0JMTAwMiAgVkc1MDAgW1ZvbHVtZVBybyBWb2x1bWUgUmVuZGVyaW5nIEFjY2VsZXJhdG9yXQotMTBiYiAgRGFwaGEgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLTEwYmMgIEFkdmFuY2VkIExvZ2ljIFJlc2VhcmNoCi0xMGJkICBTdXJlY29tIFRlY2hub2xvZ3kKLQkwZTM0ICBORS0zNAotMTBiZSAgVHNlbmcgTGFicyBJbnRlcm5hdGlvbmFsIENvLgotMTBiZiAgTW9zdCBJbmMKLTEwYzAgIEJvY2EgUmVzZWFyY2ggSW5jLgotMTBjMSAgSUNNIENvLiwgTHRkLgotMTBjMiAgQXVzcGV4IFN5c3RlbXMgSW5jLgotMTBjMyAgU2Ftc3VuZyBTZW1pY29uZHVjdG9ycywgSW5jLgotCTExMDAgIFNtYXJ0ZXRoZXIxMDAgU0MxMTAwIExBTiBBZGFwdGVyIChpODI1NTdCKQotMTBjNCAgQXdhcmQgU29mdHdhcmUgSW50ZXJuYXRpb25hbCBJbmMuCi0xMGM1ICBYZXJveCBDb3Jwb3JhdGlvbgotMTBjNiAgUmFtYnVzIEluYy4KLTEwYzcgIE1lZGlhIFZpc2lvbgotMTBjOCAgTmVvbWFnaWMgQ29ycG9yYXRpb24KLQkwMDAxICBOTTIwNzAgW01hZ2ljR3JhcGggMTI4XQotCTAwMDIgIE5NMjA5MCBbTWFnaWNHcmFwaCAxMjhWXQotCTAwMDMgIE5NMjA5MyBbTWFnaWNHcmFwaCAxMjhaVl0KLQkwMDA0ICBOTTIxNjAgW01hZ2ljR3JhcGggMTI4WERdCi0JCTEwMTQgMDBiYSAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMDI1IDEwMDcgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTAyOCAwMDc0ICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwMjggMDA3NSAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMDI4IDAwN2QgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTAyOCAwMDdlICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwMzMgODAyZiAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMDRkIDgwMWIgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTA0ZCA4MDJmICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwNGQgODMwYiAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMGJhIDBlMDAgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTBjOCAwMDA0ICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwY2YgMTAyOSAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMGY3IDgzMDggIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTBmNyA4MzA5ICBNYWdpY0dyYXBoIDEyOFhECi0JCTEwZjcgODMwYiAgTWFnaWNHcmFwaCAxMjhYRAotCQkxMGY3IDgzMGQgIE1hZ2ljR3JhcGggMTI4WEQKLQkJMTBmNyA4MzEyICBNYWdpY0dyYXBoIDEyOFhECi0JMDAwNSAgTk0yMjAwIFtNYWdpY0dyYXBoIDI1NkFWXQotCQkxMDE0IDAwZGQgIFRoaW5rUGFkIDU3MAotCQkxMDI4IDAwODggIExhdGl0dWRlIENQaSBBCi0JMDAwNiAgTk0yMzYwIFtNYWdpY01lZGlhIDI1NlpYXQotCTAwMTYgIE5NMjM4MCBbTWFnaWNNZWRpYSAyNTZYTCtdCi0JCTEwYzggMDAxNiAgTWFnaWNNZWRpYSAyNTZYTCsKLQkwMDI1ICBOTTIyMzAgW01hZ2ljR3JhcGggMjU2QVYrXQotCTAwODMgIE5NMjA5MyBbTWFnaWNHcmFwaCAxMjhaVitdCi0JODAwNSAgTk0yMjAwIFtNYWdpY01lZGlhIDI1NkFWIEF1ZGlvXQotCQkwZTExIGIwZDEgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIERpc2NvdmVyeQotCQkwZTExIGIxMjYgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIER1cmFuZ28KLQkJMTAxNCAwMGRkICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZSBvbiBCbGFja1RpcCBUaGlua3BhZAotCQkxMDI1IDEwMDMgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIFRyYXZlbE1hdGUgNzIwCi0JCTEwMjggMDA4OCAgTGF0aXR1ZGUgQ1BpIEEKLQkJMTAyOCAwMDhmICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZSBvbiBDb2xvcmFkbyBJbnNwaXJvbgotCQkxMDNjIDAwMDcgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIFZveWFnZXIgSUkKLQkJMTAzYyAwMDA4ICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZSBvbiBWb3lhZ2VyIElJSQotCQkxMDNjIDAwMGQgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIE9tbmlib29rIDkwMAotCQkxMGM4IDgwMDUgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlIG9uIEZpcmVBbnQKLQkJMTEwYSA4MDA1ICBNYWdpY01lZGlhIDI1NkFWIEF1ZGlvIERldmljZQotCQkxNGMwIDAwMDQgIE1hZ2ljTWVkaWEgMjU2QVYgQXVkaW8gRGV2aWNlCi0JODAwNiAgTk0yMzYwIFtNYWdpY01lZGlhIDI1NlpYIEF1ZGlvXQotCTgwMTYgIE5NMjM4MCBbTWFnaWNNZWRpYSAyNTZYTCsgQXVkaW9dCi0xMGM5ICBEYXRhZXhwZXJ0IENvcnBvcmF0aW9uCi0xMGNhICBGdWppdHN1IE1pY3JvZWxlY3RyLiwgSW5jLgotMTBjYiAgT21yb24gQ29ycG9yYXRpb24KLSMgbmVlIE1lbnRvciBBUkMgSW5jCi0xMGNjICBNYWkgTG9naWMgSW5jb3Jwb3JhdGVkCi0JMDY2MCAgQXJ0aWNpYSBTIEhvc3QgQnJpZGdlCi0JMDY2MSAgQXJ0aWNpYSBTIFBDSSBCcmlkZ2UKLTEwY2QgIEFkdmFuY2VkIFN5c3RlbSBQcm9kdWN0cywgSW5jCi0JMTEwMCAgQVNDMTEwMAotCTEyMDAgIEFTQzEyMDAgWyhhYnA5NDApIEZhc3QgU0NTSS1JSV0KLQkxMzAwICBBQlA5NDAtVSAvIEFCUDk2MC1VCi0JCTEwY2QgMTMxMCAgQVNDMTMwMCBTQ1NJIEFkYXB0ZXIKLQkyMzAwICBBQlA5NDAtVVcKLQkyNTAwICBBQlA5NDAtVTJXCi0xMGNlICBSYWRpdXMKLSMgbmVlIENpdGljb3JwIFRUSQotMTBjZiAgRnVqaXRzdSBMaW1pdGVkLgotCTIwMDEgIG1iODY2MDUKLTEwZDEgIEZ1dHVyZVBsdXMgU3lzdGVtcyBDb3JwLgotMTBkMiAgTW9sZXggSW5jb3Jwb3JhdGVkCi0xMGQzICBKYWJpbCBDaXJjdWl0IEluYwotMTBkNCAgSHVhbG9uIE1pY3JvZWxlY3Ryb25pY3MKLTEwZDUgIEF1dG9sb2dpYyBJbmMuCi0xMGQ2ICBDZXRpYQotMTBkNyAgQkNNIEFkdmFuY2VkIFJlc2VhcmNoCi0xMGQ4ICBBZHZhbmNlZCBQZXJpcGhlcmFscyBMYWJzCi0xMGQ5ICBNYWNyb25peCwgSW5jLiBbTVhJQ10KLQkwNDMxICBNWDk4NzE1Ci0JMDUxMiAgTVg5ODcxMwotCTA1MzEgIE1YOTg3eDUKLQkJMTE4NiAxMjAwICBERkUtNTQwVFggUHJvRkFTVCAxMC8xMDAgQWRhcHRlcgotCTg2MjUgIE1YODYyNTAKLQk4ODg4ICBNWDg2MjAwCi0xMGRhICBDb21wYXEgSVBHLUF1c3RpbgotCTA1MDggIFRDNDA0OCBUb2tlbiBSaW5nIDQvMTYKLQkzMzkwICBUbDNjM3g5Ci0xMGRiICBSb2htIExTSSBTeXN0ZW1zLCBJbmMuCi0xMGRjICBDRVJOL0VDUC9FRFUKLQkwMDAxICBTVEFSL1JEMjQgU0NJLVBDSSAoUE1DKQotCTAwMDIgIFRBUi9SRDI0IFNDSS1QQ0kgKFBNQykKLQkwMDIxICBISVBQSSBkZXN0aW5hdGlvbgotCTAwMjIgIEhJUFBJIHNvdXJjZQotCTEwZGMgIEFUVDJDMTUtMyBGUEdBCi0xMGRkICBFdmFucyAmIFN1dGhlcmxhbmQKLTEwZGUgIG5WaWRpYSBDb3Jwb3JhdGlvbgotCTAwMDggIE5WMSBbRURHRSAzRF0KLQkwMDA5ICBOVjEgW0VER0UgM0RdCi0JMDAxMCAgTlYyIFtNdXRhcmEgVjA4XQotCTAwMjAgIE5WNCBbUklWQSBUTlRdCi0JCTEwNDMgMDIwMCAgVjM0MDAgVE5UCi0JCTEwNDggMGMxOCAgRXJhem9yIElJIFNHUkFNCi0JCTEwNDggMGMxYiAgRXJhem9yIElJCi0JCTEwOTIgMDU1MCAgVmlwZXIgVjU1MAotCQkxMDkyIDA1NTIgIFZpcGVyIFY1NTAKLQkJMTA5MiA0ODA0ICBWaXBlciBWNTUwCi0JCTEwOTIgNDgwOCAgVmlwZXIgVjU1MAotCQkxMDkyIDQ4MTAgIFZpcGVyIFY1NTAKLQkJMTA5MiA0ODEyICBWaXBlciBWNTUwCi0JCTEwOTIgNDgxNSAgVmlwZXIgVjU1MAotCQkxMDkyIDQ4MjAgIFZpcGVyIFY1NTAgd2l0aCBUViBvdXQKLQkJMTA5MiA0ODIyICBWaXBlciBWNTUwCi0JCTEwOTIgNDkwNCAgVmlwZXIgVjU1MAotCQkxMDkyIDQ5MTQgIFZpcGVyIFY1NTAKLQkJMTA5MiA4MjI1ICBWaXBlciBWNTUwCi0JCTEwYjQgMjczZCAgVmVsb2NpdHkgNDQwMAotCQkxMGI0IDI3M2UgIFZlbG9jaXR5IDQ0MDAKLQkJMTBiNCAyNzQwICBWZWxvY2l0eSA0NDAwCi0JCTEwZGUgMDAyMCAgUml2YSBUTlQKLQkJMTEwMiAxMDE1ICBHcmFwaGljcyBCbGFzdGVyIENUNjcxMAotCQkxMTAyIDEwMTYgIEdyYXBoaWNzIEJsYXN0ZXIgUklWQSBUTlQKLQkwMDI4ICBOVjUgW1JJVkEgVE5UMi9UTlQyIFByb10KLQkJMTA0MyAwMjAwICBBR1AtVjM4MDAgU0dSQU0KLQkJMTA0MyAwMjAxICBBR1AtVjM4MDAgU0RSQU0KLQkJMTA0MyAwMjA1ICBQQ0ktVjM4MDAKLQkJMTA0MyA0MDAwICBBR1AtVjM4MDBQUk8KLQkJMTA0OCAwYzIxICBTeW5lcmd5IElJCi0JCTEwNDggMGMzMSAgRXJhem9yIElJSQotCQkxMDdkIDIxMzQgIFdpbkZhc3QgM0QgUzMyMCBJSSArIFRWLU91dAotCQkxMDkyIDQ4MDQgIFZpcGVyIFY3NzAKLQkJMTA5MiA0YTAwICBWaXBlciBWNzcwCi0JCTEwOTIgNGEwMiAgVmlwZXIgVjc3MCBVbHRyYQotCQkxMDkyIDVhMDAgIFJJVkEgVE5UMi9UTlQyIFBybwotCQkxMDkyIDZhMDIgIFZpcGVyIFY3NzAgVWx0cmEKLQkJMTA5MiA3YTAyICBWaXBlciBWNzcwIFVsdHJhCi0JCTEwZGUgMDAwNSAgUklWQSBUTlQyIFBybwotCQkxMGRlIDAwMGYgIENvbXBhcSBOVklESUEgVE5UMiBQcm8KLQkJMTEwMiAxMDIwICAzRCBCbGFzdGVyIFJJVkEgVE5UMgotCQkxMTAyIDEwMjYgIDNEIEJsYXN0ZXIgUklWQSBUTlQyIERpZ2l0YWwKLQkJMTRhZiA1ODEwICBNYXhpIEdhbWVyIFhlbnRvcgotCTAwMjkgIE5WNSBbUklWQSBUTlQyIFVsdHJhXQotCQkxMDQzIDAyMDAgIEFHUC1WMzgwMCBEZWx1eGUKLQkJMTA0MyAwMjAxICBBR1AtVjM4MDAgVWx0cmEgU0RSQU0KLQkJMTA0MyAwMjA1ICBQQ0ktVjM4MDAgVWx0cmEKLQkJMTEwMiAxMDIxICAzRCBCbGFzdGVyIFJJVkEgVE5UMiBVbHRyYQotCQkxMTAyIDEwMjkgIDNEIEJsYXN0ZXIgUklWQSBUTlQyIFVsdHJhCi0JCTExMDIgMTAyZiAgM0QgQmxhc3RlciBSSVZBIFROVDIgVWx0cmEKLQkJMTRhZiA1ODIwICBNYXhpIEdhbWVyIFhlbnRvciAzMgotCTAwMmEgIE5WNSBbUml2YSBUblQyXQotCTAwMmIgIE5WNSBbUml2YSBUblQyXQotCTAwMmMgIE5WNiBbVmFudGEvVmFudGEgTFRdCi0JCTEwNDMgMDIwMCAgQUdQLVYzODAwIENvbWJhdCBTRFJBTQotCQkxMDQzIDAyMDEgIEFHUC1WMzgwMCBDb21iYXQKLQkJMTA5MiA2ODIwICBWaXBlciBWNzMwCi0JCTExMDIgMTAzMSAgQ1Q2OTM4IFZBTlRBIDhNQgotCQkxMTAyIDEwMzQgIENUNjg5NCBWQU5UQSAxNk1CCi0JCTE0YWYgNTAwOCAgTWF4aSBHYW1lciBQaG9lbml4IDIKLQkwMDJkICBOVjVNNjQgW1JJVkEgVE5UMiBNb2RlbCA2NC9Nb2RlbCA2NCBQcm9dCi0JCTEwNDMgMDIwMCAgQUdQLVYzODAwTQotCQkxMDQzIDAyMDEgIEFHUC1WMzgwME0KLQkJMTA0OCAwYzNhICBFcmF6b3IgSUlJIExUCi0JCTEwZGUgMDAxZSAgTTY0IEFHUDR4Ci0JCTExMDIgMTAyMyAgQ1Q2ODkyIFJJVkEgVE5UMiBWYWx1ZQotCQkxMTAyIDEwMjQgIENUNjkzMiBSSVZBIFROVDIgVmFsdWUgMzJNYgotCQkxMTAyIDEwMmMgIENUNjkzMSBSSVZBIFROVDIgVmFsdWUgW0p1bXBlcl0KLQkJMTQ2MiA4ODA4ICBNU0ktODgwOAotCQkxNTU0IDEwNDEgIFBpeGVsdmlldyBSSVZBIFROVDIgTTY0Ci0JCTE1NjkgMDAyZCAgUGFsaXQgTWljcm9zeXN0ZW1zIERheXRvbmEgVE5UMiBNNjQKLQkwMDJlICBOVjYgW1ZhbnRhXQotCTAwMmYgIE5WNiBbVmFudGFdCi0JMDAzNCAgTUNQMDQgU01CdXMKLQkwMDM1ICBNQ1AwNCBJREUKLQkwMDM2ICBNQ1AwNCBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMDM3ICBNQ1AwNCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDAzOCAgTUNQMDQgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAwM2EgIE1DUDA0IEFDJzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkwMDNiICBNQ1AwNCBVU0IgQ29udHJvbGxlcgotCTAwM2MgIE1DUDA0IFVTQiBDb250cm9sbGVyCi0JMDAzZCAgTUNQMDQgUENJIEJyaWRnZQotCTAwM2UgIE1DUDA0IFNlcmlhbCBBVEEgQ29udHJvbGxlcgotCTAwNDAgIG52NDAgW0dlRm9yY2UgNjgwMCBVbHRyYV0KLQkwMDQxICBOVjQwIFtHZUZvcmNlIDY4MDBdCi0JMDA0MiAgTlY0MC4yCi0JMDA0MyAgTlY0MC4zCi0JMDA0NSAgTlY0MCBbR2VGb3JjZSA2ODAwIEdUXQotCTAwNDkgIE5WNDBHTAotCTAwNGUgIE5WNDBHTCBbUXVhZHJvIEZYIDQwMDBdCi0JMDA1MSAgQ0s4MDQgSVNBIEJyaWRnZQotCTAwNTIgIENLODA0IFNNQnVzCi0JMDA1MyAgQ0s4MDQgSURFCi0JMDA1NCAgQ0s4MDQgU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JMDA1NSAgQ0s4MDQgU2VyaWFsIEFUQSBDb250cm9sbGVyCi0JMDA1NiAgQ0s4MDQgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAwNTcgIENLODA0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkwMDU5ICBDSzgwNCBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JMDA1YSAgQ0s4MDQgVVNCIENvbnRyb2xsZXIKLQkwMDViICBDSzgwNCBVU0IgQ29udHJvbGxlcgotCTAwNWMgIENLODA0IFBDSSBCcmlkZ2UKLQkwMDVkICBDSzgwNCBQQ0lFIEJyaWRnZQotCTAwNWUgIENLODA0IE1lbW9yeSBDb250cm9sbGVyCi0JMDA2MCAgbkZvcmNlMiBJU0EgQnJpZGdlCi0JCTEwNDMgODBhZCAgQTdOOFggTWFpbmJvYXJkCi0JMDA2NCAgbkZvcmNlMiBTTUJ1cyAoTUNQKQotCTAwNjUgIG5Gb3JjZTIgSURFCi0JMDA2NiAgbkZvcmNlMiBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwNDMgODBhNyAgQTdOOFggTWFpbmJvYXJkIG9uYm9hcmQgbkZvcmNlMiBFdGhlcm5ldAotCTAwNjcgIG5Gb3JjZTIgVVNCIENvbnRyb2xsZXIKLQkJMTA0MyAwYzExICBBN044WCBNYWluYm9hcmQKLQkwMDY4ICBuRm9yY2UyIFVTQiBDb250cm9sbGVyCi0JCTEwNDMgMGMxMSAgQTdOOFggTWFpbmJvYXJkCi0JMDA2YSAgbkZvcmNlMiBBQzk3IEF1ZGlvIENvbnRyb2xlciAoTUNQKQotCTAwNmIgIG5Gb3JjZSBBdWRpbyBQcm9jZXNzaW5nIFVuaXQKLQkJMTBkZSAwMDZiICBuRm9yY2UyIE1DUCBBdWRpbyBQcm9jZXNzaW5nIFVuaXQKLQkwMDZjICBuRm9yY2UyIEV4dGVybmFsIFBDSSBCcmlkZ2UKLQkwMDZkICBuRm9yY2UyIFBDSSBCcmlkZ2UKLQkwMDZlICBuRm9yY2UyIEZpcmVXaXJlIChJRUVFIDEzOTQpIENvbnRyb2xsZXIKLQkwMDg0ICBNQ1AyQSBTTUJ1cwotCTAwODUgIE1DUDJBIElERQotCTAwODYgIE1DUDJBIEV0aGVybmV0IENvbnRyb2xsZXIKLQkwMDg3ICBNQ1AyQSBVU0IgQ29udHJvbGxlcgotCTAwODggIE1DUDJBIFVTQiBDb250cm9sbGVyCi0JMDA4YSAgTUNQMlMgQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCTAwOGIgIE1DUDJBIFBDSSBCcmlkZ2UKLQkwMDhjICBNQ1AyQSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDA4ZSAgbkZvcmNlMiBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMGEwICBOVjUgW0FsYWRkaW4gVE5UMl0KLQkJMTRhZiA1ODEwICBNYXhpIEdhbWVyIFhlbnRvcgotCTAwYzAgIE5WNDEuMAotCTAwYzEgIE5WNDEuMQotCTAwYzIgIE5WNDEuMgotCTAwYzggIE5WNDEuOAotCTAwY2UgIE5WNDFHTAotCTAwZDAgIG5Gb3JjZTMgTFBDIEJyaWRnZQotCTAwZDEgIG5Gb3JjZTMgSG9zdCBCcmlkZ2UKLQkwMGQyICBuRm9yY2UzIEFHUCBCcmlkZ2UKLQkwMGQzICBDSzgwNCBNZW1vcnkgQ29udHJvbGxlcgotCTAwZDQgIG5Gb3JjZTMgU01CdXMKLQkwMGQ1ICBuRm9yY2UzIElERQotCTAwZDYgIG5Gb3JjZTMgRXRoZXJuZXQKLQkwMGQ3ICBuRm9yY2UzIFVTQiAxLjEKLQkwMGQ4ICBuRm9yY2UzIFVTQiAyLjAKLQkwMGRhICBuRm9yY2UzIEF1ZGlvCi0JMDBkZCAgbkZvcmNlMyBQQ0kgQnJpZGdlCi0JMDBkZiAgQ0s4UyBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDBlMCAgbkZvcmNlMyAyNTBHYiBMUEMgQnJpZGdlCi0JMDBlMSAgbkZvcmNlMyAyNTBHYiBIb3N0IEJyaWRnZQotCTAwZTIgIG5Gb3JjZTMgMjUwR2IgQUdQIEhvc3QgdG8gUENJIEJyaWRnZQotCTAwZTMgIENLOFMgU2VyaWFsIEFUQSBDb250cm9sbGVyICh2Mi41KQotCTAwZTQgIG5Gb3JjZSAyNTBHYiBQQ0kgU3lzdGVtIE1hbmFnZW1lbnQKLQkwMGU1ICBDSzhTIFBhcmFsbGVsIEFUQSBDb250cm9sbGVyICh2Mi41KQotCTAwZTYgIENLOFMgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAwZTcgIENLOFMgVVNCIENvbnRyb2xsZXIKLQkwMGU4ICBuRm9yY2UzIEVIQ0kgVVNCIDIuMCBDb250cm9sbGVyCi0JMDBlYSAgbkZvcmNlMyAyNTBHYiBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JMDBlZCAgbkZvcmNlMyAyNTBHYiBQQ0ktdG8tUENJIEJyaWRnZQotCTAwZWUgIENLOFMgU2VyaWFsIEFUQSBDb250cm9sbGVyICh2Mi41KQotCTAwZjAgIE5WNDAgW0dlRm9yY2UgNjgwMC9HZUZvcmNlIDY4MDAgVWx0cmFdCi0JMDBmMSAgTlY0MyBbR2VGb3JjZSA2NjAwL0dlRm9yY2UgNjYwMCBHVF0KLQkwMGYyICBOVjQzIFtHZUZvcmNlIDY2MDAgR1RdCi0JMDBmOCAgTlY0NUdMIFtRdWFkcm8gRlggMzQwMF0KLQkwMGY5ICBOVjQwIFtHZUZvcmNlIDY4MDAgVWx0cmEvR2VGb3JjZSA2ODAwIEdUXQotCQkxNjgyIDIxMjAgIEdFRk9SQ0UgNjgwMCBHVCBQQ0ktRQotCTAwZmEgIE5WMzYgW0dlRm9yY2UgUENYIDU3NTBdCi0JMDBmYiAgTlYzNSBbR2VGb3JjZSBQQ1ggNTkwMF0KLQkwMGZjICBOVjM3R0wgW1F1YWRybyBGWCAzMzAvR2VGb3JjZSBQQ1ggNTMwMF0KLQkwMGZkICBOVjM3R0wgW1F1YWRybyBGWCAzMzBdCi0JMDBmZSAgTlYzOEdMIFtRdWFkcm8gRlggMTMwMF0KLQkwMGZmICBOVjE4IFtHZUZvcmNlIFBDWCA0MzAwXQotCTAxMDAgIE5WMTAgW0dlRm9yY2UgMjU2IFNEUl0KLQkJMTA0MyAwMjAwICBBR1AtVjY2MDAgU0dSQU0KLQkJMTA0MyAwMjAxICBBR1AtVjY2MDAgU0RSQU0KLQkJMTA0MyA0MDA4ICBBR1AtVjY2MDAgU0dSQU0KLQkJMTA0MyA0MDA5ICBBR1AtVjY2MDAgU0RSQU0KLQkJMTEwMiAxMDJkICBDVDY5NDEgR2VGb3JjZSAyNTYKLQkJMTRhZiA1MDIyICAzRCBQcm9waGV0IFNFCi0JMDEwMSAgTlYxMEREUiBbR2VGb3JjZSAyNTYgRERSXQotCQkxMDQzIDAyMDIgIEFHUC1WNjgwMCBERFIKLQkJMTA0MyA0MDBhICBBR1AtVjY4MDAgRERSIFNHUkFNCi0JCTEwNDMgNDAwYiAgQUdQLVY2ODAwIEREUiBTRFJBTQotCQkxMDdkIDI4MjIgIFdpbkZhc3QgR2VGb3JjZSAyNTYKLQkJMTEwMiAxMDJlICBDVDY5NzEgR2VGb3JjZSAyNTYgRERSCi0JCTE0YWYgNTAyMSAgM0QgUHJvcGhldCBERFItRFZJCi0JMDEwMyAgTlYxMEdMIFtRdWFkcm9dCi0JMDExMCAgTlYxMSBbR2VGb3JjZTIgTVgvTVggNDAwXQotCQkxMDQzIDQwMTUgIEFHUC1WNzEwMCBQcm8KLQkJMTA0MyA0MDMxICBWNzEwMCBQcm8gd2l0aCBUViBvdXRwdXQKLQkJMTBkZSAwMDkxICBEZWxsIE9FTSBHZUZvcmNlIDIgTVggNDAwCi0JCTE0NjIgODgxNyAgTVNJIEdlRm9yY2UyIE1YNDAwIFBybzMyUyBbTVMtODgxN10KLQkJMTRhZiA3MTAyICAzRCBQcm9waGV0IElJIE1YCi0JCTE0YWYgNzEwMyAgM0QgUHJvcGhldCBJSSBNWCBEdWFsLURpc3BsYXkKLQkwMTExICBOVjExRERSIFtHZUZvcmNlMiBNWCAxMDAgRERSLzIwMCBERFJdCi0JMDExMiAgTlYxMSBbR2VGb3JjZTIgR29dCi0JMDExMyAgTlYxMUdMIFtRdWFkcm8yIE1YUi9FWF0KLQkwMTQwICBOVjQzIFtNU0kgTlg2NjAwR1QtVEQxMjhFXQotCTAxNGYgIE5WNDMgW0dlRm9yY2UgNjIwMF0KLQkwMTUwICBOVjE1IFtHZUZvcmNlMiBHVFMvUHJvXQotCQkxMDQzIDQwMTYgIFY3NzAwIEFHUCBWaWRlbyBDYXJkCi0JCTEwN2QgMjg0MCAgV2luRmFzdCBHZUZvcmNlMiBHVFMgd2l0aCBUViBvdXRwdXQKLQkJMTA3ZCAyODQyICBXaW5GYXN0IEdlRm9yY2UgMiBQcm8KLQkJMTQ2MiA4ODMxICBDcmVhdGl2ZSBHZUZvcmNlMiBQcm8KLQkwMTUxICBOVjE1RERSIFtHZUZvcmNlMiBUaV0KLQkJMTA0MyA0MDVmICBWNzcwMFRpCi0JCTE0NjIgNTUwNiAgQ3JlYXRpdmUgM0QgQmxhc3RlciBHZWZvcmNlMiBUaXRhbml1bQotCTAxNTIgIE5WMTVCUiBbR2VGb3JjZTIgVWx0cmEsIEJsYWRlcnVubmVyXQotCQkxMDQ4IDBjNTYgIEdMQURJQUMgVWx0cmEKLQkwMTUzICBOVjE1R0wgW1F1YWRybzIgUHJvXQotCTAxNzAgIE5WMTcgW0dlRm9yY2U0IE1YIDQ2MF0KLQkwMTcxICBOVjE3IFtHZUZvcmNlNCBNWCA0NDBdCi0JCTEwYjAgMDAwMiAgR2FpbndhcmQgUHJvLzYwMCBUVgotCQkxNDYyIDg2NjEgIEc0TVg0NDAtVlRQCi0JCTE0NjIgODczMCAgTVg0NDBTRVMtVCAoTVMtODg3MykKLQkJMTQ3YiA4ZjAwICBBYml0IFNpbHVybyBHZUZvcmNlNE1YNDQwCi0JMDE3MiAgTlYxNyBbR2VGb3JjZTQgTVggNDIwXQotCTAxNzMgIE5WMTcgW0dlRm9yY2U0IE1YIDQ0MC1TRV0KLQkwMTc0ICBOVjE3IFtHZUZvcmNlNCA0NDAgR29dCi0JMDE3NSAgTlYxNyBbR2VGb3JjZTQgNDIwIEdvXQotCTAxNzYgIE5WMTcgW0dlRm9yY2U0IDQyMCBHbyAzMk1dCi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTAxNzcgIE5WMTcgW0dlRm9yY2U0IDQ2MCBHb10KLQkwMTc4ICBOVjE3R0wgW1F1YWRybzQgNTUwIFhHTF0KLQkwMTc5ICBOVjE3IFtHZUZvcmNlNCA0NDAgR28gNjRNXQotCQkxMGRlIDAxNzkgIEdlRm9yY2U0IE1YIChNYWMpCi0JMDE3YSAgTlYxN0dMIFtRdWFkcm80IDIwMC80MDAgTlZTXQotCTAxN2IgIE5WMTdHTCBbUXVhZHJvNCA1NTAgWEdMXQotCTAxN2MgIE5WMTdHTCBbUXVhZHJvNCA1NTAgR29HTF0KLQkwMTdkICBOVjE3IFtHZUZvcmNlNCA0MTAgR28gMTZNXQotCTAxODEgIE5WMTggW0dlRm9yY2U0IE1YIDQ0MCBBR1AgOHhdCi0JCTEwNDMgODA2ZiAgVjkxODAgTWFnaWMKLQkJMTQ2MiA4ODgwICBNUy1TdGFyRm9yY2UgR2VGb3JjZTQgTVggNDQwIHdpdGggQUdQOFgKLQkJMTQ2MiA4OTAwICBNUy04ODkwIEdlRm9yY2UgNCBNWDQ0MCBBR1A4WAotCQkxNDYyIDkzNTAgIE1TSSBHZWZvcmNlNCBNWCBUOFggd2l0aCBBR1A4WAotCQkxNDdiIDhmMGQgIFNpbHVybyBHRjQgTVgtOFgKLQkwMTgyICBOVjE4IFtHZUZvcmNlNCBNWCA0NDBTRSBBR1AgOHhdCi0JMDE4MyAgTlYxOCBbR2VGb3JjZTQgTVggNDIwIEFHUCA4eF0KLQkwMTg1ICBOVjE4IFtHZUZvcmNlNCBNWCA0MDAwIEFHUCA4eF0KLQkwMTg2ICBOVjE4TSBbR2VGb3JjZTQgNDQ4IEdvXQotCTAxODcgIE5WMThNIFtHZUZvcmNlNCA0ODggR29dCi0JMDE4OCAgTlYxOEdMIFtRdWFkcm80IDU4MCBYR0xdCi0JMDE4YSAgTlYxOEdMIFtRdWFkcm80IE5WUyBBR1AgOHhdCi0JMDE4YiAgTlYxOEdMIFtRdWFkcm80IDM4MCBYR0xdCi0JMDE4ZCAgTlYxOE0gW0dlRm9yY2U0IDQ0OCBHb10KLQkwMWEwICBOVkNydXNoMTEgW0dlRm9yY2UyIE1YIEludGVncmF0ZWQgR3JhcGhpY3NdCi0JMDFhNCAgbkZvcmNlIENQVSBicmlkZ2UKLQkwMWFiICBuRm9yY2UgNDIwIE1lbW9yeSBDb250cm9sbGVyIChERFIpCi0JMDFhYyAgbkZvcmNlIDIyMC80MjAgTWVtb3J5IENvbnRyb2xsZXIKLQkwMWFkICBuRm9yY2UgMjIwLzQyMCBNZW1vcnkgQ29udHJvbGxlcgotCTAxYjAgIG5Gb3JjZSBBdWRpbwotCTAxYjEgIG5Gb3JjZSBBdWRpbwotCTAxYjIgIG5Gb3JjZSBJU0EgQnJpZGdlCi0JMDFiNCAgbkZvcmNlIFBDSSBTeXN0ZW0gTWFuYWdlbWVudAotCTAxYjcgIG5Gb3JjZSBBR1AgdG8gUENJIEJyaWRnZQotCTAxYjggIG5Gb3JjZSBQQ0ktdG8tUENJIGJyaWRnZQotCTAxYmMgIG5Gb3JjZSBJREUKLQkwMWMxICBuRm9yY2UgQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCTAxYzIgIG5Gb3JjZSBVU0IgQ29udHJvbGxlcgotCTAxYzMgIG5Gb3JjZSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDFlMCAgbkZvcmNlMiBBR1AgKGRpZmZlcmVudCB2ZXJzaW9uPykKLQkwMWU4ICBuRm9yY2UyIEFHUAotCTAxZWEgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMAotCTAxZWIgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMQotCTAxZWMgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMgotCTAxZWQgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgMwotCTAxZWUgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgNAotCTAxZWYgIG5Gb3JjZTIgTWVtb3J5IENvbnRyb2xsZXIgNQotCTAxZjAgIE5WMTggW0dlRm9yY2U0IE1YIC0gbkZvcmNlIEdQVV0KLQkwMjAwICBOVjIwIFtHZUZvcmNlM10KLQkJMTA0MyA0MDJmICBBR1AtVjgyMDAgRERSCi0JMDIwMSAgTlYyMCBbR2VGb3JjZTMgVGkgMjAwXQotCTAyMDIgIE5WMjAgW0dlRm9yY2UzIFRpIDUwMF0KLQkJMTA0MyA0MDViICBWODIwMCBUNQotCQkxNTQ1IDAwMmYgIFh0YXN5IDY5NjQKLQkwMjAzICBOVjIwRENDIFtRdWFkcm8gRENDXQotCTAyNDAgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjQxICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0MiAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNDMgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjQ0ICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0NSAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNDYgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjQ3ICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0OCAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNDkgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjRhICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0YiAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNGMgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjRkICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDI0ZSAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyNGYgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMjUwICBOVjI1IFtHZUZvcmNlNCBUaSA0NjAwXQotCTAyNTEgIE5WMjUgW0dlRm9yY2U0IFRpIDQ0MDBdCi0JCTEwNDMgODAyMyAgdjg0NDAgR2VGb3JjZSA0IFRpNDQwMAotCTAyNTIgIE5WMjUgW0dlRm9yY2U0IFRpXQotCTAyNTMgIE5WMjUgW0dlRm9yY2U0IFRpIDQyMDBdCi0JCTEwN2QgMjg5NiAgV2luRmFzdCBBMjUwIExFIFREIChEdWFsIFZHQS9UVi1vdXQvRFZJKQotCQkxNDdiIDhmMDkgIFNpbHVybyAoRHVhbCBWR0EvVFYtb3V0L0RWSSkKLQkwMjU4ICBOVjI1R0wgW1F1YWRybzQgOTAwIFhHTF0KLQkwMjU5ICBOVjI1R0wgW1F1YWRybzQgNzUwIFhHTF0KLQkwMjViICBOVjI1R0wgW1F1YWRybzQgNzAwIFhHTF0KLQkwMjYwICBNQ1A1MSBMUEMgQnJpZGdlCi0JMDI2MSAgTUNQNTEgTFBDIEJyaWRnZQotCTAyNjIgIE1DUDUxIExQQyBCcmlkZ2UKLQkwMjYzICBNQ1A1MSBMUEMgQnJpZGdlCi0JMDI2NCAgTUNQNTEgU01CdXMKLQkwMjY1ICBNQ1A1MSBJREUKLQkwMjY2ICBNQ1A1MSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMjY3ICBNQ1A1MSBTZXJpYWwgQVRBIENvbnRyb2xsZXIKLQkwMjY4ICBNQ1A1MSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDI2OSAgTUNQNTEgRXRoZXJuZXQgQ29udHJvbGxlcgotCTAyNmEgIE1DUDUxIE1DSQotCTAyNmIgIE1DUDUxIEFDOTcgQXVkaW8gQ29udHJvbGxlcgotCTAyNmMgIE1DUDUxIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbwotCTAyNmQgIE1DUDUxIFVTQiBDb250cm9sbGVyCi0JMDI2ZSAgTUNQNTEgVVNCIENvbnRyb2xsZXIKLQkwMjZmICBNQ1A1MSBQQ0kgQnJpZGdlCi0JMDI3MCAgTUNQNTEgSG9zdCBCcmlkZ2UKLQkwMjcxICBNQ1A1MSBQTVUKLQkwMjcyICBNQ1A1MSBNZW1vcnkgQ29udHJvbGxlciAwCi0JMDI3ZSAgQzUxIE1lbW9yeSBDb250cm9sbGVyIDIKLQkwMjdmICBDNTEgTWVtb3J5IENvbnRyb2xsZXIgMwotCTAyODAgIE5WMjggW0dlRm9yY2U0IFRpIDQ4MDBdCi0JMDI4MSAgTlYyOCBbR2VGb3JjZTQgVGkgNDIwMCBBR1AgOHhdCi0JMDI4MiAgTlYyOCBbR2VGb3JjZTQgVGkgNDgwMCBTRV0KLQkwMjg2ICBOVjI4IFtHZUZvcmNlNCBUaSA0MjAwIEdvIEFHUCA4eF0KLQkwMjg4ICBOVjI4R0wgW1F1YWRybzQgOTgwIFhHTF0KLQkwMjg5ICBOVjI4R0wgW1F1YWRybzQgNzgwIFhHTF0KLQkwMjhjICBOVjI4R0xNIFtRdWFkcm80IDcwMCBHb0dMXQotCTAyZjAgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjEgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjIgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjMgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjQgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjUgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjYgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjcgIEM1MSBIb3N0IEJyaWRnZQotCTAyZjggIEM1MSBNZW1vcnkgQ29udHJvbGxlciA1Ci0JMDJmOSAgQzUxIE1lbW9yeSBDb250cm9sbGVyIDQKLQkwMmZhICBDNTEgTWVtb3J5IENvbnRyb2xsZXIgMAotCTAyZmIgIEM1MSBQQ0kgRXhwcmVzcyBCcmlkZ2UKLQkwMmZjICBDNTEgUENJIEV4cHJlc3MgQnJpZGdlCi0JMDJmZCAgQzUxIFBDSSBFeHByZXNzIEJyaWRnZQotCTAyZmUgIEM1MSBNZW1vcnkgQ29udHJvbGxlciAxCi0JMDJmZiAgQzUxIEhvc3QgQnJpZGdlCi0JMDMwMCAgTlYzMCBbR2VGb3JjZSBGWF0KLQkwMzAxICBOVjMwIFtHZUZvcmNlIEZYIDU4MDAgVWx0cmFdCi0JMDMwMiAgTlYzMCBbR2VGb3JjZSBGWCA1ODAwXQotCTAzMDggIE5WMzBHTCBbUXVhZHJvIEZYIDIwMDBdCi0JMDMwOSAgTlYzMEdMIFtRdWFkcm8gRlggMTAwMF0KLQkwMzExICBOVjMxIFtHZUZvcmNlIEZYIDU2MDAgVWx0cmFdCi0JMDMxMiAgTlYzMSBbR2VGb3JjZSBGWCA1NjAwXQotCTAzMTMgIE5WMzEKLQkwMzE0ICBOVjMxIFtHZUZvcmNlIEZYIDU2MDBYVF0KLQkJMTA0MyA4MTRhICBWOTU2MFhUL1RECi0JMDMxNiAgTlYzMQotCTAzMTcgIE5WMzEKLQkwMzFhICBOVjMxTSBbR2VGb3JjZSBGWCBHbyA1NjAwXQotCTAzMWIgIE5WMzFNIFtHZUZvcmNlIEZYIEdvNTY1MF0KLQkwMzFjICBOVklESUEgUXVhZHJvIEZYIDcwMCBHbwotCTAzMWQgIE5WMzEKLQkwMzFlICBOVjMxCi0JMDMxZiAgTlYzMQotCTAzMjAgIE5WMzQgW0dlRm9yY2UgRlggNTIwMF0KLQkwMzIxICBOVjM0IFtHZUZvcmNlIEZYIDUyMDAgVWx0cmFdCi0JMDMyMiAgTlYzNCBbR2VGb3JjZSBGWCA1MjAwXQotCQkxNDYyIDkxNzEgIE1TLTg5MTcgKEZYNTIwMC1UMTI4KQotCTAzMjMgIE5WMzQgW0dlRm9yY2UgRlggNTIwMExFXQotCTAzMjQgIE5WMzRNIFtHZUZvcmNlIEZYIEdvIDUyMDBdCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCTAzMjUgIE5WMzRNIFtHZUZvcmNlIEZYIEdvNTI1MF0KLQkwMzI2ICBOVjM0IFtHZUZvcmNlIEZYIDU1MDBdCi0JMDMyNyAgTlYzNCBbR2VGb3JjZSBGWCA1MTAwXQotCTAzMjggIE5WMzRNIFtHZUZvcmNlIEZYIEdvIDUyMDBdCi0JMDMyOSAgTlYzNE0gW0dlRm9yY2UgRlggR281MjAwXQotCTAzMmEgIE5WMzRHTCBbUXVhZHJvIE5WUyAyODAgUENJXQotCTAzMmIgIE5WMzRHTCBbUXVhZHJvIEZYIDUwMC82MDAgUENJXQotCTAzMmMgIE5WMzRHTE0gW0dlRm9yY2UgRlggR28gNTMwMF0KLQkwMzJkICBOVjM0IFtHZUZvcmNlIEZYIEdvNTEwMF0KLQkwMzJmICBOVjM0Ci0JMDMzMCAgTlYzNSBbR2VGb3JjZSBGWCA1OTAwIFVsdHJhXQotCTAzMzEgIE5WMzUgW0dlRm9yY2UgRlggNTkwMF0KLQkJMTA0MyA4MTQ1ICBWOTk1MEdFCi0JMDMzMiAgTlYzNSBbR2VGb3JjZSBGWCA1OTAwWFRdCi0JMDMzMyAgTlYzOCBbR2VGb3JjZSBGWCA1OTUwIFVsdHJhXQotCTAzMzQgIE5WMzUgW0dlRm9yY2UgRlggNTkwMFpUXQotCTAzMzggIE5WMzVHTCBbUXVhZHJvIEZYIDMwMDBdCi0JMDMzZiAgTlYzNUdMIFtRdWFkcm8gRlggNzAwXQotCTAzNDEgIE5WMzYuMSBbR2VGb3JjZSBGWCA1NzAwIFVsdHJhXQotCTAzNDIgIE5WMzYuMiBbR2VGb3JjZSBGWCA1NzAwXQotCTAzNDMgIE5WMzYgW0dlRm9yY2UgRlggNTcwMExFXQotCTAzNDQgIE5WMzYuNCBbR2VGb3JjZSBGWCA1NzAwVkVdCi0JMDM0NSAgTlYzNi41Ci0JMDM0NyAgTlYzNiBbR2VGb3JjZSBGWCBHbzU3MDBdCi0JMDM0OCAgTlYzNiBbR2VGb3JjZSBGWCBHbzU3MDBdCi0JMDM0OSAgTlYzNgotCTAzNGIgIE5WMzYKLQkwMzRjICBOVjM2IFtRdWFkcm8gRlggR28xMDAwXQotCTAzNGUgIE5WMzZHTCBbUXVhZHJvIEZYIDExMDBdCi0JMDM0ZiAgTlYzNkdMCi0xMGRmICBFbXVsZXggQ29ycG9yYXRpb24KLQkxYWU1ICBMUDYwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQkxYWU2ICBMUCA4MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQkxYWU3ICBMUCA4MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjItMykKLQlmMDA1ICBMUDExNTBlIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjA4NSAgTFA4NTAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmMDk1ICBMUDk1MiBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotCWYwOTggIExQOTgyIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjBhNSAgTFAxMDUwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjBkNSAgTFAxMTUwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZjEwMCAgTFAxMTAwMGUgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmNzAwICBMUDcwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmNzAxICBMUCA3MDAwRUZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQlmODAwICBMUDgwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmODAxICBMUCA4MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQlmOTAwICBMUDkwMDAgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmOTAxICBMUCA5MDAwIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRCAoSlgxOjItMywgSlgyOjEtMikKLQlmOTgwICBMUDk4MDIgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIKLQlmOTgxICBMUCA5ODAyIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyIEFsdGVybmF0ZSBJRAotCWY5ODIgIExQIDk4MDIgRmlicmUgQ2hhbm5lbCBIb3N0IEFkYXB0ZXIgQWx0ZXJuYXRlIElECi0JZmEwMCAgTFAxMDAwMCBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotCWZhMDEgIExQMTAxIEZpYnJlIENoYW5uZWwgSG9zdCBBZGFwdGVyCi0JZmQwMCAgTFAxMTAwMCBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlcgotMTBlMCAgSW50ZWdyYXRlZCBNaWNybyBTb2x1dGlvbnMgSW5jLgotCTUwMjYgIElNUzUwMjYvMjcvMjgKLQk1MDI3ICBJTVM1MDI3Ci0JNTAyOCAgSU1TNTAyOAotCTg4NDkgIElNUzg4NDkKLQk4ODUzICBJTVM4ODUzCi0JOTEyOCAgSU1TOTEyOCBbVHdpbiB0dXJibyAxMjhdCi0xMGUxICBUZWtyYW0gVGVjaG5vbG9neSBDby4sTHRkLgotCTAzOTEgIFRSTS1TMTA0MAotCQkxMGUxIDAzOTEgIERDLTMxNVUgU0NTSS0zIEhvc3QgQWRhcHRlcgotCTY5MGMgIERDLTY5MGMKLQlkYzI5ICBEQy0yOTAKLTEwZTIgIEFwdGl4IENvcnBvcmF0aW9uCi0xMGUzICBUdW5kcmEgU2VtaWNvbmR1Y3RvciBDb3JwLgotCTAwMDAgIENBOTFDMDQyIFtVbml2ZXJzZV0KLQkwODYwICBDQTkxQzg2MCBbUVNwYW5dCi0JMDg2MiAgQ0E5MUM4NjJBIFtRU3Bhbi1JSV0KLQk4MjYwICBDQTkxTDgyMDBCIFtEdWFsIFBDSSBQb3dlclNwYW4gSUldCi0JODI2MSAgQ0E5MUw4MjYwQiBbU2luZ2xlIFBDSSBQb3dlclNwYW4gSUldCi0xMGU0ICBUYW5kZW0gQ29tcHV0ZXJzCi0xMGU1ICBNaWNybyBJbmR1c3RyaWVzIENvcnBvcmF0aW9uCi0xMGU2ICBHYWluYmVyeSBDb21wdXRlciBQcm9kdWN0cyBJbmMuCi0xMGU3ICBWYWRlbQotMTBlOCAgQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3JwLgotCTEwNzIgIElORVMgR1BJQi1QQ0kgKEFNQ0M1OTIwIGJhc2VkKQotCTIwMTEgIFEtTW90aW9uIFZpZGVvIENhcHR1cmUvRWRpdCBib2FyZAotCTQ3NTAgIFM1OTMwIFtNYXRjaG1ha2VyXQotCTU5MjAgIFM1OTIwCi0JODA0MyAgTEFOYWk0LnggW015cmluZXQgTEFOYWkgaW50ZXJmYWNlIGNoaXBdCi0JODA2MiAgUzU5MzNfUEFSQVNUQVRJT04KLQk4MDdkICBTNTkzMyBbTWF0Y2htYWtlcl0KLQk4MDg4ICBLb25nc2JlcmcgU3BhY2V0ZWMgRm9ybWF0IFN5bmNocm9uaXplcgotCTgwODkgIEtvbmdzYmVyZyBTcGFjZXRlYyBTZXJpYWwgT3V0cHV0IEJvYXJkCi0JODA5YyAgUzU5MzNfSEVQQzMKLQk4MGQ3ICBQQ0ktOTExMgotCTgwZDkgIFBDSS05MTE4Ci0JODBkYSAgUENJLTk4MTIKLQk4MTFhICBQQ0ktSUVFRTEzNTUtRFMtREUgSW50ZXJmYWNlCi0JODE0YyAgRmFzdGNvbSBFU0NDLVBDSSAoQ29tbXRlY2gsIEluYy4pCi0JODE3MCAgUzU5MzMgW01hdGNobWFrZXJdIChDaGlwc2V0IERldmVsb3BtZW50IFRvb2wpCi0jIHNvbGQgd2l0aCBSb3BlciBTY2llbnRpZmMoUGhvdG9tZXRyaWNzKSBDb29sU25hcCBIUSBjYW1lcmEKLQk4MWU2ICBNdWx0aW1lZGlhIHZpZGVvIGNvbnRyb2xsZXIKLQk4MjkxICBGYXN0Y29tIDIzMi84LVBDSSAoQ29tbXRlY2gsIEluYy4pCi0JODJjNCAgRmFzdGNvbSA0MjIvNC1QQ0kgKENvbW10ZWNoLCBJbmMuKQotCTgyYzUgIEZhc3Rjb20gNDIyLzItUENJIChDb21tdGVjaCwgSW5jLikKLQk4MmM2ICBGYXN0Y29tIElHNDIyLzEtUENJIChDb21tdGVjaCwgSW5jLikKLQk4MmM3ICBGYXN0Y29tIElHMjMyLzItUENJIChDb21tdGVjaCwgSW5jLikKLQk4MmNhICBGYXN0Y29tIDIzMi80LVBDSSAoQ29tbXRlY2gsIEluYy4pCi0JODJkYiAgQUpBIEhETlRWIEhEIFNESSBGcmFtZXN0b3JlCi0JODJlMiAgRmFzdGNvbSBESU8yNEgtUENJIChDb21tdGVjaCwgSW5jLikKLQk4ODUxICBTNTkzMyBvbiBJbm5lcyBDb3JwIEZNIFJhZGlvIENhcHR1cmUgY2FyZAotMTBlOSAgQWxwcyBFbGVjdHJpYyBDby4sIEx0ZC4KLTEwZWEgIEludGVyZ3JhcGhpY3MgU3lzdGVtcwotCTE2ODAgIElHQS0xNjgwCi0JMTY4MiAgSUdBLTE2ODIKLQkxNjgzICBJR0EtMTY4MwotCTIwMDAgIEN5YmVyUHJvIDIwMDAKLQkyMDEwICBDeWJlclBybyAyMDAwQQotCTUwMDAgIEN5YmVyUHJvIDUwMDAKLQk1MDUwICBDeWJlclBybyA1MDUwCi0JNTIwMiAgQ3liZXJQcm8gNTIwMgotIyBDeWJlclBybzUyMDIgQXVkaW8gRnVuY3Rpb24KLQk1MjUyICBDeWJlclBybzUyNTIKLTEwZWIgIEFydGlzdHMgR3JhcGhpY3MKLQkwMTAxICAzR0EKLQk4MTExICBUd2lzdDMgRnJhbWUgR3JhYmJlcgotMTBlYyAgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvLiwgTHRkLgotCTgwMjkgIFJUTC04MDI5KEFTKQotCQkxMGI4IDIwMTEgIEVaLUNhcmQgKFNNQzEyMDgpCi0JCTEwZWMgODAyOSAgUlRMLTgwMjkoQVMpCi0JCTExMTMgMTIwOCAgRU4xMjA4Ci0JCTExODYgMDMwMCAgREUtNTI4Ci0JCTEyNTkgMjQwMCAgQVQtMjQwMAotCTgxMjkgIFJUTC04MTI5Ci0JCTEwZWMgODEyOSAgUlQ4MTI5IEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCTgxMzggIFJUODEzOSAoQi9DKSBDYXJkYnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMGVjIDgxMzggIFJUODEzOSAoQi9DKSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQk4MTM5ICBSVEwtODEzOS84MTM5Qy84MTM5QysKLQkJMDM1NyAwMDBhICBUVFAtTW9uaXRvcmluZyBDYXJkIFYyLjAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI1IDg5MjAgIEFMTi0zMjUKLQkJMTAyNSA4OTIxICBBTE4tMzI1Ci0JCTEwNzEgODE2MCAgTUlNMjAwMAotCQkxMGJkIDAzMjAgIEVQLTMyMFgtUgotCQkxMGVjIDgxMzkgIFJUODEzOQotCQkxMTEzIGVjMDEgIEZOQy0wMTA3VFgKLQkJMTE4NiAxMzAwICBERkUtNTM4VFgKLQkJMTE4NiAxMzIwICBTTjUyMDAKLQkJMTE4NiA4MTM5ICBEUk4tMzJUWAotCQkxMWY2IDgxMzkgIEZOMjItMyhBKSBMaW54UFJPIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI1OSAyNTAwICBBVC0yNTAwVFgKLQkJMTI1OSAyNTAzICBBVC0yNTAwVFgvQUNQSQotCQkxNDI5IGQwMTAgIE5EMDEwCi0JCTE0MzIgOTEzMCAgRU4tOTEzMFRYCi0JCTE0MzYgODEzOSAgUlQ4MTM5Ci0JCTE0NTggZTAwMCAgR0EtN1ZNNDAwTS83VlQ2MDAgTW90aGVyYm9hcmQKLQkJMTQ2YyAxNDM5ICBGRS0xNDM5VFgKLQkJMTQ4OSA2MDAxICBHRjEwMFRYUklJCi0JCTE0ODkgNjAwMiAgR0YxMDBUWFJBCi0JCTE0OWMgMTM5YSAgTEZFLTgxMzlBVFgKLQkJMTQ5YyA4MTM5ICBMRkUtODEzOVRYCi0JCTE0Y2IgMDIwMCAgTE5SLTEwMCBGYW1pbHkgMTAvMTAwIEJhc2UtVFggRXRoZXJuZXQKLQkJMTc5OSA1MDAwICBGNUQ1MDAwIFBDSSBDYXJkL0Rlc2t0b3AgTmV0d29yayBQQ0kgQ2FyZAotCQkyNjQ2IDAwMDEgIEV0aGVSeAotCQk4ZTJlIDcwMDAgIEtGLTIzMFRYCi0JCThlMmUgNzEwMCAgS0YtMjMwVFgvMgotCQlhMGEwIDAwMDcgIEFMTi0zMjVDCi0JODE2OSAgUlRMLTgxNjkgR2lnYWJpdCBFdGhlcm5ldAotCQkxMjU5IGMxMDcgIENHLUxBUENJR1QKLQkJMTM3MSA0MzRlICBQcm9HLTIwMDBMCi0JCTE0NTggZTAwMCAgR0EtSzhWVDgwMCBQcm8gTW90aGVyYm9hcmQKLQkJMTQ2MiA3MDJjICBLOFQgTkVPIDIgbW90aGVyYm9hcmQKLQk4MTgwICBSVEw4MTgwTCA4MDIuMTFiIE1BQwotCTgxOTcgIFNtYXJ0TEFONTYgNTZLIE1vZGVtCi0xMGVkICBBc2NpaSBDb3Jwb3JhdGlvbgotCTczMTAgIFY3MzEwCi0xMGVlICBYaWxpbnggQ29ycG9yYXRpb24KLQkzZmMwICBSTUUgRGlnaTk2Ci0JM2ZjMSAgUk1FIERpZ2k5Ni84Ci0JM2ZjMiAgUk1FIERpZ2k5Ni84IFBybwotCTNmYzMgIFJNRSBEaWdpOTYvOCBQYWQKLQkzZmM0ICBSTUUgRGlnaTk2NTIgKEhhbW1lcmZhbGwpCi0JM2ZjNSAgUk1FIEhhbW1lcmZhbGwgRFNQCi0JM2ZjNiAgUk1FIEhhbW1lcmZhbGwgRFNQIE1BREkKLQk4MzgxICBFbGxpcHMgU2FudG9zIEZyYW1lIEdyYWJiZXIKLTEwZWYgIFJhY29yZSBDb21wdXRlciBQcm9kdWN0cywgSW5jLgotCTgxNTQgIE04MTV4IFRva2VuIFJpbmcgQWRhcHRlcgotMTBmMCAgUGVyaXRlayBDb3Jwb3JhdGlvbgotMTBmMSAgVHlhbiBDb21wdXRlcgotMTBmMiAgQWNobWUgQ29tcHV0ZXIsIEluYy4KLTEwZjMgIEFsYXJpcywgSW5jLgotMTBmNCAgUy1NT1MgU3lzdGVtcywgSW5jLgotMTBmNSAgTktLIENvcnBvcmF0aW9uCi0JYTAwMSAgTkRSNDAwMCBbTlI0NjAwIEJyaWRnZV0KLTEwZjYgIENyZWF0aXZlIEVsZWN0cm9uaWMgU3lzdGVtcyBTQQotMTBmNyAgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgotMTBmOCAgQWx0b3MgSW5kaWEgTHRkCi0xMGY5ICBQQyBEaXJlY3QKLTEwZmEgIFRydWV2aXNpb24KLQkwMDBjICBUQVJHQSAxMDAwCi0xMGZiICBUaGVzeXMgR2VzZWxsc2NoYWZ0IGb8ciBNaWtyb2VsZWt0cm9uaWsgbWJICi0JMTg2ZiAgVEggNjI1NQotMTBmYyAgSS1PIERhdGEgRGV2aWNlLCBJbmMuCi0jIFdoYXQncyBpbiB0aGUgY2FyZGJ1cyBlbmQgb2YgYSBTb255IEFDUi1BMDEgY2FyZCwgY29tZXMgd2l0aCBuZXdlciBWYWlvIENELVJXIGRyaXZlcwotCTAwMDMgIENhcmRidXMgSURFIENvbnRyb2xsZXIKLQkwMDA1ICBDYXJkYnVzIFNDU0kgQ0JTQyBJSQotMTBmZCAgU295byBDb21wdXRlciwgSW5jCi0xMGZlICBGYXN0IE11bHRpbWVkaWEgQUcKLTEwZmYgIE5DdWJlCi0xMTAwICBKYXp6IE11bHRpbWVkaWEKLTExMDEgIEluaXRpbyBDb3Jwb3JhdGlvbgotCTEwNjAgIElOSS1BMTAwVTJXCi0JOTEwMCAgSU5JLTkxMDAvOTEwMFcKLQk5NDAwICBJTkktOTQwCi0JOTQwMSAgSU5JLTk1MAotCTk1MDAgIDM2MFAKLQk5NTAyICBJbml0aW8gSU5JLTkxMDBVVyBVbHRyYSBXaWRlIFNDU0kgQ29udHJvbGxlciBJTklDLTk1MFAgY2hpcAotMTEwMiAgQ3JlYXRpdmUgTGFicwotCTAwMDIgIFNCIExpdmUhIEVNVTEwazEKLQkJMTEwMiAwMDIwICBDVDQ4NTAgU0JMaXZlISBWYWx1ZQotCQkxMTAyIDAwMjEgIENUNDYyMCBTQkxpdmUhCi0JCTExMDIgMDAyZiAgU0JMaXZlISBtYWluYm9hcmQgaW1wbGVtZW50YXRpb24KLQkJMTEwMiA0MDAxICBFLW11IEFQUwotCQkxMTAyIDgwMjIgIENUNDc4MCBTQkxpdmUhIFZhbHVlCi0JCTExMDIgODAyMyAgQ1Q0NzkwIFNvdW5kQmxhc3RlciBQQ0k1MTIKLQkJMTEwMiA4MDI0ICBDVDQ3NjAgU0JMaXZlIQotCQkxMTAyIDgwMjUgIFNCTGl2ZSEgTWFpbmJvYXJkIEltcGxlbWVudGF0aW9uCi0JCTExMDIgODAyNiAgQ1Q0ODMwIFNCTGl2ZSEgVmFsdWUKLQkJMTEwMiA4MDI3ICBDVDQ4MzIgU0JMaXZlISBWYWx1ZQotCQkxMTAyIDgwMjggIENUNDc2MCBTQkxpdmUhIE9FTSB2ZXJzaW9uCi0JCTExMDIgODAzMSAgQ1Q0ODMxIFNCTGl2ZSEgVmFsdWUKLQkJMTEwMiA4MDQwICBDVDQ3NjAgU0JMaXZlIQotCQkxMTAyIDgwNTEgIENUNDg1MCBTQkxpdmUhIFZhbHVlCi0JCTExMDIgODA2MSAgU0JMaXZlISBQbGF5ZXIgNS4xCi0JCTExMDIgODA2NCAgU0IgTGl2ZSEgNS4xIE1vZGVsIFNCMDEwMAotCQkxMTAyIDgwNjUgIFNCTGl2ZSEgNS4xIERpZ2l0YWwgTW9kZWwgU0IwMjIwCi0JCTExMDIgODA2NyAgU0JMaXZlISA1LjEgZU1pY3JvIDI4MDI4Ci0JMDAwNCAgU0IgQXVkaWd5Ci0JCTExMDIgMDA1MSAgU0IwMDkwIEF1ZGlneSBQbGF5ZXIKLQkJMTEwMiAwMDUzICBTQjAwOTAgQXVkaWd5IFBsYXllci9PRU0KLQkJMTEwMiAwMDU4ICBTQjAwOTAgQXVkaWd5IFBsYXllci9PRU0KLQkJMTEwMiAxMDA3ICBTQjAyNDAgQXVkaWd5IDIgUGxhdGludW0gNi4xCi0JCTExMDIgMjAwMiAgU0IgQXVkaWd5IDIgWlMgKFNCMDM1MCkKLQkwMDA2ICBbU0IgTGl2ZSEgVmFsdWVdIEVNVTEwazFYCi0JMDAwNyAgU0IgQXVkaWd5IExTCi0JCTExMDIgMTAwMSAgU0IwMzEwIEF1ZGlneSBMUwotCQkxMTAyIDEwMDIgIFNCMDMxMiBBdWRpZ3kgTFMKLQkJMTEwMiAxMDA2ICBTQjA0MTAgU0JMaXZlISAyNC1iaXQKLQkwMDA4ICBTQjA0MDAgQXVkaWd5MiBWYWx1ZQotCTQwMDEgIFNCIEF1ZGlneSBGaXJlV2lyZSBQb3J0Ci0JCTExMDIgMDAxMCAgU0IgQXVkaWd5IEZpcmVXaXJlIFBvcnQKLQk3MDAyICBTQiBMaXZlISBNSURJL0dhbWUgUG9ydAotCQkxMTAyIDAwMjAgIEdhbWVwb3J0IEpveXN0aWNrCi0JNzAwMyAgU0IgQXVkaWd5IE1JREkvR2FtZSBwb3J0Ci0JCTExMDIgMDA0MCAgU0IgQXVkaWd5IE1JREkvR2FtZSBQb3J0Ci0JNzAwNCAgW1NCIExpdmUhIFZhbHVlXSBJbnB1dCBkZXZpY2UgY29udHJvbGxlcgotCTcwMDUgIFNCIEF1ZGlneSBMUyBNSURJL0dhbWUgcG9ydAotCQkxMTAyIDEwMDEgIFNCMDMxMCBBdWRpZ3kgTFMgTUlESS9HYW1lIHBvcnQKLQkJMTEwMiAxMDAyICBTQjAzMTIgQXVkaWd5IExTIE1JREkvR2FtZSBwb3J0Ci0JODA2NCAgU0IwMTAwIFtTQkxpdmUhIDUuMSBPRU1dCi0JODkzOCAgRWN0aXZhIEVWMTkzOAotCQkxMDMzIDgwZTUgIFNsaW1Ub3dlci1KaW0gKE5FQykKLQkJMTA3MSA3MTUwICBNaXRhYyA3MTUwCi0JCTExMGEgNTkzOCAgU2llbWVucyBTY2VuaWMgTW9iaWxlIDUxMFBJSUkKLQkJMTNiZCAxMDBjICBDZXJlcy1DIChTaGFycCwgSW50ZWwgQlgpCi0JCTEzYmQgMTAwZCAgU2hhcnAsIEludGVsIEJhbmlzdGVyCi0JCTEzYmQgMTAwZSAgVHdpbkhlYWQgUDA5Uy9QMDlTMyAoU2hhcnApCi0JCTEzYmQgZjZmMSAgTWFybGluIChTaGFycCkKLQkJMTRmZiAwZTcwICBQODhURSAoVFdJTkhFQUQgSU5URVJOQVRJT05BTCBDb3JwKQotCQkxNGZmIGM0MDEgIE5vdGVib29rIDkxMDAvOTIwMC8yMDAwIChUV0lOSEVBRCBJTlRFUk5BVElPTkFMIENvcnApCi0JCTE1NmQgYjQwMCAgRzQwMCAtIEdlbyAoQWxwaGFUb3AgKFRhaXdhbikpCi0JCTE1NmQgYjU1MCAgRzU2MCAgKEFscGhhVG9wIChUYWl3YW4pKQotCQkxNTZkIGI1NjAgIEc1NjAgIChBbHBoYVRvcCAoVGFpd2FuKSkKLQkJMTU2ZCBiNzAwICBHNzAwL1U3MDAgIChBbHBoYVRvcCAoVGFpd2FuKSkKLQkJMTU2ZCBiNzk1ICBHNzk1ICAoQWxwaGFUb3AgKFRhaXdhbikpCi0JCTE1NmQgYjc5NyAgRzc5NyAgKEFscGhhVG9wIChUYWl3YW4pKQotMTEwMyAgVHJpb25lcyBUZWNobm9sb2dpZXMsIEluYy4KLQkwMDAzICBIUFQzNDMKLQkwMDA0ICBIUFQzNjYvMzY4LzM3MC8zNzBBLzM3Mi8zNzJOCi0JCTExMDMgMDAwMSAgSFBUMzcwQQotCQkxMTAzIDAwMDMgIEhQVDM0MyAvIEhQVDM0NSAvIEhQVDM2MyBVRE1BMzMKLQkJMTEwMyAwMDA0ICBIUFQzNjYgVURNQTY2IChyMSkgLyBIUFQzNjggVURNQTY2IChyMikgLyBIUFQzNzAgVURNQTEwMCAocjMpIC8gSFBUMzcwIFVETUExMDAgUkFJRCAocjQpCi0JCTExMDMgMDAwNSAgSFBUMzcwIFVETUExMDAKLQkJMTEwMyAwMDA2ICBIUFQzMDIKLQkJMTEwMyAwMDA3ICBIUFQzNzEgVURNQTEzMwotCQkxMTAzIDAwMDggIEhQVDM3NCBVRE1BL0FUQTEzMyBSQUlEIENvbnRyb2xsZXIKLQkwMDA1ICBIUFQzNzJBLzM3Mk4KLQkwMDA2ICBIUFQzMDIKLQkwMDA3ICBIUFQzNzEvMzcxTgotCTAwMDggIEhQVDM3NAotCTAwMDkgIEhQVDM3Mk4KLTExMDQgIFJhc3Rlck9wcyBDb3JwLgotMTEwNSAgU2lnbWEgRGVzaWducywgSW5jLgotCTExMDUgIFJFQUxtYWdpYyBYY2FyZCBNUEVHIDEvMi8zLzQgRFZEIERlY29kZXIKLQk4MzAwICBSRUFMbWFnaWMgSG9sbHl3b29kIFBsdXMgRFZEIERlY29kZXIKLQk4NDAwICBFTTg0MHggUkVBTG1hZ2ljIERWRC9NUEVHLTIgQXVkaW8vVmlkZW8gRGVjb2RlcgotCTg0MDEgIEVNODQwMSBSRUFMbWFnaWMgRFZEL01QRUctMiBBL1YgRGVjb2RlcgotCTg0NzAgIEVNODQ3MCBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0NzEgIEVNODQ3MSBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0NzUgIEVNODQ3NSBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0NzYgIEVNODQ3NiBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0ODUgIEVNODQ4NSBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotCTg0ODYgIEVNODQ4NiBSRUFMbWFnaWMgRFZEL01QRUctNCBBL1YgRGVjb2RlcgotMTEwNiAgVklBIFRlY2hub2xvZ2llcywgSW5jLgotCTAxMDIgIEVtYmVkZGVkIFZJQSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMDEzMCAgVlQ2MzA1IDEzOTQuQSBDb250cm9sbGVyCi0JMDMwNSAgVlQ4MzYzLzgzNjUgW0tUMTMzL0tNMTMzXQotCQkxMDQzIDgwMzMgIEE3ViBNYWluYm9hcmQKLQkJMTA0MyA4MDNlICBBN1YtRSBNYWluYm9hcmQKLQkJMTA0MyA4MDQyICBBN1YxMzMvQTdWMTMzLUMgTWFpbmJvYXJkCi0JCTE0N2IgYTQwMSAgS1Q3L0tUNy1SQUlEL0tUN0EvS1Q3QS1SQUlEIE1haW5ib2FyZAotCTAzOTEgIFZUODM3MSBbS1gxMzNdCi0JMDUwMSAgVlQ4NTAxIFtBcG9sbG8gTVZQNF0KLQkwNTA1ICBWVDgyQzUwNQotIyBTaGFyZXMgY2hpcCB3aXRoIDowNTc2LiBUaGUgVlQ4MkM1NzZNIGhhcyA6MTU3MSBpbnN0ZWFkIG9mIDowNTYxLgotCTA1NjEgIFZUODJDNTc2TVYKLQkwNTcxICBWVDgyQzU4NkEvQi9WVDgyQzY4Ni9BL0IvVlQ4MjN4L0EvQyBQSVBDIEJ1cyBNYXN0ZXIgSURFCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwNTIgIFZUODIzM0EgQnVzIE1hc3RlciBBVEExMDAvNjYvMzMgSURFCi0JCTEwNDMgODA4YyAgQTdWOFggbW90aGVyYm9hcmQKLQkJMTA0MyA4MGExICBBN1Y4WC1YIG1vdGhlcmJvYXJkIHJldi4gMS4wMQotCQkxMDQzIDgwZWQgIEE3VjYwMCBtb3RoZXJib2FyZAotCQkxMTA2IDA1NzEgIFZUODJDNTg2L0IvVlQ4MkM2ODYvQS9CL1ZUODIzMy9BL0MvVlQ4MjM1IFBJUEMgQnVzIE1hc3RlciBJREUKLQkJMTE3OSAwMDAxICBNYWduaWEgWjMxMAotCQkxMjk3IGY2NDEgIEZYNDEgbW90aGVyYm9hcmQKLQkJMTQ1OCA1MDAyICBHQS03VkFYIE1haW5ib2FyZAotCQkxNDYyIDcwMjAgIEs4VCBORU8gMiBtb3RoZXJib2FyZAotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JCTE4NDkgMDU3MSAgSzdWVDIgbW90aGVyYm9hcmQKLQkwNTc2ICBWVDgyQzU3NiAzViBbQXBvbGxvIE1hc3Rlcl0KLQkwNTg1ICBWVDgyQzU4NVZQIFtBcG9sbG8gVlAxL1ZQWF0KLQkwNTg2ICBWVDgyQzU4Ni9BL0IgUENJLXRvLUlTQSBbQXBvbGxvIFZQXQotCQkxMTA2IDAwMDAgIE1WUDMgSVNBIEJyaWRnZQotCTA1OTUgIFZUODJDNTk1IFtBcG9sbG8gVlAyXQotCTA1OTYgIFZUODJDNTk2IElTQSBbTW9iaWxlIFNvdXRoXQotCQkxMTA2IDAwMDAgIFZUODJDNTk2L0EvQiBQQ0kgdG8gSVNBIEJyaWRnZQotCQkxNDU4IDA1OTYgIFZUODJDNTk2L0EvQiBQQ0kgdG8gSVNBIEJyaWRnZQotCTA1OTcgIFZUODJDNTk3IFtBcG9sbG8gVlAzXQotCTA1OTggIFZUODJDNTk4IFtBcG9sbG8gTVZQM10KLQkwNjAxICBWVDg2MDEgW0Fwb2xsbyBQcm9NZWRpYV0KLQkwNjA1ICBWVDg2MDUgW1Byb1NhdmFnZSBQTTEzM10KLQkJMTA0MyA4MDJjICBDVVY0WCBtYWluYm9hcmQKLQkwNjgwICBWVDgyQzY4MCBbQXBvbGxvIFA2XQotCTA2ODYgIFZUODJDNjg2IFtBcG9sbG8gU3VwZXIgU291dGhdCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTA0MyA4MDJjICBDVVY0WCBtYWluYm9hcmQKLQkJMTA0MyA4MDMzICBBN1YgTWFpbmJvYXJkCi0JCTEwNDMgODAzZSAgQTdWLUUgTWFpbmJvYXJkCi0JCTEwNDMgODA0MCAgQTdNMjY2IE1haW5ib2FyZAotCQkxMDQzIDgwNDIgIEE3VjEzMy9BN1YxMzMtQyBNYWluYm9hcmQKLQkJMTEwNiAwMDAwICBWVDgyQzY4Ni9BIFBDSSB0byBJU0EgQnJpZGdlCi0JCTExMDYgMDY4NiAgVlQ4MkM2ODYvQSBQQ0kgdG8gSVNBIEJyaWRnZQotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JCTE0N2IgYTcwMiAgS0c3LUxpdGUgTWFpbmJvYXJkCi0JMDY5MSAgVlQ4MkM2OTNBLzY5NHggW0Fwb2xsbyBQUk8xMzN4XQotCQkxMDE5IDA5ODUgIFA2VlhBIE1vdGhlcmJvYXJkCi0JCTExNzkgMDAwMSAgTWFnbmlhIFozMTAKLQkJMTQ1OCAwNjkxICBWVDgyQzY5MSBBcG9sbG8gUHJvIFN5c3RlbSBDb250cm9sbGVyCi0JMDY5MyAgVlQ4MkM2OTMgW0Fwb2xsbyBQcm8gUGx1c10KLQkwNjk4ICBWVDgyQzY5M0EgW0Fwb2xsbyBQcm8xMzMgQUdQXQotCTA5MjYgIFZUODJDOTI2IFtBbWF6b25dCi0JMTAwMCAgVlQ4MkM1NzBNVgotCTExMDYgIFZUODJDNTcwTVYKLQkxNTcxICBWVDgyQzU3Nk0vVlQ4MkM1ODYKLQkxNTk1ICBWVDgyQzU5NS85NyBbQXBvbGxvIFZQMi85N10KLQkzMDIyICBDTEUyNjYKLSMgVGhpcyBpcyAqbm90KiBVU0IgMi4wIGFzIHRoZSBleGlzdGluZyBlbnRyeSBzdWdnZXN0cwotCTMwMzggIFZUODJ4eHh4eCBVSENJIFVTQiAxLjEgQ29udHJvbGxlcgotCQkwOTI1IDEyMzQgIFVTQiBDb250cm9sbGVyCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwOGMgIFZUNjIwMiBVU0IyLjAgNCBwb3J0IGNvbnRyb2xsZXIKLQkJMTA0MyA4MGExICBBN1Y4WC1YIG1vdGhlcmJvYXJkCi0JCTEwNDMgODBlZCAgQTdWNjAwIG1vdGhlcmJvYXJkCi0JCTExNzkgMDAwMSAgTWFnbmlhIFozMTAKLQkJMTQ1OCA1MDA0ICBHQS03VkFYIE1haW5ib2FyZAotCQkxNDYyIDcwMjAgIEs4VCBORU8gMiBtb3RoZXJib2FyZAotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JCTE4MmQgMjAxZCAgQ04tMDI5IFVTQjIuMCA0IHBvcnQgUENJIENhcmQKLQkzMDQwICBWVDgyQzU4NkIgQUNQSQotCTMwNDMgIFZUODZDMTAwQSBbUmhpbmVdCi0JCTEwYmQgMDAwMCAgVlQ4NkMxMDBBIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMTA2IDAxMDAgIFZUODZDMTAwQSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTE4NiAxNDAwICBERkUtNTMwVFggcmV2IEEKLQkzMDQ0ICBJRUVFIDEzOTQgSG9zdCBDb250cm9sbGVyCi0JCTEwMjUgMDA1YSAgVHJhdmVsTWF0ZSAyOTAKLQkJMTQ1OCAxMDAwICBHQS03VlQ2MDAtMTM5NCBNb3RoZXJib2FyZAotCQkxNDYyIDcwMmQgIEs4VCBORU8gMiBtb3RoZXJib2FyZAotCTMwNTAgIFZUODJDNTk2IFBvd2VyIE1hbmFnZW1lbnQKLQkzMDUxICBWVDgyQzU5NiBQb3dlciBNYW5hZ2VtZW50Ci0JMzA1MyAgVlQ2MTA1TSBbUmhpbmUtSUlJXQotCTMwNTcgIFZUODJDNjg2IFtBcG9sbG8gU3VwZXIgQUNQSV0KLQkJMTAxOSAwOTg1ICBQNlZYQSBNb3RoZXJib2FyZAotCQkxMDQzIDgwMzMgIEE3ViBNYWluYm9hcmQKLQkJMTA0MyA4MDNlICBBN1YtRSBNYWluYm9hcmQKLQkJMTA0MyA4MDQwICBBN00yNjYgTWFpbmJvYXJkCi0JCTEwNDMgODA0MiAgQTdWMTMzL0E3VjEzMy1DIE1haW5ib2FyZAotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JMzA1OCAgVlQ4MkM2ODYgQUM5NyBBdWRpbyBDb250cm9sbGVyCi0JCTBlMTEgMDA5NyAgU291bmRNYXggRGlnaXRhbCBJbnRlZ3JhdGVkIEF1ZGlvCi0JCTBlMTEgYjE5NCAgU291bmRtYXggaW50ZWdyYXRlZCBkaWdpdGFsIGF1ZGlvCi0JCTEwMTkgMDk4NSAgUDZWWEEgTW90aGVyYm9hcmQKLQkJMTA0MyAxMTA2ICBBN1YxMzMvQTdWMTMzLUMgTWFpbmJvYXJkCi0JCTExMDYgNDUxMSAgT25ib2FyZCBBdWRpbyBvbiBFUDdLWEEKLQkJMTQ1OCA3NjAwICBPbmJvYXJkIEF1ZGlvCi0JCTE0NjIgMzA5MSAgTVMtNjMwOSBPbmJvYXJkIEF1ZGlvCi0JCTE0NjIgMzMwMCAgTVMtNjMzMCBPbmJvYXJkIEF1ZGlvCi0JCTE1ZGQgNzYwOSAgT25ib2FyZCBBdWRpbwotCTMwNTkgIFZUODIzMy9BLzgyMzUvODIzNyBBQzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwOTUgIEE3VjhYIE1vdGhlcmJvYXJkIChSZWFsdGVrIEFMQzY1MCBjb2RlYykKLQkJMTA0MyA4MGExICBBN1Y4WC1YIE1vdGhlcmJvYXJkCi0JCTEwNDMgODBiMCAgQTdWNjAwL0s4ViBEZWx1eGUgbW90aGVyYm9hcmQgKEFESSBBRDE5ODAgY29kZWMgW1NvdW5kTUFYXSkKLQkJMTEwNiAzMDU5ICBMN1ZNTTIgTW90aGVyYm9hcmQKLQkJMTEwNiA0MTYxICBLN1ZUMiBtb3RoZXJib2FyZAotCQkxMjk3IGMxNjAgIEZYNDEgbW90aGVyYm9hcmQgKFJlYWx0ZWsgQUxDNjUwIGNvZGVjKQotCQkxNDU4IGEwMDIgIEdBLTdWQVggT25ib2FyZCBBdWRpbyAoUmVhbHRlayBBTEM2NTApCi0JCTE0NjIgMDA4MCAgSzhUIE5FTyAyIG1vdGhlcmJvYXJkCi0JCTE0NjIgMzgwMCAgS1QyNjYgb25ib2FyZCBhdWRpbwotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JMzA2NSAgVlQ2MTAyIFtSaGluZS1JSV0KLQkJMTA0MyA4MGExICBBN1Y4WC1YIE1vdGhlcmJvYXJkCi0JCTExMDYgMDEwMiAgVlQ2MTAyIFtSaGluZSBJSV0gRW1iZWRlZCBFdGhlcm5ldCBDb250cm9sbGVyIG9uIFZUODIzNQotCQkxMTg2IDE0MDAgIERGRS01MzBUWCByZXYgQQotCQkxMTg2IDE0MDEgIERGRS01MzBUWCByZXYgQgotCQkxM2I5IDE0MjEgIExELTEwLzEwMEFMIFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgKHJldi5CKQotIyBUaGlzIGhvc3RzIG1vcmUgdGhhbiBqdXN0IHRoZSBJbnRlbCA1MzcgY29kZWMsIGl0IGFsc28gaG9zdHMgUEN0ZWwgKFNJTDMzKSBhbmQgU21hcnRMaW5rIChTSUwzNCkgY29kZWNzCi0JMzA2OCAgQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCQkxNDYyIDMwOWUgIE1TLTYzMDkgU2F0dXJuIE1vdGhlcmJvYXJkCi0JMzA3NCAgVlQ4MjMzIFBDSSB0byBJU0EgQnJpZGdlCi0JCTEwNDMgODA1MiAgVlQ4MjMzQQotCTMwOTEgIFZUODYzMyBbQXBvbGxvIFBybzI2Nl0KLQkzMDk5ICBWVDgzNjYvQS83IFtBcG9sbG8gS1QyNjYvQS8zMzNdCi0JCTEwNDMgODA2NCAgQTdWMjY2LUUgTWFpbmJvYXJkCi0JCTEwNDMgODA3ZiAgQTdWMzMzIE1haW5ib2FyZAotCQkxODQ5IDMwOTkgIEs3VlQyIG1vdGhlcmJvYXJkCi0JMzEwMSAgVlQ4NjUzIEhvc3QgQnJpZGdlCi0JMzEwMiAgVlQ4NjYyIEhvc3QgQnJpZGdlCi0JMzEwMyAgVlQ4NjE1IEhvc3QgQnJpZGdlCi0JMzEwNCAgVVNCIDIuMAotCQkxMDE5IDBhODEgIEw3VlRBIHYxLjAgTW90aGVyYm9hcmQgKEtUNDAwLTgyMzUpCi0JCTEwNDMgODA4YyAgQTdWOFggbW90aGVyYm9hcmQKLQkJMTA0MyA4MGExICBBN1Y4WC1YIG1vdGhlcmJvYXJkIHJldiAxLjAxCi0JCTEwNDMgODBlZCAgQTdWNjAwIG1vdGhlcmJvYXJkCi0JCTEyOTcgZjY0MSAgRlg0MSBtb3RoZXJib2FyZAotCQkxNDU4IDUwMDQgIEdBLTdWQVggTWFpbmJvYXJkCi0JCTE0NjIgNzAyMCAgSzhUIE5FTyAyIG1vdGhlcmJvYXJkCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkJMTgyZCAyMDFkICBDTi0wMjkgVVNCIDIuMCA0IHBvcnQgUENJIENhcmQKLQkzMTA2ICBWVDYxMDUgW1JoaW5lLUlJSV0KLQkJMTE4NiAxNDAzICBERkUtNTMwVFggcmV2IEMKLQkzMTA4ICBTMyBVbmljaHJvbWUgUHJvIFZHQSBBZGFwdGVyCi0JMzEwOSAgVlQ4MjMzQyBQQ0kgdG8gSVNBIEJyaWRnZQotCTMxMTIgIFZUODM2MSBbS0xFMTMzXSBIb3N0IEJyaWRnZQotCTMxMTYgIFZUODM3NSBbS00yNjYvS0wyNjZdIEhvc3QgQnJpZGdlCi0JCTEyOTcgZjY0MSAgRlg0MSBtb3RoZXJib2FyZAotCTMxMTggIFMzIFVuaWNocm9tZSBQcm8gVkdBIEFkYXB0ZXIKLQkzMTE5ICBWVDYxMjAvVlQ2MTIxL1ZUNjEyMiBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLSMgZm91bmQgb24gRVBJQSBNNjAwMC85MDAwIG1haW5ib2FyZAotCTMxMjIgIFZUODYyMyBbQXBvbGxvIENMRTI2Nl0gaW50ZWdyYXRlZCBDYXN0bGVSb2NrIGdyYXBoaWNzCi0jIGZvdW5kIG9uIEVQSUEgTTYwMDAvOTAwMCBtYWluYm9hcmQKLQkzMTIzICBWVDg2MjMgW0Fwb2xsbyBDTEUyNjZdCi0JMzEyOCAgVlQ4NzUzIFtQNFgyNjYgQUdQXQotCTMxMzMgIFZUMzEzMyBIb3N0IEJyaWRnZQotCTMxNDcgIFZUODIzM0EgSVNBIEJyaWRnZQotCTMxNDggIFA0TTI2NiBIb3N0IEJyaWRnZQotCTMxNDkgIFZJQSBWVDY0MjAgU0FUQSBSQUlEIENvbnRyb2xsZXIKLQkJMTA0MyA4MGVkICBBN1Y2MDAvSzhWIERlbHV4ZSBtb3RoZXJib2FyZAotCQkxNDU4IGIwMDMgIEdBLTdWTTQwMEFNKEYpIE1vdGhlcmJvYXJkCi0JCTE0NjIgNzAyMCAgSzhUIE5lbyAyIE1vdGhlcmJvYXJkCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkzMTU2ICBQL0tOMjY2IEhvc3QgQnJpZGdlCi0jIG9uIEFTVVMgUDRQODAwCi0JMzE2NCAgVlQ2NDEwIEFUQTEzMyBSQUlEIGNvbnRyb2xsZXIKLQkzMTY4ICBWVDgzNzQgUDRYNDAwIEhvc3QgQ29udHJvbGxlci9BR1AgQnJpZGdlCi0JMzE3NyAgVlQ4MjM1IElTQSBCcmlkZ2UKLQkJMTAxOSAwYTgxICBMN1ZUQSB2MS4wIE1vdGhlcmJvYXJkIChLVDQwMC04MjM1KQotCQkxMDQzIDgwOGMgIEE3VjhYIG1vdGhlcmJvYXJkCi0JCTEwNDMgODBhMSAgQTdWOFgtWCBtb3RoZXJib2FyZAotCQkxMjk3IGY2NDEgIEZYNDEgbW90aGVyYm9hcmQKLQkJMTQ1OCA1MDAxICBHQS03VkFYIE1haW5ib2FyZAotCQkxODQ5IDMxNzcgIEs3VlQyIG1vdGhlcmJvYXJkCi0JMzE3OCAgUHJvU2F2YWdlRERSIFA0TjMzMyBIb3N0IEJyaWRnZQotCTMxODggIFZUODM4NSBbSzhUODAwIEFHUF0gSG9zdCBCcmlkZ2UKLQkJMTA0MyA4MGEzICBLOFYgRGVsdXhlIG1vdGhlcmJvYXJkCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQkzMTg5ICBWVDgzNzcgW0tUNDAwL0tUNjAwIEFHUF0gSG9zdCBCcmlkZ2UKLQkJMTA0MyA4MDdmICBBN1Y4WCBtb3RoZXJib2FyZAotCQkxNDU4IDUwMDAgIEdBLTdWQVggTWFpbmJvYXJkCi0JMzIwNCAgSzhNODAwCi0JMzIwNSAgVlQ4Mzc4IFtLTTQwMC9BXSBDaGlwc2V0IEhvc3QgQnJpZGdlCi0JCTE0NTggNTAwMCAgR0EtN1ZNNDAwTSBNb3RoZXJib2FyZAotCTMyMTggIEs4VDgwME0gSG9zdCBCcmlkZ2UKLQkzMjI3ICBWVDgyMzcgSVNBIGJyaWRnZSBbS1Q2MDAvSzhUODAwIFNvdXRoXQotCQkxMDQzIDgwZWQgIEE3VjYwMCBtb3RoZXJib2FyZAotCQkxMTA2IDMyMjcgIERGSSBLVDYwMC1BTCBNb3RoZXJib2FyZAotCQkxNDU4IDUwMDEgIEdBLTdWVDYwMCBNb3RoZXJib2FyZAotCQkxNDdiIDE0MDcgIEtWOC1NQVgzIG1vdGhlcmJvYXJkCi0JMzI0OSAgVlQ2NDIxIElERSBSQUlEIENvbnRyb2xsZXIKLQk0MTQ5ICBWSUEgVlQ2NDIwIChBVEExMzMpIENvbnRyb2xsZXIKLQk1MDMwICBWVDgyQzU5NiBBQ1BJIFtBcG9sbG8gUFJPXQotCTYxMDAgIFZUODVDMTAwQSBbUmhpbmUgSUldCi0JNzIwNCAgSzhNODAwCi0jIFMzIEdyYXBoaWNzIFVuaUNocm9tZeKEoiAyRC8zRCBHcmFwaGljcyB3aXRoIG1vdGlvbiBjb21wZW5zYXRpb24KLQk3MjA1ICBWVDgzNzggW1MzIFVuaUNocm9tZV0gSW50ZWdyYXRlZCBWaWRlbwotCQkxNDU4IGQwMDAgIEdpZ2FieXRlIEdBLTdWTTQwMChBKU0oRikgTW90aGVyYm9hcmQKLQk4MjMxICBWVDgyMzEgW1BDSS10by1JU0EgQnJpZGdlXQotCTgyMzUgIFZUODIzNSBBQ1BJCi0JODMwNSAgVlQ4MzYzLzgzNjUgW0tUMTMzL0tNMTMzIEFHUF0KLQk4MzkxICBWVDgzNzEgW0tYMTMzIEFHUF0KLQk4NTAxICBWVDg1MDEgW0Fwb2xsbyBNVlA0IEFHUF0KLQk4NTk2ICBWVDgyQzU5NiBbQXBvbGxvIFBSTyBBR1BdCi0JODU5NyAgVlQ4MkM1OTcgW0Fwb2xsbyBWUDMgQUdQXQotCTg1OTggIFZUODJDNTk4LzY5NHggW0Fwb2xsbyBNVlAzL1BybzEzM3ggQUdQXQotCQkxMDE5IDA5ODUgIFA2VlhBIE1vdGhlcmJvYXJkCi0JODYwMSAgVlQ4NjAxIFtBcG9sbG8gUHJvTWVkaWEgQUdQXQotCTg2MDUgIFZUODYwNSBbUE0xMzMgQUdQXQotCTg2OTEgIFZUODJDNjkxIFtBcG9sbG8gUHJvXQotCTg2OTMgIFZUODJDNjkzIFtBcG9sbG8gUHJvIFBsdXNdIFBDSSBCcmlkZ2UKLQliMDkxICBWVDg2MzMgW0Fwb2xsbyBQcm8yNjYgQUdQXQotCWIwOTkgIFZUODM2Ni9BLzcgW0Fwb2xsbyBLVDI2Ni9BLzMzMyBBR1BdCi0JYjEwMSAgVlQ4NjUzIEFHUCBCcmlkZ2UKLQliMTAyICBWVDgzNjIgQUdQIEJyaWRnZQotCWIxMDMgIFZUODYxNSBBR1AgQnJpZGdlCi0JYjExMiAgVlQ4MzYxIFtLTEUxMzNdIEFHUCBCcmlkZ2UKLQliMTY4ICBWVDgyMzUgUENJIEJyaWRnZQotCWIxODggIFZUODIzNyBQQ0kgYnJpZGdlIFtLOFQ4MDAgU291dGhdCi0JCTE0N2IgMTQwNyAgS1Y4LU1BWDMgbW90aGVyYm9hcmQKLQliMTk4ICBWVDgyMzcgUENJIEJyaWRnZQotIyAzMi1CaXQgUENJIGJ1cyBtYXN0ZXIgRXRoZXJuZXQgTUFDIHdpdGggc3RhbmRhcmQgTUlJIGludGVyZmFjZQotCWQxMDQgIFZUODIzNyBJbnRlZ3JhdGVkIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlcgotMTEwNyAgU3RyYXR1cyBDb21wdXRlcnMKLQkwNTc2ICBWSUEgVlQ4MkM1NzBNViBbQXBvbGxvXSAoV3JvbmcgdmVuZG9yIElEISkKLTExMDggIFByb3Rlb24sIEluYy4KLQkwMTAwICBwMTY5MHBsdXNfQUEKLQkwMTAxICBwMTY5MHBsdXNfQUIKLQkwMTA1ICBQMTY5MFBsdXMKLQkwMTA4ICBQMTY5MFBsdXMKLQkwMTM4ICBQMTY5MFBsdXMKLQkwMTM5ICBQMTY5MFBsdXMKLQkwMTNjICBQMTY5MFBsdXMKLQkwMTNkICBQMTY5MFBsdXMKLTExMDkgIENvZ2VudCBEYXRhIFRlY2hub2xvZ2llcywgSW5jLgotCTE0MDAgIEVNMTEwVFggW0VYMTEwVFhdCi0xMTBhICBTaWVtZW5zIE5peGRvcmYgQUcKLQkwMDAyICBQaXJhaG5hIDItcG9ydAotCTAwMDUgIFR1bGlwIGNvbnRyb2xsZXIsIHBvd2VyIG1hbmFnZW1lbnQsIHN3aXRjaCBleHRlbmRlcgotCTAwMDYgIEZTQyBQSU5DIChJL08tQVBJQykKLQkwMDE1ICBGU0MgTXVsdGlwcm9jZXNzb3IgSW50ZXJydXB0IENvbnRyb2xsZXIKLQkwMDFkICBGU0MgQ29wZXJuaWN1cyBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQkwMDdiICBGU0MgUmVtb3RlIFNlcnZpY2UgQ29udHJvbGxlciwgbWFpbGJveCBkZXZpY2UKLQkwMDdjICBGU0MgUmVtb3RlIFNlcnZpY2UgQ29udHJvbGxlciwgc2hhcmVkIG1lbW9yeSBkZXZpY2UKLQkwMDdkICBGU0MgUmVtb3RlIFNlcnZpY2UgQ29udHJvbGxlciwgU01JQyBkZXZpY2UKLSMgU3VwZXJmYXN0Y29tLVBDSSAoQ29tbXRlY2gsIEluYy4pIG9yIERTQ0M0IFdBTiBBZGFwdGVyCi0JMjEwMiAgRFNDQzQgUEVCL1BFRiAyMDUzNCBETUEgU3VwcG9ydGVkIFNlcmlhbCBDb21tdW5pY2F0aW9uIENvbnRyb2xsZXIgd2l0aCA0IENoYW5uZWxzCi0JMjEwNCAgRWljb24gRGl2YSAyLjAyIGNvbXBhdGlibGUgcGFzc2l2ZSBJU0ROIGNhcmQKLQkzMTQyICBTSU1BVElDIE5FVCBDUCA1NjEzQTEgKFByb2ZpYnVzIEFkYXB0ZXIpCi0JNDAyMSAgU0lNQVRJQyBORVQgQ1AgNTUxMiAoUHJvZmlidXMgYW5kIE1QSSBDYXJkYnVzIEFkYXB0ZXIpCi0JNDAyOSAgU0lNQVRJQyBORVQgQ1AgNTYxM0EyIChQcm9maWJ1cyBBZGFwdGVyKQotCTQ5NDIgIEZQR0EgSS1CdXMgVHJhY2VyIGZvciBNQkQKLQk2MTIwICBTWkI2MTIwCi0xMTBiICBDaHJvbWF0aWMgUmVzZWFyY2ggSW5jLgotCTAwMDEgIE1wYWN0IE1lZGlhIFByb2Nlc3NvcgotCTAwMDQgIE1wYWN0IDIKLTExMGMgIE1pbmktTWF4IFRlY2hub2xvZ3ksIEluYy4KLTExMGQgIFpueXggQWR2YW5jZWQgU3lzdGVtcwotMTEwZSAgQ1BVIFRlY2hub2xvZ3kKLTExMGYgIFJvc3MgVGVjaG5vbG9neQotMTExMCAgUG93ZXJob3VzZSBTeXN0ZW1zCi0JNjAzNyAgRmlyZXBvd2VyIFBvd2VyaXplZCBTTVAgSS9PIEFTSUMKLQk2MDczICBGaXJlcG93ZXIgUG93ZXJpemVkIFNNUCBJL08gQVNJQwotMTExMSAgU2FudGEgQ3J1eiBPcGVyYXRpb24KLSMgQWxzbyBjbGFpbWVkIHRvIGJlIFJOUyBvciBSb2Nrd2VsbCBJbnRlcm5hdGlvbmFsLCBjdXJyZW50IFBDSVNJRyByZWNvcmRzIGxpc3QgT3NpY29tCi0xMTEyICBPc2ljb20gVGVjaG5vbG9naWVzIEluYwotCTIyMDAgIEZEREkgQWRhcHRlcgotCTIzMDAgIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCTIzNDAgIDQgUG9ydCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkyNDAwICBBVE0gQWRhcHRlcgotMTExMyAgQWNjdG9uIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KLQkxMjExICBTTUMyLTEyMTFUWAotCQkxMDNjIDEyMDcgIEVOLTEyMDdEIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMTEzIDEyMTEgIEVOLTEyMDdEIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCTEyMTYgIEVOLTEyMTYgRXRoZXJuZXQgQWRhcHRlcgotCQkxMTEzIDIyNDIgIEVOMjI0MiAxMC8xMDAgRXRoZXJuZXQgTWluaS1QQ0kgQ2FyZAotCQkxMTFhIDEwMjAgIFNwZWVkU3RyZWFtIDEwMjAgUENJIDEwLzEwMCBFdGhlcm5ldCBBZGFwdG9yIFtFTi0xMjA3Ri1UWCA/XQotCTEyMTcgIEVOLTEyMTcgRXRoZXJuZXQgQWRhcHRlcgotCTUxMDUgIDEwTWJwcyBOZXR3b3JrIGNhcmQKLQk5MjExICBFTi0xMjA3RCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTExMyA5MjExICBFTi0xMjA3RCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIKLQk5NTExICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSBGYXN0IEV0aGVybmV0Ci0JZDMwMSAgQ1BXTkExMDAgKFBoaWxpcHMgd2lyZWxlc3MgUENNQ0lBKQotCWVjMDIgIFNNQyAxMjQ0VFggdjMKLTExMTQgIEF0bWVsIENvcnBvcmF0aW9uCi0JMDUwNiAgODAyLjExYiBXaXJlbGVzcyBOZXR3b3JrIEFkYXB0b3IgKGF0NzZjNTA2KQotMTExNSAgM0QgTGFicwotMTExNiAgRGF0YSBUcmFuc2xhdGlvbgotCTAwMjIgIERUMzAwMQotCTAwMjMgIERUMzAwMgotCTAwMjQgIERUMzAwMwotCTAwMjUgIERUMzAwNAotCTAwMjYgIERUMzAwNQotCTAwMjcgIERUMzAwMS1QR0wKLQkwMDI4ICBEVDMwMDMtUEdMCi0xMTE3ICBEYXRhY3ViZSwgSW5jCi0JOTUwMCAgTWF4LTFDIFNWR0EgY2FyZAotCTk1MDEgIE1heC0xQyBpbWFnZSBwcm9jZXNzaW5nCi0xMTE4ICBCZXJnIEVsZWN0cm9uaWNzCi0xMTE5ICBJQ1AgVm9ydGV4IENvbXB1dGVyc3lzdGVtZSBHbWJICi0JMDAwMCAgR0RUIDYwMDAvNjAyMC82MDUwCi0JMDAwMSAgR0RUIDYwMDBCLzYwMTAKLQkwMDAyICBHRFQgNjExMC82NTEwCi0JMDAwMyAgR0RUIDYxMjAvNjUyMAotCTAwMDQgIEdEVCA2NTMwCi0JMDAwNSAgR0RUIDY1NTAKLQkwMDA2ICBHRFQgNjExNy82NTE3Ci0JMDAwNyAgR0RUIDYxMjcvNjUyNwotCTAwMDggIEdEVCA2NTM3Ci0JMDAwOSAgR0RUIDY1NTcvNjU1Ny1FQ0MKLQkwMDBhICBHRFQgNjExNS82NTE1Ci0JMDAwYiAgR0RUIDYxMjUvNjUyNQotCTAwMGMgIEdEVCA2NTM1Ci0JMDAwZCAgR0RUIDY1NTUKLQkwMDEwICBHRFQgNjExNS82NTE1Ci0JMDAxMSAgR0RUIDYxMjUvNjUyNQotCTAwMTIgIEdEVCA2NTM1Ci0JMDAxMyAgR0RUIDY1NTUvNjU1NS1FQ0MKLQkwMTAwICBHRFQgNjExN1JQLzY1MTdSUAotCTAxMDEgIEdEVCA2MTI3UlAvNjUyN1JQCi0JMDEwMiAgR0RUIDY1MzdSUAotCTAxMDMgIEdEVCA2NTU3UlAKLQkwMTA0ICBHRFQgNjExMVJQLzY1MTFSUAotCTAxMDUgIEdEVCA2MTIxUlAvNjUyMVJQCi0JMDExMCAgR0RUIDYxMTdSRC82NTE3UkQKLQkwMTExICBHRFQgNjEyN1JELzY1MjdSRAotCTAxMTIgIEdEVCA2NTM3UkQKLQkwMTEzICBHRFQgNjU1N1JECi0JMDExNCAgR0RUIDYxMTFSRC82NTExUkQKLQkwMTE1ICBHRFQgNjEyMVJELzY1MjFSRAotCTAxMTggIEdEVCA2MTE4UkQvNjUxOFJELzY2MThSRAotCTAxMTkgIEdEVCA2MTI4UkQvNjUyOFJELzY2MjhSRAotCTAxMWEgIEdEVCA2NTM4UkQvNjYzOFJECi0JMDExYiAgR0RUIDY1NThSRC82NjU4UkQKLQkwMTIwICBHRFQgNjExN1JQMi82NTE3UlAyCi0JMDEyMSAgR0RUIDYxMjdSUDIvNjUyN1JQMgotCTAxMjIgIEdEVCA2NTM3UlAyCi0JMDEyMyAgR0RUIDY1NTdSUDIKLQkwMTI0ICBHRFQgNjExMVJQMi82NTExUlAyCi0JMDEyNSAgR0RUIDYxMjFSUDIvNjUyMVJQMgotCTAxMzYgIEdEVCA2MTEzUlMvNjUxM1JTCi0JMDEzNyAgR0RUIDYxMjNSUy82NTIzUlMKLQkwMTM4ICBHRFQgNjExOFJTLzY1MThSUy82NjE4UlMKLQkwMTM5ICBHRFQgNjEyOFJTLzY1MjhSUy82NjI4UlMKLQkwMTNhICBHRFQgNjUzOFJTLzY2MzhSUwotCTAxM2IgIEdEVCA2NTU4UlMvNjY1OFJTCi0JMDEzYyAgR0RUIDY1MzNSUy82NjMzUlMKLQkwMTNkICBHRFQgNjU0M1JTLzY2NDNSUwotCTAxM2UgIEdEVCA2NTUzUlMvNjY1M1JTCi0JMDEzZiAgR0RUIDY1NjNSUy82NjYzUlMKLQkwMTY2ICBHRFQgNzExM1JOLzc1MTNSTi83NjEzUk4KLQkwMTY3ICBHRFQgNzEyM1JOLzc1MjNSTi83NjIzUk4KLQkwMTY4ICBHRFQgNzExOFJOLzc1MThSTi83NTE4Uk4KLQkwMTY5ICBHRFQgNzEyOFJOLzc1MjhSTi83NjI4Uk4KLQkwMTZhICBHRFQgNzUzOFJOLzc2MzhSTgotCTAxNmIgIEdEVCA3NTU4Uk4vNzY1OFJOCi0JMDE2YyAgR0RUIDc1MzNSTi83NjMzUk4KLQkwMTZkICBHRFQgNzU0M1JOLzc2NDNSTgotCTAxNmUgIEdEVCA3NTUzUk4vNzY1M1JOCi0JMDE2ZiAgR0RUIDc1NjNSTi83NjYzUk4KLQkwMWQ2ICBHRFQgNHgxM1JaCi0JMDFkNyAgR0RUIDR4MjNSWgotCTAxZjYgIEdEVCA4eDEzUloKLQkwMWY3ICBHRFQgOHgyM1JaCi0JMDFmYyAgR0RUIDh4MzNSWgotCTAxZmQgIEdEVCA4eDQzUloKLQkwMWZlICBHRFQgOHg1M1JaCi0JMDFmZiAgR0RUIDh4NjNSWgotCTAyMTAgIEdEVCA2NTE5UkQvNjYxOVJECi0JMDIxMSAgR0RUIDY1MjlSRC82NjI5UkQKLQkwMjYwICBHRFQgNzUxOVJOLzc2MTlSTgotCTAyNjEgIEdEVCA3NTI5Uk4vNzYyOVJOCi0JMDJmZiAgR0RUIE1BWFJQCi0JMDMwMCAgR0RUIE5FV1JYCi0xMTFhICBFZmZpY2llbnQgTmV0d29ya3MsIEluYwotCTAwMDAgIDE1NVAtTUYxIChGUEdBKQotCTAwMDIgIDE1NVAtTUYxIChBU0lDKQotCTAwMDMgIEVOSS0yNVAgQVRNCi0JCTExMWEgMDAwMCAgRU5JLTI1cCBNaW5pcG9ydCBBVE0gQWRhcHRlcgotCTAwMDUgIFNwZWVkU3RyZWFtIChMQU5BSSkKLQkJMTExYSAwMDAxICBFTkktMzAxMCBBVE0KLQkJMTExYSAwMDA5ICBFTkktMzA2MCBBRFNMIChWUEk9MCkKLQkJMTExYSAwMTAxICBFTkktMzAxMCBBVE0KLQkJMTExYSAwMTA5ICBFTkktMzA2MENPIEFEU0wgKFZQST0wKQotCQkxMTFhIDA4MDkgIEVOSS0zMDYwIEFEU0wgKFZQST0wIG9yIDgpCi0JCTExMWEgMDkwOSAgRU5JLTMwNjBDTyBBRFNMIChWUEk9MCBvciA4KQotCQkxMTFhIDBhMDkgIEVOSS0zMDYwIEFEU0wgKFZQST08MC4uMTU+KQotCTAwMDcgIFNwZWVkU3RyZWFtIEFEU0wKLQkJMTExYSAxMDAxICBFTkktMzA2MSBBRFNMIFtBU0lDXQotCTEyMDMgIFNwZWVkU3RyZWFtIDEwMjMgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLTExMWIgIFRlbGVkeW5lIEVsZWN0cm9uaWMgU3lzdGVtcwotMTExYyAgVHJpY29yZCBTeXN0ZW1zIEluYy4KLQkwMDAxICBQb3dlcmJpcyBCcmlkZ2UKLTExMWQgIEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KLQkwMDAxICBJRFQ3NzIwMS83NzIxMSAxNTVNYnBzIEFUTSBTQVIgQ29udHJvbGxlciBbTklDU3RBUl0KLQkwMDAzICBJRFQ3NzIyMi83NzI1MiAxNTVNYnBzIEFUTSBNSUNSTyBBQlIgU0FSIENvbnRyb2xsZXIKLQkwMDA0ICBJRFQ3N1YyNTIgMTU1TWJwcyBBVE0gTUlDUk8gQUJSIFNBUiBDb250cm9sbGVyCi0JMDAwNSAgSURUNzdWMjIyIDE1NU1icHMgQVRNIE1JQ1JPIEFCUiBTQVIgQ29udHJvbGxlcgotMTExZSAgRWxkZWMKLTExMWYgIFByZWNpc2lvbiBEaWdpdGFsIEltYWdlcwotCTRhNDcgIFByZWNpc2lvbiBNWCBWaWRlbyBlbmdpbmUgaW50ZXJmYWNlCi0JNTI0MyAgRnJhbWUgY2FwdHVyZSBidXMgaW50ZXJmYWNlCi0xMTIwICBFTUMgQ29ycG9yYXRpb24KLTExMjEgIFppbG9nCi0xMTIyICBNdWx0aS10ZWNoIFN5c3RlbXMsIEluYy4KLTExMjMgIEV4Y2VsbGVudCBEZXNpZ24sIEluYy4KLTExMjQgIExldXRyb24gVmlzaW9uIEFHCi0xMTI1ICBFdXJvY29yZQotMTEyNiAgVmlncmEKLTExMjcgIEZPUkUgU3lzdGVtcyBJbmMKLQkwMjAwICBGb3JlUnVubmVyIFBDQS0yMDAgQVRNCi0JMDIxMCAgUENBLTIwMFBDCi0JMDI1MCAgQVRNCi0JMDMwMCAgRm9yZVJ1bm5lciBQQ0EtMjAwRVBDIEFUTQotCTAzMTAgIEFUTQotCTA0MDAgIEZvcmVSdW5uZXJIRSBBVE0gQWRhcHRlcgotCQkxMTI3IDA0MDAgIEZvcmVSdW5uZXJIRSBBVE0KLTExMjkgIEZpcm13b3JrcwotMTEyYSAgSGVybWVzIEVsZWN0cm9uaWNzIENvbXBhbnksIEx0ZC4KLTExMmIgIExpbm90eXBlIC0gSGVsbCBBRwotMTEyYyAgWmVuaXRoIERhdGEgU3lzdGVtcwotMTEyZCAgUmF2aWNhZAotMTEyZSAgSW5mb21lZGlhIE1pY3JvZWxlY3Ryb25pY3MgSW5jLgotMTEyZiAgSW1hZ2luZyBUZWNobm9sb2d5IEluYwotCTAwMDAgIE1WQyBJQy1QQ0kKLQkwMDAxICBNVkMgSU0tUENJIFZpZGVvIGZyYW1lIGdyYWJiZXIvcHJvY2Vzc29yCi0xMTMwICBDb21wdXRlcnZpc2lvbgotMTEzMSAgUGhpbGlwcyBTZW1pY29uZHVjdG9ycwotCTE1NjEgIFVTQiAxLjEgSG9zdCBDb250cm9sbGVyCi0JMTU2MiAgVVNCIDIuMCBIb3N0IENvbnRyb2xsZXIKLQkzNDAwICBTbWFydFBDSTU2KFVDQjE1MDApIDU2SyBNb2RlbQotCTU0MDAgIFRyaU1lZGlhIFRNMTAwMC8xMTAwCi0JNTQwMiAgVHJpTWVkaWEgVE0tMTMwMAotCQkxMjQ0IDBmMDAgIEZyaXR6IUNhcmQgRFNMCi0JNzEzMCAgU0FBNzEzMCBWaWRlbyBCcm9hZGNhc3QgRGVjb2RlcgotCQk1MTY4IDAxMzggIExpdmVWaWV3IEZseVZpZGVvIDIwMDAKLQk3MTMzICBTQUE3MTNYIEF1ZGlvK3ZpZGVvIGJyb2FkY2FzdCBkZWNvZGVyCi0JCTUxNjggMDEzOCAgTGlmZVZpZXcgRmx5VmlkZW8gMzAwMAotCQk1MTY4IDAyMTIgIExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIG1pbmkKLQkJNTE2OCAwNTAyICBMaWZlVmlldyBGbHlEVkItVCBEdW8gQ2FyZEJ1cwotIyBQQ0kgYXVkaW8gYW5kIHZpZGVvIGJyb2FkY2FzdCBkZWNvZGVyIChodHRwOi8vd3d3LnNlbWljb25kdWN0b3JzLnBoaWxpcHMuY29tL3BpcC9zYWE3MTM0aGwpCi0JNzEzNCAgU0FBNzEzNAotCQkxMDQzIDQ4NDIgIFRWLUZNIENhcmQgNzEzNAotCTcxMzUgIFNBQTcxMzUgQXVkaW8rdmlkZW8gYnJvYWRjYXN0IGRlY29kZXIKLQk3MTQ1ICBTQUE3MTQ1Ci0JNzE0NiAgU0FBNzE0NgotCQkxMTBhIDAwMDAgIEZ1aml0c3UvU2llbWVucyBEVkItQyBjYXJkIHJldjEuNQotCQkxMTBhIGZmZmYgIEZ1aml0c3UvU2llbWVucyBEVkItQyBjYXJkIHJldjEuNQotCQkxMTMxIDRmNTYgIEtOQzEgRFZCLVMgQnVkZ2V0Ci0JCTExMzEgNGY2MSAgRnVqaXRzdS1TaWVtZW5zIEFjdGl2eSBEVkItUyBCdWRnZXQKLQkJMTE0YiAyMDAzICBEVlJhcHRvciBWaWRlbyBFZGl0L0NhcHR1cmUgQ2FyZAotCQkxMWJkIDAwMDYgIERWNTAwIE92ZXJsYXkKLQkJMTFiZCAwMDBhICBEVjUwMCBPdmVybGF5Ci0JCTExYmQgMDAwZiAgRFY1MDAgT3ZlcmxheQotCQkxM2MyIDAwMDAgIFNpZW1lbnMvVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQiBjYXJkIHJldjEuMyBvciByZXYxLjUKLQkJMTNjMiAwMDAxICBUZWNobm90cmVuZC9IYXVwcGF1Z2UgRFZCIGNhcmQgcmV2MS4zIG9yIHJldjEuNgotCQkxM2MyIDAwMDIgIFRlY2hub3RyZW5kL0hhdXBwYXVnZSBEVkIgY2FyZCByZXYyLjEKLQkJMTNjMiAwMDAzICBUZWNobm90cmVuZC9IYXVwcGF1Z2UgRFZCIGNhcmQgcmV2Mi4xCi0JCTEzYzIgMDAwNCAgVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQiBjYXJkIHJldjIuMQotCQkxM2MyIDAwMDYgIFRlY2hub3RyZW5kL0hhdXBwYXVnZSBEVkIgY2FyZCByZXYxLjMgb3IgcmV2MS42Ci0JCTEzYzIgMDAwOCAgVGVjaG5vdHJlbmQvSGF1cHBhdWdlIERWQi1UCi0JCTEzYzIgMDAwYSAgT2N0YWwvVGVjaG5vdHJlbmQgRFZCLUMgZm9yIGlUVgotCQkxM2MyIDEwMDMgIFRlY2hub3RyZW5kLUJ1ZGdldCAvIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVMgRFZCIGNhcmQKLQkJMTNjMiAxMDA0ICBUZWNobm90cmVuZC1CdWRnZXQgLyBIYXVwcGF1Z2UgV2luVFYtTk9WQS1DIERWQiBjYXJkCi0JCTEzYzIgMTAwNSAgVGVjaG5vdHJlbmQtQnVkZ2V0IC8gSGF1cHBhdWdlIFdpblRWLU5PVkEtVCBEVkIgY2FyZAotCQkxM2MyIDEwMGMgIFRlY2hub3RyZW5kLUJ1ZGdldCAvIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLUNJIERWQiBjYXJkCi0JCTEzYzIgMTAwZiAgVGVjaG5vdHJlbmQtQnVkZ2V0IC8gSGF1cHBhdWdlIFdpblRWLU5PVkEtQ0kgRFZCIGNhcmQKLQkJMTNjMiAxMDExICBUZWNobm90cmVuZC1CdWRnZXQgLyBIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIERWQiBjYXJkCi0JCTEzYzIgMTAxMyAgU0FURUxDTyBNdWx0aW1lZGlhIERWQgotCQkxM2MyIDExMDIgIFRlY2hub3RyZW5kL0hhdXBwYXVnZSBEVkIgY2FyZCByZXYyLjEKLTExMzIgIE1pdGVsIENvcnAuCi0jIFRoaXMgaXMgdGhlIG5ldyBvZmZpY2lhbCBjb21wYW55IG5hbWUuIFNlZSBkaXNjbGFpbWVyIG9uIHd3dy5laWNvbi5jb20gZm9yIGRldGFpbHMhCi0xMTMzICBFaWNvbiBOZXR3b3JrcyBDb3Jwb3JhdGlvbgotCTc5MDEgIEVpY29uQ2FyZCBTOTAKLQk3OTAyICBFaWNvbkNhcmQgUzkwCi0JNzkxMSAgRWljb25DYXJkIFM5MQotCTc5MTIgIEVpY29uQ2FyZCBTOTEKLQk3OTQxICBFaWNvbkNhcmQgUzk0Ci0JNzk0MiAgRWljb25DYXJkIFM5NAotCTc5NDMgIEVpY29uQ2FyZCBTOTQKLQk3OTQ0ICBFaWNvbkNhcmQgUzk0Ci0JYjkyMSAgRWljb25DYXJkIFA5MgotCWI5MjIgIEVpY29uQ2FyZCBQOTIKLQliOTIzICBFaWNvbkNhcmQgUDkyCi0JZTAwMSAgRGl2YSBQcm8gMi4wIFMvVAotCWUwMDIgIERpdmEgMi4wIFMvVCBQQ0kKLQllMDAzICBEaXZhIFBybyAyLjAgVQotCWUwMDQgIERpdmEgMi4wIFUgUENJCi0JZTAwNSAgRGl2YSAyLjAxIFMvVCBQQ0kKLQllMDA2ICBEaXZhIENUIFMvVCBQQ0kKLQllMDA3ICBEaXZhIENUIFUgUENJCi0JZTAwOCAgRGl2YSBDVCBMaXRlIFMvVCBQQ0kKLQllMDA5ICBEaXZhIENUIExpdGUgVSBQQ0kKLQllMDBhICBEaXZhIElTRE4rVi45MCBQQ0kKLQllMDBiICBEaXZhIDIuMDIgUENJIFMvVAotCWUwMGMgIERpdmEgMi4wMiBQQ0kgVQotCWUwMGQgIERpdmEgSVNETiBQcm8gMy4wIFBDSQotCWUwMGUgIERpdmEgSVNETitDVCBTL1QgUENJIFJldiAyCi0JZTAxMCAgRGl2YSBTZXJ2ZXIgQlJJLTJNIFBDSQotCQkxMTBhIDAwMjEgIEZ1aml0c3UgU2llbWVucyBJU0ROIFMwCi0JCTgwMDEgMDAxNCAgRGl2YSBTZXJ2ZXIgQlJJLTJNIFBDSSBDb3JuZXQgTlEKLQllMDExICBEaXZhIFNlcnZlciBCUkkgUy9UIFJldiAyCi0JZTAxMiAgRGl2YSBTZXJ2ZXIgNEJSSS04TSBQQ0kKLQkJODAwMSAwMDE0ICBEaXZhIFNlcnZlciA0QlJJLThNIFBDSSBDb3JuZXQgTlEKLQllMDEzICBEaXZhIFNlcnZlciA0QlJJIFJldiAyCi0JCTExMzMgMTMwMCAgRGl2YSBTZXJ2ZXIgVi00QlJJLTgKLQkJMTEzMyBlMDEzICBEaXZhIFNlcnZlciA0QlJJLThNIDIuMCBQQ0kKLQkJODAwMSAwMDE0ICBEaXZhIFNlcnZlciA0QlJJLThNIDIuMCBQQ0kgQ29ybmV0IE5RCi0JZTAxNCAgRGl2YSBTZXJ2ZXIgUFJJLTMwTSBQQ0kKLQkJMDAwOCAwMTAwICBEaXZhIFNlcnZlciBQUkktMzBNIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIFBSSS0zME0gUENJIENvcm5ldCBOUQotCWUwMTUgIERJVkEgU2VydmVyIFBSSSBSZXYgMgotCQkxMTMzIGUwMTUgIERpdmEgU2VydmVyIFBSSSAyLjAgUENJCi0JCTgwMDEgMDAxNCAgRGl2YSBTZXJ2ZXIgUFJJIDIuMCBQQ0kgQ29ybmV0IE5RCi0JZTAxNiAgRGl2YSBTZXJ2ZXIgVm9pY2UgNEJSSSBQQ0kKLQkJODAwMSAwMDE0ICBEaXZhIFNlcnZlciBQUkkgQ29ybmV0IE5RCi0JZTAxNyAgRGl2YSBTZXJ2ZXIgVm9pY2UgNEJSSSBSZXYgMgotCQkxMTMzIGUwMTcgIERpdmEgU2VydmVyIFZvaWNlIDRCUkktOE0gMi4wIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIFZvaWNlIDRCUkktOE0gMi4wIFBDSSBDb3JuZXQgTlEKLQllMDE4ICBEaXZhIFNlcnZlciBCUkktMk0gMi4wIFBDSQotCQkxMTMzIDE4MDAgIERpdmEgU2VydmVyIFYtQlJJLTIKLQkJMTEzMyBlMDE4ICBEaXZhIFNlcnZlciBCUkktMk0gMi4wIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIEJSSS0yTSAyLjAgUENJIENvcm5ldCBOUQotCWUwMTkgIERpdmEgU2VydmVyIFZvaWNlIFBSSSBSZXYgMgotCQkxMTMzIGUwMTkgIERpdmEgU2VydmVyIFZvaWNlIFBSSSAyLjAgUENJCi0JCTgwMDEgMDAxNCAgRGl2YSBTZXJ2ZXIgVm9pY2UgUFJJIDIuMCBQQ0kgQ29ybmV0IE5RCi0JZTAxYSAgRGl2YSBTZXJ2ZXIgMkZYCi0JZTAxYiAgRGl2YSBTZXJ2ZXIgVm9pY2UgQlJJLTJNIDIuMCBQQ0kKLQkJMTEzMyBlMDFiICBEaXZhIFNlcnZlciBWb2ljZSBCUkktMk0gMi4wIFBDSQotCQk4MDAxIDAwMTQgIERpdmEgU2VydmVyIFZvaWNlIEJSSS0yTSAyLjAgUENJIENvcm5ldCBOUQotCWUwMWMgIERpdmEgU2VydmVyIFBSSSBSZXYgMwotCQkxMTMzIDFjMDEgIERpdmEgU2VydmVyIFBSSS9FMS9UMS04Ci0JCTExMzMgMWMwMiAgRGl2YSBTZXJ2ZXIgUFJJL1QxLTI0Ci0JCTExMzMgMWMwMyAgRGl2YSBTZXJ2ZXIgUFJJL0UxLTMwCi0JCTExMzMgMWMwNCAgRGl2YSBTZXJ2ZXIgUFJJL0UxL1QxCi0JCTExMzMgMWMwNSAgRGl2YSBTZXJ2ZXIgVi1QUkkvVDEtMjQKLQkJMTEzMyAxYzA2ICBEaXZhIFNlcnZlciBWLVBSSS9FMS0zMAotCQkxMTMzIDFjMDcgIERpdmEgU2VydmVyIFBSSS9FMS9UMS04IENvcm5ldCBOUQotCQkxMTMzIDFjMDggIERpdmEgU2VydmVyIFBSSS9UMS0yNCBDb3JuZXQgTlEKLQkJMTEzMyAxYzA5ICBEaXZhIFNlcnZlciBQUkkvRTEtMzAgQ29ybmV0IE5RCi0JCTExMzMgMWMwYSAgRGl2YSBTZXJ2ZXIgUFJJL0UxL1QxIENvcm5ldCBOUQotCQkxMTMzIDFjMGIgIERpdmEgU2VydmVyIFYtUFJJL1QxLTI0IENvcm5ldCBOUQotCQkxMTMzIDFjMGMgIERpdmEgU2VydmVyIFYtUFJJL0UxLTMwIENvcm5ldCBOUQotCWUwMWUgIERpdmEgU2VydmVyIDJQUkkKLQkJMTEzMyAxZTAwICBEaXZhIFNlcnZlciBWLTJQUkkvRTEtNjAKLQkJMTEzMyAxZTAxICBEaXZhIFNlcnZlciBWLTJQUkkvVDEtNDgKLQkJMTEzMyAxZTAyICBEaXZhIFNlcnZlciAyUFJJL0UxLTYwCi0JCTExMzMgMWUwMyAgRGl2YSBTZXJ2ZXIgMlBSSS9UMS00OAotCWUwMjAgIERpdmEgU2VydmVyIDRQUkkKLQkJMTEzMyAyMDAwICBEaXZhIFNlcnZlciBWLTRQUkkvRTEtMTIwCi0JCTExMzMgMjAwMSAgRGl2YSBTZXJ2ZXIgVi00UFJJL1QxLTk2Ci0JCTExMzMgMjAwMiAgRGl2YSBTZXJ2ZXIgNFBSSS9FMS0xMjAKLQkJMTEzMyAyMDAzICBEaXZhIFNlcnZlciA0UFJJL1QxLTk2Ci0JZTAyNCAgRGl2YSBTZXJ2ZXIgQW5hbG9nLTRQCi0JCTExMzMgMjQwMCAgRGl2YSBTZXJ2ZXIgVi1BbmFsb2ctNFAKLQkJMTEzMyBlMDI0ICBEaXZhIFNlcnZlciBBbmFsb2ctNFAKLQllMDI4ICBEaXZhIFNlcnZlciBBbmFsb2ctOFAKLQkJMTEzMyAyODAwICBEaXZhIFNlcnZlciBWLUFuYWxvZy04UAotCQkxMTMzIGUwMjggIERpdmEgU2VydmVyIEFuYWxvZy04UAotMTEzNCAgTWVyY3VyeSBDb21wdXRlciBTeXN0ZW1zCi0JMDAwMSAgUmFjZXdheSBCcmlkZ2UKLQkwMDAyICBEdWFsIFBDSSB0byBSYXBpZElPIEJyaWRnZQotMTEzNSAgRnVqaSBYZXJveCBDbyBMdGQKLQkwMDAxICBQcmludGVyIGNvbnRyb2xsZXIKLTExMzYgIE1vbWVudHVtIERhdGEgU3lzdGVtcwotMTEzNyAgQ2lzY28gU3lzdGVtcyBJbmMKLTExMzggIFppYXRlY2ggQ29ycG9yYXRpb24KLQk4OTA1ICA4OTA1IFtTVEQgMzIgQnJpZGdlXQotMTEzOSAgRHluYW1pYyBQaWN0dXJlcywgSW5jCi0JMDAwMSAgVkdBIENvbXBhdGFibGUgM0QgR3JhcGhpY3MKLTExM2EgIEZXQiBJbmMKLTExM2IgIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMKLTExM2MgIEN5Y2xvbmUgTWljcm9zeXN0ZW1zLCBJbmMuCi0JMDAwMCAgUENJLTkwNjAgaTk2MCBCcmlkZ2UKLQkwMDAxICBQQ0ktU0RLIFtQQ0kgaTk2MCBFdmFsdWF0aW9uIFBsYXRmb3JtXQotCTA5MTEgIFBDSS05MTEgW2k5NjBKeC1iYXNlZCBJbnRlbGxpZ2VudCBJL08gQ29udHJvbGxlcl0KLQkwOTEyICBQQ0ktOTEyIFtpOTYwQ0YtYmFzZWQgSW50ZWxsaWdlbnQgSS9PIENvbnRyb2xsZXJdCi0JMDkxMyAgUENJLTkxMwotCTA5MTQgIFBDSS05MTQgW0kvTyBDb250cm9sbGVyIHcvIHNlY29uZGFyeSBQQ0kgYnVzXQotMTEzZCAgTGVhZGluZyBFZGdlIFByb2R1Y3RzIEluYwotMTEzZSAgU2FueW8gRWxlY3RyaWMgQ28gLSBDb21wdXRlciBFbmdpbmVlcmluZyBEZXB0Ci0xMTNmICBFcXVpbm94IFN5c3RlbXMsIEluYy4KLQkwODA4ICBTU1QtNjRQIEFkYXB0ZXIKLQkxMDEwICBTU1QtMTI4UCBBZGFwdGVyCi0JODBjMCAgU1NULTE2UCBEQiBBZGFwdGVyCi0JODBjNCAgU1NULTE2UCBSSiBBZGFwdGVyCi0JODBjOCAgU1NULTE2UCBBZGFwdGVyCi0JODg4OCAgU1NULTRQIEFkYXB0ZXIKLQk5MDkwICBTU1QtOFAgQWRhcHRlcgotMTE0MCAgSW50ZXJ2b2ljZSBJbmMKLTExNDEgIENyZXN0IE1pY3Jvc3lzdGVtIEluYwotMTE0MiAgQWxsaWFuY2UgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbgotCTMyMTAgIEFQNjQxMAotCTY0MjIgIFByb1ZpZGVvIDY0MjIKLQk2NDI0ICBQcm9WaWRlbyA2NDI0Ci0JNjQyNSAgUHJvTW90aW9uIEFUMjUKLQk2NDNkICBQcm9Nb3Rpb24gQVQzRAotMTE0MyAgTmV0UG93ZXIsIEluYwotMTE0NCAgQ2luY2lubmF0aSBNaWxhY3JvbgotCTAwMDEgIE5vc2Vydm8gY29udHJvbGxlcgotMTE0NSAgV29ya2JpdCBDb3Jwb3JhdGlvbgotCTgwMDcgIE5pbmphU0NTSS0zMiBXb3JrYml0Ci0JZjAwNyAgTmluamFTQ1NJLTMyIEtNRQotCWYwMTAgIE5pbmphU0NTSS0zMiBXb3JrYml0Ci0JZjAxMiAgTmluamFTQ1NJLTMyIExvZ2l0ZWMKLQlmMDEzICBOaW5qYVNDU0ktMzIgTG9naXRlYwotCWYwMTUgIE5pbmphU0NTSS0zMiBNZWxjbwotMTE0NiAgRm9yY2UgQ29tcHV0ZXJzCi0xMTQ3ICBJbnRlcmZhY2UgQ29ycAotIyBGb3JtZXJseSAoU2NobmVpZGVyICYgS29jaCkKLTExNDggIFN5c0tvbm5lY3QKLQk0MDAwICBGRERJIEFkYXB0ZXIKLQkJMGUxMSBiMDNiICBOZXRlbGxpZ2VudCAxMDAgRkRESSBEQVMgRmlicmUgU0MKLQkJMGUxMSBiMDNjICBOZXRlbGxpZ2VudCAxMDAgRkRESSBTQVMgRmlicmUgU0MKLQkJMGUxMSBiMDNkICBOZXRlbGxpZ2VudCAxMDAgRkRESSBEQVMgVVRQCi0JCTBlMTEgYjAzZSAgTmV0ZWxsaWdlbnQgMTAwIEZEREkgU0FTIFVUUAotCQkwZTExIGIwM2YgIE5ldGVsbGlnZW50IDEwMCBGRERJIFNBUyBGaWJyZSBNSUMKLQkJMTE0OCA1NTIxICBGRERJIFNLLTU1MjEgKFNLLU5FVCBGRERJLVVQKQotCQkxMTQ4IDU1MjIgIEZEREkgU0stNTUyMiAoU0stTkVUIEZEREktVVAgREFTKQotCQkxMTQ4IDU1NDEgIEZEREkgU0stNTU0MSAoU0stTkVUIEZEREktRlApCi0JCTExNDggNTU0MyAgRkRESSBTSy01NTQzIChTSy1ORVQgRkRESS1MUCkKLQkJMTE0OCA1NTQ0ICBGRERJIFNLLTU1NDQgKFNLLU5FVCBGRERJLUxQIERBUykKLQkJMTE0OCA1ODIxICBGRERJIFNLLTU4MjEgKFNLLU5FVCBGRERJLVVQNjQpCi0JCTExNDggNTgyMiAgRkRESSBTSy01ODIyIChTSy1ORVQgRkRESS1VUDY0IERBUykKLQkJMTE0OCA1ODQxICBGRERJIFNLLTU4NDEgKFNLLU5FVCBGRERJLUZQNjQpCi0JCTExNDggNTg0MyAgRkRESSBTSy01ODQzIChTSy1ORVQgRkRESS1MUDY0KQotCQkxMTQ4IDU4NDQgIEZEREkgU0stNTg0NCAoU0stTkVUIEZEREktTFA2NCBEQVMpCi0JNDIwMCAgVG9rZW4gUmluZyBhZGFwdGVyCi0JNDMwMCAgU0stOTh4eCBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyCi0JCTExNDggOTgyMSAgU0stOTgyMSBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtVCkKLQkJMTE0OCA5ODIyICBTSy05ODIyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1UIGR1YWwgbGluaykKLQkJMTE0OCA5ODQxICBTSy05ODQxIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1MWCkKLQkJMTE0OCA5ODQyICBTSy05ODQyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1MWCBkdWFsIGxpbmspCi0JCTExNDggOTg0MyAgU0stOTg0MyBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1gpCi0JCTExNDggOTg0NCAgU0stOTg0NCBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1ggZHVhbCBsaW5rKQotCQkxMTQ4IDk4NjEgIFNLLTk4NjEgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIFZvbGl0aW9uKQotCQkxMTQ4IDk4NjIgIFNLLTk4NjIgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIFZvbGl0aW9uIGR1YWwgbGluaykKLQkJMTE0OCA5ODcxICBTSy05ODcxIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1aWCkKLQkJMTE0OCA5ODcyICBTSy05ODcyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1aWCBkdWFsIGxpbmspCi0JCTEyNTkgMjk3MCAgQVQtMjk3MFNYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCQkxMjU5IDI5NzEgIEFULTI5NzBMWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI1OSAyOTcyICBBVC0yOTcwVFggR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyNTkgMjk3MyAgQVQtMjk3MVNYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCQkxMjU5IDI5NzQgIEFULTI5NzFUIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCQkxMjU5IDI5NzUgIEFULTI5NzBTWC8yU0MgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyNTkgMjk3NiAgQVQtMjk3MExYLzJTQyBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI1OSAyOTc3ICBBVC0yOTcwVFgvMlRYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgotCTQzMjAgIFNLLTk4eHggVjIuMCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQkJMTE0OCAwMTIxICBNYXJ2ZWxsIFJESy04MDAxIEFkYXB0ZXIKLQkJMTE0OCAwMjIxICBNYXJ2ZWxsIFJESy04MDAyIEFkYXB0ZXIKLQkJMTE0OCAwMzIxICBNYXJ2ZWxsIFJESy04MDAzIEFkYXB0ZXIKLQkJMTE0OCAwNDIxICBNYXJ2ZWxsIFJESy04MDA0IEFkYXB0ZXIKLQkJMTE0OCAwNjIxICBNYXJ2ZWxsIFJESy04MDA2IEFkYXB0ZXIKLQkJMTE0OCAwNzIxICBNYXJ2ZWxsIFJESy04MDA3IEFkYXB0ZXIKLQkJMTE0OCAwODIxICBNYXJ2ZWxsIFJESy04MDA4IEFkYXB0ZXIKLQkJMTE0OCAwOTIxICBNYXJ2ZWxsIFJESy04MDA5IEFkYXB0ZXIKLQkJMTE0OCAxMTIxICBNYXJ2ZWxsIFJESy04MDExIEFkYXB0ZXIKLQkJMTE0OCAxMjIxICBNYXJ2ZWxsIFJESy04MDEyIEFkYXB0ZXIKLQkJMTE0OCAzMjIxICBTSy05NTIxIFYyLjAgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgotCQkxMTQ4IDUwMjEgIFNLLTk4MjEgVjIuMCBHaWdhYml0IEV0aGVybmV0IDEwLzEwMC8xMDAwQmFzZS1UIEFkYXB0ZXIKLQkJMTE0OCA1MDQxICBTSy05ODQxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1MWCBBZGFwdGVyCi0JCTExNDggNTA0MyAgU0stOTg0MyBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtU1ggQWRhcHRlcgotCQkxMTQ4IDUwNTEgIFNLLTk4NTEgVjIuMCBHaWdhYml0IEV0aGVybmV0IDEwMDBCYXNlLVNYIEFkYXB0ZXIKLQkJMTE0OCA1MDYxICBTSy05ODYxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1TWCBBZGFwdGVyCi0JCTExNDggNTA3MSAgU0stOTg3MSBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtWlggQWRhcHRlcgotCQkxMTQ4IDk1MjEgIFNLLTk1MjEgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgotCTQ0MDAgIFNLLTlEeHggR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JNDUwMCAgU0stOU14eCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKLQk5MDAwICBTSy05U3h4IEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgUENJLVgKLQk5ODQzICBbRnVqaXRzdV0gR2lnYWJpdCBFdGhlcm5ldAotCTllMDAgIFNLLTlFeHggMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgotCQkxMTQ4IDIxMDAgIFNLLTlFMjEgU2VydmVyIEFkYXB0ZXIKLQkJMTE0OCAyMWQwICBTSy05RTIxRCAxMC8xMDAvMTAwMEJhc2UtVCBBZGFwdGVyCi0JCTExNDggMjIwMCAgU0stOUUyMiBTZXJ2ZXIgQWRhcHRlcgotCQkxMTQ4IDgxMDAgIFNLLTlFODEgU2VydmVyIEFkYXB0ZXIKLQkJMTE0OCA4MjAwICBTSy05RTgyIFNlcnZlciBBZGFwdGVyCi0JCTExNDggOTEwMCAgU0stOUU5MSBTZXJ2ZXIgQWRhcHRlcgotCQkxMTQ4IDkyMDAgIFNLLTlFOTIgU2VydmVyIEFkYXB0ZXIKLTExNDkgIFdpbiBTeXN0ZW0gQ29ycG9yYXRpb24KLTExNGEgIFZNSUMKLQk1NTc5ICBWTUlQQ0ktNTU3OSAoUmVmbGVjdGl2ZSBNZW1vcnkgQ2FyZCkKLQk1NTg3ICBWTUlQQ0ktNTU4NyAoUmVmbGVjdGl2ZSBNZW1vcnkgQ2FyZCkKLQk2NTA0ICBWTUlDIFBDSSA3NzU1IEZQR0EKLQk3NTg3ICBWTUlWTUUtNzU4NwotMTE0YiAgQ2Fub3B1cyBDby4sIEx0ZAotMTE0YyAgQW5uYWJvb2tzCi0xMTRkICBJQyBDb3Jwb3JhdGlvbgotMTE0ZSAgTmlrb24gU3lzdGVtcyBJbmMKLTExNGYgIERpZ2kgSW50ZXJuYXRpb25hbAotCTAwMDIgIEFjY2VsZVBvcnQgRVBDCi0JMDAwMyAgUmlnaHRTd2l0Y2ggU0UtNgotCTAwMDQgIEFjY2VsZVBvcnQgWGVtCi0JMDAwNSAgQWNjZWxlUG9ydCBYcgotCTAwMDYgIEFjY2VsZVBvcnQgWHIsQy9YCi0JMDAwOSAgQWNjZWxlUG9ydCBYci9KCi0JMDAwYSAgQWNjZWxlUG9ydCBFUEMvSgotCTAwMGMgIERhdGFGaXJlUFJJbWUgVDEgKDEtcG9ydCkKLQkwMDBkICBTeW5jUG9ydCAyLVBvcnQgKHguMjUvRlIpCi0JMDAxMSAgQWNjZWxlUG9ydCA4ciBFSUEtMjMyIChJQk0pCi0JMDAxMiAgQWNjZWxlUG9ydCA4ciBFSUEtNDIyCi0JMDAxMyAgQWNjZWxlUG9ydCBYcgotCTAwMTQgIEFjY2VsZVBvcnQgOHIgRUlBLTQyMgotCTAwMTUgIEFjY2VsZVBvcnQgWGVtCi0JMDAxNiAgQWNjZWxlUG9ydCBFUEMvWAotCTAwMTcgIEFjY2VsZVBvcnQgQy9YCi0JMDAxYSAgRGF0YUZpcmVQUkltZSBFMSAoMS1wb3J0KQotCTAwMWIgIEFjY2VsZVBvcnQgQy9YIChJQk0pCi0JMDAxZCAgRGF0YUZpcmUgUkFTIFQxL0UxL1BSSQotCQkxMTRmIDAwNTAgIERhdGFGaXJlIFJBUyBFMSBBZGFwdGVyCi0JCTExNGYgMDA1MSAgRGF0YUZpcmUgUkFTIER1YWwgRTEgQWRhcHRlcgotCQkxMTRmIDAwNTIgIERhdGFGaXJlIFJBUyBUMSBBZGFwdGVyCi0JCTExNGYgMDA1MyAgRGF0YUZpcmUgUkFTIER1YWwgVDEgQWRhcHRlcgotCTAwMjMgIEFjY2VsZVBvcnQgUkFTCi0JMDAyNCAgRGF0YUZpcmUgUkFTIEI0IFNUL1UKLQkJMTE0ZiAwMDMwICBEYXRhRmlyZSBSQVMgQlJJIFUgQWRhcHRlcgotCQkxMTRmIDAwMzEgIERhdGFGaXJlIFJBUyBCUkkgUy9UIEFkYXB0ZXIKLQkwMDI2ICBBY2NlbGVQb3J0IDRyIDkyMAotCTAwMjcgIEFjY2VsZVBvcnQgWHIgOTIwCi0JMDAyOCAgQ2xhc3NpY0JvYXJkIDQKLQkwMDI5ICBDbGFzc2ljQm9hcmQgOAotCTAwMzQgIEFjY2VsZVBvcnQgMnIgOTIwCi0JMDAzNSAgRGF0YUZpcmUgRFNQIFQxL0UxL1BSSSBjUENJCi0JMDA0MCAgQWNjZWxlUG9ydCBYcAotCTAwNDIgIEFjY2VsZVBvcnQgMnAKLQkwMDQzICBBY2NlbGVQb3J0IDRwCi0JMDA0NCAgQWNjZWxlUG9ydCA4cAotCTAwNDUgIEFjY2VsZVBvcnQgMTZwCi0JMDA0ZSAgQWNjZWxlUG9ydCAzMnAKLQkwMDcwICBEYXRhZmlyZSBNaWNybyBWIElPTTIgKEV1cm9wZSkKLQkwMDcxICBEYXRhZmlyZSBNaWNybyBWIChFdXJvcGUpCi0JMDA3MiAgRGF0YWZpcmUgTWljcm8gViBJT00yIChOb3J0aCBBbWVyaWNhKQotCTAwNzMgIERhdGFmaXJlIE1pY3JvIFYgKE5vcnRoIEFtZXJpY2EpCi0JMDBiMCAgRGlnaSBOZW8gNAotCTAwYjEgIERpZ2kgTmVvIDgKLQkwMGM4ICBEaWdpIE5lbyAyIERCOQotCTAwYzkgIERpZ2kgTmVvIDIgREI5IFBSSQotCTAwY2EgIERpZ2kgTmVvIDIgUko0NQotCTAwY2IgIERpZ2kgTmVvIDIgUko0NSBQUkkKLQkwMGQwICBDbGFzc2ljQm9hcmQgNCA0MjIKLQkwMGQxICBDbGFzc2ljQm9hcmQgOCA0MjIKLQk2MDAxICBBdmFuc3RhcgotMTE1MCAgVGhpbmtpbmcgTWFjaGluZXMgQ29ycAotMTE1MSAgSkFFIEVsZWN0cm9uaWNzIEluYy4KLTExNTIgIE1lZ2F0ZWsKLTExNTMgIExhbmQgV2luIEVsZWN0cm9uaWMgQ29ycAotMTE1NCAgTWVsY28gSW5jCi0xMTU1ICBQaW5lIFRlY2hub2xvZ3kgTHRkCi0xMTU2ICBQZXJpc2NvcGUgRW5naW5lZXJpbmcKLTExNTcgIEF2c3lzIENvcnBvcmF0aW9uCi0xMTU4ICBWb2FyeCBSICYgRCBJbmMKLQkzMDExICBUb2tlbmV0L3ZnIDEwMDEvMTBtIGFueWxhbgotCTkwNTAgIExhbmZsZWV0L1RydWV2YWx1ZQotCTkwNTEgIExhbmZsZWV0L1RydWV2YWx1ZQotMTE1OSAgTXV0ZWNoIENvcnAKLQkwMDAxICBNVi0xMDAwCi0xMTVhICBIYXJsZXF1aW4gTHRkCi0xMTViICBQYXJhbGxheCBHcmFwaGljcwotMTE1YyAgUGhvdHJvbiBMdGQuCi0xMTVkICBYaXJjb20KLQkwMDAzICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMDE0IDAxODEgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTAxNCAxMTgxICAxMC8xMDAgRXRoZXJKZXQgQ2FyZGJ1cyBBZGFwdGVyCi0JCTEwMTQgODE4MSAgMTAvMTAwIEV0aGVySmV0IENhcmRidXMgQWRhcHRlcgotCQkxMDE0IDkxODEgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTE1ZCAwMTgxICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMTVkIDExODEgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExNzkgMDE4MSAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkJODA4NiA4MTgxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBNb2JpbGUgQ2FyZEJ1cyAzMiBBZGFwdGVyCi0JCTgwODYgOTE4MSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgTW9iaWxlIENhcmRCdXMgMzIgQWRhcHRlcgotCTAwMDUgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTEwMTQgMDE4MiAgMTAvMTAwIEV0aGVySmV0IENhcmRidXMgQWRhcHRlcgotCQkxMDE0IDExODIgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTE1ZCAwMTgyICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMTVkIDExODIgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JMDAwNyAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkJMTAxNCAwMTgyICAxMC8xMDAgRXRoZXJKZXQgQ2FyZGJ1cyBBZGFwdGVyCi0JCTEwMTQgMTE4MiAgMTAvMTAwIEV0aGVySmV0IENhcmRidXMgQWRhcHRlcgotCQkxMTVkIDAxODIgIENhcmRidXMgRXRoZXJuZXQgMTAvMTAwCi0JCTExNWQgMTE4MiAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkwMDBiICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCQkxMDE0IDAxODMgIDEwLzEwMCBFdGhlckpldCBDYXJkYnVzIEFkYXB0ZXIKLQkJMTE1ZCAwMTgzICBDYXJkYnVzIEV0aGVybmV0IDEwLzEwMAotCTAwMGMgIE1pbmktUENJIFYuOTAgNTZrIE1vZGVtCi0JMDAwZiAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkJMTAxNCAwMTgzICAxMC8xMDAgRXRoZXJKZXQgQ2FyZGJ1cyBBZGFwdGVyCi0JCTExNWQgMDE4MyAgQ2FyZGJ1cyBFdGhlcm5ldCAxMC8xMDAKLQkwMGQ0ICBNaW5pLVBDSSBLNTZGbGV4IE1vZGVtCi0JMDEwMSAgQ2FyZGJ1cyA1NmsgbW9kZW0KLQkJMTE1ZCAxMDgxICBDYXJkYnVzIDU2ayBNb2RlbQotCTAxMDMgIENhcmRidXMgRXRoZXJuZXQgKyA1NmsgTW9kZW0KLQkJMTAxNCA5MTgxICBDYXJkYnVzIDU2ayBNb2RlbQotCQkxMTE1IDExODEgIENhcmRidXMgRXRoZXJuZXQgMTAwICsgNTZrIE1vZGVtCi0JCTExNWQgMTE4MSAgQ0JFTTU2Ry0xMDAgRXRoZXJuZXQgKyA1NmsgTW9kZW0KLQkJODA4NiA5MTgxICBQUk8vMTAwIExBTiArIE1vZGVtNTYgQ2FyZEJ1cwotMTE1ZSAgUGVlciBQcm90b2NvbHMgSW5jCi0xMTVmICBNYXh0b3IgQ29ycG9yYXRpb24KLTExNjAgIE1lZ2Fzb2Z0IEluYwotMTE2MSAgUEZVIExpbWl0ZWQKLTExNjIgIE9BIExhYm9yYXRvcnkgQ28gTHRkCi0xMTYzICBSZW5kaXRpb24KLQkwMDAxICBWZXJpdGUgMTAwMAotCTIwMDAgIFZlcml0ZSBWMjAwMC9WMjEwMC9WMjIwMAotCQkxMDkyIDIwMDAgIFN0ZWFsdGggSUkgUzIyMAotMTE2NCAgQWR2YW5jZWQgUGVyaXBoZXJhbHMgVGVjaG5vbG9naWVzCi0xMTY1ICBJbWFncmFwaCBDb3Jwb3JhdGlvbgotCTAwMDEgIE1vdGlvbiBUUEVHIFJlY29yZGVyL1BsYXllciB3aXRoIGF1ZGlvCi0xMTY2ICBTZXJ2ZXJXb3JrcwotCTAwMDAgIENNSUMtTEUKLQkwMDA1ICBDTkIyMC1MRSBIb3N0IEJyaWRnZQotCTAwMDYgIENOQjIwSEUgSG9zdCBCcmlkZ2UKLQkwMDA3ICBDTkIyMC1MRSBIb3N0IEJyaWRnZQotCTAwMDggIENOQjIwSEUgSG9zdCBCcmlkZ2UKLQkwMDA5ICBDTkIyMExFIEhvc3QgQnJpZGdlCi0JMDAxMCAgQ0lPQjMwCi0JMDAxMSAgQ01JQy1IRQotCTAwMTIgIENNSUMtV1MgSG9zdCBCcmlkZ2UgKEdDLUxFIGNoaXBzZXQpCi0JMDAxMyAgQ05CMjAtSEUgSG9zdCBCcmlkZ2UKLQkwMDE0ICBDTUlDLUxFIEhvc3QgQnJpZGdlIChHQy1MRSBjaGlwc2V0KQotCTAwMTUgIENNSUMtR0MgSG9zdCBCcmlkZ2UKLQkwMDE2ICBDTUlDLUdDIEhvc3QgQnJpZGdlCi0JMDAxNyAgR0NOQi1MRSBIb3N0IEJyaWRnZQotCTAxMDEgIENJT0ItWDIgUENJLVggSS9PIEJyaWRnZQotCTAxMTAgIENJT0ItRSBJL08gQnJpZGdlIHdpdGggR2lnYWJpdCBFdGhlcm5ldAotCTAyMDAgIE9TQjQgU291dGggQnJpZGdlCi0JMDIwMSAgQ1NCNSBTb3V0aCBCcmlkZ2UKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JMDIwMyAgQ1NCNiBTb3V0aCBCcmlkZ2UKLQkwMjExICBPU0I0IElERSBDb250cm9sbGVyCi0JMDIxMiAgQ1NCNSBJREUgQ29udHJvbGxlcgotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkwMjEzICBDU0I2IFJBSUQvSURFIENvbnRyb2xsZXIKLQkwMjE3ICBDU0I2IElERSBDb250cm9sbGVyCi0JMDIyMCAgT1NCNC9DU0I1IE9IQ0kgVVNCIENvbnRyb2xsZXIKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JMDIyMSAgQ1NCNiBPSENJIFVTQiBDb250cm9sbGVyCi0JMDIyNSAgQ1NCNSBMUEMgYnJpZGdlCi0jIGNhbmNlbGxlZAotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkwMjI3ICBHQ0xFLTIgSG9zdCBCcmlkZ2UKLQkwMjMwICBDU0I1IExQQyBicmlkZ2UKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JMDI0MCAgSzIgU0FUQQotCTAyNDEgIEsyIFNBVEEKLQkwMjQyICBLMiBTQVRBCi0xMTY3ICBNdXRvaCBJbmR1c3RyaWVzIEluYwotMTE2OCAgVGhpbmUgRWxlY3Ryb25pY3MgSW5jCi0xMTY5ICBDZW50cmUgZm9yIERldmVsb3BtZW50IG9mIEFkdmFuY2VkIENvbXB1dGluZwotMTE2YSAgUG9sYXJpcyBDb21tdW5pY2F0aW9ucwotCTYxMDAgIEJ1cy9UYWcgQ2hhbm5lbAotCTY4MDAgIEVzY29uIENoYW5uZWwKLQk3MTAwICBCdXMvVGFnIENoYW5uZWwKLQk3ODAwICBFc2NvbiBDaGFubmVsCi0xMTZiICBDb25uZWN0d2FyZSBJbmMKLTExNmMgIEludGVsbGlnZW50IFJlc291cmNlcyBJbnRlZ3JhdGVkIFN5c3RlbXMKLTExNmQgIE1hcnRpbi1NYXJpZXR0YQotMTE2ZSAgRWxlY3Ryb25pY3MgZm9yIEltYWdpbmcKLTExNmYgIFdvcmtzdGF0aW9uIFRlY2hub2xvZ3kKLTExNzAgIEludmVudGVjIENvcnBvcmF0aW9uCi0xMTcxICBMb3VnaGJvcm91Z2ggU291bmQgSW1hZ2VzIFBsYwotMTE3MiAgQWx0ZXJhIENvcnBvcmF0aW9uCi0xMTczICBBZG9iZSBTeXN0ZW1zLCBJbmMKLTExNzQgIEJyaWRnZXBvcnQgTWFjaGluZXMKLTExNzUgIE1pdHJvbiBDb21wdXRlciBJbmMuCi0xMTc2ICBTQkUgSW5jb3Jwb3JhdGVkCi0xMTc3ICBTaWxpY29uIEVuZ2luZWVyaW5nCi0xMTc4ICBBbGZhLCBJbmMuCi0JYWZhMSAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyCi0xMTc5ICBUb3NoaWJhIEFtZXJpY2EgSW5mbyBTeXN0ZW1zCi0JMDEwMyAgRVgtSURFIFR5cGUtQgotCTA0MDQgIERWRCBEZWNvZGVyIGNhcmQKLQkwNDA2ICBUZWNyYSBWaWRlbyBDYXB0dXJlIGRldmljZQotCTA0MDcgIERWRCBEZWNvZGVyIGNhcmQgKFZlcnNpb24gMikKLQkwNjAxICBDUFUgdG8gUENJIGJyaWRnZQotCTA2MDMgIFRvUElDOTUgUENJIHRvIENhcmRCdXMgQnJpZGdlIGZvciBOb3RlYm9va3MKLQkwNjBhICBUb1BJQzk1Ci0JMDYwZiAgVG9QSUM5NwotCTA2MTcgIFRvUElDMTAwIFBDSSB0byBDYXJkYnVzIEJyaWRnZSB3aXRoIFpWIFN1cHBvcnQKLQkwNjE4ICBDUFUgdG8gUENJIGFuZCBQQ0kgdG8gSVNBIGJyaWRnZQotIyBDbGFpbWVkIHRvIGJlIEx1Y2VudCBEU1AxNjQ1IFtNYXJzXSwgYnV0IHRoYXQncyBhcHBhcmVudGx5IGluY29ycmVjdC4gRG9lcyBhbnlvbmUga25vdyB0aGUgY29ycmVjdCBJRD8KLQkwNzAxICBGSVIgUG9ydAotCTA4MDQgIFRDNjM3MUFGIFNtYXJ0TWVkaWEgQ29udHJvbGxlcgotCTA4MDUgIFNEIFR5cEEgQ29udHJvbGxlcgotCTBkMDEgIEZJUiBQb3J0IFR5cGUtRE8KLQkJMTE3OSAwMDAxICBGSVIgUG9ydCBUeXBlLURPCi0xMTdhICBBLVRyZW5kIFRlY2hub2xvZ3kKLTExN2IgIEwgRyBFbGVjdHJvbmljcywgSW5jLgotMTE3YyAgQXR0byBUZWNobm9sb2d5Ci0xMTdkICBCZWN0b24gJiBEaWNraW5zb24KLTExN2UgIFQvUiBTeXN0ZW1zCi0xMTdmICBJbnRlZ3JhdGVkIENpcmN1aXQgU3lzdGVtcwotMTE4MCAgUmljb2ggQ28gTHRkCi0JMDQ2NSAgUkw1YzQ2NQotCTA0NjYgIFJMNWM0NjYKLQkwNDc1ICBSTDVjNDc1Ci0JCTE0NGQgYzAwNiAgdnByIE1hdHJpeCAxNzBCNCBDYXJkQnVzIGJyaWRnZQotCTA0NzYgIFJMNWM0NzYgSUkKLQkJMTAxNCAwMTg1ICBUaGlua1BhZCBBL1QvWCBTZXJpZXMKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxMDRkIDgwZTcgIFZBSU8gUENHLUdSMjE0RVAvR1IyMTRNUC9HUjIxNU1QL0dSMzE0TVAvR1IzMTVNUAotCQkxNGVmIDAyMjAgIFBDRC1SUC0yMjBTCi0JMDQ3NyAgUkw1YzQ3NwotCTA0NzggIFJMNWM0NzgKLQkJMTAxNCAwMTg0ICBUaGlua1BhZCBBMzBwICgyNjUzLTY0RykKLQkwNTIyICBSNUM1MjIgSUVFRSAxMzk0IENvbnRyb2xsZXIKLQkJMTAxNCAwMWNmICBUaGlua1BhZCBBMzBwICgyNjUzLTY0RykKLQkwNTUxICBSNUM1NTEgSUVFRSAxMzk0IENvbnRyb2xsZXIKLQkJMTQ0ZCBjMDA2ICB2cHIgTWF0cml4IDE3MEI0Ci0JMDU1MiAgUjVDNTUyIElFRUUgMTM5NCBDb250cm9sbGVyCi0JCTEwMTQgMDUxMSAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JMDU3NiAgUjVDNTc2IFNEIEJ1cyBIb3N0IEFkYXB0ZXIKLQkwNTkyICBSNUM1OTIgTWVtb3J5IFN0aWNrIEJ1cyBIb3N0IEFkYXB0ZXIKLTExODEgIFRlbG1hdGljcyBJbnRlcm5hdGlvbmFsCi0xMTgzICBGdWppa3VyYSBMdGQKLTExODQgIEZvcmtzIEluYwotMTE4NSAgRGF0YXdvcmxkIEludGVybmF0aW9uYWwgTHRkCi0xMTg2ICBELUxpbmsgU3lzdGVtIEluYwotCTAxMDAgIERDMjEwNDEKLQkxMDAyICBETDEwMDUwIFN1bmRhbmNlIEV0aGVybmV0Ci0JCTExODYgMTAwMiAgREZFLTU1MFRYCi0JCTExODYgMTAxMiAgREZFLTU4MFRYCi0JMTAyNSAgQWlyUGx1cyBYdHJlbWUgRyBEV0wtRzY1MCBBZGFwdGVyCi0JMTAyNiAgQWlyWHBlcnQgRFdMLUFHNjUwIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCTEwNDMgIEFpclhwZXJ0IERXTC1BRzY1MCBXaXJlbGVzcyBDYXJkYnVzIEFkYXB0ZXIKLQkxMzAwICBSVEw4MTM5IEV0aGVybmV0Ci0JCTExODYgMTMwMCAgREZFLTUzOFRYIDEwLzEwMCBFdGhlcm5ldCBBZGFwdGVyCi0JCTExODYgMTMwMSAgREZFLTUzMFRYKyAxMC8xMDAgRXRoZXJuZXQgQWRhcHRlcgotCTEzNDAgIERGRS02OTBUWEQgQ2FyZEJ1cyBQQyBDYXJkCi0JMTU0MSAgREZFLTY4MFRYRCBDYXJkQnVzIFBDIENhcmQKLQkxNTYxICBEUlAtMzJUWEQgQ2FyZGJ1cyBQQyBDYXJkCi0JMjAyNyAgQWlyUGx1cyBYdHJlbWUgRyBEV0wtRzUyMCBBZGFwdGVyCi0JMzIwMyAgQWlyUGx1cyBYdHJlbWUgRyBEV0wtRzUyMCBBZGFwdGVyCi0JMzMwMCAgRFdMLTUxMCAyLjRHSHogV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkzYTAzICBBaXJQcm8gRFdMLUE2NTAgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyKHJldi5CKQotCTNhMDQgIEFpclBybyBEV0wtQUI2NTAgTXVsdGltb2RlIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCTNhMDUgIEFpclBybyBEV0wtQUI1MjAgTXVsdGltb2RlIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JM2EwNyAgQWlyWHBlcnQgRFdMLUFHNjUwIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCTNhMDggIEFpclhwZXJ0IERXTC1BRzUyMCBXaXJlbGVzcyBQQ0kgQWRhcHRlcgotCTNhMTAgIEFpclhwZXJ0IERXTC1BRzY1MCBXaXJlbGVzcyBDYXJkYnVzIEFkYXB0ZXIocmV2LkIpCi0JM2ExMSAgQWlyWHBlcnQgRFdMLUFHNTIwIFdpcmVsZXNzIFBDSSBBZGFwdGVyKHJldi5CKQotCTNhMTIgIEFpclBsdXMgRFdMLUc2NTAgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyKHJldi5DKQotCTNhMTMgIEFpclBsdXMgRFdMLUc1MjAgV2lyZWxlc3MgUENJIEFkYXB0ZXIocmV2LkIpCi0JM2ExNCAgQWlyUHJlbWllciBEV0wtQUc1MzAgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkzYTYzICBBaXJYcGVydCBEV0wtQUc2NjAgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyCi0JM2IwNSAgRFdMLUc2NTArIENhcmRCdXMgUEMgQ2FyZAotCTQwMDAgIERMMjAwMC1iYXNlZCBHaWdhYml0IEV0aGVybmV0Ci0JNDMwMCAgREdFLTUyOFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JNGMwMCAgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTExODYgNGMwMCAgREdFLTUzMFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JODQwMCAgRC1MaW5rIERXTC02NTArIENhcmRCdXMgUEMgQ2FyZAotMTE4NyAgQWR2YW5jZWQgVGVjaG5vbG9neSBMYWJvcmF0b3JpZXMsIEluYy4KLTExODggIFNoaW1hIFNlaWtpIE1hbnVmYWN0dXJpbmcgTHRkLgotMTE4OSAgTWF0c3VzaGl0YSBFbGVjdHJvbmljcyBDbyBMdGQKLTExOGEgIEhpbGV2ZWwgVGVjaG5vbG9neQotMTE4YiAgSHlwZXJ0ZWMgUHR5IExpbWl0ZWQKLTExOGMgIENvcm9sbGFyeSwgSW5jCi0JMDAxNCAgUENJQiBbQy1idXMgSUkgdG8gUENJIGJ1cyBob3N0IGJyaWRnZSBjaGlwXQotCTExMTcgIEludGVsIDgtd2F5IFhFT04gUHJvZnVzaW9uIENoaXBzZXQgW0NhY2hlIENvaGVyZW5jeSBGaWx0ZXJdCi0xMThkICBCaXRGbG93IEluYwotCTAwMDEgIFJhcHRvci1QQ0kgZnJhbWVncmFiYmVyCi0JMDAxMiAgTW9kZWwgMTIgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAwMTQgIE1vZGVsIDE0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMDI0ICBNb2RlbCAyNCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDA0NCAgTW9kZWwgNDQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAxMTIgIE1vZGVsIDEyIFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMTE0ICBNb2RlbCAxNCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDEyNCAgTW9kZWwgMjQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAxNDQgIE1vZGVsIDQ0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMjEyICBNb2RlbCAxMiBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDIxNCAgTW9kZWwgMTQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAyMjQgIE1vZGVsIDI0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMjQ0ICBNb2RlbCA0NCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDMxMiAgTW9kZWwgMTIgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotCTAzMTQgIE1vZGVsIDE0IFJvYWQgUnVubmVyIEZyYW1lIEdyYWJiZXIKLQkwMzI0ICBNb2RlbCAyNCBSb2FkIFJ1bm5lciBGcmFtZSBHcmFiYmVyCi0JMDM0NCAgTW9kZWwgNDQgUm9hZCBSdW5uZXIgRnJhbWUgR3JhYmJlcgotMTE4ZSAgSGVybXN0ZWR0IEdtYkgKLTExOGYgIEdyZWVuIExvZ2ljCi0xMTkwICBUcmlwYWNlCi0JYzczMSAgVFAtOTEwLzkyMC85NDAgUENJIFVsdHJhKFdpZGUpIFNDU0kgQWRhcHRlcgotMTE5MSAgQXJ0b3AgRWxlY3Ryb25pYyBDb3JwCi0JMDAwMyAgU0NTSSBDYWNoZSBIb3N0IEFkYXB0ZXIKLQkwMDA0ICBBVFA4NDAwCi0JMDAwNSAgQVRQODUwVUYKLQkwMDA2ICBBVFA4NjAgTk8tQklPUwotCTAwMDcgIEFUUDg2MAotCTAwMDggIEFUUDg2NSBOTy1ST00KLQkwMDA5ICBBVFA4NjUKLQk4MDAyICBBRUM2NzEwIFNDU0ktMiBIb3N0IEFkYXB0ZXIKLQk4MDEwICBBRUM2NzEyVVcgU0NTSQotCTgwMjAgIEFFQzY3MTJVIFNDU0kKLQk4MDMwICBBRUM2NzEyUyBTQ1NJCi0JODA0MCAgQUVDNjcxMkQgU0NTSQotCTgwNTAgIEFFQzY3MTJTVVcgU0NTSQotCTgwNjAgIEFFQzY3MTIgU0NTSQotCTgwODAgIEFFQzY3MTYwIFNDU0kKLQk4MDgxICBBRUM2NzE2MFMgU0NTSQotCTgwOGEgIEFFQzY3MTYyIDItY2guIExWRCBTQ1NJCi0xMTkyICBEZW5zYW4gQ29tcGFueSBMdGQKLTExOTMgIFplaXRuZXQgSW5jLgotCTAwMDEgIDEyMjEKLQkwMDAyICAxMjI1Ci0xMTk0ICBUb3VjYW4gVGVjaG5vbG9neQotMTE5NSAgUmF0b2MgU3lzdGVtIEluYwotMTE5NiAgSHl0ZWMgRWxlY3Ryb25pY3MgTHRkCi0xMTk3ICBHYWdlIEFwcGxpZWQgU2NpZW5jZXMsIEluYy4KLQkwMTBjICBDb21wdVNjb3BlIDgyRyA4Yml0IDJHUy9zIEFuYWxvZyBJbnB1dCBDYXJkCi0xMTk4ICBMYW1iZGEgU3lzdGVtcyBJbmMKLTExOTkgIEF0dGFjaG1hdGUgQ29ycG9yYXRpb24KLTExOWEgIE1pbmQgU2hhcmUsIEluYy4KLTExOWIgIE9tZWdhIE1pY3JvIEluYy4KLQkxMjIxICA4MkMwOTJHCi0xMTljICBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEluc3QuCi0xMTlkICBCdWcsIEluYy4gU2FwcG9ybyBKYXBhbgotMTE5ZSAgRnVqaXRzdSBNaWNyb2VsZWN0cm9uaWNzIEx0ZC4KLQkwMDAxICBGaXJlU3RyZWFtIDE1NQotCTAwMDMgIEZpcmVTdHJlYW0gNTAKLTExOWYgIEJ1bGwgSE4gSW5mb3JtYXRpb24gU3lzdGVtcwotMTFhMCAgQ29udmV4IENvbXB1dGVyIENvcnBvcmF0aW9uCi0xMWExICBIYW1hbWF0c3UgUGhvdG9uaWNzIEsuSy4KLTExYTIgIFNpZXJyYSBSZXNlYXJjaCBhbmQgVGVjaG5vbG9neQotMTFhMyAgRGV1cmV0emJhY2hlciBHbWJIICYgQ28uIEVuZy4gS0cKLTExYTQgIEJhcmNvIEdyYXBoaWNzIE5WCi0xMWE1ICBNaWNyb3VuaXR5IFN5c3RlbXMgRW5nLiBJbmMKLTExYTYgIFB1cmUgRGF0YSBMdGQuCi0xMWE3ICBQb3dlciBDb21wdXRpbmcgQ29ycC4KLTExYTggIFN5c3RlY2ggQ29ycC4KLTExYTkgIElubm9TeXMgSW5jLgotCTQyNDAgIEFNQ0MgUzkzM1EgSW50ZWxsaWdlbnQgU2VyaWFsIENhcmQKLTExYWEgIEFjdGVsCi0jIEZvcm1lcmx5IEdhbGlsZW8gVGVjaG5vbG9neSwgSW5jLgotMTFhYiAgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLQkwMTQ2ICBHVC02NDAxMC82NDAxMEEgU3lzdGVtIENvbnRyb2xsZXIKLQkxMzhmICBXODMwMCA4MDIuMTEgQWRhcHRlciAocmV2IDA3KQotCTFmYTYgIE1hcnZlbGwgVzgzMDAgODAyLjExIEFkYXB0ZXIKLQkxZmE3ICA4OFc4MzEwIGFuZCA4OFc4MDAwRyBbTGliZXJ0YXNdIDgwMi4xMWcgY2xpZW50IGNoaXBzZXQKLQk0MzIwICBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAxOSAwZjM4ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChFQ1MpCi0JCTEwMTkgODAwMSAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoRUNTKQotCQkxMDQzIDE3M2MgIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFzdXMpCi0JCTEwNDMgODExYSAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXN1cykKLQkJMTA1YiAwYzE5ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChGb3hjb25uKQotCQkxMGI4IGI0NTIgIFNNQyBFWiBDYXJkIDEwMDAgKFNNQzk0NTJUWFYuMikKLQkJMTFhYiAwMTIxICBNYXJ2ZWxsIFJESy04MDAxCi0JCTExYWIgMDMyMSAgTWFydmVsbCBSREstODAwMwotCQkxMWFiIDEwMjEgIE1hcnZlbGwgUkRLLTgwMTAKLQkJMTFhYiA1MDIxICBNYXJ2ZWxsIFl1a29uIEdpZ2FiaXQgRXRoZXJuZXQgMTAvMTAwLzEwMDBCYXNlLVQgQ29udHJvbGxlciAoNjQgYml0KQotCQkxMWFiIDk1MjEgIE1hcnZlbGwgWXVrb24gR2lnYWJpdCBFdGhlcm5ldCAxMC8xMDAvMTAwMEJhc2UtVCBDb250cm9sbGVyICgzMiBiaXQpCi0JCTE0NTggZTAwMCAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoR2lnYWJ5dGUpCi0JCTE0N2IgMTQwNiAgTWFydmVsbCA4OEU4MDAxIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQWJpdCkKLQkJMTVkNCAwMDQ3ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChJd2lsbCkKLQkJMTY5NSA5MDI1ICBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChFcG94KQotCQkxN2YyIDFjMDMgIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFsYmF0cm9uKQotCQkyNzBmIDI4MDMgIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENoYWludGVjaCkKLQk0MzUwICBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTE3OSAwMDAxICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChUb3NoaWJhKQotCQkxMWFiIDM1MjEgIE1hcnZlbGwgUkRLLTgwMzUKLQkJMTg1NCAwMDBkICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAwZSAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMGYgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDExICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxMiAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTYgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE3ICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxOCAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTkgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDFjICBNYXJ2ZWxsIDg4RTgwMzUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxZSAgTWFydmVsbCA4OEU4MDM1IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMjAgIE1hcnZlbGwgODhFODAzNSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQk0MzUxICBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTA3YiA0MDA5ICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChXaXN0cm9uKQotCQkxMGY3IDgzMzggIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKFBhbmFzb25pYykKLQkJMTE3OSAwMDAxICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChUb3NoaWJhKQotCQkxMTc5IGZmMDAgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKENvbXBhbCkKLQkJMTE3OSBmZjEwICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChJbnZlbnRlYykKLQkJMTFhYiAzNjIxICBNYXJ2ZWxsIFJESy04MDM2Ci0JCTEzZDEgYWMxMiAgQWJvY29tIEVGRTNLIC0gMTAvMTAwIEV0aGVybmV0IEV4cHJlc3NjYXJkCi0JCTE2MWYgMjAzZCAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoQXJpbWEpCi0JCTE4NTQgMDAwZCAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMGUgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDBmICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxMSAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTIgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE2ICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxNyAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTggIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE5ICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxYyAgTWFydmVsbCA4OEU4MDM2IEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMWUgIE1hcnZlbGwgODhFODAzNiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDIwICBNYXJ2ZWxsIDg4RTgwMzYgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JNDM2MCAgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwNDMgODEzNCAgTWFydmVsbCA4OEU4MDUyIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXN1cykKLQkJMTA3YiA0MDA5ICBNYXJ2ZWxsIDg4RTgwNTIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChXaXN0cm9uKQotCQkxMWFiIDUyMjEgIE1hcnZlbGwgUkRLLTgwNTIKLQkJMTQ1OCBlMDAwICBNYXJ2ZWxsIDg4RTgwNTIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChHaWdhYnl0ZSkKLQkJMTQ2MiAwNTJjICBNYXJ2ZWxsIDg4RTgwNTIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChNU0kpCi0JCTE4NDkgODA1MiAgTWFydmVsbCA4OEU4MDUyIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQVNSb2NrKQotCQkxOTQwIGUwMDAgIE1hcnZlbGwgODhFODA1MiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEdpZ2FieXRlKQotCQlhMGEwIDA1MDkgIE1hcnZlbGwgODhFODA1MiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFvcGVuKQotCTQzNjEgIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDdiIDMwMTUgIE1hcnZlbGwgODhFODA1MCBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEdhdGV3YXkpCi0JCTExYWIgNTAyMSAgTWFydmVsbCA4OEU4MDUwIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoSW50ZWwpCi0JCTgwODYgMzA2MyAgRDkyNVhDVkxLIG1haW5ib2FyZAotCTQzNjIgIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDNjIDJhMGQgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEFzdXMpCi0JCTEwNDMgODE0MiAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXN1cykKLQkJMTA5ZiAzMTk3ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChUcmlnZW0pCi0JCTEwZjcgODMzOCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoUGFuYXNvbmljKQotCQkxMGZkIGE0MzAgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKFNPWU8pCi0JCTExNzkgMDAwMSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoVG9zaGliYSkKLQkJMTE3OSBmZjAwICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb21wYWwpCi0JCTExNzkgZmYxMCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoSW52ZW50ZWMpCi0JCTExYWIgNTMyMSAgTWFydmVsbCBSREstODA1MwotCQkxMjk3IGMyNDAgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKFNodXR0bGUpCi0JCTEyOTcgYzI0MSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoU2h1dHRsZSkKLQkJMTI5NyBjMjQyICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChTaHV0dGxlKQotCQkxMjk3IGMyNDMgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKFNodXR0bGUpCi0JCTEyOTcgYzI0NCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoU2h1dHRsZSkKLQkJMTNkMSBhYzExICBBYm9jb20gRUdFNUsgLSBHaWdhIEV0aGVybmV0IEV4cHJlc3NjYXJkCi0JCTE0NTggZTAwMCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoR2lnYWJ5dGUpCi0JCTE0NjIgMDU4YyAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTVNJKQotCQkxNGMwIDAwMTIgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENvbXBhbCkKLQkJMTU1OCAwNGEwICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDbGV2bykKLQkJMTViZCAxMDAzICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChERkkpCi0JCTE2MWYgMjAzYyAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXJpbWEpCi0JCTE2MWYgMjAzZCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQXJpbWEpCi0JCTE2OTUgOTAyOSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoRXBveCkKLQkJMTdmMiAyYzA4ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChBbGJhdHJvbikKLQkJMTdmZiAwNTg1ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChRdWFudGEpCi0JCTE4NDkgODA1MyAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoQVNSb2NrKQotCQkxODU0IDAwMGIgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDBjICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxMCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMTMgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDE0ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxNSAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMWEgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDFiICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAxZCAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxODU0IDAwMWYgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExHRSkKLQkJMTg1NCAwMDIxICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMR0UpCi0JCTE4NTQgMDAyMiAgTWFydmVsbCA4OEU4MDUzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTEdFKQotCQkxOTQwIGUwMDAgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEdpZ2FieXRlKQotCQkyNzBmIDI4MDEgIE1hcnZlbGwgODhFODA1MyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENoYWludGVjaCkKLQkJYTBhMCAwNTA2ICBNYXJ2ZWxsIDg4RTgwNTMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChBb3BlbikKLQk0NjExICBHVC02NDExNSBTeXN0ZW0gQ29udHJvbGxlcgotCTQ2MjAgIEdULTY0MTIwLzY0MTIwQS82NDEyMUEgU3lzdGVtIENvbnRyb2xsZXIKLQk0ODAxICBHVC00ODAwMQotCTUwMDUgIEJlbGtpbiBGNUQ1MDA1IEdpZ2FiaXQgRGVza3RvcCBOZXR3b3JrIFBDSSBDYXJkCi0JNTA0MCAgTVY4OFNYNTA0MCA0LXBvcnQgU0FUQSBJIFBDSS1YIENvbnRyb2xsZXIKLQk1MDQxICBNVjg4U1g1MDQxIDQtcG9ydCBTQVRBIEkgUENJLVggQ29udHJvbGxlcgotCTUwODAgIE1WODhTWDUwODAgOC1wb3J0IFNBVEEgSSBQQ0ktWCBDb250cm9sbGVyCi0JNTA4MSAgTVY4OFNYNTA4MSA4LXBvcnQgU0FUQSBJIFBDSS1YIENvbnRyb2xsZXIKLQk2MDQxICBNVjg4U1g2MDQxIDQtcG9ydCBTQVRBIElJIFBDSS1YIENvbnRyb2xsZXIKLQk2MDgxICBNVjg4U1g2MDgxIDgtcG9ydCBTQVRBIElJIFBDSS1YIENvbnRyb2xsZXIKLQk2NDYwICBNVjY0MzYwLzY0MzYxLzY0MzYyIFN5c3RlbSBDb250cm9sbGVyCi0JZjAwMyAgR1QtNjQwMTAgUHJpbWFyeSBJbWFnZSBQaXJhbmhhIEltYWdlIEdlbmVyYXRvcgotMTFhYyAgQ2Fub24gSW5mb3JtYXRpb24gU3lzdGVtcyBSZXNlYXJjaCBBdXN0LgotMTFhZCAgTGl0ZS1PbiBDb21tdW5pY2F0aW9ucyBJbmMKLQkwMDAyICBMTkUxMDBUWAotCQkxMWFkIDAwMDIgIExORTEwMFRYCi0JCTExYWQgMDAwMyAgTE5FMTAwVFgKLQkJMTFhZCBmMDAzICBMTkUxMDBUWAotCQkxMWFkIGZmZmYgIExORTEwMFRYCi0JCTEzODUgZjAwNCAgRkEzMTBUWAotCWMxMTUgIExORTEwMFRYIFtMaW5rc3lzIEV0aGVyRmFzdCAxMC8xMDBdCi0JCTExYWQgYzAwMSAgTE5FMTAwVFggW3ZlciAyLjBdCi0xMWFlICBBenRlY2ggU3lzdGVtIEx0ZAotMTFhZiAgQXZpZCBUZWNobm9sb2d5IEluYy4KLQkwMDAxICBbQ2luZW1hXQotMTFiMCAgVjMgU2VtaWNvbmR1Y3RvciBJbmMuCi0JMDAwMiAgVjMwMFBTQwotCTAyOTIgIFYyOTJQQkMgW0FtMjkwMzAvNDAgQnJpZGdlXQotCTA5NjAgIFY5NnhQQkMKLQljOTYwICBWOTZEUEMKLTExYjEgIEFwcmljb3QgQ29tcHV0ZXJzCi0xMWIyICBFYXN0bWFuIEtvZGFrCi0xMWIzICBCYXJyIFN5c3RlbXMgSW5jLgotMTFiNCAgTGVpdGNoIFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbAotMTFiNSAgUmFkc3RvbmUgVGVjaG5vbG9neSBQbGMKLTExYjYgIFVuaXRlZCBWaWRlbyBDb3JwCi0xMWI3ICBNb3Rvcm9sYQotMTFiOCAgWFBvaW50IFRlY2hub2xvZ2llcywgSW5jCi0JMDAwMSAgUXVhZCBQZWVyTWFzdGVyCi0xMWI5ICBQYXRobGlnaHQgVGVjaG5vbG9neSBJbmMuCi0JYzBlZCAgU1NBIENvbnRyb2xsZXIKLTExYmEgIFZpZGVvdHJvbiBDb3JwCi0xMWJiICBQeXJhbWlkIFRlY2hub2xvZ3kKLTExYmMgIE5ldHdvcmsgUGVyaXBoZXJhbHMgSW5jCi0JMDAwMSAgTlAtUENJCi0xMWJkICBQaW5uYWNsZSBTeXN0ZW1zIEluYy4KLTExYmUgIEludGVybmF0aW9uYWwgTWljcm9jaXJjdWl0cyBJbmMKLTExYmYgIEFzdHJvZGVzaWduLCBJbmMuCi0xMWMwICBIZXdsZXR0IFBhY2thcmQKLTExYzEgIEFnZXJlIFN5c3RlbXMgKGZvcm1lciBMdWNlbnQgTWljcm9lbGVjdHJvbmljcykKLQkwNDQwICA1NmsgV2luTW9kZW0KLQkJMTAzMyA4MDE1ICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxMDMzIDgwNDcgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTEwMzMgODA0ZiAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkJMTBjZiAxMDJjICBMQiBMVCBNb2RlbSBWLjkwIDU2awotCQkxMGNmIDEwNGEgIEJJQkxPIExUIE1vZGVtIDU2awotCQkxMGNmIDEwNWYgIExCMiBMVCBNb2RlbSBWLjkwIDU2awotCQkxMTc5IDAwMDEgIEludGVybmFsIFYuOTAgTW9kZW0KLQkJMTFjMSAwNDQwICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxMjJkIDQxMDEgIE1EUDc4MDAtVSBNb2RlbQotCQkxMjJkIDQxMDIgIE1EUDc4MDBTUC1VIE1vZGVtCi0JCTEzZTAgMDA0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkJMTNlMCAwNDQwICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxM2UwIDA0NDEgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTEzZTAgMDQ1MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkJMTNlMCBmMTAwICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrRHN2ZAotCQkxM2UwIGYxMDEgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTE0NGQgMjEwMSAgTFQ1NlBWIE1vZGVtCi0JCTE0OWYgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLQkwNDQxICA1NmsgV2luTW9kZW0KLQkJMTAzMyA4MDRkICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgKLQkJMTAzMyA4MDY1ICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgKLQkJMTA5MiAwNDQwICBTdXByYSA1NmkKLQkJMTE3OSAwMDAxICBJbnRlcm5hbCBWLjkwIE1vZGVtCi0JCTExYzEgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTExYzEgMDQ0MSAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEyMmQgNDEwMCAgTURQNzgwMC1VIE1vZGVtCi0JCTEzZTAgMDA0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDEwMCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDQxMCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDQyMCAgVGVsZVBhdGggSW50ZXJuZXQgNTZrIFdpbk1vZGVtCi0JCTEzZTAgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDQ0MyAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgZjEwMiAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTE0MTYgOTgwNCAgQ29tbVdhdmUgNTZrIE1vZGVtCi0JCTE0MWQgMDQ0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTE0NGYgMDQ0MSAgTHVjZW50IDU2ayBWLjkwIERGIE1vZGVtCi0JCTE0NGYgMDQ0OSAgTHVjZW50IDU2ayBWLjkwIERGIE1vZGVtCi0JCTE0NGYgMTEwZCAgTHVjZW50IFdpbiBNb2RlbQotCQkxNDY4IDA0NDEgIFByZXNhcmlvIDU2ayBWLjkwIERGIE1vZGVtCi0JCTE2NjggMDQ0MCAgTHVjZW50IFdpbiBNb2RlbQotCTA0NDIgIDU2ayBXaW5Nb2RlbQotCQkxMWMxIDA0NDAgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxMWMxIDA0NDIgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxM2UwIDA0MTIgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxM2UwIDA0NDIgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxM2ZjIDI0NzEgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxNDRkIDIxMDQgIExUNTZQVCBNb2RlbQotCQkxNDRmIDExMDQgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxNDlmIDA0NDAgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCQkxNjY4IDA0NDAgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStWb2ljZVZpZXcrRHN2ZAotCTA0NDMgIExUIFdpbk1vZGVtCi0JMDQ0NCAgTFQgV2luTW9kZW0KLQkwNDQ1ICBMVCBXaW5Nb2RlbQotCQk4MDg2IDIyMDMgIFBSTy8xMDArIE1pbmlQQ0kgKHByb2JhYmx5IGFuIEFtYml0IFU5OC4wMDMuQy4wMCBjb21ibyBjYXJkKQotCQk4MDg2IDIyMDQgIFBSTy8xMDArIE1pbmlQQ0kgb24gQXJtYWRhIEU1MDAKLQkwNDQ2ICBMVCBXaW5Nb2RlbQotCTA0NDcgIExUIFdpbk1vZGVtCi0JMDQ0OCAgV2luTW9kZW0gNTZrCi0JCTEwMTQgMDEzMSAgTHVjZW50IFdpbiBNb2RlbQotCQkxMDMzIDgwNjYgIExUIFdpbk1vZGVtIDU2ayBEYXRhK0ZheCtWb2ljZStEc3ZkCi0JCTEzZTAgMDAzMCAgNTZrIFZvaWNlIE1vZGVtCi0JCTEzZTAgMDA0MCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4K1ZvaWNlK0RzdmQKLSMgQWN0aW9udGVjaCBldGgrbW9kZW0gY2FyZCBhcyB1c2VkIGJ5IERlbGwgJmMuCi0JCTE2NjggMjQwMCAgTFQgV2luTW9kZW0gNTZrIChNaW5pUENJIEV0aGVybmV0K01vZGVtKQotCTA0NDkgIFdpbk1vZGVtIDU2awotCQkwZTExIGIxNGQgIDU2ayBWLjkwIE1vZGVtCi0JCTEzZTAgMDAyMCAgTFQgV2luTW9kZW0gNTZrIERhdGErRmF4Ci0JCTEzZTAgMDA0MSAgVGVsZVBhdGggSW50ZXJuZXQgNTZrIFdpbk1vZGVtCi0JCTE0MzYgMDQ0MCAgTHVjZW50IFdpbiBNb2RlbQotCQkxNDRmIDA0NDkgIEx1Y2VudCA1NmsgVi45MCBERmkgTW9kZW0KLQkJMTQ2OCAwNDEwICBJQk0gVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykKLQkJMTQ2OCAwNDQwICBMdWNlbnQgV2luIE1vZGVtCi0JCTE0NjggMDQ0OSAgUHJlc2FyaW8gNTZrIFYuOTAgREZpIE1vZGVtCi0JMDQ0YSAgRi0xMTU2SVYgV2luTW9kZW0gKFY5MCwgNTZLRmxleCkKLQkJMTBjZiAxMDcyICBMQiBHbG9iYWwgTFQgTW9kZW0KLQkJMTNlMCAwMDEyICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrVm9pY2VWaWV3K0RzdmQKLQkJMTNlMCAwMDQyICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrVm9pY2VWaWV3K0RzdmQKLQkJMTQ0ZiAxMDA1ICBMVCBXaW5Nb2RlbSA1NmsgRGF0YStGYXgrVm9pY2UrVm9pY2VWaWV3K0RzdmQKLQkwNDRiICBMVCBXaW5Nb2RlbQotCTA0NGMgIExUIFdpbk1vZGVtCi0JMDQ0ZCAgTFQgV2luTW9kZW0KLQkwNDRlICBMVCBXaW5Nb2RlbQotCTA0NGYgIFY5MCBXaWxkV2lyZSBNb2RlbQotCTA0NTAgIExUIFdpbk1vZGVtCi0JCTEwMzMgODBhOCAgVmVyc2EgTm90ZSBWeGkKLQkJMTQ0ZiA0MDA1ICBNYWduaWEgU0cyMAotCTA0NTEgIExUIFdpbk1vZGVtCi0JMDQ1MiAgTFQgV2luTW9kZW0KLQkwNDUzICBMVCBXaW5Nb2RlbQotCTA0NTQgIExUIFdpbk1vZGVtCi0JMDQ1NSAgTFQgV2luTW9kZW0KLQkwNDU2ICBMVCBXaW5Nb2RlbQotCTA0NTcgIExUIFdpbk1vZGVtCi0JMDQ1OCAgTFQgV2luTW9kZW0KLQkwNDU5ICBMVCBXaW5Nb2RlbQotCTA0NWEgIExUIFdpbk1vZGVtCi0JMDQ1YyAgTFQgV2luTW9kZW0KLQkwNDYxICBWOTAgV2lsZFdpcmUgTW9kZW0KLQkwNDYyICBWOTAgV2lsZFdpcmUgTW9kZW0KLQkwNDgwICBWZW51cyBNb2RlbSAoVjkwLCA1NktGbGV4KQotCTA0OGMgIFYuOTIgNTZLIFdpbk1vZGVtCi0jIEluUG9ydGUgSG9tZSBJbnRlcm5hbCA1NmsgTW9kZW0vZmF4L2Fuc3dlcmluZyBtYWNoaW5lL1NNUyBGZWF0dXJlcwotCTA0OGYgIFYuOTIgNTZrIFdpbk1vZGVtCi0JNTgwMSAgVVNCCi0JNTgwMiAgVVNTLTMxMiBVU0IgQ29udHJvbGxlcgotIyA0IHBvcnQgUENJIFVTQiBDb250cm9sbGVyIG1hZGUgYnkgQWdlcmUgKGZvcm1lbHkgTHVjZW50KQotCTU4MDMgIFVTUy0zNDRTIFVTQiBDb250cm9sbGVyCi0JNTgxMSAgRlczMjMKLQkJODA4NiA1MjRjICBEODY1UEVSTCBtYWluYm9hcmQKLQkJZGVhZCAwODAwICBGaXJlV2lyZSBIb3N0IEJ1cyBBZGFwdGVyCi0JYWIxMCAgV0w2MDAxMCBXaXJlbGVzcyBMQU4gTUFDCi0JYWIxMSAgV0w2MDA0MCBNdWx0aW1vZGUgV2lyZWxlcyBMQU4gTUFDCi0JCTExYzEgYWIxMiAgV2F2ZUxBTiAxMWFiZyBDYXJkYnVzIGNhcmQgKE1vZGVsIDExMDIpCi0JCTExYzEgYWIxMyAgV2F2ZUxBTiAxMWFiZyBNaW5pUENJIGNhcmQgKE1vZGVsIDA1MTIpCi0JCTExYzEgYWIxNSAgV2F2ZUxBTiAxMWFiZyBDYXJkYnVzIGNhcmQgKE1vZGVsIDExMDYpCi0JCTExYzEgYWIxNiAgV2F2ZUxBTiAxMWFiZyBNaW5pUENJIGNhcmQgKE1vZGVsIDA1MTYpCi0JYWIyMCAgT1JpTk9DTyBQQ0kgQWRhcHRlcgotCWFiMjEgIEFnZXJlIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JYWIzMCAgSGVybWVzMiBNaW5pLVBDSSBXYXZlTEFOIGEvYi9nCi0JCTE0Y2QgMjAxMiAgSGVybWVzMiBNaW5pLVBDSSBXYXZlTEFOIGEvYi9nCi0xMWMyICBTYW5kIE1pY3JvZWxlY3Ryb25pY3MKLTExYzMgIE5FQyBDb3Jwb3JhdGlvbgotMTFjNCAgRG9jdW1lbnQgVGVjaG5vbG9naWVzLCBJbmMKLTExYzUgIFNoaXZhIENvcnBvcmF0aW9uCi0xMWM2ICBEYWluaXBwb24gU2NyZWVuIE1mZy4gQ28uIEx0ZAotMTFjNyAgRC5DLk0uIERhdGEgU3lzdGVtcwotMTFjOCAgRG9scGhpbiBJbnRlcmNvbm5lY3QgU29sdXRpb25zIEFTCi0JMDY1OCAgUFNCMzIgU0NJLUFkYXB0ZXIgRDMxeAotCWQ2NjUgIFBTQjY0IFNDSS1BZGFwdGVyIEQzMngKLQlkNjY3ICBQU0I2NiBTQ0ktQWRhcHRlciBEMzN4Ci0xMWM5ICBNYWdtYQotCTAwMTAgIDE2LWxpbmUgc2VyaWFsIHBvcnQgdy8tIERNQQotCTAwMTEgIDQtbGluZSBzZXJpYWwgcG9ydCB3Ly0gRE1BCi0xMWNhICBMU0kgU3lzdGVtcywgSW5jCi0xMWNiICBTcGVjaWFsaXggUmVzZWFyY2ggTHRkLgotCTIwMDAgIFBDSV85MDUwCi0JCTExY2IgMDIwMCAgU1gKLQkJMTFjYiBiMDA4ICBJL084KwotCTQwMDAgIFNVUElfMQotCTgwMDAgIFQyMjUKLTExY2MgIE1pY2hlbHMgJiBLbGViZXJob2ZmIENvbXB1dGVyIEdtYkgKLTExY2QgIEhBTCBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCi0xMWNlICBOZXRhY2Nlc3MKLTExY2YgIFBpb25lZXIgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotMTFkMCAgTG9ja2hlZWQgTWFydGluIEZlZGVyYWwgU3lzdGVtcy1NYW5hc3NhcwotMTFkMSAgQXVyYXZpc2lvbgotCTAxZjcgIFZ4UDUyNAotMTFkMiAgSW50ZXJjb20gSW5jLgotMTFkMyAgVHJhbmNlbGwgU3lzdGVtcyBJbmMKLTExZDQgIEFuYWxvZyBEZXZpY2VzCi0JMTUzNSAgQmxhY2tmaW4gQkY1MzUgcHJvY2Vzc29yCi0JMTgwNSAgU001NiBQQ0kgbW9kZW0KLQkxODg5ICBBRDE4ODkgc291bmQgY2hpcAotMTFkNSAgSWtvbiBDb3Jwb3JhdGlvbgotCTAxMTUgIDEwMTE1Ci0JMDExNyAgMTAxMTcKLTExZDYgIFRla2VsZWMgVGVsZWNvbQotMTFkNyAgVHJlbnRvbiBUZWNobm9sb2d5LCBJbmMuCi0xMWQ4ICBJbWFnZSBUZWNobm9sb2dpZXMgRGV2ZWxvcG1lbnQKLTExZDkgIFRFQyBDb3Jwb3JhdGlvbgotMTFkYSAgTm92ZWxsCi0xMWRiICBTZWdhIEVudGVycHJpc2VzIEx0ZAotMTFkYyAgUXVlc3RyYSBDb3Jwb3JhdGlvbgotMTFkZCAgQ3Jvc2ZpZWxkIEVsZWN0cm9uaWNzIExpbWl0ZWQKLTExZGUgIFpvcmFuIENvcnBvcmF0aW9uCi0JNjA1NyAgWlIzNjA1N1BRQyBWaWRlbyBjdXR0aW5nIGNoaXBzZXQKLQkJMTAzMSA3ZWZlICBEQzEwIFBsdXMKLQkJMTAzMSBmYzAwICBNaXJvVklERU8gREM1MCwgTW90aW9uIEpQRUcgQ2FwdHVyZS9DT0RFQyBCb2FyZAotCQkxM2NhIDQyMzEgIEpQRUcvVFYgQ2FyZAotCTYxMjAgIFpSMzYxMjAKLQkJMTMyOCBmMDAxICBDaW5lbWFzdGVyIEMgRFZEIERlY29kZXIKLTExZGYgIE5ldyBXYXZlIFBERwotMTFlMCAgQ3JheSBDb21tdW5pY2F0aW9ucyBBL1MKLTExZTEgIEdFQyBQbGVzc2V5IFNlbWkgSW5jLgotMTFlMiAgU2Ftc3VuZyBJbmZvcm1hdGlvbiBTeXN0ZW1zIEFtZXJpY2EKLTExZTMgIFF1aWNrbG9naWMgQ29ycG9yYXRpb24KLQk1MDMwICBQQyBXYXRjaGRvZwotMTFlNCAgU2Vjb25kIFdhdmUgSW5jCi0xMWU1ICBJSVggQ29uc3VsdGluZwotMTFlNiAgTWl0c3VpLVpvc2VuIFN5c3RlbSBSZXNlYXJjaAotMTFlNyAgVG9zaGliYSBBbWVyaWNhLCBFbGVjLiBDb21wYW55Ci0xMWU4ICBEaWdpdGFsIFByb2Nlc3NpbmcgU3lzdGVtcyBJbmMuCi0xMWU5ICBIaWdod2F0ZXIgRGVzaWducyBMdGQuCi0xMWVhICBFbHNhZyBCYWlsZXkKLTExZWIgIEZvcm1hdGlvbiBJbmMuCi0xMWVjICBDb3JlY28gSW5jCi0xMWVkICBNZWRpYW1hdGljcwotMTFlZSAgRG9tZSBJbWFnaW5nIFN5c3RlbXMgSW5jCi0xMWVmICBOaWNvbGV0IFRlY2hub2xvZ2llcyBCLlYuCi0xMWYwICBDb21wdS1TaGFjawotCTQyMzEgIEZEREkKLQk0MjMyICBGQVNUbGluZSBVVFAgUXVhdHRybwotCTQyMzMgIEZBU1RsaW5lIEZPCi0JNDIzNCAgRkFTVGxpbmUgVVRQCi0JNDIzNSAgRkFTVGxpbmUtSUkgVVRQCi0JNDIzNiAgRkFTVGxpbmUtSUkgRk8KLQk0NzMxICBHSUdBbGluZQotMTFmMSAgU3ltYmlvcyBMb2dpYyBJbmMKLTExZjIgIFBpY3R1cmUgVGVsIEphcGFuIEsuSy4KLTExZjMgIEtlaXRobGV5IE1ldHJhYnl0ZQotMTFmNCAgS2luZXRpYyBTeXN0ZW1zIENvcnBvcmF0aW9uCi0JMjkxNSAgQ0FNQUMgY29udHJvbGxlcgotMTFmNSAgQ29tcHV0aW5nIERldmljZXMgSW50ZXJuYXRpb25hbAotMTFmNiAgQ29tcGV4Ci0JMDExMiAgRU5ldDEwMFZHNAotCTAxMTMgIEZyZWVkb21MaW5lIDEwMAotCTE0MDEgIFJlYWR5TGluayAyMDAwCi0JMjAxMSAgUkwxMDAtQVRYIDEwLzEwMAotCQkxMWY2IDIwMTEgIFJMMTAwLUFUWAotCTIyMDEgIFJlYWR5TGluayAxMDBUWCAoV2luYm9uZCBXODlDODQwKQotCQkxMWY2IDIwMTEgIFJlYWR5TGluayAxMDBUWAotCTk4ODEgIFJMMTAwVFggRmFzdCBFdGhlcm5ldAotMTFmNyAgU2NpZW50aWZpYyBBdGxhbnRhCi0xMWY4ICBQTUMtU2llcnJhIEluYy4KLQk3Mzc1ICBQTTczNzUgW0xBU0FSLTE1NSBBVE0gU0FSXQotMTFmOSAgSS1DdWJlIEluYwotMTFmYSAgS2FzYW4gRWxlY3Ryb25pY3MgQ29tcGFueSwgTHRkLgotMTFmYiAgRGF0ZWwgSW5jCi0xMWZjICBTaWxpY29uIE1hZ2ljCi0xMWZkICBIaWdoIFN0cmVldCBDb25zdWx0YW50cwotMTFmZSAgQ29tdHJvbCBDb3Jwb3JhdGlvbgotCTAwMDEgIFJvY2tldFBvcnQgMzIgcG9ydCB3L2V4dGVybmFsIEkvRgotCTAwMDIgIFJvY2tldFBvcnQgOCBwb3J0IHcvZXh0ZXJuYWwgSS9GCi0JMDAwMyAgUm9ja2V0UG9ydCAxNiBwb3J0IHcvZXh0ZXJuYWwgSS9GCi0JMDAwNCAgUm9ja2V0UG9ydCA0IHBvcnQgdy9xdWFkIGNhYmxlCi0JMDAwNSAgUm9ja2V0UG9ydCA4IHBvcnQgdy9vY3RhIGNhYmxlCi0JMDAwNiAgUm9ja2V0UG9ydCA4IHBvcnQgdy9SSjExIGNvbm5lY3RvcnMKLQkwMDA3ICBSb2NrZXRQb3J0IDQgcG9ydCB3L1JKMTEgY29ubmVjdG9ycwotCTAwMDggIFJvY2tldFBvcnQgOCBwb3J0IHcvIERCNzggU05JIChTaWVtZW5zKSBjb25uZWN0b3IKLQkwMDA5ICBSb2NrZXRQb3J0IDE2IHBvcnQgdy8gREI3OCBTTkkgKFNpZW1lbnMpIGNvbm5lY3RvcgotCTAwMGEgIFJvY2tldFBvcnQgUGx1cyA0IHBvcnQKLQkwMDBiICBSb2NrZXRQb3J0IFBsdXMgOCBwb3J0Ci0JMDAwYyAgUm9ja2V0TW9kZW0gNiBwb3J0Ci0JMDAwZCAgUm9ja2V0TW9kZW0gNC1wb3J0Ci0JMDAwZSAgUm9ja2V0UG9ydCBQbHVzIDIgcG9ydCBSUzIzMgotCTAwMGYgIFJvY2tldFBvcnQgUGx1cyAyIHBvcnQgUlM0MjIKLQkwODAxICBSb2NrZXRQb3J0IFVQQ0kgMzIgcG9ydCB3L2V4dGVybmFsIEkvRgotCTA4MDIgIFJvY2tldFBvcnQgVVBDSSA4IHBvcnQgdy9leHRlcm5hbCBJL0YKLQkwODAzICBSb2NrZXRQb3J0IFVQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRgotCTA4MDUgIFJvY2tldFBvcnQgVVBDSSA4IHBvcnQgdy9vY3RhIGNhYmxlCi0JMDgwYyAgUm9ja2V0TW9kZW0gSUlJIDggcG9ydAotCTA4MGQgIFJvY2tldE1vZGVtIElJSSA0IHBvcnQKLQkwOTAzICBSb2NrZXRQb3J0IENvbXBhY3QgUENJIDE2IHBvcnQgdy9leHRlcm5hbCBJL0YKLQk4MDE1ICBSb2NrZXRQb3J0IDQtcG9ydCBVQVJUIDE2OTU0Ci0xMWZmICBTY2lvbiBDb3Jwb3JhdGlvbgotCTAwMDMgIEFHLTUKLTEyMDAgIENTUyBDb3Jwb3JhdGlvbgotMTIwMSAgVmlzdGEgQ29udHJvbHMgQ29ycAotMTIwMiAgTmV0d29yayBHZW5lcmFsIENvcnAuCi0JNDMwMCAgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEyMDIgOTg0MSAgU0stOTg0MSBMWAotCQkxMjAyIDk4NDIgIFNLLTk4NDEgTFggZHVhbCBsaW5rCi0JCTEyMDIgOTg0MyAgU0stOTg0MyBTWAotCQkxMjAyIDk4NDQgIFNLLTk4NDMgU1ggZHVhbCBsaW5rCi0xMjAzICBCYXllciBDb3Jwb3JhdGlvbiwgQWdmYSBEaXZpc2lvbgotMTIwNCAgTGF0dGljZSBTZW1pY29uZHVjdG9yIENvcnBvcmF0aW9uCi0xMjA1ICBBcnJheSBDb3Jwb3JhdGlvbgotMTIwNiAgQW1kYWhsIENvcnBvcmF0aW9uCi0xMjA4ICBQYXJzeXRlYyBHbWJICi0JNDg1MyAgSFMtTGluayBEZXZpY2UKLTEyMDkgIFNDSSBTeXN0ZW1zIEluYwotMTIwYSAgU3luYXB0ZWwKLTEyMGIgIEFkYXB0aXZlIFNvbHV0aW9ucwotMTIwYyAgVGVjaG5pY2FsIENvcnAuCi0xMjBkICBDb21wcmVzc2lvbiBMYWJzLCBJbmMuCi0xMjBlICBDeWNsYWRlcyBDb3Jwb3JhdGlvbgotCTAxMDAgIEN5Y2xvbS1ZIGJlbG93IGZpcnN0IG1lZ2FieXRlCi0JMDEwMSAgQ3ljbG9tLVkgYWJvdmUgZmlyc3QgbWVnYWJ5dGUKLQkwMTAyICBDeWNsb20tNFkgYmVsb3cgZmlyc3QgbWVnYWJ5dGUKLQkwMTAzICBDeWNsb20tNFkgYWJvdmUgZmlyc3QgbWVnYWJ5dGUKLQkwMTA0ICBDeWNsb20tOFkgYmVsb3cgZmlyc3QgbWVnYWJ5dGUKLQkwMTA1ICBDeWNsb20tOFkgYWJvdmUgZmlyc3QgbWVnYWJ5dGUKLQkwMjAwICBDeWNsYWRlcy1aIGJlbG93IGZpcnN0IG1lZ2FieXRlCi0JMDIwMSAgQ3ljbGFkZXMtWiBhYm92ZSBmaXJzdCBtZWdhYnl0ZQotCTAzMDAgIFBDMzAwL1JTViBvciAvWDIxICgyIHBvcnRzKQotCTAzMDEgIFBDMzAwL1JTViBvciAvWDIxICgxIHBvcnQpCi0JMDMxMCAgUEMzMDAvVEUgKDIgcG9ydHMpCi0JMDMxMSAgUEMzMDAvVEUgKDEgcG9ydCkKLQkwMzIwICBQQzMwMC9URS1NICgyIHBvcnRzKQotCTAzMjEgIFBDMzAwL1RFLU0gKDEgcG9ydCkKLQkwNDAwICBQQzQwMAotMTIwZiAgRXNzZW50aWFsIENvbW11bmljYXRpb25zCi0JMDAwMSAgUm9hZHJ1bm5lciBzZXJpYWwgSElQUEkKLTEyMTAgIEh5cGVycGFyYWxsZWwgVGVjaG5vbG9naWVzCi0xMjExICBCcmFpbnRlY2ggSW5jCi0xMjEyICBLaW5nc3RvbiBUZWNobm9sb2d5IENvcnAuCi0xMjEzICBBcHBsaWVkIEludGVsbGlnZW50IFN5c3RlbXMsIEluYy4KLTEyMTQgIFBlcmZvcm1hbmNlIFRlY2hub2xvZ2llcywgSW5jLgotMTIxNSAgSW50ZXJ3YXJlIENvLiwgTHRkCi0xMjE2ICBQdXJ1cCBQcmVwcmVzcyBBL1MKLTEyMTcgIE8yIE1pY3JvLCBJbmMuCi0JNjcyOSAgT1o2NzI5Ci0JNjczYSAgT1o2NzMwCi0JNjgzMiAgT1o2ODMyLzY4MzMgQ2FyZEJ1cyBDb250cm9sbGVyCi0JNjgzNiAgT1o2ODM2LzY4NjAgQ2FyZEJ1cyBDb250cm9sbGVyCi0JNjg3MiAgT1o2ODEyIENhcmRCdXMgQ29udHJvbGxlcgotCTY5MjUgIE9aNjkyMiBDYXJkQnVzIENvbnRyb2xsZXIKLQk2OTMzICBPWjY5MzMvNzExRTEgQ2FyZEJ1cy9TbWFydENhcmRCdXMgQ29udHJvbGxlcgotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyIFRYCi0JNjk3MiAgT1o2MDEvNjkxMi83MTFFMCBDYXJkQnVzL1NtYXJ0Q2FyZEJ1cyBDb250cm9sbGVyCi0JCTEwMTQgMDIwYyAgVGhpbmtQYWQgUjMwCi0JCTExNzkgMDAwMSAgTWFnbmlhIFozMTAKLQk3MTEwICBPWjcxMU14IDQtaW4tMSBNZW1vcnlDYXJkQnVzIEFjY2VsZXJhdG9yCi0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQk3MTEyICBPWjcxMUVDMS9NMSBTbWFydENhcmRCdXMvTWVtb3J5Q2FyZEJ1cyBDb250cm9sbGVyCi0JNzExMyAgT1o3MTFFQzEgU21hcnRDYXJkQnVzIENvbnRyb2xsZXIKLQk3MTE0ICBPWjcxMU0xL01DMSA0LWluLTEgTWVtb3J5Q2FyZEJ1cyBDb250cm9sbGVyCi0JNzEzNCAgT1o3MTFNUDEvTVMxIE1lbW9yeUNhcmRCdXMgQ29udHJvbGxlcgotCTcxZTIgIE9aNzExRTIgU21hcnRDYXJkQnVzIENvbnRyb2xsZXIKLQk3MjEyICBPWjcxMU0yIDQtaW4tMSBNZW1vcnlDYXJkQnVzIENvbnRyb2xsZXIKLQk3MjEzICBPWjY5MzNFIENhcmRCdXMgQ29udHJvbGxlcgotCTcyMjMgIE9aNzExTTMvTUMzIDQtaW4tMSBNZW1vcnlDYXJkQnVzIENvbnRyb2xsZXIKLQkJMTAzYyAwODhjICBuYzgwMDAgbGFwdG9wCi0JCTEwM2MgMDg5MCAgbmM2MDAwIGxhcHRvcAotCTcyMzMgIE9aNzExTVAzL01TMyA0LWluLTEgTWVtb3J5Q2FyZEJ1cyBDb250cm9sbGVyCi0xMjE4ICBIeWJyaWNvbiBDb3JwLgotMTIxOSAgRmlyc3QgVmlydHVhbCBDb3Jwb3JhdGlvbgotMTIxYSAgM0RmeCBJbnRlcmFjdGl2ZSwgSW5jLgotCTAwMDEgIFZvb2RvbwotCTAwMDIgIFZvb2RvbyAyCi0JMDAwMyAgVm9vZG9vIEJhbnNoZWUKLQkJMTA5MiAwMDAzICBNb25zdGVyIEZ1c2lvbgotCQkxMDkyIDQwMDAgIE1vbnN0ZXIgRnVzaW9uCi0JCTEwOTIgNDAwMiAgTW9uc3RlciBGdXNpb24KLQkJMTA5MiA0ODAxICBNb25zdGVyIEZ1c2lvbiBBR1AKLQkJMTA5MiA0ODAzICBNb25zdGVyIEZ1c2lvbiBBR1AKLQkJMTA5MiA4MDMwICBNb25zdGVyIEZ1c2lvbgotCQkxMDkyIDgwMzUgIE1vbnN0ZXIgRnVzaW9uIEFHUAotCQkxMGIwIDAwMDEgIERyYWdvbiA0MDAwCi0JCTExMDIgMTAxOCAgM0QgQmxhc3RlciBCYW5zaGVlIFZFCi0JCTEyMWEgMDAwMSAgVm9vZG9vIEJhbnNoZWUgQUdQCi0JCTEyMWEgMDAwMyAgVm9vZG9vIEJhbnNoZWUgQUdQIFNHUkFNCi0JCTEyMWEgMDAwNCAgVm9vZG9vIEJhbnNoZWUKLQkJMTM5YyAwMDE2ICBSYXZlbgotCQkxMzljIDAwMTcgIFJhdmVuCi0JCTE0YWYgMDAwMiAgTWF4aSBHYW1lciBQaG9lbml4Ci0JMDAwNCAgVm9vZG9vIEJhbnNoZWUgW1ZlbG9jaXR5IDEwMF0KLQkwMDA1ICBWb29kb28gMwotCQkxMjFhIDAwMDQgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDAzMCAgVm9vZG9vMyBBR1AKLQkJMTIxYSAwMDMxICBWb29kb28zIEFHUAotCQkxMjFhIDAwMzQgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDAzNiAgVm9vZG9vMyAyMDAwIFBDSQotCQkxMjFhIDAwMzcgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDAzOCAgVm9vZG9vMyBBR1AKLQkJMTIxYSAwMDNhICBWb29kb28zIEFHUAotCQkxMjFhIDAwNDQgIFZvb2RvbzMKLQkJMTIxYSAwMDRiICBWZWxvY2l0eSAxMDAKLQkJMTIxYSAwMDRjICBWZWxvY2l0eSAyMDAKLQkJMTIxYSAwMDRkICBWb29kb28zIEFHUAotCQkxMjFhIDAwNGUgIFZvb2RvbzMgQUdQCi0JCTEyMWEgMDA1MSAgVm9vZG9vMyBBR1AKLQkJMTIxYSAwMDUyICBWb29kb28zIEFHUAotCQkxMjFhIDAwNjAgIFZvb2RvbzMgMzUwMCBUViAoTlRTQykKLQkJMTIxYSAwMDYxICBWb29kb28zIDM1MDAgVFYgKFBBTCkKLQkJMTIxYSAwMDYyICBWb29kb28zIDM1MDAgVFYgKFNFQ0FNKQotCTAwMDkgIFZvb2RvbyA0IC8gVm9vZG9vIDUKLQkJMTIxYSAwMDAzICBWb29kb281IFBDSSA1NTAwCi0JCTEyMWEgMDAwOSAgVm9vZG9vNSBBR1AgNTUwMC82MDAwCi0JMDA1NyAgVm9vZG9vIDMvMzAwMCBbQXZlbmdlcl0KLTEyMWIgIEFkdmFuY2VkIFRlbGVjb21tdW5pY2F0aW9ucyBNb2R1bGVzCi0xMjFjICBOaXBwb24gVGV4YWNvLiwgTHRkCi0xMjFkICBMaXBwZXJ0IEF1dG9tYXRpb25zdGVjaG5payBHbWJICi0xMjFlICBDU1BJCi0xMjFmICBBcmN1cyBUZWNobm9sb2d5LCBJbmMuCi0xMjIwICBBcmllbCBDb3Jwb3JhdGlvbgotCTEyMjAgIEFNQ0MgNTkzMyBUTVMzMjBDODAgRFNQL0ltYWdpbmcgYm9hcmQKLTEyMjEgIENvbnRlYyBDby4sIEx0ZAotMTIyMiAgQW5jb3IgQ29tbXVuaWNhdGlvbnMsIEluYy4KLTEyMjMgIEFydGVzeW4gQ29tbXVuaWNhdGlvbiBQcm9kdWN0cwotCTAwMDMgIFBNL0xpbmsKLQkwMDA0ICBQTS9UMQotCTAwMDUgIFBNL0UxCi0JMDAwOCAgUE0vU0xTCi0JMDAwOSAgQmFqYVNwYW4gUmVzb3VyY2UgVGFyZ2V0Ci0JMDAwYSAgQmFqYVNwYW4gU2VjdGlvbiAwCi0JMDAwYiAgQmFqYVNwYW4gU2VjdGlvbiAxCi0JMDAwYyAgQmFqYVNwYW4gU2VjdGlvbiAyCi0JMDAwZCAgQmFqYVNwYW4gU2VjdGlvbiAzCi0JMDAwZSAgUE0vUFBDCi0xMjI0ICBJbnRlcmFjdGl2ZSBJbWFnZXMKLTEyMjUgIFBvd2VyIEkvTywgSW5jLgotMTIyNyAgVGVjaC1Tb3VyY2UKLQkwMDA2ICBSYXB0b3IgR0ZYIDhQCi0xMjI4ICBOb3JzayBFbGVrdHJvIE9wdGlrayBBL1MKLTEyMjkgIERhdGEgS2luZXNpcyBJbmMuCi0xMjJhICBJbnRlZ3JhdGVkIFRlbGVjb20KLTEyMmIgIExHIEluZHVzdHJpYWwgU3lzdGVtcyBDby4sIEx0ZAotMTIyYyAgU2ljYW4gR21iSAotMTIyZCAgQXp0ZWNoIFN5c3RlbSBMdGQKLQkxMjA2ICAzNjhEU1AKLQkxNDAwICBUcmlkZW50IFBDSTI4OC1RM0RJSSAoTlgpCi0JNTBkYyAgMzMyOCBBdWRpbwotCQkxMjJkIDAwMDEgIDMzMjggQXVkaW8KLQk4MGRhICAzMzI4IEF1ZGlvCi0JCTEyMmQgMDAwMSAgMzMyOCBBdWRpbwotMTIyZSAgWHlyYXRleAotMTIyZiAgQW5kcmV3IENvcnBvcmF0aW9uCi0xMjMwICBGaXNoY2FtcCBFbmdpbmVlcmluZwotMTIzMSAgV29vZHdhcmQgTWNDb2FjaCwgSW5jLgotMTIzMiAgR1BUIExpbWl0ZWQKLTEyMzMgIEJ1cy1UZWNoLCBJbmMuCi0xMjM0ICBUZWNobmljYWwgQ29ycC4KLTEyMzUgIFJpc3EgTW9kdWxhciBTeXN0ZW1zLCBJbmMuCi0xMjM2ICBTaWdtYSBEZXNpZ25zIENvcnBvcmF0aW9uCi0JMDAwMCAgUmVhbE1hZ2ljNjQvR1gKLQk2NDAxICBSRUFMbWFnaWMgNjQvR1ggKFNEIDY0MjUpCi0xMjM3ICBBbHRhIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KLTEyMzggIEFkdHJhbgotMTIzOSAgM0RPIENvbXBhbnkKLTEyM2EgIFZpc2ljb20gTGFib3JhdG9yaWVzLCBJbmMuCi0xMjNiICBTZWVxIFRlY2hub2xvZ3ksIEluYy4KLTEyM2MgIENlbnR1cnkgU3lzdGVtcywgSW5jLgotMTIzZCAgRW5naW5lZXJpbmcgRGVzaWduIFRlYW0sIEluYy4KLQkwMDAwICBFYXN5Q29ubmVjdCA4LzMyCi0JMDAwMiAgRWFzeUNvbm5lY3QgOC82NAotCTAwMDMgIEVhc3lJTwotMTIzZSAgU2ltdXRlY2gsIEluYy4KLTEyM2YgIEMtQ3ViZSBNaWNyb3N5c3RlbXMKLQkwMGU0ICBNUEVHCi0JODEyMCAgRTQ/Ci0JCTExYmQgMDAwNiAgRFY1MDAgRTQKLQkJMTFiZCAwMDBhICBEVjUwMCBFNAotCQkxMWJkIDAwMGYgIERWNTAwIEU0Ci0JODg4OCAgQ2luZW1hc3RlciBDIDMuMCBEVkQgRGVjb2RlcgotCQkxMDAyIDAwMDEgIENpbmVtYXN0ZXIgQyAzLjAgRFZEIERlY29kZXIKLQkJMTAwMiAwMDAyICBDaW5lbWFzdGVyIEMgMy4wIERWRCBEZWNvZGVyCi0JCTEzMjggMDAwMSAgQ2luZW1hc3RlciBDIDMuMCBEVkQgRGVjb2RlcgotMTI0MCAgTWFyYXRob24gVGVjaG5vbG9naWVzIENvcnAuCi0xMjQxICBEU0MgQ29tbXVuaWNhdGlvbnMKLSMgRm9ybWVybHkgSmF5Y29yIE5ldHdvcmtzLCBJbmMuCi0xMjQyICBKTkkgQ29ycG9yYXRpb24KLQkxNTYwICBKTklDLTE1NjAgUENJLVggRmlicmUgQ2hhbm5lbCBDb250cm9sbGVyCi0JCTEyNDIgNjU2MiAgRkNYMi02NTYyIER1YWwgQ2hhbm5lbCBQQ0ktWCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQkJMTI0MiA2NTZhICBGQ1gtNjU2MiBQQ0ktWCBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQk0NjQzICBGQ0ktMTA2MyBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLQk2NTYyICBGQ1gyLTY1NjIgRHVhbCBDaGFubmVsIFBDSS1YIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotCTY1NmEgIEZDWC02NTYyIFBDSS1YIEZpYnJlIENoYW5uZWwgQWRhcHRlcgotMTI0MyAgRGVscGhheAotMTI0NCAgQVZNIEF1ZGlvdmlzdWVsbGVzIE1LVEcgJiBDb21wdXRlciBTeXN0ZW0gR21iSAotCTA3MDAgIEIxIElTRE4KLQkwODAwICBDNCBJU0ROCi0JMGEwMCAgQTEgSVNETiBbRnJpdHpdCi0JCTEyNDQgMGEwMCAgRlJJVFohQ2FyZCBJU0ROIENvbnRyb2xsZXIKLQkwZTAwICBGcml0eiFQQ0kgdjIuMCBJU0ROCi0JMTEwMCAgQzIgSVNETgotCTEyMDAgIFQxIElTRE4KLQkyNzAwICBGcml0eiFDYXJkIERTTCBTTAotCTI5MDAgIEZyaXR6IUNhcmQgRFNMIHYyLjAKLTEyNDUgIEEuUC5ELiwgUy5BLgotMTI0NiAgRGlwaXggVGVjaG5vbG9naWVzLCBJbmMuCi0xMjQ3ICBYeWxvbiBSZXNlYXJjaCwgSW5jLgotMTI0OCAgQ2VudHJhbCBEYXRhIENvcnBvcmF0aW9uCi0xMjQ5ICBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotMTI0YSAgQUVHIEVsZWN0cm9jb20gR21iSAotMTI0YiAgU0JTL0dyZWVuc3ByaW5nIE1vZHVsYXIgSS9PCi0JMDA0MCAgUENJLTQwQSBvciBjUENJLTIwMCBRdWFkIEluZHVzdHJ5UGFjayBjYXJyaWVyCi0JCTEyNGIgOTA4MCAgUENJOTA4MCBCcmlkZ2UKLTEyNGMgIFNvbGl0cm9uIFRlY2hub2xvZ2llcywgSW5jLgotMTI0ZCAgU3RhbGxpb24gVGVjaG5vbG9naWVzLCBJbmMuCi0JMDAwMCAgRWFzeUNvbm5lY3Rpb24gOC8zMgotCTAwMDIgIEVhc3lDb25uZWN0aW9uIDgvNjQKLQkwMDAzICBFYXN5SU8KLQkwMDA0ICBFYXN5Q29ubmVjdGlvbi9SQQotMTI0ZSAgQ3lsaW5rCi0xMjRmICBJbmZvcnRyZW5kIFRlY2hub2xvZ3ksIEluYy4KLQkwMDQxICBJRlQtMjAwMCBTZXJpZXMgUkFJRCBDb250cm9sbGVyCi0xMjUwICBIaXRhY2hpIE1pY3JvY29tcHV0ZXIgU3lzdGVtIEx0ZAotMTI1MSAgVkxTSSBTb2x1dGlvbnMgT3kKLTEyNTMgIEd1emlrIFRlY2huaWNhbCBFbnRlcnByaXNlcwotMTI1NCAgTGluZWFyIFN5c3RlbXMgTHRkLgotMTI1NSAgT3B0aWJhc2UgTHRkCi0JMTExMCAgTVBFRyBGb3JnZQotCTEyMTAgIE1QRUcgRnVzaW9uCi0JMjExMCAgVmlkZW9QbGV4Ci0JMjEyMCAgVmlkZW9QbGV4IENDCi0JMjEzMCAgVmlkZW9RdWVzdAotMTI1NiAgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KLQk0MjAxICBQQ0ktMjIyMEkKLQk0NDAxICBQQ0ktMjI0MEkKLQk1MjAxICBQQ0ktMjAwMAotMTI1NyAgVmVydGV4IE5ldHdvcmtzLCBJbmMuCi0xMjU4ICBHaWxiYXJjbywgSW5jLgotMTI1OSAgQWxsaWVkIFRlbGVzeW4gSW50ZXJuYXRpb25hbAotCTI1NjAgIEFULTI1NjAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIChpODI1NTdCKQotCWExMTcgIFJUTDgxeHggRmFzdCBFdGhlcm5ldAotCWExMjAgIDIxeDR4IERFQy1UdWxpcCBjb21wYXRpYmxlIDEwLzEwMCBFdGhlcm5ldAotMTI1YSAgQUJCIFBvd2VyIFN5c3RlbXMKLTEyNWIgIEFzaXggRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLQkxNDAwICBBTEZBIEdGQzIyMDQgRmFzdCBFdGhlcm5ldAotMTI1YyAgQXVyb3JhIFRlY2hub2xvZ2llcywgSW5jLgotCTAxMDEgIFNhdHVybiA0NTIwUAotCTA2NDAgIEFyaWVzIDE2MDAwUAotMTI1ZCAgRVNTIFRlY2hub2xvZ3kKLQkwMDAwICBFUzMzNkggRmF4IE1vZGVtIChFYXJseSBNb2RlbCkKLQkxOTQ4ICBTb2xvPwotCTE5NjggIEVTMTk2OCBNYWVzdHJvIDIKLQkJMTAyOCAwMDg1ICBFUzE5NjggTWFlc3Ryby0yIFBDSQotCQkxMDMzIDgwNTEgIEVTMTk2OCBNYWVzdHJvLTIgQXVkaW9kcml2ZQotCTE5NjkgIEVTMTk2OSBTb2xvLTEgQXVkaW9kcml2ZQotCQkxMDE0IDAxNjYgIEVTMTk2OSBTT0xPLTEgQXVkaW9Ecml2ZSBvbiBJQk0gQXB0aXZhIE1haW5ib2FyZAotCQkxMjVkIDg4ODggIFNvbG8tMSBBdWRpbyBBZGFwdGVyCi0JCTE1M2IgMTExYiAgVGVycmF0ZWMgMTI4aSBQQ0kKLQkxOTc4ICBFUzE5NzggTWFlc3RybyAyRQotCQkwZTExIGIxMTIgIEFybWFkYSBNNzAwL0U1MDAKLQkJMTAzMyA4MDNjICBFUzE5NzggTWFlc3Ryby0yRSBBdWRpb2RyaXZlCi0JCTEwMzMgODA1OCAgRVMxOTc4IE1hZXN0cm8tMkUgQXVkaW9kcml2ZQotCQkxMDkyIDQwMDAgIE1vbnN0ZXIgU291bmQgTVg0MDAKLQkJMTE3OSAwMDAxICBFUzE5NzggTWFlc3Ryby0yRSBBdWRpb2RyaXZlCi0JMTk4OCAgRVMxOTg4IEFsbGVncm8tMQotCQkxMDkyIDQxMDAgIFNvbmljIEltcGFjdCBTMTAwCi0JCTEyNWQgMTk4OCAgRVNTIEFsbGVncm8tMSBBdWRpb2RyaXZlCi0JMTk4OSAgRVNTIE1vZGVtCi0JCTEyNWQgMTk4OSAgRVNTIE1vZGVtCi0JMTk5OCAgRVMxOTgzUyBNYWVzdHJvLTNpIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCQkxMDI4IDAwYjEgIExhdGl0dWRlIEM2MDAKLQkJMTAyOCAwMGU2ICBFUzE5ODNTIE1hZXN0cm8tM2kgKERlbGwgSW5zcGlyb24gODEwMCkKLQkxOTk5ICBFUzE5ODNTIE1hZXN0cm8tM2kgUENJIE1vZGVtIEFjY2VsZXJhdG9yCi0JMTk5YSAgRVMxOTgzUyBNYWVzdHJvLTNpIFBDSSBBdWRpbyBBY2NlbGVyYXRvcgotCTE5OWIgIEVTMTk4M1MgTWFlc3Ryby0zaSBQQ0kgTW9kZW0gQWNjZWxlcmF0b3IKLQkyODA4ICBFUzMzNkggRmF4IE1vZGVtIChMYXRlciBNb2RlbCkKLQkyODM4ICBFUzI4MzgvMjgzOSBTdXBlckxpbmsgTW9kZW0KLQkyODk4ICBFUzI4OTggTW9kZW0KLQkJMTI1ZCAwNDI0ICBFUzU2LVBJIERhdGEgRmF4IE1vZGVtCi0JCTEyNWQgMDQyNSAgRVM1NlQtUEkgRGF0YSBGYXggTW9kZW0KLQkJMTI1ZCAwNDI2ICBFUzU2Vi1QSSBEYXRhIEZheCBNb2RlbQotCQkxMjVkIDA0MjcgIFZXLVBJIERhdGEgRmF4IE1vZGVtCi0JCTEyNWQgMDQyOCAgRVM1NlNULVBJIERhdGEgRmF4IE1vZGVtCi0JCTEyNWQgMDQyOSAgRVM1NlNWLVBJIERhdGEgRmF4IE1vZGVtCi0JCTE0N2EgYzAwMSAgRVM1Ni1QSSBEYXRhIEZheCBNb2RlbQotCQkxNGZlIDA0MjggIEVTNTYtUEkgRGF0YSBGYXggTW9kZW0KLQkJMTRmZSAwNDI5ICBFUzU2LVBJIERhdGEgRmF4IE1vZGVtCi0xMjVlICBTcGVjaWFsdmlkZW8gRW5naW5lZXJpbmcgU1JMCi0xMjVmICBDb25jdXJyZW50IFRlY2hub2xvZ2llcywgSW5jLgotMTI2MCAgSW50ZXJzaWwgQ29ycG9yYXRpb24KLQkzODcyICBQcmlzbSAyLjUgV2F2ZWxhbiBjaGlwc2V0Ci0JCTE0NjggMDIwMiAgTEFOLUV4cHJlc3MgSUVFRSA4MDIuMTFiIFdpcmVsZXNzIExBTgotCTM4NzMgIFByaXNtIDIuNSBXYXZlbGFuIGNoaXBzZXQKLQkJMTE4NiAzNTAxICBEV0wtNTIwIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JCTExODYgMzcwMCAgRFdMLTUyMCBXaXJlbGVzcyBQQ0kgQWRhcHRlciwgUmV2IEUxCi0JCTEzODUgNDEwNSAgTUEzMTEgODAyLjExYiB3aXJlbGVzcyBhZGFwdGVyCi0JCTE2NjggMDQxNCAgSFdQMDExNzAtMDEgODAyLjExYiBQQ0kgV2lyZWxlc3MgQWRhcHRlcgotCQkxNmE1IDE2MDEgIEFJUi5tYXRlIFBDLTQwMCBQQ0kgV2lyZWxlc3MgTEFOIEFkYXB0ZXIKLQkJMTczNyAzODc0ICBXTVAxMSBXaXJlbGVzcyA4MDIuMTFiIFBDSSBBZGFwdGVyCi0JCTgwODYgMjUxMyAgV2lyZWxlc3MgODAyLjExYiBNaW5pUENJIEFkYXB0ZXIKLQkzODg2ICBJU0wzODg2IFtQcmlzbSBKYXZlbGluL1ByaXNtIFhib3ddCi0JCTE3Y2YgMDAzNyAgWi1Db20gWEctOTAxIGFuZCBjbG9uZXMgV2lyZWxlc3MgQWRhcHRlcgotCTM4OTAgIEludGVyc2lsIElTTDM4OTAgW1ByaXNtIEdUL1ByaXNtIER1ZXR0ZV0KLQkJMTBiOCAyODAyICBTTUMyODAyVyBXaXJlbGVzcyBQQ0kgQWRhcHRlcgotCQkxMGI4IDI4MzUgIFNNQzI4MzVXIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCQkxMGI4IGE4MzUgIFNNQzI4MzVXIFYyIFdpcmVsZXNzIENhcmRidXMgQWRhcHRlcgotCQkxMTEzIGVlMDMgIFNNQzI4MDJXIFYyIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JCTExMTMgZWUwOCAgU01DMjgzNVcgVjMgRVUgV2lyZWxlc3MgQ2FyZGJ1cyBBZGFwdGVyCi0JCTExODYgMzIwMiAgRFdMLUc2NTAgQTEgV2lyZWxlc3MgQWRhcHRlcgotCQkxMjU5IGMxMDQgIENHLVdMQ0I1NEdUIFdpcmVsZXNzIEFkYXB0ZXIKLQkJMTM4NSA0ODAwICBXRzUxMSBXaXJlbGVzcyBBZGFwdGVyCi0JCTE2YTUgMTYwNSAgQUxMTkVUIEFMTDAyNzEgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkJMTdjZiAwMDE0ICBaLUNvbSBYRy02MDAgYW5kIGNsb25lcyBXaXJlbGVzcyBBZGFwdGVyCi0JCTE3Y2YgMDAyMCAgWi1Db20gWEctOTAwIGFuZCBjbG9uZXMgV2lyZWxlc3MgQWRhcHRlcgotCTgxMzAgIEhNUDgxMzAgTlRTQy9QQUwgVmlkZW8gRGVjb2RlcgotCTgxMzEgIEhNUDgxMzEgTlRTQy9QQUwgVmlkZW8gRGVjb2RlcgotMTI2MSAgTWF0c3VzaGl0YS1Lb3RvYnVraSBFbGVjdHJvbmljcyBJbmR1c3RyaWVzLCBMdGQuCi0xMjYyICBFUyBDb21wdXRlciBDb21wYW55LCBMdGQuCi0xMjYzICBTb25pYyBTb2x1dGlvbnMKLTEyNjQgIEF2YWwgTmFnYXNha2kgQ29ycG9yYXRpb24KLTEyNjUgIENhc2lvIENvbXB1dGVyIENvLiwgTHRkLgotMTI2NiAgTWljcm9keW5lIENvcnBvcmF0aW9uCi0JMDAwMSAgTkUxMC8xMDAgQWRhcHRlciAoaTgyNTU3QikKLQkxOTEwICBORTIwMDBQbHVzIChSVDgwMjkpIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTI2NiAxOTEwICBORTIwMDBQbHVzIEV0aGVybmV0IEFkYXB0ZXIKLTEyNjcgIFMuIEEuIFRlbGVjb21tdW5pY2F0aW9ucwotCTUzNTIgIFBDUjIxMDEKLQk1YTRiICBUZWxzYXQgVHVyYm8KLTEyNjggIFRla3Ryb25peAotMTI2OSAgVGhvbXNvbi1DU0YvVFRNCi0xMjZhICBMZXhtYXJrIEludGVybmF0aW9uYWwsIEluYy4KLTEyNmIgIEFkYXgsIEluYy4KLTEyNmMgIE5vcnRoZXJuIFRlbGVjb20KLQkxMjExICAxMC8xMDBCYXNlVFggW1JUTDgxeHhdCi0JMTI2YyAgODAyLjExYiBXaXJlbGVzcyBFdGhlcm5ldCBBZGFwdGVyCi0xMjZkICBTcGxhc2ggVGVjaG5vbG9neSwgSW5jLgotMTI2ZSAgU3VtaXRvbW8gTWV0YWwgSW5kdXN0cmllcywgTHRkLgotMTI2ZiAgU2lsaWNvbiBNb3Rpb24sIEluYy4KLQkwNTAxICBTTTUwMSBWb3lhZ2VyR1gKLQkwNzEwICBTTTcxMCBMeW54RU0KLQkwNzEyICBTTTcxMiBMeW54RU0rCi0JMDcyMCAgU003MjAgTHlueDNETQotCTA3MzAgIFNNNzMxIENvdWdhcjNEUgotCTA4MTAgIFNNODEwIEx5bnhFCi0JMDgxMSAgU004MTEgTHlueEUKLQkwODIwICBTTTgyMCBMeW54M0QKLQkwOTEwICBTTTkxMAotMTI3MCAgT2x5bXB1cyBPcHRpY2FsIENvLiwgTHRkLgotMTI3MSAgR1cgSW5zdHJ1bWVudHMKLTEyNzIgIFRlbGVtYXRpY3MgSW50ZXJuYXRpb25hbAotMTI3MyAgSHVnaGVzIE5ldHdvcmsgU3lzdGVtcwotCTAwMDIgIERpcmVjUEMKLTEyNzQgIEVuc29uaXEKLQkxMTcxICBFUzEzNzMgW0F1ZGlvUENJXSAoYWxzbyBDcmVhdGl2ZSBMYWJzIENUNTgwMykKLQkxMzcxICBFUzEzNzEgW0F1ZGlvUENJLTk3XQotCQkwZTExIDAwMjQgIEF1ZGlvUENJIG9uIE1vdGhlcmJvYXJkIENvbXBhcSBEZXNrcHJvCi0JCTBlMTEgYjFhNyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kKLQkJMTAzMyA4MGFjICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSQotCQkxMDQyIDE4NTQgIFRhemVyCi0JCTEwN2IgODA1NCAgVGFib3IyCi0JCTEyNzQgMTM3MSAgQ3JlYXRpdmUgU291bmQgQmxhc3RlciBBdWRpb1BDSTY0ViwgQXVkaW9QQ0kxMjgKLQkJMTQ2MiA2NDcwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTQ3IDEuMUEKLQkJMTQ2MiA2NTYwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTU2IDEuMTAKLQkJMTQ2MiA2NjMwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTYzQlggMS4wQQotCQkxNDYyIDY2MzEgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxNjNWSUEgMS4wQQotCQkxNDYyIDY2MzIgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxNjNCWCAyLjBBCi0JCTE0NjIgNjYzMyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE2M1ZJQSAyLjBBCi0JCTE0NjIgNjgyMCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE4MiAxLjAwCi0JCTE0NjIgNjgyMiAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE4MiAxLjAwQQotCQkxNDYyIDY4MzAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxODMgMS4wMAotCQkxNDYyIDY4ODAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxODggMS4wMAotCQkxNDYyIDY5MDAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxOTAgMS4wMAotCQkxNDYyIDY5MTAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1TLTYxOTEKLQkJMTQ2MiA2OTMwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTkzCi0JCTE0NjIgNjk5MCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE5OUJYIDIuMEEKLQkJMTQ2MiA2OTkxICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBNUy02MTk5VklBIDIuMEEKLQkJMTRhNCAyMDc3ICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBLUjYzOQotCQkxNGE0IDIxMDUgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1SODAwCi0JCTE0YTQgMjEwNyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVI4MDEKLQkJMTRhNCAyMTcyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBEUjczOQotCQkxNTA5IDk5MDIgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEtXMTEKLQkJMTUwOSA5OTAzICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBLVzMxCi0JCTE1MDkgOTkwNCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgS0ExMQotCQkxNTA5IDk5MDUgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEtDMTMKLQkJMTUyZCA4ODAxICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDUDgxMEUKLQkJMTUyZCA4ODAyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDUDgxMAotCQkxNTJkIDg4MDMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFAzODEwRQotCQkxNTJkIDg4MDQgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFAzODEwLVMKLQkJMTUyZCA4ODA1ICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBQMzgyMC1TCi0JCTI3MGYgMjAwMSAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgNkNUUgotCQkyNzBmIDIyMDAgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIDZXVFgKLQkJMjcwZiAzMDAwICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2V1NWCi0JCTI3MGYgMzEwMCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgNldJVjIKLQkJMjcwZiAzMTAyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2V0lWCi0JCTI3MGYgNzA2MCAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgNkFTQTIKLQkJODA4NiA0MjQ5ICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBCSTQ0MFpYCi0JCTgwODYgNDI0YyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgQkw0NDBaWAotCQk4MDg2IDQyNWEgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEJaNDQwWlgKLQkJODA4NiA0MzQxICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDYXltYW4KLQkJODA4NiA0MzQzICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBDYXBlIENvZAotCQk4MDg2IDQ2NDkgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIEZpcmUgSXNsYW5kCi0JCTgwODYgNDY0YSAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgRko0NDBaWAotCQk4MDg2IDRkNGYgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIE1vbnRyZWFsCi0JCTgwODYgNGY0MyAgRVMxMzcxLCBFUzEzNzMgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgT0M0NDBMWAotCQk4MDg2IDUyNDMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFJDNDQwQlgKLQkJODA4NiA1MzUyICBFUzEzNzEsIEVTMTM3MyBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCBTdW5SaXZlcgotCQk4MDg2IDU2NDMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFZhbmNvdXZlcgotCQk4MDg2IDU3NTMgIEVTMTM3MSwgRVMxMzczIEF1ZGlvUENJIE9uIE1vdGhlcmJvYXJkIFdTNDQwQlgKLQk1MDAwICBFUzEzNzAgW0F1ZGlvUENJXQotCTU4ODAgIDU4ODAgQXVkaW9QQ0kKLQkJMTI3NCAyMDAwICBDcmVhdGl2ZSBTb3VuZCBCbGFzdGVyIEF1ZGlvUENJMTI4Ci0JCTEyNzQgMjAwMyAgQ3JlYXRpdmUgU291bmRCbGFzdGVyIEF1ZGlvUENJIDEyOAotCQkxMjc0IDU4ODAgIENyZWF0aXZlIFNvdW5kIEJsYXN0ZXIgQXVkaW9QQ0kxMjgKLQkJMTI3NCA4MDAxICBTb3VuZCBCbGFzdGVyIDE2UENJIDQuMWNoCi0JCTE0NTggYTAwMCAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2T1hFVAotCQkxNDYyIDY4ODAgIDU4ODAgQXVkaW9QQ0kgT24gTW90aGVyYm9hcmQgTVMtNjE4OCAxLjAwCi0JCTI3MGYgMjAwMSAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2Q1RSCi0JCTI3MGYgMjIwMCAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2V1RYCi0JCTI3MGYgNzA0MCAgNTg4MCBBdWRpb1BDSSBPbiBNb3RoZXJib2FyZCA2QVRBNAotMTI3NSAgTmV0d29yayBBcHBsaWFuY2UgQ29ycG9yYXRpb24KLTEyNzYgIFN3aXRjaGVkIE5ldHdvcmsgVGVjaG5vbG9naWVzLCBJbmMuCi0xMjc3ICBDb21zdHJlYW0KLTEyNzggIFRyYW5zdGVjaCBQYXJhbGxlbCBTeXN0ZW1zIEx0ZC4KLQkwNzAxICBUUEUzL1RNMyBQb3dlclBDIE5vZGUKLQkwNzEwICBUUEU1IFBvd2VyUEMgUENJIGJvYXJkCi0xMjc5ICBUcmFuc21ldGEgQ29ycG9yYXRpb24KLQkwMjk1ICBOb3J0aGJyaWRnZQotCTAzOTUgIExvbmdSdW4gTm9ydGhicmlkZ2UKLQkwMzk2ICBTRFJBTSBjb250cm9sbGVyCi0JMDM5NyAgQklPUyBzY3JhdGNocGFkCi0xMjdhICBSb2Nrd2VsbCBJbnRlcm5hdGlvbmFsCi0JMTAwMiAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbQotCQkxMDkyIDA5NGMgIFN1cHJhRXhwcmVzcyA1NmkgUFJPIFtEaWFtb25kIFNVUDIzODBdCi0JCTEyMmQgNDAwMiAgSFBHIC8gTURQMzg1OC1VCi0JCTEyMmQgNDAwNSAgTURQMzg1OC1FCi0JCTEyMmQgNDAwNyAgTURQMzg1OC1BLy1OWgotCQkxMjJkIDQwMTIgIE1EUDM4NTgtU0EKLQkJMTIyZCA0MDE3ICBNRFAzODU4LVcKLQkJMTIyZCA0MDE4ICBNRFAzODU4LVcKLQkJMTI3YSAxMDAyICBSb2Nrd2VsbCA1NksgRC9GIEhDRiBNb2RlbQotCTEwMDMgIEhDRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkJMGUxMSBiMGJjICAyMjktREYgWmVwaHlyCi0JCTBlMTEgYjExNCAgMjI5LURGIENoZWV0YWgKLQkJMTAzMyA4MDJiICAyMjktREYKLQkJMTNkZiAxMDAzICBQQ0k1NlJYIE1vZGVtCi0JCTEzZTAgMDExNyAgSUJNCi0JCTEzZTAgMDE0NyAgSUJNIEYtMTE1NklWKy9SMyBTcGFpbiBWLjkwIE1vZGVtCi0JCTEzZTAgMDE5NyAgSUJNCi0JCTEzZTAgMDFjNyAgSUJNIEYtMTE1NklWKy9SMyBXVyBWLjkwIE1vZGVtCi0JCTEzZTAgMDFmNyAgSUJNCi0JCTE0MzYgMTAwMyAgSUJNCi0JCTE0MzYgMTEwMyAgSUJNIDU2MTRQTTNHIFYuOTAgTW9kZW0KLQkJMTQzNiAxNjAyICBDb21wYXEgMjI5LURGIER1Y2F0aQotCTEwMDQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTA0OCAxNTAwICBNaWNyb0xpbmsgNTZrIE1vZGVtCi0JCTEwY2YgMTA1OSAgRnVqaXRzdSAyMjktREZSVAotCTEwMDUgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCAody9IYW5kc2V0KSBNb2RlbQotCQkxMDA1IDEyN2EgIEFPcGVuIEZNNTYtUAotCQkxMDMzIDgwMjkgIDIyOS1ERlNWCi0JCTEwMzMgODA1NCAgTW9kZW0KLQkJMTBjZiAxMDNjICBGdWppdHN1Ci0JCTEwY2YgMTA1NSAgRnVqaXRzdSAyMjktREZTVgotCQkxMGNmIDEwNTYgIEZ1aml0c3UgMjI5LURGU1YKLQkJMTIyZCA0MDAzICBNRFAzODU4U1AtVQotCQkxMjJkIDQwMDYgIFBhY2thcmQgQmVsbCBNRFAzODU4Vi1FCi0JCTEyMmQgNDAwOCAgTURQMzg1OFNQLUEvU1AtTloKLQkJMTIyZCA0MDA5ICBNRFAzODU4U1AtRQotCQkxMjJkIDQwMTAgIE1EUDM4NThWLVUKLQkJMTIyZCA0MDExICBNRFAzODU4U1AtU0EKLQkJMTIyZCA0MDEzICBNRFAzODU4Vi1BL1YtTloKLQkJMTIyZCA0MDE1ICBNRFAzODU4U1AtVwotCQkxMjJkIDQwMTYgIE1EUDM4NThWLVcKLQkJMTIyZCA0MDE5ICBNRFAzODU4Vi1TQQotCQkxM2RmIDEwMDUgIFBDSTU2UlZQIE1vZGVtCi0JCTEzZTAgMDE4NyAgSUJNCi0JCTEzZTAgMDFhNyAgSUJNCi0JCTEzZTAgMDFiNyAgSUJNIERGLTExNTZJVisvUjMgU3BhaW4gVi45MCBNb2RlbQotCQkxM2UwIDAxZDcgIElCTSBERi0xMTU2SVYrL1IzIFdXIFYuOTAgTW9kZW0KLQkJMTQzNiAxMDA1ICBJQk0KLQkJMTQzNiAxMTA1ICBJQk0KLQkJMTQzNyAxMTA1ICBJQk0gNTYxNFBTM0cgVi45MCBNb2RlbQotCTEwMjIgIEhDRiA1NmsgTW9kZW0KLQkJMTQzNiAxMzAzICBNMy01NjE0UE0zRyBWLjkwIE1vZGVtCi0JMTAyMyAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbQotCQkxMjJkIDQwMjAgIFBhY2thcmQgQmVsbCBNRFAzODU4LVdFCi0JCTEyMmQgNDAyMyAgTURQMzg1OC1VRQotCQkxM2UwIDAyNDcgIElCTSBGLTExNTZJVisvUjYgU3BhaW4gVi45MCBNb2RlbQotCQkxM2UwIDAyOTcgIElCTQotCQkxM2UwIDAyYzcgIElCTSBGLTExNTZJVisvUjYgV1cgVi45MCBNb2RlbQotCQkxNDM2IDEyMDMgIElCTQotCQkxNDM2IDEzMDMgIElCTQotCTEwMjQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxMDI1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkJMTBjZiAxMDZhICBGdWppdHN1IDIzNS1ERlNWCi0JCTEyMmQgNDAyMSAgUGFja2FyZCBCZWxsIE1EUDM4NThWLVdFCi0JCTEyMmQgNDAyMiAgTURQMzg1OFNQLVdFCi0JCTEyMmQgNDAyNCAgTURQMzg1OFYtVUUKLQkJMTIyZCA0MDI1ICBNRFAzODU4U1AtVUUKLQkxMDI2ICBIQ0YgNTZrIFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkxMDMyICBIQ0YgNTZrIE1vZGVtCi0JMTAzMyAgSENGIDU2ayBNb2RlbQotCTEwMzQgIEhDRiA1NmsgTW9kZW0KLQkxMDM1ICBIQ0YgNTZrIFBDSSBTcGVha2VycGhvbmUgTW9kZW0KLQkxMDM2ICBIQ0YgNTZrIE1vZGVtCi0JMTA4NSAgSENGIDU2ayBWb2xjYW5vIFBDSSBNb2RlbQotCTIwMDUgIEhDRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkJMTA0ZCA4MDQ0ICAyMjktREZTVgotCQkxMDRkIDgwNDUgIDIyOS1ERlNWCi0JCTEwNGQgODA1NSAgUEJFL0F6dGVjaCAyMzVXLURGU1YKLQkJMTA0ZCA4MDU2ICAyMzUtREZTVgotCQkxMDRkIDgwNWEgIE1vZGVtCi0JCTEwNGQgODA1ZiAgTW9kZW0KLQkJMTA0ZCA4MDc0ICBNb2RlbQotCTIwMTMgIEhTRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkJMTE3OSAwMDAxICBNb2RlbQotCQkxMTc5IGZmMDAgIE1vZGVtCi0JMjAxNCAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxMGNmIDEwNTcgIEZ1aml0c3UgQ2l0aWNvcnAgSUlJCi0JCTEyMmQgNDA1MCAgTVNQMzg4MC1VCi0JCTEyMmQgNDA1NSAgTVNQMzg4MC1XCi0JMjAxNSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hhbmRzZXQpIE1vZGVtCi0JCTEwY2YgMTA2MyAgRnVqaXRzdQotCQkxMGNmIDEwNjQgIEZ1aml0c3UKLQkJMTQ2OCAyMDE1ICBGdWppdHN1Ci0JMjAxNiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JCTEyMmQgNDA1MSAgTVNQMzg4MFYtVwotCQkxMjJkIDQwNTIgIE1TUDM4ODBTUC1XCi0JCTEyMmQgNDA1NCAgTVNQMzg4MFYtVQotCQkxMjJkIDQwNTYgIE1TUDM4ODBTUC1VCi0JCTEyMmQgNDA1NyAgTVNQMzg4MFNQLUEKLQk0MzExICBSaXB0aWRlIEhTRiA1NmsgUENJIE1vZGVtCi0JCTEyN2EgNDMxMSAgUmluZyBNb2R1bGFyPyBSaXB0aWRlIEhTRiBSVCBIUCBEb20KLQkJMTNlMCAwMjEwICBIUC1HVkMKLQk0MzIwICBSaXB0aWRlIFBDSSBBdWRpbyBDb250cm9sbGVyCi0JCTEyMzUgNDMyMCAgUmlwdGlkZSBQQ0kgQXVkaW8gQ29udHJvbGxlcgotCTQzMjEgIFJpcHRpZGUgSENGIDU2ayBQQ0kgTW9kZW0KLQkJMTIzNSA0MzIxICBIZXdsZXR0IFBhY2thcmQgREYKLQkJMTIzNSA0MzI0ICBIZXdsZXR0IFBhY2thcmQgREYKLQkJMTNlMCAwMjEwICBIZXdsZXR0IFBhY2thcmQgREYKLQkJMTQ0ZCAyMzIxICBSaXB0aWRlCi0JNDMyMiAgUmlwdGlkZSBQQ0kgR2FtZSBDb250cm9sbGVyCi0JCTEyMzUgNDMyMiAgUmlwdGlkZSBQQ0kgR2FtZSBDb250cm9sbGVyCi0JODIzNCAgUmFwaWRGaXJlIDYxNlggQVRNMTU1IEFkYXB0ZXIKLQkJMTA4ZCAwMDIyICBSYXBpZEZpcmUgNjE2WCBBVE0xNTUgQWRhcHRlcgotCQkxMDhkIDAwMjcgIFJhcGlkRmlyZSA2MTZYIEFUTTE1NSBBZGFwdGVyCi0xMjdiICBQaXhlcmEgQ29ycG9yYXRpb24KLTEyN2MgIENyb3NzcG9pbnQgU29sdXRpb25zLCBJbmMuCi0xMjdkICBWZWxhIFJlc2VhcmNoCi0xMjdlICBXaW5ub3YsIEwuUC4KLTEyN2YgIEZ1amlmaWxtCi0xMjgwICBQaG90b3NjcmlwdCBHcm91cCBMdGQuCi0xMjgxICBZb2tvZ2F3YSBFbGVjdHJpYyBDb3Jwb3JhdGlvbgotMTI4MiAgRGF2aWNvbSBTZW1pY29uZHVjdG9yLCBJbmMuCi0JOTAwOSAgRXRoZXJuZXQgMTAwLzEwIE1CaXQKLQk5MTAwICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQk5MTAyICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQk5MTMyICBFdGhlcm5ldCAxMDAvMTAgTUJpdAotMTI4MyAgSW50ZWdyYXRlZCBUZWNobm9sb2d5IEV4cHJlc3MsIEluYy4KLQk2NzNhICBJVDgzMzBHCi0JODIxMiAgSVQvSVRFODIxMiBEdWFsIGNoYW5uZWwgQVRBIFJBSUQgY29udHJvbGxlciAoUENJIHZlcnNpb24gc2VlbXMgdG8gYmUgSVQ4MjEyLCBlbWJlZGRlZCBzZWVtcyB0byBiZSBJVEU4MjEyKQotCQkxMjgzIDAwMDEgIElUL0lURTgyMTIgRHVhbCBjaGFubmVsIEFUQSBSQUlEIGNvbnRyb2xsZXIKLQk4MzMwICBJVDgzMzBHCi0JODg3MiAgSVQ4ODc0RiBQQ0kgRHVhbCBTZXJpYWwgUG9ydCBDb250cm9sbGVyCi0JODg4OCAgSVQ4ODg4RiBQQ0kgdG8gSVNBIEJyaWRnZSB3aXRoIFNNQgotCTg4ODkgIElUODg4OUYgUENJIHRvIElTQSBCcmlkZ2UKLQllODg2ICBJVDgzMzBHCi0xMjg0ICBTYWhhcmEgTmV0d29ya3MsIEluYy4KLTEyODUgIFBsYXRmb3JtIFRlY2hub2xvZ2llcywgSW5jLgotCTAxMDAgIEFHT0dPIHNvdW5kIGNoaXAgKGFrYSBFU1MgTWFlc3RybyAxKQotMTI4NiAgTWF6ZXQgR21iSAotMTI4NyAgTS1QYWN0LCBJbmMuCi0JMDAxZSAgTFMyMjBEIERWRCBEZWNvZGVyCi0JMDAxZiAgTFMyMjBDIERWRCBEZWNvZGVyCi0xMjg4ICBUaW1lc3RlcCBDb3Jwb3JhdGlvbgotMTI4OSAgQVZDIFRlY2hub2xvZ3ksIEluYy4KLTEyOGEgIEFzYW50ZSBUZWNobm9sb2dpZXMsIEluYy4KLTEyOGIgIFRyYW5zd2l0Y2ggQ29ycG9yYXRpb24KLTEyOGMgIFJldGl4IENvcnBvcmF0aW9uCi0xMjhkICBHMiBOZXR3b3JrcywgSW5jLgotCTAwMjEgIEFUTTE1NSBBZGFwdGVyCi0xMjhlICBIb29udGVjaCBDb3Jwb3JhdGlvbi9TYW1obyBNdWx0aSBUZWNoIEx0ZC4KLQkwMDA4ICBTVDEyOCBXU1MvU0IKLQkwMDA5ICBTVDEyOCBTQU05NDA3Ci0JMDAwYSAgU1QxMjggR2FtZSBQb3J0Ci0JMDAwYiAgU1QxMjggTVBVIFBvcnQKLQkwMDBjICBTVDEyOCBDdHJsIFBvcnQKLTEyOGYgIFRhdGVubyBEZW5ub3UsIEluYy4KLTEyOTAgIFNvcmQgQ29tcHV0ZXIgQ29ycG9yYXRpb24KLTEyOTEgIE5DUyBDb21wdXRlciBJdGFsaWEKLTEyOTIgIFRyaXRlY2ggTWljcm9lbGVjdHJvbmljcyBJbmMKLTEyOTMgIE1lZGlhIFJlYWxpdHkgVGVjaG5vbG9neQotMTI5NCAgUmhldG9yZXgsIEluYy4KLTEyOTUgIEltYWdlbmF0aW9uIENvcnBvcmF0aW9uCi0xMjk2ICBLb2ZheCBJbWFnZSBQcm9kdWN0cwotMTI5NyAgSG9sY28gRW50ZXJwcmlzZSBDbywgTHRkL1NodXR0bGUgQ29tcHV0ZXIKLTEyOTggIFNwZWxsY2FzdGVyIFRlbGVjb21tdW5pY2F0aW9ucyBJbmMuCi0xMjk5ICBLbm93bGVkZ2UgVGVjaG5vbG9neSBMYWIuCi0xMjlhICBWTWV0cm8sIGluYy4KLQkwNjE1ICBQQlQtNjE1IFBDSS1YIEJ1cyBBbmFseXplcgotMTI5YiAgSW1hZ2UgQWNjZXNzCi0xMjljICBKYXljb3IKLTEyOWQgIENvbXBjb3JlIE11bHRpbWVkaWEsIEluYy4KLTEyOWUgIFZpY3RvciBDb21wYW55IG9mIEphcGFuLCBMdGQuCi0xMjlmICBPRUMgTWVkaWNhbCBTeXN0ZW1zLCBJbmMuCi0xMmEwICBBbGxlbi1CcmFkbGV5IENvbXBhbnkKLTEyYTEgIFNpbXBhY3QgQXNzb2NpYXRlcywgSW5jLgotMTJhMiAgTmV3Z2VuIFN5c3RlbXMgQ29ycG9yYXRpb24KLTEyYTMgIEx1Y2VudCBUZWNobm9sb2dpZXMKLQk4MTA1ICBUODEwNSBIMTAwIERpZ2l0YWwgU3dpdGNoCi0xMmE0ICBOVFQgRWxlY3Ryb25pY3MgVGVjaG5vbG9neSBDb21wYW55Ci0xMmE1ICBWaXNpb24gRHluYW1pY3MgTHRkLgotMTJhNiAgU2NhbGFibGUgTmV0d29ya3MsIEluYy4KLTEyYTcgIEFNTyBHbWJICi0xMmE4ICBOZXdzIERhdGFjb20KLTEyYTkgIFhpb3RlY2ggQ29ycG9yYXRpb24KLTEyYWEgIFNETCBDb21tdW5pY2F0aW9ucywgSW5jLgotMTJhYiAgWXVhbiBZdWFuIEVudGVycHJpc2UgQ28uLCBMdGQuCi0JMDAwMiAgQVU4ODMwIFtWb3J0ZXgyXSBCYXNlZCBTb3VuZCBDYXJkIFdpdGggQTNEIFN1cHBvcnQKLQkzMDAwICBNUEctMjAwQyBQQ0kgRFZEIERlY29kZXIgQ2FyZAotMTJhYyAgTWVhc3VyZXggQ29ycG9yYXRpb24KLTEyYWQgIE11bHRpZGF0YSBHbWJICi0xMmFlICBBbHRlb24gTmV0d29ya3MgSW5jLgotCTAwMDEgIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0Ci0JCTEwMTQgMDEwNCAgR2lnYWJpdCBFdGhlcm5ldC1TWCBQQ0kgQWRhcHRlcgotCQkxMmFlIDAwMDEgIEdpZ2FiaXQgRXRoZXJuZXQtU1ggKFVuaXZlcnNhbCkKLQkJMTQxMCAwMTA0ICBHaWdhYml0IEV0aGVybmV0LVNYIFBDSSBBZGFwdGVyCi0JMDAwMiAgQWNlTklDIEdpZ2FiaXQgRXRoZXJuZXQgKENvcHBlcikKLQkJMTBhOSA4MDAyICBBY2VuaWMgR2lnYWJpdCBFdGhlcm5ldAotCQkxMmFlIDAwMDIgIEdpZ2FiaXQgRXRoZXJuZXQtVCAoM0M5ODYtVCkKLQkwMGZhICBGYXJhbGxvbiBQTjkxMDAtVCBHaWdhYml0IEV0aGVybmV0Ci0xMmFmICBUREsgVVNBIENvcnAKLTEyYjAgIEpvcmdlIFNjaWVudGlmaWMgQ29ycAotMTJiMSAgR2FtbWFMaW5rCi0xMmIyICBHZW5lcmFsIFNpZ25hbCBOZXR3b3JrcwotMTJiMyAgSW50ZXItRmFjZSBDbyBMdGQKLTEyYjQgIEZ1dHVyZVRlbCBJbmMKLTEyYjUgIEdyYW5pdGUgU3lzdGVtcyBJbmMuCi0xMmI2ICBOYXR1cmFsIE1pY3Jvc3lzdGVtcwotMTJiNyAgQ29nbmV4IE1vZHVsYXIgVmlzaW9uIFN5c3RlbXMgRGl2LiAtIEFjdW1lbiBJbmMuCi0xMmI4ICBLb3JnCi0xMmI5ICAzQ29tIENvcnAsIE1vZGVtIERpdmlzaW9uIChmb3JtZXJseSBVUyBSb2JvdGljcykKLQkxMDA2ICBXaW5Nb2RlbQotCQkxMmI5IDAwNWMgIFVTUiA1NmsgSW50ZXJuYWwgVm9pY2UgV2luTW9kZW0gKE1vZGVsIDM0NzIpCi0JCTEyYjkgMDA1ZSAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWxzIDY2Mjk3NSkKLQkJMTJiOSAwMDYyICBVU1IgNTZrIEludGVybmFsIFZvaWNlIFdpbk1vZGVtIChNb2RlbCA2NjI5NzgpCi0JCTEyYjkgMDA2OCAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBXaW5Nb2RlbSAoTW9kZWwgNTY5MCkKLQkJMTJiOSAwMDdhICBVU1IgNTZrIEludGVybmFsIFZvaWNlIFdpbk1vZGVtIChNb2RlbCA2NjI5NzQpCi0JCTEyYjkgMDA3ZiAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWxzIDU2OTgsIDU2OTkpCi0JCTEyYjkgMDA4MCAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWxzIDI5NzUsIDM1MjgpCi0JCTEyYjkgMDA4MSAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBXaW5Nb2RlbSAoTW9kZWxzIDI5NzQsIDM1MjkpCi0JCTEyYjkgMDA5MSAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBXaW5Nb2RlbSAoTW9kZWwgMjk3OCkKLQkxMDA3ICBVU1IgNTZrIEludGVybmFsIFdpbk1vZGVtCi0JCTEyYjkgMDBhMyAgVVNSIDU2ayBJbnRlcm5hbCBXaW5Nb2RlbSAoTW9kZWwgMzU5NSkKLQkxMDA4ICA1NksgRmF4TW9kZW0gTW9kZWwgNTYxMAotCQkxMmI5IDAwYTIgIFVTUiA1NmsgSW50ZXJuYWwgRkFYIE1vZGVtIChNb2RlbCAyOTc3KQotCQkxMmI5IDAwYWEgIFVTUiA1NmsgSW50ZXJuYWwgVm9pY2UgTW9kZW0gKE1vZGVsIDI5NzYpCi0JCTEyYjkgMDBhYiAgVVNSIDU2ayBJbnRlcm5hbCBWb2ljZSBNb2RlbSAoTW9kZWwgNTYwOSkKLQkJMTJiOSAwMGFjICBVU1IgNTZrIEludGVybmFsIFZvaWNlIE1vZGVtIChNb2RlbCAzMjk4KQotCQkxMmI5IDAwYWQgIFVTUiA1NmsgSW50ZXJuYWwgRkFYIE1vZGVtIChNb2RlbCA1NjEwKQotMTJiYSAgQml0dFdhcmUsIEluYy4KLTEyYmIgIE5pcHBvbiBVbmlzb2Z0IENvcnBvcmF0aW9uCi0xMmJjICBBcnJheSBNaWNyb3N5c3RlbXMKLTEyYmQgIENvbXB1dGVybSBDb3JwLgotMTJiZSAgQW5jaG9yIENoaXBzIEluYy4KLQkzMDQxICBBTjMwNDFRIENPLU1FTQotCTMwNDIgIEFOMzA0MlEgQ08tTUVNIExpdGUKLQkJMTJiZSAzMDQyICBBbmNob3IgQ2hpcHMgTGl0ZSBFdmFsdWF0aW9uIEJvYXJkCi0xMmJmICBGdWppZmlsbSBNaWNyb2RldmljZXMKLTEyYzAgIEluZmltZWQKLTEyYzEgIEdNTSBSZXNlYXJjaCBDb3JwCi0xMmMyICBNZW50ZWMgTGltaXRlZAotMTJjMyAgSG9sdGVrIE1pY3JvZWxlY3Ryb25pY3MgSW5jCi0JMDA1OCAgUENJIE5FMksgRXRoZXJuZXQKLQk1NTk4ICBQQ0kgTkUySyBFdGhlcm5ldAotMTJjNCAgQ29ubmVjdCBUZWNoIEluYwotCTAwMDEgIEJsdWUgSEVBVC9QQ0kgOCAoUlMyMzIvQ0wvUkoxMSkKLQkwMDAyICBCbHVlIEhFQVQvUENJIDQgKFJTMjMyKQotCTAwMDMgIEJsdWUgSEVBVC9QQ0kgMiAoUlMyMzIpCi0JMDAwNCAgQmx1ZSBIRUFUL1BDSSA4IChVTklWLCBSUzQ4NSkKLQkwMDA1ICBCbHVlIEhFQVQvUENJIDQrNC82KzIgKFVOSVYsIFJTMjMyLzQ4NSkKLQkwMDA2ICBCbHVlIEhFQVQvUENJIDQgKE9QVE8sIFJTNDg1KQotCTAwMDcgIEJsdWUgSEVBVC9QQ0kgMisyIChSUzIzMi80ODUpCi0JMDAwOCAgQmx1ZSBIRUFUL1BDSSAyIChPUFRPLCBUeCwgUlM0ODUpCi0JMDAwOSAgQmx1ZSBIRUFUL1BDSSAyKzYgKFJTMjMyLzQ4NSkKLQkwMDBhICBCbHVlIEhFQVQvUENJIDggKFR4LCBSUzQ4NSkKLQkwMDBiICBCbHVlIEhFQVQvUENJIDQgKFR4LCBSUzQ4NSkKLQkwMDBjICBCbHVlIEhFQVQvUENJIDIgKDIwIE1IeiwgUlM0ODUpCi0JMDAwZCAgQmx1ZSBIRUFUL1BDSSAyIFBUTQotCTAxMDAgIE5UOTYwL1BDSQotCTAyMDEgIGNQQ0kgVGl0YW4gLSAyIFBvcnQKLQkwMjAyICBjUENJIFRpdGFuIC0gNCBQb3J0Ci0JMDMwMCAgQ1RJIFBDSSBVQVJUIDIgKFJTMjMyKQotCTAzMDEgIENUSSBQQ0kgVUFSVCA0IChSUzIzMikKLQkwMzAyICBDVEkgUENJIFVBUlQgOCAoUlMyMzIpCi0JMDMxMCAgQ1RJIFBDSSBVQVJUIDErMSAoUlMyMzIvNDg1KQotCTAzMTEgIENUSSBQQ0kgVUFSVCAyKzIgKFJTMjMyLzQ4NSkKLQkwMzEyICBDVEkgUENJIFVBUlQgNCs0IChSUzIzMi80ODUpCi0JMDMyMCAgQ1RJIFBDSSBVQVJUIDIKLQkwMzIxICBDVEkgUENJIFVBUlQgNAotCTAzMjIgIENUSSBQQ0kgVUFSVCA4Ci0JMDMzMCAgQ1RJIFBDSSBVQVJUIDIgKFJTNDg1KQotCTAzMzEgIENUSSBQQ0kgVUFSVCA0IChSUzQ4NSkKLQkwMzMyICBDVEkgUENJIFVBUlQgOCAoUlM0ODUpCi0xMmM1ICBQaWN0dXJlIEVsZW1lbnRzIEluY29ycG9yYXRlZAotCTAwN2UgIEltYWdpbmcvU2Nhbm5pbmcgU3Vic3lzdGVtIEVuZ2luZQotCTAwN2YgIEltYWdpbmcvU2Nhbm5pbmcgU3Vic3lzdGVtIEVuZ2luZQotCTAwODEgIFBDSVZTVCBbR3JheXNjYWxlIFRocmVzaG9sZGluZyBFbmdpbmVdCi0JMDA4NSAgVmlkZW8gU2ltdWxhdG9yL1NlbmRlcgotCTAwODYgIFRIUjIgTXVsdGktc2NhbGUgVGhyZXNob2xkZXIKLTEyYzYgIE1pdGFuaSBDb3Jwb3JhdGlvbgotMTJjNyAgRGlhbG9naWMgQ29ycAotMTJjOCAgRyBGb3JjZSBDbywgTHRkCi0xMmM5ICBHaWdpIE9wZXJhdGlvbnMKLTEyY2EgIEludGVncmF0ZWQgQ29tcHV0aW5nIEVuZ2luZXMKLTEyY2IgIEFudGV4IEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCi0xMmNjICBQbHV0byBUZWNobm9sb2dpZXMgSW50ZXJuYXRpb25hbAotMTJjZCAgQWltcyBMYWIKLTEyY2UgIE5ldHNwZWVkIEluYy4KLTEyY2YgIFByb3BoZXQgU3lzdGVtcywgSW5jLgotMTJkMCAgR0RFIFN5c3RlbXMsIEluYy4KLTEyZDEgIFBTSVRlY2gKLTEyZDIgIE5WaWRpYSAvIFNHUyBUaG9tc29uIChKb2ludCBWZW50dXJlKQotCTAwMDggIE5WMQotCTAwMDkgIERBQzY0Ci0JMDAxOCAgUml2YTEyOAotCQkxMDQ4IDBjMTAgIFZJQ1RPUlkgRXJhem9yCi0JCTEwN2IgODAzMCAgU1RCIFZlbG9jaXR5IDEyOAotCQkxMDkyIDAzNTAgIFZpcGVyIFYzMzAKLQkJMTA5MiAxMDkyICBWaXBlciBWMzMwCi0JCTEwYjQgMWIxYiAgU1RCIFZlbG9jaXR5IDEyOAotCQkxMGI0IDFiMWQgIFNUQiBWZWxvY2l0eSAxMjgKLQkJMTBiNCAxYjFlICBTVEIgVmVsb2NpdHkgMTI4LCBQQUwgVFYtT3V0Ci0JCTEwYjQgMWIyMCAgU1RCIFZlbG9jaXR5IDEyOCBTYXBwaGlyZQotCQkxMGI0IDFiMjEgIFNUQiBWZWxvY2l0eSAxMjgKLQkJMTBiNCAxYjIyICBTVEIgVmVsb2NpdHkgMTI4IEFHUCwgTlRTQyBUVi1PdXQKLQkJMTBiNCAxYjIzICBTVEIgVmVsb2NpdHkgMTI4IEFHUCwgUEFMIFRWLU91dAotCQkxMGI0IDFiMjcgIFNUQiBWZWxvY2l0eSAxMjggRFZECi0JCTEwYjQgMWI4OCAgTVZQIFBybyAxMjgKLQkJMTBiNCAyMjJhICBTVEIgVmVsb2NpdHkgMTI4IEFHUAotCQkxMGI0IDIyMzAgIFNUQiBWZWxvY2l0eSAxMjgKLQkJMTBiNCAyMjMyICBTVEIgVmVsb2NpdHkgMTI4Ci0JCTEwYjQgMjIzNSAgU1RCIFZlbG9jaXR5IDEyOCBBR1AKLQkJMmExNSA1NGEzICAzRFZpc2lvbi1TQUdQIC8gM0RleFBsb3JlciAzMDAwCi0JMDAxOSAgUml2YTEyOFpYCi0JMDAyMCAgVE5UCi0JMDAyOCAgVE5UMgotCTAwMjkgIFVUTlQyCi0JMDAyYyAgVlROVDIKLQkwMGEwICBJVE5UMgotMTJkMyAgVmluZ21lZCBTb3VuZCBBL1MKLTEyZDQgIFVsdGljb20gKEZvcm1lcmx5IERHTSZTKQotCTAyMDAgIFQxIENhcmQKLTEyZDUgIEVxdWF0b3IgVGVjaG5vbG9naWVzIEluYwotCTAwMDMgIEJTUDE2Ci0JMTAwMCAgQlNQMTUKLTEyZDYgIEFuYWxvZ2ljIENvcnAKLTEyZDcgIEJpb3Ryb25pYyBTUkwKLTEyZDggIFBlcmljb20gU2VtaWNvbmR1Y3RvcgotMTJkOSAgQWN1bGFiIFBMQwotCTAwMDIgIFBDSSBQcm9zb2R5Ci0JMDAwNCAgY1BDSSBQcm9zb2R5Ci0JMDAwNSAgQWN1bGFiIEUxL1QxIFBDSSBjYXJkCi0xMmRhICBUcnVlIFRpbWUgSW5jLgotMTJkYiAgQW5uYXBvbGlzIE1pY3JvIFN5c3RlbXMsIEluYwotMTJkYyAgU3ltaWNyb24gQ29tcHV0ZXIgQ29tbXVuaWNhdGlvbiBMdGQuCi0xMmRkICBNYW5hZ2VtZW50IEdyYXBoaWNzCi0xMmRlICBSYWluYm93IFRlY2hub2xvZ2llcwotCTAyMDAgIENyeXB0b1N3aWZ0IENTMjAwCi0xMmRmICBTQlMgVGVjaG5vbG9naWVzIEluYwotMTJlMCAgQ2hhc2UgUmVzZWFyY2gKLQkwMDEwICBTVDE2QzY1NCBRdWFkIFVBUlQKLQkwMDIwICBTVDE2QzY1NCBRdWFkIFVBUlQKLQkwMDMwICBTVDE2QzY1NCBRdWFkIFVBUlQKLTEyZTEgIE5pbnRlbmRvIENvLCBMdGQKLTEyZTIgIERhdHVtIEluYy4gQmFuY29tbS1UaW1pbmcgRGl2aXNpb24KLTEyZTMgIEltYXRpb24gQ29ycCAtIE1lZGljYWwgSW1hZ2luZyBTeXN0ZW1zCi0xMmU0ICBCcm9va3Ryb3V0IFRlY2hub2xvZ3kgSW5jCi0xMmU1ICBBcGV4IFNlbWljb25kdWN0b3IgSW5jCi0xMmU2ICBDaXJlbCBTeXN0ZW1zCi0xMmU3ICBTdW5zZ3JvdXAgQ29ycG9yYXRpb24KLTEyZTggIENyaXNjIENvcnAKLTEyZTkgIEdFIFNwYWNlbmV0Ci0xMmVhICBadWtlbgotMTJlYiAgQXVyZWFsIFNlbWljb25kdWN0b3IKLQkwMDAxICBWb3J0ZXggMQotCQkxMDRkIDgwMzYgIEFVODgyMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTA5MiAyMDAwICBTb25pYyBJbXBhY3QgQTNECi0JCTEwOTIgMjEwMCAgU29uaWMgSW1wYWN0IEEzRAotCQkxMDkyIDIxMTAgIFNvbmljIEltcGFjdCBBM0QKLQkJMTA5MiAyMjAwICBTb25pYyBJbXBhY3QgQTNECi0JCTEyMmQgMTAwMiAgQVU4ODIwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMmViIDAwMDEgIEFVODgyMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJNTA1MyAzMzU1ICBNb250ZWdvCi0JMDAwMiAgVm9ydGV4IDIKLQkJMTA0ZCA4MDQ5ICBBVTg4MzAgVm9ydGV4IDNEIERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTEwNGQgODA3YiAgQVU4ODMwIFZvcnRleCAzRCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMDkyIDMwMDAgIE1vbnN0ZXIgU291bmQgSUkKLQkJMTA5MiAzMDAxICBNb25zdGVyIFNvdW5kIElJCi0JCTEwOTIgMzAwMiAgTW9uc3RlciBTb3VuZCBJSQotCQkxMDkyIDMwMDMgIE1vbnN0ZXIgU291bmQgSUkKLQkJMTA5MiAzMDA0ICBNb25zdGVyIFNvdW5kIElJCi0JCTEyZWIgMDAwMSAgQVU4ODMwIFZvcnRleCAzRCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMmViIDAwMDIgIEFVODgzMCBWb3J0ZXggM0QgRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTJlYiAwMDg4ICBBVTg4MzAgVm9ydGV4IDNEIERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTE0NGQgMzUxMCAgQVU4ODMwIFZvcnRleCAzRCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQk1MDUzIDMzNTYgIE1vbnRlZ28gSUkKLQkwMDAzICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTEwNGQgODA0OSAgQVU4ODEwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxMDRkIDgwNzcgIEFVODgxMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTA5ZiAxMDAwICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTEyZWIgMDAwMyAgQVU4ODEwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxNDYyIDY3ODAgIEFVODgxMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTRhNCAyMDczICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JCTE0YTQgMjA5MSAgQVU4ODEwIFZvcnRleCBEaWdpdGFsIEF1ZGlvIFByb2Nlc3NvcgotCQkxNGE0IDIxMDQgIEFVODgxMCBWb3J0ZXggRGlnaXRhbCBBdWRpbyBQcm9jZXNzb3IKLQkJMTRhNCAyMTA2ICBBVTg4MTAgVm9ydGV4IERpZ2l0YWwgQXVkaW8gUHJvY2Vzc29yCi0JODgwMyAgVm9ydGV4IDU2ayBTb2Z0d2FyZSBNb2RlbQotCQkxMmViIDg4MDMgIFZvcnRleCA1NmsgU29mdHdhcmUgTW9kZW0KLTEyZWMgIDNBIEludGVybmF0aW9uYWwsIEluYy4KLTEyZWQgIE9wdGl2aXNpb24gSW5jLgotMTJlZSAgT3JhbmdlIE1pY3JvCi0xMmVmICBWaWVubmEgU3lzdGVtcwotMTJmMCAgUGVudGVrCi0xMmYxICBTb3JlbnNvbiBWaXNpb24gSW5jCi0xMmYyICBHYW1tYWdyYXBoeCwgSW5jLgotMTJmMyAgUmFkc3RvbmUgVGVjaG5vbG9neQotMTJmNCAgTWVnYXRlbAotMTJmNSAgRm9ya3MKLTEyZjYgIERhd3NvbiBGcmFuY2UKLTEyZjcgIENvZ25leAotMTJmOCAgRWxlY3Ryb25pYyBEZXNpZ24gR21iSAotCTAwMDIgIFZpZGVvTWFrZXIKLTEyZjkgIEZvdXIgRm9sZCBMdGQKLTEyZmIgIFNwZWN0cnVtIFNpZ25hbCBQcm9jZXNzaW5nCi0xMmZjICBDYXBpdGFsIEVxdWlwbWVudCBDb3JwCi0xMmZkICBJMlMKLTEyZmUgIEVTRCBFbGVjdHJvbmljIFN5c3RlbSBEZXNpZ24gR21iSAotMTJmZiAgTGV4aWNvbgotMTMwMCAgSGFybWFuIEludGVybmF0aW9uYWwgSW5kdXN0cmllcyBJbmMKLTEzMDIgIENvbXB1dGVyIFNjaWVuY2VzIENvcnAKLTEzMDMgIElubm92YXRpdmUgSW50ZWdyYXRpb24KLTEzMDQgIEp1bmlwZXIgTmV0d29ya3MKLTEzMDUgIE5ldHBob25lLCBJbmMKLTEzMDYgIER1ZXQgVGVjaG5vbG9naWVzCi0jIEZvcm1lcmx5IENvbXB1dGVyQm9hcmRzCi0xMzA3ICBNZWFzdXJlbWVudCBDb21wdXRpbmcKLQkwMDAxICBQQ0ktREFTMTYwMi8xNgotCTAwMGIgIFBDSS1ESU80OEgKLQkwMDBjICBQQ0ktUERJU084Ci0JMDAwZCAgUENJLVBESVNPMTYKLQkwMDBmICBQQ0ktREFTMTIwMAotCTAwMTAgIFBDSS1EQVMxNjAyLzEyCi0JMDAxNCAgUENJLURJTzI0SAotCTAwMTUgIFBDSS1ESU8yNEgvQ1RSMwotCTAwMTYgIFBDSS1ESU80OEgvQ1RSMTUKLQkwMDE3ICBQQ0ktRElPOTZICi0JMDAxOCAgUENJLUNUUjA1Ci0JMDAxOSAgUENJLURBUzEyMDAvSlIKLQkwMDFhICBQQ0ktREFTMTAwMQotCTAwMWIgIFBDSS1EQVMxMDAyCi0JMDAxYyAgUENJLURBUzE2MDJKUi8xNgotCTAwMWQgIFBDSS1EQVM2NDAyLzE2Ci0JMDAxZSAgUENJLURBUzY0MDIvMTIKLQkwMDFmICBQQ0ktREFTMTYvTTEKLQkwMDIwICBQQ0ktRERBMDIvMTIKLQkwMDIxICBQQ0ktRERBMDQvMTIKLQkwMDIyICBQQ0ktRERBMDgvMTIKLQkwMDIzICBQQ0ktRERBMDIvMTYKLQkwMDI0ICBQQ0ktRERBMDQvMTYKLQkwMDI1ICBQQ0ktRERBMDgvMTYKLQkwMDI2ICBQQ0ktREFDMDQvMTItSFMKLQkwMDI3ICBQQ0ktREFDMDQvMTYtSFMKLQkwMDI4ICBQQ0ktRElPMjQKLQkwMDI5ICBQQ0ktREFTMDgKLQkwMDJjICBQQ0ktSU5UMzIKLQkwMDMzICBQQ0ktRFVBTC1BQzUKLQkwMDM0ICBQQ0ktREFTLVRDCi0JMDAzNSAgUENJLURBUzY0L00xLzE2Ci0JMDAzNiAgUENJLURBUzY0L00yLzE2Ci0JMDAzNyAgUENJLURBUzY0L00zLzE2Ci0JMDA0YyAgUENJLURBUzEwMDAKLQkwMDRkICBQQ0ktUVVBRDA0Ci0JMDA1MiAgUENJLURBUzQwMjAvMTIKLQkwMDVlICBQQ0ktREFTNjAyNQotMTMwOCAgSmF0byBUZWNobm9sb2dpZXMgSW5jLgotCTAwMDEgIE5ldENlbGVyYXRvciBBZGFwdGVyCi0JCTEzMDggMDAwMSAgTmV0Q2VsZXJhdG9yIEFkYXB0ZXIKLTEzMDkgIEFCIFNlbWljb25kdWN0b3IgTHRkCi0xMzBhICBNaXRzdWJpc2hpIEVsZWN0cmljIE1pY3JvY29tcHV0ZXIKLTEzMGIgIENvbG9yZ3JhcGhpYyBDb21tdW5pY2F0aW9ucyBDb3JwCi0xMzBjICBBbWJleCBUZWNobm9sb2dpZXMsIEluYwotMTMwZCAgQWNjZWxlcml4IEluYwotMTMwZSAgWWFtYXRha2UtSG9uZXl3ZWxsIENvLiBMdGQKLTEzMGYgIEFkdmFuZXQgSW5jCi0xMzEwICBHZXNwYWMKLTEzMTEgIFZpZGVvc2VydmVyLCBJbmMKLTEzMTIgIEFjdWl0eSBJbWFnaW5nLCBJbmMKLTEzMTMgIFlhc2thd2EgRWxlY3RyaWMgQ28uCi0xMzE2ICBUZXJhZHluZSBJbmMKLTEzMTcgIExpbmtzeXMKLQkwOTgxICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkwOTg1ICBOQzEwMCBOZXR3b3JrIEV2ZXJ5d2hlcmUgRmFzdCBFdGhlcm5ldCAxMC8xMDAKLQkxOTg1ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQkyODUwICBIU1AgTWljcm9Nb2RlbSA1NgotCTgyMDEgIEFETXRlayBBRE04MjExIDgwMi4xMWIgV2lyZWxlc3MgSW50ZXJmYWNlCi0JCTEwYjggMjYzNSAgU01DMjYzNVcgODAyLjExYiAoMTFNYnBzKSB3aXJlbGVzcyBsYW4gcGNtY2lhIChjYXJkYnVzKSBjYXJkCi0JCTEzMTcgODIwMSAgU01DMjYzNVcgODAyLjExYiAoMTFtYnBzKSB3aXJlbGVzcyBsYW4gcGNtY2lhIChjYXJkYnVzKSBjYXJkCi0JODIxMSAgQURNdGVrIEFETTgyMTEgODAyLjExYiBXaXJlbGVzcyBJbnRlcmZhY2UKLQk5NTExICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLTEzMTggIFBhY2tldCBFbmdpbmVzIEluYy4KLQkwOTExICBHTklDLUlJIFBDSSBHaWdhYml0IEV0aGVybmV0IFtIYW1hY2hpXQotMTMxOSAgRm9ydGVtZWRpYSwgSW5jCi0JMDgwMSAgWHdhdmUgUVMzMDAwQSBbRk04MDFdCi0JMDgwMiAgWHdhdmUgUVMzMDAwQSBbRk04MDEgZ2FtZSBwb3J0XQotCTEwMDAgIEZNODAxIFBDSSBBdWRpbwotCTEwMDEgIEZNODAxIFBDSSBKb3lzdGljawotMTMxYSAgRmluaXNhciBDb3JwLgotMTMxYyAgTmlwcG9uIEVsZWN0cm8tU2Vuc29yeSBEZXZpY2VzIENvcnAKLTEzMWQgIFN5c21pYywgSW5jLgotMTMxZSAgWGluZXggTmV0d29ya3MgSW5jCi0xMzFmICBTaWlnIEluYwotCTEwMDAgIEN5YmVyU2VyaWFsICgxLXBvcnQpIDE2NTUwCi0JMTAwMSAgQ3liZXJTZXJpYWwgKDEtcG9ydCkgMTY2NTAKLQkxMDAyICBDeWJlclNlcmlhbCAoMS1wb3J0KSAxNjg1MAotCTEwMTAgIER1ZXQgMVMoMTY1NTApKzFQCi0JMTAxMSAgRHVldCAxUygxNjY1MCkrMVAKLQkxMDEyICBEdWV0IDFTKDE2ODUwKSsxUAotCTEwMjAgIEN5YmVyUGFyYWxsZWwgKDEtcG9ydCkKLQkxMDIxICBDeWJlclBhcmFsbGVsICgyLXBvcnQpCi0JMTAzMCAgQ3liZXJTZXJpYWwgKDItcG9ydCkgMTY1NTAKLQkxMDMxICBDeWJlclNlcmlhbCAoMi1wb3J0KSAxNjY1MAotCTEwMzIgIEN5YmVyU2VyaWFsICgyLXBvcnQpIDE2ODUwCi0JMTAzNCAgVHJpbyAyUygxNjU1MCkrMVAKLQkxMDM1ICBUcmlvIDJTKDE2NjUwKSsxUAotCTEwMzYgIFRyaW8gMlMoMTY4NTApKzFQCi0JMTA1MCAgQ3liZXJTZXJpYWwgKDQtcG9ydCkgMTY1NTAKLQkxMDUxICBDeWJlclNlcmlhbCAoNC1wb3J0KSAxNjY1MAotCTEwNTIgIEN5YmVyU2VyaWFsICg0LXBvcnQpIDE2ODUwCi0JMjAwMCAgQ3liZXJTZXJpYWwgKDEtcG9ydCkgMTY1NTAKLQkyMDAxICBDeWJlclNlcmlhbCAoMS1wb3J0KSAxNjY1MAotCTIwMDIgIEN5YmVyU2VyaWFsICgxLXBvcnQpIDE2ODUwCi0JMjAxMCAgRHVldCAxUygxNjU1MCkrMVAKLQkyMDExICBEdWV0IDFTKDE2NjUwKSsxUAotCTIwMTIgIER1ZXQgMVMoMTY4NTApKzFQCi0JMjAyMCAgQ3liZXJQYXJhbGxlbCAoMS1wb3J0KQotCTIwMjEgIEN5YmVyUGFyYWxsZWwgKDItcG9ydCkKLQkyMDMwICBDeWJlclNlcmlhbCAoMi1wb3J0KSAxNjU1MAotCQkxMzFmIDIwMzAgIFBDSSBTZXJpYWwgQ2FyZAotCTIwMzEgIEN5YmVyU2VyaWFsICgyLXBvcnQpIDE2NjUwCi0JMjAzMiAgQ3liZXJTZXJpYWwgKDItcG9ydCkgMTY4NTAKLQkyMDQwICBUcmlvIDFTKDE2NTUwKSsyUAotCTIwNDEgIFRyaW8gMVMoMTY2NTApKzJQCi0JMjA0MiAgVHJpbyAxUygxNjg1MCkrMlAKLQkyMDUwICBDeWJlclNlcmlhbCAoNC1wb3J0KSAxNjU1MAotCTIwNTEgIEN5YmVyU2VyaWFsICg0LXBvcnQpIDE2NjUwCi0JMjA1MiAgQ3liZXJTZXJpYWwgKDQtcG9ydCkgMTY4NTAKLQkyMDYwICBUcmlvIDJTKDE2NTUwKSsxUAotCTIwNjEgIFRyaW8gMlMoMTY2NTApKzFQCi0JMjA2MiAgVHJpbyAyUygxNjg1MCkrMVAKLQkyMDgxICBDeWJlclNlcmlhbCAoOC1wb3J0KSBTVDE2NjU0Ci0xMzIwICBDcnlwdG8gQUcKLTEzMjEgIEFyY29iZWwgR3JhcGhpY3MgQlYKLTEzMjIgIE1UVCBDby4sIEx0ZAotMTMyMyAgRG9tZSBJbmMKLTEzMjQgIFNwaGVyZSBDb21tdW5pY2F0aW9ucwotMTMyNSAgU2FsaXggVGVjaG5vbG9naWVzLCBJbmMKLTEzMjYgIFNlYWNoYW5nZSBpbnRlcm5hdGlvbmFsCi0xMzI3ICBWb3NzIHNjaWVudGlmaWMKLTEzMjggIHF1YWRyYW50IGludGVybmF0aW9uYWwKLTEzMjkgIFByb2R1Y3Rpdml0eSBFbmhhbmNlbWVudAotMTMyYSAgTWljcm9jb20gSW5jLgotMTMyYiAgQnJvYWRiYW5kIFRlY2hub2xvZ2llcwotMTMyYyAgTWljcmVsIEluYwotMTMyZCAgSW50ZWdyYXRlZCBTaWxpY29uIFNvbHV0aW9uLCBJbmMuCi0xMzMwICBNTUMgTmV0d29ya3MKLTEzMzEgIFJhZGlzeXMgQ29ycC4KLQkwMDMwICBFTlAtMjYxMQotCTgyMDAgIDgyNjAwIEhvc3QgQnJpZGdlCi0JODIwMSAgODI2MDAgSURFCi0JODIwMiAgODI2MDAgVVNCCi0JODIxMCAgODI2MDAgUENJIEJyaWRnZQotMTMzMiAgTWljcm8gTWVtb3J5Ci0JNTQxNSAgTU0tNTQxNUNOIFBDSSBNZW1vcnkgTW9kdWxlIHdpdGggQmF0dGVyeSBCYWNrdXAKLQk1NDI1ICBNTS01NDI1Q04gUENJIDY0LzY2IE1lbW9yeSBNb2R1bGUgd2l0aCBCYXR0ZXJ5IEJhY2t1cAotMTMzNCAgUmVkY3JlZWsgQ29tbXVuaWNhdGlvbnMsIEluYwotMTMzNSAgVmlkZW9tYWlsLCBJbmMKLTEzMzcgIFRoaXJkIFBsYW5ldCBQdWJsaXNoaW5nCi0xMzM4ICBCVCBFbGVjdHJvbmljcwotMTMzYSAgVnRlbCBDb3JwCi0xMzNiICBTb2Z0Y29tIE1pY3Jvc3lzdGVtcwotMTMzYyAgSG9sb250ZWNoIENvcnAKLTEzM2QgIFNTIFRlY2hub2xvZ2llcwotMTMzZSAgVmlydHVhbCBDb21wdXRlciBDb3JwCi0xMzNmICBTQ00gTWljcm9zeXN0ZW1zCi0xMzQwICBBdGFsbGEgQ29ycAotMTM0MSAgS3lvdG8gTWljcm9jb21wdXRlciBDbwotMTM0MiAgUHJvbWF4IFN5c3RlbXMgSW5jCi0xMzQzICBQaHlsb24gQ29tbXVuaWNhdGlvbnMgSW5jCi0xMzQ0ICBDcnVjaWFsIFRlY2hub2xvZ3kKLTEzNDUgIEFyZXNjb20gSW5jCi0xMzQ3ICBPZGV0aWNzCi0xMzQ5ICBTdW1pdG9tbyBFbGVjdHJpYyBJbmR1c3RyaWVzLCBMdGQuCi0xMzRhICBEVEMgVGVjaG5vbG9neSBDb3JwLgotCTAwMDEgIERvbWV4IDUzNgotCTAwMDIgIERvbWV4IERNWDMxOTRVUCBTQ1NJIEFkYXB0ZXIKLTEzNGIgIEFSSyBSZXNlYXJjaCBDb3JwLgotMTM0YyAgQ2hvcmkgSm9obyBTeXN0ZW0gQ28uIEx0ZAotMTM0ZCAgUENUZWwgSW5jCi0JMjE4OSAgSFNQNTYgTWljcm9Nb2RlbQotCTI0ODYgIDIzMDRXVCBWLjkyIE1EQyBNb2RlbQotCTc4OTAgIEhTUCBNaWNyb01vZGVtIDU2Ci0JCTEzNGQgMDAwMSAgUENUNzg5IGFkYXB0ZXIKLQk3ODkxICBIU1AgTWljcm9Nb2RlbSA1NgotCQkxMzRkIDAwMDEgIEhTUCBNaWNyb01vZGVtIDU2Ci0JNzg5MiAgSFNQIE1pY3JvTW9kZW0gNTYKLQk3ODkzICBIU1AgTWljcm9Nb2RlbSA1NgotCTc4OTQgIEhTUCBNaWNyb01vZGVtIDU2Ci0JNzg5NSAgSFNQIE1pY3JvTW9kZW0gNTYKLQk3ODk2ICBIU1AgTWljcm9Nb2RlbSA1NgotCTc4OTcgIEhTUCBNaWNyb01vZGVtIDU2Ci0xMzRlICBDU1RJCi0xMzRmICBBbGdvIFN5c3RlbSBDbyBMdGQKLTEzNTAgIFN5c3RlYyBDby4gTHRkCi0xMzUxICBTb25peCBJbmMKLTEzNTMgIFRoYWxlcyBJZGF0eXMKLQkwMDAyICBQcm9zZXJ2ZXIKLQkwMDAzICBQQ0ktRlVUCi0JMDAwNCAgUENJLVMwCi0JMDAwNSAgUENJLUZVVC1TMAotMTM1NCAgRHdhdmUgU3lzdGVtIEluYwotMTM1NSAgS3JhdG9zIEFuYWx5dGljYWwgTHRkCi0xMzU2ICBUaGUgTG9naWNhbCBDbwotMTM1OSAgUHJpc2EgTmV0d29ya3MKLTEzNWEgIEJyYWluIEJveGVzCi0xMzViICBHaWdhbmV0IEluYwotMTM1YyAgUXVhdGVjaCBJbmMKLQkwMDEwICBRU0MtMTAwCi0JMDAyMCAgRFNDLTEwMAotCTAwMzAgIERTQy0yMDAvMzAwCi0JMDA0MCAgUVNDLTIwMC8zMDAKLQkwMDUwICBFU0MtMTAwRAotCTAwNjAgIEVTQy0xMDBNCi0JMDBmMCAgTVBBQy0xMDAgU3luY3Jvbm91cyBTZXJpYWwgQ2FyZCAoWmlsb2cgODUyMzApCi0JMDE3MCAgUVNDTFAtMTAwCi0JMDE4MCAgRFNDTFAtMTAwCi0JMDE5MCAgU1NDTFAtMTAwCi0JMDFhMCAgUVNDTFAtMjAwLzMwMAotCTAxYjAgIERTQ0xQLTIwMC8zMDAKLQkwMWMwICBTU0NMUC0yMDAvMzAwCi0xMzVkICBBQkIgTmV0d29yayBQYXJ0bmVyIEFCCi0xMzVlICBTZWFsZXZlbCBTeXN0ZW1zIEluYwotCTUxMDEgIFJvdXRlIDU2LlBDSSAtIE11bHRpLVByb3RvY29sIFNlcmlhbCBJbnRlcmZhY2UgKFppbG9nIFoxNkMzMikKLQk3MTAxICBTaW5nbGUgUG9ydCBSUy0yMzIvNDIyLzQ4NS81MzAKLQk3MjAxICBEdWFsIFBvcnQgUlMtMjMyLzQyMi80ODUgSW50ZXJmYWNlCi0JNzIwMiAgRHVhbCBQb3J0IFJTLTIzMiBJbnRlcmZhY2UKLQk3NDAxICBGb3VyIFBvcnQgUlMtMjMyIEludGVyZmFjZQotCTc0MDIgIEZvdXIgUG9ydCBSUy00MjIvNDg1IEludGVyZmFjZQotCTc4MDEgIEVpZ2h0IFBvcnQgUlMtMjMyIEludGVyZmFjZQotCTc4MDQgIEVpZ2h0IFBvcnQgUlMtMjMyLzQyMi80ODUgSW50ZXJmYWNlCi0JODAwMSAgODAwMSBEaWdpdGFsIEkvTyBBZGFwdGVyCi0xMzVmICBJLURhdGEgSW50ZXJuYXRpb25hbCBBLVMKLTEzNjAgIE1laW5iZXJnIEZ1bmt1aHJlbgotCTAxMDEgIFBDSTMyIERDRjc3IFJhZGlvIENsb2NrCi0JMDEwMiAgUENJNTA5IERDRjc3IFJhZGlvIENsb2NrCi0JMDEwMyAgUENJNTEwIERDRjc3IFJhZGlvIENsb2NrCi0JMDIwMSAgR1BTMTY3UENJIEdQUyBSZWNlaXZlcgotCTAyMDIgIEdQUzE2OFBDSSBHUFMgUmVjZWl2ZXIKLQkwMjAzICBHUFMxNjlQQ0kgR1BTIFJlY2VpdmVyCi0JMDMwMSAgVENSNTEwUENJIElSSUcgUmVjZWl2ZXIKLTEzNjEgIFNvbGl0b24gU3lzdGVtcyBLLksuCi0xMzYyICBGdWppZmFjb20gQ29ycG9yYXRpb24KLTEzNjMgIFBob2VuaXggVGVjaG5vbG9neSBMdGQKLTEzNjQgIEFUTSBDb21tdW5pY2F0aW9ucyBJbmMKLTEzNjUgIEh5cGVyY29wZSBHbWJICi0xMzY2ICBUZWlqaW4gU2Vpa2kgQ28uIEx0ZAotMTM2NyAgSGl0YWNoaSBab3NlbiBDb3Jwb3JhdGlvbgotMTM2OCAgU2t5d2FyZSBDb3Jwb3JhdGlvbgotMTM2OSAgRGlnaWdyYW0KLTEzNmEgIEhpZ2ggU29mdCBUZWNoCi0xMzZiICBLYXdhc2FraSBTdGVlbCBDb3Jwb3JhdGlvbgotCWZmMDEgIEtMNUE3MjAwMiBNb3Rpb24gSlBFRwotMTM2YyAgQWR0ZWsgU3lzdGVtIFNjaWVuY2UgQ28gTHRkCi0xMzZkICBHaWdhbGFicyBJbmMKLTEzNmYgIEFwcGxpZWQgTWFnaWMgSW5jCi0xMzcwICBBVEwgUHJvZHVjdHMKLTEzNzEgIENOZXQgVGVjaG5vbG9neSBJbmMKLQk0MzRlICBHaWdhQ2FyZCBOZXR3b3JrIEFkYXB0ZXIKLQkJMTM3MSA0MzRlICBOLVdheSBQQ0ktQnVzIEdpZ2EtQ2FyZCAxMDAwLzEwMC8xME1icHMoTCkKLTEzNzMgIFNpbGljb24gVmlzaW9uIEluYwotMTM3NCAgU2lsaWNvbSBMdGQKLTEzNzUgIEFyZ29zeXN0ZW1zIEluYwotMTM3NiAgTE1DCi0xMzc3ICBFbGVjdHJvbmljIEVxdWlwbWVudCBQcm9kdWN0aW9uICYgRGlzdHJpYnV0aW9uIEdtYkgKLTEzNzggIFRlbGVtYW5uIENvLiBMdGQKLTEzNzkgIEFzYWhpIEthc2VpIE1pY3Jvc3lzdGVtcyBDbyBMdGQKLTEzN2EgIE1hcmsgb2YgdGhlIFVuaWNvcm4gSW5jCi0JMDAwMSAgUENJLTMyNCBBdWRpb3dpcmUgSW50ZXJmYWNlCi0xMzdiICBQUFQgVmlzaW9uCi0xMzdjICBJd2F0c3UgRWxlY3RyaWMgQ28gTHRkCi0xMzdkICBEeW5hY2hpcCBDb3Jwb3JhdGlvbgotMTM3ZSAgUGF0cmlvdCBTY2llbnRpZmljIENvcnBvcmF0aW9uCi0xMzdmICBKYXBhbiBTYXRlbGxpdGUgU3lzdGVtcyBJbmMKLTEzODAgIFNhbnJpdHogQXV0b21hdGlvbiBDbyBMdGQKLTEzODEgIEJyYWlucyBDby4gTHRkCi0xMzgyICBNYXJpYW4gLSBFbGVjdHJvbmljICYgU29mdHdhcmUKLQkwMDAxICBBUkM4OCBhdWRpbyByZWNvcmRpbmcgY2FyZAotCTIwMDggIFByb2RpZiA5NiBQcm8gc291bmQgc3lzdGVtCi0JMjA4OCAgTWFyYyA4IE1pZGkgc291bmQgc3lzdGVtCi0JMjBjOCAgTWFyYyBBIHNvdW5kIHN5c3RlbQotCTQwMDggIE1hcmMgMiBzb3VuZCBzeXN0ZW0KLQk0MDEwICBNYXJjIDIgUHJvIHNvdW5kIHN5c3RlbQotCTQwNDggIE1hcmMgNCBNSURJIHNvdW5kIHN5c3RlbQotCTQwODggIE1hcmMgNCBEaWdpIHNvdW5kIHN5c3RlbQotCTQyNDggIE1hcmMgWCBzb3VuZCBzeXN0ZW0KLTEzODMgIENvbnRyb2xuZXQgSW5jCi0xMzg0ICBSZWFsaXR5IFNpbXVsYXRpb24gU3lzdGVtcyBJbmMKLTEzODUgIE5ldGdlYXIKLSMgTm90ZTogVGhpcyBsaXN0cyBhcyBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuIEFSNTIxMiA4MDIuMTFhYmcgTklDIGJlY2F1c2Ugb2YgTWFkd2lmaQotCTAwMTMgIFdHMzExVAotCTMxMWEgIEdBNTExIEdpZ2FiaXQgRXRoZXJuZXQKLQk0MTAwICA4MDIuMTFiIFdpcmVsZXNzIEFkYXB0ZXIgKE1BMzAxKQotCTQxMDUgIE1BMzExIDgwMi4xMWIgd2lyZWxlc3MgYWRhcHRlcgotCTQ0MDAgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTQ2MDAgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTQ2MDEgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTQ2MTAgIFdBRzUxMSA4MDIuMTFhL2IvZyBEdWFsIEJhbmQgV2lyZWxlc3MgUEMgQ2FyZAotCTRhMDAgIFdBRzMxMSA4MDIuMTFhL2cgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQk0YzAwICBXRzMxMXYyIDU0IE1icHMgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQk2MjBhICBHQTYyMCBHaWdhYml0IEV0aGVybmV0Ci0JNjIyYSAgR0E2MjIKLQk2MzBhICBHQTYzMCBHaWdhYml0IEV0aGVybmV0Ci0JZjAwNCAgRkEzMTBUWAotMTM4NiAgVmlkZW8gRG9tYWluIFRlY2hub2xvZ2llcwotMTM4NyAgU3lzdHJhbiBDb3JwCi0xMzg4ICBIaXRhY2hpIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgQ28gTHRkCi0xMzg5ICBBcHBsaWNvbSBJbnRlcm5hdGlvbmFsCi0JMDAwMSAgUENJMTUwMFBGQiBbSW50ZWxsaWdlbnQgZmllbGRidXMgYWRhcHRvcl0KLTEzOGEgIEZ1c2lvbiBNaWNyb21lZGlhIENvcnAKLTEzOGIgIFRva2ltZWMgSW5jCi0xMzhjICBTaWxpY29uIFJlYWxpdHkKLTEzOGQgIEZ1dHVyZSBUZWNobm8gRGVzaWducyBwdGUgTHRkCi0xMzhlICBCYXNsZXIgR21iSAotMTM4ZiAgUGF0YXBzY28gRGVzaWducyBJbmMKLTEzOTAgIENvbmNlcHQgRGV2ZWxvcG1lbnQgSW5jCi0xMzkxICBEZXZlbG9wbWVudCBDb25jZXB0cyBJbmMKLTEzOTIgIE1lZGlhbGlnaHQgSW5jCi0xMzkzICBNb3hhIFRlY2hub2xvZ2llcyBDbyBMdGQKLQkxMDQwICBTbWFydGlvIEMxMDRIL1BDSQotCTExNDEgIEluZHVzdHJpbyBDUC0xMTQKLQkxNjgwICBTbWFydGlvIEMxNjhIL1BDSQotCTIwNDAgIEludGVsbGlvIENQLTIwNEoKLQkyMTgwICBJbnRlbGxpbyBDMjE4IFR1cmJvIFBDSQotCTMyMDAgIEludGVsbGlvIEMzMjAgVHVyYm8gUENJCi0xMzk0ICBMZXZlbCBPbmUgQ29tbXVuaWNhdGlvbnMKLQkwMDAxICBMWFQxMDAxIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTM5NCAwMDAxICBOZXRDZWxlcmF0b3IgQWRhcHRlcgotMTM5NSAgQW1iaWNvbSBJbmMKLTEzOTYgIENpcGhlciBTeXN0ZW1zIEluYwotMTM5NyAgQ29sb2duZSBDaGlwIERlc2lnbnMgR21iSAotCTJiZDAgIElTRE4gbmV0d29yayBjb250cm9sbGVyIFtIRkMtUENJXQotCQkxMzk3IDJiZDAgIElTRE4gQm9hcmQKLQkJZTRiZiAxMDAwICBDSTEtMS1IYXJwCi0xMzk4ICBDbGFyaW9uIGNvLiBMdGQKLTEzOTkgIFJpb3Mgc3lzdGVtcyBDbyBMdGQKLTEzOWEgIEFsYWNyaXRlY2ggSW5jCi0JMDAwMSAgUXVhZCBQb3J0IDEwLzEwMCBTZXJ2ZXIgQWNjZWxlcmF0b3IKLQkwMDAzICBTaW5nbGUgUG9ydCAxMC8xMDAgU2VydmVyIEFjY2VsZXJhdG9yCi0JMDAwNSAgU2luZ2xlIFBvcnQgR2lnYWJpdCBTZXJ2ZXIgQWNjZWxlcmF0b3IKLTEzOWIgIE1lZGlhc29uaWMgTXVsdGltZWRpYSBTeXN0ZW1zIEx0ZAotMTM5YyAgUXVhbnR1bSAzZCBJbmMKLTEzOWQgIEVQTCBsaW1pdGVkCi0xMzllICBNZWRpYTQKLTEzOWYgIEFldGhyYSBzLnIubC4KLTEzYTAgIENyeXN0YWwgR3JvdXAgSW5jCi0xM2ExICBLYXdhc2FraSBIZWF2eSBJbmR1c3RyaWVzIEx0ZAotMTNhMiAgT3NpdGVjaCBDb21tdW5pY2F0aW9ucyBJbmMKLTEzYTMgIEhpZm4gSW5jLgotCTAwMDUgIDc3NTEgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAwNiAgNjUwMCBQdWJsaWMgS2V5IFByb2Nlc3NvcgotCTAwMDcgIDc4MTEgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAxMiAgNzk1MSBTZWN1cml0eSBQcm9jZXNzb3IKLQkwMDE0ICA3OFhYIFNlY3VyaXR5IFByb2Nlc3NvcgotCTAwMTYgIDgwNjUgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAxNyAgODE2NSBTZWN1cml0eSBQcm9jZXNzb3IKLQkwMDE4ICA4MTU0IFNlY3VyaXR5IFByb2Nlc3NvcgotCTAwMWQgIDc5NTYgU2VjdXJpdHkgUHJvY2Vzc29yCi0JMDAyMCAgNzk1NSBTZWN1cml0eSBQcm9jZXNzb3IKLTEzYTQgIFJhc2NvbSBJbmMKLTEzYTUgIEF1ZGlvIERpZ2l0YWwgSW1hZ2luZyBJbmMKLTEzYTYgIFZpZGVvbmljcyBJbmMKLTEzYTcgIFRlbGVzIEFHCi0xM2E4ICBFeGFyIENvcnAuCi0JMDE1NCAgWFIxN0MxNTQgUXVhZCBVQVJUCi0JMDE1OCAgWFIxN0MxNTggT2N0YWwgVUFSVAotMTNhOSAgU2llbWVucyBNZWRpY2FsIFN5c3RlbXMsIFVsdHJhc291bmQgR3JvdXAKLTEzYWEgIEJyb2FkYmFuZCBOZXR3b3JrcyBJbmMKLTEzYWIgIEFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQKLTEzYWMgIE1vdGlvbiBNZWRpYSBUZWNobm9sb2d5IEx0ZAotMTNhZCAgTmV4dXMgSW5jCi0xM2FlICBBTEQgVGVjaG5vbG9neSBMdGQKLTEzYWYgIFQuU3F3YXJlCi0xM2IwICBNYXhzcGVlZCBDb3JwCi0xM2IxICBUYW11cmEgY29ycG9yYXRpb24KLTEzYjIgIFRlY2hubyBDaGlwcyBDby4gTHRkCi0xM2IzICBMYW5hcnQgQ29ycG9yYXRpb24KLTEzYjQgIFdlbGxiZWFuIENvIEluYwotMTNiNSAgQVJNCi0xM2I2ICBEbG9nIEdtYkgKLTEzYjcgIExvZ2ljIERldmljZXMgSW5jCi0xM2I4ICBOb2tpYSBUZWxlY29tbXVuaWNhdGlvbnMgb3kKLTEzYjkgIEVsZWNvbSBDbyBMdGQKLTEzYmEgIE94Zm9yZCBJbnN0cnVtZW50cwotMTNiYiAgU2FueW8gVGVjaG5vc291bmQgQ28gTHRkCi0xM2JjICBCaXRyYW4gQ29ycG9yYXRpb24KLTEzYmQgIFNoYXJwIGNvcnBvcmF0aW9uCi0xM2JlICBNaXJva3UgSnlvaG8gU2VydmljZSBDby4gTHRkCi0xM2JmICBTaGFyZXdhdmUgSW5jCi0xM2MwICBNaWNyb2dhdGUgQ29ycG9yYXRpb24KLQkwMDEwICBTeW5jTGluayBBZGFwdGVyIHYxCi0JMDAyMCAgU3luY0xpbmsgU0NDIEFkYXB0ZXIKLQkwMDMwICBTeW5jTGluayBNdWx0aXBvcnQgQWRhcHRlcgotCTAyMTAgIFN5bmNMaW5rIEFkYXB0ZXIgdjIKLTEzYzEgIDN3YXJlIEluYwotCTEwMDAgIDN3YXJlIEluYyAzd2FyZSA1eHh4LzZ4eHgtc2VyaWVzIFBBVEEtUkFJRAotCTEwMDEgIDN3YXJlIEluYyAzd2FyZSA3eHh4Lzh4eHgtc2VyaWVzIFBBVEEvU0FUQS1SQUlECi0JCTEzYzEgMTAwMSAgM3dhcmUgSW5jIDN3YXJlIDd4eHgvOHh4eC1zZXJpZXMgUEFUQS9TQVRBLVJBSUQKLQkxMDAyICAzd2FyZSBJbmMgM3dhcmUgOXh4eC1zZXJpZXMgU0FUQS1SQUlECi0xM2MyICBUZWNobm90cmVuZCBTeXN0ZW10ZWNobmlrIEdtYkgKLTEzYzMgIEphbnogQ29tcHV0ZXIgQUcKLTEzYzQgIFBoYXNlIE1ldHJpY3MKLTEzYzUgIEFscGhpIFRlY2hub2xvZ3kgQ29ycAotMTNjNiAgQ29uZG9yIEVuZ2luZWVyaW5nIEluYwotCTA1MjAgIENFSS01MjAgQTQyOSBDYXJkCi0JMDYyMCAgQ0VJLTYyMCBBNDI5IENhcmQKLQkwODIwICBDRUktODIwIEE0MjkgQ2FyZAotMTNjNyAgQmx1ZSBDaGlwIFRlY2hub2xvZ3kgTHRkCi0xM2M4ICBBcHB0ZWNoIEluYwotMTNjOSAgRWF0b24gQ29ycG9yYXRpb24KLTEzY2EgIElvbWVnYSBDb3Jwb3JhdGlvbgotMTNjYiAgWWFubyBFbGVjdHJpYyBDbyBMdGQKLTEzY2MgIE1ldGhldXMgQ29ycG9yYXRpb24KLTEzY2QgIENvbXBhdGlibGUgU3lzdGVtcyBDb3Jwb3JhdGlvbgotMTNjZSAgQ29jb20gQS9TCi0xM2NmICBTdHVkaW8gQXVkaW8gJiBWaWRlbyBMdGQKLTEzZDAgIFRlY2hzYW4gRWxlY3Ryb25pY3MgQ28gTHRkCi0JMjEwMyAgQjJDMiBGbGV4Q29wSUkgRFZCIGNoaXAgLyBUZWNobmlzYXQgU2t5U3RhcjIgRFZCIGNhcmQKLQkyMjAwICBCMkMyIEZsZXhDb3BJSUkgRFZCIGNoaXAgLyBUZWNobmlzYXQgU2t5U3RhcjIgRFZCIGNhcmQKLTEzZDEgIEFib2NvbSBTeXN0ZW1zIEluYwotCWFiMDIgIEFETXRlayBDZW50YXVyLUMgcmV2IDE3IFtELUxpbmsgREZFLTY4MFRYXSBDYXJkQnVzIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCWFiMDMgIDIxeDR4IERFQy1UdWxpcCBjb21wYXRpYmxlIDEwLzEwMCBFdGhlcm5ldAotCWFiMDYgIFJUTDgxMzkgW0ZFMjAwMFZYXSBDYXJkQnVzIEZhc3QgRXRoZXJuZXQgQXR0YWNoZWQgUG9ydCBBZGFwdGVyCi0JYWIwOCAgMjF4NHggREVDLVR1bGlwIGNvbXBhdGlibGUgMTAvMTAwIEV0aGVybmV0Ci0xM2QyICBTaGFyayBNdWx0aW1lZGlhIEluYwotMTNkMyAgSU1DIE5ldHdvcmtzCi0xM2Q0ICBHcmFwaGljcyBNaWNyb3N5c3RlbXMgSW5jCi0xM2Q1ICBNZWRpYSAxMDAgSW5jCi0xM2Q2ICBLLkkuIFRlY2hub2xvZ3kgQ28gTHRkCi0xM2Q3ICBUb3NoaWJhIEVuZ2luZWVyaW5nIENvcnBvcmF0aW9uCi0xM2Q4ICBQaG9ib3MgY29ycG9yYXRpb24KLTEzZDkgIEFwZXggUEMgU29sdXRpb25zIEluYwotMTNkYSAgSW50cmVzb3VyY2UgU3lzdGVtcyBwdGUgTHRkCi0xM2RiICBKYW5pY2ggJiBLbGFzcyBDb21wdXRlcnRlY2huaWsgR21iSAotMTNkYyAgTmV0Ym9vc3QgQ29ycG9yYXRpb24KLTEzZGQgIE11bHRpbWVkaWEgQnVuZGxlIEluYwotMTNkZSAgQUJCIFJvYm90aWNzIFByb2R1Y3RzIEFCCi0xM2RmICBFLVRlY2ggSW5jCi0JMDAwMSAgUENJNTZSVlAgTW9kZW0KLQkJMTNkZiAwMDAxICBQQ0k1NlJWUCBNb2RlbQotMTNlMCAgR1ZDIENvcnBvcmF0aW9uCi0xM2UxICBTaWxpY29tIE11bHRpbWVkaWEgU3lzdGVtcyBJbmMKLTEzZTIgIER5bmFtaWNzIFJlc2VhcmNoIENvcnBvcmF0aW9uCi0xM2UzICBOZXN0IEluYwotMTNlNCAgQ2FsY3VsZXggSW5jCi0xM2U1ICBUZWxlc29mdCBEZXNpZ24gTHRkCi0xM2U2ICBBcmdvc3kgcmVzZWFyY2ggSW5jCi0xM2U3ICBOQUMgSW5jb3Jwb3JhdGVkCi0xM2U4ICBDaGlwIEV4cHJlc3MgQ29ycG9yYXRpb24KLTEzZTkgIEludHJhc2VydmVyIFRlY2hub2xvZ3kgSW5jCi0xM2VhICBEYWxsYXMgU2VtaWNvbmR1Y3RvcgotMTNlYiAgSGF1cHBhdWdlIENvbXB1dGVyIFdvcmtzIEluYwotMTNlYyAgWnlkYWNyb24gSW5jCi0xM2VkICBSYXl0aGVpb24gRS1TeXN0ZW1zCi0xM2VlICBIYXllcyBNaWNyb2NvbXB1dGVyIFByb2R1Y3RzIEluYwotMTNlZiAgQ29wcGVyY29tIEluYwotMTNmMCAgU3VuZGFuY2UgVGVjaG5vbG9neSBJbmMKLQkwMjAxICBTVDIwMSBTdW5kYW5jZSBFdGhlcm5ldAotMTNmMSAgT2NlJyAtIFRlY2hub2xvZ2llcyBCLlYuCi0xM2YyICBGb3JkIE1pY3JvZWxlY3Ryb25pY3MgSW5jCi0xM2YzICBNY2RhdGEgQ29ycG9yYXRpb24KLTEzZjQgIFRyb2lrYSBOZXR3b3JrcywgSW5jLgotCTE0MDEgIFplbnRhaSBGaWJyZSBDaGFubmVsIEFkYXB0ZXIKLTEzZjUgIEthbnNhaSBFbGVjdHJpYyBDby4gTHRkCi0xM2Y2ICBDLU1lZGlhIEVsZWN0cm9uaWNzIEluYwotCTAwMTEgIENNSTg3MzgKLQkwMTAwICBDTTgzMzhBCi0JCTEzZjYgZmZmZiAgQ01JODMzOC9DM0RYIFBDSSBBdWRpbyBEZXZpY2UKLQkwMTAxICBDTTgzMzhCCi0JCTEzZjYgMDEwMSAgQ01JODMzOC0wMzEgUENJIEF1ZGlvIERldmljZQotCTAxMTEgIENNODczOAotCQkxMDE5IDA5NzAgIFA2U1RQLUZMIG1vdGhlcmJvYXJkCi0JCTEwNDMgODAzNSAgQ1VTSS1GWCBtb3RoZXJib2FyZAotCQkxMDQzIDgwNzcgIENNSTg3MzggNi1jaGFubmVsIGF1ZGlvIGNvbnRyb2xsZXIKLQkJMTA0MyA4MGUyICBDTUk4NzM4IDZjaC1NWAotCQkxM2Y2IDAxMTEgIENNSTg3MzgvQzNEWCBQQ0kgQXVkaW8gRGV2aWNlCi0JCTE2ODEgYTAwMCAgR2FtZXN1cnJvdW5kIE1VU0UgWEwKLQkwMjExICBDTTg3MzgKLTEzZjcgIFdpbGRmaXJlIENvbW11bmljYXRpb25zCi0xM2Y4ICBBZCBMaWIgTXVsdGltZWRpYSBJbmMKLTEzZjkgIE5UVCBBZHZhbmNlZCBUZWNobm9sb2d5IENvcnAuCi0xM2ZhICBQZW50bGFuZCBTeXN0ZW1zIEx0ZAotMTNmYiAgQXlkaW4gQ29ycAotMTNmYyAgQ29tcHV0ZXIgUGVyaXBoZXJhbHMgSW50ZXJuYXRpb25hbAotMTNmZCAgTWljcm8gU2NpZW5jZSBJbmMKLTEzZmUgIEFkdmFudGVjaCBDby4gTHRkCi0JMTI0MCAgUENJLTEyNDAgNC1jaGFubmVsIHN0ZXBwZXIgbW90b3IgY29udHJvbGxlciBjYXJkIHcuICBOb3ZhIEVsZWN0cm9uaWNzIE1DWDMxNAotCTE2MDAgIFBDSS0xNjEyIDQtcG9ydCBSUy0yMzIvNDIyLzQ4NSBQQ0kgQ29tbXVuaWNhdGlvbiBDYXJkCi0JMTc1MiAgUENJLTE3NTIKLQkxNzU0ICBQQ0ktMTc1NAotCTE3NTYgIFBDSS0xNzU2Ci0xM2ZmICBTaWxpY29uIFNwaWNlIEluYwotMTQwMCAgQXJ0eCBJbmMKLQkxNDAxICA5NDMyIFRYCi0xNDAxICBDUi1TeXN0ZW1zIEEvUwotMTQwMiAgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJICi0xNDAzICBBc2NvciBJbmMKLTE0MDQgIEZ1bmRhbWVudGFsIFNvZnR3YXJlIEluYwotMTQwNSAgRXhjYWxpYnVyIFN5c3RlbXMgSW5jCi0xNDA2ICBPY2UnIFByaW50aW5nIFN5c3RlbXMgR21iSAotMTQwNyAgTGF2YSBDb21wdXRlciBtZmcgSW5jCi0JMDEwMCAgTGF2YSBEdWFsIFNlcmlhbAotCTAxMDEgIExhdmEgUXVhdHJvIEEKLQkwMTAyICBMYXZhIFF1YXRybyBCCi0JMDExMCAgTGF2YSBEU2VyaWFsLVBDSSBQb3J0IEEKLQkwMTExICBMYXZhIERTZXJpYWwtUENJIFBvcnQgQgotCTAxMjAgIFF1YXR0cm8tUENJIEEKLQkwMTIxICBRdWF0dHJvLVBDSSBCCi0JMDE4MCAgTGF2YSBPY3RvIEEKLQkwMTgxICBMYXZhIE9jdG8gQgotCTAyMDAgIExhdmEgUG9ydCBQbHVzCi0JMDIwMSAgTGF2YSBRdWFkIEEKLQkwMjAyICBMYXZhIFF1YWQgQgotCTAyMjAgIExhdmEgUXVhdHRybyBQQ0kgUG9ydHMgQS9CCi0JMDIyMSAgTGF2YSBRdWF0dHJvIFBDSSBQb3J0cyBDL0QKLQkwNTAwICBMYXZhIFNpbmdsZSBTZXJpYWwKLQkwNjAwICBMYXZhIFBvcnQgNjUwCi0JODAwMCAgTGF2YSBQYXJhbGxlbAotCTgwMDEgIER1YWwgcGFyYWxsZWwgcG9ydCBjb250cm9sbGVyIEEKLQk4MDAyICBMYXZhIER1YWwgUGFyYWxsZWwgcG9ydCBBCi0JODAwMyAgTGF2YSBEdWFsIFBhcmFsbGVsIHBvcnQgQgotCTg4MDAgIEJPQ0EgUmVzZWFyY2ggSU9QUEFSCi0xNDA4ICBBbG9rYSBDby4gTHRkCi0xNDA5ICBUaW1lZGlhIFRlY2hub2xvZ3kgQ28gTHRkCi0JNzE2OCAgUENJMlM1NTAgKER1YWwgMTY1NTAgVUFSVCkKLTE0MGEgIERTUCBSZXNlYXJjaCBJbmMKLTE0MGIgIFJhbWl4IEluYwotMTQwYyAgRWxtaWMgU3lzdGVtcyBJbmMKLTE0MGQgIE1hdHN1c2hpdGEgRWxlY3RyaWMgV29ya3MgTHRkCi0xNDBlICBHb2VwZWwgRWxlY3Ryb25pYyBHbWJICi0xNDBmICBTYWxpZW50IFN5c3RlbXMgQ29ycAotMTQxMCAgTWlkYXMgbGFiIEluYwotMTQxMSAgSWtvcyBTeXN0ZW1zIEluYwotIyBmb3JtZXJseSBJQyBFbnNlbWJsZSBJbmMuCi0xNDEyICBWSUEgVGVjaG5vbG9naWVzIEluYy4KLQkxNzEyICBJQ0UxNzEyIFtFbnZ5MjRdIFBDSSBNdWx0aS1DaGFubmVsIEkvTyBDb250cm9sbGVyCi0JCTE0MTIgMTcxMiAgSG9vbnRlY2ggU1QgQXVkaW8gRFNQIDI0Ci0JCTE0MTIgZDYzMCAgTS1BdWRpbyBEZWx0YSAxMDEwCi0JCTE0MTIgZDYzMSAgTS1BdWRpbyBEZWx0YSBEaU8KLQkJMTQxMiBkNjMyICBNLUF1ZGlvIERlbHRhIDY2Ci0JCTE0MTIgZDYzMyAgTS1BdWRpbyBEZWx0YSA0NAotCQkxNDEyIGQ2MzQgIE0tQXVkaW8gRGVsdGEgQXVkaW9waGlsZQotCQkxNDEyIGQ2MzUgIE0tQXVkaW8gRGVsdGEgVERJRgotCQkxNDEyIGQ2MzcgIE0tQXVkaW8gRGVsdGEgUkJVUwotCQkxNDEyIGQ2MzggIE0tQXVkaW8gRGVsdGEgNDEwCi0JCTE0MTIgZDYzYiAgTS1BdWRpbyBEZWx0YSAxMDEwTFQKLQkJMTQxMiBkNjNjICBEaWdpZ3JhbSBWWDQ0MgotCQkxNDE2IDE3MTIgIEhvb250ZWNoIFNUIEF1ZGlvIERTUCAyNCBNZWRpYSA3LjEKLQkJMTUzYiAxMTE1ICBFV1M4OCBNVAotCQkxNTNiIDExMjUgIEVXUzg4IE1UIChNYXN0ZXIpCi0JCTE1M2IgMTEyYiAgRVdTODggRAotCQkxNTNiIDExMmMgIEVXUzg4IEQgKE1hc3RlcikKLQkJMTUzYiAxMTMwICBFV1ggMjQvOTYKLQkJMTUzYiAxMTM4ICBETVggNmZpcmUgMjQvOTYKLQkJMTUzYiAxMTUxICBQSEFTRTg4Ci0JCTE2Y2UgMTA0MCAgRWRpcm9sIERBLTI0OTYKLQkxNzI0ICBWVDE3MjAvMjQgW0VudnkyNFBUL0hUXSBQQ0kgTXVsdGktQ2hhbm5lbCBBdWRpbyBDb250cm9sbGVyCi0JCTE0MTIgMTcyNCAgQU1QIEx0ZCBBVURJTzIwMDAKLQkJMTQxMiAzNjMwICBNLUF1ZGlvIFJldm9sdXRpb24gNy4xCi0JCTE1M2IgMTE0NSAgQXVyZW9uIDcuMSBTcGFjZQotCQkxNTNiIDExNDcgIEF1cmVvbiA1LjEgU2t5Ci0JCTE1M2IgMTE1MyAgQXVyZW9uIDcuMSBVbml2ZXJzZQotCQkyNzBmIGY2NDEgIFpORjMtMTUwCi0JCTI3MGYgZjY0NSAgWk5GMy0yNTAKLTE0MTMgIEFkZG9uaWNzCi0xNDE0ICBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLTE0MTUgIE94Zm9yZCBTZW1pY29uZHVjdG9yIEx0ZAotCTg0MDMgIFZTY29tIDAxMUgtRVAxIDEgcG9ydCBwYXJhbGxlbCBhZGFwdG9yCi0JOTUwMSAgT1gxNlBDSTk1NCAoUXVhZCAxNjk1MCBVQVJUKSBmdW5jdGlvbiAwCi0JCTEzMWYgMjA1MCAgQ3liZXJQcm8gKDQtcG9ydCkKLSMgTW9kZWwgSU8xMDg1LCBQYXJ0IE5vOiBKSi1QNDYwMTIKLQkJMTMxZiAyMDUxICBDeWJlclNlcmlhbCA0UyBQbHVzCi0JCTE1ZWQgMjAwMCAgTUNDUiBTZXJpYWwgcDAtMyBvZiA4Ci0JCTE1ZWQgMjAwMSAgTUNDUiBTZXJpYWwgcDAtMyBvZiAxNgotCTk1MGEgIEVYU1lTIEVYLTQxMDkyIER1YWwgMTY5NTAgU2VyaWFsIGFkYXB0ZXIKLQk5NTBiICBPWENCOTUwIENhcmRidXMgMTY5NTAgVUFSVAotCTk1MTAgIE9YMTZQQ0k5NTQgKFF1YWQgMTY5NTAgVUFSVCkgZnVuY3Rpb24gMSAoRGlzYWJsZWQpCi0JOTUxMSAgT1gxNlBDSTk1NCAoUXVhZCAxNjk1MCBVQVJUKSBmdW5jdGlvbiAxCi0JCTE1ZWQgMjAwMCAgTUNDUiBTZXJpYWwgcDQtNyBvZiA4Ci0JCTE1ZWQgMjAwMSAgTUNDUiBTZXJpYWwgcDQtMTUgb2YgMTYKLQk5NTIxICBPWDE2UENJOTUyIChEdWFsIDE2OTUwIFVBUlQpCi0xNDE2ICBNdWx0aXdhdmUgSW5ub3ZhdGlvbiBwdGUgTHRkCi0xNDE3ICBDb252ZXJnZW5ldCBUZWNobm9sb2dpZXMgSW5jCi0xNDE4ICBLeXVzaHUgZWxlY3Ryb25pY3Mgc3lzdGVtcyBJbmMKLTE0MTkgIEV4Y2VsIFN3aXRjaGluZyBDb3JwCi0xNDFhICBBcGFjaGUgTWljcm8gUGVyaXBoZXJhbHMgSW5jCi0xNDFiICBab29tIFRlbGVwaG9uaWNzIEluYwotMTQxZCAgRGlnaXRhbiBTeXN0ZW1zIEluYwotMTQxZSAgRmFudWMgTHRkCi0xNDFmICBWaXNpb250ZWNoIEx0ZAotMTQyMCAgUHNpb24gRGFjb20gcGxjCi0JODAwMiAgR29sZCBDYXJkIE5ldEdsb2JhbCA1NmsrMTAvMTAwTWIgQ2FyZEJ1cyAoRXRoZXJuZXQgcGFydCkKLQk4MDAzICBHb2xkIENhcmQgTmV0R2xvYmFsIDU2aysxMC8xMDBNYiBDYXJkQnVzIChNb2RlbSBwYXJ0KQotMTQyMSAgQWRzIFRlY2hub2xvZ2llcyBJbmMKLTE0MjIgIFlncmVjIFN5c3RlbXMgQ28gTHRkCi0xNDIzICBDdXN0b20gVGVjaG5vbG9neSBDb3JwLgotMTQyNCAgVmlkZW9zZXJ2ZXIgQ29ubmVjdGlvbnMKLTE0MjUgIENoZWxzaW8gQ29tbXVuaWNhdGlvbnMgSW5jCi0xNDI2ICBTdG9yYWdlIFRlY2hub2xvZ3kgQ29ycC4KLTE0MjcgIEJldHRlciBPbi1MaW5lIFNvbHV0aW9ucwotMTQyOCAgRWRlYyBDbyBMdGQKLTE0MjkgIFVuZXggVGVjaG5vbG9neSBDb3JwLgotMTQyYSAgS2luZ21heCBUZWNobm9sb2d5IEluYwotMTQyYiAgUmFkaW9sYW4KLTE0MmMgIE1pbnRvbiBPcHRpYyBJbmR1c3RyeSBDbyBMdGQKLTE0MmQgIFBpeCBzdHJlYW0gSW5jCi0xNDJlICBWaXRlYyBNdWx0aW1lZGlhCi0JNDAyMCAgVk0yLTIgW1ZpZGVvIE1ha2VyIDJdIE1QRUcxLzIgRW5jb2RlcgotMTQyZiAgUmFkaWNvbSBSZXNlYXJjaCBJbmMKLTE0MzAgIElUVCBBZXJvc3BhY2UvQ29tbXVuaWNhdGlvbnMgRGl2aXNpb24KLTE0MzEgIEdpbGF0IFNhdGVsbGl0ZSBOZXR3b3JrcwotMTQzMiAgRWRpbWF4IENvbXB1dGVyIENvLgotCTkxMzAgIFJUTDgxeHggRmFzdCBFdGhlcm5ldAotMTQzMyAgRWx0ZWMgRWxla3Ryb25payBHbWJICi0xNDM1ICBSZWFsIFRpbWUgRGV2aWNlcyBVUyBJbmMuCi0xNDM2ICBDSVMgVGVjaG5vbG9neSBJbmMKLTE0MzcgIE5pc3NpbiBJbmMgQ28KLTE0MzggIEF0bWVsLWRyZWFtCi0xNDM5ICBPdXRzb3VyY2UgRW5naW5lZXJpbmcgJiBNZmcuIEluYwotMTQzYSAgU3RhcmdhdGUgU29sdXRpb25zIEluYwotMTQzYiAgQ2Fub24gUmVzZWFyY2ggQ2VudGVyLCBBbWVyaWNhCi0xNDNjICBBbWxvZ2ljIEluYwotMTQzZCAgVGFtYXJhY2sgTWljcm9lbGVjdHJvbmljcyBJbmMKLTE0M2UgIEpvbmVzIEZ1dHVyZXggSW5jCi0xNDNmICBMaWdodHdlbGwgQ28gTHRkIC0gWmF4IERpdmlzaW9uCi0xNDQwICBBTEdPTCBDb3JwLgotMTQ0MSAgQUdJRSBMdGQKLTE0NDIgIFBob2VuaXggQ29udGFjdCBHbWJIICYgQ28uCi0xNDQzICBVbmlicmFpbiBTLkEuCi0xNDQ0ICBUUlcKLTE0NDUgIExvZ2ljYWwgRE8gTHRkCi0xNDQ2ICBHcmFwaGluIENvIEx0ZAotMTQ0NyAgQUlNIEdtQkgKLTE0NDggIEFsZXNpcyBTdHVkaW8gRWxlY3Ryb25pY3MKLTE0NDkgIFRVVCBTeXN0ZW1zIEluYwotMTQ0YSAgQWRsaW5rIFRlY2hub2xvZ3kKLQk3Mjk2ICBQQ0ktNzI5NgotCTc0MzIgIFBDSS03NDMyCi0JNzQzMyAgUENJLTc0MzMKLQk3NDM0ICBQQ0ktNzQzNAotCTc4NDEgIFBDSS03ODQxCi0JODEzMyAgUENJLTgxMzMKLQk4MTY0ICBQQ0ktODE2NAotCTg1NTQgIFBDSS04NTU0Ci0JOTExMSAgUENJLTkxMTEKLQk5MTEzICBQQ0ktOTExMwotCTkxMTQgIFBDSS05MTE0Ci0xNDRiICBMb3Jvbml4IEluZm9ybWF0aW9uIFN5c3RlbXMgSW5jCi0xNDRjICBDYXRhbGluYSBSZXNlYXJjaCBJbmMKLTE0NGQgIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28gTHRkCi0xNDRlICBPTElURUMKLTE0NGYgIEFza2V5IENvbXB1dGVyIENvcnAuCi0xNDUwICBPY3RhdmUgQ29tbXVuaWNhdGlvbnMgSW5kLgotMTQ1MSAgU1AzRCBDaGlwIERlc2lnbiBHbUJICi0xNDUzICBNWUNPTSBJbmMKLTE0NTQgIEFsdGlnYSBOZXR3b3JrcwotMTQ1NSAgTG9naWMgUGx1cyBQbHVzIEluYwotMTQ1NiAgQWR2YW5jZWQgSGFyZHdhcmUgQXJjaGl0ZWN0dXJlcwotMTQ1NyAgTnVlcmEgQ29tbXVuaWNhdGlvbnMgSW5jCi0xNDU4ICBHaWdhLWJ5dGUgVGVjaG5vbG9neQotCTBjMTEgIEs4TlMgUHJvIE1haW5ib2FyZAotMTQ1OSAgRE9PSU4gRWxlY3Ryb25pY3MKLTE0NWEgIEVzY2FsYXRlIE5ldHdvcmtzIEluYwotMTQ1YiAgUFJBSU0gU1JMCi0xNDVjICBDcnlwdGVrCi0xNDVkICBHYWxsYW50IENvbXB1dGVyIEluYwotMTQ1ZSAgQWFzaGltYSBUZWNobm9sb2d5IEIuVi4KLTE0NWYgIEJhbGRvciBFbGVjdHJpYyBDb21wYW55Ci0JMDAwMSAgTmV4dE1vdmUgUENJCi0xNDYwICBEWU5BUkMgSU5DCi0xNDYxICBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYwotMTQ2MiAgTWljcm8tU3RhciBJbnRlcm5hdGlvbmFsIENvLiwgTHRkLgotIyBNU0kgQ0I1NEcgV2lyZWxlc3MgUEMgQ2FyZCB0aGF0IHNlZW1zIHRvIHVzZSB0aGUgQnJvYWRjb20gNDMwNiBDaGlwc2V0Ci0JNjgxOSAgQnJvYWRjb20gQ29ycG9yYXRpb24gQkNNNDMwNiA4MDIuMTFiL2cgV2lyZWxlc3MgTEFOIENvbnRyb2xsZXIgW01TSSBDQjU0R10KLQk2ODI1ICBQQ0kgQ2FyZCB3aXJlbGVzcyAxMWcgW1BDNTRHXQotCTg3MjUgIE5WSURJQSBOVjI1IFtHZUZvcmNlNCBUaSA0NjAwXSBWR0EgQWRhcHRlcgotIyBNU0kgRzRUaTQ4MDAsIDEyOE1CIEREUiBTRFJBTSwgVFYtT3V0LCBEVkktSQotCTkwMDAgIE5WSURJQSBOVjI4IFtHZUZvcmNlNCBUaSA0ODAwXSBWR0EgQWRhcHRlcgotCTkxMTAgIEdlRk9SQ0UgRlg1MjAwCi0JOTExOSAgTlZJRElBIE5WMzEgW0dlRm9yY2UgRlggNTYwMFhUXSBWR0EgQWRhcHRlcgotCTk1OTEgIG5WaWRpYSBDb3Jwb3JhdGlvbiBOVjM2IFtHZUZvcmNlIEZYIDU3MDBMRV0KLTE0NjMgIEZhc3QgQ29ycG9yYXRpb24KLTE0NjQgIEludGVyYWN0aXZlIENpcmN1aXRzICYgU3lzdGVtcyBMdGQKLTE0NjUgIEdOIE5FVFRFU1QgVGVsZWNvbSBESVYuCi0xNDY2ICBEZXNpZ25wcm8gSW5jLgotMTQ2NyAgRElHSUNPTSBTUEEKLTE0NjggIEFNQklUIE1pY3Jvc3lzdGVtIENvcnAuCi0xNDY5ICBDbGV2ZWxhbmQgTW90aW9uIENvbnRyb2xzCi0xNDZhICBJRlIKLTE0NmIgIFBhcmFzY2FuIFRlY2hub2xvZ2llcyBMdGQKLTE0NmMgIFJ1YnkgVGVjaCBDb3JwLgotCTE0MzAgIEZFLTE0MzBUWCBGYXN0IEV0aGVybmV0IFBDSSBBZGFwdGVyCi0xNDZkICBUYWNoeW9uLCBJTkMuCi0xNDZlICBXaWxsaWFtcyBFbGVjdHJvbmljcyBHYW1lcywgSW5jLgotMTQ2ZiAgTXVsdGkgRGltZW5zaW9uYWwgQ29uc3VsdGluZyBJbmMKLTE0NzAgIEJheSBOZXR3b3JrcwotMTQ3MSAgSW50ZWdyYXRlZCBUZWxlY29tIEV4cHJlc3MgSW5jCi0xNDcyICBEQUlLSU4gSW5kdXN0cmllcywgTHRkCi0xNDczICBaQVBFWCBUZWNobm9sb2dpZXMgSW5jCi0xNDc0ICBEb3VnIENhcnNvbiAmIEFzc29jaWF0ZXMKLTE0NzUgIFBJQ0FaTyBDb21tdW5pY2F0aW9ucwotMTQ3NiAgTU9SVEFSQSBJbnN0cnVtZW50IEluYwotMTQ3NyAgTmV0IEluc2lnaHQKLTE0NzggIERJQVRSRU5EIENvcnBvcmF0aW9uCi0xNDc5ICBUT1JBWSBJbmR1c3RyaWVzIEluYwotMTQ3YSAgRk9STU9TQSBJbmR1c3RyaWFsIENvbXB1dGluZwotMTQ3YiAgQUJJVCBDb21wdXRlciBDb3JwLgotMTQ3YyAgQVdBUkUsIEluYy4KLTE0N2QgIEludGVyd29ya3MgQ29tcHV0ZXIgUHJvZHVjdHMKLTE0N2UgIE1hdHN1c2hpdGEgR3JhcGhpYyBDb21tdW5pY2F0aW9uIFN5c3RlbXMsIEluYy4KLTE0N2YgIE5JSE9OIFVOSVNZUywgTHRkLgotMTQ4MCAgU0NJSSBUZWxlY29tCi0xNDgxICBCSU9QQUMgU3lzdGVtcyBJbmMKLTE0ODIgIElTWVRFQyAtIEludGVncmllcnRlIFN5c3RlbXRlY2huaWsgR21CSAotMTQ4MyAgTEFCV0FZIENvcnBvcmF0aW9uCi0xNDg0ICBMb2dpYyBDb3Jwb3JhdGlvbgotMTQ4NSAgRVJNQSAtIEVsZWN0cm9uaWMgR21CSAotMTQ4NiAgTDMgQ29tbXVuaWNhdGlvbnMgVGVsZW1ldHJ5ICYgSW5zdHJ1bWVudGF0aW9uCi0xNDg3ICBNQVJRVUVUVEUgTWVkaWNhbCBTeXN0ZW1zCi0xNDg4ICBLT05UUk9OIEVsZWN0cm9uaWsgR21CSAotMTQ4OSAgS1lFIFN5c3RlbXMgQ29ycG9yYXRpb24KLTE0OGEgIE9QVE8KLTE0OGIgIElOTk9NRURJQUxPR0lDIEluYy4KLTE0OGMgIEMuUC4gVGVjaG5vbG9neSBDby4gTHRkCi0xNDhkICBESUdJQ09NIFN5c3RlbXMsIEluYy4KLQkxMDAzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0xNDhlICBPU0kgUGx1cyBDb3Jwb3JhdGlvbgotMTQ4ZiAgUGxhbnQgRXF1aXBtZW50LCBJbmMuCi0xNDkwICBTdG9uZSBNaWNyb3N5c3RlbXMgUFRZIEx0ZC4KLTE0OTEgIFpFQUwgQ29ycG9yYXRpb24KLTE0OTIgIFRpbWUgTG9naWMgQ29ycG9yYXRpb24KLTE0OTMgIE1BS0VSIENvbW11bmljYXRpb25zCi0xNDk0ICBXSU5UT1AgVGVjaG5vbG9neSwgSW5jLgotMTQ5NSAgVE9LQUkgQ29tbXVuaWNhdGlvbnMgSW5kdXN0cnkgQ28uIEx0ZAotMTQ5NiAgSk9ZVEVDSCBDb21wdXRlciBDby4sIEx0ZC4KLTE0OTcgIFNNQSBSZWdlbHN5c3RlbWUgR21CSAotMTQ5OCAgVEVXUyBEYXRlbnRlY2huaWsgR21CSAotCTMwYzggIFRQQ0kyMDAKLTE0OTkgIEVNVEVDIENPLiwgTHRkCi0xNDlhICBBTkRPUiBUZWNobm9sb2d5IEx0ZAotMTQ5YiAgU0VJS08gSW5zdHJ1bWVudHMgSW5jCi0xNDljICBPVklTTElOSyBDb3JwLgotMTQ5ZCAgTkVXVEVLIEluYwotCTAwMDEgIFZpZGVvIFRvYXN0ZXIgZm9yIFBDCi0xNDllICBNYXBsZXRyZWUgTmV0d29ya3MgSW5jLgotMTQ5ZiAgTEVDVFJPTiBDbyBMdGQKLTE0YTAgIFNPRlRJTkcgR21CSAotMTRhMSAgU3lzdGVtYmFzZSBDbyBMdGQKLTE0YTIgIE1pbGxlbm5pdW0gRW5naW5lZXJpbmcgSW5jCi0xNGEzICBNYXZlcmljayBOZXR3b3JrcwotMTRhNCAgR1ZDL0JDTSBBZHZhbmNlZCBSZXNlYXJjaAotMTRhNSAgWElPTklDUyBEb2N1bWVudCBUZWNobm9sb2dpZXMgSW5jCi0xNGE2ICBJTk9WQSBDb21wdXRlcnMgR21CSCAmIENvIEtHCi0xNGE3ICBNWVRIT1MgU3lzdGVtcyBJbmMKLTE0YTggIEZFQVRST04gVGVjaG5vbG9naWVzIENvcnBvcmF0aW9uCi0xNGE5ICBISVZFUlRFQyBJbmMKLTE0YWEgIEFkdmFuY2VkIE1PUyBUZWNobm9sb2d5IEluYwotMTRhYiAgTWVudG9yIEdyYXBoaWNzIENvcnAuCi0xNGFjICBOb3Zhd2ViIFRlY2hub2xvZ2llcyBJbmMKLTE0YWQgIFRpbWUgU3BhY2UgUmFkaW8gQUIKLTE0YWUgIENUSSwgSW5jCi0xNGFmICBHdWlsbGVtb3QgQ29ycG9yYXRpb24KLQk3MTAyICAzRCBQcm9waGV0IElJIE1YCi0xNGIwICBCU1QgQ29tbXVuaWNhdGlvbiBUZWNobm9sb2d5IEx0ZAotMTRiMSAgTmV4dGNvbSBLLksuCi0xNGIyICBFTk5PVkFURSBOZXR3b3JrcyBJbmMKLTE0YjMgIFhQRUVEIEluYwotCTAwMDAgIERTTCBOSUMKLTE0YjQgIFBISUxJUFMgQnVzaW5lc3MgRWxlY3Ryb25pY3MgQi5WLgotMTRiNSAgQ3JlYW13YXJlIEdtQkgKLQkwMjAwICBTY29wZQotCTAzMDAgIFB1bHNhcgotCTA0MDAgIFB1bHNhclNSQgotCTA2MDAgIFB1bHNhcjIKLQkwODAwICBEU1AtQm9hcmQKLQkwOTAwICBEU1AtQm9hcmQKLQkwYTAwICBEU1AtQm9hcmQKLQkwYjAwICBEU1AtQm9hcmQKLTE0YjYgIFF1YW50dW0gRGF0YSBDb3JwLgotMTRiNyAgUFJPWElNIEluYwotCTAwMDEgIFN5bXBob255IDQxMTAKLTE0YjggIFRlY2hzb2Z0IFRlY2hub2xvZ3kgQ28gTHRkCi0xNGI5ICBBSVJPTkVUIFdpcmVsZXNzIENvbW11bmljYXRpb25zCi0JMDAwMSAgUEM0ODAwCi0JMDM0MCAgUEM0ODAwCi0JMDM1MCAgUEM0ODAwCi0JNDUwMCAgUEM0NTAwCi0JNDgwMCAgQ2lzY28gQWlyb25ldCAzNDAgODAyLjExYiBXaXJlbGVzcyBMQU4gQWRhcHRlci9BaXJvbmV0IFBDNDgwMAotCWE1MDQgIENpc2NvIEFpcm9uZXQgV2lyZWxlc3MgODAyLjExYgotCWE1MDUgIENpc2NvIEFpcm9uZXQgQ0IyMGEgODAyLjExYSBXaXJlbGVzcyBMQU4gQWRhcHRlcgotCWE1MDYgIENpc2NvIEFpcm9uZXQgTWluaSBQQ0kgYi9nCi0xNGJhICBJTlRFUk5JWCBJbmMuCi0xNGJiICBTRU1URUNIIENvcnBvcmF0aW9uCi0xNGJjICBHbG9iZXNwYW4gU2VtaWNvbmR1Y3RvciBJbmMuCi0xNGJkICBDQVJESU8gQ29udHJvbCBOLlYuCi0xNGJlICBMMyBDb21tdW5pY2F0aW9ucwotMTRiZiAgU1BJREVSIENvbW11bmljYXRpb25zIEluYy4KLTE0YzAgIENPTVBBTCBFbGVjdHJvbmljcyBJbmMKLTE0YzEgIE1ZUklDT00gSW5jLgotCTgwNDMgIE15cmluZXQgMjAwMCBTY2FsYWJsZSBDbHVzdGVyIEludGVyY29ubmVjdAotMTRjMiAgRFRLIENvbXB1dGVyCi0xNGMzICBNRURJQVRFSyBDb3JwLgotMTRjNCAgSVdBU0FLSSBJbmZvcm1hdGlvbiBTeXN0ZW1zIENvIEx0ZAotMTRjNSAgQXV0b21hdGlvbiBQcm9kdWN0cyBBQgotMTRjNiAgRGF0YSBSYWNlIEluYwotMTRjNyAgTW9kdWxhciBUZWNobm9sb2d5IEhvbGRpbmdzIEx0ZAotMTRjOCAgVHVyYm9jb21tIFRlY2guIEluYy4KLTE0YzkgIE9ESU4gVGVsZXN5c3RlbXMgSW5jCi0xNGNhICBQRSBMb2dpYyBDb3JwLgotMTRjYiAgQmlsbGlvbnRvbiBTeXN0ZW1zIEluYwotMTRjYyAgTkFLQVlPIFRlbGVjb21tdW5pY2F0aW9ucyBJbmMKLTE0Y2QgIFVuaXZlcnNhbCBTY2llbnRpZmljIEluZC4KLTE0Y2UgIFdoaXN0bGUgQ29tbXVuaWNhdGlvbnMKLTE0Y2YgIFRFSyBNaWNyb3N5c3RlbXMgSW5jLgotMTRkMCAgRXJpY3Nzb24gQXhlIFIgJiBECi0xNGQxICBDb21wdXRlciBIaS1UZWNoIENvIEx0ZAotMTRkMiAgVGl0YW4gRWxlY3Ryb25pY3MgSW5jCi0JODAwMSAgVlNjb20gMDEwTCAxIHBvcnQgcGFyYWxsZWwgYWRhcHRvcgotCTgwMDIgIFZTY29tIDAyMEwgMiBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQk4MDEwICBWU2NvbSAxMDBMIDEgcG9ydCBzZXJpYWwgYWRhcHRvcgotCTgwMTEgIFZTY29tIDExMEwgMSBwb3J0IHNlcmlhbCBhbmQgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQk4MDIwICBWU2NvbSAyMDBMIDEgcG9ydCBzZXJpYWwgYWRhcHRvcgotCTgwMjEgIFZTY29tIDIxMEwgMiBwb3J0IHNlcmlhbCBhbmQgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQk4MDQwICBWU2NvbSA0MDBMIDQgcG9ydCBzZXJpYWwgYWRhcHRvcgotCTgwODAgIFZTY29tIDgwMEwgOCBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JYTAwMCAgVlNjb20gMDEwSCAxIHBvcnQgcGFyYWxsZWwgYWRhcHRvcgotCWEwMDEgIFZTY29tIDEwMEggMSBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JYTAwMyAgVlNjb20gNDAwSCA0IHBvcnQgc2VyaWFsIGFkYXB0b3IKLQlhMDA0ICBWU2NvbSA0MDBIRjEgNCBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JYTAwNSAgVlNjb20gMjAwSCAyIHBvcnQgc2VyaWFsIGFkYXB0b3IKLQllMDAxICBWU2NvbSAwMTBIVjIgMSBwb3J0IHBhcmFsbGVsIGFkYXB0b3IKLQllMDEwICBWU2NvbSAxMDBIVjIgMSBwb3J0IHNlcmlhbCBhZGFwdG9yCi0JZTAyMCAgVlNjb20gMjAwSFYyIDIgcG9ydCBzZXJpYWwgYWRhcHRvcgotMTRkMyAgQ0lSVEVDSCAoVUspIEx0ZAotMTRkNCAgUGFuYWNvbSBUZWNobm9sb2d5IENvcnAKLTE0ZDUgIE5pdHN1a28gQ29ycG9yYXRpb24KLTE0ZDYgIEFjY3VzeXMgSW5jCi0xNGQ3ICBIaXJha2F3YSBIZXd0ZWNoIENvcnAKLTE0ZDggIEhPUEYgRWxla3Ryb25payBHbUJICi0jIEZvcm1lcmx5IFNpUGFja2V0cywgSW5jLiwgZm9ybWVybHkgQVBJIE5ldFdvcmtzLCBJbmMuLCBmb3JtZXJseSBBbHBoYSBQcm9jZXNzb3IsIEluYy4KLTE0ZDkgIEFsbGlhbmNlIFNlbWljb25kdWN0b3IgQ29ycG9yYXRpb24KLQkwMDEwICBBUDEwMTEvU1AxMDExIEh5cGVyVHJhbnNwb3J0LVBDSSBCcmlkZ2UgW1N0dXJnZW9uXQotCTkwMDAgIEFTOTBMMTAyMDQvMTAyMDggSHlwZXJUcmFuc3BvcnQgdG8gUENJLVggQnJpZGdlCi0xNGRhICBOYXRpb25hbCBBZXJvc3BhY2UgTGFib3JhdG9yaWVzCi0xNGRiICBBRkFWTEFCIFRlY2hub2xvZ3kgSW5jCi0JMjEyMCAgVEs5OTAyCi0xNGRjICBBbXBsaWNvbiBMaXZlbGluZSBMdGQKLQkwMDAwICBQQ0kyMzAKLQkwMDAxICBQQ0kyNDIKLQkwMDAyICBQQ0kyNDQKLQkwMDAzICBQQ0kyNDcKLQkwMDA0ICBQQ0kyNDgKLQkwMDA1ICBQQ0kyNDkKLQkwMDA2ICBQQ0kyNjAKLQkwMDA3ICBQQ0kyMjQKLQkwMDA4ICBQQ0kyMzQKLQkwMDA5ICBQQ0kyMzYKLQkwMDBhICBQQ0kyNzIKLQkwMDBiICBQQ0kyMTUKLTE0ZGQgIEJvdWxkZXIgRGVzaWduIExhYnMgSW5jCi0xNGRlICBBcHBsaWVkIEludGVncmF0aW9uIENvcnBvcmF0aW9uCi0xNGRmICBBU0lDIENvbW11bmljYXRpb25zIENvcnAKLTE0ZTEgIElOVkVSVEVYCi0xNGUyICBJTkZPTElCUklBCi0xNGUzICBBTVRFTENPCi0xNGU0ICBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotCTA4MDAgIFNlbnRyeTUgQ2hpcGNvbW1vbiBJL08gQ29udHJvbGxlcgotCTA4MDQgIFNlbnRyeTUgUENJIEJyaWRnZQotCTA4MDUgIFNlbnRyeTUgTUlQUzMyIENQVQotCTA4MDYgIFNlbnRyeTUgRXRoZXJuZXQgQ29udHJvbGxlcgotCTA4MGIgIFNlbnRyeTUgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JMDgwZiAgU2VudHJ5NSBERFIvU0RSIFJBTSBDb250cm9sbGVyCi0JMDgxMSAgU2VudHJ5NSBFeHRlcm5hbCBJbnRlcmZhY2UgQ29yZQotCTA4MTYgIEJDTTMzMDIgU2VudHJ5NSBNSVBTMzIgQ1BVCi0JMTYwMCAgTmV0WHRyZW1lIEJDTTU3NTIgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2NDQgIE5ldFh0cmVtZSBCQ001NzAwIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTAxNCAwMjc3ICBCcm9hZGNvbSBWaWdpbCBCNTcwMCAxMDAwQmFzZS1UCi0JCTEwMjggMDBkMSAgQnJvYWRjb20gQkNNNTcwMAotCQkxMDI4IDAxMDYgIEJyb2FkY29tIEJDTTU3MDAKLQkJMTAyOCAwMTA5ICBCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVQKLQkJMTAyOCAwMTBhICBCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlVFgKLQkJMTBiNyAxMDAwICAzQzk5Ni1UIDEwMDBCYXNlLVQKLQkJMTBiNyAxMDAxICAzQzk5NkItVCAxMDAwQmFzZS1UCi0JCTEwYjcgMTAwMiAgM0M5OTZDLVQgMTAwMEJhc2UtVAotCQkxMGI3IDEwMDMgIDNDOTk3LVQgMTAwMEJhc2UtVCBEdWFsIFBvcnQKLQkJMTBiNyAxMDA0ICAzQzk5Ni1TWCAxMDAwQmFzZS1TWAotCQkxMGI3IDEwMDUgIDNDOTk3LVNYIDEwMDBCYXNlLVNYIER1YWwgUG9ydAotCQkxMGI3IDEwMDggIDNDOTQyIEdpZ2FiaXQgTE9NICgzMVgzMSkKLQkJMTRlNCAwMDAyICBOZXRYdHJlbWUgMTAwMEJhc2UtU1gKLQkJMTRlNCAwMDAzICBOZXRYdHJlbWUgMTAwMEJhc2UtU1gKLQkJMTRlNCAwMDA0ICBOZXRYdHJlbWUgMTAwMEJhc2UtVAotCQkxNGU0IDEwMjggIE5ldFh0cmVtZSAxMDAwQmFzZVRYCi0JCTE0ZTQgMTY0NCAgQkNNNTcwMCAxMDAwQmFzZS1UCi0JMTY0NSAgTmV0WHRyZW1lIEJDTTU3MDEgR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwN2MgIE5DNzc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAvMTAwLzEwMDAtVCkKLQkJMGUxMSAwMDdkICBOQzY3NzAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwMDAtU1gpCi0JCTBlMTEgMDA4NSAgTkM3NzgwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgMDA5OSAgTkM3NzgwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgMDA5YSAgTkM3NzcwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKFBDSS1YLCAxMC8xMDAvMTAwMC1UKQotCQkwZTExIDAwYzEgIE5DNjc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAwMC1TWCkKLQkJMTAyOCAwMTIxICBCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQKLQkJMTAzYyAxMjhhICBIUCAxMDAwQmFzZS1UIChQQ0kpIFtBNzA2MUFdCi0JCTEwM2MgMTI4YiAgSFAgMTAwMEJhc2UtU1ggKFBDSSkgW0E3MDczQV0KLQkJMTAzYyAxMmE0ICBIUCBDb3JlIExhbiAxMDAwQmFzZS1UCi0JCTEwM2MgMTJjMSAgSFAgSU9YIENvcmUgTGFuIDEwMDBCYXNlLVQgW0E3MTA5QVhdCi0JCTEwYTkgODAxMCAgU0dJIElPOSBHaWdhYml0IEV0aGVybmV0IChDb3BwZXIpCi0JCTEwYTkgODAxMSAgU0dJIEdpZ2FiaXQgRXRoZXJuZXQgKENvcHBlcikKLQkJMTBhOSA4MDEyICBTR0kgR2lnYWJpdCBFdGhlcm5ldCAoRmliZXIpCi0JCTEwYjcgMTAwNCAgM0M5OTYtU1ggMTAwMEJhc2UtU1gKLQkJMTBiNyAxMDA2ICAzQzk5NkItVCAxMDAwQmFzZS1UCi0JCTEwYjcgMTAwNyAgM0MxMDAwLVQgMTAwMEJhc2UtVAotCQkxMGI3IDEwMDggIDNDOTQwLUJSMDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDEgIEJDTTU3MDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDUgIEJDTTU3MDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDYgIEJDTTU3MDEgMTAwMEJhc2UtVAotCQkxNGU0IDAwMDcgIEJDTTU3MDEgMTAwMEJhc2UtU1gKLQkJMTRlNCAwMDA4ICBCQ001NzAxIDEwMDBCYXNlLVQKLQkJMTRlNCA4MDA4ICBCQ001NzAxIDEwMDBCYXNlLVQKLQkxNjQ2ICBOZXRYdHJlbWUgQkNNNTcwMiBHaWdhYml0IEV0aGVybmV0Ci0JCTBlMTEgMDBiYiAgTkM3NzYwIDEwMDBCYXNlVFgKLQkJMTAyOCAwMTI2ICBCcm9hZGNvbSBCQ001NzAyIDEwMDBCYXNlVFgKLQkJMTRlNCA4MDA5ICBCQ001NzAyIDEwMDBCYXNlVFgKLQkxNjQ3ICBOZXRYdHJlbWUgQkNNNTcwMyBHaWdhYml0IEV0aGVybmV0Ci0JCTBlMTEgMDA5OSAgTkM3NzgwIDEwMDBCYXNlVFgKLQkJMGUxMSAwMDlhICBOQzc3NzAgMTAwMEJhc2VUWAotCQkxMGE5IDgwMTAgIFNHSSBJTzkgR2lnYWJpdCBFdGhlcm5ldCAoQ29wcGVyKQotCQkxNGU0IDAwMDkgIEJDTTU3MDMgMTAwMEJhc2VUWAotCQkxNGU0IDAwMGEgIEJDTTU3MDMgMTAwMEJhc2VTWAotCQkxNGU0IDAwMGIgIEJDTTU3MDMgMTAwMEJhc2VUWAotCQkxNGU0IDgwMDkgIEJDTTU3MDMgMTAwMEJhc2VUWAotCQkxNGU0IDgwMGEgIEJDTTU3MDMgMTAwMEJhc2VUWAotCTE2NDggIE5ldFh0cmVtZSBCQ001NzA0IEdpZ2FiaXQgRXRoZXJuZXQKLQkJMGUxMSAwMGNmICBOQzc3NzIgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwLDEwMCwxMDAwLVQpCi0JCTBlMTEgMDBkMCAgTkM3NzgyIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgKFBDSS1YLCAxMCwxMDAsMTAwMC1UKQotCQkwZTExIDAwZDEgIE5DNzc4MyBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAsMTAwLDEwMDAtVCkKLQkJMTBiNyAyMDAwICAzQzk5OC1UIER1YWwgUG9ydCAxMC8xMDAvMTAwMCBQQ0ktWAotCQkxMGI3IDMwMDAgIDNDOTk5LVQgUXVhZCBQb3J0IDEwLzEwMC8xMDAwIFBDSS1YCi0JCTExNjYgMTY0OCAgTmV0WHRyZW1lIENJT0ItRSAxMDAwQmFzZS1UCi0JMTY0YSAgTmV0WHRyZW1lIElJIEJDTTU3MDYgR2lnYWJpdCBFdGhlcm5ldAotCTE2NGQgIE5ldFh0cmVtZSBCQ001NzAyRkUgR2lnYWJpdCBFdGhlcm5ldAotCTE2NTMgIE5ldFh0cmVtZSBCQ001NzA1IEdpZ2FiaXQgRXRoZXJuZXQKLQkJMGUxMSAwMGUzICBOQzc3NjEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCTE2NTQgIE5ldFh0cmVtZSBCQ001NzA1XzIgR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwZTMgIE5DNzc2MSBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0JCTEwM2MgMzEwMCAgTkMxMDIwIEhQIFByb0xpYW50IEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIgMzIgUENJCi0JMTY1OSAgTmV0WHRyZW1lIEJDTTU3MjEgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2NWQgIE5ldFh0cmVtZSBCQ001NzA1TSBHaWdhYml0IEV0aGVybmV0Ci0JMTY1ZSAgTmV0WHRyZW1lIEJDTTU3MDVNXzIgR2lnYWJpdCBFdGhlcm5ldAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JMTY2ZSAgNTcweCAxMC8xMDAgSW50ZWdyYXRlZCBDb250cm9sbGVyCi0JMTY3NyAgTmV0WHRyZW1lIEJDTTU3NTEgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCQkxMDI4IDAxNzkgIE9wdGlwbGV4IEdYMjgwCi0JMTY3ZCAgTmV0WHRyZW1lIEJDTTU3NTFNIEdpZ2FiaXQgRXRoZXJuZXQgUENJIEV4cHJlc3MKLQkxNjdlICBOZXRYdHJlbWUgQkNNNTc1MUYgRmFzdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2OTYgIE5ldFh0cmVtZSBCQ001NzgyIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTAzYyAxMmJjICBIUCBkNTMwIENNVCAoREc3NDZBKQotCQkxNGU0IDAwMGQgIE5ldFh0cmVtZSBCQ001NzgyIDEwMDBCYXNlLVQKLQkxNjljICBOZXRYdHJlbWUgQkNNNTc4OCBHaWdhYml0IEV0aGVybmV0Ci0JMTY5ZCAgTmV0TGluayBCQ001Nzg5IEdpZ2FiaXQgRXRoZXJuZXQgUENJIEV4cHJlc3MKLQkxNmE2ICBOZXRYdHJlbWUgQkNNNTcwMlggR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwYmIgIE5DNzc2MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAvMTAwLzEwMDAtVCkKLQkJMTAyOCAwMTI2ICBCQ001NzAyIDEwMDBCYXNlLVQKLQkJMTRlNCAwMDBjICBCQ001NzAyIDEwMDBCYXNlLVQKLQkJMTRlNCA4MDA5ICBCQ001NzAyIDEwMDBCYXNlLVQKLQkxNmE3ICBOZXRYdHJlbWUgQkNNNTcwM1ggR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwY2EgIE5DNzc3MSBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAsMTAwLDEwMDAtVCkKLQkJMGUxMSAwMGNiICBOQzc3ODEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwLDEwMCwxMDAwLVQpCi0JCTE0ZTQgMDAwOSAgTmV0WHRyZW1lIEJDTTU3MDMgMTAwMEJhc2UtVAotCQkxNGU0IDAwMGEgIE5ldFh0cmVtZSBCQ001NzAzIDEwMDBCYXNlLVNYCi0JCTE0ZTQgMDAwYiAgTmV0WHRyZW1lIEJDTTU3MDMgMTAwMEJhc2UtVAotCQkxNGU0IDgwMGEgIE5ldFh0cmVtZSBCQ001NzAzIDEwMDBCYXNlLVQKLQkxNmE4ICBOZXRYdHJlbWUgQkNNNTcwNFMgR2lnYWJpdCBFdGhlcm5ldAotCQkxMGI3IDIwMDEgIDNDOTk4LVNYIER1YWwgUG9ydCAxMDAwLVNYIFBDSS1YCi0JMTZhYSAgTmV0WHRyZW1lIElJIEJDTTU3MDZTIEdpZ2FiaXQgRXRoZXJuZXQKLQkxNmM2ICBOZXRYdHJlbWUgQkNNNTcwMkEzIEdpZ2FiaXQgRXRoZXJuZXQKLQkJMTBiNyAxMTAwICAzQzEwMDBCLVQgMTAvMTAwLzEwMDAgUENJCi0JCTE0ZTQgMDAwYyAgQkNNNTcwMiAxMDAwQmFzZS1UCi0JCTE0ZTQgODAwOSAgQkNNNTcwMiAxMDAwQmFzZS1UCi0JMTZjNyAgTmV0WHRyZW1lIEJDTTU3MDMgR2lnYWJpdCBFdGhlcm5ldAotCQkwZTExIDAwY2EgIE5DNzc3MSBHaWdhYml0IFNlcnZlciBBZGFwdGVyIChQQ0ktWCwgMTAsMTAwLDEwMDAtVCkKLQkJMGUxMSAwMGNiICBOQzc3ODEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciAoUENJLVgsIDEwLDEwMCwxMDAwLVQpCi0JCTEwM2MgMTJjMyAgSFAgQ29tYm8gRkMvR2lnRS1TWCBbQTk3ODJBXQotCQkxMDNjIDEyY2EgIEhQIENvbWJvIEZDL0dpZ0UtVCBbQTk3ODRBXQotCQkxNGU0IDAwMDkgIE5ldFh0cmVtZSBCQ001NzAzIDEwMDBCYXNlLVQKLQkJMTRlNCAwMDBhICBOZXRYdHJlbWUgQkNNNTcwMyAxMDAwQmFzZS1TWAotCTE2ZGQgIE5ldExpbmsgQkNNNTc4MSBHaWdhYml0IEV0aGVybmV0IFBDSSBFeHByZXNzCi0JMTZmNyAgTmV0WHRyZW1lIEJDTTU3NTMgR2lnYWJpdCBFdGhlcm5ldCBQQ0kgRXhwcmVzcwotCTE2ZmQgIE5ldFh0cmVtZSBCQ001NzUzTSBHaWdhYml0IEV0aGVybmV0IFBDSSBFeHByZXNzCi0JMTZmZSAgTmV0WHRyZW1lIEJDTTU3NTNGIEZhc3QgRXRoZXJuZXQgUENJIEV4cHJlc3MKLQkxNzBjICBCQ000NDAxLUIwIDEwMEJhc2UtVFgKLQkxNzBkICBOZXRYdHJlbWUgQkNNNTkwMSAxMDBCYXNlLVRYCi0JCTEwMTQgMDU0NSAgVGhpbmtQYWQgUjQwZSAoMjY4NC1IVkcpIGJ1aWx0aW4gZXRoZXJuZXQgY29udHJvbGxlcgotCTE3MGUgIE5ldFh0cmVtZSBCQ001OTAxIDEwMEJhc2UtVFgKLQkzMzUyICBCQ00zMzUyCi0JMzM2MCAgQkNNMzM2MAotCTQyMTAgIEJDTTQyMTAgaUxpbmUxMCBIb21lUE5BIDIuMAotCTQyMTEgIEJDTTQyMTEgaUxpbmUxMCBIb21lUE5BIDIuMCArIFYuOTAgNTZrIG1vZGVtCi0JNDIxMiAgQkNNNDIxMiB2LjkwIDU2ayBtb2RlbQotCTQzMDEgIEJDTTQzMDMgODAyLjExYiBXaXJlbGVzcyBMQU4gQ29udHJvbGxlcgotCQkxMDI4IDA0MDcgIFRydWVNb2JpbGUgMTE4MCBPbmJvYXJkIFdMQU4KLQkJMTA0MyAwMTIwICBXTC0xMDNiIFdpcmVsZXNzIExBTiBQQyBDYXJkCi0JNDMwNSAgQkNNNDMwNyBWLjkwIDU2ayBNb2RlbQotCTQzMDYgIEJDTTQzMDcgRXRoZXJuZXQgQ29udHJvbGxlcgotCTQzMDcgIEJDTTQzMDcgODAyLjExYiBXaXJlbGVzcyBMQU4gQ29udHJvbGxlcgotCTQzMTAgIEJDTTQzMTAgQ2hpcGNvbW1vbiBJL09Db250cm9sbGVyCi0JNDMxMiAgQkNNNDMxMCBVQVJUCi0JNDMxMyAgQkNNNDMxMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JNDMxNSAgQkNNNDMxMCBVU0IgQ29udHJvbGxlcgotCTQzMjAgIEJDTTQzMDYgODAyLjExYi9nIFdpcmVsZXNzIExBTiBDb250cm9sbGVyCi0JCTEwMjggMDAwMSAgVHJ1ZU1vYmlsZSAxMzAwIFdMQU4gTWluaS1QQ0kgQ2FyZAotCQkxMDI4IDAwMDMgIFdpcmVsZXNzIDEzNTAgV0xBTiBNaW5pLVBDSSBDYXJkCi0JCTEwNDMgMTAwZiAgV0wtMTAwRwotCQkxNGU0IDQzMjAgIExpbmtzeXMgV01QNTRHIFBDSQotCQkxNzM3IDQzMjAgIFdQQzU0RwotCQkxNzk5IDcwMTAgIEJlbGtpbiBGNUQ3MDEwIDU0ZyBXaXJlbGVzcyBOZXR3b3JrIGNhcmQKLQk0MzIxICBCQ000MzA2IDgwMi4xMWEgV2lyZWxlc3MgTEFOIENvbnRyb2xsZXIKLQk0MzIyICBCQ000MzA2IFVBUlQKLQk0MzI0ICBCQ000MzA5IDgwMi4xMWEvYi9nCi0JCTEwMjggMDAwMSAgVHJ1ZW1vYmlsZSAxNDAwCi0JCTEwMjggMDAwMyAgVHJ1ZW1vYmlsZSAxNDUwIE1pbmlQQ0kKLQk0MzI1ICBCQ000M3hHIDgwMi4xMWIvZwotCQkxNDE0IDAwMDMgIFdpcmVsZXNzIE5vdGVib29rIEFkYXB0ZXIgTU4tNzIwCi0JCTE0MTQgMDAwNCAgV2lyZWxlc3MgUENJIEFkYXB0ZXIgTU4tNzMwCi0jIHByb2JhYmx5IHRoaXMgaXMgYSBjb3JyZWN0IElELi4uCi0JNDMyNiAgQkNNNDMwNyBDaGlwY29tbW9uIEkvTyBDb250cm9sbGVyPwotCTQ0MDEgIEJDTTQ0MDEgMTAwQmFzZS1UCi0JCTEwNDMgODBhOCAgQTdWOFggbW90aGVyYm9hcmQKLQk0NDAyICBCQ000NDAyIEludGVncmF0ZWQgMTAvMTAwQmFzZVQKLQk0NDAzICBCQ000NDAyIFYuOTAgNTZrIE1vZGVtCi0JNDQxMCAgQkNNNDQxMyBpTGluZTMyIEhvbWVQTkEgMi4wCi0JNDQxMSAgQkNNNDQxMyBWLjkwIDU2ayBtb2RlbQotCTQ0MTIgIEJDTTQ0MTIgMTAvMTAwQmFzZVQKLQk0NDMwICBCQ000NHh4IENhcmRCdXMgaUxpbmUzMiBIb21lUE5BIDIuMAotCTQ0MzIgIEJDTTQ0MzIgQ2FyZEJ1cyAxMC8xMDBCYXNlVAotCTQ2MTAgIEJDTTQ2MTAgU2VudHJ5NSBQQ0kgdG8gU0IgQnJpZGdlCi0JNDYxMSAgQkNNNDYxMCBTZW50cnk1IGlMaW5lMzIgSG9tZVBOQSAxLjAKLQk0NjEyICBCQ000NjEwIFNlbnRyeTUgVi45MCA1NmsgTW9kZW0KLQk0NjEzICBCQ000NjEwIFNlbnRyeTUgRXRoZXJuZXQgQ29udHJvbGxlcgotCTQ2MTQgIEJDTTQ2MTAgU2VudHJ5NSBFeHRlcm5hbCBJbnRlcmZhY2UKLQk0NjE1ICBCQ000NjEwIFNlbnRyeTUgVVNCIENvbnRyb2xsZXIKLQk0NzA0ICBCQ000NzA0IFBDSSB0byBTQiBCcmlkZ2UKLQk0NzA1ICBCQ000NzA0IFNlbnRyeTUgODAyLjExYiBXaXJlbGVzcyBMQU4gQ29udHJvbGxlcgotCTQ3MDYgIEJDTTQ3MDQgU2VudHJ5NSBFdGhlcm5ldCBDb250cm9sbGVyCi0JNDcwNyAgQkNNNDcwNCBTZW50cnk1IFVTQiBDb250cm9sbGVyCi0JNDcwOCAgQkNNNDcwNCBDcnlwdG8gQWNjZWxlcmF0b3IKLQk0NzEwICBCQ000NzEwIFNlbnRyeTUgUENJIHRvIFNCIEJyaWRnZQotCTQ3MTEgIEJDTTQ3eHggU2VudHJ5NSBpTGluZTMyIEhvbWVQTkEgMi4wCi0JNDcxMiAgQkNNNDd4eCBWLjkyIDU2ayBtb2RlbQotCTQ3MTMgIFNlbnRyeTUgRXRoZXJuZXQgQ29udHJvbGxlcgotCTQ3MTQgIEJDTTQ3eHggU2VudHJ5NSBFeHRlcm5hbCBJbnRlcmZhY2UKLQk0NzE1ICBTZW50cnk1IFVTQiBDb250cm9sbGVyCi0JNDcxNiAgQkNNNDd4eCBTZW50cnk1IFVTQiBIb3N0IENvbnRyb2xsZXIKLQk0NzE3ICBCQ000N3h4IFNlbnRyeTUgVVNCIERldmljZSBDb250cm9sbGVyCi0JNDcxOCAgU2VudHJ5NSBDcnlwdG8gQWNjZWxlcmF0b3IKLQk0NzIwICBCQ000NzEyIE1JUFMgQ1BVCi0JNTM2NSAgQkNNNTM2NVAgU2VudHJ5NSBIb3N0IEJyaWRnZQotCTU2MDAgIEJDTTU2MDAgU3RyYXRhU3dpdGNoIDI0KzIgRXRoZXJuZXQgU3dpdGNoIENvbnRyb2xsZXIKLQk1NjA1ICBCQ001NjA1IFN0cmF0YVN3aXRjaCAyNCsyIEV0aGVybmV0IFN3aXRjaCBDb250cm9sbGVyCi0JNTYxNSAgQkNNNTYxNSBTdHJhdGFTd2l0Y2ggMjQrMiBFdGhlcm5ldCBTd2l0Y2ggQ29udHJvbGxlcgotCTU2MjUgIEJDTTU2MjUgU3RyYXRhU3dpdGNoIDI0KzIgRXRoZXJuZXQgU3dpdGNoIENvbnRyb2xsZXIKLQk1NjQ1ICBCQ001NjQ1IFN0cmF0YVN3aXRjaCAyNCsyIEV0aGVybmV0IFN3aXRjaCBDb250cm9sbGVyCi0JNTY3MCAgQkNNNTY3MCA4LVBvcnQgMTBHRSBFdGhlcm5ldCBTd2l0Y2ggRmFicmljCi0JNTY4MCAgQkNNNTY4MCBHLVN3aXRjaCA4IFBvcnQgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggQ29udHJvbGxlcgotCTU2OTAgIEJDTTU2OTAgMTItcG9ydCBNdWx0aS1MYXllciBHaWdhYml0IEV0aGVybmV0IFN3aXRjaAotCTU2OTEgIEJDTTU2OTEgR0UvMTBHRSA4KzIgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggQ29udHJvbGxlcgotCTU4MjAgIEJDTTU4MjAgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JNTgyMSAgQkNNNTgyMSBDcnlwdG8gQWNjZWxlcmF0b3IKLQk1ODIyICBCQ001ODIyIENyeXB0byBBY2NlbGVyYXRvcgotCTU4MjMgIEJDTTU4MjMgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JNTgyNCAgQkNNNTgyNCBDcnlwdG8gQWNjZWxlcmF0b3IKLQk1ODQwICBCQ001ODQwIENyeXB0byBBY2NlbGVyYXRvcgotCTU4NDEgIEJDTTU4NDEgQ3J5cHRvIEFjY2VsZXJhdG9yCi0JNTg1MCAgQkNNNTg1MCBDcnlwdG8gQWNjZWxlcmF0b3IKLTE0ZTUgIFBpeGVsZnVzaW9uIEx0ZAotMTRlNiAgU0hJTklORyBUZWNobm9sb2d5IEluYwotMTRlNyAgM0NYCi0xNGU4ICBSQVlDRVIgSW5jCi0xNGU5ICBHQVJORVRTIFN5c3RlbSBDTyBMdGQKLTE0ZWEgIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jCi0JYWIwNiAgRk5XLTM2MDMtVFggQ2FyZEJ1cyBGYXN0IEV0aGVybmV0Ci0JYWIwNyAgUlRMODF4eCBSZWFsVGVrIEV0aGVybmV0Ci0xNGViICBTRUlLTyBFUFNPTiBDb3JwCi0xNGVjICBBQ1FJUklTCi0xNGVkICBEQVRBS0lORVRJQ1MgTHRkCi0xNGVlICBNQVNQUk8gS0VOS09IIENvcnAKLTE0ZWYgIENBUlJZIENvbXB1dGVyIEVORy4gQ08gTHRkCi0xNGYwICBDQU5PTiBSRVNFQUNIIENFTlRSRSBGUkFOQ0UKLTE0ZjEgIENvbmV4YW50Ci0JMTAwMiAgSENGIDU2ayBNb2RlbQotCTEwMDMgIEhDRiA1NmsgTW9kZW0KLQkxMDA0ICBIQ0YgNTZrIE1vZGVtCi0JMTAwNSAgSENGIDU2ayBNb2RlbQotCTEwMDYgIEhDRiA1NmsgTW9kZW0KLQkxMDIyICBIQ0YgNTZrIE1vZGVtCi0JMTAyMyAgSENGIDU2ayBNb2RlbQotCTEwMjQgIEhDRiA1NmsgTW9kZW0KLQkxMDI1ICBIQ0YgNTZrIE1vZGVtCi0JMTAyNiAgSENGIDU2ayBNb2RlbQotCTEwMzIgIEhDRiA1NmsgTW9kZW0KLQkxMDMzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0JCTEwMzMgODA3NyAgTkVDCi0JCTEyMmQgNDAyNyAgRGVsbCBaZXVzIC0gTURQMzg4MC1XKEIpIERhdGEgRmF4IE1vZGVtCi0JCTEyMmQgNDAzMCAgRGVsbCBNZXJjdXJ5IC0gTURQMzg4MC1VKEIpIERhdGEgRmF4IE1vZGVtCi0JCTEyMmQgNDAzNCAgRGVsbCBUaG9yIC0gTURQMzg4MC1XKFUpIERhdGEgRmF4IE1vZGVtCi0JCTEzZTAgMDIwZCAgRGVsbCBDb3BwZXIKLQkJMTNlMCAwMjBlICBEZWxsIFNpbHZlcgotCQkxM2UwIDAyNjEgIElCTQotCQkxM2UwIDAyOTAgIENvbXBhcSBHb2xkd2luZwotCQkxM2UwIDAyYTAgIElCTQotCQkxM2UwIDAyYjAgIElCTQotCQkxM2UwIDAyYzAgIENvbXBhcSBTY29vdGVyCi0JCTEzZTAgMDJkMCAgSUJNCi0JCTE0NGYgMTUwMCAgSUJNIFA4NS1ERiAoMSkKLQkJMTQ0ZiAxNTAxICBJQk0gUDg1LURGICgyKQotCQkxNDRmIDE1MGEgIElCTSBQODUtREYgKDMpCi0JCTE0NGYgMTUwYiAgSUJNIFA4NS1ERiBMb3cgUHJvZmlsZSAoMSkKLQkJMTQ0ZiAxNTEwICBJQk0gUDg1LURGIExvdyBQcm9maWxlICgyKQotCTEwMzQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxMDM1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkJMTBjZiAxMDk4ICBGdWppdHN1IFA4NS1ERlNWCi0JMTAzNiAgSENGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JCTEwNGQgODA2NyAgSENGIDU2ayBNb2RlbQotCQkxMjJkIDQwMjkgIE1EUDM4ODBTUC1XCi0JCTEyMmQgNDAzMSAgTURQMzg4MFNQLVUKLQkJMTNlMCAwMjA5ICBEZWxsIFRpdGFuaXVtCi0JCTEzZTAgMDIwYSAgRGVsbCBHcmFwaGl0ZQotCQkxM2UwIDAyNjAgIEdhdGV3YXkgUmVkIE93bAotCQkxM2UwIDAyNzAgIEdhdGV3YXkgV2hpdGUgSG9yc2UKLQkxMDUyICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtIChXb3JsZHdpZGUpCi0JMTA1MyAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbSAoV29ybGR3aWRlKQotCTEwNTQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU2ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU3ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKFdvcmxkd2lkZSkKLQkxMDU5ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtIChXb3JsZHdpZGUpCi0JMTA2MyAgSENGIDU2ayBEYXRhL0ZheCBNb2RlbQotCTEwNjQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxMDY1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkxMDY2ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0KLQkJMTIyZCA0MDMzICBEZWxsIEF0aGVuYSAtIE1EUDM5MDBWLVUKLQkxNDMzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0JMTQzNCAgSENGIDU2ayBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCTE0MzUgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCAody9IYW5kc2V0KSBNb2RlbQotCTE0MzYgIEhDRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkxNDUzICBIQ0YgNTZrIERhdGEvRmF4IE1vZGVtCi0JCTEzZTAgMDI0MCAgSUJNCi0JCTEzZTAgMDI1MCAgSUJNCi0JCTE0NGYgMTUwMiAgSUJNIFA5NS1ERiAoMSkKLQkJMTQ0ZiAxNTAzICBJQk0gUDk1LURGICgyKQotCTE0NTQgIEhDRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkxNDU1ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0KLQkxNDU2ICBIQ0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0KLQkJMTIyZCA0MDM1ICBEZWxsIEV1cm9wYSAtIE1EUDM5MDBWLVcKLQkJMTIyZCA0MzAyICBEZWxsIE1QMzkzMFYtVyhDKSBNaW5pUENJCi0JMTYxMCAgQURTTCBBY2Nlc3NSdW5uZXIgUENJIEFyYml0cmF0aW9uIERldmljZQotCTE2MTEgIEFjY2Vzc1J1bm5lciBQQ0kgQURTTCBJbnRlcmZhY2UgRGV2aWNlCi0JMTYyMCAgQURTTCBBY2Nlc3NSdW5uZXIgVjIgUENJIEFyYml0cmF0aW9uIERldmljZQotCTE2MjEgIEFjY2Vzc1J1bm5lciBWMiBQQ0kgQURTTCBJbnRlcmZhY2UgRGV2aWNlCi0JMTYyMiAgQWNjZXNzUnVubmVyIFYyIFBDSSBBRFNMIFl1a29uIFdBTiBBZGFwdGVyCi0JMTgwMyAgSENGIDU2ayBNb2RlbQotCQkwZTExIDAwMjMgIDYyMy1MQU4gR3JpenpseQotCQkwZTExIDAwNDMgIDYyMy1MQU4gWW9naQotCTE4MTUgIEhDRiA1NmsgTW9kZW0KLQkJMGUxMSAwMDIyICBHcml6emx5Ci0JCTBlMTEgMDA0MiAgWW9naQotCTIwMDMgIEhTRiA1NmsgRGF0YS9GYXggTW9kZW0KLQkyMDA0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JMjAwNSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hhbmRzZXQpIE1vZGVtCi0JMjAwNiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JMjAxMyAgSFNGIDU2ayBEYXRhL0ZheCBNb2RlbQotCQkwZTExIGIxOTUgIEJlYXIKLQkJMGUxMSBiMTk2ICBTZW1pbm9sZSAxCi0JCTBlMTEgYjFiZSAgU2VtaW5vbGUgMgotCQkxMDI1IDgwMTMgIEFjZXIKLQkJMTAzMyA4MDlkICBORUMKLQkJMTAzMyA4MGJjICBORUMKLQkJMTU1ZCA2NzkzICBIUAotCQkxNTVkIDg4NTAgIEUgTWFjaGluZXMKLQkyMDE0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JMjAxNSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hhbmRzZXQpIE1vZGVtCi0JMjAxNiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtCi0JMjA0MyAgSFNGIDU2ayBEYXRhL0ZheCBNb2RlbSAoV29ybGRXIFNtYXJ0REFBKQotCTIwNDQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKFdvcmxkVyBTbWFydERBQSkKLQkyMDQ1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0gKFdvcmxkVyBTbWFydERBQSkKLQkyMDQ2ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKFdvcmxkVyBTbWFydERBQSkKLQkyMDYzICBIU0YgNTZrIERhdGEvRmF4IE1vZGVtIChTbWFydERBQSkKLQkyMDY0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlIE1vZGVtIChTbWFydERBQSkKLQkyMDY1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSGFuZHNldCkgTW9kZW0gKFNtYXJ0REFBKQotCTIwNjYgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCBNb2RlbSAoU21hcnREQUEpCi0JMjA5MyAgSFNGIDU2ayBNb2RlbQotCQkxNTVkIDJmMDcgIExlZ2VuZAotCTIxNDMgIEhTRiA1NmsgRGF0YS9GYXgvQ2VsbCBNb2RlbSAoTW9iIFdvcmxkVyBTbWFydERBQSkKLQkyMTQ0ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL0NlbGwgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjE0NSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hTKS9DZWxsIE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCTIxNDYgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcC9DZWxsIE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCTIxNjMgIEhTRiA1NmsgRGF0YS9GYXgvQ2VsbCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTIxNjQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvQ2VsbCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTIxNjUgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcCAody9IUykvQ2VsbCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTIxNjYgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UvU3BrcC9DZWxsIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM0MyAgSFNGIDU2ayBEYXRhL0ZheCBDYXJkQnVzIE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCTIzNDQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgQ2FyZEJ1cyBNb2RlbSAoTW9iIFdvcmxkVyBTbWFydERBQSkKLQkyMzQ1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSFMpIENhcmRCdXMgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjM0NiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIENhcmRCdXMgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjM2MyAgSFNGIDU2ayBEYXRhL0ZheCBDYXJkQnVzIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM2NCAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZSBDYXJkQnVzIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM2NSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hTKSBDYXJkQnVzIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjM2NiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIENhcmRCdXMgTW9kZW0gKE1vYiBTbWFydERBQSkKLQkyNDQzICBIU0YgNTZrIERhdGEvRmF4IE1vZGVtIChNb2IgV29ybGRXIFNtYXJ0REFBKQotCQkxMDRkIDgwNzUgIE1vZGVtCi0JCTEwNGQgODA4MyAgTW9kZW0KLQkJMTA0ZCA4MDk3ICBNb2RlbQotCTI0NDQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjQ0NSAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwICh3L0hTKSBNb2RlbSAoTW9iIFdvcmxkVyBTbWFydERBQSkKLQkyNDQ2ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgTW9kZW0gKE1vYiBXb3JsZFcgU21hcnREQUEpCi0JMjQ2MyAgSFNGIDU2ayBEYXRhL0ZheCBNb2RlbSAoTW9iIFNtYXJ0REFBKQotCTI0NjQgIEhTRiA1NmsgRGF0YS9GYXgvVm9pY2UgTW9kZW0gKE1vYiBTbWFydERBQSkKLQkyNDY1ICBIU0YgNTZrIERhdGEvRmF4L1ZvaWNlL1Nwa3AgKHcvSFMpIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMjQ2NiAgSFNGIDU2ayBEYXRhL0ZheC9Wb2ljZS9TcGtwIE1vZGVtIChNb2IgU21hcnREQUEpCi0JMmYwMCAgSFNGIDU2ayBIU0ZpIE1vZGVtCi0JCTEzZTAgOGQ4NCAgSUJNIEhTRmkgVi45MAotCQkxM2UwIDhkODUgIENvbXBhcSBTdGluZ2VyCi0JCTE0ZjEgMjAwNCAgRHluYWxpbmsgNTZQTWkKLQkyZjAyICBIU0YgNTZrIEhTRmkgRGF0YS9GYXgKLQkyZjExICBIU0YgNTZrIEhTRmkgTW9kZW0KLQk4MjM0ICBSUzgyMzQgQVRNIFNBUiBDb250cm9sbGVyIFtTZXJ2aWNlU0FSIFBsdXNdCi0JODgwMCAgQ1gyMjcwMiBEVkItVCAyay84awotCQkxN2RlIDA4YTEgIFhQZXJ0IERWQi1UIFBDSSBCREEgRFZCVCAyMzg4MCBWaWRlbyBDYXB0dXJlCi0JODgwMiAgQ1gyMzg4MyBCcm9hZGNhc3QgRGVjb2RlcgotCQkxN2RlIDA4YTEgIFhwZXJ0IERWQi1UIFBDSSAyMzg4eCBUcmFuc3BvcnQgU3RyZWFtIENhcHR1cmUKLTE0ZjIgIE1PQklMSVRZIEVsZWN0cm9uaWNzCi0JMDEyMCAgRVYxMDAwIGJyaWRnZQotCTAxMjEgIEVWMTAwMCBQYXJhbGxlbCBwb3J0Ci0JMDEyMiAgRVYxMDAwIFNlcmlhbCBwb3J0Ci0JMDEyMyAgRVYxMDAwIEtleWJvYXJkIGNvbnRyb2xsZXIKLQkwMTI0ICBFVjEwMDAgTW91c2UgY29udHJvbGxlcgotMTRmMyAgQnJvYWRMb2dpYwotCTIwMzAgIDIwMzAgRFZCLVMgU2F0ZWxsaXRlIFJlY2lldmVyCi0JMjA1MCAgMjA1MCBEVkItVCBUZXJyZXN0cmlhbCAoQ2FibGUpIFJlY2lldmVyCi0JMjA2MCAgMjA2MCBBVFNDIFRlcnJlc3RyaWFsIChDYWJsZSkgUmVjaWV2ZXIKLTE0ZjQgIFRPS1lPIEVsZWN0cm9uaWMgSW5kdXN0cnkgQ08gTHRkCi0xNGY1ICBTT1BBQyBMdGQKLTE0ZjYgIENPWU9URSBUZWNobm9sb2dpZXMgTExDCi0xNGY3ICBXT0xGIFRlY2hub2xvZ3kgSW5jCi0xNGY4ICBBVURJT0NPREVTIEluYwotCTIwNzcgIFRQLTI0MCBkdWFsIHNwYW4gRTEgVm9JUCBQQ0kgY2FyZAotMTRmOSAgQUcgQ09NTVVOSUNBVElPTlMKLTE0ZmEgIFdBTkRFTCAmIEdPQ0hFUk1BTk4KLTE0ZmIgIFRSQU5TQVMgTUFSSU5FIChVSykgTHRkCi0xNGZjICBRdWFkcmljcyBMdGQKLQkwMDAwICBRc05ldCBFbGFuMyBOZXR3b3JrIEFkYXB0ZXIKLQkwMDAxICBRc05ldElJIEVsYW40IE5ldHdvcmsgQWRhcHRlcgotMTRmZCAgSkFQQU4gQ29tcHV0ZXIgSW5kdXN0cnkgSW5jCi0xNGZlICBBUkNIVEVLIFRFTEVDT00gQ29ycAotMTRmZiAgVFdJTkhFQUQgSU5URVJOQVRJT05BTCBDb3JwCi0xNTAwICBERUxUQSBFbGVjdHJvbmljcywgSW5jCi0JMTM2MCAgUlRMODF4eCBSZWFsVGVrIEV0aGVybmV0Ci0xNTAxICBCQU5LU09GVCBDQU5BREEgTHRkCi0xNTAyICBNSVRTVUJJU0hJIEVMRUNUUklDIExPR0lTVElDUyBTVVBQT1JUIENvIEx0ZAotMTUwMyAgS0FXQVNBS0kgTFNJIFVTQSBJbmMKLTE1MDQgIEtBSVNFUiBFbGVjdHJvbmljcwotMTUwNSAgSVRBIElOR0VOSUVVUkJVUk8gRlVSIFRFU1RBVUZHQUJFTiBHbWJICi0xNTA2ICBDSEFNRUxFT04gU3lzdGVtcyBJbmMKLSMgU2hvdWxkIGJlIEhURUMgTHRkLCBidXQgdGhlcmUgYXJlIG5vIGtub3duIEhURUMgY2hpcHMgYW5kIDE1MDcgaXMgYWxyZWFkeSB1c2VkIGJ5IG1pc3Rha2UgYnkgTW90b3JvbGEgKHNlZSB2ZW5kb3IgSUQgMTA1NykuCi0xNTA3ICBNb3Rvcm9sYSA/PyAvIEhURUMKLQkwMDAxICBNUEMxMDUgW0VhZ2xlXQotCTAwMDIgIE1QQzEwNiBbR3JhY2tsZV0KLQkwMDAzICBNUEM4MjQwIFtLYWhsdWFdCi0JMDEwMCAgTUMxNDU1NzUgW0hGQy1QQ0ldCi0JMDQzMSAgS1RJODI5YyAxMDBWRwotCTQ4MDEgIFJhdmVuCi0JNDgwMiAgRmFsY29uCi0JNDgwMyAgSGF3awotCTQ4MDYgIENQWDgyMTYKLTE1MDggIEhPTkRBIENPTk5FQ1RPUlMvTUhPVFJPTklDUyBJbmMKLTE1MDkgIEZJUlNUIElOVEVSTkFUSU9OQUwgQ29tcHV0ZXIgSW5jCi0xNTBhICBGT1JWVVMgUkVTRUFSQ0ggSW5jCi0xNTBiICBZQU1BU0hJVEEgU3lzdGVtcyBDb3JwCi0xNTBjICBLWU9QQUwgQ08gTHRkCi0xNTBkICBXQVJQU1BQRUQgSW5jCi0xNTBlICBDLVBPUlQgQ29ycAotMTUwZiAgSU5URUMgR21iSAotMTUxMCAgQkVIQVZJT1IgVEVDSCBDb21wdXRlciBDb3JwCi0xNTExICBDRU5USUxMSVVNIFRlY2hub2xvZ3kgQ29ycAotMTUxMiAgUk9TVU4gVGVjaG5vbG9naWVzIEluYwotMTUxMyAgUmF5Y2hlbQotMTUxNCAgVEZMIExBTiBJbmMKLTE1MTUgIEFkdmVudCBkZXNpZ24KLTE1MTYgIE1ZU09OIFRlY2hub2xvZ3kgSW5jCi0JMDgwMCAgTVRELTh4eCAxMDAvMTBNIEV0aGVybmV0IFBDSSBBZGFwdGVyCi0JMDgwMyAgU1VSRUNPTSBFUC0zMjBYLVMgMTAwLzEwTSBFdGhlcm5ldCBQQ0kgQWRhcHRlcgotCQkxMzIwIDEwYmQgIFNVUkVDT00gRVAtMzIwWC1TIDEwMC8xME0gRXRoZXJuZXQgUENJIEFkYXB0ZXIKLQkwODkxICBNVEQtOHh4IDEwMC8xME0gRXRoZXJuZXQgUENJIEFkYXB0ZXIKLTE1MTcgIEVDSE9URUsgQ29ycAotMTUxOCAgUEVQIE1PRFVMQVIgQ29tcHV0ZXJzIEdtYkgKLTE1MTkgIFRFTEVGT04gQUtUSUVCT0xBR0VUIExNIEVyaWNzc29uCi0xNTFhICBHbG9iZXRlawotCTEwMDIgIFBDSS0xMDAyCi0JMTAwNCAgUENJLTEwMDQKLQkxMDA4ICBQQ0ktMTAwOAotMTUxYiAgQ09NQk9YIEx0ZAotMTUxYyAgRElHSVRBTCBBVURJTyBMQUJTIEluYwotCTAwMDMgIFByb2RpZiBUIDI0OTYKLQk0MDAwICBQcm9kaWYgODgKLTE1MWQgIEZ1aml0c3UgQ29tcHV0ZXIgUHJvZHVjdHMgT2YgQW1lcmljYQotMTUxZSAgTUFUUklYIENvcnAKLTE1MWYgIFRPUElDIFNFTUlDT05EVUNUT1IgQ29ycAotCTAwMDAgIFRQNTYwIERhdGEvRmF4L1ZvaWNlIDU2ayBtb2RlbQotMTUyMCAgQ0hBUExFVCBTeXN0ZW0gSW5jCi0xNTIxICBCRUxMIENvcnAKLTE1MjIgIE1haW5QaW5lIEx0ZAotCTAxMDAgIFBDSSA8LT4gSU9CdXMgQnJpZGdlCi0JCTE1MjIgMDIwMCAgUm9ja0ZvcmNlRFVPIDIgUG9ydCBWLjkyL1YuNDQgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTUyMiAwMzAwICBSb2NrRm9yY2VRVUFUUk8gNCBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDA0MDAgIFJvY2tGb3JjZURVTysgMiBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDA1MDAgIFJvY2tGb3JjZVFVQVRSTysgNCBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDA2MDAgIFJvY2tGb3JjZSsgMiBQb3J0IFYuOTAgRGF0YS9GYXgvVm9pY2UgTW9kZW0KLQkJMTUyMiAwNzAwICBSb2NrRm9yY2UrIDQgUG9ydCBWLjkwIERhdGEvRmF4L1ZvaWNlIE1vZGVtCi0JCTE1MjIgMDgwMCAgUm9ja0ZvcmNlT0NUTysgOCBQb3J0IFYuOTIvVi40NCBEYXRhL0ZheC9Wb2ljZSBNb2RlbQotCQkxNTIyIDBjMDAgIFJvY2tGb3JjZURVTysgMiBQb3J0IFYuOTIvVi40NCBEYXRhLCBWLjM0IFN1cGVyLUczIEZheCwgVm9pY2UgTW9kZW0KLQkJMTUyMiAwZDAwICBSb2NrRm9yY2VRVUFUUk8rIDQgUG9ydCBWLjkyL1YuNDQgRGF0YSwgVi4zNCBTdXBlci1HMyBGYXgsIFZvaWNlIE1vZGVtCi0jIHRoaXMgaXMgYSBjb3JyZWN0aW9uIHRvIGEgcmVjZW50IGVudHJ5LiAxNTIyOjBFMDAgc2hvdWxkIGJlIDE1MjI6MUQwMAotCQkxNTIyIDFkMDAgIFJvY2tGb3JjZU9DVE8rIDggUG9ydCBWLjkyL1YuNDQgRGF0YSwgVi4zNCBTdXBlci1HMyBGYXgsIFZvaWNlIE1vZGVtCi0xNTIzICBNVVNJQyBTZW1pY29uZHVjdG9ycwotMTUyNCAgRU5FIFRlY2hub2xvZ3kgSW5jCi0JMDUxMCAgQ0I3MTAgTWVtb3J5IENhcmQgUmVhZGVyIENvbnRyb2xsZXIKLQkwNjEwICBQQ0kgU21hcnQgQ2FyZCBSZWFkZXIgQ29udHJvbGxlcgotCTEyMTEgIENCMTIxMSBDYXJkYnVzIENvbnRyb2xsZXIKLQkxMjI1ICBDQjEyMjUgQ2FyZGJ1cyBDb250cm9sbGVyCi0JMTQxMCAgQ0IxNDEwIENhcmRidXMgQ29udHJvbGxlcgotCQkxMDI1IDAwNWEgIFRyYXZlbE1hdGUgMjkwCi0JMTQxMSAgQ0ItNzEwLzIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLQkxNDEyICBDQi03MTIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLQkxNDIwICBDQjE0MjAgQ2FyZGJ1cyBDb250cm9sbGVyCi0JMTQyMSAgQ0ItNzIwLzIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLQkxNDIyICBDQi03MjIvNCBDYXJkYnVzIENvbnRyb2xsZXIKLTE1MjUgIElNUEFDVCBUZWNobm9sb2dpZXMKLTE1MjYgIElTUywgSW5jCi0xNTI3ICBTT0xFQ1RST04KLTE1MjggIEFDS1NZUwotMTUyOSAgQU1FUklDQU4gTUlDUk9TeXN0ZW1zIEluYwotMTUyYSAgUVVJQ0tUVVJOIERFU0lHTiBTeXN0ZW1zCi0xNTJiICBGTFlURUNIIFRlY2hub2xvZ3kgQ08gTHRkCi0xNTJjICBNQUNSQUlHT1IgU3lzdGVtcyBMTEMKLTE1MmQgIFFVQU5UQSBDb21wdXRlciBJbmMKLTE1MmUgIE1FTEVDIEluYwotMTUyZiAgUEhJTElQUyAtIENSWVBUTwotMTUzMCAgQUNRSVMgVGVjaG5vbG9neSBJbmMKLTE1MzEgIENIUllPTiBDb3JwCi0xNTMyICBFQ0hFTE9OIENvcnAKLTE1MzMgIEJBTFRJTU9SRQotMTUzNCAgUk9BRCBDb3JwCi0xNTM1ICBFVkVSR1JFRU4gVGVjaG5vbG9naWVzIEluYwotMTUzNyAgREFUQUxFWCBDT01NVU5DQVRJT05TCi0xNTM4ICBBUkFMSU9OIEluYwotCTAzMDMgIEFSUzEwNlMgVWx0cmEgQVRBIDEzMy8xMDAvNjYgSG9zdCBDb250cm9sbGVyCi0xNTM5ICBBVEVMSUVSIElORk9STUFUSVFVRVMgZXQgRUxFQ1RST05JUVVFIEVUVURFUyBTLkEuCi0xNTNhICBPTk8gU09LS0kKLTE1M2IgIFRFUlJBVEVDIEVsZWN0cm9uaWMgR21iSAotCTExNDQgIEF1cmVvbiA1LjEKLSMgVGVycmF0ZWMgc2VlbXMgdG8gdXNlIHNldmVyYWwgSURzIGZvciB0aGUgc2FtZSBjYXJkLgotCTExNDcgIEF1cmVvbiA1LjEgU2t5Ci0JMTE1OCAgUGhpbGlwcyBTZW1pY29uZHVjdG9ycyBTQUE3MTM0IChyZXYgMDEpIFtUZXJyYXRlYyBDaW5lcmd5IDYwMCBUVl0KLTE1M2MgIEFOVEFMIEVsZWN0cm9uaWMKLTE1M2QgIEZJTEFORVQgQ29ycAotMTUzZSAgVEVDSFdFTEwgSW5jCi0xNTNmICBNSVBTIERFTk1BUksKLTE1NDAgIFBST1ZJREVPIE1VTFRJTUVESUEgQ28gTHRkCi0xNTQxICBNQUNIT05FIENvbW11bmljYXRpb25zCi0xNTQyICBWSVZJRCBUZWNobm9sb2d5IEluYwotMTU0MyAgU0lMSUNPTiBMYWJvcmF0b3JpZXMKLQkzMDUyICBJbnRlbCA1MzcgW1dpbm1vZGVtXQotCTRjMjIgIFNpMzAzNiBNQyc5NyBEQUEKLTE1NDQgIERDTSBEQVRBIFN5c3RlbXMKLTE1NDUgIFZJU0lPTlRFSwotMTU0NiAgSU9JIFRlY2hub2xvZ3kgQ29ycAotMTU0NyAgTUlUVVRPWU8gQ29ycAotMTU0OCAgSkVUIFBST1BVTFNJT04gTGFib3JhdG9yeQotMTU0OSAgSU5URVJDT05ORUNUIFN5c3RlbXMgU29sdXRpb25zCi0xNTRhICBNQVggVGVjaG5vbG9naWVzIEluYwotMTU0YiAgQ09NUFVURVggQ28gTHRkCi0xNTRjICBWSVNVQUwgVGVjaG5vbG9neSBJbmMKLTE1NGQgIFBBTiBJTlRFUk5BVElPTkFMIEluZHVzdHJpYWwgQ29ycAotMTU0ZSAgU0VSVk9URVNUIEx0ZAotMTU0ZiAgU1RSQVRBQkVBTSBUZWNobm9sb2d5Ci0xNTUwICBPUEVOIE5FVFdPUksgQ28gTHRkCi0xNTUxICBTTUFSVCBFbGVjdHJvbmljIERFVkVMT1BNRU5UIEdtQkgKLTE1NTIgIFJBQ0FMIEFJUlRFQ0ggTHRkCi0xNTUzICBDSElDT05ZIEVsZWN0cm9uaWNzIENvIEx0ZAotMTU1NCAgUFJPTElOSyBNaWNyb3N5c3RlbXMgQ29ycAotMTU1NSAgR0VTWVRFQyBHbUJICi0xNTU2ICBQTEQgQVBQTElDQVRJT05TCi0xNTU3ICBNRURJQVNUQVIgQ28gTHRkCi0xNTU4ICBDTEVWTy9LQVBPSyBDb21wdXRlcgotMTU1OSAgU0kgTE9HSUMgTHRkCi0xNTVhICBJTk5PTUVESUEgSW5jCi0xNTViICBQUk9UQUMgSU5URVJOQVRJT05BTCBDb3JwCi0xNTVjICBDZW1heC1JY29uIEluYwotMTU1ZCAgTWFjIFN5c3RlbSBDbyBMdGQKLTE1NWUgIExQIEVsZWt0cm9uaWsgR21iSAotMTU1ZiAgUGVybGUgU3lzdGVtcyBMdGQKLTE1NjAgIFRlcmF5b24gQ29tbXVuaWNhdGlvbnMgU3lzdGVtcwotMTU2MSAgVmlld2dyYXBoaWNzIEluYwotMTU2MiAgU3ltYm9sIFRlY2hub2xvZ2llcwotMTU2MyAgQS1UcmVuZCBUZWNobm9sb2d5IENvIEx0ZAotMTU2NCAgWWFtYWthdHN1IEVsZWN0cm9uaWNzIEluZHVzdHJ5IENvIEx0ZAotMTU2NSAgQmlvc3RhciBNaWNyb3RlY2ggSW50J2wgQ29ycAotMTU2NiAgQXJkZW50IFRlY2hub2xvZ2llcyBJbmMKLTE1NjcgIEp1bmdzb2Z0Ci0xNTY4ICBEREsgRWxlY3Ryb25pY3MgSW5jCi0xNTY5ICBQYWxpdCBNaWNyb3N5c3RlbXMgSW5jLgotMTU2YSAgQXZ0ZWMgU3lzdGVtcwotMTU2YiAgMndpcmUgSW5jCi0xNTZjICBWaWRhYyBFbGVjdHJvbmljcyBHbWJICi0xNTZkICBBbHBoYS1Ub3AgQ29ycAotMTU2ZSAgQWxmYSBJbmMKLTE1NmYgIE0tU3lzdGVtcyBGbGFzaCBEaXNrIFBpb25lZXJzIEx0ZAotMTU3MCAgTGVjcm95IENvcnAKLTE1NzEgIENvbnRlbXBvcmFyeSBDb250cm9scwotCWEwMDEgIENDU0kgUENJMjAtNDg1IEFSQ25ldAotCWEwMDIgIENDU0kgUENJMjAtNDg1RCBBUkNuZXQKLQlhMDAzICBDQ1NJIFBDSTIwLTQ4NVggQVJDbmV0Ci0JYTAwNCAgQ0NTSSBQQ0kyMC1DWEIgQVJDbmV0Ci0JYTAwNSAgQ0NTSSBQQ0kyMC1DWFMgQVJDbmV0Ci0JYTAwNiAgQ0NTSSBQQ0kyMC1GT0ctU01BIEFSQ25ldAotCWEwMDcgIENDU0kgUENJMjAtRk9HLVNUIEFSQ25ldAotCWEwMDggIENDU0kgUENJMjAtVEI1IEFSQ25ldAotCWEwMDkgIENDU0kgUENJMjAtNS00ODUgNU1iaXQgQVJDbmV0Ci0JYTAwYSAgQ0NTSSBQQ0kyMC01LTQ4NUQgNU1iaXQgQVJDbmV0Ci0JYTAwYiAgQ0NTSSBQQ0kyMC01LTQ4NVggNU1iaXQgQVJDbmV0Ci0JYTAwYyAgQ0NTSSBQQ0kyMC01LUZPRy1TVCA1TWJpdCBBUkNuZXQKLQlhMDBkICBDQ1NJIFBDSTIwLTUtRk9HLVNNQSA1TWJpdCBBUkNuZXQKLQlhMjAxICBDQ1NJIFBDSTIyLTQ4NSAxME1iaXQgQVJDbmV0Ci0JYTIwMiAgQ0NTSSBQQ0kyMi00ODVEIDEwTWJpdCBBUkNuZXQKLQlhMjAzICBDQ1NJIFBDSTIyLTQ4NVggMTBNYml0IEFSQ25ldAotCWEyMDQgIENDU0kgUENJMjItQ0hCIDEwTWJpdCBBUkNuZXQKLQlhMjA1ICBDQ1NJIFBDSTIyLUZPR19TVCAxME1iaXQgQVJDbmV0Ci0JYTIwNiAgQ0NTSSBQQ0kyMi1USEIgMTBNYml0IEFSQ25ldAotMTU3MiAgT3RpcyBFbGV2YXRvciBDb21wYW55Ci0xNTczICBMYXR0aWNlIC0gVmFudGlzCi0xNTc0ICBGYWlyY2hpbGQgU2VtaWNvbmR1Y3RvcgotMTU3NSAgVm9sdGFpcmUgQWR2YW5jZWQgRGF0YSBTZWN1cml0eSBMdGQKLTE1NzYgIFZpZXdjYXN0IENPTQotMTU3OCAgSElUVAotCTU2MTUgIFZQTUszIFtWaWRlbyBQcm9jZXNzb3IgTWsgSUlJXQotMTU3OSAgRHVhbCBUZWNobm9sb2d5IENvcnAKLTE1N2EgIEphcGFuIEVsZWNyb25pY3MgSW5kIEluYwotMTU3YiAgU3RhciBNdWx0aW1lZGlhIENvcnAKLTE1N2MgIEV1cm9zb2Z0IChVSykKLQk4MDAxICBGaXgyMDAwIFBDSSBZMksgQ29tcGxpYW5jZSBDYXJkCi0xNTdkICBHZW1mbGV4IE5ldHdvcmtzCi0xNTdlICBUcmFuc2l0aW9uIE5ldHdvcmtzCi0xNTdmICBQWCBJbnN0cnVtZW50cyBUZWNobm9sb2d5IEx0ZAotMTU4MCAgUHJpbWV4IEFlcm9zcGFjZSBDbwotMTU4MSAgU0VIIENvbXB1dGVydGVjaG5payBHbWJICi0xNTgyICBDeXRlYyBDb3JwCi0xNTgzICBJbmV0IFRlY2hub2xvZ2llcyBJbmMKLTE1ODQgIFVuaXdpbGwgQ29tcHV0ZXIgQ29ycAotMTU4NSAgTG9naXRyb24KLTE1ODYgIExhbmNhc3QgSW5jCi0xNTg3ICBLb25pY2EgQ29ycAotMTU4OCAgU29saWR1bSBTeXN0ZW1zIENvcnAKLTE1ODkgIEF0bGFudGVrIE1pY3Jvc3lzdGVtcyBQdHkgTHRkCi0xNThhICBEaWdhbG9nIFN5c3RlbXMgSW5jCi0xNThiICBBbGxpZWQgRGF0YSBUZWNobm9sb2dpZXMKLTE1OGMgIEhpdGFjaGkgU2VtaWNvbmR1Y3RvciAmIERldmljZXMgU2FsZXMgQ28gTHRkCi0xNThkICBQb2ludCBNdWx0aW1lZGlhIFN5c3RlbXMKLTE1OGUgIExhcmEgVGVjaG5vbG9neSBJbmMKLTE1OGYgIERpdGVjdCBDb29wCi0xNTkwICAzcGFyZGF0YSBJbmMKLTE1OTEgIEFSTgotMTU5MiAgU3liYSBUZWNoIEx0ZAotCTA3ODEgIE11bHRpLUlPIENhcmQKLQkwNzgyICBQYXJhbGxlbCBQb3J0IENhcmQgMnhFUFAKLQkwNzgzICBNdWx0aS1JTyBDYXJkCi0JMDc4NSAgTXVsdGktSU8gQ2FyZAotCTA3ODYgIE11bHRpLUlPIENhcmQKLQkwNzg3ICBNdWx0aS1JTyBDYXJkCi0JMDc4OCAgTXVsdGktSU8gQ2FyZAotCTA3OGEgIE11bHRpLUlPIENhcmQKLTE1OTMgIEJvcHMgSW5jCi0xNTk0ICBOZXRnYW1lIEx0ZAotMTU5NSAgRGl2YSBTeXN0ZW1zIENvcnAKLTE1OTYgIEZvbHNvbSBSZXNlYXJjaCBJbmMKLTE1OTcgIE1lbWVjIERlc2lnbiBTZXJ2aWNlcwotMTU5OCAgR3Jhbml0ZSBNaWNyb3N5c3RlbXMKLTE1OTkgIERlbHRhIEVsZWN0cm9uaWNzIEluYwotMTU5YSAgR2VuZXJhbCBJbnN0cnVtZW50Ci0xNTliICBGYXJhZGF5IFRlY2hub2xvZ3kgQ29ycAotMTU5YyAgU3RyYXR1cyBDb21wdXRlciBTeXN0ZW1zCi0xNTlkICBOaW5nYm8gSGFycmlzb24gRWxlY3Ryb25pY3MgQ28gTHRkCi0xNTllICBBLU1heCBUZWNobm9sb2d5IENvIEx0ZAotMTU5ZiAgR2FsZWEgTmV0d29yayBTZWN1cml0eQotMTVhMCAgQ29tcHVtYXN0ZXIgU1JMCi0xNWExICBHZW9jYXN0IE5ldHdvcmsgU3lzdGVtcwotMTVhMiAgQ2F0YWx5c3QgRW50ZXJwcmlzZXMgSW5jCi0JMDAwMSAgVEE3MDAgUENJIEJ1cyBBbmFseXplci9FeGVyY2lzZXIKLTE1YTMgIEl0YWx0ZWwKLTE1YTQgIFgtTmV0IE9ZCi0xNWE1ICBUb3lvdGEgTWFjcyBJbmMKLTE1YTYgIFN1bmxpZ2h0IFVsdHJhc291bmQgVGVjaG5vbG9naWVzIEx0ZAotMTVhNyAgU1NFIFRlbGVjb20gSW5jCi0xNWE4ICBTaGFuZ2hhaSBDb21tdW5pY2F0aW9ucyBUZWNobm9sb2dpZXMgQ2VudGVyCi0xNWFhICBNb3JldG9uIEJheQotMTVhYiAgQmx1ZXN0ZWVsIE5ldHdvcmtzIEluYwotMTVhYyAgTm9ydGggQXRsYW50aWMgSW5zdHJ1bWVudHMKLTE1YWQgIFZNd2FyZSBJbmMKLQkwNDA1ICBbVk13YXJlIFNWR0EgSUldIFBDSSBEaXNwbGF5IEFkYXB0ZXIKLQkwNzEwICBWaXJ0dWFsIFNWR0EKLQkwNzIwICBWTXdhcmUgSGlnaC1TcGVlZCBWaXJ0dWFsIE5JQyBbdm14bmV0XQotMTVhZSAgQW1lcnNoYW0gUGhhcm1hY2lhIEJpb3RlY2gKLTE1YjAgIFpvbHRyaXggSW50ZXJuYXRpb25hbCBMdGQKLTE1YjEgIFNvdXJjZSBUZWNobm9sb2d5IEluYwotMTViMiAgTW9zYWlkIFRlY2hub2xvZ2llcyBJbmMKLTE1YjMgIE1lbGxhbm94IFRlY2hub2xvZ2llcwotCTUyNzQgIE1UMjExMDggSW5maW5pQnJpZGdlCi0JNWE0NCAgTVQyMzEwOCBJbmZpbmlIb3N0Ci0JNWE0NSAgTVQyMzEwOCBbSW5maW5paG9zdCBIQ0EgRmxhc2ggUmVjb3ZlcnldCi0JNWE0NiAgTVQyMzEwOCBQQ0kgQnJpZGdlCi0JNWU4YyAgTVQyNDIwNCBbSW5maW5pSG9zdCBJSUkgTHggSENBXQotCTVlOGQgIE1UMjQyMDQgW0luZmluaUhvc3QgSUlJIEx4IEhDQSBGbGFzaCBSZWNvdmVyeV0KLQk2Mjc4ICBNVDI1MjA4IEluZmluaUhvc3QgSUlJIEV4IChUYXZvciBjb21wYXRpYmlsaXR5IG1vZGUpCi0JNjI3OSAgTVQyNTIwOCBbSW5maW5pSG9zdCBJSUkgRXggSENBIEZsYXNoIFJlY292ZXJ5XQotCTYyODIgIE1UMjUyMDggSW5maW5pSG9zdCBJSUkgRXgKLTE1YjQgIENDSS9UUklBRAotMTViNSAgQ2ltZXRyaWNzIEluYwotMTViNiAgVGV4YXMgTWVtb3J5IFN5c3RlbXMgSW5jCi0xNWI3ICBTYW5kaXNrIENvcnAKLTE1YjggIEFEREktREFUQSBHbWJICi0xNWI5ICBNYWVzdHJvIERpZ2l0YWwgQ29tbXVuaWNhdGlvbnMKLTE1YmEgIEltcGFjY3QgVGVjaG5vbG9neSBDb3JwCi0xNWJiICBQb3J0d2VsbCBJbmMKLTE1YmMgIEFnaWxlbnQgVGVjaG5vbG9naWVzCi0JMjkyMiAgNjQgQml0LCAxMzNNSHogUENJLVggRXhlcmNpc2VyICYgUHJvdG9jb2wgQ2hlY2tlcgotCTI5MjggIDY0IEJpdCwgNjZNSHogUENJIEV4ZXJjaXNlciAmIEFuYWx5emVyCi0JMjkyOSAgNjQgQml0LCAxMzNNSHogUENJLVggQW5hbHl6ZXIgJiBFeGVyY2lzZXIKLTE1YmQgIERGSSBJbmMKLTE1YmUgIFNvbGEgRWxlY3Ryb25pY3MKLTE1YmYgIEhpZ2ggVGVjaCBDb21wdXRlciBDb3JwIChIVEMpCi0xNWMwICBCVk0gTHRkCi0xNWMxICBRdWFudGVsCi0xNWMyICBOZXdlciBUZWNobm9sb2d5IEluYwotMTVjMyAgVGFpd2FuIE15Y29tcCBDbyBMdGQKLTE1YzQgIEVWU1ggSW5jCi0xNWM1ICBQcm9jb21wIEluZm9ybWF0aWNzIEx0ZAotCTgwMTAgIDEzOTRiIC0gMTM5NCBGaXJld2lyZSAzLVBvcnQgSG9zdCBBZGFwdGVyIENhcmQKLTE1YzYgIFRlY2huaWNhbCBVbml2ZXJzaXR5IG9mIEJ1ZGFwZXN0Ci0xNWM3ICBUYXRleWFtYSBTeXN0ZW0gTGFib3JhdG9yeSBDbyBMdGQKLQkwMzQ5ICBUYXRleWFtYSBDLVBDSSBQTEMvTkMgY2FyZCBSZXYuMDFBCi0xNWM4ICBQZW50YSBNZWRpYSBDbyBMdGQKLTE1YzkgIFNlcm9tZSBUZWNobm9sb2d5IEluYwotMTVjYSAgQml0Ym95cyBPWQotMTVjYiAgQUcgRWxlY3Ryb25pY3MgTHRkCi0xNWNjICBIb3RyYWlsIEluYwotMTVjZCAgRHJlYW10ZWNoIENvIEx0ZAotMTVjZSAgR2VucmFkIEluYwotMTVjZiAgSGlsc2NoZXIgR21iSAotMTVkMSAgSW5maW5lb24gVGVjaG5vbG9naWVzIEFHCi0xNWQyICBGSUMgKEZpcnN0IEludGVybmF0aW9uYWwgQ29tcHV0ZXIgSW5jKQotMTVkMyAgTkRTIFRlY2hub2xvZ2llcyBJc3JhZWwgTHRkCi0xNWQ0ICBJd2lsbCBDb3JwCi0xNWQ1ICBUYXR1bmcgQ28KLTE1ZDYgIEVudHJpZGlhIENvcnAKLTE1ZDcgIFJvY2t3ZWxsLUNvbGxpbnMgSW5jCi0xNWQ4ICBDeWJlcm5ldGljcyBUZWNobm9sb2d5IENvIEx0ZAotMTVkOSAgU3VwZXIgTWljcm8gQ29tcHV0ZXIgSW5jCi0xNWRhICBDeWJlcmZpcm0gSW5jCi0xNWRiICBBcHBsaWVkIENvbXB1dGluZyBTeXN0ZW1zIEluYwotMTVkYyAgTGl0cm9uaWMgSW5jCi0JMDAwMSAgQXJndXMgMzAwIFBDSSBDcnlwdG9ncmFwaHkgTW9kdWxlCi0xNWRkICBTaWdtYXRlbCBJbmMKLTE1ZGUgIE1hbGxlYWJsZSBUZWNobm9sb2dpZXMgSW5jCi0xNWRmICBJbmZpbmlsaW5rIENvcnAKLTE1ZTAgIENhY2hlZmxvdyBJbmMKLTE1ZTEgIFZvaWNlIFRlY2hub2xvZ2llcyBHcm91cCBJbmMKLTE1ZTIgIFF1aWNrbmV0IFRlY2hub2xvZ2llcyBJbmMKLTE1ZTMgIE5ldHdvcnRoIFRlY2hub2xvZ2llcyBJbmMKLTE1ZTQgIFZTTiBTeXN0ZW1lbiBCVgotMTVlNSAgVmFsbGV5IHRlY2hub2xvZ2llcyBJbmMKLTE1ZTYgIEFnZXJlIEluYwotMTVlNyAgR2V0IEVuZ2luZWVyaW5nIENvcnAKLTE1ZTggIE5hdGlvbmFsIERhdGFjb21tIENvcnAKLQkwMTMwICBXaXJlbGVzcyBQQ0kgQ2FyZAotMTVlOSAgUGFjaWZpYyBEaWdpdGFsIENvcnAKLQkxODQxICBBRE1BLTEwMCBEaXNjU3RhUSBBVEEgQ29udHJvbGxlcgotMTVlYSAgVG9reW8gRGVuc2hpIFNla2VpIEsuSy4KLTE1ZWIgIERyc2VhcmNoIEdtYkgKLTE1ZWMgIEJlY2tob2ZmIEdtYkgKLQkzMTAxICBGQzMxMDEgUHJvZmlidXMgRFAgMSBDaGFubmVsIFBDSQotCTUxMDIgIEZDNTEwMgotMTVlZCAgTWFjcm9saW5rIEluYwotMTVlZSAgSW4gV2luIERldmVsb3BtZW50IEluYwotMTVlZiAgSW50ZWxsaWdlbnQgUGFyYWRpZ20gSW5jCi0xNWYwICBCLVRyZWUgU3lzdGVtcyBJbmMKLTE1ZjEgIFRpbWVzIE4gU3lzdGVtcyBJbmMKLTE1ZjIgIERpYWdub3N0aWMgSW5zdHJ1bWVudHMgSW5jCi0xNWYzICBEaWdpdG1lZGlhIENvcnAKLTE1ZjQgIFZhbHVlc29mdAotMTVmNSAgUG93ZXIgTWljcm8gUmVzZWFyY2gKLTE1ZjYgIEV4dHJlbWUgUGFja2V0IERldmljZSBJbmMKLTE1ZjcgIEJhbmN0ZWMKLTE1ZjggIEtvZ2EgRWxlY3Ryb25pY3MgQ28KLTE1ZjkgIFplbml0aCBFbGVjdHJvbmljcyBDb3JwCi0xNWZhICBKLlAuIEF4emFtIENvcnAKLTE1ZmIgIFppbG9nIEluYwotMTVmYyAgVGVjaHNhbiBFbGVjdHJvbmljcyBDbyBMdGQKLTE1ZmQgIE4tQ1VCRUQuTkVUCi0xNWZlICBLaW5wbyBFbGVjdHJvbmljcyBJbmMKLTE1ZmYgIEZhc3Rwb2ludCBUZWNobm9sb2dpZXMgSW5jCi0xNjAwICBOb3J0aHJvcCBHcnVtbWFuIC0gQ2FuYWRhIEx0ZAotMTYwMSAgVGVudGEgVGVjaG5vbG9neQotMTYwMiAgUHJvc3lzLXRlYyBJbmMKLTE2MDMgIE5va2lhIFdpcmVsZXNzIENvbW11bmljYXRpb25zCi0xNjA0ICBDZW50cmFsIFN5c3RlbSBSZXNlYXJjaCBDbyBMdGQKLTE2MDUgIFBhaXJnYWluIFRlY2hub2xvZ2llcwotMTYwNiAgRXVyb3BvcCBBRwotMTYwNyAgTGF2YSBTZW1pY29uZHVjdG9yIE1hbnVmYWN0dXJpbmcgSW5jCi0xNjA4ICBBdXRvbWF0ZWQgV2FnZXJpbmcgSW50ZXJuYXRpb25hbAotMTYwOSAgU2NpbWV0cmljIEluc3RydW1lbnRzIEluYwotMTYxMiAgVGVsZXN5bmVyZ3kgUmVzZWFyY2ggSW5jLgotMTYxOSAgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQKLQkwNDAwICBGYXJTeW5jIFQyUCAoMiBwb3J0IFguMjEvVi4zNS9WLjI0KQotCTA0NDAgIEZhclN5bmMgVDRQICg0IHBvcnQgWC4yMS9WLjM1L1YuMjQpCi0jIHd3dy5yaW93b3Jrcy5jb20KLTE2MWYgIFJpb3dvcmtzCi0xNjI2ICBUREsgU2VtaWNvbmR1Y3RvciBDb3JwLgotCTg0MTAgIFJUTDgxeHggRmFzdCBFdGhlcm5ldAotMTYyOSAgS29uZ3NiZXJnIFNwYWNldGVjIEFTCi0JMTAwMyAgRm9ybWF0IHN5bmNocm9uaXplciB2My4wCi0JMjAwMiAgRmFzdCBVbml2ZXJzYWwgRGF0YSBPdXRwdXQKLSMgVGhpcyBzZWVtcyB0byBvY2N1ciBvbiB0aGVpciA4MDIuMTFiIFdpcmVsZXNzIGNhcmQgV01QLTExCi0xNjM3ICBMaW5rc3lzCi0JMzg3NCAgTGlua3N5cyA4MDIuMTFiIFdNUDExIFBDSSBXaXJlbGVzcyBjYXJkCi0xNjM4ICBTdGFuZGFyZCBNaWNyb3N5c3RlbXMgQ29ycCBbU01DXQotCTExMDAgIFNNQzI2MDJXIEVaQ29ubmVjdCAvIEFkZHRyb24gQVdBLTEwMCAvIEV1bWl0Y29tIFBDSSBXTDExMDAwCi0xNjNjICBTbWFydCBMaW5rIEx0ZC4KLQkzMDUyICBTbWFydExpbmsgU21hcnRQQ0k1NjIgNTZLIE1vZGVtCi0JNTQ0OSAgU21hcnRQQ0k1NjEgTW9kZW0KLTE2NTcgIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgotMTY1YSAgRXBpeCBJbmMKLQljMTAwICBQSVhDSShSKSBDTDEgQ2FtZXJhIExpbmsgVmlkZW8gQ2FwdHVyZSBCb2FyZCBbY3VzdG9tIFFMNTIzMl0KLQlkMjAwICBQSVhDSShSKSBEMlggRGlnaXRhbCBWaWRlbyBDYXB0dXJlIEJvYXJkIFtjdXN0b20gUUw1MjMyXQotCWQzMDAgIFBJWENJKFIpIEQzWCBEaWdpdGFsIFZpZGVvIENhcHR1cmUgQm9hcmQgW2N1c3RvbSBRTDUyMzJdCi0xNjVkICBIc2luZyBUZWNoLiBFbnRlcnByaXNlIENvLiwgTHRkLgotMTY2MSAgV29ybGRzcGFjZSBDb3JwLgotMTY2OCAgQWN0aW9udGVjIEVsZWN0cm9uaWNzIEluYwotCTAxMDAgIE1pbmktUENJIGJyaWRnZQotIyBGb3JtZXJseSBTaUJ5dGUsIEluYy4KLTE2NmQgIEJyb2FkY29tIENvcnBvcmF0aW9uCi0JMDAwMSAgU2lCeXRlIEJDTTExMjUvMTEyNUgvMTI1MCBTeXN0ZW0tb24tYS1DaGlwIFBDSQotCTAwMDIgIFNpQnl0ZSBCQ00xMTI1SC8xMjUwIFN5c3RlbS1vbi1hLUNoaXAgSHlwZXJUcmFuc3BvcnQKLTE2NzcgIEJlcm5lY2tlciArIFJhaW5lcgotCTEwNGUgIDVMUzE3Mi42IEImUiBEdWFsIENBTiBJbnRlcmZhY2UgQ2FyZAotCTEyZDcgIDVMUzE3Mi42MSBCJlIgRHVhbCBDQU4gSW50ZXJmYWNlIENhcmQKLTE2N2IgIFp5REFTIFRlY2hub2xvZ3kgQ29ycC4KLQkyMTAyICBaeURBUyBaRDEyMDIKLQkJMTg3ZSAzNDA2ICBaeUFJUiBCLTEyMiBDYXJkQnVzIDExTWJzIFdpcmVsZXNzIExBTiBDYXJkCi0xNjgxICBIZXJjdWxlcwotIyBNb3JlIHNwZWNzLCBtb3JlIGFjY3VyYXRlIGRlc2MuCi0JMDAxMCAgSGVyY3VsZXMgM2QgUHJvcGhldCBJSSBVbHRyYSA2NE1CIFsgMzUwIE1IeiBOVjE1QlIgY29yZSwgMTI4LWJpdCBERFIgQCA0NjAgTUh6LCAxLjV2IEFHUDR4ICBdCi0xNjgyICBYRlggUGluZSBHcm91cCBJbmMuCi0xNjg4ICBDYXN0bGVOZXQgVGVjaG5vbG9neSBJbmMuCi0JMTE3MCAgV0xBTiA4MDIuMTFiIGNhcmQKLTE2OGMgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIEluYy4KLQkwMDA3ICBBUjUwMDAgODAyLjExYSBXaXJlbGVzcyBBZGFwdGVyCi0JMDAxMSAgQVI1MjEwIDgwMi4xMWEgTklDCi0JMDAxMiAgQVI1MjExIDgwMi4xMWFiIE5JQwotCTAwMTMgIEFSNTIxMiA4MDIuMTFhYmcgTklDCi0JCTExMTMgZDMwMSAgUGhpbGlwcyBDUFdOQTEwMCBXaXJlbGVzcyBDYXJkQnVzIGFkYXB0ZXIKLQkJMTE4NiAzMjAyICBELWxpbmsgRFdMLUc2NTAgQjMgV2lyZWxlc3MgY2FyZGJ1cyBhZGFwdGVyCi0JCTExODYgMzIwMyAgRFdMLUc1MjAgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkJMTE4NiAzYTEzICBEV0wtRzUyMCBXaXJlbGVzcyBQQ0kgQWRhcHRlciByZXYuIEIKLQkJMTE4NiAzYTk0ICBDNTRDIFdpcmVsZXNzIDgwMS4xMWcgY2FyZGJ1cwotCQkxMzg1IDRkMDAgIE5ldGdlYXIgV0czMTFUIFdpcmVsZXNzIFBDSSBBZGFwdGVyCi0JCTE0YjcgMGE2MCAgODQ4Mi1XRCBPUmlOT0NPIDExYS9iL2cgV2lyZWxlc3MgUENJIEFkYXB0ZXIKLQkJMTY4YyAwMDEzICBXRzUxMVQgV2lyZWxlc3MgQ2FyZEJ1cyBBZGFwdGVyCi0JCTE2OGMgMTAyNSAgRFdMLUc2NTBCMiBXaXJlbGVzcyBDYXJkQnVzIEFkYXB0ZXIKLQkJMTY4YyAxMDI3ICBOZXRnYXRlIE5MLTMwNTRDQiBBUklFUyBiL2cgQ2FyZEJ1cyBBZGFwdGVyCi0JCTE2OGMgMjAyNiAgTmV0Z2F0ZSA1MzU0TVAgQVJJRVMgYSgxMDhNYiB0dXJibykvYi9nIE1pbmlQQ0kgQWRhcHRlcgotCQkxNjhjIDIwNDEgIE5ldGdhdGUgNTM1NE1QIFBsdXMgQVJJRVMyIGIvZyBNaW5pUENJIEFkYXB0ZXIKLQkJMTY4YyAyMDQyICBOZXRnYXRlIDUzNTRNUCBQbHVzIEFSSUVTMiBhL2IvZyBNaW5pUENJIEFkYXB0ZXIKLQkxMDE0ICBBUjUyMTIgODAyLjExYWJnIE5JQwotMTY5YyAgTmV0Y2VsbCBDb3Jwb3JhdGlvbgotCTAwNDQgIFN5bmNSQUlEIFNSMzAwMC81MDAwIFNlcmllcyBTQVRBIFJBSUQgQ29udHJvbGxlcnMKLTE2YTUgIFRla3JhbSBUZWNobm9sb2d5IENvLixMdGQuCi0xNmFiICBHbG9iYWwgU3VuIFRlY2hub2xvZ3kgSW5jCi0JMTEwMCAgR0wyNDExMFAKLQkxMTAxICBQTFg5MDUyIFBDTUNJQS10by1QQ0kgV2lyZWxlc3MgTEFOCi0JMTEwMiAgUENNQ0lBLXRvLVBDSSBXaXJlbGVzcyBOZXR3b3JrIEJyaWRnZQotCTg1MDEgIFdMLTgzMDUgV2lyZWxlc3MgTEFOIFBDSSBBZGFwdGVyCi0xNmFlICBTYWZlbmV0IEluYwotCTExNDEgIFNhZmVYY2VsLTExNDEKLTE2YjQgIEFzcGV4IFNlbWljb25kdWN0b3IgTHRkCi0xNmJlICBDcmVhdGl4IFBvbHltZWRpYSBHbWJICi0xNmNhICBDRU5BVEVLIEluYwotCTAwMDEgIFJvY2tldCBEcml2ZSBETAotMTZjZCAgRGVuc2l0cm9uIFRlY2hub2xvZ2llcwotMTZjZSAgUm9sYW5kIENvcnAuCi0jIHd3dy5waWthdGVjaG5vbG9naWVzLmNvbQotMTZkZiAgUElLQSBUZWNobm9sb2dpZXMgSW5jLgotMTZlMyAgRXVyb3BlYW4gU3BhY2UgQWdlbmN5Ci0JMWUwZiAgTEVPTjJGVCBQcm9jZXNzb3IKLTE2ZWMgIFUuUy4gUm9ib3RpY3MKLQkwMGZmICBVU1I5OTc5MDAgMTAvMTAwIE1icHMgUENJIE5ldHdvcmsgQ2FyZAotCTAxMTYgIFVTUjk5NzkwMiAxMC8xMDAvMTAwMCBNYnBzIFBDSSBOZXR3b3JrIENhcmQKLQkzNjg1ICBXaXJlbGVzcyBBY2Nlc3MgUENJIEFkYXB0ZXIgTW9kZWwgMDIyNDE1Ci0xNmVkICBTeWNyb24gTi4gVi4KLQkxMDAxICBVTUlPIGNvbW11bmljYXRpb24gY2FyZAotMTZmMyAgSmV0d2F5IEluZm9ybWF0aW9uIENvLiwgTHRkLgotMTZmNCAgVndlYiBDb3JwCi0JODAwMCAgVlcyMDEwCi0xNmY2ICBWaWRlb1RlbGUuY29tLCBJbmMuCi0jIHd3dy5pbnRlcm5ldG1hY2hpbmVzLmNvbQotMTcwMiAgSW50ZXJuZXQgTWFjaGluZXMgQ29ycG9yYXRpb24gKElNQykKLTE3MDUgIERpZ2l0YWwgRmlyc3QsIEluYy4KLTE3MGIgIE5ldE9jdGF2ZQotCTAxMDAgIE5TUDIwMDAtU1NMIGNyeXB0byBhY2NlbGVyYXRvcgotMTcwYyAgWW90dGFZb3R0YSBJbmMuCi0jIFNlZW1zIHRvIGJlIGEgMm5kIElEIGZvciBWaXRlc3NlIFNlbWljb25kdWN0b3IKLTE3MjUgIFZpdGVzc2UgU2VtaWNvbmR1Y3RvcgotCTcxNzQgIFZTQzcxNzQgUENJL1BDSS1YIFNlcmlhbCBBVEEgSG9zdCBCdXMgQ29udHJvbGxlcgotMTcyYSAgQWNjZWxlcmF0ZWQgRW5jcnlwdGlvbgotMTczNCAgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVyIEdtYkgKLTE3MzcgIExpbmtzeXMKLQkwMDEzICBXTVA1NEcgV2lyZWxlc3MgUGNpIENhcmQKLQkwMDE1ICBXTVA1NEdTIFdpcmVsZXNzIFBjaSBDYXJkCi0JMTAzMiAgR2lnYWJpdCBOZXR3b3JrIEFkYXB0ZXIKLQkJMTczNyAwMDE1ICBFRzEwMzIgdjIgSW5zdGFudCBHaWdhYml0IE5ldHdvcmsgQWRhcHRlcgotCTEwNjQgIEdpZ2FiaXQgTmV0d29yayBBZGFwdGVyCi0JCTE3MzcgMDAxNiAgRUcxMDY0IHYyIEluc3RhbnQgR2lnYWJpdCBOZXR3b3JrIEFkYXB0ZXIKLQlhYjA4ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLQlhYjA5ICAyMXg0eCBERUMtVHVsaXAgY29tcGF0aWJsZSAxMC8xMDAgRXRoZXJuZXQKLTE3M2IgIEFsdGltYSAobmVlIEJyb2FkY29tKQotCTAzZTggIEFDMTAwMCBHaWdhYml0IEV0aGVybmV0Ci0JMDNlOSAgQUMxMDAxIEdpZ2FiaXQgRXRoZXJuZXQKLQkwM2VhICBBQzkxMDAgR2lnYWJpdCBFdGhlcm5ldAotCQkxNzNiIDAwMDEgIEFDMTAwMgotCTAzZWIgIEFDMTAwMyBHaWdhYml0IEV0aGVybmV0Ci0xNzQzICBQZXBwZXJjb24gQUcKLQk4MTM5ICBST0wvRi0xMDAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIHdpdGggUk9MCi0xNzQ5ICBSTFggVGVjaG5vbG9naWVzCi0xNzRiICBQQyBQYXJ0bmVyIExpbWl0ZWQKLTE3NGQgIFdlbGxYIFRlbGVjb20gU0EKLTE3NWMgIEF1ZGlvU2NpZW5jZSBJbmMKLTE3NWUgIFNhbmVyYSBTeXN0ZW1zLCBJbmMuCi0xNzg3ICBIaWdodGVjaCBJbmZvcm1hdGlvbiBTeXN0ZW0gTHRkLgotIyBhbHNvIHVzZWQgYnkgU3RydWNrIElubm92YXRpdmUgU3lzdGVtZSBmb3Igam9pbnQgZGV2ZWxvcG1lbnRzCi0xNzk2ICBSZXNlYXJjaCBDZW50cmUgSnVlbGljaAotCTAwMDEgIFNJUzExMDAgW0dpZ2FiaXQgbGlua10KLQkwMDAyICBIT1RsaW5rCi0JMDAwMyAgQ291bnRlciBUaW1lcgotCTAwMDQgIENBTUFDIENvbnRyb2xsZXIKLQkwMDA1ICBQUk9GSUJVUwotCTAwMDYgIEFNQ0MgSE9UbGluawotMTc5NyAgSnVtcFRlYyBoLCBHTUJICi0xNzk5ICBCZWxraW4KLQk2MDAxICBXaXJlbGVzcyBQQ0kgQ2FyZCAtIEY1RDYwMDEKLQk2MDIwICBXaXJlbGVzcyBQQ01DSUEgQ2FyZCAtIEY1RDYwMjAKLQk2MDYwICBXaXJlbGVzcyBQREEgQ2FyZCAtIEY1RDYwNjAKLQk3MDAwICBXaXJlbGVzcyBQQ0kgQ2FyZCAtIEY1RDcwMDAKLTE3YTAgIEdlbmVzeXMgTG9naWMsIEluYwotCTgwMzMgIEdMODgwUyBVU0IgMS4xIGNvbnRyb2xsZXIKLQk4MDM0ICBHTDg4MFMgVVNCIDIuMCBjb250cm9sbGVyCi0xN2FmICBIaWdodGVjaCBJbmZvcm1hdGlvbiBTeXN0ZW0gTHRkLgotMTdiMyAgSGF3a2luZyBUZWNobm9sb2dpZXMKLQlhYjA4ICBQTjY3MlRYIDEwLzEwMCBFdGhlcm5ldAotMTdiNCAgSW5kcmEgTmV0d29ya3MsIEluYy4KLQkwMDExICBXZWJFbmhhbmNlIDEwMCBHWklQIENvbXByZXNzaW9uIENhcmQKLTE3YzAgIFdpc3Ryb24gQ29ycC4KLTE3YzIgIE5ld2lzeXMsIEluYy4KLTE3Y2MgIE5ldENoaXAgVGVjaG5vbG9neSwgSW5jCi0JMjI4MCAgVVNCIDIuMAotMTdkMyAgQXJlY2EgVGVjaG5vbG9neSBDb3JwLgotCTExMTAgIEFSQy0xMTEwIDQtUG9ydCBQQ0ktWCB0byBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTExMjAgIEFSQy0xMTIwIDgtUG9ydCBQQ0ktWCB0byBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTExMzAgIEFSQy0xMTMwIDEyLVBvcnQgUENJLVggdG8gU0FUQSBSQUlEIENvbnRyb2xsZXIKLQkxMTYwICBBUkMtMTE2MCAxNi1Qb3J0IFBDSS1YIHRvIFNBVEEgUkFJRCBDb250cm9sbGVyCi0JMTIxMCAgQVJDLTEyMTAgNC1Qb3J0IFBDSS1FeHByZXNzIHRvIFNBVEEgUkFJRCBDb250cm9sbGVyCi0JMTIyMCAgQVJDLTEyMjAgOC1Qb3J0IFBDSS1FeHByZXNzIHRvIFNBVEEgUkFJRCBDb250cm9sbGVyCi0JMTIzMCAgQVJDLTEyMzAgMTItUG9ydCBQQ0ktRXhwcmVzcyB0byBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTEyNjAgIEFSQy0xMjYwIDE2LVBvcnQgUENJLUV4cHJlc3MgdG8gU0FUQSBSQUlEIENvbnRyb2xsZXIKLSMgUzJpbyBzaGlwcyAxMEdiIFBDSS1YIEV0aGVybmV0IGFkYXB0ZXJzIHd3dy5zMmlvLmNvbQotMTdkNSAgUzJpbyBJbmMuCi0JNTgzMSAgWGZyYW1lIDEwIEdpZ2FiaXQgRXRoZXJuZXQgUENJLVgKLQkJMTAzYyAxMmQ1ICBIUCBQQ0ktWCAxMzNNSHogMTBHYkUgU1IgRmliZXIgW0FCMjg3QV0KLTE3ZGUgIEtXb3JsZCBDb21wdXRlciBDby4gTHRkLgotIyBodHRwOi8vd3d3LmNvbm5lY3QzZC5jb20KLTE3ZWUgIENvbm5lY3QgQ29tcG9uZW50cyBMdGQKLTE3ZmUgIExpbmtzeXMsIEEgRGl2aXNpb24gb2YgQ2lzY28gU3lzdGVtcwotCTIxMjAgIFdNUDExdjQgODAyLjExYiBQQ0kgY2FyZAotCTIyMjAgIFtBaXJDb25uXSBJTlBST0NPTU0gSVBOIDIyMjAgV2lyZWxlc3MgTEFOIEFkYXB0ZXIgKHJldiAwMSkKLTE4MTMgIEFtYmllbnQgVGVjaG5vbG9naWVzIEluYwotCTQwMDAgIEhhTSBjb250cm9sbGVybGVzcyBtb2RlbQotCQkxNmJlIDAwMDEgIFY5eCBIQU0gRGF0YSBGYXggTW9kZW0KLQk0MTAwICBIYU0gcGx1cyBEYXRhIEZheCBNb2RlbQotCQkxNmJlIDAwMDIgIFY5eCBIQU0gMTM5NAotMTgxNCAgUmFMaW5rCi0JMDEwMSAgV2lyZWxlc3MgUENJIEFkcGF0b3IgUlQyNDAwIC8gUlQyNDYwCi0JCTMzMDYgMTExMyAgUXVpZHdheSBXTDEwME0KLQkwMjAxICBSYWxpbmsgUlQyNTAwIDgwMi4xMSBDYXJkYnVzIFJlZmVyZW5jZSBDYXJkCi0JCTEzNzEgMDAxZSAgQ1dDLTg1NCBXaXJlbGVzcy1HIENhcmRCdXMgQWRhcHRlcgotCQkxMzcxIDAwMWYgIENXTS04NTQgV2lyZWxlc3MtRyBNaW5pIFBDSSBBZGFwdGVyCi0JCTEzNzEgMDAyMCAgQ1dQLTg1NCBXaXJlbGVzcy1HIFBDSSBBZGFwdGVyCi0JCTE0NTggZTM4MSAgR04tV01LRyA4MDIuMTFiL2cgV2lyZWxlc3MgQ2FyZEJ1cyBBZGFwdGVyCi0xODIwICBJbmZpbmlDb24gU3lzdGVtcyBJbmMuCi0xODIyICBUd2luaGFuIFRlY2hub2xvZ3kgQ28uIEx0ZAotMTgyZCAgU2l0ZUNvbSBFdXJvcGUgQlYKLSMgSEZDLWJhc2VkIElTRE4gY2FyZAotCTMwNjkgIElTRE4gUENJIERDLTEwNVYyCi0JOTc5MCAgV0wtMTIxIFdpcmVsZXNzIE5ldHdvcmsgQWRhcHRlciAxMDBnKyBbVmVyLjNdCi0xODMwICBDcmVkZW5jZSBTeXN0ZW1zIENvcnBvcmF0aW9uCi0xODNiICBNaWtyb00gR21iSAotCTA4YTcgIE1WQzEwMCBEVkkKLQkwOGE4ICBNVkMxMDEgU0RJCi0JMDhhOSAgTVZDMTAyIERWSStBdWRpbwotMTg0OSAgQVNSb2NrIEluY29ycG9yYXRpb24KLTE4NTEgIE1pY3JvdHVuZSwgSW5jLgotMTg1MiAgQW5yaXRzdSBDb3JwLgotMTg1ZiAgV2lzdHJvbiBOZVdlYiBDb3JwLgotMTg2NyAgVG9wc3BpbiBDb21tdW5pY2F0aW9ucwotCTVhNDQgIE1UMjMxMDggUENJLVggSENBCi0JNWE0NSAgTVQyMzEwOCBQQ0ktWCBIQ0EgZmxhc2ggcmVjb3ZlcnkKLQk1YTQ2ICBNVDIzMTA4IFBDSS1YIEhDQSBicmlkZ2UKLQk2Mjc4ICBNVDI1MjA4IEluZmluaUhvc3QgSUlJIEV4IChUYXZvciBjb21wYXRpYmlsaXR5IG1vZGUpCi0JNjI4MiAgTVQyNTIwOCBJbmZpbmlIb3N0IElJSSBFeAotMTg3ZSAgWnlYRUwgQ29tbXVuaWNhdGlvbiBDb3Jwb3JhdGlvbgotMTg4OCAgVmFyaXN5cyBMdGQKLQkwMzAxICBWTUZYMSBGUEdBIFBNQyBtb2R1bGUKLQkwNjAxICBWU00yIGR1YWwgUE1DIGNhcnJpZXIKLQkwNzEwICBWUzE0eCBzZXJpZXMgUG93ZXJQQyBQQ0kgYm9hcmQKLQkwNzIwICBWUzI0eCBzZXJpZXMgUG93ZXJQQyBQQ0kgYm9hcmQKLSMgZm91bmQgZS5nLiBvbiBLTkMgRFZCLVMgY2FyZAotMTg5NCAgS05DIE9uZQotMTg5NiAgQiZCIEVsZWN0cm9uaWNzIE1hbnVmYWN0dXJpbmcgQ29tcGFueSwgSW5jLgotMThhMSAgQXN0dXRlIE5ldHdvcmtzIEluYy4KLTE4YWMgIERWaUNPIENvcnBvcmF0aW9uCi0JZDgxMCAgRnVzaW9uSERUViAzIEdvbGQKLTE4YjggIEFtbWFzc28KLQliMDAxICBBTVNPIDExMDAgaVdBUlAvUkRNQSBHaWdhYml0IEV0aGVybmV0IENvcHJvY2Vzc29yCi0xOGJjICBJbmZvLVRlayBDb3JwLgotIyBhc3NpZ25lZCB0byBPY3RpZ2FiYXkgU3lzdGVtLCB3aGljaCBoYXMgYmVlbiBhY3F1aXJlZCBieSBDcmF5Ci0xOGM4ICBDcmF5IEluYwotMThjOSAgQVJWT08gRW5naW5lZXJpbmcgQlYKLTE4Y2EgIFhHSSAtIFhhYnJlIEdyYXBoaWNzIEluYwotCTAwNDAgIFZvbGFyaSBWOAotMThlNiAgTVBMIEFHCi0JMDAwMSAgT1NDSSBbT2N0YWwgU2VyaWFsIENvbW11bmljYXRpb24gSW50ZXJmYWNlXQotMThmNyAgQ29tbXRlY2gsIEluYy4KLQkwMDAxICBGYXN0Y29tIEVTQ0MtUENJLTMzNQotCTAwMDIgIEZhc3Rjb20gNDIyLzQtUENJLTMzNQotCTAwMDQgIEZhc3Rjb20gNDIyLzItUENJLTMzNQotCTAwMDUgIEZhc3Rjb20gSUdFU0NDLVBDSS1JU08vMQotCTAwMGEgIEZhc3Rjb20gMjMyLzQtUENJLTMzNQotMThmYiAgUmVzaWxpZW5jZSBDb3Jwb3JhdGlvbgotMTkyNCAgTGV2ZWwgNSBOZXR3b3JrcyBJbmMuCi0xOTY2ICBPcmFkIEhpLVRlYyBTeXN0ZW1zCi0JMTk3NSAgRFZHNjQgZmFtaWx5Ci0xOTkzICBJbm5vbWluYXRlIFNlY3VyaXR5IFRlY2hub2xvZ2llcyBBRwotIyBodHRwOi8vd3d3LnByb2dlbnkubmV0Ci0xOWFlICBQcm9nZW55IFN5c3RlbXMgQ29ycG9yYXRpb24KLTFhMDggIFNpZXJyYSBzZW1pY29uZHVjdG9yCi0JMDAwMCAgU0MxNTA2NAotMWIxMyAgSmF0b24gQ29ycAotMWMxYyAgU3ltcGhvbnkKLQkwMDAxICA4MkMxMDEKLTFkNDQgIERQVAotCWE0MDAgIFBNMngyNC9QTTMyMjQKLTFkZTEgIFRla3JhbSBUZWNobm9sb2d5IENvLixMdGQuCi0JMDM5MSAgVFJNLVMxMDQwCi0JMjAyMCAgREMtMzkwCi0JNjkwYyAgNjkwYwotCWRjMjkgIERDMjkwCi0xZmMwICBUdW1zYW4gT3kKLQkwMzAwICBFMjIwMCBEdWFsIEUxL1Jhd3BpcGUgQ2FyZAotMjAwMCAgU21hcnQgTGluayBMdGQuCi0yMDAxICBUZW1wb3JhbCBSZXNlYXJjaCBMdGQKLTIwMDMgIFNtYXJ0IExpbmsgTHRkLgotMjAwNCAgU21hcnQgTGluayBMdGQuCi0yMWMzICAyMXN0IENlbnR1cnkgQ29tcHV0ZXIgQ29ycC4KLTIzNDggIFJhY29yZQotCTIwMTAgIDgxNDIgMTAwVkcvQW55TEFOCi0yNjQ2ICBLaW5nc3RvbiBUZWNobm9sb2dpZXMKLTI3MGIgIFhhbnRlbCBDb3Jwb3JhdGlvbgotMjcwZiAgQ2hhaW50ZWNoIENvbXB1dGVyIENvLiBMdGQKLTI3MTEgIEFWSUQgVGVjaG5vbG9neSBJbmMuCi0yYTE1ICAzRCBWaXNpb24oPz8/KQotMzAwMCAgSGFuc29sIEVsZWN0cm9uaWNzIEluYy4KLTMxNDIgIFBvc3QgSW1wcmVzc2lvbiBTeXN0ZW1zLgotMzM4OCAgSGludCBDb3JwCi0JMDAxMyAgSGlOVCBIQzQgUENJIHRvIElTRE4gYnJpZGdlLCBNdWx0aW1lZGlhIGF1ZGlvIGNvbnRyb2xsZXIKLQkwMDE0ICBIaU5UIEhDNCBQQ0kgdG8gSVNETiBicmlkZ2UsIE5ldHdvcmsgY29udHJvbGxlcgotCTAwMjAgIEhCNiBVbml2ZXJzYWwgUENJLVBDSSBicmlkZ2UgKHRyYW5zcGFyZW50IG1vZGUpCi0JMDAyMSAgSEI2IFVuaXZlcnNhbCBQQ0ktUENJIGJyaWRnZSAobm9uLXRyYW5zcGFyZW50IG1vZGUpCi0JCTRjNTMgMTA1MCAgQ1Q3IG1haW5ib2FyZAotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkJNGM1MyAxMGEwICBDQTMvQ1IzIG1haW5ib2FyZAotCQk0YzUzIDMwMTAgIFBQQ0kgbWV6emFuaW5lICgzMi1iaXQgUE1DKQotCQk0YzUzIDMwMTEgIFBQQ0kgbWV6emFuaW5lICg2NC1iaXQgUE1DKQotCTAwMjIgIEhpTlQgSEI0IFBDSS1QQ0kgQnJpZGdlIChQQ0k2MTUwKQotCTAwMjYgIEhCMiBQQ0ktUENJIEJyaWRnZQotCTEwMWEgIEUuQmFuZCBbQXVkaW9UcmFrIEluY2E4OF0KLQkxMDFiICBFLkJhbmQgW0F1ZGlvVHJhayBJbmNhODhdCi0JODAxMSAgVlhQcm8gSUkgQ2hpcHNldAotCQkzMzg4IDgwMTEgIFZYUHJvIElJIENoaXBzZXQgQ1BVIHRvIFBDSSBCcmlkZ2UKLQk4MDEyICBWWFBybyBJSSBDaGlwc2V0Ci0JCTMzODggODAxMiAgVlhQcm8gSUkgQ2hpcHNldCBQQ0kgdG8gSVNBIEJyaWRnZQotCTgwMTMgIFZYUHJvIElJIElERQotCQkzMzg4IDgwMTMgIFZYUHJvIElJIENoaXBzZXQgRUlERSBDb250cm9sbGVyCi0zNDExICBRdWFudHVtIERlc2lnbnMgKEguSy4pIEluYwotMzUxMyAgQVJDT00gQ29udHJvbCBTeXN0ZW1zIEx0ZAotMzg0MiAgZVZnYS5jb20uIENvcnAuCi0zOGVmICA0TGlua3MKLTNkM2QgIDNETGFicwotCTAwMDEgIEdMSU5UIDMwMFNYCi0JMDAwMiAgR0xJTlQgNTAwVFgKLQkwMDAzICBHTElOVCBEZWx0YQotCTAwMDQgIFBlcm1lZGlhCi0JMDAwNSAgUGVybWVkaWEKLQkwMDA2ICBHTElOVCBNWAotCTAwMDcgIDNEIEV4dHJlbWUKLQkwMDA4ICBHTElOVCBHYW1tYSBHMQotCTAwMDkgIFBlcm1lZGlhIElJIDJEKzNECi0JCTEwNDAgMDAxMSAgQWNjZWxTdGFyIElJCi0JCTEzZTkgMTAwMCAgNjIyMUwtNFUKLQkJM2QzZCAwMTAwICBBY2NlbFN0YXIgSUkgM0QgQWNjZWxlcmF0b3IKLQkJM2QzZCAwMTExICBQZXJtZWRpYSAzOjE2Ci0JCTNkM2QgMDExNCAgU2FudGEgQW5hCi0JCTNkM2QgMDExNiAgT3h5Z2VuIEdWWDEKLQkJM2QzZCAwMTE5ICBTY2lyb2NjbwotCQkzZDNkIDAxMjAgIFNhbnRhIEFuYSBQQ0wKLQkJM2QzZCAwMTI1ICBPeHlnZW4gVlgxCi0JCTNkM2QgMDEyNyAgUGVybWVkaWEzIENyZWF0ZSEKLQkwMDBhICBHTElOVCBSMwotCQkzZDNkIDAxMjEgIE94eWdlbiBWWDEKLQkwMDBjICBHTElOVCBSMyBbT3h5Z2VuIFZYMV0KLQkJM2QzZCAwMTQ0ICBPeHlnZW4gVlgxLTRYIEFHUCBbUGVybWVkaWEgNF0KLQkwMDBkICBHTGludCBSNCByZXYgQQotCTAwMTEgIEdMaW50IFI0IHJldiBCCi0JMDAxMiAgR0xpbnQgUjUgcmV2IEEKLQkwMDEzICBHTGludCBSNSByZXYgQgotCTAwMjAgIFZQMTAgdmlzdWFsIHByb2Nlc3NvcgotIyBQMTAgZ2VuZXJpYyBJSQotCTAwMjIgIFZQMTAgdmlzdWFsIHByb2Nlc3NvcgotCTAwMjQgIFZQOSB2aXN1YWwgcHJvY2Vzc29yCi0JMDEwMCAgUGVybWVkaWEgSUkgMkQrM0QKLQkwN2ExICBXaWxkY2F0IElJSSA2MjEwCi0JMDdhMiAgU3VuIFhWUi01MDAgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQkwN2EzICBXaWxkY2F0IElWIDcyMTAKLQkxMDA0ICBQZXJtZWRpYQotCTNkMDQgIFBlcm1lZGlhCi0JZmZmZiAgR2xpbnQgVkdBCi00MDA1ICBBdmFuY2UgTG9naWMgSW5jLgotCTAzMDAgIEFMUzMwMCBQQ0kgQXVkaW8gRGV2aWNlCi0JMDMwOCAgQUxTMzAwKyBQQ0kgQXVkaW8gRGV2aWNlCi0JMDMwOSAgUENJIElucHV0IENvbnRyb2xsZXIKLQkxMDY0ICBBTEctMjA2NAotCTIwNjQgIEFMRy0yMDY0aQotCTIxMjggIEFMRy0yMzY0QSBHVUkgQWNjZWxlcmF0b3IKLQkyMzAxICBBTEctMjMwMQotCTIzMDIgIEFMRy0yMzAyCi0JMjMwMyAgQVZHLTIzMDIgR1VJIEFjY2VsZXJhdG9yCi0JMjM2NCAgQUxHLTIzNjRBCi0JMjQ2NCAgQUxHLTI0NjQKLQkyNTAxICBBTEctMjU2NEEvMjUxMjhBCi0JNDAwMCAgQUxTNDAwMCBBdWRpbyBDaGlwc2V0Ci0JCTQwMDUgNDAwMCAgQUxTNDAwMCBBdWRpbyBDaGlwc2V0Ci0JNDcxMCAgQUxDMjAwLzIwMFAKLTQwMzMgIEFkZHRyb24gVGVjaG5vbG9neSBDbywgSW5jLgotCTEzNjAgIFJUTDgxMzkgRXRoZXJuZXQKLTQxNDMgIERpZ2l0YWwgRXF1aXBtZW50IENvcnAKLTQxNDQgIEFscGhhIERhdGEKLQkwMDQ0ICBBRE0tWFJDSUlQcm8KLTQxNmMgIEFsYWRkaW4gS25vd2xlZGdlIFN5c3RlbXMKLQkwMTAwICBBbGFkZGluQ0FSRAotCTAyMDAgIENQQwotNDQ0NCAgSW50ZXJuZXh0IENvbXByZXNzaW9uIEluYwotCTAwMTYgIGlUVkMxNiAoQ1gyMzQxNikgTVBFRy0yIEVuY29kZXIKLQkJMDA3MCA0MDA5ICBXaW5UViBQVlIgMjUwCi0JCTAwNzAgODAwMyAgV2luVFYgUFZSIDE1MAotCTA4MDMgIGlUVkMxNSBNUEVHLTIgRW5jb2RlcgotCQkwMDcwIDQwMDAgIFdpblRWIFBWUi0zNTAKLQkJMDA3MCA0MDAxICBXaW5UViBQVlItMjUwCi0jIHZpZGVvIGNhcHR1cmUgY2FyZAotCQkxNDYxIGEzY2YgIE0xNzkKLTQ0NjggIEJyaWRnZXBvcnQgbWFjaGluZXMKLTQ1OTQgIENvZ2V0ZWMgSW5mb3JtYXRpcXVlIEluYwotNDVmYiAgQmFsZG9yIEVsZWN0cmljIENvbXBhbnkKLTQ2ODAgIFVtYXggQ29tcHV0ZXIgQ29ycAotNDg0MyAgSGVyY3VsZXMgQ29tcHV0ZXIgVGVjaG5vbG9neSBJbmMKLTQ5MTYgIFJlZENyZWVrIENvbW11bmljYXRpb25zIEluYwotCTE5NjAgIFJlZENyZWVrIFBDSSBhZGFwdGVyCi00OTQzICBHcm93dGggTmV0d29ya3MKLTQ5NGYgIEFDQ0VTIEkvTyBQcm9kdWN0cywgSW5jLgotCTEwZTggIExQQ0ktQ09NLThTTQotNDk3OCAgQXhpbCBDb21wdXRlciBJbmMKLTRhMTQgIE5ldFZpbgotCTUwMDAgIE5WNTAwMFNDCi0JCTRhMTQgNTAwMCAgUlQ4MDI5LUJhc2VkIEV0aGVybmV0IEFkYXB0ZXIKLTRiMTAgIEJ1c2xvZ2ljIEluYy4KLTRjNDggIExVTkcgSFdBIEVsZWN0cm9uaWNzCi00YzUzICBTQlMgVGVjaG5vbG9naWVzCi0JMDAwMCAgUExVU1RFU1QgZGV2aWNlCi0JCTRjNTMgMzAwMCAgUExVU1RFU1QgY2FyZCAoUEMxMDQrKQotCQk0YzUzIDMwMDEgIFBMVVNURVNUIGNhcmQgKFBNQykKLQkwMDAxICBQTFVTVEVTVC1NTSBkZXZpY2UKLQkJNGM1MyAzMDAyICBQTFVTVEVTVC1NTSBjYXJkIChQTUMpCi00Y2ExICBTZWFuaXggVGVjaG5vbG9neSBJbmMKLTRkNTEgIE1lZGlhUSBJbmMuCi0JMDIwMCAgTVEtMjAwCi00ZDU0ICBNaWNyb3RlY2huaWNhIENvIEx0ZAotNGRkYyAgSUxDIERhdGEgRGV2aWNlIENvcnAKLQkwMTAwICBERC00MjkyNEk1LTMwMCAoQVJJTkMgNDI5IERhdGEgQnVzKQotCTA4MDEgIEJVLTY1NTcwSTEgTUlMLVNURC0xNTUzIFRlc3QgYW5kIFNpbXVsYXRpb24KLQkwODAyICBCVS02NTU3MEkyIE1JTC1TVEQtMTU1MyBUZXN0IGFuZCBTaW11bGF0aW9uCi0JMDgxMSAgQlUtNjU1NzJJMSBNSUwtU1RELTE1NTMgVGVzdCBhbmQgU2ltdWxhdGlvbgotCTA4MTIgIEJVLTY1NTcySTIgTUlMLVNURC0xNTUzIFRlc3QgYW5kIFNpbXVsYXRpb24KLQkwODgxICBCVS02NTU3MFQxIE1JTC1TVEQtMTU1MyBUZXN0IGFuZCBTaW11bGF0aW9uCi0JMDg4MiAgQlUtNjU1NzBUMiBNSUwtU1RELTE1NTMgVGVzdCBhbmQgU2ltdWxhdGlvbgotCTA4OTEgIEJVLTY1NTcyVDEgTUlMLVNURC0xNTUzIFRlc3QgYW5kIFNpbXVsYXRpb24KLQkwODkyICBCVS02NTU3MlQyIE1JTC1TVEQtMTU1MyBUZXN0IGFuZCBTaW11bGF0aW9uCi0JMDkwMSAgQlUtNjU1NjVDMSBNSUwtU1RELTE1NTMgRGF0YSBCdXMKLQkwOTAyICBCVS02NTU2NUMyIE1JTC1TVEQtMTU1MyBEYXRhIEJ1cwotCTA5MDMgIEJVLTY1NTY1QzMgTUlMLVNURC0xNTUzIERhdGEgQnVzCi0JMDkwNCAgQlUtNjU1NjVDNCBNSUwtU1RELTE1NTMgRGF0YSBCdXMKLQkwYjAxICBCVS02NTU2OUkxIE1JTC1TVEQtMTU1MyBEYXRhIEJ1cwotCTBiMDIgIEJVLTY1NTY5STIgTUlMLVNURC0xNTUzIERhdGEgQnVzCi0JMGIwMyAgQlUtNjU1NjlJMyBNSUwtU1RELTE1NTMgRGF0YSBCdXMKLQkwYjA0ICBCVS02NTU2OUk0IE1JTC1TVEQtMTU1MyBEYXRhIEJ1cwotNTA0NiAgR2VtVGVrIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KLQkxMDAxICBQQ0kgUmFkaW8KLTUwNTMgIFZveWV0cmEgVGVjaG5vbG9naWVzCi0JMjAxMCAgRGF5dG9uYSBBdWRpbyBBZGFwdGVyCi01MTM2ICBTIFMgVGVjaG5vbG9naWVzCi01MTQzICBRdWFsY29tbSBJbmMKLTUxNDUgIEVuc29uaXEgKE9sZCkKLQkzMDMxICBDb25jZXJ0IEF1ZGlvUENJCi01MTY4ICBBbmltYXRpb24gVGVjaG5vbG9naWVzIEluYy4KLTUzMDEgIEFsbGlhbmNlIFNlbWljb25kdWN0b3IgQ29ycC4KLQkwMDAxICBQcm9Nb3Rpb24gYVQzRAotNTMzMyAgUzMgSW5jLgotCTA1NTEgIFBsYXRvL1BYIChzeXN0ZW0pCi0JNTYzMSAgODZjMzI1IFtWaVJHRV0KLQk4ODAwICA4NmM4NjYgW1Zpc2lvbiA4NjZdCi0JODgwMSAgODZjOTY0IFtWaXNpb24gOTY0XQotCTg4MTAgIDg2Yzc2NF8wIFtUcmlvIDMyIHZlcnMgMF0KLQk4ODExICA4NmM3NjQvNzY1IFtUcmlvMzIvNjQvNjRWK10KLQk4ODEyICA4NmNNNjUgW0F1cm9yYTY0VitdCi0JODgxMyAgODZjNzY0XzMgW1RyaW8gMzIvNjQgdmVycyAzXQotCTg4MTQgIDg2Yzc2NyBbVHJpbyA2NFVWK10KLQk4ODE1ICA4NmNNNjUgW0F1cm9yYSAxMjhdCi0JODgzZCAgODZjOTg4IFtWaVJHRS9WWF0KLQk4ODcwICBGaXJlR0wKLQk4ODgwICA4NmM4NjggW1Zpc2lvbiA4NjggVlJBTV0gdmVycyAwCi0JODg4MSAgODZjODY4IFtWaXNpb24gODY4IFZSQU1dIHZlcnMgMQotCTg4ODIgIDg2Yzg2OCBbVmlzaW9uIDg2OCBWUkFNXSB2ZXJzIDIKLQk4ODgzICA4NmM4NjggW1Zpc2lvbiA4NjggVlJBTV0gdmVycyAzCi0JODhiMCAgODZjOTI4IFtWaXNpb24gOTI4IFZSQU1dIHZlcnMgMAotCTg4YjEgIDg2YzkyOCBbVmlzaW9uIDkyOCBWUkFNXSB2ZXJzIDEKLQk4OGIyICA4NmM5MjggW1Zpc2lvbiA5MjggVlJBTV0gdmVycyAyCi0JODhiMyAgODZjOTI4IFtWaXNpb24gOTI4IFZSQU1dIHZlcnMgMwotCTg4YzAgIDg2Yzg2NCBbVmlzaW9uIDg2NCBEUkFNXSB2ZXJzIDAKLQk4OGMxICA4NmM4NjQgW1Zpc2lvbiA4NjQgRFJBTV0gdmVycyAxCi0JODhjMiAgODZjODY0IFtWaXNpb24gODY0LVAgRFJBTV0gdmVycyAyCi0JODhjMyAgODZjODY0IFtWaXNpb24gODY0LVAgRFJBTV0gdmVycyAzCi0JODhkMCAgODZjOTY0IFtWaXNpb24gOTY0IFZSQU1dIHZlcnMgMAotCTg4ZDEgIDg2Yzk2NCBbVmlzaW9uIDk2NCBWUkFNXSB2ZXJzIDEKLQk4OGQyICA4NmM5NjQgW1Zpc2lvbiA5NjQtUCBWUkFNXSB2ZXJzIDIKLQk4OGQzICA4NmM5NjQgW1Zpc2lvbiA5NjQtUCBWUkFNXSB2ZXJzIDMKLQk4OGYwICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDAKLQk4OGYxICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDEKLQk4OGYyICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDIKLQk4OGYzICA4NmM5NjggW1Zpc2lvbiA5NjggVlJBTV0gcmV2IDMKLQk4OTAwICA4NmM3NTUgW1RyaW8gNjRWMi9EWF0KLQkJNTMzMyA4OTAwICA4NkM3NzUgVHJpbzY0VjIvRFgKLQk4OTAxICA4NmM3NzUvODZjNzg1IFtUcmlvIDY0VjIvRFggb3IgL0dYXQotCQk1MzMzIDg5MDEgIDg2Qzc3NSBUcmlvNjRWMi9EWCwgODZDNzg1IFRyaW82NFYyL0dYCi0JODkwMiAgUGxhdG8vUFgKLQk4OTAzICBUcmlvIDNEIGJ1c2luZXNzIG11bHRpbWVkaWEKLQk4OTA0ICBUcmlvIDY0IDNECi0JCTEwMTQgMDBkYiAgSW50ZWdyYXRlZCBUcmlvM0QKLQkJNTMzMyA4OTA0ICA4NkMzNjUgVHJpbzNEIEFHUAotCTg5MDUgIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTA2ICBUcmlvIDY0VisgZmFtaWx5Ci0JODkwNyAgVHJpbyA2NFYrIGZhbWlseQotCTg5MDggIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTA5ICBUcmlvIDY0VisgZmFtaWx5Ci0JODkwYSAgVHJpbyA2NFYrIGZhbWlseQotCTg5MGIgIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTBjICBUcmlvIDY0VisgZmFtaWx5Ci0JODkwZCAgVHJpbyA2NFYrIGZhbWlseQotCTg5MGUgIFRyaW8gNjRWKyBmYW1pbHkKLQk4OTBmICBUcmlvIDY0VisgZmFtaWx5Ci0JOGEwMSAgVmlSR0UvRFggb3IgL0dYCi0JCTBlMTEgYjAzMiAgVmlSR0UvR1gKLQkJMTBiNCAxNjE3ICBOaXRybyAzRAotCQkxMGI0IDE3MTcgIE5pdHJvIDNECi0JCTUzMzMgOGEwMSAgVmlSR0UvRFgKLQk4YTEwICBWaVJHRS9HWDIKLQkJMTA5MiA4YTEwICBTdGVhbHRoIDNEIDQwMDAKLQk4YTEzICA4NmMzNjggW1RyaW8gM0QvMlhdCi0JCTUzMzMgOGExMyAgVHJpbzNELzJYCi0JOGEyMCAgODZjNzk0IFtTYXZhZ2UgM0RdCi0JCTUzMzMgOGEyMCAgODZDMzkxIFNhdmFnZTNECi0JOGEyMSAgODZjMzkwIFtTYXZhZ2UgM0QvTVZdCi0JCTUzMzMgOGEyMSAgODZDMzkwIFNhdmFnZTNEL01WCi0JOGEyMiAgU2F2YWdlIDQKLQkJMTAzMyA4MDY4ICBTYXZhZ2UgNAotCQkxMDMzIDgwNjkgIFNhdmFnZSA0Ci0JCTEwMzMgODExMCAgU2F2YWdlNCBMVAotCQkxMDVkIDAwMTggIFNSOSA4TWIgU0RSQU0KLQkJMTA1ZCAwMDJhICBTUjkgUHJvIDE2TWIgU0RSQU0KLQkJMTA1ZCAwMDNhICBTUjkgUHJvIDMyTWIgU0RSQU0KLQkJMTA1ZCAwOTJmICBTUjkgUHJvKyAxNk1iIFNHUkFNCi0JCTEwOTIgNDIwNyAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDQ4MDAgIFN0ZWFsdGggSUlJIFM1NDAKLQkJMTA5MiA0ODA3ICBTcGVlZFN0YXIgQTkwCi0JCTEwOTIgNDgwOCAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDQ4MDkgIFN0ZWFsdGggSUlJIFM1NDAKLQkJMTA5MiA0ODBlICBTdGVhbHRoIElJSSBTNTQwCi0JCTEwOTIgNDkwNCAgU3RlYWx0aCBJSUkgUzUyMAotCQkxMDkyIDQ5MDUgIFNwZWVkU3RhciBBMjAwCi0JCTEwOTIgNGEwOSAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDRhMGIgIFN0ZWFsdGggSUlJIFM1NDAgWHRyZW1lCi0JCTEwOTIgNGEwZiAgU3RlYWx0aCBJSUkgUzU0MAotCQkxMDkyIDRlMDEgIFN0ZWFsdGggSUlJIFM1NDAKLQkJMTEwMiAxMDFkICAzZCBCbGFzdGVyIFNhdmFnZSA0Ci0JCTExMDIgMTAxZSAgM2QgQmxhc3RlciBTYXZhZ2UgNAotCQk1MzMzIDgxMDAgIDg2QzM5NC0zOTcgU2F2YWdlNCBTRFJBTSAxMDAKLQkJNTMzMyA4MTEwICA4NkMzOTQtMzk3IFNhdmFnZTQgU0RSQU0gMTEwCi0JCTUzMzMgODEyNSAgODZDMzk0LTM5NyBTYXZhZ2U0IFNEUkFNIDEyNQotCQk1MzMzIDgxNDMgIDg2QzM5NC0zOTcgU2F2YWdlNCBTRFJBTSAxNDMKLQkJNTMzMyA4YTIyICA4NkMzOTQtMzk3IFNhdmFnZTQKLQkJNTMzMyA4YTJlICA4NkMzOTQtMzk3IFNhdmFnZTQgMzJiaXQKLQkJNTMzMyA5MTI1ICA4NkMzOTQtMzk3IFNhdmFnZTQgU0dSQU0gMTI1Ci0JCTUzMzMgOTE0MyAgODZDMzk0LTM5NyBTYXZhZ2U0IFNHUkFNIDE0MwotCThhMjMgIFNhdmFnZSA0Ci0JOGEyNSAgUHJvU2F2YWdlIFBNMTMzCi0JOGEyNiAgUHJvU2F2YWdlIEtNMTMzCi0JOGMwMCAgVmlSR0UvTTMKLQk4YzAxICBWaVJHRS9NWAotCQkxMTc5IDAwMDEgIFZpUkdFL01YCi0JOGMwMiAgVmlSR0UvTVgrCi0JOGMwMyAgVmlSR0UvTVgrTVYKLQk4YzEwICA4NkMyNzAtMjk0IFNhdmFnZS9NWC1NVgotCThjMTEgIDgyQzI3MC0yOTQgU2F2YWdlL01YCi0JOGMxMiAgODZDMjcwLTI5NCBTYXZhZ2UvSVgtTVYKLQkJMTAxNCAwMTdmICBUaGlua1BhZCBUMjAKLQkJMTE3OSAwMDAxICA4NkM1ODQgU3VwZXJTYXZhZ2UvSVhDIFRvc2hpYmEKLQk4YzEzICA4NkMyNzAtMjk0IFNhdmFnZS9JWAotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JOGMyMiAgU3VwZXJTYXZhZ2UgTVgvMTI4Ci0JOGMyNCAgU3VwZXJTYXZhZ2UgTVgvNjQKLQk4YzI2ICBTdXBlclNhdmFnZSBNWC82NEMKLQk4YzJhICBTdXBlclNhdmFnZSBJWC8xMjggU0RSCi0JOGMyYiAgU3VwZXJTYXZhZ2UgSVgvMTI4IEREUgotCThjMmMgIFN1cGVyU2F2YWdlIElYLzY0IFNEUgotCThjMmQgIFN1cGVyU2F2YWdlIElYLzY0IEREUgotCThjMmUgIFN1cGVyU2F2YWdlIElYL0MgU0RSCi0JCTEwMTQgMDFmYyAgVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykKLQk4YzJmICBTdXBlclNhdmFnZSBJWC9DIEREUgotCThkMDEgIDg2QzM4MCBbUHJvU2F2YWdlRERSIEs0TTI2Nl0KLQk4ZDAyICBWVDg2MzZBIFtQcm9TYXZhZ2UgS04xMzNdIEFHUDRYIFZHQSBDb250cm9sbGVyIChUd2lzdGVySykKLQk4ZDAzICBWVDg3NTEgW1Byb1NhdmFnZUREUiBQNE0yNjZdCi0JOGQwNCAgVlQ4Mzc1IFtQcm9TYXZhZ2U4IEtNMjY2L0tMMjY2XQotCTkxMDIgIDg2QzQxMCBTYXZhZ2UgMjAwMAotCQkxMDkyIDU5MzIgIFZpcGVyIElJIFoyMDAKLQkJMTA5MiA1OTM0ICBWaXBlciBJSSBaMjAwCi0JCTEwOTIgNTk1MiAgVmlwZXIgSUkgWjIwMAotCQkxMDkyIDU5NTQgIFZpcGVyIElJIFoyMDAKLQkJMTA5MiA1YTM1ICBWaXBlciBJSSBaMjAwCi0JCTEwOTIgNWEzNyAgVmlwZXIgSUkgWjIwMAotCQkxMDkyIDVhNTUgIFZpcGVyIElJIFoyMDAKLQkJMTA5MiA1YTU3ICBWaXBlciBJSSBaMjAwCi0JY2EwMCAgU29uaWNWaWJlcwotNTQ0YyAgVGVyYWxvZ2ljIEluYwotCTAzNTAgIFRMODgwLWJhc2VkIEhEVFYvQVRTQyB0dW5lcgotNTQ1NSAgVGVjaG5pc2NoZSBVbml2ZXJzaXR5IEJlcmxpbgotCTQ0NTggIFM1OTMzCi01NTE5ICBDbmV0IFRlY2hub2xvZ2llcywgSW5jLgotNTU0NCAgRHVub3JkIFRlY2hub2xvZ2llcwotCTAwMDEgIEktMzB4eCBTY2FubmVyIEludGVyZmFjZQotNTU1NSAgR2Vucm9jbywgSW5jCi0JMDAwMyAgVFVSQk9zdG9yIEhGUC04MzIgW0hpUFBJIE5JQ10KLTU2NTQgIFZvaWNlVHJvbml4IFB0eSBMdGQKLQkzMTMyICBPcGVuU3dpdGNoMTIKLTU3MDAgIE5ldHBvd2VyCi01ODUxICBFeGFjcSBUZWNobm9sb2dpZXMKLTYzNTYgIFVsdHJhU3RvcgotNjM3NCAgYyd0IE1hZ2F6aW4gZvxyIENvbXB1dGVydGVjaG5pawotCTY3NzMgIEdQUENJCi02NDA5ICBMb2dpdGVjIENvcnAuCi02NjY2ICBEZWNpc2lvbiBDb21wdXRlciBJbnRlcm5hdGlvbmFsIENvLgotCTAwMDEgIFBDQ09NNAotCTAwMDIgIFBDQ09NOAotNzYwNCAgTy5OLiBFbGVjdHJvbmljIENvIEx0ZC4KLTdiZGUgIE1JREFDIENvcnBvcmF0aW9uCi03ZmVkICBQb3dlclRWCi04MDA4ICBRdWFuY29tIEVsZWN0cm9uaWMgR21iSAotCTAwMTAgIFdET0cxIFtQQ0ktV2F0Y2hkb2cgMV0KLQkwMDExICBQV0RPRzIgW1BDSS1XYXRjaGRvZyAyXQotIyBXcm9uZyBJRCB1c2VkIGluIHN1YnN5c3RlbSBJRCBvZiBBc3VzVGVrIFBDSS1VU0IyIFBDSSBjYXJkLgotODA3ZCAgQXN1c3RlayBDb21wdXRlciwgSW5jLgotODA4NiAgSW50ZWwgQ29ycG9yYXRpb24KLQkwMDA3ICA4MjM3OUFCCi0JMDAwOCAgRXh0ZW5kZWQgRXhwcmVzcyBTeXN0ZW0gU3VwcG9ydCBDb250cm9sbGVyCi0JCTAwMDggMTAwMCAgV29ybGRNYXJrIDQzMDAgSU5DQSBBU0lDCi0JMDAzOSAgMjExNDUgRmFzdCBFdGhlcm5ldAotCTAxMjIgIDgyNDM3RlgKLQkwMzA5ICA4MDMwMyBJL08gUHJvY2Vzc29yIFBDSS10by1QQ0kgQnJpZGdlCi0JMDMwZCAgODAzMTIgSS9PIENvbXBhbmlvbiBDaGlwIFBDSS10by1QQ0kgQnJpZGdlCi0JMDMyNiAgNjcwMC82NzAyUFhIIEkvT3hBUElDIEludGVycnVwdCBDb250cm9sbGVyIEEKLQkwMzI3ICA2NzAwUFhIIEkvT3hBUElDIEludGVycnVwdCBDb250cm9sbGVyIEIKLQkwMzI5ICA2NzAwUFhIIFBDSSBFeHByZXNzLXRvLVBDSSBCcmlkZ2UgQQotCTAzMmEgIDY3MDBQWEggUENJIEV4cHJlc3MtdG8tUENJIEJyaWRnZSBCCi0JMDMyYyAgNjcwMlBYSCBQQ0kgRXhwcmVzcy10by1QQ0kgQnJpZGdlIEEKLSMgQS1zZWdtZW50IGJyaWRnZQotCTAzMzAgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQS1zZWdtZW50IElPQVBJQwotCTAzMzEgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQi1zZWdtZW50IGJyaWRnZQotCTAzMzIgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQi1zZWdtZW50IElPQVBJQwotCTAzMzMgIDgwMzMyIFtEb2Jzb25dIEkvTyBwcm9jZXNzb3IKLSMgQWRkcmVzcyBUcmFuc2xhdGlvbiBVbml0IChBVFUpCi0JMDMzNCAgODAzMzIgW0RvYnNvbl0gSS9PIHByb2Nlc3NvcgotIyBQQ0ktWCBicmlkZ2UKLQkwMzM1ICA4MDMzMSBbTGluZHNheV0gSS9PIHByb2Nlc3NvcgotIyBBZGRyZXNzIFRyYW5zbGF0aW9uIFVuaXQgKEFUVSkKLQkwMzM2ICA4MDMzMSBbTGluZHNheV0gSS9PIHByb2Nlc3NvcgotIyBBLXNlZ21lbnQgYnJpZGdlCi0JMDM0MCAgNDEyMTAgW0xhbmFpXSBTZXJpYWwgdG8gUGFyYWxsZWwgUENJIEJyaWRnZQotIyBCLXNlZ21lbnQgYnJpZGdlCi0JMDM0MSAgNDEyMTAgW0xhbmFpXSBTZXJpYWwgdG8gUGFyYWxsZWwgUENJIEJyaWRnZQotCTA0ODIgIDgyMzc1RUIvU0IgUENJIHRvIEVJU0EgQnJpZGdlCi0JMDQ4MyAgODI0MjRUWC9aWCBbU2F0dXJuXSBDUFUgdG8gUENJIGJyaWRnZQotCTA0ODQgIDgyMzc4WkIvSUIsIDgyMzc5QUIgKFNJTywgU0lPLkEpIFBDSSB0byBJU0EgQnJpZGdlCi0JMDQ4NiAgODI0MjVFWC9aWCBbQXJpZXNdIFBDSXNldCB3aXRoIElTQSBicmlkZ2UKLQkwNGEzICA4MjQzNExYL05YIFtNZXJjdXJ5L05lcHR1bmVdIFByb2Nlc3NvciB0byBQQ0kgYnJpZGdlCi0JMDRkMCAgODI0MzdGWCBbVHJpdG9uIEZYXQotCTA1MDAgIEU4ODcwIFByb2Nlc3NvciBidXMgY29udHJvbAotCTA1MDEgIEU4ODcwIE1lbW9yeSBjb250cm9sbGVyCi0jIGFuZCByZWdpc3RlcnMgY29tbW9uIHRvIGJvdGggU1BzCi0JMDUwMiAgRTg4NzAgU2NhbGFiaWxpdHkgUG9ydCAwCi0jIGFuZCBnbG9iYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZwotCTA1MDMgIEU4ODcwIFNjYWxhYmlsaXR5IFBvcnQgMQotCTA1MTAgIEU4ODcwSU8gSHViIEludGVyZmFjZSBQb3J0IDAgcmVnaXN0ZXJzICg4LWJpdCBjb21wYXRpYmlsaXR5IHBvcnQpCi0JMDUxMSAgRTg4NzBJTyBIdWIgSW50ZXJmYWNlIFBvcnQgMSByZWdpc3RlcnMKLQkwNTEyICBFODg3MElPIEh1YiBJbnRlcmZhY2UgUG9ydCAyIHJlZ2lzdGVycwotCTA1MTMgIEU4ODcwSU8gSHViIEludGVyZmFjZSBQb3J0IDMgcmVnaXN0ZXJzCi0JMDUxNCAgRTg4NzBJTyBIdWIgSW50ZXJmYWNlIFBvcnQgNCByZWdpc3RlcnMKLQkwNTE1ICBFODg3MElPIEdlbmVyYWwgU0lPSCByZWdpc3RlcnMKLQkwNTE2ICBFODg3MElPIFJBUyByZWdpc3RlcnMKLQkwNTMwICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMCByZWdpc3RlcnMKLQkwNTMxICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMSByZWdpc3RlcnMKLQkwNTMyICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMiByZWdpc3RlcnMKLQkwNTMzICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgMyByZWdpc3RlcnMKLQkwNTM0ICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgNCByZWdpc3RlcnMKLQkwNTM1ICBFODg3MFNQIFNjYWxhYmlsaXR5IFBvcnQgNSByZWdpc3RlcnMKLSMgKGJpLWludGVybGVhdmUgMCkgYW5kIGdsb2JhbCByZWdpc3RlcnMgdGhhdCBhcmUgbmVpdGhlciBwZXItcG9ydCBub3IgcGVyLWludGVybGVhdmUKLQkwNTM2ICBFODg3MFNQIEludGVybGVhdmUgcmVnaXN0ZXJzIDAgYW5kIDEKLSMgKGJpLWludGVybGVhdmUgMSkKLQkwNTM3ICBFODg3MFNQIEludGVybGVhdmUgcmVnaXN0ZXJzIDIgYW5kIDMKLQkwNjAwICBSQUlEIENvbnRyb2xsZXIKLQkJODA4NiAwMWMxICBJQ1AgVm9ydGV4IEdEVDg1NDZSWgotCQk4MDg2IDAxZjcgIFNDUlUzMgotIyB1bmluaXRpYWxpemVkIFNSQ1UzMiBSQUlEIENvbnRyb2xsZXIKLQkwNjFmICA4MDMwMyBJL08gUHJvY2Vzc29yCi0JMDk2MCAgODA5NjBSUCBbaTk2MCBSUCBNaWNyb3Byb2Nlc3Nvci9CcmlkZ2VdCi0JMDk2MiAgODA5NjBSTSBbaTk2MFJNIEJyaWRnZV0KLQkwOTY0ICA4MDk2MFJQIFtpOTYwIFJQIE1pY3JvcHJvY2Vzc29yL0JyaWRnZV0KLQkxMDAwICA4MjU0MiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMGUxMSBiMGRmICBOQzE2MzIgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyICgxMDAwLVNYKQotCQkwZTExIGIwZTAgIE5DMTYzMyBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgKDEwMDAtTFgpCi0JCTBlMTEgYjEyMyAgTkMxNjM0IEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciAoMTAwMC1TWCkKLQkJMTAxNCAwMTE5ICBOZXRmaW5pdHkgR2lnYWJpdCBFdGhlcm5ldCBTWCBBZGFwdGVyCi0JCTgwODYgMTAwMCAgUFJPLzEwMDAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCTEwMDEgIDgyNTQzR0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChGaWJlcikKLQkJMGUxMSAwMDRhICBOQzYxMzYgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDAxZWEgIE5ldGZpbml0eSBHaWdhYml0IEV0aGVybmV0IFNYIEFkYXB0ZXIKLQkJODA4NiAxMDAyICBQUk8vMTAwMCBGIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTAwMyAgUFJPLzEwMDAgRiBTZXJ2ZXIgQWRhcHRlcgotCTEwMDIgIFBybyAxMDAgTEFOK01vZGVtIDU2IENhcmRidXMgSUkKLQkJODA4NiAyMDBlICBQcm8gMTAwIExBTitNb2RlbSA1NiBDYXJkYnVzIElJCi0JCTgwODYgMjAxMyAgUHJvIDEwMCBTUiBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDIwMTcgIFBybyAxMDAgUyBDb21ibyBNb2JpbGUgQWRhcHRlcgotCTEwMDQgIDgyNTQzR0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTBlMTEgMDA0OSAgTkM3MTMyIEdpZ2FiaXQgVXBncmFkZSBNb2R1bGUKLQkJMGUxMSBiMWE0ICBOQzcxMzEgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDEwZjIgIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDA0ICBQUk8vMTAwMCBUIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMjAwNCAgUFJPLzEwMDAgVCBTZXJ2ZXIgQWRhcHRlcgotCTEwMDggIDgyNTQ0RUkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTEwMTQgMDI2OSAgaVNlcmllcyAxMDAwLzEwMC8xMCBFdGhlcm5ldCBBZGFwdGVyCi0JCTEwMjggMDExYyAgUFJPLzEwMDAgWFQgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMTEwNyAgUFJPLzEwMDAgWFQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAyMTA3ICBQUk8vMTAwMCBYVCBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDIxMTAgIFBSTy8xMDAwIFhUIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMzEwOCAgUFJPLzEwMDAgWFQgTmV0d29yayBDb25uZWN0aW9uCi0JMTAwOSAgODI1NDRFSSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZpYmVyKQotCQkxMDE0IDAyNjggIGlTZXJpZXMgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTgwODYgMTEwOSAgUFJPLzEwMDAgWEYgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAyMTA5ICBQUk8vMTAwMCBYRiBTZXJ2ZXIgQWRhcHRlcgotCTEwMGMgIDgyNTQ0R0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTgwODYgMTExMiAgUFJPLzEwMDAgVCBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAyMTEyICBQUk8vMTAwMCBUIERlc2t0b3AgQWRhcHRlcgotCTEwMGQgIDgyNTQ0R0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMT00pCi0JCTEwMjggMDEyMyAgUFJPLzEwMDAgWFQgTmV0d29yayBDb25uZWN0aW9uCi0JCTEwNzkgODkxZiAgODI1NDRHQyBCYXNlZCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JCTgwODYgMTEwZCAgODI1NDRHQyBCYXNlZCBOZXR3b3JrIENvbm5lY3Rpb24KLQkxMDBlICA4MjU0MEVNIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDE0IDAyNjUgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMDE0IDAyNjcgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMDE0IDAyNmEgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMDI4IDAwMmUgIE9wdGlwbGV4IEdYMjYwCi0JCTEwMjggMDE1MSAgUFJPLzEwMDAgTVQgTmV0d29yayBDb25uZWN0aW9uCi0JCTEwN2IgODkyMCAgUFJPLzEwMDAgTVQgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDAxZSAgUFJPLzEwMDAgTVQgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDAyZSAgUFJPLzEwMDAgTVQgRGVza3RvcCBBZGFwdGVyCi0JMTAwZiAgODI1NDVFTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKENvcHBlcikKLQkJMTAxNCAwMjY5ICBpU2VyaWVzIDEwMDAvMTAwLzEwIEV0aGVybmV0IEFkYXB0ZXIKLQkJMTAxNCAwMjhlICBQUk8vMTAwMCBNVCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAxMDAwICBQUk8vMTAwMCBNVCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAxMDAxICBQUk8vMTAwMCBNVCBTZXJ2ZXIgQWRhcHRlcgotCTEwMTAgIDgyNTQ2RUIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTEwMTQgMDI3YyAgUFJPLzEwMDAgTVQgRHVhbCBQb3J0IE5ldHdvcmsgQWRhcHRlcgotCQkxOGZiIDc4NzIgIFJFU2xpbmstWAotCQk0YzUzIDEwODAgIENUOCBtYWluYm9hcmQKLQkJNGM1MyAxMGEwICBDQTMvQ1IzIG1haW5ib2FyZAotCQk4MDg2IDEwMTEgIFBSTy8xMDAwIE1UIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwMWEgIFBSTy8xMDAwIE1UIER1YWwgUG9ydCBOZXR3b3JrIEFkYXB0ZXIKLQkJODA4NiAzNDI0ICBTRTc1MDFIRzIgTWFpbmJvYXJkCi0JMTAxMSAgODI1NDVFTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZpYmVyKQotCQkxMDE0IDAyNjggIGlTZXJpZXMgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCi0JCTgwODYgMTAwMiAgUFJPLzEwMDAgTUYgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDAzICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlciAoTFgpCi0JMTAxMiAgODI1NDZFQiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZpYmVyKQotCQk4MDg2IDEwMTIgIFBSTy8xMDAwIE1GIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgotCTEwMTMgIDgyNTQxRUkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCi0JCTgwODYgMDAxMyAgUFJPLzEwMDAgTVQgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMTAxMyAgSUJNIFRoaW5rQ2VudHJlIE5ldHdvcmsgQ2FyZAotCQk4MDg2IDExMTMgIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCTEwMTQgIDgyNTQxRVIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAxNSAgODI1NDBFTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKExPTSkKLQkxMDE2ICA4MjU0MEVQIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciAoTE9NKQotCQkxMDE0IDA1MmMgIFBSTy8xMDAwIE1UIE1vYmlsZSBDb25uZWN0aW9uCi0JCTExNzkgMDAwMSAgUFJPLzEwMDAgTVQgTW9iaWxlIENvbm5lY3Rpb24KLQkJODA4NiAxMDE2ICBQUk8vMTAwMCBNVCBNb2JpbGUgQ29ubmVjdGlvbgotCTEwMTcgIDgyNTQwRVAgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMT00pCi0JCTgwODYgMTAxNyAgUFIwLzEwMDAgTVQgRGVza3RvcCBDb25uZWN0aW9uCi0jIFVwZGF0ZSBjb250cm9sbGVyIG5hbWUgZnJvbSA4MjU0MUVQIHRvIDgyNTQxRUkKLQkxMDE4ICA4MjU0MUVJIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQk4MDg2IDEwMTggIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCTEwMTkgIDgyNTQ3RUkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChMT00pCi0JCTE0NTggMTAxOSAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NTggZTAwMCAgSW50ZWwgR2lnYWJpdCBFdGhlcm5ldCAoS2VuYWkgSUkpCi0JCTgwODYgMTAxOSAgUFJPLzEwMDAgQ1QgRGVza3RvcCBDb25uZWN0aW9uCi0JCTgwODYgMzAxZiAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCTEwMWQgIDgyNTQ2RUIgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTgwODYgMTAwMCAgUFJPLzEwMDAgTVQgUXVhZCBQb3J0IFNlcnZlciBBZGFwdGVyCi0JMTAxZSAgODI1NDBFUCBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKE1vYmlsZSkKLQkJMTAxNCAwNTQ5ICBQUk8vMTAwMCBNVCBNb2JpbGUgQ29ubmVjdGlvbgotCQkxMTc5IDAwMDEgIFBSTy8xMDAwIE1UIE1vYmlsZSBDb25uZWN0aW9uCi0JCTgwODYgMTAxZSAgUFJPLzEwMDAgTVQgTW9iaWxlIENvbm5lY3Rpb24KLQkxMDI2ICA4MjU0NUdNIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQk4MDg2IDEwMDAgIFBSTy8xMDAwIE1UIFNlcnZlciBDb25uZWN0aW9uCi0JCTgwODYgMTAwMSAgUFJPLzEwMDAgTVQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDAyICBQUk8vMTAwMCBNVCBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwMjYgIFBSTy8xMDAwIE1UIFNlcnZlciBDb25uZWN0aW9uCi0JMTAyNyAgODI1NDVHTSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJODA4NiAxMDAxICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcihMWCkKLQkJODA4NiAxMDAyICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcihMWCkKLQkJODA4NiAxMDAzICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcihMWCkKLQkJODA4NiAxMDI3ICBQUk8vMTAwMCBNRiBTZXJ2ZXIgQWRhcHRlcgotCTEwMjggIDgyNTQ1R00gR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTgwODYgMTAyOCAgUFJPLzEwMDAgTUIgU2VydmVyIEFkYXB0ZXIKLQkxMDI5ICA4MjU1OSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzMCAgODI1NTkgSW5CdXNpbmVzcyAxMC8xMDAKLQkxMDMxICA4MjgwMUNBTSAoSUNIMykgUFJPLzEwMCBWRSAoTE9NKSBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMTQgMDIwOSAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVmFpbyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTEwN2IgNTM1MCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTE3OSAwMDAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxNDRkIGMwMDAgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTE0NGQgYzAwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTQ0ZCBjMDAzICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxNDRkIGMwMDYgIHZwciBNYXRyaXggMTcwQjQKLQkxMDMyICA4MjgwMUNBTSAoSUNIMykgUFJPLzEwMCBWRSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzMyAgODI4MDFDQU0gKElDSDMpIFBSTy8xMDAgVk0gKExPTSkgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwMzQgIDgyODAxQ0FNIChJQ0gzKSBQUk8vMTAwIFZNIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDM1ICA4MjgwMUNBTSAoSUNIMykvODI1NjJFSCAoTE9NKSAgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwMzYgIDgyODAxQ0FNIChJQ0gzKSA4MjU2MkVIIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDM3ICA4MjgwMUNBTSAoSUNIMykgQ2hpcHNldCBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzOCAgODI4MDFDQU0gKElDSDMpIFBSTy8xMDAgVk0gKEtNKSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzOSAgODI4MDFEQiBQUk8vMTAwIFZFIChMT00pIEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAxNCAwMjY3ICBOZXRWaXN0YSBBMzBwCi0JMTAzYSAgODI4MDFEQiBQUk8vMTAwIFZFIChDTlIpIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDNiICA4MjgwMURCIFBSTy8xMDAgVk0gKExPTSkgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwM2MgIDgyODAxREIgUFJPLzEwMCBWTSAoQ05SKSBFdGhlcm5ldCBDb250cm9sbGVyCi0JMTAzZCAgODI4MDFEQiBQUk8vMTAwIFZFIChNT0IpIEV0aGVybmV0IENvbnRyb2xsZXIKLQkxMDNlICA4MjgwMURCIFBSTy8xMDAgVk0gKE1PQikgRXRoZXJuZXQgQ29udHJvbGxlcgotCTEwNDAgIDUzNkVQIERhdGEgRmF4IE1vZGVtCi0JCTE2YmUgMTA0MCAgVi45WCBEU1AgRGF0YSBGYXggTW9kZW0KLQkxMDQzICBQUk8vV2lyZWxlc3MgTEFOIDIxMDAgM0IgTWluaSBQQ0kgQWRhcHRlcgotCQk4MDg2IDI1MjcgIE1JTTIwMDAvQ2VudHJpbm8KLQkxMDQ4ICBQUk8vMTBHYkUgTFIgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiBhMDFmICBQUk8vMTBHYkUgTFIgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiBhMTFmICBQUk8vMTBHYkUgTFIgU2VydmVyIEFkYXB0ZXIKLQkxMDUwICA4MjU2MkVaIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTE0NjIgNzI4YyAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJMTQ2MiA3NThjICBNUy02NzU4ICg4NzVQIE5lbykKLQkJODA4NiAzMDIwICBEODY1UEVSTCBtYWluYm9hcmQKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JMTA1MSAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgaW50ZWdyYXRlZCBMQU4gQ29udHJvbGxlcgotCTEwNTkgIDgyNTUxUU0gRXRoZXJuZXQgQ29udHJvbGxlcgotIyBJQ0gtNiBDb21wb25lbnQKLQkxMDY0ICA4MjU2MkVUL0VaL0dUL0daIC0gUFJPLzEwMCBWRSAoTE9NKSBFdGhlcm5ldCBDb250cm9sbGVyCi0jIElDSC02IENvbXBvbmVudAotCTEwNjUgIDgyNTYyRVQvRVovR1QvR1ogLSBQUk8vMTAwIFZFIEV0aGVybmV0IENvbnRyb2xsZXIKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2NiAgODI1NjIgRU0vRVgvR1ggLSBQUk8vMTAwIFZNIChMT00pIEV0aGVybmV0IENvbnRyb2xsZXIKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2NyAgODI1NjIgRU0vRVgvR1ggLSBQUk8vMTAwIFZNIEV0aGVybmV0IENvbnRyb2xsZXIKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2OCAgODI1NjJFVC9FWi9HVC9HWiAtIFBSTy8xMDAgVkUgKExPTSkgRXRoZXJuZXQgQ29udHJvbGxlciBNb2JpbGUKLSMgSUNILTYgQ29tcG9uZW50Ci0JMTA2OSAgODI1NjIgRU0vRVgvR1ggLSBQUk8vMTAwIFZNIChMT00pIEV0aGVybmV0IENvbnRyb2xsZXIgTW9iaWxlCi0jIElDSC02IENvbXBvbmVudAotCTEwNmEgIDgyNTYyRyBcdC0gUFJPLzEwMCBWRSAoTE9NKSBFdGhlcm5ldCBDb250cm9sbGVyCi0jIElDSC02IENvbXBvbmVudAotCTEwNmIgIDgyNTYyRyBcdC0gUFJPLzEwMCBWRSBFdGhlcm5ldCBDb250cm9sbGVyIE1vYmlsZQotCTEwNzUgIDgyNTQ3R0kgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMjggMDE2NSAgUG93ZXJFZGdlIDc1MAotCQk4MDg2IDAwNzUgIFBSTy8xMDAwIENUIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzUgIFBSTy8xMDAwIENUIE5ldHdvcmsgQ29ubmVjdGlvbgotCTEwNzYgIDgyNTQxR0kvUEkgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTEwMjggMDE2NSAgUG93ZXJFZGdlIDc1MAotCQk4MDg2IDAwNzYgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzYgIFBSTy8xMDAwIE1UIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDExNzYgIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCQk4MDg2IDEyNzYgIFBSTy8xMDAwIE1UIERlc2t0b3AgQWRhcHRlcgotCTEwNzcgIDgyNTQxR0kgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCi0JCTExNzkgMDAwMSAgUFJPLzEwMDAgTVQgTW9iaWxlIENvbm5lY3Rpb24KLQkJODA4NiAwMDc3ICBQUk8vMTAwMCBNVCBNb2JpbGUgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzcgIFBSTy8xMDAwIE1UIE1vYmlsZSBDb25uZWN0aW9uCi0JMTA3OCAgODI1NDFFSSBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJODA4NiAxMDc4ICBQUk8vMTAwMCBNVCBOZXR3b3JrIENvbm5lY3Rpb24KLQkxMDc5ICA4MjU0NkdCIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQkxMDNjIDEyYTYgIEhQIER1YWwgUG9ydCAxMDAwQmFzZS1UIFtBOTkwMEFdCi0JCTEwM2MgMTJjZiAgSFAgQ29yZSBEdWFsIFBvcnQgMTAwMEJhc2UtVCBbQUIzNTJBXQotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JCTgwODYgMDA3OSAgUFJPLzEwMDAgTVQgRHVhbCBQb3J0IE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDEwNzkgIFBSTy8xMDAwIE1UIER1YWwgUG9ydCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAxMTc5ICBQUk8vMTAwMCBNVCBEdWFsIFBvcnQgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMTE3YSAgUFJPLzEwMDAgTVQgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCi0JMTA3YSAgODI1NDZHQiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMTAzYyAxMmE4ICBIUCBEdWFsIFBvcnQgMTAwMGJhc2UtU1ggW0E5ODk5QV0KLQkJODA4NiAxMDdhICBQUk8vMTAwMCBNRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMjdhICBQUk8vMTAwMCBNRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkxMDdiICA4MjU0NkdCIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgotCQk4MDg2IDAwN2IgIFBSTy8xMDAwIE1CIER1YWwgUG9ydCBTZXJ2ZXIgQ29ubmVjdGlvbgotCQk4MDg2IDEwN2IgIFBSTy8xMDAwIE1CIER1YWwgUG9ydCBTZXJ2ZXIgQ29ubmVjdGlvbgotCTExMDcgIFBSTy8xMDAwIE1GIFNlcnZlciBBZGFwdGVyIChMWCkKLQkxMTMwICA4MjgxNSA4MTUgQ2hpcHNldCBIb3N0IEJyaWRnZSBhbmQgTWVtb3J5IENvbnRyb2xsZXIgSHViCi0JCTEwMjUgMTAxNiAgVHJhdmVsbWF0ZSA2MTIgVFgKLQkJMTA0MyA4MDI3ICBUVVNMMi1DIE1haW5ib2FyZAotCQkxMDRkIDgwZGYgIFZhaW8gUENHLUZYNDAzCi0JCTgwODYgNDUzMiAgRDgxNUVFQTIgbWFpbmJvYXJkCi0JCTgwODYgNDU1NyAgRDgxNUVHRVcgTWFpbmJvYXJkCi0JMTEzMSAgODI4MTUgODE1IENoaXBzZXQgQUdQIEJyaWRnZQotCTExMzIgIDgyODE1IENHQyBbQ2hpcHNldCBHcmFwaGljcyBDb250cm9sbGVyXQotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyIFRYCi0JCTEwNGQgODBkZiAgVmFpbyBQQ0ctRlg0MDMKLQkJODA4NiA0NTMyICBEODE1RUVBMiBNYWluYm9hcmQKLQkJODA4NiA0NTU3ICBEODE1RUdFVyBNYWluYm9hcmQKLQkxMTYxICA4MjgwNkFBIFBDSTY0IEh1YiBBZHZhbmNlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIKLQkJODA4NiAxMTYxICA4MjgwNkFBIFBDSTY0IEh1YiBBUElDCi0JMTE2MiAgWHNjYWxlIDgwMjAwIEJpZyBFbmRpYW4gQ29tcGFuaW9uIENoaXAKLQkxMjAwICBJbnRlbCBJWFAxMjAwIE5ldHdvcmsgUHJvY2Vzc29yCi0JCTE3MmEgMDAwMCAgQUVQIFNTTCBBY2NlbGVyYXRvcgotCTEyMDkgIDgyNTV4RVIvODI1NTFJVCBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCQk0YzUzIDEwNzAgIFBDNiBtYWluYm9hcmQKLQkxMjIxICA4MjA5MkFBIFBDSSB0byBQQ01DSUEgQnJpZGdlCi0JMTIyMiAgODIwOTJBQSBJREUgQ29udHJvbGxlcgotCTEyMjMgIFNBQTcxMTYKLQkxMjI1ICA4MjQ1MktYL0dYIFtPcmlvbl0KLQkxMjI2ICA4MjU5NiBQUk8vMTAgUENJCi0JMTIyNyAgODI4NjUgRXRoZXJFeHByZXNzIFBSTy8xMDBBCi0JMTIyOCAgODI1NTYgRXRoZXJFeHByZXNzIFBSTy8xMDAgU21hcnQKLSMgdGhlIHJldmlzaW9uIGZpZWxkIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gdGhlbSAoMS0zIGlzIDgyNTU3LCA0LTUgaXMgODI1NTgsIDYtOCBpcyA4MjU1OSwgOSBpcyA4MjU1OUVSKQotCTEyMjkgIDgyNTU3LzgvOSBbRXRoZXJuZXQgUHJvIDEwMF0KLQkJMGUxMSAzMDAxICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDAyICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDAzICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA0ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA1ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA2ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSAzMDA3ICA4MjU1OSBGYXN0IEV0aGVybmV0IExPTSB3aXRoIEFsZXJ0IG9uIExBTioKLQkJMGUxMSBiMDFlICBOQzMxMjAgRmFzdCBFdGhlcm5ldCBOSUMKLQkJMGUxMSBiMDFmICBOQzMxMjIgRmFzdCBFdGhlcm5ldCBOSUMgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMDJmICBOQzExMjAgRXRoZXJuZXQgTklDCi0JCTBlMTEgYjA0YSAgTmV0ZWxsaWdlbnQgMTAvMTAwVFggTklDIHdpdGggV2FrZSBvbiBMQU4KLQkJMGUxMSBiMGM2ICBOQzMxNjEgRmFzdCBFdGhlcm5ldCBOSUMgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgYjBjNyAgTkMzMTYwIEZhc3QgRXRoZXJuZXQgTklDIChlbWJlZGRlZCkKLQkJMGUxMSBiMGQ3ICBOQzMxMjEgRmFzdCBFdGhlcm5ldCBOSUMgKFdPTCkKLQkJMGUxMSBiMGRkICBOQzMxMzEgRmFzdCBFdGhlcm5ldCBOSUMgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMGRlICBOQzMxMzIgRmFzdCBFdGhlcm5ldCBNb2R1bGUgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMGUxICBOQzMxMzMgRmFzdCBFdGhlcm5ldCBNb2R1bGUgKDEwMC1GWCkKLQkJMGUxMSBiMTM0ICBOQzMxNjMgRmFzdCBFdGhlcm5ldCBOSUMgKGVtYmVkZGVkLCBXT0wpCi0JCTBlMTEgYjEzYyAgTkMzMTYyIEZhc3QgRXRoZXJuZXQgTklDIChlbWJlZGRlZCkKLQkJMGUxMSBiMTQ0ICBOQzMxMjMgRmFzdCBFdGhlcm5ldCBOSUMgKFdPTCkKLQkJMGUxMSBiMTYzICBOQzMxMzQgRmFzdCBFdGhlcm5ldCBOSUMgKGR1YWwgcG9ydCkKLQkJMGUxMSBiMTY0ICBOQzMxMzUgRmFzdCBFdGhlcm5ldCBVcGdyYWRlIE1vZHVsZSAoZHVhbCBwb3J0KQotCQkwZTExIGIxYTQgIE5DNzEzMSBHaWdhYml0IFNlcnZlciBBZGFwdGVyCi0JCTEwMTQgMDA1YyAgODI1NThCIEV0aGVybmV0IFBybyAxMC8xMDAKLQkJMTAxNCAwMWJjICA4MjU1OSBGYXN0IEV0aGVybmV0IExBTiBPbiBNb3RoZXJib2FyZAotCQkxMDE0IDAxZjEgIDEwLzEwMCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDAxZjIgIDEwLzEwMCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlcgotCQkxMDE0IDAyMDcgIEV0aGVybmV0IFByby8xMDAgUwotCQkxMDE0IDAyMzIgIDEwLzEwMCBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkJMTAxNCAwMjNhICBUaGlua1BhZCBSMzAKLQkJMTAxNCAxMDVjICBOZXRmaW5pdHkgMTAvMTAwCi0JCTEwMTQgMjIwNSAgVGhpbmtQYWQgQTIycAotCQkxMDE0IDMwNWMgIDEwLzEwMCBFdGhlckpldCBNYW5hZ2VtZW50IEFkYXB0ZXIKLQkJMTAxNCA0MDVjICAxMC8xMDAgRXRoZXJKZXQgQWRhcHRlciB3aXRoIEFsZXJ0IG9uIExBTgotCQkxMDE0IDUwNWMgIDEwLzEwMCBFdGhlckpldCBTZWN1cmUgTWFuYWdlbWVudCBBZGFwdGVyCi0JCTEwMTQgNjA1YyAgMTAvMTAwIEV0aGVySmV0IFNlY3VyZSBNYW5hZ2VtZW50IEFkYXB0ZXIKLQkJMTAxNCA3MDVjICAxMC8xMDAgTmV0ZmluaXR5IDEwLzEwMCBFdGhlcm5ldCBTZWN1cml0eSBBZGFwdGVyCi0JCTEwMTQgODA1YyAgMTAvMTAwIE5ldGZpbml0eSAxMC8xMDAgRXRoZXJuZXQgU2VjdXJpdHkgQWRhcHRlcgotCQkxMDI4IDAwOWIgIFBvd2VyRWRnZSAyNTAwLzI1NTAKLQkJMTAyOCAwMGNlICBQb3dlckVkZ2UgMTQwMAotCQkxMDMzIDgwMDAgIFBDLTk4MjFYLUIwNgotCQkxMDMzIDgwMTYgIFBLLVVHLVgwMDYKLQkJMTAzMyA4MDFmICBQSy1VRy1YMDA2Ci0JCTEwMzMgODAyNiAgUEstVUctWDAwNgotCQkxMDMzIDgwNjMgIDgyNTU5LWJhc2VkIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDMzIDgwNjQgIDgyNTU5LWJhc2VkIEZhc3QgRXRoZXJuZXQgQWRhcHRlcgotCQkxMDNjIDEwYzAgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwYzMgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwY2EgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwY2IgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwZTMgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEwZTQgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMDNjIDEyMDAgIE5ldFNlcnZlciAxMC8xMDBUWAotCQkxMGMzIDExMDAgIFNtYXJ0RXRoZXIxMDAgU0MxMTAwCi0JCTEwY2YgMTExNSAgODI1NXgtYmFzZWQgRXRoZXJuZXQgQWRhcHRlciAoMTAvMTAwKQotCQkxMGNmIDExNDMgIDgyNTV4LWJhc2VkIEV0aGVybmV0IEFkYXB0ZXIgKDEwLzEwMCkKLQkJMTE3OSAwMDAxICA4MjU1eC1iYXNlZCBFdGhlcm5ldCBBZGFwdGVyICgxMC8xMDApCi0JCTExNzkgMDAwMiAgUENJIEZhc3RFdGhlciBMQU4gb24gRG9ja2VyCi0JCTExNzkgMDAwMyAgODI1NXgtYmFzZWQgRmFzdCBFdGhlcm5ldAotCQkxMjU5IDI1NjAgIEFULTI1NjAgMTAwCi0JCTEyNTkgMjU2MSAgQVQtMjU2MCAxMDAgRlggRXRoZXJuZXQgQWRhcHRlcgotCQkxMjY2IDAwMDEgIE5FMTAvMTAwIEFkYXB0ZXIKLQkJMTNlOSAxMDAwICA2MjIxTC00VQotCQkxNDRkIDI1MDEgIFNFTS0yMDAwIE1pbmlQQ0kgTEFOIEFkYXB0ZXIKLQkJMTQ0ZCAyNTAyICBTRU0tMjEwMElMIE1pbmlQQ0kgTEFOIEFkYXB0ZXIKLQkJMTY2OCAxMTAwICBFdGhlckV4cHJlc3MgUFJPLzEwMEIgKFRYKSAoTWluaVBDSSBFdGhlcm5ldCtNb2RlbSkKLQkJNGM1MyAxMDgwICBDVDggbWFpbmJvYXJkCi0JCTgwODYgMDAwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDBCIChUWCkKLQkJODA4NiAwMDAyICBFdGhlckV4cHJlc3MgUFJPLzEwMEIgKFQ0KQotCQk4MDg2IDAwMDMgIEV0aGVyRXhwcmVzcyBQUk8vMTArCi0JCTgwODYgMDAwNCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgV2ZNCi0JCTgwODYgMDAwNSAgODI1NTcgMTAvMTAwCi0JCTgwODYgMDAwNiAgODI1NTcgMTAvMTAwIHdpdGggV2FrZSBvbiBMQU4KLQkJODA4NiAwMDA3ICA4MjU1OCAxMC8xMDAgQWRhcHRlcgotCQk4MDg2IDAwMDggIDgyNTU4IDEwLzEwMCB3aXRoIFdha2Ugb24gTEFOCi0JCTgwODYgMDAwOSAgRXRoZXJFeHByZXNzIFBSTy8xMDArCi0JCTgwODYgMDAwYSAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1hbmFnZW1lbnQgQWRhcHRlcgotCQk4MDg2IDAwMGIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKwotCQk4MDg2IDAwMGMgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNYW5hZ2VtZW50IEFkYXB0ZXIKLQkJODA4NiAwMDBkICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgQWxlcnQgT24gTEFOIElJKiBBZGFwdGVyCi0JCTgwODYgMDAwZSAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1hbmFnZW1lbnQgQWRhcHRlciB3aXRoIEFsZXJ0IE9uIExBTioKLQkJODA4NiAwMDBmICBFdGhlckV4cHJlc3MgUFJPLzEwMCBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAwMDEwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIE1hbmFnZW1lbnQgQWRhcHRlcgotCQk4MDg2IDAwMTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgTWFuYWdlbWVudCBBZGFwdGVyCi0JCTgwODYgMDAxMiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBBZHZhbmNlZCBNYW5hZ2VtZW50IEFkYXB0ZXIgKEQpCi0JCTgwODYgMDAxMyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBBZHZhbmNlZCBNYW5hZ2VtZW50IEFkYXB0ZXIgKEUpCi0JCTgwODYgMDAzMCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgIE1hbmFnZW1lbnQgQWRhcHRlciB3aXRoIEFsZXJ0IE9uIExBTiogR0MKLQkJODA4NiAwMDMxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAwMDQwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIERlc2t0b3AgQWRhcHRlcgotCQk4MDg2IDAwNDEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDA0MiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgRGVza3RvcCBBZGFwdGVyCi0JCTgwODYgMDA1MCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBEZXNrdG9wIEFkYXB0ZXIKLQkJODA4NiAxMDA5ICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDBjICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgU2VydmVyIEFkYXB0ZXIgKFBJTEE4NDcwQikKLQkJODA4NiAxMDEyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIFNlcnZlciBBZGFwdGVyIChEKQotCQk4MDg2IDEwMTMgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgU2VydmVyIEFkYXB0ZXIgKEUpCi0JCTgwODYgMTAxNSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMDE3ICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTAzMCAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1hbmFnZW1lbnQgQWRhcHRlciB3aXRoIEFsZXJ0IE9uIExBTiogRyBTZXJ2ZXIKLQkJODA4NiAxMDQwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTA0MSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwNDIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTA1MCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBTZXJ2ZXIgQWRhcHRlcgotCQk4MDg2IDEwNTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNlcnZlciBBZGFwdGVyCi0JCTgwODYgMTA1MiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU2VydmVyIEFkYXB0ZXIKLQkJODA4NiAxMGYwICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgRHVhbCBQb3J0IEFkYXB0ZXIKLQkJODA4NiAyMDA5ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjAwZCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgQ2FyZGJ1cwotCQk4MDg2IDIwMGUgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIExBTitWOTAgQ2FyZGJ1cyBNb2RlbQotCQk4MDg2IDIwMGYgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNSIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjAxMCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDIwMTMgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNSIE1vYmlsZSBDb21ibyBBZGFwdGVyCi0JCTgwODYgMjAxNiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIwMTcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgQ29tYm8gTW9iaWxlIEFkYXB0ZXIKLQkJODA4NiAyMDE4ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTUiBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIwMTkgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNSIENvbWJvIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjEwMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUCBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIxMDIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNQIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjEwMyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU1AgTW9iaWxlIEFkYXB0ZXIKLQkJODA4NiAyMTA0ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTUCBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIxMDUgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNQIE1vYmlsZSBBZGFwdGVyCi0JCTgwODYgMjEwNiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUCBNb2JpbGUgQWRhcHRlcgotCQk4MDg2IDIxMDcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDIxMDggIEV0aGVyRXhwcmVzcyBQUk8vMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDIyMDAgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFAgTW9iaWxlIENvbWJvIEFkYXB0ZXIKLQkJODA4NiAyMjAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBQIE1vYmlsZSBDb21ibyBBZGFwdGVyCi0JCTgwODYgMjIwMiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU1AgTW9iaWxlIENvbWJvIEFkYXB0ZXIKLQkJODA4NiAyMjAzICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDIyMDQgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjIwNSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgU1AgTW9iaWxlIENvbWJvIEFkYXB0ZXIKLQkJODA4NiAyMjA2ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTUCBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDIyMDcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFNQIE1vYmlsZSBDb21ibyBBZGFwdGVyCi0JCTgwODYgMjIwOCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUCBNb2JpbGUgQ29tYm8gQWRhcHRlcgotCQk4MDg2IDI0MDIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjQwNyAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1pbmlQQ0kKLQkJODA4NiAyNDA4ICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDI0MDkgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjQwZiAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1pbmlQQ0kKLQkJODA4NiAyNDEwICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDI0MTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwKyBNaW5pUENJCi0JCTgwODYgMjQxMiAgRXRoZXJFeHByZXNzIFBSTy8xMDArIE1pbmlQQ0kKLQkJODA4NiAyNDEzICBFdGhlckV4cHJlc3MgUFJPLzEwMCsgTWluaVBDSQotCQk4MDg2IDMwMDAgIDgyNTU5IEZhc3QgRXRoZXJuZXQgTEFOIG9uIE1vdGhlcmJvYXJkCi0JCTgwODYgMzAwMSAgODI1NTkgRmFzdCBFdGhlcm5ldCBMT00gd2l0aCBCYXNpYyBBbGVydCBvbiBMQU4qCi0JCTgwODYgMzAwMiAgODI1NTkgRmFzdCBFdGhlcm5ldCBMT00gd2l0aCBBbGVydCBvbiBMQU4gSUkqCi0JCTgwODYgMzAwNiAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAzMDA3ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDMwMDggIEV0aGVyRXhwcmVzcyBQUk8vMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgotCQk4MDg2IDMwMTAgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFMgTmV0d29yayBDb25uZWN0aW9uCi0JCTgwODYgMzAxMSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgUyBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAzMDEyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBOZXR3b3JrIENvbm5lY3Rpb24KLQkJODA4NiAzNDExICBTRFMyIE1haW5ib2FyZAotCTEyMmQgIDQzMEZYIC0gODI0MzdGWCBUU0MgW1RyaXRvbiBJXQotCTEyMmUgIDgyMzcxRkIgUElJWCBJU0EgW1RyaXRvbiBJXQotCTEyMzAgIDgyMzcxRkIgUElJWCBJREUgW1RyaXRvbiBJXQotCTEyMzEgIERTVkQgTW9kZW0KLQkxMjM0ICA0MzBNWCAtIDgyMzcxTVggTW9iaWxlIFBDSSBJL08gSURFIFhjZWxlcmF0b3IgKE1QSUlYKQotCTEyMzUgIDQzME1YIC0gODI0MzdNWCBNb2IuIFN5c3RlbSBDdHJsciAoTVRTQykgJiA4MjQzOE1YIERhdGEgUGF0aCAoTVREUCkKLQkxMjM3ICA0NDBGWCAtIDgyNDQxRlggUE1DIFtOYXRvbWFdCi0JMTIzOSAgODIzNzFGQiBQSUlYIElERSBJbnRlcmZhY2UKLQkxMjNiICA4MjM4MFBCIFBDSSB0byBQQ0kgRG9ja2luZyBCcmlkZ2UKLQkxMjNjICA4MjM4MEFCIChNSVNBKSBNb2JpbGUgUENJLXRvLUlTQSBCcmlkZ2UKLQkxMjNkICA2ODMwNTMgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBEZXZpY2UKLSMgaW4iIGhpZGRlbiIgbW9kZQotCTEyM2UgIDgyNDY2R1ggKElIUEMpIEludGVncmF0ZWQgSG90LVBsdWcgQ29udHJvbGxlcgotCTEyM2YgIDgyNDY2R1ggSW50ZWdyYXRlZCBIb3QtUGx1ZyBDb250cm9sbGVyIChJSFBDKQotCTEyNDAgIDgyNzUyICg3NTIpIEFHUCBHcmFwaGljcyBBY2NlbGVyYXRvcgotCTEyNGIgIDgyMzgwRkIgKE1QQ0kyKSBNb2JpbGUgRG9ja2luZyBDb250cm9sbGVyCi0JMTI1MCAgNDMwSFggLSA4MjQzOUhYIFRYQyBbVHJpdG9uIElJXQotCTEzNjAgIDgyODA2QUEgUENJNjQgSHViIFBDSSBCcmlkZ2UKLQkxMzYxICA4MjgwNkFBIFBDSTY0IEh1YiBDb250cm9sbGVyIChIUmVzKQotCQk4MDg2IDEzNjEgIDgyODA2QUEgUENJNjQgSHViIENvbnRyb2xsZXIgKEhSZXMpCi0JCTgwODYgODAwMCAgODI4MDZBQSBQQ0k2NCBIdWIgQ29udHJvbGxlciAoSFJlcykKLQkxNDYwICA4Mjg3MFAyIFA2NEgyIEh1YiBQQ0kgQnJpZGdlCi0JMTQ2MSAgODI4NzBQMiBQNjRIMiBJL094QVBJQwotCQkxNWQ5IDM0ODAgIFA0RFA2Ci0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTE0NjIgIDgyODcwUDIgUDY0SDIgSG90IFBsdWcgQ29udHJvbGxlcgotCTE5NjAgIDgwOTYwUlAgW2k5NjBSUCBNaWNyb3Byb2Nlc3Nvcl0KLQkJMTAxZSAwNDMxICBNZWdhUkFJRCA0MzEgUkFJRCBDb250cm9sbGVyCi0JCTEwMWUgMDQzOCAgTWVnYVJBSUQgNDM4IFVsdHJhMiBMVkQgUkFJRCBDb250cm9sbGVyCi0JCTEwMWUgMDQ2NiAgTWVnYVJBSUQgNDY2IEV4cHJlc3MgUGx1cyBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNDY3ICBNZWdhUkFJRCA0NjcgRW50ZXJwcmlzZSAxNTAwIFJBSUQgQ29udHJvbGxlcgotCQkxMDFlIDA0OTAgIE1lZ2FSQUlEIDQ5MCBFeHByZXNzIDMwMCBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwNzYyICBNZWdhUkFJRCA3NjIgRXhwcmVzcyBSQUlEIENvbnRyb2xsZXIKLQkJMTAxZSAwOWEwICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMi9TQwotCQkxMDI4IDA0NjcgIFBvd2VyRWRnZSBFeHBhbmRhYmxlIFJBSUQgQ29udHJvbGxlciAyL0RDCi0JCTEwMjggMTExMSAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDIvU0MKLQkJMTAzYyAwM2EyICBNZWdhUkFJRAotCQkxMDNjIDEwYzYgIE1lZ2FSQUlEIDQzOCwgSFAgTmV0UkFJRC0zU2kKLQkJMTAzYyAxMGM3ICBNZWdhUkFJRCBUNSwgSW50ZWdyYXRlZCBIUCBOZXRSQUlECi0JCTEwM2MgMTBjYyAgTWVnYVJBSUQsIEludGVncmF0ZWQgSFAgTmV0UkFJRAotCQkxMDNjIDEwY2QgIEhQIE5ldFJBSUQtMVNpCi0JCTEwNWEgMDAwMCAgU3VwZXJUcmFrCi0JCTEwNWEgMjE2OCAgU3VwZXJUcmFrIFBybwotCQkxMDVhIDUxNjggIFN1cGVyVHJhazY2LzEwMAotCQkxMTExIDExMTEgIE1lZ2FSQUlEIDQ2NiwgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDIvU0MKLQkJMTExMSAxMTEyICBQb3dlckVkZ2UgRXhwYW5kYWJsZSBSQUlEIENvbnRyb2xsZXIgMi9TQwotCQkxMTNjIDAzYTIgIE1lZ2FSQUlECi0JCWU0YmYgMTAxMCAgQ0cxLVJBRElPCi0JCWU0YmYgMTAyMCAgQ1UyLVFVQVJURVQKLQkJZTRiZiAxMDQwICBDVTEtQ0hPUlVTCi0JCWU0YmYgMzEwMCAgQ1gxLUJBTkQKLQkxOTYyICA4MDk2MFJNIFtpOTYwUk0gTWljcm9wcm9jZXNzb3JdCi0JCTEwNWEgMDAwMCAgU3VwZXJUcmFrIFNYNjAwMCBJMk8gQ1BVCi0JMWEyMSAgODI4NDAgODQwIChDYXJtZWwpIENoaXBzZXQgSG9zdCBCcmlkZ2UgKEh1YiBBKQotCTFhMjMgIDgyODQwIDg0MCAoQ2FybWVsKSBDaGlwc2V0IEFHUCBCcmlkZ2UKLQkxYTI0ICA4Mjg0MCA4NDAgKENhcm1lbCkgQ2hpcHNldCBQQ0kgQnJpZGdlIChIdWIgQikKLQkxYTMwICA4Mjg0NSA4NDUgKEJyb29rZGFsZSkgQ2hpcHNldCBIb3N0IEJyaWRnZQotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JMWEzMSAgODI4NDUgODQ1IChCcm9va2RhbGUpIENoaXBzZXQgQUdQIEJyaWRnZQotCTI0MTAgIDgyODAxQUEgSVNBIEJyaWRnZSAoTFBDKQotCTI0MTEgIDgyODAxQUEgSURFCi0JMjQxMiAgODI4MDFBQSBVU0IKLQkyNDEzICA4MjgwMUFBIFNNQnVzCi0JMjQxNSAgODI4MDFBQSBBQyc5NyBBdWRpbwotCQkxMDI4IDAwOTUgIFByZWNpc2lvbiBXb3Jrc3RhdGlvbiAyMjAgSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgMDA0MCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgMDA0OCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgNTM0MCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JMjQxNiAgODI4MDFBQSBBQyc5NyBNb2RlbQotCTI0MTggIDgyODAxQUEgUENJIEJyaWRnZQotCTI0MjAgIDgyODAxQUIgSVNBIEJyaWRnZSAoTFBDKQotCTI0MjEgIDgyODAxQUIgSURFCi0JMjQyMiAgODI4MDFBQiBVU0IKLQkyNDIzICA4MjgwMUFCIFNNQnVzCi0JMjQyNSAgODI4MDFBQiBBQyc5NyBBdWRpbwotCQkxMWQ0IDAwNDAgIFNvdW5kTUFYIEludGVncmF0ZWQgRGlnaXRhbCBBdWRpbwotCQkxMWQ0IDAwNDggIFNvdW5kTUFYIEludGVncmF0ZWQgRGlnaXRhbCBBdWRpbwotCTI0MjYgIDgyODAxQUIgQUMnOTcgTW9kZW0KLQkyNDI4ICA4MjgwMUFCIFBDSSBCcmlkZ2UKLQkyNDQwICA4MjgwMUJBIElTQSBCcmlkZ2UgKExQQykKLQkyNDQyICA4MjgwMUJBL0JBTSBVU0IgKEh1YiAjMSkKLQkJMTAxNCAwMWM2ICBOZXR2aXN0YSBBNDAvQTQwcAotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyIFRYCi0JCTEwMjggMDEwZSAgT3B0aXBsZXggR1gyNDAKLQkJMTA0MyA4MDI3ICBUVVNMMi1DIE1haW5ib2FyZAotCQkxMDRkIDgwZGYgIFZhaW8gUENHLUZYNDAzCi0JCTE0N2IgMDUwNyAgVEg3SUktUkFJRAotCQk4MDg2IDQ1MzIgIEQ4MTVFRUEyIG1haW5ib2FyZAotCQk4MDg2IDQ1NTcgIEQ4MTVFR0VXIE1haW5ib2FyZAotCTI0NDMgIDgyODAxQkEvQkFNIFNNQnVzCi0JCTEwMTQgMDFjNiAgTmV0dmlzdGEgQTQwL0E0MHAKLQkJMTAyNSAxMDE2ICBUcmF2ZWxtYXRlIDYxMiBUWAotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JCTEwNDMgODAyNyAgVFVTTDItQyBNYWluYm9hcmQKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxNDdiIDA1MDcgIFRIN0lJLVJBSUQKLQkJODA4NiA0NTMyICBEODE1RUVBMiBtYWluYm9hcmQKLQkJODA4NiA0NTU3ICBEODE1RUdFVyBNYWluYm9hcmQKLQkyNDQ0ICA4MjgwMUJBL0JBTSBVU0IgKEh1YiAjMikKLQkJMTAyNSAxMDE2ICBUcmF2ZWxtYXRlIDYxMiBUWAotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JCTEwNDMgODAyNyAgVFVTTDItQyBNYWluYm9hcmQKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxNDdiIDA1MDcgIFRIN0lJLVJBSUQKLQkJODA4NiA0NTMyICBEODE1RUVBMiBtYWluYm9hcmQKLQkyNDQ1ICA4MjgwMUJBL0JBTSBBQyc5NyBBdWRpbwotCQkxMDE0IDAxYzYgIE5ldHZpc3RhIEE0MC9BNDBwCi0JCTEwMjUgMTAxNiAgVHJhdmVsbWF0ZSA2MTIgVFgKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCQkxNDYyIDMzNzAgIFNUQUM5NzIxIEFDCi0JCTE0N2IgMDUwNyAgVEg3SUktUkFJRAotCQk4MDg2IDQ1NTcgIEQ4MTVFR0VXIE1haW5ib2FyZAotCTI0NDYgIDgyODAxQkEvQkFNIEFDJzk3IE1vZGVtCi0JCTEwMjUgMTAxNiAgVHJhdmVsbWF0ZSA2MTIgVFgKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCTI0NDggIDgyODAxIE1vYmlsZSBQQ0kgQnJpZGdlCi0JMjQ0OSAgODI4MDFCQS9CQU0vQ0EvQ0FNIEV0aGVybmV0IENvbnRyb2xsZXIKLQkJMGUxMSAwMDEyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWTQotCQkwZTExIDAwOTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDFjZSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMWRjICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAxZWIgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDFlYyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMjAyICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAyMDUgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDIxNyAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMjM0ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAyM2QgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwMTQgMDI0NCAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTAxNCAwMjQ1ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQkxMDE0IDAyNjUgIFBSTy8xMDAgVkUgRGVza3RvcCBDb25uZWN0aW9uCi0JCTEwMTQgMDI2NyAgUFJPLzEwMCBWRSBEZXNrdG9wIENvbm5lY3Rpb24KLQkJMTAxNCAwMjZhICBQUk8vMTAwIFZFIERlc2t0b3AgQ29ubmVjdGlvbgotCQkxMDlmIDMxNWQgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTEwOWYgMzE4MSAgRXRoZXJFeHByZXNzIFBSTy8xMDAgVkUKLQkJMTE3OSBmZjAxICBQUk8vMTAwIFZFIE5ldHdvcmsgQ29ubmVjdGlvbgotCQkxMTg2IDc4MDEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZFCi0JCTE0NGQgMjYwMiAgSG9tZVBOQSAxTSBDTlIKLQkJODA4NiAzMDEwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQk4MDg2IDMwMTEgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZNCi0JCTgwODYgMzAxMiAgODI1NjJFSCBiYXNlZCBQaG9uZWxpbmUKLQkJODA4NiAzMDEzICBFdGhlckV4cHJlc3MgUFJPLzEwMCBWRQotCQk4MDg2IDMwMTQgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFZNCi0JCTgwODYgMzAxNSAgODI1NjJFSCBiYXNlZCBQaG9uZWxpbmUKLQkJODA4NiAzMDE2ICBFdGhlckV4cHJlc3MgUFJPLzEwMCBQIE1vYmlsZSBDb21ibwotCQk4MDg2IDMwMTcgIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFAgTW9iaWxlCi0JCTgwODYgMzAxOCAgRXRoZXJFeHByZXNzIFBSTy8xMDAKLQkyNDRhICA4MjgwMUJBTSBJREUgVTEwMAotCQkxMDI1IDEwMTYgIFRyYXZlbG1hdGUgNjEyVFgKLQkJMTA0ZCA4MGRmICBWYWlvIFBDRy1GWDQwMwotCTI0NGIgIDgyODAxQkEgSURFIFUxMDAKLQkJMTAxNCAwMWM2ICBOZXR2aXN0YSBBNDAvQTQwcAotCQkxMDI4IDAxMGUgIE9wdGlwbGV4IEdYMjQwCi0JCTEwNDMgODAyNyAgVFVTTDItQyBNYWluYm9hcmQKLQkJMTQ3YiAwNTA3ICBUSDdJSS1SQUlECi0JCTgwODYgNDUzMiAgRDgxNUVFQTIgbWFpbmJvYXJkCi0JCTgwODYgNDU1NyAgRDgxNUVHRVcgTWFpbmJvYXJkCi0JMjQ0YyAgODI4MDFCQU0gSVNBIEJyaWRnZSAoTFBDKQotCTI0NGUgIDgyODAxIFBDSSBCcmlkZ2UKLQkJMTAxNCAwMjY3ICBOZXRWaXN0YSBBMzBwCi0JMjQ1MCAgODI4MDFFIElTQSBCcmlkZ2UgKExQQykKLQkyNDUyICA4MjgwMUUgVVNCCi0JMjQ1MyAgODI4MDFFIFNNQnVzCi0JMjQ1OSAgODI4MDFFIEV0aGVybmV0IENvbnRyb2xsZXIgMAotCTI0NWIgIDgyODAxRSBJREUgVTEwMAotCTI0NWQgIDgyODAxRSBFdGhlcm5ldCBDb250cm9sbGVyIDEKLQkyNDVlICA4MjgwMUUgUENJIEJyaWRnZQotCTI0ODAgIDgyODAxQ0EgTFBDIEludGVyZmFjZSBDb250cm9sbGVyCi0JMjQ4MiAgODI4MDFDQS9DQU0gVVNCIChIdWIgIzEpCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTE1ZDkgMzQ4MCAgUDREUDYKLQkJODA4NiAxOTU4ICB2cHIgTWF0cml4IDE3MEI0Ci0JCTgwODYgMzQyNCAgU0U3NTAxSEcyIE1haW5ib2FyZAotCQk4MDg2IDQ1NDEgIExhdGl0dWRlIEM2NDAKLQkyNDgzICA4MjgwMUNBL0NBTSBTTUJ1cyBDb250cm9sbGVyCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTE1ZDkgMzQ4MCAgUDREUDYKLQkJODA4NiAxOTU4ICB2cHIgTWF0cml4IDE3MEI0Ci0JMjQ4NCAgODI4MDFDQS9DQU0gVVNCIChIdWIgIzIpCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTE1ZDkgMzQ4MCAgUDREUDYKLQkJODA4NiAxOTU4ICB2cHIgTWF0cml4IDE3MEI0Ci0JMjQ4NSAgODI4MDFDQS9DQU0gQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCQkxMDEzIDU5NTkgIENyeXN0YWwgV01EIEF1ZGlvIENvZGVjCi0JCTEwMTQgMDIyMiAgVGhpbmtQYWQgVDIzICgyNjQ3LTRNRykgb3IgQTMwL0EzMHAgKDI2NTIvMjY1MykKLQkJMTAxNCAwNTA4ICBUaGlua1BhZCBUMzAKLQkJMTAxNCAwNTFjICBUaGlua1BhZCBBL1QvWCBTZXJpZXMKLQkJMTA0ZCA4MGU3ICBWQUlPIFBDRy1HUjIxNEVQL0dSMjE0TVAvR1IyMTVNUC9HUjMxNE1QL0dSMzE1TVAKLQkJMTQ0ZCBjMDA2ICB2cHIgTWF0cml4IDE3MEI0Ci0JMjQ4NiAgODI4MDFDQS9DQU0gQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCQkxMDE0IDAyMjMgIFRoaW5rUGFkIEEvVC9YIFNlcmllcwotCQkxMDE0IDA1MDMgIFRoaW5rUGFkIFIzMSAyNjU2QkJHCi0JCTEwMTQgMDUxYSAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwMWYgMTAyNSAgQWNlciA2MjAgU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTExNzkgMDAwMSAgVG9zaGliYSBTYXRlbGxpdGUgMTExMCBaMTUgaW50ZXJuYWwgTW9kZW0KLQkJMTM0ZCA0YzIxICBEZWxsIEluc3Bpcm9uIDIxMDAgaW50ZXJuYWwgbW9kZW0KLQkJMTQ0ZCAyMTE1ICB2cHIgTWF0cml4IDE3MEI0IGludGVybmFsIG1vZGVtCi0JCTE0ZjEgNTQyMSAgTUQ1Nk9SRCBWLjkyIE1EQyBNb2RlbQotCTI0ODcgIDgyODAxQ0EvQ0FNIFVTQiAoSHViICMzKQotCQkxMDE0IDAyMjAgIFRoaW5rUGFkIEEvVC9YIFNlcmllcwotCQkxMDRkIDgwZTcgIFZBSU8gUENHLUdSMjE0RVAvR1IyMTRNUC9HUjIxNU1QL0dSMzE0TVAvR1IzMTVNUAotCQkxNWQ5IDM0ODAgIFA0RFA2Ci0JCTgwODYgMTk1OCAgdnByIE1hdHJpeCAxNzBCNAotCTI0OGEgIDgyODAxQ0FNIElERSBVMTAwCi0JCTEwMTQgMDIyMCAgVGhpbmtQYWQgQS9UL1ggU2VyaWVzCi0JCTEwNGQgODBlNyAgVkFJTyBQQ0ctR1IyMTRFUC9HUjIxNE1QL0dSMjE1TVAvR1IzMTRNUC9HUjMxNU1QCi0JCTgwODYgMTk1OCAgdnByIE1hdHJpeCAxNzBCNAotCQk4MDg2IDQ1NDEgIExhdGl0dWRlIEM2NDAKLQkyNDhiICA4MjgwMUNBIFVsdHJhIEFUQSBTdG9yYWdlIENvbnRyb2xsZXIKLQkJMTVkOSAzNDgwICBQNERQNgotCTI0OGMgIDgyODAxQ0FNIElTQSBCcmlkZ2UgKExQQykKLQkyNGMwICA4MjgwMURCL0RCTCAoSUNINC9JQ0g0LUwpIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCQkxNDYyIDU4MDAgIDg0NVBFIE1heCAoTVMtNjU4MCkKLQkyNGMxICA4MjgwMURCTCAoSUNINC1MKSBJREUgQ29udHJvbGxlcgotCTI0YzIgIDgyODAxREIvREJML0RCTSAoSUNINC9JQ0g0LUwvSUNINC1NKSBVU0IgVUhDSSBDb250cm9sbGVyICMxCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCQkxMDI1IDAwNWEgIFRyYXZlbE1hdGUgMjkwCi0JCTEwMjggMDEyNiAgT3B0aXBsZXggR1gyNjAKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCQkxNTA5IDI5OTAgIEF2ZXJhdGVjIDUxMTBIIGxhcHRvcAotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGMzICA4MjgwMURCL0RCTC9EQk0gKElDSDQvSUNINC1ML0lDSDQtTSkgU01CdXMgQ29udHJvbGxlcgotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JCTE0NTggMjRjMiAgR0EtOFBFNjY3IFVsdHJhCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGM0ICA4MjgwMURCL0RCTC9EQk0gKElDSDQvSUNINC1ML0lDSDQtTSkgVVNCIFVIQ0kgQ29udHJvbGxlciAjMgotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCQkxNDYyIDU4MDAgIDg0NVBFIE1heCAoTVMtNjU4MCkKLQkJMTUwOSAyOTkwICBBdmVyYXRlYyA1MTEwSAotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGM1ICA4MjgwMURCL0RCTC9EQk0gKElDSDQvSUNINC1ML0lDSDQtTSkgQUMnOTcgQXVkaW8gQ29udHJvbGxlcgotCQkwZTExIDAwYjggIEFuYWxvZyBEZXZpY2VzIEluYy4gY29kZWMgW1NvdW5kTUFYXQotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJMTAzYyAwODhjICBuYzgwMDAgbGFwdG9wCi0JCTEwM2MgMDg5MCAgbmM2MDAwIGxhcHRvcAotCQkxMDcxIDgxNjAgIE1JTTIwMDAKLQkJMTQ1OCBhMDAyICBHQS04UEU2NjcgVWx0cmEKLQkJMTQ2MiA1ODAwICA4NDVQRSBNYXggKE1TLTY1ODApCi0JMjRjNiAgODI4MDFEQi9EQkwvREJNIChJQ0g0L0lDSDQtTC9JQ0g0LU0pIEFDJzk3IE1vZGVtIENvbnRyb2xsZXIKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCTI0YzcgIDgyODAxREIvREJML0RCTSAoSUNINC9JQ0g0LUwvSUNINC1NKSBVU0IgVUhDSSBDb250cm9sbGVyICMzCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCQkxMDI1IDAwNWEgIFRyYXZlbE1hdGUgMjkwCi0JCTEwMjggMDEyNiAgT3B0aXBsZXggR1gyNjAKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCQkxNTA5IDI5OTAgIEF2ZXJhdGVjIDUxMTBICi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTI0Y2EgIDgyODAxREJNIChJQ0g0LU0pIElERSBDb250cm9sbGVyCi0JCTEwMjUgMDA1YSAgVHJhdmVsTWF0ZSAyOTAKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTEwM2MgMDg4YyAgbmM4MDAwIGxhcHRvcAotCQkxMDNjIDA4OTAgIG5jNjAwMCBsYXB0b3AKLQkJMTA3MSA4MTYwICBNSU0yMDAwCi0JMjRjYiAgODI4MDFEQiAoSUNINCkgSURFIENvbnRyb2xsZXIKLQkJMTAxNCAwMjY3ICBOZXRWaXN0YSBBMzBwCi0JCTEwMjggMDEyNiAgT3B0aXBsZXggR1gyNjAKLQkJMTQ1OCAyNGMyICBHQS04UEU2NjcgVWx0cmEKLQkJMTQ2MiA1ODAwICA4NDVQRSBNYXggKE1TLTY1ODApCi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCTI0Y2MgIDgyODAxREJNIChJQ0g0LU0pIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JMjRjZCAgODI4MDFEQi9EQk0gKElDSDQvSUNINC1NKSBVU0IyIEVIQ0kgQ29udHJvbGxlcgotCQkxMDE0IDAyNjcgIE5ldFZpc3RhIEEzMHAKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JCTEwNzEgODE2MCAgTUlNMjAwMAotCQkxNDYyIDM5ODEgIDg0NVBFIE1heCAoTVMtNjU4MCkKLQkJMTUwOSAxOTY4ICBBdmVyYXRlYyA1MTEwSAotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNGQwICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBMUEMgSW50ZXJmYWNlIEJyaWRnZQotCTI0ZDEgIDgyODAxRUIgKElDSDUpIFNBVEEgQ29udHJvbGxlcgotCQkxMDNjIDEyYmMgIGQ1MzAgQ01UIChERzc0NkEpCi0JCTE0NTggMjRkMSAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JCTgwODYgNTI0YyAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JMjRkMiAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgVVNCIFVIQ0kgQ29udHJvbGxlciAjMQotCQkxMDI4IDAxODMgIFBvd2VyRWRnZSAxODAwCi0JCTEwM2MgMTJiYyAgZDUzMCBDTVQgKERHNzQ2QSkKLQkJMTA0MyA4MGE2ICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggMjRkMiAgR0EtOElQRTEwMDAvOEtOWFAgbW90aGVyYm9hcmQKLQkJMTQ2MiA3MjgwICA4NjVQRSBOZW8yIChNUy02NzI4KQotCQk4MDg2IDM0MjcgIFM4NzVXUDEtRSBtYWluYm9hcmQKLQkJODA4NiA1MjRjICBEODY1UEVSTCBtYWluYm9hcmQKLQkyNGQzICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBTTUJ1cyBDb250cm9sbGVyCi0JCTEwNDMgODBhNiAgUDRQODAwIE1haW5ib2FyZAotCQkxNDU4IDI0ZDIgIEdBLThJUEUxMDAwIFBybzIgbW90aGVyYm9hcmQgKDg2NVBFKQotCQkxNDYyIDcyODAgIDg2NVBFIE5lbzIgKE1TLTY3MjgpCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCQk4MDg2IDUyNGMgIEQ4NjVQRVJMIG1haW5ib2FyZAotCTI0ZDQgIDgyODAxRUIvRVIgKElDSDUvSUNINVIpIFVTQiBVSENJIENvbnRyb2xsZXIgIzIKLQkJMTAyOCAwMTgzICBQb3dlckVkZ2UgMTgwMAotCQkxMDNjIDEyYmMgIGQ1MzAgQ01UIChERzc0NkEpCi0JCTEwNDMgODBhNiAgUDRQODAwIE1haW5ib2FyZAotCQkxNDU4IDI0ZDIgIEdBLThJUEUxMDAwIFBybzIgbW90aGVyYm9hcmQgKDg2NVBFKQotCQkxNDYyIDcyODAgIDg2NVBFIE5lbzIgKE1TLTY3MjgpCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCQk4MDg2IDUyNGMgIEQ4NjVQRVJMIG1haW5ib2FyZAotCTI0ZDUgIDgyODAxRUIvRVIgKElDSDUvSUNINVIpIEFDJzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkJMTAzYyAxMmJjICBBbmFsb2cgRGV2aWNlcyBjb2RlYyBbU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvXQotCQkxMDQzIDgwZjMgIFA0UDgwMCBNYWluYm9hcmQKLSMgQWdhaW4sIEkgc3VwcG9zZSB0aGV5IHVzZSB0aGUgc2FtZSBpbiBkaWZmZXJlbnQgc3Vic3lzdGVtcwotCQkxNDU4IGEwMDIgIEdBLThJUEUxMDAwLzhLTlhQIG1vdGhlcmJvYXJkCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJODA4NiBhMDAwICBEODY1UEVSTCBtYWluYm9hcmQKLQkJODA4NiBlMDAwICBEODY1UEVSTCBtYWluYm9hcmQKLQkyNGQ2ICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JMjRkNyAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgVVNCIFVIQ0kgIzMKLQkJMTAyOCAwMTgzICBQb3dlckVkZ2UgMTgwMAotCQkxMDNjIDEyYmMgIGQ1MzAgQ01UIChERzc0NkEpCi0JCTEwNDMgODBhNiAgUDRQODAwIE1haW5ib2FyZAotCQkxNDU4IDI0ZDIgIEdBLThJUEUxMDAwIFBybzIgbW90aGVyYm9hcmQgKDg2NVBFKQotCQkxNDYyIDcyODAgIDg2NVBFIE5lbzIgKE1TLTY3MjgpCi0JCTgwODYgMzQyNyAgUzg3NVdQMS1FIG1haW5ib2FyZAotCQk4MDg2IDUyNGMgIEQ4NjVQRVJMIG1haW5ib2FyZAotCTI0ZGIgIDgyODAxRUIvRVIgKElDSDUvSUNINVIpIElERSBDb250cm9sbGVyCi0JCTEwM2MgMTJiYyAgZDUzMCBDTVQgKERHNzQ2QSkKLQkJMTA0MyA4MGE2ICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggMjRkMiAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJMTQ2MiA3NTgwICBNU0kgODc1UAotCQk4MDg2IDI0ZGIgIFA0QzgwMCBNYWluYm9hcmQKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JCTgwODYgNTI0YyAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JMjRkYyAgODI4MDFFQiAoSUNINSkgTFBDIEludGVyZmFjZSBCcmlkZ2UKLQkyNGRkICA4MjgwMUVCL0VSIChJQ0g1L0lDSDVSKSBVU0IyIEVIQ0kgQ29udHJvbGxlcgotCQkxMDI4IDAxODMgIFBvd2VyRWRnZSAxODAwCi0JCTEwM2MgMTJiYyAgZDUzMCBDTVQgKERHNzQ2QSkKLQkJMTA0MyA4MGE2ICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggNTAwNiAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JCTE0NjIgNzI4MCAgODY1UEUgTmVvMiAoTVMtNjcyOCkKLQkJODA4NiAzNDI3ICBTODc1V1AxLUUgbWFpbmJvYXJkCi0JCTgwODYgNTI0YyAgRDg2NVBFUkwgbWFpbmJvYXJkCi0JMjRkZSAgODI4MDFFQi9FUiAoSUNINS9JQ0g1UikgVVNCIFVIQ0kgQ29udHJvbGxlciAjNAotCQkxMDQzIDgwYTYgIFA0UDgwMCBNYWluYm9hcmQKLQkJMTQ1OCAyNGQyICBHQS04SVBFMTAwMCBQcm8yIG1vdGhlcmJvYXJkICg4NjVQRSkKLQkJMTQ2MiA3MjgwICA4NjVQRSBOZW8yIChNUy02NzI4KQotCQk4MDg2IDM0MjcgIFM4NzVXUDEtRSBtYWluYm9hcmQKLQkJODA4NiA1MjRjICBEODY1UEVSTCBtYWluYm9hcmQKLQkyNGRmICA4MjgwMUVSIChJQ0g1UikgU0FUQSBDb250cm9sbGVyCi0JMjUwMCAgODI4MjAgODIwIChDYW1pbm8pIENoaXBzZXQgSG9zdCBCcmlkZ2UgKE1DSCkKLQkJMTAyOCAwMDk1ICBQcmVjaXNpb24gV29ya3N0YXRpb24gMjIwIENoaXBzZXQKLQkJMTA0MyA4MDFjICBQM0MtMjAwMCBzeXN0ZW0gY2hpcHNldAotCTI1MDEgIDgyODIwIDgyMCAoQ2FtaW5vKSBDaGlwc2V0IEhvc3QgQnJpZGdlIChNQ0gpCi0JCTEwNDMgODAxYyAgUDNDLTIwMDAgc3lzdGVtIGNoaXBzZXQKLQkyNTBiICA4MjgyMCA4MjAgKENhbWlubykgQ2hpcHNldCBIb3N0IEJyaWRnZQotCTI1MGYgIDgyODIwIDgyMCAoQ2FtaW5vKSBDaGlwc2V0IEFHUCBCcmlkZ2UKLQkyNTIwICA4MjgwNUFBIE1USCBNZW1vcnkgVHJhbnNsYXRvciBIdWIKLQkyNTIxICA4MjgwNEFBIE1SSC1TIE1lbW9yeSBSZXBlYXRlciBIdWIgZm9yIFNEUkFNCi0JMjUzMCAgODI4NTAgODUwIChUZWhhbWEpIENoaXBzZXQgSG9zdCBCcmlkZ2UgKE1DSCkKLQkJMTQ3YiAwNTA3ICBUSDdJSS1SQUlECi0JMjUzMSAgODI4NjAgODYwIChXb21iYXQpIENoaXBzZXQgSG9zdCBCcmlkZ2UgKE1DSCkKLQkyNTMyICA4Mjg1MCA4NTAgKFRlaGFtYSkgQ2hpcHNldCBBR1AgQnJpZGdlCi0JMjUzMyAgODI4NjAgODYwIChXb21iYXQpIENoaXBzZXQgQUdQIEJyaWRnZQotCTI1MzQgIDgyODYwIDg2MCAoV29tYmF0KSBDaGlwc2V0IFBDSSBCcmlkZ2UKLQkyNTQwICBFNzUwMCBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkJMTVkOSAzNDgwICBQNERQNgotCTI1NDEgIEU3NTAwL0U3NTAxIEhvc3QgUkFTVU0gQ29udHJvbGxlcgotCQkxNWQ5IDM0ODAgIFA0RFA2Ci0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCQk4MDg2IDM0MjQgIFNFNzUwMUhHMiBNYWluYm9hcmQKLQkyNTQzICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEIgUENJLXRvLVBDSSBCcmlkZ2UKLQkyNTQ0ICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEIgUkFTVU0gQ29udHJvbGxlcgotCQk0YzUzIDEwOTAgIEN4OSAvIFZ4OSBtYWluYm9hcmQKLQkyNTQ1ICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEMgUENJLXRvLVBDSSBCcmlkZ2UKLQkyNTQ2ICBFNzUwMC9FNzUwMSBIdWIgSW50ZXJmYWNlIEMgUkFTVU0gQ29udHJvbGxlcgotCTI1NDcgIEU3NTAwL0U3NTAxIEh1YiBJbnRlcmZhY2UgRCBQQ0ktdG8tUENJIEJyaWRnZQotCTI1NDggIEU3NTAwL0U3NTAxIEh1YiBJbnRlcmZhY2UgRCBSQVNVTSBDb250cm9sbGVyCi0JMjU0YyAgRTc1MDEgTWVtb3J5IENvbnRyb2xsZXIgSHViCi0JCTRjNTMgMTA5MCAgQ3g5IC8gVng5IG1haW5ib2FyZAotCQk4MDg2IDM0MjQgIFNFNzUwMUhHMiBNYWluYm9hcmQKLQkyNTUwICBFNzUwNSBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkyNTUxICBFNzUwNS9FNzIwNSBTZXJpZXMgUkFTIENvbnRyb2xsZXIKLQkyNTUyICBFNzUwNS9FNzIwNSBQQ0ktdG8tQUdQIEJyaWRnZQotCTI1NTMgIEU3NTA1IEh1YiBJbnRlcmZhY2UgQiBQQ0ktdG8tUENJIEJyaWRnZQotCTI1NTQgIEU3NTA1IEh1YiBJbnRlcmZhY2UgQiBQQ0ktdG8tUENJIEJyaWRnZSBSQVMgQ29udHJvbGxlcgotCTI1NWQgIEU3MjA1IE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTI1NjAgIDgyODQ1Ry9HTFtCcm9va2RhbGUtR10vR0UvUEUgRFJBTSBDb250cm9sbGVyL0hvc3QtSHViIEludGVyZmFjZQotCQkxMDI4IDAxMjYgIE9wdGlwbGV4IEdYMjYwCi0JCTE0NTggMjU2MCAgR0EtOFBFNjY3IFVsdHJhCi0JCTE0NjIgNTgwMCAgODQ1UEUgTWF4IChNUy02NTgwKQotCTI1NjEgIDgyODQ1Ry9HTFtCcm9va2RhbGUtR10vR0UvUEUgSG9zdC10by1BR1AgQnJpZGdlCi0JMjU2MiAgODI4NDVHL0dMW0Jyb29rZGFsZS1HXS9HRSBDaGlwc2V0IEludGVncmF0ZWQgR3JhcGhpY3MgRGV2aWNlCi0JCTEwMTQgMDI2NyAgTmV0VmlzdGEgQTMwcAotCTI1NzAgIDgyODY1Ry9QRS9QIERSQU0gQ29udHJvbGxlci9Ib3N0LUh1YiBJbnRlcmZhY2UKLQkJMTA0MyA4MGYyICBQNFA4MDAgTWFpbmJvYXJkCi0JCTE0NTggMjU3MCAgR0EtOElQRTEwMDAgUHJvMiBtb3RoZXJib2FyZCAoODY1UEUpCi0JMjU3MSAgODI4NjVHL1BFL1AgUENJIHRvIEFHUCBDb250cm9sbGVyCi0JMjU3MiAgODI4NjVHIEludGVncmF0ZWQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTI1NzMgIDgyODY1Ry9QRS9QIFBDSSB0byBDU0EgQnJpZGdlCi0JMjU3NiAgODI4NjVHL1BFL1AgUHJvY2Vzc29yIHRvIEkvTyBNZW1vcnkgSW50ZXJmYWNlCi0JMjU3OCAgODI4NzVQL0U3MjEwIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCQkxNDU4IDI1NzggIEdBLThLTlhQIG1vdGhlcmJvYXJkICg4NzVQKQotCQkxNDYyIDc1ODAgIE1TLTY3NTggKDg3NVAgTmVvKQotIyBNb3RoZXJib2FyZCBQNFNDRQotCQkxNWQ5IDQ1ODAgIFN1cGVyIE1pY3JvIENvbXB1dGVyIEluYy4gUDRTQ0UKLQkyNTc5ICA4Mjg3NVAgUHJvY2Vzc29yIHRvIEFHUCBDb250cm9sbGVyCi0JMjU3YiAgODI4NzVQL0U3MjEwIFByb2Nlc3NvciB0byBQQ0kgdG8gQ1NBIEJyaWRnZQotCTI1N2UgIDgyODc1UC9FNzIxMCBQcm9jZXNzb3IgdG8gSS9PIE1lbW9yeSBJbnRlcmZhY2UKLQkyNTgwICA5MTVHL1AvR1YvR0wvUEwvOTEwR0wgUHJvY2Vzc29yIHRvIEkvTyBDb250cm9sbGVyCi0JMjU4MSAgOTE1Ry9QL0dWL0dML1BMLzkxMEdMIFBDSSBFeHByZXNzIFJvb3QgUG9ydAotCTI1ODIgIDgyOTE1Ry9HVi85MTBHTCBFeHByZXNzIENoaXBzZXQgRmFtaWx5IEdyYXBoaWNzIENvbnRyb2xsZXIKLQkJMTAyOCAxMDc5ICBPcHRpcGxleCBHWDI4MAotCTI1ODQgIDkyNVgvWEUgTWVtb3J5IENvbnRyb2xsZXIgSHViCi0JMjU4NSAgOTI1WC9YRSBQQ0kgRXhwcmVzcyBSb290IFBvcnQKLQkyNTg4ICBFNzIyMC9FNzIyMSBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkyNTg5ICBFNzIyMC9FNzIyMSBQQ0kgRXhwcmVzcyBSb290IFBvcnQKLQkyNThhICBFNzIyMSBJbnRlZ3JhdGVkIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNTkwICBNb2JpbGUgOTE1R00vUE0vR01TLzkxMEdNTCBFeHByZXNzIFByb2Nlc3NvciB0byBEUkFNIENvbnRyb2xsZXIKLQkyNTkxICBNb2JpbGUgOTE1R00vUE0gRXhwcmVzcyBQQ0kgRXhwcmVzcyBSb290IFBvcnQKLQkyNTkyICBNb2JpbGUgOTE1R00vR01TLzkxMEdNTCBFeHByZXNzIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNWExICA2MzAwRVNCIExQQyBJbnRlcmZhY2UgQ29udHJvbGxlcgotCTI1YTIgIDYzMDBFU0IgUEFUQSBTdG9yYWdlIENvbnRyb2xsZXIKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMjVhMyAgNjMwMEVTQiBTQVRBIFN0b3JhZ2UgQ29udHJvbGxlcgotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkyNWE0ICA2MzAwRVNCIFNNQnVzIENvbnRyb2xsZXIKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMjVhNiAgNjMwMEVTQiBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JCTRjNTMgMTBiMCAgQ0w5IG1haW5ib2FyZAotCTI1YTcgIDYzMDBFU0IgQUMnOTcgTW9kZW0gQ29udHJvbGxlcgotCTI1YTkgIDYzMDBFU0IgVVNCIFVuaXZlcnNhbCBIb3N0IENvbnRyb2xsZXIKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMjVhYSAgNjMwMEVTQiBVU0IgVW5pdmVyc2FsIEhvc3QgQ29udHJvbGxlcgotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkyNWFiICA2MzAwRVNCIFdhdGNoZG9nIFRpbWVyCi0JCTRjNTMgMTBiMCAgQ0w5IG1haW5ib2FyZAotCTI1YWMgIDYzMDBFU0IgSS9PIEFkdmFuY2VkIFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlcgotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkyNWFkICA2MzAwRVNCIFVTQjIgRW5oYW5jZWQgSG9zdCBDb250cm9sbGVyCi0JMjVhZSAgNjMwMEVTQiA2NC1iaXQgUENJLVggQnJpZGdlCi0JMjViMCAgNjMwMEVTQiBTQVRBIFJBSUQgQ29udHJvbGxlcgotCTI2MDAgIEU4NTAwIEh1YiBJbnRlcmZhY2UKLQkyNjAxICBFODUwMCBQQ0kgRXhwcmVzcyB4NCBQb3J0IEQKLQkyNjAyICBFODUwMCBQQ0kgRXhwcmVzcyB4NCBQb3J0IEMwCi0JMjYwMyAgRTg1MDAgUENJIEV4cHJlc3MgeDQgUG9ydCBDMQotCTI2MDQgIEU4NTAwIFBDSSBFeHByZXNzIHg0IFBvcnQgQjAKLQkyNjA1ICBFODUwMCBQQ0kgRXhwcmVzcyB4NCBQb3J0IEIxCi0JMjYwNiAgRTg1MDAgUENJIEV4cHJlc3MgeDQgUG9ydCBBMAotCTI2MDcgIEU4NTAwIFBDSSBFeHByZXNzIHg0IFBvcnQgQTEKLQkyNjA4ICBFODUwMCBQQ0kgRXhwcmVzcyB4OCBQb3J0IEMKLQkyNjA5ICBFODUwMCBQQ0kgRXhwcmVzcyB4OCBQb3J0IEIKLQkyNjBhICBFODUwMCBQQ0kgRXhwcmVzcyB4OCBQb3J0IEEKLQkyNjBjICBFODUwMCBJTUkgUmVnaXN0ZXJzCi0JMjYxMCAgRTg1MDAgU3lzdGVtIEJ1cywgQm9vdCwgYW5kIEludGVycnVwdCBSZWdpc3RlcnMKLQkyNjExICBFODUwMCBBZGRyZXNzIE1hcHBpbmcgUmVnaXN0ZXJzCi0JMjYxMiAgRTg1MDAgUkFTIFJlZ2lzdGVycwotCTI2MTMgIEU4NTAwIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2MTQgIEU4NTAwIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2MTUgIEU4NTAwIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXJzCi0JMjYxNyAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxOCAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxOSAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxYSAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxYiAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxYyAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxZCAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYxZSAgRTg1MDAgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYyMCAgRTg1MDAgZVh0ZXJuYWwgTWVtb3J5IEJyaWRnZQotCTI2MjEgIEU4NTAwIFhNQiBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVycwotCTI2MjIgIEU4NTAwIFhNQiBNZW1vcnkgSW50ZXJsZWF2aW5nIFJlZ2lzdGVycwotCTI2MjMgIEU4NTAwIFhNQiBERFIgSW5pdGlhbGl6YXRpb24gYW5kIENhbGlicmF0aW9uCi0JMjYyNCAgRTg1MDAgWE1CIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2MjUgIEU4NTAwIFhNQiBSZXNlcnZlZCBSZWdpc3RlcnMKLQkyNjI2ICBFODUwMCBYTUIgUmVzZXJ2ZWQgUmVnaXN0ZXJzCi0JMjYyNyAgRTg1MDAgWE1CIFJlc2VydmVkIFJlZ2lzdGVycwotCTI2NDAgIDgyODAxRkIvRlIgKElDSDYvSUNINlIpIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JMjY0MSAgODI4MDFGQk0gKElDSDZNKSBMUEMgSW50ZXJmYWNlIEJyaWRnZQotCTI2NDIgIDgyODAxRlcvRlJXIChJQ0g2Vy9JQ0g2UlcpIExQQyBJbnRlcmZhY2UgQnJpZGdlCi0JMjY1MSAgODI4MDFGQi9GVyAoSUNINi9JQ0g2VykgU0FUQSBDb250cm9sbGVyCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjUyICA4MjgwMUZSL0ZSVyAoSUNINlIvSUNINlJXKSBTQVRBIENvbnRyb2xsZXIKLQkyNjUzICA4MjgwMUZCTSAoSUNINk0pIFNBVEEgQ29udHJvbGxlcgotCTI2NTggIDgyODAxRkIvRkJNL0ZSL0ZXL0ZSVyAoSUNINiBGYW1pbHkpIFVTQiBVSENJICMxCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjU5ICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBVU0IgVUhDSSAjMgotCQkxMDI4IDAxNzkgIE9wdGlwbGV4IEdYMjgwCi0JMjY1YSAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgVVNCIFVIQ0kgIzMKLQkJMTAyOCAwMTc5ICBPcHRpcGxleCBHWDI4MAotCTI2NWIgIDgyODAxRkIvRkJNL0ZSL0ZXL0ZSVyAoSUNINiBGYW1pbHkpIFVTQiBVSENJICM0Ci0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjVjICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBVU0IyIEVIQ0kgQ29udHJvbGxlcgotCQkxMDI4IDAxNzkgIE9wdGlwbGV4IEdYMjgwCi0JMjY2MCAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCAxCi0JMjY2MiAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCAyCi0JMjY2NCAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCAzCi0JMjY2NiAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgUENJIEV4cHJlc3MgUG9ydCA0Ci0JMjY2OCAgODI4MDFGQi9GQk0vRlIvRlcvRlJXIChJQ0g2IEZhbWlseSkgSGlnaCBEZWZpbml0aW9uIEF1ZGlvIENvbnRyb2xsZXIKLQkyNjZhICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBTTUJ1cyBDb250cm9sbGVyCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjZjICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBMQU4gQ29udHJvbGxlcgotCTI2NmQgIDgyODAxRkIvRkJNL0ZSL0ZXL0ZSVyAoSUNINiBGYW1pbHkpIEFDJzk3IE1vZGVtIENvbnRyb2xsZXIKLQkyNjZlICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBBQyc5NyBBdWRpbyBDb250cm9sbGVyCi0JCTEwMjggMDE3OSAgT3B0aXBsZXggR1gyODAKLQkyNjZmICA4MjgwMUZCL0ZCTS9GUi9GVy9GUlcgKElDSDYgRmFtaWx5KSBJREUgQ29udHJvbGxlcgotCTI3NzAgIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTI3NzEgIFBDSSBFeHByZXNzIEdyYXBoaWNzIFBvcnQKLQkyNzcyICBJbnRlZ3JhdGVkIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNzc0ICBXb3Jrc3RhdGlvbiBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkyNzc1ICBQQ0kgRXhwcmVzcyBHcmFwaGljcyBQb3J0Ci0JMjc3NiAgSW50ZWdyYXRlZCBHcmFwaGljcyBDb250cm9sbGVyCi0JMjc3OCAgU2VydmVyIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTI3NzkgIFBDSSBFeHByZXNzIFJvb3QgUG9ydAotCTI3ODIgIDgyOTE1RyBFeHByZXNzIENoaXBzZXQgRmFtaWx5IEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyNzkyICBNb2JpbGUgOTE1R00vR01TLzkxMEdNTCBFeHByZXNzIEdyYXBoaWNzIENvbnRyb2xsZXIKLQkyN2I4ICBJL08gQ29udHJvbGxlciBIdWIgTFBDCi0JMjdiOSAgTW9iaWxlIEkvTyBDb250cm9sbGVyIEh1YiBMUEMKLQkyN2MwICBJL08gQ29udHJvbGxlciBIdWIgU0FUQSBjYz1JREUKLQkyN2MxICBJL08gQ29udHJvbGxlciBIdWIgU0FUQSBjYz1BSENJCi0JMjdjMyAgSS9PIENvbnRyb2xsZXIgSHViIFNBVEEgY2M9UkFJRAotCTI3YzQgIE1vYmlsZSBJL08gQ29udHJvbGxlciBIdWIgU0FUQSBjYz1JREUKLQkyN2M1ICBNb2JpbGUgSS9PIENvbnRyb2xsZXIgSHViIFNBVEEgY2M9QUhDSQotCTI3YzggIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjMQotCTI3YzkgIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjMgotCTI3Y2EgIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjMwotCTI3Y2IgIEkvTyBDb250cm9sbGVyIEh1YiBVSENJIFVTQiAjNAotCTI3Y2MgIEkvTyBDb250cm9sbGVyIEh1YiBFSENJIFVTQgotCTI3ZDAgIEkvTyBDb250cm9sbGVyIEh1YiBQQ0kgRXhwcmVzcyBQb3J0IDEKLQkyN2QyICBJL08gQ29udHJvbGxlciBIdWIgUENJIEV4cHJlc3MgUG9ydCAyCi0JMjdkNCAgSS9PIENvbnRyb2xsZXIgSHViIFBDSSBFeHByZXNzIFBvcnQgMwotCTI3ZDYgIEkvTyBDb250cm9sbGVyIEh1YiBQQ0kgRXhwcmVzcyBQb3J0IDQKLQkyN2Q4ICBJL08gQ29udHJvbGxlciBIdWIgSGlnaCBEZWZpbml0aW9uIEF1ZGlvCi0JMjdkYSAgSS9PIENvbnRyb2xsZXIgSHViIFNNQnVzCi0JMjdkYyAgSS9PIENvbnRyb2xsZXIgSHViIExBTgotCTI3ZGQgIEkvTyBDb250cm9sbGVyIEh1YiBBQyc5NyBNb2RlbQotCTI3ZGUgIEkvTyBDb250cm9sbGVyIEh1YiBBQyc5NyBBdWRpbwotCTI3ZGYgIEkvTyBDb250cm9sbGVyIEh1YiBQQVRBCi0JMjdlMCAgSS9PIENvbnRyb2xsZXIgSHViIFBDSSBFeHByZXNzIFBvcnQgNQotCTI3ZTIgIEkvTyBDb250cm9sbGVyIEh1YiBQQ0kgRXhwcmVzcyBQb3J0IDYKLQkzMDkyICBJbnRlZ3JhdGVkIFJBSUQKLQkzMjAwICBHRDMxMjQ0IFBDSS1YIFNBVEEgSEJBCi0JMzM0MCAgODI4NTVQTSBQcm9jZXNzb3IgdG8gSS9PIENvbnRyb2xsZXIKLQkJMTAyNSAwMDVhICBUcmF2ZWxNYXRlIDI5MAotCQkxMDNjIDA4OGMgIG5jODAwMCBsYXB0b3AKLQkJMTAzYyAwODkwICBuYzYwMDAgbGFwdG9wCi0JMzM0MSAgODI4NTVQTSBQcm9jZXNzb3IgdG8gQUdQIENvbnRyb2xsZXIKLQkzNTc1ICA4MjgzMCA4MzAgQ2hpcHNldCBIb3N0IEJyaWRnZQotCQkxMDE0IDAyMWQgIFRoaW5rUGFkIEEvVC9YIFNlcmllcwotCQkxMDRkIDgwZTcgIFZBSU8gUENHLUdSMjE0RVAvR1IyMTRNUC9HUjIxNU1QL0dSMzE0TVAvR1IzMTVNUAotCTM1NzYgIDgyODMwIDgzMCBDaGlwc2V0IEFHUCBCcmlkZ2UKLQkzNTc3ICA4MjgzMCBDR0MgW0NoaXBzZXQgR3JhcGhpY3MgQ29udHJvbGxlcl0KLQkJMTAxNCAwNTEzICBUaGlua1BhZCBBL1QvWCBTZXJpZXMKLQkzNTc4ICA4MjgzMCA4MzAgQ2hpcHNldCBIb3N0IEJyaWRnZQotCTM1ODAgIDgyODUyLzgyODU1IEdNL0dNRS9QTS9HTVYgUHJvY2Vzc29yIHRvIEkvTyBDb250cm9sbGVyCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkzNTgxICA4Mjg1Mi84Mjg1NSBHTS9HTUUvUE0vR01WIFByb2Nlc3NvciB0byBBR1AgQ29udHJvbGxlcgotCTM1ODIgIDgyODUyLzg1NUdNIEludGVncmF0ZWQgR3JhcGhpY3MgRGV2aWNlCi0JCTEwMjggMDE2MyAgTGF0aXR1ZGUgRDUwNQotCQk0YzUzIDEwYjAgIENMOSBtYWluYm9hcmQKLQkzNTg0ICA4Mjg1Mi84Mjg1NSBHTS9HTUUvUE0vR01WIFByb2Nlc3NvciB0byBJL08gQ29udHJvbGxlcgotCQkxMDI4IDAxNjMgIExhdGl0dWRlIEQ1MDUKLQkJNGM1MyAxMGIwICBDTDkgbWFpbmJvYXJkCi0JMzU4NSAgODI4NTIvODI4NTUgR00vR01FL1BNL0dNViBQcm9jZXNzb3IgdG8gSS9PIENvbnRyb2xsZXIKLQkJMTAyOCAwMTYzICBMYXRpdHVkZSBENTA1Ci0JCTRjNTMgMTBiMCAgQ0w5IG1haW5ib2FyZAotCTM1OTAgIEU3NTIwIE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTM1OTEgIEU3NTI1L0U3NTIwIEVycm9yIFJlcG9ydGluZyBSZWdpc3RlcnMKLQkzNTkyICBFNzMyMCBNZW1vcnkgQ29udHJvbGxlciBIdWIKLQkzNTkzICBFNzMyMCBFcnJvciBSZXBvcnRpbmcgUmVnaXN0ZXJzCi0JMzU5NCAgRTc1MjAgRE1BIENvbnRyb2xsZXIKLQkzNTk1ICBFNzUyNS9FNzUyMC9FNzMyMCBQQ0kgRXhwcmVzcyBQb3J0IEEKLQkzNTk2ICBFNzUyNS9FNzUyMC9FNzMyMCBQQ0kgRXhwcmVzcyBQb3J0IEExCi0JMzU5NyAgRTc1MjUvRTc1MjAgUENJIEV4cHJlc3MgUG9ydCBCCi0JMzU5OCAgRTc1MjAgUENJIEV4cHJlc3MgUG9ydCBCMQotCTM1OTkgIEU3NTIwIFBDSSBFeHByZXNzIFBvcnQgQwotCTM1OWEgIEU3NTIwIFBDSSBFeHByZXNzIFBvcnQgQzEKLQkzNTliICBFNzUyNS9FNzUyMC9FNzMyMCBFeHRlbmRlZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycwotCTM1OWUgIEU3NTI1IE1lbW9yeSBDb250cm9sbGVyIEh1YgotCTQyMjAgIFBSTy9XaXJlbGVzcyAyMjAwQkcKLQk0MjIzICBQUk8vV2lyZWxlc3MgMjkxNUFCRyBNaW5pUENJIEFkYXB0ZXIKLQk1MjAwICBFdGhlckV4cHJlc3MgUFJPLzEwMCBJbnRlbGxpZ2VudCBTZXJ2ZXIKLQk1MjAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBJbnRlbGxpZ2VudCBTZXJ2ZXIKLQkJODA4NiAwMDAxICBFdGhlckV4cHJlc3MgUFJPLzEwMCBTZXJ2ZXIgRXRoZXJuZXQgQWRhcHRlcgotCTUzMGQgIDgwMzEwIElPUCBbSU8gUHJvY2Vzc29yXQotCTcwMDAgIDgyMzcxU0IgUElJWDMgSVNBIFtOYXRvbWEvVHJpdG9uIElJXQotCTcwMTAgIDgyMzcxU0IgUElJWDMgSURFIFtOYXRvbWEvVHJpdG9uIElJXQotCTcwMjAgIDgyMzcxU0IgUElJWDMgVVNCIFtOYXRvbWEvVHJpdG9uIElJXQotCTcwMzAgIDQzMFZYIC0gODI0MzdWWCBUVlggW1RyaXRvbiBWWF0KLQk3MDUwICBJbnRlbCBJbnRlcmNhc3QgVmlkZW8gQ2FwdHVyZSBDYXJkCi0JNzEwMCAgNDMwVFggLSA4MjQzOVRYIE1UWEMKLQk3MTEwICA4MjM3MUFCL0VCL01CIFBJSVg0IElTQQotCQkxNWFkIDE5NzYgIHZpcnR1YWxIVyB2MwotCTcxMTEgIDgyMzcxQUIvRUIvTUIgUElJWDQgSURFCi0JCTE1YWQgMTk3NiAgdmlydHVhbEhXIHYzCi0JNzExMiAgODIzNzFBQi9FQi9NQiBQSUlYNCBVU0IKLQkJMTVhZCAxOTc2ICB2aXJ0dWFsSFcgdjMKLQk3MTEzICA4MjM3MUFCL0VCL01CIFBJSVg0IEFDUEkKLQkJMTVhZCAxOTc2ICB2aXJ0dWFsSFcgdjMKLQk3MTIwICA4MjgxMCBHTUNIIFtHcmFwaGljcyBNZW1vcnkgQ29udHJvbGxlciBIdWJdCi0JCTRjNTMgMTA0MCAgQ0w3IG1haW5ib2FyZAotCQk0YzUzIDEwNjAgIFBDNyBtYWluYm9hcmQKLQk3MTIxICA4MjgxMCBDR0MgW0NoaXBzZXQgR3JhcGhpY3MgQ29udHJvbGxlcl0KLQkJNGM1MyAxMDQwICBDTDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA2MCAgUEM3IG1haW5ib2FyZAotCQk4MDg2IDQzNDEgIENheW1hbiAoQ0E4MTApIE1haW5ib2FyZAotCTcxMjIgIDgyODEwIERDLTEwMCBHTUNIIFtHcmFwaGljcyBNZW1vcnkgQ29udHJvbGxlciBIdWJdCi0JNzEyMyAgODI4MTAgREMtMTAwIENHQyBbQ2hpcHNldCBHcmFwaGljcyBDb250cm9sbGVyXQotCTcxMjQgIDgyODEwRSBEQy0xMzMgR01DSCBbR3JhcGhpY3MgTWVtb3J5IENvbnRyb2xsZXIgSHViXQotCTcxMjUgIDgyODEwRSBEQy0xMzMgQ0dDIFtDaGlwc2V0IEdyYXBoaWNzIENvbnRyb2xsZXJdCi0JNzEyNiAgODI4MTAgREMtMTMzIFN5c3RlbSBhbmQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTcxMjggIDgyODEwLU0gREMtMTAwIFN5c3RlbSBhbmQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTcxMmEgIDgyODEwLU0gREMtMTMzIFN5c3RlbSBhbmQgR3JhcGhpY3MgQ29udHJvbGxlcgotCTcxODAgIDQ0MExYL0VYIC0gODI0NDNMWC9FWCBIb3N0IGJyaWRnZQotCTcxODEgIDQ0MExYL0VYIC0gODI0NDNMWC9FWCBBR1AgYnJpZGdlCi0JNzE5MCAgNDQwQlgvWlgvRFggLSA4MjQ0M0JYL1pYL0RYIEhvc3QgYnJpZGdlCi0JCTBlMTEgMDUwMCAgQXJtYWRhIDE3NTAgTGFwdG9wIFN5c3RlbSBDaGlwc2V0Ci0JCTBlMTEgYjExMCAgQXJtYWRhIE03MDAvRTUwMAotCQkxMTc5IDAwMDEgIFRvc2hpYmEgVGVjcmEgODEwMCBMYXB0b3AgU3lzdGVtIENoaXBzZXQKLQkJMTVhZCAxOTc2ICB2aXJ0dWFsSFcgdjMKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCTcxOTEgIDQ0MEJYL1pYL0RYIC0gODI0NDNCWC9aWC9EWCBBR1AgYnJpZGdlCi0JNzE5MiAgNDQwQlgvWlgvRFggLSA4MjQ0M0JYL1pYL0RYIEhvc3QgYnJpZGdlIChBR1AgZGlzYWJsZWQpCi0JCTBlMTEgMDQ2MCAgQXJtYWRhIDE3MDAgTGFwdG9wIFN5c3RlbSBDaGlwc2V0Ci0JCTRjNTMgMTAwMCAgQ0M3L0NSNy9DUDcvVkM3L1ZQNy9WUjcgbWFpbmJvYXJkCi0JNzE5NCAgODI0NDBNWCBIb3N0IEJyaWRnZQotCQkxMDMzIDAwMDAgIFZlcnNhIE5vdGUgVnhpCi0JCTRjNTMgMTBhMCAgQ0EzL0NSMyBtYWluYm9hcmQKLQk3MTk1ICA4MjQ0ME1YIEFDJzk3IEF1ZGlvIENvbnRyb2xsZXIKLQkJMTAzMyA4MGNjICBWZXJzYSBOb3RlIFZYaQotCQkxMGNmIDEwOTkgIFFTb3VuZF9TaWdtYVRlbCBTdGFjOTcgUENJIEF1ZGlvCi0JCTExZDQgMDA0MCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JCTExZDQgMDA0OCAgU291bmRNQVggSW50ZWdyYXRlZCBEaWdpdGFsIEF1ZGlvCi0JNzE5NiAgODI0NDBNWCBBQyc5NyBNb2RlbSBDb250cm9sbGVyCi0JNzE5OCAgODI0NDBNWCBJU0EgQnJpZGdlCi0JNzE5OSAgODI0NDBNWCBFSURFIENvbnRyb2xsZXIKLQk3MTlhICA4MjQ0ME1YIFVTQiBVbml2ZXJzYWwgSG9zdCBDb250cm9sbGVyCi0JNzE5YiAgODI0NDBNWCBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2xsZXIKLQk3MWEwICA0NDBHWCAtIDgyNDQzR1ggSG9zdCBicmlkZ2UKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCTcxYTEgIDQ0MEdYIC0gODI0NDNHWCBBR1AgYnJpZGdlCi0JNzFhMiAgNDQwR1ggLSA4MjQ0M0dYIEhvc3QgYnJpZGdlIChBR1AgZGlzYWJsZWQpCi0JCTRjNTMgMTAwMCAgQ0M3L0NSNy9DUDcvVkM3L1ZQNy9WUjcgbWFpbmJvYXJkCi0JNzYwMCAgODIzNzJGQiBQSUlYNSBJU0EKLQk3NjAxICA4MjM3MkZCIFBJSVg1IElERQotCTc2MDIgIDgyMzcyRkIgUElJWDUgVVNCCi0JNzYwMyAgODIzNzJGQiBQSUlYNSBTTUJ1cwotCTc4MDAgIDgyNzQwIChpNzQwKSBBR1AgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQkJMDAzZCAwMDA4ICBTdGFyZmlnaHRlciBBR1AKLQkJMDAzZCAwMDBiICBTdGFyZmlnaHRlciBBR1AKLQkJMTA5MiAwMTAwICBTdGVhbHRoIElJIEc0NjAKLQkJMTBiNCAyMDFhICBMaWdodHNwZWVkIDc0MAotCQkxMGI0IDIwMmYgIExpZ2h0c3BlZWQgNzQwCi0JCTgwODYgMDAwMCAgVGVybWluYXRvciAyeC9pCi0JCTgwODYgMDEwMCAgSW50ZWw3NDAgR3JhcGhpY3MgQWNjZWxlcmF0b3IKLQk4NGM0ICA0NTBLWC9HWCBbT3Jpb25dIC0gODI0NTRLWC9HWCBQQ0kgYnJpZGdlCi0JODRjNSAgNDUwS1gvR1ggW09yaW9uXSAtIDgyNDUzS1gvR1ggTWVtb3J5IGNvbnRyb2xsZXIKLQk4NGNhICA0NTBOWCAtIDgyNDUxTlggTWVtb3J5ICYgSS9PIENvbnRyb2xsZXIKLQk4NGNiICA0NTBOWCAtIDgyNDU0TlgvODQ0NjBHWCBQQ0kgRXhwYW5kZXIgQnJpZGdlCi0JODRlMCAgNDYwR1ggLSA4NDQ2MEdYIFN5c3RlbSBBZGRyZXNzIENvbnRyb2xsZXIgKFNBQykKLQk4NGUxICA0NjBHWCAtIDg0NDYwR1ggU3lzdGVtIERhdGEgQ29udHJvbGxlciAoU0RDKQotCTg0ZTIgIDQ2MEdYIC0gODQ0NjBHWCBBR1AgQnJpZGdlIChHWEIgZnVuY3Rpb24gMikKLQk4NGUzICA0NjBHWCAtIDg0NDYwR1ggTWVtb3J5IEFkZHJlc3MgQ29udHJvbGxlciAoTUFDKQotCTg0ZTQgIDQ2MEdYIC0gODQ0NjBHWCBNZW1vcnkgRGF0YSBDb250cm9sbGVyIChNREMpCi0JODRlNiAgNDYwR1ggLSA4MjQ2NkdYIFdpZGUgYW5kIGZhc3QgUENJIGVYcGFuZGVyIEJyaWRnZSAoV1hCKQotCTg0ZWEgIDQ2MEdYIC0gODQ0NjBHWCBBR1AgQnJpZGdlIChHWEIgZnVuY3Rpb24gMSkKLQk4NTAwICBJWFA0WFggLSBJbnRlbCBOZXR3b3JrIFByb2Nlc3NvciBmYW1pbHkuIElYUDQyMCwgSVhQNDIxLCBJWFA0MjIsIElYUDQyNSBhbmQgSVhDMTEwMAotCQkxOTkzIDBkZWUgIG1HdWFyZC1QQ0kgQVYjMQotCQkxOTkzIDBkZWYgIG1HdWFyZC1QQ0kgQVYjMAotCTkwMDAgIElYUDIwMDAgRmFtaWx5IE5ldHdvcmsgUHJvY2Vzc29yCi0JOTAwMSAgSVhQMjQwMCBOZXR3b3JrIFByb2Nlc3NvcgotCTkwMDQgIElYUDI4MDAgTmV0d29yayBQcm9jZXNzb3IKLQk5NjIxICBJbnRlZ3JhdGVkIFJBSUQKLQk5NjIyICBJbnRlZ3JhdGVkIFJBSUQKLQk5NjQxICBJbnRlZ3JhdGVkIFJBSUQKLQk5NmExICBJbnRlZ3JhdGVkIFJBSUQKLSMgcmV0YWlsIHZlcnNvbgotCWEwMWYgIFBSTy8xMEdiRSBMUiBTZXJ2ZXIgQWRhcHRlcgotIyBPRU0gdmVyc2lvbgotCWExMWYgIFBSTy8xMEdiRSBMUiBTZXJ2ZXIgQWRhcHRlcgotCWIxNTIgIDIxMTUyIFBDSS10by1QQ0kgQnJpZGdlCi0jIG9ic2VydmVkLCBhbmQgZG9jdW1lbnRlZCBpbiBJbnRlbCByZXZpc2lvbiBub3RlOyBuZXcgbWFzayBvZiAxMDExOjAwMjYKLQliMTU0ICAyMTE1NCBQQ0ktdG8tUENJIEJyaWRnZQotCWI1NTUgIDIxNTU1IE5vbiB0cmFuc3BhcmVudCBQQ0ktdG8tUENJIEJyaWRnZQotCQkxMmQ5IDAwMGEgIFBDSSBWb0lQIEdhdGV3YXkKLQkJNGM1MyAxMDUwICBDVDcgbWFpbmJvYXJkCi0JCTRjNTMgMTA1MSAgQ0U3IG1haW5ib2FyZAotCQllNGJmIDEwMDAgIENDOC0xLUJMVUVTCi0JZmZmZiAgNDUwTlgvR1ggW09yaW9uXSAtIDgyNDUzS1gvR1ggTWVtb3J5IGNvbnRyb2xsZXIgW0JVR10KLTg0MDEgIFRSRU5Ed2FyZSBJbnRlcm5hdGlvbmFsIEluYy4KLTg4MDAgIFRyaWdlbSBDb21wdXRlciBJbmMuCi0JMjAwOCAgVmlkZW8gYXNzaXN0ZW50IGNvbXBvbmVudAotODg2NiAgVC1TcXVhcmUgRGVzaWduIEluYy4KLTg4ODggIFNpbGljb24gTWFnaWMKLSMgOGM0YSBpcyBub3QgV2luYm9uZCBidXQgdGhlcmUgaXMgYSBib2FyZCBtaXNwcm9ncmFtbWVkCi04YzRhICBXaW5ib25kCi0JMTk4MCAgVzg5Qzk0MCBtaXNwcm9ncmFtbWVkIFtuZTJrXQotOGUwZSAgQ29tcHV0b25lIENvcnBvcmF0aW9uCi04ZTJlICBLVEkKLQkzMDAwICBFVDMyUDIKLTkwMDQgIEFkYXB0ZWMKLQkwMDc4ICBBSEEtMjk0MFVfQ04KLQkxMDc4ICBBSUMtNzgxMAotCTExNjAgIEFJQy0xMTYwIFtGYW1pbHkgRmlicmUgQ2hhbm5lbCBBZGFwdGVyXQotCTIxNzggIEFJQy03ODIxCi0JMzg2MCAgQUhBLTI5MzBDVQotCTNiNzggIEFIQS00ODQ0Vy80ODQ0VVcKLQk1MDc1ICBBSUMtNzU1eAotCTUwNzggIEFIQS03ODUwCi0JCTkwMDQgNzg1MCAgQUhBLTI5MDQvSW50ZWdyYXRlZCBBSUMtNzg1MAotCTUxNzUgIEFJQy03NTV4Ci0JNTE3OCAgQUlDLTc4NTEKLQk1Mjc1ICBBSUMtNzU1eAotCTUyNzggIEFJQy03ODUyCi0JNTM3NSAgQUlDLTc1NXgKLQk1Mzc4ICBBSUMtNzg1MAotCTU0NzUgIEFJQy03NTV4Ci0JNTQ3OCAgQUlDLTc4NTAKLQk1NTc1ICBBVkEtMjkzMAotCTU1NzggIEFJQy03ODU1Ci0JNTY0NyAgQU5BLTc3MTEgVENQIE9mZmxvYWQgRW5naW5lCi0JCTkwMDQgNzcxMCAgQU5BLTc3MTFGIFRDUCBPZmZsb2FkIEVuZ2luZSAtIE9wdGljYWwKLQkJOTAwNCA3NzExICBBTkEtNzcxMUxQIFRDUCBPZmZsb2FkIEVuZ2luZSAtIENvcHBlcgotCTU2NzUgIEFJQy03NTV4Ci0JNTY3OCAgQUlDLTc4NTYKLQk1Nzc1ICBBSUMtNzU1eAotCTU3NzggIEFJQy03ODUwCi0JNTgwMCAgQUlDLTU4MDAKLQk1OTAwICBBTkEtNTkxMC81OTMwLzU5NDAgQVRNMTU1ICYgMjUgTEFOIEFkYXB0ZXIKLQk1OTA1ICBBTkEtNTkxMEEvNTkzMEEvNTk0MEEgQVRNIEFkYXB0ZXIKLQk2MDM4ICBBSUMtMzg2MAotCTYwNzUgIEFJQy0xNDgwIC8gQVBBLTE0ODAKLQkJOTAwNCA3NTYwICBBSUMtMTQ4MCAvIEFQQS0xNDgwIENhcmRidXMKLQk2MDc4ICBBSUMtNzg2MAotCTYxNzggIEFJQy03ODYxCi0JCTkwMDQgNzg2MSAgQUhBLTI5NDBBVSBTaW5nbGUKLQk2Mjc4ICBBSUMtNzg2MAotCTYzNzggIEFJQy03ODYwCi0JNjQ3OCAgQUlDLTc4NngKLQk2NTc4ICBBSUMtNzg2eAotCTY2NzggIEFJQy03ODZ4Ci0JNjc3OCAgQUlDLTc4NngKLQk2OTE1ICBBTkE2MjB4eC9BTkE2OTAxMUEKLQkJOTAwNCAwMDA4ICBBTkE2OTAxMUEvVFggMTAvMTAwCi0JCTkwMDQgMDAwOSAgQU5BNjkwMTFBL1RYIDEwLzEwMAotCQk5MDA0IDAwMTAgIEFOQTYyMDIyIDItcG9ydCAxMC8xMDAKLQkJOTAwNCAwMDE4ICBBTkE2MjA0NCA0LXBvcnQgMTAvMTAwCi0JCTkwMDQgMDAxOSAgQU5BNjIwNDQgNC1wb3J0IDEwLzEwMAotCQk5MDA0IDAwMjAgIEFOQTYyMDIyIDItcG9ydCAxMC8xMDAKLQkJOTAwNCAwMDI4ICBBTkE2OTAxMUEvVFggMTAvMTAwCi0JCTkwMDQgODAwOCAgQU5BNjkwMTFBL1RYIDY0IGJpdCAxMC8xMDAKLQkJOTAwNCA4MDA5ICBBTkE2OTAxMUEvVFggNjQgYml0IDEwLzEwMAotCQk5MDA0IDgwMTAgIEFOQTYyMDIyIDItcG9ydCA2NCBiaXQgMTAvMTAwCi0JCTkwMDQgODAxOCAgQU5BNjIwNDQgNC1wb3J0IDY0IGJpdCAxMC8xMDAKLQkJOTAwNCA4MDE5ICBBTkE2MjA0NCA0LXBvcnQgNjQgYml0IDEwLzEwMAotCQk5MDA0IDgwMjAgIEFOQTYyMDIyIDItcG9ydCA2NCBiaXQgMTAvMTAwCi0JCTkwMDQgODAyOCAgQU5BNjkwMTFBL1RYIDY0IGJpdCAxMC8xMDAKLQk3MDc4ICBBSEEtMjk0eCAvIEFJQy03ODcwCi0JNzE3OCAgQUhBLTI5NDAvMjk0MFcgLyBBSUMtNzg3MQotCTcyNzggIEFIQS0zOTQwLzM5NDBXIC8gQUlDLTc4NzIKLQk3Mzc4ICBBSEEtMzk4NSAvIEFJQy03ODczCi0JNzQ3OCAgQUhBLTI5NDQvMjk0NFcgLyBBSUMtNzg3NAotCTc1NzggIEFIQS0zOTQ0LzM5NDRXIC8gQUlDLTc4NzUKLQk3Njc4ICBBSEEtNDk0NFcvVVcgLyBBSUMtNzg3NgotCTc3MTAgIEFOQS03NzExRiBOZXR3b3JrIEFjY2VsZXJhdG9yIENhcmQgKE5BQykgLSBPcHRpY2FsCi0JNzcxMSAgQU5BLTc3MTFDIE5ldHdvcmsgQWNjZWxlcmF0b3IgQ2FyZCAoTkFDKSAtIENvcHBlcgotCTc3NzggIEFJQy03ODd4Ci0JNzgxMCAgQUlDLTc4MTAKLQk3ODE1ICBBSUMtNzgxNSBSQUlEK01lbW9yeSBDb250cm9sbGVyIElDCi0JCTkwMDQgNzgxNSAgQVJPLTExMzBVMiBSQUlEIENvbnRyb2xsZXIKLQkJOTAwNCA3ODQwICBBSUMtNzgxNSBSQUlEK01lbW9yeSBDb250cm9sbGVyIElDCi0JNzg1MCAgQUlDLTc4NTAKLQk3ODU1ICBBSEEtMjkzMAotCTc4NjAgIEFJQy03ODYwCi0JNzg3MCAgQUlDLTc4NzAKLQk3ODcxICBBSEEtMjk0MAotCTc4NzIgIEFIQS0zOTQwCi0JNzg3MyAgQUhBLTM5ODAKLQk3ODc0ICBBSEEtMjk0NAotCTc4ODAgIEFJQy03ODgwUAotCTc4OTAgIEFJQy03ODkwCi0JNzg5MSAgQUlDLTc4OXgKLQk3ODkyICBBSUMtNzg5eAotCTc4OTMgIEFJQy03ODl4Ci0JNzg5NCAgQUlDLTc4OXgKLQk3ODk1ICBBSEEtMjk0MFUvVVcgLyBBSEEtMzl4eCAvIEFJQy03ODk1Ci0JCTkwMDQgNzg5MCAgQUhBLTI5NDBVLzI5NDBVVyBEdWFsIEFIQS0zOTR4QVUvQVVXL0FVV0QgQUlDLTc4OTVCCi0JCTkwMDQgNzg5MSAgQUhBLTI5NDBVLzI5NDBVVyBEdWFsCi0JCTkwMDQgNzg5MiAgQUhBLTM5NDBBVS9BVVcvQVVXRC9VV0QKLQkJOTAwNCA3ODk0ICBBSEEtMzk0NEFVV0QKLQkJOTAwNCA3ODk1ICBBSEEtMjk0MFUvMjk0MFVXIER1YWwgQUhBLTM5NHhBVS9BVVcvQVVXRCBBSUMtNzg5NUIKLQkJOTAwNCA3ODk2ICBBSEEtMjk0MFUvMjk0MFVXIER1YWwgQUhBLTM5NHhBVS9BVVcvQVVXRCBBSUMtNzg5NUIKLQkJOTAwNCA3ODk3ICBBSEEtMjk0MFUvMjk0MFVXIER1YWwgQUhBLTM5NHhBVS9BVVcvQVVXRCBBSUMtNzg5NUIKLQk3ODk2ICBBSUMtNzg5eAotCTc4OTcgIEFJQy03ODl4Ci0JODA3OCAgQUlDLTc4ODBVCi0JCTkwMDQgNzg4MCAgQUlDLTc4ODBQIFVsdHJhL1VsdHJhIFdpZGUgU0NTSSBDaGlwc2V0Ci0JODE3OCAgQUhBLTI5NDBVL1VXL0QgLyBBSUMtNzg4MVUKLQkJOTAwNCA3ODgxICBBSEEtMjk0MFVXIFNDU0kgSG9zdCBBZGFwdGVyCi0JODI3OCAgQUhBLTM5NDBVL1VXL1VXRCAvIEFJQy03ODgyVQotCTgzNzggIEFIQS0zOTQwVS9VVyAvIEFJQy03ODgzVQotCTg0NzggIEFIQS0yOTQ0VVcgLyBBSUMtNzg4NFUKLQk4NTc4ICBBSEEtMzk0NFUvVVdEIC8gQUlDLTc4ODUKLQk4Njc4ICBBSEEtNDk0NFVXIC8gQUlDLTc4ODYKLQk4Nzc4ICBBSEEtMjk0MFVXIFBybyAvIEFJQy03ODh4Ci0JCTkwMDQgNzg4NyAgMjk0MFVXIFBybyBVbHRyYS1XaWRlIFNDU0kgQ29udHJvbGxlcgotCTg4NzggIEFIQS0yOTMwVVcgLyBBSUMtNzg4OAotCQk5MDA0IDc4ODggIEFIQS0yOTMwVVcgU0NTSSBDb250cm9sbGVyCi0JOGI3OCAgQUJBLTEwMzAKLQllYzc4ICBBSEEtNDk0NFcvVVcKLTkwMDUgIEFkYXB0ZWMKLQkwMDEwICBBSEEtMjk0MFUyL1UyVwotCQk5MDA1IDIxODAgIEFIQS0yOTQwVTIgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgODEwMCAgQUhBLTI5NDBVMkIgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgYTEwMCAgQUhBLTI5NDBVMkIgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgYTE4MCAgQUhBLTI5NDBVMlcgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgZTEwMCAgQUhBLTI5NTBVMkIgU0NTSSBDb250cm9sbGVyCi0JMDAxMSAgQUhBLTI5MzBVMgotCTAwMTMgIDc4OTAyCi0JCTkwMDUgMDAwMyAgQUFBLTEzMVUyIEFycmF5MTAwMCAxIENoYW5uZWwgUkFJRCBDb250cm9sbGVyCi0JCTkwMDUgMDAwZiAgQUlDNzg5MF9BUk8KLQkwMDFmICBBSEEtMjk0MFUyL1UyVyAvIDc4OTAvNzg5MQotCQk5MDA1IDAwMGYgIDI5NDBVMlcgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgYTE4MCAgMjk0MFUyVyBTQ1NJIENvbnRyb2xsZXIKLQkwMDIwICBBSUMtNzg5MAotCTAwMmYgIEFJQy03ODkwCi0JMDAzMCAgQUlDLTc4OTAKLQkwMDNmICBBSUMtNzg5MAotCTAwNTAgIEFIQS0zOTQwVTJ4LzM5NVUyeAotCQk5MDA1IGY1MDAgIEFIQS0zOTUwVTJCCi0JCTkwMDUgZmZmZiAgQUhBLTM5NTBVMkIKLQkwMDUxICBBSEEtMzk1MFUyRAotCQk5MDA1IGI1MDAgIEFIQS0zOTUwVTJECi0JMDA1MyAgQUlDLTc4OTYgU0NTSSBDb250cm9sbGVyCi0JCTkwMDUgZmZmZiAgQUlDLTc4OTYgU0NTSSBDb250cm9sbGVyIG1haW5ib2FyZCBpbXBsZW1lbnRhdGlvbgotCTAwNWYgIEFJQy03ODk2VTIvNzg5N1UyCi0JMDA4MCAgQUlDLTc4OTJBIFUxNjAvbQotCQkwZTExIGUyYTAgIENvbXBhcSA2NC1CaXQvNjZNSHogV2lkZSBVbHRyYTMgU0NTSSBBZGFwdGVyCi0JCTkwMDUgNjIyMCAgQUhBLTI5MTYwQwotCQk5MDA1IDYyYTAgIDI5MTYwTiBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkJOTAwNSBlMjIwICAyOTE2MExQIExvdyBQcm9maWxlIFVsdHJhMTYwIFNDU0kgQ29udHJvbGxlcgotCQk5MDA1IGUyYTAgIDI5MTYwIFVsdHJhMTYwIFNDU0kgQ29udHJvbGxlcgotCTAwODEgIEFJQy03ODkyQiBVMTYwL20KLQkJOTAwNSA2MmExICAxOTE2MCBVbHRyYTE2MCBTQ1NJIENvbnRyb2xsZXIKLQkwMDgzICBBSUMtNzg5MkQgVTE2MC9tCi0JMDA4ZiAgQUlDLTc4OTJQIFUxNjAvbQotCQkxMTc5IDAwMDEgIE1hZ25pYSBaMzEwCi0JCTE1ZDkgOTAwNSAgT25ib2FyZCBTQ1NJIEhvc3QgQWRhcHRlcgotCTAwYzAgIEFIQS0zOTYwRCAvIEFJQy03ODk5QSBVMTYwL20KLQkJMGUxMSBmNjIwICBDb21wYXEgNjQtQml0LzY2TUh6IER1YWwgQ2hhbm5lbCBXaWRlIFVsdHJhMyBTQ1NJIEFkYXB0ZXIKLQkJOTAwNSBmNjIwICBBSEEtMzk2MEQgVTE2MC9tCi0JMDBjMSAgQUlDLTc4OTlCIFUxNjAvbQotCTAwYzMgIEFJQy03ODk5RCBVMTYwL20KLQkwMGM1ICBSQUlEIHN1YnN5c3RlbSBIQkEKLQkJMTAyOCAwMGM1ICBQb3dlckVkZ2UgMjQwMCwyNTAwLDI1NTAsNDQwMAotCTAwY2YgIEFJQy03ODk5UCBVMTYwL20KLQkJMTAyOCAwMGNlICBQb3dlckVkZ2UgMTQwMAotCQkxMDI4IDAwZDEgIFBvd2VyRWRnZSAyNTUwCi0JCTEwMjggMDBkOSAgUG93ZXJFZGdlIDI1MDAKLQkJMTBmMSAyNDYyICBUaHVuZGVyIEs3IFMyNDYyCi0JCTE1ZDkgOTAwNSAgT25ib2FyZCBTQ1NJIEhvc3QgQWRhcHRlcgotCQk4MDg2IDM0MTEgIFNEUzIgTWFpbmJvYXJkCi0JMDI1MCAgU2VydmVSQUlEIENvbnRyb2xsZXIKLQkJMTAxNCAwMjc5ICBTZXJ2ZVJBSUQteHgKLQkJMTAxNCAwMjhjICBTZXJ2ZVJBSUQteHgKLSMgZnJvbSBrZXJuZWwgc291cmNlcwotCTAyNzkgIFNlcnZlUkFJRCA2TQotCTAyODMgIEFBQy1SQUlECi0JCTkwMDUgMDI4MyAgQ2F0YXB1bHQKLQkwMjg0ICBBQUMtUkFJRAotCQk5MDA1IDAyODQgIFRvbWNhdAotCTAyODUgIEFBQy1SQUlECi0JCTBlMTEgMDI5NSAgU0FUQSA2Q2ggKEJlYXJjYXQpCi0JCTEwMTQgMDJmMiAgU2VydmVSQUlEIDhpCi0JCTEwMjggMDI4NyAgUG93ZXJFZGdlIEV4cGFuZGFibGUgUkFJRCBDb250cm9sbGVyIDMyMC9EQwotCQkxMDI4IDAyOTEgIENFUkMgU0FUQSBSQUlEIDIgUENJIFNBVEEgNmNoIChEZWxsQ29yc2FpcikKLQkJMTAzYyAzMjI3ICBBQVItMjYxMFNBCi0JCTE3YWEgMDI4NiAgTGVnZW5kIFMyMjAgKExlZ2VuZCBDcnVzYWRlcikKLQkJMTdhYSAwMjg3ICBMZWdlbmQgUzIzMCAoTGVnZW5kIFZ1bGNhbikKLQkJOTAwNSAwMjg1ICAyMjAwUyAoVnVsY2FuKQotCQk5MDA1IDAyODYgIDIxMjBTIChDcnVzYWRlcikKLQkJOTAwNSAwMjg3ICAyMjAwUyAoVnVsY2FuLTJtKQotCQk5MDA1IDAyODggIDMyMzBTIChIYXJyaWVyKQotCQk5MDA1IDAyODkgIDMyNDBTIChUb3JuYWRvKQotCQk5MDA1IDAyOGEgIEFTUi0yMDIwUyBQQ0ktWCBaQ1IgKFNreWhhd2spCi0JCTkwMDUgMDI4YiAgQVNSLTIwMjBTIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKQotCQk5MDA1IDAyOTAgIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpCi0JCTkwMDUgMDI5MiAgQUFSLTI4MTBTQSBQQ0kgU0FUQSA4Y2ggKENvcnNhaXItOCkKLQkJOTAwNSAwMjkzICBBQVItMjE2MTBTQSBQQ0kgU0FUQSAxNmNoIChDb3JzYWlyLTE2KQotCQk5MDA1IDAyOTQgIEVTRCBTTy1ESU1NIFBDSS1YIFNBVEEgWkNSIChQcm93bGVyKQotCTAyODYgIEFBQy1SQUlEIChSb2NrZXQpCi0JCTkwMDUgMDI4YyAgQVNSLTIyMzBTICsgQVNSLTIyMzBTTFAgUENJLVggKExhbmNlcikKLQkwNTAzICBTY2FtcCBjaGlwc2V0IFNDU0kgY29udHJvbGxlcgotCQkxMDE0IDAyQkYgIFF1YWQgQ2hhbm5lbCBQQ0ktWCBERFIgVTMyMCBTQ1NJIFJBSUQgQWRhcHRlciAoNTcxRSkKLQk4MDAwICBBU0MtMjkzMjBBIFUzMjAKLQk4MDBmICBBSUMtNzkwMSBVMzIwCi0JODAxMCAgQVNDLTM5MzIwIFUzMjAKLQk4MDExICBBU0MtMzIzMjBEIFUzMjAKLQkJMGUxMSAwMGFjICBBU0MtMzkzMjBEIFUzMjAKLQkJOTAwNSAwMDQxICBBU0MtMzkzMjBEIFUzMjAKLQk4MDEyICBBU0MtMjkzMjAgVTMyMAotCTgwMTMgIEFTQy0yOTMyMEIgVTMyMAotCTgwMTQgIEFTQy0yOTMyMExQIFUzMjAKLQk4MDE1ICBBU0MtMzkzMjBCIFUzMjAKLQk4MDE2ICBBU0MtMzkzMjBBIFUzMjAKLQk4MDE3ICBBU0MtMjkzMjBBTFAgVTMyMAotCTgwMWMgIEFTQy0zOTMyMEQgVTMyMAotCTgwMWQgIEFJQy03OTAyQiBVMzIwCi0JODAxZSAgQUlDLTc5MDFBIFUzMjAKLQk4MDFmICBBSUMtNzkwMiBVMzIwCi0JODA4MCAgQVNDLTI5MzIwQSBVMzIwIHcvSG9zdFJBSUQKLQk4MDhmICBBSUMtNzkwMSBVMzIwIHcvSG9zdFJBSUQKLQk4MDkwICBBU0MtMzkzMjAgVTMyMCB3L0hvc3RSQUlECi0JODA5MSAgQVNDLTM5MzIwRCBVMzIwIHcvSG9zdFJBSUQKLQk4MDkyICBBU0MtMjkzMjAgVTMyMCB3L0hvc3RSQUlECi0JODA5MyAgQVNDLTI5MzIwQiBVMzIwIHcvSG9zdFJBSUQKLQk4MDk0ICBBU0MtMjkzMjBMUCBVMzIwIHcvSG9zdFJBSUQKLQk4MDk1ICBBU0MtMzkzMjAoQikgVTMyMCB3L0hvc3RSQUlECi0JODA5NiAgQVNDLTM5MzIwQSBVMzIwIHcvSG9zdFJBSUQKLQk4MDk3ICBBU0MtMjkzMjBBTFAgVTMyMCB3L0hvc3RSQUlECi0JODA5YyAgQVNDLTM5MzIwRChCKSBVMzIwIHcvSG9zdFJBSUQKLQk4MDlkICBBSUMtNzkwMihCKSBVMzIwIHcvSG9zdFJBSUQKLQk4MDllICBBSUMtNzkwMUEgVTMyMCB3L0hvc3RSQUlECi0JODA5ZiAgQUlDLTc5MDIgVTMyMCB3L0hvc3RSQUlECi05MDdmICBBdHJvbmljcwotCTIwMTUgIElERS0yMDE1UEwKLTkxOWEgIEdpZ2FwaXhlbCBDb3JwCi05NDEyICBIb2x0ZWsKLQk2NTY1ICA2NTY1Ci05Njk5ICBPbW5pIE1lZGlhIFRlY2hub2xvZ3kgSW5jCi0JNjU2NSAgNjU2NQotOTcxMCAgTmV0TW9zIFRlY2hub2xvZ3kKLQk3NzgwICBVU0IgSVJEQS1wb3J0Ci0JOTcwNSAgUENJIDk3MDUgUGFyYWxsZWwgUG9ydAotCTk3MTUgIFBDSSA5NzE1IER1YWwgUGFyYWxsZWwgUG9ydAotCTk3MzUgIFBDSSA5NzM1IE11bHRpLUkvTyBDb250cm9sbGVyCi0JCTEwMDAgMDAwMiAgMFAyUyAoMiBzZXJpYWwpCi0JCTEwMDAgMDAxMiAgMVAyUyAoMSBwYXJhbGxlbCArIDIgc2VyaWFsKQotCTk3NDUgIFBDSSA5NzQ1IE11bHRpLUkvTyBDb250cm9sbGVyCi0JCTEwMDAgMDAwMiAgMFAyUyAoMiBzZXJpYWwpCi0JCTEwMDAgMDAxMiAgMVAyUyAoMSBwYXJhbGxlbCArIDIgc2VyaWFsKQotCTk3NTUgIFBDSSA5NzU1IFBhcmFsbGVsIFBvcnQgYW5kIElTQSBCcmlkZ2UKLQk5ODA1ICBQQ0kgOTgwNSBQYXJhbGxlbCBQb3J0Ci0JOTgxNSAgUENJIDk4MTUgRHVhbCBQYXJhbGxlbCBQb3J0Ci0JCTEwMDAgMDAyMCAgMlAwUyAoMiBwb3J0IHBhcmFsbGVsIGFkYXB0b3IpCi0JOTgzNSAgUENJIDk4MzUgTXVsdGktSS9PIENvbnRyb2xsZXIKLQkJMTAwMCAwMDAyICAwUDJTICgxNkM1NTAgVUFSVCkKLQkJMTAwMCAwMDEyICAxUDJTCi0JOTg0NSAgUENJIDk4NDUgTXVsdGktSS9PIENvbnRyb2xsZXIKLQkJMTAwMCAwMDA0ICAwUDRTICg0IHBvcnQgMTY1NTBBIHNlcmlhbCBjYXJkKQotCQkxMDAwIDAwMDYgIDBQNlMgKDYgcG9ydCAxNjU1MEEgc2VyaWFsIGNhcmQpCi0JCTEwMDAgMDAxNCAgMVA0UyAoNCBwb3J0IDE2NTUwQSBzZXJpYWwgY2FyZCArIHBhcmFsbGVsKQotCTk4NTUgIFBDSSA5ODU1IE11bHRpLUkvTyBDb250cm9sbGVyCi0JCTEwMDAgMDAxNCAgMVA0UwotOTkwMiAgU3RhcmdlbiBJbmMuCi0JMDAwMSAgU0cyMDEwIFBDSSBvdmVyIFN0YXJmYWJyaWMgQnJpZGdlCi0JMDAwMiAgU0cyMDEwIFBDSSB0byBTdGFyZmFicmljIEdhdGV3YXkKLQkwMDAzICBTRzEwMTAgU3RhcmZhYnJpYyBTd2l0Y2ggYW5kIFBDSSBCcmlkZ2UKLWEwYTAgIEFPUEVOIEluYy4KLWEwZjEgIFVOSVNZUyBDb3Jwb3JhdGlvbgotYTIwMCAgTkVDIENvcnBvcmF0aW9uCi1hMjU5ICBIZXdsZXR0IFBhY2thcmQKLWEyNWIgIEhld2xldHQgUGFja2FyZCBHbWJIIFBMMjQtTUtUCi1hMzA0ICBTb255Ci1hNzI3ICAzQ29tIENvcnBvcmF0aW9uCi0JMDAxMyAgM0NSUEFHMTc1IFdpcmVsZXNzIFBDIENhcmQKLWFhNDIgIFNjaXRleCBEaWdpdGFsIFZpZGVvCi1hYzFlICBEaWdpdGFsIFJlY2VpdmVyIFRlY2hub2xvZ3kgSW5jCi1hYzNkICBBY3R1YWxpdHkgU3lzdGVtcwotYWVjYiAgQWRyaWVubmUgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KLWIxYjMgIFNoaXZhIEV1cm9wZSBMaW1pdGVkCi0jIFBpbm5hY2xlIHNob3VsZCBiZSAxMWJkLCBidXQgdGhleSBnb3QgaXQgd3Jvbmcgc2V2ZXJhbCB0aW1lcyAtLW1qCi1iZDExICBQaW5uYWNsZSBTeXN0ZW1zLCBJbmMuIChXcm9uZyBJRCkKLWMwMDEgIFRTSSBUZWxzeXMKLWMwYTkgIE1pY3Jvbi9DcnVjaWFsIFRlY2hub2xvZ3kKLWMwZGUgIE1vdG9yb2xhCi1jMGZlICBNb3Rpb24gRW5naW5lZXJpbmcsIEluYy4KLWNhNTAgIFZhcmlhbiBBdXN0cmFsaWEgUHR5IEx0ZAotY2FmZSAgQ2hyeXNhbGlzLUlUUwotY2NjYyAgQ2F0YXB1bHQgQ29tbXVuaWNhdGlvbnMKLWNkZGQgIFR5engsIEluYy4KLQkwMTAxICBEZWVwU2VhIDEgSGlnaCBTcGVlZCBTdGVyZW8gVmlzaW9uIEZyYW1lIEdyYWJiZXIKLQkwMjAwICBEZWVwU2VhIDIgSGlnaCBTcGVlZCBTdGVyZW8gVmlzaW9uIEZyYW1lIEdyYWJiZXIKLWQ0ZDQgIER5NCBTeXN0ZW1zIEluYwotCTA2MDEgIFBDSSBNZXp6YW5pbmUgQ2FyZAotZDUzMSAgSStNRSBBQ1RJQSBHbWJICi1kODRkICBFeHN5cwotZGVhZCAgSW5kaWdpdGEgQ29ycG9yYXRpb24KLWRlYWYgIE1pZGRsZSBEaWdpdGFsIEluYy4KLQk5MDUwICBQQyBXZWFzZWwgVmlydHVhbCBWR0EKLQk5MDUxICBQQyBXZWFzZWwgU2VyaWFsIFBvcnQKLQk5MDUyICBQQyBXZWFzZWwgV2F0Y2hkb2cgVGltZXIKLWUwMDAgIFdpbmJvbmQKLQllMDAwICBXODlDOTQwCi0jIHNlZSBhbHNvIDogaHR0cDovL3d3dy5zY2hvZW5mZWxkLmRlL2luc2lkZS9JbnNpZGVfQ1dNSzMudHh0IG1heWJlIGEgbWlzdXNlIG9mIFRKTiBpZCBvciBpdCB1c2UgdGhlIFRKTiAzWFggY2hpcCBmb3Igb3RoZXIgYXBwbGljCi1lMTU5ICBUaWdlciBKZXQgTmV0d29yayBJbmMuCi0JMDAwMSAgVGlnZXIzWFggTW9kZW0vSVNETiBpbnRlcmZhY2UKLQkJMDA1OSAwMDAxICAxMjhrIElTRE4tUy9UIEFkYXB0ZXIKLQkJMDA1OSAwMDAzICAxMjhrIElTRE4tVSBBZGFwdGVyCi0JMDAwMiAgVGlnZXIxMDBBUEMgSVNETiBjaGlwc2V0Ci1lNGJmICBFS0YgRWxla3Ryb25payBHbWJICi0jIElubm92YXRpdmUgYW5kIHNjYWxhYmxlIG5ldHdvcmsgSUMgdmVuZG9yCi1lNTVlICBFc3NlbmNlIFRlY2hub2xvZ3ksIEluYy4KLWVhMDEgIEVhZ2xlIFRlY2hub2xvZ3kKLSMgVGhlIG1haW4gY2hpcCBvZiBhbGwgdGhlc2UgZGV2aWNlcyBpcyBieSBYaWxpbnggLT4gSXQgY291bGQgYWxzbyBiZSBhIFhpbGlueCBJRC4KLWVhNjAgIFJNRQotCTk4OTYgIERpZ2kzMgotCTk4OTcgIERpZ2kzMiBQcm8KLQk5ODk4ICBEaWdpMzIvOAotZWFiYiAgQWFzaGltYSBUZWNobm9sb2d5IEIuVi4KLWVhY2UgIEVuZGFjZSBNZWFzdXJlbWVudCBTeXN0ZW1zLCBMdGQKLQkzMTAwICBEQUcgMy4xMCBPQy0zL09DLTEyCi0JMzIwMCAgREFHIDMuMnggT0MtMy9PQy0xMgotCTMyMGUgIERBRyAzLjJFIEZhc3QgRXRoZXJuZXQKLQkzNDBlICBEQUcgMy40RSBGYXN0IEV0aGVybmV0Ci0JMzQxZSAgREFHIDMuNDFFIEZhc3QgRXRoZXJuZXQKLQkzNTAwICBEQUcgMy41IE9DLTMvT0MtMTIKLQkzNTFjICBEQUcgMy41RUNNIEZhc3QgRXRoZXJuZXQKLQk0MTAwICBEQUcgNC4xMCBPQy00OAotCTQxMTAgIERBRyA0LjExIE9DLTQ4Ci0JNDIyMCAgREFHIDQuMiBPQy00OAotCTQyMmUgIERBRyA0LjJFIER1YWwgR2lnYWJpdCBFdGhlcm5ldAotZWM4MCAgQmVsa2luIENvcnBvcmF0aW9uCi0JZWMwMCAgRjVENjAwMAotZWNjMCAgRWNobyBEaWdpdGFsIEF1ZGlvIENvcnBvcmF0aW9uCi1lZGQ4ICBBUksgTG9naWMgSW5jCi0JYTA5MSAgMTAwMFBWIFtTdGluZ3JheV0KLQlhMDk5ICAyMDAwUFYgW1N0aW5ncmF5XQotCWEwYTEgIDIwMDBNVAotCWEwYTkgIDIwMDBNSQotZjFkMCAgQUpBIFZpZGVvCi0jIEFsbCBib2FyZHMgSSBoYXZlIHNlZW4gaGF2ZSB0aGlzIElEIG5vdCBlZmFjLCB0aG91Z2ggYWxsIGRvY3Mgc2F5IGVmYWMuLi4KLQljYWZlICBLT05BIFNEIFNNUFRFIDI1OU0gSS9PCi0JZWZhYyAgS09OQSBTRCBTTVBURSAyNTlNIEkvTwotCWZhY2QgIEtPTkEgSEQgU01QVEUgMjkyTSBJL08KLWZhNTcgIEludGVyYWdvbiBBUwotCTAwMDEgIFBNQyBbUGF0dGVybiBNYXRjaGluZyBDaGlwXQotZmViZCAgVWx0cmF2aWV3IENvcnAuCi1mZWRhICBCcm9hZGNvbSBJbmMgKG5lZSBFcGlncmFtKQotCWEwZmEgIEJDTTQyMTAgaUxpbmUxMCBIb21lUE5BIDIuMAotCWExMGUgIEJDTTQyMzAgaUxpbmUxMCBIb21lUE5BIDIuMAotIyBJVCAmIFRlbGVjb20gY29tcGFueSwgZGV2ZWxvcHMgUENJIFRydW5rIGNhcmRzIDx3d3cuZmVkZXRlYy5lcz4KLWZlZGUgIEZlZGV0ZWMgSW5jLgotCTAwMDMgIFRBQklDIFBDSSB2MwotZmZmZSAgVk1XYXJlIEluYwotCTA0MDUgIFZpcnR1YWwgU1ZHQSA0LjAKLQkwNzEwICBWaXJ0dWFsIFNWR0EKLWZmZmYgIElsbGVnYWwgVmVuZG9yIElECi0KLQotIyBMaXN0IG9mIGtub3duIGRldmljZSBjbGFzc2VzLCBzdWJjbGFzc2VzIGFuZCBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCi0KLSMgU3ludGF4OgotIyBDIGNsYXNzCWNsYXNzX25hbWUKLSMJc3ViY2xhc3MJc3ViY2xhc3NfbmFtZSAgCQk8LS0gc2luZ2xlIHRhYgotIwkJcHJvZy1pZiAgcHJvZy1pZl9uYW1lICAJPC0tIHR3byB0YWJzCi0KLUMgMDAgIFVuY2xhc3NpZmllZCBkZXZpY2UKLQkwMCAgTm9uLVZHQSB1bmNsYXNzaWZpZWQgZGV2aWNlCi0JMDEgIFZHQSBjb21wYXRpYmxlIHVuY2xhc3NpZmllZCBkZXZpY2UKLUMgMDEgIE1hc3Mgc3RvcmFnZSBjb250cm9sbGVyCi0JMDAgIFNDU0kgc3RvcmFnZSBjb250cm9sbGVyCi0JMDEgIElERSBpbnRlcmZhY2UKLQkwMiAgRmxvcHB5IGRpc2sgY29udHJvbGxlcgotCTAzICBJUEkgYnVzIGNvbnRyb2xsZXIKLQkwNCAgUkFJRCBidXMgY29udHJvbGxlcgotCTgwICBVbmtub3duIG1hc3Mgc3RvcmFnZSBjb250cm9sbGVyCi1DIDAyICBOZXR3b3JrIGNvbnRyb2xsZXIKLQkwMCAgRXRoZXJuZXQgY29udHJvbGxlcgotCTAxICBUb2tlbiByaW5nIG5ldHdvcmsgY29udHJvbGxlcgotCTAyICBGRERJIG5ldHdvcmsgY29udHJvbGxlcgotCTAzICBBVE0gbmV0d29yayBjb250cm9sbGVyCi0JMDQgIElTRE4gY29udHJvbGxlcgotCTgwICBOZXR3b3JrIGNvbnRyb2xsZXIKLUMgMDMgIERpc3BsYXkgY29udHJvbGxlcgotCTAwICBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyCi0JCTAwICBWR0EKLQkJMDEgIDg1MTQKLQkwMSAgWEdBIGNvbXBhdGlibGUgY29udHJvbGxlcgotCTAyICAzRCBjb250cm9sbGVyCi0JODAgIERpc3BsYXkgY29udHJvbGxlcgotQyAwNCAgTXVsdGltZWRpYSBjb250cm9sbGVyCi0JMDAgIE11bHRpbWVkaWEgdmlkZW8gY29udHJvbGxlcgotCTAxICBNdWx0aW1lZGlhIGF1ZGlvIGNvbnRyb2xsZXIKLQkwMiAgQ29tcHV0ZXIgdGVsZXBob255IGRldmljZQotCTgwICBNdWx0aW1lZGlhIGNvbnRyb2xsZXIKLUMgMDUgIE1lbW9yeSBjb250cm9sbGVyCi0JMDAgIFJBTSBtZW1vcnkKLQkwMSAgRkxBU0ggbWVtb3J5Ci0JODAgIE1lbW9yeSBjb250cm9sbGVyCi1DIDA2ICBCcmlkZ2UKLQkwMCAgSG9zdCBicmlkZ2UKLQkwMSAgSVNBIGJyaWRnZQotCTAyICBFSVNBIGJyaWRnZQotCTAzICBNaWNyb0NoYW5uZWwgYnJpZGdlCi0JMDQgIFBDSSBicmlkZ2UKLQkJMDAgIE5vcm1hbCBkZWNvZGUKLQkJMDEgIFN1YnRyYWN0aXZlIGRlY29kZQotCTA1ICBQQ01DSUEgYnJpZGdlCi0JMDYgIE51QnVzIGJyaWRnZQotCTA3ICBDYXJkQnVzIGJyaWRnZQotCTA4ICBSQUNFd2F5IGJyaWRnZQotCQkwMCAgVHJhbnNwYXJlbnQgbW9kZQotCQkwMSAgRW5kcG9pbnQgbW9kZQotCTA5ICBTZW1pLXRyYW5zcGFyZW50IFBDSS10by1QQ0kgYnJpZGdlCi0JCTQwICBQcmltYXJ5IGJ1cyB0b3dhcmRzIGhvc3QgQ1BVCi0JCTgwICBTZWNvbmRhcnkgYnVzIHRvd2FyZHMgaG9zdCBDUFUKLQkwYSAgSW5maW5pQmFuZCB0byBQQ0kgaG9zdCBicmlkZ2UKLQk4MCAgQnJpZGdlCi1DIDA3ICBDb21tdW5pY2F0aW9uIGNvbnRyb2xsZXIKLQkwMCAgU2VyaWFsIGNvbnRyb2xsZXIKLQkJMDAgIDgyNTAKLQkJMDEgIDE2NDUwCi0JCTAyICAxNjU1MAotCQkwMyAgMTY2NTAKLQkJMDQgIDE2NzUwCi0JCTA1ICAxNjg1MAotCQkwNiAgMTY5NTAKLQkwMSAgUGFyYWxsZWwgY29udHJvbGxlcgotCQkwMCAgU1BQCi0JCTAxICBCaURpcgotCQkwMiAgRUNQCi0JCTAzICBJRUVFMTI4NAotCQlmZSAgSUVFRTEyODQgVGFyZ2V0Ci0JMDIgIE11bHRpcG9ydCBzZXJpYWwgY29udHJvbGxlcgotCTAzICBNb2RlbQotCQkwMCAgR2VuZXJpYwotCQkwMSAgSGF5ZXMvMTY0NTAKLQkJMDIgIEhheWVzLzE2NTUwCi0JCTAzICBIYXllcy8xNjY1MAotCQkwNCAgSGF5ZXMvMTY3NTAKLQk4MCAgQ29tbXVuaWNhdGlvbiBjb250cm9sbGVyCi1DIDA4ICBHZW5lcmljIHN5c3RlbSBwZXJpcGhlcmFsCi0JMDAgIFBJQwotCQkwMCAgODI1OQotCQkwMSAgSVNBIFBJQwotCQkwMiAgRUlTQSBQSUMKLQkJMTAgIElPLUFQSUMKLQkJMjAgIElPKFgpLUFQSUMKLQkwMSAgRE1BIGNvbnRyb2xsZXIKLQkJMDAgIDgyMzcKLQkJMDEgIElTQSBETUEKLQkJMDIgIEVJU0EgRE1BCi0JMDIgIFRpbWVyCi0JCTAwICA4MjU0Ci0JCTAxICBJU0EgVGltZXIKLQkJMDIgIEVJU0EgVGltZXJzCi0JMDMgIFJUQwotCQkwMCAgR2VuZXJpYwotCQkwMSAgSVNBIFJUQwotCTA0ICBQQ0kgSG90LXBsdWcgY29udHJvbGxlcgotCTgwICBTeXN0ZW0gcGVyaXBoZXJhbAotQyAwOSAgSW5wdXQgZGV2aWNlIGNvbnRyb2xsZXIKLQkwMCAgS2V5Ym9hcmQgY29udHJvbGxlcgotCTAxICBEaWdpdGl6ZXIgUGVuCi0JMDIgIE1vdXNlIGNvbnRyb2xsZXIKLQkwMyAgU2Nhbm5lciBjb250cm9sbGVyCi0JMDQgIEdhbWVwb3J0IGNvbnRyb2xsZXIKLQkJMDAgIEdlbmVyaWMKLQkJMTAgIEV4dGVuZGVkCi0JODAgIElucHV0IGRldmljZSBjb250cm9sbGVyCi1DIDBhICBEb2NraW5nIHN0YXRpb24KLQkwMCAgR2VuZXJpYyBEb2NraW5nIFN0YXRpb24KLQk4MCAgRG9ja2luZyBTdGF0aW9uCi1DIDBiICBQcm9jZXNzb3IKLQkwMCAgMzg2Ci0JMDEgIDQ4NgotCTAyICBQZW50aXVtCi0JMTAgIEFscGhhCi0JMjAgIFBvd2VyIFBDCi0JMzAgIE1JUFMKLQk0MCAgQ28tcHJvY2Vzc29yCi1DIDBjICBTZXJpYWwgYnVzIGNvbnRyb2xsZXIKLQkwMCAgRmlyZVdpcmUgKElFRUUgMTM5NCkKLQkJMDAgIEdlbmVyaWMKLQkJMTAgIE9IQ0kKLQkwMSAgQUNDRVNTIEJ1cwotCTAyICBTU0EKLQkwMyAgVVNCIENvbnRyb2xsZXIKLQkJMDAgIFVIQ0kKLQkJMTAgIE9IQ0kKLQkJMjAgIEVIQ0kKLQkJODAgIFVuc3BlY2lmaWVkCi0JCWZlICBVU0IgRGV2aWNlCi0JMDQgIEZpYnJlIENoYW5uZWwKLQkwNSAgU01CdXMKLQkwNiAgSW5maW5pQmFuZAotQyAwZCAgV2lyZWxlc3MgY29udHJvbGxlcgotCTAwICBJUkRBIGNvbnRyb2xsZXIKLQkwMSAgQ29uc3VtZXIgSVIgY29udHJvbGxlcgotCTEwICBSRiBjb250cm9sbGVyCi0JODAgIFdpcmVsZXNzIGNvbnRyb2xsZXIKLUMgMGUgIEludGVsbGlnZW50IGNvbnRyb2xsZXIKLQkwMCAgSTJPCi1DIDBmICBTYXRlbGxpdGUgY29tbXVuaWNhdGlvbnMgY29udHJvbGxlcgotCTAwICBTYXRlbGxpdGUgVFYgY29udHJvbGxlcgotCTAxICBTYXRlbGxpdGUgYXVkaW8gY29tbXVuaWNhdGlvbiBjb250cm9sbGVyCi0JMDMgIFNhdGVsbGl0ZSB2b2ljZSBjb21tdW5pY2F0aW9uIGNvbnRyb2xsZXIKLQkwNCAgU2F0ZWxsaXRlIGRhdGEgY29tbXVuaWNhdGlvbiBjb250cm9sbGVyCi1DIDEwICBFbmNyeXB0aW9uIGNvbnRyb2xsZXIKLQkwMCAgTmV0d29yayBhbmQgY29tcHV0aW5nIGVuY3J5cHRpb24gZGV2aWNlCi0JMTAgIEVudGVydGFpbm1lbnQgZW5jcnlwdGlvbiBkZXZpY2UKLQk4MCAgRW5jcnlwdGlvbiBjb250cm9sbGVyCi1DIDExICBTaWduYWwgcHJvY2Vzc2luZyBjb250cm9sbGVyCi0JMDAgIERQSU8gbW9kdWxlCi0JMDEgIFBlcmZvcm1hbmNlIGNvdW50ZXJzCi0JMTAgIENvbW11bmljYXRpb24gc3luY2hyb25pemVyCi0JODAgIFNpZ25hbCBwcm9jZXNzaW5nIGNvbnRyb2xsZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCAzMGJhYzdlLi4zYzU2NWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC05MCwxNSArOTAsMTkgQEAKIAkJcGNpX3NhdmVfbXNpX3N0YXRlKGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldHZhbDsKIAogCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJaWYgKHBfZXh0LT5pbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTVNJX01PREUpCiAJCXBjaV9yZXN0b3JlX21zaV9zdGF0ZShkZXYpOwotCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCXBjaV9zZXRfbWFzdGVyKGRldik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA5M2U4YTg3Li4yNmE1NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTcyLDExICs3MiwxMyBAQAogLyoKICAqIFBDSSBCdXMgQ2xhc3MgRGV2aWNlcwogICovCi1zdGF0aWMgc3NpemVfdCBwY2lfYnVzX3Nob3dfY3B1YWZmaW5pdHkoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwY2lfYnVzX3Nob3dfY3B1YWZmaW5pdHkoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LAorCQkJCQljaGFyICpidWYpCiB7Ci0JY3B1bWFza190IGNwdW1hc2sgPSBwY2lidXNfdG9fY3B1bWFzayh0b19wY2lfYnVzKGNsYXNzX2RldikpOwogCWludCByZXQ7CisJY3B1bWFza190IGNwdW1hc2s7CiAKKwljcHVtYXNrID0gcGNpYnVzX3RvX2NwdW1hc2sodG9fcGNpX2J1cyhjbGFzc19kZXYpKTsKIAlyZXQgPSBjcHVtYXNrX3NjbnByaW50ZihidWYsIFBBR0VfU0laRSwgY3B1bWFzayk7CiAJaWYgKHJldCA8IFBBR0VfU0laRSkKIAkJYnVmW3JldCsrXSA9ICdcbic7CkBAIC01ODQsNyArNTg2LDcgQEAKIAkJIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwgY2xhc3MsIGRldi0+aGRyX3R5cGUpOwogCiAJLyogIlVua25vd24gcG93ZXIgc3RhdGUiICovCi0JZGV2LT5jdXJyZW50X3N0YXRlID0gNDsKKwlkZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfVU5LTk9XTjsKIAogCS8qIEVhcmx5IGZpeHVwcywgYmVmb3JlIHByb2JpbmcgdGhlIEJBUnMgKi8KIAlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9lYXJseSwgZGV2KTsKQEAgLTc1MywyOSArNzU1LDE5IEBACiAJCWtmcmVlKGRldik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXYpOwotCWRldi0+ZGV2LnJlbGVhc2UgPSBwY2lfcmVsZWFzZV9kZXY7Ci0JcGNpX2Rldl9nZXQoZGV2KTsKLQotCXBjaV9uYW1lX2RldmljZShkZXYpOwotCi0JZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKLQlkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZ1bGw7CiAKIAlyZXR1cm4gZGV2OwogfQogCi1zdHJ1Y3QgcGNpX2RldiAqIF9fZGV2aW5pdAotcGNpX3NjYW5fc2luZ2xlX2RldmljZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4pCit2b2lkIF9fZGV2aW5pdCBwY2lfZGV2aWNlX2FkZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJZGV2aWNlX2luaXRpYWxpemUoJmRldi0+ZGV2KTsKKwlkZXYtPmRldi5yZWxlYXNlID0gcGNpX3JlbGVhc2VfZGV2OworCXBjaV9kZXZfZ2V0KGRldik7CiAKLQlkZXYgPSBwY2lfc2Nhbl9kZXZpY2UoYnVzLCBkZXZmbik7Ci0JcGNpX3NjYW5fbXNpX2RldmljZShkZXYpOworCWRldi0+ZGV2LmRtYV9tYXNrID0gJmRldi0+ZG1hX21hc2s7CisJZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmdWxsOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiBOVUxMOwotCQogCS8qIEZpeCB1cCBicm9rZW4gaGVhZGVycyAqLwogCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2hlYWRlciwgZGV2KTsKIApAQCAtNzg3LDYgKzc3OSwxOSBAQAogCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmJ1c19saXN0LCAmYnVzLT5kZXZpY2VzKTsKIAlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKK30KKworc3RydWN0IHBjaV9kZXYgKiBfX2RldmluaXQKK3BjaV9zY2FuX3NpbmdsZV9kZXZpY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlkZXYgPSBwY2lfc2Nhbl9kZXZpY2UoYnVzLCBkZXZmbik7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJcGNpX2RldmljZV9hZGQoZGV2LCBidXMpOworCXBjaV9zY2FuX21zaV9kZXZpY2UoZGV2KTsKIAogCXJldHVybiBkZXY7CiB9CkBAIC04ODMsNyArODg4LDggQEAKIAlyZXR1cm4gbWF4OwogfQogCi1zdHJ1Y3QgcGNpX2J1cyAqIF9fZGV2aW5pdCBwY2lfc2Nhbl9idXNfcGFyZW50ZWQoc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgYnVzLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLCB2b2lkICpzeXNkYXRhKQorc3RydWN0IHBjaV9idXMgKiBfX2RldmluaXQgcGNpX2NyZWF0ZV9idXMoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQlpbnQgYnVzLCBzdHJ1Y3QgcGNpX29wcyAqb3BzLCB2b2lkICpzeXNkYXRhKQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgcGNpX2J1cyAqYjsKQEAgLTk0MCw4ICs5NDYsNiBAQAogCWItPnJlc291cmNlWzBdID0gJmlvcG9ydF9yZXNvdXJjZTsKIAliLT5yZXNvdXJjZVsxXSA9ICZpb21lbV9yZXNvdXJjZTsKIAotCWItPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGIpOwotCiAJcmV0dXJuIGI7CiAKIHN5c19jcmVhdGVfbGlua19lcnI6CkBAIC05NTksNiArOTYzLDE4IEBACiAJa2ZyZWUoYik7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfY3JlYXRlX2J1cyk7CisKK3N0cnVjdCBwY2lfYnVzICogX19kZXZpbml0IHBjaV9zY2FuX2J1c19wYXJlbnRlZChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCWludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpCit7CisJc3RydWN0IHBjaV9idXMgKmI7CisKKwliID0gcGNpX2NyZWF0ZV9idXMocGFyZW50LCBidXMsIG9wcywgc3lzZGF0YSk7CisJaWYgKGIpCisJCWItPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGIpOworCXJldHVybiBiOworfQogRVhQT1JUX1NZTUJPTChwY2lfc2Nhbl9idXNfcGFyZW50ZWQpOwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2MuYyBiL2RyaXZlcnMvcGNpL3Byb2MuYwppbmRleCA3OTg4ZmM4Li45NjEzZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9jLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYy5jCkBAIC00NzQsNyArNDc0LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZmlyc3RfZGV2OwogCXN0cnVjdCBwY2lfZHJpdmVyICpkcnY7CiAJdTMyIGNsYXNzX3JldjsKLQl1bnNpZ25lZCBjaGFyIGxhdGVuY3ksIG1pbl9nbnQsIG1heF9sYXQsICpjbGFzczsKKwl1bnNpZ25lZCBjaGFyIGxhdGVuY3ksIG1pbl9nbnQsIG1heF9sYXQ7CiAJaW50IHJlZzsKIAogCWZpcnN0X2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwpAQCAtNDkwLDE2ICs0OTAsOCBAQAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChkZXYsIFBDSV9NQVhfTEFULCAmbWF4X2xhdCk7CiAJc2VxX3ByaW50ZihtLCAiICBCdXMgJTJkLCBkZXZpY2UgJTNkLCBmdW5jdGlvbiAlMmQ6XG4iLAogCSAgICAgICBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgUENJX0ZVTkMoZGV2LT5kZXZmbikpOwotCWNsYXNzID0gcGNpX2NsYXNzX25hbWUoY2xhc3NfcmV2ID4+IDE2KTsKLQlpZiAoY2xhc3MpCi0JCXNlcV9wcmludGYobSwgIiAgICAlcyIsIGNsYXNzKTsKLQllbHNlCi0JCXNlcV9wcmludGYobSwgIiAgICBDbGFzcyAlMDR4IiwgY2xhc3NfcmV2ID4+IDE2KTsKLSNpZmRlZiBDT05GSUdfUENJX05BTUVTCi0Jc2VxX3ByaW50ZihtLCAiOiAlcyIsIGRldi0+cHJldHR5X25hbWUpOwotI2Vsc2UKKwlzZXFfcHJpbnRmKG0sICIgICAgQ2xhc3MgJTA0eCIsIGNsYXNzX3JldiA+PiAxNik7CiAJc2VxX3ByaW50ZihtLCAiOiBQQ0kgZGV2aWNlICUwNHg6JTA0eCIsIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSk7Ci0jZW5kaWYKIAlzZXFfcHJpbnRmKG0sICIgKHJldiAlZCkuXG4iLCBjbGFzc19yZXYgJiAweGZmKTsKIAogCWlmIChkZXYtPmlycSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggMTQwMzU0YS4uMTFjYTQ0MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0yNDUsMTIgKzI0NSwxOSBAQAogewogCXJlZ2lvbiAmPSB+KHNpemUtMSk7CiAJaWYgKHJlZ2lvbikgeworCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gYnVzX3JlZ2lvbjsKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgbnI7CiAKIAkJcmVzLT5uYW1lID0gcGNpX25hbWUoZGV2KTsKIAkJcmVzLT5zdGFydCA9IHJlZ2lvbjsKIAkJcmVzLT5lbmQgPSByZWdpb24gKyBzaXplIC0gMTsKIAkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisKKwkJLyogQ29udmVydCBmcm9tIFBDSSBidXMgdG8gcmVzb3VyY2Ugc3BhY2UuICAqLworCQlidXNfcmVnaW9uLnN0YXJ0ID0gcmVzLT5zdGFydDsKKwkJYnVzX3JlZ2lvbi5lbmQgPSByZXMtPmVuZDsKKwkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LCByZXMsICZidXNfcmVnaW9uKTsKKwogCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBucik7CiAJfQogfQkKQEAgLTg2OSw2ICs4NzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweEMwMEM6IC8qIFNhbXN1bmcgUDM1IG5vdGVib29rICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN1c19oaWRlc19zbWJ1cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KKwl9IGVsc2UgaWYgKHVubGlrZWx5KGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkpIHsKKwkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVQTV9IQikKKwkJCXN3aXRjaChkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCWNhc2UgMHgwMDU4OiAvKiBDb21wYXEgRXZvIE42MjBjICovCisJCQkJYXN1c19oaWRlc19zbWJ1cyA9IDE7CisJCQl9CiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIsCWFzdXNfaGlkZXNfc21idXNfaG9zdGJyaWRnZSApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCA2YjBlNjQ2Li42NTdiZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNzcsOCArNzcsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0Ci1wY2lfc2V0dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQordm9pZCBwY2lfc2V0dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7CiAJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKQEAgLTEzMCw2ICsxMjksNyBAQAogCQkJCQlyZWdpb24uZW5kKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9zZXR1cF9jYXJkYnVzKTsKIAogLyogSW5pdGlhbGl6ZSBicmlkZ2VzIHdpdGggYmFzZS9saW1pdCB2YWx1ZXMgd2UgaGF2ZSBjb2xsZWN0ZWQuCiAgICBQQ0ktdG8tUENJIEJyaWRnZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiByZXYuIDEuMSAoMTk5OCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggNTU5OGI0Ny4uNTBkNjY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJwY2kuaCIKIAogCi1zdGF0aWMgdm9pZAordm9pZAogcGNpX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc25vKQogewogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CkBAIC05NywxMCArOTcsNyBAQAogCWNoYXIgKmR0eXBlID0gcmVzb3VyY2UgPCBQQ0lfQlJJREdFX1JFU09VUkNFUyA/ICJkZXZpY2UiIDogImJyaWRnZSI7CiAJaW50IGVycjsKIAotCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7Ci0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKLQkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKwlyb290ID0gcGNpYmlvc19zZWxlY3Rfcm9vdChkZXYsIHJlcyk7CiAKIAllcnIgPSAtRUlOVkFMOwogCWlmIChyb290ICE9IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCA2NDg1Zjc1Li5kZGM3NDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTIyMSw2ICsyMjEsMTMgQEAKIAl0cmlzdGF0ZSAiTkVDIFZSQzQxNzMgQ0FSRFUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9WUjQxWFggJiYgUENJICYmIFBDTUNJQQogCitjb25maWcgT01BUF9DRgorCXRyaXN0YXRlICJPTUFQIENvbXBhY3RGbGFzaCBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gUENNQ0lBICYmIEFSQ0hfT01BUDE2WFgKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIENvbXBhY3RGbGFzaCBjb250cm9sbGVyIG9uIE9NQVAuCisJICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHN1cHBvcnQgIlRydWUgSURFIiBtb2RlLgorCiBjb25maWcgUENDQVJEX05PTlNUQVRJQwogCXRyaXN0YXRlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKaW5kZXggZWY2OTRjNy4uYTQxZmJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDcgQEAKIG9iai0kKENPTkZJR19QQ01DSUFfQVUxWDAwKQkJCSs9IGF1MXgwMF9zcy5vCiBvYmotJChDT05GSUdfUENNQ0lBX1ZSQzQxNzEpCQkJKz0gdnJjNDE3MV9jYXJkLm8KIG9iai0kKENPTkZJR19QQ01DSUFfVlJDNDE3MykJCQkrPSB2cmM0MTczX2NhcmR1Lm8KK29iai0kKENPTkZJR19PTUFQX0NGKQkJCQkrPSBvbWFwX2NmLm8KIAogc2ExMXh4X2NvcmUteQkJCQkJKz0gc29jX2NvbW1vbi5vIHNhMTF4eF9iYXNlLm8KIHB4YTJ4eF9jb3JlLXkJCQkJCSs9IHNvY19jb21tb24ubyBweGEyeHhfYmFzZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCBlMzkxNzhmLi5mYWJkMzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTY1NCw5ICs2NTQsMTAgQEAKIAkJc2t0LT50aHJlYWQgPSBOVUxMOwogCQljb21wbGV0ZV9hbmRfZXhpdCgmc2t0LT50aHJlYWRfZG9uZSwgMCk7CiAJfQotCWNvbXBsZXRlKCZza3QtPnRocmVhZF9kb25lKTsKIAogCWFkZF93YWl0X3F1ZXVlKCZza3QtPnRocmVhZF93YWl0LCAmd2FpdCk7CisJY29tcGxldGUoJnNrdC0+dGhyZWFkX2RvbmUpOworCiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1bnNpZ25lZCBpbnQgZXZlbnRzOwpAQCAtNjgyLDExICs2ODMsMTEgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc2NoZWR1bGUoKTsKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCiAJCWlmICghc2t0LT50aHJlYWQpCiAJCQlicmVhazsKKworCQlzY2hlZHVsZSgpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJfQogCXJlbW92ZV93YWl0X3F1ZXVlKCZza3QtPnRocmVhZF93YWl0LCAmd2FpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCmluZGV4IDZiYmZiZDAuLjU1ODY3YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaApAQCAtMTcsOSArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNkZWZpbmUgQ0xJRU5UX01BR0lDIAkweDUxRTYKLXR5cGVkZWYgc3RydWN0IGNsaWVudF90IGNsaWVudF90OwotCiAvKiBGbGFncyBpbiBjbGllbnQgc3RhdGUgKi8KICNkZWZpbmUgQ0xJRU5UX0NPTkZJR19MT0NLRUQJMHgwMDAxCiAjZGVmaW5lIENMSUVOVF9JUlFfUkVRCQkweDAwMDIKQEAgLTQ1LDcgKzQyLDYgQEAKIHR5cGVkZWYgc3RydWN0IGNvbmZpZ190IHsKICAgICB1X2ludAkJc3RhdGU7CiAgICAgdV9pbnQJCUF0dHJpYnV0ZXM7Ci0gICAgdV9pbnQJCVZjYywgVnBwMSwgVnBwMjsKICAgICB1X2ludAkJSW50VHlwZTsKICAgICB1X2ludAkJQ29uZmlnQmFzZTsKICAgICB1X2NoYXIJCVN0YXR1cywgUGluLCBDb3B5LCBPcHRpb24sIEV4dFN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IDQzZGEyZTkuLjA4MDYwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtMzU0LDYgKzM1NCw3IEBACiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwogCWRzX2RiZygxLCAicmVsZWFzaW5nIGRldiAlcFxuIiwgcF9kZXYpOwogCXBjbWNpYV9wdXRfc29ja2V0KHBfZGV2LT5zb2NrZXQpOworCWtmcmVlKHBfZGV2LT5kZXZuYW1lKTsKIAlrZnJlZShwX2Rldik7CiB9CiAKQEAgLTQyNCw5ICs0MjUsMTMgQEAKIHsKIAljaXN0cGxfbWFuZmlkX3QgbWFuZl9pZDsKIAljaXN0cGxfZnVuY2lkX3QgZnVuY19pZDsKLQljaXN0cGxfdmVyc18xX3QJdmVyczE7CisJY2lzdHBsX3ZlcnNfMV90CSp2ZXJzMTsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCXZlcnMxID0ga21hbGxvYyhzaXplb2YoKnZlcnMxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZXJzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAoIXBjY2FyZF9yZWFkX3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLAogCQkJICAgICAgIENJU1RQTF9NQU5GSUQsICZtYW5mX2lkKSkgewogCQlwX2Rldi0+bWFuZl9pZCA9IG1hbmZfaWQubWFuZjsKQEAgLTQ0MywyMyArNDQ4LDMwIEBACiAJCS8qIHJ1bGUgb2YgdGh1bWI6IGNhcmRzIHdpdGggbm8gRlVOQ0lELCBidXQgd2l0aAogCQkgKiBjb21tb24gbWVtb3J5IGRldmljZSBnZW9tZXRyeSBpbmZvcm1hdGlvbiwgYXJlCiAJCSAqIHByb2JhYmx5IG1lbW9yeSBjYXJkcyAoZnJvbSBwY21jaWEtY3MpICovCi0JCWNpc3RwbF9kZXZpY2VfZ2VvX3QgZGV2Z2VvOworCQljaXN0cGxfZGV2aWNlX2dlb190ICpkZXZnZW87CisKKwkJZGV2Z2VvID0ga21hbGxvYyhzaXplb2YoKmRldmdlbyksIEdGUF9LRVJORUwpOworCQlpZiAoIWRldmdlbykgeworCQkJa2ZyZWUodmVyczEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAkJaWYgKCFwY2NhcmRfcmVhZF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywKLQkJCQkgICAgICBDSVNUUExfREVWSUNFX0dFTywgJmRldmdlbykpIHsKKwkJCQkgICAgICBDSVNUUExfREVWSUNFX0dFTywgZGV2Z2VvKSkgewogCQkJZHNfZGJnKDAsICJtZW0gZGV2aWNlIGdlb21ldHJ5IHByb2JhYmx5IG1lYW5zICIKIAkJCSAgICAgICAiRlVOQ0lEX01FTU9SWVxuIik7CiAJCQlwX2Rldi0+ZnVuY19pZCA9IENJU1RQTF9GVU5DSURfTUVNT1JZOwogCQkJcF9kZXYtPmhhc19mdW5jX2lkID0gMTsKIAkJfQorCQlrZnJlZShkZXZnZW8pOwogCX0KIAogCWlmICghcGNjYXJkX3JlYWRfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIENJU1RQTF9WRVJTXzEsCi0JCQkgICAgICAgJnZlcnMxKSkgewotCQlmb3IgKGk9MDsgaSA8IHZlcnMxLm5zOyBpKyspIHsKKwkJCSAgICAgICB2ZXJzMSkpIHsKKwkJZm9yIChpPTA7IGkgPCB2ZXJzMS0+bnM7IGkrKykgewogCQkJY2hhciAqdG1wOwogCQkJdW5zaWduZWQgaW50IGxlbmd0aDsKIAotCQkJdG1wID0gdmVyczEuc3RyICsgdmVyczEub2ZzW2ldOworCQkJdG1wID0gdmVyczEtPnN0ciArIHZlcnMxLT5vZnNbaV07CiAKIAkJCWxlbmd0aCA9IHN0cmxlbih0bXApICsgMTsKIAkJCWlmICgobGVuZ3RoIDwgMykgfHwgKGxlbmd0aCA+IDI1NSkpCkBAIC00NzUsNiArNDg3LDcgQEAKIAkJfQogCX0KIAorCWtmcmVlKHZlcnMxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDkyLDYgKzUwNSw3IEBACiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJ1c19pZF9sZW47CiAKIAlzID0gcGNtY2lhX2dldF9zb2NrZXQocyk7CiAJaWYgKCFzKQpAQCAtNTE1LDcgKzUyOSwxMiBAQAogCXBfZGV2LT5kZXYuYnVzID0gJnBjbWNpYV9idXNfdHlwZTsKIAlwX2Rldi0+ZGV2LnBhcmVudCA9IHMtPmRldi5kZXY7CiAJcF9kZXYtPmRldi5yZWxlYXNlID0gcGNtY2lhX3JlbGVhc2VfZGV2OwotCXNwcmludGYgKHBfZGV2LT5kZXYuYnVzX2lkLCAiJWQuJWQiLCBwX2Rldi0+c29ja2V0LT5zb2NrLCBwX2Rldi0+ZGV2aWNlX25vKTsKKwlidXNfaWRfbGVuID0gc3ByaW50ZiAocF9kZXYtPmRldi5idXNfaWQsICIlZC4lZCIsIHBfZGV2LT5zb2NrZXQtPnNvY2ssIHBfZGV2LT5kZXZpY2Vfbm8pOworCisJcF9kZXYtPmRldm5hbWUgPSBrbWFsbG9jKDYgKyBidXNfaWRfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX2Rldi0+ZGV2bmFtZSkKKwkJZ290byBlcnJfZnJlZTsKKwlzcHJpbnRmIChwX2Rldi0+ZGV2bmFtZSwgInBjbWNpYSVzIiwgcF9kZXYtPmRldi5idXNfaWQpOwogCiAJLyogY29tcGF0ICovCiAJcF9kZXYtPnN0YXRlID0gQ0xJRU5UX1VOQk9VTkQ7CkBAIC01NDAsNiArNTU5LDcgQEAKIAlyZXR1cm4gcF9kZXY7CiAKICBlcnJfZnJlZToKKwlrZnJlZShwX2Rldi0+ZGV2bmFtZSk7CiAJa2ZyZWUocF9kZXYpOwogCXMtPmRldmljZV9jb3VudC0tOwogIGVycl9wdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMgYi9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL29tYXBfY2YuYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIG9tYXBfY2YuYyAtLSBPTUFQIDE2eHggQ29tcGFjdEZsYXNoIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKworCisvKiBOT1RFOiAgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gc3VwcG9ydCBtYW55IEkvTyBjYXJkcy4gIFRoZSAxNnh4IGNoaXBzIGhhdmUKKyAqIGhhcmQtd2lyZWQgdGltaW5ncyB0byBzdXBwb3J0IENvbXBhY3QgRmxhc2ggbWVtb3J5IGNhcmRzOyB0aGV5IHdvbid0IHdvcmsKKyAqIHdpdGggdmFyaW91cyBvdGhlciBkZXZpY2VzIChsaWtlIFdMQU4gYWRhcHRlcnMpIHdpdGhvdXQgc29tZSBleHRlcm5hbAorICogbG9naWMgdG8gaGVscCBvdXQuCisgKgorICogTk9URTogIENGIGNvbnRyb2xsZXIgZG9jcyBkaXNhZ3JlZSB3aXRoIGFkZHJlc3Mgc3BhY2UgZG9jcyBhcyB0byB3aGVyZQorICogQ0ZfQkFTRSByZWFsbHkgbGl2ZXM7IHRoaXMgaXMgYSBkb2MgZXJyYXR1bS4KKyAqLworI2RlZmluZQlDRl9CQVNFCTB4ZmZmZTI4MDAKKworLyogc3RhdHVzOyByZWFkIGFmdGVyIElSUSAqLworI2RlZmluZSBDRl9TVEFUVVNfUkVHCQlfX1JFRzE2KENGX0JBU0UgKyAweDAwKQorIwlkZWZpbmUJQ0ZfU1RBVFVTX0JBRF9SRUFECSgxIDw8IDIpCisjCWRlZmluZQlDRl9TVEFUVVNfQkFEX1dSSVRFCSgxIDw8IDEpCisjCWRlZmluZQlDRl9TVEFUVVNfQ0FSRF9ERVRFQ1QJKDEgPDwgMCkKKworLyogd2hpY2ggY2hpcHNlbGVjdCAoQ1MwLi5DUzMpIGlzIHVzZWQgZm9yIENGIChhY3RpdmUgbG93KSAqLworI2RlZmluZSBDRl9DRkdfUkVHCQlfX1JFRzE2KENGX0JBU0UgKyAweDAyKQorCisvKiBjYXJkIHJlc2V0ICovCisjZGVmaW5lIENGX0NPTlRST0xfUkVHCQlfX1JFRzE2KENGX0JBU0UgKyAweDA0KQorIwlkZWZpbmUJQ0ZfQ09OVFJPTF9SRVNFVAkoMSA8PCAwKQorCisjZGVmaW5lIG9tYXBfY2ZfcHJlc2VudCgpICghKENGX1NUQVRVU19SRUcgJiBDRl9TVEFUVVNfQ0FSRF9ERVRFQ1QpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJvbWFwX2NmIjsKKworc3RydWN0IG9tYXBfY2Zfc29ja2V0IHsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldAlzb2NrZXQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwl1bnNpZ25lZAkJcHJlc2VudDoxOworCXVuc2lnbmVkCQlhY3RpdmU6MTsKKworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJdW5zaWduZWQgbG9uZwkJcGh5c19jZjsKKwl1X2ludAkJCWlycTsKK307CisKKyNkZWZpbmUJUE9MTF9JTlRFUlZBTAkJKDIgKiBIWikKKworI2RlZmluZQlTWl8ySwkJCSgyICogU1pfMUspCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IG9tYXBfY2Zfc3NfaW5pdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3sKKwlyZXR1cm4gMDsKK30KKworLyogdGhlIHRpbWVyIGlzIHByaW1hcmlseSB0byBraWNrIHRoaXMgc29ja2V0J3MgcGNjYXJkZCAqLworc3RhdGljIHZvaWQgb21hcF9jZl90aW1lcih1bnNpZ25lZCBsb25nIF9jZikKK3sKKwlzdHJ1Y3Qgb21hcF9jZl9zb2NrZXQJKmNmID0gKHZvaWQgKikgX2NmOworCXVuc2lnbmVkCQlwcmVzZW50ID0gb21hcF9jZl9wcmVzZW50KCk7CisKKwlpZiAocHJlc2VudCAhPSBjZi0+cHJlc2VudCkgeworCQljZi0+cHJlc2VudCA9IHByZXNlbnQ7CisJCXByX2RlYnVnKCIlczogY2FyZCAlc1xuIiwgZHJpdmVyX25hbWUsCisJCQlwcmVzZW50ID8gInByZXNlbnQiIDogImdvbmUiKTsKKwkJcGNtY2lhX3BhcnNlX2V2ZW50cygmY2YtPnNvY2tldCwgU1NfREVURUNUKTsKKwl9CisKKwlpZiAoY2YtPmFjdGl2ZSkKKwkJbW9kX3RpbWVyKCZjZi0+dGltZXIsIGppZmZpZXMgKyBQT0xMX0lOVEVSVkFMKTsKK30KKworLyogVGhpcyBpcnEgaGFuZGxlciBwcmV2ZW50cyAiaXJxTk5OOiBub2JvZHkgY2FyZWQiIG1lc3NhZ2VzIGFzIGRyaXZlcnMKKyAqIGNsYWltIHRoZSBjYXJkJ3MgSVJRLiAgSXQgbWF5IGFsc28gZGV0ZWN0IHNvbWUgY2FyZCBpbnNlcnRpb25zLCBidXQKKyAqIG5vdCByZW1vdmFsczsgaXQgY2FuJ3QgYWx3YXlzIGVsaW1pbmF0ZSB0aW1lciBpcnFzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9jZl9pcnEoaW50IGlycSwgdm9pZCAqX2NmLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlvbWFwX2NmX3RpbWVyKCh1bnNpZ25lZCBsb25nKV9jZik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IG9tYXBfY2ZfZ2V0X3N0YXR1cyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdV9pbnQgKnNwKQoreworCWlmICghc3ApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRklYTUUgcG93ZXIgbWFuYWdlbWVudCBzaG91bGQgcHJvYmFibHkgYmUgYm9hcmQtc3BlY2lmaWM6CisJICogIC0gM1ZDQVJEIHZzIFhWQ0FSRCAoT1NLIG9ubHkgaGFuZGxlcyAzVkNBUkQpCisJICogIC0gUE9XRVJPTiAoc3dpdGNoZWQgb24vb2ZmIGJ5IHNldF9zb2NrZXQpCisJICovCisJaWYgKG9tYXBfY2ZfcHJlc2VudCgpKSB7CisJCXN0cnVjdCBvbWFwX2NmX3NvY2tldAkqY2Y7CisKKwkJKnNwID0gU1NfUkVBRFkgfCBTU19ERVRFQ1QgfCBTU19QT1dFUk9OIHwgU1NfM1ZDQVJEOworCQljZiA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3Qgb21hcF9jZl9zb2NrZXQsIHNvY2tldCk7CisJCXMtPmlycS5Bc3NpZ25lZElSUSA9IGNmLT5pcnE7CisJfSBlbHNlCisJCSpzcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK29tYXBfY2Zfc2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc3RydWN0IHNvY2tldF9zdGF0ZV90ICpzKQoreworCXUxNgkJY29udHJvbDsKKworCS8qIEZJWE1FIHNvbWUgbm9uLU9TSyBib2FyZHMgd2lsbCBzdXBwb3J0IHBvd2VyIHN3aXRjaGluZyAqLworCXN3aXRjaCAocy0+VmNjKSB7CisJY2FzZSAwOgorCWNhc2UgMzM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbnRyb2wgPSBDRl9DT05UUk9MX1JFRzsKKwlpZiAocy0+ZmxhZ3MgJiBTU19SRVNFVCkKKwkJQ0ZfQ09OVFJPTF9SRUcgPSBDRl9DT05UUk9MX1JFU0VUOworCWVsc2UKKwkJQ0ZfQ09OVFJPTF9SRUcgPSAwOworCisJcHJfZGVidWcoIiVzOiBWY2MgJWQsIGlvX2lycSAlZCwgZmxhZ3MgJTA0eCBjc2MgJTA0eFxuIiwKKwkJZHJpdmVyX25hbWUsIHMtPlZjYywgcy0+aW9faXJxLCBzLT5mbGFncywgcy0+Y3NjX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9jZl9zc19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQoreworCXByX2RlYnVnKCIlczogJXNcbiIsIGRyaXZlcl9uYW1lLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBvbWFwX2NmX3NldF9zb2NrZXQocywgJmRlYWRfc29ja2V0KTsKK30KKworLyogcmVnaW9ucyBhcmUgMksgZWFjaDogIG1lbSwgYXR0cmliLCBpbyAoYW5kIHJlc2VydmVkLWZvci1pZGUpICovCisKK3N0YXRpYyBpbnQKK29tYXBfY2Zfc2V0X2lvX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHBjY2FyZF9pb19tYXAgKmlvKQoreworCXN0cnVjdCBvbWFwX2NmX3NvY2tldAkqY2Y7CisKKwljZiA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3Qgb21hcF9jZl9zb2NrZXQsIHNvY2tldCk7CisJaW8tPmZsYWdzICY9IE1BUF9BQ1RJVkV8TUFQX0FUVFJJQnxNQVBfMTZCSVQ7CisJaW8tPnN0YXJ0ID0gY2YtPnBoeXNfY2YgKyBTWl80SzsKKwlpby0+c3RvcCA9IGlvLT5zdGFydCArIFNaXzJLIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb21hcF9jZl9zZXRfbWVtX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptYXApCit7CisJc3RydWN0IG9tYXBfY2Zfc29ja2V0CSpjZjsKKworCWlmIChtYXAtPmNhcmRfc3RhcnQpCisJCXJldHVybiAtRUlOVkFMOworCWNmID0gY29udGFpbmVyX29mKHMsIHN0cnVjdCBvbWFwX2NmX3NvY2tldCwgc29ja2V0KTsKKwltYXAtPnN0YXRpY19zdGFydCA9IGNmLT5waHlzX2NmOworCW1hcC0+ZmxhZ3MgJj0gTUFQX0FDVElWRXxNQVBfQVRUUklCfE1BUF8xNkJJVDsKKwlpZiAobWFwLT5mbGFncyAmIE1BUF9BVFRSSUIpCisJCW1hcC0+c3RhdGljX3N0YXJ0ICs9IFNaXzJLOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjY2FyZF9vcGVyYXRpb25zIG9tYXBfY2Zfb3BzID0geworCS5pbml0CQkJPSBvbWFwX2NmX3NzX2luaXQsCisJLnN1c3BlbmQJCT0gb21hcF9jZl9zc19zdXNwZW5kLAorCS5nZXRfc3RhdHVzCQk9IG9tYXBfY2ZfZ2V0X3N0YXR1cywKKwkuc2V0X3NvY2tldAkJPSBvbWFwX2NmX3NldF9zb2NrZXQsCisJLnNldF9pb19tYXAJCT0gb21hcF9jZl9zZXRfaW9fbWFwLAorCS5zZXRfbWVtX21hcAkJPSBvbWFwX2NmX3NldF9tZW1fbWFwLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBOT1RFOiAgcmlnaHQgbm93IHRoZSBvbmx5IGJvYXJkLXNwZWNpZmljIHBsYXRmb3JtX2RhdGEgaXMKKyAqICJ3aGF0IGNoaXBzZWxlY3QgaXMgdXNlZCIuICBCb2FyZHMgY291bGQgd2FudCBtb3JlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfY2ZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkCQlzZWc7CisJc3RydWN0IG9tYXBfY2Zfc29ja2V0CSpjZjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJaW50CQkJaXJxOworCWludAkJCXN0YXR1czsKKworCXNlZyA9IChpbnQpIGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAoc2VnID09IDAgfHwgc2VnID4gMykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBlaXRoZXIgQ0ZMQVNILklSRVEgKElOVF8xNjEwX0NGKSBvciBzb21lIEdQSU8gKi8KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghaXJxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNmID0ga2NhbGxvYygxLCBzaXplb2YgKmNmLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbml0X3RpbWVyKCZjZi0+dGltZXIpOworCWNmLT50aW1lci5mdW5jdGlvbiA9IG9tYXBfY2ZfdGltZXI7CisJY2YtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2Y7CisKKwljZi0+cGRldiA9IHBkZXY7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2YpOworCisJLyogdGhpcyBwcmltYXJpbHkganVzdCBzaHV0cyB1cCBpcnEgaGFuZGxpbmcgbm9pc2UgKi8KKwlzdGF0dXMgPSByZXF1ZXN0X2lycShpcnEsIG9tYXBfY2ZfaXJxLCBTQV9TSElSUSwKKwkJCWRyaXZlcl9uYW1lLCBjZik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDA7CisJY2YtPmlycSA9IGlycTsKKwljZi0+c29ja2V0LnBjaV9pcnEgPSBpcnE7CisKKwlzd2l0Y2ggKHNlZykgeworCS8qIE5PVEU6IENTMCBjb3VsZCBiZSBjb25maWd1cmVkIHRvbyAuLi4gKi8KKwljYXNlIDE6CisJCWNmLT5waHlzX2NmID0gT01BUF9DUzFfUEhZUzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljZi0+cGh5c19jZiA9IE9NQVBfQ1MyX1BIWVM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY2YtPnBoeXNfY2YgPSBvbWFwX2NzM19waHlzKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gIGZhaWwxOworCX0KKworCS8qIHBjbWNpYSBsYXllciBvbmx5IHJlbWFwcyAicmVhbCIgbWVtb3J5ICovCisJY2YtPnNvY2tldC5pb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZykKKwkJCWlvcmVtYXAoY2YtPnBoeXNfY2YgKyBTWl80SywgU1pfMkspOworCWlmICghY2YtPnNvY2tldC5pb19vZmZzZXQpCisJCWdvdG8gZmFpbDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjZi0+cGh5c19jZiwgU1pfOEssIGRyaXZlcl9uYW1lKSkKKwkJZ290byBmYWlsMTsKKworCS8qIE5PVEU6ICBDRiBjb25mbGljdHMgd2l0aCBNTUMxICovCisJb21hcF9jZmdfcmVnKFcxMV8xNjEwX0NGX0NEMSk7CisJb21hcF9jZmdfcmVnKFAxMV8xNjEwX0NGX0NEMik7CisJb21hcF9jZmdfcmVnKFIxMV8xNjEwX0NGX0lPSVMxNik7CisJb21hcF9jZmdfcmVnKFYxMF8xNjEwX0NGX0lSRVEpOworCW9tYXBfY2ZnX3JlZyhXMTBfMTYxMF9DRl9SRVNFVCk7CisKKwlDRl9DRkdfUkVHID0gfigxIDw8IHNlZyk7CisKKwlwcl9pbmZvKCIlczogY3MlZCBvbiBpcnEgJWRcbiIsIGRyaXZlcl9uYW1lLCBzZWcsIGlycSk7CisKKwkvKiBOT1RFOiAgYmV0dGVyIEVNSUZTIHNldHVwIG1pZ2h0IHN1cHBvcnQgbW9yZSBjYXJkczsgYnV0IHRoZQorCSAqIFRSTSBvbmx5IHNob3dzIGhvdyB0byBhZmZlY3QgcmVndWxhciBmbGFzaCBzaWduYWxzLCBub3QgdGhlaXIKKwkgKiBDRi9QQ01DSUEgdmFyaWFudHMuLi4KKwkgKi8KKwlwcl9kZWJ1ZygiJXM6IGNzJWQsIHByZXZpb3VzIGNjcyAlMDh4IGFjcyAlMDh4XG4iLCBkcml2ZXJfbmFtZSwKKwkJCXNlZywgRU1JRlNfQ0NTKHNlZyksIEVNSUZTX0FDUyhzZWcpKTsKKwlFTUlGU19DQ1Moc2VnKSA9IDB4MDAwNGExYjM7CS8qIHN5bmNoIG1vZGUgNCBldGMgKi8KKwlFTUlGU19BQ1Moc2VnKSA9IDB4MDAwMDAwMDA7CS8qIE9FIGhvbGQvc2V0dXAgKi8KKworCS8qIENGIHVzZXMgYXJteG9yX2NrLCB3aGljaCBpcyAiYWx3YXlzIiBhdmFpbGFibGUgKi8KKworCXByX2RlYnVnKCIlczogc3RzICUwNHggY2ZnICUwNHggY29udHJvbCAlMDR4ICVzXG4iLCBkcml2ZXJfbmFtZSwKKwkJQ0ZfU1RBVFVTX1JFRywgQ0ZfQ0ZHX1JFRywgQ0ZfQ09OVFJPTF9SRUcsCisJCW9tYXBfY2ZfcHJlc2VudCgpID8gInByZXNlbnQiIDogIihub3QgcHJlc2VudCkiKTsKKworCWNmLT5zb2NrZXQub3duZXIgPSBUSElTX01PRFVMRTsKKwljZi0+c29ja2V0LmRldi5kZXYgPSBkZXY7CisJY2YtPnNvY2tldC5vcHMgPSAmb21hcF9jZl9vcHM7CisJY2YtPnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX3N0YXRpY19vcHM7CisJY2YtPnNvY2tldC5mZWF0dXJlcyA9IFNTX0NBUF9QQ0NBUkQgfCBTU19DQVBfU1RBVElDX01BUAorCQkJCXwgU1NfQ0FQX01FTV9BTElHTjsKKwljZi0+c29ja2V0Lm1hcF9zaXplID0gU1pfMks7CisKKwlzdGF0dXMgPSBwY21jaWFfcmVnaXN0ZXJfc29ja2V0KCZjZi0+c29ja2V0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsMjsKKworCWNmLT5hY3RpdmUgPSAxOworCW1vZF90aW1lcigmY2YtPnRpbWVyLCBqaWZmaWVzICsgUE9MTF9JTlRFUlZBTCk7CisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBjZi0+c29ja2V0LmlvX29mZnNldCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGNmLT5waHlzX2NmLCBTWl84Syk7CitmYWlsMToKKwlmcmVlX2lycShpcnEsIGNmKTsKK2ZhaWwwOgorCWtmcmVlKGNmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwX2NmX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9tYXBfY2Zfc29ja2V0ICpjZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2YtPmFjdGl2ZSA9IDA7CisJcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KCZjZi0+c29ja2V0KTsKKwlkZWxfdGltZXJfc3luYygmY2YtPnRpbWVyKTsKKwlpb3VubWFwKCh2b2lkIF9faW9tZW0gKikgY2YtPnNvY2tldC5pb19vZmZzZXQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihjZi0+cGh5c19jZiwgU1pfOEspOworCWZyZWVfaXJxKGNmLT5pcnEsIGNmKTsKKwlrZnJlZShjZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9jZl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2csIHUzMiBsZXZlbCkKK3sKKwlpZiAobGV2ZWwgIT0gU1VTUEVORF9TQVZFX1NUQVRFKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZChkZXYsIG1lc2cpOworfQorCitzdGF0aWMgaW50IG9tYXBfY2ZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCWlmIChsZXZlbCAhPSBSRVNVTUVfUkVTVE9SRV9TVEFURSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgb21hcF9jZl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gKGNoYXIgKikgZHJpdmVyX25hbWUsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IG9tYXBfY2ZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbWFwX2NmX3JlbW92ZSksCisJLnN1c3BlbmQgCT0gb21hcF9jZl9zdXNwZW5kLAorCS5yZXN1bWUgCT0gb21hcF9jZl9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2NmX2luaXQodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCisJCWRyaXZlcl9yZWdpc3Rlcigmb21hcF9jZl9kcml2ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9jZl9leGl0KHZvaWQpCit7CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9jZl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvbWFwX2NmX2luaXQpOworbW9kdWxlX2V4aXQob21hcF9jZl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIENGIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYwppbmRleCA1OTliMTE2Li44OTAyMmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJICAgIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDJfQ0hBTkdFX1ZBTElEKSkgewogCQlpZiAobW9kLT5WcHAxICE9IG1vZC0+VnBwMikKIAkJCXJldHVybiBDU19CQURfVlBQOwotCQljLT5WcHAxID0gYy0+VnBwMiA9IHMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7CisJCXMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7CiAJCWlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCiAJCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKIAl9IGVsc2UgaWYgKChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDFfQ0hBTkdFX1ZBTElEKSB8fApAQCAtNjIzLDggKzYyMyw2IEBACiAJaWYgKHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KSkKIAkJcmV0dXJuIENTX0JBRF9WUFA7CiAKLQljLT5WY2MgPSByZXEtPlZjYzsgYy0+VnBwMSA9IGMtPlZwcDIgPSByZXEtPlZwcDE7Ci0KIAkvKiBQaWNrIG1lbW9yeSBvciBJL08gY2FyZCwgRE1BIG1vZGUsIGludGVycnVwdCAqLwogCWMtPkludFR5cGUgPSByZXEtPkludFR5cGU7CiAJYy0+QXR0cmlidXRlcyA9IHJlcS0+QXR0cmlidXRlczsKQEAgLTgyMiw3ICs4MjAsNyBAQAogCQkJCQkgICgocmVxLT5BdHRyaWJ1dGVzICYgSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HKSB8fAogCQkJCQkgICAocy0+ZnVuY3Rpb25zID4gMSkgfHwKIAkJCQkJICAgKGlycSA9PSBzLT5wY2lfaXJxKSkgPyBTQV9TSElSUSA6IDAsCi0JCQkJCSAgcF9kZXYtPmRldi5idXNfaWQsCisJCQkJCSAgcF9kZXYtPmRldm5hbWUsCiAJCQkJCSAgKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkgPyByZXEtPkluc3RhbmNlIDogZGF0YSk7CiAJCQlpZiAoIXJldCkgewogCQkJCWlmICghKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkpCkBAIC04MzIsNyArODMwLDggQEAKIAkJfQogCX0KICNlbmRpZgotCWlmIChyZXQpIHsKKwkvKiBvbmx5IGFzc2lnbiBQQ0kgaXJxIGlmIG5vIElSUSBhbHJlYWR5IGFzc2lnbmVkICovCisJaWYgKHJldCAmJiAhcy0+aXJxLkFzc2lnbmVkSVJRKSB7CiAJCWlmICghcy0+cGNpX2lycSkKIAkJCXJldHVybiByZXQ7CiAJCWlycSA9IHMtPnBjaV9pcnE7CkBAIC04NDMsNyArODQyLDcgQEAKIAkJCQkoKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykgfHwKIAkJCQkgKHMtPmZ1bmN0aW9ucyA+IDEpIHx8CiAJCQkJIChpcnEgPT0gcy0+cGNpX2lycSkpID8gU0FfU0hJUlEgOiAwLAotCQkJCXBfZGV2LT5kZXYuYnVzX2lkLCByZXEtPkluc3RhbmNlKSkKKwkJCQlwX2Rldi0+ZGV2bmFtZSwgcmVxLT5JbnN0YW5jZSkpCiAJCQlyZXR1cm4gQ1NfSU5fVVNFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvdG9waWMuaCBiL2RyaXZlcnMvcGNtY2lhL3RvcGljLmgKaW5kZXggYmU0MjBiYi4uZWRjY2ZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdG9waWMuaAorKysgYi9kcml2ZXJzL3BjbWNpYS90b3BpYy5oCkBAIC0xMDEsNiArMTAxLDggQEAKICNkZWZpbmUgIFRPUElDOTdfQVZTX0FVRElPX0NPTlRST0wJMHgwMgogI2RlZmluZSAgVE9QSUM5N19BVlNfVklERU9fQ09OVFJPTAkweDAxCiAKKyNkZWZpbmUgVE9QSUNfRVhDQV9JRl9DT05UUk9MCQkweDNlCS8qIDggYml0ICovCisjZGVmaW5lIFRPUElDX0VYQ0FfSUZDXzMzVl9FTkEJCTB4MDEKIAogc3RhdGljIHZvaWQgdG9waWM5N196b29tX3ZpZGVvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBpbnQgb25vZmYpCiB7CkBAIC0xMzcsNCArMTM5LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCB0b3BpYzk1X292ZXJyaWRlKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCkKK3sKKwl1OCBmY3RybDsKKworCS8qIGVuYWJsZSAzLjNWIHN1cHBvcnQgZm9yIDE2Yml0IGNhcmRzICovCisJZmN0cmwgPSBleGNhX3JlYWRiKHNvY2tldCwgVE9QSUNfRVhDQV9JRl9DT05UUk9MKTsKKwlleGNhX3dyaXRlYihzb2NrZXQsIFRPUElDX0VYQ0FfSUZfQ09OVFJPTCwgZmN0cmwgfCBUT1BJQ19FWENBX0lGQ18zM1ZfRU5BKTsKKworCS8qIHRlbGwgeWVudGEgdG8gdXNlIGV4Y2EgcmVnaXN0ZXJzIHRvIHBvd2VyIDE2Yml0IGNhcmRzICovCisJc29ja2V0LT5mbGFncyB8PSBZRU5UQV8xNkJJVF9QT1dFUl9FWENBIHwgWUVOVEFfMTZCSVRfUE9XRVJfREY7CisKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9UT1BJQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCmluZGV4IDYyZmQ3MDUuLmYwOTk3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCkBAIC03Miw2ICs3Miw3IEBACiB7CiAJZGVidWcoIiVwICUwNHggJTA4eFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGVsKHZhbCwgc29ja2V0LT5iYXNlICsgcmVnKTsKKwlyZWFkbChzb2NrZXQtPmJhc2UgKyByZWcpOyAvKiBhdm9pZCBwcm9ibGVtcyB3aXRoIFBDSSB3cml0ZSBwb3N0aW5nICovCiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggY29uZmlnX3JlYWRiKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgdW5zaWduZWQgb2Zmc2V0KQpAQCAtMTM2LDYgKzEzNyw3IEBACiB7CiAJZGVidWcoIiVwICUwNHggJTAyeFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGViKHZhbCwgc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOworCXJlYWRiKHNvY2tldC0+YmFzZSArIDB4ODAwICsgcmVnKTsgLyogUENJIHdyaXRlIHBvc3RpbmcuLi4gKi8KIH0KIAogc3RhdGljIHZvaWQgZXhjYV93cml0ZXcoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCB1bnNpZ25lZCByZWcsIHUxNiB2YWwpCkBAIC0xNDMsNiArMTQ1LDEwIEBACiAJZGVidWcoIiVwICUwNHggJTA0eFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGViKHZhbCwgc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOwogCXdyaXRlYih2YWwgPj4gOCwgc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcgKyAxKTsKKworCS8qIFBDSSB3cml0ZSBwb3N0aW5nLi4uICovCisJcmVhZGIoc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOworCXJlYWRiKHNvY2tldC0+YmFzZSArIDB4ODAwICsgcmVnICsgMSk7CiB9CiAKIC8qCkBAIC0xODQsMjIgKzE5MCw1MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHllbnRhX1ZjY19wb3dlcih1MzIgY29udHJvbCkKK3N0YXRpYyB2b2lkIHllbnRhX2dldF9wb3dlcihzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKIHsKLQlzd2l0Y2ggKGNvbnRyb2wgJiBDQl9TQ19WQ0NfTUFTSykgewotCWNhc2UgQ0JfU0NfVkNDXzVWOiByZXR1cm4gNTA7Ci0JY2FzZSBDQl9TQ19WQ0NfM1Y6IHJldHVybiAzMzsKLQlkZWZhdWx0OiByZXR1cm4gMDsKLQl9Ci19CisJaWYgKCEoY2JfcmVhZGwoc29ja2V0LCBDQl9TT0NLRVRfU1RBVEUpICYgQ0JfQ0JDQVJEKSAmJgorCSAgICAoc29ja2V0LT5mbGFncyAmIFlFTlRBXzE2QklUX1BPV0VSX0VYQ0EpKSB7CisJCXU4IHJlZywgdmNjLCB2cHA7CiAKLXN0YXRpYyBpbnQgeWVudGFfVnBwX3Bvd2VyKHUzMiBjb250cm9sKQotewotCXN3aXRjaCAoY29udHJvbCAmIENCX1NDX1ZQUF9NQVNLKSB7Ci0JY2FzZSBDQl9TQ19WUFBfMTJWOiByZXR1cm4gMTIwOwotCWNhc2UgQ0JfU0NfVlBQXzVWOiByZXR1cm4gNTA7Ci0JY2FzZSBDQl9TQ19WUFBfM1Y6IHJldHVybiAzMzsKLQlkZWZhdWx0OiByZXR1cm4gMDsKKwkJcmVnID0gZXhjYV9yZWFkYihzb2NrZXQsIEkzNjVfUE9XRVIpOworCQl2Y2MgPSByZWcgJiBJMzY1X1ZDQ19NQVNLOworCQl2cHAgPSByZWcgJiBJMzY1X1ZQUDFfTUFTSzsKKwkJc3RhdGUtPlZjYyA9IHN0YXRlLT5WcHAgPSAwOworCisJCWlmIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfREYpIHsKKwkJCWlmICh2Y2MgPT0gSTM2NV9WQ0NfM1YpCisJCQkJc3RhdGUtPlZjYyA9IDMzOworCQkJaWYgKHZjYyA9PSBJMzY1X1ZDQ181VikKKwkJCQlzdGF0ZS0+VmNjID0gNTA7CisJCQlpZiAodnBwID09IEkzNjVfVlBQMV81VikKKwkJCQlzdGF0ZS0+VnBwID0gc3RhdGUtPlZjYzsKKwkJCWlmICh2cHAgPT0gSTM2NV9WUFAxXzEyVikKKwkJCQlzdGF0ZS0+VnBwID0gMTIwOworCQl9IGVsc2UgeworCQkJaWYgKHJlZyAmIEkzNjVfVkNDXzVWKSB7CisJCQkJc3RhdGUtPlZjYyA9IDUwOworCQkJCWlmICh2cHAgPT0gSTM2NV9WUFAxXzVWKQorCQkJCQlzdGF0ZS0+VnBwID0gNTA7CisJCQkJaWYgKHZwcCA9PSBJMzY1X1ZQUDFfMTJWKQorCQkJCQlzdGF0ZS0+VnBwID0gMTIwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdTMyIGNvbnRyb2w7CisKKwkJY29udHJvbCA9IGNiX3JlYWRsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wpOworCisJCXN3aXRjaCAoY29udHJvbCAmIENCX1NDX1ZDQ19NQVNLKSB7CisJCWNhc2UgQ0JfU0NfVkNDXzVWOiBzdGF0ZS0+VmNjID0gNTA7IGJyZWFrOworCQljYXNlIENCX1NDX1ZDQ18zVjogc3RhdGUtPlZjYyA9IDMzOyBicmVhazsKKwkJZGVmYXVsdDogc3RhdGUtPlZjYyA9IDA7CisJCX0KKworCQlzd2l0Y2ggKGNvbnRyb2wgJiBDQl9TQ19WUFBfTUFTSykgeworCQljYXNlIENCX1NDX1ZQUF8xMlY6IHN0YXRlLT5WcHAgPSAxMjA7IGJyZWFrOworCQljYXNlIENCX1NDX1ZQUF81Vjogc3RhdGUtPlZwcCA9IDUwOyBicmVhazsKKwkJY2FzZSBDQl9TQ19WUFBfM1Y6IHN0YXRlLT5WcHAgPSAzMzsgYnJlYWs7CisJCWRlZmF1bHQ6IHN0YXRlLT5WcHAgPSAwOworCQl9CiAJfQogfQogCkBAIC0yMTEsOCArMjQ3LDcgQEAKIAogCWNvbnRyb2wgPSBjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9DT05UUk9MKTsKIAotCXN0YXRlLT5WY2MgPSB5ZW50YV9WY2NfcG93ZXIoY29udHJvbCk7Ci0Jc3RhdGUtPlZwcCA9IHllbnRhX1ZwcF9wb3dlcihjb250cm9sKTsKKwl5ZW50YV9nZXRfcG93ZXIoc29ja2V0LCBzdGF0ZSk7CiAJc3RhdGUtPmlvX2lycSA9IHNvY2tldC0+aW9faXJxOwogCiAJaWYgKGNiX3JlYWRsKHNvY2tldCwgQ0JfU09DS0VUX1NUQVRFKSAmIENCX0NCQ0FSRCkgewpAQCAtMjQ2LDE5ICsyODEsNTQgQEAKIAogc3RhdGljIHZvaWQgeWVudGFfc2V0X3Bvd2VyKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQogewotCXUzMiByZWcgPSAwOwkvKiBDQl9TQ19TVFBDTEs/ICovCi0Jc3dpdGNoIChzdGF0ZS0+VmNjKSB7Ci0JY2FzZSAzMzogcmVnID0gQ0JfU0NfVkNDXzNWOyBicmVhazsKLQljYXNlIDUwOiByZWcgPSBDQl9TQ19WQ0NfNVY7IGJyZWFrOwotCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCS8qIHNvbWUgYmlyZGdlcyByZXF1aXJlIHRvIHVzZSB0aGUgRXhDQSByZWdpc3RlcnMgdG8gcG93ZXIgMTZiaXQgY2FyZHMgKi8KKwlpZiAoIShjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9TVEFURSkgJiBDQl9DQkNBUkQpICYmCisJICAgIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfRVhDQSkpIHsKKwkJdTggcmVnLCBvbGQ7CisJCXJlZyA9IG9sZCA9IGV4Y2FfcmVhZGIoc29ja2V0LCBJMzY1X1BPV0VSKTsKKwkJcmVnICY9IH4oSTM2NV9WQ0NfTUFTSyB8IEkzNjVfVlBQMV9NQVNLIHwgSTM2NV9WUFAyX01BU0spOworCisJCS8qIGk4MjM2NVNMLURGIHN0eWxlICovCisJCWlmIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfREYpIHsKKwkJCXN3aXRjaCAoc3RhdGUtPlZjYykgeworCQkJY2FzZSAzMzogcmVnIHw9IEkzNjVfVkNDXzNWOyBicmVhazsKKwkJCWNhc2UgNTA6IHJlZyB8PSBJMzY1X1ZDQ181VjsgYnJlYWs7CisJCQlkZWZhdWx0OiByZWcgPSAwOyBicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoc3RhdGUtPlZwcCkgeworCQkJY2FzZSAzMzoKKwkJCWNhc2UgNTA6IHJlZyB8PSBJMzY1X1ZQUDFfNVY7IGJyZWFrOworCQkJY2FzZSAxMjA6IHJlZyB8PSBJMzY1X1ZQUDFfMTJWOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGk4MjM2NVNMLUIgc3R5bGUgKi8KKwkJCXN3aXRjaCAoc3RhdGUtPlZjYykgeworCQkJY2FzZSA1MDogcmVnIHw9IEkzNjVfVkNDXzVWOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCQkJfQorCQkJc3dpdGNoIChzdGF0ZS0+VnBwKSB7CisJCQljYXNlIDUwOiByZWcgfD0gSTM2NV9WUFAxXzVWIHwgSTM2NV9WUFAyXzVWOyBicmVhazsKKwkJCWNhc2UgMTIwOiByZWcgfD0gSTM2NV9WUFAxXzEyViB8IEkzNjVfVlBQMl8xMlY7IGJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHJlZyAhPSBvbGQpCisJCQlleGNhX3dyaXRlYihzb2NrZXQsIEkzNjVfUE9XRVIsIHJlZyk7CisJfSBlbHNlIHsKKwkJdTMyIHJlZyA9IDA7CS8qIENCX1NDX1NUUENMSz8gKi8KKwkJc3dpdGNoIChzdGF0ZS0+VmNjKSB7CisJCWNhc2UgMzM6IHJlZyA9IENCX1NDX1ZDQ18zVjsgYnJlYWs7CisJCWNhc2UgNTA6IHJlZyA9IENCX1NDX1ZDQ181VjsgYnJlYWs7CisJCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCQl9CisJCXN3aXRjaCAoc3RhdGUtPlZwcCkgeworCQljYXNlIDMzOiAgcmVnIHw9IENCX1NDX1ZQUF8zVjsgYnJlYWs7CisJCWNhc2UgNTA6ICByZWcgfD0gQ0JfU0NfVlBQXzVWOyBicmVhazsKKwkJY2FzZSAxMjA6IHJlZyB8PSBDQl9TQ19WUFBfMTJWOyBicmVhazsKKwkJfQorCQlpZiAocmVnICE9IGNiX3JlYWRsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wpKQorCQkJY2Jfd3JpdGVsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wsIHJlZyk7CiAJfQotCXN3aXRjaCAoc3RhdGUtPlZwcCkgewotCWNhc2UgMzM6ICByZWcgfD0gQ0JfU0NfVlBQXzNWOyBicmVhazsKLQljYXNlIDUwOiAgcmVnIHw9IENCX1NDX1ZQUF81VjsgYnJlYWs7Ci0JY2FzZSAxMjA6IHJlZyB8PSBDQl9TQ19WUFBfMTJWOyBicmVhazsKLQl9Ci0JaWYgKHJlZyAhPSBjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9DT05UUk9MKSkKLQkJY2Jfd3JpdGVsKHNvY2tldCwgQ0JfU09DS0VUX0NPTlRST0wsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgeWVudGFfc2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQpAQCAtNjAzLDcgKzY3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3JlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIGludCBuciwgdW5zaWduZWQgdHlwZSwgaW50IGFkZHJfc3RhcnQsIGludCBhZGRyX2VuZCkKK3N0YXRpYyBpbnQgeWVudGFfYWxsb2NhdGVfcmVzKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgaW50IG5yLCB1bnNpZ25lZCB0eXBlLCBpbnQgYWRkcl9zdGFydCwgaW50IGFkZHJfZW5kKQogewogCXN0cnVjdCByZXNvdXJjZSAqcm9vdCwgKnJlczsKIAlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOwpAQCAtNjEyLDcgKzY4Miw3IEBACiAJcmVzID0gc29ja2V0LT5kZXYtPnJlc291cmNlICsgUENJX0JSSURHRV9SRVNPVVJDRVMgKyBucjsKIAkvKiBBbHJlYWR5IGFsbG9jYXRlZD8gKi8KIAlpZiAocmVzLT5wYXJlbnQpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIG1lbW9yeSBsaW1pdCBpcyA0a0IsIG9uIElPIGl0J3MgNCBieXRlcyAqLwogCW1hc2sgPSB+MHhmZmY7CkBAIC02MjgsNyArNjk4LDcgQEAKIAkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcywgJnJlZ2lvbik7CiAJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcyk7CiAJCWlmIChyb290ICYmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPT0gMCkpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAieWVudGEgJXM6IFByZWFzc2lnbmVkIHJlc291cmNlICVkIGJ1c3kgb3Igbm90IGF2YWlsYWJsZSwgcmVjb25maWd1cmluZy4uLlxuIiwKIAkJCQlwY2lfbmFtZShzb2NrZXQtPmRldiksIG5yKTsKIAl9CkBAIC02MzYsMzUgKzcwNiwyNyBAQAogCWlmICh0eXBlICYgSU9SRVNPVVJDRV9JTykgewogCQlpZiAoKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19NQVgpKSB8fAogCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19BQ0MpKSB8fAotCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9JT19NSU4pKSkgewotCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfc3RhcnQsIHJlcy0+c3RhcnQpOwotCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfSU9fTUlOKSkpCisJCQlyZXR1cm4gMTsKIAl9IGVsc2UgewogCQlpZiAodHlwZSAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKIAkJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NQVgpKSB8fAogCQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX0FDQykpIHx8Ci0JCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUlOKSkpIHsKLQkJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7Ci0JCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorCQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01JTikpKQorCQkJCXJldHVybiAxOwogCQkJLyogQXBwcm94aW1hdGluZyBwcmVmZXRjaGFibGUgYnkgbm9uLXByZWZldGNoYWJsZSAqLwogCQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwogCQl9CiAJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NQVgpKSB8fAogCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fQUNDKSkgfHwKLQkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01JTikpKSB7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9lbmQsIHJlcy0+ZW5kKTsKLQkJCXJldHVybjsKLQkJfQorCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUlOKSkpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogbm8gcmVzb3VyY2Ugb2YgdHlwZSAleCBhdmFpbGFibGUsIHRyeWluZyB0byBjb250aW51ZS4uLlxuIiwKIAkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpLCB0eXBlKTsKIAlyZXMtPnN0YXJ0ID0gcmVzLT5lbmQgPSByZXMtPmZsYWdzID0gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTY3MiwxNCArNzM0LDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3Jlc291cmNlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQpCiB7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMCwgSU9SRVNPVVJDRV9JTywKKwlpbnQgcHJvZ3JhbSA9IDA7CisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAwLCBJT1JFU09VUkNFX0lPLAogCQkJICAgUENJX0NCX0lPX0JBU0VfMCwgUENJX0NCX0lPX0xJTUlUXzApOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDEsIElPUkVTT1VSQ0VfSU8sCisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAxLCBJT1JFU09VUkNFX0lPLAogCQkJICAgUENJX0NCX0lPX0JBU0VfMSwgUENJX0NCX0lPX0xJTUlUXzEpOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDIsIElPUkVTT1VSQ0VfTUVNfElPUkVTT1VSQ0VfUFJFRkVUQ0gsCisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAyLCBJT1JFU09VUkNFX01FTXxJT1JFU09VUkNFX1BSRUZFVENILAogCQkJICAgUENJX0NCX01FTU9SWV9CQVNFXzAsIFBDSV9DQl9NRU1PUllfTElNSVRfMCk7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMywgSU9SRVNPVVJDRV9NRU0sCisJcHJvZ3JhbSArPSB5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAzLCBJT1JFU09VUkNFX01FTSwKIAkJCSAgIFBDSV9DQl9NRU1PUllfQkFTRV8xLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEpOworCWlmIChwcm9ncmFtKQorCQlwY2lfc2V0dXBfY2FyZGJ1cyhzb2NrZXQtPmRldi0+c3Vib3JkaW5hdGUpOwogfQogCiAKQEAgLTY5NCw3ICs3NTksNyBAQAogCQlyZXMgPSBzb2NrZXQtPmRldi0+cmVzb3VyY2UgKyBQQ0lfQlJJREdFX1JFU09VUkNFUyArIGk7CiAJCWlmIChyZXMtPnN0YXJ0ICE9IDAgJiYgcmVzLT5lbmQgIT0gMCkKIAkJCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKLQkJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gMDsKKwkJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gcmVzLT5mbGFncyA9IDA7CiAJfQogfQogCkBAIC03NTEsNiArODE2LDcgQEAKIAlDQVJEQlVTX1RZUEVfVEkxMlhYLAogCUNBUkRCVVNfVFlQRV9USTEyNTAsCiAJQ0FSREJVU19UWVBFX1JJQ09ILAorCUNBUkRCVVNfVFlQRV9UT1BJQzk1LAogCUNBUkRCVVNfVFlQRV9UT1BJQzk3LAogCUNBUkRCVVNfVFlQRV9PMk1JQ1JPLAogfTsKQEAgLTc4OSw2ICs4NTUsOSBAQAogCQkuc2F2ZV9zdGF0ZQk9IHJpY29oX3NhdmVfc3RhdGUsCiAJCS5yZXN0b3JlX3N0YXRlCT0gcmljb2hfcmVzdG9yZV9zdGF0ZSwKIAl9LAorCVtDQVJEQlVTX1RZUEVfVE9QSUM5NV0JPSB7CisJCS5vdmVycmlkZQk9IHRvcGljOTVfb3ZlcnJpZGUsCisJfSwKIAlbQ0FSREJVU19UWVBFX1RPUElDOTddCT0gewogCQkub3ZlcnJpZGUJPSB0b3BpYzk3X292ZXJyaWRlLAogCX0sCkBAIC0xMTk2LDYgKzEyNjUsNyBAQAogCUNCX0lEKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3NiwgUklDT0gpLAogCUNCX0lEKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3OCwgUklDT0gpLAogCisJQ0JfSUQoUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUM5NSwgVE9QSUM5NSksCiAJQ0JfSUQoUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUM5NywgVE9QSUM5NyksCiAJQ0JfSUQoUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVE9QSUMxMDAsIFRPUElDOTcpLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuaCBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5oCmluZGV4IDRlNjM3ZWUuLjRlNzVlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5oCkBAIC05NSw2ICs5NSwxMiBAQAogICovCiAjZGVmaW5lIENCX01FTV9QQUdFKG1hcCkJKDB4NDAgKyAobWFwKSkKIAorCisvKiBjb250cm9sIGhvdyAxNmJpdCBjYXJkcyBhcmUgcG93ZXJlZCAqLworI2RlZmluZSBZRU5UQV8xNkJJVF9QT1dFUl9FWENBCTB4MDAwMDAwMDEKKyNkZWZpbmUgWUVOVEFfMTZCSVRfUE9XRVJfREYJMHgwMDAwMDAwMgorCisKIHN0cnVjdCB5ZW50YV9zb2NrZXQ7CiAKIHN0cnVjdCBjYXJkYnVzX3R5cGUgewpAQCAtMTEzLDYgKzExOSw4IEBACiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgc29ja2V0OwogCXN0cnVjdCBjYXJkYnVzX3R5cGUgKnR5cGU7CiAKKwl1MzIgZmxhZ3M7CisKIAkvKiBmb3IgUENJIGludGVycnVwdCBwcm9iaW5nICovCiAJdW5zaWduZWQgaW50IHByb2JlX3N0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL0tjb25maWcKaW5kZXggNjc3NjMwOC4uYzUxNDMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9LY29uZmlnCkBAIC02LDcgKzYsNyBAQAogCiBjb25maWcgUE5QCiAJYm9vbCAiUGx1ZyBhbmQgUGxheSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNBIHx8IEFDUElfQlVTCisJZGVwZW5kcyBvbiBJU0EgfHwgQUNQSQogCS0tLWhlbHAtLS0KIAkgIFBsdWcgYW5kIFBsYXkgKFBuUCkgaXMgYSBzdGFuZGFyZCBmb3IgcGVyaXBoZXJhbHMgd2hpY2ggYWxsb3dzIHRob3NlCiAJICBwZXJpcGhlcmFscyB0byBiZSBjb25maWd1cmVkIGJ5IHNvZnR3YXJlLCBlLmcuIGFzc2lnbiBJUlEncyBvciBvdGhlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY2FyZC5jIGIvZHJpdmVycy9wbnAvY2FyZC5jCmluZGV4IDZlNTIyOWU5Li5lOTVlZDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jYXJkLmMKKysrIGIvZHJpdmVycy9wbnAvY2FyZC5jCkBAIC04LDEzICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE5QX0RFQlVHCi0JI2RlZmluZSBERUJVRwotI2Vsc2UKLQkjdW5kZWYgREVCVUcKLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9kcml2ZXIuYyBiL2RyaXZlcnMvcG5wL2RyaXZlci5jCmluZGV4IDFkMDM3YzIuLjMzZGEyNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvcG5wL2RyaXZlci5jCkBAIC0xMSwxMyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaWZkZWYgQ09ORklHX1BOUF9ERUJVRwotCSNkZWZpbmUgREVCVUcKLSNlbHNlCi0JI3VuZGVmIERFQlVHCi0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgImJhc2UuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKaW5kZXggODJjNWVkZC4uYmVlZGQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCkBAIC0xNDIsMTcgKzE0Miw2IEBACiAJaXNhcG5wX3dyaXRlX2J5dGUoaWR4KzEsIHZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkICppc2FwbnBfYWxsb2MobG9uZyBzaXplKQotewotCXZvaWQgKnJlc3VsdDsKLQotCXJlc3VsdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXN1bHQpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldChyZXN1bHQsIDAsIHNpemUpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KIHN0YXRpYyB2b2lkIGlzYXBucF9rZXkodm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGNvZGUgPSAweDZhLCBtc2I7CkBAIC00MDYsNyArMzk1LDcgQEAKIAlzdHJ1Y3QgcG5wX2lkICogaWQ7CiAJaWYgKCFkZXYpCiAJCXJldHVybjsKLQlpZCA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCkpOworCWlkID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCWlmICghaWQpCiAJCXJldHVybjsKIAlzcHJpbnRmKGlkLT5pZCwgIiVjJWMlYyV4JXgleCV4IiwKQEAgLTQzMCw3ICs0MTksNyBAQAogCXN0cnVjdCBwbnBfZGV2ICpkZXY7CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCWRldiA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kZXYpKTsKKwlkZXYgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAlkZXYtPm51bWJlciA9IG51bWJlcjsKQEAgLTQ2MSw3ICs0NTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgYml0czsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JaXJxID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lycSkpOworCWlycSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcnEpCiAJCXJldHVybjsKIAliaXRzID0gKHRtcFsxXSA8PCA4KSB8IHRtcFswXTsKQEAgLTQ4NSw3ICs0NzQsNyBAQAogCXN0cnVjdCBwbnBfZG1hICpkbWE7CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCWRtYSA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kbWEpKTsKKwlkbWEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2RtYSksIEdGUF9LRVJORUwpOwogCWlmICghZG1hKQogCQlyZXR1cm47CiAJZG1hLT5tYXAgPSB0bXBbMF07CkBAIC01MDUsNyArNDk0LDcgQEAKIAlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQ7CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCXBvcnQgPSBpc2FwbnBfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCkpOworCXBvcnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAlwb3J0LT5taW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzFdOwpAQCAtNTI4LDcgKzUxNyw3IEBACiAJc3RydWN0IHBucF9wb3J0ICpwb3J0OwogCiAJaXNhcG5wX3BlZWsodG1wLCBzaXplKTsKLQlwb3J0ID0gaXNhcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpKTsKKwlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAJcG9ydC0+bWluID0gcG9ydC0+bWF4ID0gKHRtcFsxXSA8PCA4KSB8IHRtcFswXTsKQEAgLTU1MCw3ICs1MzksNyBAQAogCXN0cnVjdCBwbnBfbWVtICptZW07CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCW1lbSA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAoKHRtcFsyXSA8PCA4KSB8IHRtcFsxXSkgPDwgODsKQEAgLTU3Myw3ICs1NjIsNyBAQAogCXN0cnVjdCBwbnBfbWVtICptZW07CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCW1lbSA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAodG1wWzRdIDw8IDI0KSB8ICh0bXBbM10gPDwgMTYpIHwgKHRtcFsyXSA8PCA4KSB8IHRtcFsxXTsKQEAgLTU5NSw3ICs1ODQsNyBAQAogCXN0cnVjdCBwbnBfbWVtICptZW07CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCW1lbSA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSBtZW0tPm1heCA9ICh0bXBbNF0gPDwgMjQpIHwgKHRtcFszXSA8PCAxNikgfCAodG1wWzJdIDw8IDgpIHwgdG1wWzFdOwpAQCAtODM4LDcgKzgyNyw3IEBACiAKIHN0YXRpYyB2b2lkIGlzYXBucF9wYXJzZV9jYXJkX2lkKHN0cnVjdCBwbnBfY2FyZCAqIGNhcmQsIHVuc2lnbmVkIHNob3J0IHZlbmRvciwgdW5zaWduZWQgc2hvcnQgZGV2aWNlKQogewotCXN0cnVjdCBwbnBfaWQgKiBpZCA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCkpOworCXN0cnVjdCBwbnBfaWQgKiBpZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlkKQogCQlyZXR1cm47CiAJc3ByaW50ZihpZC0+aWQsICIlYyVjJWMleCV4JXgleCIsCkBAIC04NzQsNyArODYzLDcgQEAKIAkJCWhlYWRlcls0XSwgaGVhZGVyWzVdLCBoZWFkZXJbNl0sIGhlYWRlcls3XSwgaGVhZGVyWzhdKTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgImNoZWNrc3VtID0gMHgleFxuIiwgY2hlY2tzdW0pOwogI2VuZGlmCi0JCWlmICgoY2FyZCA9IGlzYXBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9jYXJkKSkpID09IE5VTEwpCisJCWlmICgoY2FyZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKIAkJY2FyZC0+bnVtYmVyID0gY3NuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvbWFuYWdlci5jIGIvZHJpdmVycy9wbnAvbWFuYWdlci5jCmluZGV4IDZjNTEwYzEuLjk0NDQyZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL21hbmFnZXIuYworKysgYi9kcml2ZXJzL3BucC9tYW5hZ2VyLmMKQEAgLTExLDEzICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaWZkZWYgQ09ORklHX1BOUF9ERUJVRwotCSNkZWZpbmUgREVCVUcKLSNlbHNlCi0JI3VuZGVmIERFQlVHCi0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgImJhc2UuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnCmluZGV4IDA3ODJjZGMuLmIxODU0MTcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKIGNvbmZpZyBQTlBBQ1BJCiAJYm9vbCAiUGx1ZyBhbmQgUGxheSBBQ1BJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBQTlAgJiYgQUNQSV9CVVMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBQTlAgJiYgQUNQSSAmJiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBMaW51eCB1c2VzIHRoZSBQTlBBQ1BJIHRvIGF1dG9kZXRlY3QgYnVpbHQtaW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKaW5kZXggODY1NWRkMi4uMWE4OTE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CkBAIC00MSwxNCArNDIsNiBAQAogCXJldHVybiAoIWFjcGlfbWF0Y2hfaWRzKGRldiwgZXhjbHVkZWRfaWRfbGlzdCkpOwogfQogCi12b2lkICpwbnBhY3BpX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmKQotewotCXZvaWQgKnAgPSBrbWFsbG9jKHNpemUsIGYpOwotCWlmIChwKQotCQltZW1zZXQocCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KIC8qCiAgKiBDb21wYXRpYmxlIERldmljZSBJRHMKICAqLwpAQCAtMTQzLDcgKzEzNiw3IEBACiAJCXJldHVybiAwOwogCiAJcG5wX2RiZygiQUNQSSBkZXZpY2UgOiBoaWQgJXMiLCBhY3BpX2RldmljZV9oaWQoZGV2aWNlKSk7Ci0JZGV2ID0gIHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSAga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlwbnBfZXJyKCJPdXQgb2YgbWVtb3J5Iik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTczLDcgKzE2Niw3IEBACiAJZGV2LT5udW1iZXIgPSBudW07CiAJCiAJLyogc2V0IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIFBuUCBkZXZpY2UgKi8KLQlkZXZfaWQgPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKKwlkZXZfaWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZfaWQpCiAJCWdvdG8gZXJyOwogCXBucGlkYWNwaV90b19wbnBpZChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgZGV2X2lkLT5pZCk7CkBAIC0yMDUsOCArMTk4LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7CiAJCQlpZiAoIWlzcG5waWRhY3BpKGNpZF9saXN0LT5pZFtpXS52YWx1ZSkpCiAJCQkJY29udGludWU7Ci0JCQlkZXZfaWQgPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCAKLQkJCQlHRlBfS0VSTkVMKTsKKwkJCWRldl9pZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZGV2X2lkKQogCQkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3BucGFjcGkuaCBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcG5wYWNwaS5oCmluZGV4IDc2ZjkwN2UuLmYyOGUyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcG5wYWNwaS5oCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcG5wYWNwaS5oCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KIAotdm9pZCAqcG5wYWNwaV9rbWFsbG9jKHNpemVfdCBzaXplLCBpbnQgZik7CiBhY3BpX3N0YXR1cyBwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9yZXNvdXJjZShhY3BpX2hhbmRsZSwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSopOwogYWNwaV9zdGF0dXMgcG5wYWNwaV9wYXJzZV9yZXNvdXJjZV9vcHRpb25fZGF0YShhY3BpX2hhbmRsZSwgc3RydWN0IHBucF9kZXYqKTsKIGludCBwbnBhY3BpX2VuY29kZV9yZXNvdXJjZXMoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggNzU1NzVmNi4uNDE2ZDMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtNzMsMjUgKzczLDM1IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLCBpbnQgaXJxKQorcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgdTMyIGdzaSwKKwlpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKIHsKIAlpbnQgaSA9IDA7CisJaW50IGlycTsKKworCWlmICghdmFsaWRfSVJRKGdzaSkpCisJCXJldHVybjsKKwogCXdoaWxlICghKHJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkgJiYKIAkJCWkgPCBQTlBfTUFYX0lSUSkKIAkJaSsrOwotCWlmIChpIDwgUE5QX01BWF9JUlEpIHsKLQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsgIC8vQWxzbyBjbGVhcnMgX1VOU0VUIGZsYWcKLQkJaWYgKGlycSA9PSAtMSkgewotCQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQkJCXJldHVybjsKLQkJfQotCQlyZXMtPmlycV9yZXNvdXJjZVtpXS5zdGFydCA9KHVuc2lnbmVkIGxvbmcpIGlycTsKLQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpIGlycTsKKwlpZiAoaSA+PSBQTlBfTUFYX0lSUSkKKwkJcmV0dXJuOworCisJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsgIC8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCisJaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCWlmIChpcnEgPCAwKSB7CisJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CisJCXJldHVybjsKIAl9CisKKwlyZXMtPmlycV9yZXNvdXJjZVtpXS5zdGFydCA9IGlycTsKKwlyZXMtPmlycV9yZXNvdXJjZVtpXS5lbmQgPSBpcnE7CisJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGlycSwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLCBpbnQgZG1hKQorcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfZG1hcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgdTMyIGRtYSkKIHsKIAlpbnQgaSA9IDA7CiAJd2hpbGUgKGkgPCBQTlBfTUFYX0RNQSAmJgpAQCAtMTAzLDE0ICsxMTMsMTQgQEAKIAkJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uc3RhcnQgPSh1bnNpZ25lZCBsb25nKSBkbWE7Ci0JCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmVuZCA9ICh1bnNpZ25lZCBsb25nKSBkbWE7CisJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLnN0YXJ0ID0gZG1hOworCQlyZXMtPmRtYV9yZXNvdXJjZVtpXS5lbmQgPSBkbWE7CiAJfQogfQogCiBzdGF0aWMgdm9pZAogcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaW9yZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLAotCWludCBpbywgaW50IGxlbikKKwl1MzIgaW8sIHUzMiBsZW4pCiB7CiAJaW50IGkgPSAwOwogCXdoaWxlICghKHJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCkBAIC0xMjIsMTQgKzEzMiwxNCBAQAogCQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvOwotCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpKGlvICsgbGVuIC0gMSk7CisJCXJlcy0+cG9ydF9yZXNvdXJjZVtpXS5zdGFydCA9IGlvOworCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZW5kID0gaW8gKyBsZW4gLSAxOwogCX0KIH0KIAogc3RhdGljIHZvaWQKIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMsCi0JaW50IG1lbSwgaW50IGxlbikKKwl1NjQgbWVtLCB1NjQgbGVuKQogewogCWludCBpID0gMDsKIAl3aGlsZSAoIShyZXMtPm1lbV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCkBAIC0xNDEsOCArMTUxLDggQEAKIAkJCXJlcy0+bWVtX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5tZW1fcmVzb3VyY2VbaV0uc3RhcnQgPSAodW5zaWduZWQgbG9uZykgbWVtOwotCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5lbmQgPSAodW5zaWduZWQgbG9uZykobWVtICsgbGVuIC0gMSk7CisJCXJlcy0+bWVtX3Jlc291cmNlW2ldLnN0YXJ0ID0gbWVtOworCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5lbmQgPSBtZW0gKyBsZW4gLSAxOwogCX0KIH0KIApAQCAtMTUxLDI3ICsxNjEsMjggQEAKIAl2b2lkICpkYXRhKQogewogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXNfdGFibGUgPSAoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqKWRhdGE7CisJaW50IGk7CiAKIAlzd2l0Y2ggKHJlcy0+aWQpIHsKIAljYXNlIEFDUElfUlNUWVBFX0lSUToKLQkJaWYgKChyZXMtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgJiYKLQkJCXZhbGlkX0lSUShyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF0pKSB7Ci0JCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCWFjcGlfcmVnaXN0ZXJfZ3NpKHJlcy0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXSwKLQkJCQkJcmVzLT5kYXRhLmlycS5lZGdlX2xldmVsLAotCQkJCQlyZXMtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdykpOwotCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXSwgMSk7CisJCS8qCisJCSAqIFBlciBzcGVjLCBvbmx5IG9uZSBpbnRlcnJ1cHQgcGVyIGRlc2NyaXB0b3IgaXMgYWxsb3dlZCBpbgorCQkgKiBfQ1JTLCBidXQgc29tZSBmaXJtd2FyZSB2aW9sYXRlcyB0aGlzLCBzbyBwYXJzZSB0aGVtIGFsbC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCByZXMtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpKyspIHsKKwkJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbaV0sCisJCQkJcmVzLT5kYXRhLmlycS5lZGdlX2xldmVsLAorCQkJCXJlcy0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93KTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKLQkJaWYgKChyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgJiYKLQkJCXZhbGlkX0lSUShyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pKSB7Ci0JCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCWFjcGlfcmVnaXN0ZXJfZ3NpKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwKLQkJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsLAotCQkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdykpOwotCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwgMSk7CisJCWZvciAoaSA9IDA7IGkgPCByZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpKyspIHsKKwkJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbaV0sCisJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsLAorCQkJCXJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuYWN0aXZlX2hpZ2hfbG93KTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFDUElfUlNUWVBFX0RNQToKQEAgLTI0NCw3ICsyNTUsNyBAQAogCiAJaWYgKHAtPm51bWJlcl9vZl9jaGFubmVscyA9PSAwKQogCQlyZXR1cm47Ci0JZG1hID0gcG5wYWNwaV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RtYSksIEdGUF9LRVJORUwpOworCWRtYSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIApAQCAtMzAwLDcgKzMxMSw3IEBACiAJCiAJaWYgKHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID09IDApCiAJCXJldHVybjsKLQlpcnEgPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CisJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCkBAIC0zMjEsNyArMzMyLDcgQEAKIAogCWlmIChwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA9PSAwKQogCQlyZXR1cm47Ci0JaXJxID0gcG5wYWNwaV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lycSksIEdGUF9LRVJORUwpOworCWlycSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcnEpCiAJCXJldHVybjsKIApAQCAtMzQyLDcgKzM1Myw3IEBACiAKIAlpZiAoaW8tPnJhbmdlX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JcG9ydCA9IHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IGlvLT5taW5fYmFzZV9hZGRyZXNzOwpAQCAtMzYzLDcgKzM3NCw3IEBACiAKIAlpZiAoaW8tPnJhbmdlX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JcG9ydCA9IHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IHBvcnQtPm1heCA9IGlvLT5iYXNlX2FkZHJlc3M7CkBAIC0zODIsNyArMzkzLDcgQEAKIAogCWlmIChwLT5yYW5nZV9sZW5ndGggPT0gMCkKIAkJcmV0dXJuOwotCW1lbSA9IHBucGFjcGlfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSBwLT5taW5fYmFzZV9hZGRyZXNzOwpAQCAtNDA1LDcgKzQxNiw3IEBACiAKIAlpZiAocC0+cmFuZ2VfbGVuZ3RoID09IDApCiAJCXJldHVybjsKLQltZW0gPSBwbnBhY3BpX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gcC0+bWluX2Jhc2VfYWRkcmVzczsKQEAgLTQyOCw3ICs0MzksNyBAQAogCiAJaWYgKHAtPnJhbmdlX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JbWVtID0gcG5wYWNwaV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOworCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9IG1lbS0+bWF4ID0gcC0+cmFuZ2VfYmFzZV9hZGRyZXNzOwpAQCAtNjEyLDcgKzYyMyw3IEBACiAJaWYgKCFyZXNfY250KQogCQlyZXR1cm4gLUVJTlZBTDsKIAlidWZmZXItPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSkgKiAocmVzX2NudCArIDEpICsgMTsKLQlidWZmZXItPnBvaW50ZXIgPSBwbnBhY3BpX2ttYWxsb2MoYnVmZmVyLT5sZW5ndGggLSAxLCBHRlBfS0VSTkVMKTsKKwlidWZmZXItPnBvaW50ZXIgPSBrY2FsbG9jKDEsIGJ1ZmZlci0+bGVuZ3RoIC0gMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXItPnBvaW50ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCXBucF9kYmcoIlJlcyBjbnQgJWQiLCByZXNfY250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggNzc4YTMyNC4uZjQ5Njc0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTg2LDE2ICs4Niw2IEBACiAKIHN0cnVjdCBwbnBfZGV2X25vZGVfaW5mbyBub2RlX2luZm87CiAKLXZvaWQgKnBucGJpb3Nfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGYpCi17Ci0Jdm9pZCAqcCA9IGttYWxsb2MoIHNpemUsIGYgKTsKLQlpZiAoIHAgPT0gTlVMTCApCi0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzoga21hbGxvYygpIGZhaWxlZFxuIik7Ci0JZWxzZQotCQltZW1zZXQocCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KIC8qCiAgKgogICogRE9DS0lORyBGVU5DVElPTlMKQEAgLTEyMSwxMCArMTExLDEwIEBACiAJaWYgKCFjdXJyZW50LT5mcy0+cm9vdCkgewogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0JaWYgKCEoZW52cCA9IChjaGFyICoqKSBwbnBiaW9zX2ttYWxsb2MgKDIwICogc2l6ZW9mIChjaGFyICopLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShlbnZwID0gKGNoYXIgKiopIGtjYWxsb2MgKDIwLCBzaXplb2YgKGNoYXIgKiksIEdGUF9LRVJORUwpKSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaWYgKCEoYnVmID0gcG5wYmlvc19rbWFsbG9jICgyNTYsIEdGUF9LRVJORUwpKSkgeworCWlmICghKGJ1ZiA9IGtjYWxsb2MgKDEsIDI1NiwgR0ZQX0tFUk5FTCkpKSB7CiAJCWtmcmVlIChlbnZwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjMxLDcgKzIyMSw3IEBACiAJaWYoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuIC0xOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIChjaGFyIClQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKSB7CkBAIC0yNTQsNyArMjQ0LDcgQEAKIAlpZiAoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuIC0xOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIChjaGFyIClQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKSB7CkBAIC0zMDUsNyArMjk1LDcgQEAKIAlpZihkZXYtPmZsYWdzICYgUE5QQklPU19OT19ESVNBQkxFIHx8ICFwbnBiaW9zX2lzX2R5bmFtaWMoZGV2KSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCW5vZGUgPSBwbnBiaW9zX2ttYWxsb2Mobm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOworCW5vZGUgPSBrY2FsbG9jKDEsIG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGUpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zNDcsNyArMzM3LDcgQEAKIAl9CiAKIAkvKiBzZXQgdGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgUG5QIGRldmljZSAqLwotCWRldl9pZCA9IHBucGJpb3Nfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOworCWRldl9pZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldl9pZCkKIAkJcmV0dXJuIC0xOwogCXBucGlkMzJfdG9fcG5waWQobm9kZS0+ZWlzYV9pZCxpZCk7CkBAIC0zODUsNyArMzc1LDcgQEAKIAlzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2OwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuOwogCkBAIC00MDIsNyArMzkyLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlub2Rlc19nb3QrKzsKLQkJZGV2ID0gIHBucGJpb3Nfa21hbGxvYyhzaXplb2YgKHN0cnVjdCBwbnBfZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWRldiA9ICBrY2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkZXYpCiAJCQlicmVhazsKIAkJaWYoaW5zZXJ0X2RldmljZShkZXYsbm9kZSk8MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcG5wYmlvcy5oIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wbnBiaW9zLmgKaW5kZXggMDE4OTZlNy4uZDhjYjJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9wbnBiaW9zLmgKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wbnBiaW9zLmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogZXh0ZXJuIGludCBwbnBfYmlvc19wcmVzZW50KHZvaWQpOwogZXh0ZXJuIGludCAgcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZzsKLWV4dGVybiB2b2lkICpwbnBiaW9zX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmKTsKIAogZXh0ZXJuIGludCBwbnBiaW9zX3BhcnNlX2RhdGFfc3RyZWFtKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfYmlvc19ub2RlICogbm9kZSk7CiBleHRlcm4gaW50IHBucGJpb3NfcmVhZF9yZXNvdXJjZXNfZnJvbV9ub2RlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywgc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcHJvYy5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKaW5kZXggNmJiOGUxOS4uNWEzZGZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAkJcmV0dXJuIC1FRkJJRzsKIAl9CiAKLQl0bXBidWYgPSBwbnBiaW9zX2ttYWxsb2MoZXNjZC5lc2NkX3NpemUsIEdGUF9LRVJORUwpOworCXRtcGJ1ZiA9IGtjYWxsb2MoMSwgZXNjZC5lc2NkX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghdG1wYnVmKSByZXR1cm4gLUVOT01FTTsKIAogCWlmIChwbnBfYmlvc19yZWFkX2VzY2QodG1wYnVmLCBlc2NkLm52X3N0b3JhZ2VfYmFzZSkpIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCWlmIChwb3MgPj0gMHhmZikKIAkJcmV0dXJuIDA7CiAKLQlub2RlID0gcG5wYmlvc19rbWFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga2NhbGxvYygxLCBub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKSByZXR1cm4gLUVOT01FTTsKIAogCWZvciAobm9kZW51bT1wb3M7IG5vZGVudW08MHhmZjsgKSB7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAl1OCBub2RlbnVtID0gKGxvbmcpZGF0YTsKIAlpbnQgbGVuOwogCi0Jbm9kZSA9IHBucGJpb3Nfa21hbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkgcmV0dXJuIC1FTk9NRU07CiAJaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgYm9vdCwgbm9kZSkpIHsKIAkJa2ZyZWUobm9kZSk7CkBAIC0xODgsNyArMTg4LDcgQEAKIAl1OCBub2RlbnVtID0gKGxvbmcpZGF0YTsKIAlpbnQgcmV0ID0gY291bnQ7CiAKLQlub2RlID0gcG5wYmlvc19rbWFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga2NhbGxvYygxLCBub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAocG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKCZub2RlbnVtLCBib290LCBub2RlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCmluZGV4IGUzMDViYjEuLmIwY2E2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogcG5wYmlvc19wYXJzZV9tZW1fb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLCBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQogewogCXN0cnVjdCBwbnBfbWVtICogbWVtOwotCW1lbSA9IHBucGJpb3Nfa21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAoKHBbNV0gPDwgOCkgfCBwWzRdKSA8PCA4OwpAQCAtMjYzLDcgKzI2Myw3IEBACiBwbnBiaW9zX3BhcnNlX21lbTMyX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKLQltZW0gPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gKHBbN10gPDwgMjQpIHwgKHBbNl0gPDwgMTYpIHwgKHBbNV0gPDwgOCkgfCBwWzRdOwpAQCAtMjc5LDcgKzI3OSw3IEBACiBwbnBiaW9zX3BhcnNlX2ZpeGVkX21lbTMyX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKLQltZW0gPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gbWVtLT5tYXggPSAocFs3XSA8PCAyNCkgfCAocFs2XSA8PCAxNikgfCAocFs1XSA8PCA4KSB8IHBbNF07CkBAIC0yOTYsNyArMjk2LDcgQEAKIAlzdHJ1Y3QgcG5wX2lycSAqIGlycTsKIAl1bnNpZ25lZCBsb25nIGJpdHM7CiAKLQlpcnEgPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CisJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCWJpdHMgPSAocFsyXSA8PCA4KSB8IHBbMV07CkBAIC0zMTMsNyArMzEzLDcgQEAKIHBucGJpb3NfcGFyc2VfZG1hX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX2RtYSAqIGRtYTsKLQlkbWEgPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CisJZG1hID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9kbWEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRtYSkKIAkJcmV0dXJuOwogCWRtYS0+bWFwID0gcFsxXTsKQEAgLTMyNiw3ICszMjYsNyBAQAogcG5wYmlvc19wYXJzZV9wb3J0X29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX3BvcnQgKiBwb3J0OwotCXBvcnQgPSBwbnBiaW9zX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOworCXBvcnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAlwb3J0LT5taW4gPSAocFszXSA8PCA4KSB8IHBbMl07CkBAIC0zNDIsNyArMzQyLDcgQEAKIHBucGJpb3NfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7CiAJc3RydWN0IHBucF9wb3J0ICogcG9ydDsKLQlwb3J0ID0gcG5wYmlvc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAJcG9ydC0+bWluID0gcG9ydC0+bWF4ID0gKHBbMl0gPDwgOCkgfCBwWzFdOwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJCWNhc2UgU01BTExfVEFHX0NPTVBBVERFVklEOiAvKiBjb21wYXRpYmxlIElEICovCiAJCQlpZiAobGVuICE9IDQpCiAJCQkJZ290byBsZW5fZXJyOwotCQkJZGV2X2lkID0gIHBucGJpb3Nfa21hbGxvYyhzaXplb2YgKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKKwkJCWRldl9pZCA9ICBrY2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFkZXZfaWQpCiAJCQkJcmV0dXJuIE5VTEw7CiAJCQltZW1zZXQoZGV2X2lkLCAwLCBzaXplb2Yoc3RydWN0IHBucF9pZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcXVpcmtzLmMgYi9kcml2ZXJzL3BucC9xdWlya3MuYwppbmRleCA1OTZhMDJkLi44OTM2YjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9xdWlya3MuYworKysgYi9kcml2ZXJzL3BucC9xdWlya3MuYwpAQCAtMTYsMTMgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE5QX0RFQlVHCi0JI2RlZmluZSBERUJVRwotI2Vsc2UKLQkjdW5kZWYgREVCVUcKLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9zdXBwb3J0LmMgYi9kcml2ZXJzL3BucC9zdXBwb3J0LmMKaW5kZXggYjk1MmFlYy4uNjFmZTk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvc3VwcG9ydC5jCisrKyBiL2RyaXZlcnMvcG5wL3N1cHBvcnQuYwpAQCAtOCwxMyArOCw2IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLQotI2lmZGVmIENPTkZJR19QTlBfREVCVUcKLQkjZGVmaW5lIERFQlVHCi0jZWxzZQotCSN1bmRlZiBERUJVRwotI2VuZGlmCi0KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlICJiYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKaW5kZXggMjRjMGFmNC4uMzA5MjQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKQEAgLTIsOSArMiw5IEBACiAgKiAgZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKICAqICAgIEVTQ09OIENMQVcgbmV0d29yayBkcml2ZXIKICAqCi0gKiAgICAkUmV2aXNpb246IDEuMzUgJCAkRGF0ZTogMjAwNS8wMy8yNCAxMjoyNTozOCAkCisgKiAgICAkUmV2aXNpb246IDEuMzggJCAkRGF0ZTogMjAwNS8wOC8yOSAwOTo0NzowNCAkCiAgKgotICogIExpbnV4IGZvIHpTZXJpZXMgdmVyc2lvbgorICogIExpbnV4IGZvciB6U2VyaWVzIHZlcnNpb24KICAqICAgIENvcHlyaWdodCAoQykgMjAwMiwyMDA1IElCTSBDb3Jwb3JhdGlvbgogICogIEF1dGhvcihzKSBPcmlnaW5hbCBjb2RlIHdyaXR0ZW4gYnk6CiAgKiAgICAgICAgICAgICAgS2F6dW8gSWltdXJhIChpaW11cmFAanAuaWJtLmNvbSkKQEAgLTQzMSwxMiArNDMxLDEyIEBACiAJaWYgKCFza2JfcXVldWVfZW1wdHkoJnBfY2gtPmNvbGxlY3RfcXVldWUpKSB7CiAJLyogc29tZSBkYXRhICovCiAJCWhlbGRfc2tiID0gc2tiX2RlcXVldWUoJnBfY2gtPmNvbGxlY3RfcXVldWUpOwotCQlpZiAocF9lbnYtPnBhY2tpbmcgIT0gRE9fUEFDS0VEKQotCQkJcmV0dXJuIGhlbGRfc2tiOwogCQlpZiAoaGVsZF9za2IpCi0JCQlhdG9taWNfZGVjKCZoZWxkX3NrYi0+dXNlcnMpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoaGVsZF9za2IpOwogCQllbHNlCiAJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHBfZW52LT5wYWNraW5nICE9IERPX1BBQ0tFRCkKKwkJCXJldHVybiBoZWxkX3NrYjsKIAkJLyogZ2V0IGEgbmV3IFNLQiB3ZSB3aWxsIHBhY2sgYXQgbGVhc3Qgb25lICovCiAJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHBfZW52LT53cml0ZV9zaXplKTsKIAkJaWYgKG5ld19za2IgPT0gTlVMTCkgewpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJCQkJcHJpdnB0ci0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJCXNvX2ZhciArPSBoZWxkX3NrYi0+bGVuOwogCQkJCXBrdF9jbnQrKzsKLQkJCQlkZXZfa2ZyZWVfc2tiX2lycShoZWxkX3NrYik7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoaGVsZF9za2IpOwogCQkJCWhlbGRfc2tiID0gc2tiX2RlcXVldWUoJnBfY2gtPmNvbGxlY3RfcXVldWUpOwogCQkJCWlmIChoZWxkX3NrYikKIAkJCQkJYXRvbWljX2RlYygmaGVsZF9za2ItPnVzZXJzKTsKQEAgLTEwOTIsNyArMTA5Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAJaWYgKHByaXZwdHItPnBrX3NrYiAhPSBOVUxMKSB7Ci0JCWRldl9rZnJlZV9za2IocHJpdnB0ci0+cGtfc2tiKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdnB0ci0+cGtfc2tiKTsKIAkJcHJpdnB0ci0+cGtfc2tiID0gTlVMTDsKIAl9CiAJaWYocHJpdnB0ci0+YnVmZnNfYWxsb2MgIT0gMSkgewpAQCAtMjAxNiw3ICsyMDE2LDcgQEAKICAgICAgICAgcF9idWY9KHN0cnVjdCBjY3diayopcHJpdnB0ci0+cF9lbmRfY2N3OwogICAgICAgICBkdW1waXQoKGNoYXIgKilwX2J1Ziwgc2l6ZW9mKHN0cnVjdCBlbmRjY3cpKTsKICNlbmRpZgotICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJaWYgKGxpbmtpZD09MCkgewogICAgICAgICAJbG9jaz1MT0NLX05POwogICAgICAgICB9CkBAIC00MDYxLDcgKzQwNjEsNyBAQAogCiAgICAgICAgIHdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUocSkpKSB7CiAgICAgICAgICAgICAgICAgYXRvbWljX2RlYygmc2tiLT51c2Vycyk7Ci0gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogICAgICAgICB9CiB9CiAKQEAgLTQ0MTAsNyArNDQxMCw3IEBACiAjZWxzZQogICAgICAgICAgICAgICAgICJjb21waWxlZCBpbnRvIGtlcm5lbCAiCiAjZW5kaWYKLSAgICAgICAgICAgICAgICAiICRSZXZpc2lvbjogMS4zNSAkICREYXRlOiAyMDA1LzAzLzI0IDEyOjI1OjM4ICQgXG4iKTsKKyAgICAgICAgICAgICAgICAiICRSZXZpc2lvbjogMS4zOCAkICREYXRlOiAyMDA1LzA4LzI5IDA5OjQ3OjA0ICQgXG4iKTsKIAogCiAjaWZkZWYgRlVOQ1RSQUNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCmluZGV4IGQ5NmNjNDcuLjY3MmY5ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCkBAIC04NzEsOCArODcxLDcgQEAKICNpZmRlZiBBVVJPUkFfSU5UX0RFQlVHCiBzdGF0aWMgdm9pZCBhdXJvcmFfdGltZXIgKHVuc2lnbmVkIGxvbmcgaWdub3JlZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBhdXJvcmFfcG9sbF90aW1lciA9Ci0JCQlUSU1FUl9JTklUSUFMSVpFUihhdXJvcmFfdGltZXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihhdXJvcmFfcG9sbF90aW1lciwgYXVyb3JhX3RpbWVyLCAwLCAwKTsKIAogc3RhdGljIHZvaWQKIGF1cm9yYV90aW1lciAodW5zaWduZWQgbG9uZyBpZ25vcmVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKaW5kZXggZDQ0MjA1ZC4uZDg5ZjgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworc3RhdGljIGludCBlcnJubzsKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTEzLDggKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9lYnVzLmg+Ci1zdGF0aWMgaW50IGVycm5vOwotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogI2luY2x1ZGUgImJiY19pMmMuaCIKICNpbmNsdWRlICJtYXgxNjE3LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKaW5kZXggZDc2NWNjMS4uYjBjYzNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworc3RhdGljIGludCBlcnJubzsKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzgsOSArMzksNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2VudmN0cmwuaD4KIAotc3RhdGljIGludCBlcnJubzsKLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0KICNkZWZpbmUgRU5WQ1RSTF9NSU5PUgkxNjIKIAogI2RlZmluZSBQQ0Y4NTg0X0FERFJFU1MJMHg1NQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXh4eHguYyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKaW5kZXggOTczYzUxZi4uYWU5ZTAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzN3LXh4eHguYworKysgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCkBAIC0xNDk5LDIyICsxNDk5LDQzIEBACiAJcmV0dXJuIDA7CiB9IC8qIEVuZCB0d19zY3Npb3BfaW5xdWlyeSgpICovCiAKK3N0YXRpYyB2b2lkIHR3X3RyYW5zZmVyX2ludGVybmFsKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQsCisJCQkJIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF07CisJdm9pZCAqYnVmOworCXVuc2lnbmVkIGludCB0cmFuc2Zlcl9sZW47CisKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9CisJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJYnVmID0ga21hcF9hdG9taWMoc2ctPnBhZ2UsIEtNX0lSUTApICsgc2ctPm9mZnNldDsKKwkJdHJhbnNmZXJfbGVuID0gbWluKHNnLT5sZW5ndGgsIGxlbik7CisJfSBlbHNlIHsKKwkJYnVmID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJdHJhbnNmZXJfbGVuID0gbWluKGNtZC0+cmVxdWVzdF9idWZmbGVuLCBsZW4pOworCX0KKworCW1lbWNweShidWYsIGRhdGEsIHRyYW5zZmVyX2xlbik7CisJCisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJa3VubWFwX2F0b21pYyhidWYgLSBzZy0+b2Zmc2V0LCBLTV9JUlEwKTsKKwl9Cit9CisKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpc3IgdG8gY29tcGxldGUgYW4gaW5xdWlyeSBjb21tYW5kICovCiBzdGF0aWMgaW50IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCiB7CiAJdW5zaWduZWQgY2hhciAqaXNfdW5pdF9wcmVzZW50OwotCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3RfYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9idWZmZXJbMzZdOwogCVRXX1BhcmFtICpwYXJhbTsKIAogCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKClcbiIpOwogCi0JLyogRmlsbCByZXF1ZXN0IGJ1ZmZlciAqLwotCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlyZXF1ZXN0X2J1ZmZlciA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcjsKLQltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCW1lbXNldChyZXF1ZXN0X2J1ZmZlciwgMCwgc2l6ZW9mKHJlcXVlc3RfYnVmZmVyKSk7CiAJcmVxdWVzdF9idWZmZXJbMF0gPSBUWVBFX0RJU0s7IC8qIFBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgKi8KIAlyZXF1ZXN0X2J1ZmZlclsxXSA9IDA7CSAgICAgICAvKiBEZXZpY2UgdHlwZSBtb2RpZmllciAqLwogCXJlcXVlc3RfYnVmZmVyWzJdID0gMDsJICAgICAgIC8qIE5vIGFuc2kvaXNvIGNvbXBsaWFuY2UgKi8KQEAgLTE1MjIsNiArMTU0Myw4IEBACiAJbWVtY3B5KCZyZXF1ZXN0X2J1ZmZlcls4XSwgIjN3YXJlICAgIiwgOCk7CSAvKiBWZW5kb3IgSUQgKi8KIAlzcHJpbnRmKCZyZXF1ZXN0X2J1ZmZlclsxNl0sICJMb2dpY2FsIERpc2sgJS0yZCAiLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZCk7CiAJbWVtY3B5KCZyZXF1ZXN0X2J1ZmZlclszMl0sIFRXX0RSSVZFUl9WRVJTSU9OLCAzKTsKKwl0d190cmFuc2Zlcl9pbnRlcm5hbCh0d19kZXYsIHJlcXVlc3RfaWQsIHJlcXVlc3RfYnVmZmVyLAorCQkJICAgICBzaXplb2YocmVxdWVzdF9idWZmZXIpKTsKIAogCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOwogCWlmIChwYXJhbSA9PSBOVUxMKSB7CkBAIC0xNjEyLDcgKzE2MzUsNyBAQAogewogCVRXX1BhcmFtICpwYXJhbTsKIAl1bnNpZ25lZCBjaGFyICpmbGFnczsKLQl1bnNpZ25lZCBjaGFyICpyZXF1ZXN0X2J1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIHJlcXVlc3RfYnVmZmVyWzhdOwogCiAJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX21vZGVfc2Vuc2VfY29tcGxldGUoKVxuIik7CiAKQEAgLTE2MjIsOCArMTY0NSw3IEBACiAJCXJldHVybiAxOwogCX0KIAlmbGFncyA9IChjaGFyICopJihwYXJhbS0+ZGF0YVswXSk7Ci0JcmVxdWVzdF9idWZmZXIgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+YnVmZmVyOwotCW1lbXNldChyZXF1ZXN0X2J1ZmZlciwgMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbik7CisJbWVtc2V0KHJlcXVlc3RfYnVmZmVyLCAwLCBzaXplb2YocmVxdWVzdF9idWZmZXIpKTsKIAogCXJlcXVlc3RfYnVmZmVyWzBdID0gMHhmOyAgICAgICAgLyogbW9kZSBkYXRhIGxlbmd0aCAqLwogCXJlcXVlc3RfYnVmZmVyWzFdID0gMDsgICAgICAgICAgLyogZGVmYXVsdCBtZWRpdW0gdHlwZSAqLwpAQCAtMTYzNSw2ICsxNjU3LDggQEAKIAkJcmVxdWVzdF9idWZmZXJbNl0gPSAweDQ7ICAgICAgICAvKiBXQ0Ugb24gKi8KIAllbHNlCiAJCXJlcXVlc3RfYnVmZmVyWzZdID0gMHgwOyAgICAgICAgLyogV0NFIG9mZiAqLworCXR3X3RyYW5zZmVyX2ludGVybmFsKHR3X2RldiwgcmVxdWVzdF9pZCwgcmVxdWVzdF9idWZmZXIsCisJCQkgICAgIHNpemVvZihyZXF1ZXN0X2J1ZmZlcikpOwogCiAJcmV0dXJuIDA7CiB9IC8qIEVuZCB0d19zY3Npb3BfbW9kZV9zZW5zZV9jb21wbGV0ZSgpICovCkBAIC0xNzAxLDE3ICsxNzI1LDEyIEBACiB7CiAJdW5zaWduZWQgY2hhciAqcGFyYW1fZGF0YTsKIAl1MzIgY2FwYWNpdHk7Ci0JY2hhciAqYnVmZjsKKwljaGFyIGJ1ZmZbOF07CiAJVFdfUGFyYW0gKnBhcmFtOwogCiAJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUoKVxuIik7CiAKLQlidWZmID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmVyOwotCWlmIChidWZmID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUoKTogUmVxdWVzdCBidWZmZXIgTlVMTC5cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JbWVtc2V0KGJ1ZmYsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCW1lbXNldChidWZmLCAwLCBzaXplb2YoYnVmZikpOwogCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOwogCWlmIChwYXJhbSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5X2NvbXBsZXRlKCk6IEJhZCBhbGlnbm1lbnQgdmlydHVhbCBhZGRyZXNzLlxuIik7CkBAIC0xNzM5LDYgKzE3NTgsOCBAQAogCWJ1ZmZbNl0gPSAoVFdfQkxPQ0tfU0laRSA+PiA4KSAmIDB4ZmY7CiAJYnVmZls3XSA9IFRXX0JMT0NLX1NJWkUgJiAweGZmOwogCisJdHdfdHJhbnNmZXJfaW50ZXJuYWwodHdfZGV2LCByZXF1ZXN0X2lkLCBidWZmLCBzaXplb2YoYnVmZikpOworCiAJcmV0dXJuIDA7CiB9IC8qIEVuZCB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguYyBiL2RyaXZlcnMvc2NzaS81M2M3eHguYwppbmRleCAyMzQxZDI3Li43YTMzYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvNTNjN3h4LmMKKysrIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5jCkBAIC02MDkwLDggKzYwOTAsOCBAQAogICAgIGlmIChob3N0ZGF0YS0+bnVtX2NtZHMpCiAJcHJpbnRrICgic2NzaSVkIDogbGVha2VkICVkIE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlc1xuIiwKIAkgICAgaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPm51bV9jbWRzKTsKLSAgICBpZiAoaG9zdGRhdGEtPmV2ZW50cykgCi0JdmZyZWUgKCh2b2lkICopaG9zdGRhdGEtPmV2ZW50cyk7CisKKyAgICB2ZnJlZShob3N0ZGF0YS0+ZXZlbnRzKTsKIAogICAgIC8qIFhYWCBUaGlzIGFzc3VtZXMgZGVmYXVsdCBjYWNoZSBtb2RlIHRvIGJlIElPTUFQX0ZVTExfQ0FDSElORywgd2hpY2gKICAgICAgKiBYWFggbWF5IGJlIGludmFsaWQgKENPTkZJR18wNjBfV1JJVEVUSFJPVUdIKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCA3ODdhZDAwLi4yZDIxMjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtMSw1ICsxLDExIEBACiBtZW51ICJTQ1NJIGRldmljZSBzdXBwb3J0IgogCitjb25maWcgUkFJRF9BVFRSUworCXRyaXN0YXRlICJSQUlEIFRyYW5zcG9ydCBDbGFzcyIKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBQcm92aWRlcyBSQUlECisKIGNvbmZpZyBTQ1NJCiAJdHJpc3RhdGUgIlNDU0kgZGV2aWNlIHN1cHBvcnQiCiAJLS0taGVscC0tLQpAQCAtNDU5LDYgKzQ2NSwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU0NTSV9TQVRBX01WCisJdHJpc3RhdGUgIk1hcnZlbGwgU0FUQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSV9TQVRBICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIFNlcmlhbCBBVEEgZmFtaWx5LgorCSAgQ3VycmVudGx5IHN1cHBvcnRzIDg4U1hbNTZdMFs0OF1bMDFdIGNoaXBzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgU0NTSV9TQVRBX05WCiAJdHJpc3RhdGUgIk5WSURJQSBTQVRBIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IDM3NDZmYjkuLjRiNGZkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDggQEAKIAogb2JqLSQoQ09ORklHX1NDU0kpCQkrPSBzY3NpX21vZC5vCiAKK29iai0kKENPTkZJR19SQUlEX0FUVFJTKQkrPSByYWlkX2NsYXNzLm8KKwogIyAtLS0gTk9URSBPUkRFUklORyBIRVJFIC0tLQogIyBGb3Iga2VybmVsIG5vbi1tb2R1bGFyIGxpbmssIHRyYW5zcG9ydCBhdHRyaWJ1dGVzIG5lZWQgdG8KICMgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGRyaXZlcnMKQEAgLTEzMiw2ICsxMzQsNyBAQAogb2JqLSQoQ09ORklHX1NDU0lfU0FUQV9TWDQpCSs9IGxpYmF0YS5vIHNhdGFfc3g0Lm8KIG9iai0kKENPTkZJR19TQ1NJX1NBVEFfTlYpCSs9IGxpYmF0YS5vIHNhdGFfbnYubwogb2JqLSQoQ09ORklHX1NDU0lfU0FUQV9VTEkpCSs9IGxpYmF0YS5vIHNhdGFfdWxpLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfTVYpCSs9IGxpYmF0YS5vIHNhdGFfbXYubwogCiBvYmotJChDT05GSUdfQVJNKQkJKz0gYXJtLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jIGIvZHJpdmVycy9zY3NpL05DUjUzODAuYwppbmRleCBmOGVjNmZlLi5kNDBiYTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKQEAgLTg4LDYgKzg4LDEzIEBACiAgKi8KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CiAKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIE5ERUJVRyAwCisjZW5kaWYKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIE5ERUJVR19BQk9SVCAwCisjZW5kaWYKKwogI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCiAjZGVmaW5lIExJU1QoeCx5KSB7cHJpbnRrKCJMSU5FOiVkICAgQWRkaW5nICVwIHRvICVwXG4iLCBfX0xJTkVfXywgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSk7IGlmICgoeCk9PSh5KSkgdWRlbGF5KDUpOyB9CiAjZGVmaW5lIFJFTU9WRSh3LHgseSx6KSB7cHJpbnRrKCJMSU5FOiVkICAgUmVtb3Zpbmc6ICVwLT4lcCAgJXAtPiVwIFxuIiwgX19MSU5FX18sICh2b2lkKikodyksICh2b2lkKikoeCksICh2b2lkKikoeSksICh2b2lkKikoeikpOyBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQpAQCAtMzU5LDcgKzM2Niw3IEBACiAJe1BIQVNFX1VOS05PV04sICJVTktOT1dOIn0KIH07CiAKLSNpZmRlZiBOREVCVUcKKyNpZiBOREVCVUcKIHN0YXRpYyBzdHJ1Y3QgewogCXVuc2lnbmVkIGNoYXIgbWFzazsKIAljb25zdCBjaGFyICpuYW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYyBiL2RyaXZlcnMvc2NzaS9OQ1I1M2M0MDZhLmMKaW5kZXggNzlhZTczYi4uZTFmMjI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYworKysgYi9kcml2ZXJzL3Njc2kvTkNSNTNjNDA2YS5jCkBAIC02Miw3ICs2Miw3IEBACiAKICNkZWZpbmUgU1lOQ19NT0RFIDAJCS8qIFN5bmNocm9ub3VzIHRyYW5zZmVyIG1vZGUgKi8KIAotI2lmIERFQlVHCisjaWZkZWYgREVCVUcKICN1bmRlZiBOQ1I1M0M0MDZBX0RFQlVHCiAjZGVmaW5lIE5DUjUzQzQwNkFfREVCVUcgMQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCmluZGV4IGNjZGY0NDAuLmE4ZTNkZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0xMzMsNiArMTMzLDcgQEAKICAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFhY19idWlsZF9zZyhzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kLCBzdHJ1Y3Qgc2dtYXAqIHNnbWFwKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFhY19idWlsZF9zZzY0KHN0cnVjdCBzY3NpX2NtbmQqIHNjc2ljbWQsIHN0cnVjdCBzZ21hcDY0KiBwc2cpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWFjX2J1aWxkX3NncmF3KHN0cnVjdCBzY3NpX2NtbmQqIHNjc2ljbWQsIHN0cnVjdCBzZ21hcHJhdyogcHNnKTsKIHN0YXRpYyBpbnQgYWFjX3NlbmRfc3JiX2ZpYihzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kKTsKICNpZmRlZiBBQUNfREVUQUlMRURfU1RBVFVTX0lORk8KIHN0YXRpYyBjaGFyICphYWNfZ2V0X3N0YXR1c19zdHJpbmcodTMyIHN0YXR1cyk7CkBAIC0zNDgsNiArMzQ5LDI3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFhY19pbnRlcm5hbF90cmFuc2ZlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKworCWlmIChzY3NpY21kLT51c2Vfc2cpIHsKKwkJYnVmID0ga21hcF9hdG9taWMoc2ctPnBhZ2UsIEtNX0lSUTApICsgc2ctPm9mZnNldDsKKwkJdHJhbnNmZXJfbGVuID0gbWluKHNnLT5sZW5ndGgsIGxlbiArIG9mZnNldCk7CisJfSBlbHNlIHsKKwkJYnVmID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXRyYW5zZmVyX2xlbiA9IG1pbihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGxlbiArIG9mZnNldCk7CisJfQorCisJbWVtY3B5KGJ1ZiArIG9mZnNldCwgZGF0YSwgdHJhbnNmZXJfbGVuIC0gb2Zmc2V0KTsKKworCWlmIChzY3NpY21kLT51c2Vfc2cpIAorCQlrdW5tYXBfYXRvbWljKGJ1ZiAtIHNnLT5vZmZzZXQsIEtNX0lSUTApOworCit9CisKIHN0YXRpYyB2b2lkIGdldF9jb250YWluZXJfbmFtZV9jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICogZmlicHRyKQogewogCXN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqIGdldF9uYW1lX3JlcGx5OwpAQCAtMzYzLDE4ICszODUsMjIgQEAKIAkvKiBGYWlsdXJlIGlzIGlycmVsZXZhbnQsIHVzaW5nIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCAqLwogCWlmICgobGUzMl90b19jcHUoZ2V0X25hbWVfcmVwbHktPnN0YXR1cykgPT0gQ1RfT0spCiAJICYmIChnZXRfbmFtZV9yZXBseS0+ZGF0YVswXSAhPSAnXDAnKSkgewotCQlpbnQgICAgY291bnQ7Ci0JCWNoYXIgKiBkcDsKLQkJY2hhciAqIHNwID0gZ2V0X25hbWVfcmVwbHktPmRhdGE7CisJCWNoYXIgKnNwID0gZ2V0X25hbWVfcmVwbHktPmRhdGE7CiAJCXNwW3NpemVvZigoKHN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqKU5VTEwpLT5kYXRhKS0xXSA9ICdcMCc7CiAJCXdoaWxlICgqc3AgPT0gJyAnKQogCQkJKytzcDsKLQkJY291bnQgPSBzaXplb2YoKChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopTlVMTCktPmlucWRfcGlkKTsKLQkJZHAgPSAoKHN0cnVjdCBpbnF1aXJ5X2RhdGEgKilzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlciktPmlucWRfcGlkOwotCQlpZiAoKnNwKSBkbyB7Ci0JCQkqZHArKyA9ICgqc3ApID8gKnNwKysgOiAnICc7Ci0JCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwkJaWYgKCpzcCkgeworCQkJY2hhciBkW3NpemVvZigoKHN0cnVjdCBpbnF1aXJ5X2RhdGEgKilOVUxMKS0+aW5xZF9waWQpXTsKKwkJCWludCBjb3VudCA9IHNpemVvZihkKTsKKwkJCWNoYXIgKmRwID0gZDsKKwkJCWRvIHsKKwkJCQkqZHArKyA9ICgqc3ApID8gKnNwKysgOiAnICc7CisJCQl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJCQlhYWNfaW50ZXJuYWxfdHJhbnNmZXIoc2NzaWNtZCwgZCwgCisJCQkgIG9mZnNldG9mKHN0cnVjdCBpbnF1aXJ5X2RhdGEsIGlucWRfcGlkKSwgc2l6ZW9mKGQpKTsKKwkJfQogCX0KKwogCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CiAKIAlmaWJfY29tcGxldGUoZmlicHRyKTsKQEAgLTc3NywzNCArODAzLDM2IEBACiAJLyogCiAJICogNTcgc2NhdHRlciBnYXRoZXIgZWxlbWVudHMgCiAJICovCi0JZGV2LT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPSAoZGV2LT5tYXhfZmliX3NpemUgLQotCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpIC0KLQkJc2l6ZW9mKHN0cnVjdCBhYWNfd3JpdGUpICsgc2l6ZW9mKHN0cnVjdCBzZ21hcCkpIC8KLQkJCXNpemVvZihzdHJ1Y3Qgc2dtYXApOwotCWlmIChkZXYtPmRhY19zdXBwb3J0KSB7Ci0JCS8qIAotCQkgKiAzOCBzY2F0dGVyIGdhdGhlciBlbGVtZW50cyAKLQkJICovCi0JCWRldi0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplID0KLQkJCShkZXYtPm1heF9maWJfc2l6ZSAtCisJaWYgKCEoZGV2LT5yYXdfaW9faW50ZXJmYWNlKSkgeworCQlkZXYtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSA9IChkZXYtPm1heF9maWJfc2l6ZSAtCiAJCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpIC0KLQkJCXNpemVvZihzdHJ1Y3QgYWFjX3dyaXRlNjQpICsKLQkJCXNpemVvZihzdHJ1Y3Qgc2dtYXA2NCkpIC8KLQkJCQlzaXplb2Yoc3RydWN0IHNnbWFwNjQpOwotCX0KLQlkZXYtPnNjc2lfaG9zdF9wdHItPm1heF9zZWN0b3JzID0gQUFDX01BWF8zMkJJVF9TR0JDT1VOVDsKLQlpZighKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX05FV19DT01NKSkgewotCQkvKgotCQkgKiBXb3JzdCBjYXNlIHNpemUgdGhhdCBjb3VsZCBjYXVzZSBzZyBvdmVyZmxvdyB3aGVuCi0JCSAqIHdlIGJyZWFrIHVwIFNHIGVsZW1lbnRzIHRoYXQgYXJlIGxhcmdlciB0aGFuIDY0S0IuCi0JCSAqIFdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgdGVsbCB0aGUgU0NTSSBsYXllciB3aGF0Ci0JCSAqIHRoZSBtYXhpbXVtIFNHIGVsZW1lbnQgc2l6ZSBjYW4gYmUuIFdvcnN0IGNhc2UgaXMKLQkJICogKHNnX3RhYmxlc2l6ZS0xKSA0S0IgZWxlbWVudHMgd2l0aCBvbmUgNjRLQgotCQkgKiBlbGVtZW50LgotCQkgKgkzMmJpdCAtPiA0Njggb3IgMjM4S0IJNjRiaXQgLT4gNDI0IG9yIDIxMktCCi0JCSAqLwotCQlkZXYtPnNjc2lfaG9zdF9wdHItPm1heF9zZWN0b3JzID0KLQkJICAoZGV2LT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgKiA4KSArIDExMjsKKwkJCXNpemVvZihzdHJ1Y3QgYWFjX3dyaXRlKSArIHNpemVvZihzdHJ1Y3Qgc2dtYXApKSAvCisJCQkJc2l6ZW9mKHN0cnVjdCBzZ21hcCk7CisJCWlmIChkZXYtPmRhY19zdXBwb3J0KSB7CisJCQkvKiAKKwkJCSAqIDM4IHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzIAorCQkJICovCisJCQlkZXYtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSA9CisJCQkJKGRldi0+bWF4X2ZpYl9zaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFhY193cml0ZTY0KSArCisJCQkJc2l6ZW9mKHN0cnVjdCBzZ21hcDY0KSkgLworCQkJCQlzaXplb2Yoc3RydWN0IHNnbWFwNjQpOworCQl9CisJCWRldi0+c2NzaV9ob3N0X3B0ci0+bWF4X3NlY3RvcnMgPSBBQUNfTUFYXzMyQklUX1NHQkNPVU5UOworCQlpZighKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX05FV19DT01NKSkgeworCQkJLyoKKwkJCSAqIFdvcnN0IGNhc2Ugc2l6ZSB0aGF0IGNvdWxkIGNhdXNlIHNnIG92ZXJmbG93IHdoZW4KKwkJCSAqIHdlIGJyZWFrIHVwIFNHIGVsZW1lbnRzIHRoYXQgYXJlIGxhcmdlciB0aGFuIDY0S0IuCisJCQkgKiBXb3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHRlbGwgdGhlIFNDU0kgbGF5ZXIgd2hhdAorCQkJICogdGhlIG1heGltdW0gU0cgZWxlbWVudCBzaXplIGNhbiBiZS4gV29yc3QgY2FzZSBpcworCQkJICogKHNnX3RhYmxlc2l6ZS0xKSA0S0IgZWxlbWVudHMgd2l0aCBvbmUgNjRLQgorCQkJICogZWxlbWVudC4KKwkJCSAqCTMyYml0IC0+IDQ2OCBvciAyMzhLQgk2NGJpdCAtPiA0MjQgb3IgMjEyS0IKKwkJCSAqLworCQkJZGV2LT5zY3NpX2hvc3RfcHRyLT5tYXhfc2VjdG9ycyA9CisJCQkgIChkZXYtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSAqIDgpICsgMTEyOworCQl9CiAJfQogCiAJZmliX2NvbXBsZXRlKGZpYnB0cik7CkBAIC04MTQsMTIgKzg0MiwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHJlYWRfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKK3N0YXRpYyB2b2lkIGlvX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBmaWIgKiBmaWJwdHIpCiB7CiAJc3RydWN0IGFhY19kZXYgKmRldjsKIAlzdHJ1Y3QgYWFjX3JlYWRfcmVwbHkgKnJlYWRyZXBseTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOwotCXUzMiBsYmE7CiAJdTMyIGNpZDsKIAogCXNjc2ljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjb250ZXh0OwpAQCAtODI3LDggKzg1NCw3IEBACiAJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAljaWQgPSBJRF9MVU5fVE9fQ09OVEFJTkVSKHNjc2ljbWQtPmRldmljZS0+aWQsIHNjc2ljbWQtPmRldmljZS0+bHVuKTsKIAotCWxiYSA9ICgoc2NzaWNtZC0+Y21uZFsxXSAmIDB4MUYpIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzJdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFszXTsKLQlkcHJpbnRrKChLRVJOX0RFQlVHICJyZWFkX2NhbGxiYWNrW2NwdSAlZF06IGxiYSA9ICV1LCB0ID0gJWxkLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBsYmEsIGppZmZpZXMpKTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJpb19jYWxsYmFja1tjcHUgJWRdOiBsYmEgPSAldSwgdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdLCBqaWZmaWVzKSk7CiAKIAlpZiAoZmlicHRyID09IE5VTEwpCiAJCUJVRygpOwpAQCAtODQ3LDcgKzg3Myw3IEBACiAJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CiAJZWxzZSB7CiAjaWZkZWYgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInJlYWRfY2FsbGJhY2s6IGlvIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvX2NhbGxiYWNrOiBpbyBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLAogCQkgIGxlMzJfdG9fY3B1KHJlYWRyZXBseS0+c3RhdHVzKSk7CiAjZW5kaWYKIAkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwpAQCAtODY3LDUzICs4OTMsNiBAQAogCWFhY19pb19kb25lKHNjc2ljbWQpOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZV9jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICogZmlicHRyKQotewotCXN0cnVjdCBhYWNfZGV2ICpkZXY7Ci0Jc3RydWN0IGFhY193cml0ZV9yZXBseSAqd3JpdGVyZXBseTsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOwotCXUzMiBsYmE7Ci0JdTMyIGNpZDsKLQotCXNjc2ljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjb250ZXh0OwotCWRldiA9IChzdHJ1Y3QgYWFjX2RldiAqKXNjc2ljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0JY2lkID0gSURfTFVOX1RPX0NPTlRBSU5FUihzY3NpY21kLT5kZXZpY2UtPmlkLCBzY3NpY21kLT5kZXZpY2UtPmx1bik7Ci0KLQlsYmEgPSAoKHNjc2ljbWQtPmNtbmRbMV0gJiAweDFGKSA8PCAxNikgfCAoc2NzaWNtZC0+Y21uZFsyXSA8PCA4KSB8IHNjc2ljbWQtPmNtbmRbM107Ci0JZHByaW50aygoS0VSTl9ERUJVRyAid3JpdGVfY2FsbGJhY2tbY3B1ICVkXTogbGJhID0gJXUsIHQgPSAlbGQuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGxiYSwgamlmZmllcykpOwotCWlmIChmaWJwdHIgPT0gTlVMTCkKLQkJQlVHKCk7Ci0KLQlpZihzY3NpY21kLT51c2Vfc2cpCi0JCXBjaV91bm1hcF9zZyhkZXYtPnBkZXYsIAotCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjc2ljbWQtPmJ1ZmZlciwKLQkJCXNjc2ljbWQtPnVzZV9zZywKLQkJCXNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQllbHNlIGlmKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbikKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIHNjc2ljbWQtPlNDcC5kbWFfaGFuZGxlLAotCQkJCSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCi0JCQkJIHNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQotCXdyaXRlcmVwbHkgPSAoc3RydWN0IGFhY193cml0ZV9yZXBseSAqKSBmaWJfZGF0YShmaWJwdHIpOwotCWlmIChsZTMyX3RvX2NwdSh3cml0ZXJlcGx5LT5zdGF0dXMpID09IFNUX09LKQotCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3cml0ZV9jYWxsYmFjazogd3JpdGUgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwgd3JpdGVyZXBseS0+c3RhdHVzKTsKLQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwotCQlzZXRfc2Vuc2UoKHU4ICopICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAotCQkJCSAgICBIQVJEV0FSRV9FUlJPUiwKLQkJCQkgICAgU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwKLQkJCQkgICAgQVNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsIDAsIDAsCi0JCQkJICAgIDAsIDApOwotCQltZW1jcHkoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyLCAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwgCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zZV9kYXRhKSk7Ci0JfQotCi0JZmliX2NvbXBsZXRlKGZpYnB0cik7Ci0JZmliX2ZyZWUoZmlicHRyKTsKLQlhYWNfaW9fZG9uZShzY3NpY21kKTsKLX0KLQogc3RhdGljIGludCBhYWNfcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaWNtZCwgaW50IGNpZCkKIHsKIAl1MzIgbGJhOwpAQCAtOTU0LDcgKzkzMywzMiBAQAogCiAJZmliX2luaXQoY21kX2ZpYmNvbnRleHQpOwogCi0JaWYgKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgeworCWlmIChkZXYtPnJhd19pb19pbnRlcmZhY2UpIHsKKwkJc3RydWN0IGFhY19yYXdfaW8gKnJlYWRjbWQ7CisJCXJlYWRjbWQgPSAoc3RydWN0IGFhY19yYXdfaW8gKikgZmliX2RhdGEoY21kX2ZpYmNvbnRleHQpOworCQlyZWFkY21kLT5ibG9ja1swXSA9IGNwdV90b19sZTMyKGxiYSk7CisJCXJlYWRjbWQtPmJsb2NrWzFdID0gMDsKKwkJcmVhZGNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihjb3VudDw8OSk7CisJCXJlYWRjbWQtPmNpZCA9IGNwdV90b19sZTE2KGNpZCk7CisJCXJlYWRjbWQtPmZsYWdzID0gY3B1X3RvX2xlMTYoMSk7CisJCXJlYWRjbWQtPmJwVG90YWwgPSAwOworCQlyZWFkY21kLT5icENvbXBsZXRlID0gMDsKKwkJCisJCWFhY19idWlsZF9zZ3JhdyhzY3NpY21kLCAmcmVhZGNtZC0+c2cpOworCQlmaWJzaXplID0gc2l6ZW9mKHN0cnVjdCBhYWNfcmF3X2lvKSArICgobGUzMl90b19jcHUocmVhZGNtZC0+c2cuY291bnQpIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5cmF3KSk7CisJCWlmIChmaWJzaXplID4gKGRldi0+bWF4X2ZpYl9zaXplIC0gc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpCisJCQlCVUcoKTsKKwkJLyoKKwkJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgorCQkgKi8KKwkJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyUmF3SW8sCisJCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJCSAgZmlic2l6ZSwgCisJCQkgIEZzYU5vcm1hbCwgCisJCQkgIDAsIDEsIAorCQkJICAoZmliX2NhbGxiYWNrKSBpb19jYWxsYmFjaywgCisJCQkgICh2b2lkICopIHNjc2ljbWQpOworCX0gZWxzZSBpZiAoZGV2LT5kYWNfc3VwcG9ydCA9PSAxKSB7CiAJCXN0cnVjdCBhYWNfcmVhZDY0ICpyZWFkY21kOwogCQlyZWFkY21kID0gKHN0cnVjdCBhYWNfcmVhZDY0ICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKIAkJcmVhZGNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0N0SG9zdFJlYWQ2NCk7CkBAIC05NjgsNyArOTcyLDcgQEAKIAkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3JlYWQ2NCkgKyAKIAkJCSgobGUzMl90b19jcHUocmVhZGNtZC0+c2cuY291bnQpIC0gMSkgKiAKIAkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5NjQpKTsKLQkJQlVHX09OIChmaWJzaXplID4gKHNpemVvZihzdHJ1Y3QgaHdfZmliKSAtIAorCQlCVUdfT04gKGZpYnNpemUgPiAoZGV2LT5tYXhfZmliX3NpemUgLSAKIAkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOwogCQkvKgogCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCkBAIC05NzgsNyArOTgyLDcgQEAKIAkJCSAgZmlic2l6ZSwgCiAJCQkgIEZzYU5vcm1hbCwgCiAJCQkgIDAsIDEsIAotCQkJICAoZmliX2NhbGxiYWNrKSByZWFkX2NhbGxiYWNrLCAKKwkJCSAgKGZpYl9jYWxsYmFjaykgaW9fY2FsbGJhY2ssIAogCQkJICAodm9pZCAqKSBzY3NpY21kKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgYWFjX3JlYWQgKnJlYWRjbWQ7CkBAIC0xMDAyLDcgKzEwMDYsNyBAQAogCQkJICBmaWJzaXplLCAKIAkJCSAgRnNhTm9ybWFsLCAKIAkJCSAgMCwgMSwgCi0JCQkgIChmaWJfY2FsbGJhY2spIHJlYWRfY2FsbGJhY2ssIAorCQkJICAoZmliX2NhbGxiYWNrKSBpb19jYWxsYmFjaywgCiAJCQkgICh2b2lkICopIHNjc2ljbWQpOwogCX0KIApAQCAtMTA2MSw3ICsxMDY1LDMyIEBACiAJfQogCWZpYl9pbml0KGNtZF9maWJjb250ZXh0KTsKIAotCWlmKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgeworCWlmIChkZXYtPnJhd19pb19pbnRlcmZhY2UpIHsKKwkJc3RydWN0IGFhY19yYXdfaW8gKndyaXRlY21kOworCQl3cml0ZWNtZCA9IChzdHJ1Y3QgYWFjX3Jhd19pbyAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJCXdyaXRlY21kLT5ibG9ja1swXSA9IGNwdV90b19sZTMyKGxiYSk7CisJCXdyaXRlY21kLT5ibG9ja1sxXSA9IDA7CisJCXdyaXRlY21kLT5jb3VudCA9IGNwdV90b19sZTMyKGNvdW50PDw5KTsKKwkJd3JpdGVjbWQtPmNpZCA9IGNwdV90b19sZTE2KGNpZCk7CisJCXdyaXRlY21kLT5mbGFncyA9IDA7IAorCQl3cml0ZWNtZC0+YnBUb3RhbCA9IDA7CisJCXdyaXRlY21kLT5icENvbXBsZXRlID0gMDsKKwkJCisJCWFhY19idWlsZF9zZ3JhdyhzY3NpY21kLCAmd3JpdGVjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3Jhd19pbykgKyAoKGxlMzJfdG9fY3B1KHdyaXRlY21kLT5zZy5jb3VudCkgLSAxKSAqIHNpemVvZiAoc3RydWN0IHNnZW50cnlyYXcpKTsKKwkJaWYgKGZpYnNpemUgPiAoZGV2LT5tYXhfZmliX3NpemUgLSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSkKKwkJCUJVRygpOworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJSYXdJbywKKwkJCSAgY21kX2ZpYmNvbnRleHQsIAorCQkJICBmaWJzaXplLCAKKwkJCSAgRnNhTm9ybWFsLCAKKwkJCSAgMCwgMSwgCisJCQkgIChmaWJfY2FsbGJhY2spIGlvX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfSBlbHNlIGlmIChkZXYtPmRhY19zdXBwb3J0ID09IDEpIHsKIAkJc3RydWN0IGFhY193cml0ZTY0ICp3cml0ZWNtZDsKIAkJd3JpdGVjbWQgPSAoc3RydWN0IGFhY193cml0ZTY0ICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKIAkJd3JpdGVjbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUzMihWTV9DdEhvc3RXcml0ZTY0KTsKQEAgLTEwODUsNyArMTExNCw3IEBACiAJCQkgIGZpYnNpemUsIAogCQkJICBGc2FOb3JtYWwsIAogCQkJICAwLCAxLCAKLQkJCSAgKGZpYl9jYWxsYmFjaykgd3JpdGVfY2FsbGJhY2ssIAorCQkJICAoZmliX2NhbGxiYWNrKSBpb19jYWxsYmFjaywgCiAJCQkgICh2b2lkICopIHNjc2ljbWQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBhYWNfd3JpdGUgKndyaXRlY21kOwpAQCAtMTExMSw3ICsxMTQwLDcgQEAKIAkJCSAgZmlic2l6ZSwgCiAJCQkgIEZzYU5vcm1hbCwgCiAJCQkgIDAsIDEsIAotCQkJICAoZmliX2NhbGxiYWNrKSB3cml0ZV9jYWxsYmFjaywgCisJCQkgIChmaWJfY2FsbGJhY2spIGlvX2NhbGxiYWNrLCAKIAkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CiAJfQogCkBAIC0xMzQwLDQ0ICsxMzY5LDQ1IEBACiAJc3dpdGNoIChzY3NpY21kLT5jbW5kWzBdKSB7CiAJY2FzZSBJTlFVSVJZOgogCXsKLQkJc3RydWN0IGlucXVpcnlfZGF0YSAqaW5xX2RhdGFfcHRyOworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhIGlucV9kYXRhOwogCiAJCWRwcmludGsoKEtFUk5fREVCVUcgIklOUVVJUlkgY29tbWFuZCwgSUQ6ICVkLlxuIiwgc2NzaWNtZC0+ZGV2aWNlLT5pZCkpOwotCQlpbnFfZGF0YV9wdHIgPSAoc3RydWN0IGlucXVpcnlfZGF0YSAqKXNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOwotCQltZW1zZXQoaW5xX2RhdGFfcHRyLCAwLCBzaXplb2YgKHN0cnVjdCBpbnF1aXJ5X2RhdGEpKTsKKwkJbWVtc2V0KCZpbnFfZGF0YSwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW5xdWlyeV9kYXRhKSk7CiAKLQkJaW5xX2RhdGFfcHRyLT5pbnFkX3ZlciA9IDI7CS8qIGNsYWltIGNvbXBsaWFuY2UgdG8gU0NTSS0yICovCi0JCWlucV9kYXRhX3B0ci0+aW5xZF9kdHEgPSAweDgwOwkvKiBzZXQgUk1CIGJpdCB0byBvbmUgaW5kaWNhdGluZyB0aGF0IHRoZSBtZWRpdW0gaXMgcmVtb3ZhYmxlICovCi0JCWlucV9kYXRhX3B0ci0+aW5xZF9yZGYgPSAyOwkvKiBBIHJlc3BvbnNlIGRhdGEgZm9ybWF0IHZhbHVlIG9mIHR3byBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBzaGFsbCBiZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBTQ1NJLTIgKi8KLQkJaW5xX2RhdGFfcHRyLT5pbnFkX2xlbiA9IDMxOworCQlpbnFfZGF0YS5pbnFkX3ZlciA9IDI7CS8qIGNsYWltIGNvbXBsaWFuY2UgdG8gU0NTSS0yICovCisJCWlucV9kYXRhLmlucWRfZHRxID0gMHg4MDsJLyogc2V0IFJNQiBiaXQgdG8gb25lIGluZGljYXRpbmcgdGhhdCB0aGUgbWVkaXVtIGlzIHJlbW92YWJsZSAqLworCQlpbnFfZGF0YS5pbnFkX3JkZiA9IDI7CS8qIEEgcmVzcG9uc2UgZGF0YSBmb3JtYXQgdmFsdWUgb2YgdHdvIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIHNoYWxsIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGluIFNDU0ktMiAqLworCQlpbnFfZGF0YS5pbnFkX2xlbiA9IDMxOwogCQkvKkZvcm1hdCBmb3IgInBhZDIiIGlzICBSZWxBZHIgfCBXQnVzMzIgfCBXQnVzMTYgfCAgU3luYyAgfCBMaW5rZWQgfFJlc2VydmVkfCBDbWRRdWUgfCBTZnRSZSAqLwotCQlpbnFfZGF0YV9wdHItPmlucWRfcGFkMj0gMHgzMiA7CSAvKldCdXMxNnxTeW5jfENtZFF1ZSAqLworCQlpbnFfZGF0YS5pbnFkX3BhZDI9IDB4MzIgOwkgLypXQnVzMTZ8U3luY3xDbWRRdWUgKi8KIAkJLyoKIAkJICoJU2V0IHRoZSBWZW5kb3IsIFByb2R1Y3QsIGFuZCBSZXZpc2lvbiBMZXZlbAogCQkgKglzZWU6IDx2ZW5kb3I+LmMgaS5lLiBhYWMuYwogCQkgKi8KIAkJaWYgKHNjc2ljbWQtPmRldmljZS0+aWQgPT0gaG9zdC0+dGhpc19pZCkgewotCQkJc2V0aW5xc3RyKGNhcmR0eXBlLCAodm9pZCAqKSAoaW5xX2RhdGFfcHRyLT5pbnFkX3ZpZCksIChzaXplb2YoY29udGFpbmVyX3R5cGVzKS9zaXplb2YoY2hhciAqKSkpOwotCQkJaW5xX2RhdGFfcHRyLT5pbnFkX3BkdCA9IElOUURfUERUX1BST0M7CS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKwkJCXNldGlucXN0cihjYXJkdHlwZSwgKHZvaWQgKikgKGlucV9kYXRhLmlucWRfdmlkKSwgKHNpemVvZihjb250YWluZXJfdHlwZXMpL3NpemVvZihjaGFyICopKSk7CisJCQlpbnFfZGF0YS5pbnFkX3BkdCA9IElOUURfUERUX1BST0M7CS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKwkJCWFhY19pbnRlcm5hbF90cmFuc2ZlcihzY3NpY21kLCAmaW5xX2RhdGEsIDAsIHNpemVvZihpbnFfZGF0YSkpOwogCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKIAkJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCXNldGlucXN0cihjYXJkdHlwZSwgKHZvaWQgKikgKGlucV9kYXRhX3B0ci0+aW5xZF92aWQpLCBmc2FfZGV2X3B0cltjaWRdLnR5cGUpOwotCQlpbnFfZGF0YV9wdHItPmlucWRfcGR0ID0gSU5RRF9QRFRfREE7CS8qIERpcmVjdC9yYW5kb20gYWNjZXNzIGRldmljZSAqLworCQlzZXRpbnFzdHIoY2FyZHR5cGUsICh2b2lkICopIChpbnFfZGF0YS5pbnFkX3ZpZCksIGZzYV9kZXZfcHRyW2NpZF0udHlwZSk7CisJCWlucV9kYXRhLmlucWRfcGR0ID0gSU5RRF9QRFRfREE7CS8qIERpcmVjdC9yYW5kb20gYWNjZXNzIGRldmljZSAqLworCQlhYWNfaW50ZXJuYWxfdHJhbnNmZXIoc2NzaWNtZCwgJmlucV9kYXRhLCAwLCBzaXplb2YoaW5xX2RhdGEpKTsKIAkJcmV0dXJuIGFhY19nZXRfY29udGFpbmVyX25hbWUoc2NzaWNtZCwgY2lkKTsKIAl9CiAJY2FzZSBSRUFEX0NBUEFDSVRZOgogCXsKIAkJdTMyIGNhcGFjaXR5OwotCQljaGFyICpjcDsKKwkJY2hhciBjcFs4XTsKIAogCQlkcHJpbnRrKChLRVJOX0RFQlVHICJSRUFEIENBUEFDSVRZIGNvbW1hbmQuXG4iKSk7CiAJCWlmIChmc2FfZGV2X3B0cltjaWRdLnNpemUgPD0gMHgxMDAwMDAwMDBMTCkKIAkJCWNhcGFjaXR5ID0gZnNhX2Rldl9wdHJbY2lkXS5zaXplIC0gMTsKIAkJZWxzZQogCQkJY2FwYWNpdHkgPSAodTMyKS0xOwotCQljcCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCiAJCWNwWzBdID0gKGNhcGFjaXR5ID4+IDI0KSAmIDB4ZmY7CiAJCWNwWzFdID0gKGNhcGFjaXR5ID4+IDE2KSAmIDB4ZmY7CiAJCWNwWzJdID0gKGNhcGFjaXR5ID4+IDgpICYgMHhmZjsKQEAgLTEzODYsNiArMTQxNiw3IEBACiAJCWNwWzVdID0gMDsKIAkJY3BbNl0gPSAyOwogCQljcFs3XSA9IDA7CisJCWFhY19pbnRlcm5hbF90cmFuc2ZlcihzY3NpY21kLCBjcCwgMCwgc2l6ZW9mKGNwKSk7CiAKIAkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKIAkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOwpAQCAtMTM5NSwxNSArMTQyNiwxNSBAQAogCiAJY2FzZSBNT0RFX1NFTlNFOgogCXsKLQkJY2hhciAqbW9kZV9idWY7CisJCWNoYXIgbW9kZV9idWZbNF07CiAKIAkJZHByaW50aygoS0VSTl9ERUJVRyAiTU9ERSBTRU5TRSBjb21tYW5kLlxuIikpOwotCQltb2RlX2J1ZiA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOwogCQltb2RlX2J1ZlswXSA9IDM7CS8qIE1vZGUgZGF0YSBsZW5ndGggKi8KIAkJbW9kZV9idWZbMV0gPSAwOwkvKiBNZWRpdW0gdHlwZSAtIGRlZmF1bHQgKi8KIAkJbW9kZV9idWZbMl0gPSAwOwkvKiBEZXZpY2Utc3BlY2lmaWMgcGFyYW0sIGJpdCA4OiAwLzEgPSB3cml0ZSBlbmFibGVkL3Byb3RlY3RlZCAqLwogCQltb2RlX2J1ZlszXSA9IDA7CS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoICovCiAKKwkJYWFjX2ludGVybmFsX3RyYW5zZmVyKHNjc2ljbWQsIG1vZGVfYnVmLCAwLCBzaXplb2YobW9kZV9idWYpKTsKIAkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKIAkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOwogCkBAIC0xNDExLDEwICsxNDQyLDkgQEAKIAl9CiAJY2FzZSBNT0RFX1NFTlNFXzEwOgogCXsKLQkJY2hhciAqbW9kZV9idWY7CisJCWNoYXIgbW9kZV9idWZbOF07CiAKIAkJZHByaW50aygoS0VSTl9ERUJVRyAiTU9ERSBTRU5TRSAxMCBieXRlIGNvbW1hbmQuXG4iKSk7Ci0JCW1vZGVfYnVmID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CiAJCW1vZGVfYnVmWzBdID0gMDsJLyogTW9kZSBkYXRhIGxlbmd0aCAoTVNCKSAqLwogCQltb2RlX2J1ZlsxXSA9IDY7CS8qIE1vZGUgZGF0YSBsZW5ndGggKExTQikgKi8KIAkJbW9kZV9idWZbMl0gPSAwOwkvKiBNZWRpdW0gdHlwZSAtIGRlZmF1bHQgKi8KQEAgLTE0MjMsNiArMTQ1Myw3IEBACiAJCW1vZGVfYnVmWzVdID0gMDsJLyogcmVzZXJ2ZWQgKi8KIAkJbW9kZV9idWZbNl0gPSAwOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAoTVNCKSAqLwogCQltb2RlX2J1Zls3XSA9IDA7CS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoIChMU0IpICovCisJCWFhY19pbnRlcm5hbF90cmFuc2ZlcihzY3NpY21kLCBtb2RlX2J1ZiwgMCwgc2l6ZW9mKG1vZGVfYnVmKSk7CiAKIAkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKIAkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOwpAQCAtMTg5NCw3ICsxOTI1LDcgQEAKIAlzcmJjbWQtPmlkICAgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5kZXZpY2UtPmlkKTsKIAlzcmJjbWQtPmx1biAgICAgID0gY3B1X3RvX2xlMzIoc2NzaWNtZC0+ZGV2aWNlLT5sdW4pOwogCXNyYmNtZC0+ZmxhZ3MgICAgPSBjcHVfdG9fbGUzMihmbGFnKTsKLQl0aW1lb3V0ID0gKHNjc2ljbWQtPnRpbWVvdXQtamlmZmllcykvSFo7CisJdGltZW91dCA9IHNjc2ljbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQvSFo7CiAJaWYodGltZW91dCA9PSAwKXsKIAkJdGltZW91dCA9IDE7CiAJfQpAQCAtMjA3Nyw2ICsyMTA4LDc2IEBACiAJcmV0dXJuIGJ5dGVfY291bnQ7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFhY19idWlsZF9zZ3JhdyhzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kLCBzdHJ1Y3Qgc2dtYXByYXcqIHBzZykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gc2NzaWNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGJ5dGVfY291bnQgPSAwOworCisJLy8gR2V0IHJpZCBvZiBvbGQgZGF0YQorCXBzZy0+Y291bnQgPSAwOworCXBzZy0+c2dbMF0ubmV4dCA9IDA7CisJcHNnLT5zZ1swXS5wcmV2ID0gMDsKKwlwc2ctPnNnWzBdLmFkZHJbMF0gPSAwOworCXBzZy0+c2dbMF0uYWRkclsxXSA9IDA7CisJcHNnLT5zZ1swXS5jb3VudCA9IDA7CisJcHNnLT5zZ1swXS5mbGFncyA9IDA7CisJaWYgKHNjc2ljbWQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQlpbnQgaTsKKwkJaW50IHNnX2NvdW50OworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisKKwkJc2dfY291bnQgPSBwY2lfbWFwX3NnKGRldi0+cGRldiwgc2csIHNjc2ljbWQtPnVzZV9zZywKKwkJCXNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgeworCQkJaW50IGNvdW50ID0gc2dfZG1hX2xlbihzZyk7CisJCQl1NjQgYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCXBzZy0+c2dbaV0ubmV4dCA9IDA7CisJCQlwc2ctPnNnW2ldLnByZXYgPSAwOworCQkJcHNnLT5zZ1tpXS5hZGRyWzFdID0gY3B1X3RvX2xlMzIoKHUzMikoYWRkcj4+MzIpKTsKKwkJCXBzZy0+c2dbaV0uYWRkclswXSA9IGNwdV90b19sZTMyKCh1MzIpKGFkZHIgJiAweGZmZmZmZmZmKSk7CisJCQlwc2ctPnNnW2ldLmNvdW50ID0gY3B1X3RvX2xlMzIoY291bnQpOworCQkJcHNnLT5zZ1tpXS5mbGFncyA9IDA7CisJCQlieXRlX2NvdW50ICs9IGNvdW50OworCQkJc2crKzsKKwkJfQorCQlwc2ctPmNvdW50ID0gY3B1X3RvX2xlMzIoc2dfY291bnQpOworCQkvKiBoYmEgd2FudHMgdGhlIHNpemUgdG8gYmUgZXhhY3QgKi8KKwkJaWYoYnl0ZV9jb3VudCA+IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbil7CisJCQl1MzIgdGVtcCA9IGxlMzJfdG9fY3B1KHBzZy0+c2dbaS0xXS5jb3VudCkgLSAKKwkJCQkoYnl0ZV9jb3VudCAtIHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQlwc2ctPnNnW2ktMV0uY291bnQgPSBjcHVfdG9fbGUzMih0ZW1wKTsKKwkJCWJ5dGVfY291bnQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgdW5kZXJmbG93ICovCisJCWlmKHNjc2ljbWQtPnVuZGVyZmxvdyAmJiAoYnl0ZV9jb3VudCA8IHNjc2ljbWQtPnVuZGVyZmxvdykpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBjbWQgbGVuICUwOGxYIGNtZCB1bmRlcmZsb3cgJTA4WFxuIiwKKwkJCQkJYnl0ZV9jb3VudCwgc2NzaWNtZC0+dW5kZXJmbG93KTsKKwkJfQorCX0KKwllbHNlIGlmKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlpbnQgY291bnQ7CisJCXU2NCBhZGRyOworCQlzY3NpY21kLT5TQ3AuZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwKKwkJCQlzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQlzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlhZGRyID0gc2NzaWNtZC0+U0NwLmRtYV9oYW5kbGU7CisJCWNvdW50ID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlwc2ctPmNvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJCXBzZy0+c2dbMF0ubmV4dCA9IDA7CisJCXBzZy0+c2dbMF0ucHJldiA9IDA7CisJCXBzZy0+c2dbMF0uYWRkclsxXSA9IGNwdV90b19sZTMyKCh1MzIpKGFkZHI+PjMyKSk7CisJCXBzZy0+c2dbMF0uYWRkclswXSA9IGNwdV90b19sZTMyKCh1MzIpKGFkZHIgJiAweGZmZmZmZmZmKSk7CisJCXBzZy0+c2dbMF0uY291bnQgPSBjcHVfdG9fbGUzMihjb3VudCk7CisJCXBzZy0+c2dbMF0uZmxhZ3MgPSAwOworCQlieXRlX2NvdW50ID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuOworCX0KKwlyZXR1cm4gYnl0ZV9jb3VudDsKK30KKwogI2lmZGVmIEFBQ19ERVRBSUxFRF9TVEFUVVNfSU5GTwogCiBzdHJ1Y3QgYWFjX3NyYl9zdGF0dXNfaW5mbyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKaW5kZXggNGFiMDc4Ni4uZTQwNTI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaApAQCAtMTEwLDYgKzExMCwyMiBAQAogCXUzMgljb3VudDsJLyogTGVuZ3RoLiAqLwogfTsKIAorc3RydWN0IHNnZW50cnlyYXcgeworCV9fbGUzMgkJbmV4dDsJLyogcmVzZXJ2ZWQgZm9yIEYvVyB1c2UgKi8KKwlfX2xlMzIJCXByZXY7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCisJX19sZTMyCQlhZGRyWzJdOworCV9fbGUzMgkJY291bnQ7CisJX19sZTMyCQlmbGFnczsJLyogcmVzZXJ2ZWQgZm9yIEYvVyB1c2UgKi8KK307CisKK3N0cnVjdCB1c2VyX3NnZW50cnlyYXcgeworCXUzMgkJbmV4dDsJLyogcmVzZXJ2ZWQgZm9yIEYvVyB1c2UgKi8KKwl1MzIJCXByZXY7CS8qIHJlc2VydmVkIGZvciBGL1cgdXNlICovCisJdTMyCQlhZGRyWzJdOworCXUzMgkJY291bnQ7CisJdTMyCQlmbGFnczsJLyogcmVzZXJ2ZWQgZm9yIEYvVyB1c2UgKi8KK307CisKIC8qCiAgKglTR01BUAogICoKQEAgLTEzNyw2ICsxNTMsMTYgQEAKIAlzdHJ1Y3QgdXNlcl9zZ2VudHJ5NjQgc2dbMV07CiB9OwogCitzdHJ1Y3Qgc2dtYXByYXcgeworCV9fbGUzMgkJICBjb3VudDsKKwlzdHJ1Y3Qgc2dlbnRyeXJhdyBzZ1sxXTsKK307CisKK3N0cnVjdCB1c2VyX3NnbWFwcmF3IHsKKwl1MzIJCSAgY291bnQ7CisJc3RydWN0IHVzZXJfc2dlbnRyeXJhdyBzZ1sxXTsKK307CisKIHN0cnVjdCBjcmVhdGlvbl9pbmZvCiB7CiAJdTggCQlidWlsZG51bTsJCS8qIGUuZy4sIDU4OCAqLwpAQCAtMzUxLDYgKzM3Nyw3IEBACiAgKi8KICNkZWZpbmUJCUNvbnRhaW5lckNvbW1hbmQJCTUwMAogI2RlZmluZQkJQ29udGFpbmVyQ29tbWFuZDY0CQk1MDEKKyNkZWZpbmUJCUNvbnRhaW5lclJhd0lvCQkJNTAyCiAvKgogICoJQ2x1c3RlciBDb21tYW5kcwogICovCkBAIC00NTYsNiArNDgzLDcgQEAKIHsKIAl2b2lkICgqYWRhcHRlcl9pbnRlcnJ1cHQpKHN0cnVjdCBhYWNfZGV2ICpkZXYpOwogCXZvaWQgKCphZGFwdGVyX25vdGlmeSkoc3RydWN0IGFhY19kZXYgKmRldiwgdTMyIGV2ZW50KTsKKwl2b2lkICgqYWRhcHRlcl9kaXNhYmxlX2ludCkoc3RydWN0IGFhY19kZXYgKmRldik7CiAJaW50ICAoKmFkYXB0ZXJfc3luY19jbWQpKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHUzMiBjb21tYW5kLCB1MzIgcDEsIHUzMiBwMiwgdTMyIHAzLCB1MzIgcDQsIHUzMiBwNSwgdTMyIHA2LCB1MzIgKnN0YXR1cywgdTMyICpyMSwgdTMyICpyMiwgdTMyICpyMywgdTMyICpyNCk7CiAJaW50ICAoKmFkYXB0ZXJfY2hlY2tfaGVhbHRoKShzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKIH07CkBAIC05ODEsNiArMTAwOSw5IEBACiAJdTgJCQlub25kYXNkX3N1cHBvcnQ7IAogCXU4CQkJZGFjX3N1cHBvcnQ7CiAJdTgJCQlyYWlkX3Njc2lfbW9kZTsKKwkvKiBtYWNybyBzaWRlLWVmZmVjdHMgQkVXQVJFICovCisjCWRlZmluZQkJCXJhd19pb19pbnRlcmZhY2UgXAorCSAgaW5pdC0+SW5pdFN0cnVjdFJldmlzaW9uPT1jcHVfdG9fbGUzMihBREFQVEVSX0lOSVRfU1RSVUNUX1JFVklTSU9OXzQpCiAJdTgJCQlwcmludGZfZW5hYmxlZDsKIH07CiAKQEAgLTk5MCw2ICsxMDIxLDkgQEAKICNkZWZpbmUgYWFjX2FkYXB0ZXJfbm90aWZ5KGRldiwgZXZlbnQpIFwKIAkoZGV2KS0+YV9vcHMuYWRhcHRlcl9ub3RpZnkoZGV2LCBldmVudCkKIAorI2RlZmluZSBhYWNfYWRhcHRlcl9kaXNhYmxlX2ludChkZXYpIFwKKwkoZGV2KS0+YV9vcHMuYWRhcHRlcl9kaXNhYmxlX2ludChkZXYpCisKICNkZWZpbmUgYWFjX2FkYXB0ZXJfc3luY19jbWQoZGV2LCBjb21tYW5kLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBzdGF0dXMsIHIxLCByMiwgcjMsIHI0KSBcCiAJKGRldiktPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQoZGV2LCBjb21tYW5kLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBzdGF0dXMsIHIxLCByMiwgcjMsIHI0KQogCkBAIC0xMTU2LDYgKzExOTAsMTcgQEAKIAlfX2xlMzIJCWNvbW1pdHRlZDsKIH07CiAKK3N0cnVjdCBhYWNfcmF3X2lvCit7CisJX19sZTMyCQlibG9ja1syXTsKKwlfX2xlMzIJCWNvdW50OworCV9fbGUxNgkJY2lkOworCV9fbGUxNgkJZmxhZ3M7CQkvKiAwMCBXLCAwMSBSICovCisJX19sZTE2CQlicFRvdGFsOwkvKiByZXNlcnZlZCBmb3IgRi9XIHVzZSAqLworCV9fbGUxNgkJYnBDb21wbGV0ZTsJLyogcmVzZXJ2ZWQgZm9yIEYvVyB1c2UgKi8KKwlzdHJ1Y3Qgc2dtYXByYXcJc2c7Cit9OworCiAjZGVmaW5lIENUX0ZMVVNIX0NBQ0hFIDEyOQogc3RydWN0IGFhY19zeW5jaHJvbml6ZSB7CiAJX19sZTMyCQljb21tYW5kOwkvKiBWTV9Db250YWluZXJDb25maWcgKi8KQEAgLTExOTYsNyArMTI0MSw3IEBACiB9OwogCiAvKgotICogVGhpcyBhbmQgYXNzb2NhdGVkIGRhdGEgc3RydWN0cyBhcmUgdXNlZCBieSB0aGUgCisgKiBUaGlzIGFuZCBhc3NvY2lhdGVkIGRhdGEgc3RydWN0cyBhcmUgdXNlZCBieSB0aGUKICAqIGlvY3RsIGNhbGxlciBhbmQgYXJlIGluIGNwdSBvcmRlci4KICAqLwogc3RydWN0IHVzZXJfYWFjX3NyYgpAQCAtMTUwOCwxMSArMTU1MywxMiBAQAogCiBzdHJ1Y3QgcmV2aXNpb24KIHsKLQl1MzIgY29tcGF0OwotCXUzMiB2ZXJzaW9uOwotCXUzMiBidWlsZDsKKwlfX2xlMzIgY29tcGF0OworCV9fbGUzMiB2ZXJzaW9uOworCV9fbGUzMiBidWlsZDsKIH07CiAJCisKIC8qCiAgKiAJVWdseSAtIG5vbiBMaW51eCBsaWtlIGlvY3RsIGNvZGluZyBmb3IgYmFjayBjb21wYXQuCiAgKi8KQEAgLTE3MzMsMyArMTc3OSw0IEBACiBpbnQgYWFjX3NlbmRfc2h1dGRvd24oc3RydWN0IGFhY19kZXYgKmRldik7CiBleHRlcm4gaW50IG51bWFjYjsKIGV4dGVybiBpbnQgYWNic2l6ZTsKK2V4dGVybiBjaGFyIGFhY19kcml2ZXJfdmVyc2lvbltdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKaW5kZXggODUzODcwOS4uNzFmMWNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCkBAIC0yODcsNyArMjg3LDYgQEAKIAkJa2ZyZWUoZmliLT5od19maWIpOwogCQlrZnJlZShmaWIpOwogCQlzdGF0dXMgPSAwOwotCQlmaWJjdHgtPmppZmZpZXMgPSBqaWZmaWVzL0haOwogCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZmliX2xvY2ssIGZsYWdzKTsKIAkJaWYgKGYud2FpdCkgewpAQCAtMzAyLDYgKzMwMSw3IEBACiAJCQlzdGF0dXMgPSAtRUFHQUlOOwogCQl9CQogCX0KKwlmaWJjdHgtPmppZmZpZXMgPSBqaWZmaWVzL0haOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQwNSwxMCArNDA1LDIwIEBACiBzdGF0aWMgaW50IGNoZWNrX3JldmlzaW9uKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHJldmlzaW9uIHJlc3BvbnNlOworCWNoYXIgKmRyaXZlcl92ZXJzaW9uID0gYWFjX2RyaXZlcl92ZXJzaW9uOworCXUzMiB2ZXJzaW9uOwogCi0JcmVzcG9uc2UuY29tcGF0ID0gMTsKLQlyZXNwb25zZS52ZXJzaW9uID0gbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8ua2VybmVscmV2KTsKLQlyZXNwb25zZS5idWlsZCA9IGxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbGJ1aWxkKTsKKwlyZXNwb25zZS5jb21wYXQgPSBjcHVfdG9fbGUzMigxKTsKKwl2ZXJzaW9uID0gKHNpbXBsZV9zdHJ0b2woZHJpdmVyX3ZlcnNpb24sIAorCQkJCSZkcml2ZXJfdmVyc2lvbiwgMTApIDw8IDI0KSB8IDB4MDAwMDA0MDA7CisJdmVyc2lvbiArPSBzaW1wbGVfc3RydG9sKGRyaXZlcl92ZXJzaW9uICsgMSwgJmRyaXZlcl92ZXJzaW9uLCAxMCkgPDwgMTY7CisJdmVyc2lvbiArPSBzaW1wbGVfc3RydG9sKGRyaXZlcl92ZXJzaW9uICsgMSwgTlVMTCwgMTApOworCXJlc3BvbnNlLnZlcnNpb24gPSBjcHVfdG9fbGUzMih2ZXJzaW9uKTsKKyMJaWYgKGRlZmluZWQoQUFDX0RSSVZFUl9CVUlMRCkpCisJCXJlc3BvbnNlLmJ1aWxkID0gY3B1X3RvX2xlMzIoQUFDX0RSSVZFUl9CVUlMRCk7CisjCWVsc2UKKwkJcmVzcG9uc2UuYnVpbGQgPSBjcHVfdG9fbGUzMig5OTk5KTsKKyMJZW5kaWYKIAogCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jCmluZGV4IDQzNTU3YmYuLjc1YWJkMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwpAQCAtNDQsNyArNDQsOSBAQAogCiAjaW5jbHVkZSAiYWFjcmFpZC5oIgogCi1zdHJ1Y3QgYWFjX2NvbW1vbiBhYWNfY29uZmlnOworc3RydWN0IGFhY19jb21tb24gYWFjX2NvbmZpZyA9IHsKKwkuaXJxX21vZCA9IDEKK307CiAKIHN0YXRpYyBpbnQgYWFjX2FsbG9jX2NvbW0oc3RydWN0IGFhY19kZXYgKmRldiwgdm9pZCAqKmNvbW1hZGRyLCB1bnNpZ25lZCBsb25nIGNvbW1zaXplLCB1bnNpZ25lZCBsb25nIGNvbW1hbGlnbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYwppbmRleCA1MzIyODY1Li5hMWQzMDNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYwpAQCAtMjU0LDYgKzI1NCw3IEBACiBzdGF0aWMgaW50IGFhY19nZXRfZW50cnkgKHN0cnVjdCBhYWNfZGV2ICogZGV2LCB1MzIgcWlkLCBzdHJ1Y3QgYWFjX2VudHJ5ICoqZW50cnksIHUzMiAqIGluZGV4LCB1bnNpZ25lZCBsb25nICpub25vdGlmeSkKIHsKIAlzdHJ1Y3QgYWFjX3F1ZXVlICogcTsKKwl1bnNpZ25lZCBsb25nIGlkeDsKIAogCS8qCiAJICoJQWxsIG9mIHRoZSBxdWV1ZXMgd3JhcCB3aGVuIHRoZXkgcmVhY2ggdGhlIGVuZCwgc28gd2UgY2hlY2sKQEAgLTI2MywxMCArMjY0LDIzIEBACiAJICovCiAKIAlxID0gJmRldi0+cXVldWVzLT5xdWV1ZVtxaWRdOwotCQotCSppbmRleCA9IGxlMzJfdG9fY3B1KCoocS0+aGVhZGVycy5wcm9kdWNlcikpOwotCWlmICgoKmluZGV4IC0gMikgPT0gbGUzMl90b19jcHUoKihxLT5oZWFkZXJzLmNvbnN1bWVyKSkpCisKKwlpZHggPSAqaW5kZXggPSBsZTMyX3RvX2NwdSgqKHEtPmhlYWRlcnMucHJvZHVjZXIpKTsKKwkvKiBJbnRlcnJ1cHQgTW9kZXJhdGlvbiwgb25seSBpbnRlcnJ1cHQgZm9yIGZpcnN0IHR3byBlbnRyaWVzICovCisJaWYgKGlkeCAhPSBsZTMyX3RvX2NwdSgqKHEtPmhlYWRlcnMuY29uc3VtZXIpKSkgeworCQlpZiAoLS1pZHggPT0gMCkgeworCQkJaWYgKHFpZCA9PSBBZGFwSGlnaENtZFF1ZXVlKQorCQkJCWlkeCA9IEFEQVBfSElHSF9DTURfRU5UUklFUzsKKwkJCWVsc2UgaWYgKHFpZCA9PSBBZGFwTm9ybUNtZFF1ZXVlKQorCQkJCWlkeCA9IEFEQVBfTk9STV9DTURfRU5UUklFUzsKKwkJCWVsc2UgaWYgKHFpZCA9PSBBZGFwSGlnaFJlc3BRdWV1ZSkgCisJICAgICAgICAJCWlkeCA9IEFEQVBfSElHSF9SRVNQX0VOVFJJRVM7CisJCQllbHNlIGlmIChxaWQgPT0gQWRhcE5vcm1SZXNwUXVldWUpIAorCQkJCWlkeCA9IEFEQVBfTk9STV9SRVNQX0VOVFJJRVM7CisJCX0KKwkJaWYgKGlkeCAhPSBsZTMyX3RvX2NwdSgqKHEtPmhlYWRlcnMuY29uc3VtZXIpKSkKIAkJCSpub25vdGlmeSA9IDE7IAorCX0KIAogCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSkgewogCSAgICAgICAgaWYgKCppbmRleCA+PSBBREFQX0hJR0hfQ01EX0VOVFJJRVMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwppbmRleCA1NjJkYTkwLi40ZmYyOWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKQEAgLTI3LDggKzI3LDExIEBACiAgKiBBYnN0cmFjdDogTGludXggRHJpdmVyIGVudHJ5IG1vZHVsZSBmb3IgQWRhcHRlYyBSQUlEIEFycmF5IENvbnRyb2xsZXIKICAqLwogCi0jZGVmaW5lIEFBQ19EUklWRVJfVkVSU0lPTgkJIjEuMS4yLWxrMiIKLSNkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRF9EQVRFCQlfX0RBVEVfXworI2RlZmluZSBBQUNfRFJJVkVSX1ZFUlNJT04JCSIxLjEtNCIKKyNpZm5kZWYgQUFDX0RSSVZFUl9CUkFOQ0gKKyNkZWZpbmUgQUFDX0RSSVZFUl9CUkFOQ0gJCSIiCisjZW5kaWYKKyNkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRF9EQVRFCQlfX0RBVEVfXyAiICIgX19USU1FX18KICNkZWZpbmUgQUFDX0RSSVZFUk5BTUUJCQkiYWFjcmFpZCIKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtNTgsMTYgKzYxLDI0IEBACiAKICNpbmNsdWRlICJhYWNyYWlkLmgiCiAKKyNpZmRlZiBBQUNfRFJJVkVSX0JVSUxECisjZGVmaW5lIF9zdHIoeCkgI3gKKyNkZWZpbmUgc3RyKHgpIF9zdHIoeCkKKyNkZWZpbmUgQUFDX0RSSVZFUl9GVUxMX1ZFUlNJT04JQUFDX0RSSVZFUl9WRVJTSU9OICJbIiBzdHIoQUFDX0RSSVZFUl9CVUlMRCkgIl0iIEFBQ19EUklWRVJfQlJBTkNICisjZWxzZQorI2RlZmluZSBBQUNfRFJJVkVSX0ZVTExfVkVSU0lPTglBQUNfRFJJVkVSX1ZFUlNJT04gQUFDX0RSSVZFUl9CUkFOQ0ggIiAiIEFBQ19EUklWRVJfQlVJTERfREFURQorI2VuZGlmCiAKIE1PRFVMRV9BVVRIT1IoIlJlZCBIYXQgSW5jIGFuZCBBZGFwdGVjIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRlbGwgUEVSQzIsIDIvU2ksIDMvU2ksIDMvRGksICIKIAkJICAgIkFkYXB0ZWMgQWR2YW5jZWQgUmFpZCBQcm9kdWN0cywgIgogCQkgICAiYW5kIEhQIE5ldFJBSUQtNE0gU0NTSSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKEFBQ19EUklWRVJfVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihBQUNfRFJJVkVSX0ZVTExfVkVSU0lPTik7CiAKIHN0YXRpYyBMSVNUX0hFQUQoYWFjX2RldmljZXMpOwogc3RhdGljIGludCBhYWNfY2ZnX21ham9yID0gLTE7CitjaGFyIGFhY19kcml2ZXJfdmVyc2lvbltdID0gQUFDX0RSSVZFUl9GVUxMX1ZFUlNJT047CiAKIC8qCiAgKiBCZWNhdXNlIG9mIHRoZSB3YXkgTGludXggbmFtZXMgc2NzaSBkZXZpY2VzLCB0aGUgb3JkZXIgaW4gdGhpcyB0YWJsZSBoYXMKQEAgLTEwOSwzNiArMTIwLDM5IEBACiAJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDAyYTMsIDAsIDAsIDI5IH0sIC8qIElDUDUwODVBVSAoSHVycmljYW5lKSAqLwogCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMmE0LCAwLCAwLCAzMCB9LCAvKiBJQ1A5MDg1TEkgKE1hcmF1ZGVyLVgpICovCiAJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyYTUsIDAsIDAsIDMxIH0sIC8qIElDUDUwODVCUiAoTWFyYXVkZXItRSkgKi8KLQl7IDB4OTAwNSwgMHgwMjg3LCAweDkwMDUsIDB4MDgwMCwgMCwgMCwgMzIgfSwgLyogVGhlbWlzdG8gSnVwaXRlciBQbGF0Zm9ybSAqLwotCXsgMHg5MDA1LCAweDAyMDAsIDB4OTAwNSwgMHgwMjAwLCAwLCAwLCAzMiB9LCAvKiBUaGVtaXN0byBKdXBpdGVyIFBsYXRmb3JtICovCi0JeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDA4MDAsIDAsIDAsIDMzIH0sIC8qIENhbGxpc3RvIEp1cGl0ZXIgUGxhdGZvcm0gKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZSwgMCwgMCwgMzQgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZiwgMCwgMCwgMzUgfSwgLyogQVNSLTIwMjVTQSBTQVRBIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjkwLCAwLCAwLCAzNiB9LCAvKiBBQVItMjQxMFNBIFBDSSBTQVRBIDRjaCAoSmFndWFyIElJKSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4MTAyOCwgMHgwMjkxLCAwLCAwLCAzNyB9LCAvKiBDRVJDIFNBVEEgUkFJRCAyIFBDSSBTQVRBIDZjaCAoRGVsbENvcnNhaXIpICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTIsIDAsIDAsIDM4IH0sIC8qIEFBUi0yODEwU0EgUENJIFNBVEEgOGNoIChDb3JzYWlyLTgpICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTMsIDAsIDAsIDM5IH0sIC8qIEFBUi0yMTYxMFNBIFBDSSBTQVRBIDE2Y2ggKENvcnNhaXItMTYpICovCi0JeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTQsIDAsIDAsIDQwIH0sIC8qIEVTRCBTTy1ESU1NIFBDSS1YIFNBVEEgWkNSIChQcm93bGVyKSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4MTAzQywgMHgzMjI3LCAwLCAwLCA0MSB9LCAvKiBBQVItMjYxMFNBIFBDSSBTQVRBIDZjaCAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk2LCAwLCAwLCA0MiB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5NywgMCwgMCwgNDMgfSwgLyogQVNSLTQwMDVTQVMgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMTQsIDB4MDJGMiwgMCwgMCwgNDQgfSwgLyogSUJNIDhpIChBdm9uUGFyaykgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMTQsIDB4MDMxMiwgMCwgMCwgNDQgfSwgLyogSUJNIDhpIChBdm9uUGFyayBMaXRlKSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk4LCAwLCAwLCA0NSB9LCAvKiBBU1ItNDAwMFNBUyAoQmxhY2tCaXJkKSAqLwotCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk5LCAwLCAwLCA0NiB9LCAvKiBBU1ItNDgwMFNBUyAoTWFyYXVkZXItWCkgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5YSwgMCwgMCwgNDcgfSwgLyogQVNSLTQ4MDVTQVMgKE1hcmF1ZGVyLUUpICovCi0JeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDAyYTIsIDAsIDAsIDQ4IH0sIC8qIEFTUi00ODEwU0FTIChIdXJyaWNhbmUgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDJhNiwgMCwgMCwgMzIgfSwgLyogSUNQOTA2N01BIChJbnRydWRlci02KSAqLworCXsgMHg5MDA1LCAweDAyODcsIDB4OTAwNSwgMHgwODAwLCAwLCAwLCAzMyB9LCAvKiBUaGVtaXN0byBKdXBpdGVyIFBsYXRmb3JtICovCisJeyAweDkwMDUsIDB4MDIwMCwgMHg5MDA1LCAweDAyMDAsIDAsIDAsIDMzIH0sIC8qIFRoZW1pc3RvIEp1cGl0ZXIgUGxhdGZvcm0gKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDgwMCwgMCwgMCwgMzQgfSwgLyogQ2FsbGlzdG8gSnVwaXRlciBQbGF0Zm9ybSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjhlLCAwLCAwLCAzNSB9LCAvKiBBU1ItMjAyMFNBIFNBVEEgUENJLVggWkNSIChTa3loYXdrKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjhmLCAwLCAwLCAzNiB9LCAvKiBBU1ItMjAyNVNBIFNBVEEgU08tRElNTSBQQ0ktWCBaQ1IgKFRlcm1pbmF0b3IpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTAsIDAsIDAsIDM3IH0sIC8qIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCAweDAyOTEsIDAsIDAsIDM4IH0sIC8qIENFUkMgU0FUQSBSQUlEIDIgUENJIFNBVEEgNmNoIChEZWxsQ29yc2FpcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5MiwgMCwgMCwgMzkgfSwgLyogQUFSLTI4MTBTQSBQQ0kgU0FUQSA4Y2ggKENvcnNhaXItOCkgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5MywgMCwgMCwgNDAgfSwgLyogQUFSLTIxNjEwU0EgUENJIFNBVEEgMTZjaCAoQ29yc2Fpci0xNikgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5NCwgMCwgMCwgNDEgfSwgLyogRVNEIFNPLURJTU0gUENJLVggU0FUQSBaQ1IgKFByb3dsZXIpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDNDLCAweDMyMjcsIDAsIDAsIDQyIH0sIC8qIEFBUi0yNjEwU0EgUENJIFNBVEEgNmNoICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTYsIDAsIDAsIDQzIH0sIC8qIEFTUi0yMjQwUyAoU2FicmVFeHByZXNzKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk3LCAwLCAwLCA0NCB9LCAvKiBBU1ItNDAwNVNBUyAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAxNCwgMHgwMkYyLCAwLCAwLCA0NSB9LCAvKiBJQk0gOGkgKEF2b25QYXJrKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAxNCwgMHgwMzEyLCAwLCAwLCA0NSB9LCAvKiBJQk0gOGkgKEF2b25QYXJrIExpdGUpICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHgxMDE0LCAweDk1ODAsIDAsIDAsIDQ2IH0sIC8qIElCTSA4ay84ay1sOCAoQXVyb3JhKSAqLworCXsgMHg5MDA1LCAweDAyODYsIDB4MTAxNCwgMHg5NTQwLCAwLCAwLCA0NyB9LCAvKiBJQk0gOGsvOGstbDQgKEF1cm9yYSBMaXRlKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk4LCAwLCAwLCA0OCB9LCAvKiBBU1ItNDAwMFNBUyAoQmxhY2tCaXJkKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk5LCAwLCAwLCA0OSB9LCAvKiBBU1ItNDgwMFNBUyAoTWFyYXVkZXItWCkgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5YSwgMCwgMCwgNTAgfSwgLyogQVNSLTQ4MDVTQVMgKE1hcmF1ZGVyLUUpICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDAyYTIsIDAsIDAsIDUxIH0sIC8qIEFTUi00ODEwU0FTIChIdXJyaWNhbmUgKi8KIAotCXsgMHg5MDA1LCAweDAyODUsIDB4MTAyOCwgMHgwMjg3LCAwLCAwLCA0OSB9LCAvKiBQZXJjIDMyMC9EQyovCi0JeyAweDEwMTEsIDB4MDA0NiwgMHg5MDA1LCAweDAzNjUsIDAsIDAsIDUwIH0sIC8qIEFkYXB0ZWMgNTQwMFMgKE11c3RhbmcpKi8KLQl7IDB4MTAxMSwgMHgwMDQ2LCAweDkwMDUsIDB4MDM2NCwgMCwgMCwgNTEgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLwotCXsgMHgxMDExLCAweDAwNDYsIDB4OTAwNSwgMHgxMzY0LCAwLCAwLCA1MiB9LCAvKiBEZWxsIFBFUkMyL1FDICovCi0JeyAweDEwMTEsIDB4MDA0NiwgMHgxMDNjLCAweDEwYzIsIDAsIDAsIDUzIH0sIC8qIEhQIE5ldFJBSUQtNE0gKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMjgsIDB4MDI4NywgMCwgMCwgNTIgfSwgLyogUGVyYyAzMjAvREMqLworCXsgMHgxMDExLCAweDAwNDYsIDB4OTAwNSwgMHgwMzY1LCAwLCAwLCA1MyB9LCAvKiBBZGFwdGVjIDU0MDBTIChNdXN0YW5nKSovCisJeyAweDEwMTEsIDB4MDA0NiwgMHg5MDA1LCAweDAzNjQsIDAsIDAsIDU0IH0sIC8qIEFkYXB0ZWMgNTQwMFMgKE11c3RhbmcpKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDkwMDUsIDB4MTM2NCwgMCwgMCwgNTUgfSwgLyogRGVsbCBQRVJDMi9RQyAqLworCXsgMHgxMDExLCAweDAwNDYsIDB4MTAzYywgMHgxMGMyLCAwLCAwLCA1NiB9LCAvKiBIUCBOZXRSQUlELTRNICovCiAKLQl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMjgsIFBDSV9BTllfSUQsIDAsIDAsIDU0IH0sIC8qIERlbGwgQ2F0Y2hhbGwgKi8KLQl7IDB4OTAwNSwgMHgwMjg1LCAweDE3YWEsIFBDSV9BTllfSUQsIDAsIDAsIDU1IH0sIC8qIExlZ2VuZCBDYXRjaGFsbCAqLwotCXsgMHg5MDA1LCAweDAyODUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDU2IH0sIC8qIEFkYXB0ZWMgQ2F0Y2ggQWxsICovCi0JeyAweDkwMDUsIDB4MDI4NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNTcgfSwgLyogQWRhcHRlYyBSb2NrZXQgQ2F0Y2ggQWxsICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCBQQ0lfQU5ZX0lELCAwLCAwLCA1NyB9LCAvKiBEZWxsIENhdGNoYWxsICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxN2FhLCBQQ0lfQU5ZX0lELCAwLCAwLCA1OCB9LCAvKiBMZWdlbmQgQ2F0Y2hhbGwgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1OSB9LCAvKiBBZGFwdGVjIENhdGNoIEFsbCAqLworCXsgMHg5MDA1LCAweDAyODYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDYwIH0sIC8qIEFkYXB0ZWMgUm9ja2V0IENhdGNoIEFsbCAqLwogCXsgMCx9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFhY19wY2lfdGJsKTsKQEAgLTE4MCw4ICsxOTQsOSBAQAogCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiSUNQICAgICAiLCAiSUNQOTA0N01BICAgICAgICIsIDEgfSwgLyogSUNQOTA0N01BIChMYW5jZXIpICovCiAJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgICJJQ1AgICAgICIsICJJQ1A5MDg3TUEgICAgICAgIiwgMSB9LCAvKiBJQ1A5MDg3TUEgKExhbmNlcikgKi8KIAl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIklDUCAgICAgIiwgIklDUDUwODVBVSAgICAgICAiLCAxIH0sIC8qIElDUDUwODVBVSAoSHVycmljYW5lKSAqLwotCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiSUNQICAgICAiLCAiSUNQOTA4NUxJICAgICAgICIsIDEgfSwgLyogSUNQOTA4NUxJIChNYXJhdWRlci1YKSAqLwotCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiSUNQICAgICAiLCAiSUNQNTA4NUJSICAgICAgICIsIDEgfSwgLyogSUNQNTA4NUJSIChNYXJhdWRlci1FKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJJQ1AgICAgICIsICJJQ1A5MDg1TEkgICAgICAgIiwgMSB9LCAvKiBJQ1A5MDg1TEkgKE1hcmF1ZGVyLVgpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIklDUCAgICAgIiwgIklDUDUwODVCUiAgICAgICAiLCAxIH0sIC8qIElDUDUwODVCUiAoTWFyYXVkZXItRSkgKi8KKwl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIklDUCAgICAgIiwgIklDUDkwNjdNQSAgICAgICAiLCAxIH0sIC8qIElDUDkwNjdNQSAoSW50cnVkZXItNikgKi8KIAl7IE5VTEwgICAgICAgICwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIlRoZW1pc3RvICAgICAgICAiLCAwLCBBQUNfUVVJUktfU0xBVkUgfSwgLyogSnVwaXRlciBQbGF0Zm9ybSAqLwogCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQ2FsbGlzdG8gICAgICAgICIsIDIsIEFBQ19RVUlSS19NQVNURVIgfSwgLyogSnVwaXRlciBQbGF0Zm9ybSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyMFNBICAgICAgICIsIDEgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KQEAgLTE5NSwxMCArMjEwLDEyIEBACiAJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMjQwUyAgICAgICAiLCAxIH0sIC8qIEFTUi0yMjQwUyAoU2FicmVFeHByZXNzKSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDAwNVNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDAwNVNBUyAqLwogCXsgYWFjX3J4X2luaXQsICJTZXJ2ZVJBSUQiLCJJQk0gICAgICIsICJTZXJ2ZVJBSUQgOGkgICAgIiwgMSB9LCAvKiBJQk0gOGkgKEF2b25QYXJrKSAqLworCXsgYWFjX3JrdF9pbml0LCAiU2VydmVSQUlEIiwiSUJNICAgICAiLCAiU2VydmVSQUlEIDhrLWw4ICIsIDEgfSwgLyogSUJNIDhrLzhrLWw4IChBdXJvcmEpICovCisJeyBhYWNfcmt0X2luaXQsICJTZXJ2ZVJBSUQiLCJJQk0gICAgICIsICJTZXJ2ZVJBSUQgOGstbDQgIiwgMSB9LCAvKiBJQk0gOGsvOGstbDQgKEF1cm9yYSBMaXRlKSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDAwMFNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDAwMFNBUyAoQmxhY2tCaXJkICYgQXZvblBhcmspICovCiAJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi00ODAwU0FTICAgICAiLCAxIH0sIC8qIEFTUi00ODAwU0FTIChNYXJhdWRlci1YKSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDgwNVNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDgwNVNBUyAoTWFyYXVkZXItRSkgKi8KLQl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTQ4MTBTQVMgICAgICIsIDEgfSwgLyogQVNSLTQ4MTBTQVMgKEh1cnJpY2FuZSkgKi8KKwl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi00ODEwU0FTICAgICAiLCAxIH0sIC8qIEFTUi00ODEwU0FTIChIdXJyaWNhbmUpICovCiAKIAl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQyAzMjAvREMgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBlcmMgMzIwL0RDKi8KIAl7IGFhY19zYV9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQWRhcHRlYyA1NDAwUyAgICIsIDQsIEFBQ19RVUlSS18zNFNHIH0sIC8qIEFkYXB0ZWMgNTQwMFMgKE11c3RhbmcpKi8KQEAgLTgzOSwxMSArODU2LDEyIEBACiAKIAlyZXR1cm4gMDsKIAotb3V0X2RlaW5pdDoKKyBvdXRfZGVpbml0OgogCWtpbGxfcHJvYyhhYWMtPnRocmVhZF9waWQsIFNJR0tJTEwsIDApOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFhYy0+YWlmX2NvbXBsZXRpb24pOwogCiAJYWFjX3NlbmRfc2h1dGRvd24oYWFjKTsKKwlhYWNfYWRhcHRlcl9kaXNhYmxlX2ludChhYWMpOwogCWZpYl9tYXBfZnJlZShhYWMpOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWFjLT5wZGV2LCBhYWMtPmNvbW1fc2l6ZSwgYWFjLT5jb21tX2FkZHIsIGFhYy0+Y29tbV9waHlzKTsKIAlrZnJlZShhYWMtPnF1ZXVlcyk7CkBAIC04NjAsNiArODc4LDEzIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgdm9pZCBhYWNfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhYWNfZGV2ICphYWMgPSAoc3RydWN0IGFhY19kZXYgKilzaG9zdC0+aG9zdGRhdGE7CisJYWFjX3NlbmRfc2h1dGRvd24oYWFjKTsKK30KKwogc3RhdGljIHZvaWQgX19kZXZleGl0IGFhY19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtODcxLDYgKzg5Niw3IEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmYWFjLT5haWZfY29tcGxldGlvbik7CiAKIAlhYWNfc2VuZF9zaHV0ZG93bihhYWMpOworCWFhY19hZGFwdGVyX2Rpc2FibGVfaW50KGFhYyk7CiAJZmliX21hcF9mcmVlKGFhYyk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChhYWMtPnBkZXYsIGFhYy0+Y29tbV9zaXplLCBhYWMtPmNvbW1fYWRkciwKIAkJCWFhYy0+Y29tbV9waHlzKTsKQEAgLTg5MSwxNCArOTE3LDE1IEBACiAJLmlkX3RhYmxlCT0gYWFjX3BjaV90YmwsCiAJLnByb2JlCQk9IGFhY19wcm9iZV9vbmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhYWNfcmVtb3ZlX29uZSksCisJLnNodXRkb3duIAk9IGFhY19zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFhY19pbml0KHZvaWQpCiB7CiAJaW50IGVycm9yOwogCQotCXByaW50ayhLRVJOX0lORk8gIlJlZCBIYXQvQWRhcHRlYyBhYWNyYWlkIGRyaXZlciAoJXMgJXMpXG4iLAotCQkJQUFDX0RSSVZFUl9WRVJTSU9OLCBBQUNfRFJJVkVSX0JVSUxEX0RBVEUpOworCXByaW50ayhLRVJOX0lORk8gIkFkYXB0ZWMgJXMgZHJpdmVyICglcylcbiIsCisJICBBQUNfRFJJVkVSTkFNRSwgYWFjX2RyaXZlcl92ZXJzaW9uKTsKIAogCWVycm9yID0gcGNpX21vZHVsZV9pbml0KCZhYWNfcGNpX2RyaXZlcik7CiAJaWYgKGVycm9yKQpAQCAtOTA5LDYgKzkzNiw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJhYWNyYWlkOiB1bmFibGUgdG8gcmVnaXN0ZXIgXCJhYWNcIiBkZXZpY2UuXG4iKTsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvcmt0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYwppbmRleCA3ZDY4Yjc4Li41NTcyODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYwpAQCAtODgsNiArODgsMTYgQEAKIH0KIAogLyoqCisgKglhYWNfcmt0X2Rpc2FibGVfaW50ZXJydXB0CS0JRGlzYWJsZSBpbnRlcnJ1cHRzCisgKglAZGV2OiBBZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3JrdF9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYWFjX2RldiAqZGV2KQoreworCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZmKTsKK30KKworLyoqCiAgKglya3Rfc3luY19jbWQJLQlzZW5kIGEgY29tbWFuZCBhbmQgd2FpdAogICoJQGRldjogQWRhcHRlcgogICoJQGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZQpAQCAtNDEyLDEwICs0MjIsMTkgQEAKIAkgKglGaWxsIGluIHRoZSBmdW5jdGlvbiBkaXNwYXRjaCB0YWJsZS4KIAkgKi8KIAlkZXYtPmFfb3BzLmFkYXB0ZXJfaW50ZXJydXB0ID0gYWFjX3JrdF9pbnRlcnJ1cHRfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfZGlzYWJsZV9pbnQgPSBhYWNfcmt0X2Rpc2FibGVfaW50ZXJydXB0OwogCWRldi0+YV9vcHMuYWRhcHRlcl9ub3RpZnkgPSBhYWNfcmt0X25vdGlmeV9hZGFwdGVyOwogCWRldi0+YV9vcHMuYWRhcHRlcl9zeW5jX2NtZCA9IHJrdF9zeW5jX2NtZDsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3JrdF9jaGVja19oZWFsdGg7CiAKKwkvKgorCSAqCUZpcnN0IGNsZWFyIG91dCBhbGwgaW50ZXJydXB0cy4gIFRoZW4gZW5hYmxlIHRoZSBvbmUncyB0aGF0IHdlCisJICoJY2FuIGhhbmRsZS4KKwkgKi8KKwlya3Rfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgMHhmZik7CisJcmt0X3dyaXRlbChkZXYsIE1Vbml0Lk9EUiwgMHhmZmZmZmZmZik7CisJcmt0X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiA9IDB4ZmIpOworCiAJaWYgKGFhY19pbml0X2FkYXB0ZXIoZGV2KSA9PSBOVUxMKQogCQlnb3RvIGVycm9yX2lycTsKIAkvKgpAQCAtNDM4LDYgKzQ1Nyw3IEBACiAJa2ZyZWUoZGV2LT5xdWV1ZXMpOwogCiBlcnJvcl9pcnE6CisJcmt0X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiA9IDB4ZmYpOwogCWZyZWVfaXJxKGRldi0+c2NzaV9ob3N0X3B0ci0+aXJxLCAodm9pZCAqKWRldik7CiAKIGVycm9yX2lvdW5tYXA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwppbmRleCAxZmYyNWY0Li5hODQ1OWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKQEAgLTg4LDYgKzg4LDE2IEBACiB9CiAKIC8qKgorICoJYWFjX3J4X2Rpc2FibGVfaW50ZXJydXB0CS0JRGlzYWJsZSBpbnRlcnJ1cHRzCisgKglAZGV2OiBBZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3J4X2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmZik7Cit9CisKKy8qKgogICoJcnhfc3luY19jbWQJLQlzZW5kIGEgY29tbWFuZCBhbmQgd2FpdAogICoJQGRldjogQWRhcHRlcgogICoJQGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZQpAQCAtNDEyLDEwICs0MjIsMTkgQEAKIAkgKglGaWxsIGluIHRoZSBmdW5jdGlvbiBkaXNwYXRjaCB0YWJsZS4KIAkgKi8KIAlkZXYtPmFfb3BzLmFkYXB0ZXJfaW50ZXJydXB0ID0gYWFjX3J4X2ludGVycnVwdF9hZGFwdGVyOworCWRldi0+YV9vcHMuYWRhcHRlcl9kaXNhYmxlX2ludCA9IGFhY19yeF9kaXNhYmxlX2ludGVycnVwdDsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfbm90aWZ5ID0gYWFjX3J4X25vdGlmeV9hZGFwdGVyOwogCWRldi0+YV9vcHMuYWRhcHRlcl9zeW5jX2NtZCA9IHJ4X3N5bmNfY21kOwogCWRldi0+YV9vcHMuYWRhcHRlcl9jaGVja19oZWFsdGggPSBhYWNfcnhfY2hlY2tfaGVhbHRoOwogCisJLyoKKwkgKglGaXJzdCBjbGVhciBvdXQgYWxsIGludGVycnVwdHMuICBUaGVuIGVuYWJsZSB0aGUgb25lJ3MgdGhhdCB3ZQorCSAqCWNhbiBoYW5kbGUuCisJICovCisJcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgMHhmZik7CisJcnhfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCAweGZmZmZmZmZmKTsKKwlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZiKTsKKwogCWlmIChhYWNfaW5pdF9hZGFwdGVyKGRldikgPT0gTlVMTCkKIAkJZ290byBlcnJvcl9pcnE7CiAJLyoKQEAgLTQzOCw2ICs0NTcsNyBAQAogCWtmcmVlKGRldi0+cXVldWVzKTsKIAogZXJyb3JfaXJxOgorCXJ4X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiA9IDB4ZmYpOwogCWZyZWVfaXJxKGRldi0+c2NzaV9ob3N0X3B0ci0+aXJxLCAodm9pZCAqKWRldik7CiAKIGVycm9yX2lvdW5tYXA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYwppbmRleCAwNjgwMjQ5Li4zOTAwYWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKQEAgLTgyLDYgKzgyLDE2IEBACiB9CiAKIC8qKgorICoJYWFjX3NhX2Rpc2FibGVfaW50ZXJydXB0CS0JZGlzYWJsZSBpbnRlcnJ1cHQKKyAqCUBkZXY6IFdoaWNoIGFkYXB0ZXIgdG8gZW5hYmxlLgorICovCisKK3N0YXRpYyB2b2lkIGFhY19zYV9kaXNhYmxlX2ludGVycnVwdCAoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlzYV93cml0ZXcoZGV2LCBTYURiQ1NSLlBSSVNFVElSUU1BU0ssIDB4ZmZmZik7Cit9CisKKy8qKgogICoJYWFjX3NhX25vdGlmeV9hZGFwdGVyCQktCWhhbmRsZSBhZGFwdGVyIG5vdGlmaWNhdGlvbgogICoJQGRldjoJQWRhcHRlciB0aGF0IG5vdGlmaWNhdGlvbiBpcyBmb3IKICAqCUBldmVudDoJRXZlbnQgdG8gbm90aWR5CkBAIC0yMTQsOSArMjI0LDggQEAKICAKIHN0YXRpYyB2b2lkIGFhY19zYV9pbnRlcnJ1cHRfYWRhcHRlciAoc3RydWN0IGFhY19kZXYgKmRldikKIHsKLQl1MzIgcmV0OwogCXNhX3N5bmNfY21kKGRldiwgQlJFQUtQT0lOVF9SRVFVRVNULCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJJnJldCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogLyoqCkBAIC0zNTIsMTAgKzM2MSwxOCBAQAogCSAqLwogCiAJZGV2LT5hX29wcy5hZGFwdGVyX2ludGVycnVwdCA9IGFhY19zYV9pbnRlcnJ1cHRfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfZGlzYWJsZV9pbnQgPSBhYWNfc2FfZGlzYWJsZV9pbnRlcnJ1cHQ7CiAJZGV2LT5hX29wcy5hZGFwdGVyX25vdGlmeSA9IGFhY19zYV9ub3RpZnlfYWRhcHRlcjsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSBzYV9zeW5jX2NtZDsKIAlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3NhX2NoZWNrX2hlYWx0aDsKIAorCS8qCisJICoJRmlyc3QgY2xlYXIgb3V0IGFsbCBpbnRlcnJ1cHRzLiAgVGhlbiBlbmFibGUgdGhlIG9uZSdzIHRoYXQgCisJICoJd2UgY2FuIGhhbmRsZS4KKwkgKi8KKwlzYV93cml0ZXcoZGV2LCBTYURiQ1NSLlBSSVNFVElSUU1BU0ssIDB4ZmZmZik7CisJc2Ffd3JpdGV3KGRldiwgU2FEYkNTUi5QUklDTEVBUklSUU1BU0ssIChQcmludGZSZWFkeSB8IERPT1JCRUxMXzEgfCAKKwkJCQlET09SQkVMTF8yIHwgRE9PUkJFTExfMyB8IERPT1JCRUxMXzQpKTsKIAogCWlmKGFhY19pbml0X2FkYXB0ZXIoZGV2KSA9PSBOVUxMKQogCQlnb3RvIGVycm9yX2lycTsKQEAgLTM4MSw2ICszOTgsNyBAQAogCWtmcmVlKGRldi0+cXVldWVzKTsKIAogZXJyb3JfaXJxOgorCXNhX3dyaXRldyhkZXYsIFNhRGJDU1IuUFJJU0VUSVJRTUFTSywgMHhmZmZmKTsKIAlmcmVlX2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgKHZvaWQgKilkZXYpOwogCiBlcnJvcl9pb3VubWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAwZmI5MzM2Li4zN2VjNTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtOTIwMCw4ICs5MjAwLDggQEAKICAgICAgICAgKHVuc2lnbmVkKSBzLT5zZXJpYWxfbnVtYmVyLCBzLT5yZXRyaWVzLCBzLT5hbGxvd2VkKTsKIAogICAgIHByaW50aygKLSIgdGltZW91dF9wZXJfY29tbWFuZCAlZCwgdGltZW91dF90b3RhbCAlZCwgdGltZW91dCAlZFxuIiwKLSAgICAgICAgcy0+dGltZW91dF9wZXJfY29tbWFuZCwgcy0+dGltZW91dF90b3RhbCwgcy0+dGltZW91dCk7CisiIHRpbWVvdXRfcGVyX2NvbW1hbmQgJWRcbiIsCisgICAgICAgIHMtPnRpbWVvdXRfcGVyX2NvbW1hbmQpOwogCiAgICAgcHJpbnRrKAogIiBzY3NpX2RvbmUgMHglbHgsIGRvbmUgMHglbHgsIGhvc3Rfc2NyaWJibGUgMHglbHgsIHJlc3VsdCAweCV4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoY2kuYyBiL2RyaXZlcnMvc2NzaS9haGNpLmMKaW5kZXggMzEwNjUyNi4uYzJjOGZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FoY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCkBAIC0yNTAsNyArMjUwLDcgQEAKIAkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKIAkJCQkgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19NTUlPIHwKIAkJCQkgIEFUQV9GTEFHX1BJT19ETUEsCi0JCS5waW9fbWFzawk9IDB4MDMsIC8qIHBpbzMtNCAqLworCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKQEAgLTg2NSwyMiArODY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogbW92ZSB0byBQQ0kgbGF5ZXIsIGludGVncmF0ZSB3LyBNU0kgc3R1ZmYgKi8KLXN0YXRpYyB2b2lkIHBjaV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZW5hYmxlKQotewotCXUxNiBwY2lfY29tbWFuZCwgbmV3OwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7Ci0KLQlpZiAoZW5hYmxlKQotCQluZXcgPSBwY2lfY29tbWFuZCAmIH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JZWxzZQotCQluZXcgPSBwY2lfY29tbWFuZCB8IFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQotCWlmIChuZXcgIT0gcGNpX2NvbW1hbmQpCi0JCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOwotfQotCiBzdGF0aWMgdm9pZCBhaGNpX3ByaW50X2luZm8oc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKIHsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gcHJvYmVfZW50LT5wcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHgKaW5kZXggYzI1MjNhMy4uNjllZDc3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3OXh4CisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljNzl4eApAQCAtNSw2ICs1LDcgQEAKIGNvbmZpZyBTQ1NJX0FJQzc5WFgKIAl0cmlzdGF0ZSAiQWRhcHRlYyBBSUM3OXh4IFUzMjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJc2VsZWN0IFNDU0lfU1BJX0FUVFJTCiAJaGVscAogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBvZiBBZGFwdGVjJ3MgVWx0cmEgMzIwIFBDSS1YCiAJYmFzZWQgU0NTSSBjb250cm9sbGVycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzAuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzAuYwppbmRleCAwMGYzYmQxLi41MjdlZmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jCkBAIC0xMjYsNyArMTI2LDYgQEAKIGludAogYWljNzc3MF9jb25maWcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSAqZW50cnksIHVfaW50IGlvKQogewotCXVfbG9uZwlsOwogCWludAllcnJvcjsKIAlpbnQJaGF2ZV9zZWVwcm9tOwogCXVfaW50CWhvc3Rjb25mOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCmluZGV4IGZkNGIyZjMuLjY1M2ZiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmgKQEAgLTEyNDcsOSArMTI0Nyw2IEBACiAJdWludDE2X3QJCSAgdXNlcl90YWdlbmFibGU7LyogVGFnZ2VkIFF1ZXVpbmcgYWxsb3dlZCAqLwogfTsKIAotVEFJTFFfSEVBRChhaGRfc29mdGNfdGFpbHEsIGFoZF9zb2Z0Yyk7Ci1leHRlcm4gc3RydWN0IGFoZF9zb2Z0Y190YWlscSBhaGRfdGFpbHE7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSU8gQ2VsbCBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lCUFIRF9QUkVDT01QX1NMRVdfSU5ERVgJCQkJCQlcCiAgICAgKEFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcgLSBBSERfQU5ORVhDT0xfUEVSX0RFVjApCkBAIC0xMzc0LDggKzEzNzEsNiBAQAogdm9pZAkJCSBhaGRfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogaW50CQkJIGFoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7IAogaW50CQkJIGFoZF9yZXN1bWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXZvaWQJCQkgYWhkX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhkX3NvZnRjICopOwotc3RydWN0IGFoZF9zb2Z0YwkqYWhkX2ZpbmRfc29mdGMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIHZvaWQJCQkgYWhkX3NldF91bml0KHN0cnVjdCBhaGRfc29mdGMgKiwgaW50KTsKIHZvaWQJCQkgYWhkX3NldF9uYW1lKHN0cnVjdCBhaGRfc29mdGMgKiwgY2hhciAqKTsKIHN0cnVjdCBzY2IJCSphaGRfZ2V0X3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGNvbF9pZHgpOwpAQCAtMTUyNCw3ICsxNTE5LDYgQEAKIHZvaWQJCQlhaGRfcHJpbnRfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKIHZvaWQJCQlhaGRfZHVtcF9zZ2xpc3Qoc3RydWN0IHNjYiAqc2NiKTsKLXZvaWQJCQlhaGRfZHVtcF9hbGxfY2FyZHNfc3RhdGUodm9pZCk7CiB2b2lkCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogaW50CQkJYWhkX3ByaW50X3JlZ2lzdGVyKGFoZF9yZWdfcGFyc2VfZW50cnlfdCAqdGFibGUsCiAJCQkJCSAgIHVfaW50IG51bV9lbnRyaWVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwppbmRleCAxMzdmYjFhLi40ZThmMDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwpAQCAtNTIsOCArNTIsNiBAQAogI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0Lmg+CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBhaGRfc29mdGNfdGFpbHEgYWhkX3RhaWxxID0gVEFJTFFfSEVBRF9JTklUSUFMSVpFUihhaGRfdGFpbHEpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTG9va3VwIFRhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogY2hhciAqYWhkX2NoaXBfbmFtZXNbXSA9CkBAIC01MTgwLDc0ICs1MTc4LDYgQEAKIH0KIAogdm9pZAotYWhkX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7Ci0KLSNpZiBBSERfUENJX0NPTkZJRyA+IDAKLQkvKgotCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQotCSAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KLQkgKi8KLQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTVVMVElfRlVOQykgIT0gMCkgewotCQlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgewotCQkJYWhkX2Rldl9zb2Z0Y190IGxpc3RfcGNpOwotCQkJYWhkX2Rldl9zb2Z0Y190IHBjaTsKLQotCQkJbGlzdF9wY2kgPSBsaXN0X2FoZC0+ZGV2X3NvZnRjOwotCQkJcGNpID0gYWhkLT5kZXZfc29mdGM7Ci0JCQlpZiAoYWhkX2dldF9wY2lfc2xvdChsaXN0X3BjaSkgPT0gYWhkX2dldF9wY2lfc2xvdChwY2kpCi0JCQkgJiYgYWhkX2dldF9wY2lfYnVzKGxpc3RfcGNpKSA9PSBhaGRfZ2V0X3BjaV9idXMocGNpKSkgewotCQkJCXN0cnVjdCBhaGRfc29mdGMgKm1hc3RlcjsKLQkJCQlzdHJ1Y3QgYWhkX3NvZnRjICpzbGF2ZTsKLQotCQkJCWlmIChhaGRfZ2V0X3BjaV9mdW5jdGlvbihsaXN0X3BjaSkgPT0gMCkgewotCQkJCQltYXN0ZXIgPSBsaXN0X2FoZDsKLQkJCQkJc2xhdmUgPSBhaGQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFzdGVyID0gYWhkOwotCQkJCQlzbGF2ZSA9IGxpc3RfYWhkOwotCQkJCX0KLQkJCQlzbGF2ZS0+ZmxhZ3MgJj0gfkFIRF9CSU9TX0VOQUJMRUQ7IAotCQkJCXNsYXZlLT5mbGFncyB8PQotCQkJCSAgICBtYXN0ZXItPmZsYWdzICYgQUhEX0JJT1NfRU5BQkxFRDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBJbnNlcnRpb24gc29ydCBpbnRvIG91ciBsaXN0IG9mIHNvZnRjcy4KLQkgKi8KLQlsaXN0X2FoZCA9IFRBSUxRX0ZJUlNUKCZhaGRfdGFpbHEpOwotCXdoaWxlIChsaXN0X2FoZCAhPSBOVUxMCi0JICAgICYmIGFoZF9zb2Z0Y19jb21wKGFoZCwgbGlzdF9haGQpIDw9IDApCi0JCWxpc3RfYWhkID0gVEFJTFFfTkVYVChsaXN0X2FoZCwgbGlua3MpOwotCWlmIChsaXN0X2FoZCAhPSBOVUxMKQotCQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RfYWhkLCBhaGQsIGxpbmtzKTsKLQllbHNlCi0JCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGRfdGFpbHEsIGFoZCwgbGlua3MpOwotCWFoZC0+aW5pdF9sZXZlbCsrOwotfQotCi0vKgotICogVmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBpbiBzb2Z0YyBwb2ludGVyIGlzIGZvciBhCi0gKiBjb250cm9sbGVyIHRoYXQgaXMgc3RpbGwgY29uZmlndXJlZC4KLSAqLwotc3RydWN0IGFoZF9zb2Z0YyAqCi1haGRfZmluZF9zb2Z0YyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7Ci0KLQlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgewotCQlpZiAobGlzdF9haGQgPT0gYWhkKQotCQkJcmV0dXJuIChhaGQpOwotCX0KLQlyZXR1cm4gKE5VTEwpOwotfQotCi12b2lkCiBhaGRfc2V0X3VuaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdW5pdCkKIHsKIAlhaGQtPnVuaXQgPSB1bml0OwpAQCAtNzkwMiwxOCArNzgzMiwxMCBAQAogc3RhdGljIHZvaWQKIGFoZF9yZXNldF9wb2xsKHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkID0gYXJnOwogCXVfaW50CXNjc2lzZXExOwotCXVfbG9uZwlsOwogCXVfbG9uZwlzOwogCQotCWFoZF9saXN0X2xvY2soJmwpOwotCWFoZCA9IGFoZF9maW5kX3NvZnRjKChzdHJ1Y3QgYWhkX3NvZnRjICopYXJnKTsKLQlpZiAoYWhkID09IE5VTEwpIHsKLQkJcHJpbnRmKCJhaGRfcmVzZXRfcG9sbDogSW5zdGFuY2UgJXAgbm8gbG9uZ2VyIGV4aXN0c1xuIiwgYXJnKTsKLQkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKLQkJcmV0dXJuOwotCX0KIAlhaGRfbG9jayhhaGQsICZzKTsKIAlhaGRfcGF1c2UoYWhkKTsKIAlhaGRfdXBkYXRlX21vZGVzKGFoZCk7CkBAIC03OTI0LDcgKzc4NDYsNiBAQAogCQkJCWFoZF9yZXNldF9wb2xsLCBhaGQpOwogCQlhaGRfdW5wYXVzZShhaGQpOwogCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQlhaGRfbGlzdF91bmxvY2soJmwpOwogCQlyZXR1cm47CiAJfQogCkBAIC03OTM2LDI1ICs3ODU3LDE2IEBACiAJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX1BPTExfQUNUSVZFOwogCWFoZF91bmxvY2soYWhkLCAmcyk7CiAJYWhkX3JlbGVhc2Vfc2ltcShhaGQpOwotCWFoZF9saXN0X3VubG9jaygmbCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFN0YXRpc3RpY3MgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZAogYWhkX3N0YXRfdGltZXIodm9pZCAqYXJnKQogewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcJbDsKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQgPSBhcmc7CiAJdV9sb25nCXM7CiAJaW50CWVuaW50X2NvYWw7CiAJCi0JYWhkX2xpc3RfbG9jaygmbCk7Ci0JYWhkID0gYWhkX2ZpbmRfc29mdGMoKHN0cnVjdCBhaGRfc29mdGMgKilhcmcpOwotCWlmIChhaGQgPT0gTlVMTCkgewotCQlwcmludGYoImFoZF9zdGF0X3RpbWVyOiBJbnN0YW5jZSAlcCBubyBsb25nZXIgZXhpc3RzXG4iLCBhcmcpOwotCQlhaGRfbGlzdF91bmxvY2soJmwpOwotCQlyZXR1cm47Ci0JfQogCWFoZF9sb2NrKGFoZCwgJnMpOwogCiAJZW5pbnRfY29hbCA9IGFoZC0+aHNfbWFpbGJveCAmIEVOSU5UX0NPQUxFU0NFOwpAQCAtNzk4MSw3ICs3ODkzLDYgQEAKIAlhaGRfdGltZXJfcmVzZXQoJmFoZC0+c3RhdF90aW1lciwgQUhEX1NUQVRfVVBEQVRFX1VTLAogCQkJYWhkX3N0YXRfdGltZXIsIGFoZCk7CiAJYWhkX3VubG9jayhhaGQsICZzKTsKLQlhaGRfbGlzdF91bmxvY2soJmwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFN0YXR1cyBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODc0NSwxNiArODY1Niw2IEBACiAJcmV0dXJuIChsYXN0X3Byb2JlKTsKIH0KIAotdm9pZAotYWhkX2R1bXBfYWxsX2NhcmRzX3N0YXRlKHZvaWQpCi17Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7Ci0KLQlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgewotCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGxpc3RfYWhkKTsKLQl9Ci19Ci0KIGludAogYWhkX3ByaW50X3JlZ2lzdGVyKGFoZF9yZWdfcGFyc2VfZW50cnlfdCAqdGFibGUsIHVfaW50IG51bV9lbnRyaWVzLAogCQkgICBjb25zdCBjaGFyICpuYW1lLCB1X2ludCBhZGRyZXNzLCB1X2ludCB2YWx1ZSwKQEAgLTkwMzksNyArODk0MCw2IEBACiAJCWFoZF9vdXRiKGFoZCwgU1RBQ0ssIChhaGQtPnNhdmVkX3N0YWNrW2ldID4+IDgpICYgMHhGRik7CiAJfQogCXByaW50ZigiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOwotCWFoZF9wbGF0Zm9ybV9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKIAlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKIAlpZiAocGF1c2VkID09IDApCiAJCWFoZF91bnBhdXNlKGFoZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwppbmRleCAzMjljYjIzLi42YjZkNGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKQEAgLTQ2LDMyICs0NiwxNCBAQAogI2luY2x1ZGUgImFpYzc5eHhfaW5saW5lLmgiCiAjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CiAKLS8qCi0gKiBJbmNsdWRlIGFpY2xpYi5jIGFzIHBhcnQgb2Ygb3VyCi0gKiAibW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgaGFyZCIgd29yayBhcm91bmQuCi0gKi8KLSNpbmNsdWRlICJhaWNsaWIuYyIKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmFoZF9saW51eF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19zZXR1cCAqLwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaW5jbHVkZSAic2QuaCIJCQkvKiBGb3IgZ2VvbWV0cnkgZGV0ZWN0aW9uICovCi0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBGb3IgZmV0Y2hpbmcgc3lzdGVtIG1lbW9yeSBzaXplICovCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CQkvKiBGb3IgYmxvY2tfc2l6ZSgpICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHNzbGVlcC9tc2xlZXAgKi8KIAogLyoKLSAqIExvY2sgcHJvdGVjdGluZyBtYW5pcHVsYXRpb24gb2YgdGhlIGFoZCBzb2Z0YyBsaXN0LgotICovCi1zcGlubG9ja190IGFoZF9saXN0X3NwaW5sb2NrOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0vKiBGb3IgZHluYW1pYyBzZ2xpc3Qgc2l6ZSBjYWxjdWxhdGlvbi4gKi8KLXVfaW50IGFoZF9saW51eF9uc2VnOwotI2VuZGlmCi0KLS8qCiAgKiBCdWNrZXQgc2l6ZSBmb3IgY291bnRpbmcgZ29vZCBjb21tYW5kcyBpbiBiZXR3ZWVuIGJhZCBvbmVzLgogICovCiAjZGVmaW5lIEFIRF9MSU5VWF9FUlJfVEhSRVNICTEwMDAKQEAgLTE4OCw3MSArMTcwLDYgQEAKIH07CiAKIC8qCi0gKiBCeSBkZWZhdWx0LCByZWFkIHN0cmVhbWluZyBpcyBkaXNhYmxlZC4gIEluIHRoZW9yeSwKLSAqIHJlYWQgc3RyZWFtaW5nIHNob3VsZCBlbmhhbmNlIHBlcmZvcm1hbmNlLCBidXQgZWFybHkKLSAqIFUzMjAgZHJpdmUgZmlybXdhcmUgYWN0dWFsbHkgcGVyZm9ybXMgc2xvd2VyIHdpdGgKLSAqIHJlYWQgc3RyZWFtaW5nIGVuYWJsZWQuCi0gKi8KLSNpZmRlZiBDT05GSUdfQUlDNzlYWF9FTkFCTEVfUkRfU1RSTQotI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0gMHhGRkZGCi0jZWxzZQotI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0gMAotI2VuZGlmCi0KLXN0YXRpYyB1aW50MTZfdCBhaWM3OXh4X3JkX3N0cm1faW5mb1tdID0KLXsKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCi0JQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAotCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKLQlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0KLX07Ci0KLS8qCi0gKiBEViBvcHRpb246Ci0gKgotICogcG9zaXRpdmUgdmFsdWUgPSBEViBFbmFibGVkCi0gKiB6ZXJvCQkgID0gRFYgRGlzYWJsZWQKLSAqIG5lZ2F0aXZlIHZhbHVlID0gRFYgRGVmYXVsdCBmb3IgYWRhcHRlciB0eXBlL3NlZXByb20KLSAqLwotI2lmZGVmIENPTkZJR19BSUM3OVhYX0RWX1NFVFRJTkcKLSNkZWZpbmUgQUlDNzlYWF9DT05GSUdFRF9EViBDT05GSUdfQUlDNzlYWF9EVl9TRVRUSU5HCi0jZWxzZQotI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX0RWIC0xCi0jZW5kaWYKLQotc3RhdGljIGludDhfdCBhaWM3OXh4X2R2X3NldHRpbmdzW10gPQotewotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYsCi0JQUlDNzlYWF9DT05GSUdFRF9EViwKLQlBSUM3OVhYX0NPTkZJR0VEX0RWLAotCUFJQzc5WFhfQ09ORklHRURfRFYKLX07Ci0KLS8qCiAgKiBUaGUgSS9PIGNlbGwgb24gdGhlIGNoaXAgaXMgdmVyeSBjb25maWd1cmFibGUgaW4gcmVzcGVjdCB0byBpdHMgYW5hbG9nCiAgKiBjaGFyYWN0ZXJpc3RpY3MuICBTZXQgdGhlIGRlZmF1bHRzIGhlcmU7IHRoZXkgY2FuIGJlIG92ZXJyaWRlbiB3aXRoCiAgKiB0aGUgcHJvcGVyIGluc21vZCBwYXJhbWV0ZXJzLgpAQCAtMzc1LDEzICsyOTIsNiBAQAogdWludDMyX3QgYWljNzl4eF9hbGxvd19tZW1pbyA9IH4wOwogCiAvKgotICogYWljNzl4eF9kZXRlY3QoKSBoYXMgYmVlbiBydW4sIHNvIHJlZ2lzdGVyIGFsbCBkZXZpY2UgYXJyaXZhbHMKLSAqIGltbWVkaWF0ZWx5IHdpdGggdGhlIHN5c3RlbSByYXRoZXIgdGhhbiBkZWZlcnJpbmcgdG8gdGhlIHNvcnRlZAotICogYXR0YWNobWVudCBwZXJmb3JtZWQgYnkgYWljNzl4eF9kZXRlY3QoKS4KLSAqLwotaW50IGFpYzc5eHhfZGV0ZWN0X2NvbXBsZXRlOwotCi0vKgogICogU28gdGhhdCB3ZSBjYW4gc2V0IGhvdyBsb25nIGVhY2ggZGV2aWNlIGlzIGdpdmVuIGFzIGEgc2VsZWN0aW9uIHRpbWVvdXQuCiAgKiBUaGUgdGFibGUgb2YgdmFsdWVzIGdvZXMgbGlrZSB0aGlzOgogICogICAwIC0gMjU2bXMKQEAgLTQxMiw3ICszMjIsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBZGFwdGVjIEFpYzc5MFggVTMyMCBTQ1NJIEhvc3QgQnVzIEFkYXB0ZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CiBNT0RVTEVfVkVSU0lPTihBSUM3OVhYX0RSSVZFUl9WRVJTSU9OKTsKLW1vZHVsZV9wYXJhbShhaWM3OXh4LCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW0oYWljNzl4eCwgY2hhcnAsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhaWM3OXh4LAogInBlcmlvZCBkZWxpbWl0ZWQsIG9wdGlvbnMgc3RyaW5nLlxuIgogIgl2ZXJib3NlCQkJRW5hYmxlIHZlcmJvc2UvZGlhZ25vc3RpYyBsb2dnaW5nXG4iCkBAIC00MjcsOCArMzM3LDYgQEAKICIJcmV2ZXJzZV9zY2FuCQlTb3J0IFBDSSBkZXZpY2VzIGhpZ2hlc3QgQnVzL1Nsb3QgdG8gbG93ZXN0XG4iCiAiCXRhZ19pbmZvOjx0YWdfc3RyPglTZXQgcGVyLXRhcmdldCB0YWcgZGVwdGhcbiIKICIJZ2xvYmFsX3RhZ19kZXB0aDo8aW50PglHbG9iYWwgdGFnIGRlcHRoIGZvciBhbGwgdGFyZ2V0cyBvbiBhbGwgYnVzZXNcbiIKLSIJcmRfc3RybTo8cmRfc3RybV9tYXNrcz4gU2V0IHBlci10YXJnZXQgcmVhZCBzdHJlYW1pbmcgc2V0dGluZy5cbiIKLSIJZHY6PGR2X3NldHRpbmdzPglTZXQgcGVyLWNvbnRyb2xsZXIgRG9tYWluIFZhbGlkYXRpb24gU2V0dGluZy5cbiIKICIJc2xld3JhdGU6PHNsZXdyYXRlX2xpc3Q+U2V0IHRoZSBzaWduYWwgc2xldyByYXRlICgwLTE1KS5cbiIKICIJcHJlY29tcDo8cGNvbXBfbGlzdD4JU2V0IHRoZSBzaWduYWwgcHJlY29tcGVuc2F0aW9uICgwLTcpLlxuIgogIglhbXBsaXR1ZGU6PGludD4JCVNldCB0aGUgc2lnbmFsIGFtcGxpdHVkZSAoMC03KS5cbiIKQEAgLTQ0MSwyNDkgKzM0OSwzNSBAQAogIgkJU2hvcnRlbiB0aGUgc2VsZWN0aW9uIHRpbWVvdXQgdG8gMTI4bXNcbiIKICJcbiIKICIJb3B0aW9ucyBhaWM3OXh4ICdhaWM3OXh4PXZlcmJvc2UudGFnX2luZm86e3t9Lnt9LnsuLjEwfX0uc2VsdGltZToxJ1xuIgotIlxuIgotIglTYW1wbGUgL2V0Yy9tb2Rwcm9iZS5jb25mIGxpbmU6XG4iCi0iCQlDaGFuZ2UgUmVhZCBTdHJlYW1pbmcgZm9yIENvbnRyb2xsZXIncyAyIGFuZCAzXG4iCi0iXG4iCi0iCW9wdGlvbnMgYWljNzl4eCAnYWljNzl4eD1yZF9zdHJtOnsuLjB4RkZGMC4weEMwRjB9JyIpOworIlxuIik7CiAKIHN0YXRpYyB2b2lkIGFoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqLAotCQkJCQkgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKiwKKwkJCQkJIHN0cnVjdCBzY3NpX2RldmljZSAqLAogCQkJCQkgc3RydWN0IHNjYiAqKTsKIHN0YXRpYyB2b2lkIGFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgU2NzaV9DbW5kICpjbWQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplKHVfbG9uZyBhcmcpOworCQkJCQkgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyB2b2lkIGFoZF9saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKK3N0YXRpYyBpbnQgIGFoZF9saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKTsKIHN0YXRpYyB2b2lkIGFoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfc2l6ZV9uc2VnKHZvaWQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKLXN0YXRpYyBpbnQgIGFoZF9saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfa2lsbF9kdl90aHJlYWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kdl90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YXJnZXQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJCQkgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAotCQkJICAgICB1X2ludCByZXF1ZXN0X2xlbmd0aCk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfdHVyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAotCQkJICAgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCSAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAotCQkJICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfcmViKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKTsKLXN0YXRpYyB2b2lkIGFoZF9saW51eF9kdl9zdShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJCSAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7Ci1zdGF0aWMgaW50IGFoZF9saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOwotc3RhdGljIF9faW5saW5lIGludCBhaGRfbGludXhfZHZfZmFsbGJhY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfY29tcGxldGUoU2NzaV9DbW5kICpjbWQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2dlbmVyYXRlX2R2X3BhdHRlcm4oc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOwogc3RhdGljIHVfaW50IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci1zdGF0aWMgdV9pbnQgYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldHVwX3VzZXJfcmRfc3RybV9zZXR0aW5ncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIHZvaWQgYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCoJYWhkX2xpbnV4X2FsbG9jX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjKiwKLQkJCQkJCSAgICAgICB1X2ludCwgdV9pbnQpOwotc3RhdGljIHZvaWQJCQlhaGRfbGludXhfZnJlZV90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyosCi0JCQkJCQkgICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCopOwotc3RhdGljIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKglhaGRfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMqLAotCQkJCQkJICAgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0KiwKLQkJCQkJCSAgICAgICB1X2ludCk7Ci1zdGF0aWMgdm9pZAkJCWFoZF9saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKik7Ci1zdGF0aWMgdm9pZCBhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjKiwKLQkJCQkgICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICopOworc3RhdGljIGludCBhaGRfbGludXhfcnVuX2NvbW1hbmQoc3RydWN0IGFoZF9zb2Z0YyosCisJCQkJIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICosCisJCQkJIHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKGNoYXIgKnApOwotc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGRfbGludXhfc2V0dXBfdGFnX2luZm87Ci1zdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm87Ci1zdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoZF9saW51eF9zZXR1cF9kdjsKLXN0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvOwotc3RhdGljIGludCBhaGRfbGludXhfbmV4dF91bml0KHZvaWQpOwotc3RhdGljIHZvaWQgYWhkX3J1bnFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIGludCBhaWM3OXh4X3NldHVwKGNoYXIgKmMpOworc3RhdGljIGludCAgYWljNzl4eF9zZXR1cChjaGFyICpjKTsKKworc3RhdGljIGludCBhaGRfbGludXhfdW5pdDsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElubGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NjaGVkdWxlX2NvbXBsZXRlcShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NjaGVkdWxlX3J1bnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zZXR1cF9ydW5xX3Rhc2tsZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF90ZWFyZG93bl9ydW5xX3Rhc2tsZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSoKLQkJICAgICBhaGRfbGludXhfZ2V0X2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGNoYW5uZWwsCi0JCQkJCSAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGludCBhbGxvYyk7Ci1zdGF0aWMgc3RydWN0IGFoZF9jbWQgKmFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saW51eF9jaGVja19kZXZpY2VfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkJICBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KTsKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqCi0JCSAgICAgYWhkX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGRfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7CiAKIHN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfUlVOX0NNUExUX1FfVElNRVIpID09IDApIHsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfUlVOX0NNUExUX1FfVElNRVI7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzOwotCQlhZGRfdGltZXIoJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKLQl9Ci19Ci0KLS8qCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIG91ciBsb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdGFza2xldF9zY2hlZHVsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5ydW5xX3Rhc2tsZXQpOwotfQotCi1zdGF0aWMgX19pbmxpbmUKLXZvaWQgYWhkX3NldHVwX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdGFza2xldF9pbml0KCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCwgYWhkX3J1bnFfdGFza2xldCwKLQkJICAgICAodW5zaWduZWQgbG9uZylhaGQpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3RlYXJkb3duX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdGFza2xldF9raWxsKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSoKLWFoZF9saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY2hhbm5lbCwgdV9pbnQgdGFyZ2V0LAotCQkgICAgIHVfaW50IGx1biwgaW50IGFsbG9jKQotewotCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOwotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JdV9pbnQgdGFyZ2V0X29mZnNldDsKLQotCXRhcmdldF9vZmZzZXQgPSB0YXJnZXQ7Ci0JaWYgKGNoYW5uZWwgIT0gMCkKLQkJdGFyZ2V0X29mZnNldCArPSA4OwotCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07Ci0JaWYgKHRhcmcgPT0gTlVMTCkgewotCQlpZiAoYWxsb2MgIT0gMCkgewotCQkJdGFyZyA9IGFoZF9saW51eF9hbGxvY190YXJnZXQoYWhkLCBjaGFubmVsLCB0YXJnZXQpOwotCQkJaWYgKHRhcmcgPT0gTlVMTCkKLQkJCQlyZXR1cm4gKE5VTEwpOwotCQl9IGVsc2UKLQkJCXJldHVybiAoTlVMTCk7Ci0JfQotCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKLQlpZiAoZGV2ID09IE5VTEwgJiYgYWxsb2MgIT0gMCkKLQkJZGV2ID0gYWhkX2xpbnV4X2FsbG9jX2RldmljZShhaGQsIHRhcmcsIGx1bik7Ci0JcmV0dXJuIChkZXYpOwotfQotCi0jZGVmaW5lIEFIRF9MSU5VWF9NQVhfUkVUVVJORURfRVJST1JTIDQKLXN0YXRpYyBzdHJ1Y3QgYWhkX2NtZCAqCi1haGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsJCi0Jc3RydWN0CWFoZF9jbWQgKmFjbWQ7Ci0JdV9sb25nCWRvbmVfZmxhZ3M7Ci0JaW50CXdpdGhfZXJyb3JzOwotCi0Jd2l0aF9lcnJvcnMgPSAwOwotCWFoZF9kb25lX2xvY2soYWhkLCAmZG9uZV9mbGFncyk7Ci0Jd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxKSkgIT0gTlVMTCkgewotCQlTY3NpX0NtbmQgKmNtZDsKLQotCQlpZiAod2l0aF9lcnJvcnMgPiBBSERfTElOVVhfTUFYX1JFVFVSTkVEX0VSUk9SUykgewotCQkJLyoKLQkJCSAqIExpbnV4IHVzZXMgc3RhY2sgcmVjdXJzaW9uIHRvIHJlcXVldWUKLQkJCSAqIGNvbW1hbmRzIHRoYXQgbmVlZCB0byBiZSByZXRyaWVkLiAgQXZvaWQKLQkJCSAqIGJsb3dpbmcgb3V0IHRoZSBzdGFjayBieSAic3Bvb24gZmVlZGluZyIKLQkJCSAqIGNvbW1hbmRzIHRoYXQgY29tcGxldGVkIHdpdGggZXJyb3IgYmFjawotCQkJICogdGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gY2FzZSB0aGV5IGFyZSBnb2luZwotCQkJICogdG8gYmUgcmV0cmllZC4gImljayIKLQkJCSAqLwotCQkJYWhkX3NjaGVkdWxlX2NvbXBsZXRlcShhaGQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJVEFJTFFfUkVNT1ZFKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcSwKLQkJCSAgICAgYWNtZCwgYWNtZF9saW5rcy50cWUpOwotCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKLQkJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKLQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpICE9IERJRF9PSwotCQkgfHwgKGNtZC0+cmVzdWx0ICYgMHhGRikgIT0gU0NTSV9TVEFUVVNfT0spCi0JCQl3aXRoX2Vycm9ycysrOwotCi0JCWNtZC0+c2NzaV9kb25lKGNtZCk7Ci0JfQotCWFoZF9kb25lX3VubG9jayhhaGQsICZkb25lX2ZsYWdzKTsKLQlyZXR1cm4gKGFjbWQpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCi17Ci0JaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9GUkVFWkVfVElMX0VNUFRZKSAhPSAwCi0JICYmIGRldi0+YWN0aXZlID09IDApIHsKLQkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9GUkVFWkVfVElMX0VNUFRZOwotCQlkZXYtPnFmcm96ZW4tLTsKLQl9Ci0KLQlpZiAoVEFJTFFfRklSU1QoJmRldi0+YnVzeXEpID09IE5VTEwKLQkgfHwgZGV2LT5vcGVuaW5ncyA9PSAwIHx8IGRldi0+cWZyb3plbiAhPSAwKQotCQlyZXR1cm47Ci0KLQlhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZShhaGQsIGRldik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqCi1haGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQkKLQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfUkVTT1VSQ0VfU0hPUlRBR0UpICE9IDAKLQkgfHwgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCi0JICAmJiBBSERfRFZfU0lNUV9GUk9aRU4oYWhkKSA9PSAwKSkKLQkJcmV0dXJuIChOVUxMKTsKLQlyZXR1cm4gKFRBSUxRX0ZJUlNUKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0KLQl3aGlsZSAoKGRldiA9IGFoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oYWhkKSkgIT0gTlVMTCkgewotCQlUQUlMUV9SRU1PVkUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOwotCQlkZXYtPmZsYWdzICY9IH5BSERfREVWX09OX1JVTl9MSVNUOwotCQlhaGRfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKGFoZCwgZGV2KTsKLQl9Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCiBhaGRfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQogewotCVNjc2lfQ21uZCAqY21kOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlpbnQgZGlyZWN0aW9uOwogCiAJY21kID0gc2NiLT5pb19jdHg7CkBAIC03MDUsMTk3ICszOTksNiBAQAogI2RlZmluZSBCVUlMRF9TQ1NJSUQoYWhkLCBjbWQpCQkJCQkJXAogCSgoKChjbWQpLT5kZXZpY2UtPmlkIDw8IFRJRF9TSElGVCkgJiBUSUQpIHwgKGFoZCktPm91cl9pZCkKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiAgSG9zdCB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7Ci1zdGF0aWMgY29uc3QgY2hhciAqYWhkX2xpbnV4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X3F1ZXVlKFNjc2lfQ21uZCAqLCB2b2lkICgqKShTY3NpX0NtbmQgKikpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X3NsYXZlX2FsbG9jKFNjc2lfRGV2aWNlICopOwotc3RhdGljIGludAkgICBhaGRfbGludXhfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICopOwotc3RhdGljIHZvaWQJICAgYWhkX2xpbnV4X3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKik7Ci0jaWYgZGVmaW5lZChfX2kzODZfXykKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlKiwgc2VjdG9yX3QsIGludFtdKTsKLSNlbmRpZgotI2Vsc2UKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKLXN0YXRpYyB2b2lkCSAgIGFoZF9saW51eF9zZWxlY3RfcXVldWVfZGVwdGgoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKLQkJCQkJCVNjc2lfRGV2aWNlICpzY3NpX2RldnMpOwotI2lmIGRlZmluZWQoX19pMzg2X18pCi1zdGF0aWMgaW50CSAgIGFoZF9saW51eF9iaW9zcGFyYW0oRGlzayAqLCBrZGV2X3QsIGludFtdKTsKLSNlbmRpZgotI2VuZGlmCi1zdGF0aWMgaW50CSAgIGFoZF9saW51eF9idXNfcmVzZXQoU2NzaV9DbW5kICopOwotc3RhdGljIGludAkgICBhaGRfbGludXhfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqKTsKLXN0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2Fib3J0KFNjc2lfQ21uZCAqKTsKLQotLyoKLSAqIENhbGN1bGF0ZSBhIHNhZmUgdmFsdWUgZm9yIEFIRF9OU0VHIChhcyBleHByZXNzZWQgdGhyb3VnaCBhaGRfbGludXhfbnNlZykuCi0gKgotICogSW4gcHJlLTIuNS5YLi4uCi0gKiBUaGUgbWlkbGF5ZXIgYWxsb2NhdGVzIGFuIFMvRyBhcnJheSBkeW5hbWljYWxseSB3aGVuIGEgY29tbWFuZCBpcyBpc3N1ZWQKLSAqIHVzaW5nIFNDU0kgbWFsbG9jLiAgVGhpcyBhcnJheSwgd2hpY2ggaXMgaW4gYW4gT1MgZGVwZW5kZW50IGZvcm1hdCB0aGF0Ci0gKiBtdXN0IGxhdGVyIGJlIGNvcGllZCB0byBvdXIgcHJpdmF0ZSBTL0cgbGlzdCwgaXMgc2l6ZWQgdG8gaG91c2UganVzdCB0aGUKLSAqIG51bWJlciBvZiBzZWdtZW50cyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IHRyYW5zZmVyLiAgU2luY2UgdGhlIGNvZGUgdGhhdAotICogc2l6ZXMgdGhlIFNDU0kgbWFsbG9jIHBvb2wgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gZnJhZ21lbnRhdGlvbgotICogb2YgdGhlIHBvb2wsIGV4ZWN1dGluZyB0cmFuc2FjdGlvbnMgbnVtYmVyaW5nIGp1c3QgYSBmcmFjdGlvbiBvZiBvdXIKLSAqIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb24gbGltaXQgd2l0aCBTRyBsaXN0IGxlbmd0aHMgYXByb2FjaGluZyBBSENfTlNFRyB3aWxsCi0gKiBxdWlja2x5IGRlcGxlYXQgdGhlIFNDU0kgbWFsbG9jIHBvb2wgb2YgdXNhYmxlIHNwYWNlLiAgVW5mb3J0dW5hdGVseSwgdGhlCi0gKiBtaWQtbGF5ZXIgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIHRoaXMgc2NzaSBtYWxsb2MgZmFpbHVyZXMgZm9yIHRoZSBTL0cKLSAqIGFycmF5IGFuZCB0aGUgcmVzdWx0IGNhbiBiZSBhIGxvY2t1cCBvZiB0aGUgSS9PIHN1YnN5c3RlbS4gIFdlIHRyeSB0byBzaXplCi0gKiBvdXIgUy9HIGxpc3Qgc28gdGhhdCBpdCBzYXRpc2ZpZXMgb3VyIGRyaXZlcnMgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgaW4KLSAqIGFkZGl0aW9uIHRvIGF2b2lkaW5nIGZyYWdtZW50YXRpb24gb2YgdGhlIFNDU0kgbWFsbG9jIHBvb2wuCi0gKi8KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2l6ZV9uc2VnKHZvaWQpCi17Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JdV9pbnQgY3VyX3NpemU7Ci0JdV9pbnQgYmVzdF9zaXplOwotCi0JLyoKLQkgKiBUaGUgU0NTSSBhbGxvY2F0b3Igcm91bmRzIHRvIHRoZSBuZWFyZXN0IDUxMiBieXRlcwotCSAqIGFuIGNhbm5vdCBhbGxvY2F0ZSBhY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAgT3VyIGFsZ29yaXRobQotCSAqIGlzIHRvIHN0YXJ0IGF0IDFLIG9mIHNjc2kgbWFsbG9jIHNwYWNlIHBlci1jb21tYW5kIGFuZAotCSAqIGxvb3AgdGhyb3VnaCBhbGwgZmFjdG9ycyBvZiB0aGUgUEFHRV9TSVpFIGFuZCBwaWNrIHRoZSBiZXN0LgotCSAqLwotCWJlc3Rfc2l6ZSA9IDA7Ci0JZm9yIChjdXJfc2l6ZSA9IDEwMjQ7IGN1cl9zaXplIDw9IFBBR0VfU0laRTsgY3VyX3NpemUgKj0gMikgewotCQl1X2ludCBuc2VnOwotCi0JCW5zZWcgPSBjdXJfc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOwotCQlpZiAobnNlZyA8IEFIRF9MSU5VWF9NSU5fTlNFRykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiZXN0X3NpemUgPT0gMCkgewotCQkJYmVzdF9zaXplID0gY3VyX3NpemU7Ci0JCQlhaGRfbGludXhfbnNlZyA9IG5zZWc7Ci0JCX0gZWxzZSB7Ci0JCQl1X2ludCBiZXN0X3JlbTsKLQkJCXVfaW50IGN1cl9yZW07Ci0KLQkJCS8qCi0JCQkgKiBDb21wYXJlIHRoZSB0cmFpdHMgb2YgdGhlIGN1cnJlbnQgImJlc3Rfc2l6ZSIKLQkJCSAqIHdpdGggdGhlIGN1cnJlbnQgc2l6ZSB0byBkZXRlcm1pbmUgaWYgdGhlCi0JCQkgKiBjdXJyZW50IHNpemUgaXMgYSBiZXR0ZXIgc2l6ZS4KLQkJCSAqLwotCQkJYmVzdF9yZW0gPSBiZXN0X3NpemUgJSBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKLQkJCWN1cl9yZW0gPSBjdXJfc2l6ZSAlIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOwotCQkJaWYgKGN1cl9yZW0gPCBiZXN0X3JlbSkgewotCQkJCWJlc3Rfc2l6ZSA9IGN1cl9zaXplOwotCQkJCWFoZF9saW51eF9uc2VnID0gbnNlZzsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotfQotCi0vKgotICogVHJ5IHRvIGRldGVjdCBhbiBBZGFwdGVjIDc5WFggY29udHJvbGxlci4KLSAqLwotc3RhdGljIGludAotYWhkX2xpbnV4X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRlbXBsYXRlKQotewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQlpbnQgICAgIGZvdW5kOwotCWludAllcnJvciA9IDA7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkvKgotCSAqIEl0IGlzIGEgYnVnIHRoYXQgdGhlIHVwcGVyIGxheWVyIHRha2VzCi0JICogdGhpcyBsb2NrIGp1c3QgcHJpb3IgdG8gY2FsbGluZyB1cy4KLQkgKi8KLQlzcGluX3VubG9ja19pcnEoJmlvX3JlcXVlc3RfbG9jayk7Ci0jZW5kaWYKLQotCS8qCi0JICogU2FuaXR5IGNoZWNraW5nIG9mIExpbnV4IFNDU0kgZGF0YSBzdHJ1Y3R1cmVzIHNvCi0JICogdGhhdCBzb21lIG9mIG91ciBoYWNrc15IXkheSF5IXkhhc3N1bXB0aW9ucyBhcmVuJ3QKLQkgKiB2aW9sYXRlZC4KLQkgKi8KLQlpZiAob2Zmc2V0b2Yoc3RydWN0IGFoZF9jbWRfaW50ZXJuYWwsIGVuZCkKLQkgID4gb2Zmc2V0b2Yoc3RydWN0IHNjc2lfY21uZCwgaG9zdF9zY3JpYmJsZSkpIHsKLQkJcHJpbnRmKCJhaGRfbGludXhfZGV0ZWN0OiBTQ1NJIGRhdGEgc3RydWN0dXJlcyBjaGFuZ2VkLlxuIik7Ci0JCXByaW50ZigiYWhkX2xpbnV4X2RldGVjdDogVW5hYmxlIHRvIGF0dGFjaFxuIik7Ci0JCXJldHVybiAoMCk7Ci0JfQotCS8qCi0JICogRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIHNpemUgZm9yIG91ciBTY2F0dGVyIEdhdHRoZXIgbGlzdHMuCi0JICovCi0JYWhkX2xpbnV4X3NpemVfbnNlZygpOwotI2lmZGVmIE1PRFVMRQotCS8qCi0JICogSWYgd2UndmUgYmVlbiBwYXNzZWQgYW55IHBhcmFtZXRlcnMsIHByb2Nlc3MgdGhlbSBub3cuCi0JICovCi0JaWYgKGFpYzc5eHgpCi0JCWFpYzc5eHhfc2V0dXAoYWljNzl4eCk7Ci0jZW5kaWYKLQotCXRlbXBsYXRlLT5wcm9jX25hbWUgPSAiYWljNzl4eCI7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgb3VyIHNvZnRjIGxpc3QgbG9jayBwcmlvciB0bwotCSAqIHByb2JpbmcgZm9yIGFueSBhZGFwdGVycy4KLQkgKi8KLQlhaGRfbGlzdF9sb2NraW5pdCgpOwotCi0jaWZkZWYgQ09ORklHX1BDSQotCWVycm9yID0gYWhkX2xpbnV4X3BjaV9pbml0KCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQotCS8qCi0JICogUmVnaXN0ZXIgd2l0aCB0aGUgU0NTSSBsYXllciBhbGwKLQkgKiBjb250cm9sbGVycyB3ZSd2ZSBmb3VuZC4KLQkgKi8KLQlmb3VuZCA9IDA7Ci0JVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7Ci0KLQkJaWYgKGFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KGFoZCwgdGVtcGxhdGUpID09IDApCi0JCQlmb3VuZCsrOwotCX0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlzcGluX2xvY2tfaXJxKCZpb19yZXF1ZXN0X2xvY2spOwotI2VuZGlmCi0JYWljNzl4eF9kZXRlY3RfY29tcGxldGUrKzsKLQlyZXR1cm4gMDsKLX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotLyoKLSAqIEZyZWUgdGhlIHBhc3NlZCBpbiBTY3NpX0hvc3QgbWVtb3J5IHN0cnVjdHVyZXMgcHJpb3IgdG8gdW5sb2FkaW5nIHRoZQotICogbW9kdWxlLgotICovCi1zdGF0aWMgaW50Ci1haGRfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7Ci0JdV9sb25nIGw7Ci0KLQlhaGRfbGlzdF9sb2NrKCZsKTsKLQlpZiAoaG9zdCAhPSBOVUxMKSB7Ci0KLQkJLyoKLQkJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCi0JCSAqIHRoZSBmcmVlIGRpcmVjdGx5LCBidXQgY2hlY2sgb3VyCi0JCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KLQkJICovCi0JCWFoZCA9IGFoZF9maW5kX3NvZnRjKCooc3RydWN0IGFoZF9zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSk7Ci0JCWlmIChhaGQgIT0gTlVMTCkgewotCQkJdV9sb25nIHM7Ci0KLQkJCWFoZF9sb2NrKGFoZCwgJnMpOwotCQkJYWhkX2ludHJfZW5hYmxlKGFoZCwgRkFMU0UpOwotCQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJCWFoZF9mcmVlKGFoZCk7Ci0JCX0KLQl9Ci0JYWhkX2xpc3RfdW5sb2NrKCZsKTsKLQlyZXR1cm4gKDApOwotfQotI2VuZGlmCi0KIC8qCiAgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZHJpdmVyLgogICovCkBAIC05MjgsMjIwICs0MzEsMTc3IEBACiAgKiBRdWV1ZSBhbiBTQ0IgdG8gdGhlIGNvbnRyb2xsZXIuCiAgKi8KIHN0YXRpYyBpbnQKLWFoZF9saW51eF9xdWV1ZShTY3NpX0NtbmQgKiBjbWQsIHZvaWQgKCpzY3NpX2RvbmUpIChTY3NpX0NtbmQgKikpCithaGRfbGludXhfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqIGNtZCwgdm9pZCAoKnNjc2lfZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7CiAJc3RydWN0CSBhaGRfc29mdGMgKmFoZDsKLQlzdHJ1Y3QJIGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQl1X2xvbmcJIGZsYWdzOworCXN0cnVjdAkgYWhkX2xpbnV4X2RldmljZSAqZGV2ID0gc2NzaV90cmFuc3BvcnRfZGV2aWNlX2RhdGEoY21kLT5kZXZpY2UpOwogCiAJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAogCS8qCi0JICogU2F2ZSB0aGUgY2FsbGJhY2sgb24gY29tcGxldGlvbiBmdW5jdGlvbi4KLQkgKi8KLQljbWQtPnNjc2lfZG9uZSA9IHNjc2lfZG9uZTsKLQotCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhkLCAmZmxhZ3MpOwotCi0JLyoKIAkgKiBDbG9zZSB0aGUgcmFjZSBvZiBhIGNvbW1hbmQgdGhhdCB3YXMgaW4gdGhlIHByb2Nlc3Mgb2YKIAkgKiBiZWluZyBxdWV1ZWQgdG8gdXMganVzdCBhcyBvdXIgc2ltcSB3YXMgZnJvemVuLiAgTGV0CiAJICogRFYgY29tbWFuZHMgdGhyb3VnaCBzbyBsb25nIGFzIHdlIGFyZSBvbmx5IGZyb3plbiB0bwogCSAqIHBlcmZvcm0gRFYuCiAJICovCi0JaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCi0JICYmIEFIRF9EVl9DTUQoY21kKSA9PSAwKSB7CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwKSB7CisJCXByaW50ZigiJXM6IHF1ZXVlIGZyb3plblxuIiwgYWhkX25hbWUoYWhkKSk7CiAKLQkJYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgQ0FNX1JFUVVFVUVfUkVRKTsKLQkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7Ci0JCWFoZF9zY2hlZHVsZV9jb21wbGV0ZXEoYWhkKTsKLQkJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CiAJfQotCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCi0JCQkJICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAotCQkJCSAgIC8qYWxsb2MqL1RSVUUpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kLCBDQU1fUkVTUkNfVU5BVkFJTCk7Ci0JCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOwotCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7Ci0JCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7Ci0JCXByaW50ZigiJXM6IGFpYzc5eHhfbGludXhfcXVldWUgLSBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIVxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAoY21kLT5jbWRfbGVuID4gTUFYX0NEQl9MRU4pCi0JCXJldHVybiAoLUVJTlZBTCk7CisKKwkvKgorCSAqIFNhdmUgdGhlIGNhbGxiYWNrIG9uIGNvbXBsZXRpb24gZnVuY3Rpb24uCisJICovCisJY21kLT5zY3NpX2RvbmUgPSBzY3NpX2RvbmU7CisKIAljbWQtPnJlc3VsdCA9IENBTV9SRVFfSU5QUk9HIDw8IDE2OwotCVRBSUxRX0lOU0VSVF9UQUlMKCZkZXYtPmJ1c3lxLCAoc3RydWN0IGFoZF9jbWQgKiljbWQsIGFjbWRfbGlua3MudHFlKTsKLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX09OX1JVTl9MSVNUKSA9PSAwKSB7Ci0JCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKLQkJZGV2LT5mbGFncyB8PSBBSERfREVWX09OX1JVTl9MSVNUOwotCQlhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoYWhkKTsKLQl9Ci0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLQlyZXR1cm4gKDApOworCisJcmV0dXJuIGFoZF9saW51eF9ydW5fY29tbWFuZChhaGQsIGRldiwgY21kKTsKIH0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLXN0YXRpYyBpbnQKLWFoZF9saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqZGV2aWNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV90YXJnZXQgKioKK2FoZF9saW51eF90YXJnZXRfaW5fc29mdGMoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQogewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQgPQorCQkqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWRldl90b19zaG9zdCgmc3RhcmdldC0+ZGV2KS0+aG9zdGRhdGEpOworCXVuc2lnbmVkIGludCB0YXJnZXRfb2Zmc2V0OwogCi0JYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilkZXZpY2UtPmhvc3QtPmhvc3RkYXRhKTsKLQlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IFNsYXZlIEFsbG9jICVkXG4iLCBhaGRfbmFtZShhaGQpLCBkZXZpY2UtPmlkKTsKLQlyZXR1cm4gKDApOworCXRhcmdldF9vZmZzZXQgPSBzdGFyZ2V0LT5pZDsKKwlpZiAoc3RhcmdldC0+Y2hhbm5lbCAhPSAwKQorCQl0YXJnZXRfb2Zmc2V0ICs9IDg7CisKKwlyZXR1cm4gJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFt0YXJnZXRfb2Zmc2V0XTsKIH0KIAogc3RhdGljIGludAotYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQorYWhkX2xpbnV4X3RhcmdldF9hbGxvYyhzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCiB7Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCXN0cnVjdAlhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JdV9sb25nCWZsYWdzOworCXN0cnVjdAlhaGRfc29mdGMgKmFoZCA9CisJCSooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2X3RvX3Nob3N0KCZzdGFyZ2V0LT5kZXYpLT5ob3N0ZGF0YSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKiphaGRfdGFyZ3AgPSBhaGRfbGludXhfdGFyZ2V0X2luX3NvZnRjKHN0YXJnZXQpOworCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJY2hhciBjaGFubmVsID0gc3RhcmdldC0+Y2hhbm5lbCArICdBJzsKIAotCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7Ci0JaWYgKGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoZF9uYW1lKGFoZCksIGRldmljZS0+aWQpOwotCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhkLCAmZmxhZ3MpOwotCS8qCi0JICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQotCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKLQkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KLQkgKi8KLQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmljZS0+Y2hhbm5lbCwKLQkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKLQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKLQlpZiAoZGV2ICE9IE5VTEwpIHsKLQkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9VTkNPTkZJR1VSRUQ7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9TTEFWRV9DT05GSUdVUkVEOwotCQlkZXYtPnNjc2lfZGV2aWNlID0gZGV2aWNlOwotCQlhaGRfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKGFoZCwgZGV2KTsKLQl9Ci0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7Ci0Jc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKLQl1X2xvbmcJZmxhZ3M7Ci0KLQlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOwotCWlmIChib290dmVyYm9zZSkKLQkJcHJpbnRmKCIlczogU2xhdmUgRGVzdHJveSAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZGV2aWNlLT5pZCk7Ci0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZmbGFncyk7Ci0JZGV2ID0gYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBkZXZpY2UtPmNoYW5uZWwsCi0JCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCi0JCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKLQotCS8qCi0JICogRmlsdGVyIG91dCAic2lsbHkiIGRlbGV0aW9ucyBvZiByZWFsIGRldmljZXMgYnkgb25seQotCSAqIGRlbGV0aW5nIGRldmljZXMgdGhhdCBoYXZlIGhhZCBzbGF2ZV9jb25maWd1cmUoKQotCSAqIGNhbGxlZCBvbiB0aGVtLiAgQWxsIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIG5vdAotCSAqIGJlZW4gY29uZmlndXJlZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZCBieQotCSAqIHRoZSByZWZjb3VudGluZyBwcm9jZXNzLgotCSAqLwotCWlmIChkZXYgIT0gTlVMTAotCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfU0xBVkVfQ09ORklHVVJFRCkgIT0gMCkgewotCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVU5DT05GSUdVUkVEOwotCQlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpCi0JCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCi0JCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSA9PSAwKQotCQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKGFoZCwgZGV2KTsKLQl9Ci0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLX0KLSNlbHNlCi0vKgotICogU2V0cyB0aGUgcXVldWUgZGVwdGggZm9yIGVhY2ggU0NTSSBkZXZpY2UgaGFuZ2luZwotICogb2ZmIHRoZSBpbnB1dCBob3N0IGFkYXB0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKiBob3N0LAotCQkJICAgICBTY3NpX0RldmljZSAqIHNjc2lfZGV2cykKLXsKLQlTY3NpX0RldmljZSAqZGV2aWNlOwotCVNjc2lfRGV2aWNlICpsZGV2OwotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcJZmxhZ3M7Ci0KLQlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKTsKIAlhaGRfbG9jayhhaGQsICZmbGFncyk7Ci0JZm9yIChkZXZpY2UgPSBzY3NpX2RldnM7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpIHsKIAotCQkvKgotCQkgKiBXYXRjaCBvdXQgZm9yIGR1cGxpY2F0ZSBkZXZpY2VzLiAgVGhpcyB3b3JrcyBhcm91bmQKLQkJICogc29tZSBxdWlya3MgaW4gaG93IHRoZSBTQ1NJIHNjYW5uaW5nIGNvZGUgZG9lcyBpdHMKLQkJICogZGV2aWNlIG1hbmFnZW1lbnQuCi0JCSAqLwotCQlmb3IgKGxkZXYgPSBzY3NpX2RldnM7IGxkZXYgIT0gZGV2aWNlOyBsZGV2ID0gbGRldi0+bmV4dCkgewotCQkJaWYgKGxkZXYtPmhvc3QgPT0gZGV2aWNlLT5ob3N0Ci0JCQkgJiYgbGRldi0+Y2hhbm5lbCA9PSBkZXZpY2UtPmNoYW5uZWwKLQkJCSAmJiBsZGV2LT5pZCA9PSBkZXZpY2UtPmlkCi0JCQkgJiYgbGRldi0+bHVuID09IGRldmljZS0+bHVuKQotCQkJCWJyZWFrOwotCQl9Ci0JCS8qIFNraXAgZHVwbGljYXRlLiAqLwotCQlpZiAobGRldiAhPSBkZXZpY2UpCi0JCQljb250aW51ZTsKKwlCVUdfT04oKmFoZF90YXJncCAhPSBOVUxMKTsKIAotCQlpZiAoZGV2aWNlLT5ob3N0ID09IGhvc3QpIHsKLQkJCXN0cnVjdAkgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCSphaGRfdGFyZ3AgPSBzdGFyZ2V0OworCW1lbXNldCh0YXJnLCAwLCBzaXplb2YoKnRhcmcpKTsKIAotCQkJLyoKLQkJCSAqIFNpbmNlIExpbnV4IGhhcyBhdHRhY2hlZCB0byB0aGUgZGV2aWNlLCBjb25maWd1cmUKLQkJCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKLQkJCSAqIHN0cnVjdHVyZSBvbiBldmVyeSBjb21tYW5kLgotCQkJICovCi0JCQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmljZS0+Y2hhbm5lbCwKLQkJCQkJCSAgIGRldmljZS0+aWQsIGRldmljZS0+bHVuLAotCQkJCQkJICAgLyphbGxvYyovVFJVRSk7Ci0JCQlpZiAoZGV2ICE9IE5VTEwpIHsKLQkJCQlkZXYtPmZsYWdzICY9IH5BSERfREVWX1VOQ09ORklHVVJFRDsKLQkJCQlkZXYtPnNjc2lfZGV2aWNlID0gZGV2aWNlOwotCQkJCWFoZF9saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoYWhkLCBkZXYpOwotCQkJCWRldmljZS0+cXVldWVfZGVwdGggPSBkZXYtPm9wZW5pbmdzCi0JCQkJCQkgICAgKyBkZXYtPmFjdGl2ZTsKLQkJCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX0JBU0lDCi0JCQkJCQl8IEFIRF9ERVZfUV9UQUdHRUQpKSA9PSAwKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFdlIGFsbG93IHRoZSBPUyB0byBxdWV1ZSAyIHVudGFnZ2VkCi0JCQkJCSAqIHRyYW5zYWN0aW9ucyB0byB1cyBhdCBhbnkgdGltZSBldmVuCi0JCQkJCSAqIHRob3VnaCB3ZSBjYW4gb25seSBleGVjdXRlIHRoZW0KLQkJCQkJICogc2VyaWFsbHkgb24gdGhlIGNvbnRyb2xsZXIvZGV2aWNlLgotCQkJCQkgKiBUaGlzIHNob3VsZCByZW1vdmUgc29tZSBsYXRlbmN5LgotCQkJCQkgKi8KLQkJCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IDI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGNoYW5uZWwsIGFoZC0+b3VyX2lkLAorCQkJCSAgICBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsIHN0YXJnZXQtPmlkLAorCQkJICAgIENBTV9MVU5fV0lMRENBUkQsIGNoYW5uZWwsCisJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCXNwaV9taW5fcGVyaW9kKHN0YXJnZXQpID0gQUhEX1NZTkNSQVRFX01BWDsgLyogV2UgY2FuIGRvIFUzMjAgKi8KKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQUNFRF9ORUdUQUJMRV9CVUcpICE9IDApCisJCXNwaV9tYXhfb2Zmc2V0KHN0YXJnZXQpID0gTUFYX09GRlNFVF9QQUNFRF9CVUc7CisJZWxzZQorCQlzcGlfbWF4X29mZnNldChzdGFyZ2V0KSA9IE1BWF9PRkZTRVRfUEFDRUQ7CisJc3BpX21heF93aWR0aChzdGFyZ2V0KSA9IGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERTsKKworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgMCwgMCwgMCwKKwkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCSAgICAgIEFIRF9UUkFOU19HT0FMLCAvKnBhdXNlZCovRkFMU0UpOwogCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKworc3RhdGljIHZvaWQKK2FoZF9saW51eF90YXJnZXRfZGVzdHJveShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICoqYWhkX3RhcmdwID0gYWhkX2xpbnV4X3RhcmdldF9pbl9zb2Z0YyhzdGFyZ2V0KTsKKworCSphaGRfdGFyZ3AgPSBOVUxMOworfQorCitzdGF0aWMgaW50CithaGRfbGludXhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZCA9CisJCSooKHN0cnVjdCBhaGRfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNkZXYtPnNkZXZfdGFyZ2V0OworCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU2xhdmUgQWxsb2MgJWRcbiIsIGFoZF9uYW1lKGFoZCksIHNkZXYtPmlkKTsKKworCUJVR19PTih0YXJnLT5zZGV2W3NkZXYtPmx1bl0gIT0gTlVMTCk7CisKKwlkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKKwltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOworCisJLyoKKwkgKiBXZSBzdGFydCBvdXQgbGlmZSB1c2luZyB1bnRhZ2dlZAorCSAqIHRyYW5zYWN0aW9ucyBvZiB3aGljaCB3ZSBhbGxvdyBvbmUuCisJICovCisJZGV2LT5vcGVuaW5ncyA9IDE7CisKKwkvKgorCSAqIFNldCBtYXh0YWdzIHRvIDAuICBUaGlzIHdpbGwgYmUgY2hhbmdlZCBpZiB3ZQorCSAqIGxhdGVyIGRldGVybWluZSB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGgKKwkgKiBhIHRhZ2dlZCBxdWV1aW5nIGNhcGFibGUgZGV2aWNlLgorCSAqLworCWRldi0+bWF4dGFncyA9IDA7CisJCisJdGFyZy0+c2RldltzZGV2LT5sdW5dID0gc2RldjsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU2xhdmUgQ29uZmlndXJlICVkXG4iLCBhaGRfbmFtZShhaGQpLCBzZGV2LT5pZCk7CisKKwlhaGRfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKHNkZXYpOworCisJLyogSW5pdGlhbCBEb21haW4gVmFsaWRhdGlvbiAqLworCWlmICghc3BpX2luaXRpYWxfZHYoc2Rldi0+c2Rldl90YXJnZXQpKQorCQlzcGlfZHZfZGV2aWNlKHNkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXN0cnVjdAlhaGRfbGludXhfZGV2aWNlICpkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKKwlzdHJ1Y3QgIGFoZF9saW51eF90YXJnZXQgKnRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzZGV2LT5zZGV2X3RhcmdldCk7CisKKwlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNkZXYtPmhvc3QtPmhvc3RkYXRhKTsKKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IFNsYXZlIERlc3Ryb3kgJWRcbiIsIGFoZF9uYW1lKGFoZCksIHNkZXYtPmlkKTsKKworCUJVR19PTihkZXYtPmFjdGl2ZSk7CisKKwl0YXJnLT5zZGV2W3NkZXYtPmx1bl0gPSBOVUxMOworCit9CiAKICNpZiBkZWZpbmVkKF9faTM4Nl9fKQogLyoKICAqIFJldHVybiB0aGUgZGlzayBnZW9tZXRyeSBmb3IgdGhlIGdpdmVuIFNDU0kgZGV2aWNlLgogICovCiBzdGF0aWMgaW50Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogYWhkX2xpbnV4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCSAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKIHsKIAl1aW50OF90ICpiaDsKLSNlbHNlCi1haGRfbGludXhfYmlvc3BhcmFtKERpc2sgKmRpc2ssIGtkZXZfdCBkZXYsIGludCBnZW9tW10pCi17Ci0Jc3RydWN0CXNjc2lfZGV2aWNlICpzZGV2ID0gZGlzay0+ZGV2aWNlOwotCXVfbG9uZwljYXBhY2l0eSA9IGRpc2stPmNhcGFjaXR5OwotCXN0cnVjdAlidWZmZXJfaGVhZCAqYmg7Ci0jZW5kaWYKIAlpbnQJIGhlYWRzOwogCWludAkgc2VjdG9yczsKIAlpbnQJIGN5bGluZGVyczsKQEAgLTExNTEsMjIgKzYxMSwxMSBAQAogCiAJYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJYmggPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOwotI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwxNykKLQliaCA9IGJyZWFkKE1LREVWKE1BSk9SKGRldiksIE1JTk9SKGRldikgJiB+MHhmKSwgMCwgYmxvY2tfc2l6ZShkZXYpKTsKLSNlbHNlCi0JYmggPSBicmVhZChNS0RFVihNQUpPUihkZXYpLCBNSU5PUihkZXYpICYgfjB4ZiksIDAsIDEwMjQpOwotI2VuZGlmCi0KIAlpZiAoYmgpIHsKIAkJcmV0ID0gc2NzaV9wYXJ0c2l6ZShiaCwgY2FwYWNpdHksCiAJCQkJICAgICZnZW9tWzJdLCAmZ2VvbVswXSwgJmdlb21bMV0pOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAkJa2ZyZWUoYmgpOwotI2Vsc2UKLQkJYnJlbHNlKGJoKTsKLSNlbmRpZgogCQlpZiAocmV0ICE9IC0xKQogCQkJcmV0dXJuIChyZXQpOwogCX0KQEAgLTExOTQsMTcgKzY0MywxNDE5IEBACiAgKiBBYm9ydCB0aGUgY3VycmVudCBTQ1NJIGNvbW1hbmQocykuCiAgKi8KIHN0YXRpYyBpbnQKLWFoZF9saW51eF9hYm9ydChTY3NpX0NtbmQgKmNtZCkKK2FoZF9saW51eF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGRfbGludXhfcXVldWVfcmVjb3ZlcnlfY21kKGNtZCwgU0NCX0FCT1JUKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcHJpbnRmKCJhaWM3OXh4X2Fib3J0IHJldHVybnMgMHgleFxuIiwgZXJyb3IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gc2VuZCBhIHRhcmdldCByZXNldCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgdGhhdCB0aW1lZCBvdXQuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9saW51eF9kZXZfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYWhkX2xpbnV4X3F1ZXVlX3JlY292ZXJ5X2NtZChjbWQsIFNDQl9ERVZJQ0VfUkVTRVQpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGYoImFpYzc5eHhfZGV2X3Jlc2V0IHJldHVybnMgMHgleFxuIiwgZXJyb3IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJlc2V0IHRoZSBTQ1NJIGJ1cy4KKyAqLworc3RhdGljIGludAorYWhkX2xpbnV4X2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwotCXN0cnVjdCBhaGRfY21kICphY21kOwotCXN0cnVjdCBhaGRfY21kICpsaXN0X2FjbWQ7CisJdV9sb25nIHM7CisJaW50ICAgIGZvdW5kOworCisJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKQorCQlwcmludGYoIiVzOiBCdXMgcmVzZXQgY2FsbGVkIGZvciBjbWQgJXBcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQpOworI2VuZGlmCisJYWhkX2xvY2soYWhkLCAmcyk7CisJZm91bmQgPSBhaGRfcmVzZXRfY2hhbm5lbChhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCSAgLyppbml0aWF0ZSByZXNldCovVFJVRSk7CisJYWhkX3VubG9jayhhaGQsICZzKTsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU0NTSSBidXMgcmVzZXQgZGVsaXZlcmVkLiAiCisJCSAgICAgICAiJWQgU0NCcyBhYm9ydGVkLlxuIiwgYWhkX25hbWUoYWhkKSwgZm91bmQpOworCisJcmV0dXJuIChTVUNDRVNTKTsKK30KKworc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImFpYzc5eHgiLAorCS5wcm9jX25hbWUJCT0gImFpYzc5eHgiLAorCS5wcm9jX2luZm8JCT0gYWhkX2xpbnV4X3Byb2NfaW5mbywKKwkuaW5mbwkJCT0gYWhkX2xpbnV4X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhaGRfbGludXhfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGRfbGludXhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWhkX2xpbnV4X2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhaGRfbGludXhfYnVzX3Jlc2V0LAorI2lmIGRlZmluZWQoX19pMzg2X18pCisJLmJpb3NfcGFyYW0JCT0gYWhkX2xpbnV4X2Jpb3NwYXJhbSwKKyNlbmRpZgorCS5jYW5fcXVldWUJCT0gQUhEX01BWF9RVUVVRSwKKwkudGhpc19pZAkJPSAtMSwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNsYXZlX2FsbG9jCQk9IGFoZF9saW51eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBhaGRfbGludXhfc2xhdmVfZGVzdHJveSwKKwkudGFyZ2V0X2FsbG9jCQk9IGFoZF9saW51eF90YXJnZXRfYWxsb2MsCisJLnRhcmdldF9kZXN0cm95CQk9IGFoZF9saW51eF90YXJnZXRfZGVzdHJveSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCdXMgRE1BICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2FoZF9kbWFfdGFnX2NyZWF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgcGFyZW50LAorCQkgICBidXNfc2l6ZV90IGFsaWdubWVudCwgYnVzX3NpemVfdCBib3VuZGFyeSwKKwkJICAgZG1hX2FkZHJfdCBsb3dhZGRyLCBkbWFfYWRkcl90IGhpZ2hhZGRyLAorCQkgICBidXNfZG1hX2ZpbHRlcl90ICpmaWx0ZXIsIHZvaWQgKmZpbHRlcmFyZywKKwkJICAgYnVzX3NpemVfdCBtYXhzaXplLCBpbnQgbnNlZ21lbnRzLAorCQkgICBidXNfc2l6ZV90IG1heHNlZ3N6LCBpbnQgZmxhZ3MsIGJ1c19kbWFfdGFnX3QgKnJldF90YWcpCit7CisJYnVzX2RtYV90YWdfdCBkbWF0OworCisJZG1hdCA9IG1hbGxvYyhzaXplb2YoKmRtYXQpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChkbWF0ID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKworCS8qCisJICogTGludXggaXMgdmVyeSBzaW1wbGlzdGljIGFib3V0IERNQSBtZW1vcnkuICBGb3Igbm93IGRvbid0CisJICogbWFpbnRhaW4gYWxsIHNwZWNpZmljYXRpb24gaW5mb3JtYXRpb24uICBPbmNlIExpbnV4IHN1cHBsaWVzCisJICogYmV0dGVyIGZhY2lsaXRpZXMgZm9yIGRvaW5nIHRoZXNlIG9wZXJhdGlvbnMsIG9yIHRoZQorCSAqIG5lZWRzIG9mIHRoaXMgcGFydGljdWxhciBkcml2ZXIgY2hhbmdlLCB3ZSBtaWdodCBuZWVkIHRvIGRvCisJICogbW9yZSBoZXJlLgorCSAqLworCWRtYXQtPmFsaWdubWVudCA9IGFsaWdubWVudDsKKwlkbWF0LT5ib3VuZGFyeSA9IGJvdW5kYXJ5OworCWRtYXQtPm1heHNpemUgPSBtYXhzaXplOworCSpyZXRfdGFnID0gZG1hdDsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCithaGRfZG1hX3RhZ19kZXN0cm95KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0KQoreworCWZyZWUoZG1hdCwgTV9ERVZCVUYpOworfQorCitpbnQKK2FoZF9kbWFtZW1fYWxsb2Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIHZvaWQqKiB2YWRkciwKKwkJIGludCBmbGFncywgYnVzX2RtYW1hcF90ICptYXBwKQoreworCSp2YWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFoZC0+ZGV2X3NvZnRjLAorCQkJCSAgICAgIGRtYXQtPm1heHNpemUsIG1hcHApOworCWlmICgqdmFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCXJldHVybigwKTsKK30KKwordm9pZAorYWhkX2RtYW1lbV9mcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0LAorCQl2b2lkKiB2YWRkciwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFoZC0+ZGV2X3NvZnRjLCBkbWF0LT5tYXhzaXplLAorCQkJICAgIHZhZGRyLCBtYXApOworfQorCitpbnQKK2FoZF9kbWFtYXBfbG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkJdm9pZCAqYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgYnVzX2RtYW1hcF9jYWxsYmFja190ICpjYiwKKwkJdm9pZCAqY2JfYXJnLCBpbnQgZmxhZ3MpCit7CisJLyoKKwkgKiBBc3N1bWUgZm9yIG5vdyB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIHVzZWQgZHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24gYW5kIG5vdCBmb3IgcGVyLXRyYW5zYWN0aW9uIGJ1ZmZlciBtYXBwaW5nLgorCSAqLworCWJ1c19kbWFfc2VnbWVudF90IHN0YWNrX3NnOworCisJc3RhY2tfc2cuZHNfYWRkciA9IG1hcDsKKwlzdGFja19zZy5kc19sZW4gPSBkbWF0LT5tYXhzaXplOworCWNiKGNiX2FyZywgJnN0YWNrX3NnLCAvKm5zZWcqLzEsIC8qZXJyb3IqLzApOworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9kbWFtYXBfZGVzdHJveShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKK30KKworaW50CithaGRfZG1hbWFwX3VubG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBQbGF0Zm9ybSBEZXBlbmRlbnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDb21wYXJlICJsZWZ0IGhhbmQiIHNvZnRjIHdpdGggInJpZ2h0IGhhbmQiIHNvZnRjLCByZXR1cm5pbmc6CisgKiA8IDAgLSBsYWhkIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gcmFoZAorICogICAwIC0gU29mdGNzIGFyZSBlcXVhbAorICogPiAwIC0gbGFoZCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiByYWhkCisgKi8KK2ludAorYWhkX3NvZnRjX2NvbXAoc3RydWN0IGFoZF9zb2Z0YyAqbGFoZCwgc3RydWN0IGFoZF9zb2Z0YyAqcmFoZCkKK3sKKwlpbnQJdmFsdWU7CisKKwkvKgorCSAqIFVuZGVyIExpbnV4LCBjYXJkcyBhcmUgb3JkZXJlZCBhcyBmb2xsb3dzOgorCSAqCTEpIFBDSSBkZXZpY2VzIHRoYXQgYXJlIG1hcmtlZCBhcyB0aGUgYm9vdCBjb250cm9sbGVyLgorCSAqCTIpIFBDSSBkZXZpY2VzIHdpdGggQklPUyBlbmFibGVkIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgorCSAqCTMpIEFsbCByZW1haW5pbmcgUENJIGRldmljZXMgc29ydGVkIGJ5IGJ1cy9zbG90L2Z1bmMuCisJICovCisjaWYgMAorCXZhbHVlID0gKGxhaGQtPmZsYWdzICYgQUhEX0JPT1RfQ0hBTk5FTCkKKwkgICAgICAtIChyYWhkLT5mbGFncyAmIEFIRF9CT09UX0NIQU5ORUwpOworCWlmICh2YWx1ZSAhPSAwKQorCQkvKiBDb250cm9sbGVycyBzZXQgZm9yIGJvb3QgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCisJCXJldHVybiAodmFsdWUpOworI2VuZGlmCisKKwl2YWx1ZSA9IChsYWhkLT5mbGFncyAmIEFIRF9CSU9TX0VOQUJMRUQpCisJICAgICAgLSAocmFoZC0+ZmxhZ3MgJiBBSERfQklPU19FTkFCTEVEKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJLyogQ29udHJvbGxlcnMgd2l0aCBCSU9TIGVuYWJsZWQgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCisJCXJldHVybiAodmFsdWUpOworCisJLyogU3RpbGwgZXF1YWwuICBTb3J0IGJ5IGJ1cy9zbG90L2Z1bmMuICovCisJaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCisJCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKGxhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMocmFoZC0+ZGV2X3NvZnRjKTsKKwllbHNlCisJCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKHJhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMobGFoZC0+ZGV2X3NvZnRjKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJcmV0dXJuICh2YWx1ZSk7CisJaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCisJCXZhbHVlID0gYWhkX2dldF9wY2lfc2xvdChsYWhkLT5kZXZfc29mdGMpCisJCSAgICAgIC0gYWhkX2dldF9wY2lfc2xvdChyYWhkLT5kZXZfc29mdGMpOworCWVsc2UKKwkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9zbG90KHJhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9zbG90KGxhaGQtPmRldl9zb2Z0Yyk7CisJaWYgKHZhbHVlICE9IDApCisJCXJldHVybiAodmFsdWUpOworCisJdmFsdWUgPSByYWhkLT5jaGFubmVsIC0gbGFoZC0+Y2hhbm5lbDsKKwlyZXR1cm4gKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF9pb2NlbGxfaW5mbyh1X2xvbmcgaW5kZXgsIGludCBpbnN0YW5jZSwgaW50IHRhcmcsIGludDMyX3QgdmFsdWUpCit7CisKKwlpZiAoKGluc3RhbmNlID49IDApCisJICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2lvY2VsbF9pbmZvKSkpIHsKKwkJdWludDhfdCAqaW9jZWxsX2luZm87CisKKwkJaW9jZWxsX2luZm8gPSAodWludDhfdCopJmFpYzc5eHhfaW9jZWxsX2luZm9baW5zdGFuY2VdOworCQlpb2NlbGxfaW5mb1tpbmRleF0gPSB2YWx1ZSAmIDB4RkZGRjsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCJpb2NlbGxbJWQ6JWxkXSA9ICVkXG4iLCBpbnN0YW5jZSwgaW5kZXgsIHZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKGNoYXIgKnApCit7CisJaW50IHRhZ3MsIGksIGo7CisKKwl0YWdzID0gc2ltcGxlX3N0cnRvdWwocCArIDEsIE5VTEwsIDApICYgMHhmZjsKKwlwcmludGYoIlNldHRpbmcgR2xvYmFsIFRhZ3M9ICVkXG4iLCB0YWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbyk7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgQUhEX05VTV9UQVJHRVRTOyBqKyspIHsKKwkJCWFpYzc5eHhfdGFnX2luZm9baV0udGFnX2NvbW1hbmRzW2pdID0gdGFnczsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF90YWdfaW5mbyh1X2xvbmcgYXJnLCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKSAmJiAodGFyZyA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpCisJICYmICh0YXJnIDwgQUhEX05VTV9UQVJHRVRTKSkgeworCQlhaWM3OXh4X3RhZ19pbmZvW2luc3RhbmNlXS50YWdfY29tbWFuZHNbdGFyZ10gPSB2YWx1ZSAmIDB4MUZGOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOworCX0KK30KKworc3RhdGljIGNoYXIgKgorYWhkX3BhcnNlX2JyYWNlX29wdGlvbihjaGFyICpvcHRfbmFtZSwgY2hhciAqb3B0X2FyZywgY2hhciAqZW5kLCBpbnQgZGVwdGgsCisJCSAgICAgICB2b2lkICgqY2FsbGJhY2spKHVfbG9uZywgaW50LCBpbnQsIGludDMyX3QpLAorCQkgICAgICAgdV9sb25nIGNhbGxiYWNrX2FyZykKK3sKKwljaGFyCSp0b2tfZW5kOworCWNoYXIJKnRva19lbmQyOworCWludCAgICAgIGk7CisJaW50ICAgICAgaW5zdGFuY2U7CisJaW50CSB0YXJnOworCWludAkgZG9uZTsKKwljaGFyCSB0b2tfbGlzdFtdID0geycuJywgJywnLCAneycsICd9JywgJ1wwJ307CisKKwkvKiBBbGwgb3B0aW9ucyB1c2UgYSAnOicgbmFtZS9hcmcgc2VwYXJhdG9yICovCisJaWYgKCpvcHRfYXJnICE9ICc6JykKKwkJcmV0dXJuIChvcHRfYXJnKTsKKwlvcHRfYXJnKys7CisJaW5zdGFuY2UgPSAtMTsKKwl0YXJnID0gLTE7CisJZG9uZSA9IEZBTFNFOworCS8qCisJICogUmVzdG9yZSBzZXBhcmF0b3IgdGhhdCBtYXkgYmUgaW4KKwkgKiB0aGUgbWlkZGxlIG9mIG91ciBvcHRpb24gYXJndW1lbnQuCisJICovCisJdG9rX2VuZCA9IHN0cmNocihvcHRfYXJnLCAnXDAnKTsKKwlpZiAodG9rX2VuZCA8IGVuZCkKKwkJKnRva19lbmQgPSAnLCc7CisJd2hpbGUgKCFkb25lKSB7CisJCXN3aXRjaCAoKm9wdF9hcmcpIHsKKwkJY2FzZSAneyc6CisJCQlpZiAoaW5zdGFuY2UgPT0gLTEpIHsKKwkJCQlpbnN0YW5jZSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZXB0aCA+IDEpIHsKKwkJCQkJaWYgKHRhcmcgPT0gLTEpCisJCQkJCQl0YXJnID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIk1hbGZvcm1lZCBPcHRpb24gJXNcbiIsCisJCQkJCSAgICAgICBvcHRfbmFtZSk7CisJCQkJCWRvbmUgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICd9JzoKKwkJCWlmICh0YXJnICE9IC0xKQorCQkJCXRhcmcgPSAtMTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlICE9IC0xKQorCQkJCWluc3RhbmNlID0gLTE7CisJCQlvcHRfYXJnKys7CisJCQlicmVhazsKKwkJY2FzZSAnLCc6CisJCWNhc2UgJy4nOgorCQkJaWYgKGluc3RhbmNlID09IC0xKQorCQkJCWRvbmUgPSBUUlVFOworCQkJZWxzZSBpZiAodGFyZyA+PSAwKQorCQkJCXRhcmcrKzsKKwkJCWVsc2UgaWYgKGluc3RhbmNlID49IDApCisJCQkJaW5zdGFuY2UrKzsKKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlkb25lID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG9rX2VuZCA9IGVuZDsKKwkJCWZvciAoaSA9IDA7IHRva19saXN0W2ldOyBpKyspIHsKKwkJCQl0b2tfZW5kMiA9IHN0cmNocihvcHRfYXJnLCB0b2tfbGlzdFtpXSk7CisJCQkJaWYgKCh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkpCisJCQkJCXRva19lbmQgPSB0b2tfZW5kMjsKKwkJCX0KKwkJCWNhbGxiYWNrKGNhbGxiYWNrX2FyZywgaW5zdGFuY2UsIHRhcmcsCisJCQkJIHNpbXBsZV9zdHJ0b2wob3B0X2FyZywgTlVMTCwgMCkpOworCQkJb3B0X2FyZyA9IHRva19lbmQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKG9wdF9hcmcpOworfQorCisvKgorICogSGFuZGxlIExpbnV4IGJvb3QgcGFyYW1ldGVycy4gVGhpcyByb3V0aW5lIGFsbG93cyBmb3IgYXNzaWduaW5nIGEgdmFsdWUKKyAqIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCisgKiBpZS4gYWljNzl4eD1zdHB3bGV2OjEsZXh0ZW5kZWQKKyAqLworc3RhdGljIGludAorYWljNzl4eF9zZXR1cChjaGFyICpzKQoreworCWludAlpLCBuOworCWNoYXIgICAqcDsKKwljaGFyICAgKmVuZDsKKworCXN0YXRpYyBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpuYW1lOworCQl1aW50MzJfdCAqZmxhZzsKKwl9IG9wdGlvbnNbXSA9IHsKKwkJeyAiZXh0ZW5kZWQiLCAmYWljNzl4eF9leHRlbmRlZCB9LAorCQl7ICJub19yZXNldCIsICZhaWM3OXh4X25vX3Jlc2V0IH0sCisJCXsgInZlcmJvc2UiLCAmYWljNzl4eF92ZXJib3NlIH0sCisJCXsgImFsbG93X21lbWlvIiwgJmFpYzc5eHhfYWxsb3dfbWVtaW99LAorI2lmZGVmIEFIRF9ERUJVRworCQl7ICJkZWJ1ZyIsICZhaGRfZGVidWcgfSwKKyNlbmRpZgorCQl7ICJyZXZlcnNlX3NjYW4iLCAmYWljNzl4eF9yZXZlcnNlX3NjYW4gfSwKKwkJeyAicGVyaW9kaWNfb3RhZyIsICZhaWM3OXh4X3BlcmlvZGljX290YWcgfSwKKwkJeyAicGNpX3Bhcml0eSIsICZhaWM3OXh4X3BjaV9wYXJpdHkgfSwKKwkJeyAic2VsdGltZSIsICZhaWM3OXh4X3NlbHRpbWUgfSwKKwkJeyAidGFnX2luZm8iLCBOVUxMIH0sCisJCXsgImdsb2JhbF90YWdfZGVwdGgiLCBOVUxMfSwKKwkJeyAic2xld3JhdGUiLCBOVUxMIH0sCisJCXsgInByZWNvbXAiLCBOVUxMIH0sCisJCXsgImFtcGxpdHVkZSIsIE5VTEwgfSwKKwl9OworCisJZW5kID0gc3RyY2hyKHMsICdcMCcpOworCisJLyoKKwkgKiBYWFggaWE2NCBnY2MgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBOVU1fRUxFTUVOVFMKKwkgKiB3aWxsIG5ldmVyIGJlIDAgaW4gdGhpcyBjYXNlLgorCSAqLyAgICAgIAorCW4gPSAwOyAgCisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJnMsICIsLiIpKSAhPSBOVUxMKSB7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMob3B0aW9ucyk7IGkrKykgeworCisJCQluID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm5hbWUsIHAsIG4pID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gTlVNX0VMRU1FTlRTKG9wdGlvbnMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cm5jbXAocCwgImdsb2JhbF90YWdfZGVwdGgiLCBuKSA9PSAwKSB7CisJCQlhaGRfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKHAgKyBuKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ0YWdfaW5mbyIsIG4pID09IDApIHsKKwkJCXMgPSBhaGRfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCisJCQkgICAgMiwgYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJzbGV3cmF0ZSIsIG4pID09IDApIHsKKwkJCXMgPSBhaGRfcGFyc2VfYnJhY2Vfb3B0aW9uKCJzbGV3cmF0ZSIsCisJCQkgICAgcCArIG4sIGVuZCwgMSwgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvLAorCQkJICAgIEFJQzc5WFhfU0xFV1JBVEVfSU5ERVgpOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInByZWNvbXAiLCBuKSA9PSAwKSB7CisJCQlzID0gYWhkX3BhcnNlX2JyYWNlX29wdGlvbigicHJlY29tcCIsCisJCQkgICAgcCArIG4sIGVuZCwgMSwgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvLAorCQkJICAgIEFJQzc5WFhfUFJFQ09NUF9JTkRFWCk7CisJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAiYW1wbGl0dWRlIiwgbikgPT0gMCkgeworCQkJcyA9IGFoZF9wYXJzZV9icmFjZV9vcHRpb24oImFtcGxpdHVkZSIsCisJCQkgICAgcCArIG4sIGVuZCwgMSwgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvLAorCQkJICAgIEFJQzc5WFhfQU1QTElUVURFX0lOREVYKTsKKwkJfSBlbHNlIGlmIChwW25dID09ICc6JykgeworCQkJKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChwLCAidmVyYm9zZSIsIG4pKSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgPSAxOworCQl9IGVsc2UgeworCQkJKihvcHRpb25zW2ldLmZsYWcpIF49IDB4RkZGRkZGRkY7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFpYzc5eHg9IiwgYWljNzl4eF9zZXR1cCk7CisKK3VpbnQzMl90IGFpYzc5eHhfdmVyYm9zZTsKKworaW50CithaGRfbGludXhfcmVnaXN0ZXJfaG9zdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRlbXBsYXRlKQoreworCWNoYXIJYnVmWzgwXTsKKwlzdHJ1Y3QJU2NzaV9Ib3N0ICpob3N0OworCWNoYXIJKm5ld19uYW1lOworCXVfbG9uZwlzOworCisJdGVtcGxhdGUtPm5hbWUgPSBhaGQtPmRlc2NyaXB0aW9uOworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYWhkX3NvZnRjICopKTsKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKSA9IGFoZDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlzY3NpX2Fzc2lnbl9sb2NrKGhvc3QsICZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0ID0gaG9zdDsKKwlob3N0LT5jYW5fcXVldWUgPSBBSERfTUFYX1FVRVVFOworCWhvc3QtPmNtZF9wZXJfbHVuID0gMjsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBBSERfTlNFRzsKKwlob3N0LT50aGlzX2lkID0gYWhkLT5vdXJfaWQ7CisJaG9zdC0+aXJxID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnE7CisJaG9zdC0+bWF4X2lkID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNiA6IDg7CisJaG9zdC0+bWF4X2x1biA9IEFIRF9OVU1fTFVOUzsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJaG9zdC0+c2dfdGFibGVzaXplID0gQUhEX05TRUc7CisJYWhkX3NldF91bml0KGFoZCwgYWhkX2xpbnV4X3VuaXQrKyk7CisJc3ByaW50ZihidWYsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKKwluZXdfbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKG5ld19uYW1lICE9IE5VTEwpIHsKKwkJc3RyY3B5KG5ld19uYW1lLCBidWYpOworCQlhaGRfc2V0X25hbWUoYWhkLCBuZXdfbmFtZSk7CisJfQorCWhvc3QtPnVuaXF1ZV9pZCA9IGFoZC0+dW5pdDsKKwlhaGRfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGQpOworCWFoZF9pbnRyX2VuYWJsZShhaGQsIFRSVUUpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisKKwlob3N0LT50cmFuc3BvcnR0ID0gYWhkX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZTsKKworCXNjc2lfYWRkX2hvc3QoaG9zdCwgJmFoZC0+ZGV2X3NvZnRjLT5kZXYpOyAvKiBYWFggaGFuZGxlIGZhaWx1cmUgKi8KKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwlyZXR1cm4gKDApOworfQorCit1aW50NjRfdAorYWhkX2xpbnV4X2dldF9tZW1zaXplKHZvaWQpCit7CisJc3RydWN0IHN5c2luZm8gc2k7CisKKwlzaV9tZW1pbmZvKCZzaSk7CisJcmV0dXJuICgodWludDY0X3Qpc2kudG90YWxyYW0gPDwgUEFHRV9TSElGVCk7Cit9CisKKy8qCisgKiBQbGFjZSB0aGUgU0NTSSBidXMgaW50byBhIGtub3duIHN0YXRlIGJ5IGVpdGhlciByZXNldHRpbmcgaXQsCisgKiBvciBmb3JjaW5nIHRyYW5zZmVyIG5lZ290aWF0aW9ucyBvbiB0aGUgbmV4dCBjb21tYW5kIHRvIGFueQorICogdGFyZ2V0LgorICovCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IHRhcmdldF9pZDsKKwl1X2ludCBudW10YXJnOworCisJdGFyZ2V0X2lkID0gMDsKKwludW10YXJnID0gMDsKKworCWlmIChhaWM3OXh4X25vX3Jlc2V0ICE9IDApCisJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9SRVNFVF9CVVNfQTsKKworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9SRVNFVF9CVVNfQSkgIT0gMCkKKwkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qaW5pdGlhdGVfcmVzZXQqL1RSVUUpOworCWVsc2UKKwkJbnVtdGFyZyA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTYgOiA4OworCisJLyoKKwkgKiBGb3JjZSBuZWdvdGlhdGlvbiB0byBhc3luYyBmb3IgYWxsIHRhcmdldHMgdGhhdAorCSAqIHdpbGwgbm90IHNlZSBhbiBpbml0aWFsIGJ1cyByZXNldC4KKwkgKi8KKwlmb3IgKDsgdGFyZ2V0X2lkIDwgbnVtdGFyZzsgdGFyZ2V0X2lkKyspIHsKKwkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgdGFyZ2V0X2lkLCAmdHN0YXRlKTsKKwkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsIHRhcmdldF9pZCwKKwkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCAmZGV2aW5mbywgdHN0YXRlLAorCQkJCSAgICAgICB0aW5mbywgQUhEX05FR19BTFdBWVMpOworCX0KKwkvKiBHaXZlIHRoZSBidXMgc29tZSB0aW1lIHRvIHJlY292ZXIgKi8KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfUkVTRVRfQlVTX0EpICE9IDApIHsKKwkJYWhkX2ZyZWV6ZV9zaW1xKGFoZCk7CisJCWluaXRfdGltZXIoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmRhdGEgPSAodV9sb25nKWFoZDsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5leHBpcmVzID0KKwkJICAgIGppZmZpZXMgKyAoQUlDNzlYWF9SRVNFVF9ERUxBWSAqIEhaKS8xMDAwOworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmZ1bmN0aW9uID0KKwkJICAgIChhaGRfbGludXhfY2FsbGJhY2tfdCAqKWFoZF9yZWxlYXNlX3NpbXE7CisJCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7CisJfQorfQorCitpbnQKK2FoZF9wbGF0Zm9ybV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHZvaWQgKnBsYXRmb3JtX2FyZykKK3sKKwlhaGQtPnBsYXRmb3JtX2RhdGEgPQorCSAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaGRfcGxhdGZvcm1fZGF0YSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJbWVtc2V0KGFoZC0+cGxhdGZvcm1fZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhaGRfcGxhdGZvcm1fZGF0YSkpOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxID0gQUhEX0xJTlVYX05PSVJROworCWFoZF9sb2NraW5pdChhaGQpOworCWluaXRfTVVURVhfTE9DS0VEKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJYWhkLT5zZWx0aW1lID0gKGFpYzc5eHhfc2VsdGltZSAmIDB4MykgPDwgNDsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCithaGRfcGxhdGZvcm1fZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCWludCBpLCBqOworCisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgeworCQkJc2NzaV9yZW1vdmVfaG9zdChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQkJc2NzaV9ob3N0X3B1dChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQl9CisKKwkJLyogZGVzdHJveSBhbGwgb2YgdGhlIGRldmljZSBhbmQgdGFyZ2V0IG9iamVjdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIRF9OVU1fVEFSR0VUUzsgaSsrKSB7CisJCQlzdGFyZ2V0ID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W2ldOworCQkJaWYgKHN0YXJnZXQgIT0gTlVMTCkgeworCQkJCWZvciAoaiA9IDA7IGogPCBBSERfTlVNX0xVTlM7IGorKykgeworCQkJCQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyA9CisJCQkJCQlzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKKwkJCQkJaWYgKHRhcmctPnNkZXZbal0gPT0gTlVMTCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl0YXJnLT5zZGV2W2pdID0gTlVMTDsKKwkJCQl9CisJCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmlycSAhPSBBSERfTElOVVhfTk9JUlEpCisJCQlmcmVlX2lycShhaGQtPnBsYXRmb3JtX2RhdGEtPmlycSwgYWhkKTsKKwkJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfUElPCisJCSAmJiBhaGQtPmJzaHNbMF0uaW9wb3J0ICE9IDApCisJCQlyZWxlYXNlX3JlZ2lvbihhaGQtPmJzaHNbMF0uaW9wb3J0LCAyNTYpOworCQlpZiAoYWhkLT50YWdzWzFdID09IEJVU19TUEFDRV9QSU8KKwkJICYmIGFoZC0+YnNoc1sxXS5pb3BvcnQgIT0gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGFoZC0+YnNoc1sxXS5pb3BvcnQsIDI1Nik7CisJCWlmIChhaGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPCisJCSAmJiBhaGQtPmJzaHNbMF0ubWFkZHIgIT0gTlVMTCkgeworCQkJaW91bm1hcChhaGQtPmJzaHNbMF0ubWFkZHIpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGFoZC0+cGxhdGZvcm1fZGF0YS0+bWVtX2J1c2FkZHIsCisJCQkJCSAgIDB4MTAwMCk7CisJCX0KKwkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEsIE1fREVWQlVGKTsKKwl9Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwkvKgorCSAqIExvb2t1cCBhbmQgY29tbWl0IGFueSBtb2RpZmllZCBJTyBDZWxsIG9wdGlvbnMuCisJICovCisJaWYgKGFoZC0+dW5pdCA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2lvY2VsbF9pbmZvKSkgeworCQlzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzICppb2NlbGxfb3B0czsKKworCQlpb2NlbGxfb3B0cyA9ICZhaWM3OXh4X2lvY2VsbF9pbmZvW2FoZC0+dW5pdF07CisJCWlmIChpb2NlbGxfb3B0cy0+cHJlY29tcCAhPSBBSUM3OVhYX0RFRkFVTFRfUFJFQ09NUCkKKwkJCUFIRF9TRVRfUFJFQ09NUChhaGQsIGlvY2VsbF9vcHRzLT5wcmVjb21wKTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5zbGV3cmF0ZSAhPSBBSUM3OVhYX0RFRkFVTFRfU0xFV1JBVEUpCisJCQlBSERfU0VUX1NMRVdSQVRFKGFoZCwgaW9jZWxsX29wdHMtPnNsZXdyYXRlKTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5hbXBsaXR1ZGUgIT0gQUlDNzlYWF9ERUZBVUxUX0FNUExJVFVERSkKKwkJCUFIRF9TRVRfQU1QTElUVURFKGFoZCwgaW9jZWxsX29wdHMtPmFtcGxpdHVkZSk7CisJfQorCit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQlTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpLAorCQkJCVNDQl9HRVRfTFVOKHNjYiksIFNDQl9MSVNUX05VTEwsCisJCQkJUk9MRV9VTktOT1dOLCBDQU1fUkVRVUVVRV9SRVEpOworfQorCit2b2lkCithaGRfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICAgIGFoZF9xdWV1ZV9hbGcgYWxnKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKKwlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlpbnQgd2FzX3F1ZXVpbmc7CisJaW50IG5vd19xdWV1aW5nOworCisJc3RhcmdldCA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFtkZXZpbmZvLT50YXJnZXRdOworCXRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKKwlCVUdfT04odGFyZyA9PSBOVUxMKTsKKwlzZGV2ID0gdGFyZy0+c2RldltkZXZpbmZvLT5sdW5dOworCWlmIChzZGV2ID09IE5VTEwpCisJCXJldHVybjsKKworCWRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKHNkZXYpOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJd2FzX3F1ZXVpbmcgPSBkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEKTsKKwlzd2l0Y2ggKGFsZykgeworCWRlZmF1bHQ6CisJY2FzZSBBSERfUVVFVUVfTk9ORToKKwkJbm93X3F1ZXVpbmcgPSAwOworCQlicmVhazsgCisJY2FzZSBBSERfUVVFVUVfQkFTSUM6CisJCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX0JBU0lDOworCQlicmVhazsKKwljYXNlIEFIRF9RVUVVRV9UQUdHRUQ6CisJCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX1RBR0dFRDsKKwkJYnJlYWs7CisJfQorCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWSkgPT0gMAorCSAmJiAod2FzX3F1ZXVpbmcgIT0gbm93X3F1ZXVpbmcpCisJICYmIChkZXYtPmFjdGl2ZSAhPSAwKSkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWTsKKwkJZGV2LT5xZnJvemVuKys7CisJfQorCisJZGV2LT5mbGFncyAmPSB+KEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUEVSSU9ESUNfT1RBRyk7CisJaWYgKG5vd19xdWV1aW5nKSB7CisJCXVfaW50IHVzZXJ0YWdzOworCisJCXVzZXJ0YWdzID0gYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhkLCBkZXZpbmZvKTsKKwkJaWYgKCF3YXNfcXVldWluZykgeworCQkJLyoKKwkJCSAqIFN0YXJ0IG91dCBhZ3Jlc3NpdmVseSBhbmQgYWxsb3cgb3VyCisJCQkgKiBkeW5hbWljIHF1ZXVlIGRlcHRoIGFsZ29yaXRobSB0byB0YWtlCisJCQkgKiBjYXJlIG9mIHRoZSByZXN0LgorCQkJICovCisJCQlkZXYtPm1heHRhZ3MgPSB1c2VydGFnczsKKwkJCWRldi0+b3BlbmluZ3MgPSBkZXYtPm1heHRhZ3MgLSBkZXYtPmFjdGl2ZTsKKwkJfQorCQlpZiAoZGV2LT5tYXh0YWdzID09IDApIHsKKwkJCS8qCisJCQkgKiBRdWV1ZWluZyBpcyBkaXNhYmxlZCBieSB0aGUgdXNlci4KKwkJCSAqLworCQkJZGV2LT5vcGVuaW5ncyA9IDE7CisJCX0gZWxzZSBpZiAoYWxnID09IEFIRF9RVUVVRV9UQUdHRUQpIHsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9RX1RBR0dFRDsKKwkJCWlmIChhaWM3OXh4X3BlcmlvZGljX290YWcgIT0gMCkKKwkJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUEVSSU9ESUNfT1RBRzsKKwkJfSBlbHNlCisJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUV9CQVNJQzsKKwl9IGVsc2UgeworCQkvKiBXZSBjYW4gb25seSBoYXZlIG9uZSBvcGVuaW5nLiAqLworCQlkZXYtPm1heHRhZ3MgPSAwOworCQlkZXYtPm9wZW5pbmdzID0gIDEgLSBkZXYtPmFjdGl2ZTsKKwl9CisKKwlzd2l0Y2ggKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEKSkpIHsKKwljYXNlIEFIRF9ERVZfUV9CQVNJQzoKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwKKwkJCQkJTVNHX1NJTVBMRV9UQVNLLAorCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOworCQlicmVhazsKKwljYXNlIEFIRF9ERVZfUV9UQUdHRUQ6CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsCisJCQkJCU1TR19PUkRFUkVEX1RBU0ssCisJCQkJCWRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qCisJCSAqIFdlIGFsbG93IHRoZSBPUyB0byBxdWV1ZSAyIHVudGFnZ2VkIHRyYW5zYWN0aW9ucyB0bworCQkgKiB1cyBhdCBhbnkgdGltZSBldmVuIHRob3VnaCB3ZSBjYW4gb25seSBleGVjdXRlIHRoZW0KKwkJICogc2VyaWFsbHkgb24gdGhlIGNvbnRyb2xsZXIvZGV2aWNlLiAgVGhpcyBzaG91bGQKKwkJICogcmVtb3ZlIHNvbWUgbGF0ZW5jeS4KKwkJICovCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsCisJCQkJCS8qTk9OLVRBR0dFRCovMCwKKwkJCQkJLypxdWV1ZSBkZXB0aCovMik7CisJCWJyZWFrOworCX0KK30KKworaW50CithaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJCWludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVfaW50CithaGRfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdGF0aWMgaW50IHdhcm5lZF91c2VyOworCXVfaW50IHRhZ3M7CisKKwl0YWdzID0gMDsKKwlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgZGV2aW5mby0+dGFyZ2V0X21hc2spICE9IDApIHsKKwkJaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpIHsKKworCQkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKKwkJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuICBVc2luZyBkZWZhdWx0c1xuIgorImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfdGFnX2luZm8gYXJyYXkgaW5cbiIKKyJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJCXdhcm5lZF91c2VyKys7CisJCQl9CisJCQl0YWdzID0gQUhEX01BWF9RVUVVRTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXJfdGFnX2luZm9fdCAqdGFnX2luZm87CisKKwkJCXRhZ19pbmZvID0gJmFpYzc5eHhfdGFnX2luZm9bYWhkLT51bml0XTsKKwkJCXRhZ3MgPSB0YWdfaW5mby0+dGFnX2NvbW1hbmRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCQkJaWYgKHRhZ3MgPiBBSERfTUFYX1FVRVVFKQorCQkJCXRhZ3MgPSBBSERfTUFYX1FVRVVFOworCQl9CisJfQorCXJldHVybiAodGFncyk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmVzIHRoZSBxdWV1ZSBkZXB0aCBmb3IgYSBnaXZlbiBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QJYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1X2ludAl0YWdzOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKKwkJCSAgICBhaGQtPm91cl9pZCwKKwkJCSAgICBzZGV2LT5zZGV2X3RhcmdldC0+aWQsIHNkZXYtPmx1biwKKwkJCSAgICBzZGV2LT5zZGV2X3RhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnIDogJ0InLAorCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKwl0YWdzID0gYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhkLCAmZGV2aW5mbyk7CisJaWYgKHRhZ3MgIT0gMCAmJiBzZGV2LT50YWdnZWRfc3VwcG9ydGVkICE9IDApIHsKKworCQlhaGRfc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywgQUhEX1FVRVVFX1RBR0dFRCk7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIlRhZ2dlZCBRdWV1aW5nIGVuYWJsZWQuICBEZXB0aCAlZFxuIiwgdGFncyk7CisJfSBlbHNlIHsKKwkJYWhkX3NldF90YWdzKGFoZCwgJmRldmluZm8sIEFIRF9RVUVVRV9OT05FKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9ydW5fY29tbWFuZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QJIHNjYiAqc2NiOworCXN0cnVjdAkgaGFyZHdhcmVfc2NiICpoc2NiOworCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CSBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJdV9pbnQJIGNvbF9pZHg7CisJdWludDE2X3QgbWFzazsKKworCS8qCisJICogR2V0IGFuIHNjYiB0byB1c2UuCisJICovCisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgJ0EnLCBhaGQtPm91cl9pZCwKKwkJCQkgICAgY21kLT5kZXZpY2UtPmlkLCAmdHN0YXRlKTsKKwlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX1RBR0dFRHxBSERfREVWX1FfQkFTSUMpKSA9PSAwCisJIHx8ICh0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCQljb2xfaWR4ID0gQUhEX05FVkVSX0NPTF9JRFg7CisJfSBlbHNlIHsKKwkJY29sX2lkeCA9IEFIRF9CVUlMRF9DT0xfSURYKGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkJICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCX0KKwlpZiAoKHNjYiA9IGFoZF9nZXRfc2NiKGFoZCwgY29sX2lkeCkpID09IE5VTEwpIHsKKwkJYWhkLT5mbGFncyB8PSBBSERfUkVTT1VSQ0VfU0hPUlRBR0U7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCXNjYi0+aW9fY3R4ID0gY21kOworCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2ID0gZGV2OworCWhzY2IgPSBzY2ItPmhzY2I7CisJY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilzY2I7CisKKwkvKgorCSAqIEZpbGwgb3V0IGJhc2ljcyBvZiB0aGUgSFNDQi4KKwkgKi8KKwloc2NiLT5jb250cm9sID0gMDsKKwloc2NiLT5zY3NpaWQgPSBCVUlMRF9TQ1NJSUQoYWhkLCBjbWQpOworCWhzY2ItPmx1biA9IGNtZC0+ZGV2aWNlLT5sdW47CisJc2NiLT5oc2NiLT50YXNrX21hbmFnZW1lbnQgPSAwOworCW1hc2sgPSBTQ0JfR0VUX1RBUkdFVF9NQVNLKGFoZCwgc2NiKTsKKworCWlmICgoYWhkLT51c2VyX2Rpc2NlbmFibGUgJiBtYXNrKSAhPSAwKQorCQloc2NiLT5jb250cm9sIHw9IERJU0NFTkI7CisKKwlpZiAoKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKQorCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOworCisJaWYgKCh0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICYgbWFzaykgIT0gMCkgeworCQlzY2ItPmZsYWdzIHw9IFNDQl9BVVRPX05FR09USUFURTsKKwkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJfQorCisJaWYgKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9RX0JBU0lDKSkgIT0gMCkgeworCQlpbnQJbXNnX2J5dGVzOworCQl1aW50OF90IHRhZ19tc2dzWzJdOworCisJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKKwkJaWYgKG1zZ19ieXRlcyAmJiB0YWdfbXNnc1swXSAhPSBNU0dfU0lNUExFX1RBU0spIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gdGFnX21zZ3NbMF07CisJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKKwkJCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9IDA7CisJCX0gZWxzZQorCQlpZiAoZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPT0gQUhEX09UQUdfVEhSRVNICisJCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfUV9UQUdHRUQpICE9IDApIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gTVNHX09SREVSRURfVEFTSzsKKwkJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKKwkJfSBlbHNlIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gTVNHX1NJTVBMRV9UQVNLOworCQl9CisJfQorCisJaHNjYi0+Y2RiX2xlbiA9IGNtZC0+Y21kX2xlbjsKKwltZW1jcHkoaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOworCisJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7CisJYWhkX3NldF9yZXNpZHVhbChzY2IsIDApOworCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCAwKTsKKwlzY2ItPnNnX2NvdW50ID0gMDsKKwlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQl2b2lkCSpzZzsKKwkJc3RydWN0CSBzY2F0dGVybGlzdCAqY3VyX3NlZzsKKwkJdV9pbnQJIG5zZWc7CisJCWludAkgZGlyOworCisJCWN1cl9zZWcgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwkJbnNlZyA9IHBjaV9tYXBfc2coYWhkLT5kZXZfc29mdGMsIGN1cl9zZWcsCisJCQkJICBjbWQtPnVzZV9zZywgZGlyKTsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7CisJCWZvciAoc2cgPSBzY2ItPnNnX2xpc3Q7IG5zZWcgPiAwOyBuc2VnLS0sIGN1cl9zZWcrKykgeworCQkJZG1hX2FkZHJfdCBhZGRyOworCQkJYnVzX3NpemVfdCBsZW47CisKKwkJCWFkZHIgPSBzZ19kbWFfYWRkcmVzcyhjdXJfc2VnKTsKKwkJCWxlbiA9IHNnX2RtYV9sZW4oY3VyX3NlZyk7CisJCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuICs9IGxlbjsKKwkJCXNnID0gYWhkX3NnX3NldHVwKGFoZCwgc2NiLCBzZywgYWRkciwgbGVuLAorCQkJCQkgIC8qbGFzdCovbnNlZyA9PSAxKTsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQl2b2lkICpzZzsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlpbnQgZGlyOworCisJCXNnID0gc2NiLT5zZ19saXN0OworCQlkaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoYWhkLT5kZXZfc29mdGMsCisJCQkJICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZGlyKTsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlzY2ItPnBsYXRmb3JtX2RhdGEtPmJ1Zl9idXNhZGRyID0gYWRkcjsKKwkJc2cgPSBhaGRfc2dfc2V0dXAoYWhkLCBzY2IsIHNnLCBhZGRyLAorCQkJCSAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIC8qbGFzdCovVFJVRSk7CisJfQorCisJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5wZW5kaW5nX3NjYnMsIHNjYiwgcGVuZGluZ19saW5rcyk7CisJZGV2LT5vcGVuaW5ncy0tOworCWRldi0+YWN0aXZlKys7CisJZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKKworCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfUEVSSU9ESUNfT1RBRykgIT0gMCkKKwkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcrKzsKKwlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7CisJYWhkX3F1ZXVlX3NjYihhaGQsIHNjYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNDU0kgY29udHJvbGxlciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworaXJxcmV0dXJuX3QKK2FoZF9saW51eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlmbGFnczsKKwlpbnQJb3VyczsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopIGRldl9pZDsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7IAorCW91cnMgPSBhaGRfaW50cihhaGQpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOworfQorCit2b2lkCithaGRfcGxhdGZvcm1fZmx1c2h3b3JrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKworfQorCit2b2lkCithaGRfc2VuZF9hc3luYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGNoYXIgY2hhbm5lbCwKKwkgICAgICAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGFjX2NvZGUgY29kZSwgdm9pZCAqYXJnKQoreworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQUNfVFJBTlNGRVJfTkVHOgorCXsKKwkJY2hhcglidWZbODBdOworCQlzdHJ1Y3QgIHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCQlzdHJ1Y3QJYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwkJc3RydWN0CWluZm9fc3RyIGluZm87CisJCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwkJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwkJdW5zaWduZWQgaW50IHRhcmdldF9wcHJfb3B0aW9uczsKKworCQlCVUdfT04odGFyZ2V0ID09IENBTV9UQVJHRVRfV0lMRENBUkQpOworCisJCWluZm8uYnVmZmVyID0gYnVmOworCQlpbmZvLmxlbmd0aCA9IHNpemVvZihidWYpOworCQlpbmZvLm9mZnNldCA9IDA7CisJCWluZm8ucG9zID0gMDsKKwkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgY2hhbm5lbCwgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnZXQsICZ0c3RhdGUpOworCisJCS8qCisJCSAqIERvbid0IGJvdGhlciByZXBvcnRpbmcgcmVzdWx0cyB3aGlsZQorCQkgKiBuZWdvdGlhdGlvbnMgYXJlIHN0aWxsIHBlbmRpbmcuCisJCSAqLworCQlpZiAodGluZm8tPmN1cnIucGVyaW9kICE9IHRpbmZvLT5nb2FsLnBlcmlvZAorCQkgfHwgdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGgKKwkJIHx8IHRpbmZvLT5jdXJyLm9mZnNldCAhPSB0aW5mby0+Z29hbC5vZmZzZXQKKwkJIHx8IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICE9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zKQorCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHRoYXQKKwkJICogYXJlIGlkZW50aWNhbCB0byB0aG9zZSBsYXN0IHJlcG9ydGVkLgorCQkgKi8KKwkJc3RhcmdldCA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFt0YXJnZXRdOworCQlpZiAoc3RhcmdldCA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKKworCQl0YXJnZXRfcHByX29wdGlvbnMgPQorCQkJKHNwaV9kdChzdGFyZ2V0KSA/IE1TR19FWFRfUFBSX0RUX1JFUSA6IDApCisJCQkrIChzcGlfcWFzKHN0YXJnZXQpID8gTVNHX0VYVF9QUFJfUUFTX1JFUSA6IDApCisJCQkrIChzcGlfaXUoc3RhcmdldCkgPyAgTVNHX0VYVF9QUFJfSVVfUkVRIDogMCkKKwkJCSsgKHNwaV9yZF9zdHJtKHN0YXJnZXQpID8gTVNHX0VYVF9QUFJfUkRfU1RSTSA6IDApCisJCQkrIChzcGlfcGNvbXBfZW4oc3RhcmdldCkgPyBNU0dfRVhUX1BQUl9QQ09NUF9FTiA6IDApCisJCQkrIChzcGlfcnRpKHN0YXJnZXQpID8gTVNHX0VYVF9QUFJfUlRJIDogMCkKKwkJCSsgKHNwaV93cl9mbG93KHN0YXJnZXQpID8gTVNHX0VYVF9QUFJfV1JfRkxPVyA6IDApCisJCQkrIChzcGlfaG9sZF9tY3Moc3RhcmdldCkgPyBNU0dfRVhUX1BQUl9IT0xEX01DUyA6IDApOworCisJCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgPT0gc3BpX3BlcmlvZChzdGFyZ2V0KQorCQkgICAgJiYgdGluZm8tPmN1cnIud2lkdGggPT0gc3BpX3dpZHRoKHN0YXJnZXQpCisJCSAgICAmJiB0aW5mby0+Y3Vyci5vZmZzZXQgPT0gc3BpX29mZnNldChzdGFyZ2V0KQorCQkgJiYgdGluZm8tPmN1cnIucHByX29wdGlvbnMgPT0gdGFyZ2V0X3Bwcl9vcHRpb25zKQorCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisKKwkJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IHRpbmZvLT5jdXJyLnBlcmlvZDsKKwkJc3BpX3dpZHRoKHN0YXJnZXQpID0gdGluZm8tPmN1cnIud2lkdGg7CisJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7CisJCXNwaV9kdChzdGFyZ2V0KSA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRID8gMSA6IDA7CisJCXNwaV9xYXMoc3RhcmdldCkgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1FBU19SRVEgPyAxIDogMDsKKwkJc3BpX2l1KHN0YXJnZXQpID0gdGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEgPyAxIDogMDsKKwkJc3BpX3JkX3N0cm0oc3RhcmdldCkgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1JEX1NUUk0gPyAxIDogMDsKKwkJc3BpX3Bjb21wX2VuKHN0YXJnZXQpID0gIHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUENPTVBfRU4gPyAxIDogMDsKKwkJc3BpX3J0aShzdGFyZ2V0KSA9ICB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmICBNU0dfRVhUX1BQUl9SVEkgPyAxIDogMDsKKwkJc3BpX3dyX2Zsb3coc3RhcmdldCkgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1dSX0ZMT1cgPyAxIDogMDsKKwkJc3BpX2hvbGRfbWNzKHN0YXJnZXQpID0gdGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9IT0xEX01DUyA/IDEgOiAwOworCQlzcGlfZGlzcGxheV94ZmVyX2FncmVlbWVudChzdGFyZ2V0KTsKKwkJYnJlYWs7CisJfQorICAgICAgICBjYXNlIEFDX1NFTlRfQkRSOgorCXsKKwkJV0FSTl9PTihsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCk7CisJCXNjc2lfcmVwb3J0X2RldmljZV9yZXNldChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QsCisJCQkJCSBjaGFubmVsIC0gJ0EnLCB0YXJnZXQpOworCQlicmVhazsKKwl9CisgICAgICAgIGNhc2UgQUNfQlVTX1JFU0VUOgorCQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0ICE9IE5VTEwpIHsKKwkJCXNjc2lfcmVwb3J0X2J1c19yZXNldChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QsCisJCQkJCSAgICAgIGNoYW5uZWwgLSAnQScpOworCQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcGFuaWMoImFoZF9zZW5kX2FzeW5jOiBVbmV4cGVjdGVkIGFzeW5jIGV2ZW50Iik7CisgICAgICAgIH0KK30KKworLyoKKyAqIENhbGxzIHRoZSBoaWdoZXIgbGV2ZWwgc2NzaSBkb25lIGZ1bmN0aW9uIGFuZCBmcmVlcyB0aGUgc2NiLgorICovCit2b2lkCithaGRfZG9uZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0CSAgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIlNDQiAlZCBkb25lJ2QgdHdpY2VcbiIsIFNDQl9HRVRfVEFHKHNjYikpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCXBhbmljKCJTdG9wcGluZyBmb3Igc2FmZXR5Iik7CisJfQorCUxJU1RfUkVNT1ZFKHNjYiwgcGVuZGluZ19saW5rcyk7CisJY21kID0gc2NiLT5pb19jdHg7CisJZGV2ID0gc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXY7CisJZGV2LT5hY3RpdmUtLTsKKwlkZXYtPm9wZW5pbmdzKys7CisJaWYgKChjbWQtPnJlc3VsdCAmIChDQU1fREVWX1FGUlpOIDw8IDE2KSkgIT0gMCkgeworCQljbWQtPnJlc3VsdCAmPSB+KENBTV9ERVZfUUZSWk4gPDwgMTYpOworCQlkZXYtPnFmcm96ZW4tLTsKKwl9CisJYWhkX2xpbnV4X3VubWFwX3NjYihhaGQsIHNjYik7CisKKwkvKgorCSAqIEd1YXJkIGFnYWluc3Qgc3RhbGUgc2Vuc2UgZGF0YS4KKwkgKiBUaGUgTGludXggbWlkLWxheWVyIGFzc3VtZXMgdGhhdCBzZW5zZQorCSAqIHdhcyByZXRyaWV2ZWQgYW55dGltZSB0aGUgZmlyc3QgYnl0ZSBvZgorCSAqIHRoZSBzZW5zZSBidWZmZXIgbG9va3MgInNhbmUiLgorCSAqLworCWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKwlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fUkVRX0lOUFJPRykgeworCQl1aW50MzJfdCBhbW91bnRfeGZlcnJlZDsKKworCQlhbW91bnRfeGZlcnJlZCA9CisJCSAgICBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpIC0gYWhkX2dldF9yZXNpZHVhbChzY2IpOworCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SKSAhPSAwKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApIHsKKwkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQkJcHJpbnRmKCJTZXQgQ0FNX1VOQ09SX1BBUklUWVxuIik7CisJCQl9CisjZW5kaWYKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1VOQ09SX1BBUklUWSk7CisjaWZkZWYgQUhEX1JFUE9SVF9VTkRFUkZMT1dTCisJCS8qCisJCSAqIFRoaXMgY29kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFzIHNvbWUKKwkJICogY2xpZW50cyBvZiB0aGUgU0NTSSBzeXN0ZW0gZG8gbm90IHByb3Blcmx5CisJCSAqIGluaXRpYWxpemUgdGhlIHVuZGVyZmxvdyBwYXJhbWV0ZXIuICBUaGlzCisJCSAqIHJlc3VsdHMgaW4gc3B1cmlvdXMgdGVybWluYXRpb24gb2YgY29tbWFuZHMKKwkJICogdGhhdCBjb21wbGV0ZSBhcyBleHBlY3RlZCAoZS5nLiB1bmRlcmZsb3cgaXMKKwkJICogYWxsb3dlZCBhcyBjb21tYW5kIGNhbiByZXR1cm4gdmFyaWFibGUgYW1vdW50cworCQkgKiBvZiBkYXRhLgorCQkgKi8KKwkJfSBlbHNlIGlmIChhbW91bnRfeGZlcnJlZCA8IHNjYi0+aW9fY3R4LT51bmRlcmZsb3cpIHsKKwkJCXVfaW50IGk7CisKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiQ0RCOiIpOworCQkJZm9yIChpID0gMDsgaSA8IHNjYi0+aW9fY3R4LT5jbWRfbGVuOyBpKyspCisJCQkJcHJpbnRmKCIgMHgleCIsIHNjYi0+aW9fY3R4LT5jbW5kW2ldKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiU2F3IHVuZGVyZmxvdyAoJWxkIG9mICVsZCBieXRlcykuICIKKwkJCSAgICAgICAiVHJlYXRlZCBhcyBlcnJvclxuIiwKKwkJCQlhaGRfZ2V0X3Jlc2lkdWFsKHNjYiksCisJCQkJYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSk7CisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9EQVRBX1JVTl9FUlIpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFfQ01QKTsKKwkJfQorCX0gZWxzZSBpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fU0NTSV9TVEFUVVNfRVJST1IpIHsKKwkJYWhkX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhhaGQsIGNtZC0+ZGV2aWNlLCBzY2IpOworCX0KKworCWlmIChkZXYtPm9wZW5pbmdzID09IDEKKwkgJiYgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fUkVRX0NNUAorCSAmJiBhaGRfZ2V0X3Njc2lfc3RhdHVzKHNjYikgIT0gU0NTSV9TVEFUVVNfUVVFVUVfRlVMTCkKKwkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCsrOworCS8qCisJICogU29tZSBkZXZpY2VzIGRlYWwgd2l0aCB0ZW1wb3JhcnkgaW50ZXJuYWwgcmVzb3VyY2UKKwkgKiBzaG9ydGFnZXMgYnkgcmV0dXJuaW5nIHF1ZXVlIGZ1bGwuICBXaGVuIHRoZSBxdWV1ZQorCSAqIGZ1bGwgb2NjdXJycywgd2UgdGhyb3R0bGUgYmFjay4gIFNsb3dseSB0cnkgdG8gZ2V0CisJICogYmFjayB0byBvdXIgcHJldmlvdXMgcXVldWUgZGVwdGguCisJICovCisJaWYgKChkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpIDwgZGV2LT5tYXh0YWdzCisJICYmIGRldi0+dGFnX3N1Y2Nlc3NfY291bnQgPiBBSERfVEFHX1NVQ0NFU1NfSU5URVJWQUwpIHsKKwkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCA9IDA7CisJCWRldi0+b3BlbmluZ3MrKzsKKwl9CisKKwlpZiAoZGV2LT5hY3RpdmUgPT0gMCkKKwkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkgeworCQlwcmludGYoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOworCQlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fQkRSX1NFTlQKKwkJIHx8IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9BQk9SVEVEKQorCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOworCQlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfU0NCX1VQX0VIX1NFTSkgIT0gMCkgeworCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1NDQl9VUF9FSF9TRU07CisJCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCQl9CisJfQorCisJYWhkX2ZyZWVfc2NiKGFoZCwgc2NiKTsKKwlhaGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoZCwgY21kKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJICAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3QJYWhkX2RldmluZm8gZGV2aW5mbzsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2ID0gc2NzaV90cmFuc3BvcnRfZGV2aWNlX2RhdGEoc2Rldik7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJICAgIGFoZC0+b3VyX2lkLAorCQkJICAgIHNkZXYtPnNkZXZfdGFyZ2V0LT5pZCwgc2Rldi0+bHVuLAorCQkJICAgIHNkZXYtPnNkZXZfdGFyZ2V0LT5jaGFubmVsID09IDAgPyAnQScgOiAnQicsCisJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQorCS8qCisJICogV2UgZG9uJ3QgY3VycmVudGx5IHRydXN0IHRoZSBtaWQtbGF5ZXIgdG8KKwkgKiBwcm9wZXJseSBkZWFsIHdpdGggcXVldWUgZnVsbCBvciBidXN5LiAgU28sCisJICogd2hlbiBvbmUgb2NjdXJzLCB3ZSB0ZWxsIHRoZSBtaWQtbGF5ZXIgdG8KKwkgKiB1bmNvbmRpdGlvbmFsbHkgcmVxdWV1ZSB0aGUgY29tbWFuZCB0byB1cworCSAqIHNvIHRoYXQgd2UgY2FuIHJldHJ5IGl0IG91cnNlbHZlcy4gIFdlIGFsc28KKwkgKiBpbXBsZW1lbnQgb3VyIG93biB0aHJvdHRsaW5nIG1lY2hhbmlzbSBzbworCSAqIHdlIGRvbid0IGNsb2JiZXIgdGhlIGRldmljZSB3aXRoIHRvbyBtYW55CisJICogY29tbWFuZHMuCisJICovCisJc3dpdGNoIChhaGRfZ2V0X3Njc2lfc3RhdHVzKHNjYikpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6CisJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKKwl7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCQkvKgorCQkgKiBDb3B5IHNlbnNlIGluZm9ybWF0aW9uIHRvIHRoZSBPUydzIGNtZAorCQkgKiBzdHJ1Y3R1cmUgaWYgaXQgaXMgYXZhaWxhYmxlLgorCQkgKi8KKwkJY21kID0gc2NiLT5pb19jdHg7CisJCWlmICgoc2NiLT5mbGFncyAmIChTQ0JfU0VOU0V8U0NCX1BLVF9TRU5TRSkpICE9IDApIHsKKwkJCXN0cnVjdCBzY3NpX3N0YXR1c19pdV9oZWFkZXIgKnNpdTsKKwkJCXVfaW50IHNlbnNlX3NpemU7CisJCQl1X2ludCBzZW5zZV9vZmZzZXQ7CisKKwkJCWlmIChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSB7CisJCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzaXplb2Yoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSkKKwkJCQkJICAgICAgIC0gYWhkX2dldF9zZW5zZV9yZXNpZHVhbChzY2IpLAorCQkJCQkJIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJCXNlbnNlX29mZnNldCA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogQ29weSBvbmx5IHRoZSBzZW5zZSBkYXRhIGludG8gdGhlIHByb3ZpZGVkCisJCQkJICogYnVmZmVyLgorCQkJCSAqLworCQkJCXNpdSA9IChzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICopCisJCQkJICAgIHNjYi0+c2Vuc2VfZGF0YTsKKwkJCQlzZW5zZV9zaXplID0gTUlOKHNjc2lfNGJ0b3VsKHNpdS0+c2Vuc2VfbGVuZ3RoKSwKKwkJCQkJCXNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJCXNlbnNlX29mZnNldCA9IFNJVV9TRU5TRV9PRkZTRVQoc2l1KTsKKwkJCX0KKworCQkJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwKKwkJCSAgICAgICBhaGRfZ2V0X3NlbnNlX2J1ZihhaGQsIHNjYikKKwkJCSAgICAgICArIHNlbnNlX29mZnNldCwgc2Vuc2Vfc2l6ZSk7CisJCQljbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKKworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSB7CisJCQkJaW50IGk7CisKKwkJCQlwcmludGYoIkNvcGllZCAlZCBieXRlcyBvZiBzZW5zZSBkYXRhIGF0ICVkOiIsCisJCQkJICAgICAgIHNlbnNlX3NpemUsIHNlbnNlX29mZnNldCk7CisJCQkJZm9yIChpID0gMDsgaSA8IHNlbnNlX3NpemU7IGkrKykgeworCQkJCQlpZiAoKGkgJiAweEYpID09IDApCisJCQkJCQlwcmludGYoIlxuIik7CisJCQkJCXByaW50ZigiMHgleCAiLCBjbWQtPnNlbnNlX2J1ZmZlcltpXSk7CisJCQkJfQorCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNDU0lfU1RBVFVTX1FVRVVFX0ZVTEw6CisJCS8qCisJCSAqIEJ5IHRoZSB0aW1lIHRoZSBjb3JlIGRyaXZlciBoYXMgcmV0dXJuZWQgdGhpcworCQkgKiBjb21tYW5kLCBhbGwgb3RoZXIgY29tbWFuZHMgdGhhdCB3ZXJlIHF1ZXVlZAorCQkgKiB0byB1cyBidXQgbm90IHRoZSBkZXZpY2UgaGF2ZSBiZWVuIHJldHVybmVkLgorCQkgKiBUaGlzIGVuc3VyZXMgdGhhdCBkZXYtPmFjdGl2ZSBpcyBlcXVhbCB0bworCQkgKiB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIGFjdHVhbGx5IHF1ZXVlZCB0bworCQkgKiB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCA9IDA7CisJCWlmIChkZXYtPmFjdGl2ZSAhPSAwKSB7CisJCQkvKgorCQkJICogRHJvcCBvdXIgb3BlbmluZyBjb3VudCB0byB0aGUgbnVtYmVyCisJCQkgKiBvZiBjb21tYW5kcyBjdXJyZW50bHkgb3V0c3RhbmRpbmcuCisJCQkgKi8KKwkJCWRldi0+b3BlbmluZ3MgPSAwOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19RRlVMTCkgIT0gMCkgeworCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCQlwcmludGYoIkRyb3BwaW5nIHRhZyBjb3VudCB0byAlZFxuIiwKKwkJCQkgICAgICAgZGV2LT5hY3RpdmUpOworCQkJfQorI2VuZGlmCisJCQlpZiAoZGV2LT5hY3RpdmUgPT0gZGV2LT50YWdzX29uX2xhc3RfcXVldWVmdWxsKSB7CisKKwkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQrKzsKKwkJCQkvKgorCQkJCSAqIElmIHdlIHJlcGVhdGVkbHkgc2VlIGEgcXVldWUgZnVsbAorCQkJCSAqIGF0IHRoZSBzYW1lIHF1ZXVlIGRlcHRoLCB0aGlzCisJCQkJICogZGV2aWNlIGhhcyBhIGZpeGVkIG51bWJlciBvZiB0YWcKKwkJCQkgKiBzbG90cy4gIExvY2sgaW4gdGhpcyB0YWcgZGVwdGgKKwkJCQkgKiBzbyB3ZSBzdG9wIHNlZWluZyBxdWV1ZSBmdWxscyBmcm9tCisJCQkJICogdGhpcyBkZXZpY2UuCisJCQkJICovCisJCQkJaWYgKGRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudAorCQkJCSA9PSBBSERfTE9DS19UQUdTX0NPVU5UKSB7CisJCQkJCWRldi0+bWF4dGFncyA9IGRldi0+YWN0aXZlOworCQkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQkJCXByaW50ZigiTG9ja2luZyBtYXggdGFnIGNvdW50IGF0ICVkXG4iLAorCQkJCQkgICAgICAgZGV2LT5hY3RpdmUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGV2LT50YWdzX29uX2xhc3RfcXVldWVmdWxsID0gZGV2LT5hY3RpdmU7CisJCQkJZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50ID0gMDsKKwkJCX0KKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJCWFoZF9zZXRfc2NzaV9zdGF0dXMoc2NiLCBTQ1NJX1NUQVRVU19PSyk7CisJCQlhaGRfcGxhdGZvcm1fc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywKKwkJCQkgICAgIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX0JBU0lDKQorCQkJCSAgID8gQUhEX1FVRVVFX0JBU0lDIDogQUhEX1FVRVVFX1RBR0dFRCk7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBEcm9wIGRvd24gdG8gYSBzaW5nbGUgb3BlbmluZywgYW5kIHRyZWF0IHRoaXMKKwkJICogYXMgaWYgdGhlIHRhcmdldCByZXR1cm5lZCBCVVNZIFNDU0kgc3RhdHVzLgorCQkgKi8KKwkJZGV2LT5vcGVuaW5ncyA9IDE7CisJCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsICZkZXZpbmZvLAorCQkJICAgICAoZGV2LT5mbGFncyAmIEFIRF9ERVZfUV9CQVNJQykKKwkJCSAgID8gQUhEX1FVRVVFX0JBU0lDIDogQUhEX1FVRVVFX1RBR0dFRCk7CisJCWFoZF9zZXRfc2NzaV9zdGF0dXMoc2NiLCBTQ1NJX1NUQVRVU19CVVNZKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCS8qCisJICogTWFwIENBTSBlcnJvciBjb2RlcyBpbnRvIExpbnV4IEVycm9yIGNvZGVzLiAgV2UKKwkgKiBhdm9pZCB0aGUgY29udmVyc2lvbiBzbyB0aGF0IHRoZSBEViBjb2RlIGhhcyB0aGUKKwkgKiBmdWxsIGVycm9yIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB3aGVuIG1ha2luZworCSAqIHN0YXRlIGNoYW5nZSBkZWNpc2lvbnMuCisJICovCisJeworCQl1aW50MzJfdCBzdGF0dXM7CisJCXVfaW50IG5ld19zdGF0dXM7CisKKwkJc3RhdHVzID0gYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCk7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgQ0FNX1JFUV9JTlBST0c6CisJCWNhc2UgQ0FNX1JFUV9DTVA6CisJCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgorCQkJbmV3X3N0YXR1cyA9IERJRF9PSzsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFfQUJPUlRFRDoKKwkJCW5ld19zdGF0dXMgPSBESURfQUJPUlQ7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fQlVTWToKKwkJCW5ld19zdGF0dXMgPSBESURfQlVTX0JVU1k7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fUkVRX0lOVkFMSUQ6CisJCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKKwkJCW5ld19zdGF0dXMgPSBESURfQkFEX1RBUkdFVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9TRUxfVElNRU9VVDoKKwkJCW5ld19zdGF0dXMgPSBESURfTk9fQ09OTkVDVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKKwkJY2FzZSBDQU1fQkRSX1NFTlQ6CisJCQluZXdfc3RhdHVzID0gRElEX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1VOQ09SX1BBUklUWToKKwkJCW5ld19zdGF0dXMgPSBESURfUEFSSVRZOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0NNRF9USU1FT1VUOgorCQkJbmV3X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9VQV9BQk9SVDoKKwkJY2FzZSBDQU1fUkVRX0NNUF9FUlI6CisJCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgorCQljYXNlIENBTV9OT19IQkE6CisJCWNhc2UgQ0FNX0RBVEFfUlVOX0VSUjoKKwkJY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKKwkJY2FzZSBDQU1fU0VRVUVOQ0VfRkFJTDoKKwkJY2FzZSBDQU1fQ0NCX0xFTl9FUlI6CisJCWNhc2UgQ0FNX1BST1ZJREVfRkFJTDoKKwkJY2FzZSBDQU1fUkVRX1RFUk1JTzoKKwkJY2FzZSBDQU1fVU5SRUNfSEJBX0VSUk9SOgorCQljYXNlIENBTV9SRVFfVE9PX0JJRzoKKwkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fUkVRVUVVRV9SRVE6CisJCQluZXdfc3RhdHVzID0gRElEX1JFUVVFVUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgbmV3X3N0YXR1cyk7CisJfQorCisJY21kLT5zY3NpX2RvbmUoY21kKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwl1X2xvbmcJczsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopYXJnOworCisJYWhkX2xvY2soYWhkLCAmcyk7CisJaWYgKChhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX1NDQl9VUF9FSF9TRU0pICE9IDApIHsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1NDQl9VUF9FSF9TRU07CisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJfQorCWFoZF91bmxvY2soYWhkLCAmcyk7Cit9CisKK3ZvaWQKK2FoZF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuKys7CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAxKSB7CisJCXNjc2lfYmxvY2tfcmVxdWVzdHMoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKKwkJYWhkX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhkLCBDQU1fVEFSR0VUX1dJTERDQVJELCBBTExfQ0hBTk5FTFMsCisJCQkJCUNBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCisJCQkJCVJPTEVfSU5JVElBVE9SLCBDQU1fUkVRVUVVRV9SRVEpOworCX0KK30KKwordm9pZAorYWhkX3JlbGVhc2Vfc2ltcShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdV9sb25nIHM7CisJaW50ICAgIHVuYmxvY2tfcmVxczsKKworCXVuYmxvY2tfcmVxcyA9IDA7CisJYWhkX2xvY2soYWhkLCAmcyk7CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA+IDApCisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbi0tOworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPT0gMCkgeworCQl1bmJsb2NrX3JlcXMgPSAxOworCX0KKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCS8qCisJICogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGhlcmUuICBUaGUgbWlkLWxheWVyCisJICogc2hvdWxkIGtlZXAgaXRzIG93biBmcmVlemUgY291bnQgYW5kIHVzZQorCSAqIGEgYm90dG9tIGhhbGYgaGFuZGxlciB0byBydW4gdGhlIHF1ZXVlcworCSAqIHNvIHdlIGNhbiB1bmJsb2NrIHdpdGggb3VyIG93biBsb2NrIGhlbGQuCisJICovCisJaWYgKHVuYmxvY2tfcmVxcykKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKIAlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwogCXN0cnVjdCBzY2IgKnBlbmRpbmdfc2NiOwotCXVfbG9uZyBzOwogCXVfaW50ICBzYXZlZF9zY2JwdHI7CiAJdV9pbnQgIGFjdGl2ZV9zY2JwdHI7CiAJdV9pbnQgIGxhc3RfcGhhc2U7CisJdV9pbnQgIHNhdmVkX3Njc2lpZDsKIAl1X2ludCAgY2RiX2J5dGU7CiAJaW50ICAgIHJldHZhbDsKIAlpbnQgICAgd2FzX3BhdXNlZDsKQEAgLTEyMTcsMzAgKzIwNjgsMTggQEAKIAlwYXVzZWQgPSBGQUxTRTsKIAl3YWl0ID0gRkFMU0U7CiAJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLQlhY21kID0gKHN0cnVjdCBhaGRfY21kICopY21kOwogCi0JcHJpbnRmKCIlczolZDolZDolZDogQXR0ZW1wdGluZyB0byBhYm9ydCBjbWQgJXA6IiwKLQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKLQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgY21kKTsKKwlwcmludGYoIiVzOiVkOiVkOiVkOiBBdHRlbXB0aW5nIHRvIHF1ZXVlIGElcyBtZXNzYWdlOiIsCisJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAorCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJICAgICAgIGZsYWcgPT0gU0NCX0FCT1JUID8gIm4gQUJPUlQiIDogIiBUQVJHRVQgUkVTRVQiKTsKKworCXByaW50ZigiQ0RCOiIpOwogCWZvciAoY2RiX2J5dGUgPSAwOyBjZGJfYnl0ZSA8IGNtZC0+Y21kX2xlbjsgY2RiX2J5dGUrKykKIAkJcHJpbnRmKCIgMHgleCIsIGNtZC0+Y21uZFtjZGJfYnl0ZV0pOwogCXByaW50ZigiXG4iKTsKIAotCS8qCi0JICogSW4gYWxsIHZlcnNpb25zIG9mIExpbnV4LCB3ZSBoYXZlIHRvIHdvcmsgYXJvdW5kCi0JICogYSBtYWpvciBmbGF3IGluIGhvdyB0aGUgbWlkLWxheWVyIGlzIGxvY2tlZCBkb3duCi0JICogaWYgd2UgYXJlIHRvIHNsZWVwIHN1Y2Nlc3NmdWxseSBpbiBvdXIgZXJyb3IgaGFuZGxlcgotCSAqIHdoaWxlIGFsbG93aW5nIG91ciBpbnRlcnJ1cHQgaGFuZGxlciB0byBydW4uICBTaW5jZQotCSAqIHRoZSBtaWRsYXllciBhY3F1aXJlcyBlaXRoZXIgdGhlIGlvX3JlcXVlc3RfbG9jayBvcgotCSAqIG91ciBsb2NrIHByaW9yIHRvIGNhbGxpbmcgdXMsIHdlIG11c3QgdXNlIHRoZQotCSAqIHNwaW5fdW5sb2NrX2lycSgpIG1ldGhvZCBmb3IgdW5sb2NraW5nIG91ciBsb2NrLgotCSAqIFRoaXMgd2lsbCBmb3JjZSBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgb24gdGhlCi0JICogY3VycmVudCBDUFUuICBTaW5jZSB0aGUgRUggdGhyZWFkIHNob3VsZCBub3QgaGF2ZQotCSAqIGJlZW4gcnVubmluZyB3aXRoIENQVSBpbnRlcnJ1cHRzIGRpc2FibGVkIG90aGVyIHRoYW4KLQkgKiBieSBhY3F1aXJpbmcgZWl0aGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgb3Igb3VyIG93bgotCSAqIGxvY2ssIHRoaXMgKnNob3VsZCogYmUgc2FmZS4KLQkgKi8KLQlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoZCwgJnMpOworCXNwaW5fbG9ja19pcnEoJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKIAogCS8qCiAJICogRmlyc3QgZGV0ZXJtaW5lIGlmIHdlIGN1cnJlbnRseSBvd24gdGhpcyBjb21tYW5kLgpAQCAtMTI0OSw5ICsyMDg4LDcgQEAKIAkgKiBhdCBhbGwsIGFuZCB0aGUgc3lzdGVtIHdhbnRlZCB1cyB0byBqdXN0IGFib3J0IHRoZQogCSAqIGNvbW1hbmQsIHJldHVybiBzdWNjZXNzLgogCSAqLwotCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCi0JCQkJICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAotCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKKwlkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShjbWQtPmRldmljZSk7CiAKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJLyoKQEAgLTEyNjUsMjIgKzIxMDIsNiBAQAogCQlnb3RvIG5vX2NtZDsKIAl9CiAKLQlUQUlMUV9GT1JFQUNIKGxpc3RfYWNtZCwgJmRldi0+YnVzeXEsIGFjbWRfbGlua3MudHFlKSB7Ci0JCWlmIChsaXN0X2FjbWQgPT0gYWNtZCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChsaXN0X2FjbWQgIT0gTlVMTCkgewotCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGZvdW5kIG9uIGRldmljZSBxdWV1ZVxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCi0JCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKLQkJVEFJTFFfUkVNT1ZFKCZkZXYtPmJ1c3lxLCBsaXN0X2FjbWQsIGFjbWRfbGlua3MudHFlKTsKLQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOwotCQlyZXR2YWwgPSBTVUNDRVNTOwotCQlnb3RvIGRvbmU7Ci0JfQotCiAJLyoKIAkgKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBtYXRjaGluZyBjbWQgaW4gdGhlIHBlbmRpbmcgbGlzdC4KIAkgKi8KQEAgLTEyODksNiArMjExMCwxOCBAQAogCQkJYnJlYWs7CiAJfQogCisJaWYgKHBlbmRpbmdfc2NiID09IE5VTEwgJiYgZmxhZyA9PSBTQ0JfREVWSUNFX1JFU0VUKSB7CisKKwkJLyogQW55IFNDQiBmb3IgdGhpcyBkZXZpY2Ugd2lsbCBkbyBmb3IgYSB0YXJnZXQgcmVzZXQgKi8KKwkJTElTVF9GT1JFQUNIKHBlbmRpbmdfc2NiLCAmYWhkLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJICAJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBwZW5kaW5nX3NjYiwgY21kLT5kZXZpY2UtPmlkLAorCQkJCQkgIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCQkgIENBTV9MVU5fV0lMRENBUkQsCisJCQkJCSAgU0NCX0xJU1RfTlVMTCwgUk9MRV9JTklUSUFUT1IpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKIAlpZiAocGVuZGluZ19zY2IgPT0gTlVMTCkgewogCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIG5vdCBmb3VuZFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCkBAIC0xMzI2LDE1ICsyMTU5LDI1IEBACiAJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOwogCiAJZGlzY29ubmVjdGVkID0gVFJVRTsKLQlpZiAoYWhkX3NlYXJjaF9xaW5maWZvKGFoZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKLQkJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCBTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYiksCi0JCQkgICAgICAgUk9MRV9JTklUSUFUT1IsIENBTV9SRVFfQUJPUlRFRCwKLQkJCSAgICAgICBTRUFSQ0hfQ09NUExFVEUpID4gMCkgewotCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDbWQgYWJvcnRlZCBmcm9tIFFJTkZJRk9cbiIsCi0JCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAotCQkJCWNtZC0+ZGV2aWNlLT5sdW4pOwotCQlyZXR2YWwgPSBTVUNDRVNTOwotCQlnb3RvIGRvbmU7CisJaWYgKGZsYWcgPT0gU0NCX0FCT1JUKSB7CisJCWlmIChhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsIAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgCisJCQkJICAgICAgIHBlbmRpbmdfc2NiLT5oc2NiLT50YWcsCisJCQkJICAgICAgIFJPTEVfSU5JVElBVE9SLCBDQU1fUkVRX0FCT1JURUQsCisJCQkJICAgICAgIFNFQVJDSF9DT01QTEVURSkgPiAwKSB7CisJCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDbWQgYWJvcnRlZCBmcm9tIFFJTkZJRk9cbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlyZXR2YWwgPSBTVUNDRVNTOworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlIGlmIChhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgY21kLT5kZXZpY2UtPmx1biwgcGVuZGluZ19zY2ItPmhzY2ItPnRhZywKKwkJCQkgICAgICBST0xFX0lOSVRJQVRPUiwgLypzdGF0dXMqLzAsCisJCQkJICAgICAgU0VBUkNIX0NPVU5UKSA+IDApIHsKKwkJZGlzY29ubmVjdGVkID0gRkFMU0U7CiAJfQogCiAJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOwpAQCAtMTM0OCw2ICsyMTkxLDEwIEBACiAJCWJ1c19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIGFjdGl2ZV9zY2JwdHIpOwogCQlpZiAoYnVzX3NjYiA9PSBwZW5kaW5nX3NjYikKIAkJCWRpc2Nvbm5lY3RlZCA9IEZBTFNFOworCQllbHNlIGlmIChmbGFnICE9IFNDQl9BQk9SVAorCQkJICYmIGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpID09IHBlbmRpbmdfc2NiLT5oc2NiLT5zY3NpaWQKKwkJCSAmJiBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSA9PSBTQ0JfR0VUX0xVTihwZW5kaW5nX3NjYikpCisJCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKIAl9CiAKIAkvKgpAQCAtMTM1NSwxNSArMjIwMiwxOCBAQAogCSAqIHBhc3NlZCBpbiBjb21tYW5kLiAgVGhhdCBjb21tYW5kIGlzIGN1cnJlbnRseSBhY3RpdmUgb24gdGhlCiAJICogYnVzIG9yIGlzIGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUuCiAJICovCisJc2F2ZWRfc2NzaWlkID0gYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCk7CiAJaWYgKGxhc3RfcGhhc2UgIT0gUF9CVVNGUkVFCi0JICYmIFNDQl9HRVRfVEFHKHBlbmRpbmdfc2NiKSA9PSBhY3RpdmVfc2NicHRyKSB7CisJICYmIChTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYikgPT0gYWN0aXZlX3NjYnB0cgorCSAgICAgfHwgKGZsYWcgPT0gU0NCX0RFVklDRV9SRVNFVAorCQkgJiYgU0NTSUlEX1RBUkdFVChhaGQsIHNhdmVkX3Njc2lpZCkgPT0gY21kLT5kZXZpY2UtPmlkKSkpIHsKIAogCQkvKgogCQkgKiBXZSdyZSBhY3RpdmUgb24gdGhlIGJ1cywgc28gYXNzZXJ0IEFUTgogCQkgKiBhbmQgaG9wZSB0aGF0IHRoZSB0YXJnZXQgcmVzcG9uZHMuCiAJCSAqLwogCQlwZW5kaW5nX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWN0aXZlX3NjYnB0cik7Ci0JCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQk9SVDsKKwkJcGVuZGluZ19zY2ItPmZsYWdzIHw9IFNDQl9SRUNPVkVSWV9TQ0J8ZmxhZzsKIAkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CiAJCWFoZF9vdXRiKGFoZCwgU0NTSVNJR08sIGxhc3RfcGhhc2V8QVROTyk7CiAJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IERldmljZSBpcyBhY3RpdmUsIGFzc2VydGluZyBBVE5cbiIsCkBAIC0xNDUxLDEwICsyMzAxLDEwIEBACiAJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCQlpbnQgcmV0OwogCi0JCXBlbmRpbmdfc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfU0NCX1VQX0VIX1NFTTsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfU0NCX1VQX0VIX1NFTTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CiAJCWluaXRfdGltZXIoJnRpbWVyKTsKLQkJdGltZXIuZGF0YSA9ICh1X2xvbmcpcGVuZGluZ19zY2I7CisJCXRpbWVyLmRhdGEgPSAodV9sb25nKWFoZDsKIAkJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoNSAqIEhaKTsKIAkJdGltZXIuZnVuY3Rpb24gPSBhaGRfbGludXhfc2VtX3RpbWVvdXQ7CiAJCWFkZF90aW1lcigmdGltZXIpOwpAQCAtMTQ2OCwzNTQ5ICsyMzE4LDQ3MSBAQAogCQl9CiAJCXNwaW5fbG9ja19pcnEoJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKIAl9Ci0JYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKLQlhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCk7Ci0JYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJnMpOworCXNwaW5fdW5sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOwogCXJldHVybiAocmV0dmFsKTsKIH0KIAotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2Rldl9yZXNldF9jb21wbGV0ZShTY3NpX0NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfd2lkdGgoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgd2lkdGgpCiB7Ci0JZnJlZShjbWQsIE1fREVWQlVGKTsKLX0KLQotLyoKLSAqIEF0dGVtcHQgdG8gc2VuZCBhIHRhcmdldCByZXNldCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgdGhhdCB0aW1lZCBvdXQuCi0gKi8KLXN0YXRpYyBpbnQKLWFoZF9saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICpjbWQpCi17Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCXN0cnVjdAlzY3NpX2NtbmQgKnJlY292ZXJ5X2NtZDsKLQlzdHJ1Y3QJYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKLQlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwotCXN0cnVjdAlzY2IgKnNjYjsKLQlzdHJ1Y3QJaGFyZHdhcmVfc2NiICpoc2NiOwotCXVfbG9uZwlzOwotCXN0cnVjdAl0aW1lcl9saXN0IHRpbWVyOwotCWludAlyZXR2YWw7Ci0KLQlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCXJlY292ZXJ5X2NtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0JaWYgKCFyZWNvdmVyeV9jbWQpCi0JCXJldHVybiAoRkFJTEVEKTsKLQltZW1zZXQocmVjb3ZlcnlfY21kLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfY21uZCkpOwotCXJlY292ZXJ5X2NtZC0+ZGV2aWNlID0gY21kLT5kZXZpY2U7Ci0JcmVjb3ZlcnlfY21kLT5zY3NpX2RvbmUgPSBhaGRfbGludXhfZGV2X3Jlc2V0X2NvbXBsZXRlOwotI2lmZGVmIEFIRF9ERUJVRwotCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCi0JCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IERldmljZSByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCi0JCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCBjbWQpOwotI2VuZGlmCi0JYWhkX2xvY2soYWhkLCAmcyk7Ci0KLQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCi0JCQkJICAgY21kLT5kZXZpY2UtPmx1biwgLyphbGxvYyovRkFMU0UpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQlrZnJlZShyZWNvdmVyeV9jbWQpOwotCQlyZXR1cm4gKEZBSUxFRCk7Ci0JfQotCWlmICgoc2NiID0gYWhkX2dldF9zY2IoYWhkLCBBSERfTkVWRVJfQ09MX0lEWCkpID09IE5VTEwpIHsKLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJa2ZyZWUocmVjb3ZlcnlfY21kKTsKLQkJcmV0dXJuIChGQUlMRUQpOwotCX0KLQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAotCQkJCSAgICBjbWQtPmRldmljZS0+aWQsICZ0c3RhdGUpOwotCXJlY292ZXJ5X2NtZC0+cmVzdWx0ID0gQ0FNX1JFUV9JTlBST0cgPDwgMTY7Ci0JcmVjb3ZlcnlfY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilzY2I7Ci0Jc2NiLT5pb19jdHggPSByZWNvdmVyeV9jbWQ7Ci0Jc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7Ci0Jc2NiLT5zZ19jb3VudCA9IDA7Ci0JYWhkX3NldF9yZXNpZHVhbChzY2IsIDApOwotCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCAwKTsKLQloc2NiID0gc2NiLT5oc2NiOwotCWhzY2ItPmNvbnRyb2wgPSAwOwotCWhzY2ItPnNjc2lpZCA9IEJVSUxEX1NDU0lJRChhaGQsIGNtZCk7Ci0JaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKLQloc2NiLT5jZGJfbGVuID0gMDsKLQloc2NiLT50YXNrX21hbmFnZW1lbnQgPSBTSVVfVEFTS01HTVRfTFVOX1JFU0VUOwotCXNjYi0+ZmxhZ3MgfD0gU0NCX0RFVklDRV9SRVNFVHxTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQ1RJVkU7Ci0JaWYgKCh0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgewotCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOwotCX0gZWxzZSB7Ci0JCWhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKLQl9Ci0JZGV2LT5vcGVuaW5ncy0tOwotCWRldi0+YWN0aXZlKys7Ci0JZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKLQlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKLQlhaGRfcXVldWVfc2NiKGFoZCwgc2NiKTsKLQotCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX1NDQl9VUF9FSF9TRU07Ci0JYWhkX3VubG9jayhhaGQsICZzKTsKLQlpbml0X3RpbWVyKCZ0aW1lcik7Ci0JdGltZXIuZGF0YSA9ICh1X2xvbmcpc2NiOwotCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDUgKiBIWik7Ci0JdGltZXIuZnVuY3Rpb24gPSBhaGRfbGludXhfc2VtX3RpbWVvdXQ7Ci0JYWRkX3RpbWVyKCZ0aW1lcik7Ci0JcHJpbnRmKCJSZWNvdmVyeSBjb2RlIHNsZWVwaW5nXG4iKTsKLQlkb3duKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7Ci0JcHJpbnRmKCJSZWNvdmVyeSBjb2RlIGF3YWtlXG4iKTsKLQlyZXR2YWwgPSBTVUNDRVNTOwotCWlmIChkZWxfdGltZXJfc3luYygmdGltZXIpID09IDApIHsKLQkJcHJpbnRmKCJUaW1lciBFeHBpcmVkXG4iKTsKLQkJcmV0dmFsID0gRkFJTEVEOwotCX0KLQlhaGRfbG9jayhhaGQsICZzKTsKLQlhaGRfc2NoZWR1bGVfcnVucShhaGQpOwotCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCXByaW50ZigiJXM6IERldmljZSByZXNldCByZXR1cm5pbmcgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwgcmV0dmFsKTsKLQlyZXR1cm4gKHJldHZhbCk7Ci19Ci0KLS8qCi0gKiBSZXNldCB0aGUgU0NTSSBidXMuCi0gKi8KLXN0YXRpYyBpbnQKLWFoZF9saW51eF9idXNfcmVzZXQoU2NzaV9DbW5kICpjbWQpCi17Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwotCXVfbG9uZyBzOwotCWludCAgICBmb3VuZDsKLQotCWFoZCA9ICooc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19SRUNPVkVSWSkgIT0gMCkKLQkJcHJpbnRmKCIlczogQnVzIHJlc2V0IGNhbGxlZCBmb3IgY21kICVwXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kKTsKLSNlbmRpZgotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWZvdW5kID0gYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKLQkJCQkgIC8qaW5pdGlhdGUgcmVzZXQqL1RSVUUpOwotCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0JaWYgKGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiBTQ1NJIGJ1cyByZXNldCBkZWxpdmVyZWQuICIKLQkJICAgICAgICIlZCBTQ0JzIGFib3J0ZWQuXG4iLCBhaGRfbmFtZShhaGQpLCBmb3VuZCk7Ci0KLQlyZXR1cm4gKFNVQ0NFU1MpOwotfQotCi1TY3NpX0hvc3RfVGVtcGxhdGUgYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCQk9ICJhaWM3OXh4IiwKLQkucHJvY19pbmZvCQk9IGFoZF9saW51eF9wcm9jX2luZm8sCi0JLmluZm8JCQk9IGFoZF9saW51eF9pbmZvLAotCS5xdWV1ZWNvbW1hbmQJCT0gYWhkX2xpbnV4X3F1ZXVlLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gYWhkX2xpbnV4X2Fib3J0LAotCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IGFoZF9saW51eF9kZXZfcmVzZXQsCi0JLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYWhkX2xpbnV4X2J1c19yZXNldCwKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKQotCS5iaW9zX3BhcmFtCQk9IGFoZF9saW51eF9iaW9zcGFyYW0sCi0jZW5kaWYKLQkuY2FuX3F1ZXVlCQk9IEFIRF9NQVhfUVVFVUUsCi0JLnRoaXNfaWQJCT0gLTEsCi0JLmNtZF9wZXJfbHVuCQk9IDIsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAotCS5zbGF2ZV9hbGxvYwkJPSBhaGRfbGludXhfc2xhdmVfYWxsb2MsCi0JLnNsYXZlX2NvbmZpZ3VyZQk9IGFoZF9saW51eF9zbGF2ZV9jb25maWd1cmUsCi0JLnNsYXZlX2Rlc3Ryb3kJCT0gYWhkX2xpbnV4X3NsYXZlX2Rlc3Ryb3ksCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUYXNrbGV0IEhhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogSW4gMi40LlggYW5kIGFib3ZlLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gYSB0YXNrbGV0LAotICogc28gd2UgbXVzdCByZS1hY3F1aXJlIG91ciBsb2NrIHByaW9yIHRvIGV4ZWN1dGluZyB0aGlzIGNvZGUuCi0gKiBJbiBhbGwgcHJpb3Iga2VybmVscywgYWhkX3NjaGVkdWxlX3J1bnEoKSBjYWxscyB0aGlzIHJvdXRpbmUKLSAqIGRpcmVjdGx5IGFuZCBhaGRfc2NoZWR1bGVfcnVucSgpIGlzIGNhbGxlZCB3aXRoIG91ciBsb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyB2b2lkCi1haGRfcnVucV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjKiBhaGQ7Ci0Jc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQl1X2xvbmcgZmxhZ3M7Ci0KLQlhaGQgPSAoc3RydWN0IGFoZF9zb2Z0YyAqKWRhdGE7Ci0JYWhkX2xvY2soYWhkLCAmZmxhZ3MpOwotCXdoaWxlICgoZGV2ID0gYWhkX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGQpKSAhPSBOVUxMKSB7Ci0JCi0JCVRBSUxRX1JFTU9WRSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7Ci0JCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfT05fUlVOX0xJU1Q7Ci0JCWFoZF9saW51eF9jaGVja19kZXZpY2VfcXVldWUoYWhkLCBkZXYpOwotCQkvKiBZZWlsZCB0byBvdXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQkJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Ci0JCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKLQl9Ci0JYWhkX3VubG9jayhhaGQsICZmbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCdXMgRE1BICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLWFoZF9kbWFfdGFnX2NyZWF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgcGFyZW50LAotCQkgICBidXNfc2l6ZV90IGFsaWdubWVudCwgYnVzX3NpemVfdCBib3VuZGFyeSwKLQkJICAgZG1hX2FkZHJfdCBsb3dhZGRyLCBkbWFfYWRkcl90IGhpZ2hhZGRyLAotCQkgICBidXNfZG1hX2ZpbHRlcl90ICpmaWx0ZXIsIHZvaWQgKmZpbHRlcmFyZywKLQkJICAgYnVzX3NpemVfdCBtYXhzaXplLCBpbnQgbnNlZ21lbnRzLAotCQkgICBidXNfc2l6ZV90IG1heHNlZ3N6LCBpbnQgZmxhZ3MsIGJ1c19kbWFfdGFnX3QgKnJldF90YWcpCi17Ci0JYnVzX2RtYV90YWdfdCBkbWF0OwotCi0JZG1hdCA9IG1hbGxvYyhzaXplb2YoKmRtYXQpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOwotCWlmIChkbWF0ID09IE5VTEwpCi0JCXJldHVybiAoRU5PTUVNKTsKLQotCS8qCi0JICogTGludXggaXMgdmVyeSBzaW1wbGlzdGljIGFib3V0IERNQSBtZW1vcnkuICBGb3Igbm93IGRvbid0Ci0JICogbWFpbnRhaW4gYWxsIHNwZWNpZmljYXRpb24gaW5mb3JtYXRpb24uICBPbmNlIExpbnV4IHN1cHBsaWVzCi0JICogYmV0dGVyIGZhY2lsaXRpZXMgZm9yIGRvaW5nIHRoZXNlIG9wZXJhdGlvbnMsIG9yIHRoZQotCSAqIG5lZWRzIG9mIHRoaXMgcGFydGljdWxhciBkcml2ZXIgY2hhbmdlLCB3ZSBtaWdodCBuZWVkIHRvIGRvCi0JICogbW9yZSBoZXJlLgotCSAqLwotCWRtYXQtPmFsaWdubWVudCA9IGFsaWdubWVudDsKLQlkbWF0LT5ib3VuZGFyeSA9IGJvdW5kYXJ5OwotCWRtYXQtPm1heHNpemUgPSBtYXhzaXplOwotCSpyZXRfdGFnID0gZG1hdDsKLQlyZXR1cm4gKDApOwotfQotCi12b2lkCi1haGRfZG1hX3RhZ19kZXN0cm95KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0KQotewotCWZyZWUoZG1hdCwgTV9ERVZCVUYpOwotfQotCi1pbnQKLWFoZF9kbWFtZW1fYWxsb2Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIHZvaWQqKiB2YWRkciwKLQkJIGludCBmbGFncywgYnVzX2RtYW1hcF90ICptYXBwKQotewotCWJ1c19kbWFtYXBfdCBtYXA7Ci0KLQltYXAgPSBtYWxsb2Moc2l6ZW9mKCptYXApLCBNX0RFVkJVRiwgTV9OT1dBSVQpOwotCWlmIChtYXAgPT0gTlVMTCkKLQkJcmV0dXJuIChFTk9NRU0pOwotCS8qCi0JICogQWx0aG91Z2ggd2UgY2FuIGRtYSBkYXRhIGFib3ZlIDRHQiwgb3VyCi0JICogImNvbnNpc3RlbnQiIG1lbW9yeSBpcyBiZWxvdyA0R0IgZm9yCi0JICogc3BhY2UgZWZmaWNpZW5jeSByZWFzb25zIChvbmx5IG5lZWQgYSA0Ynl0ZQotCSAqIGFkZHJlc3MpLiAgRm9yIHRoaXMgcmVhc29uLCB3ZSBoYXZlIHRvIHJlc2V0Ci0JICogb3VyIGRtYSBtYXNrIHdoZW4gZG9pbmcgYWxsb2NhdGlvbnMuCi0JICovCi0JaWYgKGFoZC0+ZGV2X3NvZnRjICE9IE5VTEwpCi0JCWlmIChwY2lfc2V0X2RtYV9tYXNrKGFoZC0+ZGV2X3NvZnRjLCAweEZGRkZGRkZGKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWljNzl4eDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOwotCQkJa2ZyZWUobWFwKTsKLQkJCXJldHVybiAoRU5PREVWKTsKLQkJfQotCSp2YWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFoZC0+ZGV2X3NvZnRjLAotCQkJCSAgICAgIGRtYXQtPm1heHNpemUsICZtYXAtPmJ1c19hZGRyKTsKLQlpZiAoYWhkLT5kZXZfc29mdGMgIT0gTlVMTCkKLQkJaWYgKHBjaV9zZXRfZG1hX21hc2soYWhkLT5kZXZfc29mdGMsCi0JCQkJICAgICBhaGQtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWljNzl4eDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOwotCQkJa2ZyZWUobWFwKTsKLQkJCXJldHVybiAoRU5PREVWKTsKLQkJfQotCWlmICgqdmFkZHIgPT0gTlVMTCkKLQkJcmV0dXJuIChFTk9NRU0pOwotCSptYXBwID0gbWFwOwotCXJldHVybigwKTsKLX0KLQotdm9pZAotYWhkX2RtYW1lbV9mcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0LAotCQl2b2lkKiB2YWRkciwgYnVzX2RtYW1hcF90IG1hcCkKLXsKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGFoZC0+ZGV2X3NvZnRjLCBkbWF0LT5tYXhzaXplLAotCQkJICAgIHZhZGRyLCBtYXAtPmJ1c19hZGRyKTsKLX0KLQotaW50Ci1haGRfZG1hbWFwX2xvYWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCi0JCXZvaWQgKmJ1ZiwgYnVzX3NpemVfdCBidWZsZW4sIGJ1c19kbWFtYXBfY2FsbGJhY2tfdCAqY2IsCi0JCXZvaWQgKmNiX2FyZywgaW50IGZsYWdzKQotewotCS8qCi0JICogQXNzdW1lIGZvciBub3cgdGhhdCB0aGlzIHdpbGwgb25seSBiZSB1c2VkIGR1cmluZwotCSAqIGluaXRpYWxpemF0aW9uIGFuZCBub3QgZm9yIHBlci10cmFuc2FjdGlvbiBidWZmZXIgbWFwcGluZy4KLQkgKi8KLQlidXNfZG1hX3NlZ21lbnRfdCBzdGFja19zZzsKLQotCXN0YWNrX3NnLmRzX2FkZHIgPSBtYXAtPmJ1c19hZGRyOwotCXN0YWNrX3NnLmRzX2xlbiA9IGRtYXQtPm1heHNpemU7Ci0JY2IoY2JfYXJnLCAmc3RhY2tfc2csIC8qbnNlZyovMSwgLyplcnJvciovMCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotdm9pZAotYWhkX2RtYW1hcF9kZXN0cm95KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQotewotCS8qCi0JICogVGhlIG1hcCBtYXkgaXMgTlVMTCBpbiBvdXIgPCAyLjMuWCBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlpZiAobWFwICE9IE5VTEwpCi0JCWZyZWUobWFwLCBNX0RFVkJVRik7Ci19Ci0KLWludAotYWhkX2RtYW1hcF91bmxvYWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCi17Ci0JLyogTm90aGluZyB0byBkbyAqLwotCXJldHVybiAoMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKiogUGxhdGZvcm0gRGVwZW5kZW50IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ29tcGFyZSAibGVmdCBoYW5kIiBzb2Z0YyB3aXRoICJyaWdodCBoYW5kIiBzb2Z0YywgcmV0dXJuaW5nOgotICogPCAwIC0gbGFoZCBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIHJhaGQKLSAqICAgMCAtIFNvZnRjcyBhcmUgZXF1YWwKLSAqID4gMCAtIGxhaGQgaGFzIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gcmFoZAotICovCi1pbnQKLWFoZF9zb2Z0Y19jb21wKHN0cnVjdCBhaGRfc29mdGMgKmxhaGQsIHN0cnVjdCBhaGRfc29mdGMgKnJhaGQpCi17Ci0JaW50CXZhbHVlOwotCi0JLyoKLQkgKiBVbmRlciBMaW51eCwgY2FyZHMgYXJlIG9yZGVyZWQgYXMgZm9sbG93czoKLQkgKgkxKSBQQ0kgZGV2aWNlcyB0aGF0IGFyZSBtYXJrZWQgYXMgdGhlIGJvb3QgY29udHJvbGxlci4KLQkgKgkyKSBQQ0kgZGV2aWNlcyB3aXRoIEJJT1MgZW5hYmxlZCBzb3J0ZWQgYnkgYnVzL3Nsb3QvZnVuYy4KLQkgKgkzKSBBbGwgcmVtYWluaW5nIFBDSSBkZXZpY2VzIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgotCSAqLwotI2lmIDAKLQl2YWx1ZSA9IChsYWhkLT5mbGFncyAmIEFIRF9CT09UX0NIQU5ORUwpCi0JICAgICAgLSAocmFoZC0+ZmxhZ3MgJiBBSERfQk9PVF9DSEFOTkVMKTsKLQlpZiAodmFsdWUgIT0gMCkKLQkJLyogQ29udHJvbGxlcnMgc2V0IGZvciBib290IGhhdmUgYSAqaGlnaGVyKiBwcmlvcml0eSAqLwotCQlyZXR1cm4gKHZhbHVlKTsKLSNlbmRpZgotCi0JdmFsdWUgPSAobGFoZC0+ZmxhZ3MgJiBBSERfQklPU19FTkFCTEVEKQotCSAgICAgIC0gKHJhaGQtPmZsYWdzICYgQUhEX0JJT1NfRU5BQkxFRCk7Ci0JaWYgKHZhbHVlICE9IDApCi0JCS8qIENvbnRyb2xsZXJzIHdpdGggQklPUyBlbmFibGVkIGhhdmUgYSAqaGlnaGVyKiBwcmlvcml0eSAqLwotCQlyZXR1cm4gKHZhbHVlKTsKLQotCS8qIFN0aWxsIGVxdWFsLiAgU29ydCBieSBidXMvc2xvdC9mdW5jLiAqLwotCWlmIChhaWM3OXh4X3JldmVyc2Vfc2NhbiAhPSAwKQotCQl2YWx1ZSA9IGFoZF9nZXRfcGNpX2J1cyhsYWhkLT5kZXZfc29mdGMpCi0JCSAgICAgIC0gYWhkX2dldF9wY2lfYnVzKHJhaGQtPmRldl9zb2Z0Yyk7Ci0JZWxzZQotCQl2YWx1ZSA9IGFoZF9nZXRfcGNpX2J1cyhyYWhkLT5kZXZfc29mdGMpCi0JCSAgICAgIC0gYWhkX2dldF9wY2lfYnVzKGxhaGQtPmRldl9zb2Z0Yyk7Ci0JaWYgKHZhbHVlICE9IDApCi0JCXJldHVybiAodmFsdWUpOwotCWlmIChhaWM3OXh4X3JldmVyc2Vfc2NhbiAhPSAwKQotCQl2YWx1ZSA9IGFoZF9nZXRfcGNpX3Nsb3QobGFoZC0+ZGV2X3NvZnRjKQotCQkgICAgICAtIGFoZF9nZXRfcGNpX3Nsb3QocmFoZC0+ZGV2X3NvZnRjKTsKLQllbHNlCi0JCXZhbHVlID0gYWhkX2dldF9wY2lfc2xvdChyYWhkLT5kZXZfc29mdGMpCi0JCSAgICAgIC0gYWhkX2dldF9wY2lfc2xvdChsYWhkLT5kZXZfc29mdGMpOwotCWlmICh2YWx1ZSAhPSAwKQotCQlyZXR1cm4gKHZhbHVlKTsKLQotCXZhbHVlID0gcmFoZC0+Y2hhbm5lbCAtIGxhaGQtPmNoYW5uZWw7Ci0JcmV0dXJuICh2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2V0dXBfdGFnX2luZm8odV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKLXsKLQotCWlmICgoaW5zdGFuY2UgPj0gMCkgJiYgKHRhcmcgPj0gMCkKLQkgJiYgKGluc3RhbmNlIDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfdGFnX2luZm8pKQotCSAmJiAodGFyZyA8IEFIRF9OVU1fVEFSR0VUUykpIHsKLQkJYWljNzl4eF90YWdfaW5mb1tpbnN0YW5jZV0udGFnX2NvbW1hbmRzW3RhcmddID0gdmFsdWUgJiAweDFGRjsKLQkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCJ0YWdfaW5mb1slZDolZF0gPSAlZFxuIiwgaW5zdGFuY2UsIHRhcmcsIHZhbHVlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2V0dXBfcmRfc3RybV9pbmZvKHVfbG9uZyBhcmcsIGludCBpbnN0YW5jZSwgaW50IHRhcmcsIGludDMyX3QgdmFsdWUpCi17Ci0JaWYgKChpbnN0YW5jZSA+PSAwKQotCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF9yZF9zdHJtX2luZm8pKSkgewotCQlhaWM3OXh4X3JkX3N0cm1faW5mb1tpbnN0YW5jZV0gPSB2YWx1ZSAmIDB4RkZGRjsKLQkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCJyZF9zdHJtWyVkXSA9IDB4JXhcbiIsIGluc3RhbmNlLCB2YWx1ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X3NldHVwX2R2KHVfbG9uZyBhcmcsIGludCBpbnN0YW5jZSwgaW50IHRhcmcsIGludDMyX3QgdmFsdWUpCi17Ci0JaWYgKChpbnN0YW5jZSA+PSAwKQotCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF9kdl9zZXR0aW5ncykpKSB7Ci0JCWFpYzc5eHhfZHZfc2V0dGluZ3NbaW5zdGFuY2VdID0gdmFsdWU7Ci0JCWlmIChib290dmVyYm9zZSkKLQkJCXByaW50ZigiZHZbJWRdID0gJWRcbiIsIGluc3RhbmNlLCB2YWx1ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvKHVfbG9uZyBpbmRleCwgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKLXsKLQotCWlmICgoaW5zdGFuY2UgPj0gMCkKLQkgJiYgKGluc3RhbmNlIDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfaW9jZWxsX2luZm8pKSkgewotCQl1aW50OF90ICppb2NlbGxfaW5mbzsKLQotCQlpb2NlbGxfaW5mbyA9ICh1aW50OF90KikmYWljNzl4eF9pb2NlbGxfaW5mb1tpbnN0YW5jZV07Ci0JCWlvY2VsbF9pbmZvW2luZGV4XSA9IHZhbHVlICYgMHhGRkZGOwotCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoImlvY2VsbFslZDolbGRdID0gJWRcbiIsIGluc3RhbmNlLCBpbmRleCwgdmFsdWUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwoY2hhciAqcCkKLXsKLQlpbnQgdGFncywgaSwgajsKLQotCXRhZ3MgPSBzaW1wbGVfc3RydG91bChwICsgMSwgTlVMTCwgMCkgJiAweGZmOwotCXByaW50ZigiU2V0dGluZyBHbG9iYWwgVGFncz0gJWRcbiIsIHRhZ3MpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3RhZ19pbmZvKTsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBBSERfTlVNX1RBUkdFVFM7IGorKykgewotCQkJYWljNzl4eF90YWdfaW5mb1tpXS50YWdfY29tbWFuZHNbal0gPSB0YWdzOwotCQl9Ci0JfQotfQotCi0vKgotICogSGFuZGxlIExpbnV4IGJvb3QgcGFyYW1ldGVycy4gVGhpcyByb3V0aW5lIGFsbG93cyBmb3IgYXNzaWduaW5nIGEgdmFsdWUKLSAqIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCi0gKiBpZS4gYWljNzl4eD1zdHB3bGV2OjEsZXh0ZW5kZWQKLSAqLwotc3RhdGljIGludAotYWljNzl4eF9zZXR1cChjaGFyICpzKQotewotCWludAlpLCBuOwotCWNoYXIgICAqcDsKLQljaGFyICAgKmVuZDsKLQotCXN0YXRpYyBzdHJ1Y3QgewotCQljb25zdCBjaGFyICpuYW1lOwotCQl1aW50MzJfdCAqZmxhZzsKLQl9IG9wdGlvbnNbXSA9IHsKLQkJeyAiZXh0ZW5kZWQiLCAmYWljNzl4eF9leHRlbmRlZCB9LAotCQl7ICJub19yZXNldCIsICZhaWM3OXh4X25vX3Jlc2V0IH0sCi0JCXsgInZlcmJvc2UiLCAmYWljNzl4eF92ZXJib3NlIH0sCi0JCXsgImFsbG93X21lbWlvIiwgJmFpYzc5eHhfYWxsb3dfbWVtaW99LAotI2lmZGVmIEFIRF9ERUJVRwotCQl7ICJkZWJ1ZyIsICZhaGRfZGVidWcgfSwKLSNlbmRpZgotCQl7ICJyZXZlcnNlX3NjYW4iLCAmYWljNzl4eF9yZXZlcnNlX3NjYW4gfSwKLQkJeyAicGVyaW9kaWNfb3RhZyIsICZhaWM3OXh4X3BlcmlvZGljX290YWcgfSwKLQkJeyAicGNpX3Bhcml0eSIsICZhaWM3OXh4X3BjaV9wYXJpdHkgfSwKLQkJeyAic2VsdGltZSIsICZhaWM3OXh4X3NlbHRpbWUgfSwKLQkJeyAidGFnX2luZm8iLCBOVUxMIH0sCi0JCXsgImdsb2JhbF90YWdfZGVwdGgiLCBOVUxMfSwKLQkJeyAicmRfc3RybSIsIE5VTEwgfSwKLQkJeyAiZHYiLCBOVUxMIH0sCi0JCXsgInNsZXdyYXRlIiwgTlVMTCB9LAotCQl7ICJwcmVjb21wIiwgTlVMTCB9LAotCQl7ICJhbXBsaXR1ZGUiLCBOVUxMIH0sCi0JfTsKLQotCWVuZCA9IHN0cmNocihzLCAnXDAnKTsKLQotCS8qCi0JICogWFhYIGlhNjQgZ2NjIGlzbid0IHNtYXJ0IGVub3VnaCB0byBrbm93IHRoYXQgTlVNX0VMRU1FTlRTCi0JICogd2lsbCBuZXZlciBiZSAwIGluIHRoaXMgY2FzZS4KLQkgKi8gICAgICAKLQluID0gMDsgIAotCi0Jd2hpbGUgKChwID0gc3Ryc2VwKCZzLCAiLC4iKSkgIT0gTlVMTCkgewotCQlpZiAoKnAgPT0gJ1wwJykKLQkJCWNvbnRpbnVlOwotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU1FTlRTKG9wdGlvbnMpOyBpKyspIHsKLQotCQkJbiA9IHN0cmxlbihvcHRpb25zW2ldLm5hbWUpOwotCQkJaWYgKHN0cm5jbXAob3B0aW9uc1tpXS5uYW1lLCBwLCBuKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IE5VTV9FTEVNRU5UUyhvcHRpb25zKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzdHJuY21wKHAsICJnbG9iYWxfdGFnX2RlcHRoIiwgbikgPT0gMCkgewotCQkJYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChwICsgbik7Ci0JCX0gZWxzZSBpZiAoc3RybmNtcChwLCAidGFnX2luZm8iLCBuKSA9PSAwKSB7Ci0JCQlzID0gYWljX3BhcnNlX2JyYWNlX29wdGlvbigidGFnX2luZm8iLCBwICsgbiwgZW5kLAotCQkJICAgIDIsIGFoZF9saW51eF9zZXR1cF90YWdfaW5mbywgMCk7Ci0JCX0gZWxzZSBpZiAoc3RybmNtcChwLCAicmRfc3RybSIsIG4pID09IDApIHsKLQkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJyZF9zdHJtIiwgcCArIG4sIGVuZCwKLQkJCSAgICAxLCBhaGRfbGludXhfc2V0dXBfcmRfc3RybV9pbmZvLCAwKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJkdiIsIG4pID09IDApIHsKLQkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJkdiIsIHAgKyBuLCBlbmQsIDEsCi0JCQkgICAgYWhkX2xpbnV4X3NldHVwX2R2LCAwKTsKLQkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJzbGV3cmF0ZSIsIG4pID09IDApIHsKLQkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJzbGV3cmF0ZSIsCi0JCQkgICAgcCArIG4sIGVuZCwgMSwgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvLAotCQkJICAgIEFJQzc5WFhfU0xFV1JBVEVfSU5ERVgpOwotCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInByZWNvbXAiLCBuKSA9PSAwKSB7Ci0JCQlzID0gYWljX3BhcnNlX2JyYWNlX29wdGlvbigicHJlY29tcCIsCi0JCQkgICAgcCArIG4sIGVuZCwgMSwgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvLAotCQkJICAgIEFJQzc5WFhfUFJFQ09NUF9JTkRFWCk7Ci0JCX0gZWxzZSBpZiAoc3RybmNtcChwLCAiYW1wbGl0dWRlIiwgbikgPT0gMCkgewotCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oImFtcGxpdHVkZSIsCi0JCQkgICAgcCArIG4sIGVuZCwgMSwgYWhkX2xpbnV4X3NldHVwX2lvY2VsbF9pbmZvLAotCQkJICAgIEFJQzc5WFhfQU1QTElUVURFX0lOREVYKTsKLQkJfSBlbHNlIGlmIChwW25dID09ICc6JykgewotCQkJKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKLQkJfSBlbHNlIGlmICghc3RybmNtcChwLCAidmVyYm9zZSIsIG4pKSB7Ci0JCQkqKG9wdGlvbnNbaV0uZmxhZykgPSAxOwotCQl9IGVsc2UgewotCQkJKihvcHRpb25zW2ldLmZsYWcpIF49IDB4RkZGRkZGRkY7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImFpYzc5eHg9IiwgYWljNzl4eF9zZXR1cCk7Ci0KLXVpbnQzMl90IGFpYzc5eHhfdmVyYm9zZTsKLQotaW50Ci1haGRfbGludXhfcmVnaXN0ZXJfaG9zdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCi17Ci0JY2hhcglidWZbODBdOwotCXN0cnVjdAlTY3NpX0hvc3QgKmhvc3Q7Ci0JY2hhcgkqbmV3X25hbWU7Ci0JdV9sb25nCXM7Ci0JdV9sb25nCXRhcmdldDsKLQotCXRlbXBsYXRlLT5uYW1lID0gYWhkLT5kZXNjcmlwdGlvbjsKLQlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGFoZF9zb2Z0YyAqKSk7Ci0JaWYgKGhvc3QgPT0gTlVMTCkKLQkJcmV0dXJuIChFTk9NRU0pOwotCi0JKigoc3RydWN0IGFoZF9zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSkgPSBhaGQ7Ci0JYWhkX2xvY2soYWhkLCAmcyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKLSNlbGlmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAotCWhvc3QtPmxvY2sgPSAmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2s7Ci0jZW5kaWYKLQlhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgPSBob3N0OwotCWhvc3QtPmNhbl9xdWV1ZSA9IEFIRF9NQVhfUVVFVUU7Ci0JaG9zdC0+Y21kX3Blcl9sdW4gPSAyOwotCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IEFIRF9OU0VHOwotCWhvc3QtPnRoaXNfaWQgPSBhaGQtPm91cl9pZDsKLQlob3N0LT5pcnEgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmlycTsKLQlob3N0LT5tYXhfaWQgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE2IDogODsKLQlob3N0LT5tYXhfbHVuID0gQUhEX05VTV9MVU5TOwotCWhvc3QtPm1heF9jaGFubmVsID0gMDsKLQlob3N0LT5zZ190YWJsZXNpemUgPSBBSERfTlNFRzsKLQlhaGRfc2V0X3VuaXQoYWhkLCBhaGRfbGludXhfbmV4dF91bml0KCkpOwotCXNwcmludGYoYnVmLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7Ci0JbmV3X25hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOwotCWlmIChuZXdfbmFtZSAhPSBOVUxMKSB7Ci0JCXN0cmNweShuZXdfbmFtZSwgYnVmKTsKLQkJYWhkX3NldF9uYW1lKGFoZCwgbmV3X25hbWUpOwotCX0KLQlob3N0LT51bmlxdWVfaWQgPSBhaGQtPnVuaXQ7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2NzaV9zZXRfcGNpX2RldmljZShob3N0LCBhaGQtPmRldl9zb2Z0Yyk7Ci0jZW5kaWYKLQlhaGRfbGludXhfc2V0dXBfdXNlcl9yZF9zdHJtX3NldHRpbmdzKGFoZCk7Ci0JYWhkX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkID0ga2VybmVsX3RocmVhZChhaGRfbGludXhfZHZfdGhyZWFkLCBhaGQsIDApOwotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCA8IDApIHsKLQkJcHJpbnRmKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBEViB0aHJlYWQsIGVycm9yPSAlZFxuIiwKLQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkKTsKLQkJcmV0dXJuICgtYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQpOwotCX0KLQkvKgotCSAqIEluaXRpYWxseSBhbGxvY2F0ZSAqYWxsKiBvZiBvdXIgbGludXggdGFyZ2V0IG9iamVjdHMKLQkgKiBzbyB0aGF0IHRoZSBEViB0aHJlYWQgd2lsbCBzY2FuIHRoZW0gYWxsIGluIHBhcmFsbGVsCi0JICoganVzdCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uICBBbnkgZGV2aWNlIHRoYXQKLQkgKiBkb2VzIG5vdCBleGlzdCB3aWxsIGhhdmUgaXRzIHRhcmdldCBvYmplY3QgZGVzdHJveWVkCi0JICogYnkgdGhlIHNlbGVjdGlvbiB0aW1lb3V0IGhhbmRsZXIuICBJbiB0aGUgY2FzZSBvZiBhCi0JICogZGV2aWNlIHRoYXQgYXBwZWFycyBhZnRlciB0aGUgaW5pdGlhbCBEViBzY2FuLCBhc3luYwotCSAqIG5lZ290aWF0aW9uIHdpbGwgb2NjdXIgZm9yIHRoZSBmaXJzdCBjb21tYW5kLCBhbmQgRFYKLQkgKiB3aWxsIGNvbWVuY2Ugc2hvdWxkIHRoYXQgZmlyc3QgY29tbWFuZCBiZSBzdWNjZXNzZnVsLgotCSAqLwotCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgaG9zdC0+bWF4X2lkOyB0YXJnZXQrKykgewotCi0JCS8qCi0JCSAqIFNraXAgb3VyIG93biBJRC4gIFNvbWUgQ29tcGFxL0hQIHN0b3JhZ2UgZGV2aWNlcwotCQkgKiBoYXZlIGVuY2xvc3VyZSBtYW5hZ2VtZW50IGRldmljZXMgdGhhdCByZXNwb25kIHRvCi0JCSAqIHNpbmdsZSBiaXQgc2VsZWN0aW9uIChpLmUuIHNlbGVjdGluZyBvdXJzZWx2ZXMpLgotCQkgKiBJdCBpcyBleHBlY3RlZCB0aGF0IGVpdGhlciBhbiBleHRlcm5hbCBhcHBsaWNhdGlvbgotCQkgKiBvciBhIG1vZGlmaWVkIGtlcm5lbCB3aWxsIGJlIHVzZWQgdG8gcHJvYmUgdGhpcwotCQkgKiBJRCBpZiBpdCBpcyBhcHByb3ByaWF0ZS4gIFRvIGFjY29tbW9kYXRlIHRoZXNlCi0JCSAqIGluc3RhbGxhdGlvbnMsIGFoY19saW51eF9hbGxvY190YXJnZXQoKSB3aWxsIGFsbG9jYXRlCi0JCSAqIGZvciBvdXIgSUQgaWYgYXNrZWQgdG8gZG8gc28uCi0JCSAqLwotCQlpZiAodGFyZ2V0ID09IGFoZC0+b3VyX2lkKSAKLQkJCWNvbnRpbnVlOwotCi0JCWFoZF9saW51eF9hbGxvY190YXJnZXQoYWhkLCAwLCB0YXJnZXQpOwotCX0KLQlhaGRfaW50cl9lbmFibGUoYWhkLCBUUlVFKTsKLQlhaGRfbGludXhfc3RhcnRfZHYoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXNjc2lfYWRkX2hvc3QoaG9zdCwgJmFoZC0+ZGV2X3NvZnRjLT5kZXYpOyAvKiBYWFggaGFuZGxlIGZhaWx1cmUgKi8KLQlzY3NpX3NjYW5faG9zdChob3N0KTsKLSNlbmRpZgotCXJldHVybiAoMCk7Ci19Ci0KLXVpbnQ2NF90Ci1haGRfbGludXhfZ2V0X21lbXNpemUodm9pZCkKLXsKLQlzdHJ1Y3Qgc3lzaW5mbyBzaTsKLQotCXNpX21lbWluZm8oJnNpKTsKLQlyZXR1cm4gKCh1aW50NjRfdClzaS50b3RhbHJhbSA8PCBQQUdFX1NISUZUKTsKLX0KLQotLyoKLSAqIEZpbmQgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSB1bml0IG51bWJlciB0byB1c2UKLSAqIGZvciBhIG5ldyBkZXZpY2UuICBXZSBkb24ndCBqdXN0IHVzZSBhIHN0YXRpYwotICogY291bnQgdG8gaGFuZGxlIHRoZSAicmVwZWF0ZWQgaG90LSh1bilwbHVnIgotICogc2NlbmFyaW8uCi0gKi8KLXN0YXRpYyBpbnQKLWFoZF9saW51eF9uZXh0X3VuaXQodm9pZCkKLXsKLQlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7Ci0JaW50IHVuaXQ7Ci0KLQl1bml0ID0gMDsKLXJldHJ5OgotCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgewotCQlpZiAoYWhkLT51bml0ID09IHVuaXQpIHsKLQkJCXVuaXQrKzsKLQkJCWdvdG8gcmV0cnk7Ci0JCX0KLQl9Ci0JcmV0dXJuICh1bml0KTsKLX0KLQotLyoKLSAqIFBsYWNlIHRoZSBTQ1NJIGJ1cyBpbnRvIGEga25vd24gc3RhdGUgYnkgZWl0aGVyIHJlc2V0dGluZyBpdCwKLSAqIG9yIGZvcmNpbmcgdHJhbnNmZXIgbmVnb3RpYXRpb25zIG9uIHRoZSBuZXh0IGNvbW1hbmQgdG8gYW55Ci0gKiB0YXJnZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdV9pbnQgdGFyZ2V0X2lkOwotCXVfaW50IG51bXRhcmc7Ci0KLQl0YXJnZXRfaWQgPSAwOwotCW51bXRhcmcgPSAwOwotCi0JaWYgKGFpYzc5eHhfbm9fcmVzZXQgIT0gMCkKLQkJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX0JVU19BOwotCi0JaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX0JVU19BKSAhPSAwKQotCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLyppbml0aWF0ZV9yZXNldCovVFJVRSk7Ci0JZWxzZQotCQludW10YXJnID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNiA6IDg7Ci0KLQkvKgotCSAqIEZvcmNlIG5lZ290aWF0aW9uIHRvIGFzeW5jIGZvciBhbGwgdGFyZ2V0cyB0aGF0Ci0JICogd2lsbCBub3Qgc2VlIGFuIGluaXRpYWwgYnVzIHJlc2V0LgotCSAqLwotCWZvciAoOyB0YXJnZXRfaWQgPCBudW10YXJnOyB0YXJnZXRfaWQrKykgewotCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKLQkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOwotCQlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwotCi0JCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCi0JCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOwotCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZ2V0X2lkLAotCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELCAnQScsIFJPTEVfSU5JVElBVE9SKTsKLQkJYWhkX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGQsICZkZXZpbmZvLCB0c3RhdGUsCi0JCQkJICAgICAgIHRpbmZvLCBBSERfTkVHX0FMV0FZUyk7Ci0JfQotCS8qIEdpdmUgdGhlIGJ1cyBzb21lIHRpbWUgdG8gcmVjb3ZlciAqLwotCWlmICgoYWhkLT5mbGFncyAmIEFIRF9SRVNFVF9CVVNfQSkgIT0gMCkgewotCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKLQkJaW5pdF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhkOwotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPQotCQkgICAgamlmZmllcyArIChBSUM3OVhYX1JFU0VUX0RFTEFZICogSFopLzEwMDA7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPQotCQkgICAgKGFoZF9saW51eF9jYWxsYmFja190ICopYWhkX3JlbGVhc2Vfc2ltcTsKLQkJYWRkX3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKLQl9Ci19Ci0KLWludAotYWhkX3BsYXRmb3JtX2FsbG9jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdm9pZCAqcGxhdGZvcm1fYXJnKQotewotCWFoZC0+cGxhdGZvcm1fZGF0YSA9Ci0JICAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKLQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCi0JCXJldHVybiAoRU5PTUVNKTsKLQltZW1zZXQoYWhkLT5wbGF0Zm9ybV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhKSk7Ci0JVEFJTFFfSU5JVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXEpOwotCVRBSUxRX0lOSVQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEpOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxID0gQUhEX0xJTlVYX05PSVJROwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSAweEZGRkZGRkZGOwotCWFoZF9sb2NraW5pdChhaGQpOwotCWFoZF9kb25lX2xvY2tpbml0KGFoZCk7Ci0JaW5pdF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmRhdGEgPSAodV9sb25nKWFoZDsKLQlhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lci5mdW5jdGlvbiA9Ci0JICAgIChhaGRfbGludXhfY2FsbGJhY2tfdCAqKWFoZF9saW51eF90aHJlYWRfcnVuX2NvbXBsZXRlX3F1ZXVlOwotCWluaXRfTVVURVhfTE9DS0VEKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7Ci0JaW5pdF9NVVRFWF9MT0NLRUQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKLQlpbml0X01VVEVYX0xPQ0tFRCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKLQlhaGRfc2V0dXBfcnVucV90YXNrbGV0KGFoZCk7Ci0JYWhkLT5zZWx0aW1lID0gKGFpYzc5eHhfc2VsdGltZSAmIDB4MykgPDwgNDsKLQlyZXR1cm4gKDApOwotfQotCi12b2lkCi1haGRfcGxhdGZvcm1fZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0Jc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7Ci0Jc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKLQlpbnQgaSwgajsKLQotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEgIT0gTlVMTCkgewotCQlkZWxfdGltZXJfc3luYygmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOwotCQlhaGRfbGludXhfa2lsbF9kdl90aHJlYWQoYWhkKTsKLQkJYWhkX3RlYXJkb3duX3J1bnFfdGFza2xldChhaGQpOwotCQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0ICE9IE5VTEwpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JCQlzY3NpX3JlbW92ZV9ob3N0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Ci0jZW5kaWYKLQkJCXNjc2lfaG9zdF9wdXQoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKLQkJfQotCi0JCS8qIGRlc3Ryb3kgYWxsIG9mIHRoZSBkZXZpY2UgYW5kIHRhcmdldCBvYmplY3RzICovCi0JCWZvciAoaSA9IDA7IGkgPCBBSERfTlVNX1RBUkdFVFM7IGkrKykgewotCQkJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1tpXTsKLQkJCWlmICh0YXJnICE9IE5VTEwpIHsKLQkJCQkvKiBLZWVwIHRhcmdldCBhcm91bmQgdGhyb3VnaCB0aGUgbG9vcC4gKi8KLQkJCQl0YXJnLT5yZWZjb3VudCsrOwotCQkJCWZvciAoaiA9IDA7IGogPCBBSERfTlVNX0xVTlM7IGorKykgewotCi0JCQkJCWlmICh0YXJnLT5kZXZpY2VzW2pdID09IE5VTEwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJZGV2ID0gdGFyZy0+ZGV2aWNlc1tqXTsKLQkJCQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKGFoZCwgZGV2KTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBGb3JjaWJseSBmcmVlIHRoZSB0YXJnZXQgbm93IHRoYXQKLQkJCQkgKiBhbGwgZGV2aWNlcyBhcmUgZ29uZS4KLQkJCQkgKi8KLQkJCQlhaGRfbGludXhfZnJlZV90YXJnZXQoYWhkLCB0YXJnKTsKLQkJCX0KLQkJfQotCi0JCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmlycSAhPSBBSERfTElOVVhfTk9JUlEpCi0JCQlmcmVlX2lycShhaGQtPnBsYXRmb3JtX2RhdGEtPmlycSwgYWhkKTsKLQkJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfUElPCi0JCSAmJiBhaGQtPmJzaHNbMF0uaW9wb3J0ICE9IDApCi0JCQlyZWxlYXNlX3JlZ2lvbihhaGQtPmJzaHNbMF0uaW9wb3J0LCAyNTYpOwotCQlpZiAoYWhkLT50YWdzWzFdID09IEJVU19TUEFDRV9QSU8KLQkJICYmIGFoZC0+YnNoc1sxXS5pb3BvcnQgIT0gMCkKLQkJCXJlbGVhc2VfcmVnaW9uKGFoZC0+YnNoc1sxXS5pb3BvcnQsIDI1Nik7Ci0JCWlmIChhaGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPCi0JCSAmJiBhaGQtPmJzaHNbMF0ubWFkZHIgIT0gTlVMTCkgewotCQkJaW91bm1hcChhaGQtPmJzaHNbMF0ubWFkZHIpOwotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGFoZC0+cGxhdGZvcm1fZGF0YS0+bWVtX2J1c2FkZHIsCi0JCQkJCSAgIDB4MTAwMCk7Ci0JCX0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICAJCS8qCi0JCSAqIEluIDIuNCB3ZSBkZXRhY2ggZnJvbSB0aGUgc2NzaSBtaWRsYXllciBiZWZvcmUgdGhlIFBDSQotCQkgKiBsYXllciBpbnZva2VzIG91ciByZW1vdmUgY2FsbGJhY2suICBObyBwZXItaW5zdGFuY2UKLQkJICogZGV0YWNoIGlzIHByb3ZpZGVkLCBzbyB3ZSBtdXN0IHJlYWNoIGluc2lkZSB0aGUgUENJCi0JCSAqIHN1YnN5c3RlbSdzIGludGVybmFscyBhbmQgZGV0YWNoIG91ciBkcml2ZXIgbWFudWFsbHkuCi0JCSAqLwotCQlpZiAoYWhkLT5kZXZfc29mdGMgIT0gTlVMTCkKLQkJCWFoZC0+ZGV2X3NvZnRjLT5kcml2ZXIgPSBOVUxMOwotI2VuZGlmCi0JCWZyZWUoYWhkLT5wbGF0Zm9ybV9kYXRhLCBNX0RFVkJVRik7Ci0JfQotfQotCi12b2lkCi1haGRfcGxhdGZvcm1faW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JLyoKLQkgKiBMb29rdXAgYW5kIGNvbW1pdCBhbnkgbW9kaWZpZWQgSU8gQ2VsbCBvcHRpb25zLgotCSAqLwotCWlmIChhaGQtPnVuaXQgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF9pb2NlbGxfaW5mbykpIHsKLQkJc3RydWN0IGFoZF9saW51eF9pb2NlbGxfb3B0cyAqaW9jZWxsX29wdHM7Ci0KLQkJaW9jZWxsX29wdHMgPSAmYWljNzl4eF9pb2NlbGxfaW5mb1thaGQtPnVuaXRdOwotCQlpZiAoaW9jZWxsX29wdHMtPnByZWNvbXAgIT0gQUlDNzlYWF9ERUZBVUxUX1BSRUNPTVApCi0JCQlBSERfU0VUX1BSRUNPTVAoYWhkLCBpb2NlbGxfb3B0cy0+cHJlY29tcCk7Ci0JCWlmIChpb2NlbGxfb3B0cy0+c2xld3JhdGUgIT0gQUlDNzlYWF9ERUZBVUxUX1NMRVdSQVRFKQotCQkJQUhEX1NFVF9TTEVXUkFURShhaGQsIGlvY2VsbF9vcHRzLT5zbGV3cmF0ZSk7Ci0JCWlmIChpb2NlbGxfb3B0cy0+YW1wbGl0dWRlICE9IEFJQzc5WFhfREVGQVVMVF9BTVBMSVRVREUpCi0JCQlBSERfU0VUX0FNUExJVFVERShhaGQsIGlvY2VsbF9vcHRzLT5hbXBsaXR1ZGUpOwotCX0KLQotfQotCi12b2lkCi1haGRfcGxhdGZvcm1fZnJlZXplX2RldnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0JYWhkX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhkLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCi0JCQkJU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKLQkJCQlTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfTElTVF9OVUxMLAotCQkJCVJPTEVfVU5LTk9XTiwgQ0FNX1JFUVVFVUVfUkVRKTsKLX0KLQotdm9pZAotYWhkX3BsYXRmb3JtX3NldF90YWdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAotCQkgICAgICBhaGRfcXVldWVfYWxnIGFsZykKLXsKLQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCWludCB3YXNfcXVldWluZzsKLQlpbnQgbm93X3F1ZXVpbmc7Ci0KLQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmluZm8tPmNoYW5uZWwgLSAnQScsCi0JCQkJICAgZGV2aW5mby0+dGFyZ2V0LAotCQkJCSAgIGRldmluZm8tPmx1biwgLyphbGxvYyovRkFMU0UpOwotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXdhc19xdWV1aW5nID0gZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUN8QUhEX0RFVl9RX1RBR0dFRCk7Ci0Jc3dpdGNoIChhbGcpIHsKLQlkZWZhdWx0OgotCWNhc2UgQUhEX1FVRVVFX05PTkU6Ci0JCW5vd19xdWV1aW5nID0gMDsKLQkJYnJlYWs7IAotCWNhc2UgQUhEX1FVRVVFX0JBU0lDOgotCQlub3dfcXVldWluZyA9IEFIRF9ERVZfUV9CQVNJQzsKLQkJYnJlYWs7Ci0JY2FzZSBBSERfUVVFVUVfVEFHR0VEOgotCQlub3dfcXVldWluZyA9IEFIRF9ERVZfUV9UQUdHRUQ7Ci0JCWJyZWFrOwotCX0KLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX0ZSRUVaRV9USUxfRU1QVFkpID09IDAKLQkgJiYgKHdhc19xdWV1aW5nICE9IG5vd19xdWV1aW5nKQotCSAmJiAoZGV2LT5hY3RpdmUgIT0gMCkpIHsKLQkJZGV2LT5mbGFncyB8PSBBSERfREVWX0ZSRUVaRV9USUxfRU1QVFk7Ci0JCWRldi0+cWZyb3plbisrOwotCX0KLQotCWRldi0+ZmxhZ3MgJj0gfihBSERfREVWX1FfQkFTSUN8QUhEX0RFVl9RX1RBR0dFRHxBSERfREVWX1BFUklPRElDX09UQUcpOwotCWlmIChub3dfcXVldWluZykgewotCQl1X2ludCB1c2VydGFnczsKLQotCQl1c2VydGFncyA9IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKGFoZCwgZGV2aW5mbyk7Ci0JCWlmICghd2FzX3F1ZXVpbmcpIHsKLQkJCS8qCi0JCQkgKiBTdGFydCBvdXQgYWdyZXNzaXZlbHkgYW5kIGFsbG93IG91cgotCQkJICogZHluYW1pYyBxdWV1ZSBkZXB0aCBhbGdvcml0aG0gdG8gdGFrZQotCQkJICogY2FyZSBvZiB0aGUgcmVzdC4KLQkJCSAqLwotCQkJZGV2LT5tYXh0YWdzID0gdXNlcnRhZ3M7Ci0JCQlkZXYtPm9wZW5pbmdzID0gZGV2LT5tYXh0YWdzIC0gZGV2LT5hY3RpdmU7Ci0JCX0KLQkJaWYgKGRldi0+bWF4dGFncyA9PSAwKSB7Ci0JCQkvKgotCQkJICogUXVldWVpbmcgaXMgZGlzYWJsZWQgYnkgdGhlIHVzZXIuCi0JCQkgKi8KLQkJCWRldi0+b3BlbmluZ3MgPSAxOwotCQl9IGVsc2UgaWYgKGFsZyA9PSBBSERfUVVFVUVfVEFHR0VEKSB7Ci0JCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUV9UQUdHRUQ7Ci0JCQlpZiAoYWljNzl4eF9wZXJpb2RpY19vdGFnICE9IDApCi0JCQkJZGV2LT5mbGFncyB8PSBBSERfREVWX1BFUklPRElDX09UQUc7Ci0JCX0gZWxzZQotCQkJZGV2LT5mbGFncyB8PSBBSERfREVWX1FfQkFTSUM7Ci0JfSBlbHNlIHsKLQkJLyogV2UgY2FuIG9ubHkgaGF2ZSBvbmUgb3BlbmluZy4gKi8KLQkJZGV2LT5tYXh0YWdzID0gMDsKLQkJZGV2LT5vcGVuaW5ncyA9ICAxIC0gZGV2LT5hY3RpdmU7Ci0JfQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlpZiAoZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMKSB7Ci0JCXN3aXRjaCAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX0JBU0lDfEFIRF9ERVZfUV9UQUdHRUQpKSkgewotCQljYXNlIEFIRF9ERVZfUV9CQVNJQzoKLQkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldi0+c2NzaV9kZXZpY2UsCi0JCQkJCQlNU0dfU0lNUExFX1RBU0ssCi0JCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUhEX0RFVl9RX1RBR0dFRDoKLQkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldi0+c2NzaV9kZXZpY2UsCi0JCQkJCQlNU0dfT1JERVJFRF9UQVNLLAotCQkJCQkJZGV2LT5vcGVuaW5ncyArIGRldi0+YWN0aXZlKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyoKLQkJCSAqIFdlIGFsbG93IHRoZSBPUyB0byBxdWV1ZSAyIHVudGFnZ2VkIHRyYW5zYWN0aW9ucyB0bwotCQkJICogdXMgYXQgYW55IHRpbWUgZXZlbiB0aG91Z2ggd2UgY2FuIG9ubHkgZXhlY3V0ZSB0aGVtCi0JCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuICBUaGlzIHNob3VsZAotCQkJICogcmVtb3ZlIHNvbWUgbGF0ZW5jeS4KLQkJCSAqLwotCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKLQkJCQkJCS8qTk9OLVRBR0dFRCovMCwKLQkJCQkJCS8qcXVldWUgZGVwdGgqLzIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotaW50Ci1haGRfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKLQkJCWludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cykKLXsKLQlpbnQgdGFyZzsKLQlpbnQgbWF4dGFyZzsKLQlpbnQgbWF4bHVuOwotCWludCBjbHVuOwotCWludCBjb3VudDsKLQotCWlmICh0YWcgIT0gU0NCX0xJU1RfTlVMTCkKLQkJcmV0dXJuICgwKTsKLQotCXRhcmcgPSAwOwotCWlmICh0YXJnZXQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgewotCQl0YXJnID0gdGFyZ2V0OwotCQltYXh0YXJnID0gdGFyZyArIDE7Ci0JfSBlbHNlIHsKLQkJbWF4dGFyZyA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTYgOiA4OwotCX0KLQljbHVuID0gMDsKLQlpZiAobHVuICE9IENBTV9MVU5fV0lMRENBUkQpIHsKLQkJY2x1biA9IGx1bjsKLQkJbWF4bHVuID0gY2x1biArIDE7Ci0JfSBlbHNlIHsKLQkJbWF4bHVuID0gQUhEX05VTV9MVU5TOwotCX0KLQotCWNvdW50ID0gMDsKLQlmb3IgKDsgdGFyZyA8IG1heHRhcmc7IHRhcmcrKykgewotCi0JCWZvciAoOyBjbHVuIDwgbWF4bHVuOyBjbHVuKyspIHsKLQkJCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JCQlzdHJ1Y3QgYWhkX2J1c3lxICpidXN5cTsKLQkJCXN0cnVjdCBhaGRfY21kICphY21kOwotCi0JCQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIC8qY2hhbiovMCwgdGFyZywKLQkJCQkJCSAgIGNsdW4sIC8qYWxsb2MqL0ZBTFNFKTsKLQkJCWlmIChkZXYgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJYnVzeXEgPSAmZGV2LT5idXN5cTsKLQkJCXdoaWxlICgoYWNtZCA9IFRBSUxRX0ZJUlNUKGJ1c3lxKSkgIT0gTlVMTCkgewotCQkJCVNjc2lfQ21uZCAqY21kOwotCi0JCQkJY21kID0gJmFjbWRfc2NzaV9jbWQoYWNtZCk7Ci0JCQkJVEFJTFFfUkVNT1ZFKGJ1c3lxLCBhY21kLAotCQkJCQkgICAgIGFjbWRfbGlua3MudHFlKTsKLQkJCQljb3VudCsrOwotCQkJCWNtZC0+cmVzdWx0ID0gc3RhdHVzIDw8IDE2OwotCQkJCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIChjb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdV9sb25nIGZsYWdzOwotCi0JYWhkX2xvY2soYWhkLCAmZmxhZ3MpOwotCWRlbF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9SVU5fQ01QTFRfUV9USU1FUjsKLQlhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCk7Ci0JYWhkX3VubG9jayhhaGQsICZmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc3RhcnRfZHYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCi0JLyoKLQkgKiBGcmVlemUgdGhlIHNpbXEgYW5kIHNpZ25hbCBhaGRfbGludXhfcXVldWUgdG8gbm90IGxldCBhbnkKLQkgKiBtb3JlIGNvbW1hbmRzIHRocm91Z2gKLQkgKi8KLQlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfQUNUSVZFKSA9PSAwKSB7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKLQkJCXByaW50ZigiJXM6IFN0YXJ0aW5nIERWXG4iLCBhaGRfbmFtZShhaGQpKTsKLSNlbmRpZgotCi0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX0RWX0FDVElWRTsKLQkJYWhkX2ZyZWV6ZV9zaW1xKGFoZCk7Ci0KLQkJLyogV2FrZSB1cCB0aGUgRFYga3RocmVhZCAqLwotCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCX0KLX0KLQotc3RhdGljIGludAotYWhkX2xpbnV4X2R2X3RocmVhZCh2b2lkICpkYXRhKQotewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQlpbnQJdGFyZ2V0OwotCXVfbG9uZwlzOwotCi0JYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKilkYXRhOwotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQotCQlwcmludGYoIkluIERWIFRocmVhZFxuIik7Ci0jZW5kaWYKLQotCS8qCi0JICogQ29tcGxldGUgdGhyZWFkIGNyZWF0aW9uLgotCSAqLwotCWxvY2tfa2VybmVsKCk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDYwKQotCS8qCi0JICogRG9uJ3QgY2FyZSBhYm91dCBhbnkgc2lnbmFscy4KLQkgKi8KLQlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCAwKTsKLQotCWRhZW1vbml6ZSgpOwotCXNwcmludGYoY3VycmVudC0+Y29tbSwgImFoZF9kdl8lZCIsIGFoZC0+dW5pdCk7Ci0jZWxzZQotCWRhZW1vbml6ZSgiYWhkX2R2XyVkIiwgYWhkLT51bml0KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLSNlbmRpZgotCXVubG9ja19rZXJuZWwoKTsKLQotCXdoaWxlICgxKSB7Ci0JCS8qCi0JCSAqIFVzZSBkb3duX2ludGVycnVwdGlibGUoKSByYXRoZXIgdGhhbiBkb3duKCkgdG8KLQkJICogYXZvaWQgaW5jbHVzaW9uIGluIHRoZSBsb2FkIGF2ZXJhZ2UuCi0JCSAqLwotCQlkb3duX2ludGVycnVwdGlibGUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKLQotCQkvKiBDaGVjayB0byBzZWUgaWYgd2UndmUgYmVlbiBzaWduYWxlZCB0byBleGl0ICovCi0JCWFoZF9sb2NrKGFoZCwgJnMpOwotCQlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfU0hVVERPV04pICE9IDApIHsKLQkJCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0JCQlicmVhazsKLQkJfQotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0jaWZkZWYgQUhEX0RFQlVHCi0JCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKLQkJCXByaW50ZigiJXM6IEJlZ2lubmluZyBEb21haW4gVmFsaWRhdGlvblxuIiwKLQkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKLSNlbmRpZgotCi0JCS8qCi0JCSAqIFdhaXQgZm9yIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIGRyYWluIGJlZm9yZSBwcm9jZWVkaW5nLgotCQkgKi8KLQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCXdoaWxlIChMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2NicykgIT0gTlVMTCkgewotCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX0VNUFRZOwotCQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCX0KLQotCQkvKgotCQkgKiBXYWl0IGZvciB0aGUgU0lNUSB0byBiZSByZWxlYXNlZCBzbyB0aGF0IERWIGlzIHRoZQotCQkgKiBvbmx5IHJlYXNvbiB0aGUgcXVldWUgaXMgZnJvemVuLgotCQkgKi8KLQkJd2hpbGUgKEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpID09IDApIHsKLQkJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX0RWX1dBSVRfU0lNUV9SRUxFQVNFOwotCQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOwotCQkJYWhkX2xvY2soYWhkLCAmcyk7Ci0JCX0KLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQotCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspCi0JCQlhaGRfbGludXhfZHZfdGFyZ2V0KGFoZCwgdGFyZ2V0KTsKLQotCQlhaGRfbG9jayhhaGQsICZzKTsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX0RWX0FDVElWRTsKLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQotCQkvKgotCQkgKiBSZWxlYXNlIHRoZSBTSU1RIHNvIHRoYXQgbm9ybWFsIGNvbW1hbmRzIGFyZQotCQkgKiBhbGxvd2VkIHRvIGNvbnRpbnVlIG9uIHRoZSBidXMuCi0JCSAqLwotCQlhaGRfcmVsZWFzZV9zaW1xKGFoZCk7Ci0JfQotCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9raWxsX2R2X3RocmVhZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdV9sb25nIHM7Ci0KLQlhaGRfbG9jayhhaGQsICZzKTsKLQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgIT0gMCkgewotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9EVl9TSFVURE9XTjsKLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKLQotCQkvKgotCQkgKiBVc2UgdGhlIGVoX3NlbSBhcyBhbiBpbmRpY2F0b3IgdGhhdCB0aGUKLQkJICogZHYgdGhyZWFkIGlzIGV4aXRpbmcuICBOb3RlIHRoYXQgdGhlIGR2Ci0JCSAqIHRocmVhZCBtdXN0IHN0aWxsIHJldHVybiBhZnRlciBwZXJmb3JtaW5nCi0JCSAqIHRoZSB1cCBvbiBvdXIgc2VtYXBob3JlIGJlZm9yZSBpdCBoYXMKLQkJICogY29tcGxldGVseSBleGl0ZWQgdGhpcyBtb2R1bGUuICBVbmZvcnR1bmF0ZWx5LAotCQkgKiB0aGVyZSBzZWVtcyB0byBiZSBubyBlYXN5IHdheSB0byB3YWl0IGZvciB0aGUKLQkJICogZXhpdCBvZiBhIHRocmVhZCBmb3Igd2hpY2ggeW91IGFyZSBub3QgdGhlCi0JCSAqIHBhcmVudCAoZHYgdGhyZWFkcyBhcmUgcGFyZW50ZWQgYnkgaW5pdCkuCi0JCSAqIENyb3NzIHlvdXIgZmluZ2Vycy4uLgotCQkgKi8KLQkJZG93bigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOwotCi0JCS8qCi0JCSAqIE1hcmsgdGhlIGR2IHRocmVhZCBhcyBhbHJlYWR5IGRlYWQuICBUaGlzCi0JCSAqIGF2b2lkcyBhdHRlbXB0aW5nIHRvIGtpbGwgaXQgYSBzZWNvbmQgdGltZS4KLQkJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtdXN0IGtpbGwgdGhlCi0JCSAqIERWIHRocmVhZCBiZWZvcmUgY2FsbGluZyBhaGRfZnJlZSgpIGluIHRoZQotCQkgKiBtb2R1bGUgc2h1dGRvd24gY2FzZSB0byBhdm9pZCBib2d1cyBsb2NraW5nCi0JCSAqIGluIHRoZSBTQ1NJIG1pZC1sYXllciwgYnV0IHdlIGFoZF9mcmVlKCkgaXMKLQkJICogY2FsbGVkIHdpdGhvdXQga2lsbGluZyB0aGUgRFYgdGhyZWFkIGluIHRoZQotCQkgKiBpbnN0YW5jZSBkZXRhY2ggY2FzZSwgc28gYWhkX3BsYXRmb3JtX2ZyZWUoKQotCQkgKiBjYWxscyB1cyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUgRFYgdGhyZWFkCi0JCSAqIGlzIGRlYWQuCi0JCSAqLwotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCA9IDA7Ci0JfSBlbHNlIHsKLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQl9Ci19Ci0KLSNkZWZpbmUgQUhEX0xJTlVYX0RWX0lOUV9TSE9SVF9MRU4JMzYKLSNkZWZpbmUgQUhEX0xJTlVYX0RWX0lOUV9MRU4JCTI1NgotI2RlZmluZSBBSERfTElOVVhfRFZfVElNRU9VVAkJKEhaIC8gNCkKLQotI2RlZmluZSBBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgbmV3c3RhdGUpIFwKLQlhaGRfc2V0X2R2X3N0YXRlKGFoZCwgdGFyZywgbmV3c3RhdGUsIF9fTElORV9fKQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3NldF9kdl9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAotCQkgYWhkX2R2X3N0YXRlIG5ld3N0YXRlLCB1X2ludCBsaW5lKQotewotCWFoZF9kdl9zdGF0ZSBvbGRzdGF0ZTsKLQotCW9sZHN0YXRlID0gdGFyZy0+ZHZfc3RhdGU7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQotCQlwcmludGYoIiVzOiVkOiBHb2luZyBmcm9tIHN0YXRlICVkIHRvIHN0YXRlICVkXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSwgbGluZSwgb2xkc3RhdGUsIG5ld3N0YXRlKTsKLSNlbmRpZgotCi0JaWYgKG9sZHN0YXRlID09IG5ld3N0YXRlKQotCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSsrOwotCWVsc2UKLQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOwotCXRhcmctPmR2X3N0YXRlID0gbmV3c3RhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfdGFyZ2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGFyZ2V0X29mZnNldCkKLXsKLQlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87Ci0Jc3RydWN0CSBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOwotCXN0cnVjdAkgc2NzaV9jbW5kICpjbWQ7Ci0Jc3RydWN0CSBzY3NpX2RldmljZSAqc2NzaV9kZXY7Ci0Jc3RydWN0CSBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlOwotCXVpbnQ4X3QgKmJ1ZmZlcjsKLQl1X2xvbmcJIHM7Ci0JdV9pbnQJIHRpbWVvdXQ7Ci0JaW50CSBlY2hvX3NpemU7Ci0KLQlzZW5zZSA9IE5VTEw7Ci0JYnVmZmVyID0gTlVMTDsKLQllY2hvX3NpemUgPSAwOwotCWFoZF9sb2NrKGFoZCwgJnMpOwotCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07Ci0JaWYgKHRhcmcgPT0gTlVMTCB8fCAodGFyZy0+ZmxhZ3MgJiBBSERfRFZfUkVRVUlSRUQpID09IDApIHsKLQkJYWhkX3VubG9jayhhaGQsICZzKTsKLQkJcmV0dXJuOwotCX0KLQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZy0+dGFyZ2V0LCAvKmx1biovMCwKLQkJCSAgICB0YXJnLT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQlwcmludGYoIlBlcmZvcm1pbmcgRFZcbiIpOwotCX0KLSNlbmRpZgotCi0JYWhkX3VubG9jayhhaGQsICZzKTsKLQotCWNtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0Jc2NzaV9kZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3NpX2RldmljZSksIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0Jc2NzaV9kZXYtPmhvc3QgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3Q7Ci0Jc2NzaV9kZXYtPmlkID0gZGV2aW5mby50YXJnZXQ7Ci0Jc2NzaV9kZXYtPmx1biA9IGRldmluZm8ubHVuOwotCXNjc2lfZGV2LT5jaGFubmVsID0gZGV2aW5mby5jaGFubmVsIC0gJ0EnOwotCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgPSBzY3NpX2RldjsKLQotCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQotCXdoaWxlICh0YXJnLT5kdl9zdGF0ZSAhPSBBSERfRFZfU1RBVEVfRVhJVCkgewotCQl0aW1lb3V0ID0gQUhEX0xJTlVYX0RWX1RJTUVPVVQ7Ci0JCXN3aXRjaCAodGFyZy0+ZHZfc3RhdGUpIHsKLQkJY2FzZSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DOgotCQljYXNlIEFIRF9EVl9TVEFURV9JTlFfQVNZTkM6Ci0JCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlk6Ci0JCQkvKgotCQkJICogU2V0IHRoaW5ncyB0byBhc3luYyBuYXJyb3cgdG8gcmVkdWNlIHRoZQotCQkJICogY2hhbmNlIHRoYXQgdGhlIElOUSB3aWxsIGZhaWwuCi0JCQkgKi8KLQkJCWFoZF9sb2NrKGFoZCwgJnMpOwotCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAwLCAwLCAwLAotCQkJCQkgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7Ci0JCQlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCi0JCQkJICAgICAgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7Ci0JCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQkJdGltZW91dCA9IDEwICogSFo7Ci0JCQl0YXJnLT5mbGFncyAmPSB+QUhEX0lOUV9WQUxJRDsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlk6Ci0JCXsKLQkJCXVfaW50IGlucV9sZW47Ci0KLQkJCWlmICh0YXJnLT5kdl9zdGF0ZSA9PSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKQotCQkJCWlucV9sZW4gPSBBSERfTElOVVhfRFZfSU5RX1NIT1JUX0xFTjsKLQkJCWVsc2UKLQkJCQlpbnFfbGVuID0gdGFyZy0+aW5xX2RhdGEtPmFkZGl0aW9uYWxfbGVuZ3RoICsgNTsKLQkJCWFoZF9saW51eF9kdl9pbnEoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnLCBpbnFfbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQUhEX0RWX1NUQVRFX1RVUjoKLQkJY2FzZSBBSERfRFZfU1RBVEVfQlVTWToKLQkJCXRpbWVvdXQgPSA1ICogSFo7Ci0JCQlhaGRfbGludXhfZHZfdHVyKGFoZCwgY21kLCAmZGV2aW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBBSERfRFZfU1RBVEVfUkVCRDoKLQkJCWFoZF9saW51eF9kdl9yZWJkKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7Ci0JCQlicmVhazsKLQkJY2FzZSBBSERfRFZfU1RBVEVfV0VCOgotCQkJYWhkX2xpbnV4X2R2X3dlYihhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBSERfRFZfU1RBVEVfUkVCOgotCQkJYWhkX2xpbnV4X2R2X3JlYihhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBSERfRFZfU1RBVEVfU1U6Ci0JCQlhaGRfbGludXhfZHZfc3UoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKLQkJCXRpbWVvdXQgPSA1MCAqIEhaOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQkJcHJpbnRmKCJVbmtub3duIERWIHN0YXRlICVkXG4iLCB0YXJnLT5kdl9zdGF0ZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qIFF1ZXVlIHRoZSBjb21tYW5kIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLwotCQkvKiBBYnVzZSBlaF90aW1lb3V0IGluIHRoZSBzY3NpX2NtbmQgc3RydWN0IGZvciBvdXIgcHVycG9zZXMgKi8KLQkJaW5pdF90aW1lcigmY21kLT5laF90aW1lb3V0KTsKLSNpZmRlZiBBSERfREVCVUcKLQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKLQkJCS8qCi0JCQkgKiBBbGwgb2YgdGhlIHByaW50ZnMgZHVyaW5nIG5lZ290aWF0aW9uCi0JCQkgKiByZWFsbHkgc2xvdyBkb3duIHRoZSBuZWdvdGlhdGlvbi4KLQkJCSAqIEFkZCBhIGJpdCBvZiB0aW1lIGp1c3QgdG8gYmUgc2FmZS4KLQkJCSAqLwotCQkJdGltZW91dCArPSBIWjsKLSNlbmRpZgotCQlzY3NpX2FkZF90aW1lcihjbWQsIHRpbWVvdXQsIGFoZF9saW51eF9kdl90aW1lb3V0KTsKLQkJLyoKLQkJICogSW4gMi41LlgsIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgY2FsbHMgZnJvbSB0aGUKLQkJICogIm1pZGxheWVyIiAod2hpY2ggd2UgYXJlIGVtdWxhdGluZykgd2lsbCBoYXZlIHRoZQotCQkgKiBhaGQgaG9zdCBsb2NrIGhlbGQuICBGb3Igb3RoZXIga2VybmVscywgdGhlCi0JCSAqIGlvX3JlcXVlc3RfbG9jayBtdXN0IGJlIGhlbGQuCi0JCSAqLwotI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAotCQlhaGRfbG9jayhhaGQsICZzKTsKLSNlbHNlCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssIHMpOwotI2VuZGlmCi0JCWFoZF9saW51eF9xdWV1ZShjbWQsIGFoZF9saW51eF9kdl9jb21wbGV0ZSk7Ci0jaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCi0JCWFoZF91bmxvY2soYWhkLCAmcyk7Ci0jZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb19yZXF1ZXN0X2xvY2ssIHMpOwotI2VuZGlmCi0JCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKLQkJLyoKLQkJICogV2FpdCBmb3IgdGhlIFNJTVEgdG8gYmUgcmVsZWFzZWQgc28gdGhhdCBEViBpcyB0aGUKLQkJICogb25seSByZWFzb24gdGhlIHF1ZXVlIGlzIGZyb3plbi4KLQkJICovCi0JCWFoZF9sb2NrKGFoZCwgJnMpOwotCQl3aGlsZSAoQUhEX0RWX1NJTVFfRlJPWkVOKGFoZCkgPT0gMCkgewotCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0U7Ci0JCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7Ci0JCQlhaGRfbG9jayhhaGQsICZzKTsKLQkJfQotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0JCWFoZF9saW51eF9kdl90cmFuc2l0aW9uKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7Ci0JfQotCi1vdXQ6Ci0JaWYgKCh0YXJnLT5mbGFncyAmIEFIRF9JTlFfVkFMSUQpICE9IDAKLQkgJiYgYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBkZXZpbmZvLmNoYW5uZWwgLSAnQScsCi0JCQkJIGRldmluZm8udGFyZ2V0LCBkZXZpbmZvLmx1biwKLQkJCQkgLyphbGxvYyovRkFMU0UpID09IE5VTEwpIHsKLQkJLyoKLQkJICogVGhlIERWIHN0YXRlIG1hY2hpbmUgZmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGlzIGRldmljZS4gIAotCQkgKiBUaGlzIGlzIG5vcm1hbCBpZiBEViBpcyBkaXNhYmxlZC4gIFNpbmNlIHdlIGhhdmUgaW5xdWlyeQotCQkgKiBkYXRhLCBmaWx0ZXIgaXQgYW5kIHVzZSB0aGUgIm9wdGltaXN0aWMiIG5lZ290aWF0aW9uCi0JCSAqIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIGlucXVpcnkgc3RyaW5nLgotCQkgKi8KLQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgJmRldmluZm8pOwotCQlpZiAoKHRhcmctPmZsYWdzICYgKEFIRF9CQVNJQ19EVnxBSERfRU5IQU5DRURfRFYpKSAhPSAwKSB7Ci0JCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKLQkJCXByaW50ZigiRFYgZmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXZpY2UuICAiCi0JCQkgICAgICAgIlBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBhZ2FpbnN0ICIKLQkJCSAgICAgICAidGhpcyBkcml2ZXIuXG4iKTsKLQkJfQotCX0KLQotCWlmIChjbWQgIT0gTlVMTCkKLQkJZnJlZShjbWQsIE1fREVWQlVGKTsKLQotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2ICE9IE5VTEwpIHsKLQkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2LCBNX0RFVkJVRik7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgPSBOVUxMOwotCX0KLQotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkgewotCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOwotCQl0YXJnLT5kdl9idWZmZXIgPSBOVUxMOwotCX0KLQlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKSB7Ci0JCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOwotCQl0YXJnLT5kdl9idWZmZXIxID0gTlVMTDsKLQl9Ci0JdGFyZy0+ZmxhZ3MgJj0gfkFIRF9EVl9SRVFVSVJFRDsKLQlpZiAodGFyZy0+cmVmY291bnQgPT0gMCkKLQkJYWhkX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoZCwgdGFyZyk7Ci0JYWhkX3VubG9jayhhaGQsICZzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIGludAotYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQotewotCXVfbG9uZyBzOwotCWludCByZXR2YWw7Ci0KLQlhaGRfbG9jayhhaGQsICZzKTsKLQlyZXR2YWwgPSBhaGRfbGludXhfZmFsbGJhY2soYWhkLCBkZXZpbmZvKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCi0JcmV0dXJuIChyZXR2YWwpOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKLXsKLQl1X2ludDMyX3Qgc3RhdHVzOwotCi0Jc3RhdHVzID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIHRhcmctPmlucV9kYXRhLAotCQkJCSAgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCksCi0JCQkJICBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpKTsKLQotCQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIkVudGVyaW5nIGFoZF9saW51eF9kdl90cmFuc2l0aW9uLCBzdGF0ZT0gJWQsICIKLQkJICAgICAgICJzdGF0dXM9IDB4JXgsIGNtZC0+cmVzdWx0PSAweCV4XG4iLCB0YXJnLT5kdl9zdGF0ZSwKLQkJICAgICAgIHN0YXR1cywgY21kLT5yZXN1bHQpOwotCX0KLSNlbmRpZgotCi0Jc3dpdGNoICh0YXJnLT5kdl9zdGF0ZSkgewotCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQzoKLQljYXNlIEFIRF9EVl9TVEFURV9JTlFfQVNZTkM6Ci0JCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgewotCQljYXNlIFNTX05PUDoKLQkJewotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKzEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTU19JTlFfUkVGUkVTSDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU19UVVI6Ci0JCWNhc2UgU1NfUkVUUlk6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCi0JCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0JCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7Ci0JCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKLQkJCQlicmVhazsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7Ci0JCQl9Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlk6Ci0JCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgewotCQljYXNlIFNTX05PUDoKLQkJewotCQkJdV9pbnQgeHBvcnRmbGFnczsKLQkJCXVfaW50IHNwaTNkYXRhOwotCi0JCQlpZiAobWVtY21wKHRhcmctPmlucV9kYXRhLCB0YXJnLT5kdl9idWZmZXIsCi0JCQkJICAgQUhEX0xJTlVYX0RWX0lOUV9MRU4pICE9IDApIHsKLQkJCQkvKgotCQkJCSAqIElucXVpcnkgZGF0YSBtdXN0IGhhdmUgY2hhbmdlZC4KLQkJCQkgKiBUcnkgZnJvbSB0aGUgdG9wIGFnYWluLgotCQkJCSAqLwotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUrMSk7Ci0JCQl0YXJnLT5mbGFncyB8PSBBSERfSU5RX1ZBTElEOwotCQkJaWYgKGFoZF9saW51eF91c2VyX2R2X3NldHRpbmcoYWhkKSA9PSAwKQotCQkJCWJyZWFrOwotCi0JCQl4cG9ydGZsYWdzID0gdGFyZy0+aW5xX2RhdGEtPmZsYWdzOwotCQkJaWYgKCh4cG9ydGZsYWdzICYgKFNJRF9TeW5jfFNJRF9XQnVzMTYpKSA9PSAwKQotCQkJCWJyZWFrOwotCi0JCQlzcGkzZGF0YSA9IHRhcmctPmlucV9kYXRhLT5zcGkzZGF0YTsKLQkJCXN3aXRjaCAoc3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUX1NUKSB7Ci0JCQlkZWZhdWx0OgotCQkJY2FzZSBTSURfU1BJX0NMT0NLX1NUOgotCQkJCS8qIEFzc3VtZSBvbmx5IGJhc2ljIERWIGlzIHN1cHBvcnRlZC4gKi8KLQkJCQl0YXJnLT5mbGFncyB8PSBBSERfQkFTSUNfRFY7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNJRF9TUElfQ0xPQ0tfRFQ6Ci0JCQljYXNlIFNJRF9TUElfQ0xPQ0tfRFRfU1Q6Ci0JCQkJdGFyZy0+ZmxhZ3MgfD0gQUhEX0VOSEFOQ0VEX0RWOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTU19JTlFfUkVGUkVTSDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU19UVVI6Ci0JCWNhc2UgU1NfUkVUUlk6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCi0JCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0KLQkJCWlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCi0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9CVVNZKTsKLQkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQotCQkJCWJyZWFrOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKLQkJCX0KLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBSERfRFZfU1RBVEVfSU5RX1ZFUklGWToKLQkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7Ci0JCWNhc2UgU1NfTk9QOgotCQl7Ci0KLQkJCWlmIChtZW1jbXAodGFyZy0+aW5xX2RhdGEsIHRhcmctPmR2X2J1ZmZlciwKLQkJCQkgICBBSERfTElOVVhfRFZfSU5RX0xFTikgPT0gMCkgewotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLSNpZmRlZiBBSERfREVCVUcKLQkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQkJCWludCBpOwotCi0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIklucXVpcnkgYnVmZmVyIG1pc21hdGNoOiIpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBBSERfTElOVVhfRFZfSU5RX0xFTjsgaSsrKSB7Ci0JCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKLQkJCQkJCXByaW50ZigiXG4gICAgICAgICIpOwotCQkJCQlwcmludGYoIjB4JXg6MHgwJXggIiwKLQkJCQkJICAgICAgICgodWludDhfdCAqKXRhcmctPmlucV9kYXRhKVtpXSwgCi0JCQkJCSAgICAgICB0YXJnLT5kdl9idWZmZXJbaV0pOwotCQkJCX0KLQkJCQlwcmludGYoIlxuIik7Ci0JCQl9Ci0jZW5kaWYKLQotCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyoKLQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgotCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KLQkJCSAqLwotCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOwotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1NfSU5RX1JFRlJFU0g6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfVFVSOgotCQljYXNlIFNTX1JFVFJZOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQotCQkJID09IENBTV9SRVFVRVVFX1JFUSkgewotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0JCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKLQkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgewotCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBEbyBub3QgY291bnQgImZhbGxpbmcgYmFjayIKLQkJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgotCQkJCSAqLwotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5ID0gMDsKLQkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7Ci0JCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKLQkJCQlicmVhazsKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7Ci0JCQl9Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSERfRFZfU1RBVEVfVFVSOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCQlpZiAoKHRhcmctPmZsYWdzICYgQUhEX0JBU0lDX0RWKSAhPSAwKSB7Ci0JCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7Ci0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlkpOwotCQkJfSBlbHNlIGlmICgodGFyZy0+ZmxhZ3MgJiBBSERfRU5IQU5DRURfRFYpICE9IDApIHsKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1JFQkQpOwotCQkJfSBlbHNlIHsKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfUkVUUlk6Ci0JCWNhc2UgU1NfVFVSOgotCQkJaWYgKChzdGF0dXMgJiBTU19FUlJNQVNLKSA9PSBFQlVTWSkgewotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOwotCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCi0JCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7Ci0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKLQkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgewotCQkJCWlmIChhaGRfbGludXhfZHZfZmFsbGJhY2soYWhkLCBkZXZpbmZvKSAhPSAwKSB7Ci0JCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkJCSBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgotCQkJCSAqIGFnYWluc3Qgb3VyIHJldHJpZXMuCi0JCQkJICovCi0JCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOwotCQkJfQotCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5ID49IDEwKSB7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCQkJCXByaW50ZigiRFYgVFVSIHJldGllcyBleGhhdXN0ZWRcbiIpOwotCQkJCX0KLSNlbmRpZgotCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzICYgU1NRX0RFTEFZKQotCQkJCXNzbGVlcCgxKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgU1NfU1RBUlQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1NVKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSERfRFZfU1RBVEVfUkVCRDoKLQkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7Ci0JCWNhc2UgU1NfTk9QOgotCQl7Ci0JCQl1aW50MzJfdCBlY2hvX3NpemU7Ci0KLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfV0VCKTsKLQkJCWVjaG9fc2l6ZSA9IHNjc2lfM2J0b3VsKCZ0YXJnLT5kdl9idWZmZXJbMV0pOwotCQkJZWNob19zaXplICY9IDB4MUZGRjsKLSNpZmRlZiBBSERfREVCVUcKLQkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCQkJcHJpbnRmKCJFY2hvIGJ1ZmZlciBzaXplPSAlZFxuIiwgZWNob19zaXplKTsKLQkJCX0KLSNlbmRpZgotCQkJaWYgKGVjaG9fc2l6ZSA9PSAwKSB7Ci0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogR2VuZXJhdGUgdGhlIGJ1ZmZlciBwYXR0ZXJuICovCi0JCQl0YXJnLT5kdl9lY2hvX3NpemUgPSBlY2hvX3NpemU7Ci0JCQlhaGRfbGludXhfZ2VuZXJhdGVfZHZfcGF0dGVybih0YXJnKTsKLQkJCS8qCi0JCQkgKiBTZXR1cCBpbml0aWFsIG5lZ290aWF0aW9uIHZhbHVlcy4KLQkJCSAqLwotCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX1JFVFJZOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQotCQkJID09IENBTV9SRVFVRVVFX1JFUSkKLQkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOwotCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDw9IDEwKQotCQkJCWJyZWFrOwotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIkRWIFJFQkQgcmV0aWVzIGV4aGF1c3RlZFxuIik7Ci0JCQl9Ci0jZW5kaWYKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWNhc2UgU1NfRkFUQUw6Ci0JCWRlZmF1bHQ6Ci0JCQkvKgotCQkJICogU2V0dXAgaW5pdGlhbCBuZWdvdGlhdGlvbiB2YWx1ZXMKLQkJCSAqIGFuZCB0cnkgbGV2ZWwgMSBEVi4KLQkJCSAqLwotCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlkpOwotCQkJdGFyZy0+ZHZfZWNob19zaXplID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSERfRFZfU1RBVEVfV0VCOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1JFQik7Ci0JCQlicmVhazsKLQkJY2FzZSBTU19JTlFfUkVGUkVTSDoKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU19SRVRSWToKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7Ci0JCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKLQkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKLQkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOwotCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7Ci0JCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKLQkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCi0JCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KLQkJCQkgKi8KLQkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7Ci0JCQl9Ci0JCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApCi0JCQkJYnJlYWs7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotI2lmZGVmIEFIRF9ERUJVRwotCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJCQlwcmludGYoIkRWIFdFQiByZXRpZXMgZXhoYXVzdGVkXG4iKTsKLQkJCX0KLSNlbmRpZgotCQlkZWZhdWx0OgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSERfRFZfU1RBVEVfUkVCOgotCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKLQkJY2FzZSBTU19OT1A6Ci0JCQlpZiAobWVtY21wKHRhcmctPmR2X2J1ZmZlciwgdGFyZy0+ZHZfYnVmZmVyMSwKLQkJCQkgICB0YXJnLT5kdl9lY2hvX3NpemUpICE9IDApIHsKLQkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkKLQkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCQllbHNlCi0JCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAotCQkJCQkJCSBBSERfRFZfU1RBVEVfV0VCKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKSB7Ci0JCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKLQkJCQl0YXJnLT5kdl9idWZmZXIgPSBOVUxMOwotCQkJfQotCQkJaWYgKHRhcmctPmR2X2J1ZmZlcjEgIT0gTlVMTCkgewotCQkJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOwotCQkJCXRhcmctPmR2X2J1ZmZlcjEgPSBOVUxMOwotCQkJfQotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX1JFVFJZOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKLQkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQotCQkJID09IENBTV9SRVFVRVVFX1JFUSkgewotCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07Ci0JCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKLQkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgewotCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKLQkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9XRUIpOwotCQkJfQotCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDw9IDEwKSB7Ci0JCQkJaWYgKChzdGF0dXMgJiAoU1NRX0RFTEFZX1JBTkRPTXxTU1FfREVMQVkpKSE9IDApCi0JCQkJCW1zbGVlcChhaGQtPm91cl9pZCoxMDAwLzEwKTsKLQkJCQlicmVhazsKLQkJCX0KLSNpZmRlZiBBSERfREVCVUcKLQkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCQkJcHJpbnRmKCJEViBSRUIgcmV0aWVzIGV4aGF1c3RlZFxuIik7Ci0JCQl9Ci0jZW5kaWYKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFIRF9EVl9TVEFURV9TVToKLQkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7Ci0JCWNhc2UgU1NfTk9QOgotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBSERfRFZfU1RBVEVfQlVTWToKLQkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7Ci0JCWNhc2UgU1NfTk9QOgotCQljYXNlIFNTX0lOUV9SRUZSRVNIOgotCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCi0JCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKLQkJCWJyZWFrOwotCQljYXNlIFNTX1RVUjoKLQkJY2FzZSBTU19SRVRSWToKLQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7Ci0JCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKLQkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKLQkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOwotCQkJfSBlbHNlIGlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDYwKSB7Ci0JCQkJaWYgKChzdGF0dXMgJiBTU1FfREVMQVkpICE9IDApCi0JCQkJCXNzbGVlcCgxKTsKLQkJCX0gZWxzZSB7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCQkJCXByaW50ZigiRFYgQlVTWSByZXRpZXMgZXhoYXVzdGVkXG4iKTsKLQkJCQl9Ci0jZW5kaWYKLQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIiVzOiBJbnZhbGlkIERWIGNvbXBsZXRpb24gc3RhdGUgJWRcbiIsIGFoZF9uYW1lKGFoZCksCi0JCSAgICAgICB0YXJnLT5kdl9zdGF0ZSk7Ci0JCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl9maWxsX2NtZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQotewotCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSk7Ci0JY21kLT5kZXZpY2UgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2OwotCWNtZC0+c2NzaV9kb25lID0gYWhkX2xpbnV4X2R2X2NvbXBsZXRlOwotfQotCi0vKgotICogU3ludGhlc2l6ZSBhbiBpbnF1aXJ5IGNvbW1hbmQuICBPbiB0aGUgcmV0dXJuIHRyaXAsIGl0J2xsIGJlCi0gKiBzbmlmZmVkIGFuZCB0aGUgZGV2aWNlIHRyYW5zZmVyIHNldHRpbmdzIHNldCBmb3IgdXMuCi0gKi8KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZywKLQkJIHVfaW50IHJlcXVlc3RfbGVuZ3RoKQotewotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCXByaW50ZigiU2VuZGluZyBJTlFcbiIpOwotCX0KLSNlbmRpZgotCWlmICh0YXJnLT5pbnFfZGF0YSA9PSBOVUxMKQotCQl0YXJnLT5pbnFfZGF0YSA9IG1hbGxvYyhBSERfTElOVVhfRFZfSU5RX0xFTiwKLQkJCQkJTV9ERVZCVUYsIE1fV0FJVE9LKTsKLQlpZiAodGFyZy0+ZHZfc3RhdGUgPiBBSERfRFZfU1RBVEVfSU5RX0FTWU5DKSB7Ci0JCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKLQkJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7Ci0JCXRhcmctPmR2X2J1ZmZlciA9IG1hbGxvYyhBSERfTElOVVhfRFZfSU5RX0xFTiwKLQkJCQkJIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0JfQotCi0JYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKLQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCWNtZC0+Y21kX2xlbiA9IDY7Ci0JY21kLT5jbW5kWzBdID0gSU5RVUlSWTsKLQljbWQtPmNtbmRbNF0gPSByZXF1ZXN0X2xlbmd0aDsKLQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHJlcXVlc3RfbGVuZ3RoOwotCWlmICh0YXJnLT5kdl9zdGF0ZSA+IEFIRF9EVl9TVEFURV9JTlFfQVNZTkMpCi0JCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Ci0JZWxzZQotCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+aW5xX2RhdGE7Ci0JbWVtc2V0KGNtZC0+cmVxdWVzdF9idWZmZXIsIDAsIEFIRF9MSU5VWF9EVl9JTlFfTEVOKTsKLX0KLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl90dXIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCSBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCi17Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJcHJpbnRmKCJTZW5kaW5nIFRVUlxuIik7Ci0JfQotI2VuZGlmCi0JLyogRG8gYSBUVVIgdG8gY2xlYXIgb3V0IGFueSBub24tZmF0YWwgdHJhbnNpdGlvbmFsIHN0YXRlICovCi0JYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKLQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0JY21kLT5jbWRfbGVuID0gNjsKLQljbWQtPmNtbmRbMF0gPSBURVNUX1VOSVRfUkVBRFk7Ci19Ci0KLSNkZWZpbmUgQUhEX1JFQkRfTEVOIDQKLQotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kdl9yZWJkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKLXsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIlNlbmRpbmcgUkVCRFxuIik7Ci0JfQotI2VuZGlmCi0JaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQotCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOwotCXRhcmctPmR2X2J1ZmZlciA9IG1hbGxvYyhBSERfUkVCRF9MRU4sIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0JYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKLQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCWNtZC0+Y21kX2xlbiA9IDEwOwotCWNtZC0+Y21uZFswXSA9IFJFQURfQlVGRkVSOwotCWNtZC0+Y21uZFsxXSA9IDB4MGI7Ci0Jc2NzaV91bHRvM2IoQUhEX1JFQkRfTEVOLCAmY21kLT5jbW5kWzZdKTsKLQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IEFIRF9SRUJEX0xFTjsKLQljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOwotCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfd2ViKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKLXsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIlNlbmRpbmcgV0VCXG4iKTsKLQl9Ci0jZW5kaWYKLQlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOwotCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOwotCWNtZC0+Y21kX2xlbiA9IDEwOwotCWNtZC0+Y21uZFswXSA9IFdSSVRFX0JVRkZFUjsKLQljbWQtPmNtbmRbMV0gPSAweDBhOwotCXNjc2lfdWx0bzNiKHRhcmctPmR2X2VjaG9fc2l6ZSwgJmNtZC0+Y21uZFs2XSk7Ci0JY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSB0YXJnLT5kdl9lY2hvX3NpemU7Ci0JY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKLQljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2R2X3JlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCi17Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJcHJpbnRmKCJTZW5kaW5nIFJFQlxuIik7Ci0JfQotI2VuZGlmCi0JYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKLQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCWNtZC0+Y21kX2xlbiA9IDEwOwotCWNtZC0+Y21uZFswXSA9IFJFQURfQlVGRkVSOwotCWNtZC0+Y21uZFsxXSA9IDB4MGE7Ci0Jc2NzaV91bHRvM2IodGFyZy0+ZHZfZWNob19zaXplLCAmY21kLT5jbW5kWzZdKTsKLQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHRhcmctPmR2X2VjaG9fc2l6ZTsKLQljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOwotCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXIxOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2R2X3N1KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCi0JCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQotewotCXVfaW50IGxlOwotCi0JbGUgPSBTSURfSVNfUkVNT1ZBQkxFKHRhcmctPmlucV9kYXRhKSA/IFNTU19MT0VKIDogMDsKLQotI2lmZGVmIEFIRF9ERUJVRwotCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgewotCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQlwcmludGYoIlNlbmRpbmcgU1VcbiIpOwotCX0KLSNlbmRpZgotCWFoZF9saW51eF9kdl9maWxsX2NtZChhaGQsIGNtZCwgZGV2aW5mbyk7Ci0JY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOwotCWNtZC0+Y21kX2xlbiA9IDY7Ci0JY21kLT5jbW5kWzBdID0gU1RBUlRfU1RPUF9VTklUOwotCWNtZC0+Y21uZFs0XSA9IGxlIHwgU1NTX1NUQVJUOwotfQotCi1zdGF0aWMgaW50Ci1haGRfbGludXhfZmFsbGJhY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCi17Ci0Jc3RydWN0CWFoZF9saW51eF90YXJnZXQgKnRhcmc7Ci0Jc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOwotCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpnb2FsOwotCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0JdV9pbnQJd2lkdGg7Ci0JdV9pbnQJcGVyaW9kOwotCXVfaW50CW9mZnNldDsKLQl1X2ludAlwcHJfb3B0aW9uczsKLQl1X2ludAljdXJfc3BlZWQ7Ci0JdV9pbnQJd2lkZV9zcGVlZDsKLQl1X2ludAluYXJyb3dfc3BlZWQ7Ci0JdV9pbnQJZmFsbGJhY2tfc3BlZWQ7Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKLQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJcHJpbnRmKCJUcnlpbmcgdG8gZmFsbGJhY2tcbiIpOwotCX0KLSNlbmRpZgotCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbZGV2aW5mby0+dGFyZ2V0X29mZnNldF07Ci0JdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwKLQkJCQkgICAgZGV2aW5mby0+b3VyX3Njc2lpZCwKLQkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKLQlnb2FsID0gJnRpbmZvLT5nb2FsOwotCXdpZHRoID0gZ29hbC0+d2lkdGg7Ci0JcGVyaW9kID0gZ29hbC0+cGVyaW9kOwotCW9mZnNldCA9IGdvYWwtPm9mZnNldDsKLQlwcHJfb3B0aW9ucyA9IGdvYWwtPnBwcl9vcHRpb25zOwotCWlmIChvZmZzZXQgPT0gMCkKLQkJcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOwotCWlmICh0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPT0gMCkKLQkJdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID0gTUFYKHBlcmlvZCwgQUhEX1NZTkNSQVRFX1VMVFJBMik7Ci0JaWYgKHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPT0gMCkKLQkJdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9IHBlcmlvZDsKLQlpZiAodGFyZy0+ZHZfbWF4X3dpZHRoID09IDApCi0JCXRhcmctPmR2X21heF93aWR0aCA9IHdpZHRoOwotCWlmICh0YXJnLT5kdl9tYXhfcHByX29wdGlvbnMgPT0gMCkKLQkJdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7Ci0JaWYgKHRhcmctPmR2X2xhc3RfcHByX29wdGlvbnMgPT0gMCkKLQkJdGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOwotCi0JY3VyX3NwZWVkID0gYWljX2NhbGNfc3BlZWQod2lkdGgsIHBlcmlvZCwgb2Zmc2V0LCBBSERfU1lOQ1JBVEVfTUlOKTsKLQl3aWRlX3NwZWVkID0gYWljX2NhbGNfc3BlZWQoTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQsCi0JCQkJCSAgdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCwKLQkJCQkJICBNQVhfT0ZGU0VULCBBSERfU1lOQ1JBVEVfTUlOKTsKLQluYXJyb3dfc3BlZWQgPSBhaWNfY2FsY19zcGVlZChNU0dfRVhUX1dEVFJfQlVTXzhfQklULAotCQkJCQkgICAgdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kLAotCQkJCQkgICAgTUFYX09GRlNFVCwgQUhEX1NZTkNSQVRFX01JTik7Ci0JZmFsbGJhY2tfc3BlZWQgPSBhaWNfY2FsY19zcGVlZCh3aWR0aCwgcGVyaW9kKzEsIG9mZnNldCwKLQkJCQkJICAgICAgQUhEX1NZTkNSQVRFX01JTik7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCXByaW50ZigiY3VyX3NwZWVkPSAlZCwgd2lkZV9zcGVlZD0gJWQsIG5hcnJvd19zcGVlZD0gJWQsICIKLQkJICAgICAgICJmYWxsYmFja19zcGVlZD0gJWRcbiIsIGN1cl9zcGVlZCwgd2lkZV9zcGVlZCwKLQkJICAgICAgIG5hcnJvd19zcGVlZCwgZmFsbGJhY2tfc3BlZWQpOwotCX0KLSNlbmRpZgotCi0JaWYgKGN1cl9zcGVlZCA+IDE2MDAwMCkgewotCQkvKgotCQkgKiBQYWNlZC9EVC9JVV9SRVEgb25seSB0cmFuc2ZlciBzcGVlZHMuICBBbGwgd2UKLQkJICogY2FuIGRvIGlzIGZhbGxiYWNrIGluIHRlcm1zIG9mIHN5bmNyYXRlLgotCQkgKi8KLQkJcGVyaW9kKys7Ci0JfSBlbHNlIGlmIChjdXJfc3BlZWQgPiA4MDAwMCkgewotCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7Ci0JCQkvKgotCQkJICogVHJ5IHdpdGhvdXQgSVVfUkVRIGFzIGl0IG1heSBiZSBjb25mdXNpbmcKLQkJCSAqIGFuIGV4cGFuZGVyLgotCQkJICovCi0JCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfSVVfUkVROwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFBhY2VkL0RUIG9ubHkgdHJhbnNmZXIgc3BlZWRzLiAgQWxsIHdlCi0JCQkgKiBjYW4gZG8gaXMgZmFsbGJhY2sgaW4gdGVybXMgb2Ygc3luY3JhdGUuCi0JCQkgKi8KLQkJCXBlcmlvZCsrOwotCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7Ci0JCX0KLQl9IGVsc2UgaWYgKGN1cl9zcGVlZCA+IDMzMDApIHsKLQotCQkvKgotCQkgKiBJbiB0aGlzIHJhbmdlIHdlIHRoZSBmb2xsb3dpbmcKLQkJICogb3B0aW9ucyBvcmRlcmVkIGZyb20gaGlnaGVzdCB0bwotCQkgKiBsb3dlc3QgZGVzaXJlYWJpbGl0eToKLQkJICoKLQkJICogbyBXaWRlL0RUCi0JCSAqIG8gV2lkZS9ub24tRFQKLQkJICogbyBOYXJyb3cgYXQgYSBwb3RlbnRhbGx5IGhpZ2hlciBzeW5jIHJhdGUuCi0JCSAqCi0JCSAqIEFsbCBtb2RlcyBhcmUgdGVzdGVkIHdpdGggYW5kIHdpdGhvdXQgSVVfUkVRCi0JCSAqIHNldCBzaW5jZSB1c2luZyBJVXMgbWF5IGNvbmZ1c2UgYW4gZXhwYW5kZXIuCi0JCSAqLwotCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7Ci0KLQkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9JVV9SRVE7Ci0JCX0gZWxzZSBpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwKSB7Ci0JCQkvKgotCQkJICogVHJ5IGdvaW5nIG5vbi1EVC4KLQkJCSAqLwotCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7Ci0JCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROwotCQl9IGVsc2UgaWYgKHRhcmctPmR2X2xhc3RfcHByX29wdGlvbnMgIT0gMCkgewotCQkJLyoKLQkJCSAqIFRyeSB3aXRob3V0IFFBUyBvciBhbnkgb3RoZXIgUFBSIG9wdGlvbnMuCi0JCQkgKiBXZSBtYXkgbmVlZCBhIG5vbi1QUFIgbWVzc2FnZSB0byB3b3JrIHdpdGgKLQkJCSAqIGFuIGV4cGFuZGVyLiAgV2UgbG9vayBhdCB0aGUgImxhc3QgUFBSIG9wdGlvbnMiCi0JCQkgKiBzbyB3ZSB3aWxsIHBlcmZvcm0gdGhpcyBmYWxsYmFjayBldmVuIGlmIHRoZQotCQkJICogdGFyZ2V0IHJlc3BvbmRlZCB0byBvdXIgUFBSIG5lZ290aWF0aW9uIHdpdGgKLQkJCSAqIG5vIG9wdGlvbiBiaXRzIHNldC4KLQkJCSAqLwotCQkJcHByX29wdGlvbnMgPSAwOwotCQl9IGVsc2UgaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIG5leHQgbmFycm93IHNwZWVkIGlzIGdyZWF0ZXIgdGhhbgotCQkJICogdGhlIG5leHQgd2lkZSBzcGVlZCwgZmFsbGJhY2sgdG8gbmFycm93LgotCQkJICogT3RoZXJ3aXNlIGZhbGxiYWNrIHRvIHRoZSBuZXh0IERUL1dpZGUgc2V0dGluZy4KLQkJCSAqIFRoZSBuYXJyb3cgYXN5bmMgc3BlZWQgd2lsbCBhbHdheXMgYmUgc21hbGxlcgotCQkJICogdGhhbiB0aGUgd2lkZSBhc3luYyBzcGVlZCwgc28gaGFuZGxlIHRoaXMgY2FzZQotCQkJICogc3BlY2lmaWNhbGx5LgotCQkJICovCi0JCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKLQkJCWlmIChuYXJyb3dfc3BlZWQgPiBmYWxsYmFja19zcGVlZAotCQkJIHx8IHBlcmlvZCA+PSBBSERfQVNZTkNfWEZFUl9QRVJJT0QpIHsKLQkJCQl0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID0gcGVyaW9kKzE7Ci0JCQkJd2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOwotCQkJCXBlcmlvZCA9IHRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGVyaW9kKys7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgIT0gMAotCQkJJiYgdGFyZy0+ZHZfbWF4X3dpZHRoICE9IDAKLQkJCSYmIHdpZGVfc3BlZWQgPj0gZmFsbGJhY2tfc3BlZWQKLQkJCSYmICh0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kIDw9IEFIRF9BU1lOQ19YRkVSX1BFUklPRAotCQkJIHx8IHBlcmlvZCA+PSBBSERfQVNZTkNfWEZFUl9QRVJJT0QpKSB7Ci0KLQkJCS8qCi0JCQkgKiBXZSBhcmUgbmFycm93LiAgVHJ5IGZhbGxpbmcgYmFjawotCQkJICogdG8gdGhlIG5leHQgd2lkZSBzcGVlZCB3aXRoIAotCQkJICogYWxsIHN1cHBvcnRlZCBwcHIgb3B0aW9ucyBzZXQuCi0JCQkgKi8KLQkJCXRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9IHBlcmlvZCsxOwotCQkJd2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKLQkJCXBlcmlvZCA9IHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2Q7Ci0JCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKLQkJfSBlbHNlIHsKLQkJCS8qIE9ubHkgbmFycm93IGZhbGxiYWNrIGlzIGFsbG93ZWQuICovCi0JCQlwZXJpb2QrKzsKLQkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCW9mZnNldCA9IE1BWF9PRkZTRVQ7Ci0JYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsIEFIRF9TWU5DUkFURV9QQUNFRCk7Ci0JYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIHdpZHRoLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOwotCWlmIChwZXJpb2QgPT0gMCkgewotCQlwZXJpb2QgPSAwOwotCQlvZmZzZXQgPSAwOwotCQlwcHJfb3B0aW9ucyA9IDA7Ci0JCWlmICh3aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKQotCQkJdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOwotCQllbHNlCi0JCQl0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOwotCX0KLQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsCi0JCQkgcHByX29wdGlvbnMsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7Ci0JdGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfdGltZW91dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCi17Ci0Jc3RydWN0CWFoZF9zb2Z0YyAqYWhkOwotCXN0cnVjdAlzY2IgKnNjYjsKLQl1X2xvbmcJZmxhZ3M7Ci0KLQlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7Ci0JYWhkX2xvY2soYWhkLCAmZmxhZ3MpOwotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7Ci0JCXByaW50ZigiJXM6IFRpbWVvdXQgd2hpbGUgZG9pbmcgRFYgY29tbWFuZCAleC5cbiIsCi0JCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmNtbmRbMF0pOwotCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7Ci0JfQotI2VuZGlmCi0JCi0JLyoKLQkgKiBHdWFyZCBhZ2FpbnN0ICJkb25lIHJhY2UiLiAgTm8gYWN0aW9uIGlzCi0JICogcmVxdWlyZWQgaWYgd2UganVzdCBjb21wbGV0ZWQuCi0JICovCi0JaWYgKChzY2IgPSAoc3RydWN0IHNjYiAqKWNtZC0+aG9zdF9zY3JpYmJsZSkgPT0gTlVMTCkgewotCQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogQ29tbWFuZCBoYXMgbm90IGNvbXBsZXRlZC4gIE1hcmsgdGhpcwotCSAqIFNDQiBhcyBoYXZpbmcgZmFpbGluZyBzdGF0dXMgcHJpb3IgdG8KLQkgKiByZXNldHRpbmcgdGhlIGJ1cywgc28gd2UgZ2V0IHRoZSBjb3JyZWN0Ci0JICogZXJyb3IgY29kZS4KLQkgKi8KLQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpICE9IDApCi0JCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0FVVE9TRU5TRV9GQUlMKTsKLQllbHNlCi0JCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0NNRF9USU1FT1VUKTsKLQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLCAvKmluaXRpYXRlKi9UUlVFKTsKLQotCS8qCi0JICogQWRkIGEgbWluaW1hbCBidXMgc2V0dGxlIGRlbGF5IGZvciBkZXZpY2VzIHRoYXQgYXJlIHNsb3cgdG8KLQkgKiByZXNwb25kIGFmdGVyIGJ1cyByZXNldHMuCi0JICovCi0JYWhkX2ZyZWV6ZV9zaW1xKGFoZCk7Ci0JaW5pdF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGQ7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMjsKLQlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmZ1bmN0aW9uID0KLQkgICAgKGFoZF9saW51eF9jYWxsYmFja190ICopYWhkX3JlbGVhc2Vfc2ltcTsKLQlhZGRfdGltZXIoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOwotCWlmIChhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkgIT0gTlVMTCkKLQkJYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKLQlhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCk7Ci0JYWhkX3VubG9jayhhaGQsICZmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZHZfY29tcGxldGUoc3RydWN0IHNjc2lfY21uZCAqY21kKQotewotCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKLQotCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKTsKLQotCS8qIERlbGV0ZSB0aGUgRFYgdGltZXIgYmVmb3JlIGl0IGdvZXMgb2ZmISAqLwotCXNjc2lfZGVsZXRlX3RpbWVyKGNtZCk7Ci0KLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpCi0JCXByaW50ZigiJXM6JWM6JWQ6IENvbW1hbmQgY29tcGxldGVkLCBzdGF0dXM9IDB4JXhcbiIsCi0JCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAotCQkgICAgICAgY21kLT5yZXN1bHQpOwotI2VuZGlmCi0KLQkvKiBXYWtlIHVwIHRoZSBzdGF0ZSBtYWNoaW5lICovCi0JdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfY21kX3NlbSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZ2VuZXJhdGVfZHZfcGF0dGVybihzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKLXsKLQl1aW50MTZfdCBiOwotCXVfaW50CSBpOwotCXVfaW50CSBqOwotCi0JaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQotCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOwotCXRhcmctPmR2X2J1ZmZlciA9IG1hbGxvYyh0YXJnLT5kdl9lY2hvX3NpemUsIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0JaWYgKHRhcmctPmR2X2J1ZmZlcjEgIT0gTlVMTCkKLQkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7Ci0JdGFyZy0+ZHZfYnVmZmVyMSA9IG1hbGxvYyh0YXJnLT5kdl9lY2hvX3NpemUsIE1fREVWQlVGLCBNX1dBSVRPSyk7Ci0KLQlpID0gMDsKLQotCWIgPSAweDAwMDE7Ci0JZm9yIChqID0gMCA7IGkgPCB0YXJnLT5kdl9lY2hvX3NpemU7IGorKykgewotCQlpZiAoaiA8IDMyKSB7Ci0JCQkvKgotCQkJICogMzJieXRlcyBvZiBzZXF1ZW50aWFsIG51bWJlcnMuCi0JCQkgKi8KLQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gaiAmIDB4ZmY7Ci0JCX0gZWxzZSBpZiAoaiA8IDQ4KSB7Ci0JCQkvKgotCQkJICogMzJieXRlcyBvZiByZXBlYXRpbmcgMHgwMDAwLCAweGZmZmYuCi0JCQkgKi8KLQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKGogJiAweDAyKSA/IDB4ZmYgOiAweDAwOwotCQl9IGVsc2UgaWYgKGogPCA2NCkgewotCQkJLyoKLQkJCSAqIDMyYnl0ZXMgb2YgcmVwZWF0aW5nIDB4NTU1NSwgMHhhYWFhLgotCQkJICovCi0JCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IChqICYgMHgwMikgPyAweGFhIDogMHg1NTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBSZW1haW5pbmcgYnVmZmVyIGlzIGZpbGxlZCB3aXRoIGEgcmVwZWF0aW5nCi0JCQkgKiBwYXR0ZXIgb2Y6Ci0JCQkgKgotCQkJICoJIDB4ZmZmZgotCQkJICoJfjB4MDAwMSA8PCBzaGlmdGVkIG9uY2UgaW4gZWFjaCBsb29wLgotCQkJICovCi0JCQlpZiAoaiAmIDB4MDIpIHsKLQkJCQlpZiAoaiAmIDB4MDEpIHsKLQkJCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSB+KGIgPj4gOCkgJiAweGZmOwotCQkJCQliIDw8PSAxOwotCQkJCQlpZiAoYiA9PSAweDAwMDApCi0JCQkJCQliID0gMHgwMDAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKH5iICYgMHhmZik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IDB4ZmY7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB1X2ludAotYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCi17Ci0Jc3RhdGljIGludCB3YXJuZWRfdXNlcjsKLQl1X2ludCB0YWdzOwotCi0JdGFncyA9IDA7Ci0JaWYgKChhaGQtPnVzZXJfZGlzY2VuYWJsZSAmIGRldmluZm8tPnRhcmdldF9tYXNrKSAhPSAwKSB7Ci0JCWlmIChhaGQtPnVuaXQgPj0gTlVNX0VMRU1FTlRTKGFpYzc5eHhfdGFnX2luZm8pKSB7Ci0KLQkJCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7Ci0JCQkJcHJpbnRmKEtFUk5fV0FSTklORwotImFpYzc5eHg6IFdBUk5JTkc6IEluc3VmZmljaWVudCB0YWdfaW5mbyBpbnN0YW5jZXNcbiIKLSJhaWM3OXh4OiBmb3IgaW5zdGFsbGVkIGNvbnRyb2xsZXJzLiAgVXNpbmcgZGVmYXVsdHNcbiIKLSJhaWM3OXh4OiBQbGVhc2UgdXBkYXRlIHRoZSBhaWM3OXh4X3RhZ19pbmZvIGFycmF5IGluXG4iCi0iYWljNzl4eDogdGhlIGFpYzc5eHhfb3NtLmMgc291cmNlIGZpbGUuXG4iKTsKLQkJCQl3YXJuZWRfdXNlcisrOwotCQkJfQotCQkJdGFncyA9IEFIRF9NQVhfUVVFVUU7Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyX3RhZ19pbmZvX3QgKnRhZ19pbmZvOwotCi0JCQl0YWdfaW5mbyA9ICZhaWM3OXh4X3RhZ19pbmZvW2FoZC0+dW5pdF07Ci0JCQl0YWdzID0gdGFnX2luZm8tPnRhZ19jb21tYW5kc1tkZXZpbmZvLT50YXJnZXRfb2Zmc2V0XTsKLQkJCWlmICh0YWdzID4gQUhEX01BWF9RVUVVRSkKLQkJCQl0YWdzID0gQUhEX01BWF9RVUVVRTsKLQkJfQotCX0KLQlyZXR1cm4gKHRhZ3MpOwotfQotCi1zdGF0aWMgdV9pbnQKLWFoZF9saW51eF91c2VyX2R2X3NldHRpbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCXN0YXRpYyBpbnQgd2FybmVkX3VzZXI7Ci0JaW50IGR2OwotCi0JaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF9kdl9zZXR0aW5ncykpIHsKLQotCQlpZiAod2FybmVkX3VzZXIgPT0gMCkgewotCQkJcHJpbnRmKEtFUk5fV0FSTklORwotImFpYzc5eHg6IFdBUk5JTkc6IEluc3VmZmljaWVudCBkdiBzZXR0aW5ncyBpbnN0YW5jZXNcbiIKLSJhaWM3OXh4OiBmb3IgaW5zdGFsbGVkIGNvbnRyb2xsZXJzLiBVc2luZyBkZWZhdWx0c1xuIgotImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfZHZfc2V0dGluZ3MgYXJyYXkgaW4iCi0iYWljNzl4eDogdGhlIGFpYzc5eHhfb3NtLmMgc291cmNlIGZpbGUuXG4iKTsKLQkJCXdhcm5lZF91c2VyKys7Ci0JCX0KLQkJZHYgPSAtMTsKLQl9IGVsc2UgewotCi0JCWR2ID0gYWljNzl4eF9kdl9zZXR0aW5nc1thaGQtPnVuaXRdOwotCX0KLQotCWlmIChkdiA8IDApIHsKLQkJLyoKLQkJICogQXBwbHkgdGhlIGRlZmF1bHQuCi0JCSAqLwotCQlkdiA9IDE7Ci0JCWlmIChhaGQtPnNlZXBfY29uZmlnICE9IDApCi0JCQlkdiA9IChhaGQtPnNlZXBfY29uZmlnLT5iaW9zX2NvbnRyb2wgJiBDRkVOQUJMRURWKTsKLQl9Ci0JcmV0dXJuIChkdik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfc2V0dXBfdXNlcl9yZF9zdHJtX3NldHRpbmdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlzdGF0aWMJaW50IHdhcm5lZF91c2VyOwotCXVfaW50CXJkX3N0cm1fbWFzazsKLQl1X2ludAl0YXJnZXRfaWQ7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgc3BlY2lmaWMgcmVhZCBzdHJlYW1pbmcgaW5mbyBmb3IgdGhpcyBjb250cm9sbGVyLAotCSAqIGFwcGx5IGl0LiAgT3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdHMuCi0JICovCi0JIGlmIChhaGQtPnVuaXQgPj0gTlVNX0VMRU1FTlRTKGFpYzc5eHhfcmRfc3RybV9pbmZvKSkgewotCi0JCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7Ci0KLQkJCXByaW50ZihLRVJOX1dBUk5JTkcKLSJhaWM3OXh4OiBXQVJOSU5HOiBJbnN1ZmZpY2llbnQgcmRfc3RybSBpbnN0YW5jZXNcbiIKLSJhaWM3OXh4OiBmb3IgaW5zdGFsbGVkIGNvbnRyb2xsZXJzLiBVc2luZyBkZWZhdWx0c1xuIgotImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfcmRfc3RybV9pbmZvIGFycmF5XG4iCi0iYWljNzl4eDogaW4gdGhlIGFpYzc5eHhfb3NtLmMgc291cmNlIGZpbGUuXG4iKTsKLQkJCXdhcm5lZF91c2VyKys7Ci0JCX0KLQkJcmRfc3RybV9tYXNrID0gQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNOwotCX0gZWxzZSB7Ci0KLQkJcmRfc3RybV9tYXNrID0gYWljNzl4eF9yZF9zdHJtX2luZm9bYWhkLT51bml0XTsKLQl9Ci0JZm9yICh0YXJnZXRfaWQgPSAwOyB0YXJnZXRfaWQgPCAxNjsgdGFyZ2V0X2lkKyspIHsKLQkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87Ci0JCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKLQkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKLQotCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAotCQkJCQkgICAgdGFyZ2V0X2lkLCAmdHN0YXRlKTsKLQkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsIHRhcmdldF9pZCwKLQkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgJ0EnLCBST0xFX0lOSVRJQVRPUik7Ci0JCXRpbmZvLT51c2VyLnBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9SRF9TVFJNOwotCQlpZiAoKHJkX3N0cm1fbWFzayAmIGRldmluZm8udGFyZ2V0X21hc2spICE9IDApCi0JCQl0aW5mby0+dXNlci5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9SRF9TVFJNOwotCX0KLX0KLQotLyoKLSAqIERldGVybWluZXMgdGhlIHF1ZXVlIGRlcHRoIGZvciBhIGdpdmVuIGRldmljZS4KLSAqLwotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJICAgICBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KQotewotCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOwotCXVfaW50CXRhZ3M7Ci0KLQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAotCQkJICAgIGFoZC0+b3VyX2lkLAotCQkJICAgIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuLAotCQkJICAgIGRldi0+dGFyZ2V0LT5jaGFubmVsID09IDAgPyAnQScgOiAnQicsCi0JCQkgICAgUk9MRV9JTklUSUFUT1IpOwotCXRhZ3MgPSBhaGRfbGludXhfdXNlcl90YWdkZXB0aChhaGQsICZkZXZpbmZvKTsKLQlpZiAodGFncyAhPSAwCi0JICYmIGRldi0+c2NzaV9kZXZpY2UgIT0gTlVMTAotCSAmJiBkZXYtPnNjc2lfZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkICE9IDApIHsKLQotCQlhaGRfc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywgQUhEX1FVRVVFX1RBR0dFRCk7Ci0JCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQlwcmludGYoIlRhZ2dlZCBRdWV1aW5nIGVuYWJsZWQuICBEZXB0aCAlZFxuIiwgdGFncyk7Ci0JfSBlbHNlIHsKLQkJYWhkX3NldF90YWdzKGFoZCwgJmRldmluZm8sIEFIRF9RVUVVRV9OT05FKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfcnVuX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0CSBhaGRfY21kICphY21kOwotCXN0cnVjdAkgc2NzaV9jbW5kICpjbWQ7Ci0Jc3RydWN0CSBzY2IgKnNjYjsKLQlzdHJ1Y3QJIGhhcmR3YXJlX3NjYiAqaHNjYjsKLQlzdHJ1Y3QJIGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOwotCXN0cnVjdAkgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwotCXVfaW50CSBjb2xfaWR4OwotCXVpbnQxNl90IG1hc2s7Ci0KLQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX09OX1JVTl9MSVNUKSAhPSAwKQotCQlwYW5pYygicnVubmluZyBkZXZpY2Ugb24gcnVuIGxpc3QiKTsKLQotCXdoaWxlICgoYWNtZCA9IFRBSUxRX0ZJUlNUKCZkZXYtPmJ1c3lxKSkgIT0gTlVMTAotCSAgICAmJiBkZXYtPm9wZW5pbmdzID4gMCAmJiBkZXYtPnFmcm96ZW4gPT0gMCkgewotCi0JCS8qCi0JCSAqIFNjaGVkdWxlIHVzIHRvIHJ1biBsYXRlci4gIFRoZSBvbmx5IHJlYXNvbiB3ZSBhcmUgbm90Ci0JCSAqIHJ1bm5pbmcgaXMgYmVjYXVzZSB0aGUgd2hvbGUgY29udHJvbGxlciBRIGlzIGZyb3plbi4KLQkJICovCi0JCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gIT0gMAotCQkgJiYgQUhEX0RWX1NJTVFfRlJPWkVOKGFoZCkgPT0gMCkgewotCi0JCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwKLQkJCQkJICBkZXYsIGxpbmtzKTsKLQkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOwotCi0JCS8qCi0JCSAqIEdldCBhbiBzY2IgdG8gdXNlLgotCQkgKi8KLQkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgJ0EnLCBhaGQtPm91cl9pZCwKLQkJCQkJICAgIGNtZC0+ZGV2aWNlLT5pZCwgJnRzdGF0ZSk7Ci0JCWlmICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUV9CQVNJQykpID09IDAKLQkJIHx8ICh0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgewotCQkJY29sX2lkeCA9IEFIRF9ORVZFUl9DT0xfSURYOwotCQl9IGVsc2UgewotCQkJY29sX2lkeCA9IEFIRF9CVUlMRF9DT0xfSURYKGNtZC0+ZGV2aWNlLT5pZCwKLQkJCQkJCSAgICBjbWQtPmRldmljZS0+bHVuKTsKLQkJfQotCQlpZiAoKHNjYiA9IGFoZF9nZXRfc2NiKGFoZCwgY29sX2lkeCkpID09IE5VTEwpIHsKLQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLAotCQkJCQkgZGV2LCBsaW5rcyk7Ci0JCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfT05fUlVOX0xJU1Q7Ci0JCQlhaGQtPmZsYWdzIHw9IEFIRF9SRVNPVVJDRV9TSE9SVEFHRTsKLQkJCXJldHVybjsKLQkJfQotCQlUQUlMUV9SRU1PVkUoJmRldi0+YnVzeXEsIGFjbWQsIGFjbWRfbGlua3MudHFlKTsKLQkJc2NiLT5pb19jdHggPSBjbWQ7Ci0JCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2ID0gZGV2OwotCQloc2NiID0gc2NiLT5oc2NiOwotCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKXNjYjsKLQotCQkvKgotCQkgKiBGaWxsIG91dCBiYXNpY3Mgb2YgdGhlIEhTQ0IuCi0JCSAqLwotCQloc2NiLT5jb250cm9sID0gMDsKLQkJaHNjYi0+c2NzaWlkID0gQlVJTERfU0NTSUlEKGFoZCwgY21kKTsKLQkJaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKLQkJc2NiLT5oc2NiLT50YXNrX21hbmFnZW1lbnQgPSAwOwotCQltYXNrID0gU0NCX0dFVF9UQVJHRVRfTUFTSyhhaGQsIHNjYik7Ci0KLQkJaWYgKChhaGQtPnVzZXJfZGlzY2VuYWJsZSAmIG1hc2spICE9IDApCi0JCQloc2NiLT5jb250cm9sIHw9IERJU0NFTkI7Ci0KLQkgCWlmIChBSERfRFZfQ01EKGNtZCkgIT0gMCkKLQkJCXNjYi0+ZmxhZ3MgfD0gU0NCX1NJTEVOVDsKLQotCQlpZiAoKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKQotCQkJc2NiLT5mbGFncyB8PSBTQ0JfUEFDS0VUSVpFRDsKLQotCQlpZiAoKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBtYXNrKSAhPSAwKSB7Ci0JCQlzY2ItPmZsYWdzIHw9IFNDQl9BVVRPX05FR09USUFURTsKLQkJCXNjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOwotCQl9Ci0KLQkJaWYgKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9RX0JBU0lDKSkgIT0gMCkgewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkJCWludAltc2dfYnl0ZXM7Ci0JCQl1aW50OF90IHRhZ19tc2dzWzJdOwotCi0JCQltc2dfYnl0ZXMgPSBzY3NpX3BvcHVsYXRlX3RhZ19tc2coY21kLCB0YWdfbXNncyk7Ci0JCQlpZiAobXNnX2J5dGVzICYmIHRhZ19tc2dzWzBdICE9IE1TR19TSU1QTEVfVEFTSykgewotCQkJCWhzY2ItPmNvbnRyb2wgfD0gdGFnX21zZ3NbMF07Ci0JCQkJaWYgKHRhZ19tc2dzWzBdID09IE1TR19PUkRFUkVEX1RBU0spCi0JCQkJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKLQkJCX0gZWxzZQotI2VuZGlmCi0JCQlpZiAoZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPT0gQUhEX09UQUdfVEhSRVNICi0JCQkgJiYgKGRldi0+ZmxhZ3MgJiBBSERfREVWX1FfVEFHR0VEKSAhPSAwKSB7Ci0JCQkJaHNjYi0+Y29udHJvbCB8PSBNU0dfT1JERVJFRF9UQVNLOwotCQkJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaHNjYi0+Y29udHJvbCB8PSBNU0dfU0lNUExFX1RBU0s7Ci0JCQl9Ci0JCX0KLQotCQloc2NiLT5jZGJfbGVuID0gY21kLT5jbWRfbGVuOwotCQltZW1jcHkoaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOwotCi0JCXNjYi0+c2dfY291bnQgPSAwOwotCQlhaGRfc2V0X3Jlc2lkdWFsKHNjYiwgMCk7Ci0JCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCAwKTsKLQkJaWYgKGNtZC0+dXNlX3NnICE9IDApIHsKLQkJCXZvaWQJKnNnOwotCQkJc3RydWN0CSBzY2F0dGVybGlzdCAqY3VyX3NlZzsKLQkJCXVfaW50CSBuc2VnOwotCQkJaW50CSBkaXI7Ci0KLQkJCWN1cl9zZWcgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKLQkJCWRpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247Ci0JCQluc2VnID0gcGNpX21hcF9zZyhhaGQtPmRldl9zb2Z0YywgY3VyX3NlZywKLQkJCQkJICBjbWQtPnVzZV9zZywgZGlyKTsKLQkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+eGZlcl9sZW4gPSAwOwotCQkJZm9yIChzZyA9IHNjYi0+c2dfbGlzdDsgbnNlZyA+IDA7IG5zZWctLSwgY3VyX3NlZysrKSB7Ci0JCQkJZG1hX2FkZHJfdCBhZGRyOwotCQkJCWJ1c19zaXplX3QgbGVuOwotCi0JCQkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKGN1cl9zZWcpOwotCQkJCWxlbiA9IHNnX2RtYV9sZW4oY3VyX3NlZyk7Ci0JCQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiArPSBsZW47Ci0JCQkJc2cgPSBhaGRfc2dfc2V0dXAoYWhkLCBzY2IsIHNnLCBhZGRyLCBsZW4sCi0JCQkJCQkgIC8qbGFzdCovbnNlZyA9PSAxKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7Ci0JCQl2b2lkICpzZzsKLQkJCWRtYV9hZGRyX3QgYWRkcjsKLQkJCWludCBkaXI7Ci0KLQkJCXNnID0gc2NiLT5zZ19saXN0OwotCQkJZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKLQkJCWFkZHIgPSBwY2lfbWFwX3NpbmdsZShhaGQtPmRldl9zb2Z0YywKLQkJCQkJICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwKLQkJCQkJICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGRpcik7Ci0JCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ci0JCQlzY2ItPnBsYXRmb3JtX2RhdGEtPmJ1Zl9idXNhZGRyID0gYWRkcjsKLQkJCXNnID0gYWhkX3NnX3NldHVwKGFoZCwgc2NiLCBzZywgYWRkciwKLQkJCQkJICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgLypsYXN0Ki9UUlVFKTsKLQkJfQotCi0JCUxJU1RfSU5TRVJUX0hFQUQoJmFoZC0+cGVuZGluZ19zY2JzLCBzY2IsIHBlbmRpbmdfbGlua3MpOwotCQlkZXYtPm9wZW5pbmdzLS07Ci0JCWRldi0+YWN0aXZlKys7Ci0JCWRldi0+Y29tbWFuZHNfaXNzdWVkKys7Ci0KLQkJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudGluZyBidWNrZXQgYW5kIGR1bXAgaWYgbmVlZGVkICovCi0JCWlmIChkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvcikgewotCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IrKzsKLQkJCWlmIChkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvciA+Ci0JCQkgICAgQUhEX0xJTlVYX0VSUl9USFJFU0gpCi0JCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPSAwOwotCQl9Ci0KLQkJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9QRVJJT0RJQ19PVEFHKSAhPSAwKQotCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcrKzsKLQkJc2NiLT5mbGFncyB8PSBTQ0JfQUNUSVZFOwotCQlhaGRfcXVldWVfc2NiKGFoZCwgc2NiKTsKLQl9Ci19Ci0KLS8qCi0gKiBTQ1NJIGNvbnRyb2xsZXIgaW50ZXJydXB0IGhhbmRsZXIuCi0gKi8KLWlycXJldHVybl90Ci1haGRfbGludXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotewotCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcJZmxhZ3M7Ci0JaW50CW91cnM7Ci0KLQlhaGQgPSAoc3RydWN0IGFoZF9zb2Z0YyAqKSBkZXZfaWQ7Ci0JYWhkX2xvY2soYWhkLCAmZmxhZ3MpOyAKLQlvdXJzID0gYWhkX2ludHIoYWhkKTsKLQlpZiAoYWhkX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGQpICE9IE5VTEwpCi0JCWFoZF9zY2hlZHVsZV9ydW5xKGFoZCk7Ci0JYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOwotCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwotCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOwotfQotCi12b2lkCi1haGRfcGxhdGZvcm1fZmx1c2h3b3JrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQotCXdoaWxlIChhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCkgIT0gTlVMTCkKLQkJOwotfQotCi1zdGF0aWMgc3RydWN0IGFoZF9saW51eF90YXJnZXQqCi1haGRfbGludXhfYWxsb2NfdGFyZ2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY2hhbm5lbCwgdV9pbnQgdGFyZ2V0KQotewotCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOwotCi0JdGFyZyA9IG1hbGxvYyhzaXplb2YoKnRhcmcpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOwotCWlmICh0YXJnID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JbWVtc2V0KHRhcmcsIDAsIHNpemVvZigqdGFyZykpOwotCXRhcmctPmNoYW5uZWwgPSBjaGFubmVsOwotCXRhcmctPnRhcmdldCA9IHRhcmdldDsKLQl0YXJnLT5haGQgPSBhaGQ7Ci0JdGFyZy0+ZmxhZ3MgPSBBSERfRFZfUkVRVUlSRUQ7Ci0JYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF0gPSB0YXJnOwotCXJldHVybiAodGFyZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfZnJlZV90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKLXsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CiAJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87Ci0Jc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIHdpZHRoLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X3BlcmlvZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBwZXJpb2QpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOwogCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0JdV9pbnQgb3VyX2lkOwotCXVfaW50IHRhcmdldF9vZmZzZXQ7Ci0JY2hhciBjaGFubmVsOwotCi0JLyoKLQkgKiBGb3JjZSBhIG5lZ290aWF0aW9uIHRvIGFzeW5jL25hcnJvdyBvbiBhbnkKLQkgKiBmdXR1cmUgY29tbWFuZCB0byB0aGlzIGRldmljZSB1bmxlc3MgYSBidXMKLQkgKiByZXNldCBvY2N1cnMgYmV0d2VlbiBub3cgYW5kIHRoYXQgY29tbWFuZC4KLQkgKi8KLQljaGFubmVsID0gJ0EnICsgdGFyZy0+Y2hhbm5lbDsKLQlvdXJfaWQgPSBhaGQtPm91cl9pZDsKLQl0YXJnZXRfb2Zmc2V0ID0gdGFyZy0+dGFyZ2V0OwotCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGNoYW5uZWwsIG91cl9pZCwKLQkJCQkgICAgdGFyZy0+dGFyZ2V0LCAmdHN0YXRlKTsKLQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBvdXJfaWQsIHRhcmctPnRhcmdldCwgQ0FNX0xVTl9XSUxEQ0FSRCwKLQkJCSAgICBjaGFubmVsLCBST0xFX0lOSVRJQVRPUik7Ci0JYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAwLCAwLCAwLAotCQkJIEFIRF9UUkFOU19HT0FMLCAvKnBhdXNlZCovRkFMU0UpOwotCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKLQkJICAgICAgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7Ci0JYWhkX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGQsICZkZXZpbmZvLCB0c3RhdGUsIHRpbmZvLCBBSERfTkVHX0FMV0FZUyk7Ci0gCWFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XSA9IE5VTEw7Ci0JaWYgKHRhcmctPmlucV9kYXRhICE9IE5VTEwpCi0JCWZyZWUodGFyZy0+aW5xX2RhdGEsIE1fREVWQlVGKTsKLQlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCi0JCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7Ci0JaWYgKHRhcmctPmR2X2J1ZmZlcjEgIT0gTlVMTCkKLQkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7Ci0JZnJlZSh0YXJnLCBNX0RFVkJVRik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSoKLWFoZF9saW51eF9hbGxvY19kZXZpY2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcsIHVfaW50IGx1bikKLXsKLQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCi0JZGV2ID0gbWFsbG9jKHNpemVvZigqZGV2KSwgTV9ERVZCVUcsIE1fTk9XQUlUKTsKLQlpZiAoZGV2ID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKLQlpbml0X3RpbWVyKCZkZXYtPnRpbWVyKTsKLQlUQUlMUV9JTklUKCZkZXYtPmJ1c3lxKTsKLQlkZXYtPmZsYWdzID0gQUhEX0RFVl9VTkNPTkZJR1VSRUQ7Ci0JZGV2LT5sdW4gPSBsdW47Ci0JZGV2LT50YXJnZXQgPSB0YXJnOwotCi0JLyoKLQkgKiBXZSBzdGFydCBvdXQgbGlmZSB1c2luZyB1bnRhZ2dlZAotCSAqIHRyYW5zYWN0aW9ucyBvZiB3aGljaCB3ZSBhbGxvdyBvbmUuCi0JICovCi0JZGV2LT5vcGVuaW5ncyA9IDE7Ci0KLQkvKgotCSAqIFNldCBtYXh0YWdzIHRvIDAuICBUaGlzIHdpbGwgYmUgY2hhbmdlZCBpZiB3ZQotCSAqIGxhdGVyIGRldGVybWluZSB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGgKLQkgKiBhIHRhZ2dlZCBxdWV1aW5nIGNhcGFibGUgZGV2aWNlLgotCSAqLwotCWRldi0+bWF4dGFncyA9IDA7Ci0JCi0JdGFyZy0+cmVmY291bnQrKzsKLQl0YXJnLT5kZXZpY2VzW2x1bl0gPSBkZXY7Ci0JcmV0dXJuIChkZXYpOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKLQotCWRlbF90aW1lcigmZGV2LT50aW1lcik7Ci0JdGFyZyA9IGRldi0+dGFyZ2V0OwotCXRhcmctPmRldmljZXNbZGV2LT5sdW5dID0gTlVMTDsKLQlmcmVlKGRldiwgTV9ERVZCVUYpOwotCXRhcmctPnJlZmNvdW50LS07Ci0JaWYgKHRhcmctPnJlZmNvdW50ID09IDAKLQkgJiYgKHRhcmctPmZsYWdzICYgQUhEX0RWX1JFUVVJUkVEKSA9PSAwKQotCQlhaGRfbGludXhfZnJlZV90YXJnZXQoYWhkLCB0YXJnKTsKLX0KLQotdm9pZAotYWhkX3NlbmRfYXN5bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyIGNoYW5uZWwsCi0JICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlIGNvZGUsIHZvaWQgKmFyZykKLXsKLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIEFDX1RSQU5TRkVSX05FRzoKLQl7Ci0JCWNoYXIJYnVmWzgwXTsKLQkJc3RydWN0CWFoZF9saW51eF90YXJnZXQgKnRhcmc7Ci0JCXN0cnVjdAlpbmZvX3N0ciBpbmZvOwotCQlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87Ci0JCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7Ci0KLQkJaW5mby5idWZmZXIgPSBidWY7Ci0JCWluZm8ubGVuZ3RoID0gc2l6ZW9mKGJ1Zik7Ci0JCWluZm8ub2Zmc2V0ID0gMDsKLQkJaW5mby5wb3MgPSAwOwotCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBjaGFubmVsLCBhaGQtPm91cl9pZCwKLQkJCQkJICAgIHRhcmdldCwgJnRzdGF0ZSk7Ci0KLQkJLyoKLQkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHdoaWxlCi0JCSAqIG5lZ290aWF0aW9ucyBhcmUgc3RpbGwgcGVuZGluZy4KLQkJICovCi0JCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgIT0gdGluZm8tPmdvYWwucGVyaW9kCi0JCSB8fCB0aW5mby0+Y3Vyci53aWR0aCAhPSB0aW5mby0+Z29hbC53aWR0aAotCQkgfHwgdGluZm8tPmN1cnIub2Zmc2V0ICE9IHRpbmZvLT5nb2FsLm9mZnNldAotCQkgfHwgdGluZm8tPmN1cnIucHByX29wdGlvbnMgIT0gdGluZm8tPmdvYWwucHByX29wdGlvbnMpCi0JCQlpZiAoYm9vdHZlcmJvc2UgPT0gMCkKLQkJCQlicmVhazsKLQotCQkvKgotCQkgKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHJlc3VsdHMgdGhhdAotCQkgKiBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGxhc3QgcmVwb3J0ZWQuCi0JCSAqLwotCQl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF07Ci0JCWlmICh0YXJnID09IE5VTEwpCi0JCQlicmVhazsKLQkJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCA9PSB0YXJnLT5sYXN0X3RpbmZvLnBlcmlvZAotCQkgJiYgdGluZm8tPmN1cnIud2lkdGggPT0gdGFyZy0+bGFzdF90aW5mby53aWR0aAotCQkgJiYgdGluZm8tPmN1cnIub2Zmc2V0ID09IHRhcmctPmxhc3RfdGluZm8ub2Zmc2V0Ci0JCSAmJiB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9PSB0YXJnLT5sYXN0X3RpbmZvLnBwcl9vcHRpb25zKQotCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJdGFyZy0+bGFzdF90aW5mby5wZXJpb2QgPSB0aW5mby0+Y3Vyci5wZXJpb2Q7Ci0JCXRhcmctPmxhc3RfdGluZm8ud2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKLQkJdGFyZy0+bGFzdF90aW5mby5vZmZzZXQgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7Ci0JCXRhcmctPmxhc3RfdGluZm8ucHByX29wdGlvbnMgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9uczsKLQotCQlwcmludGYoIiglczolYzoiLCBhaGRfbmFtZShhaGQpLCBjaGFubmVsKTsKLQkJaWYgKHRhcmdldCA9PSBDQU1fVEFSR0VUX1dJTERDQVJEKQotCQkJcHJpbnRmKCIqKTogIik7Ci0JCWVsc2UKLQkJCXByaW50ZigiJWQpOiAiLCB0YXJnZXQpOwotCQlhaGRfZm9ybWF0X3RyYW5zaW5mbygmaW5mbywgJnRpbmZvLT5jdXJyKTsKLQkJaWYgKGluZm8ucG9zIDwgaW5mby5sZW5ndGgpCi0JCQkqaW5mby5idWZmZXIgPSAnXDAnOwotCQllbHNlCi0JCQlidWZbaW5mby5sZW5ndGggLSAxXSA9ICdcMCc7Ci0JCXByaW50ZigiJXMiLCBidWYpOwotCQlicmVhazsKLQl9Ci0gICAgICAgIGNhc2UgQUNfU0VOVF9CRFI6Ci0JewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkJV0FSTl9PTihsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCk7Ci0JCXNjc2lfcmVwb3J0X2RldmljZV9yZXNldChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QsCi0JCQkJCSBjaGFubmVsIC0gJ0EnLCB0YXJnZXQpOwotI2Vsc2UKLQkJU2NzaV9EZXZpY2UgKnNjc2lfZGV2OwotCi0JCS8qCi0JCSAqIEZpbmQgdGhlIFNDU0kgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JCSAqIHJlcXVlc3QgYW5kIGluZGljYXRlIHRoYXQgYSBVQSBpcyBleHBlY3RlZC4KLQkJICovCi0JCWZvciAoc2NzaV9kZXYgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QtPmhvc3RfcXVldWU7Ci0JCSAgICAgc2NzaV9kZXYgIT0gTlVMTDsgc2NzaV9kZXYgPSBzY3NpX2Rldi0+bmV4dCkgewotCQkJaWYgKGNoYW5uZWwgLSAnQScgPT0gc2NzaV9kZXYtPmNoYW5uZWwKLQkJCSAmJiB0YXJnZXQgPT0gc2NzaV9kZXYtPmlkCi0JCQkgJiYgKGx1biA9PSBDQU1fTFVOX1dJTERDQVJECi0JCQkgIHx8IGx1biA9PSBzY3NpX2Rldi0+bHVuKSkgewotCQkJCXNjc2lfZGV2LT53YXNfcmVzZXQgPSAxOwotCQkJCXNjc2lfZGV2LT5leHBlY3RpbmdfY2NfdWEgPSAxOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JfQotICAgICAgICBjYXNlIEFDX0JVU19SRVNFVDoKLQkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7Ci0JCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LAotCQkJCQkgICAgICBjaGFubmVsIC0gJ0EnKTsKLQkJfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHBhbmljKCJhaGRfc2VuZF9hc3luYzogVW5leHBlY3RlZCBhc3luYyBldmVudCIpOwotICAgICAgICB9Ci19Ci0KLS8qCi0gKiBDYWxscyB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZG9uZSBmdW5jdGlvbiBhbmQgZnJlZXMgdGhlIHNjYi4KLSAqLwotdm9pZAotYWhkX2RvbmUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0JU2NzaV9DbW5kICpjbWQ7Ci0Jc3RydWN0CSAgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCi0JaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgewotCQlwcmludGYoIlNDQiAlZCBkb25lJ2QgdHdpY2VcbiIsIFNDQl9HRVRfVEFHKHNjYikpOwotCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7Ci0JCXBhbmljKCJTdG9wcGluZyBmb3Igc2FmZXR5Iik7Ci0JfQotCUxJU1RfUkVNT1ZFKHNjYiwgcGVuZGluZ19saW5rcyk7Ci0JY21kID0gc2NiLT5pb19jdHg7Ci0JZGV2ID0gc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXY7Ci0JZGV2LT5hY3RpdmUtLTsKLQlkZXYtPm9wZW5pbmdzKys7Ci0JaWYgKChjbWQtPnJlc3VsdCAmIChDQU1fREVWX1FGUlpOIDw8IDE2KSkgIT0gMCkgewotCQljbWQtPnJlc3VsdCAmPSB+KENBTV9ERVZfUUZSWk4gPDwgMTYpOwotCQlkZXYtPnFmcm96ZW4tLTsKLQl9Ci0JYWhkX2xpbnV4X3VubWFwX3NjYihhaGQsIHNjYik7Ci0KLQkvKgotCSAqIEd1YXJkIGFnYWluc3Qgc3RhbGUgc2Vuc2UgZGF0YS4KLQkgKiBUaGUgTGludXggbWlkLWxheWVyIGFzc3VtZXMgdGhhdCBzZW5zZQotCSAqIHdhcyByZXRyaWV2ZWQgYW55dGltZSB0aGUgZmlyc3QgYnl0ZSBvZgotCSAqIHRoZSBzZW5zZSBidWZmZXIgbG9va3MgInNhbmUiLgotCSAqLwotCWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKLQlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fUkVRX0lOUFJPRykgewotCQl1aW50MzJfdCBhbW91bnRfeGZlcnJlZDsKLQotCQlhbW91bnRfeGZlcnJlZCA9Ci0JCSAgICBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpIC0gYWhkX2dldF9yZXNpZHVhbChzY2IpOwotCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SKSAhPSAwKSB7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApIHsKLQkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQkJcHJpbnRmKCJTZXQgQ0FNX1VOQ09SX1BBUklUWVxuIik7Ci0JCQl9Ci0jZW5kaWYKLQkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1VOQ09SX1BBUklUWSk7Ci0jaWZkZWYgQUhEX1JFUE9SVF9VTkRFUkZMT1dTCi0JCS8qCi0JCSAqIFRoaXMgY29kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFzIHNvbWUKLQkJICogY2xpZW50cyBvZiB0aGUgU0NTSSBzeXN0ZW0gZG8gbm90IHByb3Blcmx5Ci0JCSAqIGluaXRpYWxpemUgdGhlIHVuZGVyZmxvdyBwYXJhbWV0ZXIuICBUaGlzCi0JCSAqIHJlc3VsdHMgaW4gc3B1cmlvdXMgdGVybWluYXRpb24gb2YgY29tbWFuZHMKLQkJICogdGhhdCBjb21wbGV0ZSBhcyBleHBlY3RlZCAoZS5nLiB1bmRlcmZsb3cgaXMKLQkJICogYWxsb3dlZCBhcyBjb21tYW5kIGNhbiByZXR1cm4gdmFyaWFibGUgYW1vdW50cwotCQkgKiBvZiBkYXRhLgotCQkgKi8KLQkJfSBlbHNlIGlmIChhbW91bnRfeGZlcnJlZCA8IHNjYi0+aW9fY3R4LT51bmRlcmZsb3cpIHsKLQkJCXVfaW50IGk7Ci0KLQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCXByaW50ZigiQ0RCOiIpOwotCQkJZm9yIChpID0gMDsgaSA8IHNjYi0+aW9fY3R4LT5jbWRfbGVuOyBpKyspCi0JCQkJcHJpbnRmKCIgMHgleCIsIHNjYi0+aW9fY3R4LT5jbW5kW2ldKTsKLQkJCXByaW50ZigiXG4iKTsKLQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCXByaW50ZigiU2F3IHVuZGVyZmxvdyAoJWxkIG9mICVsZCBieXRlcykuICIKLQkJCSAgICAgICAiVHJlYXRlZCBhcyBlcnJvclxuIiwKLQkJCQlhaGRfZ2V0X3Jlc2lkdWFsKHNjYiksCi0JCQkJYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSk7Ci0JCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9EQVRBX1JVTl9FUlIpOwotI2VuZGlmCi0JCX0gZWxzZSB7Ci0JCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFfQ01QKTsKLQkJfQotCX0gZWxzZSBpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fU0NTSV9TVEFUVVNfRVJST1IpIHsKLQkJYWhkX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhhaGQsIGRldiwgc2NiKTsKLQl9IGVsc2UgaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1NFTF9USU1FT1VUKSB7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9VTkNPTkZJR1VSRUQ7Ci0JCWlmIChBSERfRFZfQ01EKGNtZCkgPT0gRkFMU0UpCi0JCQlkZXYtPnRhcmdldC0+ZmxhZ3MgJj0gfkFIRF9EVl9SRVFVSVJFRDsKLQl9Ci0JLyoKLQkgKiBTdGFydCBEViBmb3IgZGV2aWNlcyB0aGF0IHJlcXVpcmUgaXQgYXNzdW1pbmcgdGhlIGZpcnN0IGNvbW1hbmQKLQkgKiBzZW50IGRvZXMgbm90IHJlc3VsdCBpbiBhIHNlbGVjdGlvbiB0aW1lb3V0LgotCSAqLwotCWlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpICE9IENBTV9TRUxfVElNRU9VVAotCSAmJiAoZGV2LT50YXJnZXQtPmZsYWdzICYgQUhEX0RWX1JFUVVJUkVEKSAhPSAwKQotCQlhaGRfbGludXhfc3RhcnRfZHYoYWhkKTsKLQotCWlmIChkZXYtPm9wZW5pbmdzID09IDEKLQkgJiYgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fUkVRX0NNUAotCSAmJiBhaGRfZ2V0X3Njc2lfc3RhdHVzKHNjYikgIT0gU0NTSV9TVEFUVVNfUVVFVUVfRlVMTCkKLQkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCsrOwotCS8qCi0JICogU29tZSBkZXZpY2VzIGRlYWwgd2l0aCB0ZW1wb3JhcnkgaW50ZXJuYWwgcmVzb3VyY2UKLQkgKiBzaG9ydGFnZXMgYnkgcmV0dXJuaW5nIHF1ZXVlIGZ1bGwuICBXaGVuIHRoZSBxdWV1ZQotCSAqIGZ1bGwgb2NjdXJycywgd2UgdGhyb3R0bGUgYmFjay4gIFNsb3dseSB0cnkgdG8gZ2V0Ci0JICogYmFjayB0byBvdXIgcHJldmlvdXMgcXVldWUgZGVwdGguCi0JICovCi0JaWYgKChkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpIDwgZGV2LT5tYXh0YWdzCi0JICYmIGRldi0+dGFnX3N1Y2Nlc3NfY291bnQgPiBBSERfVEFHX1NVQ0NFU1NfSU5URVJWQUwpIHsKLQkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCA9IDA7Ci0JCWRldi0+b3BlbmluZ3MrKzsKLQl9Ci0KLQlpZiAoZGV2LT5hY3RpdmUgPT0gMCkKLQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwotCi0JaWYgKFRBSUxRX0VNUFRZKCZkZXYtPmJ1c3lxKSkgewotCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX1VOQ09ORklHVVJFRCkgIT0gMAotCQkgJiYgZGV2LT5hY3RpdmUgPT0gMAotCQkgJiYgKGRldi0+ZmxhZ3MgJiBBSERfREVWX1RJTUVSX0FDVElWRSkgPT0gMCkKLQkJCWFoZF9saW51eF9mcmVlX2RldmljZShhaGQsIGRldik7Ci0JfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfT05fUlVOX0xJU1QpID09IDApIHsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOwotCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfT05fUlVOX0xJU1Q7Ci0JfQotCi0JaWYgKChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkgewotCQlwcmludGYoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOwotCQlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fQkRSX1NFTlQKLQkJIHx8IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9BQk9SVEVEKQotCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOwotCQlpZiAoKHNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfU0NCX1VQX0VIX1NFTSkgIT0gMCkgewotCQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1NDQl9VUF9FSF9TRU07Ci0JCQl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOwotCQl9Ci0JfQotCi0JYWhkX2ZyZWVfc2NiKGFoZCwgc2NiKTsKLQlhaGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoZCwgY21kKTsKLQotCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9XQUlUX1NJTVFfRU1QVFkpICE9IDAKLQkgJiYgTElTVF9GSVJTVCgmYWhkLT5wZW5kaW5nX3NjYnMpID09IE5VTEwpIHsKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX0RWX1dBSVRfU0lNUV9FTVBUWTsKLQkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1haGRfbGludXhfaGFuZGxlX3Njc2lfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCSAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldiwgc3RydWN0IHNjYiAqc2NiKQotewotCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOwotCi0JYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKLQkJCSAgICBhaGQtPm91cl9pZCwKLQkJCSAgICBkZXYtPnRhcmdldC0+dGFyZ2V0LCBkZXYtPmx1biwKLQkJCSAgICBkZXYtPnRhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnIDogJ0InLAotCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKLQkKLQkvKgotCSAqIFdlIGRvbid0IGN1cnJlbnRseSB0cnVzdCB0aGUgbWlkLWxheWVyIHRvCi0JICogcHJvcGVybHkgZGVhbCB3aXRoIHF1ZXVlIGZ1bGwgb3IgYnVzeS4gIFNvLAotCSAqIHdoZW4gb25lIG9jY3Vycywgd2UgdGVsbCB0aGUgbWlkLWxheWVyIHRvCi0JICogdW5jb25kaXRpb25hbGx5IHJlcXVldWUgdGhlIGNvbW1hbmQgdG8gdXMKLQkgKiBzbyB0aGF0IHdlIGNhbiByZXRyeSBpdCBvdXJzZWx2ZXMuICBXZSBhbHNvCi0JICogaW1wbGVtZW50IG91ciBvd24gdGhyb3R0bGluZyBtZWNoYW5pc20gc28KLQkgKiB3ZSBkb24ndCBjbG9iYmVyIHRoZSBkZXZpY2Ugd2l0aCB0b28gbWFueQotCSAqIGNvbW1hbmRzLgotCSAqLwotCXN3aXRjaCAoYWhkX2dldF9zY3NpX3N0YXR1cyhzY2IpKSB7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JY2FzZSBTQ1NJX1NUQVRVU19DSEVDS19DT05EOgotCWNhc2UgU0NTSV9TVEFUVVNfQ01EX1RFUk1JTkFURUQ6Ci0JewotCQlTY3NpX0NtbmQgKmNtZDsKLQotCQkvKgotCQkgKiBDb3B5IHNlbnNlIGluZm9ybWF0aW9uIHRvIHRoZSBPUydzIGNtZAotCQkgKiBzdHJ1Y3R1cmUgaWYgaXQgaXMgYXZhaWxhYmxlLgotCQkgKi8KLQkJY21kID0gc2NiLT5pb19jdHg7Ci0JCWlmICgoc2NiLT5mbGFncyAmIChTQ0JfU0VOU0V8U0NCX1BLVF9TRU5TRSkpICE9IDApIHsKLQkJCXN0cnVjdCBzY3NpX3N0YXR1c19pdV9oZWFkZXIgKnNpdTsKLQkJCXVfaW50IHNlbnNlX3NpemU7Ci0JCQl1X2ludCBzZW5zZV9vZmZzZXQ7Ci0KLQkJCWlmIChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSB7Ci0JCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzaXplb2Yoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSkKLQkJCQkJICAgICAgIC0gYWhkX2dldF9zZW5zZV9yZXNpZHVhbChzY2IpLAotCQkJCQkJIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwotCQkJCXNlbnNlX29mZnNldCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogQ29weSBvbmx5IHRoZSBzZW5zZSBkYXRhIGludG8gdGhlIHByb3ZpZGVkCi0JCQkJICogYnVmZmVyLgotCQkJCSAqLwotCQkJCXNpdSA9IChzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICopCi0JCQkJICAgIHNjYi0+c2Vuc2VfZGF0YTsKLQkJCQlzZW5zZV9zaXplID0gTUlOKHNjc2lfNGJ0b3VsKHNpdS0+c2Vuc2VfbGVuZ3RoKSwKLQkJCQkJCXNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwotCQkJCXNlbnNlX29mZnNldCA9IFNJVV9TRU5TRV9PRkZTRVQoc2l1KTsKLQkJCX0KLQotCQkJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKLQkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwKLQkJCSAgICAgICBhaGRfZ2V0X3NlbnNlX2J1ZihhaGQsIHNjYikKLQkJCSAgICAgICArIHNlbnNlX29mZnNldCwgc2Vuc2Vfc2l6ZSk7Ci0JCQljbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8gCisJCT0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCisJCQkJICAgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsICZ0c3RhdGUpOworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zOworCXVuc2lnbmVkIGludCBkdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdGluZm8tPmdvYWwub2Zmc2V0OwogCiAjaWZkZWYgQUhEX0RFQlVHCi0JCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfU0VOU0UpIHsKLQkJCQlpbnQgaTsKLQotCQkJCXByaW50ZigiQ29waWVkICVkIGJ5dGVzIG9mIHNlbnNlIGRhdGEgYXQgJWQ6IiwKLQkJCQkgICAgICAgc2Vuc2Vfc2l6ZSwgc2Vuc2Vfb2Zmc2V0KTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgc2Vuc2Vfc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKLQkJCQkJCXByaW50ZigiXG4iKTsKLQkJCQkJcHJpbnRmKCIweCV4ICIsIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKLQkJCQl9Ci0JCQkJcHJpbnRmKCJcbiIpOwotCQkJfQorCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCisJCXByaW50ZigiJXM6IHNldCBwZXJpb2QgdG8gJWRcbiIsIGFoZF9uYW1lKGFoZCksIHBlcmlvZCk7CiAjZW5kaWYKLQkJfQotCQlicmVhazsKKwlpZiAob2Zmc2V0ID09IDApCisJCW9mZnNldCA9IE1BWF9PRkZTRVQ7CisKKwlpZiAocGVyaW9kIDwgOCkKKwkJcGVyaW9kID0gODsKKwlpZiAocGVyaW9kIDwgMTApIHsKKwkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROworCQlpZiAocGVyaW9kID09IDgpCisJCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9JVV9SRVE7CiAJfQotCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKLQl7Ci0JCS8qCi0JCSAqIEJ5IHRoZSB0aW1lIHRoZSBjb3JlIGRyaXZlciBoYXMgcmV0dXJuZWQgdGhpcwotCQkgKiBjb21tYW5kLCBhbGwgb3RoZXIgY29tbWFuZHMgdGhhdCB3ZXJlIHF1ZXVlZAotCQkgKiB0byB1cyBidXQgbm90IHRoZSBkZXZpY2UgaGF2ZSBiZWVuIHJldHVybmVkLgotCQkgKiBUaGlzIGVuc3VyZXMgdGhhdCBkZXYtPmFjdGl2ZSBpcyBlcXVhbCB0bwotCQkgKiB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIGFjdHVhbGx5IHF1ZXVlZCB0bwotCQkgKiB0aGUgZGV2aWNlLgotCQkgKi8KLQkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCA9IDA7Ci0JCWlmIChkZXYtPmFjdGl2ZSAhPSAwKSB7Ci0JCQkvKgotCQkJICogRHJvcCBvdXIgb3BlbmluZyBjb3VudCB0byB0aGUgbnVtYmVyCi0JCQkgKiBvZiBjb21tYW5kcyBjdXJyZW50bHkgb3V0c3RhbmRpbmcuCi0JCQkgKi8KLQkJCWRldi0+b3BlbmluZ3MgPSAwOworCisJZHQgPSBwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUTsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKKwkJCSAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisKKwkvKiBhbGwgUFBSIHJlcXVlc3RzIGFwYXJ0IGZyb20gUUFTIHJlcXVpcmUgd2lkZSB0cmFuc2ZlcnMgKi8KKwlpZiAocHByX29wdGlvbnMgJiB+TVNHX0VYVF9QUFJfUUFTX1JFUSkgeworCQlpZiAoc3BpX3dpZHRoKHN0YXJnZXQpID09IDApCisJCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROworCX0KKworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X29mZnNldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBvZmZzZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSAwOworCXVuc2lnbmVkIGludCBwZXJpb2QgPSAwOworCXVuc2lnbmVkIGludCBkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKICNpZmRlZiBBSERfREVCVUcKLQkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUUZVTEwpICE9IDApIHsKLQkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQkJcHJpbnRmKCJEcm9wcGluZyB0YWcgY291bnQgdG8gJWRcbiIsCi0JCQkJICAgICAgIGRldi0+YWN0aXZlKTsKLQkJCX0KKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiBzZXQgb2Zmc2V0IHRvICVkXG4iLCBhaGRfbmFtZShhaGQpLCBvZmZzZXQpOwogI2VuZGlmCi0JCQlpZiAoZGV2LT5hY3RpdmUgPT0gZGV2LT50YWdzX29uX2xhc3RfcXVldWVmdWxsKSB7CiAKLQkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQrKzsKLQkJCQkvKgotCQkJCSAqIElmIHdlIHJlcGVhdGVkbHkgc2VlIGEgcXVldWUgZnVsbAotCQkJCSAqIGF0IHRoZSBzYW1lIHF1ZXVlIGRlcHRoLCB0aGlzCi0JCQkJICogZGV2aWNlIGhhcyBhIGZpeGVkIG51bWJlciBvZiB0YWcKLQkJCQkgKiBzbG90cy4gIExvY2sgaW4gdGhpcyB0YWcgZGVwdGgKLQkJCQkgKiBzbyB3ZSBzdG9wIHNlZWluZyBxdWV1ZSBmdWxscyBmcm9tCi0JCQkJICogdGhpcyBkZXZpY2UuCi0JCQkJICovCi0JCQkJaWYgKGRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudAotCQkJCSA9PSBBSERfTE9DS19UQUdTX0NPVU5UKSB7Ci0JCQkJCWRldi0+bWF4dGFncyA9IGRldi0+YWN0aXZlOwotCQkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQkJCXByaW50ZigiTG9ja2luZyBtYXggdGFnIGNvdW50IGF0ICVkXG4iLAotCQkJCQkgICAgICAgZGV2LT5hY3RpdmUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZGV2LT50YWdzX29uX2xhc3RfcXVldWVmdWxsID0gZGV2LT5hY3RpdmU7Ci0JCQkJZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50ID0gMDsKLQkJCX0KLQkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKLQkJCWFoZF9zZXRfc2NzaV9zdGF0dXMoc2NiLCBTQ1NJX1NUQVRVU19PSyk7Ci0JCQlhaGRfcGxhdGZvcm1fc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywKLQkJCQkgICAgIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX0JBU0lDKQotCQkJCSAgID8gQUhEX1FVRVVFX0JBU0lDIDogQUhEX1FVRVVFX1RBR0dFRCk7Ci0JCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiBEcm9wIGRvd24gdG8gYSBzaW5nbGUgb3BlbmluZywgYW5kIHRyZWF0IHRoaXMKLQkJICogYXMgaWYgdGhlIHRhcmdldCByZXR1cm5lZCBCVVNZIFNDU0kgc3RhdHVzLgotCQkgKi8KLQkJZGV2LT5vcGVuaW5ncyA9IDE7Ci0JCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsICZkZXZpbmZvLAotCQkJICAgICAoZGV2LT5mbGFncyAmIEFIRF9ERVZfUV9CQVNJQykKLQkJCSAgID8gQUhEX1FVRVVFX0JBU0lDIDogQUhEX1FVRVVFX1RBR0dFRCk7Ci0JCWFoZF9zZXRfc2NzaV9zdGF0dXMoc2NiLCBTQ1NJX1NUQVRVU19CVVNZKTsKLQkJLyogRkFMTFRIUk9VR0ggKi8KKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWlmIChvZmZzZXQgIT0gMCkgeworCQlwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJCXBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnM7CisJCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCAKKwkJCQkgIGR0ID8gQUhEX1NZTkNSQVRFX01BWCA6IEFIRF9TWU5DUkFURV9VTFRSQTIpOwogCX0KLQljYXNlIFNDU0lfU1RBVFVTX0JVU1k6Ci0JCS8qCi0JCSAqIFNldCBhIHNob3J0IHRpbWVyIHRvIGRlZmVyIHNlbmRpbmcgY29tbWFuZHMgZm9yCi0JCSAqIGEgYml0IHNpbmNlIExpbnV4IHdpbGwgbm90IGRlbGF5IGluIHRoaXMgY2FzZS4KLQkJICovCi0JCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSAhPSAwKSB7Ci0JCQlwcmludGYoIiVzOiVjOiVkOiBEZXZpY2UgVGltZXIgc3RpbGwgYWN0aXZlIGR1cmluZyAiCi0JCQkgICAgICAgImJ1c3kgcHJvY2Vzc2luZ1xuIiwgYWhkX25hbWUoYWhkKSwKLQkJCQlkZXYtPnRhcmdldC0+Y2hhbm5lbCwgZGV2LT50YXJnZXQtPnRhcmdldCk7Ci0JCQlicmVhazsKLQkJfQotCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVElNRVJfQUNUSVZFOwotCQlkZXYtPnFmcm96ZW4rKzsKLQkJaW5pdF90aW1lcigmZGV2LT50aW1lcik7Ci0JCWRldi0+dGltZXIuZGF0YSA9ICh1X2xvbmcpZGV2OwotCQlkZXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaLzIpOwotCQlkZXYtPnRpbWVyLmZ1bmN0aW9uID0gYWhkX2xpbnV4X2Rldl90aW1lZF91bmZyZWV6ZTsKLQkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKLQkJYnJlYWs7Ci0JfQorCisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zLAorCQkJIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkCi1haGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgU2NzaV9DbW5kICpjbWQpCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X2R0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IGR0KQogewotCS8qCi0JICogVHlwaWNhbGx5LCB0aGUgY29tcGxldGUgcXVldWUgaGFzIHZlcnkgZmV3IGVudHJpZXMKLQkgKiBxdWV1ZWQgdG8gaXQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBlbXB0aWVkIGJ5Ci0JICogYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZSwgc28gc29ydGluZyB0aGUgZW50cmllcwotCSAqIGJ5IGdlbmVyYXRpb24gbnVtYmVyIHNob3VsZCBiZSBpbmV4cGVuc2l2ZS4KLQkgKiBXZSBwZXJmb3JtIHRoZSBzb3J0IHNvIHRoYXQgY29tbWFuZHMgdGhhdCBjb21wbGV0ZQotCSAqIHdpdGggYW4gZXJyb3IgYXJlIHJldHVuZWQgaW4gdGhlIG9yZGVyIG9yaWdpb25hbGx5Ci0JICogcXVldWVkIHRvIHRoZSBjb250cm9sbGVyIHNvIHRoYXQgYW55IHN1YnNlcXVlbnQgcmV0cmllcwotCSAqIGFyZSBwZXJmb3JtZWQgaW4gb3JkZXIuICBUaGUgdW5kZXJseWluZyBhaGQgcm91dGluZXMgZG8KLQkgKiBub3QgZ3VhcmFudGVlIHRoZSBvcmRlciB0aGF0IGFib3J0ZWQgY29tbWFuZHMgd2lsbCBiZQotCSAqIHJldHVybmVkIHRvIHVzLgotCSAqLwotCXN0cnVjdCBhaGRfY29tcGxldGVxICpjb21wbGV0ZXE7Ci0Jc3RydWN0IGFoZF9jbWQgKmxpc3RfY21kOwotCXN0cnVjdCBhaGRfY21kICphY21kOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnMKKwkJJiB+TVNHX0VYVF9QUFJfRFRfUkVROworCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJdW5zaWduZWQgaW50IHdpZHRoID0gdGluZm8tPmdvYWwud2lkdGg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qCi0JICogTWFwIENBTSBlcnJvciBjb2RlcyBpbnRvIExpbnV4IEVycm9yIGNvZGVzLiAgV2UKLQkgKiBhdm9pZCB0aGUgY29udmVyc2lvbiBzbyB0aGF0IHRoZSBEViBjb2RlIGhhcyB0aGUKLQkgKiBmdWxsIGVycm9yIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB3aGVuIG1ha2luZwotCSAqIHN0YXRlIGNoYW5nZSBkZWNpc2lvbnMuCi0JICovCi0JaWYgKEFIRF9EVl9DTUQoY21kKSA9PSBGQUxTRSkgewotCQl1aW50MzJfdCBzdGF0dXM7Ci0JCXVfaW50IG5ld19zdGF0dXM7Ci0KLQkJc3RhdHVzID0gYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCk7Ci0JCWlmIChzdGF0dXMgIT0gQ0FNX1JFUV9DTVApIHsKLQkJCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKLQkJCWNhbV9zdGF0dXMgY2FtX3N0YXR1czsKLQkJCXVpbnQzMl90IGFjdGlvbjsKLQkJCXVfaW50IHNjc2lfc3RhdHVzOwotCi0JCQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAotCQkJCQkJICAgY21kLT5kZXZpY2UtPmlkLAotCQkJCQkJICAgY21kLT5kZXZpY2UtPmx1biwKLQkJCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKLQotCQkJaWYgKGRldiA9PSBOVUxMKQotCQkJCWdvdG8gbm9fZmFsbGJhY2s7Ci0KLQkJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCi0JCQkJCSAgICBhaGQtPm91cl9pZCwKLQkJCQkJICAgIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuLAotCQkJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJzonQicsCi0JCQkJCSAgICBST0xFX0lOSVRJQVRPUik7Ci0KLQkJCXNjc2lfc3RhdHVzID0gYWhkX2NtZF9nZXRfc2NzaV9zdGF0dXMoY21kKTsKLQkJCWNhbV9zdGF0dXMgPSBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKTsKLQkJCWFjdGlvbiA9IGFpY19lcnJvcl9hY3Rpb24oY21kLCBkZXYtPnRhcmdldC0+aW5xX2RhdGEsCi0JCQkJCQkgIGNhbV9zdGF0dXMsIHNjc2lfc3RhdHVzKTsKLQkJCWlmICgoYWN0aW9uICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7Ci0KLQkJCQkvKiBVcGRhdGUgc3RhdHMgKi8KLQkJCQlkZXYtPnRhcmdldC0+ZXJyb3JzX2RldGVjdGVkKys7Ci0JCQkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yID09IDApCi0JCQkJCWRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yKys7Ci0JCQkJZWxzZSB7Ci0JCQkJCWRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yID0gMDsKLQkJCQkJYWhkX2xpbnV4X2ZhbGxiYWNrKGFoZCwgJmRldmluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotbm9fZmFsbGJhY2s6Ci0JCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCWNhc2UgQ0FNX1JFUV9JTlBST0c6Ci0JCWNhc2UgQ0FNX1JFUV9DTVA6Ci0JCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgotCQkJbmV3X3N0YXR1cyA9IERJRF9PSzsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9SRVFfQUJPUlRFRDoKLQkJCW5ld19zdGF0dXMgPSBESURfQUJPUlQ7Ci0JCQlicmVhazsKLQkJY2FzZSBDQU1fQlVTWToKLQkJCW5ld19zdGF0dXMgPSBESURfQlVTX0JVU1k7Ci0JCQlicmVhazsKLQkJY2FzZSBDQU1fUkVRX0lOVkFMSUQ6Ci0JCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKLQkJCW5ld19zdGF0dXMgPSBESURfQkFEX1RBUkdFVDsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9TRUxfVElNRU9VVDoKLQkJCW5ld19zdGF0dXMgPSBESURfTk9fQ09OTkVDVDsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKLQkJY2FzZSBDQU1fQkRSX1NFTlQ6Ci0JCQluZXdfc3RhdHVzID0gRElEX1JFU0VUOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNX1VOQ09SX1BBUklUWToKLQkJCW5ld19zdGF0dXMgPSBESURfUEFSSVRZOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNX0NNRF9USU1FT1VUOgotCQkJbmV3X3N0YXR1cyA9IERJRF9USU1FX09VVDsKLQkJCWJyZWFrOwotCQljYXNlIENBTV9VQV9BQk9SVDoKLQkJY2FzZSBDQU1fUkVRX0NNUF9FUlI6Ci0JCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgotCQljYXNlIENBTV9OT19IQkE6Ci0JCWNhc2UgQ0FNX0RBVEFfUlVOX0VSUjoKLQkJY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKLQkJY2FzZSBDQU1fU0VRVUVOQ0VfRkFJTDoKLQkJY2FzZSBDQU1fQ0NCX0xFTl9FUlI6Ci0JCWNhc2UgQ0FNX1BST1ZJREVfRkFJTDoKLQkJY2FzZSBDQU1fUkVRX1RFUk1JTzoKLQkJY2FzZSBDQU1fVU5SRUNfSEJBX0VSUk9SOgotCQljYXNlIENBTV9SRVFfVE9PX0JJRzoKLQkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7Ci0JCQlicmVhazsKLQkJY2FzZSBDQU1fUkVRVUVVRV9SRVE6Ci0JCQkvKgotCQkJICogSWYgd2Ugd2FudCB0aGUgcmVxdWVzdCByZXF1ZXVlZCwgbWFrZSBzdXJlIHRoZXJlCi0JCQkgKiBhcmUgc3VmZmljZW50IHJldHJpZXMuICBJbiB0aGUgb2xkIHNjc2kgZXJyb3IgY29kZSwKLQkJCSAqIHdlIHVzZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGEgcmVzdWx0IGNvZGUgdGhhdAotCQkJICogYnlwYXNzZWQgdGhlIHJldHJ5IGNvdW50LiAgTm93IHdlIG11c3QgdXNlIHRoaXMKLQkJCSAqIGhhY2suICBXZSBhbHNvICJmYWtlIiBhIGNoZWNrIGNvbmRpdGlvbiB3aXRoCi0JCQkgKiBhIHNlbnNlIGNvZGUgb2YgQUJPUlRFRCBDT01NQU5ELiAgVGhpcyBzZWVtcyB0bwotCQkJICogZXZva2UgYSByZXRyeSBldmVuIGlmIHRoaXMgY29tbWFuZCBpcyBiZWluZyBzZW50Ci0JCQkgKiB2aWEgdGhlIGVoIHRocmVhZC4gIEljayEgIEljayEgIEljayEKLQkJCSAqLwotCQkJaWYgKGNtZC0+cmV0cmllcyA+IDApCi0JCQkJY21kLT5yZXRyaWVzLS07Ci0JCQluZXdfc3RhdHVzID0gRElEX09LOwotCQkJYWhkX2NtZF9zZXRfc2NzaV9zdGF0dXMoY21kLCBTQ1NJX1NUQVRVU19DSEVDS19DT05EKTsKLQkJCWNtZC0+cmVzdWx0IHw9IChEUklWRVJfU0VOU0UgPDwgMjQpOwotCQkJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLAotCQkJICAgICAgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwotCQkJY21kLT5zZW5zZV9idWZmZXJbMF0gPSBTU0RfRVJSQ09ERV9WQUxJRAotCQkJCQkgICAgIHwgU1NEX0NVUlJFTlRfRVJST1I7Ci0JCQljbWQtPnNlbnNlX2J1ZmZlclsyXSA9IFNTRF9LRVlfQUJPUlRFRF9DT01NQU5EOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KLQkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7Ci0JCQlicmVhazsKLQkJfQotCi0JCWFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIG5ld19zdGF0dXMpOwotCX0KLQotCWNvbXBsZXRlcSA9ICZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcTsKLQlsaXN0X2NtZCA9IFRBSUxRX0ZJUlNUKGNvbXBsZXRlcSk7Ci0JYWNtZCA9IChzdHJ1Y3QgYWhkX2NtZCAqKWNtZDsKLQl3aGlsZSAobGlzdF9jbWQgIT0gTlVMTAotCSAgICAmJiBhY21kX3Njc2lfY21kKGxpc3RfY21kKS5zZXJpYWxfbnVtYmVyCi0JICAgICA8IGFjbWRfc2NzaV9jbWQoYWNtZCkuc2VyaWFsX251bWJlcikKLQkJbGlzdF9jbWQgPSBUQUlMUV9ORVhUKGxpc3RfY21kLCBhY21kX2xpbmtzLnRxZSk7Ci0JaWYgKGxpc3RfY21kICE9IE5VTEwpCi0JCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdF9jbWQsIGFjbWQsIGFjbWRfbGlua3MudHFlKTsKLQllbHNlCi0JCVRBSUxRX0lOU0VSVF9UQUlMKGNvbXBsZXRlcSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOwotfQotCi1zdGF0aWMgdm9pZAotYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQotewotCXN0cnVjdAlzY3NpX2lucXVpcnlfZGF0YSAqc2lkOwotCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKLQlzdHJ1Y3QJYWhkX3RyYW5zaW5mbyAqdXNlcjsKLQlzdHJ1Y3QJYWhkX3RyYW5zaW5mbyAqZ29hbDsKLQlzdHJ1Y3QJYWhkX3RyYW5zaW5mbyAqY3VycjsKLQlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOwotCXN0cnVjdAlhaGRfbGludXhfZGV2aWNlICpkZXY7Ci0JdV9pbnQJd2lkdGg7Ci0JdV9pbnQJcGVyaW9kOwotCXVfaW50CW9mZnNldDsKLQl1X2ludAlwcHJfb3B0aW9uczsKLQl1X2ludAl0cmFuc192ZXJzaW9uOwotCXVfaW50CXByb3RfdmVyc2lvbjsKLQotCS8qCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgbHVuIGFjdHVhbGx5IGV4aXN0cy4gIElmIHNvLAotCSAqIGhvbGQgb24gdG8gaXRzIGNvcnJlc3BvbmRpbmcgZGV2aWNlIHN0cnVjdHVyZS4KLQkgKiBJZiBub3QsIG1ha2Ugc3VyZSB3ZSByZWxlYXNlIHRoZSBkZXZpY2UgYW5kCi0JICogZG9uJ3QgYm90aGVyIHByb2Nlc3NpbmcgdGhlIHJlc3Qgb2YgdGhpcyBpbnF1aXJ5Ci0JICogY29tbWFuZC4KLQkgKi8KLQlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmluZm8tPmNoYW5uZWwgLSAnQScsCi0JCQkJICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4sCi0JCQkJICAgLyphbGxvYyovVFJVRSk7Ci0KLQlzaWQgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICopZGV2LT50YXJnZXQtPmlucV9kYXRhOwotCWlmIChTSURfUVVBTChzaWQpID09IFNJRF9RVUFMX0xVX0NPTk5FQ1RFRCkgewotCi0JCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfVU5DT05GSUdVUkVEOworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCisJCXByaW50ZigiJXM6ICVzIERUXG4iLCBhaGRfbmFtZShhaGQpLCAKKwkJICAgICAgIGR0ID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKyNlbmRpZgorCWlmIChkdCkgeworCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCWlmICghd2lkdGgpCisJCQlhaGRfbGludXhfc2V0X3dpZHRoKHN0YXJnZXQsIDEpOwogCX0gZWxzZSB7Ci0JCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9VTkNPTkZJR1VSRUQ7CisJCWlmIChwZXJpb2QgPD0gOSkKKwkJCXBlcmlvZCA9IDEwOyAvKiBJZiByZXNldHRpbmcgRFQsIHBlcmlvZCBtdXN0IGJlID49IDI1bnMgKi8KKwkJLyogSVUgaXMgaW52YWxpZCB3aXRob3V0IERUIHNldCAqLworCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfSVVfUkVROworCX0KKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X3FhcyhzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBxYXMpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCQkmIH5NU0dfRVhUX1BQUl9RQVNfUkVROworCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJdW5zaWduZWQgaW50IGR0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiAlcyBRQVNcbiIsIGFoZF9uYW1lKGFoZCksIAorCQkgICAgICAgcWFzID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKyNlbmRpZgorCisJaWYgKHFhcykgeworCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9RQVNfUkVROyAKKwl9CisKKwlkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAwLAorCQkJICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywKKwkJCSAgZHQgPyBBSERfU1lOQ1JBVEVfTUFYIDogQUhEX1NZTkNSQVRFX1VMVFJBMik7CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCBwZXJpb2QsIHRpbmZvLT5nb2FsLm9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldF9pdShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBpdSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8gCisJCT0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCisJCQkJICAgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsICZ0c3RhdGUpOworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zCisJCSYgfk1TR19FWFRfUFBSX0lVX1JFUTsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kID0gdGluZm8tPmdvYWwucGVyaW9kOworCXVuc2lnbmVkIGludCBkdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKKwkJcHJpbnRmKCIlczogJXMgSVVcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBpdSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisjZW5kaWYKKworCWlmIChpdSkgeworCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9JVV9SRVE7CisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0RUX1JFUTsgLyogSVUgcmVxdWlyZXMgRFQgKi8KKwl9CisKKwlkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAwLAorCQkJICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywKKwkJCSAgZHQgPyBBSERfU1lOQ1JBVEVfTUFYIDogQUhEX1NZTkNSQVRFX1VMVFJBMik7CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCBwZXJpb2QsIHRpbmZvLT5nb2FsLm9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldF9yZF9zdHJtKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IHJkc3RybSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YSk7CisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8gCisJCT0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCisJCQkJICAgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsICZ0c3RhdGUpOworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVuc2lnbmVkIGludCBwcHJfb3B0aW9ucyA9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zCisJCSYgfk1TR19FWFRfUFBSX1JEX1NUUk07CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHRpbmZvLT5nb2FsLnBlcmlvZDsKKwl1bnNpZ25lZCBpbnQgZHQgPSBwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKKwkJcHJpbnRmKCIlczogJXMgUmVhZCBTdHJlYW1pbmdcbiIsIGFoZF9uYW1lKGFoZCksIAorCQkgICAgICAgcmRzdHJtICA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisjZW5kaWYKKworCWlmIChyZHN0cm0pCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JEX1NUUk07CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X3dyX2Zsb3coc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgd3JmbG93KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnMKKwkJJiB+TVNHX0VYVF9QUFJfV1JfRkxPVzsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kID0gdGluZm8tPmdvYWwucGVyaW9kOworCXVuc2lnbmVkIGludCBkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiAlcyBXcml0ZSBGbG93IENvbnRyb2xcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICB3cmZsb3cgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworI2VuZGlmCisKKwlpZiAod3JmbG93KQorCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9XUl9GTE9XOworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAwLAorCQkJICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywKKwkJCSAgZHQgPyBBSERfU1lOQ1JBVEVfTUFYIDogQUhEX1NZTkNSQVRFX1VMVFJBMik7CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCBwZXJpb2QsIHRpbmZvLT5nb2FsLm9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldF9ydGkoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgcnRpKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnMKKwkJJiB+TVNHX0VYVF9QUFJfUlRJOworCXVuc2lnbmVkIGludCBwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJdW5zaWduZWQgaW50IGR0ID0gcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpID09IDApIHsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKKwkJCXByaW50ZigiJXM6IFJUSSBub3QgYXZhaWxhYmxlXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgogCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBVcGRhdGUgb3VyIG5vdGlvbiBvZiB0aGlzIGRldmljZSdzIHRyYW5zZmVyCi0JICogbmVnb3RpYXRpb24gY2FwYWJpbGl0aWVzLgotCSAqLwotCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGRldmluZm8tPmNoYW5uZWwsCi0JCQkJICAgIGRldmluZm8tPm91cl9zY3NpaWQsCi0JCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7Ci0JdXNlciA9ICZ0aW5mby0+dXNlcjsKLQlnb2FsID0gJnRpbmZvLT5nb2FsOwotCWN1cnIgPSAmdGluZm8tPmN1cnI7Ci0Jd2lkdGggPSB1c2VyLT53aWR0aDsKLQlwZXJpb2QgPSB1c2VyLT5wZXJpb2Q7Ci0Jb2Zmc2V0ID0gdXNlci0+b2Zmc2V0OwotCXBwcl9vcHRpb25zID0gdXNlci0+cHByX29wdGlvbnM7Ci0JdHJhbnNfdmVyc2lvbiA9IHVzZXItPnRyYW5zcG9ydF92ZXJzaW9uOwotCXByb3RfdmVyc2lvbiA9IE1JTih1c2VyLT5wcm90b2NvbF92ZXJzaW9uLCBTSURfQU5TSV9SRVYoc2lkKSk7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKKwkJcHJpbnRmKCIlczogJXMgUlRJXG4iLCBhaGRfbmFtZShhaGQpLAorCQkgICAgICAgcnRpID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKyNlbmRpZgogCi0JLyoKLQkgKiBPbmx5IGF0dGVtcHQgU1BJMy80IG9uY2Ugd2UndmUgdmVyaWZpZWQgdGhhdAotCSAqIHRoZSBkZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQgU1BJMy80IGZlYXR1cmVzLgotCSAqLwotCWlmIChwcm90X3ZlcnNpb24gPCBTQ1NJX1JFVl8yKQotCQl0cmFuc192ZXJzaW9uID0gU0lEX0FOU0lfUkVWKHNpZCk7Ci0JZWxzZQotCQl0cmFuc192ZXJzaW9uID0gU0NTSV9SRVZfMjsKKwlpZiAocnRpKQorCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9SVEk7CiAKLQlpZiAoKHNpZC0+ZmxhZ3MgJiBTSURfV0J1czE2KSA9PSAwKQotCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7Ci0JaWYgKChzaWQtPmZsYWdzICYgU0lEX1N5bmMpID09IDApIHsKLQkJcGVyaW9kID0gMDsKLQkJb2Zmc2V0ID0gMDsKLQkJcHByX29wdGlvbnMgPSAwOwotCX0KLQlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX1FBUykgPT0gMCkKLQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX1FBU19SRVE7Ci0JaWYgKChzaWQtPnNwaTNkYXRhICYgU0lEX1NQSV9DTE9DS19EVCkgPT0gMCkKLQkJcHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfUUFTX1JFUTsKLQlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX0lVUykgPT0gMCkKLQkJcHByX29wdGlvbnMgJj0gKE1TR19FWFRfUFBSX0RUX1JFUQotCQkJICAgICAgfCBNU0dfRVhUX1BQUl9RQVNfUkVRKTsKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKIAotCWlmIChwcm90X3ZlcnNpb24gPiBTQ1NJX1JFVl8yCi0JICYmIHBwcl9vcHRpb25zICE9IDApCi0JCXRyYW5zX3ZlcnNpb24gPSB1c2VyLT50cmFuc3BvcnRfdmVyc2lvbjsKLQotCWFoZF92YWxpZGF0ZV93aWR0aChhaGQsIC8qdGluZm8gbGltaXQqL05VTEwsICZ3aWR0aCwgUk9MRV9VTktOT1dOKTsKLQlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywgQUhEX1NZTkNSQVRFX01BWCk7Ci0JYWhkX3ZhbGlkYXRlX29mZnNldChhaGQsIC8qdGluZm8gbGltaXQqL05VTEwsIHBlcmlvZCwKLQkJCSAgICAmb2Zmc2V0LCB3aWR0aCwgUk9MRV9VTktOT1dOKTsKLQlpZiAob2Zmc2V0ID09IDAgfHwgcGVyaW9kID09IDApIHsKLQkJcGVyaW9kID0gMDsKLQkJb2Zmc2V0ID0gMDsKLQkJcHByX29wdGlvbnMgPSAwOwotCX0KLQkvKiBBcHBseSBvdXIgZmlsdGVyZWQgdXNlciBzZXR0aW5ncy4gKi8KLQljdXJyLT50cmFuc3BvcnRfdmVyc2lvbiA9IHRyYW5zX3ZlcnNpb247Ci0JY3Vyci0+cHJvdG9jb2xfdmVyc2lvbiA9IHByb3RfdmVyc2lvbjsKLQlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgd2lkdGgsIEFIRF9UUkFOU19HT0FMLCAvKnBhdXNlZCovRkFMU0UpOwotCWFoZF9zZXRfc3luY3JhdGUoYWhkLCBkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCwgcHByX29wdGlvbnMsCi0JCQkgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgcGVyaW9kLCB0aW5mby0+Z29hbC5vZmZzZXQsCisJCQkgcHByX29wdGlvbnMsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiB9CiAKLXZvaWQKLWFoZF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2V0X3Bjb21wX2VuKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IHBjb21wKQogewotCWFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbisrOwotCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPT0gMSkgewotCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Ci0JCWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKGFoZCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwgQUxMX0NIQU5ORUxTLAotCQkJCQlDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLAotCQkJCQlST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRKTsKLQl9CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvIAorCQk9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCSAgICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgICAgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAmdHN0YXRlKTsKKwlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHByX29wdGlvbnMgPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCQkmIH5NU0dfRVhUX1BQUl9QQ09NUF9FTjsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kID0gdGluZm8tPmdvYWwucGVyaW9kOworCXVuc2lnbmVkIGludCBkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQorCQlwcmludGYoIiVzOiAlcyBQcmVjb21wZW5zYXRpb25cbiIsIGFoZF9uYW1lKGFoZCksIAorCQkgICAgICAgcGNvbXAgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7CisjZW5kaWYKKworCWlmIChwY29tcCkKKwkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUENPTVBfRU47CisKKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCisJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLAorCQkJICBkdCA/IEFIRF9TWU5DUkFURV9NQVggOiBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKworCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIHBlcmlvZCwgdGluZm8tPmdvYWwub2Zmc2V0LAorCQkJIHBwcl9vcHRpb25zLCBBSERfVFJBTlNfR09BTCwgRkFMU0UpOworCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwogfQogCi12b2lkCi1haGRfcmVsZWFzZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXRfaG9sZF9tY3Moc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgaG9sZCkKIHsKLQl1X2xvbmcgczsKLQlpbnQgICAgdW5ibG9ja19yZXFzOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhaGRfc29mdGMgKmFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbyAKKwkJPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkgICAgICBzdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgJnRzdGF0ZSk7CisJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJdW5zaWduZWQgaW50IHBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnMKKwkJJiB+TVNHX0VYVF9QUFJfSE9MRF9NQ1M7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHRpbmZvLT5nb2FsLnBlcmlvZDsKKwl1bnNpZ25lZCBpbnQgZHQgPSBwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JdW5ibG9ja19yZXFzID0gMDsKLQlhaGRfbG9jayhhaGQsICZzKTsKLQlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKLQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuLS07Ci0JaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAwKSB7Ci0JCXVuYmxvY2tfcmVxcyA9IDE7Ci0JfQotCWlmIChBSERfRFZfU0lNUV9GUk9aRU4oYWhkKQotCSAmJiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0UpICE9IDApKSB7Ci0JCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9EVl9XQUlUX1NJTVFfUkVMRUFTRTsKLQkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKLQl9Ci0JYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCS8qCi0JICogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGhlcmUuICBUaGUgbWlkLWxheWVyCi0JICogc2hvdWxkIGtlZXAgaXRzIG93biBmcmVlemUgY291bnQgYW5kIHVzZQotCSAqIGEgYm90dG9tIGhhbGYgaGFuZGxlciB0byBydW4gdGhlIHF1ZXVlcwotCSAqIHNvIHdlIGNhbiB1bmJsb2NrIHdpdGggb3VyIG93biBsb2NrIGhlbGQuCi0JICovCi0JaWYgKHVuYmxvY2tfcmVxcykKLQkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisJaWYgKGhvbGQpCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0hPTERfTUNTOworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgc2hvc3QtPnRoaXNfaWQsIHN0YXJnZXQtPmlkLCAwLAorCQkJICAgIHN0YXJnZXQtPmNoYW5uZWwgKyAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywKKwkJCSAgZHQgPyBBSERfU1lOQ1JBVEVfTUFYIDogQUhEX1NZTkNSQVRFX1VMVFJBMik7CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCBwZXJpb2QsIHRpbmZvLT5nb2FsLm9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQKLWFoZF9saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKQotewotCXN0cnVjdAlzY2IgKnNjYjsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7Ci0JdV9sb25nCXM7CiAKLQlzY2IgPSAoc3RydWN0IHNjYiAqKWFyZzsKLQlhaGQgPSBzY2ItPmFoZF9zb2Z0YzsKLQlhaGRfbG9jayhhaGQsICZzKTsKLQlpZiAoKHNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfU0NCX1VQX0VIX1NFTSkgIT0gMCkgewotCQlzY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSERfU0NCX1VQX0VIX1NFTTsKLQkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKLQl9Ci0JYWhkX3VubG9jayhhaGQsICZzKTsKLX0KIAotc3RhdGljIHZvaWQKLWFoZF9saW51eF9kZXZfdGltZWRfdW5mcmVlemUodV9sb25nIGFyZykKLXsKLQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKLQl1X2xvbmcgczsKLQotCWRldiA9IChzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqKWFyZzsKLQlhaGQgPSBkZXYtPnRhcmdldC0+YWhkOwotCWFoZF9sb2NrKGFoZCwgJnMpOwotCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfVElNRVJfQUNUSVZFOwotCWlmIChkZXYtPnFmcm96ZW4gPiAwKQotCQlkZXYtPnFmcm96ZW4tLTsKLQlpZiAoZGV2LT5xZnJvemVuID09IDAKLQkgJiYgKGRldi0+ZmxhZ3MgJiBBSERfREVWX09OX1JVTl9MSVNUKSA9PSAwKQotCQlhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZShhaGQsIGRldik7Ci0JaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9VTkNPTkZJR1VSRUQpICE9IDAKLQkgJiYgZGV2LT5hY3RpdmUgPT0gMCkKLQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKGFoZCwgZGV2KTsKLQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotfQotCi12b2lkCi1haGRfcGxhdGZvcm1fZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OwotCWludCB0YXJnZXQ7Ci0JaW50IG1heHRhcmdldDsKLQlpbnQgbHVuOwotCWludCBpOwotCi0JbWF4dGFyZ2V0ID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNSA6IDc7Ci0JZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD1tYXh0YXJnZXQ7IHRhcmdldCsrKSB7Ci0KLQkJZm9yIChsdW4gPSAwOyBsdW4gPCBBSERfTlVNX0xVTlM7IGx1bisrKSB7Ci0JCQlzdHJ1Y3QgYWhkX2NtZCAqYWNtZDsKLQotCQkJZGV2ID0gYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCAwLCB0YXJnZXQsCi0JCQkJCQkgICBsdW4sIC8qYWxsb2MqL0ZBTFNFKTsKLQkJCWlmIChkZXYgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJcHJpbnRmKCJEZXZRKCVkOiVkOiVkKTogIiwgMCwgdGFyZ2V0LCBsdW4pOwotCQkJaSA9IDA7Ci0JCQlUQUlMUV9GT1JFQUNIKGFjbWQsICZkZXYtPmJ1c3lxLCBhY21kX2xpbmtzLnRxZSkgewotCQkJCWlmIChpKysgPiBBSERfU0NCX01BWCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwcmludGYoIiVkIHdhaXRpbmdcbiIsIGkpOwotCQl9Ci0JfQotfQorc3RhdGljIHN0cnVjdCBzcGlfZnVuY3Rpb25fdGVtcGxhdGUgYWhkX2xpbnV4X3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7CisJLnNldF9vZmZzZXQJPSBhaGRfbGludXhfc2V0X29mZnNldCwKKwkuc2hvd19vZmZzZXQJPSAxLAorCS5zZXRfcGVyaW9kCT0gYWhkX2xpbnV4X3NldF9wZXJpb2QsCisJLnNob3dfcGVyaW9kCT0gMSwKKwkuc2V0X3dpZHRoCT0gYWhkX2xpbnV4X3NldF93aWR0aCwKKwkuc2hvd193aWR0aAk9IDEsCisJLnNldF9kdAkJPSBhaGRfbGludXhfc2V0X2R0LAorCS5zaG93X2R0CT0gMSwKKwkuc2V0X2l1CQk9IGFoZF9saW51eF9zZXRfaXUsCisJLnNob3dfaXUJPSAxLAorCS5zZXRfcWFzCT0gYWhkX2xpbnV4X3NldF9xYXMsCisJLnNob3dfcWFzCT0gMSwKKwkuc2V0X3JkX3N0cm0JPSBhaGRfbGludXhfc2V0X3JkX3N0cm0sCisJLnNob3dfcmRfc3RybQk9IDEsCisJLnNldF93cl9mbG93CT0gYWhkX2xpbnV4X3NldF93cl9mbG93LAorCS5zaG93X3dyX2Zsb3cJPSAxLAorCS5zZXRfcnRpCT0gYWhkX2xpbnV4X3NldF9ydGksCisJLnNob3dfcnRpCT0gMSwKKwkuc2V0X3Bjb21wX2VuCT0gYWhkX2xpbnV4X3NldF9wY29tcF9lbiwKKwkuc2hvd19wY29tcF9lbgk9IDEsCisJLnNldF9ob2xkX21jcwk9IGFoZF9saW51eF9zZXRfaG9sZF9tY3MsCisJLnNob3dfaG9sZF9tY3MJPSAxLAorfTsKIAogc3RhdGljIGludCBfX2luaXQKIGFoZF9saW51eF9pbml0KHZvaWQpCiB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXJldHVybiBhaGRfbGludXhfZGV0ZWN0KCZhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSk7Ci0jZWxzZQotCXNjc2lfcmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOwotCWlmIChhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZS5wcmVzZW50ID09IDApIHsKLQkJc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwKLQkJCQkgICAgICAgJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKLQkJcmV0dXJuICgtRU5PREVWKTsKLQl9CisJaW50CWVycm9yID0gMDsKIAotCXJldHVybiAoMCk7Ci0jZW5kaWYKKwkvKgorCSAqIElmIHdlJ3ZlIGJlZW4gcGFzc2VkIGFueSBwYXJhbWV0ZXJzLCBwcm9jZXNzIHRoZW0gbm93LgorCSAqLworCWlmIChhaWM3OXh4KQorCQlhaWM3OXh4X3NldHVwKGFpYzc5eHgpOworCisJYWhkX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSA9CisJCXNwaV9hdHRhY2hfdHJhbnNwb3J0KCZhaGRfbGludXhfdHJhbnNwb3J0X2Z1bmN0aW9ucyk7CisJaWYgKCFhaGRfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNjc2lfdHJhbnNwb3J0X3Jlc2VydmVfdGFyZ2V0KGFoZF9saW51eF90cmFuc3BvcnRfdGVtcGxhdGUsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0KSk7CisJc2NzaV90cmFuc3BvcnRfcmVzZXJ2ZV9kZXZpY2UoYWhkX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGFoZF9saW51eF9kZXZpY2UpKTsKKworCWVycm9yID0gYWhkX2xpbnV4X3BjaV9pbml0KCk7CisJaWYgKGVycm9yKQorCQlzcGlfcmVsZWFzZV90cmFuc3BvcnQoYWhkX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSk7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKIGFoZF9saW51eF9leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwotCi0JLyoKLQkgKiBTaHV0ZG93biBEViB0aHJlYWRzIGJlZm9yZSBnb2luZyBpbnRvIHRoZSBTQ1NJIG1pZC1sYXllci4KLQkgKiBUaGlzIGF2b2lkcyBzaXR1YXRpb25zIHdoZXJlIHRoZSBtaWQtbGF5ZXIgbG9ja3MgdGhlIGVudGlyZQotCSAqIGtlcm5lbCBzbyB0aGF0IHdhaXRpbmcgZm9yIG91ciBEViB0aHJlYWRzIHRvIGV4aXQgbGVhZHMKLQkgKiB0byBkZWFkbG9jay4KLQkgKi8KLQlUQUlMUV9GT1JFQUNIKGFoZCwgJmFoZF90YWlscSwgbGlua3MpIHsKLQotCQlhaGRfbGludXhfa2lsbF9kdl90aHJlYWQoYWhkKTsKLQl9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkvKgotCSAqIEluIDIuNCB3ZSBoYXZlIHRvIHVucmVnaXN0ZXIgZnJvbSB0aGUgUENJIGNvcmUgX2FmdGVyXwotCSAqIHVucmVnaXN0ZXJpbmcgZnJvbSB0aGUgc2NzaSBtaWRsYXllciB0byBhdm9pZCBkYW5nbGluZwotCSAqIHJlZmVyZW5jZXMuCi0JICovCi0Jc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwgJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKLSNlbmRpZgogCWFoZF9saW51eF9wY2lfZXhpdCgpOworCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChhaGRfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKIH0KIAogbW9kdWxlX2luaXQoYWhkX2xpbnV4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKaW5kZXggNzgyM2U1Mi4uMDUyYzY2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCkBAIC00Miw2ICs0Miw3IEBACiAjaWZuZGVmIF9BSUM3OVhYX0xJTlVYX0hfCiAjZGVmaW5lIF9BSUM3OVhYX0xJTlVYX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00OSwxOCArNTAsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+IC8qIEZvciB0YXNrbGV0IHN1cHBvcnQuICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgogCiAvKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgQUlDX0xJQl9QUkVGSVggYWhkCi0jaW5jbHVkZSAic2NzaS5oIgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAKIC8qIE5hbWUgc3BhY2UgY29uZmxpY3Qgd2l0aCBCU0QgcXVldWUgbWFjcm9zICovCiAjaWZkZWYgTElTVF9IRUFECkBAIC05NSw3ICsxMDEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRm9yd2FyZCBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBhaGRfc29mdGM7CiB0eXBlZGVmIHN0cnVjdCBwY2lfZGV2ICphaGRfZGV2X3NvZnRjX3Q7Ci10eXBlZGVmIFNjc2lfQ21uZCAgICAgICphaGRfaW9fY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBzY3NpX2NtbmQgICAgICAqYWhkX2lvX2N0eF90OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCeXRlIE9yZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBhaGRfaHRvYmUxNih4KQljcHVfdG9fYmUxNih4KQpAQCAtMTE0LDggKzEyMCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIENvbmZpZ3VyYXRpb24gRGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdWludDMyX3QgYWljNzl4eF9hbGxvd19tZW1pbzsKLWV4dGVybiBpbnQgYWljNzl4eF9kZXRlY3RfY29tcGxldGU7Ci1leHRlcm4gU2NzaV9Ib3N0X1RlbXBsYXRlIGFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlOworZXh0ZXJuIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWljNzl4eF9kcml2ZXJfdGVtcGxhdGU7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCdXMgU3BhY2UvRE1BICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0NSwxMSArMTUwLDcgQEAKIH07CiB0eXBlZGVmIHN0cnVjdCBhaGRfbGludXhfZG1hX3RhZyogYnVzX2RtYV90YWdfdDsKIAotc3RydWN0IGFoZF9saW51eF9kbWFtYXAKLXsKLQlkbWFfYWRkcl90CWJ1c19hZGRyOwotfTsKLXR5cGVkZWYgc3RydWN0IGFoZF9saW51eF9kbWFtYXAqIGJ1c19kbWFtYXBfdDsKK3R5cGVkZWYgZG1hX2FkZHJfdCBidXNfZG1hbWFwX3Q7CiAKIHR5cGVkZWYgaW50IGJ1c19kbWFfZmlsdGVyX3Qodm9pZCosIGRtYV9hZGRyX3QpOwogdHlwZWRlZiB2b2lkIGJ1c19kbWFtYXBfY2FsbGJhY2tfdCh2b2lkICosIGJ1c19kbWFfc2VnbWVudF90ICosIGludCwgaW50KTsKQEAgLTIyNiwxMiArMjI3LDEyIEBACiAjZGVmaW5lIGFoZF90aW1lcl9pbml0IGluaXRfdGltZXIKICNkZWZpbmUgYWhkX3RpbWVyX3N0b3AgZGVsX3RpbWVyX3N5bmMKIHR5cGVkZWYgdm9pZCBhaGRfbGludXhfY2FsbGJhY2tfdCAodV9sb25nKTsgIAotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3RpbWVyX3Jlc2V0KGFoZF90aW1lcl90ICp0aW1lciwgdV9pbnQgdXNlYywKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGltZXIsIGludCB1c2VjLAogCQkJCSAgICAgYWhkX2NhbGxiYWNrX3QgKmZ1bmMsIHZvaWQgKmFyZyk7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NiX3RpbWVyX3Jlc2V0KHN0cnVjdCBzY2IgKnNjYiwgdV9pbnQgdXNlYyk7CiAKIHN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfdGltZXJfcmVzZXQoYWhkX3RpbWVyX3QgKnRpbWVyLCB1X2ludCB1c2VjLCBhaGRfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAqYXJnKQorYWhkX3RpbWVyX3Jlc2V0KGFoZF90aW1lcl90ICp0aW1lciwgaW50IHVzZWMsIGFoZF9jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOwogCkBAIC0yNTIsNDMgKzI1Myw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU01QIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSB8fCBkZWZpbmVkKFNDU0lfSEFTX0hPU1RfTE9DSykpCi0jZGVmaW5lIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgMQotI2Vsc2UKLSNkZWZpbmUgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAwCi0jZW5kaWYKLQogI2RlZmluZSBBSUM3OVhYX0RSSVZFUl9WRVJTSU9OICIxLjMuMTEiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZyb250IEVuZCBRdWV1ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBjYXN0IHRoZSBMaW51eCBzdHJ1Y3Qgc2NzaV9jbW5kIHRvIHNvbWV0aGluZwotICogdGhhdCBhbGxvd3MgdXMgdG8gdXNlIHRoZSBxdWV1ZSBtYWNyb3MuICBUaGUgbGludXggc3RydWN0dXJlIGhhcwotICogcGxlbnR5IG9mIHNwYWNlIHRvIGhvbGQgdGhlIGxpbmtzIGZpZWxkcyBhcyByZXF1aXJlZCBieSB0aGUgcXVldWUKLSAqIG1hY3JvcywgYnV0IHRoZSBxdWV1ZSBtYWNvcnMgcmVxdWlyZSB0aGVtIHRvIGhhdmUgdGhlIGNvcnJlY3QgdHlwZS4KLSAqLwotc3RydWN0IGFoZF9jbWRfaW50ZXJuYWwgewotCS8qIEFyZWEgb3duZWQgYnkgdGhlIExpbnV4IHNjc2kgbGF5ZXIuICovCi0JdWludDhfdAlwcml2YXRlW29mZnNldG9mKHN0cnVjdCBzY3NpX2NtbmQsIFNDcC5TdGF0dXMpXTsKLQl1bmlvbiB7Ci0JCVNUQUlMUV9FTlRSWShhaGRfY21kKQlzdGU7Ci0JCUxJU1RfRU5UUlkoYWhkX2NtZCkJbGU7Ci0JCVRBSUxRX0VOVFJZKGFoZF9jbWQpCXRxZTsKLQl9IGxpbmtzOwotCXVpbnQzMl90CQkJZW5kOwotfTsKLQotc3RydWN0IGFoZF9jbWQgewotCXVuaW9uIHsKLQkJc3RydWN0IGFoZF9jbWRfaW50ZXJuYWwJaWNtZDsKLQkJc3RydWN0IHNjc2lfY21uZAlzY3NpX2NtZDsKLQl9IHVuOwotfTsKLQotI2RlZmluZSBhY21kX2ljbWQoY21kKSAoKGNtZCktPnVuLmljbWQpCi0jZGVmaW5lIGFjbWRfc2NzaV9jbWQoY21kKSAoKGNtZCktPnVuLnNjc2lfY21kKQotI2RlZmluZSBhY21kX2xpbmtzIHVuLmljbWQubGlua3MKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXZpY2UgRGF0YSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBBIHBlciBwcm9iZWQgZGV2aWNlIHN0cnVjdHVyZSB1c2VkIHRvIGRlYWwgd2l0aCBzb21lIGVycm9yIHJlY292ZXJ5CkBAIC0yOTcsMjIgKzI2MywxNyBAQAogICogYWZ0ZXIgYSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGlucXVpcnkgY29tbWFuZCB0byB0aGUgdGFyZ2V0IHdoZW4KICAqIHRoYXQgaW5xdWlyeSBkYXRhIGluZGljYXRlcyBhIGx1biBpcyBwcmVzZW50LgogICovCi1UQUlMUV9IRUFEKGFoZF9idXN5cSwgYWhkX2NtZCk7CisKIHR5cGVkZWYgZW51bSB7Ci0JQUhEX0RFVl9VTkNPTkZJR1VSRUQJID0gMHgwMSwKIAlBSERfREVWX0ZSRUVaRV9USUxfRU1QVFkgPSAweDAyLCAvKiBGcmVlemUgcXVldWUgdW50aWwgYWN0aXZlID09IDAgKi8KLQlBSERfREVWX1RJTUVSX0FDVElWRQkgPSAweDA0LCAvKiBPdXIgdGltZXIgaXMgYWN0aXZlICovCi0JQUhEX0RFVl9PTl9SVU5fTElTVAkgPSAweDA4LCAvKiBRdWV1ZWQgdG8gYmUgcnVuIGxhdGVyICovCiAJQUhEX0RFVl9RX0JBU0lDCQkgPSAweDEwLCAvKiBBbGxvdyBiYXNpYyBkZXZpY2UgcXVldWluZyAqLwogCUFIRF9ERVZfUV9UQUdHRUQJID0gMHgyMCwgLyogQWxsb3cgZnVsbCBTQ1NJMiBjb21tYW5kIHF1ZXVlaW5nICovCiAJQUhEX0RFVl9QRVJJT0RJQ19PVEFHCSA9IDB4NDAsIC8qIFNlbmQgT1RBRyB0byBwcmV2ZW50IHN0YXJ2YXRpb24gKi8KLQlBSERfREVWX1NMQVZFX0NPTkZJR1VSRUQgPSAweDgwCSAvKiBzbGF2ZV9jb25maWd1cmUoKSBoYXMgYmVlbiBjYWxsZWQgKi8KIH0gYWhkX2xpbnV4X2Rldl9mbGFnczsKIAogc3RydWN0IGFoZF9saW51eF90YXJnZXQ7CiBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSB7CiAJVEFJTFFfRU5UUlkoYWhkX2xpbnV4X2RldmljZSkgbGlua3M7Ci0Jc3RydWN0CQkJYWhkX2J1c3lxIGJ1c3lxOwogCiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjdXJyZW50bHkKQEAgLTM4OCw2MiArMzQ5LDEyIEBACiAJICovCiAJdV9pbnQJCQljb21tYW5kc19zaW5jZV9pZGxlX29yX290YWc7CiAjZGVmaW5lIEFIRF9PVEFHX1RIUkVTSAk1MDAKLQotCWludAkJCWx1bjsKLQlTY3NpX0RldmljZQkgICAgICAgKnNjc2lfZGV2aWNlOwotCXN0cnVjdAkJCWFoZF9saW51eF90YXJnZXQgKnRhcmdldDsKIH07CiAKLXR5cGVkZWYgZW51bSB7Ci0JQUhEX0RWX1JFUVVJUkVECQkgPSAweDAxLAotCUFIRF9JTlFfVkFMSUQJCSA9IDB4MDIsCi0JQUhEX0JBU0lDX0RWCQkgPSAweDA0LAotCUFIRF9FTkhBTkNFRF9EVgkJID0gMHgwOAotfSBhaGRfbGludXhfdGFyZ19mbGFnczsKLQotLyogRFYgU3RhdGVzICovCi10eXBlZGVmIGVudW0gewotCUFIRF9EVl9TVEFURV9FWElUID0gMCwKLQlBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DLAotCUFIRF9EVl9TVEFURV9JTlFfQVNZTkMsCi0JQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlksCi0JQUhEX0RWX1NUQVRFX1RVUiwKLQlBSERfRFZfU1RBVEVfUkVCRCwKLQlBSERfRFZfU1RBVEVfSU5RX1ZFUklGWSwKLQlBSERfRFZfU1RBVEVfV0VCLAotCUFIRF9EVl9TVEFURV9SRUIsCi0JQUhEX0RWX1NUQVRFX1NVLAotCUFIRF9EVl9TVEFURV9CVVNZCi19IGFoZF9kdl9zdGF0ZTsKLQogc3RydWN0IGFoZF9saW51eF90YXJnZXQgewotCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlCSAqZGV2aWNlc1tBSERfTlVNX0xVTlNdOwotCWludAkJCSAgY2hhbm5lbDsKLQlpbnQJCQkgIHRhcmdldDsKLQlpbnQJCQkgIHJlZmNvdW50OworCXN0cnVjdCBzY3NpX2RldmljZQkgKnNkZXZbQUhEX05VTV9MVU5TXTsKIAlzdHJ1Y3QgYWhkX3RyYW5zaW5mbwkgIGxhc3RfdGluZm87CiAJc3RydWN0IGFoZF9zb2Z0YwkgKmFoZDsKLQlhaGRfbGludXhfdGFyZ19mbGFncwkgIGZsYWdzOwotCXN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGE7Ci0JLyoKLQkgKiBUaGUgbmV4dCAiZmFsbGJhY2siIHBlcmlvZCB0byB1c2UgZm9yIG5hcnJvdy93aWRlIHRyYW5zZmVycy4KLQkgKi8KLQl1aW50OF90CQkJICBkdl9uZXh0X25hcnJvd19wZXJpb2Q7Ci0JdWludDhfdAkJCSAgZHZfbmV4dF93aWRlX3BlcmlvZDsKLQl1aW50OF90CQkJICBkdl9tYXhfd2lkdGg7Ci0JdWludDhfdAkJCSAgZHZfbWF4X3Bwcl9vcHRpb25zOwotCXVpbnQ4X3QJCQkgIGR2X2xhc3RfcHByX29wdGlvbnM7Ci0JdV9pbnQJCQkgIGR2X2VjaG9fc2l6ZTsKLQlhaGRfZHZfc3RhdGUJCSAgZHZfc3RhdGU7Ci0JdV9pbnQJCQkgIGR2X3N0YXRlX3JldHJ5OwotCXVpbnQ4X3QJCQkgKmR2X2J1ZmZlcjsKLQl1aW50OF90CQkJICpkdl9idWZmZXIxOwotCi0JLyoKLQkgKiBDdW11bGF0aXZlIGNvdW50ZXIgb2YgZXJyb3JzLgotCSAqLwotCXVfbG9uZwkJCWVycm9yc19kZXRlY3RlZDsKLQl1X2xvbmcJCQljbWRzX3NpbmNlX2Vycm9yOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKiBEZWZpbml0aW9ucyBSZXF1aXJlZCBieSB0aGUgQ29yZSAqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ1MywzMiArMzY0LDE2IEBACiAgKiBtYW5uZXIgYW5kIGFyZSBhbGxvY2F0ZWQgYmVsb3cgNEdCLCB0aGUgbnVtYmVyIG9mIFMvRyBzZWdtZW50cyBpcwogICogdW5yZXN0cmljdGVkLgogICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0vKgotICogV2UgZHluYW1pY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaW4gcHJlLTIuNSBrZXJuZWxzIHRvCi0gKiBhdm9pZCBmcmFnbWVudGF0aW9uIGlzc3VlcyBpbiB0aGUgU0NTSSBtaWQtbGF5ZXIncyBwcml2YXRlIG1lbW9yeQotICogYWxsb2NhdG9yLiAgU2VlIGFpYzc5eHhfb3NtLmMgYWhkX2xpbnV4X3NpemVfbnNlZygpIGZvciBkZXRhaWxzLgotICovCi1leHRlcm4gdV9pbnQgYWhkX2xpbnV4X25zZWc7Ci0jZGVmaW5lCUFIRF9OU0VHIGFoZF9saW51eF9uc2VnCi0jZGVmaW5lCUFIRF9MSU5VWF9NSU5fTlNFRyA2NAotI2Vsc2UKICNkZWZpbmUJQUhEX05TRUcgMTI4Ci0jZW5kaWYKIAogLyoKICAqIFBlci1TQ0IgT1NNIHN0b3JhZ2UuCiAgKi8KLXR5cGVkZWYgZW51bSB7Ci0JQUhEX1NDQl9VUF9FSF9TRU0gPSAweDEKLX0gYWhkX2xpbnV4X3NjYl9mbGFnczsKLQogc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZQkqZGV2OwogCWRtYV9hZGRyX3QJCSBidWZfYnVzYWRkcjsKIAl1aW50MzJfdAkJIHhmZXJfbGVuOwogCXVpbnQzMl90CQkgc2Vuc2VfcmVzaWQ7CS8qIEF1dG8tU2Vuc2UgcmVzaWR1YWwgKi8KLQlhaGRfbGludXhfc2NiX2ZsYWdzCSBmbGFnczsKIH07CiAKIC8qCkBAIC00ODcsNDQgKzM4MiwyMyBAQAogICogYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBvZiB0aGUgdmFyaW91cyBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5CiAgKiB0aGlzIGRyaXZlci4KICAqLwotdHlwZWRlZiBlbnVtIHsKLQlBSERfRFZfV0FJVF9TSU1RX0VNUFRZCSA9IDB4MDEsCi0JQUhEX0RWX1dBSVRfU0lNUV9SRUxFQVNFID0gMHgwMiwKLQlBSERfRFZfQUNUSVZFCQkgPSAweDA0LAotCUFIRF9EVl9TSFVURE9XTgkJID0gMHgwOCwKLQlBSERfUlVOX0NNUExUX1FfVElNRVIJID0gMHgxMAotfSBhaGRfbGludXhfc29mdGNfZmxhZ3M7Ci0KLVRBSUxRX0hFQUQoYWhkX2NvbXBsZXRlcSwgYWhkX2NtZCk7Ci0KIHN0cnVjdCBhaGRfcGxhdGZvcm1fZGF0YSB7CiAJLyoKIAkgKiBGaWVsZHMgYWNjZXNzZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KIAkgKi8KLQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZ2V0c1tBSERfTlVNX1RBUkdFVFNdOyAKLQlUQUlMUV9IRUFEKCwgYWhkX2xpbnV4X2RldmljZSkgZGV2aWNlX3J1bnE7Ci0Jc3RydWN0IGFoZF9jb21wbGV0ZXEJIGNvbXBsZXRlcTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXRbQUhEX05VTV9UQVJHRVRTXTsgCiAKIAlzcGlubG9ja190CQkgc3Bpbl9sb2NrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkgcnVucV90YXNrbGV0OwogCXVfaW50CQkJIHFmcm96ZW47Ci0JcGlkX3QJCQkgZHZfcGlkOwotCXN0cnVjdCB0aW1lcl9saXN0CSBjb21wbGV0ZXFfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJIHJlc2V0X3RpbWVyOwotCXN0cnVjdCB0aW1lcl9saXN0CSBzdGF0c190aW1lcjsKIAlzdHJ1Y3Qgc2VtYXBob3JlCSBlaF9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZQkgZHZfc2VtOwotCXN0cnVjdCBzZW1hcGhvcmUJIGR2X2NtZF9zZW07CS8qIFhYWCBUaGlzIG5lZWRzIHRvIGJlIGluCi0JCQkJCQkgKiB0aGUgdGFyZ2V0IHN0cnVjdAotCQkJCQkJICovCi0Jc3RydWN0IHNjc2lfZGV2aWNlCSpkdl9zY3NpX2RldjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAgICAgICAqaG9zdDsJCS8qIHBvaW50ZXIgdG8gc2NzaSBob3N0ICovCiAjZGVmaW5lIEFIRF9MSU5VWF9OT0lSUQkoKHVpbnQzMl90KX4wKQogCXVpbnQzMl90CQkgaXJxOwkJLyogSVJRIGZvciB0aGlzIGFkYXB0ZXIgKi8KIAl1aW50MzJfdAkJIGJpb3NfYWRkcmVzczsKIAl1aW50MzJfdAkJIG1lbV9idXNhZGRyOwkvKiBNZW0gQmFzZSBBZGRyICovCi0JdWludDY0X3QJCSBod19kbWFfbWFzazsKLQlhaGRfbGludXhfc29mdGNfZmxhZ3MJIGZsYWdzOworI2RlZmluZQlBSERfU0NCX1VQX0VIX1NFTSAweDEKKwl1aW50MzJfdAkJIGZsYWdzOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE9TIFV0aWxpdHkgV3JhcHBlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY0MSw3ICs1MTUsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50CQlhaGRfbGludXhfcmVnaXN0ZXJfaG9zdChzdHJ1Y3QgYWhkX3NvZnRjICosCi0JCQkJCVNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKKwkJCQkJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKIAogdWludDY0X3QJYWhkX2xpbnV4X2dldF9tZW1zaXplKHZvaWQpOwogCkBAIC02NTcsMjggKzUzMSw2IEBACiAJCQkgICAgIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NraW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBMb2NrIHByb3RlY3RpbmcgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3VubG9jayhzdHJ1Y3QgYWhkX3NvZnRjICosIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKLQotLyogTG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBvZiB0aGUgYWJvdmUgbG9jayBpbiBtaWRsYXllciBlbnRyeSBwb2ludHMuICovCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwKLQkJCQkJCSAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncyk7Ci0KLS8qIExvY2sgaGVsZCBkdXJpbmcgY29tbWFuZCBjb21wZWxldGlvbiB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9kb25lX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKik7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZG9uZV9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOwotCi0vKiBMb2NrIGhlbGQgZHVyaW5nIGFoZF9saXN0IG1hbmlwdWxhdGlvbiBhbmQgYWhkIHNvZnRjIGZyZWVzICovCi1leHRlcm4gc3BpbmxvY2tfdCBhaGRfbGlzdF9zcGlubG9jazsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saXN0X2xvY2tpbml0KHZvaWQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpOwotCiBzdGF0aWMgX19pbmxpbmUgdm9pZAogYWhkX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKQEAgLTY5Nyw3NSArNTQ5LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jaywgKmZsYWdzKTsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQkvKgotCSAqIEluIDIuNS5YIGFuZCBzb21lIDIuNC5YIHZlcnNpb25zLCB0aGUgbWlkbGF5ZXIgdGFrZXMgb3VyCi0JICogbG9jayBqdXN0IGJlZm9yZSBjYWxsaW5nIHVzLCBzbyB3ZSBhdm9pZCBsb2NraW5nIGFnYWluLgotCSAqIEZvciBvdGhlciBrZXJuZWwgdmVyc2lvbnMsIHRoZSBpb19yZXF1ZXN0X2xvY2sgaXMgdGFrZW4KLQkgKiBqdXN0IGJlZm9yZSBvdXIgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgSW4gdGhpcyBjYXNlLCB3ZQotCSAqIHRyYWRlIHRoZSBpb19yZXF1ZXN0X2xvY2sgZm9yIG91ciBwZXItc29mdGMgbG9jay4KLQkgKi8KLSNpZiBBSERfU0NTSV9IQVNfSE9TVF9MT0NLID09IDAKLQlzcGluX3VubG9jaygmaW9fcmVxdWVzdF9sb2NrKTsKLQlzcGluX2xvY2soJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCi17Ci0jaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCi0Jc3Bpbl91bmxvY2soJmFoZC0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKLQlzcGluX2xvY2soJmlvX3JlcXVlc3RfbG9jayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9kb25lX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQkvKgotCSAqIEluIDIuNS5YLCBvdXIgb3duIGxvY2sgaXMgaGVsZCBkdXJpbmcgY29tcGxldGlvbnMuCi0JICogSW4gcHJldmlvdXMgdmVyc2lvbnMsIHRoZSBpb19yZXF1ZXN0X2xvY2sgaXMgdXNlZC4KLQkgKiBJbiBlaXRoZXIgY2FzZSwgd2UgY2FuJ3QgaW5pdGlhbGl6ZSB0aGlzIGxvY2sgYWdhaW4uCi0JICovCi19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfZG9uZV9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCi17Ci0jaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCi0Jc3Bpbl9sb2NrKCZpb19yZXF1ZXN0X2xvY2spOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfZG9uZV91bmxvY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLSNpZiBBSERfU0NTSV9IQVNfSE9TVF9MT0NLID09IDAKLQlzcGluX3VubG9jaygmaW9fcmVxdWVzdF9sb2NrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX2xpc3RfbG9ja2luaXQodm9pZCkKLXsKLQlzcGluX2xvY2tfaW5pdCgmYWhkX2xpc3Rfc3BpbmxvY2spOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWhkX2xpc3Rfc3BpbmxvY2ssICpmbGFncyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCi17Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhkX2xpc3Rfc3BpbmxvY2ssICpmbGFncyk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogUENJTV94eHg6IG1hc2sgdG8gbG9jYXRlIHN1YmZpZWxkIGluIHJlZ2lzdGVyCkBAIC05MjUsMjcgKzcwOCwxNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm9jIEZTIFN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotaW50CWFoZF9saW51eF9wcm9jX2luZm8oY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQsIGludCk7Ci0jZWxzZQogaW50CWFoZF9saW51eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGNoYXIgKiosCiAJCQkgICAgb2ZmX3QsIGludCwgaW50KTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqIERvbWFpbiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBSERfRFZfQ01EKGNtZCkgKChjbWQpLT5zY3NpX2RvbmUgPT0gYWhkX2xpbnV4X2R2X2NvbXBsZXRlKQotI2RlZmluZSBBSERfRFZfU0lNUV9GUk9aRU4oYWhkKQkJCQkJXAotCSgoKChhaGQpLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9BQ1RJVkUpICE9IDApCVwKLQkgJiYgKGFoZCktPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPT0gMSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIFRyYW5zYWN0aW9uIEFjY2VzcyBXcmFwcGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKiwgdWludDMyX3QpOwogc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqLCB1aW50MzJfdCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2NtZF9zZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqLCB1aW50MzJfdCk7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKiwgdWludDMyX3QpOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqKTsKLXN0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2NtZF9nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfZ2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKik7CiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3RyYW5zYWN0aW9uX3RhZyhzdHJ1Y3Qgc2NiICosIGludCwgdV9pbnQpOwogc3RhdGljIF9faW5saW5lIHVfbG9uZyBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzdHJ1Y3Qgc2NiICopOwpAQCAtOTY0LDcgKzczNyw3IEBACiBzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZnJlZXplX3NjYihzdHJ1Y3Qgc2NiICpzY2IpOwogCiBzdGF0aWMgX19pbmxpbmUKLXZvaWQgYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqY21kLCB1aW50MzJfdCBzdGF0dXMpCit2b2lkIGFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHVpbnQzMl90IHN0YXR1cykKIHsKIAljbWQtPnJlc3VsdCAmPSB+KENBTV9TVEFUVVNfTUFTSyA8PCAxNik7CiAJY21kLT5yZXN1bHQgfD0gc3RhdHVzIDw8IDE2OwpAQCAtOTc3LDcgKzc1MCw3IEBACiB9CiAKIHN0YXRpYyBfX2lubGluZQotdm9pZCBhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQordm9pZCBhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHVpbnQzMl90IHN0YXR1cykKIHsKIAljbWQtPnJlc3VsdCAmPSB+MHhGRkZGOwogCWNtZC0+cmVzdWx0IHw9IHN0YXR1czsKQEAgLTk5MCw3ICs3NjMsNyBAQAogfQogCiBzdGF0aWMgX19pbmxpbmUKLXVpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCkKK3VpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJcmV0dXJuICgoY21kLT5yZXN1bHQgPj4gMTYpICYgQ0FNX1NUQVRVU19NQVNLKTsKIH0KQEAgLTEwMDIsNyArNzc1LDcgQEAKIH0KIAogc3RhdGljIF9faW5saW5lCi11aW50MzJfdCBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCkKK3VpbnQzMl90IGFoZF9jbWRfZ2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlyZXR1cm4gKGNtZC0+cmVzdWx0ICYgMHhGRkZGKTsKIH0KQEAgLTExMTcsNyArODkwLDYgQEAKIHZvaWQJYWhkX3NlbmRfYXN5bmMoc3RydWN0IGFoZF9zb2Z0YyAqLCBjaGFyIGNoYW5uZWwsCiAJCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSwgdm9pZCAqKTsKIHZvaWQJYWhkX3ByaW50X3BhdGgoc3RydWN0IGFoZF9zb2Z0YyAqLCBzdHJ1Y3Qgc2NiICopOwotdm9pZAlhaGRfcGxhdGZvcm1fZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiAKICNpZmRlZiBDT05GSUdfUENJCiAjZGVmaW5lIEFIRF9QQ0lfQ09ORklHIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKaW5kZXggOTFkYWYwYy4uMzkwYjUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKQEAgLTkyLDI3ICs5MiwzMSBAQAogc3RhdGljIHZvaWQKIGFoZF9saW51eF9wY2lfZGV2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7Ci0JdV9sb25nIGw7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVfbG9uZyBzOwogCi0JLyoKLQkgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IHBlcmZvcm0KLQkgKiB0aGUgZnJlZSBkaXJlY3RseSwgYnV0IGNoZWNrIG91cgotCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KLQkgKi8KLQlhaGRfbGlzdF9sb2NrKCZsKTsKLQlhaGQgPSBhaGRfZmluZF9zb2Z0Yygoc3RydWN0IGFoZF9zb2Z0YyAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KSk7Ci0JaWYgKGFoZCAhPSBOVUxMKSB7Ci0JCXVfbG9uZyBzOworCWFoZF9sb2NrKGFoZCwgJnMpOworCWFoZF9pbnRyX2VuYWJsZShhaGQsIEZBTFNFKTsKKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCWFoZF9mcmVlKGFoZCk7Cit9CiAKLQkJVEFJTFFfUkVNT1ZFKCZhaGRfdGFpbHEsIGFoZCwgbGlua3MpOwotCQlhaGRfbGlzdF91bmxvY2soJmwpOwotCQlhaGRfbG9jayhhaGQsICZzKTsKLQkJYWhkX2ludHJfZW5hYmxlKGFoZCwgRkFMU0UpOwotCQlhaGRfdW5sb2NrKGFoZCwgJnMpOwotCQlhaGRfZnJlZShhaGQpOwotCX0gZWxzZQotCQlhaGRfbGlzdF91bmxvY2soJmwpOworc3RhdGljIHZvaWQKK2FoZF9saW51eF9wY2lfaW5oZXJpdF9mbGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhaGQtPmRldl9zb2Z0YywgKm1hc3Rlcl9wZGV2OworCXVuc2lnbmVkIGludCBtYXN0ZXJfZGV2Zm4gPSBQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCAwKTsKKworCW1hc3Rlcl9wZGV2ID0gcGNpX2dldF9zbG90KHBkZXYtPmJ1cywgbWFzdGVyX2RldmZuKTsKKwlpZiAobWFzdGVyX3BkZXYpIHsKKwkJc3RydWN0IGFoZF9zb2Z0YyAqbWFzdGVyID0gcGNpX2dldF9kcnZkYXRhKG1hc3Rlcl9wZGV2KTsKKwkJaWYgKG1hc3RlcikgeworCQkJYWhkLT5mbGFncyAmPSB+QUhEX0JJT1NfRU5BQkxFRDsKKwkJCWFoZC0+ZmxhZ3MgfD0gbWFzdGVyLT5mbGFncyAmIEFIRF9CSU9TX0VOQUJMRUQ7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJhaWM3OXh4OiBubyBtdWx0aWNoYW5uZWwgcGVlciBmb3VuZCFcbiIpOworCQlwY2lfZGV2X3B1dChtYXN0ZXJfcGRldik7CisJfQogfQogCiBzdGF0aWMgaW50CkBAIC0xMjUsMjIgKzEyOSw2IEBACiAJY2hhcgkJKm5hbWU7CiAJaW50CQkgZXJyb3I7CiAKLQkvKgotCSAqIFNvbWUgQklPU2VuIHJlcG9ydCB0aGUgc2FtZSBkZXZpY2UgbXVsdGlwbGUgdGltZXMuCi0JICovCi0JVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7Ci0JCXN0cnVjdCBwY2lfZGV2ICpwcm9iZWRfcGRldjsKLQotCQlwcm9iZWRfcGRldiA9IGFoZC0+ZGV2X3NvZnRjOwotCQlpZiAocHJvYmVkX3BkZXYtPmJ1cy0+bnVtYmVyID09IHBkZXYtPmJ1cy0+bnVtYmVyCi0JCSAmJiBwcm9iZWRfcGRldi0+ZGV2Zm4gPT0gcGRldi0+ZGV2Zm4pCi0JCQlicmVhazsKLQl9Ci0JaWYgKGFoZCAhPSBOVUxMKSB7Ci0JCS8qIFNraXAgZHVwbGljYXRlLiAqLwotCQlyZXR1cm4gKC1FTk9ERVYpOwotCX0KLQogCXBjaSA9IHBkZXY7CiAJZW50cnkgPSBhaGRfZmluZF9wY2lfZGV2aWNlKHBjaSk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCkBAIC0xNzcsMTUgKzE2NSwxMiBAQAogCQlpZiAobWVtc2l6ZSA+PSAweDgwMDAwMDAwMDBVTEwKIAkgCSAmJiBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSA9PSAwKSB7CiAJCQlhaGQtPmZsYWdzIHw9IEFIRF82NEJJVF9BRERSRVNTSU5HOwotCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzayA9IERNQV82NEJJVF9NQVNLOwogCQl9IGVsc2UgaWYgKG1lbXNpemUgPiAweDgwMDAwMDAwCiAJCQkmJiBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIG1hc2tfMzliaXQpID09IDApIHsKIAkJCWFoZC0+ZmxhZ3MgfD0gQUhEXzM5QklUX0FERFJFU1NJTkc7Ci0JCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gbWFza18zOWJpdDsKIAkJfQogCX0gZWxzZSB7CiAJCXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwotCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CiAJfQogCWFoZC0+ZGV2X3NvZnRjID0gcGNpOwogCWVycm9yID0gYWhkX3BjaV9jb25maWcoYWhkLCBlbnRyeSk7CkBAIC0xOTMsMTYgKzE3OCwxNyBAQAogCQlhaGRfZnJlZShhaGQpOwogCQlyZXR1cm4gKC1lcnJvcik7CiAJfQorCisJLyoKKwkgKiBTZWNvbmQgRnVuY3Rpb24gUENJIGRldmljZXMgbmVlZCB0byBpbmhlcml0IHNvbWUKKwkgKiAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KKwkgKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTVVMVElfRlVOQykgJiYgUENJX0ZVTkMocGRldi0+ZGV2Zm4pICE9IDApCisJCWFoZF9saW51eF9wY2lfaW5oZXJpdF9mbGFncyhhaGQpOworCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFoZCk7Ci0JaWYgKGFpYzc5eHhfZGV0ZWN0X2NvbXBsZXRlKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQlhaGRfbGludXhfcmVnaXN0ZXJfaG9zdChhaGQsICZhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSk7Ci0jZWxzZQotCQlwcmludGYoImFpYzc5eHg6IGlnbm9yaW5nIFBDSSBkZXZpY2UgZm91bmQgYWZ0ZXIgIgotCQkgICAgICAgImluaXRpYWxpemF0aW9uXG4iKTsKLQkJcmV0dXJuICgtRU5PREVWKTsKLSNlbmRpZgotCX0KKworCWFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KGFoZCwgJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKIAlyZXR1cm4gKDApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwppbmRleCA3MDNmNmU0Li4yMTMxZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKQEAgLTI4Myw3ICsyODMsNiBAQAogYWhkX3BjaV9jb25maWcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSAqZW50cnkpCiB7CiAJc3RydWN0IHNjYl9kYXRhICpzaGFyZWRfc2NiX2RhdGE7Ci0JdV9sb25nCQkgbDsKIAl1X2ludAkJIGNvbW1hbmQ7CiAJdWludDMyX3QJIGRldmNvbmZpZzsKIAl1aW50MTZfdAkgc3VidmVuZG9yOyAKQEAgLTM3MywxNiArMzcyLDkgQEAKIAkgKiBBbGxvdyBpbnRlcnJ1cHRzIG5vdyB0aGF0IHdlIGFyZSBjb21wbGV0ZWx5IHNldHVwLgogCSAqLwogCWVycm9yID0gYWhkX3BjaV9tYXBfaW50KGFoZCk7Ci0JaWYgKGVycm9yICE9IDApCi0JCXJldHVybiAoZXJyb3IpOwotCi0JYWhkX2xpc3RfbG9jaygmbCk7Ci0JLyoKLQkgKiBMaW5rIHRoaXMgc29mdGMgaW4gd2l0aCBhbGwgb3RoZXIgYWhkIGluc3RhbmNlcy4KLQkgKi8KLQlhaGRfc29mdGNfaW5zZXJ0KGFoZCk7Ci0JYWhkX2xpc3RfdW5sb2NrKCZsKTsKLQlyZXR1cm4gKDApOworCWlmICghZXJyb3IpCisJCWFoZC0+aW5pdF9sZXZlbCsrOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKaW5kZXggZTAxY2Q2MS4uMzlhMjc4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKQEAgLTQ5LDEwICs0OSw1MyBAQAogCQkJCSAgICAgIHVfaW50IG91cl9pZCwgY2hhciBjaGFubmVsLAogCQkJCSAgICAgIHVfaW50IHRhcmdldF9pZCwgdV9pbnQgdGFyZ2V0X29mZnNldCk7CiBzdGF0aWMgdm9pZAlhaGRfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpOworCQkJCSAgICAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CiBzdGF0aWMgaW50CWFoZF9wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCSAgICAgICBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOwogCisvKgorICogVGFibGUgb2Ygc3luY3JhdGVzIHRoYXQgZG9uJ3QgZm9sbG93IHRoZSAiZGl2aXNpYmxlIGJ5IDQiCisgKiBydWxlLiBUaGlzIHRhYmxlIHdpbGwgYmUgZXhwYW5kZWQgaW4gZnV0dXJlIFNDU0kgc3BlY3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVfaW50IHBlcmlvZF9mYWN0b3I7CisJdV9pbnQgcGVyaW9kOwkvKiBpbiAxMDB0aHMgb2YgbnMgKi8KK30gc2NzaV9zeW5jcmF0ZXNbXSA9IHsKKwl7IDB4MDgsIDYyNSB9LAkvKiBGQVNULTE2MCAqLworCXsgMHgwOSwgMTI1MCB9LAkvKiBGQVNULTgwICovCisJeyAweDBhLCAyNTAwIH0sCS8qIEZBU1QtNDAgNDBNSHogKi8KKwl7IDB4MGIsIDMwMzAgfSwJLyogRkFTVC00MCAzM01IeiAqLworCXsgMHgwYywgNTAwMCB9CS8qIEZBU1QtMjAgKi8KK307CisKKy8qCisgKiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBpbiBrSHogY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAqIHN5bmMgcGVyaW9kIGZhY3Rvci4KKyAqLworc3RhdGljIHVfaW50CithaGRfY2FsY19zeW5jc3JhdGUodV9pbnQgcGVyaW9kX2ZhY3RvcikKK3sKKwlpbnQgaTsKKwlpbnQgbnVtX3N5bmNyYXRlczsKKworCW51bV9zeW5jcmF0ZXMgPSBzaXplb2Yoc2NzaV9zeW5jcmF0ZXMpIC8gc2l6ZW9mKHNjc2lfc3luY3JhdGVzWzBdKTsKKwkvKiBTZWUgaWYgdGhlIHBlcmlvZCBpcyBpbiB0aGUgImV4Y2VwdGlvbiIgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bmNyYXRlczsgaSsrKSB7CisKKwkJaWYgKHBlcmlvZF9mYWN0b3IgPT0gc2NzaV9zeW5jcmF0ZXNbaV0ucGVyaW9kX2ZhY3RvcikgeworCQkJLyogUGVyaW9kIGluIGtIeiAqLworCQkJcmV0dXJuICgxMDAwMDAwMDAgLyBzY3NpX3N5bmNyYXRlc1tpXS5wZXJpb2QpOworCQl9CisJfQorCisJLyoKKwkgKiBXYXNuJ3QgaW4gdGhlIHRhYmxlLCBzbyB1c2UgdGhlIHN0YW5kYXJkCisJICogNCB0aW1lcyBjb252ZXJzaW9uLgorCSAqLworCXJldHVybiAoMTAwMDAwMDAgLyAocGVyaW9kX2ZhY3RvciAqIDQgKiAxMCkpOworfQorCisKIHN0YXRpYyB2b2lkCiBjb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbikKIHsKQEAgLTEwOSw3ICsxNTIsNyBAQAogICAgICAgICBzcGVlZCA9IDMzMDA7CiAgICAgICAgIGZyZXEgPSAwOwogCWlmICh0aW5mby0+b2Zmc2V0ICE9IDApIHsKLQkJZnJlcSA9IGFpY19jYWxjX3N5bmNzcmF0ZSh0aW5mby0+cGVyaW9kKTsKKwkJZnJlcSA9IGFoZF9jYWxjX3N5bmNzcmF0ZSh0aW5mby0+cGVyaW9kKTsKIAkJc3BlZWQgPSBmcmVxOwogCX0KIAlzcGVlZCAqPSAoMHgwMSA8PCB0aW5mby0+d2lkdGgpOwpAQCAtMTY3LDYgKzIxMCw3IEBACiAJCSAgICAgIHVfaW50IHRhcmdldF9vZmZzZXQpCiB7CiAJc3RydWN0CWFoZF9saW51eF90YXJnZXQgKnRhcmc7CisJc3RydWN0ICBzY3NpX3RhcmdldCAqc3RhcmdldDsKIAlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CiAJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKIAlpbnQJbHVuOwpAQCAtMTc2LDIwICsyMjAsMjAgQEAKIAljb3B5X2luZm8oaW5mbywgIlRhcmdldCAlZCBOZWdvdGlhdGlvbiBTZXR0aW5nc1xuIiwgdGFyZ2V0X2lkKTsKIAljb3B5X2luZm8oaW5mbywgIlx0VXNlcjogIik7CiAJYWhkX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT51c2VyKTsKLQl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF9vZmZzZXRdOwotCWlmICh0YXJnID09IE5VTEwpCisJc3RhcmdldCA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFt0YXJnZXRfb2Zmc2V0XTsKKwlpZiAoc3RhcmdldCA9PSBOVUxMKQogCQlyZXR1cm47CisJdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOwogCiAJY29weV9pbmZvKGluZm8sICJcdEdvYWw6ICIpOwogCWFoZF9mb3JtYXRfdHJhbnNpbmZvKGluZm8sICZ0aW5mby0+Z29hbCk7CiAJY29weV9pbmZvKGluZm8sICJcdEN1cnI6ICIpOwogCWFoZF9mb3JtYXRfdHJhbnNpbmZvKGluZm8sICZ0aW5mby0+Y3Vycik7Ci0JY29weV9pbmZvKGluZm8sICJcdFRyYW5zbWlzc2lvbiBFcnJvcnMgJWxkXG4iLCB0YXJnLT5lcnJvcnNfZGV0ZWN0ZWQpOwogCiAJZm9yIChsdW4gPSAwOyBsdW4gPCBBSERfTlVNX0xVTlM7IGx1bisrKSB7Ci0JCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2OwogCi0JCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKKwkJZGV2ID0gdGFyZy0+c2RldltsdW5dOwogCiAJCWlmIChkZXYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpAQCAtMTk5LDEwICsyNDMsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFoZF9kdW1wX2RldmljZV9zdGF0ZShzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCithaGRfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKHNkZXYpOworCiAJY29weV9pbmZvKGluZm8sICJcdENoYW5uZWwgJWMgVGFyZ2V0ICVkIEx1biAlZCBTZXR0aW5nc1xuIiwKLQkJICBkZXYtPnRhcmdldC0+Y2hhbm5lbCArICdBJywgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4pOworCQkgIHNkZXYtPnNkZXZfdGFyZ2V0LT5jaGFubmVsICsgJ0EnLAorCQkgIHNkZXYtPnNkZXZfdGFyZ2V0LT5pZCwgc2Rldi0+bHVuKTsKIAogCWNvcHlfaW5mbyhpbmZvLCAiXHRcdENvbW1hbmRzIFF1ZXVlZCAlbGRcbiIsIGRldi0+Y29tbWFuZHNfaXNzdWVkKTsKIAljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kcyBBY3RpdmUgJWRcbiIsIGRldi0+YWN0aXZlKTsKQEAgLTI3OCwzNiArMzI1LDE2IEBACiAgKiBSZXR1cm4gaW5mb3JtYXRpb24gdG8gaGFuZGxlIC9wcm9jIHN1cHBvcnQgZm9yIHRoZSBkcml2ZXIuCiAgKi8KIGludAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotYWhkX2xpbnV4X3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAotCQkgICAgaW50IGxlbmd0aCwgaW50IGhvc3RubywgaW50IGlub3V0KQotI2Vsc2UKIGFoZF9saW51eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAogCQkgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCi0jZW5kaWYKIHsKLQlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKXNob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKIAljaGFyCWFoZF9pbmZvWzI1Nl07Ci0JdV9sb25nCWw7CiAJdV9pbnQJbWF4X3Rhcmc7CiAJdV9pbnQJaTsKIAlpbnQJcmV0dmFsOwogCi0JcmV0dmFsID0gLUVJTlZBTDsKLQlhaGRfbGlzdF9sb2NrKCZsKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlUQUlMUV9GT1JFQUNIKGFoZCwgJmFoZF90YWlscSwgbGlua3MpIHsKLQkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdC0+aG9zdF9ubyA9PSBob3N0bm8pCi0JCQlicmVhazsKLQl9Ci0jZWxzZQotCWFoZCA9IGFoZF9maW5kX3NvZnRjKCooc3RydWN0IGFoZF9zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOwotI2VuZGlmCi0KLQlpZiAoYWhkID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQogCSAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGU/ICovIAogCWlmIChpbm91dCA9PSBUUlVFKSB7CiAJCXJldHZhbCA9IGFoZF9wcm9jX3dyaXRlX3NlZXByb20oYWhkLCBidWZmZXIsIGxlbmd0aCk7CkBAIC0zNTcsNiArMzg0LDUgQEAKIAl9CiAJcmV0dmFsID0gaW5mby5wb3MgPiBpbmZvLm9mZnNldCA/IGluZm8ucG9zIC0gaW5mby5vZmZzZXQgOiAwOwogZG9uZToKLQlhaGRfbGlzdF91bmxvY2soJmwpOwogCXJldHVybiAocmV0dmFsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaAppbmRleCAwODhjYmMyLi45MWQyOTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5oCkBAIC0zNyw3ICszNyw3IEBACiAgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguaCM3OSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguaCM4NSAkCiAgKgogICogJEZyZWVCU0QkCiAgKi8KQEAgLTI0Myw3ICsyNDMsNyBAQAogCSAqLwogCUFIQ19BSUM3ODUwX0ZFCT0gQUhDX1NQSU9DQVB8QUhDX0FVVE9QQVVTRXxBSENfVEFSR0VUTU9ERXxBSENfVUxUUkEsCiAJQUhDX0FJQzc4NjBfRkUJPSBBSENfQUlDNzg1MF9GRSwKLQlBSENfQUlDNzg3MF9GRQk9IEFIQ19UQVJHRVRNT0RFLAorCUFIQ19BSUM3ODcwX0ZFCT0gQUhDX1RBUkdFVE1PREV8QUhDX0FVVE9QQVVTRSwKIAlBSENfQUlDNzg4MF9GRQk9IEFIQ19BSUM3ODcwX0ZFfEFIQ19VTFRSQSwKIAkvKgogCSAqIEFsdGhvdWdoIHdlIGhhdmUgc3BhY2UgZm9yIGJvdGggdGhlIGluaXRpYXRvciBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHgucmVnIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcKaW5kZXggODEwZWM3MC4uZTE5NmQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcKQEAgLTM5LDcgKzM5LDcgQEAKICAqCiAgKiAkRnJlZUJTRCQKICAqLwotVkVSU0lPTiA9ICIkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQiCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjNDAgJCIKIAogLyoKICAqIFRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGFpYzd4eHhfYXNtIHV0aWxpdHkgZm9yIHVzZSBpbiBhc3NlbWJsaW5nCkBAIC0xMzA2LDcgKzEzMDYsNiBAQAogCSAqLwogCU1XSV9SRVNJRFVBTCB7CiAJCXNpemUJCTEKLQkJYWxpYXMJVEFSR19JTU1FRElBVEVfU0NCCiAJfQogCS8qCiAJICogU0NCSUQgb2YgdGhlIG5leHQgU0NCIHRvIGJlIHN0YXJ0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuCkBAIC0xNDYxLDYgKzE0NjAsNyBAQAogCSAqLwogCUxBU1RfTVNHIHsKIAkJc2l6ZQkJMQorCQlhbGlhcwlUQVJHX0lNTUVESUFURV9TQ0IKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5zZXEgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnNlcQppbmRleCBkODRiNzQxLi4xNTE5NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnNlcQorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnNlcQpAQCAtNDAsNyArNDAsNyBAQAogICogJEZyZWVCU0QkCiAgKi8KIAotVkVSU0lPTiA9ICIkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU2ICQiCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTggJCIKIFBBVENIX0FSR19MSVNUID0gInN0cnVjdCBhaGNfc29mdGMgKmFoYyIKIFBSRUZJWCA9ICJhaGNfIgogCkBAIC02NzksNiArNjc5LDcgQEAKIAkJY2xyCVNDU0lCVVNMOwkvKiBQcmV2ZW50IGJpdCBsZWFrYWdlIGR1cmludCBTRUxUTyAqLwogCX0KIAlhbmQJU1hGUkNUTDAsIH5TUElPRU47CisJbXZpCVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQ7CiAJdGVzdAlTU1RBVDEsUkVRSU5JVHxCVVNGUkVFCWp6IC47CiAJdGVzdAlTU1RBVDEsIEJVU0ZSRUUgam56IHBvbGxfZm9yX3dvcms7CiAJbXZpCU1JU1NFRF9CVVNGUkVFIGNhbGwgc2V0X3NlcWludDsKQEAgLTEwOTcsNyArMTA5OCw3IEBACiAJCXRlc3QJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNHX0xBU1RfU0VHIGp6IGRtYV9taWRfc2c7CiAJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKSB7CiAJCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGp6IGRtYV9sYXN0X3NnOwotCQkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RNT0RFX1dJREVPRERfQlVHKSAhPSAwKSB7CisJCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19UTU9ERV9XSURFT0REX0JVRykgIT0gMCkgewogCQkJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04ganogZG1hX21pZF9zZzsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jCmluZGV4IDQ2OGQ2MTIuLjNjYjA3ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMKQEAgLTI4LDkgKzI4LDcgQEAKICAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICAqIFNVQ0ggREFNQUdFLgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jIzE3ICQKLSAqCi0gKiAkRnJlZUJTRCQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jIzE5ICQKICAqLwogCiAvKgpAQCAtNjQsNyArNjIsNiBAQAogICogICBpcyBwcmVjZWRlZCBieSBhbiBpbml0aWFsIHplcm8gKGxlYWRpbmcgMCwgZm9sbG93ZWQgYnkgMTYtYml0cywgTVNCCiAgKiAgIGZpcnN0KS4gIFRoZSBjbG9jayBjeWNsaW5nIGZyb20gbG93IHRvIGhpZ2ggaW5pdGlhdGVzIHRoZSBuZXh0IGRhdGEKICAqICAgYml0IHRvIGJlIHNlbnQgZnJvbSB0aGUgY2hpcC4KLSAqCiAgKi8KIAogI2lmZGVmIF9fbGludXhfXwpAQCAtODEsMTQgKzc4LDIyIEBACiAgKiBSaWdodCBub3csIHdlIG9ubHkgaGF2ZSB0byByZWFkIHRoZSBTRUVQUk9NLiAgQnV0IHdlIG1ha2UgaXQgZWFzaWVyIHRvCiAgKiBhZGQgb3RoZXIgOTNDeDYgZnVuY3Rpb25zLgogICovCi1zdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHsKK3N0cnVjdCBzZWVwcm9tX2NtZCB7CiAgIAl1aW50OF90IGxlbjsKLSAJdWludDhfdCBiaXRzWzldOwotfSBzZWVwcm9tX3JlYWQgPSB7MywgezEsIDEsIDB9fTsKKyAJdWludDhfdCBiaXRzWzExXTsKK307CiAKKy8qIFNob3J0IG9wY29kZXMgZm9yIHRoZSBjNDYgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9ld2VuID0gezksIHsxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwfX07CiBzdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHNlZXByb21fZXdkcyA9IHs5LCB7MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH19OworCisvKiBMb25nIG9wY29kZXMgZm9yIHRoZSBDNTYvQzY2ICovCitzdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHNlZXByb21fbG9uZ19ld2VuID0gezExLCB7MSwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMH19Oworc3RhdGljIHN0cnVjdCBzZWVwcm9tX2NtZCBzZWVwcm9tX2xvbmdfZXdkcyA9IHsxMSwgezEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9fTsKKworLyogQ29tbW9uIG9wY29kZXMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV93cml0ZSA9IHszLCB7MSwgMCwgMX19Oworc3RhdGljIHN0cnVjdCBzZWVwcm9tX2NtZCBzZWVwcm9tX3JlYWQgID0gezMsIHsxLCAxLCAwfX07CiAKIC8qCiAgKiBXYWl0IGZvciB0aGUgU0VFUkRZIHRvIGdvIGhpZ2g7IGFib3V0IDgwMCBucy4KQEAgLTIyMiwxMiArMjI3LDI1IEBACiBhaGNfd3JpdGVfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwgdWludDE2X3QgKmJ1ZiwKIAkJICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCkKIHsKKwlzdHJ1Y3Qgc2VlcHJvbV9jbWQgKmV3ZW4sICpld2RzOwogCXVpbnQxNl90IHY7CiAJdWludDhfdCB0ZW1wOwogCWludCBpLCBrOwogCiAJLyogUGxhY2UgdGhlIGNoaXAgaW50byB3cml0ZS1lbmFibGUgbW9kZSAqLwotCXNlbmRfc2VlcHJvbV9jbWQoc2QsICZzZWVwcm9tX2V3ZW4pOworCWlmIChzZC0+c2RfY2hpcCA9PSBDNDYpIHsKKwkJZXdlbiA9ICZzZWVwcm9tX2V3ZW47CisJCWV3ZHMgPSAmc2VlcHJvbV9ld2RzOworCX0gZWxzZSBpZiAoc2QtPnNkX2NoaXAgPT0gQzU2XzY2KSB7CisJCWV3ZW4gPSAmc2VlcHJvbV9sb25nX2V3ZW47CisJCWV3ZHMgPSAmc2VlcHJvbV9sb25nX2V3ZHM7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJhaGNfd3JpdGVfc2VlcHJvbTogdW5zdXBwb3J0ZWQgc2VlcHJvbSB0eXBlICVkXG4iLAorCQkgICAgICAgc2QtPnNkX2NoaXApOworCQlyZXR1cm4gKDApOworCX0KKworCXNlbmRfc2VlcHJvbV9jbWQoc2QsIGV3ZW4pOwogCXJlc2V0X3NlZXByb20oc2QpOwogCiAJLyogV3JpdGUgYWxsIHJlcXVlc3RlZCBkYXRhIG91dCB0byB0aGUgc2VlcHJvbS4gKi8KQEAgLTI3Nyw3ICsyOTUsNyBAQAogCX0KIAogCS8qIFB1dCB0aGUgY2hpcCBiYWNrIGludG8gd3JpdGUtcHJvdGVjdCBtb2RlICovCi0Jc2VuZF9zZWVwcm9tX2NtZChzZCwgJnNlZXByb21fZXdkcyk7CisJc2VuZF9zZWVwcm9tX2NtZChzZCwgZXdkcyk7CiAJcmVzZXRfc2VlcHJvbShzZCk7CiAKIAlyZXR1cm4gKDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwppbmRleCA3YmMwMWU0Li41OGFjNDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwpAQCAtMzcsOSArMzcsNyBAQAogICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LmMjMTM0ICQKLSAqCi0gKiAkRnJlZUJTRCQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5jIzE1NSAkCiAgKi8KIAogI2lmZGVmIF9fbGludXhfXwpAQCAtMjg3LDEwICsyODUsMTkgQEAKIAkJYWhjX291dGIoYWhjLCBTRVFfRkxBR1MyLAogCQkJIGFoY19pbmIoYWhjLCBTRVFfRkxBR1MyKSAmIH5TQ0JfRE1BKTsKIAl9CisKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIHNlcXVlbmNlciBpbnRlcnJ1cHQuICBJdCBpcyBubworCSAqIGxvbmdlciByZWxldmFudCBzaW5jZSB3ZSdyZSByZXNldHRpbmcgdGhlIFByb2dyYW0KKwkgKiBDb3VudGVyLgorCSAqLworCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTRVFJTlQpOworCiAJYWhjX291dGIoYWhjLCBNV0lfUkVTSURVQUwsIDApOwogCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBhaGMtPnNlcWN0bCk7CiAJYWhjX291dGIoYWhjLCBTRVFBRERSMCwgMCk7CiAJYWhjX291dGIoYWhjLCBTRVFBRERSMSwgMCk7CisKIAlhaGNfdW5wYXVzZShhaGMpOwogfQogCkBAIC0xMTc0LDE5ICsxMTgxLDIwIEBACiAJCQkJICAgICAgIHNjYl9pbmRleCk7CiAJCQl9CiAjZW5kaWYKLQkJCS8qCi0JCQkgKiBGb3JjZSBhIHJlbmVnb3RpYXRpb24gd2l0aCB0aGlzIHRhcmdldCBqdXN0IGluCi0JCQkgKiBjYXNlIHRoZSBjYWJsZSB3YXMgcHVsbGVkIGFuZCB3aWxsIGxhdGVyIGJlCi0JCQkgKiByZS1hdHRhY2hlZC4gIFRoZSB0YXJnZXQgbWF5IGZvcmdldCBpdHMgbmVnb3RpYXRpb24KLQkJCSAqIHNldHRpbmdzIHdpdGggdXMgc2hvdWxkIGl0IGF0dGVtcHQgdG8gcmVzZWxlY3QKLQkJCSAqIGR1cmluZyB0aGUgaW50ZXJydXB0aW9uLiAgVGhlIHRhcmdldCB3aWxsIG5vdCBpc3N1ZQotCQkJICogYSB1bml0IGF0dGVudGlvbiBpbiB0aGlzIGNhc2UsIHNvIHdlIG11c3QgYWx3YXlzCi0JCQkgKiByZW5lZ290aWF0ZS4KLQkJCSAqLwogCQkJYWhjX3NjYl9kZXZpbmZvKGFoYywgJmRldmluZm8sIHNjYik7Ci0JCQlhaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGMsICZkZXZpbmZvKTsKIAkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1NFTF9USU1FT1VUKTsKIAkJCWFoY19mcmVlemVfZGV2cShhaGMsIHNjYik7CisKKwkJCS8qCisJCQkgKiBDYW5jZWwgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zIG9uIHRoZSBkZXZpY2UKKwkJCSAqIG5vdyB0aGF0IGl0IHNlZW1zIHRvIGJlIG1pc3NpbmcuICBUaGlzIHdpbGwKKwkJCSAqIGFsc28gcmV2ZXJ0IHVzIHRvIGFzeW5jL25hcnJvdyB0cmFuc2ZlcnMgdW50aWwKKwkJCSAqIHdlIGNhbiByZW5lZ290aWF0ZSB3aXRoIHRoZSBkZXZpY2UuCisJCQkgKi8KKwkJCWFoY19oYW5kbGVfZGV2cmVzZXQoYWhjLCAmZGV2aW5mbywKKwkJCQkJICAgIENBTV9TRUxfVElNRU9VVCwKKwkJCQkJICAgICJTZWxlY3Rpb24gVGltZW91dCIsCisJCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzEpOwogCQl9CiAJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKIAkJYWhjX3Jlc3RhcnQoYWhjKTsKQEAgLTM3NjMsOCArMzc3MSw5IEBACiAJCQkgLypwZXJpb2QqLzAsIC8qb2Zmc2V0Ki8wLCAvKnBwcl9vcHRpb25zKi8wLAogCQkJIEFIQ19UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKIAkKLQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKLQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1NFTlRfQkRSLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IENBTV9TRUxfVElNRU9VVCkKKwkJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfU0VOVF9CRFIsIE5VTEwpOwogCiAJaWYgKG1lc3NhZ2UgIT0gTlVMTAogCSAmJiAodmVyYm9zZV9sZXZlbCA8PSBib290dmVyYm9zZSkpCkBAIC00MDAzLDE0ICs0MDEyLDYgQEAKIAkgKiB0byBkaXN0dXJiIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGJ1cy4KIAkgKi8KIAlhaGNfcGF1c2UoYWhjKTsKLQlpZiAoKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgQ0hJUFJTVCkgIT0gMCkgewotCQkvKgotCQkgKiBUaGUgY2hpcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgc2luY2UKLQkJICogUENJL0VJU0EvVkxCIGJ1cyByZXNldC4gIERvbid0IHRydXN0Ci0JCSAqICJsZWZ0IG92ZXIgQklPUyBkYXRhIi4KLQkJICovCi0JCWFoYy0+ZmxhZ3MgfD0gQUhDX05PX0JJT1NfSU5JVDsKLQl9CiAJc3hmcmN0bDFfYiA9IDA7CiAJaWYgKChhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3NzcwKSB7CiAJCXVfaW50IHNibGtjdGw7CkBAIC01MDM2LDE0ICs1MDM3LDIzIEBACiAJYWhjLT5mbGFncyB8PSBBSENfQUxMX0lOVEVSUlVQVFM7CiAJcGF1c2VkID0gRkFMU0U7CiAJZG8gewotCQlpZiAocGF1c2VkKQorCQlpZiAocGF1c2VkKSB7CiAJCQlhaGNfdW5wYXVzZShhaGMpOworCQkJLyoKKwkJCSAqIEdpdmUgdGhlIHNlcXVlbmNlciBzb21lIHRpbWUgdG8gc2VydmljZQorCQkJICogYW55IGFjdGl2ZSBzZWxlY3Rpb25zLgorCQkJICovCisJCQlhaGNfZGVsYXkoNTAwKTsKKwkJfQogCQlhaGNfaW50cihhaGMpOwogCQlhaGNfcGF1c2UoYWhjKTsKIAkJcGF1c2VkID0gVFJVRTsKIAkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBhaGNfaW5iKGFoYywgU0NTSVNFUSkgJiB+RU5TRUxPKTsKLQkJYWhjX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhjKTsKIAkJaW50c3RhdCA9IGFoY19pbmIoYWhjLCBJTlRTVEFUKTsKKwkJaWYgKChpbnRzdGF0ICYgSU5UX1BFTkQpID09IDApIHsKKwkJCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoYyk7CisJCQlpbnRzdGF0ID0gYWhjX2luYihhaGMsIElOVFNUQVQpOworCQl9CiAJfSB3aGlsZSAoLS1tYXhsb29wcwogCSAgICAgICYmIChpbnRzdGF0ICE9IDB4RkYgfHwgKGFoYy0+ZmVhdHVyZXMgJiBBSENfUkVNT1ZBQkxFKSA9PSAwKQogCSAgICAgICYmICgoaW50c3RhdCAmIElOVF9QRU5EKSAhPSAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwppbmRleCA2ODdmMTllLi5jOTMyYjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTEyNSwxMiArMTI1LDYgQEAKIAogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqYWhjX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSA9IE5VTEw7CiAKLS8qCi0gKiBJbmNsdWRlIGFpY2xpYi5jIGFzIHBhcnQgb2Ygb3VyCi0gKiAibW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgaGFyZCIgd29yayBhcm91bmQuCi0gKi8KLSNpbmNsdWRlICJhaWNsaWIuYyIKLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIF9fc2V0dXAgKi8KICNpbmNsdWRlIDxsaW51eC9tbS5oPgkJLyogRm9yIGZldGNoaW5nIHN5c3RlbSBtZW1vcnkgc2l6ZSAqLwogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgkJLyogRm9yIGJsb2NrX3NpemUoKSAqLwpAQCAtMzkxLDcgKzM4NSw2IEBACiAJCQkJIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICosCiAJCQkJIHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgdm9pZCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKGNoYXIgKnApOwotc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm87CiBzdGF0aWMgaW50ICBhaWM3eHh4X3NldHVwKGNoYXIgKnMpOwogCiBzdGF0aWMgaW50IGFoY19saW51eF91bml0OwpAQCAtNjM1LDYgKzYyOCw4IEBACiAJCiAJdGFyZy0+c2RldltzZGV2LT5sdW5dID0gc2RldjsKIAorCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxOCw2ICs5MTMsODYgQEAKIAl9CiB9CiAKK3N0YXRpYyBjaGFyICoKK2FoY19wYXJzZV9icmFjZV9vcHRpb24oY2hhciAqb3B0X25hbWUsIGNoYXIgKm9wdF9hcmcsIGNoYXIgKmVuZCwgaW50IGRlcHRoLAorCQkgICAgICAgdm9pZCAoKmNhbGxiYWNrKSh1X2xvbmcsIGludCwgaW50LCBpbnQzMl90KSwKKwkJICAgICAgIHVfbG9uZyBjYWxsYmFja19hcmcpCit7CisJY2hhcgkqdG9rX2VuZDsKKwljaGFyCSp0b2tfZW5kMjsKKwlpbnQgICAgICBpOworCWludCAgICAgIGluc3RhbmNlOworCWludAkgdGFyZzsKKwlpbnQJIGRvbmU7CisJY2hhcgkgdG9rX2xpc3RbXSA9IHsnLicsICcsJywgJ3snLCAnfScsICdcMCd9OworCisJLyogQWxsIG9wdGlvbnMgdXNlIGEgJzonIG5hbWUvYXJnIHNlcGFyYXRvciAqLworCWlmICgqb3B0X2FyZyAhPSAnOicpCisJCXJldHVybiAob3B0X2FyZyk7CisJb3B0X2FyZysrOworCWluc3RhbmNlID0gLTE7CisJdGFyZyA9IC0xOworCWRvbmUgPSBGQUxTRTsKKwkvKgorCSAqIFJlc3RvcmUgc2VwYXJhdG9yIHRoYXQgbWF5IGJlIGluCisJICogdGhlIG1pZGRsZSBvZiBvdXIgb3B0aW9uIGFyZ3VtZW50LgorCSAqLworCXRva19lbmQgPSBzdHJjaHIob3B0X2FyZywgJ1wwJyk7CisJaWYgKHRva19lbmQgPCBlbmQpCisJCSp0b2tfZW5kID0gJywnOworCXdoaWxlICghZG9uZSkgeworCQlzd2l0Y2ggKCpvcHRfYXJnKSB7CisJCWNhc2UgJ3snOgorCQkJaWYgKGluc3RhbmNlID09IC0xKSB7CisJCQkJaW5zdGFuY2UgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGVwdGggPiAxKSB7CisJCQkJCWlmICh0YXJnID09IC0xKQorCQkJCQkJdGFyZyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRmKCJNYWxmb3JtZWQgT3B0aW9uICVzXG4iLAorCQkJCQkgICAgICAgb3B0X25hbWUpOworCQkJCQlkb25lID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCQlvcHRfYXJnKys7CisJCQlicmVhazsKKwkJY2FzZSAnfSc6CisJCQlpZiAodGFyZyAhPSAtMSkKKwkJCQl0YXJnID0gLTE7CisJCQllbHNlIGlmIChpbnN0YW5jZSAhPSAtMSkKKwkJCQlpbnN0YW5jZSA9IC0xOworCQkJb3B0X2FyZysrOworCQkJYnJlYWs7CisJCWNhc2UgJywnOgorCQljYXNlICcuJzoKKwkJCWlmIChpbnN0YW5jZSA9PSAtMSkKKwkJCQlkb25lID0gVFJVRTsKKwkJCWVsc2UgaWYgKHRhcmcgPj0gMCkKKwkJCQl0YXJnKys7CisJCQllbHNlIGlmIChpbnN0YW5jZSA+PSAwKQorCQkJCWluc3RhbmNlKys7CisJCQlvcHRfYXJnKys7CisJCQlicmVhazsKKwkJY2FzZSAnXDAnOgorCQkJZG9uZSA9IFRSVUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRva19lbmQgPSBlbmQ7CisJCQlmb3IgKGkgPSAwOyB0b2tfbGlzdFtpXTsgaSsrKSB7CisJCQkJdG9rX2VuZDIgPSBzdHJjaHIob3B0X2FyZywgdG9rX2xpc3RbaV0pOworCQkJCWlmICgodG9rX2VuZDIpICYmICh0b2tfZW5kMiA8IHRva19lbmQpKQorCQkJCQl0b2tfZW5kID0gdG9rX2VuZDI7CisJCQl9CisJCQljYWxsYmFjayhjYWxsYmFja19hcmcsIGluc3RhbmNlLCB0YXJnLAorCQkJCSBzaW1wbGVfc3RydG9sKG9wdF9hcmcsIE5VTEwsIDApKTsKKwkJCW9wdF9hcmcgPSB0b2tfZW5kOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChvcHRfYXJnKTsKK30KKwogLyoKICAqIEhhbmRsZSBMaW51eCBib290IHBhcmFtZXRlcnMuIFRoaXMgcm91dGluZSBhbGxvd3MgZm9yIGFzc2lnbmluZyBhIHZhbHVlCiAgKiB0byBhIHBhcmFtZXRlciB3aXRoIGEgJzonIGJldHdlZW4gdGhlIHBhcmFtZXRlciBhbmQgdGhlIHZhbHVlLgpAQCAtOTcyLDcgKzEwNDcsNyBAQAogCQlpZiAoc3RybmNtcChwLCAiZ2xvYmFsX3RhZ19kZXB0aCIsIG4pID09IDApIHsKIAkJCWFoY19saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwocCArIG4pOwogCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInRhZ19pbmZvIiwgbikgPT0gMCkgewotCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInRhZ19pbmZvIiwgcCArIG4sIGVuZCwKKwkJCXMgPSBhaGNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCiAJCQkgICAgMiwgYWhjX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKIAkJfSBlbHNlIGlmIChwW25dID09ICc6JykgewogCQkJKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKQEAgLTE2MTIsOSArMTY4Nyw5IEBACiAJCWlmIChjaGFubmVsID09ICdCJykKIAkJCXRhcmdldF9vZmZzZXQgKz0gODsKIAkJc3RhcmdldCA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFt0YXJnZXRfb2Zmc2V0XTsKLQkJdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOwotCQlpZiAodGFyZyA9PSBOVUxMKQorCQlpZiAoc3RhcmdldCA9PSBOVUxMKQogCQkJYnJlYWs7CisJCXRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKIAogCQl0YXJnZXRfcHByX29wdGlvbnMgPQogCQkJKHNwaV9kdChzdGFyZ2V0KSA/IE1TR19FWFRfUFBSX0RUX1JFUSA6IDApCkBAIC0yMzI5LDggKzI0MDQsNiBAQAogewogfQogCi1zdGF0aWMgdm9pZCBhaGNfbGludXhfZXhpdCh2b2lkKTsKLQogc3RhdGljIHZvaWQgYWhjX2xpbnV4X3NldF93aWR0aChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCB3aWR0aCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCmluZGV4IDBlNDdhYzIuLmM1Mjk5NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaApAQCAtMjY1LDcgKzI2NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU01QIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNkZWZpbmUgQUlDN1hYWF9EUklWRVJfVkVSU0lPTiAiNi4yLjM2IgorI2RlZmluZSBBSUM3WFhYX0RSSVZFUl9WRVJTSU9OICI3LjAiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV2aWNlIERhdGEgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYwppbmRleCA5ZDMxOGNlLi4wZDQ0YTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYwpAQCAtMTQ5LDYgKzE0OSwyNyBAQAogCWFoY19mcmVlKGFoYyk7CiB9CiAKK3N0YXRpYyB2b2lkCithaGNfbGludXhfcGNpX2luaGVyaXRfZmxhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWhjLT5kZXZfc29mdGMsICptYXN0ZXJfcGRldjsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX2RldmZuID0gUENJX0RFVkZOKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgMCk7CisKKwltYXN0ZXJfcGRldiA9IHBjaV9nZXRfc2xvdChwZGV2LT5idXMsIG1hc3Rlcl9kZXZmbik7CisJaWYgKG1hc3Rlcl9wZGV2KSB7CisJCXN0cnVjdCBhaGNfc29mdGMgKm1hc3RlciA9IHBjaV9nZXRfZHJ2ZGF0YShtYXN0ZXJfcGRldik7CisJCWlmIChtYXN0ZXIpIHsKKwkJCWFoYy0+ZmxhZ3MgJj0gfkFIQ19CSU9TX0VOQUJMRUQ7IAorCQkJYWhjLT5mbGFncyB8PSBtYXN0ZXItPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRDsKKworCQkJYWhjLT5mbGFncyAmPSB+QUhDX1BSSU1BUllfQ0hBTk5FTDsgCisJCQlhaGMtPmZsYWdzIHw9IG1hc3Rlci0+ZmxhZ3MgJiBBSENfUFJJTUFSWV9DSEFOTkVMOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiYWljN3h4eDogbm8gbXVsdGljaGFubmVsIHBlZXIgZm91bmQhXG4iKTsKKwkJcGNpX2Rldl9wdXQobWFzdGVyX3BkZXYpOworCX0gCit9CisKIHN0YXRpYyBpbnQKIGFoY19saW51eF9wY2lfZGV2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMjAzLDYgKzIyNCwxNCBAQAogCQlhaGNfZnJlZShhaGMpOwogCQlyZXR1cm4gKC1lcnJvcik7CiAJfQorCisJLyoKKwkgKiBTZWNvbmQgRnVuY3Rpb24gUENJIGRldmljZXMgbmVlZCB0byBpbmhlcml0IHNvbWUKKwkgKiBzZXR0aW5ncyBmcm9tIGZ1bmN0aW9uIDAuCisJICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX0ZVTkMpICYmIFBDSV9GVU5DKHBkZXYtPmRldmZuKSAhPSAwKQorCQlhaGNfbGludXhfcGNpX2luaGVyaXRfZmxhZ3MoYWhjKTsKKwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhaGMpOwogCWFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKIAlyZXR1cm4gKDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYwppbmRleCAzODAyYzkxLi4wNGEzNTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYwpAQCAtNTQsNiArNTQsNDkgQEAKIHN0YXRpYyBpbnQJYWhjX3Byb2Nfd3JpdGVfc2VlcHJvbShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCiAJCQkJICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCk7CiAKKy8qCisgKiBUYWJsZSBvZiBzeW5jcmF0ZXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlICJkaXZpc2libGUgYnkgNCIKKyAqIHJ1bGUuIFRoaXMgdGFibGUgd2lsbCBiZSBleHBhbmRlZCBpbiBmdXR1cmUgU0NTSSBzcGVjcy4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJdV9pbnQgcGVyaW9kX2ZhY3RvcjsKKwl1X2ludCBwZXJpb2Q7CS8qIGluIDEwMHRocyBvZiBucyAqLworfSBzY3NpX3N5bmNyYXRlc1tdID0geworCXsgMHgwOCwgNjI1IH0sCS8qIEZBU1QtMTYwICovCisJeyAweDA5LCAxMjUwIH0sCS8qIEZBU1QtODAgKi8KKwl7IDB4MGEsIDI1MDAgfSwJLyogRkFTVC00MCA0ME1IeiAqLworCXsgMHgwYiwgMzAzMCB9LAkvKiBGQVNULTQwIDMzTUh6ICovCisJeyAweDBjLCA1MDAwIH0JLyogRkFTVC0yMCAqLworfTsKKworLyoKKyAqIFJldHVybiB0aGUgZnJlcXVlbmN5IGluIGtIeiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorICogc3luYyBwZXJpb2QgZmFjdG9yLgorICovCitzdGF0aWMgdV9pbnQKK2FoY19jYWxjX3N5bmNzcmF0ZSh1X2ludCBwZXJpb2RfZmFjdG9yKQoreworCWludCBpOworCWludCBudW1fc3luY3JhdGVzOworCisJbnVtX3N5bmNyYXRlcyA9IHNpemVvZihzY3NpX3N5bmNyYXRlcykgLyBzaXplb2Yoc2NzaV9zeW5jcmF0ZXNbMF0pOworCS8qIFNlZSBpZiB0aGUgcGVyaW9kIGlzIGluIHRoZSAiZXhjZXB0aW9uIiB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fc3luY3JhdGVzOyBpKyspIHsKKworCQlpZiAocGVyaW9kX2ZhY3RvciA9PSBzY3NpX3N5bmNyYXRlc1tpXS5wZXJpb2RfZmFjdG9yKSB7CisJCQkvKiBQZXJpb2QgaW4ga0h6ICovCisJCQlyZXR1cm4gKDEwMDAwMDAwMCAvIHNjc2lfc3luY3JhdGVzW2ldLnBlcmlvZCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFdhc24ndCBpbiB0aGUgdGFibGUsIHNvIHVzZSB0aGUgc3RhbmRhcmQKKwkgKiA0IHRpbWVzIGNvbnZlcnNpb24uCisJICovCisJcmV0dXJuICgxMDAwMDAwMCAvIChwZXJpb2RfZmFjdG9yICogNCAqIDEwKSk7Cit9CisKKwogc3RhdGljIHZvaWQKIGNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQogewpAQCAtMTA2LDcgKzE0OSw3IEBACiAgICAgICAgIHNwZWVkID0gMzMwMDsKICAgICAgICAgZnJlcSA9IDA7CiAJaWYgKHRpbmZvLT5vZmZzZXQgIT0gMCkgewotCQlmcmVxID0gYWljX2NhbGNfc3luY3NyYXRlKHRpbmZvLT5wZXJpb2QpOworCQlmcmVxID0gYWhjX2NhbGNfc3luY3NyYXRlKHRpbmZvLT5wZXJpb2QpOwogCQlzcGVlZCA9IGZyZXE7CiAJfQogCXNwZWVkICo9ICgweDAxIDw8IHRpbmZvLT53aWR0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZy5oX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZy5oX3NoaXBwZWQKaW5kZXggN2MxMzkwZS4uMmNlMWZlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWcuaF9zaGlwcGVkCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnLmhfc2hpcHBlZApAQCAtMiw4ICsyLDggQEAKICAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1NiAkCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTggJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyM0MCAkCiAgKi8KIHR5cGVkZWYgaW50IChhaGNfcmVnX3ByaW50X3QpKHVfaW50LCB1X2ludCAqLCB1X2ludCk7CiB0eXBlZGVmIHN0cnVjdCBhaGNfcmVnX3BhcnNlX2VudHJ5IHsKQEAgLTEyOTgsNyArMTI5OCw2IEBACiAjZGVmaW5lCUNNRFNJWkVfVEFCTEVfVEFJTAkJMHgzNAogCiAjZGVmaW5lCU1XSV9SRVNJRFVBTCAgICAJCTB4MzgKLSNkZWZpbmUJVEFSR19JTU1FRElBVEVfU0NCCQkweDM4CiAKICNkZWZpbmUJTkVYVF9RVUVVRURfU0NCIAkJMHgzOQogCkBAIC0xMzgwLDYgKzEzNzksNyBAQAogI2RlZmluZQlSRVRVUk5fMiAgICAgICAgCQkweDUyCiAKICNkZWZpbmUJTEFTVF9NU0cgICAgICAgIAkJMHg1MworI2RlZmluZQlUQVJHX0lNTUVESUFURV9TQ0IJCTB4NTMKIAogI2RlZmluZQlTQ1NJU0VRX1RFTVBMQVRFCQkweDU0CiAjZGVmaW5lCQlFTlNFTE8gICAgICAgICAgCTB4NDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZAppbmRleCA5YzcxMzc3Li44OGJmZDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZ19wcmludC5jX3NoaXBwZWQKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWdfcHJpbnQuY19zaGlwcGVkCkBAIC0yLDggKzIsOCBAQAogICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU2ICQKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjMzkgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1OCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzQwICQKICAqLwogCiAjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZAppbmRleCBjZjQxMTM2Li40Y2VlMDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3NlcS5oX3NoaXBwZWQKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9zZXEuaF9zaGlwcGVkCkBAIC0yLDEzICsyLDEzIEBACiAgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTYgJAotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyMzOSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU4ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjNDAgJAogICovCiBzdGF0aWMgdWludDhfdCBzZXFwcm9nW10gPSB7CiAJMHhiMiwgMHgwMCwgMHgwMCwgMHgwOCwKIAkweGY3LCAweDExLCAweDIyLCAweDA4LAotCTB4MDAsIDB4NjUsIDB4ZWMsIDB4NTksCisJMHgwMCwgMHg2NSwgMHhlZSwgMHg1OSwKIAkweGY3LCAweDAxLCAweDAyLCAweDA4LAogCTB4ZmYsIDB4NmEsIDB4MjQsIDB4MDgsCiAJMHg0MCwgMHgwMCwgMHg0MCwgMHg2OCwKQEAgLTIxLDE1ICsyMSwxNSBAQAogCTB4MDEsIDB4NGQsIDB4YzgsIDB4MzAsCiAJMHgwMCwgMHg0YywgMHgxMiwgMHg3MCwKIAkweDAxLCAweDM5LCAweGEyLCAweDMwLAotCTB4MDAsIDB4NmEsIDB4YzAsIDB4NWUsCisJMHgwMCwgMHg2YSwgMHhjMiwgMHg1ZSwKIAkweDAxLCAweDUxLCAweDIwLCAweDMxLAogCTB4MDEsIDB4NTcsIDB4YWUsIDB4MDAsCiAJMHgwZCwgMHg2YSwgMHg3NiwgMHgwMCwKLQkweDAwLCAweDUxLCAweDEyLCAweDVlLAorCTB4MDAsIDB4NTEsIDB4MTQsIDB4NWUsCiAJMHgwMSwgMHg1MSwgMHhjOCwgMHgzMCwKIAkweDAwLCAweDM5LCAweGM4LCAweDYwLAogCTB4MDAsIDB4YmIsIDB4MzAsIDB4NzAsCi0JMHhjMSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweGMxLCAweDZhLCAweGRhLCAweDVlLAogCTB4MDEsIDB4YmYsIDB4NzIsIDB4MzAsCiAJMHgwMSwgMHg0MCwgMHg3ZSwgMHgzMSwKIAkweDAxLCAweDkwLCAweDgwLCAweDMwLApAQCAtNDksMTAgKzQ5LDEwIEBACiAJMHgwOCwgMHg2YSwgMHg3OCwgMHgwMCwKIAkweDAxLCAweDUwLCAweGM4LCAweDMwLAogCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHg0OCwgMHg2YSwgMHhmYywgMHg1ZCwKKwkweDQ4LCAweDZhLCAweGZlLCAweDVkLAogCTB4MDEsIDB4NmEsIDB4ZGMsIDB4MDEsCiAJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDQ4LCAweDZhLCAweGZjLCAweDVkLAorCTB4NDgsIDB4NmEsIDB4ZmUsIDB4NWQsCiAJMHgwMSwgMHg2YSwgMHgyNiwgMHgwMSwKIAkweGYwLCAweDE5LCAweDdhLCAweDA4LAogCTB4MGYsIDB4MTgsIDB4YzgsIDB4MDgsCkBAIC05Myw3ICs5Myw3IEBACiAJMHgwMCwgMHg2NSwgMHgyMCwgMHg0MSwKIAkweDAyLCAweDU3LCAweGFlLCAweDAwLAogCTB4MDAsIDB4NjUsIDB4OWUsIDB4NDAsCi0JMHg2MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDYxLCAweDZhLCAweGRhLCAweDVlLAogCTB4MDgsIDB4NTEsIDB4MjAsIDB4NzEsCiAJMHgwMiwgMHgwYiwgMHhiMiwgMHg3OCwKIAkweDAwLCAweDY1LCAweGFlLCAweDQwLApAQCAtMTA2LDcgKzEwNiw3IEBACiAJMHg4MCwgMHgzZCwgMHg3YSwgMHgwMCwKIAkweDIwLCAweDZhLCAweDE2LCAweDAwLAogCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCi0JMHgwMCwgMHg2NSwgMHhiMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGI0LCAweDVlLAogCTB4MDAsIDB4NjUsIDB4MTIsIDB4NDAsCiAJMHgyMCwgMHgxMSwgMHhkMiwgMHg2OCwKIAkweDIwLCAweDZhLCAweDE4LCAweDAwLApAQCAtMTQwLDI3ICsxNDAsMjcgQEAKIAkweDgwLCAweDBiLCAweGM0LCAweDc5LAogCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCiAJMHgwMSwgMHhhYiwgMHhhYywgMHgzMCwKLQkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4ZTQsIDB4NmEsIDB4NzAsIDB4NWQsCiAJMHg0MCwgMHg2YSwgMHgxNiwgMHgwMCwKLQkweDgwLCAweDNlLCAweDg0LCAweDVkLAorCTB4ODAsIDB4M2UsIDB4ODYsIDB4NWQsCiAJMHgyMCwgMHhiOCwgMHgxOCwgMHg3OSwKLQkweDIwLCAweDZhLCAweDg0LCAweDVkLAotCTB4MDAsIDB4YWIsIDB4ODQsIDB4NWQsCisJMHgyMCwgMHg2YSwgMHg4NiwgMHg1ZCwKKwkweDAwLCAweGFiLCAweDg2LCAweDVkLAogCTB4MDEsIDB4YTksIDB4NzgsIDB4MzAsCiAJMHgxMCwgMHhiOCwgMHgyMCwgMHg3OSwKLQkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4ZTQsIDB4NmEsIDB4NzAsIDB4NWQsCiAJMHgwMCwgMHg2NSwgMHhhZSwgMHg0MCwKIAkweDEwLCAweDAzLCAweDNjLCAweDY5LAogCTB4MDgsIDB4M2MsIDB4NWEsIDB4NjksCiAJMHgwNCwgMHgzYywgMHg5MiwgMHg2OSwKIAkweDAyLCAweDNjLCAweDk4LCAweDY5LAogCTB4MDEsIDB4M2MsIDB4NDQsIDB4NzksCi0JMHhmZiwgMHg2YSwgMHg3MCwgMHgwMCwKKwkweGZmLCAweDZhLCAweGE2LCAweDAwLAogCTB4MDAsIDB4NjUsIDB4YTQsIDB4NTksCi0JMHgwMCwgMHg2YSwgMHhjMCwgMHg1ZSwKLQkweGZmLCAweDM4LCAweDMwLCAweDcxLAorCTB4MDAsIDB4NmEsIDB4YzIsIDB4NWUsCisJMHhmZiwgMHg1MywgMHgzMCwgMHg3MSwKIAkweDBkLCAweDZhLCAweDc2LCAweDAwLAotCTB4MDAsIDB4MzgsIDB4MTIsIDB4NWUsCisJMHgwMCwgMHg1MywgMHgxNCwgMHg1ZSwKIAkweDAwLCAweDY1LCAweGVhLCAweDU4LAogCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCiAJMHgwMCwgMHg2NSwgMHgxOCwgMHg0MSwKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAJMHgwMCwgMHg2NSwgMHhmMiwgMHg1OCwKIAkweGZkLCAweDU3LCAweGFlLCAweDA4LAogCTB4MDAsIDB4NjUsIDB4YWUsIDB4NDAsCi0JMHhlNCwgMHg2YSwgMHg2ZSwgMHg1ZCwKKwkweGU0LCAweDZhLCAweDcwLCAweDVkLAogCTB4MjAsIDB4M2MsIDB4NGEsIDB4NzksCi0JMHgwMiwgMHg2YSwgMHg4NCwgMHg1ZCwKLQkweDA0LCAweDZhLCAweDg0LCAweDVkLAorCTB4MDIsIDB4NmEsIDB4ODYsIDB4NWQsCisJMHgwNCwgMHg2YSwgMHg4NiwgMHg1ZCwKIAkweDAxLCAweDAzLCAweDRjLCAweDY5LAogCTB4ZjcsIDB4MTEsIDB4MjIsIDB4MDgsCiAJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKQEAgLTE4MiwxMyArMTgyLDEzIEBACiAJMHg4MCwgMHg4NiwgMHhjOCwgMHgwOCwKIAkweDAxLCAweDRmLCAweGM4LCAweDMwLAogCTB4MDAsIDB4NTAsIDB4NmMsIDB4NjEsCi0JMHhjNCwgMHg2YSwgMHg2ZSwgMHg1ZCwKKwkweGM0LCAweDZhLCAweDcwLCAweDVkLAogCTB4NDAsIDB4M2MsIDB4NjgsIDB4NzksCi0JMHgyOCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDI4LCAweDZhLCAweDg2LCAweDVkLAogCTB4MDAsIDB4NjUsIDB4NGMsIDB4NDEsCi0JMHgwOCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDA4LCAweDZhLCAweDg2LCAweDVkLAogCTB4MDAsIDB4NjUsIDB4NGMsIDB4NDEsCi0JMHg4NCwgMHg2YSwgMHg2ZSwgMHg1ZCwKKwkweDg0LCAweDZhLCAweDcwLCAweDVkLAogCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCiAJMHgwMSwgMHg2NiwgMHhjOCwgMHgzMCwKIAkweDAxLCAweDY0LCAweGQ4LCAweDMxLApAQCAtMjA4LDE2ICsyMDgsMTYgQEAKIAkweGY3LCAweDNjLCAweDc4LCAweDA4LAogCTB4MDAsIDB4NjUsIDB4MjAsIDB4NDEsCiAJMHg0MCwgMHhhYSwgMHg3ZSwgMHgxMCwKLQkweDA0LCAweGFhLCAweDZlLCAweDVkLAotCTB4MDAsIDB4NjUsIDB4NTYsIDB4NDIsCi0JMHhjNCwgMHg2YSwgMHg2ZSwgMHg1ZCwKKwkweDA0LCAweGFhLCAweDcwLCAweDVkLAorCTB4MDAsIDB4NjUsIDB4NTgsIDB4NDIsCisJMHhjNCwgMHg2YSwgMHg3MCwgMHg1ZCwKIAkweGMwLCAweDZhLCAweDdlLCAweDAwLAotCTB4MDAsIDB4YTgsIDB4ODQsIDB4NWQsCisJMHgwMCwgMHhhOCwgMHg4NiwgMHg1ZCwKIAkweGU0LCAweDZhLCAweDA2LCAweDAwLAotCTB4MDAsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMCwgMHg2YSwgMHg4NiwgMHg1ZCwKIAkweDAwLCAweDY1LCAweDRjLCAweDQxLAogCTB4MTAsIDB4M2MsIDB4YTgsIDB4NjksCi0JMHgwMCwgMHhiYiwgMHg4YSwgMHg0NCwKKwkweDAwLCAweGJiLCAweDhjLCAweDQ0LAogCTB4MTgsIDB4NmEsIDB4ZGEsIDB4MDEsCiAJMHgwMSwgMHg2OSwgMHhkOCwgMHgzMSwKIAkweDFjLCAweDZhLCAweGQwLCAweDAxLApAQCAtMjI3LDMxICsyMjcsMzIgQEAKIAkweDAxLCAweDkzLCAweDI2LCAweDAxLAogCTB4MDMsIDB4NmEsIDB4MmEsIDB4MDEsCiAJMHgwMSwgMHg2OSwgMHgzMiwgMHgzMSwKLQkweDFjLCAweDZhLCAweGUwLCAweDVkLAorCTB4MWMsIDB4NmEsIDB4ZTIsIDB4NWQsCiAJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKLQkweDAwLCAweDY1LCAweGE4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NWUsCiAJMHgwMSwgMHg1MCwgMHhhMCwgMHgxOCwKIAkweDAyLCAweDZhLCAweDIyLCAweDA1LAogCTB4MWEsIDB4MDEsIDB4MDIsIDB4MDAsCiAJMHg4MCwgMHg2YSwgMHg3NCwgMHgwMCwKIAkweDQwLCAweDZhLCAweDc4LCAweDAwLAogCTB4NDAsIDB4NmEsIDB4MTYsIDB4MDAsCi0JMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweGRhLCAweDVkLAogCTB4MDEsIDB4M2YsIDB4YzgsIDB4MzAsCi0JMHhiZiwgMHg2NCwgMHg1NiwgMHg3YSwKLQkweDgwLCAweDY0LCAweDllLCAweDczLAotCTB4YTAsIDB4NjQsIDB4MDAsIDB4NzQsCi0JMHhjMCwgMHg2NCwgMHhmNCwgMHg3MywKLQkweGUwLCAweDY0LCAweDMwLCAweDc0LAotCTB4MDEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHhiZiwgMHg2NCwgMHg1OCwgMHg3YSwKKwkweDgwLCAweDY0LCAweGEwLCAweDczLAorCTB4YTAsIDB4NjQsIDB4MDIsIDB4NzQsCisJMHhjMCwgMHg2NCwgMHhmNiwgMHg3MywKKwkweGUwLCAweDY0LCAweDMyLCAweDc0LAorCTB4MDEsIDB4NmEsIDB4ZGEsIDB4NWUsCiAJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKIAkweGY3LCAweDExLCAweDIyLCAweDA4LAogCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCiAJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKIAkweGY3LCAweDAxLCAweDAyLCAweDA4LAotCTB4MDksIDB4MGMsIDB4ZTYsIDB4NzksCisJMHhjMCwgMHg2YSwgMHg3OCwgMHgwMCwKKwkweDA5LCAweDBjLCAweGU4LCAweDc5LAogCTB4MDgsIDB4MGMsIDB4MDQsIDB4NjgsCi0JMHhiMSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweGIxLCAweDZhLCAweGRhLCAweDVlLAogCTB4ZmYsIDB4NmEsIDB4MjYsIDB4MDksCiAJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKIAkweDAyLCAweDZhLCAweDA4LCAweDMwLApAQCAtMjY0LDI5ICsyNjUsMjkgQEAKIAkweDAwLCAweGE1LCAweDRhLCAweDIxLAogCTB4MDAsIDB4YTYsIDB4NGMsIDB4MjEsCiAJMHgwMCwgMHhhNywgMHg0ZSwgMHgyNSwKLQkweDA4LCAweGViLCAweGRjLCAweDdlLAotCTB4ODAsIDB4ZWIsIDB4MDYsIDB4N2EsCisJMHgwOCwgMHhlYiwgMHhkZSwgMHg3ZSwKKwkweDgwLCAweGViLCAweDA4LCAweDdhLAogCTB4ZmYsIDB4NmEsIDB4ZDYsIDB4MDksCi0JMHgwOCwgMHhlYiwgMHgwYSwgMHg2YSwKKwkweDA4LCAweGViLCAweDBjLCAweDZhLAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCi0JMHg4MCwgMHhhMywgMHhkYywgMHg2ZSwKLQkweDg4LCAweGViLCAweDIwLCAweDcyLAotCTB4MDgsIDB4ZWIsIDB4ZGMsIDB4NmUsCi0JMHgwNCwgMHhlYSwgMHgyNCwgMHhlMiwKLQkweDA4LCAweGVlLCAweGRjLCAweDZlLAorCTB4ODAsIDB4YTMsIDB4ZGUsIDB4NmUsCisJMHg4OCwgMHhlYiwgMHgyMiwgMHg3MiwKKwkweDA4LCAweGViLCAweGRlLCAweDZlLAorCTB4MDQsIDB4ZWEsIDB4MjYsIDB4ZTIsCisJMHgwOCwgMHhlZSwgMHhkZSwgMHg2ZSwKIAkweDA0LCAweDZhLCAweGQwLCAweDgxLAogCTB4MDUsIDB4YTQsIDB4YzAsIDB4ODksCiAJMHgwMywgMHhhNSwgMHhjMiwgMHgzMSwKIAkweDA5LCAweDZhLCAweGQ2LCAweDA1LAotCTB4MDAsIDB4NjUsIDB4MDgsIDB4NWEsCisJMHgwMCwgMHg2NSwgMHgwYSwgMHg1YSwKIAkweDA2LCAweGE0LCAweGQ0LCAweDg5LAotCTB4ODAsIDB4OTQsIDB4ZGMsIDB4N2UsCisJMHg4MCwgMHg5NCwgMHhkZSwgMHg3ZSwKIAkweDA3LCAweGU5LCAweDEwLCAweDMxLAogCTB4MDEsIDB4ZTksIDB4NDYsIDB4MzEsCi0JMHgwMCwgMHhhMywgMHhiYSwgMHg1ZSwKLQkweDAwLCAweDY1LCAweGZhLCAweDU5LAorCTB4MDAsIDB4YTMsIDB4YmMsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhmYywgMHg1OSwKIAkweDAxLCAweGE0LCAweGNhLCAweDMwLAotCTB4ODAsIDB4YTMsIDB4MzQsIDB4N2EsCisJMHg4MCwgMHhhMywgMHgzNiwgMHg3YSwKIAkweDAyLCAweDY1LCAweGNhLCAweDAwLAogCTB4MDEsIDB4NjUsIDB4ZjgsIDB4MzEsCiAJMHg4MCwgMHg5MywgMHgyNiwgMHgwMSwKQEAgLTI5NCwxNjIgKzI5NSwxNjIgQEAKIAkweDAxLCAweDhjLCAweGM4LCAweDMwLAogCTB4MDAsIDB4ODgsIDB4YzgsIDB4MTgsCiAJMHgwMiwgMHg2NCwgMHhjOCwgMHg4OCwKLQkweGZmLCAweDY0LCAweGRjLCAweDdlLAotCTB4ZmYsIDB4OGQsIDB4NGEsIDB4NmEsCi0JMHhmZiwgMHg4ZSwgMHg0YSwgMHg2YSwKKwkweGZmLCAweDY0LCAweGRlLCAweDdlLAorCTB4ZmYsIDB4OGQsIDB4NGMsIDB4NmEsCisJMHhmZiwgMHg4ZSwgMHg0YywgMHg2YSwKIAkweDAzLCAweDhjLCAweGQ0LCAweDk4LAotCTB4MDAsIDB4NjUsIDB4ZGMsIDB4NTYsCisJMHgwMCwgMHg2NSwgMHhkZSwgMHg1NiwKIAkweDAxLCAweDY0LCAweDcwLCAweDMwLAogCTB4ZmYsIDB4NjQsIDB4YzgsIDB4MTAsCiAJMHgwMSwgMHg2NCwgMHhjOCwgMHgxOCwKIAkweDAwLCAweDhjLCAweDE4LCAweDE5LAogCTB4ZmYsIDB4OGQsIDB4MWEsIDB4MjEsCiAJMHhmZiwgMHg4ZSwgMHgxYywgMHgyNSwKLQkweGMwLCAweDNjLCAweDVhLCAweDdhLAotCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHhjMCwgMHgzYywgMHg1YywgMHg3YSwKKwkweDIxLCAweDZhLCAweGRhLCAweDVlLAogCTB4YTgsIDB4NmEsIDB4NzYsIDB4MDAsCiAJMHg3OSwgMHg2YSwgMHg3NiwgMHgwMCwKLQkweDQwLCAweDNmLCAweDYyLCAweDZhLAorCTB4NDAsIDB4M2YsIDB4NjQsIDB4NmEsCiAJMHgwNCwgMHgzYiwgMHg3NiwgMHgwMCwKIAkweDA0LCAweDZhLCAweGQ0LCAweDgxLAotCTB4MjAsIDB4M2MsIDB4NmEsIDB4N2EsCi0JMHg1MSwgMHg2YSwgMHhkOCwgMHg1ZSwKLQkweDAwLCAweDY1LCAweDgyLCAweDQyLAorCTB4MjAsIDB4M2MsIDB4NmMsIDB4N2EsCisJMHg1MSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDg0LCAweDQyLAogCTB4MjAsIDB4M2MsIDB4NzgsIDB4MDAsCi0JMHgwMCwgMHhiMywgMHhiYSwgMHg1ZSwKKwkweDAwLCAweGIzLCAweGJjLCAweDVlLAogCTB4MDcsIDB4YWMsIDB4MTAsIDB4MzEsCiAJMHgwNSwgMHhiMywgMHg0NiwgMHgzMSwKIAkweDg4LCAweDZhLCAweGNjLCAweDAwLAotCTB4YWMsIDB4NmEsIDB4ZWUsIDB4NWQsCisJMHhhYywgMHg2YSwgMHhmMCwgMHg1ZCwKIAkweGEzLCAweDZhLCAweGNjLCAweDAwLAotCTB4YjMsIDB4NmEsIDB4ZjIsIDB4NWQsCi0JMHgwMCwgMHg2NSwgMHgzYSwgMHg1YSwKKwkweGIzLCAweDZhLCAweGY0LCAweDVkLAorCTB4MDAsIDB4NjUsIDB4M2MsIDB4NWEsCiAJMHhmZCwgMHhhNCwgMHg0OCwgMHgwOSwKIAkweDAzLCAweDhjLCAweDEwLCAweDMwLAotCTB4MDAsIDB4NjUsIDB4ZTYsIDB4NWQsCi0JMHgwMSwgMHhhNCwgMHg5NCwgMHg3YSwKKwkweDAwLCAweDY1LCAweGU4LCAweDVkLAorCTB4MDEsIDB4YTQsIDB4OTYsIDB4N2EsCiAJMHgwNCwgMHgzYiwgMHg3NiwgMHgwOCwKIAkweDAxLCAweDNiLCAweDI2LCAweDMxLAogCTB4ODAsIDB4MDIsIDB4MDQsIDB4MDAsCi0JMHgxMCwgMHgwYywgMHg4YSwgMHg3YSwKLQkweDAzLCAweDllLCAweDhjLCAweDZhLAorCTB4MTAsIDB4MGMsIDB4OGMsIDB4N2EsCisJMHgwMywgMHg5ZSwgMHg4ZSwgMHg2YSwKIAkweDdmLCAweDAyLCAweDA0LCAweDA4LAotCTB4OTEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHg5MSwgMHg2YSwgMHhkYSwgMHg1ZSwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAogCTB4MDEsIDB4YTQsIDB4Y2EsIDB4MzAsCi0JMHg4MCwgMHhhMywgMHg5YSwgMHg3YSwKKwkweDgwLCAweGEzLCAweDljLCAweDdhLAogCTB4MDIsIDB4NjUsIDB4Y2EsIDB4MDAsCiAJMHgwMSwgMHg2NSwgMHhmOCwgMHgzMSwKIAkweDAxLCAweDNiLCAweDI2LCAweDMxLAotCTB4MDAsIDB4NjUsIDB4MGUsIDB4NWEsCi0JMHgwMSwgMHhmYywgMHhhOCwgMHg2YSwKLQkweDgwLCAweDBiLCAweDllLCAweDZhLAotCTB4MTAsIDB4MGMsIDB4OWUsIDB4N2EsCi0JMHgyMCwgMHg5MywgMHg5ZSwgMHg2YSwKKwkweDAwLCAweDY1LCAweDEwLCAweDVhLAorCTB4MDEsIDB4ZmMsIDB4YWEsIDB4NmEsCisJMHg4MCwgMHgwYiwgMHhhMCwgMHg2YSwKKwkweDEwLCAweDBjLCAweGEwLCAweDdhLAorCTB4MjAsIDB4OTMsIDB4YTAsIDB4NmEsCiAJMHgwMiwgMHg5MywgMHgyNiwgMHgwMSwKLQkweDAyLCAweGZjLCAweGIyLCAweDdhLAotCTB4NDAsIDB4MGQsIDB4YzYsIDB4NmEsCisJMHgwMiwgMHhmYywgMHhiNCwgMHg3YSwKKwkweDQwLCAweDBkLCAweGM4LCAweDZhLAogCTB4MDEsIDB4YTQsIDB4NDgsIDB4MDEsCi0JMHgwMCwgMHg2NSwgMHhjNiwgMHg0MiwKLQkweDQwLCAweDBkLCAweGI4LCAweDZhLAotCTB4MDAsIDB4NjUsIDB4MGUsIDB4NWEsCi0JMHgwMCwgMHg2NSwgMHhhYSwgMHg0MiwKLQkweDgwLCAweGZjLCAweGMyLCAweDdhLAotCTB4ODAsIDB4YTQsIDB4YzIsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHhjOCwgMHg0MiwKKwkweDQwLCAweDBkLCAweGJhLCAweDZhLAorCTB4MDAsIDB4NjUsIDB4MTAsIDB4NWEsCisJMHgwMCwgMHg2NSwgMHhhYywgMHg0MiwKKwkweDgwLCAweGZjLCAweGM0LCAweDdhLAorCTB4ODAsIDB4YTQsIDB4YzQsIDB4NmEsCiAJMHhmZiwgMHhhNSwgMHg0YSwgMHgxOSwKIAkweGZmLCAweGE2LCAweDRjLCAweDIxLAogCTB4ZmYsIDB4YTcsIDB4NGUsIDB4MjEsCiAJMHhmOCwgMHhmYywgMHg0OCwgMHgwOSwKIAkweDdmLCAweGEzLCAweDQ2LCAweDA5LAotCTB4MDQsIDB4M2IsIDB4ZTIsIDB4NmEsCisJMHgwNCwgMHgzYiwgMHhlNCwgMHg2YSwKIAkweDAyLCAweDkzLCAweDI2LCAweDAxLAotCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCi0JMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKLQkweDAxLCAweDk0LCAweGM4LCAweDdhLAotCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCi0JMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKLQkweDAxLCAweGE0LCAweGUwLCAweDdhLAotCTB4MDEsIDB4ZmMsIDB4ZDYsIDB4N2EsCi0JMHgwMSwgMHg5NCwgMHhlMiwgMHg2YSwKLQkweDAxLCAweDk0LCAweGUyLCAweDZhLAotCTB4MDEsIDB4OTQsIDB4ZTIsIDB4NmEsCi0JMHgwMCwgMHg2NSwgMHg4MiwgMHg0MiwKLQkweDAxLCAweDk0LCAweGUwLCAweDdhLAotCTB4MTAsIDB4OTQsIDB4ZTIsIDB4NmEsCisJMHgwMSwgMHg5NCwgMHhjYSwgMHg3YSwKKwkweDAxLCAweDk0LCAweGNhLCAweDdhLAorCTB4MDEsIDB4OTQsIDB4Y2EsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhjYSwgMHg3YSwKKwkweDAxLCAweDk0LCAweGNhLCAweDdhLAorCTB4MDEsIDB4YTQsIDB4ZTIsIDB4N2EsCisJMHgwMSwgMHhmYywgMHhkOCwgMHg3YSwKKwkweDAxLCAweDk0LCAweGU0LCAweDZhLAorCTB4MDEsIDB4OTQsIDB4ZTQsIDB4NmEsCisJMHgwMSwgMHg5NCwgMHhlNCwgMHg2YSwKKwkweDAwLCAweDY1LCAweDg0LCAweDQyLAorCTB4MDEsIDB4OTQsIDB4ZTIsIDB4N2EsCisJMHgxMCwgMHg5NCwgMHhlNCwgMHg2YSwKIAkweGQ3LCAweDkzLCAweDI2LCAweDA5LAotCTB4MjgsIDB4OTMsIDB4ZTYsIDB4NmEsCisJMHgyOCwgMHg5MywgMHhlOCwgMHg2YSwKIAkweDAxLCAweDg1LCAweDBhLCAweDAxLAotCTB4MDIsIDB4ZmMsIDB4ZWUsIDB4NmEsCisJMHgwMiwgMHhmYywgMHhmMCwgMHg2YSwKIAkweDAxLCAweDE0LCAweDQ2LCAweDMxLAogCTB4ZmYsIDB4NmEsIDB4MTAsIDB4MDksCiAJMHhmZSwgMHg4NSwgMHgwYSwgMHgwOSwKLQkweGZmLCAweDM4LCAweGZjLCAweDZhLAotCTB4ODAsIDB4YTMsIDB4ZmMsIDB4N2EsCi0JMHg4MCwgMHgwYiwgMHhmYSwgMHg3YSwKLQkweDA0LCAweDNiLCAweGZjLCAweDdhLAorCTB4ZmYsIDB4MzgsIDB4ZmUsIDB4NmEsCisJMHg4MCwgMHhhMywgMHhmZSwgMHg3YSwKKwkweDgwLCAweDBiLCAweGZjLCAweDdhLAorCTB4MDQsIDB4M2IsIDB4ZmUsIDB4N2EsCiAJMHhiZiwgMHgzYiwgMHg3NiwgMHgwOCwKIAkweDAxLCAweDNiLCAweDI2LCAweDMxLAotCTB4MDAsIDB4NjUsIDB4MGUsIDB4NWEsCi0JMHgwMSwgMHgwYiwgMHgwYSwgMHg2YiwKLQkweDEwLCAweDBjLCAweGZlLCAweDdhLAotCTB4MDQsIDB4OTMsIDB4MDgsIDB4NmIsCi0JMHgwMSwgMHg5NCwgMHgwNiwgMHg3YiwKLQkweDEwLCAweDk0LCAweDA4LCAweDZiLAorCTB4MDAsIDB4NjUsIDB4MTAsIDB4NWEsCisJMHgwMSwgMHgwYiwgMHgwYywgMHg2YiwKKwkweDEwLCAweDBjLCAweDAwLCAweDdiLAorCTB4MDQsIDB4OTMsIDB4MGEsIDB4NmIsCisJMHgwMSwgMHg5NCwgMHgwOCwgMHg3YiwKKwkweDEwLCAweDk0LCAweDBhLCAweDZiLAogCTB4YzcsIDB4OTMsIDB4MjYsIDB4MDksCiAJMHgwMSwgMHg5OSwgMHhkNCwgMHgzMCwKLQkweDM4LCAweDkzLCAweDBjLCAweDZiLAotCTB4ZmYsIDB4MDgsIDB4NWEsIDB4NmIsCi0JMHhmZiwgMHgwOSwgMHg1YSwgMHg2YiwKLQkweGZmLCAweDBhLCAweDVhLCAweDZiLAotCTB4ZmYsIDB4MzgsIDB4MjgsIDB4N2IsCisJMHgzOCwgMHg5MywgMHgwZSwgMHg2YiwKKwkweGZmLCAweDA4LCAweDVjLCAweDZiLAorCTB4ZmYsIDB4MDksIDB4NWMsIDB4NmIsCisJMHhmZiwgMHgwYSwgMHg1YywgMHg2YiwKKwkweGZmLCAweDM4LCAweDJhLCAweDdiLAogCTB4MDQsIDB4MTQsIDB4MTAsIDB4MzEsCiAJMHgwMSwgMHgzOCwgMHgxOCwgMHgzMSwKIAkweDAyLCAweDZhLCAweDFhLCAweDMxLAogCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHgxNCwgMHg2YSwgMHhmNCwgMHg1ZCwKLQkweDAwLCAweDM4LCAweGUwLCAweDVkLAorCTB4MTQsIDB4NmEsIDB4ZjYsIDB4NWQsCisJMHgwMCwgMHgzOCwgMHhlMiwgMHg1ZCwKIAkweGZmLCAweDZhLCAweDcwLCAweDA4LAotCTB4MDAsIDB4NjUsIDB4NTQsIDB4NDMsCi0JMHg4MCwgMHhhMywgMHgyZSwgMHg3YiwKKwkweDAwLCAweDY1LCAweDU2LCAweDQzLAorCTB4ODAsIDB4YTMsIDB4MzAsIDB4N2IsCiAJMHgwMSwgMHhhNCwgMHg0OCwgMHgwMSwKLQkweDAwLCAweDY1LCAweDVhLCAweDQzLAotCTB4MDgsIDB4ZWIsIDB4MzQsIDB4N2IsCi0JMHgwMCwgMHg2NSwgMHgwZSwgMHg1YSwKLQkweDA4LCAweGViLCAweDMwLCAweDZiLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDMsCisJMHgwOCwgMHhlYiwgMHgzNiwgMHg3YiwKKwkweDAwLCAweDY1LCAweDEwLCAweDVhLAorCTB4MDgsIDB4ZWIsIDB4MzIsIDB4NmIsCiAJMHgwNywgMHhlOSwgMHgxMCwgMHgzMSwKIAkweDAxLCAweGU5LCAweGNhLCAweDMwLAogCTB4MDEsIDB4NjUsIDB4NDYsIDB4MzEsCi0JMHgwMCwgMHg2YSwgMHhiYSwgMHg1ZSwKKwkweDAwLCAweDZhLCAweGJjLCAweDVlLAogCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHhhNCwgMHg2YSwgMHhmNCwgMHg1ZCwKLQkweDA4LCAweDZhLCAweGUwLCAweDVkLAorCTB4YTQsIDB4NmEsIDB4ZjYsIDB4NWQsCisJMHgwOCwgMHg2YSwgMHhlMiwgMHg1ZCwKIAkweDBkLCAweDkzLCAweDI2LCAweDAxLAotCTB4MDAsIDB4NjUsIDB4YTgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg1ZSwKIAkweDg4LCAweDZhLCAweGNjLCAweDAwLAotCTB4MDAsIDB4NjUsIDB4OGEsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg4YywgMHg1ZSwKIAkweDAxLCAweDk5LCAweDQ2LCAweDMxLAotCTB4MDAsIDB4YTMsIDB4YmEsIDB4NWUsCisJMHgwMCwgMHhhMywgMHhiYywgMHg1ZSwKIAkweDAxLCAweDg4LCAweDEwLCAweDMxLAotCTB4MDAsIDB4NjUsIDB4M2EsIDB4NWEsCi0JMHgwMCwgMHg2NSwgMHhmYSwgMHg1OSwKKwkweDAwLCAweDY1LCAweDNjLCAweDVhLAorCTB4MDAsIDB4NjUsIDB4ZmMsIDB4NTksCiAJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKLQkweDAwLCAweDY1LCAweGU2LCAweDVkLAotCTB4ODAsIDB4MGIsIDB4ODIsIDB4NmEsCi0JMHg4MCwgMHgwYiwgMHg2MiwgMHg2YiwKLQkweDAxLCAweDBjLCAweDVjLCAweDdiLAotCTB4MTAsIDB4MGMsIDB4ODIsIDB4N2EsCi0JMHgwMywgMHg5ZSwgMHg4MiwgMHg2YSwKLQkweDAwLCAweDY1LCAweDA0LCAweDVhLAotCTB4MDAsIDB4NmEsIDB4YmEsIDB4NWUsCi0JMHgwMSwgMHhhNCwgMHg4MiwgMHg2YiwKLQkweGZmLCAweDM4LCAweDc4LCAweDdiLAorCTB4MDAsIDB4NjUsIDB4ZTgsIDB4NWQsCisJMHg4MCwgMHgwYiwgMHg4NCwgMHg2YSwKKwkweDgwLCAweDBiLCAweDY0LCAweDZiLAorCTB4MDEsIDB4MGMsIDB4NWUsIDB4N2IsCisJMHgxMCwgMHgwYywgMHg4NCwgMHg3YSwKKwkweDAzLCAweDllLCAweDg0LCAweDZhLAorCTB4MDAsIDB4NjUsIDB4MDYsIDB4NWEsCisJMHgwMCwgMHg2YSwgMHhiYywgMHg1ZSwKKwkweDAxLCAweGE0LCAweDg0LCAweDZiLAorCTB4ZmYsIDB4MzgsIDB4N2EsIDB4N2IsCiAJMHgwMSwgMHgzOCwgMHhjOCwgMHgzMCwKIAkweDAwLCAweDA4LCAweDQwLCAweDE5LAogCTB4ZmYsIDB4NmEsIDB4YzgsIDB4MDgsCiAJMHgwMCwgMHgwOSwgMHg0MiwgMHgyMSwKIAkweDAwLCAweDBhLCAweDQ0LCAweDIxLAogCTB4ZmYsIDB4NmEsIDB4NzAsIDB4MDgsCi0JMHgwMCwgMHg2NSwgMHg3YSwgMHg0MywKKwkweDAwLCAweDY1LCAweDdjLCAweDQzLAogCTB4MDMsIDB4MDgsIDB4NDAsIDB4MzEsCiAJMHgwMywgMHgwOCwgMHg0MCwgMHgzMSwKIAkweDAxLCAweDA4LCAweDQwLCAweDMxLApAQCAtNDYxLDE2ICs0NjIsMTYgQEAKIAkweDA0LCAweDNjLCAweGNjLCAweDc5LAogCTB4ZmIsIDB4M2MsIDB4NzgsIDB4MDgsCiAJMHgwNCwgMHg5MywgMHgyMCwgMHg3OSwKLQkweDAxLCAweDBjLCAweDhlLCAweDZiLAorCTB4MDEsIDB4MGMsIDB4OTAsIDB4NmIsCiAJMHg4MCwgMHhiYSwgMHgyMCwgMHg3OSwKIAkweDgwLCAweDA0LCAweDIwLCAweDc5LAotCTB4ZTQsIDB4NmEsIDB4NmUsIDB4NWQsCi0JMHgyMywgMHg2YSwgMHg4NCwgMHg1ZCwKLQkweDAxLCAweDZhLCAweDg0LCAweDVkLAorCTB4ZTQsIDB4NmEsIDB4NzAsIDB4NWQsCisJMHgyMywgMHg2YSwgMHg4NiwgMHg1ZCwKKwkweDAxLCAweDZhLCAweDg2LCAweDVkLAogCTB4MDAsIDB4NjUsIDB4MjAsIDB4NDEsCiAJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKLQkweDgwLCAweDNjLCAweGEyLCAweDdiLAotCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHg4MCwgMHgzYywgMHhhNCwgMHg3YiwKKwkweDIxLCAweDZhLCAweGRhLCAweDVlLAogCTB4MDEsIDB4YmMsIDB4MTgsIDB4MzEsCiAJMHgwMiwgMHg2YSwgMHgxYSwgMHgzMSwKIAkweDAyLCAweDZhLCAweGY4LCAweDAxLApAQCAtNDgwLDE2ICs0ODEsMTYgQEAKIAkweGZmLCAweDZhLCAweDEyLCAweDA4LAogCTB4ZmYsIDB4NmEsIDB4MTQsIDB4MDgsCiAJMHhmMywgMHhiYywgMHhkNCwgMHgxOCwKLQkweGEwLCAweDZhLCAweGM4LCAweDUzLAorCTB4YTAsIDB4NmEsIDB4Y2EsIDB4NTMsCiAJMHgwNCwgMHhhMCwgMHgxMCwgMHgzMSwKIAkweGFjLCAweDZhLCAweDI2LCAweDAxLAogCTB4MDQsIDB4YTAsIDB4MTAsIDB4MzEsCiAJMHgwMywgMHgwOCwgMHgxOCwgMHgzMSwKIAkweDg4LCAweDZhLCAweGNjLCAweDAwLAotCTB4YTAsIDB4NmEsIDB4ZjQsIDB4NWQsCi0JMHgwMCwgMHhiYywgMHhlMCwgMHg1ZCwKKwkweGEwLCAweDZhLCAweGY2LCAweDVkLAorCTB4MDAsIDB4YmMsIDB4ZTIsIDB4NWQsCiAJMHgzZCwgMHg2YSwgMHgyNiwgMHgwMSwKLQkweDAwLCAweDY1LCAweGUwLCAweDQzLAorCTB4MDAsIDB4NjUsIDB4ZTIsIDB4NDMsCiAJMHhmZiwgMHg2YSwgMHgxMCwgMHgwOSwKIAkweGE0LCAweDZhLCAweDI2LCAweDAxLAogCTB4MGMsIDB4YTAsIDB4MzIsIDB4MzEsCkBAIC00OTksMTI4ICs1MDAsMTI4IEBACiAJMHgzNiwgMHg2YSwgMHgyNiwgMHgwMSwKIAkweDAyLCAweDkzLCAweDI2LCAweDAxLAogCTB4MzUsIDB4NmEsIDB4MjYsIDB4MDEsCi0JMHgwMCwgMHg2NSwgMHg5YywgMHg1ZSwKLQkweDAwLCAweDY1LCAweDljLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4OWUsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg5ZSwgMHg1ZSwKIAkweDAyLCAweDkzLCAweDI2LCAweDAxLAogCTB4YmYsIDB4M2MsIDB4NzgsIDB4MDgsCi0JMHgwNCwgMHgwYiwgMHhlNiwgMHg2YiwKLQkweDEwLCAweDBjLCAweGUyLCAweDdiLAotCTB4MDEsIDB4MDMsIDB4ZTYsIDB4NmIsCi0JMHgyMCwgMHg5MywgMHhlOCwgMHg2YiwKLQkweDA0LCAweDBiLCAweGVlLCAweDZiLAorCTB4MDQsIDB4MGIsIDB4ZTgsIDB4NmIsCisJMHgxMCwgMHgwYywgMHhlNCwgMHg3YiwKKwkweDAxLCAweDAzLCAweGU4LCAweDZiLAorCTB4MjAsIDB4OTMsIDB4ZWEsIDB4NmIsCisJMHgwNCwgMHgwYiwgMHhmMCwgMHg2YiwKIAkweDQwLCAweDNjLCAweDc4LCAweDAwLAogCTB4YzcsIDB4OTMsIDB4MjYsIDB4MDksCi0JMHgzOCwgMHg5MywgMHhmMCwgMHg2YiwKKwkweDM4LCAweDkzLCAweGYyLCAweDZiLAogCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCi0JMHg4MCwgMHgzYywgMHg1NiwgMHg2YywKKwkweDgwLCAweDNjLCAweDU4LCAweDZjLAogCTB4MDEsIDB4MDYsIDB4NTAsIDB4MzEsCiAJMHg4MCwgMHhiOCwgMHg3MCwgMHgwMSwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAogCTB4MTAsIDB4M2YsIDB4MDYsIDB4MDAsCiAJMHgxMCwgMHg2YSwgMHgwNiwgMHgwMCwKIAkweDAxLCAweDNhLCAweGNhLCAweDMwLAotCTB4ODAsIDB4NjUsIDB4MWMsIDB4NjQsCi0JMHgxMCwgMHhiOCwgMHg0MCwgMHg2YywKKwkweDgwLCAweDY1LCAweDFlLCAweDY0LAorCTB4MTAsIDB4YjgsIDB4NDIsIDB4NmMsCiAJMHhjMCwgMHgzZSwgMHhjYSwgMHgwMCwKLQkweDQwLCAweGI4LCAweDBjLCAweDZjLAorCTB4NDAsIDB4YjgsIDB4MGUsIDB4NmMsCiAJMHhiZiwgMHg2NSwgMHhjYSwgMHgwOCwKLQkweDIwLCAweGI4LCAweDIwLCAweDdjLAorCTB4MjAsIDB4YjgsIDB4MjIsIDB4N2MsCiAJMHgwMSwgMHg2NSwgMHgwYywgMHgzMCwKLQkweDAwLCAweDY1LCAweGQ4LCAweDVkLAotCTB4YTAsIDB4M2YsIDB4MjgsIDB4NjQsCisJMHgwMCwgMHg2NSwgMHhkYSwgMHg1ZCwKKwkweGEwLCAweDNmLCAweDJhLCAweDY0LAogCTB4MjMsIDB4YjgsIDB4MGMsIDB4MDgsCi0JMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKLQkweGEwLCAweDNmLCAweDI4LCAweDY0LAotCTB4MDAsIDB4YmIsIDB4MjAsIDB4NDQsCi0JMHhmZiwgMHg2NSwgMHgyMCwgMHg2NCwKLQkweDAwLCAweDY1LCAweDQwLCAweDQ0LAorCTB4MDAsIDB4NjUsIDB4ZGEsIDB4NWQsCisJMHhhMCwgMHgzZiwgMHgyYSwgMHg2NCwKKwkweDAwLCAweGJiLCAweDIyLCAweDQ0LAorCTB4ZmYsIDB4NjUsIDB4MjIsIDB4NjQsCisJMHgwMCwgMHg2NSwgMHg0MiwgMHg0NCwKIAkweDQwLCAweDZhLCAweDE4LCAweDAwLAogCTB4MDEsIDB4NjUsIDB4MGMsIDB4MzAsCi0JMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKLQkweGEwLCAweDNmLCAweGZjLCAweDczLAorCTB4MDAsIDB4NjUsIDB4ZGEsIDB4NWQsCisJMHhhMCwgMHgzZiwgMHhmZSwgMHg3MywKIAkweDQwLCAweDZhLCAweDE4LCAweDAwLAogCTB4MDEsIDB4M2EsIDB4YTYsIDB4MzAsCiAJMHgwOCwgMHg2YSwgMHg3NCwgMHgwMCwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAotCTB4NjQsIDB4NmEsIDB4NjgsIDB4NWQsCi0JMHg4MCwgMHg2NCwgMHhkOCwgMHg2YywKLQkweDA0LCAweDY0LCAweDlhLCAweDc0LAotCTB4MDIsIDB4NjQsIDB4YWEsIDB4NzQsCi0JMHgwMCwgMHg2YSwgMHg2MCwgMHg3NCwKLQkweDAzLCAweDY0LCAweGM4LCAweDc0LAotCTB4MjMsIDB4NjQsIDB4NDgsIDB4NzQsCi0JMHgwOCwgMHg2NCwgMHg1YywgMHg3NCwKLQkweDYxLCAweDZhLCAweGQ4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4ZDgsIDB4NWQsCisJMHg2NCwgMHg2YSwgMHg2YSwgMHg1ZCwKKwkweDgwLCAweDY0LCAweGRhLCAweDZjLAorCTB4MDQsIDB4NjQsIDB4OWMsIDB4NzQsCisJMHgwMiwgMHg2NCwgMHhhYywgMHg3NCwKKwkweDAwLCAweDZhLCAweDYyLCAweDc0LAorCTB4MDMsIDB4NjQsIDB4Y2EsIDB4NzQsCisJMHgyMywgMHg2NCwgMHg0YSwgMHg3NCwKKwkweDA4LCAweDY0LCAweDVlLCAweDc0LAorCTB4NjEsIDB4NmEsIDB4ZGEsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhkYSwgMHg1ZCwKIAkweDA4LCAweDUxLCAweGNlLCAweDcxLAotCTB4MDAsIDB4NjUsIDB4NDAsIDB4NDQsCi0JMHg4MCwgMHgwNCwgMHg1YSwgMHg3YywKLQkweDUxLCAweDZhLCAweDVlLCAweDVkLAotCTB4MDEsIDB4NTEsIDB4NWEsIDB4NjQsCi0JMHgwMSwgMHhhNCwgMHg1MiwgMHg3YywKLQkweDgwLCAweGJhLCAweDVjLCAweDZjLAotCTB4NDEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKLQkweDIxLCAweDZhLCAweGQ4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCi0JMHgwNywgMHg2YSwgMHg1NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDQyLCAweDQ0LAorCTB4ODAsIDB4MDQsIDB4NWMsIDB4N2MsCisJMHg1MSwgMHg2YSwgMHg2MCwgMHg1ZCwKKwkweDAxLCAweDUxLCAweDVjLCAweDY0LAorCTB4MDEsIDB4YTQsIDB4NTQsIDB4N2MsCisJMHg4MCwgMHhiYSwgMHg1ZSwgMHg2YywKKwkweDQxLCAweDZhLCAweGRhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NWUsIDB4NDQsCisJMHgyMSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDVlLCAweDQ0LAorCTB4MDcsIDB4NmEsIDB4NTYsIDB4NWQsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzMCwKIAkweDAwLCAweDY1LCAweGNjLCAweDQxLAotCTB4ODAsIDB4YjgsIDB4NTYsIDB4N2MsCi0JMHhjMCwgMHgzYywgMHg2YSwgMHg3YywKLQkweDgwLCAweDNjLCAweDU2LCAweDZjLAotCTB4ZmYsIDB4YTgsIDB4NmEsIDB4NmMsCi0JMHg0MCwgMHgzYywgMHg1NiwgMHg2YywKLQkweDEwLCAweGI4LCAweDZlLCAweDdjLAotCTB4YTEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMSwgMHhiNCwgMHg3NCwgMHg2YywKLQkweDAyLCAweGI0LCAweDc2LCAweDZjLAotCTB4MDEsIDB4YTQsIDB4NzYsIDB4N2MsCi0JMHhmZiwgMHhhOCwgMHg4NiwgMHg3YywKKwkweDgwLCAweGI4LCAweDU4LCAweDdjLAorCTB4YzAsIDB4M2MsIDB4NmMsIDB4N2MsCisJMHg4MCwgMHgzYywgMHg1OCwgMHg2YywKKwkweGZmLCAweGE4LCAweDZjLCAweDZjLAorCTB4NDAsIDB4M2MsIDB4NTgsIDB4NmMsCisJMHgxMCwgMHhiOCwgMHg3MCwgMHg3YywKKwkweGExLCAweDZhLCAweGRhLCAweDVlLAorCTB4MDEsIDB4YjQsIDB4NzYsIDB4NmMsCisJMHgwMiwgMHhiNCwgMHg3OCwgMHg2YywKKwkweDAxLCAweGE0LCAweDc4LCAweDdjLAorCTB4ZmYsIDB4YTgsIDB4ODgsIDB4N2MsCiAJMHgwNCwgMHhiNCwgMHg2OCwgMHgwMSwKIAkweDAxLCAweDZhLCAweDc2LCAweDAwLAotCTB4MDAsIDB4YmIsIDB4MTIsIDB4NWUsCi0JMHhmZiwgMHhhOCwgMHg4NiwgMHg3YywKLQkweDcxLCAweDZhLCAweGQ4LCAweDVlLAotCTB4NDAsIDB4NTEsIDB4ODYsIDB4NjQsCi0JMHgwMCwgMHg2NSwgMHhiMiwgMHg1ZSwKKwkweDAwLCAweGJiLCAweDE0LCAweDVlLAorCTB4ZmYsIDB4YTgsIDB4ODgsIDB4N2MsCisJMHg3MSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDQwLCAweDUxLCAweDg4LCAweDY0LAorCTB4MDAsIDB4NjUsIDB4YjQsIDB4NWUsCiAJMHgwMCwgMHg2NSwgMHhkZSwgMHg0MSwKLQkweDAwLCAweGJiLCAweDhhLCAweDVjLAorCTB4MDAsIDB4YmIsIDB4OGMsIDB4NWMsCiAJMHgwMCwgMHg2NSwgMHhkZSwgMHg0MSwKLQkweDAwLCAweDY1LCAweGIyLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4YjQsIDB4NWUsCiAJMHgwMSwgMHg2NSwgMHhhMiwgMHgzMCwKIAkweDAxLCAweGY4LCAweGM4LCAweDMwLAogCTB4MDEsIDB4NGUsIDB4YzgsIDB4MzAsCi0JMHgwMCwgMHg2YSwgMHhiNiwgMHhkZCwKLQkweDAwLCAweDUxLCAweGM4LCAweDVkLAorCTB4MDAsIDB4NmEsIDB4YjgsIDB4ZGQsCisJMHgwMCwgMHg1MSwgMHhjYSwgMHg1ZCwKIAkweDAxLCAweDRlLCAweDljLCAweDE4LAogCTB4MDIsIDB4NmEsIDB4MjIsIDB4MDUsCi0JMHhjMCwgMHgzYywgMHg1NiwgMHg2YywKKwkweGMwLCAweDNjLCAweDU4LCAweDZjLAogCTB4MDQsIDB4YjgsIDB4NzAsIDB4MDEsCi0JMHgwMCwgMHg2NSwgMHhkNCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGQ2LCAweDVlLAogCTB4MjAsIDB4YjgsIDB4ZGUsIDB4NjksCiAJMHgwMSwgMHhiYiwgMHhhMiwgMHgzMCwKIAkweDNmLCAweGJhLCAweDdjLCAweDA4LAotCTB4MDAsIDB4YjksIDB4Y2UsIDB4NWMsCisJMHgwMCwgMHhiOSwgMHhkMCwgMHg1YywKIAkweDAwLCAweDY1LCAweGRlLCAweDQxLAogCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCiAJMHgyMCwgMHgzYywgMHhjYywgMHg3OSwKLQkweDIwLCAweDNjLCAweDVjLCAweDdjLAotCTB4MDEsIDB4YTQsIDB4YjgsIDB4N2MsCisJMHgyMCwgMHgzYywgMHg1ZSwgMHg3YywKKwkweDAxLCAweGE0LCAweGJhLCAweDdjLAogCTB4MDEsIDB4YjQsIDB4NjgsIDB4MDEsCiAJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKLQkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4MDAsIDB4NjUsIDB4NWUsIDB4NDQsCiAJMHgwNCwgMHgxNCwgMHg1OCwgMHgzMSwKIAkweDAxLCAweDA2LCAweGQ0LCAweDMwLAogCTB4MDgsIDB4YTAsIDB4NjAsIDB4MzEsCiAJMHhhYywgMHg2YSwgMHhjYywgMHgwMCwKLQkweDE0LCAweDZhLCAweGY0LCAweDVkLAorCTB4MTQsIDB4NmEsIDB4ZjYsIDB4NWQsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzMCwKLQkweGEwLCAweDZhLCAweGVjLCAweDVkLAorCTB4YTAsIDB4NmEsIDB4ZWUsIDB4NWQsCiAJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKIAkweGRmLCAweDNjLCAweDc4LCAweDA4LAogCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCi0JMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKKwkweDAwLCAweDY1LCAweDVlLCAweDQ0LAogCTB4NGMsIDB4NjUsIDB4Y2MsIDB4MjgsCiAJMHgwMSwgMHgzZSwgMHgyMCwgMHgzMSwKIAkweGQwLCAweDY2LCAweGNjLCAweDE4LApAQCAtNjMxLDEwMiArNjMyLDEwMiBAQAogCTB4ZDAsIDB4NjUsIDB4Y2EsIDB4MTgsCiAJMHgwMSwgMHgzZSwgMHgyMCwgMHgzMSwKIAkweDMwLCAweDY1LCAweGQ0LCAweDE4LAotCTB4MDAsIDB4NjUsIDB4ZTYsIDB4NGMsCisJMHgwMCwgMHg2NSwgMHhlOCwgMHg0YywKIAkweGUxLCAweDZhLCAweDIyLCAweDAxLAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCiAJMHgyMCwgMHg2NSwgMHhkNCwgMHgxOCwKLQkweDAwLCAweDY1LCAweGVlLCAweDU0LAorCTB4MDAsIDB4NjUsIDB4ZjAsIDB4NTQsCiAJMHhlMSwgMHg2YSwgMHgyMiwgMHgwMSwKIAkweGZmLCAweDZhLCAweGQ0LCAweDA4LAogCTB4MjAsIDB4NjUsIDB4Y2EsIDB4MTgsCiAJMHhlMCwgMHg2NSwgMHhkNCwgMHgxOCwKLQkweDAwLCAweDY1LCAweGY4LCAweDRjLAorCTB4MDAsIDB4NjUsIDB4ZmEsIDB4NGMsCiAJMHhlMSwgMHg2YSwgMHgyMiwgMHgwMSwKIAkweGZmLCAweDZhLCAweGQ0LCAweDA4LAogCTB4ZDAsIDB4NjUsIDB4ZDQsIDB4MTgsCi0JMHgwMCwgMHg2NSwgMHgwMCwgMHg1NSwKKwkweDAwLCAweDY1LCAweDAyLCAweDU1LAogCTB4ZTEsIDB4NmEsIDB4MjIsIDB4MDEsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKIAkweDAxLCAweDZjLCAweGEyLCAweDMwLAotCTB4ZmYsIDB4NTEsIDB4MTIsIDB4NzUsCi0JMHgwMCwgMHg1MSwgMHg4ZSwgMHg1ZCwKKwkweGZmLCAweDUxLCAweDE0LCAweDc1LAorCTB4MDAsIDB4NTEsIDB4OTAsIDB4NWQsCiAJMHgwMSwgMHg1MSwgMHgyMCwgMHgzMSwKLQkweDAwLCAweDY1LCAweDM0LCAweDQ1LAorCTB4MDAsIDB4NjUsIDB4MzYsIDB4NDUsCiAJMHgzZiwgMHhiYSwgMHhjOCwgMHgwOCwKLQkweDAwLCAweDNlLCAweDM0LCAweDc1LAotCTB4MDAsIDB4NjUsIDB4YjAsIDB4NWUsCisJMHgwMCwgMHgzZSwgMHgzNiwgMHg3NSwKKwkweDAwLCAweDY1LCAweGIyLCAweDVlLAogCTB4ODAsIDB4M2MsIDB4NzgsIDB4MDAsCiAJMHgwMSwgMHgwNiwgMHhkNCwgMHgzMCwKLQkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4MDAsIDB4NjUsIDB4ZGEsIDB4NWQsCiAJMHgwMSwgMHgzYywgMHg3OCwgMHgwMCwKLQkweGUwLCAweDNmLCAweDUwLCAweDY1LAorCTB4ZTAsIDB4M2YsIDB4NTIsIDB4NjUsCiAJMHgwMiwgMHgzYywgMHg3OCwgMHgwMCwKLQkweDIwLCAweDEyLCAweDUwLCAweDY1LAotCTB4NTEsIDB4NmEsIDB4NWUsIDB4NWQsCi0JMHgwMCwgMHg1MSwgMHg4ZSwgMHg1ZCwKLQkweDUxLCAweDZhLCAweDVlLCAweDVkLAorCTB4MjAsIDB4MTIsIDB4NTIsIDB4NjUsCisJMHg1MSwgMHg2YSwgMHg2MCwgMHg1ZCwKKwkweDAwLCAweDUxLCAweDkwLCAweDVkLAorCTB4NTEsIDB4NmEsIDB4NjAsIDB4NWQsCiAJMHgwMSwgMHg1MSwgMHgyMCwgMHgzMSwKIAkweDA0LCAweDNjLCAweDc4LCAweDAwLAogCTB4MDEsIDB4YjksIDB4YzgsIDB4MzAsCi0JMHgwMCwgMHgzZCwgMHg0ZSwgMHg2NSwKKwkweDAwLCAweDNkLCAweDUwLCAweDY1LAogCTB4MDgsIDB4M2MsIDB4NzgsIDB4MDAsCiAJMHgzZiwgMHhiYSwgMHhjOCwgMHgwOCwKLQkweDAwLCAweDNlLCAweDRlLCAweDY1LAorCTB4MDAsIDB4M2UsIDB4NTAsIDB4NjUsCiAJMHgxMCwgMHgzYywgMHg3OCwgMHgwMCwKLQkweDA0LCAweGI4LCAweDRlLCAweDdkLAorCTB4MDQsIDB4YjgsIDB4NTAsIDB4N2QsCiAJMHhmYiwgMHhiOCwgMHg3MCwgMHgwOSwKLQkweDIwLCAweGI4LCAweDQ0LCAweDZkLAorCTB4MjAsIDB4YjgsIDB4NDYsIDB4NmQsCiAJMHgwMSwgMHg5MCwgMHhjOCwgMHgzMCwKIAkweGZmLCAweDZhLCAweGEyLCAweDAwLAotCTB4MDAsIDB4M2QsIDB4Y2UsIDB4NWMsCisJMHgwMCwgMHgzZCwgMHhkMCwgMHg1YywKIAkweDAxLCAweDY0LCAweDIwLCAweDMxLAogCTB4ZmYsIDB4NmEsIDB4NzgsIDB4MDgsCiAJMHgwMCwgMHg2NSwgMHhlYSwgMHg1OCwKLQkweDEwLCAweGI4LCAweDVjLCAweDdjLAotCTB4ZmYsIDB4NmEsIDB4NTQsIDB4NWQsCi0JMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKLQkweDAwLCAweDY1LCAweGIwLCAweDVlLAotCTB4MzEsIDB4NmEsIDB4ZDgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKKwkweDEwLCAweGI4LCAweDVlLCAweDdjLAorCTB4ZmYsIDB4NmEsIDB4NTYsIDB4NWQsCisJMHgwMCwgMHg2NSwgMHg1ZSwgMHg0NCwKKwkweDAwLCAweDY1LCAweGIyLCAweDVlLAorCTB4MzEsIDB4NmEsIDB4ZGEsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg1ZSwgMHg0NCwKIAkweDEwLCAweDNmLCAweDA2LCAweDAwLAogCTB4MTAsIDB4NmEsIDB4MDYsIDB4MDAsCiAJMHgwMSwgMHg2NSwgMHg3NCwgMHgzNCwKLQkweDgxLCAweDZhLCAweGQ4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4NjAsIDB4NDUsCisJMHg4MSwgMHg2YSwgMHhkYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDYyLCAweDQ1LAogCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCi0JMHgwMSwgMHgwYywgMHg2MCwgMHg3ZCwKLQkweDA0LCAweDBjLCAweDVhLCAweDZkLAorCTB4MDEsIDB4MGMsIDB4NjIsIDB4N2QsCisJMHgwNCwgMHgwYywgMHg1YywgMHg2ZCwKIAkweGUwLCAweDAzLCAweDdlLCAweDA4LAogCTB4ZTAsIDB4M2YsIDB4Y2MsIDB4NjEsCiAJMHgwMSwgMHg2NSwgMHhjYywgMHgzMCwKIAkweDAxLCAweDEyLCAweGRhLCAweDM0LAogCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzQsCi0JMHgwMSwgMHgwMywgMHg2ZSwgMHg2ZCwKKwkweDAxLCAweDAzLCAweDcwLCAweDZkLAogCTB4NDAsIDB4MDMsIDB4Y2MsIDB4MDgsCiAJMHgwMSwgMHg2NSwgMHgwNiwgMHgzMCwKIAkweDQwLCAweDY1LCAweGM4LCAweDA4LAotCTB4MDAsIDB4NjYsIDB4N2MsIDB4NzUsCi0JMHg0MCwgMHg2NSwgMHg3YywgMHg3ZCwKLQkweDAwLCAweDY1LCAweDdjLCAweDVkLAorCTB4MDAsIDB4NjYsIDB4N2UsIDB4NzUsCisJMHg0MCwgMHg2NSwgMHg3ZSwgMHg3ZCwKKwkweDAwLCAweDY1LCAweDdlLCAweDVkLAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKIAkweGZmLCAweDZhLCAweGQ0LCAweDA4LAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCiAJMHgwOCwgMHgwMSwgMHgwMiwgMHgwMCwKLQkweDAyLCAweDBiLCAweDg2LCAweDdkLAorCTB4MDIsIDB4MGIsIDB4ODgsIDB4N2QsCiAJMHgwMSwgMHg2NSwgMHgwYywgMHgzMCwKLQkweDAyLCAweDBiLCAweDhhLCAweDdkLAorCTB4MDIsIDB4MGIsIDB4OGMsIDB4N2QsCiAJMHhmNywgMHgwMSwgMHgwMiwgMHgwYywKIAkweDAxLCAweDY1LCAweGM4LCAweDMwLAotCTB4ZmYsIDB4NDEsIDB4YWUsIDB4NzUsCisJMHhmZiwgMHg0MSwgMHhiMCwgMHg3NSwKIAkweDAxLCAweDQxLCAweDIwLCAweDMxLAogCTB4ZmYsIDB4NmEsIDB4YTQsIDB4MDAsCi0JMHgwMCwgMHg2NSwgMHg5ZSwgMHg0NSwKLQkweGZmLCAweGJmLCAweGFlLCAweDc1LAorCTB4MDAsIDB4NjUsIDB4YTAsIDB4NDUsCisJMHhmZiwgMHhiZiwgMHhiMCwgMHg3NSwKIAkweDAxLCAweDkwLCAweGE0LCAweDMwLAogCTB4MDEsIDB4YmYsIDB4MjAsIDB4MzEsCi0JMHgwMCwgMHhiYiwgMHg5OCwgMHg2NSwKLQkweGZmLCAweDUyLCAweGFjLCAweDc1LAorCTB4MDAsIDB4YmIsIDB4OWEsIDB4NjUsCisJMHhmZiwgMHg1MiwgMHhhZSwgMHg3NSwKIAkweDAxLCAweGJmLCAweGNjLCAweDMwLAogCTB4MDEsIDB4OTAsIDB4Y2EsIDB4MzAsCiAJMHgwMSwgMHg1MiwgMHgyMCwgMHgzMSwKQEAgLTczNCwyOCArNzM1LDI4IEBACiAJMHgwMSwgMHg2NSwgMHgyMCwgMHgzNSwKIAkweDAxLCAweGJmLCAweDgyLCAweDM0LAogCTB4MDEsIDB4NjQsIDB4YTIsIDB4MzAsCi0JMHgwMCwgMHg2YSwgMHhjMCwgMHg1ZSwKKwkweDAwLCAweDZhLCAweGMyLCAweDVlLAogCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCi0JMHgwMCwgMHg1MSwgMHgxMiwgMHg0NiwKKwkweDAwLCAweDUxLCAweDE0LCAweDQ2LAogCTB4MDEsIDB4NjUsIDB4YTQsIDB4MzAsCiAJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDQ4LCAweDZhLCAweDA2LCAweDVlLAorCTB4NDgsIDB4NmEsIDB4MDgsIDB4NWUsCiAJMHgwMSwgMHg2YSwgMHhkMCwgMHgwMSwKIAkweDAxLCAweDZhLCAweGRjLCAweDA1LAogCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCi0JMHg0OCwgMHg2YSwgMHgwNiwgMHg1ZSwKLQkweDAxLCAweDZhLCAweGUwLCAweDVkLAorCTB4NDgsIDB4NmEsIDB4MDgsIDB4NWUsCisJMHgwMSwgMHg2YSwgMHhlMiwgMHg1ZCwKIAkweDAxLCAweDZhLCAweDI2LCAweDA1LAogCTB4MDEsIDB4NjUsIDB4ZDgsIDB4MzEsCiAJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKLQkweDgwLCAweGVlLCAweGNjLCAweDdkLAorCTB4ODAsIDB4ZWUsIDB4Y2UsIDB4N2QsCiAJMHhmZiwgMHg2YSwgMHhkYywgMHgwZCwKIAkweDAxLCAweDY1LCAweDMyLCAweDMxLAogCTB4MGEsIDB4OTMsIDB4MjYsIDB4MDEsCi0JMHgwMCwgMHg2NSwgMHhhOCwgMHg0NiwKLQkweDgxLCAweDZhLCAweGQ4LCAweDVlLAotCTB4MDEsIDB4MGMsIDB4ZDgsIDB4N2QsCi0JMHgwNCwgMHgwYywgMHhkNiwgMHg2ZCwKKwkweDAwLCAweDY1LCAweGFhLCAweDQ2LAorCTB4ODEsIDB4NmEsIDB4ZGEsIDB4NWUsCisJMHgwMSwgMHgwYywgMHhkYSwgMHg3ZCwKKwkweDA0LCAweDBjLCAweGQ4LCAweDZkLAogCTB4ZTAsIDB4MDMsIDB4MDYsIDB4MDgsCiAJMHhlMCwgMHgwMywgMHg3ZSwgMHgwYywKIAkweDAxLCAweDY1LCAweDE4LCAweDMxLApAQCAtNzc0LDcgKzc3NSw3IEBACiAJMHgwMSwgMHg2YywgMHhkYSwgMHgzNCwKIAkweDNkLCAweDY0LCAweGE0LCAweDI4LAogCTB4NTUsIDB4NjQsIDB4YzgsIDB4MjgsCi0JMHgwMCwgMHg2NSwgMHgwNiwgMHg0NiwKKwkweDAwLCAweDY1LCAweDA4LCAweDQ2LAogCTB4MmUsIDB4NjQsIDB4YTQsIDB4MjgsCiAJMHg2NiwgMHg2NCwgMHhjOCwgMHgyOCwKIAkweDAwLCAweDZjLCAweGRhLCAweDE4LApAQCAtNzg1LDYzICs3ODYsNjMgQEAKIAkweDAwLCAweDZjLCAweGRhLCAweDI0LAogCTB4MDEsIDB4NjUsIDB4YzgsIDB4MzAsCiAJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDQ0LCAweDZhLCAweDAyLCAweDVlLAorCTB4NDQsIDB4NmEsIDB4MDQsIDB4NWUsCiAJMHgwMSwgMHg5MCwgMHhlMiwgMHgzMSwKLQkweDA0LCAweDNiLCAweDI2LCAweDdlLAorCTB4MDQsIDB4M2IsIDB4MjgsIDB4N2UsCiAJMHgzMCwgMHg2YSwgMHhkMCwgMHgwMSwKIAkweDIwLCAweDZhLCAweGQwLCAweDAxLAogCTB4MWQsIDB4NmEsIDB4ZGMsIDB4MDEsCi0JMHhkYywgMHhlZSwgMHgyMiwgMHg2NiwKLQkweDAwLCAweDY1LCAweDNlLCAweDQ2LAorCTB4ZGMsIDB4ZWUsIDB4MjQsIDB4NjYsCisJMHgwMCwgMHg2NSwgMHg0MCwgMHg0NiwKIAkweDIwLCAweDZhLCAweGQwLCAweDAxLAogCTB4MDEsIDB4NmEsIDB4ZGMsIDB4MDEsCiAJMHgyMCwgMHhhMCwgMHhkOCwgMHgzMSwKIAkweDA5LCAweGVlLCAweGRjLCAweDAxLAotCTB4ODAsIDB4ZWUsIDB4MmUsIDB4N2UsCisJMHg4MCwgMHhlZSwgMHgzMCwgMHg3ZSwKIAkweDExLCAweDZhLCAweGRjLCAweDAxLAotCTB4NTAsIDB4ZWUsIDB4MzIsIDB4NjYsCisJMHg1MCwgMHhlZSwgMHgzNCwgMHg2NiwKIAkweDIwLCAweDZhLCAweGQwLCAweDAxLAogCTB4MDksIDB4NmEsIDB4ZGMsIDB4MDEsCi0JMHg4OCwgMHhlZSwgMHgzOCwgMHg2NiwKKwkweDg4LCAweGVlLCAweDNhLCAweDY2LAogCTB4MTksIDB4NmEsIDB4ZGMsIDB4MDEsCi0JMHhkOCwgMHhlZSwgMHgzYywgMHg2NiwKKwkweGQ4LCAweGVlLCAweDNlLCAweDY2LAogCTB4ZmYsIDB4NmEsIDB4ZGMsIDB4MDksCi0JMHgxOCwgMHhlZSwgMHg0MCwgMHg2ZSwKKwkweDE4LCAweGVlLCAweDQyLCAweDZlLAogCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCiAJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKLQkweDQ0LCAweDZhLCAweDAyLCAweDVlLAotCTB4MjAsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHg0NCwgMHg2YSwgMHgwNCwgMHg1ZSwKKwkweDIwLCAweDZhLCAweGUyLCAweDVkLAogCTB4MDEsIDB4M2IsIDB4MjYsIDB4MzEsCi0JMHgwNCwgMHgzYiwgMHg1YSwgMHg2ZSwKKwkweDA0LCAweDNiLCAweDVjLCAweDZlLAogCTB4YTAsIDB4NmEsIDB4Y2EsIDB4MDAsCiAJMHgyMCwgMHg2NSwgMHhjOCwgMHgxOCwKLQkweDAwLCAweDY1LCAweDk4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4NTIsIDB4NjYsCisJMHgwMCwgMHg2NSwgMHg5YSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDU0LCAweDY2LAogCTB4MGEsIDB4OTMsIDB4MjYsIDB4MDEsCi0JMHgwMCwgMHg2NSwgMHhhOCwgMHg0NiwKKwkweDAwLCAweDY1LCAweGFhLCAweDQ2LAogCTB4YTAsIDB4NmEsIDB4Y2MsIDB4MDAsCiAJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKLQkweDIwLCAweDk0LCAweDVlLCAweDZlLAotCTB4MTAsIDB4OTQsIDB4NjAsIDB4NmUsCi0JMHgwOCwgMHg5NCwgMHg3YSwgMHg2ZSwKLQkweDA4LCAweDk0LCAweDdhLCAweDZlLAotCTB4MDgsIDB4OTQsIDB4N2EsIDB4NmUsCisJMHgyMCwgMHg5NCwgMHg2MCwgMHg2ZSwKKwkweDEwLCAweDk0LCAweDYyLCAweDZlLAorCTB4MDgsIDB4OTQsIDB4N2MsIDB4NmUsCisJMHgwOCwgMHg5NCwgMHg3YywgMHg2ZSwKKwkweDA4LCAweDk0LCAweDdjLCAweDZlLAogCTB4ZmYsIDB4OGMsIDB4YzgsIDB4MTAsCiAJMHhjMSwgMHg2NCwgMHhjOCwgMHgxOCwKIAkweGY4LCAweDY0LCAweGM4LCAweDA4LAogCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCi0JMHgwMCwgMHg2NiwgMHg2ZSwgMHg2NiwKLQkweGMwLCAweDY2LCAweGFhLCAweDc2LAorCTB4MDAsIDB4NjYsIDB4NzAsIDB4NjYsCisJMHhjMCwgMHg2NiwgMHhhYywgMHg3NiwKIAkweDYwLCAweDY2LCAweGM4LCAweDE4LAogCTB4M2QsIDB4NjQsIDB4YzgsIDB4MjgsCi0JMHgwMCwgMHg2NSwgMHg1ZSwgMHg0NiwKKwkweDAwLCAweDY1LCAweDYwLCAweDQ2LAogCTB4ZjcsIDB4OTMsIDB4MjYsIDB4MDksCi0JMHgwOCwgMHg5MywgMHg3YywgMHg2ZSwKKwkweDA4LCAweDkzLCAweDdlLCAweDZlLAogCTB4MDAsIDB4NjIsIDB4YzQsIDB4MTgsCi0JMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKLQkweDAwLCAweDY1LCAweDg4LCAweDVlLAotCTB4MDAsIDB4NjUsIDB4ODgsIDB4NWUsCi0JMHgwMCwgMHg2NSwgMHg4OCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGFhLCAweDVlLAorCTB4MDAsIDB4NjUsIDB4OGEsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg4YSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDhhLCAweDVlLAogCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCiAJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKIAkweDAxLCAweDk5LCAweGRhLCAweDMwLApAQCAtODU4LDExICs4NTksMTEgQEAKIAkweDAxLCAweDZjLCAweDMyLCAweDMxLAogCTB4MDEsIDB4NmMsIDB4MzIsIDB4MzEsCiAJMHgwMSwgMHg2YywgMHgzMiwgMHgzNSwKLQkweDA4LCAweDk0LCAweGE4LCAweDdlLAorCTB4MDgsIDB4OTQsIDB4YWEsIDB4N2UsCiAJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKLQkweDA4LCAweDkzLCAweGFjLCAweDZlLAorCTB4MDgsIDB4OTMsIDB4YWUsIDB4NmUsCiAJMHhmZiwgMHg2YSwgMHhkNCwgMHgwYywKLQkweDA0LCAweGI4LCAweGQ0LCAweDZlLAorCTB4MDQsIDB4YjgsIDB4ZDYsIDB4NmUsCiAJMHgwMSwgMHg0MiwgMHg3ZSwgMHgzMSwKIAkweGZmLCAweDZhLCAweDc2LCAweDAxLAogCTB4MDEsIDB4OTAsIDB4ODQsIDB4MzQsCkBAIC04NzAsMTQgKzg3MSwxNCBAQAogCTB4MDEsIDB4ODUsIDB4MGEsIDB4MDEsCiAJMHg3ZiwgMHg2NSwgMHgxMCwgMHgwOSwKIAkweGZlLCAweDg1LCAweDBhLCAweDBkLAotCTB4ZmYsIDB4NDIsIDB4ZDAsIDB4NjYsCi0JMHhmZiwgMHg0MSwgMHhjOCwgMHg2NiwKLQkweGQxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4ZmYsIDB4NDIsIDB4ZDIsIDB4NjYsCisJMHhmZiwgMHg0MSwgMHhjYSwgMHg2NiwKKwkweGQxLCAweDZhLCAweGRhLCAweDVlLAogCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCiAJMHgwMSwgMHg0MSwgMHgyMCwgMHgzMSwKIAkweDAxLCAweGJmLCAweDgyLCAweDMwLAogCTB4MDEsIDB4NmEsIDB4NzYsIDB4MDAsCi0JMHgwMCwgMHhiYiwgMHgxMiwgMHg0NiwKKwkweDAwLCAweGJiLCAweDE0LCAweDQ2LAogCTB4MDEsIDB4NDIsIDB4MjAsIDB4MzEsCiAJMHgwMSwgMHhiZiwgMHg4NCwgMHgzNCwKIAkweDAxLCAweDQxLCAweDdlLCAweDMxLApAQCAtOTQxLDcgKzk0Miw3IEBACiBzdGF0aWMgaW50CiBhaGNfcGF0Y2gxN19mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKIHsKLQlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1RNT0RFX1dJREVPRERfQlVHKSAhPSAwKTsKKwlyZXR1cm4gKChhaGMtPmJ1Z3MgJiBBSENfVE1PREVfV0lERU9ERF9CVUcpICE9IDApOwogfQogCiBzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxNl9mdW5jOwpAQCAtMTE0MiwxNTIgKzExNDMsMTUyIEBACiAJeyBhaGNfcGF0Y2gwX2Z1bmMsIDE5NiwgMSwgMSB9LAogCXsgYWhjX3BhdGNoOV9mdW5jLCAyMTIsIDYsIDIgfSwKIAl7IGFoY19wYXRjaDBfZnVuYywgMjE4LCA2LCAxIH0sCi0JeyBhaGNfcGF0Y2g4X2Z1bmMsIDIyNiwgMjAsIDIgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgMjI2LCAyMSwgMiB9LAogCXsgYWhjX3BhdGNoMV9mdW5jLCAyNDEsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgMjQ4LCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDI0OSwgMiwgMiB9LAotCXsgYWhjX3BhdGNoMTFfZnVuYywgMjUwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDI1OCwgMjcsIDMgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgMjc0LCAxMCwgMiB9LAotCXsgYWhjX3BhdGNoMTNfZnVuYywgMjc3LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNF9mdW5jLCAyODUsIDE0LCAxIH0sCi0JeyBhaGNfcGF0Y2gxX2Z1bmMsIDMwMSwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCAzMDIsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgMzA1LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxM19mdW5jLCAzMTAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgMzExLCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDMxMywgNCwgMSB9LAotCXsgYWhjX3BhdGNoMTRfZnVuYywgMzE3LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNV9mdW5jLCAzMTksIDIsIDMgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgMzE5LCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDMyMCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoNl9mdW5jLCAzMjUsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzI2LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxX2Z1bmMsIDMzMCwgNDcsIDExIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDMzNywgMiwgNCB9LAotCXsgYWhjX3BhdGNoN19mdW5jLCAzMzcsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDhfZnVuYywgMzM4LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDMzOSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTZfZnVuYywgMzQwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDM1NiwgNiwgMyB9LAotCXsgYWhjX3BhdGNoMTZfZnVuYywgMzU2LCA1LCAxIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDM2MiwgNywgMSB9LAotCXsgYWhjX3BhdGNoMTNfZnVuYywgMzcyLCA1LCAxIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDM3NywgNTIsIDE3IH0sCi0JeyBhaGNfcGF0Y2gxNF9mdW5jLCAzNzcsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDdfZnVuYywgMzc5LCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gxN19mdW5jLCAzODAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgMzgzLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxOF9mdW5jLCAzOTAsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE0X2Z1bmMsIDM5NSwgOSwgMyB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCAzOTYsIDMsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgMzk5LCAzLCAxIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDQwNywgNiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0MTMsIDksIDIgfSwKLQl7IGFoY19wYXRjaDEzX2Z1bmMsIDQxMywgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTNfZnVuYywgNDIyLCAyLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNF9mdW5jLCA0MjQsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDI2LCAxLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQyNywgMSwgMSB9LAotCXsgYWhjX3BhdGNoN19mdW5jLCA0MjgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMjQ5LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDI1MCwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMTFfZnVuYywgMjUxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDI1OSwgMjcsIDMgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMjc1LCAxMCwgMiB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgMjc4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCAyODYsIDE0LCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDMwMiwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAzMDMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMzA2LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAzMTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMzEyLCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDMxNCwgNCwgMSB9LAorCXsgYWhjX3BhdGNoMTRfZnVuYywgMzE4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCAzMjAsIDIsIDMgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMzIwLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDMyMSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCAzMjYsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzI3LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDMzMSwgNDcsIDExIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDMzOCwgMiwgNCB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAzMzgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgMzM5LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDM0MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTZfZnVuYywgMzQxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDM1NywgNiwgMyB9LAorCXsgYWhjX3BhdGNoMTZfZnVuYywgMzU3LCA1LCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDM2MywgNywgMSB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgMzczLCA1LCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDM3OCwgNTIsIDE3IH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCAzNzgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgMzgwLCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gxN19mdW5jLCAzODEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMzg0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOF9mdW5jLCAzOTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDM5NiwgOSwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzOTcsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDAwLCAzLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQwOCwgNiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0MTQsIDksIDIgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDQxNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgNDIzLCAyLCAxIH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCA0MjUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDI3LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQyOCwgMSwgMSB9LAogCXsgYWhjX3BhdGNoN19mdW5jLCA0MjksIDEsIDEgfSwKLQl7IGFoY19wYXRjaDhfZnVuYywgNDMwLCAzLCAzIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDQzMSwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0MzIsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDMzLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNV9mdW5jLCA0MzQsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDEzX2Z1bmMsIDQzNCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTRfZnVuYywgNDM2LCA5LCA0IH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDQzNiwgMSwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA0NDMsIDIsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDQ1LCA0LCAzIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ0NSwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0NDYsIDMsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgNDUwLCAyLCAxIH0sCi0JeyBhaGNfcGF0Y2g3X2Z1bmMsIDQ1MiwgMTAsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDYyLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g4X2Z1bmMsIDQ2MywgMTE4LCAyMiB9LAotCXsgYWhjX3BhdGNoMV9mdW5jLCA0NjUsIDMsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDY4LCA1LCAzIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ2OCwgMiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0NzAsIDMsIDEgfSwKLQl7IGFoY19wYXRjaDFfZnVuYywgNDc1LCAyLCAyIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ3NywgNiwgMyB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA0NzcsIDIsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDc5LCAzLCAxIH0sCi0JeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ4NSwgMiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA0ODcsIDksIDcgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNDg3LCA1LCA2IH0sCi0JeyBhaGNfcGF0Y2gxOV9mdW5jLCA0ODcsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDg4LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxOV9mdW5jLCA0OTAsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNDkxLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ5MiwgNCwgMSB9LAotCXsgYWhjX3BhdGNoNl9mdW5jLCA0OTcsIDMsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNTAwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g2X2Z1bmMsIDUxMCwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA1MTEsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDIwX2Z1bmMsIDU0OCwgNywgMSB9LAotCXsgYWhjX3BhdGNoM19mdW5jLCA1ODMsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNTg0LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gyMV9mdW5jLCA1ODcsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDhfZnVuYywgNTg5LCAxMDYsIDMzIH0sCi0JeyBhaGNfcGF0Y2g0X2Z1bmMsIDU5MSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMV9mdW5jLCA1OTcsIDIsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNTk5LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxX2Z1bmMsIDYwMiwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2MDMsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDlfZnVuYywgNjA0LCAzLCAzIH0sCi0JeyBhaGNfcGF0Y2gxNV9mdW5jLCA2MDUsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNjA3LCA0LCAxIH0sCi0JeyBhaGNfcGF0Y2gxOV9mdW5jLCA2MTYsIDIsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNjE4LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxOV9mdW5jLCA2MjIsIDEwLCAzIH0sCi0JeyBhaGNfcGF0Y2g1X2Z1bmMsIDYyNCwgOCwgMSB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2MzIsIDksIDIgfSwKLQl7IGFoY19wYXRjaDVfZnVuYywgNjMzLCA4LCAxIH0sCi0JeyBhaGNfcGF0Y2g0X2Z1bmMsIDY0MywgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2NDQsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDY0NSwgMSwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2NDYsIDMsIDIgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgNjQ4LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g1X2Z1bmMsIDY0OSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoNV9mdW5jLCA2NTIsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDVfZnVuYywgNjU0LCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g0X2Z1bmMsIDY1NiwgMiwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA2NTgsIDIsIDEgfSwKLQl7IGFoY19wYXRjaDVfZnVuYywgNjYwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g1X2Z1bmMsIDY2MywgMSwgMSB9LAotCXsgYWhjX3BhdGNoNV9mdW5jLCA2NjYsIDEsIDEgfSwKLQl7IGFoY19wYXRjaDE5X2Z1bmMsIDY3MCwgMSwgMSB9LAotCXsgYWhjX3BhdGNoMTlfZnVuYywgNjczLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g0X2Z1bmMsIDY3OSwgMSwgMSB9LAotCXsgYWhjX3BhdGNoNl9mdW5jLCA2ODIsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNjgzLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g3X2Z1bmMsIDY5NSwgMTYsIDEgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgNzExLCAyMCwgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA3MzIsIDQsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNzM2LCA0LCAxIH0sCi0JeyBhaGNfcGF0Y2g5X2Z1bmMsIDc0MCwgNCwgMiB9LAotCXsgYWhjX3BhdGNoMF9mdW5jLCA3NDQsIDMsIDEgfSwKLQl7IGFoY19wYXRjaDZfZnVuYywgNzUwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gyMl9mdW5jLCA3NTIsIDE0LCAxIH0sCi0JeyBhaGNfcGF0Y2g3X2Z1bmMsIDc2NiwgMywgMSB9LAotCXsgYWhjX3BhdGNoOV9mdW5jLCA3NzgsIDI0LCA4IH0sCi0JeyBhaGNfcGF0Y2gxOV9mdW5jLCA3ODIsIDEsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNzgzLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxNV9mdW5jLCA3ODgsIDQsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNzkyLCA3LCAzIH0sCi0JeyBhaGNfcGF0Y2gyM19mdW5jLCA3OTIsIDUsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgNzk3LCAyLCAxIH0sCi0JeyBhaGNfcGF0Y2gwX2Z1bmMsIDgwMiwgNDIsIDMgfSwKLQl7IGFoY19wYXRjaDE4X2Z1bmMsIDgxNCwgMTgsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgODMyLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2g0X2Z1bmMsIDg1NiwgMSwgMSB9LAotCXsgYWhjX3BhdGNoNF9mdW5jLCA4NTcsIDMsIDIgfSwKLQl7IGFoY19wYXRjaDBfZnVuYywgODYwLCAxLCAxIH0sCi0JeyBhaGNfcGF0Y2gxM19mdW5jLCA4NjEsIDMsIDEgfSwKLQl7IGFoY19wYXRjaDRfZnVuYywgODY0LCAxMiwgMSB9CisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDQzMCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCA0MzEsIDMsIDMgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgNDMyLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQzMywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MzQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE1X2Z1bmMsIDQzNSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgNDM1LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCA0MzcsIDksIDQgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDM3LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ0NCwgMiwgMSB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NDYsIDQsIDMgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDQ2LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ0NywgMywgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA0NTEsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgNDUzLCAxMCwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NjMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgNDY0LCAxMTgsIDIyIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ2NiwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NjksIDUsIDMgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDY5LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ3MSwgMywgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA0NzYsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDc4LCA2LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ3OCwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0ODAsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNDg2LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ4OCwgOSwgNyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0ODgsIDUsIDYgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDQ4OCwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0ODksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDQ5MSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0OTIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDkzLCA0LCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDQ5OCwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA1MDEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgNTExLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDUxMiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMjBfZnVuYywgNTQ5LCA3LCAxIH0sCisJeyBhaGNfcGF0Y2gzX2Z1bmMsIDU4NCwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA1ODUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDIxX2Z1bmMsIDU4OCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCA1OTAsIDEwNiwgMzMgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNTkyLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDU5OCwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MDAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNjAzLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDYwNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA2MDUsIDMsIDMgfSwKKwl7IGFoY19wYXRjaDE1X2Z1bmMsIDYwNiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MDgsIDQsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDYxNywgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MTksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDYyMywgMTAsIDMgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjI1LCA4LCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDYzMywgOSwgMiB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2MzQsIDgsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNjQ0LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDY0NSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNjQ2LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDY0NywgMywgMiB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA2NDksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjUwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY1MywgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NTUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNjU3LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDY1OSwgMiwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NjEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjY0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY2NywgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNjcxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2NzQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNjgwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDY4MywgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2ODQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgNjk2LCAxNiwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA3MTIsIDIwLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDczMywgNCwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA3MzcsIDQsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzQxLCA0LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDc0NSwgMywgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA3NTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDIyX2Z1bmMsIDc1MywgMTQsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgNzY3LCAzLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDc3OSwgMjQsIDggfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDc4MywgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA3ODQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE1X2Z1bmMsIDc4OSwgNCwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA3OTMsIDcsIDMgfSwKKwl7IGFoY19wYXRjaDIzX2Z1bmMsIDc5MywgNSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA3OTgsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODAzLCA0MiwgMyB9LAorCXsgYWhjX3BhdGNoMThfZnVuYywgODE1LCAxOCwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA4MzMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgODU3LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDg1OCwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA4NjEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDg2MiwgMywgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA4NjUsIDEyLCAxIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY3MgewpAQCAtMTI5NiwxMSArMTI5NywxMSBAQAogfSBjcml0aWNhbF9zZWN0aW9uc1tdID0gewogCXsgMTEsIDE4IH0sCiAJeyAyMSwgMzAgfSwKLQl7IDcxMSwgNzI3IH0sCi0JeyA4NTcsIDg2MCB9LAotCXsgODY0LCA4NzAgfSwKLQl7IDg3MiwgODc0IH0sCi0JeyA4NzQsIDg3NiB9CisJeyA3MTIsIDcyOCB9LAorCXsgODU4LCA4NjEgfSwKKwl7IDg2NSwgODcxIH0sCisJeyA4NzMsIDg3NSB9LAorCXsgODc1LCA4NzcgfQogfTsKIAogc3RhdGljIGNvbnN0IGludCBudW1fY3JpdGljYWxfc2VjdGlvbnMgPSBzaXplb2YoY3JpdGljYWxfc2VjdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCmluZGV4IDdjNWE2ZGIuLjgyOGFlM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCkBAIC0zMCwxMzgyICszMCw1IEBACiAgKiAkSWQkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0vKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgImFpY2xpYi5oIgotI2luY2x1ZGUgImNhbS5oIgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAgMAotI2VuZGlmIC8qIEZBTFNFICovCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgICAxCi0jZW5kaWYgLyogVFJVRSAqLwotI2lmbmRlZiBFUkVTVEFSVAotI2RlZmluZSBFUkVTVEFSVCAgICAgICAgLTEgICAgICAgICAgICAgIC8qIHJlc3RhcnQgc3lzY2FsbCAqLwotI2VuZGlmCi0jaWZuZGVmIEVKVVNUUkVUVVJOCi0jZGVmaW5lIEVKVVNUUkVUVVJOICAgICAtMiAgICAgICAgICAgICAgLyogZG9uJ3QgbW9kaWZ5IHJlZ3MsIGp1c3QgcmV0dXJuICovCi0jZW5kaWYKLQotc3RhdGljIGludAlhc2NlbnRyeWNvbXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpOwotc3RhdGljIGludAlzZW5zZWVudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcik7Ci1zdGF0aWMgdm9pZAlmZXRjaHRhYmxlZW50cmllcyhpbnQgc2Vuc2Vfa2V5LCBpbnQgYXNjLCBpbnQgYXNjcSwKLQkJCQkgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqLAotCQkJCSAgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKiopOwotc3RhdGljIHZvaWQgKglzY3NpYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwKLQkJCSAgICBzaXplX3Qgc2l6ZSwKLQkJCSAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci10eXBlZGVmIGludCAoY2FtX3F1aXJrbWF0Y2hfdCkoY2FkZHJfdCwgY2FkZHJfdCk7Ci1zdGF0aWMgaW50CWNhbV9zdHJtYXRjaChjb25zdCB1X2ludDhfdCAqc3RyLCBjb25zdCB1X2ludDhfdCAqcGF0dGVybiwKLQkJCSAgICAgaW50IHN0cl9sZW4pOwotc3RhdGljIGNhZGRyX3QJY2FtX3F1aXJrbWF0Y2goY2FkZHJfdCB0YXJnZXQsIGNhZGRyX3QgcXVpcmtfdGFibGUsCi0JCQkgICAgICAgaW50IG51bV9lbnRyaWVzLCBpbnQgZW50cnlfc2l6ZSwKLQkJCSAgICAgICBjYW1fcXVpcmttYXRjaF90ICpjb21wX2Z1bmMpOwotCi0jZGVmaW5lIFNDU0lfTk9fU0VOU0VfU1RSSU5HUyAxCi0jaWYgIWRlZmluZWQoU0NTSV9OT19TRU5TRV9TVFJJTkdTKQotI2RlZmluZSBTU1QoYXNjLCBhc2NxLCBhY3Rpb24sIGRlc2MpIFwKLQlhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYwotI2Vsc2UgCi1zdGF0aWMgY29uc3QgY2hhciBlbXB0eV9zdHJpbmdbXSA9ICIiOwotCi0jZGVmaW5lIFNTVChhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYykgXAotCWFzYywgYXNjcSwgYWN0aW9uLCBlbXB0eV9zdHJpbmcKLSNlbmRpZiAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgc2Vuc2Vfa2V5X3RhYmxlW10gPSAKLXsKLQl7IFNTRF9LRVlfTk9fU0VOU0UsIFNTX05PUCwgIk5PIFNFTlNFIiB9LAotCXsgU1NEX0tFWV9SRUNPVkVSRURfRVJST1IsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsICJSRUNPVkVSRUQgRVJST1IiIH0sCi0JewotCSAgU1NEX0tFWV9OT1RfUkVBRFksIFNTX1RVUnxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZLAotCSAgIk5PVCBSRUFEWSIKLQl9LAotCXsgU1NEX0tFWV9NRURJVU1fRVJST1IsIFNTX1JERUYsICJNRURJVU0gRVJST1IiIH0sCi0JeyBTU0RfS0VZX0hBUkRXQVJFX0VSUk9SLCBTU19SREVGLCAiSEFSRFdBUkUgRkFJTFVSRSIgfSwKLQl7IFNTRF9LRVlfSUxMRUdBTF9SRVFVRVNULCBTU19GQVRBTHxFSU5WQUwsICJJTExFR0FMIFJFUVVFU1QiIH0sCi0JeyBTU0RfS0VZX1VOSVRfQVRURU5USU9OLCBTU19GQVRBTHxFTlhJTywgIlVOSVQgQVRURU5USU9OIiB9LAotCXsgU1NEX0tFWV9EQVRBX1BST1RFQ1QsIFNTX0ZBVEFMfEVBQ0NFUywgIkRBVEEgUFJPVEVDVCIgfSwKLQl7IFNTRF9LRVlfQkxBTktfQ0hFQ0ssIFNTX0ZBVEFMfEVOT1NQQywgIkJMQU5LIENIRUNLIiB9LAotCXsgU1NEX0tFWV9WZW5kb3JfU3BlY2lmaWMsIFNTX0ZBVEFMfEVJTywgIlZlbmRvciBTcGVjaWZpYyIgfSwKLQl7IFNTRF9LRVlfQ09QWV9BQk9SVEVELCBTU19GQVRBTHxFSU8sICJDT1BZIEFCT1JURUQiIH0sCi0JeyBTU0RfS0VZX0FCT1JURURfQ09NTUFORCwgU1NfUkRFRiwgIkFCT1JURUQgQ09NTUFORCIgfSwKLQl7IFNTRF9LRVlfRVFVQUwsIFNTX05PUCwgIkVRVUFMIiB9LAotCXsgU1NEX0tFWV9WT0xVTUVfT1ZFUkZMT1csIFNTX0ZBVEFMfEVJTywgIlZPTFVNRSBPVkVSRkxPVyIgfSwKLQl7IFNTRF9LRVlfTUlTQ09NUEFSRSwgU1NfTk9QLCAiTUlTQ09NUEFSRSIgfSwKLQl7IFNTRF9LRVlfUkVTRVJWRUQsIFNTX0ZBVEFMfEVJTywgIlJFU0VSVkVEIiB9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50IHNlbnNlX2tleV90YWJsZV9zaXplID0KLSAgICBzaXplb2Yoc2Vuc2Vfa2V5X3RhYmxlKS9zaXplb2Yoc2Vuc2Vfa2V5X3RhYmxlWzBdKTsKLQotc3RhdGljIHN0cnVjdCBhc2NfdGFibGVfZW50cnkgcXVhbnR1bV9maXJlYmFsbF9lbnRyaWVzW10gPSB7Ci0Je1NTVCgweDA0LCAweDBiLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLCAKLQkgICAgICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY21kLiByZXF1aXJlZCIpfQotfTsKLQotc3RhdGljIHN0cnVjdCBhc2NfdGFibGVfZW50cnkgc29ueV9tb19lbnRyaWVzW10gPSB7Ci0Je1NTVCgweDA0LCAweDAwLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLAotCSAgICAgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGNhdXNlIG5vdCByZXBvcnRhYmxlIil9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgc2Vuc2VfcXVpcmtfdGFibGVbXSA9IHsKLQl7Ci0JCS8qCi0JCSAqIFRoZSBRdWFudHVtIEZpcmViYWxsIFNUIGFuZCBTRSBsaWtlIHRvIHJldHVybiAweDA0IDB4MGIgd2hlbgotCQkgKiB0aGV5IHJlYWxseSBzaG91bGQgcmV0dXJuIDB4MDQgMHgwMi4gIDB4MDQsMHgwYiBpc24ndAotCQkgKiBkZWZpbmVkIGluIGFueSBTQ1NJIHNwZWMsIGFuZCBpdCBpc24ndCBtZW50aW9uZWQgaW4gdGhlCi0JCSAqIGhhcmR3YXJlIG1hbnVhbCBmb3IgdGhlc2UgZHJpdmVzLgotCQkgKi8KLQkJe1RfRElSRUNULCBTSVBfTUVESUFfRklYRUQsICJRVUFOVFVNIiwgIkZJUkVCQUxMIFMqIiwgIioifSwKLQkJLypudW1fc2Vuc2Vfa2V5cyovMCwKLQkJc2l6ZW9mKHF1YW50dW1fZmlyZWJhbGxfZW50cmllcykvc2l6ZW9mKHN0cnVjdCBhc2NfdGFibGVfZW50cnkpLAotCQkvKnNlbnNlIGtleSBlbnRyaWVzKi9OVUxMLAotCQlxdWFudHVtX2ZpcmViYWxsX2VudHJpZXMKLQl9LAotCXsKLQkJLyoKLQkJICogVGhpcyBTb255IE1PIGRyaXZlIGxpa2VzIHRvIHJldHVybiAweDA0LCAweDAwIHdoZW4gaXQKLQkJICogaXNuJ3Qgc3B1biB1cC4KLQkJICovCi0JCXtUX0RJUkVDVCwgU0lQX01FRElBX1JFTU9WQUJMRSwgIlNPTlkiLCAiU01PLSoiLCAiKiJ9LAotCQkvKm51bV9zZW5zZV9rZXlzKi8wLAotCQlzaXplb2Yoc29ueV9tb19lbnRyaWVzKS9zaXplb2Yoc3RydWN0IGFzY190YWJsZV9lbnRyeSksCi0JCS8qc2Vuc2Uga2V5IGVudHJpZXMqL05VTEwsCi0JCXNvbnlfbW9fZW50cmllcwotCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgc2Vuc2VfcXVpcmtfdGFibGVfc2l6ZSA9Ci0gICAgc2l6ZW9mKHNlbnNlX3F1aXJrX3RhYmxlKS9zaXplb2Yoc2Vuc2VfcXVpcmtfdGFibGVbMF0pOwotCi1zdGF0aWMgc3RydWN0IGFzY190YWJsZV9lbnRyeSBhc2NfdGFibGVbXSA9IHsKLS8qCi0gKiBGcm9tIEZpbGU6IEFTQy1OVU0uVFhUCi0gKiBTQ1NJIEFTQy9BU0NRIEFzc2lnbm1lbnRzCi0gKiBOdW1lcmljIFNvcnRlZCBMaXN0aW5nCi0gKiBhcyBvZiAgNS8xMi85NwotICoKLSAqIEQgLSBESVJFQ1QgQUNDRVNTIERFVklDRSAoU0JDKSAgICAgICAgICAgICAgICAgICAgIGRldmljZSBjb2x1bW4ga2V5Ci0gKiAuVCAtIFNFUVVFTlRJQUwgQUNDRVNTIERFVklDRSAoU1NDKSAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC4gTCAtIFBSSU5URVIgREVWSUNFIChTU0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmsgPSByZXNlcnZlZAotICogLiAgUCAtIFBST0NFU1NPUiBERVZJQ0UgKFNQQykgICAgICAgICAgICAgICAgICAgICBub3QgYmxhbmsgPSBhbGxvd2VkCi0gKiAuICAuVyAtIFdSSVRFIE9OQ0UgUkVBRCBNVUxUSVBMRSBERVZJQ0UgKFNCQykKLSAqIC4gIC4gUiAtIENEIERFVklDRSAoTU1DKQotICogLiAgLiAgUyAtIFNDQU5ORVIgREVWSUNFIChTR0MpCi0gKiAuICAuICAuTyAtIE9QVElDQUwgTUVNT1JZIERFVklDRSAoU0JDKQotICogLiAgLiAgLiBNIC0gTUVESUEgQ0hBTkdFUiBERVZJQ0UgKFNNQykKLSAqIC4gIC4gIC4gIEMgLSBDT01NVU5JQ0FUSU9OIERFVklDRSAoU1NDKQotICogLiAgLiAgLiAgLkEgLSBTVE9SQUdFIEFSUkFZIERFVklDRSAoU0NDKQotICogLiAgLiAgLiAgLiBFIC0gRU5DTE9TVVJFIFNFUlZJQ0VTIERFVklDRSAoU0VTKQotICogRFRMUFdSU09NQ0FFICAgICAgICBBU0MgICBBU0NRICBBY3Rpb24gIERlc2NyaXB0aW9uCi0gKiAtLS0tLS0tLS0tLS0gICAgICAgIC0tLS0gIC0tLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDAwLCBTU19OT1AsCi0JCQkiTm8gYWRkaXRpb25hbCBzZW5zZSBpbmZvcm1hdGlvbiIpIH0sCi0vKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDEsIFNTX1JERUYsCi0JCQkiRmlsZW1hcmsgZGV0ZWN0ZWQiKSB9LAotLyogIFQgICAgUyAgICAgICove1NTVCgweDAwLCAweDAyLCBTU19SREVGLAotCQkJIkVuZC1vZi1wYXJ0aXRpb24vbWVkaXVtIGRldGVjdGVkIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMCwgMHgwMywgU1NfUkRFRiwKLQkJCSJTZXRtYXJrIGRldGVjdGVkIikgfSwKLS8qICBUICAgIFMgICAgICAqL3tTU1QoMHgwMCwgMHgwNCwgU1NfUkRFRiwKLQkJCSJCZWdpbm5pbmctb2YtcGFydGl0aW9uL21lZGl1bSBkZXRlY3RlZCIpIH0sCi0vKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDUsIFNTX1JERUYsCi0JCQkiRW5kLW9mLWRhdGEgZGV0ZWN0ZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDA2LCBTU19SREVGLAotCQkJIkkvTyBwcm9jZXNzIHRlcm1pbmF0ZWQiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDExLCBTU19GQVRBTHxFQlVTWSwKLQkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTIsIFNTX05PUCwKLQkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBwYXVzZWQiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDEzLCBTU19OT1AsCi0JCQkiQXVkaW8gcGxheSBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTQsIFNTX1JERUYsCi0JCQkiQXVkaW8gcGxheSBvcGVyYXRpb24gc3RvcHBlZCBkdWUgdG8gZXJyb3IiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDE1LCBTU19OT1AsCi0JCQkiTm8gY3VycmVudCBhdWRpbyBzdGF0dXMgdG8gcmV0dXJuIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwMCwgMHgxNiwgU1NfRkFUQUx8RUJVU1ksCi0JCQkiT3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKLS8qIERUTCBXUlNPTSBBRSAqL3tTU1QoMHgwMCwgMHgxNywgU1NfUkRFRiwKLQkJCSJDbGVhbmluZyByZXF1ZXN0ZWQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDAxLCAweDAwLCBTU19SREVGLAotCQkJIk5vIGluZGV4L3NlY3RvciBzaWduYWwiKSB9LAotLyogRCAgIFdSIE9NICAgICove1NTVCgweDAyLCAweDAwLCBTU19SREVGLAotCQkJIk5vIHNlZWsgY29tcGxldGUiKSB9LAotLyogRFRMIFcgU08gICAgICove1NTVCgweDAzLCAweDAwLCBTU19SREVGLAotCQkJIlBlcmlwaGVyYWwgZGV2aWNlIHdyaXRlIGZhdWx0IikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMywgMHgwMSwgU1NfUkRFRiwKLQkJCSJObyB3cml0ZSBjdXJyZW50IikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMywgMHgwMiwgU1NfUkRFRiwKLQkJCSJFeGNlc3NpdmUgd3JpdGUgZXJyb3JzIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMCwKLQkJCVNTX1RVUnxTU1FfREVMQVl8U1NRX01BTll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxFSU8sCi0JCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgY2F1c2Ugbm90IHJlcG9ydGFibGUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDA0LCAweDAxLAotCQkJU1NfVFVSfFNTUV9ERUxBWXxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZLAotCQkJIkxvZ2ljYWwgdW5pdCBpcyBpbiBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5IikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMiwgU1NfU1RBUlR8U1NRX0RFQ1JFTUVOVF9DT1VOVHxFTlhJTywKLQkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY21kLiByZXF1aXJlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MDQsIDB4MDMsIFNTX0ZBVEFMfEVOWElPLAotCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQiKX0sCi0vKiBEVEwgICAgTyAgICAgKi97U1NUKDB4MDQsIDB4MDQsIFNTX0ZBVEFMfEVCVVNZLAotCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGZvcm1hdCBpbiBwcm9ncmVzcyIpIH0sCi0vKiBEVCAgVyAgT01DQSAgKi97U1NUKDB4MDQsIDB4MDUsIFNTX0ZBVEFMfEVCVVNZLAotCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIHJlYnVpbGQgaW4gcHJvZ3Jlc3MiKSB9LAotLyogRFQgIFcgIE9NQ0EgICove1NTVCgweDA0LCAweDA2LCBTU19GQVRBTHxFQlVTWSwKLQkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCByZWNhbGN1bGF0aW9uIGluIHByb2dyZXNzIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwNywgU1NfRkFUQUx8RUJVU1ksCi0JCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgb3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwNCwgMHgwOCwgU1NfRkFUQUx8RUJVU1ksCi0JCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbG9uZyB3cml0ZSBpbiBwcm9ncmVzcyIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDUsIDB4MDAsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGRvZXMgbm90IHJlc3BvbmQgdG8gc2VsZWN0aW9uIikgfSwKLS8qIEQgICBXUiBPTSAgICAqL3tTU1QoMHgwNiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJObyByZWZlcmVuY2UgcG9zaXRpb24gZm91bmQiKSB9LAotLyogRFRMIFdSU09NICAgICove1NTVCgweDA3LCAweDAwLCBTU19SREVGLAotCQkJIk11bHRpcGxlIHBlcmlwaGVyYWwgZGV2aWNlcyBzZWxlY3RlZCIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDAsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gZmFpbHVyZSIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDEsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gdGltZS1vdXQiKSB9LAotLyogRFRMIFdSU09NQ0FFICove1NTVCgweDA4LCAweDAyLCBTU19SREVGLAotCQkJIkxvZ2ljYWwgdW5pdCBjb21tdW5pY2F0aW9uIHBhcml0eSBlcnJvciIpIH0sCi0vKiBEVCAgIFIgT00gICAgKi97U1NUKDB4MDgsIDB4MDMsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gY3JjIGVycm9yICh1bHRyYS1kbWEvMzIpIil9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDA5LCAweDAwLCBTU19SREVGLAotCQkJIlRyYWNrIGZvbGxvd2luZyBlcnJvciIpIH0sCi0vKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDEsIFNTX1JERUYsCi0JCQkiVHJhY2tpbmcgc2Vydm8gZmFpbHVyZSIpIH0sCi0vKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDIsIFNTX1JERUYsCi0JCQkiRm9jdXMgc2Vydm8gZmFpbHVyZSIpIH0sCi0vKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDMsIFNTX1JERUYsCi0JCQkiU3BpbmRsZSBzZXJ2byBmYWlsdXJlIikgfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgwOSwgMHgwNCwgU1NfUkRFRiwKLQkJCSJIZWFkIHNlbGVjdCBmYXVsdCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEEsIDB4MDAsIFNTX0ZBVEFMfEVOT1NQQywKLQkJCSJFcnJvciBsb2cgb3ZlcmZsb3ciKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDBCLCAweDAwLCBTU19SREVGLAotCQkJIldhcm5pbmciKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDBCLCAweDAxLCBTU19SREVGLAotCQkJIlNwZWNpZmllZCB0ZW1wZXJhdHVyZSBleGNlZWRlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEIsIDB4MDIsIFNTX1JERUYsCi0JCQkiRW5jbG9zdXJlIGRlZ3JhZGVkIikgfSwKLS8qICBUICAgUlMgICAgICAqL3tTU1QoMHgwQywgMHgwMCwgU1NfUkRFRiwKLQkJCSJXcml0ZSBlcnJvciIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiV3JpdGUgZXJyb3IgLSByZWNvdmVyZWQgd2l0aCBhdXRvIHJlYWxsb2NhdGlvbiIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDIsIFNTX1JERUYsCi0JCQkiV3JpdGUgZXJyb3IgLSBhdXRvIHJlYWxsb2NhdGlvbiBmYWlsZWQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDBDLCAweDAzLCBTU19SREVGLAotCQkJIldyaXRlIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDQsIFNTX1JERUYsCi0JCQkiQ29tcHJlc3Npb24gY2hlY2sgbWlzY29tcGFyZSBlcnJvciIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDUsIFNTX1JERUYsCi0JCQkiRGF0YSBleHBhbnNpb24gb2NjdXJyZWQgZHVyaW5nIGNvbXByZXNzaW9uIikgfSwKLS8qIERUICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwNiwgU1NfUkRFRiwKLQkJCSJCbG9jayBub3QgY29tcHJlc3NpYmxlIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwQywgMHgwNywgU1NfUkRFRiwKLQkJCSJXcml0ZSBlcnJvciAtIHJlY292ZXJ5IG5lZWRlZCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MEMsIDB4MDgsIFNTX1JERUYsCi0JCQkiV3JpdGUgZXJyb3IgLSByZWNvdmVyeSBmYWlsZWQiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDA5LCBTU19SREVGLAotCQkJIldyaXRlIGVycm9yIC0gbG9zcyBvZiBzdHJlYW1pbmciKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDBBLCBTU19SREVGLAotCQkJIldyaXRlIGVycm9yIC0gcGFkZGluZyBibG9ja3MgYWRkZWQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDEwLCAweDAwLCBTU19SREVGLAotCQkJIklEIENSQyBvciBFQ0MgZXJyb3IiKSB9LAotLyogRFQgIFdSU08gICAgICove1NTVCgweDExLCAweDAwLCBTU19SREVGLAotCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IiKSB9LAotLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAxLCBTU19SREVGLAotCQkJIlJlYWQgcmV0cmllcyBleGhhdXN0ZWQiKSB9LAotLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAyLCBTU19SREVGLAotCQkJIkVycm9yIHRvbyBsb25nIHRvIGNvcnJlY3QiKSB9LAotLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAzLCBTU19SREVGLAotCQkJIk11bHRpcGxlIHJlYWQgZXJyb3JzIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwNCwgU1NfUkRFRiwKLQkJCSJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gYXV0byByZWFsbG9jYXRlIGZhaWxlZCIpIH0sCi0vKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MTEsIDB4MDUsIFNTX1JERUYsCi0JCQkiTC1FQyB1bmNvcnJlY3RhYmxlIGVycm9yIikgfSwKLS8qICAgICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwNiwgU1NfUkRFRiwKLQkJCSJDSVJDIHVucmVjb3ZlcmVkIGVycm9yIikgfSwKLS8qICAgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwNywgU1NfUkRFRiwKLQkJCSJEYXRhIHJlLXN5bmNocm9uaXphdGlvbiBlcnJvciIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTEsIDB4MDgsIFNTX1JERUYsCi0JCQkiSW5jb21wbGV0ZSBibG9jayByZWFkIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgxMSwgMHgwOSwgU1NfUkRFRiwKLQkJCSJObyBnYXAgZm91bmQiKSB9LAotLyogRFQgICAgIE8gICAgICove1NTVCgweDExLCAweDBBLCBTU19SREVGLAotCQkJIk1pc2NvcnJlY3RlZCBlcnJvciIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTEsIDB4MEIsIFNTX1JERUYsCi0JCQkiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDExLCAweDBDLCBTU19SREVGLAotCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IgLSByZWNvbW1lbmQgcmV3cml0ZSB0aGUgZGF0YSIpfSwKLS8qIERUICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwRCwgU1NfUkRFRiwKLQkJCSJEZS1jb21wcmVzc2lvbiBDUkMgZXJyb3IiKSB9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDExLCAweDBFLCBTU19SREVGLAotCQkJIkNhbm5vdCBkZWNvbXByZXNzIHVzaW5nIGRlY2xhcmVkIGFsZ29yaXRobSIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MEYsIFNTX1JERUYsCi0JCQkiRXJyb3IgcmVhZGluZyBVUEMvRUFOIG51bWJlciIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MTAsIFNTX1JERUYsCi0JCQkiRXJyb3IgcmVhZGluZyBJU1JDIG51bWJlciIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MTEsIFNTX1JERUYsCi0JCQkiUmVhZCBlcnJvciAtIGxvc3Mgb2Ygc3RyZWFtaW5nIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBpZCBmaWVsZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTMsIDB4MDAsIFNTX1JERUYsCi0JCQkiQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCBmb3IgZGF0YSBmaWVsZCIpIH0sCi0vKiBEVEwgV1JTTyAgICAgKi97U1NUKDB4MTQsIDB4MDAsIFNTX1JERUYsCi0JCQkiUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTQsIDB4MDEsIFNTX1JERUYsCi0JCQkiUmVjb3JkIG5vdCBmb3VuZCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDIsIFNTX1JERUYsCi0JCQkiRmlsZW1hcmsgb3Igc2V0bWFyayBub3QgZm91bmQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDE0LCAweDAzLCBTU19SREVGLAotCQkJIkVuZC1vZi1kYXRhIG5vdCBmb3VuZCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDQsIFNTX1JERUYsCi0JCQkiQmxvY2sgc2VxdWVuY2UgZXJyb3IiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDE0LCAweDA1LCBTU19SREVGLAotCQkJIlJlY29yZCBub3QgZm91bmQgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50IikgfSwKLS8qIERUICBXICBPICAgICAqL3tTU1QoMHgxNCwgMHgwNiwgU1NfUkRFRiwKLQkJCSJSZWNvcmQgbm90IGZvdW5kIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIikgfSwKLS8qIERUTCBXUlNPTSAgICAqL3tTU1QoMHgxNSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJSYW5kb20gcG9zaXRpb25pbmcgZXJyb3IiKSB9LAotLyogRFRMIFdSU09NICAgICove1NTVCgweDE1LCAweDAxLCBTU19SREVGLAotCQkJIk1lY2hhbmljYWwgcG9zaXRpb25pbmcgZXJyb3IiKSB9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDE1LCAweDAyLCBTU19SREVGLAotCQkJIlBvc2l0aW9uaW5nIGVycm9yIGRldGVjdGVkIGJ5IHJlYWQgb2YgbWVkaXVtIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJEYXRhIHN5bmNocm9uaXphdGlvbiBtYXJrIGVycm9yIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJEYXRhIHN5bmMgZXJyb3IgLSBkYXRhIHJld3JpdHRlbiIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDIsIFNTX1JERUYsCi0JCQkiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE2LCAweDAzLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIkRhdGEgc3luYyBlcnJvciAtIGRhdGEgYXV0by1yZWFsbG9jYXRlZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDQsIFNTX1JERUYsCi0JCQkiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCi0vKiBEVCAgV1JTTyAgICAgKi97U1NUKDB4MTcsIDB4MDAsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBubyBlcnJvciBjb3JyZWN0aW9uIGFwcGxpZWQiKSB9LAotLyogRFQgIFdSU08gICAgICove1NTVCgweDE3LCAweDAxLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggcmV0cmllcyIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDIsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBwb3NpdGl2ZSBoZWFkIG9mZnNldCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDMsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBuZWdhdGl2ZSBoZWFkIG9mZnNldCIpIH0sCi0vKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDQsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCByZXRyaWVzIGFuZC9vciBDSVJDIGFwcGxpZWQiKSB9LAotLyogRCAgIFdSIE8gICAgICove1NTVCgweDE3LCAweDA1LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHVzaW5nIHByZXZpb3VzIHNlY3RvciBpZCIpIH0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTcsIDB4MDYsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE3LCAweDA3LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwOCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIHJlY29tbWVuZCByZXdyaXRlIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwOSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIGRhdGEgcmV3cml0dGVuIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxOCwgMHgwMCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnJlY3Rpb24gYXBwbGllZCIpIH0sCi0vKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBlcnJvciBjb3JyLiAmIHJldHJpZXMgYXBwbGllZCIpIH0sCi0vKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDIsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDE4LCAweDAzLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggQ0lSQyIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTgsIDB4MDQsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBMLUVDIikgfSwKLS8qIEQgICBXUiBPICAgICAqL3tTU1QoMHgxOCwgMHgwNSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKLQkJCSJSZWNvdmVyZWQgZGF0YSAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAotLyogRCAgIFdSIE8gICAgICove1NTVCgweDE4LCAweDA2LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDE4LCAweDA3LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggRUNDIC0gZGF0YSByZXdyaXR0ZW4iKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAwLCBTU19SREVGLAotCQkJIkRlZmVjdCBsaXN0IGVycm9yIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxOSwgMHgwMSwgU1NfUkRFRiwKLQkJCSJEZWZlY3QgbGlzdCBub3QgYXZhaWxhYmxlIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxOSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJEZWZlY3QgbGlzdCBlcnJvciBpbiBwcmltYXJ5IGxpc3QiKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAzLCBTU19SREVGLAotCQkJIkRlZmVjdCBsaXN0IGVycm9yIGluIGdyb3duIGxpc3QiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDFBLCAweDAwLCBTU19SREVGLAotCQkJIlBhcmFtZXRlciBsaXN0IGxlbmd0aCBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MUIsIDB4MDAsIFNTX1JERUYsCi0JCQkiU3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBlcnJvciIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUMsIDB4MDAsIFNTX1JERUYsCi0JCQkiRGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxQywgMHgwMSwgU1NfUkRFRiwKLQkJCSJQcmltYXJ5IGRlZmVjdCBsaXN0IG5vdCBmb3VuZCIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUMsIDB4MDIsIFNTX1JERUYsCi0JCQkiR3Jvd24gZGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKLS8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxRCwgMHgwMCwgU1NfRkFUQUwsCi0JCQkiTWlzY29tcGFyZSBkdXJpbmcgdmVyaWZ5IG9wZXJhdGlvbiIgKX0sCi0vKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MUUsIDB4MDAsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCi0JCQkiUmVjb3ZlcmVkIGlkIHdpdGggZWNjIGNvcnJlY3Rpb24iKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDFGLCAweDAwLCBTU19SREVGLAotCQkJIlBhcnRpYWwgZGVmZWN0IGxpc3QgdHJhbnNmZXIiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDIwLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgyMSwgMHgwMCwgU1NfRkFUQUx8RUlOVkFMLAotCQkJIkxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UiICl9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDIxLCAweDAxLCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiSW52YWxpZCBlbGVtZW50IGFkZHJlc3MiKSB9LAotLyogRCAgICAgICAgICAgICove1NTVCgweDIyLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiSWxsZWdhbCBmdW5jdGlvbiIpIH0sIC8qIERlcHJlY2F0ZWQuIFVzZSAyMCAwMCwgMjQgMDAsIG9yIDI2IDAwIGluc3RlYWQgKi8KLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNCwgMHgwMCwgU1NfRkFUQUx8RUlOVkFMLAotCQkJIkludmFsaWQgZmllbGQgaW4gQ0RCIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNSwgMHgwMCwgU1NfRkFUQUx8RU5YSU8sCi0JCQkiTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI2LCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCi0JCQkiSW52YWxpZCBmaWVsZCBpbiBwYXJhbWV0ZXIgbGlzdCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDEsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJQYXJhbWV0ZXIgbm90IHN1cHBvcnRlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDIsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJQYXJhbWV0ZXIgdmFsdWUgaW52YWxpZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDMsIFNTX0ZBVEFMfEVJTlZBTCwKLQkJCSJUaHJlc2hvbGQgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNiwgMHgwNCwgU1NfRkFUQUx8RUlOVkFMLAotCQkJIkludmFsaWQgcmVsZWFzZSBvZiBhY3RpdmUgcGVyc2lzdGVudCByZXNlcnZhdGlvbiIpIH0sCi0vKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MjcsIDB4MDAsIFNTX0ZBVEFMfEVBQ0NFUywKLQkJCSJXcml0ZSBwcm90ZWN0ZWQiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDI3LCAweDAxLCBTU19GQVRBTHxFQUNDRVMsCi0JCQkiSGFyZHdhcmUgd3JpdGUgcHJvdGVjdGVkIikgfSwKLS8qIERUICBXICBPICAgICAqL3tTU1QoMHgyNywgMHgwMiwgU1NfRkFUQUx8RUFDQ0VTLAotCQkJIkxvZ2ljYWwgdW5pdCBzb2Z0d2FyZSB3cml0ZSBwcm90ZWN0ZWQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDI3LCAweDAzLCBTU19GQVRBTHxFQUNDRVMsCi0JCQkiQXNzb2NpYXRlZCB3cml0ZSBwcm90ZWN0IikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgyNywgMHgwNCwgU1NfRkFUQUx8RUFDQ0VTLAotCQkJIlBlcnNpc3RlbnQgd3JpdGUgcHJvdGVjdCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4MjcsIDB4MDUsIFNTX0ZBVEFMfEVBQ0NFUywKLQkJCSJQZXJtYW5lbnQgd3JpdGUgcHJvdGVjdCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjgsIDB4MDAsIFNTX1JERUYsCi0JCQkiTm90IHJlYWR5IHRvIHJlYWR5IGNoYW5nZSwgbWVkaXVtIG1heSBoYXZlIGNoYW5nZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI4LCAweDAxLCBTU19GQVRBTHxFTlhJTywKLQkJCSJJbXBvcnQgb3IgZXhwb3J0IGVsZW1lbnQgYWNjZXNzZWQiKSB9LAotLyoKLSAqIFhYWCBKR2liYnMgLSBBbGwgb2YgdGhlc2Ugc2hvdWxkIHVzZSB0aGUgc2FtZSBlcnJubywgYnV0IEkgZG9uJ3QgdGhpbmsKLSAqIEVOWElPIGlzIHRoZSBjb3JyZWN0IGNob2ljZS4gIFNob3VsZCB3ZSBib3Jyb3cgZnJvbSB0aGUgbmV0d29ya2luZwotICogZXJybm9zPyAgRUNPTk5SRVNFVCBhbnlvbmU/Ci0gKi8KLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJQb3dlciBvbiwgcmVzZXQsIG9yIGJ1cyBkZXZpY2UgcmVzZXQgb2NjdXJyZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDAxLCBTU19SREVGLAotCQkJIlBvd2VyIG9uIG9jY3VycmVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJTY3NpIGJ1cyByZXNldCBvY2N1cnJlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDMsIFNTX1JERUYsCi0JCQkiQnVzIGRldmljZSByZXNldCBmdW5jdGlvbiBvY2N1cnJlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDQsIFNTX1JERUYsCi0JCQkiRGV2aWNlIGludGVybmFsIHJlc2V0IikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNSwgU1NfUkRFRiwKLQkJCSJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gc2luZ2xlLWVuZGVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNiwgU1NfUkRFRiwKLQkJCSJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gTFZEIikgfSwKLS8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJQYXJhbWV0ZXJzIGNoYW5nZWQiKSB9LAotLyogRFRMIFdSU09NQ0FFICove1NTVCgweDJBLCAweDAxLCBTU19SREVGLAotCQkJIk1vZGUgcGFyYW1ldGVycyBjaGFuZ2VkIikgfSwKLS8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJMb2cgcGFyYW1ldGVycyBjaGFuZ2VkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMywgU1NfUkRFRiwKLQkJCSJSZXNlcnZhdGlvbnMgcHJlZW1wdGVkIikgfSwKLS8qIERUTFBXUlNPIEMgICAqL3tTU1QoMHgyQiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJDb3B5IGNhbm5vdCBleGVjdXRlIHNpbmNlIGhvc3QgY2Fubm90IGRpc2Nvbm5lY3QiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDJDLCAweDAwLCBTU19SREVGLAotCQkJIkNvbW1hbmQgc2VxdWVuY2UgZXJyb3IiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDJDLCAweDAxLCBTU19SREVGLAotCQkJIlRvbyBtYW55IHdpbmRvd3Mgc3BlY2lmaWVkIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHgyQywgMHgwMiwgU1NfUkRFRiwKLQkJCSJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHdpbmRvd3Mgc3BlY2lmaWVkIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHgyQywgMHgwMywgU1NfUkRFRiwKLQkJCSJDdXJyZW50IHByb2dyYW0gYXJlYSBpcyBub3QgZW1wdHkiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDJDLCAweDA0LCBTU19SREVGLAotCQkJIkN1cnJlbnQgcHJvZ3JhbSBhcmVhIGlzIGVtcHR5IikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgyRCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJPdmVyd3JpdGUgZXJyb3Igb24gdXBkYXRlIGluIHBsYWNlIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyRiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJDb21tYW5kcyBjbGVhcmVkIGJ5IGFub3RoZXIgaW5pdGlhdG9yIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzMCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJJbmNvbXBhdGlibGUgbWVkaXVtIGluc3RhbGxlZCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDEsIFNTX1JERUYsCi0JCQkiQ2Fubm90IHJlYWQgbWVkaXVtIC0gdW5rbm93biBmb3JtYXQiKSB9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDMwLCAweDAyLCBTU19SREVGLAotCQkJIkNhbm5vdCByZWFkIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiKSB9LAotLyogRFQgICAgICAgICAgICove1NTVCgweDMwLCAweDAzLCBTU19SREVGLAotCQkJIkNsZWFuaW5nIGNhcnRyaWRnZSBpbnN0YWxsZWQiKSB9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDMwLCAweDA0LCBTU19SREVGLAotCQkJIkNhbm5vdCB3cml0ZSBtZWRpdW0gLSB1bmtub3duIGZvcm1hdCIpIH0sCi0vKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDUsIFNTX1JERUYsCi0JCQkiQ2Fubm90IHdyaXRlIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDMwLCAweDA2LCBTU19SREVGLAotCQkJIkNhbm5vdCBmb3JtYXQgbWVkaXVtIC0gaW5jb21wYXRpYmxlIG1lZGl1bSIpIH0sCi0vKiBEVEwgV1JTT00gQUUgKi97U1NUKDB4MzAsIDB4MDcsIFNTX1JERUYsCi0JCQkiQ2xlYW5pbmcgZmFpbHVyZSIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MzAsIDB4MDgsIFNTX1JERUYsCi0JCQkiQ2Fubm90IHdyaXRlIC0gYXBwbGljYXRpb24gY29kZSBtaXNtYXRjaCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4MzAsIDB4MDksIFNTX1JERUYsCi0JCQkiQ3VycmVudCBzZXNzaW9uIG5vdCBmaXhhdGVkIGZvciBhcHBlbmQiKSB9LAotLyogRFQgIFdSIE8gICAgICove1NTVCgweDMxLCAweDAwLCBTU19SREVGLAotCQkJIk1lZGl1bSBmb3JtYXQgY29ycnVwdGVkIikgfSwKLS8qIEQgTCAgUiBPICAgICAqL3tTU1QoMHgzMSwgMHgwMSwgU1NfUkRFRiwKLQkJCSJGb3JtYXQgY29tbWFuZCBmYWlsZWQiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDMyLCAweDAwLCBTU19SREVGLAotCQkJIk5vIGRlZmVjdCBzcGFyZSBsb2NhdGlvbiBhdmFpbGFibGUiKSB9LAotLyogRCAgIFcgIE8gICAgICove1NTVCgweDMyLCAweDAxLCBTU19SREVGLAotCQkJIkRlZmVjdCBsaXN0IHVwZGF0ZSBmYWlsdXJlIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgzMywgMHgwMCwgU1NfUkRFRiwKLQkJCSJUYXBlIGxlbmd0aCBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzQsIDB4MDAsIFNTX1JERUYsCi0JCQkiRW5jbG9zdXJlIGZhaWx1cmUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAwLCBTU19SREVGLAotCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyBmYWlsdXJlIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzNSwgMHgwMSwgU1NfUkRFRiwKLQkJCSJVbnN1cHBvcnRlZCBlbmNsb3N1cmUgZnVuY3Rpb24iKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAyLCBTU19SREVGLAotCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyB1bmF2YWlsYWJsZSIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzUsIDB4MDMsIFNTX1JERUYsCi0JCQkiRW5jbG9zdXJlIHNlcnZpY2VzIHRyYW5zZmVyIGZhaWx1cmUiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDA0LCBTU19SREVGLAotCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyB0cmFuc2ZlciByZWZ1c2VkIikgfSwKLS8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzNiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJSaWJib24sIGluaywgb3IgdG9uZXIgZmFpbHVyZSIpIH0sCi0vKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MzcsIDB4MDAsIFNTX1JERUYsCi0JCQkiUm91bmRlZCBwYXJhbWV0ZXIiKSB9LAotLyogRFRMIFdSU09NQ0FFICove1NTVCgweDM5LCAweDAwLCBTU19SREVGLAotCQkJIlNhdmluZyBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQiKSB9LAotLyogRFRMIFdSU09NICAgICove1NTVCgweDNBLCAweDAwLCBTU19OT1AsCi0JCQkiTWVkaXVtIG5vdCBwcmVzZW50IikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMSwgU1NfTk9QLAotCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgY2xvc2VkIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMSwgU1NfTk9QLAotCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgb3BlbiIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4MDMsIFNTX05PUCwKLQkJCSJNZWRpdW0gbm90IHByZXNlbnQgLSBMb2FkYWJsZSIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4MDQsIFNTX05PUCwKLQkJCSJNZWRpdW0gbm90IHByZXNlbnQgLSBtZWRpdW0gYXV4aWxpYXJ5ICIKLQkJCSJtZW1vcnkgYWNjZXNzaWJsZSIpIH0sCi0vKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4RkYsIFNTX05PUCwgTlVMTCkgfSwvKiBSYW5nZSAweDA1LT4weEZGICovCi0vKiAgVEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDAsIFNTX1JERUYsCi0JCQkiU2VxdWVudGlhbCBwb3NpdGlvbmluZyBlcnJvciIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDEsIFNTX1JERUYsCi0JCQkiVGFwZSBwb3NpdGlvbiBlcnJvciBhdCBiZWdpbm5pbmctb2YtbWVkaXVtIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwMiwgU1NfUkRFRiwKLQkJCSJUYXBlIHBvc2l0aW9uIGVycm9yIGF0IGVuZC1vZi1tZWRpdW0iKSB9LAotLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDAzLCBTU19SREVGLAotCQkJIlRhcGUgb3IgZWxlY3Ryb25pYyB2ZXJ0aWNhbCBmb3JtcyB1bml0IG5vdCByZWFkeSIpIH0sCi0vKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDQsIFNTX1JERUYsCi0JCQkiU2xldyBmYWlsdXJlIikgfSwKLS8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwNSwgU1NfUkRFRiwKLQkJCSJQYXBlciBqYW0iKSB9LAotLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDA2LCBTU19SREVGLAotCQkJIkZhaWxlZCB0byBzZW5zZSB0b3Atb2YtZm9ybSIpIH0sCi0vKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDcsIFNTX1JERUYsCi0JCQkiRmFpbGVkIHRvIHNlbnNlIGJvdHRvbS1vZi1mb3JtIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwOCwgU1NfUkRFRiwKLQkJCSJSZXBvc2l0aW9uIGVycm9yIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHgzQiwgMHgwOSwgU1NfUkRFRiwKLQkJCSJSZWFkIHBhc3QgZW5kIG9mIG1lZGl1bSIpIH0sCi0vKiAgICAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEEsIFNTX1JERUYsCi0JCQkiUmVhZCBwYXN0IGJlZ2lubmluZyBvZiBtZWRpdW0iKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDNCLCAweDBCLCBTU19SREVGLAotCQkJIlBvc2l0aW9uIHBhc3QgZW5kIG9mIG1lZGl1bSIpIH0sCi0vKiAgVCAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEMsIFNTX1JERUYsCi0JCQkiUG9zaXRpb24gcGFzdCBiZWdpbm5pbmcgb2YgbWVkaXVtIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgwRCwgU1NfRkFUQUx8RU5PU1BDLAotCQkJIk1lZGl1bSBkZXN0aW5hdGlvbiBlbGVtZW50IGZ1bGwiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDBFLCBTU19SREVGLAotCQkJIk1lZGl1bSBzb3VyY2UgZWxlbWVudCBlbXB0eSIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4M0IsIDB4MEYsIFNTX1JERUYsCi0JCQkiRW5kIG9mIG1lZGl1bSByZWFjaGVkIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgxMSwgU1NfUkRFRiwKLQkJCSJNZWRpdW0gbWFnYXppbmUgbm90IGFjY2Vzc2libGUiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDEyLCBTU19SREVGLAotCQkJIk1lZGl1bSBtYWdhemluZSByZW1vdmVkIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgxMywgU1NfUkRFRiwKLQkJCSJNZWRpdW0gbWFnYXppbmUgaW5zZXJ0ZWQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDE0LCBTU19SREVGLAotCQkJIk1lZGl1bSBtYWdhemluZSBsb2NrZWQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDE1LCBTU19SREVGLAotCQkJIk1lZGl1bSBtYWdhemluZSB1bmxvY2tlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0QsIDB4MDAsIFNTX1JERUYsCi0JCQkiSW52YWxpZCBiaXRzIGluIGlkZW50aWZ5IG1lc3NhZ2UiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAwLCBTU19SREVGLAotCQkJIkxvZ2ljYWwgdW5pdCBoYXMgbm90IHNlbGYtY29uZmlndXJlZCB5ZXQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAxLCBTU19SREVGLAotCQkJIkxvZ2ljYWwgdW5pdCBmYWlsdXJlIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRSwgMHgwMiwgU1NfUkRFRiwKLQkJCSJUaW1lb3V0IG9uIGxvZ2ljYWwgdW5pdCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDAsIFNTX1JERUYsCi0JCQkiVGFyZ2V0IG9wZXJhdGluZyBjb25kaXRpb25zIGhhdmUgY2hhbmdlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDEsIFNTX1JERUYsCi0JCQkiTWljcm9jb2RlIGhhcyBiZWVuIGNoYW5nZWQiKSB9LAotLyogRFRMUFdSU09NQyAgICove1NTVCgweDNGLCAweDAyLCBTU19SREVGLAotCQkJIkNoYW5nZWQgb3BlcmF0aW5nIGRlZmluaXRpb24iKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNGLCAweDAzLCBTU19JTlFfUkVGUkVTSHxTU1FfREVDUkVNRU5UX0NPVU5ULAotCQkJIklucXVpcnkgZGF0YSBoYXMgY2hhbmdlZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDQsIFNTX1JERUYsCi0JCQkiQ29tcG9uZW50IGRldmljZSBhdHRhY2hlZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDUsIFNTX1JERUYsCi0JCQkiRGV2aWNlIGlkZW50aWZpZXIgY2hhbmdlZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDYsIFNTX1JERUYsCi0JCQkiUmVkdW5kYW5jeSBncm91cCBjcmVhdGVkIG9yIG1vZGlmaWVkIikgfSwKLS8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwNywgU1NfUkRFRiwKLQkJCSJSZWR1bmRhbmN5IGdyb3VwIGRlbGV0ZWQiKSB9LAotLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA4LCBTU19SREVGLAotCQkJIlNwYXJlIGNyZWF0ZWQgb3IgbW9kaWZpZWQiKSB9LAotLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA5LCBTU19SREVGLAotCQkJIlNwYXJlIGRlbGV0ZWQiKSB9LAotLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBBLCBTU19SREVGLAotCQkJIlZvbHVtZSBzZXQgY3JlYXRlZCBvciBtb2RpZmllZCIpIH0sCi0vKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MEIsIFNTX1JERUYsCi0JCQkiVm9sdW1lIHNldCBkZWxldGVkIikgfSwKLS8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwQywgU1NfUkRFRiwKLQkJCSJWb2x1bWUgc2V0IGRlYXNzaWduZWQiKSB9LAotLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBELCBTU19SREVGLAotCQkJIlZvbHVtZSBzZXQgcmVhc3NpZ25lZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MEUsIFNTX1JERUYsCi0JCQkiUmVwb3J0ZWQgbHVucyBkYXRhIGhhcyBjaGFuZ2VkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRiwgMHgwRiwgU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVAotCQkJCSB8IFNTUV9ERUxBWV9SQU5ET018RUJVU1ksCi0JCQkiRWNobyBidWZmZXIgb3ZlcndyaXR0ZW4iKSB9LAotLyogRFQgIFdSIE9NICAgQiove1NTVCgweDNGLCAweDBGLCBTU19SREVGLCAiTWVkaXVtIExvYWRhYmxlIikgfSwKLS8qIERUICBXUiBPTSAgIEIqL3tTU1QoMHgzRiwgMHgwRiwgU1NfUkRFRiwKLQkJCSJNZWRpdW0gYXV4aWxpYXJ5IG1lbW9yeSBhY2Nlc3NpYmxlIikgfSwKLS8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJSYW0gZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLwotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQwLCAweDgwLCBTU19SREVGLAotCQkJIkRpYWdub3N0aWMgZmFpbHVyZTogQVNDUSA9IENvbXBvbmVudCBJRCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDAsIDB4RkYsIFNTX1JERUZ8U1NRX1JBTkdFLAotCQkJTlVMTCkgfSwvKiBSYW5nZSAweDgwLT4weEZGICovCi0vKiBEICAgICAgICAgICAgKi97U1NUKDB4NDEsIDB4MDAsIFNTX1JERUYsCi0JCQkiRGF0YSBwYXRoIGZhaWx1cmUiKSB9LCAvKiBkZXByZWNhdGVkIC0gdXNlIDQwIE5OIGluc3RlYWQgKi8KLS8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJQb3dlci1vbiBvciBzZWxmLXRlc3QgZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLwotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQzLCAweDAwLCBTU19SREVGLAotCQkJIk1lc3NhZ2UgZXJyb3IiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ0LCAweDAwLCBTU19SREVGLAotCQkJIkludGVybmFsIHRhcmdldCBmYWlsdXJlIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJTZWxlY3Qgb3IgcmVzZWxlY3QgZmFpbHVyZSIpIH0sCi0vKiBEVExQV1JTT01DICAgKi97U1NUKDB4NDYsIDB4MDAsIFNTX1JERUYsCi0JCQkiVW5zdWNjZXNzZnVsIHNvZnQgcmVzZXQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAwLCBTU19SREVGfFNTUV9GQUxMQkFDSywKLQkJCSJTQ1NJIHBhcml0eSBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDcsIDB4MDEsIFNTX1JERUZ8U1NRX0ZBTExCQUNLLAotCQkJIkRhdGEgUGhhc2UgQ1JDIGVycm9yIGRldGVjdGVkIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwMiwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCi0JCQkiU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIFNUIGRhdGEgcGhhc2UiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAzLCBTU19SREVGfFNTUV9GQUxMQkFDSywKLQkJCSJJbmZvcm1hdGlvbiBVbml0IGl1Q1JDIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwNCwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCi0JCQkiQXN5bmNocm9ub3VzIGluZm9ybWF0aW9uIHByb3RlY3Rpb24gZXJyb3IgZGV0ZWN0ZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDA1LCBTU19SREVGfFNTUV9GQUxMQkFDSywKLQkJCSJQcm90b2NvbCBzZXJ2ZXIgQ1JDIGVycm9yIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0OCwgMHgwMCwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCi0JCQkiSW5pdGlhdG9yIGRldGVjdGVkIGVycm9yIG1lc3NhZ2UgcmVjZWl2ZWQiKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ5LCAweDAwLCBTU19SREVGLAotCQkJIkludmFsaWQgbWVzc2FnZSBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEEsIDB4MDAsIFNTX1JERUYsCi0JCQkiQ29tbWFuZCBwaGFzZSBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEIsIDB4MDAsIFNTX1JERUYsCi0JCQkiRGF0YSBwaGFzZSBlcnJvciIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEMsIDB4MDAsIFNTX1JERUYsCi0JCQkiTG9naWNhbCB1bml0IGZhaWxlZCBzZWxmLWNvbmZpZ3VyYXRpb24iKSB9LAotLyogRFRMUFdSU09NQ0FFICove1NTVCgweDRELCAweDAwLCBTU19SREVGLAotCQkJIlRhZ2dlZCBvdmVybGFwcGVkIGNvbW1hbmRzOiBBU0NRID0gUXVldWUgdGFnIElEIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0RCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCi0JCQlOVUxMKX0sIC8qIFJhbmdlIDB4MDAtPjB4RkYgKi8KLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0RSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJPdmVybGFwcGVkIGNvbW1hbmRzIGF0dGVtcHRlZCIpIH0sCi0vKiAgVCAgICAgICAgICAgKi97U1NUKDB4NTAsIDB4MDAsIFNTX1JERUYsCi0JCQkiV3JpdGUgYXBwZW5kIGVycm9yIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MCwgMHgwMSwgU1NfUkRFRiwKLQkJCSJXcml0ZSBhcHBlbmQgcG9zaXRpb24gZXJyb3IiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDUwLCAweDAyLCBTU19SREVGLAotCQkJIlBvc2l0aW9uIGVycm9yIHJlbGF0ZWQgdG8gdGltaW5nIikgfSwKLS8qICBUICAgICBPICAgICAqL3tTU1QoMHg1MSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJFcmFzZSBmYWlsdXJlIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJDYXJ0cmlkZ2UgZmF1bHQiKSB9LAotLyogRFRMIFdSU09NICAgICove1NTVCgweDUzLCAweDAwLCBTU19SREVGLAotCQkJIk1lZGlhIGxvYWQgb3IgZWplY3QgZmFpbGVkIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MywgMHgwMSwgU1NfUkRFRiwKLQkJCSJVbmxvYWQgdGFwZSBmYWlsdXJlIikgfSwKLS8qIERUICBXUiBPTSAgICAqL3tTU1QoMHg1MywgMHgwMiwgU1NfUkRFRiwKLQkJCSJNZWRpdW0gcmVtb3ZhbCBwcmV2ZW50ZWQiKSB9LAotLyogICAgUCAgICAgICAgICove1NTVCgweDU0LCAweDAwLCBTU19SREVGLAotCQkJIlNjc2kgdG8gaG9zdCBzeXN0ZW0gaW50ZXJmYWNlIGZhaWx1cmUiKSB9LAotLyogICAgUCAgICAgICAgICove1NTVCgweDU1LCAweDAwLCBTU19SREVGLAotCQkJIlN5c3RlbSByZXNvdXJjZSBmYWlsdXJlIikgfSwKLS8qIEQgICAgICBPICAgICAqL3tTU1QoMHg1NSwgMHgwMSwgU1NfRkFUQUx8RU5PU1BDLAotCQkJIlN5c3RlbSBidWZmZXIgZnVsbCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NTcsIDB4MDAsIFNTX1JERUYsCi0JCQkiVW5hYmxlIHRvIHJlY292ZXIgdGFibGUtb2YtY29udGVudHMiKSB9LAotLyogICAgICAgIE8gICAgICove1NTVCgweDU4LCAweDAwLCBTU19SREVGLAotCQkJIkdlbmVyYXRpb24gZG9lcyBub3QgZXhpc3QiKSB9LAotLyogICAgICAgIE8gICAgICove1NTVCgweDU5LCAweDAwLCBTU19SREVGLAotCQkJIlVwZGF0ZWQgYmxvY2sgcmVhZCIpIH0sCi0vKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUEsIDB4MDAsIFNTX1JERUYsCi0JCQkiT3BlcmF0b3IgcmVxdWVzdCBvciBzdGF0ZSBjaGFuZ2UgaW5wdXQiKSB9LAotLyogRFQgIFdSIE9NICAgICove1NTVCgweDVBLCAweDAxLCBTU19SREVGLAotCQkJIk9wZXJhdG9yIG1lZGl1bSByZW1vdmFsIHJlcXVlc3QiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDVBLCAweDAyLCBTU19SREVGLAotCQkJIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHByb3RlY3QiKSB9LAotLyogRFQgIFcgIE8gICAgICove1NTVCgweDVBLCAweDAzLCBTU19SREVGLAotCQkJIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHBlcm1pdCIpIH0sCi0vKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDAsIFNTX1JERUYsCi0JCQkiTG9nIGV4Y2VwdGlvbiIpIH0sCi0vKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDEsIFNTX1JERUYsCi0JCQkiVGhyZXNob2xkIGNvbmRpdGlvbiBtZXQiKSB9LAotLyogRFRMUFdSU09NICAgICove1NTVCgweDVCLCAweDAyLCBTU19SREVGLAotCQkJIkxvZyBjb3VudGVyIGF0IG1heGltdW0iKSB9LAotLyogRFRMUFdSU09NICAgICove1NTVCgweDVCLCAweDAzLCBTU19SREVGLAotCQkJIkxvZyBsaXN0IGNvZGVzIGV4aGF1c3RlZCIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDAsIFNTX1JERUYsCi0JCQkiUlBMIHN0YXR1cyBjaGFuZ2UiKSB9LAotLyogRCAgICAgIE8gICAgICove1NTVCgweDVDLCAweDAxLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAotCQkJIlNwaW5kbGVzIHN5bmNocm9uaXplZCIpIH0sCi0vKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDIsIFNTX1JERUYsCi0JCQkiU3BpbmRsZXMgbm90IHN5bmNocm9uaXplZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NUQsIDB4MDAsIFNTX1JERUYsCi0JCQkiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCIpIH0sCi0vKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NUQsIDB4RkYsIFNTX1JERUYsCi0JCQkiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCAoZmFsc2UpIikgfSwKLS8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJMb3cgcG93ZXIgY29uZGl0aW9uIG9uIikgfSwKLS8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMSwgU1NfUkRFRiwKLQkJCSJJZGxlIGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgdGltZXIiKSB9LAotLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDAyLCBTU19SREVGLAotCQkJIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSB0aW1lciIpIH0sCi0vKiBEVExQV1JTTyBDQSAgKi97U1NUKDB4NUUsIDB4MDMsIFNTX1JERUYsCi0JCQkiSWRsZSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IGNvbW1hbmQiKSB9LAotLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDA0LCBTU19SREVGLAotCQkJIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSBjb21tYW5kIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJMYW1wIGZhaWx1cmUiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDYxLCAweDAwLCBTU19SREVGLAotCQkJIlZpZGVvIGFjcXVpc2l0aW9uIGVycm9yIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MSwgMHgwMSwgU1NfUkRFRiwKLQkJCSJVbmFibGUgdG8gYWNxdWlyZSB2aWRlbyIpIH0sCi0vKiAgICAgICBTICAgICAgKi97U1NUKDB4NjEsIDB4MDIsIFNTX1JERUYsCi0JCQkiT3V0IG9mIGZvY3VzIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJTY2FuIGhlYWQgcG9zaXRpb25pbmcgZXJyb3IiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDYzLCAweDAwLCBTU19SREVGLAotCQkJIkVuZCBvZiB1c2VyIGFyZWEgZW5jb3VudGVyZWQgb24gdGhpcyB0cmFjayIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjMsIDB4MDEsIFNTX0ZBVEFMfEVOT1NQQywKLQkJCSJQYWNrZXQgZG9lcyBub3QgZml0IGluIGF2YWlsYWJsZSBzcGFjZSIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjQsIDB4MDAsIFNTX1JERUYsCi0JCQkiSWxsZWdhbCBtb2RlIGZvciB0aGlzIHRyYWNrIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg2NCwgMHgwMSwgU1NfUkRFRiwKLQkJCSJJbnZhbGlkIHBhY2tldCBzaXplIikgfSwKLS8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg2NSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJWb2x0YWdlIGZhdWx0IikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMCwgU1NfUkRFRiwKLQkJCSJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGNvdmVyIHVwIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMSwgU1NfUkRFRiwKLQkJCSJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGxpZnQgdXAiKSB9LAotLyogICAgICAgUyAgICAgICove1NTVCgweDY2LCAweDAyLCBTU19SREVGLAotCQkJIkRvY3VtZW50IGphbSBpbiBhdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIikgfSwKLS8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMywgU1NfUkRFRiwKLQkJCSJEb2N1bWVudCBtaXNzIGZlZWQgYXV0b21hdGljIGluIGRvY3VtZW50IGZlZWRlciIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDAsIFNTX1JERUYsCi0JCQkiQ29uZmlndXJhdGlvbiBmYWlsdXJlIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwMSwgU1NfUkRFRiwKLQkJCSJDb25maWd1cmF0aW9uIG9mIGluY2FwYWJsZSBsb2dpY2FsIHVuaXRzIGZhaWxlZCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDIsIFNTX1JERUYsCi0JCQkiQWRkIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDAzLCBTU19SREVGLAotCQkJIk1vZGlmaWNhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNCwgU1NfUkRFRiwKLQkJCSJFeGNoYW5nZSBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNSwgU1NfUkRFRiwKLQkJCSJSZW1vdmUgb2YgbG9naWNhbCB1bml0IGZhaWxlZCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDYsIFNTX1JERUYsCi0JCQkiQXR0YWNobWVudCBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNywgU1NfUkRFRiwKLQkJCSJDcmVhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2OCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJMb2dpY2FsIHVuaXQgbm90IGNvbmZpZ3VyZWQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY5LCAweDAwLCBTU19SREVGLAotCQkJIkRhdGEgbG9zcyBvbiBsb2dpY2FsIHVuaXQiKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDY5LCAweDAxLCBTU19SREVGLAotCQkJIk11bHRpcGxlIGxvZ2ljYWwgdW5pdCBmYWlsdXJlcyIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjksIDB4MDIsIFNTX1JERUYsCi0JCQkiUGFyaXR5L2RhdGEgbWlzbWF0Y2giKSB9LAotLyogICAgICAgICAgIEEgICove1NTVCgweDZBLCAweDAwLCBTU19SREVGLAotCQkJIkluZm9ybWF0aW9uYWwsIHJlZmVyIHRvIGxvZyIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkIsIDB4MDAsIFNTX1JERUYsCi0JCQkiU3RhdGUgY2hhbmdlIGhhcyBvY2N1cnJlZCIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkIsIDB4MDEsIFNTX1JERUYsCi0JCQkiUmVkdW5kYW5jeSBsZXZlbCBnb3QgYmV0dGVyIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2QiwgMHgwMiwgU1NfUkRFRiwKLQkJCSJSZWR1bmRhbmN5IGxldmVsIGdvdCB3b3JzZSIpIH0sCi0vKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkMsIDB4MDAsIFNTX1JERUYsCi0JCQkiUmVidWlsZCBmYWlsdXJlIG9jY3VycmVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2RCwgMHgwMCwgU1NfUkRFRiwKLQkJCSJSZWNhbGN1bGF0ZSBmYWlsdXJlIG9jY3VycmVkIikgfSwKLS8qICAgICAgICAgICBBICAqL3tTU1QoMHg2RSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJDb21tYW5kIHRvIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAotLyogIFQgICAgICAgICAgICove1NTVCgweDcwLCAweDAwLCBTU19SREVGLAotCQkJIkRlY29tcHJlc3Npb24gZXhjZXB0aW9uIHNob3J0OiBBU0NRID0gQWxnb3JpdGhtIElEIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCi0JCQlOVUxMKSB9LCAvKiBSYW5nZSAweDAwIC0+IDB4RkYgKi8KLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MSwgMHgwMCwgU1NfUkRFRiwKLQkJCSJEZWNvbXByZXNzaW9uIGV4Y2VwdGlvbiBsb25nOiBBU0NRID0gQWxnb3JpdGhtIElEIikgfSwKLS8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MSwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCi0JCQlOVUxMKSB9LCAvKiBSYW5nZSAweDAwIC0+IDB4RkYgKi8JCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDAsIFNTX1JERUYsCi0JCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDEsIFNTX1JERUYsCi0JCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciB3cml0aW5nIGxlYWQtaW4iKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDcyLCAweDAyLCBTU19SREVGLAotCQkJIlNlc3Npb24gZml4YXRpb24gZXJyb3Igd3JpdGluZyBsZWFkLW91dCIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDMsIFNTX1JERUYsCi0JCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciAtIGluY29tcGxldGUgdHJhY2sgaW4gc2Vzc2lvbiIpIH0sCi0vKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDQsIFNTX1JERUYsCi0JCQkiRW1wdHkgb3IgcGFydGlhbGx5IHdyaXR0ZW4gcmVzZXJ2ZWQgdHJhY2siKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAwLCBTU19SREVGLAotCQkJIkNEIGNvbnRyb2wgZXJyb3IiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAxLCBTU19SREVGLAotCQkJIlBvd2VyIGNhbGlicmF0aW9uIGFyZWEgYWxtb3N0IGZ1bGwiKSB9LAotLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAyLCBTU19GQVRBTHxFTk9TUEMsCi0JCQkiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBpcyBmdWxsIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwMywgU1NfUkRFRiwKLQkJCSJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGVycm9yIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwNCwgU1NfUkRFRiwKLQkJCSJQcm9ncmFtIG1lbW9yeSBhcmVhIHVwZGF0ZSBmYWlsdXJlIikgfSwKLS8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwNSwgU1NfUkRFRiwKLQkJCSJwcm9ncmFtIG1lbW9yeSBhcmVhIGlzIGZ1bGwiKSB9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50IGFzY190YWJsZV9zaXplID0gc2l6ZW9mKGFzY190YWJsZSkvc2l6ZW9mKGFzY190YWJsZVswXSk7Ci0KLXN0cnVjdCBhc2Nfa2V5Ci17Ci0JaW50IGFzYzsKLQlpbnQgYXNjcTsKLX07Ci0KLXN0YXRpYyBpbnQKLWFzY2VudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcikKLXsKLQlpbnQgYXNjOwotCWludCBhc2NxOwotCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKnRhYmxlX2VudHJ5OwotCi0JYXNjID0gKChjb25zdCBzdHJ1Y3QgYXNjX2tleSAqKWtleSktPmFzYzsKLQlhc2NxID0gKChjb25zdCBzdHJ1Y3QgYXNjX2tleSAqKWtleSktPmFzY3E7Ci0JdGFibGVfZW50cnkgPSAoY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqKW1lbWJlcjsKLQotCWlmIChhc2MgPj0gdGFibGVfZW50cnktPmFzYykgewotCi0JCWlmIChhc2MgPiB0YWJsZV9lbnRyeS0+YXNjKQotCQkJcmV0dXJuICgxKTsKLQotCQlpZiAoYXNjcSA8PSB0YWJsZV9lbnRyeS0+YXNjcSkgewotCQkJLyogQ2hlY2sgZm9yIHJhbmdlcyAqLwotCQkJaWYgKGFzY3EgPT0gdGFibGVfZW50cnktPmFzY3EKLQkJIAkgfHwgKCh0YWJsZV9lbnRyeS0+YWN0aW9uICYgU1NRX1JBTkdFKSAhPSAwCi0JCSAgCSAgICYmIGFzY3EgPj0gKHRhYmxlX2VudHJ5IC0gMSktPmFzY3EpKQotCQkJCXJldHVybiAoMCk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlyZXR1cm4gKDEpOwotCX0KLQlyZXR1cm4gKC0xKTsKLX0KLQotc3RhdGljIGludAotc2Vuc2VlbnRyeWNvbXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpCi17Ci0JaW50IHNlbnNlX2tleTsKLQljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICp0YWJsZV9lbnRyeTsKLQotCXNlbnNlX2tleSA9ICooKGNvbnN0IGludCAqKWtleSk7Ci0JdGFibGVfZW50cnkgPSAoY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKW1lbWJlcjsKLQotCWlmIChzZW5zZV9rZXkgPj0gdGFibGVfZW50cnktPnNlbnNlX2tleSkgewotCQlpZiAoc2Vuc2Vfa2V5ID09IHRhYmxlX2VudHJ5LT5zZW5zZV9rZXkpCi0JCQlyZXR1cm4gKDApOwotCQlyZXR1cm4gKDEpOwotCX0KLQlyZXR1cm4gKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWZldGNodGFibGVlbnRyaWVzKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAotCQkgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsCi0JCSAgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKnNlbnNlX2VudHJ5LAotCQkgIGNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKiphc2NfZW50cnkpCi17Ci0Jdm9pZCAqbWF0Y2g7Ci0JY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqYXNjX3RhYmxlc1syXTsKLQljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV90YWJsZXNbMl07Ci0Jc3RydWN0IGFzY19rZXkgYXNjX2FzY3E7Ci0Jc2l6ZV90IGFzY190YWJsZXNfc2l6ZVsyXTsKLQlzaXplX3Qgc2Vuc2VfdGFibGVzX3NpemVbMl07Ci0JaW50IG51bV9hc2NfdGFibGVzOwotCWludCBudW1fc2Vuc2VfdGFibGVzOwotCWludCBpOwotCi0JLyogRGVmYXVsdCB0byBmYWlsdXJlICovCi0JKnNlbnNlX2VudHJ5ID0gTlVMTDsKLQkqYXNjX2VudHJ5ID0gTlVMTDsKLQltYXRjaCA9IE5VTEw7Ci0JaWYgKGlucV9kYXRhICE9IE5VTEwpCi0JCW1hdGNoID0gY2FtX3F1aXJrbWF0Y2goKHZvaWQgKilpbnFfZGF0YSwKLQkJCQkgICAgICAgKHZvaWQgKilzZW5zZV9xdWlya190YWJsZSwKLQkJCQkgICAgICAgc2Vuc2VfcXVpcmtfdGFibGVfc2l6ZSwKLQkJCQkgICAgICAgc2l6ZW9mKCpzZW5zZV9xdWlya190YWJsZSksCi0JCQkJICAgICAgIGFpY19pbnF1aXJ5X21hdGNoKTsKLQotCWlmIChtYXRjaCAhPSBOVUxMKSB7Ci0JCXN0cnVjdCBzY3NpX3NlbnNlX3F1aXJrX2VudHJ5ICpxdWlyazsKLQotCQlxdWlyayA9IChzdHJ1Y3Qgc2NzaV9zZW5zZV9xdWlya19lbnRyeSAqKW1hdGNoOwotCQlhc2NfdGFibGVzWzBdID0gcXVpcmstPmFzY19pbmZvOwotCQlhc2NfdGFibGVzX3NpemVbMF0gPSBxdWlyay0+bnVtX2FzY3M7Ci0JCWFzY190YWJsZXNbMV0gPSBhc2NfdGFibGU7Ci0JCWFzY190YWJsZXNfc2l6ZVsxXSA9IGFzY190YWJsZV9zaXplOwotCQludW1fYXNjX3RhYmxlcyA9IDI7Ci0JCXNlbnNlX3RhYmxlc1swXSA9IHF1aXJrLT5zZW5zZV9rZXlfaW5mbzsKLQkJc2Vuc2VfdGFibGVzX3NpemVbMF0gPSBxdWlyay0+bnVtX3NlbnNlX2tleXM7Ci0JCXNlbnNlX3RhYmxlc1sxXSA9IHNlbnNlX2tleV90YWJsZTsKLQkJc2Vuc2VfdGFibGVzX3NpemVbMV0gPSBzZW5zZV9rZXlfdGFibGVfc2l6ZTsKLQkJbnVtX3NlbnNlX3RhYmxlcyA9IDI7Ci0JfSBlbHNlIHsKLQkJYXNjX3RhYmxlc1swXSA9IGFzY190YWJsZTsKLQkJYXNjX3RhYmxlc19zaXplWzBdID0gYXNjX3RhYmxlX3NpemU7Ci0JCW51bV9hc2NfdGFibGVzID0gMTsKLQkJc2Vuc2VfdGFibGVzWzBdID0gc2Vuc2Vfa2V5X3RhYmxlOwotCQlzZW5zZV90YWJsZXNfc2l6ZVswXSA9IHNlbnNlX2tleV90YWJsZV9zaXplOwotCQludW1fc2Vuc2VfdGFibGVzID0gMTsKLQl9Ci0KLQlhc2NfYXNjcS5hc2MgPSBhc2M7Ci0JYXNjX2FzY3EuYXNjcSA9IGFzY3E7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9hc2NfdGFibGVzOyBpKyspIHsKLQkJdm9pZCAqZm91bmRfZW50cnk7Ci0KLQkJZm91bmRfZW50cnkgPSBzY3NpYnNlYXJjaCgmYXNjX2FzY3EsIGFzY190YWJsZXNbaV0sCi0JCQkJCSAgYXNjX3RhYmxlc19zaXplW2ldLAotCQkJCQkgIHNpemVvZigqKmFzY190YWJsZXMpLAotCQkJCQkgIGFzY2VudHJ5Y29tcCk7Ci0KLQkJaWYgKGZvdW5kX2VudHJ5KSB7Ci0JCQkqYXNjX2VudHJ5ID0gKHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKilmb3VuZF9lbnRyeTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bV9zZW5zZV90YWJsZXM7IGkrKykgewotCQl2b2lkICpmb3VuZF9lbnRyeTsKLQotCQlmb3VuZF9lbnRyeSA9IHNjc2lic2VhcmNoKCZzZW5zZV9rZXksIHNlbnNlX3RhYmxlc1tpXSwKLQkJCQkJICBzZW5zZV90YWJsZXNfc2l6ZVtpXSwKLQkJCQkJICBzaXplb2YoKipzZW5zZV90YWJsZXMpLAotCQkJCQkgIHNlbnNlZW50cnljb21wKTsKLQotCQlpZiAoZm91bmRfZW50cnkpIHsKLQkJCSpzZW5zZV9lbnRyeSA9Ci0JCQkgICAgKHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgKilmb3VuZF9lbnRyeTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCAqCi1zY3NpYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCi0JCSBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKLXsKLQljb25zdCB2b2lkICplbnRyeTsKLQl1X2ludCBsOwotCXVfaW50IHU7Ci0JdV9pbnQgbTsKLQotCWwgPSAtMTsKLQl1ID0gbm1lbWI7Ci0Jd2hpbGUgKGwgKyAxICE9IHUpIHsKLQkJbSA9IChsICsgdSkgLyAyOwotCQllbnRyeSA9IGJhc2UgKyBtICogc2l6ZTsKLQkJaWYgKGNvbXBhcihrZXksIGVudHJ5KSA+IDApCi0JCQlsID0gbTsKLQkJZWxzZQotCQkJdSA9IG07Ci0JfQotCi0JZW50cnkgPSBiYXNlICsgdSAqIHNpemU7Ci0JaWYgKHUgPT0gbm1lbWIKLQkgfHwgY29tcGFyKGtleSwgZW50cnkpICE9IDApCi0JCXJldHVybiAoTlVMTCk7Ci0KLQlyZXR1cm4gKCh2b2lkICopZW50cnkpOwotfQotCi0vKgotICogQ29tcGFyZSBzdHJpbmcgd2l0aCBwYXR0ZXJuLCByZXR1cm5pbmcgMCBvbiBtYXRjaC4KLSAqIFNob3J0IHBhdHRlcm4gbWF0Y2hlcyB0cmFpbGluZyBibGFua3MgaW4gbmFtZSwKLSAqIHdpbGRjYXJkICcqJyBpbiBwYXR0ZXJuIG1hdGNoZXMgcmVzdCBvZiBuYW1lLAotICogd2lsZGNhcmQgJz8nIG1hdGNoZXMgYSBzaW5nbGUgbm9uLXNwYWNlIGNoYXJhY3Rlci4KLSAqLwotc3RhdGljIGludAotY2FtX3N0cm1hdGNoKGNvbnN0IHVpbnQ4X3QgKnN0ciwgY29uc3QgdWludDhfdCAqcGF0dGVybiwgaW50IHN0cl9sZW4pCi17Ci0KLQl3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyYmIHN0cl9sZW4gPiAwKSB7ICAKLQotCQlpZiAoKnBhdHRlcm4gPT0gJyonKSB7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCWlmICgoKnBhdHRlcm4gIT0gKnN0cikKLQkJICYmICgqcGF0dGVybiAhPSAnPycgfHwgKnN0ciA9PSAnICcpKSB7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JCXBhdHRlcm4rKzsKLQkJc3RyKys7Ci0JCXN0cl9sZW4tLTsKLQl9Ci0Jd2hpbGUgKHN0cl9sZW4gPiAwICYmICpzdHIrKyA9PSAnICcpCi0JCXN0cl9sZW4tLTsKLQotCXJldHVybiAoc3RyX2xlbik7Ci19Ci0KLXN0YXRpYyBjYWRkcl90Ci1jYW1fcXVpcmttYXRjaChjYWRkcl90IHRhcmdldCwgY2FkZHJfdCBxdWlya190YWJsZSwgaW50IG51bV9lbnRyaWVzLAotCSAgICAgICBpbnQgZW50cnlfc2l6ZSwgY2FtX3F1aXJrbWF0Y2hfdCAqY29tcF9mdW5jKQotewotCWZvciAoOyBudW1fZW50cmllcyA+IDA7IG51bV9lbnRyaWVzLS0sIHF1aXJrX3RhYmxlICs9IGVudHJ5X3NpemUpIHsKLQkJaWYgKCgqY29tcF9mdW5jKSh0YXJnZXQsIHF1aXJrX3RhYmxlKSA9PSAwKQotCQkJcmV0dXJuIChxdWlya190YWJsZSk7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLXZvaWQKLWFpY19zZW5zZV9kZXNjKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAotCSAgICAgICBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhLAotCSAgICAgICBjb25zdCBjaGFyICoqc2Vuc2Vfa2V5X2Rlc2MsIGNvbnN0IGNoYXIgKiphc2NfZGVzYykKLXsKLQljb25zdCBzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5ICphc2NfZW50cnk7Ci0JY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqc2Vuc2VfZW50cnk7Ci0KLQlmZXRjaHRhYmxlZW50cmllcyhzZW5zZV9rZXksIGFzYywgYXNjcSwKLQkJCSAgaW5xX2RhdGEsCi0JCQkgICZzZW5zZV9lbnRyeSwKLQkJCSAgJmFzY19lbnRyeSk7Ci0KLQkqc2Vuc2Vfa2V5X2Rlc2MgPSBzZW5zZV9lbnRyeS0+ZGVzYzsKLQotCWlmIChhc2NfZW50cnkgIT0gTlVMTCkKLQkJKmFzY19kZXNjID0gYXNjX2VudHJ5LT5kZXNjOwotCWVsc2UgaWYgKGFzYyA+PSAweDgwICYmIGFzYyA8PSAweGZmKQotCQkqYXNjX2Rlc2MgPSAiVmVuZG9yIFNwZWNpZmljIEFTQyI7Ci0JZWxzZSBpZiAoYXNjcSA+PSAweDgwICYmIGFzY3EgPD0gMHhmZikKLQkJKmFzY19kZXNjID0gIlZlbmRvciBTcGVjaWZpYyBBU0NRIjsKLQllbHNlCi0JCSphc2NfZGVzYyA9ICJSZXNlcnZlZCBBU0MvQVNDUSBwYWlyIjsKLX0KLQotLyoKLSAqIEdpdmVuIHNlbnNlIGFuZCBkZXZpY2UgdHlwZSBpbmZvcm1hdGlvbiwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCi0gKiBJZiB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWMgZXJyb3IgYXMgaWRlbnRpZmllZCBieSB0aGUgQVNDL0FTQ1EKLSAqIHBhaXIsIGZhbGwgYmFjayBvbiB0aGUgbW9yZSBnZW5lcmljIGFjdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSBzZW5zZSBrZXkuCi0gKi8KLWFpY19zZW5zZV9hY3Rpb24KLWFpY19zZW5zZV9lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2VfZGF0YSwKLQkJICAgICAgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsIHVpbnQzMl90IHNlbnNlX2ZsYWdzKQotewotCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKmFzY19lbnRyeTsKLQljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV9lbnRyeTsKLQlpbnQgZXJyb3JfY29kZSwgc2Vuc2Vfa2V5LCBhc2MsIGFzY3E7Ci0JYWljX3NlbnNlX2FjdGlvbiBhY3Rpb247Ci0KLQlzY3NpX2V4dHJhY3Rfc2Vuc2Uoc2Vuc2VfZGF0YSwgJmVycm9yX2NvZGUsICZzZW5zZV9rZXksICZhc2MsICZhc2NxKTsKLQotCWlmIChlcnJvcl9jb2RlID09IFNTRF9ERUZFUlJFRF9FUlJPUikgewotCQkvKgotCQkgKiBYWFggZHVmYXVsdEBGcmVlQlNELm9yZwotCQkgKiBUaGlzIGVycm9yIGRvZXNuJ3QgcmVsYXRlIHRvIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQKLQkJICogd2l0aCB0aGlzIHJlcXVlc3Qgc2Vuc2UuICBBIGRlZmVycmVkIGVycm9yIGlzIGFuIGVycm9yCi0JCSAqIGZvciBhIGNvbW1hbmQgdGhhdCBoYXMgYWxyZWFkeSByZXR1cm5lZCBHT09EIHN0YXR1cwotCQkgKiAoc2VlIFNDU0kyIDguMi4xNC4yKS4KLQkJICoKLQkJICogQnkgbXkgcmVhZGluZyBvZiB0aGF0IHNlY3Rpb24sIGl0IGxvb2tzIGxpa2UgdGhlIGN1cnJlbnQKLQkJICogY29tbWFuZCBoYXMgYmVlbiBjYW5jZWxsZWQsIHdlIHNob3VsZCBub3cgY2xlYW4gdGhpbmdzIHVwCi0JCSAqIChob3BlZnVsbHkgcmVjb3ZlcmluZyBhbnkgbG9zdCBkYXRhKSBhbmQgdGhlbiByZXRyeSB0aGUKLQkJICogY3VycmVudCBjb21tYW5kLiAgVGhlcmUgYXJlIHR3byBlYXN5IGNob2ljZXMsIGJvdGggd3Jvbmc6Ci0JCSAqCi0JCSAqIDEuIERyb3AgdGhyb3VnaCAobGlrZSB3ZSBoYWQgYmVlbiBkb2luZyksIHRodXMgdHJlYXRpbmcKLQkJICogICAgdGhpcyBhcyBpZiB0aGUgZXJyb3Igd2VyZSBmb3IgdGhlIGN1cnJlbnQgY29tbWFuZCBhbmQKLQkJICogICAgcmV0dXJuIGFuZCBzdG9wIHRoZSBjdXJyZW50IGNvbW1hbmQuCi0JCSAqIAotCQkgKiAyLiBJc3N1ZSBhIHJldHJ5IChsaWtlIEkgbWFkZSBpdCBkbykgdGh1cyBob3BlZnVsbHkKLQkJICogICAgcmVjb3ZlcmluZyB0aGUgY3VycmVudCB0cmFuc2ZlciwgYW5kIGlnbm9yaW5nIHRoZQotCQkgKiAgICBmYWN0IHRoYXQgd2UndmUgZHJvcHBlZCBhIGNvbW1hbmQuCi0JCSAqCi0JCSAqIFRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSBoYW5kbGVkIGluIGEgZGV2aWNlIHNwZWNpZmljCi0JCSAqIHNlbnNlIGhhbmRsZXIgb3IgcHVudGVkIGJhY2sgdXAgdG8gYSB1c2VyIG1vZGUgZGFlbW9uCi0JCSAqLwotCQlhY3Rpb24gPSBTU19SRVRSWXxTU1FfREVDUkVNRU5UX0NPVU5UfFNTUV9QUklOVF9TRU5TRTsKLQl9IGVsc2UgewotCQlmZXRjaHRhYmxlZW50cmllcyhzZW5zZV9rZXksIGFzYywgYXNjcSwKLQkJCQkgIGlucV9kYXRhLAotCQkJCSAgJnNlbnNlX2VudHJ5LAotCQkJCSAgJmFzY19lbnRyeSk7Ci0KLQkJLyoKLQkJICogT3ZlcnJpZGUgdGhlICdObyBhZGRpdGlvbmFsIFNlbnNlJyBlbnRyeSAoMCwwKQotCQkgKiB3aXRoIHRoZSBlcnJvciBhY3Rpb24gb2YgdGhlIHNlbnNlIGtleS4KLQkJICovCi0JCWlmIChhc2NfZW50cnkgIT0gTlVMTAotCQkgJiYgKGFzYyAhPSAwIHx8IGFzY3EgIT0gMCkpCi0JCQlhY3Rpb24gPSBhc2NfZW50cnktPmFjdGlvbjsKLQkJZWxzZQotCQkJYWN0aW9uID0gc2Vuc2VfZW50cnktPmFjdGlvbjsKLQotCQlpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfUkVDT1ZFUkVEX0VSUk9SKSB7Ci0JCQkvKgotCQkJICogVGhlIGFjdGlvbiBzdWNjZWVkZWQgYnV0IHRoZSBkZXZpY2Ugd2FudHMKLQkJCSAqIHRoZSB1c2VyIHRvIGtub3cgdGhhdCBzb21lIHJlY292ZXJ5IGFjdGlvbgotCQkJICogd2FzIHJlcXVpcmVkLgotCQkJICovCi0JCQlhY3Rpb24gJj0gfihTU19NQVNLfFNTUV9NQVNLfFNTX0VSUk1BU0spOwotCQkJYWN0aW9uIHw9IFNTX05PUHxTU1FfUFJJTlRfU0VOU0U7Ci0JCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfSUxMRUdBTF9SRVFVRVNUKSB7Ci0JCQlpZiAoKHNlbnNlX2ZsYWdzICYgU0ZfUVVJRVRfSVIpICE9IDApCi0JCQkJYWN0aW9uICY9IH5TU1FfUFJJTlRfU0VOU0U7Ci0JCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfVU5JVF9BVFRFTlRJT04pIHsKLQkJCWlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9SRVRSWV9VQSkgIT0gMAotCQkJICYmIChhY3Rpb24gJiBTU19NQVNLKSA9PSBTU19GQUlMKSB7Ci0JCQkJYWN0aW9uICY9IH4oU1NfTUFTS3xTU1FfTUFTSyk7Ci0JCQkJYWN0aW9uIHw9IFNTX1JFVFJZfFNTUV9ERUNSRU1FTlRfQ09VTlR8Ci0JCQkJCSAgU1NRX1BSSU5UX1NFTlNFOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKChzZW5zZV9mbGFncyAmIFNGX1BSSU5UX0FMV0FZUykgIT0gMCkKLQkJYWN0aW9uIHw9IFNTUV9QUklOVF9TRU5TRTsKLQllbHNlIGlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9OT19QUklOVCkgIT0gMCkKLQkJYWN0aW9uICY9IH5TU1FfUFJJTlRfU0VOU0U7Ci0KLQlyZXR1cm4gKGFjdGlvbik7Ci19Ci0KLS8qICAgICAgCi0gKiBUcnkgbWFrZSBhcyBnb29kIGEgbWF0Y2ggYXMgcG9zc2libGUgd2l0aAotICogYXZhaWxhYmxlIHN1YiBkcml2ZXJzCi0gKi8KLWludAotYWljX2lucXVpcnlfbWF0Y2goY2FkZHJfdCBpbnFidWZmZXIsIGNhZGRyX3QgdGFibGVfZW50cnkpCi17Ci0Jc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuICplbnRyeTsKLQlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucTsKLSAKLQllbnRyeSA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4gKil0YWJsZV9lbnRyeTsKLQlpbnEgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICopaW5xYnVmZmVyOwotCi0JaWYgKCgoU0lEX1RZUEUoaW5xKSA9PSBlbnRyeS0+dHlwZSkKLQkgIHx8IChlbnRyeS0+dHlwZSA9PSBUX0FOWSkpCi0JICYmIChTSURfSVNfUkVNT1ZBQkxFKGlucSkgPyBlbnRyeS0+bWVkaWFfdHlwZSAmIFNJUF9NRURJQV9SRU1PVkFCTEUKLQkJCQkgICA6IGVudHJ5LT5tZWRpYV90eXBlICYgU0lQX01FRElBX0ZJWEVEKQotCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+dmVuZG9yLCBlbnRyeS0+dmVuZG9yLCBzaXplb2YoaW5xLT52ZW5kb3IpKSA9PSAwKQotCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+cHJvZHVjdCwgZW50cnktPnByb2R1Y3QsCi0JCQkgIHNpemVvZihpbnEtPnByb2R1Y3QpKSA9PSAwKQotCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+cmV2aXNpb24sIGVudHJ5LT5yZXZpc2lvbiwKLQkJCSAgc2l6ZW9mKGlucS0+cmV2aXNpb24pKSA9PSAwKSkgewotCQlyZXR1cm4gKDApOwotCX0KLSAgICAgICAgcmV0dXJuICgtMSk7Ci19Ci0KLS8qCi0gKiBUYWJsZSBvZiBzeW5jcmF0ZXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlICJkaXZpc2libGUgYnkgNCIKLSAqIHJ1bGUuIFRoaXMgdGFibGUgd2lsbCBiZSBleHBhbmRlZCBpbiBmdXR1cmUgU0NTSSBzcGVjcy4KLSAqLwotc3RhdGljIHN0cnVjdCB7Ci0JdV9pbnQgcGVyaW9kX2ZhY3RvcjsKLQl1X2ludCBwZXJpb2Q7CS8qIGluIDEwMHRocyBvZiBucyAqLwotfSBzY3NpX3N5bmNyYXRlc1tdID0gewotCXsgMHgwOCwgNjI1IH0sCS8qIEZBU1QtMTYwICovCi0JeyAweDA5LCAxMjUwIH0sCS8qIEZBU1QtODAgKi8KLQl7IDB4MGEsIDI1MDAgfSwJLyogRkFTVC00MCA0ME1IeiAqLwotCXsgMHgwYiwgMzAzMCB9LAkvKiBGQVNULTQwIDMzTUh6ICovCi0JeyAweDBjLCA1MDAwIH0JLyogRkFTVC0yMCAqLwotfTsKLQotLyoKLSAqIFJldHVybiB0aGUgZnJlcXVlbmN5IGluIGtIeiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotICogc3luYyBwZXJpb2QgZmFjdG9yLgotICovCi11X2ludAotYWljX2NhbGNfc3luY3NyYXRlKHVfaW50IHBlcmlvZF9mYWN0b3IpCi17Ci0JaW50IGk7Ci0JaW50IG51bV9zeW5jcmF0ZXM7Ci0KLQludW1fc3luY3JhdGVzID0gc2l6ZW9mKHNjc2lfc3luY3JhdGVzKSAvIHNpemVvZihzY3NpX3N5bmNyYXRlc1swXSk7Ci0JLyogU2VlIGlmIHRoZSBwZXJpb2QgaXMgaW4gdGhlICJleGNlcHRpb24iIHRhYmxlICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9zeW5jcmF0ZXM7IGkrKykgewotCi0JCWlmIChwZXJpb2RfZmFjdG9yID09IHNjc2lfc3luY3JhdGVzW2ldLnBlcmlvZF9mYWN0b3IpIHsKLQkJCS8qIFBlcmlvZCBpbiBrSHogKi8KLQkJCXJldHVybiAoMTAwMDAwMDAwIC8gc2NzaV9zeW5jcmF0ZXNbaV0ucGVyaW9kKTsKLQkJfQotCX0KLQotCS8qCi0JICogV2Fzbid0IGluIHRoZSB0YWJsZSwgc28gdXNlIHRoZSBzdGFuZGFyZAotCSAqIDQgdGltZXMgY29udmVyc2lvbi4KLQkgKi8KLQlyZXR1cm4gKDEwMDAwMDAwIC8gKHBlcmlvZF9mYWN0b3IgKiA0ICogMTApKTsKLX0KLQotLyoKLSAqIFJldHVybiBzcGVlZCBpbiBLQi9zLgotICovCi11X2ludAotYWljX2NhbGNfc3BlZWQodV9pbnQgd2lkdGgsIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LCB1X2ludCBtaW5fcmF0ZSkKLXsKLQl1X2ludCBmcmVxOwotCi0JaWYgKG9mZnNldCAhPSAwICYmIHBlcmlvZCA8IG1pbl9yYXRlKQotCQlmcmVxICA9IGFpY19jYWxjX3N5bmNzcmF0ZShwZXJpb2QpOwotCWVsc2UKLQkJLyogUm91Z2hseSAzLjNNQi9zIGZvciBhc3luYyAqLwotCQlmcmVxICA9IDMzMDA7Ci0JZnJlcSA8PD0gd2lkdGg7Ci0JcmV0dXJuIChmcmVxKTsKLX0KLQotdWludDMyX3QKLWFpY19lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhLAotCQkgY2FtX3N0YXR1cyBzdGF0dXMsIHVfaW50IHNjc2lfc3RhdHVzKQotewotCWFpY19zZW5zZV9hY3Rpb24gIGVycl9hY3Rpb247Ci0JaW50CQkgIHNlbnNlOwotCi0Jc2Vuc2UgID0gKGNtZC0+cmVzdWx0ID4+IDI0KSA9PSBEUklWRVJfU0VOU0U7Ci0KLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgQ0FNX1JFUV9DTVA6Ci0JCWVycl9hY3Rpb24gPSBTU19OT1A7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgotCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgotCi0JCXN3aXRjaCAoc2NzaV9zdGF0dXMpIHsKLQkJY2FzZSBTQ1NJX1NUQVRVU19PSzoKLQkJY2FzZSBTQ1NJX1NUQVRVU19DT05EX01FVDoKLQkJY2FzZSBTQ1NJX1NUQVRVU19JTlRFUk1FRDoKLQkJY2FzZSBTQ1NJX1NUQVRVU19JTlRFUk1FRF9DT05EX01FVDoKLQkJCWVycl9hY3Rpb24gPSBTU19OT1A7Ci0JCQlicmVhazsKLQkJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKLQkJY2FzZSBTQ1NJX1NUQVRVU19DSEVDS19DT05EOgotCQkJaWYgKHNlbnNlICE9IDApIHsKLQkJCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZTsKLQotCQkJCXNlbnNlID0gKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKikKLQkJCQkgICAgJmNtZC0+c2Vuc2VfYnVmZmVyOwotCQkJCWVycl9hY3Rpb24gPQotCQkJCSAgICBhaWNfc2Vuc2VfZXJyb3JfYWN0aW9uKHNlbnNlLCBpbnFfZGF0YSwgMCk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZfFNTUV9GQUxMQkFDSwotCQkJCQkgICB8IFNTUV9ERUNSRU1FTlRfQ09VTlR8RUlPOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKLQkJY2FzZSBTQ1NJX1NUQVRVU19CVVNZOgotCQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZfFNTUV9ERUxBWXxTU1FfTUFOWQotCQkJCSAgIHwgU1NRX0RFQ1JFTUVOVF9DT1VOVHxFQlVTWTsKLQkJCWJyZWFrOwotCQljYXNlIFNDU0lfU1RBVFVTX1JFU0VSVl9DT05GTElDVDoKLQkJZGVmYXVsdDoKLQkJCWVycl9hY3Rpb24gPSBTU19GQUlMfEVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDQU1fQ01EX1RJTUVPVVQ6Ci0JY2FzZSBDQU1fUkVRX0NNUF9FUlI6Ci0JY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKLQljYXNlIENBTV9VTkNPUl9QQVJJVFk6Ci0JY2FzZSBDQU1fREFUQV9SVU5fRVJSOgotCQllcnJfYWN0aW9uID0gU1NfUkVUUll8U1NRX0ZBTExCQUNLfEVJTzsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1fVUFfQUJPUlQ6Ci0JY2FzZSBDQU1fVUFfVEVSTUlPOgotCWNhc2UgQ0FNX01TR19SRUpFQ1RfUkVDOgotCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgotCQllcnJfYWN0aW9uID0gU1NfRkFJTHxFSU87Ci0JCWJyZWFrOwotCWNhc2UgQ0FNX1JFUV9JTlZBTElEOgotCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKLQljYXNlIENBTV9ERVZfTk9UX1RIRVJFOgotCWNhc2UgQ0FNX05PX0hCQToKLQljYXNlIENBTV9QUk9WSURFX0ZBSUw6Ci0JY2FzZSBDQU1fUkVRX1RPT19CSUc6CQkKLQljYXNlIENBTV9SRVNSQ19VTkFWQUlMOgotCWNhc2UgQ0FNX0JVU1k6Ci0JZGVmYXVsdDoKLQkJLyogcGFuaWM/PyAgVGhlc2Ugc2hvdWxkIG5ldmVyIG9jY3VyIGluIG91ciBhcHBsaWNhdGlvbi4gKi8KLQkJZXJyX2FjdGlvbiA9IFNTX0ZBSUx8RUlPOwotCQlicmVhazsKLQljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKLQljYXNlIENBTV9CRFJfU0VOVDoJCQotCWNhc2UgQ0FNX1JFUVVFVUVfUkVROgotCQkvKiBVbmNvbmRpdGlvbmFsIHJlcXVldWUgKi8KLQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKGVycl9hY3Rpb24pOwotfQotCi1jaGFyICoKLWFpY19wYXJzZV9icmFjZV9vcHRpb24oY2hhciAqb3B0X25hbWUsIGNoYXIgKm9wdF9hcmcsIGNoYXIgKmVuZCwgaW50IGRlcHRoLAotCQkgICAgICAgYWljX29wdGlvbl9jYWxsYmFja190ICpjYWxsYmFjaywgdV9sb25nIGNhbGxiYWNrX2FyZykKLXsKLQljaGFyCSp0b2tfZW5kOwotCWNoYXIJKnRva19lbmQyOwotCWludCAgICAgIGk7Ci0JaW50ICAgICAgaW5zdGFuY2U7Ci0JaW50CSB0YXJnOwotCWludAkgZG9uZTsKLQljaGFyCSB0b2tfbGlzdFtdID0geycuJywgJywnLCAneycsICd9JywgJ1wwJ307CiAKLQkvKiBBbGwgb3B0aW9ucyB1c2UgYSAnOicgbmFtZS9hcmcgc2VwYXJhdG9yICovCi0JaWYgKCpvcHRfYXJnICE9ICc6JykKLQkJcmV0dXJuIChvcHRfYXJnKTsKLQlvcHRfYXJnKys7Ci0JaW5zdGFuY2UgPSAtMTsKLQl0YXJnID0gLTE7Ci0JZG9uZSA9IEZBTFNFOwotCS8qCi0JICogUmVzdG9yZSBzZXBhcmF0b3IgdGhhdCBtYXkgYmUgaW4KLQkgKiB0aGUgbWlkZGxlIG9mIG91ciBvcHRpb24gYXJndW1lbnQuCi0JICovCi0JdG9rX2VuZCA9IHN0cmNocihvcHRfYXJnLCAnXDAnKTsKLQlpZiAodG9rX2VuZCA8IGVuZCkKLQkJKnRva19lbmQgPSAnLCc7Ci0Jd2hpbGUgKCFkb25lKSB7Ci0JCXN3aXRjaCAoKm9wdF9hcmcpIHsKLQkJY2FzZSAneyc6Ci0JCQlpZiAoaW5zdGFuY2UgPT0gLTEpIHsKLQkJCQlpbnN0YW5jZSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkZXB0aCA+IDEpIHsKLQkJCQkJaWYgKHRhcmcgPT0gLTEpCi0JCQkJCQl0YXJnID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmludGYoIk1hbGZvcm1lZCBPcHRpb24gJXNcbiIsCi0JCQkJCSAgICAgICBvcHRfbmFtZSk7Ci0JCQkJCWRvbmUgPSBUUlVFOwotCQkJCX0KLQkJCX0KLQkJCW9wdF9hcmcrKzsKLQkJCWJyZWFrOwotCQljYXNlICd9JzoKLQkJCWlmICh0YXJnICE9IC0xKQotCQkJCXRhcmcgPSAtMTsKLQkJCWVsc2UgaWYgKGluc3RhbmNlICE9IC0xKQotCQkJCWluc3RhbmNlID0gLTE7Ci0JCQlvcHRfYXJnKys7Ci0JCQlicmVhazsKLQkJY2FzZSAnLCc6Ci0JCWNhc2UgJy4nOgotCQkJaWYgKGluc3RhbmNlID09IC0xKQotCQkJCWRvbmUgPSBUUlVFOwotCQkJZWxzZSBpZiAodGFyZyA+PSAwKQotCQkJCXRhcmcrKzsKLQkJCWVsc2UgaWYgKGluc3RhbmNlID49IDApCi0JCQkJaW5zdGFuY2UrKzsKLQkJCW9wdF9hcmcrKzsKLQkJCWJyZWFrOwotCQljYXNlICdcMCc6Ci0JCQlkb25lID0gVFJVRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdG9rX2VuZCA9IGVuZDsKLQkJCWZvciAoaSA9IDA7IHRva19saXN0W2ldOyBpKyspIHsKLQkJCQl0b2tfZW5kMiA9IHN0cmNocihvcHRfYXJnLCB0b2tfbGlzdFtpXSk7Ci0JCQkJaWYgKCh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkpCi0JCQkJCXRva19lbmQgPSB0b2tfZW5kMjsKLQkJCX0KLQkJCWNhbGxiYWNrKGNhbGxiYWNrX2FyZywgaW5zdGFuY2UsIHRhcmcsCi0JCQkJIHNpbXBsZV9zdHJ0b2wob3B0X2FyZywgTlVMTCwgMCkpOwotCQkJb3B0X2FyZyA9IHRva19lbmQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gKG9wdF9hcmcpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuaAppbmRleCBiZmU2Zjk1Li4zYmZiZjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuaApAQCAtNTcsMTIxICs1Nyw2IEBACiAjaWZuZGVmCV9BSUNMSUJfSAogI2RlZmluZSBfQUlDTElCX0gKIAotLyoKLSAqIExpbnV4IEludGVycnVwdCBTdXBwb3J0LgotICovCi0jaWZuZGVmIElSUV9SRVRWQUwKLXR5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKLSNkZWZpbmUJSVJRX1JFVFZBTCh4KQotI2VuZGlmCi0KLS8qCi0gKiBTQ1NJIGNvbW1hbmQgZm9ybWF0Ci0gKi8KLQotLyoKLSAqIERlZmluZSBkb21lIGJpdHMgdGhhdCBhcmUgaW4gQUxMIChvciBhIGxvdCBvZikgc2NzaSBjb21tYW5kcwotICovCi0jZGVmaW5lIFNDU0lfQ1RMX0xJTksJCTB4MDEKLSNkZWZpbmUgU0NTSV9DVExfRkxBRwkJMHgwMgotI2RlZmluZSBTQ1NJX0NUTF9WRU5ET1IJCTB4QzAKLSNkZWZpbmUJU0NTSV9DTURfTFVOCQkweEEwCS8qIHRoZXNlIHR3byBzaG91bGQgbm90IGJlIG5lZWRlZCAqLwotI2RlZmluZQlTQ1NJX0NNRF9MVU5fU0hJRlQJNQkvKiBMVU4gaW4gdGhlIGNtZCBpcyBubyBsb25nZXIgU0NTSSAqLwotCi0jZGVmaW5lIFNDU0lfTUFYX0NEQkxFTgkJMTYJLyogCi0JCQkJCSAqIDE2IGJ5dGUgY29tbWFuZHMgYXJlIGluIHRoZSAKLQkJCQkJICogU0NTSS0zIHNwZWMgCi0JCQkJCSAqLwotLyogNmJ5dGUgQ0RCcyBzcGVjaWFsIGNhc2UgMCBsZW5ndGggdG8gYmUgMjU2ICovCi0jZGVmaW5lIFNDU0lfQ0RCNl9MRU4obGVuKQkoKGxlbikgPT0gMCA/IDI1NiA6IGxlbikKLQotLyoKLSAqIFRoaXMgdHlwZSBkZWZpbmVzIGFjdGlvbnMgdG8gYmUgdGFrZW4gd2hlbiBhIHBhcnRpY3VsYXIgc2Vuc2UgY29kZSBpcwotICogcmVjZWl2ZWQuICBSaWdodCBub3csIHRoZXNlIGZsYWdzIGFyZSBvbmx5IGRlZmluZWQgdG8gdGFrZSB1cCAxNiBiaXRzLAotICogYnV0IGNhbiBiZSBleHBhbmRlZCBpbiB0aGUgZnV0dXJlIGlmIG5lY2Vzc2FyeS4KLSAqLwotdHlwZWRlZiBlbnVtIHsKLQlTU19OT1AJCT0gMHgwMDAwMDAsIC8qIERvIG5vdGhpbmcgKi8KLQlTU19SRVRSWQk9IDB4MDEwMDAwLCAvKiBSZXRyeSB0aGUgY29tbWFuZCAqLwotCVNTX0ZBSUwJCT0gMHgwMjAwMDAsIC8qIEJhaWwgb3V0ICovCi0JU1NfU1RBUlQJPSAweDAzMDAwMCwgLyogU2VuZCBhIFN0YXJ0IFVuaXQgY29tbWFuZCB0byB0aGUgZGV2aWNlLAotCQkJCSAgICAgKiB0aGVuIHJldHJ5IHRoZSBvcmlnaW5hbCBjb21tYW5kLgotCQkJCSAgICAgKi8KLQlTU19UVVIJCT0gMHgwNDAwMDAsIC8qIFNlbmQgYSBUZXN0IFVuaXQgUmVhZHkgY29tbWFuZCB0byB0aGUKLQkJCQkgICAgICogZGV2aWNlLCB0aGVuIHJldHJ5IHRoZSBvcmlnaW5hbCBjb21tYW5kLgotCQkJCSAgICAgKi8KLQlTU19SRVFTRU5TRQk9IDB4MDUwMDAwLCAvKiBTZW5kIGEgUmVxdWVzdFNlbnNlIGNvbW1hbmQgdG8gdGhlCi0JCQkJICAgICAqIGRldmljZSwgdGhlbiByZXRyeSB0aGUgb3JpZ2luYWwgY29tbWFuZC4KLQkJCQkgICAgICovCi0JU1NfSU5RX1JFRlJFU0gJPSAweDA2MDAwMCwKLQlTU19NQVNLCQk9IDB4ZmYwMDAwCi19IGFpY19zZW5zZV9hY3Rpb247Ci0KLXR5cGVkZWYgZW51bSB7Ci0JU1NRX05PTkUJCT0gMHgwMDAwLAotCVNTUV9ERUNSRU1FTlRfQ09VTlQJPSAweDAxMDAsICAvKiBEZWNyZW1lbnQgdGhlIHJldHJ5IGNvdW50ICovCi0JU1NRX01BTlkJCT0gMHgwMjAwLCAgLyogc2VuZCBsb3RzIG9mIHJlY292ZXJ5IGNvbW1hbmRzICovCi0JU1NRX1JBTkdFCQk9IDB4MDQwMCwgIC8qCi0JCQkJCSAgICAqIFRoaXMgdGFibGUgZW50cnkgcmVwcmVzZW50cyB0aGUKLQkJCQkJICAgICogZW5kIG9mIGEgcmFuZ2Ugb2YgQVNDUXMgdGhhdAotCQkJCQkgICAgKiBoYXZlIGlkZW50aWNhbCBlcnJvciBhY3Rpb25zCi0JCQkJCSAgICAqIGFuZCB0ZXh0LgotCQkJCQkgICAgKi8KLQlTU1FfUFJJTlRfU0VOU0UJCT0gMHgwODAwLAotCVNTUV9ERUxBWQkJPSAweDEwMDAsICAvKiBEZWxheSBiZWZvcmUgcmV0cnkuICovCi0JU1NRX0RFTEFZX1JBTkRPTQk9IDB4MjAwMCwgIC8qIFJhbmRvbWl6ZWQgZGVsYXkgYmVmb3JlIHJldHJ5LiAqLwotCVNTUV9GQUxMQkFDSwkJPSAweDQwMDAsICAvKiBEbyBhIHNwZWVkIGZhbGxiYWNrIHRvIHJlY292ZXIgKi8KLQlTU1FfTUFTSwkJPSAweGZmMDAKLX0gYWljX3NlbnNlX2FjdGlvbl9xdWFsaWZpZXI7Ci0KLS8qIE1hc2sgZm9yIGVycm9yIHN0YXR1cyB2YWx1ZXMgKi8KLSNkZWZpbmUgU1NfRVJSTUFTSwkweGZmCi0KLS8qIFRoZSBkZWZhdWx0LCByZXR5YWJsZSwgZXJyb3IgYWN0aW9uICovCi0jZGVmaW5lIFNTX1JERUYJCVNTX1JFVFJZfFNTUV9ERUNSRU1FTlRfQ09VTlR8U1NRX1BSSU5UX1NFTlNFfEVJTwotCi0vKiBUaGUgcmV0eWFibGUsIGVycm9yIGFjdGlvbiwgd2l0aCB0YWJsZSBzcGVjaWZpZWQgZXJyb3IgY29kZSAqLwotI2RlZmluZSBTU19SRVQJCVNTX1JFVFJZfFNTUV9ERUNSRU1FTlRfQ09VTlR8U1NRX1BSSU5UX1NFTlNFCi0KLS8qIEZhdGFsIGVycm9yIGFjdGlvbiwgd2l0aCB0YWJsZSBzcGVjaWZpZWQgZXJyb3IgY29kZSAqLwotI2RlZmluZSBTU19GQVRBTAlTU19GQUlMfFNTUV9QUklOVF9TRU5TRQotCi1zdHJ1Y3Qgc2NzaV9nZW5lcmljCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlc1sxMV07Ci19OwotCi1zdHJ1Y3Qgc2NzaV9yZXF1ZXN0X3NlbnNlCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IHVudXNlZFsyXTsKLQl1aW50OF90IGxlbmd0aDsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV90ZXN0X3VuaXRfcmVhZHkKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgdW51c2VkWzNdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3NlbmRfZGlhZwotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0jZGVmaW5lCVNTRF9VT0wJCTB4MDEKLSNkZWZpbmUJU1NEX0RPTAkJMHgwMgotI2RlZmluZQlTU0RfU0VMRlRFU1QJMHgwNAotI2RlZmluZQlTU0RfUEYJCTB4MTAKLQl1aW50OF90IHVudXNlZFsxXTsKLQl1aW50OF90IHBhcmFtbGVuWzJdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KIHN0cnVjdCBzY3NpX3NlbnNlCiB7CiAJdWludDhfdCBvcGNvZGU7CkBAIC0xODEsNTM3ICs2NiwxMiBAQAogCXVpbnQ4X3QgY29udHJvbDsKIH07CiAKLXN0cnVjdCBzY3NpX2lucXVpcnkKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotI2RlZmluZQlTSV9FVlBEIDB4MDEKLQl1aW50OF90IHBhZ2VfY29kZTsKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgbGVuZ3RoOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX21vZGVfc2Vuc2VfNgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0jZGVmaW5lCVNNU19EQkQJCQkJMHgwOAotCXVpbnQ4X3QgcGFnZTsKLSNkZWZpbmUJU01TX1BBR0VfQ09ERSAJCQkweDNGCi0jZGVmaW5lIFNNU19WRU5ET1JfU1BFQ0lGSUNfUEFHRQkweDAwCi0jZGVmaW5lIFNNU19ESVNDT05ORUNUX1JFQ09OTkVDVF9QQUdFCTB4MDIKLSNkZWZpbmUgU01TX1BFUklQSEVSQUxfREVWSUNFX1BBR0UJMHgwOQotI2RlZmluZSBTTVNfQ09OVFJPTF9NT0RFX1BBR0UJCTB4MEEKLSNkZWZpbmUgU01TX0FMTF9QQUdFU19QQUdFCQkweDNGCi0jZGVmaW5lCVNNU19QQUdFX0NUUkxfTUFTSwkJMHhDMAotI2RlZmluZQlTTVNfUEFHRV9DVFJMX0NVUlJFTlQgCQkweDAwCi0jZGVmaW5lCVNNU19QQUdFX0NUUkxfQ0hBTkdFQUJMRSAJMHg0MAotI2RlZmluZQlTTVNfUEFHRV9DVFJMX0RFRkFVTFQgCQkweDgwCi0jZGVmaW5lCVNNU19QQUdFX0NUUkxfU0FWRUQgCQkweEMwCi0JdWludDhfdCB1bnVzZWQ7Ci0JdWludDhfdCBsZW5ndGg7Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9zZW5zZV8xMAotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7CQkvKiBzYW1lIGJpdHMgYXMgc21hbGwgdmVyc2lvbiAqLwotCXVpbnQ4X3QgcGFnZTsgCQkvKiBzYW1lIGJpdHMgYXMgc21hbGwgdmVyc2lvbiAqLwotCXVpbnQ4X3QgdW51c2VkWzRdOwotCXVpbnQ4X3QgbGVuZ3RoWzJdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX21vZGVfc2VsZWN0XzYKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotI2RlZmluZQlTTVNfU1AJMHgwMQotI2RlZmluZQlTTVNfUEYJMHgxMAotCXVpbnQ4X3QgdW51c2VkWzJdOwotCXVpbnQ4X3QgbGVuZ3RoOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX21vZGVfc2VsZWN0XzEwCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsJCS8qIHNhbWUgYml0cyBhcyBzbWFsbCB2ZXJzaW9uICovCi0JdWludDhfdCB1bnVzZWRbNV07Ci0JdWludDhfdCBsZW5ndGhbMl07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotLyoKLSAqIFdoZW4gc2VuZGluZyBhIG1vZGUgc2VsZWN0IHRvIGEgdGFwZSBkcml2ZSwgdGhlIG1lZGl1bSB0eXBlIG11c3QgYmUgMC4KLSAqLwotc3RydWN0IHNjc2lfbW9kZV9oZHJfNgotewotCXVpbnQ4X3QgZGF0YWxlbjsKLQl1aW50OF90IG1lZGl1bV90eXBlOwotCXVpbnQ4X3QgZGV2X3NwZWNpZmljOwotCXVpbnQ4X3QgYmxvY2tfZGVzY3JfbGVuOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9oZHJfMTAKLXsKLQl1aW50OF90IGRhdGFsZW5bMl07Ci0JdWludDhfdCBtZWRpdW1fdHlwZTsKLQl1aW50OF90IGRldl9zcGVjaWZpYzsKLQl1aW50OF90IHJlc2VydmVkWzJdOwotCXVpbnQ4X3QgYmxvY2tfZGVzY3JfbGVuWzJdOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9ibG9ja19kZXNjcgotewotCXVpbnQ4X3QgZGVuc2l0eV9jb2RlOwotCXVpbnQ4X3QgbnVtX2Jsb2Nrc1szXTsKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgYmxvY2tfbGVuWzNdOwotfTsKLQotc3RydWN0IHNjc2lfbG9nX3NlbnNlCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLSNkZWZpbmUJU0xTX1NQCQkJCTB4MDEKLSNkZWZpbmUJU0xTX1BQQwkJCQkweDAyCi0JdWludDhfdCBwYWdlOwotI2RlZmluZQlTTFNfUEFHRV9DT0RFIAkJCTB4M0YKLSNkZWZpbmUJU0xTX0FMTF9QQUdFU19QQUdFCQkweDAwCi0jZGVmaW5lCVNMU19PVkVSUlVOX1BBR0UJCTB4MDEKLSNkZWZpbmUJU0xTX0VSUk9SX1dSSVRFX1BBR0UJCTB4MDIKLSNkZWZpbmUJU0xTX0VSUk9SX1JFQURfUEFHRQkJMHgwMwotI2RlZmluZQlTTFNfRVJST1JfUkVBRFJFVkVSU0VfUEFHRQkweDA0Ci0jZGVmaW5lCVNMU19FUlJPUl9WRVJJRllfUEFHRQkJMHgwNQotI2RlZmluZQlTTFNfRVJST1JfTk9OTUVESVVNX1BBR0UJMHgwNgotI2RlZmluZQlTTFNfRVJST1JfTEFTVE5fUEFHRQkJMHgwNwotI2RlZmluZQlTTFNfUEFHRV9DVFJMX01BU0sJCTB4QzAKLSNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9USFJFU0hPTEQJCTB4MDAKLSNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9DVU1VTEFUSVZFCTB4NDAKLSNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9USFJFU0hfREVGQVVMVAkweDgwCi0jZGVmaW5lCVNMU19QQUdFX0NUUkxfQ1VNVUxfREVGQVVMVAkweEMwCi0JdWludDhfdCByZXNlcnZlZFsyXTsKLQl1aW50OF90IHBhcmFtcHRyWzJdOwotCXVpbnQ4X3QgbGVuZ3RoWzJdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX2xvZ19zZWxlY3QKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotLyoJU0xTX1NQCQkJCTB4MDEgKi8KLSNkZWZpbmUJU0xTX1BDUgkJCQkweDAyCi0JdWludDhfdCBwYWdlOwotLyoJU0xTX1BBR0VfQ1RSTF9NQVNLCQkweEMwICovCi0vKglTTFNfUEFHRV9DVFJMX1RIUkVTSE9MRAkJMHgwMCAqLwotLyoJU0xTX1BBR0VfQ1RSTF9DVU1VTEFUSVZFCTB4NDAgKi8KLS8qCVNMU19QQUdFX0NUUkxfVEhSRVNIX0RFRkFVTFQJMHg4MCAqLwotLyoJU0xTX1BBR0VfQ1RSTF9DVU1VTF9ERUZBVUxUCTB4QzAgKi8KLQl1aW50OF90IHJlc2VydmVkWzRdOwotCXVpbnQ4X3QgbGVuZ3RoWzJdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX2xvZ19oZWFkZXIKLXsKLQl1aW50OF90IHBhZ2U7Ci0JdWludDhfdCByZXNlcnZlZDsKLQl1aW50OF90IGRhdGFsZW5bMl07Ci19OwotCi1zdHJ1Y3Qgc2NzaV9sb2dfcGFyYW1faGVhZGVyIHsKLQl1aW50OF90IHBhcmFtX2NvZGVbMl07Ci0JdWludDhfdCBwYXJhbV9jb250cm9sOwotI2RlZmluZQlTTFBfTFAJCQkJMHgwMQotI2RlZmluZQlTTFBfTEJJTgkJCTB4MDIKLSNkZWZpbmUJU0xQX1RNQ19NQVNLCQkJMHgwQwotI2RlZmluZQlTTFBfVE1DX0FMV0FZUwkJCTB4MDAKLSNkZWZpbmUJU0xQX1RNQ19FUVVBTAkJCTB4MDQKLSNkZWZpbmUJU0xQX1RNQ19OT1RFUVVBTAkJMHgwOAotI2RlZmluZQlTTFBfVE1DX0dSRUFURVIJCQkweDBDCi0jZGVmaW5lCVNMUF9FVEMJCQkJMHgxMAotI2RlZmluZQlTTFBfVFNECQkJCTB4MjAKLSNkZWZpbmUJU0xQX0RTCQkJCTB4NDAKLSNkZWZpbmUJU0xQX0RVCQkJCTB4ODAKLQl1aW50OF90IHBhcmFtX2xlbjsKLX07Ci0KLXN0cnVjdCBzY3NpX2NvbnRyb2xfcGFnZSB7Ci0JdWludDhfdCBwYWdlX2NvZGU7Ci0JdWludDhfdCBwYWdlX2xlbmd0aDsKLQl1aW50OF90IHJsZWM7Ci0jZGVmaW5lIFNDQl9STEVDCQkJMHgwMQkvKlJlcG9ydCBMb2cgRXhjZXB0aW9uIENvbmQqLwotCXVpbnQ4X3QgcXVldWVfZmxhZ3M7Ci0jZGVmaW5lIFNDUF9RVUVVRV9BTEdfTUFTSwkJMHhGMAotI2RlZmluZSBTQ1BfUVVFVUVfQUxHX1JFU1RSSUNURUQJMHgwMAotI2RlZmluZSBTQ1BfUVVFVUVfQUxHX1VOUkVTVFJJQ1RFRAkweDEwCi0jZGVmaW5lIFNDUF9RVUVVRV9FUlIJCQkweDAyCS8qUXVldWVkIEkvTyBhYm9ydGVkIGZvciBDQUNzKi8KLSNkZWZpbmUgU0NQX1FVRVVFX0RRVUUJCQkweDAxCS8qUXVldWVkIEkvTyBkaXNhYmxlZCovCi0JdWludDhfdCBlY2FfYW5kX2FlbjsKLSNkZWZpbmUgU0NQX0VFQ0EJCQkweDgwCS8qRW5hYmxlIEV4dGVuZGVkIENBKi8KLSNkZWZpbmUgU0NQX1JBRU5QCQkJMHgwNAkvKlJlYWR5IEFFTiBQZXJtaXNzaW9uKi8KLSNkZWZpbmUgU0NQX1VBQUVOUAkJCTB4MDIJLypVQSBBRU4gUGVybWlzc2lvbiovCi0jZGVmaW5lIFNDUF9FQUVOUAkJCTB4MDEJLypFcnJvciBBRU4gUGVybWlzc2lvbiovCi0JdWludDhfdCByZXNlcnZlZDsKLQl1aW50OF90IGFlbl9ob2xkb2ZmX3BlcmlvZFsyXTsKLX07Ci0KLXN0cnVjdCBzY3NpX3Jlc2VydmUKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgdW51c2VkWzJdOwotCXVpbnQ4X3QgbGVuZ3RoOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3JlbGVhc2UKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgdW51c2VkWzJdOwotCXVpbnQ4X3QgbGVuZ3RoOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3ByZXZlbnQKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgdW51c2VkWzJdOwotCXVpbnQ4X3QgaG93OwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0jZGVmaW5lCVBSX1BSRVZFTlQgMHgwMQotI2RlZmluZSBQUl9BTExPVyAgIDB4MDAKLQotc3RydWN0IHNjc2lfc3luY19jYWNoZQotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCBiZWdpbl9sYmFbNF07Ci0JdWludDhfdCByZXNlcnZlZDsKLQl1aW50OF90IGxiX2NvdW50WzJdOwotCXVpbnQ4X3QgY29udHJvbDsJCi19OwotCi0KLXN0cnVjdCBzY3NpX2NoYW5nZWRlZgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCB1bnVzZWQxOwotCXVpbnQ4X3QgaG93OwotCXVpbnQ4X3QgdW51c2VkWzRdOwotCXVpbnQ4X3QgZGF0YWxlbjsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9yZWFkX2J1ZmZlcgotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0jZGVmaW5lCVJXQl9NT0RFCQkweDA3Ci0jZGVmaW5lCVJXQl9NT0RFX0hEUl9EQVRBCTB4MDAKLSNkZWZpbmUJUldCX01PREVfREFUQQkJMHgwMgotI2RlZmluZQlSV0JfTU9ERV9ET1dOTE9BRAkweDA0Ci0jZGVmaW5lCVJXQl9NT0RFX0RPV05MT0FEX1NBVkUJMHgwNQotICAgICAgICB1aW50OF90IGJ1ZmZlcl9pZDsKLSAgICAgICAgdWludDhfdCBvZmZzZXRbM107Ci0gICAgICAgIHVpbnQ4X3QgbGVuZ3RoWzNdOwotICAgICAgICB1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV93cml0ZV9idWZmZXIKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotCXVpbnQ4X3QgYnVmZmVyX2lkOwotCXVpbnQ4X3Qgb2Zmc2V0WzNdOwotCXVpbnQ4X3QgbGVuZ3RoWzNdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3J3XzYKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGFkZHJbM107Ci0vKiBvbmx5IDUgYml0cyBhcmUgdmFsaWQgaW4gdGhlIE1TQiBhZGRyZXNzIGJ5dGUgKi8KLSNkZWZpbmUJU1JXX1RPUEFERFIJMHgxRgotCXVpbnQ4X3QgbGVuZ3RoOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3J3XzEwCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0jZGVmaW5lCVNSVzEwX1JFTEFERFIJMHgwMQotI2RlZmluZSBTUlcxMF9GVUEJMHgwOAotI2RlZmluZQlTUlcxMF9EUE8JMHgxMAotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCBhZGRyWzRdOwotCXVpbnQ4X3QgcmVzZXJ2ZWQ7Ci0JdWludDhfdCBsZW5ndGhbMl07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcndfMTIKLXsKLQl1aW50OF90IG9wY29kZTsKLSNkZWZpbmUJU1JXMTJfUkVMQUREUgkweDAxCi0jZGVmaW5lIFNSVzEyX0ZVQQkweDA4Ci0jZGVmaW5lCVNSVzEyX0RQTwkweDEwCi0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IGFkZHJbNF07Ci0JdWludDhfdCBsZW5ndGhbNF07Ci0JdWludDhfdCByZXNlcnZlZDsKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9zdGFydF9zdG9wX3VuaXQKLXsKLQl1aW50OF90IG9wY29kZTsKLQl1aW50OF90IGJ5dGUyOwotI2RlZmluZQlTU1NfSU1NRUQJCTB4MDEKLQl1aW50OF90IHJlc2VydmVkWzJdOwotCXVpbnQ4X3QgaG93OwotI2RlZmluZQlTU1NfU1RBUlQJCTB4MDEKLSNkZWZpbmUJU1NTX0xPRUoJCTB4MDIKLQl1aW50OF90IGNvbnRyb2w7Ci19OwotCi0jZGVmaW5lIFNDX1NDU0lfMSAweDAxCi0jZGVmaW5lIFNDX1NDU0lfMiAweDAzCi0KLS8qCi0gKiBPcGNvZGVzCi0gKi8KLQotI2RlZmluZQlURVNUX1VOSVRfUkVBRFkJCTB4MDAKLSNkZWZpbmUgUkVRVUVTVF9TRU5TRQkJMHgwMwotI2RlZmluZQlSRUFEXzYJCQkweDA4Ci0jZGVmaW5lIFdSSVRFXzYJCQkweDBhCi0jZGVmaW5lIElOUVVJUlkJCQkweDEyCi0jZGVmaW5lIE1PREVfU0VMRUNUXzYJCTB4MTUKLSNkZWZpbmUgTU9ERV9TRU5TRV82CQkweDFhCi0jZGVmaW5lIFNUQVJUX1NUT1BfVU5JVAkJMHgxYgotI2RlZmluZSBTVEFSVF9TVE9QCQkweDFiCi0jZGVmaW5lIFJFU0VSVkUgICAgICAJCTB4MTYKLSNkZWZpbmUgUkVMRUFTRSAgICAgIAkJMHgxNwotI2RlZmluZQlSRUNFSVZFX0RJQUdOT1NUSUMJMHgxYwotI2RlZmluZQlTRU5EX0RJQUdOT1NUSUMJCTB4MWQKLSNkZWZpbmUgUFJFVkVOVF9BTExPVwkJMHgxZQotI2RlZmluZQlSRUFEX0NBUEFDSVRZCQkweDI1Ci0jZGVmaW5lCVJFQURfMTAJCQkweDI4Ci0jZGVmaW5lIFdSSVRFXzEwCQkweDJhCi0jZGVmaW5lIFBPU0lUSU9OX1RPX0VMRU1FTlQJMHgyYgotI2RlZmluZQlTWU5DSFJPTklaRV9DQUNIRQkweDM1Ci0jZGVmaW5lCVdSSVRFX0JVRkZFUiAgICAgICAgICAgIDB4M2IKLSNkZWZpbmUJUkVBRF9CVUZGRVIgICAgICAgICAgICAgMHgzYwotI2RlZmluZQlDSEFOR0VfREVGSU5JVElPTgkweDQwCi0jZGVmaW5lCUxPR19TRUxFQ1QJCTB4NGMKLSNkZWZpbmUJTE9HX1NFTlNFCQkweDRkCi0jaWZkZWYgWFhYQ0FNCi0jZGVmaW5lCU1PREVfU0VOU0VfMTAJCTB4NUEKLSNlbmRpZgotI2RlZmluZQlNT0RFX1NFTEVDVF8xMAkJMHg1NQotI2RlZmluZSBNT1ZFX01FRElVTSAgICAgCTB4YTUKLSNkZWZpbmUgUkVBRF8xMgkJCTB4YTgKLSNkZWZpbmUgV1JJVEVfMTIJCTB4YWEKLSNkZWZpbmUgUkVBRF9FTEVNRU5UX1NUQVRVUwkweGI4Ci0KLQotLyoKLSAqIERldmljZSBUeXBlcwotICovCi0jZGVmaW5lIFRfRElSRUNUCTB4MDAKLSNkZWZpbmUgVF9TRVFVRU5USUFMCTB4MDEKLSNkZWZpbmUgVF9QUklOVEVSCTB4MDIKLSNkZWZpbmUgVF9QUk9DRVNTT1IJMHgwMwotI2RlZmluZSBUX1dPUk0JCTB4MDQKLSNkZWZpbmUgVF9DRFJPTQkJMHgwNQotI2RlZmluZSBUX1NDQU5ORVIgCTB4MDYKLSNkZWZpbmUgVF9PUFRJQ0FMIAkweDA3Ci0jZGVmaW5lIFRfQ0hBTkdFUgkweDA4Ci0jZGVmaW5lIFRfQ09NTQkJMHgwOQotI2RlZmluZSBUX0FTQzAJCTB4MGEKLSNkZWZpbmUgVF9BU0MxCQkweDBiCi0jZGVmaW5lCVRfU1RPUkFSUkFZCTB4MGMKLSNkZWZpbmUJVF9FTkNMT1NVUkUJMHgwZAotI2RlZmluZQlUX1JCQwkJMHgwZQotI2RlZmluZQlUX09DUlcJCTB4MGYKLSNkZWZpbmUgVF9OT0RFVklDRQkweDFGCi0jZGVmaW5lCVRfQU5ZCQkweEZGCS8qIFVzZWQgaW4gUXVpcmsgdGFibGUgbWF0Y2hlcyAqLwotCi0jZGVmaW5lIFRfUkVNT1YJCTEKLSNkZWZpbmUJVF9GSVhFRAkJMAotCi0vKgotICogVGhpcyBsZW5ndGggaXMgdGhlIGluaXRpYWwgaW5xdWlyeSBsZW5ndGggdXNlZCBieSB0aGUgcHJvYmUgY29kZSwgYXMgICAgCi0gKiB3ZWxsIGFzIHRoZSBsZWdudGggbmVjZXNzYXJ5IGZvciBhaWNfcHJpbnRfaW5xdWlyeSgpIHRvIGZ1bmN0aW9uIAotICogY29ycmVjdGx5LiAgSWYgZWl0aGVyIHVzZSByZXF1aXJlcyBhIGRpZmZlcmVudCBsZW5ndGggaW4gdGhlIGZ1dHVyZSwgCi0gKiB0aGUgdHdvIHZhbHVlcyBzaG91bGQgYmUgZGUtY291cGxlZC4KLSAqLwotI2RlZmluZQlTSE9SVF9JTlFVSVJZX0xFTkdUSAkzNgotCi1zdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEKLXsKLQl1aW50OF90IGRldmljZTsKLSNkZWZpbmUJU0lEX1RZUEUoaW5xX2RhdGEpICgoaW5xX2RhdGEpLT5kZXZpY2UgJiAweDFmKQotI2RlZmluZQlTSURfUVVBTChpbnFfZGF0YSkgKCgoaW5xX2RhdGEpLT5kZXZpY2UgJiAweEUwKSA+PiA1KQotI2RlZmluZQlTSURfUVVBTF9MVV9DT05ORUNURUQJMHgwMAkvKgotCQkJCQkgKiBUaGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgZGV2aWNlCi0JCQkJCSAqIHR5cGUgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0bwotCQkJCQkgKiBsb2dpY2FsIHVuaXQuICBJZiB0aGUgdGFyZ2V0IGNhbm5vdAotCQkJCQkgKiBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBwaHlzaWNhbAotCQkJCQkgKiBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZCwgaXQKLQkJCQkJICogc2hhbGwgYWxzbyB1c2UgdGhpcyBwZXJpcGhlcmFsCi0JCQkJCSAqIHF1YWxpZmllciB3aGVuIHJldHVybmluZyB0aGUgSU5RVUlSWQotCQkJCQkgKiBkYXRhLiAgVGhpcyBwZXJpcGhlcmFsIHF1YWxpZmllcgotCQkJCQkgKiBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGRldmljZSBpcwotCQkJCQkgKiByZWFkeSBmb3IgYWNjZXNzIGJ5IHRoZSBpbml0aWF0b3IuCi0JCQkJCSAqLwotI2RlZmluZQlTSURfUVVBTF9MVV9PRkZMSU5FCTB4MDEJLyoKLQkJCQkJICogVGhlIHRhcmdldCBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcKLQkJCQkJICogdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGRldmljZSB0eXBlCi0JCQkJCSAqIG9uIHRoaXMgbG9naWNhbCB1bml0OyBob3dldmVyLCB0aGUKLQkJCQkJICogcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkKLQkJCQkJICogY29ubmVjdGVkIHRvIHRoaXMgbG9naWNhbCB1bml0LgotCQkJCQkgKi8KLSNkZWZpbmUgU0lEX1FVQUxfUlNWRAkJMHgwMgotI2RlZmluZQlTSURfUVVBTF9CQURfTFUJCTB4MDMJLyoKLQkJCQkJICogVGhlIHRhcmdldCBpcyBub3QgY2FwYWJsZSBvZgotCQkJCQkgKiBzdXBwb3J0aW5nIGEgcGh5c2ljYWwgZGV2aWNlIG9uCi0JCQkJCSAqIHRoaXMgbG9naWNhbCB1bml0LiBGb3IgdGhpcwotCQkJCQkgKiBwZXJpcGhlcmFsIHF1YWxpZmllciB0aGUgcGVyaXBoZXJhbAotCQkJCQkgKiBkZXZpY2UgdHlwZSBzaGFsbCBiZSBzZXQgdG8gMUZoIHRvCi0JCQkJCSAqIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzCi0JCQkJCSAqIHZlcnNpb25zIG9mIFNDU0kuIEFsbCBvdGhlcgotCQkJCQkgKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlIHZhbHVlcyBhcmUKLQkJCQkJICogcmVzZXJ2ZWQgZm9yIHRoaXMgcGVyaXBoZXJhbAotCQkJCQkgKiBxdWFsaWZpZXIuCi0JCQkJCSAqLwotI2RlZmluZQlTSURfUVVBTF9JU19WRU5ET1JfVU5JUVVFKGlucV9kYXRhKSAoKFNJRF9RVUFMKGlucV9kYXRhKSAmIDB4MDgpICE9IDApCi0JdWludDhfdCBkZXZfcXVhbDI7Ci0jZGVmaW5lCVNJRF9RVUFMMgkweDdGCi0jZGVmaW5lCVNJRF9JU19SRU1PVkFCTEUoaW5xX2RhdGEpICgoKGlucV9kYXRhKS0+ZGV2X3F1YWwyICYgMHg4MCkgIT0gMCkKLQl1aW50OF90IHZlcnNpb247Ci0jZGVmaW5lIFNJRF9BTlNJX1JFVihpbnFfZGF0YSkgKChpbnFfZGF0YSktPnZlcnNpb24gJiAweDA3KQogI2RlZmluZQkJU0NTSV9SRVZfMAkJMAogI2RlZmluZQkJU0NTSV9SRVZfQ0NTCQkxCiAjZGVmaW5lCQlTQ1NJX1JFVl8yCQkyCiAjZGVmaW5lCQlTQ1NJX1JFVl9TUEMJCTMKICNkZWZpbmUJCVNDU0lfUkVWX1NQQzIJCTQKIAotI2RlZmluZSBTSURfRUNNQQkweDM4Ci0jZGVmaW5lIFNJRF9JU08JCTB4QzAKLQl1aW50OF90IHJlc3BvbnNlX2Zvcm1hdDsKLSNkZWZpbmUgU0lEX0FFTkMJMHg4MAotI2RlZmluZSBTSURfVHJtSU9QCTB4NDAKLQl1aW50OF90IGFkZGl0aW9uYWxfbGVuZ3RoOwotCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07Ci0JdWludDhfdCBmbGFnczsKLSNkZWZpbmUJU0lEX1NmdFJlCTB4MDEKLSNkZWZpbmUJU0lEX0NtZFF1ZQkweDAyCi0jZGVmaW5lCVNJRF9MaW5rZWQJMHgwOAotI2RlZmluZQlTSURfU3luYwkweDEwCi0jZGVmaW5lCVNJRF9XQnVzMTYJMHgyMAotI2RlZmluZQlTSURfV0J1czMyCTB4NDAKLSNkZWZpbmUJU0lEX1JlbEFkcgkweDgwCi0jZGVmaW5lIFNJRF9WRU5ET1JfU0laRSAgIDgKLQljaGFyCSB2ZW5kb3JbU0lEX1ZFTkRPUl9TSVpFXTsKLSNkZWZpbmUgU0lEX1BST0RVQ1RfU0laRSAgMTYKLQljaGFyCSBwcm9kdWN0W1NJRF9QUk9EVUNUX1NJWkVdOwotI2RlZmluZSBTSURfUkVWSVNJT05fU0laRSA0Ci0JY2hhcgkgcmV2aXNpb25bU0lEX1JFVklTSU9OX1NJWkVdOwotCS8qCi0JICogVGhlIGZvbGxvd2luZyBmaWVsZHMgd2VyZSB0YWtlbiBmcm9tIFNDU0kgUHJpbWFyeSBDb21tYW5kcyAtIDIKLQkgKiAoU1BDLTIpIFJldmlzaW9uIDE0LCBEYXRlZCAxMSBOb3ZlbWJlciAxOTk5Ci0JICovCi0jZGVmaW5lCVNJRF9WRU5ET1JfU1BFQ0lGSUNfMF9TSVpFCTIwCi0JdWludDhfdCB2ZW5kb3Jfc3BlY2lmaWMwW1NJRF9WRU5ET1JfU1BFQ0lGSUNfMF9TSVpFXTsKLQkvKgotCSAqIEFuIGV4dGVuc2lvbiBvZiBTQ1NJIFBhcmFsbGVsIFNwZWNpZmljIFZhbHVlcwotCSAqLwotI2RlZmluZQlTSURfU1BJX0lVUwkJMHgwMQotI2RlZmluZQlTSURfU1BJX1FBUwkJMHgwMgotI2RlZmluZQlTSURfU1BJX0NMT0NLX1NUCTB4MDAKLSNkZWZpbmUJU0lEX1NQSV9DTE9DS19EVAkweDA0Ci0jZGVmaW5lCVNJRF9TUElfQ0xPQ0tfRFRfU1QJMHgwQwotI2RlZmluZQlTSURfU1BJX01BU0sJCTB4MEYKLQl1aW50OF90IHNwaTNkYXRhOwotCXVpbnQ4X3QgcmVzZXJ2ZWQyOwotCS8qCi0JICogVmVyc2lvbiBEZXNjcmlwdG9ycywgc3RvcmVkIDIgYnl0ZSB2YWx1ZXMuCi0JICovCi0JdWludDhfdCB2ZXJzaW9uMVsyXTsKLQl1aW50OF90IHZlcnNpb24yWzJdOwotCXVpbnQ4X3QgdmVyc2lvbjNbMl07Ci0JdWludDhfdCB2ZXJzaW9uNFsyXTsKLQl1aW50OF90IHZlcnNpb241WzJdOwotCXVpbnQ4X3QgdmVyc2lvbjZbMl07Ci0JdWludDhfdCB2ZXJzaW9uN1syXTsKLQl1aW50OF90IHZlcnNpb244WzJdOwotCi0JdWludDhfdCByZXNlcnZlZDNbMjJdOwotCi0jZGVmaW5lCVNJRF9WRU5ET1JfU1BFQ0lGSUNfMV9TSVpFCTE2MAotCXVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljMVtTSURfVkVORE9SX1NQRUNJRklDXzFfU0laRV07Ci19OwotCi1zdHJ1Y3Qgc2NzaV92cGRfdW5pdF9zZXJpYWxfbnVtYmVyCi17Ci0JdWludDhfdCBkZXZpY2U7Ci0JdWludDhfdCBwYWdlX2NvZGU7Ci0jZGVmaW5lIFNWUERfVU5JVF9TRVJJQUxfTlVNQkVSCTB4ODAKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgbGVuZ3RoOyAvKiBzZXJpYWwgbnVtYmVyIGxlbmd0aCAqLwotI2RlZmluZSBTVlBEX1NFUklBTF9OVU1fU0laRSAyNTEKLQl1aW50OF90IHNlcmlhbF9udW1bU1ZQRF9TRVJJQUxfTlVNX1NJWkVdOwotfTsKLQotc3RydWN0IHNjc2lfcmVhZF9jYXBhY2l0eQotewotCXVpbnQ4X3Qgb3Bjb2RlOwotCXVpbnQ4X3QgYnl0ZTI7Ci0JdWludDhfdCBhZGRyWzRdOwotCXVpbnQ4X3QgdW51c2VkWzNdOwotCXVpbnQ4X3QgY29udHJvbDsKLX07Ci0KLXN0cnVjdCBzY3NpX3JlYWRfY2FwYWNpdHlfZGF0YQotewotCXVpbnQ4X3QgYWRkcls0XTsKLQl1aW50OF90IGxlbmd0aFs0XTsKLX07Ci0KLXN0cnVjdCBzY3NpX3JlcG9ydF9sdW5zCi17Ci0JdWludDhfdCBvcGNvZGU7Ci0JdWludDhfdCBieXRlMjsKLQl1aW50OF90IHVudXNlZFszXTsKLQl1aW50OF90IGFkZHJbNF07Ci0JdWludDhfdCBjb250cm9sOwotfTsKLQotc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YSB7Ci0JdWludDhfdCBsZW5ndGhbNF07CS8qIGxlbmd0aCBvZiBMVU4gaW52ZW50b3J5LCBpbiBieXRlcyAqLwotCXVpbnQ4X3QgcmVzZXJ2ZWRbNF07CS8qIHVudXNlZCAqLwotCS8qCi0JICogTFVOIGludmVudG9yeS0gd2Ugb25seSBzdXBwb3J0IHRoZSB0eXBlIHplcm8gZm9ybSBmb3Igbm93LgotCSAqLwotCXN0cnVjdCB7Ci0JCXVpbnQ4X3QgbHVuZGF0YVs4XTsKLQl9IGx1bnNbMV07Ci19OwotI2RlZmluZQlSUExfTFVOREFUQV9BVFlQX01BU0sJMHhjMAkvKiBNQlogZm9yIHR5cGUgMCBsdW4gKi8KLSNkZWZpbmUJUlBMX0xVTkRBVEFfVDBMVU4JMQkvKiBAIGx1bmRhdGFbMV0gKi8KLQotCiBzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhCiB7CiAJdWludDhfdCBlcnJvcl9jb2RlOwpAQCAtNzU3LDQxICsxMTcsNiBAQAogI2RlZmluZSBTU0RfRlVMTF9TSVpFIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQogfTsKIAotc3RydWN0IHNjc2lfbW9kZV9oZWFkZXJfNgotewotCXVpbnQ4X3QgZGF0YV9sZW5ndGg7CS8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCi0JdWludDhfdCBtZWRpdW1fdHlwZTsKLQl1aW50OF90IGRldl9zcGVjOwotCXVpbnQ4X3QgYmxrX2Rlc2NfbGVuOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9oZWFkZXJfMTAKLXsKLQl1aW50OF90IGRhdGFfbGVuZ3RoWzJdOy8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCi0JdWludDhfdCBtZWRpdW1fdHlwZTsKLQl1aW50OF90IGRldl9zcGVjOwotCXVpbnQ4X3QgdW51c2VkWzJdOwotCXVpbnQ4X3QgYmxrX2Rlc2NfbGVuWzJdOwotfTsKLQotc3RydWN0IHNjc2lfbW9kZV9wYWdlX2hlYWRlcgotewotCXVpbnQ4X3QgcGFnZV9jb2RlOwotCXVpbnQ4X3QgcGFnZV9sZW5ndGg7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9tb2RlX2Jsa19kZXNjCi17Ci0JdWludDhfdCBkZW5zaXR5OwotCXVpbnQ4X3QgbmJsb2Nrc1szXTsKLQl1aW50OF90IHJlc2VydmVkOwotCXVpbnQ4X3QgYmxrbGVuWzNdOwotfTsKLQotI2RlZmluZQlTQ1NJX0RFRkFVTFRfREVOU0lUWQkweDAwCS8qIHVzZSAnZGVmYXVsdCcgZGVuc2l0eSAqLwotI2RlZmluZQlTQ1NJX1NBTUVfREVOU0lUWQkweDdmCS8qIHVzZSAnc2FtZScgZGVuc2l0eS0gPj0gU0NTSS0yIG9ubHkgKi8KLQotCiAvKgogICogU3RhdHVzIEJ5dGUKICAqLwpAQCAtODA3LDc2ICsxMzIsNyBAQAogI2RlZmluZSBTQ1NJX1NUQVRVU19BQ0FfQUNUSVZFCQkweDMwCiAjZGVmaW5lIFNDU0lfU1RBVFVTX1RBU0tfQUJPUlRFRAkweDQwCiAKLXN0cnVjdCBzY3NpX2lucXVpcnlfcGF0dGVybiB7Ci0JdWludDhfdCAgIHR5cGU7Ci0JdWludDhfdCAgIG1lZGlhX3R5cGU7Ci0jZGVmaW5lCVNJUF9NRURJQV9SRU1PVkFCTEUJMHgwMQotI2RlZmluZQlTSVBfTUVESUFfRklYRUQJCTB4MDIKLQljb25zdCBjaGFyICp2ZW5kb3I7Ci0JY29uc3QgY2hhciAqcHJvZHVjdDsKLQljb25zdCBjaGFyICpyZXZpc2lvbjsKLX07IAotCi1zdHJ1Y3Qgc2NzaV9zdGF0aWNfaW5xdWlyeV9wYXR0ZXJuIHsKLQl1aW50OF90ICAgdHlwZTsKLQl1aW50OF90ICAgbWVkaWFfdHlwZTsKLQljaGFyICAgICAgIHZlbmRvcltTSURfVkVORE9SX1NJWkUrMV07Ci0JY2hhciAgICAgICBwcm9kdWN0W1NJRF9QUk9EVUNUX1NJWkUrMV07Ci0JY2hhciAgICAgICByZXZpc2lvbltTSURfUkVWSVNJT05fU0laRSsxXTsKLX07Ci0KLXN0cnVjdCBzY3NpX3NlbnNlX3F1aXJrX2VudHJ5IHsKLQlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4JaW5xX3BhdDsKLQlpbnQJCQkJbnVtX3NlbnNlX2tleXM7Ci0JaW50CQkJCW51bV9hc2NzOwotCXN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkJKnNlbnNlX2tleV9pbmZvOwotCXN0cnVjdCBhc2NfdGFibGVfZW50cnkJCSphc2NfaW5mbzsKLX07Ci0KLXN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgewotCXVpbnQ4X3QgICAgc2Vuc2Vfa2V5OwotCXVpbnQzMl90ICAgYWN0aW9uOwotCWNvbnN0IGNoYXIgKmRlc2M7Ci19OwotCi1zdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5IHsKLQl1aW50OF90ICAgIGFzYzsKLQl1aW50OF90ICAgIGFzY3E7Ci0JdWludDMyX3QgICBhY3Rpb247Ci0JY29uc3QgY2hhciAqZGVzYzsKLX07Ci0KLXN0cnVjdCBvcF90YWJsZV9lbnRyeSB7Ci0JdWludDhfdCAgICBvcGNvZGU7Ci0JdWludDE2X3QgICBvcG1hc2s7Ci0JY29uc3QgY2hhciAgKmRlc2M7Ci19OwotCi1zdHJ1Y3Qgc2NzaV9vcF9xdWlya19lbnRyeSB7Ci0Jc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuCWlucV9wYXQ7Ci0JaW50CQkJCW51bV9vcHM7Ci0Jc3RydWN0IG9wX3RhYmxlX2VudHJ5CQkqb3BfdGFibGU7Ci19OwotCi10eXBlZGVmIGVudW0gewotCVNTU19GTEFHX05PTkUJCT0gMHgwMCwKLQlTU1NfRkxBR19QUklOVF9DT01NQU5ECT0gMHgwMQotfSBzY3NpX3NlbnNlX3N0cmluZ19mbGFnczsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnNjc2lfc2Vuc2Vfa2V5X3RleHRbXTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKiogTGFyZ2UgRGlzayBIYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLXN0YXRpYyBfX2lubGluZSBpbnQgYWljX3NlY3Rvcl9kaXYodV9sb25nIGNhcGFjaXR5LCBpbnQgaGVhZHMsIGludCBzZWN0b3JzKTsKLQotc3RhdGljIF9faW5saW5lIGludAotYWljX3NlY3Rvcl9kaXYodV9sb25nIGNhcGFjaXR5LCBpbnQgaGVhZHMsIGludCBzZWN0b3JzKQotewotCXJldHVybiAoY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKSk7Ci19Ci0jZWxzZQotc3RhdGljIF9faW5saW5lIGludCBhaWNfc2VjdG9yX2RpdihzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGhlYWRzLCBpbnQgc2VjdG9ycyk7Ci0KIHN0YXRpYyBfX2lubGluZSBpbnQKIGFpY19zZWN0b3JfZGl2KHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaGVhZHMsIGludCBzZWN0b3JzKQogewpAQCAtODg0LDE1MiArMTQwLDYgQEAKIAlzZWN0b3JfZGl2KGNhcGFjaXR5LCAoaGVhZHMgKiBzZWN0b3JzKSk7CiAJcmV0dXJuIChpbnQpY2FwYWNpdHk7CiB9Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogTW9kdWxlIExpYnJhcnkgSGFjayAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBXaGF0IHdlJ2QgbGlrZSB0byBkbyBpcyBoYXZlIGEgc2luZ2xlICJzY3NpIGxpYnJhcnkiIG1vZHVsZSB0aGF0IGJvdGggdGhlCi0gKiBhaWM3eHh4IGFuZCBhaWM3OXh4IGRyaXZlcnMgY291bGQgbG9hZCBhbmQgZGVwZW5kIG9uLiAgQSBjdXJzb3J5IGV4YW1pbmF0aW9uCi0gKiBvZiBpbXBsZW1lbnRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcyBpbiBMaW51eCAoaGFuZGxpbmcgdGhlIGluc3RhbGwgYW5kCi0gKiBpbml0cmQgY2FzZXMpIGRvZXMgbm90IGxvb2sgcHJvbWlzc2luZy4gIEZvciBub3csIHdlIGp1c3QgZHVwbGljYXRlIHRoaXMKLSAqIGNvZGUgaW4gYm90aCBkcml2ZXJzIHVzaW5nIGEgc2ltcGxlIHN5bWJvbCByZW5hbWluZyBzY2hlbWUgdGhhdCBoaWRlcyB0aGlzCi0gKiBoYWNrIGZyb20gdGhlIGRyaXZlcnMuCi0gKi8KLSNkZWZpbmUgQUlDX0xJQl9FTlRSWV9DT05DQVQoeCwgcHJlZml4KQlwcmVmaXggIyMgeAotI2RlZmluZQlBSUNfTElCX0VOVFJZX0VYUEFORCh4LCBwcmVmaXgpIEFJQ19MSUJfRU5UUllfQ09OQ0FUKHgsIHByZWZpeCkKLSNkZWZpbmUgQUlDX0xJQl9FTlRSWSh4KQkJQUlDX0xJQl9FTlRSWV9FWFBBTkQoeCwgQUlDX0xJQl9QUkVGSVgpCi0KLSNkZWZpbmUJYWljX3NlbnNlX2Rlc2MJCQlBSUNfTElCX0VOVFJZKF9zZW5zZV9kZXNjKQotI2RlZmluZQlhaWNfc2Vuc2VfZXJyb3JfYWN0aW9uCQlBSUNfTElCX0VOVFJZKF9zZW5zZV9lcnJvcl9hY3Rpb24pCi0jZGVmaW5lCWFpY19lcnJvcl9hY3Rpb24JCUFJQ19MSUJfRU5UUlkoX2Vycm9yX2FjdGlvbikKLSNkZWZpbmUJYWljX29wX2Rlc2MJCQlBSUNfTElCX0VOVFJZKF9vcF9kZXNjKQotI2RlZmluZQlhaWNfY2RiX3N0cmluZwkJCUFJQ19MSUJfRU5UUlkoX2NkYl9zdHJpbmcpCi0jZGVmaW5lIGFpY19wcmludF9pbnF1aXJ5CQlBSUNfTElCX0VOVFJZKF9wcmludF9pbnF1aXJ5KQotI2RlZmluZSBhaWNfY2FsY19zeW5jc3JhdGUJCUFJQ19MSUJfRU5UUlkoX2NhbGNfc3luY3JhdGUpCi0jZGVmaW5lCWFpY19jYWxjX3N5bmNwYXJhbQkJQUlDX0xJQl9FTlRSWShfY2FsY19zeW5jcGFyYW0pCi0jZGVmaW5lCWFpY19jYWxjX3NwZWVkCQkJQUlDX0xJQl9FTlRSWShfY2FsY19zcGVlZCkKLSNkZWZpbmUJYWljX2lucXVpcnlfbWF0Y2gJCUFJQ19MSUJfRU5UUlkoX2lucXVpcnlfbWF0Y2gpCi0jZGVmaW5lCWFpY19zdGF0aWNfaW5xdWlyeV9tYXRjaAlBSUNfTElCX0VOVFJZKF9zdGF0aWNfaW5xdWlyeV9tYXRjaCkKLSNkZWZpbmUJYWljX3BhcnNlX2JyYWNlX29wdGlvbgkJQUlDX0xJQl9FTlRSWShfcGFyc2VfYnJhY2Vfb3B0aW9uKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCQkJYWljX3NlbnNlX2Rlc2MoaW50IC8qc2Vuc2Vfa2V5Ki8sIGludCAvKmFzYyovLAotCQkJCSAgICAgICBpbnQgLyphc2NxKi8sIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIqKiAvKnNlbnNlX2tleV9kZXNjKi8sCi0JCQkJICAgICAgIGNvbnN0IGNoYXIqKiAvKmFzY19kZXNjKi8pOwotYWljX3NlbnNlX2FjdGlvbglhaWNfc2Vuc2VfZXJyb3JfYWN0aW9uKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEqLAotCQkJCQkgICAgICAgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhKiwKLQkJCQkJICAgICAgIHVpbnQzMl90IC8qc2Vuc2VfZmxhZ3MqLyk7Ci11aW50MzJfdAkJYWljX2Vycm9yX2FjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICosCi0JCQkJCSBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKiwKLQkJCQkJIGNhbV9zdGF0dXMsIHVfaW50KTsKLQotI2RlZmluZQlTRl9SRVRSWV9VQQkweDAxCi0jZGVmaW5lIFNGX05PX1BSSU5UCTB4MDIKLSNkZWZpbmUgU0ZfUVVJRVRfSVIJMHgwNAkvKiBCZSBxdWlldCBhYm91dCBJbGxlZ2FsIFJlcXVlc3QgcmVwb25zZXMgKi8KLSNkZWZpbmUgU0ZfUFJJTlRfQUxXQVlTCTB4MDgKLQotCi1jb25zdCBjaGFyICoJYWljX29wX2Rlc2ModWludDE2X3QgLypvcGNvZGUqLywgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhKik7Ci1jaGFyICoJCWFpY19jZGJfc3RyaW5nKHVpbnQ4X3QqIC8qY2RiX3B0ciovLCBjaGFyKiAvKmNkYl9zdHJpbmcqLywKLQkJCSAgICAgICBzaXplX3QgLypsZW4qLyk7Ci12b2lkCQlhaWNfcHJpbnRfaW5xdWlyeShzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEqKTsKLQotdV9pbnQJCWFpY19jYWxjX3N5bmNzcmF0ZSh1X2ludCAvKnBlcmlvZF9mYWN0b3IqLyk7Ci11X2ludAkJYWljX2NhbGNfc3luY3BhcmFtKHVfaW50IC8qcGVyaW9kKi8pOwotdV9pbnQJCWFpY19jYWxjX3NwZWVkKHVfaW50IHdpZHRoLCB1X2ludCBwZXJpb2QsIHVfaW50IG9mZnNldCwKLQkJCSAgICAgICB1X2ludCBtaW5fcmF0ZSk7Ci0JCi1pbnQJCWFpY19pbnF1aXJ5X21hdGNoKGNhZGRyX3QgLyppbnFidWZmZXIqLywKLQkJCQkgIGNhZGRyX3QgLyp0YWJsZV9lbnRyeSovKTsKLWludAkJYWljX3N0YXRpY19pbnF1aXJ5X21hdGNoKGNhZGRyX3QgLyppbnFidWZmZXIqLywKLQkJCQkJIGNhZGRyX3QgLyp0YWJsZV9lbnRyeSovKTsKLQotdHlwZWRlZiB2b2lkIGFpY19vcHRpb25fY2FsbGJhY2tfdCh1X2xvbmcsIGludCwgaW50LCBpbnQzMl90KTsKLWNoYXIgKgkJYWljX3BhcnNlX2JyYWNlX29wdGlvbihjaGFyICpvcHRfbmFtZSwgY2hhciAqb3B0X2FyZywKLQkJCQkgICAgICAgY2hhciAqZW5kLCBpbnQgZGVwdGgsCi0JCQkJICAgICAgIGFpY19vcHRpb25fY2FsbGJhY2tfdCAqLCB1X2xvbmcpOwotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAkgc2NzaV9leHRyYWN0X3NlbnNlKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlLAotCQkJCQkgICAgaW50ICplcnJvcl9jb2RlLCBpbnQgKnNlbnNlX2tleSwKLQkJCQkJICAgIGludCAqYXNjLCBpbnQgKmFzY3EpOwotc3RhdGljIF9faW5saW5lIHZvaWQJIHNjc2lfdWx0bzJiKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnl0ZXMpOwotc3RhdGljIF9faW5saW5lIHZvaWQJIHNjc2lfdWx0bzNiKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnl0ZXMpOwotc3RhdGljIF9faW5saW5lIHZvaWQJIHNjc2lfdWx0bzRiKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnl0ZXMpOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90IHNjc2lfMmJ0b3VsKHVpbnQ4X3QgKmJ5dGVzKTsKLXN0YXRpYyBfX2lubGluZSB1aW50MzJfdCBzY3NpXzNidG91bCh1aW50OF90ICpieXRlcyk7Ci1zdGF0aWMgX19pbmxpbmUgaW50MzJfdAkgc2NzaV8zYnRvbCh1aW50OF90ICpieXRlcyk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDMyX3Qgc2NzaV80YnRvdWwodWludDhfdCAqYnl0ZXMpOwotCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBzY3NpX2V4dHJhY3Rfc2Vuc2Uoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2UsCi0JCQkJICAgICAgIGludCAqZXJyb3JfY29kZSwgaW50ICpzZW5zZV9rZXksCi0JCQkJICAgICAgIGludCAqYXNjLCBpbnQgKmFzY3EpCi17Ci0JKmVycm9yX2NvZGUgPSBzZW5zZS0+ZXJyb3JfY29kZSAmIFNTRF9FUlJDT0RFOwotCSpzZW5zZV9rZXkgPSBzZW5zZS0+ZmxhZ3MgJiBTU0RfS0VZOwotCSphc2MgPSAoc2Vuc2UtPmV4dHJhX2xlbiA+PSA1KSA/IHNlbnNlLT5hZGRfc2Vuc2VfY29kZSA6IDA7Ci0JKmFzY3EgPSAoc2Vuc2UtPmV4dHJhX2xlbiA+PSA2KSA/IHNlbnNlLT5hZGRfc2Vuc2VfY29kZV9xdWFsIDogMDsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLXNjc2lfdWx0bzJiKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnl0ZXMpCi17Ci0KLQlieXRlc1swXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotCWJ5dGVzWzFdID0gdmFsICYgMHhmZjsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLXNjc2lfdWx0bzNiKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnl0ZXMpCi17Ci0KLQlieXRlc1swXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKLQlieXRlc1sxXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotCWJ5dGVzWzJdID0gdmFsICYgMHhmZjsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLXNjc2lfdWx0bzRiKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnl0ZXMpCi17Ci0KLQlieXRlc1swXSA9ICh2YWwgPj4gMjQpICYgMHhmZjsKLQlieXRlc1sxXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKLQlieXRlc1syXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotCWJ5dGVzWzNdID0gdmFsICYgMHhmZjsKLX0KLQotc3RhdGljIF9faW5saW5lIHVpbnQzMl90Ci1zY3NpXzJidG91bCh1aW50OF90ICpieXRlcykKLXsKLQl1aW50MzJfdCBydjsKLQotCXJ2ID0gKGJ5dGVzWzBdIDw8IDgpIHwKLQkgICAgIGJ5dGVzWzFdOwotCXJldHVybiAocnYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLXNjc2lfM2J0b3VsKHVpbnQ4X3QgKmJ5dGVzKQotewotCXVpbnQzMl90IHJ2OwotCi0JcnYgPSAoYnl0ZXNbMF0gPDwgMTYpIHwKLQkgICAgIChieXRlc1sxXSA8PCA4KSB8Ci0JICAgICBieXRlc1syXTsKLQlyZXR1cm4gKHJ2KTsKLX0KLQotc3RhdGljIF9faW5saW5lIGludDMyX3QgCi1zY3NpXzNidG9sKHVpbnQ4X3QgKmJ5dGVzKQotewotCXVpbnQzMl90IHJjID0gc2NzaV8zYnRvdWwoYnl0ZXMpOwotIAotCWlmIChyYyAmIDB4MDA4MDAwMDApCi0JCXJjIHw9IDB4ZmYwMDAwMDA7Ci0KLQlyZXR1cm4gKGludDMyX3QpIHJjOwotfQogCiBzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKIHNjc2lfNGJ0b3VsKHVpbnQ4X3QgKmJ5dGVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMgYi9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYwppbmRleCBkZWVjMGNlLi44N2UwYzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYwpAQCAtNjgsOCArNjgsOCBAQAogCVBJSVhfQ09NQl9QQVRBX1AwCT0gKDEgPDwgMSksCiAJUElJWF9DT01CCQk9ICgxIDw8IDIpLCAvKiBjb21iaW5lZCBtb2RlIGVuYWJsZWQ/ICovCiAKLQlQSUlYX1BPUlRfUFJFU0VOVAk9ICgxIDw8IDApLAotCVBJSVhfUE9SVF9FTkFCTEVECT0gKDEgPDwgNCksCisJUElJWF9QT1JUX0VOQUJMRUQJPSAoMSA8PCAwKSwKKwlQSUlYX1BPUlRfUFJFU0VOVAk9ICgxIDw8IDQpLAogCiAJUElJWF84MENfUFJJCQk9ICgxIDw8IDUpIHwgKDEgPDwgNCksCiAJUElJWF84MENfU0VDCQk9ICgxIDw8IDcpIHwgKDEgPDwgNiksCkBAIC0zNzcsNyArMzc3LDkgQEAKICAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCiAgKgogICoJUkVUVVJOUzoKLSAqCU5vbi16ZXJvIGlmIGRldmljZSBkZXRlY3RlZCwgemVybyBvdGhlcndpc2UuCisgKglOb24temVybyBpZiBwb3J0IGlzIGVuYWJsZWQsIGl0IG1heSBvciBtYXkgbm90IGhhdmUgYSBkZXZpY2UKKyAqCWF0dGFjaGVkIGluIHRoYXQgY2FzZSAoUFJFU0VOVCBiaXQgd291bGQgb25seSBiZSBzZXQgaWYgQklPUyBwcm9iZQorICoJd2FzIGRvbmUpLiBaZXJvIGlzIHJldHVybmVkIGlmIHBvcnQgaXMgZGlzYWJsZWQuCiAgKi8KIHN0YXRpYyBpbnQgcGlpeF9zYXRhX3Byb2JlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewpAQCAtNDAxLDcgKzQwMyw3IEBACiAJICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW1hc2sgPSAoUElJWF9QT1JUX1BSRVNFTlQgPDwgaSkgfCAoUElJWF9QT1JUX0VOQUJMRUQgPDwgaSk7CisJCW1hc2sgPSAoUElJWF9QT1JUX0VOQUJMRUQgPDwgaSk7CiAKIAkJaWYgKChvcmlnX21hc2sgJiBtYXNrKSA9PSBtYXNrKQogCQkJaWYgKGNvbWJpbmVkIHx8IChpID09IGFwLT5oYXJkX3BvcnRfbm8pKQpAQCAtNTY2LDE4ICs1NjgsNiBAQAogCX0KIH0KIAotLyogbW92ZSB0byBQQ0kgbGF5ZXIsIGludGVncmF0ZSB3LyBNU0kgc3R1ZmYgKi8KLXN0YXRpYyB2b2lkIHBjaV9lbmFibGVfaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQl1MTYgcGNpX2NvbW1hbmQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKLQlpZiAocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKLQkJcGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7Ci0JfQotfQotCiAjZGVmaW5lIEFIQ0lfUENJX0JBUiA1CiAjZGVmaW5lIEFIQ0lfR0xPQkFMX0NUTCAweDA0CiAjZGVmaW5lIEFIQ0lfRU5BQkxFICgxIDw8IDMxKQpAQCAtNjc1LDcgKzY2NSw3IEBACiAJICogbWVzc2FnZS1zaWduYWxsZWQgaW50ZXJydXB0cyBjdXJyZW50bHkpLgogCSAqLwogCWlmIChwb3J0X2luZm9bMF0tPmhvc3RfZmxhZ3MgJiBQSUlYX0ZMQUdfQ0hFQ0tJTlRSKQotCQlwY2lfZW5hYmxlX2ludHgocGRldik7CisJCXBjaV9pbnR4KHBkZXYsIDEpOwogCiAJaWYgKGNvbWJpbmVkKSB7CiAJCXBvcnRfaW5mb1tzYXRhX2NoYW5dID0gJnBpaXhfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NoLmMgYi9kcml2ZXJzL3Njc2kvY2guYwppbmRleCAzOTAwZTI4Li5kYTZlNTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY2guYworKysgYi9kcml2ZXJzL3Njc2kvY2guYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2hpby5oPgkJCS8qIGhlcmUgYXJlIGFsbCB0aGUgaW9jdGxzICovCkBAIC0zMSw3ICszMCw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CiAKICNkZWZpbmUgQ0hfRFRfTUFYICAgICAgIDE2CkBAIC0xMTcsNyArMTE2LDcgQEAKIH0gc2NzaV9jaGFuZ2VyOwogCiBzdGF0aWMgTElTVF9IRUFEKGNoX2Rldmxpc3QpOwotc3RhdGljIHNwaW5sb2NrX3QgY2hfZGV2bGlzdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhjaF9kZXZsaXN0X2xvY2spOwogc3RhdGljIGludCBjaF9kZXZjb3VudDsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2RyaXZlciBjaF90ZW1wbGF0ZSA9CkBAIC0xODEsMTcgKzE4MCwxNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgY2hfZmluZF9lcnJubyh1bnNpZ25lZCBjaGFyICpzZW5zZV9idWZmZXIpCitzdGF0aWMgaW50IGNoX2ZpbmRfZXJybm8oc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKIHsKIAlpbnQgaSxlcnJubyA9IDA7CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgYWRkaXRpb25hbCBzZW5zZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgKi8KLQlpZiAoc2Vuc2VfYnVmZmVyWzddICA+IDUgJiYKLQkgICAgc2Vuc2VfYnVmZmVyWzEyXSAhPSAwKSB7CisJaWYgKHNjc2lfc2Vuc2VfdmFsaWQoc3NoZHIpICYmCisJICAgIHNzaGRyLT5hc2MgIT0gMCkgewogCQlmb3IgKGkgPSAwOyBlcnJbaV0uZXJybm8gIT0gMDsgaSsrKSB7Ci0JCQlpZiAoZXJyW2ldLnNlbnNlID09IHNlbnNlX2J1ZmZlclsgMl0gJiYKLQkJCSAgICBlcnJbaV0uYXNjICAgPT0gc2Vuc2VfYnVmZmVyWzEyXSAmJgotCQkJICAgIGVycltpXS5hc2NxICA9PSBzZW5zZV9idWZmZXJbMTNdKSB7CisJCQlpZiAoZXJyW2ldLnNlbnNlID09IHNzaGRyLT5zZW5zZV9rZXkgJiYKKwkJCSAgICBlcnJbaV0uYXNjICAgPT0gc3NoZHItPmFzYyAmJgorCQkJICAgIGVycltpXS5hc2NxICA9PSBzc2hkci0+YXNjcSkgewogCQkJCWVycm5vID0gLWVycltpXS5lcnJubzsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTIwNywxMyArMjA2LDkgQEAKIAkgICB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1Zmxlbmd0aCwKIAkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JaW50IGVycm5vLCByZXRyaWVzID0gMCwgdGltZW91dDsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcjsKKwlpbnQgZXJybm8sIHJldHJpZXMgPSAwLCB0aW1lb3V0LCByZXN1bHQ7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCQotCXNyID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGNoLT5kZXZpY2UsIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IHNyKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXRpbWVvdXQgPSAoY21kWzBdID09IElOSVRJQUxJWkVfRUxFTUVOVF9TVEFUVVMpCiAJCT8gdGltZW91dF9pbml0IDogdGltZW91dF9tb3ZlOwogCkBAIC0yMjQsMTYgKzIxOSwxNyBAQAogCQlfX3Njc2lfcHJpbnRfY29tbWFuZChjbWQpOwogCX0KIAotICAgICAgICBzY3NpX3dhaXRfcmVxKHNyLCBjbWQsIGJ1ZmZlciwgYnVmbGVuZ3RoLAotCQkgICAgICB0aW1lb3V0ICogSFosIE1BWF9SRVRSSUVTKTsKKyAgICAgICAgcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShjaC0+ZGV2aWNlLCBjbWQsIGRpcmVjdGlvbiwgYnVmZmVyLAorCQkJCSAgYnVmbGVuZ3RoLCAmc3NoZHIsIHRpbWVvdXQgKiBIWiwKKwkJCQkgIE1BWF9SRVRSSUVTKTsKIAotCWRwcmludGsoInJlc3VsdDogMHgleFxuIixzci0+c3JfcmVzdWx0KTsKLQlpZiAoZHJpdmVyX2J5dGUoc3ItPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpIHsKKwlkcHJpbnRrKCJyZXN1bHQ6IDB4JXhcbiIscmVzdWx0KTsKKwlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgewogCQlpZiAoZGVidWcpCi0JCQlzY3NpX3ByaW50X3JlcV9zZW5zZShjaC0+bmFtZSwgc3IpOwotCQllcnJubyA9IGNoX2ZpbmRfZXJybm8oc3ItPnNyX3NlbnNlX2J1ZmZlcik7CisJCQlzY3NpX3ByaW50X3NlbnNlX2hkcihjaC0+bmFtZSwgJnNzaGRyKTsKKwkJZXJybm8gPSBjaF9maW5kX2Vycm5vKCZzc2hkcik7CiAKLQkJc3dpdGNoKHNyLT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweGYpIHsKKwkJc3dpdGNoKHNzaGRyLnNlbnNlX2tleSkgewogCQljYXNlIFVOSVRfQVRURU5USU9OOgogCQkJY2gtPnVuaXRfYXR0ZW50aW9uID0gMTsKIAkJCWlmIChyZXRyaWVzKysgPCAzKQpAQCAtMjQxLDcgKzIzNyw2IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcik7CiAJcmV0dXJuIGVycm5vOwogfQogCkBAIC01NjUsNyArNTYwLDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IGNoX2dzdGF0dXMoc2NzaV9jaGFuZ2VyICpjaCwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgKmRlc3QpCitzdGF0aWMgaW50IGNoX2dzdGF0dXMoc2NzaV9jaGFuZ2VyICpjaCwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgX191c2VyICpkZXN0KQogewogCWludCByZXR2YWwgPSAwOwogCXVfY2hhciBkYXRhWzE2XTsKQEAgLTYzOSw2ICs2MzQsNyBAQAogewogCXNjc2lfY2hhbmdlciAqY2ggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldHZhbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAkKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQ0hJT0dQQVJBTVM6CkBAIC02NTEsNyArNjQ3LDcgQEAKIAkJcGFyYW1zLmNwX25wb3J0YWxzICA9IGNoLT5jb3VudHNbQ0hFVF9JRV07CiAJCXBhcmFtcy5jcF9uZHJpdmVzICAgPSBjaC0+Y291bnRzW0NIRVRfRFRdOwogCQkKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjc2LDcgKzY3Miw3IEBACiAJCQl2cGFyYW1zLmN2cF9uNCAgPSBjaC0+Y291bnRzW0NIRVRfVjRdOwogCQkJc3RybmNweSh2cGFyYW1zLmN2cF9sYWJlbDQsdmVuZG9yX2xhYmVsc1szXSwxNik7CiAJCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZ2cGFyYW1zLCBzaXplb2YodnBhcmFtcykpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2cGFyYW1zLCBzaXplb2YodnBhcmFtcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTY4NSw3ICs2ODEsNyBAQAogCXsKIAkJc3RydWN0IGNoYW5nZXJfcG9zaXRpb24gcG9zOwogCQkKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwb3MsICh2b2lkKilhcmcsIHNpemVvZiAocG9zKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcG9zLCBhcmdwLCBzaXplb2YgKHBvcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKDAgIT0gY2hfY2hlY2tyYW5nZShjaCwgcG9zLmNwX3R5cGUsIHBvcy5jcF91bml0KSkgewpAQCAtNzA0LDcgKzcwMCw3IEBACiAJewogCQlzdHJ1Y3QgY2hhbmdlcl9tb3ZlIG12OwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmbXYsICh2b2lkKilhcmcsIHNpemVvZiAobXYpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtdiwgYXJncCwgc2l6ZW9mIChtdikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKDAgIT0gY2hfY2hlY2tyYW5nZShjaCwgbXYuY21fZnJvbXR5cGUsIG12LmNtX2Zyb211bml0KSB8fApAQCAtNzI2LDcgKzcyMiw3IEBACiAJewogCQlzdHJ1Y3QgY2hhbmdlcl9leGNoYW5nZSBtdjsKIAkJCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmbXYsICh2b2lkKilhcmcsIHNpemVvZiAobXYpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtdiwgYXJncCwgc2l6ZW9mIChtdikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKDAgIT0gY2hfY2hlY2tyYW5nZShjaCwgbXYuY2Vfc3JjdHlwZSwgIG12LmNlX3NyY3VuaXQgKSB8fApAQCAtNzUxLDcgKzc0Nyw3IEBACiAJewogCQlzdHJ1Y3QgY2hhbmdlcl9lbGVtZW50X3N0YXR1cyBjZXM7CiAJCQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNlcywgKHZvaWQqKWFyZywgc2l6ZW9mIChjZXMpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZXMsIGFyZ3AsIHNpemVvZiAoY2VzKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKGNlcy5jZXNfdHlwZSA8IDAgfHwgY2VzLmNlc190eXBlID49IENIX1RZUEVTKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NjcsNyArNzYzLDcgQEAKIAkJdW5zaWduZWQgaW50IGVsZW07CiAJCWludCAgICAgcmVzdWx0LGk7CiAJCQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNnZSwgKHZvaWQqKWFyZywgc2l6ZW9mIChjZ2UpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZ2UsIGFyZ3AsIHNpemVvZiAoY2dlKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlpZiAoMCAhPSBjaF9jaGVja3JhbmdlKGNoLCBjZ2UuY2dlX3R5cGUsIGNnZS5jZ2VfdW5pdCkpCkBAIC04MzAsNyArODI2LDcgQEAKIAkJa2ZyZWUoYnVmZmVyKTsKIAkJdXAoJmNoLT5sb2NrKTsKIAkJCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKWFyZywgJmNnZSwgc2l6ZW9mIChjZ2UpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2dlLCBzaXplb2YgKGNnZSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtODQ4LDcgKzg0NCw3IEBACiAJCXN0cnVjdCBjaGFuZ2VyX3NldF92b2x0YWcgY3N2OwogCQlpbnQgZWxlbTsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNzdiwgKHZvaWQqKWFyZywgc2l6ZW9mKGNzdikpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNzdiwgYXJncCwgc2l6ZW9mKGNzdikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKDAgIT0gY2hfY2hlY2tyYW5nZShjaCwgY3N2LmNzdl90eXBlLCBjc3YuY3N2X3VuaXQpKSB7CkBAIC04NjYsNyArODYyLDcgQEAKIAl9CiAKIAlkZWZhdWx0OgotCQlyZXR1cm4gc2NzaV9pb2N0bChjaC0+ZGV2aWNlLCBjbWQsICh2b2lkKilhcmcpOworCQlyZXR1cm4gc2NzaV9pb2N0bChjaC0+ZGV2aWNlLCBjbWQsIGFyZ3ApOwogCiAJfQogfQpAQCAtODk5LDkgKzg5NSw5IEBACiAJY2FzZSBDSElPR1NUQVRVUzMyOgogCXsKIAkJc3RydWN0IGNoYW5nZXJfZWxlbWVudF9zdGF0dXMzMiBjZXMzMjsKLQkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7CiAJCQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNlczMyLCAodm9pZCopYXJnLCBzaXplb2YgKGNlczMyKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2VzMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mIChjZXMzMikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmIChjZXMzMi5jZXNfdHlwZSA8IDAgfHwgY2VzMzIuY2VzX3R5cGUgPj0gQ0hfVFlQRVMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk0MCw4ICs5MzYsNiBAQAogCWlmIChpbml0KQogCQljaF9pbml0X2VsZW0oY2gpOwogCi0JZGV2ZnNfbWtfY2RldihNS0RFVihTQ1NJX0NIQU5HRVJfTUFKT1IsY2gtPm1pbm9yKSwKLQkJICAgICAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLCBjaC0+bmFtZSk7CiAJY2xhc3NfZGV2aWNlX2NyZWF0ZShjaF9zeXNmc19jbGFzcywKIAkJCSAgICBNS0RFVihTQ1NJX0NIQU5HRVJfTUFKT1IsY2gtPm1pbm9yKSwKIAkJCSAgICBkZXYsICJzJXMiLCBjaC0+bmFtZSk7CkBAIC05NzQsNyArOTY4LDYgQEAKIAogCWNsYXNzX2RldmljZV9kZXN0cm95KGNoX3N5c2ZzX2NsYXNzLAogCQkJICAgICBNS0RFVihTQ1NJX0NIQU5HRVJfTUFKT1IsY2gtPm1pbm9yKSk7Ci0JZGV2ZnNfcmVtb3ZlKGNoLT5uYW1lKTsKIAlrZnJlZShjaC0+ZHQpOwogCWtmcmVlKGNoKTsKIAljaF9kZXZjb3VudC0tOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCmluZGV4IGVjMTYxNzMuLmY2YmUyYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYworKysgYi9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgogCiAKIApAQCAtMTE1NSw2ICsxMTU2LDMxIEBACiAJfQogfQogCit2b2lkCitzY3NpX3ByaW50X3NlbnNlX2hkcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQoreworCWNvbnN0IGNoYXIgKnNlbnNlX3R4dDsKKwkvKiBBbiBleGFtcGxlIG9mIGRlZmVycmVkIGlzIHdoZW4gYW4gZWFybGllciB3cml0ZSB0byBkaXNrIGNhY2hlCisJICogc3VjY2VlZGVkLCBidXQgbm93IHRoZSBkaXNrIGRpc2NvdmVycyB0aGF0IGl0IGNhbm5vdCB3cml0ZSB0aGUKKwkgKiBkYXRhIHRvIHRoZSBtYWduZXRpYyBtZWRpYS4KKwkgKi8KKwljb25zdCBjaGFyICplcnJvciA9IHNjc2lfc2Vuc2VfaXNfZGVmZXJyZWQoc3NoZHIpID8gCisJCSI8PERFRkVSUkVEPj4iIDogIkN1cnJlbnQiOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyIsIG5hbWUsIGVycm9yKTsKKwlpZiAoc3NoZHItPnJlc3BvbnNlX2NvZGUgPj0gMHg3MikKKwkJcHJpbnRrKCIgW2Rlc2NyaXB0b3JdIik7CisKKwlzZW5zZV90eHQgPSBzY3NpX3NlbnNlX2tleV9zdHJpbmcoc3NoZHItPnNlbnNlX2tleSk7CisJaWYgKHNlbnNlX3R4dCkKKwkJcHJpbnRrKCI6IHNlbnNlIGtleTogJXNcbiIsIHNlbnNlX3R4dCk7CisJZWxzZQorCQlwcmludGsoIjogc2Vuc2Uga2V5PTB4JXhcbiIsIHNzaGRyLT5zZW5zZV9rZXkpOworCXByaW50ayhLRVJOX0lORk8gIiAgICAiKTsKKwlzY3NpX3Nob3dfZXh0ZF9zZW5zZShzc2hkci0+YXNjLCBzc2hkci0+YXNjcSk7CisJcHJpbnRrKCJcbiIpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3ByaW50X3NlbnNlX2hkcik7CisKIC8qIFByaW50IHNlbnNlIGluZm9ybWF0aW9uICovCiB2b2lkCiBfX3Njc2lfcHJpbnRfc2Vuc2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2Vuc2VfYnVmZmVyLApAQCAtMTE2Miw4ICsxMTg4LDYgQEAKIHsKIAlpbnQgaywgbnVtLCByZXM7CiAJdW5zaWduZWQgaW50IGluZm87Ci0JY29uc3QgY2hhciAqZXJyb3I7Ci0JY29uc3QgY2hhciAqc2Vuc2VfdHh0OwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2g7CiAgICAgCiAJcmVzID0gc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2Vuc2VfYnVmZmVyLCBzZW5zZV9sZW4sICZzc2gpOwpAQCAtMTE4MSwyNiArMTIwNSw3IEBACiAJCXByaW50aygiXG4iKTsKIAkJcmV0dXJuOwogCX0KLQotCS8qIEFuIGV4YW1wbGUgb2YgZGVmZXJyZWQgaXMgd2hlbiBhbiBlYXJsaWVyIHdyaXRlIHRvIGRpc2sgY2FjaGUKLQkgKiBzdWNjZWVkZWQsIGJ1dCBub3cgdGhlIGRpc2sgZGlzY292ZXJzIHRoYXQgaXQgY2Fubm90IHdyaXRlIHRoZQotCSAqIGRhdGEgdG8gdGhlIG1hZ25ldGljIG1lZGlhLgotCSAqLwotCWVycm9yID0gc2NzaV9zZW5zZV9pc19kZWZlcnJlZCgmc3NoKSA/IAotCQkJIjw8REVGRVJSRUQ+PiIgOiAiQ3VycmVudCI7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIiwgbmFtZSwgZXJyb3IpOwotCWlmIChzc2gucmVzcG9uc2VfY29kZSA+PSAweDcyKQotCQlwcmludGsoIiBbZGVzY3JpcHRvcl0iKTsKLQotCXNlbnNlX3R4dCA9IHNjc2lfc2Vuc2Vfa2V5X3N0cmluZyhzc2guc2Vuc2Vfa2V5KTsKLQlpZiAoc2Vuc2VfdHh0KQotCQlwcmludGsoIjogc2Vuc2Uga2V5OiAlc1xuIiwgc2Vuc2VfdHh0KTsKLQllbHNlCi0JCXByaW50aygiOiBzZW5zZSBrZXk9MHgleFxuIiwgc3NoLnNlbnNlX2tleSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICIpOwotCXNjc2lfc2hvd19leHRkX3NlbnNlKHNzaC5hc2MsIHNzaC5hc2NxKTsKLQlwcmludGsoIlxuIik7Ci0KKwlzY3NpX3ByaW50X3NlbnNlX2hkcihuYW1lLCAmc3NoKTsKIAlpZiAoc3NoLnJlc3BvbnNlX2NvZGUgPCAweDcyKSB7CiAJCS8qIG9ubHkgZGVjb2RlIGV4dHJhcyBmb3IgImZpeGVkIiBmb3JtYXQgbm93ICovCiAJCWNoYXIgYnVmZls4MF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU2luaXQuYyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW5pdC5jCmluZGV4IGQ3MmJlMGMuLjNmZGE4ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW5pdC5jCkBAIC02OTEsOCArNjkxLDcgQEAKICAgICAgICAgaWYoICBjb3B5X3RvX3VzZXIoIHZlbmRvcl9jbWQtPmJ1ZnAsIGJ1ZiwgdmVuZG9yX2NtZC0+bGVuKSkKIAkJcmVzdWx0ID0gLUVGQVVMVDsKIAotICAgICAgICBpZiggYnVmKSAKLQkgIGtmcmVlKCBidWYpOworCWtmcmVlKGJ1Zik7CiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggNWZlYjg4Ni4uODU1MDNmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01MiwyMSArNTMsODAgQEAKIH07CiAKIC8qKgotICogc2NzaV9ob3N0X2NhbmNlbCAtIGNhbmNlbCBvdXRzdGFuZGluZyBJTyB0byB0aGlzIGhvc3QKLSAqIEBzaG9zdDoJcG9pbnRlciB0byBzdHJ1Y3QgU2NzaV9Ib3N0Ci0gKiByZWNvdmVyeToJcmVjb3ZlcnkgcmVxdWVzdGVkIHRvIHJ1bi4KKyAqCXNjc2lfaG9zdF9zZXRfc3RhdGUgLSBUYWtlIHRoZSBnaXZlbiBob3N0IHRocm91Z2ggdGhlIGhvc3QKKyAqCQlzdGF0ZSBtb2RlbC4KKyAqCUBzaG9zdDoJc2NzaSBob3N0IHRvIGNoYW5nZSB0aGUgc3RhdGUgb2YuCisgKglAc3RhdGU6CXN0YXRlIHRvIGNoYW5nZSB0by4KKyAqCisgKglSZXR1cm5zIHplcm8gaWYgdW5zdWNjZXNzZnVsIG9yIGFuIGVycm9yIGlmIHRoZSByZXF1ZXN0ZWQKKyAqCXRyYW5zaXRpb24gaXMgaWxsZWdhbC4KICAqKi8KLXN0YXRpYyB2b2lkIHNjc2lfaG9zdF9jYW5jZWwoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCByZWNvdmVyeSkKK2ludCBzY3NpX2hvc3Rfc2V0X3N0YXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBlbnVtIHNjc2lfaG9zdF9zdGF0ZSBzdGF0ZSkKIHsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJZW51bSBzY3NpX2hvc3Rfc3RhdGUgb2xkc3RhdGUgPSBzaG9zdC0+c2hvc3Rfc3RhdGU7CiAKLQlzZXRfYml0KFNIT1NUX0NBTkNFTCwgJnNob3N0LT5zaG9zdF9zdGF0ZSk7Ci0Jc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7Ci0JCXNjc2lfZGV2aWNlX2NhbmNlbChzZGV2LCByZWNvdmVyeSk7CisJaWYgKHN0YXRlID09IG9sZHN0YXRlKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNIT1NUX0NSRUFURUQ6CisJCS8qIFRoZXJlIGFyZSBubyBsZWdhbCBzdGF0ZXMgdGhhdCBjb21lIGJhY2sgdG8KKwkJICogY3JlYXRlZC4gIFRoaXMgaXMgdGhlIG1hbnVhbGx5IGluaXRpYWxpc2VkIHN0YXJ0CisJCSAqIHN0YXRlICovCisJCWdvdG8gaWxsZWdhbDsKKworCWNhc2UgU0hPU1RfUlVOTklORzoKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNIT1NUX0NSRUFURUQ6CisJCWNhc2UgU0hPU1RfUkVDT1ZFUlk6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0hPU1RfUkVDT1ZFUlk6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTSE9TVF9SVU5OSU5HOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNIT1NUX0NBTkNFTDoKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNIT1NUX0NSRUFURUQ6CisJCWNhc2UgU0hPU1RfUlVOTklORzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbGxlZ2FsOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSE9TVF9ERUw6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTSE9TVF9DQU5DRUw6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKwogCX0KLQl3YWl0X2V2ZW50KHNob3N0LT5ob3N0X3dhaXQsICghdGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksCi0JCQkJCQkmc2hvc3QtPnNob3N0X3N0YXRlKSkpOworCXNob3N0LT5zaG9zdF9zdGF0ZSA9IHN0YXRlOworCXJldHVybiAwOworCisgaWxsZWdhbDoKKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgxLAorCQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZzaG9zdC0+c2hvc3RfZ2VuZGV2LAorCQkJCQkgICAiSWxsZWdhbCBob3N0IHN0YXRlIHRyYW5zaXRpb24iCisJCQkJCSAgICIlcy0+JXNcbiIsCisJCQkJCSAgIHNjc2lfaG9zdF9zdGF0ZV9uYW1lKG9sZHN0YXRlKSwKKwkJCQkJICAgc2NzaV9ob3N0X3N0YXRlX25hbWUoc3RhdGUpKSk7CisJcmV0dXJuIC1FSU5WQUw7CiB9CitFWFBPUlRfU1lNQk9MKHNjc2lfaG9zdF9zZXRfc3RhdGUpOwogCiAvKioKICAqIHNjc2lfcmVtb3ZlX2hvc3QgLSByZW1vdmUgYSBzY3NpIGhvc3QKQEAgLTc0LDExICsxMzQsMTMgQEAKICAqKi8KIHZvaWQgc2NzaV9yZW1vdmVfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKKwlkb3duKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgU0hPU1RfQ0FOQ0VMKTsKKwl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCXNjc2lfZm9yZ2V0X2hvc3Qoc2hvc3QpOwotCXNjc2lfaG9zdF9jYW5jZWwoc2hvc3QsIDApOwogCXNjc2lfcHJvY19ob3N0X3JtKHNob3N0KTsKIAotCXNldF9iaXQoU0hPU1RfREVMLCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKwlzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9ERUwpOwogCiAJdHJhbnNwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKIAljbGFzc19kZXZpY2VfdW5yZWdpc3Rlcigmc2hvc3QtPnNob3N0X2NsYXNzZGV2KTsKQEAgLTExNSw3ICsxNzcsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQlzZXRfYml0KFNIT1NUX0FERCwgJnNob3N0LT5zaG9zdF9zdGF0ZSk7CisJc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgU0hPU1RfUlVOTklORyk7CiAJZ2V0X2RldmljZShzaG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudCk7CiAKIAllcnJvciA9IGNsYXNzX2RldmljZV9hZGQoJnNob3N0LT5zaG9zdF9jbGFzc2Rldik7CkBAIC0xNjQsMTUgKzIyNiw4IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtPnBhcmVudDsKIAotCWlmIChzaG9zdC0+ZWhhbmRsZXIpIHsKLQkJREVDTEFSRV9DT01QTEVUSU9OKHNlbSk7Ci0JCXNob3N0LT5laF9ub3RpZnkgPSAmc2VtOwotCQlzaG9zdC0+ZWhfa2lsbCA9IDE7Ci0JCXVwKHNob3N0LT5laF93YWl0KTsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmc2VtKTsKLQkJc2hvc3QtPmVoX25vdGlmeSA9IE5VTEw7Ci0JfQotCisJaWYgKHNob3N0LT5laGFuZGxlcikKKwkJa3RocmVhZF9zdG9wKHNob3N0LT5laGFuZGxlcik7CiAJaWYgKHNob3N0LT53b3JrX3EpCiAJCWRlc3Ryb3lfd29ya3F1ZXVlKHNob3N0LT53b3JrX3EpOwogCkBAIC0yMDIsNyArMjU3LDYgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlpbnQgZ2ZwX21hc2sgPSBHRlBfS0VSTkVMLCBydmFsOwotCURFQ0xBUkVfQ09NUExFVElPTihjb21wbGV0ZSk7CiAKIAlpZiAoc2h0LT51bmNoZWNrZWRfaXNhX2RtYSAmJiBwcml2c2l6ZSkKIAkJZ2ZwX21hc2sgfD0gX19HRlBfRE1BOwpAQCAtMjI2LDYgKzI4MCw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmc2hvc3QtPmRlZmF1bHRfbG9jayk7CiAJc2NzaV9hc3NpZ25fbG9jayhzaG9zdCwgJnNob3N0LT5kZWZhdWx0X2xvY2spOworCXNob3N0LT5zaG9zdF9zdGF0ZSA9IFNIT1NUX0NSRUFURUQ7CiAJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5fX2RldmljZXMpOwogCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+X190YXJnZXRzKTsKIAlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPmVoX2NtZF9xKTsKQEAgLTMwNywxMiArMzYyLDEyIEBACiAJc25wcmludGYoc2hvc3QtPnNob3N0X2NsYXNzZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgImhvc3QlZCIsCiAJCSAgc2hvc3QtPmhvc3Rfbm8pOwogCi0Jc2hvc3QtPmVoX25vdGlmeSA9ICZjb21wbGV0ZTsKLQlydmFsID0ga2VybmVsX3RocmVhZChzY3NpX2Vycm9yX2hhbmRsZXIsIHNob3N0LCAwKTsKLQlpZiAocnZhbCA8IDApCisJc2hvc3QtPmVoYW5kbGVyID0ga3RocmVhZF9ydW4oc2NzaV9lcnJvcl9oYW5kbGVyLCBzaG9zdCwKKwkJCSJzY3NpX2VoXyVkIiwgc2hvc3QtPmhvc3Rfbm8pOworCWlmIChJU19FUlIoc2hvc3QtPmVoYW5kbGVyKSkgeworCQlydmFsID0gUFRSX0VSUihzaG9zdC0+ZWhhbmRsZXIpOwogCQlnb3RvIGZhaWxfZGVzdHJveV9mcmVlbGlzdDsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0ZSk7Ci0Jc2hvc3QtPmVoX25vdGlmeSA9IE5VTEw7CisJfQogCiAJc2NzaV9wcm9jX2hvc3RkaXJfYWRkKHNob3N0LT5ob3N0dCk7CiAJcmV0dXJuIHNob3N0OwpAQCAtMzgyLDcgKzQzNyw3IEBACiAgKiovCiBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfZ2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCWlmICh0ZXN0X2JpdChTSE9TVF9ERUwsICZzaG9zdC0+c2hvc3Rfc3RhdGUpIHx8CisJaWYgKChzaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfREVMKSB8fAogCQkhZ2V0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldikpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBzaG9zdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm1tY2EuYyBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuYwppbmRleCBiNWRjMzUzLi42ZTU0YzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2libW1jYS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tY2EuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCmluZGV4IDJjYjNjODMuLjViMTQ5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgaW50IGluaXRfdGltZW91dCA9IDU7CiBzdGF0aWMgaW50IG1heF9yZXF1ZXN0cyA9IDUwOwogCi0jZGVmaW5lIElCTVZTQ1NJX1ZFUlNJT04gIjEuNS42IgorI2RlZmluZSBJQk1WU0NTSV9WRVJTSU9OICIxLjUuNyIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJQk0gVmlydHVhbCBTQ1NJIik7CiBNT0RVTEVfQVVUSE9SKCJEYXZlIEJvdXRjaGVyIik7CkBAIC0xNDUsNiArMTQ1LDggQEAKIAkJCXNpemVvZigqZXZ0LT54ZmVyX2l1KSAqIGk7CiAJCWV2dC0+eGZlcl9pdSA9IHBvb2wtPml1X3N0b3JhZ2UgKyBpOwogCQlldnQtPmhvc3RkYXRhID0gaG9zdGRhdGE7CisJCWV2dC0+ZXh0X2xpc3QgPSBOVUxMOworCQlldnQtPmV4dF9saXN0X3Rva2VuID0gMDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE2MSw5ICsxNjMsMTYgQEAKIAkJCSAgICAgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKIHsKIAlpbnQgaSwgaW5fdXNlID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+c2l6ZTsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBwb29sLT5zaXplOyArK2kpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZwb29sLT5ldmVudHNbaV0uZnJlZSkgIT0gMSkKIAkJCSsraW5fdXNlOworCQlpZiAocG9vbC0+ZXZlbnRzW2ldLmV4dF9saXN0KSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChob3N0ZGF0YS0+ZGV2LAorCQkJCSAgU0dfQUxMICogc2l6ZW9mKHN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciksCisJCQkJICBwb29sLT5ldmVudHNbaV0uZXh0X2xpc3QsCisJCQkJICBwb29sLT5ldmVudHNbaV0uZXh0X2xpc3RfdG9rZW4pOworCQl9CisJfQogCWlmIChpbl91c2UpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJpYm12c2NzaTogcmVsZWFzaW5nIGV2ZW50IHBvb2wgd2l0aCAlZCAiCkBAIC0yODYsMjQgKzI5NSw0MSBAQAogCX0gZWxzZSB7CiAJCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKIAkJCXNycF9jbWQtPmRhdGFfb3V0X2Zvcm1hdCA9IFNSUF9JTkRJUkVDVF9CVUZGRVI7Ci0JCQlzcnBfY21kLT5kYXRhX291dF9jb3VudCA9IG51bWJ1ZjsKKwkJCXNycF9jbWQtPmRhdGFfb3V0X2NvdW50ID0KKwkJCQludW1idWYgPCBNQVhfSU5ESVJFQ1RfQlVGUyA/CisJCQkJCW51bWJ1ZjogTUFYX0lORElSRUNUX0JVRlM7CiAJCX0gZWxzZSB7CiAJCQlzcnBfY21kLT5kYXRhX2luX2Zvcm1hdCA9IFNSUF9JTkRJUkVDVF9CVUZGRVI7Ci0JCQlzcnBfY21kLT5kYXRhX2luX2NvdW50ID0gbnVtYnVmOworCQkJc3JwX2NtZC0+ZGF0YV9pbl9jb3VudCA9CisJCQkJbnVtYnVmIDwgTUFYX0lORElSRUNUX0JVRlMgPworCQkJCQludW1idWY6IE1BWF9JTkRJUkVDVF9CVUZTOwogCQl9CiAJfQogfQogCitzdGF0aWMgdm9pZCB1bm1hcF9zZ19saXN0KGludCBudW1fZW50cmllcywgCisJCXN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICptZCkKK3sgCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkgeworCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwKKwkJCW1kW2ldLnZpcnR1YWxfYWRkcmVzcywKKwkJCW1kW2ldLmxlbmd0aCwgRE1BX0JJRElSRUNUSU9OQUwpOworCX0KK30KKwogLyoqCiAgKiB1bm1hcF9jbWRfZGF0YTogLSBVbm1hcCBkYXRhIHBvaW50ZWQgaW4gc3JwX2NtZCBiYXNlZCBvbiB0aGUgZm9ybWF0CiAgKiBAY21kOglzcnBfY21kIHdob3NlIGFkZGl0aW9uYWxfZGF0YSBtZW1iZXIgd2lsbCBiZSB1bm1hcHBlZAogICogQGRldjoJZGV2aWNlIGZvciB3aGljaCB0aGUgbWVtb3J5IGlzIG1hcHBlZAogICoKICovCi1zdGF0aWMgdm9pZCB1bm1hcF9jbWRfZGF0YShzdHJ1Y3Qgc3JwX2NtZCAqY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB1bm1hcF9jbWRfZGF0YShzdHJ1Y3Qgc3JwX2NtZCAqY21kLAorCQkJICAgc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3QsCisJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW50IGk7Ci0KIAlpZiAoKGNtZC0+ZGF0YV9vdXRfZm9ybWF0ID09IFNSUF9OT19CVUZGRVIpICYmCiAJICAgIChjbWQtPmRhdGFfaW5fZm9ybWF0ID09IFNSUF9OT19CVUZGRVIpKQogCQlyZXR1cm47CkBAIC0zMTgsMTUgKzM0NCwzNCBAQAogCQkJKHN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICopY21kLT5hZGRpdGlvbmFsX2RhdGE7CiAJCWludCBudW1fbWFwcGVkID0gaW5kaXJlY3QtPmhlYWQubGVuZ3RoIC8gCiAJCQlzaXplb2YoaW5kaXJlY3QtPmxpc3RbMF0pOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21hcHBlZDsgKytpKSB7Ci0JCQlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRhdGEgPSAmaW5kaXJlY3QtPmxpc3RbaV07Ci0JCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwKLQkJCQkJIGRhdGEtPnZpcnR1YWxfYWRkcmVzcywKLQkJCQkJIGRhdGEtPmxlbmd0aCwgRE1BX0JJRElSRUNUSU9OQUwpOworCisJCWlmIChudW1fbWFwcGVkIDw9IE1BWF9JTkRJUkVDVF9CVUZTKSB7CisJCQl1bm1hcF9zZ19saXN0KG51bV9tYXBwZWQsIGRldiwgJmluZGlyZWN0LT5saXN0WzBdKTsKKwkJCXJldHVybjsKIAkJfQorCisJCXVubWFwX3NnX2xpc3QobnVtX21hcHBlZCwgZGV2LCBldnRfc3RydWN0LT5leHRfbGlzdCk7CiAJfQogfQogCitzdGF0aWMgaW50IG1hcF9zZ19saXN0KGludCBudW1fZW50cmllcywgCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkgICAgICAgc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICptZCkKK3sKKwlpbnQgaTsKKwl1NjQgdG90YWxfbGVuZ3RoID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgKytpKSB7CisJCXN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciAqZGVzY3IgPSBtZCArIGk7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfZW50cnkgPSAmc2dbaV07CisJCWRlc2NyLT52aXJ0dWFsX2FkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcyhzZ19lbnRyeSk7CisJCWRlc2NyLT5sZW5ndGggPSBzZ19kbWFfbGVuKHNnX2VudHJ5KTsKKwkJZGVzY3ItPm1lbW9yeV9oYW5kbGUgPSAwOworCQl0b3RhbF9sZW5ndGggKz0gc2dfZG1hX2xlbihzZ19lbnRyeSk7CisgCX0KKwlyZXR1cm4gdG90YWxfbGVuZ3RoOworfQorCiAvKioKICAqIG1hcF9zZ19kYXRhOiAtIE1hcHMgZG1hIGZvciBhIHNjYXR0ZXJsaXN0IGFuZCBpbml0aWFsaXplcyBkZWNyaXB0b3IgZmllbGRzCiAgKiBAY21kOglTY3NpX0NtbmQgd2l0aCB0aGUgc2NhdHRlcmxpc3QKQEAgLTMzNywxMCArMzgyLDExIEBACiAgKiBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KICovCiBzdGF0aWMgaW50IG1hcF9zZ19kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJICAgICAgIHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0LAogCQkgICAgICAgc3RydWN0IHNycF9jbWQgKnNycF9jbWQsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAotCWludCBpLCBzZ19tYXBwZWQ7CisJaW50IHNnX21hcHBlZDsKIAl1NjQgdG90YWxfbGVuZ3RoID0gMDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKIAlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRhdGEgPQpAQCAtMzYzLDI3ICs0MDksNDYgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKHNnX21hcHBlZCA+IE1BWF9JTkRJUkVDVF9CVUZTKSB7CisJaWYgKHNnX21hcHBlZCA+IFNHX0FMTCkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJpYm12c2NzaTogTW9yZSB0aGFuICVkIG1hcHBlZCBzZyBlbnRyaWVzLCBnb3QgJWRcbiIsCi0JCSAgICAgICBNQVhfSU5ESVJFQ1RfQlVGUywgc2dfbWFwcGVkKTsKKwkJICAgICAgIFNHX0FMTCwgc2dfbWFwcGVkKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaW5kaXJlY3QtPmhlYWQudmlydHVhbF9hZGRyZXNzID0gMDsKIAlpbmRpcmVjdC0+aGVhZC5sZW5ndGggPSBzZ19tYXBwZWQgKiBzaXplb2YoaW5kaXJlY3QtPmxpc3RbMF0pOwogCWluZGlyZWN0LT5oZWFkLm1lbW9yeV9oYW5kbGUgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBzZ19tYXBwZWQ7ICsraSkgewotCQlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRlc2NyID0gJmluZGlyZWN0LT5saXN0W2ldOwotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2VudHJ5ID0gJnNnW2ldOwotCQlkZXNjci0+dmlydHVhbF9hZGRyZXNzID0gc2dfZG1hX2FkZHJlc3Moc2dfZW50cnkpOwotCQlkZXNjci0+bGVuZ3RoID0gc2dfZG1hX2xlbihzZ19lbnRyeSk7Ci0JCWRlc2NyLT5tZW1vcnlfaGFuZGxlID0gMDsKLQkJdG90YWxfbGVuZ3RoICs9IHNnX2RtYV9sZW4oc2dfZW50cnkpOwotCX0KLQlpbmRpcmVjdC0+dG90YWxfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwogCi0JcmV0dXJuIDE7CisJaWYgKHNnX21hcHBlZCA8PSBNQVhfSU5ESVJFQ1RfQlVGUykgeworCQl0b3RhbF9sZW5ndGggPSBtYXBfc2dfbGlzdChzZ19tYXBwZWQsIHNnLCAmaW5kaXJlY3QtPmxpc3RbMF0pOworCQlpbmRpcmVjdC0+dG90YWxfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBnZXQgaW5kaXJlY3QgdGFibGUgKi8KKwlpZiAoIWV2dF9zdHJ1Y3QtPmV4dF9saXN0KSB7CisJCWV2dF9zdHJ1Y3QtPmV4dF9saXN0ID0oc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yKikKKwkJCWRtYV9hbGxvY19jb2hlcmVudChkZXYsIAorCQkJCVNHX0FMTCAqIHNpemVvZihzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IpLAorCQkJCSZldnRfc3RydWN0LT5leHRfbGlzdF90b2tlbiwgMCk7CisJCWlmICghZXZ0X3N0cnVjdC0+ZXh0X2xpc3QpIHsKKwkJICAgIHByaW50ayhLRVJOX0VSUgorCQkgICAJImlibXZzY3NpOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGluZGlyZWN0IHRhYmxlXG4iKTsKKwkJCXJldHVybiAwOworCQkJCisJCX0KKwl9CisKKwl0b3RhbF9sZW5ndGggPSBtYXBfc2dfbGlzdChzZ19tYXBwZWQsIHNnLCBldnRfc3RydWN0LT5leHRfbGlzdCk7CQorCisJaW5kaXJlY3QtPnRvdGFsX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKKwlpbmRpcmVjdC0+aGVhZC52aXJ0dWFsX2FkZHJlc3MgPSBldnRfc3RydWN0LT5leHRfbGlzdF90b2tlbjsKKwlpbmRpcmVjdC0+aGVhZC5sZW5ndGggPSBzZ19tYXBwZWQgKiBzaXplb2YoaW5kaXJlY3QtPmxpc3RbMF0pOworCW1lbWNweShpbmRpcmVjdC0+bGlzdCwgZXZ0X3N0cnVjdC0+ZXh0X2xpc3QsCisJCU1BWF9JTkRJUkVDVF9CVUZTICogc2l6ZW9mKHN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvcikpOworCQorIAlyZXR1cm4gMTsKIH0KIAogLyoqCkBAIC00MjgsNiArNDkzLDcgQEAKICAqIFJldHVybnMgMSBvbiBzdWNjZXNzLgogKi8KIHN0YXRpYyBpbnQgbWFwX2RhdGFfZm9yX3NycF9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0LAogCQkJCXN0cnVjdCBzcnBfY21kICpzcnBfY21kLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3dpdGNoIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7CkBAIC00NTAsNyArNTE2LDcgQEAKIAlpZiAoIWNtZC0+cmVxdWVzdF9idWZmZXIpCiAJCXJldHVybiAxOwogCWlmIChjbWQtPnVzZV9zZykKLQkJcmV0dXJuIG1hcF9zZ19kYXRhKGNtZCwgc3JwX2NtZCwgZGV2KTsKKwkJcmV0dXJuIG1hcF9zZ19kYXRhKGNtZCwgZXZ0X3N0cnVjdCwgc3JwX2NtZCwgZGV2KTsKIAlyZXR1cm4gbWFwX3NpbmdsZV9kYXRhKGNtZCwgc3JwX2NtZCwgZGV2KTsKIH0KIApAQCAtNDg2LDYgKzU1Miw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgCiAJCSAgICAgICAiaWJtdnNjc2k6IFdhcm5pbmcsIHJlcXVlc3RfbGltaXQgZXhjZWVkZWRcbiIpOwogCQl1bm1hcF9jbWRfZGF0YSgmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZCwKKwkJCSAgICAgICBldnRfc3RydWN0LAogCQkJICAgICAgIGhvc3RkYXRhLT5kZXYpOwogCQlmcmVlX2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wsIGV2dF9zdHJ1Y3QpOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKQEAgLTUxMyw3ICs1ODAsNyBAQAogCXJldHVybiAwOwogCiAgc2VuZF9lcnJvcjoKLQl1bm1hcF9jbWRfZGF0YSgmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZCwgaG9zdGRhdGEtPmRldik7CisJdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsIGV2dF9zdHJ1Y3QsIGhvc3RkYXRhLT5kZXYpOwogCiAJaWYgKChjbW5kID0gZXZ0X3N0cnVjdC0+Y21uZCkgIT0gTlVMTCkgewogCQljbW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CkBAIC01NTEsNiArNjE4LDcgQEAKIAkJCSAgICAgICByc3AtPnNlbnNlX2FuZF9yZXNwb25zZV9kYXRhLAogCQkJICAgICAgIHJzcC0+c2Vuc2VfZGF0YV9saXN0X2xlbmd0aCk7CiAJCXVubWFwX2NtZF9kYXRhKCZldnRfc3RydWN0LT5pdS5zcnAuY21kLCAKKwkJCSAgICAgICBldnRfc3RydWN0LCAKIAkJCSAgICAgICBldnRfc3RydWN0LT5ob3N0ZGF0YS0+ZGV2KTsKIAogCQlpZiAocnNwLT5kb292ZXIpCkBAIC01ODMsNiArNjUxLDcgQEAKIHsKIAlzdHJ1Y3Qgc3JwX2NtZCAqc3JwX2NtZDsKIAlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdDsKKwlzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqaW5kaXJlY3Q7CiAJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPQogCQkoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKSZjbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCXUxNiBsdW4gPSBsdW5fZnJvbV9kZXYoY21uZC0+ZGV2aWNlKTsKQEAgLTU5MSwxNCArNjYwLDYgQEAKIAlpZiAoIWV2dF9zdHJ1Y3QpCiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCi0JaW5pdF9ldmVudF9zdHJ1Y3QoZXZ0X3N0cnVjdCwKLQkJCSAgaGFuZGxlX2NtZF9yc3AsCi0JCQkgIFZJT1NSUF9TUlBfRk9STUFULAotCQkJICBjbW5kLT50aW1lb3V0KTsKLQotCWV2dF9zdHJ1Y3QtPmNtbmQgPSBjbW5kOwotCWV2dF9zdHJ1Y3QtPmNtbmRfZG9uZSA9IGRvbmU7Ci0KIAkvKiBTZXQgdXAgdGhlIGFjdHVhbCBTUlAgSVUgKi8KIAlzcnBfY21kID0gJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQ7CiAJbWVtc2V0KHNycF9jbWQsIDB4MDAsIHNpemVvZigqc3JwX2NtZCkpOwpAQCAtNjA2LDE3ICs2NjcsMjUgQEAKIAltZW1jcHkoc3JwX2NtZC0+Y2RiLCBjbW5kLT5jbW5kLCBzaXplb2YoY21uZC0+Y21uZCkpOwogCXNycF9jbWQtPmx1biA9ICgodTY0KSBsdW4pIDw8IDQ4OwogCi0JaWYgKCFtYXBfZGF0YV9mb3Jfc3JwX2NtZChjbW5kLCBzcnBfY21kLCBob3N0ZGF0YS0+ZGV2KSkgeworCWlmICghbWFwX2RhdGFfZm9yX3NycF9jbWQoY21uZCwgZXZ0X3N0cnVjdCwgc3JwX2NtZCwgaG9zdGRhdGEtPmRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogY291bGRuJ3QgY29udmVydCBjbWQgdG8gc3JwX2NtZFxuIik7CiAJCWZyZWVfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCwgZXZ0X3N0cnVjdCk7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCX0KIAorCWluaXRfZXZlbnRfc3RydWN0KGV2dF9zdHJ1Y3QsCisJCQkgIGhhbmRsZV9jbWRfcnNwLAorCQkJICBWSU9TUlBfU1JQX0ZPUk1BVCwKKwkJCSAgY21uZC0+dGltZW91dF9wZXJfY29tbWFuZC9IWik7CisKKwlldnRfc3RydWN0LT5jbW5kID0gY21uZDsKKwlldnRfc3RydWN0LT5jbW5kX2RvbmUgPSBkb25lOworCiAJLyogRml4IHVwIGRtYSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaXRzZWxmICovCi0JaWYgKChzcnBfY21kLT5kYXRhX291dF9mb3JtYXQgPT0gU1JQX0lORElSRUNUX0JVRkZFUikgfHwKLQkgICAgKHNycF9jbWQtPmRhdGFfaW5fZm9ybWF0ID09IFNSUF9JTkRJUkVDVF9CVUZGRVIpKSB7Ci0JCXN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICppbmRpcmVjdCA9Ci0JCSAgICAoc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKilzcnBfY21kLT5hZGRpdGlvbmFsX2RhdGE7CisJaW5kaXJlY3QgPSAoc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKilzcnBfY21kLT5hZGRpdGlvbmFsX2RhdGE7CisJaWYgKCgoc3JwX2NtZC0+ZGF0YV9vdXRfZm9ybWF0ID09IFNSUF9JTkRJUkVDVF9CVUZGRVIpIHx8CisJICAgIChzcnBfY21kLT5kYXRhX2luX2Zvcm1hdCA9PSBTUlBfSU5ESVJFQ1RfQlVGRkVSKSkgJiYKKwkgICAgKGluZGlyZWN0LT5oZWFkLnZpcnR1YWxfYWRkcmVzcyA9PSAwKSkgewogCQlpbmRpcmVjdC0+aGVhZC52aXJ0dWFsX2FkZHJlc3MgPSBldnRfc3RydWN0LT5jcnEuSVVfZGF0YV9wdHIgKwogCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNycF9jbWQsIGFkZGl0aW9uYWxfZGF0YSkgKwogCQkgICAgb2Zmc2V0b2Yoc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IsIGxpc3QpOwpAQCAtODI2LDExICs4OTUsMTMgQEAKIAlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqdG1wX2V2dCwgKmZvdW5kX2V2dDsKIAl1bmlvbiB2aW9zcnBfaXUgc3JwX3JzcDsKIAlpbnQgcnNwX3JjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IGx1biA9IGx1bl9mcm9tX2RldihjbWQtPmRldmljZSk7CiAKIAkvKiBGaXJzdCwgZmluZCB0aGlzIGNvbW1hbmQgaW4gb3VyIHNlbnQgbGlzdCBzbyB3ZSBjYW4gZmlndXJlCiAJICogb3V0IHRoZSBjb3JyZWN0IHRhZwogCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlmb3VuZF9ldnQgPSBOVUxMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX2V2dCwgJmhvc3RkYXRhLT5zZW50LCBsaXN0KSB7CiAJCWlmICh0bXBfZXZ0LT5jbW5kID09IGNtZCkgewpAQCAtODM5LDExICs5MTAsMTQgQEAKIAkJfQogCX0KIAotCWlmICghZm91bmRfZXZ0KSAKKwlpZiAoIWZvdW5kX2V2dCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEZBSUxFRDsKKwl9CiAKIAlldnQgPSBnZXRfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCk7CiAJaWYgKGV2dCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmYWlsZWQgdG8gYWxsb2NhdGUgYWJvcnQgZXZlbnRcbiIpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KQEAgLTg2Nyw3ICs5NDEsOSBAQAogCiAJZXZ0LT5zeW5jX3NycCA9ICZzcnBfcnNwOwogCWluaXRfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKLQlpZiAoaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0LCBob3N0ZGF0YSkgIT0gMCkgeworCXJzcF9yYyA9IGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dCwgaG9zdGRhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmIChyc3BfcmMgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmYWlsZWQgdG8gc2VuZCBhYm9ydCgpIGV2ZW50XG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC05MDEsNiArOTc3LDcgQEAKIAkgKiBUaGUgZXZlbnQgaXMgbm8gbG9uZ2VyIGluIG91ciBsaXN0LiAgTWFrZSBzdXJlIGl0IGRpZG4ndAogCSAqIGNvbXBsZXRlIHdoaWxlIHdlIHdlcmUgYWJvcnRpbmcKIAkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJZm91bmRfZXZ0ID0gTlVMTDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9ldnQsICZob3N0ZGF0YS0+c2VudCwgbGlzdCkgewogCQlpZiAodG1wX2V2dC0+Y21uZCA9PSBjbWQpIHsKQEAgLTkxMCw2ICs5ODcsNyBAQAogCX0KIAogCWlmIChmb3VuZF9ldnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgImlibXZzY3NpOiBhYm9ydGVkIHRhc2sgdGFnIDB4JWx4IGNvbXBsZXRlZFxuIiwKIAkJICAgICAgIHRza19tZ210LT5tYW5hZ2VkX3Rhc2tfdGFnKTsKQEAgLTkyMiw4ICsxMDAwLDEwIEBACiAKIAljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOwogCWxpc3RfZGVsKCZmb3VuZF9ldnQtPmxpc3QpOwotCXVubWFwX2NtZF9kYXRhKCZmb3VuZF9ldnQtPml1LnNycC5jbWQsIGZvdW5kX2V2dC0+aG9zdGRhdGEtPmRldik7CisJdW5tYXBfY21kX2RhdGEoJmZvdW5kX2V2dC0+aXUuc3JwLmNtZCwgZm91bmRfZXZ0LAorCQkgICAgICAgZm91bmRfZXZ0LT5ob3N0ZGF0YS0+ZGV2KTsKIAlmcmVlX2V2ZW50X3N0cnVjdCgmZm91bmRfZXZ0LT5ob3N0ZGF0YS0+cG9vbCwgZm91bmRfZXZ0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlhdG9taWNfaW5jKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCk7CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC05NDMsMTAgKzEwMjMsMTMgQEAKIAlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqdG1wX2V2dCwgKnBvczsKIAl1bmlvbiB2aW9zcnBfaXUgc3JwX3JzcDsKIAlpbnQgcnNwX3JjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IGx1biA9IGx1bl9mcm9tX2RldihjbWQtPmRldmljZSk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJZXZ0ID0gZ2V0X2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wpOwogCWlmIChldnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIHJlc2V0IGV2ZW50XG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC05NjksNyArMTA1Miw5IEBACiAKIAlldnQtPnN5bmNfc3JwID0gJnNycF9yc3A7CiAJaW5pdF9jb21wbGV0aW9uKCZldnQtPmNvbXApOwotCWlmIChpYm12c2NzaV9zZW5kX3NycF9ldmVudChldnQsIGhvc3RkYXRhKSAhPSAwKSB7CisJcnNwX3JjID0gaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0LCBob3N0ZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHJzcF9yYyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZhaWxlZCB0byBzZW5kIHJlc2V0IGV2ZW50XG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC0xMDAyLDEyICsxMDg3LDE0IEBACiAJLyogV2UgbmVlZCB0byBmaW5kIGFsbCBjb21tYW5kcyBmb3IgdGhpcyBMVU4gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgogCSAqIHJlc3BvbmRlZCB0bywgYW5kIGZhaWwgdGhlbSB3aXRoIERJRF9SRVNFVAogCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wX2V2dCwgcG9zLCAmaG9zdGRhdGEtPnNlbnQsIGxpc3QpIHsKIAkJaWYgKCh0bXBfZXZ0LT5jbW5kKSAmJiAodG1wX2V2dC0+Y21uZC0+ZGV2aWNlID09IGNtZC0+ZGV2aWNlKSkgewogCQkJaWYgKHRtcF9ldnQtPmNtbmQpCiAJCQkJdG1wX2V2dC0+Y21uZC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CiAJCQlsaXN0X2RlbCgmdG1wX2V2dC0+bGlzdCk7Ci0JCQl1bm1hcF9jbWRfZGF0YSgmdG1wX2V2dC0+aXUuc3JwLmNtZCwgdG1wX2V2dC0+aG9zdGRhdGEtPmRldik7CisJCQl1bm1hcF9jbWRfZGF0YSgmdG1wX2V2dC0+aXUuc3JwLmNtZCwgdG1wX2V2dCwKKwkJCQkgICAgICAgdG1wX2V2dC0+aG9zdGRhdGEtPmRldik7CiAJCQlmcmVlX2V2ZW50X3N0cnVjdCgmdG1wX2V2dC0+aG9zdGRhdGEtPnBvb2wsCiAJCQkJCQkgICB0bXBfZXZ0KTsKIAkJCWF0b21pY19pbmMoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KTsKQEAgLTEwMTcsNiArMTEwNCw3IEBACiAJCQkJdG1wX2V2dC0+ZG9uZSh0bXBfZXZ0KTsKIAkJfQogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIApAQCAtMTAzNSw2ICsxMTIzLDcgQEAKIAkJaWYgKHRtcF9ldnQtPmNtbmQpIHsKIAkJCXRtcF9ldnQtPmNtbmQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCQkJdW5tYXBfY21kX2RhdGEoJnRtcF9ldnQtPml1LnNycC5jbWQsIAorCQkJCSAgICAgICB0bXBfZXZ0LAkKIAkJCQkgICAgICAgdG1wX2V2dC0+aG9zdGRhdGEtPmRldik7CiAJCQlpZiAodG1wX2V2dC0+Y21uZF9kb25lKQogCQkJCXRtcF9ldnQtPmNtbmRfZG9uZSh0bXBfZXZ0LT5jbW5kKTsKQEAgLTEzMzksNyArMTQyOCw3IEBACiAJLmNtZF9wZXJfbHVuID0gMTYsCiAJLmNhbl9xdWV1ZSA9IDEsCQkvKiBVcGRhdGVkIGFmdGVyIFNSUF9MT0dJTiAqLwogCS50aGlzX2lkID0gLTEsCi0JLnNnX3RhYmxlc2l6ZSA9IE1BWF9JTkRJUkVDVF9CVUZTLAorCS5zZ190YWJsZXNpemUgPSBTR19BTEwsCiAJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCiAJLnNob3N0X2F0dHJzID0gaWJtdnNjc2lfYXR0cnMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmggYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaAppbmRleCAxMDMwYjcwLi44YmVjMDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaApAQCAtNjgsNiArNjgsOCBAQAogCXZvaWQgKCpjbW5kX2RvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CiAJdW5pb24gdmlvc3JwX2l1ICpzeW5jX3NycDsKKwlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmV4dF9saXN0OworCWRtYV9hZGRyX3QgZXh0X2xpc3RfdG9rZW47CiB9OwogCiAvKiBhIHBvb2wgb2YgZXZlbnQgc3RydWN0cyBmb3IgdXNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jCmluZGV4IDlmYjk4MTQuLjVjYzUzY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jCkBAIC0yNTMxLDcgKzI1MzEsNyBAQAogICoJQGFwOiBwb3J0IHRvIHJlYWQvd3JpdGUKICAqCUBidWY6IGRhdGEgYnVmZmVyCiAgKglAYnVmbGVuOiBidWZmZXIgbGVuZ3RoCi0gKglAZG9fd3JpdGU6IHJlYWQvd3JpdGUKKyAqCUB3cml0ZV9kYXRhOiByZWFkL3dyaXRlCiAgKgogICoJVHJhbnNmZXIgZGF0YSBmcm9tL3RvIHRoZSBkZXZpY2UgZGF0YSByZWdpc3RlciBieSBNTUlPLgogICoKQEAgLTI1NzcsNyArMjU3Nyw3IEBACiAgKglAYXA6IHBvcnQgdG8gcmVhZC93cml0ZQogICoJQGJ1ZjogZGF0YSBidWZmZXIKICAqCUBidWZsZW46IGJ1ZmZlciBsZW5ndGgKLSAqCUBkb193cml0ZTogcmVhZC93cml0ZQorICoJQHdyaXRlX2RhdGE6IHJlYWQvd3JpdGUKICAqCiAgKglUcmFuc2ZlciBkYXRhIGZyb20vdG8gdGhlIGRldmljZSBkYXRhIHJlZ2lzdGVyIGJ5IFBJTy4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggM2JiODJhYS4uYWRiOTU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMzQyLDkgKzM0Miw2IEBACiAjZGVmaW5lIFZQRF9NQVNLICAgICAgICAgICAgMHhmICAgICAgICAgLyogbWFzayBmb3IgYW55IHZwZCBkYXRhICovCiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBlbHNfdG1vZnVuYzsKLQotCXZvaWQgKmxpbmtfc3RhdHM7Ci0KIAkvKgogCSAqIHN0YXQgIGNvdW50ZXJzCiAJICovCkBAIC0zNzAsNiArMzY3LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVidWZMaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgY3Ryc3BidWZsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgcm5pZHJzcGJ1Zmxpc3Q7CisKKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzIGxpbmtfc3RhdHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKaW5kZXggM2NlYTkyOC4uMGUwODlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KQEAgLTk4OCw4ICs5ODksNyBAQAogewogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKilzaG9zdC0+aG9zdGRhdGFbMF07CiAJc3RydWN0IGxwZmNfc2xpICpwc2xpID0gJnBoYmEtPnNsaTsKLQlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpocyA9Ci0JCQkoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqKXBoYmEtPmxpbmtfc3RhdHM7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqaHMgPSAmcGhiYS0+bGlua19zdGF0czsKIAlMUEZDX01CT1hRX3QgKnBtYm94cTsKIAlNQUlMQk9YX3QgKnBtYjsKIAlpbnQgcmM9MDsKQEAgLTEwMjAsNiArMTAyMCw4IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCW1lbXNldChocywgMCwgc2l6ZW9mIChzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzKSk7CisKIAlocy0+dHhfZnJhbWVzID0gcG1iLT51bi52YXJSZFN0YXR1cy54bWl0RnJhbWVDbnQ7CiAJaHMtPnR4X3dvcmRzID0gKHBtYi0+dW4udmFyUmRTdGF0dXMueG1pdEJ5dGVDbnQgKiAyNTYpOwogCWhzLT5yeF9mcmFtZXMgPSBwbWItPnVuLnZhclJkU3RhdHVzLnJjdkZyYW1lQ250OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCmluZGV4IDc4YWRlZTQuLjEyODBmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKQEAgLTI3LDggKzI3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgogCiAjaW5jbHVkZSAibHBmY19ody5oIgogI2luY2x1ZGUgImxwZmNfc2xpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwppbmRleCAyYjFjOTU3Li42M2NhZjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKaW5kZXggMjMzOTAxZS4uMGE4MjY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CkBAIC0xMTM1LDYgKzExMzYsOCBAQAogCXN3aXRjaChsaXN0KSB7CiAJY2FzZSBOTFBfTk9fTElTVDogLyogTm8gbGlzdCwganVzdCByZW1vdmUgaXQgKi8KIAkJbHBmY19ubHBfcmVtb3ZlKHBoYmEsIG5scCk7CisJCS8qIGFzIG5vZGUgcmVtb3ZlZCAtIHN0b3AgZnVydGhlciB0cmFuc3BvcnQgY2FsbHMgKi8KKwkJcnBvcnRfZGVsID0gbm9uZTsKIAkJYnJlYWs7CiAJY2FzZSBOTFBfVU5VU0VEX0xJU1Q6CiAJCXNwaW5fbG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggMzRkNDE2ZC4uNmYzY2I1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgpAQCAtMTMzOSwxNCArMTM0MCwxMiBAQAogCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIExQRkNfRFJJVkVSX05BTUUpKQogCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIAotCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmxwZmNfdGVtcGxhdGUsCi0JCQlzaXplb2YgKHN0cnVjdCBscGZjX2hiYSkgKyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKTsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZscGZjX3RlbXBsYXRlLCBzaXplb2YgKHN0cnVjdCBscGZjX2hiYSkpOwogCWlmICghaG9zdCkKIAkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOwogCiAJcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEqKWhvc3QtPmhvc3RkYXRhOwogCW1lbXNldChwaGJhLCAwLCBzaXplb2YgKHN0cnVjdCBscGZjX2hiYSkpOwotCXBoYmEtPmxpbmtfc3RhdHMgPSAodm9pZCAqKSZwaGJhWzFdOwogCXBoYmEtPmhvc3QgPSBob3N0OwogCiAJcGhiYS0+ZmNfZmxhZyB8PSBGQ19MT0FESU5HOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwppbmRleCBjMjdjZjk0Li43M2ViODlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwpAQCAtMjMsNiArMjMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKwogI2luY2x1ZGUgImxwZmNfaHcuaCIKICNpbmNsdWRlICJscGZjX3NsaS5oIgogI2luY2x1ZGUgImxwZmNfZGlzYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWVtLmMKaW5kZXggYTVjZmI2NC4uMGFiYTEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21lbS5jCkBAIC0yMyw2ICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCiAjaW5jbHVkZSAibHBmY19ody5oIgogI2luY2x1ZGUgImxwZmNfc2xpLmgiCiAjaW5jbHVkZSAibHBmY19kaXNjLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwppbmRleCA0NWRjMDIxLi45YjM1ZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKaW5kZXggMTdlNDk3NC4uYjVhZDE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKQEAgLTQwLDExICs0MCw2IEBACiAjZGVmaW5lIExQRkNfUkVTRVRfV0FJVCAgMgogI2RlZmluZSBMUEZDX0FCT1JUX1dBSVQgIDIKIAotc3RhdGljIGlubGluZSB2b2lkIGxwZmNfcHV0X2x1bihzdHJ1Y3QgZmNwX2NtbmQgKmZjbWQsIHVuc2lnbmVkIGludCBsdW4pCi17Ci0JZmNtZC0+ZmNwTHVuTHNsID0gMDsKLQlmY21kLT5mY3BMdW5Nc2wgPSBzd2FiMTYoKHVpbnQxNl90KWx1bik7Ci19CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGEgc2NzaSBidWZmZXIsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5CkBAIC0yMzgsNiArMjMzLDggQEAKIAkJYnBsLT50dXMuZi5iZGVTaXplID0gc2NzaV9jbW5kLT5yZXF1ZXN0X2J1ZmZsZW47CiAJCWlmIChkYXRhZGlyID09IERNQV9UT19ERVZJQ0UpCiAJCQlicGwtPnR1cy5mLmJkZUZsYWdzID0gMDsKKwkJZWxzZQorCQkJYnBsLT50dXMuZi5iZGVGbGFncyA9IEJVRkZfVVNFX1JDVjsKIAkJYnBsLT50dXMudyA9IGxlMzJfdG9fY3B1KGJwbC0+dHVzLncpOwogCQludW1fYmRlID0gMTsKIAkJYnBsKys7CkBAIC0yNDUsOCArMjQyLDExIEBACiAKIAkvKgogCSAqIEZpbmlzaCBpbml0aWFsaXppbmcgdGhvc2UgSU9DQiBmaWVsZHMgdGhhdCBhcmUgZGVwZW5kZW50IG9uIHRoZQotCSAqIHNjc2lfY21uZCByZXF1ZXN0X2J1ZmZlcgorCSAqIHNjc2lfY21uZCByZXF1ZXN0X2J1ZmZlci4gIE5vdGUgdGhhdCB0aGUgYmRlU2l6ZSBpcyBleHBsaWNpdGx5CisJICogcmVpbml0aWFsaXplZCBzaW5jZSBhbGwgaW9jYiBtZW1vcnkgcmVzb3VyY2VzIGFyZSB1c2VkIG1hbnkgdGltZXMKKwkgKiBmb3IgdHJhbnNtaXQsIHJlY2VpdmUsIGFuZCBjb250aW51YXRpb24gYnBsJ3MuCiAJICovCisJaW9jYl9jbWQtPnVuLmZjcGk2NC5iZGwuYmRlU2l6ZSA9ICgyICogc2l6ZW9mIChzdHJ1Y3QgdWxwX2JkZTY0KSk7CiAJaW9jYl9jbWQtPnVuLmZjcGk2NC5iZGwuYmRlU2l6ZSArPQogCQkobnVtX2JkZSAqIHNpemVvZiAoc3RydWN0IHVscF9iZGU2NCkpOwogCWlvY2JfY21kLT51bHBCZGVDb3VudCA9IDE7CkBAIC00NDUsOCArNDQ1LDExIEBACiAJaW50IGRhdGFkaXIgPSBzY3NpX2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uOwogCiAJbHBmY19jbWQtPmZjcF9yc3AtPnJzcFNuc0xlbiA9IDA7CisJLyogY2xlYXIgdGFzayBtYW5hZ2VtZW50IGJpdHMgKi8KKwlscGZjX2NtZC0+ZmNwX2NtbmQtPmZjcENudGwyID0gMDsKIAotCWxwZmNfcHV0X2x1bihscGZjX2NtZC0+ZmNwX2NtbmQsIGxwZmNfY21kLT5wQ21kLT5kZXZpY2UtPmx1bik7CisJaW50X3RvX3Njc2lsdW4obHBmY19jbWQtPnBDbWQtPmRldmljZS0+bHVuLAorCQkJJmxwZmNfY21kLT5mY3BfY21uZC0+ZmNwX2x1bik7CiAKIAltZW1jcHkoJmZjcF9jbW5kLT5mY3BDZGJbMF0sIHNjc2lfY21uZC0+Y21uZCwgMTYpOwogCkBAIC01NDUsNyArNTQ4LDggQEAKIAlwaW9jYiA9ICZwaW9jYnEtPmlvY2I7CiAKIAlmY3BfY21uZCA9IGxwZmNfY21kLT5mY3BfY21uZDsKLQlscGZjX3B1dF9sdW4obHBmY19jbWQtPmZjcF9jbW5kLCBscGZjX2NtZC0+cENtZC0+ZGV2aWNlLT5sdW4pOworCWludF90b19zY3NpbHVuKGxwZmNfY21kLT5wQ21kLT5kZXZpY2UtPmx1biwKKwkJCSZscGZjX2NtZC0+ZmNwX2NtbmQtPmZjcF9sdW4pOwogCWZjcF9jbW5kLT5mY3BDbnRsMiA9IHRhc2tfbWdtdF9jbWQ7CiAKIAlwaW9jYi0+dWxwQ29tbWFuZCA9IENNRF9GQ1BfSUNNTkQ2NF9DUjsKQEAgLTc0Niw2ICs3NTAsMTAgQEAKIAkJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX05PX0NPTk5FQ1QsIDApOwogCQkJZ290byBvdXRfZmFpbF9jb21tYW5kOwogCQl9CisJCWVsc2UgaWYgKG5kbHAtPm5scF9zdGF0ZSA9PSBOTFBfU1RFX05QUl9OT0RFKSB7CisJCQljbW5kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9CVVNfQlVTWSwgMCk7CisJCQlnb3RvIG91dF9mYWlsX2NvbW1hbmQ7CisJCX0KIAkJLyoKIAkJICogVGhlIGRldmljZSBpcyBtb3N0IGxpa2VseSByZWNvdmVyZWQgYW5kIHRoZSBkcml2ZXIKIAkJICogbmVlZHMgYSBiaXQgbW9yZSB0aW1lIHRvIGZpbmlzaC4gIEFzayB0aGUgbWlkbGF5ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKaW5kZXggMGZkOWJhMS4uYWNkNjRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKQEAgLTc4LDE4ICs3OCw3IEBACiB9OwogCiBzdHJ1Y3QgZmNwX2NtbmQgewotCXVpbnQzMl90IGZjcEx1bk1zbDsJLyogbW9zdCAgc2lnbmlmaWNhbnQgbHVuIHdvcmQgKDMyIGJpdHMpICovCi0JdWludDMyX3QgZmNwTHVuTHNsOwkvKiBsZWFzdCBzaWduaWZpY2FudCBsdW4gd29yZCAoMzIgYml0cykgKi8KLQkvKiAjIG9mIGJpdHMgdG8gc2hpZnQgbHVuIGlkIHRvIGVuZCB1cCBpbiByaWdodAotCSAqIHBheWxvYWQgd29yZCwgbGl0dGxlIGVuZGlhbiA9IDgsIGJpZyA9IDE2LgotCSAqLwotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBGQ19MVU5fU0hJRlQgICAgICAgICAxNgotI2RlZmluZSBGQ19BRERSX01PREVfU0hJRlQgICAyNAotI2Vsc2UJLyogIF9fTElUVExFX0VORElBTiAqLwotI2RlZmluZSBGQ19MVU5fU0hJRlQgICAgICAgICA4Ci0jZGVmaW5lIEZDX0FERFJfTU9ERV9TSElGVCAgIDAKLSNlbmRpZgorCXN0cnVjdCBzY3NpX2x1biAgZmNwX2x1bjsKIAogCXVpbnQ4X3QgZmNwQ250bDA7CS8qIEZDUF9DTlRMIGJ5dGUgMCAocmVzZXJ2ZWQpICovCiAJdWludDhfdCBmY3BDbnRsMTsJLyogRkNQX0NOVEwgYnl0ZSAxIHRhc2sgY29kZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDE3NzU1MDguLmU3NGUyMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtMjQsOSArMjQsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CiAKICNpbmNsdWRlICJscGZjX2h3LmgiCiAjaW5jbHVkZSAibHBmY19zbGkuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKaW5kZXggNDdkZWE0OC4uN2U2NzQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGluY2x1ZGVkIHdpdGggdGhpcyBwYWNrYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjAuMjkiCisjZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMC4zMCIKIAogI2RlZmluZSBMUEZDX0RSSVZFUl9OQU1FICJscGZjIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NzdC5jIGIvZHJpdmVycy9zY3NpL29zc3QuYwppbmRleCA4OWE0YTA2Li4zZjJmMjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvb3NzdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAJCiAJCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCB8fCAhU1JwbnQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogRmFpbGVkIHRvIHJlYWQgZnJhbWUgYmFjayBmcm9tIE9uU3RyZWFtIGJ1ZmZlclxuIiwgbmFtZSk7Ci0JCQl2ZnJlZSgodm9pZCAqKWJ1ZmZlcik7CisJCQl2ZnJlZShidWZmZXIpOwogCQkJKmFTUnBudCA9IFNScG50OwogCQkJcmV0dXJuICgtRUlPKTsKIAkJfQpAQCAtMTQxOSw3ICsxNDE5LDcgQEAKIAogCQkJaWYgKG5ld19mcmFtZSA+IGZyYW1lICsgMTAwMCkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogRmFpbGVkIHRvIGZpbmQgd3JpdGFibGUgdGFwZSBtZWRpYVxuIiwgbmFtZSk7Ci0JCQkJdmZyZWUoKHZvaWQgKilidWZmZXIpOworCQkJCXZmcmVlKGJ1ZmZlcik7CiAJCQkJcmV0dXJuICgtRUlPKTsKIAkJCX0KIAkJCWlmICggaSA+PSBuZnJhbWVzICsgcGVuZGluZyApIGJyZWFrOwpAQCAtMTUwMCw3ICsxNTAwLDcgQEAKIAkJCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gICAgICAgICA9PSAgMCAmJgogCQkJICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSAgICAgICAgID09ICAyKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBWb2x1bWUgb3ZlcmZsb3cgaW4gd3JpdGUgZXJyb3IgcmVjb3ZlcnlcbiIsIG5hbWUpOwotCQkJCXZmcmVlKCh2b2lkICopYnVmZmVyKTsKKwkJCQl2ZnJlZShidWZmZXIpOwogCQkJCXJldHVybiAoLUVJTyk7CQkJLyogaGl0IGVuZCBvZiB0YXBlID0gZmFpbCAqLwogCQkJfQogCQkJaSA9ICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclszXSA8PCAyNCkgfApAQCAtMTUyNSw3ICsxNTI1LDcgQEAKIAl9CiAJaWYgKCFwZW5kaW5nKQogCQlvc3N0X2NvcHlfdG9fYnVmZmVyKFNUcC0+YnVmZmVyLCBwKTsJLyogc28gYnVmZmVyIGNvbnRlbnQgPT0gYXQgZW50cnkgaW4gYWxsIGNhc2VzICovCi0JdmZyZWUoKHZvaWQgKilidWZmZXIpOworCXZmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4NTIsNyArNTg1Miw3IEBACiAJCQlvc19zY3NpX3RhcGVzW2ldID0gTlVMTDsKIAkJCW9zc3RfbnJfZGV2LS07CiAJCQl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7Ci0JCQlpZiAodHBudC0+aGVhZGVyX2NhY2hlICE9IE5VTEwpIHZmcmVlKHRwbnQtPmhlYWRlcl9jYWNoZSk7CisJCQl2ZnJlZSh0cG50LT5oZWFkZXJfY2FjaGUpOwogCQkJaWYgKHRwbnQtPmJ1ZmZlcikgewogCQkJCW5vcm1hbGl6ZV9idWZmZXIodHBudC0+YnVmZmVyKTsKIAkJCQlrZnJlZSh0cG50LT5idWZmZXIpOwpAQCAtNTg5Niw4ICs1ODk2LDcgQEAKIAkJZm9yIChpPTA7IGkgPCBvc3N0X21heF9kZXY7ICsraSkgewogCQkJaWYgKCEoU1RwID0gb3Nfc2NzaV90YXBlc1tpXSkpIGNvbnRpbnVlOwogCQkJLyogVGhpcyBpcyBkZWZlbnNpdmUsIHN1cHBvc2VkIHRvIGhhcHBlbiBkdXJpbmcgZGV0YWNoICovCi0JCQlpZiAoU1RwLT5oZWFkZXJfY2FjaGUpCi0JCQkJdmZyZWUoU1RwLT5oZWFkZXJfY2FjaGUpOworCQkJdmZyZWUoU1RwLT5oZWFkZXJfY2FjaGUpOwogCQkJaWYgKFNUcC0+YnVmZmVyKSB7CiAJCQkJbm9ybWFsaXplX2J1ZmZlcihTVHAtPmJ1ZmZlcik7CiAJCQkJa2ZyZWUoU1RwLT5idWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BsdXRvLmMgYi9kcml2ZXJzL3Njc2kvcGx1dG8uYwppbmRleCA2MjMwODJkLi5jODlkYTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGx1dG8uYworKysgYi9kcml2ZXJzL3Njc2kvcGx1dG8uYwpAQCAtOTUsOCArOTUsNyBAQAogCWludCBpLCByZXRyeSwgbnBsdXRvczsKIAlmY19jaGFubmVsICpmYzsKIAlTY3NpX0RldmljZSBkZXY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgZmNfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihwbHV0b19kZXRlY3RfdGltZW91dCwgMCwgMCk7CisJREVGSU5FX1RJTUVSKGZjX3RpbWVyLCBwbHV0b19kZXRlY3RfdGltZW91dCwgMCwgMCk7CiAKIAl0cG50LT5wcm9jX25hbWUgPSAicGx1dG8iOwogCWZjc2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCmluZGV4IGI5OTM2NTIuLjYzN2ZiNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwpAQCAtOTk2LDcgKzk5Niw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBQk9SVF9ERVZJQ0U6Ci0JCWhhLT5mbGFncy5pbl9yZXNldCA9IDE7CiAJCWlmIChxbGExMjgwX3ZlcmJvc2UpCiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgInNjc2koJWxkOiVkOiVkOiVkKTogUXVldWVpbmcgYWJvcnQgZGV2aWNlICIKQEAgLTEwMTAsNyArMTAwOSw2IEBACiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgInNjc2koJWxkOiVkOiVkOiVkKTogUXVldWVpbmcgZGV2aWNlIHJlc2V0ICIKIAkJCSAgICAgICAiY29tbWFuZC5cbiIsIGhhLT5ob3N0X25vLCBidXMsIHRhcmdldCwgbHVuKTsKLQkJaGEtPmZsYWdzLmluX3Jlc2V0ID0gMTsKIAkJaWYgKHFsYTEyODBfZGV2aWNlX3Jlc2V0KGhhLCBidXMsIHRhcmdldCkgPT0gMCkKIAkJCXJlc3VsdCA9IFNVQ0NFU1M7CiAJCWJyZWFrOwpAQCAtMTAxOSw3ICsxMDE3LDYgQEAKIAkJaWYgKHFsYTEyODBfdmVyYm9zZSkKIAkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODAoJWxkOiVkKTogSXNzdWluZyBCVVMgIgogCQkJICAgICAgICJERVZJQ0UgUkVTRVRcbiIsIGhhLT5ob3N0X25vLCBidXMpOwotCQloYS0+ZmxhZ3MuaW5fcmVzZXQgPSAxOwogCQlpZiAocWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cyA9PSAwKSkKIAkJCXJlc3VsdCA9IFNVQ0NFU1M7CiAKQEAgLTEwNDcsNyArMTA0NCw2IEBACiAKIAlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kb25lX3EpKQogCQlxbGExMjgwX2RvbmUoaGEpOwotCWhhLT5mbGFncy5pbl9yZXNldCA9IDA7CiAKIAkvKiBJZiB3ZSBkaWRuJ3QgbWFuYWdlIHRvIGlzc3VlIHRoZSBhY3Rpb24sIG9yIHdlIGhhdmUgbm8KIAkgKiBjb21tYW5kIHRvIHdhaXQgZm9yLCBleGl0IGhlcmUgKi8KQEAgLTEyNjksNiArMTI2NSwyMiBAQAogCXJldHVybiBxbGExMjgwX2Jpb3NwYXJhbShkaXNrLT5kZXZpY2UsIE5VTEwsIGRpc2stPmNhcGFjaXR5LCBnZW9tKTsKIH0KICNlbmRpZgorIAorLyogZGlzYWJsZSByaXNjIGFuZCBob3N0IGludGVycnVwdHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMTI4MF9kaXNhYmxlX2ludHJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmljdHJsLCAwKTsKKwlSRF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwpOwkvKiBQQ0kgUG9zdGVkIFdyaXRlIGZsdXNoICovCit9CisKKy8qIGVuYWJsZSByaXNjIGFuZCBob3N0IGludGVycnVwdHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMTI4MF9lbmFibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwsIChJU1BfRU5fSU5UIHwgSVNQX0VOX1JJU0MpKTsKKwlSRF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwpOwkvKiBQQ0kgUG9zdGVkIFdyaXRlIGZsdXNoICovCit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogcWxhMTI4MF9pbnRyX2hhbmRsZXIKQEAgLTEyOTAsNyArMTMwMiw3IEBACiAJaGEtPmlzcl9jb3VudCsrOwogCXJlZyA9IGhhLT5pb2Jhc2U7CiAKLQlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIDApOwkvKiBkaXNhYmxlIG91ciBpbnRlcnJ1cHQuICovCisJcWxhMTI4MF9kaXNhYmxlX2ludHJzKGhhKTsKIAogCWRhdGEgPSBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKCZyZWctPmlzdGF0dXMpOwogCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCkBAIC0xMzAzLDggKzEzMTUsNyBAQAogCiAJc3Bpbl91bmxvY2soSE9TVF9MT0NLKTsKIAotCS8qIGVuYWJsZSBvdXIgaW50ZXJydXB0LiAqLwotCVdSVF9SRUdfV09SRCgmcmVnLT5pY3RybCwgKElTUF9FTl9JTlQgfCBJU1BfRU5fUklTQykpOworCXFsYTEyODBfZW5hYmxlX2ludHJzKGhhKTsKIAogCUxFQVZFX0lOVFIoInFsYTEyODBfaW50cl9oYW5kbGVyIik7CiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CkBAIC0xMzE3LDcgKzEzMjgsNyBAQAogCXVpbnQ4X3QgbXI7CiAJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CiAJc3RydWN0IG52cmFtICpudjsKLQlpbnQgc3RhdHVzOworCWludCBzdGF0dXMsIGx1bjsKIAogCW52ID0gJmhhLT5udnJhbTsKIApAQCAtMTMyNSwyNCArMTMzNiwzOCBAQAogCiAJLyogU2V0IFRhcmdldCBQYXJhbWV0ZXJzLiAqLwogCW1iWzBdID0gTUJDX1NFVF9UQVJHRVRfUEFSQU1FVEVSUzsKLQltYlsxXSA9ICh1aW50MTZfdCkgKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KTsKLQltYlsxXSA8PD0gODsKLQotCW1iWzJdID0gKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuYyA8PCA4KTsKKwltYlsxXSA9ICh1aW50MTZfdCkoKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KSA8PCA4KTsKKwltYlsyXSA9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIucmVuZWdvdGlhdGVfb25fZXJyb3IgPDwgODsKKwltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLnN0b3BfcXVldWVfb25fY2hlY2sgPDwgOTsKKwltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmF1dG9fcmVxdWVzdF9zZW5zZSA8PCAxMDsKKwltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLnRhZ19xdWV1aW5nIDw8IDExOworCW1iWzJdIHw9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3N5bmMgPDwgMTI7CisJbWJbMl0gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfd2lkZSA8PCAxMzsKKwltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLnBhcml0eV9jaGVja2luZyA8PCAxNDsKKwltYlsyXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmRpc2Nvbm5lY3RfYWxsb3dlZCA8PCAxNTsKIAogCWlmIChJU19JU1AxeDE2MChoYSkpIHsKIAkJbWJbMl0gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByIDw8IDU7Ci0JCW1iWzNdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLnN5bmNfb2Zmc2V0IDw8IDgpIHwKLQkJCSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uc3luY19wZXJpb2Q7CisJCW1iWzNdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLnN5bmNfb2Zmc2V0IDw8IDgpOwogCQltYls2XSA9CShudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLnBwcl9vcHRpb25zIDw8IDgpIHwKIAkJCSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLnBwcl9idXNfd2lkdGg7CiAJCW1yIHw9IEJJVF82OwogCX0gZWxzZSB7Ci0JCW1iWzNdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuc3luY19vZmZzZXQgPDwgOCkgfAotCQkJIG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5zeW5jX3BlcmlvZDsKKwkJbWJbM10gPQkobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXg4MC5zeW5jX29mZnNldCA8PCA4KTsKIAl9CisJbWJbM10gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kOwogCi0Jc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIG1yLCAmbWJbMF0pOworCXN0YXR1cyA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBtciwgbWIpOworCisJLyogU2V0IERldmljZSBRdWV1ZSBQYXJhbWV0ZXJzLiAqLworCWZvciAobHVuID0gMDsgbHVuIDwgTUFYX0xVTlM7IGx1bisrKSB7CisJCW1iWzBdID0gTUJDX1NFVF9ERVZJQ0VfUVVFVUU7CisJCW1iWzFdID0gKHVpbnQxNl90KSgoYnVzID8gdGFyZ2V0IHwgQklUXzcgOiB0YXJnZXQpIDw8IDgpOworCQltYlsxXSB8PSBsdW47CisJCW1iWzJdID0gbnYtPmJ1c1tidXNdLm1heF9xdWV1ZV9kZXB0aDsKKwkJbWJbM10gPSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZXhlY3V0aW9uX3Rocm90dGxlOworCQlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIDB4MGYsIG1iKTsKKwl9CiAKIAlpZiAoc3RhdHVzKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpKCVsZDolaTolaSk6ICIKQEAgLTEzODksMTkgKzE0MTQsMTkgQEAKIAl9CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiAweDAyMDUwMAotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYyA9IGRldmljZS0+c2R0cjsKLQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSBkZXZpY2UtPndkdHI7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYyA9IGRldmljZS0+c2R0cjsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV93aWRlID0gZGV2aWNlLT53ZHRyOwogCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3BwciA9IGRldmljZS0+cHByOwogI2VuZGlmCiAKIAlpZiAoZHJpdmVyX3NldHVwLm5vX3N5bmMgfHwKIAkgICAgKGRyaXZlcl9zZXR1cC5zeW5jX21hc2sgJiYKIAkgICAgICh+ZHJpdmVyX3NldHVwLnN5bmNfbWFzayAmICgxIDw8IHRhcmdldCkpKSkKLQkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMDsKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYyA9IDA7CiAJaWYgKGRyaXZlcl9zZXR1cC5ub193aWRlIHx8CiAJICAgIChkcml2ZXJfc2V0dXAud2lkZV9tYXNrICYmCiAJICAgICAofmRyaXZlcl9zZXR1cC53aWRlX21hc2sgJiAoMSA8PCB0YXJnZXQpKSkpCi0JCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IDA7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3dpZGUgPSAwOwogCWlmIChJU19JU1AxeDE2MChoYSkpIHsKIAkJaWYgKGRyaXZlcl9zZXR1cC5ub19wcHIgfHwKIAkJICAgIChkcml2ZXJfc2V0dXAucHByX21hc2sgJiYKQEAgLTE0MTAsNyArMTQzNSw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoSE9TVF9MT0NLLCBmbGFncyk7Ci0JaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYykKKwlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYykKIAkJc3RhdHVzID0gcWxhMTI4MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoaGEsIGJ1cywgdGFyZ2V0KTsKIAlxbGExMjgwX2dldF90YXJnZXRfcGFyYW1ldGVycyhoYSwgZGV2aWNlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKEhPU1RfTE9DSywgZmxhZ3MpOwpAQCAtMTQ0OCw3ICsxNDczLDYgQEAKICAqCiAgKiBJbnB1dDoKICAqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgotICogICAgICBkb25lX3EgICAgICAgPSBkb25lIHF1ZXVlLgogICovCiBzdGF0aWMgdm9pZAogcWxhMTI4MF9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKQEAgLTE1MjIsNyArMTU0Niw3IEBACiAJaW50IGhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOwogCXVpbnQxNl90IGNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUoc3RzLT5jb21wX3N0YXR1cyk7CiAJdWludDE2X3Qgc3RhdGVfZmxhZ3MgPSBsZTE2X3RvX2NwdShzdHMtPnN0YXRlX2ZsYWdzKTsKLQl1aW50MTZfdCByZXNpZHVhbF9sZW5ndGggPSBsZTE2X3RvX2NwdShzdHMtPnJlc2lkdWFsX2xlbmd0aCk7CisJdWludDE2X3QgcmVzaWR1YWxfbGVuZ3RoID0gbGUzMl90b19jcHUoc3RzLT5yZXNpZHVhbF9sZW5ndGgpOwogCXVpbnQxNl90IHNjc2lfc3RhdHVzID0gbGUxNl90b19jcHUoc3RzLT5zY3NpX3N0YXR1cyk7CiAjaWYgREVCVUdfUUxBMTI4MF9JTlRSCiAJc3RhdGljIGNoYXIgKnJlYXNvbltdID0gewpAQCAtMTU4Miw3ICsxNjA2LDcgQEAKIAogCWNhc2UgQ1NfREFUQV9PVkVSUlVOOgogCQlkcHJpbnRrKDIsICJEYXRhIG92ZXJydW4gMHgleFxuIiwgcmVzaWR1YWxfbGVuZ3RoKTsKLQkJZHByaW50aygyLCAicWxhMTI4MF9pc3I6IHJlc3BvbnNlIHBhY2tldCBkYXRhXG4iKTsKKwkJZHByaW50aygyLCAicWxhMTI4MF9yZXR1cm5fc3RhdHVzOiByZXNwb25zZSBwYWNrZXQgZGF0YVxuIik7CiAJCXFsYTEyODBfZHVtcF9idWZmZXIoMiwgKGNoYXIgKilzdHMsIFJFU1BPTlNFX0VOVFJZX1NJWkUpOwogCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKIAkJYnJlYWs7CkBAIC0xNjE3LDQwICsxNjQxLDYgQEAKIC8qICAgICAgICAgICAgICAgIFFMb2dpYyBJU1AxMjgwIEhhcmR3YXJlIFN1cHBvcnQgRnVuY3Rpb25zLiAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAvKgotICAqIHFsYTIxMDBfZW5hYmxlX2ludHJzCi0gICogcWxhMjEwMF9kaXNhYmxlX2ludHJzCi0gICoKLSAgKiBJbnB1dDoKLSAgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgotICAqCi0gICogUmV0dXJuczoKLSAgKiAgICAgIE5vbmUKLSAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMTI4MF9lbmFibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZzsKLQotCXJlZyA9IGhhLT5pb2Jhc2U7Ci0JLyogZW5hYmxlIHJpc2MgYW5kIGhvc3QgaW50ZXJydXB0cyAqLwotCVdSVF9SRUdfV09SRCgmcmVnLT5pY3RybCwgKElTUF9FTl9JTlQgfCBJU1BfRU5fUklTQykpOwotCVJEX1JFR19XT1JEKCZyZWctPmljdHJsKTsJLyogUENJIFBvc3RlZCBXcml0ZSBmbHVzaCAqLwotCWhhLT5mbGFncy5pbnRzX2VuYWJsZWQgPSAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXFsYTEyODBfZGlzYWJsZV9pbnRycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCi17Ci0Jc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnOwotCi0JcmVnID0gaGEtPmlvYmFzZTsKLQkvKiBkaXNhYmxlIHJpc2MgYW5kIGhvc3QgaW50ZXJydXB0cyAqLwotCVdSVF9SRUdfV09SRCgmcmVnLT5pY3RybCwgMCk7Ci0JUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpOwkvKiBQQ0kgUG9zdGVkIFdyaXRlIGZsdXNoICovCi0JaGEtPmZsYWdzLmludHNfZW5hYmxlZCA9IDA7Ci19Ci0KIC8qCiAgKiBxbGExMjgwX2luaXRpYWxpemVfYWRhcHRlcgogICogICAgICBJbml0aWFsaXplIGJvYXJkLgpAQCAtMTY3OSw3ICsxNjY5LDYgQEAKIAloYS0+ZmxhZ3MucmVzZXRfYWN0aXZlID0gMDsKIAloYS0+ZmxhZ3MuYWJvcnRfaXNwX2FjdGl2ZSA9IDA7CiAKLQloYS0+ZmxhZ3MuaW50c19lbmFibGVkID0gMDsKICNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpIHx8IGRlZmluZWQoQ09ORklHX0lBNjRfU0dJX1NOMikKIAlpZiAoaWE2NF9wbGF0Zm9ybV9pcygic24yIikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGkpOiBFbmFibGluZyBTTjIgUENJIERNQSAiCkBAIC0xNzU4LDY5ICsxNzQ3LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0KLS8qCi0gKiBJU1AgRmlybXdhcmUgVGVzdAotICogICAgICBDaGVja3MgaWYgcHJlc2VudCB2ZXJzaW9uIG9mIFJJU0MgZmlybXdhcmUgaXMgb2xkZXIgdGhhbgotICogICAgICBkcml2ZXIgZmlybXdhcmUuCi0gKgotICogSW5wdXQ6Ci0gKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgotICoKLSAqIFJldHVybnM6Ci0gKiAgICAgIDAgPSBmaXJtd2FyZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC4KLSAqLwotc3RhdGljIGludAotcWxhMTI4MF9pc3BfZmlybXdhcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCXN0cnVjdCBudnJhbSAqbnYgPSAoc3RydWN0IG52cmFtICopIGhhLT5yZXNwb25zZV9yaW5nOwotCWludCBzdGF0dXMgPSAwOwkJLyogZGcgMi8yNyBhbHdheXMgbG9hZHMgUklTQyAqLwotCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOwotCi0JRU5URVIoInFsYTEyODBfaXNwX2Zpcm13YXJlIik7Ci0KLQlkcHJpbnRrKDEsICJzY3NpKCVsaSk6IERldGVybWluaW5nIGlmIFJJU0MgaXMgbG9hZGVkXG4iLCBoYS0+aG9zdF9ubyk7Ci0KLQkvKiBCYWQgTlZSQU0gZGF0YSwgbG9hZCBSSVNDIGNvZGUuICovCi0JaWYgKCFoYS0+bnZyYW1fdmFsaWQpIHsKLQkJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPSAwOwotCX0gZWxzZQotCQloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9Ci0JCQludi0+Y250cl9mbGFnc18xLmRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGU7Ci0KLQlpZiAoaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQpIHsKLQkJZHByaW50aygzLCAicWxhMTI4MF9pc3BfZmlybXdhcmU6IFRlbGxpbmcgUklTQyB0byB2ZXJpZnkgIgotCQkJImNoZWNrc3VtIG9mIGxvYWRlZCBCSU9TIGNvZGUuXG4iKTsKLQotCQkvKiBWZXJpZnkgY2hlY2tzdW0gb2YgbG9hZGVkIFJJU0MgY29kZS4gKi8KLQkJbWJbMF0gPSBNQkNfVkVSSUZZX0NIRUNLU1VNOwotCQkvKiBtYlsxXSA9IHFsMTJfcmlzY19jb2RlX2FkZHIwMTsgKi8KLQkJbWJbMV0gPSAqcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md3N0YXJ0OwotCi0JCWlmICghKHN0YXR1cyA9Ci0JCSAgICAgIHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pKSkgewotCQkJLyogU3RhcnQgZmlybXdhcmUgZXhlY3V0aW9uLiAqLwotCQkJZHByaW50aygzLCAicWxhMTI4MF9pc3BfZmlybXdhcmU6IFN0YXJ0bmcgRi9XICIKLQkJCQkiZXhlY3V0aW9uLlxuIik7Ci0KLQkJCW1iWzBdID0gTUJDX0VYRUNVVEVfRklSTVdBUkU7Ci0JCQkvKiBtYlsxXSA9IHFsMTJfcmlzY19jb2RlX2FkZHIwMTsgKi8KLQkJCW1iWzFdID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKLQkJCXFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOwotCQl9IGVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IFJJU0MgY2hlY2tzdW0gZmFpbGVkLlxuIik7Ci0JfSBlbHNlIHsKLQkJZHByaW50aygxLCAicWxhMTI4MDogTlZSQU0gY29uZmlndXJlZCB0byBsb2FkIFJJU0MgbG9hZC5cbiIpOwotCQlzdGF0dXMgPSAxOwotCX0KLQotCWlmIChzdGF0dXMpCi0JCWRwcmludGsoMiwgInFsYTEyODBfaXNwX2Zpcm13YXJlOiAqKioqIExvYWQgUklTQyBjb2RlICoqKipcbiIpOwotCi0JTEVBVkUoInFsYTEyODBfaXNwX2Zpcm13YXJlIik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQogLyoKICAqIENoaXAgZGlhZ25vc3RpY3MKICAqICAgICAgVGVzdCBjaGlwIGZvciBwcm9wZXIgb3BlcmF0aW9uLgpAQCAtMjAwNiw3ICsxOTMyLDcgQEAKIAkJCSIlZCwlZCgweCV4KVxuIiwKIAkJCXJpc2NfY29kZV9hZGRyZXNzLCBjbnQsIG51bSwgcmlzY19hZGRyZXNzKTsKIAkJZm9yKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCQkoKHVpbnQxNl90ICopaGEtPnJlcXVlc3RfcmluZylbaV0gPQorCQkJKChfX2xlMTYgKiloYS0+cmVxdWVzdF9yaW5nKVtpXSA9CiAJCQkJY3B1X3RvX2xlMTYocmlzY19jb2RlX2FkZHJlc3NbaV0pOwogCiAJCW1iWzBdID0gTUJDX0xPQURfUkFNOwpAQCAtMjA4NSw3ICsyMDExLDcgQEAKIAltYlsxXSA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3c3RhcnQ7CiAJZXJyID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsIG1iKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2NzaSglbGkpOiBGYWlsZWQgY2hlY2tzdW1cbiIsIGhhLT5ob3N0X25vKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IFJJU0MgY2hlY2tzdW0gZmFpbGVkLlxuIiwgaGEtPmhvc3Rfbm8pOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMjEwNSwxNCArMjAzMSw3IEBACiBzdGF0aWMgaW50CiBxbGExMjgwX2xvYWRfZmlybXdhcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCWludCBlcnIgPSAtRU5PREVWOwotCi0JLyogSWYgZmlybXdhcmUgbmVlZHMgdG8gYmUgbG9hZGVkICovCi0JaWYgKCFxbGExMjgwX2lzcF9maXJtd2FyZShoYSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IGlzcF9maXJtd2FyZSgpIGZhaWxlZCFcbiIsCi0JCQkJaGEtPmhvc3Rfbm8pOwotCQlnb3RvIG91dDsKLQl9CisJaW50IGVycjsKIAogCWVyciA9IHFsYTEyODBfY2hpcF9kaWFnKGhhKTsKIAlpZiAoZXJyKQpAQCAtMjI0NiwxNyArMjE2NSwxNyBAQAogewogCXN0cnVjdCBudnJhbSAqbnYgPSAmaGEtPm52cmFtOwogCi0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLnJlbmVnb3RpYXRlX29uX2Vycm9yID0gMTsKLQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuYXV0b19yZXF1ZXN0X3NlbnNlID0gMTsKLQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYudGFnX3F1ZXVpbmcgPSAxOwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYyA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5yZW5lZ290aWF0ZV9vbl9lcnJvciA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5hdXRvX3JlcXVlc3Rfc2Vuc2UgPSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIudGFnX3F1ZXVpbmcgPSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3N5bmMgPSAxOwogI2lmIDEJLyogU29tZSBTQ1NJIFByb2Nlc3NvcnMgZG8gbm90IHNlZW0gdG8gbGlrZSB0aGlzICovCi0JbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV93aWRlID0gMTsKICNlbmRpZgotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5wYXJpdHlfY2hlY2tpbmcgPSAxOwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5kaXNjb25uZWN0X2FsbG93ZWQgPSAxOwogCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5leGVjdXRpb25fdGhyb3R0bGUgPQogCQludi0+YnVzW2J1c10ubWF4X3F1ZXVlX2RlcHRoIC0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLnBhcml0eV9jaGVja2luZyA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5kaXNjb25uZWN0X2FsbG93ZWQgPSAxOwogCiAJaWYgKElTX0lTUDF4MTYwKGhhKSkgewogCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5kZXZpY2VfZW5hYmxlID0gMTsKQEAgLTIyODQsOSArMjIwMyw5IEBACiAJLyogbnYtPmNudHJfZmxhZ3NfMS5kaXNhYmxlX2xvYWRpbmdfcmlzY19jb2RlID0gMTsgKi8KIAludi0+ZmlybXdhcmVfZmVhdHVyZS5mLmVuYWJsZV9mYXN0X3Bvc3RpbmcgPSAxOwogCW52LT5maXJtd2FyZV9mZWF0dXJlLmYuZGlzYWJsZV9zeW5jaHJvbm91c19iYWNrb2ZmID0gMTsKLQludi0+dGVybWluYXRpb24uZi5zY3NpX2J1c18wX2NvbnRyb2wgPSAzOwotCW52LT50ZXJtaW5hdGlvbi5mLnNjc2lfYnVzXzFfY29udHJvbCA9IDM7Ci0JbnYtPnRlcm1pbmF0aW9uLmYuYXV0b190ZXJtX3N1cHBvcnQgPSAxOworCW52LT50ZXJtaW5hdGlvbi5zY3NpX2J1c18wX2NvbnRyb2wgPSAzOworCW52LT50ZXJtaW5hdGlvbi5zY3NpX2J1c18xX2NvbnRyb2wgPSAzOworCW52LT50ZXJtaW5hdGlvbi5hdXRvX3Rlcm1fc3VwcG9ydCA9IDE7CiAKIAkvKgogCSAqIFNldCBkZWZhdWx0IEZJRk8gbWFnaWMgLSBXaGF0IGFwcHJvcHJpYXRlIHZhbHVlcyB3b3VsZCBiZSBoZXJlCkBAIC0yMjk2LDcgKzIyMTUsMTIgQEAKIAkgKiBoZWFkZXIgZmlsZSBwcm92aWRlZCBieSBRTG9naWMgc2VlbXMgdG8gYmUgYm9ndXMgb3IgaW5jb21wbGV0ZQogCSAqIGF0IGJlc3QuCiAJICovCi0JbnYtPmlzcF9jb25maWcuYyA9IElTUF9DRkcxX0JFTkFCfElTUF9DRkcxX0YxMjg7CisJbnYtPmlzcF9jb25maWcuYnVyc3RfZW5hYmxlID0gMTsKKwlpZiAoSVNfSVNQMTA0MChoYSkpCisJCW52LT5pc3BfY29uZmlnLmZpZm9fdGhyZXNob2xkIHw9IDM7CisJZWxzZQorCQludi0+aXNwX2NvbmZpZy5maWZvX3RocmVzaG9sZCB8PSA0OworCiAJaWYgKElTX0lTUDF4MTYwKGhhKSkKIAkJbnYtPmlzcF9wYXJhbWV0ZXIgPSAweDAxOyAvKiBmYXN0IG1lbW9yeSBlbmFibGUgKi8KIApAQCAtMjMyNyw2NiArMjI1MSw1MyBAQAogCXN0cnVjdCBudnJhbSAqbnYgPSAmaGEtPm52cmFtOwogCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOwogCWludCBzdGF0dXMsIGx1bjsKKwl1aW50MTZfdCBmbGFnOwogCiAJLyogU2V0IFRhcmdldCBQYXJhbWV0ZXJzLiAqLwogCW1iWzBdID0gTUJDX1NFVF9UQVJHRVRfUEFSQU1FVEVSUzsKLQltYlsxXSA9ICh1aW50MTZfdCkgKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KTsKLQltYlsxXSA8PD0gODsKKwltYlsxXSA9ICh1aW50MTZfdCkoKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KSA8PCA4KTsKIAogCS8qCi0JICogRG8gbm90IGVuYWJsZSB3aWRlLCBzeW5jLCBhbmQgcHByIGZvciB0aGUgaW5pdGlhbAotCSAqIElOUVVJUlkgcnVuLiBXZSBlbmFibGUgdGhpcyBsYXRlciBpZiB3ZSBkZXRlcm1pbmUKLQkgKiB0aGUgdGFyZ2V0IGFjdHVhbGx5IHN1cHBvcnRzIGl0LgorCSAqIERvIG5vdCBlbmFibGUgc3luYyBhbmQgcHByIGZvciB0aGUgaW5pdGlhbCBJTlFVSVJZIHJ1bi4gV2UKKwkgKiBlbmFibGUgdGhpcyBsYXRlciBpZiB3ZSBkZXRlcm1pbmUgdGhlIHRhcmdldCBhY3R1YWxseQorCSAqIHN1cHBvcnRzIGl0LgogCSAqLwotCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi4KLQkJYXV0b19yZXF1ZXN0X3NlbnNlID0gMTsKLQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuCi0JCXN0b3BfcXVldWVfb25fY2hlY2sgPSAwOwotCi0JaWYgKElTX0lTUDF4MTYwKGhhKSkKLQkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC4KLQkJCWZsYWdzLmVuYWJsZV9wcHIgPSAwOwotCi0JLyoKLQkgKiBObyBzeW5jLCB3aWRlLCBldGMuIHdoaWxlIHByb2JpbmcKLQkgKi8KLQltYlsyXSA9IChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmMgPDwgOCkgJgotCQl+KFRQX1NZTkMgLyp8IFRQX1dJREUgfCBUUF9QUFIqLyk7CisJbWJbMl0gPSAoVFBfUkVORUdPVElBVEUgfCBUUF9BVVRPX1JFUVVFU1RfU0VOU0UgfCBUUF9UQUdHRURfUVVFVUUKKwkJIHwgVFBfV0lERSB8IFRQX1BBUklUWSB8IFRQX0RJU0NPTk5FQ1QpOwogCiAJaWYgKElTX0lTUDF4MTYwKGhhKSkKIAkJbWJbM10gPQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5zeW5jX29mZnNldCA8PCA4OwogCWVsc2UKIAkJbWJbM10gPQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLnN5bmNfb2Zmc2V0IDw8IDg7CiAJbWJbM10gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kOwotCi0Jc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCXN0YXR1cyA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCAweDBmLCBtYik7CiAKIAkvKiBTYXZlIFRhZyBxdWV1aW5nIGVuYWJsZSBmbGFnLiAqLwotCW1iWzBdID0gQklUXzAgPDwgdGFyZ2V0OwotCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYudGFnX3F1ZXVpbmcpCi0JCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5xdGFnX2VuYWJsZXMgfD0gbWJbMF07CisJZmxhZyA9IChCSVRfMCA8PCB0YXJnZXQpICYgbWJbMF07CisJaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIudGFnX3F1ZXVpbmcpCisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5xdGFnX2VuYWJsZXMgfD0gZmxhZzsKIAogCS8qIFNhdmUgRGV2aWNlIGVuYWJsZSBmbGFnLiAqLwogCWlmIChJU19JU1AxeDE2MChoYSkpIHsKIAkJaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLmRldmljZV9lbmFibGUpCi0JCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZGV2aWNlX2VuYWJsZXMgfD0gbWJbMF07CisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZGV2aWNlX2VuYWJsZXMgfD0gZmxhZzsKIAkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmx1bl9kaXNhYmxlcyB8PSAwOwogCX0gZWxzZSB7CiAJCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDgwLmRldmljZV9lbmFibGUpCi0JCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZGV2aWNlX2VuYWJsZXMgfD0gbWJbMF07CisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uZGV2aWNlX2VuYWJsZXMgfD0gZmxhZzsKIAkJLyogU2F2ZSBMVU4gZGlzYWJsZSBmbGFnLiAqLwogCQlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXg4MC5sdW5fZGlzYWJsZSkKLQkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5sdW5fZGlzYWJsZXMgfD0gbWJbMF07CisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10ubHVuX2Rpc2FibGVzIHw9IGZsYWc7CiAJfQogCiAJLyogU2V0IERldmljZSBRdWV1ZSBQYXJhbWV0ZXJzLiAqLwogCWZvciAobHVuID0gMDsgbHVuIDwgTUFYX0xVTlM7IGx1bisrKSB7CiAJCW1iWzBdID0gTUJDX1NFVF9ERVZJQ0VfUVVFVUU7Ci0JCW1iWzFdID0gKHVpbnQxNl90KShidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCk7Ci0JCW1iWzFdID0gbWJbMV0gPDwgOCB8IGx1bjsKKwkJbWJbMV0gPSAodWludDE2X3QpKChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCkgPDwgOCk7CisJCW1iWzFdIHw9IGx1bjsKIAkJbWJbMl0gPSBudi0+YnVzW2J1c10ubWF4X3F1ZXVlX2RlcHRoOwogCQltYlszXSA9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5leGVjdXRpb25fdGhyb3R0bGU7Ci0JCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgMHgwZiwgJm1iWzBdKTsKKwkJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCAweDBmLCBtYik7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTI0MzEsNyArMjM0Miw2IEBACiAJc3RydWN0IG52cmFtICpudiA9ICZoYS0+bnZyYW07CiAJaW50IGJ1cywgdGFyZ2V0LCBzdGF0dXMgPSAwOwogCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOwotCXVpbnQxNl90IG1hc2s7CiAKIAlFTlRFUigicWxhMTI4MF9udnJhbV9jb25maWciKTsKIApAQCAtMjQzOSw3ICsyMzQ5LDcgQEAKIAkJLyogQWx3YXlzIGZvcmNlIEFVVE8gc2Vuc2UgZm9yIExJTlVYIFNDU0kgKi8KIAkJZm9yIChidXMgPSAwOyBidXMgPCBNQVhfQlVTRVM7IGJ1cysrKQogCQkJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBNQVhfVEFSR0VUUzsgdGFyZ2V0KyspIHsKLQkJCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuCisJCQkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci4KIAkJCQkJYXV0b19yZXF1ZXN0X3NlbnNlID0gMTsKIAkJCX0KIAl9IGVsc2UgewpAQCAtMjQ1NywzMSArMjM2Nyw0MCBAQAogCiAJCWh3cmV2ID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzApICYgSVNQX0NGRzBfSFdNU0s7CiAKLQkJY2ZnMSA9IFJEX1JFR19XT1JEKCZyZWctPmNmZ18xKTsKKwkJY2ZnMSA9IFJEX1JFR19XT1JEKCZyZWctPmNmZ18xKSAmIH4oQklUXzQgfCBCSVRfNSB8IEJJVF82KTsKIAkJY2RtYV9jb25mID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2RtYV9jZmcpOwogCQlkZG1hX2NvbmYgPSBSRF9SRUdfV09SRCgmcmVnLT5kZG1hX2NmZyk7CiAKIAkJLyogQnVzdGVkIGZpZm8sIHNheXMgbWphY29iLiAqLwotCQlpZiAoaHdyZXYgPT0gSVNQX0NGRzBfMTA0MEEpCi0JCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIGNmZzEgfCBJU1BfQ0ZHMV9GNjQpOwotCQllbHNlCi0JCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIGNmZzEgfCBJU1BfQ0ZHMV9GNjQgfCBJU1BfQ0ZHMV9CRU5BQik7CisJCWlmIChod3JldiAhPSBJU1BfQ0ZHMF8xMDQwQSkKKwkJCWNmZzEgfD0gbnYtPmlzcF9jb25maWcuZmlmb190aHJlc2hvbGQgPDwgNDsKKworCQljZmcxIHw9IG52LT5pc3BfY29uZmlnLmJ1cnN0X2VuYWJsZSA8PCAyOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIGNmZzEpOwogCiAJCVdSVF9SRUdfV09SRCgmcmVnLT5jZG1hX2NmZywgY2RtYV9jb25mIHwgQ0RNQV9DT05GX0JFTkFCKTsKIAkJV1JUX1JFR19XT1JEKCZyZWctPmRkbWFfY2ZnLCBjZG1hX2NvbmYgfCBERE1BX0NPTkZfQkVOQUIpOwogCX0gZWxzZSB7CisJCXVpbnQxNl90IGNmZzEsIHRlcm07CisKIAkJLyogU2V0IElTUCBoYXJkd2FyZSBETUEgYnVyc3QgKi8KLQkJbWJbMF0gPSBudi0+aXNwX2NvbmZpZy5jOworCQljZmcxID0gbnYtPmlzcF9jb25maWcuZmlmb190aHJlc2hvbGQgPDwgNDsKKwkJY2ZnMSB8PSBudi0+aXNwX2NvbmZpZy5idXJzdF9lbmFibGUgPDwgMjsKIAkJLyogRW5hYmxlIERNQSBhcmJpdHJhdGlvbiBvbiBkdWFsIGNoYW5uZWwgY29udHJvbGxlcnMgKi8KIAkJaWYgKGhhLT5wb3J0cyA+IDEpCi0JCQltYlswXSB8PSBCSVRfMTM7Ci0JCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgbWJbMF0pOworCQkJY2ZnMSB8PSBCSVRfMTM7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY2ZnMSk7CiAKIAkJLyogU2V0IFNDU0kgdGVybWluYXRpb24uICovCi0JCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvX2VuYWJsZSwgKEJJVF8zICsgQklUXzIgKyBCSVRfMSArIEJJVF8wKSk7Ci0JCW1iWzBdID0gbnYtPnRlcm1pbmF0aW9uLmMgJiAoQklUXzMgKyBCSVRfMiArIEJJVF8xICsgQklUXzApOwotCQlXUlRfUkVHX1dPUkQoJnJlZy0+Z3Bpb19kYXRhLCBtYlswXSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvX2VuYWJsZSwKKwkJCSAgICAgQklUXzcgfCBCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCk7CisJCXRlcm0gPSBudi0+dGVybWluYXRpb24uc2NzaV9idXNfMV9jb250cm9sOworCQl0ZXJtIHw9IG52LT50ZXJtaW5hdGlvbi5zY3NpX2J1c18wX2NvbnRyb2wgPDwgMjsKKwkJdGVybSB8PSBudi0+dGVybWluYXRpb24uYXV0b190ZXJtX3N1cHBvcnQgPDwgNzsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Z3Bpb19kYXRhLCB0ZXJtKTsKIAl9CisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLwogCiAJLyogSVNQIHBhcmFtZXRlciB3b3JkLiAqLwogCW1iWzBdID0gTUJDX1NFVF9TWVNURU1fUEFSQU1FVEVSOwpAQCAtMjQ5NywxNiArMjQxNiwxNyBAQAogCiAJLyogRmlybXdhcmUgZmVhdHVyZSB3b3JkLiAqLwogCW1iWzBdID0gTUJDX1NFVF9GSVJNV0FSRV9GRUFUVVJFUzsKLQltYXNrID0gQklUXzUgfCBCSVRfMSB8IEJJVF8wOwotCW1iWzFdID0gbGUxNl90b19jcHUobnYtPmZpcm13YXJlX2ZlYXR1cmUudykgJiAobWFzayk7CisJbWJbMV0gPSBudi0+ZmlybXdhcmVfZmVhdHVyZS5mLmVuYWJsZV9mYXN0X3Bvc3Rpbmc7CisJbWJbMV0gfD0gbnYtPmZpcm13YXJlX2ZlYXR1cmUuZi5yZXBvcnRfbHZkX2J1c190cmFuc2l0aW9uIDw8IDE7CisJbWJbMV0gfD0gbnYtPmZpcm13YXJlX2ZlYXR1cmUuZi5kaXNhYmxlX3N5bmNocm9ub3VzX2JhY2tvZmYgPDwgNTsKICNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpIHx8IGRlZmluZWQgKENPTkZJR19JQTY0X1NHSV9TTjIpCiAJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpKTogRW5hYmxpbmcgU04yIFBDSSBETUEgIgogCQkgICAgICAgIndvcmthcm91bmRcbiIsIGhhLT5ob3N0X25vKTsKLQkJbWJbMV0gfD0gQklUXzk7CisJCW1iWzFdIHw9IG52LT5maXJtd2FyZV9mZWF0dXJlLmYudW51c2VkXzkgPDwgOTsgLyogWFhYICovCiAJfQogI2VuZGlmCi0Jc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBtYXNrLCAmbWJbMF0pOworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgbWIpOwogCiAJLyogUmV0cnkgY291bnQgYW5kIGRlbGF5LiAqLwogCW1iWzBdID0gTUJDX1NFVF9SRVRSWV9DT1VOVDsKQEAgLTI1MzUsMjcgKzI0NTUsMjcgQEAKIAkJbWJbMl0gfD0gQklUXzU7CiAJaWYgKG52LT5idXNbMV0uY29uZmlnXzIuZGF0YV9saW5lX2FjdGl2ZV9uZWdhdGlvbikKIAkJbWJbMl0gfD0gQklUXzQ7Ci0Jc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsIG1iKTsKIAogCW1iWzBdID0gTUJDX1NFVF9EQVRBX09WRVJSVU5fUkVDT1ZFUlk7CiAJbWJbMV0gPSAyOwkvKiBSZXNldCBTQ1NJIGJ1cyBhbmQgcmV0dXJuIGFsbCBvdXRzdGFuZGluZyBJTyAqLwotCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsIG1iKTsKIAogCS8qIHRoaW5neSAqLwogCW1iWzBdID0gTUJDX1NFVF9QQ0lfQ09OVFJPTDsKLQltYlsxXSA9IDI7CS8qIERhdGEgRE1BIENoYW5uZWwgQnVyc3QgRW5hYmxlICovCi0JbWJbMl0gPSAyOwkvKiBDb21tYW5kIERNQSBDaGFubmVsIEJ1cnN0IEVuYWJsZSAqLwotCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCW1iWzFdID0gQklUXzE7CS8qIERhdGEgRE1BIENoYW5uZWwgQnVyc3QgRW5hYmxlICovCisJbWJbMl0gPSBCSVRfMTsJLyogQ29tbWFuZCBETUEgQ2hhbm5lbCBCdXJzdCBFbmFibGUgKi8KKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8yIHwgQklUXzEgfCBCSVRfMCwgbWIpOwogCiAJbWJbMF0gPSBNQkNfU0VUX1RBR19BR0VfTElNSVQ7CiAJbWJbMV0gPSA4OwotCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsIG1iKTsKIAogCS8qIFNlbGVjdGlvbiB0aW1lb3V0LiAqLwogCW1iWzBdID0gTUJDX1NFVF9TRUxFQ1RJT05fVElNRU9VVDsKIAltYlsxXSA9IG52LT5idXNbMF0uc2VsZWN0aW9uX3RpbWVvdXQ7CiAJbWJbMl0gPSBudi0+YnVzWzFdLnNlbGVjdGlvbl90aW1lb3V0OwotCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCBtYik7CiAKIAlmb3IgKGJ1cyA9IDA7IGJ1cyA8IGhhLT5wb3J0czsgYnVzKyspCiAJCXN0YXR1cyB8PSBxbGExMjgwX2NvbmZpZ19idXMoaGEsIGJ1cyk7CkBAIC0zMDY2LDcgKzI5ODYsNyBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7CiAJY21kX2E2NF9lbnRyeV90ICpwa3Q7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7Ci0JdTMyICpkd29yZF9wdHI7CisJX19sZTMyICpkd29yZF9wdHI7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwogCWludCBzdGF0dXMgPSAwOwogCWludCBjbnQ7CkBAIC0zMTA0LDEwICszMDI0LDEzIEBACiAJCQkJUkVRVUVTVF9FTlRSWV9DTlQgLSAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKIAl9CiAKKwlkcHJpbnRrKDMsICJOdW1iZXIgb2YgZnJlZSBlbnRyaWVzPSglZCkgc2VnX2NudD0weCV4XG4iLAorCQloYS0+cmVxX3FfY250LCBzZWdfY250KTsKKwogCS8qIElmIHJvb20gZm9yIHJlcXVlc3QgaW4gcmVxdWVzdCByaW5nLiAqLwogCWlmICgocmVxX2NudCArIDIpID49IGhhLT5yZXFfcV9jbnQpIHsKIAkJc3RhdHVzID0gMTsKLQkJZHByaW50aygyLCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBpbi1wdHI9MHgleCAgcmVxX3FfY250PSIKKwkJZHByaW50aygyLCAicWxhMTI4MF9zdGFydF9zY3NpOiBpbi1wdHI9MHgleCAgcmVxX3FfY250PSIKIAkJCSIweCV4cmVxX2NudD0weCV4IiwgaGEtPnJlcV9yaW5nX2luZGV4LCBoYS0+cmVxX3FfY250LAogCQkJcmVxX2NudCk7CiAJCWdvdG8gb3V0OwpAQCAtMzExOSw3ICszMDQyLDcgQEAKIAogCWlmIChjbnQgPj0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7CiAJCXN0YXR1cyA9IDE7Ci0JCWRwcmludGsoMiwgInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaTogTk8gUk9PTSBJTiAiCisJCWRwcmludGsoMiwgInFsYTEyODBfc3RhcnRfc2NzaTogTk8gUk9PTSBJTiAiCiAJCQkiT1VUU1RBTkRJTkcgQVJSQVksIHJlcV9xX2NudD0weCV4IiwgaGEtPnJlcV9xX2NudCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMxMjgsNyArMzA1MSw3IEBACiAJaGEtPnJlcV9xX2NudCAtPSByZXFfY250OwogCUNNRF9IQU5ETEUoc3AtPmNtZCkgPSAodW5zaWduZWQgY2hhciAqKSh1bnNpZ25lZCBsb25nKShjbnQgKyAxKTsKIAotCWRwcmludGsoMiwgIjY0Yml0X3N0YXJ0OiBjbWQ9JXAgc3A9JXAgQ0RCPSV4bSwgaGFuZGxlICVseFxuIiwgY21kLCBzcCwKKwlkcHJpbnRrKDIsICJzdGFydDogY21kPSVwIHNwPSVwIENEQj0leG0sIGhhbmRsZSAlbHhcbiIsIGNtZCwgc3AsCiAJCWNtZC0+Y21uZFswXSwgKGxvbmcpQ01EX0hBTkRMRShzcC0+Y21kKSk7CiAJZHByaW50aygyLCAiICAgICAgICAgICAgIGJ1cyAlaSwgdGFyZ2V0ICVpLCBsdW4gJWlcbiIsCiAJCVNDU0lfQlVTXzMyKGNtZCksIFNDU0lfVENOXzMyKGNtZCksIFNDU0lfTFVOXzMyKGNtZCkpOwpAQCAtMzM1MCw3ICszMjczLDcgQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcC0+Y21kOwogCXN0cnVjdCBjbWRfZW50cnkgKnBrdDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKLQl1aW50MzJfdCAqZHdvcmRfcHRyOworCV9fbGUzMiAqZHdvcmRfcHRyOwogCWludCBzdGF0dXMgPSAwOwogCWludCBjbnQ7CiAJaW50IHJlcV9jbnQ7CkBAIC0zOTkzLDIxICszOTE2LDIxIEBACiAJcmVzdWx0ID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKIAluID0gJmhhLT5udnJhbTsKIAotCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlID0gMDsKLQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfc3luYyA9IDA7CisJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmVuYWJsZV93aWRlID0gMDsKKwluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3N5bmMgPSAwOwogCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByID0gMDsKIAogICAgICAgICBpZiAocmVzdWx0WzddICYgMHg2MCkKLQkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSAxOworCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3dpZGUgPSAxOwogICAgICAgICBpZiAocmVzdWx0WzddICYgMHgxMCkKLQkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMgPSAxOworCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3N5bmMgPSAxOwogCWlmICgocmVzdWx0WzJdID49IDMpICYmIChyZXN1bHRbNF0gKyA1ID4gNTYpICYmCiAJICAgIChyZXN1bHRbNTZdICYgMHg0KSkKIAkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPSAxOwogCiAJZHByaW50aygyLCAiZ2V0X3RhcmdldF9vcHRpb25zKCk6IHdpZGUgJWksIHN5bmMgJWksIHBwciAlaVxuIiwKLQkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUsCi0JCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jLAorCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZW5hYmxlX3dpZGUsCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5lbmFibGVfc3luYywKIAkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIpOwogfQogI2VuZGlmCkBAIC00MDcxLDcgKzM5OTQsNyBAQAogCQkvKiBTYXZlIElTUCBjb21wbGV0aW9uIHN0YXR1cyAqLwogCQlDTURfUkVTVUxUKGNtZCkgPSBxbGExMjgwX3JldHVybl9zdGF0dXMocGt0LCBjbWQpOwogCi0JCWlmIChzY3NpX3N0YXR1cyAmIFNTX0NIRUNLX0NPTkRJVElPTikgeworCQlpZiAoc2NzaV9zdGF0dXMgJiBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pIHsKIAkJCWlmIChjb21wX3N0YXR1cyAhPSBDU19BUlNfRkFJTEVEKSB7CiAJCQkJdWludDE2X3QgcmVxX3NlbnNlX2xlbmd0aCA9CiAJCQkJCWxlMTZfdG9fY3B1KHBrdC0+cmVxX3NlbnNlX2xlbmd0aCk7CkBAIC00NjUwLDcgKzQ1NzMsNyBAQAogCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCAoZG1hX2FkZHJfdCkgfiAwVUxMKSkgewogCQlpZiAocGNpX3NldF9kbWFfbWFzayhoYS0+cGRldiwgMHhmZmZmZmZmZikpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxpKTogVW5hYmxlIHRvIHNldCBhICIKLQkJCSAgICAgICAiIHN1aXRhYmxlIERNQSBtYXNrIC0gYWJvcmluZ1xuIiwgaGEtPmhvc3Rfbm8pOworCQkJICAgICAgICJzdWl0YWJsZSBETUEgbWFzayAtIGFib3J0aW5nXG4iLCBoYS0+aG9zdF9ubyk7CiAJCQllcnJvciA9IC1FTk9ERVY7CiAJCQlnb3RvIGVycm9yX2ZyZWVfaXJxOwogCQl9CkBAIC00NjYwLDE0ICs0NTgzLDE0IEBACiAjZWxzZQogCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCAweGZmZmZmZmZmKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpKCVsaSk6IFVuYWJsZSB0byBzZXQgYSAiCi0JCSAgICAgICAiIHN1aXRhYmxlIERNQSBtYXNrIC0gYWJvcmluZ1xuIiwgaGEtPmhvc3Rfbm8pOworCQkgICAgICAgInN1aXRhYmxlIERNQSBtYXNrIC0gYWJvcnRpbmdcbiIsIGhhLT5ob3N0X25vKTsKIAkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yX2ZyZWVfaXJxOwogCX0KICNlbmRpZgogCiAJaGEtPnJlcXVlc3RfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LAotCQkJKChSRVFVRVNUX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihyZXF1ZXN0X3QpKSksCisJCQkoKFJFUVVFU1RfRU5UUllfQ05UICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSksCiAJCQkmaGEtPnJlcXVlc3RfZG1hKTsKIAlpZiAoIWhhLT5yZXF1ZXN0X3JpbmcpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogRmFpbGVkIHRvIGdldCByZXF1ZXN0IG1lbW9yeVxuIik7CkBAIC00Njc1LDcgKzQ1OTgsNyBAQAogCX0KIAogCWhhLT5yZXNwb25zZV9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsCi0JCQkoKFJFU1BPTlNFX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihzdHJ1Y3QgcmVzcG9uc2UpKSksCisJCQkoKFJFU1BPTlNFX0VOVFJZX0NOVCArIDEpICogc2l6ZW9mKHN0cnVjdCByZXNwb25zZSkpLAogCQkJJmhhLT5yZXNwb25zZV9kbWEpOwogCWlmICghaGEtPnJlc3BvbnNlX3JpbmcpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogRmFpbGVkIHRvIGdldCByZXNwb25zZSBtZW1vcnlcbiIpOwpAQCAtNDc1OCw3ICs0NjgxLDcgQEAKIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDYwMAogIGVycm9yX2Rpc2FibGVfYWRhcHRlcjoKLQlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmljdHJsLCAwKTsKKwlxbGExMjgwX2Rpc2FibGVfaW50cnMoaGEpOwogI2VuZGlmCiAgZXJyb3JfZnJlZV9pcnE6CiAJZnJlZV9pcnEocGRldi0+aXJxLCBoYSk7CkBAIC00NzcwLDExICs0NjkzLDExIEBACiAjZW5kaWYKICBlcnJvcl9mcmVlX3Jlc3BvbnNlX3Jpbmc6CiAJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwKLQkJCSgoUkVTUE9OU0VfRU5UUllfQ05UICsgMSkgKiAoc2l6ZW9mKHN0cnVjdCByZXNwb25zZSkpKSwKKwkJCSgoUkVTUE9OU0VfRU5UUllfQ05UICsgMSkgKiBzaXplb2Yoc3RydWN0IHJlc3BvbnNlKSksCiAJCQloYS0+cmVzcG9uc2VfcmluZywgaGEtPnJlc3BvbnNlX2RtYSk7CiAgZXJyb3JfZnJlZV9yZXF1ZXN0X3Jpbmc6CiAJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwKLQkJCSgoUkVRVUVTVF9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2YocmVxdWVzdF90KSkpLAorCQkJKChSRVFVRVNUX0VOVFJZX0NOVCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCkpLAogCQkJaGEtPnJlcXVlc3RfcmluZywgaGEtPnJlcXVlc3RfZG1hKTsKICBlcnJvcl9wdXRfaG9zdDoKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwpAQCAtNDc5NSw3ICs0NzE4LDcgQEAKIAlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOwogI2VuZGlmCiAKLQlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmljdHJsLCAwKTsKKwlxbGExMjgwX2Rpc2FibGVfaW50cnMoaGEpOwogCiAJZnJlZV9pcnEocGRldi0+aXJxLCBoYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmggYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5oCmluZGV4IGQyNDVhZTAuLjU5OTE1ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuaApAQCAtOTQsOSArOTQsNiBAQAogI2RlZmluZSBSRVFVRVNUX0VOVFJZX0NOVAkJMjU2IC8qIE51bWJlciBvZiByZXF1ZXN0IGVudHJpZXMuICovCiAjZGVmaW5lIFJFU1BPTlNFX0VOVFJZX0NOVAkJMTYgIC8qIE51bWJlciBvZiByZXNwb25zZSBlbnRyaWVzLiAqLwogCi0vKiBOdW1iZXIgb2Ygc2VnbWVudHMgMSAtIDY1NTM1ICovCi0jZGVmaW5lIFNHX1NFR01FTlRTCQkJMzIgIC8qIENtZCBlbnRyeSArIDYgY29udGludWF0aW9ucyAqLwotCiAvKgogICogU0NTSSBSZXF1ZXN0IEJsb2NrIHN0cnVjdHVyZSAgKHNwKSAgdGhhdCBpcyBwbGFjZWQKICAqIG9uIGNtZC0+U0NwIGxvY2F0aW9uIG9mIGV2ZXJ5IEkvTwpAQCAtMzc4LDI5ICszNzUsMjMgQEAKIAl1aW50MTZfdCB1bnVzZWRfMTI7CS8qIDEyLCAxMyAqLwogCXVpbnQxNl90IHVudXNlZF8xNDsJLyogMTQsIDE1ICovCiAKLQl1bmlvbiB7Ci0JCXVpbnQ4X3QgYzsKLQkJc3RydWN0IHsKLQkJCXVpbnQ4X3QgcmVzZXJ2ZWQ6MjsKLQkJCXVpbnQ4X3QgYnVyc3RfZW5hYmxlOjE7Ci0JCQl1aW50OF90IHJlc2VydmVkXzE6MTsKLQkJCXVpbnQ4X3QgZmlmb190aHJlc2hvbGQ6NDsKLQkJfSBmOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcmVzZXJ2ZWQ6MjsKKwkJdWludDhfdCBidXJzdF9lbmFibGU6MTsKKwkJdWludDhfdCByZXNlcnZlZF8xOjE7CisJCXVpbnQ4X3QgZmlmb190aHJlc2hvbGQ6NDsKIAl9IGlzcF9jb25maWc7CQkvKiAxNiAqLwogCiAJLyogVGVybWluYXRpb24KIAkgKiAwID0gRGlzYWJsZSwgMSA9IGhpZ2ggb25seSwgMyA9IEF1dG8gdGVybQogCSAqLwotCXVuaW9uIHsKLQkJdWludDhfdCBjOwotCQlzdHJ1Y3QgewotCQkJdWludDhfdCBzY3NpX2J1c18xX2NvbnRyb2w6MjsKLQkJCXVpbnQ4X3Qgc2NzaV9idXNfMF9jb250cm9sOjI7Ci0JCQl1aW50OF90IHVudXNlZF8wOjE7Ci0JCQl1aW50OF90IHVudXNlZF8xOjE7Ci0JCQl1aW50OF90IHVudXNlZF8yOjE7Ci0JCQl1aW50OF90IGF1dG9fdGVybV9zdXBwb3J0OjE7Ci0JCX0gZjsKKwlzdHJ1Y3QgeworCQl1aW50OF90IHNjc2lfYnVzXzFfY29udHJvbDoyOworCQl1aW50OF90IHNjc2lfYnVzXzBfY29udHJvbDoyOworCQl1aW50OF90IHVudXNlZF8wOjE7CisJCXVpbnQ4X3QgdW51c2VkXzE6MTsKKwkJdWludDhfdCB1bnVzZWRfMjoxOworCQl1aW50OF90IGF1dG9fdGVybV9zdXBwb3J0OjE7CiAJfSB0ZXJtaW5hdGlvbjsJCS8qIDE3ICovCiAKIAl1aW50MTZfdCBpc3BfcGFyYW1ldGVyOwkvKiAxOCwgMTkgKi8KQEAgLTQ2MCwxOCArNDUxLDE1IEBACiAJCXVpbnQxNl90IHVudXNlZF8zODsJLyogMzgsIDM5ICovCiAKIAkJc3RydWN0IHsKLQkJCXVuaW9uIHsKLQkJCQl1aW50OF90IGM7Ci0JCQkJc3RydWN0IHsKLQkJCQkJdWludDhfdCByZW5lZ290aWF0ZV9vbl9lcnJvcjoxOwotCQkJCQl1aW50OF90IHN0b3BfcXVldWVfb25fY2hlY2s6MTsKLQkJCQkJdWludDhfdCBhdXRvX3JlcXVlc3Rfc2Vuc2U6MTsKLQkJCQkJdWludDhfdCB0YWdfcXVldWluZzoxOwotCQkJCQl1aW50OF90IGVuYWJsZV9zeW5jOjE7Ci0JCQkJCXVpbnQ4X3QgZW5hYmxlX3dpZGU6MTsKLQkJCQkJdWludDhfdCBwYXJpdHlfY2hlY2tpbmc6MTsKLQkJCQkJdWludDhfdCBkaXNjb25uZWN0X2FsbG93ZWQ6MTsKLQkJCQl9IGY7CisJCQlzdHJ1Y3QgeworCQkJCXVpbnQ4X3QgcmVuZWdvdGlhdGVfb25fZXJyb3I6MTsKKwkJCQl1aW50OF90IHN0b3BfcXVldWVfb25fY2hlY2s6MTsKKwkJCQl1aW50OF90IGF1dG9fcmVxdWVzdF9zZW5zZToxOworCQkJCXVpbnQ4X3QgdGFnX3F1ZXVpbmc6MTsKKwkJCQl1aW50OF90IGVuYWJsZV9zeW5jOjE7CisJCQkJdWludDhfdCBlbmFibGVfd2lkZToxOworCQkJCXVpbnQ4X3QgcGFyaXR5X2NoZWNraW5nOjE7CisJCQkJdWludDhfdCBkaXNjb25uZWN0X2FsbG93ZWQ6MTsKIAkJCX0gcGFyYW1ldGVyOwkvKiA0MCAqLwogCiAJCQl1aW50OF90IGV4ZWN1dGlvbl90aHJvdHRsZTsJLyogNDEgKi8KQEAgLTUyOCwyMyArNTE2LDIzIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3Qgc3lzX2RlZmluZTsJCS8qIFN5c3RlbSBkZWZpbmVkLiAqLwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJX19sZTMyIGhhbmRsZTsJCQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwogCXVpbnQ4X3QgbHVuOwkJCS8qIFNDU0kgTFVOICovCiAJdWludDhfdCB0YXJnZXQ7CQkJLyogU0NTSSBJRCAqLwotCXVpbnQxNl90IGNkYl9sZW47CQkvKiBTQ1NJIGNvbW1hbmQgbGVuZ3RoLiAqLwotCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CQkvKiBDb250cm9sIGZsYWdzLiAqLwotCXVpbnQxNl90IHJlc2VydmVkOwotCXVpbnQxNl90IHRpbWVvdXQ7CQkvKiBDb21tYW5kIHRpbWVvdXQuICovCi0JdWludDE2X3QgZHNlZ19jb3VudDsJCS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwlfX2xlMTYgY2RiX2xlbjsJCQkvKiBTQ1NJIGNvbW1hbmQgbGVuZ3RoLiAqLworCV9fbGUxNiBjb250cm9sX2ZsYWdzOwkJLyogQ29udHJvbCBmbGFncy4gKi8KKwlfX2xlMTYgcmVzZXJ2ZWQ7CisJX19sZTE2IHRpbWVvdXQ7CQkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCV9fbGUxNiBkc2VnX2NvdW50OwkJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLwogCXVpbnQ4X3Qgc2NzaV9jZGJbTUFYX0NNRFNaXTsJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzJfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMF9hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18xX2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzJfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJX19sZTMyIGRzZWdfM19hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KIH07CiAKIC8qCkBAIC01NTYsMjEgKzU0NCwyMSBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KIAl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KLQl1aW50MzJfdCByZXNlcnZlZDsJCS8qIFJlc2VydmVkICovCi0JdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18zX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzRfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzRfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfNV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgNSBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfNV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNSBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ182X2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCA2IGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ182X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA2IGxlbmd0aC4gKi8KKwlfX2xlMzIgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCAqLworCV9fbGUzMiBkc2VnXzBfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMV9hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18yX2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzJfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzNfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfM19sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMyBsZW5ndGguICovCisJX19sZTMyIGRzZWdfNF9hZGRyZXNzOwkJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ180X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA0IGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ181X2FkZHJlc3M7CQkvKiBEYXRhIHNlZ21lbnQgNSBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzVfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDUgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzZfYWRkcmVzczsJCS8qIERhdGEgc2VnbWVudCA2IGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfNl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNiBsZW5ndGguICovCiB9OwogCiAvKgpAQCAtNTg2LDIyICs1NzQsMjIgQEAKICNkZWZpbmUgUkZfRlVMTCAgICAgICAgIEJJVF8xCS8qIEZ1bGwgKi8KICNkZWZpbmUgUkZfQkFEX0hFQURFUiAgIEJJVF8yCS8qIEJhZCBoZWFkZXIuICovCiAjZGVmaW5lIFJGX0JBRF9QQVlMT0FEICBCSVRfMwkvKiBCYWQgcGF5bG9hZC4gKi8KLQl1aW50MzJfdCBoYW5kbGU7CS8qIFN5c3RlbSBoYW5kbGUuICovCi0JdWludDE2X3Qgc2NzaV9zdGF0dXM7CS8qIFNDU0kgc3RhdHVzLiAqLwotCXVpbnQxNl90IGNvbXBfc3RhdHVzOwkvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KLQl1aW50MTZfdCBzdGF0ZV9mbGFnczsJLyogU3RhdGUgZmxhZ3MuICovCi0jZGVmaW5lIFNGX1RSQU5TRkVSX0NNUEwgQklUXzE0CS8qIFRyYW5zZmVyIENvbXBsZXRlLiAqLwotI2RlZmluZSBTRl9HT1RfU0VOU0UgICAgQklUXzEzCS8qIEdvdCBTZW5zZSAqLwotI2RlZmluZSBTRl9HT1RfU1RBVFVTICAgIEJJVF8xMgkvKiBHb3QgU3RhdHVzICovCi0jZGVmaW5lIFNGX1RSQU5TRkVSUkVEX0RBVEEgQklUXzExCS8qIFRyYW5zZmVycmVkIGRhdGEgKi8KLSNkZWZpbmUgU0ZfU0VOVF9DREIgICBCSVRfMTAJLyogU2VuZCBDREIgKi8KLSNkZWZpbmUgU0ZfR09UX1RBUkdFVCAgQklUXzkJLyogICovCi0jZGVmaW5lIFNGX0dPVF9CVVMgICAgIEJJVF84CS8qICAqLwotCXVpbnQxNl90IHN0YXR1c19mbGFnczsJLyogU3RhdHVzIGZsYWdzLiAqLwotCXVpbnQxNl90IHRpbWU7CQkvKiBUaW1lLiAqLwotCXVpbnQxNl90IHJlcV9zZW5zZV9sZW5ndGg7CS8qIFJlcXVlc3Qgc2Vuc2UgZGF0YSBsZW5ndGguICovCi0JdWludDMyX3QgcmVzaWR1YWxfbGVuZ3RoOwkvKiBSZXNpZHVhbCB0cmFuc2ZlciBsZW5ndGguICovCi0JdWludDE2X3QgcmVzZXJ2ZWRbNF07CisJX19sZTMyIGhhbmRsZTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJX19sZTE2IHNjc2lfc3RhdHVzOwkvKiBTQ1NJIHN0YXR1cy4gKi8KKwlfX2xlMTYgY29tcF9zdGF0dXM7CS8qIENvbXBsZXRpb24gc3RhdHVzLiAqLworCV9fbGUxNiBzdGF0ZV9mbGFnczsJLyogU3RhdGUgZmxhZ3MuICovCisjZGVmaW5lIFNGX1RSQU5TRkVSX0NNUEwJQklUXzE0CS8qIFRyYW5zZmVyIENvbXBsZXRlLiAqLworI2RlZmluZSBTRl9HT1RfU0VOU0UJIAlCSVRfMTMJLyogR290IFNlbnNlICovCisjZGVmaW5lIFNGX0dPVF9TVEFUVVMJIAlCSVRfMTIJLyogR290IFN0YXR1cyAqLworI2RlZmluZSBTRl9UUkFOU0ZFUlJFRF9EQVRBCUJJVF8xMQkvKiBUcmFuc2ZlcnJlZCBkYXRhICovCisjZGVmaW5lIFNGX1NFTlRfQ0RCCSAJQklUXzEwCS8qIFNlbmQgQ0RCICovCisjZGVmaW5lIFNGX0dPVF9UQVJHRVQJIAlCSVRfOQkvKiAgKi8KKyNkZWZpbmUgU0ZfR09UX0JVUwkgCUJJVF84CS8qICAqLworCV9fbGUxNiBzdGF0dXNfZmxhZ3M7CS8qIFN0YXR1cyBmbGFncy4gKi8KKwlfX2xlMTYgdGltZTsJCS8qIFRpbWUuICovCisJX19sZTE2IHJlcV9zZW5zZV9sZW5ndGg7LyogUmVxdWVzdCBzZW5zZSBkYXRhIGxlbmd0aC4gKi8KKwlfX2xlMzIgcmVzaWR1YWxfbGVuZ3RoOwkvKiBSZXNpZHVhbCB0cmFuc2ZlciBsZW5ndGguICovCisJX19sZTE2IHJlc2VydmVkWzRdOwogCXVpbnQ4X3QgcmVxX3NlbnNlX2RhdGFbMzJdOwkvKiBSZXF1ZXN0IHNlbnNlIGRhdGEuICovCiB9OwogCkBAIC02MTQsNyArNjAyLDcgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHN5c19kZWZpbmU7CS8qIFN5c3RlbSBkZWZpbmVkLiAqLwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWQ7CisJX19sZTMyIHJlc2VydmVkOwogCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KIAl1aW50OF90IHRhcmdldDsJCS8qIFNDU0kgSUQgKi8KIAl1aW50OF90IG1vZGlmaWVyOwkvKiBNb2RpZmllciAoNy0wKS4gKi8KQEAgLTYzOCwxMSArNjI2LDExIEBACiAJdWludDMyX3QgaGFuZGxlOwkvKiBTeXN0ZW0gaGFuZGxlLiAqLwogCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KIAl1aW50OF90IHRhcmdldDsJCS8qIFNDU0kgSUQgKi8KLQl1aW50MTZfdCBjZGJfbGVuOwkvKiBTQ1NJIGNvbW1hbmQgbGVuZ3RoLiAqLwotCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CS8qIENvbnRyb2wgZmxhZ3MuICovCi0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZW91dDsJLyogQ29tbWFuZCB0aW1lb3V0LiAqLwotCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwlfX2xlMTYgY2RiX2xlbjsJCS8qIFNDU0kgY29tbWFuZCBsZW5ndGguICovCisJX19sZTE2IGNvbnRyb2xfZmxhZ3M7CS8qIENvbnRyb2wgZmxhZ3MuICovCisJX19sZTE2IHJlc2VydmVkOworCV9fbGUxNiB0aW1lb3V0OwkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCV9fbGUxNiBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCiAJdWludDhfdCBzY3NpX2NkYls4OF07CS8qIFNDU0kgY29tbWFuZCB3b3Jkcy4gKi8KIH07CiAKQEAgLTY1NSwyMCArNjQzLDIwIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IGhhbmRsZTsJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwlfX2xlMzIgaGFuZGxlOwkvKiBTeXN0ZW0gaGFuZGxlLiAqLwogCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KIAl1aW50OF90IHRhcmdldDsJCS8qIFNDU0kgSUQgKi8KLQl1aW50MTZfdCBjZGJfbGVuOwkvKiBTQ1NJIGNvbW1hbmQgbGVuZ3RoLiAqLwotCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CS8qIENvbnRyb2wgZmxhZ3MuICovCi0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZW91dDsJLyogQ29tbWFuZCB0aW1lb3V0LiAqLwotCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwlfX2xlMTYgY2RiX2xlbjsJLyogU0NTSSBjb21tYW5kIGxlbmd0aC4gKi8KKwlfX2xlMTYgY29udHJvbF9mbGFnczsJLyogQ29udHJvbCBmbGFncy4gKi8KKwlfX2xlMTYgcmVzZXJ2ZWQ7CisJX19sZTE2IHRpbWVvdXQ7CS8qIENvbW1hbmQgdGltZW91dC4gKi8KKwlfX2xlMTYgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLwogCXVpbnQ4X3Qgc2NzaV9jZGJbTUFYX0NNRFNaXTsJLyogU0NTSSBjb21tYW5kIHdvcmRzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzFbMl07CS8qIHVudXNlZCAqLwotCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJX19sZTMyIHJlc2VydmVkXzFbMl07CS8qIHVudXNlZCAqLworCV9fbGUzMiBkc2VnXzBfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLwogfSBjbWRfYTY0X2VudHJ5X3QsIHJlcXVlc3RfdDsKIAogLyoKQEAgLTY4MCwxNiArNjY4LDE2IEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18yX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18yX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzRfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzRfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgNCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzBfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18xX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KKwlfX2xlMzIgZHNlZ18yX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJX19sZTMyIGRzZWdfM19hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzNfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzRfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ180X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA0IGxlbmd0aC4gKi8KIH07CiAKIC8qCkBAIC03MDEsMTAgKzY4OSwxMCBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzIG5vdCB1c2VkLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzI7Ci0JdWludDE2X3QgbHVuOwkJLyogQml0IDE1IGlzIGJ1cyBudW1iZXIuICovCi0JdWludDE2X3QgcmVzZXJ2ZWRfNDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIHJlc2VydmVkXzI7CisJX19sZTE2IGx1bjsJCS8qIEJpdCAxNSBpcyBidXMgbnVtYmVyLiAqLworCV9fbGUxNiByZXNlcnZlZF80OworCV9fbGUzMiBvcHRpb25fZmxhZ3M7CiAJdWludDhfdCBzdGF0dXM7CiAJdWludDhfdCByZXNlcnZlZF81OwogCXVpbnQ4X3QgY29tbWFuZF9jb3VudDsJLyogTnVtYmVyIG9mIEFUSU9zIGFsbG9jYXRlZC4gKi8KQEAgLTcxNCw4ICs3MDIsOCBAQAogCS8qIGNvbW1hbmRzICgyLTI2KS4gKi8KIAl1aW50OF90IGdyb3VwXzdfbGVuZ3RoOwkvKiBTQ1NJIENEQiBsZW5ndGggZm9yIGdyb3VwIDcgKi8KIAkvKiBjb21tYW5kcyAoMi0yNikuICovCi0JdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KLQl1aW50MTZfdCByZXNlcnZlZF82WzIwXTsKKwlfX2xlMTYgdGltZW91dDsJCS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJX19sZTE2IHJlc2VydmVkXzZbMjBdOwogfTsKIAogLyoKQEAgLTcyOSwyMCArNzE3LDIwIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCiAJdWludDhfdCByZXNlcnZlZF8zOwogCXVpbnQ4X3Qgb3BlcmF0b3JzOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfNDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IHJlc2VydmVkXzU7CiAJdWludDhfdCBjb21tYW5kX2NvdW50OwkvKiBOdW1iZXIgb2YgQVRJT3MgYWxsb2NhdGVkLiAqLwogCXVpbnQ4X3QgaW1tZWRfbm90aWZ5X2NvdW50OwkvKiBOdW1iZXIgb2YgSW1tZWRpYXRlIE5vdGlmeSAqLwogCS8qIGVudHJpZXMgYWxsb2NhdGVkLiAqLwotCXVpbnQxNl90IHJlc2VydmVkXzY7Ci0JdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KLQl1aW50MTZfdCByZXNlcnZlZF83WzIwXTsKKwlfX2xlMTYgcmVzZXJ2ZWRfNjsKKwlfX2xlMTYgdGltZW91dDsJCS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJX19sZTE2IHJlc2VydmVkXzdbMjBdOwogfTsKIAogLyoKQEAgLTc1NCwyMCArNzQyLDIwIEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsKIAl1aW50OF90IGluaXRpYXRvcl9pZDsKIAl1aW50OF90IHJlc2VydmVkXzM7CiAJdWludDhfdCB0YXJnZXRfaWQ7Ci0JdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCV9fbGUzMiBvcHRpb25fZmxhZ3M7CiAJdWludDhfdCBzdGF0dXM7CiAJdWludDhfdCByZXNlcnZlZF80OwogCXVpbnQ4X3QgdGFnX3ZhbHVlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB2YWx1ZSAqLwogCXVpbnQ4X3QgdGFnX3R5cGU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHR5cGUgKi8KIAkvKiBlbnRyaWVzIGFsbG9jYXRlZC4gKi8KLQl1aW50MTZfdCBzZXFfaWQ7CisJX19sZTE2IHNlcV9pZDsKIAl1aW50OF90IHNjc2lfbXNnWzhdOwkvKiBTQ1NJIG1lc3NhZ2Ugbm90IGhhbmRsZWQgYnkgSVNQICovCi0JdWludDE2X3QgcmVzZXJ2ZWRfNVs4XTsKKwlfX2xlMTYgcmVzZXJ2ZWRfNVs4XTsKIAl1aW50OF90IHNlbnNlX2RhdGFbMThdOwogfTsKIApAQCAtNzgwLDE2ICs3NjgsMTYgQEAKIAl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KIAl1aW50OF90IHJlc2VydmVkXzE7CiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KLQl1aW50MzJfdCByZXNlcnZlZF8yOworCV9fbGUzMiByZXNlcnZlZF8yOwogCXVpbnQ4X3QgbHVuOwogCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKIAl1aW50OF90IHRhcmdldF9pZDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IGV2ZW50OwotCXVpbnQxNl90IHNlcV9pZDsKLQl1aW50MTZfdCByZXNlcnZlZF80WzIyXTsKKwlfX2xlMTYgc2VxX2lkOworCV9fbGUxNiByZXNlcnZlZF80WzIyXTsKIH07CiAKIC8qCkBAIC04MDEsMTIgKzc4OSwxMiBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzI7CisJX19sZTMyIHJlc2VydmVkXzI7CiAJdWludDhfdCBsdW47CiAJdWludDhfdCBpbml0aWF0b3JfaWQ7CiAJdWludDhfdCBjZGJfbGVuOwogCXVpbnQ4X3QgdGFyZ2V0X2lkOwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CiAJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCkBAIC04MjQsMjggKzgxMiwyOCBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzI7CisJX19sZTMyIHJlc2VydmVkXzI7CiAJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLwogCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKIAl1aW50OF90IHRhcmdldF9pZDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IHNjc2lfc3RhdHVzOwogCXVpbnQ4X3QgdGFnX3ZhbHVlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB2YWx1ZSAqLwogCXVpbnQ4X3QgdGFnX3R5cGU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHR5cGUgKi8KLQl1aW50MzJfdCB0cmFuc2Zlcl9sZW5ndGg7Ci0JdWludDMyX3QgcmVzaWR1YWw7Ci0JdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KLQl1aW50MTZfdCBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCi0JdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLwotCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLwotCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KLQl1aW50MzJfdCBkc2VnXzJfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzJfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18zX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLworCV9fbGUzMiB0cmFuc2Zlcl9sZW5ndGg7CisJX19sZTMyIHJlc2lkdWFsOworCV9fbGUxNiB0aW1lb3V0OwkJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwlfX2xlMTYgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUzMiBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzJfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDIgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18yX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzNfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18zX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLwogfTsKIAogLyoKQEAgLTg1NywyNCArODQ1LDI0IEBACiAJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCiAJdWludDhfdCByZXNlcnZlZF8xOwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwlfX2xlMzIgcmVzZXJ2ZWRfMjsKIAl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCiAJdWludDhfdCBpbml0aWF0b3JfaWQ7CiAJdWludDhfdCByZXNlcnZlZF8zOwogCXVpbnQ4X3QgdGFyZ2V0X2lkOwotCXVpbnQzMl90IG9wdGlvbl9mbGFnczsKKwlfX2xlMzIgb3B0aW9uX2ZsYWdzOwogCXVpbnQ4X3Qgc3RhdHVzOwogCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CiAJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCiAJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLwotCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKLQl1aW50MzJfdCByZXNpZHVhbDsKLQl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLwotCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KLQl1aW50MzJfdCBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCi0JdWludDE2X3QgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCV9fbGUzMiB0cmFuc2Zlcl9sZW5ndGg7CisJX19sZTMyIHJlc2lkdWFsOworCV9fbGUxNiB0aW1lb3V0OwkJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwlfX2xlMTYgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUzMiBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwlfX2xlMzIgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCV9fbGUzMiBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwlfX2xlMTYgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLwogCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07CiB9OwogCkBAIC04ODcsMjUgKzg3NSwyNSBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzI7CisJX19sZTMyIHJlc2VydmVkXzI7CiAJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLwogCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKIAl1aW50OF90IHRhcmdldF9pZDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IHNjc2lfc3RhdHVzOwogCXVpbnQ4X3QgdGFnX3ZhbHVlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB2YWx1ZSAqLwogCXVpbnQ4X3QgdGFnX3R5cGU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHR5cGUgKi8KLQl1aW50MzJfdCB0cmFuc2Zlcl9sZW5ndGg7Ci0JdWludDMyX3QgcmVzaWR1YWw7Ci0JdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KLQl1aW50MTZfdCBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfNFsyXTsKLQl1aW50MzJfdCBkc2VnXzBfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCi0JdWludDMyX3QgZHNlZ18xX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCi0JdWludDMyX3QgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCV9fbGUzMiB0cmFuc2Zlcl9sZW5ndGg7CisJX19sZTMyIHJlc2lkdWFsOworCV9fbGUxNiB0aW1lb3V0OwkJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KKwlfX2xlMTYgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCV9fbGUzMiByZXNlcnZlZF80WzJdOworCV9fbGUzMiBkc2VnXzBfYWRkcmVzc1syXTsvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCV9fbGUzMiBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJX19sZTMyIGRzZWdfMV9hZGRyZXNzWzJdOy8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJX19sZTMyIGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KIH07CiAKIC8qCkBAIC05MTcsMjEgKzkwNSwyMSBAQAogCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKIAl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLwotCXVpbnQzMl90IHJlc2VydmVkXzI7CisJX19sZTMyIHJlc2VydmVkXzI7CiAJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLwogCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOwogCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKIAl1aW50OF90IHRhcmdldF9pZDsKLQl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJX19sZTMyIG9wdGlvbl9mbGFnczsKIAl1aW50OF90IHN0YXR1czsKIAl1aW50OF90IHNjc2lfc3RhdHVzOwogCXVpbnQ4X3QgdGFnX3ZhbHVlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB2YWx1ZSAqLwogCXVpbnQ4X3QgdGFnX3R5cGU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHR5cGUgKi8KLQl1aW50MzJfdCB0cmFuc2Zlcl9sZW5ndGg7Ci0JdWludDMyX3QgcmVzaWR1YWw7Ci0JdWludDE2X3QgdGltZW91dDsJLyogMCA9IDMwIHNlY29uZHMsIDB4RkZGRiA9IGRpc2FibGUgKi8KLQl1aW50MTZfdCBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCi0JdWludDE2X3QgcmVzZXJ2ZWRfNFs3XTsKKwlfX2xlMzIgdHJhbnNmZXJfbGVuZ3RoOworCV9fbGUzMiByZXNpZHVhbDsKKwlfX2xlMTYgdGltZW91dDsJCS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJX19sZTE2IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwlfX2xlMTYgcmVzZXJ2ZWRfNFs3XTsKIAl1aW50OF90IHNlbnNlX2RhdGFbMThdOwogfTsKIApAQCAtOTc5LDE0ICs5NjcsNiBAQAogI2RlZmluZSBDU19SRVRSWSAgICAgICAgICAgIDB4ODIJLyogRHJpdmVyIGRlZmluZWQgKi8KIAogLyoKLSAqIElTUCBzdGF0dXMgZW50cnkgLSBTQ1NJIHN0YXR1cyBieXRlIGJpdCBkZWZpbml0aW9ucy4KLSAqLwotI2RlZmluZSBTU19DSEVDS19DT05ESVRJT04gIEJJVF8xCi0jZGVmaW5lIFNTX0NPTkRJVElPTl9NRVQgICAgQklUXzIKLSNkZWZpbmUgU1NfQlVTWV9DT05ESVRJT04gICBCSVRfMwotI2RlZmluZSBTU19SRVNFUlZFX0NPTkZMSUNUIChCSVRfNCB8IEJJVF8zKQotCi0vKgogICogSVNQIHRhcmdldCBlbnRyaWVzIC0gT3B0aW9uIGZsYWdzIGJpdCBkZWZpbml0aW9ucy4KICAqLwogI2RlZmluZSBPRl9FTkFCTEVfVEFHICAgICAgIEJJVF8xCS8qIFRhZ2dlZCBxdWV1ZSBhY3Rpb24gZW5hYmxlICovCkBAIC0xMDgyLDEwICsxMDYyLDYgQEAKIAkJdWludDMyX3QgcmVzZXRfYWN0aXZlOjE7CQkvKiAzICovCiAJCXVpbnQzMl90IGFib3J0X2lzcF9hY3RpdmU6MTsJCS8qIDQgKi8KIAkJdWludDMyX3QgZGlzYWJsZV9yaXNjX2NvZGVfbG9hZDoxOwkvKiA1ICovCi0JCXVpbnQzMl90IGVuYWJsZV82NGJpdF9hZGRyZXNzaW5nOjE7CS8qIDYgKi8KLQkJdWludDMyX3QgaW5fcmVzZXQ6MTsJCQkvKiA3ICovCi0JCXVpbnQzMl90IGludHNfZW5hYmxlZDoxOwotCQl1aW50MzJfdCBpZ25vcmVfbnZyYW06MTsKICNpZmRlZiBfX2lhNjRfXwogCQl1aW50MzJfdCB1c2VfcGNpX3ZjaGFubmVsOjE7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IDY1OWE1ZDYuLmZlMGZjZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMjExLDYgKzIxMSwxMzggQEAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLCAmc3lzZnNfbnZyYW1fYXR0cik7CiB9CiAKKy8qIFNjc2lfSG9zdCBhdHRyaWJ1dGVzLiAqLworCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9kcnZyX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIHFsYTJ4MDBfdmVyc2lvbl9zdHIpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9md192ZXJzaW9uX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJY2hhciBmd19zdHJbMzBdOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJICAgIGhhLT5pc3Bfb3BzLmZ3X3ZlcnNpb25fc3RyKGhhLCBmd19zdHIpKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfc2VyaWFsX251bV9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY2xhc3NfdG9fc2hvc3QoY2RldikpOworCXVpbnQzMl90IHNuOworCisJc24gPSAoKGhhLT5zZXJpYWwwICYgMHgxZikgPDwgMTYpIHwgKGhhLT5zZXJpYWwyIDw8IDgpIHwgaGEtPnNlcmlhbDE7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWMlMDVkXG4iLCAnQScgKyBzbiAvIDEwMDAwMCwKKwkgICAgc24gJSAxMDAwMDApOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9pc3BfbmFtZV9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY2xhc3NfdG9fc2hvc3QoY2RldikpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBoYS0+YnJkX2luZm8tPmlzcF9uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfaXNwX2lkX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwKKwkgICAgaGEtPnByb2R1Y3RfaWRbMF0sIGhhLT5wcm9kdWN0X2lkWzFdLCBoYS0+cHJvZHVjdF9pZFsyXSwKKwkgICAgaGEtPnByb2R1Y3RfaWRbM10pOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9tb2RlbF9uYW1lX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGhhLT5tb2RlbF9udW1iZXIpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9tb2RlbF9kZXNjX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJICAgIGhhLT5tb2RlbF9kZXNjID8gaGEtPm1vZGVsX2Rlc2M6ICIiKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfcGNpX2luZm9fc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGNkZXYpKTsKKwljaGFyIHBjaV9pbmZvWzMwXTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCSAgICBoYS0+aXNwX29wcy5wY2lfaW5mb19zdHIoaGEsIHBjaV9pbmZvKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX3N0YXRlX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChjZGV2KSk7CisJaW50IGxlbiA9IDA7CisKKwlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04gfHwKKwkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpCisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiTGluayBEb3duXG4iKTsKKwllbHNlIGlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfUkVBRFkgfHwKKwkgICAgdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJVbmtub3duIExpbmsgU3RhdGVcbiIpOworCWVsc2UgeworCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIkxpbmsgVXAgLSAiKTsKKworCQlzd2l0Y2ggKGhhLT5jdXJyZW50X3RvcG9sb2d5KSB7CisJCWNhc2UgSVNQX0NGR19OTDoKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJMb29wXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElTUF9DRkdfRkw6CisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLCAiRkxfUG9ydFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBJU1BfQ0ZHX046CisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLAorCQkJICAgICJOX1BvcnQgdG8gTl9Qb3J0XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElTUF9DRkdfRjoKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJGX1BvcnRcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLCAiTG9vcFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZHJpdmVyX3ZlcnNpb24sIFNfSVJVR08sIHFsYTJ4MDBfZHJ2cl92ZXJzaW9uX3Nob3csCisJTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZndfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9md192ZXJzaW9uX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHNlcmlhbF9udW0sIFNfSVJVR08sIHFsYTJ4MDBfc2VyaWFsX251bV9zaG93LCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpc3BfbmFtZSwgU19JUlVHTywgcWxhMngwMF9pc3BfbmFtZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpc3BfaWQsIFNfSVJVR08sIHFsYTJ4MDBfaXNwX2lkX3Nob3csIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG1vZGVsX25hbWUsIFNfSVJVR08sIHFsYTJ4MDBfbW9kZWxfbmFtZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtb2RlbF9kZXNjLCBTX0lSVUdPLCBxbGEyeDAwX21vZGVsX2Rlc2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocGNpX2luZm8sIFNfSVJVR08sIHFsYTJ4MDBfcGNpX2luZm9fc2hvdywgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVR08sIHFsYTJ4MDBfc3RhdGVfc2hvdywgTlVMTCk7CisKK3N0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpxbGEyeDAwX2hvc3RfYXR0cnNbXSA9IHsKKwkmY2xhc3NfZGV2aWNlX2F0dHJfZHJpdmVyX3ZlcnNpb24sCisJJmNsYXNzX2RldmljZV9hdHRyX2Z3X3ZlcnNpb24sCisJJmNsYXNzX2RldmljZV9hdHRyX3NlcmlhbF9udW0sCisJJmNsYXNzX2RldmljZV9hdHRyX2lzcF9uYW1lLAorCSZjbGFzc19kZXZpY2VfYXR0cl9pc3BfaWQsCisJJmNsYXNzX2RldmljZV9hdHRyX21vZGVsX25hbWUsCisJJmNsYXNzX2RldmljZV9hdHRyX21vZGVsX2Rlc2MsCisJJmNsYXNzX2RldmljZV9hdHRyX3BjaV9pbmZvLAorCSZjbGFzc19kZXZpY2VfYXR0cl9zdGF0ZSwKKwlOVUxMLAorfTsKKwogLyogSG9zdCBhdHRyaWJ1dGVzLiAqLwogCiBzdGF0aWMgdm9pZApAQCAtMzA0LDEwICs0MzYsMTMgQEAKIAogCS5zaG93X2hvc3Rfbm9kZV9uYW1lID0gMSwKIAkuc2hvd19ob3N0X3BvcnRfbmFtZSA9IDEsCisJLnNob3dfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCisKIAkuZ2V0X2hvc3RfcG9ydF9pZCA9IHFsYTJ4MDBfZ2V0X2hvc3RfcG9ydF9pZCwKIAkuc2hvd19ob3N0X3BvcnRfaWQgPSAxLAogCiAJLmRkX2ZjcnBvcnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmNfcG9ydCAqKSwKKwkuc2hvd19ycG9ydF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCiAKIAkuZ2V0X3N0YXJnZXRfbm9kZV9uYW1lID0gcWxhMngwMF9nZXRfc3RhcmdldF9ub2RlX25hbWUsCiAJLnNob3dfc3RhcmdldF9ub2RlX25hbWUgPSAxLApAQCAtMzI5LDQgKzQ2NCw1IEBACiAJICAgIGJlNjRfdG9fY3B1KCoodWludDY0X3QgKiloYS0+aW5pdF9jYi0+bm9kZV9uYW1lKTsKIAlmY19ob3N0X3BvcnRfbmFtZShoYS0+aG9zdCkgPQogCSAgICBiZTY0X3RvX2NwdSgqKHVpbnQ2NF90ICopaGEtPmluaXRfY2ItPnBvcnRfbmFtZSk7CisJZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhoYS0+aG9zdCkgPSBGQ19DT1NfQ0xBU1MzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCmluZGV4IDcyYmJhYTkuLjk3OTE0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKQEAgLTEzMzQsNyArMTMzNCw3IEBACiAKIAkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKIAkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMjAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCAqKSgodWludDhfdCAqKXJlZyArIDB4RkMpOworCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RkMpOwogCQlmdy0+c2hhZG93X3JlZ1syXSA9IFJEX1JFR19EV09SRChkbXBfcmVnKTsKIAogCQlkbXBfcmVnID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4RjApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCmluZGV4IGI4ZDkwZTkuLjk2ODRlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKQEAgLTgxLDYgKzgxLDcgQEAKICNkZWZpbmUgREVCVUcyXzNfMTEoeCkgIGRvIHt4O30gd2hpbGUgKDApOwogI2RlZmluZSBERUJVRzJfOV8xMCh4KSAgICBkbyB7eDt9IHdoaWxlICgwKTsKICNkZWZpbmUgREVCVUcyXzExKHgpICAgIGRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzJfMTMoeCkgICAgZG8ge3g7fSB3aGlsZSAoMCk7CiAjZWxzZQogI2RlZmluZSBERUJVRzIoeCkJZG8ge30gd2hpbGUgKDApOwogI2VuZGlmCkBAIC0xNjksOCArMTcwLDE0IEBACiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEzKQogI2RlZmluZSBERUJVRzEzKHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKKyNpZiAhZGVmaW5lZChERUJVRzJfMTMpCisjZGVmaW5lIERFQlVHMl8xMyh4KSAgICBkbyB7eDt9IHdoaWxlKDApCisjZW5kaWYKICNlbHNlCiAjZGVmaW5lIERFQlVHMTMoeCkJZG8ge30gd2hpbGUgKDApCisjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKKyNkZWZpbmUgREVCVUcyXzEzKHgpCWRvIHt9IHdoaWxlKDApCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xNCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCAxYzZkMzY2Li5iNDU1YzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0yMTQsNiArMjE0LDcgQEAKICAqIHZhbGlkIHJhbmdlIG9mIGFuIE4tUE9SVCBpZCBpcyAwIHRocm91Z2ggMHg3ZWYuCiAgKi8KICNkZWZpbmUgTlBIX0xBU1RfSEFORExFCQkweDdlZgorI2RlZmluZSBOUEhfTUdNVF9TRVJWRVIJCTB4N2ZhCQkvKiAgRkZGRkZBICovCiAjZGVmaW5lIE5QSF9TTlMJCQkweDdmYwkJLyogIEZGRkZGQyAqLwogI2RlZmluZSBOUEhfRkFCUklDX0NPTlRST0xMRVIJMHg3ZmQJCS8qICBGRkZGRkQgKi8KICNkZWZpbmUgTlBIX0ZfUE9SVAkJMHg3ZmUJCS8qICBGRkZGRkUgKi8KQEAgLTYzMCw2ICs2MzEsNyBAQAogI2RlZmluZSBNQkNfV1JJVEVfUkFNX1dPUkRfRVhURU5ERUQJMHhkCS8qIFdyaXRlIFJBTSB3b3JkIGV4dGVuZGVkICovCiAjZGVmaW5lIE1CQ19SRUFEX1JBTV9FWFRFTkRFRAkJMHhmCS8qIFJlYWQgUkFNIGV4dGVuZGVkLiAqLwogI2RlZmluZSBNQkNfSU9DQl9DT01NQU5ECQkweDEyCS8qIEV4ZWN1dGUgSU9DQiBjb21tYW5kLiAqLworI2RlZmluZSBNQkNfU1RPUF9GSVJNV0FSRQkJMHgxNAkvKiBTdG9wIGZpcm13YXJlLiAqLwogI2RlZmluZSBNQkNfQUJPUlRfQ09NTUFORAkJMHgxNQkvKiBBYm9ydCBJT0NCIGNvbW1hbmQuICovCiAjZGVmaW5lIE1CQ19BQk9SVF9ERVZJQ0UJCTB4MTYJLyogQWJvcnQgZGV2aWNlIChJRC9MVU4pLiAqLwogI2RlZmluZSBNQkNfQUJPUlRfVEFSR0VUCQkweDE3CS8qIEFib3J0IHRhcmdldCAoSUQpLiAqLwpAQCAtOTEzLDcgKzkxNSw3IEBACiAJICogTVNCIEJJVCAxID0KIAkgKiBNU0IgQklUIDIgPQogCSAqIE1TQiBCSVQgMyA9Ci0JICogTVNCIEJJVCA0ID0KKwkgKiBNU0IgQklUIDQgPSBMRUQgbW9kZQogCSAqIE1TQiBCSVQgNSA9IGVuYWJsZSA1MCBvaG0gdGVybWluYXRpb24KIAkgKiBNU0IgQklUIDYgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKIAkgKiBNU0IgQklUIDcgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKQEAgLTEwMzUsNyArMTAzNyw3IEBACiAJICogTVNCIEJJVCAxID0KIAkgKiBNU0IgQklUIDIgPQogCSAqIE1TQiBCSVQgMyA9Ci0JICogTVNCIEJJVCA0ID0KKwkgKiBNU0IgQklUIDQgPSBMRUQgbW9kZQogCSAqIE1TQiBCSVQgNSA9IGVuYWJsZSA1MCBvaG0gdGVybWluYXRpb24KIAkgKiBNU0IgQklUIDYgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKIAkgKiBNU0IgQklUIDcgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKQEAgLTExMzEsMTAgKzExMzMsNyBAQAogCiAJdWludDhfdCBsaW5rX2Rvd25fdGltZW91dDsKIAotCXVpbnQ4X3QgYWRhcHRlcl9pZF8wWzRdOwotCXVpbnQ4X3QgYWRhcHRlcl9pZF8xWzRdOwotCXVpbnQ4X3QgYWRhcHRlcl9pZF8yWzRdOwotCXVpbnQ4X3QgYWRhcHRlcl9pZF8zWzRdOworCXVpbnQ4X3QgYWRhcHRlcl9pZFsxNl07CiAKIAl1aW50OF90IGFsdDFfYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOwogCXVpbnQxNl90IGFsdDFfYm9vdF9sdW5fbnVtYmVyOwpAQCAtMTY3Myw2ICsxNjcyLDcgQEAKICAgICAJdWludDhfdCBjdXJfcGF0aDsJCS8qIGN1cnJlbnQgcGF0aCBpZCAqLwogCiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKKwl1MzIgc3VwcG9ydGVkX2NsYXNzZXM7CiB9IGZjX3BvcnRfdDsKIAogLyoKQEAgLTE3MjcsNiArMTcyNyw4IEBACiAKICNkZWZpbmUgQ1RfUkVKRUNUX1JFU1BPTlNFCTB4ODAwMQogI2RlZmluZSBDVF9BQ0NFUFRfUkVTUE9OU0UJMHg4MDAyCisjZGVmaW5lIENUX1JFQVNPTl9DQU5OT1RfUEVSRk9STQkweDA5CisjZGVmaW5lIENUX0VYUExfQUxSRUFEWV9SRUdJU1RFUkVECTB4MTAKIAogI2RlZmluZSBOU19OX1BPUlRfVFlQRQkweDAxCiAjZGVmaW5lIE5TX05MX1BPUlRfVFlQRQkweDAyCkBAIC0xNzY4LDYgKzE3NzAsMTAwIEBACiAjZGVmaW5lCVJTTk5fTk5fUkVRX1NJWkUgKDE2ICsgOCArIDEgKyAyNTUpCiAjZGVmaW5lCVJTTk5fTk5fUlNQX1NJWkUgMTYKIAorLyoKKyAqIEhCQSBhdHRyaWJ1dGUgdHlwZXMuCisgKi8KKyNkZWZpbmUgRkRNSV9IQkFfQVRUUl9DT1VOVAkJCTkKKyNkZWZpbmUgRkRNSV9IQkFfTk9ERV9OQU1FCQkJMQorI2RlZmluZSBGRE1JX0hCQV9NQU5VRkFDVFVSRVIJCQkyCisjZGVmaW5lIEZETUlfSEJBX1NFUklBTF9OVU1CRVIJCQkzCisjZGVmaW5lIEZETUlfSEJBX01PREVMCQkJCTQKKyNkZWZpbmUgRkRNSV9IQkFfTU9ERUxfREVTQ1JJUFRJT04JCTUKKyNkZWZpbmUgRkRNSV9IQkFfSEFSRFdBUkVfVkVSU0lPTgkJNgorI2RlZmluZSBGRE1JX0hCQV9EUklWRVJfVkVSU0lPTgkJCTcKKyNkZWZpbmUgRkRNSV9IQkFfT1BUSU9OX1JPTV9WRVJTSU9OCQk4CisjZGVmaW5lIEZETUlfSEJBX0ZJUk1XQVJFX1ZFUlNJT04JCTkKKyNkZWZpbmUgRkRNSV9IQkFfT1NfTkFNRV9BTkRfVkVSU0lPTgkJMHhhCisjZGVmaW5lIEZETUlfSEJBX01BWElNVU1fQ1RfUEFZTE9BRF9MRU5HVEgJMHhiCisKK3N0cnVjdCBjdF9mZG1pX2hiYV9hdHRyIHsKKwl1aW50MTZfdCB0eXBlOworCXVpbnQxNl90IGxlbjsKKwl1bmlvbiB7CisJCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwkJdWludDhfdCBtYW51ZmFjdHVyZXJbMzJdOworCQl1aW50OF90IHNlcmlhbF9udW1bOF07CisJCXVpbnQ4X3QgbW9kZWxbMTZdOworCQl1aW50OF90IG1vZGVsX2Rlc2NbODBdOworCQl1aW50OF90IGh3X3ZlcnNpb25bMTZdOworCQl1aW50OF90IGRyaXZlcl92ZXJzaW9uWzMyXTsKKwkJdWludDhfdCBvcm9tX3ZlcnNpb25bMTZdOworCQl1aW50OF90IGZ3X3ZlcnNpb25bMTZdOworCQl1aW50OF90IG9zX3ZlcnNpb25bMTI4XTsKKwkJdWludDhfdCBtYXhfY3RfbGVuWzRdOworCX0gYTsKK307CisKK3N0cnVjdCBjdF9mZG1pX2hiYV9hdHRyaWJ1dGVzIHsKKwl1aW50MzJfdCBjb3VudDsKKwlzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciBlbnRyeVtGRE1JX0hCQV9BVFRSX0NPVU5UXTsKK307CisKKy8qCisgKiBQb3J0IGF0dHJpYnV0ZSB0eXBlcy4KKyAqLworI2RlZmluZSBGRE1JX1BPUlRfQVRUUl9DT1VOVAkJNQorI2RlZmluZSBGRE1JX1BPUlRfRkM0X1RZUEVTCQkxCisjZGVmaW5lIEZETUlfUE9SVF9TVVBQT1JUX1NQRUVECQkyCisjZGVmaW5lIEZETUlfUE9SVF9DVVJSRU5UX1NQRUVECQkzCisjZGVmaW5lIEZETUlfUE9SVF9NQVhfRlJBTUVfU0laRQk0CisjZGVmaW5lIEZETUlfUE9SVF9PU19ERVZJQ0VfTkFNRQk1CisjZGVmaW5lIEZETUlfUE9SVF9IT1NUX05BTUUJCTYKKworc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyIHsKKwl1aW50MTZfdCB0eXBlOworCXVpbnQxNl90IGxlbjsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgZmM0X3R5cGVzWzMyXTsKKwkJdWludDMyX3Qgc3VwX3NwZWVkOworCQl1aW50MzJfdCBjdXJfc3BlZWQ7CisJCXVpbnQzMl90IG1heF9mcmFtZV9zaXplOworCQl1aW50OF90IG9zX2Rldl9uYW1lWzMyXTsKKwkJdWludDhfdCBob3N0X25hbWVbMzJdOworCX0gYTsKK307CisKKy8qCisgKiBQb3J0IEF0dHJpYnV0ZSBCbG9jay4KKyAqLworc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyaWJ1dGVzIHsKKwl1aW50MzJfdCBjb3VudDsKKwlzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgZW50cnlbRkRNSV9QT1JUX0FUVFJfQ09VTlRdOworfTsKKworLyogRkRNSSBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgR1JITF9DTUQJMHgxMDAKKyNkZWZpbmUgR0hBVF9DTUQJMHgxMDEKKyNkZWZpbmUgR1JQTF9DTUQJMHgxMDIKKyNkZWZpbmUgR1BBVF9DTUQJMHgxMTAKKworI2RlZmluZSBSSEJBX0NNRAkweDIwMAorI2RlZmluZSBSSEJBX1JTUF9TSVpFCTE2CisKKyNkZWZpbmUgUkhBVF9DTUQJMHgyMDEKKyNkZWZpbmUgUlBSVF9DTUQJMHgyMTAKKworI2RlZmluZSBSUEFfQ01ECQkweDIxMQorI2RlZmluZSBSUEFfUlNQX1NJWkUJMTYKKworI2RlZmluZSBESEJBX0NNRAkweDMwMAorI2RlZmluZSBESEJBX1JFUV9TSVpFCSgxNiArIDgpCisjZGVmaW5lIERIQkFfUlNQX1NJWkUJMTYKKworI2RlZmluZSBESEFUX0NNRAkweDMwMQorI2RlZmluZSBEUFJUX0NNRAkweDMxMAorI2RlZmluZSBEUEFfQ01ECQkweDMxMQorCiAvKiBDVCBjb21tYW5kIGhlYWRlciAtLSByZXF1ZXN0L3Jlc3BvbnNlIGNvbW1vbiBmaWVsZHMgKi8KIHN0cnVjdCBjdF9jbWRfaGRyIHsKIAl1aW50OF90IHJldmlzaW9uOwpAQCAtMTgyNSw2ICsxOTIxLDQzIEBACiAJCQl1aW50OF90IG5hbWVfbGVuOwogCQkJdWludDhfdCBzeW1fbm9kZV9uYW1lWzI1NV07CiAJCX0gcnNubl9ubjsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBoYmFfaW5kZW50aWZpZXJbOF07CisJCX0gZ2hhdDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBoYmFfaWRlbnRpZmllcls4XTsKKwkJCXVpbnQzMl90IGVudHJ5X2NvdW50OworCQkJdWludDhfdCBwb3J0X25hbWVbOF07CisJCQlzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0cmlidXRlcyBhdHRyczsKKwkJfSByaGJhOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGhiYV9pZGVudGlmaWVyWzhdOworCQkJc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHJpYnV0ZXMgYXR0cnM7CisJCX0gcmhhdDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBwb3J0X25hbWVbOF07CisJCQlzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHJpYnV0ZXMgYXR0cnM7CisJCX0gcnBhOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJfSBkaGJhOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJfSBkaGF0OworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJfSBkcHJ0OworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJfSBkcGE7CiAJfSByZXE7CiB9OwogCkBAIC0xODgyLDYgKzIwMTUsMTIgQEAKIAkJc3RydWN0IHsKIAkJCXVpbnQ4X3QgZmM0X3R5cGVzWzMyXTsKIAkJfSBnZnRfaWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IGVudHJ5X2NvdW50OworCQkJdWludDhfdCBwb3J0X25hbWVbOF07CisJCQlzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0cmlidXRlcyBhdHRyczsKKwkJfSBnaGF0OwogCX0gcnNwOwogfTsKIApAQCAtMjAzMiw2ICsyMTcxLDggQEAKIAl1aW50MTZfdCAoKmNhbGNfcmVxX2VudHJpZXMpICh1aW50MTZfdCk7CiAJdm9pZCAoKmJ1aWxkX2lvY2JzKSAoc3JiX3QgKiwgY21kX2VudHJ5X3QgKiwgdWludDE2X3QpOwogCXZvaWQgKiAoKnByZXBfbXNfaW9jYikgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQzMl90LCB1aW50MzJfdCk7CisJdm9pZCAqICgqcHJlcF9tc19mZG1pX2lvY2IpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCwKKwkgICAgdWludDMyX3QpOwogCiAJdWludDhfdCAqICgqcmVhZF9udnJhbSkgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQ4X3QgKiwKIAkJdWludDMyX3QsIHVpbnQzMl90KTsKQEAgLTIxMTEsNiArMjI1Miw3IEBACiAjZGVmaW5lIElPQ1RMX0VSUk9SX1JFQ09WRVJZCTIzCiAjZGVmaW5lIExPT1BfUkVTRVRfTkVFREVECTI0CiAjZGVmaW5lIEJFQUNPTl9CTElOS19ORUVERUQJMjUKKyNkZWZpbmUgUkVHSVNURVJfRkRNSV9ORUVERUQJMjYKIAogCXVpbnQzMl90CWRldmljZV9mbGFnczsKICNkZWZpbmUgREZMR19MT0NBTF9ERVZJQ0VTCQlCSVRfMApAQCAtMjIwNCw2ICsyMzQ2LDcgQEAKIAlpbnQJCXBvcnRfZG93bl9yZXRyeV9jb3VudDsKIAl1aW50OF90CQltYnhfY291bnQ7CiAJdWludDE2X3QJbGFzdF9sb29wX2lkOworCXVpbnQxNl90CW1nbXRfc3ZyX2xvb3BfaWQ7CiAKICAgICAgICAgdWludDMyX3QJbG9naW5fcmV0cnlfY291bnQ7CiAKQEAgLTIzMTgsNiArMjQ2MSw3IEBACiAJdWludDhfdAkJbW9kZWxfbnVtYmVyWzE2KzFdOwogI2RlZmluZSBCSU5aRVJPCQkiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiCiAJY2hhcgkJKm1vZGVsX2Rlc2M7CisJdWludDhfdAkJYWRhcHRlcl9pZFsxNisxXTsKIAogCXVpbnQ4X3QJCSpub2RlX25hbWU7CiAJdWludDhfdAkJKnBvcnRfbmFtZTsKQEAgLTIzNzcsNiArMjUyMSw3IEBACiAjZGVmaW5lIFFMQV9TVVNQRU5ERUQJCQkweDEwNgogI2RlZmluZSBRTEFfQlVTWQkJCTB4MTA3CiAjZGVmaW5lIFFMQV9SU0NOU19IQU5ETEVECQkweDEwOAorI2RlZmluZSBRTEFfQUxSRUFEWV9SRUdJU1RFUkVECQkweDEwOQogCiAvKgogKiBTdGF0IGluZm8gZm9yIGFsbCBhZHBhdGVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCmluZGV4IDY2NWMyMDMuLjFlZDMyZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKQEAgLTc5LDYgKzc5LDcgQEAKIGV4dGVybiBpbnQgcWwyeGVuYWJsZXppbzsKIGV4dGVybiBpbnQgcWwyeGludHJkZWxheXRpbWVyOwogZXh0ZXJuIGludCBxbDJ4bG9naW5yZXRyeWNvdW50OworZXh0ZXJuIGludCBxbDJ4ZmRtaWVuYWJsZTsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9zcF9jb21wbChzY3NpX3FsYV9ob3N0X3QgKiwgc3JiX3QgKik7CiAKQEAgLTE0Nyw5ICsxNDgsNiBAQAogI2VuZGlmCiAKIGV4dGVybiBpbnQKLXFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgZmNfcG9ydCAqKTsKLQotZXh0ZXJuIGludAogcWxhMngwMF9nZXRfYWRhcHRlcl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKiwgdWludDhfdCAqLCB1aW50OF90ICosCiAgICAgdWludDhfdCAqLCB1aW50MTZfdCAqKTsKIApAQCAtMjE1LDYgKzIxMyw5IEBACiBleHRlcm4gaW50CiBxbGEyeDAwX3NldF9zZXJkZXNfcGFyYW1zKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQxNl90KTsKIAorZXh0ZXJuIGludAorcWxhMngwMF9zdG9wX2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqKTsKKwogLyoKICAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9pc3IuYyBzb3VyY2UgZmlsZS4KICAqLwpAQCAtMjY5LDYgKzI3MCw5IEBACiBleHRlcm4gaW50IHFsYTJ4MDBfcmZmX2lkKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiBpbnQgcWxhMngwMF9ybm5faWQoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX3Jzbm5fbm4oc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgKnFsYTJ4MDBfcHJlcF9tc19mZG1pX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCAqcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKK2V4dGVybiBpbnQgcWxhMngwMF9mZG1pX3JlZ2lzdGVyKHNjc2lfcWxhX2hvc3RfdCAqKTsKIAogLyoKICAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9yc2NuLmMgc291cmNlIGZpbGUuCkBAIC0yODksNiArMjkzLDggQEAKIC8qCiAgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfYXR0ci5jIHNvdXJjZSBmaWxlLgogICovCitzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZTsKK2V4dGVybiBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqcWxhMngwMF9ob3N0X2F0dHJzW107CiBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGU7CiBleHRlcm4gc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIHFsYTJ4eHhfdHJhbnNwb3J0X2Z1bmN0aW9uczsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfYWxsb2Nfc3lzZnNfYXR0cihzY3NpX3FsYV9ob3N0X3QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCmluZGV4IDMxY2U0ZjYuLmU3YjEzOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCkBAIC0xMDk5LDMgKzEwOTksNTY3IEBACiAKIAlyZXR1cm4gKHJ2YWwpOwogfQorCisvKioKKyAqIHFsYTJ4MDBfbWdtdF9zdnJfbG9naW4oKSAtIExvZ2luIHRvIGZhYnJpYyBNYW5hZ21lbnQgU2VydmljZS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX21nbXRfc3ZyX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJldDsKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKworCXJldCA9IFFMQV9TVUNDRVNTOworCWlmIChoYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luKQorCQlyZXR1cm4gcmV0OworCisJaGEtPmlzcF9vcHMuZmFicmljX2xvZ2luKGhhLCBoYS0+bWdtdF9zdnJfbG9vcF9pZCwgMHhmZiwgMHhmZiwgMHhmYSwKKwkgICAgbWIsIEJJVF8xKTsKKwlpZiAobWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJREVCVUcyXzEzKHByaW50aygiJXMoJWxkKTogRmFpbGVkIE1BTkFHRU1FTlRfU0VSVkVSIGxvZ2luOiAiCisJCSAgICAibG9vcF9pZD0leCBtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leCBtYls2XT0leCBtYls3XT0leFxuIiwKKwkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgaGEtPm1nbXRfc3ZyX2xvb3BfaWQsIG1iWzBdLCBtYlsxXSwKKwkJICAgIG1iWzJdLCBtYls2XSwgbWJbN10pKTsKKwkJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UKKwkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHFsYTJ4MDBfcHJlcF9tc19mZG1pX2lvY2IoKSAtIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgZmllbGRzIGZvciBGRE1JIHF1ZXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAcmVxX3NpemU6IHJlcXVlc3Qgc2l6ZSBpbiBieXRlcworICogQHJzcF9zaXplOiByZXNwb25zZSBzaXplIGluIGJ5dGVzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEBoYSdzIG1zX2lvY2IuCisgKi8KK3ZvaWQgKgorcWxhMngwMF9wcmVwX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByZXFfc2l6ZSwKKyAgICB1aW50MzJfdCByc3Bfc2l6ZSkKK3sKKwltc19pb2NiX2VudHJ5X3QgKm1zX3BrdDsKKworCW1zX3BrdCA9IGhhLT5tc19pb2NiOworCW1lbXNldChtc19wa3QsIDAsIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKworCW1zX3BrdC0+ZW50cnlfdHlwZSA9IE1TX0lPQ0JfVFlQRTsKKwltc19wa3QtPmVudHJ5X2NvdW50ID0gMTsKKwlTRVRfVEFSR0VUX0lEKGhhLCBtc19wa3QtPmxvb3BfaWQsIGhhLT5tZ210X3N2cl9sb29wX2lkKTsKKwltc19wa3QtPmNvbnRyb2xfZmxhZ3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX1JFQUQgfCBDRl9IRUFEX1RBRyk7CisJbXNfcGt0LT50aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNig1OSk7CisJbXNfcGt0LT5jbWRfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKKwltc19wa3QtPnRvdGFsX2RzZF9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMik7CisJbXNfcGt0LT5yc3BfYnl0ZWNvdW50ID0gY3B1X3RvX2xlMzIocnNwX3NpemUpOworCW1zX3BrdC0+cmVxX2J5dGVjb3VudCA9IGNwdV90b19sZTMyKHJlcV9zaXplKTsKKworCW1zX3BrdC0+ZHNlZ19yZXFfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+Y3Rfc25zX2RtYSkpOworCW1zX3BrdC0+ZHNlZ19yZXFfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChoYS0+Y3Rfc25zX2RtYSkpOworCW1zX3BrdC0+ZHNlZ19yZXFfbGVuZ3RoID0gbXNfcGt0LT5yZXFfYnl0ZWNvdW50OworCisJbXNfcGt0LT5kc2VnX3JzcF9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JzcF9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JzcF9sZW5ndGggPSBtc19wa3QtPnJzcF9ieXRlY291bnQ7CisKKwlyZXR1cm4gbXNfcGt0OworfQorCisvKioKKyAqIHFsYTI0eHhfcHJlcF9tc19mZG1pX2lvY2IoKSAtIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgZmllbGRzIGZvciBGRE1JIHF1ZXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAcmVxX3NpemU6IHJlcXVlc3Qgc2l6ZSBpbiBieXRlcworICogQHJzcF9zaXplOiByZXNwb25zZSBzaXplIGluIGJ5dGVzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEBoYSdzIG1zX2lvY2IuCisgKi8KK3ZvaWQgKgorcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByZXFfc2l6ZSwKKyAgICB1aW50MzJfdCByc3Bfc2l6ZSkKK3sKKwlzdHJ1Y3QgY3RfZW50cnlfMjR4eCAqY3RfcGt0OworCisJY3RfcGt0ID0gKHN0cnVjdCBjdF9lbnRyeV8yNHh4ICopaGEtPm1zX2lvY2I7CisJbWVtc2V0KGN0X3BrdCwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9lbnRyeV8yNHh4KSk7CisKKwljdF9wa3QtPmVudHJ5X3R5cGUgPSBDVF9JT0NCX1RZUEU7CisJY3RfcGt0LT5lbnRyeV9jb3VudCA9IDE7CisJY3RfcGt0LT5ucG9ydF9oYW5kbGUgPSBjcHVfdG9fbGUxNihoYS0+bWdtdF9zdnJfbG9vcF9pZCk7CisJY3RfcGt0LT50aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNig1OSk7CisJY3RfcGt0LT5jbWRfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKKwljdF9wa3QtPnJzcF9kc2RfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpOworCWN0X3BrdC0+cnNwX2J5dGVfY291bnQgPSBjcHVfdG9fbGUzMihyc3Bfc2l6ZSk7CisJY3RfcGt0LT5jbWRfYnl0ZV9jb3VudCA9IGNwdV90b19sZTMyKHJlcV9zaXplKTsKKworCWN0X3BrdC0+ZHNlZ18wX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwljdF9wa3QtPmRzZWdfMF9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CisJY3RfcGt0LT5kc2VnXzBfbGVuID0gY3RfcGt0LT5jbWRfYnl0ZV9jb3VudDsKKworCWN0X3BrdC0+ZHNlZ18xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwljdF9wa3QtPmRzZWdfMV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CisJY3RfcGt0LT5kc2VnXzFfbGVuID0gY3RfcGt0LT5yc3BfYnl0ZV9jb3VudDsKKworCXJldHVybiBjdF9wa3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgbXNfaW9jYl9lbnRyeV90ICoKK3FsYTJ4MDBfdXBkYXRlX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByZXFfc2l6ZSkKK3sKKwltc19pb2NiX2VudHJ5X3QgKm1zX3BrdCA9IGhhLT5tc19pb2NiOworCXN0cnVjdCBjdF9lbnRyeV8yNHh4ICpjdF9wa3QgPSAoc3RydWN0IGN0X2VudHJ5XzI0eHggKiloYS0+bXNfaW9jYjsKKworCWlmIChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEEyNVhYKGhhKSkgeworCQljdF9wa3QtPmNtZF9ieXRlX2NvdW50ID0gY3B1X3RvX2xlMzIocmVxX3NpemUpOworCQljdF9wa3QtPmRzZWdfMF9sZW4gPSBjdF9wa3QtPmNtZF9ieXRlX2NvdW50OworCX0gZWxzZSB7CisJCW1zX3BrdC0+cmVxX2J5dGVjb3VudCA9IGNwdV90b19sZTMyKHJlcV9zaXplKTsKKwkJbXNfcGt0LT5kc2VnX3JlcV9sZW5ndGggPSBtc19wa3QtPnJlcV9ieXRlY291bnQ7CisJfQorCisJcmV0dXJuIG1zX3BrdDsKK30KKworLyoqCisgKiBxbGEyeDAwX3ByZXBfY3RfcmVxKCkgLSBQcmVwYXJlIGNvbW1vbiBDVCByZXF1ZXN0IGZpZWxkcyBmb3IgU05TIHF1ZXJ5LgorICogQGN0X3JlcTogQ1QgcmVxdWVzdCBidWZmZXIKKyAqIEBjbWQ6IEdTIGNvbW1hbmQKKyAqIEByc3Bfc2l6ZTogcmVzcG9uc2Ugc2l6ZSBpbiBieXRlcworICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRpdGlhbGl6ZWQgQGN0X3JlcS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3Rfc25zX3JlcSAqCitxbGEyeDAwX3ByZXBfY3RfZmRtaV9yZXEoc3RydWN0IGN0X3Nuc19yZXEgKmN0X3JlcSwgdWludDE2X3QgY21kLAorICAgIHVpbnQxNl90IHJzcF9zaXplKQoreworCW1lbXNldChjdF9yZXEsIDAsIHNpemVvZihzdHJ1Y3QgY3Rfc25zX3BrdCkpOworCisJY3RfcmVxLT5oZWFkZXIucmV2aXNpb24gPSAweDAxOworCWN0X3JlcS0+aGVhZGVyLmdzX3R5cGUgPSAweEZBOworCWN0X3JlcS0+aGVhZGVyLmdzX3N1YnR5cGUgPSAweDEwOworCWN0X3JlcS0+Y29tbWFuZCA9IGNwdV90b19iZTE2KGNtZCk7CisJY3RfcmVxLT5tYXhfcnNwX3NpemUgPSBjcHVfdG9fYmUxNigocnNwX3NpemUgLSAxNikgLyA0KTsKKworCXJldHVybiBjdF9yZXE7Cit9CisKKy8qKgorICogcWxhMngwMF9mZG1pX3JoYmEoKSAtCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9mZG1pX3JoYmEoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbCwgYWxlbjsKKwl1aW50MzJfdCBzaXplLCBzbjsKKworCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxICpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AgKmN0X3JzcDsKKwl1aW50OF90ICplbnRyaWVzOworCXN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICplaXRlcjsKKworCS8qIElzc3VlIFJIQkEgKi8KKwkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCisJLyogICBSZXF1ZXN0IHNpemUgYWRqdXN0ZWQgYWZ0ZXIgQ1QgcHJlcGFyYXRpb24gKi8KKwltc19wa3QgPSBoYS0+aXNwX29wcy5wcmVwX21zX2ZkbWlfaW9jYihoYSwgMCwgUkhCQV9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfZmRtaV9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBSSEJBX0NNRCwKKwkgICAgUkhCQV9SU1BfU0laRSk7CisJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJLyogUHJlcGFyZSBGRE1JIGNvbW1hbmQgYXJndW1lbnRzIC0tIGF0dHJpYnV0ZSBibG9jaywgYXR0cmlidXRlcy4gKi8KKwltZW1jcHkoY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllciwgaGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCWN0X3JlcS0+cmVxLnJoYmEuZW50cnlfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDEpOworCW1lbWNweShjdF9yZXEtPnJlcS5yaGJhLnBvcnRfbmFtZSwgaGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCXNpemUgPSAyICogV1dOX1NJWkUgKyA0ICsgNDsKKworCS8qIEF0dHJpYnV0ZXMgKi8KKwljdF9yZXEtPnJlcS5yaGJhLmF0dHJzLmNvdW50ID0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX0hCQV9BVFRSX0NPVU5UKTsKKwllbnRyaWVzID0gY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcjsKKworCS8qIE5vZGVuYW1lLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfSEJBX05PREVfTkFNRSk7CisJZWl0ZXItPmxlbiA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoNCArIFdXTl9TSVpFKTsKKwltZW1jcHkoZWl0ZXItPmEubm9kZV9uYW1lLCBoYS0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJc2l6ZSArPSA0ICsgV1dOX1NJWkU7CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTk9ERU5BTUU9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLAorCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLm5vZGVfbmFtZVswXSwgZWl0ZXItPmEubm9kZV9uYW1lWzFdLCBlaXRlci0+YS5ub2RlX25hbWVbMl0sCisJICAgIGVpdGVyLT5hLm5vZGVfbmFtZVszXSwgZWl0ZXItPmEubm9kZV9uYW1lWzRdLCBlaXRlci0+YS5ub2RlX25hbWVbNV0sCisJICAgIGVpdGVyLT5hLm5vZGVfbmFtZVs2XSwgZWl0ZXItPmEubm9kZV9uYW1lWzddKSk7CisKKwkvKiBNYW51ZmFjdHVyZXIuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfTUFOVUZBQ1RVUkVSKTsKKwlzdHJjcHkoZWl0ZXItPmEubWFudWZhY3R1cmVyLCAiUUxvZ2ljIENvcnBvcmF0aW9uIik7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5tYW51ZmFjdHVyZXIpOworCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OworCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CisJc2l6ZSArPSA0ICsgYWxlbjsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNQU5VRkFDVFVSRVI9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLm1hbnVmYWN0dXJlcikpOworCisJLyogU2VyaWFsIG51bWJlci4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX0hCQV9TRVJJQUxfTlVNQkVSKTsKKwlzbiA9ICgoaGEtPnNlcmlhbDAgJiAweDFmKSA8PCAxNikgfCAoaGEtPnNlcmlhbDIgPDwgOCkgfCBoYS0+c2VyaWFsMTsKKwlzcHJpbnRmKGVpdGVyLT5hLnNlcmlhbF9udW0sICIlYyUwNWQiLCAnQScgKyBzbiAvIDEwMDAwMCwgc24gJSAxMDAwMDApOworCWFsZW4gPSBzdHJsZW4oZWl0ZXItPmEuc2VyaWFsX251bSk7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFNFUklBTE5PPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5zZXJpYWxfbnVtKSk7CisKKwkvKiBNb2RlbCBuYW1lLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfSEJBX01PREVMKTsKKwlzdHJjcHkoZWl0ZXItPmEubW9kZWwsIGhhLT5tb2RlbF9udW1iZXIpOworCWFsZW4gPSBzdHJsZW4oZWl0ZXItPmEubW9kZWwpOworCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OworCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CisJc2l6ZSArPSA0ICsgYWxlbjsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNT0RFTF9OQU1FPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5tb2RlbCkpOworCisJLyogTW9kZWwgZGVzY3JpcHRpb24uICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfTU9ERUxfREVTQ1JJUFRJT04pOworCWlmIChoYS0+bW9kZWxfZGVzYykKKwkJc3RybmNweShlaXRlci0+YS5tb2RlbF9kZXNjLCBoYS0+bW9kZWxfZGVzYywgODApOworCWFsZW4gPSBzdHJsZW4oZWl0ZXItPmEubW9kZWxfZGVzYyk7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1PREVMX0RFU0M9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLm1vZGVsX2Rlc2MpKTsKKworCS8qIEhhcmR3YXJlIHZlcnNpb24uICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfSEFSRFdBUkVfVkVSU0lPTik7CisJc3RyY3B5KGVpdGVyLT5hLmh3X3ZlcnNpb24sIGhhLT5hZGFwdGVyX2lkKTsKKwlhbGVuID0gc3RybGVuKGVpdGVyLT5hLmh3X3ZlcnNpb24pOworCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OworCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CisJc2l6ZSArPSA0ICsgYWxlbjsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBIQVJEV0FSRVZFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEuaHdfdmVyc2lvbikpOworCisJLyogRHJpdmVyIHZlcnNpb24uICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfRFJJVkVSX1ZFUlNJT04pOworCXN0cmNweShlaXRlci0+YS5kcml2ZXJfdmVyc2lvbiwgcWxhMngwMF92ZXJzaW9uX3N0cik7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5kcml2ZXJfdmVyc2lvbik7CisJYWxlbiArPSAoYWxlbiAmIDMpID8gKDQgLSAoYWxlbiAmIDMpKSA6IDQ7CisJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKKwlzaXplICs9IDQgKyBhbGVuOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IERSSVZFUlZFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEuZHJpdmVyX3ZlcnNpb24pKTsKKworCS8qIE9wdGlvbiBST00gdmVyc2lvbi4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX0hCQV9PUFRJT05fUk9NX1ZFUlNJT04pOworCXN0cmNweShlaXRlci0+YS5vcm9tX3ZlcnNpb24sICIwLjAwIik7CisJYWxlbiA9IHN0cmxlbihlaXRlci0+YS5vcm9tX3ZlcnNpb24pOworCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OworCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CisJc2l6ZSArPSA0ICsgYWxlbjsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBPUFRST01WRVI9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLm9yb21fdmVyc2lvbikpOworCisJLyogRmlybXdhcmUgdmVyc2lvbiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfSEJBX0ZJUk1XQVJFX1ZFUlNJT04pOworCWhhLT5pc3Bfb3BzLmZ3X3ZlcnNpb25fc3RyKGhhLCBlaXRlci0+YS5md192ZXJzaW9uKTsKKwlhbGVuID0gc3RybGVuKGVpdGVyLT5hLmZ3X3ZlcnNpb24pOworCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OworCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CisJc2l6ZSArPSA0ICsgYWxlbjsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBGSVJNV0FSRVZFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEuZndfdmVyc2lvbikpOworCisJLyogVXBkYXRlIE1TIHJlcXVlc3Qgc2l6ZS4gKi8KKwlxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2IoaGEsIHNpemUgKyAxNik7CisKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogUkhCQSBpZGVudGlmaWVyPSIKKwkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHNpemU9JWQuXG4iLCBfX2Z1bmNfXywKKwkgICAgaGEtPmhvc3Rfbm8sIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMF0sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMV0sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMl0sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbM10sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbNF0sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbNV0sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbNl0sCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbN10sIHNpemUpKTsKKwlERUJVRzEzKHFsYTJ4MDBfZHVtcF9idWZmZXIoZW50cmllcywgc2l6ZSkpOworCisJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkhCQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiUkhCQSIpICE9CisJICAgIFFMQV9TVUNDRVNTKSB7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQlpZiAoY3RfcnNwLT5oZWFkZXIucmVhc29uX2NvZGUgPT0gQ1RfUkVBU09OX0NBTk5PVF9QRVJGT1JNICYmCisJCSAgICBjdF9yc3AtPmhlYWRlci5leHBsYW5hdGlvbl9jb2RlID09CisJCSAgICBDVF9FWFBMX0FMUkVBRFlfUkVHSVNURVJFRCkgeworCQkJREVCVUcyXzEzKHByaW50aygiJXMoJWxkKTogSEJBIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIsCisJCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQlydmFsID0gUUxBX0FMUkVBRFlfUkVHSVNURVJFRDsKKwkJfQorCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkhCQSBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKgorICogcWxhMngwMF9mZG1pX2RoYmEoKSAtCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9mZG1pX2RoYmEoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbDsKKworCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxICpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AgKmN0X3JzcDsKKworCS8qIElzc3VlIFJQQSAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwltc19wa3QgPSBoYS0+aXNwX29wcy5wcmVwX21zX2ZkbWlfaW9jYihoYSwgREhCQV9SRVFfU0laRSwKKwkgICAgREhCQV9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfZmRtaV9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBESEJBX0NNRCwKKwkgICAgREhCQV9SU1BfU0laRSk7CisJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOworCisJLyogUHJlcGFyZSBGRE1JIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRuYW1lLiAqLworCW1lbWNweShjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZSwgaGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IERIQkEgcG9ydG5hbWU9IgorCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzBdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVsxXSwKKwkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbMl0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzNdLAorCSAgICBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs0XSwgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbNV0sCisJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzZdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs3XSkpOworCisJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogREhCQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiREhCQSIpICE9CisJICAgIFFMQV9TVUNDRVNTKSB7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogREhCQSBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKgorICogcWxhMngwMF9mZG1pX3JwYSgpIC0KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2ZkbWlfcnBhKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJ2YWwsIGFsZW47CisJdWludDMyX3Qgc2l6ZSwgbWF4X2ZyYW1lX3NpemU7CisKKwltc19pb2NiX2VudHJ5X3QgKm1zX3BrdDsKKwlzdHJ1Y3QgY3Rfc25zX3JlcSAqY3RfcmVxOworCXN0cnVjdCBjdF9zbnNfcnNwICpjdF9yc3A7CisJdWludDhfdCAqZW50cmllczsKKwlzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgKmVpdGVyOworCXN0cnVjdCBpbml0X2NiXzI0eHggKmljYjI0ID0gKHN0cnVjdCBpbml0X2NiXzI0eHggKiloYS0+aW5pdF9jYjsKKworCS8qIElzc3VlIFJQQSAqLworCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KKwkvKiAgIFJlcXVlc3Qgc2l6ZSBhZGp1c3RlZCBhZnRlciBDVCBwcmVwYXJhdGlvbiAqLworCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLnByZXBfbXNfZmRtaV9pb2NiKGhhLCAwLCBSUEFfUlNQX1NJWkUpOworCisJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCisJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X2ZkbWlfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgUlBBX0NNRCwKKwkgICAgUlBBX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIEZETUkgY29tbWFuZCBhcmd1bWVudHMgLS0gYXR0cmlidXRlIGJsb2NrLCBhdHRyaWJ1dGVzLiAqLworCW1lbWNweShjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lLCBoYS0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisJc2l6ZSA9IFdXTl9TSVpFICsgNDsKKworCS8qIEF0dHJpYnV0ZXMgKi8KKwljdF9yZXEtPnJlcS5ycGEuYXR0cnMuY291bnQgPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9BVFRSX0NPVU5UKTsKKwllbnRyaWVzID0gY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZTsKKworCS8qIEZDNCB0eXBlcy4gKi8KKwllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKKwllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9QT1JUX0ZDNF9UWVBFUyk7CisJZWl0ZXItPmxlbiA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoNCArIDMyKTsKKwllaXRlci0+YS5mYzRfdHlwZXNbMl0gPSAweDAxOworCXNpemUgKz0gNCArIDMyOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEZDNF9UWVBFUz0lMDJ4ICUwMnguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgIGVpdGVyLT5hLmZjNF90eXBlc1syXSwgZWl0ZXItPmEuZmM0X3R5cGVzWzFdKSk7CisKKwkvKiBTdXBwb3J0ZWQgc3BlZWQuICovCisJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CisJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9TVVBQT1JUX1NQRUVEKTsKKwllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgNCk7CisJaWYgKElTX1FMQTI1WFgoaGEpKQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDQpOworCWVsc2UgaWYgKElTX1FMQTI0WFgoaGEpKQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDgpOworCWVsc2UgaWYgKElTX1FMQTIzWFgoaGEpKQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDIpOworCWVsc2UKKwkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigxKTsKKwlzaXplICs9IDQgKyA0OworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFNVUFBPUlRFRF9TUEVFRD0leC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEuc3VwX3NwZWVkKSk7CisKKwkvKiBDdXJyZW50IHNwZWVkLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX1BPUlRfQ1VSUkVOVF9TUEVFRCk7CisJZWl0ZXItPmxlbiA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoNCArIDQpOworCXN3aXRjaCAoaGEtPmxpbmtfZGF0YV9yYXRlKSB7CisJY2FzZSAwOgorCQllaXRlci0+YS5jdXJfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDEpOworCQlicmVhazsKKwljYXNlIDE6CisJCWVpdGVyLT5hLmN1cl9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZWl0ZXItPmEuY3VyX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMig4KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQllaXRlci0+YS5jdXJfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDQpOworCQlicmVhazsKKwl9CisJc2l6ZSArPSA0ICsgNDsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBDVVJSRU5UX1NQRUVEPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBlaXRlci0+YS5jdXJfc3BlZWQpKTsKKworCS8qIE1heCBmcmFtZSBzaXplLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX1BPUlRfTUFYX0ZSQU1FX1NJWkUpOworCWVpdGVyLT5sZW4gPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KDQgKyA0KTsKKwltYXhfZnJhbWVfc2l6ZSA9IElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTI1WFgoaGEpID8KKwkJKHVpbnQzMl90KSBpY2IyNC0+ZnJhbWVfcGF5bG9hZF9zaXplOgorCQkodWludDMyX3QpIGhhLT5pbml0X2NiLT5mcmFtZV9wYXlsb2FkX3NpemU7CisJZWl0ZXItPmEubWF4X2ZyYW1lX3NpemUgPSBjcHVfdG9fYmUzMihtYXhfZnJhbWVfc2l6ZSk7CisJc2l6ZSArPSA0ICsgNDsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNQVhfRlJBTUVfU0laRT0leC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEubWF4X2ZyYW1lX3NpemUpKTsKKworCS8qIE9TIGRldmljZSBuYW1lLiAqLworCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOworCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX1BPUlRfT1NfREVWSUNFX05BTUUpOworCXNwcmludGYoZWl0ZXItPmEub3NfZGV2X25hbWUsICIvcHJvYy9zY3NpL3FsYTJ4eHgvJWxkIiwgaGEtPmhvc3Rfbm8pOworCWFsZW4gPSBzdHJsZW4oZWl0ZXItPmEub3NfZGV2X25hbWUpOworCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OworCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CisJc2l6ZSArPSA0ICsgYWxlbjsKKworCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBPU19ERVZJQ0VfTkFNRT0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkgICAgZWl0ZXItPmEub3NfZGV2X25hbWUpKTsKKworCS8qIFVwZGF0ZSBNUyByZXF1ZXN0IHNpemUuICovCisJcWxhMngwMF91cGRhdGVfbXNfZmRtaV9pb2NiKGhhLCBzaXplICsgMTYpOworCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFJQQSBwb3J0bmFtZT0iCisJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzaXplPSVkLlxuIiwgX19mdW5jX18sCisJICAgIGhhLT5ob3N0X25vLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzBdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzFdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzJdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzNdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzRdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzVdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzZdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzddLCBzaXplKSk7CisJREVCVUcxMyhxbGEyeDAwX2R1bXBfYnVmZmVyKGVudHJpZXMsIHNpemUpKTsKKworCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJQQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiUlBBIikgIT0KKwkgICAgUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSUEEgZXhpdGluZyBub3JtYWxseS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiBydmFsOworfQorCisvKioKKyAqIHFsYTJ4MDBfZmRtaV9yZWdpc3RlcigpIC0KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfZmRtaV9yZWdpc3RlcihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCisJcnZhbCA9IHFsYTJ4MDBfbWdtdF9zdnJfbG9naW4oaGEpOworCWlmIChydmFsKQorCQlyZXR1cm4gcnZhbDsKKworCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfcmhiYShoYSk7CisJaWYgKHJ2YWwpIHsKKwkJaWYgKHJ2YWwgIT0gUUxBX0FMUkVBRFlfUkVHSVNURVJFRCkKKwkJCXJldHVybiBydmFsOworCisJCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfZGhiYShoYSk7CisJCWlmIChydmFsKQorCQkJcmV0dXJuIHJ2YWw7CisKKwkJcnZhbCA9IHFsYTJ4MDBfZmRtaV9yaGJhKGhhKTsKKwkJaWYgKHJ2YWwpCisJCQlyZXR1cm4gcnZhbDsKKwl9CisJcnZhbCA9IHFsYTJ4MDBfZmRtaV9ycGEoaGEpOworCisJcmV0dXJuIHJ2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCBhNmQyNTU5Li5jNjE5NTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTg4LDYgKzg4LDcgQEAKIAloYS0+bWJ4X2ZsYWdzID0gMDsKIAloYS0+aXNwX2Fib3J0X2NudCA9IDA7CiAJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAwOworCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyaW5nIFBDSSBzcGFjZS4uLlxuIik7CiAJcnZhbCA9IGhhLT5pc3Bfb3BzLnBjaV9jb25maWcoaGEpOwpAQCAtMTU2Myw3ICsxNTY0LDcgQEAKIAloYS0+ZmxhZ3MuZW5hYmxlX2xpcF9yZXNldCA9ICgobnYtPmhvc3RfcFsxXSAmIEJJVF8xKSA/IDEgOiAwKTsKIAloYS0+ZmxhZ3MuZW5hYmxlX2xpcF9mdWxsX2xvZ2luID0gKChudi0+aG9zdF9wWzFdICYgQklUXzIpID8gMSA6IDApOwogCWhhLT5mbGFncy5lbmFibGVfdGFyZ2V0X3Jlc2V0ID0gKChudi0+aG9zdF9wWzFdICYgQklUXzMpID8gMSA6IDApOwotCWhhLT5mbGFncy5lbmFibGVfbGVkX3NjaGVtZSA9ICgobnYtPmVmaV9wYXJhbWV0ZXJzICYgQklUXzMpID8gMSA6IDApOworCWhhLT5mbGFncy5lbmFibGVfbGVkX3NjaGVtZSA9IChudi0+c3BlY2lhbF9vcHRpb25zWzFdICYgQklUXzQpID8gMSA6IDA7CiAKIAloYS0+b3BlcmF0aW5nX21vZGUgPQogCSAgICAoaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSAmIChCSVRfNiB8IEJJVF81IHwgQklUXzQpKSA+PiA0OwpAQCAtMTY5Nyw2ICsxNjk4LDcgQEAKIAlmY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9IElPREVTQ19JTlZBTElEX0lOREVYOwogCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19VTkNPTkZJR1VSRUQpOwogCWZjcG9ydC0+ZmxhZ3MgPSBGQ0ZfUkxDX1NVUFBPUlQ7CisJZmNwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IEZDX0NPU19VTlNQRUNJRklFRDsKIAogCXJldHVybiAoZmNwb3J0KTsKIH0KQEAgLTE4OTgsNyArMTkwMCw4IEBACiAJCQljb250aW51ZTsKIAogCQkvKiBCeXBhc3MgaWYgbm90IHNhbWUgZG9tYWluIGFuZCBhcmVhIG9mIGFkYXB0ZXIuICovCi0JCWlmIChhcmVhICE9IGhhLT5kX2lkLmIuYXJlYSB8fCBkb21haW4gIT0gaGEtPmRfaWQuYi5kb21haW4pCisJCWlmIChhcmVhICYmIGRvbWFpbiAmJgorCQkgICAgKGFyZWEgIT0gaGEtPmRfaWQuYi5hcmVhIHx8IGRvbWFpbiAhPSBoYS0+ZF9pZC5iLmRvbWFpbikpCiAJCQljb250aW51ZTsKIAogCQkvKiBCeXBhc3MgaW52YWxpZCBsb2NhbCBsb29wIElELiAqLwpAQCAtMjA3NSw2ICsyMDc4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlycG9ydC0+ZGRfZGF0YSA9IGZjcG9ydDsKKwlycG9ydC0+c3VwcG9ydGVkX2NsYXNzZXMgPSBmY3BvcnQtPnN1cHBvcnRlZF9jbGFzc2VzOwogCiAJcnBvcnRfaWRzLnJvbGVzID0gRkNfUlBPUlRfUk9MRV9VTktOT1dOOwogCWlmIChmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfSU5JVElBVE9SKQpAQCAtMjEzMCw2ICsyMTM0LDExIEBACiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCX0KIAlkbyB7CisJCS8qIEZETUkgc3VwcG9ydC4gKi8KKwkJaWYgKHFsMnhmZG1pZW5hYmxlICYmCisJCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJCXFsYTJ4MDBfZmRtaV9yZWdpc3RlcihoYSk7CisKIAkJLyogRW5zdXJlIHdlIGFyZSBsb2dnZWQgaW50byB0aGUgU05TLiAqLwogCQlpZiAoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBMjVYWChoYSkpCiAJCQlsb29wX2lkID0gTlBIX1NOUzsKQEAgLTIzOTIsNiArMjQwMSwxMiBAQAogCQlpZiAobmV3X2ZjcG9ydC0+ZF9pZC5iMjQgPT0gaGEtPmRfaWQuYjI0KQogCQkJY29udGludWU7CiAKKwkJLyogQnlwYXNzIGlmIHNhbWUgZG9tYWluIGFuZCBhcmVhIG9mIGFkYXB0ZXIuICovCisJCWlmICgoKG5ld19mY3BvcnQtPmRfaWQuYjI0ICYgMHhmZmZmMDApID09CisJCSAgICAoaGEtPmRfaWQuYjI0ICYgMHhmZmZmMDApKSAmJiBoYS0+Y3VycmVudF90b3BvbG9neSA9PQorCQkJSVNQX0NGR19GTCkKKwkJCSAgICBjb250aW51ZTsKKwogCQkvKiBCeXBhc3MgcmVzZXJ2ZWQgZG9tYWluIGZpZWxkcy4gKi8KIAkJaWYgKChuZXdfZmNwb3J0LT5kX2lkLmIuZG9tYWluICYgMHhmMCkgPT0gMHhmMCkKIAkJCWNvbnRpbnVlOwpAQCAtMjc5NCw2ICsyODA5LDExIEBACiAJCQkJfQogCQkJfQogCisJCQlpZiAobWJbMTBdICYgQklUXzApCisJCQkJZmNwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyB8PSBGQ19DT1NfQ0xBU1MyOworCQkJaWYgKG1iWzEwXSAmIEJJVF8xKQorCQkJCWZjcG9ydC0+c3VwcG9ydGVkX2NsYXNzZXMgfD0gRkNfQ09TX0NMQVNTMzsKKwogCQkJcnZhbCA9IFFMQV9TVUNDRVNTOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAobWJbMF0gPT0gTUJTX0xPT1BfSURfVVNFRCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKaW5kZXggZWJkYzNjNS4uMzdmODJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCkBAIC04MTAsMTIgKzgxMCw4IEBACiAJCQloYS0+cmVxX3FfY250ID0gaGEtPnJlcXVlc3RfcV9sZW5ndGggLQogCQkJCShoYS0+cmVxX3JpbmdfaW5kZXggLSBjbnQpOwogCX0KLQlpZiAoaGEtPnJlcV9xX2NudCA8IChyZXFfY250ICsgMikpIHsKLQkJaWYgIChjbWQtPnVzZV9zZykKLQkJCXBjaV91bm1hcF9zZyhoYS0+cGRldiwgc2csIGNtZC0+dXNlX3NnLAotCQkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwlpZiAoaGEtPnJlcV9xX2NudCA8IChyZXFfY250ICsgMikpCiAJCWdvdG8gcXVldWluZ19lcnJvcjsKLQl9CiAKIAkvKiBCdWlsZCBjb21tYW5kIHBhY2tldC4gKi8KIAloYS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggZjkxMGRlNi4uYzI1NWJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtNDUxLDYgKzQ1MSw4IEBACiAKIAkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CiAJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IDA7CisJCWlmIChxbDJ4ZmRtaWVuYWJsZSkKKwkJCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKIAogCQkvKiBVcGRhdGUgQUVOIHF1ZXVlLiAqLwogCQlxbGEyeDAwX2VucXVldWVfYWVuKGhhLCBNQkFfTE9PUF9ET1dOLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCA0MDllYTBhLi4xM2UxYzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAicWxhX2RlZi5oIgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CiAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX21ieF9zZW1fdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC0yNTEsNyArMjUyLDcgQEAKIAkJCW1iMCA9IFJEX1JFR19XT1JEKCZyZWctPmlzcDI0Lm1haWxib3gwKTsKIAkJCWljdHJsID0gUkRfUkVHX0RXT1JEKCZyZWctPmlzcDI0LmljdHJsKTsKIAkJfSBlbHNlIHsKLQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWctPmlzcCwgMCk7CisJCQltYjAgPSBSRF9NQUlMQk9YX1JFRyhoYSwgJnJlZy0+aXNwLCAwKTsKIAkJCWljdHJsID0gUkRfUkVHX1dPUkQoJnJlZy0+aXNwLmljdHJsKTsKIAkJfQogCQlwcmludGsoIiVzKCVsZCk6ICoqKiogTUIgQ29tbWFuZCBUaW1lb3V0IGZvciBjbWQgJXggKioqKlxuIiwKQEAgLTk4Myw1OCArOTg0LDYgQEAKICNlbmRpZgogCiAvKgotICogcWxhMngwMF90YXJnZXRfcmVzZXQKLSAqCUlzc3VlIHRhcmdldCByZXNldCBtYWlsYm94IGNvbW1hbmQuCi0gKgotICogSW5wdXQ6Ci0gKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KLSAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCi0gKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KLSAqCi0gKiBSZXR1cm5zOgotICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCi0gKgotICogQ29udGV4dDoKLSAqCUtlcm5lbCBjb250ZXh0LgotICovCi1pbnQKLXFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBmY19wb3J0ICpmY3BvcnQpCi17Ci0JaW50IHJ2YWw7Ci0JbWJ4X2NtZF90IG1jOwotCW1ieF9jbWRfdCAqbWNwID0gJm1jOwotCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KCVsZCk6IGVudGVyZWQuXG4iLCBoYS0+aG9zdF9ubyk7KQotCi0JaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FKQotCQlyZXR1cm4gMDsKLQotCW1jcC0+bWJbMF0gPSBNQkNfVEFSR0VUX1JFU0VUOwotCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkKLQkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZDsKLQllbHNlCi0JCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQgPDwgODsKLQltY3AtPm1iWzJdID0gaGEtPmxvb3BfcmVzZXRfZGVsYXk7Ci0JbWNwLT5vdXRfbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKLQltY3AtPmluX21iID0gTUJYXzA7Ci0JbWNwLT50b3YgPSAzMDsKLQltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7Ci0KLQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX3RhcmdldF9yZXNldCglbGQpOiBmYWlsZWQ9JXguXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKLQl9IGVsc2UgewotCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KCVsZCk6IGRvbmUuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pOykKLQl9Ci0KLQlyZXR1cm4gcnZhbDsKLX0KLQotLyoKICAqIHFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQKICAqCUdldCBhZGFwdGVyIElEIGFuZCB0b3BvbG9neS4KICAqCkBAIC0xMzI2LDYgKzEyNzUsMTAgQEAKIAkJCWZjcG9ydC0+cG9ydF90eXBlID0gRkNUX0lOSVRJQVRPUjsKIAkJZWxzZQogCQkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfVEFSR0VUOworCisJCS8qIFBhc3NiYWNrIENPUyBpbmZvcm1hdGlvbi4gKi8KKwkJZmNwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IChwZC0+b3B0aW9ucyAmIEJJVF80KSA/CisJCSAgICBGQ19DT1NfQ0xBU1MyOiBGQ19DT1NfQ0xBU1MzOwogCX0KIAogZ3BkX2Vycm9yX291dDoKQEAgLTE2NjEsNiArMTYxNCwxMyBAQAogCQkJCW1iWzFdIHw9IEJJVF8xOwogCQl9IGVsc2UKIAkJCW1iWzFdID0gQklUXzA7CisKKwkJLyogUGFzc2JhY2sgQ09TIGluZm9ybWF0aW9uLiAqLworCQltYlsxMF0gPSAwOworCQlpZiAobGctPmlvX3BhcmFtZXRlcls3XSB8fCBsZy0+aW9fcGFyYW1ldGVyWzhdKQorCQkJbWJbMTBdIHw9IEJJVF8wOwkvKiBDbGFzcyAyLiAqLworCQlpZiAobGctPmlvX3BhcmFtZXRlcls5XSB8fCBsZy0+aW9fcGFyYW1ldGVyWzEwXSkKKwkJCW1iWzEwXSB8PSBCSVRfMTsJLyogQ2xhc3MgMy4gKi8KIAl9CiAKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBsZywgbGdfZG1hKTsKQEAgLTE3MjMsNiArMTY4Myw4IEBACiAJCW1iWzJdID0gbWNwLT5tYlsyXTsKIAkJbWJbNl0gPSBtY3AtPm1iWzZdOwogCQltYls3XSA9IG1jcC0+bWJbN107CisJCS8qIENPUyByZXRyaWV2ZWQgZnJvbSBHZXQtUG9ydC1EYXRhYmFzZSBtYWlsYm94IGNvbW1hbmQuICovCisJCW1iWzEwXSA9IDA7CiAJfQogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTI0NjUsMyArMjQyNywzMiBAQAogCiAJcmV0dXJuIHJ2YWw7CiB9CisKK2ludAorcWxhMngwMF9zdG9wX2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKworCW1jcC0+bWJbMF0gPSBNQkNfU1RPUF9GSVJNV0FSRTsKKwltY3AtPm91dF9tYiA9IE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDU7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIHsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggOTAwMDY1OS4uODk4Mjk3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTc5LDcgKzc5LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGxvZ2lucmV0cnljb3VudCwKIAkJIlNwZWNpZnkgYW4gYWx0ZXJuYXRlIHZhbHVlIGZvciB0aGUgTlZSQU0gbG9naW4gcmV0cnkgY291bnQuIik7CiAKLWludCBxbDJ4Zndsb2FkYmluOworaW50IHFsMnhmd2xvYWRiaW49MTsKIG1vZHVsZV9wYXJhbShxbDJ4Zndsb2FkYmluLCBpbnQsIFNfSVJVR098U19JUlVTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhmd2xvYWRiaW4sCiAJCSJMb2FkIElTUDJ4eHggZmlybXdhcmUgaW1hZ2UgdmlhIGhvdHBsdWcuIik7CkBAIC04OCw2ICs4OCwxMiBAQAogCiBzdGF0aWMgdm9pZCBxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhzY3NpX3FsYV9ob3N0X3QgKmhhKTsKIAoraW50IHFsMnhmZG1pZW5hYmxlOworbW9kdWxlX3BhcmFtKHFsMnhmZG1pZW5hYmxlLCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhmZG1pZW5hYmxlLAorCQkiRW5hYmxlcyBGRE1JIHJlZ2lzdHJhdG9ucyAiCisJCSJEZWZhdWx0IGlzIDAgLSBubyBGRE1JLiAxIC0gcGVyZm9tIEZETUkuIik7CisKIC8qCiAgKiBTQ1NJIGhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzCiAgKi8KQEAgLTEwNSw2ICsxMTEsOSBAQAogc3RhdGljIGludCBxbGEyeDAwX2xvb3BfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSk7CiBzdGF0aWMgaW50IHFsYTJ4MDBfZGV2aWNlX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKik7CiAKK3N0YXRpYyBpbnQgcWxhMngwMF9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCk7CitzdGF0aWMgaW50IHFsYTJ4MDBfY2hhbmdlX3F1ZXVlX3R5cGUoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCk7CisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHFsYTJ4MDBfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSAicWxhMnh4eCIsCkBAIC0xMTksNiArMTI4LDggQEAKIAogCS5zbGF2ZV9hbGxvYwkJPSBxbGEyeHh4X3NsYXZlX2FsbG9jLAogCS5zbGF2ZV9kZXN0cm95CQk9IHFsYTJ4eHhfc2xhdmVfZGVzdHJveSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gcWxhMngwMF9jaGFuZ2VfcXVldWVfZGVwdGgsCisJLmNoYW5nZV9xdWV1ZV90eXBlCT0gcWxhMngwMF9jaGFuZ2VfcXVldWVfdHlwZSwKIAkudGhpc19pZAkJPSAtMSwKIAkuY21kX3Blcl9sdW4JCT0gMywKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCkBAIC0xMjksNiArMTQwLDcgQEAKIAkgKiB3aGljaCBlcXVhdGVzIHRvIDB4ODAwMDAwIHNlY3RvcnMuCiAJICovCiAJLm1heF9zZWN0b3JzCQk9IDB4RkZGRiwKKwkuc2hvc3RfYXR0cnMJCT0gcWxhMngwMF9ob3N0X2F0dHJzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcWxhMjR4eF9kcml2ZXJfdGVtcGxhdGUgPSB7CkBAIC0xNDUsMTIgKzE1NywxNSBAQAogCiAJLnNsYXZlX2FsbG9jCQk9IHFsYTJ4eHhfc2xhdmVfYWxsb2MsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gcWxhMnh4eF9zbGF2ZV9kZXN0cm95LAorCS5jaGFuZ2VfcXVldWVfZGVwdGgJPSBxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2hhbmdlX3F1ZXVlX3R5cGUJPSBxbGEyeDAwX2NoYW5nZV9xdWV1ZV90eXBlLAogCS50aGlzX2lkCQk9IC0xLAogCS5jbWRfcGVyX2x1bgkJPSAzLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKIAogCS5tYXhfc2VjdG9ycwkJPSAweEZGRkYsCisJLnNob3N0X2F0dHJzCQk9IHFsYTJ4MDBfaG9zdF9hdHRycywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKQEAgLTQ4NywxNCArNTAyLDEzIEBACiBzdGF0aWMgaW50CiBxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7Ci0jZGVmaW5lIEFCT1JUX1BPTExJTkdfUEVSSU9ECUhaCi0jZGVmaW5lIEFCT1JUX1dBSVRfSVRFUgkJKCgxMCAqIEhaKSAvIChBQk9SVF9QT0xMSU5HX1BFUklPRCkpCisjZGVmaW5lIEFCT1JUX1BPTExJTkdfUEVSSU9ECTEwMDAKKyNkZWZpbmUgQUJPUlRfV0FJVF9JVEVSCQkoKDEwICogMTAwMCkgLyAoQUJPUlRfUE9MTElOR19QRVJJT0QpKQogCXVuc2lnbmVkIGxvbmcgd2FpdF9pdGVyID0gQUJPUlRfV0FJVF9JVEVSOwogCWludCByZXQgPSBRTEFfU1VDQ0VTUzsKIAogCXdoaWxlIChDTURfU1AoY21kKSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoQUJPUlRfUE9MTElOR19QRVJJT0QpOworCQltc2xlZXAoQUJPUlRfUE9MTElOR19QRVJJT0QpOwogCiAJCWlmICgtLXdhaXRfaXRlcikKIAkJCWJyZWFrOwpAQCAtMTAxNiw3ICsxMDMwLDcgQEAKIAkJCWlmIChmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfVEFSR0VUKQogCQkJCWNvbnRpbnVlOwogCi0JCQlzdGF0dXMgPSBxbGEyeDAwX3RhcmdldF9yZXNldChoYSwgZmNwb3J0KTsKKwkJCXN0YXR1cyA9IHFsYTJ4MDBfZGV2aWNlX3Jlc2V0KGhhLCBmY3BvcnQpOwogCQkJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykKIAkJCQlicmVhazsKIAkJfQpAQCAtMTEwMyw2ICsxMTE3LDI4IEBACiAJc2Rldi0+aG9zdGRhdGEgPSBOVUxMOwogfQogCitzdGF0aWMgaW50CitxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpCit7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisJcmV0dXJuIHNkZXYtPnF1ZXVlX2RlcHRoOworfQorCitzdGF0aWMgaW50CitxbGEyeDAwX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRhZ190eXBlKQoreworCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCXNjc2lfc2V0X3RhZ190eXBlKHNkZXYsIHRhZ190eXBlKTsKKwkJaWYgKHRhZ190eXBlKQorCQkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2Rldiwgc2Rldi0+cXVldWVfZGVwdGgpOworCQllbHNlCisJCQlzY3NpX2RlYWN0aXZhdGVfdGNxKHNkZXYsIHNkZXYtPnF1ZXVlX2RlcHRoKTsKKwl9IGVsc2UKKwkJdGFnX3R5cGUgPSAwOworCisJcmV0dXJuIHRhZ190eXBlOworfQorCiAvKioKICAqIHFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKCkgLSBDb25maWd1cmUgT1MgRE1BIGFkZHJlc3NpbmcgbWV0aG9kLgogICogQGhhOiBIQSBjb250ZXh0CkBAIC0xMTEzLDM2ICsxMTQ5LDIzIEBACiBzdGF0aWMgdm9pZAogcWxhMngwMF9jb25maWdfZG1hX2FkZHJlc3Npbmcoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKLQkvKiBBc3N1bWUgMzJiaXQgRE1BIGFkZHJlc3MgKi8KKwkvKiBBc3N1bWUgYSAzMmJpdCBETUEgbWFzay4gKi8KIAloYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPSAwOwogCi0JLyoKLQkgKiBHaXZlbiB0aGUgdHdvIHZhcmlhbnRzIHBjaV9zZXRfZG1hX21hc2soKSwgYWxsb3cgdGhlIGNvbXBpbGVyIHRvCi0JICogYXNzaXN0IGluIHNldHRpbmcgdGhlIHByb3BlciBkbWEgbWFzay4KLQkgKi8KLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgewotCQlpZiAocGNpX3NldF9kbWFfbWFzayhoYS0+cGRldiwgRE1BXzY0QklUX01BU0spID09IDApIHsKKwlpZiAoIWRtYV9zZXRfbWFzaygmaGEtPnBkZXYtPmRldiwgRE1BXzY0QklUX01BU0spKSB7CisJCS8qIEFueSB1cHBlci1kd29yZCBiaXRzIHNldD8gKi8KKwkJaWYgKE1TRChkbWFfZ2V0X3JlcXVpcmVkX21hc2soJmhhLT5wZGV2LT5kZXYpKSAmJgorCQkgICAgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhoYS0+cGRldiwgRE1BXzY0QklUX01BU0spKSB7CisJCQkvKiBPaywgYSA2NGJpdCBETUEgbWFzayBpcyBhcHBsaWNhYmxlLiAqLwogCQkJaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID0gMTsKIAkJCWhhLT5pc3Bfb3BzLmNhbGNfcmVxX2VudHJpZXMgPSBxbGEyeDAwX2NhbGNfaW9jYnNfNjQ7CiAJCQloYS0+aXNwX29wcy5idWlsZF9pb2NicyA9IHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic182NDsKLQotCQkJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhoYS0+cGRldiwKLQkJCSAgICBETUFfNjRCSVRfTUFTSykpIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLAotCQkJCSAgICAiRmFpbGVkIHRvIHNldCA2NCBiaXQgUENJIGNvbnNpc3RlbnQgbWFzazsgIgotCQkJCSAgICAidXNpbmcgMzIgYml0LlxuIik7Ci0JCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGhhLT5wZGV2LAotCQkJCSAgICBETUFfMzJCSVRfTUFTSyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLAotCQkJICAgICJGYWlsZWQgdG8gc2V0IDY0IGJpdCBQQ0kgRE1BIG1hc2ssIGZhbGxpbmcgYmFjayAiCi0JCQkgICAgInRvIDMyIGJpdCBNQVNLLlxuIik7Ci0JCQlwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCQlyZXR1cm47CiAJCX0KLQl9IGVsc2UgewotCQlwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJfQorCisJZG1hX3NldF9tYXNrKCZoYS0+cGRldi0+ZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGhhLT5wZGV2LCBETUFfMzJCSVRfTUFTSyk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEzMTYsNiArMTMzOSw3IEBACiAJaGEtPnByZXZfdG9wb2xvZ3kgPSAwOwogCWhhLT5wb3J0cyA9IE1BWF9CVVNFUzsKIAloYS0+aW5pdF9jYl9zaXplID0gc2l6ZW9mKGluaXRfY2JfdCk7CisJaGEtPm1nbXRfc3ZyX2xvb3BfaWQgPSBNQU5BR0VNRU5UX1NFUlZFUjsKIAogCS8qIEFzc2lnbiBJU1Agc3BlY2lmaWMgb3BlcmF0aW9ucy4gKi8KIAloYS0+aXNwX29wcy5wY2lfY29uZmlnCQk9IHFsYTIxMDBfcGNpX2NvbmZpZzsKQEAgLTEzMzgsNiArMTM2Miw3IEBACiAJaGEtPmlzcF9vcHMuY2FsY19yZXFfZW50cmllcwk9IHFsYTJ4MDBfY2FsY19pb2Nic18zMjsKIAloYS0+aXNwX29wcy5idWlsZF9pb2NicwkJPSBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfMzI7CiAJaGEtPmlzcF9vcHMucHJlcF9tc19pb2NiCT0gcWxhMngwMF9wcmVwX21zX2lvY2I7CisJaGEtPmlzcF9vcHMucHJlcF9tc19mZG1pX2lvY2IJPSBxbGEyeDAwX3ByZXBfbXNfZmRtaV9pb2NiOwogCWhhLT5pc3Bfb3BzLnJlYWRfbnZyYW0JCT0gcWxhMngwMF9yZWFkX252cmFtX2RhdGE7CiAJaGEtPmlzcF9vcHMud3JpdGVfbnZyYW0JCT0gcWxhMngwMF93cml0ZV9udnJhbV9kYXRhOwogCWhhLT5pc3Bfb3BzLmZ3X2R1bXAJCT0gcWxhMjEwMF9md19kdW1wOwpAQCAtMTM3NSw2ICsxNDAwLDcgQEAKIAkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7CiAJCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIzMDA7CiAJCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2Yoc3RydWN0IGluaXRfY2JfMjR4eCk7CisJCWhhLT5tZ210X3N2cl9sb29wX2lkID0gMTA7CiAJCWhhLT5pc3Bfb3BzLnBjaV9jb25maWcgPSBxbGEyNHh4X3BjaV9jb25maWc7CiAJCWhhLT5pc3Bfb3BzLnJlc2V0X2NoaXAgPSBxbGEyNHh4X3Jlc2V0X2NoaXA7CiAJCWhhLT5pc3Bfb3BzLmNoaXBfZGlhZyA9IHFsYTI0eHhfY2hpcF9kaWFnOwpAQCAtMTM5NSw2ICsxNDIxLDcgQEAKIAkJaGEtPmlzcF9vcHMuZmFicmljX2xvZ2luID0gcWxhMjR4eF9sb2dpbl9mYWJyaWM7CiAJCWhhLT5pc3Bfb3BzLmZhYnJpY19sb2dvdXQgPSBxbGEyNHh4X2ZhYnJpY19sb2dvdXQ7CiAJCWhhLT5pc3Bfb3BzLnByZXBfbXNfaW9jYiA9IHFsYTI0eHhfcHJlcF9tc19pb2NiOworCQloYS0+aXNwX29wcy5wcmVwX21zX2ZkbWlfaW9jYiA9IHFsYTI0eHhfcHJlcF9tc19mZG1pX2lvY2I7CiAJCWhhLT5pc3Bfb3BzLnJlYWRfbnZyYW0gPSBxbGEyNHh4X3JlYWRfbnZyYW1fZGF0YTsKIAkJaGEtPmlzcF9vcHMud3JpdGVfbnZyYW0gPSBxbGEyNHh4X3dyaXRlX252cmFtX2RhdGE7CiAJCWhhLT5pc3Bfb3BzLmZ3X2R1bXAgPSBxbGEyNHh4X2Z3X2R1bXA7CkBAIC0xNTU4LDggKzE1ODUsNiBAQAogCXJldHVybiAwOwogCiBwcm9iZV9mYWlsZWQ6Ci0JZmNfcmVtb3ZlX2hvc3QoaGEtPmhvc3QpOwotCiAJcWxhMngwMF9mcmVlX2RldmljZShoYSk7CiAKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwpAQCAtMTYwMSwxMCArMTYyNiw2IEBACiAJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkpCiAJCXFsYTJ4MDBfY2FuY2VsX2lvX2Rlc2NyaXB0b3JzKGhhKTsKIAotCS8qIHR1cm4tb2ZmIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KLQlpZiAoaGEtPmludGVycnVwdHNfb24pCi0JCWhhLT5pc3Bfb3BzLmRpc2FibGVfaW50cnMoaGEpOwotCiAJLyogRGlzYWJsZSB0aW1lciAqLwogCWlmIChoYS0+dGltZXJfYWN0aXZlKQogCQlxbGEyeDAwX3N0b3BfdGltZXIoaGEpOwpAQCAtMTYyNCw4ICsxNjQ1LDE0IEBACiAJCX0KIAl9CiAKLQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkvKiBTdG9wIGN1cnJlbnRseSBleGVjdXRpbmcgZmlybXdhcmUuICovCisJcWxhMngwMF9zdG9wX2Zpcm13YXJlKGhhKTsKIAorCS8qIHR1cm4tb2ZmIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KKwlpZiAoaGEtPmludGVycnVwdHNfb24pCisJCWhhLT5pc3Bfb3BzLmRpc2FibGVfaW50cnMoaGEpOworCisJcWxhMngwMF9tZW1fZnJlZShoYSk7CiAKIAloYS0+ZmxhZ3Mub25saW5lID0gMDsKIApAQCAtMTkzNCw3ICsxOTYxLDcgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpmY3BsLCAqZmNwdGVtcDsKIAlmY19wb3J0X3QJKmZjcG9ydDsKLQl1bnNpZ25lZCBsb25nCXd0aW1lOy8qIG1heCB3YWl0IHRpbWUgaWYgbWJ4IGNtZCBpcyBidXN5LiAqLworCXVuc2lnbmVkIGludAl3dGltZTsvKiBtYXggd2FpdCB0aW1lIGlmIG1ieCBjbWQgaXMgYnVzeS4gKi8KIAogCWlmIChoYSA9PSBOVUxMKSB7CiAJCS8qIGVycm9yICovCkBAIC0xOTQzLDExICsxOTcwLDkgQEAKIAl9CiAKIAkvKiBNYWtlIHN1cmUgYWxsIG90aGVyIHRocmVhZHMgYXJlIHN0b3BwZWQuICovCi0Jd3RpbWUgPSA2MCAqIEhaOwotCXdoaWxlIChoYS0+ZHBjX3dhaXQgJiYgd3RpbWUpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJd3RpbWUgPSBzY2hlZHVsZV90aW1lb3V0KHd0aW1lKTsKLQl9CisJd3RpbWUgPSA2MCAqIDEwMDA7CisJd2hpbGUgKGhhLT5kcGNfd2FpdCAmJiB3dGltZSkKKwkJd3RpbWUgPSBtc2xlZXBfaW50ZXJydXB0aWJsZSh3dGltZSk7CiAKIAkvKiBmcmVlIGlvY3RsIG1lbW9yeSAqLwogCXFsYTJ4MDBfZnJlZV9pb2N0bF9tZW0oaGEpOwpAQCAtMjQ3OCwxNSArMjUwMywxNSBAQAogaW50CiBxbGEyeDAwX2Rvd25fdGltZW91dChzdHJ1Y3Qgc2VtYXBob3JlICpzZW1hLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IHN0ZXAgPSBIWi8xMDsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RlcCA9IDEwMDsgLyogbXNlY3MgKi8KKwl1bnNpZ25lZCBpbnQgaXRlcmF0aW9ucyA9IGppZmZpZXNfdG9fbXNlY3ModGltZW91dCkvMTAwOwogCiAJZG8gewogCQlpZiAoIWRvd25fdHJ5bG9jayhzZW1hKSkKIAkJCXJldHVybiAwOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoc2NoZWR1bGVfdGltZW91dChzdGVwKSkKKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKHN0ZXApKQogCQkJYnJlYWs7Ci0JfSB3aGlsZSAoKHRpbWVvdXQgLT0gc3RlcCkgPiAwKTsKKwl9IHdoaWxlICgtLWl0ZXJhdGlvbnMgPj0gMCk7CiAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwppbmRleCBkN2Y1YzYwLi5jMTRhYmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCkBAIC00NjgsMjEgKzQ2OCwxMiBAQAogICAgIHVpbnQzMl90IGR3b3JkcykKIHsKIAl1aW50MzJfdCBpOwotCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwotCi0JLyogUGF1c2UgUklTQy4gKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9SSVNDX1BBVVNFKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KIAogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7IGkrKywgZmFkZHIrKykKIAkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCiAJCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSkpOwogCi0JLyogUmVsZWFzZSBSSVNDIHBhdXNlLiAqLwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfUkVMX1JJU0NfUEFVU0UpOwotCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsJCS8qIFBDSSBQb3N0aW5nLiAqLwotCiAJcmV0dXJuIGR3cHRyOwogfQogCkBAIC01MzIsMTAgKzUyMyw2IEBACiAKIAlyZXQgPSBRTEFfU1VDQ0VTUzsKIAotCS8qIFBhdXNlIFJJU0MuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9TRVRfUklTQ19QQVVTRSk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCi0KIAlxbGEyNHh4X2dldF9mbGFzaF9tYW51ZmFjdHVyZXIoaGEsICZtYW5faWQsICZmbGFzaF9pZCk7CiAJREVCVUc5KHByaW50aygiJXMoJWxkKTogRmxhc2ggbWFuX2lkPSVkIGZsYXNoX2lkPSVkXG4iLCBfX2Z1bmNfXywKIAkgICAgaGEtPmhvc3Rfbm8sIG1hbl9pZCwgZmxhc2hfaWQpKTsKQEAgLTU5OSwxMCArNTg2LDYgQEAKIAkgICAgUkRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzKSAmIH5DU1JYX0ZMQVNIX0VOQUJMRSk7CiAJUkRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzKTsJLyogUENJIFBvc3RpbmcuICovCiAKLQkvKiBSZWxlYXNlIFJJU0MgcGF1c2UuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9SRUxfUklTQ19QQVVTRSk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCi0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MzAsMTEgKzYxMyw2IEBACiB7CiAJdWludDMyX3QgaTsKIAl1aW50MzJfdCAqZHdwdHI7Ci0Jc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7Ci0KLQkvKiBQYXVzZSBSSVNDLiAqLwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfU0VUX1JJU0NfUEFVU0UpOwotCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsJLyogUENJIFBvc3RpbmcuICovCiAKIAkvKiBEd29yZCByZWFkcyB0byBmbGFzaC4gKi8KIAlkd3B0ciA9ICh1aW50MzJfdCAqKWJ1ZjsKQEAgLTY0MiwxMCArNjIwLDYgQEAKIAkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCiAJCSAgICBudnJhbV9kYXRhX3RvX2FjY2Vzc19hZGRyKG5hZGRyKSkpOwogCi0JLyogUmVsZWFzZSBSSVNDIHBhdXNlLiAqLwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfUkVMX1JJU0NfUEFVU0UpOwotCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsJLyogUENJIFBvc3RpbmcuICovCi0KIAlyZXR1cm4gYnVmOwogfQogCkBAIC02OTAsMTAgKzY2NCw2IEBACiAKIAlyZXQgPSBRTEFfU1VDQ0VTUzsKIAotCS8qIFBhdXNlIFJJU0MuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9TRVRfUklTQ19QQVVTRSk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCi0KIAkvKiBFbmFibGUgZmxhc2ggd3JpdGUuICovCiAJV1JUX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cywKIAkgICAgUkRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzKSB8IENTUlhfRkxBU0hfRU5BQkxFKTsKQEAgLTcyOCw5ICs2OTgsNSBAQAogCSAgICBSRF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMpICYgfkNTUlhfRkxBU0hfRU5BQkxFKTsKIAlSRF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAotCS8qIFJlbGVhc2UgUklTQyBwYXVzZS4gKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1JFTF9SSVNDX1BBVVNFKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCBlM2NkMzYxLi5lYWU3ZDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTE5LDkgKzE5LDkgQEAKIC8qCiAgKiBEcml2ZXIgdmVyc2lvbgogICovCi0jZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAxLjAwYjUtayIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDEuMDAtayIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4CiAjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTEKICNkZWZpbmUgUUxBX0RSSVZFUl9QQVRDSF9WRVIJMAotI2RlZmluZSBRTEFfRFJJVkVSX0JFVEFfVkVSCTUKKyNkZWZpbmUgUUxBX0RSSVZFUl9CRVRBX1ZFUgkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jIGIvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWVhNTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIFJBSUQgQXR0cmlidXRlcworICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkX2NsYXNzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNkZWZpbmUgUkFJRF9OVU1fQVRUUlMJMworCitzdHJ1Y3QgcmFpZF9pbnRlcm5hbCB7CisJc3RydWN0IHJhaWRfdGVtcGxhdGUgcjsKKwlzdHJ1Y3QgcmFpZF9mdW5jdGlvbl90ZW1wbGF0ZSAqZjsKKwkvKiBUaGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBwcml2YXRlX2F0dHJzW1JBSURfTlVNX0FUVFJTXTsKKwkvKiBUaGUgYXJyYXkgb2YgbnVsbCB0ZXJtaW5hdGVkIHBvaW50ZXJzIHRvIGF0dHJpYnV0ZXMgCisJICogbmVlZGVkIGJ5IHNjc2lfc3lzZnMuYyAqLworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICphdHRyc1tSQUlEX05VTV9BVFRSUyArIDFdOworfTsKKworc3RydWN0IHJhaWRfY29tcG9uZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBudW07Cit9OworCisjZGVmaW5lIHRvX3JhaWRfaW50ZXJuYWwodG1wbCkJY29udGFpbmVyX29mKHRtcGwsIHN0cnVjdCByYWlkX2ludGVybmFsLCByKQorCisjZGVmaW5lIHRjX3RvX3JhaWRfaW50ZXJuYWwodGNvbnQpICh7CQkJCQlcCisJc3RydWN0IHJhaWRfdGVtcGxhdGUgKnIgPQkJCQkJXAorCQljb250YWluZXJfb2YodGNvbnQsIHN0cnVjdCByYWlkX3RlbXBsYXRlLCByYWlkX2F0dHJzKTsJXAorCXRvX3JhaWRfaW50ZXJuYWwocik7CQkJCQkJXAorfSkKKworI2RlZmluZSBhY190b19yYWlkX2ludGVybmFsKGFjb250KSAoewkJCQkJXAorCXN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0YyA9CQkJCVwKKwkJY29udGFpbmVyX29mKGFjb250LCBzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciwgYWMpOwlcCisJdGNfdG9fcmFpZF9pbnRlcm5hbCh0Yyk7CQkJCQlcCit9KQorCisjZGVmaW5lIGNsYXNzX2RldmljZV90b19yYWlkX2ludGVybmFsKGNkZXYpICh7CQkJCVwKKwlzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqYWMgPQkJCQlcCisJCWF0dHJpYnV0ZV9jb250YWluZXJfY2xhc3NkZXZfdG9fY29udGFpbmVyKGNkZXYpOwlcCisJYWNfdG9fcmFpZF9pbnRlcm5hbChhYyk7CQkJCQlcCit9KQorCQorCitzdGF0aWMgaW50IHJhaWRfbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBXZSBoYXZlIHRvIGxvb2sgZm9yIGV2ZXJ5IHN1YnN5c3RlbSB0aGF0IGNvdWxkIGhvdXNlCisJICogZW11bGF0ZWQgUkFJRCBkZXZpY2VzLCBzbyBzdGFydCB3aXRoIFNDU0kgKi8KKwlzdHJ1Y3QgcmFpZF9pbnRlcm5hbCAqaSA9IGFjX3RvX3JhaWRfaW50ZXJuYWwoY29udCk7CisKKwlpZiAoc2NzaV9pc19zZGV2X2RldmljZShkZXYpKSB7CisJCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisKKwkJaWYgKGktPmYtPmNvb2tpZSAhPSBzZGV2LT5ob3N0LT5ob3N0dCkKKwkJCXJldHVybiAwOworCisJCXJldHVybiBpLT5mLT5pc19yYWlkKGRldik7CisJfQorCS8qIEZJWE1FOiBsb29rIGF0IG90aGVyIHN1YnN5c3RlbXMgdG9vICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFpZF9zZXR1cChzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHJhaWRfZGF0YSAqcmQ7CisKKwlCVUdfT04oY2xhc3NfZ2V0X2RldmRhdGEoY2RldikpOworCisJcmQgPSBrbWFsbG9jKHNpemVvZigqcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChyZCwgMCwgc2l6ZW9mKCpyZCkpOworCUlOSVRfTElTVF9IRUFEKCZyZC0+Y29tcG9uZW50X2xpc3QpOworCWNsYXNzX3NldF9kZXZkYXRhKGNkZXYsIHJkKTsKKwkJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFpZF9yZW1vdmUoc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKnRjLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCByYWlkX2RhdGEgKnJkID0gY2xhc3NfZ2V0X2RldmRhdGEoY2Rldik7CisJc3RydWN0IHJhaWRfY29tcG9uZW50ICpyYywgKm5leHQ7CisJY2xhc3Nfc2V0X2RldmRhdGEoY2RldiwgTlVMTCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjLCBuZXh0LCAmcmQtPmNvbXBvbmVudF9saXN0LCBub2RlKSB7CisJCWNoYXIgYnVmWzQwXTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImNvbXBvbmVudC0lZCIsIHJjLT5udW0pOworCQlsaXN0X2RlbCgmcmMtPm5vZGUpOworCQlzeXNmc19yZW1vdmVfbGluaygmY2Rldi0+a29iaiwgYnVmKTsKKwkJa2ZyZWUocmMpOworCX0KKwlrZnJlZShjbGFzc19nZXRfZGV2ZGF0YShjZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhyYWlkX2NsYXNzLAorCQkJICAgICAgICJyYWlkX2RldmljZXMiLAorCQkJICAgICAgIHJhaWRfc2V0dXAsCisJCQkgICAgICAgcmFpZF9yZW1vdmUsCisJCQkgICAgICAgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gcmFpZF9zdGF0ZQl2YWx1ZTsKKwljaGFyCQkqbmFtZTsKK30gcmFpZF9zdGF0ZXNbXSA9IHsKKwl7IFJBSURfQUNUSVZFLCAiYWN0aXZlIiB9LAorCXsgUkFJRF9ERUdSQURFRCwgImRlZ3JhZGVkIiB9LAorCXsgUkFJRF9SRVNZTkNJTkcsICJyZXN5bmNpbmciIH0sCisJeyBSQUlEX09GRkxJTkUsICJvZmZsaW5lIiB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJhaWRfc3RhdGVfbmFtZShlbnVtIHJhaWRfc3RhdGUgc3RhdGUpCit7CisJaW50IGk7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHJhaWRfc3RhdGVzKS9zaXplb2YocmFpZF9zdGF0ZXNbMF0pOyBpKyspIHsKKwkJaWYgKHJhaWRfc3RhdGVzW2ldLnZhbHVlID09IHN0YXRlKSB7CisJCQluYW1lID0gcmFpZF9zdGF0ZXNbaV0ubmFtZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBuYW1lOworfQorCisKKyNkZWZpbmUgcmFpZF9hdHRyX3Nob3dfaW50ZXJuYWwoYXR0ciwgZm10LCB2YXIsIGNvZGUpCQkJXAorc3RhdGljIHNzaXplX3QgcmFpZF9zaG93XyMjYXR0cihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHJhaWRfZGF0YSAqcmQgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsJCQlcCisJY29kZQkJCQkJCQkJXAorCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAjZm10ICJcbiIsIHZhcik7CQkJXAorfQorCisjZGVmaW5lIHJhaWRfYXR0cl9yb19zdGF0ZXMoYXR0ciwgc3RhdGVzLCBjb2RlKQkJCQlcCityYWlkX2F0dHJfc2hvd19pbnRlcm5hbChhdHRyLCAlcywgbmFtZSwJCQkJCVwKKwljb25zdCBjaGFyICpuYW1lOwkJCQkJCVwKKwljb2RlCQkJCQkJCQlcCisJbmFtZSA9IHJhaWRfIyNzdGF0ZXMjI19uYW1lKHJkLT5hdHRyKTsJCQkJXAorKQkJCQkJCQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhdHRyLCBTX0lSVUdPLCByYWlkX3Nob3dfIyNhdHRyLCBOVUxMKQorCisKKyNkZWZpbmUgcmFpZF9hdHRyX3JvX2ludGVybmFsKGF0dHIsIGNvZGUpCQkJCVwKK3JhaWRfYXR0cl9zaG93X2ludGVybmFsKGF0dHIsICVkLCByZC0+YXR0ciwgY29kZSkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYXR0ciwgU19JUlVHTywgcmFpZF9zaG93XyMjYXR0ciwgTlVMTCkKKworI2RlZmluZSBBVFRSX0NPREUoYXR0cikJCQkJCQkJXAorCXN0cnVjdCByYWlkX2ludGVybmFsICppID0gY2xhc3NfZGV2aWNlX3RvX3JhaWRfaW50ZXJuYWwoY2Rldik7CVwKKwlpZiAoaS0+Zi0+Z2V0XyMjYXR0cikJCQkJCQlcCisJCWktPmYtPmdldF8jI2F0dHIoY2Rldi0+ZGV2KTsKKworI2RlZmluZSByYWlkX2F0dHJfcm8oYXR0cikJcmFpZF9hdHRyX3JvX2ludGVybmFsKGF0dHIsICkKKyNkZWZpbmUgcmFpZF9hdHRyX3JvX2ZuKGF0dHIpCXJhaWRfYXR0cl9yb19pbnRlcm5hbChhdHRyLCBBVFRSX0NPREUoYXR0cikpCisjZGVmaW5lIHJhaWRfYXR0cl9yb19zdGF0ZShhdHRyKQlyYWlkX2F0dHJfcm9fc3RhdGVzKGF0dHIsIGF0dHIsIEFUVFJfQ09ERShhdHRyKSkKKworcmFpZF9hdHRyX3JvKGxldmVsKTsKK3JhaWRfYXR0cl9yb19mbihyZXN5bmMpOworcmFpZF9hdHRyX3JvX3N0YXRlKHN0YXRlKTsKKwordm9pZCByYWlkX2NvbXBvbmVudF9hZGQoc3RydWN0IHJhaWRfdGVtcGxhdGUgKnIsc3RydWN0IGRldmljZSAqcmFpZF9kZXYsCisJCQlzdHJ1Y3QgZGV2aWNlICpjb21wb25lbnRfZGV2KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPQorCQlhdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlKCZyLT5yYWlkX2F0dHJzLmFjLAorCQkJCQkJICAgICAgcmFpZF9kZXYpOworCXN0cnVjdCByYWlkX2NvbXBvbmVudCAqcmM7CisJc3RydWN0IHJhaWRfZGF0YSAqcmQgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsKKwljaGFyIGJ1Zls0MF07CisKKwlyYyA9IGttYWxsb2Moc2l6ZW9mKCpyYyksIEdGUF9LRVJORUwpOworCWlmICghcmMpCisJCXJldHVybjsKKworCUlOSVRfTElTVF9IRUFEKCZyYy0+bm9kZSk7CisJcmMtPmRldiA9IGNvbXBvbmVudF9kZXY7CisJcmMtPm51bSA9IHJkLT5jb21wb25lbnRfY291bnQrKzsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJjb21wb25lbnQtJWQiLCByYy0+bnVtKTsKKwlsaXN0X2FkZF90YWlsKCZyYy0+bm9kZSwgJnJkLT5jb21wb25lbnRfbGlzdCk7CisJc3lzZnNfY3JlYXRlX2xpbmsoJmNkZXYtPmtvYmosICZjb21wb25lbnRfZGV2LT5rb2JqLCBidWYpOworfQorRVhQT1JUX1NZTUJPTChyYWlkX2NvbXBvbmVudF9hZGQpOworCitzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSAqCityYWlkX2NsYXNzX2F0dGFjaChzdHJ1Y3QgcmFpZF9mdW5jdGlvbl90ZW1wbGF0ZSAqZnQpCit7CisJc3RydWN0IHJhaWRfaW50ZXJuYWwgKmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmFpZF9pbnRlcm5hbCksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJaW50IGNvdW50ID0gMDsKKworCWlmICh1bmxpa2VseSghaSkpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGksIDAsIHNpemVvZigqaSkpOworCisJaS0+ZiA9IGZ0OworCisJaS0+ci5yYWlkX2F0dHJzLmFjLmNsYXNzID0gJnJhaWRfY2xhc3MuY2xhc3M7CisJaS0+ci5yYWlkX2F0dHJzLmFjLm1hdGNoID0gcmFpZF9tYXRjaDsKKwlpLT5yLnJhaWRfYXR0cnMuYWMuYXR0cnMgPSAmaS0+YXR0cnNbMF07CisKKwlhdHRyaWJ1dGVfY29udGFpbmVyX3JlZ2lzdGVyKCZpLT5yLnJhaWRfYXR0cnMuYWMpOworCisJaS0+YXR0cnNbY291bnQrK10gPSAmY2xhc3NfZGV2aWNlX2F0dHJfbGV2ZWw7CisJaS0+YXR0cnNbY291bnQrK10gPSAmY2xhc3NfZGV2aWNlX2F0dHJfcmVzeW5jOworCWktPmF0dHJzW2NvdW50KytdID0gJmNsYXNzX2RldmljZV9hdHRyX3N0YXRlOworCisJaS0+YXR0cnNbY291bnRdID0gTlVMTDsKKwlCVUdfT04oY291bnQgPiBSQUlEX05VTV9BVFRSUyk7CisKKwlyZXR1cm4gJmktPnI7Cit9CitFWFBPUlRfU1lNQk9MKHJhaWRfY2xhc3NfYXR0YWNoKTsKKwordm9pZAorcmFpZF9jbGFzc19yZWxlYXNlKHN0cnVjdCByYWlkX3RlbXBsYXRlICpyKQoreworCXN0cnVjdCByYWlkX2ludGVybmFsICppID0gdG9fcmFpZF9pbnRlcm5hbChyKTsKKworCWF0dHJpYnV0ZV9jb250YWluZXJfdW5yZWdpc3RlcigmaS0+ci5yYWlkX2F0dHJzLmFjKTsKKworCWtmcmVlKGkpOworfQorRVhQT1JUX1NZTUJPTChyYWlkX2NsYXNzX3JlbGVhc2UpOworCitzdGF0aWMgX19pbml0IGludCByYWlkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZyYWlkX2NsYXNzKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHJhaWRfZXhpdCh2b2lkKQoreworCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZyYWlkX2NsYXNzKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQm90dG9tbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJBSUQgZGV2aWNlIGNsYXNzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHJhaWRfaW5pdCk7Cittb2R1bGVfZXhpdChyYWlkX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9tdi5jIGIvZHJpdmVycy9zY3NpL3NhdGFfbXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc2ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfbXYuYwpAQCAtMCwwICsxLDgyNyBAQAorLyoKKyAqIHNhdGFfbXYuYyAtIE1hcnZlbGwgU0FUQSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IDIwMDU6IEVNQyBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKgorICogUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcgb24gZW1haWxzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfbXYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjEyIgorCitlbnVtIHsKKwkvKiBCQVIncyBhcmUgZW51bWVyYXRlZCBpbiB0ZXJtcyBvZiBwY2lfcmVzb3VyY2Vfc3RhcnQoKSB0ZXJtcyAqLworCU1WX1BSSU1BUllfQkFSCQk9IDAsCS8qIG9mZnNldCAweDEwOiBtZW1vcnkgc3BhY2UgKi8KKwlNVl9JT19CQVIJCT0gMiwJLyogb2Zmc2V0IDB4MTg6IElPIHNwYWNlICovCisJTVZfTUlTQ19CQVIJCT0gMywJLyogb2Zmc2V0IDB4MWM6IEZMQVNILCBOVlJBTSwgU1JBTSAqLworCisJTVZfTUFKT1JfUkVHX0FSRUFfU1oJPSAweDEwMDAwLAkvKiA2NEtCICovCisJTVZfTUlOT1JfUkVHX0FSRUFfU1oJPSAweDIwMDAsCS8qIDhLQiAqLworCisJTVZfUENJX1JFR19CQVNFCQk9IDAsCisJTVZfSVJRX0NPQUxfUkVHX0JBU0UJPSAweDE4MDAwLAkvKiA2eHh4IHBhcnQgb25seSAqLworCU1WX1NBVEFIQzBfUkVHX0JBU0UJPSAweDIwMDAwLAorCisJTVZfUENJX1JFR19TWgkJPSBNVl9NQUpPUl9SRUdfQVJFQV9TWiwKKwlNVl9TQVRBSENfUkVHX1NaCT0gTVZfTUFKT1JfUkVHX0FSRUFfU1osCisJTVZfU0FUQUhDX0FSQlRSX1JFR19TWgk9IE1WX01JTk9SX1JFR19BUkVBX1NaLAkJLyogYXJiaXRlciAqLworCU1WX1BPUlRfUkVHX1NaCQk9IE1WX01JTk9SX1JFR19BUkVBX1NaLAorCisJTVZfUV9DVAkJCT0gMzIsCisJTVZfQ1JRQl9TWgkJPSAzMiwKKwlNVl9DUlBCX1NaCQk9IDgsCisKKwlNVl9ETUFfQk9VTkRBUlkJCT0gMHhmZmZmZmZmZlUsCisJU0FUQUhDX01BU0sJCT0gKH4oTVZfU0FUQUhDX1JFR19TWiAtIDEpKSwKKworCU1WX1BPUlRTX1BFUl9IQwkJPSA0LAorCS8qID09IChwb3J0IC8gTVZfUE9SVFNfUEVSX0hDKSB0byBkZXRlcm1pbmUgSEMgZnJvbSAwLTcgcG9ydCAqLworCU1WX1BPUlRfSENfU0hJRlQJPSAyLAorCS8qID09IChwb3J0ICUgTVZfUE9SVFNfUEVSX0hDKSB0byBkZXRlcm1pbmUgcG9ydCBmcm9tIDAtNyBwb3J0ICovCisJTVZfUE9SVF9NQVNLCQk9IDMsCisKKwkvKiBIb3N0IEZsYWdzICovCisJTVZfRkxBR19EVUFMX0hDCQk9ICgxIDw8IDMwKSwgIC8qIHR3byBTQVRBIEhvc3QgQ29udHJvbGxlcnMgKi8KKwlNVl9GTEFHX0lSUV9DT0FMRVNDRQk9ICgxIDw8IDI5KSwgIC8qIElSUSBjb2FsZXNjaW5nIGNhcGFiaWxpdHkgKi8KKwlNVl9GTEFHX0JETUEJCT0gKDEgPDwgMjgpLCAgLyogQmFzaWMgRE1BICovCisKKwljaGlwXzUwNHgJCT0gMCwKKwljaGlwXzUwOHgJCT0gMSwKKwljaGlwXzYwNHgJCT0gMiwKKwljaGlwXzYwOHgJCT0gMywKKworCS8qIFBDSSBpbnRlcmZhY2UgcmVnaXN0ZXJzICovCisKKwlQQ0lfTUFJTl9DTURfU1RTX09GUwk9IDB4ZDMwLAorCVNUT1BfUENJX01BU1RFUgkJPSAoMSA8PCAyKSwKKwlQQ0lfTUFTVEVSX0VNUFRZCT0gKDEgPDwgMyksCisJR0xPQl9TRlRfUlNUCQk9ICgxIDw8IDQpLAorCisJUENJX0lSUV9DQVVTRV9PRlMJPSAweDFkNTgsCisJUENJX0lSUV9NQVNLX09GUwk9IDB4MWQ1YywKKwlQQ0lfVU5NQVNLX0FMTF9JUlFTCT0gMHg3ZmZmZmYsCS8qIGJpdHMgMjItMCAqLworCisJSENfTUFJTl9JUlFfQ0FVU0VfT0ZTCT0gMHgxZDYwLAorCUhDX01BSU5fSVJRX01BU0tfT0ZTCT0gMHgxZDY0LAorCVBPUlQwX0VSUgkJPSAoMSA8PCAwKSwJLyogc2hpZnQgYnkgcG9ydCAjICovCisJUE9SVDBfRE9ORQkJPSAoMSA8PCAxKSwJLyogc2hpZnQgYnkgcG9ydCAjICovCisJSEMwX0lSUV9QRU5ECQk9IDB4MWZmLAkvKiBiaXRzIDAtOCA9IEhDMCdzIHBvcnRzICovCisJSENfU0hJRlQJCT0gOSwJCS8qIGJpdHMgOS0xNyA9IEhDMSdzIHBvcnRzICovCisJUENJX0VSUgkJCT0gKDEgPDwgMTgpLAorCVRSQU5fTE9fRE9ORQkJPSAoMSA8PCAxOSksCS8qIDZ4eHg6IElSUSBjb2FsZXNjaW5nICovCisJVFJBTl9ISV9ET05FCQk9ICgxIDw8IDIwKSwJLyogNnh4eDogSVJRIGNvYWxlc2NpbmcgKi8KKwlQT1JUU18wXzdfQ09BTF9ET05FCT0gKDEgPDwgMjEpLAkvKiA2eHh4OiBJUlEgY29hbGVzY2luZyAqLworCUdQSU9fSU5UCQk9ICgxIDw8IDIyKSwKKwlTRUxGX0lOVAkJPSAoMSA8PCAyMyksCisJVFdTSV9JTlQJCT0gKDEgPDwgMjQpLAorCUhDX01BSU5fUlNWRAkJPSAoMHg3ZiA8PCAyNSksCS8qIGJpdHMgMzEtMjUgKi8KKwlIQ19NQUlOX01BU0tFRF9JUlFTCT0gKFRSQU5fTE9fRE9ORSB8IFRSQU5fSElfRE9ORSB8IAorCQkJCSAgIFBPUlRTXzBfN19DT0FMX0RPTkUgfCBHUElPX0lOVCB8IFRXU0lfSU5UIHwKKwkJCQkgICBIQ19NQUlOX1JTVkQpLAorCisJLyogU0FUQUhDIHJlZ2lzdGVycyAqLworCUhDX0NGR19PRlMJCT0gMCwKKworCUhDX0lSUV9DQVVTRV9PRlMJPSAweDE0LAorCUNSQlBfRE1BX0RPTkUJCT0gKDEgPDwgMCksCS8qIHNoaWZ0IGJ5IHBvcnQgIyAqLworCUhDX0lSUV9DT0FMCQk9ICgxIDw8IDQpLAkvKiBJUlEgY29hbGVzY2luZyAqLworCURFVl9JUlEJCQk9ICgxIDw8IDgpLAkvKiBzaGlmdCBieSBwb3J0ICMgKi8KKworCS8qIFNoYWRvdyBibG9jayByZWdpc3RlcnMgKi8KKwlTSERfUElPX0RBVEFfT0ZTCT0gMHgxMDAsCisJU0hEX0ZFQV9FUlJfT0ZTCQk9IDB4MTA0LAorCVNIRF9TRUNUX0NOVF9PRlMJPSAweDEwOCwKKwlTSERfTEJBX0xfT0ZTCQk9IDB4MTBDLAorCVNIRF9MQkFfTV9PRlMJCT0gMHgxMTAsCisJU0hEX0xCQV9IX09GUwkJPSAweDExNCwKKwlTSERfREVWX0hEX09GUwkJPSAweDExOCwKKwlTSERfQ01EX1NUQV9PRlMJCT0gMHgxMUMsCisJU0hEX0NUTF9BU1RfT0ZTCQk9IDB4MTIwLAorCisJLyogU0FUQSByZWdpc3RlcnMgKi8KKwlTQVRBX1NUQVRVU19PRlMJCT0gMHgzMDAsICAvKiBjdHJsLCBlcnIgcmVncyBmb2xsb3cgc3RhdHVzICovCisJU0FUQV9BQ1RJVkVfT0ZTCQk9IDB4MzUwLAorCisJLyogUG9ydCByZWdpc3RlcnMgKi8KKwlFRE1BX0NGR19PRlMJCT0gMCwKKworCUVETUFfRVJSX0lSUV9DQVVTRV9PRlMJPSAweDgsCisJRURNQV9FUlJfSVJRX01BU0tfT0ZTCT0gMHhjLAorCUVETUFfRVJSX0RfUEFSCQk9ICgxIDw8IDApLAorCUVETUFfRVJSX1BSRF9QQVIJPSAoMSA8PCAxKSwKKwlFRE1BX0VSUl9ERVYJCT0gKDEgPDwgMiksCisJRURNQV9FUlJfREVWX0RDT04JPSAoMSA8PCAzKSwKKwlFRE1BX0VSUl9ERVZfQ09OCT0gKDEgPDwgNCksCisJRURNQV9FUlJfU0VSUgkJPSAoMSA8PCA1KSwKKwlFRE1BX0VSUl9TRUxGX0RJUwk9ICgxIDw8IDcpLAorCUVETUFfRVJSX0JJU1RfQVNZTkMJPSAoMSA8PCA4KSwKKwlFRE1BX0VSUl9DUkJRX1BBUgk9ICgxIDw8IDkpLAorCUVETUFfRVJSX0NSUEJfUEFSCT0gKDEgPDwgMTApLAorCUVETUFfRVJSX0lOVFJMX1BBUgk9ICgxIDw8IDExKSwKKwlFRE1BX0VSUl9JT1JEWQkJPSAoMSA8PCAxMiksCisJRURNQV9FUlJfTE5LX0NUUkxfUlgJPSAoMHhmIDw8IDEzKSwKKwlFRE1BX0VSUl9MTktfQ1RSTF9SWF8yCT0gKDEgPDwgMTUpLAorCUVETUFfRVJSX0xOS19EQVRBX1JYCT0gKDB4ZiA8PCAxNyksCisJRURNQV9FUlJfTE5LX0NUUkxfVFgJPSAoMHgxZiA8PCAyMSksCisJRURNQV9FUlJfTE5LX0RBVEFfVFgJPSAoMHgxZiA8PCAyNiksCisJRURNQV9FUlJfVFJBTlNfUFJPVE8JPSAoMSA8PCAzMSksCisJRURNQV9FUlJfRkFUQUwJCT0gKEVETUFfRVJSX0RfUEFSIHwgRURNQV9FUlJfUFJEX1BBUiB8IAorCQkJCSAgIEVETUFfRVJSX0RFVl9EQ09OIHwgRURNQV9FUlJfQ1JCUV9QQVIgfAorCQkJCSAgIEVETUFfRVJSX0NSUEJfUEFSIHwgRURNQV9FUlJfSU5UUkxfUEFSIHwKKwkJCQkgICBFRE1BX0VSUl9JT1JEWSB8IEVETUFfRVJSX0xOS19DVFJMX1JYXzIgfCAKKwkJCQkgICBFRE1BX0VSUl9MTktfREFUQV9SWCB8CisJCQkJICAgRURNQV9FUlJfTE5LX0RBVEFfVFggfCAKKwkJCQkgICBFRE1BX0VSUl9UUkFOU19QUk9UTyksCisKKwlFRE1BX0NNRF9PRlMJCT0gMHgyOCwKKwlFRE1BX0VOCQkJPSAoMSA8PCAwKSwKKwlFRE1BX0RTCQkJPSAoMSA8PCAxKSwKKwlBVEFfUlNUCQkJPSAoMSA8PCAyKSwKKworCS8qIEJETUEgaXMgNnh4eCBwYXJ0IG9ubHkgKi8KKwlCRE1BX0NNRF9PRlMJCT0gMHgyMjQsCisJQkRNQV9TVEFSVAkJPSAoMSA8PCAwKSwKKworCU1WX1VOREVGCQk9IDAsCit9OworCitzdHJ1Y3QgbXZfcG9ydF9wcml2IHsKKworfTsKKworc3RydWN0IG12X2hvc3RfcHJpdiB7CisKK307CisKK3N0YXRpYyB2b2lkIG12X2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB1MzIgbXZfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbik7CitzdGF0aWMgdm9pZCBtdl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyIHZhbCk7CitzdGF0aWMgdm9pZCBtdl9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IG12X21hc3Rlcl9yZXNldCh2b2lkIF9faW9tZW0gKm1taW9fYmFzZSk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbXZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IG12X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBtdl9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBNVl9VTkRFRiwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBNVl9VTkRFRiwKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gTVZfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbXZfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKworCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCisJLnBoeV9yZXNldAkJPSBtdl9waHlfcmVzZXQsCisKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCisJLmlycV9oYW5kbGVyCQk9IG12X2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IG12X2lycV9jbGVhciwKKworCS5zY3JfcmVhZAkJPSBtdl9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IG12X3Njcl93cml0ZSwKKworCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCQk9IGF0YV9ob3N0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gbXZfcG9ydF9pbmZvW10gPSB7CisJeyAgLyogY2hpcF81MDR4ICovCisJCS5zaHQJCT0gJm12X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSAoQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICAgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8IEFUQV9GTEFHX01NSU8pLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW80LTAgKi8KKwkJLnVkbWFfbWFzawk9IDAsCS8qIDB4N2YgKHVkbWE2LTAgZGlzYWJsZWQgZm9yIG5vdykgKi8KKwkJLnBvcnRfb3BzCT0gJm12X29wcywKKwl9LAorCXsgIC8qIGNoaXBfNTA4eCAqLworCQkuc2h0CQk9ICZtdl9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gKEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19NTUlPIHwgCisJCQkJICAgTVZfRkxBR19EVUFMX0hDKSwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvNC0wICovCisJCS51ZG1hX21hc2sJPSAwLAkvKiAweDdmICh1ZG1hNi0wIGRpc2FibGVkIGZvciBub3cpICovCisJCS5wb3J0X29wcwk9ICZtdl9vcHMsCisJfSwKKwl7ICAvKiBjaGlwXzYwNHggKi8KKwkJLnNodAkJPSAmbXZfc2h0LAorCQkuaG9zdF9mbGFncwk9IChBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgICBBVEFfRkxBR19TQVRBX1JFU0VUIHwgQVRBX0ZMQUdfTU1JTyB8IAorCQkJCSAgIE1WX0ZMQUdfSVJRX0NPQUxFU0NFIHwgTVZfRkxBR19CRE1BKSwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvNC0wICovCisJCS51ZG1hX21hc2sJPSAwLAkvKiAweDdmICh1ZG1hNi0wIGRpc2FibGVkIGZvciBub3cpICovCisJCS5wb3J0X29wcwk9ICZtdl9vcHMsCisJfSwKKwl7ICAvKiBjaGlwXzYwOHggKi8KKwkJLnNodAkJPSAmbXZfc2h0LAorCQkuaG9zdF9mbGFncwk9IChBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgICBBVEFfRkxBR19TQVRBX1JFU0VUIHwgQVRBX0ZMQUdfTU1JTyB8CisJCQkJICAgTVZfRkxBR19JUlFfQ09BTEVTQ0UgfCBNVl9GTEFHX0RVQUxfSEMgfAorCQkJCSAgIE1WX0ZMQUdfQkRNQSksCisJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzQtMCAqLworCQkudWRtYV9tYXNrCT0gMCwJLyogMHg3ZiAodWRtYTYtMCBkaXNhYmxlZCBmb3Igbm93KSAqLworCQkucG9ydF9vcHMJPSAmbXZfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbXZfcGNpX3RibFtdID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDQwKSwgMCwgMCwgY2hpcF81MDR4fSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NTA0MSksIDAsIDAsIGNoaXBfNTA0eH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDUwODApLCAwLCAwLCBjaGlwXzUwOHh9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDgxKSwgMCwgMCwgY2hpcF81MDh4fSwKKworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg2MDQwKSwgMCwgMCwgY2hpcF82MDR4fSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NjA0MSksIDAsIDAsIGNoaXBfNjA0eH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDYwODApLCAwLCAwLCBjaGlwXzYwOHh9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg2MDgxKSwgMCwgMCwgY2hpcF82MDh4fSwKKwl7fQkJCS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbXZfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IG12X3BjaV90YmwsCisJLnByb2JlCQkJPSBtdl9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlbGZsKHVuc2lnbmVkIGxvbmcgZGF0YSwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlbChkYXRhLCBhZGRyKTsKKwkodm9pZCkgcmVhZGwoYWRkcik7CS8qIGZsdXNoIHRvIGF2b2lkIFBDSSBwb3N0ZWQgd3JpdGUgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm12X3BvcnRfYWRkcl90b19oY19iYXNlKHZvaWQgX19pb21lbSAqcG9ydF9tbWlvKQoreworCXJldHVybiAoKHZvaWQgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylwb3J0X21taW8gJiAKKwkJCQkgKHVuc2lnbmVkIGxvbmcpU0FUQUhDX01BU0spKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm12X2hjX2Jhc2Uodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgaGMpCit7CisJcmV0dXJuIChiYXNlICsgTVZfU0FUQUhDMF9SRUdfQkFTRSArIChoYyAqIE1WX1NBVEFIQ19SRUdfU1opKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm12X3BvcnRfYmFzZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBwb3J0KQoreworCXJldHVybiAobXZfaGNfYmFzZShiYXNlLCBwb3J0ID4+IE1WX1BPUlRfSENfU0hJRlQpICsKKwkJTVZfU0FUQUhDX0FSQlRSX1JFR19TWiArIAorCQkoKHBvcnQgJiBNVl9QT1JUX01BU0spICogTVZfUE9SVF9SRUdfU1opKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm12X2FwX2Jhc2Uoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlyZXR1cm4gbXZfcG9ydF9iYXNlKGFwLT5ob3N0X3NldC0+bW1pb19iYXNlLCBhcC0+cG9ydF9ubyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12X2dldF9oY19jb3VudCh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAoKGZsYWdzICYgTVZfRkxBR19EVUFMX0hDKSA/IDIgOiAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXZfaXNfZWRtYV9hY3RpdmUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IG12X2FwX2Jhc2UoYXApOworCXJldHVybiAoRURNQV9FTiAmIHJlYWRsKHBvcnRfbW1pbyArIEVETUFfQ01EX09GUykpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdl9wb3J0X2JkbWFfY2FwYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiAoYXAtPmZsYWdzICYgTVZfRkxBR19CRE1BKTsKK30KKworc3RhdGljIHZvaWQgbXZfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXZfc2NyX29mZnNldCh1bnNpZ25lZCBpbnQgc2NfcmVnX2luKQoreworCXVuc2lnbmVkIGludCBvZnM7CisKKwlzd2l0Y2ggKHNjX3JlZ19pbikgeworCWNhc2UgU0NSX1NUQVRVUzoKKwljYXNlIFNDUl9DT05UUk9MOgorCWNhc2UgU0NSX0VSUk9SOgorCQlvZnMgPSBTQVRBX1NUQVRVU19PRlMgKyAoc2NfcmVnX2luICogc2l6ZW9mKHUzMikpOworCQlicmVhazsKKwljYXNlIFNDUl9BQ1RJVkU6CisJCW9mcyA9IFNBVEFfQUNUSVZFX09GUzsgICAvKiBhY3RpdmUgaXMgbm90IHdpdGggdGhlIG90aGVycyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlvZnMgPSAweGZmZmZmZmZmVTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBvZnM7Cit9CisKK3N0YXRpYyB1MzIgbXZfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbikKK3sKKwl1bnNpZ25lZCBpbnQgb2ZzID0gbXZfc2NyX29mZnNldChzY19yZWdfaW4pOworCisJaWYgKDB4ZmZmZmZmZmZVICE9IG9mcykgeworCQlyZXR1cm4gcmVhZGwobXZfYXBfYmFzZShhcCkgKyBvZnMpOworCX0gZWxzZSB7CisJCXJldHVybiAodTMyKSBvZnM7CisJfQorfQorCitzdGF0aWMgdm9pZCBtdl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgb2ZzID0gbXZfc2NyX29mZnNldChzY19yZWdfaW4pOworCisJaWYgKDB4ZmZmZmZmZmZVICE9IG9mcykgeworCQl3cml0ZWxmbCh2YWwsIG12X2FwX2Jhc2UoYXApICsgb2ZzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXZfbWFzdGVyX3Jlc2V0KHZvaWQgX19pb21lbSAqbW1pb19iYXNlKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gbW1pb19iYXNlICsgUENJX01BSU5fQ01EX1NUU19PRlM7CisJaW50IGksIHJjID0gMDsKKwl1MzIgdDsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCS8qIEZvbGxvd2luZyBwcm9jZWR1cmUgZGVmaW5lZCBpbiBQQ0kgIm1haW4gY29tbWFuZCBhbmQgc3RhdHVzCisJICogcmVnaXN0ZXIiIHRhYmxlLgorCSAqLworCXQgPSByZWFkbChyZWcpOworCXdyaXRlbCh0IHwgU1RPUF9QQ0lfTUFTVEVSLCByZWcpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCW1zbGVlcCgxMCk7CisJCXQgPSByZWFkbChyZWcpOworCQlpZiAoUENJX01BU1RFUl9FTVBUWSAmIHQpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghKFBDSV9NQVNURVJfRU1QVFkgJiB0KSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIlBDSSBtYXN0ZXIgd29uJ3QgZmx1c2hcbiIpOworCQlyYyA9IDE7CQkvKiBicm9rZW4gSFc/ICovCisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBzZXQgcmVzZXQgKi8KKwlpID0gNTsKKwlkbyB7CisJCXdyaXRlbCh0IHwgR0xPQl9TRlRfUlNULCByZWcpOworCQl0ID0gcmVhZGwocmVnKTsKKwkJdWRlbGF5KDEpOworCX0gd2hpbGUgKCEoR0xPQl9TRlRfUlNUICYgdCkgJiYgKGktLSA+IDApKTsKKworCWlmICghKEdMT0JfU0ZUX1JTVCAmIHQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiY2FuJ3Qgc2V0IGdsb2JhbCByZXNldFxuIik7CisJCXJjID0gMTsJCS8qIGJyb2tlbiBIVz8gKi8KKwkJZ290byBkb25lOworCX0KKworCS8qIGNsZWFyIHJlc2V0ICovCisJaSA9IDU7CisJZG8geworCQl3cml0ZWwodCAmIH5HTE9CX1NGVF9SU1QsIHJlZyk7CisJCXQgPSByZWFkbChyZWcpOworCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAoKEdMT0JfU0ZUX1JTVCAmIHQpICYmIChpLS0gPiAwKSk7CisKKwlpZiAoR0xPQl9TRlRfUlNUICYgdCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgImNhbid0IGNsZWFyIGdsb2JhbCByZXNldFxuIik7CisJCXJjID0gMTsJCS8qIGJyb2tlbiBIVz8gKi8KKwl9CisKKyBkb25lOgorCVZQUklOVEsoIkVYSVQsIHJjID0gJWlcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIG12X2Vycl9pbnRyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW87CisJdTMyIGVkbWFfZXJyX2NhdXNlLCBzZXJyID0gMDsKKworCS8qIGJ1ZyBoZXJlIGIvYyB3ZSBnb3QgYW4gZXJyIGludCBvbiBhIHBvcnQgd2UgZG9uJ3Qga25vdyBhYm91dCwKKwkgKiBzbyB0aGVyZSdzIG5vIHdheSB0byBjbGVhciBpdAorCSAqLworCUJVR19PTihOVUxMID09IGFwKTsKKwlwb3J0X21taW8gPSBtdl9hcF9iYXNlKGFwKTsKKworCWVkbWFfZXJyX2NhdXNlID0gcmVhZGwocG9ydF9tbWlvICsgRURNQV9FUlJfSVJRX0NBVVNFX09GUyk7CisKKwlpZiAoRURNQV9FUlJfU0VSUiAmIGVkbWFfZXJyX2NhdXNlKSB7CisJCXNlcnIgPSBzY3JfcmVhZChhcCwgU0NSX0VSUk9SKTsKKwkJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfRVJST1IsIHNlcnIpOworCX0KKwlEUFJJTlRLKCJwb3J0ICV1IGVycm9yOyBFRE1BIGVyciBjYXVzZTogMHglMDh4IFNFUlI6IDB4JTA4eFxuIiwgCisJCWFwLT5wb3J0X25vLCBlZG1hX2Vycl9jYXVzZSwgc2Vycik7CisKKwkvKiBDbGVhciBFRE1BIG5vdyB0aGF0IFNFUlIgY2xlYW51cCBkb25lICovCisJd3JpdGVsZmwoMCwgcG9ydF9tbWlvICsgRURNQV9FUlJfSVJRX0NBVVNFX09GUyk7CisKKwkvKiBjaGVjayBmb3IgZmF0YWwgaGVyZSBhbmQgcmVjb3ZlciBpZiBuZWVkZWQgKi8KKwlpZiAoRURNQV9FUlJfRkFUQUwgJiBlZG1hX2Vycl9jYXVzZSkgeworCQltdl9waHlfcmVzZXQoYXApOworCX0KK30KKworLyogSGFuZGxlIGFueSBvdXRzdGFuZGluZyBpbnRlcnJ1cHRzIGluIGEgc2luZ2xlIFNBVEFIQyAKKyAqLworc3RhdGljIHZvaWQgbXZfaG9zdF9pbnRyKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0LCB1MzIgcmVsZXZhbnQsCisJCQkgdW5zaWduZWQgaW50IGhjKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpoY19tbWlvID0gbXZfaGNfYmFzZShtbWlvLCBoYyk7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXUzMiBoY19pcnFfY2F1c2U7CisJaW50IHNoaWZ0LCBwb3J0LCBwb3J0MCwgaGFyZF9wb3J0OworCXU4IGF0YV9zdGF0dXM7CisKKwlpZiAoaGMgPT0gMCkgeworCQlwb3J0MCA9IDA7CisJfSBlbHNlIHsKKwkJcG9ydDAgPSBNVl9QT1JUU19QRVJfSEM7CisJfQorCisJLyogd2UnbGwgbmVlZCB0aGUgSEMgc3VjY2VzcyBpbnQgcmVnaXN0ZXIgaW4gbW9zdCBjYXNlcyAqLworCWhjX2lycV9jYXVzZSA9IHJlYWRsKGhjX21taW8gKyBIQ19JUlFfQ0FVU0VfT0ZTKTsKKwlpZiAoaGNfaXJxX2NhdXNlKSB7CisJCXdyaXRlbGZsKDAsIGhjX21taW8gKyBIQ19JUlFfQ0FVU0VfT0ZTKTsKKwl9CisKKwlWUFJJTlRLKCJFTlRFUiwgaGMldSByZWxldmFudD0weCUwOHggSEMgSVJRIGNhdXNlPTB4JTA4eFxuIiwKKwkJaGMscmVsZXZhbnQsaGNfaXJxX2NhdXNlKTsKKworCWZvciAocG9ydCA9IHBvcnQwOyBwb3J0IDwgcG9ydDAgKyBNVl9QT1JUU19QRVJfSEM7IHBvcnQrKykgeworCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1twb3J0XTsKKwkJaGFyZF9wb3J0ID0gcG9ydCAmIE1WX1BPUlRfTUFTSzsJLyogcmFuZ2UgMC0zICovCisJCWF0YV9zdGF0dXMgPSAweGZmVTsKKworCQlpZiAoKChDUkJQX0RNQV9ET05FIHwgREVWX0lSUSkgPDwgaGFyZF9wb3J0KSAmIGhjX2lycV9jYXVzZSkgeworCQkJQlVHX09OKE5VTEwgPT0gYXApOworCQkJLyogcmN2J2QgbmV3IHJlc3AsIGJhc2ljIERNQSBjb21wbGV0ZSwgb3IgQVRBIElSUSAqLworCQkJLyogVGhpcyBpcyBuZWVkZWQgdG8gY2xlYXIgdGhlIEFUQSBJTlRSUS4KKwkJCSAqIEZJWE1FOiBkb24ndCByZWFkIHRoZSBzdGF0dXMgcmVnIGluIEVETUEgbW9kZSEKKwkJCSAqLworCQkJYXRhX3N0YXR1cyA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikKKwkJCQkJICAgYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7CisJCX0KKworCQlzaGlmdCA9IHBvcnQgKiAyOworCQlpZiAocG9ydCA+PSBNVl9QT1JUU19QRVJfSEMpIHsKKwkJCXNoaWZ0Kys7CS8qIHNraXAgYml0IDggaW4gdGhlIEhDIE1haW4gSVJRIHJlZyAqLworCQl9CisJCWlmICgoUE9SVDBfRVJSIDw8IHNoaWZ0KSAmIHJlbGV2YW50KSB7CisJCQltdl9lcnJfaW50cihhcCk7CisJCQkvKiBGSVhNRTogc21hcnQgdG8gT1IgaW4gQVRBX0VSUj8gKi8KKwkJCWF0YV9zdGF0dXMgPSByZWFkYigodm9pZCBfX2lvbWVtICopCisJCQkJCSAgIGFwLT5pb2FkZHIuc3RhdHVzX2FkZHIpIHwgQVRBX0VSUjsKKwkJfQorCQkKKwkJaWYgKGFwKSB7CisJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQkJaWYgKE5VTEwgIT0gcWMpIHsKKwkJCQlWUFJJTlRLKCJwb3J0ICV1IElSUSBmb3VuZCBmb3IgcWMsICIKKwkJCQkJImF0YV9zdGF0dXMgMHgleFxuIiwgcG9ydCxhdGFfc3RhdHVzKTsKKwkJCQlCVUdfT04oMHhmZlUgPT0gYXRhX3N0YXR1cyk7CisJCQkJLyogbWFyayBxYyBzdGF0dXMgYXBwcm9wcmlhdGVseSAqLworCQkJCWF0YV9xY19jb21wbGV0ZShxYywgYXRhX3N0YXR1cyk7CisJCQl9CisJCX0KKwl9CisJVlBSSU5USygiRVhJVFxuIik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtdl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2luc3RhbmNlOworCXVuc2lnbmVkIGludCBoYywgaGFuZGxlZCA9IDAsIG5faGNzOworCXZvaWQgX19pb21lbSAqbW1pbzsKKwl1MzIgaXJxX3N0YXQ7CisKKwltbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKwlpcnFfc3RhdCA9IHJlYWRsKG1taW8gKyBIQ19NQUlOX0lSUV9DQVVTRV9PRlMpOworCW5faGNzID0gbXZfZ2V0X2hjX2NvdW50KGhvc3Rfc2V0LT5wb3J0c1swXS0+ZmxhZ3MpOworCisJLyogY2hlY2sgdGhlIGNhc2VzIHdoZXJlIHdlIGVpdGhlciBoYXZlIG5vdGhpbmcgcGVuZGluZyBvciBoYXZlIHJlYWQKKwkgKiBhIGJvZ3VzIHJlZ2lzdGVyIHZhbHVlIHdoaWNoIGNhbiBpbmRpY2F0ZSBIVyByZW1vdmFsIG9yIFBDSSBmYXVsdAorCSAqLworCWlmICghaXJxX3N0YXQgfHwgKDB4ZmZmZmZmZmZVID09IGlycV9zdGF0KSkgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwlmb3IgKGhjID0gMDsgaGMgPCBuX2hjczsgaGMrKykgeworCQl1MzIgcmVsZXZhbnQgPSBpcnFfc3RhdCAmIChIQzBfSVJRX1BFTkQgPDwgKGhjICogSENfU0hJRlQpKTsKKwkJaWYgKHJlbGV2YW50KSB7CisJCQltdl9ob3N0X2ludHIoaG9zdF9zZXQsIHJlbGV2YW50LCBoYyk7CisJCQloYW5kbGVkID0gMTsKKwkJfQorCX0KKwlpZiAoUENJX0VSUiAmIGlycV9zdGF0KSB7CisJCS8qIEZJWE1FOiB0aGVzZSBhcmUgYWxsIG1hc2tlZCBieSBkZWZhdWx0LCBidXQgc3RpbGwgbmVlZAorCQkgKiB0byByZWNvdmVyIGZyb20gdGhlbSBwcm9wZXJseS4KKwkJICovCisJfQorCisJc3Bpbl91bmxvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBtdl9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IG12X2FwX2Jhc2UoYXApOworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlWzBdOworCXUzMiBlZG1hID0gMCwgYmRtYTsKKworCVZQUklOVEsoIkVOVEVSLCBwb3J0ICV1LCBtbWlvIDB4JXBcbiIsIGFwLT5wb3J0X25vLCBwb3J0X21taW8pOworCisJZWRtYSA9IHJlYWRsKHBvcnRfbW1pbyArIEVETUFfQ01EX09GUyk7CisJaWYgKEVETUFfRU4gJiBlZG1hKSB7CisJCS8qIGRpc2FibGUgRURNQSBpZiBhY3RpdmUgKi8KKwkJZWRtYSAmPSB+RURNQV9FTjsKKwkJd3JpdGVsZmwoZWRtYSB8IEVETUFfRFMsIHBvcnRfbW1pbyArIEVETUFfQ01EX09GUyk7CisJCXVkZWxheSgxKTsKKwl9IGVsc2UgaWYgKG12X3BvcnRfYmRtYV9jYXBhYmxlKGFwKSAmJgorCQkgICAoYmRtYSA9IHJlYWRsKHBvcnRfbW1pbyArIEJETUFfQ01EX09GUykpICYgQkRNQV9TVEFSVCkgeworCQkvKiBkaXNhYmxlIEJETUEgaWYgYWN0aXZlICovCisJCXdyaXRlbGZsKGJkbWEgJiB+QkRNQV9TVEFSVCwgcG9ydF9tbWlvICsgQkRNQV9DTURfT0ZTKTsKKwl9CisKKwl3cml0ZWxmbChlZG1hIHwgQVRBX1JTVCwgcG9ydF9tbWlvICsgRURNQV9DTURfT0ZTKTsKKwl1ZGVsYXkoMjUpOwkJLyogYWxsb3cgcmVzZXQgcHJvcGFnYXRpb24gKi8KKworCS8qIFNwZWMgbmV2ZXIgbWVudGlvbnMgY2xlYXJpbmcgdGhlIGJpdC4gIE1hcnZlbGwncyBkcml2ZXIgZG9lcworCSAqIGNsZWFyIHRoZSBiaXQsIGhvd2V2ZXIuCisJICovCisJd3JpdGVsZmwoZWRtYSAmIH5BVEFfUlNULCBwb3J0X21taW8gKyBFRE1BX0NNRF9PRlMpOworCisJVlBSSU5USygiRG9uZS4gIE5vdyBjYWxsaW5nIF9fc2F0YV9waHlfcmVzZXQoKVxuIik7CisKKwkvKiBwcm9jZWVkIHRvIGluaXQgY29tbXVuaWNhdGlvbnMgdmlhIHRoZSBzY3JfY29udHJvbCByZWcgKi8KKwlfX3NhdGFfcGh5X3Jlc2V0KGFwKTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSB7CisJCVZQUklOVEsoIlBvcnQgZGlzYWJsZWQgcHJlLXNpZy4gIEV4aXRpbmcuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXRmLmxiYWggPSByZWFkYigodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIubGJhaF9hZGRyKTsKKwl0Zi5sYmFtID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmxiYW1fYWRkcik7CisJdGYubGJhbCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5sYmFsX2FkZHIpOworCXRmLm5zZWN0ID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLm5zZWN0X2FkZHIpOworCisJZGV2LT5jbGFzcyA9IGF0YV9kZXZfY2xhc3NpZnkoJnRmKTsKKwlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKSB7CisJCVZQUklOVEsoIlBvcnQgZGlzYWJsZWQgcG9zdC1zaWc6IE5vIGRldmljZSBwcmVzZW50LlxuIik7CisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCX0KKwlWUFJJTlRLKCJFWElUXG4iKTsKK30KKworc3RhdGljIHZvaWQgbXZfcG9ydF9pbml0KHN0cnVjdCBhdGFfaW9wb3J0cyAqcG9ydCwgdW5zaWduZWQgbG9uZyBiYXNlKQoreworCS8qIFBJTyByZWxhdGVkIHNldHVwICovCisJcG9ydC0+ZGF0YV9hZGRyID0gYmFzZSArIFNIRF9QSU9fREFUQV9PRlM7CisJcG9ydC0+ZXJyb3JfYWRkciA9IHBvcnQtPmZlYXR1cmVfYWRkciA9IGJhc2UgKyBTSERfRkVBX0VSUl9PRlM7CisJcG9ydC0+bnNlY3RfYWRkciA9IGJhc2UgKyBTSERfU0VDVF9DTlRfT0ZTOworCXBvcnQtPmxiYWxfYWRkciA9IGJhc2UgKyBTSERfTEJBX0xfT0ZTOworCXBvcnQtPmxiYW1fYWRkciA9IGJhc2UgKyBTSERfTEJBX01fT0ZTOworCXBvcnQtPmxiYWhfYWRkciA9IGJhc2UgKyBTSERfTEJBX0hfT0ZTOworCXBvcnQtPmRldmljZV9hZGRyID0gYmFzZSArIFNIRF9ERVZfSERfT0ZTOworCXBvcnQtPnN0YXR1c19hZGRyID0gcG9ydC0+Y29tbWFuZF9hZGRyID0gYmFzZSArIFNIRF9DTURfU1RBX09GUzsKKwlwb3J0LT5hbHRzdGF0dXNfYWRkciA9IHBvcnQtPmN0bF9hZGRyID0gYmFzZSArIFNIRF9DVExfQVNUX09GUzsKKwkvKiB1bnVzZWQgKi8KKwlwb3J0LT5jbWRfYWRkciA9IHBvcnQtPmJtZG1hX2FkZHIgPSBwb3J0LT5zY3JfYWRkciA9IDA7CisKKwkvKiB1bm1hc2sgYWxsIEVETUEgZXJyb3IgaW50ZXJydXB0cyAqLworCXdyaXRlbCh+MCwgKHZvaWQgX19pb21lbSAqKWJhc2UgKyBFRE1BX0VSUl9JUlFfTUFTS19PRlMpOworCisJVlBSSU5USygiRURNQSBjZmc9MHglMDh4IEVETUEgSVJRIGVyciBjYXVzZS9tYXNrPTB4JTA4eC8weCUwOHhcbiIsIAorCQlyZWFkbCgodm9pZCBfX2lvbWVtICopYmFzZSArIEVETUFfQ0ZHX09GUyksCisJCXJlYWRsKCh2b2lkIF9faW9tZW0gKiliYXNlICsgRURNQV9FUlJfSVJRX0NBVVNFX09GUyksCisJCXJlYWRsKCh2b2lkIF9faW9tZW0gKiliYXNlICsgRURNQV9FUlJfSVJRX01BU0tfT0ZTKSk7Cit9CisKK3N0YXRpYyBpbnQgbXZfaG9zdF9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJaW50IHJjID0gMCwgbl9oYywgcG9ydCwgaGM7CisJdm9pZCBfX2lvbWVtICptbWlvID0gcHJvYmVfZW50LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW87CisKKwlpZiAobXZfbWFzdGVyX3Jlc2V0KHByb2JlX2VudC0+bW1pb19iYXNlKSkgeworCQlyYyA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwluX2hjID0gbXZfZ2V0X2hjX2NvdW50KHByb2JlX2VudC0+aG9zdF9mbGFncyk7CisJcHJvYmVfZW50LT5uX3BvcnRzID0gTVZfUE9SVFNfUEVSX0hDICogbl9oYzsKKworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IHBvcnQrKykgeworCQlwb3J0X21taW8gPSBtdl9wb3J0X2Jhc2UobW1pbywgcG9ydCk7CisJCW12X3BvcnRfaW5pdCgmcHJvYmVfZW50LT5wb3J0W3BvcnRdLCAodW5zaWduZWQgbG9uZylwb3J0X21taW8pOworCX0KKworCWZvciAoaGMgPSAwOyBoYyA8IG5faGM7IGhjKyspIHsKKwkJVlBSSU5USygiSEMlaTogSEMgY29uZmlnPTB4JTA4eCBIQyBJUlEgY2F1c2U9MHglMDh4XG4iLCBoYywKKwkJCXJlYWRsKG12X2hjX2Jhc2UobW1pbywgaGMpICsgSENfQ0ZHX09GUyksCisJCQlyZWFkbChtdl9oY19iYXNlKG1taW8sIGhjKSArIEhDX0lSUV9DQVVTRV9PRlMpKTsKKwl9CisKKwl3cml0ZWwofkhDX01BSU5fTUFTS0VEX0lSUVMsIG1taW8gKyBIQ19NQUlOX0lSUV9NQVNLX09GUyk7CisJd3JpdGVsKFBDSV9VTk1BU0tfQUxMX0lSUVMsIG1taW8gKyBQQ0lfSVJRX01BU0tfT0ZTKTsKKworCVZQUklOVEsoIkhDIE1BSU4gSVJRIGNhdXNlL21hc2s9MHglMDh4LzB4JTA4eCAiCisJCSJQQ0kgaW50IGNhdXNlL21hc2s9MHglMDh4LzB4JTA4eFxuIiwgCisJCXJlYWRsKG1taW8gKyBIQ19NQUlOX0lSUV9DQVVTRV9PRlMpLAorCQlyZWFkbChtbWlvICsgSENfTUFJTl9JUlFfTUFTS19PRlMpLAorCQlyZWFkbChtbWlvICsgUENJX0lSUV9DQVVTRV9PRlMpLAorCQlyZWFkbChtbWlvICsgUENJX0lSUV9NQVNLX09GUykpOworCisgZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb24gPSAwOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2OworCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KWVudC0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJaW50IHJjOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykgeworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwl9CisKKwlWUFJJTlRLKCJFTlRFUiBmb3IgUENJIEJ1czpTbG90LkZ1bmM9JXU6JXUuJXVcbiIsIHBkZXYtPmJ1cy0+bnVtYmVyLAorCQlQQ0lfU0xPVChwZGV2LT5kZXZmbiksIFBDSV9GVU5DKHBkZXYtPmRldmZuKSk7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBjaV9pbnR4KHBkZXYsIDEpOworCisJcHJvYmVfZW50ID0ga21hbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOworCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCW1lbXNldChwcm9iZV9lbnQsIDAsIHNpemVvZigqcHJvYmVfZW50KSk7CisJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKKworCW1taW9fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgTVZfUFJJTUFSWV9CQVIpLAorCQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIE1WX1BSSU1BUllfQkFSKSk7CisJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZW50OworCX0KKworCWhwcml2ID0ga21hbGxvYyhzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocHJpdikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKwltZW1zZXQoaHByaXYsIDAsIHNpemVvZigqaHByaXYpKTsKKworCXByb2JlX2VudC0+c2h0ID0gbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OworCXByb2JlX2VudC0+aG9zdF9mbGFncyA9IG12X3BvcnRfaW5mb1tib2FyZF9pZHhdLmhvc3RfZmxhZ3M7CisJcHJvYmVfZW50LT5waW9fbWFzayA9IG12X3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrID0gbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0udWRtYV9tYXNrOworCXByb2JlX2VudC0+cG9ydF9vcHMgPSBtdl9wb3J0X2luZm9bYm9hcmRfaWR4XS5wb3J0X29wczsKKworCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOworCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisJcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCXJjID0gbXZfaG9zdF9pbml0KHByb2JlX2VudCk7CisJaWYgKHJjKSB7CisJCWdvdG8gZXJyX291dF9ocHJpdjsKKwl9CisvKiAJbXZfcHJpbnRfaW5mbyhwcm9iZV9lbnQpOyAqLworCisJeworCQlpbnQgYiwgdzsKKwkJdTMyIGR3WzRdOwkvKiBob2xkIGEgbGluZSBvZiAxNmIgKi8KKwkJVlBSSU5USygiUENJIGNvbmZpZyBzcGFjZTpcbiIpOworCQlmb3IgKGIgPSAwOyBiIDwgMHg0MDsgKSB7CisJCQlmb3IgKHcgPSAwOyB3IDwgNDsgdysrKSB7CisJCQkJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LGIsJmR3W3ddKTsKKwkJCQliICs9IHNpemVvZigqZHcpOworCQkJfQorCQkJVlBSSU5USygiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCQlkd1swXSxkd1sxXSxkd1syXSxkd1szXSk7CisJCX0KKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKKyBlcnJfb3V0X2hwcml2OgorCWtmcmVlKGhwcml2KTsKKyBlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcChtbWlvX2Jhc2UpOworIGVycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKKyBlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyBlcnJfb3V0OgorCWlmICghcGNpX2Rldl9idXN5KSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG12X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZtdl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG12X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm12X3BjaV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJCcmV0dCBSdXNzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgbG93LWxldmVsIGRyaXZlciBmb3IgTWFydmVsbCBTQVRBIGNvbnRyb2xsZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbXZfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KG12X2luaXQpOworbW9kdWxlX2V4aXQobXZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jIGIvZHJpdmVycy9zY3NpL3NhdGFfcXN0b3IuYwppbmRleCAwMjljMjQ4Li5mZmNkZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCXFzX2VudGVyX3JlZ19tb2RlKGFwKTsKLQlwcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpwcCksIEdGUF9LRVJORUwpOworCXBwID0ga3phbGxvYyhzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKaW5kZXggNDNhZjQ0NS4uYTYzZjkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKQEAgLTUyLDcgKzUyLDEwIEBACiAJLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCiAJU0lTX0dFTkNUTAkJPSAweDU0LCAvKiBJREUgR2VuZXJhbCBDb250cm9sIHJlZ2lzdGVyICovCiAJU0lTX1NDUl9CQVNFCQk9IDB4YzAsIC8qIHNhdGEwIHBoeSBTQ1IgcmVnaXN0ZXJzICovCi0JU0lTX1NBVEExX09GUwkJPSAweDEwLCAvKiBvZmZzZXQgZnJvbSBzYXRhMC0+c2F0YTEgcGh5IHJlZ3MgKi8KKwlTSVMxODBfU0FUQTFfT0ZTCT0gMHgxMCwgLyogb2Zmc2V0IGZyb20gc2F0YTAtPnNhdGExIHBoeSByZWdzICovCisJU0lTMTgyX1NBVEExX09GUwk9IDB4MjAsIC8qIG9mZnNldCBmcm9tIHNhdGEwLT5zYXRhMSBwaHkgcmVncyAqLworCVNJU19QTVIJCQk9IDB4OTAsIC8qIHBvcnQgbWFwcGluZyByZWdpc3RlciAqLworCVNJU19QTVJfQ09NQklORUQJPSAweDMwLAogCiAJLyogcmFuZG9tIGJpdHMgKi8KIAlTSVNfRkxBR19DRkdTQ1IJCT0gKDEgPDwgMzApLCAvKiBob3N0IGZsYWc6IFNDUnMgdmlhIFBDSSBjZmcgKi8KQEAgLTY3LDYgKzcwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXNfcGNpX3RibFtdID0gewogCXsgUENJX1ZFTkRPUl9JRF9TSSwgMHgxODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpc18xODAgfSwKIAl7IFBDSV9WRU5ET1JfSURfU0ksIDB4MTgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaXNfMTgwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NJLCAweDE4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lzXzE4MCB9LAogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIApAQCAtMTM5LDY3ICsxNDMsOTUgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaXNfcGNpX3RibCk7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3Njcl9jZmdfYWRkcih1bnNpZ25lZCBpbnQgcG9ydF9ubywgdW5zaWduZWQgaW50IHNjX3JlZykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3Njcl9jZmdfYWRkcih1bnNpZ25lZCBpbnQgcG9ydF9ubywgdW5zaWduZWQgaW50IHNjX3JlZywgaW50IGRldmljZSkKIHsKIAl1bnNpZ25lZCBpbnQgYWRkciA9IFNJU19TQ1JfQkFTRSArICg0ICogc2NfcmVnKTsKIAotCWlmIChwb3J0X25vKQotCQlhZGRyICs9IFNJU19TQVRBMV9PRlM7CisJaWYgKHBvcnRfbm8pICB7CisJCWlmIChkZXZpY2UgPT0gMHgxODIpCisJCQlhZGRyICs9IFNJUzE4Ml9TQVRBMV9PRlM7CisJCWVsc2UKKwkJCWFkZHIgKz0gU0lTMTgwX1NBVEExX09GUzsKKwl9CisKIAlyZXR1cm4gYWRkcjsKIH0KIAogc3RhdGljIHUzMiBzaXNfc2NyX2NmZ19yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7Ci0JdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcC0+cG9ydF9ubywgc2NfcmVnKTsKLQl1MzIgdmFsOworCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAtPnBvcnRfbm8sIHNjX3JlZywgcGRldi0+ZGV2aWNlKTsKKwl1MzIgdmFsLCB2YWwyOworCXU4IHBtcjsKIAogCWlmIChzY19yZWcgPT0gU0NSX0VSUk9SKSAvKiBkb2Vzbid0IGV4aXN0IGluIFBDSSBjZmcgc3BhY2UgKi8KIAkJcmV0dXJuIDB4ZmZmZmZmZmY7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKKwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkciwgJnZhbCk7Ci0JcmV0dXJuIHZhbDsKKworCWlmICgocGRldi0+ZGV2aWNlID09IDB4MTgyKSB8fCAocG1yICYgU0lTX1BNUl9DT01CSU5FRCkpCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjZmdfYWRkcisweDEwLCAmdmFsMik7CisKKwlyZXR1cm4gdmFsfHZhbDI7CiB9CiAKIHN0YXRpYyB2b2lkIHNpc19zY3JfY2ZnX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NyLCB1MzIgdmFsKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7Ci0JdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcC0+cG9ydF9ubywgc2NyKTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLT5wb3J0X25vLCBzY3IsIHBkZXYtPmRldmljZSk7CisJdTggcG1yOwogCiAJaWYgKHNjciA9PSBTQ1JfRVJST1IpIC8qIGRvZXNuJ3QgZXhpc3QgaW4gUENJIGNmZyBzcGFjZSAqLwogCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKKwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgY2ZnX2FkZHIsIHZhbCk7CisKKwlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyKzB4MTAsIHZhbCk7CiB9CiAKIHN0YXRpYyB1MzIgc2lzX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdTMyIHZhbCwgdmFsMiA9IDA7CisJdTggcG1yOworCiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gMHhmZmZmZmZmZlU7CiAKIAlpZiAoYXAtPmZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKQogCQlyZXR1cm4gc2lzX3Njcl9jZmdfcmVhZChhcCwgc2NfcmVnKTsKLQlyZXR1cm4gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU0lTX1BNUiwgJnBtcik7CisKKwl2YWwgPSBpbmwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisKKwlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQorCQl2YWwyID0gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkgKyAweDEwKTsKKworCXJldHVybiB2YWwgfCB2YWwyOwogfQogCiBzdGF0aWMgdm9pZCBzaXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdTggcG1yOworCiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm47CiAKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKKwogCWlmIChhcC0+ZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpCiAJCXNpc19zY3JfY2ZnX3dyaXRlKGFwLCBzY19yZWcsIHZhbCk7Ci0JZWxzZQorCWVsc2UgewogCQlvdXRsKHZhbCwgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Ci19Ci0KLS8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCi1zdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JdTE2IHBjaV9jb21tYW5kOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7Ci0JaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7Ci0JCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCQlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQorCQkJb3V0bCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkrMHgxMCk7CiAJfQogfQogCkBAIC0yMTAsNiArMjQyLDggQEAKIAl1MzIgZ2VuY3RsOwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGk7CiAJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJdTggcG1yOworCXU4IHBvcnQyX3N0YXJ0OwogCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCkBAIC0yNTEsMTUgKzI4NSwzMSBAQAogCQlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgfD0gU0lTX0ZMQUdfQ0ZHU0NSOwogCX0KIAorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNJU19QTVIsICZwbXIpOworCWlmIChlbnQtPmRldmljZSAhPSAweDE4MikgeworCQlpZiAoKHBtciAmIFNJU19QTVJfQ09NQklORUQpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInNhdGFfc2lzOiBEZXRlY3RlZCBTaVMgMTgwLzE4MSBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CisJCQlwb3J0Ml9zdGFydD0weDY0OworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2F0YV9zaXM6IERldGVjdGVkIFNpUyAxODAvMTgxIGNoaXBzZXQgaW4gY29tYmluZWQgbW9kZVxuIik7CisJCQlwb3J0Ml9zdGFydD0wOworCQl9CisJfQorCWVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJzYXRhX3NpczogRGV0ZWN0ZWQgU2lTIDE4MiBjaGlwc2V0XG4iKTsKKwkJcG9ydDJfc3RhcnQgPSAweDIwOworCX0KKwogCWlmICghKHByb2JlX2VudC0+aG9zdF9mbGFncyAmIFNJU19GTEFHX0NGR1NDUikpIHsKIAkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0KIAkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpOwogCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPQotCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNJU19TQ1JfUENJX0JBUikgKyA2NDsKKwkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpICsgcG9ydDJfc3RhcnQ7CiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX2VuYWJsZV9pbnR4KHBkZXYpOworCXBjaV9pbnR4KHBkZXYsIDEpOwogCiAJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLwogCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV91bGkuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCmluZGV4IDE1NjY4ODYuLjRjOWZiOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCkBAIC0xMjUsOCArMTI1LDggQEAKIAkuc2h0ICAgICAgICAgICAgPSAmdWxpX3NodCwKIAkuaG9zdF9mbGFncyAgICAgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8CiAJCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKLQkucGlvX21hc2sgICAgICAgPSAweDAzLAkJLy9zdXBwb3J0IHBpbyBtb2RlIDQgKEZJWE1FKQotCS51ZG1hX21hc2sgICAgICA9IDB4N2YsCQkvL3N1cHBvcnQgdWRtYSBtb2RlIDYKKwkucGlvX21hc2sgICAgICAgPSAweDFmLAkJLyogcGlvMC00ICovCisJLnVkbWFfbWFzayAgICAgID0gMHg3ZiwJCS8qIHVkbWEwLTYgKi8KIAkucG9ydF9vcHMgICAgICAgPSAmdWxpX29wcywKIH07CiAKQEAgLTE3NiwxOCArMTc2LDYgQEAKIAl1bGlfc2NyX2NmZ193cml0ZShhcCwgc2NfcmVnLCB2YWwpOwogfQogCi0vKiBtb3ZlIHRvIFBDSSBsYXllciwgaW50ZWdyYXRlIHcvIE1TSSBzdHVmZiAqLwotc3RhdGljIHZvaWQgcGNpX2VuYWJsZV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXUxNiBwY2lfY29tbWFuZDsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOwotCWlmIChwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkgewotCQlwY2lfY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdWxpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwpAQCAtMjYwLDcgKzI0OCw3IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX2VuYWJsZV9pbnR4KHBkZXYpOworCXBjaV9pbnR4KHBkZXYsIDEpOwogCiAJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLwogCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2kuYwppbmRleCBkMTQ1MjNkLi5hNzgwNTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKQEAgLTI2OCw2ICsyNjgsNyBAQAogCX0gZWxzZQogCQlwdXRfZGV2aWNlKCZkZXYtPnNkZXZfZ2VuZGV2KTsKIAorCWNtZC0+amlmZmllc19hdF9hbGxvYyA9IGppZmZpZXM7CiAJcmV0dXJuIGNtZDsKIH0JCQkJCiBFWFBPUlRfU1lNQk9MKHNjc2lfZ2V0X2NvbW1hbmQpOwpAQCAtNjI3LDcgKzYyOCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJc2NzaV9jbWRfZ2V0X3NlcmlhbChob3N0LCBjbWQpOyAKIAotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChTSE9TVF9DQU5DRUwsICZob3N0LT5zaG9zdF9zdGF0ZSkpKSB7CisJaWYgKHVubGlrZWx5KGhvc3QtPnNob3N0X3N0YXRlID09IFNIT1NUX0RFTCkpIHsKIAkJY21kLT5yZXN1bHQgPSAoRElEX05PX0NPTk5FQ1QgPDwgMTYpOwogCQlzY3NpX2RvbmUoY21kKTsKIAl9IGVsc2UgewpAQCAtNzk4LDkgKzc5OSwyMyBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmbG9jYWxfcSkpIHsKIAkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gbGlzdF9lbnRyeShsb2NhbF9xLm5leHQsCiAJCQkJCQkgICBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCS8qIFRoZSBsb25nZXN0IHRpbWUgYW55IGNvbW1hbmQgc2hvdWxkIGJlIG91dHN0YW5kaW5nIGlzIHRoZQorCQkgKiBwZXIgY29tbWFuZCB0aW1lb3V0IG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiByZXRyaWVzLgorCQkgKgorCQkgKiBGb3IgYSB0eXBpY2FsIGNvbW1hbmQsIHRoaXMgaXMgMi41IG1pbnV0ZXMgKi8KKwkJdW5zaWduZWQgbG9uZyB3YWl0X2ZvciAKKwkJCT0gY21kLT5hbGxvd2VkICogY21kLT50aW1lb3V0X3Blcl9jb21tYW5kOwogCQlsaXN0X2RlbF9pbml0KCZjbWQtPmVoX2VudHJ5KTsKIAogCQlkaXNwb3NpdGlvbiA9IHNjc2lfZGVjaWRlX2Rpc3Bvc2l0aW9uKGNtZCk7CisJCWlmIChkaXNwb3NpdGlvbiAhPSBTVUNDRVNTICYmCisJCSAgICB0aW1lX2JlZm9yZShjbWQtPmppZmZpZXNfYXRfYWxsb2MgKyB3YWl0X2ZvciwgamlmZmllcykpIHsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYsIAorCQkJCSAgICJ0aW1pbmcgb3V0IGNvbW1hbmQsIHdhaXRlZCAlbHVzXG4iLAorCQkJCSAgIHdhaXRfZm9yL0haKTsKKwkJCWRpc3Bvc2l0aW9uID0gU1VDQ0VTUzsKKwkJfQorCQkJCiAJCXNjc2lfbG9nX2NvbXBsZXRpb24oY21kLCBkaXNwb3NpdGlvbik7CiAJCXN3aXRjaCAoZGlzcG9zaXRpb24pIHsKIAkJY2FzZSBTVUNDRVNTOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCmluZGV4IDYxMjFkYzEuLjA3YjU1NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKQEAgLTExNCw2ICsxMTQsNyBAQAogCXsiWUFNQUhBIiwgIkNEUjEwMiIsICIxLjAwIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLwogCXsiWUFNQUhBIiwgIkNSVzg0MjRTIiwgIjEuMCIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KIAl7IllBTUFIQSIsICJDUlc2NDE2UyIsICIxLjBjIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiIiwgIlNjYW5uZXIiLCAiMS44MCIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLwogCiAJLyoKIAkgKiBPdGhlciB0eXBlcyBvZiBkZXZpY2VzIHRoYXQgaGF2ZSBzcGVjaWFsIGZsYWdzLgpAQCAtMTM1LDcgKzEzNiw3IEBACiAJeyJDT01QQVEiLCAiTVNBMTAwMCBWT0xVTUUiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9OT1NUQVJUT05BRER9LAogCXsiQ09NUEFRIiwgIkhTVjExMCIsIE5VTEwsIEJMSVNUX1JFUE9SVExVTjIgfCBCTElTVF9OT1NUQVJUT05BRER9LAogCXsiREROIiwgIlNBTiBEYXRhRGlyZWN0b3IiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCi0JeyJERUMiLCAiSFNHODAiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9OT1NUQVJUT05BRER9LAorCXsiREVDIiwgIkhTRzgwIiwgTlVMTCwgQkxJU1RfUkVQT1JUTFVOMiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCiAJeyJERUxMIiwgIlBWNjYwRiIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCiAJeyJERUxMIiwgIlBWNjYwRiAgIFBTRVVETyIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCiAJeyJERUxMIiwgIlBTRVVETyBERVZJQ0UgLiIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCS8qIERlbGwgUFYgNTMwRiAqLwpAQCAtMTkxLDYgKzE5Miw3IEBACiAJeyJTR0kiLCAiUkFJRDUiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCiAJeyJTR0kiLCAiVFA5MTAwIiwgIioiLCBCTElTVF9SRVBPUlRMVU4yfSwKIAl7IlNHSSIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAorCXsiSUJNIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCiAJeyJTTVNDIiwgIlVTQiAyIEhTLUNGIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCiAJeyJTT05ZIiwgIkNELVJPTSBDRFUtODAwMSIsIE5VTEwsIEJMSVNUX0JPUktFTn0sCiAJeyJTT05ZIiwgIlRTTCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwJCS8qIEREUzMgJiBERFM0IGF1dG9sb2FkZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwppbmRleCAwZmM4YjQ4Li44OTVjOTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC03NSw3ICs3Niw3IEBACiAKIAlzY21kLT5laF9lZmxhZ3MgfD0gZWhfZmxhZzsKIAlsaXN0X2FkZF90YWlsKCZzY21kLT5laF9lbnRyeSwgJnNob3N0LT5laF9jbWRfcSk7Ci0Jc2V0X2JpdChTSE9TVF9SRUNPVkVSWSwgJnNob3N0LT5zaG9zdF9zdGF0ZSk7CisJc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgU0hPU1RfUkVDT1ZFUlkpOwogCXNob3N0LT5ob3N0X2ZhaWxlZCsrOwogCXNjc2lfZWhfd2FrZXVwKHNob3N0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKQEAgLTExNSw3ICsxMTYsNiBAQAogCiAJYWRkX3RpbWVyKCZzY21kLT5laF90aW1lb3V0KTsKIH0KLUVYUE9SVF9TWU1CT0woc2NzaV9hZGRfdGltZXIpOwogCiAvKioKICAqIHNjc2lfZGVsZXRlX3RpbWVyIC0gRGVsZXRlL2NhbmNlbCB0aW1lciBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KQEAgLTE0Myw3ICsxNDMsNiBAQAogCiAJcmV0dXJuIHJ0bjsKIH0KLUVYUE9SVF9TWU1CT0woc2NzaV9kZWxldGVfdGltZXIpOwogCiAvKioKICAqIHNjc2lfdGltZXNfb3V0IC0gVGltZW91dCBmdW5jdGlvbiBmb3Igbm9ybWFsIHNjc2kgY29tbWFuZHMuCkBAIC0xOTcsNyArMTk2LDggQEAKIHsKIAlpbnQgb25saW5lOwogCi0Jd2FpdF9ldmVudChzZGV2LT5ob3N0LT5ob3N0X3dhaXQsICghdGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksICZzZGV2LT5ob3N0LT5zaG9zdF9zdGF0ZSkpKTsKKwl3YWl0X2V2ZW50KHNkZXYtPmhvc3QtPmhvc3Rfd2FpdCwgKHNkZXYtPmhvc3QtPnNob3N0X3N0YXRlICE9CisJCQkJCSAgIFNIT1NUX1JFQ09WRVJZKSk7CiAKIAlvbmxpbmUgPSBzY3NpX2RldmljZV9vbmxpbmUoc2Rldik7CiAKQEAgLTc3NSw5ICs3NzUsMTEgQEAKIAkJX19GVU5DVElPTl9fLCBzY21kLCBydG4pKTsKIAlpZiAocnRuID09IFNVQ0NFU1MpCiAJCXJldHVybiAwOwotCWVsc2UgaWYgKHJ0biA9PSBORUVEU19SRVRSWSkKKwllbHNlIGlmIChydG4gPT0gTkVFRFNfUkVUUlkpIHsKIAkJaWYgKHJldHJ5X2NudC0tKQogCQkJZ290byByZXRyeV90dXI7CisJCXJldHVybiAwOworCX0KIAlyZXR1cm4gMTsKIH0KIApAQCAtMTQ1OCw3ICsxNDYwLDcgQEAKIAlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiB3YWtpbmcgdXAgaG9zdCB0byByZXN0YXJ0XG4iLAogCQkJCQkgIF9fRlVOQ1RJT05fXykpOwogCi0JY2xlYXJfYml0KFNIT1NUX1JFQ09WRVJZLCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKwlzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9SVU5OSU5HKTsKIAogCXdha2VfdXAoJnNob3N0LT5ob3N0X3dhaXQpOwogCkBAIC0xNTgyLDE2ICsxNTg0LDggQEAKIAlpbnQgcnRuOwogCURFQ0xBUkVfTVVURVhfTE9DS0VEKHNlbSk7CiAKLQkvKgotCSAqICAgIEZsdXNoIHJlc291cmNlcwotCSAqLwotCi0JZGFlbW9uaXplKCJzY3NpX2VoXyVkIiwgc2hvc3QtPmhvc3Rfbm8pOwotCiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAlzaG9zdC0+ZWhfd2FpdCA9ICZzZW07Ci0Jc2hvc3QtPmVoYW5kbGVyID0gY3VycmVudDsKIAogCS8qCiAJICogV2FrZSB1cCB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB1cy4KQEAgLTE1OTksOCArMTU5Myw2IEBACiAJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCJXYWtlIHVwIHBhcmVudCBvZiIKIAkJCQkJICAiIHNjc2lfZWhfJWRcbiIsc2hvc3QtPmhvc3Rfbm8pKTsKIAotCWNvbXBsZXRlKHNob3N0LT5laF9ub3RpZnkpOwotCiAJd2hpbGUgKDEpIHsKIAkJLyoKIAkJICogSWYgd2UgZ2V0IGEgc2lnbmFsLCBpdCBtZWFucyB3ZSBhcmUgc3VwcG9zZWQgdG8gZ28KQEAgLTE2MjEsNyArMTYxMyw3IEBACiAJCSAqIHNlbWFwaG9yZXMgaXNuJ3QgdW5yZWFzb25hYmxlLgogCQkgKi8KIAkJZG93bl9pbnRlcnJ1cHRpYmxlKCZzZW0pOwotCQlpZiAoc2hvc3QtPmVoX2tpbGwpCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAogCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgxLCBwcmludGsoIkVycm9yIGhhbmRsZXIiCkBAIC0xNjYwLDIyICsxNjUyLDYgQEAKIAkgKiBNYWtlIHN1cmUgdGhhdCBub2JvZHkgdHJpZXMgdG8gd2FrZSB1cyB1cCBhZ2Fpbi4KIAkgKi8KIAlzaG9zdC0+ZWhfd2FpdCA9IE5VTEw7Ci0KLQkvKgotCSAqIEtub2NrIHRoaXMgZG93biB0b28uICBGcm9tIHRoaXMgcG9pbnQgb24sIHRoZSBob3N0IGlzIGZseWluZwotCSAqIHdpdGhvdXQgYSBwaWxvdC4gIElmIHRoaXMgaXMgYmVjYXVzZSB0aGUgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLAotCSAqIHRoYXQncyBmaW5lLiAgSWYgdGhlIHVzZXIgc2VudCBhIHNpZ25hbCB0byB0aGlzIHRoaW5nLCB3ZSBhcmUKLQkgKiBwb3RlbnRpYWxseSBpbiByZWFsIGRhbmdlci4KLQkgKi8KLQlzaG9zdC0+ZWhfYWN0aXZlID0gMDsKLQlzaG9zdC0+ZWhhbmRsZXIgPSBOVUxMOwotCi0JLyoKLQkgKiBJZiBhbnlvbmUgaXMgd2FpdGluZyBmb3IgdXMgdG8gZXhpdCAoaS5lLiBzb21lb25lIHRyeWluZyB0byB1bmxvYWQKLQkgKiBhIGRyaXZlciksIHRoZW4gd2FrZSB1cCB0aGF0IHByb2Nlc3MgdG8gbGV0IHRoZW0ga25vdyB3ZSBhcmUgb24KLQkgKiB0aGUgd2F5IG91dCB0aGUgZG9vci4KLQkgKi8KLQljb21wbGV0ZV9hbmRfZXhpdChzaG9zdC0+ZWhfbm90aWZ5LCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg0NiwxMiArMTgyMiwxNiBAQAogaW50IHNjc2lfbm9ybWFsaXplX3NlbnNlKGNvbnN0IHU4ICpzZW5zZV9idWZmZXIsIGludCBzYl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKIHsKLQlpZiAoIXNlbnNlX2J1ZmZlciB8fCAhc2JfbGVuIHx8IChzZW5zZV9idWZmZXJbMF0gJiAweDcwKSAhPSAweDcwKQorCWlmICghc2Vuc2VfYnVmZmVyIHx8ICFzYl9sZW4pCiAJCXJldHVybiAwOwogCiAJbWVtc2V0KHNzaGRyLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfc2Vuc2VfaGRyKSk7CiAKIAlzc2hkci0+cmVzcG9uc2VfY29kZSA9IChzZW5zZV9idWZmZXJbMF0gJiAweDdmKTsKKworCWlmICghc2NzaV9zZW5zZV92YWxpZChzc2hkcikpCisJCXJldHVybiAwOworCiAJaWYgKHNzaGRyLT5yZXNwb25zZV9jb2RlID49IDB4NzIpIHsKIAkJLyoKIAkJICogZGVzY3JpcHRvciBmb3JtYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCmluZGV4IDdhNmI1MzAuLmI3ZmRkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYwpAQCAtMzAsMjAgKzMwLDIwIEBACiAKICNkZWZpbmUgTUFYX0JVRiBQQUdFX1NJWkUKIAotLyoKLSAqIElmIHdlIGFyZSB0b2xkIHRvIHByb2JlIGEgaG9zdCwgd2Ugd2lsbCByZXR1cm4gMCBpZiAgdGhlIGhvc3QgaXMgbm90Ci0gKiBwcmVzZW50LCAxIGlmIHRoZSBob3N0IGlzIHByZXNlbnQsIGFuZCB3aWxsIHJldHVybiBhbiBpZGVudGlmeWluZwotICogc3RyaW5nIGF0ICphcmcsIGlmIGFyZyBpcyBub24gbnVsbCwgZmlsbGluZyB0byB0aGUgbGVuZ3RoIHN0b3JlZCBhdAotICogKGludCAqKSBhcmcKKy8qKgorICogaW9jdGxfcHJvYmUgIC0tICByZXR1cm4gaG9zdCBpZGVudGlmaWNhdGlvbgorICogQGhvc3Q6CWhvc3QgdG8gaWRlbnRpZnkKKyAqIEBidWZmZXI6CXVzZXJzcGFjZSBidWZmZXIgZm9yIGlkZW50aWZpY2F0aW9uCisgKgorICogUmV0dXJuIGFuIGlkZW50aWZ5aW5nIHN0cmluZyBhdCBAYnVmZmVyLCBpZiBAYnVmZmVyIGlzIG5vbi1OVUxMLCBmaWxsaW5nCisgKiB0byB0aGUgbGVuZ3RoIHN0b3JlZCBhdCAqIChpbnQgKikgQGJ1ZmZlci4KICAqLwotCiBzdGF0aWMgaW50IGlvY3RsX3Byb2JlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHZvaWQgX191c2VyICpidWZmZXIpCiB7CiAJdW5zaWduZWQgaW50IGxlbiwgc2xlbjsKIAljb25zdCBjaGFyICpzdHJpbmc7Ci0JaW50IHRlbXAgPSBob3N0LT5ob3N0dC0+cHJlc2VudDsKIAotCWlmICh0ZW1wICYmIGJ1ZmZlcikgeworCWlmIChidWZmZXIpIHsKIAkJaWYgKGdldF91c2VyKGxlbiwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYnVmZmVyKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCkBAIC01OSw3ICs1OSw3IEBACiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAl9Ci0JcmV0dXJuIHRlbXA7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC04OCwyNSArODgsMTggQEAKIHN0YXRpYyBpbnQgaW9jdGxfaW50ZXJuYWxfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNoYXIgKmNtZCwKIAkJCQkgIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKIHsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOwogCWludCByZXN1bHQ7CiAJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCiAJU0NTSV9MT0dfSU9DVEwoMSwgcHJpbnRrKCJUcnlpbmcgaW9jdGwgd2l0aCBzY3NpIGNvbW1hbmQgJWRcbiIsICpjbWQpKTsKIAotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcmVxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNDU0kgaW50ZXJuYWwgaW9jdGwgZmFpbGVkLCBubyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAorCQkJCSAgJnNzaGRyLCB0aW1lb3V0LCByZXRyaWVzKTsKIAotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0gICAgICAgIHNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBOVUxMLCAwLCB0aW1lb3V0LCByZXRyaWVzKTsKKwlTQ1NJX0xPR19JT0NUTCgyLCBwcmludGsoIklvY3RsIHJldHVybmVkICAweCV4XG4iLCByZXN1bHQpKTsKIAotCVNDU0lfTE9HX0lPQ1RMKDIsIHByaW50aygiSW9jdGwgcmV0dXJuZWQgIDB4JXhcbiIsIHNyZXEtPnNyX3Jlc3VsdCkpOwotCi0JaWYgKChkcml2ZXJfYnl0ZShzcmVxLT5zcl9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSAmJgotCSAgICAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpKSkgeworCWlmICgoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKKwkgICAgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKSkpIHsKIAkJc3dpdGNoIChzc2hkci5zZW5zZV9rZXkpIHsKIAkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CiAJCQlpZiAoY21kWzBdID09IEFMTE9XX01FRElVTV9SRU1PVkFMKQpAQCAtMTI1LDcgKzExOCw3IEBACiAJCWNhc2UgVU5JVF9BVFRFTlRJT046CiAJCQlpZiAoc2Rldi0+cmVtb3ZhYmxlKSB7CiAJCQkJc2Rldi0+Y2hhbmdlZCA9IDE7Ci0JCQkJc3JlcS0+c3JfcmVzdWx0ID0gMDsJLyogVGhpcyBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhbiBlcnJvciAqLworCQkJCXJlc3VsdCA9IDA7CS8qIFRoaXMgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYW4gZXJyb3IgKi8KIAkJCQlicmVhazsKIAkJCX0KIAkJZGVmYXVsdDoJLyogRmFsbCB0aHJvdWdoIGZvciBub24tcmVtb3ZhYmxlIG1lZGlhICovCkBAIC0xMzUsMTUgKzEyOCwxMyBAQAogCQkJICAgICAgIHNkZXYtPmNoYW5uZWwsCiAJCQkgICAgICAgc2Rldi0+aWQsCiAJCQkgICAgICAgc2Rldi0+bHVuLAotCQkJICAgICAgIHNyZXEtPnNyX3Jlc3VsdCk7Ci0JCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgiICAgIiwgc3JlcSk7CisJCQkgICAgICAgcmVzdWx0KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCIgICAiLCAmc3NoZHIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlyZXN1bHQgPSBzcmVxLT5zcl9yZXN1bHQ7CiAJU0NTSV9MT0dfSU9DVEwoMiwgcHJpbnRrKCJJT0NUTCBSZWxlYXNpbmcgY29tbWFuZFxuIikpOwotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIwOCw4ICsxOTksOCBAQAogewogCWNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07CiAJY2hhciBfX3VzZXIgKmNtZF9pbjsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOwogCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOwogCXVuc2lnbmVkIGludCBpbmxlbiwgb3V0bGVuLCBjbWRsZW47CiAJdW5zaWduZWQgaW50IG5lZWRlZCwgYnVmX25lZWRlZDsKQEAgLTMyMSwzMSArMzEyLDIzIEBACiAJCWJyZWFrOwogCX0KIAotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgIGlmICghc3JlcSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5UUjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IGRhdGFfZGlyZWN0aW9uOwotICAgICAgICBzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgYnVmLCBuZWVkZWQsIHRpbWVvdXQsIHJldHJpZXMpOworCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZShzZGV2LCBjbWQsIGRhdGFfZGlyZWN0aW9uLCBidWYsIG5lZWRlZCwKKwkJCSAgICAgIHNlbnNlLCB0aW1lb3V0LCByZXRyaWVzLCAwKTsKIAogCS8qIAogCSAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciBjb25kaXRpb24sIHBhc3MgdGhlIGluZm8gYmFjayB0byB0aGUgdXNlci4gCiAJICovCi0JcmVzdWx0ID0gc3JlcS0+c3JfcmVzdWx0OwogCWlmIChyZXN1bHQpIHsKLQkJaW50IHNiX2xlbiA9IHNpemVvZihzcmVxLT5zcl9zZW5zZV9idWZmZXIpOworCQlpbnQgc2JfbGVuID0gc2l6ZW9mKCpzZW5zZSk7CiAKIAkJc2JfbGVuID0gKHNiX2xlbiA+IE9NQVhfU0JfTEVOKSA/IE9NQVhfU0JfTEVOIDogc2JfbGVuOwotCQlpZiAoY29weV90b191c2VyKGNtZF9pbiwgc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyLCBzYl9sZW4pKQorCQlpZiAoY29weV90b191c2VyKGNtZF9pbiwgc2Vuc2UsIHNiX2xlbikpCiAJCQlyZXN1bHQgPSAtRUZBVUxUOwogCX0gZWxzZSB7CiAJCWlmIChjb3B5X3RvX3VzZXIoY21kX2luLCBidWYsIG91dGxlbikpCiAJCQlyZXN1bHQgPSAtRUZBVUxUOwogCX0JCiAKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKIGVycm9yOgogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTQ3NSw4ICs0NTgsNyBAQAogCSAqIGVycm9yIHByb2Nlc3NpbmcsIGFzIGxvbmcgYXMgdGhlIGRldmljZSB3YXMgb3BlbmVkCiAJICogbm9uLWJsb2NraW5nICovCiAJaWYgKGZpbHAgJiYgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJaWYgKHRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLAotCQkJICAgICAmc2Rldi0+aG9zdC0+c2hvc3Rfc3RhdGUpKQorCQlpZiAoc2Rldi0+aG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUkVDT1ZFUlkpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UgaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RldikpCiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCA3YTkxY2EzLi43N2YyZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtMjMyLDIzICsyMzIsNiBAQAogfQogRVhQT1JUX1NZTUJPTChzY3NpX2RvX3JlcSk7CiAKLXN0YXRpYyB2b2lkIHNjc2lfd2FpdF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLQlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gY21kLT5yZXF1ZXN0OwotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gY21kLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlcS0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOwkvKiBCdXN5LCBidXQgaW5kaWNhdGUgcmVxdWVzdCBkb25lICovCi0KLQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGJsa19ycV90YWdnZWQocmVxKSkKLQkJYmxrX3F1ZXVlX2VuZF90YWcocSwgcmVxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmIChyZXEtPndhaXRpbmcpCi0JCWNvbXBsZXRlKHJlcS0+d2FpdGluZyk7Ci19Ci0KIC8qIFRoaXMgaXMgdGhlIGVuZCByb3V0aW5lIHdlIGdldCB0byBpZiBhIGNvbW1hbmQgd2FzIG5ldmVyIGF0dGFjaGVkCiAgKiB0byB0aGUgcmVxdWVzdC4gIFNpbXBseSBjb21wbGV0ZSB0aGUgcmVxdWVzdCB3aXRob3V0IGNoYW5naW5nCiAgKiBycV9zdGF0dXM7IHRoaXMgd2lsbCBjYXVzZSBhIERSSVZFUl9FUlJPUi4gKi8KQEAgLTI2MywyMSArMjQ2LDExNCBAQAogCQkgICB1bnNpZ25lZCBidWZmbGVuLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCiB7CiAJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOwotCQotCXNyZXEtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSAmd2FpdDsKLQlzcmVxLT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7Ci0Jc3JlcS0+c3JfcmVxdWVzdC0+ZW5kX2lvID0gc2NzaV93YWl0X3JlcV9lbmRfaW87Ci0Jc2NzaV9kb19yZXEoc3JlcSwgY21uZCwgYnVmZmVyLCBidWZmbGVuLCBzY3NpX3dhaXRfZG9uZSwKLQkJCXRpbWVvdXQsIHJldHJpZXMpOworCWludCB3cml0ZSA9IChzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJcmVxID0gYmxrX2dldF9yZXF1ZXN0KHNyZXEtPnNyX2RldmljZS0+cmVxdWVzdF9xdWV1ZSwgd3JpdGUsCisJCQkgICAgICBfX0dGUF9XQUlUKTsKKwlpZiAoYnVmZmxlbiAmJiBibGtfcnFfbWFwX2tlcm4oc3JlcS0+c3JfZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLCByZXEsCisJCQkJICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgX19HRlBfV0FJVCkpIHsKKwkJc3JlcS0+c3JfcmVzdWx0ID0gRFJJVkVSX0VSUk9SIDw8IDI0OworCQlibGtfcHV0X3JlcXVlc3QocmVxKTsKKwkJcmV0dXJuOworCX0KKworCXJlcS0+ZmxhZ3MgfD0gUkVRX05PTUVSR0U7CisJcmVxLT53YWl0aW5nID0gJndhaXQ7CisJcmVxLT5lbmRfaW8gPSBzY3NpX3dhaXRfcmVxX2VuZF9pbzsKKwlyZXEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoKCh1OCAqKWNtbmQpWzBdKTsKKwlyZXEtPnNlbnNlID0gc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyOworCXJlcS0+c2Vuc2VfbGVuID0gMDsKKwltZW1jcHkocmVxLT5jbWQsIGNtbmQsIHJlcS0+Y21kX2xlbik7CisJcmVxLT50aW1lb3V0ID0gdGltZW91dDsKKwlyZXEtPmZsYWdzIHw9IFJFUV9CTE9DS19QQzsKKwlyZXEtPnJxX2Rpc2sgPSBOVUxMOworCWJsa19pbnNlcnRfcmVxdWVzdChzcmVxLT5zcl9kZXZpY2UtPnJlcXVlc3RfcXVldWUsIHJlcSwKKwkJCSAgIHNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UsIE5VTEwpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCXNyZXEtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOwotCWlmIChzcmVxLT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgIT0gUlFfU0NTSV9ET05FKQorCXNyZXEtPnNyX3Jlc3VsdCA9IHJlcS0+ZXJyb3JzOworCWlmIChyZXEtPmVycm9ycykKIAkJc3JlcS0+c3JfcmVzdWx0IHw9IChEUklWRVJfRVJST1IgPDwgMjQpOwogCi0JX19zY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKwlibGtfcHV0X3JlcXVlc3QocmVxKTsKIH0KKwogRVhQT1JUX1NZTUJPTChzY3NpX3dhaXRfcmVxKTsKIAorLyoqCisgKiBzY3NpX2V4ZWN1dGUgLSBpbnNlcnQgcmVxdWVzdCBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdAorICogQHNkZXY6CXNjc2kgZGV2aWNlCisgKiBAY21kOglzY3NpIGNvbW1hbmQKKyAqIEBkYXRhX2RpcmVjdGlvbjogZGF0YSBkaXJlY3Rpb24KKyAqIEBidWZmZXI6CWRhdGEgYnVmZmVyCisgKiBAYnVmZmxlbjoJbGVuIG9mIGJ1ZmZlcgorICogQHNlbnNlOglvcHRpb25hbCBzZW5zZSBidWZmZXIKKyAqIEB0aW1lb3V0OglyZXF1ZXN0IHRpbWVvdXQgaW4gc2Vjb25kcworICogQHJldHJpZXM6CW51bWJlciBvZiB0aW1lcyB0byByZXRyeSByZXF1ZXN0CisgKiBAZmxhZ3M6CW9yIGludG8gcmVxdWVzdCBmbGFnczsKKyAqCisgKiByZXR1cm5zIHRoZSByZXEtPmVycm9ycyB2YWx1ZSB3aGljaCBpcyB0aGUgdGhlIHNjc2lfY21uZCByZXN1bHQKKyAqIGZpZWxkLgorICoqLworaW50IHNjc2lfZXhlY3V0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJIGludCBkYXRhX2RpcmVjdGlvbiwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuLAorCQkgdW5zaWduZWQgY2hhciAqc2Vuc2UsIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywgaW50IGZsYWdzKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJaW50IHdyaXRlID0gKGRhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpOworCWludCByZXQgPSBEUklWRVJfRVJST1IgPDwgMjQ7CisKKwlyZXEgPSBibGtfZ2V0X3JlcXVlc3Qoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgd3JpdGUsIF9fR0ZQX1dBSVQpOworCisJaWYgKGJ1ZmZsZW4gJiYJYmxrX3JxX21hcF9rZXJuKHNkZXYtPnJlcXVlc3RfcXVldWUsIHJlcSwKKwkJCQkJYnVmZmVyLCBidWZmbGVuLCBfX0dGUF9XQUlUKSkKKwkJZ290byBvdXQ7CisKKwlyZXEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoY21kWzBdKTsKKwltZW1jcHkocmVxLT5jbWQsIGNtZCwgcmVxLT5jbWRfbGVuKTsKKwlyZXEtPnNlbnNlID0gc2Vuc2U7CisJcmVxLT5zZW5zZV9sZW4gPSAwOworCXJlcS0+dGltZW91dCA9IHRpbWVvdXQ7CisJcmVxLT5mbGFncyB8PSBmbGFncyB8IFJFUV9CTE9DS19QQyB8IFJFUV9TUEVDSUFMIHwgUkVRX1FVSUVUOworCisJLyoKKwkgKiBoZWFkIGluamVjdGlvbiAqcmVxdWlyZWQqIGhlcmUgb3RoZXJ3aXNlIHF1aWVzY2Ugd29uJ3Qgd29yaworCSAqLworCWJsa19leGVjdXRlX3JxKHJlcS0+cSwgTlVMTCwgcmVxLCAxKTsKKworCXJldCA9IHJlcS0+ZXJyb3JzOworIG91dDoKKwlibGtfcHV0X3JlcXVlc3QocmVxKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZXhlY3V0ZSk7CisKKworaW50IHNjc2lfZXhlY3V0ZV9yZXEoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsCisJCSAgICAgaW50IGRhdGFfZGlyZWN0aW9uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCisJCSAgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkciwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQoreworCWNoYXIgKnNlbnNlID0gTlVMTDsKKwlpbnQgcmVzdWx0OworCQorCWlmIChzc2hkcikgeworCQlzZW5zZSA9IGttYWxsb2MoU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZW5zZSkKKwkJCXJldHVybiBEUklWRVJfRVJST1IgPDwgMjQ7CisJCW1lbXNldChzZW5zZSwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwl9CisJcmVzdWx0ID0gc2NzaV9leGVjdXRlKHNkZXYsIGNtZCwgZGF0YV9kaXJlY3Rpb24sIGJ1ZmZlciwgYnVmZmxlbiwKKwkJCQkgIHNlbnNlLCB0aW1lb3V0LCByZXRyaWVzLCAwKTsKKwlpZiAoc3NoZHIpCisJCXNjc2lfbm9ybWFsaXplX3NlbnNlKHNlbnNlLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIHNzaGRyKTsKKworCWtmcmVlKHNlbnNlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2V4ZWN1dGVfcmVxKTsKKwogLyoKICAqIEZ1bmN0aW9uOiAgICBzY3NpX2luaXRfY21kX2VycmgoKQogICoKQEAgLTM0OCw3ICs0MjQsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCXNob3N0LT5ob3N0X2J1c3ktLTsKLQlpZiAodW5saWtlbHkodGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksICZzaG9zdC0+c2hvc3Rfc3RhdGUpICYmCisJaWYgKHVubGlrZWx5KChzaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUkVDT1ZFUlkpICYmCiAJCSAgICAgc2hvc3QtPmhvc3RfZmFpbGVkKSkKIAkJc2NzaV9laF93YWtldXAoc2hvc3QpOwogCXNwaW5fdW5sb2NrKHNob3N0LT5ob3N0X2xvY2spOwpAQCAtODUxLDE3ICs5MjcsMjAgQEAKIAkJCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8gIkRldmljZSAlcyBub3QgcmVhZHkuXG4iLAotCQkJICAgICAgIHJlcS0+cnFfZGlzayA/IHJlcS0+cnFfZGlzay0+ZGlza19uYW1lIDogIiIpOworCQkJaWYgKCEocmVxLT5mbGFncyAmIFJFUV9RVUlFVCkpCisJCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sCisJCQkJCSAgICZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYsCisJCQkJCSAgICJEZXZpY2Ugbm90IHJlYWR5LlxuIik7CiAJCQljbWQgPSBzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgMCwgdGhpc19jb3VudCwgMSk7CiAJCQlyZXR1cm47CiAJCWNhc2UgVk9MVU1FX09WRVJGTE9XOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVm9sdW1lIG92ZXJmbG93IDwlZCAlZCAlZCAlZD4gQ0RCOiAiLAotCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAotCQkJICAgICAgIChpbnQpY21kLT5kZXZpY2UtPmNoYW5uZWwsCi0JCQkgICAgICAgKGludCljbWQtPmRldmljZS0+aWQsIChpbnQpY21kLT5kZXZpY2UtPmx1bik7Ci0JCQlfX3Njc2lfcHJpbnRfY29tbWFuZChjbWQtPmRhdGFfY21uZCk7Ci0JCQlzY3NpX3ByaW50X3NlbnNlKCIiLCBjbWQpOworCQkJaWYgKCEocmVxLT5mbGFncyAmIFJFUV9RVUlFVCkpIHsKKwkJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywKKwkJCQkJICAgJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiwKKwkJCQkJICAgIlZvbHVtZSBvdmVyZmxvdywgQ0RCOiAiKTsKKwkJCQlfX3Njc2lfcHJpbnRfY29tbWFuZChjbWQtPmRhdGFfY21uZCk7CisJCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKKwkJCX0KIAkJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAwLCBibG9ja19ieXRlcywgMSk7CiAJCQlyZXR1cm47CiAJCWRlZmF1bHQ6CkBAIC04NzgsMTQgKzk1NywxMyBAQAogCQlyZXR1cm47CiAJfQogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiU0NTSSBlcnJvciA6IDwlZCAlZCAlZCAlZD4gcmV0dXJuIGNvZGUgIgotCQkgICAgICAgIj0gMHgleFxuIiwgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sCi0JCSAgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCwKLQkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwKLQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIHJlc3VsdCk7CisJCWlmICghKHJlcS0+ZmxhZ3MgJiBSRVFfUVVJRVQpKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiwKKwkJCQkgICAiU0NTSSBlcnJvcjogcmV0dXJuIGNvZGUgPSAweCV4XG4iLCByZXN1bHQpOwogCi0JCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKQotCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKKwkJCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKQorCQkJCXNjc2lfcHJpbnRfc2Vuc2UoIiIsIGNtZCk7CisJCX0KIAkJLyoKIAkJICogTWFyayBhIHNpbmdsZSBidWZmZXIgYXMgbm90IHVwdG9kYXRlLiAgUXVldWUgdGhlIHJlbWFpbmRlci4KIAkJICogV2Ugc29tZXRpbWVzIGdldCB0aGlzIGNydWZ0IGluIHRoZSBldmVudCB0aGF0IGEgbWVkaXVtIGVycm9yCkBAIC0xMDIwLDYgKzEwOTgsMTIgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKK3N0YXRpYyB2b2lkIHNjc2lfZ2VuZXJpY19kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlCVUdfT04oIWJsa19wY19yZXF1ZXN0KGNtZC0+cmVxdWVzdCkpOworCXNjc2lfaW9fY29tcGxldGlvbihjbWQsIGNtZC0+cmVzdWx0ID09IDAgPyBjbWQtPmJ1ZmZsZW4gOiAwLCAwKTsKK30KKwogc3RhdGljIGludCBzY3NpX3ByZXBfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMTA2MSw3ICsxMTQ1LDcgQEAKIAkgKiB0aGVzZSB0d28gY2FzZXMgZGlmZmVyZW50bHkuICBXZSBkaWZmZXJlbnRpYXRlIGJ5IGxvb2tpbmcKIAkgKiBhdCByZXF1ZXN0LT5jbWQsIGFzIHRoaXMgdGVsbHMgdXMgdGhlIHJlYWwgc3RvcnkuCiAJICovCi0JaWYgKHJlcS0+ZmxhZ3MgJiBSRVFfU1BFQ0lBTCkgeworCWlmIChyZXEtPmZsYWdzICYgUkVRX1NQRUNJQUwgJiYgcmVxLT5zcGVjaWFsKSB7CiAJCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSByZXEtPnNwZWNpYWw7CiAKIAkJaWYgKHNyZXEtPnNyX21hZ2ljID09IFNDU0lfUkVRX01BR0lDKSB7CkBAIC0xMDczLDcgKzExNTcsNyBAQAogCQkJY21kID0gcmVxLT5zcGVjaWFsOwogCX0gZWxzZSBpZiAocmVxLT5mbGFncyAmIChSRVFfQ01EIHwgUkVRX0JMT0NLX1BDKSkgewogCi0JCWlmKHVubGlrZWx5KHNwZWNpYWxzX29ubHkpKSB7CisJCWlmKHVubGlrZWx5KHNwZWNpYWxzX29ubHkpICYmICEocmVxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSkgewogCQkJaWYoc3BlY2lhbHNfb25seSA9PSBTREVWX1FVSUVTQ0UgfHwKIAkJCQkJc3BlY2lhbHNfb25seSA9PSBTREVWX0JMT0NLKQogCQkJCXJldHVybiBCTEtQUkVQX0RFRkVSOwpAQCAtMTE0MiwxMSArMTIyNiwyNiBAQAogCQkvKgogCQkgKiBJbml0aWFsaXplIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kIGZvciB0aGlzIHJlcXVlc3QuCiAJCSAqLwotCQlkcnYgPSAqKHN0cnVjdCBzY3NpX2RyaXZlciAqKilyZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQkJaWYgKHVubGlrZWx5KCFkcnYtPmluaXRfY29tbWFuZChjbWQpKSkgewotCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKLQkJCXNjc2lfcHV0X2NvbW1hbmQoY21kKTsKLQkJCXJldHVybiBCTEtQUkVQX0tJTEw7CisJCWlmIChyZXEtPnJxX2Rpc2spIHsKKwkJCWRydiA9ICooc3RydWN0IHNjc2lfZHJpdmVyICoqKXJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQkJaWYgKHVubGlrZWx5KCFkcnYtPmluaXRfY29tbWFuZChjbWQpKSkgeworCQkJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CisJCQkJc2NzaV9wdXRfY29tbWFuZChjbWQpOworCQkJCXJldHVybiBCTEtQUkVQX0tJTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQltZW1jcHkoY21kLT5jbW5kLCByZXEtPmNtZCwgc2l6ZW9mKGNtZC0+Y21uZCkpOworCQkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJCQllbHNlIGlmIChyZXEtPmRhdGFfbGVuKQorCQkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCQllbHNlCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCQkJCisJCQljbWQtPnRyYW5zZmVyc2l6ZSA9IHJlcS0+ZGF0YV9sZW47CisJCQljbWQtPmFsbG93ZWQgPSAzOworCQkJY21kLT50aW1lb3V0X3Blcl9jb21tYW5kID0gcmVxLT50aW1lb3V0OworCQkJY21kLT5kb25lID0gc2NzaV9nZW5lcmljX2RvbmU7CiAJCX0KIAl9CiAKQEAgLTEyMDcsNyArMTMwNiw3IEBACiAJCQkJICAgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkJICAgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCWlmICh0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwgJnNob3N0LT5zaG9zdF9zdGF0ZSkpCisJaWYgKHNob3N0LT5zaG9zdF9zdGF0ZSA9PSBTSE9TVF9SRUNPVkVSWSkKIAkJcmV0dXJuIDA7CiAJaWYgKHNob3N0LT5ob3N0X2J1c3kgPT0gMCAmJiBzaG9zdC0+aG9zdF9ibG9ja2VkKSB7CiAJCS8qCkBAIC0xNTM5LDkgKzE2MzgsOSBAQAogCX0KIH0KIC8qKgotICoJX19zY3NpX21vZGVfc2Vuc2UgLSBpc3N1ZSBhIG1vZGUgc2Vuc2UsIGZhbGxpbmcgYmFjayBmcm9tIDEwIHRvIAorICoJc2NzaV9tb2RlX3NlbnNlIC0gaXNzdWUgYSBtb2RlIHNlbnNlLCBmYWxsaW5nIGJhY2sgZnJvbSAxMCB0byAKICAqCQlzaXggYnl0ZXMgaWYgbmVjZXNzYXJ5LgotICoJQHNyZXE6CVNDU0kgcmVxdWVzdCB0byBmaWxsIGluIHdpdGggdGhlIE1PREVfU0VOU0UKKyAqCUBzZGV2OglTQ1NJIGRldmljZSB0byBiZSBxdWVyaWVkCiAgKglAZGJkOglzZXQgaWYgbW9kZSBzZW5zZSB3aWxsIGFsbG93IGJsb2NrIGRlc2NyaXB0b3JzIHRvIGJlIHJldHVybmVkCiAgKglAbW9kZXBhZ2U6IG1vZGUgcGFnZSBiZWluZyByZXF1ZXN0ZWQKICAqCUBidWZmZXI6IHJlcXVlc3QgYnVmZmVyIChtYXkgbm90IGJlIHNtYWxsZXIgdGhhbiBlaWdodCBieXRlcykKQEAgLTE1NDksMjYgKzE2NDgsMzQgQEAKICAqCUB0aW1lb3V0OiBjb21tYW5kIHRpbWVvdXQKICAqCUByZXRyaWVzOiBudW1iZXIgb2YgcmV0cmllcyBiZWZvcmUgZmFpbGluZwogICoJQGRhdGE6IHJldHVybnMgYSBzdHJ1Y3R1cmUgYWJzdHJhY3RpbmcgdGhlIG1vZGUgaGVhZGVyIGRhdGEKKyAqCUBzZW5zZTogcGxhY2UgdG8gcHV0IHNlbnNlIGRhdGEgKG9yIE5VTEwgaWYgbm8gc2Vuc2UgdG8gYmUgY29sbGVjdGVkKS4KKyAqCQltdXN0IGJlIFNDU0lfU0VOU0VfQlVGRkVSU0laRSBiaWcuCiAgKgogICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCwgb3IgdGhlIGhlYWRlciBvZmZzZXQgKGVpdGhlciA0CiAgKglvciA4IGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgc2l4IG9yIHRlbiBieXRlIGNvbW1hbmQgd2FzCiAgKglpc3N1ZWQpIGlmIHN1Y2Nlc3NmdWwuCiAgKiovCiBpbnQKLV9fc2NzaV9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGludCBkYmQsIGludCBtb2RlcGFnZSwKK3Njc2lfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkYmQsIGludCBtb2RlcGFnZSwKIAkJICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKLQkJICBzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEpIHsKKwkJICBzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEsIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpIHsKIAl1bnNpZ25lZCBjaGFyIGNtZFsxMl07CiAJaW50IHVzZV8xMF9mb3JfbXM7CiAJaW50IGhlYWRlcl9sZW5ndGg7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgbXlfc3NoZHI7CiAKIAltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CiAJbWVtc2V0KCZjbWRbMF0sIDAsIDEyKTsKIAljbWRbMV0gPSBkYmQgJiAweDE4OwkvKiBhbGxvd3MgREJEIGFuZCBMTEJBIGJpdHMgKi8KIAljbWRbMl0gPSBtb2RlcGFnZTsKIAorCS8qIGNhbGxlciBtaWdodCBub3QgYmUgaW50ZXJlc3RlZCBpbiBzZW5zZSwgYnV0IHdlIG5lZWQgaXQgKi8KKwlpZiAoIXNzaGRyKQorCQlzc2hkciA9ICZteV9zc2hkcjsKKwogIHJldHJ5OgotCXVzZV8xMF9mb3JfbXMgPSBzcmVxLT5zcl9kZXZpY2UtPnVzZV8xMF9mb3JfbXM7CisJdXNlXzEwX2Zvcl9tcyA9IHNkZXYtPnVzZV8xMF9mb3JfbXM7CiAKIAlpZiAodXNlXzEwX2Zvcl9tcykgewogCQlpZiAobGVuIDwgOCkKQEAgLTE1ODYsMzYgKzE2OTMsMzEgQEAKIAkJaGVhZGVyX2xlbmd0aCA9IDQ7CiAJfQogCi0Jc3JlcS0+c3JfY21kX2xlbiA9IDA7Ci0JbWVtc2V0KHNyZXEtPnNyX3NlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKHNyZXEtPnNyX3NlbnNlX2J1ZmZlcikpOwotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCiAJbWVtc2V0KGJ1ZmZlciwgMCwgbGVuKTsKIAotCXNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBidWZmZXIsIGxlbiwgdGltZW91dCwgcmV0cmllcyk7CisJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBjbWQsIERNQV9GUk9NX0RFVklDRSwgYnVmZmVyLCBsZW4sCisJCQkJICBzc2hkciwgdGltZW91dCwgcmV0cmllcyk7CiAKIAkvKiBUaGlzIGNvZGUgbG9va3MgYXdmdWw6IHdoYXQgaXQncyBkb2luZyBpcyBtYWtpbmcgc3VyZSBhbgogCSAqIElMTEVHQUwgUkVRVUVTVCBzZW5zZSByZXR1cm4gaWRlbnRpZmllcyB0aGUgYWN0dWFsIGNvbW1hbmQKIAkgKiBieXRlIGFzIHRoZSBwcm9ibGVtLiAgTU9ERV9TRU5TRSBjb21tYW5kcyBjYW4gcmV0dXJuCiAJICogSUxMRUdBTCBSRVFVRVNUIGlmIHRoZSBjb2RlIHBhZ2UgaXNuJ3Qgc3VwcG9ydGVkICovCiAKLQlpZiAodXNlXzEwX2Zvcl9tcyAmJiAhc2NzaV9zdGF0dXNfaXNfZ29vZChzcmVxLT5zcl9yZXN1bHQpICYmCi0JICAgIChkcml2ZXJfYnl0ZShzcmVxLT5zcl9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSkgewotCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7Ci0KLQkJaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkgewotCQkJaWYgKChzc2hkci5zZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKSAmJgotCQkJICAgIChzc2hkci5hc2MgPT0gMHgyMCkgJiYgKHNzaGRyLmFzY3EgPT0gMCkpIHsKKwlpZiAodXNlXzEwX2Zvcl9tcyAmJiAhc2NzaV9zdGF0dXNfaXNfZ29vZChyZXN1bHQpICYmCisJICAgIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKSkgeworCQlpZiAoc2NzaV9zZW5zZV92YWxpZChzc2hkcikpIHsKKwkJCWlmICgoc3NoZHItPnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QpICYmCisJCQkgICAgKHNzaGRyLT5hc2MgPT0gMHgyMCkgJiYgKHNzaGRyLT5hc2NxID09IDApKSB7CiAJCQkJLyogCiAJCQkJICogSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlCiAJCQkJICovCi0JCQkJc3JlcS0+c3JfZGV2aWNlLT51c2VfMTBfZm9yX21zID0gMDsKKwkJCQlzZGV2LT51c2VfMTBfZm9yX21zID0gMDsKIAkJCQlnb3RvIHJldHJ5OwogCQkJfQogCQl9CiAJfQogCi0JaWYoc2NzaV9zdGF0dXNfaXNfZ29vZChzcmVxLT5zcl9yZXN1bHQpKSB7CisJaWYoc2NzaV9zdGF0dXNfaXNfZ29vZChyZXN1bHQpKSB7CiAJCWRhdGEtPmhlYWRlcl9sZW5ndGggPSBoZWFkZXJfbGVuZ3RoOwogCQlpZih1c2VfMTBfZm9yX21zKSB7CiAJCQlkYXRhLT5sZW5ndGggPSBidWZmZXJbMF0qMjU2ICsgYnVmZmVyWzFdICsgMjsKQEAgLTE2MzIsNzMgKzE3MzQsMzEgQEAKIAkJfQogCX0KIAotCXJldHVybiBzcmVxLT5zcl9yZXN1bHQ7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fc2NzaV9tb2RlX3NlbnNlKTsKLQotLyoqCi0gKglzY3NpX21vZGVfc2Vuc2UgLSBpc3N1ZSBhIG1vZGUgc2Vuc2UsIGZhbGxpbmcgYmFjayBmcm9tIDEwIHRvIAotICoJCXNpeCBieXRlcyBpZiBuZWNlc3NhcnkuCi0gKglAc2RldjoJc2NzaSBkZXZpY2UgdG8gc2VuZCBjb21tYW5kIHRvLgotICoJQGRiZDoJc2V0IGlmIG1vZGUgc2Vuc2Ugd2lsbCBkaXNhYmxlIGJsb2NrIGRlc2NyaXB0b3JzIGluIHRoZSByZXR1cm4KLSAqCUBtb2RlcGFnZTogbW9kZSBwYWdlIGJlaW5nIHJlcXVlc3RlZAotICoJQGJ1ZmZlcjogcmVxdWVzdCBidWZmZXIgKG1heSBub3QgYmUgc21hbGxlciB0aGFuIGVpZ2h0IGJ5dGVzKQotICoJQGxlbjoJbGVuZ3RoIG9mIHJlcXVlc3QgYnVmZmVyLgotICoJQHRpbWVvdXQ6IGNvbW1hbmQgdGltZW91dAotICoJQHJldHJpZXM6IG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBmYWlsaW5nCi0gKgotICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCwgb3IgdGhlIGhlYWRlciBvZmZzZXQgKGVpdGhlciA0Ci0gKglvciA4IGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgc2l4IG9yIHRlbiBieXRlIGNvbW1hbmQgd2FzCi0gKglpc3N1ZWQpIGlmIHN1Y2Nlc3NmdWwuCi0gKiovCi1pbnQKLXNjc2lfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkYmQsIGludCBtb2RlcGFnZSwKLQkJdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsCi0JCXN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOwotCWludCByZXQ7Ci0KLQlpZiAoIXNyZXEpCi0JCXJldHVybiAtMTsKLQotCXJldCA9IF9fc2NzaV9tb2RlX3NlbnNlKHNyZXEsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLAotCQkJCXRpbWVvdXQsIHJldHJpZXMsIGRhdGEpOwotCi0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZXN1bHQ7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfbW9kZV9zZW5zZSk7CiAKIGludAogc2NzaV90ZXN0X3VuaXRfcmVhZHkoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCiB7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKIAljaGFyIGNtZFtdID0gewogCQlURVNUX1VOSVRfUkVBRFksIDAsIDAsIDAsIDAsIDAsCiAJfTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAJaW50IHJlc3VsdDsKIAkKLQlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOwotCWlmICghc3JlcSkKLQkJcmV0dXJuIC1FTk9NRU07CisJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLCAmc3NoZHIsCisJCQkJICB0aW1lb3V0LCByZXRyaWVzKTsKIAotCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0Jc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIE5VTEwsIDAsIHRpbWVvdXQsIHJldHJpZXMpOworCWlmICgoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYgc2Rldi0+cmVtb3ZhYmxlKSB7CiAKLQlpZiAoKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmIHNkZXYtPnJlbW92YWJsZSkgewotCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7Ci0KLQkJaWYgKChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpICYmCisJCWlmICgoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpKSAmJgogCQkgICAgKChzc2hkci5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pIHx8CiAJCSAgICAgKHNzaGRyLnNlbnNlX2tleSA9PSBOT1RfUkVBRFkpKSkgewogCQkJc2Rldi0+Y2hhbmdlZCA9IDE7Ci0JCQlzcmVxLT5zcl9yZXN1bHQgPSAwOworCQkJcmVzdWx0ID0gMDsKIAkJfQogCX0KLQlyZXN1bHQgPSBzcmVxLT5zcl9yZXN1bHQ7Ci0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV90ZXN0X3VuaXRfcmVhZHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCmluZGV4IGQzMGQ3ZjQuLmVlNmRlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKQEAgLTYzLDYgKzYzLDkgQEAKIGV4dGVybiB2b2lkIHNjc2lfZXhpdF9kZXZpbmZvKHZvaWQpOwogCiAvKiBzY3NpX2Vycm9yLmMgKi8KK2V4dGVybiB2b2lkIHNjc2lfYWRkX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50LAorCQl2b2lkICgqKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK2V4dGVybiBpbnQgc2NzaV9kZWxldGVfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfdGltZXNfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gaW50IHNjc2lfZXJyb3JfaGFuZGxlcih2b2lkICpob3N0KTsKIGV4dGVybiBpbnQgc2NzaV9kZWNpZGVfZGlzcG9zaXRpb24oc3RydWN0IHNjc2lfY21uZCAqY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCA0OGVkZDY3Li4xOWM5YTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0xMTEsMTUgKzExMSwxNCBAQAogCiAvKioKICAqIHNjc2lfdW5sb2NrX2Zsb3B0aWNhbCAtIHVubG9jayBkZXZpY2UgdmlhIGEgc3BlY2lhbCBNT0RFIFNFTlNFIGNvbW1hbmQKLSAqIEBzcmVxOgl1c2VkIHRvIHNlbmQgdGhlIGNvbW1hbmQKKyAqIEBzZGV2OglzY3NpIGRldmljZSB0byBzZW5kIGNvbW1hbmQgdG8KICAqIEByZXN1bHQ6CWFyZWEgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgTU9ERSBTRU5TRQogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgIFNlbmQgYSB2ZW5kb3Igc3BlY2lmaWMgTU9ERSBTRU5TRSAobm90IGEgTU9ERSBTRUxFQ1QpIGNvbW1hbmQgdXNpbmcKLSAqICAgICBAc3JlcSB0byB1bmxvY2sgYSBkZXZpY2UsIHN0b3JpbmcgdGhlICh1bnVzZWQpIHJlc3VsdHMgaW50byByZXN1bHQuCisgKiAgICAgU2VuZCBhIHZlbmRvciBzcGVjaWZpYyBNT0RFIFNFTlNFIChub3QgYSBNT0RFIFNFTEVDVCkgY29tbWFuZC4KICAqICAgICBDYWxsZWQgZm9yIEJMSVNUX0tFWSBkZXZpY2VzLgogICoqLwotc3RhdGljIHZvaWQgc2NzaV91bmxvY2tfZmxvcHRpY2FsKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsCitzdGF0aWMgdm9pZCBzY3NpX3VubG9ja19mbG9wdGljYWwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJCSAgdW5zaWduZWQgY2hhciAqcmVzdWx0KQogewogCXVuc2lnbmVkIGNoYXIgc2NzaV9jbWRbTUFYX0NPTU1BTkRfU0laRV07CkBAIC0xMjksMTEgKzEyOCwxMCBAQAogCXNjc2lfY21kWzFdID0gMDsKIAlzY3NpX2NtZFsyXSA9IDB4MmU7CiAJc2NzaV9jbWRbM10gPSAwOwotCXNjc2lfY21kWzRdID0gMHgyYTsJLyogc2l6ZSAqLworCXNjc2lfY21kWzRdID0gMHgyYTsgICAgIC8qIHNpemUgKi8KIAlzY3NpX2NtZFs1XSA9IDA7Ci0Jc3JlcS0+c3JfY21kX2xlbiA9IDA7Ci0Jc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0Jc2NzaV93YWl0X3JlcShzcmVxLCBzY3NpX2NtZCwgcmVzdWx0LCAweDJhIC8qIHNpemUgKi8sIFNDU0lfVElNRU9VVCwgMyk7CisJc2NzaV9leGVjdXRlX3JlcShzZGV2LCBzY3NpX2NtZCwgRE1BX0ZST01fREVWSUNFLCByZXN1bHQsIDB4MmEsIE5VTEwsCisJCQkgU0NTSV9USU1FT1VULCAzKTsKIH0KIAogLyoqCkBAIC00MzMsMjYgKzQzMSwyNSBAQAogCiAvKioKICAqIHNjc2lfcHJvYmVfbHVuIC0gcHJvYmUgYSBzaW5nbGUgTFVOIHVzaW5nIGEgU0NTSSBJTlFVSVJZCi0gKiBAc3JlcToJdXNlZCB0byBzZW5kIHRoZSBJTlFVSVJZCisgKiBAc2RldjoJc2NzaV9kZXZpY2UgdG8gcHJvYmUKICAqIEBpbnFfcmVzdWx0OglhcmVhIHRvIHN0b3JlIHRoZSBJTlFVSVJZIHJlc3VsdAorICogQHJlc3VsdF9sZW46IGxlbiBvZiBpbnFfcmVzdWx0CiAgKiBAYmZsYWdzOglzdG9yZSBhbnkgYmZsYWdzIGZvdW5kIGhlcmUKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgICBQcm9iZSB0aGUgbHVuIGFzc29jaWF0ZWQgd2l0aCBAc3JlcSB1c2luZyBhIHN0YW5kYXJkIFNDU0kgSU5RVUlSWTsKKyAqICAgICBQcm9iZSB0aGUgbHVuIGFzc29jaWF0ZWQgd2l0aCBAcmVxIHVzaW5nIGEgc3RhbmRhcmQgU0NTSSBJTlFVSVJZOwogICoKLSAqICAgICBJZiB0aGUgSU5RVUlSWSBpcyBzdWNjZXNzZnVsLCBzcmVxLT5zcl9yZXN1bHQgaXMgemVybyBhbmQ6IHRoZQorICogICAgIElmIHRoZSBJTlFVSVJZIGlzIHN1Y2Nlc3NmdWwsIHplcm8gaXMgcmV0dXJuZWQgYW5kIHRoZQogICogICAgIElOUVVJUlkgZGF0YSBpcyBpbiBAaW5xX3Jlc3VsdDsgdGhlIHNjc2lfbGV2ZWwgYW5kIElOUVVJUlkgbGVuZ3RoCi0gKiAgICAgYXJlIGNvcGllZCB0byB0aGUgU2NzaV9EZXZpY2UgYXQgQHNyZXEtPnNyX2RldmljZSAoc2Rldik7Ci0gKiAgICAgYW55IGZsYWdzIHZhbHVlIGlzIHN0b3JlZCBpbiAqQGJmbGFncy4KKyAqICAgICBhcmUgY29waWVkIHRvIHRoZSBTY3NpX0RldmljZSBhbnkgZmxhZ3MgdmFsdWUgaXMgc3RvcmVkIGluICpAYmZsYWdzLgogICoqLwotc3RhdGljIHZvaWQgc2NzaV9wcm9iZV9sdW4oc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgY2hhciAqaW5xX3Jlc3VsdCwKLQkJCSAgIGludCAqYmZsYWdzKQorc3RhdGljIGludCBzY3NpX3Byb2JlX2x1bihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNoYXIgKmlucV9yZXN1bHQsCisJCQkgIGludCByZXN1bHRfbGVuLCBpbnQgKmJmbGFncykKIHsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CS8qIGEgYml0IHVnbHkgKi8KIAl1bnNpZ25lZCBjaGFyIHNjc2lfY21kW01BWF9DT01NQU5EX1NJWkVdOwogCWludCBmaXJzdF9pbnF1aXJ5X2xlbiwgdHJ5X2lucXVpcnlfbGVuLCBuZXh0X2lucXVpcnlfbGVuOwogCWludCByZXNwb25zZV9sZW4gPSAwOwotCWludCBwYXNzLCBjb3VudDsKKwlpbnQgcGFzcywgY291bnQsIHJlc3VsdDsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAKIAkqYmZsYWdzID0gMDsKQEAgLTQ3NSwyOCArNDcyLDI2IEBACiAJCW1lbXNldChzY3NpX2NtZCwgMCwgNik7CiAJCXNjc2lfY21kWzBdID0gSU5RVUlSWTsKIAkJc2NzaV9jbWRbNF0gPSAodW5zaWduZWQgY2hhcikgdHJ5X2lucXVpcnlfbGVuOwotCQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKLQkJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAKIAkJbWVtc2V0KGlucV9yZXN1bHQsIDAsIHRyeV9pbnF1aXJ5X2xlbik7Ci0JCXNjc2lfd2FpdF9yZXEoc3JlcSwgKHZvaWQgKikgc2NzaV9jbWQsICh2b2lkICopIGlucV9yZXN1bHQsCi0JCQkJdHJ5X2lucXVpcnlfbGVuLAotCQkJCUhaLzIgKyBIWipzY3NpX2lucV90aW1lb3V0LCAzKTsKKworCQlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsICBzY3NpX2NtZCwgRE1BX0ZST01fREVWSUNFLAorCQkJCQkgIGlucV9yZXN1bHQsIHRyeV9pbnF1aXJ5X2xlbiwgJnNzaGRyLAorCQkJCQkgIEhaIC8gMiArIEhaICogc2NzaV9pbnFfdGltZW91dCwgMyk7CiAKIAkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBJTlFVSVJZICVzICIKIAkJCQkid2l0aCBjb2RlIDB4JXhcbiIsCi0JCQkJc3JlcS0+c3JfcmVzdWx0ID8gImZhaWxlZCIgOiAic3VjY2Vzc2Z1bCIsCi0JCQkJc3JlcS0+c3JfcmVzdWx0KSk7CisJCQkJcmVzdWx0ID8gImZhaWxlZCIgOiAic3VjY2Vzc2Z1bCIsIHJlc3VsdCkpOwogCi0JCWlmIChzcmVxLT5zcl9yZXN1bHQpIHsKKwkJaWYgKHJlc3VsdCkgewogCQkJLyoKIAkJCSAqIG5vdC1yZWFkeSB0byByZWFkeSB0cmFuc2l0aW9uIFthc2MvYXNjcT0weDI4LzB4MF0KIAkJCSAqIG9yIHBvd2VyLW9uLCByZXNldCBbYXNjL2FzY3E9MHgyOS8weDBdLCBjb250aW51ZS4KIAkJCSAqIElOUVVJUlkgc2hvdWxkIG5vdCB5aWVsZCBVTklUX0FUVEVOVElPTgogCQkJICogYnV0IG1hbnkgYnVnZ3kgZGV2aWNlcyBkbyBzbyBhbnl3YXkuIAogCQkJICovCi0JCQlpZiAoKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCi0JCQkgICAgc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpKSB7CisJCQlpZiAoKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCisJCQkgICAgc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpKSB7CiAJCQkJaWYgKChzc2hkci5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pICYmCiAJCQkJICAgICgoc3NoZHIuYXNjID09IDB4MjgpIHx8CiAJCQkJICAgICAoc3NoZHIuYXNjID09IDB4MjkpKSAmJgpAQCAtNTA3LDcgKzUwMiw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChzcmVxLT5zcl9yZXN1bHQgPT0gMCkgeworCWlmIChyZXN1bHQgPT0gMCkgewogCQlyZXNwb25zZV9sZW4gPSAodW5zaWduZWQgY2hhcikgaW5xX3Jlc3VsdFs0XSArIDU7CiAJCWlmIChyZXNwb25zZV9sZW4gPiAyNTUpCiAJCQlyZXNwb25zZV9sZW4gPSBmaXJzdF9pbnF1aXJ5X2xlbjsJLyogc2FuaXR5ICovCkBAIC01NTYsOCArNTUxLDggQEAKIAogCS8qIElmIHRoZSBsYXN0IHRyYW5zZmVyIGF0dGVtcHQgZ290IGFuIGVycm9yLCBhc3N1bWUgdGhlCiAJICogcGVyaXBoZXJhbCBkb2Vzbid0IGV4aXN0IG9yIGlzIGRlYWQuICovCi0JaWYgKHNyZXEtPnNyX3Jlc3VsdCkKLQkJcmV0dXJuOworCWlmIChyZXN1bHQpCisJCXJldHVybiAtRUlPOwogCiAJLyogRG9uJ3QgcmVwb3J0IGFueSBtb3JlIGRhdGEgdGhhbiB0aGUgZGV2aWNlIHNheXMgaXMgdmFsaWQgKi8KIAlzZGV2LT5pbnF1aXJ5X2xlbiA9IG1pbih0cnlfaW5xdWlyeV9sZW4sIHJlc3BvbnNlX2xlbik7CkBAIC01OTMsNyArNTg4LDcgQEAKIAkgICAgKHNkZXYtPnNjc2lfbGV2ZWwgPT0gMSAmJiAoaW5xX3Jlc3VsdFszXSAmIDB4MGYpID09IDEpKQogCQlzZGV2LT5zY3NpX2xldmVsKys7CiAKLQlyZXR1cm47CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtODAwLDkgKzc5NSw4IEBACiAJCQkJICB2b2lkICpob3N0ZGF0YSkKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKIAl1bnNpZ25lZCBjaGFyICpyZXN1bHQ7Ci0JaW50IGJmbGFncywgcmVzID0gU0NTSV9TQ0FOX05PX1JFU1BPTlNFOworCWludCBiZmxhZ3MsIHJlcyA9IFNDU0lfU0NBTl9OT19SRVNQT05TRSwgcmVzdWx0X2xlbiA9IDI1NjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKIAogCS8qCkBAIC04MzEsMTYgKzgyNSwxMyBAQAogCXNkZXYgPSBzY3NpX2FsbG9jX3NkZXYoc3RhcmdldCwgbHVuLCBob3N0ZGF0YSk7CiAJaWYgKCFzZGV2KQogCQlnb3RvIG91dDsKLQlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9BVE9NSUMpOwotCWlmICghc3JlcSkKLQkJZ290byBvdXRfZnJlZV9zZGV2OwotCXJlc3VsdCA9IGttYWxsb2MoMjU2LCBHRlBfQVRPTUlDIHwKKworCXJlc3VsdCA9IGttYWxsb2MocmVzdWx0X2xlbiwgR0ZQX0FUT01JQyB8CiAJCQkoKHNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkgPyBfX0dGUF9ETUEgOiAwKSk7CiAJaWYgKCFyZXN1bHQpCi0JCWdvdG8gb3V0X2ZyZWVfc3JlcTsKKwkJZ290byBvdXRfZnJlZV9zZGV2OwogCi0Jc2NzaV9wcm9iZV9sdW4oc3JlcSwgcmVzdWx0LCAmYmZsYWdzKTsKLQlpZiAoc3JlcS0+c3JfcmVzdWx0KQorCWlmIChzY3NpX3Byb2JlX2x1bihzZGV2LCByZXN1bHQsIHJlc3VsdF9sZW4sICZiZmxhZ3MpKQogCQlnb3RvIG91dF9mcmVlX3Jlc3VsdDsKIAogCS8qCkBAIC04NjgsNyArODU5LDcgQEAKIAlpZiAocmVzID09IFNDU0lfU0NBTl9MVU5fUFJFU0VOVCkgewogCQlpZiAoYmZsYWdzICYgQkxJU1RfS0VZKSB7CiAJCQlzZGV2LT5sb2NrYWJsZSA9IDA7Ci0JCQlzY3NpX3VubG9ja19mbG9wdGljYWwoc3JlcSwgcmVzdWx0KTsKKwkJCXNjc2lfdW5sb2NrX2Zsb3B0aWNhbChzZGV2LCByZXN1bHQpOwogCQl9CiAJCWlmIChiZmxhZ3NwKQogCQkJKmJmbGFnc3AgPSBiZmxhZ3M7CkBAIC04NzYsOCArODY3LDYgQEAKIAogIG91dF9mcmVlX3Jlc3VsdDoKIAlrZnJlZShyZXN1bHQpOwotIG91dF9mcmVlX3NyZXE6Ci0Jc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CiAgb3V0X2ZyZWVfc2RldjoKIAlpZiAocmVzID09IFNDU0lfU0NBTl9MVU5fUFJFU0VOVCkgewogCQlpZiAoc2RldnApIHsKQEAgLTEwNzAsOCArMTA1OSw4IEBACiAJdW5zaWduZWQgaW50IGx1bjsKIAl1bnNpZ25lZCBpbnQgbnVtX2x1bnM7CiAJdW5zaWduZWQgaW50IHJldHJpZXM7CisJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc2NzaV9sdW4gKmx1bnAsICpsdW5fZGF0YTsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOwogCXU4ICpkYXRhOwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKQEAgLTEwODksMTAgKzEwNzgsNiBAQAogCWlmIChiZmxhZ3MgJiBCTElTVF9OT0xVTikKIAkJcmV0dXJuIDA7CiAKLQlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9BVE9NSUMpOwotCWlmICghc3JlcSkKLQkJZ290byBvdXQ7Ci0KIAlzcHJpbnRmKGRldm5hbWUsICJob3N0ICVkIGNoYW5uZWwgJWQgaWQgJWQiLAogCQlzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCk7CiAKQEAgLTExMTAsNyArMTA5NSw3IEBACiAJbHVuX2RhdGEgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0FUT01JQyB8CiAJCQkgICAoc2Rldi0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyBfX0dGUF9ETUEgOiAwKSk7CiAJaWYgKCFsdW5fZGF0YSkKLQkJZ290byBvdXRfcmVsZWFzZV9yZXF1ZXN0OworCQlnb3RvIG91dDsKIAogCXNjc2lfY21kWzBdID0gUkVQT1JUX0xVTlM7CiAKQEAgLTExMjksOCArMTExNCw2IEBACiAKIAlzY3NpX2NtZFsxMF0gPSAwOwkvKiByZXNlcnZlZCAqLwogCXNjc2lfY21kWzExXSA9IDA7CS8qIGNvbnRyb2wgKi8KLQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKLQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKIAogCS8qCiAJICogV2UgY2FuIGdldCBhIFVOSVQgQVRURU5USU9OLCBmb3IgZXhhbXBsZSBhIHBvd2VyIG9uL3Jlc2V0LCBzbwpAQCAtMTE0NiwyOSArMTEyOSwyOSBAQAogCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsgKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBTZW5kaW5nIgogCQkJCSIgUkVQT1JUIExVTlMgdG8gJXMgKHRyeSAlZClcbiIsIGRldm5hbWUsCiAJCQkJcmV0cmllcykpOwotCQlzY3NpX3dhaXRfcmVxKHNyZXEsIHNjc2lfY21kLCBsdW5fZGF0YSwgbGVuZ3RoLAotCQkJCVNDU0lfVElNRU9VVCArIDQqSFosIDMpOworCisJCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2Rldiwgc2NzaV9jbWQsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJICBsdW5fZGF0YSwgbGVuZ3RoLCAmc3NoZHIsCisJCQkJCSAgU0NTSV9USU1FT1VUICsgNCAqIEhaLCAzKTsKKwogCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsgKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBSRVBPUlQgTFVOUyIKLQkJCQkiICVzICh0cnkgJWQpIHJlc3VsdCAweCV4XG4iLCBzcmVxLT5zcl9yZXN1bHQKLQkJCQk/ICAiZmFpbGVkIiA6ICJzdWNjZXNzZnVsIiwgcmV0cmllcywKLQkJCQlzcmVxLT5zcl9yZXN1bHQpKTsKLQkJaWYgKHNyZXEtPnNyX3Jlc3VsdCA9PSAwKQorCQkJCSIgJXMgKHRyeSAlZCkgcmVzdWx0IDB4JXhcbiIsIHJlc3VsdAorCQkJCT8gICJmYWlsZWQiIDogInN1Y2Nlc3NmdWwiLCByZXRyaWVzLCByZXN1bHQpKTsKKwkJaWYgKHJlc3VsdCA9PSAwKQogCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkgeworCQllbHNlIGlmIChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikpIHsKIAkJCWlmIChzc2hkci5zZW5zZV9rZXkgIT0gVU5JVF9BVFRFTlRJT04pCiAJCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlpZiAoc3JlcS0+c3JfcmVzdWx0KSB7CisJaWYgKHJlc3VsdCkgewogCQkvKgogCQkgKiBUaGUgZGV2aWNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgYSBSRVBPUlQgTFVOIGNvbW1hbmQKIAkJICovCiAJCWtmcmVlKGx1bl9kYXRhKTsKLQkJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CiAJCXJldHVybiAxOwogCX0KLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKIAogCS8qCiAJICogR2V0IHRoZSBsZW5ndGggZnJvbSB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiBsdW5fZGF0YS4KQEAgLTEyNDIsOCArMTIyNSw2IEBACiAJa2ZyZWUobHVuX2RhdGEpOwogCXJldHVybiAwOwogCi0gb3V0X3JlbGVhc2VfcmVxdWVzdDoKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKICBvdXQ6CiAJLyoKIAkgKiBXZSBhcmUgb3V0IG9mIG1lbW9yeSwgZG9uJ3QgdHJ5IHNjYW5uaW5nIGFueSBmdXJ0aGVyLgpAQCAtMTI2NSw5ICsxMjQ2LDEyIEBACiAKIAlnZXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwogCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKLQlyZXMgPSBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKHN0YXJnZXQsIGx1biwgTlVMTCwgJnNkZXYsIDEsIGhvc3RkYXRhKTsKLQlpZiAocmVzICE9IFNDU0lfU0NBTl9MVU5fUFJFU0VOVCkKLQkJc2RldiA9IEVSUl9QVFIoLUVOT0RFVik7CisJaWYgKHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKSB7CisJCXJlcyA9IHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwgbHVuLCBOVUxMLCAmc2RldiwgMSwKKwkJCQkJICAgICBob3N0ZGF0YSk7CisJCWlmIChyZXMgIT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKQorCQkJc2RldiA9IEVSUl9QVFIoLUVOT0RFVik7CisJfQogCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKIAlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwpAQCAtMTQxNywxMSArMTQwMSwxNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKLQlpZiAoY2hhbm5lbCA9PSBTQ0FOX1dJTERfQ0FSRCkgCi0JCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gc2hvc3QtPm1heF9jaGFubmVsOyBjaGFubmVsKyspCisJaWYgKHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKSB7CisJCWlmIChjaGFubmVsID09IFNDQU5fV0lMRF9DQVJEKQorCQkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7CisJCQkgICAgIGNoYW5uZWwrKykKKwkJCQlzY3NpX3NjYW5fY2hhbm5lbChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwKKwkJCQkJCSAgcmVzY2FuKTsKKwkJZWxzZQogCQkJc2NzaV9zY2FuX2NoYW5uZWwoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIHJlc2Nhbik7Ci0JZWxzZQotCQlzY3NpX3NjYW5fY2hhbm5lbChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKKwl9CiAJdXAoJnNob3N0LT5zY2FuX211dGV4KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggYmVlZDdmYi4uZGFlNTlkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC00OCw2ICs0OCwzMCBAQAogCXJldHVybiBuYW1lOwogfQogCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIHNjc2lfaG9zdF9zdGF0ZQl2YWx1ZTsKKwljaGFyCQkJKm5hbWU7Cit9IHNob3N0X3N0YXRlc1tdID0geworCXsgU0hPU1RfQ1JFQVRFRCwgImNyZWF0ZWQiIH0sCisJeyBTSE9TVF9SVU5OSU5HLCAicnVubmluZyIgfSwKKwl7IFNIT1NUX0NBTkNFTCwgImNhbmNlbCIgfSwKKwl7IFNIT1NUX0RFTCwgImRlbGV0ZWQiIH0sCisJeyBTSE9TVF9SRUNPVkVSWSwgInJlY292ZXJ5IiB9LAorfTsKK2NvbnN0IGNoYXIgKnNjc2lfaG9zdF9zdGF0ZV9uYW1lKGVudW0gc2NzaV9ob3N0X3N0YXRlIHN0YXRlKQoreworCWludCBpOworCWNoYXIgKm5hbWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzaG9zdF9zdGF0ZXMpL3NpemVvZihzaG9zdF9zdGF0ZXNbMF0pOyBpKyspIHsKKwkJaWYgKHNob3N0X3N0YXRlc1tpXS52YWx1ZSA9PSBzdGF0ZSkgeworCQkJbmFtZSA9IHNob3N0X3N0YXRlc1tpXS5uYW1lOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKIHN0YXRpYyBpbnQgY2hlY2tfc2V0KHVuc2lnbmVkIGludCAqdmFsLCBjaGFyICpzcmMpCiB7CiAJY2hhciAqbGFzdDsKQEAgLTEyNCw2ICsxNDgsNDMgQEAKIH07CiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2NhbiwgU19JV1VTUiwgTlVMTCwgc3RvcmVfc2Nhbik7CiAKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zaG9zdF9zdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwllbnVtIHNjc2lfaG9zdF9zdGF0ZSBzdGF0ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNob3N0X3N0YXRlcykvc2l6ZW9mKHNob3N0X3N0YXRlc1swXSk7IGkrKykgeworCQljb25zdCBpbnQgbGVuID0gc3RybGVuKHNob3N0X3N0YXRlc1tpXS5uYW1lKTsKKwkJaWYgKHN0cm5jbXAoc2hvc3Rfc3RhdGVzW2ldLm5hbWUsIGJ1ZiwgbGVuKSA9PSAwICYmCisJCSAgIGJ1ZltsZW5dID09ICdcbicpIHsKKwkJCXN0YXRlID0gc2hvc3Rfc3RhdGVzW2ldLnZhbHVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgc3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3Nob3N0X3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwljb25zdCBjaGFyICpuYW1lID0gc2NzaV9ob3N0X3N0YXRlX25hbWUoc2hvc3QtPnNob3N0X3N0YXRlKTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVzXG4iLCBuYW1lKTsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHN0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19zaG9zdF9zdGF0ZSwgc3RvcmVfc2hvc3Rfc3RhdGUpOworCiBzaG9zdF9yZF9hdHRyKHVuaXF1ZV9pZCwgIiV1XG4iKTsKIHNob3N0X3JkX2F0dHIoaG9zdF9idXN5LCAiJWh1XG4iKTsKIHNob3N0X3JkX2F0dHIoY21kX3Blcl9sdW4sICIlaGRcbiIpOwpAQCAtMTM5LDYgKzIwMCw3IEBACiAJJmNsYXNzX2RldmljZV9hdHRyX3VuY2hlY2tlZF9pc2FfZG1hLAogCSZjbGFzc19kZXZpY2VfYXR0cl9wcm9jX25hbWUsCiAJJmNsYXNzX2RldmljZV9hdHRyX3NjYW4sCisJJmNsYXNzX2RldmljZV9hdHRyX3N0YXRlLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKaW5kZXggZTY0MTJmYy4uMmNhYjU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKQEAgLTI1Miw3ICsyNTIsOCBAQAogCiAjZGVmaW5lIHRvX2ZjX2ludGVybmFsKHRtcGwpCWNvbnRhaW5lcl9vZih0bXBsLCBzdHJ1Y3QgZmNfaW50ZXJuYWwsIHQpCiAKLXN0YXRpYyBpbnQgZmNfdGFyZ2V0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZmNfdGFyZ2V0X3NldHVwKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Yywgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChkZXYpOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHN0YXJnZXQpOwpAQCAtMjgxLDcgKzI4Miw4IEBACiAJCQkgICAgICAgTlVMTCwKIAkJCSAgICAgICBOVUxMKTsKIAotc3RhdGljIGludCBmY19ob3N0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZmNfaG9zdF9zZXR1cChzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwppbmRleCA3NjcwOTE5Li5lZjU3N2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCkBAIC0yOCwxNCArMjgsMTQgQEAKICNpbmNsdWRlICJzY3NpX3ByaXYuaCIKICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfc3BpLmg+CiAKICNkZWZpbmUgU1BJX1BSSU5USyh4LCBsLCBmLCBhLi4uKQlkZXZfcHJpbnRrKGwsICYoeCktPmRldiwgZiAsICMjYSkKIAotI2RlZmluZSBTUElfTlVNX0FUVFJTIDEzCS8qIGluY3JlYXNlIHRoaXMgaWYgeW91IGFkZCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNQSV9OVU1fQVRUUlMgMTQJLyogaW5jcmVhc2UgdGhpcyBpZiB5b3UgYWRkIGF0dHJpYnV0ZXMgKi8KICNkZWZpbmUgU1BJX09USEVSX0FUVFJTIDEJLyogSW5jcmVhc2UgdGhpcyBpZiB5b3UgYWRkICJhbHdheXMKIAkJCQkgKiBvbiIgYXR0cmlidXRlcyAqLwogI2RlZmluZSBTUElfSE9TVF9BVFRSUwkxCkBAIC0xMDYsMjcgKzEwNiwzMSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qIE1vZGlmaWNhdGlvbiBvZiBzY3NpX3dhaXRfcmVxIHRoYXQgd2lsbCBjbGVhciBVTklUIEFUVEVOVElPTiBjb25kaXRpb25zCi0gKiByZXN1bHRpbmcgZnJvbSAobGlrZWx5KSBidXMgYW5kIGRldmljZSByZXNldHMgKi8KLXN0YXRpYyB2b2lkIHNwaV93YWl0X3JlcShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCBjb25zdCB2b2lkICpjbWQsCi0JCQkgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuKQorc3RhdGljIGludCBzcGlfZXhlY3V0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNvbnN0IHZvaWQgKmNtZCwKKwkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJICAgICAgIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKKwkJICAgICAgIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpCiB7Ci0JaW50IGk7CisJaW50IGksIHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07CiAKIAlmb3IoaSA9IDA7IGkgPCBEVl9SRVRSSUVTOyBpKyspIHsKLQkJc3JlcS0+c3JfcmVxdWVzdC0+ZmxhZ3MgfD0gUkVRX0ZBSUxGQVNUOworCQlyZXN1bHQgPSBzY3NpX2V4ZWN1dGUoc2RldiwgY21kLCBkaXIsIGJ1ZmZlciwgYnVmZmxlbiwKKwkJCQkgICAgICBzZW5zZSwgRFZfVElNRU9VVCwgLyogcmV0cmllcyAqLyAxLAorCQkJCSAgICAgIFJFUV9GQUlMRkFTVCk7CisJCWlmIChyZXN1bHQgJiBEUklWRVJfU0VOU0UpIHsKKwkJCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcl90bXA7CisJCQlpZiAoIXNzaGRyKQorCQkJCXNzaGRyID0gJnNzaGRyX3RtcDsKIAotCQlzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgYnVmZmVyLCBidWZmbGVuLAotCQkJICAgICAgRFZfVElNRU9VVCwgLyogcmV0cmllcyAqLyAxKTsKLQkJaWYgKHNyZXEtPnNyX3Jlc3VsdCAmIERSSVZFUl9TRU5TRSkgewotCQkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwotCi0JCQlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpCi0JCQkgICAgJiYgc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKQorCQkJaWYgKHNjc2lfbm9ybWFsaXplX3NlbnNlKHNlbnNlLCBzaXplb2YoKnNlbnNlKSwKKwkJCQkJCSBzc2hkcikKKwkJCSAgICAmJiBzc2hkci0+c2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKQogCQkJCWNvbnRpbnVlOwogCQl9CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgc3RydWN0IHsKQEAgLTE2Miw3ICsxNjYsOCBAQAogCXJldHVybiBTUElfU0lHTkFMX1VOS05PV047CiB9CiAKLXN0YXRpYyBpbnQgc3BpX2hvc3Rfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzcGlfaG9zdF9zZXR1cChzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChkZXYpOwogCkBAIC0xOTYsNyArMjAxLDkgQEAKIAlyZXR1cm4gJmktPnQuaG9zdF9hdHRycy5hYyA9PSBjb250OwogfQogCi1zdGF0aWMgaW50IHNwaV9kZXZpY2VfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc3BpX2RldmljZV9jb25maWd1cmUoc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKnRjLAorCQkJCXN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7CkBAIC0yMTQsNyArMjIxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzcGlfc2V0dXBfdHJhbnNwb3J0X2F0dHJzKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc3BpX3NldHVwX3RyYW5zcG9ydF9hdHRycyhzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQogewogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRvX3Njc2lfdGFyZ2V0KGRldik7CiAKQEAgLTIzMSw2ICsyNDAsNyBAQAogCXNwaV9yZF9zdHJtKHN0YXJnZXQpID0gMDsKIAlzcGlfcnRpKHN0YXJnZXQpID0gMDsKIAlzcGlfcGNvbXBfZW4oc3RhcmdldCkgPSAwOworCXNwaV9ob2xkX21jcyhzdGFyZ2V0KSA9IDA7CiAJc3BpX2R2X3BlbmRpbmcoc3RhcmdldCkgPSAwOwogCXNwaV9pbml0aWFsX2R2KHN0YXJnZXQpID0gMDsKIAlpbml0X01VVEVYKCZzcGlfZHZfc2VtKHN0YXJnZXQpKTsKQEAgLTM0Nyw2ICszNTcsNyBAQAogc3BpX3RyYW5zcG9ydF9yZF9hdHRyKHJkX3N0cm0sICIlZFxuIik7CiBzcGlfdHJhbnNwb3J0X3JkX2F0dHIocnRpLCAiJWRcbiIpOwogc3BpX3RyYW5zcG9ydF9yZF9hdHRyKHBjb21wX2VuLCAiJWRcbiIpOworc3BpX3RyYW5zcG9ydF9yZF9hdHRyKGhvbGRfbWNzLCAiJWRcbiIpOwogCiAvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IGNoaWxkIGRldmljZSBzbyB3ZSByZXR1cm4gMSAqLwogc3RhdGljIGludCBjaGlsZF9pdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKQEAgLTUzOSwxMyArNTUwLDEzIEBACiAvKiBUaGlzIGlzIGZvciByZWFkL3dyaXRlIERvbWFpbiBWYWxpZGF0aW9uOiAgSWYgdGhlIGRldmljZSBzdXBwb3J0cwogICogYW4gZWNobyBidWZmZXIsIHdlIGRvIHJlYWQvd3JpdGUgdGVzdHMgdG8gaXQgKi8KIHN0YXRpYyBlbnVtIHNwaV9jb21wYXJlX3JldHVybnMKLXNwaV9kdl9kZXZpY2VfZWNob19idWZmZXIoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlciwKK3NwaV9kdl9kZXZpY2VfZWNob19idWZmZXIoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB1OCAqYnVmZmVyLAogCQkJICB1OCAqcHRyLCBjb25zdCBpbnQgcmV0cmllcykKIHsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CiAJaW50IGxlbiA9IHB0ciAtIGJ1ZmZlcjsKLQlpbnQgaiwgaywgcjsKKwlpbnQgaiwgaywgciwgcmVzdWx0OwogCXVuc2lnbmVkIGludCBwYXR0ZXJuID0gMHgwMDAwZmZmZjsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAKIAljb25zdCBjaGFyIHNwaV93cml0ZV9idWZmZXJbXSA9IHsKIAkJV1JJVEVfQlVGRkVSLCAweDBhLCAwLCAwLCAwLCAwLCAwLCBsZW4gPj4gOCwgbGVuICYgMHhmZiwgMApAQCAtNTkwLDE0ICs2MDEsMTIgQEAKIAl9CiAKIAlmb3IgKHIgPSAwOyByIDwgcmV0cmllczsgcisrKSB7Ci0JCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwkvKiB3YWl0X3JlcSB0byBmaWxsIGluICovCi0JCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKLQkJc3BpX3dhaXRfcmVxKHNyZXEsIHNwaV93cml0ZV9idWZmZXIsIGJ1ZmZlciwgbGVuKTsKLQkJaWYoc3JlcS0+c3JfcmVzdWx0IHx8ICFzY3NpX2RldmljZV9vbmxpbmUoc2RldikpIHsKLQkJCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKwkJcmVzdWx0ID0gc3BpX2V4ZWN1dGUoc2Rldiwgc3BpX3dyaXRlX2J1ZmZlciwgRE1BX1RPX0RFVklDRSwKKwkJCQkgICAgIGJ1ZmZlciwgbGVuLCAmc3NoZHIpOworCQlpZihyZXN1bHQgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgewogCiAJCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9RVUlFU0NFKTsKLQkJCWlmIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikKKwkJCWlmIChzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikKIAkJCSAgICAmJiBzc2hkci5zZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUCiAJCQkgICAgLyogSU5WQUxJRCBGSUVMRCBJTiBDREIgKi8KIAkJCSAgICAmJiBzc2hkci5hc2MgPT0gMHgyNCAmJiBzc2hkci5hc2NxID09IDB4MDApCkBAIC02MDksMTQgKzYxOCwxMyBAQAogCQkJCXJldHVybiBTUElfQ09NUEFSRV9TS0lQX1RFU1Q7CiAKIAotCQkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9FUlIsICJXcml0ZSBCdWZmZXIgZmFpbHVyZSAleFxuIiwgc3JlcS0+c3JfcmVzdWx0KTsKKwkJCVNQSV9QUklOVEsoc2Rldi0+c2Rldl90YXJnZXQsIEtFUk5fRVJSLCAiV3JpdGUgQnVmZmVyIGZhaWx1cmUgJXhcbiIsIHJlc3VsdCk7CiAJCQlyZXR1cm4gU1BJX0NPTVBBUkVfRkFJTFVSRTsKIAkJfQogCiAJCW1lbXNldChwdHIsIDAsIGxlbik7Ci0JCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwkvKiB3YWl0X3JlcSB0byBmaWxsIGluICovCi0JCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCQlzcGlfd2FpdF9yZXEoc3JlcSwgc3BpX3JlYWRfYnVmZmVyLCBwdHIsIGxlbik7CisJCXNwaV9leGVjdXRlKHNkZXYsIHNwaV9yZWFkX2J1ZmZlciwgRE1BX0ZST01fREVWSUNFLAorCQkJICAgIHB0ciwgbGVuLCBOVUxMKTsKIAkJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUVVJRVNDRSk7CiAKIAkJaWYgKG1lbWNtcChidWZmZXIsIHB0ciwgbGVuKSAhPSAwKQpAQCAtNjI4LDI1ICs2MzYsMjIgQEAKIC8qIFRoaXMgaXMgZm9yIHRoZSBzaW1wbGVzdCBmb3JtIG9mIERvbWFpbiBWYWxpZGF0aW9uOiBhIHJlYWQgdGVzdAogICogb24gdGhlIGlucXVpcnkgZGF0YSBmcm9tIHRoZSBkZXZpY2UgKi8KIHN0YXRpYyBlbnVtIHNwaV9jb21wYXJlX3JldHVybnMKLXNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIsCitzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHU4ICpidWZmZXIsCiAJCQkgICAgICB1OCAqcHRyLCBjb25zdCBpbnQgcmV0cmllcykKIHsKLQlpbnQgcjsKLQljb25zdCBpbnQgbGVuID0gc3JlcS0+c3JfZGV2aWNlLT5pbnF1aXJ5X2xlbjsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJaW50IHIsIHJlc3VsdDsKKwljb25zdCBpbnQgbGVuID0gc2Rldi0+aW5xdWlyeV9sZW47CiAJY29uc3QgY2hhciBzcGlfaW5xdWlyeVtdID0gewogCQlJTlFVSVJZLCAwLCAwLCAwLCBsZW4sIDAKIAl9OwogCiAJZm9yIChyID0gMDsgciA8IHJldHJpZXM7IHIrKykgewotCQlzcmVxLT5zcl9jbWRfbGVuID0gMDsJLyogd2FpdF9yZXEgdG8gZmlsbCBpbiAqLwotCQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQogCQltZW1zZXQocHRyLCAwLCBsZW4pOwogCi0JCXNwaV93YWl0X3JlcShzcmVxLCBzcGlfaW5xdWlyeSwgcHRyLCBsZW4pOworCQlyZXN1bHQgPSBzcGlfZXhlY3V0ZShzZGV2LCBzcGlfaW5xdWlyeSwgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgICAgcHRyLCBsZW4sIE5VTEwpOwogCQkKLQkJaWYoc3JlcS0+c3JfcmVzdWx0IHx8ICFzY3NpX2RldmljZV9vbmxpbmUoc2RldikpIHsKKwkJaWYocmVzdWx0IHx8ICFzY3NpX2RldmljZV9vbmxpbmUoc2RldikpIHsKIAkJCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX1FVSUVTQ0UpOwogCQkJcmV0dXJuIFNQSV9DT01QQVJFX0ZBSUxVUkU7CiAJCX0KQEAgLTY2NywxMiArNjcyLDExIEBACiB9CiAKIHN0YXRpYyBlbnVtIHNwaV9jb21wYXJlX3JldHVybnMKLXNwaV9kdl9yZXRyYWluKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIsIHU4ICpwdHIsCitzcGlfZHZfcmV0cmFpbihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHU4ICpidWZmZXIsIHU4ICpwdHIsCiAJICAgICAgIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucyAKLQkgICAgICAgKCpjb21wYXJlX2ZuKShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICosIHU4ICosIHU4ICosIGludCkpCisJICAgICAgICgqY29tcGFyZV9mbikoc3RydWN0IHNjc2lfZGV2aWNlICosIHU4ICosIHU4ICosIGludCkpCiB7Ci0Jc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzcmVxLT5zcl9ob3N0LT50cmFuc3BvcnR0KTsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzZGV2LT5ob3N0LT50cmFuc3BvcnR0KTsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKIAlpbnQgcGVyaW9kID0gMCwgcHJldnBlcmlvZCA9IDA7IAogCWVudW0gc3BpX2NvbXBhcmVfcmV0dXJucyByZXR2YWw7CkBAIC02ODAsNyArNjg0LDcgQEAKIAogCWZvciAoOzspIHsKIAkJaW50IG5ld3BlcmlvZDsKLQkJcmV0dmFsID0gY29tcGFyZV9mbihzcmVxLCBidWZmZXIsIHB0ciwgRFZfTE9PUFMpOworCQlyZXR2YWwgPSBjb21wYXJlX2ZuKHNkZXYsIGJ1ZmZlciwgcHRyLCBEVl9MT09QUyk7CiAKIAkJaWYgKHJldHZhbCA9PSBTUElfQ09NUEFSRV9TVUNDRVNTCiAJCSAgICB8fCByZXR2YWwgPT0gU1BJX0NPTVBBUkVfU0tJUF9URVNUKQpAQCAtNzI2LDkgKzczMCw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNwaV9kdl9kZXZpY2VfZ2V0X2VjaG9fYnVmZmVyKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIpCitzcGlfZHZfZGV2aWNlX2dldF9lY2hvX2J1ZmZlcihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHU4ICpidWZmZXIpCiB7Ci0JaW50IGw7CisJaW50IGwsIHJlc3VsdDsKIAogCS8qIGZpcnN0IG9mZiBkbyBhIHRlc3QgdW5pdCByZWFkeS4gIFRoaXMgY2FuIGVycm9yIG91dCAKIAkgKiBiZWNhdXNlIG9mIHJlc2VydmF0aW9ucyBvciBzb21lIG90aGVyIHJlYXNvbi4gIElmIGl0CkBAIC03NDQsMTggKzc0OCwxNiBAQAogCX07CiAKIAkKLQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKLQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOwotCiAJLyogV2Ugc2VuZCBhIHNldCBvZiB0aHJlZSBUVVJzIHRvIGNsZWFyIGFueSBvdXRzdGFuZGluZyAKIAkgKiB1bml0IGF0dGVudGlvbiBjb25kaXRpb25zIGlmIHRoZXkgZXhpc3QgKE90aGVyd2lzZSB0aGUKIAkgKiBidWZmZXIgdGVzdHMgd29uJ3QgYmUgaGFwcHkpLiAgSWYgdGhlIFRVUiBzdGlsbCBmYWlscwogCSAqIChyZXNlcnZhdGlvbiBjb25mbGljdCwgZGV2aWNlIG5vdCByZWFkeSwgZXRjKSBqdXN0CiAJICogc2tpcCB0aGUgd3JpdGUgdGVzdHMgKi8KIAlmb3IgKGwgPSAwOyA7IGwrKykgewotCQlzcGlfd2FpdF9yZXEoc3JlcSwgc3BpX3Rlc3RfdW5pdF9yZWFkeSwgTlVMTCwgMCk7CisJCXJlc3VsdCA9IHNwaV9leGVjdXRlKHNkZXYsIHNwaV90ZXN0X3VuaXRfcmVhZHksIERNQV9OT05FLCAKKwkJCQkgICAgIE5VTEwsIDAsIE5VTEwpOwogCi0JCWlmKHNyZXEtPnNyX3Jlc3VsdCkgeworCQlpZihyZXN1bHQpIHsKIAkJCWlmKGwgPj0gMykKIAkJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKQEAgLTc2NCwxMiArNzY2LDEwIEBACiAJCX0KIAl9CiAKLQlzcmVxLT5zcl9jbWRfbGVuID0gMDsKLQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwlyZXN1bHQgPSBzcGlfZXhlY3V0ZShzZGV2LCBzcGlfcmVhZF9idWZmZXJfZGVzY3JpcHRvciwgCisJCQkgICAgIERNQV9GUk9NX0RFVklDRSwgYnVmZmVyLCA0LCBOVUxMKTsKIAotCXNwaV93YWl0X3JlcShzcmVxLCBzcGlfcmVhZF9idWZmZXJfZGVzY3JpcHRvciwgYnVmZmVyLCA0KTsKLQotCWlmIChzcmVxLT5zcl9yZXN1bHQpCisJaWYgKHJlc3VsdCkKIAkJLyogRGV2aWNlIGhhcyBubyBlY2hvIGJ1ZmZlciAqLwogCQlyZXR1cm4gMDsKIApAQCAtNzc3LDE3ICs3NzcsMTYgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNwaV9kdl9kZXZpY2VfaW50ZXJuYWwoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlcikKK3NwaV9kdl9kZXZpY2VfaW50ZXJuYWwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB1OCAqYnVmZmVyKQogewotCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc3JlcS0+c3JfaG9zdC0+dHJhbnNwb3J0dCk7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc3JlcS0+c3JfZGV2aWNlOworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc2Rldi0+aG9zdC0+dHJhbnNwb3J0dCk7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7CiAJaW50IGxlbiA9IHNkZXYtPmlucXVpcnlfbGVuOwogCS8qIGZpcnN0IHNldCB1cyB1cCBmb3IgbmFycm93IGFzeW5jICovCiAJRFZfU0VUKG9mZnNldCwgMCk7CiAJRFZfU0VUKHdpZHRoLCAwKTsKIAkKLQlpZiAoc3BpX2R2X2RldmljZV9jb21wYXJlX2lucXVpcnkoc3JlcSwgYnVmZmVyLCBidWZmZXIsIERWX0xPT1BTKQorCWlmIChzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeShzZGV2LCBidWZmZXIsIGJ1ZmZlciwgRFZfTE9PUFMpCiAJICAgICE9IFNQSV9DT01QQVJFX1NVQ0NFU1MpIHsKIAkJU1BJX1BSSU5USyhzdGFyZ2V0LCBLRVJOX0VSUiwgIkRvbWFpbiBWYWxpZGF0aW9uIEluaXRpYWwgSW5xdWlyeSBGYWlsZWRcbiIpOwogCQkvKiBGSVhNRTogc2hvdWxkIHByb2JhYmx5IG9mZmxpbmUgdGhlIGRldmljZSBoZXJlPyAqLwpAQCAtNzk5LDcgKzc5OCw3IEBACiAJICAgIHNjc2lfZGV2aWNlX3dpZGUoc2RldikpIHsKIAkJaS0+Zi0+c2V0X3dpZHRoKHN0YXJnZXQsIDEpOwogCi0JCWlmIChzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeShzcmVxLCBidWZmZXIsCisJCWlmIChzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeShzZGV2LCBidWZmZXIsCiAJCQkJCQkgICBidWZmZXIgKyBsZW4sCiAJCQkJCQkgICBEVl9MT09QUykKIAkJICAgICE9IFNQSV9DT01QQVJFX1NVQ0NFU1MpIHsKQEAgLTgyMCw3ICs4MTksNyBAQAogCiAJbGVuID0gMDsKIAlpZiAoc2NzaV9kZXZpY2VfZHQoc2RldikpCi0JCWxlbiA9IHNwaV9kdl9kZXZpY2VfZ2V0X2VjaG9fYnVmZmVyKHNyZXEsIGJ1ZmZlcik7CisJCWxlbiA9IHNwaV9kdl9kZXZpY2VfZ2V0X2VjaG9fYnVmZmVyKHNkZXYsIGJ1ZmZlcik7CiAKICByZXRyeToKIApAQCAtODQ2LDcgKzg0NSw3IEBACiAKIAlpZiAobGVuID09IDApIHsKIAkJU1BJX1BSSU5USyhzdGFyZ2V0LCBLRVJOX0lORk8sICJEb21haW4gVmFsaWRhdGlvbiBza2lwcGluZyB3cml0ZSB0ZXN0c1xuIik7Ci0JCXNwaV9kdl9yZXRyYWluKHNyZXEsIGJ1ZmZlciwgYnVmZmVyICsgbGVuLAorCQlzcGlfZHZfcmV0cmFpbihzZGV2LCBidWZmZXIsIGJ1ZmZlciArIGxlbiwKIAkJCSAgICAgICBzcGlfZHZfZGV2aWNlX2NvbXBhcmVfaW5xdWlyeSk7CiAJCXJldHVybjsKIAl9CkBAIC04NTYsNyArODU1LDcgQEAKIAkJbGVuID0gU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFOwogCX0KIAotCWlmIChzcGlfZHZfcmV0cmFpbihzcmVxLCBidWZmZXIsIGJ1ZmZlciArIGxlbiwKKwlpZiAoc3BpX2R2X3JldHJhaW4oc2RldiwgYnVmZmVyLCBidWZmZXIgKyBsZW4sCiAJCQkgICBzcGlfZHZfZGV2aWNlX2VjaG9fYnVmZmVyKQogCSAgICA9PSBTUElfQ09NUEFSRV9TS0lQX1RFU1QpIHsKIAkJLyogT0ssIHRoZSBzdHVwaWQgZHJpdmUgY2FuJ3QgZG8gYSB3cml0ZSBlY2hvIGJ1ZmZlcgpAQCAtODc5LDE2ICs4NzgsMTIgQEAKIHZvaWQKIHNwaV9kdl9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7CiAJdTggKmJ1ZmZlcjsKIAljb25zdCBpbnQgbGVuID0gU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFKjI7CiAKLQlpZiAodW5saWtlbHkoIXNyZXEpKQotCQlyZXR1cm47Ci0KIAlpZiAodW5saWtlbHkoc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKSkKLQkJZ290byBvdXRfZnJlZV9yZXE7CisJCXJldHVybjsKIAogCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIApAQCAtOTA5LDcgKzkwNCw3IEBACiAKIAlTUElfUFJJTlRLKHN0YXJnZXQsIEtFUk5fSU5GTywgIkJlZ2lubmluZyBEb21haW4gVmFsaWRhdGlvblxuIik7CiAKLQlzcGlfZHZfZGV2aWNlX2ludGVybmFsKHNyZXEsIGJ1ZmZlcik7CisJc3BpX2R2X2RldmljZV9pbnRlcm5hbChzZGV2LCBidWZmZXIpOwogCiAJU1BJX1BSSU5USyhzdGFyZ2V0LCBLRVJOX0lORk8sICJFbmRpbmcgRG9tYWluIFZhbGlkYXRpb25cbiIpOwogCkBAIC05MjQsOCArOTE5LDYgQEAKIAlrZnJlZShidWZmZXIpOwogIG91dF9wdXQ6CiAJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwotIG91dF9mcmVlX3JlcToKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKIH0KIEVYUE9SVF9TWU1CT0woc3BpX2R2X2RldmljZSk7CiAKQEAgLTEwMjgsMTAgKzEwMjEsMTcgQEAKIAkJc3ByaW50X2ZyYWModG1wLCBwaWNvc2VjLCAxMDAwKTsKIAogCQlkZXZfaW5mbygmc3RhcmdldC0+ZGV2LAotCQkJIiVzICVzU0NTSSAlZC4lZCBNQi9zICVzJXMlcyAoJXMgbnMsIG9mZnNldCAlZClcbiIsCi0JCQlzY3NpLCB0cC0+d2lkdGggPyAiV0lERSAiIDogIiIsIGtiMTAwLzEwLCBrYjEwMCAlIDEwLAotCQkJdHAtPmR0ID8gIkRUIiA6ICJTVCIsIHRwLT5pdSA/ICIgSVUiIDogIiIsCi0JCQl0cC0+cWFzICA/ICIgUUFTIiA6ICIiLCB0bXAsIHRwLT5vZmZzZXQpOworCQkJICIlcyAlc1NDU0kgJWQuJWQgTUIvcyAlcyVzJXMlcyVzJXMlcyVzICglcyBucywgb2Zmc2V0ICVkKVxuIiwKKwkJCSBzY3NpLCB0cC0+d2lkdGggPyAiV0lERSAiIDogIiIsIGtiMTAwLzEwLCBrYjEwMCAlIDEwLAorCQkJIHRwLT5kdCA/ICJEVCIgOiAiU1QiLAorCQkJIHRwLT5pdSA/ICIgSVUiIDogIiIsCisJCQkgdHAtPnFhcyAgPyAiIFFBUyIgOiAiIiwKKwkJCSB0cC0+cmRfc3RybSA/ICIgUkRTVFJNIiA6ICIiLAorCQkJIHRwLT5ydGkgPyAiIFJUSSIgOiAiIiwKKwkJCSB0cC0+d3JfZmxvdyA/ICIgV1JGTE9XIiA6ICIiLAorCQkJIHRwLT5wY29tcF9lbiA/ICIgUENPTVAiIDogIiIsCisJCQkgdHAtPmhvbGRfbWNzID8gIiBITUNTIiA6ICIiLAorCQkJIHRtcCwgdHAtPm9mZnNldCk7CiAJfSBlbHNlIHsKIAkJZGV2X2luZm8oJnN0YXJnZXQtPmRldiwgIiVzYXN5bmNocm9ub3VzLlxuIiwKIAkJCQl0cC0+d2lkdGggPyAid2lkZSAiIDogIiIpOwpAQCAtMTA3Myw2ICsxMDczLDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaTsKIAogCWlmICghc2NzaV9pc19zZGV2X2RldmljZShkZXYpKQogCQlyZXR1cm4gMDsKQEAgLTEwODUsNiArMTA4Niw5IEBACiAJLyogTm90ZTogdGhpcyBjbGFzcyBoYXMgbm8gZGV2aWNlIGF0dHJpYnV0ZXMsIHNvIGl0IGhhcwogCSAqIG5vIHBlci1IQkEgYWxsb2NhdGlvbiBhbmQgdGh1cyB3ZSBkb24ndCBuZWVkIHRvIGRpc3Rpbmd1aXNoCiAJICogdGhlIGF0dHJpYnV0ZSBjb250YWluZXJzIGZvciB0aGUgZGV2aWNlICovCisJaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJaWYgKGktPmYtPmRlbnlfYmluZGluZyAmJiBpLT5mLT5kZW55X2JpbmRpbmcoc2Rldi0+c2Rldl90YXJnZXQpKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTA5Miw2ICsxMDk2LDcgQEAKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmk7CiAKIAlpZiAoIXNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQpAQCAtMTEwMyw3ICsxMTA4LDExIEBACiAJCXJldHVybiAwOwogCiAJaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7Ci0JCisJc3RhcmdldCA9IHRvX3Njc2lfdGFyZ2V0KGRldik7CisKKwlpZiAoaS0+Zi0+ZGVueV9iaW5kaW5nICYmIGktPmYtPmRlbnlfYmluZGluZyhzdGFyZ2V0KSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gJmktPnQudGFyZ2V0X2F0dHJzLmFjID09IGNvbnQ7CiB9CiAKQEAgLTExNTQsNiArMTE2Myw3IEBACiAJU0VUVVBfQVRUUklCVVRFKHJkX3N0cm0pOwogCVNFVFVQX0FUVFJJQlVURShydGkpOwogCVNFVFVQX0FUVFJJQlVURShwY29tcF9lbik7CisJU0VUVVBfQVRUUklCVVRFKGhvbGRfbWNzKTsKIAogCS8qIGlmIHlvdSBhZGQgYW4gYXR0cmlidXRlIGJ1dCBmb3JnZXQgdG8gaW5jcmVhc2UgU1BJX05VTV9BVFRSUwogCSAqIHRoaXMgYnVnIHdpbGwgdHJpZ2dlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCAwNDEwZTFiLi5kZTU2NGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtNTksNyArNTksNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KIAogI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgpAQCAtMTI1LDcgKzEyNCw3IEBACiBzdGF0aWMgdm9pZCBzZF9lbmRfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogc3RhdGljIGludCBzZF9wcmVwYXJlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIHN0YXRpYyB2b2lkIHNkX3JlYWRfY2FwYWNpdHkoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCi0JCSBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2RyaXZlciBzZF90ZW1wbGF0ZSA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLApAQCAtNjgyLDE5ICs2ODEsMTMgQEAKIAogc3RhdGljIGludCBzZF9zeW5jX2NhY2hlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RwKQogewotCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CiAJaW50IHJldHJpZXMsIHJlczsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAKIAlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzZHApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNyZXEpIHsKLQkJcHJpbnRrKCJGQUlMRURcbiAgTm8gbWVtb3J5IGZvciByZXF1ZXN0XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCi0Jc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKIAlmb3IgKHJldHJpZXMgPSAzOyByZXRyaWVzID4gMDsgLS1yZXRyaWVzKSB7CiAJCXVuc2lnbmVkIGNoYXIgY21kWzEwXSA9IHsgMCB9OwogCkBAIC03MDMsMjIgKzY5NiwyMCBAQAogCQkgKiBMZWF2ZSB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCB6ZXJvIHRvIGluZGljYXRlCiAJCSAqIGZsdXNoIGV2ZXJ5dGhpbmcuCiAJCSAqLwotCQlzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgTlVMTCwgMCwgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOwotCQlpZiAoc3JlcS0+c3JfcmVzdWx0ID09IDApCisJCXJlcyA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RwLCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLCAmc3NoZHIsCisJCQkJICAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKKwkJaWYgKHJlcyA9PSAwKQogCQkJYnJlYWs7CiAJfQogCi0JcmVzID0gc3JlcS0+c3JfcmVzdWx0OwotCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkFJTEVEXG4gIHN0YXR1cyA9ICV4LCBtZXNzYWdlID0gJTAyeCwgIgorCWlmIChyZXMpIHsJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZBSUxFRFxuICBzdGF0dXMgPSAleCwgbWVzc2FnZSA9ICUwMngsICIKIAkJCQkgICAgImhvc3QgPSAlZCwgZHJpdmVyID0gJTAyeFxuICAiLAogCQkJCSAgICBzdGF0dXNfYnl0ZShyZXMpLCBtc2dfYnl0ZShyZXMpLAogCQkJCSAgICBob3N0X2J5dGUocmVzKSwgZHJpdmVyX2J5dGUocmVzKSk7CiAJCQlpZiAoZHJpdmVyX2J5dGUocmVzKSAmIERSSVZFUl9TRU5TRSkKLQkJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic2QiLCBzcmVxKTsKKwkJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigic2QiLCAmc3NoZHIpOwogCX0KIAotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTk1NywyMiArOTQ4LDE5IEBACiAJc2NzaV9pb19jb21wbGV0aW9uKFNDcG50LCBnb29kX2J5dGVzLCBibG9ja19zZWN0b3JzIDw8IDkpOwogfQogCi1zdGF0aWMgaW50IG1lZGlhX25vdF9wcmVzZW50KHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNycCkKK3N0YXRpYyBpbnQgbWVkaWFfbm90X3ByZXNlbnQoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwKKwkJCSAgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKIHsKLQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAKLQlpZiAoIXNycC0+c3JfcmVzdWx0KQotCQlyZXR1cm4gMDsKLQlpZiAoIShkcml2ZXJfYnl0ZShzcnAtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpKQorCWlmICghc2NzaV9zZW5zZV92YWxpZChzc2hkcikpCiAJCXJldHVybiAwOwogCS8qIG5vdCBpbnZva2VkIGZvciBjb21tYW5kcyB0aGF0IGNvdWxkIHJldHVybiBkZWZlcnJlZCBlcnJvcnMgKi8KLQlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcnAsICZzc2hkcikpIHsKLQkJaWYgKHNzaGRyLnNlbnNlX2tleSAhPSBOT1RfUkVBRFkgJiYKLQkJICAgIHNzaGRyLnNlbnNlX2tleSAhPSBVTklUX0FUVEVOVElPTikKLQkJCXJldHVybiAwOwotCQlpZiAoc3NoZHIuYXNjICE9IDB4M0EpIC8qIG1lZGl1bSBub3QgcHJlc2VudCAqLwotCQkJcmV0dXJuIDA7Ci0JfQorCWlmIChzc2hkci0+c2Vuc2Vfa2V5ICE9IE5PVF9SRUFEWSAmJgorCSAgICBzc2hkci0+c2Vuc2Vfa2V5ICE9IFVOSVRfQVRURU5USU9OKQorCQlyZXR1cm4gMDsKKwlpZiAoc3NoZHItPmFzYyAhPSAweDNBKSAvKiBtZWRpdW0gbm90IHByZXNlbnQgKi8KKwkJcmV0dXJuIDA7CisKIAlzZXRfbWVkaWFfbm90X3ByZXNlbnQoc2RrcCk7CiAJcmV0dXJuIDE7CiB9CkBAIC05ODEsMTAgKzk2OSwxMCBAQAogICogc3BpbnVwIGRpc2sgLSBjYWxsZWQgb25seSBpbiBzZF9yZXZhbGlkYXRlX2Rpc2soKQogICovCiBzdGF0aWMgdm9pZAotc2Rfc3BpbnVwX2Rpc2soc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCi0JICAgICAgIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpIHsKK3NkX3NwaW51cF9kaXNrKHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIGNoYXIgKmRpc2tuYW1lKQorewogCXVuc2lnbmVkIGNoYXIgY21kWzEwXTsKLQl1bnNpZ25lZCBsb25nIHNwaW50aW1lX3ZhbHVlID0gMDsKKwl1bnNpZ25lZCBsb25nIHNwaW50aW1lX2V4cGlyZSA9IDA7CiAJaW50IHJldHJpZXMsIHNwaW50aW1lOwogCXVuc2lnbmVkIGludCB0aGVfcmVzdWx0OwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKQEAgLTEwMDEsMTggKzk4OSwxMyBAQAogCQkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOwogCQkJbWVtc2V0KCh2b2lkICopICZjbWRbMV0sIDAsIDkpOwogCi0JCQlTUnBudC0+c3JfY21kX2xlbiA9IDA7Ci0JCQltZW1zZXQoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlciwgMCwKLQkJCSAgICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwotCQkJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJCQl0aGVfcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGtwLT5kZXZpY2UsIGNtZCwKKwkJCQkJCSAgICAgIERNQV9OT05FLCBOVUxMLCAwLAorCQkJCQkJICAgICAgJnNzaGRyLCBTRF9USU1FT1VULAorCQkJCQkJICAgICAgU0RfTUFYX1JFVFJJRVMpOwogCi0JCQlzY3NpX3dhaXRfcmVxIChTUnBudCwgKHZvaWQgKikgY21kLCAodm9pZCAqKSBidWZmZXIsCi0JCQkJICAgICAgIDAvKjUxMiovLCBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7Ci0KLQkJCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OwogCQkJaWYgKHRoZV9yZXN1bHQpCi0JCQkJc2Vuc2VfdmFsaWQgPSBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKAotCQkJCQkJCVNScG50LCAmc3NoZHIpOworCQkJCXNlbnNlX3ZhbGlkID0gc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpOwogCQkJcmV0cmllcysrOwogCQl9IHdoaWxlIChyZXRyaWVzIDwgMyAmJiAKIAkJCSAoIXNjc2lfc3RhdHVzX2lzX2dvb2QodGhlX3Jlc3VsdCkgfHwKQEAgLTEwMjQsNyArMTAwNyw3IEBACiAJCSAqIGFueSBtZWRpYSBpbiBpdCwgZG9uJ3QgYm90aGVyIHdpdGggYW55IG9mIHRoZSByZXN0IG9mCiAJCSAqIHRoaXMgY3JhcC4KIAkJICovCi0JCWlmIChtZWRpYV9ub3RfcHJlc2VudChzZGtwLCBTUnBudCkpCisJCWlmIChtZWRpYV9ub3RfcHJlc2VudChzZGtwLCAmc3NoZHIpKQogCQkJcmV0dXJuOwogCiAJCWlmICgoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpID09IDApIHsKQEAgLTEwNjMsMzMgKzEwNDYsNDIgQEAKIAkJCQljbWRbMV0gPSAxOwkvKiBSZXR1cm4gaW1tZWRpYXRlbHkgKi8KIAkJCQltZW1zZXQoKHZvaWQgKikgJmNtZFsyXSwgMCwgOCk7CiAJCQkJY21kWzRdID0gMTsJLyogU3RhcnQgc3BpbiBjeWNsZSAqLwotCQkJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKLQkJCQltZW1zZXQoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlciwgMCwKLQkJCQkJU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKLQotCQkJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOwotCQkJCXNjc2lfd2FpdF9yZXEoU1JwbnQsICh2b2lkICopY21kLCAKLQkJCQkJICAgICAgKHZvaWQgKikgYnVmZmVyLCAwLyo1MTIqLywgCi0JCQkJCSAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKLQkJCQlzcGludGltZV92YWx1ZSA9IGppZmZpZXM7CisJCQkJc2NzaV9leGVjdXRlX3JlcShzZGtwLT5kZXZpY2UsIGNtZCwgRE1BX05PTkUsCisJCQkJCQkgTlVMTCwgMCwgJnNzaGRyLAorCQkJCQkJIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKKwkJCQlzcGludGltZV9leHBpcmUgPSBqaWZmaWVzICsgMTAwICogSFo7CisJCQkJc3BpbnRpbWUgPSAxOwogCQkJfQotCQkJc3BpbnRpbWUgPSAxOwogCQkJLyogV2FpdCAxIHNlY29uZCBmb3IgbmV4dCB0cnkgKi8KIAkJCW1zbGVlcCgxMDAwKTsKIAkJCXByaW50aygiLiIpOworCisJCS8qCisJCSAqIFdhaXQgZm9yIFVTQiBmbGFzaCBkZXZpY2VzIHdpdGggc2xvdyBmaXJtd2FyZS4KKwkJICogWWVzLCB0aGlzIHNlbnNlIGtleS9BU0MgY29tYmluYXRpb24gc2hvdWxkbid0CisJCSAqIG9jY3VyIGhlcmUuICBJdCdzIGNoYXJhY3RlcmlzdGljIG9mIHRoZXNlIGRldmljZXMuCisJCSAqLworCQl9IGVsc2UgaWYgKHNlbnNlX3ZhbGlkICYmCisJCQkJc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OICYmCisJCQkJc3NoZHIuYXNjID09IDB4MjgpIHsKKwkJCWlmICghc3BpbnRpbWUpIHsKKwkJCQlzcGludGltZV9leHBpcmUgPSBqaWZmaWVzICsgNSAqIEhaOworCQkJCXNwaW50aW1lID0gMTsKKwkJCX0KKwkJCS8qIFdhaXQgMSBzZWNvbmQgZm9yIG5leHQgdHJ5ICovCisJCQltc2xlZXAoMTAwMCk7CiAJCX0gZWxzZSB7CiAJCQkvKiB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoZSBzZW5zZSBjb2RlLCBzbyBpdCdzCiAJCQkgKiBwcm9iYWJseSBwb2ludGxlc3MgdG8gbG9vcCAqLwogCQkJaWYoIXNwaW50aW1lKSB7CiAJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5pdCBOb3QgUmVhZHksICIKIAkJCQkJInNlbnNlOlxuIiwgZGlza25hbWUpOwotCQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCIiLCBTUnBudCk7CisJCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoIiIsICZzc2hkcik7CiAJCQl9CiAJCQlicmVhazsKIAkJfQogCQkJCQotCX0gd2hpbGUgKHNwaW50aW1lICYmCi0JCSB0aW1lX2FmdGVyKHNwaW50aW1lX3ZhbHVlICsgMTAwICogSFosIGppZmZpZXMpKTsKKwl9IHdoaWxlIChzcGludGltZSAmJiB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBzcGludGltZV9leHBpcmUpKTsKIAogCWlmIChzcGludGltZSkgewogCQlpZiAoc2NzaV9zdGF0dXNfaXNfZ29vZCh0aGVfcmVzdWx0KSkKQEAgLTExMDQsMTQgKzEwOTYsMTUgQEAKICAqLwogc3RhdGljIHZvaWQKIHNkX3JlYWRfY2FwYWNpdHkoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCi0JCSBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKSB7CisJCSB1bnNpZ25lZCBjaGFyICpidWZmZXIpCit7CiAJdW5zaWduZWQgY2hhciBjbWRbMTZdOwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOwogCWludCB0aGVfcmVzdWx0LCByZXRyaWVzOwogCWludCBzZWN0b3Jfc2l6ZSA9IDA7CiAJaW50IGxvbmdyYyA9IDA7CiAJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCWludCBzZW5zZV92YWxpZCA9IDA7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzZGtwLT5kZXZpY2U7CiAKIHJlcGVhdDoKIAlyZXRyaWVzID0gMzsKQEAgLTExMjgsMjAgKzExMjEsMTUgQEAKIAkJCW1lbXNldCgodm9pZCAqKSBidWZmZXIsIDAsIDgpOwogCQl9CiAJCQotCQlTUnBudC0+c3JfY21kX2xlbiA9IDA7Ci0JCW1lbXNldChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwotCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCXRoZV9yZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkcCwgY21kLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJCSAgICAgIGJ1ZmZlciwgbG9uZ3JjID8gMTIgOiA4LCAmc3NoZHIsCisJCQkJCSAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKIAotCQlzY3NpX3dhaXRfcmVxKFNScG50LCAodm9pZCAqKSBjbWQsICh2b2lkICopIGJ1ZmZlciwKLQkJCSAgICAgIGxvbmdyYyA/IDEyIDogOCwgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOwotCi0JCWlmIChtZWRpYV9ub3RfcHJlc2VudChzZGtwLCBTUnBudCkpCisJCWlmIChtZWRpYV9ub3RfcHJlc2VudChzZGtwLCAmc3NoZHIpKQogCQkJcmV0dXJuOwogCi0JCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OwogCQlpZiAodGhlX3Jlc3VsdCkKLQkJCXNlbnNlX3ZhbGlkID0gc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShTUnBudCwKLQkJCQkJCQkJICAgJnNzaGRyKTsKKwkJCXNlbnNlX3ZhbGlkID0gc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpOwogCQlyZXRyaWVzLS07CiAKIAl9IHdoaWxlICh0aGVfcmVzdWx0ICYmIHJldHJpZXMpOwpAQCAtMTE1Niw3ICsxMTQ0LDcgQEAKIAkJICAgICAgIGRyaXZlcl9ieXRlKHRoZV9yZXN1bHQpKTsKIAogCQlpZiAoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpCi0JCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic2QiLCBTUnBudCk7CisJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigic2QiLCAmc3NoZHIpOwogCQllbHNlCiAJCQlwcmludGsoIiVzIDogc2Vuc2Ugbm90IGF2YWlsYWJsZS4gXG4iLCBkaXNrbmFtZSk7CiAKQEAgLTEyOTYsMTEgKzEyODQsMTMgQEAKIAogLyogY2FsbGVkIHdpdGggYnVmZmVyIG9mIGxlbmd0aCA1MTIgKi8KIHN0YXRpYyBpbmxpbmUgaW50Ci1zZF9kb19tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCBpbnQgZGJkLCBpbnQgbW9kZXBhZ2UsCi0JCSB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sIHN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSkKK3NkX2RvX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZHAsIGludCBkYmQsIGludCBtb2RlcGFnZSwKKwkJIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhLAorCQkgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKIHsKLQlyZXR1cm4gX19zY3NpX21vZGVfc2Vuc2UoU1JwbnQsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLAotCQkJCSBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUywgZGF0YSk7CisJcmV0dXJuIHNjc2lfbW9kZV9zZW5zZShzZHAsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLAorCQkJICAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTLCBkYXRhLAorCQkJICAgICAgIHNzaGRyKTsKIH0KIAogLyoKQEAgLTEzMDksMjUgKzEyOTksMjcgQEAKICAqLwogc3RhdGljIHZvaWQKIHNkX3JlYWRfd3JpdGVfcHJvdGVjdF9mbGFnKHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIGNoYXIgKmRpc2tuYW1lLAotCQkgICBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKSB7CisJCQkgICB1bnNpZ25lZCBjaGFyICpidWZmZXIpCit7CiAJaW50IHJlczsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKIAlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgZGF0YTsKIAogCXNldF9kaXNrX3JvKHNka3AtPmRpc2ssIDApOwotCWlmIChzZGtwLT5kZXZpY2UtPnNraXBfbXNfcGFnZV8zZikgeworCWlmIChzZHAtPnNraXBfbXNfcGFnZV8zZikgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBhc3N1bWluZyBXcml0ZSBFbmFibGVkXG4iLCBkaXNrbmFtZSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoc2RrcC0+ZGV2aWNlLT51c2VfMTkyX2J5dGVzX2Zvcl8zZikgewotCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKFNScG50LCAwLCAweDNGLCBidWZmZXIsIDE5MiwgJmRhdGEpOworCWlmIChzZHAtPnVzZV8xOTJfYnl0ZXNfZm9yXzNmKSB7CisJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2Uoc2RwLCAwLCAweDNGLCBidWZmZXIsIDE5MiwgJmRhdGEsIE5VTEwpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEZpcnN0IGF0dGVtcHQ6IGFzayBmb3IgYWxsIHBhZ2VzICgweDNGKSwgYnV0IG9ubHkgNCBieXRlcy4KIAkJICogV2UgaGF2ZSB0byBzdGFydCBjYXJlZnVsbHk6IHNvbWUgZGV2aWNlcyBoYW5nIGlmIHdlIGFzawogCQkgKiBmb3IgbW9yZSB0aGFuIGlzIGF2YWlsYWJsZS4KIAkJICovCi0JCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIDAsIDB4M0YsIGJ1ZmZlciwgNCwgJmRhdGEpOworCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKHNkcCwgMCwgMHgzRiwgYnVmZmVyLCA0LCAmZGF0YSwgTlVMTCk7CiAKIAkJLyoKIAkJICogU2Vjb25kIGF0dGVtcHQ6IGFzayBmb3IgcGFnZSAwIFdoZW4gb25seSBwYWdlIDAgaXMKQEAgLTEzMzYsMTQgKzEzMjgsMTQgQEAKIAkJICogQ0RCLgogCQkgKi8KIAkJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpCi0JCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKFNScG50LCAwLCAwLCBidWZmZXIsIDQsICZkYXRhKTsKKwkJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2Uoc2RwLCAwLCAwLCBidWZmZXIsIDQsICZkYXRhLCBOVUxMKTsKIAogCQkvKgogCQkgKiBUaGlyZCBhdHRlbXB0OiBhc2sgMjU1IGJ5dGVzLCBhcyB3ZSBkaWQgZWFybGllci4KIAkJICovCiAJCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpKQotCQkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgMCwgMHgzRiwgYnVmZmVyLCAyNTUsCi0JCQkJCSAgICAgICAmZGF0YSk7CisJCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKHNkcCwgMCwgMHgzRiwgYnVmZmVyLCAyNTUsCisJCQkJCSAgICAgICAmZGF0YSwgTlVMTCk7CiAJfQogCiAJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpIHsKQEAgLTEzNjUsMTkgKzEzNTcsMjAgQEAKICAqLwogc3RhdGljIHZvaWQKIHNkX3JlYWRfY2FjaGVfdHlwZShzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKLQkJICAgc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKKwkJICAgdW5zaWduZWQgY2hhciAqYnVmZmVyKQogewogCWludCBsZW4gPSAwLCByZXM7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzZGtwLT5kZXZpY2U7CiAKIAlpbnQgZGJkOwogCWludCBtb2RlcGFnZTsKIAlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgZGF0YTsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAKLQlpZiAoc2RrcC0+ZGV2aWNlLT5za2lwX21zX3BhZ2VfOCkKKwlpZiAoc2RwLT5za2lwX21zX3BhZ2VfOCkKIAkJZ290byBkZWZhdWx0czsKIAotCWlmIChzZGtwLT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9SQkMpIHsKKwlpZiAoc2RwLT50eXBlID09IFRZUEVfUkJDKSB7CiAJCW1vZGVwYWdlID0gNjsKIAkJZGJkID0gODsKIAl9IGVsc2UgewpAQCAtMTM4Niw3ICsxMzc5LDcgQEAKIAl9CiAKIAkvKiBjYXV0aW91c2x5IGFzayAqLwotCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgNCwgJmRhdGEpOworCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2Uoc2RwLCBkYmQsIG1vZGVwYWdlLCBidWZmZXIsIDQsICZkYXRhLCAmc3NoZHIpOwogCiAJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpCiAJCWdvdG8gYmFkX3NlbnNlOwpAQCAtMTQwNyw3ICsxNDAwLDcgQEAKIAlsZW4gKz0gZGF0YS5oZWFkZXJfbGVuZ3RoICsgZGF0YS5ibG9ja19kZXNjcmlwdG9yX2xlbmd0aDsKIAogCS8qIEdldCB0aGUgZGF0YSAqLwotCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLCAmZGF0YSk7CisJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShzZHAsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLCAmZGF0YSwgJnNzaGRyKTsKIAogCWlmIChzY3NpX3N0YXR1c19pc19nb29kKHJlcykpIHsKIAkJY29uc3QgY2hhciAqdHlwZXNbXSA9IHsKQEAgLTE0MzksNyArMTQzMiw3IEBACiAJfQogCiBiYWRfc2Vuc2U6Ci0JaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2UoU1JwbnQsICZzc2hkcikgJiYKKwlpZiAoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpICYmCiAJICAgIHNzaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QgJiYKIAkgICAgc3NoZHIuYXNjID09IDB4MjQgJiYgc3NoZHIuYXNjcSA9PSAweDApCiAJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNhY2hlIGRhdGEgdW5hdmFpbGFibGVcbiIsCkBAIC0xNDY0LDcgKzE0NTcsNiBAQAogewogCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBzY3NpX2Rpc2soZGlzayk7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzZGtwLT5kZXZpY2U7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAKIAlTQ1NJX0xPR19ITFFVRVVFKDMsIHByaW50aygic2RfcmV2YWxpZGF0ZV9kaXNrOiBkaXNrPSVzXG4iLCBkaXNrLT5kaXNrX25hbWUpKTsKQEAgLTE0NzYsMTggKzE0NjgsMTEgQEAKIAlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzZHApKQogCQlnb3RvIG91dDsKIAotCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNyZXEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiKHNkX3JldmFsaWRhdGVfZGlzazopIFJlcXVlc3QgYWxsb2NhdGlvbiAiCi0JCSAgICAgICAiZmFpbHVyZS5cbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlidWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiKHNkX3JldmFsaWRhdGVfZGlzazopIE1lbW9yeSBhbGxvY2F0aW9uICIKIAkJICAgICAgICJmYWlsdXJlLlxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVxdWVzdDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogZGVmYXVsdHMsIHVudGlsIHRoZSBkZXZpY2UgdGVsbHMgdXMgb3RoZXJ3aXNlICovCkBAIC0xNDk4LDI1ICsxNDgzLDIzIEBACiAJc2RrcC0+V0NFID0gMDsKIAlzZGtwLT5SQ0QgPSAwOwogCi0Jc2Rfc3BpbnVwX2Rpc2soc2RrcCwgZGlzay0+ZGlza19uYW1lLCBzcmVxLCBidWZmZXIpOworCXNkX3NwaW51cF9kaXNrKHNka3AsIGRpc2stPmRpc2tfbmFtZSk7CiAKIAkvKgogCSAqIFdpdGhvdXQgbWVkaWEgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGFzazsgbW9yZW92ZXIsIHNvbWUgZGV2aWNlcwogCSAqIHJlYWN0IGJhZGx5IGlmIHdlIGRvLgogCSAqLwogCWlmIChzZGtwLT5tZWRpYV9wcmVzZW50KSB7Ci0JCXNkX3JlYWRfY2FwYWNpdHkoc2RrcCwgZGlzay0+ZGlza19uYW1lLCBzcmVxLCBidWZmZXIpOworCQlzZF9yZWFkX2NhcGFjaXR5KHNka3AsIGRpc2stPmRpc2tfbmFtZSwgYnVmZmVyKTsKIAkJaWYgKHNkcC0+cmVtb3ZhYmxlKQogCQkJc2RfcmVhZF93cml0ZV9wcm90ZWN0X2ZsYWcoc2RrcCwgZGlzay0+ZGlza19uYW1lLAotCQkJCQlzcmVxLCBidWZmZXIpOwotCQlzZF9yZWFkX2NhY2hlX3R5cGUoc2RrcCwgZGlzay0+ZGlza19uYW1lLCBzcmVxLCBidWZmZXIpOworCQkJCQkJICAgYnVmZmVyKTsKKwkJc2RfcmVhZF9jYWNoZV90eXBlKHNka3AsIGRpc2stPmRpc2tfbmFtZSwgYnVmZmVyKTsKIAl9CiAJCQogCXNldF9jYXBhY2l0eShkaXNrLCBzZGtwLT5jYXBhY2l0eSk7CiAJa2ZyZWUoYnVmZmVyKTsKIAotIG91dF9yZWxlYXNlX3JlcXVlc3Q6IAotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOwogIG91dDoKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggZTgyMmNhMC4uYjFiNjlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci1zdGF0aWMgY2hhciAqc2dfdmVyc2lvbl9kYXRlID0gIjIwMDUwMzI4IjsKK3N0YXRpYyBjaGFyICpzZ192ZXJzaW9uX2RhdGUgPSAiMjAwNTA5MDEiOwogCiBzdGF0aWMgaW50IHNnX3Byb2NfaW5pdCh2b2lkKTsKIHN0YXRpYyB2b2lkIHNnX3Byb2NfY2xlYW51cCh2b2lkKTsKQEAgLTEwMjcsOCArMTAyNyw3IEBACiAJCWlmIChzZHAtPmRldGFjaGVkKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJaWYgKHRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLAotCQkJCSAgICAgJnNkcC0+ZGV2aWNlLT5ob3N0LT5zaG9zdF9zdGF0ZSkpCisJCQlpZiAoc2RwLT5kZXZpY2UtPmhvc3QtPnNob3N0X3N0YXRlID09IFNIT1NUX1JFQ09WRVJZKQogCQkJCXJldHVybiAtRUJVU1k7CiAJCX0gZWxzZSBpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZHAtPmRldmljZSkpCiAJCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTc5NSwxMiArMTc5NCwxMiBAQAogCSAgICAgICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydywKIAkgICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQogeworCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgY291bnQgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB1YWRkciA+PiBQQUdFX1NISUZUOworCWNvbnN0IGludCBucl9wYWdlcyA9IGVuZCAtIHN0YXJ0OwogCWludCByZXMsIGksIGo7Ci0JdW5zaWduZWQgaW50IG5yX3BhZ2VzOwogCXN0cnVjdCBwYWdlICoqcGFnZXM7CiAKLQlucl9wYWdlcyA9ICgodWFkZHIgJiB+UEFHRV9NQVNLKSArIGNvdW50ICsgflBBR0VfTUFTSykgPj4gUEFHRV9TSElGVDsKLQogCS8qIFVzZXIgYXR0ZW1wdGVkIE92ZXJmbG93ISAqLwogCWlmICgodWFkZHIgKyBjb3VudCkgPCB1YWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuYyBiL2RyaXZlcnMvc2NzaS9zci5jCmluZGV4IDJmMjU5ZjIuLmNlNjNmYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zci5jCkBAIC01MCwxMCArNTAsMTAgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CS8qIEZvciB0aGUgZG9vciBsb2NrL3VubG9jayBjb21tYW5kcyAqLwotI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CiAKICNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKICNpbmNsdWRlICJzci5oIgpAQCAtMTk5LDE1ICsxOTksNyBAQAogCQkvKiBjaGVjayBtdWx0aXNlc3Npb24gb2Zmc2V0IGV0YyAqLwogCQlzcl9jZF9jaGVjayhjZGkpOwogCi0JCS8qIAotCQkgKiBJZiB0aGUgZGlzayBjaGFuZ2VkLCB0aGUgY2FwYWNpdHkgd2lsbCBub3cgYmUgZGlmZmVyZW50LAotCQkgKiBzbyB3ZSBmb3JjZSBhIHJlLXJlYWQgb2YgdGhpcyBpbmZvcm1hdGlvbiAKLQkJICogRm9yY2UgMjA0OCBmb3IgdGhlIHNlY3RvciBzaXplIHNvIHRoYXQgZmlsZXN5c3RlbXMgd29uJ3QKLQkJICogYmUgdHJ5aW5nIHRvIHVzZSBzb21ldGhpbmcgdGhhdCBpcyB0b28gc21hbGwgaWYgdGhlIGRpc2MKLQkJICogaGFzIGNoYW5nZWQuCi0JCSAqLwotCQljZC0+bmVlZHNfc2VjdG9yX3NpemUgPSAxOwotCQljZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSA9IDIwNDg7CisJCWdldF9zZWN0b3JzaXplKGNkKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTUzOCwxMyArNTMwLDYgQEAKIAlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZGV2KSkKIAkJZ290byBlcnJvcl9vdXQ7CiAKLQkvKgotCSAqIElmIHRoaXMgZGV2aWNlIGRpZCBub3QgaGF2ZSBtZWRpYSBpbiB0aGUgZHJpdmUgYXQgYm9vdCB0aW1lLCB0aGVuCi0JICogd2Ugd291bGQgaGF2ZSBiZWVuIHVuYWJsZSB0byBnZXQgdGhlIHNlY3RvciBzaXplLiAgQ2hlY2sgdG8gc2VlIGlmCi0JICogdGhpcyBpcyB0aGUgY2FzZSwgYW5kIHRyeSBhZ2Fpbi4KLQkgKi8KLQlpZiAoY2QtPm5lZWRzX3NlY3Rvcl9zaXplKQotCQlnZXRfc2VjdG9yc2l6ZShjZCk7CiAJcmV0dXJuIDA7CiAKIGVycm9yX291dDoKQEAgLTYwNCw3ICs1ODksNiBAQAogCWNkLT5kcml2ZXIgPSAmc3JfdGVtcGxhdGU7CiAJY2QtPmRpc2sgPSBkaXNrOwogCWNkLT5jYXBhY2l0eSA9IDB4MWZmZmZmOwotCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDE7CiAJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDE7CS8qIGZvcmNlIHJlY2hlY2sgQ0QgdHlwZSAqLwogCWNkLT51c2UgPSAxOwogCWNkLT5yZWFkY2Rfa25vd24gPSAwOwpAQCAtNjU4LDQzICs2NDIsMzAgQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJaW50IHRoZV9yZXN1bHQsIHJldHJpZXMgPSAzOwogCWludCBzZWN0b3Jfc2l6ZTsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCA9IE5VTEw7CiAJcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZTsKIAogCWJ1ZmZlciA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpCiAJCWdvdG8gRW5vbWVtOwotCVNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGNkLT5kZXZpY2UsIEdGUF9LRVJORUwpOwotCWlmICghU1JwbnQpCi0JCWdvdG8gRW5vbWVtOwogCiAJZG8gewogCQljbWRbMF0gPSBSRUFEX0NBUEFDSVRZOwogCQltZW1zZXQoKHZvaWQgKikgJmNtZFsxXSwgMCwgOSk7Ci0JCS8qIE1hcmsgYXMgcmVhbGx5IGJ1c3kgKi8KLQkJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKLQkJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOwotCiAJCW1lbXNldChidWZmZXIsIDAsIDgpOwogCiAJCS8qIERvIHRoZSBjb21tYW5kIGFuZCB3YWl0Li4gKi8KLQkJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwotCQlzY3NpX3dhaXRfcmVxKFNScG50LCAodm9pZCAqKSBjbWQsICh2b2lkICopIGJ1ZmZlciwKLQkJCSAgICAgIDgsIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTKTsKKwkJdGhlX3Jlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoY2QtPmRldmljZSwgY21kLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJCSAgICAgIGJ1ZmZlciwgOCwgTlVMTCwgU1JfVElNRU9VVCwKKwkJCQkJICAgICAgTUFYX1JFVFJJRVMpOwogCi0JCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OwogCQlyZXRyaWVzLS07CiAKIAl9IHdoaWxlICh0aGVfcmVzdWx0ICYmIHJldHJpZXMpOwogCiAKLQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7Ci0JU1JwbnQgPSBOVUxMOwotCiAJaWYgKHRoZV9yZXN1bHQpIHsKIAkJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CiAJCXNlY3Rvcl9zaXplID0gMjA0ODsJLyogQSBndWVzcywganVzdCBpbiBjYXNlICovCi0JCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDE7CiAJfSBlbHNlIHsKICNpZiAwCiAJCWlmIChjZHJvbV9nZXRfbGFzdF93cml0dGVuKCZjZC0+Y2RpLApAQCAtNzI3LDcgKzY5OCw2IEBACiAJCQlwcmludGsoIiVzOiB1bnN1cHBvcnRlZCBzZWN0b3Igc2l6ZSAlZC5cbiIsCiAJCQkgICAgICAgY2QtPmNkaS5uYW1lLCBzZWN0b3Jfc2l6ZSk7CiAJCQljZC0+Y2FwYWNpdHkgPSAwOwotCQkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKIAkJfQogCiAJCWNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID0gc2VjdG9yX3NpemU7CkBAIC03MzYsNyArNzA2LDYgQEAKIAkJICogQWRkIHRoaXMgc28gdGhhdCB3ZSBoYXZlIHRoZSBhYmlsaXR5IHRvIGNvcnJlY3RseSBnYXVnZQogCQkgKiB3aGF0IHRoZSBkZXZpY2UgaXMgY2FwYWJsZSBvZi4KIAkJICovCi0JCWNkLT5uZWVkc19zZWN0b3Jfc2l6ZSA9IDA7CiAJCXNldF9jYXBhY2l0eShjZC0+ZGlzaywgY2QtPmNhcGFjaXR5KTsKIAl9CiAKQEAgLTc0OCwxMCArNzE3LDcgQEAKIAogRW5vbWVtOgogCWNkLT5jYXBhY2l0eSA9IDB4MWZmZmZmOwotCXNlY3Rvcl9zaXplID0gMjA0ODsJLyogQSBndWVzcywganVzdCBpbiBjYXNlICovCi0JY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKLQlpZiAoU1JwbnQpCi0JCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwljZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSA9IDIwNDg7CS8qIEEgZ3Vlc3MsIGp1c3QgaW4gY2FzZSAqLwogCWdvdG8gb3V0OwogfQogCkBAIC03NTksOCArNzI1LDggQEAKIHsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJc3RydWN0IHNjc2lfbW9kZV9kYXRhIGRhdGE7Ci0Jc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQ7CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCXVuc2lnbmVkIGludCB0aGVfcmVzdWx0OwogCWludCByZXRyaWVzLCByYywgbjsKIApAQCAtNzc2LDE5ICs3NDIsMTEgQEAKIAkJIiIKIAl9OwogCi0JLyogYWxsb2NhdGUgYSByZXF1ZXN0IGZvciB0aGUgVEVTVF9VTklUX1JFQURZICovCi0JU1JwbnQgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoY2QtPmRldmljZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFTUnBudCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIoZ2V0X2NhcGFiaWxpdGllczopIFJlcXVlc3QgYWxsb2NhdGlvbiAiCi0JCSAgICAgICAiZmFpbHVyZS5cbiIpOwotCQlyZXR1cm47Ci0JfQogCiAJLyogYWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyICovCiAJYnVmZmVyID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlwcmludGsoS0VSTl9FUlIgInNyOiBvdXQgb2YgbWVtb3J5LlxuIik7Ci0JCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODAwLDI0ICs3NTgsMTkgQEAKIAkJbWVtc2V0KCh2b2lkICopY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKIAkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOwogCi0JCVNScG50LT5zcl9jbWRfbGVuID0gMDsKLQkJU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSA9IDA7Ci0JCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gPSAwOwotCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwkJdGhlX3Jlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEgKGNkLT5kZXZpY2UsIGNtZCwgRE1BX05PTkUsIE5VTEwsCisJCQkJCSAgICAgICAwLCAmc3NoZHIsIFNSX1RJTUVPVVQsCisJCQkJCSAgICAgICBNQVhfUkVUUklFUyk7CiAKLQkJc2NzaV93YWl0X3JlcSAoU1JwbnQsICh2b2lkICopIGNtZCwgYnVmZmVyLAotCQkJICAgICAgIDAsIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTKTsKLQotCQl0aGVfcmVzdWx0ID0gU1JwbnQtPnNyX3Jlc3VsdDsKIAkJcmV0cmllcysrOwogCX0gd2hpbGUgKHJldHJpZXMgPCA1ICYmIAogCQkgKCFzY3NpX3N0YXR1c19pc19nb29kKHRoZV9yZXN1bHQpIHx8Ci0JCSAgKChkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKLQkJICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSA9PSBVTklUX0FUVEVOVElPTikpKTsKKwkJICAoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpICYmCisJCSAgIHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikpKTsKIAogCS8qIGFzayBmb3IgbW9kZSBwYWdlIDB4MmEgKi8KIAlyYyA9IHNjc2lfbW9kZV9zZW5zZShjZC0+ZGV2aWNlLCAwLCAweDJhLCBidWZmZXIsIDEyOCwKLQkJCSAgICAgU1JfVElNRU9VVCwgMywgJmRhdGEpOworCQkJICAgICBTUl9USU1FT1VULCAzLCAmZGF0YSwgTlVMTCk7CiAKIAlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmMpKSB7CiAJCS8qIGZhaWxlZCwgZHJpdmUgZG9lc24ndCBoYXZlIGNhcGFiaWxpdGllcyBtb2RlIHBhZ2UgKi8KQEAgLTgyNSw3ICs3NzgsNiBAQAogCQljZC0+Y2RpLm1hc2sgfD0gKENEQ19DRF9SIHwgQ0RDX0NEX1JXIHwgQ0RDX0RWRF9SIHwKIAkJCQkJIENEQ19EVkQgfCBDRENfRFZEX1JBTSB8CiAJCQkJCSBDRENfU0VMRUNUX0RJU0MgfCBDRENfU0VMRUNUX1NQRUVEKTsKLQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCQlrZnJlZShidWZmZXIpOwogCQlwcmludGsoIiVzOiBzY3NpLTEgZHJpdmVcbiIsIGNkLT5jZGkubmFtZSk7CiAJCXJldHVybjsKQEAgLTg4NSw3ICs4MzcsNiBAQAogCQljZC0+ZGV2aWNlLT53cml0ZWFibGUgPSAxOwogCX0KIAotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAlrZnJlZShidWZmZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuaCBiL2RyaXZlcnMvc2NzaS9zci5oCmluZGV4IDBiMzE3ODAuLmQyYmNkOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5oCisrKyBiL2RyaXZlcnMvc2NzaS9zci5oCkBAIC0zMyw3ICszMyw2IEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2U7CiAJdW5zaWduZWQgaW50IHZlbmRvcjsJLyogdmVuZG9yIGNvZGUsIHNlZSBzcl92ZW5kb3IuYyAgICAgICAgICovCiAJdW5zaWduZWQgbG9uZyBtc19vZmZzZXQ7CS8qIGZvciByZWFkaW5nIG11bHRpc2Vzc2lvbi1DRCdzICAgICAgICAqLwotCXVuc2lnbmVkIG5lZWRzX3NlY3Rvcl9zaXplOjE7CS8qIG5lZWRzIHRvIGdldCBzZWN0b3Igc2l6ZSAqLwogCXVuc2lnbmVkIHVzZToxOwkJLyogaXMgdGhpcyBkZXZpY2Ugc3RpbGwgc3VwcG9ydGFibGUgICAgICovCiAJdW5zaWduZWQgeGFfZmxhZzoxOwkvKiBDRCBoYXMgWEEgc2VjdG9ycyA/ICovCiAJdW5zaWduZWQgcmVhZGNkX2tub3duOjE7CS8qIGRyaXZlIHN1cHBvcnRzIFJFQURfQ0QgKDB4YmUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCmluZGV4IDgyZDY4ZmQuLjZlNDVhYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKICNpbmNsdWRlICJzci5oIgogCkBAIC04NCw0MSArODQsMzcgQEAKIAogaW50IHNyX2RvX2lvY3RsKFNjc2lfQ0QgKmNkLCBzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKIHsKLQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEZXY7Ci0gICAgICAgIHN0cnVjdCByZXF1ZXN0ICpyZXE7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCWludCByZXN1bHQsIGVyciA9IDAsIHJldHJpZXMgPSAwOworCXN0cnVjdCByZXF1ZXN0X3NlbnNlICpzZW5zZSA9IGNnYy0+c2Vuc2U7CiAKIAlTRGV2ID0gY2QtPmRldmljZTsKLQlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChTRGV2LCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKCFTUnBudCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIFNDU0kgcmVxdWVzdCBpbiBzcl9kb19pb2N0bCIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLSAgICAgICAgfQotCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IGNnYy0+ZGF0YV9kaXJlY3Rpb247CisKKwlpZiAoIXNlbnNlKSB7CisJCXNlbnNlID0ga21hbGxvYyhzaXplb2YoKnNlbnNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2Vuc2UpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KIAogICAgICAgcmV0cnk6CiAJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoU0RldikpIHsKIAkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfZnJlZTsKKwkJZ290byBvdXQ7CiAJfQogCi0Jc2NzaV93YWl0X3JlcShTUnBudCwgY2djLT5jbWQsIGNnYy0+YnVmZmVyLCBjZ2MtPmJ1ZmxlbiwKLQkJICAgICAgY2djLT50aW1lb3V0LCBJT0NUTF9SRVRSSUVTKTsKKwltZW1zZXQoc2Vuc2UsIDAsIHNpemVvZigqc2Vuc2UpKTsKKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGUoU0RldiwgY2djLT5jbWQsIGNnYy0+ZGF0YV9kaXJlY3Rpb24sCisJCQkgICAgICBjZ2MtPmJ1ZmZlciwgY2djLT5idWZsZW4sIChjaGFyICopc2Vuc2UsCisJCQkgICAgICBjZ2MtPnRpbWVvdXQsIElPQ1RMX1JFVFJJRVMsIDApOwogCi0JcmVxID0gU1JwbnQtPnNyX3JlcXVlc3Q7Ci0JaWYgKFNScG50LT5zcl9idWZmZXIgJiYgcmVxLT5idWZmZXIgJiYgU1JwbnQtPnNyX2J1ZmZlciAhPSByZXEtPmJ1ZmZlcikgewotCQltZW1jcHkocmVxLT5idWZmZXIsIFNScG50LT5zcl9idWZmZXIsIFNScG50LT5zcl9idWZmbGVuKTsKLQkJa2ZyZWUoU1JwbnQtPnNyX2J1ZmZlcik7Ci0JCVNScG50LT5zcl9idWZmZXIgPSByZXEtPmJ1ZmZlcjsKLSAgICAgICAgfQotCi0JcmVzdWx0ID0gU1JwbnQtPnNyX3Jlc3VsdDsKKwlzY3NpX25vcm1hbGl6ZV9zZW5zZSgoY2hhciAqKXNlbnNlLCBzaXplb2YoKnNlbnNlKSwgJnNzaGRyKTsKIAogCS8qIE1pbmltYWwgZXJyb3IgY2hlY2tpbmcuICBJZ25vcmUgY2FzZXMgd2Uga25vdyBhYm91dCwgYW5kIHJlcG9ydCB0aGUgcmVzdC4gKi8KIAlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAhPSAwKSB7Ci0JCXN3aXRjaCAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4ZikgeworCQlzd2l0Y2ggKHNzaGRyLnNlbnNlX2tleSkgewogCQljYXNlIFVOSVRfQVRURU5USU9OOgogCQkJU0Rldi0+Y2hhbmdlZCA9IDE7CiAJCQlpZiAoIWNnYy0+cXVpZXQpCkBAIC0xMjgsOCArMTI0LDggQEAKIAkJCWVyciA9IC1FTk9NRURJVU07CiAJCQlicmVhazsKIAkJY2FzZSBOT1RfUkVBRFk6CS8qIFRoaXMgaGFwcGVucyBpZiB0aGVyZSBpcyBubyBkaXNjIGluIGRyaXZlICovCi0JCQlpZiAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gPT0gMHgwNCAmJgotCQkJICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdID09IDB4MDEpIHsKKwkJCWlmIChzc2hkci5hc2MgPT0gMHgwNCAmJgorCQkJICAgIHNzaGRyLmFzY3EgPT0gMHgwMSkgewogCQkJCS8qIHNlbnNlOiBMb2dpY2FsIHVuaXQgaXMgaW4gcHJvY2VzcyBvZiBiZWNvbWluZyByZWFkeSAqLwogCQkJCWlmICghY2djLT5xdWlldCkKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENEUk9NIG5vdCByZWFkeSB5ZXQuXG4iLCBjZC0+Y2RpLm5hbWUpOwpAQCAtMTQ2LDM3ICsxNDIsMzMgQEAKIAkJCWlmICghY2djLT5xdWlldCkKIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0RST00gbm90IHJlYWR5LiAgTWFrZSBzdXJlIHRoZXJlIGlzIGEgZGlzYyBpbiB0aGUgZHJpdmUuXG4iLCBjZC0+Y2RpLm5hbWUpOwogI2lmZGVmIERFQlVHCi0JCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic3IiLCBTUnBudCk7CisJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigic3IiLCAmc3NoZHIpOwogI2VuZGlmCiAJCQllcnIgPSAtRU5PTUVESVVNOwogCQkJYnJlYWs7CiAJCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgogCQkJZXJyID0gLUVJTzsKLQkJCWlmIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSAweDIwICYmCi0JCQkgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMHgwMCkKKwkJCWlmIChzc2hkci5hc2MgPT0gMHgyMCAmJgorCQkJICAgIHNzaGRyLmFzY3EgPT0gMHgwMCkKIAkJCQkvKiBzZW5zZTogSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlICovCiAJCQkJZXJyID0gLUVEUklWRV9DQU5UX0RPX1RISVM7CiAjaWZkZWYgREVCVUcKIAkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNnYy0+Y21kKTsKLQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzciIsIFNScG50KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJzciIsICZzc2hkcik7CiAjZW5kaWYKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ0RST00gKGlvY3RsKSBlcnJvciwgY29tbWFuZDogIiwgY2QtPmNkaS5uYW1lKTsKIAkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNnYy0+Y21kKTsKLQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzciIsIFNScG50KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJzciIsICZzc2hkcik7CiAJCQllcnIgPSAtRUlPOwogCQl9CiAJfQogCi0JaWYgKGNnYy0+c2Vuc2UpCi0JCW1lbWNweShjZ2MtPnNlbnNlLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCBzaXplb2YoKmNnYy0+c2Vuc2UpKTsKLQogCS8qIFdha2UgdXAgYSBwcm9jZXNzIHdhaXRpbmcgZm9yIGRldmljZSAqLwotICAgICAgb3V0X2ZyZWU6Ci0Jc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwotCVNScG50ID0gTlVMTDsKICAgICAgIG91dDoKKwlpZiAoIWNnYy0+c2Vuc2UpCisJCWtmcmVlKHNlbnNlKTsKIAljZ2MtPnN0YXQgPSBlcnI7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggMGE3ODM5ZC4uYTkzMzA4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0LmMKQEAgLTE3LDcgKzE3LDcgQEAKICAgIExhc3QgbW9kaWZpZWQ6IDE4LUpBTi0xOTk4IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiBEZXZmcyBzdXBwb3J0CiAgKi8KIAotc3RhdGljIGNoYXIgKnZlcnN0ciA9ICIyMDA1MDUwMSI7CitzdGF0aWMgY2hhciAqdmVyc3RyID0gIjIwMDUwODMwIjsKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC0yMTksNiArMjE5LDEyIEBACiAKIHN0YXRpYyBpbnQgc3RfaW50X2lvY3RsKHN0cnVjdCBzY3NpX3RhcGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAorc3RhdGljIHZvaWQgc2NzaV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKik7CisKKyNkZWZpbmUgdG9fc2NzaV90YXBlKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHNjc2lfdGFwZSwga3JlZikKKworc3RhdGljIERFQ0xBUkVfTVVURVgoc3RfcmVmX3NlbSk7CisKIAwKICNpbmNsdWRlICJvc3N0X2RldGVjdC5oIgogI2lmbmRlZiBTSUdTX0ZST01fT1NTVApAQCAtMjMwLDYgKzIzNiw0NiBAQAogCXsiT25TdHJlYW0iLCAiRlctIiwgIiIsICJvc3N0In0KICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHNjc2lfdGFwZSAqc2NzaV90YXBlX2dldChpbnQgZGV2KQoreworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IE5VTEw7CisKKwlkb3duKCZzdF9yZWZfc2VtKTsKKwl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCisJaWYgKGRldiA8IHN0X2Rldl9tYXggJiYgc2NzaV90YXBlcyAhPSBOVUxMKQorCQlTVHAgPSBzY3NpX3RhcGVzW2Rldl07CisJaWYgKCFTVHApIGdvdG8gb3V0OworCisJa3JlZl9nZXQoJlNUcC0+a3JlZik7CisKKwlpZiAoIVNUcC0+ZGV2aWNlKQorCQlnb3RvIG91dF9wdXQ7CisKKwlpZiAoc2NzaV9kZXZpY2VfZ2V0KFNUcC0+ZGV2aWNlKSkKKwkJZ290byBvdXRfcHV0OworCisJZ290byBvdXQ7CisKK291dF9wdXQ6CisJa3JlZl9wdXQoJlNUcC0+a3JlZiwgc2NzaV90YXBlX3JlbGVhc2UpOworCVNUcCA9IE5VTEw7CitvdXQ6CisJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCXVwKCZzdF9yZWZfc2VtKTsKKwlyZXR1cm4gU1RwOworfQorCitzdGF0aWMgdm9pZCBzY3NpX3RhcGVfcHV0KHN0cnVjdCBzY3NpX3RhcGUgKlNUcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBTVHAtPmRldmljZTsKKworCWRvd24oJnN0X3JlZl9zZW0pOworCWtyZWZfcHV0KCZTVHAtPmtyZWYsIHNjc2lfdGFwZV9yZWxlYXNlKTsKKwlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJdXAoJnN0X3JlZl9zZW0pOworfQorCiBzdHJ1Y3Qgc3RfcmVqZWN0X2RhdGEgewogCWNoYXIgKnZlbmRvcjsKIAljaGFyICptb2RlbDsKQEAgLTMxMSw3ICszNTcsNyBAQAogCQlyZXR1cm4gMDsKIAogCWNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OwotCXN0X2FuYWx5emVfc2Vuc2UoU1RwLT5idWZmZXItPmxhc3RfU1JwbnQsIGNtZHN0YXRwKTsKKwlzdF9hbmFseXplX3NlbnNlKFNScG50LCBjbWRzdGF0cCk7CiAKIAlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UpCiAJCXNjb2RlID0gU1RwLT5idWZmZXItPmNtZHN0YXQuc2Vuc2VfaGRyLnNlbnNlX2tleTsKQEAgLTM5OSwxMCArNDQ1LDEwIEBACiAKIAkoU1RwLT5idWZmZXIpLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCA9IFNDcG50LT5yZXN1bHQ7CiAJU0NwbnQtPnJlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfRE9ORTsKLQkoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50ID0gU0NwbnQtPnNjX3JlcXVlc3Q7CiAJREVCKCBTVHAtPndyaXRlX3BlbmRpbmcgPSAwOyApCiAKLQljb21wbGV0ZShTQ3BudC0+cmVxdWVzdC0+d2FpdGluZyk7CisJaWYgKFNDcG50LT5yZXF1ZXN0LT53YWl0aW5nKQorCQljb21wbGV0ZShTQ3BudC0+cmVxdWVzdC0+d2FpdGluZyk7CiB9CiAKIC8qIERvIHRoZSBzY3NpIGNvbW1hbmQuIFdhaXRzIHVudGlsIGNvbW1hbmQgcGVyZm9ybWVkIGlmIGRvX3dhaXQgaXMgdHJ1ZS4KQEAgLTQxMiw4ICs0NTgsMjAgQEAKIHN0X2RvX3Njc2koc3RydWN0IHNjc2lfcmVxdWVzdCAqIFNScG50LCBzdHJ1Y3Qgc2NzaV90YXBlICogU1RwLCB1bnNpZ25lZCBjaGFyICpjbWQsCiAJICAgaW50IGJ5dGVzLCBpbnQgZGlyZWN0aW9uLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsIGludCBkb193YWl0KQogeworCXN0cnVjdCBjb21wbGV0aW9uICp3YWl0aW5nOwogCXVuc2lnbmVkIGNoYXIgKmJwOwogCisJLyogaWYgYXN5bmMsIG1ha2Ugc3VyZSB0aGVyZSdzIG5vIGNvbW1hbmQgb3V0c3RhbmRpbmcgKi8KKwlpZiAoIWRvX3dhaXQgJiYgKChTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFzeW5jIGNvbW1hbmQgYWxyZWFkeSBhY3RpdmUuXG4iLAorCQkgICAgICAgdGFwZV9uYW1lKFNUcCkpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9ICgtRUlOVFIpOworCQllbHNlCisJCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9ICgtRUJVU1kpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAlpZiAoU1JwbnQgPT0gTlVMTCkgewogCQlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChTVHAtPmRldmljZSwgR0ZQX0FUT01JQyk7CiAJCWlmIChTUnBudCA9PSBOVUxMKSB7CkBAIC00MjcsNyArNDg1LDEzIEBACiAJCX0KIAl9CiAKLQlpbml0X2NvbXBsZXRpb24oJlNUcC0+d2FpdCk7CisJLyogSWYgYXN5bmMgSU8sIHNldCBsYXN0X1NScG50LiBUaGlzIHB0ciB0ZWxscyB3cml0ZV9iZWhpbmRfY2hlY2sKKwkgICB3aGljaCBJTyBpcyBvdXRzdGFuZGluZy4gSXQncyBudWxsZWQgb3V0IHdoZW4gdGhlIElPIGNvbXBsZXRlcy4gKi8KKwlpZiAoIWRvX3dhaXQpCisJCShTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQgPSBTUnBudDsKKworCXdhaXRpbmcgPSAmU1RwLT53YWl0OworCWluaXRfY29tcGxldGlvbih3YWl0aW5nKTsKIAlTUnBudC0+c3JfdXNlX3NnID0gU1RwLT5idWZmZXItPmRvX2RpbyB8fCAoYnl0ZXMgPiAoU1RwLT5idWZmZXIpLT5mcnBbMF0ubGVuZ3RoKTsKIAlpZiAoU1JwbnQtPnNyX3VzZV9zZykgewogCQlpZiAoIVNUcC0+YnVmZmVyLT5kb19kaW8pCkBAIC00MzgsMTcgKzUwMiwyMCBAQAogCQlicCA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YTsKIAlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBkaXJlY3Rpb247CiAJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOwotCVNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gJihTVHAtPndhaXQpOworCVNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nID0gd2FpdGluZzsKIAlTUnBudC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9CVVNZOwogCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9kaXNrID0gU1RwLT5kaXNrOworCVNScG50LT5zcl9yZXF1ZXN0LT5lbmRfaW8gPSBibGtfZW5kX3N5bmNfcnE7CiAJU1RwLT5idWZmZXItPmNtZHN0YXQuaGF2ZV9zZW5zZSA9IDA7CiAKIAlzY3NpX2RvX3JlcShTUnBudCwgKHZvaWQgKikgY21kLCBicCwgYnl0ZXMsCiAJCSAgICBzdF9zbGVlcF9kb25lLCB0aW1lb3V0LCByZXRyaWVzKTsKIAogCWlmIChkb193YWl0KSB7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKHdhaXRpbmcpOwogCQlTUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7CisJCWlmIChTUnBudC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzICE9IFJRX1NDU0lfRE9ORSkKKwkJCVNScG50LT5zcl9yZXN1bHQgfD0gKERSSVZFUl9FUlJPUiA8PCAyNCk7CiAJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChTVHAsIFNScG50KTsKIAl9CiAJcmV0dXJuIFNScG50OwpAQCAtNDY1LDYgKzUzMiw3IEBACiAJc3RydWN0IHN0X2J1ZmZlciAqU1RidWZmZXI7CiAJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOwogCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OwogCiAJU1RidWZmZXIgPSBTVHAtPmJ1ZmZlcjsKIAlpZiAoIVNUYnVmZmVyLT53cml0aW5nKQpAQCAtNDc4LDEwICs1NDYsMTQgQEAKICAgICAgICAgKSAvKiBlbmQgREVCICovCiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCYoU1RwLT53YWl0KSk7Ci0JKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7CisJU1JwbnQgPSBTVGJ1ZmZlci0+bGFzdF9TUnBudDsKKwlTVGJ1ZmZlci0+bGFzdF9TUnBudCA9IE5VTEw7CisJU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOworCWlmIChTUnBudC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzICE9IFJRX1NDU0lfRE9ORSkKKwkJU1JwbnQtPnNyX3Jlc3VsdCB8PSAoRFJJVkVSX0VSUk9SIDw8IDI0KTsKIAotCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChTVHAsIChTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQpOwotCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KChTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQpOworCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChTVHAsIFNScG50KTsKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAKIAlTVGJ1ZmZlci0+YnVmZmVyX2J5dGVzIC09IFNUYnVmZmVyLT53cml0aW5nOwogCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKQEAgLTEwNTUsMjUgKzExMjcsMjAgQEAKIAkgKi8KIAlmaWxwLT5mX21vZGUgJj0gfihGTU9ERV9QUkVBRCB8IEZNT0RFX1BXUklURSk7CiAKKwlpZiAoIShTVHAgPSBzY3NpX3RhcGVfZ2V0KGRldikpKQorCQlyZXR1cm4gLUVOWElPOworCiAJd3JpdGVfbG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKLQlpZiAoZGV2ID49IHN0X2Rldl9tYXggfHwgc2NzaV90YXBlcyA9PSBOVUxMIHx8Ci0JICAgICgoU1RwID0gc2NzaV90YXBlc1tkZXZdKSA9PSBOVUxMKSkgewotCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7Ci0JCXJldHVybiAoLUVOWElPKTsKLQl9CiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gU1RwOwogCW5hbWUgPSB0YXBlX25hbWUoU1RwKTsKIAogCWlmIChTVHAtPmluX3VzZSkgewogCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJCXNjc2lfdGFwZV9wdXQoU1RwKTsKIAkJREVCKCBwcmludGsoU1RfREVCX01TRyAiJXM6IERldmljZSBhbHJlYWR5IGluIHVzZS5cbiIsIG5hbWUpOyApCiAJCXJldHVybiAoLUVCVVNZKTsKIAl9CiAKLQlpZihzY3NpX2RldmljZV9nZXQoU1RwLT5kZXZpY2UpKSB7Ci0JCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKLQkJcmV0dXJuICgtRU5YSU8pOwotCX0KIAlTVHAtPmluX3VzZSA9IDE7CiAJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOwogCVNUcC0+cmV3X2F0X2Nsb3NlID0gU1RwLT5hdXRvcmV3X2RldiA9IChpbWlub3IoaW5vZGUpICYgMHg4MCkgPT0gMDsKQEAgLTExMTgsNyArMTE4NSw3IEBACiAgZXJyX291dDoKIAlub3JtYWxpemVfYnVmZmVyKFNUcC0+YnVmZmVyKTsKIAlTVHAtPmluX3VzZSA9IDA7Ci0Jc2NzaV9kZXZpY2VfcHV0KFNUcC0+ZGV2aWNlKTsKKwlzY3NpX3RhcGVfcHV0KFNUcCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQpAQCAtMTI1MCw3ICsxMzE3LDcgQEAKIAl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOwogCVNUcC0+aW5fdXNlID0gMDsKIAl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7Ci0Jc2NzaV9kZXZpY2VfcHV0KFNUcC0+ZGV2aWNlKTsKKwlzY3NpX3RhcGVfcHV0KFNUcCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMzg4Nyw2ICszOTU0LDcgQEAKIAkJZ290byBvdXRfcHV0X2Rpc2s7CiAJfQogCW1lbXNldCh0cG50LCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfdGFwZSkpOworCWtyZWZfaW5pdCgmdHBudC0+a3JlZik7CiAJdHBudC0+ZGlzayA9IGRpc2s7CiAJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJzdCVkIiwgaSk7CiAJZGlzay0+cHJpdmF0ZV9kYXRhID0gJnRwbnQtPmRyaXZlcjsKQEAgLTM5MDIsNiArMzk3MCw3IEBACiAJCXRwbnQtPnRhcGVfdHlwZSA9IE1UX0lTU0NTSTI7CiAKIAl0cG50LT5idWZmZXIgPSBidWZmZXI7CisJdHBudC0+YnVmZmVyLT5sYXN0X1NScG50ID0gTlVMTDsKIAogCXRwbnQtPmluaXRlZCA9IDA7CiAJdHBudC0+ZGlydHkgPSAwOwpAQCAtNDA3NiwxNSArNDE0NSwxMCBAQAogCQkJCQl0cG50LT5tb2Rlc1ttb2RlXS5jZGV2c1tqXSA9IE5VTEw7CiAJCQkJfQogCQkJfQotCQkJdHBudC0+ZGV2aWNlID0gTlVMTDsKIAotCQkJaWYgKHRwbnQtPmJ1ZmZlcikgewotCQkJCXRwbnQtPmJ1ZmZlci0+b3JpZ19mcnBfc2VncyA9IDA7Ci0JCQkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOwotCQkJCWtmcmVlKHRwbnQtPmJ1ZmZlcik7Ci0JCQl9Ci0JCQlwdXRfZGlzayh0cG50LT5kaXNrKTsKLQkJCWtmcmVlKHRwbnQpOworCQkJZG93bigmc3RfcmVmX3NlbSk7CisJCQlrcmVmX3B1dCgmdHBudC0+a3JlZiwgc2NzaV90YXBlX3JlbGVhc2UpOworCQkJdXAoJnN0X3JlZl9zZW0pOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC00MDkzLDYgKzQxNTcsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiAgICAgIHNjc2lfdGFwZV9yZWxlYXNlIC0gQ2FsbGVkIHRvIGZyZWUgdGhlIFNjc2lfVGFwZSBzdHJ1Y3R1cmUKKyAqICAgICAgQGtyZWY6IHBvaW50ZXIgdG8gZW1iZWRkZWQga3JlZgorICoKKyAqICAgICAgc3RfcmVmX3NlbSBtdXN0IGJlIGhlbGQgZW50ZXJpbmcgdGhpcyByb3V0aW5lLiAgQmVjYXVzZSBpdCBpcworICogICAgICBjYWxsZWQgb24gbGFzdCBwdXQsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgc2NzaV90YXBlX2dldCgpCisgKiAgICAgIHNjc2lfdGFwZV9wdXQoKSBoZWxwZXJzIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHNlbWFwaG9yZSBkaXJlY3RseQorICogICAgICBhbmQgbmV2ZXIgZG8gYSBkaXJlY3Qga3JlZl9wdXQoKS4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfdGFwZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBzY3NpX3RhcGUgKnRwbnQgPSB0b19zY3NpX3RhcGUoa3JlZik7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSB0cG50LT5kaXNrOworCisJdHBudC0+ZGV2aWNlID0gTlVMTDsKKworCWlmICh0cG50LT5idWZmZXIpIHsKKwkJdHBudC0+YnVmZmVyLT5vcmlnX2ZycF9zZWdzID0gMDsKKwkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOworCQlrZnJlZSh0cG50LT5idWZmZXIpOworCX0KKworCWRpc2stPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcHV0X2Rpc2soZGlzayk7CisJa2ZyZWUodHBudCk7CisJcmV0dXJuOworfQorCiBzdGF0aWMgdm9pZCBzdF9pbnRyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXNjc2lfaW9fY29tcGxldGlvbihTQ3BudCwgKFNDcG50LT5yZXN1bHQgPyAwOiBTQ3BudC0+YnVmZmxlbiksIDEpOwpAQCAtNDM0OCwxMiArNDQ0MCwxMiBAQAogc3RhdGljIGludCBzZ2xfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcGFnZXMsIAogCQkJICAgICAgdW5zaWduZWQgbG9uZyB1YWRkciwgc2l6ZV90IGNvdW50LCBpbnQgcncpCiB7CisJdW5zaWduZWQgbG9uZyBlbmQgPSAodWFkZHIgKyBjb3VudCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7CisJY29uc3QgaW50IG5yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7CiAJaW50IHJlcywgaSwgajsKLQl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAotCW5yX3BhZ2VzID0gKCh1YWRkciAmIH5QQUdFX01BU0spICsgY291bnQgKyB+UEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwotCiAJLyogVXNlciBhdHRlbXB0ZWQgT3ZlcmZsb3chICovCiAJaWYgKCh1YWRkciArIGNvdW50KSA8IHVhZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5oIGIvZHJpdmVycy9zY3NpL3N0LmgKaW5kZXggMDYxZGExMS4uNzkwYWNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmgKKysrIGIvZHJpdmVycy9zY3NpL3N0LmgKQEAgLTMsNyArMyw3IEBACiAjZGVmaW5lIF9TVF9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAKIC8qIERlc2NyaXB0b3IgZm9yIGFuYWx5emVkIHNlbnNlIGRhdGEgKi8KIHN0cnVjdCBzdF9jbWRzdGF0dXMgewpAQCAtMTU2LDYgKzE1Niw3IEBACiAJdW5zaWduZWQgY2hhciBsYXN0X3NlbnNlWzE2XTsKICNlbmRpZgogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBrcmVmICAgICBrcmVmOwogfTsKIAogLyogQml0IG1hc2tzIGZvciB1c2VfcGYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCmluZGV4IDkwOTdmMmYuLjJlZmIzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwppbmRleCBiMTE2MTIyLi4xNzBjOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKQEAgLTI0NzQsOCArMjQ3NCw3IEBACiAJLnRpb2Ntc2V0ID0gcnNfMzYwX3Rpb2Ntc2V0LAogfTsKIAotLyogaW50IF9faW5pdCByc18zNjBfaW5pdCh2b2lkKSAqLwotaW50IHJzXzM2MF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCByc18zNjBfaW5pdCh2b2lkKQogewogCXN0cnVjdCBzZXJpYWxfc3RhdGUgKiBzdGF0ZTsKIAlzZXJfaW5mb190CSppbmZvOwpAQCAtMjgyNywxMCArMjgyNiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLQotCi0KLQorbW9kdWxlX2luaXQocnNfMzYwX2luaXQpOwogCiAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHJzXzM2MF9pbml0KCkgZnVuY3Rpb24sIG90aGVyd2lzZQogICogaXQgYmxvd3MgYXdheSB0aGUgcG9ydCBjb250cm9sIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IDMwYTBhM2QuLjRkNzVjZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTg2NCw3ICs4NjQsNyBAQAogCS8qCiAJICogV2UncmUgcHJldHR5IHN1cmUgdGhlcmUncyBhIHBvcnQgaGVyZS4gIExldHMgZmluZCBvdXQgd2hhdAogCSAqIHR5cGUgb2YgcG9ydCBpdCBpcy4gIFRoZSBJSVIgdG9wIHR3byBiaXRzIGFsbG93cyB1cyB0byBmaW5kCi0JICogb3V0IGlmIGl0cyA4MjUwIG9yIDE2NDUwLCAxNjU1MCwgMTY1NTBBIG9yIGxhdGVyLiAgVGhpcworCSAqIG91dCBpZiBpdCdzIDgyNTAgb3IgMTY0NTAsIDE2NTUwLCAxNjU1MEEgb3IgbGF0ZXIuICBUaGlzCiAJICogZGV0ZXJtaW5lcyB3aGF0IHdlIHRlc3QgZm9yIG5leHQuCiAJICoKIAkgKiBXZSBhbHNvIGluaXRpYWxpc2UgdGhlIEVGUiAoaWYgYW55KSB0byB6ZXJvIGZvciBsYXRlci4gIFRoZQpAQCAtMjUzNiw3ICsyNTM2LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlzZXJpYWw4MjUwX2lzYV9kZXZzID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgic2VyaWFsODI1MCIsCi0JCQkJCQkJICAgICAgLTEsIE5VTEwsIDApOworCQkJCQkgUExBVDgyNTBfREVWX0xFR0FDWSwgTlVMTCwgMCk7CiAJaWYgKElTX0VSUihzZXJpYWw4MjUwX2lzYV9kZXZzKSkgewogCQlyZXQgPSBQVFJfRVJSKHNlcmlhbDgyNTBfaXNhX2RldnMpOwogCQlnb3RvIHVucmVnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY2NlbnQuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYWNjZW50LmMKaW5kZXggMWYyYzI3Ni4uOWMxMDI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY2NlbnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjY2VudC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFjY2VudF9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDIsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfQUNDRU5ULAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBhY2NlbnRfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY3BpLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjcGkuYwppbmRleCA2YjllYWQyLi5hODAyYmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX2FjcGkuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjcGkuYwpAQCAtNDcsMTggKzQ3LDMwIEBACiBzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9zZXJpYWxfZXh0X2lycShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAogCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxICpleHRfaXJxKQogewotCWlmIChleHRfaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApCi0JCXBvcnQtPmlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGV4dF9pcnEtPmludGVycnVwdHNbMF0sCisJaW50IHJjOworCisJaWYgKGV4dF9pcnEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID4gMCkgeworCQlyYyA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGV4dF9pcnEtPmludGVycnVwdHNbMF0sCiAJICAgICAgICAgICAgICAgICAgIGV4dF9pcnEtPmVkZ2VfbGV2ZWwsIGV4dF9pcnEtPmFjdGl2ZV9oaWdoX2xvdyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gQUVfRVJST1I7CisJCXBvcnQtPmlycSA9IHJjOworCX0KIAlyZXR1cm4gQUVfT0s7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3NlcmlhbF9pcnEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKIAkJCQkgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKmlycSkKIHsKLQlpZiAoaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApCi0JCXBvcnQtPmlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGlycS0+aW50ZXJydXB0c1swXSwKKwlpbnQgcmM7CisKKwlpZiAoaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApIHsKKwkJcmMgPSBhY3BpX3JlZ2lzdGVyX2dzaShpcnEtPmludGVycnVwdHNbMF0sCiAJICAgICAgICAgICAgICAgICAgIGlycS0+ZWRnZV9sZXZlbCwgaXJxLT5hY3RpdmVfaGlnaF9sb3cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIEFFX0VSUk9SOworCQlwb3J0LT5pcnEgPSByYzsKKwl9CiAJcmV0dXJuIEFFX09LOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2JvY2EuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCmluZGV4IDQ2NWM5ZWEuLjNiZmUwZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfYm9jYS5jCkBAIC00Myw3ICs0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJvY2FfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAzLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX0JPQ0EsCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IGJvY2FfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9mb3VycG9ydC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9mb3VycG9ydC5jCmluZGV4IGU5YjRkOTAuLjYzNzVkNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZm91cnBvcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2ZvdXJwb3J0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZm91cnBvcnRfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAxLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX0ZPVVJQT1JULAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBmb3VycG9ydF9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCmluZGV4IDc3ZjM5NmYuLmRhZjU2OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHViNi5jCkBAIC00MCw3ICs0MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGh1YjZfZGV2aWNlID0gewogCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSA0LAorCS5pZAkJCT0gUExBVDgyNTBfREVWX0hVQjYsCiAJLmRldgkJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9IGh1YjZfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfbWNhLmMKaW5kZXggZjBjNDBkNi4uYWMyMDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX21jYS5jCkBAIC00NCw3ICs0NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1jYV9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IDUsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfTUNBLAogCS5kZXYJCQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSBtY2FfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggZTM5ODE4YS4uYjc0NWExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC04MCw3ICs4MCw3IEBACiBjb25maWcgU0VSSUFMXzgyNTBfQUNQSQogCWJvb2wgIjgyNTAvMTY1NTAgZGV2aWNlIGRpc2NvdmVyeSB2aWEgQUNQSSBuYW1lc3BhY2UiCiAJZGVmYXVsdCB5IGlmIElBNjQKLQlkZXBlbmRzIG9uIEFDUElfQlVTICYmIFNFUklBTF84MjUwCisJZGVwZW5kcyBvbiBBQ1BJICYmIFNFUklBTF84MjUwCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdpc2ggdG8gZW5hYmxlIHNlcmlhbCBwb3J0IGRpc2NvdmVyeSB2aWEgdGhlIEFDUEkKIAkgIG5hbWVzcGFjZSwgc2F5IFkgaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKaW5kZXggNTY5MDU5NC4uNDBkM2U3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwpAQCAtNDQ2LDcgKzQ0Niw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pY29tLmMgYi9kcml2ZXJzL3NlcmlhbC9pY29tLmMKaW5kZXggNzlmOGRmNC4uZWIzMTEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvaWNvbS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2ljb20uYwpAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tY2ZzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jCmluZGV4IDhjNDAxNjcuLjQzYjAzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jCkBAIC00MCw3ICs0MCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jCmluZGV4IDMyZjgwOGQuLjgzMDIzNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHVhcnRfY2lyY19lbXB0eSAoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkIChwb3J0KSkgewotCQlsaDdhNDB4dWFydF9zdG9wX3R4IChwb3J0LCAwKTsKKwkJbGg3YTQweHVhcnRfc3RvcF90eCAocG9ydCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyOSw3ICsyMjksNyBAQAogCQl1YXJ0X3dyaXRlX3dha2V1cCAocG9ydCk7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5ICh4bWl0KSkKLQkJbGg3YTQweHVhcnRfc3RvcF90eCAocG9ydCwgMCk7CisJCWxoN2E0MHh1YXJ0X3N0b3BfdHggKHBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBsaDdhNDB4dWFydF9tb2RlbV9zdGF0dXMgKHN0cnVjdCB1YXJ0X3BvcnQqIHBvcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwppbmRleCA0OWFmYWRiLi5mMTBjODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKQEAgLTMxLDYgKzMxLDggQEAKICAqCTEuMDEJU2V0IGZpZm9zaXplIHRvIG1ha2UgdHhfZW1wcnkgY2FsbGVkIHByb3Blcmx5LgogICoJCVVzZSBzdGFuZGFyZCB1YXJ0X2dldF9kaXZpc29yLgogICoJMS4wMglDbGVhbnVwLiAoaW1wb3J0IDgyNTAuYyBjaGFuZ2VzKQorICoJMS4wMwlGaXggbG93LWxhdGVuY3kgbW9kZS4gKGltcG9ydCA4MjUwLmMgY2hhbmdlcykKKyAqCTEuMDQJUmVtb3ZlIHVzYWdlIG9mIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLCBjbGVhbnVwLgogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKQEAgLTU0LDcgKzU2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLXN0YXRpYyBjaGFyICpzZXJpYWxfdmVyc2lvbiA9ICIxLjAyIjsKK3N0YXRpYyBjaGFyICpzZXJpYWxfdmVyc2lvbiA9ICIxLjA0IjsKIHN0YXRpYyBjaGFyICpzZXJpYWxfbmFtZSA9ICJUWDM5LzQ5IFNlcmlhbCBkcml2ZXIiOwogCiAjZGVmaW5lIFBBU1NfTElNSVQJMjU2CkBAIC04Niw5ICs4OCw5IEBACiAgKi8KICNpZmRlZiBFTkFCTEVfU0VSSUFMX1RYWDlfUENJCiAjZGVmaW5lIE5SX1BDSV9CT0FSRFMJNAotI2RlZmluZSBVQVJUX05SICAoMiArIE5SX1BDSV9CT0FSRFMpCisjZGVmaW5lIFVBUlRfTlIgICg0ICsgTlJfUENJX0JPQVJEUykKICNlbHNlCi0jZGVmaW5lIFVBUlRfTlIgIDIKKyNkZWZpbmUgVUFSVF9OUiAgNAogI2VuZGlmCiAKIHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCB7CkBAIC0zMDQsOCArMzA2LDExIEBACiAJCS8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHR0eSBsYXllciBhbmQKIAkJICAgdW5zYWZlLiBJdCBzaG91bGQgYmUgZml4ZWQgQVNBUCAqLwogCQlpZiAodW5saWtlbHkodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpKSB7Ci0JCQlpZih0dHktPmxvd19sYXRlbmN5KQorCQkJaWYgKHR0eS0+bG93X2xhdGVuY3kpIHsKKwkJCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOworCQkJfQogCQkJLyogSWYgdGhpcyBmYWlsZWQgdGhlbiB3ZSB3aWxsIHRocm93IGF3YXkgdGhlCiAJCQkgICBieXRlcyBidXQgbXVzdCBkbyBzbyB0byBjbGVhciBpbnRlcnJ1cHRzICovCiAJCX0KQEAgLTM1Niw3ICszNjEsOSBAQAogCWlnbm9yZV9jaGFyOgogCQlkaXNyID0gc2lvX2luKHVwLCBUWFg5X1NJRElTUik7CiAJfSB3aGlsZSAoIShkaXNyICYgVFhYOV9TSURJU1JfVVZBTElEKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7CisJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKIAkqc3RhdHVzID0gZGlzcjsKIH0KIApAQCAtNjY3LDE3ICs2NzQsOCBAQAogCSAgICAgIHVuc2lnbmVkIGludCBvbGRzdGF0ZSkKIHsKIAlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7Ci0JaWYgKHN0YXRlKSB7Ci0JCS8qIHNsZWVwICovCi0KLQkJaWYgKHVwLT5wbSkKLQkJCXVwLT5wbShwb3J0LCBzdGF0ZSwgb2xkc3RhdGUpOwotCX0gZWxzZSB7Ci0JCS8qIHdha2UgKi8KLQotCQlpZiAodXAtPnBtKQotCQkJdXAtPnBtKHBvcnQsIHN0YXRlLCBvbGRzdGF0ZSk7Ci0JfQorCWlmICh1cC0+cG0pCisJCXVwLT5wbShwb3J0LCBzdGF0ZSwgb2xkc3RhdGUpOwogfQogCiBzdGF0aWMgaW50IHNlcmlhbF90eHg5X3JlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCkKQEAgLTk3OSwxNCArOTc3LDYgQEAKIH0KIGNvbnNvbGVfaW5pdGNhbGwoc2VyaWFsX3R4eDlfY29uc29sZV9pbml0KTsKIAotc3RhdGljIGludCBfX2luaXQgc2VyaWFsX3R4eDlfbGF0ZV9jb25zb2xlX2luaXQodm9pZCkKLXsKLQlpZiAoIShzZXJpYWxfdHh4OV9jb25zb2xlLmZsYWdzICYgQ09OX0VOQUJMRUQpKQotCQlyZWdpc3Rlcl9jb25zb2xlKCZzZXJpYWxfdHh4OV9jb25zb2xlKTsKLQlyZXR1cm4gMDsKLX0KLWxhdGVfaW5pdGNhbGwoc2VyaWFsX3R4eDlfbGF0ZV9jb25zb2xlX2luaXQpOwotCiAjZGVmaW5lIFNFUklBTF9UWFg5X0NPTlNPTEUJJnNlcmlhbF90eHg5X2NvbnNvbGUKICNlbHNlCiAjZGVmaW5lIFNFUklBTF9UWFg5X0NPTlNPTEUJTlVMTApAQCAtMTAzOSw2ICsxMDI5LDczIEBACiAJdWFydF9yZXN1bWVfcG9ydCgmc2VyaWFsX3R4eDlfcmVnLCAmc2VyaWFsX3R4eDlfcG9ydHNbbGluZV0ucG9ydCk7CiB9CiAKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNlcmlhbF90eHg5X3NlbSk7CisKKy8qKgorICoJc2VyaWFsX3R4eDlfcmVnaXN0ZXJfcG9ydCAtIHJlZ2lzdGVyIGEgc2VyaWFsIHBvcnQKKyAqCUBwb3J0OiBzZXJpYWwgcG9ydCB0ZW1wbGF0ZQorICoKKyAqCUNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0LgorICoKKyAqCVRoZSBwb3J0IGlzIHRoZW4gcHJvYmVkIGFuZCBpZiBuZWNlc3NhcnkgdGhlIElSUSBpcyBhdXRvZGV0ZWN0ZWQKKyAqCUlmIHRoaXMgZmFpbHMgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgKgorICoJT24gc3VjY2VzcyB0aGUgcG9ydCBpcyByZWFkeSB0byB1c2UgYW5kIHRoZSBsaW5lIG51bWJlciBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2VyaWFsX3R4eDlfcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWludCBpOworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdWFydDsKKwlpbnQgcmV0ID0gLUVOT1NQQzsKKworCWRvd24oJnNlcmlhbF90eHg5X3NlbSk7CisJZm9yIChpID0gMDsgaSA8IFVBUlRfTlI7IGkrKykgeworCQl1YXJ0ID0gJnNlcmlhbF90eHg5X3BvcnRzW2ldOworCQlpZiAodWFydC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9XTikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IFVBUlRfTlIpIHsKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOworCQl1YXJ0LT5wb3J0LmlvYmFzZSA9IHBvcnQtPmlvYmFzZTsKKwkJdWFydC0+cG9ydC5tZW1iYXNlID0gcG9ydC0+bWVtYmFzZTsKKwkJdWFydC0+cG9ydC5pcnEgICAgICA9IHBvcnQtPmlycTsKKwkJdWFydC0+cG9ydC51YXJ0Y2xrICA9IHBvcnQtPnVhcnRjbGs7CisJCXVhcnQtPnBvcnQuaW90eXBlICAgPSBwb3J0LT5pb3R5cGU7CisJCXVhcnQtPnBvcnQuZmxhZ3MgICAgPSBwb3J0LT5mbGFncyB8IFVQRl9CT09UX0FVVE9DT05GOworCQl1YXJ0LT5wb3J0Lm1hcGJhc2UgID0gcG9ydC0+bWFwYmFzZTsKKwkJaWYgKHBvcnQtPmRldikKKwkJCXVhcnQtPnBvcnQuZGV2ID0gcG9ydC0+ZGV2OworCQlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmc2VyaWFsX3R4eDlfcmVnLCAmdWFydC0+cG9ydCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHVhcnQtPnBvcnQubGluZTsKKwl9CisJdXAoJnNlcmlhbF90eHg5X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglzZXJpYWxfdHh4OV91bnJlZ2lzdGVyX3BvcnQgLSByZW1vdmUgYSB0eHg5IHNlcmlhbCBwb3J0IGF0IHJ1bnRpbWUKKyAqCUBsaW5lOiBzZXJpYWwgbGluZSBudW1iZXIKKyAqCisgKglSZW1vdmUgb25lIHNlcmlhbCBwb3J0LiAgVGhpcyBtYXkgbm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdAorICoJY29udGV4dC4gIFdlIGhhbmQgdGhlIHBvcnQgYmFjayB0byB0aGUgb3VyIGNvbnRyb2wuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzZXJpYWxfdHh4OV91bnJlZ2lzdGVyX3BvcnQoaW50IGxpbmUpCit7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1YXJ0ID0gJnNlcmlhbF90eHg5X3BvcnRzW2xpbmVdOworCisJZG93bigmc2VyaWFsX3R4eDlfc2VtKTsKKwl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2VyaWFsX3R4eDlfcmVnLCAmdWFydC0+cG9ydCk7CisJdWFydC0+cG9ydC5mbGFncyA9IDA7CisJdWFydC0+cG9ydC50eXBlID0gUE9SVF9VTktOT1dOOworCXVhcnQtPnBvcnQuaW9iYXNlID0gMDsKKwl1YXJ0LT5wb3J0Lm1hcGJhc2UgPSAwOworCXVhcnQtPnBvcnQubWVtYmFzZSA9IDA7CisJdWFydC0+cG9ydC5kZXYgPSBOVUxMOworCXVhcnRfYWRkX29uZV9wb3J0KCZzZXJpYWxfdHh4OV9yZWcsICZ1YXJ0LT5wb3J0KTsKKwl1cCgmc2VyaWFsX3R4eDlfc2VtKTsKK30KKwogLyoKICAqIFByb2JlIG9uZSBzZXJpYWwgYm9hcmQuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyByaHltZSBub3IgcmVhc29uCiAgKiB0byB0aGUgYXJyYW5nZW1lbnQgb2Ygc2VyaWFsIHBvcnRzIG9uIGEgUENJIGNhcmQuCkBAIC0xMDU2LDEzICsxMTEzLDEzIEBACiAKIAltZW1zZXQoJnBvcnQsIDAsIHNpemVvZihwb3J0KSk7CiAJcG9ydC5vcHMgPSAmc2VyaWFsX3R4eDlfcG9wczsKLQlwb3J0LmZsYWdzIHw9IFVQRl9CT09UX0FVVE9DT05GOyAvKiB1YXJ0X29wcy5jb25maWdfcG9ydCB3aWxsIGJlIGNhbGxlZCAqLwogCXBvcnQuZmxhZ3MgfD0gVVBGX1RYWDlfSEFWRV9DVFNfTElORTsKIAlwb3J0LnVhcnRjbGsgPSA2NjY3MDAwMDsKIAlwb3J0LmlycSA9IGRldi0+aXJxOwogCXBvcnQuaW90eXBlID0gVVBJT19QT1JUOwogCXBvcnQuaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7Ci0JbGluZSA9IHVhcnRfcmVnaXN0ZXJfcG9ydCgmc2VyaWFsX3R4eDlfcmVnLCAmcG9ydCk7CisJcG9ydC5kZXYgPSAmZGV2LT5kZXY7CisJbGluZSA9IHNlcmlhbF90eHg5X3JlZ2lzdGVyX3BvcnQoJnBvcnQpOwogCWlmIChsaW5lIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgcG9ydCAlczogJWRcbiIsIHBjaV9uYW1lKGRldiksIGxpbmUpOwogCX0KQEAgLTEwNzgsNyArMTEzNSw3IEBACiAJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKIAlpZiAobGluZSkgewotCQl1YXJ0X3VucmVnaXN0ZXJfcG9ydCgmc2VyaWFsX3R4eDlfcmVnLCBsaW5lKTsKKwkJc2VyaWFsX3R4eDlfdW5yZWdpc3Rlcl9wb3J0KGxpbmUpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKIAl9CiB9CkBAIC0xMDg5LDYgKzExNDYsOCBAQAogCiAJaWYgKGxpbmUpCiAJCXNlcmlhbF90eHg5X3N1c3BlbmRfcG9ydChsaW5lKTsKKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5Niw4ICsxMTU1LDEzIEBACiB7CiAJaW50IGxpbmUgPSAoaW50KShsb25nKXBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKGxpbmUpCisJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKworCWlmIChsaW5lKSB7CisJCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CiAJCXNlcmlhbF90eHg5X3Jlc3VtZV9wb3J0KGxpbmUpOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMgYi9kcml2ZXJzL3RlbGVwaG9ueS9peGouYwppbmRleCBmMmM5ZmE0Li5mNjcwNDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouYworKysgYi9kcml2ZXJzL3RlbGVwaG9ueS9peGouYwpAQCAtNzc0LDEwICs3NzQsNyBAQAogCWotPnBvdHNfd2lua3N0YXJ0ID0gamlmZmllczsKIAlTTElDX1NldFN0YXRlKFBMRF9TTElDX1NUQVRFX09DLCBqKTsKIAotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqLT5wb3RzX3dpbmtzdGFydCArIGotPndpbmt0aW1lKSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwltc2xlZXAoamlmZmllc190b19tc2VjcyhqLT53aW5rdGltZSkpOwogCiAJU0xJQ19TZXRTdGF0ZShzbGljbm93LCBqKTsKIAlyZXR1cm4gMDsKQEAgLTE5MTIsNyArMTkwOSw2IEBACiAKIHN0YXRpYyBpbnQgaXhqX2hvb2tzdGF0ZShJWEogKmopCiB7Ci0JdW5zaWduZWQgbG9uZyBkZXQ7CiAJaW50IGZPZmZIb29rID0gMDsKIAogCXN3aXRjaCAoai0+Y2FyZHR5cGUpIHsKQEAgLTE5NDMsMTEgKzE5MzksNyBAQAogCQkJICAgIGotPnBsZF9zbGljci5iaXRzLnN0YXRlID09IFBMRF9TTElDX1NUQVRFX1NUQU5EQlkpIHsKIAkJCQlpZiAoai0+ZmxhZ3MucmluZ2luZyB8fCBqLT5mbGFncy5jcmluZ2luZykgewogCQkJCQlpZiAoIWluX2ludGVycnVwdCgpKSB7Ci0JCQkJCQlkZXQgPSBqaWZmaWVzICsgKGhlcnR6IC8gNTApOwotCQkJCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRldCkpIHsKLQkJCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCQkJCQl9CisJCQkJCQltc2xlZXAoMjApOwogCQkJCQl9CiAJCQkJCVNMSUNfR2V0U3RhdGUoaik7CiAJCQkJCWlmIChqLT5wbGRfc2xpY3IuYml0cy5zdGF0ZSA9PSBQTERfU0xJQ19TVEFURV9SSU5HSU5HKSB7CkBAIC0yMDYyLDcgKzIwNTQsNyBAQAogc3RhdGljIGludCBpeGpfcmluZyhJWEogKmopCiB7CiAJY2hhciBjbnRyOwotCXVuc2lnbmVkIGxvbmcgamlmLCBkZXQ7CisJdW5zaWduZWQgbG9uZyBqaWY7CiAKIAlqLT5mbGFncy5yaW5naW5nID0gMTsKIAlpZiAoaXhqX2hvb2tzdGF0ZShqKSAmIDEpIHsKQEAgLTIwNzAsNyArMjA2Miw2IEBACiAJCWotPmZsYWdzLnJpbmdpbmcgPSAwOwogCQlyZXR1cm4gMTsKIAl9Ci0JZGV0ID0gMDsKIAlmb3IgKGNudHIgPSAwOyBjbnRyIDwgai0+bWF4cmluZ3M7IGNudHIrKykgewogCQlqaWYgPSBqaWZmaWVzICsgKDEgKiBoZXJ0eik7CiAJCWl4al9yaW5nX29uKGopOwpAQCAtMjA4MCw4ICsyMDcxLDcgQEAKIAkJCQlqLT5mbGFncy5yaW5naW5nID0gMDsKIAkJCQlyZXR1cm4gMTsKIAkJCX0KLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCWJyZWFrOwogCQl9CkBAIC0yMDg5LDIwICsyMDc5LDEzIEBACiAJCWl4al9yaW5nX29mZihqKTsKIAkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZikpIHsKIAkJCWlmIChpeGpfaG9va3N0YXRlKGopICYgMSkgewotCQkJCWRldCA9IGppZmZpZXMgKyAoaGVydHogLyAxMDApOwotCQkJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkZXQpKSB7Ci0JCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KKwkJCQltc2xlZXAoMTApOwogCQkJCWlmIChpeGpfaG9va3N0YXRlKGopICYgMSkgewogCQkJCQlqLT5mbGFncy5yaW5naW5nID0gMDsKIAkJCQkJcmV0dXJuIDE7CiAJCQkJfQogCQkJfQotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTIxNjgsMTAgKzIxNTEsOCBAQAogCSAqICAgIFNldCB1cCBsb2NrcyB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSBwcm9jZXNzIGlzIHRhbGtpbmcgdG8gdGhlIERTUCBhdCBhIHRpbWUuCiAJICogICAgVGhpcyBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgRFNQIGZyb20gbG9ja2luZyB1cC4KIAkgKi8KLQl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9CisJd2hpbGUodGVzdF9hbmRfc2V0X2JpdChib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJaWYgKGl4amRlYnVnICYgMHgwMDAyKQogCQlwcmludGsoS0VSTl9JTkZPICJDbG9zaW5nIGJvYXJkICVkXG4iLCBOVU0oaW5vZGUpKTsKIApAQCAtMzMwMSwxNCArMzI4MiwxMCBAQAogCWl4al9wbGF5X3RvbmUoaiwgMjMpOwogCiAJY2xlYXJfYml0KGotPmJvYXJkLCAmai0+YnVzeWZsYWdzKTsKLQl3aGlsZShqLT50b25lX3N0YXRlKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQotCXdoaWxlKHRlc3RfYW5kX3NldF9iaXQoai0+Ym9hcmQsICh2b2lkICopJmotPmJ1c3lmbGFncykgIT0gMCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwl3aGlsZShqLT50b25lX3N0YXRlKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CisJd2hpbGUodGVzdF9hbmRfc2V0X2JpdChqLT5ib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJaWYoaXhqZGVidWcgJiAweDAyMDApIHsKIAkJcHJpbnRrKCJJWEogY2lkY3cgcGhvbmUlZCBmaXJzdCB0b25lIGVuZCBhdCAlbGRcbiIsIGotPmJvYXJkLCBqaWZmaWVzKTsKIAl9CkBAIC0zMzI4LDE0ICszMzA1LDEwIEBACiAJaXhqX3BsYXlfdG9uZShqLCAyNCk7CiAKIAljbGVhcl9iaXQoai0+Ym9hcmQsICZqLT5idXN5ZmxhZ3MpOwotCXdoaWxlKGotPnRvbmVfc3RhdGUpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9Ci0Jd2hpbGUodGVzdF9hbmRfc2V0X2JpdChqLT5ib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCXdoaWxlKGotPnRvbmVfc3RhdGUpCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGotPmJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAlpZihpeGpkZWJ1ZyAmIDB4MDIwMCkgewogCQlwcmludGsoIklYSiBjaWRjdyBwaG9uZSVkIHNlbnQgc2Vjb25kIHRvbmUgYXQgJWxkXG4iLCBqLT5ib2FyZCwgamlmZmllcyk7CiAJfQpAQCAtMzM0MywxNCArMzMxNiwxMCBAQAogCWotPmNpZGN3X3dhaXQgPSBqaWZmaWVzICsgKCg1MCAqIGhlcnR6KSAvIDEwMCk7CiAKIAljbGVhcl9iaXQoai0+Ym9hcmQsICZqLT5idXN5ZmxhZ3MpOwotCXdoaWxlKCFqLT5mbGFncy5jaWRjd19hY2sgJiYgdGltZV9iZWZvcmUoamlmZmllcywgai0+Y2lkY3dfd2FpdCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQl9Ci0Jd2hpbGUodGVzdF9hbmRfc2V0X2JpdChqLT5ib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCXdoaWxlKCFqLT5mbGFncy5jaWRjd19hY2sgJiYgdGltZV9iZWZvcmUoamlmZmllcywgai0+Y2lkY3dfd2FpdCkpCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwl3aGlsZSh0ZXN0X2FuZF9zZXRfYml0KGotPmJvYXJkLCAodm9pZCAqKSZqLT5idXN5ZmxhZ3MpICE9IDApCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAlqLT5jaWRjd193YWl0ID0gMDsKIAlpZighai0+ZmxhZ3MuY2lkY3dfYWNrKSB7CiAJCWlmKGl4amRlYnVnICYgMHgwMjAwKSB7CkBAIC02MTI1LDEwICs2MDk0LDggQEAKIAkgKiAgICBTZXQgdXAgbG9ja3MgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgcHJvY2VzcyBpcyB0YWxraW5nIHRvIHRoZSBEU1AgYXQgYSB0aW1lLgogCSAqICAgIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIERTUCBmcm9tIGxvY2tpbmcgdXAuCiAJICovCi0Jd2hpbGUodGVzdF9hbmRfc2V0X2JpdChib2FyZCwgKHZvaWQgKikmai0+YnVzeWZsYWdzKSAhPSAwKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCXdoaWxlKHRlc3RfYW5kX3NldF9iaXQoYm9hcmQsICh2b2lkICopJmotPmJ1c3lmbGFncykgIT0gMCkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCWlmIChpeGpkZWJ1ZyAmIDB4MDA0MCkKIAkJcHJpbnRrKCJwaG9uZSVkIGlvY3RsLCBjbWQ6IDB4JXgsIGFyZzogMHglbHhcbiIsIG1pbm9yLCBjbWQsIGFyZyk7CiAJaWYgKG1pbm9yID49IElYSk1BWCkgewpAQCAtNjY5NCw4ICs2NjYxLDYgQEAKIAogc3RhdGljIGludCBpeGpfbGluZXRlc3QoSVhKICpqKQogewotCXVuc2lnbmVkIGxvbmcgamlmd2FpdDsKLQogCWotPmZsYWdzLnBzdG5jaGVjayA9IDE7CS8qIFRlc3RpbmcgKi8KIAlqLT5mbGFncy5wc3RuX3ByZXNlbnQgPSAwOyAvKiBBc3N1bWUgdGhlIGxpbmUgaXMgbm90IHRoZXJlICovCiAKQEAgLTY3MjYsMTEgKzY2OTEsNyBAQAogCiAJCW91dGJfcChqLT5wbGRfc2Nydy5ieXRlLCBqLT5YSUxJTlhiYXNlKTsKIAkJZGFhX3NldF9tb2RlKGosIFNPUF9QVV9DT05WRVJTQVRJT04pOwotCQlqaWZ3YWl0ID0gamlmZmllcyArIGhlcnR6OwotCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmd2FpdCkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQl9CisJCW1zbGVlcCgxMDAwKTsKIAkJZGFhX2ludF9yZWFkKGopOwogCQlkYWFfc2V0X21vZGUoaiwgU09QX1BVX1JFU0VUKTsKIAkJaWYgKGotPm1fREFBU2hhZG93UmVncy5YT1BfUkVHUy5YT1AueHIwLmJpdHJlZy5WRERfT0spIHsKQEAgLTY3NTAsMTEgKzY3MTEsNyBAQAogCWotPnBsZF9zbGljdy5iaXRzLnJseTMgPSAwOwogCW91dGJfcChqLT5wbGRfc2xpY3cuYnl0ZSwgai0+WElMSU5YYmFzZSArIDB4MDEpOwogCWRhYV9zZXRfbW9kZShqLCBTT1BfUFVfQ09OVkVSU0FUSU9OKTsKLQlqaWZ3YWl0ID0gamlmZmllcyArIGhlcnR6OwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWZ3YWl0KSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCX0KKwltc2xlZXAoMTAwMCk7CiAJZGFhX2ludF9yZWFkKGopOwogCWRhYV9zZXRfbW9kZShqLCBTT1BfUFVfUkVTRVQpOwogCWlmIChqLT5tX0RBQVNoYWRvd1JlZ3MuWE9QX1JFR1MuWE9QLnhyMC5iaXRyZWcuVkREX09LKSB7CkBAIC02NzgzLDcgKzY3NDAsNiBAQAogc3RhdGljIGludCBpeGpfc2VsZnByb2JlKElYSiAqaikKIHsKIAl1bnNpZ25lZCBzaG9ydCBjbWQ7Ci0JdW5zaWduZWQgbG9uZyBqaWY7CiAJaW50IGNudDsKIAlCWVRFUyBieXRlczsKIApAQCAtNjkzMywyOSArNjg4OSwxMyBAQAogCX0gZWxzZSB7CiAJCWlmIChqLT5jYXJkdHlwZSA9PSBRVElfTElORUpBQ0spIHsKIAkJCUxFRF9TZXRTdGF0ZSgweDEsIGopOwotCQkJamlmID0gamlmZmllcyArIChoZXJ0eiAvIDEwKTsKLQkJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWYpKSB7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQkJfQorCQkJbXNsZWVwKDEwMCk7CiAJCQlMRURfU2V0U3RhdGUoMHgyLCBqKTsKLQkJCWppZiA9IGppZmZpZXMgKyAoaGVydHogLyAxMCk7Ci0JCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmKSkgewotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJCX0KKwkJCW1zbGVlcCgxMDApOwogCQkJTEVEX1NldFN0YXRlKDB4NCwgaik7Ci0JCQlqaWYgPSBqaWZmaWVzICsgKGhlcnR6IC8gMTApOwotCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZikpIHsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCQl9CisJCQltc2xlZXAoMTAwKTsKIAkJCUxFRF9TZXRTdGF0ZSgweDgsIGopOwotCQkJamlmID0gamlmZmllcyArIChoZXJ0eiAvIDEwKTsKLQkJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWYpKSB7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQkJfQorCQkJbXNsZWVwKDEwMCk7CiAJCQlMRURfU2V0U3RhdGUoMHgwLCBqKTsKIAkJCWRhYV9nZXRfdmVyc2lvbihqKTsKIAkJCWlmIChpeGpkZWJ1ZyAmIDB4MDAwMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwppbmRleCA4ZTE4NGUyLi43OTg2MWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKKysrIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCkBAIC03MTUsMTMgKzcxNSwxMSBAQAogCQkJdXNiX2RldiwgdXNiX3JjdmludHBpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0NNRCksCiAJCQlpbnN0YW5jZS0+cmN2X2J1ZiwgUEFHRV9TSVpFLAogCQkJY3hhY3J1X2Jsb2NraW5nX2NvbXBsZXRpb24sICZpbnN0YW5jZS0+cmN2X2RvbmUsIDEpOwotCWluc3RhbmNlLT5yY3ZfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCiAJdXNiX2ZpbGxfaW50X3VyYihpbnN0YW5jZS0+c25kX3VyYiwKIAkJCXVzYl9kZXYsIHVzYl9zbmRpbnRwaXBlKHVzYl9kZXYsIENYQUNSVV9FUF9DTUQpLAogCQkJaW5zdGFuY2UtPnNuZF9idWYsIFBBR0VfU0laRSwKIAkJCWN4YWNydV9ibG9ja2luZ19jb21wbGV0aW9uLCAmaW5zdGFuY2UtPnNuZF9kb25lLCA0KTsKLQlpbnN0YW5jZS0+c25kX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAogCWluaXRfTVVURVgoJmluc3RhbmNlLT5jbV9zZXJpYWxpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKaW5kZXggYmIxZGIxOS4uYzQ2NjczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwpAQCAtOTYwLDcgKzk2MCw3IEBACiAJCQlpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCiAJLyogaW5zdGFuY2UgaW5pdCAqLwotCWluc3RhbmNlID0ga2NhbGxvYygxLCBzaXplb2YoKmluc3RhbmNlKSArIHNpemVvZihzdHJ1Y3QgdXJiICopICogKG51bV9yY3ZfdXJicyArIG51bV9zbmRfdXJicyksIEdGUF9LRVJORUwpOworCWluc3RhbmNlID0ga3phbGxvYyhzaXplb2YoKmluc3RhbmNlKSArIHNpemVvZihzdHJ1Y3QgdXJiICopICogKG51bV9yY3ZfdXJicyArIG51bV9zbmRfdXJicyksIEdGUF9LRVJORUwpOwogCWlmICghaW5zdGFuY2UpIHsKIAkJZGV2X2RiZyhkZXYsICIlczogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL0tjb25maWcgYi9kcml2ZXJzL3VzYi9jbGFzcy9LY29uZmlnCmluZGV4IDA1NjFkMDIzLi4zMzNlMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL0tjb25maWcKQEAgLTQsOSArNCwyMiBAQAogY29tbWVudCAiVVNCIERldmljZSBDbGFzcyBkcml2ZXJzIgogCWRlcGVuZHMgb24gVVNCCiAKK2NvbmZpZyBPQlNPTEVURV9PU1NfVVNCX0RSSVZFUgorCWJvb2wgIk9ic29sZXRlIE9TUyBVU0IgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFVTQiAmJiBTT1VORAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIG9ic29sZXRlIFVTQiBBdWRpbyBhbmQgTWlkaQorCSAgZHJpdmVycyB0aGF0IGFyZSBzY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4gdGhlIG5lYXIgZnV0dXJlIHNpbmNlCisJICB0aGVyZSBhcmUgQUxTQSBkcml2ZXJzIGZvciB0aGUgc2FtZSBoYXJkd2FyZS4KKworCSAgUGxlYXNlIGNvbnRhY3QgQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPiBpZiB5b3UgaGFkIHRvCisJICBzYXkgWSBoZXJlIGJlY2F1c2Ugb2YgbWlzc2luZyBzdXBwb3J0IGluIHRoZSBBTFNBIGRyaXZlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBVU0JfQVVESU8KIAl0cmlzdGF0ZSAiVVNCIEF1ZGlvIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IgJiYgU09VTkQKKwlkZXBlbmRzIG9uIFVTQiAmJiBTT1VORCAmJiBPQlNPTEVURV9PU1NfVVNCX0RSSVZFUgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBVU0IgYXVkaW8gZXF1aXBtZW50IHN1Y2ggYXMKIAkgIHNwZWFrZXJzIHRvIHlvdXIgY29tcHV0ZXIncyBVU0IgcG9ydC4gWW91IG9ubHkgbmVlZCB0aGlzIGlmIHlvdSB1c2UKQEAgLTQwLDEwICs1MywxMiBAQAogCiBjb25maWcgVVNCX01JREkKIAl0cmlzdGF0ZSAiVVNCIE1JREkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBTT1VORAorCWRlcGVuZHMgb24gVVNCICYmIFNPVU5EICYmIE9CU09MRVRFX09TU19VU0JfRFJJVkVSCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IGEgVVNCIE1JREkgZGV2aWNlIHRvIHlvdXIKLQkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIFRoaXMgZHJpdmVyIGlzIGZvciBkZXZpY2VzIHRoYXQgY29tcGx5IHdpdGgKKwkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuICBZb3Ugb25seSBuZWVkIHRoaXMgaWYgeW91IHVzZSB0aGUgT1NTCisJICBzb3VuZCBzeXN0ZW07IFVTQiBNSURJIGRldmljZXMgYXJlIHN1cHBvcnRlZCBieSBBTFNBJ3MgVVNCCisJICBhdWRpbyBkcml2ZXIuIFRoaXMgZHJpdmVyIGlzIGZvciBkZXZpY2VzIHRoYXQgY29tcGx5IHdpdGgKIAkgICdVbml2ZXJzYWwgU2VyaWFsIEJ1cyBEZXZpY2UgQ2xhc3MgRGVmaW5pdGlvbiBmb3IgTUlESSBEZXZpY2UnLgogCiAJICBUaGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGtub3duIHRvIHdvcms6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jIGIvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYwppbmRleCA3Y2U0M2ZiLi5lMTk1NzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKQEAgLTMxMCw4ICszMTAsOSBAQAogCiAJZXJyb3IgPSB1c2JscF9yZWFkX3N0YXR1cyAodXNibHAsIHVzYmxwLT5zdGF0dXNidWYpOwogCWlmIChlcnJvciA8IDApIHsKLQkJZXJyKCJ1c2JscCVkOiBlcnJvciAlZCByZWFkaW5nIHByaW50ZXIgc3RhdHVzIiwKLQkJCXVzYmxwLT5taW5vciwgZXJyb3IpOworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJZXJyKCJ1c2JscCVkOiBlcnJvciAlZCByZWFkaW5nIHByaW50ZXIgc3RhdHVzIiwKKwkJCQl1c2JscC0+bWlub3IsIGVycm9yKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MDQsNyArNjA1LDkgQEAKIAogCQkJY2FzZSBMUEdFVFNUQVRVUzoKIAkJCQlpZiAodXNibHBfcmVhZF9zdGF0dXModXNibHAsIHVzYmxwLT5zdGF0dXNidWYpKSB7Ci0JCQkJCWVycigidXNibHAlZDogZmFpbGVkIHJlYWRpbmcgcHJpbnRlciBzdGF0dXMiLCB1c2JscC0+bWlub3IpOworCQkJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJCQkJZXJyKCJ1c2JscCVkOiBmYWlsZWQgcmVhZGluZyBwcmludGVyIHN0YXR1cyIsCisJCQkJCQkJdXNibHAtPm1pbm9yKTsKIAkJCQkJcmV0dmFsID0gLUVJTzsKIAkJCQkJZ290byBkb25lOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlCmluZGV4IDllOGMzNzcuLmQ1NTAzY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZQpAQCAtMywxNCArMywxNCBAQAogIwogCiB1c2Jjb3JlLW9ianMJOj0gdXNiLm8gaHViLm8gaGNkLm8gdXJiLm8gbWVzc2FnZS5vIFwKLQkJCWNvbmZpZy5vIGZpbGUubyBidWZmZXIubyBzeXNmcy5vCisJCQljb25maWcubyBmaWxlLm8gYnVmZmVyLm8gc3lzZnMubyBkZXZpby5vCiAKIGlmZXEgKCQoQ09ORklHX1BDSSkseSkKIAl1c2Jjb3JlLW9ianMJKz0gaGNkLXBjaS5vCiBlbmRpZgogCiBpZmVxICgkKENPTkZJR19VU0JfREVWSUNFRlMpLHkpCi0JdXNiY29yZS1vYmpzCSs9IGRldmlvLm8gaW5vZGUubyBkZXZpY2VzLm8KKwl1c2Jjb3JlLW9ianMJKz0gaW5vZGUubyBkZXZpY2VzLm8KIGVuZGlmCiAKIG9iai0kKENPTkZJR19VU0IpCSs9IHVzYmNvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCmluZGV4IGY4NmJmMTQuLmI0MjY1YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTUwLDYgKzUxLDEwIEBACiAjaW5jbHVkZSAiaGNkLmgiCS8qIGZvciB1c2Jjb3JlIGludGVybmFscyAqLwogI2luY2x1ZGUgInVzYi5oIgogCisjZGVmaW5lIFVTQl9NQVhCVVMJCQk2NAorI2RlZmluZSBVU0JfREVWSUNFX01BWAkJCVVTQl9NQVhCVVMgKiAxMjgKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKnVzYl9kZXZpY2VfY2xhc3M7CisKIHN0cnVjdCBhc3luYyB7CiAJc3RydWN0IGxpc3RfaGVhZCBhc3luY2xpc3Q7CiAJc3RydWN0IGRldl9zdGF0ZSAqcHM7CkBAIC03MSw2ICs3Niw4IEBACiAJCQlkZXZfaW5mbyggZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsJXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgVVNCX0RFVklDRV9ERVYJCU1LREVWKFVTQl9ERVZJQ0VfTUFKT1IsIDApCisKIAogI2RlZmluZQlNQVhfVVNCRlNfQlVGRkVSX1NJWkUJMTYzODQKIApAQCAtNDg3LDcgKzQ5NCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgdXNiZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgZGV2X3N0YXRlICpwczsKIAlpbnQgcmV0OwogCkBAIC01MDEsMTEgKzUwOCwxNiBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAlyZXQgPSAtRU5PRU5UOwotCWRldiA9IHVzYl9nZXRfZGV2KGlub2RlLT51LmdlbmVyaWNfaXApOworCS8qIGNoZWNrIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSBhIHJlYWwgbm9kZSBvciB1c2JmcyAqLworCWlmIChpbWFqb3IoaW5vZGUpID09IFVTQl9ERVZJQ0VfTUFKT1IpCisJCWRldiA9IHVzYmRldl9sb29rdXBfbWlub3IoaW1pbm9yKGlub2RlKSk7CisJaWYgKCFkZXYpCisJCWRldiA9IGlub2RlLT51LmdlbmVyaWNfaXA7CiAJaWYgKCFkZXYpIHsKIAkJa2ZyZWUocHMpOwogCQlnb3RvIG91dDsKIAl9CisJdXNiX2dldF9kZXYoZGV2KTsKIAlyZXQgPSAwOwogCXBzLT5kZXYgPSBkZXY7CiAJcHMtPmZpbGUgPSBmaWxlOwpAQCAtMTIyNiw3ICsxMjM4LDYgQEAKIAlpbnQJCQlyZXR2YWwgPSAwOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICAgICppbnRmID0gTlVMTDsKIAlzdHJ1Y3QgdXNiX2RyaXZlciAgICAgICAqZHJpdmVyID0gTlVMTDsKLQlpbnQJCQlpOwogCiAJLyogZ2V0IGlucHV0IHBhcmFtZXRlcnMgYW5kIGFsbG9jIGJ1ZmZlciAqLwogCWlmIChjb3B5X2Zyb21fdXNlcigmY3RybCwgYXJnLCBzaXplb2YgKGN0cmwpKSkKQEAgLTEyNTgsMTUgKzEyNjksNiBAQAogCS8qIGRpc2Nvbm5lY3Qga2VybmVsIGRyaXZlciBmcm9tIGludGVyZmFjZSAqLwogCWNhc2UgVVNCREVWRlNfRElTQ09OTkVDVDoKIAotCQkvKiBkb24ndCBhbGxvdyB0aGUgdXNlciB0byB1bmJpbmQgdGhlIGh1YiBkcml2ZXIgZnJvbQotCQkgKiBhIGh1YiB3aXRoIGNoaWxkcmVuIHRvIG1hbmFnZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcHMtPmRldi0+bWF4Y2hpbGQ7ICsraSkgewotCQkJaWYgKHBzLT5kZXYtPmNoaWxkcmVuW2ldKQotCQkJCXJldHZhbCA9IC1FQlVTWTsKLQkJfQotCQlpZiAocmV0dmFsKQotCQkJYnJlYWs7Ci0KIAkJZG93bl93cml0ZSgmdXNiX2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJCWlmIChpbnRmLT5kZXYuZHJpdmVyKSB7CiAJCQlkcml2ZXIgPSB0b191c2JfZHJpdmVyKGludGYtPmRldi5kcml2ZXIpOwpAQCAtMTQ3NywzICsxNDc5LDc5IEBACiAJLm9wZW4gPQkJdXNiZGV2X29wZW4sCiAJLnJlbGVhc2UgPQl1c2JkZXZfcmVsZWFzZSwKIH07CisKK3N0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXZfbG9va3VwX21pbm9yKGludCBtaW5vcikKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwlkb3duKCZ1c2JfZGV2aWNlX2NsYXNzLT5zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xhc3NfZGV2LCAmdXNiX2RldmljZV9jbGFzcy0+Y2hpbGRyZW4sIG5vZGUpIHsKKwkJaWYgKGNsYXNzX2Rldi0+ZGV2dCA9PSBNS0RFVihVU0JfREVWSUNFX01BSk9SLCBtaW5vcikpIHsKKwkJCWRldiA9IGNsYXNzX2Rldi0+Y2xhc3NfZGF0YTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZ1c2JfZGV2aWNlX2NsYXNzLT5zZW0pOworCisJcmV0dXJuIGRldjsKK307CisKK3ZvaWQgdXNiZGV2X2FkZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQoreworCWludCBtaW5vciA9ICgoZGV2LT5idXMtPmJ1c251bS0xKSAqIDEyOCkgKyAoZGV2LT5kZXZudW0tMSk7CisKKwlkZXYtPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUodXNiX2RldmljZV9jbGFzcywKKwkJCQlNS0RFVihVU0JfREVWSUNFX01BSk9SLCBtaW5vciksICZkZXYtPmRldiwKKwkJCQkidXNiZGV2JWQuJWQiLCBkZXYtPmJ1cy0+YnVzbnVtLCBkZXYtPmRldm51bSk7CisKKwlkZXYtPmNsYXNzX2Rldi0+Y2xhc3NfZGF0YSA9IGRldjsKK30KKwordm9pZCB1c2JkZXZfcmVtb3ZlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCit7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoZGV2LT5jbGFzc19kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGNkZXYgdXNiX2RldmljZV9jZGV2ID0geworCS5rb2JqICAgPSB7Lm5hbWUgPSAidXNiX2RldmljZSIsIH0sCisJLm93bmVyICA9IFRISVNfTU9EVUxFLAorfTsKKworaW50IF9faW5pdCB1c2JkZXZfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKFVTQl9ERVZJQ0VfREVWLCBVU0JfREVWSUNFX01BWCwKKwkJCSJ1c2JfZGV2aWNlIik7CisJaWYgKHJldHZhbCkgeworCQllcnIoInVuYWJsZSB0byByZWdpc3RlciBtaW5vcnMgZm9yIHVzYl9kZXZpY2UiKTsKKwkJZ290byBvdXQ7CisJfQorCWNkZXZfaW5pdCgmdXNiX2RldmljZV9jZGV2LCAmdXNiZnNfZGV2aWNlX2ZpbGVfb3BlcmF0aW9ucyk7CisJcmV0dmFsID0gY2Rldl9hZGQoJnVzYl9kZXZpY2VfY2RldiwgVVNCX0RFVklDRV9ERVYsIFVTQl9ERVZJQ0VfTUFYKTsKKwlpZiAocmV0dmFsKSB7CisJCWVycigidW5hYmxlIHRvIGdldCB1c2JfZGV2aWNlIG1ham9yICVkIiwgVVNCX0RFVklDRV9NQUpPUik7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihVU0JfREVWSUNFX0RFViwgVVNCX0RFVklDRV9NQVgpOworCQlnb3RvIG91dDsKKwl9CisJdXNiX2RldmljZV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInVzYl9kZXZpY2UiKTsKKwlpZiAoSVNfRVJSKHVzYl9kZXZpY2VfY2xhc3MpKSB7CisJCWVycigidW5hYmxlIHRvIHJlZ2lzdGVyIHVzYl9kZXZpY2UgY2xhc3MiKTsKKwkJcmV0dmFsID0gUFRSX0VSUih1c2JfZGV2aWNlX2NsYXNzKTsKKwkJdXNiX2RldmljZV9jbGFzcyA9IE5VTEw7CisJCWNkZXZfZGVsKCZ1c2JfZGV2aWNlX2NkZXYpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oVVNCX0RFVklDRV9ERVYsIFVTQl9ERVZJQ0VfTUFYKTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIHVzYmRldl9jbGVhbnVwKHZvaWQpCit7CisJY2xhc3NfZGVzdHJveSh1c2JfZGV2aWNlX2NsYXNzKTsKKwljZGV2X2RlbCgmdXNiX2RldmljZV9jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oVVNCX0RFVklDRV9ERVYsIFVTQl9ERVZJQ0VfTUFYKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwppbmRleCBmYzA1NjA2Li5jYmI0NTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwpAQCAtMTIxLDEwICsxMjEsNiBAQAogCQl9CiAJfQogCi0jaWZkZWYgQ09ORklHX1BDSV9OQU1FUwotCWhjZC0+cHJvZHVjdF9kZXNjID0gZGV2LT5wcmV0dHlfbmFtZTsKLSNlbmRpZgotCiAJcGNpX3NldF9tYXN0ZXIgKGRldik7CiAKIAlyZXR2YWwgPSB1c2JfYWRkX2hjZCAoaGNkLCBkZXYtPmlycSwgU0FfU0hJUlEpOwpAQCAtMjY0LDggKzI2MCwxMCBAQAogCQlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlIChkZXYsIFBDSV9EM2hvdCk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewogCQkJZGV2X2RiZyAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICItLT4gUENJIEQzXG4iKTsKLQkJCXBjaV9lbmFibGVfd2FrZSAoZGV2LCBQQ0lfRDNob3QsIGhjZC0+cmVtb3RlX3dha2V1cCk7Ci0JCQlwY2lfZW5hYmxlX3dha2UgKGRldiwgUENJX0QzY29sZCwgaGNkLT5yZW1vdGVfd2FrZXVwKTsKKwkJCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZSAoZGV2LCBQQ0lfRDNob3QsIGhjZC0+cmVtb3RlX3dha2V1cCk7CisJCQlpZiAocmV0dmFsKQorCQkJCWJyZWFrOworCQkJcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlIChkZXYsIFBDSV9EM2NvbGQsIGhjZC0+cmVtb3RlX3dha2V1cCk7CiAJCX0gZWxzZSBpZiAocmV0dmFsIDwgMCkgewogCQkJZGV2X2RiZyAoJmRldi0+ZGV2LCAiUENJIEQzIHN1c3BlbmQgZmFpbCwgJWRcbiIsCiAJCQkJCXJldHZhbCk7CkBAIC0zMzksOCArMzM3LDIwIEBACiAJCQkJZGV2LT5jdXJyZW50X3N0YXRlKTsKIAkJfQogI2VuZGlmCi0JCXBjaV9lbmFibGVfd2FrZSAoZGV2LCBkZXYtPmN1cnJlbnRfc3RhdGUsIDApOwotCQlwY2lfZW5hYmxlX3dha2UgKGRldiwgUENJX0QzY29sZCwgMCk7CisJCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZSAoZGV2LCBkZXYtPmN1cnJlbnRfc3RhdGUsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJCSJjYW4ndCBlbmFibGVfd2FrZSB0byAlZCwgJWQhXG4iLAorCQkJCWRldi0+Y3VycmVudF9zdGF0ZSwgcmV0dmFsKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlIChkZXYsIFBDSV9EM2NvbGQsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJCSJjYW4ndCBlbmFibGVfd2FrZSB0byAlZCwgJWQhXG4iLAorCQkJCVBDSV9EM2NvbGQsIHJldHZhbCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfSBlbHNlIHsKIAkJLyogU2FtZSBiYXNpYyBjYXNlczogY2xlYW4gKHBvd2VyZWQvbm90KSwgZGlydHkgKi8KIAkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIlBDSSBsZWdhY3kgcmVzdW1lXG4iKTsKQEAgLTM4MCw3ICszOTAsNyBAQAogCQl1c2JfaGNfZGllZCAoaGNkKTsKIAl9CiAKLQlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIEVYUE9SVF9TWU1CT0wgKHVzYl9oY2RfcGNpX3Jlc3VtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCA5ZjQ0ZTgzLi4xMmVjZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTE2NjksNyArMTY2OSw3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAotCWhjZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpoY2QpICsgZHJpdmVyLT5oY2RfcHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKKwloY2QgPSBremFsbG9jKHNpemVvZigqaGNkKSArIGRyaXZlci0+aGNkX3ByaXZfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoY2QpIHsKIAkJZGV2X2RiZyAoZGV2LCAiaGNkIGFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKaW5kZXggMjgwNTVmOS4uYWM0NTFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC0zMzksMTEgKzMzOSwxMSBAQAogICogdG8gcHJlYWxsb2NhdGUgYmFuZHdpZHRoKQogICovCiAjZGVmaW5lIFVTQjJfSE9TVF9ERUxBWQk1CS8qIG5zZWMsIGd1ZXNzICovCi0jZGVmaW5lIEhTX05TRUNTKGJ5dGVzKSAoICgoNTUgKiA4ICogMjA4MykvMTAwMCkgXAotCSsgKCgyMDgzVUwgKiAoMzE2NyArIEJpdFRpbWUgKGJ5dGVzKSkpLzEwMDApIFwKKyNkZWZpbmUgSFNfTlNFQ1MoYnl0ZXMpICggKCg1NSAqIDggKiAyMDgzKSBcCisJKyAoMjA4M1VMICogKDMgKyBCaXRUaW1lKGJ5dGVzKSkpKS8xMDAwIFwKIAkrIFVTQjJfSE9TVF9ERUxBWSkKLSNkZWZpbmUgSFNfTlNFQ1NfSVNPKGJ5dGVzKSAoICgoMzggKiA4ICogMjA4MykvMTAwMCkgXAotCSsgKCgyMDgzVUwgKiAoMzE2NyArIEJpdFRpbWUgKGJ5dGVzKSkpLzEwMDApIFwKKyNkZWZpbmUgSFNfTlNFQ1NfSVNPKGJ5dGVzKSAoICgoMzggKiA4ICogMjA4MykgXAorCSsgKDIwODNVTCAqICgzICsgQml0VGltZShieXRlcykpKSkvMTAwMCBcCiAJKyBVU0IyX0hPU1RfREVMQVkpCiAjZGVmaW5lIEhTX1VTRUNTKGJ5dGVzKSBOU19UT19VUyAoSFNfTlNFQ1MoYnl0ZXMpKQogI2RlZmluZSBIU19VU0VDU19JU08oYnl0ZXMpIE5TX1RPX1VTIChIU19OU0VDU19JU08oYnl0ZXMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9odWIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKaW5kZXggYzk0MTJkYS4uNzU4YzdmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC00OTIsNiArNDkyLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBodWJfcG9ydF9kaXNhYmxlKHN0cnVjdCB1c2JfaHViICpodWIsIGludCBwb3J0MSwgaW50IHNldF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiA9IGh1Yi0+aGRldjsKKwlpbnQgcmV0OworCisJaWYgKGhkZXYtPmNoaWxkcmVuW3BvcnQxLTFdICYmIHNldF9zdGF0ZSkgeworCQl1c2Jfc2V0X2RldmljZV9zdGF0ZShoZGV2LT5jaGlsZHJlbltwb3J0MS0xXSwKKwkJCQlVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOworCX0KKwlyZXQgPSBjbGVhcl9wb3J0X2ZlYXR1cmUoaGRldiwgcG9ydDEsIFVTQl9QT1JUX0ZFQVRfRU5BQkxFKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGh1Yi0+aW50ZmRldiwgImNhbm5vdCBkaXNhYmxlIHBvcnQgJWQgKGVyciA9ICVkKVxuIiwKKwkJCXBvcnQxLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBodWJfY29uZmlndXJlKHN0cnVjdCB1c2JfaHViICpodWIsCiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludCkKIHsKQEAgLTYxMCwxOSArNjI3LDMzIEBACiAJCQlicmVhazsKIAl9CiAKKwkvKiBOb3RlIDggRlMgYml0IHRpbWVzID09ICg4IGJpdHMgLyAxMjAwMDAwMCBicHMpIH49IDY2Nm5zICovCiAJc3dpdGNoIChodWItPmRlc2NyaXB0b3ItPndIdWJDaGFyYWN0ZXJpc3RpY3MgJiBIVUJfQ0hBUl9UVFRUKSB7Ci0JCWNhc2UgMHgwMDoKLQkJCWlmIChoZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCAhPSAwKQotCQkJCWRldl9kYmcoaHViX2RldiwgIlRUIHJlcXVpcmVzIGF0IG1vc3QgOCBGUyBiaXQgdGltZXNcbiIpOworCQljYXNlIEhVQl9UVFRUXzhfQklUUzoKKwkJCWlmIChoZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCAhPSAwKSB7CisJCQkJaHViLT50dC50aGlua190aW1lID0gNjY2OworCQkJCWRldl9kYmcoaHViX2RldiwgIlRUIHJlcXVpcmVzIGF0IG1vc3QgJWQgIgorCQkJCQkJIkZTIGJpdCB0aW1lcyAoJWQgbnMpXG4iLAorCQkJCQk4LCBodWItPnR0LnRoaW5rX3RpbWUpOworCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgMHgyMDoKLQkJCWRldl9kYmcoaHViX2RldiwgIlRUIHJlcXVpcmVzIGF0IG1vc3QgMTYgRlMgYml0IHRpbWVzXG4iKTsKKwkJY2FzZSBIVUJfVFRUVF8xNl9CSVRTOgorCQkJaHViLT50dC50aGlua190aW1lID0gNjY2ICogMjsKKwkJCWRldl9kYmcoaHViX2RldiwgIlRUIHJlcXVpcmVzIGF0IG1vc3QgJWQgIgorCQkJCQkiRlMgYml0IHRpbWVzICglZCBucylcbiIsCisJCQkJMTYsIGh1Yi0+dHQudGhpbmtfdGltZSk7CiAJCQlicmVhazsKLQkJY2FzZSAweDQwOgotCQkJZGV2X2RiZyhodWJfZGV2LCAiVFQgcmVxdWlyZXMgYXQgbW9zdCAyNCBGUyBiaXQgdGltZXNcbiIpOworCQljYXNlIEhVQl9UVFRUXzI0X0JJVFM6CisJCQlodWItPnR0LnRoaW5rX3RpbWUgPSA2NjYgKiAzOworCQkJZGV2X2RiZyhodWJfZGV2LCAiVFQgcmVxdWlyZXMgYXQgbW9zdCAlZCAiCisJCQkJCSJGUyBiaXQgdGltZXMgKCVkIG5zKVxuIiwKKwkJCQkyNCwgaHViLT50dC50aGlua190aW1lKTsKIAkJCWJyZWFrOwotCQljYXNlIDB4NjA6Ci0JCQlkZXZfZGJnKGh1Yl9kZXYsICJUVCByZXF1aXJlcyBhdCBtb3N0IDMyIEZTIGJpdCB0aW1lc1xuIik7CisJCWNhc2UgSFVCX1RUVFRfMzJfQklUUzoKKwkJCWh1Yi0+dHQudGhpbmtfdGltZSA9IDY2NiAqIDQ7CisJCQlkZXZfZGJnKGh1Yl9kZXYsICJUVCByZXF1aXJlcyBhdCBtb3N0ICVkICIKKwkJCQkJIkZTIGJpdCB0aW1lcyAoJWQgbnMpXG4iLAorCQkJCTMyLCBodWItPnR0LnRoaW5rX3RpbWUpOwogCQkJYnJlYWs7CiAJfQogCkBAIC03MTIsMjAgKzc0MywzNiBAQAogCiBzdGF0aWMgdW5zaWduZWQgaGlnaHNwZWVkX2h1YnM7CiAKKy8qIENhbGxlZCBhZnRlciB0aGUgaHViIGRyaXZlciBpcyB1bmJvdW5kIGZyb20gYSBodWIgd2l0aCBjaGlsZHJlbiAqLworc3RhdGljIHZvaWQgaHViX3JlbW92ZV9jaGlsZHJlbl93b3JrKHZvaWQgKl9faHViKQoreworCXN0cnVjdCB1c2JfaHViCQkqaHViID0gX19odWI7CisJc3RydWN0IHVzYl9kZXZpY2UJKmhkZXYgPSBodWItPmhkZXY7CisJaW50CQkJaTsKKworCWtmcmVlKGh1Yik7CisKKwl1c2JfbG9ja19kZXZpY2UoaGRldik7CisJZm9yIChpID0gMDsgaSA8IGhkZXYtPm1heGNoaWxkOyArK2kpIHsKKwkJaWYgKGhkZXYtPmNoaWxkcmVuW2ldKQorCQkJdXNiX2Rpc2Nvbm5lY3QoJmhkZXYtPmNoaWxkcmVuW2ldKTsKKwl9CisJdXNiX3VubG9ja19kZXZpY2UoaGRldik7CisJdXNiX3B1dF9kZXYoaGRldik7Cit9CisKIHN0YXRpYyB2b2lkIGh1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfaHViICpodWIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqaGRldjsKKwlpbnQgbiwgcG9ydDE7CiAKLQlpZiAoIWh1YikKLQkJcmV0dXJuOworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOwogCWhkZXYgPSBodWItPmhkZXY7CiAKIAlpZiAoaGRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCWhpZ2hzcGVlZF9odWJzLS07CiAKLQl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKLQogCWh1Yl9xdWllc2NlKGh1Yik7CiAJdXNiX2ZyZWVfdXJiKGh1Yi0+dXJiKTsKIAlodWItPnVyYiA9IE5VTEw7CkBAIC03NDYsOCArNzkzLDI3IEBACiAJCWh1Yi0+YnVmZmVyID0gTlVMTDsKIAl9CiAKLQkvKiBGcmVlIHRoZSBtZW1vcnkgKi8KLQlrZnJlZShodWIpOworCS8qIElmIHRoZXJlIGFyZSBhbnkgY2hpbGRyZW4gdGhlbiB0aGlzIGlzIGFuIHVuYmluZCBvbmx5LCBub3QgYQorCSAqIHBoeXNpY2FsIGRpc2Nvbm5lY3Rpb24uICBUaGUgYWN0aXZlIHBvcnRzIG11c3QgYmUgZGlzYWJsZWQKKwkgKiBhbmQgbGF0ZXIgb24gd2UgbXVzdCBjYWxsIHVzYl9kaXNjb25uZWN0KCkuICBXZSBjYW4ndCBjYWxsCisJICogaXQgbm93IGJlY2F1c2Ugd2UgbWF5IG5vdCBob2xkIHRoZSBodWIncyBkZXZpY2UgbG9jay4KKwkgKi8KKwluID0gMDsKKwlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7ICsrcG9ydDEpIHsKKwkJaWYgKGhkZXYtPmNoaWxkcmVuW3BvcnQxIC0gMV0pIHsKKwkJCSsrbjsKKwkJCWh1Yl9wb3J0X2Rpc2FibGUoaHViLCBwb3J0MSwgMSk7CisJCX0KKwl9CisKKwlpZiAobiA9PSAwKQorCQlrZnJlZShodWIpOworCWVsc2UgeworCQkvKiBSZXVzZSB0aGUgaHViLT5sZWRzIHdvcmtfc3RydWN0IGZvciBvdXIgb3duIHB1cnBvc2VzICovCisJCUlOSVRfV09SSygmaHViLT5sZWRzLCBodWJfcmVtb3ZlX2NoaWxkcmVuX3dvcmssIGh1Yik7CisJCXNjaGVkdWxlX3dvcmsoJmh1Yi0+bGVkcyk7CisJCXVzYl9nZXRfZGV2KGhkZXYpOworCX0KIH0KIAogc3RhdGljIGludCBodWJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTEwNTEsNiArMTExNyw3IEBACiAJZGV2X2RiZyAoJnVkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgZGV2aWNlXG4iKTsKIAlyZWxlYXNlX2FkZHJlc3ModWRldik7CiAJdXNiZnNfcmVtb3ZlX2RldmljZSh1ZGV2KTsKKwl1c2JkZXZfcmVtb3ZlKHVkZXYpOwogCXVzYl9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHVkZXYpOwogCiAJLyogQXZvaWQgcmFjZXMgd2l0aCByZWN1cnNpdmVseV9tYXJrX05PVEFUVEFDSEVEKCkgKi8KQEAgLTEyOTAsNiArMTM1Nyw3IEBACiAJLyogVVNCIGRldmljZSBzdGF0ZSA9PSBjb25maWd1cmVkIC4uLiB1c2FibGUgKi8KIAogCS8qIGFkZCBhIC9wcm9jL2J1cy91c2IgZW50cnkgKi8KKwl1c2JkZXZfYWRkKHVkZXYpOwogCXVzYmZzX2FkZF9kZXZpY2UodWRldik7CiAJcmV0dXJuIDA7CiAKQEAgLTE0MjgsMjMgKzE0OTYsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgaHViX3BvcnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2h1YiAqaHViLCBpbnQgcG9ydDEsIGludCBzZXRfc3RhdGUpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYgPSBodWItPmhkZXY7Ci0JaW50IHJldDsKLQotCWlmIChoZGV2LT5jaGlsZHJlbltwb3J0MS0xXSAmJiBzZXRfc3RhdGUpIHsKLQkJdXNiX3NldF9kZXZpY2Vfc3RhdGUoaGRldi0+Y2hpbGRyZW5bcG9ydDEtMV0sCi0JCQkJVVNCX1NUQVRFX05PVEFUVEFDSEVEKTsKLQl9Ci0JcmV0ID0gY2xlYXJfcG9ydF9mZWF0dXJlKGhkZXYsIHBvcnQxLCBVU0JfUE9SVF9GRUFUX0VOQUJMRSk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihodWItPmludGZkZXYsICJjYW5ub3QgZGlzYWJsZSBwb3J0ICVkIChlcnIgPSAlZClcbiIsCi0JCQlwb3J0MSwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBEaXNhYmxlIGEgcG9ydCBhbmQgbWFyayBhIGxvZ2ljYWwgY29ubm5lY3QtY2hhbmdlIGV2ZW50LCBzbyB0aGF0IHNvbWUKICAqIHRpbWUgbGF0ZXIga2h1YmQgd2lsbCBkaXNjb25uZWN0KCkgYW55IGV4aXN0aW5nIHVzYl9kZXZpY2Ugb24gdGhlIHBvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmggYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCmluZGV4IDUzYmY1NjQuLmU3ZmE5YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuaApAQCAtMTU3LDYgKzE1NywxMiBAQAogCiBzdHJ1Y3QgdXNiX2RldmljZTsKIAorLyogVHJhbnNhY3Rpb24gVHJhbnNsYXRvciBUaGluayBUaW1lcywgaW4gYml0cyAqLworI2RlZmluZSBIVUJfVFRUVF84X0JJVFMJCTB4MDAKKyNkZWZpbmUgSFVCX1RUVFRfMTZfQklUUwkweDIwCisjZGVmaW5lIEhVQl9UVFRUXzI0X0JJVFMJMHg0MAorI2RlZmluZSBIVUJfVFRUVF8zMl9CSVRTCTB4NjAKKwogLyoKICAqIEFzIG9mIFVTQiAyLjAsIGZ1bGwvbG93IHNwZWVkIGRldmljZXMgYXJlIHNlZ3JlZ2F0ZWQgaW50byB0cmVlcy4KICAqIE9uZSB0eXBlIGdyb3dzIGZyb20gVVNCIDEuMSBob3N0IGNvbnRyb2xsZXJzIChPSENJLCBVSENJIGV0YykuCkBAIC0xNzAsNiArMTc2LDcgQEAKIHN0cnVjdCB1c2JfdHQgewogCXN0cnVjdCB1c2JfZGV2aWNlCSpodWI7CS8qIHVwc3RyZWFtIGhpZ2hzcGVlZCBodWIgKi8KIAlpbnQJCQltdWx0aTsJLyogdHJ1ZSBtZWFucyBvbmUgVFQgcGVyIHBvcnQgKi8KKwl1bnNpZ25lZAkJdGhpbmtfdGltZTsJLyogdGhpbmsgdGltZSBpbiBucyAqLwogCiAJLyogZm9yIGNvbnRyb2wvYnVsayBlcnJvciByZWNvdmVyeSAoQ0xFQVJfVFRfQlVGRkVSKSAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggYzNlM2E5NS4uNjQwZjQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtNzI4LDE2ICs3MjgsMTAgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOworCXJldHZhbCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnVzYl9mc190eXBlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcmV0dmFsID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXNiX2ZzX3R5cGUpOwotCWlmIChyZXR2YWwpIHsKLQkJdXNiX2RlcmVnaXN0ZXIoJnVzYmZzX2RyaXZlcik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCiAJLyogY3JlYXRlIG1vdW50IHBvaW50IGZvciB1c2JmcyAqLwogCXVzYmRpciA9IHByb2NfbWtkaXIoInVzYiIsIHByb2NfYnVzKTsKIApAQCAtNzQ2LDcgKzc0MCw2IEBACiAKIHZvaWQgdXNiZnNfY2xlYW51cCh2b2lkKQogewotCXVzYl9kZXJlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXNiX2ZzX3R5cGUpOwogCWlmICh1c2JkaXIpCiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJ1c2IiLCBwcm9jX2J1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDg4ZDFiMzcuLmM0N2M4MDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtNDgsNyArNDgsNiBAQAogCiAJaW5pdF9jb21wbGV0aW9uKCZkb25lKTsgCQogCXVyYi0+Y29udGV4dCA9ICZkb25lOwotCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX05PSU8pOwogCkBAIC0yNjYsNyArMjY1LDkgQEAKIAkJCQljb250aW51ZTsKIAkJCWlmIChmb3VuZCkgewogCQkJCXN0YXR1cyA9IHVzYl91bmxpbmtfdXJiIChpby0+dXJicyBbaV0pOwotCQkJCWlmIChzdGF0dXMgIT0gLUVJTlBST0dSRVNTICYmIHN0YXR1cyAhPSAtRUJVU1kpCisJCQkJaWYgKHN0YXR1cyAhPSAtRUlOUFJPR1JFU1MKKwkJCQkJCSYmIHN0YXR1cyAhPSAtRU5PREVWCisJCQkJCQkmJiBzdGF0dXMgIT0gLUVCVVNZKQogCQkJCQlkZXZfZXJyICgmaW8tPmRldi0+ZGV2LAogCQkJCQkJIiVzLCB1bmxpbmsgLS0+ICVkXG4iLAogCQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwpAQCAtMzU3LDggKzM1OCw3IEBACiAJaWYgKCFpby0+dXJicykKIAkJZ290byBub21lbTsKIAotCXVyYl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTksgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUAotCQkJfCBVUkJfTk9fSU5URVJSVVBUOworCXVyYl9mbGFncyA9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQIHwgVVJCX05PX0lOVEVSUlVQVDsKIAlpZiAodXNiX3BpcGVpbiAocGlwZSkpCiAJCXVyYl9mbGFncyB8PSBVUkJfU0hPUlRfTk9UX09LOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwppbmRleCBjMGZlZWUyLi5jODQ2ZmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKQEAgLTMwOSw5ICszMDksOCBAQAogCXVuc2lnbmVkIGludAlhbGxvd2VkOwogCiAJLyogZW5mb3JjZSBzaW1wbGUvc3RhbmRhcmQgcG9saWN5ICovCi0JYWxsb3dlZCA9IFVSQl9BU1lOQ19VTkxJTks7CS8vIGFmZmVjdHMgbGF0ZXIgdW5saW5rcwotCWFsbG93ZWQgfD0gKFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQIHwgVVJCX05PX1NFVFVQX0RNQV9NQVApOwotCWFsbG93ZWQgfD0gVVJCX05PX0lOVEVSUlVQVDsKKwlhbGxvd2VkID0gKFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQIHwgVVJCX05PX1NFVFVQX0RNQV9NQVAgfAorCQkJVVJCX05PX0lOVEVSUlVQVCk7CiAJc3dpdGNoICh0ZW1wKSB7CiAJY2FzZSBQSVBFX0JVTEs6CiAJCWlmIChpc19vdXQpCkBAIC00MDAsMTQgKzM5OSw4IEBACiAgKiBjYW5jZWxlZCAocmF0aGVyIHRoYW4gYW55IG90aGVyIGNvZGUpIGFuZCB3aWxsIHF1aWNrbHkgYmUgcmVtb3ZlZAogICogZnJvbSBob3N0IGNvbnRyb2xsZXIgZGF0YSBzdHJ1Y3R1cmVzLgogICoKLSAqIEluIHRoZSBwYXN0LCBjbGVhcmluZyB0aGUgVVJCX0FTWU5DX1VOTElOSyB0cmFuc2ZlciBmbGFnIGZvciB0aGUKLSAqIFVSQiBpbmRpY2F0ZWQgdGhhdCB0aGUgcmVxdWVzdCB3YXMgc3luY2hyb25vdXMuICBUaGlzIHVzYWdlIGlzIG5vdwotICogZGVwcmVjYXRlZDsgaWYgdGhlIGZsYWcgaXMgY2xlYXIgdGhlIGNhbGwgd2lsbCBiZSBmb3J3YXJkZWQgdG8KLSAqIHVzYl9raWxsX3VyYigpIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgMC4gIEluIHRoZSBmdXR1cmUsIGRyaXZlcnMKLSAqIHNob3VsZCBjYWxsIHVzYl9raWxsX3VyYigpIGRpcmVjdGx5IGZvciBzeW5jaHJvbm91cyB1bmxpbmtpbmcuCi0gKgotICogV2hlbiB0aGUgVVJCX0FTWU5DX1VOTElOSyB0cmFuc2ZlciBmbGFnIGZvciB0aGUgVVJCIGlzIHNldCwgdGhpcwotICogcmVxdWVzdCBpcyBhc3luY2hyb25vdXMuICBTdWNjZXNzIGlzIGluZGljYXRlZCBieSByZXR1cm5pbmcgLUVJTlBST0dSRVNTLAorICogVGhpcyByZXF1ZXN0IGlzIGFsd2F5cyBhc3luY2hyb25vdXMuCisgKiBTdWNjZXNzIGlzIGluZGljYXRlZCBieSByZXR1cm5pbmcgLUVJTlBST0dSRVNTLAogICogYXQgd2hpY2ggdGltZSB0aGUgVVJCIHdpbGwgbm9ybWFsbHkgaGF2ZSBiZWVuIHVubGlua2VkIGJ1dCBub3QgeWV0CiAgKiBnaXZlbiBiYWNrIHRvIHRoZSBkZXZpY2UgZHJpdmVyLiAgV2hlbiBpdCBpcyBjYWxsZWQsIHRoZSBjb21wbGV0aW9uCiAgKiBmdW5jdGlvbiB3aWxsIHNlZSB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVC4gIEZhaWx1cmUgaXMgaW5kaWNhdGVkCkBAIC00NTMsMTcgKzQ0Niw2IEBACiB7CiAJaWYgKCF1cmIpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfQVNZTkNfVU5MSU5LKSkgewotI2lmZGVmIENPTkZJR19ERUJVR19LRVJORUwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJ1c2JfdW5saW5rX3VyYigpIGlzIGRlcHJlY2F0ZWQgZm9yICIKLQkJCQkic3luY2hyb25vdXMgdW5saW5rcy4gIFVzZSB1c2Jfa2lsbF91cmIoKSBpbnN0ZWFkLlxuIik7Ci0JCQlXQVJOX09OKDEpOwotCQl9Ci0jZW5kaWYKLQkJdXNiX2tpbGxfdXJiKHVyYik7Ci0JCXJldHVybiAwOwotCX0KIAlpZiAoISh1cmItPmRldiAmJiB1cmItPmRldi0+YnVzICYmIHVyYi0+ZGV2LT5idXMtPm9wKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmV0dXJuIHVyYi0+ZGV2LT5idXMtPm9wLT51bmxpbmtfdXJiKHVyYiwgLUVDT05OUkVTRVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggMmNkZGQ4YS4uMDg3YWY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC02NSw2ICs2NSwxNiBAQAogfQogc3RhdGljIGludCBnZW5lcmljX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOworCisJLyogaWYgdGhpcyBpcyBvbmx5IGFuIHVuYmluZCwgbm90IGEgcGh5c2ljYWwgZGlzY29ubmVjdCwgdGhlbgorCSAqIHVuY29uZmlndXJlIHRoZSBkZXZpY2UgKi8KKwlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpCisJCXVzYl9zZXRfY29uZmlndXJhdGlvbih1ZGV2LCAwKTsKKworCS8qIGluIGNhc2UgdGhlIGNhbGwgZmFpbGVkIG9yIHRoZSBkZXZpY2Ugd2FzIHN1c3BlbmRlZCAqLworCWlmICh1ZGV2LT5zdGF0ZSA+PSBVU0JfU1RBVEVfQ09ORklHVVJFRCkKKwkJdXNiX2Rpc2FibGVfZGV2aWNlKHVkZXYsIDApOwogCXJldHVybiAwOwogfQogCkBAIC05MTIsNyArOTIyLDcgQEAKICAqIGlzIG5laXRoZXIgQklORElORyBub3IgQk9VTkQuICBSYXRoZXIgdGhhbiBzbGVlcGluZyB0byB3YWl0IGZvciB0aGUKICAqIGxvY2ssIHRoZSByb3V0aW5lIHBvbGxzIHJlcGVhdGVkbHkuICBUaGlzIGlzIHRvIHByZXZlbnQgZGVhZGxvY2sgd2l0aAogICogZGlzY29ubmVjdDsgaW4gc29tZSBkcml2ZXJzIChzdWNoIGFzIHVzYi1zdG9yYWdlKSB0aGUgZGlzY29ubmVjdCgpCi0gKiBjYWxsYmFjayB3aWxsIGJsb2NrIHdhaXRpbmcgZm9yIGEgZGV2aWNlIHJlc2V0IHRvIGNvbXBsZXRlLgorICogb3Igc3VzcGVuZCgpIG1ldGhvZCB3aWxsIGJsb2NrIHdhaXRpbmcgZm9yIGEgZGV2aWNlIHJlc2V0IHRvIGNvbXBsZXRlLgogICoKICAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLCBvdGhlcndpc2UgMSBvciAwIHRvIGluZGljYXRlCiAgKiB0aGF0IHRoZSBkZXZpY2Ugd2lsbCBvciB3aWxsIG5vdCBoYXZlIHRvIGJlIHVubG9ja2VkLiAgKDAgY2FuIGJlCkBAIC05MjIsNiArOTMyLDggQEAKIGludCB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCiB7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzX2V4cGlyZSA9IGppZmZpZXMgKyBIWjsKKwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCiAJCXJldHVybiAtRU5PREVWOwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQpAQCAtOTM4LDYgKzk1MCwxMiBAQAogCX0KIAogCXdoaWxlICghdXNiX3RyeWxvY2tfZGV2aWNlKHVkZXYpKSB7CisKKwkJLyogSWYgd2UgY2FuJ3QgYWNxdWlyZSB0aGUgbG9jayBhZnRlciB3YWl0aW5nIG9uZSBzZWNvbmQsCisJCSAqIHdlJ3JlIHByb2JhYmx5IGRlYWRsb2NrZWQgKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgamlmZmllc19leHBpcmUpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwogCQltc2xlZXAoMTUpOwogCQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQogCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNDc4LDEzICsxNDk2LDE4IEBACiAJcmV0dmFsID0gdXNiX21ham9yX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIG1ham9yX2luaXRfZmFpbGVkOworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiZnNfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRyaXZlcl9yZWdpc3Rlcl9mYWlsZWQ7CisJcmV0dmFsID0gdXNiZGV2X2luaXQoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHVzYmRldmljZV9pbml0X2ZhaWxlZDsKIAlyZXR2YWwgPSB1c2Jmc19pbml0KCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBmc19pbml0X2ZhaWxlZDsKIAlyZXR2YWwgPSB1c2JfaHViX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGh1Yl9pbml0X2ZhaWxlZDsKLQogCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmdXNiX2dlbmVyaWNfZHJpdmVyKTsKIAlpZiAoIXJldHZhbCkKIAkJZ290byBvdXQ7CkBAIC0xNDkzLDcgKzE1MTYsMTEgQEAKIGh1Yl9pbml0X2ZhaWxlZDoKIAl1c2Jmc19jbGVhbnVwKCk7CiBmc19pbml0X2ZhaWxlZDoKLQl1c2JfbWFqb3JfY2xlYW51cCgpOwkKKwl1c2JkZXZfY2xlYW51cCgpOwordXNiZGV2aWNlX2luaXRfZmFpbGVkOgorCXVzYl9kZXJlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOworZHJpdmVyX3JlZ2lzdGVyX2ZhaWxlZDoKKwl1c2JfbWFqb3JfY2xlYW51cCgpOwogbWFqb3JfaW5pdF9mYWlsZWQ6CiAJdXNiX2hvc3RfY2xlYW51cCgpOwogaG9zdF9pbml0X2ZhaWxlZDoKQEAgLTE1MTQsNiArMTU0MSw4IEBACiAJZHJpdmVyX3VucmVnaXN0ZXIoJnVzYl9nZW5lcmljX2RyaXZlcik7CiAJdXNiX21ham9yX2NsZWFudXAoKTsKIAl1c2Jmc19jbGVhbnVwKCk7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYmZzX2RyaXZlcik7CisJdXNiZGV2X2NsZWFudXAoKTsKIAl1c2JfaHViX2NsZWFudXAoKTsKIAl1c2JfaG9zdF9jbGVhbnVwKCk7CiAJYnVzX3VucmVnaXN0ZXIoJnVzYl9idXNfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oIGIvZHJpdmVycy91c2IvY29yZS91c2IuaAppbmRleCAyYzY5MGY2Li44M2Q0OGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKQEAgLTM3LDYgKzM3LDExIEBACiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIHZvaWQgdXNiZnNfY29ubl9kaXNjX2V2ZW50KHZvaWQpOwogCitleHRlcm4gaW50IHVzYmRldl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdXNiZGV2X2NsZWFudXAodm9pZCk7CitleHRlcm4gdm9pZCB1c2JkZXZfYWRkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdXNiZGV2X3JlbW92ZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2X2xvb2t1cF9taW5vcihpbnQgbWlub3IpOwogCiBzdHJ1Y3QgZGV2X3N0YXRlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgICAgLyogc3RhdGUgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCA4NTA5ZTk1Li40OTQ1OWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtMjE4MSw2ICsyMTgxLDcgQEAKIAl1OAkJCWNkYyA9IDEsIHpscCA9IDEsIHJuZGlzID0gMTsKIAlzdHJ1Y3QgdXNiX2VwCQkqaW5fZXAsICpvdXRfZXAsICpzdGF0dXNfZXAgPSBOVUxMOwogCWludAkJCXN0YXR1cyA9IC1FTk9NRU07CisJaW50CQkJZ2NudW07CiAKIAkvKiB0aGVzZSBmbGFncyBhcmUgb25seSBldmVyIGNsZWFyZWQ7IGNvbXBpbGVyIHRha2Ugbm90ZSAqLwogI2lmbmRlZglERVZfQ09ORklHX0NEQwpAQCAtMjE5NCw0NCArMjE5NSwyNiBAQAogCSAqIHN0YW5kYXJkIHByb3RvY29sIGlzIF9zdHJvbmdseV8gcHJlZmVycmVkIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogCSAqIChCeSBldmVyeW9uZSBleGNlcHQgTWljcm9zb2Z0LikKIAkgKi8KLQlpZiAoZ2FkZ2V0X2lzX25ldDIyODAgKGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjAxKTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19kdW1teSAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDIpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YSAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDMpOworCWlmIChnYWRnZXRfaXNfcHhhIChnYWRnZXQpKSB7CiAJCS8qIHB4YSBkb2Vzbid0IHN1cHBvcnQgYWx0c2V0dGluZ3MgKi8KIAkJY2RjID0gMDsKIAl9IGVsc2UgaWYgKGdhZGdldF9pc19zaChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNCk7CiAJCS8qIHNoIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbnRlcmZhY2VzIG9yIGNvbmZpZ3MgKi8KIAkJY2RjID0gMDsKIAkJcm5kaXMgPSAwOwogCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3NhMTEwMCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDUpOwogCQkvKiBoYXJkd2FyZSBjYW4ndCB3cml0ZSB6bHBzICovCiAJCXpscCA9IDA7CiAJCS8qIHNhMTEwMCBDQU4gZG8gQ0RDLCB3aXRob3V0IHN0YXR1cyBlbmRwb2ludCAuLi4gd2UgdXNlCiAJCSAqIG5vbi1DREMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEFSTSBMaW51eC0yLjQgInVzYi1ldGgiLgogCQkgKi8KIAkJY2RjID0gMDsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19nb2t1IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbXExMXh4IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNyk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfb21hcCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDgpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2xoN2E0MHgoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDkpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX245NjA0KGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjEwKTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19weGEyN3goZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3MzYzI0MTAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTIpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2F0OTEoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTMpOwotCX0gZWxzZSB7CisJfQorCisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyIChnYWRnZXQpOworCWlmIChnY251bSA+PSAwKQorCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBjcHVfdG9fbGUxNiAoMHgwMjAwICsgZ2NudW0pOworCWVsc2UgewogCQkvKiBjYW4ndCBhc3N1bWUgQ0RDIHdvcmtzLiAgZG9uJ3Qgd2FudCB0byBkZWZhdWx0IHRvCiAJCSAqIGFueXRoaW5nIGxlc3MgZnVuY3Rpb25hbCBvbiBDREMtY2FwYWJsZSBoYXJkd2FyZSwKIAkJICogc28gd2UgZmFpbCBpbiB0aGlzIGNhc2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKaW5kZXggNGY1NzA4NS4uYTQxZDlkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwpAQCAtMzcxMyw2ICszNzEzLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNoZWNrX3BhcmFtZXRlcnMoc3RydWN0IGZzZ19kZXYgKmZzZykKIHsKIAlpbnQJcHJvdDsKKwlpbnQJZ2NudW07CiAKIAkvKiBTdG9yZSB0aGUgZGVmYXVsdCB2YWx1ZXMgKi8KIAltb2RfZGF0YS50cmFuc3BvcnRfdHlwZSA9IFVTQl9QUl9CVUxLOwpAQCAtMzcyNCwzMyArMzcyNSwxMyBAQAogCQltb2RfZGF0YS5jYW5fc3RhbGwgPSAwOwogCiAJaWYgKG1vZF9kYXRhLnJlbGVhc2UgPT0gMHhmZmZmKSB7CS8vIFBhcmFtZXRlciB3YXNuJ3Qgc2V0Ci0JCWlmIChnYWRnZXRfaXNfbmV0MjI4MChmc2ctPmdhZGdldCkpCi0JCQltb2RfZGF0YS5yZWxlYXNlID0gMHgwMzAxOwotCQllbHNlIGlmIChnYWRnZXRfaXNfZHVtbXkoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwMjsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YShmc2ctPmdhZGdldCkpCi0JCQltb2RfZGF0YS5yZWxlYXNlID0gMHgwMzAzOwotCQllbHNlIGlmIChnYWRnZXRfaXNfc2goZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwNDsKLQogCQkvKiBUaGUgc2ExMTAwIGNvbnRyb2xsZXIgaXMgbm90IHN1cHBvcnRlZCAqLwotCi0JCWVsc2UgaWYgKGdhZGdldF9pc19nb2t1KGZzZy0+Z2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMDY7Ci0JCWVsc2UgaWYgKGdhZGdldF9pc19tcTExeHgoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwNzsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX29tYXAoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwODsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX2xoN2E0MHgoZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwOTsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX245NjA0KGZzZy0+Z2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMTA7Ci0JCWVsc2UgaWYgKGdhZGdldF9pc19weGEyN3goZnNnLT5nYWRnZXQpKQotCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMxMTsKLQkJZWxzZSBpZiAoZ2FkZ2V0X2lzX3MzYzI0MTAoZ2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMTI7Ci0JCWVsc2UgaWYgKGdhZGdldF9pc19hdDkxKGZzZy0+Z2FkZ2V0KSkKLQkJCW1vZF9kYXRhLnJlbGVhc2UgPSAweDAzMTM7CisJCWlmIChnYWRnZXRfaXNfc2ExMTAwKGZzZy0+Z2FkZ2V0KSkKKwkJCWdjbnVtID0gLTE7CisJCWVsc2UKKwkJCWdjbnVtID0gdXNiX2dhZGdldF9jb250cm9sbGVyX251bWJlcihmc2ctPmdhZGdldCk7CisJCWlmIChnY251bSA+PSAwKQorCQkJbW9kX2RhdGEucmVsZWFzZSA9IDB4MDMwMCArIGdjbnVtOwogCQllbHNlIHsKIAkJCVdBUk4oZnNnLCAiY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkXG4iLAogCQkJCWZzZy0+Z2FkZ2V0LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaAppbmRleCBlYTJlYjUyLi44Y2JhZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCkBAIC01LDYgKzUsNyBAQAogICoKICAqIFRoaXMgY291bGQgZXZlbnR1YWxseSB3b3JrIGxpa2UgdGhlIEFSTSBtYWNoX2lzXyooKSBzdHVmZiwgZHJpdmVuIGJ5CiAgKiBzb21lIGNvbmZpZyBmaWxlIHRoYXQgZ2V0cyB1cGRhdGVkIGFzIG5ldyBoYXJkd2FyZSBpcyBzdXBwb3J0ZWQuCisgKiAoQW5kIGF2b2lkaW5nIHRoZSBydW50aW1lIGNvbXBhcmlzb25zIGluIHR5cGljYWwgb25lLWNob2ljZSBjYXNlcy4pCiAgKgogICogTk9URTogIHNvbWUgb2YgdGhlc2UgY29udHJvbGxlciBkcml2ZXJzIG1heSBub3QgYmUgYXZhaWxhYmxlIHlldC4KICAqLwpAQCAtODYsNyArODcsNjEgQEAKICNkZWZpbmUgZ2FkZ2V0X2lzX2F0OTEoZykJMAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9JTVgKKyNkZWZpbmUgZ2FkZ2V0X2lzX2lteChnKQkhc3RyY21wKCJpbXhfdWRjIiwgKGcpLT5uYW1lKQorI2Vsc2UKKyNkZWZpbmUgZ2FkZ2V0X2lzX2lteChnKQkwCisjZW5kaWYKKwogLy8gQ09ORklHX1VTQl9HQURHRVRfU1gyCiAvLyBDT05GSUdfVVNCX0dBREdFVF9BVTFYMDAKIC8vIC4uLgogCisKKy8qKgorICogdXNiX2dhZGdldF9jb250cm9sbGVyX251bWJlciAtIHN1cHBvcnQgYmNkRGV2aWNlIGlkIGNvbnZlbnRpb24KKyAqIEBnYWRnZXQ6IHRoZSBjb250cm9sbGVyIGJlaW5nIGRyaXZlbgorICoKKyAqIFJldHVybiBhIDItZGlnaXQgQkNEIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVyaXBoZXJhbCBjb250cm9sbGVyLAorICogc3VpdGFibGUgZm9yIHVzZSBhcyBwYXJ0IG9mIGEgYmNkRGV2aWNlIHZhbHVlLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogTk9URTogIHRoaXMgY29udmVudGlvbiBpcyBwdXJlbHkgb3B0aW9uYWwsIGFuZCBoYXMgbm8gbWVhbmluZyBpbiB0ZXJtcyBvZgorICogYW55IFVTQiBzcGVjaWZpY2F0aW9uLiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGNvbnZlbnRpb24gaW4geW91cgorICogZ2FkZ2V0IGRyaXZlciBmaXJtd2FyZSAtLSBtYXliZSBhIG1vcmUgZm9ybWFsIHJldmlzaW9uIElEIC0tIGZlZWwgZnJlZS4KKyAqCisgKiBIb3N0cyBzZWUgdGhlc2UgYmNkRGV2aWNlIG51bWJlcnMsIGFuZCBhcmUgYWxsb3dlZCAoYnV0IG5vdCBlbmNvdXJhZ2VkISkKKyAqIHRvIGNoYW5nZSB0aGVpciBiZWhhdmlvciBhY2NvcmRpbmdseS4gIEZvciBleGFtcGxlIGl0IG1pZ2h0IGhlbHAgYXZvaWRpbmcKKyAqIHNvbWUgY2hpcCBidWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9nYWRnZXRfY29udHJvbGxlcl9udW1iZXIoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlpZiAoZ2FkZ2V0X2lzX25ldDIyODAoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDE7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2R1bW15KGdhZGdldCkpCisJCXJldHVybiAweDAyOworCWVsc2UgaWYgKGdhZGdldF9pc19weGEoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDM7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX3NoKGdhZGdldCkpCisJCXJldHVybiAweDA0OworCWVsc2UgaWYgKGdhZGdldF9pc19zYTExMDAoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDU7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2dva3UoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MDY7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX21xMTF4eChnYWRnZXQpKQorCQlyZXR1cm4gMHgwNzsKKwllbHNlIGlmIChnYWRnZXRfaXNfb21hcChnYWRnZXQpKQorCQlyZXR1cm4gMHgwODsKKwllbHNlIGlmIChnYWRnZXRfaXNfbGg3YTQweChnYWRnZXQpKQorCQlyZXR1cm4gMHgwOTsKKwllbHNlIGlmIChnYWRnZXRfaXNfbjk2MDQoZ2FkZ2V0KSkKKwkJcmV0dXJuIDB4MTA7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YTI3eChnYWRnZXQpKQorCQlyZXR1cm4gMHgxMTsKKwllbHNlIGlmIChnYWRnZXRfaXNfczNjMjQxMChnYWRnZXQpKQorCQlyZXR1cm4gMHgxMjsKKwllbHNlIGlmIChnYWRnZXRfaXNfYXQ5MShnYWRnZXQpKQorCQlyZXR1cm4gMHgxMzsKKwllbHNlIGlmIChnYWRnZXRfaXNfaW14KGdhZGdldCkpCisJCXJldHVybiAweDE0OworCXJldHVybiAtRU5PRU5UOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IDllNGYxYzYuLmM5MjVkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTE0MjIsNDkgKzE0MjIsMjAgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB1c2JfZXAgKmVwOwogCXN0cnVjdCBnc19kZXYgKmRldjsKKwlpbnQgZ2NudW07CiAKLQkvKiBkZXZpY2Ugc3BlY2lmaWMgKi8KLQlpZiAoZ2FkZ2V0X2lzX25ldDIyODAoZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YShnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwMik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfc2goZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDMpOwotCQkvKiBzaCBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgaW50ZXJmYWNlcyBvciBjb25maWdzICovCisJLyogU29tZSBjb250cm9sbGVycyBjYW4ndCBzdXBwb3J0IENEQyBBQ006CisJICogLSBzaCBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgaW50ZXJmYWNlcyBvciBjb25maWdzOworCSAqIC0gc2ExMTAwIGRvZXNuJ3QgaGF2ZSBhIHRoaXJkIGludGVycnVwdCBlbmRwb2ludAorCSAqLworCWlmIChnYWRnZXRfaXNfc2goZ2FkZ2V0KSB8fCBnYWRnZXRfaXNfc2ExMTAwKGdhZGdldCkpCiAJCXVzZV9hY20gPSAwOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3NhMTEwMChnYWRnZXQpKSB7CisKKwlnY251bSA9IHVzYl9nYWRnZXRfY29udHJvbGxlcl9udW1iZXIoZ2FkZ2V0KTsKKwlpZiAoZ2NudW0gPj0gMCkKIAkJZ3NfZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0KLQkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoR1NfVkVSU0lPTl9OVU18MHgwMDA0KTsKLQkJLyogc2ExMTAwIGRvZXNuJ3Qgc3VwcG9ydCBuZWNlc3NhcnkgZW5kcG9pbnRzICovCi0JCXVzZV9hY20gPSAwOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2dva3UoZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDUpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX21xMTF4eChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwNik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfb21hcChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwNyk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbGg3YTQweChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAwOCk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbjk2MDQoZ2FkZ2V0KSkgewotCQlnc19kZXZpY2VfZGVzYy5iY2REZXZpY2UgPQotCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTXwweDAwMDkpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YTI3eChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAxMSk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfczNjMjQxMChnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAxMik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfYXQ5MShnYWRnZXQpKSB7Ci0JCWdzX2RldmljZV9kZXNjLmJjZERldmljZSA9Ci0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEdTX1ZFUlNJT05fTlVNfDB4MDAxMyk7Ci0JfSBlbHNlIHsKKwkJCQljcHVfdG9fbGUxNihHU19WRVJTSU9OX05VTSB8IGdjbnVtKTsKKwllbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ3NfYmluZDogY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkXG4iLAogCQkJZ2FkZ2V0LT5uYW1lKTsKIAkJLyogdW5yZWNvZ25pemVkLCBidXQgc2FmZSB1bmxlc3MgYnVsayBpcyBSRUFMTFkgcXVpcmt5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwppbmRleCBiYjliMmQ5Li42ODkwZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKQEAgLTExMzksNiArMTEzOSwxMyBAQAogewogCXN0cnVjdCB6ZXJvX2RldgkJKmRldjsKIAlzdHJ1Y3QgdXNiX2VwCQkqZXA7CisJaW50CQkJZ2NudW07CisKKwkvKiBGSVhNRSB0aGlzIGNhbid0IHlldCB3b3JrIHJpZ2h0IHdpdGggU0ggLi4uIGl0IGhhcyBvbmx5CisJICogb25lIGNvbmZpZ3VyYXRpb24sIG51bWJlcmVkIG9uZS4KKwkgKi8KKwlpZiAoZ2FkZ2V0X2lzX3NoKGdhZGdldCkpCisJCXJldHVybiAtRU5PREVWOwogCiAJLyogQnVsay1vbmx5IGRyaXZlcnMgbGlrZSB0aGlzIG9uZSBTSE9VTEQgYmUgYWJsZSB0bwogCSAqIGF1dG9jb25maWd1cmUgb24gYW55IHNhbmUgdXNiIGNvbnRyb2xsZXIgZHJpdmVyLApAQCAtMTE2MSw0MyArMTE2OCwxMCBAQAogCUVQX09VVF9OQU1FID0gZXAtPm5hbWU7CiAJZXAtPmRyaXZlcl9kYXRhID0gZXA7CS8qIGNsYWltICovCiAKLQotCS8qCi0JICogRFJJVkVSIFBPTElDWSBDSE9JQ0U6ICB5b3UgbWF5IHdhbnQgdG8gZG8gdGhpcyBkaWZmZXJlbnRseS4KLQkgKiBPbmUgdGhpbmcgdG8gYXZvaWQgaXMgcmV1c2luZyBhIGJjZERldmljZSByZXZpc2lvbiBjb2RlCi0JICogd2l0aCBkaWZmZXJlbnQgaG9zdC12aXNpYmxlIGNvbmZpZ3VyYXRpb25zIG9yIGJlaGF2aW9yCi0JICogcmVzdHJpY3Rpb25zIC0tIHVzaW5nIGVwMWluL2VwMm91dCB2cyBlcDFvdXQvZXAzaW4sIGV0YwotCSAqLwotCWlmIChnYWRnZXRfaXNfbmV0MjI4MCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3B4YSAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDMpOwotI2lmIDAKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19zaChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNCk7Ci0JCS8qIFNIIGhhcyBvbmx5IG9uZSBjb25maWd1cmF0aW9uOyBzZWUgImxvb3BkZWZhdWx0IiAqLwotCQlkZXZpY2VfZGVzYy5iTnVtQ29uZmlndXJhdGlvbnMgPSAxOwotCQkvKiBGSVhNRSBtYWtlIDEgPT0gZGVmYXVsdC5iQ29uZmlndXJhdGlvblZhbHVlICovCi0jZW5kaWYKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19zYTExMDAgKGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjA1KTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19nb2t1IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNik7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfbXExMXh4IChnYWRnZXQpKSB7Ci0JCWRldmljZV9kZXNjLmJjZERldmljZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDB4MDIwNyk7Ci0JfSBlbHNlIGlmIChnYWRnZXRfaXNfb21hcCAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDgpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2xoN2E0MHgoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMDkpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX245NjA0KGdhZGdldCkpIHsKLQkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMjEwKTsKLQl9IGVsc2UgaWYgKGdhZGdldF9pc19weGEyN3goZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTEpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3MzYzI0MTAoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTIpOwotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2F0OTEoZ2FkZ2V0KSkgewotCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2ICgweDAyMTMpOwotCX0gZWxzZSB7CisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyIChnYWRnZXQpOworCWlmIChnY251bSA+PSAwKQorCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBjcHVfdG9fbGUxNiAoMHgwMjAwICsgZ2NudW0pOworCWVsc2UgewogCQkvKiBnYWRnZXQgemVybyBpcyBzbyBzaW1wbGUgKGZvciBub3csIG5vIGFsdHNldHRpbmdzKSB0aGF0CiAJCSAqIGl0IFNIT1VMRCBOT1QgaGF2ZSBwcm9ibGVtcyB3aXRoIGJ1bGstY2FwYWJsZSBoYXJkd2FyZS4KIAkJICogc28gd2FybiBhYm91dCB1bnJjb2duaXplZCBjb250cm9sbGVycywgZG9uJ3QgcGFuaWMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggMTQ5YjEzZi4uMjUwN2U4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtNTQ5LDcgKzU0OSw5IEBACiAJCWhjZC0+Y2FuX3dha2V1cCA9IChwb3J0X3dha2UgJiAxKSAhPSAwOwogCiAJCS8qIGhlbHAgaGMgZG1hIHdvcmsgd2VsbCB3aXRoIGNhY2hlbGluZXMgKi8KLQkJcGNpX3NldF9td2kgKHBkZXYpOworCQlyZXR2YWwgPSBwY2lfc2V0X213aShwZGV2KTsKKwkJaWYgKHJldHZhbCkKKwkJCWVoY2lfZGJnKGVoY2ksICJ1bmFibGUgdG8gZW5hYmxlIE1XSSAtIG5vdCBmYXRhbC5cbiIpOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwppbmRleCAyMGRmMDFhLi45NDBkMzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKQEAgLTY3Nyw2ICs2NzcsOSBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1c2JfdHQJKnR0ID0gdXJiLT5kZXYtPnR0OworCQkJaW50CQl0aGlua190aW1lOworCiAJCQkvKiBnYXAgaXMgZihGUy9MUyB0cmFuc2ZlciB0aW1lcykgKi8KIAkJCXFoLT5nYXBfdWYgPSAxICsgdXNiX2NhbGNfYnVzX3RpbWUgKHVyYi0+ZGV2LT5zcGVlZCwKIAkJCQkJaXNfaW5wdXQsIDAsIG1heHApIC8gKDEyNSAqIDEwMDApOwpAQCAtNjkwLDYgKzY5MywxMCBAQAogCQkJCXFoLT5jX3VzZWNzID0gSFNfVVNFQ1MgKDApOwogCQkJfQogCisJCQl0aGlua190aW1lID0gdHQgPyB0dC0+dGhpbmtfdGltZSA6IDA7CisJCQlxaC0+dHRfdXNlY3MgPSBOU19UT19VUyAodGhpbmtfdGltZSArCisJCQkJCXVzYl9jYWxjX2J1c190aW1lICh1cmItPmRldi0+c3BlZWQsCisJCQkJCWlzX2lucHV0LCAwLCBtYXhfcGFja2V0IChtYXhwKSkpOwogCQkJcWgtPnBlcmlvZCA9IHVyYi0+aW50ZXJ2YWw7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCmluZGV4IGI1NmYyNTguLmNjYzczMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCkBAIC02MzgsNyArNjM4LDcgQEAKIHsKIAlzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtICpzdHJlYW07CiAKLQlzdHJlYW0gPSBrY2FsbG9jKDEsIHNpemVvZiAqc3RyZWFtLCBtZW1fZmxhZ3MpOworCXN0cmVhbSA9IGt6YWxsb2Moc2l6ZW9mICpzdHJlYW0sIG1lbV9mbGFncyk7CiAJaWYgKGxpa2VseSAoc3RyZWFtICE9IE5VTEwpKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZzdHJlYW0tPnRkX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmc3RyZWFtLT5mcmVlX2xpc3QpOwpAQCAtNzAwLDYgKzcwMCw3IEBACiAKIAl9IGVsc2UgewogCQl1MzIJCWFkZHI7CisJCWludAkJdGhpbmtfdGltZTsKIAogCQlhZGRyID0gZGV2LT50dHBvcnQgPDwgMjQ7CiAJCWlmICghZWhjaV9pc19UREkoZWhjaSkKQEAgLTcwOSw2ICs3MTAsOSBAQAogCQlhZGRyIHw9IGVwbnVtIDw8IDg7CiAJCWFkZHIgfD0gZGV2LT5kZXZudW07CiAJCXN0cmVhbS0+dXNlY3MgPSBIU19VU0VDU19JU08gKG1heHApOworCQl0aGlua190aW1lID0gZGV2LT50dCA/IGRldi0+dHQtPnRoaW5rX3RpbWUgOiAwOworCQlzdHJlYW0tPnR0X3VzZWNzID0gTlNfVE9fVVMgKHRoaW5rX3RpbWUgKyB1c2JfY2FsY19idXNfdGltZSAoCisJCQkJZGV2LT5zcGVlZCwgaXNfaW5wdXQsIDEsIG1heHApKTsKIAkJaWYgKGlzX2lucHV0KSB7CiAJCQl1MzIJdG1wOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCmluZGV4IGE3NTQyMTUuLjIwYzliNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCkBAIC00MjEsNiArNDIxLDcgQEAKIAl1OAkJCXVzZWNzOwkJLyogaW50ciBiYW5kd2lkdGggKi8KIAl1OAkJCWdhcF91ZjsJCS8qIHVmcmFtZXMgc3BsaXQvY3NwbGl0IGdhcCAqLwogCXU4CQkJY191c2VjczsJLyogLi4uIHNwbGl0IGNvbXBsZXRpb24gYncgKi8KKwl1MTYJCQl0dF91c2VjczsJLyogdHQgZG93bnN0cmVhbSBiYW5kd2lkdGggKi8KIAl1bnNpZ25lZCBzaG9ydAkJcGVyaW9kOwkJLyogcG9sbGluZyBpbnRlcnZhbCAqLwogCXVuc2lnbmVkIHNob3J0CQlzdGFydDsJCS8qIHdoZXJlIHBvbGxpbmcgc3RhcnRzICovCiAjZGVmaW5lIE5PX0ZSQU1FICgodW5zaWduZWQgc2hvcnQpfjApCQkJLyogcGljayBuZXcgc3RhcnQgKi8KQEAgLTQ3OSw2ICs0ODAsNyBAQAogCSAqLwogCXU4CQkJaW50ZXJ2YWw7CiAJdTgJCQl1c2VjcywgY191c2VjczsKKwl1MTYJCQl0dF91c2VjczsKIAl1MTYJCQltYXhwOwogCXUxNgkJCXJhd19tYXNrOwogCXVuc2lnbmVkCQliYW5kd2lkdGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCmluZGV4IDgxZjhmNmIuLmE4MjY3Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCkBAIC0xNzgsOCArMTc4LDggQEAKIAkweGZmICAgLyogIF9fdTggIFBvcnRQd3JDdHJsTWFzazsgKioqIDcgcG9ydHMgbWF4ICoqKiAqLwogfTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGJ1bGtfc3RhcnRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBidWxrX2VvdF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihidWxrX3N0YXJ0X3RpbWVyLCBOVUxMLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIoYnVsa19lb3RfdGltZXIsIE5VTEwsIDAsIDApOwogCiAvKiBXZSB3YW50IHRoZSBzdGFydCB0aW1lciB0byBleHBpcmUgYmVmb3JlIHRoZSBlb3QgdGltZXIsIGJlY2F1c2UgdGhlIGZvcm1lciBtaWdodCBzdGFydAogICAgdHJhZmZpYywgdGh1cyBtYWtpbmcgaXQgdW5uZWNlc3NhcnkgZm9yIHRoZSBsYXR0ZXIgdG8gdGltZSBvdXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKaW5kZXggNzZjYjQ5Ni4uNDFiYmFlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYwpAQCAtODMsNyArODMsNyBAQAogI2luY2x1ZGUgIi4uL2NvcmUvaGNkLmgiCiAjaW5jbHVkZSAiaXNwMTE2eC5oIgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwOCBBcHIgMjAwNSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjA1IEF1ZyAyMDA1IgogI2RlZmluZSBEUklWRVJfREVTQwkiSVNQMTE2eCBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlciIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKQEAgLTYyOSwxNCArNjI5LDEyIEBACiAJCQlFUlIoIlVucmVjb3ZlcmFibGUgZXJyb3JcbiIpOwogCQkJLyogV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gUmVzZXQ/ICAqLwogCQl9Ci0JCWlmIChpbnRzdGF0ICYgSENJTlRfUkhTQykgewotCQkJaXNwMTE2eC0+cmhzdGF0dXMgPQotCQkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKLQkJCWlzcDExNngtPnJocG9ydFswXSA9Ci0JCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSk7Ci0JCQlpc3AxMTZ4LT5yaHBvcnRbMV0gPQotCQkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDIpOwotCQl9CisJCWlmIChpbnRzdGF0ICYgSENJTlRfUkhTQykKKwkJCS8qIFdoZW4gcm9vdCBodWIgb3IgYW55IG9mIGl0cyBwb3J0cyBpcyBnb2luZworCQkJICAgdG8gY29tZSBvdXQgb2Ygc3VzcGVuZCwgaXQgbWF5IHRha2UgbW9yZQorCQkJICAgdGhhbiAxMG1zIGZvciBzdGF0dXMgYml0cyB0byBzdGFiaWxpemUuICovCisJCQltb2RfdGltZXIoJmhjZC0+cmhfdGltZXIsIGppZmZpZXMKKwkJCQkgICsgbXNlY3NfdG9famlmZmllcygyMCkgKyAxKTsKIAkJaWYgKGludHN0YXQgJiBIQ0lOVF9SRCkgewogCQkJREJHKCItLS0tIHJlbW90ZSB3YWtldXBcbiIpOwogCQkJc2NoZWR1bGVfd29yaygmaXNwMTE2eC0+cmhfcmVzdW1lKTsKQEAgLTcxNyw3ICs3MTUsNyBAQAogCX0KIAkvKiBhdm9pZCBhbGwgYWxsb2NhdGlvbnMgd2l0aGluIHNwaW5sb2NrczogcmVxdWVzdCBvciBlbmRwb2ludCAqLwogCWlmICghaGVwLT5oY3ByaXYpIHsKLQkJZXAgPSBrY2FsbG9jKDEsIHNpemVvZiAqZXAsIG1lbV9mbGFncyk7CisJCWVwID0ga3phbGxvYyhzaXplb2YgKmVwLCBtZW1fZmxhZ3MpOwogCQlpZiAoIWVwKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtOTI1LDIwICs5MjMsMjcgQEAKIHsKIAlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CiAJaW50IHBvcnRzLCBpLCBjaGFuZ2VkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAotCXBvcnRzID0gaXNwMTE2eC0+cmhkZXNjYSAmIFJIX0FfTkRQOworCS8qIFJlcG9ydCBubyBzdGF0dXMgY2hhbmdlIG5vdywgaWYgd2UgYXJlIHNjaGVkdWxlZCB0byBiZQorCSAgIGNhbGxlZCBsYXRlciAqLworCWlmICh0aW1lcl9wZW5kaW5nKCZoY2QtPnJoX3RpbWVyKSkKKwkJcmV0dXJuIDA7CiAKLQkvKiBpbml0IHN0YXR1cyAqLworCXBvcnRzID0gaXNwMTE2eC0+cmhkZXNjYSAmIFJIX0FfTkRQOworCXNwaW5fbG9ja19pcnFzYXZlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJaXNwMTE2eC0+cmhzdGF0dXMgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUyk7CiAJaWYgKGlzcDExNngtPnJoc3RhdHVzICYgKFJIX0hTX0xQU0MgfCBSSF9IU19PQ0lDKSkKIAkJYnVmWzBdID0gY2hhbmdlZCA9IDE7CiAJZWxzZQogCQlidWZbMF0gPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspIHsKLQkJdTMyIHN0YXR1cyA9IGlzcDExNngtPnJocG9ydFtpXTsKKwkJdTMyIHN0YXR1cyA9IGlzcDExNngtPnJocG9ydFtpXSA9CisJCSAgICBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgaSA/IEhDUkhQT1JUMiA6IEhDUkhQT1JUMSk7CiAKIAkJaWYgKHN0YXR1cyAmIChSSF9QU19DU0MgfCBSSF9QU19QRVNDIHwgUkhfUFNfUFNTQwogCQkJICAgICAgfCBSSF9QU19PQ0lDIHwgUkhfUFNfUFJTQykpIHsKQEAgLTk0Nyw2ICs5NTIsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBjaGFuZ2VkOwogfQogCkBAIC0xNDYzLDEwICsxNDY5LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICBSZXNldC4gVHJpZXMgdG8gcGVyZm9ybSBwbGF0Zm9ybS1zcGVjaWZpYyBoYXJkd2FyZQotICByZXNldCBmaXJzdDsgZmFsbHMgYmFjayB0byBzb2Z0d2FyZSByZXNldC4KLSovCiBzdGF0aWMgaW50IGlzcDExNnhfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CkBAIC0xNDc0LDE3ICsxNDc2LDcgQEAKIAl1MTYgY2xrcmR5ID0gMDsKIAlpbnQgcmV0ID0gMCwgdGltZW91dCA9IDE1IC8qIG1zICovIDsKIAotCWlmIChpc3AxMTZ4LT5ib2FyZCAmJiBpc3AxMTZ4LT5ib2FyZC0+cmVzZXQpIHsKLQkJLyogSGFyZHdhcmUgcmVzZXQgKi8KLQkJaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KGhjZC0+c2VsZi5jb250cm9sbGVyLCAxKTsKLQkJbXNsZWVwKDEwKTsKLQkJaWYgKGlzcDExNngtPmJvYXJkLT5jbG9jaykKLQkJCWlzcDExNngtPmJvYXJkLT5jbG9jayhoY2QtPnNlbGYuY29udHJvbGxlciwgMSk7Ci0JCW1zbGVlcCgxKTsKLQkJaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KGhjZC0+c2VsZi5jb250cm9sbGVyLCAwKTsKLQl9IGVsc2UKLQkJcmV0ID0gaXNwMTE2eF9zd19yZXNldChpc3AxMTZ4KTsKLQorCXJldCA9IGlzcDExNnhfc3dfcmVzZXQoaXNwMTE2eCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTUwMSwxMCArMTQ5Myw3IEBACiAJCUVSUigiQ2xvY2sgbm90IHJlYWR5IGFmdGVyIDIwbXNcbiIpOwogCQkvKiBBZnRlciBzd19yZXNldCB0aGUgY2xvY2sgd29uJ3QgcmVwb3J0IHRvIGJlIHJlYWR5LCBpZgogCQkgICBIX1dBS0VVUCBwaW4gaXMgaGlnaC4gKi8KLQkJaWYgKCFpc3AxMTZ4LT5ib2FyZCB8fCAhaXNwMTE2eC0+Ym9hcmQtPnJlc2V0KQotCQkJRVJSKCJUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaGFyZHdhcmUgd2FrZXVwLlxuIik7Ci0JCQlFUlIoIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgSF9XQUtFVVAgcGluICIKLQkJCQkiaXMgcHVsbGVkIGxvdyFcbiIpOworCQlFUlIoIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgSF9XQUtFVVAgcGluIGlzIHB1bGxlZCBsb3chXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTE1MjcsMTUgKzE1MTYsNyBAQAogCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgUkhfSFNfTFBTKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CiAKLQkvKiBQdXQgdGhlIGNoaXAgaW50byByZXNldCBzdGF0ZSAqLwotCWlmIChpc3AxMTZ4LT5ib2FyZCAmJiBpc3AxMTZ4LT5ib2FyZC0+cmVzZXQpCi0JCWlzcDExNngtPmJvYXJkLT5yZXNldChoY2QtPnNlbGYuY29udHJvbGxlciwgMCk7Ci0JZWxzZQotCQlpc3AxMTZ4X3N3X3Jlc2V0KGlzcDExNngpOwotCi0JLyogU3RvcCB0aGUgY2xvY2sgKi8KLQlpZiAoaXNwMTE2eC0+Ym9hcmQgJiYgaXNwMTE2eC0+Ym9hcmQtPmNsb2NrKQotCQlpc3AxMTZ4LT5ib2FyZC0+Y2xvY2soaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDApOworCWlzcDExNnhfc3dfcmVzZXQoaXNwMTE2eCk7CiB9CiAKIC8qCkBAIC0xNTYxLDYgKzE1NDIsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKiBUbyBiZSByZW1vdmVkIGluIGZ1dHVyZSAqLworCWhjZC0+dXNlc19uZXdfcG9sbGluZyA9IDE7CisKIAlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDSVRMQlVGTEVOLCBJU1AxMTZ4X0lUTF9CVUZTSVpFKTsKIAlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDQVRMQlVGTEVOLCBJU1AxMTZ4X0FUTF9CVUZTSVpFKTsKIApAQCAtMTU2OSw3ICsxNTUzLDcgQEAKIAlpZiAoYm9hcmQtPnNlbDE1S3JlcykKIAkJdmFsIHw9IEhDSFdDRkdfMTVLUlNFTDsKIAkvKiBSZW1vdGUgd2FrZXVwIHdvbid0IHdvcmsgd2l0aG91dCB3b3JraW5nIGNsb2NrICovCi0JaWYgKGJvYXJkLT5jbGtub3RzdG9wIHx8IGJvYXJkLT5yZW1vdGVfd2FrZXVwX2VuYWJsZSkKKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQogCQl2YWwgfD0gSENIV0NGR19DTEtOT1RTVE9QOwogCWlmIChib2FyZC0+b2NfZW5hYmxlKQogCQl2YWwgfD0gSENIV0NGR19BTkFMT0dfT0M7CkBAIC0xNTgwLDE2ICsxNTY0LDEzIEBACiAJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0hXQ0ZHLCB2YWwpOwogCiAJLyogLS0tLS0gUm9vdCBodWIgY29uZiAqLwotCXZhbCA9IDA7Ci0JLyogQU4xMDAwM18xLnBkZiByZWNvbW1lbmRzIE5QUyB0byBiZSBhbHdheXMgMSAqLwotCWlmIChib2FyZC0+bm9fcG93ZXJfc3dpdGNoaW5nKQotCQl2YWwgfD0gUkhfQV9OUFM7Ci0JaWYgKGJvYXJkLT5wb3dlcl9zd2l0Y2hpbmdfbW9kZSkKLQkJdmFsIHw9IFJIX0FfUFNNOwotCWlmIChib2FyZC0+cG90cGcpCi0JCXZhbCB8PSAoYm9hcmQtPnBvdHBnIDw8IDI0KSAmIFJIX0FfUE9UUEdUOwotCWVsc2UKLQkJdmFsIHw9ICgyNSA8PCAyNCkgJiBSSF9BX1BPVFBHVDsKKwl2YWwgPSAoMjUgPDwgMjQpICYgUkhfQV9QT1RQR1Q7CisJLyogQU4xMDAwM18xLnBkZiByZWNvbW1lbmRzIFJIX0FfTlBTIChubyBwb3dlciBzd2l0Y2hpbmcpIHRvCisJICAgYmUgYWx3YXlzIHNldC4gWWV0LCBpbnN0ZWFkLCB3ZSByZXF1ZXN0IGluZGl2aWR1YWwgcG9ydAorCSAgIHBvd2VyIHN3aXRjaGluZy4gKi8KKwl2YWwgfD0gUkhfQV9QU007CisJLyogUmVwb3J0IG92ZXJjdXJyZW50IHBlciBwb3J0ICovCisJdmFsIHw9IFJIX0FfT0NQTTsKIAlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSwgdmFsKTsKIAlpc3AxMTZ4LT5yaGRlc2NhID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSk7CiAKQEAgLTE2MTksOSArMTYwMCw2IEBACiAKIAkvKiBHbyBvcGVyYXRpb25hbCAqLwogCXZhbCA9IEhDQ09OVFJPTF9VU0JfT1BFUjsKLQkvKiBSZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAtIE5PVCBTVVBQT1JURUQgKi8KLQkvKiAgaWYgKGJvYXJkLT5yZW1vdGVfd2FrZXVwX2Nvbm5lY3RlZCkKLQkgICB2YWwgfD0gSENDT05UUk9MX1JXQzsgICovCiAJaWYgKGJvYXJkLT5yZW1vdGVfd2FrZXVwX2VuYWJsZSkKIAkJdmFsIHw9IEhDQ09OVFJPTF9SV0U7CiAJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wsIHZhbCk7CkBAIC0xNjcwLDcgKzE2NDgsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlpZighaGNkKQorCWlmICghaGNkKQogCQlyZXR1cm4gMDsKIAlpc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKIAlwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCmluZGV4IDE3OTY0YzMuLjI1MTUzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYwpAQCAtMTQsOCArMTQsNiBAQAogICogVGhpcyBmaWxlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS91c2IuaD4KLQogLyogY29uZmlndXJlIHNvIGFuIEhDIGRldmljZSBhbmQgaWQgYXJlIGFsd2F5cyBwcm92aWRlZCAqLwogLyogYWx3YXlzIGNhbGxlZCB3aXRoIHByb2Nlc3MgY29udGV4dDsgc2xlZXBpbmcgaXMgT0sgKi8KIApAQCAtMjMsOSArMjEsNyBAQAogICogdXNiX2hjZF9wcGNfc29jX3Byb2JlIC0gaW5pdGlhbGl6ZSBPbi1DaGlwIEhDRHMKICAqIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQoKQogICoKLSAqIEFsbG9jYXRlcyBiYXNpYyByZXNvdXJjZXMgZm9yIHRoaXMgVVNCIGhvc3QgY29udHJvbGxlciwgYW5kCi0gKiB0aGVuIGludm9rZXMgdGhlIHN0YXJ0KCkgbWV0aG9kIGZvciB0aGUgSENEIGFzc29jaWF0ZWQgd2l0aCBpdAotICogdGhyb3VnaCB0aGUgaG90cGx1ZyBlbnRyeSdzIGRyaXZlcl9kYXRhLgorICogQWxsb2NhdGVzIGJhc2ljIHJlc291cmNlcyBmb3IgdGhpcyBVU0IgaG9zdCBjb250cm9sbGVyLgogICoKICAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIHByb2JlKCkuCiAgKi8KQEAgLTM3LDcgKzMzLDYgQEAKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2k7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGlycTsKLQlzdHJ1Y3QgdXNiX2hjZF9wbGF0Zm9ybV9kYXRhICpwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJcHJfZGVidWcoImluaXRpYWxpemluZyBQUEMtU09DIFVTQiBDb250cm9sbGVyXG4iKTsKIApAQCAtNzMsOSArNjgsNiBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JaWYgKHBkLT5zdGFydCAmJiAocmV0dmFsID0gcGQtPnN0YXJ0KHBkZXYpKSkKLQkJZ290byBlcnIzOwotCiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9CSUdfRU5ESUFOOwogCW9oY2lfaGNkX2luaXQob2hjaSk7CkBAIC04NSw5ICs3Nyw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAlwcl9kZWJ1ZygiUmVtb3ZpbmcgUFBDLVNPQyBVU0IgQ29udHJvbGxlclxuIik7Ci0JaWYgKHBkICYmIHBkLT5zdG9wKQotCQlwZC0+c3RvcChwZGV2KTsKLSBlcnIzOgorCiAJaW91bm1hcChoY2QtPnJlZ3MpOwogIGVycjI6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CkBAIC0xMDUsMjUgKzk1LDIxIEBACiAgKiBAcGRldjogVVNCIEhvc3QgQ29udHJvbGxlciBiZWluZyByZW1vdmVkCiAgKiBDb250ZXh0OiAhaW5faW50ZXJydXB0KCkKICAqCi0gKiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIHVzYl9oY2RfcHBjX3NvY19wcm9iZSgpLCBmaXJzdCBpbnZva2luZwotICogdGhlIEhDRCdzIHN0b3AoKSBtZXRob2QuICBJdCBpcyBhbHdheXMgY2FsbGVkIGZyb20gYSB0aHJlYWQKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgdXNiX2hjZF9wcGNfc29jX3Byb2JlKCkuCisgKiBJdCBpcyBhbHdheXMgY2FsbGVkIGZyb20gYSB0aHJlYWQKICAqIGNvbnRleHQsIG5vcm1hbGx5ICJybW1vZCIsICJhcG1kIiwgb3Igc29tZXRoaW5nIHNpbWlsYXIuCiAgKgogICovCiBzdGF0aWMgdm9pZCB1c2JfaGNkX3BwY19zb2NfcmVtb3ZlKHN0cnVjdCB1c2JfaGNkICpoY2QsCiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHVzYl9oY2RfcGxhdGZvcm1fZGF0YSAqcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQogCXVzYl9yZW1vdmVfaGNkKGhjZCk7CiAKIAlwcl9kZWJ1Zygic3RvcHBpbmcgUFBDLVNPQyBVU0IgQ29udHJvbGxlclxuIik7Ci0JaWYgKHBkICYmIHBkLT5zdG9wKQotCQlwZC0+c3RvcChwZGV2KTsKIAogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKLQl1c2JfaGNkX3B1dChoY2QpOworCXVzYl9wdXRfaGNkKGhjZCk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYwppbmRleCBlOTQwMTY2Li4zZDliY2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zM2MyNDEwLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJaWYgKGluZm8tPnBvd2VyX2NvbnRyb2wgIT0gTlVMTCkgewogCQlpbmZvLT5wb3J0W3BvcnQtMV0ucG93ZXIgPSB0bzsKLQkJKGluZm8tPnBvd2VyX2NvbnRyb2wpKHBvcnQsIHRvKTsKKwkJKGluZm8tPnBvd2VyX2NvbnRyb2wpKHBvcnQtMSwgdG8pOwogCX0KIH0KIApAQCAtMzM5LDggKzMzOSw4IEBACiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IE5VTEw7CiAJaW50IHJldHZhbDsKIAotCXMzYzI0MTBfdXNiX3NldF9wb3dlcihkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCAwLCAxKTsKIAlzM2MyNDEwX3VzYl9zZXRfcG93ZXIoZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgMSwgMSk7CisJczNjMjQxMF91c2Jfc2V0X3Bvd2VyKGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIDIsIDEpOwogCiAJaGNkID0gdXNiX2NyZWF0ZV9oY2QoZHJpdmVyLCAmZGV2LT5kZXYsICJzM2MyNHh4Iik7CiAJaWYgKGhjZCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKaW5kZXggODBlYWY2NS4uZDJhMWZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCkBAIC04MzUsNyArODM1LDcgQEAKIAogCS8qIGF2b2lkIGFsbCBhbGxvY2F0aW9ucyB3aXRoaW4gc3BpbmxvY2tzICovCiAJaWYgKCFoZXAtPmhjcHJpdikKLQkJZXAgPSBrY2FsbG9jKDEsIHNpemVvZiAqZXAsIG1lbV9mbGFncyk7CisJCWVwID0ga3phbGxvYyhzaXplb2YgKmVwLCBtZW1fZmxhZ3MpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNsODExLT5sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCmluZGV4IDI5OGU0YTIuLjQ4MmM0YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwpAQCAtMjMwLDYgKzIzMCwyMCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdG91Y2hraXR1c2IuCiAKK2NvbmZpZyBVU0JfWUVBTElOSworCXRyaXN0YXRlICJZZWFsaW5rIHVzYi1wMWsgdm9pcCBwaG9uZSIKKwlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVCAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBrZXlib2FyZCBhbmQgTENEIGZ1bmN0aW9ucyBvZiB0aGUKKwkgIFllYWxpbmsgdXNiLXAxayB1c2IgcGhvbmVzLiBUaGUgYXVkaW8gcGFydCBpcyBlbmFibGVkIGJ5IHRoZSBnZW5lcmljCisJICB1c2Igc291bmQgZHJpdmVyLCBzbyB5b3UgbWlnaHQgd2FudCB0byBlbmFibGUgdGhhdCBhcyB3ZWxsLgorCisJICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGVzZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucywgc2VlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L3llYWxpbmsudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgeWVhbGluay4KKwogY29uZmlnIFVTQl9YUEFECiAJdHJpc3RhdGUgIlgtQm94IGdhbWVwYWQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQppbmRleCBmMTU0N2JlLi40M2IyZjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQpAQCAtMzksNCArMzksNSBAQAogb2JqLSQoQ09ORklHX1VTQl9QT1dFUk1BVEUpCSs9IHBvd2VybWF0ZS5vCiBvYmotJChDT05GSUdfVVNCX1dBQ09NKQkJKz0gd2Fjb20ubwogb2JqLSQoQ09ORklHX1VTQl9BQ0VDQUQpCSs9IGFjZWNhZC5vCitvYmotJChDT05GSUdfVVNCX1lFQUxJTkspCSs9IHllYWxpbmsubwogb2JqLSQoQ09ORklHX1VTQl9YUEFEKQkJKz0geHBhZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9hY2VjYWQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCmluZGV4IDEzNTMyZjMuLjc0Zjg3NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CiAJbWF4cCA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CiAKLQlhY2VjYWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdXNiX2FjZWNhZCksIEdGUF9LRVJORUwpOworCWFjZWNhZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfYWNlY2FkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhY2VjYWQpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwppbmRleCBiMmNiMmIzLi5lMTA4ZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKQEAgLTIsNyArMiw4IEBACiAgKiAgVVNCIEhJRCBzdXBwb3J0IGZvciBMaW51eAogICoKICAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCiAgKi8KIAogLyoKQEAgLTM4LDcgKzM5LDcgQEAKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4wMSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjYiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkFuZHJlYXMgR2FsLCBWb2p0ZWNoIFBhdmxpayIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBISUQgY29yZSBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCkBAIC0xMDU4LDggKzEwNTksOCBAQAogCQlpZiAobWF4cGFja2V0ID4gMCkgewogCQkJcGFkbGVuID0gKGxlbiArIG1heHBhY2tldCAtIDEpIC8gbWF4cGFja2V0OwogCQkJcGFkbGVuICo9IG1heHBhY2tldDsKLQkJCWlmIChwYWRsZW4gPiBISURfQlVGRkVSX1NJWkUpCi0JCQkJcGFkbGVuID0gSElEX0JVRkZFUl9TSVpFOworCQkJaWYgKHBhZGxlbiA+IGhpZC0+YnVmc2l6ZSkKKwkJCQlwYWRsZW4gPSBoaWQtPmJ1ZnNpemU7CiAJCX0gZWxzZQogCQkJcGFkbGVuID0gMDsKIAkJaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gcGFkbGVuOwpAQCAtMTA5Niw2ICsxMDk3LDcgQEAKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KKwkJCWJyZWFrOwogCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwogCQljYXNlIC1FSUxTRVE6CQkvKiB1bnBsdWcgdGltZW91dCBvbiB1aGNpICovCiAJCQl1bnBsdWcgPSAxOwpAQCAtMTE0Myw2ICsxMTQ1LDcgQEAKIAkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KIAkJCWlmIChoaWQtPmN0cmxbaGlkLT5jdHJsdGFpbF0uZGlyID09IFVTQl9ESVJfSU4pCiAJCQkJaGlkX2lucHV0X3JlcG9ydChoaWQtPmN0cmxbaGlkLT5jdHJsdGFpbF0ucmVwb3J0LT50eXBlLCB1cmIsIDAsIHJlZ3MpOworCQkJYnJlYWs7CiAJCWNhc2UgLUVTSFVURE9XTjoJLyogdW5wbHVnICovCiAJCWNhc2UgLUVJTFNFUToJCS8qIHVucGx1ZyB0aW1lY3RybCBvbiB1aGNpICovCiAJCQl1bnBsdWcgPSAxOwpAQCAtMTI4NCwxMyArMTI4Nyw4IEBACiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAlpbnQgZXJyLCByZXQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpIHsKLQkJaW50IHNpemUgPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMSArIGhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0ubnVtYmVyZWQ7Ci0JCWlmIChzaXplID4gSElEX0JVRkZFUl9TSVpFKSBzaXplID0gSElEX0JVRkZFUl9TSVpFOwotCQlpZiAoc2l6ZSA+IGhpZC0+dXJiaW4tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpCi0JCQloaWQtPnVyYmluLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCiAJCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKLQl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX0ZFQVRVUkVfUkVQT1JUXS5yZXBvcnRfbGlzdCwgbGlzdCkKIAkJaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwpAQCAtMTM3MiwxMiArMTM3MCwxNCBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0E0VEVDSAkJMHgwOWRhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQTRURUNIX1dDUDMyUFUJMHgwMDA2CiAKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQVNISU1BCQkweDA2RDYKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQVNISU1BCQkweDA2ZDYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQVNISU1BX0dBTUVQQUQJMHgwMDI1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9QUkVEQVRPUgkweDAwMjYKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NZUFJFU1MJCTB4MDRiNAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UJMHgwMDAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00JMHg1NTAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFCTB4NzQxNwogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQkVSS1NISVJFCQkweDBjOTgKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRAkweDExNDAKQEAgLTE0MzIsNyArMTQzMiw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9DWUNMT1BTCTB4MDAwNAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTEQJCTB4MGYxMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NBU1NZICAgICAgICAJMHgxMDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FTU1kJCTB4MTAwMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZCTB4MTAxMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX01PQklMRUNBU1NZCTB4MTAyMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0pXTQkJMHgxMDgwCkBAIC0xNDQ0LDYgKzE0NDQsOSBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX05FVFdPUktBTkFMWVNFUgkweDIwMjAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9QT1dFUkNPTlRST0wJMHgyMDMwCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BUFBMRQkJMHgwNWFjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfUE9XRVJNT1VTRQkweDAzMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9CTFVFVE9PVEgJMHgxMDAwCiAKIC8qCiAgKiBBbHBoYWJldGljYWxseSBzb3J0ZWQgYmxhY2tsaXN0IGJ5IHF1aXJrIHR5cGUuCkBAIC0xNDYyLDEyICsxNDY1LDE0IEBACiAJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0JMVUVUT09USCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUsIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTLCBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1c0MCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MsIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPVzI0LCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NPREVNRVJDUywgVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XNDgsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTLCBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1cyOCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfSElEQ09NLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0RFTE9STUUsIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FQVJUSE1BVEUsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VNX0xUMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFksIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUsIEhJRF9RVUlSS19JR05PUkUgfSwKQEAgLTE1NDgsMTAgKzE1NTMsMTIgQEAKIAl7IFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1VTQkhVQl9LQiwgSElEX1FVSVJLX05PR0VUfSwKIAl7IFVTQl9WRU5ET1JfSURfVEFOR1RPUCwgVVNCX0RFVklDRV9JRF9UQU5HVE9QX1VTQlBTMiwgSElEX1FVSVJLX05PR0VUIH0sCiAKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfUE9XRVJNT1VTRSwgSElEX1FVSVJLXzJXSEVFTF9QT1dFUk1PVVNFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVSwgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFLCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSB9LAogCiAJeyBVU0JfVkVORE9SX0lEX0FBU0hJTUEsIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCisJeyBVU0JfVkVORE9SX0lEX0FBU0hJTUEsIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9QUkVEQVRPUiwgSElEX1FVSVJLX0JBRFBBRCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BTFBTLCBVU0JfREVWSUNFX0lEX0lCTV9HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NISUMsIFVTQl9ERVZJQ0VfSURfQ0hJQ19HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0hBUFAsIFVTQl9ERVZJQ0VfSURfVUdDSV9EUklWSU5HLCBISURfUVVJUktfQkFEUEFEIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCkBAIC0xNTY0LDE1ICsxNTcxLDMyIEBACiAJeyAwLCAwIH0KIH07CiAKKy8qCisgKiBUcmF2ZXJzZSB0aGUgc3VwcGxpZWQgbGlzdCBvZiByZXBvcnRzIGFuZCBmaW5kIHRoZSBsb25nZXN0CisgKi8KK3N0YXRpYyB2b2lkIGhpZF9maW5kX21heF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IHR5cGUsIGludCAqbWF4KQoreworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJaW50IHNpemU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bdHlwZV0ucmVwb3J0X2xpc3QsIGxpc3QpIHsKKwkJc2l6ZSA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxOworCQlpZiAodHlwZSA9PSBISURfSU5QVVRfUkVQT1JUICYmIGhpZC0+cmVwb3J0X2VudW1bdHlwZV0ubnVtYmVyZWQpCisJCQlzaXplKys7CisJCWlmICgqbWF4IDwgc2l6ZSkKKwkJCSptYXggPSBzaXplOworCX0KK30KKwogc3RhdGljIGludCBoaWRfYWxsb2NfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewotCWlmICghKGhpZC0+aW5idWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgSElEX0JVRkZFUl9TSVpFLCBTTEFCX0FUT01JQywgJmhpZC0+aW5idWZfZG1hKSkpCisJaWYgKCEoaGlkLT5pbmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBoaWQtPmJ1ZnNpemUsIFNMQUJfQVRPTUlDLCAmaGlkLT5pbmJ1Zl9kbWEpKSkKIAkJcmV0dXJuIC0xOwotCWlmICghKGhpZC0+b3V0YnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIEhJRF9CVUZGRVJfU0laRSwgU0xBQl9BVE9NSUMsICZoaWQtPm91dGJ1Zl9kbWEpKSkKKwlpZiAoIShoaWQtPm91dGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBoaWQtPmJ1ZnNpemUsIFNMQUJfQVRPTUlDLCAmaGlkLT5vdXRidWZfZG1hKSkpCiAJCXJldHVybiAtMTsKIAlpZiAoIShoaWQtPmNyID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHNpemVvZigqKGhpZC0+Y3IpKSwgU0xBQl9BVE9NSUMsICZoaWQtPmNyX2RtYSkpKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCEoaGlkLT5jdHJsYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIEhJRF9CVUZGRVJfU0laRSwgU0xBQl9BVE9NSUMsICZoaWQtPmN0cmxidWZfZG1hKSkpCisJaWYgKCEoaGlkLT5jdHJsYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIGhpZC0+YnVmc2l6ZSwgU0xBQl9BVE9NSUMsICZoaWQtPmN0cmxidWZfZG1hKSkpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpAQCAtMTU4MSwxMyArMTYwNSwxMyBAQAogc3RhdGljIHZvaWQgaGlkX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCWlmIChoaWQtPmluYnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBISURfQlVGRkVSX1NJWkUsIGhpZC0+aW5idWYsIGhpZC0+aW5idWZfZG1hKTsKKwkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgaGlkLT5idWZzaXplLCBoaWQtPmluYnVmLCBoaWQtPmluYnVmX2RtYSk7CiAJaWYgKGhpZC0+b3V0YnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBISURfQlVGRkVSX1NJWkUsIGhpZC0+b3V0YnVmLCBoaWQtPm91dGJ1Zl9kbWEpOworCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBoaWQtPmJ1ZnNpemUsIGhpZC0+b3V0YnVmLCBoaWQtPm91dGJ1Zl9kbWEpOwogCWlmIChoaWQtPmNyKQogCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBzaXplb2YoKihoaWQtPmNyKSksIGhpZC0+Y3IsIGhpZC0+Y3JfZG1hKTsKIAlpZiAoaGlkLT5jdHJsYnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBISURfQlVGRkVSX1NJWkUsIGhpZC0+Y3RybGJ1ZiwgaGlkLT5jdHJsYnVmX2RtYSk7CisJCXVzYl9idWZmZXJfZnJlZShkZXYsIGhpZC0+YnVmc2l6ZSwgaGlkLT5jdHJsYnVmLCBoaWQtPmN0cmxidWZfZG1hKTsKIH0KIAogc3RhdGljIHN0cnVjdCBoaWRfZGV2aWNlICp1c2JfaGlkX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKQEAgLTE1OTgsNyArMTYyMiw3IEBACiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZDsKIAl1bnNpZ25lZCBxdWlya3MgPSAwLCByc2l6ZSA9IDA7CiAJY2hhciAqYnVmLCAqcmRlc2M7Ci0JaW50IG47CisJaW50IG4sIGluc2l6ZSA9IDA7CiAKIAlmb3IgKG4gPSAwOyBoaWRfYmxhY2tsaXN0W25dLmlkVmVuZG9yOyBuKyspCiAJCWlmICgoaGlkX2JsYWNrbGlzdFtuXS5pZFZlbmRvciA9PSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpKSAmJgpAQCAtMTY1Miw2ICsxNjc2LDE5IEBACiAJa2ZyZWUocmRlc2MpOwogCWhpZC0+cXVpcmtzID0gcXVpcmtzOwogCisJaGlkLT5idWZzaXplID0gSElEX01JTl9CVUZGRVJfU0laRTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0lOUFVUX1JFUE9SVCwgJmhpZC0+YnVmc2l6ZSk7CisJaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9PVVRQVVRfUkVQT1JULCAmaGlkLT5idWZzaXplKTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCAmaGlkLT5idWZzaXplKTsKKworCWlmIChoaWQtPmJ1ZnNpemUgPiBISURfTUFYX0JVRkZFUl9TSVpFKQorCQloaWQtPmJ1ZnNpemUgPSBISURfTUFYX0JVRkZFUl9TSVpFOworCisJaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9JTlBVVF9SRVBPUlQsICZpbnNpemUpOworCisJaWYgKGluc2l6ZSA+IEhJRF9NQVhfQlVGRkVSX1NJWkUpCisJCWluc2l6ZSA9IEhJRF9NQVhfQlVGRkVSX1NJWkU7CisKIAlpZiAoaGlkX2FsbG9jX2J1ZmZlcnMoZGV2LCBoaWQpKSB7CiAJCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOwogCQlnb3RvIGZhaWw7CkBAIC0xNjgyLDEwICsxNzE5LDEwIEBACiAJCQlpZiAoIShoaWQtPnVyYmluID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpCiAJCQkJZ290byBmYWlsOwogCQkJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwotCQkJdXNiX2ZpbGxfaW50X3VyYihoaWQtPnVyYmluLCBkZXYsIHBpcGUsIGhpZC0+aW5idWYsIDAsCisJCQl1c2JfZmlsbF9pbnRfdXJiKGhpZC0+dXJiaW4sIGRldiwgcGlwZSwgaGlkLT5pbmJ1ZiwgaW5zaXplLAogCQkJCQkgaGlkX2lycV9pbiwgaGlkLCBpbnRlcnZhbCk7CiAJCQloaWQtPnVyYmluLT50cmFuc2Zlcl9kbWEgPSBoaWQtPmluYnVmX2RtYTsKLQkJCWhpZC0+dXJiaW4tPnRyYW5zZmVyX2ZsYWdzIHw9KFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQIHwgVVJCX0FTWU5DX1VOTElOSyk7CisJCQloaWQtPnVyYmluLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAkJfSBlbHNlIHsKIAkJCWlmIChoaWQtPnVyYm91dCkKIAkJCQljb250aW51ZTsKQEAgLTE2OTUsNyArMTczMiw3IEBACiAJCQl1c2JfZmlsbF9pbnRfdXJiKGhpZC0+dXJib3V0LCBkZXYsIHBpcGUsIGhpZC0+b3V0YnVmLCAwLAogCQkJCQkgaGlkX2lycV9vdXQsIGhpZCwgaW50ZXJ2YWwpOwogCQkJaGlkLT51cmJvdXQtPnRyYW5zZmVyX2RtYSA9IGhpZC0+b3V0YnVmX2RtYTsKLQkJCWhpZC0+dXJib3V0LT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfQVNZTkNfVU5MSU5LKTsKKwkJCWhpZC0+dXJib3V0LT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAkJfQogCX0KIApAQCAtMTc0Nyw3ICsxNzg0LDcgQEAKIAkJCSAgICAgaGlkLT5jdHJsYnVmLCAxLCBoaWRfY3RybCwgaGlkKTsKIAloaWQtPnVyYmN0cmwtPnNldHVwX2RtYSA9IGhpZC0+Y3JfZG1hOwogCWhpZC0+dXJiY3RybC0+dHJhbnNmZXJfZG1hID0gaGlkLT5jdHJsYnVmX2RtYTsKLQloaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2ZsYWdzIHw9IChVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCB8IFVSQl9OT19TRVRVUF9ETUFfTUFQIHwgVVJCX0FTWU5DX1VOTElOSyk7CisJaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7CiAKIAlyZXR1cm4gaGlkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZGVidWcuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCmluZGV4IDUyNDM3ZTUuLmNlZWJhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCkBAIC04NSw2ICs4NSwyMyBAQAogICAgICAgezAsIDB4OTEsICJELVBhZERvd24ifSwKICAgICAgIHswLCAweDkyLCAiRC1QYWRSaWdodCJ9LAogICAgICAgezAsIDB4OTMsICJELVBhZExlZnQifSwKKyAgeyAgMiwgMCwgIlNpbXVsYXRpb24iIH0sCisgICAgICB7MCwgMHhiMCwgIkFpbGVyb24ifSwKKyAgICAgIHswLCAweGIxLCAiQWlsZXJvblRyaW0ifSwKKyAgICAgIHswLCAweGIyLCAiQW50aS1Ub3JxdWUifSwKKyAgICAgIHswLCAweGIzLCAiQXV0b3BpbG90In0sCisgICAgICB7MCwgMHhiNCwgIkNoYWZmIn0sCisgICAgICB7MCwgMHhiNSwgIkNvbGxlY3RpdmUifSwKKyAgICAgIHswLCAweGI2LCAiRGl2ZUJyYWtlIn0sCisgICAgICB7MCwgMHhiNywgIkVsZWN0cm9uaWNDb3VudGVybWVhc3VyZXMifSwKKyAgICAgIHswLCAweGI4LCAiRWxldmF0b3IifSwKKyAgICAgIHswLCAweGI5LCAiRWxldmF0b3JUcmltIn0sCisgICAgICB7MCwgMHhiYSwgIlJ1ZGRlciJ9LAorICAgICAgezAsIDB4YmIsICJUaHJvdHRsZSJ9LAorICAgICAgezAsIDB4YmMsICJGbGlnaHRDb21tdW5pY2F0aW9ucyJ9LAorICAgICAgezAsIDB4YmQsICJGbGFyZVJlbGVhc2UifSwKKyAgICAgIHswLCAweGJlLCAiTGFuZGluZ0dlYXIifSwKKyAgICAgIHswLCAweGJmLCAiVG9lQnJha2UifSwKICAgeyAgNywgMCwgIktleWJvYXJkIiB9LAogICB7ICA4LCAwLCAiTEVEIiB9LAogICAgICAgezAsIDB4MDEsICJOdW1Mb2NrIn0sCkBAIC05Miw2ICsxMDksNyBAQAogICAgICAgezAsIDB4MDMsICJTY3JvbGxMb2NrIn0sCiAgICAgICB7MCwgMHgwNCwgIkNvbXBvc2UifSwKICAgICAgIHswLCAweDA1LCAiS2FuYSJ9LAorICAgICAgezAsIDB4NGIsICJHZW5lcmljSW5kaWNhdG9yIn0sCiAgIHsgIDksIDAsICJCdXR0b24iIH0sCiAgIHsgMTAsIDAsICJPcmRpbmFsIiB9LAogICB7IDEyLCAwLCAiQ29uc3VtZXIiIH0sCkBAIC01NzQsNyArNTkyLDggQEAKIAlbS0VZX0VYSVRdID0gIkV4aXQiLAkJCVtLRVlfTU9WRV0gPSAiTW92ZSIsCiAJW0tFWV9FRElUXSA9ICJFZGl0IiwJCQlbS0VZX1NDUk9MTFVQXSA9ICJTY3JvbGxVcCIsCiAJW0tFWV9TQ1JPTExET1dOXSA9ICJTY3JvbGxEb3duIiwJW0tFWV9LUExFRlRQQVJFTl0gPSAiS1BMZWZ0UGFyZW50aGVzaXMiLAotCVtLRVlfS1BSSUdIVFBBUkVOXSA9ICJLUFJpZ2h0UGFyZW50aGVzaXMiLCBbS0VZX0YxM10gPSAiRjEzIiwKKwlbS0VZX0tQUklHSFRQQVJFTl0gPSAiS1BSaWdodFBhcmVudGhlc2lzIiwgW0tFWV9ORVddID0gIk5ldyIsCisJW0tFWV9SRURPXSA9ICJSZWRvIiwJCQlbS0VZX0YxM10gPSAiRjEzIiwKIAlbS0VZX0YxNF0gPSAiRjE0IiwJCQlbS0VZX0YxNV0gPSAiRjE1IiwKIAlbS0VZX0YxNl0gPSAiRjE2IiwJCQlbS0VZX0YxN10gPSAiRjE3IiwKIAlbS0VZX0YxOF0gPSAiRjE4IiwJCQlbS0VZX0YxOV0gPSAiRjE5IiwKQEAgLTU4NCwxNSArNjAzLDE1IEBACiAJW0tFWV9QQVVTRUNEXSA9ICJQYXVzZUNEIiwJCVtLRVlfUFJPRzNdID0gIlByb2czIiwKIAlbS0VZX1BST0c0XSA9ICJQcm9nNCIsCQkJW0tFWV9TVVNQRU5EXSA9ICJTdXNwZW5kIiwKIAlbS0VZX0NMT1NFXSA9ICJDbG9zZSIsCQkJW0tFWV9QTEFZXSA9ICJQbGF5IiwKLQlbS0VZX0ZBU1RGT1JXQVJEXSA9ICJGYXN0IEZvcndhcmQiLAlbS0VZX0JBU1NCT09TVF0gPSAiQmFzcyBCb29zdCIsCisJW0tFWV9GQVNURk9SV0FSRF0gPSAiRmFzdEZvcndhcmQiLAlbS0VZX0JBU1NCT09TVF0gPSAiQmFzc0Jvb3N0IiwKIAlbS0VZX1BSSU5UXSA9ICJQcmludCIsCQkJW0tFWV9IUF0gPSAiSFAiLAogCVtLRVlfQ0FNRVJBXSA9ICJDYW1lcmEiLAkJW0tFWV9TT1VORF0gPSAiU291bmQiLAogCVtLRVlfUVVFU1RJT05dID0gIlF1ZXN0aW9uIiwJCVtLRVlfRU1BSUxdID0gIkVtYWlsIiwKIAlbS0VZX0NIQVRdID0gIkNoYXQiLAkJCVtLRVlfU0VBUkNIXSA9ICJTZWFyY2giLAogCVtLRVlfQ09OTkVDVF0gPSAiQ29ubmVjdCIsCQlbS0VZX0ZJTkFOQ0VdID0gIkZpbmFuY2UiLAogCVtLRVlfU1BPUlRdID0gIlNwb3J0IiwJCQlbS0VZX1NIT1BdID0gIlNob3AiLAotCVtLRVlfQUxURVJBU0VdID0gIkFsdGVybmF0ZSBFcmFzZSIsCVtLRVlfQ0FOQ0VMXSA9ICJDYW5jZWwiLAotCVtLRVlfQlJJR0hUTkVTU0RPV05dID0gIkJyaWdodG5lc3MgZG93biIsIFtLRVlfQlJJR0hUTkVTU1VQXSA9ICJCcmlnaHRuZXNzIHVwIiwKKwlbS0VZX0FMVEVSQVNFXSA9ICJBbHRlcm5hdGVFcmFzZSIsCVtLRVlfQ0FOQ0VMXSA9ICJDYW5jZWwiLAorCVtLRVlfQlJJR0hUTkVTU0RPV05dID0gIkJyaWdodG5lc3NEb3duIiwgW0tFWV9CUklHSFRORVNTVVBdID0gIkJyaWdodG5lc3NVcCIsCiAJW0tFWV9NRURJQV0gPSAiTWVkaWEiLAkJCVtLRVlfVU5LTk9XTl0gPSAiVW5rbm93biIsCiAJW0JUTl8wXSA9ICJCdG4wIiwJCQlbQlROXzFdID0gIkJ0bjEiLAogCVtCVE5fMl0gPSAiQnRuMiIsCQkJW0JUTl8zXSA9ICJCdG4zIiwKQEAgLTYyMiw4ICs2NDEsOCBAQAogCVtCVE5fVE9PTF9BSVJCUlVTSF0gPSAiVG9vbEFpcmJydXNoIiwJW0JUTl9UT09MX0ZJTkdFUl0gPSAiVG9vbEZpbmdlciIsCiAJW0JUTl9UT09MX01PVVNFXSA9ICJUb29sTW91c2UiLAkJW0JUTl9UT09MX0xFTlNdID0gIlRvb2xMZW5zIiwKIAlbQlROX1RPVUNIXSA9ICJUb3VjaCIsCQkJW0JUTl9TVFlMVVNdID0gIlN0eWx1cyIsCi0JW0JUTl9TVFlMVVMyXSA9ICJTdHlsdXMyIiwJCVtCVE5fVE9PTF9ET1VCTEVUQVBdID0gIlRvb2wgRG91YmxldGFwIiwKLQlbQlROX1RPT0xfVFJJUExFVEFQXSA9ICJUb29sIFRyaXBsZXRhcCIsIFtCVE5fR0VBUl9ET1dOXSA9ICJXaGVlbEJ0biIsCisJW0JUTl9TVFlMVVMyXSA9ICJTdHlsdXMyIiwJCVtCVE5fVE9PTF9ET1VCTEVUQVBdID0gIlRvb2xEb3VibGVUYXAiLAorCVtCVE5fVE9PTF9UUklQTEVUQVBdID0gIlRvb2xUcmlwbGVUYXAiLCBbQlROX0dFQVJfRE9XTl0gPSAiV2hlZWxCdG4iLAogCVtCVE5fR0VBUl9VUF0gPSAiR2VhciB1cCIsCQlbS0VZX09LXSA9ICJPayIsCiAJW0tFWV9TRUxFQ1RdID0gIlNlbGVjdCIsCQlbS0VZX0dPVE9dID0gIkdvdG8iLAogCVtLRVlfQ0xFQVJdID0gIkNsZWFyIiwJCQlbS0VZX1BPV0VSMl0gPSAiUG93ZXIyIiwKQEAgLTY1OSw2ICs2NzgsOSBAQAogCVtLRVlfVFdFTl0gPSAiVFdFTiIsCQkJW0tFWV9ERUxfRU9MXSA9ICJEZWxldGVFT0wiLAogCVtLRVlfREVMX0VPU10gPSAiRGVsZXRlRU9TIiwJCVtLRVlfSU5TX0xJTkVdID0gIkluc2VydExpbmUiLAogCVtLRVlfREVMX0xJTkVdID0gIkRlbGV0ZUxpbmUiLAorCVtLRVlfU0VORF0gPSAiU2VuZCIsCQkJW0tFWV9SRVBMWV0gPSAiUmVwbHkiLAorCVtLRVlfRk9SV0FSRE1BSUxdID0gIkZvcndhcmRNYWlsIiwJW0tFWV9TQVZFXSA9ICJTYXZlIiwKKwlbS0VZX0RPQ1VNRU5UU10gPSAiRG9jdW1lbnRzIiwKIH07CiAKIHN0YXRpYyBjaGFyICpyZWxhdGl2ZXNbUkVMX01BWCArIDFdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYwppbmRleCA2M2E0ZGI3Li4wYjY0NTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYwpAQCAtNzgsOCArNzgsOCBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gJmhpZGlucHV0LT5pbnB1dDsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlID0gaGlkaW5wdXQtPmlucHV0LnByaXZhdGU7Ci0JaW50IG1heCwgY29kZTsKLQl1bnNpZ25lZCBsb25nICpiaXQ7CisJaW50IG1heCA9IDAsIGNvZGU7CisJdW5zaWduZWQgbG9uZyAqYml0ID0gTlVMTDsKIAogCWZpZWxkLT5oaWRpbnB1dCA9IGhpZGlucHV0OwogCkBAIC0xMzEsNiArMTMxLDE1IEBACiAJCQltYXBfa2V5KGNvZGUpOwogCQkJYnJlYWs7CiAKKworCQljYXNlIEhJRF9VUF9TSU1VTEFUSU9OOgorCisJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsKKwkJCQljYXNlIDB4YmE6IG1hcF9hYnMoQUJTX1JVRERFUik7IGJyZWFrOworCQkJCWNhc2UgMHhiYjogbWFwX2FicyhBQlNfVEhST1RUTEUpOyBicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCiAJCWNhc2UgSElEX1VQX0dFTkRFU0s6CiAKIAkJCWlmICgodXNhZ2UtPmhpZCAmIDB4ZjApID09IDB4ODApIHsJLyogU3lzdGVtQ29udHJvbCAqLwpAQCAtMjM4LDggKzI0NywxMiBAQAogCQkJCWNhc2UgMHgwMDA6IGdvdG8gaWdub3JlOwogCQkJCWNhc2UgMHgwMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NMRUVQKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgwMzY6IG1hcF9rZXlfY2xlYXIoQlROX01JU0MpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0NTogbWFwX2tleV9jbGVhcihLRVlfUkFESU8pOwkJYnJlYWs7CiAJCQkJY2FzZSAweDA4YTogbWFwX2tleV9jbGVhcihLRVlfV1dXKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwOGQ6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0dSQU0pOwkJYnJlYWs7CiAJCQkJY2FzZSAweDA5NTogbWFwX2tleV9jbGVhcihLRVlfSEVMUCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDljOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMVVApOwlicmVhazsKKwkJCQljYXNlIDB4MDlkOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMRE9XTik7CWJyZWFrOwogCQkJCWNhc2UgMHgwYjA6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVkpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDBiMTogbWFwX2tleV9jbGVhcihLRVlfUEFVU0UpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDBiMjogbWFwX2tleV9jbGVhcihLRVlfUkVDT1JEKTsJCWJyZWFrOwpAQCAtMjU5LDYgKzI3MiwxMSBAQAogCQkJCWNhc2UgMHgxOGE6IG1hcF9rZXlfY2xlYXIoS0VZX01BSUwpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDE5MjogbWFwX2tleV9jbGVhcihLRVlfQ0FMQyk7CQlicmVhazsKIAkJCQljYXNlIDB4MTk0OiBtYXBfa2V5X2NsZWFyKEtFWV9GSUxFKTsJCWJyZWFrOworCQkJCWNhc2UgMHgxYTc6IG1hcF9rZXlfY2xlYXIoS0VZX0RPQ1VNRU5UUyk7CWJyZWFrOworCQkJCWNhc2UgMHgyMDE6IG1hcF9rZXlfY2xlYXIoS0VZX05FVyk7CQlicmVhazsKKwkJCQljYXNlIDB4MjA3OiBtYXBfa2V5X2NsZWFyKEtFWV9TQVZFKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMDg6IG1hcF9rZXlfY2xlYXIoS0VZX1BSSU5UKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMDk6IG1hcF9rZXlfY2xlYXIoS0VZX1BST1BTKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyMWE6IG1hcF9rZXlfY2xlYXIoS0VZX1VORE8pOwkJYnJlYWs7CiAJCQkJY2FzZSAweDIxYjogbWFwX2tleV9jbGVhcihLRVlfQ09QWSk7CQlicmVhazsKIAkJCQljYXNlIDB4MjFjOiBtYXBfa2V5X2NsZWFyKEtFWV9DVVQpOwkJYnJlYWs7CkBAIC0yNzEsNyArMjg5LDExIEBACiAJCQkJY2FzZSAweDIyNzogbWFwX2tleV9jbGVhcihLRVlfUkVGUkVTSCk7CQlicmVhazsKIAkJCQljYXNlIDB4MjJhOiBtYXBfa2V5X2NsZWFyKEtFWV9CT09LTUFSS1MpOwlicmVhazsKIAkJCQljYXNlIDB4MjM4OiBtYXBfcmVsKFJFTF9IV0hFRUwpOwkJYnJlYWs7Ci0JCQkJZGVmYXVsdDogICAgZ290byB1bmtub3duOworCQkJCWNhc2UgMHgyNzk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRE8pOwkJYnJlYWs7CisJCQkJY2FzZSAweDI4OTogbWFwX2tleV9jbGVhcihLRVlfUkVQTFkpOwkJYnJlYWs7CisJCQkJY2FzZSAweDI4YjogbWFwX2tleV9jbGVhcihLRVlfRk9SV0FSRE1BSUwpOwlicmVhazsKKwkJCQljYXNlIDB4MjhjOiBtYXBfa2V5X2NsZWFyKEtFWV9TRU5EKTsJCWJyZWFrOworCQkJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTI5Niw5ICszMTgsNDIgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgSElEX1VQX01TVkVORE9SOgotCiAJCQlnb3RvIGlnbm9yZTsKIAorCQljYXNlIEhJRF9VUF9DVVNUT006IC8qIFJlcG9ydGVkIG9uIExvZ2l0ZWNoIGFuZCBQb3dlcmJvb2sgVVNCIGtleWJvYXJkcyAqLworCisJCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKwkJCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCQkJY2FzZSAweDAwMzogbWFwX2tleV9jbGVhcihLRVlfRk4pOwkJYnJlYWs7CisJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhJRF9VUF9MT0dJVkVORE9SOiAvKiBSZXBvcnRlZCBvbiBMb2dpdGVjaCBVbHRyYSBYIE1lZGlhIFJlbW90ZSAqLworCisJCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKwkJCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCQkJY2FzZSAweDAwNDogbWFwX2tleV9jbGVhcihLRVlfQUdBSU4pOwkJYnJlYWs7CisJCQkJY2FzZSAweDAwZDogbWFwX2tleV9jbGVhcihLRVlfSE9NRSk7CQlicmVhazsKKwkJCQljYXNlIDB4MDI0OiBtYXBfa2V5X2NsZWFyKEtFWV9TSFVGRkxFKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwMjU6IG1hcF9rZXlfY2xlYXIoS0VZX1RWKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwMjY6IG1hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDAzMTogbWFwX2tleV9jbGVhcihLRVlfQVVESU8pOwkJYnJlYWs7CisJCQkJY2FzZSAweDAzMjogbWFwX2tleV9jbGVhcihLRVlfU1VCVElUTEUpOwlicmVhazsKKwkJCQljYXNlIDB4MDMzOiBtYXBfa2V5X2NsZWFyKEtFWV9MQVNUKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwNDc6IG1hcF9rZXlfY2xlYXIoS0VZX01QMyk7CQlicmVhazsKKwkJCQljYXNlIDB4MDQ4OiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0OTogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0YTogbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0YjogbWFwX2tleV9jbGVhcihLRVlfQU5HTEUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0YzogbWFwX2tleV9jbGVhcihLRVlfTEFOR1VBR0UpOwlicmVhazsKKwkJCQljYXNlIDB4MDRkOiBtYXBfa2V5X2NsZWFyKEtFWV9TVUJUSVRMRSk7CWJyZWFrOworCQkJCWNhc2UgMHgwNTE6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDUyOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKKwkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKKwkJCX0KKwkJCWJyZWFrOworCiAJCWNhc2UgSElEX1VQX1BJRDoKIAogCQkJc2V0X2JpdChFVl9GRiwgaW5wdXQtPmV2Yml0KTsKQEAgLTM0OSw2ICs0MDQsOSBAQAogCWlmICh1c2FnZS0+Y29kZSA+IG1heCkKIAkJZ290byBpZ25vcmU7CiAKKwlpZiAoKChkZXZpY2UtPnF1aXJrcyAmIChISURfUVVJUktfMldIRUVMX1BPV0VSTU9VU0UpKSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDEwMDMyKSkpCisJCW1hcF9yZWwoUkVMX0hXSEVFTCk7CisKIAlpZiAoKGRldmljZS0+cXVpcmtzICYgKEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183IHwgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUpKSAmJgogCQkgKHVzYWdlLT50eXBlID09IEVWX1JFTCkgJiYgKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpCiAJCQlzZXRfYml0KFJFTF9IV0hFRUwsIGJpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCmluZGV4IGMxYjZiNjkuLmVjMjQxMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCkBAIC0xNzMsNiArMTczLDcgQEAKIAogI2RlZmluZSBISURfVVBfVU5ERUZJTkVECTB4MDAwMDAwMDAKICNkZWZpbmUgSElEX1VQX0dFTkRFU0sJCTB4MDAwMTAwMDAKKyNkZWZpbmUgSElEX1VQX1NJTVVMQVRJT04JMHgwMDAyMDAwMAogI2RlZmluZSBISURfVVBfS0VZQk9BUkQJCTB4MDAwNzAwMDAKICNkZWZpbmUgSElEX1VQX0xFRAkJMHgwMDA4MDAwMAogI2RlZmluZSBISURfVVBfQlVUVE9OCQkweDAwMDkwMDAwCkBAIC0xODIsNiArMTgzLDggQEAKICNkZWZpbmUgSElEX1VQX1BJRAkJMHgwMDBmMDAwMAogI2RlZmluZSBISURfVVBfSFBWRU5ET1IgICAgICAgICAweGZmN2YwMDAwCiAjZGVmaW5lIEhJRF9VUF9NU1ZFTkRPUgkJMHhmZjAwMDAwMAorI2RlZmluZSBISURfVVBfQ1VTVE9NCQkweDAwZmYwMDAwCisjZGVmaW5lIEhJRF9VUF9MT0dJVkVORE9SCTB4ZmZiYzAwMDAKIAogI2RlZmluZSBISURfVVNBR0UJCTB4MDAwMGZmZmYKIApAQCAtMjQyLDYgKzI0NSw3IEBACiAjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183CQkweDA4MAogI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNQkJMHgxMDAKICNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OCQkweDIwMAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX1BPV0VSTU9VU0UJCTB4NDAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpAQCAtMzQ4LDcgKzM1Miw4IEBACiAKICNkZWZpbmUgSElEX1JFUE9SVF9UWVBFUyAzCiAKLSNkZWZpbmUgSElEX0JVRkZFUl9TSVpFCQk2NAkJLyogdXNlIDY0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWxsIHBvc3NpYmxlIHBhY2tldGxlbiAqLworI2RlZmluZSBISURfTUlOX0JVRkZFUl9TSVpFCTY0CQkvKiBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3QgYSBwYWNrZXQgc2l6ZSBvZiBzcGFjZSAqLworI2RlZmluZSBISURfTUFYX0JVRkZFUl9TSVpFCTQwOTYJCS8qIDRrYiAqLwogI2RlZmluZSBISURfQ09OVFJPTF9GSUZPX1NJWkUJMjU2CQkvKiB0byBpbml0IGRldmljZXMgd2l0aCA+MTAwIHJlcG9ydHMgKi8KICNkZWZpbmUgSElEX09VVFBVVF9GSUZPX1NJWkUJNjQKIApAQCAtMzg2LDYgKzM5MSw4IEBACiAKIAl1bnNpZ25lZCBsb25nIGlvZmw7CQkJCQkJLyogSS9PIGZsYWdzIChDVFJMX1JVTk5JTkcsIE9VVF9SVU5OSU5HKSAqLwogCisJdW5zaWduZWQgaW50IGJ1ZnNpemU7CQkJCQkJLyogVVJCIGJ1ZmZlciBzaXplICovCisKIAlzdHJ1Y3QgdXJiICp1cmJpbjsJCQkJCQkvKiBJbnB1dCBVUkIgKi8KIAljaGFyICppbmJ1ZjsJCQkJCQkJLyogSW5wdXQgYnVmZmVyICovCiAJZG1hX2FkZHJfdCBpbmJ1Zl9kbWE7CQkJCQkJLyogSW5wdXQgYnVmZmVyIGRtYSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwppbmRleCA0YzEzMzMxLi5kMzI0Mjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwpAQCAtNTA3LDYgKzUwNyw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQloaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOworCQloaWRfd2FpdF9pbyhoaWQpOwogCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9pdG10b3VjaC5jIGIvZHJpdmVycy91c2IvaW5wdXQvaXRtdG91Y2guYwppbmRleCAwZGM0MzlmLi5iZWNiODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9pdG10b3VjaC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKIAotCWlmICghKGl0bXRvdWNoID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGl0bXRvdWNoX2RldiksIEdGUF9LRVJORUwpKSkgeworCWlmICghKGl0bXRvdWNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl0bXRvdWNoX2RldiksIEdGUF9LRVJORUwpKSkgewogCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeS4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jIGIvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYwppbmRleCA2N2RjOTM2Li45OWRlMWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMKQEAgLTQzMSwxMSArNDMxLDYgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKIAotCS8qIFNlZSBpZiB0aGUgb2ZmZXJlZCBkZXZpY2UgbWF0Y2hlcyB3aGF0IHdlIGNhbiBhY2NlcHQgKi8KLQlpZiAoKHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgIT0gVVNCX0tFWVNQQU5fVkVORE9SX0lEKSB8fAotCSAgICAodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gVVNCX0tFWVNQQU5fUFJPRFVDVF9VSUExMSkgKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCXJlbW90ZSA9IGttYWxsb2Moc2l6ZW9mKCpyZW1vdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVtb3RlID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L21hcF90b183c2VnbWVudC5oIGIvZHJpdmVycy91c2IvaW5wdXQvbWFwX3RvXzdzZWdtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmZjI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L21hcF90b183c2VnbWVudC5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogZHJpdmVycy91c2IvaW5wdXQvbWFwX3RvXzdzZWdtZW50LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGVuayBWZXJnb25ldCA8SGVuay5WZXJnb25ldEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIE1BUF9UT183U0VHTUVOVF9ICisjZGVmaW5lIE1BUF9UT183U0VHTUVOVF9ICisKKy8qIFRoaXMgZmlsZSBwcm92aWRlcyB0cmFuc2xhdGlvbiBwcmltaXRpdmVzIGFuZCB0YWJsZXMgZm9yIHRoZSBjb252ZXJzaW9uCisgKiBvZiAoQVNDSUkpIGNoYXJhY3RlcnMgdG8gYSA3LXNlZ21lbnRzIG5vdGF0aW9uLgorICoKKyAqIFRoZSA3IHNlZ21lbnQncyB3aWtpcGVkaWEgbm90YXRpb24gYmVsb3cgaXMgdXNlZCBhcyBzdGFuZGFyZC4KKyAqIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TZXZlbl9zZWdtZW50X2Rpc3BsYXkKKyAqCisgKiBOb3RhdGlvbjoJKy1hLSsKKyAqCQlmICAgYgorICoJCSstZy0rCisgKgkJZSAgIGMKKyAqCQkrLWQtKworICoKKyAqIFVzYWdlOgorICoKKyAqICAgUmVnaXN0ZXIgYSBtYXAgdmFyaWFibGUsIGFuZCBmaWxsIGl0IHdpdGggYSBjaGFyYWN0ZXIgc2V0OgorICogCXN0YXRpYyBTRUc3X0RFRkFVTFRfTUFQKG1hcF9zZWc3KTsKKyAqCisgKgorICogICBUaGVuIHVzZSBmb3IgY29udmVyc2lvbjoKKyAqCXNlZzcgPSBtYXBfdG9fc2VnNygmbWFwX3NlZzcsIHNvbWVfY2hhcik7CisgKgkuLi4KKyAqCisgKiBJbiBkZXZpY2UgZHJpdmVycyBpdCBpcyByZWNvbW1lbmRlZCwgaWYgcmVxdWlyZWQsIHRvIG1ha2UgdGhlIGNoYXIgbWFwCisgKiBhY2Nlc3NpYmxlIHZpYSB0aGUgc3lzZnMgaW50ZXJmYWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgorICoKKyAqIHN0YXRpYyBzc2l6ZV90IHNob3dfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7CisgKgltZW1jcHkoYnVmLCAmbWFwX3NlZzcsIHNpemVvZihtYXBfc2VnNykpOworICoJcmV0dXJuIHNpemVvZihtYXBfc2VnNyk7CisgKiB9CisgKiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjbnQpIHsKKyAqCWlmKGNudCAhPSBzaXplb2YobWFwX3NlZzcpKQorICoJCXJldHVybiAtRUlOVkFMOworICoJbWVtY3B5KCZtYXBfc2VnNywgYnVmLCBjbnQpOworICoJcmV0dXJuIGNudDsKKyAqIH0KKyAqIHN0YXRpYyBERVZJQ0VfQVRUUihtYXBfc2VnNywgUEVSTVNfUlcsIHNob3dfbWFwLCBzdG9yZV9tYXApOworICoKKyAqIEhpc3Rvcnk6CisgKiAyMDA1LTA1LTMxCVJGQyBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisKKyNkZWZpbmUgQklUX1NFRzdfQQkJMAorI2RlZmluZSBCSVRfU0VHN19CCQkxCisjZGVmaW5lIEJJVF9TRUc3X0MJCTIKKyNkZWZpbmUgQklUX1NFRzdfRAkJMworI2RlZmluZSBCSVRfU0VHN19FCQk0CisjZGVmaW5lIEJJVF9TRUc3X0YJCTUKKyNkZWZpbmUgQklUX1NFRzdfRwkJNgorI2RlZmluZSBCSVRfU0VHN19SRVNFUlZFRAk3CisKK3N0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwIHsKKwl1bnNpZ25lZCBjaGFyCXRhYmxlWzEyOF07Cit9OworCitzdGF0aWMgaW5saW5lIGludCBtYXBfdG9fc2VnNyhzdHJ1Y3Qgc2VnN19jb252ZXJzaW9uX21hcCAqbWFwLCBpbnQgYykKK3sKKwlyZXR1cm4gYyAmIDB4N2YgPyBtYXAtPnRhYmxlW2NdIDogLUVJTlZBTDsKK30KKworI2RlZmluZSBTRUc3X0NPTlZFUlNJT05fTUFQKF9uYW1lLCBfbWFwKQlcCisJc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgX25hbWUgPSB7IC50YWJsZSA9IHsgX21hcCB9IH0KKworLyoKKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhIGZhY2lsaXR5IHRoYXQgYWxsb3dzIHVzZXIgc3BhY2UgdG8gcmVkZWZpbmUKKyAqIGN1c3RvbSBjaGFyYWN0ZXIgc2V0cyBmb3IgTENEIGRldmljZXMuIFBsZWFzZSB1c2UgYSBzeXNmcyBpbnRlcmZhY2UKKyAqIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqLworI2RlZmluZSBNQVBfVE9fU0VHN19TWVNGU19GSUxFCSJtYXBfc2VnNyIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX1NFRzcobCxhLGIsYyxkLGUsZixnKQlcCisgICAgICAoCWE8PEJJVF9TRUc3X0EgfAliPDxCSVRfU0VHN19CIHwJYzw8QklUX1NFRzdfQyB8CWQ8PEJJVF9TRUc3X0QgfAlcCisJZTw8QklUX1NFRzdfRSB8CWY8PEJJVF9TRUc3X0YgfAlnPDxCSVRfU0VHN19HICkKKworI2RlZmluZSBfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKworI2RlZmluZSBfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJyEnLDAsMCwwLDAsMSwxLDApLCBfU0VHNygnIicsMCwxLDAsMCwwLDEsMCksIF9TRUc3KCcjJywwLDEsMSwwLDEsMSwwKSxcCisgX1NFRzcoJyQnLDEsMCwxLDEsMCwxLDEpLCBfU0VHNygnJScsMCwwLDEsMCwwLDEsMCksIF9TRUc3KCcmJywxLDAsMSwxLDEsMSwxKSxcCisgX1NFRzcoJ1wnJywwLDAsMCwwLDAsMSwwKSxfU0VHNygnKCcsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCcpJywxLDEsMSwxLDAsMCwwKSxcCisgX1NFRzcoJyonLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnKycsMCwxLDEsMCwwLDAsMSksIF9TRUc3KCcsJywwLDAsMCwwLDEsMCwwKSxcCisgX1NFRzcoJy0nLDAsMCwwLDAsMCwwLDEpLCBfU0VHNygnLicsMCwwLDAsMCwxLDAsMCksIF9TRUc3KCcvJywwLDEsMCwwLDEsMCwxKSwKKworI2RlZmluZSBfTUFQXzQ4XzU3X0FTQ0lJX1NFRzdfTlVNRVJJQwkJXAorIF9TRUc3KCcwJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJzEnLDAsMSwxLDAsMCwwLDApLCBfU0VHNygnMicsMSwxLDAsMSwxLDAsMSksXAorIF9TRUc3KCczJywxLDEsMSwxLDAsMCwxKSwgX1NFRzcoJzQnLDAsMSwxLDAsMCwxLDEpLCBfU0VHNygnNScsMSwwLDEsMSwwLDEsMSksXAorIF9TRUc3KCc2JywxLDAsMSwxLDEsMSwxKSwgX1NFRzcoJzcnLDEsMSwxLDAsMCwwLDApLCBfU0VHNygnOCcsMSwxLDEsMSwxLDEsMSksXAorIF9TRUc3KCc5JywxLDEsMSwxLDAsMSwxKSwKKworI2RlZmluZSBfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJzonLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnOycsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc8JywxLDAsMCwwLDAsMSwxKSxcCisgX1NFRzcoJz0nLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnPicsMSwxLDAsMCwwLDAsMSksIF9TRUc3KCc/JywxLDEsMSwwLDAsMSwwKSxcCisgX1NFRzcoJ0AnLDEsMSwwLDEsMSwxLDEpLAorCisjZGVmaW5lIF9NQVBfNjVfOTBfQVNDSUlfU0VHN19BTFBIQV9VUFBSCVwKKyBfU0VHNygnQScsMSwxLDEsMCwxLDEsMSksIF9TRUc3KCdCJywxLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ0MnLDEsMCwwLDEsMSwxLDApLFwKKyBfU0VHNygnRCcsMSwxLDEsMSwxLDEsMCksIF9TRUc3KCdFJywxLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ0YnLDEsMCwwLDAsMSwxLDEpLFwKKyBfU0VHNygnRycsMSwxLDEsMSwwLDEsMSksIF9TRUc3KCdIJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0knLDAsMSwxLDAsMCwwLDApLFwKKyBfU0VHNygnSicsMCwxLDEsMSwwLDAsMCksIF9TRUc3KCdLJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0wnLDAsMCwwLDEsMSwxLDApLFwKKyBfU0VHNygnTScsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCdOJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ08nLDEsMSwxLDEsMSwxLDApLFwKKyBfU0VHNygnUCcsMSwxLDAsMCwxLDEsMSksIF9TRUc3KCdRJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ1InLDEsMSwxLDAsMSwxLDEpLFwKKyBfU0VHNygnUycsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCdUJywwLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ1UnLDAsMSwxLDEsMSwxLDApLFwKKyBfU0VHNygnVicsMCwxLDEsMSwxLDEsMCksIF9TRUc3KCdXJywwLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ1gnLDAsMSwxLDAsMSwxLDEpLFwKKyBfU0VHNygnWScsMCwxLDEsMCwwLDEsMSksIF9TRUc3KCdaJywxLDEsMCwxLDEsMCwxKSwKKworI2RlZmluZSBfTUFQXzkxXzk2X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJ1snLDEsMCwwLDEsMSwxLDApLCBfU0VHNygnXFwnLDAsMCwxLDAsMCwxLDEpLF9TRUc3KCddJywxLDEsMSwxLDAsMCwwKSxcCisgX1NFRzcoJ14nLDEsMSwwLDAsMCwxLDApLCBfU0VHNygnXycsMCwwLDAsMSwwLDAsMCksIF9TRUc3KCdgJywwLDEsMCwwLDAsMCwwKSwKKworI2RlZmluZSBfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKyBfU0VHNygnQScsMSwxLDEsMCwxLDEsMSksIF9TRUc3KCdiJywwLDAsMSwxLDEsMSwxKSwgX1NFRzcoJ2MnLDAsMCwwLDEsMSwwLDEpLFwKKyBfU0VHNygnZCcsMCwxLDEsMSwxLDAsMSksIF9TRUc3KCdFJywxLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ0YnLDEsMCwwLDAsMSwxLDEpLFwKKyBfU0VHNygnRycsMSwxLDEsMSwwLDEsMSksIF9TRUc3KCdoJywwLDAsMSwwLDEsMSwxKSwgX1NFRzcoJ2knLDAsMCwxLDAsMCwwLDApLFwKKyBfU0VHNygnaicsMCwwLDEsMSwwLDAsMCksIF9TRUc3KCdrJywwLDAsMSwwLDEsMSwxKSwgX1NFRzcoJ0wnLDAsMCwwLDEsMSwxLDApLFwKKyBfU0VHNygnTScsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCduJywwLDAsMSwwLDEsMCwxKSwgX1NFRzcoJ28nLDAsMCwxLDEsMSwwLDEpLFwKKyBfU0VHNygnUCcsMSwxLDAsMCwxLDEsMSksIF9TRUc3KCdxJywxLDEsMSwwLDAsMSwxKSwgX1NFRzcoJ3InLDAsMCwwLDAsMSwwLDEpLFwKKyBfU0VHNygnUycsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCdUJywwLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ3UnLDAsMCwxLDEsMSwwLDApLFwKKyBfU0VHNygndicsMCwwLDEsMSwxLDAsMCksIF9TRUc3KCdXJywwLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ1gnLDAsMSwxLDAsMSwxLDEpLFwKKyBfU0VHNygneScsMCwxLDEsMSwwLDEsMSksIF9TRUc3KCdaJywxLDEsMCwxLDEsMCwxKSwKKworI2RlZmluZSBfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygneycsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCd8JywwLDAsMCwwLDEsMSwwKSwgX1NFRzcoJ30nLDEsMSwxLDEsMCwwLDApLFwKKyBfU0VHNygnficsMSwwLDAsMCwwLDAsMCksCisKKy8qIE1hcHMgKi8KKworLyogVGhpcyBzZXQgdHJpZXMgdG8gbWFwIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSB2aXNpYmxlIGNoYXJhY3RlcmlzdGljcworICogb2YgdGhlIEFTQ0lJIHN5bWJvbCwgbG93ZXJjYXNlIGFuZCB1cHBlcmNhc2UgbGV0dGVycyBtYXkgZGlmZmVyIGluCisgKiBwcmVzZW50YXRpb24gb24gdGhlIGRpc3BsYXkuCisgKi8KKyNkZWZpbmUgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTQkJCVwKKwlfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKKwlfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF80OF81N19BU0NJSV9TRUc3X05VTUVSSUMJCVwKKwlfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF82NV85MF9BU0NJSV9TRUc3X0FMUEhBX1VQUFIJXAorCV9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKwlfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wKKworLyogVGhpcyBzZXQgdHJpZXMgdG8gbWFwIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBzeW1ib2xpYyBjaGFyYWN0ZXJpc3RpY3MKKyAqIG9mIHRoZSBBU0NJSSBjaGFyYWN0ZXIgZm9yIG1heGltdW0gZGlzY3JpbWluYXRpb24uCisgKiBGb3Igbm93IHRoaXMgbWVhbnMgYWxsIGFscGhhIGNoYXJzIGFyZSBpbiBsb3dlciBjYXNlIHJlcHJlc2VudGF0aW9ucy4KKyAqIChUaGlzIGZvciBleGFtcGxlIGZhY2lsaXRhdGVzIHRoZSB1c2Ugb2YgaGV4IG51bWJlcnMgd2l0aCB1cHBlcmNhc2UgaW5wdXQuKQorICovCisjZGVmaW5lIE1BUF9BU0NJSTdTRUdfQUxQSEFOVU1fTEMJCQlcCisJX01BUF8wXzMyX0FTQ0lJX1NFRzdfTk9OX1BSSU5UQUJMRQlcCisJX01BUF8zM180N19BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfNDhfNTdfQVNDSUlfU0VHN19OVU1FUklDCQlcCisJX01BUF81OF82NF9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorCV9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKwlfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wKKworI2RlZmluZSBTRUc3X0RFRkFVTFRfTUFQKF9uYW1lKQkJXAorCVNFRzdfQ09OVkVSU0lPTl9NQVAoX25hbWUsTUFQX0FTQ0lJN1NFR19BTFBIQU5VTSkKKworI2VuZGlmCS8qIE1BUF9UT183U0VHTUVOVF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3BpZC5jIGIvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMKaW5kZXggMjU2OTYzOC4uYWNjNzFlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCXN0cnVjdCBoaWRfZmZfcGlkICpwcml2YXRlOwogCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9lbnRyeSgmaGlkLT5pbnB1dHMsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOwogCi0JcHJpdmF0ZSA9IGhpZC0+ZmZfcHJpdmF0ZSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBoaWRfZmZfcGlkKSwgR0ZQX0tFUk5FTCk7CisJcHJpdmF0ZSA9IGhpZC0+ZmZfcHJpdmF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfZmZfcGlkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2YXRlKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jIGIvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTE3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMKQEAgLTAsMCArMSwxMDEzIEBACisvKgorICogZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEhlbmsgVmVyZ29uZXQgPEhlbmsuVmVyZ29uZXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRHJpdmVyIGZvciB0aGUgVVNCLVAxSyB2b2lwIHVzYiBwaG9uZS4KKyAqICAgVGhpcyBkZXZpY2UgaXMgcHJvZHVjZWQgYnkgWWVhbGluayBOZXR3b3JrIFRlY2hub2xvZ3kgQ28gTHRkCisgKiAgIGJ1dCBtYXkgYmUgYnJhbmRlZCB1bmRlciBzZXZlcmFsIG5hbWVzOgorICoJLSBZZWFsaW5rIHVzYi1wMWsKKyAqCS0gVGlwdGVsIDExNQorICoJLSAuLi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbjoKKyAqICAgLSB0aGUgdXNiYjJrLWFwaQlodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy91c2JiMmstYXBpLworICogICAtIGluZm9ybWF0aW9uIGZyb20JaHR0cDovL21lbWV0ZWF1LmZyZWUuZnIvdXNiYjJrCisgKiAgIC0gdGhlIHhwYWQtZHJpdmVyCWRyaXZlcnMvdXNiL2lucHV0L3hwYWQuYworICoKKyAqIFRoYW5rcyB0bzoKKyAqICAgLSBPbGl2aWVyIFZhbmRvcnBlLCBmb3IgcHJvdmlkaW5nIHRoZSB1c2JiMmstYXBpLgorICogICAtIE1hcnRpbiBEaWVobCwgZm9yIHNwb3R0aW5nIG15IG1lbW9yeSBhbGxvY2F0aW9uIGJ1Zy4KKyAqCisgKiBIaXN0b3J5OgorICogICAyMDA1MDUyNyBoZW5rCUZpcnN0IHZlcnNpb24sIGZ1bmN0aW9uYWwga2V5Ym9hcmQuIEtleWJvYXJkIGV2ZW50cworICoJCQl3aWxsIHBvcC11cCBvbiB0aGUgLi4vaW5wdXQvZXZlbnRYIGJ1cy4KKyAqICAgMjAwNTA1MzEgaGVuawlBZGRlZCBsZWQsIExDRCwgZGlhbHRvbmUgYW5kIHN5c2ZzIGludGVyZmFjZS4KKyAqICAgMjAwNTA2MTAgaGVuawlDbGVhbnVwcywgbWFrZSBpdCByZWFkeSBmb3IgcHVibGljIGNvbnN1bXB0aW9uLgorICogICAyMDA1MDYzMCBoZW5rCUNsZWFudXBzLCBmaXhlcyBpbiByZXNwb25zZSB0byBjb21tZW50cy4KKyAqICAgMjAwNTA3MDEgaGVuawlzeXNmcyB3cml0ZSBzZXJpYWxpc2F0aW9uLCBmaXggcG90ZW50aWFsIHVubG9hZCByYWNlcworICogICAyMDA1MDgwMSBoZW5rCUFkZGVkIHJpbmd0b25lLCByZXN0cnVjdHVyZSBVU0IKKyAqICAgMjAwNTA4MTYgaGVuawlNZXJnZSAyLjYuMTMtcmM2CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAibWFwX3RvXzdzZWdtZW50LmgiCisjaW5jbHVkZSAieWVhbGluay5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ5bGQtMjAwNTA4MTYiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkhlbmsgVmVyZ29uZXQiCisjZGVmaW5lIERSSVZFUl9ERVNDICJZZWFsaW5rIHBob25lIGRyaXZlciIKKworI2RlZmluZSBZRUFMSU5LX1BPTExJTkdfRlJFUVVFTkNZCTEwCS8qIGluIFtIel0gKi8KKworc3RydWN0IHlsZF9zdGF0dXMgeworCXU4CWxjZFsyNF07CisJdTgJbGVkOworCXU4CWRpYWx0b25lOworCXU4CXJpbmd0b25lOworCXU4CWtleW51bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogUmVnaXN0ZXIgdGhlIExDRCBzZWdtZW50IGFuZCBpY29uIG1hcAorICovCisjZGVmaW5lIF9MT0MoayxsKQl7IC5hID0gKGspLCAubSA9IChsKSB9CisjZGVmaW5lIF9TRUcodCwgYSwgYW0sIGIsIGJtLCBjLCBjbSwgZCwgZG0sIGUsIGVtLCBmLCBmbSwgZywgZ20pCVwKKwl7IC50eXBlCT0gKHQpLAkJCQkJCQlcCisJICAudSA9IHsgLnMgPSB7CV9MT0MoYSwgYW0pLCBfTE9DKGIsIGJtKSwgX0xPQyhjLCBjbSksCQlcCisJCSAgICAgICAgX0xPQyhkLCBkbSksIF9MT0MoZSwgZW0pLCBfTE9DKGcsIGdtKSwJCVwKKwkJCV9MT0MoZiwgZm0pIH0gfSB9CisjZGVmaW5lIF9QSUModCwgaCwgaG0sIG4pCQkJCQkJXAorCXsgLnR5cGUJPSAodCksCQkJCQkJCVwKKyAJICAudSA9IHsgLnAgPSB7IC5uYW1lID0gKG4pLCAuYSA9IChoKSwgLm0gPSAoaG0pIH0gfSB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGNkX3NlZ21lbnRfbWFwIHsKKwljaGFyCXR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgcGljdG9ncmFtX21hcCB7CisJCQl1OAlhLG07CisJCQljaGFyCW5hbWVbMTBdOworCQl9CXA7CisJCXN0cnVjdCBzZWdtZW50X21hcCB7CisJCQl1OAlhLG07CisJCX0gc1s3XTsKKwl9IHU7Cit9IGxjZE1hcFtdID0geworI2luY2x1ZGUgInllYWxpbmsuaCIKK307CisKK3N0cnVjdCB5ZWFsaW5rX2RldiB7CisJc3RydWN0IGlucHV0X2RldiBpZGV2OwkJLyogaW5wdXQgZGV2aWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIHVzYiBkZXZpY2UgKi8KKworCS8qIGlycSBpbnB1dCBjaGFubmVsICovCisJc3RydWN0IHlsZF9jdGxfcGFja2V0CSppcnFfZGF0YTsKKwlkbWFfYWRkcl90IAkJaXJxX2RtYTsKKwlzdHJ1Y3QgdXJiCQkqdXJiX2lycTsKKworCS8qIGNvbnRyb2wgb3V0cHV0IGNoYW5uZWwgKi8KKwlzdHJ1Y3QgeWxkX2N0bF9wYWNrZXQJKmN0bF9kYXRhOworCWRtYV9hZGRyX3QJCWN0bF9kbWE7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdAkqY3RsX3JlcTsKKwlkbWFfYWRkcl90CQljdGxfcmVxX2RtYTsKKwlzdHJ1Y3QgdXJiCQkqdXJiX2N0bDsKKworCWNoYXIgcGh5c1s2NF07CQkJLyogcGh5c2ljYWwgZGV2aWNlIHBhdGggKi8KKworCXU4IGxjZE1hcFtBUlJBWV9TSVpFKGxjZE1hcCldOwkvKiBzdGF0ZSBvZiBMQ0QsIExFRCAuLi4gKi8KKwlpbnQga2V5X2NvZGU7CQkJLyogbGFzdCByZXBvcnRlZCBrZXkJICovCisKKwlpbnQJc3RhdF9peDsKKwl1bmlvbiB7CisJCXN0cnVjdCB5bGRfc3RhdHVzIHM7CisJCXU4CQkgIGJbc2l6ZW9mKHN0cnVjdCB5bGRfc3RhdHVzKV07CisJfSBtYXN0ZXIsIGNvcHk7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZZWFsaW5rIGxjZCBpbnRlcmZhY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBSZWdpc3RlciBhIGRlZmF1bHQgNyBzZWdtZW50IGNoYXJhY3RlciBzZXQKKyAqLworc3RhdGljIFNFRzdfREVGQVVMVF9NQVAobWFwX3NlZzcpOworCisgLyogRGlzcGxheSBhIGNoYXIsCisgICogY2hhciAnXDknIGFuZCAnXG4nIGFyZSBwbGFjZWhvbGRlcnMgYW5kIGRvIG5vdCBvdmVyd3JpdGUgdGhlIG9yaWdpbmFsIHRleHQuCisgICogQSBzcGFjZSB3aWxsIGFsd2F5cyBoaWRlIGFuIGljb24uCisgICovCitzdGF0aWMgaW50IHNldENoYXIoc3RydWN0IHllYWxpbmtfZGV2ICp5bGQsIGludCBlbCwgaW50IGNocikKK3sKKwlpbnQgaSwgYSwgbSwgdmFsOworCisJaWYgKGVsID49IEFSUkFZX1NJWkUobGNkTWFwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2hyID09ICdcdCcgfHwgY2hyID09ICdcbicpCisJICAgIHJldHVybiAwOworCisJeWxkLT5sY2RNYXBbZWxdID0gY2hyOworCisJaWYgKGxjZE1hcFtlbF0udHlwZSA9PSAnLicpIHsKKwkJYSA9IGxjZE1hcFtlbF0udS5wLmE7CisJCW0gPSBsY2RNYXBbZWxdLnUucC5tOworCQlpZiAoY2hyICE9ICcgJykKKwkJCXlsZC0+bWFzdGVyLmJbYV0gfD0gbTsKKwkJZWxzZQorCQkJeWxkLT5tYXN0ZXIuYlthXSAmPSB+bTsKKwkJcmV0dXJuIDA7CisJfQorCisJdmFsID0gbWFwX3RvX3NlZzcoJm1hcF9zZWc3LCBjaHIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjZE1hcFswXS51LnMpOyBpKyspIHsKKwkJbSA9IGxjZE1hcFtlbF0udS5zW2ldLm07CisKKwkJaWYgKG0gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWEgPSBsY2RNYXBbZWxdLnUuc1tpXS5hOworCQlpZiAodmFsICYgMSkKKwkJCXlsZC0+bWFzdGVyLmJbYV0gfD0gbTsKKwkJZWxzZQorCQkJeWxkLT5tYXN0ZXIuYlthXSAmPSB+bTsKKwkJdmFsID0gdmFsID4+IDE7CisJfQorCXJldHVybiAwOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFllYWxpbmsga2V5IGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWFwIGRldmljZSBidXR0b25zIHRvIGludGVybmFsIGtleSBldmVudHMuCisgKgorICogVVNCLVAxSyBidXR0b24gbGF5b3V0OgorICoKKyAqICAgICAgICAgICAgIHVwCisgKiAgICAgICBJTiAgICAgICAgICAgT1VUCisgKiAgICAgICAgICAgIGRvd24KKyAqCisgKiAgICAgcGlja3VwICAgQyAgICBoYW5ndXAKKyAqICAgICAgIDEgICAgICAyICAgICAgMworICogICAgICAgNCAgICAgIDUgICAgICA2CisgKiAgICAgICA3ICAgICAgOCAgICAgIDkKKyAqICAgICAgICogICAgICAwICAgICAgIworICoKKyAqIFRoZSAidXAiIGFuZCAiZG93biIga2V5cywgYXJlIHN5bWJvbGlzZWQgYnkgYXJyb3dzIG9uIHRoZSBidXR0b24uCisgKiBUaGUgInBpY2t1cCIgYW5kICJoYW5ndXAiIGtleXMgYXJlIHN5bWJvbGlzZWQgYnkgYSBncmVlbiBhbmQgcmVkIHBob25lCisgKiBvbiB0aGUgYnV0dG9uLgorICovCitzdGF0aWMgaW50IG1hcF9wMWtfdG9fa2V5KGludCBzY2FuY29kZSkKK3sKKwlzd2l0Y2goc2NhbmNvZGUpIHsJCS8qIHBob25lIGtleToJKi8KKwljYXNlIDB4MjM6IHJldHVybiBLRVlfTEVGVDsJLyogICBJTgkJKi8KKwljYXNlIDB4MzM6IHJldHVybiBLRVlfVVA7CS8qICAgdXAJCSovCisJY2FzZSAweDA0OiByZXR1cm4gS0VZX1JJR0hUOwkvKiAgIE9VVAkqLworCWNhc2UgMHgyNDogcmV0dXJuIEtFWV9ET1dOOwkvKiAgIGRvd24JKi8KKwljYXNlIDB4MDM6IHJldHVybiBLRVlfRU5URVI7CS8qICAgcGlja3VwCSovCisJY2FzZSAweDE0OiByZXR1cm4gS0VZX0JBQ0tTUEFDRTsgLyogIEMJCSovCisJY2FzZSAweDEzOiByZXR1cm4gS0VZX0VTQzsJLyogICBoYW5ndXAJKi8KKwljYXNlIDB4MDA6IHJldHVybiBLRVlfMTsJLyogICAxCQkqLworCWNhc2UgMHgwMTogcmV0dXJuIEtFWV8yOwkvKiAgIDIgCQkqLworCWNhc2UgMHgwMjogcmV0dXJuIEtFWV8zOwkvKiAgIDMJCSovCisJY2FzZSAweDEwOiByZXR1cm4gS0VZXzQ7CS8qICAgNAkJKi8KKwljYXNlIDB4MTE6IHJldHVybiBLRVlfNTsJLyogICA1CQkqLworCWNhc2UgMHgxMjogcmV0dXJuIEtFWV82OwkvKiAgIDYJCSovCisJY2FzZSAweDIwOiByZXR1cm4gS0VZXzc7CS8qICAgNwkJKi8KKwljYXNlIDB4MjE6IHJldHVybiBLRVlfODsJLyogICA4CQkqLworCWNhc2UgMHgyMjogcmV0dXJuIEtFWV85OwkvKiAgIDkJCSovCisJY2FzZSAweDMwOiByZXR1cm4gS0VZX0tQQVNURVJJU0s7IC8qICoJCSovCisJY2FzZSAweDMxOiByZXR1cm4gS0VZXzA7CS8qICAgMAkJKi8KKwljYXNlIDB4MzI6IHJldHVybiBLRVlfTEVGVFNISUZUIHwKKwkJCSAgS0VZXzMgPDwgODsJLyogICAjCQkqLworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogQ29tcGxldGVzIGEgcmVxdWVzdCBieSBjb252ZXJ0aW5nIHRoZSBkYXRhIGludG8gZXZlbnRzIGZvciB0aGUKKyAqIGlucHV0IHN1YnN5c3RlbS4KKyAqCisgKiBUaGUga2V5IHBhcmFtZXRlciBjYW4gYmUgY2FzY2FkZWQ6IGtleTIgPDwgOCB8IGtleTEKKyAqLworc3RhdGljIHZvaWQgcmVwb3J0X2tleShzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCwgaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlucHV0X2RldiAqaWRldiA9ICZ5bGQtPmlkZXY7CisKKwlpbnB1dF9yZWdzKGlkZXYsIHJlZ3MpOworCWlmICh5bGQtPmtleV9jb2RlID49IDApIHsKKwkJLyogb2xkIGtleSB1cCAqLworCQlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIHlsZC0+a2V5X2NvZGUgJiAweGZmLCAwKTsKKwkJaWYgKHlsZC0+a2V5X2NvZGUgPj4gOCkKKwkJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwgeWxkLT5rZXlfY29kZSA+PiA4LCAwKTsKKwl9CisKKwl5bGQtPmtleV9jb2RlID0ga2V5OworCWlmIChrZXkgPj0gMCkgeworCQkvKiBuZXcgdmFsaWQga2V5ICovCisJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwga2V5ICYgMHhmZiwgMSk7CisJCWlmIChrZXkgPj4gOCkKKwkJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwga2V5ID4+IDgsIDEpOworCX0KKwlpbnB1dF9zeW5jKGlkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWWVhbGluayB1c2IgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgeWVhbGlua19jbWQoc3RydWN0IHllYWxpbmtfZGV2ICp5bGQsIHN0cnVjdCB5bGRfY3RsX3BhY2tldCAqcCkKK3sKKwl1OAkqYnVmID0gKHU4ICopcDsKKwlpbnQJaTsKKwl1OAlzdW0gPSAwOworCisJZm9yKGk9MDsgaTxVU0JfUEtUX0xFTi0xOyBpKyspCisJCXN1bSAtPSBidWZbaV07CisJcC0+c3VtID0gc3VtOworCXJldHVybiB1c2JfY29udHJvbF9tc2coeWxkLT51ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHlsZC0+dWRldiwgMCksCisJCQlVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLAorCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCisJCQkweDIwMCwgMywKKwkJCXAsIHNpemVvZigqcCksCisJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Cit9CisKK3N0YXRpYyB1OCBkZWZhdWx0X3Jpbmd0b25lW10gPSB7CisJMHhFRiwJCQkvKiB2b2x1bWUgWzAtMjU1XSAqLworCTB4RkIsIDB4MUUsIDB4MDAsIDB4MEMsCS8qIDEyNTAgW2h6XSwgMTIvMTAwIFtzXSAqLworCTB4RkMsIDB4MTgsIDB4MDAsIDB4MEMsCS8qIDEwMDAgW2h6XSwgMTIvMTAwIFtzXSAqLworCTB4RkIsIDB4MUUsIDB4MDAsIDB4MEMsCisJMHhGQywgMHgxOCwgMHgwMCwgMHgwQywKKwkweEZCLCAweDFFLCAweDAwLCAweDBDLAorCTB4RkMsIDB4MTgsIDB4MDAsIDB4MEMsCisJMHhGQiwgMHgxRSwgMHgwMCwgMHgwQywKKwkweEZDLCAweDE4LCAweDAwLCAweDBDLAorCTB4RkYsIDB4RkYsIDB4MDEsIDB4OTAsCS8qIHNpbGVudCwgNDAwLzEwMCBbc10gKi8KKwkweDAwLCAweDAwCQkvKiBlbmQgb2Ygc2VxdWVuY2UgKi8KK307CisKK3N0YXRpYyBpbnQgeWVhbGlua19zZXRfcmluZ3RvbmUoc3RydWN0IHllYWxpbmtfZGV2ICp5bGQsIHU4ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB5bGRfY3RsX3BhY2tldCAqcCA9IHlsZC0+Y3RsX2RhdGE7CisJaW50CWl4LCBsZW47CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldCB0aGUgcmluZ3RvbmUgdm9sdW1lICovCisJbWVtc2V0KHlsZC0+Y3RsX2RhdGEsIDAsIHNpemVvZigqKHlsZC0+Y3RsX2RhdGEpKSk7CisJeWxkLT5jdGxfZGF0YS0+Y21kCT0gQ01EX1JJTkdfVk9MVU1FOworCXlsZC0+Y3RsX2RhdGEtPnNpemUJPSAxOworCXlsZC0+Y3RsX2RhdGEtPmRhdGFbMF0JPSBidWZbMF07CisJeWVhbGlua19jbWQoeWxkLCBwKTsKKworCWJ1ZisrOworCXNpemUtLTsKKworCXAtPmNtZCA9IENNRF9SSU5HX05PVEU7CisJaXggPSAwOworCXdoaWxlIChzaXplICE9IGl4KSB7CisJCWxlbiA9IHNpemUgLSBpeDsKKwkJaWYgKGxlbiA+IHNpemVvZihwLT5kYXRhKSkKKwkJCWxlbiA9IHNpemVvZihwLT5kYXRhKTsKKwkJcC0+c2l6ZQkgID0gbGVuOworCQlwLT5vZmZzZXQgPSBjcHVfdG9fYmUxNihpeCk7CisJCW1lbWNweShwLT5kYXRhLCAmYnVmW2l4XSwgbGVuKTsKKwkJeWVhbGlua19jbWQoeWxkLCBwKTsKKwkJaXggKz0gbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoga2VlcCBzdGF0X21hc3RlciAmIHN0YXRfY29weSBpbiBzeW5jLgorICovCitzdGF0aWMgaW50IHllYWxpbmtfZG9faWRsZV90YXNrcyhzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCkKK3sKKwl1OCB2YWw7CisJaW50IGksIGl4LCBsZW47CisKKwlpeCA9IHlsZC0+c3RhdF9peDsKKworCW1lbXNldCh5bGQtPmN0bF9kYXRhLCAwLCBzaXplb2YoKih5bGQtPmN0bF9kYXRhKSkpOworCXlsZC0+Y3RsX2RhdGEtPmNtZCAgPSBDTURfS0VZUFJFU1M7CisJeWxkLT5jdGxfZGF0YS0+c2l6ZSA9IDE7CisJeWxkLT5jdGxfZGF0YS0+c3VtICA9IDB4ZmYgLSBDTURfS0VZUFJFU1M7CisKKwkvKiBJZiBzdGF0ZSB1cGRhdGUgcG9pbnRlciB3cmFwcyBkbyBhIEtFWVBSRVNTIGZpcnN0LiAqLworCWlmIChpeCA+PSBzaXplb2YoeWxkLT5tYXN0ZXIpKSB7CisJCXlsZC0+c3RhdF9peCA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpbmQgdXBkYXRlIGNhbmRpZGF0ZXM6IGNvcHkgIT0gbWFzdGVyICovCisJZG8geworCQl2YWwgPSB5bGQtPm1hc3Rlci5iW2l4XTsKKwkJaWYgKHZhbCAhPSB5bGQtPmNvcHkuYltpeF0pCisJCQlnb3RvIHNlbmRfdXBkYXRlOworCX0gd2hpbGUgKCsraXggPCBzaXplb2YoeWxkLT5tYXN0ZXIpKTsKKworCS8qIG5vdGhpbmcgdG9kbywgd2FpdCBhIGJpdCBhbmQgcG9sbCBmb3IgYSBLRVlQUkVTUyAqLworCXlsZC0+c3RhdF9peCA9IDA7CisJLyogVE9ETyBob3cgY2FuIHdlIHdhaXQgYWJpdC4gPz8KKwkgKiBtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwIC8gWUVBTElOS19QT0xMSU5HX0ZSRVFVRU5DWSk7CisJICovCisJcmV0dXJuIDA7CisKK3NlbmRfdXBkYXRlOgorCisJLyogU2V0dXAgYW4gYXBwcm9wcmlhdGUgdXBkYXRlIHJlcXVlc3QgKi8KKwl5bGQtPmNvcHkuYltpeF0gPSB2YWw7CisJeWxkLT5jdGxfZGF0YS0+ZGF0YVswXSA9IHZhbDsKKworCXN3aXRjaChpeCkgeworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHlsZF9zdGF0dXMsIGxlZCk6CisJCXlsZC0+Y3RsX2RhdGEtPmNtZAk9IENNRF9MRUQ7CisJCXlsZC0+Y3RsX2RhdGEtPnN1bQk9IC0xIC0gQ01EX0xFRCAtIHZhbDsKKwkJYnJlYWs7CisJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgeWxkX3N0YXR1cywgZGlhbHRvbmUpOgorCQl5bGQtPmN0bF9kYXRhLT5jbWQJPSBDTURfRElBTFRPTkU7CisJCXlsZC0+Y3RsX2RhdGEtPnN1bQk9IC0xIC0gQ01EX0RJQUxUT05FIC0gdmFsOworCQlicmVhazsKKwljYXNlIG9mZnNldG9mKHN0cnVjdCB5bGRfc3RhdHVzLCByaW5ndG9uZSk6CisJCXlsZC0+Y3RsX2RhdGEtPmNtZAk9IENNRF9SSU5HVE9ORTsKKwkJeWxkLT5jdGxfZGF0YS0+c3VtCT0gLTEgLSBDTURfUklOR1RPTkUgLSB2YWw7CisJCWJyZWFrOworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHlsZF9zdGF0dXMsIGtleW51bSk6CisJCXZhbC0tOworCQl2YWwgJj0gMHgxZjsKKwkJeWxkLT5jdGxfZGF0YS0+Y21kCT0gQ01EX1NDQU5DT0RFOworCQl5bGQtPmN0bF9kYXRhLT5vZmZzZXQJPSBjcHVfdG9fYmUxNih2YWwpOworCQl5bGQtPmN0bF9kYXRhLT5kYXRhWzBdCT0gMDsKKwkJeWxkLT5jdGxfZGF0YS0+c3VtCT0gLTEgLSBDTURfU0NBTkNPREUgLSB2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxlbiA9IHNpemVvZih5bGQtPm1hc3Rlci5zLmxjZCkgLSBpeDsKKwkJaWYgKGxlbiA+IHNpemVvZih5bGQtPmN0bF9kYXRhLT5kYXRhKSkKKwkJCWxlbiA9IHNpemVvZih5bGQtPmN0bF9kYXRhLT5kYXRhKTsKKworCQkvKiBDb21iaW5lIHVwIHRvIDxsZW4+IGNvbnNlY3V0aXZlIExDRCBieXRlcyBpbiBhIHNpbmdlIHJlcXVlc3QKKwkJICovCisJCXlsZC0+Y3RsX2RhdGEtPmNtZAk9IENNRF9MQ0Q7CisJCXlsZC0+Y3RsX2RhdGEtPm9mZnNldAk9IGNwdV90b19iZTE2KGl4KTsKKwkJeWxkLT5jdGxfZGF0YS0+c2l6ZQk9IGxlbjsKKwkJeWxkLT5jdGxfZGF0YS0+c3VtCT0gLUNNRF9MQ0QgLSBpeCAtIHZhbCAtIGxlbjsKKwkJZm9yKGk9MTsgaTxsZW47IGkrKykgeworCQkJaXgrKzsKKwkJCXZhbCA9IHlsZC0+bWFzdGVyLmJbaXhdOworCQkJeWxkLT5jb3B5LmJbaXhdCQk9IHZhbDsKKwkJCXlsZC0+Y3RsX2RhdGEtPmRhdGFbaV0JPSB2YWw7CisJCQl5bGQtPmN0bF9kYXRhLT5zdW0gICAgIC09IHZhbDsKKwkJfQorCX0KKwl5bGQtPnN0YXRfaXggPSBpeCArIDE7CisJcmV0dXJuIDE7Cit9CisKKy8qIERlY2lkZSBvbiBob3cgdG8gaGFuZGxlIHJlc3BvbnNlcworICoKKyAqIFRoZSBzdGF0ZSB0cmFuc2l0aW9uIGRpYWdyYW0gaXMgc29tZXRoaGluZyBsaWtlOgorICoKKyAqICAgICAgICAgIHN5bmNTdGF0ZTwtLSsKKyAqICAgICAgICAgICAgICAgfCAgICAgIHwKKyAqICAgICAgICAgICAgICAgfCAgICBpZGxlCisgKiAgICAgICAgICAgICAgXHwvICAgICB8CisgKiBpbml0IC0tb2stLT4gd2FpdEZvcktleSAtLW9rLS0+IGdldEtleQorICogIF4gICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgIHwKKyAqICB8ICAgICAgICAgICAgICAgKy0tLS0tLS1vay0tLS0tLS0rCisgKiBlcnJvcixzdGFydAorICoKKyAqLworc3RhdGljIHZvaWQgdXJiX2lycV9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkID0gdXJiLT5jb250ZXh0OworCWludCByZXQ7CisKKwlpZiAodXJiLT5zdGF0dXMpCisJCWVycigiJXMgLSB1cmIgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisKKwlzd2l0Y2ggKHlsZC0+aXJxX2RhdGEtPmNtZCkgeworCWNhc2UgQ01EX0tFWVBSRVNTOgorCisJCXlsZC0+bWFzdGVyLnMua2V5bnVtID0geWxkLT5pcnFfZGF0YS0+ZGF0YVswXTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9TQ0FOQ09ERToKKwkJZGJnKCJnZXQgc2NhbmNvZGUgJXgiLCB5bGQtPmlycV9kYXRhLT5kYXRhWzBdKTsKKworCQlyZXBvcnRfa2V5KHlsZCwgbWFwX3Axa190b19rZXkoeWxkLT5pcnFfZGF0YS0+ZGF0YVswXSksIHJlZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycigidW5leHBlY3RlZCByZXNwb25zZSAleCIsIHlsZC0+aXJxX2RhdGEtPmNtZCk7CisJfQorCisJeWVhbGlua19kb19pZGxlX3Rhc2tzKHlsZCk7CisKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih5bGQtPnVyYl9jdGwsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpCisJCWVycigiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHVyYl9jdGxfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgcmV0OworCisJaWYgKHVyYi0+c3RhdHVzKQorCQllcnIoIiVzIC0gdXJiIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCisJc3dpdGNoICh5bGQtPmN0bF9kYXRhLT5jbWQpIHsKKwljYXNlIENNRF9LRVlQUkVTUzoKKwljYXNlIENNRF9TQ0FOQ09ERToKKwkJLyogYXNrIGZvciBhIHJlc3BvbnNlICovCisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHlsZC0+dXJiX2lycSwgR0ZQX0FUT01JQyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNlbmQgbmV3IGNvbW1hbmQgKi8KKwkJeWVhbGlua19kb19pZGxlX3Rhc2tzKHlsZCk7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHlsZC0+dXJiX2N0bCwgR0ZQX0FUT01JQyk7CisJfQorCisJaWYgKHJldCkKKwkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlucHV0IGV2ZW50IGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVE9ETyBzaG91bGQgd2UgaXNzdWUgYSByaW5ndG9uZSBvbiBhIFNORF9CRUxMIGV2ZW50Pworc3RhdGljIGludCBpbnB1dF9ldihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLAorCQl1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQoreworCisJaWYgKHR5cGUgIT0gRVZfU05EKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgU05EX0JFTEw6CisJY2FzZSBTTkRfVE9ORToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisqLworCitzdGF0aWMgaW50IGlucHV0X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkID0gZGV2LT5wcml2YXRlOworCWludCBpLCByZXQ7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCS8qIGZvcmNlIHVwZGF0ZXMgdG8gZGV2aWNlICovCisJZm9yIChpID0gMDsgaTxzaXplb2YoeWxkLT5tYXN0ZXIpOyBpKyspCisJCXlsZC0+Y29weS5iW2ldID0gfnlsZC0+bWFzdGVyLmJbaV07CisJeWxkLT5rZXlfY29kZSA9IC0xOwkvKiBubyBrZXlzIHByZXNzZWQgKi8KKworICAgICAgICB5ZWFsaW5rX3NldF9yaW5ndG9uZSh5bGQsIGRlZmF1bHRfcmluZ3RvbmUsIHNpemVvZihkZWZhdWx0X3Jpbmd0b25lKSk7CisKKwkvKiBpc3N1ZSBJTklUICovCisJbWVtc2V0KHlsZC0+Y3RsX2RhdGEsIDAsIHNpemVvZigqKHlsZC0+Y3RsX2RhdGEpKSk7CisJeWxkLT5jdGxfZGF0YS0+Y21kCT0gQ01EX0lOSVQ7CisJeWxkLT5jdGxfZGF0YS0+c2l6ZQk9IDEwOworCXlsZC0+Y3RsX2RhdGEtPnN1bQk9IDB4MTAwLUNNRF9JTklULTEwOworCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIoeWxkLT51cmJfY3RsLCBHRlBfS0VSTkVMKSkgIT0gMCkgeworCQlkYmcoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnB1dF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQgPSBkZXYtPnByaXZhdGU7CisKKwl1c2Jfa2lsbF91cmIoeWxkLT51cmJfY3RsKTsKKwl1c2Jfa2lsbF91cmIoeWxkLT51cmJfaXJxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c2ZzIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERFQ0xBUkVfUldTRU0oc3lzZnNfcndzZW1hKTsKKworLyogSW50ZXJmYWNlIHRvIHRoZSA3LXNlZ21lbnRzIHRyYW5zbGF0aW9uIHRhYmxlIGFrYS4gY2hhciBzZXQuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCW1lbWNweShidWYsICZtYXBfc2VnNywgc2l6ZW9mKG1hcF9zZWc3KSk7CisJcmV0dXJuIHNpemVvZihtYXBfc2VnNyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNudCkKK3sKKwlpZiAoY250ICE9IHNpemVvZihtYXBfc2VnNykpCisJCXJldHVybiAtRUlOVkFMOworCW1lbWNweSgmbWFwX3NlZzcsIGJ1Ziwgc2l6ZW9mKG1hcF9zZWc3KSk7CisJcmV0dXJuIHNpemVvZihtYXBfc2VnNyk7Cit9CisKKy8qIEludGVyZmFjZSB0byB0aGUgTENELgorICovCisKKy8qIFJlYWRpbmcgL3N5cy8uLi9saW5lWCB3aWxsIHJldHVybiB0aGUgZm9ybWF0IHN0cmluZyB3aXRoIGl0cyBzZXR0aW5nczoKKyAqCisgKiBFeGFtcGxlOgorICogY2F0IC4vbGluZTMKKyAqIDg4ODg4ODg4ODg4OAorICogTGludXggUm9ja3MhCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfbGluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGEsIGludCBiKQoreworCXN0cnVjdCB5ZWFsaW5rX2RldiAqeWxkOworCWludCBpOworCisJZG93bl9yZWFkKCZzeXNmc19yd3NlbWEpOworCXlsZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICh5bGQgPT0gTlVMTCkgeworCQl1cF9yZWFkKCZzeXNmc19yd3NlbWEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSBhOyBpIDwgYjsgaSsrKQorCQkqYnVmKysgPSBsY2RNYXBbaV0udHlwZTsKKwkqYnVmKysgPSAnXG4nOworCWZvciAoaSA9IGE7IGkgPCBiOyBpKyspCisJCSpidWYrKyA9IHlsZC0+bGNkTWFwW2ldOworCSpidWYrKyA9ICdcbic7CisJKmJ1ZiA9IDA7CisKKwl1cF9yZWFkKCZzeXNmc19yd3NlbWEpOworCXJldHVybiAzICsgKChiIC0gYSkgPDwgMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbGluZTEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2hvd19saW5lKGRldiwgYnVmLCBMQ0RfTElORTFfT0ZGU0VULCBMQ0RfTElORTJfT0ZGU0VUKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19saW5lMihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzaG93X2xpbmUoZGV2LCBidWYsIExDRF9MSU5FMl9PRkZTRVQsIExDRF9MSU5FM19PRkZTRVQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2xpbmUzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNob3dfbGluZShkZXYsIGJ1ZiwgTENEX0xJTkUzX09GRlNFVCwgTENEX0xJTkU0X09GRlNFVCk7Cit9CisKKy8qIFdyaXRpbmcgdG8gL3N5cy8uLi9saW5lWCB3aWxsIHNldCB0aGUgY29yZXNwb25kaW5nIExDRCBsaW5lLgorICogLSBFeGNlc3MgY2hhcmFjdGVycyBhcmUgaWdub3JlZC4KKyAqIC0gSWYgbGVzcyBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoYW4gYWxsb3dlZCwgdGhlIHJlbWFpbmluZyBkaWdpdHMgYXJlCisgKiAgIHVuY2hhbmdlZC4KKyAqIC0gVGhlICdcbicgb3IgJ1x0JyBjaGFyIGlzIGEgcGxhY2Vob2xkZXIsIGl0IGRvZXMgbm90IG92ZXJ3cml0ZSB0aGUKKyAqICAgb3JpZ2luYWwgY29udGVudC4KKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfbGluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQlpbnQgZWwsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQ7CisJaW50IGk7CisKKwlkb3duX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCXlsZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICh5bGQgPT0gTlVMTCkgeworCQl1cF93cml0ZSgmc3lzZnNfcndzZW1hKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXNldENoYXIoeWxkLCBlbCsrLCBidWZbaV0pOworCisJdXBfd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9saW5lMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzdG9yZV9saW5lKGRldiwgYnVmLCBjb3VudCwgTENEX0xJTkUxX09GRlNFVCwgTENEX0xJTkUxX1NJWkUpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9saW5lMihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzdG9yZV9saW5lKGRldiwgYnVmLCBjb3VudCwgTENEX0xJTkUyX09GRlNFVCwgTENEX0xJTkUyX1NJWkUpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9saW5lMyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzdG9yZV9saW5lKGRldiwgYnVmLCBjb3VudCwgTENEX0xJTkUzX09GRlNFVCwgTENEX0xJTkUzX1NJWkUpOworfQorCisvKiBJbnRlcmZhY2UgdG8gdmlzaWJsZSBhbmQgYXVkaWJsZSAiaWNvbnMiLCB0aGVzZSBpbmNsdWRlOgorICogcGljdHVyZXMgb24gdGhlIExDRCwgdGhlIExFRCwgYW5kIHRoZSBkaWFsdG9uZSBzaWduYWwuCisgKi8KKworLyogR2V0IGEgbGlzdCBvZiAic3dpdGNoYWJsZSBlbGVtZW50cyIgd2l0aCB0aGVpciBjdXJyZW50IHN0YXRlLiAqLworc3RhdGljIHNzaXplX3QgZ2V0X2ljb25zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQ7CisJaW50IGksIHJldCA9IDE7CisKKwlkb3duX3JlYWQoJnN5c2ZzX3J3c2VtYSk7CisJeWxkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKHlsZCA9PSBOVUxMKSB7CisJCXVwX3JlYWQoJnN5c2ZzX3J3c2VtYSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjZE1hcCk7IGkrKykgeworCQlpZiAobGNkTWFwW2ldLnR5cGUgIT0gJy4nKQorCQkJY29udGludWU7CisJCXJldCArPSBzcHJpbnRmKCZidWZbcmV0XSwgIiVzICVzXG4iLAorCQkJCXlsZC0+bGNkTWFwW2ldID09ICcgJyA/ICIgICIgOiAib24iLAorCQkJCWxjZE1hcFtpXS51LnAubmFtZSk7CisJfQorCXVwX3JlYWQoJnN5c2ZzX3J3c2VtYSk7CisJcmV0dXJuIHJldDsKK30KKworLyogQ2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIGEgcGFydGljdWxhciBlbGVtZW50LiAqLworc3RhdGljIHNzaXplX3Qgc2V0X2ljb24oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCWludCBjaHIpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQ7CisJaW50IGk7CisKKwlkb3duX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCXlsZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICh5bGQgPT0gTlVMTCkgeworCQl1cF93cml0ZSgmc3lzZnNfcndzZW1hKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNkTWFwKTsgaSsrKSB7CisJCWlmIChsY2RNYXBbaV0udHlwZSAhPSAnLicpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cm5jbXAoYnVmLCBsY2RNYXBbaV0udS5wLm5hbWUsIGNvdW50KSA9PSAwKSB7CisJCQlzZXRDaGFyKHlsZCwgaSwgY2hyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdXBfd3JpdGUoJnN5c2ZzX3J3c2VtYSk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ljb24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHNldF9pY29uKGRldiwgYnVmLCBjb3VudCwgYnVmWzBdKTsKK30KKworc3RhdGljIHNzaXplX3QgaGlkZV9pY29uKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZXRfaWNvbihkZXYsIGJ1ZiwgY291bnQsICcgJyk7Cit9CisKKy8qIFVwbG9hZCBhIHJpbmd0b25lIHRvIHRoZSBkZXZpY2UuCisgKi8KKworLyogU3RvcmVzIHJhdyByaW5ndG9uZSBkYXRhIGluIHRoZSBwaG9uZSAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfcmluZ3RvbmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQ7CisKKwlkb3duX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCXlsZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICh5bGQgPT0gTlVMTCkgeworCQl1cF93cml0ZSgmc3lzZnNfcndzZW1hKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVE9ETyBsb2NraW5nIHdpdGggYXN5bmMgdXNiIGNvbnRyb2wgaW50ZXJmYWNlPz8/ICovCisJeWVhbGlua19zZXRfcmluZ3RvbmUoeWxkLCAoY2hhciAqKWJ1ZiwgY291bnQpOworCXVwX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBfTTQ0NAlTX0lSVUdPCisjZGVmaW5lIF9NNjY0CVNfSVJVR098U19JV1VTUnxTX0lXR1JQCisjZGVmaW5lIF9NMjIwCVNfSVdVU1J8U19JV0dSUAorCitzdGF0aWMgREVWSUNFX0FUVFIobWFwX3NlZzcJLCBfTTY2NCwgc2hvd19tYXAJLCBzdG9yZV9tYXAJKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsaW5lMQksIF9NNjY0LCBzaG93X2xpbmUxCSwgc3RvcmVfbGluZTEJKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsaW5lMgksIF9NNjY0LCBzaG93X2xpbmUyCSwgc3RvcmVfbGluZTIJKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsaW5lMwksIF9NNjY0LCBzaG93X2xpbmUzCSwgc3RvcmVfbGluZTMJKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihnZXRfaWNvbnMJLCBfTTQ0NCwgZ2V0X2ljb25zCSwgTlVMTAkJKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzaG93X2ljb24JLCBfTTIyMCwgTlVMTAkJLCBzaG93X2ljb24JKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihoaWRlX2ljb24JLCBfTTIyMCwgTlVMTAkJLCBoaWRlX2ljb24JKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyaW5ndG9uZQksIF9NMjIwLCBOVUxMCQksIHN0b3JlX3Jpbmd0b25lKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnlsZF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2xpbmUxLmF0dHIsCisJJmRldl9hdHRyX2xpbmUyLmF0dHIsCisJJmRldl9hdHRyX2xpbmUzLmF0dHIsCisJJmRldl9hdHRyX2dldF9pY29ucy5hdHRyLAorCSZkZXZfYXR0cl9zaG93X2ljb24uYXR0ciwKKwkmZGV2X2F0dHJfaGlkZV9pY29uLmF0dHIsCisJJmRldl9hdHRyX21hcF9zZWc3LmF0dHIsCisJJmRldl9hdHRyX3Jpbmd0b25lLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgeWxkX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0geWxkX2F0dHJpYnV0ZXMKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBpbnRlcmZhY2UgYW5kIHVzYiBpbml0aWFsaXNhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB5bGRfZGV2aWNlIHsKKwl1MTYgaWRWZW5kb3I7CisJdTE2IGlkUHJvZHVjdDsKKwljaGFyICpuYW1lOworfSB5bGRfZGV2aWNlW10gPSB7CisJeyAweDY5OTMsIDB4YjAwMSwgIlllYWxpbmsgdXNiLXAxayIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfdGFibGUgW10gPSB7CisJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0hJRCwgMCwgMCkgfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgdXNiX2NsZWFudXAoc3RydWN0IHllYWxpbmtfZGV2ICp5bGQsIGludCBlcnIpCit7CisJaWYgKHlsZCA9PSBOVUxMKQorCQlyZXR1cm4gZXJyOworCisgICAgICAgIGlmICh5bGQtPnVyYl9pcnEpIHsKKwkJdXNiX2tpbGxfdXJiKHlsZC0+dXJiX2lycSk7CisJCXVzYl9mcmVlX3VyYih5bGQtPnVyYl9pcnEpOworCX0KKyAgICAgICAgaWYgKHlsZC0+dXJiX2N0bCkKKwkJdXNiX2ZyZWVfdXJiKHlsZC0+dXJiX2N0bCk7CisgICAgICAgIGlmICh5bGQtPmlkZXYuZGV2KQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmeWxkLT5pZGV2KTsKKwlpZiAoeWxkLT5jdGxfcmVxKQorCQl1c2JfYnVmZmVyX2ZyZWUoeWxkLT51ZGV2LCBzaXplb2YoKih5bGQtPmN0bF9yZXEpKSwKKwkJCQl5bGQtPmN0bF9yZXEsIHlsZC0+Y3RsX3JlcV9kbWEpOworCWlmICh5bGQtPmN0bF9kYXRhKQorCQl1c2JfYnVmZmVyX2ZyZWUoeWxkLT51ZGV2LCBVU0JfUEtUX0xFTiwKKwkJCQl5bGQtPmN0bF9kYXRhLCB5bGQtPmN0bF9kbWEpOworCWlmICh5bGQtPmlycV9kYXRhKQorCQl1c2JfYnVmZmVyX2ZyZWUoeWxkLT51ZGV2LCBVU0JfUEtUX0xFTiwKKwkJCQl5bGQtPmlycV9kYXRhLCB5bGQtPmlycV9kbWEpOworCWtmcmVlKHlsZCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHllYWxpbmtfZGV2ICp5bGQ7CisKKwlkb3duX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCXlsZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnlsZF9hdHRyX2dyb3VwKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCXVwX3dyaXRlKCZzeXNmc19yd3NlbWEpOworCisJdXNiX2NsZWFudXAoeWxkLCAwKTsKK30KKworc3RhdGljIGludCB1c2JfbWF0Y2goc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJaW50IGk7CisJdTE2IGlkVmVuZG9yID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJdTE2IGlkUHJvZHVjdCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHlsZF9kZXZpY2UpOyBpKyspIHsKKwkJaWYgKChpZFZlbmRvciA9PSB5bGRfZGV2aWNlW2ldLmlkVmVuZG9yKSAmJgorCQkgICAgKGlkUHJvZHVjdCA9PSB5bGRfZGV2aWNlW2ldLmlkUHJvZHVjdCkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlzdHJ1Y3QgeWVhbGlua19kZXYgKnlsZDsKKwljaGFyIHBhdGhbNjRdOworCWludCByZXQsIHBpcGUsIGk7CisKKwlpID0gdXNiX21hdGNoKHVkZXYpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisJaWYgKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgIT0gMykKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoKHlsZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB5ZWFsaW5rX2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCh5bGQsIDAsIHNpemVvZigqeWxkKSk7CisJeWxkLT51ZGV2ID0gdWRldjsKKworCS8qIGFsbG9jYXRlIHVzYiBidWZmZXJzICovCisJeWxkLT5pcnFfZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgVVNCX1BLVF9MRU4sCisJCQkJCVNMQUJfQVRPTUlDLCAmeWxkLT5pcnFfZG1hKTsKKwlpZiAoeWxkLT5pcnFfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gdXNiX2NsZWFudXAoeWxkLCAtRU5PTUVNKTsKKworCXlsZC0+Y3RsX2RhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIFVTQl9QS1RfTEVOLAorCQkJCQlTTEFCX0FUT01JQywgJnlsZC0+Y3RsX2RtYSk7CisJaWYgKCF5bGQtPmN0bF9kYXRhKQorCQlyZXR1cm4gdXNiX2NsZWFudXAoeWxkLCAtRU5PTUVNKTsKKworCXlsZC0+Y3RsX3JlcSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgc2l6ZW9mKCooeWxkLT5jdGxfcmVxKSksCisJCQkJCVNMQUJfQVRPTUlDLCAmeWxkLT5jdGxfcmVxX2RtYSk7CisJaWYgKHlsZC0+Y3RsX3JlcSA9PSBOVUxMKQorCQlyZXR1cm4gdXNiX2NsZWFudXAoeWxkLCAtRU5PTUVNKTsKKworCS8qIGFsbG9jYXRlIHVyYiBzdHJ1Y3R1cmVzICovCisJeWxkLT51cmJfaXJxID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKHlsZC0+dXJiX2lycSA9PSBOVUxMKQorCQlyZXR1cm4gdXNiX2NsZWFudXAoeWxkLCAtRU5PTUVNKTsKKworCXlsZC0+dXJiX2N0bCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICh5bGQtPnVyYl9jdGwgPT0gTlVMTCkKKwkJcmV0dXJuIHVzYl9jbGVhbnVwKHlsZCwgLUVOT01FTSk7CisKKwkvKiBnZXQgYSBoYW5kbGUgdG8gdGhlIGludGVycnVwdCBkYXRhIHBpcGUgKi8KKwlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCXJldCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCWlmIChyZXQgIT0gVVNCX1BLVF9MRU4pCisJCWVycigiaW52YWxpZCBwYXlsb2FkIHNpemUgJWQsIGV4cGVjdGVkICVkIiwgcmV0LCBVU0JfUEtUX0xFTik7CisKKwkvKiBpbml0aWFsaXNlIGlycSB1cmIgKi8KKwl1c2JfZmlsbF9pbnRfdXJiKHlsZC0+dXJiX2lycSwgdWRldiwgcGlwZSwgeWxkLT5pcnFfZGF0YSwKKwkJCVVTQl9QS1RfTEVOLAorCQkJdXJiX2lycV9jYWxsYmFjaywKKwkJCXlsZCwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJeWxkLT51cmJfaXJxLT50cmFuc2Zlcl9kbWEgPSB5bGQtPmlycV9kbWE7CisJeWxkLT51cmJfaXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwl5bGQtPnVyYl9pcnEtPmRldiA9IHVkZXY7CisKKwkvKiBpbml0aWFsaXNlIGN0bCB1cmIgKi8KKwl5bGQtPmN0bF9yZXEtPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8CisJCQkJICAgICAgVVNCX0RJUl9PVVQ7CisJeWxkLT5jdGxfcmVxLT5iUmVxdWVzdAk9IFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT047CisJeWxkLT5jdGxfcmVxLT53VmFsdWUJPSBjcHVfdG9fbGUxNigweDIwMCk7CisJeWxkLT5jdGxfcmVxLT53SW5kZXgJPSBjcHVfdG9fbGUxNihpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisJeWxkLT5jdGxfcmVxLT53TGVuZ3RoCT0gY3B1X3RvX2xlMTYoVVNCX1BLVF9MRU4pOworCisJdXNiX2ZpbGxfY29udHJvbF91cmIoeWxkLT51cmJfY3RsLCB1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkodm9pZCAqKXlsZC0+Y3RsX3JlcSwgeWxkLT5jdGxfZGF0YSwgVVNCX1BLVF9MRU4sCisJCQl1cmJfY3RsX2NhbGxiYWNrLCB5bGQpOworCXlsZC0+dXJiX2N0bC0+c2V0dXBfZG1hCT0geWxkLT5jdGxfcmVxX2RtYTsKKwl5bGQtPnVyYl9jdGwtPnRyYW5zZmVyX2RtYQk9IHlsZC0+Y3RsX2RtYTsKKwl5bGQtPnVyYl9jdGwtPnRyYW5zZmVyX2ZsYWdzCXw9IFVSQl9OT19TRVRVUF9ETUFfTUFQIHwKKwkJCQkJVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJeWxkLT51cmJfY3RsLT5kZXYgPSB1ZGV2OworCisJLyogZmluZCBvdXQgdGhlIHBoeXNpY2FsIGJ1cyBsb2NhdGlvbiAqLworCWlmICh1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIHNpemVvZihwYXRoKSkgPiAwKQorCQlzbnByaW50Zih5bGQtPnBoeXMsIHNpemVvZih5bGQtPnBoeXMpLTEsICAiJXMvaW5wdXQwIiwgcGF0aCk7CisKKwkvKiByZWdpc3RlciBzZXR0aW5ncyBmb3IgdGhlIGlucHV0IGRldmljZSAqLworCWluaXRfaW5wdXRfZGV2KCZ5bGQtPmlkZXYpOworCXlsZC0+aWRldi5wcml2YXRlCT0geWxkOworCXlsZC0+aWRldi5pZC5idXN0eXBlCT0gQlVTX1VTQjsKKwl5bGQtPmlkZXYuaWQudmVuZG9yCT0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJeWxkLT5pZGV2LmlkLnByb2R1Y3QJPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJeWxkLT5pZGV2LmlkLnZlcnNpb24JPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisJeWxkLT5pZGV2LmRldgkJPSAmaW50Zi0+ZGV2OworCXlsZC0+aWRldi5uYW1lCQk9IHlsZF9kZXZpY2VbaV0ubmFtZTsKKwl5bGQtPmlkZXYucGh5cwkJPSB5bGQtPnBoeXM7CisJLyogeWxkLT5pZGV2LmV2ZW50CQk9IGlucHV0X2V2OwlUT0RPICovCisJeWxkLT5pZGV2Lm9wZW4JCT0gaW5wdXRfb3BlbjsKKwl5bGQtPmlkZXYuY2xvc2UJCT0gaW5wdXRfY2xvc2U7CisKKwkvKiByZWdpc3RlciBhdmFpbGFibGUga2V5IGV2ZW50cyAqLworCXlsZC0+aWRldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbnQgayA9IG1hcF9wMWtfdG9fa2V5KGkpOworCQlpZiAoayA+PSAwKSB7CisJCQlzZXRfYml0KGsgJiAweGZmLCB5bGQtPmlkZXYua2V5Yml0KTsKKwkJCWlmIChrID4+IDgpCisJCQkJc2V0X2JpdChrID4+IDgsIHlsZC0+aWRldi5rZXliaXQpOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzXG4iLCB5bGQtPmlkZXYubmFtZSwgcGF0aCk7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnlsZC0+aWRldik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHlsZCk7CisKKwkvKiBjbGVhciB2aXNpYmxlIGVsZW1lbnRzICovCisJZm9yIChpPTA7IGk8QVJSQVlfU0laRShsY2RNYXApOyBpKyspCisJCXNldENoYXIoeWxkLCBpLCAnICcpOworCisJLyogZGlzcGxheSBkcml2ZXIgdmVyc2lvbiBvbiBMQ0QgbGluZSAzICovCisJc3RvcmVfbGluZTMoJmludGYtPmRldiwgTlVMTCwKKwkJCURSSVZFUl9WRVJTSU9OLCBzaXplb2YoRFJJVkVSX1ZFUlNJT04pKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzIChkb24ndCBjYXJlIGFib3V0IGZhaWx1cmUpICovCisJc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnlsZF9hdHRyX2dyb3VwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHllYWxpbmtfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAieWVhbGluayIsCisJLnByb2JlCQk9IHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHVzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IHVzYl90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHllYWxpbmtfZGV2X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gdXNiX3JlZ2lzdGVyKCZ5ZWFsaW5rX2RyaXZlcik7CisJaWYgKHJldCA9PSAwKQorCQlpbmZvKERSSVZFUl9ERVNDICI6IiBEUklWRVJfVkVSU0lPTik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHllYWxpbmtfZGV2X2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmeWVhbGlua19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh5ZWFsaW5rX2Rldl9pbml0KTsKK21vZHVsZV9leGl0KHllYWxpbmtfZGV2X2V4aXQpOworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHVzYl90YWJsZSk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5oIGIvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWYwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBkcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGVuayBWZXJnb25ldCA8SGVuay5WZXJnb25ldEBnbWFpbC5jb20+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgSU5QVVRfWUVBTElOS19ICisjZGVmaW5lIElOUFVUX1lFQUxJTktfSAorCisvKiBVc2luZyB0aGUgY29udHJvbCBjaGFubmVsIG9uIGludGVyZmFjZSAzIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGhvbmUKKyAqIGNhbiBiZSBjb250cm9sbGVkIGxpa2UgTENELCBMRUQsIGRpYWx0b25lIGFuZCB0aGUgcmluZ3RvbmUuCisgKi8KKworc3RydWN0IHlsZF9jdGxfcGFja2V0IHsKKwl1OAljbWQ7CQkvKiBjb21tYW5kIGNvZGUsIHNlZSBiZWxvdyAqLworCXU4CXNpemU7CQkvKiAxLTExLCBzaXplIG9mIHVzZWQgZGF0YSBieXRlcy4gKi8KKwl1MTYJb2Zmc2V0OwkJLyogaW50ZXJuYWwgcGFja2V0IG9mZnNldCAqLworCXU4CWRhdGFbMTFdOworCXM4CXN1bTsJCS8qIG5lZ2F0aXZlIHN1bSBvZiAxNSBwcmVjZWRpbmcgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9QS1RfTEVOCXNpemVvZihzdHJ1Y3QgeWxkX2N0bF9wYWNrZXQpCisKKy8qIFRoZSBmb2xsb3dpbmcgeWxkX2N0bF9wYWNrZXQncyBhcmUgYXZhaWxhYmxlOiAqLworCisvKiBJbml0IHJlZ2lzdGVycworICoKKyAqIGNtZAkJMHg4ZQorICogc2l6ZQkJMTAKKyAqIG9mZnNldAkwCisgKiBkYXRhCQkwLDAsMCwwLi4uLgorICovCisjZGVmaW5lIENNRF9JTklUCQkweDhlCisKKy8qIFJlcXVlc3Qga2V5IHNjYW4KKyAqCisgKiBjbWQJCTB4ODAKKyAqIHNpemUJCTEKKyAqIG9mZnNldAkwCisgKiBkYXRhWzBdCW9uIHJldHVybiByZXR1cm5zIHRoZSBrZXkgbnVtYmVyLCBpZiBpdCBjaGFuZ2VzIHRoZXJlJ3MgYSBuZXcKKyAqIAkJa2V5IHByZXNzZWQuCisgKi8KKyNkZWZpbmUgQ01EX0tFWVBSRVNTCQkweDgwCisKKy8qIFJlcXVlc3Qgc2NhbmNvZGUKKyAqCisgKiBjbWQJCTB4ODEKKyAqIHNpemUJCTEKKyAqIG9mZnNldAlrZXkgbnVtYmVyIFswLTFmXQorICogZGF0YVswXQlvbiByZXR1cm4gcmV0dXJucyB0aGUgc2NhbmNvZGUKKyAqLworI2RlZmluZSBDTURfU0NBTkNPREUJCTB4ODEKKworLyogU2V0IExDRAorICoKKyAqIGNtZAkJMHgwNAorICogc2l6ZQkJMS0xMQorICogb2Zmc2V0CTAtMjMKKyAqIGRhdGEJCXNlZ21lbnQgYml0cworICovCisjZGVmaW5lIENNRF9MQ0QJCQkweDA0CisKKy8qIFNldCBsZWQKKyAqCisgKiBjbWQJCTB4MDUKKyAqIHNpemUJCTEKKyAqIG9mZnNldAkwCisgKiBkYXRhWzBdCTAgT0ZGIC8gMSBPTgorICovCisjZGVmaW5lIENNRF9MRUQJCQkweDA1CisKKy8qIFNldCByaW5ndG9uZSB2b2x1bWUKKyAqCisgKiBjbWQJCTB4MTEKKyAqIHNpemUJCTEKKyAqIG9mZnNldAkwCisgKiBkYXRhWzBdCTAtMHhmZiAgdm9sdW1lCisgKi8KKyNkZWZpbmUgQ01EX1JJTkdfVk9MVU1FCQkweDExCisKKy8qIFNldCByaW5ndG9uZSBub3RlcworICoKKyAqIGNtZAkJMHgwMgorICogc2l6ZQkJMS0xMQorICogb2Zmc2V0CTAtPgorICogZGF0YQkJYmluYXJ5IHJlcHJlc2VudGF0aW9uIExFMTYoLWZyZXEpLCBMRTE2KGR1cmF0aW9uKSAuLi4uCisgKi8KKyNkZWZpbmUgQ01EX1JJTkdfTk9URQkJMHgwMgorCisvKiBTb3VuZCByaW5ndG9uZSB2aWEgdGhlIHNwZWFrZXIgb24gdGhlIGJhY2sKKyAqCisgKiBjbWQJCTB4MDMKKyAqIHNpemUJCTEKKyAqIG9mZnNldAkwCisgKiBkYXRhWzBdCTAgT0ZGIC8gMHgyNCBPTgorICovCisjZGVmaW5lIENNRF9SSU5HVE9ORQkJMHgwMworCisvKiBTb3VuZCBkaWFsIHRvbmUgdmlhIHRoZSBlYXIgc3BlYWtlcgorICoKKyAqIGNtZAkJMHgwOQorICogc2l6ZQkJMQorICogb2Zmc2V0CTAKKyAqIGRhdGFbMF0JMCBPRkYgLyAxIE9OCisgKi8KKyNkZWZpbmUgQ01EX0RJQUxUT05FCQkweDA5CisKKyNlbmRpZiAvKiBJTlBVVF9ZRUFMSU5LX0ggKi8KKworCisjaWYgZGVmaW5lZChfU0VHKSAmJiBkZWZpbmVkKF9QSUMpCisvKiBUaGlzIHRhYmxlIG1hcHMgdGhlIExDRCBzZWdtZW50cyBvbnRvIGluZGl2aWR1YWwgYml0IHBvc2l0aW9ucyBpbiB0aGUKKyAqIHlsZF9zdGF0dXMgc3RydWN0LgorICovCisKKy8qIExDRCwgZWFjaCBzZWdtZW50IG11c3QgYmUgZHJpdmVuIHNlcGVyYXRlbHkuCisgKgorICogTGF5b3V0OgorICoKKyAqICAgfFtdICAgW11bXSAgIFtdW10gICBbXVtdICAgaW4gICB8W11bXQorICogICB8W10gTSBbXVtdIEQgW11bXSA6IFtdW10gICBvdXQgIHxbXVtdCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUKKyAqCisgKiAgICBORVcgUkVQICAgICAgICAgU1UgTU8gVFUgV0UgVEggRlIgU0EKKyAqCisgKiAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXQorICogICAgW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10KKyAqLworCisvKiBMaW5lIDEKKyAqCUZvcm1hdAkJOiAxOC5lOC5NOC44OC4uLjE4OAorICoJSWNvbiBuYW1lcwk6IE0gRCA6IElOIE9VVCBTVE9SRQorICovCisjZGVmaW5lIExDRF9MSU5FMV9PRkZTRVQJMAorI2RlZmluZSBMQ0RfTElORTFfU0laRQkJMTcKKworLyogTm90ZTogZmlyc3QgZyB0aGVuIGYgPT4JCQkgICAgICAgISAgICAgICEgICAgICAqLworLyogX1NFRyggICAgdHlwZSAgICBhICAgICAgYiAgICAgIGMgICAgICBkICAgICAgZSAgICAgIGcgICAgICBmICAgKSAgKi8KKwlfU0VHKCcxJywgIDAsMCAsIDIyLDIgLCAyMiwyICwgIDAsMCAsICAwLDAgLCAgMCwwICwgIDAsMAkpLAorCV9TRUcoJzgnLCAyMCwxICwgMjAsMiAsIDIwLDQgLCAyMCw4ICwgMjEsNCAsIDIxLDIgLCAyMSwxCSksCisJX1BJQygnLicsIDIyLDEgLCAiTSIJCQkJCQkpLAorCV9TRUcoJ2UnLCAxOCwxICwgMTgsMiAsIDE4LDQgLCAxOCwxICwgMTksMiAsIDE4LDEgLCAxOSwxCSksCisJX1NFRygnOCcsIDE2LDEgLCAxNiwyICwgMTYsNCAsIDE2LDggLCAxNyw0ICwgMTcsMiAsIDE3LDEJKSwKKwlfUElDKCcuJywgMTUsOCAsICJEIgkJCQkJCSksCisJX1NFRygnTScsIDE0LDEgLCAxNCwyICwgMTQsNCAsIDE0LDEgLCAxNSw0ICwgMTUsMiAsIDE1LDEJKSwKKwlfU0VHKCc4JywgMTIsMSAsIDEyLDIgLCAxMiw0ICwgMTIsOCAsIDEzLDQgLCAxMywyICwgMTMsMQkpLAorCV9QSUMoJy4nLCAxMSw4ICwgIjoiCQkJCQkJKSwKKwlfU0VHKCc4JywgMTAsMSAsIDEwLDIgLCAxMCw0ICwgMTAsOCAsIDExLDQgLCAxMSwyICwgMTEsMQkpLAorCV9TRUcoJzgnLCAgOCwxICwgIDgsMiAsICA4LDQgLCAgOCw4ICwgIDksNCAsICA5LDIgLCAgOSwxCSksCisJX1BJQygnLicsICA3LDEgLCAiSU4iCQkJCQkJKSwKKwlfUElDKCcuJywgIDcsMiAsICJPVVQiCQkJCQkJKSwKKwlfUElDKCcuJywgIDcsNCAsICJTVE9SRSIJCQkJCSksCisJX1NFRygnMScsICAwLDAgLCAgNSwxICwgIDUsMSAsICAwLDAgLCAgMCwwICwgIDAsMCAsICAwLDAJKSwKKwlfU0VHKCc4JywgIDQsMSAsICA0LDIgLCAgNCw0ICwgIDQsOCAsICA1LDggLCAgNSw0ICwgIDUsMgkpLAorCV9TRUcoJzgnLCAgMiwxICwgIDIsMiAsICAyLDQgLCAgMiw4ICwgIDMsNCAsICAzLDIgLCAgMywxCSksCisKKy8qIExpbmUgMgorICoJRm9ybWF0CQk6IC4uLi4uLi4uLgorICoJUGljdC4gbmFtZQk6IE5FVyBSRVAgU1UgTU8gVFUgV0UgVEggRlIgU0EKKyAqLworI2RlZmluZSBMQ0RfTElORTJfT0ZGU0VUCUxDRF9MSU5FMV9PRkZTRVQgKyBMQ0RfTElORTFfU0laRQorI2RlZmluZSBMQ0RfTElORTJfU0laRQkJOQorCisJX1BJQygnLicsIDIzLDIgLCAiTkVXIgkpLAorCV9QSUMoJy4nLCAyMyw0ICwgIlJFUCIJKSwKKwlfUElDKCcuJywgIDEsOCAsICJTVSIJKSwKKwlfUElDKCcuJywgIDEsNCAsICJNTyIJKSwKKwlfUElDKCcuJywgIDEsMiAsICJUVSIJKSwKKwlfUElDKCcuJywgIDEsMSAsICJXRSIJKSwKKwlfUElDKCcuJywgIDAsMSAsICJUSCIJKSwKKwlfUElDKCcuJywgIDAsMiAsICJGUiIJKSwKKwlfUElDKCcuJywgIDAsNCAsICJTQSIJKSwKKworLyogTGluZSAzCisgKglGb3JtYXQJCTogODg4ODg4ODg4ODg4CisgKi8KKyNkZWZpbmUgTENEX0xJTkUzX09GRlNFVAlMQ0RfTElORTJfT0ZGU0VUICsgTENEX0xJTkUyX1NJWkUKKyNkZWZpbmUgTENEX0xJTkUzX1NJWkUJCTEyCisKKwlfU0VHKCc4JywgMjIsMTYsIDIyLDMyLCAyMiw2NCwgMjIsMTI4LCAyMywxMjgsIDIzLDY0LCAyMywzMiAgKSwKKwlfU0VHKCc4JywgMjAsMTYsIDIwLDMyLCAyMCw2NCwgMjAsMTI4LCAyMSwxMjgsIDIxLDY0LCAyMSwzMiAgKSwKKwlfU0VHKCc4JywgMTgsMTYsIDE4LDMyLCAxOCw2NCwgMTgsMTI4LCAxOSwxMjgsIDE5LDY0LCAxOSwzMiAgKSwKKwlfU0VHKCc4JywgMTYsMTYsIDE2LDMyLCAxNiw2NCwgMTYsMTI4LCAxNywxMjgsIDE3LDY0LCAxNywzMiAgKSwKKwlfU0VHKCc4JywgMTQsMTYsIDE0LDMyLCAxNCw2NCwgMTQsMTI4LCAxNSwxMjgsIDE1LDY0LCAxNSwzMiAgKSwKKwlfU0VHKCc4JywgMTIsMTYsIDEyLDMyLCAxMiw2NCwgMTIsMTI4LCAxMywxMjgsIDEzLDY0LCAxMywzMiAgKSwKKwlfU0VHKCc4JywgMTAsMTYsIDEwLDMyLCAxMCw2NCwgMTAsMTI4LCAxMSwxMjgsIDExLDY0LCAxMSwzMiAgKSwKKwlfU0VHKCc4JywgIDgsMTYsICA4LDMyLCAgOCw2NCwgIDgsMTI4LCAgOSwxMjgsICA5LDY0LCAgOSwzMiAgKSwKKwlfU0VHKCc4JywgIDYsMTYsICA2LDMyLCAgNiw2NCwgIDYsMTI4LCAgNywxMjgsICA3LDY0LCAgNywzMiAgKSwKKwlfU0VHKCc4JywgIDQsMTYsICA0LDMyLCAgNCw2NCwgIDQsMTI4LCAgNSwxMjgsICA1LDY0LCAgNSwzMiAgKSwKKwlfU0VHKCc4JywgIDIsMTYsICAyLDMyLCAgMiw2NCwgIDIsMTI4LCAgMywxMjgsICAzLDY0LCAgMywzMiAgKSwKKwlfU0VHKCc4JywgIDAsMTYsICAwLDMyLCAgMCw2NCwgIDAsMTI4LCAgMSwxMjgsICAxLDY0LCAgMSwzMiAgKSwKKworLyogTGluZSA0CisgKgorICogVGhlIExFRCwgRElBTFRPTkUgYW5kIFJJTkdUT05FIGFyZSBpbXBsZW1lbnRlZCBhcyBpY29ucyBhbmQgdXNlIHRoZSBzYW1lCisgKiBzeXNmcyBpbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgTENEX0xJTkU0X09GRlNFVAlMQ0RfTElORTNfT0ZGU0VUICsgTENEX0xJTkUzX1NJWkUKKworCV9QSUMoJy4nLCBvZmZzZXRvZihzdHJ1Y3QgeWxkX3N0YXR1cywgbGVkKQksIDB4MDEsICJMRUQiICksCisJX1BJQygnLicsIG9mZnNldG9mKHN0cnVjdCB5bGRfc3RhdHVzLCBkaWFsdG9uZSkgLCAweDAxLCAiRElBTFRPTkUiICksCisJX1BJQygnLicsIG9mZnNldG9mKHN0cnVjdCB5bGRfc3RhdHVzLCByaW5ndG9uZSkgLCAweDI0LCAiUklOR1RPTkUiICksCisKKyN1bmRlZiBfU0VHCisjdW5kZWYgX1BJQworI2VuZGlmIC8qIF9TRUcgJiYgX1BJQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwppbmRleCA3Mzk4YTdmLi4wZmQwZmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJCQlQREVCVUcgKDAsICJTVFYoaSk6IENhbWVyYSBzZXQgdG8gb3JpZ2luYWwgcmVzb2x1dGlvbiIpOwogCX0KIAkvKiBvcmlnTW9kZSAqLwotCWtmcmVlIChidWYpOworCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTI3Niw3ICsyNzYsNyBAQAogCX0KIAogCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChkZXYsIDEsIDAsIDApKSA8IDApIHsKLQkJa2ZyZWUgKGJ1Zik7CisJCWtmcmVlKGJ1Zik7CiAJCXJldHVybiBpOwogCX0KIApAQCAtMzAxLDEzICszMDEsMTMgQEAKIAlnb3RvIGV4aXQ7CiAKIGVycm9yOgotCWtmcmVlIChidWYpOworCWtmcmVlKGJ1Zik7CiAJaWYgKHN0b3BfdmlkZW8gPT0gMSkKIAkJc3R2X3N0b3BfdmlkZW8gKGRldik7CiAJcmV0dXJuIC0xOwogCiBleGl0OgotCWtmcmVlIChidWYpOworCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyNyw3ICszMjcsNyBAQAogCiAJLyogc2V0IGNvbmZpZyAxLCBpbnRlcmZhY2UgMCwgYWx0ZXJuYXRlIDAgKi8KIAlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoc3R2NjgwLCAxLCAwLCAwKSkgPCAwKSB7Ci0JCWtmcmVlIChidWZmZXIpOworCQlrZnJlZShidWZmZXIpOwogCQlQREVCVUcgKDAsICJTVFYoZSk6IHNldCBjb25maWcgMSwwLDAgZmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC00MzUsMTEgKzQzNSwxMSBAQAogZXJyb3I6CiAJaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4ODAsIDAsIGJ1ZmZlciwgMHgwMik7CS8qIEdldCBMYXN0IEVycm9yICovCiAJUERFQlVHICgxLCAiU1RWKGkpOiBsYXN0IGVycm9yOiAlaSwgIGNvbW1hbmQgPSAweCV4IiwgYnVmZmVyWzBdLCBidWZmZXJbMV0pOwotCWtmcmVlIChidWZmZXIpOworCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIC0xOwogCiBleGl0OgotCWtmcmVlIChidWZmZXIpOworCWtmcmVlKGJ1ZmZlcik7CiAKIAkvKiB2aWRlbyA9IDMyMHgyNDAsIDM1MngyODggKi8KIAlpZiAoc3R2NjgwLT5DSUYgPT0gMSkgewpAQCAtNzA4LDEwICs3MDgsMTAgQEAKIAkJCXVzYl9raWxsX3VyYiAoc3R2NjgwLT51cmJbaV0pOwogCQkJdXNiX2ZyZWVfdXJiIChzdHY2ODAtPnVyYltpXSk7CiAJCQlzdHY2ODAtPnVyYltpXSA9IE5VTEw7Ci0JCQlrZnJlZSAoc3R2NjgwLT5zYnVmW2ldLmRhdGEpOworCQkJa2ZyZWUoc3R2NjgwLT5zYnVmW2ldLmRhdGEpOwogCQl9CiAJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQ1JBVENIOyBpKyspIHsKLQkJa2ZyZWUgKHN0djY4MC0+c2NyYXRjaFtpXS5kYXRhKTsKKwkJa2ZyZWUoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEpOwogCQlzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9IE5VTEw7CiAJfQogCkBAIC0xMDY4LDcgKzEwNjgsNyBAQAogCXN0djY4MC0+dXNlciA9IDA7CiAKIAlpZiAoc3R2NjgwLT5yZW1vdmVkKSB7Ci0JCWtmcmVlIChzdHY2ODApOworCQlrZnJlZShzdHY2ODApOwogCQlzdHY2ODAgPSBOVUxMOwogCQlQREVCVUcgKDAsICJTVFYoaSk6IGRldmljZSB1bnJlZ2lzdGVyZWQiKTsKIAl9CkBAIC0xNDQ1LDE0ICsxNDQ1LDE0IEBACiAJCQl1c2Jfa2lsbF91cmIgKHN0djY4MC0+dXJiW2ldKTsKIAkJCXVzYl9mcmVlX3VyYiAoc3R2NjgwLT51cmJbaV0pOwogCQkJc3R2NjgwLT51cmJbaV0gPSBOVUxMOwotCQkJa2ZyZWUgKHN0djY4MC0+c2J1ZltpXS5kYXRhKTsKKwkJCWtmcmVlKHN0djY4MC0+c2J1ZltpXS5kYXRhKTsKIAkJfQogCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0NSQVRDSDsgaSsrKQotCQlrZnJlZSAoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEpOworCQlrZnJlZShzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7CiAJUERFQlVHICgwLCAiU1RWKGkpOiAlcyBkaXNjb25uZWN0ZWQiLCBzdHY2ODAtPmNhbWVyYV9uYW1lKTsKIAogCS8qIEZyZWUgdGhlIG1lbW9yeSAqLwotCWtmcmVlIChzdHY2ODApOworCWtmcmVlKHN0djY4MCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0djY4MF9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMgYi9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCmluZGV4IDZmNzk5NGYuLmFlNDY4MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAKIC8qIGNhbmNlbCBhbiB1cmIgd2hpY2ggaXMgc3VibWl0dGVkIHRvIHRoZSBjaGFpbgogICAgdGhlIHJlc3VsdCBpcyAwIGlmIHRoZSB1cmIgaXMgY2FuY2VsbGVkLCBvciAtRUlOUFJPR1JFU1MgaWYKLSAgIFVSQl9BU1lOQ19VTkxJTksgaXMgc2V0IGFuZCB0aGUgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgICB0aGUgZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCiAqLwogc3RhdGljIGludCBhdWVyY2hhaW5fdW5saW5rX3VyYiAocGF1ZXJjaGFpbl90IGFjcCwgc3RydWN0IHVyYiAqIHVyYikKIHsKQEAgLTUxNSw3ICs1MTUsNiBAQAogICAgICAgICBhY2VwID0gYWNwLT5hY3RpdmU7CiAgICAgICAgIGlmIChhY2VwKSB7CiAgICAgICAgICAgICAgICAgdXJicCA9IGFjZXAtPnVyYnA7Ci0gICAgICAgICAgICAgICAgdXJicC0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAgICAgICAgICAgICAgICAgZGJnICgidW5saW5rIGFjdGl2ZSB1cmIiKTsKICAgICAgICAgICAgICAgICB1c2Jfa2lsbF91cmIgKHVyYnApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKaW5kZXggYWQxNzg5Mi4uN2U5M2FjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJYWN0dWFsX2J1ZmZlciA9IChzaXplX3QqKShkZXYtPnJpbmdfYnVmZmVyICsgZGV2LT5yaW5nX3RhaWwqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpKTsKIAlieXRlc190b19yZWFkID0gbWluKGNvdW50LCAqYWN0dWFsX2J1ZmZlcik7CiAJaWYgKGJ5dGVzX3RvX3JlYWQgPCAqYWN0dWFsX2J1ZmZlcikKLQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiUmVhZCBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIlJlYWQgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIiwKIAkJCSAqYWN0dWFsX2J1ZmZlci1ieXRlc190b19yZWFkKTsKIAogCS8qIGNvcHkgb25lIGludGVycnVwdF9pbl9idWZmZXIgZnJvbSByaW5nX2J1ZmZlciBpbnRvIHVzZXJzcGFjZSAqLwpAQCAtNTI4LDggKzUyOCw4IEBACiAJLyogd3JpdGUgdGhlIGRhdGEgaW50byBpbnRlcnJ1cHRfb3V0X2J1ZmZlciBmcm9tIHVzZXJzcGFjZSAqLwogCWJ5dGVzX3RvX3dyaXRlID0gbWluKGNvdW50LCB3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSk7CiAJaWYgKGJ5dGVzX3RvX3dyaXRlIDwgY291bnQpCi0JCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIldyaXRlIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7Ci0JZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJWQsIGJ5dGVzX3RvX3dyaXRlID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19GVU5DVElPTl9fLCBjb3VudCwgYnl0ZXNfdG9fd3JpdGUpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpKSB7CiAJCXJldHZhbCA9IC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCmluZGV4IDJmZDEyMjYuLmQ2M2NlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNpc3VzYi0+c2lzdXNiX2RldiwgcGlwZSwgZGF0YSwgbGVuLAogCQlzaXN1c2JfYnVsa19jb21wbGV0ZW91dCwgJnNpc3VzYi0+dXJib3V0X2NvbnRleHRbaW5kZXhdKTsKIAotCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gKHRmbGFncyB8IFVSQl9BU1lOQ19VTkxJTkspOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gdGZsYWdzOwogCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAKIAlpZiAoKHVyYi0+dHJhbnNmZXJfZG1hID0gdHJhbnNmZXJfZG1hKSkKQEAgLTI5NSw3ICsyOTUsNyBAQAogCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2lzdXNiLT5zaXN1c2JfZGV2LCBwaXBlLCBkYXRhLCBsZW4sCiAJCQlzaXN1c2JfYnVsa19jb21wbGV0ZWluLCBzaXN1c2IpOwogCi0JdXJiLT50cmFuc2Zlcl9mbGFncyB8PSAodGZsYWdzIHwgVVJCX0FTWU5DX1VOTElOSyk7CisJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSB0ZmxhZ3M7CiAJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAogCWlmICgodXJiLT50cmFuc2Zlcl9kbWEgPSB0cmFuc2Zlcl9kbWEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwppbmRleCBmZDdmYjk4Li41NDc5OWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwpAQCAtOTg2LDcgKzk4Niw2IEBACiAKIAkJdS0+Y29udGV4dCA9ICZjb250ZXh0OwogCQl1LT5jb21wbGV0ZSA9IGN0cmxfY29tcGxldGU7Ci0JCXUtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJfQogCiAJLyogcXVldWUgdGhlIHVyYnMgKi8KQEAgLTEwNTIsNyArMTA1MSw2IEBACiAJdXJiID0gc2ltcGxlX2FsbG9jX3VyYiAodGVzdGRldl90b191c2JkZXYgKGRldiksIHBpcGUsIHNpemUpOwogCWlmICghdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJdXJiLT5jb250ZXh0ID0gJmNvbXBsZXRpb247CiAJdXJiLT5jb21wbGV0ZSA9IHVubGluazFfY2FsbGJhY2s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQppbmRleCBiMDAxNWI4Li4zY2YzZWEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIFVTQiBDb3JlIGZpbGVzIGFuZCBmaWxlc3lzdGVtCiAjCiAKLXVzYm1vbi1vYmpzCTo9IG1vbl9tYWluLm8gbW9uX3N0YXQubyBtb25fdGV4dC5vCit1c2Jtb24tb2Jqcwk6PSBtb25fbWFpbi5vIG1vbl9zdGF0Lm8gbW9uX3RleHQubyBtb25fZG1hLm8KIAogIyBUaGlzIGRvZXMgbm90IHVzZSBDT05GSUdfVVNCX01PTiBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byB1c2UgYSB0cmlzdGF0ZS4KIG9iai0kKENPTkZJR19VU0IpCSs9IHVzYm1vbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2RtYS5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTEzNjdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl9kbWEuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogVGhlIFVTQiBNb25pdG9yLCBpbnNwaXJlZCBieSBEYXZlIEhhcmRpbmcncyBVU0JNb24uCisgKgorICogbW9uX2RtYS5jOiBMaWJyYXJ5IHdoaWNoIHNub29wcyBvbiBETUEgYXJlYXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBldGUgWmFpdGNldiAoemFpdGNldkByZWRoYXQuY29tKQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CS8qIE9ubHkgbmVlZGVkIGZvciBkZWNsYXJhdGlvbnMgaW4gdXNiX21vbi5oICovCisjaW5jbHVkZSAidXNiX21vbi5oIgorCisjaWZkZWYgX19pMzg2X18JCS8qIENPTkZJR19BUkNIX0kzODYgZG9lcyBub3QgZXhpdCAqLworI2RlZmluZSBNT05fSEFTX1VOTUFQIDEKKworI2RlZmluZSBwaHlzX3RvX3BhZ2UocGh5cykJcGZuX3RvX3BhZ2UoKHBoeXMpID4+IFBBR0VfU0hJRlQpCisKK2NoYXIgbW9uX2RtYXBlZWsodW5zaWduZWQgY2hhciAqZHN0LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgKm1hcDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwkvKgorCSAqIE9uIGkzODYsIGEgRE1BIGhhbmRsZSBpcyB0aGUgInBoeXNpY2FsIiBhZGRyZXNzIG9mIGEgcGFnZS4KKwkgKiBJbiBvdGhlciB3b3JkcywgdGhlIGJ1cyBhZGRyZXNzIGlzIGVxdWFsIHRvIHBoeXNpY2FsIGFkZHJlc3MuCisJICogVGhlcmUgaXMgbm8gSU9NTVUuCisJICovCisJcGcgPSBwaHlzX3RvX3BhZ2UoZG1hX2FkZHIpOworCisJLyoKKwkgKiBXZSBhcmUgY2FsbGVkIGZyb20gaGFyZHdhcmUgSVJRcyBpbiBjYXNlIG9mIGNhbGxiYWNrcy4KKwkgKiBCdXQgd2UgY2FuIGJlIGNhbGxlZCBmcm9tIHNvZnRpcnEgb3IgcHJvY2VzcyBjb250ZXh0IGluIGNhc2UKKwkgKiBvZiBzdWJtaXNzaW9ucy4gSW4gc3VjaCBjYXNlLCB3ZSBuZWVkIHRvIHByb3RlY3QgS01fSVJRMC4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbWFwID0ga21hcF9hdG9taWMocGcsIEtNX0lSUTApOworCXB0ciA9IG1hcCArIChkbWFfYWRkciAmIChQQUdFX1NJWkUtMSkpOworCW1lbWNweShkc3QsIHB0ciwgbGVuKTsKKwlrdW5tYXBfYXRvbWljKG1hcCwgS01fSVJRMCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIF9faTM4Nl9fICovCisKKyNpZm5kZWYgTU9OX0hBU19VTk1BUAorY2hhciBtb25fZG1hcGVlayh1bnNpZ25lZCBjaGFyICpkc3QsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIGludCBsZW4pCit7CisJcmV0dXJuICdEJzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCAyNjI2NmIzMC4uNDE3NDY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTkxLDI1ICs5MSwxMSBAQAogICAgIGludCBsZW4sIGNoYXIgZXZfdHlwZSkKIHsKIAlpbnQgcGlwZSA9IHVyYi0+cGlwZTsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCi0JLyoKLQkgKiBUaGUgY2hlY2sgdG8gc2VlIGlmIGl0J3Mgc2FmZSB0byBwb2tlIGF0IGRhdGEgaGFzIGFuIGVub3Jtb3VzCi0JICogbnVtYmVyIG9mIGNvcm5lciBjYXNlcywgYnV0IGl0IHNlZW1zIHRoYXQgdGhlIGZvbGxvd2luZyBpcwotCSAqIG1vcmUgb3IgbGVzcyBzYWZlLgotCSAqCi0JICogV2UgZG8gbm90IGV2ZW4gdHJ5IHRvIGxvb2sgdHJhbnNmZXJfYnVmZmVyLCBiZWNhdXNlIGl0IGNhbgotCSAqIGNvbnRhaW4gbm9uLU5VTEwgZ2FyYmFnZSBpbiBjYXNlIHRoZSB1cHBlciBsZXZlbCBwcm9taXNlZCB0bwotCSAqIHNldCBETUEgZm9yIHRoZSBIQ0QuCi0JICovCi0JaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCkKLQkJcmV0dXJuICdEJzsKIAogCWlmIChsZW4gPD0gMCkKIAkJcmV0dXJuICdMJzsKLQotCWlmICgoZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyKSA9PSBOVUxMKQotCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KKwlpZiAobGVuID49IERBVEFfTUFYKQorCQlsZW4gPSBEQVRBX01BWDsKIAogCS8qCiAJICogQnVsayBpcyBlYXN5IHRvIHNob3J0Y3V0IHJlbGlhYmx5LiAKQEAgLTEyNiw4ICsxMTIsMjEgQEAKIAkJfQogCX0KIAotCWlmIChsZW4gPj0gREFUQV9NQVgpCi0JCWxlbiA9IERBVEFfTUFYOworCS8qCisJICogVGhlIGNoZWNrIHRvIHNlZSBpZiBpdCdzIHNhZmUgdG8gcG9rZSBhdCBkYXRhIGhhcyBhbiBlbm9ybW91cworCSAqIG51bWJlciBvZiBjb3JuZXIgY2FzZXMsIGJ1dCBpdCBzZWVtcyB0aGF0IHRoZSBmb2xsb3dpbmcgaXMKKwkgKiBtb3JlIG9yIGxlc3Mgc2FmZS4KKwkgKgorCSAqIFdlIGRvIG5vdCBldmVuIHRyeSB0byBsb29rIHRyYW5zZmVyX2J1ZmZlciwgYmVjYXVzZSBpdCBjYW4KKwkgKiBjb250YWluIG5vbi1OVUxMIGdhcmJhZ2UgaW4gY2FzZSB0aGUgdXBwZXIgbGV2ZWwgcHJvbWlzZWQgdG8KKwkgKiBzZXQgRE1BIGZvciB0aGUgSENELgorCSAqLworCWlmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVApCisJCXJldHVybiBtb25fZG1hcGVlayhlcC0+ZGF0YSwgdXJiLT50cmFuc2Zlcl9kbWEsIGxlbik7CisKKwlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuICdaJzsJLyogJzAnIHdvdWxkIGJlIG5vdCBhcyBwcmV0dHkuICovCisKIAltZW1jcHkoZXAtPmRhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBsZW4pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL3VzYl9tb24uaCBiL2RyaXZlcnMvdXNiL21vbi91c2JfbW9uLmgKaW5kZXggOWIwNjc4NC4uNGJlMGY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL3VzYl9tb24uaAorKysgYi9kcml2ZXJzL3VzYi9tb24vdXNiX21vbi5oCkBAIC00NSw2ICs0NSwxMCBAQAogdm9pZCBtb25fcmVhZGVyX2FkZChzdHJ1Y3QgbW9uX2J1cyAqbWJ1cywgc3RydWN0IG1vbl9yZWFkZXIgKnIpOwogdm9pZCBtb25fcmVhZGVyX2RlbChzdHJ1Y3QgbW9uX2J1cyAqbWJ1cywgc3RydWN0IG1vbl9yZWFkZXIgKnIpOwogCisvKgorICovCitleHRlcm4gY2hhciBtb25fZG1hcGVlayh1bnNpZ25lZCBjaGFyICpkc3QsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIGludCBsZW4pOworCiBleHRlcm4gc3RydWN0IHNlbWFwaG9yZSBtb25fbG9jazsKIAogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW9uX2ZvcHNfdGV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9LY29uZmlnIGIvZHJpdmVycy91c2IvbmV0L0tjb25maWcKaW5kZXggYjEwNDQzMC4uOGMwMTBiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbmV0L0tjb25maWcKQEAgLTk5LDcgKzk5LDcgQEAKIAkgIHdpdGggIm1pbmlkcml2ZXJzIiBidWlsdCBhcm91bmQgYSBjb21tb24gbmV0d29yayBkcml2ZXIgY29yZQogCSAgdGhhdCBzdXBwb3J0cyBkZWVwIHF1ZXVlcyBmb3IgZWZmaWNpZW50IHRyYW5zZmVycy4gIChUaGlzIGdpdmVzCiAJICBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBzbWFsbCBwYWNrZXRzIGFuZCBhdCBoaWdoIHNwZWVkcykuCi0JICAKKwogCSAgVGhlIFVTQiBob3N0IHJ1bnMgInVzYm5ldCIsIGFuZCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBsaW5rIG1pZ2h0IGJlOgogCiAJICAtIEFub3RoZXIgVVNCIGhvc3QsIHdoZW4gdXNpbmcgVVNCICJuZXR3b3JrIiBvciAiZGF0YSB0cmFuc2ZlciIKQEAgLTEyNSwzOCArMTI1LDYzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2JuZXQuCiAKLWNvbW1lbnQgIlVTQiBIb3N0LXRvLUhvc3QgQ2FibGVzIgotCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorY29uZmlnIFVTQl9ORVRfQVg4ODE3WAorCXRyaXN0YXRlICJBU0lYIEFYODh4eHggQmFzZWQgVVNCIDIuMCBFdGhlcm5ldCBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIFVTQl9VU0JORVQgJiYgTkVUX0VUSEVSTkVUCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgQVNJWCBBWDg4eHh4IGJhc2VkIFVTQiAyLjAKKwkgIDEwLzEwMCBFdGhlcm5ldCBhZGFwdGVycy4KIAotY29uZmlnIFVTQl9BTElfTTU2MzIKLQlib29sZWFuICJBTGkgTTU2MzIgYmFzZWQgJ1VTQiAyLjAgRGF0YSBMaW5rJyBjYWJsZXMiCisgCSAgVGhpcyBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIGRldmljZXM6CisJICAgICogQXRlbiBVQzIxMFQKKwkgICAgKiBBU0lYIEFYODgxNzIKKwkgICAgKiBCaWxsaW9udG9uIFN5c3RlbXMsIFVTQjJBUgorCSAgICAqIEJ1ZmZhbG8gTFVBLVUyLUtUWAorCSAgICAqIENvcmVnYSBGRXRoZXIgVVNCMi1UWAorCSAgICAqIEQtTGluayBEVUItRTEwMAorCSAgICAqIEhhd2tpbmcgVUYyMDAKKwkgICAgKiBMaW5rc3lzIFVTQjIwME0KKwkgICAgKiBOZXRnZWFyIEZBMTIwCisJICAgICogU2l0ZWNvbSBMTi0wMjkKKwkgICAgKiBJbnRlbGxpbmV0IFVTQiAyLjAgRXRoZXJuZXQKKwkgICAgKiBTVCBMYWIgVVNCIDIuMCBFdGhlcm5ldAorCSAgICAqIFRyZW5kTmV0IFRVMi1FVDEwMAorCisJICBUaGlzIGRyaXZlciBjcmVhdGVzIGFuIGludGVyZmFjZSBuYW1lZCAiZXRoWCIsIHdoZXJlIFggZGVwZW5kcyBvbgorCSAgd2hhdCBvdGhlciBuZXR3b3JraW5nIGRldmljZXMgeW91IGhhdmUgaW4gdXNlLgorCisKK2NvbmZpZyBVU0JfTkVUX0NEQ0VUSEVSCisJdHJpc3RhdGUgIkNEQyBFdGhlcm5ldCBzdXBwb3J0IChzbWFydCBkZXZpY2VzIHN1Y2ggYXMgY2FibGUgbW9kZW1zKSIKIAlkZXBlbmRzIG9uIFVTQl9VU0JORVQKIAlkZWZhdWx0IHkKIAloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCi0JICBiYXNlZCBvbiB0aGlzIGRlc2lnbiwgd2hpY2ggc3VwcG9ydHMgVVNCIDIuMCBoaWdoIHNwZWVkLgorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgZGV2aWNlcyBjb25mb3JtaW5nIHRvIHRoZSBDb21tdW5pY2F0aW9uIERldmljZQorCSAgQ2xhc3MgKENEQykgRXRoZXJuZXQgQ29udHJvbCBNb2RlbCwgYSBzcGVjaWZpY2F0aW9uIHRoYXQncyBlYXN5IHRvCisJICBpbXBsZW1lbnQgaW4gZGV2aWNlIGZpcm13YXJlLiAgVGhlIENEQyBzcGVjaWZpY2F0aW9ucyBhcmUgYXZhaWxhYmxlCisJICBmcm9tIDxodHRwOi8vd3d3LnVzYi5vcmcvPi4KIAotY29uZmlnIFVTQl9BTjI3MjAKLQlib29sZWFuICJBbmNob3JDaGlwcyAyNzIwIGJhc2VkIGNhYmxlcyAoWGlyY29tIFBHVU5FVCwgLi4uKSIKLQlkZXBlbmRzIG9uIFVTQl9VU0JORVQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCi0JICBiYXNlZCBvbiB0aGlzIGRlc2lnbi4gIE5vdGUgdGhhdCBBbmNob3JDaGlwcyBpcyBub3cgYQotCSAgQ3lwcmVzcyBicmFuZC4KKwkgIENEQyBFdGhlcm5ldCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvcHRpb24gZm9yIERPQ1NJUyBjYWJsZSBtb2RlbXMKKwkgIHRoYXQgc3VwcG9ydCBVU0IgY29ubmVjdGl2aXR5LCB1c2VkIGZvciBub24tTWljcm9zb2Z0IFVTQiBob3N0cy4KKwkgIFRoZSBMaW51eC1VU0IgQ0RDIEV0aGVybmV0IEdhZGdldCBkcml2ZXIgaXMgYW4gb3BlbiBpbXBsZW1lbnRhdGlvbi4KKyAJICBUaGlzIGRyaXZlciBzaG91bGQgd29yayB3aXRoIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKIAotY29uZmlnIFVTQl9CRUxLSU4KLQlib29sZWFuICJlVEVLIGJhc2VkIGhvc3QtdG8taG9zdCBjYWJsZXMgKEFkdmFuY2UsIEJlbGtpbiwgLi4uKSIKLQlkZXBlbmRzIG9uIFVTQl9VU0JORVQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlCi0JICBiYXNlZCBvbiB0aGlzIGRlc2lnbjogIHR3byBOZXRDaGlwIDI4OTAgY2hpcHMgYW5kIGFuIEF0bWVsCi0JICBtaWNyb2NvbnRyb2xsZXIsIHdpdGggTEVEcyB0aGF0IGluZGljYXRlIHRyYWZmaWMuCisgCSAgICAqIEVyaWNzc29uIFBpcGVSaWRlciAoYWxsIHZhcmlhbnRzKQorIAkgICAgKiBNb3Rvcm9sYSAoRE0xMDAgYW5kIFNCNDEwMCkKKyAJICAgICogQnJvYWRjb20gQ2FibGUgTW9kZW0gKHJlZmVyZW5jZSBkZXNpZ24pCisgCSAgICAqIFRvc2hpYmEgUENYMTEwMFUKKwkgICAgKiAuLi4KIAotY29uZmlnIFVTQl9HRU5FU1lTCi0JYm9vbGVhbiAiR2VuZVN5cyBHTDYyMFVTQi1BIGJhc2VkIGNhYmxlcyIKLQlkZWZhdWx0IHkKKwkgIFRoaXMgZHJpdmVyIGNyZWF0ZXMgYW4gaW50ZXJmYWNlIG5hbWVkICJldGhYIiwgd2hlcmUgWCBkZXBlbmRzIG9uCisJICB3aGF0IG90aGVyIG5ldHdvcmtpbmcgZGV2aWNlcyB5b3UgaGF2ZSBpbiB1c2UuICBIb3dldmVyLCBpZiB0aGUKKwkgIElFRUUgODAyICJsb2NhbCBhc3NpZ25tZW50IiBiaXQgaXMgc2V0IGluIHRoZSBhZGRyZXNzLCBhICJ1c2JYIgorCSAgbmFtZSBpcyB1c2VkIGluc3RlYWQuCisKK2NvbmZpZyBVU0JfTkVUX0dMNjIwQQorCXRyaXN0YXRlICJHZW5lU3lzIEdMNjIwVVNCLUEgYmFzZWQgY2FibGVzIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVAogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUsCkBAIC0xNjQsMzggKzE4OSw3OCBAQAogCiAJICBOb3RlIHRoYXQgdGhlIGhhbGYtZHVwbGV4ICJHTDYyMFVTQiIgaXMgbm90IHN1cHBvcnRlZC4KIAotY29uZmlnIFVTQl9ORVQxMDgwCi0JYm9vbGVhbiAiTmV0Q2hpcCAxMDgwIGJhc2VkIGNhYmxlcyAoTGFwbGluaywgLi4uKSIKK2NvbmZpZyBVU0JfTkVUX05FVDEwODAKKwl0cmlzdGF0ZSAiTmV0Q2hpcCAxMDgwIGJhc2VkIGNhYmxlcyAoTGFwbGluaywgLi4uKSIKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIFVTQl9VU0JORVQKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91J3JlIHVzaW5nIGEgaG9zdC10by1ob3N0IGNhYmxlIGJhc2VkCi0JICBvbiB0aGlzIGRlc2lnbjogIG9uZSBOZXRDaGlwIDEwODAgY2hpcHMgYW5kIHN1cHBvcnRpbmcgbG9naWMsCi0JICBzdXBwb3J0aW5nIExFRHMgdGhhdCBpbmRpY2F0ZSB0cmFmZmljCisJICBvbiB0aGlzIGRlc2lnbjogIG9uZSBOZXRDaGlwIDEwODAgY2hpcCBhbmQgc3VwcG9ydGluZyBsb2dpYywKKwkgIG9wdGlvbmFsbHkgd2l0aCBMRURzIHRoYXQgaW5kaWNhdGUgdHJhZmZpYwogCi1jb25maWcgVVNCX1BMMjMwMQotCWJvb2xlYW4gIlByb2xpZmljIFBMLTIzMDEvMjMwMiBiYXNlZCBjYWJsZXMiCi0JZGVmYXVsdCB5Ci0JIyBoYW5kc2hha2UvaW5pdC9yZXNldCBwcm9ibGVtcywgZnJvbSBvcmlnaW5hbCAncGx1c2InIGRyaXZlcgorY29uZmlnIFVTQl9ORVRfUExVU0IKKwl0cmlzdGF0ZSAiUHJvbGlmaWMgUEwtMjMwMS8yMzAyIGJhc2VkIGNhYmxlcyIKKwkjIGlmIHRoZSBoYW5kc2hha2UvaW5pdC9yZXNldCBwcm9ibGVtcywgZnJvbSBvcmlnaW5hbCAncGx1c2InLAorCSMgYXJlIGV2ZXIgcmVzb2x2ZWQgLi4uIHRoZW4gcmVtb3ZlICJleHBlcmltZW50YWwiCiAJZGVwZW5kcyBvbiBVU0JfVVNCTkVUICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUKIAkgIHdpdGggb25lIG9mIHRoZXNlIGNoaXBzLgogCi1jb25maWcgVVNCX0tDMjE5MAotCWJvb2xlYW4gIktUIFRlY2hub2xvZ3kgS0MyMTkwIGJhc2VkIGNhYmxlcyAoSW5zdGFOZXQpIgotCWRlZmF1bHQgeQorY29uZmlnIFVTQl9ORVRfUk5ESVNfSE9TVAorCXRyaXN0YXRlICJIb3N0IGZvciBSTkRJUyBkZXZpY2VzIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgVVNCX05FVF9DRENFVEhFUgogCWhlbHAKLQkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUKLQkgIHdpdGggb25lIG9mIHRoZXNlIGNoaXBzLgorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBob3N0aW5nICJSZW1vdGUgTkRJUyIgVVNCIG5ldHdvcmtpbmcgbGlua3MsCisJICBhcyBlbmNvdXJhZ2VkIGJ5IE1pY3Jvc29mdCAoaW5zdGVhZCBvZiBDREMgRXRoZXJuZXQhKSBmb3IgdXNlIGluCisJICB2YXJpb3VzIGRldmljZXMgdGhhdCBtYXkgb25seSBzdXBwb3J0IHRoaXMgcHJvdG9jb2wuCiAKLWNvbW1lbnQgIkludGVsbGlnZW50IFVTQiBEZXZpY2VzL0dhZGdldHMiCisJICBBdm9pZCB1c2luZyB0aGlzIHByb3RvY29sIHVubGVzcyB5b3UgaGF2ZSBubyBiZXR0ZXIgb3B0aW9ucy4KKwkgIFRoZSBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGlzIGluY29tcGxldGUsIGFuZCBpcyBjb250cm9sbGVkIGJ5CisJICAoYW5kIGZvcikgTWljcm9zb2Z0OyBpdCBpc24ndCBhbiAiT3BlbiIgZWNvc3lzdGVtIG9yIG1hcmtldC4KKworY29uZmlnIFVTQl9ORVRfQ0RDX1NVQlNFVAorCXRyaXN0YXRlICJTaW1wbGUgVVNCIE5ldHdvcmsgTGlua3MgKENEQyBFdGhlcm5ldCBzdWJzZXQpIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyBVU0IgbmV0d29yayBkZXZpY2VzIHRoYXQgY2FuIHdvcmsKKwkgIHdpdGhvdXQgYW55IGRldmljZS1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gIFNlbGVjdCBpdCBpZiB5b3UgaGF2ZQorCSAgb25lIG9mIHRoZXNlIGRyaXZlcnMuCisKKwkgIE5vdGUgdGhhdCB3aGlsZSBtYW55IFVTQiBob3N0LXRvLWhvc3QgY2FibGVzIGNhbiB3b3JrIGluIHRoaXMgbW9kZSwKKwkgIHRoYXQgbWF5IG1lYW4gbm90IGJlaW5nIGFibGUgdG8gdGFsayB0byBXaW4zMiBzeXN0ZW1zIG9yIG1vcmUKKwkgIGNvbW1vbmx5IG5vdCBiZWluZyBhYmxlIHRvIGhhbmRsZSBjZXJ0YWluIGV2ZW50cyAobGlrZSByZXBsdWdnaW5nCisJICB0aGUgaG9zdCBvbiB0aGUgb3RoZXIgZW5kKSB2ZXJ5IHdlbGwuICBBbHNvLCB0aGVzZSBkZXZpY2VzIHdpbGwKKwkgIG5vdCBnZW5lcmFsbHkgaGF2ZSBwZXJtYW5lbnRseSBhc3NpZ25lZCBFdGhlcm5ldCBhZGRyZXNzZXMuCisKK2NvbmZpZyBVU0JfQUxJX001NjMyCisJYm9vbGVhbiAiQUxpIE01NjMyIGJhc2VkICdVU0IgMi4wIERhdGEgTGluaycgY2FibGVzIgorCWRlcGVuZHMgb24gVVNCX05FVF9DRENfU1VCU0VUCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSdyZSB1c2luZyBhIGhvc3QtdG8taG9zdCBjYWJsZQorCSAgYmFzZWQgb24gdGhpcyBkZXNpZ24sIHdoaWNoIHN1cHBvcnRzIFVTQiAyLjAgaGlnaCBzcGVlZC4KKworY29uZmlnIFVTQl9BTjI3MjAKKwlib29sZWFuICJBbmNob3JDaGlwcyAyNzIwIGJhc2VkIGNhYmxlcyAoWGlyY29tIFBHVU5FVCwgLi4uKSIKKwlkZXBlbmRzIG9uIFVTQl9ORVRfQ0RDX1NVQlNFVAorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSBob3N0LXRvLWhvc3QgY2FibGUKKwkgIGJhc2VkIG9uIHRoaXMgZGVzaWduLiAgTm90ZSB0aGF0IEFuY2hvckNoaXBzIGlzIG5vdyBhCisJICBDeXByZXNzIGJyYW5kLgorCitjb25maWcgVVNCX0JFTEtJTgorCWJvb2xlYW4gImVURUsgYmFzZWQgaG9zdC10by1ob3N0IGNhYmxlcyAoQWR2YW5jZSwgQmVsa2luLCAuLi4pIgorCWRlcGVuZHMgb24gVVNCX05FVF9DRENfU1VCU0VUCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSdyZSB1c2luZyBhIGhvc3QtdG8taG9zdCBjYWJsZQorCSAgYmFzZWQgb24gdGhpcyBkZXNpZ246ICB0d28gTmV0Q2hpcCAyODkwIGNoaXBzIGFuZCBhbiBBdG1lbAorCSAgbWljcm9jb250cm9sbGVyLCB3aXRoIExFRHMgdGhhdCBpbmRpY2F0ZSB0cmFmZmljLgogCiBjb25maWcgVVNCX0FSTUxJTlVYCiAJYm9vbGVhbiAiRW1iZWRkZWQgQVJNIExpbnV4IGxpbmtzIChpUGFxLCAuLi4pIgotCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorCWRlcGVuZHMgb24gVVNCX05FVF9DRENfU1VCU0VUCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIHN1cHBvcnQgdGhlICJ1c2ItZXRoIiBuZXR3b3JraW5nIGRyaXZlcgpAQCAtMjEyLDE1ICsyNzcsMTUgQEAKIAogY29uZmlnIFVTQl9FUFNPTjI4ODgKIAlib29sZWFuICJFcHNvbiAyODg4IGJhc2VkIGZpcm13YXJlIChERVZFTE9QTUVOVCkiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0JfTkVUX0NEQ19TVUJTRVQKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gdG8gc3VwcG9ydCB0aGUgdXNiIG5ldHdvcmtpbmcgbGlua3MgdXNlZAogCSAgYnkgc29tZSBzYW1wbGUgZmlybXdhcmUgZnJvbSBFcHNvbi4KIAotY29uZmlnIFVTQl9aQVVSVVMKLQlib29sZWFuICJTaGFycCBaYXVydXMgKHN0b2NrIFJPTXMpIGFuZCBjb21wYXRpYmxlIgorY29uZmlnIFVTQl9ORVRfWkFVUlVTCisJdHJpc3RhdGUgIlNoYXJwIFphdXJ1cyAoc3RvY2sgUk9NcykgYW5kIGNvbXBhdGlibGUiCiAJZGVwZW5kcyBvbiBVU0JfVVNCTkVUCisJc2VsZWN0IFVTQl9ORVRfQ0RDRVRIRVIKIAlzZWxlY3QgQ1JDMzIKIAlkZWZhdWx0IHkKIAloZWxwCkBAIC0yMzUsNjEgKzMwMCw2IEBACiAJICByZWFsbHkgbmVlZCB0aGlzIG5vbi1jb25mb3JtYW50IHZhcmlhbnQgb2YgQ0RDIEV0aGVybmV0IChvciBpbgogCSAgc29tZSBjYXNlcyBDREMgTURMTSkgcHJvdG9jb2wsIG5vdCAiZ19ldGhlciIuCiAKLWNvbmZpZyBVU0JfQ0RDRVRIRVIKLQlib29sZWFuICJDREMgRXRoZXJuZXQgc3VwcG9ydCAoc21hcnQgZGV2aWNlcyBzdWNoIGFzIGNhYmxlIG1vZGVtcykiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgZGV2aWNlcyBjb25mb3JtaW5nIHRvIHRoZSBDb21tdW5pY2F0aW9uIERldmljZQotCSAgQ2xhc3MgKENEQykgRXRoZXJuZXQgQ29udHJvbCBNb2RlbCwgYSBzcGVjaWZpY2F0aW9uIHRoYXQncyBlYXN5IHRvCi0JICBpbXBsZW1lbnQgaW4gZGV2aWNlIGZpcm13YXJlLiAgVGhlIENEQyBzcGVjaWZpY2F0aW9ucyBhcmUgYXZhaWxhYmxlCi0JICBmcm9tIDxodHRwOi8vd3d3LnVzYi5vcmcvPi4KLQkgIAotCSAgQ0RDIEV0aGVybmV0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9wdGlvbiBmb3IgRE9DU0lTIGNhYmxlIG1vZGVtcwotCSAgdGhhdCBzdXBwb3J0IFVTQiBjb25uZWN0aXZpdHksIHVzZWQgZm9yIG5vbi1NaWNyb3NvZnQgVVNCIGhvc3RzLgotIAkgIFRoaXMgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgotCi0gCSAgICAqIEVyaWNzc29uIFBpcGVSaWRlciAoYWxsIHZhcmlhbnRzKQotIAkgICAgKiBNb3Rvcm9sYSAoRE0xMDAgYW5kIFNCNDEwMCkKLSAJICAgICogQnJvYWRjb20gQ2FibGUgTW9kZW0gKHJlZmVyZW5jZSBkZXNpZ24pCi0gCSAgICAqIFRvc2hpYmEgUENYMTEwMFUKLQkgICAgKiAuLi4KLQotCSAgVGhpcyBkcml2ZXIgY3JlYXRlcyBhbiBpbnRlcmZhY2UgbmFtZWQgImV0aFgiLCB3aGVyZSBYIGRlcGVuZHMgb24KLQkgIHdoYXQgb3RoZXIgbmV0d29ya2luZyBkZXZpY2VzIHlvdSBoYXZlIGluIHVzZS4gIEhvd2V2ZXIsIGlmIHRoZQotCSAgSUVFRSA4MDIgImxvY2FsIGFzc2lnbm1lbnQiIGJpdCBpcyBzZXQgaW4gdGhlIGFkZHJlc3MsIGEgInVzYlgiCi0JICBuYW1lIGlzIHVzZWQgaW5zdGVhZC4KLQotY29tbWVudCAiVVNCIE5ldHdvcmsgQWRhcHRlcnMiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUCi0KLWNvbmZpZyBVU0JfQVg4ODE3WAotCWJvb2xlYW4gIkFTSVggQVg4OHh4eCBCYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMiCi0JZGVwZW5kcyBvbiBVU0JfVVNCTkVUICYmIE5FVF9FVEhFUk5FVAotCXNlbGVjdCBDUkMzMgotCXNlbGVjdCBNSUkKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIEFTSVggQVg4OHh4eCBiYXNlZCBVU0IgMi4wCi0JICAxMC8xMDAgRXRoZXJuZXQgZGV2aWNlcy4KLQotIAkgIFRoaXMgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgotCSAgICAqIEF0ZW4gVUMyMTBUCi0JICAgICogQVNJWCBBWDg4MTcyCi0JICAgICogQmlsbGlvbnRvbiBTeXN0ZW1zLCBVU0IyQVIgCi0JICAgICogQnVmZmFsbyBMVUEtVTItS1RYCi0JICAgICogQ29yZWdhIEZFdGhlciBVU0IyLVRYCi0JICAgICogRC1MaW5rIERVQi1FMTAwCi0JICAgICogSGF3a2luZyBVRjIwMAotCSAgICAqIExpbmtzeXMgVVNCMjAwTQotCSAgICAqIE5ldGdlYXIgRkExMjAKLQkgICAgKiBTaXRlY29tIExOLTAyOQotCSAgICAqIEludGVsbGluZXQgVVNCIDIuMCBFdGhlcm5ldAotCSAgICAqIFNUIExhYiBVU0IgMi4wIEV0aGVybmV0Ci0JICAgICogVHJlbmROZXQgVFUyLUVUMTAwCi0KLQkgIFRoaXMgZHJpdmVyIGNyZWF0ZXMgYW4gaW50ZXJmYWNlIG5hbWVkICJldGhYIiwgd2hlcmUgWCBkZXBlbmRzIG9uCi0JICB3aGF0IG90aGVyIG5ldHdvcmtpbmcgZGV2aWNlcyB5b3UgaGF2ZSBpbiB1c2UuICAKIAogY29uZmlnIFVTQl9aRDEyMDEKIAl0cmlzdGF0ZSAiVVNCIFpEMTIwMSBiYXNlZCBXaXJlbGVzcyBkZXZpY2Ugc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZQppbmRleCBmZTNmZDQxLi4yMjJjMDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbmV0L01ha2VmaWxlCkBAIC02LDUgKzYsMTMgQEAKIG9iai0kKENPTkZJR19VU0JfS0FXRVRIKQkrPSBrYXdldGgubwogb2JqLSQoQ09ORklHX1VTQl9QRUdBU1VTKQkrPSBwZWdhc3VzLm8KIG9iai0kKENPTkZJR19VU0JfUlRMODE1MCkJKz0gcnRsODE1MC5vCitvYmotJChDT05GSUdfVVNCX05FVF9BWDg4MTdYKQkrPSBhc2l4Lm8KK29iai0kKENPTkZJR19VU0JfTkVUX0NEQ0VUSEVSKQkrPSBjZGNfZXRoZXIubworb2JqLSQoQ09ORklHX1VTQl9ORVRfR0w2MjBBKQkrPSBnbDYyMGEubworb2JqLSQoQ09ORklHX1VTQl9ORVRfTkVUMTA4MCkJKz0gbmV0MTA4MC5vCitvYmotJChDT05GSUdfVVNCX05FVF9QTFVTQikJKz0gcGx1c2Iubworb2JqLSQoQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVCkJKz0gcm5kaXNfaG9zdC5vCitvYmotJChDT05GSUdfVVNCX05FVF9DRENfU1VCU0VUKQkrPSBjZGNfc3Vic2V0Lm8KK29iai0kKENPTkZJR19VU0JfTkVUX1pBVVJVUykJKz0gemF1cnVzLm8KIG9iai0kKENPTkZJR19VU0JfVVNCTkVUKQkrPSB1c2JuZXQubwogb2JqLSQoQ09ORklHX1VTQl9aRDEyMDEpCSs9IHpkMTIwMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFmMDBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIEFTSVggQVg4ODE3WCBiYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IERhdmlkIEhvbGxpcyA8ZGhvbGxpc0BkYXZlaG9sbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBQaGlsIENoYW5nIDxwY2hhbmcyM0BzYmNnbG9iYWwubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgVGlWbyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8vICNkZWZpbmUJREVCVUcJCQkvLyBlcnJvciBwYXRoIG1lc3NhZ2VzLCBleHRyYSBpbmZvCisvLyAjZGVmaW5lCVZFUkJPU0UJCQkvLyBtb3JlOyBzdWNjZXNzIG1lc3NhZ2VzCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZglDT05GSUdfVVNCX0RFQlVHCisjICAgZGVmaW5lIERFQlVHCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qIEFTSVggQVg4ODE3WCBiYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMgKi8KKworI2RlZmluZSBBWF9DTURfU0VUX1NXX01JSQkJMHgwNgorI2RlZmluZSBBWF9DTURfUkVBRF9NSUlfUkVHCQkweDA3CisjZGVmaW5lIEFYX0NNRF9XUklURV9NSUlfUkVHCQkweDA4CisjZGVmaW5lIEFYX0NNRF9TRVRfSFdfTUlJCQkweDBhCisjZGVmaW5lIEFYX0NNRF9SRUFEX0VFUFJPTQkJMHgwYgorI2RlZmluZSBBWF9DTURfV1JJVEVfRUVQUk9NCQkweDBjCisjZGVmaW5lIEFYX0NNRF9XUklURV9FTkFCTEUJCTB4MGQKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0RJU0FCTEUJCTB4MGUKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX1JYX0NUTAkJMHgxMAorI2RlZmluZSBBWF9DTURfUkVBRF9JUEcwMTIJCTB4MTEKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzAJCTB4MTIKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzEJCTB4MTMKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzIJCTB4MTQKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX01VTFRJX0ZJTFRFUgkweDE2CisjZGVmaW5lIEFYX0NNRF9SRUFEX05PREVfSUQJCTB4MTcKKyNkZWZpbmUgQVhfQ01EX1JFQURfUEhZX0lECQkweDE5CisjZGVmaW5lIEFYX0NNRF9SRUFEX01FRElVTV9TVEFUVVMJMHgxYQorI2RlZmluZSBBWF9DTURfV1JJVEVfTUVESVVNX01PREUJMHgxYgorI2RlZmluZSBBWF9DTURfUkVBRF9NT05JVE9SX01PREUJMHgxYworI2RlZmluZSBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFCTB4MWQKKyNkZWZpbmUgQVhfQ01EX1dSSVRFX0dQSU9TCQkweDFmCisjZGVmaW5lIEFYX0NNRF9TV19SRVNFVAkJCTB4MjAKKyNkZWZpbmUgQVhfQ01EX1NXX1BIWV9TVEFUVVMJCTB4MjEKKyNkZWZpbmUgQVhfQ01EX1NXX1BIWV9TRUxFQ1QJCTB4MjIKKyNkZWZpbmUgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lECTB4MTMKKworI2RlZmluZSBBWF9NT05JVE9SX01PREUJCQkweDAxCisjZGVmaW5lIEFYX01PTklUT1JfTElOSwkJCTB4MDIKKyNkZWZpbmUgQVhfTU9OSVRPUl9NQUdJQwkJMHgwNAorI2RlZmluZSBBWF9NT05JVE9SX0hTRlMJCQkweDEwCisKKy8qIEFYODgxNzIgTWVkaXVtIFN0YXR1cyBSZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgQVhfTUVESVVNX0ZVTExfRFVQTEVYCQkweDAyCisjZGVmaW5lIEFYX01FRElVTV9UWF9BQk9SVF9BTExPVwkweDA0CisjZGVmaW5lIEFYX01FRElVTV9GTE9XX0NPTlRST0xfRU4JMHgxMAorCisjZGVmaW5lIEFYX01DQVNUX0ZJTFRFUl9TSVpFCQk4CisjZGVmaW5lIEFYX01BWF9NQ0FTVAkJCTY0CisKKyNkZWZpbmUgQVhfRUVQUk9NX0xFTgkJCTB4NDAKKworI2RlZmluZSBBWF9TV1JFU0VUX0NMRUFSCQkweDAwCisjZGVmaW5lIEFYX1NXUkVTRVRfUlIJCQkweDAxCisjZGVmaW5lIEFYX1NXUkVTRVRfUlQJCQkweDAyCisjZGVmaW5lIEFYX1NXUkVTRVRfUFJURQkJCTB4MDQKKyNkZWZpbmUgQVhfU1dSRVNFVF9QUkwJCQkweDA4CisjZGVmaW5lIEFYX1NXUkVTRVRfQloJCQkweDEwCisjZGVmaW5lIEFYX1NXUkVTRVRfSVBSTAkJCTB4MjAKKyNkZWZpbmUgQVhfU1dSRVNFVF9JUFBECQkJMHg0MAorCisjZGVmaW5lIEFYODg3NzJfSVBHMF9ERUZBVUxUCQkweDE1CisjZGVmaW5lIEFYODg3NzJfSVBHMV9ERUZBVUxUCQkweDBjCisjZGVmaW5lIEFYODg3NzJfSVBHMl9ERUZBVUxUCQkweDEyCisKKyNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fRlVMTF9EVVBMRVgJMHgwMDAyCisjZGVmaW5lIEFYODg3NzJfTUVESVVNX1JFU0VSVkVECQkweDAwMDQKKyNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fUlhfRkNfRU5BQkxFCTB4MDAxMAorI2RlZmluZSBBWDg4NzcyX01FRElVTV9UWF9GQ19FTkFCTEUJMHgwMDIwCisjZGVmaW5lIEFYODg3NzJfTUVESVVNX1BBVVNFX0ZPUk1BVAkweDAwODAKKyNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fUlhfRU5BQkxFCTB4MDEwMAorI2RlZmluZSBBWDg4NzcyX01FRElVTV8xMDBNQgkJMHgwMjAwCisjZGVmaW5lIEFYODg3NzJfTUVESVVNX0RFRkFVTFQJXAorCShBWDg4NzcyX01FRElVTV9GVUxMX0RVUExFWCB8IEFYODg3NzJfTUVESVVNX1JYX0ZDX0VOQUJMRSB8IFwKKwkgQVg4ODc3Ml9NRURJVU1fVFhfRkNfRU5BQkxFIHwgQVg4ODc3Ml9NRURJVU1fMTAwTUIgfCBcCisJIEFYODg3NzJfTUVESVVNX1JFU0VSVkVEIHwgQVg4ODc3Ml9NRURJVU1fUlhfRU5BQkxFICkKKworI2RlZmluZSBBWF9FRVBST01fTUFHSUMJCQkweGRlYWRiZWVmCisKKy8qIFRoaXMgc3RydWN0dXJlIGNhbm5vdCBleGNlZWQgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgWzVdKSBBS0EgMjAgYnl0ZXMgKi8KK3N0cnVjdCBheDg4MTd4X2RhdGEgeworCXU4IG11bHRpX2ZpbHRlcltBWF9NQ0FTVF9GSUxURVJfU0laRV07Cit9OworCitzdHJ1Y3QgYXg4ODE3Ml9pbnRfZGF0YSB7CisJdTE2IHJlczE7CisJdTggbGluazsKKwl1MTYgcmVzMjsKKwl1OCBzdGF0dXM7CisJdTE2IHJlczM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCBheDg4MTd4X3JlYWRfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKKwkJCSAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKAorCQlkZXYtPnVkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQljbWQsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwKKwkJaW5kZXgsCisJCWRhdGEsCisJCXNpemUsCisJCVVTQl9DVFJMX0dFVF9USU1FT1VUKTsKK30KKworc3RhdGljIGludCBheDg4MTd4X3dyaXRlX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCisJCQkgICAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQoreworCXJldHVybiB1c2JfY29udHJvbF9tc2coCisJCWRldi0+dWRldiwKKwkJdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCWNtZCwKKwkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwKKwkJaW5kZXgsCisJCWRhdGEsCisJCXNpemUsCisJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKK30KKworc3RhdGljIHZvaWQgYXg4ODE3eF9hc3luY19jbWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKXVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0RFQlVHICJheDg4MTd4X2FzeW5jX2NtZF9jYWxsYmFjaygpIGZhaWxlZCB3aXRoICVkIiwKKwkJCXVyYi0+c3RhdHVzKTsKKworCWtmcmVlKHJlcSk7CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKK3N0YXRpYyB2b2lkIGF4ODgxN3hfc3RhdHVzKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBheDg4MTcyX2ludF9kYXRhICpldmVudDsKKwlpbnQgbGluazsKKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPCA4KQorCQlyZXR1cm47CisKKwlldmVudCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWxpbmsgPSBldmVudC0+bGluayAmIDB4MDE7CisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2LT5uZXQpICE9IGxpbmspIHsKKwkJaWYgKGxpbmspIHsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOworCQkJdXNibmV0X2RlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9MSU5LX1JFU0VUICk7CisJCX0gZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2LT5uZXQpOworCQlkZXZkYmcoZGV2LCAiYXg4ODE3eCAtIExpbmsgU3RhdHVzIGlzOiAlZCIsIGxpbmspOworCX0KK30KKworc3RhdGljIHZvaWQKK2F4ODgxN3hfd3JpdGVfY21kX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKKwkJCQkgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqcmVxOworCWludCBzdGF0dXM7CisJc3RydWN0IHVyYiAqdXJiOworCisJaWYgKCh1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWRldmRiZyhkZXYsICJFcnJvciBhbGxvY2F0aW5nIFVSQiBpbiB3cml0ZV9jbWRfYXN5bmMhIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHJlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlkZXZlcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udHJvbCByZXF1ZXN0Iik7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlyZXR1cm47CisJfQorCisJcmVxLT5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0U7CisJcmVxLT5iUmVxdWVzdCA9IGNtZDsKKwlyZXEtPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlyZXEtPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXVzYl9maWxsX2NvbnRyb2xfdXJiKHVyYiwgZGV2LT51ZGV2LAorCQkJICAgICB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJCSAgICAgKHZvaWQgKilyZXEsIGRhdGEsIHNpemUsCisJCQkgICAgIGF4ODgxN3hfYXN5bmNfY21kX2NhbGxiYWNrLCByZXEpOworCisJaWYoKHN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpIDwgMCkgeworCQlkZXZlcnIoZGV2LCAiRXJyb3Igc3VibWl0dGluZyB0aGUgY29udHJvbCBtZXNzYWdlOiBzdGF0dXM9JWQiLAorCQkJCXN0YXR1cyk7CisJCWtmcmVlKHJlcSk7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCX0KK30KKworc3RhdGljIHZvaWQgYXg4ODE3eF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgYXg4ODE3eF9kYXRhICpkYXRhID0gKHN0cnVjdCBheDg4MTd4X2RhdGEgKikmZGV2LT5kYXRhOworCXU4IHJ4X2N0bCA9IDB4OGM7CisKKwlpZiAobmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXJ4X2N0bCB8PSAweDAxOworCX0gZWxzZSBpZiAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSQorCQkgICB8fCBuZXQtPm1jX2NvdW50ID4gQVhfTUFYX01DQVNUKSB7CisJCXJ4X2N0bCB8PSAweDAyOworCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCA9PSAwKSB7CisJCS8qIGp1c3QgYnJvYWRjYXN0IGFuZCBkaXJlY3RlZCAqLworCX0gZWxzZSB7CisJCS8qIFdlIHVzZSB0aGUgMjAgYnl0ZSBkZXYtPmRhdGEKKwkJICogZm9yIG91ciA4IGJ5dGUgZmlsdGVyIGJ1ZmZlcgorCQkgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0CisJCSAqIGlzIHRyaWNreSB0byBmcmVlIGxhdGVyICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCA9IG5ldC0+bWNfbGlzdDsKKwkJdTMyIGNyY19iaXRzOworCQlpbnQgaTsKKworCQltZW1zZXQoZGF0YS0+bXVsdGlfZmlsdGVyLCAwLCBBWF9NQ0FTVF9GSUxURVJfU0laRSk7CisKKwkJLyogQnVpbGQgdGhlIG11bHRpY2FzdCBoYXNoIGZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5ldC0+bWNfY291bnQ7IGkrKykgeworCQkJY3JjX2JpdHMgPQorCQkJICAgIGV0aGVyX2NyYyhFVEhfQUxFTiwKKwkJCQkgICAgICBtY19saXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQlkYXRhLT5tdWx0aV9maWx0ZXJbY3JjX2JpdHMgPj4gM10gfD0KKwkJCSAgICAxIDw8IChjcmNfYml0cyAmIDcpOworCQkJbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQ7CisJCX0KKworCQlheDg4MTd4X3dyaXRlX2NtZF9hc3luYyhkZXYsIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIsIDAsIDAsCisJCQkJICAgQVhfTUNBU1RfRklMVEVSX1NJWkUsIGRhdGEtPm11bHRpX2ZpbHRlcik7CisKKwkJcnhfY3RsIHw9IDB4MTA7CisJfQorCisJYXg4ODE3eF93cml0ZV9jbWRfYXN5bmMoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCByeF9jdGwsIDAsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGF4ODgxN3hfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MTYgcmVzOworCXU4IGJ1ZlsxXTsKKworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9TV19NSUksIDAsIDAsIDAsICZidWYpOworCWF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NSUlfUkVHLCBwaHlfaWQsCisJCQkJKF9fdTE2KWxvYywgMiwgKHUxNiAqKSZyZXMpOworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDAsIDAsIDAsICZidWYpOworCisJcmV0dXJuIHJlcyAmIDB4ZmZmZjsKK30KKworLyogc2FtZSBhcyBhYm92ZSwgYnV0IGNvbnZlcnRzIHJlc3VsdGluZyB2YWx1ZSB0byBjcHUgYnl0ZSBvcmRlciAqLworc3RhdGljIGludCBheDg4MTd4X21kaW9fcmVhZF9sZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworCXJldHVybiBsZTE2X3RvX2NwdShheDg4MTd4X21kaW9fcmVhZChuZXRkZXYscGh5X2lkLCBsb2MpKTsKK30KKworc3RhdGljIHZvaWQKK2F4ODgxN3hfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTE2IHJlcyA9IHZhbDsKKwl1OCBidWZbMV07CisKKwlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLCAwLCAwLCAwLCAmYnVmKTsKKwlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsCisJCQkJKF9fdTE2KWxvYywgMiwgKHUxNiAqKSZyZXMpOworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDAsIDAsIDAsICZidWYpOworfQorCisvKiBzYW1lIGFzIGFib3ZlLCBidXQgY29udmVydHMgbmV3IHZhbHVlIHRvIGxlMTYgYnl0ZSBvcmRlciBiZWZvcmUgd3JpdGluZyAqLworc3RhdGljIHZvaWQKK2F4ODgxN3hfbWRpb193cml0ZV9sZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKQoreworCWF4ODgxN3hfbWRpb193cml0ZSggbmV0ZGV2LCBwaHlfaWQsIGxvYywgY3B1X3RvX2xlMTYodmFsKSApOworfQorCitzdGF0aWMgaW50IGF4ODgxNzJfbGlua19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTE2IGxwYTsKKwl1MTYgYWR2OworCXUxNiByZXM7CisJdTggbW9kZTsKKworCW1vZGUgPSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cgfCBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOOworCWxwYSA9IGF4ODgxN3hfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9MUEEpOworCWFkdiA9IGF4ODgxN3hfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCXJlcyA9IG1paV9ud2F5X3Jlc3VsdChscGF8YWR2KTsKKwlpZiAocmVzICYgTFBBX0RVUExFWCkKKwkJbW9kZSB8PSBBWF9NRURJVU1fRlVMTF9EVVBMRVg7CisJYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitheDg4MTd4X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbykKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXU4IG9wdDsKKworCWlmIChheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTU9OSVRPUl9NT0RFLCAwLCAwLCAxLCAmb3B0KSA8IDApIHsKKwkJd29saW5mby0+c3VwcG9ydGVkID0gMDsKKwkJd29saW5mby0+d29sb3B0cyA9IDA7CisJCXJldHVybjsKKwl9CisJd29saW5mby0+c3VwcG9ydGVkID0gV0FLRV9QSFkgfCBXQUtFX01BR0lDOworCXdvbGluZm8tPndvbG9wdHMgPSAwOworCWlmIChvcHQgJiBBWF9NT05JVE9SX01PREUpIHsKKwkJaWYgKG9wdCAmIEFYX01PTklUT1JfTElOSykKKwkJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9QSFk7CisJCWlmIChvcHQgJiBBWF9NT05JVE9SX01BR0lDKQorCQkJd29saW5mby0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCX0KK30KKworc3RhdGljIGludAorYXg4ODE3eF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwl1OCBvcHQgPSAwOworCXU4IGJ1ZlsxXTsKKworCWlmICh3b2xpbmZvLT53b2xvcHRzICYgV0FLRV9QSFkpCisJCW9wdCB8PSBBWF9NT05JVE9SX0xJTks7CisJaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQlvcHQgfD0gQVhfTU9OSVRPUl9NQUdJQzsKKwlpZiAob3B0ICE9IDApCisJCW9wdCB8PSBBWF9NT05JVE9SX01PREU7CisKKwlpZiAoYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFLAorCQkJICAgICAgb3B0LCAwLCAwLCAmYnVmKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODE3eF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXJldHVybiBBWF9FRVBST01fTEVOOworfQorCitzdGF0aWMgaW50IGF4ODgxN3hfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJdTE2ICplYnVmID0gKHUxNiAqKWRhdGE7CisJaW50IGk7CisKKwkvKiBDcnVkZSBoYWNrIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkKKwkgKiBpZiBhbiBvZGQgbGVuZ3RoIGlzIHN1cHBsaWVkCisJICovCisJaWYgKGVlcHJvbS0+bGVuICUgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZXByb20tPm1hZ2ljID0gQVhfRUVQUk9NX01BR0lDOworCisJLyogYXg4ODE3eCByZXR1cm5zIDIgYnl0ZXMgZnJvbSBlZXByb20gb24gcmVhZCAqLworCWZvciAoaT0wOyBpIDwgZWVwcm9tLT5sZW4gLyAyOyBpKyspIHsKKwkJaWYgKGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sCisJCQllZXByb20tPm9mZnNldCArIGksIDAsIDIsICZlYnVmW2ldKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF4ODgxN3hfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCisJCQkJIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJLyogSW5oZXJpdCBzdGFuZGFyZCBkZXZpY2UgaW5mbyAqLworCXVzYm5ldF9nZXRfZHJ2aW5mbyhuZXQsIGluZm8pOworCWluZm8tPmVlZHVtcF9sZW4gPSAweDNlOworfQorCitzdGF0aWMgaW50IGF4ODgxN3hfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisKKwlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksY21kKTsKK30KKworc3RhdGljIGludCBheDg4MTd4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJmRldi0+bWlpLGNtZCk7Cit9CisKKy8qIFdlIG5lZWQgdG8gb3ZlcnJpZGUgc29tZSBldGh0b29sX29wcyBzbyB3ZSByZXF1aXJlIG91cgorICAgb3duIHN0cnVjdHVyZSBzbyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciB1c2JuZXQKKyAgIGRldmljZXMgdGhhdCBtYXkgYmUgY29ubmVjdGVkIGF0IHRoZSBzYW1lIHRpbWUuICovCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODgxN3hfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGF4ODgxN3hfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBheDg4MTd4X2dldF93b2wsCisJLnNldF93b2wJCT0gYXg4ODE3eF9zZXRfd29sLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBheDg4MTd4X2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGF4ODgxN3hfZ2V0X2VlcHJvbSwKKwkuZ2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYXg4ODE3eF9zZXRfc2V0dGluZ3MsCit9OworCitzdGF0aWMgaW50IGF4ODgxN3hfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCXJldHVybiBnZW5lcmljX21paV9pb2N0bCgmZGV2LT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODE3eF9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYnVmOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZ3Bpb19iaXRzID0gZGV2LT5kcml2ZXJfaW5mby0+ZGF0YTsKKworCXVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldixpbnRmKTsKKworCWJ1ZiA9IGttYWxsb2MoRVRIX0FMRU4sIEdGUF9LRVJORUwpOworCWlmKCFidWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQxOworCX0KKworCS8qIFRvZ2dsZSB0aGUgR1BJT3MgaW4gYSBtYW51ZmFjdHVyZXIvbW9kZWwgc3BlY2lmaWMgd2F5ICovCisJZm9yIChpID0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywKKwkJCQkJKGdwaW9fYml0cyA+PiAoaSAqIDgpKSAmIDB4ZmYsIDAsIDAsCisJCQkJCWJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0MjsKKwkJbXNsZWVwKDUpOworCX0KKworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLAorCQkJCTB4ODAsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoInNlbmQgQVhfQ01EX1dSSVRFX1JYX0NUTCBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwltZW1zZXQoYnVmLCAwLCBFVEhfQUxFTik7CisJaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTk9ERV9JRCwKKwkJCQkwLCAwLCA2LCBidWYpKSA8IDApIHsKKwkJZGJnKCJyZWFkIEFYX0NNRF9SRUFEX05PREVfSUQgZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisJbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgYnVmLCBFVEhfQUxFTik7CisKKwkvKiBHZXQgdGhlIFBIWSBpZCAqLworCWlmICgocmV0ID0gYXg4ODE3eF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX1BIWV9JRCwKKwkJCQkwLCAwLCAyLCBidWYpKSA8IDApIHsKKwkJZGJnKCJlcnJvciBvbiByZWFkIEFYX0NNRF9SRUFEX1BIWV9JRDogJTAyeCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9IGVsc2UgaWYgKHJldCA8IDIpIHsKKwkJLyogdGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiAyIGJ5dGVzICovCisJCWRiZygiQVhfQ01EX1JFQURfUEhZX0lEIHJldHVybmVkIGxlc3MgdGhhbiAyIGJ5dGVzOiByZXQ9JTAyeCIsCisJCQkJcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEluaXRpYWxpemUgTUlJIHN0cnVjdHVyZSAqLworCWRldi0+bWlpLmRldiA9IGRldi0+bmV0OworCWRldi0+bWlpLm1kaW9fcmVhZCA9IGF4ODgxN3hfbWRpb19yZWFkOworCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBheDg4MTd4X21kaW9fd3JpdGU7CisJZGV2LT5taWkucGh5X2lkX21hc2sgPSAweDNmOworCWRldi0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisJZGV2LT5taWkucGh5X2lkID0gKigodTggKilidWYgKyAxKTsKKwlkZXYtPm5ldC0+ZG9faW9jdGwgPSBheDg4MTd4X2lvY3RsOworCisJZGV2LT5uZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGF4ODgxN3hfc2V0X211bHRpY2FzdDsKKwlkZXYtPm5ldC0+ZXRodG9vbF9vcHMgPSAmYXg4ODE3eF9ldGh0b29sX29wczsKKworCWF4ODgxN3hfbWRpb193cml0ZV9sZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJYXg4ODE3eF9tZGlvX3dyaXRlX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCisJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKKworCXJldHVybiAwOworb3V0MjoKKwlrZnJlZShidWYpOworb3V0MToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODg3NzJfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGF4ODgxN3hfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBheDg4MTd4X2dldF93b2wsCisJLnNldF93b2wJCT0gYXg4ODE3eF9zZXRfd29sLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBheDg4MTd4X2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGF4ODgxN3hfZ2V0X2VlcHJvbSwKKwkuZ2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYXg4ODE3eF9zZXRfc2V0dGluZ3MsCit9OworCitzdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCByZXQ7CisJdm9pZCAqYnVmOworCisJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LGludGYpOworCisJYnVmID0ga21hbGxvYyg2LCBHRlBfS0VSTkVMKTsKKwlpZighYnVmKSB7CisJCWRiZyAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1ZmZlciIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDE7CisJfQorCisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywKKwkJCQkgICAgIDB4MDBCMCwgMCwgMCwgYnVmKSkgPCAwKQorCQlnb3RvIG91dDI7CisKKwltc2xlZXAoNSk7CisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULAorCQkJCTB4MDAwMSwgMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIEFYX1NXUkVTRVRfSVBQRCwKKwkJCQkwLCAwLCBidWYpKSA8IDApIHsKKwkJZGJnKCJGYWlsZWQgdG8gcG93ZXIgZG93biBpbnRlcm5hbCBQSFk6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCW1zbGVlcCgxNTApOworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIEFYX1NXUkVTRVRfQ0xFQVIsCisJCQkJMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiRmFpbGVkIHRvIHBlcmZvcm0gc29mdHdhcmUgcmVzZXQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCW1zbGVlcCgxNTApOworCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsCisJICAgICAJCQlBWF9TV1JFU0VUX0lQUkwgfCBBWF9TV1JFU0VUX1BSTCwKKwkJCQkwLCAwLCBidWYpKSA8IDApIHsKKwkJZGJnKCJGYWlsZWQgdG8gc2V0IEludGVybmFsL0V4dGVybmFsIFBIWSByZXNldCBjb250cm9sOiAlZCIsCisJCQkJCXJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwltc2xlZXAoMTUwKTsKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwKKwkJCQkweDAwMDAsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoIkZhaWxlZCB0byByZXNldCBSWF9DVEw6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwltZW1zZXQoYnVmLCAwLCBFVEhfQUxFTik7CisJaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lELAorCQkJCTAsIDAsIEVUSF9BTEVOLCBidWYpKSA8IDApIHsKKwkJZGJnKCJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzczogJWQiLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCW1lbWNweShkZXYtPm5ldC0+ZGV2X2FkZHIsIGJ1ZiwgRVRIX0FMRU4pOworCisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLAorCQkJCTAsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoIkVuYWJsaW5nIHNvZnR3YXJlIE1JSSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCWlmICgoKHJldCA9IGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NSUlfUkVHLAorCSAgICAgIAkJCTB4MDAxMCwgMiwgMiwgYnVmKSkgPCAwKQorCQkJfHwgKCooKHUxNiAqKWJ1ZikgIT0gMHgwMDNiKSkgeworCQlkYmcoIlJlYWQgUEhZIHJlZ2lzdGVyIDIgbXVzdCBiZSAweDNiMDA6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEluaXRpYWxpemUgTUlJIHN0cnVjdHVyZSAqLworCWRldi0+bWlpLmRldiA9IGRldi0+bmV0OworCWRldi0+bWlpLm1kaW9fcmVhZCA9IGF4ODgxN3hfbWRpb19yZWFkOworCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBheDg4MTd4X21kaW9fd3JpdGU7CisJZGV2LT5taWkucGh5X2lkX21hc2sgPSAweGZmOworCWRldi0+bWlpLnJlZ19udW1fbWFzayA9IDB4ZmY7CisJZGV2LT5uZXQtPmRvX2lvY3RsID0gYXg4ODE3eF9pb2N0bDsKKworCS8qIEdldCB0aGUgUEhZIGlkICovCisJaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUEhZX0lELAorCQkJMCwgMCwgMiwgYnVmKSkgPCAwKSB7CisJCWRiZygiRXJyb3IgcmVhZGluZyBQSFkgSUQ6ICUwMngiLCByZXQpOworCQlnb3RvIG91dDI7CisJfSBlbHNlIGlmIChyZXQgPCAyKSB7CisJCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gMiBieXRlcyAqLworCQlkYmcoIkFYX0NNRF9SRUFEX1BIWV9JRCByZXR1cm5lZCBsZXNzIHRoYW4gMiBieXRlczogcmV0PSUwMngiLAorCQkgICAgcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQyOworCX0KKwlkZXYtPm1paS5waHlfaWQgPSAqKCh1OCAqKWJ1ZiArIDEpOworCisJaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgQVhfU1dSRVNFVF9QUkwsCisJCQkJMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiU2V0IGV4dGVybmFsIFBIWSByZXNldCBwaW4gbGV2ZWw6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKwltc2xlZXAoMTUwKTsKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULAorCSAgICAgCQkJQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwsCisJCQkJMCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiU2V0IEludGVybmFsL0V4dGVybmFsIFBIWSByZXNldCBjb250cm9sOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisJbXNsZWVwKDE1MCk7CisKKworCWRldi0+bmV0LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBheDg4MTd4X3NldF9tdWx0aWNhc3Q7CisJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODg3NzJfZXRodG9vbF9vcHM7CisKKwlheDg4MTd4X21kaW9fd3JpdGVfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCWF4ODgxN3hfbWRpb193cml0ZV9sZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAorCQkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BKTsKKwltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CisKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLAorCQkJCUFYODg3NzJfTUVESVVNX0RFRkFVTFQsIDAsIDAsIGJ1ZikpIDwgMCkgeworCQlkYmcoIldyaXRlIG1lZGl1bSBtb2RlIHJlZ2lzdGVyOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0lQRzAsCisJCQkJQVg4ODc3Ml9JUEcwX0RFRkFVTFQgfCBBWDg4NzcyX0lQRzFfREVGQVVMVCwKKwkJCQlBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgYnVmKSkgPCAwKSB7CisJCWRiZygiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKwlpZiAoKHJldCA9CisJICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKSkgPCAwKSB7CisJCWRiZygiRmFpbGVkIHRvIHNldCBoYXJkd2FyZSBNSUk6ICUwMngiLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCisJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KKwlpZiAoKHJldCA9CisJICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIDB4MDA4OCwgMCwgMCwKKwkJCSAgICAgICBidWYpKSA8IDApIHsKKwkJZGJnKCJSZXNldCBSWF9DVEwgZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlrZnJlZShidWYpOworCisJLyogQXNpeCBmcmFtaW5nIHBhY2tzIG11bHRpcGxlIGV0aCBmcmFtZXMgaW50byBhIDJLIHVzYiBidWxrIHRyYW5zZmVyICovCisJaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX0FYKSB7CisJCS8qIGhhcmRfbXR1ICBpcyBzdGlsbCB0aGUgZGVmYXVsdCAtIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorCQkgICBqdW1ibyBldGggZnJhbWVzICovCisJCWRldi0+cnhfdXJiX3NpemUgPSAyMDQ4OworCX0KKworCXJldHVybiAwOworCitvdXQyOgorCWtmcmVlKGJ1Zik7CitvdXQxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODc3Ml9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggICpoZWFkOworCXUzMiAgaGVhZGVyOworCWNoYXIgKnBhY2tldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYXhfc2tiOworCXUxNiBzaXplOworCisJaGVhZCA9ICh1OCAqKSBza2ItPmRhdGE7CisJbWVtY3B5KCZoZWFkZXIsIGhlYWQsIHNpemVvZihoZWFkZXIpKTsKKwlsZTMyX3RvX2NwdXMoJmhlYWRlcik7CisJcGFja2V0ID0gaGVhZCArIHNpemVvZihoZWFkZXIpOworCisJc2tiX3B1bGwoc2tiLCA0KTsKKworCXdoaWxlIChza2ItPmxlbiA+IDApIHsKKwkJaWYgKChzaG9ydCkoaGVhZGVyICYgMHgwMDAwZmZmZikgIT0KKwkJICAgIH4oKHNob3J0KSgoaGVhZGVyICYgMHhmZmZmMDAwMCkgPj4gMTYpKSkgeworCQkJZGV2ZGJnKGRldiwiaGVhZGVyIGxlbmd0aCBkYXRhIGlzIGVycm9yIik7CisJCX0KKwkJLyogZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCXNpemUgPSAodTE2KSAoaGVhZGVyICYgMHgwMDAwZmZmZik7CisKKwkJaWYgKChza2ItPmxlbikgLSAoKHNpemUgKyAxKSAmIDB4ZmZmZSkgPT0gMCkKKwkJCXJldHVybiAyOworCQlpZiAoc2l6ZSA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlheF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGF4X3NrYikgeworCQkJYXhfc2tiLT5sZW4gPSBzaXplOworCQkJYXhfc2tiLT5kYXRhID0gcGFja2V0OworCQkJYXhfc2tiLT50YWlsID0gcGFja2V0ICsgc2l6ZTsKKwkJCXVzYm5ldF9za2JfcmV0dXJuKGRldiwgYXhfc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc2tiX3B1bGwoc2tiLCAoc2l6ZSArIDEpICYgMHhmZmZlKTsKKworCQlpZiAoc2tiLT5sZW4gPT0gMCkKKwkJCWJyZWFrOworCisJCWhlYWQgPSAodTggKikgc2tiLT5kYXRhOworCQltZW1jcHkoJmhlYWRlciwgaGVhZCwgc2l6ZW9mKGhlYWRlcikpOworCQlsZTMyX3RvX2NwdXMoJmhlYWRlcik7CisJCXBhY2tldCA9IGhlYWQgKyBzaXplb2YoaGVhZGVyKTsKKwkJc2tiX3B1bGwoc2tiLCA0KTsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPCAwKSB7CisJCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYXg4ODc3Ml90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXVuc2lnbmVkIGZsYWdzKQoreworCWludCBwYWRsZW47CisJaW50IGhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJaW50IHRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CisJdTMyIHBhY2tldF9sZW47CisJdTMyIHBhZGJ5dGVzID0gMHhmZmZmMDAwMDsKKworCXBhZGxlbiA9ICgoc2tiLT5sZW4gKyA0KSAlIDUxMikgPyAwIDogNDsKKworCWlmICgoIXNrYl9jbG9uZWQoc2tiKSkKKwkgICAgJiYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+PSAoNCArIHBhZGxlbikpKSB7CisJCWlmICgoaGVhZHJvb20gPCA0KSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIDQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIDQsIHBhZGxlbiwgZmxhZ3MpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBza2IyOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9wdXNoKHNrYiwgNCk7CisJcGFja2V0X2xlbiA9ICgoKHNrYi0+bGVuIC0gNCkgXiAweDAwMDBmZmZmKSA8PCAxNikgKyAoc2tiLT5sZW4gLSA0KTsKKwltZW1jcHkoc2tiLT5kYXRhLCAmcGFja2V0X2xlbiwgc2l6ZW9mKHBhY2tldF9sZW4pKTsKKworCWlmICgoc2tiLT5sZW4gJSA1MTIpID09IDApIHsKKwkJbWVtY3B5KCBza2ItPnRhaWwsICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CisJCXNrYl9wdXQoc2tiLCBzaXplb2YocGFkYnl0ZXMpKTsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBheDg4NzcyX2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNiBscGE7CisJdTE2IGFkdjsKKwl1MTYgcmVzOworCXUxNiBtb2RlOworCisJbW9kZSA9IEFYODg3NzJfTUVESVVNX0RFRkFVTFQ7CisJbHBhID0gYXg4ODE3eF9tZGlvX3JlYWRfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0xQQSk7CisJYWR2ID0gYXg4ODE3eF9tZGlvX3JlYWRfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7CisJcmVzID0gbWlpX253YXlfcmVzdWx0KGxwYXxhZHYpOworCisJaWYgKChyZXMgJiBMUEFfRFVQTEVYKSA9PSAwKQorCQltb2RlICY9IH5BWDg4NzcyX01FRElVTV9GVUxMX0RVUExFWDsKKwlpZiAoKHJlcyAmIExQQV8xMDApID09IDApCisJCW1vZGUgJj0gfkFYODg3NzJfTUVESVVNXzEwME1COworCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLCBtb2RlLCAwLCAwLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGF4ODgxN3hfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPSAiQVNJWCBBWDg4MTd4IFVTQiAyLjAgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3eF9iaW5kLAorCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCisJLmZsYWdzID0gIEZMQUdfRVRIRVIsCisJLmRhdGEgPSAweDAwMTMwMTAzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBkbGlua19kdWJfZTEwMF9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9ICJETGluayBEVUItRTEwMCBVU0IgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3eF9iaW5kLAorCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCisJLmZsYWdzID0gIEZMQUdfRVRIRVIsCisJLmRhdGEgPSAweDAwOWY5ZDlmLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBuZXRnZWFyX2ZhMTIwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0gIk5ldGdlYXIgRkEtMTIwIFVTQiBFdGhlcm5ldCIsCisJLmJpbmQgPSBheDg4MTd4X2JpbmQsCisJLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAorCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAorCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKKwkuZGF0YSA9IDB4MDAxMzAxMDMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGhhd2tpbmdfdWYyMDBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPSAiSGF3a2luZyBVRjIwMCBVU0IgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3eF9iaW5kLAorCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCisJLmZsYWdzID0gIEZMQUdfRVRIRVIsCisJLmRhdGEgPSAweDAwMWYxZDFmLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBheDg4NzcyX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0gIkFTSVggQVg4ODc3MiBVU0IgMi4wIEV0aGVybmV0IiwKKwkuYmluZCA9IGF4ODg3NzJfYmluZCwKKwkuc3RhdHVzID0gYXg4ODE3eF9zdGF0dXMsCisJLmxpbmtfcmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCisJLnJlc2V0ID0gYXg4ODc3Ml9saW5rX3Jlc2V0LAorCS5mbGFncyA9IEZMQUdfRVRIRVIgfCBGTEFHX0ZSQU1JTkdfQVgsCisJLnJ4X2ZpeHVwID0gYXg4ODc3Ml9yeF9maXh1cCwKKwkudHhfZml4dXAgPSBheDg4NzcyX3R4X2ZpeHVwLAorCS5kYXRhID0gMHgwMDEzMDEwMywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKK3sKKwkvLyBMaW5rc3lzIFVTQjIwME0KKwlVU0JfREVWSUNFICgweDA3N2IsIDB4MjIyNiksCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCit9LCB7CisJLy8gTmV0Z2VhciBGQTEyMAorCVVTQl9ERVZJQ0UgKDB4MDg0NiwgMHgxMDQwKSwKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZuZXRnZWFyX2ZhMTIwX2luZm8sCit9LCB7CisJLy8gRExpbmsgRFVCLUUxMDAKKwlVU0JfREVWSUNFICgweDIwMDEsIDB4MWEwMCksCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmZGxpbmtfZHViX2UxMDBfaW5mbywKK30sIHsKKwkvLyBJbnRlbGxpbmV0LCBTVCBMYWIgVVNCIEV0aGVybmV0CisJVVNCX0RFVklDRSAoMHgwYjk1LCAweDE3MjApLAorCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBIYXdraW5nIFVGMjAwLCBUcmVuZE5ldCBUVTItRVQxMDAKKwlVU0JfREVWSUNFICgweDA3YjgsIDB4NDIwYSksCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmaGF3a2luZ191ZjIwMF9pbmZvLAorfSwgeworICAgICAgICAvLyBCaWxsaW9udG9uIFN5c3RlbXMsIFVTQjJBUgorICAgICAgICBVU0JfREVWSUNFICgweDA4ZGQsIDB4OTBmZiksCisgICAgICAgIC5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBBVEVOIFVDMjEwVAorCVVTQl9ERVZJQ0UgKDB4MDU1NywgMHgyMDA5KSwKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCit9LCB7CisJLy8gQnVmZmFsbyBMVUEtVTItS1RYCisJVVNCX0RFVklDRSAoMHgwNDExLCAweDAwM2QpLAorCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBTaXRlY29tIExOLTAyOSAiVVNCIDIuMCAxMC8xMDAgRXRoZXJuZXQgYWRhcHRlciIKKwlVU0JfREVWSUNFICgweDYxODksIDB4MTgyZCksCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAorfSwgeworCS8vIGNvcmVnYSBGRXRoZXIgVVNCMi1UWAorCVVTQl9ERVZJQ0UgKDB4MDdhYSwgMHgwMDE3KSwKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCit9LCB7CisJLy8gU3VyZWNvbSBFUC0xNDI3WC0yCisJVVNCX0RFVklDRSAoMHgxMTg5LCAweDA4OTMpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAorfSwgeworCS8vIGdvb2R3YXkgY29ycCB1c2IgZ3d1c2IyZQorCVVTQl9ERVZJQ0UgKDB4MTYzMSwgMHg2MjAwKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKK30sIHsKKwkvLyBBU0lYIEFYODg3NzIgMTAvMTAwCisgICAgICAgIFVTQl9ERVZJQ0UgKDB4MGI5NSwgMHg3NzIwKSwKKyAgICAgICAgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhc2l4X2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiYXNpeCIsCisJLmlkX3RhYmxlID0JcHJvZHVjdHMsCisJLnByb2JlID0JdXNibmV0X3Byb2JlLAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCisJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFzaXhfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZhc2l4X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhc2l4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXNpeF9leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZhc2l4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhc2l4X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIb2xsaXMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVNJWCBBWDg4MTdYIGJhc2VkIFVTQiAyLjAgRXRoZXJuZXQgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jIGIvZHJpdmVycy91c2IvbmV0L2NhdGMuYwppbmRleCBjOGJlOTEyLi4zN2VmMzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMKQEAgLTM4Myw3ICszODMsNiBAQAogCiAJaWYgKHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7CiAJCWRiZygiVHggUmVzZXQuIik7Ci0JCXVyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXVyYi0+c3RhdHVzID0gMDsKIAkJY2F0Yy0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJCWNhdGMtPnN0YXRzLnR4X2Vycm9ycysrOwpAQCAtNDQ1LDcgKzQ0NCw2IEBACiAJc3RydWN0IGNhdGMgKmNhdGMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJd2FybigiVHJhbnNtaXQgdGltZWQgb3V0LiIpOwotCWNhdGMtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAl1c2JfdW5saW5rX3VyYihjYXRjLT50eF91cmIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyYjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC9jZGNfZXRoZXIuYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIENEQyBFdGhlcm5ldCBiYXNlZCBuZXR3b3JraW5nIHBlcmlwaGVyYWxzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBieSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvLyAjZGVmaW5lCURFQlVHCQkJLy8gZXJyb3IgcGF0aCBtZXNzYWdlcywgZXh0cmEgaW5mbworLy8gI2RlZmluZQlWRVJCT1NFCQkJLy8gbW9yZTsgc3VjY2VzcyBtZXNzYWdlcworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYJQ09ORklHX1VTQl9ERUJVRworIyAgIGRlZmluZSBERUJVRworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfY2RjLmg+CisKKyNpbmNsdWRlICJ1c2JuZXQuaCIKKworCisvKgorICogcHJvYmVzIGNvbnRyb2wgaW50ZXJmYWNlLCBjbGFpbXMgZGF0YSBpbnRlcmZhY2UsIGNvbGxlY3RzIHRoZSBidWxrCisgKiBlbmRwb2ludHMsIGFjdGl2YXRlcyBkYXRhIGludGVyZmFjZSAoaWYgbmVlZGVkKSwgbWF5YmUgc2V0cyBNVFUuCisgKiBhbGwgcHVyZSBjZGMsIGV4Y2VwdCBmb3IgY2VydGFpbiBmaXJtd2FyZSB3b3JrYXJvdW5kcywgYW5kIGtub3dpbmcKKyAqIHRoYXQgcm5kaXMgdXNlcyBvbmUgZGlmZmVyZW50IHJ1bGUuCisgKi8KK2ludCB1c2JuZXRfZ2VuZXJpY19jZGNfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXU4CQkJCSpidWYgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmE7CisJaW50CQkJCWxlbiA9IGludGYtPmN1cl9hbHRzZXR0aW5nLT5leHRyYWxlbjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCSpkOworCXN0cnVjdCBjZGNfc3RhdGUJCSppbmZvID0gKHZvaWQgKikgJmRldi0+ZGF0YTsKKwlpbnQJCQkJc3RhdHVzOworCWludAkJCQlybmRpczsKKwlzdHJ1Y3QgdXNiX2RyaXZlcgkJKmRyaXZlciA9IGRyaXZlcl9vZihpbnRmKTsKKworCWlmIChzaXplb2YgZGV2LT5kYXRhIDwgc2l6ZW9mICppbmZvKQorCQlyZXR1cm4gLUVET007CisKKwkvKiBleHBlY3Qgc3RyaWN0IHNwZWMgY29uZm9ybWFuY2UgZm9yIHRoZSBkZXNjcmlwdG9ycywgYnV0CisJICogY29wZSB3aXRoIGZpcm13YXJlIHdoaWNoIHN0b3JlcyB0aGVtIGluIHRoZSB3cm9uZyBwbGFjZQorCSAqLworCWlmIChsZW4gPT0gMCAmJiBkZXYtPnVkZXYtPmFjdGNvbmZpZy0+ZXh0cmFsZW4pIHsKKwkJLyogTW90b3JvbGEgU0I0MTAwIChhbmQgb3RoZXJzOiBCcmFkIEhhcmRzIHNheXMgaXQncworCQkgKiBmcm9tIGEgQnJvYWRjb20gZGVzaWduKSBwdXQgQ0RDIGRlc2NyaXB0b3JzIGhlcmUKKwkJICovCisJCWJ1ZiA9IGRldi0+dWRldi0+YWN0Y29uZmlnLT5leHRyYTsKKwkJbGVuID0gZGV2LT51ZGV2LT5hY3Rjb25maWctPmV4dHJhbGVuOworCQlpZiAobGVuKQorCQkJZGV2X2RiZygmaW50Zi0+ZGV2LAorCQkJCSJDREMgZGVzY3JpcHRvcnMgb24gY29uZmlnXG4iKTsKKwl9CisKKwkvKiB0aGlzIGFzc3VtZXMgdGhhdCBpZiB0aGVyZSdzIGEgbm9uLVJORElTIHZlbmRvciB2YXJpYW50CisJICogb2YgY2RjLWFjbSwgaXQnbGwgZmFpbCBSTkRJUyByZXF1ZXN0cyBjbGVhbmx5LgorCSAqLworCXJuZGlzID0gKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSAweGZmKTsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YgKmluZm8pOworCWluZm8tPmNvbnRyb2wgPSBpbnRmOworCXdoaWxlIChsZW4gPiAzKSB7CisJCWlmIChidWYgWzFdICE9IFVTQl9EVF9DU19JTlRFUkZBQ0UpCisJCQlnb3RvIG5leHRfZGVzYzsKKworCQkvKiB1c2UgYkRlc2NyaXB0b3JTdWJUeXBlIHRvIGlkZW50aWZ5IHRoZSBDREMgZGVzY3JpcHRvcnMuCisJCSAqIFdlIGV4cGVjdCBkZXZpY2VzIHdpdGggQ0RDIGhlYWRlciBhbmQgdW5pb24gZGVzY3JpcHRvcnMuCisJCSAqIEZvciBDREMgRXRoZXJuZXQgd2UgbmVlZCB0aGUgZXRoZXJuZXQgZGVzY3JpcHRvci4KKwkJICogRm9yIFJORElTLCBpZ25vcmUgdHdvIChwb2ludGxlc3MpIENEQyBtb2RlbSBkZXNjcmlwdG9ycworCQkgKiBpbiBmYXZvciBvZiBhIGNvbXBsaWNhdGVkIE9JRC1iYXNlZCBSUEMgc2NoZW1lIGRvaW5nIHdoYXQKKwkJICogQ0RDIEV0aGVybmV0IGFjaGlldmVzIHdpdGggYSBzaW1wbGUgZGVzY3JpcHRvci4KKwkJICovCisJCXN3aXRjaCAoYnVmIFsyXSkgeworCQljYXNlIFVTQl9DRENfSEVBREVSX1RZUEU6CisJCQlpZiAoaW5mby0+aGVhZGVyKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiZXh0cmEgQ0RDIGhlYWRlclxuIik7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWluZm8tPmhlYWRlciA9ICh2b2lkICopIGJ1ZjsKKwkJCWlmIChpbmZvLT5oZWFkZXItPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT5oZWFkZXIpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJDREMgaGVhZGVyIGxlbiAldVxuIiwKKwkJCQkJaW5mby0+aGVhZGVyLT5iTGVuZ3RoKTsKKwkJCQlnb3RvIGJhZF9kZXNjOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVVNCX0NEQ19VTklPTl9UWVBFOgorCQkJaWYgKGluZm8tPnUpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJleHRyYSBDREMgdW5pb25cbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlpbmZvLT51ID0gKHZvaWQgKikgYnVmOworCQkJaWYgKGluZm8tPnUtPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT51KSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiQ0RDIHVuaW9uIGxlbiAldVxuIiwKKwkJCQkJaW5mby0+dS0+Ykxlbmd0aCk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKworCQkJLyogd2UgbmVlZCBhIG1hc3Rlci9jb250cm9sIGludGVyZmFjZSAod2hhdCB3ZSdyZQorCQkJICogcHJvYmVkIHdpdGgpIGFuZCBhIHNsYXZlL2RhdGEgaW50ZXJmYWNlOyB1bmlvbgorCQkJICogZGVzY3JpcHRvcnMgc29ydCB0aGlzIGFsbCBvdXQuCisJCQkgKi8KKwkJCWluZm8tPmNvbnRyb2wgPSB1c2JfaWZudW1fdG9faWYoZGV2LT51ZGV2LAorCQkJCQkJaW5mby0+dS0+Yk1hc3RlckludGVyZmFjZTApOworCQkJaW5mby0+ZGF0YSA9IHVzYl9pZm51bV90b19pZihkZXYtPnVkZXYsCisJCQkJCQlpbmZvLT51LT5iU2xhdmVJbnRlcmZhY2UwKTsKKwkJCWlmICghaW5mby0+Y29udHJvbCB8fCAhaW5mby0+ZGF0YSkgeworCQkJCWRldl9kYmcoJmludGYtPmRldiwKKwkJCQkJIm1hc3RlciAjJXUvJXAgc2xhdmUgIyV1LyVwXG4iLAorCQkJCQlpbmZvLT51LT5iTWFzdGVySW50ZXJmYWNlMCwKKwkJCQkJaW5mby0+Y29udHJvbCwKKwkJCQkJaW5mby0+dS0+YlNsYXZlSW50ZXJmYWNlMCwKKwkJCQkJaW5mby0+ZGF0YSk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWlmIChpbmZvLT5jb250cm9sICE9IGludGYpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJib2d1cyBDREMgVW5pb25cbiIpOworCQkJCS8qIEFtYml0IFVTQiBDYWJsZSBNb2RlbSAoYW5kIG1heWJlIG90aGVycykKKwkJCQkgKiBpbnRlcmNoYW5nZXMgbWFzdGVyIGFuZCBzbGF2ZSBpbnRlcmZhY2UuCisJCQkJICovCisJCQkJaWYgKGluZm8tPmRhdGEgPT0gaW50ZikgeworCQkJCQlpbmZvLT5kYXRhID0gaW5mby0+Y29udHJvbDsKKwkJCQkJaW5mby0+Y29udHJvbCA9IGludGY7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisKKwkJCS8qIGEgZGF0YSBpbnRlcmZhY2UgYWx0c2V0dGluZyBkb2VzIHRoZSByZWFsIGkvbyAqLworCQkJZCA9ICZpbmZvLT5kYXRhLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKKwkJCWlmIChkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0NEQ19EQVRBKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAic2xhdmUgY2xhc3MgJXVcbiIsCisJCQkJCWQtPmJJbnRlcmZhY2VDbGFzcyk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVTQl9DRENfRVRIRVJORVRfVFlQRToKKwkJCWlmIChpbmZvLT5ldGhlcikgeworCQkJCWRldl9kYmcoJmludGYtPmRldiwgImV4dHJhIENEQyBldGhlclxuIik7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWluZm8tPmV0aGVyID0gKHZvaWQgKikgYnVmOworCQkJaWYgKGluZm8tPmV0aGVyLT5iTGVuZ3RoICE9IHNpemVvZiAqaW5mby0+ZXRoZXIpIHsKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJDREMgZXRoZXIgbGVuICV1XG4iLAorCQkJCQlpbmZvLT5ldGhlci0+Ykxlbmd0aCk7CisJCQkJZ290byBiYWRfZGVzYzsKKwkJCX0KKwkJCWRldi0+aGFyZF9tdHUgPSBsZTE2X3RvX2NwdSgKKwkJCQkJCWluZm8tPmV0aGVyLT53TWF4U2VnbWVudFNpemUpOworCQkJLyogYmVjYXVzZSBvZiBaYXVydXMsIHdlIG1heSBiZSBpZ25vcmluZyB0aGUgaG9zdAorCQkJICogc2lkZSBsaW5rIGFkZHJlc3Mgd2Ugd2VyZSBnaXZlbi4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KK25leHRfZGVzYzoKKwkJbGVuIC09IGJ1ZiBbMF07CS8qIGJMZW5ndGggKi8KKwkJYnVmICs9IGJ1ZiBbMF07CisJfQorCisJaWYgKCFpbmZvLT5oZWFkZXIgfHwgIWluZm8tPnUgfHwgKCFybmRpcyAmJiAhaW5mby0+ZXRoZXIpKSB7CisJCWRldl9kYmcoJmludGYtPmRldiwgIm1pc3NpbmcgY2RjICVzJXMlc2Rlc2NyaXB0b3JcbiIsCisJCQlpbmZvLT5oZWFkZXIgPyAiIiA6ICJoZWFkZXIgIiwKKwkJCWluZm8tPnUgPyAiIiA6ICJ1bmlvbiAiLAorCQkJaW5mby0+ZXRoZXIgPyAiIiA6ICJldGhlciAiKTsKKwkJZ290byBiYWRfZGVzYzsKKwl9CisKKwkvKiBjbGFpbSBkYXRhIGludGVyZmFjZSBhbmQgc2V0IGl0IHVwIC4uLiB3aXRoIHNpZGUgZWZmZWN0cy4KKwkgKiBuZXR3b3JrIHRyYWZmaWMgY2FuJ3QgZmxvdyB1bnRpbCBhbiBhbHRzZXR0aW5nIGlzIGVuYWJsZWQuCisJICovCisJc3RhdHVzID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoZHJpdmVyLCBpbmZvLT5kYXRhLCBkZXYpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IHVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldiwgaW5mby0+ZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJLyogZW5zdXJlIGltbWVkaWF0ZSBleGl0IGZyb20gdXNibmV0X2Rpc2Nvbm5lY3QgKi8KKwkJdXNiX3NldF9pbnRmZGF0YShpbmZvLT5kYXRhLCBOVUxMKTsKKwkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZShkcml2ZXIsIGluZm8tPmRhdGEpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHN0YXR1cyBlbmRwb2ludDogb3B0aW9uYWwgZm9yIENEQyBFdGhlcm5ldCwgbm90IFJORElTIChvciBBQ00pICovCisJZGV2LT5zdGF0dXMgPSBOVUxMOworCWlmIChpbmZvLT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzID09IDEpIHsKKwkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjOworCisJCWRldi0+c3RhdHVzID0gJmluZm8tPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludCBbMF07CisJCWRlc2MgPSAmZGV2LT5zdGF0dXMtPmRlc2M7CisJCWlmIChkZXNjLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UCisJCQkJfHwgIShkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKKwkJCQl8fCAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpCisJCQkJCTwgc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbikpCisJCQkJfHwgIWRlc2MtPmJJbnRlcnZhbCkgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiYmFkIG5vdGlmaWNhdGlvbiBlbmRwb2ludFxuIik7CisJCQlkZXYtPnN0YXR1cyA9IE5VTEw7CisJCX0KKwl9CisJaWYgKHJuZGlzICYmICFkZXYtPnN0YXR1cykgeworCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJtaXNzaW5nIFJORElTIHN0YXR1cyBlbmRwb2ludFxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+ZGF0YSwgTlVMTCk7CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyLCBpbmZvLT5kYXRhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworCitiYWRfZGVzYzoKKwlkZXZfaW5mbygmZGV2LT51ZGV2LT5kZXYsICJiYWQgQ0RDIGRlc2NyaXB0b3JzXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKTsKKwordm9pZCB1c2JuZXRfY2RjX3VuYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBjZGNfc3RhdGUJCSppbmZvID0gKHZvaWQgKikgJmRldi0+ZGF0YTsKKwlzdHJ1Y3QgdXNiX2RyaXZlcgkJKmRyaXZlciA9IGRyaXZlcl9vZihpbnRmKTsKKworCS8qIGRpc2Nvbm5lY3QgbWFzdGVyIC0tPiBkaXNjb25uZWN0IHNsYXZlICovCisJaWYgKGludGYgPT0gaW5mby0+Y29udHJvbCAmJiBpbmZvLT5kYXRhKSB7CisJCS8qIGVuc3VyZSBpbW1lZGlhdGUgZXhpdCBmcm9tIHVzYm5ldF9kaXNjb25uZWN0ICovCisJCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+ZGF0YSwgTlVMTCk7CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyLCBpbmZvLT5kYXRhKTsKKwkJaW5mby0+ZGF0YSA9IE5VTEw7CisJfQorCisJLyogYW5kIHZpY2UgdmVyc2EgKGp1c3QgaW4gY2FzZSkgKi8KKwllbHNlIGlmIChpbnRmID09IGluZm8tPmRhdGEgJiYgaW5mby0+Y29udHJvbCkgeworCQkvKiBlbnN1cmUgaW1tZWRpYXRlIGV4aXQgZnJvbSB1c2JuZXRfZGlzY29ubmVjdCAqLworCQl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmNvbnRyb2wsIE5VTEwpOworCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKGRyaXZlciwgaW5mby0+Y29udHJvbCk7CisJCWluZm8tPmNvbnRyb2wgPSBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9jZGNfdW5iaW5kKTsKKworDAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ29tbXVuaWNhdGlvbnMgRGV2aWNlIENsYXNzLCBFdGhlcm5ldCBDb250cm9sIG1vZGVsCisgKgorICogVGFrZXMgdHdvIGludGVyZmFjZXMuICBUaGUgREFUQSBpbnRlcmZhY2UgaXMgaW5hY3RpdmUgdGlsbCBhbiBhbHRzZXR0aW5nCisgKiBpcyBzZWxlY3RlZC4gIENvbmZpZ3VyYXRpb24gZGF0YSBpbmNsdWRlcyBjbGFzcyBkZXNjcmlwdG9ycy4gIFRoZXJlJ3MKKyAqIGFuIG9wdGlvbmFsIHN0YXR1cyBlbmRwb2ludCBvbiB0aGUgY29udHJvbCBpbnRlcmZhY2UuCisgKgorICogVGhpcyBzaG91bGQgaW50ZXJvcCB3aXRoIHdoYXRldmVyIHRoZSAyLjQgIkNEQ0V0aGVyLmMiIGRyaXZlcgorICogKGJ5IEJyYWQgSGFyZHMpIHRhbGtlZCB3aXRoLCB3aXRoIG1vcmUgZnVuY3Rpb25hbGl0eS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBkdW1wc3BlZWQoc3RydWN0IHVzYm5ldCAqZGV2LCBfX2xlMzIgKnNwZWVkcykKK3sKKwlpZiAobmV0aWZfbXNnX3RpbWVyKGRldikpCisJCWRldmluZm8oZGV2LCAibGluayBzcGVlZHM6ICV1IGticHMgdXAsICV1IGticHMgZG93biIsCisJCQlfX2xlMzJfdG9fY3B1KHNwZWVkc1swXSkgLyAxMDAwLAorCQlfX2xlMzJfdG9fY3B1KHNwZWVkc1sxXSkgLyAxMDAwKTsKK30KKworc3RhdGljIHZvaWQgY2RjX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24JKmV2ZW50OworCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHNpemVvZiAqZXZlbnQpCisJCXJldHVybjsKKworCS8qIFNQRUVEX0NIQU5HRSBjYW4gZ2V0IHNwbGl0IGludG8gdHdvIDgtYnl0ZSBwYWNrZXRzICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9TVFNfU1BMSVQsICZkZXYtPmZsYWdzKSkgeworCQlkdW1wc3BlZWQoZGV2LCAoX19sZTMyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJcmV0dXJuOworCX0KKworCWV2ZW50ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJc3dpdGNoIChldmVudC0+Yk5vdGlmaWNhdGlvblR5cGUpIHsKKwljYXNlIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTjoKKwkJaWYgKG5ldGlmX21zZ190aW1lcihkZXYpKQorCQkJZGV2ZGJnKGRldiwgIkNEQzogY2FycmllciAlcyIsCisJCQkJCWV2ZW50LT53VmFsdWUgPyAib24iIDogIm9mZiIpOworCQlpZiAoZXZlbnQtPndWYWx1ZSkKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldCk7CisJCWJyZWFrOworCWNhc2UgVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFOgkvKiB0eC9yeCByYXRlcyAqLworCQlpZiAobmV0aWZfbXNnX3RpbWVyKGRldikpCisJCQlkZXZkYmcoZGV2LCAiQ0RDOiBzcGVlZCBjaGFuZ2UgKGxlbiAlZCkiLAorCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOworCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IChzaXplb2YgKmV2ZW50ICsgOCkpCisJCQlzZXRfYml0KEVWRU5UX1NUU19TUExJVCwgJmRldi0+ZmxhZ3MpOworCQllbHNlCisJCQlkdW1wc3BlZWQoZGV2LCAoX19sZTMyICopICZldmVudFsxXSk7CisJCWJyZWFrOworCS8qIFVTQl9DRENfTk9USUZZX1JFU1BPTlNFX0FWQUlMQUJMRSBjYW4gaGFwcGVuIHRvbyAoZS5nLiBSTkRJUyksCisJICogYnV0IHRoZXJlIGFyZSBubyBzdGFuZGFyZCBmb3JtYXRzIGZvciB0aGUgcmVzcG9uc2UgZGF0YS4KKwkgKi8KKwlkZWZhdWx0OgorCQlkZXZlcnIoZGV2LCAiQ0RDOiB1bmV4cGVjdGVkIG5vdGlmaWNhdGlvbiAlMDJ4ISIsCisJCQkJIGV2ZW50LT5iTm90aWZpY2F0aW9uVHlwZSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHU4IG5pYmJsZSh1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGxpa2VseShpc2RpZ2l0KGMpKSkKKwkJcmV0dXJuIGMgLSAnMCc7CisJYyA9IHRvdXBwZXIoYyk7CisJaWYgKGxpa2VseShpc3hkaWdpdChjKSkpCisJCXJldHVybiAxMCArIGMgLSAnQSc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitnZXRfZXRoZXJuZXRfYWRkcihzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MgKmUpCit7CisJaW50IAkJdG1wLCBpOworCXVuc2lnbmVkIGNoYXIJYnVmIFsxM107CisKKwl0bXAgPSB1c2Jfc3RyaW5nKGRldi0+dWRldiwgZS0+aU1BQ0FkZHJlc3MsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJaWYgKHRtcCAhPSAxMikgeworCQlkZXZfZGJnKCZkZXYtPnVkZXYtPmRldiwKKwkJCSJiYWQgTUFDIHN0cmluZyAlZCBmZXRjaCwgJWRcbiIsIGUtPmlNQUNBZGRyZXNzLCB0bXApOworCQlpZiAodG1wID49IDApCisJCQl0bXAgPSAtRUlOVkFMOworCQlyZXR1cm4gdG1wOworCX0KKwlmb3IgKGkgPSB0bXAgPSAwOyBpIDwgNjsgaSsrLCB0bXAgKz0gMikKKwkJZGV2LT5uZXQtPmRldl9hZGRyIFtpXSA9CisJCQkobmliYmxlKGJ1ZiBbdG1wXSkgPDwgNCkgKyBuaWJibGUoYnVmIFt0bXAgKyAxXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2RjX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQJCQkJc3RhdHVzOworCXN0cnVjdCBjZGNfc3RhdGUJCSppbmZvID0gKHZvaWQgKikgJmRldi0+ZGF0YTsKKworCXN0YXR1cyA9IHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKGRldiwgaW50Zik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBnZXRfZXRoZXJuZXRfYWRkcihkZXYsIGluZm8tPmV0aGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmRhdGEsIE5VTEwpOworCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKGRyaXZlcl9vZihpbnRmKSwgaW5mby0+ZGF0YSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogRklYTUUgY2RjLWV0aGVyIGhhcyBzb21lIG11bHRpY2FzdCBjb2RlIHRvbywgdGhvdWdoIGl0IGNvbXBsYWlucworCSAqIGluIHJvdXRpbmUgY2FzZXMuICBpbmZvLT5ldGhlciBkZXNjcmliZXMgdGhlIG11bHRpY2FzdCBzdXBwb3J0LgorCSAqIEltcGxlbWVudCB0aGF0IGhlcmUsIG1hbmlwdWxhdGluZyB0aGUgY2RjIGZpbHRlciBhcyBuZWVkZWQuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JY2RjX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIkNEQyBFdGhlcm5ldCBEZXZpY2UiLAorCS5mbGFncyA9CUZMQUdfRVRIRVIsCisJLy8gLmNoZWNrX2Nvbm5lY3QgPSBjZGNfY2hlY2tfY29ubmVjdCwKKwkuYmluZCA9CQljZGNfYmluZCwKKwkudW5iaW5kID0JdXNibmV0X2NkY191bmJpbmQsCisJLnN0YXR1cyA9CWNkY19zdGF0dXMsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKKy8qCisgKiBCTEFDS0xJU1QgISEKKyAqCisgKiBGaXJzdCBibGFja2xpc3QgYW55IHByb2R1Y3RzIHRoYXQgYXJlIGVncmVnaW91c2x5IG5vbmNvbmZvcm1hbnQKKyAqIHdpdGggdGhlIENEQyBFdGhlcm5ldCBzcGVjcy4gIE1pbm9yIGJyYWluZGFtYWdlIHdlIGNvcGUgd2l0aDsgd2hlbgorICogdGhleSdyZSBub3QgZXZlbiB0cnlpbmcsIG5lZWRpbmcgYSBzZXBhcmF0ZSBkcml2ZXIgaXMgb25seSB0aGUgZmlyc3QKKyAqIG9mIHRoZSBkaWZmZXJlbmNlcyB0byBzaG93IHVwLgorICovCisKKyNkZWZpbmUJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UgXAorCS5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfQ09NTSwgXAorCS5iSW50ZXJmYWNlU3ViQ2xhc3MJPSBVU0JfQ0RDX1NVQkNMQVNTX0VUSEVSTkVULCBcCisJLmJJbnRlcmZhY2VQcm90b2NvbAk9IFVTQl9DRENfUFJPVE9fTk9ORQorCisvKiBTQS0xMTAwIGJhc2VkIFNoYXJwIFphdXJ1cyAoImNvbGxpZSIpLCBvciBjb21wYXRpYmxlOworICogd2lyZS1pbmNvbXBhdGlibGUgd2l0aCB0cnVlIENEQyBFdGhlcm5ldCBpbXBsZW1lbnRhdGlvbnMuCisgKiAoQW5kLCBpdCBzZWVtcywgbmVlZGxlc3NseSBzby4uLikKKyAqLworeworCS5tYXRjaF9mbGFncwk9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCQkJICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvcgkJPSAweDA0REQsCisJLmlkUHJvZHVjdAkJPSAweDgwMDQsCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LAorCisvKiBQWEEtMjV4IGJhc2VkIFNoYXJwIFphdXJpaS4gIE5vdGUgdGhhdCBpdCBzZWVtcyBzb21lIG9mIHRoZXNlCisgKiAobGF0ZXIgbW9kZWxzIGVzcGVjaWFsbHkpIG1heSBoYXZlIHNoaXBwZWQgb25seSB3aXRoIGZpcm13YXJlCisgKiBhZHZlcnRpc2luZyBmYWxzZSAiQ0RDIE1ETE0iIGNvbXBhdGliaWxpdHkgLi4uIGJ1dCB3ZSdyZSBub3QKKyAqIGNsZWFyIHdoaWNoIG1vZGVscyBkaWQgdGhhdCwgc28gZm9yIG5vdyBsZXQncyBhc3N1bWUgdGhlIHdvcnN0LgorICovCit7CisJLm1hdGNoX2ZsYWdzCT0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCQkgIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yCQk9IDB4MDRERCwKKwkuaWRQcm9kdWN0CQk9IDB4ODAwNSwJLyogQS0zMDAgKi8KKwlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKKwkuZHJpdmVyX2luZm8JCT0gMCwKK30sIHsKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA2LAkvKiBCLTUwMC9TTC01NjAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJICAgICAgICAgIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yCQk9IDB4MDRERCwKKwkuaWRQcm9kdWN0CQk9IDB4ODAwNywJLyogQy03MDAgKi8KKwlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKKwkuZHJpdmVyX2luZm8JCT0gMCwKK30sIHsKKwkubWF0Y2hfZmxhZ3MgICAgPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yICAgICAgICAgICAgICAgPSAweDA0REQsCisJLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDkwMzEsCS8qIEMtNzUwIEMtNzYwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAorCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDMyLAkvKiBTTC02MDAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAorCS8qIHJlcG9ydGVkIHdpdGggc29tZSBDODYwIHVuaXRzICovCisJLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDkwNTAsCS8qIEMtODYwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvCQk9IDAsCit9LAorCisvKgorICogV0hJVEVMSVNUISEhCisgKgorICogQ0RDIEV0aGVyIHVzZXMgdHdvIGludGVyZmFjZXMsIG5vdCBuZWNlc3NhcmlseSBjb25zZWN1dGl2ZS4KKyAqIFdlIG1hdGNoIHRoZSBtYWluIGludGVyZmFjZSwgaWdub3JpbmcgdGhlIG9wdGlvbmFsIGRldmljZQorICogY2xhc3Mgc28gd2UgY291bGQgaGFuZGxlIGRldmljZXMgdGhhdCBhcmVuJ3QgZXhjbHVzaXZlbHkKKyAqIENEQyBldGhlci4KKyAqCisgKiBOT1RFOiAgdGhpcyBtYXRjaCBtdXN0IGNvbWUgQUZURVIgZW50cmllcyBibGFja2xpc3RpbmcgZGV2aWNlcworICogYmVjYXVzZSBvZiBidWdzL3F1aXJrcyBpbiBhIGdpdmVuIHByb2R1Y3QgKGxpa2UgWmF1cnVzLCBhYm92ZSkuCisgKi8KK3sKKwlVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQsCisJCQlVU0JfQ0RDX1BST1RPX05PTkUpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY2RjX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjZGNfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJjZGNfZXRoZXIiLAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorCS5wcm9iZSA9CXVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGNkY19pbml0KHZvaWQpCit7CisJQlVHX09OKChzaXplb2YoKChzdHJ1Y3QgdXNibmV0ICopMCktPmRhdGEpCisJCQk8IHNpemVvZihzdHJ1Y3QgY2RjX3N0YXRlKSkpOworCisgCXJldHVybiB1c2JfcmVnaXN0ZXIoJmNkY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoY2RjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2RjX2V4aXQodm9pZCkKK3sKKyAJdXNiX2RlcmVnaXN0ZXIoJmNkY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoY2RjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgQ0RDIEV0aGVybmV0IGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9jZGNfc3Vic2V0LmMgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX3N1YnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzMwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX3N1YnNldC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogU2ltcGxlICJDREMgU3Vic2V0IiBVU0IgTmV0d29ya2luZyBMaW5rcworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qCisgKiBUaGlzIHN1cHBvcnRzIHNpbXBsZSBVU0IgbmV0d29yayBsaW5rcyB0aGF0IGRvbid0IHJlcXVpcmUgYW55IHNwZWNpYWwKKyAqIGZyYW1pbmcgb3IgaGFyZHdhcmUgY29udHJvbCBvcGVyYXRpb25zLiAgVGhlIHByb3RvY29sIHVzZWQgaGVyZSBpcyBhCisgKiBzdHJpY3Qgc3Vic2V0IG9mIENEQyBFdGhlcm5ldCwgd2l0aCB0aHJlZSBiYXNpYyBkaWZmZXJlbmNlcyByZWZsZWN0aW5nCisgKiB0aGUgZ29hbCB0aGF0IGFsbW9zdCBhbnkgaGFyZHdhcmUgc2hvdWxkIHJ1biBpdDoKKyAqCisgKiAgLSBNaW5pbWFsIHJ1bnRpbWUgY29udHJvbDogIG9uZSBpbnRlcmZhY2UsIG5vIGFsdHNldHRpbmdzLCBhbmQKKyAqICAgIG5vIHZlbmRvciBvciBjbGFzcyBzcGVjaWZpYyBjb250cm9sIHJlcXVlc3RzLiAgSWYgYSBkZXZpY2UgaXMKKyAqICAgIGNvbmZpZ3VyZWQsIGl0IGlzIGFsbG93ZWQgdG8gZXhjaGFuZ2UgcGFja2V0cyB3aXRoIHRoZSBob3N0LgorICogICAgRmFuY2llciBtb2RlbHMgd291bGQgbWVhbiBub3Qgd29ya2luZyBvbiBzb21lIGhhcmR3YXJlLgorICoKKyAqICAtIE1pbmltYWwgbWFudWZhY3R1cmluZyBjb250cm9sOiAgbm8gSUVFRSAiT3JnYW5pemF0aW9uYWxseQorICogICAgVW5pcXVlIElEIiByZXF1aXJlZCwgb3IgYW4gRUVQUk9NcyB0byBzdG9yZSBvbmUuICBFYWNoIGhvc3QgdXNlcworICogICAgb25lIHJhbmRvbSAibG9jYWxseSBhc3NpZ25lZCIgRXRoZXJuZXQgYWRkcmVzcyBpbnN0ZWFkLCB3aGljaCBjYW4KKyAqICAgIG9mIGNvdXJzZSBiZSBvdmVycmlkZGVuIHVzaW5nIHN0YW5kYXJkIHRvb2xzIGxpa2UgImlmY29uZmlnIi4KKyAqICAgIChXaXRoIDJeNDYgc3VjaCBhZGRyZXNzZXMsIHNhbWUtbmV0IGNvbGxpc2lvbnMgYXJlIHF1aXRlIHJhcmUuKQorICoKKyAqICAtIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgZnJhbWluZyBkYXRhIGZvciBVU0IuICBQYWNrZXRzIGFyZSB3cml0dGVuCisgKiAgICBleGFjdGx5IGFzIGluIENEQyBFdGhlcm5ldCwgc3RhcnRpbmcgd2l0aCBhbiBFdGhlcm5ldCBoZWFkZXIgYW5kCisgKiAgICB0ZXJtaW5hdGVkIGJ5IGEgc2hvcnQgcGFja2V0LiAgSG93ZXZlciwgdGhlIGhvc3Qgd2lsbCBuZXZlciBzZW5kIGEKKyAqICAgIHplcm8gbGVuZ3RoIHBhY2tldDsgc29tZSBzeXN0ZW1zIGNhbid0IGhhbmRsZSB0aG9zZSByb2J1c3RseS4KKyAqCisgKiBBbnl0aGluZyB0aGF0IGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBVU0IgYnVsayBwYWNrZXRzIGNhbiBpbXBsZW1lbnQKKyAqIHRoaXMgcHJvdG9jb2wuICBUaGF0IGluY2x1ZGVzIGJvdGggc21hcnQgcGVyaXBoZXJhbHMgYW5kIHF1aXRlIGEgbG90CisgKiBvZiAiaG9zdC10by1ob3N0IiBVU0IgY2FibGVzICh3aGljaCBlbWJlZCB0d28gZGV2aWNlcyBiYWNrLXRvLWJhY2spLgorICoKKyAqIE5vdGUgdGhhdCBhbHRob3VnaCBMaW51eCBtYXkgdXNlIG1hbnkgb2YgdGhvc2UgaG9zdC10by1ob3N0IGxpbmtzCisgKiB3aXRoIHRoaXMgImNkY19zdWJzZXQiIGZyYW1pbmcsIHRoYXQgZG9lc24ndCBtZWFuIHRoZXJlIG1heSBub3QgYmUgYQorICogYmV0dGVyIGFwcHJvYWNoLiAgSGFuZGxpbmcgdGhlICJvdGhlciBlbmQgdW5wbHVncy9yZXBsdWdzIiBzY2VuYXJpbworICogd2VsbCB0ZW5kcyB0byByZXF1aXJlIGNoaXAtc3BlY2lmaWMgdmVuZG9yIHJlcXVlc3RzLiAgQWxzbywgV2luZG93cworICogcGVlcnMgYXQgdGhlIG90aGVyIGVuZCBvZiBob3N0LXRvLWhvc3QgY2FibGVzIG1heSBleHBlY3QgdGhlaXIgb3duCisgKiBmcmFtaW5nIHRvIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhpcyAiY2RjX3N1YnNldCIgbW9kZWwuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9FUFNPTjI4ODgpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9BUk1MSU5VWCkKKy8qIFBEQSBzdHlsZSBkZXZpY2VzIGFyZSBhbHdheXMgY29ubmVjdGVkIGlmIHByZXNlbnQgKi8KK3N0YXRpYyBpbnQgYWx3YXlzX2Nvbm5lY3RlZCAoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0FMSV9NNTYzMgorI2RlZmluZQlIQVZFX0hBUkRXQVJFCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEFMaSBNNTYzMiBkcml2ZXIgLi4uIGRvZXMgaGlnaCBzcGVlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYWxpX201NjMyX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIkFMaSBNNTYzMiIsCit9OworCisKKyNlbmRpZgorCisMCisjaWZkZWYJQ09ORklHX1VTQl9BTjI3MjAKKyNkZWZpbmUJSEFWRV9IQVJEV0FSRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBbmNob3JDaGlwcyAyNzIwIGRyaXZlciAuLi4gaHR0cDovL3d3dy5jeXByZXNzLmNvbQorICoKKyAqIFRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBlZXIgaXMKKyAqIGNvbm5lY3RlZCwgb3IgbmVlZCBhbnkgcmVzZXQgaGFuZHNoYWtpbmcuICBJdCdzIGdvdCBwcmV0dHkgYmlnCisgKiBpbnRlcm5hbCBidWZmZXJzIChoYW5kbGVzIG1vc3Qgb2YgYSBmcmFtZSdzIHdvcnRoIG9mIGRhdGEpLgorICogQ2hpcCBkYXRhIHNoZWV0cyBkb24ndCBkZXNjcmliZSBhbnkgdmVuZG9yIGNvbnRyb2wgbWVzc2FnZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlhbjI3MjBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiQW5jaG9yQ2hpcHMvQ3lwcmVzcyAyNzIwIiwKKwkvLyBubyByZXNldCBhdmFpbGFibGUhCisJLy8gbm8gY2hlY2tfY29ubmVjdCBhdmFpbGFibGUhCisKKwkuaW4gPSAyLCAub3V0ID0gMiwJCS8vIGRpcmVjdGlvbiBkaXN0aW5ndWlzaGVzIHRoZXNlCit9OworCisjZW5kaWYJLyogQ09ORklHX1VTQl9BTjI3MjAgKi8KKworDAorI2lmZGVmCUNPTkZJR19VU0JfQkVMS0lOCisjZGVmaW5lCUhBVkVfSEFSRFdBUkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQmVsa2luIEY1VTEwNCAuLi4gdHdvIE5ldENoaXAgMjI4MCBkZXZpY2VzICsgQXRtZWwgQVZSIG1pY3JvY29udHJvbGxlcgorICoKKyAqIC4uLiBhbHNvIHR3byBlVEVLIGRlc2lnbnMsIGluY2x1ZGluZyBvbmUgc29sZCBhcyAiQWR2YW5jZSBVU0JORVQiCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwliZWxraW5faW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiQmVsa2luLCBlVEVLLCBvciBjb21wYXRpYmxlIiwKK307CisKKyNlbmRpZgkvKiBDT05GSUdfVVNCX0JFTEtJTiAqLworCisKKwwKKyNpZmRlZglDT05GSUdfVVNCX0VQU09OMjg4OAorI2RlZmluZQlIQVZFX0hBUkRXQVJFCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEVQU09OIFVTQiBjbGllbnRzCisgKgorICogVGhpcyBpcyB0aGUgc2FtZSBpZGVhIGFzIExpbnV4IFBEQXMgKGJlbG93KSBleGNlcHQgdGhlIGZpcm13YXJlIGluIHRoZQorICogZGV2aWNlIG1pZ2h0IG5vdCBiZSBUdXgtcG93ZXJlZC4gIEVwc29uIHByb3ZpZGVzIHJlZmVyZW5jZSBmaXJtd2FyZSB0aGF0CisgKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiAgUHJvZHVjdCBkZXZlbG9wZXJzIGNhbiByZXVzZSBvciBtb2RpZnkgdGhhdAorICogY29kZSwgc3VjaCBhcyBieSB1c2luZyB0aGVpciBvd24gcHJvZHVjdCBhbmQgdmVuZG9yIGNvZGVzLgorICoKKyAqIFN1cHBvcnQgd2FzIGZyb20gSnVybyBCeXN0cmlja3kgPGJ5c3RyaWNreS5qdXJvQGVyZC5lcHNvbi5jb20+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwllcHNvbjI4ODhfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiRXBzb24gVVNCIERldmljZSIsCisJLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAorCisJLmluID0gNCwgLm91dCA9IDMsCit9OworCisjZW5kaWYJLyogQ09ORklHX1VTQl9FUFNPTjI4ODggKi8KKworDAorI2lmZGVmIENPTkZJR19VU0JfS0MyMTkwCisjZGVmaW5lIEhBVkVfSEFSRFdBUkUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8ga2MyMTkwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0gICJLQyBUZWNobm9sb2d5IEtDLTE5MCIsCit9OworI2VuZGlmIC8qIENPTkZJR19VU0JfS0MyMTkwICovCisKKwwKKyNpZmRlZglDT05GSUdfVVNCX0FSTUxJTlVYCisjZGVmaW5lCUhBVkVfSEFSRFdBUkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW50ZWwncyBTQS0xMTAwIGNoaXAgaW50ZWdyYXRlcyBiYXNpYyBVU0Igc3VwcG9ydCwgYW5kIGlzIHVzZWQKKyAqIGluIFBEQXMgbGlrZSBzb21lIGlQYXFzLCB0aGUgWW9weSwgc29tZSBaYXVydXMgbW9kZWxzLCBhbmQgbW9yZS4KKyAqIFdoZW4gdGhleSBydW4gTGludXgsIGFyY2gvYXJtL21hY2gtc2ExMTAwL3VzYi1ldGguYyBtYXkgYmUgdXNlZCB0bworICogbmV0d29yayB1c2luZyBtaW5pbWFsIFVTQiBmcmFtaW5nIGRhdGEuCisgKgorICogVGhpcyBkZXNjcmliZXMgdGhlIGRyaXZlciBjdXJyZW50bHkgaW4gc3RhbmRhcmQgQVJNIExpbnV4IGtlcm5lbHMuCisgKiBUaGUgWmF1cnVzIHVzZXMgYSBkaWZmZXJlbnQgZHJpdmVyIChzZWUgbGF0ZXIpLgorICoKKyAqIFBYQTI1eCBhbmQgUFhBMjEwIHVzZSBYU2NhbGUgY29yZXMgKEFSTSB2NVRFKSB3aXRoIGJldHRlciBVU0Igc3VwcG9ydAorICogYW5kIGRpZmZlcmVudCBVU0IgZW5kcG9pbnQgbnVtYmVyaW5nIHRoYW4gdGhlIFNBMTEwMCBkZXZpY2VzLiAgVGhlCisgKiBtYWNoLXB4YS91c2ItZXRoLmMgZHJpdmVyIHJlLXVzZXMgdGhlIGRldmljZSBpZHMgZnJvbSBtYWNoLXNhMTEwMAorICogc28gd2UgcmVseSBvbiB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvcnMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlsaW51eGRldl9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJMaW51eCBEZXZpY2UiLAorCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JeW9weV9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJZb3B5IiwKKwkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWJsb2JfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiQm9vdCBMb2FkZXIgT0JqZWN0IiwKKwkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCit9OworCisjZW5kaWYJLyogQ09ORklHX1VTQl9BUk1MSU5VWCAqLworCisMCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmCUhBVkVfSEFSRFdBUkUKKyNlcnJvciBZb3UgbmVlZCB0byBjb25maWd1cmUgc29tZSBoYXJkd2FyZSBmb3IgdGhpcyBkcml2ZXIKKyNlbmRpZgorCisvKgorICogY2hpcCB2ZW5kb3IgbmFtZXMgd29uJ3Qgbm9ybWFsbHkgYmUgb24gdGhlIGNhYmxlcywgYW5kCisgKiBtYXkgbm90IGJlIG9uIHRoZSBkZXZpY2UuCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkCXByb2R1Y3RzIFtdID0geworCisjaWZkZWYJQ09ORklHX1VTQl9BTElfTTU2MzIKK3sKKwlVU0JfREVWSUNFICgweDA0MDIsIDB4NTYzMiksCS8vIEFMaSBkZWZhdWx0cworCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYWxpX201NjMyX2luZm8sCit9LAorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0FOMjcyMAoreworCVVTQl9ERVZJQ0UgKDB4MDU0NywgMHgyNzIwKSwJLy8gQW5jaG9yQ2hpcHMgZGVmYXVsdHMKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmFuMjcyMF9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4MDU0NywgMHgyNzI3KSwJLy8gWGlyY29tIFBHVU5FVAorCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYW4yNzIwX2luZm8sCit9LAorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0JFTEtJTgoreworCVVTQl9ERVZJQ0UgKDB4MDUwZCwgMHgwMDA0KSwJLy8gQmVsa2luCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZiZWxraW5faW5mbywKK30sIHsKKwlVU0JfREVWSUNFICgweDA1NmMsIDB4ODEwMCksCS8vIGVURUsKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmJlbGtpbl9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4MDUyNSwgMHg5OTAxKSwJLy8gQWR2YW5jZSBVU0JORVQgKGVURUspCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZiZWxraW5faW5mbywKK30sCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19VU0JfRVBTT04yODg4Cit7CisJVVNCX0RFVklDRSAoMHgwNTI1LCAweDI4ODgpLAkvLyBFUFNPTiBVU0IgY2xpZW50CisJLmRyaXZlcl9pbmZvCT0gKHVuc2lnbmVkIGxvbmcpICZlcHNvbjI4ODhfaW5mbywKK30sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0JfS0MyMTkwCit7CisJVVNCX0RFVklDRSAoMHgwNTBmLCAweDAxOTApLAkvLyBLQy0xOTAKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmtjMjE5MF9pbmZvLAorfSwKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX1VTQl9BUk1MSU5VWAorLyoKKyAqIFNBLTExMDAgdXNpbmcgc3RhbmRhcmQgQVJNIExpbnV4IGtlcm5lbHMsIG9yIGNvbXBhdGlibGUuCisgKiBPZnRlbiB1c2VkIHdoZW4gdGFsa2luZyB0byBMaW51eCBQREFzIChpUGFxLCBZb3B5LCBldGMpLgorICogVGhlIHNhLTExMDAgInVzYi1ldGgiIGRyaXZlciBoYW5kbGVzIHRoZSBiYXNpYyBmcmFtaW5nLgorICoKKyAqIFBYQTI1eCBvciBQWEEyMTAgLi4uICB0aGVzZSB1c2UgYSAidXNiLWV0aCIgZHJpdmVyIG11Y2ggbGlrZQorICogdGhlIHNhMTEwMCBvbmUsIGJ1dCBoYXJkd2FyZSB1c2VzIGRpZmZlcmVudCBlbmRwb2ludCBudW1iZXJzLgorICoKKyAqIE9yIHRoZSBMaW51eCAiRXRoZXJuZXQiIGdhZGdldCBvbiBoYXJkd2FyZSB0aGF0IGNhbid0IHRhbGsKKyAqIENEQyBFdGhlcm5ldCAoZS5nLiwgbm8gYWx0c2V0dGluZ3MpLCBpbiBlaXRoZXIgb2YgdHdvIG1vZGVzOgorICogIC0gYWN0aW5nIGp1c3QgbGlrZSB0aGUgb2xkICJ1c2ItZXRoIiBmaXJtd2FyZSwgdGhvdWdoCisgKiAgICB0aGUgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50CisgKiAgLSBzdXBwb3J0aW5nIFJORElTIGFzIHRoZSBmaXJzdC9kZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yCisgKiAgICBNUy1XaW5kb3dzIGludGVyb3A7IExpbnV4IG5lZWRzIHRvIHVzZSB0aGUgb3RoZXIgY29uZmlnCisgKi8KK3sKKwkvLyAxMTgzID0gMHgwNDlGLCBib3RoIHVzZWQgYXMgaGV4IHZhbHVlcz8KKwkvLyBDb21wYXEgIkl0c3kiIHZlbmRvci9wcm9kdWN0IGlkCisJVVNCX0RFVklDRSAoMHgwNDlGLCAweDUwNUEpLAkvLyB1c2ItZXRoLCBvciBjb21wYXRpYmxlCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZsaW51eGRldl9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4MEU3RSwgMHgxMDAxKSwJLy8gRy5NYXRlICJZb3B5IgorCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmeW9weV9pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UgKDB4ODA4NiwgMHgwN2QzKSwJLy8gImJsb2IiIGJvb3Rsb2FkZXIKKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmJsb2JfaW5mbywKK30sIHsKKwkvLyBMaW51eCBFdGhlcm5ldC9STkRJUyBnYWRnZXQgb24gcHhhMjEwLzI1eC8yNngsIHNlY29uZCBjb25maWcKKwkvLyBlLmcuIEd1bXN0aXgsIGN1cnJlbnQgT3BlblphdXJ1cywgLi4uCisJVVNCX0RFVklDRV9WRVIgKDB4MDUyNSwgMHhhNGEyLCAweDAyMDMsIDB4MDIwMyksCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZsaW51eGRldl9pbmZvLAorfSwKKyNlbmRpZgorCisJeyB9LAkJLy8gRU5ECit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHByb2R1Y3RzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNkY19zdWJzZXRfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJjZGNfc3Vic2V0IiwKKwkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCisJLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKKwkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2RjX3N1YnNldF9pbml0KHZvaWQpCit7CisgCXJldHVybiB1c2JfcmVnaXN0ZXIoJmNkY19zdWJzZXRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGNkY19zdWJzZXRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjZGNfc3Vic2V0X2V4aXQodm9pZCkKK3sKKyAJdXNiX2RlcmVnaXN0ZXIoJmNkY19zdWJzZXRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNkY19zdWJzZXRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSAnQ0RDIFN1YnNldCcgVVNCIG5ldHdvcmtpbmcgbGlua3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYyBiL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogR2VuZVN5cyBHTDYyMFVTQi1BIGJhc2VkIGxpbmtzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgSml1bi1KaWUgSHVhbmcgPGh1YW5nampAZ2VuZXN5c2xvZ2ljLmNvbS50dz4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBTdGFuaXNsYXYgQnJhYmVjIDx1dHhAcGVuZ3Vpbi5jej4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNibmV0LmgiCisKKworLyoKKyAqIEdlbmVTeXMgR0w2MjBVU0ItQSAod3d3LmdlbmVzeXNsb2dpYy5jb20udHcpCisgKgorICogLi4uIHNob3VsZCBwYXJ0aWFsbHkgaW50ZXJvcCB3aXRoIHRoZSBXaW4zMiBkcml2ZXIgZm9yIHRoaXMgaGFyZHdhcmUuCisgKiBUaGUgR2VuZVN5cyBkb2NzIGltcGx5IHRoZXJlJ3Mgc29tZSBORElTIGlzc3VlIG1vdGl2YXRpbmcgdGhpcyBmcmFtaW5nLgorICoKKyAqIFNvbWUgaW5mbyBmcm9tIEdlbmVTeXM6CisgKiAgLSBHTDYyMFVTQi1BIGlzIGZ1bGwgZHVwbGV4OyBHTDYyMFVTQiBpcyBvbmx5IGhhbGYgZHVwbGV4IGZvciBidWxrLgorICogICAgKFNvbWUgY2FibGVzLCBsaWtlIHRoZSBCQUZPLTEwMGMsIHVzZSB0aGUgaGFsZiBkdXBsZXggdmVyc2lvbi4pCisgKiAgLSBGb3IgdGhlIGZ1bGwgZHVwbGV4IG1vZGVsLCB0aGUgbG93IGJpdCBvZiB0aGUgdmVyc2lvbiBjb2RlIHNheXMKKyAqICAgIHdoaWNoIHNpZGUgaXMgd2hpY2ggKCJsZWZ0L3JpZ2h0IikuCisgKiAgLSBGb3IgdGhlIGhhbGYgZHVwbGV4IHR5cGUsIGEgY29udHJvbC9pbnRlcnJ1cHQgaGFuZHNoYWtlIHNldHRsZXMKKyAqICAgIHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24uICAoVGhhdCdzIGRpc2FibGVkIGhlcmUsIHBhcnRpYWxseSBjb2RlZC4pCisgKiAgICBBIGNvbnRyb2wgVVJCIHdvdWxkIGJsb2NrIHVudGlsIG90aGVyIHNpZGUgd3JpdGVzIGFuIGludGVycnVwdC4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIGZyb20gSml1bi1KaWUgSHVhbmcgPGh1YW5nampAZ2VuZXN5c2xvZ2ljLmNvbS50dz4KKyAqIGFuZCBtZXJnZWQgaW50byAidXNibmV0IiBieSBTdGFuaXNsYXYgQnJhYmVjIDx1dHhAcGVuZ3Vpbi5jej4uCisgKi8KKworLy8gY29udHJvbCBtc2cgd3JpdGUgY29tbWFuZAorI2RlZmluZSBHRU5FTElOS19DT05ORUNUX1dSSVRFCQkJMHhGMAorLy8gaW50ZXJydXB0IHBpcGUgaW5kZXgKKyNkZWZpbmUgR0VORUxJTktfSU5URVJSVVBUX1BJUEUJCQkweDAzCisvLyBpbnRlcnJ1cHQgcmVhZCBidWZmZXIgc2l6ZQorI2RlZmluZSBJTlRFUlJVUFRfQlVGU0laRQkJCTB4MDgKKy8vIGludGVycnVwdCBwaXBlIGludGVydmFsIHZhbHVlCisjZGVmaW5lIEdFTkVMSU5LX0lOVEVSUlVQVF9JTlRFUlZBTAkJMHgxMAorLy8gbWF4IHRyYW5zbWl0IHBhY2tldCBudW1iZXIgcGVyIHRyYW5zbWl0CisjZGVmaW5lIEdMX01BWF9UUkFOU01JVF9QQUNLRVRTCQkJMzIKKy8vIG1heCBwYWNrZXQgbGVuZ3RoCisjZGVmaW5lIEdMX01BWF9QQUNLRVRfTEVOCQkJMTUxNAorLy8gbWF4IHJlY2VpdmUgYnVmZmVyIHNpemUKKyNkZWZpbmUgR0xfUkNWX0JVRl9TSVpFCQlcCisJKCgoR0xfTUFYX1BBQ0tFVF9MRU4gKyA0KSAqIEdMX01BWF9UUkFOU01JVF9QQUNLRVRTKSArIDQpCisKK3N0cnVjdCBnbF9wYWNrZXQgeworCXUzMgkJcGFja2V0X2xlbmd0aDsKKwljaGFyCQlwYWNrZXRfZGF0YSBbMV07Cit9OworCitzdHJ1Y3QgZ2xfaGVhZGVyIHsKKwl1MzIJCQlwYWNrZXRfY291bnQ7CisJc3RydWN0IGdsX3BhY2tldAlwYWNrZXRzOworfTsKKworI2lmZGVmCUdFTkVMSU5LX0FDSworCisvLyBGSVhNRTogIHRoaXMgY29kZSBpcyBpbmNvbXBsZXRlLCBub3QgZGVidWdnZWQ7IGl0IGRvZXNuJ3QKKy8vIGhhbmRsZSBpbnRlcnJ1cHRzIGNvcnJlY3RseTsgaXQgc2hvdWxkIHVzZSB0aGUgZ2VuZXJpYworLy8gc3RhdHVzIElSUSBjb2RlICh3aGljaCBkaWRuJ3QgZXhpc3QgYmFjayBpbiAyMDAxKS4KKworc3RydWN0IGdsX3ByaXYgeworCXN0cnVjdCB1cmIJKmlycV91cmI7CisJY2hhcgkJaXJxX2J1ZiBbSU5URVJSVVBUX0JVRlNJWkVdOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2xfY29udHJvbF93cml0ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwKKwkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCSAgICAgIHJlcXVlc3QsCisJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkgICAgICB2YWx1ZSwKKwkJICAgICAgMCwJCQkvLyBpbmRleAorCQkgICAgICAwLAkJCS8vIGRhdGEgYnVmZmVyCisJCSAgICAgIDAsCQkJLy8gc2l6ZQorCQkgICAgICBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZ2xfaW50ZXJydXB0X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKQorCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgZ2xfaW50ZXJydXB0X3JlYWQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXN0cnVjdCBnbF9wcml2CSpwcml2ID0gZGV2LT5wcml2X2RhdGE7CisJaW50CQlyZXR2YWw7CisKKwkvLyBpc3N1ZSB1c2IgaW50ZXJydXB0IHJlYWQKKwlpZiAocHJpdiAmJiBwcml2LT5pcnFfdXJiKSB7CisJCS8vIHN1Ym1pdCB1cmIKKwkJaWYgKChyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5pcnFfdXJiLCBHRlBfS0VSTkVMKSkgIT0gMCkKKwkJCWRiZygiZ2xfaW50ZXJydXB0X3JlYWQ6IHN1Ym1pdCBmYWlsIC0gJVguLi4iLCByZXR2YWwpOworCQllbHNlCisJCQlkYmcoImdsX2ludGVycnVwdF9yZWFkOiBzdWJtaXQgc3VjY2Vzcy4uLiIpOworCX0KKworCXJldHVybiAwOworfQorCisvLyBjaGVjayB3aGV0aGVyIGFub3RoZXIgc2lkZSBpcyBjb25uZWN0ZWQKK3N0YXRpYyBpbnQgZ2VuZWxpbmtfY2hlY2tfY29ubmVjdChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50CQkJcmV0dmFsOworCisJZGJnKCJnZW5lbGlua19jaGVja19jb25uZWN0Li4uIik7CisKKwkvLyBkZXRlY3Qgd2hldGhlciBhbm90aGVyIHNpZGUgaXMgY29ubmVjdGVkCisJaWYgKChyZXR2YWwgPSBnbF9jb250cm9sX3dyaXRlKGRldiwgR0VORUxJTktfQ09OTkVDVF9XUklURSwgMCkpICE9IDApIHsKKwkJZGJnKCIlczogZ2VuZWxpbmtfY2hlY2tfY29ubmVjdCB3cml0ZSBmYWlsIC0gJVgiLAorCQkJZGV2LT5uZXQtPm5hbWUsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLy8gdXNiIGludGVycnVwdCByZWFkIHRvIGFjayBhbm90aGVyIHNpZGUKKwlpZiAoKHJldHZhbCA9IGdsX2ludGVycnVwdF9yZWFkKGRldikpICE9IDApIHsKKwkJZGJnKCIlczogZ2VuZWxpbmtfY2hlY2tfY29ubmVjdCByZWFkIGZhaWwgLSAlWCIsCisJCQlkZXYtPm5ldC0+bmFtZSwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkYmcoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHJlYWQgc3VjY2VzcyIsIGRldi0+bmV0LT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLy8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHByaXZhdGUgZGF0YSBmb3IgZ2VuZWxpbmsKK3N0YXRpYyBpbnQgZ2VuZWxpbmtfaW5pdChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IGdsX3ByaXYgKnByaXY7CisKKwkvLyBhbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorCWlmICgocHJpdiA9IGttYWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKSkgPT0gMCkgeworCQlkYmcoIiVzOiBjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHBlciBkZXZpY2UiLAorCQkJZGV2LT5uZXQtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvLyBhbGxvY2F0ZSBpcnEgdXJiCisJaWYgKChwcml2LT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkgPT0gMCkgeworCQlkYmcoIiVzOiBjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBpcnEgdXJiIHBlciBkZXZpY2UiLAorCQkJZGV2LT5uZXQtPm5hbWUpOworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLy8gZmlsbCBpcnEgdXJiCisJdXNiX2ZpbGxfaW50X3VyYihwcml2LT5pcnFfdXJiLCBkZXYtPnVkZXYsCisJCXVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwgR0VORUxJTktfSU5URVJSVVBUX1BJUEUpLAorCQlwcml2LT5pcnFfYnVmLCBJTlRFUlJVUFRfQlVGU0laRSwKKwkJZ2xfaW50ZXJydXB0X2NvbXBsZXRlLCAwLAorCQlHRU5FTElOS19JTlRFUlJVUFRfSU5URVJWQUwpOworCisJLy8gc2V0IHByaXZhdGUgZGF0YSBwb2ludGVyCisJZGV2LT5wcml2X2RhdGEgPSBwcml2OworCisJcmV0dXJuIDA7Cit9CisKKy8vIHJlbGVhc2UgdGhlIHByaXZhdGUgZGF0YQorc3RhdGljIGludCBnZW5lbGlua19mcmVlKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgZ2xfcHJpdgkqcHJpdiA9IGRldi0+cHJpdl9kYXRhOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gMDsKKworLy8gRklYTUU6ICBjYW4ndCBjYW5jZWwgaGVyZTsgaXQncyBzeW5jaHJvbm91cywgYW5kCisvLyBzaG91bGQgaGF2ZSBoYXBwZW5lZCBlYXJsaWVyIGluIGFueSBjYXNlIChpbnRlcnJ1cHQKKy8vIGhhbmRsaW5nIG5lZWRzIHRvIGJlIGdlbmVyaWMpCisKKwkvLyBjYW5jZWwgaXJxIHVyYiBmaXJzdAorCXVzYl9raWxsX3VyYihwcml2LT5pcnFfdXJiKTsKKworCS8vIGZyZWUgaXJxIHVyYgorCXVzYl9mcmVlX3VyYihwcml2LT5pcnFfdXJiKTsKKworCS8vIGZyZWUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKwlrZnJlZShwcml2KTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBnZW5lbGlua19yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGdsX2hlYWRlcgkqaGVhZGVyOworCXN0cnVjdCBnbF9wYWNrZXQJKnBhY2tldDsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKmdsX3NrYjsKKwl1MzIJCQlzaXplOworCisJaGVhZGVyID0gKHN0cnVjdCBnbF9oZWFkZXIgKikgc2tiLT5kYXRhOworCisJLy8gZ2V0IHRoZSBwYWNrZXQgY291bnQgb2YgdGhlIHJlY2VpdmVkIHNrYgorCWxlMzJfdG9fY3B1cygmaGVhZGVyLT5wYWNrZXRfY291bnQpOworCWlmICgoaGVhZGVyLT5wYWNrZXRfY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykKKwkJCXx8IChoZWFkZXItPnBhY2tldF9jb3VudCA8IDApKSB7CisJCWRiZygiZ2VuZWxpbms6IGludmFsaWQgcmVjZWl2ZWQgcGFja2V0IGNvdW50ICVkIiwKKwkJCWhlYWRlci0+cGFja2V0X2NvdW50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLy8gc2V0IHRoZSBjdXJyZW50IHBhY2tldCBwb2ludGVyIHRvIHRoZSBmaXJzdCBwYWNrZXQKKwlwYWNrZXQgPSAmaGVhZGVyLT5wYWNrZXRzOworCisJLy8gZGVjcmVtZW50IHRoZSBsZW5ndGggZm9yIHRoZSBwYWNrZXQgY291bnQgc2l6ZSA0IGJ5dGVzCisJc2tiX3B1bGwoc2tiLCA0KTsKKworCXdoaWxlIChoZWFkZXItPnBhY2tldF9jb3VudCA+IDEpIHsKKwkJLy8gZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoCisJCXNpemUgPSBsZTMyX3RvX2NwdShwYWNrZXQtPnBhY2tldF9sZW5ndGgpOworCisJCS8vIHRoaXMgbWF5IGJlIGEgYnJva2VuIHBhY2tldAorCQlpZiAoc2l6ZSA+IEdMX01BWF9QQUNLRVRfTEVOKSB7CisJCQlkYmcoImdlbmVsaW5rOiBpbnZhbGlkIHJ4IGxlbmd0aCAlZCIsIHNpemUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvLyBhbGxvY2F0ZSB0aGUgc2tiIGZvciB0aGUgaW5kaXZpZHVhbCBwYWNrZXQKKwkJZ2xfc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOworCQlpZiAoZ2xfc2tiKSB7CisKKwkJCS8vIGNvcHkgdGhlIHBhY2tldCBkYXRhIHRvIHRoZSBuZXcgc2tiCisJCQltZW1jcHkoc2tiX3B1dChnbF9za2IsIHNpemUpLAorCQkJCQlwYWNrZXQtPnBhY2tldF9kYXRhLCBzaXplKTsKKwkJCXVzYm5ldF9za2JfcmV0dXJuKGRldiwgZ2xfc2tiKTsKKwkJfQorCisJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgcGFja2V0CisJCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopCisJCQkmcGFja2V0LT5wYWNrZXRfZGF0YSBbc2l6ZV07CisJCWhlYWRlci0+cGFja2V0X2NvdW50LS07CisKKwkJLy8gc2hpZnQgdGhlIGRhdGEgcG9pbnRlciB0byB0aGUgbmV4dCBnbF9wYWNrZXQKKwkJc2tiX3B1bGwoc2tiLCBzaXplICsgNCk7CisJfQorCisJLy8gc2tpcCB0aGUgcGFja2V0IGxlbmd0aCBmaWVsZCA0IGJ5dGVzCisJc2tiX3B1bGwoc2tiLCA0KTsKKworCWlmIChza2ItPmxlbiA+IEdMX01BWF9QQUNLRVRfTEVOKSB7CisJCWRiZygiZ2VuZWxpbms6IGludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitnZW5lbGlua190eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGZsYWdzKQoreworCWludCAJcGFkbGVuOworCWludAlsZW5ndGggPSBza2ItPmxlbjsKKwlpbnQJaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKwl1MzIJKnBhY2tldF9jb3VudDsKKwl1MzIJKnBhY2tldF9sZW47CisKKwkvLyBGSVhNRTogIG1hZ2ljIG51bWJlcnMsIGJsZWVjaAorCXBhZGxlbiA9ICgoc2tiLT5sZW4gKyAoNCArIDQqMSkpICUgNjQpID8gMCA6IDE7CisKKwlpZiAoKCFza2JfY2xvbmVkKHNrYikpCisJCQkmJiAoKGhlYWRyb29tICsgdGFpbHJvb20pID49IChwYWRsZW4gKyAoNCArIDQqMSkpKSkgeworCQlpZiAoKGhlYWRyb29tIDwgKDQgKyA0KjEpKSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArICg0ICsgNCoxKSwKKwkJCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHNrX2J1ZmYJKnNrYjI7CisJCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLCAoNCArIDQqMSkgLCBwYWRsZW4sIGZsYWdzKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gc2tiMjsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBhdHRhY2ggdGhlIHBhY2tldCBjb3VudCB0byB0aGUgaGVhZGVyCisJcGFja2V0X2NvdW50ID0gKHUzMiAqKSBza2JfcHVzaChza2IsICg0ICsgNCoxKSk7CisJcGFja2V0X2xlbiA9IHBhY2tldF9jb3VudCArIDE7CisKKwkqcGFja2V0X2NvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJKnBhY2tldF9sZW4gPSBjcHVfdG9fbGUzMihsZW5ndGgpOworCisJLy8gYWRkIHBhZGRpbmcgYnl0ZQorCWlmICgoc2tiLT5sZW4gJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKKwkJc2tiX3B1dChza2IsIDEpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBnZW5lbGlua19iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJZGV2LT5oYXJkX210dSA9IEdMX1JDVl9CVUZfU0laRTsKKwlkZXYtPm5ldC0+aGFyZF9oZWFkZXJfbGVuICs9IDQ7CisJZGV2LT5pbiA9IHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZHJpdmVyX2luZm8tPmluKTsKKwlkZXYtPm91dCA9IHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZHJpdmVyX2luZm8tPm91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JZ2VuZWxpbmtfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiR2VuZXN5cyBHZW5lTGluayIsCisJLmZsYWdzID0JRkxBR19GUkFNSU5HX0dMIHwgRkxBR19OT19TRVRJTlQsCisJLmJpbmQgPQkJZ2VuZWxpbmtfYmluZCwKKwkucnhfZml4dXAgPQlnZW5lbGlua19yeF9maXh1cCwKKwkudHhfZml4dXAgPQlnZW5lbGlua190eF9maXh1cCwKKworCS5pbiA9IDEsIC5vdXQgPSAyLAorCisjaWZkZWYJR0VORUxJTktfQUNLCisJLmNoZWNrX2Nvbm5lY3QgPWdlbmVsaW5rX2NoZWNrX2Nvbm5lY3QsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKKworeworCVVTQl9ERVZJQ0UoMHgwNWUzLCAweDA1MDIpLAkvLyBHTDYyMFVTQi1BCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZnZW5lbGlua19pbmZvLAorfSwKKwkvKiBOT1Q6IFVTQl9ERVZJQ0UoMHgwNWUzLCAweDA1MDEpLAkvLyBHTDYyMFVTQgorCSAqIHRoYXQncyBoYWxmIGR1cGxleCwgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKi8KKwl7IH0sCQkvLyBFTkQKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcHJvZHVjdHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZ2w2MjBhX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiZ2w2MjBhIiwKKwkuaWRfdGFibGUgPQlwcm9kdWN0cywKKwkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CXVzYm5ldF9zdXNwZW5kLAorCS5yZXN1bWUgPQl1c2JuZXRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNibmV0X2luaXQodm9pZCkKK3sKKyAJcmV0dXJuIHVzYl9yZWdpc3RlcigmZ2w2MjBhX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCh1c2JuZXRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JuZXRfZXhpdCh2b2lkKQoreworIAl1c2JfZGVyZWdpc3RlcigmZ2w2MjBhX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh1c2JuZXRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkppdW4tSmllIEh1YW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdMNjIwLVVTQi1BIEhvc3QtdG8tSG9zdCBMaW5rIGNhYmxlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMgYi9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKaW5kZXggN2ZmYTk5Yi4uZTA0YjBjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwpAQCAtNzg3LDcgKzc4Nyw2IEBACiAJCSAgICAgIGthd2V0aF91c2JfdHJhbnNtaXRfY29tcGxldGUsCiAJCSAgICAgIGthd2V0aCk7CiAJa2F3ZXRoLT5lbmQgPSAwOwotCWthd2V0aC0+dHhfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCiAJaWYoKHJlcyA9IHVzYl9zdWJtaXRfdXJiKGthd2V0aC0+dHhfdXJiLCBHRlBfQVRPTUlDKSkpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMDljNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKQEAgLTAsMCArMSw2MjIgQEAKKy8qCisgKiBOZXQxMDgwIGJhc2VkIFVTQiBob3N0LXRvLWhvc3QgY2FibGVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBieSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvLyAjZGVmaW5lCURFQlVHCQkJLy8gZXJyb3IgcGF0aCBtZXNzYWdlcywgZXh0cmEgaW5mbworLy8gI2RlZmluZQlWRVJCT1NFCQkJLy8gbW9yZTsgc3VjY2VzcyBtZXNzYWdlcworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYJQ09ORklHX1VTQl9ERUJVRworIyAgIGRlZmluZSBERUJVRworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlICJ1c2JuZXQuaCIKKworCisvKgorICogTmV0Y2hpcCAxMDgwIGRyaXZlciAuLi4gaHR0cDovL3d3dy5uZXRjaGlwLmNvbQorICogKFNlcHQgMjAwNDogIEVuZC1vZi1saWZlIGFubm91bmNlbWVudCBoYXMgYmVlbiBzZW50LikKKyAqIFVzZWQgaW4gKHNvbWUpIExhcExpbmsgY2FibGVzCisgKi8KKworI2RlZmluZSBmcmFtZV9lcnJvcnMJZGF0YVsxXQorCisvKgorICogTmV0Q2hpcCBmcmFtaW5nIG9mIGV0aGVybmV0IHBhY2tldHMsIHN1cHBvcnRpbmcgYWRkaXRpb25hbCBlcnJvcgorICogY2hlY2tzIGZvciBsaW5rcyB0aGF0IG1heSBkcm9wIGJ1bGsgcGFja2V0cyBmcm9tIGluc2lkZSBtZXNzYWdlcy4KKyAqIE9kZCBVU0IgbGVuZ3RoID09IGFsd2F5cyBzaG9ydCByZWFkIGZvciBsYXN0IHVzYiBwYWNrZXQuCisgKgktIG5jX2hlYWRlcgorICoJLSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQorICoJLSBwYXlsb2FkCisgKgktIChvcHRpb25hbCBwYWRkaW5nIGJ5dGUsIGlmIG5lZWRlZCBzbyBsZW5ndGggYmVjb21lcyBvZGQpCisgKgktIG5jX3RyYWlsZXIKKyAqCisgKiBUaGlzIGZyYW1pbmcgaXMgdG8gYmUgYXZvaWRlZCBmb3Igbm9uLU5ldENoaXAgZGV2aWNlcy4KKyAqLworCitzdHJ1Y3QgbmNfaGVhZGVyIHsJCS8vIHBhY2tlZDoKKwlfX2xlMTYJaGRyX2xlbjsJCS8vIHNpemVvZiBuY19oZWFkZXIgKExFLCBhbGwpCisJX19sZTE2CXBhY2tldF9sZW47CQkvLyBwYXlsb2FkIHNpemUgKGluY2x1ZGluZyBldGhoZHIpCisJX19sZTE2CXBhY2tldF9pZDsJCS8vIGRldGVjdHMgZHJvcHBlZCBwYWNrZXRzCisjZGVmaW5lIE1JTl9IRUFERVIJNgorCisJLy8gYWxsIGVsc2UgaXMgb3B0aW9uYWwsIGFuZCBtdXN0IHN0YXJ0IHdpdGg6CisJLy8gX19sZTE2CXZlbmRvcklkOwkvLyBmcm9tIHVzYi1pZgorCS8vIF9fbGUxNglwcm9kdWN0SWQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZQlQQURfQllURQkoKHVuc2lnbmVkIGNoYXIpMHhBQykKKworc3RydWN0IG5jX3RyYWlsZXIgeworCV9fbGUxNglwYWNrZXRfaWQ7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLy8gcGFja2V0cyBtYXkgdXNlIEZMQUdfRlJBTUlOR19OQyBhbmQgb3B0aW9uYWwgcGFkCisjZGVmaW5lIEZSQU1FRF9TSVpFKG10dSkgKHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikgXAorCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSBcCisJCQkJKyAobXR1KSBcCisJCQkJKyAxIFwKKwkJCQkrIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKQorCisjZGVmaW5lIE1JTl9GUkFNRUQJRlJBTUVEX1NJWkUoMCkKKworLyogcGFja2V0cyBfY291bGRfIGJlIHVwIHRvIDY0S0IuLi4gKi8KKyNkZWZpbmUgTkNfTUFYX1BBQ0tFVAkzMjc2NworCisKKy8qCisgKiBaZXJvIG1lYW5zIG5vIHRpbWVvdXQ7IGVsc2UsIGhvdyBsb25nIGEgNjQgYnl0ZSBidWxrIHBhY2tldCBtYXkgYmUgcXVldWVkCisgKiBiZWZvcmUgdGhlIGhhcmR3YXJlIGRyb3BzIGl0LiAgSWYgdGhhdCdzIGRvbmUsIHRoZSBkcml2ZXIgd2lsbCBuZWVkIHRvCisgKiBmcmFtZSBuZXR3b3JrIHBhY2tldHMgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgZHJvcHBlZCBVU0IgcGFja2V0cy4gIFRoZSB3aW4zMgorICogZHJpdmVyIHNldHMgdGhpcyBmb3IgYm90aCBzaWRlcyBvZiB0aGUgbGluay4KKyAqLworI2RlZmluZQlOQ19SRUFEX1RUTF9NUwkoKHU4KTI1NSkJLy8gbXMKKworLyoKKyAqIFdlIGlnbm9yZSBtb3N0IHJlZ2lzdGVycyBhbmQgRUVQUk9NIGNvbnRlbnRzLgorICovCisjZGVmaW5lCVJFR19VU0JDVEwJKCh1OCkweDA0KQorI2RlZmluZSBSRUdfVFRMCQkoKHU4KTB4MTApCisjZGVmaW5lIFJFR19TVEFUVVMJKCh1OCkweDExKQorCisvKgorICogVmVuZG9yIHNwZWNpZmljIHJlcXVlc3RzIHRvIHJlYWQvd3JpdGUgZGF0YQorICovCisjZGVmaW5lCVJFUVVFU1RfUkVHSVNURVIJKCh1OCkweDEwKQorI2RlZmluZQlSRVFVRVNUX0VFUFJPTQkJKCh1OCkweDExKQorCitzdGF0aWMgaW50CituY192ZW5kb3JfcmVhZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggcmVnbnVtLCB1MTYgKnJldHZhbF9wdHIpCit7CisJaW50IHN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlyZXEsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkwLCByZWdudW0sCisJCXJldHZhbF9wdHIsIHNpemVvZiAqcmV0dmFsX3B0ciwKKwkJVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCWlmIChzdGF0dXMgPiAwKQorCQlzdGF0dXMgPSAwOworCWlmICghc3RhdHVzKQorCQlsZTE2X3RvX2NwdXMocmV0dmFsX3B0cik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25jX3JlZ2lzdGVyX3JlYWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZWdudW0sIHUxNiAqcmV0dmFsX3B0cikKK3sKKwlyZXR1cm4gbmNfdmVuZG9yX3JlYWQoZGV2LCBSRVFVRVNUX1JFR0lTVEVSLCByZWdudW0sIHJldHZhbF9wdHIpOworfQorCisvLyBubyByZXR2YWwgLi4uIGNhbiBiZWNvbWUgYXN5bmMsIHVzYWJsZSBpbl9pbnRlcnJ1cHQoKQorc3RhdGljIHZvaWQKK25jX3ZlbmRvcl93cml0ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggcmVnbnVtLCB1MTYgdmFsdWUpCit7CisJdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwKKwkJdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCXJlcSwKKwkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwgcmVnbnVtLAorCQlOVUxMLCAwLAkJCS8vIGRhdGEgaXMgaW4gc2V0dXAgcGFja2V0CisJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituY19yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlZ251bSwgdTE2IHZhbHVlKQoreworCW5jX3ZlbmRvcl93cml0ZShkZXYsIFJFUVVFU1RfUkVHSVNURVIsIHJlZ251bSwgdmFsdWUpOworfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZCBuY19kdW1wX3JlZ2lzdGVycyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTgJcmVnOworCXUxNgkqdnAgPSBrbWFsbG9jKHNpemVvZiAodTE2KSk7CisKKwlpZiAoIXZwKSB7CisJCWRiZygibm8gbWVtb3J5PyIpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlcyByZWdpc3RlcnM6IiwgZGV2LT5uZXQtPm5hbWUpOworCWZvciAocmVnID0gMDsgcmVnIDwgMHgyMDsgcmVnKyspIHsKKwkJaW50IHJldHZhbDsKKworCQkvLyByZWFkaW5nIHNvbWUgcmVnaXN0ZXJzIGlzIHRyb3VibGUKKwkJaWYgKHJlZyA+PSAweDA4ICYmIHJlZyA8PSAweGYpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZyA+PSAweDEyICYmIHJlZyA8PSAweDFlKQorCQkJY29udGludWU7CisKKwkJcmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIHJlZywgdnApOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWRiZygiJXMgcmVnIFsweCV4XSA9PT4gZXJyb3IgJWQiLAorCQkJCWRldi0+bmV0LT5uYW1lLCByZWcsIHJldHZhbCk7CisJCWVsc2UKKwkJCWRiZygiJXMgcmVnIFsweCV4XSA9IDB4JXgiLAorCQkJCWRldi0+bmV0LT5uYW1lLCByZWcsICp2cCk7CisJfQorCWtmcmVlKHZwKTsKK30KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDb250cm9sIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZQlVU0JDVExfV1JJVEFCTEVfTUFTSwkweDFmMGYKKy8vIGJpdHMgMTUtMTMgcmVzZXJ2ZWQsIHIvbworI2RlZmluZQlVU0JDVExfRU5BQkxFX0xBTkcJKDEgPDwgMTIpCisjZGVmaW5lCVVTQkNUTF9FTkFCTEVfTUZHUgkoMSA8PCAxMSkKKyNkZWZpbmUJVVNCQ1RMX0VOQUJMRV9QUk9ECSgxIDw8IDEwKQorI2RlZmluZQlVU0JDVExfRU5BQkxFX1NFUklBTAkoMSA8PCA5KQorI2RlZmluZQlVU0JDVExfRU5BQkxFX0RFRkFVTFRTCSgxIDw8IDgpCisvLyBiaXRzIDctNCByZXNlcnZlZCwgci9vCisjZGVmaW5lCVVTQkNUTF9GTFVTSF9PVEhFUgkoMSA8PCAzKQorI2RlZmluZQlVU0JDVExfRkxVU0hfVEhJUwkoMSA8PCAyKQorI2RlZmluZQlVU0JDVExfRElTQ09OTl9PVEhFUgkoMSA8PCAxKQorI2RlZmluZQlVU0JDVExfRElTQ09OTl9USElTCSgxIDw8IDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY19kdW1wX3VzYmN0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB1c2JjdGwpCit7CisJaWYgKCFuZXRpZl9tc2dfbGluayhkZXYpKQorCQlyZXR1cm47CisJZGV2ZGJnKGRldiwgIm5ldDEwODAgJXMtJXMgdXNiY3RsIDB4JXg6JXMlcyVzJXMlczsiCisJCQkiIHRoaXMlcyVzOyIKKwkJCSIgb3RoZXIlcyVzOyByL28gMHgleCIsCisJCWRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT51ZGV2LT5kZXZwYXRoLAorCQl1c2JjdGwsCisJCSh1c2JjdGwgJiBVU0JDVExfRU5BQkxFX0xBTkcpID8gIiBsYW5nIiA6ICIiLAorCQkodXNiY3RsICYgVVNCQ1RMX0VOQUJMRV9NRkdSKSA/ICIgbWZnciIgOiAiIiwKKwkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfUFJPRCkgPyAiIHByb2QiIDogIiIsCisJCSh1c2JjdGwgJiBVU0JDVExfRU5BQkxFX1NFUklBTCkgPyAiIHNlcmlhbCIgOiAiIiwKKwkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfREVGQVVMVFMpID8gIiBkZWZhdWx0cyIgOiAiIiwKKworCQkodXNiY3RsICYgVVNCQ1RMX0ZMVVNIX09USEVSKSA/ICIgRkxVU0giIDogIiIsCisJCSh1c2JjdGwgJiBVU0JDVExfRElTQ09OTl9PVEhFUikgPyAiIERJUyIgOiAiIiwKKwkJKHVzYmN0bCAmIFVTQkNUTF9GTFVTSF9USElTKSA/ICIgRkxVU0giIDogIiIsCisJCSh1c2JjdGwgJiBVU0JDVExfRElTQ09OTl9USElTKSA/ICIgRElTIiA6ICIiLAorCQl1c2JjdGwgJiB+VVNCQ1RMX1dSSVRBQkxFX01BU0sKKwkJKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFN0YXR1cyByZWdpc3RlcgorICovCisKKyNkZWZpbmUJU1RBVFVTX1BPUlRfQQkJKDEgPDwgMTUpCisKKyNkZWZpbmUJU1RBVFVTX0NPTk5fT1RIRVIJKDEgPDwgMTQpCisjZGVmaW5lCVNUQVRVU19TVVNQRU5EX09USEVSCSgxIDw8IDEzKQorI2RlZmluZQlTVEFUVVNfTUFJTEJPWF9PVEhFUgkoMSA8PCAxMikKKyNkZWZpbmUJU1RBVFVTX1BBQ0tFVFNfT1RIRVIobikJKCgobikgPj4gOCkgJiYgMHgwMykKKworI2RlZmluZQlTVEFUVVNfQ09OTl9USElTCSgxIDw8IDYpCisjZGVmaW5lCVNUQVRVU19TVVNQRU5EX1RISVMJKDEgPDwgNSkKKyNkZWZpbmUJU1RBVFVTX01BSUxCT1hfVEhJUwkoMSA8PCA0KQorI2RlZmluZQlTVEFUVVNfUEFDS0VUU19USElTKG4pCSgoKG4pID4+IDApICYmIDB4MDMpCisKKyNkZWZpbmUJU1RBVFVTX1VOU1BFQ19NQVNLCTB4MGM4YworI2RlZmluZQlTVEFUVVNfTk9JU0VfTUFTSyAJKCh1MTYpfigweDAzMDN8U1RBVFVTX1VOU1BFQ19NQVNLKSkKKworCitzdGF0aWMgaW5saW5lIHZvaWQgbmNfZHVtcF9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgc3RhdHVzKQoreworCWlmICghbmV0aWZfbXNnX2xpbmsoZGV2KSkKKwkJcmV0dXJuOworCWRldmRiZyhkZXYsICJuZXQxMDgwICVzLSVzIHN0YXR1cyAweCV4OiIKKwkJCSIgdGhpcyAoJWMpIFBLVD0lZCVzJXMlczsiCisJCQkiIG90aGVyIFBLVD0lZCVzJXMlczsgdW5zcGVjIDB4JXgiLAorCQlkZXYtPnVkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+dWRldi0+ZGV2cGF0aCwKKwkJc3RhdHVzLAorCisJCS8vIFhYWCB0aGUgcGFja2V0IGNvdW50cyBkb24ndCBzZWVtIHJpZ2h0CisJCS8vICgxIGF0IHJlc2V0LCBub3QgMCk7IG1heWJlIFVOU1BFQyB0b28KKworCQkoc3RhdHVzICYgU1RBVFVTX1BPUlRfQSkgPyAnQScgOiAnQicsCisJCVNUQVRVU19QQUNLRVRTX1RISVMoc3RhdHVzKSwKKwkJKHN0YXR1cyAmIFNUQVRVU19DT05OX1RISVMpID8gIiBDT04iIDogIiIsCisJCShzdGF0dXMgJiBTVEFUVVNfU1VTUEVORF9USElTKSA/ICIgU1VTIiA6ICIiLAorCQkoc3RhdHVzICYgU1RBVFVTX01BSUxCT1hfVEhJUykgPyAiIE1CT1giIDogIiIsCisKKwkJU1RBVFVTX1BBQ0tFVFNfT1RIRVIoc3RhdHVzKSwKKwkJKHN0YXR1cyAmIFNUQVRVU19DT05OX09USEVSKSA/ICIgQ09OIiA6ICIiLAorCQkoc3RhdHVzICYgU1RBVFVTX1NVU1BFTkRfT1RIRVIpID8gIiBTVVMiIDogIiIsCisJCShzdGF0dXMgJiBTVEFUVVNfTUFJTEJPWF9PVEhFUikgPyAiIE1CT1giIDogIiIsCisKKwkJc3RhdHVzICYgU1RBVFVTX1VOU1BFQ19NQVNLCisJCSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUVEwgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lCVRUTF9USElTKHR0bCkJKDB4MDBmZiAmIHR0bCkKKyNkZWZpbmUJVFRMX09USEVSKHR0bCkJKDB4MDBmZiAmICh0dGwgPj4gOCkpCisjZGVmaW5lIE1LX1RUTCh0aGlzLG90aGVyKQkoKHUxNikoKChvdGhlcik8PDgpfCgweDAwZmYmKHRoaXMpKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY19kdW1wX3R0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB0dGwpCit7CisJaWYgKG5ldGlmX21zZ19saW5rKGRldikpCisJCWRldmRiZyhkZXYsICJuZXQxMDgwICVzLSVzIHR0bCAweCV4IHRoaXMgPSAlZCwgb3RoZXIgPSAlZCIsCisJCQlkZXYtPnVkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+dWRldi0+ZGV2cGF0aCwKKwkJCXR0bCwgVFRMX1RISVModHRsKSwgVFRMX09USEVSKHR0bCkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IG5ldDEwODBfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNgkJdXNiY3RsLCBzdGF0dXMsIHR0bDsKKwl1MTYJCSp2cCA9IGttYWxsb2Moc2l6ZW9mICh1MTYpLCBHRlBfS0VSTkVMKTsKKwlpbnQJCXJldHZhbDsKKworCWlmICghdnApCisJCXJldHVybiAtRU5PTUVNOworCisJLy8gbmNfZHVtcF9yZWdpc3RlcnMoZGV2KTsKKworCWlmICgocmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIFJFR19TVEFUVVMsIHZwKSkgPCAwKSB7CisJCWRiZygiY2FuJ3QgcmVhZCAlcy0lcyBzdGF0dXM6ICVkIiwKKwkJCWRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT51ZGV2LT5kZXZwYXRoLCByZXR2YWwpOworCQlnb3RvIGRvbmU7CisJfQorCXN0YXR1cyA9ICp2cDsKKwluY19kdW1wX3N0YXR1cyhkZXYsIHN0YXR1cyk7CisKKwlpZiAoKHJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQoZGV2LCBSRUdfVVNCQ1RMLCB2cCkpIDwgMCkgeworCQlkYmcoImNhbid0IHJlYWQgVVNCQ1RMLCAlZCIsIHJldHZhbCk7CisJCWdvdG8gZG9uZTsKKwl9CisJdXNiY3RsID0gKnZwOworCW5jX2R1bXBfdXNiY3RsKGRldiwgdXNiY3RsKTsKKworCW5jX3JlZ2lzdGVyX3dyaXRlKGRldiwgUkVHX1VTQkNUTCwKKwkJCVVTQkNUTF9GTFVTSF9USElTIHwgVVNCQ1RMX0ZMVVNIX09USEVSKTsKKworCWlmICgocmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIFJFR19UVEwsIHZwKSkgPCAwKSB7CisJCWRiZygiY2FuJ3QgcmVhZCBUVEwsICVkIiwgcmV0dmFsKTsKKwkJZ290byBkb25lOworCX0KKwl0dGwgPSAqdnA7CisJLy8gbmNfZHVtcF90dGwoZGV2LCB0dGwpOworCisJbmNfcmVnaXN0ZXJfd3JpdGUoZGV2LCBSRUdfVFRMLAorCQkJTUtfVFRMKE5DX1JFQURfVFRMX01TLCBUVExfT1RIRVIodHRsKSkgKTsKKwlkYmcoIiVzOiBhc3NpZ25lZCBUVEwsICVkIG1zIiwgZGV2LT5uZXQtPm5hbWUsIE5DX1JFQURfVFRMX01TKTsKKworCWlmIChuZXRpZl9tc2dfbGluayhkZXYpKQorCQlkZXZpbmZvKGRldiwgInBvcnQgJWMsIHBlZXIgJXNjb25uZWN0ZWQiLAorCQkJKHN0YXR1cyAmIFNUQVRVU19QT1JUX0EpID8gJ0EnIDogJ0InLAorCQkJKHN0YXR1cyAmIFNUQVRVU19DT05OX09USEVSKSA/ICIiIDogImRpcyIKKwkJCSk7CisJcmV0dmFsID0gMDsKKworZG9uZToKKwlrZnJlZSh2cCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBuZXQxMDgwX2NoZWNrX2Nvbm5lY3Qoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludAkJCXJldHZhbDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJKnZwID0ga21hbGxvYyhzaXplb2YgKHUxNiksIEdGUF9LRVJORUwpOworCisJaWYgKCF2cCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZChkZXYsIFJFR19TVEFUVVMsIHZwKTsKKwlzdGF0dXMgPSAqdnA7CisJa2ZyZWUodnApOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlkYmcoIiVzIG5ldDEwODBfY2hlY2tfY29ubiByZWFkIC0gJWQiLCBkZXYtPm5ldC0+bmFtZSwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKChzdGF0dXMgJiBTVEFUVVNfQ09OTl9PVEhFUikgIT0gU1RBVFVTX0NPTk5fT1RIRVIpCisJCXJldHVybiAtRU5PTElOSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmNfZmx1c2hfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrZnJlZSh1cmItPmNvbnRleHQpOworCXVzYl9mcmVlX3VyYih1cmIpOworfQorCitzdGF0aWMgdm9pZCBuY19lbnN1cmVfc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJZGV2LT5mcmFtZV9lcnJvcnMrKzsKKwlpZiAoZGV2LT5mcmFtZV9lcnJvcnMgPiA1KSB7CisJCXN0cnVjdCB1cmIJCSp1cmI7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJKnJlcTsKKwkJaW50CQkJc3RhdHVzOworCisJCS8qIFNlbmQgYSBmbHVzaCAqLworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIFNMQUJfQVRPTUlDKTsKKwkJaWYgKCF1cmIpCisJCQlyZXR1cm47CisKKwkJcmVxID0ga21hbGxvYyhzaXplb2YgKnJlcSwgR0ZQX0FUT01JQyk7CisJCWlmICghcmVxKSB7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlcS0+YlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQKKwkJCXwgVVNCX1RZUEVfVkVORE9SCisJCQl8IFVTQl9SRUNJUF9ERVZJQ0U7CisJCXJlcS0+YlJlcXVlc3QgPSBSRVFVRVNUX1JFR0lTVEVSOworCQlyZXEtPndWYWx1ZSA9IGNwdV90b19sZTE2KFVTQkNUTF9GTFVTSF9USElTCisJCQkJfCBVU0JDVExfRkxVU0hfT1RIRVIpOworCQlyZXEtPndJbmRleCA9IGNwdV90b19sZTE2KFJFR19VU0JDVEwpOworCQlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNigwKTsKKworCQkvKiBxdWV1ZSBhbiBhc3luYyBjb250cm9sIHJlcXVlc3QsIHdlIGRvbid0IG5lZWQKKwkJICogdG8gZG8gYW55dGhpbmcgd2hlbiBpdCBmaW5pc2hlcyBleGNlcHQgY2xlYW4gdXAuCisJCSAqLworCQl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGRldi0+dWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQkJKHVuc2lnbmVkIGNoYXIgKikgcmVxLAorCQkJTlVMTCwgMCwKKwkJCW5jX2ZsdXNoX2NvbXBsZXRlLCByZXEpOworCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKSB7CisJCQlrZnJlZShyZXEpOworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAobmV0aWZfbXNnX3J4X2VycihkZXYpKQorCQkJZGV2ZGJnKGRldiwgImZsdXNoIG5ldDEwODA7IHRvbyBtYW55IGZyYW1pbmcgZXJyb3JzIik7CisJCWRldi0+ZnJhbWVfZXJyb3JzID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbmV0MTA4MF9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyOworCXN0cnVjdCBuY190cmFpbGVyCSp0cmFpbGVyOworCXUxNgkJCWhkcl9sZW4sIHBhY2tldF9sZW47CisKKwlpZiAoIShza2ItPmxlbiAmIDB4MDEpKSB7CisjaWZkZWYgREVCVUcKKwkJc3RydWN0IG5ldF9kZXZpY2UJKm5ldCA9IGRldi0+bmV0OworCQlkYmcoInJ4IGZyYW1lc2l6ZSAlZCByYW5nZSAlZC4uJWQgbXR1ICVkIiwgc2tiLT5sZW4sCisJCQluZXQtPmhhcmRfaGVhZGVyX2xlbiwgZGV2LT5oYXJkX210dSwgbmV0LT5tdHUpOworI2VuZGlmCisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCW5jX2Vuc3VyZV9zeW5jKGRldik7CisJCXJldHVybiAwOworCX0KKworCWhlYWRlciA9IChzdHJ1Y3QgbmNfaGVhZGVyICopIHNrYi0+ZGF0YTsKKwloZHJfbGVuID0gbGUxNl90b19jcHVwKCZoZWFkZXItPmhkcl9sZW4pOworCXBhY2tldF9sZW4gPSBsZTE2X3RvX2NwdXAoJmhlYWRlci0+cGFja2V0X2xlbik7CisJaWYgKEZSQU1FRF9TSVpFKHBhY2tldF9sZW4pID4gTkNfTUFYX1BBQ0tFVCkgeworCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlkYmcoInBhY2tldCB0b28gYmlnLCAlZCIsIHBhY2tldF9sZW4pOworCQluY19lbnN1cmVfc3luYyhkZXYpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGhkcl9sZW4gPCBNSU5fSEVBREVSKSB7CisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWRiZygiaGVhZGVyIHRvbyBzaG9ydCwgJWQiLCBoZHJfbGVuKTsKKwkJbmNfZW5zdXJlX3N5bmMoZGV2KTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChoZHJfbGVuID4gTUlOX0hFQURFUikgeworCQkvLyBvdXQgb2YgYmFuZCBkYXRhIGZvciB1cz8KKwkJZGJnKCJoZWFkZXIgT09CLCAlZCBieXRlcyIsIGhkcl9sZW4gLSBNSU5fSEVBREVSKTsKKwkJbmNfZW5zdXJlX3N5bmMoZGV2KTsKKwkJLy8gc3dpdGNoICh2ZW5kb3IvcHJvZHVjdCBpZHMpIHsgLi4uIH0KKwl9CisJc2tiX3B1bGwoc2tiLCBoZHJfbGVuKTsKKworCXRyYWlsZXIgPSAoc3RydWN0IG5jX3RyYWlsZXIgKikKKwkJKHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gc2l6ZW9mICp0cmFpbGVyKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gc2l6ZW9mICp0cmFpbGVyKTsKKworCWlmICgocGFja2V0X2xlbiAmIDB4MDEpID09IDApIHsKKwkJaWYgKHNrYi0+ZGF0YSBbcGFja2V0X2xlbl0gIT0gUEFEX0JZVEUpIHsKKwkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlkYmcoImJhZCBwYWQiKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSAxKTsKKwl9CisJaWYgKHNrYi0+bGVuICE9IHBhY2tldF9sZW4pIHsKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZGJnKCJiYWQgcGFja2V0IGxlbiAlZCAoZXhwZWN0ZWQgJWQpIiwKKwkJCXNrYi0+bGVuLCBwYWNrZXRfbGVuKTsKKwkJbmNfZW5zdXJlX3N5bmMoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChoZWFkZXItPnBhY2tldF9pZCAhPSBnZXRfdW5hbGlnbmVkKCZ0cmFpbGVyLT5wYWNrZXRfaWQpKSB7CisJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJZGJnKCIoMisgZHJvcHBlZCkgcnggcGFja2V0X2lkIG1pc21hdGNoIDB4JXggMHgleCIsCisJCQlsZTE2X3RvX2NwdShoZWFkZXItPnBhY2tldF9pZCksCisJCQlsZTE2X3RvX2NwdSh0cmFpbGVyLT5wYWNrZXRfaWQpKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmIDAKKwlkZXZkYmcoZGV2LCAiZnJhbWUgPHJ4IGggJWQgcCAlZCBpZCAlZCIsIGhlYWRlci0+aGRyX2xlbiwKKwkJaGVhZGVyLT5wYWNrZXRfbGVuLCBoZWFkZXItPnBhY2tldF9pZCk7CisjZW5kaWYKKwlkZXYtPmZyYW1lX2Vycm9ycyA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCituZXQxMDgwX3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50CQkJcGFkbGVuOworCXN0cnVjdCBza19idWZmCQkqc2tiMjsKKwlzdHJ1Y3QgbmNfaGVhZGVyCSpoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBuY190cmFpbGVyCSp0cmFpbGVyID0gTlVMTDsKKwlpbnQJCQlsZW4gPSBza2ItPmxlbjsKKworCXBhZGxlbiA9ICgobGVuICsgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKQorCQkJKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKSkgJiAweDAxKSA/IDAgOiAxOworCWlmICghc2tiX2Nsb25lZChza2IpKSB7CisJCWludAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCQlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKworCQlpZiAoKHBhZGxlbiArIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKSA8PSB0YWlscm9vbQorCQkJICAgICYmIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikgPD0gaGVhZHJvb20pCisJCQkvKiBUaGVyZSdzIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gKi8KKwkJCWdvdG8gZW5jYXBzdWxhdGU7CisKKwkJaWYgKChzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpICsgcGFkbGVuCisJCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikpIDwKKwkJCQkoaGVhZHJvb20gKyB0YWlscm9vbSkpIHsKKwkJCS8qIFRoZXJlJ3MgZW5vdWdoIHRvdGFsIHJvb20sIHNvIGp1c3QgcmVhZGp1c3QgKi8KKwkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUoc2tiLT5oZWFkCisJCQkJCQkrIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlciksCisJCQkJCSAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIGxlbjsKKwkJCWdvdG8gZW5jYXBzdWxhdGU7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgc2tiIHRvIHVzZSB3aXRoIHRoZSBjb3JyZWN0IHNpemUgKi8KKwlza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwKKwkJCQlzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpLAorCQkJCXNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpICsgcGFkbGVuLAorCQkJCWZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlmICghc2tiMikKKwkJcmV0dXJuIHNrYjI7CisJc2tiID0gc2tiMjsKKworZW5jYXBzdWxhdGU6CisJLyogaGVhZGVyIGZpcnN0ICovCisJaGVhZGVyID0gKHN0cnVjdCBuY19oZWFkZXIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YgKmhlYWRlcik7CisJaGVhZGVyLT5oZHJfbGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mICgqaGVhZGVyKSk7CisJaGVhZGVyLT5wYWNrZXRfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKwloZWFkZXItPnBhY2tldF9pZCA9IGNwdV90b19sZTE2KCh1MTYpZGV2LT54aWQrKyk7CisKKwkvKiBtYXliZSBwYWQ7IHRoZW4gdHJhaWxlciAqLworCWlmICghKChza2ItPmxlbiArIHNpemVvZiAqdHJhaWxlcikgJiAweDAxKSkKKwkJKnNrYl9wdXQoc2tiLCAxKSA9IFBBRF9CWVRFOworCXRyYWlsZXIgPSAoc3RydWN0IG5jX3RyYWlsZXIgKikgc2tiX3B1dChza2IsIHNpemVvZiAqdHJhaWxlcik7CisJcHV0X3VuYWxpZ25lZChoZWFkZXItPnBhY2tldF9pZCwgJnRyYWlsZXItPnBhY2tldF9pZCk7CisjaWYgMAorCWRldmRiZyhkZXYsICJmcmFtZSA+dHggaCAlZCBwICVkIGlkICVkIiwKKwkJaGVhZGVyLT5oZHJfbGVuLCBoZWFkZXItPnBhY2tldF9sZW4sCisJCWhlYWRlci0+cGFja2V0X2lkKTsKKyNlbmRpZgorCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgbmV0MTA4MF9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJdW5zaWduZWQJZXh0cmEgPSBzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpCisJCQkJKyAxCisJCQkJKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKTsKKworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gZXh0cmE7CisJZGV2LT5yeF91cmJfc2l6ZSA9IGRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKyBkZXYtPm5ldC0+bXR1OworCWRldi0+aGFyZF9tdHUgPSBOQ19NQVhfUEFDS0VUOworCXJldHVybiB1c2JuZXRfZ2V0X2VuZHBvaW50cyAoZGV2LCBpbnRmKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwluZXQxMDgwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIk5ldENoaXAgVHVyYm9DT05ORUNUIiwKKwkuZmxhZ3MgPQlGTEFHX0ZSQU1JTkdfTkMsCisJLmJpbmQgPQkJbmV0MTA4MF9iaW5kLAorCS5yZXNldCA9CW5ldDEwODBfcmVzZXQsCisJLmNoZWNrX2Nvbm5lY3QgPSBuZXQxMDgwX2NoZWNrX2Nvbm5lY3QsCisJLnJ4X2ZpeHVwID0JbmV0MTA4MF9yeF9maXh1cCwKKwkudHhfZml4dXAgPQluZXQxMDgwX3R4X2ZpeHVwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkCXByb2R1Y3RzIFtdID0geworeworCVVTQl9ERVZJQ0UoMHgwNTI1LCAweDEwODApLAkvLyBOZXRDaGlwIHJlZiBkZXNpZ24KKwkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJm5ldDEwODBfaW5mbywKK30sIHsKKwlVU0JfREVWSUNFKDB4MDZEMCwgMHgwNjIyKSwJLy8gTGFwbGluayBHb2xkCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZuZXQxMDgwX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBuZXQxMDgwX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkibmV0MTA4MCIsCisJLmlkX3RhYmxlID0JcHJvZHVjdHMsCisJLnByb2JlID0JdXNibmV0X3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNibmV0X2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKKwkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5ldDEwODBfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZuZXQxMDgwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChuZXQxMDgwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbmV0MTA4MF9leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZuZXQxMDgwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChuZXQxMDgwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRDaGlwIDEwODAgYmFzZWQgVVNCIEhvc3QtdG8tSG9zdCBMaW5rcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKaW5kZXggZmNkNmQzYy4uNzQ4NGQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCkBAIC04MjUsNyArODI1LDYgQEAKIAlwZWdhc3VzX3QgKnBlZ2FzdXMgPSBuZXRkZXZfcHJpdihuZXQpOwogCWlmIChuZXRpZl9tc2dfdGltZXIocGVnYXN1cykpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eCB0aW1lb3V0XG4iLCBuZXQtPm5hbWUpOwotCXBlZ2FzdXMtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAl1c2JfdW5saW5rX3VyYihwZWdhc3VzLT50eF91cmIpOwogCXBlZ2FzdXMtPnN0YXRzLnR4X2Vycm9ycysrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BsdXNiLmMgYi9kcml2ZXJzL3VzYi9uZXQvcGx1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMyYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L3BsdXNiLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBQTC0yMzAxLzIzMDIgVVNCIGhvc3QtdG8taG9zdCBsaW5rIGNhYmxlcworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNibmV0LmgiCisKKworLyoKKyAqIFByb2xpZmljIFBMLTIzMDEvUEwtMjMwMiBkcml2ZXIgLi4uIGh0dHA6Ly93d3cucHJvbGlmaWN0ZWNoLmNvbQorICoKKyAqIFRoZSBwcm90b2NvbCBhbmQgaGFuZHNoYWtpbmcgdXNlZCBoZXJlIHNob3VsZCBiZSBidWctY29tcGF0aWJsZQorICogd2l0aCB0aGUgTGludXggMi4yICJwbHVzYiIgZHJpdmVyLCBieSBEZXRpIEZsaWVnbC4KKyAqCisgKiBIRUFEUyBVUDogIHRoaXMgaGFuZHNoYWtpbmcgaXNuJ3QgYWxsIHRoYXQgcm9idXN0LiAgVGhpcyBkcml2ZXIKKyAqIGdldHMgY29uZnVzZWQgZWFzaWx5IGlmIHlvdSB1bnBsdWcgb25lIGVuZCBvZiB0aGUgY2FibGUgdGhlbgorICogdHJ5IHRvIGNvbm5lY3QgaXQgYWdhaW47IHlvdSdsbCBuZWVkIHRvIHJlc3RhcnQgYm90aCBlbmRzLiBUaGUKKyAqICJuYXBsaW5rIiBzb2Z0d2FyZSAodXNlZCBieSBzb21lIFBsYXlTdGF0aW9uLzIgZGV2ZW9wZXJzKSBkb2VzCisgKiB0aGUgaGFuZHNoYWtpbmcgbXVjaCBiZXR0ZXIhICAgQWxzbywgc29tZXRpbWVzIHRoaXMgaGFyZHdhcmUKKyAqIHNlZW1zIHRvIGdldCB3ZWRnZWQgdW5kZXIgbG9hZC4gIFByb2xpZmljIGRvY3MgYXJlIHdlYWssIGFuZAorICogZG9uJ3QgaWRlbnRpZnkgZGlmZmVyZW5jZXMgYmV0d2VlbiBQTDIzMDEgYW5kIFBMMjMwMiwgbXVjaCBsZXNzCisgKiBhbnl0aGluZyB0byBleHBsYWluIHRoZSBkaWZmZXJlbnQgUEwyMzAyIHZlcnNpb25zIG9ic2VydmVkLgorICovCisKKy8qCisgKiBCaXRzIDAtNCBjYW4gYmUgdXNlZCBmb3Igc29mdHdhcmUgaGFuZHNoYWtpbmc7IHRoZXkncmUgc2V0IGZyb20KKyAqIG9uZSBlbmQsIGNsZWFyZWQgZnJvbSB0aGUgb3RoZXIsICJyZWFkIiB3aXRoIHRoZSBpbnRlcnJ1cHQgYnl0ZS4KKyAqLworI2RlZmluZQlQTF9TX0VOCQkoMTw8NykJCS8qIChmZWF0dXJlIG9ubHkpIHN1c3BlbmQgZW5hYmxlICovCisvKiByZXNlcnZlZCBiaXQgLS0gcnggcmVhZHkgKDYpID8gKi8KKyNkZWZpbmUJUExfVFhfUkVBRFkJKDE8PDUpCQkvKiAoaW50ZXJydXB0IG9ubHkpIHRyYW5zbWl0IHJlYWR5ICovCisjZGVmaW5lCVBMX1JFU0VUX09VVAkoMTw8NCkJCS8qIHJlc2V0IG91dHB1dCBwaXBlICovCisjZGVmaW5lCVBMX1JFU0VUX0lOCSgxPDwzKQkJLyogcmVzZXQgaW5wdXQgcGlwZSAqLworI2RlZmluZQlQTF9UWF9DCQkoMTw8MikJCS8qIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAqLworI2RlZmluZQlQTF9UWF9SRVEJKDE8PDEpCQkvKiB0cmFuc21pc3Npb24gcmVjZWl2ZWQgKi8KKyNkZWZpbmUJUExfUEVFUl9FCSgxPDwwKQkJLyogcGVlciBleGlzdHMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3BsX3ZlbmRvcl9yZXEoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZXEsIHU4IHZhbCwgdTggaW5kZXgpCit7CisJcmV0dXJuIHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlyZXEsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWwsIGluZGV4LAorCQlOVUxMLCAwLAorCQlVU0JfQ1RSTF9HRVRfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitwbF9jbGVhcl9RdWlja0xpbmtfZmVhdHVyZXMoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgdmFsKQoreworCXJldHVybiBwbF92ZW5kb3JfcmVxKGRldiwgMSwgKHU4KSB2YWwsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludAorcGxfc2V0X1F1aWNrTGlua19mZWF0dXJlcyhzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCB2YWwpCit7CisJcmV0dXJuIHBsX3ZlbmRvcl9yZXEoZGV2LCAzLCAodTgpIHZhbCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcGxfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCS8qIHNvbWUgdW5pdHMgc2VlbSB0byBuZWVkIHRoaXMgcmVzZXQsIG90aGVycyByZWplY3QgaXQgdXR0ZXJseS4KKwkgKiBGSVhNRSBiZSBtb3JlIGxpa2UgIm5hcGxpbmsiIG9yIHdpbmRvd3MgZHJpdmVycy4KKwkgKi8KKwkodm9pZCkgcGxfc2V0X1F1aWNrTGlua19mZWF0dXJlcyhkZXYsCisJCVBMX1NfRU58UExfUkVTRVRfT1VUfFBMX1JFU0VUX0lOfFBMX1BFRVJfRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JcHJvbGlmaWNfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiUHJvbGlmaWMgUEwtMjMwMS9QTC0yMzAyIiwKKwkuZmxhZ3MgPQlGTEFHX05PX1NFVElOVCwKKwkJLyogc29tZSBQTC0yMzAyIHZlcnNpb25zIHNlZW0gdG8gZmFpbCB1c2Jfc2V0X2ludGVyZmFjZSgpICovCisJLnJlc2V0ID0JcGxfcmVzZXQsCit9OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBQcm9pbGlmaWMncyBuYW1lIHdvbid0IG5vcm1hbGx5IGJlIG9uIHRoZSBjYWJsZXMsIGFuZAorICogbWF5IG5vdCBiZSBvbiB0aGUgZGV2aWNlLgorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0cyBbXSA9IHsKKworeworCVVTQl9ERVZJQ0UoMHgwNjdiLCAweDAwMDApLAkvLyBQTC0yMzAxCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZwcm9saWZpY19pbmZvLAorfSwgeworCVVTQl9ERVZJQ0UoMHgwNjdiLCAweDAwMDEpLAkvLyBQTC0yMzAyCisJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZwcm9saWZpY19pbmZvLAorfSwKKworCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwbHVzYl9kcml2ZXIgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInBsdXNiIiwKKwkuaWRfdGFibGUgPQlwcm9kdWN0cywKKwkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CXVzYm5ldF9zdXNwZW5kLAorCS5yZXN1bWUgPQl1c2JuZXRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGx1c2JfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZwbHVzYl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQocGx1c2JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbHVzYl9leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZwbHVzYl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocGx1c2JfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlByb2xpZmljIFBMLTIzMDEvMjMwMiBVU0IgSG9zdCB0byBIb3N0IExpbmsgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvcm5kaXNfaG9zdC5jIGIvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQyZTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYwpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIEhvc3QgU2lkZSBzdXBwb3J0IGZvciBSTkRJUyBOZXR3b3JraW5nIExpbmtzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jZGMuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qCisgKiBSTkRJUyBpcyBORElTIHJlbW90ZWQgb3ZlciBVU0IuICBJdCdzIGEgTVNGVCB2YXJpYW50IG9mIENEQyBBQ00gLi4uIG9mCisgKiBjb3Vyc2UgQUNNIHdhcyBpbnRlbmRlZCBmb3IgbW9kZW1zLCBub3QgRXRoZXJuZXQgbGlua3MhICBVU0IncyBzdGFuZGFyZAorICogZm9yIEV0aGVybmV0IGxpbmtzIGlzICJDREMgRXRoZXJuZXQiLCB3aGljaCBpcyBzaWduaWZpY2FudGx5IHNpbXBsZXIuCisgKi8KKworLyoKKyAqIENPTlRST0wgdXNlcyBDREMgImVuY2Fwc3VsYXRlZCBjb21tYW5kcyIgd2l0aCBmdW5reSBub3RpZmljYXRpb25zLgorICogIC0gY29udHJvbC1vdXQ6ICBTRU5EX0VOQ0FQU1VMQVRFRAorICogIC0gaW50ZXJydXB0LWluOiAgUkVTUE9OU0VfQVZBSUxBQkxFCisgKiAgLSBjb250cm9sLWluOiAgR0VUX0VOQ0FQU1VMQVRFRAorICoKKyAqIFdlJ2xsIHRyeSB0byBpZ25vcmUgdGhlIFJFU1BPTlNFX0FWQUlMQUJMRSBub3RpZmljYXRpb25zLgorICovCitzdHJ1Y3Qgcm5kaXNfbXNnX2hkciB7CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR18qICovCisJX19sZTMyCW1zZ19sZW47CisJLy8gZm9sbG93ZWQgYnkgZGF0YSB0aGF0IHZhcmllcyBiZXR3ZWVuIG1lc3NhZ2VzCisJX19sZTMyCXJlcXVlc3RfaWQ7CisJX19sZTMyCXN0YXR1czsKKwkvLyAuLi4gYW5kIG1vcmUKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBSTkRJUyBkZWZpbmVzIHRoaXMgKGFic3VyZGx5IGh1Z2UpIGNvbnRyb2wgdGltZW91dCAqLworI2RlZmluZQlSTkRJU19DT05UUk9MX1RJTUVPVVRfTVMJKDEwICogMTAwMCkKKworCisjZGVmaW5lIGNjcHUyIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIKKworI2RlZmluZSBSTkRJU19NU0dfQ09NUExFVElPTgljY3B1MigweDgwMDAwMDAwKQorCisvKiBjb2RlcyBmb3IgIm1zZ190eXBlIiBmaWVsZCBvZiBybmRpcyBtZXNzYWdlczsKKyAqIG9ubHkgdGhlIGRhdGEgY2hhbm5lbCB1c2VzIHBhY2tldCBtZXNzYWdlcyAobWF5YmUgYmF0Y2hlZCk7CisgKiBldmVyeXRoaW5nIGVsc2UgZ29lcyBvbiB0aGUgY29udHJvbCBjaGFubmVsLgorICovCisjZGVmaW5lIFJORElTX01TR19QQUNLRVQJY2NwdTIoMHgwMDAwMDAwMSkJLyogMS1OIHBhY2tldHMgKi8KKyNkZWZpbmUgUk5ESVNfTVNHX0lOSVQJCWNjcHUyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFJORElTX01TR19JTklUX0MgCShSTkRJU19NU0dfSU5JVHxSTkRJU19NU0dfQ09NUExFVElPTikKKyNkZWZpbmUgUk5ESVNfTVNHX0hBTFQJCWNjcHUyKDB4MDAwMDAwMDMpCisjZGVmaW5lIFJORElTX01TR19RVUVSWQkJY2NwdTIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgUk5ESVNfTVNHX1FVRVJZX0MgCShSTkRJU19NU0dfUVVFUll8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisjZGVmaW5lIFJORElTX01TR19TRVQJCWNjcHUyKDB4MDAwMDAwMDUpCisjZGVmaW5lIFJORElTX01TR19TRVRfQyAJKFJORElTX01TR19TRVR8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisjZGVmaW5lIFJORElTX01TR19SRVNFVAkJY2NwdTIoMHgwMDAwMDAwNikKKyNkZWZpbmUgUk5ESVNfTVNHX1JFU0VUX0MgCShSTkRJU19NU0dfUkVTRVR8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisjZGVmaW5lIFJORElTX01TR19JTkRJQ0FURQljY3B1MigweDAwMDAwMDA3KQorI2RlZmluZSBSTkRJU19NU0dfS0VFUEFMSVZFCWNjcHUyKDB4MDAwMDAwMDgpCisjZGVmaW5lIFJORElTX01TR19LRUVQQUxJVkVfQyAJKFJORElTX01TR19LRUVQQUxJVkV8Uk5ESVNfTVNHX0NPTVBMRVRJT04pCisKKy8qIGNvZGVzIGZvciAic3RhdHVzIiBmaWVsZCBvZiBjb21wbGV0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lCVJORElTX1NUQVRVU19TVUNDRVNTCQljY3B1MigweDAwMDAwMDAwKQorI2RlZmluZQlSTkRJU19TVEFUVVNfRkFJTFVSRQkJY2NwdTIoMHhjMDAwMDAwMSkKKyNkZWZpbmUJUk5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQljY3B1MigweGMwMDEwMDE1KQorI2RlZmluZQlSTkRJU19TVEFUVVNfTk9UX1NVUFBPUlRFRAljY3B1MigweGMwMDAwMGJiKQorI2RlZmluZQlSTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVAljY3B1MigweDQwMDEwMDBiKQorI2RlZmluZQlSTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVAljY3B1MigweDQwMDEwMDBjKQorCisKK3N0cnVjdCBybmRpc19kYXRhX2hkciB7CisJX19sZTMyCW1zZ190eXBlOwkJLyogUk5ESVNfTVNHX1BBQ0tFVCAqLworCV9fbGUzMgltc2dfbGVuOwkJLy8gcm5kaXNfZGF0YV9oZHIgKyBkYXRhX2xlbiArIHBhZAorCV9fbGUzMglkYXRhX29mZnNldDsJCS8vIDM2IC0tIHJpZ2h0IGFmdGVyIGhlYWRlcgorCV9fbGUzMglkYXRhX2xlbjsJCS8vIC4uLiByZWFsIHBhY2tldCBzaXplCisKKwlfX2xlMzIJb29iX2RhdGFfb2Zmc2V0OwkvLyB6ZXJvCisJX19sZTMyCW9vYl9kYXRhX2xlbjsJCS8vIHplcm8KKwlfX2xlMzIJbnVtX29vYjsJCS8vIHplcm8KKwlfX2xlMzIJcGFja2V0X2RhdGFfb2Zmc2V0OwkvLyB6ZXJvCisKKwlfX2xlMzIJcGFja2V0X2RhdGFfbGVuOwkvLyB6ZXJvCisJX19sZTMyCXZjX2hhbmRsZTsJCS8vIHplcm8KKwlfX2xlMzIJcmVzZXJ2ZWQ7CQkvLyB6ZXJvCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX2luaXQgewkJLyogT1VUICovCisJLy8gaGVhZGVyIGFuZDoKKwlfX2xlMzIJbXNnX3R5cGU7CQkJLyogUk5ESVNfTVNHX0lOSVQgKi8KKwlfX2xlMzIJbXNnX2xlbjsJCQkvLyAyNAorCV9fbGUzMglyZXF1ZXN0X2lkOworCV9fbGUzMgltYWpvcl92ZXJzaW9uOwkJCS8vIG9mIHJuZGlzICgxLjApCisJX19sZTMyCW1pbm9yX3ZlcnNpb247CisJX19sZTMyCW1heF90cmFuc2Zlcl9zaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBybmRpc19pbml0X2MgewkJLyogSU4gKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfSU5JVF9DICovCisJX19sZTMyCW1zZ19sZW47CisJX19sZTMyCXJlcXVlc3RfaWQ7CisJX19sZTMyCXN0YXR1czsKKwlfX2xlMzIJbWFqb3JfdmVyc2lvbjsJCQkvLyBvZiBybmRpcyAoMS4wKQorCV9fbGUzMgltaW5vcl92ZXJzaW9uOworCV9fbGUzMglkZXZpY2VfZmxhZ3M7CisJX19sZTMyCW1lZGl1bTsJCQkJLy8gemVybyA9PSA4MDIuMworCV9fbGUzMgltYXhfcGFja2V0c19wZXJfbWVzc2FnZTsKKwlfX2xlMzIJbWF4X3RyYW5zZmVyX3NpemU7CisJX19sZTMyCXBhY2tldF9hbGlnbm1lbnQ7CQkvLyBtYXggNzsgKDE8PG4pIGJ5dGVzCisJX19sZTMyCWFmX2xpc3Rfb2Zmc2V0OwkJCS8vIHplcm8KKwlfX2xlMzIJYWZfbGlzdF9zaXplOwkJCS8vIHplcm8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfaGFsdCB7CQkvKiBPVVQgKG5vIHJlcGx5KSAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19IQUxUICovCisJX19sZTMyCW1zZ19sZW47CisJX19sZTMyCXJlcXVlc3RfaWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX3F1ZXJ5IHsJCS8qIE9VVCAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19RVUVSWSAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglyZXF1ZXN0X2lkOworCV9fbGUzMglvaWQ7CisJX19sZTMyCWxlbjsKKwlfX2xlMzIJb2Zmc2V0OworLyo/Ki8JX19sZTMyCWhhbmRsZTsJCQkJLy8gemVybworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBybmRpc19xdWVyeV9jIHsJCS8qIElOICovCisJLy8gaGVhZGVyIGFuZDoKKwlfX2xlMzIJbXNnX3R5cGU7CQkJLyogUk5ESVNfTVNHX1FVRVJZX0MgKi8KKwlfX2xlMzIJbXNnX2xlbjsKKwlfX2xlMzIJcmVxdWVzdF9pZDsKKwlfX2xlMzIJc3RhdHVzOworCV9fbGUzMglsZW47CisJX19sZTMyCW9mZnNldDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfc2V0IHsJCS8qIE9VVCAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19TRVQgKi8KKwlfX2xlMzIJbXNnX2xlbjsKKwlfX2xlMzIJcmVxdWVzdF9pZDsKKwlfX2xlMzIJb2lkOworCV9fbGUzMglsZW47CisJX19sZTMyCW9mZnNldDsKKy8qPyovCV9fbGUzMgloYW5kbGU7CQkJCS8vIHplcm8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfc2V0X2MgewkJLyogSU4gKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfU0VUX0MgKi8KKwlfX2xlMzIJbXNnX2xlbjsKKwlfX2xlMzIJcmVxdWVzdF9pZDsKKwlfX2xlMzIJc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBybmRpc19yZXNldCB7CQkvKiBJTiAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19SRVNFVCAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglyZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfcmVzZXRfYyB7CQkvKiBPVVQgKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfUkVTRVRfQyAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglzdGF0dXM7CisJX19sZTMyCWFkZHJlc3NpbmdfbG9zdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGUgewkJLyogSU4gKHVucmVxdWVzdGVkKSAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19JTkRJQ0FURSAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglzdGF0dXM7CisJX19sZTMyCWxlbmd0aDsKKwlfX2xlMzIJb2Zmc2V0OworLyoqLwlfX2xlMzIJZGlhZ19zdGF0dXM7CisJX19sZTMyCWVycm9yX29mZnNldDsKKy8qKi8JX19sZTMyCW1lc3NhZ2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX2tlZXBhbGl2ZSB7CS8qIE9VVCAob3B0aW9uYWxseSBJTikgKi8KKwkvLyBoZWFkZXIgYW5kOgorCV9fbGUzMgltc2dfdHlwZTsJCQkvKiBSTkRJU19NU0dfS0VFUEFMSVZFICovCisJX19sZTMyCW1zZ19sZW47CisJX19sZTMyCXJlcXVlc3RfaWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9jIHsJLyogSU4gKG9wdGlvbmFsbHkgT1VUKSAqLworCS8vIGhlYWRlciBhbmQ6CisJX19sZTMyCW1zZ190eXBlOwkJCS8qIFJORElTX01TR19LRUVQQUxJVkVfQyAqLworCV9fbGUzMgltc2dfbGVuOworCV9fbGUzMglyZXF1ZXN0X2lkOworCV9fbGUzMglzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogTk9URTogIGFib3V0IDMwIE9JRHMgYXJlICJtYW5kYXRvcnkiIGZvciBwZXJpcGhlcmFscyB0byBzdXBwb3J0IC4uLiBhbmQKKyAqIHRoZXJlIGFyZSBnb2JzIG1vcmUgdGhhdCBtYXkgb3B0aW9uYWxseSBiZSBzdXBwb3J0ZWQuICBXZSdsbCBhdm9pZCBhcyBtdWNoCisgKiBvZiB0aGF0IG1lc3MgYXMgcG9zc2libGUuCisgKi8KKyNkZWZpbmUgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTCWNjcHUyKDB4MDEwMTAxMDEpCisjZGVmaW5lIE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSCWNjcHUyKDB4MDAwMTAxMGUpCisKKy8qCisgKiBSTkRJUyBub3RpZmljYXRpb25zIGZyb20gZGV2aWNlOiBjb21tYW5kIGNvbXBsZXRpb247ICJyZXZlcnNlIgorICoga2VlcGFsaXZlczsgZXRjCisgKi8KK3N0YXRpYyB2b2lkIHJuZGlzX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlkZXZkYmcoZGV2LCAicm5kaXMgc3RhdHVzIHVyYiwgbGVuICVkIHN0YXQgJWQiLAorCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+c3RhdHVzKTsKKwkvLyBGSVhNRSBmb3Iga2VlcGFsaXZlcywgcmVzcG9uZCBpbW1lZGlhdGVseSAoYXN5bmNocm9ub3VzbHkpCisJLy8gaWYgbm90IGFuIFJORElTIHN0YXR1cywgZG8gbGlrZSBjZGNfc3RhdHVzKGRldix1cmIpIGRvZXMKK30KKworLyoKKyAqIFJQQyBkb25lIFJORElTLXN0eWxlLiAgQ2FsbGVyIGd1YXJhbnRlZXM6CisgKiAtIG1lc3NhZ2UgaXMgcHJvcGVybHkgYnl0ZXN3YXBwZWQKKyAqIC0gdGhlcmUncyBubyBvdGhlciByZXF1ZXN0IHBlbmRpbmcKKyAqIC0gYnVmIGNhbiBob2xkIHVwIHRvIDFLQiByZXNwb25zZSAocmVxdWlyZWQgYnkgUk5ESVMgc3BlYykKKyAqIE9uIHJldHVybiwgdGhlIGZpcnN0IGZldyBlbnRyaWVzIGFyZSBhbHJlYWR5IGJ5dGVzd2FwcGVkLgorICoKKyAqIENhbGwgY29udGV4dCBpcyBsaWtlbHkgcHJvYmUoKSwgYmVmb3JlIGludGVyZmFjZSBuYW1lIGlzIGtub3duLAorICogd2hpY2ggaXMgd2h5IHdlIHdvbid0IHRyeSB0byB1c2UgaXQgaW4gdGhlIGRpYWdub3N0aWNzLgorICovCitzdGF0aWMgaW50IHJuZGlzX2NvbW1hbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgcm5kaXNfbXNnX2hkciAqYnVmKQoreworCXN0cnVjdCBjZGNfc3RhdGUJKmluZm8gPSAodm9pZCAqKSAmZGV2LT5kYXRhOworCWludAkJCXJldHZhbDsKKwl1bnNpZ25lZAkJY291bnQ7CisJX19sZTMyCQkJcnNwOworCXUzMgkJCXhpZCA9IDAsIG1zZ19sZW4sIHJlcXVlc3RfaWQ7CisKKwkvKiBSRVZJU0lUIHdoZW4gdGhpcyBnZXRzIGNhbGxlZCBmcm9tIGNvbnRleHRzIG90aGVyIHRoYW4gcHJvYmUoKSBvcgorCSAqIGRpc2Nvbm5lY3QoKTogZWl0aGVyIHNlcmlhbGl6ZSwgb3IgZGlzcGF0Y2ggcmVzcG9uc2VzIG9uIHhpZAorCSAqLworCisJLyogSXNzdWUgdGhlIHJlcXVlc3Q7IGRvbid0IGJvdGhlciBieXRlc3dhcHBpbmcgb3VyIHhpZCAqLworCWlmIChsaWtlbHkoYnVmLT5tc2dfdHlwZSAhPSBSTkRJU19NU0dfSEFMVAorCQkJJiYgYnVmLT5tc2dfdHlwZSAhPSBSTkRJU19NU0dfUkVTRVQpKSB7CisJCXhpZCA9IGRldi0+eGlkKys7CisJCWlmICgheGlkKQorCQkJeGlkID0gZGV2LT54aWQrKzsKKwkJYnVmLT5yZXF1ZXN0X2lkID0gKF9fZm9yY2UgX19sZTMyKSB4aWQ7CisJfQorCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlVU0JfQ0RDX1NFTkRfRU5DQVBTVUxBVEVEX0NPTU1BTkQsCisJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJMCwgaW5mby0+dS0+Yk1hc3RlckludGVyZmFjZTAsCisJCWJ1ZiwgbGUzMl90b19jcHUoYnVmLT5tc2dfbGVuKSwKKwkJUk5ESVNfQ09OVFJPTF9USU1FT1VUX01TKTsKKwlpZiAodW5saWtlbHkocmV0dmFsIDwgMCB8fCB4aWQgPT0gMCkpCisJCXJldHVybiByZXR2YWw7CisKKwkvLyBGSVhNRSBTZWVtcyBsaWtlIHNvbWUgZGV2aWNlcyBkaXNjYXJkIHJlc3BvbnNlcyB3aGVuCisJLy8gd2UgdGltZSBvdXQgYW5kIGNhbmNlbCBvdXIgImdldCByZXNwb25zZSIgcmVxdWVzdHMuLi4KKwkvLyBzbywgdGhpcyBpcyBmcmFnaWxlLiAgUHJvYmFibHkgbmVlZCB0byBwb2xsIGZvciBzdGF0dXMuCisKKwkvKiBpZ25vcmUgc3RhdHVzIGVuZHBvaW50LCBqdXN0IHBvbGwgdGhlIGNvbnRyb2wgY2hhbm5lbDsKKwkgKiB0aGUgcmVxdWVzdCBwcm9iYWJseSBjb21wbGV0ZWQgaW1tZWRpYXRlbHkKKwkgKi8KKwlyc3AgPSBidWYtPm1zZ190eXBlIHwgUk5ESVNfTVNHX0NPTVBMRVRJT047CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50KyspIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgMTAyNCk7CisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJCVVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSwKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkwLCBpbmZvLT51LT5iTWFzdGVySW50ZXJmYWNlMCwKKwkJCWJ1ZiwgMTAyNCwKKwkJCVJORElTX0NPTlRST0xfVElNRU9VVF9NUyk7CisJCWlmIChsaWtlbHkocmV0dmFsID49IDgpKSB7CisJCQltc2dfbGVuID0gbGUzMl90b19jcHUoYnVmLT5tc2dfbGVuKTsKKwkJCXJlcXVlc3RfaWQgPSAoX19mb3JjZSB1MzIpIGJ1Zi0+cmVxdWVzdF9pZDsKKwkJCWlmIChsaWtlbHkoYnVmLT5tc2dfdHlwZSA9PSByc3ApKSB7CisJCQkJaWYgKGxpa2VseShyZXF1ZXN0X2lkID09IHhpZCkpIHsKKwkJCQkJaWYgKHVubGlrZWx5KHJzcCA9PSBSTkRJU19NU0dfUkVTRVRfQykpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJaWYgKGxpa2VseShSTkRJU19TVEFUVVNfU1VDQ0VTUworCQkJCQkJCT09IGJ1Zi0+c3RhdHVzKSkKKwkJCQkJCXJldHVybiAwOworCQkJCQlkZXZfZGJnKCZpbmZvLT5jb250cm9sLT5kZXYsCisJCQkJCQkicm5kaXMgcmVwbHkgc3RhdHVzICUwOHhcbiIsCisJCQkJCQlsZTMyX3RvX2NwdShidWYtPnN0YXR1cykpOworCQkJCQlyZXR1cm4gLUVMM1JTVDsKKwkJCQl9CisJCQkJZGV2X2RiZygmaW5mby0+Y29udHJvbC0+ZGV2LAorCQkJCQkicm5kaXMgcmVwbHkgaWQgJWQgZXhwZWN0ZWQgJWRcbiIsCisJCQkJCXJlcXVlc3RfaWQsIHhpZCk7CisJCQkJLyogdGhlbiBsaWtlbHkgcmV0cnkgKi8KKwkJCX0gZWxzZSBzd2l0Y2ggKGJ1Zi0+bXNnX3R5cGUpIHsKKwkJCWNhc2UgUk5ESVNfTVNHX0lORElDQVRFOiB7CS8qIGZhdWx0ICovCisJCQkJLy8gc3RydWN0IHJuZGlzX2luZGljYXRlICptc2cgPSAodm9pZCAqKWJ1ZjsKKwkJCQlkZXZfaW5mbygmaW5mby0+Y29udHJvbC0+ZGV2LAorCQkJCQkgInJuZGlzIGZhdWx0IGluZGljYXRpb25cbiIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUk5ESVNfTVNHX0tFRVBBTElWRTogewkvKiBwaW5nICovCisJCQkJc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9jICptc2cgPSAodm9pZCAqKWJ1ZjsKKworCQkJCW1zZy0+bXNnX3R5cGUgPSBSTkRJU19NU0dfS0VFUEFMSVZFX0M7CisJCQkJbXNnLT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICptc2cpOworCQkJCW1zZy0+c3RhdHVzID0gUk5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwKKwkJCQkJdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCQkJCVVTQl9DRENfU0VORF9FTkNBUFNVTEFURURfQ09NTUFORCwKKwkJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCQkwLCBpbmZvLT51LT5iTWFzdGVySW50ZXJmYWNlMCwKKwkJCQkJbXNnLCBzaXplb2YgKm1zZywKKwkJCQkJUk5ESVNfQ09OVFJPTF9USU1FT1VUX01TKTsKKwkJCQlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpCisJCQkJCWRldl9kYmcoJmluZm8tPmNvbnRyb2wtPmRldiwKKwkJCQkJCSJybmRpcyBrZWVwYWxpdmUgZXJyICVkXG4iLAorCQkJCQkJcmV0dmFsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRldl9kYmcoJmluZm8tPmNvbnRyb2wtPmRldiwKKwkJCQkJInVuZXhwZWN0ZWQgcm5kaXMgbXNnICUwOHggbGVuICVkXG4iLAorCQkJCQlsZTMyX3RvX2NwdShidWYtPm1zZ190eXBlKSwgbXNnX2xlbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBkZXZpY2UgcHJvYmFibHkgaXNzdWVkIGEgcHJvdG9jb2wgc3RhbGw7IGlnbm9yZSAqLworCQkJZGV2X2RiZygmaW5mby0+Y29udHJvbC0+ZGV2LAorCQkJCSJybmRpcyByZXNwb25zZSBlcnJvciwgY29kZSAlZFxuIiwgcmV0dmFsKTsKKwkJfQorCQltc2xlZXAoMik7CisJfQorCWRldl9kYmcoJmluZm8tPmNvbnRyb2wtPmRldiwgInJuZGlzIHJlc3BvbnNlIHRpbWVvdXRcbiIpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IHJuZGlzX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQJCQlyZXR2YWw7CisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldCA9IGRldi0+bmV0OworCXVuaW9uIHsKKwkJdm9pZAkJCSpidWY7CisJCXN0cnVjdCBybmRpc19tc2dfaGRyCSpoZWFkZXI7CisJCXN0cnVjdCBybmRpc19pbml0CSppbml0OworCQlzdHJ1Y3Qgcm5kaXNfaW5pdF9jCSppbml0X2M7CisJCXN0cnVjdCBybmRpc19xdWVyeQkqZ2V0OworCQlzdHJ1Y3Qgcm5kaXNfcXVlcnlfYwkqZ2V0X2M7CisJCXN0cnVjdCBybmRpc19zZXQJKnNldDsKKwkJc3RydWN0IHJuZGlzX3NldF9jCSpzZXRfYzsKKwl9IHU7CisJdTMyCQkJdG1wOworCisJLyogd2UgY2FuJ3QgcmVseSBvbiBpL28gZnJvbSBzdGFjayB3b3JraW5nLCBvciBzdGFjayBhbGxvY2F0aW9uICovCisJdS5idWYgPSBrbWFsbG9jKDEwMjQsIEdGUF9LRVJORUwpOworCWlmICghdS5idWYpCisJCXJldHVybiAtRU5PTUVNOworCXJldHZhbCA9IHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKGRldiwgaW50Zik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZG9uZTsKKworCW5ldC0+aGFyZF9oZWFkZXJfbGVuICs9IHNpemVvZiAoc3RydWN0IHJuZGlzX2RhdGFfaGRyKTsKKworCS8qIGluaXRpYWxpemU7IG1heCB0cmFuc2ZlciBpcyAxNktCIGF0IGZ1bGwgc3BlZWQgKi8KKwl1LmluaXQtPm1zZ190eXBlID0gUk5ESVNfTVNHX0lOSVQ7CisJdS5pbml0LT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICp1LmluaXQpOworCXUuaW5pdC0+bWFqb3JfdmVyc2lvbiA9IGNjcHUyKDEpOworCXUuaW5pdC0+bWlub3JfdmVyc2lvbiA9IGNjcHUyKDApOworCXUuaW5pdC0+bWF4X3RyYW5zZmVyX3NpemUgPSBjY3B1MihuZXQtPm10dSArIG5ldC0+aGFyZF9oZWFkZXJfbGVuKTsKKworCXJldHZhbCA9IHJuZGlzX2NvbW1hbmQoZGV2LCB1LmhlYWRlcik7CisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKSB7CisJCS8qIGl0IG1pZ2h0IG5vdCBldmVuIGJlIGFuIFJORElTIGRldmljZSEhICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIlJORElTIGluaXQgZmFpbGVkLCAlZFxuIiwgcmV0dmFsKTsKK2ZhaWw6CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyX29mKGludGYpLAorCQkJKChzdHJ1Y3QgY2RjX3N0YXRlICopJihkZXYtPmRhdGEpKS0+ZGF0YSk7CisJCWdvdG8gZG9uZTsKKwl9CisJZGV2LT5oYXJkX210dSA9IGxlMzJfdG9fY3B1KHUuaW5pdF9jLT5tYXhfdHJhbnNmZXJfc2l6ZSk7CisJLyogUkVWSVNJVDogIHBlcmlwaGVyYWwgImFsaWdubWVudCIgcmVxdWVzdCBpcyBpZ25vcmVkIC4uLiAqLworCWRldl9kYmcoJmludGYtPmRldiwgImhhcmQgbXR1ICV1LCBhbGlnbiAlZFxuIiwgZGV2LT5oYXJkX210dSwKKwkJMSA8PCBsZTMyX3RvX2NwdSh1LmluaXRfYy0+cGFja2V0X2FsaWdubWVudCkpOworCisJLyogZ2V0IGRlc2lnbmF0ZWQgaG9zdCBldGhlcm5ldCBhZGRyZXNzICovCisJbWVtc2V0KHUuZ2V0LCAwLCBzaXplb2YgKnUuZ2V0KTsKKwl1LmdldC0+bXNnX3R5cGUgPSBSTkRJU19NU0dfUVVFUlk7CisJdS5nZXQtPm1zZ19sZW4gPSBjY3B1MihzaXplb2YgKnUuZ2V0KTsKKwl1LmdldC0+b2lkID0gT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTOworCisJcmV0dmFsID0gcm5kaXNfY29tbWFuZChkZXYsIHUuaGVhZGVyKTsKKwlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAicm5kaXMgZ2V0IGV0aGFkZHIsICVkXG4iLCByZXR2YWwpOworCQlnb3RvIGZhaWw7CisJfQorCXRtcCA9IGxlMzJfdG9fY3B1KHUuZ2V0X2MtPm9mZnNldCk7CisJaWYgKHVubGlrZWx5KCh0bXAgKyA4KSA+ICgxMDI0IC0gRVRIX0FMRU4pCisJCQl8fCB1LmdldF9jLT5sZW4gIT0gY2NwdTIoRVRIX0FMRU4pKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJybmRpcyBldGhhZGRyIG9mZiAlZCBsZW4gJWQgP1xuIiwKKwkJCXRtcCwgbGUzMl90b19jcHUodS5nZXRfYy0+bGVuKSk7CisJCXJldHZhbCA9IC1FRE9NOworCQlnb3RvIGZhaWw7CisJfQorCW1lbWNweShuZXQtPmRldl9hZGRyLCB0bXAgKyAoY2hhciAqKSZ1LmdldF9jLT5yZXF1ZXN0X2lkLCBFVEhfQUxFTik7CisKKwkvKiBzZXQgYSBub256ZXJvIGZpbHRlciB0byBlbmFibGUgZGF0YSB0cmFuc2ZlcnMgKi8KKwltZW1zZXQodS5zZXQsIDAsIHNpemVvZiAqdS5zZXQpOworCXUuc2V0LT5tc2dfdHlwZSA9IFJORElTX01TR19TRVQ7CisJdS5zZXQtPm1zZ19sZW4gPSBjY3B1Mig0ICsgc2l6ZW9mICp1LnNldCk7CisJdS5zZXQtPm9pZCA9IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOworCXUuc2V0LT5sZW4gPSBjY3B1Mig0KTsKKwl1LnNldC0+b2Zmc2V0ID0gY2NwdTIoKHNpemVvZiAqdS5zZXQpIC0gOCk7CisJKihfX2xlMzIgKikodS5idWYgKyBzaXplb2YgKnUuc2V0KSA9IGNjcHUyKERFRkFVTFRfRklMVEVSKTsKKworCXJldHZhbCA9IHJuZGlzX2NvbW1hbmQoZGV2LCB1LmhlYWRlcik7CisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgInJuZGlzIHNldCBwYWNrZXQgZmlsdGVyLCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHZhbCA9IDA7Citkb25lOgorCWtmcmVlKHUuYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBybmRpc191bmJpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qgcm5kaXNfaGFsdAkqaGFsdDsKKworCS8qIHRyeSB0byBjbGVhciBhbnkgcm5kaXMgc3RhdGUvYWN0aXZpdHkgKG5vIGkvbyBmcm9tIHN0YWNrISkgKi8KKwloYWx0ID0ga2NhbGxvYygxLCBzaXplb2YgKmhhbHQsIFNMQUJfS0VSTkVMKTsKKwlpZiAoaGFsdCkgeworCQloYWx0LT5tc2dfdHlwZSA9IFJORElTX01TR19IQUxUOworCQloYWx0LT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICpoYWx0KTsKKwkJKHZvaWQpIHJuZGlzX2NvbW1hbmQoZGV2LCAodm9pZCAqKWhhbHQpOworCQlrZnJlZShoYWx0KTsKKwl9CisKKwlyZXR1cm4gdXNibmV0X2NkY191bmJpbmQoZGV2LCBpbnRmKTsKK30KKworLyoKKyAqIERBVEEgLS0gaG9zdCBtdXN0IG5vdCB3cml0ZSB6bHBzCisgKi8KK3N0YXRpYyBpbnQgcm5kaXNfcnhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIHBlcmlwaGVyYWwgbWF5IGhhdmUgYmF0Y2hlZCBwYWNrZXRzIHRvIHVzLi4uICovCisJd2hpbGUgKGxpa2VseShza2ItPmxlbikpIHsKKwkJc3RydWN0IHJuZGlzX2RhdGFfaGRyCSpoZHIgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJc3RydWN0IHNrX2J1ZmYJCSpza2IyOworCQl1MzIJCQltc2dfbGVuLCBkYXRhX29mZnNldCwgZGF0YV9sZW47CisKKwkJbXNnX2xlbiA9IGxlMzJfdG9fY3B1KGhkci0+bXNnX2xlbik7CisJCWRhdGFfb2Zmc2V0ID0gbGUzMl90b19jcHUoaGRyLT5kYXRhX29mZnNldCk7CisJCWRhdGFfbGVuID0gbGUzMl90b19jcHUoaGRyLT5kYXRhX2xlbik7CisKKwkJLyogZG9uJ3QgY2hva2UgaWYgd2Ugc2VlIG9vYiwgcGVyLXBhY2tldCBkYXRhLCBldGMgKi8KKwkJaWYgKHVubGlrZWx5KGhkci0+bXNnX3R5cGUgIT0gUk5ESVNfTVNHX1BBQ0tFVAorCQkJCXx8IHNrYi0+bGVuIDwgbXNnX2xlbgorCQkJCXx8IChkYXRhX29mZnNldCArIGRhdGFfbGVuICsgOCkgPiBtc2dfbGVuKSkgeworCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWRldmRiZyhkZXYsICJiYWQgcm5kaXMgbWVzc2FnZSAlZC8lZC8lZC8lZCwgbGVuICVkIiwKKwkJCQlsZTMyX3RvX2NwdShoZHItPm1zZ190eXBlKSwKKwkJCQltc2dfbGVuLCBkYXRhX29mZnNldCwgZGF0YV9sZW4sIHNrYi0+bGVuKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNrYl9wdWxsKHNrYiwgOCArIGRhdGFfb2Zmc2V0KTsKKworCQkvKiBhdCBtb3N0IG9uZSBwYWNrZXQgbGVmdD8gKi8KKwkJaWYgKGxpa2VseSgoZGF0YV9sZW4gLSBza2ItPmxlbikgPD0gc2l6ZW9mICpoZHIpKSB7CisJCQlza2JfdHJpbShza2IsIGRhdGFfbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogdHJ5IHRvIHJldHVybiBhbGwgdGhlIHBhY2tldHMgaW4gdGhlIGJhdGNoICovCisJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCFza2IyKSkKKwkJCWJyZWFrOworCQlza2JfcHVsbChza2IsIG1zZ19sZW4gLSBzaXplb2YgKmhkcik7CisJCXNrYl90cmltKHNrYjIsIGRhdGFfbGVuKTsKKwkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBza2IyKTsKKwl9CisKKwkvKiBjYWxsZXIgd2lsbCB1c2JuZXRfc2tiX3JldHVybiB0aGUgcmVtYWluaW5nIHBhY2tldCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorcm5kaXNfdHhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3Qgcm5kaXNfZGF0YV9oZHIJKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjI7CisJdW5zaWduZWQJCWxlbiA9IHNrYi0+bGVuOworCisJaWYgKGxpa2VseSghc2tiX2Nsb25lZChza2IpKSkgeworCQlpbnQJcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCisJCS8qIGVub3VnaCBoZWFkIHJvb20gYXMtaXM/ICovCisJCWlmICh1bmxpa2VseSgoc2l6ZW9mICpoZHIpIDw9IHJvb20pKQorCQkJZ290byBmaWxsOworCisJCS8qIGVub3VnaCByb29tLCBidXQgbmVlZHMgdG8gYmUgcmVhZGp1c3RlZD8gKi8KKwkJcm9vbSArPSBza2JfdGFpbHJvb20oc2tiKTsKKwkJaWYgKGxpa2VseSgoc2l6ZW9mICpoZHIpIDw9IHJvb20pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIHNpemVvZiAqaGRyLAorCQkJCQkgICAgc2tiLT5kYXRhLCBsZW4pOworCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgbGVuOworCQkJZ290byBmaWxsOworCQl9CisJfQorCisJLyogY3JlYXRlIGEgbmV3IHNrYiwgd2l0aCB0aGUgY29ycmVjdCBzaXplIChhbmQgdGFpbHBhZCkgKi8KKwlza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2l6ZW9mICpoZHIsIDEsIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlmICh1bmxpa2VseSghc2tiMikpCisJCXJldHVybiBza2IyOworCXNrYiA9IHNrYjI7CisKKwkvKiBmaWxsIG91dCB0aGUgUk5ESVMgaGVhZGVyLiAgd2Ugd29uJ3QgYm90aGVyIHRyeWluZyB0byBiYXRjaAorCSAqIHBhY2tldHM7IExpbnV4IG1pbmltaXplcyB3YXN0ZWQgYmFuZHdpZHRoIHRocm91Z2ggdHggcXVldWVzLgorCSAqLworZmlsbDoKKwloZHIgPSAodm9pZCAqKSBfX3NrYl9wdXNoKHNrYiwgc2l6ZW9mICpoZHIpOworCW1lbXNldChoZHIsIDAsIHNpemVvZiAqaGRyKTsKKwloZHItPm1zZ190eXBlID0gUk5ESVNfTVNHX1BBQ0tFVDsKKwloZHItPm1zZ19sZW4gPSBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJaGRyLT5kYXRhX29mZnNldCA9IGNjcHUyKHNpemVvZigqaGRyKSAtIDgpOworCWhkci0+ZGF0YV9sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCisJLyogRklYTUUgbWFrZSB0aGUgbGFzdCBwYWNrZXQgYWx3YXlzIGJlIHNob3J0IC4uLiAqLworCXJldHVybiBza2I7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlybmRpc19pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJSTkRJUyBkZXZpY2UiLAorCS5mbGFncyA9CUZMQUdfRVRIRVIgfCBGTEFHX0ZSQU1JTkdfUk4sCisJLmJpbmQgPQkJcm5kaXNfYmluZCwKKwkudW5iaW5kID0Jcm5kaXNfdW5iaW5kLAorCS5zdGF0dXMgPQlybmRpc19zdGF0dXMsCisJLnJ4X2ZpeHVwID0Jcm5kaXNfcnhfZml4dXAsCisJLnR4X2ZpeHVwID0Jcm5kaXNfdHhfZml4dXAsCit9OworCisjdW5kZWYgY2NwdTIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQJcHJvZHVjdHMgW10gPSB7Cit7CisJLyogUk5ESVMgaXMgTVNGVCdzIHVuLW9mZmljaWFsIHZhcmlhbnQgb2YgQ0RDIEFDTSAqLworCVVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfQ09NTSwgMiAvKiBBQ00gKi8sIDB4MGZmKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnJuZGlzX2luZm8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBybmRpc19kcml2ZXIgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInJuZGlzX2hvc3QiLAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorCS5wcm9iZSA9CXVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBybmRpc19pbml0KHZvaWQpCit7CisgCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJuZGlzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChybmRpc19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHJuZGlzX2V4aXQodm9pZCkKK3sKKyAJdXNiX2RlcmVnaXN0ZXIoJnJuZGlzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChybmRpc19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgQnJvd25lbGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVVNCIEhvc3Qgc2lkZSBSTkRJUyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCmluZGV4IDU5YWI0MGUuLmMzZDRlMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYwpAQCAtNjUzLDcgKzY1Myw2IEBACiB7CiAJcnRsODE1MF90ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXdhcm4oIiVzOiBUeCB0aW1lb3V0LiIsIG5ldGRldi0+bmFtZSk7Ci0JZGV2LT50eF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJdXNiX3VubGlua191cmIoZGV2LT50eF91cmIpOwogCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKaW5kZXggYTJmNjcyNC4uNmM0NjA5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwpAQCAtMSwxMCArMSw3IEBACiAvKgotICogVVNCIE5ldHdvcmtpbmcgTGlua3MKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA1IGJ5IERhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgorICogVVNCIE5ldHdvcmsgZHJpdmVyIGluZnJhc3RydWN0dXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBieSBEYXZpZCBCcm93bmVsbAogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgRGF2aWQgSG9sbGlzIDxkaG9sbGlzQGRhdmVob2xsaXMuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA1IFBoaWwgQ2hhbmcgPHBjaGFuZzIzQHNiY2dsb2JhbC5uZXQ+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBUaVZvIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIzLDk1ICsyMCwxNSBAQAogCiAvKgogICogVGhpcyBpcyBhIGdlbmVyaWMgIlVTQiBuZXR3b3JraW5nIiBmcmFtZXdvcmsgdGhhdCB3b3JrcyB3aXRoIHNldmVyYWwKLSAqIGtpbmRzIG9mIGZ1bGwgYW5kIGhpZ2ggc3BlZWQgbmV0d29ya2luZyBkZXZpY2VzOgorICoga2luZHMgb2YgZnVsbCBhbmQgaGlnaCBzcGVlZCBuZXR3b3JraW5nIGRldmljZXM6ICBob3N0LXRvLWhvc3QgY2FibGVzLAorICogc21hcnQgdXNiIHBlcmlwaGVyYWxzLCBhbmQgYWN0dWFsIEV0aGVybmV0IGFkYXB0ZXJzLgogICoKLSAqICAgKyBVU0IgaG9zdC10by1ob3N0ICJuZXR3b3JrIGNhYmxlcyIsIHVzZWQgZm9yIElQLW92ZXItVVNCIGxpbmtzLgotICogICAgIFRoZXNlIGFyZSBvZnRlbiB1c2VkIGZvciBMYXBsaW5rIHN0eWxlIGNvbm5lY3Rpdml0eSBwcm9kdWN0cy4KLSAqCS0gQW5jaG9yQ2hpcCAyNzIwCi0gKgktIEJlbGtpbiwgZVRFSyAoaW50ZXJvcHMgd2l0aCBXaW4zMiBkcml2ZXJzKQotICoJLSBHZW5lU3lzIEdMNjIwVVNCLUEKLSAqCS0gTmV0Q2hpcCAxMDgwIChpbnRlcm9wZXJhdGVzIHdpdGggTmV0Q2hpcCBXaW4zMiBkcml2ZXJzKQotICoJLSBQcm9saWZpYyBQTC0yMzAxLzIzMDIgKHJlcGxhY2VzICJwbHVzYiIgZHJpdmVyKQotICoJLSBLQyBUZWNobm9sb2d5IEtDMjE5MAotICoKLSAqICAgKyBTbWFydCBVU0IgZGV2aWNlcyBjYW4gc3VwcG9ydCBzdWNoIGxpbmtzIGRpcmVjdGx5LCB1c2luZyBJbnRlcm5ldAotICogICAgIHN0YW5kYXJkIHByb3RvY29scyBpbnN0ZWFkIG9mIHByb3ByaWV0YXJ5IGhvc3QtdG8tZGV2aWNlIGxpbmtzLgotICoJLSBMaW51eCBQREFzIGxpa2UgaVBhcSwgWW9weSwgYW5kIFphdXJ1cwotICoJLSBUaGUgQkxPQiBib290IGxvYWRlciAoZm9yIGRpc2tsZXNzIGJvb3RpbmcpCi0gKgktIExpbnV4ICJnYWRnZXRzIiwgcGVyaGFwcyB1c2luZyBQWEEtMnh4IG9yIE5ldDIyODAgY29udHJvbGxlcnMKLSAqCS0gRGV2aWNlcyB1c2luZyBFUFNPTidzIHNhbXBsZSBVU0IgZmlybXdhcmUKLSAqCS0gQ0RDLUV0aGVybmV0IGNsYXNzIGRldmljZXMsIHN1Y2ggYXMgbWFueSBjYWJsZSBtb2RlbXMKLSAqCi0gKiAgICsgQWRhcHRlcnMgdG8gbmV0d29ya3Mgc3VjaCBhcyBFdGhlcm5ldC4KLSAqCS0gQVg4ODE3WCBiYXNlZCBVU0IgMi4wIHByb2R1Y3RzCi0gKgotICogTGlua3MgdG8gdGhlc2UgZGV2aWNlcyBjYW4gYmUgYnJpZGdlZCB1c2luZyBMaW51eCBFdGhlcm5ldCBicmlkZ2luZy4KLSAqIFdpdGggbWlub3IgZXhjZXB0aW9ucywgdGhlc2UgYWxsIHVzZSBzaW1pbGFyIFVTQiBmcmFtaW5nIGZvciBuZXR3b3JrCi0gKiB0cmFmZmljLCBidXQgbmVlZCBkaWZmZXJlbnQgcHJvdG9jb2xzIGZvciBjb250cm9sIHRyYWZmaWMuCi0gKgotICogVVNCIGRldmljZXMgY2FuIGltcGxlbWVudCB0aGVpciBzaWRlIG9mIHRoaXMgcHJvdG9jb2wgYXQgdGhlIGNvc3QKLSAqIG9mIHR3byBidWxrIGVuZHBvaW50czsgaXQncyBub3QgcmVzdHJpY3RlZCB0byAiY2FibGUiIGFwcGxpY2F0aW9ucy4KLSAqIFNlZSB0aGUgU0ExMTEwLCBaYXVydXMsIG9yIEVQU09OIGRldmljZS9jbGllbnQgc3VwcG9ydCBpbiB0aGlzIGRyaXZlcjsKLSAqIHNsYXZlL3RhcmdldCBkcml2ZXJzIHN1Y2ggYXMgInVzYi1ldGgiIChvbiBtb3N0IFNBLTExMDAgUERBcykgb3IKLSAqICJnX2V0aGVyIiAoaW4gdGhlIExpbnV4ICJnYWRnZXQiIGZyYW1ld29yaykgaW1wbGVtZW50IHRoYXQgYmVoYXZpb3IKLSAqIHdpdGhpbiBkZXZpY2VzLgotICoKLSAqCi0gKiBDSEFOR0VMT0c6Ci0gKgotICogMTMtc2VwLTIwMDAJZXhwZXJpbWVudGFsLCBuZXcKLSAqIDEwLW9jdC0yMDAwCXVzYl9kZXZpY2VfaWQgdGFibGUgY3JlYXRlZC4gCi0gKiAyOC1vY3QtMjAwMAltaXNjIGZpeGVzOyBtb3N0bHksIGRpc2NhcmQgbW9yZSBUVEwtbWFuZ2xlZCByeCBwYWNrZXRzLgotICogMDEtbm92LTIwMDAJdXNiX2RldmljZV9pZCB0YWJsZSBhbmQgcHJvYmluZyBhcGkgdXBkYXRlIGJ5Ci0gKgkJQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+LgotICogMTgtZGVjLTIwMDAJKGRiKSB0eCB3YXRjaGRvZywgIm5ldDEwODAiIHJlbmFtaW5nIHRvICJ1c2JuZXQiLCBkZXZpY2VfaW5mbwotICoJCWFuZCBwcm9saWZpYyBzdXBwb3J0LCBpc29sYXRlIG5ldDEwODAtc3BlY2lmaWMgYml0cywgY2xlYW51cC4KLSAqCQlmaXggdW5saW5rX3VyYnMgb29wcyBpbiBEMyBQTSByZXN1bWUgY29kZSBwYXRoLgotICoKLSAqIDAyLWZlYi0yMDAxCShkYikgZml4IHR4IHNrYiBzaGFyaW5nLCBwYWNrZXQgbGVuZ3RoLCBtYXRjaF9mbGFncywgLi4uCi0gKiAwOC1mZWItMjAwMQlzdHViYmVkIGluICJsaW51eGRldiIsIG1heWJlIHRoZSBTQS0xMTAwIGZvbGsgY2FuIHVzZSBpdDsKLSAqCQlBbmNob3JDaGlwcyAyNzIwIHN1cHBvcnQgKGZyb20gc3BlYykgZm9yIHRlc3Rpbmc7Ci0gKgkJZml4IGJpdC1vcmRlcmluZyBwcm9ibGVtIHdpdGggZXRoZXJuZXQgbXVsdGljYXN0IGFkZHIKLSAqIDE5LWZlYi0yMDAxICBTdXBwb3J0IGZvciBjbGVhcmluZyBoYWx0IGNvbmRpdGlvbnMuIFNBMTEwMCBVREMgc3VwcG9ydAotICoJCXVwZGF0ZXMuIE9sZWcgRHJva2luIChncmVlbkBpWGNlbGVyYXRvci5jb20pCi0gKiAyNS1tYXItMjAwMQlNb3JlIFNBLTExMDAgdXBkYXRlcywgaW5jbHVkaW5nIHdvcmthcm91bmQgZm9yIGlwIHByb2JsZW0KLSAqCQlleHBlY3RpbmcgY2xlYXJlZCBza2ItPmNiIGFuZCBmcmFtaW5nIGNoYW5nZSB0byBtYXRjaCBsYXRlc3QKLSAqCQloYW5kaGVsZHMub3JnIHZlcnNpb24gKE9sZWcpLiAgRW5hYmxlIGRldmljZSBJRHMgZnJvbSB0aGUKLSAqCQlXaW4zMiBCZWxraW4gZHJpdmVyOyBvdGhlciBjbGVhbnVwcyAoZGIpLgotICogMTYtanVsLTIwMDEJQnVnZml4ZXMgZm9yIHVoY2kgb29wcy1vbi11bnBsdWcsIEJlbGtpbiBzdXBwb3J0LCB2YXJpb3VzCi0gKgkJY2xlYW51cHMgZm9yIHByb2JsZW1zIG5vdCB5ZXQgc2VlbiBpbiB0aGUgZmllbGQuIChkYikKLSAqIDE3LW9jdC0yMDAxCUhhbmRsZSAiQWR2YW5jZSBVU0JORVQiIHByb2R1Y3QsIGxpa2UgQmVsa2luL2VURUsgZGV2aWNlcywKLSAqCQlmcm9tIElvYW5uaXMgTWF2cm91a2FraXMgPGkubWF2cm91a2FraXNAYnRpbnRlcm5ldC5jb20+OwotICoJCXJ4IHVubGlua3Mgc29tZWhvdyB3ZXJlbid0IGFzeW5jOyBtaW5vciBjbGVhbnVwLgotICogMDMtbm92LTIwMDEJTWVyZ2VkIEdlbmVTeXMgZHJpdmVyOyBvcmlnaW5hbCBjb2RlIGZyb20gSml1bi1KaWUgSHVhbmcKLSAqCQk8aHVhbmdqakBnZW5lc3lzbG9naWMuY29tLnR3PiwgdXBkYXRlZCBieSBTdGFuaXNsYXYgQnJhYmVjCi0gKgkJPHV0eEBwZW5ndWluLmN6Pi4gIE1hZGUgZnJhbWluZyBvcHRpb25zIChOZXRDaGlwL0dlbmVTeXMpCi0gKgkJdGllIG1vc3RseSB0byAoc3ViKWRyaXZlciBpbmZvLiAgV29ya2Fyb3VuZCBzb21lIFBMLTIzMDIKLSAqCQljaGlwcyB0aGF0IHNlZW0gdG8gcmVqZWN0IFNFVF9JTlRFUkZBQ0UgcmVxdWVzdHMuCi0gKgotICogMDYtYXByLTIwMDIJQWRkZWQgZXRodG9vbCBzdXBwb3J0LCBiYXNlZCBvbiBhIHBhdGNoIGZyb20gQnJhZCBIYXJkcy4KLSAqCQlMZXZlbCBvZiBkaWFnbm9zdGljcyBpcyBtb3JlIGNvbmZpZ3VyYWJsZTsgdGhleSB1c2UgZGV2aWNlCi0gKgkJbG9jYXRpb24gKHVzYl9kZXZpY2UtPmRldnBhdGgpIGluc3RlYWQgb2YgYWRkcmVzcyAoMi41KS4KLSAqCQlGb3IgdHhfZml4dXAsIG1lbWZsYWdzIGNhbid0IGJlIE5PSU8uCi0gKiAwNy1tYXktMjAwMglHZW5lcmFsaXplL2NsZWFudXAga2V2ZW50ZCBzdXBwb3J0LCBoYW5kbGluZyByeCBzdGFsbHMgKG1vc3RseQotICoJCWZvciBVU0IgMi4wIFRUcykgYW5kIG1lbW9yeSBzaG9ydGFnZXMgKHBvdGVudGlhbCkgdG9vLiAoZGIpCi0gKgkJVXNlICJsb2NhbGx5IGFzc2lnbmVkIiBJRUVFODAyIGFkZHJlc3Mgc3BhY2UuIChCcmFkIEhhcmRzKQotICogMTgtb2N0LTIwMDIJU3VwcG9ydCBmb3IgWmF1cnVzIChQYXZlbCBNYWNoZWspLCByZWxhdGVkIGNsZWFudXAgKGRiKS4KLSAqIDE0LWRlYy0yMDAyCVJlbW92ZSBaYXVydXMtcHJpdmF0ZSBjcmMzMiBjb2RlIChQYXZlbCk7IDIuNSBvb3BzIGZpeCwKLSAqIAkJY2xlYW51cHMgYW5kIHN0dWJiZWQgUFhBLTI1MCBzdXBwb3J0IChkYiksIGZpeCBmb3IgZnJhbWluZwotICogCQlpc3N1ZXMgb24gWiwgbmV0MTA4MCwgYW5kIGdsNjIwYSAoVG9ieSBNaWxuZSkKLSAqCi0gKiAzMS1tYXItMjAwMwlVc2UgZW5kcG9pbnQgZGVzY3JpcHRvcnM6ICBoaWdoIHNwZWVkIHN1cHBvcnQsIHNpbXBsZXIgc2ExMTAwCi0gKiAJCXZzIHB4YTI1eCwgYW5kIENEQyBFdGhlcm5ldC4gIFRocm90dGxlIGRvd24gbG9nIGZsb29kcyBvbgotICogCQlkaXNjb25uZWN0OyBvdGhlciBjbGVhbnVwcy4gKGRiKSAgRmx1c2ggbmV0MTA4MCBmaWZvcwotICogCQlhZnRlciBzZXZlcmFsIHNlcXVlbnRpYWwgZnJhbWluZyBlcnJvcnMuIChKb2hhbm5lcyBFcmRmZWx0KQotICogMjItYXVnLTIwMDMJQVg4ODE3WCBzdXBwb3J0IChEYXZlIEhvbGxpcykuCi0gKiAxNC1qdW4tMjAwNCAgVHJpdmlhbCBwYXRjaCBmb3IgQVg4ODE3WCBiYXNlZCBCdWZmYWxvIExVQS1VMi1LVFggaW4gSmFwYW4KLSAqCQkoTmVpbCBCb3J0bmFrKQotICogMDMtbm92LTIwMDQJVHJpdmlhbCBwYXRjaCBmb3IgS0MyMTkwIChLQy0xOTApIGNoaXAuIChKb25hdGhhbiBNY0Rvd2VsbCkKLSAqCi0gKiAwMS1mZWItMjAwNQlBWDg4NzcyIHN1cHBvcnQgKFBoaWwgQ2hhbmcgJiBEYXZlIEhvbGxpcykKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBUaGVzZSBkZXZpY2VzIHVzdWFsbHkgZGlmZmVyIGluIHRlcm1zIG9mIGNvbnRyb2wgcHJvdG9jb2xzIChpZiB0aGV5CisgKiBldmVuIGhhdmUgb25lISkgYW5kIHNvbWV0aW1lcyB0aGV5IGRlZmluZSBuZXcgZnJhbWluZyB0byB3cmFwIG9yIGJhdGNoCisgKiBFdGhlcm5ldCBwYWNrZXRzLiAgT3RoZXJ3aXNlLCB0aGV5IHRhbGsgdG8gVVNCIHByZXR0eSBtdWNoIHRoZSBzYW1lLAorICogc28gaW50ZXJmYWNlICh1biliaW5kaW5nLCBlbmRwb2ludCBJL08gcXVldWVzLCBmYXVsdCBoYW5kbGluZywgYW5kIG90aGVyCisgKiBpc3N1ZXMgY2FuIHVzZWZ1bGx5IGJlIGFkZHJlc3NlZCBieSB0aGlzIGZyYW1ld29yay4KKyAqLwogCiAvLyAjZGVmaW5lCURFQlVHCQkJLy8gZXJyb3IgcGF0aCBtZXNzYWdlcywgZXh0cmEgaW5mbwogLy8gI2RlZmluZQlWRVJCT1NFCQkJLy8gbW9yZTsgc3VjY2VzcyBtZXNzYWdlcwpAQCAtMTIxLDI0ICszOCwxOCBAQAogIyAgIGRlZmluZSBERUJVRwogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjAzLU5vdi0yMDA0IgorI2luY2x1ZGUgInVzYm5ldC5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjItQXVnLTIwMDUiCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE0OSwxNSArNjAsMTQgQEAKICAqIE9uZSBtYXhpbXVtIHNpemUgRXRoZXJuZXQgcGFja2V0IHRha2VzIHR3ZW50eSBmb3VyIG9mIHRoZW0uCiAgKiBGb3IgaGlnaCBzcGVlZCwgZWFjaCBmcmFtZSBjb21mb3J0YWJseSBmaXRzIGFsbW9zdCAzNiBtYXggc2l6ZQogICogRXRoZXJuZXQgcGFja2V0cyAoc28gcXVldWVzIHNob3VsZCBiZSBiaWdnZXIpLgorICoKKyAqIFJFVklTSVQgcWxlbnMgc2hvdWxkIGJlIG1lbWJlcnMgb2YgJ3N0cnVjdCB1c2JuZXQnOyB0aGUgZ29hbCBpcyB0bworICogbGV0IHRoZSBVU0IgaG9zdCBjb250cm9sbGVyIGJlIGJ1c3kgZm9yIDVtc2VjIG9yIG1vcmUgYmVmb3JlIGFuIGlycQorICogaXMgcmVxdWlyZWQsIHVuZGVyIGxvYWQuICBKdW1ib2dyYW1zIGNoYW5nZSB0aGUgZXF1YXRpb24uCiAgKi8KICNkZWZpbmUJUlhfUUxFTihkZXYpICgoKGRldiktPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IDYwIDogNCkKICNkZWZpbmUJVFhfUUxFTihkZXYpICgoKGRldiktPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IDYwIDogNCkKIAotLy8gcGFja2V0cyBhcmUgYWx3YXlzIGV0aGVybmV0IGluc2lkZQotLy8gLi4uIGV4Y2VwdCB0aGV5IGNhbiBiZSBiaWdnZXIgKGxpbWl0IG9mIDY0SyB3aXRoIE5ldENoaXAgZnJhbWluZykKLSNkZWZpbmUgTUlOX1BBQ0tFVAlzaXplb2Yoc3RydWN0IGV0aGhkcikKLSNkZWZpbmUgTUFYX1BBQ0tFVAkzMjc2OAotCiAvLyByZWF3YWtlbiBuZXR3b3JrIHF1ZXVlIHRoaXMgc29vbiBhZnRlciBzdG9wcGluZzsgZWxzZSB3YXRjaGRvZyBiYXJrcwogI2RlZmluZSBUWF9USU1FT1VUX0pJRkZJRVMJKDUqSFopCiAKQEAgLTE2NSw5ICs3NSw2IEBACiAvLyB1cyAoaXQgcG9sbHMgYXQgSFovNCB1c3VhbGx5KSBiZWZvcmUgd2UgcmVwb3J0IHRvbyBtYW55IGZhbHNlIGVycm9ycy4KICNkZWZpbmUgVEhST1RUTEVfSklGRklFUwkoSFovOCkKIAotLy8gZm9yIHZlbmRvci1zcGVjaWZpYyBjb250cm9sIG9wZXJhdGlvbnMKLSNkZWZpbmUJQ09OVFJPTF9USU1FT1VUX01TCTUwMAotCiAvLyBiZXR3ZWVuIHdha2V1cHMKICNkZWZpbmUgVU5MSU5LX1RJTUVPVVRfTVMJMwogCkBAIC0xNzYsMTA5ICs4Myw2IEBACiAvLyByYW5kb21seSBnZW5lcmF0ZWQgZXRoZXJuZXQgYWRkcmVzcwogc3RhdGljIHU4CW5vZGVfaWQgW0VUSF9BTEVOXTsKIAotLy8gc3RhdGUgd2Uga2VlcCBmb3IgZWFjaCBkZXZpY2Ugd2UgaGFuZGxlCi1zdHJ1Y3QgdXNibmV0IHsKLQkvLyBob3VzZWtlZXBpbmcKLQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKLQlzdHJ1Y3QgZHJpdmVyX2luZm8JKmRyaXZlcl9pbmZvOwotCXdhaXRfcXVldWVfaGVhZF90CSp3YWl0OwotCi0JLy8gaS9vIGluZm86IHBpcGVzIGV0YwotCXVuc2lnbmVkCQlpbiwgb3V0OwotCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqc3RhdHVzOwotCXVuc2lnbmVkCQltYXhwYWNrZXQ7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJZGVsYXk7Ci0KLQkvLyBwcm90b2NvbC9pbnRlcmZhY2Ugc3RhdGUKLQlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwotCWludAkJCW1zZ19lbmFibGU7Ci0JdW5zaWduZWQgbG9uZwkJZGF0YSBbNV07Ci0KLQlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpOwotCi0JLy8gdmFyaW91cyBraW5kcyBvZiBwZW5kaW5nIGRyaXZlciB3b3JrCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeHE7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZAl0eHE7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlkb25lOwotCXN0cnVjdCB1cmIJCSppbnRlcnJ1cHQ7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWJoOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0CWtldmVudDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLSMJCWRlZmluZSBFVkVOVF9UWF9IQUxUCTAKLSMJCWRlZmluZSBFVkVOVF9SWF9IQUxUCTEKLSMJCWRlZmluZSBFVkVOVF9SWF9NRU1PUlkJMgotIwkJZGVmaW5lIEVWRU5UX1NUU19TUExJVAkzCi0jCQlkZWZpbmUgRVZFTlRfTElOS19SRVNFVAk0Ci19OwotCi0vLyBkZXZpY2Utc3BlY2lmaWMgaW5mbyB1c2VkIGJ5IHRoZSBkcml2ZXIKLXN0cnVjdCBkcml2ZXJfaW5mbyB7Ci0JY2hhcgkJKmRlc2NyaXB0aW9uOwotCi0JaW50CQlmbGFnczsKLS8qIGZyYW1pbmcgaXMgQ0RDIEV0aGVybmV0LCBub3Qgd3JpdGluZyBaTFBzIChodyBpc3N1ZXMpLCBvciBvcHRpb25hbGx5OiAqLwotI2RlZmluZSBGTEFHX0ZSQU1JTkdfTkMJMHgwMDAxCQkvKiBndWFyZCBhZ2FpbnN0IGRldmljZSBkcm9wb3V0cyAqLyAKLSNkZWZpbmUgRkxBR19GUkFNSU5HX0dMCTB4MDAwMgkJLyogZ2VuZWxpbmsgYmF0Y2hlcyBwYWNrZXRzICovCi0jZGVmaW5lIEZMQUdfRlJBTUlOR19aCTB4MDAwNAkJLyogemF1cnVzIGFkZHMgYSB0cmFpbGVyICovCi0jZGVmaW5lIEZMQUdfRlJBTUlOR19STgkweDAwMDgJCS8qIFJORElTIGJhdGNoZXMsIHBsdXMgaHVnZSBoZWFkZXIgKi8KLQotI2RlZmluZSBGTEFHX05PX1NFVElOVAkweDAwMTAJCS8qIGRldmljZSBjYW4ndCBzZXRfaW50ZXJmYWNlKCkgKi8KLSNkZWZpbmUgRkxBR19FVEhFUgkweDAwMjAJCS8qIG1heWJlIHVzZSAiZXRoJWQiIG5hbWVzICovCi0KLSNkZWZpbmUgRkxBR19GUkFNSU5HX0FYIDB4MDA0MCAgICAgICAgICAvKiBBWDg4NzcyLzE3OCBwYWNrZXRzICovCi0KLQkvKiBpbml0IGRldmljZSAuLi4gY2FuIHNsZWVwLCBvciBjYXVzZSBwcm9iZSgpIGZhaWx1cmUgKi8KLQlpbnQJKCpiaW5kKShzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwotCi0JLyogY2xlYW51cCBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgYnV0IGNhbid0IGZhaWwgKi8KLQl2b2lkCSgqdW5iaW5kKShzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwotCi0JLyogcmVzZXQgZGV2aWNlIC4uLiBjYW4gc2xlZXAgKi8KLQlpbnQJKCpyZXNldCkoc3RydWN0IHVzYm5ldCAqKTsKLQotCS8qIHNlZSBpZiBwZWVyIGlzIGNvbm5lY3RlZCAuLi4gY2FuIHNsZWVwICovCi0JaW50CSgqY2hlY2tfY29ubmVjdCkoc3RydWN0IHVzYm5ldCAqKTsKLQotCS8qIGZvciBzdGF0dXMgcG9sbGluZyAqLwotCXZvaWQJKCpzdGF0dXMpKHN0cnVjdCB1c2JuZXQgKiwgc3RydWN0IHVyYiAqKTsKLQotCS8qIGxpbmsgcmVzZXQgaGFuZGxpbmcsIGNhbGxlZCBmcm9tIGRlZmVyX2tldmVudCAqLwotCWludAkoKmxpbmtfcmVzZXQpKHN0cnVjdCB1c2JuZXQgKik7Ci0KLQkvKiBmaXh1cCByeCBwYWNrZXQgKHN0cmlwIGZyYW1pbmcpICovCi0JaW50CSgqcnhfZml4dXApKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLQkvKiBmaXh1cCB0eCBwYWNrZXQgKGFkZCBmcmFtaW5nKSAqLwotCXN0cnVjdCBza19idWZmCSooKnR4X2ZpeHVwKShzdHJ1Y3QgdXNibmV0ICpkZXYsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZsYWdzKTsKLQotCS8vIEZJWE1FIC0tIGFsc28gYW4gaW50ZXJydXB0IG1lY2hhbmlzbQotCS8vIHVzZWZ1bCBmb3IgYXQgbGVhc3QgUEwyMzAxLzIzMDIgYW5kIEdMNjIwVVNCLUEKLQkvLyBhbmQgQ0RDIHVzZSB0aGVtIHRvIHJlcG9ydCAnaXMgaXQgY29ubmVjdGVkJyBjaGFuZ2VzCi0KLQkvKiBmb3IgbmV3IGRldmljZXMsIHVzZSB0aGUgZGVzY3JpcHRvci1yZWFkaW5nIGNvZGUgaW5zdGVhZCAqLwotCWludAkJaW47CQkvKiByeCBlbmRwb2ludCAqLwotCWludAkJb3V0OwkJLyogdHggZW5kcG9pbnQgKi8KLQotCXVuc2lnbmVkIGxvbmcJZGF0YTsJCS8qIE1pc2MgZHJpdmVyIHNwZWNpZmljIGRhdGEgKi8KLX07Ci0KLS8vIHdlIHJlY29yZCB0aGUgc3RhdGUgZm9yIGVhY2ggb2Ygb3VyIHF1ZXVlZCBza2JzCi1lbnVtIHNrYl9zdGF0ZSB7Ci0JaWxsZWdhbCA9IDAsCi0JdHhfc3RhcnQsIHR4X2RvbmUsCi0Jcnhfc3RhcnQsIHJ4X2RvbmUsIHJ4X2NsZWFudXAKLX07Ci0KLXN0cnVjdCBza2JfZGF0YSB7CS8vIHNrYi0+Y2IgaXMgb25lIG9mIHRoZXNlCi0Jc3RydWN0IHVyYgkJKnVyYjsKLQlzdHJ1Y3QgdXNibmV0CQkqZGV2OwotCWVudW0gc2tiX3N0YXRlCQlzdGF0ZTsKLQlzaXplX3QJCQlsZW5ndGg7Ci19OwotCiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZSBbXSA9ICJ1c2JuZXQiOwogCiAvKiB1c2UgZXRodG9vbCB0byBjaGFuZ2UgdGhlIGxldmVsIGZvciBhbnkgZ2l2ZW4gZGV2aWNlICovCkBAIC0yODYsMzkgKzkwLDEwIEBACiBtb2R1bGVfcGFyYW0gKG1zZ19sZXZlbCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MgKG1zZ19sZXZlbCwgIk92ZXJyaWRlIGRlZmF1bHQgbWVzc2FnZSBsZXZlbCIpOwogCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lIGRldmVycih1c2JuZXQsIGZtdCwgYXJnLi4uKSBcCi0JcHJpbnRrKEtFUk5fRVJSICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCi0jZGVmaW5lIGRldndhcm4odXNibmV0LCBmbXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZtdCAiXG4iICwgKHVzYm5ldCktPm5ldC0+bmFtZSAsICMjIGFyZykKLQotI2RlZmluZSBkZXZpbmZvKHVzYm5ldCwgZm10LCBhcmcuLi4pIFwKLQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpOyBcCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIHVzYm5ldF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqKTsKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZCB1c2JuZXRfc2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOwotc3RhdGljIHZvaWQgZGVmZXJfa2V2ZW50IChzdHJ1Y3QgdXNibmV0ICosIGludCk7Ci0KLS8qIG1vc3RseSBmb3IgUERBIHN0eWxlIGRldmljZXMsIHdoaWNoIGFyZSBhbHdheXMgY29ubmVjdGVkIGlmIHByZXNlbnQgKi8KLXN0YXRpYyBpbnQgYWx3YXlzX2Nvbm5lY3RlZCAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXJldHVybiAwOwotfQotCiAvKiBoYW5kbGVzIENEQyBFdGhlcm5ldCBhbmQgbWFueSBvdGhlciBuZXR3b3JrICJidWxrIGRhdGEiIGludGVyZmFjZXMgKi8KLXN0YXRpYyBpbnQKLWdldF9lbmRwb2ludHMgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitpbnQgdXNibmV0X2dldF9lbmRwb2ludHMoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlpbnQJCQkJdG1wOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UJKmFsdCA9IE5VTEw7CkBAIC0zODIsNiArMTU3LDcgQEAKIAlkZXYtPnN0YXR1cyA9IHN0YXR1czsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfZW5kcG9pbnRzKTsKIAogc3RhdGljIHZvaWQgaW50cl9jb21wbGV0ZSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKQEAgLTQyMSw3ICsxOTcsMTEgQEAKIAlyZXR1cm4gIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNrYl9yZXR1cm4gKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKKy8qIFBhc3NlcyB0aGlzIHBhY2tldCB1cCB0aGUgc3RhY2ssIHVwZGF0aW5nIGl0cyBhY2NvdW50aW5nLgorICogU29tZSBsaW5rIHByb3RvY29scyBiYXRjaCBwYWNrZXRzLCBzbyB0aGVpciByeF9maXh1cCBwYXRocworICogY2FuIHJldHVybiBjbG9uZXMgYXMgd2VsbCBhcyBqdXN0IG1vZGlmeSB0aGUgb3JpZ2luYWwgc2tiLgorICovCit2b2lkIHVzYm5ldF9za2JfcmV0dXJuIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50CXN0YXR1czsKIApAQCAtNDM4LDI0MjUgKzIxOCw3IEBACiAJaWYgKHN0YXR1cyAhPSBORVRfUlhfU1VDQ0VTUyAmJiBuZXRpZl9tc2dfcnhfZXJyIChkZXYpKQogCQlkZXZkYmcgKGRldiwgIm5ldGlmX3J4IHN0YXR1cyAlZCIsIHN0YXR1cyk7CiB9Ci0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0FMSV9NNTYzMgotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEFMaSBNNTYzMiBkcml2ZXIgLi4uIGRvZXMgaGlnaCBzcGVlZAotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYWxpX201NjMyX2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIkFMaSBNNTYzMiIsCi19OwotCi0KLSNlbmRpZgotCi0MCi0jaWZkZWYJQ09ORklHX1VTQl9BTjI3MjAKLSNkZWZpbmUJSEFWRV9IQVJEV0FSRQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBBbmNob3JDaGlwcyAyNzIwIGRyaXZlciAuLi4gaHR0cDovL3d3dy5jeXByZXNzLmNvbQotICoKLSAqIFRoaXMgZG9lc24ndCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBlZXIgaXMKLSAqIGNvbm5lY3RlZCwgb3IgbmVlZCBhbnkgcmVzZXQgaGFuZHNoYWtpbmcuICBJdCdzIGdvdCBwcmV0dHkgYmlnCi0gKiBpbnRlcm5hbCBidWZmZXJzIChoYW5kbGVzIG1vc3Qgb2YgYSBmcmFtZSdzIHdvcnRoIG9mIGRhdGEpLgotICogQ2hpcCBkYXRhIHNoZWV0cyBkb24ndCBkZXNjcmliZSBhbnkgdmVuZG9yIGNvbnRyb2wgbWVzc2FnZXMuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlhbjI3MjBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiQW5jaG9yQ2hpcHMvQ3lwcmVzcyAyNzIwIiwKLQkvLyBubyByZXNldCBhdmFpbGFibGUhCi0JLy8gbm8gY2hlY2tfY29ubmVjdCBhdmFpbGFibGUhCi0KLQkuaW4gPSAyLCAub3V0ID0gMiwJCS8vIGRpcmVjdGlvbiBkaXN0aW5ndWlzaGVzIHRoZXNlCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9BTjI3MjAgKi8KLQotDAotI2lmZGVmIENPTkZJR19VU0JfQVg4ODE3WAotLyogQVNJWCBBWDg4MTdYIGJhc2VkIFVTQiAyLjAgRXRoZXJuZXQgRGV2aWNlcyAqLwotCi0jZGVmaW5lIEhBVkVfSEFSRFdBUkUKLSNkZWZpbmUgTkVFRF9NSUkKLQotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0KLSNkZWZpbmUgQVhfQ01EX1NFVF9TV19NSUkJCTB4MDYKLSNkZWZpbmUgQVhfQ01EX1JFQURfTUlJX1JFRwkJMHgwNwotI2RlZmluZSBBWF9DTURfV1JJVEVfTUlJX1JFRwkJMHgwOAotI2RlZmluZSBBWF9DTURfU0VUX0hXX01JSQkJMHgwYQotI2RlZmluZSBBWF9DTURfUkVBRF9FRVBST00JCTB4MGIKLSNkZWZpbmUgQVhfQ01EX1dSSVRFX0VFUFJPTQkJMHgwYwotI2RlZmluZSBBWF9DTURfV1JJVEVfRU5BQkxFCQkweDBkCi0jZGVmaW5lIEFYX0NNRF9XUklURV9ESVNBQkxFCQkweDBlCi0jZGVmaW5lIEFYX0NNRF9XUklURV9SWF9DVEwJCTB4MTAKLSNkZWZpbmUgQVhfQ01EX1JFQURfSVBHMDEyCQkweDExCi0jZGVmaW5lIEFYX0NNRF9XUklURV9JUEcwCQkweDEyCi0jZGVmaW5lIEFYX0NNRF9XUklURV9JUEcxCQkweDEzCi0jZGVmaW5lIEFYX0NNRF9XUklURV9JUEcyCQkweDE0Ci0jZGVmaW5lIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIJMHgxNgotI2RlZmluZSBBWF9DTURfUkVBRF9OT0RFX0lECQkweDE3Ci0jZGVmaW5lIEFYX0NNRF9SRUFEX1BIWV9JRAkJMHgxOQotI2RlZmluZSBBWF9DTURfUkVBRF9NRURJVU1fU1RBVFVTCTB4MWEKLSNkZWZpbmUgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFCTB4MWIKLSNkZWZpbmUgQVhfQ01EX1JFQURfTU9OSVRPUl9NT0RFCTB4MWMKLSNkZWZpbmUgQVhfQ01EX1dSSVRFX01PTklUT1JfTU9ERQkweDFkCi0jZGVmaW5lIEFYX0NNRF9XUklURV9HUElPUwkJMHgxZgotI2RlZmluZSBBWF9DTURfU1dfUkVTRVQJCQkweDIwCi0jZGVmaW5lIEFYX0NNRF9TV19QSFlfU1RBVFVTCQkweDIxCi0jZGVmaW5lIEFYX0NNRF9TV19QSFlfU0VMRUNUCQkweDIyCi0jZGVmaW5lIEFYODg3NzJfQ01EX1JFQURfTk9ERV9JRAkweDEzCi0KLSNkZWZpbmUgQVhfTU9OSVRPUl9NT0RFCQkJMHgwMQotI2RlZmluZSBBWF9NT05JVE9SX0xJTksJCQkweDAyCi0jZGVmaW5lIEFYX01PTklUT1JfTUFHSUMJCTB4MDQKLSNkZWZpbmUgQVhfTU9OSVRPUl9IU0ZTCQkJMHgxMAotCi0vKiBBWDg4MTcyIE1lZGl1bSBTdGF0dXMgUmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lIEFYX01FRElVTV9GVUxMX0RVUExFWAkJMHgwMgotI2RlZmluZSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cJMHgwNAotI2RlZmluZSBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOCTB4MTAKLQotI2RlZmluZSBBWF9NQ0FTVF9GSUxURVJfU0laRQkJOAotI2RlZmluZSBBWF9NQVhfTUNBU1QJCQk2NAotCi0jZGVmaW5lIEFYX0VFUFJPTV9MRU4JCQkweDQwCi0KLSNkZWZpbmUgQVhfU1dSRVNFVF9DTEVBUgkJMHgwMAotI2RlZmluZSBBWF9TV1JFU0VUX1JSCQkJMHgwMQotI2RlZmluZSBBWF9TV1JFU0VUX1JUCQkJMHgwMgotI2RlZmluZSBBWF9TV1JFU0VUX1BSVEUJCQkweDA0Ci0jZGVmaW5lIEFYX1NXUkVTRVRfUFJMCQkJMHgwOAotI2RlZmluZSBBWF9TV1JFU0VUX0JaCQkJMHgxMAotI2RlZmluZSBBWF9TV1JFU0VUX0lQUkwJCQkweDIwCi0jZGVmaW5lIEFYX1NXUkVTRVRfSVBQRAkJCTB4NDAKLQotI2RlZmluZSBBWDg4NzcyX0lQRzBfREVGQVVMVAkJMHgxNQotI2RlZmluZSBBWDg4NzcyX0lQRzFfREVGQVVMVAkJMHgwYwotI2RlZmluZSBBWDg4NzcyX0lQRzJfREVGQVVMVAkJMHgxMgotCi0jZGVmaW5lIEFYODg3NzJfTUVESVVNX0ZVTExfRFVQTEVYCTB4MDAwMgotI2RlZmluZSBBWDg4NzcyX01FRElVTV9SRVNFUlZFRAkJMHgwMDA0Ci0jZGVmaW5lIEFYODg3NzJfTUVESVVNX1JYX0ZDX0VOQUJMRQkweDAwMTAKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fVFhfRkNfRU5BQkxFCTB4MDAyMAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9QQVVTRV9GT1JNQVQJMHgwMDgwCi0jZGVmaW5lIEFYODg3NzJfTUVESVVNX1JYX0VOQUJMRQkweDAxMDAKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fMTAwTUIJCTB4MDIwMAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9ERUZBVUxUCVwKLQkoQVg4ODc3Ml9NRURJVU1fRlVMTF9EVVBMRVggfCBBWDg4NzcyX01FRElVTV9SWF9GQ19FTkFCTEUgfCBcCi0JIEFYODg3NzJfTUVESVVNX1RYX0ZDX0VOQUJMRSB8IEFYODg3NzJfTUVESVVNXzEwME1CIHwgXAotCSBBWDg4NzcyX01FRElVTV9SRVNFUlZFRCB8IEFYODg3NzJfTUVESVVNX1JYX0VOQUJMRSApCi0KLSNkZWZpbmUgQVhfRUVQUk9NX01BR0lDCQkJMHhkZWFkYmVlZgotCi0vKiBUaGlzIHN0cnVjdHVyZSBjYW5ub3QgZXhjZWVkIHNpemVvZih1bnNpZ25lZCBsb25nIFs1XSkgQUtBIDIwIGJ5dGVzICovCi1zdHJ1Y3QgYXg4ODE3eF9kYXRhIHsKLQl1OCBtdWx0aV9maWx0ZXJbQVhfTUNBU1RfRklMVEVSX1NJWkVdOwotfTsKLQotc3RydWN0IGF4ODgxNzJfaW50X2RhdGEgewotCXUxNiByZXMxOwotCXU4IGxpbms7Ci0JdTE2IHJlczI7Ci0JdTggc3RhdHVzOwotCXUxNiByZXMzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9yZWFkX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCQkgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHVzYl9jb250cm9sX21zZygKLQkJZGV2LT51ZGV2LAotCQl1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKLQkJY21kLAotCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJdmFsdWUsCi0JCWluZGV4LAotCQlkYXRhLAotCQlzaXplLAotCQlDT05UUk9MX1RJTUVPVVRfTVMpOwotfQotCi1zdGF0aWMgaW50IGF4ODgxN3hfd3JpdGVfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKLQkJCSAgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHVzYl9jb250cm9sX21zZygKLQkJZGV2LT51ZGV2LAotCQl1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKLQkJY21kLAotCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCXZhbHVlLAotCQlpbmRleCwKLQkJZGF0YSwKLQkJc2l6ZSwKLQkJQ09OVFJPTF9USU1FT1VUX01TKTsKLX0KLQotc3RhdGljIHZvaWQgYXg4ODE3eF9hc3luY19jbWRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKXVyYi0+Y29udGV4dDsKLQotCWlmICh1cmItPnN0YXR1cyA8IDApCi0JCXByaW50ayhLRVJOX0RFQlVHICJheDg4MTd4X2FzeW5jX2NtZF9jYWxsYmFjaygpIGZhaWxlZCB3aXRoICVkIiwKLQkJCXVyYi0+c3RhdHVzKTsKLQotCWtmcmVlKHJlcSk7Ci0JdXNiX2ZyZWVfdXJiKHVyYik7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4ODgxN3hfc3RhdHVzKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBheDg4MTcyX2ludF9kYXRhICpldmVudDsKLQlpbnQgbGluazsKLQotCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPCA4KQotCQlyZXR1cm47Ci0KLQlldmVudCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCWxpbmsgPSBldmVudC0+bGluayAmIDB4MDE7Ci0JaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2LT5uZXQpICE9IGxpbmspIHsKLQkJaWYgKGxpbmspIHsKLQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOwotCQkJZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX0xJTktfUkVTRVQgKTsKLQkJfSBlbHNlCi0JCQluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldCk7Ci0JCWRldmRiZyhkZXYsICJheDg4MTd4IC0gTGluayBTdGF0dXMgaXM6ICVkIiwgbGluayk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBheDg4MTd4X3dyaXRlX2NtZF9hc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCQkJICAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcTsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCB1cmIgKnVyYjsKLQotCWlmICgodXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotCQlkZXZkYmcoZGV2LCAiRXJyb3IgYWxsb2NhdGluZyBVUkIgaW4gd3JpdGVfY21kX2FzeW5jISIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKChyZXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJZGV2ZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRyb2wgcmVxdWVzdCIpOwotCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJcmV0dXJuOwotCX0KLQotCXJlcS0+YlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFOwotCXJlcS0+YlJlcXVlc3QgPSBjbWQ7Ci0JcmVxLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7Ci0JcmVxLT53SW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7IAotCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwotCi0JdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBkZXYtPnVkZXYsCi0JCQkgICAgIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAotCQkJICAgICAodm9pZCAqKXJlcSwgZGF0YSwgc2l6ZSwKLQkJCSAgICAgYXg4ODE3eF9hc3luY19jbWRfY2FsbGJhY2ssIHJlcSk7Ci0KLQlpZigoc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7Ci0JCWRldmVycihkZXYsICJFcnJvciBzdWJtaXR0aW5nIHRoZSBjb250cm9sIG1lc3NhZ2U6IHN0YXR1cz0lZCIsIHN0YXR1cyk7Ci0JCWtmcmVlKHJlcSk7Ci0JCXVzYl9mcmVlX3VyYih1cmIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXg4ODE3eF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQlzdHJ1Y3QgYXg4ODE3eF9kYXRhICpkYXRhID0gKHN0cnVjdCBheDg4MTd4X2RhdGEgKikmZGV2LT5kYXRhOwotCXU4IHJ4X2N0bCA9IDB4OGM7Ci0KLQlpZiAobmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCXJ4X2N0bCB8PSAweDAxOwotCX0gZWxzZSBpZiAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSQotCQkgICB8fCBuZXQtPm1jX2NvdW50ID4gQVhfTUFYX01DQVNUKSB7Ci0JCXJ4X2N0bCB8PSAweDAyOwotCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCA9PSAwKSB7Ci0JCS8qIGp1c3QgYnJvYWRjYXN0IGFuZCBkaXJlY3RlZCAqLwotCX0gZWxzZSB7Ci0JCS8qIFdlIHVzZSB0aGUgMjAgYnl0ZSBkZXYtPmRhdGEKLQkJICogZm9yIG91ciA4IGJ5dGUgZmlsdGVyIGJ1ZmZlcgotCQkgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0Ci0JCSAqIGlzIHRyaWNreSB0byBmcmVlIGxhdGVyICovCi0JCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCA9IG5ldC0+bWNfbGlzdDsKLQkJdTMyIGNyY19iaXRzOwotCQlpbnQgaTsKLQotCQltZW1zZXQoZGF0YS0+bXVsdGlfZmlsdGVyLCAwLCBBWF9NQ0FTVF9GSUxURVJfU0laRSk7Ci0KLQkJLyogQnVpbGQgdGhlIG11bHRpY2FzdCBoYXNoIGZpbHRlci4gKi8KLQkJZm9yIChpID0gMDsgaSA8IG5ldC0+bWNfY291bnQ7IGkrKykgewotCQkJY3JjX2JpdHMgPQotCQkJICAgIGV0aGVyX2NyYyhFVEhfQUxFTiwKLQkJCQkgICAgICBtY19saXN0LT5kbWlfYWRkcikgPj4gMjY7Ci0JCQlkYXRhLT5tdWx0aV9maWx0ZXJbY3JjX2JpdHMgPj4gM10gfD0KLQkJCSAgICAxIDw8IChjcmNfYml0cyAmIDcpOwotCQkJbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQ7Ci0JCX0KLQotCQlheDg4MTd4X3dyaXRlX2NtZF9hc3luYyhkZXYsIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIsIDAsIDAsCi0JCQkJICAgQVhfTUNBU1RfRklMVEVSX1NJWkUsIGRhdGEtPm11bHRpX2ZpbHRlcik7Ci0KLQkJcnhfY3RsIHw9IDB4MTA7Ci0JfQotCi0JYXg4ODE3eF93cml0ZV9jbWRfYXN5bmMoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCByeF9jdGwsIDAsIDAsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGF4ODgxN3hfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MTYgcmVzOwotCXU4IGJ1ZlsxXTsKLQotCWF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9TV19NSUksIDAsIDAsIDAsICZidWYpOwotCWF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKTsKLQotCXJldHVybiByZXMgJiAweGZmZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4ODgxN3hfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTE2IHJlcyA9IHZhbDsKLQl1OCBidWZbMV07Ci0KLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLCAwLCAwLCAwLCAmYnVmKTsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKTsKLX0KLQotc3RhdGljIGludCBheDg4MTcyX2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXUxNiBscGE7Ci0JdTggbW9kZTsKLQotCW1vZGUgPSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cgfCBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOOwotCWxwYSA9IGF4ODgxN3hfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9MUEEpOwotCWlmIChscGEgJiBMUEFfRFVQTEVYKQotCQltb2RlIHw9IEFYX01FRElVTV9GVUxMX0RVUExFWDsKLQlheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwgbW9kZSwgMCwgMCwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXg4ODE3eF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQl1OCBvcHQ7Ci0KLQlpZiAoYXg4ODE3eF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01PTklUT1JfTU9ERSwgMCwgMCwgMSwgJm9wdCkgPCAwKSB7Ci0JCXdvbGluZm8tPnN1cHBvcnRlZCA9IDA7Ci0JCXdvbGluZm8tPndvbG9wdHMgPSAwOwotCQlyZXR1cm47Ci0JfQotCXdvbGluZm8tPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQzsKLQl3b2xpbmZvLT53b2xvcHRzID0gMDsKLQlpZiAob3B0ICYgQVhfTU9OSVRPUl9NT0RFKSB7Ci0JCWlmIChvcHQgJiBBWF9NT05JVE9SX0xJTkspCi0JCQl3b2xpbmZvLT53b2xvcHRzIHw9IFdBS0VfUEhZOwotCQlpZiAob3B0ICYgQVhfTU9OSVRPUl9NQUdJQykKLQkJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQl1OCBvcHQgPSAwOwotCXU4IGJ1ZlsxXTsKLQotCWlmICh3b2xpbmZvLT53b2xvcHRzICYgV0FLRV9QSFkpCi0JCW9wdCB8PSBBWF9NT05JVE9SX0xJTks7Ci0JaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX01BR0lDKQotCQlvcHQgfD0gQVhfTU9OSVRPUl9NQUdJQzsKLQlpZiAob3B0ICE9IDApCi0JCW9wdCB8PSBBWF9NT05JVE9SX01PREU7Ci0KLQlpZiAoYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFLAotCQkJICAgICAgb3B0LCAwLCAwLCAmYnVmKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQotewotCXJldHVybiBBWF9FRVBST01fTEVOOwotfQotCi1zdGF0aWMgaW50IGF4ODgxN3hfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAotCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7Ci0JdTE2ICplYnVmID0gKHUxNiAqKWRhdGE7Ci0JaW50IGk7Ci0KLQkvKiBDcnVkZSBoYWNrIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBtZW1vcnkKLQkgKiBpZiBhbiBvZGQgbGVuZ3RoIGlzIHN1cHBsaWVkCi0JICovCi0JaWYgKGVlcHJvbS0+bGVuICUgMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllZXByb20tPm1hZ2ljID0gQVhfRUVQUk9NX01BR0lDOwotCi0JLyogYXg4ODE3eCByZXR1cm5zIDIgYnl0ZXMgZnJvbSBlZXByb20gb24gcmVhZCAqLwotCWZvciAoaT0wOyBpIDwgZWVwcm9tLT5sZW4gLyAyOyBpKyspIHsKLQkJaWYgKGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIAotCQkJZWVwcm9tLT5vZmZzZXQgKyBpLCAwLCAyLCAmZWJ1ZltpXSkgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBheDg4MTd4X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAotCQkJCSBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCS8qIEluaGVyaXQgc3RhbmRhcmQgZGV2aWNlIGluZm8gKi8KLQl1c2JuZXRfZ2V0X2RydmluZm8obmV0LCBpbmZvKTsKLQlpbmZvLT5lZWR1bXBfbGVuID0gMHgzZTsKLX0KLQotc3RhdGljIGludCBheDg4MTd4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCi0JcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJmRldi0+bWlpLGNtZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODE3eF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCXJldHVybiBtaWlfZXRodG9vbF9zc2V0KCZkZXYtPm1paSxjbWQpOwotfQotCi0vKiBXZSBuZWVkIHRvIG92ZXJyaWRlIHNvbWUgZXRodG9vbF9vcHMgc28gd2UgcmVxdWlyZSBvdXIKLSAgIG93biBzdHJ1Y3R1cmUgc28gd2UgZG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgdXNibmV0Ci0gICBkZXZpY2VzIHRoYXQgbWF5IGJlIGNvbm5lY3RlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLwotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheDg4MTd4X2V0aHRvb2xfb3BzID0gewotCS5nZXRfZHJ2aW5mbwkJPSBheDg4MTd4X2dldF9kcnZpbmZvLAotCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAotCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKLQkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCi0JLmdldF93b2wJCT0gYXg4ODE3eF9nZXRfd29sLAotCS5zZXRfd29sCQk9IGF4ODgxN3hfc2V0X3dvbCwKLQkuZ2V0X2VlcHJvbV9sZW4JCT0gYXg4ODE3eF9nZXRfZWVwcm9tX2xlbiwKLQkuZ2V0X2VlcHJvbQkJPSBheDg4MTd4X2dldF9lZXByb20sCi0JLmdldF9zZXR0aW5ncwkJPSBheDg4MTd4X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfc2V0X3NldHRpbmdzLAotfTsKLQotc3RhdGljIGludCBheDg4MTd4X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICpidWY7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBncGlvX2JpdHMgPSBkZXYtPmRyaXZlcl9pbmZvLT5kYXRhOwotCi0JZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7Ci0KLQlidWYgPSBrbWFsbG9jKEVUSF9BTEVOLCBHRlBfS0VSTkVMKTsKLQlpZighYnVmKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQkvKiBUb2dnbGUgdGhlIEdQSU9zIGluIGEgbWFudWZhY3R1cmVyL21vZGVsIHNwZWNpZmljIHdheSAqLwotCWZvciAoaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfR1BJT1MsCi0JCQkJCShncGlvX2JpdHMgPj4gKGkgKiA4KSkgJiAweGZmLCAwLCAwLAotCQkJCQlidWYpKSA8IDApCi0JCQlnb3RvIG91dDI7Ci0JCW1zbGVlcCg1KTsKLQl9Ci0KLQlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwgMHg4MCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygic2VuZCBBWF9DTURfV1JJVEVfUlhfQ1RMIGZhaWxlZDogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotCW1lbXNldChidWYsIDAsIEVUSF9BTEVOKTsKLQlpZiAoKHJldCA9IGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCA2LCBidWYpKSA8IDApIHsKLQkJZGJnKCJyZWFkIEFYX0NNRF9SRUFEX05PREVfSUQgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0JbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgYnVmLCBFVEhfQUxFTik7Ci0KLQkvKiBHZXQgdGhlIFBIWSBpZCAqLwotCWlmICgocmV0ID0gYXg4ODE3eF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX1BIWV9JRCwgMCwgMCwgMiwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiZXJyb3Igb24gcmVhZCBBWF9DTURfUkVBRF9QSFlfSUQ6ICUwMngiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfSBlbHNlIGlmIChyZXQgPCAyKSB7Ci0JCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gMiBieXRlcyAqLwotCQlkYmcoIkFYX0NNRF9SRUFEX1BIWV9JRCByZXR1cm5lZCBsZXNzIHRoYW4gMiBieXRlczogcmV0PSUwMngiLCByZXQpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBNSUkgc3RydWN0dXJlICovCi0JZGV2LT5taWkuZGV2ID0gZGV2LT5uZXQ7Ci0JZGV2LT5taWkubWRpb19yZWFkID0gYXg4ODE3eF9tZGlvX3JlYWQ7Ci0JZGV2LT5taWkubWRpb193cml0ZSA9IGF4ODgxN3hfbWRpb193cml0ZTsKLQlkZXYtPm1paS5waHlfaWRfbWFzayA9IDB4M2Y7Ci0JZGV2LT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKLQlkZXYtPm1paS5waHlfaWQgPSAqKCh1OCAqKWJ1ZiArIDEpOwotCi0JZGV2LT5uZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGF4ODgxN3hfc2V0X211bHRpY2FzdDsKLQlkZXYtPm5ldC0+ZXRodG9vbF9vcHMgPSAmYXg4ODE3eF9ldGh0b29sX29wczsKLQotCWF4ODgxN3hfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7Ci0JYXg4ODE3eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCi0JCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOwotCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKLQotCXJldHVybiAwOwotb3V0MjoKLQlrZnJlZShidWYpOwotb3V0MToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODg3NzJfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvCQk9IGF4ODgxN3hfZ2V0X2RydmluZm8sCi0JLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAotCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKLQkuZ2V0X3dvbAkJPSBheDg4MTd4X2dldF93b2wsCi0JLnNldF93b2wJCT0gYXg4ODE3eF9zZXRfd29sLAotCS5nZXRfZWVwcm9tX2xlbgkJPSBheDg4MTd4X2dldF9lZXByb21fbGVuLAotCS5nZXRfZWVwcm9tCQk9IGF4ODgxN3hfZ2V0X2VlcHJvbSwKLQkuZ2V0X3NldHRpbmdzCQk9IGF4ODgxN3hfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gYXg4ODE3eF9zZXRfc2V0dGluZ3MsCi19OwotCi1zdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludCByZXQ7Ci0Jdm9pZCAqYnVmOwotCi0JZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7Ci0KLQlidWYgPSBrbWFsbG9jKDYsIEdGUF9LRVJORUwpOwotCWlmKCFidWYpIHsKLQkJZGJnICgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnVmZmVyIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0dQSU9TLAotCQkJCSAgICAgMHgwMEIwLCAwLCAwLCBidWYpKSA8IDApCi0JCWdvdG8gb3V0MjsKLQotCW1zbGVlcCg1KTsKLQlpZiAoKHJldCA9IGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIDB4MDAwMSwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCWlmICgocmV0ID0KLQkgICAgIGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBBWF9TV1JFU0VUX0lQUEQsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byBwb3dlciBkb3duIGludGVybmFsIFBIWTogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JbXNsZWVwKDE1MCk7Ci0JaWYgKChyZXQgPQotCSAgICAgYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIEFYX1NXUkVTRVRfQ0xFQVIsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byBwZXJmb3JtIHNvZnR3YXJlIHJlc2V0OiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQltc2xlZXAoMTUwKTsKLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byBzZXQgSW50ZXJuYWwvRXh0ZXJuYWwgUEhZIHJlc2V0IGNvbnRyb2w6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCW1zbGVlcCgxNTApOwotCWlmICgocmV0ID0KLQkgICAgIGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwgMHgwMDAwLCAwLCAwLAotCQkJICAgICAgIGJ1ZikpIDwgMCkgewotCQlkYmcoIkZhaWxlZCB0byByZXNldCBSWF9DVEw6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KLQltZW1zZXQoYnVmLCAwLCBFVEhfQUxFTik7Ci0JaWYgKChyZXQgPSBheDg4MTd4X3JlYWRfY21kKGRldiwgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3M6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQltZW1jcHkoZGV2LT5uZXQtPmRldl9hZGRyLCBidWYsIEVUSF9BTEVOKTsKLQotCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX1NXX01JSSwgMCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiRW5hYmxpbmcgc29mdHdhcmUgTUlJIGZhaWxlZDogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JaWYgKCgocmV0ID0KLQkgICAgICBheDg4MTd4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgMHgwMDEwLCAyLCAyLCBidWYpKSA8IDApCi0JICAgIHx8ICgqKCh1MTYgKilidWYpICE9IDB4MDAzYikpIHsKLQkJZGJnKCJSZWFkIFBIWSByZWdpc3RlciAyIG11c3QgYmUgMHgzYjAwOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIE1JSSBzdHJ1Y3R1cmUgKi8KLQlkZXYtPm1paS5kZXYgPSBkZXYtPm5ldDsKLQlkZXYtPm1paS5tZGlvX3JlYWQgPSBheDg4MTd4X21kaW9fcmVhZDsKLQlkZXYtPm1paS5tZGlvX3dyaXRlID0gYXg4ODE3eF9tZGlvX3dyaXRlOwotCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHhmZjsKLQlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweGZmOwotCi0JLyogR2V0IHRoZSBQSFkgaWQgKi8KLQlpZiAoKHJldCA9IGF4ODgxN3hfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1ZikpIDwgMCkgewotCQlkYmcoIkVycm9yIHJlYWRpbmcgUEhZIElEOiAlMDJ4IiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0gZWxzZSBpZiAocmV0IDwgMikgewotCQkvKiB0aGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIDIgYnl0ZXMgKi8KLQkJZGJnKCJBWF9DTURfUkVBRF9QSFlfSUQgcmV0dXJuZWQgbGVzcyB0aGFuIDIgYnl0ZXM6IHJldD0lMDJ4IiwKLQkJICAgIHJldCk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0MjsKLQl9Ci0JZGV2LT5taWkucGh5X2lkID0gKigodTggKilidWYgKyAxKTsKLQotCWlmICgocmV0ID0KLQkgICAgIGF4ODgxN3hfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBBWF9TV1JFU0VUX1BSTCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiU2V0IGV4dGVybmFsIFBIWSByZXNldCBwaW4gbGV2ZWw6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQltc2xlZXAoMTUwKTsKLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwsIDAsIDAsIGJ1ZikpIDwgMCkgewotCQlkYmcoIlNldCBJbnRlcm5hbC9FeHRlcm5hbCBQSFkgcmVzZXQgY29udHJvbDogJWQiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCW1zbGVlcCgxNTApOwotCi0KLQlkZXYtPm5ldC0+c2V0X211bHRpY2FzdF9saXN0ID0gYXg4ODE3eF9zZXRfbXVsdGljYXN0OwotCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4NzcyX2V0aHRvb2xfb3BzOwotCi0JYXg4ODE3eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKLQlheDg4MTd4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKLQkJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSk7Ci0JbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwotCi0JaWYgKChyZXQgPSBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiV3JpdGUgbWVkaXVtIG1vZGUgcmVnaXN0ZXI6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQotCWlmICgocmV0ID0gYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfSVBHMCwgQVg4ODc3Ml9JUEcwX0RFRkFVTFQgfCBBWDg4NzcyX0lQRzFfREVGQVVMVCxBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQyOwotCX0KLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAwLCAwLCAwLCAmYnVmKSkgPCAwKSB7Ci0JCWRiZygiRmFpbGVkIHRvIHNldCBoYXJkd2FyZSBNSUk6ICUwMngiLCByZXQpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KLQlpZiAoKHJldCA9Ci0JICAgICBheDg4MTd4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIDB4MDA4OCwgMCwgMCwKLQkJCSAgICAgICBidWYpKSA8IDApIHsKLQkJZGJnKCJSZXNldCBSWF9DVEwgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQlrZnJlZShidWYpOwotCi0JcmV0dXJuIDA7Ci0KLW91dDI6Ci0Ja2ZyZWUoYnVmKTsKLW91dDE6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBheDg4NzcyX3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQl1MzIgKmhlYWRlcjsKLQljaGFyICpwYWNrZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKmF4X3NrYjsKLQl1MTYgc2l6ZTsKLQotCWhlYWRlciA9ICh1MzIgKikgc2tiLT5kYXRhOwotCWxlMzJfdG9fY3B1cyhoZWFkZXIpOwotCXBhY2tldCA9IChjaGFyICopKGhlYWRlciArIDEpOwotCi0Jc2tiX3B1bGwoc2tiLCA0KTsKLQotCXdoaWxlIChza2ItPmxlbiA+IDApIHsKLQkJaWYgKChzaG9ydCkoKmhlYWRlciAmIDB4MDAwMGZmZmYpICE9Ci0JCSAgICB+KChzaG9ydCkoKCpoZWFkZXIgJiAweGZmZmYwMDAwKSA+PiAxNikpKSB7Ci0JCQlkZXZkYmcoZGV2LCJoZWFkZXIgbGVuZ3RoIGRhdGEgaXMgZXJyb3IiKTsKLQkJfQotCQkvKiBnZXQgdGhlIHBhY2tldCBsZW5ndGggKi8KLQkJc2l6ZSA9ICh1MTYpICgqaGVhZGVyICYgMHgwMDAwZmZmZik7Ci0KLQkJaWYgKChza2ItPmxlbikgLSAoKHNpemUgKyAxKSAmIDB4ZmZmZSkgPT0gMCkKLQkJCXJldHVybiAyOwotCQlpZiAoc2l6ZSA+IEVUSF9GUkFNRV9MRU4pIHsKLQkJCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2l6ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlheF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGF4X3NrYikgewotCQkJYXhfc2tiLT5sZW4gPSBzaXplOwotCQkJYXhfc2tiLT5kYXRhID0gcGFja2V0OwotCQkJYXhfc2tiLT50YWlsID0gcGFja2V0ICsgc2l6ZTsKLQkJCXNrYl9yZXR1cm4oZGV2LCBheF9za2IpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlza2JfcHVsbChza2IsIChzaXplICsgMSkgJiAweGZmZmUpOwotCi0JCWlmIChza2ItPmxlbiA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaGVhZGVyID0gKHUzMiAqKSBza2ItPmRhdGE7Ci0JCWxlMzJfdG9fY3B1cyhoZWFkZXIpOwotCQlwYWNrZXQgPSAoY2hhciAqKShoZWFkZXIgKyAxKTsKLQkJc2tiX3B1bGwoc2tiLCA0KTsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gPCAwKSB7Ci0JCWRldmRiZyhkZXYsImludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYXg4ODc3Ml90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCWludCBmbGFncykKLXsKLQlpbnQgcGFkbGVuOwotCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwotCWludCB0YWlscm9vbSA9IHNrYl90YWlscm9vbShza2IpOwotCXUzMiAqcGFja2V0X2xlbjsKLQl1MzIgKnBhZGJ5dGVzX3B0cjsKLQotCXBhZGxlbiA9ICgoc2tiLT5sZW4gKyA0KSAlIDUxMikgPyAwIDogNDsKLQotCWlmICgoIXNrYl9jbG9uZWQoc2tiKSkKLQkgICAgJiYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+PSAoNCArIHBhZGxlbikpKSB7Ci0JCWlmICgoaGVhZHJvb20gPCA0KSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7Ci0JCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIDQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47Ci0JCX0KLQl9IGVsc2UgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKLQkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIDQsIHBhZGxlbiwgZmxhZ3MpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlza2IgPSBza2IyOwotCQlpZiAoIXNrYikKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCXBhY2tldF9sZW4gPSAodTMyICopIHNrYl9wdXNoKHNrYiwgNCk7Ci0KLQlwYWNrZXRfbGVuID0gKHUzMiAqKSBza2ItPmRhdGE7Ci0JKnBhY2tldF9sZW4gPSAoKChza2ItPmxlbiAtIDQpIF4gMHgwMDAwZmZmZikgPDwgMTYpICsgKHNrYi0+bGVuIC0gNCk7Ci0KLQlpZiAoKHNrYi0+bGVuICUgNTEyKSA9PSAwKSB7Ci0JCXBhZGJ5dGVzX3B0ciA9ICh1MzIgKikgc2tiLT50YWlsOwotCQkqcGFkYnl0ZXNfcHRyID0gMHhmZmZmMDAwMDsKLQkJc2tiX3B1dChza2IsIHBhZGxlbik7Ci0JfQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODc3Ml9saW5rX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQl1MTYgbHBhOwotCXUxNiBtb2RlOwotCi0JbW9kZSA9IEFYODg3NzJfTUVESVVNX0RFRkFVTFQ7Ci0JbHBhID0gYXg4ODE3eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0xQQSk7Ci0KLQlpZiAoKGxwYSAmIExQQV9EVVBMRVgpID09IDApCi0JCW1vZGUgJj0gfkFYODg3NzJfTUVESVVNX0ZVTExfRFVQTEVYOwotCWlmICgobHBhICYgTFBBXzEwMCkgPT0gMCkKLQkJbW9kZSAmPSB+QVg4ODc3Ml9NRURJVU1fMTAwTUI7Ci0JYXg4ODE3eF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gYXg4ODE3eF9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9ICJBU0lYIEFYODgxN3ggVVNCIDIuMCBFdGhlcm5ldCIsCi0JLmJpbmQgPSBheDg4MTd4X2JpbmQsCi0JLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAotCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKLQkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKLQkuZGF0YSA9IDB4MDAxMzAxMDMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGRsaW5rX2R1Yl9lMTAwX2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0gIkRMaW5rIERVQi1FMTAwIFVTQiBFdGhlcm5ldCIsCi0JLmJpbmQgPSBheDg4MTd4X2JpbmQsCi0JLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAotCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKLQkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKLQkuZGF0YSA9IDB4MDA5ZjlkOWYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIG5ldGdlYXJfZmExMjBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPSAiTmV0Z2VhciBGQS0xMjAgVVNCIEV0aGVybmV0IiwKLQkuYmluZCA9IGF4ODgxN3hfYmluZCwKLQkuc3RhdHVzID0gYXg4ODE3eF9zdGF0dXMsCi0JLmxpbmtfcmVzZXQgPSBheDg4MTcyX2xpbmtfcmVzZXQsCi0JLnJlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5mbGFncyA9ICBGTEFHX0VUSEVSLAotCS5kYXRhID0gMHgwMDEzMDEwMywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gaGF3a2luZ191ZjIwMF9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9ICJIYXdraW5nIFVGMjAwIFVTQiBFdGhlcm5ldCIsCi0JLmJpbmQgPSBheDg4MTd4X2JpbmQsCi0JLnN0YXR1cyA9IGF4ODgxN3hfc3RhdHVzLAotCS5saW5rX3Jlc2V0ID0gYXg4ODE3Ml9saW5rX3Jlc2V0LAotCS5yZXNldCA9IGF4ODgxNzJfbGlua19yZXNldCwKLQkuZmxhZ3MgPSAgRkxBR19FVEhFUiwKLQkuZGF0YSA9IDB4MDAxZjFkMWYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGF4ODg3NzJfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPSAiQVNJWCBBWDg4NzcyIFVTQiAyLjAgRXRoZXJuZXQiLAotCS5iaW5kID0gYXg4ODc3Ml9iaW5kLAotCS5zdGF0dXMgPSBheDg4MTd4X3N0YXR1cywKLQkubGlua19yZXNldCA9IGF4ODg3NzJfbGlua19yZXNldCwKLQkucmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCi0JLmZsYWdzID0gRkxBR19FVEhFUiB8IEZMQUdfRlJBTUlOR19BWCwKLQkucnhfZml4dXAgPSBheDg4NzcyX3J4X2ZpeHVwLAotCS50eF9maXh1cCA9IGF4ODg3NzJfdHhfZml4dXAsCi0JLmRhdGEgPSAweDAwMTMwMTAzLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19VU0JfQVg4ODE3WCAqLwotCi0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0JFTEtJTgotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEJlbGtpbiBGNVUxMDQgLi4uIHR3byBOZXRDaGlwIDIyODAgZGV2aWNlcyArIEF0bWVsIG1pY3JvY29udHJvbGxlcgotICoKLSAqIC4uLiBhbHNvIHR3byBlVEVLIGRlc2lnbnMsIGluY2x1ZGluZyBvbmUgc29sZCBhcyAiQWR2YW5jZSBVU0JORVQiCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwliZWxraW5faW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiQmVsa2luLCBlVEVLLCBvciBjb21wYXRpYmxlIiwKLX07Ci0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX0JFTEtJTiAqLwotCi0KLQwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIENvbW11bmljYXRpb25zIERldmljZSBDbGFzcyBkZWNsYXJhdGlvbnMuCi0gKiBVc2VkIGJ5IENEQyBFdGhlcm5ldCwgYW5kIHNvbWUgQ0RDIHZhcmlhbnRzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmCUNPTkZJR19VU0JfQ0RDRVRIRVIKLSNkZWZpbmUgTkVFRF9HRU5FUklDX0NEQwotI2VuZGlmCi0KLSNpZmRlZglDT05GSUdfVVNCX1pBVVJVUwotLyogRXRoZXJuZXQgdmFyaWFudCB1c2VzIGZ1bmt5IGZyYW1pbmcsIGJyb2tlbiBldGhlcm5ldCBhZGRyZXNzaW5nICovCi0jZGVmaW5lIE5FRURfR0VORVJJQ19DREMKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9STkRJUwotLyogQUNNIHZhcmlhbnQgdXNlcyBldmVuIGZ1bmtpZXIgZnJhbWluZywgY29tcGxleCBjb250cm9sIFJQQyBzY2hlbWUgKi8KLSNkZWZpbmUgTkVFRF9HRU5FUklDX0NEQwotI2VuZGlmCi0KLQotI2lmZGVmCU5FRURfR0VORVJJQ19DREMKLQotI2luY2x1ZGUgPGxpbnV4L3VzYl9jZGMuaD4KLQotc3RydWN0IGNkY19zdGF0ZSB7Ci0Jc3RydWN0IHVzYl9jZGNfaGVhZGVyX2Rlc2MJKmhlYWRlcjsKLQlzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjCSp1OwotCXN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MJKmV0aGVyOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCQkqY29udHJvbDsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkJKmRhdGE7Ci19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNibmV0X2RyaXZlcjsKLQotLyoKLSAqIHByb2JlcyBjb250cm9sIGludGVyZmFjZSwgY2xhaW1zIGRhdGEgaW50ZXJmYWNlLCBjb2xsZWN0cyB0aGUgYnVsawotICogZW5kcG9pbnRzLCBhY3RpdmF0ZXMgZGF0YSBpbnRlcmZhY2UgKGlmIG5lZWRlZCksIG1heWJlIHNldHMgTVRVLgotICogYWxsIHB1cmUgY2RjLCBleGNlcHQgZm9yIGNlcnRhaW4gZmlybXdhcmUgd29ya2Fyb3VuZHMuCi0gKi8KLXN0YXRpYyBpbnQgZ2VuZXJpY19jZGNfYmluZCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQl1OAkJCQkqYnVmID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmV4dHJhOwotCWludAkJCQlsZW4gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmFsZW47Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcgkqZDsKLQlzdHJ1Y3QgY2RjX3N0YXRlCQkqaW5mbyA9ICh2b2lkICopICZkZXYtPmRhdGE7Ci0JaW50CQkJCXN0YXR1czsKLQlpbnQJCQkJcm5kaXM7Ci0KLQlpZiAoc2l6ZW9mIGRldi0+ZGF0YSA8IHNpemVvZiAqaW5mbykKLQkJcmV0dXJuIC1FRE9NOwotCi0JLyogZXhwZWN0IHN0cmljdCBzcGVjIGNvbmZvcm1hbmNlIGZvciB0aGUgZGVzY3JpcHRvcnMsIGJ1dAotCSAqIGNvcGUgd2l0aCBmaXJtd2FyZSB3aGljaCBzdG9yZXMgdGhlbSBpbiB0aGUgd3JvbmcgcGxhY2UKLQkgKi8KLQlpZiAobGVuID09IDAgJiYgZGV2LT51ZGV2LT5hY3Rjb25maWctPmV4dHJhbGVuKSB7Ci0JCS8qIE1vdG9yb2xhIFNCNDEwMCAoYW5kIG90aGVyczogQnJhZCBIYXJkcyBzYXlzIGl0J3MKLQkJICogZnJvbSBhIEJyb2FkY29tIGRlc2lnbikgcHV0IENEQyBkZXNjcmlwdG9ycyBoZXJlCi0JCSAqLwotCQlidWYgPSBkZXYtPnVkZXYtPmFjdGNvbmZpZy0+ZXh0cmE7Ci0JCWxlbiA9IGRldi0+dWRldi0+YWN0Y29uZmlnLT5leHRyYWxlbjsKLQkJaWYgKGxlbikKLQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsCi0JCQkJIkNEQyBkZXNjcmlwdG9ycyBvbiBjb25maWdcbiIpOwotCX0KLQotCS8qIHRoaXMgYXNzdW1lcyB0aGF0IGlmIHRoZXJlJ3MgYSBub24tUk5ESVMgdmVuZG9yIHZhcmlhbnQKLQkgKiBvZiBjZGMtYWNtLCBpdCdsbCBmYWlsIFJORElTIHJlcXVlc3RzIGNsZWFubHkuCi0JICovCi0Jcm5kaXMgPSAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sID09IDB4ZmYpOwotCi0JbWVtc2V0IChpbmZvLCAwLCBzaXplb2YgKmluZm8pOwotCWluZm8tPmNvbnRyb2wgPSBpbnRmOwotCXdoaWxlIChsZW4gPiAzKSB7Ci0JCWlmIChidWYgWzFdICE9IFVTQl9EVF9DU19JTlRFUkZBQ0UpCi0JCQlnb3RvIG5leHRfZGVzYzsKLQotCQkvKiB1c2UgYkRlc2NyaXB0b3JTdWJUeXBlIHRvIGlkZW50aWZ5IHRoZSBDREMgZGVzY3JpcHRvcnMuCi0JCSAqIFdlIGV4cGVjdCBkZXZpY2VzIHdpdGggQ0RDIGhlYWRlciBhbmQgdW5pb24gZGVzY3JpcHRvcnMuCi0JCSAqIEZvciBDREMgRXRoZXJuZXQgd2UgbmVlZCB0aGUgZXRoZXJuZXQgZGVzY3JpcHRvci4KLQkJICogRm9yIFJORElTLCBpZ25vcmUgdHdvIChwb2ludGxlc3MpIENEQyBtb2RlbSBkZXNjcmlwdG9ycwotCQkgKiBpbiBmYXZvciBvZiBhIGNvbXBsaWNhdGVkIE9JRC1iYXNlZCBSUEMgc2NoZW1lIGRvaW5nIHdoYXQKLQkJICogQ0RDIEV0aGVybmV0IGFjaGlldmVzIHdpdGggYSBzaW1wbGUgZGVzY3JpcHRvci4KLQkJICovCi0JCXN3aXRjaCAoYnVmIFsyXSkgewotCQljYXNlIFVTQl9DRENfSEVBREVSX1RZUEU6Ci0JCQlpZiAoaW5mby0+aGVhZGVyKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgImV4dHJhIENEQyBoZWFkZXJcbiIpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlpbmZvLT5oZWFkZXIgPSAodm9pZCAqKSBidWY7Ci0JCQlpZiAoaW5mby0+aGVhZGVyLT5iTGVuZ3RoICE9IHNpemVvZiAqaW5mby0+aGVhZGVyKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgIkNEQyBoZWFkZXIgbGVuICV1XG4iLAotCQkJCQlpbmZvLT5oZWFkZXItPmJMZW5ndGgpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfQ0RDX1VOSU9OX1RZUEU6Ci0JCQlpZiAoaW5mby0+dSkgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJleHRyYSBDREMgdW5pb25cbiIpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlpbmZvLT51ID0gKHZvaWQgKikgYnVmOwotCQkJaWYgKGluZm8tPnUtPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT51KSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgIkNEQyB1bmlvbiBsZW4gJXVcbiIsCi0JCQkJCWluZm8tPnUtPmJMZW5ndGgpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0KLQkJCS8qIHdlIG5lZWQgYSBtYXN0ZXIvY29udHJvbCBpbnRlcmZhY2UgKHdoYXQgd2UncmUKLQkJCSAqIHByb2JlZCB3aXRoKSBhbmQgYSBzbGF2ZS9kYXRhIGludGVyZmFjZTsgdW5pb24KLQkJCSAqIGRlc2NyaXB0b3JzIHNvcnQgdGhpcyBhbGwgb3V0LgotCQkJICovCi0JCQlpbmZvLT5jb250cm9sID0gdXNiX2lmbnVtX3RvX2lmKGRldi0+dWRldiwKLQkJCQkJCWluZm8tPnUtPmJNYXN0ZXJJbnRlcmZhY2UwKTsKLQkJCWluZm8tPmRhdGEgPSB1c2JfaWZudW1fdG9faWYoZGV2LT51ZGV2LAotCQkJCQkJaW5mby0+dS0+YlNsYXZlSW50ZXJmYWNlMCk7Ci0JCQlpZiAoIWluZm8tPmNvbnRyb2wgfHwgIWluZm8tPmRhdGEpIHsKLQkJCQlkZXZfZGJnICgmaW50Zi0+ZGV2LAotCQkJCQkibWFzdGVyICMldS8lcCBzbGF2ZSAjJXUvJXBcbiIsCi0JCQkJCWluZm8tPnUtPmJNYXN0ZXJJbnRlcmZhY2UwLAotCQkJCQlpbmZvLT5jb250cm9sLAotCQkJCQlpbmZvLT51LT5iU2xhdmVJbnRlcmZhY2UwLAotCQkJCQlpbmZvLT5kYXRhKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJaWYgKGluZm8tPmNvbnRyb2wgIT0gaW50ZikgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJib2d1cyBDREMgVW5pb25cbiIpOwotCQkJCS8qIEFtYml0IFVTQiBDYWJsZSBNb2RlbSAoYW5kIG1heWJlIG90aGVycykKLQkJCQkgKiBpbnRlcmNoYW5nZXMgbWFzdGVyIGFuZCBzbGF2ZSBpbnRlcmZhY2UuCi0JCQkJICovCi0JCQkJaWYgKGluZm8tPmRhdGEgPT0gaW50ZikgewotCQkJCQlpbmZvLT5kYXRhID0gaW5mby0+Y29udHJvbDsKLQkJCQkJaW5mby0+Y29udHJvbCA9IGludGY7Ci0JCQkJfSBlbHNlCi0JCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0KLQkJCS8qIGEgZGF0YSBpbnRlcmZhY2UgYWx0c2V0dGluZyBkb2VzIHRoZSByZWFsIGkvbyAqLwotCQkJZCA9ICZpbmZvLT5kYXRhLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKLQkJCWlmIChkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0NEQ19EQVRBKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgInNsYXZlIGNsYXNzICV1XG4iLAotCQkJCQlkLT5iSW50ZXJmYWNlQ2xhc3MpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfQ0RDX0VUSEVSTkVUX1RZUEU6Ci0JCQlpZiAoaW5mby0+ZXRoZXIpIHsKLQkJCQlkZXZfZGJnICgmaW50Zi0+ZGV2LCAiZXh0cmEgQ0RDIGV0aGVyXG4iKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJaW5mby0+ZXRoZXIgPSAodm9pZCAqKSBidWY7Ci0JCQlpZiAoaW5mby0+ZXRoZXItPmJMZW5ndGggIT0gc2l6ZW9mICppbmZvLT5ldGhlcikgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJDREMgZXRoZXIgbGVuICV1XG4iLAotCQkJCQlpbmZvLT5ldGhlci0+Ykxlbmd0aCk7Ci0JCQkJZ290byBiYWRfZGVzYzsKLQkJCX0KLQkJCWRldi0+bmV0LT5tdHUgPSBsZTE2X3RvX2NwdXAgKAotCQkJCQkJJmluZm8tPmV0aGVyLT53TWF4U2VnbWVudFNpemUpCi0JCQkJCS0gRVRIX0hMRU47Ci0JCQkvKiBiZWNhdXNlIG9mIFphdXJ1cywgd2UgbWF5IGJlIGlnbm9yaW5nIHRoZSBob3N0Ci0JCQkgKiBzaWRlIGxpbmsgYWRkcmVzcyB3ZSB3ZXJlIGdpdmVuLgotCQkJICovCi0JCQlicmVhazsKLQkJfQotbmV4dF9kZXNjOgotCQlsZW4gLT0gYnVmIFswXTsJLyogYkxlbmd0aCAqLwotCQlidWYgKz0gYnVmIFswXTsKLQl9Ci0KLQlpZiAoIWluZm8tPmhlYWRlciB8fCAhaW5mby0+dSB8fCAoIXJuZGlzICYmICFpbmZvLT5ldGhlcikpIHsKLQkJZGV2X2RiZyAoJmludGYtPmRldiwgIm1pc3NpbmcgY2RjICVzJXMlc2Rlc2NyaXB0b3JcbiIsCi0JCQlpbmZvLT5oZWFkZXIgPyAiIiA6ICJoZWFkZXIgIiwKLQkJCWluZm8tPnUgPyAiIiA6ICJ1bmlvbiAiLAotCQkJaW5mby0+ZXRoZXIgPyAiIiA6ICJldGhlciAiKTsKLQkJZ290byBiYWRfZGVzYzsKLQl9Ci0KLQkvKiBjbGFpbSBkYXRhIGludGVyZmFjZSBhbmQgc2V0IGl0IHVwIC4uLiB3aXRoIHNpZGUgZWZmZWN0cy4KLQkgKiBuZXR3b3JrIHRyYWZmaWMgY2FuJ3QgZmxvdyB1bnRpbCBhbiBhbHRzZXR0aW5nIGlzIGVuYWJsZWQuCi0JICovCi0Jc3RhdHVzID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UgKCZ1c2JuZXRfZHJpdmVyLCBpbmZvLT5kYXRhLCBkZXYpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCXN0YXR1cyA9IGdldF9lbmRwb2ludHMgKGRldiwgaW5mby0+ZGF0YSk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJLyogZW5zdXJlIGltbWVkaWF0ZSBleGl0IGZyb20gdXNibmV0X2Rpc2Nvbm5lY3QgKi8KLQkJdXNiX3NldF9pbnRmZGF0YShpbmZvLT5kYXRhLCBOVUxMKTsKLQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSAoJnVzYm5ldF9kcml2ZXIsIGluZm8tPmRhdGEpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qIHN0YXR1cyBlbmRwb2ludDogb3B0aW9uYWwgZm9yIENEQyBFdGhlcm5ldCwgbm90IFJORElTIChvciBBQ00pICovCi0JZGV2LT5zdGF0dXMgPSBOVUxMOwotCWlmIChpbmZvLT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzID09IDEpIHsKLQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjOwotCi0JCWRldi0+c3RhdHVzID0gJmluZm8tPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludCBbMF07Ci0JCWRlc2MgPSAmZGV2LT5zdGF0dXMtPmRlc2M7Ci0JCWlmIChkZXNjLT5ibUF0dHJpYnV0ZXMgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UCi0JCQkJfHwgIShkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKLQkJCQl8fCAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpCi0JCQkJCTwgc2l6ZW9mIChzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24pKQotCQkJCXx8ICFkZXNjLT5iSW50ZXJ2YWwpIHsKLQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJiYWQgbm90aWZpY2F0aW9uIGVuZHBvaW50XG4iKTsKLQkJCWRldi0+c3RhdHVzID0gTlVMTDsKLQkJfQotCX0KLQlpZiAocm5kaXMgJiYgIWRldi0+c3RhdHVzKSB7Ci0JCWRldl9kYmcgKCZpbnRmLT5kZXYsICJtaXNzaW5nIFJORElTIHN0YXR1cyBlbmRwb2ludFxuIik7Ci0JCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+ZGF0YSwgTlVMTCk7Ci0JCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UgKCZ1c2JuZXRfZHJpdmVyLCBpbmZvLT5kYXRhKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOwotCi1iYWRfZGVzYzoKLQlkZXZfaW5mbyAoJmRldi0+dWRldi0+ZGV2LCAiYmFkIENEQyBkZXNjcmlwdG9yc1xuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIGNkY191bmJpbmQgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IGNkY19zdGF0ZQkJKmluZm8gPSAodm9pZCAqKSAmZGV2LT5kYXRhOwotCi0JLyogZGlzY29ubmVjdCBtYXN0ZXIgLS0+IGRpc2Nvbm5lY3Qgc2xhdmUgKi8KLQlpZiAoaW50ZiA9PSBpbmZvLT5jb250cm9sICYmIGluZm8tPmRhdGEpIHsKLQkJLyogZW5zdXJlIGltbWVkaWF0ZSBleGl0IGZyb20gdXNibmV0X2Rpc2Nvbm5lY3QgKi8KLQkJdXNiX3NldF9pbnRmZGF0YShpbmZvLT5kYXRhLCBOVUxMKTsKLQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSAoJnVzYm5ldF9kcml2ZXIsIGluZm8tPmRhdGEpOwotCQlpbmZvLT5kYXRhID0gTlVMTDsKLQl9Ci0KLQkvKiBhbmQgdmljZSB2ZXJzYSAoanVzdCBpbiBjYXNlKSAqLwotCWVsc2UgaWYgKGludGYgPT0gaW5mby0+ZGF0YSAmJiBpbmZvLT5jb250cm9sKSB7Ci0JCS8qIGVuc3VyZSBpbW1lZGlhdGUgZXhpdCBmcm9tIHVzYm5ldF9kaXNjb25uZWN0ICovCi0JCXVzYl9zZXRfaW50ZmRhdGEoaW5mby0+Y29udHJvbCwgTlVMTCk7Ci0JCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UgKCZ1c2JuZXRfZHJpdmVyLCBpbmZvLT5jb250cm9sKTsKLQkJaW5mby0+Y29udHJvbCA9IE5VTEw7Ci0JfQotfQotCi0jZW5kaWYJLyogTkVFRF9HRU5FUklDX0NEQyAqLwotCi0MCi0jaWZkZWYJQ09ORklHX1VTQl9DRENFVEhFUgotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIENvbW11bmljYXRpb25zIERldmljZSBDbGFzcywgRXRoZXJuZXQgQ29udHJvbCBtb2RlbAotICoKLSAqIFRha2VzIHR3byBpbnRlcmZhY2VzLiAgVGhlIERBVEEgaW50ZXJmYWNlIGlzIGluYWN0aXZlIHRpbGwgYW4gYWx0c2V0dGluZwotICogaXMgc2VsZWN0ZWQuICBDb25maWd1cmF0aW9uIGRhdGEgaW5jbHVkZXMgY2xhc3MgZGVzY3JpcHRvcnMuCi0gKgotICogVGhpcyBzaG91bGQgaW50ZXJvcCB3aXRoIHdoYXRldmVyIHRoZSAyLjQgIkNEQ0V0aGVyLmMiIGRyaXZlcgotICogKGJ5IEJyYWQgSGFyZHMpIHRhbGtlZCB3aXRoLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotCi0KLXN0YXRpYyB2b2lkIGR1bXBzcGVlZCAoc3RydWN0IHVzYm5ldCAqZGV2LCBfX2xlMzIgKnNwZWVkcykKLXsKLQlpZiAobmV0aWZfbXNnX3RpbWVyIChkZXYpKQotCQlkZXZpbmZvIChkZXYsICJsaW5rIHNwZWVkczogJXUga2JwcyB1cCwgJXUga2JwcyBkb3duIiwKLQkJCV9fbGUzMl90b19jcHUoc3BlZWRzWzBdKSAvIDEwMDAsCi0JCV9fbGUzMl90b19jcHUoc3BlZWRzWzFdKSAvIDEwMDApOwotfQotCi1zdGF0aWMgdm9pZCBjZGNfc3RhdHVzIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24JKmV2ZW50OwotCi0JaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHNpemVvZiAqZXZlbnQpCi0JCXJldHVybjsKLQkKLQkvKiBTUEVFRF9DSEFOR0UgY2FuIGdldCBzcGxpdCBpbnRvIHR3byA4LWJ5dGUgcGFja2V0cyAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQgKEVWRU5UX1NUU19TUExJVCwgJmRldi0+ZmxhZ3MpKSB7Ci0JCWR1bXBzcGVlZCAoZGV2LCAoX19sZTMyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJcmV0dXJuOwotCX0KLQotCWV2ZW50ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0Jc3dpdGNoIChldmVudC0+Yk5vdGlmaWNhdGlvblR5cGUpIHsKLQljYXNlIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTjoKLQkJaWYgKG5ldGlmX21zZ190aW1lciAoZGV2KSkKLQkJCWRldmRiZyAoZGV2LCAiQ0RDOiBjYXJyaWVyICVzIiwKLQkJCQkJZXZlbnQtPndWYWx1ZSA/ICJvbiIgOiAib2ZmIik7Ci0JCWlmIChldmVudC0+d1ZhbHVlKQotCQkJbmV0aWZfY2Fycmllcl9vbihkZXYtPm5ldCk7Ci0JCWVsc2UKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldi0+bmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfQ0RDX05PVElGWV9TUEVFRF9DSEFOR0U6CS8qIHR4L3J4IHJhdGVzICovCi0JCWlmIChuZXRpZl9tc2dfdGltZXIgKGRldikpCi0JCQlkZXZkYmcgKGRldiwgIkNEQzogc3BlZWQgY2hhbmdlIChsZW4gJWQpIiwKLQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSAoc2l6ZW9mICpldmVudCArIDgpKQotCQkJc2V0X2JpdCAoRVZFTlRfU1RTX1NQTElULCAmZGV2LT5mbGFncyk7Ci0JCWVsc2UKLQkJCWR1bXBzcGVlZCAoZGV2LCAoX19sZTMyICopICZldmVudFsxXSk7Ci0JCWJyZWFrOwotCS8vIGNhc2UgVVNCX0NEQ19OT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFOgkvKiBSTkRJUzsgb3IgdW5zb2xpY2l0ZWQgKi8KLQlkZWZhdWx0OgotCQlkZXZlcnIgKGRldiwgIkNEQzogdW5leHBlY3RlZCBub3RpZmljYXRpb24gJTAyeCEiLAotCQkJCSBldmVudC0+Yk5vdGlmaWNhdGlvblR5cGUpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB1OCBuaWJibGUgKHVuc2lnbmVkIGNoYXIgYykKLXsKLQlpZiAobGlrZWx5IChpc2RpZ2l0IChjKSkpCi0JCXJldHVybiBjIC0gJzAnOwotCWMgPSB0b3VwcGVyIChjKTsKLQlpZiAobGlrZWx5IChpc3hkaWdpdCAoYykpKQotCQlyZXR1cm4gMTAgKyBjIC0gJ0EnOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZ2V0X2V0aGVybmV0X2FkZHIgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9jZGNfZXRoZXJfZGVzYyAqZSkKLXsKLQlpbnQgCQl0bXAsIGk7Ci0JdW5zaWduZWQgY2hhcglidWYgWzEzXTsKLQotCXRtcCA9IHVzYl9zdHJpbmcgKGRldi0+dWRldiwgZS0+aU1BQ0FkZHJlc3MsIGJ1Ziwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHRtcCAhPSAxMikgewotCQlkZXZfZGJnICgmZGV2LT51ZGV2LT5kZXYsCi0JCQkiYmFkIE1BQyBzdHJpbmcgJWQgZmV0Y2gsICVkXG4iLCBlLT5pTUFDQWRkcmVzcywgdG1wKTsKLQkJaWYgKHRtcCA+PSAwKQotCQkJdG1wID0gLUVJTlZBTDsKLQkJcmV0dXJuIHRtcDsKLQl9Ci0JZm9yIChpID0gdG1wID0gMDsgaSA8IDY7IGkrKywgdG1wICs9IDIpCi0JCWRldi0+bmV0LT5kZXZfYWRkciBbaV0gPQotCQkJIChuaWJibGUgKGJ1ZiBbdG1wXSkgPDwgNCkgKyBuaWJibGUgKGJ1ZiBbdG1wICsgMV0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNkY19iaW5kIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludAkJCQlzdGF0dXM7Ci0Jc3RydWN0IGNkY19zdGF0ZQkJKmluZm8gPSAodm9pZCAqKSAmZGV2LT5kYXRhOwotCi0Jc3RhdHVzID0gZ2VuZXJpY19jZGNfYmluZCAoZGV2LCBpbnRmKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCXN0YXR1cyA9IGdldF9ldGhlcm5ldF9hZGRyIChkZXYsIGluZm8tPmV0aGVyKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmRhdGEsIE5VTEwpOwotCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlICgmdXNibmV0X2RyaXZlciwgaW5mby0+ZGF0YSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyogRklYTUUgY2RjLWV0aGVyIGhhcyBzb21lIG11bHRpY2FzdCBjb2RlIHRvbywgdGhvdWdoIGl0IGNvbXBsYWlucwotCSAqIGluIHJvdXRpbmUgY2FzZXMuICBpbmZvLT5ldGhlciBkZXNjcmliZXMgdGhlIG11bHRpY2FzdCBzdXBwb3J0LgotCSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWNkY19pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJDREMgRXRoZXJuZXQgRGV2aWNlIiwKLQkuZmxhZ3MgPQlGTEFHX0VUSEVSLAotCS8vIC5jaGVja19jb25uZWN0ID0gY2RjX2NoZWNrX2Nvbm5lY3QsCi0JLmJpbmQgPQkJY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnN0YXR1cyA9CWNkY19zdGF0dXMsCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9DRENFVEhFUiAqLwotCi0KLQwKLSNpZmRlZglDT05GSUdfVVNCX0VQU09OMjg4OAotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEVQU09OIFVTQiBjbGllbnRzCi0gKgotICogVGhpcyBpcyB0aGUgc2FtZSBpZGVhIGFzIExpbnV4IFBEQXMgKGJlbG93KSBleGNlcHQgdGhlIGZpcm13YXJlIGluIHRoZQotICogZGV2aWNlIG1pZ2h0IG5vdCBiZSBUdXgtcG93ZXJlZC4gIEVwc29uIHByb3ZpZGVzIHJlZmVyZW5jZSBmaXJtd2FyZSB0aGF0Ci0gKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiAgUHJvZHVjdCBkZXZlbG9wZXJzIGNhbiByZXVzZSBvciBtb2RpZnkgdGhhdAotICogY29kZSwgc3VjaCBhcyBieSB1c2luZyB0aGVpciBvd24gcHJvZHVjdCBhbmQgdmVuZG9yIGNvZGVzLgotICoKLSAqIFN1cHBvcnQgd2FzIGZyb20gSnVybyBCeXN0cmlja3kgPGJ5c3RyaWNreS5qdXJvQGVyZC5lcHNvbi5jb20+Ci0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwllcHNvbjI4ODhfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiRXBzb24gVVNCIERldmljZSIsCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCi0JLmluID0gNCwgLm91dCA9IDMsCi19OwotCi0jZW5kaWYJLyogQ09ORklHX1VTQl9FUFNPTjI4ODggKi8KLQotDAotI2lmZGVmIENPTkZJR19VU0JfR0VORVNZUwotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEdlbmVTeXMgR0w2MjBVU0ItQSAod3d3LmdlbmVzeXNsb2dpYy5jb20udHcpCi0gKgotICogLi4uIHNob3VsZCBwYXJ0aWFsbHkgaW50ZXJvcCB3aXRoIHRoZSBXaW4zMiBkcml2ZXIgZm9yIHRoaXMgaGFyZHdhcmUKLSAqIFRoZSBHZW5lU3lzIGRvY3MgaW1wbHkgdGhlcmUncyBzb21lIE5ESVMgaXNzdWUgbW90aXZhdGluZyB0aGlzIGZyYW1pbmcuCi0gKgotICogU29tZSBpbmZvIGZyb20gR2VuZVN5czoKLSAqICAtIEdMNjIwVVNCLUEgaXMgZnVsbCBkdXBsZXg7IEdMNjIwVVNCIGlzIG9ubHkgaGFsZiBkdXBsZXggZm9yIGJ1bGsuCi0gKiAgICAoU29tZSBjYWJsZXMsIGxpa2UgdGhlIEJBRk8tMTAwYywgdXNlIHRoZSBoYWxmIGR1cGxleCB2ZXJzaW9uLikKLSAqICAtIEZvciB0aGUgZnVsbCBkdXBsZXggbW9kZWwsIHRoZSBsb3cgYml0IG9mIHRoZSB2ZXJzaW9uIGNvZGUgc2F5cwotICogICAgd2hpY2ggc2lkZSBpcyB3aGljaCAoImxlZnQvcmlnaHQiKS4KLSAqICAtIEZvciB0aGUgaGFsZiBkdXBsZXggdHlwZSwgYSBjb250cm9sL2ludGVycnVwdCBoYW5kc2hha2Ugc2V0dGxlcwotICogICAgdGhlIHRyYW5zZmVyIGRpcmVjdGlvbi4gIChUaGF0J3MgZGlzYWJsZWQgaGVyZSwgcGFydGlhbGx5IGNvZGVkLikKLSAqICAgIEEgY29udHJvbCBVUkIgd291bGQgYmxvY2sgdW50aWwgb3RoZXIgc2lkZSB3cml0ZXMgYW4gaW50ZXJydXB0LgotICoKLSAqIE9yaWdpbmFsIGNvZGUgZnJvbSBKaXVuLUppZSBIdWFuZyA8aHVhbmdqakBnZW5lc3lzbG9naWMuY29tLnR3PgotICogYW5kIG1lcmdlZCBpbnRvICJ1c2JuZXQiIGJ5IFN0YW5pc2xhdiBCcmFiZWMgPHV0eEBwZW5ndWluLmN6Pi4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vLyBjb250cm9sIG1zZyB3cml0ZSBjb21tYW5kCi0jZGVmaW5lIEdFTkVMSU5LX0NPTk5FQ1RfV1JJVEUJCQkweEYwCi0vLyBpbnRlcnJ1cHQgcGlwZSBpbmRleAotI2RlZmluZSBHRU5FTElOS19JTlRFUlJVUFRfUElQRQkJCTB4MDMKLS8vIGludGVycnVwdCByZWFkIGJ1ZmZlciBzaXplCi0jZGVmaW5lIElOVEVSUlVQVF9CVUZTSVpFCQkJMHgwOAotLy8gaW50ZXJydXB0IHBpcGUgaW50ZXJ2YWwgdmFsdWUKLSNkZWZpbmUgR0VORUxJTktfSU5URVJSVVBUX0lOVEVSVkFMCQkweDEwCi0vLyBtYXggdHJhbnNtaXQgcGFja2V0IG51bWJlciBwZXIgdHJhbnNtaXQKLSNkZWZpbmUgR0xfTUFYX1RSQU5TTUlUX1BBQ0tFVFMJCQkzMgotLy8gbWF4IHBhY2tldCBsZW5ndGgKLSNkZWZpbmUgR0xfTUFYX1BBQ0tFVF9MRU4JCQkxNTE0Ci0vLyBtYXggcmVjZWl2ZSBidWZmZXIgc2l6ZSAKLSNkZWZpbmUgR0xfUkNWX0JVRl9TSVpFCQlcCi0JKCgoR0xfTUFYX1BBQ0tFVF9MRU4gKyA0KSAqIEdMX01BWF9UUkFOU01JVF9QQUNLRVRTKSArIDQpCi0KLXN0cnVjdCBnbF9wYWNrZXQgewotCXUzMgkJcGFja2V0X2xlbmd0aDsKLQljaGFyCQlwYWNrZXRfZGF0YSBbMV07Ci19OwotCi1zdHJ1Y3QgZ2xfaGVhZGVyIHsKLQl1MzIJCQlwYWNrZXRfY291bnQ7Ci0Jc3RydWN0IGdsX3BhY2tldAlwYWNrZXRzOwotfTsKLQotI2lmZGVmCUdFTkVMSU5LX0FDSwotCi0vLyBGSVhNRTogIHRoaXMgY29kZSBpcyBpbmNvbXBsZXRlLCBub3QgZGVidWdnZWQ7IGl0IGRvZXNuJ3QKLS8vIGhhbmRsZSBpbnRlcnJ1cHRzIGNvcnJlY3RseS4gIGludGVycnVwdHMgc2hvdWxkIGJlIGdlbmVyaWMKLS8vIGNvZGUgbGlrZSBhbGwgb3RoZXIgZGV2aWNlIEkvTywgYW55d2F5LgotCi1zdHJ1Y3QgZ2xfcHJpdiB7IAotCXN0cnVjdCB1cmIJKmlycV91cmI7Ci0JY2hhcgkJaXJxX2J1ZiBbSU5URVJSVVBUX0JVRlNJWkVdOwotfTsKLQotc3RhdGljIGlubGluZSBpbnQgZ2xfY29udHJvbF93cml0ZSAoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUpCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LAotCQkgICAgICB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCSAgICAgIHJlcXVlc3QsCi0JCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkgICAgICB2YWx1ZSwgCi0JCSAgICAgIDAsCQkJLy8gaW5kZXgKLQkJICAgICAgMCwJCQkvLyBkYXRhIGJ1ZmZlcgotCQkgICAgICAwLAkJCS8vIHNpemUKLQkJICAgICAgQ09OVFJPTF9USU1FT1VUX01TKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBnbF9pbnRlcnJ1cHRfY29tcGxldGUgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCi0JCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChzdGF0dXMpCi0JCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2xfaW50ZXJydXB0X3JlYWQgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlzdHJ1Y3QgZ2xfcHJpdgkqcHJpdiA9IGRldi0+cHJpdl9kYXRhOwotCWludAkJcmV0dmFsOwotCi0JLy8gaXNzdWUgdXNiIGludGVycnVwdCByZWFkCi0JaWYgKHByaXYgJiYgcHJpdi0+aXJxX3VyYikgewotCQkvLyBzdWJtaXQgdXJiCi0JCWlmICgocmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHByaXYtPmlycV91cmIsIEdGUF9LRVJORUwpKSAhPSAwKQotCQkJZGJnICgiZ2xfaW50ZXJydXB0X3JlYWQ6IHN1Ym1pdCBmYWlsIC0gJVguLi4iLCByZXR2YWwpOwotCQllbHNlCi0JCQlkYmcgKCJnbF9pbnRlcnJ1cHRfcmVhZDogc3VibWl0IHN1Y2Nlc3MuLi4iKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLy8gY2hlY2sgd2hldGhlciBhbm90aGVyIHNpZGUgaXMgY29ubmVjdGVkCi1zdGF0aWMgaW50IGdlbmVsaW5rX2NoZWNrX2Nvbm5lY3QgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlpbnQJCQlyZXR2YWw7Ci0KLQlkYmcgKCJnZW5lbGlua19jaGVja19jb25uZWN0Li4uIik7Ci0KLQkvLyBkZXRlY3Qgd2hldGhlciBhbm90aGVyIHNpZGUgaXMgY29ubmVjdGVkCi0JaWYgKChyZXR2YWwgPSBnbF9jb250cm9sX3dyaXRlIChkZXYsIEdFTkVMSU5LX0NPTk5FQ1RfV1JJVEUsIDApKSAhPSAwKSB7Ci0JCWRiZyAoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHdyaXRlIGZhaWwgLSAlWCIsCi0JCQlkZXYtPm5ldC0+bmFtZSwgcmV0dmFsKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQkvLyB1c2IgaW50ZXJydXB0IHJlYWQgdG8gYWNrIGFub3RoZXIgc2lkZSAKLQlpZiAoKHJldHZhbCA9IGdsX2ludGVycnVwdF9yZWFkIChkZXYpKSAhPSAwKSB7Ci0JCWRiZyAoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHJlYWQgZmFpbCAtICVYIiwKLQkJCWRldi0+bmV0LT5uYW1lLCByZXR2YWwpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCWRiZyAoIiVzOiBnZW5lbGlua19jaGVja19jb25uZWN0IHJlYWQgc3VjY2VzcyIsIGRldi0+bmV0LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotLy8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHByaXZhdGUgZGF0YSBmb3IgZ2VuZWxpbmsKLXN0YXRpYyBpbnQgZ2VuZWxpbmtfaW5pdCAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXN0cnVjdCBnbF9wcml2ICpwcml2OwotCi0JLy8gYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLQlpZiAoKHByaXYgPSBrbWFsbG9jIChzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpKSA9PSAwKSB7Ci0JCWRiZyAoIiVzOiBjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHBlciBkZXZpY2UiLAotCQkJZGV2LT5uZXQtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvLyBhbGxvY2F0ZSBpcnEgdXJiCi0JaWYgKChwcml2LT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCkpID09IDApIHsKLQkJZGJnICgiJXM6IGNhbm5vdCBhbGxvY2F0ZSBwcml2YXRlIGlycSB1cmIgcGVyIGRldmljZSIsCi0JCQlkZXYtPm5ldC0+bmFtZSk7Ci0JCWtmcmVlIChwcml2KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLy8gZmlsbCBpcnEgdXJiCi0JdXNiX2ZpbGxfaW50X3VyYiAocHJpdi0+aXJxX3VyYiwgZGV2LT51ZGV2LAotCQl1c2JfcmN2aW50cGlwZSAoZGV2LT51ZGV2LCBHRU5FTElOS19JTlRFUlJVUFRfUElQRSksCi0JCXByaXYtPmlycV9idWYsIElOVEVSUlVQVF9CVUZTSVpFLAotCQlnbF9pbnRlcnJ1cHRfY29tcGxldGUsIDAsCi0JCUdFTkVMSU5LX0lOVEVSUlVQVF9JTlRFUlZBTCk7Ci0KLQkvLyBzZXQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIKLQlkZXYtPnByaXZfZGF0YSA9IHByaXY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLy8gcmVsZWFzZSB0aGUgcHJpdmF0ZSBkYXRhCi1zdGF0aWMgaW50IGdlbmVsaW5rX2ZyZWUgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlzdHJ1Y3QgZ2xfcHJpdgkqcHJpdiA9IGRldi0+cHJpdl9kYXRhOwotCi0JaWYgKCFwcml2KSAKLQkJcmV0dXJuIDA7Ci0KLS8vIEZJWE1FOiAgY2FuJ3QgY2FuY2VsIGhlcmU7IGl0J3Mgc3luY2hyb25vdXMsIGFuZAotLy8gc2hvdWxkIGhhdmUgaGFwcGVuZWQgZWFybGllciBpbiBhbnkgY2FzZSAoaW50ZXJydXB0Ci0vLyBoYW5kbGluZyBuZWVkcyB0byBiZSBnZW5lcmljKQotCi0JLy8gY2FuY2VsIGlycSB1cmIgZmlyc3QKLQl1c2Jfa2lsbF91cmIgKHByaXYtPmlycV91cmIpOwotCi0JLy8gZnJlZSBpcnEgdXJiCi0JdXNiX2ZyZWVfdXJiIChwcml2LT5pcnFfdXJiKTsKLQotCS8vIGZyZWUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLQlrZnJlZSAocHJpdik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZ2VuZWxpbmtfcnhfZml4dXAgKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgZ2xfaGVhZGVyCSpoZWFkZXI7Ci0Jc3RydWN0IGdsX3BhY2tldAkqcGFja2V0OwotCXN0cnVjdCBza19idWZmCQkqZ2xfc2tiOwotCXUzMgkJCXNpemU7Ci0KLQloZWFkZXIgPSAoc3RydWN0IGdsX2hlYWRlciAqKSBza2ItPmRhdGE7Ci0KLQkvLyBnZXQgdGhlIHBhY2tldCBjb3VudCBvZiB0aGUgcmVjZWl2ZWQgc2tiCi0JbGUzMl90b19jcHVzICgmaGVhZGVyLT5wYWNrZXRfY291bnQpOwotCWlmICgoaGVhZGVyLT5wYWNrZXRfY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykKLQkJCXx8IChoZWFkZXItPnBhY2tldF9jb3VudCA8IDApKSB7Ci0JCWRiZyAoImdlbmVsaW5rOiBpbnZhbGlkIHJlY2VpdmVkIHBhY2tldCBjb3VudCAlZCIsCi0JCQloZWFkZXItPnBhY2tldF9jb3VudCk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8vIHNldCB0aGUgY3VycmVudCBwYWNrZXQgcG9pbnRlciB0byB0aGUgZmlyc3QgcGFja2V0Ci0JcGFja2V0ID0gJmhlYWRlci0+cGFja2V0czsKLQotCS8vIGRlY3JlbWVudCB0aGUgbGVuZ3RoIGZvciB0aGUgcGFja2V0IGNvdW50IHNpemUgNCBieXRlcwotCXNrYl9wdWxsIChza2IsIDQpOwotCi0Jd2hpbGUgKGhlYWRlci0+cGFja2V0X2NvdW50ID4gMSkgewotCQkvLyBnZXQgdGhlIHBhY2tldCBsZW5ndGgKLQkJc2l6ZSA9IHBhY2tldC0+cGFja2V0X2xlbmd0aDsKLQotCQkvLyB0aGlzIG1heSBiZSBhIGJyb2tlbiBwYWNrZXQKLQkJaWYgKHNpemUgPiBHTF9NQVhfUEFDS0VUX0xFTikgewotCQkJZGJnICgiZ2VuZWxpbms6IGludmFsaWQgcnggbGVuZ3RoICVkIiwgc2l6ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8vIGFsbG9jYXRlIHRoZSBza2IgZm9yIHRoZSBpbmRpdmlkdWFsIHBhY2tldAotCQlnbF9za2IgPSBhbGxvY19za2IgKHNpemUsIEdGUF9BVE9NSUMpOwotCQlpZiAoZ2xfc2tiKSB7Ci0KLQkJCS8vIGNvcHkgdGhlIHBhY2tldCBkYXRhIHRvIHRoZSBuZXcgc2tiCi0JCQltZW1jcHkoc2tiX3B1dChnbF9za2IsIHNpemUpLCBwYWNrZXQtPnBhY2tldF9kYXRhLCBzaXplKTsKLQkJCXNrYl9yZXR1cm4gKGRldiwgZ2xfc2tiKTsKLQkJfQotCi0JCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgcGFja2V0Ci0JCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopCi0JCQkmcGFja2V0LT5wYWNrZXRfZGF0YSBbc2l6ZV07Ci0JCWhlYWRlci0+cGFja2V0X2NvdW50LS07Ci0KLQkJLy8gc2hpZnQgdGhlIGRhdGEgcG9pbnRlciB0byB0aGUgbmV4dCBnbF9wYWNrZXQKLQkJc2tiX3B1bGwgKHNrYiwgc2l6ZSArIDQpOwotCX0KLQotCS8vIHNraXAgdGhlIHBhY2tldCBsZW5ndGggZmllbGQgNCBieXRlcwotCXNrYl9wdWxsIChza2IsIDQpOwotCi0JaWYgKHNrYi0+bGVuID4gR0xfTUFYX1BBQ0tFVF9MRU4pIHsKLQkJZGJnICgiZ2VuZWxpbms6IGludmFsaWQgcnggbGVuZ3RoICVkIiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1nZW5lbGlua190eF9maXh1cCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZmxhZ3MpCi17Ci0JaW50IAlwYWRsZW47Ci0JaW50CWxlbmd0aCA9IHNrYi0+bGVuOwotCWludAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbSAoc2tiKTsKLQlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20gKHNrYik7Ci0JdTMyCSpwYWNrZXRfY291bnQ7Ci0JdTMyCSpwYWNrZXRfbGVuOwotCi0JLy8gRklYTUU6ICBtYWdpYyBudW1iZXJzLCBibGVlY2gKLQlwYWRsZW4gPSAoKHNrYi0+bGVuICsgKDQgKyA0KjEpKSAlIDY0KSA/IDAgOiAxOwotCi0JaWYgKCghc2tiX2Nsb25lZCAoc2tiKSkKLQkJCSYmICgoaGVhZHJvb20gKyB0YWlscm9vbSkgPj0gKHBhZGxlbiArICg0ICsgNCoxKSkpKSB7Ci0JCWlmICgoaGVhZHJvb20gPCAoNCArIDQqMSkpIHx8ICh0YWlscm9vbSA8IHBhZGxlbikpIHsKLQkJCXNrYi0+ZGF0YSA9IG1lbW1vdmUgKHNrYi0+aGVhZCArICg0ICsgNCoxKSwKLQkJCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHNrX2J1ZmYJKnNrYjI7Ci0JCXNrYjIgPSBza2JfY29weV9leHBhbmQgKHNrYiwgKDQgKyA0KjEpICwgcGFkbGVuLCBmbGFncyk7Ci0JCWRldl9rZnJlZV9za2JfYW55IChza2IpOwotCQlza2IgPSBza2IyOwotCQlpZiAoIXNrYikKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCS8vIGF0dGFjaCB0aGUgcGFja2V0IGNvdW50IHRvIHRoZSBoZWFkZXIKLQlwYWNrZXRfY291bnQgPSAodTMyICopIHNrYl9wdXNoIChza2IsICg0ICsgNCoxKSk7Ci0JcGFja2V0X2xlbiA9IHBhY2tldF9jb3VudCArIDE7Ci0KLQkvLyBGSVhNRSBsaXR0bGUgZW5kaWFuPwotCSpwYWNrZXRfY291bnQgPSAxOwotCSpwYWNrZXRfbGVuID0gbGVuZ3RoOwotCi0JLy8gYWRkIHBhZGRpbmcgYnl0ZQotCWlmICgoc2tiLT5sZW4gJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKLQkJc2tiX3B1dCAoc2tiLCAxKTsKLQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JZ2VuZWxpbmtfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiR2VuZXN5cyBHZW5lTGluayIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX0dMIHwgRkxBR19OT19TRVRJTlQsCi0JLnJ4X2ZpeHVwID0JZ2VuZWxpbmtfcnhfZml4dXAsCi0JLnR4X2ZpeHVwID0JZ2VuZWxpbmtfdHhfZml4dXAsCi0KLQkuaW4gPSAxLCAub3V0ID0gMiwKLQotI2lmZGVmCUdFTkVMSU5LX0FDSwotCS5jaGVja19jb25uZWN0ID1nZW5lbGlua19jaGVja19jb25uZWN0LAotI2VuZGlmCi19OwotCi0jZW5kaWYgLyogQ09ORklHX1VTQl9HRU5FU1lTICovCi0KLQotDAotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIE5ldGNoaXAgMTA4MCBkcml2ZXIgLi4uIGh0dHA6Ly93d3cubmV0Y2hpcC5jb20KLSAqIFVzZWQgaW4gTGFwTGluayBjYWJsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIGRldl9wYWNrZXRfaWQJZGF0YVswXQotI2RlZmluZSBmcmFtZV9lcnJvcnMJZGF0YVsxXQotCi0vKgotICogTmV0Q2hpcCBmcmFtaW5nIG9mIGV0aGVybmV0IHBhY2tldHMsIHN1cHBvcnRpbmcgYWRkaXRpb25hbCBlcnJvcgotICogY2hlY2tzIGZvciBsaW5rcyB0aGF0IG1heSBkcm9wIGJ1bGsgcGFja2V0cyBmcm9tIGluc2lkZSBtZXNzYWdlcy4KLSAqIE9kZCBVU0IgbGVuZ3RoID09IGFsd2F5cyBzaG9ydCByZWFkIGZvciBsYXN0IHVzYiBwYWNrZXQuCi0gKgktIG5jX2hlYWRlcgotICoJLSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQotICoJLSBwYXlsb2FkCi0gKgktIChvcHRpb25hbCBwYWRkaW5nIGJ5dGUsIGlmIG5lZWRlZCBzbyBsZW5ndGggYmVjb21lcyBvZGQpCi0gKgktIG5jX3RyYWlsZXIKLSAqCi0gKiBUaGlzIGZyYW1pbmcgaXMgdG8gYmUgYXZvaWRlZCBmb3Igbm9uLU5ldENoaXAgZGV2aWNlcy4KLSAqLwotCi1zdHJ1Y3QgbmNfaGVhZGVyIHsJCS8vIHBhY2tlZDoKLQlfX2xlMTYJaGRyX2xlbjsJCS8vIHNpemVvZiBuY19oZWFkZXIgKExFLCBhbGwpCi0JX19sZTE2CXBhY2tldF9sZW47CQkvLyBwYXlsb2FkIHNpemUgKGluY2x1ZGluZyBldGhoZHIpCi0JX19sZTE2CXBhY2tldF9pZDsJCS8vIGRldGVjdHMgZHJvcHBlZCBwYWNrZXRzCi0jZGVmaW5lIE1JTl9IRUFERVIJNgotCi0JLy8gYWxsIGVsc2UgaXMgb3B0aW9uYWwsIGFuZCBtdXN0IHN0YXJ0IHdpdGg6Ci0JLy8gdTE2CXZlbmRvcklkOwkJLy8gZnJvbSB1c2ItaWYKLQkvLyB1MTYJcHJvZHVjdElkOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLSNkZWZpbmUJUEFEX0JZVEUJKCh1bnNpZ25lZCBjaGFyKTB4QUMpCi0KLXN0cnVjdCBuY190cmFpbGVyIHsKLQlfX2xlMTYJcGFja2V0X2lkOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLS8vIHBhY2tldHMgbWF5IHVzZSBGTEFHX0ZSQU1JTkdfTkMgYW5kIG9wdGlvbmFsIHBhZAotI2RlZmluZSBGUkFNRURfU0laRShtdHUpIChzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpIFwKLQkJCQkrIHNpemVvZiAoc3RydWN0IGV0aGhkcikgXAotCQkJCSsgKG10dSkgXAotCQkJCSsgMSBcCi0JCQkJKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKSkKLQotI2RlZmluZSBNSU5fRlJBTUVECUZSQU1FRF9TSVpFKDApCi0KLQotLyoKLSAqIFplcm8gbWVhbnMgbm8gdGltZW91dDsgZWxzZSwgaG93IGxvbmcgYSA2NCBieXRlIGJ1bGsgcGFja2V0IG1heSBiZSBxdWV1ZWQKLSAqIGJlZm9yZSB0aGUgaGFyZHdhcmUgZHJvcHMgaXQuICBJZiB0aGF0J3MgZG9uZSwgdGhlIGRyaXZlciB3aWxsIG5lZWQgdG8KLSAqIGZyYW1lIG5ldHdvcmsgcGFja2V0cyB0byBndWFyZCBhZ2FpbnN0IHRoZSBkcm9wcGVkIFVTQiBwYWNrZXRzLiAgVGhlIHdpbjMyCi0gKiBkcml2ZXIgc2V0cyB0aGlzIGZvciBib3RoIHNpZGVzIG9mIHRoZSBsaW5rLgotICovCi0jZGVmaW5lCU5DX1JFQURfVFRMX01TCSgodTgpMjU1KQkvLyBtcwotCi0vKgotICogV2UgaWdub3JlIG1vc3QgcmVnaXN0ZXJzIGFuZCBFRVBST00gY29udGVudHMuCi0gKi8KLSNkZWZpbmUJUkVHX1VTQkNUTAkoKHU4KTB4MDQpCi0jZGVmaW5lIFJFR19UVEwJCSgodTgpMHgxMCkKLSNkZWZpbmUgUkVHX1NUQVRVUwkoKHU4KTB4MTEpCi0KLS8qCi0gKiBWZW5kb3Igc3BlY2lmaWMgcmVxdWVzdHMgdG8gcmVhZC93cml0ZSBkYXRhCi0gKi8KLSNkZWZpbmUJUkVRVUVTVF9SRUdJU1RFUgkoKHU4KTB4MTApCi0jZGVmaW5lCVJFUVVFU1RfRUVQUk9NCQkoKHU4KTB4MTEpCi0KLXN0YXRpYyBpbnQKLW5jX3ZlbmRvcl9yZWFkIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggcmVnbnVtLCB1MTYgKnJldHZhbF9wdHIpCi17Ci0JaW50IHN0YXR1cyA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LAotCQl1c2JfcmN2Y3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCXJlcSwKLQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCTAsIHJlZ251bSwKLQkJcmV0dmFsX3B0ciwgc2l6ZW9mICpyZXR2YWxfcHRyLAotCQlDT05UUk9MX1RJTUVPVVRfTVMpOwotCWlmIChzdGF0dXMgPiAwKQotCQlzdGF0dXMgPSAwOwotCWlmICghc3RhdHVzKQotCQlsZTE2X3RvX2NwdXMgKHJldHZhbF9wdHIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uY19yZWdpc3Rlcl9yZWFkIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlZ251bSwgdTE2ICpyZXR2YWxfcHRyKQotewotCXJldHVybiBuY192ZW5kb3JfcmVhZCAoZGV2LCBSRVFVRVNUX1JFR0lTVEVSLCByZWdudW0sIHJldHZhbF9wdHIpOwotfQotCi0vLyBubyByZXR2YWwgLi4uIGNhbiBiZWNvbWUgYXN5bmMsIHVzYWJsZSBpbl9pbnRlcnJ1cHQoKQotc3RhdGljIHZvaWQKLW5jX3ZlbmRvcl93cml0ZSAoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCByZXEsIHU4IHJlZ251bSwgdTE2IHZhbHVlKQotewotCXVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LAotCQl1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCXJlcSwKLQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotCQl2YWx1ZSwgcmVnbnVtLAotCQlOVUxMLCAwLAkJCS8vIGRhdGEgaXMgaW4gc2V0dXAgcGFja2V0Ci0JCUNPTlRST0xfVElNRU9VVF9NUyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbmNfcmVnaXN0ZXJfd3JpdGUgKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggcmVnbnVtLCB1MTYgdmFsdWUpCi17Ci0JbmNfdmVuZG9yX3dyaXRlIChkZXYsIFJFUVVFU1RfUkVHSVNURVIsIHJlZ251bSwgdmFsdWUpOwotfQotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZCBuY19kdW1wX3JlZ2lzdGVycyAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCXU4CXJlZzsKLQl1MTYJKnZwID0ga21hbGxvYyAoc2l6ZW9mICh1MTYpKTsKLQotCWlmICghdnApIHsKLQkJZGJnICgibm8gbWVtb3J5PyIpOwotCQlyZXR1cm47Ci0JfQotCi0JZGJnICgiJXMgcmVnaXN0ZXJzOiIsIGRldi0+bmV0LT5uYW1lKTsKLQlmb3IgKHJlZyA9IDA7IHJlZyA8IDB4MjA7IHJlZysrKSB7Ci0JCWludCByZXR2YWw7Ci0KLQkJLy8gcmVhZGluZyBzb21lIHJlZ2lzdGVycyBpcyB0cm91YmxlCi0JCWlmIChyZWcgPj0gMHgwOCAmJiByZWcgPD0gMHhmKQotCQkJY29udGludWU7Ci0JCWlmIChyZWcgPj0gMHgxMiAmJiByZWcgPD0gMHgxZSkKLQkJCWNvbnRpbnVlOwotCi0JCXJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgcmVnLCB2cCk7Ci0JCWlmIChyZXR2YWwgPCAwKQotCQkJZGJnICgiJXMgcmVnIFsweCV4XSA9PT4gZXJyb3IgJWQiLAotCQkJCWRldi0+bmV0LT5uYW1lLCByZWcsIHJldHZhbCk7Ci0JCWVsc2UKLQkJCWRiZyAoIiVzIHJlZyBbMHgleF0gPSAweCV4IiwKLQkJCQlkZXYtPm5ldC0+bmFtZSwgcmVnLCAqdnApOwotCX0KLQlrZnJlZSAodnApOwotfQotI2VuZGlmCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIENvbnRyb2wgcmVnaXN0ZXIKLSAqLwotCi0jZGVmaW5lCVVTQkNUTF9XUklUQUJMRV9NQVNLCTB4MWYwZgotLy8gYml0cyAxNS0xMyByZXNlcnZlZCwgci9vCi0jZGVmaW5lCVVTQkNUTF9FTkFCTEVfTEFORwkoMSA8PCAxMikKLSNkZWZpbmUJVVNCQ1RMX0VOQUJMRV9NRkdSCSgxIDw8IDExKQotI2RlZmluZQlVU0JDVExfRU5BQkxFX1BST0QJKDEgPDwgMTApCi0jZGVmaW5lCVVTQkNUTF9FTkFCTEVfU0VSSUFMCSgxIDw8IDkpCi0jZGVmaW5lCVVTQkNUTF9FTkFCTEVfREVGQVVMVFMJKDEgPDwgOCkKLS8vIGJpdHMgNy00IHJlc2VydmVkLCByL28KLSNkZWZpbmUJVVNCQ1RMX0ZMVVNIX09USEVSCSgxIDw8IDMpCi0jZGVmaW5lCVVTQkNUTF9GTFVTSF9USElTCSgxIDw8IDIpCi0jZGVmaW5lCVVTQkNUTF9ESVNDT05OX09USEVSCSgxIDw8IDEpCi0jZGVmaW5lCVVTQkNUTF9ESVNDT05OX1RISVMJKDEgPDwgMCkKLQotc3RhdGljIGlubGluZSB2b2lkIG5jX2R1bXBfdXNiY3RsIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB1c2JjdGwpCi17Ci0JaWYgKCFuZXRpZl9tc2dfbGluayAoZGV2KSkKLQkJcmV0dXJuOwotCWRldmRiZyAoZGV2LCAibmV0MTA4MCAlcy0lcyB1c2JjdGwgMHgleDolcyVzJXMlcyVzOyIKLQkJCSIgdGhpcyVzJXM7IgotCQkJIiBvdGhlciVzJXM7IHIvbyAweCV4IiwKLQkJZGV2LT51ZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPnVkZXYtPmRldnBhdGgsCi0JCXVzYmN0bCwKLQkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfTEFORykgPyAiIGxhbmciIDogIiIsCi0JCSh1c2JjdGwgJiBVU0JDVExfRU5BQkxFX01GR1IpID8gIiBtZmdyIiA6ICIiLAotCQkodXNiY3RsICYgVVNCQ1RMX0VOQUJMRV9QUk9EKSA/ICIgcHJvZCIgOiAiIiwKLQkJKHVzYmN0bCAmIFVTQkNUTF9FTkFCTEVfU0VSSUFMKSA/ICIgc2VyaWFsIiA6ICIiLAotCQkodXNiY3RsICYgVVNCQ1RMX0VOQUJMRV9ERUZBVUxUUykgPyAiIGRlZmF1bHRzIiA6ICIiLAotCi0JCSh1c2JjdGwgJiBVU0JDVExfRkxVU0hfT1RIRVIpID8gIiBGTFVTSCIgOiAiIiwKLQkJKHVzYmN0bCAmIFVTQkNUTF9ESVNDT05OX09USEVSKSA/ICIgRElTIiA6ICIiLAotCQkodXNiY3RsICYgVVNCQ1RMX0ZMVVNIX1RISVMpID8gIiBGTFVTSCIgOiAiIiwKLQkJKHVzYmN0bCAmIFVTQkNUTF9ESVNDT05OX1RISVMpID8gIiBESVMiIDogIiIsCi0JCXVzYmN0bCAmIH5VU0JDVExfV1JJVEFCTEVfTUFTSwotCQkpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogU3RhdHVzIHJlZ2lzdGVyCi0gKi8KLQotI2RlZmluZQlTVEFUVVNfUE9SVF9BCQkoMSA8PCAxNSkKLQotI2RlZmluZQlTVEFUVVNfQ09OTl9PVEhFUgkoMSA8PCAxNCkKLSNkZWZpbmUJU1RBVFVTX1NVU1BFTkRfT1RIRVIJKDEgPDwgMTMpCi0jZGVmaW5lCVNUQVRVU19NQUlMQk9YX09USEVSCSgxIDw8IDEyKQotI2RlZmluZQlTVEFUVVNfUEFDS0VUU19PVEhFUihuKQkoKChuKSA+PiA4KSAmJiAweDAzKQotCi0jZGVmaW5lCVNUQVRVU19DT05OX1RISVMJKDEgPDwgNikKLSNkZWZpbmUJU1RBVFVTX1NVU1BFTkRfVEhJUwkoMSA8PCA1KQotI2RlZmluZQlTVEFUVVNfTUFJTEJPWF9USElTCSgxIDw8IDQpCi0jZGVmaW5lCVNUQVRVU19QQUNLRVRTX1RISVMobikJKCgobikgPj4gMCkgJiYgMHgwMykKLQotI2RlZmluZQlTVEFUVVNfVU5TUEVDX01BU0sJMHgwYzhjCi0jZGVmaW5lCVNUQVRVU19OT0lTRV9NQVNLIAkoKHUxNil+KDB4MDMwM3xTVEFUVVNfVU5TUEVDX01BU0spKQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuY19kdW1wX3N0YXR1cyAoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgc3RhdHVzKQotewotCWlmICghbmV0aWZfbXNnX2xpbmsgKGRldikpCi0JCXJldHVybjsKLQlkZXZkYmcgKGRldiwgIm5ldDEwODAgJXMtJXMgc3RhdHVzIDB4JXg6IgotCQkJIiB0aGlzICglYykgUEtUPSVkJXMlcyVzOyIKLQkJCSIgb3RoZXIgUEtUPSVkJXMlcyVzOyB1bnNwZWMgMHgleCIsCi0JCWRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT51ZGV2LT5kZXZwYXRoLAotCQlzdGF0dXMsCi0KLQkJLy8gWFhYIHRoZSBwYWNrZXQgY291bnRzIGRvbid0IHNlZW0gcmlnaHQKLQkJLy8gKDEgYXQgcmVzZXQsIG5vdCAwKTsgbWF5YmUgVU5TUEVDIHRvbwotCi0JCShzdGF0dXMgJiBTVEFUVVNfUE9SVF9BKSA/ICdBJyA6ICdCJywKLQkJU1RBVFVTX1BBQ0tFVFNfVEhJUyAoc3RhdHVzKSwKLQkJKHN0YXR1cyAmIFNUQVRVU19DT05OX1RISVMpID8gIiBDT04iIDogIiIsCi0JCShzdGF0dXMgJiBTVEFUVVNfU1VTUEVORF9USElTKSA/ICIgU1VTIiA6ICIiLAotCQkoc3RhdHVzICYgU1RBVFVTX01BSUxCT1hfVEhJUykgPyAiIE1CT1giIDogIiIsCi0KLQkJU1RBVFVTX1BBQ0tFVFNfT1RIRVIgKHN0YXR1cyksCi0JCShzdGF0dXMgJiBTVEFUVVNfQ09OTl9PVEhFUikgPyAiIENPTiIgOiAiIiwKLQkJKHN0YXR1cyAmIFNUQVRVU19TVVNQRU5EX09USEVSKSA/ICIgU1VTIiA6ICIiLAotCQkoc3RhdHVzICYgU1RBVFVTX01BSUxCT1hfT1RIRVIpID8gIiBNQk9YIiA6ICIiLAotCi0JCXN0YXR1cyAmIFNUQVRVU19VTlNQRUNfTUFTSwotCQkpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogVFRMIHJlZ2lzdGVyCi0gKi8KLQotI2RlZmluZQlUVExfVEhJUyh0dGwpCSgweDAwZmYgJiB0dGwpCi0jZGVmaW5lCVRUTF9PVEhFUih0dGwpCSgweDAwZmYgJiAodHRsID4+IDgpKQotI2RlZmluZSBNS19UVEwodGhpcyxvdGhlcikJKCh1MTYpKCgob3RoZXIpPDw4KXwoMHgwMGZmJih0aGlzKSkpKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmNfZHVtcF90dGwgKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHR0bCkKLXsKLQlpZiAobmV0aWZfbXNnX2xpbmsgKGRldikpCi0JCWRldmRiZyAoZGV2LCAibmV0MTA4MCAlcy0lcyB0dGwgMHgleCB0aGlzID0gJWQsIG90aGVyID0gJWQiLAotCQkJZGV2LT51ZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPnVkZXYtPmRldnBhdGgsCi0JCQl0dGwsIFRUTF9USElTICh0dGwpLCBUVExfT1RIRVIgKHR0bCkpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IG5ldDEwODBfcmVzZXQgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQl1MTYJCXVzYmN0bCwgc3RhdHVzLCB0dGw7Ci0JdTE2CQkqdnAgPSBrbWFsbG9jIChzaXplb2YgKHUxNiksIEdGUF9LRVJORUwpOwotCWludAkJcmV0dmFsOwotCi0JaWYgKCF2cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvLyBuY19kdW1wX3JlZ2lzdGVycyAoZGV2KTsKLQotCWlmICgocmV0dmFsID0gbmNfcmVnaXN0ZXJfcmVhZCAoZGV2LCBSRUdfU1RBVFVTLCB2cCkpIDwgMCkgewotCQlkYmcgKCJjYW4ndCByZWFkICVzLSVzIHN0YXR1czogJWQiLAotCQkJZGV2LT51ZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPnVkZXYtPmRldnBhdGgsIHJldHZhbCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jc3RhdHVzID0gKnZwOwotCW5jX2R1bXBfc3RhdHVzIChkZXYsIHN0YXR1cyk7Ci0KLQlpZiAoKHJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgUkVHX1VTQkNUTCwgdnApKSA8IDApIHsKLQkJZGJnICgiY2FuJ3QgcmVhZCBVU0JDVEwsICVkIiwgcmV0dmFsKTsKLQkJZ290byBkb25lOwotCX0KLQl1c2JjdGwgPSAqdnA7Ci0JbmNfZHVtcF91c2JjdGwgKGRldiwgdXNiY3RsKTsKLQotCW5jX3JlZ2lzdGVyX3dyaXRlIChkZXYsIFJFR19VU0JDVEwsCi0JCQlVU0JDVExfRkxVU0hfVEhJUyB8IFVTQkNUTF9GTFVTSF9PVEhFUik7Ci0KLQlpZiAoKHJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgUkVHX1RUTCwgdnApKSA8IDApIHsKLQkJZGJnICgiY2FuJ3QgcmVhZCBUVEwsICVkIiwgcmV0dmFsKTsKLQkJZ290byBkb25lOwotCX0KLQl0dGwgPSAqdnA7Ci0JLy8gbmNfZHVtcF90dGwgKGRldiwgdHRsKTsKLQotCW5jX3JlZ2lzdGVyX3dyaXRlIChkZXYsIFJFR19UVEwsCi0JCQlNS19UVEwgKE5DX1JFQURfVFRMX01TLCBUVExfT1RIRVIgKHR0bCkpICk7Ci0JZGJnICgiJXM6IGFzc2lnbmVkIFRUTCwgJWQgbXMiLCBkZXYtPm5ldC0+bmFtZSwgTkNfUkVBRF9UVExfTVMpOwotCi0JaWYgKG5ldGlmX21zZ19saW5rIChkZXYpKQotCQlkZXZpbmZvIChkZXYsICJwb3J0ICVjLCBwZWVyICVzY29ubmVjdGVkIiwKLQkJCShzdGF0dXMgJiBTVEFUVVNfUE9SVF9BKSA/ICdBJyA6ICdCJywKLQkJCShzdGF0dXMgJiBTVEFUVVNfQ09OTl9PVEhFUikgPyAiIiA6ICJkaXMiCi0JCQkpOwotCXJldHZhbCA9IDA7Ci0KLWRvbmU6Ci0Ja2ZyZWUgKHZwKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IG5ldDEwODBfY2hlY2tfY29ubmVjdCAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCWludAkJCXJldHZhbDsKLQl1MTYJCQlzdGF0dXM7Ci0JdTE2CQkJKnZwID0ga21hbGxvYyAoc2l6ZW9mICh1MTYpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghdnApCi0JCXJldHVybiAtRU5PTUVNOwotCXJldHZhbCA9IG5jX3JlZ2lzdGVyX3JlYWQgKGRldiwgUkVHX1NUQVRVUywgdnApOwotCXN0YXR1cyA9ICp2cDsKLQlrZnJlZSAodnApOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlkYmcgKCIlcyBuZXQxMDgwX2NoZWNrX2Nvbm4gcmVhZCAtICVkIiwgZGV2LT5uZXQtPm5hbWUsIHJldHZhbCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCWlmICgoc3RhdHVzICYgU1RBVFVTX0NPTk5fT1RIRVIpICE9IFNUQVRVU19DT05OX09USEVSKQotCQlyZXR1cm4gLUVOT0xJTks7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG5jX2ZsdXNoX2NvbXBsZXRlIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWtmcmVlICh1cmItPmNvbnRleHQpOwotCXVzYl9mcmVlX3VyYih1cmIpOwotfQotCi1zdGF0aWMgdm9pZCBuY19lbnN1cmVfc3luYyAoc3RydWN0IHVzYm5ldCAqZGV2KQotewotCWRldi0+ZnJhbWVfZXJyb3JzKys7Ci0JaWYgKGRldi0+ZnJhbWVfZXJyb3JzID4gNSkgewotCQlzdHJ1Y3QgdXJiCQkqdXJiOwotCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CSpyZXE7Ci0JCWludAkJCXN0YXR1czsKLQotCQkvKiBTZW5kIGEgZmx1c2ggKi8KLQkJdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgU0xBQl9BVE9NSUMpOwotCQlpZiAoIXVyYikKLQkJCXJldHVybjsKLQotCQlyZXEgPSBrbWFsbG9jIChzaXplb2YgKnJlcSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcmVxKSB7Ci0JCQl1c2JfZnJlZV91cmIgKHVyYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXEtPmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUCi0JCQl8IFVTQl9UWVBFX1ZFTkRPUgotCQkJfCBVU0JfUkVDSVBfREVWSUNFOwotCQlyZXEtPmJSZXF1ZXN0ID0gUkVRVUVTVF9SRUdJU1RFUjsKLQkJcmVxLT53VmFsdWUgPSBjcHVfdG9fbGUxNiAoVVNCQ1RMX0ZMVVNIX1RISVMKLQkJCQl8IFVTQkNUTF9GTFVTSF9PVEhFUik7Ci0JCXJlcS0+d0luZGV4ID0gY3B1X3RvX2xlMTYgKFJFR19VU0JDVEwpOwotCQlyZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNiAoMCk7Ci0KLQkJLyogcXVldWUgYW4gYXN5bmMgY29udHJvbCByZXF1ZXN0LCB3ZSBkb24ndCBuZWVkCi0JCSAqIHRvIGRvIGFueXRoaW5nIHdoZW4gaXQgZmluaXNoZXMgZXhjZXB0IGNsZWFuIHVwLgotCQkgKi8KLQkJdXNiX2ZpbGxfY29udHJvbF91cmIgKHVyYiwgZGV2LT51ZGV2LAotCQkJdXNiX3NuZGN0cmxwaXBlIChkZXYtPnVkZXYsIDApLAotCQkJKHVuc2lnbmVkIGNoYXIgKikgcmVxLAotCQkJTlVMTCwgMCwKLQkJCW5jX2ZsdXNoX2NvbXBsZXRlLCByZXEpOwotCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHN0YXR1cykgewotCQkJa2ZyZWUgKHJlcSk7Ci0JCQl1c2JfZnJlZV91cmIgKHVyYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKLQkJCWRldmRiZyAoZGV2LCAiZmx1c2ggbmV0MTA4MDsgdG9vIG1hbnkgZnJhbWluZyBlcnJvcnMiKTsKLQkJZGV2LT5mcmFtZV9lcnJvcnMgPSAwOwotCX0KLX0KLQotc3RhdGljIGludCBuZXQxMDgwX3J4X2ZpeHVwIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyOwotCXN0cnVjdCBuY190cmFpbGVyCSp0cmFpbGVyOwotCXUxNgkJCWhkcl9sZW4sIHBhY2tldF9sZW47Ci0KLQlpZiAoIShza2ItPmxlbiAmIDB4MDEpCi0JCQl8fCBNSU5fRlJBTUVEID4gc2tiLT5sZW4KLQkJCXx8IHNrYi0+bGVuID4gRlJBTUVEX1NJWkUgKGRldi0+bmV0LT5tdHUpKSB7Ci0JCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCWRiZyAoInJ4IGZyYW1lc2l6ZSAlZCByYW5nZSAlZC4uJWQgbXR1ICVkIiwgc2tiLT5sZW4sCi0JCQkoaW50KU1JTl9GUkFNRUQsIChpbnQpRlJBTUVEX1NJWkUgKGRldi0+bmV0LT5tdHUpLAotCQkJZGV2LT5uZXQtPm10dSk7Ci0JCW5jX2Vuc3VyZV9zeW5jIChkZXYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQloZWFkZXIgPSAoc3RydWN0IG5jX2hlYWRlciAqKSBza2ItPmRhdGE7Ci0JaGRyX2xlbiA9IGxlMTZfdG9fY3B1cCAoJmhlYWRlci0+aGRyX2xlbik7Ci0JcGFja2V0X2xlbiA9IGxlMTZfdG9fY3B1cCAoJmhlYWRlci0+cGFja2V0X2xlbik7Ci0JaWYgKEZSQU1FRF9TSVpFIChwYWNrZXRfbGVuKSA+IE1BWF9QQUNLRVQpIHsKLQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJZGJnICgicGFja2V0IHRvbyBiaWcsICVkIiwgcGFja2V0X2xlbik7Ci0JCW5jX2Vuc3VyZV9zeW5jIChkZXYpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGhkcl9sZW4gPCBNSU5fSEVBREVSKSB7Ci0JCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCWRiZyAoImhlYWRlciB0b28gc2hvcnQsICVkIiwgaGRyX2xlbik7Ci0JCW5jX2Vuc3VyZV9zeW5jIChkZXYpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGhkcl9sZW4gPiBNSU5fSEVBREVSKSB7Ci0JCS8vIG91dCBvZiBiYW5kIGRhdGEgZm9yIHVzPwotCQlkYmcgKCJoZWFkZXIgT09CLCAlZCBieXRlcyIsIGhkcl9sZW4gLSBNSU5fSEVBREVSKTsKLQkJbmNfZW5zdXJlX3N5bmMgKGRldik7Ci0JCS8vIHN3aXRjaCAodmVuZG9yL3Byb2R1Y3QgaWRzKSB7IC4uLiB9Ci0JfQotCXNrYl9wdWxsIChza2IsIGhkcl9sZW4pOwotCi0JdHJhaWxlciA9IChzdHJ1Y3QgbmNfdHJhaWxlciAqKQotCQkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSBzaXplb2YgKnRyYWlsZXIpOwotCXNrYl90cmltIChza2IsIHNrYi0+bGVuIC0gc2l6ZW9mICp0cmFpbGVyKTsKLQotCWlmICgocGFja2V0X2xlbiAmIDB4MDEpID09IDApIHsKLQkJaWYgKHNrYi0+ZGF0YSBbcGFja2V0X2xlbl0gIT0gUEFEX0JZVEUpIHsKLQkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQlkYmcgKCJiYWQgcGFkIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlza2JfdHJpbSAoc2tiLCBza2ItPmxlbiAtIDEpOwotCX0KLQlpZiAoc2tiLT5sZW4gIT0gcGFja2V0X2xlbikgewotCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCQlkYmcgKCJiYWQgcGFja2V0IGxlbiAlZCAoZXhwZWN0ZWQgJWQpIiwKLQkJCXNrYi0+bGVuLCBwYWNrZXRfbGVuKTsKLQkJbmNfZW5zdXJlX3N5bmMgKGRldik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoaGVhZGVyLT5wYWNrZXRfaWQgIT0gZ2V0X3VuYWxpZ25lZCAoJnRyYWlsZXItPnBhY2tldF9pZCkpIHsKLQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwotCQlkYmcgKCIoMisgZHJvcHBlZCkgcnggcGFja2V0X2lkIG1pc21hdGNoIDB4JXggMHgleCIsCi0JCQlsZTE2X3RvX2NwdSAoaGVhZGVyLT5wYWNrZXRfaWQpLAotCQkJbGUxNl90b19jcHUgKHRyYWlsZXItPnBhY2tldF9pZCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0jaWYgMAotCWRldmRiZyAoZGV2LCAiZnJhbWUgPHJ4IGggJWQgcCAlZCBpZCAlZCIsIGhlYWRlci0+aGRyX2xlbiwKLQkJaGVhZGVyLT5wYWNrZXRfbGVuLCBoZWFkZXItPnBhY2tldF9pZCk7Ci0jZW5kaWYKLQlkZXYtPmZyYW1lX2Vycm9ycyA9IDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1uZXQxMDgwX3R4X2ZpeHVwIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGludCBmbGFncykKLXsKLQlpbnQJCQlwYWRsZW47Ci0Jc3RydWN0IHNrX2J1ZmYJCSpza2IyOwotCi0JcGFkbGVuID0gKChza2ItPmxlbiArIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikKLQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikpICYgMHgwMSkgPyAwIDogMTsKLQlpZiAoIXNrYl9jbG9uZWQgKHNrYikpIHsKLQkJaW50CWhlYWRyb29tID0gc2tiX2hlYWRyb29tIChza2IpOwotCQlpbnQJdGFpbHJvb20gPSBza2JfdGFpbHJvb20gKHNrYik7Ci0KLQkJaWYgKChwYWRsZW4gKyBzaXplb2YgKHN0cnVjdCBuY190cmFpbGVyKSkgPD0gdGFpbHJvb20KLQkJCSAgICAmJiBzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpIDw9IGhlYWRyb29tKQotCQkJLyogVGhlcmUncyBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tICovCi0JCQlyZXR1cm4gc2tiOwotCi0JCWlmICgoc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSArIHBhZGxlbgotCQkJCQkrIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKSA8Ci0JCQkJKGhlYWRyb29tICsgdGFpbHJvb20pKSB7Ci0JCQkvKiBUaGVyZSdzIGVub3VnaCB0b3RhbCByb29tLCBzbyBqdXN0IHJlYWRqdXN0ICovCi0JCQlza2ItPmRhdGEgPSBtZW1tb3ZlIChza2ItPmhlYWQKLQkJCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSwKLQkJCQkJICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47Ci0JCQlyZXR1cm4gc2tiOwotCQl9Ci0JfQotCi0JLyogQ3JlYXRlIGEgbmV3IHNrYiB0byB1c2Ugd2l0aCB0aGUgY29ycmVjdCBzaXplICovCi0Jc2tiMiA9IHNrYl9jb3B5X2V4cGFuZCAoc2tiLAotCQkJCXNpemVvZiAoc3RydWN0IG5jX2hlYWRlciksCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikgKyBwYWRsZW4sCi0JCQkJZmxhZ3MpOwotCWRldl9rZnJlZV9za2JfYW55IChza2IpOwotCXJldHVybiBza2IyOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCW5ldDEwODBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiTmV0Q2hpcCBUdXJib0NPTk5FQ1QiLAotCS5mbGFncyA9CUZMQUdfRlJBTUlOR19OQywKLQkucmVzZXQgPQluZXQxMDgwX3Jlc2V0LAotCS5jaGVja19jb25uZWN0ID1uZXQxMDgwX2NoZWNrX2Nvbm5lY3QsCi0JLnJ4X2ZpeHVwID0JbmV0MTA4MF9yeF9maXh1cCwKLQkudHhfZml4dXAgPQluZXQxMDgwX3R4X2ZpeHVwLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19VU0JfTkVUMTA4MCAqLwotCi0KLQwKLSNpZmRlZiBDT05GSUdfVVNCX1BMMjMwMQotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFByb2xpZmljIFBMLTIzMDEvUEwtMjMwMiBkcml2ZXIgLi4uIGh0dHA6Ly93d3cucHJvbGlmaWN0ZWNoLmNvbQotICoKLSAqIFRoZSBwcm90b2NvbCBhbmQgaGFuZHNoYWtpbmcgdXNlZCBoZXJlIHNob3VsZCBiZSBidWctY29tcGF0aWJsZQotICogd2l0aCB0aGUgTGludXggMi4yICJwbHVzYiIgZHJpdmVyLCBieSBEZXRpIEZsaWVnbC4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogQml0cyAwLTQgY2FuIGJlIHVzZWQgZm9yIHNvZnR3YXJlIGhhbmRzaGFraW5nOyB0aGV5J3JlIHNldCBmcm9tCi0gKiBvbmUgZW5kLCBjbGVhcmVkIGZyb20gdGhlIG90aGVyLCAicmVhZCIgd2l0aCB0aGUgaW50ZXJydXB0IGJ5dGUuCi0gKi8KLSNkZWZpbmUJUExfU19FTgkJKDE8PDcpCQkvKiAoZmVhdHVyZSBvbmx5KSBzdXNwZW5kIGVuYWJsZSAqLwotLyogcmVzZXJ2ZWQgYml0IC0tIHJ4IHJlYWR5ICg2KSA/ICovCi0jZGVmaW5lCVBMX1RYX1JFQURZCSgxPDw1KQkJLyogKGludGVycnVwdCBvbmx5KSB0cmFuc21pdCByZWFkeSAqLwotI2RlZmluZQlQTF9SRVNFVF9PVVQJKDE8PDQpCQkvKiByZXNldCBvdXRwdXQgcGlwZSAqLwotI2RlZmluZQlQTF9SRVNFVF9JTgkoMTw8MykJCS8qIHJlc2V0IGlucHV0IHBpcGUgKi8KLSNkZWZpbmUJUExfVFhfQwkJKDE8PDIpCQkvKiB0cmFuc21pc3Npb24gY29tcGxldGUgKi8KLSNkZWZpbmUJUExfVFhfUkVRCSgxPDwxKQkJLyogdHJhbnNtaXNzaW9uIHJlY2VpdmVkICovCi0jZGVmaW5lCVBMX1BFRVJfRQkoMTw8MCkJCS8qIHBlZXIgZXhpc3RzICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wbF92ZW5kb3JfcmVxIChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IHJlcSwgdTggdmFsLCB1OCBpbmRleCkKLXsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsCi0JCXVzYl9yY3ZjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJcmVxLAotCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJdmFsLCBpbmRleCwKLQkJTlVMTCwgMCwKLQkJQ09OVFJPTF9USU1FT1VUX01TKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXBsX2NsZWFyX1F1aWNrTGlua19mZWF0dXJlcyAoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgdmFsKQotewotCXJldHVybiBwbF92ZW5kb3JfcmVxIChkZXYsIDEsICh1OCkgdmFsLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXBsX3NldF9RdWlja0xpbmtfZmVhdHVyZXMgKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IHZhbCkKLXsKLQlyZXR1cm4gcGxfdmVuZG9yX3JlcSAoZGV2LCAzLCAodTgpIHZhbCwgMCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcGxfcmVzZXQgKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQkvKiBzb21lIHVuaXRzIHNlZW0gdG8gbmVlZCB0aGlzIHJlc2V0LCBvdGhlcnMgcmVqZWN0IGl0IHV0dGVybHkuCi0JICogRklYTUUgYmUgbW9yZSBsaWtlICJuYXBsaW5rIiBvciB3aW5kb3dzIGRyaXZlcnMuCi0JICovCi0JKHZvaWQpIHBsX3NldF9RdWlja0xpbmtfZmVhdHVyZXMgKGRldiwKLQkJUExfU19FTnxQTF9SRVNFVF9PVVR8UExfUkVTRVRfSU58UExfUEVFUl9FKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlwcm9saWZpY19pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJQcm9saWZpYyBQTC0yMzAxL1BMLTIzMDIiLAotCS5mbGFncyA9CUZMQUdfTk9fU0VUSU5ULAotCQkvKiBzb21lIFBMLTIzMDIgdmVyc2lvbnMgc2VlbSB0byBmYWlsIHVzYl9zZXRfaW50ZXJmYWNlKCkgKi8KLQkucmVzZXQgPQlwbF9yZXNldCwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfVVNCX1BMMjMwMSAqLwotCi0MCi0jaWZkZWYgQ09ORklHX1VTQl9LQzIxOTAKLSNkZWZpbmUgSEFWRV9IQVJEV0FSRQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBrYzIxOTBfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPSAgIktDIFRlY2hub2xvZ3kgS0MtMTkwIiwKLX07Ci0jZW5kaWYgLyogQ09ORklHX1VTQl9LQzIxOTAgKi8KLQotDAotI2lmZGVmCUNPTkZJR19VU0JfQVJNTElOVVgKLSNkZWZpbmUJSEFWRV9IQVJEV0FSRQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBJbnRlbCdzIFNBLTExMDAgY2hpcCBpbnRlZ3JhdGVzIGJhc2ljIFVTQiBzdXBwb3J0LCBhbmQgaXMgdXNlZAotICogaW4gUERBcyBsaWtlIHNvbWUgaVBhcXMsIHRoZSBZb3B5LCBzb21lIFphdXJ1cyBtb2RlbHMsIGFuZCBtb3JlLgotICogV2hlbiB0aGV5IHJ1biBMaW51eCwgYXJjaC9hcm0vbWFjaC1zYTExMDAvdXNiLWV0aC5jIG1heSBiZSB1c2VkIHRvCi0gKiBuZXR3b3JrIHVzaW5nIG1pbmltYWwgVVNCIGZyYW1pbmcgZGF0YS4KLSAqCi0gKiBUaGlzIGRlc2NyaWJlcyB0aGUgZHJpdmVyIGN1cnJlbnRseSBpbiBzdGFuZGFyZCBBUk0gTGludXgga2VybmVscy4KLSAqIFRoZSBaYXVydXMgdXNlcyBhIGRpZmZlcmVudCBkcml2ZXIgKHNlZSBsYXRlcikuCi0gKgotICogUFhBMjV4IGFuZCBQWEEyMTAgdXNlIFhTY2FsZSBjb3JlcyAoQVJNIHY1VEUpIHdpdGggYmV0dGVyIFVTQiBzdXBwb3J0Ci0gKiBhbmQgZGlmZmVyZW50IFVTQiBlbmRwb2ludCBudW1iZXJpbmcgdGhhbiB0aGUgU0ExMTAwIGRldmljZXMuICBUaGUKLSAqIG1hY2gtcHhhL3VzYi1ldGguYyBkcml2ZXIgcmUtdXNlcyB0aGUgZGV2aWNlIGlkcyBmcm9tIG1hY2gtc2ExMTAwCi0gKiBzbyB3ZSByZWx5IG9uIHRoZSBlbmRwb2ludCBkZXNjcmlwdG9ycy4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWxpbnV4ZGV2X2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIkxpbnV4IERldmljZSIsCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwl5b3B5X2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIllvcHkiLAotCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYmxvYl9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJCb290IExvYWRlciBPQmplY3QiLAotCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKLX07Ci0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX0FSTUxJTlVYICovCi0KLQwKLSNpZmRlZiBDT05GSUdfVVNCX1pBVVJVUwotI2RlZmluZQlIQVZFX0hBUkRXQVJFCi0KLSNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBaYXVydXMgaXMgYWxzbyBhIFNBLTExMTAgYmFzZWQgUERBLCBidXQgb25lIHVzaW5nIGEgZGlmZmVyZW50IGRyaXZlcgotICogKGFuZCBmcmFtaW5nKSBmb3IgaXRzIFVTQiBzbGF2ZS9nYWRnZXQgY29udHJvbGxlciB0aGFuIHRoZSBjYXNlIGFib3ZlLgotICoKLSAqIEZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoYXQgZHJpdmVyLCB0aGUgbWFpbiB3YXkgdGhhdCBmcmFtaW5nIGlzCi0gKiBub25zdGFuZGFyZCAoYWxzbyBmcm9tIHBlcnNwZWN0aXZlIG9mIHRoZSBDREMgZXRoZXJuZXQgbW9kZWwhKSBpcyBhCi0gKiBjcmMzMiwgYWRkZWQgdG8gaGVscCBkZXRlY3Qgd2hlbiBzb21lIHNhMTEwMCB1c2ItdG8tbWVtb3J5IERNQSBlcnJhdGEKLSAqIGhhdmVuJ3QgYmVlbiBmdWxseSB3b3JrZWQgYXJvdW5kLiAgQWxzbywgYWxsIFphdXJpaSB1c2UgdGhlIHNhbWUKLSAqIGRlZmF1bHQgRXRoZXJuZXQgYWRkcmVzcy4KLSAqCi0gKiBQWEEgYmFzZWQgbW9kZWxzIHVzZSB0aGUgc2FtZSBmcmFtaW5nLCBhbmQgYWxzbyBjYW4ndCBpbXBsZW1lbnQKLSAqIHNldF9pbnRlcmZhY2UgcHJvcGVybHkuCi0gKgotICogQWxsIGtub3duIFphdXJpaSBsaWUgYWJvdXQgdGhlaXIgc3RhbmRhcmRzIGNvbmZvcm1hbmNlLiAgTW9zdCBsaWUgYnkKLSAqIHNheWluZyB0aGV5IHN1cHBvcnQgQ0RDIEV0aGVybmV0LiAgU29tZSBsaWUgYW5kIHNheSB0aGV5IHN1cHBvcnQgQ0RDCi0gKiBNRExNIChhcyBpZiBmb3IgYWNjZXNzIHRvIGNlbGwgcGhvbmUgbW9kZW1zKS4gIFNvbWVvbmUsIHBsZWFzZSBiZWF0IAotICogb24gU2hhcnAgKGFuZCBvdGhlciBzdWNoIHZlbmRvcnMpIGZvciBhIHdoaWxlIHdpdGggYSBjbHVlc3RpY2suCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHN0cnVjdCBza19idWZmICoKLXphdXJ1c190eF9maXh1cCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZmxhZ3MpCi17Ci0JaW50CQkJcGFkbGVuOwotCXN0cnVjdCBza19idWZmCQkqc2tiMjsKLQotCXBhZGxlbiA9IDI7Ci0JaWYgKCFza2JfY2xvbmVkIChza2IpKSB7Ci0JCWludAl0YWlscm9vbSA9IHNrYl90YWlscm9vbSAoc2tiKTsKLQkJaWYgKChwYWRsZW4gKyA0KSA8PSB0YWlscm9vbSkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0Jc2tiMiA9IHNrYl9jb3B5X2V4cGFuZCAoc2tiLCAwLCA0ICsgcGFkbGVuLCBmbGFncyk7Ci0JZGV2X2tmcmVlX3NrYl9hbnkgKHNrYik7Ci0Jc2tiID0gc2tiMjsKLQlpZiAoc2tiKSB7Ci0JCXUzMgkJZmNzOwotZG9uZToKLQkJZmNzID0gY3JjMzJfbGUgKH4wLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJZmNzID0gfmZjczsKLQotCQkqc2tiX3B1dCAoc2tiLCAxKSA9IGZjcyAgICAgICAmIDB4ZmY7Ci0JCSpza2JfcHV0IChza2IsIDEpID0gKGZjcz4+IDgpICYgMHhmZjsKLQkJKnNrYl9wdXQgKHNrYiwgMSkgPSAoZmNzPj4xNikgJiAweGZmOwotCQkqc2tiX3B1dCAoc2tiLCAxKSA9IChmY3M+PjI0KSAmIDB4ZmY7Ci0JfQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JemF1cnVzX3NsNXgwMF9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJTaGFycCBaYXVydXMgU0wtNXgwMCIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCS5iaW5kID0JCWdlbmVyaWNfY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLX07Ci0jZGVmaW5lCVpBVVJVU19TVFJPTkdBUk1fSU5GTwkoKHVuc2lnbmVkIGxvbmcpJnphdXJ1c19zbDV4MDBfaW5mbykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwl6YXVydXNfcHhhX2luZm8gPSB7Ci0JLmRlc2NyaXB0aW9uID0JIlNoYXJwIFphdXJ1cywgUFhBLTJ4eCBiYXNlZCIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCS5iaW5kID0JCWdlbmVyaWNfY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLX07Ci0jZGVmaW5lCVpBVVJVU19QWEFfSU5GTwkJKCh1bnNpZ25lZCBsb25nKSZ6YXVydXNfcHhhX2luZm8pCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8Jb2x5bXB1c19teGxfaW5mbyA9IHsKLQkuZGVzY3JpcHRpb24gPQkiT2x5bXB1cyBSMTAwMCIsCi0JLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCi0JLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAotCS5iaW5kID0JCWdlbmVyaWNfY2RjX2JpbmQsCi0JLnVuYmluZCA9CWNkY191bmJpbmQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLX07Ci0jZGVmaW5lCU9MWU1QVVNfTVhMX0lORk8JKCh1bnNpZ25lZCBsb25nKSZvbHltcHVzX214bF9pbmZvKQotCi0KLS8qIFNvbWUgbW9yZSByZWNlbnQgcHJvZHVjdHMgdXNpbmcgTGluZW8vQmVsY2FycmEgY29kZSB3aWxsIHdyb25nbHkgY2xhaW0KLSAqIENEQyBNRExNIGNvbmZvcm1hbmNlLiAgVGhleSBhcmVuJ3QgY29uZm9ybWFudDogIGRhdGEgZW5kcG9pbnRzIGxpdmUKLSAqIGluIHRoZSBjb250cm9sIGludGVyZmFjZSwgdGhlcmUncyBubyBkYXRhIGludGVyZmFjZSwgYW5kIGl0J3Mgbm90IHVzZWQKLSAqIHRvIHRhbGsgdG8gYSBjZWxsIHBob25lIHJhZGlvLiAgQnV0IGF0IGxlYXN0IHdlIGNhbiBkZXRlY3QgdGhlc2UgdHdvCi0gKiBwc2V1ZG8tY2xhc3NlcywgcmF0aGVyIHRoYW4gZ3Jvd2luZyB0aGlzIHByb2R1Y3QgbGlzdCB3aXRoIGVudHJpZXMgZm9yCi0gKiBlYWNoIG5ldyBub25jb25mb3JtYW50IHByb2R1Y3QgKHNpZ2gpLgotICovCi1zdGF0aWMgY29uc3QgdTggc2FmZV9ndWlkWzE2XSA9IHsKLQkweDVkLCAweDM0LCAweGNmLCAweDY2LCAweDExLCAweDE4LCAweDExLCAweGQ2LAotCTB4YTIsIDB4MWEsIDB4MDAsIDB4MDEsIDB4MDIsIDB4Y2EsIDB4OWEsIDB4N2YsCi19Owotc3RhdGljIGNvbnN0IHU4IGJsYW5fZ3VpZFsxNl0gPSB7Ci0JMHg3NCwgMHhmMCwgMHgzZCwgMHhiZCwgMHgxZSwgMHhjMSwgMHg0NCwgMHg3MCwKLQkweGEzLCAweDY3LCAweDcxLCAweDM0LCAweGM5LCAweGY1LCAweDU0LCAweDM3LAotfTsKLQotc3RhdGljIGludCBibGFuX21kbG1fYmluZCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQl1OAkJCQkqYnVmID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmV4dHJhOwotCWludAkJCQlsZW4gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmFsZW47Ci0Jc3RydWN0IHVzYl9jZGNfbWRsbV9kZXNjCSpkZXNjID0gTlVMTDsKLQlzdHJ1Y3QgdXNiX2NkY19tZGxtX2RldGFpbF9kZXNjCSpkZXRhaWwgPSBOVUxMOwotCi0Jd2hpbGUgKGxlbiA+IDMpIHsKLQkJaWYgKGJ1ZiBbMV0gIT0gVVNCX0RUX0NTX0lOVEVSRkFDRSkKLQkJCWdvdG8gbmV4dF9kZXNjOwotCi0JCS8qIHVzZSBiRGVzY3JpcHRvclN1YlR5cGUsIGFuZCBqdXN0IHZlcmlmeSB0aGF0IHdlIGdldCBhCi0JCSAqICJCTEFOIiAob3IgIlNBRkUiKSBkZXNjcmlwdG9yLgotCQkgKi8KLQkJc3dpdGNoIChidWYgWzJdKSB7Ci0JCWNhc2UgVVNCX0NEQ19NRExNX1RZUEU6Ci0JCQlpZiAoZGVzYykgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJleHRyYSBNRExNXG4iKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJZGVzYyA9ICh2b2lkICopIGJ1ZjsKLQkJCWlmIChkZXNjLT5iTGVuZ3RoICE9IHNpemVvZiAqZGVzYykgewotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJNRExNIGxlbiAldVxuIiwKLQkJCQkJZGVzYy0+Ykxlbmd0aCk7Ci0JCQkJZ290byBiYWRfZGVzYzsKLQkJCX0KLQkJCS8qIGV4cGVjdCBiY2RWZXJzaW9uIDEuMCwgaWdub3JlICovCi0JCQlpZiAobWVtY21wKCZkZXNjLT5iR1VJRCwgYmxhbl9ndWlkLCAxNikKLQkJCQkgICAgJiYgbWVtY21wKCZkZXNjLT5iR1VJRCwgc2FmZV9ndWlkLCAxNikgKSB7Ci0JCQkJLyogaGV5LCB0aGlzIG9uZSBtaWdodCBfcmVhbGx5XyBiZSBNRExNISAqLwotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJNRExNIGd1aWRcbiIpOwotCQkJCWdvdG8gYmFkX2Rlc2M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVU0JfQ0RDX01ETE1fREVUQUlMX1RZUEU6Ci0JCQlpZiAoZGV0YWlsKSB7Ci0JCQkJZGV2X2RiZyAoJmludGYtPmRldiwgImV4dHJhIE1ETE0gZGV0YWlsXG4iKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJZGV0YWlsID0gKHZvaWQgKikgYnVmOwotCQkJc3dpdGNoIChkZXRhaWwtPmJHdWlkRGVzY3JpcHRvclR5cGUpIHsKLQkJCWNhc2UgMDoJCQkvKiAiU0FGRSIgKi8KLQkJCQlpZiAoZGV0YWlsLT5iTGVuZ3RoICE9IChzaXplb2YgKmRldGFpbCArIDIpKQotCQkJCQlnb3RvIGJhZF9kZXRhaWw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6CQkJLyogIkJMQU4iICovCi0JCQkJaWYgKGRldGFpbC0+Ykxlbmd0aCAhPSAoc2l6ZW9mICpkZXRhaWwgKyAzKSkKLQkJCQkJZ290byBiYWRfZGV0YWlsOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlnb3RvIGJhZF9kZXRhaWw7Ci0JCQl9Ci0KLQkJCS8qIGFzc3VtaW5nIHdlIGVpdGhlciBub3RpY2VkIEJMQU4gYWxyZWFkeSwgb3Igd2lsbAotCQkJICogZmluZCBpdCBzb29uLCB0aGVyZSBhcmUgc29tZSBkYXRhIGJ5dGVzIGhlcmU6Ci0JCQkgKiAgLSBibU5ldHdvcmtDYXBhYmlsaXRpZXMgKHVudXNlZCkKLQkJCSAqICAtIGJtRGF0YUNhcGFiaWxpdGllcyAoYml0cywgc2VlIGJlbG93KQotCQkJICogIC0gYlBhZCAoaWdub3JlZCwgZm9yIFBBREFGVEVSIC0tIEJMQU4tb25seSkKLQkJCSAqIGJpdHMgYXJlOgotCQkJICogIC0gMHgwMSAtLSBaYXVydXMgZnJhbWluZyAoYWRkIENSQykKLQkJCSAqICAtIDB4MDIgLS0gUEFEQkVGT1JFIChDUkMgaW5jbHVkZXMgc29tZSBwYWRkaW5nKQotCQkJICogIC0gMHgwNCAtLSBQQURBRlRFUiAoc29tZSBwYWRkaW5nIGFmdGVyIENSQykKLQkJCSAqICAtIDB4MDggLS0gImZlcm1hdCIgcGFja2V0IG1hbmdsaW5nIChmb3IgaHcgYnVncykKLQkJCSAqIHRoZSBQQURCRUZPUkUgYXBwZWFycyBub3QgdG8gbWF0dGVyOyB3ZSBpbnRlcm9wCi0JCQkgKiB3aXRoIGRldmljZXMgdGhhdCB1c2UgaXQgYW5kIHRob3NlIHRoYXQgZG9uJ3QuCi0JCQkgKi8KLQkJCWlmICgoZGV0YWlsLT5iRGV0YWlsRGF0YVsxXSAmIH4wMikgIT0gMHgwMSkgewotCQkJCS8qIGJtRGF0YUNhcGFiaWxpdGVzID09IDAgd291bGQgYmUgZmluZSB0b28sCi0JCQkJICogYnV0IGZyYW1pbmcgaXMgbWluaWRyaXZlci1jb3VwbGVkIGZvciBub3cuCi0JCQkJICovCi1iYWRfZGV0YWlsOgotCQkJCWRldl9kYmcgKCZpbnRmLT5kZXYsCi0JCQkJCQkiYmFkIE1ETE0gZGV0YWlsLCAlZCAlZCAlZFxuIiwKLQkJCQkJCWRldGFpbC0+Ykxlbmd0aCwKLQkJCQkJCWRldGFpbC0+YkRldGFpbERhdGFbMF0sCi0JCQkJCQlkZXRhaWwtPmJEZXRhaWxEYXRhWzJdKTsKLQkJCQlnb3RvIGJhZF9kZXNjOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLW5leHRfZGVzYzoKLQkJbGVuIC09IGJ1ZiBbMF07CS8qIGJMZW5ndGggKi8KLQkJYnVmICs9IGJ1ZiBbMF07Ci0JfQotCi0JaWYgKCFkZXNjIHx8ICFkZXRhaWwpIHsKLQkJZGV2X2RiZyAoJmludGYtPmRldiwgIm1pc3NpbmcgY2RjIG1kbG0gJXMlc2Rlc2NyaXB0b3JcbiIsCi0JCQlkZXNjID8gIiIgOiAiZnVuYyAiLAotCQkJZGV0YWlsID8gIiIgOiAiZGV0YWlsICIpOwotCQlnb3RvIGJhZF9kZXNjOwotCX0KLQotCS8qIFRoZXJlJ3MgcHJvYmFibHkgYSBDREMgRXRoZXJuZXQgZGVzY3JpcHRvciB0aGVyZSwgYnV0IHdlIGNhbid0Ci0JICogcmVseSBvbiB0aGUgRXRoZXJuZXQgYWRkcmVzcyBpdCBwcm92aWRlcyBzaW5jZSBub3QgYWxsIHZlbmRvcnMKLQkgKiBib3RoZXIgdG8gbWFrZSBpdCB1bmlxdWUuICBMaWtld2lzZSB0aGVyZSdzIG5vIHBvaW50IGluIHRyYWNraW5nCi0JICogb2YgdGhlIENEQyBldmVudCBub3RpZmljYXRpb25zLgotCSAqLwotCXJldHVybiBnZXRfZW5kcG9pbnRzIChkZXYsIGludGYpOwotCi1iYWRfZGVzYzoKLQlkZXZfaW5mbyAoJmRldi0+dWRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgTURMTSBkZXNjcmlwdG9yc1xuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8JYm9ndXNfbWRsbV9pbmZvID0gewotCS5kZXNjcmlwdGlvbiA9CSJwc2V1ZG8tTURMTSAoQkxBTikgZGV2aWNlIiwKLQkuZmxhZ3MgPQlGTEFHX0ZSQU1JTkdfWiwKLQkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCi0JLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKLQkuYmluZCA9CQlibGFuX21kbG1fYmluZCwKLX07Ci0KLSNlbHNlCi0KLS8qIGJsYWNrbGlzdCBhbGwgdGhvc2UgZGV2aWNlcyAqLwotI2RlZmluZQlaQVVSVVNfU1RST05HQVJNX0lORk8JMAotI2RlZmluZQlaQVVSVVNfUFhBX0lORk8JCTAKLSNkZWZpbmUJT0xZTVBVU19NWExfSU5GTwkwCi0KLSNlbmRpZgorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X3NrYl9yZXR1cm4pOwogCiAMCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI4NjgsMjIgKzIzMCwxMiBAQAogc3RhdGljIGludCB1c2JuZXRfY2hhbmdlX210dSAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgaW50IG5ld19tdHUpCiB7CiAJc3RydWN0IHVzYm5ldAkqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlpbnQJCWxsX210dSA9IG5ld19tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKIAotCWlmIChuZXdfbXR1IDw9IE1JTl9QQUNLRVQgfHwgbmV3X210dSA+IE1BWF9QQUNLRVQpCisJaWYgKG5ld19tdHUgPD0gMCB8fCBsbF9tdHUgPiBkZXYtPmhhcmRfbXR1KQogCQlyZXR1cm4gLUVJTlZBTDsKLSNpZmRlZglDT05GSUdfVVNCX05FVDEwODAKLQlpZiAoKChkZXYtPmRyaXZlcl9pbmZvLT5mbGFncykgJiBGTEFHX0ZSQU1JTkdfTkMpKSB7Ci0JCWlmIChGUkFNRURfU0laRSAobmV3X210dSkgPiBNQVhfUEFDS0VUKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotI2VuZGlmCi0jaWZkZWYJQ09ORklHX1VTQl9HRU5FU1lTCi0JaWYgKCgoZGV2LT5kcml2ZXJfaW5mby0+ZmxhZ3MpICYgRkxBR19GUkFNSU5HX0dMKQotCQkJJiYgbmV3X210dSA+IEdMX01BWF9QQUNLRVRfTEVOKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgogCS8vIG5vIHNlY29uZCB6ZXJvLWxlbmd0aCBwYWNrZXQgcmVhZCB3YW50ZWQgYWZ0ZXIgbXR1LXNpemVkIHBhY2tldHMKLQlpZiAoKChuZXdfbXR1ICsgc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSkgJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKKwlpZiAoKGxsX210dSAlIGRldi0+bWF4cGFja2V0KSA9PSAwKQogCQlyZXR1cm4gLUVET007CiAJbmV0LT5tdHUgPSBuZXdfbXR1OwogCXJldHVybiAwOwpAQCAtMjkyMiw3ICsyNzQsNyBAQAogICogTk9URTogIGFubm95aW5nIGFzeW1tZXRyeTogIGlmIGl0J3MgYWN0aXZlLCBzY2hlZHVsZV93b3JrKCkgZmFpbHMsCiAgKiBidXQgdGFza2xldF9zY2hlZHVsZSgpIGRvZXNuJ3QuICBob3BlIHRoZSBmYWlsdXJlIGlzIHJhcmUuCiAgKi8KLXN0YXRpYyB2b2lkIGRlZmVyX2tldmVudCAoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgd29yaykKK3ZvaWQgdXNibmV0X2RlZmVyX2tldmVudCAoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgd29yaykKIHsKIAlzZXRfYml0ICh3b3JrLCAmZGV2LT5mbGFncyk7CiAJaWYgKCFzY2hlZHVsZV93b3JrICgmZGV2LT5rZXZlbnQpKQpAQCAtMjkzMCw1MCArMjgyLDI0IEBACiAJZWxzZQogCQlkZXZkYmcgKGRldiwgImtldmVudCAlZCBzY2hlZHVsZWQiLCB3b3JrKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9kZWZlcl9rZXZlbnQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgdm9pZCByeF9jb21wbGV0ZSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLXN0YXRpYyB2b2lkIHJ4X3N1Ym1pdCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIsIGludCBmbGFncykKK3N0YXRpYyB2b2lkIHJ4X3N1Ym1pdCAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGZsYWdzKQogewogCXN0cnVjdCBza19idWZmCQkqc2tiOwogCXN0cnVjdCBza2JfZGF0YQkJKmVudHJ5OwogCWludAkJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZwkJbG9ja2ZsYWdzOwotCXNpemVfdAkJCXNpemU7Ci0KLSNpZmRlZiBDT05GSUdfVVNCX05FVDEwODAKLQlpZiAoZGV2LT5kcml2ZXJfaW5mby0+ZmxhZ3MgJiBGTEFHX0ZSQU1JTkdfTkMpCi0JCXNpemUgPSBGUkFNRURfU0laRSAoZGV2LT5uZXQtPm10dSk7Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1VTQl9HRU5FU1lTCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX0dMKQotCQlzaXplID0gR0xfUkNWX0JVRl9TSVpFOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfWkFVUlVTCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX1opCi0JCXNpemUgPSA2ICsgKHNpemVvZiAoc3RydWN0IGV0aGhkcikgKyBkZXYtPm5ldC0+bXR1KTsKLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVVNCX1JORElTCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX1JOKQotCQlzaXplID0gUk5ESVNfTUFYX1RSQU5TRkVSOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfQVg4ODE3WAotCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5mbGFncyAmIEZMQUdfRlJBTUlOR19BWCkKLQkJc2l6ZSA9IDIwNDg7Ci0JZWxzZQotI2VuZGlmCi0JCXNpemUgPSAoc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSArIGRldi0+bmV0LT5tdHUpOworCXNpemVfdAkJCXNpemUgPSBkZXYtPnJ4X3VyYl9zaXplOwogCiAJaWYgKChza2IgPSBhbGxvY19za2IgKHNpemUgKyBORVRfSVBfQUxJR04sIGZsYWdzKSkgPT0gTlVMTCkgewogCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKIAkJCWRldmRiZyAoZGV2LCAibm8gcnggc2tiIik7Ci0JCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9SWF9NRU1PUlkpOworCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CiAJCXVzYl9mcmVlX3VyYiAodXJiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI5ODcsNyArMzEzLDYgQEAKIAogCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIGRldi0+dWRldiwgZGV2LT5pbiwKIAkJc2tiLT5kYXRhLCBzaXplLCByeF9jb21wbGV0ZSwgc2tiKTsKLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+cnhxLmxvY2ssIGxvY2tmbGFncyk7CiAKQEAgLTI5OTYsMTAgKzMyMSwxMCBAQAogCQkJJiYgIXRlc3RfYml0IChFVkVOVF9SWF9IQUxULCAmZGV2LT5mbGFncykpIHsKIAkJc3dpdGNoIChyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKSl7IAogCQljYXNlIC1FUElQRToKLQkJCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9SWF9IQUxUKTsKKwkJCXVzYm5ldF9kZWZlcl9rZXZlbnQgKGRldiwgRVZFTlRfUlhfSEFMVCk7CiAJCQlicmVhazsKIAkJY2FzZSAtRU5PTUVNOgotCQkJZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CisJCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CiAJCQlicmVhazsKIAkJY2FzZSAtRU5PREVWOgogCQkJaWYgKG5ldGlmX21zZ19pZmRvd24gKGRldikpCkBAIC0zMDM3LDcgKzM2Miw3IEBACiAJLy8gZWxzZSBuZXR3b3JrIHN0YWNrIHJlbW92ZXMgZXh0cmEgYnl0ZSBpZiB3ZSBmb3JjZWQgYSBzaG9ydCBwYWNrZXQKIAogCWlmIChza2ItPmxlbikKLQkJc2tiX3JldHVybiAoZGV2LCBza2IpOworCQl1c2JuZXRfc2tiX3JldHVybiAoZGV2LCBza2IpOwogCWVsc2UgewogCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKIAkJCWRldmRiZyAoZGV2LCAiZHJvcCIpOwpAQCAtMzA2Myw3ICszODgsNyBAQAogCXN3aXRjaCAodXJiX3N0YXR1cykgewogCSAgICAvLyBzdWNjZXNzCiAJICAgIGNhc2UgMDoKLQkJaWYgKE1JTl9QQUNLRVQgPiBza2ItPmxlbiB8fCBza2ItPmxlbiA+IE1BWF9QQUNLRVQpIHsKKwkJaWYgKHNrYi0+bGVuIDwgZGV2LT5uZXQtPmhhcmRfaGVhZGVyX2xlbikgewogCQkJZW50cnktPnN0YXRlID0gcnhfY2xlYW51cDsKIAkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKQEAgLTMwNzgsNyArNDAzLDcgQEAKIAkgICAgLy8gc3Rvcm0sIHJlY292ZXJpbmcgYXMgbmVlZGVkLgogCSAgICBjYXNlIC1FUElQRToKIAkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX0hBTFQpOworCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX0hBTFQpOwogCQkvLyBGQUxMVEhST1VHSAogCiAJICAgIC8vIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24KQEAgLTMzMjAsNTUgKzY0NSw1OCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgdm9pZCB1c2JuZXRfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCisvKiBldGh0b29sIG1ldGhvZHM7IG1pbmlkcml2ZXJzIG1heSBuZWVkIHRvIGFkZCBzb21lIG1vcmUsIGJ1dAorICogdGhleSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGlzIGJhc2Ugc2V0LgorICovCisKK3ZvaWQgdXNibmV0X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKKwkvKiBSRVZJU0lUIGRvbid0IGFsd2F5cyByZXR1cm4gInVzYm5ldCIgKi8KIAlzdHJuY3B5IChpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lLCBzaXplb2YgaW5mby0+ZHJpdmVyKTsKIAlzdHJuY3B5IChpbmZvLT52ZXJzaW9uLCBEUklWRVJfVkVSU0lPTiwgc2l6ZW9mIGluZm8tPnZlcnNpb24pOwogCXN0cm5jcHkgKGluZm8tPmZ3X3ZlcnNpb24sIGRldi0+ZHJpdmVyX2luZm8tPmRlc2NyaXB0aW9uLAogCQlzaXplb2YgaW5mby0+ZndfdmVyc2lvbik7CiAJdXNiX21ha2VfcGF0aCAoZGV2LT51ZGV2LCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mIGluZm8tPmJ1c19pbmZvKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfZHJ2aW5mbyk7CiAKIHN0YXRpYyB1MzIgdXNibmV0X2dldF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKLQkvKiBJZiBhIGNoZWNrX2Nvbm5lY3QgaXMgZGVmaW5lZCwgcmV0dXJuIGl0J3MgcmVzdWx0cyAqLworCS8qIElmIGEgY2hlY2tfY29ubmVjdCBpcyBkZWZpbmVkLCByZXR1cm4gaXRzIHJlc3VsdCAqLwogCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5jaGVja19jb25uZWN0KQogCQlyZXR1cm4gZGV2LT5kcml2ZXJfaW5mby0+Y2hlY2tfY29ubmVjdCAoZGV2KSA9PSAwOwogCi0JLyogT3RoZXJ3aXNlLCB3ZSdyZSB1cCB0byBhdm9pZCBicmVha2luZyBzY3JpcHRzICovCisJLyogT3RoZXJ3aXNlLCBzYXkgd2UncmUgdXAgKHRvIGF2b2lkIGJyZWFraW5nIHNjcmlwdHMpICovCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3UzMiB1c2JuZXRfZ2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKIAlyZXR1cm4gZGV2LT5tc2dfZW5hYmxlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X2dldF9tc2dsZXZlbCk7CiAKLXN0YXRpYyB2b2lkIHVzYm5ldF9zZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHUzMiBsZXZlbCkKK3ZvaWQgdXNibmV0X3NldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgdTMyIGxldmVsKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKIAlkZXYtPm1zZ19lbmFibGUgPSBsZXZlbDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9zZXRfbXNnbGV2ZWwpOwogCi1zdGF0aWMgaW50IHVzYm5ldF9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKLXsKLSNpZmRlZiBORUVEX01JSQotCXsKLQlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCi0JaWYgKGRldi0+bWlpLm1kaW9fcmVhZCAhPSBOVUxMICYmIGRldi0+bWlpLm1kaW9fd3JpdGUgIT0gTlVMTCkKLQkJcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZkZXYtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CisvKiBkcml2ZXJzIG1heSBvdmVycmlkZSBkZWZhdWx0IGV0aHRvb2xfb3BzIGluIHRoZWlyIGJpbmQoKSByb3V0aW5lICovCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHVzYm5ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gdXNibmV0X2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSB1c2JuZXRfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKK307CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTMzODcsMTkgKzcxNSwyNCBAQAogCWlmICh0ZXN0X2JpdCAoRVZFTlRfVFhfSEFMVCwgJmRldi0+ZmxhZ3MpKSB7CiAJCXVubGlua191cmJzIChkZXYsICZkZXYtPnR4cSk7CiAJCXN0YXR1cyA9IHVzYl9jbGVhcl9oYWx0IChkZXYtPnVkZXYsIGRldi0+b3V0KTsKLQkJaWYgKHN0YXR1cyA8IDAgJiYgc3RhdHVzICE9IC1FUElQRSkgeworCQlpZiAoc3RhdHVzIDwgMAorCQkJCSYmIHN0YXR1cyAhPSAtRVBJUEUKKwkJCQkmJiBzdGF0dXMgIT0gLUVTSFVURE9XTikgewogCQkJaWYgKG5ldGlmX21zZ190eF9lcnIgKGRldikpCiAJCQkJZGV2ZXJyIChkZXYsICJjYW4ndCBjbGVhciB0eCBoYWx0LCBzdGF0dXMgJWQiLAogCQkJCQlzdGF0dXMpOwogCQl9IGVsc2UgewogCQkJY2xlYXJfYml0IChFVkVOVF9UWF9IQUxULCAmZGV2LT5mbGFncyk7Ci0JCQluZXRpZl93YWtlX3F1ZXVlIChkZXYtPm5ldCk7CisJCQlpZiAoc3RhdHVzICE9IC1FU0hVVERPV04pCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2LT5uZXQpOwogCQl9CiAJfQogCWlmICh0ZXN0X2JpdCAoRVZFTlRfUlhfSEFMVCwgJmRldi0+ZmxhZ3MpKSB7CiAJCXVubGlua191cmJzIChkZXYsICZkZXYtPnJ4cSk7CiAJCXN0YXR1cyA9IHVzYl9jbGVhcl9oYWx0IChkZXYtPnVkZXYsIGRldi0+aW4pOwotCQlpZiAoc3RhdHVzIDwgMCAmJiBzdGF0dXMgIT0gLUVQSVBFKSB7CisJCWlmIChzdGF0dXMgPCAwCisJCQkJJiYgc3RhdHVzICE9IC1FUElQRQorCQkJCSYmIHN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CiAJCQlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGV2KSkKIAkJCQlkZXZlcnIgKGRldiwgImNhbid0IGNsZWFyIHJ4IGhhbHQsIHN0YXR1cyAlZCIsCiAJCQkJCXN0YXR1cyk7CkBAIC0zNDU4LDcgKzc5MSw3IEBACiAKIAkJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIC1FUElQRToKLQkJCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9UWF9IQUxUKTsKKwkJCXVzYm5ldF9kZWZlcl9rZXZlbnQgKGRldiwgRVZFTlRfVFhfSEFMVCk7CiAJCQlicmVhazsKIAogCQkvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCkBAIC0zNTE1LDEwICs4NDgsNiBAQAogCXN0cnVjdCBza2JfZGF0YQkJKmVudHJ5OwogCXN0cnVjdCBkcml2ZXJfaW5mbwkqaW5mbyA9IGRldi0+ZHJpdmVyX2luZm87CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0jaWZkZWYJQ09ORklHX1VTQl9ORVQxMDgwCi0Jc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgbmNfdHJhaWxlcgkqdHJhaWxlciA9IE5VTEw7Ci0jZW5kaWYJLyogQ09ORklHX1VTQl9ORVQxMDgwICovCiAKIAkvLyBzb21lIGRldmljZXMgd2FudCBmdW5reSBVU0ItbGV2ZWwgZnJhbWluZywgZm9yCiAJLy8gd2luMzIgZHJpdmVyICh1c3VhbGx5KSBhbmQvb3IgaGFyZHdhcmUgcXVpcmtzCkBAIC0zNTQ0LDI0ICs4NzMsOCBAQAogCWVudHJ5LT5zdGF0ZSA9IHR4X3N0YXJ0OwogCWVudHJ5LT5sZW5ndGggPSBsZW5ndGg7CiAKLQkvLyBGSVhNRTogcmVvcmdhbml6ZSBhIGJpdCwgc28gdGhhdCBmaXh1cCgpIGZpbGxzIG91dCBOZXRDaGlwCi0JLy8gZnJhbWluZyB0b28uIChQYWNrZXQgSUQgdXBkYXRlIG5lZWRzIHRoZSBzcGlubG9jay4uLikKLQkvLyBbIEJFVFRFUjogIHdlIGFscmVhZHkgb3duIG5ldC0+eG1pdF9sb2NrLCB0aGF0J3MgZW5vdWdoIF0KLQotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotCWlmIChpbmZvLT5mbGFncyAmIEZMQUdfRlJBTUlOR19OQykgewotCQloZWFkZXIgPSAoc3RydWN0IG5jX2hlYWRlciAqKSBza2JfcHVzaCAoc2tiLCBzaXplb2YgKmhlYWRlcik7Ci0JCWhlYWRlci0+aGRyX2xlbiA9IGNwdV90b19sZTE2IChzaXplb2YgKCpoZWFkZXIpKTsKLQkJaGVhZGVyLT5wYWNrZXRfbGVuID0gY3B1X3RvX2xlMTYgKGxlbmd0aCk7Ci0JCWlmICghKChza2ItPmxlbiArIHNpemVvZiAqdHJhaWxlcikgJiAweDAxKSkKLQkJCSpza2JfcHV0IChza2IsIDEpID0gUEFEX0JZVEU7Ci0JCXRyYWlsZXIgPSAoc3RydWN0IG5jX3RyYWlsZXIgKikgc2tiX3B1dCAoc2tiLCBzaXplb2YgKnRyYWlsZXIpOwotCX0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX05FVDEwODAgKi8KLQogCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIGRldi0+dWRldiwgZGV2LT5vdXQsCiAJCQlza2ItPmRhdGEsIHNrYi0+bGVuLCB0eF9jb21wbGV0ZSwgc2tiKTsKLQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAKIAkvKiBkb24ndCBhc3N1bWUgdGhlIGhhcmR3YXJlIGhhbmRsZXMgVVNCX1pFUk9fUEFDS0VUCiAJICogTk9URTogIHN0cmljdGx5IGNvbmZvcm1pbmcgY2RjLWV0aGVyIGRldmljZXMgc2hvdWxkIGV4cGVjdApAQCAtMzU3NCwyMiArODg3LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+dHhxLmxvY2ssIGZsYWdzKTsKIAotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotCWlmIChpbmZvLT5mbGFncyAmIEZMQUdfRlJBTUlOR19OQykgewotCQloZWFkZXItPnBhY2tldF9pZCA9IGNwdV90b19sZTE2ICgodTE2KWRldi0+ZGV2X3BhY2tldF9pZCsrKTsKLQkJcHV0X3VuYWxpZ25lZCAoaGVhZGVyLT5wYWNrZXRfaWQsICZ0cmFpbGVyLT5wYWNrZXRfaWQpOwotI2lmIDAKLQkJZGV2ZGJnIChkZXYsICJmcmFtZSA+dHggaCAlZCBwICVkIGlkICVkIiwKLQkJCWhlYWRlci0+aGRyX2xlbiwgaGVhZGVyLT5wYWNrZXRfbGVuLAotCQkJaGVhZGVyLT5wYWNrZXRfaWQpOwotI2VuZGlmCi0JfQotI2VuZGlmCS8qIENPTkZJR19VU0JfTkVUMTA4MCAqLwotCiAJc3dpdGNoICgocmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQykpKSB7CiAJY2FzZSAtRVBJUEU6CiAJCW5ldGlmX3N0b3BfcXVldWUgKG5ldCk7Ci0JCWRlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9UWF9IQUxUKTsKKwkJdXNibmV0X2RlZmVyX2tldmVudCAoZGV2LCBFVkVOVF9UWF9IQUxUKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaWYgKG5ldGlmX21zZ190eF9lcnIgKGRldikpCkBAIC0zNjkyLDcgKzk5Myw3IEBACiAgCiAvLyBwcmVjb25kaXRpb246IG5ldmVyIGNhbGxlZCBpbl9pbnRlcnJ1cHQKIAotc3RhdGljIHZvaWQgdXNibmV0X2Rpc2Nvbm5lY3QgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQordm9pZCB1c2JuZXRfZGlzY29ubmVjdCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYm5ldAkJKmRldjsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqeGRldjsKQEAgLTM3MDYsNyArMTAwNyw4IEBACiAJeGRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwogCiAJaWYgKG5ldGlmX21zZ19wcm9iZSAoZGV2KSkKLQkJZGV2aW5mbyAoZGV2LCAidW5yZWdpc3RlciB1c2JuZXQgdXNiLSVzLSVzLCAlcyIsCisJCWRldmluZm8gKGRldiwgInVucmVnaXN0ZXIgJyVzJyB1c2ItJXMtJXMsICVzIiwKKwkJCWludGYtPmRldi5kcml2ZXItPm5hbWUsCiAJCQl4ZGV2LT5idXMtPmJ1c19uYW1lLCB4ZGV2LT5kZXZwYXRoLAogCQkJZGV2LT5kcml2ZXJfaW5mby0+ZGVzY3JpcHRpb24pOwogCQpAQCAtMzcyMiwxNSArMTAyNCwxNCBAQAogCWZyZWVfbmV0ZGV2KG5ldCk7CiAJdXNiX3B1dF9kZXYgKHhkZXYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X2Rpc2Nvbm5lY3QpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdXNibmV0X2V0aHRvb2xfb3BzOwotCiAvLyBwcmVjb25kaXRpb246IG5ldmVyIGNhbGxlZCBpbl9pbnRlcnJ1cHQKIAotc3RhdGljIGludAoraW50CiB1c2JuZXRfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1ZGV2LCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqcHJvZCkKIHsKIAlzdHJ1Y3QgdXNibmV0CQkJKmRldjsKQEAgLTM3NzksNiArMTA4MCwxMCBAQAogCXN0cmNweSAobmV0LT5uYW1lLCAidXNiJWQiKTsKIAltZW1jcHkgKG5ldC0+ZGV2X2FkZHIsIG5vZGVfaWQsIHNpemVvZiBub2RlX2lkKTsKIAorCS8qIHJ4IGFuZCB0eCBzaWRlcyBjYW4gdXNlIGRpZmZlcmVudCBtZXNzYWdlIHNpemVzOworCSAqIGJpbmQoKSBzaG91bGQgc2V0IHJ4X3VyYl9zaXplIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlkZXYtPmhhcmRfbXR1ID0gbmV0LT5tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKICNpZiAwCiAvLyBkbWFfc3VwcG9ydGVkKCkgaXMgZGVlcGx5IGJyb2tlbiBvbiBhbG1vc3QgYWxsIGFyY2hpdGVjdHVyZXMKIAkvLyBwb3NzaWJsZSB3aXRoIHNvbWUgRUhDSSBjb250cm9sbGVycwpAQCAtMzc5Myw3ICsxMDk4LDYgQEAKIAluZXQtPnN0b3AgPSB1c2JuZXRfc3RvcDsKIAluZXQtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVF9KSUZGSUVTOwogCW5ldC0+dHhfdGltZW91dCA9IHVzYm5ldF90eF90aW1lb3V0OwotCW5ldC0+ZG9faW9jdGwgPSB1c2JuZXRfaW9jdGw7CiAJbmV0LT5ldGh0b29sX29wcyA9ICZ1c2JuZXRfZXRodG9vbF9vcHM7CiAKIAkvLyBhbGxvdyBkZXZpY2Utc3BlY2lmaWMgYmluZC9pbml0IHByb2NlZHVyZXMKQEAgLTM4MDYsOCArMTExMCwxMiBAQAogCQlpZiAoKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19FVEhFUikgIT0gMAogCQkJCSYmIChuZXQtPmRldl9hZGRyIFswXSAmIDB4MDIpID09IDApCiAJCQlzdHJjcHkgKG5ldC0+bmFtZSwgImV0aCVkIik7Ci0JfSBlbHNlIGlmICghaW5mby0+aW4gfHwgaW5mby0+b3V0KQotCQlzdGF0dXMgPSBnZXRfZW5kcG9pbnRzIChkZXYsIHVkZXYpOworCisJCS8qIG1heWJlIHRoZSByZW1vdGUgY2FuJ3QgcmVjZWl2ZSBhbiBFdGhlcm5ldCBNVFUgKi8KKwkJaWYgKG5ldC0+bXR1ID4gKGRldi0+aGFyZF9tdHUgLSBuZXQtPmhhcmRfaGVhZGVyX2xlbikpCisJCQluZXQtPm10dSA9IGRldi0+aGFyZF9tdHUgLSBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKKwl9IGVsc2UgaWYgKCFpbmZvLT5pbiB8fCAhaW5mby0+b3V0KQorCQlzdGF0dXMgPSB1c2JuZXRfZ2V0X2VuZHBvaW50cyAoZGV2LCB1ZGV2KTsKIAllbHNlIHsKIAkJZGV2LT5pbiA9IHVzYl9yY3ZidWxrcGlwZSAoeGRldiwgaW5mby0+aW4pOwogCQlkZXYtPm91dCA9IHVzYl9zbmRidWxrcGlwZSAoeGRldiwgaW5mby0+b3V0KTsKQEAgLTM4MTksMTIgKzExMjcsMTMgQEAKIAkJCXN0YXR1cyA9IDA7CiAKIAl9Ci0KIAlpZiAoc3RhdHVzID09IDAgJiYgZGV2LT5zdGF0dXMpCiAJCXN0YXR1cyA9IGluaXRfc3RhdHVzIChkZXYsIHVkZXYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIG91dDE7CiAKKwlpZiAoIWRldi0+cnhfdXJiX3NpemUpCisJCWRldi0+cnhfdXJiX3NpemUgPSBkZXYtPmhhcmRfbXR1OwogCWRldi0+bWF4cGFja2V0ID0gdXNiX21heHBhY2tldCAoZGV2LT51ZGV2LCBkZXYtPm91dCwgMSk7CiAJCiAJU0VUX05FVERFVl9ERVYobmV0LCAmdWRldi0+ZGV2KTsKQEAgLTM4MzIsOCArMTE0MSw5IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQzOwogCWlmIChuZXRpZl9tc2dfcHJvYmUgKGRldikpCi0JCWRldmluZm8gKGRldiwgInJlZ2lzdGVyIHVzYm5ldCBhdCB1c2ItJXMtJXMsICVzLCAiCisJCWRldmluZm8gKGRldiwgInJlZ2lzdGVyICclcycgYXQgdXNiLSVzLSVzLCAlcywgIgogCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQl1ZGV2LT5kZXYuZHJpdmVyLT5uYW1lLAogCQkJeGRldi0+YnVzLT5idXNfbmFtZSwgeGRldi0+ZGV2cGF0aCwKIAkJCWRldi0+ZHJpdmVyX2luZm8tPmRlc2NyaXB0aW9uLAogCQkJbmV0LT5kZXZfYWRkciBbMF0sIG5ldC0+ZGV2X2FkZHIgWzFdLApAQCAtMzg1NywxMiArMTE2NywxNSBAQAogCXVzYl9wdXRfZGV2KHhkZXYpOwogCXJldHVybiBzdGF0dXM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfcHJvYmUpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWZkZWYJQ09ORklHX1BNCisvKiBGSVhNRSB0aGVzZSBzdXNwZW5kL3Jlc3VtZSBtZXRob2RzIGFzc3VtZSBub24tQ0RDIHN0eWxlCisgKiBkZXZpY2VzLCB3aXRoIG9ubHkgb25lIGludGVyZmFjZS4KKyAqLwogCi1zdGF0aWMgaW50IHVzYm5ldF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitpbnQgdXNibmV0X3N1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKIAlzdHJ1Y3QgdXNibmV0CQkqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAkKQEAgLTM4NzUsOCArMTE4OCw5IEBACiAJaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X3N1c3BlbmQpOwogCi1zdGF0aWMgaW50IHVzYm5ldF9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoraW50IHVzYm5ldF9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JuZXQJCSpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCkBAIC0zODg1LDM1NyArMTE5OSwyNyBAQAogCXRhc2tsZXRfc2NoZWR1bGUgKCZkZXYtPmJoKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9yZXN1bWUpOwogCi0jZWxzZQkvKiAhQ09ORklHX1BNICovCi0KLSNkZWZpbmUJdXNibmV0X3N1c3BlbmQJTlVMTAotI2RlZmluZQl1c2JuZXRfcmVzdW1lCU5VTEwKLQotI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWZuZGVmCUhBVkVfSEFSRFdBUkUKLSNlcnJvciBZb3UgbmVlZCB0byBjb25maWd1cmUgc29tZSBoYXJkd2FyZSBmb3IgdGhpcyBkcml2ZXIKLSNlbmRpZgotCi0vKgotICogY2hpcCB2ZW5kb3IgbmFtZXMgd29uJ3Qgbm9ybWFsbHkgYmUgb24gdGhlIGNhYmxlcywgYW5kCi0gKiBtYXkgbm90IGJlIG9uIHRoZSBkZXZpY2UuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkCXByb2R1Y3RzIFtdID0gewotCi0jaWZkZWYJQ09ORklHX1VTQl9BTElfTTU2MzIKK3N0YXRpYyBpbnQgX19pbml0IHVzYm5ldF9pbml0KHZvaWQpCiB7Ci0JVVNCX0RFVklDRSAoMHgwNDAyLCAweDU2MzIpLAkvLyBBTGkgZGVmYXVsdHMKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmFsaV9tNTYzMl9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9BTjI3MjAKLXsKLQlVU0JfREVWSUNFICgweDA1NDcsIDB4MjcyMCksCS8vIEFuY2hvckNoaXBzIGRlZmF1bHRzCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZhbjI3MjBfaW5mbywKLX0sIHsKLQlVU0JfREVWSUNFICgweDA1NDcsIDB4MjcyNyksCS8vIFhpcmNvbSBQR1VORVQKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmFuMjcyMF9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9CRUxLSU4KLXsKLQlVU0JfREVWSUNFICgweDA1MGQsIDB4MDAwNCksCS8vIEJlbGtpbgotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmVsa2luX2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHgwNTZjLCAweDgxMDApLAkvLyBlVEVLCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZiZWxraW5faW5mbywKLX0sIHsKLQlVU0JfREVWSUNFICgweDA1MjUsIDB4OTkwMSksCS8vIEFkdmFuY2UgVVNCTkVUIChlVEVLKQotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmVsa2luX2luZm8sCi19LAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0FYODgxN1gKLXsKLQkvLyBMaW5rc3lzIFVTQjIwME0KLQlVU0JfREVWSUNFICgweDA3N2IsIDB4MjIyNiksCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gTmV0Z2VhciBGQTEyMAotCVVTQl9ERVZJQ0UgKDB4MDg0NiwgMHgxMDQwKSwKLQkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZuZXRnZWFyX2ZhMTIwX2luZm8sCi19LCB7Ci0JLy8gRExpbmsgRFVCLUUxMDAKLQlVU0JfREVWSUNFICgweDIwMDEsIDB4MWEwMCksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmZGxpbmtfZHViX2UxMDBfaW5mbywKLX0sIHsKLQkvLyBJbnRlbGxpbmV0LCBTVCBMYWIgVVNCIEV0aGVybmV0Ci0JVVNCX0RFVklDRSAoMHgwYjk1LCAweDE3MjApLAotCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKLX0sIHsKLQkvLyBIYXdraW5nIFVGMjAwLCBUcmVuZE5ldCBUVTItRVQxMDAKLQlVU0JfREVWSUNFICgweDA3YjgsIDB4NDIwYSksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmaGF3a2luZ191ZjIwMF9pbmZvLAotfSwgewotICAgICAgICAvLyBCaWxsaW9udG9uIFN5c3RlbXMsIFVTQjJBUiAKLSAgICAgICAgVVNCX0RFVklDRSAoMHgwOGRkLCAweDkwZmYpLAotICAgICAgICAuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gQVRFTiBVQzIxMFQKLQlVU0JfREVWSUNFICgweDA1NTcsIDB4MjAwOSksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAotfSwgewotCS8vIEJ1ZmZhbG8gTFVBLVUyLUtUWAotCVVTQl9ERVZJQ0UgKDB4MDQxMSwgMHgwMDNkKSwKLQkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gU2l0ZWNvbSBMTi0wMjkgIlVTQiAyLjAgMTAvMTAwIEV0aGVybmV0IGFkYXB0ZXIiCi0JVVNCX0RFVklDRSAoMHg2MTg5LCAweDE4MmQpLAotCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKLX0sIHsKLQkvLyBjb3JlZ2EgRkV0aGVyIFVTQjItVFgKLQlVU0JfREVWSUNFICgweDA3YWEsIDB4MDAxNyksCi0JLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAotfSwgewotCS8vIFN1cmVjb20gRVAtMTQyN1gtMgotCVVTQl9ERVZJQ0UgKDB4MTE4OSwgMHgwODkzKSwKLQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF4ODgxN3hfaW5mbywKLX0sIHsKLQkvLyBnb29kd2F5IGNvcnAgdXNiIGd3dXNiMmUKLQlVU0JfREVWSUNFICgweDE2MzEsIDB4NjIwMCksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4MTd4X2luZm8sCi19LCB7Ci0JLy8gQVNJWCBBWDg4NzcyIDEwLzEwMAotICAgICAgICBVU0JfREVWSUNFICgweDBiOTUsIDB4NzcyMCksCi0gICAgICAgIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9FUFNPTjI4ODgKLXsKLQlVU0JfREVWSUNFICgweDA1MjUsIDB4Mjg4OCksCS8vIEVQU09OIFVTQiBjbGllbnQKLQkuZHJpdmVyX2luZm8JPSAodW5zaWduZWQgbG9uZykgJmVwc29uMjg4OF9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9HRU5FU1lTCi17Ci0JVVNCX0RFVklDRSAoMHgwNWUzLCAweDA1MDIpLAkvLyBHTDYyMFVTQi1BCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZnZW5lbGlua19pbmZvLAotfSwKLQkvKiBOT1Q6IFVTQl9ERVZJQ0UgKDB4MDVlMywgMHgwNTAxKSwJLy8gR0w2MjBVU0IKLQkgKiB0aGF0J3MgaGFsZiBkdXBsZXgsIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICovCi0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19VU0JfTkVUMTA4MAotewotCVVTQl9ERVZJQ0UgKDB4MDUyNSwgMHgxMDgwKSwJLy8gTmV0Q2hpcCByZWYgZGVzaWduCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZuZXQxMDgwX2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHgwNkQwLCAweDA2MjIpLAkvLyBMYXBsaW5rIEdvbGQKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJm5ldDEwODBfaW5mbywKLX0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfUEwyMzAxCi17Ci0JVVNCX0RFVklDRSAoMHgwNjdiLCAweDAwMDApLAkvLyBQTC0yMzAxCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZwcm9saWZpY19pbmZvLAotfSwgewotCVVTQl9ERVZJQ0UgKDB4MDY3YiwgMHgwMDAxKSwJLy8gUEwtMjMwMgotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmcHJvbGlmaWNfaW5mbywKLX0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfS0MyMTkwCi17Ci0JVVNCX0RFVklDRSAoMHgwNTBmLCAweDAxOTApLAkvLyBLQy0xOTAKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmtjMjE5MF9pbmZvLAotfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9STkRJUwotewotCS8qIFJORElTIGlzIE1TRlQncyB1bi1vZmZpY2lhbCB2YXJpYW50IG9mIENEQyBBQ00gKi8KLQlVU0JfSU5URVJGQUNFX0lORk8gKFVTQl9DTEFTU19DT01NLCAyIC8qIEFDTSAqLywgMHgwZmYpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmcm5kaXNfaW5mbywKLX0sCi0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19VU0JfQVJNTElOVVgKLS8qCi0gKiBTQS0xMTAwIHVzaW5nIHN0YW5kYXJkIEFSTSBMaW51eCBrZXJuZWxzLCBvciBjb21wYXRpYmxlLgotICogT2Z0ZW4gdXNlZCB3aGVuIHRhbGtpbmcgdG8gTGludXggUERBcyAoaVBhcSwgWW9weSwgZXRjKS4KLSAqIFRoZSBzYS0xMTAwICJ1c2ItZXRoIiBkcml2ZXIgaGFuZGxlcyB0aGUgYmFzaWMgZnJhbWluZy4KLSAqCi0gKiBQWEEyNXggb3IgUFhBMjEwIC4uLiAgdGhlc2UgdXNlIGEgInVzYi1ldGgiIGRyaXZlciBtdWNoIGxpa2UKLSAqIHRoZSBzYTExMDAgb25lLCBidXQgaGFyZHdhcmUgdXNlcyBkaWZmZXJlbnQgZW5kcG9pbnQgbnVtYmVycy4KLSAqCi0gKiBPciB0aGUgTGludXggIkV0aGVybmV0IiBnYWRnZXQgb24gaGFyZHdhcmUgdGhhdCBjYW4ndCB0YWxrCi0gKiBDREMgRXRoZXJuZXQgKGUuZy4sIG5vIGFsdHNldHRpbmdzKSwgaW4gZWl0aGVyIG9mIHR3byBtb2RlczoKLSAqICAtIGFjdGluZyBqdXN0IGxpa2UgdGhlIG9sZCAidXNiLWV0aCIgZmlybXdhcmUsIHRob3VnaAotICogICAgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCAKLSAqICAtIHN1cHBvcnRpbmcgUk5ESVMgYXMgdGhlIGZpcnN0L2RlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IKLSAqICAgIE1TLVdpbmRvd3MgaW50ZXJvcDsgTGludXggbmVlZHMgdG8gdXNlIHRoZSBvdGhlciBjb25maWcKLSAqLwotewotCS8vIDExODMgPSAweDA0OUYsIGJvdGggdXNlZCBhcyBoZXggdmFsdWVzPwotCS8vIENvbXBhcSAiSXRzeSIgdmVuZG9yL3Byb2R1Y3QgaWQKLQlVU0JfREVWSUNFICgweDA0OUYsIDB4NTA1QSksCS8vIHVzYi1ldGgsIG9yIGNvbXBhdGlibGUKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmxpbnV4ZGV2X2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHgwRTdFLCAweDEwMDEpLAkvLyBHLk1hdGUgIllvcHkiCi0JLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZ5b3B5X2luZm8sCi19LCB7Ci0JVVNCX0RFVklDRSAoMHg4MDg2LCAweDA3ZDMpLAkvLyAiYmxvYiIgYm9vdGxvYWRlcgotCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmxvYl9pbmZvLAotfSwgewotCS8vIExpbnV4IEV0aGVybmV0L1JORElTIGdhZGdldCBvbiBweGEyMTAvMjV4LzI2eAotCS8vIGUuZy4gR3Vtc3RpeCwgY3VycmVudCBPcGVuWmF1cnVzLCAuLi4KLQlVU0JfREVWSUNFX1ZFUiAoMHgwNTI1LCAweGE0YTIsIDB4MDIwMywgMHgwMjAzKSwKLQkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmxpbnV4ZGV2X2luZm8sCi19LCAKLSNlbmRpZgotCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX1pBVVJVUykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0NEQ0VUSEVSKQotLyoKLSAqIFNBLTExMDAgYmFzZWQgU2hhcnAgWmF1cnVzICgiY29sbGllIiksIG9yIGNvbXBhdGlibGUuCi0gKiBTYW1lIGlkZWEgYXMgYWJvdmUsIGJ1dCBkaWZmZXJlbnQgZnJhbWluZy4KLSAqCi0gKiBQWEEtMnh4IGJhc2VkIG1vZGVscyBhcmUgYWxzbyBseWluZy1hYm91dC1jZGMuCi0gKiBTb21lIG1vZGVscyBkb24ndCBldmVuIHRlbGwgdGhlIHNhbWUgbGllcyAuLi4KLSAqCi0gKiBOT1RFOiAgT3BlblphdXJ1cyB2ZXJzaW9ucyB3aXRoIDIuNiBrZXJuZWxzIHdvbid0IHVzZSB0aGVzZSBlbnRyaWVzLAotICogdW5saWtlIHRoZSBvbGRlciBvbmVzIHdpdGggMi40ICJlbWJlZGl4IiBrZXJuZWxzLgotICoKLSAqIE5PVEU6ICBUaGVzZSBlbnRyaWVzIGRvIGRvdWJsZS1kdXR5LCBzZXJ2aW5nIGFzIGJsYWNrbGlzdCBlbnRyaWVzCi0gKiB3aGVuZXZlciBaYXVydXMgc3VwcG9ydCBpc24ndCBlbmFibGVkLCBidXQgQ0RDIEV0aGVybmV0IGlzLgotICovCi0jZGVmaW5lCVpBVVJVU19NQVNURVJfSU5URVJGQUNFIFwKLQkuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX0NPTU0sIFwKLQkuYkludGVyZmFjZVN1YkNsYXNzCT0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVCwgXAotCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSBVU0JfQ0RDX1BST1RPX05PTkUKLXsKLQkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KLQkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwgCi0JLmlkVmVuZG9yCQk9IDB4MDRERCwKLQkuaWRQcm9kdWN0CQk9IDB4ODAwNCwKLQlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKLQkuZHJpdmVyX2luZm8gPSBaQVVSVVNfU1RST05HQVJNX0lORk8sCi19LCB7Ci0JLm1hdGNoX2ZsYWdzCT0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCi0JCQkgIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsIAotCS5pZFZlbmRvcgkJPSAweDA0REQsCi0JLmlkUHJvZHVjdAkJPSAweDgwMDUsCS8qIEEtMzAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncwk9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCQkJICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLCAKLQkuaWRWZW5kb3IJCT0gMHgwNERELAotCS5pZFByb2R1Y3QJCT0gMHg4MDA2LAkvKiBCLTUwMC9TTC01NjAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCSAgICAgICAgICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAotCS5pZFZlbmRvcgkJPSAweDA0REQsCi0JLmlkUHJvZHVjdAkJPSAweDgwMDcsCS8qIEMtNzAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKLQkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKLQkuaWRQcm9kdWN0ICAgICAgICAgICAgICA9IDB4OTAzMSwJLyogQy03NTAgQy03NjAgKi8KLQlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKLQkuZHJpdmVyX2luZm8gPSBaQVVSVVNfUFhBX0lORk8sCi19LCB7Ci0JLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCi0JCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAotCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAotCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDMyLAkvKiBTTC02MDAwICovCi0JWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCi0JLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAotfSwgewotCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTwotCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKLQkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKLQkvKiByZXBvcnRlZCB3aXRoIHNvbWUgQzg2MCB1bml0cyAqLwotCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDUwLAkvKiBDLTg2MCAqLwotCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAotCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKLX0sCi0KLSNpZmRlZglDT05GSUdfVVNCX1pBVVJVUwotCS8qIEF0IGxlYXN0IHNvbWUgKHJlcG9ydHMgdmFyeSkgUFhBIHVuaXRzIGhhdmUgdmVyeSBkaWZmZXJlbnQgbGllcwotCSAqIGFib3V0IHRoZWlyIHN0YW5kYXJkcyBzdXBwb3J0OiAgdGhleSBjbGFpbSB0byBiZSBjZWxsIHBob25lcyB3aXRoCi0JICogZGlyZWN0IGFjY2VzcyB0byB0aGVpciByYWRpb3MuICAoVGhleSBkb24ndCBjb25mb3JtIHRvIENEQyBNRExNLikKLQkgKi8KLXsKLQlVU0JfSU5URVJGQUNFX0lORk8gKFVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX01ETE0sCi0JCQlVU0JfQ0RDX1BST1RPX05PTkUpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYm9ndXNfbWRsbV9pbmZvLAotfSwKLSNlbmRpZgotCi0vKiBPbHltcHVzIGhhcyBzb21lIG1vZGVscyB3aXRoIGEgWmF1cnVzLWNvbXBhdGlibGUgb3B0aW9uLgotICogUi0xMDAwIHVzZXMgYSBGcmVlU2NhbGUgaS5NWEwgY3B1IChBUk12NFQpCi0gKi8KLXsKLQkubWF0Y2hfZmxhZ3MgICAgPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KLQkJIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCi0JLmlkVmVuZG9yICAgICAgICAgICAgICAgPSAweDA3QjQsCi0JLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDBGMDIsCS8qIFItMTAwMCAqLwotCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAotCS5kcml2ZXJfaW5mbyA9IE9MWU1QVVNfTVhMX0lORk8sCi19LAotI2VuZGlmCi0KLSNpZmRlZglDT05GSUdfVVNCX0NEQ0VUSEVSCi17Ci0JLyogQ0RDIEV0aGVyIHVzZXMgdHdvIGludGVyZmFjZXMsIG5vdCBuZWNlc3NhcmlseSBjb25zZWN1dGl2ZS4KLQkgKiBXZSBtYXRjaCB0aGUgbWFpbiBpbnRlcmZhY2UsIGlnbm9yaW5nIHRoZSBvcHRpb25hbCBkZXZpY2UKLQkgKiBjbGFzcyBzbyB3ZSBjb3VsZCBoYW5kbGUgZGV2aWNlcyB0aGF0IGFyZW4ndCBleGNsdXNpdmVseQotCSAqIENEQyBldGhlci4KLQkgKgotCSAqIE5PVEU6ICB0aGlzIG1hdGNoIG11c3QgY29tZSBBRlRFUiBlbnRyaWVzIHdvcmtpbmcgYXJvdW5kCi0JICogYnVncy9xdWlya3MgaW4gYSBnaXZlbiBwcm9kdWN0IChsaWtlIFphdXJ1cywgYWJvdmUpLgotCSAqLwotCVVTQl9JTlRFUkZBQ0VfSU5GTyAoVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQsCi0JCQlVU0JfQ0RDX1BST1RPX05PTkUpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY2RjX2luZm8sCi19LAotI2VuZGlmCi0KLQl7IH0sCQkvLyBFTkQKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHByb2R1Y3RzKTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYm5ldF9kcml2ZXIgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJZHJpdmVyX25hbWUsCi0JLmlkX3RhYmxlID0JcHJvZHVjdHMsCi0JLnByb2JlID0JdXNibmV0X3Byb2JlLAotCS5kaXNjb25uZWN0ID0JdXNibmV0X2Rpc2Nvbm5lY3QsCi0JLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKLQkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKLX07Ci0KLS8qIERlZmF1bHQgZXRodG9vbF9vcHMgYXNzaWduZWQuICBEZXZpY2VzIGNhbiBvdmVycmlkZSBpbiB0aGVpciBiaW5kKCkgcm91dGluZSAqLwotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB1c2JuZXRfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvCQk9IHVzYm5ldF9nZXRfZHJ2aW5mbywKLQkuZ2V0X2xpbmsJCT0gdXNibmV0X2dldF9saW5rLAotCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKLQkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IF9faW5pdCB1c2JuZXRfaW5pdCAodm9pZCkKLXsKLQkvLyBjb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhlc2Ugb3V0CisJLyogY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIHRoaXMgb3V0ICovCiAJQlVHX09OIChzaXplb2YgKCgoc3RydWN0IHNrX2J1ZmYgKikwKS0+Y2IpCiAJCQk8IHNpemVvZiAoc3RydWN0IHNrYl9kYXRhKSk7Ci0jaWZkZWYJQ09ORklHX1VTQl9DRENFVEhFUgotCUJVR19PTiAoKHNpemVvZiAoKChzdHJ1Y3QgdXNibmV0ICopMCktPmRhdGEpCi0JCQk8IHNpemVvZiAoc3RydWN0IGNkY19zdGF0ZSkpKTsKLSNlbmRpZgogCiAJcmFuZG9tX2V0aGVyX2FkZHIobm9kZV9pZCk7Ci0KLSAJcmV0dXJuIHVzYl9yZWdpc3RlcigmdXNibmV0X2RyaXZlcik7CisgCXJldHVybiAwOwogfQotbW9kdWxlX2luaXQgKHVzYm5ldF9pbml0KTsKK21vZHVsZV9pbml0KHVzYm5ldF9pbml0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IHVzYm5ldF9leGl0ICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVzYm5ldF9leGl0KHZvaWQpCiB7Ci0gCXVzYl9kZXJlZ2lzdGVyICgmdXNibmV0X2RyaXZlcik7CiB9Ci1tb2R1bGVfZXhpdCAodXNibmV0X2V4aXQpOworbW9kdWxlX2V4aXQodXNibmV0X2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SICgiRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJVU0IgSG9zdC10by1Ib3N0IExpbmsgRHJpdmVycyAobnVtZXJvdXMgdmVuZG9ycykiKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgbmV0d29yayBkcml2ZXIgZnJhbWV3b3JrIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmggYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMGFiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIFVTQiBOZXR3b3JraW5nIExpbmsgSW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBEYXZpZCBIb2xsaXMgPGRob2xsaXNAZGF2ZWhvbGxpcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKworI2lmbmRlZglfX1VTQk5FVF9ICisjZGVmaW5lCV9fVVNCTkVUX0gKKworCisvKiBpbnRlcmZhY2UgZnJvbSB1c2JuZXQgY29yZSB0byBlYWNoIFVTQiBuZXR3b3JraW5nIGxpbmsgd2UgaGFuZGxlICovCitzdHJ1Y3QgdXNibmV0IHsKKwkvKiBob3VzZWtlZXBpbmcgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKKwlzdHJ1Y3QgZHJpdmVyX2luZm8JKmRyaXZlcl9pbmZvOworCXdhaXRfcXVldWVfaGVhZF90CSp3YWl0OworCisJLyogaS9vIGluZm86IHBpcGVzIGV0YyAqLworCXVuc2lnbmVkCQlpbiwgb3V0OworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqc3RhdHVzOworCXVuc2lnbmVkCQltYXhwYWNrZXQ7CisJc3RydWN0IHRpbWVyX2xpc3QJZGVsYXk7CisKKwkvKiBwcm90b2NvbC9pbnRlcmZhY2Ugc3RhdGUgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCWludAkJCW1zZ19lbmFibGU7CisJdW5zaWduZWQgbG9uZwkJZGF0YSBbNV07CisJdTMyCQkJeGlkOworCXUzMgkJCWhhcmRfbXR1OwkvKiBjb3VudCBhbnkgZXh0cmEgZnJhbWluZyAqLworCXNpemVfdAkJICAgICAgICByeF91cmJfc2l6ZTsgICAgLyogc2l6ZSBmb3IgcnggdXJicyAgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpOworCisJLyogdmFyaW91cyBraW5kcyBvZiBwZW5kaW5nIGRyaXZlciB3b3JrICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeHE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZAl0eHE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZAlkb25lOworCXN0cnVjdCB1cmIJCSppbnRlcnJ1cHQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWJoOworCisJc3RydWN0IHdvcmtfc3RydWN0CWtldmVudDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyMJCWRlZmluZSBFVkVOVF9UWF9IQUxUCTAKKyMJCWRlZmluZSBFVkVOVF9SWF9IQUxUCTEKKyMJCWRlZmluZSBFVkVOVF9SWF9NRU1PUlkJMgorIwkJZGVmaW5lIEVWRU5UX1NUU19TUExJVAkzCisjCQlkZWZpbmUgRVZFTlRfTElOS19SRVNFVAk0Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXJfb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIHRvX3VzYl9kcml2ZXIoaW50Zi0+ZGV2LmRyaXZlcik7Cit9CisKKy8qIGludGVyZmFjZSBmcm9tIHRoZSBkZXZpY2UvZnJhbWluZyBsZXZlbCAibWluaWRyaXZlciIgdG8gY29yZSAqLworc3RydWN0IGRyaXZlcl9pbmZvIHsKKwljaGFyCQkqZGVzY3JpcHRpb247CisKKwlpbnQJCWZsYWdzOworLyogZnJhbWluZyBpcyBDREMgRXRoZXJuZXQsIG5vdCB3cml0aW5nIFpMUHMgKGh3IGlzc3VlcyksIG9yIG9wdGlvbmFsbHk6ICovCisjZGVmaW5lIEZMQUdfRlJBTUlOR19OQwkweDAwMDEJCS8qIGd1YXJkIGFnYWluc3QgZGV2aWNlIGRyb3BvdXRzICovCisjZGVmaW5lIEZMQUdfRlJBTUlOR19HTAkweDAwMDIJCS8qIGdlbmVsaW5rIGJhdGNoZXMgcGFja2V0cyAqLworI2RlZmluZSBGTEFHX0ZSQU1JTkdfWgkweDAwMDQJCS8qIHphdXJ1cyBhZGRzIGEgdHJhaWxlciAqLworI2RlZmluZSBGTEFHX0ZSQU1JTkdfUk4JMHgwMDA4CQkvKiBSTkRJUyBiYXRjaGVzLCBwbHVzIGh1Z2UgaGVhZGVyICovCisKKyNkZWZpbmUgRkxBR19OT19TRVRJTlQJMHgwMDEwCQkvKiBkZXZpY2UgY2FuJ3Qgc2V0X2ludGVyZmFjZSgpICovCisjZGVmaW5lIEZMQUdfRVRIRVIJMHgwMDIwCQkvKiBtYXliZSB1c2UgImV0aCVkIiBuYW1lcyAqLworCisjZGVmaW5lIEZMQUdfRlJBTUlOR19BWCAweDAwNDAgICAgICAgICAgLyogQVg4ODc3Mi8xNzggcGFja2V0cyAqLworCisJLyogaW5pdCBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgb3IgY2F1c2UgcHJvYmUoKSBmYWlsdXJlICovCisJaW50CSgqYmluZCkoc3RydWN0IHVzYm5ldCAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCS8qIGNsZWFudXAgZGV2aWNlIC4uLiBjYW4gc2xlZXAsIGJ1dCBjYW4ndCBmYWlsICovCisJdm9pZAkoKnVuYmluZCkoc3RydWN0IHVzYm5ldCAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCS8qIHJlc2V0IGRldmljZSAuLi4gY2FuIHNsZWVwICovCisJaW50CSgqcmVzZXQpKHN0cnVjdCB1c2JuZXQgKik7CisKKwkvKiBzZWUgaWYgcGVlciBpcyBjb25uZWN0ZWQgLi4uIGNhbiBzbGVlcCAqLworCWludAkoKmNoZWNrX2Nvbm5lY3QpKHN0cnVjdCB1c2JuZXQgKik7CisKKwkvKiBmb3Igc3RhdHVzIHBvbGxpbmcgKi8KKwl2b2lkCSgqc3RhdHVzKShzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1cmIgKik7CisKKwkvKiBsaW5rIHJlc2V0IGhhbmRsaW5nLCBjYWxsZWQgZnJvbSBkZWZlcl9rZXZlbnQgKi8KKwlpbnQJKCpsaW5rX3Jlc2V0KShzdHJ1Y3QgdXNibmV0ICopOworCisJLyogZml4dXAgcnggcGFja2V0IChzdHJpcCBmcmFtaW5nKSAqLworCWludAkoKnJ4X2ZpeHVwKShzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisJLyogZml4dXAgdHggcGFja2V0IChhZGQgZnJhbWluZykgKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqKCp0eF9maXh1cCkoc3RydWN0IHVzYm5ldCAqZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGZsYWdzKTsKKworCS8qIGZvciBuZXcgZGV2aWNlcywgdXNlIHRoZSBkZXNjcmlwdG9yLXJlYWRpbmcgY29kZSBpbnN0ZWFkICovCisJaW50CQlpbjsJCS8qIHJ4IGVuZHBvaW50ICovCisJaW50CQlvdXQ7CQkvKiB0eCBlbmRwb2ludCAqLworCisJdW5zaWduZWQgbG9uZwlkYXRhOwkJLyogTWlzYyBkcml2ZXIgc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyogTWluaWRyaXZlcnMgYXJlIGp1c3QgZHJpdmVycyB1c2luZyB0aGUgInVzYm5ldCIgY29yZSBhcyBhIHBvd2VyZnVsCisgKiBuZXR3b3JrLXNwZWNpZmljIHN1YnJvdXRpbmUgbGlicmFyeSAuLi4gdGhhdCBoYXBwZW5zIHRvIGRvIHByZXR0eQorICogbXVjaCBldmVyeXRoaW5nIGV4Y2VwdCBjdXN0b20gZnJhbWluZyBhbmQgY2hpcC1zcGVjaWZpYyBzdHVmZi4KKyAqLworZXh0ZXJuIGludCB1c2JuZXRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CitleHRlcm4gaW50IHVzYm5ldF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBwbV9tZXNzYWdlX3QgKTsKK2V4dGVybiBpbnQgdXNibmV0X3Jlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CitleHRlcm4gdm9pZCB1c2JuZXRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworCisvKiBEcml2ZXJzIHRoYXQgcmV1c2Ugc29tZSBvZiB0aGUgc3RhbmRhcmQgVVNCIENEQyBpbmZyYXN0cnVjdHVyZQorICogKG5vdGFibHksIHVzaW5nIG11bHRpcGxlIGludGVyZmFjZXMgYWNjb3JkaW5nIHRvIHRoZSB0aGUgQ0RDCisgKiB1bmlvbiBkZXNjcmlwdG9yKSBnZXQgc29tZSBoZWxwZXIgY29kZS4KKyAqLworc3RydWN0IGNkY19zdGF0ZSB7CisJc3RydWN0IHVzYl9jZGNfaGVhZGVyX2Rlc2MJKmhlYWRlcjsKKwlzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjCSp1OworCXN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MJKmV0aGVyOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCQkqY29udHJvbDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkJKmRhdGE7Cit9OworCitleHRlcm4gaW50IHVzYm5ldF9nZW5lcmljX2NkY19iaW5kIChzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworZXh0ZXJuIHZvaWQgdXNibmV0X2NkY191bmJpbmQgKHN0cnVjdCB1c2JuZXQgKiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKy8qIENEQyBhbmQgUk5ESVMgc3VwcG9ydCB0aGUgc2FtZSBob3N0LWNob3NlbiBwYWNrZXQgZmlsdGVycyBmb3IgSU4gdHJhbnNmZXJzICovCisjZGVmaW5lCURFRkFVTFRfRklMVEVSCShVU0JfQ0RDX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCBcCisgCQkJfFVTQl9DRENfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCBcCisgCQkJfFVTQl9DRENfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMgXAorIAkJCXxVU0JfQ0RDX1BBQ0tFVF9UWVBFX0RJUkVDVEVEKQorCisKKy8qIHdlIHJlY29yZCB0aGUgc3RhdGUgZm9yIGVhY2ggb2Ygb3VyIHF1ZXVlZCBza2JzICovCitlbnVtIHNrYl9zdGF0ZSB7CisJaWxsZWdhbCA9IDAsCisJdHhfc3RhcnQsIHR4X2RvbmUsCisJcnhfc3RhcnQsIHJ4X2RvbmUsIHJ4X2NsZWFudXAKK307CisKK3N0cnVjdCBza2JfZGF0YSB7CS8qIHNrYi0+Y2IgaXMgb25lIG9mIHRoZXNlICovCisJc3RydWN0IHVyYgkJKnVyYjsKKwlzdHJ1Y3QgdXNibmV0CQkqZGV2OworCWVudW0gc2tiX3N0YXRlCQlzdGF0ZTsKKwlzaXplX3QJCQlsZW5ndGg7Cit9OworCisKK2V4dGVybiBpbnQgdXNibmV0X2dldF9lbmRwb2ludHMoc3RydWN0IHVzYm5ldCAqLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKK2V4dGVybiB2b2lkIHVzYm5ldF9kZWZlcl9rZXZlbnQgKHN0cnVjdCB1c2JuZXQgKiwgaW50KTsKK2V4dGVybiB2b2lkIHVzYm5ldF9za2JfcmV0dXJuIChzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCBza19idWZmICopOworCitleHRlcm4gdTMyIHVzYm5ldF9nZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgdXNibmV0X3NldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyKTsKK2V4dGVybiB2b2lkIHVzYm5ldF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqKTsKKworLyogbWVzc2FnaW5nIHN1cHBvcnQgaW5jbHVkZXMgdGhlIGludGVyZmFjZSBuYW1lLCBzbyBpdCBtdXN0IG5vdCBiZQorICogdXNlZCBiZWZvcmUgaXQgaGFzIG9uZSAuLi4gbm90YWJseSwgaW4gbWluaWRyaXZlciBiaW5kKCkgY2FsbHMuCisgKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkZXZkYmcodXNibmV0LCBmbXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIGRldmVycih1c2JuZXQsIGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpCisjZGVmaW5lIGRldndhcm4odXNibmV0LCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZtdCAiXG4iICwgKHVzYm5ldCktPm5ldC0+bmFtZSAsICMjIGFyZykKKworI2RlZmluZSBkZXZpbmZvKHVzYm5ldCwgZm10LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQgIlxuIiAsICh1c2JuZXQpLT5uZXQtPm5hbWUgLCAjIyBhcmcpOyBcCisKKworI2VuZGlmCS8qIF9fVVNCTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC96YXVydXMuYyBiL2RyaXZlcnMvdXNiL25ldC96YXVydXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTNiODkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbmV0L3phdXJ1cy5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLy8gI2RlZmluZQlERUJVRwkJCS8vIGVycm9yIHBhdGggbWVzc2FnZXMsIGV4dHJhIGluZm8KKy8vICNkZWZpbmUJVkVSQk9TRQkJCS8vIG1vcmU7IHN1Y2Nlc3MgbWVzc2FnZXMKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmZGVmCUNPTkZJR19VU0JfREVCVUcKKyMgICBkZWZpbmUgREVCVUcKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jZGMuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisKKy8qCisgKiBBbGwga25vd24gWmF1cmlpIGxpZSBhYm91dCB0aGVpciBzdGFuZGFyZHMgY29uZm9ybWFuY2UuICBBdCBsZWFzdAorICogdGhlIGVhcmxpZXN0IFNBLTExMDAgbW9kZWxzIGxpZSBieSBzYXlpbmcgdGhleSBzdXBwb3J0IENEQyBFdGhlcm5ldC4KKyAqIFNvbWUgbGF0ZXIgbW9kZWxzIChlc3BlY2lhbGx5IFBYQS0yNXggYW5kIFBYQS0yN3ggYmFzZWQgb25lcykgbGllCisgKiBhbmQgc2F5IHRoZXkgc3VwcG9ydCBDREMgTURMTSAoZm9yIGFjY2VzcyB0byBjZWxsIHBob25lIG1vZGVtcykuCisgKgorICogVGhlcmUgYXJlIG5vbi1aYXVydXMgcHJvZHVjdHMgdGhhdCB1c2UgdGhlc2Ugc2FtZSBwcm90b2NvbHMgdG9vLgorICoKKyAqIFRoZSBhbm5veWluZyB0aGluZyBpcyB0aGF0IGF0IHRoZSBzYW1lIHRpbWUgU2hhcnAgd2FzIGRldmVsb3BpbmcKKyAqIHRoYXQgYW5ub3lpbmcgc3RhbmRhcmRzLWJyZWFraW5nIHNvZnR3YXJlLCB0aGUgTGludXggY29tbXVuaXR5IGhhZAorICogYSBzaW1wbGUgIkNEQyBTdWJzZXQiIHdvcmtpbmcgcmVsaWFibHkgb24gdGhlIHNhbWUgU0EtMTEwMCBoYXJkd2FyZS4KKyAqIFRoYXQgaXMsIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYnV0IG5vdCB2aW9sYXRpbmcgc3RhbmRhcmRzLgorICoKKyAqIFRoZSBDREMgRXRoZXJuZXQgbm9uY29uZm9ybWFuY2UgcG9pbnRzIGFyZSB0cm91Ymxlc29tZSB0byBob3N0cworICogd2l0aCBhIHRydWUgQ0RDIEV0aGVybmV0IGltcGxlbWVudGF0aW9uOgorICogICAtIEZyYW1pbmcgYXBwZW5kcyBhIENSQywgd2hpY2ggdGhlIHNwZWMgc2F5cyBkcml2ZXJzICJtdXN0IG5vdCIgZG87CisgKiAgIC0gVHJhbnNmZXJzIGRhdGEgaW4gYWx0c2V0dGluZyB6ZXJvLCBpbnN0ZWFkIG9mIGFsdHNldHRpbmcgMTsKKyAqICAgLSBBbGwgdGhlc2UgcGVyaXBoZXJhbHMgdXNlIHRoZSBzYW1lIGV0aGVybmV0IGFkZHJlc3MuCisgKgorICogVGhlIENEQyBNRExNIG5vbmNvbmZvcm1hbmNlIGlzIGxlc3MgaW1tZWRpYXRlbHkgdHJvdWJsZXNvbWUsIHNpbmNlIGFsbAorICogTURMTSBpbXBsZW1lbnRhdGlvbnMgYXJlIHF1YXNpLXByb3ByaWV0YXJ5IGFueXdheS4KKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoremF1cnVzX3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50CQkJcGFkbGVuOworCXN0cnVjdCBza19idWZmCQkqc2tiMjsKKworCXBhZGxlbiA9IDI7CisJaWYgKCFza2JfY2xvbmVkKHNrYikpIHsKKwkJaW50CXRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CisJCWlmICgocGFkbGVuICsgNCkgPD0gdGFpbHJvb20pCisJCQlnb3RvIGRvbmU7CisJfQorCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLCAwLCA0ICsgcGFkbGVuLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlza2IgPSBza2IyOworCWlmIChza2IpIHsKKwkJdTMyCQlmY3M7Citkb25lOgorCQlmY3MgPSBjcmMzMl9sZSh+MCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWZjcyA9IH5mY3M7CisKKwkJKnNrYl9wdXQgKHNrYiwgMSkgPSBmY3MgICAgICAgJiAweGZmOworCQkqc2tiX3B1dCAoc2tiLCAxKSA9IChmY3M+PiA4KSAmIDB4ZmY7CisJCSpza2JfcHV0IChza2IsIDEpID0gKGZjcz4+MTYpICYgMHhmZjsKKwkJKnNrYl9wdXQgKHNrYiwgMSkgPSAoZmNzPj4yNCkgJiAweGZmOworCX0KKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHphdXJ1c19iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJLyogQmVsY2FycmEncyBmdW5reSBmcmFtaW5nIGhhcyBvdGhlciBvcHRpb25zOyBtb3N0bHkKKwkgKiBUUkFJTEVSUyAoISkgd2l0aCA0IGJ5dGVzIENSQywgYW5kIG1heWJlIDIgcGFkIGJ5dGVzLgorCSAqLworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gNjsKKwlkZXYtPnJ4X3VyYl9zaXplID0gZGV2LT5uZXQtPmhhcmRfaGVhZGVyX2xlbiArIGRldi0+bmV0LT5tdHU7CisJcmV0dXJuIHVzYm5ldF9nZW5lcmljX2NkY19iaW5kKGRldiwgaW50Zik7Cit9CisKKy8qIFBEQSBzdHlsZSBkZXZpY2VzIGFyZSBhbHdheXMgY29ubmVjdGVkIGlmIHByZXNlbnQgKi8KK3N0YXRpYyBpbnQgYWx3YXlzX2Nvbm5lY3RlZCAoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCXphdXJ1c19zbDV4MDBfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkiU2hhcnAgWmF1cnVzIFNMLTV4MDAiLAorCS5mbGFncyA9CUZMQUdfRlJBTUlOR19aLAorCS5jaGVja19jb25uZWN0ID0gYWx3YXlzX2Nvbm5lY3RlZCwKKwkuYmluZCA9CQl6YXVydXNfYmluZCwKKwkudW5iaW5kID0JdXNibmV0X2NkY191bmJpbmQsCisJLnR4X2ZpeHVwID0gCXphdXJ1c190eF9maXh1cCwKK307CisjZGVmaW5lCVpBVVJVU19TVFJPTkdBUk1fSU5GTwkoKHVuc2lnbmVkIGxvbmcpJnphdXJ1c19zbDV4MDBfaW5mbykKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwl6YXVydXNfcHhhX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uID0JIlNoYXJwIFphdXJ1cywgUFhBLTJ4eCBiYXNlZCIsCisJLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCisJLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAorCS5iaW5kID0JCXphdXJ1c19iaW5kLAorCS51bmJpbmQgPQl1c2JuZXRfY2RjX3VuYmluZCwKKwkudHhfZml4dXAgPSAJemF1cnVzX3R4X2ZpeHVwLAorfTsKKyNkZWZpbmUJWkFVUlVTX1BYQV9JTkZPCQkoKHVuc2lnbmVkIGxvbmcpJnphdXJ1c19weGFfaW5mbykKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbwlvbHltcHVzX214bF9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9CSJPbHltcHVzIFIxMDAwIiwKKwkuZmxhZ3MgPQlGTEFHX0ZSQU1JTkdfWiwKKwkuY2hlY2tfY29ubmVjdCA9IGFsd2F5c19jb25uZWN0ZWQsCisJLmJpbmQgPQkJemF1cnVzX2JpbmQsCisJLnVuYmluZCA9CXVzYm5ldF9jZGNfdW5iaW5kLAorCS50eF9maXh1cCA9IAl6YXVydXNfdHhfZml4dXAsCit9OworI2RlZmluZQlPTFlNUFVTX01YTF9JTkZPCSgodW5zaWduZWQgbG9uZykmb2x5bXB1c19teGxfaW5mbykKKworCisvKiBTb21lIG1vcmUgcmVjZW50IHByb2R1Y3RzIHVzaW5nIExpbmVvL0JlbGNhcnJhIGNvZGUgd2lsbCB3cm9uZ2x5IGNsYWltCisgKiBDREMgTURMTSBjb25mb3JtYW5jZS4gIFRoZXkgYXJlbid0IGNvbmZvcm1hbnQ6ICBkYXRhIGVuZHBvaW50cyBsaXZlCisgKiBpbiB0aGUgY29udHJvbCBpbnRlcmZhY2UsIHRoZXJlJ3Mgbm8gZGF0YSBpbnRlcmZhY2UsIGFuZCBpdCdzIG5vdCB1c2VkCisgKiB0byB0YWxrIHRvIGEgY2VsbCBwaG9uZSByYWRpby4gIEJ1dCBhdCBsZWFzdCB3ZSBjYW4gZGV0ZWN0IHRoZXNlIHR3bworICogcHNldWRvLWNsYXNzZXMsIHJhdGhlciB0aGFuIGdyb3dpbmcgdGhpcyBwcm9kdWN0IGxpc3Qgd2l0aCBlbnRyaWVzIGZvcgorICogZWFjaCBuZXcgbm9uY29uZm9ybWFudCBwcm9kdWN0IChzaWdoKS4KKyAqLworc3RhdGljIGNvbnN0IHU4IHNhZmVfZ3VpZFsxNl0gPSB7CisJMHg1ZCwgMHgzNCwgMHhjZiwgMHg2NiwgMHgxMSwgMHgxOCwgMHgxMSwgMHhkNiwKKwkweGEyLCAweDFhLCAweDAwLCAweDAxLCAweDAyLCAweGNhLCAweDlhLCAweDdmLAorfTsKK3N0YXRpYyBjb25zdCB1OCBibGFuX2d1aWRbMTZdID0geworCTB4NzQsIDB4ZjAsIDB4M2QsIDB4YmQsIDB4MWUsIDB4YzEsIDB4NDQsIDB4NzAsCisJMHhhMywgMHg2NywgMHg3MSwgMHgzNCwgMHhjOSwgMHhmNSwgMHg1NCwgMHgzNywKK307CisKK3N0YXRpYyBpbnQgYmxhbl9tZGxtX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwl1OAkJCQkqYnVmID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmV4dHJhOworCWludAkJCQlsZW4gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZXh0cmFsZW47CisJc3RydWN0IHVzYl9jZGNfbWRsbV9kZXNjCSpkZXNjID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2NkY19tZGxtX2RldGFpbF9kZXNjCSpkZXRhaWwgPSBOVUxMOworCisJd2hpbGUgKGxlbiA+IDMpIHsKKwkJaWYgKGJ1ZiBbMV0gIT0gVVNCX0RUX0NTX0lOVEVSRkFDRSkKKwkJCWdvdG8gbmV4dF9kZXNjOworCisJCS8qIHVzZSBiRGVzY3JpcHRvclN1YlR5cGUsIGFuZCBqdXN0IHZlcmlmeSB0aGF0IHdlIGdldCBhCisJCSAqICJCTEFOIiAob3IgIlNBRkUiKSBkZXNjcmlwdG9yLgorCQkgKi8KKwkJc3dpdGNoIChidWYgWzJdKSB7CisJCWNhc2UgVVNCX0NEQ19NRExNX1RZUEU6CisJCQlpZiAoZGVzYykgeworCQkJCWRldl9kYmcoJmludGYtPmRldiwgImV4dHJhIE1ETE1cbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlkZXNjID0gKHZvaWQgKikgYnVmOworCQkJaWYgKGRlc2MtPmJMZW5ndGggIT0gc2l6ZW9mICpkZXNjKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiTURMTSBsZW4gJXVcbiIsCisJCQkJCWRlc2MtPmJMZW5ndGgpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQkvKiBleHBlY3QgYmNkVmVyc2lvbiAxLjAsIGlnbm9yZSAqLworCQkJaWYgKG1lbWNtcCgmZGVzYy0+YkdVSUQsIGJsYW5fZ3VpZCwgMTYpCisJCQkJICAgICYmIG1lbWNtcCgmZGVzYy0+YkdVSUQsIHNhZmVfZ3VpZCwgMTYpICkgeworCQkJCS8qIGhleSwgdGhpcyBvbmUgbWlnaHQgX3JlYWxseV8gYmUgTURMTSEgKi8KKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJNRExNIGd1aWRcbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBVU0JfQ0RDX01ETE1fREVUQUlMX1RZUEU6CisJCQlpZiAoZGV0YWlsKSB7CisJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiZXh0cmEgTURMTSBkZXRhaWxcbiIpOworCQkJCWdvdG8gYmFkX2Rlc2M7CisJCQl9CisJCQlkZXRhaWwgPSAodm9pZCAqKSBidWY7CisJCQlzd2l0Y2ggKGRldGFpbC0+Ykd1aWREZXNjcmlwdG9yVHlwZSkgeworCQkJY2FzZSAwOgkJCS8qICJTQUZFIiAqLworCQkJCWlmIChkZXRhaWwtPmJMZW5ndGggIT0gKHNpemVvZiAqZGV0YWlsICsgMikpCisJCQkJCWdvdG8gYmFkX2RldGFpbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJCQkvKiAiQkxBTiIgKi8KKwkJCQlpZiAoZGV0YWlsLT5iTGVuZ3RoICE9IChzaXplb2YgKmRldGFpbCArIDMpKQorCQkJCQlnb3RvIGJhZF9kZXRhaWw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gYmFkX2RldGFpbDsKKwkJCX0KKworCQkJLyogYXNzdW1pbmcgd2UgZWl0aGVyIG5vdGljZWQgQkxBTiBhbHJlYWR5LCBvciB3aWxsCisJCQkgKiBmaW5kIGl0IHNvb24sIHRoZXJlIGFyZSBzb21lIGRhdGEgYnl0ZXMgaGVyZToKKwkJCSAqICAtIGJtTmV0d29ya0NhcGFiaWxpdGllcyAodW51c2VkKQorCQkJICogIC0gYm1EYXRhQ2FwYWJpbGl0aWVzIChiaXRzLCBzZWUgYmVsb3cpCisJCQkgKiAgLSBiUGFkIChpZ25vcmVkLCBmb3IgUEFEQUZURVIgLS0gQkxBTi1vbmx5KQorCQkJICogYml0cyBhcmU6CisJCQkgKiAgLSAweDAxIC0tIFphdXJ1cyBmcmFtaW5nIChhZGQgQ1JDKQorCQkJICogIC0gMHgwMiAtLSBQQURCRUZPUkUgKENSQyBpbmNsdWRlcyBzb21lIHBhZGRpbmcpCisJCQkgKiAgLSAweDA0IC0tIFBBREFGVEVSIChzb21lIHBhZGRpbmcgYWZ0ZXIgQ1JDKQorCQkJICogIC0gMHgwOCAtLSAiZmVybWF0IiBwYWNrZXQgbWFuZ2xpbmcgKGZvciBodyBidWdzKQorCQkJICogdGhlIFBBREJFRk9SRSBhcHBlYXJzIG5vdCB0byBtYXR0ZXI7IHdlIGludGVyb3AKKwkJCSAqIHdpdGggZGV2aWNlcyB0aGF0IHVzZSBpdCBhbmQgdGhvc2UgdGhhdCBkb24ndC4KKwkJCSAqLworCQkJaWYgKChkZXRhaWwtPmJEZXRhaWxEYXRhWzFdICYgfjB4MDIpICE9IDB4MDEpIHsKKwkJCQkvKiBibURhdGFDYXBhYmlsaXRlcyA9PSAwIHdvdWxkIGJlIGZpbmUgdG9vLAorCQkJCSAqIGJ1dCBmcmFtaW5nIGlzIG1pbmlkcml2ZXItY291cGxlZCBmb3Igbm93LgorCQkJCSAqLworYmFkX2RldGFpbDoKKwkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsCisJCQkJCQkiYmFkIE1ETE0gZGV0YWlsLCAlZCAlZCAlZFxuIiwKKwkJCQkJCWRldGFpbC0+Ykxlbmd0aCwKKwkJCQkJCWRldGFpbC0+YkRldGFpbERhdGFbMF0sCisJCQkJCQlkZXRhaWwtPmJEZXRhaWxEYXRhWzJdKTsKKwkJCQlnb3RvIGJhZF9kZXNjOworCQkJfQorCQkJYnJlYWs7CisJCX0KK25leHRfZGVzYzoKKwkJbGVuIC09IGJ1ZiBbMF07CS8qIGJMZW5ndGggKi8KKwkJYnVmICs9IGJ1ZiBbMF07CisJfQorCisJaWYgKCFkZXNjIHx8ICFkZXRhaWwpIHsKKwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAibWlzc2luZyBjZGMgbWRsbSAlcyVzZGVzY3JpcHRvclxuIiwKKwkJCWRlc2MgPyAiIiA6ICJmdW5jICIsCisJCQlkZXRhaWwgPyAiIiA6ICJkZXRhaWwgIik7CisJCWdvdG8gYmFkX2Rlc2M7CisJfQorCisJLyogVGhlcmUncyBwcm9iYWJseSBhIENEQyBFdGhlcm5ldCBkZXNjcmlwdG9yIHRoZXJlLCBidXQgd2UgY2FuJ3QKKwkgKiByZWx5IG9uIHRoZSBFdGhlcm5ldCBhZGRyZXNzIGl0IHByb3ZpZGVzIHNpbmNlIG5vdCBhbGwgdmVuZG9ycworCSAqIGJvdGhlciB0byBtYWtlIGl0IHVuaXF1ZS4gIExpa2V3aXNlIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJhY2tpbmcKKwkgKiBvZiB0aGUgQ0RDIGV2ZW50IG5vdGlmaWNhdGlvbnMuCisJICovCisJcmV0dXJuIHVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldiwgaW50Zik7CisKK2JhZF9kZXNjOgorCWRldl9pbmZvKCZkZXYtPnVkZXYtPmRldiwgInVuc3VwcG9ydGVkIE1ETE0gZGVzY3JpcHRvcnNcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvCWJvZ3VzX21kbG1faW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPQkicHNldWRvLU1ETE0gKEJMQU4pIGRldmljZSIsCisJLmZsYWdzID0JRkxBR19GUkFNSU5HX1osCisJLmNoZWNrX2Nvbm5lY3QgPSBhbHdheXNfY29ubmVjdGVkLAorCS50eF9maXh1cCA9IAl6YXVydXNfdHhfZml4dXAsCisJLmJpbmQgPQkJYmxhbl9tZGxtX2JpbmQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQJcHJvZHVjdHMgW10gPSB7CisjZGVmaW5lCVpBVVJVU19NQVNURVJfSU5URVJGQUNFIFwKKwkuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX0NPTU0sIFwKKwkuYkludGVyZmFjZVN1YkNsYXNzCT0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVCwgXAorCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSBVU0JfQ0RDX1BST1RPX05PTkUKKworLyogU0EtMTEwMCBiYXNlZCBTaGFycCBaYXVydXMgKCJjb2xsaWUiKSwgb3IgY29tcGF0aWJsZS4gKi8KK3sKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA0LAorCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19TVFJPTkdBUk1fSU5GTywKK30sCisKKy8qIFBYQS0yeHggYmFzZWQgbW9kZWxzIGFyZSBhbHNvIGx5aW5nLWFib3V0LWNkYy4gIElmIHlvdSBhZGQgYW55CisgKiBtb3JlIGRldmljZXMgdGhhdCBjbGFpbSB0byBiZSBDREMgRXRoZXJuZXQsIG1ha2Ugc3VyZSB0aGV5IGdldAorICogYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBpbiBjZGNfZXRoZXIgdG9vLgorICoKKyAqIE5PVEU6ICBPcGVuWmF1cnVzIHZlcnNpb25zIHdpdGggMi42IGtlcm5lbHMgd29uJ3QgdXNlIHRoZXNlIGVudHJpZXMsCisgKiB1bmxpa2UgdGhlIG9sZGVyIG9uZXMgd2l0aCAyLjQgImVtYmVkaXgiIGtlcm5lbHMuCisgKi8KK3sKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA1LAkvKiBBLTMwMCAqLworCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKK30sIHsKKwkubWF0Y2hfZmxhZ3MJPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJCSAgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IJCT0gMHgwNERELAorCS5pZFByb2R1Y3QJCT0gMHg4MDA2LAkvKiBCLTUwMC9TTC01NjAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAorfSwgeworCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCSAgICAgICAgICB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvcgkJPSAweDA0REQsCisJLmlkUHJvZHVjdAkJPSAweDgwMDcsCS8qIEMtNzAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAorfSwgeworCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKKwkuaWRQcm9kdWN0ICAgICAgICAgICAgICA9IDB4OTAzMSwJLyogQy03NTAgQy03NjAgKi8KKwlaQVVSVVNfTUFTVEVSX0lOVEVSRkFDRSwKKwkuZHJpdmVyX2luZm8gPSBaQVVSVVNfUFhBX0lORk8sCit9LCB7CisJLm1hdGNoX2ZsYWdzICAgID0gICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPCisJCSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCS5pZFZlbmRvciAgICAgICAgICAgICAgID0gMHgwNERELAorCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDMyLAkvKiBTTC02MDAwICovCisJWkFVUlVTX01BU1RFUl9JTlRFUkZBQ0UsCisJLmRyaXZlcl9pbmZvID0gWkFVUlVTX1BYQV9JTkZPLAorfSwgeworCS5tYXRjaF9mbGFncyAgICA9ICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTworCQkgfCBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkuaWRWZW5kb3IgICAgICAgICAgICAgICA9IDB4MDRERCwKKwkvKiByZXBvcnRlZCB3aXRoIHNvbWUgQzg2MCB1bml0cyAqLworCS5pZFByb2R1Y3QgICAgICAgICAgICAgID0gMHg5MDUwLAkvKiBDLTg2MCAqLworCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKK30sCisKKworLyogQXQgbGVhc3Qgc29tZSBvZiB0aGUgbmV3ZXN0IFBYQSB1bml0cyBoYXZlIHZlcnkgZGlmZmVyZW50IGxpZXMgYWJvdXQKKyAqIHRoZWlyIHN0YW5kYXJkcyBzdXBwb3J0OiAgdGhleSBjbGFpbSB0byBiZSBjZWxsIHBob25lcyBvZmZlcmluZworICogZGlyZWN0IGFjY2VzcyB0byB0aGVpciByYWRpb3MhICAoTm8sIHRoZXkgZG9uJ3QgY29uZm9ybSB0byBDREMgTURMTS4pCisgKi8KK3sKKwlVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfTURMTSwKKwkJCVVTQl9DRENfUFJPVE9fTk9ORSksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZib2d1c19tZGxtX2luZm8sCit9LAorCisvKiBPbHltcHVzIGhhcyBzb21lIG1vZGVscyB3aXRoIGEgWmF1cnVzLWNvbXBhdGlibGUgb3B0aW9uLgorICogUi0xMDAwIHVzZXMgYSBGcmVlU2NhbGUgaS5NWEwgY3B1IChBUk12NFQpCisgKi8KK3sKKwkubWF0Y2hfZmxhZ3MgICAgPSAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8KKwkJIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yICAgICAgICAgICAgICAgPSAweDA3QjQsCisJLmlkUHJvZHVjdCAgICAgICAgICAgICAgPSAweDBGMDIsCS8qIFItMTAwMCAqLworCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAorCS5kcml2ZXJfaW5mbyA9IE9MWU1QVVNfTVhMX0lORk8sCit9LAorCXsgfSwJCS8vIEVORAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB6YXVydXNfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJ6YXVydXMiLAorCS5pZF90YWJsZSA9CXByb2R1Y3RzLAorCS5wcm9iZSA9CXVzYm5ldF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYm5ldF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB6YXVydXNfaW5pdCh2b2lkKQoreworIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZ6YXVydXNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHphdXJ1c19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHphdXJ1c19leGl0KHZvaWQpCit7CisgCXVzYl9kZXJlZ2lzdGVyKCZ6YXVydXNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHphdXJ1c19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF2ZWwgTWFjaGVrLCBEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaGFycCBaYXVydXMgUERBLCBhbmQgY29tcGF0aWJsZSBwcm9kdWN0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5jIGIvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5jCmluZGV4IGZjMDEzOTcuLmM0ZTQ3OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmMKQEAgLTg0Nyw3ICs4NDcsNiBAQAogCQlyZXR1cm47CiAJZGV2X3dhcm4oJnpkLT51c2ItPmRldiwgIiVzOiBUWCB0aW1lb3V0LCBzaG9vdGluZyBkb3duIHVyYlxuIiwKIAkgICAgZGV2LT5uYW1lKTsKLQl6ZC0+dHhfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCXVzYl91bmxpbmtfdXJiKHpkLT50eF91cmIpOwogCXpkLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkvKiBSZXN0YXJ0IHRoZSB0aW1lb3V0IHRvIHF1aWV0IHRoZSB3YXRjaGRvZzogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCmluZGV4IDAxMmU2M2UuLjA1YzQ0YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtNDUzLDggKzQ1Myw4IEBACiAJcHJpdi0+Y2JyX21hc2sgPSBCMzAwOwogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0sIHByaXYpOwogCQotCXJldHVybiAoMCk7CQotfQkKKwlyZXR1cm4gMDsKK30KIAogCiBzdGF0aWMgaW50IGN5cHJlc3NfZWFydGhtYXRlX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCkBAIC00NjQsMTQgKzQ2NCwxNSBAQAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKGdlbmVyaWNfc3RhcnR1cChzZXJpYWwpKSB7Ci0JCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CisJCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19GVU5DVElPTl9fLAorCQkJCXNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXByaXYtPmNoaXB0eXBlID0gQ1RfRUFSVEhNQVRFOwotCQotCXJldHVybiAoMCk7CQorCisJcmV0dXJuIDA7CiB9IC8qIGN5cHJlc3NfZWFydGhtYXRlX3N0YXJ0dXAgKi8KIAogCkBAIC00ODIsMTQgKzQ4MywxNSBAQAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKGdlbmVyaWNfc3RhcnR1cChzZXJpYWwpKSB7Ci0JCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBzZXJpYWwtPnBvcnRbMF0tPm51bWJlcik7CisJCWRiZygiJXMgLSBGYWlsZWQgc2V0dGluZyB1cCBwb3J0ICVkIiwgX19GVU5DVElPTl9fLAorCQkJCXNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXByaXYtPmNoaXB0eXBlID0gQ1RfQ1lQSElEQ09NOwogCQotCXJldHVybiAoMCk7CQorCXJldHVybiAwOwogfSAvKiBjeXByZXNzX2hpZGNvbV9zdGFydHVwICovCiAKIApAQCAtOTA5LDcgKzkxMSw4IEBACiB9IC8qIGN5cHJlc3NfaW9jdGwgKi8KIAogCi1zdGF0aWMgdm9pZCBjeXByZXNzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBjeXByZXNzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtOTE4LDcgKzkyMSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlfX3U4IG9sZGxpbmVzOwogCWludCBsaW5lY2hhbmdlID0gMDsKLQkKKwogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCiAJdHR5ID0gcG9ydC0+dHR5OwpAQCAtOTMxLDEwICs5MzQsMTIgQEAKIAlpZiAoIXByaXYtPnRlcm1pb3NfaW5pdGlhbGl6ZWQpIHsKIAkJaWYgKHByaXYtPmNoaXB0eXBlID09IENUX0VBUlRITUFURSkgewogCQkJKih0dHktPnRlcm1pb3MpID0gdHR5X3N0ZF90ZXJtaW9zOwotCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gQjQ4MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gQjQ4MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwKKwkJCQlDTE9DQUw7CiAJCX0gZWxzZSBpZiAocHJpdi0+Y2hpcHR5cGUgPT0gQ1RfQ1lQSElEQ09NKSB7CiAJCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfAorCQkJCUNMT0NBTDsKIAkJfQogCQlwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkID0gMTsKIAl9CkBAIC05NDYsMTIgKzk1MSwxNSBAQAogCS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgc2V0dGluZ3MgKi8KIAlpZiAob2xkX3Rlcm1pb3MpIHsKIAkJaWYgKChjZmxhZyAhPSBvbGRfdGVybWlvcy0+Y19jZmxhZykgfHwKLQkJICAgIChSRUxFVkFOVF9JRkxBRyhpZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgewotCQkJZGJnKCIlcyAtIGF0dGVtcHRpbmcgdG8gc2V0IG5ldyB0ZXJtaW9zIHNldHRpbmdzIiwgX19GVU5DVElPTl9fKTsKLQkJCS8qIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGlzIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgaW4gdGhlIGZ1bmN0aW9uLCB3ZSBjYW4gcmVzdG9yZSBpdCAqLworCQkJKFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAhPQorCQkJIFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpIHsKKwkJCWRiZygiJXMgLSBhdHRlbXB0aW5nIHRvIHNldCBuZXcgdGVybWlvcyBzZXR0aW5ncyIsCisJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkvKiBzaG91bGQgbWFrZSBhIGNvcHkgb2YgdGhpcyBpbiBjYXNlIHNvbWV0aGluZyBnb2VzCisJCQkgKiB3cm9uZyBpbiB0aGUgZnVuY3Rpb24sIHdlIGNhbiByZXN0b3JlIGl0ICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJcHJpdi0+dG1wX3Rlcm1pb3MgPSAqKHR0eS0+dGVybWlvcyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7IAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQl9IGVsc2UgewogCQkJZGJnKCIlcyAtIG5vdGhpbmcgdG8gZG8sIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwpAQCAtOTYyLDIxICs5NzAsMzQgQEAKIAkvKiBzZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KIAkvKiB3aGVuIHBhcml0eSBpcyBkaXNhYmxlZCB0aGUgcGFyaXR5IHR5cGUgYml0IGlzIGlnbm9yZWQgKi8KIAotCXN0b3BfYml0cyA9IGNmbGFnICYgQ1NUT1BCID8gMSA6IDA7IC8qIDEgbWVhbnMgMiBzdG9wIGJpdHMsIDAgbWVhbnMgMSBzdG9wIGJpdCAqLwotCQorCS8qIDEgbWVhbnMgMiBzdG9wIGJpdHMsIDAgbWVhbnMgMSBzdG9wIGJpdCAqLworCXN0b3BfYml0cyA9IGNmbGFnICYgQ1NUT1BCID8gMSA6IDA7CisKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJcGFyaXR5X2VuYWJsZSA9IDE7Ci0JCXBhcml0eV90eXBlID0gY2ZsYWcgJiBQQVJPREQgPyAxIDogMDsgLyogMSBtZWFucyBvZGQgcGFyaXR5LCAwIG1lYW5zIGV2ZW4gcGFyaXR5ICovCisJCS8qIDEgbWVhbnMgb2RkIHBhcml0eSwgMCBtZWFucyBldmVuIHBhcml0eSAqLworCQlwYXJpdHlfdHlwZSA9IGNmbGFnICYgUEFST0REID8gMSA6IDA7CiAJfSBlbHNlCiAJCXBhcml0eV9lbmFibGUgPSBwYXJpdHlfdHlwZSA9IDA7CiAKIAlpZiAoY2ZsYWcgJiBDU0laRSkgewogCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKLQkJCWNhc2UgQ1M1OiBkYXRhX2JpdHMgPSAwOyBicmVhazsKLQkJCWNhc2UgQ1M2OiBkYXRhX2JpdHMgPSAxOyBicmVhazsKLQkJCWNhc2UgQ1M3OiBkYXRhX2JpdHMgPSAyOyBicmVhazsKLQkJCWNhc2UgQ1M4OiBkYXRhX2JpdHMgPSAzOyBicmVhazsKLQkJCWRlZmF1bHQ6IGVycigiJXMgLSBDU0laRSB3YXMgc2V0LCBidXQgbm90IENTNS1DUzgiLCBfX0ZVTkNUSU9OX18pOyBkYXRhX2JpdHMgPSAzOworCQkJY2FzZSBDUzU6CisJCQkJZGF0YV9iaXRzID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1M2OgorCQkJCWRhdGFfYml0cyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIENTNzoKKwkJCQlkYXRhX2JpdHMgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSBDUzg6CisJCQkJZGF0YV9iaXRzID0gMzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXJyKCIlcyAtIENTSVpFIHdhcyBzZXQsIGJ1dCBub3QgQ1M1LUNTOCIsCisJCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCWRhdGFfYml0cyA9IDM7CiAJCX0KIAl9IGVsc2UKIAkJZGF0YV9iaXRzID0gMzsKQEAgLTk5MSw2MyArMTAxMiw4NSBAQAogCX0gZWxzZSB7CiAJCWJhdWRfbWFzayA9IChjZmxhZyAmIENCQVVEKTsKIAkJc3dpdGNoKGJhdWRfbWFzaykgewotCQkJY2FzZSBCMzAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDMwMGJwcyIsIF9fRlVOQ1RJT05fXyk7IGJyZWFrOwotCQkJY2FzZSBCNjAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDYwMGJwcyIsIF9fRlVOQ1RJT05fXyk7IGJyZWFrOwotCQkJY2FzZSBCMTIwMDogZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxMjAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEIyNDAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDI0MDBicHMiLCBfX0ZVTkNUSU9OX18pOyBicmVhazsKLQkJCWNhc2UgQjQ4MDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNDgwMGJwcyIsIF9fRlVOQ1RJT05fXyk7IGJyZWFrOwotCQkJY2FzZSBCOTYwMDogZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCA5NjAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEIxOTIwMDogZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxOTIwMGJwcyIsIF9fRlVOQ1RJT05fXyk7IGJyZWFrOwotCQkJY2FzZSBCMzg0MDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMzg0MDBicHMiLCBfX0ZVTkNUSU9OX18pOyBicmVhazsKLQkJCWNhc2UgQjU3NjAwOiBkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDU3NjAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQljYXNlIEIxMTUyMDA6IGRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMTE1MjAwYnBzIiwgX19GVU5DVElPTl9fKTsgYnJlYWs7Ci0JCQlkZWZhdWx0OiBkYmcoIiVzIC0gdW5rbm93biBtYXNrZWQgYmF1ZCByYXRlIiwgX19GVU5DVElPTl9fKTsKKwkJCWNhc2UgQjMwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDMwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEI2MDA6CisJCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCA2MDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCMTIwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDEyMDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCMjQwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDI0MDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCNDgwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDQ4MDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCOTYwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDk2MDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCMTkyMDA6CisJCQkJZGJnKCIlcyAtIHNldHRpbmcgYmF1ZCAxOTIwMGJwcyIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEIzODQwMDoKKwkJCQlkYmcoIiVzIC0gc2V0dGluZyBiYXVkIDM4NDAwYnBzIiwgX19GVU5DVElPTl9fKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQjU3NjAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgNTc2MDBicHMiLCBfX0ZVTkNUSU9OX18pOworCQkJCWJyZWFrOworCQkJY2FzZSBCMTE1MjAwOgorCQkJCWRiZygiJXMgLSBzZXR0aW5nIGJhdWQgMTE1MjAwYnBzIiwgX19GVU5DVElPTl9fKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGJnKCIlcyAtIHVua25vd24gbWFza2VkIGJhdWQgcmF0ZSIsIF9fRlVOQ1RJT05fXyk7CiAJCX0KIAkJcHJpdi0+bGluZV9jb250cm9sID0gKENPTlRST0xfRFRSIHwgQ09OVFJPTF9SVFMpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCi0JZGJnKCIlcyAtIHNlbmRpbmcgJWQgc3RvcF9iaXRzLCAlZCBwYXJpdHlfZW5hYmxlLCAlZCBwYXJpdHlfdHlwZSwgJWQgZGF0YV9iaXRzICgrNSkiLCBfX0ZVTkNUSU9OX18sCi0JICAgIHN0b3BfYml0cywgcGFyaXR5X2VuYWJsZSwgcGFyaXR5X3R5cGUsIGRhdGFfYml0cyk7CiAKLQljeXByZXNzX3NlcmlhbF9jb250cm9sKHBvcnQsIGJhdWRfbWFzaywgZGF0YV9iaXRzLCBzdG9wX2JpdHMsIHBhcml0eV9lbmFibGUsCi0JCQkgICAgICAgcGFyaXR5X3R5cGUsIDAsIENZUFJFU1NfU0VUX0NPTkZJRyk7CisJZGJnKCIlcyAtIHNlbmRpbmcgJWQgc3RvcF9iaXRzLCAlZCBwYXJpdHlfZW5hYmxlLCAlZCBwYXJpdHlfdHlwZSwgIgorCQkJIiVkIGRhdGFfYml0cyAoKzUpIiwgX19GVU5DVElPTl9fLCBzdG9wX2JpdHMsCisJCQlwYXJpdHlfZW5hYmxlLCBwYXJpdHlfdHlwZSwgZGF0YV9iaXRzKTsKIAotCS8qIHdlIHBlcmZvcm0gYSBDWVBSRVNTX0dFVF9DT05GSUcgc28gdGhhdCB0aGUgY3VycmVudCBzZXR0aW5ncyBhcmUgZmlsbGVkIGludG8gdGhlIHByaXZhdGUgc3RydWN0dXJlCi0gICAgICAgICAqIHRoaXMgc2hvdWxkIGNvbmZpcm0gdGhhdCBhbGwgaXMgd29ya2luZyBpZiBpdCByZXR1cm5zIHdoYXQgd2UganVzdCBzZXQgKi8KKwljeXByZXNzX3NlcmlhbF9jb250cm9sKHBvcnQsIGJhdWRfbWFzaywgZGF0YV9iaXRzLCBzdG9wX2JpdHMsCisJCQlwYXJpdHlfZW5hYmxlLCBwYXJpdHlfdHlwZSwgMCwgQ1lQUkVTU19TRVRfQ09ORklHKTsKKworCS8qIHdlIHBlcmZvcm0gYSBDWVBSRVNTX0dFVF9DT05GSUcgc28gdGhhdCB0aGUgY3VycmVudCBzZXR0aW5ncyBhcmUKKwkgKiBmaWxsZWQgaW50byB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhpcyBzaG91bGQgY29uZmlybSB0aGF0IGFsbCBpcworCSAqIHdvcmtpbmcgaWYgaXQgcmV0dXJucyB3aGF0IHdlIGp1c3Qgc2V0ICovCiAJY3lwcmVzc19zZXJpYWxfY29udHJvbChwb3J0LCAwLCAwLCAwLCAwLCAwLCAwLCBDWVBSRVNTX0dFVF9DT05GSUcpOwogCi0JLyogSGVyZSB3ZSBjYW4gZGVmaW5lIGN1c3RvbSB0dHkgc2V0dGluZ3MgZm9yIGRldmljZXMKLSAgICAgICAgICoKLSAgICAgICAgICogdGhlIG1haW4gdHR5IHRlcm1pb3MgZmxhZyBiYXNlIGNvbWVzIGZyb20gZW1wZWcuYwotICAgICAgICAgKi8KKwkvKiBIZXJlIHdlIGNhbiBkZWZpbmUgY3VzdG9tIHR0eSBzZXR0aW5ncyBmb3IgZGV2aWNlczsgdGhlIG1haW4gdHR5CisJICogdGVybWlvcyBmbGFnIGJhc2UgY29tZXMgZnJvbSBlbXBlZy5jICovCiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmICggKHByaXYtPmNoaXB0eXBlID09IENUX0VBUlRITUFURSkgJiYgKHByaXYtPmJhdWRfcmF0ZSA9PSA0ODAwKSApIHsKLQotCQlkYmcoIlVzaW5nIGN1c3RvbSB0ZXJtaW9zIHNldHRpbmdzIGZvciBhIGJhdWQgcmF0ZSBvZiA0ODAwYnBzLiIpOworCQlkYmcoIlVzaW5nIGN1c3RvbSB0ZXJtaW9zIHNldHRpbmdzIGZvciBhIGJhdWQgcmF0ZSBvZiAiCisJCQkJIjQ4MDBicHMuIik7CiAJCS8qIGRlZmluZSBjdXN0b20gdGVybWlvcyBzZXR0aW5ncyBmb3IgTk1FQSBwcm90b2NvbCAqLwogCiAJCXR0eS0+dGVybWlvcy0+Y19pZmxhZyAvKiBpbnB1dCBtb2RlcyAtICovCi0JCQkmPSB+KElHTkJSSwkJLyogZGlzYWJsZSBpZ25vcmUgYnJlYWsgKi8KLQkJCXwgQlJLSU5UCQkvKiBkaXNhYmxlIGJyZWFrIGNhdXNlcyBpbnRlcnJ1cHQgKi8KLQkJCXwgUEFSTVJLCQkvKiBkaXNhYmxlIG1hcmsgcGFyaXR5IGVycm9ycyAqLwotCQkJfCBJU1RSSVAJCS8qIGRpc2FibGUgY2xlYXIgaGlnaCBiaXQgb2YgaW5wdXQgY2hhcmFjdGVycyAqLwotCQkJfCBJTkxDUgkJCS8qIGRpc2FibGUgdHJhbnNsYXRlIE5MIHRvIENSICovCi0JCQl8IElHTkNSCQkJLyogZGlzYWJsZSBpZ25vcmUgQ1IgKi8KLQkJCXwgSUNSTkwJCQkvKiBkaXNhYmxlIHRyYW5zbGF0ZSBDUiB0byBOTCAqLwotCQkJfCBJWE9OKTsJCS8qIGRpc2FibGUgZW5hYmxlIFhPTi9YT0ZGIGZsb3cgY29udHJvbCAqLwotCQkKLQkJdHR5LT50ZXJtaW9zLT5jX29mbGFnIC8qIG91dHB1dCBtb2RlcyAqLwotCQkJJj0gfk9QT1NUOwkJLyogZGlzYWJsZSBwb3N0cHJvY2VzcyBvdXRwdXQgY2hhcmFjdGVycyAqLwotCQkKLQkJdHR5LT50ZXJtaW9zLT5jX2xmbGFnIC8qIGxpbmUgZGlzY2lwbGluZSBtb2RlcyAqLwotCQkJJj0gfihFQ0hPIAkJLyogZGlzYWJsZSBlY2hvIGlucHV0IGNoYXJhY3RlcnMgKi8KLQkJCXwgRUNIT05MCQkvKiBkaXNhYmxlIGVjaG8gbmV3IGxpbmUgKi8KLQkJCXwgSUNBTk9OCQkvKiBkaXNhYmxlIGVyYXNlLCBraWxsLCB3ZXJhc2UsIGFuZCBycHJudCBzcGVjaWFsIGNoYXJhY3RlcnMgKi8KLQkJCXwgSVNJRwkJCS8qIGRpc2FibGUgaW50ZXJydXB0LCBxdWl0LCBhbmQgc3VzcGVuZCBzcGVjaWFsIGNoYXJhY3RlcnMgKi8KLQkJCXwgSUVYVEVOKTsJCS8qIGRpc2FibGUgbm9uLVBPU0lYIHNwZWNpYWwgY2hhcmFjdGVycyAqLworCQkJJj0gfihJR05CUksgIC8qIGRpc2FibGUgaWdub3JlIGJyZWFrICovCisJCQl8IEJSS0lOVCAgICAgLyogZGlzYWJsZSBicmVhayBjYXVzZXMgaW50ZXJydXB0ICovCisJCQl8IFBBUk1SSyAgICAgLyogZGlzYWJsZSBtYXJrIHBhcml0eSBlcnJvcnMgKi8KKwkJCXwgSVNUUklQICAgICAvKiBkaXNhYmxlIGNsZWFyIGhpZ2ggYml0IG9mIGlucHV0IGNoYXIgKi8KKwkJCXwgSU5MQ1IgICAgICAvKiBkaXNhYmxlIHRyYW5zbGF0ZSBOTCB0byBDUiAqLworCQkJfCBJR05DUiAgICAgIC8qIGRpc2FibGUgaWdub3JlIENSICovCisJCQl8IElDUk5MICAgICAgLyogZGlzYWJsZSB0cmFuc2xhdGUgQ1IgdG8gTkwgKi8KKwkJCXwgSVhPTik7ICAgICAvKiBkaXNhYmxlIGVuYWJsZSBYT04vWE9GRiBmbG93IGNvbnRyb2wgKi8KIAorCQl0dHktPnRlcm1pb3MtPmNfb2ZsYWcgLyogb3V0cHV0IG1vZGVzICovCisJCQkmPSB+T1BPU1Q7ICAgIC8qIGRpc2FibGUgcG9zdHByb2Nlc3Mgb3V0cHV0IGNoYXIgKi8KKworCQl0dHktPnRlcm1pb3MtPmNfbGZsYWcgLyogbGluZSBkaXNjaXBsaW5lIG1vZGVzICovCisJCQkmPSB+KEVDSE8gICAgIC8qIGRpc2FibGUgZWNobyBpbnB1dCBjaGFyYWN0ZXJzICovCisJCQl8IEVDSE9OTCAgICAgIC8qIGRpc2FibGUgZWNobyBuZXcgbGluZSAqLworCQkJfCBJQ0FOT04gICAgICAvKiBkaXNhYmxlIGVyYXNlLCBraWxsLCB3ZXJhc2UsIGFuZCBycHJudAorCQkJCQkgc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJCQl8IElTSUcgICAgICAgIC8qIGRpc2FibGUgaW50ZXJydXB0LCBxdWl0LCBhbmQgc3VzcGVuZAorCQkJCQkgc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJCQl8IElFWFRFTik7ICAgIC8qIGRpc2FibGUgbm9uLVBPU0lYIHNwZWNpYWwgY2hhcmFjdGVycyAqLwogCX0gLyogQ1RfQ1lQSElEQ09NOiBBcHBsaWNhdGlvbiBzaG91bGQgaGFuZGxlIHRoaXMgZm9yIGRldmljZSAqLwogCiAJbGluZWNoYW5nZSA9IChwcml2LT5saW5lX2NvbnRyb2wgIT0gb2xkbGluZXMpOwpAQCAtMTA2MCw3ICsxMTAzLDcgQEAKIAl9CiB9IC8qIGN5cHJlc3Nfc2V0X3Rlcm1pb3MgKi8KIAotIAorCiAvKiByZXR1cm5zIGFtb3VudCBvZiBkYXRhIHN0aWxsIGxlZnQgaW4gc29mdCBidWZmZXIgKi8KIHN0YXRpYyBpbnQgY3lwcmVzc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKQEAgLTEwODgsNyArMTEzMSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXByaXYtPnJ4X2ZsYWdzID0gVEhST1RUTEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsJICAgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogfQogCiAKQEAgLTExMTAsNyArMTE1Myw4IEBACiAKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpCi0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgIgorCQkJCQkiZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKIAl9CiB9CiAKQEAgLTExMjIsNyArMTE2Niw3IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQljaGFyIHR0eV9mbGFnID0gVFRZX05PUk1BTDsJCisJY2hhciB0dHlfZmxhZyA9IFRUWV9OT1JNQUw7CiAJaW50IGhhdmVkYXRhID0gMDsKIAlpbnQgYnl0ZXMgPSAwOwogCWludCByZXN1bHQ7CkBAIC0xMTMxLDcgKzExNzUsOCBAQAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCiAJaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHJlYWQgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTU1LDUxICsxMjAwLDU1IEBACiAJCWNhc2UgMzI6CiAJCQkvKiBUaGlzIGlzIGZvciB0aGUgQ1k3QzY0MDEzLi4uICovCiAJCQlwcml2LT5jdXJyZW50X3N0YXR1cyA9IGRhdGFbMF0gJiAweEY4OwotCQkJYnl0ZXMgPSBkYXRhWzFdKzI7Ci0JCQlpPTI7CisJCQlieXRlcyA9IGRhdGFbMV0gKyAyOworCQkJaSA9IDI7CiAJCQlpZiAoYnl0ZXMgPiAyKQogCQkJCWhhdmVkYXRhID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIDg6CiAJCQkvKiBUaGlzIGlzIGZvciB0aGUgQ1k3QzYzNzQzLi4uICovCiAJCQlwcml2LT5jdXJyZW50X3N0YXR1cyA9IGRhdGFbMF0gJiAweEY4OwotCQkJYnl0ZXMgPSAoZGF0YVswXSAmIDB4MDcpKzE7Ci0JCQlpPTE7CisJCQlieXRlcyA9IChkYXRhWzBdICYgMHgwNykgKyAxOworCQkJaSA9IDE7CiAJCQlpZiAoYnl0ZXMgPiAxKQogCQkJCWhhdmVkYXRhID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGJnKCIlcyAtIHdyb25nIHBhY2tldCBzaXplIC0gcmVjZWl2ZWQgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkYmcoIiVzIC0gd3JvbmcgcGFja2V0IHNpemUgLSByZWNlaXZlZCAlZCBieXRlcyIsCisJCQkJCV9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCWdvdG8gY29udGludWVfcmVhZDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhIChkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YSAoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwkJCXVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCS8qIGNoZWNrIHRvIHNlZSBpZiBzdGF0dXMgaGFzIGNoYW5nZWQgKi8KIAlpZiAocHJpdiAhPSBOVUxMKSB7CiAJCWlmIChwcml2LT5jdXJyZW50X3N0YXR1cyAhPSBwcml2LT5wcmV2X3N0YXR1cykgewotCQkJcHJpdi0+ZGlmZl9zdGF0dXMgfD0gcHJpdi0+Y3VycmVudF9zdGF0dXMgXiBwcml2LT5wcmV2X3N0YXR1czsKKwkJCXByaXYtPmRpZmZfc3RhdHVzIHw9IHByaXYtPmN1cnJlbnRfc3RhdHVzIF4KKwkJCQlwcml2LT5wcmV2X3N0YXR1czsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwogCQkJcHJpdi0+cHJldl9zdGF0dXMgPSBwcml2LT5jdXJyZW50X3N0YXR1czsKIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCS8qIGhhbmd1cCwgYXMgZGVmaW5lZCBpbiBhY20uYy4uLiB0aGlzIG1pZ2h0IGJlIGEgYmFkIHBsYWNlIGZvciBpdCB0aG91Z2ggKi8KLQlpZiAodHR5ICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJiAhKHByaXYtPmN1cnJlbnRfc3RhdHVzICYgVUFSVF9DRCkpIHsKKwkvKiBoYW5ndXAsIGFzIGRlZmluZWQgaW4gYWNtLmMuLi4gdGhpcyBtaWdodCBiZSBhIGJhZCBwbGFjZSBmb3IgaXQKKwkgKiB0aG91Z2ggKi8KKwlpZiAodHR5ICYmICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSAmJgorCQkJIShwcml2LT5jdXJyZW50X3N0YXR1cyAmIFVBUlRfQ0QpKSB7CiAJCWRiZygiJXMgLSBjYWxsaW5nIGhhbmd1cCIsIF9fRlVOQ1RJT05fXyk7CiAJCXR0eV9oYW5ndXAodHR5KTsKIAkJZ290byBjb250aW51ZV9yZWFkOwogCX0KIAotCS8qIFRoZXJlIGlzIG9uZSBlcnJvciBiaXQuLi4gSSdtIGFzc3VtaW5nIGl0IGlzIGEgcGFyaXR5IGVycm9yIGluZGljYXRvcgotCSAqIGFzIHRoZSBnZW5lcmljIGZpcm13YXJlIHdpbGwgc2V0IHRoaXMgYml0IHRvIDEgaWYgYSBwYXJpdHkgZXJyb3Igb2NjdXJzLgotCSAqIEkgY2FuIG5vdCBmaW5kIHJlZmVyZW5jZSB0byBhbnkgb3RoZXIgZXJyb3IgZXZlbnRzLgotCSAqCi0JICovCisJLyogVGhlcmUgaXMgb25lIGVycm9yIGJpdC4uLiBJJ20gYXNzdW1pbmcgaXQgaXMgYSBwYXJpdHkgZXJyb3IKKwkgKiBpbmRpY2F0b3IgYXMgdGhlIGdlbmVyaWMgZmlybXdhcmUgd2lsbCBzZXQgdGhpcyBiaXQgdG8gMSBpZiBhCisJICogcGFyaXR5IGVycm9yIG9jY3Vycy4KKwkgKiBJIGNhbiBub3QgZmluZCByZWZlcmVuY2UgdG8gYW55IG90aGVyIGVycm9yIGV2ZW50cy4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5jdXJyZW50X3N0YXR1cyAmIENZUF9FUlJPUikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMjExLDcgKzEyNjAsOCBAQAogCS8qIHByb2Nlc3MgcmVhZCBpZiB0aGVyZSBpcyBkYXRhIG90aGVyIHRoYW4gbGluZSBzdGF0dXMgKi8KIAlpZiAodHR5ICYmIChieXRlcyA+IGkpKSB7CiAJCWZvciAoOyBpIDwgYnl0ZXMgOyArK2kpIHsKLQkJCWRiZygicHVzaGluZyBieXRlIG51bWJlciAlZCAtICVkIC0gJWMiLGksZGF0YVtpXSxkYXRhW2ldKTsKKwkJCWRiZygicHVzaGluZyBieXRlIG51bWJlciAlZCAtICVkIC0gJWMiLCBpLCBkYXRhW2ldLAorCQkJCQlkYXRhW2ldKTsKIAkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJCX0KQEAgLTEyMjEsMjUgKzEyNzEsMjggQEAKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXByaXYtPmJ5dGVzX2luICs9IGJ5dGVzOyAgLyogY29udHJvbCBhbmQgc3RhdHVzIGJ5dGUocykgYXJlIGFsc28gY291bnRlZCAqLworCS8qIGNvbnRyb2wgYW5kIHN0YXR1cyBieXRlKHMpIGFyZSBhbHNvIGNvdW50ZWQgKi8KKwlwcml2LT5ieXRlc19pbiArPSBieXRlczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIGNvbnRpbnVlX3JlYWQ6Ci0JCi0JLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkLi4uIHVubGVzcyB0aGUgcG9ydCBoYXMgY2xvc2VkLiAgKi8KKworCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZC4uLiB1bmxlc3MgdGhlIHBvcnQgaGFzIGNsb3NlZC4gKi8KIAogCWlmIChwb3J0LT5vcGVuX2NvdW50ID4gMCkgewotCXVzYl9maWxsX2ludF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsCi0JCXVzYl9yY3ZpbnRwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCBwb3J0LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRBZGRyZXNzKSwKLQkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQljeXByZXNzX3JlYWRfaW50X2NhbGxiYWNrLCBwb3J0LAotCQlpbnRlcnZhbCk7Ci0JcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJdXNiX2ZpbGxfaW50X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKKwkJCQl1c2JfcmN2aW50cGlwZShwb3J0LT5zZXJpYWwtPmRldiwKKwkJCQkJcG9ydC0+aW50ZXJydXB0X2luX2VuZHBvaW50QWRkcmVzcyksCisJCQkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCXBvcnQtPmludGVycnVwdF9pbl91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJY3lwcmVzc19yZWFkX2ludF9jYWxsYmFjaywgcG9ydCwgaW50ZXJ2YWwpOworCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgIgorCQkJCQkicmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCXJlc3VsdCk7CiAJfQotCQorCiAJcmV0dXJuOwogfSAvKiBjeXByZXNzX3JlYWRfaW50X2NhbGxiYWNrICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZDE5NjRhMC4uMGE2ZThiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTI2OSw2ICsyNjksOCBAQAogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEZUREkgU2VyaWFsIENvbnZlcnRlcnMgRHJpdmVyIgogCiBzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIF9fdTE2IHZlbmRvciA9IEZURElfVklEOworc3RhdGljIF9fdTE2IHByb2R1Y3Q7CiAKIC8qIHN0cnVjdCBmdGRpX3Npb19xdWlyayBpcyB1c2VkIGJ5IGRldmljZXMgcmVxdWlyaW5nIHNwZWNpYWwgYXR0ZW50aW9uLiAqLwogc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIHsKQEAgLTQwNyw2ICs0MDksMzQgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VNMTAwX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VSMTAwX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0FMQzg1MDBfUElEKSB9LAorCS8qCisJICogVGhlc2Ugd2lsbCBwcm9iYWJseSB1c2UgdXNlci1zcGFjZSBkcml2ZXJzLiAgVW5jb21tZW50IHRoZW0gaWYKKwkgKiB5b3UgbmVlZCB0aGVtIG9yIHVzZSB0aGUgdXNlci1zcGVjaWZpZWQgdmVuZG9yL3Byb2R1Y3QgbW9kdWxlCisJICogcGFyYW1ldGVycyAoc2VlIGZ0ZGlfc2lvLmggZm9yIHRoZSBudW1iZXJzKS4gIE1ha2UgYSBmdXNzIGlmCisJICogeW91IHRoaW5rIHRoZSBkcml2ZXIgc2hvdWxkIHJlY29nbml6ZSBhbnkgb2YgdGhlbSBieSBkZWZhdWx0LgorCSAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfQ0xJNzAwMF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9QUFM3MzMwX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1RGTTEwMF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VREY3N19QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VSU84OF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VQUQ4X1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VEQTdfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVVNJMl9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9UMTEwMF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9QQ0QyMDBfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVUxBMjAwX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0ZIWjEwMDBQQ19QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9DU0k4X1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0VNMTAwMERMX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BDSzEwMF9QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9SRlA1MDBfUElEKSB9LCAqLworCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRlMyMFNJR19QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9XUzMwMFBDX1BJRCkgfSwgKi8KKwkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0ZIWjEzMDBQQ19QSUQpIH0sICovCisJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9XUzUwMF9QSUQpIH0sICovCiAgCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElEKSB9LAogIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCkgfSwKICAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCkgfSwKQEAgLTQxOCw2ICs0NDgsNyBAQAogCXsgVVNCX0RFVklDRShJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoSU5UUkVQSURfVklELCBJTlRSRVBJRF9ORU9WSV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZBTENPTV9WSUQsIEZBTENPTV9UV0lTVF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZBTENPTV9WSUQsIEZBTENPTV9TQU1CQV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9STV9DQU5WSUVXX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU09UTDRfUElEKSB9LApAQCAtNDI3LDEyICs0NTgsMjEgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8yX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8wX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8xX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8yX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8zX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl80X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl81X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl82X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl83X1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoTU9CSUxJVFlfVklELCBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01IQU1fWTZfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NSEFNX1k4X1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRVZPTFVUSU9OX1ZJRCwgRVZPTFVUSU9OX0VSMV9QSUQpIH0sCi0JeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKwl7IH0sCQkJCQkvKiBPcHRpb25hbCBwYXJhbWV0ZXIgZW50cnkgKi8KKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlX2NvbWJpbmVkKTsKQEAgLTIwMzAsNiArMjA3MCwxNSBAQAogCWludCByZXR2YWw7CiAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlpZiAodmVuZG9yID4gMCAmJiBwcm9kdWN0ID4gMCkgeworCQkvKiBBZGQgdXNlciBzcGVjaWZpZWQgVklEL1BJRCB0byByZXNlcnZlZCBlbGVtZW50IG9mIHRhYmxlLiAqLworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaWRfdGFibGVfY29tYmluZWRbaV0uaWRWZW5kb3I7IGkrKykKKwkJCTsKKwkJaWRfdGFibGVfY29tYmluZWRbaV0ubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKKwkJaWRfdGFibGVfY29tYmluZWRbaV0uaWRWZW5kb3IgPSB2ZW5kb3I7CisJCWlkX3RhYmxlX2NvbWJpbmVkW2ldLmlkUHJvZHVjdCA9IHByb2R1Y3Q7CisJfQogCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfc2lvX2RldmljZSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBmYWlsZWRfc2lvX3JlZ2lzdGVyOwpAQCAtMjA2Niw0ICsyMTE1LDkgQEAKIAogbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKK21vZHVsZV9wYXJhbSh2ZW5kb3IsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZlbmRvciwgIlVzZXIgc3BlY2lmaWVkIHZlbmRvciBJRCAoZGVmYXVsdD0iCisJCV9fTU9EVUxFX1NUUklORyhGVERJX1ZJRCkiKSIpOworbW9kdWxlX3BhcmFtKHByb2R1Y3QsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZlbmRvciwgIlVzZXIgc3BlY2lmaWVkIHByb2R1Y3QgSUQiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAppbmRleCA5ZjQzNDIwLi4yYzM1ZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaApAQCAtMTQyLDEwICsxNDIsNDMgQEAKIC8qIGh0dHA6Ly9ob21lLmVhcnRobGluay5uZXQvfmpyaGVlcy9VU0JVSVJUL2luZGV4Lmh0bSAqLwogI2RlZmluZSBGVERJX1VTQl9VSVJUX1BJRAkweEY4NTAJLyogUHJvZHVjdCBJZCAqLwogCi0vKiBFTFYgVVNCIE1vZHVsZSBVTzEwMCAoUElEIHNlbnQgYnkgU3RlZmFuIEZyaW5ncykgKi8KLSNkZWZpbmUgRlRESV9FTFZfVU8xMDBfUElECTB4RkI1OAkvKiBQcm9kdWN0IElkICovCi0vKiBFTFYgVVNCIE1vZHVsZSBVTTEwMCAoUElEIHNlbnQgYnkgQXJuaW0gTGFldWdlcikgKi8KLSNkZWZpbmUgRlRESV9FTFZfVU0xMDBfUElECTB4RkI1QQkvKiBQcm9kdWN0IElkICovCisvKgorICogRUxWIFVTQiBkZXZpY2VzIHN1Ym1pdHRlZCBieSBDaHJpc3RpYW4gQWJ0IG9mIEVMViAod3d3LmVsdi5kZSkuCisgKiBBbGwgb2YgdGhlc2UgZGV2aWNlcyB1c2UgRlRESSdzIHZlbmRvciBJRCAoMHgwNDAzKS4KKyAqCisgKiBUaGUgcHJldmlvdXNseSBpbmNsdWRlZCBQSUQgZm9yIHRoZSBVTyAxMDAgbW9kdWxlIHdhcyBpbmNvcnJlY3QuCisgKiBJbiBmYWN0LCB0aGF0IFBJRCB3YXMgZm9yIEVMVidzIFVSIDEwMCBVU0ItUlMyMzIgY29udmVydGVyICgweEZCNTgpLgorICoKKyAqIEFybWluIExhZXVnZXIgb3JpZ2luYWxseSBzZW50IHRoZSBQSUQgZm9yIHRoZSBVTSAxMDAgbW9kdWxlLgorICovCisjZGVmaW5lIEZURElfRUxWX1VSMTAwX1BJRAkweEZCNTgJLyogVVNCLVJTMjMyLVVtc2V0emVyIChVUiAxMDApICovCisjZGVmaW5lIEZURElfRUxWX1VNMTAwX1BJRAkweEZCNUEJLyogVVNCLU1vZHVsIFVNIDEwMCAqLworI2RlZmluZSBGVERJX0VMVl9VTzEwMF9QSUQJMHhGQjVCCS8qIFVTQi1Nb2R1bCBVTyAxMDAgKi8KKyNkZWZpbmUgRlRESV9FTFZfQUxDODUwMF9QSUQJMHhGMDZFCS8qIEFMQyA4NTAwIEV4cGVydCAqLworLyogQWRkaXRpb25hbCBFTFYgUElEcyB0aGF0IGRlZmF1bHQgdG8gdXNpbmcgdGhlIEZUREkgRDJYWCBkcml2ZXJzIG9uCisgKiBNUyBXaW5kb3dzLCByYXRoZXIgdGhhbiB0aGUgRlRESSBWaXJ0dWFsIENvbSBQb3J0IGRyaXZlcnMuCisgKiBNYXliZSB0aGVzZSB3aWxsIGJlIGVhc2llciB0byB1c2Ugd2l0aCB0aGUgbGliZnRkaS9saWJ1c2IgdXNlci1zcGFjZQorICogZHJpdmVycywgb3IgcG9zc2libHkgdGhlIENvbWVkaSBkcml2ZXJzIGluIHNvbWUgY2FzZXMuICovCisjZGVmaW5lIEZURElfRUxWX0NMSTcwMDBfUElECTB4RkI1OQkvKiBDb21wdXRlci1MaWdodC1JbnRlcmZhY2UgKENMSSA3MDAwKSAqLworI2RlZmluZSBGVERJX0VMVl9QUFM3MzMwX1BJRAkweEZCNUMJLyogUHJvY2Vzc29yLVBvd2VyLVN1cHBseSAoUFBTIDczMzApICovCisjZGVmaW5lIEZURElfRUxWX1RGTTEwMF9QSUQJMHhGQjVECS8qIFRlbXBlcmFydHVyLUZldWNodGUgTWVzc2dlcmFldCAoVEZNIDEwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfVURGNzdfUElECTB4RkI1RQkvKiBVU0IgRENGIEZ1bmt1cmggKFVERiA3NykgKi8KKyNkZWZpbmUgRlRESV9FTFZfVUlPODhfUElECTB4RkI1RgkvKiBVU0ItSS9PIEludGVyZmFjZSAoVUlPIDg4KSAqLworI2RlZmluZSBGVERJX0VMVl9VQUQ4X1BJRAkweEYwNjgJLyogVVNCLUFELVdhbmRsZXIgKFVBRCA4KSAqLworI2RlZmluZSBGVERJX0VMVl9VREE3X1BJRAkweEYwNjkJLyogVVNCLURBLVdhbmRsZXIgKFVEQSA3KSAqLworI2RlZmluZSBGVERJX0VMVl9VU0kyX1BJRAkweEYwNkEJLyogVVNCLVNjaHJpdHRtb3RvcmVuLUludGVyZmFjZSAoVVNJIDIpICovCisjZGVmaW5lIEZURElfRUxWX1QxMTAwX1BJRAkweEYwNkIJLyogVGhlcm1vbWV0ZXIgKFQgMTEwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfUENEMjAwX1BJRAkweEYwNkMJLyogUEMtRGF0ZW5sb2dnZXIgKFBDRCAyMDApICovCisjZGVmaW5lIEZURElfRUxWX1VMQTIwMF9QSUQJMHhGMDZECS8qIFVTQi1MQ0QtQW5zdGV1ZXJ1bmcgKFVMQSAyMDApICovCisjZGVmaW5lIEZURElfRUxWX0ZIWjEwMDBQQ19QSUQJMHhGMDZGCS8qIEZIWiAxMDAwIFBDICovCisjZGVmaW5lIEZURElfRUxWX0NTSThfUElECTB4RTBGMAkvKiBDb21wdXRlci1TY2hhbHQtSW50ZXJmYWNlIChDU0kgOCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfRU0xMDAwRExfUElECTB4RTBGMQkvKiBQQy1EYXRlbmxvZ2dlciBmdWVyIEVuZXJnaWVtb25pdG9yIChFTSAxMDAwIERMKSAqLworI2RlZmluZSBGVERJX0VMVl9QQ0sxMDBfUElECTB4RTBGMgkvKiBQQy1LYWJlbHRlc3RlciAoUENLIDEwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfUkZQNTAwX1BJRAkweEUwRjMJLyogSEYtTGVpc3R1bmdzbWVzc2VyIChSRlAgNTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9GUzIwU0lHX1BJRAkweEUwRjQJLyogU2lnbmFsZ2ViZXIgKEZTIDIwIFNJRykgKi8KKyNkZWZpbmUgRlRESV9FTFZfV1MzMDBQQ19QSUQJMHhFMEY2CS8qIFBDLVdldHRlcnN0YXRpb24gKFdTIDMwMCBQQykgKi8KKyNkZWZpbmUgRlRESV9FTFZfRkhaMTMwMFBDX1BJRAkweEUwRTgJLyogRkhaIDEzMDAgUEMgKi8KKyNkZWZpbmUgRlRESV9FTFZfV1M1MDBfUElECTB4RTBFOQkvKiBQQy1XZXR0ZXJzdGF0aW9uIChXUyA1MDApICovCiAKIC8qCiAgKiBEZWZpbml0aW9ucyBmb3IgSUQgVEVDSCAod3d3LmlkdC1uZXQuY29tKSBkZXZpY2VzCkBAIC0yMjIsNiArMjU1LDcgQEAKICAqLwogI2RlZmluZSBGQUxDT01fVklECQkweDBGOTQJLyogVmVuZG9yIElkICovCiAjZGVmaW5lIEZBTENPTV9UV0lTVF9QSUQJMHgwMDAxCS8qIEZhbGNvbSBUd2lzdCBVU0IgR1BSUyBtb2RlbSAqLworI2RlZmluZSBGQUxDT01fU0FNQkFfUElECTB4MDAwNQkvKiBGYWxjb20gU2FtYmEgVVNCIEdQUlMgbW9kZW0gKi8KIAogLyoKICAqIFNVVU5UTyBwcm9kdWN0IGlkcwpAQCAtMjc3LDYgKzMxMSwxOCBAQAogI2RlZmluZSBGVERJX0FDVElWRV9ST0JPVFNfUElECTB4RTU0OAkvKiBVU0IgY29tbXMgYm9hcmQgKi8KIAogLyoKKyAqIFhzZW5zIFRlY2hub2xvZ2llcyBCViBwcm9kdWN0cyAoaHR0cDovL3d3dy54c2Vucy5jb20pLgorICovCisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8wX1BJRAkweEQzODgKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzFfUElECTB4RDM4OQorI2RlZmluZSBYU0VOU19DT05WRVJURVJfMl9QSUQJMHhEMzhBCisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8zX1BJRAkweEQzOEIKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzRfUElECTB4RDM4QworI2RlZmluZSBYU0VOU19DT05WRVJURVJfNV9QSUQJMHhEMzhECisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl82X1BJRAkweEQzOEUKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzdfUElECTB4RDM4RgorCisvKgogICogRXZvbHV0aW9uIFJvYm90aWNzIHByb2R1Y3RzIChodHRwOi8vd3d3LmV2b2x1dGlvbi5jb20vKS4KICAqIFN1Ym1pdHRlZCBieSBTaGF3biBNLiBMYXZlbGxlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwppbmRleCBmYjA5MjYyLi4zYjk1OGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKQEAgLTM4MywxMSArMzgzLDggQEAKIAkJZGJnKCIlcyAtIGVuZHBvaW50ICVkIGZsaXAgJWQiLCBfX0ZVTkNUSU9OX18sIHVzYl9waXBlZW5kcG9pbnQodGhpc191cmItPnBpcGUpLCBmbGlwKTsKIAogCQlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJCWlmICh0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfQVNZTkNfVU5MSU5LKQotCQkJCWJyZWFrOwogCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHBfcHJpdi0+dHhfc3RhcnRfdGltZVtmbGlwXSArIDEwICogSFopKQogCQkJCWJyZWFrOwotCQkJdGhpc191cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CiAJCQl1c2JfdW5saW5rX3VyYih0aGlzX3VyYik7CiAJCQlicmVhazsKIAkJfQpAQCAtNDAyLDcgKzM5OSw2IEBACiAJCS8qIHNlbmQgdGhlIGRhdGEgb3V0IHRoZSBidWxrIHBvcnQgKi8KIAkJdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB0b2RvICsgZGF0YU9mZnNldDsKIAotCQl0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXRoaXNfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKIAkJCWRiZygidXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkICglZCkiLCBlcnIpOwpAQCAtMTExOSwxMCArMTExNSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JaWYgKHVyYiAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKKwlpZiAodXJiICYmIHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKIAkJdXNiX2tpbGxfdXJiKHVyYik7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IGU5MjU2NDAuLjkyZDBmOTI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNDUsMjkgKzQ1LDI5IEBACiAjaW5jbHVkZSAidXNiLXNlcmlhbC5oIgogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50ICBvcHRpb25fb3BlbiAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgb3B0aW9uX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgaW50ICBvcHRpb25fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7Ci1zdGF0aWMgdm9pZCBvcHRpb25fc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIHZvaWQgb3B0aW9uX3J4X3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG9wdGlvbl9yeF91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBpbnQgIG9wdGlvbl93cml0ZV9yb29tIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50ICBvcHRpb25fc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOworc3RhdGljIGludCAgb3B0aW9uX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiAKIHN0YXRpYyB2b2lkIG9wdGlvbl9pbnN0YXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLXN0YXRpYyBpbnQgIG9wdGlvbl93cml0ZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIGludCBvcHRpb25fd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIAotc3RhdGljIGludCAgb3B0aW9uX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgaW50ICBvcHRpb25faW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCBvcHRpb25fc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpOwotc3RhdGljIHZvaWQgb3B0aW9uX2JyZWFrX2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKLXN0YXRpYyBpbnQgIG9wdGlvbl90aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCAgb3B0aW9uX3Rpb2Ntc2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLXN0YXRpYyBpbnQgIG9wdGlvbl9zZW5kX3NldHVwIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CitzdGF0aWMgaW50ICBvcHRpb25faW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBvcHRpb25fc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKK3N0YXRpYyBpbnQgIG9wdGlvbl90aW9jbWdldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50ICBvcHRpb25fdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogCiAvKiBWZW5kb3IgYW5kIHByb2R1Y3QgSURzICovCiAjZGVmaW5lIE9QVElPTl9WRU5ET1JfSUQJCQkweDBBRjAKQEAgLTc2LDcgKzc2LDYgQEAKICNkZWZpbmUgT1BUSU9OX1BST0RVQ1RfRlVTSU9OCTB4NjAwMAogI2RlZmluZSBPUFRJT05fUFJPRFVDVF9GVVNJT04yCTB4NjMwMAogCi0KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBvcHRpb25faWRzW10gPSB7CiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX09MRCkgfSwKIAl7IFVTQl9ERVZJQ0UoT1BUSU9OX1ZFTkRPUl9JRCwgT1BUSU9OX1BST0RVQ1RfRlVTSU9OKSB9LApAQCAtMTI5LDcgKzEyOCw2IEBACiAjZGVmaW5lIGRlYnVnIDAKICNlbmRpZgogCi0KIC8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwogCiAjZGVmaW5lIE5fSU5fVVJCIDQKQEAgLTE1NiwxMCArMTU0LDggQEAKIAl1bnNpZ25lZCBsb25nIHR4X3N0YXJ0X3RpbWVbTl9PVVRfVVJCXTsKIH07CiAKLQogLyogRnVuY3Rpb25zIHVzZWQgYnkgbmV3IHVzYi1zZXJpYWwgY29kZS4gKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1vcHRpb25faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG9wdGlvbl9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIAlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZvcHRpb25fM3BvcnRfZGV2aWNlKTsKQEAgLTE3OSw4ICsxNzUsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotb3B0aW9uX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgb3B0aW9uX2V4aXQodm9pZCkKIHsKIAl1c2JfZGVyZWdpc3RlciAoJm9wdGlvbl9kcml2ZXIpOwogCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJm9wdGlvbl8zcG9ydF9kZXZpY2UpOwpAQCAtMTg5LDM5ICsxODQsMzEgQEAKIG1vZHVsZV9pbml0KG9wdGlvbl9pbml0KTsKIG1vZHVsZV9leGl0KG9wdGlvbl9leGl0KTsKIAotc3RhdGljIHZvaWQKLW9wdGlvbl9yeF90aHJvdHRsZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogfQogCi0KLXN0YXRpYyB2b2lkCi1vcHRpb25fcnhfdW50aHJvdHRsZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9yeF91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLQotc3RhdGljIHZvaWQKLW9wdGlvbl9icmVha19jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKK3N0YXRpYyB2b2lkIG9wdGlvbl9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQogewogCS8qIFVuZm9ydHVuYXRlbHksIEkgZG9uJ3Qga25vdyBob3cgdG8gc2VuZCBhIGJyZWFrICovCiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLQotc3RhdGljIHZvaWQKLW9wdGlvbl9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgb3B0aW9uX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKIAlvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKIH0KIAotc3RhdGljIGludAotb3B0aW9uX3Rpb2NtZ2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgb3B0aW9uX3Rpb2NtZ2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXVuc2lnbmVkIGludCB2YWx1ZTsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CkBAIC0yMzgsOSArMjI1LDggQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyBpbnQKLW9wdGlvbl90aW9jbXNldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3N0YXRpYyBpbnQgb3B0aW9uX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewogCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIApAQCAtMjU4LDE3ICsyNDQsMTUgQEAKIAlyZXR1cm4gb3B0aW9uX3NlbmRfc2V0dXAocG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQKLW9wdGlvbl9pb2N0bCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBvcHRpb25faW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogCiAvKiBXcml0ZSAqLwotc3RhdGljIGludAotb3B0aW9uX3dyaXRlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgb3B0aW9uX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJaW50IGk7CkBAIC0yODksMjggKzI3MywyOSBAQAogCiAJCXRoaXNfdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOwogCQlpZiAodGhpc191cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJCWlmICh0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfQVNZTkNfVU5MSU5LKQorCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJCXBvcnRkYXRhLT50eF9zdGFydF90aW1lW2ldICsgMTAgKiBIWikpCiAJCQkJY29udGludWU7Ci0JCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcG9ydGRhdGEtPnR4X3N0YXJ0X3RpbWVbaV0gKyAxMCAqIEhaKSkKLQkJCQljb250aW51ZTsKLQkJCXRoaXNfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCQkJdXNiX3VubGlua191cmIodGhpc191cmIpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgIT0gMCkKLQkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsIHRoaXNfdXJiLCB0aGlzX3VyYi0+c3RhdHVzKTsKKwkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsCisJCQkJdGhpc191cmIsIHRoaXNfdXJiLT5zdGF0dXMpOwogCi0JCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fRlVOQ1RJT05fXywgdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGkpOworCQlkYmcoIiVzOiBlbmRwb2ludCAlZCBidWYgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgaSk7CiAKIAkJLyogc2VuZCB0aGUgZGF0YSAqLwogCQltZW1jcHkgKHRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgdG9kbyk7CiAJCXRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdG9kbzsKIAotCQl0aGlzX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CiAJCXRoaXNfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodGhpc191cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyKSB7Ci0JCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgKCVkLCBoYXMgJWQpIiwgdGhpc191cmIsIGVyciwgdGhpc191cmItPnN0YXR1cyk7CisJCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgIgorCQkJCSIoJWQsIGhhcyAlZCkiLCB0aGlzX3VyYiwKKwkJCQllcnIsIHRoaXNfdXJiLT5zdGF0dXMpOwogCQkJY29udGludWU7CiAJCX0KIAkJcG9ydGRhdGEtPnR4X3N0YXJ0X3RpbWVbaV0gPSBqaWZmaWVzOwpAQCAtMzIzLDggKzMwOCw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgdm9pZAotb3B0aW9uX2luZGF0X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgb3B0aW9uX2luZGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGksIGVycjsKIAlpbnQgZW5kcG9pbnQ7CkBAIC0zNTcsMTQgKzM0MSwxNCBAQAogCQlpZiAocG9ydC0+b3Blbl9jb3VudCAmJiB1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CiAJCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXN1Ym1pdCByZWFkIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAiCisJCQkJCSIoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOwogCQl9CiAJfQogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQKLW9wdGlvbl9vdXRkYXRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBvcHRpb25fb3V0ZGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIApAQCAtMzc2LDggKzM2MCw3IEBACiAJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPndvcmspOwogfQogCi1zdGF0aWMgdm9pZAotb3B0aW9uX2luc3RhdF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIG9wdGlvbl9pbnN0YXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CkBAIC0zOTUsMTAgKzM3OCwxMiBAQAogCQkJZGJnKCIlczogTlVMTCByZXFfcGt0XG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmICgocmVxX3BrdC0+YlJlcXVlc3RUeXBlID09IDB4QTEpICYmIChyZXFfcGt0LT5iUmVxdWVzdCA9PSAweDIwKSkgeworCQlpZiAoKHJlcV9wa3QtPmJSZXF1ZXN0VHlwZSA9PSAweEExKSAmJgorCQkJCShyZXFfcGt0LT5iUmVxdWVzdCA9PSAweDIwKSkgewogCQkJaW50IG9sZF9kY2Rfc3RhdGU7CiAJCQl1bnNpZ25lZCBjaGFyIHNpZ25hbHMgPSAqKCh1bnNpZ25lZCBjaGFyICopCi0JCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKTsKKwkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKworCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOwogCiAJCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19GVU5DVElPTl9fLCBzaWduYWxzKTsKIApAQCAtNDA4LDEyICszOTMsMTMgQEAKIAkJCXBvcnRkYXRhLT5kc3Jfc3RhdGUgPSAoKHNpZ25hbHMgJiAweDAyKSA/IDEgOiAwKTsKIAkJCXBvcnRkYXRhLT5yaV9zdGF0ZSA9ICgoc2lnbmFscyAmIDB4MDgpID8gMSA6IDApOwogCi0JCQlpZiAocG9ydC0+dHR5ICYmICFDX0NMT0NBTChwb3J0LT50dHkpCi0JCQkJCSYmIG9sZF9kY2Rfc3RhdGUgJiYgIXBvcnRkYXRhLT5kY2Rfc3RhdGUpIHsKKwkJCWlmIChwb3J0LT50dHkgJiYgIUNfQ0xPQ0FMKHBvcnQtPnR0eSkgJiYKKwkJCQkJb2xkX2RjZF9zdGF0ZSAmJiAhcG9ydGRhdGEtPmRjZF9zdGF0ZSkKIAkJCQl0dHlfaGFuZ3VwKHBvcnQtPnR0eSk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX0ZVTkNUSU9OX18sIHJlcV9wa3QtPmJSZXF1ZXN0VHlwZSxyZXFfcGt0LT5iUmVxdWVzdCk7CisJCX0gZWxzZSB7CisJCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fRlVOQ1RJT05fXywKKwkJCQlyZXFfcGt0LT5iUmVxdWVzdFR5cGUscmVxX3BrdC0+YlJlcXVlc3QpOworCQl9CiAJfSBlbHNlCiAJCWRiZygiJXM6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAKQEAgLTQyMiwxMyArNDA4LDEyIEBACiAJCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIpCi0JCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLAorCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKIAl9CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX3dyaXRlX3Jvb20gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG9wdGlvbl93cml0ZV9yb29tKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCWludCBpOwpAQCAtNDQ3LDkgKzQzMiw3IEBACiAJcmV0dXJuIGRhdGFfbGVuOwogfQogCi0KLXN0YXRpYyBpbnQKLW9wdGlvbl9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG9wdGlvbl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJaW50IGk7CkBAIC00NjcsOSArNDUwLDcgQEAKIAlyZXR1cm4gZGF0YV9sZW47CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX29wZW4gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBvcHRpb25fb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKQEAgLTQ5MCwxNyArNDcxLDIxIEBACiAJCWlmICghIHVyYikKIAkJCWNvbnRpbnVlOwogCQlpZiAodXJiLT5kZXYgIT0gc2VyaWFsLT5kZXYpIHsKLQkJCWRiZygiJXM6IGRldiAlcCAhPSAlcCIsIF9fRlVOQ1RJT05fXywgdXJiLT5kZXYsIHNlcmlhbC0+ZGV2KTsKKwkJCWRiZygiJXM6IGRldiAlcCAhPSAlcCIsIF9fRlVOQ1RJT05fXywKKwkJCQl1cmItPmRldiwgc2VyaWFsLT5kZXYpOwogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBtYWtlIHN1cmUgZW5kcG9pbnQgZGF0YSB0b2dnbGUgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIGRldmljZSAqLwotCisJCS8qCisJCSAqIG1ha2Ugc3VyZSBlbmRwb2ludCBkYXRhIHRvZ2dsZSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKKwkJICogZGV2aWNlCisJCSAqLwogCQl1c2JfY2xlYXJfaGFsdCh1cmItPmRldiwgdXJiLT5waXBlKTsKIAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKSB7Ci0JCQlkYmcoIiVzOiBzdWJtaXQgdXJiICVkIGZhaWxlZCAoJWQpICVkIiwgX19GVU5DVElPTl9fLCBpLCBlcnIsCisJCQlkYmcoIiVzOiBzdWJtaXQgdXJiICVkIGZhaWxlZCAoJWQpICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGksIGVyciwKIAkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCQl9CiAJfQpAQCAtNTExLDcgKzQ5Niw4IEBACiAJCWlmICghIHVyYikKIAkJCWNvbnRpbnVlOwogCQl1cmItPmRldiA9IHNlcmlhbC0+ZGV2OwotCQkvKiB1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksIHVzYl9waXBlb3V0KHVyYi0+cGlwZSksIDApOyAqLworCQkvKiB1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQkJdXNiX3BpcGVvdXQodXJiLT5waXBlKSwgMCk7ICovCiAJfQogCiAJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IDE7CkBAIC01MjEsMTcgKzUwNywxMyBAQAogCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotc3RvcF91cmIgKHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JaWYgKHVyYiAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKKwlpZiAodXJiICYmIHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKIAkJdXNiX2tpbGxfdXJiKHVyYik7Ci0JfQogfQogCi1zdGF0aWMgdm9pZAotb3B0aW9uX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwpAQCAtNTU1LDEyICs1MzcsMTAgQEAKIAlwb3J0LT50dHkgPSBOVUxMOwogfQogCi0KIC8qIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBvcHRpb25fc2V0dXBfdXJicyAqLwotc3RhdGljIHN0cnVjdCB1cmIgKgotb3B0aW9uX3NldHVwX3VyYiAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IGVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgaW50IGRpciwgdm9pZCAqY3R4LCBjaGFyICpidWYsIGludCBsZW4sCi0gICAgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB1cmIgKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpKQorc3RhdGljIHN0cnVjdCB1cmIgKm9wdGlvbl9zZXR1cF91cmIoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IGVuZHBvaW50LAorCQlpbnQgZGlyLCB2b2lkICpjdHgsIGNoYXIgKmJ1ZiwgaW50IGxlbiwKKwkJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdXJiICosIHN0cnVjdCBwdF9yZWdzICpyZWdzKSkKIHsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAKQEAgLTU4Miw4ICs1NjIsNyBAQAogfQogCiAvKiBTZXR1cCB1cmJzICovCi1zdGF0aWMgdm9pZAotb3B0aW9uX3NldHVwX3VyYnMgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCitzdGF0aWMgdm9pZCBvcHRpb25fc2V0dXBfdXJicyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCWludCBqOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CkBAIC02MDksOSArNTg4LDcgQEAKIAl9CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX3NlbmRfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CkBAIC02MjcsMTYgKzYwNCwxNSBAQAogCQlpZiAocG9ydGRhdGEtPnJ0c19zdGF0ZSkKIAkJCXZhbCB8PSAweDAyOwogCi0JCXJldHVybiB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkJCTB4MjIsMHgyMSx2YWwsMCxOVUxMLDAsVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkJMHgyMiwweDIxLHZhbCwwLE5VTEwsMCxVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludAotb3B0aW9uX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCitzdGF0aWMgaW50IG9wdGlvbl9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJaW50IGksIGVycjsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwpAQCAtNjQ3LDkgKzYyMywxMCBAQAogCS8qIE5vdyBzZXR1cCBwZXIgcG9ydCBwcml2YXRlIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7IGkrKykgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwotCQlwb3J0ZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJCXBvcnRkYXRhID0ga21hbGxvYyhzaXplb2YoKnBvcnRkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcG9ydGRhdGEpIHsKLQkJCWRiZygiJXM6IGttYWxsb2MgZm9yIG9wdGlvbl9wb3J0X3ByaXZhdGUgKCVkKSBmYWlsZWQhLiIsIF9fRlVOQ1RJT05fXywgaSk7CisJCQlkYmcoIiVzOiBrbWFsbG9jIGZvciBvcHRpb25fcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIS4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGkpOwogCQkJcmV0dXJuICgxKTsKIAkJfQogCQltZW1zZXQocG9ydGRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSkpOwpAQCAtNjYwLDcgKzYzNyw4IEBACiAJCQljb250aW51ZTsKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIpCi0JCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlkYmcoIiVzOiBzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWQiLAorCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKIAl9CiAKIAlvcHRpb25fc2V0dXBfdXJicyhzZXJpYWwpOwpAQCAtNjY4LDggKzY0Niw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotc3RhdGljIHZvaWQKLW9wdGlvbl9zaHV0ZG93biAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3N0YXRpYyB2b2lkIG9wdGlvbl9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCWludCBpLCBqOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKaW5kZXggN2VhYjVkNC4uNDYxNDc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwpAQCAtNTM4LDggKzUzOCwxMCBAQAogCiAJZGJnKCIlcyAtICBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCi0JdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPndyaXRlX3VyYi0+cGlwZSk7Ci0JdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPnJlYWRfdXJiLT5waXBlKTsKKwlpZiAocHJpdi0+dHlwZSAhPSBIWCkgeworCQl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+d3JpdGVfdXJiLT5waXBlKTsKKwkJdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPnJlYWRfdXJiLT5waXBlKTsKKwl9CiAKIAlidWYgPSBrbWFsbG9jKDEwLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmPT1OVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKaW5kZXggMDI2N2IyNi4uZTc3ZmJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCkBAIC01MzEsNyArNTMxLDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmICghcG9ydCkKIAkJcmV0dXJuOwpAQCAtNTYxLDcgKzU2MSw3IEBACiAKIHN0YXRpYyBpbnQgc2VyaWFsX3dyaXRlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZShzKSIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CkBAIC01ODAsNyArNTgwLDcgQEAKIAogc3RhdGljIGludCBzZXJpYWxfd3JpdGVfcm9vbSAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKQEAgLTU5OSw3ICs1OTksNyBAQAogCiBzdGF0aWMgaW50IHNlcmlhbF9jaGFyc19pbl9idWZmZXIgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCByZXR2YWwgPSAtRUlOVkFMOwogCiAJZGJnKCIlcyA9IHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CkBAIC02MTgsNyArNjE4LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC02MzQsNyArNjM0LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3VudGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTY1MCw3ICs2NTAsNyBAQAogCiBzdGF0aWMgaW50IHNlcmlhbF9pb2N0bCAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0dmFsID0gLUVOT0RFVjsKIAogCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgMHglLjR4IiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNtZCk7CkBAIC02NzIsNyArNjcyLDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3NldF90ZXJtaW9zIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC02ODgsNyArNjg4LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX2JyZWFrIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIApAQCAtNzQ5LDcgKzc0OSw3IEBACiAKIHN0YXRpYyBpbnQgc2VyaWFsX3Rpb2NtZ2V0IChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC03NjgsNyArNzY4LDcgQEAKIHN0YXRpYyBpbnQgc2VyaWFsX3Rpb2Ntc2V0IChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIApAQCAtNzg2LDcgKzc4Niw3IEBACiAKIHZvaWQgdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQodm9pZCAqcHJpdmF0ZSkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKilwcml2YXRlOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBwcml2YXRlOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCBmMWYxYzA2Li5iYjk4MTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC0xMTEsMyArMTExLDE1IEBACiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIExleGFyIEp1bXBzaG90CiAJICBVU0IgQ29tcGFjdEZsYXNoIHJlYWRlci4KIAorCitjb25maWcgVVNCX1NUT1JBR0VfT05FVE9VQ0gKKwlib29sICJTdXBwb3J0IE9uZVRvdWNoIEJ1dHRvbiBvbiBNYXh0b3IgSGFyZCBEcml2ZXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0JfU1RPUkFHRSAmJiBJTlBVVF9FVkRFViAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIE1heHRvciBPbmVUb3VjaAorCSAgVVNCIGhhcmQgZHJpdmUncyBvbmV0b3VjaCBidXR0b24uCisKKwkgIFRoaXMgY29kZSByZWdpc3RlcnMgdGhlIGJ1dHRvbiBvbiB0aGUgZnJvbnQgb2YgTWF4dG9yIE9uZVRvdWNoIFVTQgorCSAgaGFyZCBkcml2ZSdzIGFzIGFuIGlucHV0IGRldmljZS4gQW4gYWN0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKwkgIHRoaXMgaW5wdXQgaW4gYW55IGtleWJpbmRpbmcgc29mdHdhcmUuIChlLmcuIGdub21lJ3Mga2V5Ym9hcmQgc2hvcnQtCisJICBjdXRzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKaW5kZXggNTY2NTJjYy4uNDRhYjhmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCkBAIC0xOCw2ICsxOCw3IEBACiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwKQkrPSBpc2QyMDAubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIpCSs9IGRhdGFmYWIubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UKQkrPSBqdW1wc2hvdC5vCit1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0gpCSs9IG9uZXRvdWNoLm8KIAogdXNiLXN0b3JhZ2Utb2JqcyA6PQlzY3NpZ2x1ZS5vIHByb3RvY29sLm8gdHJhbnNwb3J0Lm8gdXNiLm8gXAogCQkJaW5pdGlhbGl6ZXJzLm8gJCh1c2Itc3RvcmFnZS1vYmoteSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk0MDJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIE1heHRvciBPbmVUb3VjaCBVU0IgaGFyZCBkcml2ZSdzIGJ1dHRvbgorICoKKyAqIEN1cnJlbnQgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGJ5OgorICoJQ29weXJpZ2h0IChjKSAyMDA1IE5pY2sgU2lsbGlrIDxuLnNpbGxpa0B0ZW1wbGUuZWR1PgorICoKKyAqIEluaXRpYWwgd29yayBieToKKyAqIAlDb3B5cmlnaHQgKGMpIDIwMDMgRXJpayBUaHlyZW4gPGVydGg3NDExQHN0dWRlbnQudXUuc2U+CisgKgorICogQmFzZWQgb24gdXNibW91c2UuYyAoVm9qdGVjaCBQYXZsaWspIGFuZCB4cGFkLmMgKE1hcmtvIEZyaWVkZW1hbm4pCisgKgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfaW5wdXQuaD4KKyNpbmNsdWRlICJ1c2IuaCIKKyNpbmNsdWRlICJvbmV0b3VjaC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3ZvaWQgb25ldG91Y2hfcmVsZWFzZV9pbnB1dCh2b2lkICpvbmV0b3VjaF8pOworCitzdHJ1Y3QgdXNiX29uZXRvdWNoIHsKKwljaGFyIG5hbWVbMTI4XTsKKwljaGFyIHBoeXNbNjRdOworCXN0cnVjdCBpbnB1dF9kZXYgZGV2OwkvKiBpbnB1dCBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIHVzYiBkZXZpY2UgKi8KKworCXN0cnVjdCB1cmIgKmlycTsJLyogdXJiIGZvciBpbnRlcnJ1cHQgaW4gcmVwb3J0ICovCisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogaW5wdXQgZGF0YSAqLworCWRtYV9hZGRyX3QgZGF0YV9kbWE7Cit9OworCitzdGF0aWMgdm9pZCB1c2Jfb25ldG91Y2hfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9vbmV0b3VjaCAqb25ldG91Y2ggPSB1cmItPmNvbnRleHQ7CisJc2lnbmVkIGNoYXIgKmRhdGEgPSBvbmV0b3VjaC0+ZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmb25ldG91Y2gtPmRldjsKKwlpbnQgc3RhdHVzOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXJldHVybjsKKwkvKiAtRVBJUEU6ICBzaG91bGQgY2xlYXIgdGhlIGhhbHQgKi8KKwlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJZ290byByZXN1Ym1pdDsKKwl9CisKKwlpbnB1dF9yZWdzKGRldiwgcmVncyk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KCZvbmV0b3VjaC0+ZGV2LCBPTkVUT1VDSF9CVVRUT04sCisJCQkgZGF0YVswXSAmIDB4MDIpOworCisJaW5wdXRfc3luYyhkZXYpOworcmVzdWJtaXQ6CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9BVE9NSUMpOworCWlmIChzdGF0dXMpCisJCWVyciAoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0MCwgc3RhdHVzICVkIiwKKwkJCW9uZXRvdWNoLT51ZGV2LT5idXMtPmJ1c19uYW1lLAorCQkJb25ldG91Y2gtPnVkZXYtPmRldnBhdGgsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX29uZXRvdWNoX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2Jfb25ldG91Y2ggKm9uZXRvdWNoID0gZGV2LT5wcml2YXRlOworCisJb25ldG91Y2gtPmlycS0+ZGV2ID0gb25ldG91Y2gtPnVkZXY7CisJaWYgKHVzYl9zdWJtaXRfdXJiKG9uZXRvdWNoLT5pcnEsIEdGUF9LRVJORUwpKSB7CisJCWVycigidXNiX3N1Ym1pdF91cmIgZmFpbGVkIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2Jfb25ldG91Y2hfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2Jfb25ldG91Y2ggKm9uZXRvdWNoID0gZGV2LT5wcml2YXRlOworCisJdXNiX2tpbGxfdXJiKG9uZXRvdWNoLT5pcnEpOworfQorCitpbnQgb25ldG91Y2hfY29ubmVjdF9pbnB1dChzdHJ1Y3QgdXNfZGF0YSAqc3MpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzcy0+cHVzYl9kZXY7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9vbmV0b3VjaCAqb25ldG91Y2g7CisJaW50IHBpcGUsIG1heHA7CisJY2hhciBwYXRoWzY0XTsKKworCWludGVyZmFjZSA9IHNzLT5wdXNiX2ludGYtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDMpCisJCXJldHVybiAtRU5PREVWOworCisJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFsyXS5kZXNjOworCWlmKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKKwkJCSE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCWlmICghKG9uZXRvdWNoID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHVzYl9vbmV0b3VjaCksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvbmV0b3VjaC0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgT05FVE9VQ0hfUEtUX0xFTiwKKwkJCQkJICBTTEFCX0FUT01JQywgJm9uZXRvdWNoLT5kYXRhX2RtYSk7CisJaWYgKCFvbmV0b3VjaC0+ZGF0YSl7CisJCWtmcmVlKG9uZXRvdWNoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb25ldG91Y2gtPmlycSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvbmV0b3VjaC0+aXJxKXsKKwkJa2ZyZWUob25ldG91Y2gpOworCQl1c2JfYnVmZmVyX2ZyZWUodWRldiwgT05FVE9VQ0hfUEtUX0xFTiwKKwkJCQlvbmV0b3VjaC0+ZGF0YSwgb25ldG91Y2gtPmRhdGFfZG1hKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisKKwlvbmV0b3VjaC0+dWRldiA9IHVkZXY7CisKKwlzZXRfYml0KEVWX0tFWSwgb25ldG91Y2gtPmRldi5ldmJpdCk7CisJc2V0X2JpdChPTkVUT1VDSF9CVVRUT04sIG9uZXRvdWNoLT5kZXYua2V5Yml0KTsKKwljbGVhcl9iaXQoMCwgb25ldG91Y2gtPmRldi5rZXliaXQpOworCisJb25ldG91Y2gtPmRldi5wcml2YXRlID0gb25ldG91Y2g7CisJb25ldG91Y2gtPmRldi5vcGVuID0gdXNiX29uZXRvdWNoX29wZW47CisJb25ldG91Y2gtPmRldi5jbG9zZSA9IHVzYl9vbmV0b3VjaF9jbG9zZTsKKworCXVzYl9tYWtlX3BhdGgodWRldiwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKKwlzcHJpbnRmKG9uZXRvdWNoLT5waHlzLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisKKwlvbmV0b3VjaC0+ZGV2Lm5hbWUgPSBvbmV0b3VjaC0+bmFtZTsKKwlvbmV0b3VjaC0+ZGV2LnBoeXMgPSBvbmV0b3VjaC0+cGh5czsKKworCXVzYl90b19pbnB1dF9pZCh1ZGV2LCAmb25ldG91Y2gtPmRldi5pZCk7CisKKwlvbmV0b3VjaC0+ZGV2LmRldiA9ICZ1ZGV2LT5kZXY7CisKKwlpZiAodWRldi0+bWFudWZhY3R1cmVyKQorCQlzdHJjYXQob25ldG91Y2gtPm5hbWUsIHVkZXYtPm1hbnVmYWN0dXJlcik7CisJaWYgKHVkZXYtPnByb2R1Y3QpCisJCXNwcmludGYob25ldG91Y2gtPm5hbWUsICIlcyAlcyIsIG9uZXRvdWNoLT5uYW1lLAorCQkJdWRldi0+cHJvZHVjdCk7CisJaWYgKCFzdHJsZW4ob25ldG91Y2gtPm5hbWUpKQorCQlzcHJpbnRmKG9uZXRvdWNoLT5uYW1lLCAiTWF4dG9yIE9uZXRvdWNoICUwNHg6JTA0eCIsCisJCQlvbmV0b3VjaC0+ZGV2LmlkLnZlbmRvciwgb25ldG91Y2gtPmRldi5pZC5wcm9kdWN0KTsKKworCXVzYl9maWxsX2ludF91cmIob25ldG91Y2gtPmlycSwgdWRldiwgcGlwZSwgb25ldG91Y2gtPmRhdGEsCisJCQkgKG1heHAgPiA4ID8gOCA6IG1heHApLAorCQkJIHVzYl9vbmV0b3VjaF9pcnEsIG9uZXRvdWNoLCBlbmRwb2ludC0+YkludGVydmFsKTsKKwlvbmV0b3VjaC0+aXJxLT50cmFuc2Zlcl9kbWEgPSBvbmV0b3VjaC0+ZGF0YV9kbWE7CisJb25ldG91Y2gtPmlycS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwlzcy0+ZXh0cmFfZGVzdHJ1Y3RvciA9IG9uZXRvdWNoX3JlbGVhc2VfaW5wdXQ7CisJc3MtPmV4dHJhID0gb25ldG91Y2g7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJm9uZXRvdWNoLT5kZXYpOworCXByaW50ayhLRVJOX0lORk8gInVzYi1pbnB1dDogJXMgb24gJXNcbiIsIG9uZXRvdWNoLT5kZXYubmFtZSwgcGF0aCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbmV0b3VjaF9yZWxlYXNlX2lucHV0KHZvaWQgKm9uZXRvdWNoXykKK3sKKwlzdHJ1Y3QgdXNiX29uZXRvdWNoICpvbmV0b3VjaCA9IChzdHJ1Y3QgdXNiX29uZXRvdWNoICopIG9uZXRvdWNoXzsKKworCWlmIChvbmV0b3VjaCkgeworCQl1c2Jfa2lsbF91cmIob25ldG91Y2gtPmlycSk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZvbmV0b3VjaC0+ZGV2KTsKKwkJdXNiX2ZyZWVfdXJiKG9uZXRvdWNoLT5pcnEpOworCQl1c2JfYnVmZmVyX2ZyZWUob25ldG91Y2gtPnVkZXYsIE9ORVRPVUNIX1BLVF9MRU4sCisJCQkJb25ldG91Y2gtPmRhdGEsIG9uZXRvdWNoLT5kYXRhX2RtYSk7CisJCXByaW50ayhLRVJOX0lORk8gInVzYi1pbnB1dDogZGVyZWdpc3RlcmluZyAlc1xuIiwKKwkJCQlvbmV0b3VjaC0+ZGV2Lm5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM3YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfT05FVE9VQ0hfSF8KKyNkZWZpbmUgX09ORVRPVUNIX0hfCisKKyNkZWZpbmUgT05FVE9VQ0hfUEtUX0xFTiAgICAgICAgMHgwMgorI2RlZmluZSBPTkVUT1VDSF9CVVRUT04gICAgICAgICBLRVlfUFJPRzEKKworaW50IG9uZXRvdWNoX2Nvbm5lY3RfaW5wdXQoc3RydWN0IHVzX2RhdGEgKnNzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggYWYyOTRiYi4uZDM0ZGM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtMTU2LDYgKzE1NiwxNCBAQAogCQlpZiAodXMtPmZsYWdzICYgVVNfRkxfRklYX0NBUEFDSVRZKQogCQkJc2Rldi0+Zml4X2NhcGFjaXR5ID0gMTsKIAorCQkvKiBTb21lIGRldmljZXMgcmVwb3J0IGEgU0NTSSByZXZpc2lvbiBsZXZlbCBhYm92ZSAyIGJ1dCBhcmUKKwkJICogdW5hYmxlIHRvIGhhbmRsZSB0aGUgUkVQT1JUIExVTlMgY29tbWFuZCAoZm9yIHdoaWNoCisJCSAqIHN1cHBvcnQgaXMgbWFuZGF0b3J5IGF0IGxldmVsIDMpLiAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlCisJCSAqIGEgR2V0LU1heC1MVU4gcmVxdWVzdCwgd2Ugd29uJ3QgbG9zZSBtdWNoIGJ5IHNldHRpbmcgdGhlCisJCSAqIHJldmlzaW9uIGxldmVsIGRvd24gdG8gMi4gIFRoZSBvbmx5IGRldmljZXMgdGhhdCB3b3VsZCBiZQorCQkgKiBhZmZlY3RlZCBhcmUgdGhvc2Ugd2l0aCBzcGFyc2UgTFVOcy4gKi8KKwkJc2Rldi0+c2NzaV9sZXZlbCA9IFNDU0lfMjsKKwogCQkvKiBVU0ItSURFIGJyaWRnZXMgdGVuZCB0byByZXBvcnQgU0sgPSAweDA0IChOb24tcmVjb3ZlcmFibGUKIAkJICogSGFyZHdhcmUgRXJyb3IpIHdoZW4gYW55IGxvdy1sZXZlbCBlcnJvciBvY2N1cnMsCiAJCSAqIHJlY292ZXJhYmxlIG9yIG5vdC4gIFNldHRpbmcgdGhpcyBmbGFnIHRlbGxzIHRoZSBTQ1NJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NodXR0bGVfdXNiYXQuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2h1dHRsZV91c2JhdC5jCmluZGV4IGYzYjYwMjguLjM1NjM0MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2h1dHRsZV91c2JhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2h1dHRsZV91c2JhdC5jCkBAIC04MzksMzQgKzgzOSwzMSBAQAogCXJjID0gdXNiYXRfZGV2aWNlX3Jlc2V0KHVzKTsKIAlpZiAocmMgIT0gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0QpCiAJCXJldHVybiByYzsKKwltc2xlZXAoMjUpOwogCiAJLyoKLQkgKiBCeSBleGFtaW5pbmcgdGhlIGRldmljZSBzaWduYXR1cmUgYWZ0ZXIgYSByZXNldCwgd2UgY2FuIGlkZW50aWZ5Ci0JICogd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSBBVEFQSSBwYWNrZXQgaW50ZXJmYWNlLgotCSAqIFRoZSBmbGFzaC1kZXZpY2VzIGRvIG5vdCBzdXBwb3J0IHRoaXMsIHdoZXJlYXMgdGhlIEhQIENEUlcncyBvYnZpb3VzbHkKLQkgKiBkby4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBpZGVhbCwgYnV0IHdvcmtzIGJlY2F1c2Ugbm8gb3RoZXIgZGV2aWNlcyBoYXZlIGJlZW4KLQkgKiBwcm9kdWNlZCBiYXNlZCBvbiB0aGUgVVNCQVQvVVNCQVQwMi4KLQkgKgotCSAqIFNlY3Rpb24gOS4xIG9mIHRoZSBBVEFQSS00IHNwZWMgc3RhdGVzIChhbW9uZ3N0IG90aGVyIHRoaW5ncykgdGhhdAotCSAqIGFmdGVyIGEgZGV2aWNlIHJlc2V0LCBhIEN5bGluZGVyIGxvdyBvZiAweDE0IGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UKLQkgKiBkb2VzIHN1cHBvcnQgcGFja2V0IGNvbW1hbmRzLgorCSAqIEluIGF0dGVtcHQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBIUCBDRFJXJ3MgYW5kIEZsYXNoIHJlYWRlcnMsIHdlIG5vdworCSAqIGV4ZWN1dGUgdGhlIElERU5USUZZIFBBQ0tFVCBERVZJQ0UgY29tbWFuZC4gT24gQVRBIGRldmljZXMgKGkuZS4gZmxhc2gKKwkgKiByZWFkZXJzKSwgdGhpcyBjb21tYW5kIHNob3VsZCBmYWlsIHdpdGggZXJyb3IuIE9uIEFUQVBJIGRldmljZXMgKGkuZS4KKwkgKiBDRFJPTSBkcml2ZXMpLCBpdCBzaG91bGQgc3VjY2VlZC4KIAkgKi8KLQlyYyA9IHVzYmF0X3JlYWQodXMsIFVTQkFUX0FUQSwgVVNCQVRfQVRBX0xCQV9NRSwgJnN0YXR1cyk7Ci0JaWYgKHJjICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKKwlyYyA9IHVzYmF0X3dyaXRlKHVzLCBVU0JBVF9BVEEsIFVTQkFUX0FUQV9DTUQsIDB4QTEpOworIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQorIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCVVTX0RFQlVHUCgidXNiYXRfaWRlbnRpZnlfZGV2aWNlOiBDeWxpbmRlciBsb3cgaXMgJTAyWFxuIiwgc3RhdHVzKTsKKwlyYyA9IHVzYmF0X2dldF9zdGF0dXModXMsICZzdGF0dXMpOworIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQorIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCWlmIChzdGF0dXMgPT0gMHgxNCkgeworCS8vIENoZWNrIGZvciBlcnJvciBiaXQKKwlpZiAoc3RhdHVzICYgMHgwMSkgeworCQkgLy8gRGV2aWNlIGlzIGEgQ29tcGFjdEZsYXNoIHJlYWRlci93cml0ZXIKKwkJVVNfREVCVUdQKCJ1c2JhdF9pZGVudGlmeV9kZXZpY2U6IERldGVjdGVkIEZsYXNoIHJlYWRlci93cml0ZXJcbiIpOworCQlpbmZvLT5kZXZpY2V0eXBlID0gVVNCQVRfREVWX0ZMQVNIOworCX0gZWxzZSB7CiAJCS8vIERldmljZSBpcyBIUCA4MjAwCiAJCVVTX0RFQlVHUCgidXNiYXRfaWRlbnRpZnlfZGV2aWNlOiBEZXRlY3RlZCBIUDgyMDAgQ0RSV1xuIik7CiAJCWluZm8tPmRldmljZXR5cGUgPSBVU0JBVF9ERVZfSFA4MjAwOwotCX0gZWxzZSB7Ci0JCS8vIERldmljZSBpcyBhIENvbXBhY3RGbGFzaCByZWFkZXIvd3JpdGVyCi0JCVVTX0RFQlVHUCgidXNiYXRfaWRlbnRpZnlfZGV2aWNlOiBEZXRlY3RlZCBGbGFzaCByZWFkZXIvd3JpdGVyXG4iKTsKLQkJaW5mby0+ZGV2aWNldHlwZSA9IFVTQkFUX0RFVl9GTEFTSDsKIAl9CiAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CkBAIC0xMjM5LDE2ICsxMjM2LDEwIEBACiB7CiAJaW50IHNlbGVjdG9yOwogCXVuc2lnbmVkIGNoYXIgKnN0YXR1cyA9IHVzLT5pb2J1ZjsKLQl1bnNpZ25lZCBjaGFyIG1heF9zZWxlY3RvciA9IDB4QjA7Ci0JaWYgKHVzYmF0X2dldF9kZXZpY2VfdHlwZSh1cykgPT0gVVNCQVRfREVWX0ZMQVNIKQotCQltYXhfc2VsZWN0b3IgPSAweEEwOwogCiAJLy8gdHJ5IGRldmljZSA9IG1hc3RlciwgdGhlbiBkZXZpY2UgPSBzbGF2ZS4KLQotCWZvciAoc2VsZWN0b3IgPSAweEEwOyBzZWxlY3RvciA8PSBtYXhfc2VsZWN0b3I7IHNlbGVjdG9yICs9IDB4MTApIHsKLQotCQlpZiAodXNiYXRfZ2V0X2RldmljZV90eXBlKHVzKSA9PSBVU0JBVF9ERVZfSFA4MjAwICYmCi0JCQl1c2JhdF93cml0ZSh1cywgVVNCQVRfQVRBLCBVU0JBVF9BVEFfREVWSUNFLCBzZWxlY3RvcikgIT0gCisJZm9yIChzZWxlY3RvciA9IDB4QTA7IHNlbGVjdG9yIDw9IDB4QjA7IHNlbGVjdG9yICs9IDB4MTApIHsKKwkJaWYgKHVzYmF0X3dyaXRlKHVzLCBVU0JBVF9BVEEsIFVTQkFUX0FUQV9ERVZJQ0UsIHNlbGVjdG9yKSAhPQogCQkJCVVTQl9TVE9SX1hGRVJfR09PRCkKIAkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKQEAgLTEzMzQsNjAgKzEzMjUsMzAgQEAKIAogCVVTX0RFQlVHUCgiSU5JVCAzXG4iKTsKIAotCS8vIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gZGV0ZWN0IHdoaWNoIGRldmljZSB3ZSBhcmUgdXNpbmcKLQlpZiAodXNiYXRfc2V0X3RyYW5zcG9ydCh1cywgaW5mbykpCi0JCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Ci0KLQlVU19ERUJVR1AoIklOSVQgNFxuIik7Ci0KLQlpZiAodXNiYXRfZ2V0X2RldmljZV90eXBlKHVzKSA9PSBVU0JBVF9ERVZfSFA4MjAwKSB7Ci0JCW1zbGVlcCgyNTApOwotCi0JCS8vIFdyaXRlIDB4ODAgdG8gSVNBIHBvcnQgMHgzRgotCQlyYyA9IHVzYmF0X3dyaXRlKHVzLCBVU0JBVF9JU0EsIDB4M0YsIDB4ODApOwotCQlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQotCQlVU19ERUJVR1AoIklOSVQgNVxuIik7Ci0KLQkJLy8gUmVhZCBJU0EgcG9ydCAweDI3Ci0JCXJjID0gdXNiYXRfcmVhZCh1cywgVVNCQVRfSVNBLCAweDI3LCBzdGF0dXMpOwotCQlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQotCQlVU19ERUJVR1AoIklOSVQgNlxuIik7Ci0KLQkJcmMgPSB1c2JhdF9yZWFkX3VzZXJfaW8odXMsIHN0YXR1cyk7Ci0JCWlmIChyYyAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCi0JCVVTX0RFQlVHUCgiSU5JVCA3XG4iKTsKLQl9Ci0KIAlyYyA9IHVzYmF0X3NlbGVjdF9hbmRfdGVzdF9yZWdpc3RlcnModXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKIAkJcmV0dXJuIHJjOwogCi0JVVNfREVCVUdQKCJJTklUIDhcbiIpOworCVVTX0RFQlVHUCgiSU5JVCA0XG4iKTsKIAogCXJjID0gdXNiYXRfcmVhZF91c2VyX2lvKHVzLCBzdGF0dXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQlVU19ERUJVR1AoIklOSVQgOVxuIik7CisJVVNfREVCVUdQKCJJTklUIDVcbiIpOwogCiAJLy8gRW5hYmxlIHBlcmlwaGVyYWwgY29udHJvbCBzaWduYWxzIGFuZCBjYXJkIGRldGVjdAogCXJjID0gdXNiYXRfZGV2aWNlX2VuYWJsZV9jZHQodXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKIAkJcmV0dXJuIHJjOwogCi0JVVNfREVCVUdQKCJJTklUIDEwXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgNlxuIik7CiAKIAlyYyA9IHVzYmF0X3JlYWRfdXNlcl9pbyh1cywgc3RhdHVzKTsKIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JVVNfREVCVUdQKCJJTklUIDExXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgN1xuIik7CiAKIAltc2xlZXAoMTQwMCk7CiAKQEAgLTEzOTUsMTMgKzEzNTYsMTkgQEAKIAlpZiAocmMgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JVVNfREVCVUdQKCJJTklUIDEyXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgOFxuIik7CiAKIAlyYyA9IHVzYmF0X3NlbGVjdF9hbmRfdGVzdF9yZWdpc3RlcnModXMpOwogCWlmIChyYyAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKIAkJcmV0dXJuIHJjOwogCi0JVVNfREVCVUdQKCJJTklUIDEzXG4iKTsKKwlVU19ERUJVR1AoIklOSVQgOVxuIik7CisKKwkvLyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGRldGVjdCB3aGljaCBkZXZpY2Ugd2UgYXJlIHVzaW5nCisJaWYgKHVzYmF0X3NldF90cmFuc3BvcnQodXMsIGluZm8pKQorCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOworCisJVVNfREVCVUdQKCJJTklUIDEwXG4iKTsKIAogCWlmICh1c2JhdF9nZXRfZGV2aWNlX3R5cGUodXMpID09IFVTQkFUX0RFVl9GTEFTSCkgeyAKIAkJc3ViY291bnRIID0gMHgwMjsKQEAgLTE0MTIsNyArMTM3OSw3IEBACiAJaWYgKHJjICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCVVTX0RFQlVHUCgiSU5JVCAxNFxuIik7CisJVVNfREVCVUdQKCJJTklUIDExXG4iKTsKIAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IGU2YjFjNmMuLmMxYmE1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtOTYsOCArOTYsOCBAQAogICogb3IgYmVmb3JlIHRoZSBVUkJfQUNUSVZFIGJpdCB3YXMgc2V0LiAgSWYgc28sIGl0J3MgZXNzZW50aWFsIHRvIGNhbmNlbAogICogdGhlIFVSQiBpZiBpdCBoYXNuJ3QgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeSAoaS5lLiwgaWYgdGhlIFVSQl9BQ1RJVkUgYml0CiAgKiBpcyBzdGlsbCBzZXQpLiAgRWl0aGVyIHdheSwgdGhlIGZ1bmN0aW9uIG11c3QgdGhlbiB3YWl0IGZvciB0aGUgVVJCIHRvCi0gKiBmaW5pc2guICBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgVVJCX0FTWU5DX1VOTElOSyBmbGFnIGlzIHNldCwgdGhlIFVSQiBjYW4KLSAqIHN0aWxsIGJlIGluIHByb2dyZXNzIGV2ZW4gYWZ0ZXIgYSBjYWxsIHRvIHVzYl91bmxpbmtfdXJiKCkgcmV0dXJucy4KKyAqIGZpbmlzaC4gIE5vdGUgdGhhdCB0aGUgVVJCIGNhbiBzdGlsbCBiZSBpbiBwcm9ncmVzcyBldmVuIGFmdGVyIGEgY2FsbCB0bworICogdXNiX3VubGlua191cmIoKSByZXR1cm5zLgogICoKICAqIFRoZSBpZGVhIGlzIHRoYXQgKDEpIG9uY2UgdGhlIEFCT1JUSU5HIG9yIERJU0NPTk5FQ1RJTkcgYml0IGlzIHNldCwKICAqIGVpdGhlciB0aGUgc3RvcF90cmFuc3BvcnQoKSBmdW5jdGlvbiBvciB0aGUgc3VibWl0dGluZyBmdW5jdGlvbgpAQCAtMTU4LDggKzE1OCw3IEBACiAJICogaGFzbid0IGJlZW4gbWFwcGVkIGZvciBETUEuICBZZXMsIHRoaXMgaXMgY2x1bmt5LCBidXQgaXQncwogCSAqIGVhc2llciB0aGFuIGFsd2F5cyBoYXZpbmcgdGhlIGNhbGxlciB0ZWxsIHVzIHdoZXRoZXIgdGhlCiAJICogdHJhbnNmZXIgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gbWFwcGVkLiAqLwotCXVzLT5jdXJyZW50X3VyYi0+dHJhbnNmZXJfZmxhZ3MgPQotCQkJVVJCX0FTWU5DX1VOTElOSyB8IFVSQl9OT19TRVRVUF9ETUFfTUFQOworCXVzLT5jdXJyZW50X3VyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfTk9fU0VUVVBfRE1BX01BUDsKIAlpZiAodXMtPmN1cnJlbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gdXMtPmlvYnVmKQogCQl1cy0+Y3VycmVudF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCXVzLT5jdXJyZW50X3VyYi0+dHJhbnNmZXJfZG1hID0gdXMtPmlvYnVmX2RtYTsKQEAgLTYxMSw3ICs2MTAsNiBAQAogCQl1bnNpZ25lZCBjaGFyIG9sZF9zY19kYXRhX2RpcmVjdGlvbjsKIAkJdW5zaWduZWQgY2hhciBvbGRfY21kX2xlbjsKIAkJdW5zaWduZWQgY2hhciBvbGRfY21uZFtNQVhfQ09NTUFORF9TSVpFXTsKLQkJdW5zaWduZWQgbG9uZyBvbGRfc2VyaWFsX251bWJlcjsKIAkJaW50IG9sZF9yZXNpZDsKIAogCQlVU19ERUJVR1AoIklzc3VpbmcgYXV0by1SRVFVRVNUX1NFTlNFXG4iKTsKQEAgLTY0OCwxMCArNjQ2LDYgQEAKIAkJb2xkX3NnID0gc3JiLT51c2Vfc2c7CiAJCXNyYi0+dXNlX3NnID0gMDsKIAotCQkvKiBjaGFuZ2UgdGhlIHNlcmlhbCBudW1iZXIgLS0gdG9nZ2xlIHRoZSBoaWdoIGJpdCovCi0JCW9sZF9zZXJpYWxfbnVtYmVyID0gc3JiLT5zZXJpYWxfbnVtYmVyOwotCQlzcmItPnNlcmlhbF9udW1iZXIgXj0gMHg4MDAwMDAwMDsKLQogCQkvKiBpc3N1ZSB0aGUgYXV0by1zZW5zZSBjb21tYW5kICovCiAJCW9sZF9yZXNpZCA9IHNyYi0+cmVzaWQ7CiAJCXNyYi0+cmVzaWQgPSAwOwpAQCAtNjYyLDcgKzY1Niw2IEBACiAJCXNyYi0+cmVxdWVzdF9idWZmZXIgPSBvbGRfcmVxdWVzdF9idWZmZXI7CiAJCXNyYi0+cmVxdWVzdF9idWZmbGVuID0gb2xkX3JlcXVlc3RfYnVmZmxlbjsKIAkJc3JiLT51c2Vfc2cgPSBvbGRfc2c7Ci0JCXNyYi0+c2VyaWFsX251bWJlciA9IG9sZF9zZXJpYWxfbnVtYmVyOwogCQlzcmItPnNjX2RhdGFfZGlyZWN0aW9uID0gb2xkX3NjX2RhdGFfZGlyZWN0aW9uOwogCQlzcmItPmNtZF9sZW4gPSBvbGRfY21kX2xlbjsKIAkJbWVtY3B5KHNyYi0+Y21uZCwgb2xkX2NtbmQsIE1BWF9DT01NQU5EX1NJWkUpOwpAQCAtOTg1LDcgKzk3OCw3IEBACiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gY3B1X3RvX2xlMzIodHJhbnNmZXJfbGVuZ3RoKTsKIAliY2ItPkZsYWdzID0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UgPyAxIDw8IDcgOiAwOwotCWJjYi0+VGFnID0gc3JiLT5zZXJpYWxfbnVtYmVyOworCWJjYi0+VGFnID0gKyt1cy0+dGFnOwogCWJjYi0+THVuID0gc3JiLT5kZXZpY2UtPmx1bjsKIAlpZiAodXMtPmZsYWdzICYgVVNfRkxfU0NNX01VTFRfVEFSRykKIAkJYmNiLT5MdW4gfD0gc3JiLT5kZXZpY2UtPmlkIDw8IDQ7CkBAIC0xMDc0LDcgKzEwNjcsNyBAQAogCVVTX0RFQlVHUCgiQnVsayBTdGF0dXMgUyAweCV4IFQgMHgleCBSICV1IFN0YXQgMHgleFxuIiwKIAkJCWxlMzJfdG9fY3B1KGJjcy0+U2lnbmF0dXJlKSwgYmNzLT5UYWcsIAogCQkJcmVzaWR1ZSwgYmNzLT5TdGF0dXMpOwotCWlmIChiY3MtPlRhZyAhPSBzcmItPnNlcmlhbF9udW1iZXIgfHwgYmNzLT5TdGF0dXMgPiBVU19CVUxLX1NUQVRfUEhBU0UpIHsKKwlpZiAoYmNzLT5UYWcgIT0gdXMtPnRhZyB8fCBiY3MtPlN0YXR1cyA+IFVTX0JVTEtfU1RBVF9QSEFTRSkgewogCQlVU19ERUJVR1AoIkJ1bGsgbG9naWNhbCBlcnJvclxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYmQwYWIzMC4uYWQwY2ZkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCkBAIC03OSw2ICs3OSwxMyBAQAogCQlVU19TQ184MDcwLCBVU19QUl9TQ01fQVRBUEksIGluaXRfdXNiYXQsIDApLCAKICNlbmRpZgogCisvKiBQYXRjaCBzdWJtaXR0ZWQgYnkgTWlobmVhLUNvc3RpbiBHcmlnb3JlIDxtaWhuZWFAenVsdS5ybz4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNDBkLCAweDYyMDUsIDB4MDAwMywgMHgwMDAzLAorCQkiVklBIFRlY2hub2xvZ2llcyBJbmMuIiwKKwkJIlVTQiAyLjAgQ2FyZCBSZWFkZXIiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKKwogLyogRGVkdWNlZCBieSBKb25hdGhhbiBXb2l0aGUgPGp3b2l0aGVAcGh5c2ljcy5hZGVsYWlkZS5lZHUuYXU+CiAgKiBFbnRyeSBuZWVkZWQgZm9yIGZsYWdzOiBVU19GTF9GSVhfSU5RVUlSWSBiZWNhdXNlIGluaXRpYWwgaW5xdWlyeSBtZXNzYWdlCiAgKiBhbHdheXMgZmFpbHMgYW5kIGNvbmZ1c2VzIGRyaXZlLgpAQCAtOTI5LDYgKzkzNiwxOCBAQAogCSAgICAgICBVU19GTF9TSU5HTEVfTFVOICksCiAjZW5kaWYKIAorLyogU3VibWl0dGVkIGJ5OiBOaWNrIFNpbGxpayA8bi5zaWxsaWtAdGVtcGxlLmVkdT4KKyAqIE5lZWRlZCBmb3IgT25lVG91Y2ggZXh0ZW5zaW9uIHRvIHVzYi1zdG9yYWdlCisgKgorICovCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNICisJVU5VU1VBTF9ERVYoICAweDBkNDksIDB4NzAxMCwgMHgwMDAwLCAweDk5OTksCisJCQkiTWF4dG9yIiwKKwkJCSJPbmVUb3VjaCBFeHRlcm5hbCBIYXJkZHJpdmUiLAorCQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIG9uZXRvdWNoX2Nvbm5lY3RfaW5wdXQsCisJCQkwKSwKKyNlbmRpZgorCiAvKiBTdWJtaXR0ZWQgYnkgSm9yaXMgU3RydXl2ZSA8am9yaXNAc3RydXl2ZS5iZT4gKi8KIFVOVVNVQUxfREVWKCAweDBkOTYsIDB4NDEwYSwgMHgwMDAxLCAweGZmZmYsCiAJCSJNZWRpb24iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggNzdlN2ZjMi4uY2I0Yzc3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC05MCw3ICs5MCw5IEBACiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UCiAjaW5jbHVkZSAianVtcHNob3QuaCIKICNlbmRpZgotCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNICisjaW5jbHVkZSAib25ldG91Y2guaCIKKyNlbmRpZgogCiAvKiBTb21lIGluZm9ybWF0aW9uYWwgZGF0YSAqLwogTU9EVUxFX0FVVEhPUigiTWF0dGhldyBEaGFybSA8bWRoYXJtLXVzYkBvbmUtZXllZC1hbGllbi5uZXQ+Iik7CkBAIC03ODYsNiArNzg4LDcgQEAKIAkgKiBhbnkgbW9yZSBjb21tYW5kcy4KIAkgKi8KIAlVU19ERUJVR1AoIi0tIHNlbmRpbmcgZXhpdCBjb21tYW5kIHRvIHRocmVhZFxuIik7CisJc2V0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKTsKIAl1cCgmdXMtPnNlbWEpOwogCiAJLyogQ2FsbCB0aGUgZGVzdHJ1Y3RvciByb3V0aW5lLCBpZiBpdCBleGlzdHMgKi8KQEAgLTgxNiw2ICs4MTksNDkgQEAKIAl1c2Jfc2V0X2ludGZkYXRhKHVzLT5wdXNiX2ludGYsIE5VTEwpOwogfQogCisvKiBGaXJzdCBzdGFnZSBvZiBkaXNjb25uZWN0IHByb2Nlc3Npbmc6IHN0b3AgYWxsIGNvbW1hbmRzIGFuZCByZW1vdmUKKyAqIHRoZSBob3N0ICovCitzdGF0aWMgdm9pZCBxdWllc2NlX2FuZF9yZW1vdmVfaG9zdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJLyogUHJldmVudCBuZXcgVVNCIHRyYW5zZmVycywgc3RvcCB0aGUgY3VycmVudCBjb21tYW5kLCBhbmQKKwkgKiBpbnRlcnJ1cHQgYSBTQ1NJLXNjYW4gb3IgZGV2aWNlLXJlc2V0IGRlbGF5ICovCisJc2V0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKTsKKwl1c2Jfc3Rvcl9zdG9wX3RyYW5zcG9ydCh1cyk7CisJd2FrZV91cCgmdXMtPmRlbGF5X3dhaXQpOworCisJLyogSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIFNDU0ktc2Nhbm5pbmcgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcuCisJICogVGhlIHRocmVhZCB3aWxsIGV4aXQgd2hlbiBpdCBzZWVzIHRoZSBESVNDT05ORUNUSU5HIGZsYWcuICovCisKKwkvKiBXYWl0IGZvciB0aGUgY3VycmVudCBjb21tYW5kIHRvIGZpbmlzaCwgdGhlbiByZW1vdmUgdGhlIGhvc3QgKi8KKwlkb3duKCZ1cy0+ZGV2X3NlbWFwaG9yZSk7CisJdXAoJnVzLT5kZXZfc2VtYXBob3JlKTsKKworCS8qIHF1ZXVlY29tbWFuZCB3b24ndCBhY2NlcHQgYW55IG5ldyBjb21tYW5kcyBhbmQgdGhlIGNvbnRyb2wKKwkgKiB0aHJlYWQgd29uJ3QgZXhlY3V0ZSBhIHByZXZpb3VzbHktcXVldWVkIGNvbW1hbmQuICBJZiB0aGVyZQorCSAqIGlzIHN1Y2ggYSBjb21tYW5kIHBlbmRpbmcsIGNvbXBsZXRlIGl0IHdpdGggYW4gZXJyb3IuICovCisJaWYgKHVzLT5zcmIpIHsKKwkJdXMtPnNyYi0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCXNjc2lfbG9jayh1c190b19ob3N0KHVzKSk7CisJCXVzLT5zcmItPnNjc2lfZG9uZSh1cy0+c3JiKTsKKwkJdXMtPnNyYiA9IE5VTEw7CisJCXNjc2lfdW5sb2NrKHVzX3RvX2hvc3QodXMpKTsKKwl9CisKKwkvKiBOb3cgd2Ugb3duIG5vIGNvbW1hbmRzIHNvIGl0J3Mgc2FmZSB0byByZW1vdmUgdGhlIFNDU0kgaG9zdCAqLworCXNjc2lfcmVtb3ZlX2hvc3QodXNfdG9faG9zdCh1cykpOworfQorCisvKiBTZWNvbmQgc3RhZ2Ugb2YgZGlzY29ubmVjdCBwcm9jZXNzaW5nOiBkZWFsbG9jYXRlIGFsbCByZXNvdXJjZXMgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfZXZlcnl0aGluZyhzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJdXNiX3N0b3JfcmVsZWFzZV9yZXNvdXJjZXModXMpOworCWRpc3NvY2lhdGVfZGV2KHVzKTsKKworCS8qIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgaG9zdDsgdGhlIFNDU0kgY29yZSB3aWxsIGZyZWUgaXQKKwkgKiAoYW5kICJ1cyIgYWxvbmcgd2l0aCBpdCkgd2hlbiB0aGUgcmVmY291bnQgYmVjb21lcyAwLiAqLworCXNjc2lfaG9zdF9wdXQodXNfdG9faG9zdCh1cykpOworfQorCiAvKiBUaHJlYWQgdG8gY2Fycnkgb3V0IGRlbGF5ZWQgU0NTSS1kZXZpY2Ugc2Nhbm5pbmcgKi8KIHN0YXRpYyBpbnQgdXNiX3N0b3Jfc2Nhbl90aHJlYWQodm9pZCAqIF9fdXMpCiB7CkBAIC05NTYsNyArMTAwMiw3IEBACiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBVU0JfU1RPUkFHRSAKIAkJICAgICAgICJVbmFibGUgdG8gc3RhcnQgdGhlIGRldmljZS1zY2FubmluZyB0aHJlYWRcbiIpOwotCQlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCQlxdWllc2NlX2FuZF9yZW1vdmVfaG9zdCh1cyk7CiAJCWdvdG8gQmFkRGV2aWNlOwogCX0KIAlhdG9taWNfaW5jKCZ0b3RhbF90aHJlYWRzKTsKQEAgLTk2OSwxMCArMTAxNSw3IEBACiAJLyogV2UgY29tZSBoZXJlIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgKi8KIEJhZERldmljZToKIAlVU19ERUJVR1AoInN0b3JhZ2VfcHJvYmUoKSBmYWlsZWRcbiIpOwotCXNldF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncyk7Ci0JdXNiX3N0b3JfcmVsZWFzZV9yZXNvdXJjZXModXMpOwotCWRpc3NvY2lhdGVfZGV2KHVzKTsKLQlzY3NpX2hvc3RfcHV0KGhvc3QpOworCXJlbGVhc2VfZXZlcnl0aGluZyh1cyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTgyLDI4ICsxMDI1LDggQEAKIAlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJVVNfREVCVUdQKCJzdG9yYWdlX2Rpc2Nvbm5lY3QoKSBjYWxsZWRcbiIpOwotCi0JLyogUHJldmVudCBuZXcgVVNCIHRyYW5zZmVycywgc3RvcCB0aGUgY3VycmVudCBjb21tYW5kLCBhbmQKLQkgKiBpbnRlcnJ1cHQgYSBTQ1NJLXNjYW4gb3IgZGV2aWNlLXJlc2V0IGRlbGF5ICovCi0Jc2V0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKTsKLQl1c2Jfc3Rvcl9zdG9wX3RyYW5zcG9ydCh1cyk7Ci0Jd2FrZV91cCgmdXMtPmRlbGF5X3dhaXQpOwotCi0JLyogSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIFNDU0ktc2Nhbm5pbmcgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcuCi0JICogVGhlIHRocmVhZCB3aWxsIGV4aXQgd2hlbiBpdCBzZWVzIHRoZSBESVNDT05ORUNUSU5HIGZsYWcuICovCi0KLQkvKiBXYWl0IGZvciB0aGUgY3VycmVudCBjb21tYW5kIHRvIGZpbmlzaCwgdGhlbiByZW1vdmUgdGhlIGhvc3QgKi8KLQlkb3duKCZ1cy0+ZGV2X3NlbWFwaG9yZSk7Ci0JdXAoJnVzLT5kZXZfc2VtYXBob3JlKTsKLQlzY3NpX3JlbW92ZV9ob3N0KHVzX3RvX2hvc3QodXMpKTsKLQotCS8qIFdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gYmVjb21lIGlkbGUgYW5kIHJlbGVhc2UgYWxsIG91ciByZXNvdXJjZXMgKi8KLQl1c2Jfc3Rvcl9yZWxlYXNlX3Jlc291cmNlcyh1cyk7Ci0JZGlzc29jaWF0ZV9kZXYodXMpOwotCi0JLyogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBob3N0OyB0aGUgU0NTSSBjb3JlIHdpbGwgZnJlZSBpdAotCSAqIChhbmQgInVzIiBhbG9uZyB3aXRoIGl0KSB3aGVuIHRoZSByZWZjb3VudCBiZWNvbWVzIDAuICovCi0Jc2NzaV9ob3N0X3B1dCh1c190b19ob3N0KHVzKSk7CisJcXVpZXNjZV9hbmRfcmVtb3ZlX2hvc3QodXMpOworCXJlbGVhc2VfZXZlcnl0aGluZyh1cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKaW5kZXggNjI1YjdhYTkuLmExOTVhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMTU4LDYgKzE1OCw3IEBACiAKIAkvKiBTQ1NJIGludGVyZmFjZXMgKi8KIAlzdHJ1Y3Qgc2NzaV9jbW5kCSpzcmI7CQkgLyogY3VycmVudCBzcmIJCSovCisJdW5zaWduZWQgaW50CQl0YWc7CQkgLyogY3VycmVudCBkQ0JXVGFnCSovCiAKIAkvKiB0aHJlYWQgaW5mb3JtYXRpb24gKi8KIAlpbnQJCQlwaWQ7CQkgLyogY29udHJvbCB0aHJlYWQJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggY2RlMGVkMC4uNjE1ODc0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtNjUwLDcgKzY1MCw2IEBACiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCXNlbGVjdCBGQl9TT0ZUX0NVUlNPUgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGdyYXBoaWNzIGJvYXJkcyB3aXRoIHRoZSBuVmlkaWEgY2hpcHMsIFROVAogCSAgYW5kIG5ld2VyLiBGb3IgdmVyeSBvbGQgY2hpcHNldHMsIHN1Y2ggYXMgdGhlIFJJVkExMjgsIHRoZW4gdXNlCkBAIC02ODEsNyArNjgwLDYgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCi0Jc2VsZWN0IEZCX1NPRlRfQ1VSU09SCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgZ3JhcGhpY3MgYm9hcmRzIHdpdGggdGhlIG5WaWRpYSBSaXZhL0dlZm9yY2UKIAkgIGNoaXBzLgpAQCAtNzIwLDcgKzcxOCw2IEBACiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCXNlbGVjdCBGQl9TT0ZUX0NVUlNPUgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBvbi1ib2FyZCBncmFwaGljcyBidWlsdCBpbiB0byB0aGUgSW50ZWwgODEwIAogICAgICAgICAgIGFuZCA4MTUgY2hpcHNldHMuICBTYXkgWSBpZiB5b3UgaGF2ZSBhbmQgcGxhbiB0byB1c2Ugc3VjaCBhIGJvYXJkLgpAQCAtNzU0LDYgKzc1MSwxMiBAQAogICAKICAgICAgICAgICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgRkJfSTgxMF9JMkMKKwlib29sICJFbmFibGUgRERDIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9JODEwICYmIEkyQyAmJiBGQl9JODEwX0dURgorCXNlbGVjdCBJMkNfQUxHT0JJVAorCWhlbHAKKwogY29uZmlnIEZCX0lOVEVMCiAJdHJpc3RhdGUgIkludGVsIDgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBGQiAmJiBFWFBFUklNRU5UQUwgJiYgUENJICYmIFg4NiAmJiAhWDg2XzY0CkBAIC03NjMsNyArNzY2LDYgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCi0Jc2VsZWN0IEZCX1NPRlRfQ1VSU09SCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG9uLWJvYXJkIGdyYXBoaWNzIGJ1aWx0IGluIHRvIHRoZSBJbnRlbAogICAgICAgICAgIDgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHIGNoaXBzZXRzLgpAQCAtOTYwLDggKzk2Miw3IEBACiAJICBjYW4gYmUgYnVpbGQgZWl0aGVyIGFzIG1vZHVsZXMgb3IgYnVpbHQtaW4uCiAKIAkgIFRoZXJlIGlzIGEgcHJvZHVjdCBwYWdlIGF0Ci0JICA8aHR0cDovL3d3dy5hdGkuY29tL25hL3BhZ2VzL3Byb2R1Y3RzL3BjL3JhZGVvbjMyL2luZGV4Lmh0bWw+LgotCisJICBodHRwOi8vYXBwcy5hdGkuY29tL0FUSWNvbXBhcmUvCiBjb25maWcgRkJfUkFERU9OX0kyQwogCWJvb2wgIkREQy9JMkMgZm9yIEFUSSBSYWRlb24gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCX1JBREVPTgpAQCAtMTA4NCwxNSArMTA4NSwxNiBAQAogICAgICAgICAgIGNob29zZSBOIGhlcmUuCiAKIGNvbmZpZyBGQl9TSVMKLQl0cmlzdGF0ZSAiU2lTIGFjY2VsZXJhdGlvbiIKKwl0cmlzdGF0ZSAiU2lTL1hHSSBkaXNwbGF5IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCiAJc2VsZWN0IEZCX1NPRlRfQ1VSU09SCiAJaGVscAotCSAgVGhpcyBpcyB0aGUgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTaVMgMzAwLCAzMTUgYW5kCi0JICAzMzAgc2VyaWVzIFZHQSBjaGlwc2V0cy4gU3BlY3MgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpcy5jb20+CisJICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFNpUyAzMDAsIDMxNSwgMzMwCisJICBhbmQgMzQwIHNlcmllcyBhcyB3ZWxsIGFzIFhHSSBWM1hULCBWNSwgVjgsIFo3IGdyYXBoaWNzIGNoaXBzZXRzLgorCSAgU3BlY3MgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpcy5jb20+IGFuZCA8aHR0cDovL3d3dy54Z2l0ZWNoLmNvbT4uCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU7IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNpc2ZiLgpAQCAtMTEwNCwxMSArMTEwNiwxMiBAQAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHVzZSBvZiB0aGUgU2lTIDMwMC8zMDUsIDU0MCwgNjMwIGFuZCA3MzAuCiAKIGNvbmZpZyBGQl9TSVNfMzE1Ci0JYm9vbCAiU2lTIDMxNS8zMzAgc2VyaWVzIHN1cHBvcnQiCisJYm9vbCAiU2lTIDMxNS8zMzAvMzQwIHNlcmllcyBhbmQgWEdJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQl9TSVMKIAloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdXNlIG9mIHRoZSBTaVMgMzE1IGFuZCAzMzAgc2VyaWVzCi0JICAoMzE1L0gvUFJPLCA1NXgsIDY1MCwgNjUxLCA3NDAsIDMzMCwgNjYxLCA3NDEsIDc2MCkuCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdXNlIG9mIHRoZSBTaVMgMzE1LCAzMzAgYW5kIDM0MCBzZXJpZXMKKwkgICgzMTUvSC9QUk8sIDU1eCwgNjUwLCA2NTEsIDc0MCwgMzMwLCA2NjEsIDc0MSwgNzYwLCA3NjEpIGFzIHdlbGwKKwkgIGFzIFhHSSBWM1hULCBWNSwgVjggYW5kIFo3LgogCiBjb25maWcgRkJfTkVPTUFHSUMKIAl0cmlzdGF0ZSAiTmVvTWFnaWMgZGlzcGxheSBzdXBwb3J0IgpAQCAtMTE4MCw2ICsxMTgzLDMyIEBACiAJICBQbGVhc2UgcmVhZCB0aGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mYi9SRUFETUUtc3N0ZmIudHh0PiBmb3Igc3VwcG9ydGVkCiAJICBvcHRpb25zIGFuZCBvdGhlciBpbXBvcnRhbnQgaW5mbyAgc3VwcG9ydC4KIAorY29uZmlnIEZCX0NZQkxBCisJdHJpc3RhdGUgIkN5YmVyYmxhZGUvaTEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIFBDSQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IEZCX1NPRlRfQ1VSU09SCisJc2VsZWN0IFZJREVPX1NFTEVDVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIHN1cHBvc2VkIHRvIHN1cHBvcnQgdGhlIFRyaWRlbnQgQ3liZXJibGFkZS9pMQorCSAgZ3JhcGhpY3MgY29yZSBpbnRlZ3JhdGVkIGluIHRoZSBWSUEgVlQ4NjAxQSBOb3J0aCBCcmlkZ2UsCisJICBhbHNvIGtub3duIGFzIFZJQSBBcG9sbG8gUExFMTMzLgorCisJICBTdGF0dXM6CisJICAgLSBEZXZlbG9wZWQsIHRlc3RlZCBhbmQgd29ya2luZyBvbiBFUElBIDUwMDAgYW5kIEVQSUEgODAwLgorCSAgIC0gRG9lcyB3b3JrIHJlbGlhYmxlIG9uIGFsbCBzeXN0ZW1zIHdpdGggQ1JUL0xDRCBjb25uZWN0ZWQgdG8KKwkgICAgIG5vcm1hbCBWR0EgcG9ydHMuCisJICAgLSBTaG91bGQgd29yayBvbiBzeXN0ZW1zIHRoYXQgZG8gdXNlIHRoZSBpbnRlcm5hbCBMQ0QgcG9ydCwgYnV0CisJICAgICB0aGlzIGlzIGFic29sdXRlbHkgbm90IHRlc3RlZC4KKworCSAgQ2hhcmFjdGVyIGltYWdlYmxpdCwgY29weWFyZWEgYW5kIHJlY3RhbmdsZSBmaWxsIGFyZSBodyBhY2NlbGVyYXRlZCwKKwkgIHlwYW4gc2Nyb2xsaW5nIGlzIHVzZWQgYnkgZGVmYXVsdC4KKworCSAgUGxlYXNlIGRvIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiLyo+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjeWJsYWZiLgorCiBjb25maWcgRkJfVFJJREVOVAogCXRyaXN0YXRlICJUcmlkZW50IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKQEAgLTExOTMsOCArMTIyMiwxMiBAQAogCSAgYnV0IGFsc28gb24gc29tZSBtb3RoZXJib2FyZHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZiL3RyaWRlbnRmYi50eHQ+CiAKKwkgIEN5YmVyYmxhZGUvaTEgc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQgc29vbiwgdXNlIHRoZSBjeWJsYWZiIGRyaXZlcgorCSAgaW5zdGVhZC4KKwogCSAgU2F5IFkgaWYgeW91IGhhdmUgc3VjaCBhIGdyYXBoaWNzIGJvYXJkLgogCisKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRyaWRlbnRmYi4KIApAQCAtMTIwNSw3ICsxMjM4LDYgQEAKIAlUaGlzIHdpbGwgY29tcGlsZSB0aGUgVHJpZGVudCBmcmFtZSBidWZmZXIgZGV2aWNlIHdpdGgKIAlhY2NlbGVyYXRpb24gZnVuY3Rpb25zLgogCi0KIGNvbmZpZyBGQl9QTTMKIAl0cmlzdGF0ZSAiUGVybWVkaWEzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kgJiYgQlJPS0VOCkBAIC0xNDg0LDYgKzE1MTYsMzAgQEAKIAkgIHdvcmtpbmcgd2l0aCBTMUQxMzgwNikuIFByb2R1Y3Qgc3BlY3MgYXQKIAkgIDxodHRwOi8vd3d3LmVyZC5lcHNvbi5jb20vdmRjL2h0bWwvbGVnYWN5XzEzeHh4Lmh0bT4KIAorY29uZmlnIEZCX1MzQzI0MTAKKwl0cmlzdGF0ZSAiUzNDMjQxMCBMQ0QgZnJhbWVidWZmZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIEFSQ0hfUzNDMjQxMAorCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKKwlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCisJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwlzZWxlY3QgRkJfU09GVF9DVVJTT1IKKwktLS1oZWxwLS0tCisJICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciB0aGUgYnVpbHQtaW4gTENEIGNvbnRyb2xsZXIgaW4gdGhlIFNhbXN1bmcKKwkgIFMzQzI0MTAgcHJvY2Vzc29yLgorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4gVGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgczNjMjQxMGZiLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KK2NvbmZpZyBGQl9TM0MyNDEwX0RFQlVHCisJYm9vbCAiUzNDMjQxMCBsY2QgZGVidWcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBGQl9TM0MyNDEwCisJaGVscAorCSAgVHVybiBvbiBkZWJ1Z2dpbmcgbWVzc2FnZXMuIE5vdGUgdGhhdCB5b3UgY2FuIHNldC91bnNldCBhdCBydW4gdGltZQorCSAgdGhyb3VnaCBzeXNmcworCiBjb25maWcgRkJfVklSVFVBTAogCXRyaXN0YXRlICJWaXJ0dWFsIEZyYW1lIEJ1ZmZlciBzdXBwb3J0IChPTkxZIEZPUiBURVNUSU5HISkiCiAJZGVwZW5kcyBvbiBGQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggYjAxOGRmNC4uMWZmZjI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC05LDcgKzksOCBAQAogb2JqLSQoQ09ORklHX1NZU0ZTKQkJICArPSBiYWNrbGlnaHQvCiAKIG9iai0kKENPTkZJR19GQikgICAgICAgICAgICAgICAgICArPSBmYi5vCi1mYi15ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gZmJtZW0ubyBmYm1vbi5vIGZiY21hcC5vIGZic3lzZnMubyBtb2RlZGIubworZmIteSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IGZibWVtLm8gZmJtb24ubyBmYmNtYXAubyBmYnN5c2ZzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVkYi5vIGZiY3Z0Lm8KIGZiLW9ianMgICAgICAgICAgICAgICAgICAgICAgICAgICA6PSAkKGZiLXkpCiAKIG9iai0kKENPTkZJR19GQl9DRkJfRklMTFJFQ1QpICArPSBjZmJmaWxscmVjdC5vCkBAIC01MCw3ICs1MSw4IEBACiBvYmotJChDT05GSUdfRkJfSU1TVFQpICAgICAgICAgICAgKz0gaW1zdHRmYi5vCiBvYmotJChDT05GSUdfRkJfUzNUUklPKSAgICAgICAgICAgKz0gUzN0cmlvZmIubwogb2JqLSQoQ09ORklHX0ZCX0ZNMikgICAgICAgICAgICAgICs9IGZtMmZiLm8KLW9iai0kKENPTkZJR19GQl9UUklERU5UKQkgICs9IHRyaWRlbnRmYi5vCitvYmotJChDT05GSUdfRkJfQ1lCTEEpICAgICAgICAgICAgKz0gY3libGFmYi5vCitvYmotJChDT05GSUdfRkJfVFJJREVOVCkgICAgICAgICAgKz0gdHJpZGVudGZiLm8KIG9iai0kKENPTkZJR19GQl9TVEkpICAgICAgICAgICAgICArPSBzdGlmYi5vCiBvYmotJChDT05GSUdfRkJfRkZCKSAgICAgICAgICAgICAgKz0gZmZiLm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfQ0c2KSAgICAgICAgICAgICAgKz0gY2c2Lm8gc2J1c2xpYi5vCkBAIC05Miw2ICs5NCw3IEBACiBvYmotJChDT05GSUdfRkJfVFgzOTEyKQkJICArPSB0eDM5MTJmYi5vCiBvYmotJChDT05GSUdfRkJfUzFEMTNYWFgpCSAgKz0gczFkMTN4eHhmYi5vCiBvYmotJChDT05GSUdfRkJfSU1YKSAgICAgICAgICAgICAgKz0gaW14ZmIubworb2JqLSQoQ09ORklHX0ZCX1MzQzI0MTApCSAgKz0gczNjMjQxMGZiLm8KIAogIyBQbGF0Zm9ybSBvciBmYWxsYmFjayBkcml2ZXJzIGdvIGhlcmUKIG9iai0kKENPTkZJR19GQl9WRVNBKSAgICAgICAgICAgICArPSB2ZXNhZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKaW5kZXggYjBlYmEzYS4uZTM4MGVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCkBAIC04MDYsOCArODA2LDggQEAKIAogCS8qIFZlcnkgc2ltcGxlIHRlc3QgdG8gbWFrZSBzdXJlIGl0IGFwcGVhcmVkICovCiAJaWYgKEJJT1NfSU4xNigwKSAhPSAweGFhNTUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdHkxMjhmYjogSW52YWxpZCBST00gc2lnbmF0dXJlICV4IHNob3VsZCBiZSAweGFhNTVcbiIsCi0JCSAgICAgICBCSU9TX0lOMTYoMCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiYXR5MTI4ZmI6IEludmFsaWQgUk9NIHNpZ25hdHVyZSAleCBzaG91bGQgIgorCQkJIiBiZSAweGFhNTVcbiIsIEJJT1NfSU4xNigwKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IDNlMTBiZDguLjAzN2ZlOWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC05MTEsMjAgKzkxMSw2IEBACiAJCXZkaXNwbGF5ICA9IHBhci0+bGNkX2hlaWdodDsKICNlbmRpZgogCi0JaWYodmRpc3BsYXkgPCA0MDApIHsKLQkJaF9zeW5jX3BvbCA9IDE7Ci0JCXZfc3luY19wb2wgPSAwOwotCX0gZWxzZSBpZih2ZGlzcGxheSA8IDQ4MCkgewotCQloX3N5bmNfcG9sID0gMDsKLQkJdl9zeW5jX3BvbCA9IDE7Ci0JfSBlbHNlIGlmKHZkaXNwbGF5IDwgNzY4KSB7Ci0JCWhfc3luY19wb2wgPSAwOwotCQl2X3N5bmNfcG9sID0gMDsKLQl9IGVsc2UgewotCQloX3N5bmNfcG9sID0gMTsKLQkJdl9zeW5jX3BvbCA9IDE7Ci0JfQotCiAJdl9kaXNwLS07CiAJdl9zeW5jX3N0cnQtLTsKIAl2X3N5bmNfZW5kLS07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwppbmRleCBlN2U4YjUyLi4wNDZiNDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKQEAgLTMyOSw4ICszMjksOSBAQAogCiAJLyogVmVyeSBzaW1wbGUgdGVzdCB0byBtYWtlIHN1cmUgaXQgYXBwZWFyZWQgKi8KIAlpZiAoQklPU19JTjE2KDApICE9IDB4YWE1NSkgewotCQlwcmludGsoS0VSTl9FUlIgInJhZGVvbmZiICglcyk6IEludmFsaWQgUk9NIHNpZ25hdHVyZSAleCBzaG91bGQgYmUiCi0JCSAgICAgICAiMHhhYTU1XG4iLCBwY2lfbmFtZShyaW5mby0+cGRldiksIEJJT1NfSU4xNigwKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJyYWRlb25mYiAoJXMpOiBJbnZhbGlkIFJPTSBzaWduYXR1cmUgJXggIgorCQkJInNob3VsZCBiZSAweGFhNTVcbiIsCisJCQlwY2lfbmFtZShyaW5mby0+cGRldiksIEJJT1NfSU4xNigwKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAkvKiBMb29rIGZvciB0aGUgUENJIGRhdGEgdG8gY2hlY2sgdGhlIFJPTSB0eXBlICovCkBAIC0yMzEyLDE5ICsyMzEzLDI3IEBACiAJcmluZm8tPm1taW9fYmFzZV9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAyKTsKIAogCS8qIHJlcXVlc3QgdGhlIG1lbSByZWdpb25zICovCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAicmFkZW9uZmIiKTsKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgInJhZGVvbmZiIGZyYW1lYnVmZmVyIik7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAicmFkZW9uZmIgKCVzKTogY2Fubm90IHJlc2VydmUgUENJIHJlZ2lvbnMuIgotCQkJIiAgU29tZW9uZSBhbHJlYWR5IGdvdCB0aGVtP1xuIiwgcGNpX25hbWUocmluZm8tPnBkZXYpKTsKKwkJcHJpbnRrKCBLRVJOX0VSUiAicmFkZW9uZmIgKCVzKTogY2Fubm90IHJlcXVlc3QgcmVnaW9uIDAuXG4iLAorCQkJcGNpX25hbWUocmluZm8tPnBkZXYpKTsKIAkJZ290byBlcnJfcmVsZWFzZV9mYjsKIAl9CiAKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMiwgInJhZGVvbmZiIG1taW8iKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoIEtFUk5fRVJSICJyYWRlb25mYiAoJXMpOiBjYW5ub3QgcmVxdWVzdCByZWdpb24gMi5cbiIsCisJCQlwY2lfbmFtZShyaW5mby0+cGRldikpOworCQlnb3RvIGVycl9yZWxlYXNlX3BjaTA7CisJfQorCiAJLyogbWFwIHRoZSByZWdpb25zICovCiAJcmluZm8tPm1taW9fYmFzZSA9IGlvcmVtYXAocmluZm8tPm1taW9fYmFzZV9waHlzLCBSQURFT05fUkVHU0laRSk7CiAJaWYgKCFyaW5mby0+bW1pb19iYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFkZW9uZmIgKCVzKTogY2Fubm90IG1hcCBNTUlPXG4iLCBwY2lfbmFtZShyaW5mby0+cGRldikpOworCQlwcmludGsoS0VSTl9FUlIgInJhZGVvbmZiICglcyk6IGNhbm5vdCBtYXAgTU1JT1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHJpbmZvLT5wZGV2KSk7CiAJCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyX3JlbGVhc2VfcGNpOworCQlnb3RvIGVycl9yZWxlYXNlX3BjaTI7CiAJfQogCiAJcmluZm8tPmZiX2xvY2FsX2Jhc2UgPSBJTlJFRyhNQ19GQl9MT0NBVElPTikgPDwgMTY7CkBAIC0yNDk5LDEwICsyNTA4LDEyIEBACiAJaWYgKHJpbmZvLT5iaW9zX3NlZykKIAkJcmFkZW9uX3VubWFwX1JPTShyaW5mbywgcGRldik7CiAJaW91bm1hcChyaW5mby0+bW1pb19iYXNlKTsKLWVycl9yZWxlYXNlX3BjaToKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX3JlbGVhc2VfcGNpMjoKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMik7CitlcnJfcmVsZWFzZV9wY2kwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKIGVycl9yZWxlYXNlX2ZiOgotCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisgICAgICAgIGZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiBlcnJfZGlzYWJsZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBlcnJfb3V0OgpAQCAtMjU0OCw3ICsyNTU5LDggQEAKICAgICAgICAgaW91bm1hcChyaW5mby0+bW1pb19iYXNlKTsKICAgICAgICAgaW91bm1hcChyaW5mby0+ZmJfYmFzZSk7CiAgCi0gCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKIAogCWtmcmVlKHJpbmZvLT5tb24xX0VESUQpOwogCWtmcmVlKHJpbmZvLT5tb24yX0VESUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQppbmRleCA5YWFlODg0Li40YWYzMjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQpAQCAtMywzICszLDQgQEAKIG9iai0kKENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFKSAgICAgKz0gbGNkLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFKSArPSBiYWNrbGlnaHQubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSkJKz0gY29yZ2lfYmwubworb2JqLSQoQ09ORklHX1NIQVJQX0xPQ09NTykJKz0gbG9jb21vbGNkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xvY29tb2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNmU3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xvY29tb2xjZC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQmFja2xpZ2h0IGNvbnRyb2wgY29kZSBmb3IgU2hhcnAgWmF1cnVzIFNMLTU1MDAKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBKb2huIExlbnogPGxlbnpAY3Mud2lzYy5lZHU+CisgKiBNYWludGFpbmVyOiBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+ICh1bmxlc3MgSm9obiB3YW50cyB0byA6LSkKKyAqIEdQTCB2MgorICoKKyAqIFRoaXMgZHJpdmVyIGFzc3VtZXMgc2luZ2xlIENQVS4gVGhhdCdzIG9rYXksIGJlY2F1c2UgY29sbGllIGlzCisgKiBzbGlnaHRseSBvbGQgaGFyZHdhcmUsIGFuZCBub29uZSBpcyBnb2luZyB0byByZXRyb2ZpdCBzZWNvbmQgQ1BVIHRvCisgKiBvbGQgUERBLgorICovCisKKy8qIExDRCBwb3dlciBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9sb2NvbW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0NPTExJRQorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbGxpZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vYXJjaC9wb29kbGUuaD4KKyNlbmRpZgorCitleHRlcm4gdm9pZCAoKnNhMTEwMGZiX2xjZF9wb3dlcikoaW50IG9uKTsKKworc3RhdGljIHN0cnVjdCBsb2NvbW9fZGV2ICpsb2NvbW9sY2RfZGV2OworCitzdGF0aWMgdm9pZCBsb2NvbW9sY2Rfb24oaW50IGNvbWFkaikKK3sKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKGxvY29tb2xjZF9kZXYsIExPQ09NT19HUElPX0xDRF9WU0hBX09OLCAwKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIQV9PTiwgMSk7CisJbWRlbGF5KDIpOworCisJbG9jb21vX2dwaW9fc2V0X2Rpcihsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIRF9PTiwgMCk7CisJbG9jb21vX2dwaW9fd3JpdGUobG9jb21vbGNkX2RldiwgTE9DT01PX0dQSU9fTENEX1ZTSERfT04sIDEpOworCW1kZWxheSgyKTsKKworCWxvY29tb19tNjIzMzJfc2VuZGRhdGEobG9jb21vbGNkX2RldiwgY29tYWRqLCAwKTsKKwltZGVsYXkoNSk7CisKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKGxvY29tb2xjZF9kZXYsIExPQ09NT19HUElPX0xDRF9WRUVfT04sIDApOworCWxvY29tb19ncGlvX3dyaXRlKGxvY29tb2xjZF9kZXYsIExPQ09NT19HUElPX0xDRF9WRUVfT04sIDEpOworCW1kZWxheSgxMCk7CisKKwkvKiBURlRDUlNUIHwgQ1BTT1VUPTAgfCBDUFNFTiAqLworCWxvY29tb193cml0ZWwoMHgwMSwgbG9jb21vbGNkX2Rldi0+bWFwYmFzZSArIExPQ09NT19UQyk7CisKKwkvKiBTZXQgQ1BTRCAqLworCWxvY29tb193cml0ZWwoNiwgbG9jb21vbGNkX2Rldi0+bWFwYmFzZSArIExPQ09NT19DUFNEKTsKKworCS8qIFRGVENSU1QgfCBDUFNPVVQ9MCB8IENQU0VOICovCisJbG9jb21vX3dyaXRlbCgoMHgwNCB8IDB4MDEpLCBsb2NvbW9sY2RfZGV2LT5tYXBiYXNlICsgTE9DT01PX1RDKTsKKwltZGVsYXkoMTApOworCisJbG9jb21vX2dwaW9fc2V0X2Rpcihsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfTU9ELCAwKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfTU9ELCAxKTsKK30KKworc3RhdGljIHZvaWQgbG9jb21vbGNkX29mZihpbnQgY29tYWRqKQoreworCS8qIFRGVENSU1Q9MSB8IENQU09VVD0xIHwgQ1BTRU4gPSAwICovCisJbG9jb21vX3dyaXRlbCgweDA2LCBsb2NvbW9sY2RfZGV2LT5tYXBiYXNlICsgTE9DT01PX1RDKTsKKwltZGVsYXkoMSk7CisKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIQV9PTiwgMCk7CisJbWRlbGF5KDExMCk7CisKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVkVFX09OLCAwKTsKKwltZGVsYXkoNzAwKTsKKworCS8qIFRGVENSU1Q9MCB8IENQU09VVD0wIHwgQ1BTRU4gPSAwICovCisJbG9jb21vX3dyaXRlbCgwLCBsb2NvbW9sY2RfZGV2LT5tYXBiYXNlICsgTE9DT01PX1RDKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfTU9ELCAwKTsKKwlsb2NvbW9fZ3Bpb193cml0ZShsb2NvbW9sY2RfZGV2LCBMT0NPTU9fR1BJT19MQ0RfVlNIRF9PTiwgMCk7Cit9CisKK3ZvaWQgbG9jb21vbGNkX3Bvd2VyKGludCBvbikKK3sKKwlpbnQgY29tYWRqID0gMTE4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoIWxvY29tb2xjZF9kZXYpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogcmVhZCBjb21hZGogKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9QT09ETEUKKwljb21hZGogPSAxMTg7CisjZWxzZQorCWNvbWFkaiA9IDEyODsKKyNlbmRpZgorCisJaWYgKG9uKQorCQlsb2NvbW9sY2Rfb24oY29tYWRqKTsKKwllbHNlCisJCWxvY29tb2xjZF9vZmYoY29tYWRqKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobG9jb21vbGNkX3Bvd2VyKTsKKworc3RhdGljIGludCBwb29kbGVfbGNkX3Byb2JlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NvbW9sY2RfZGV2ID0gZGV2OworCisJLyogdGhlIHBvb2RsZV9sY2RfcG93ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZQorCSAqIGZyb20gZnNfaW5pdGNhbGwsIHdoaWNoIGlzIGJlZm9yZSBsb2NvbW8gaXMgYWN0aXZhdGVkLgorCSAqIFdlIG5lZWQgdG8gcmVjYWxsIHBvb2RsZV9sY2RfcG93ZXIgaGVyZSovCisjaWZkZWYgQ09ORklHX01BQ0hfUE9PRExFCisJbG9jb21vbGNkX3Bvd2VyKDEpOworI2VuZGlmCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9sY2RfcmVtb3ZlKHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jb21vbGNkX2RldiA9IE5VTEw7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxvY29tb19kcml2ZXIgcG9vZGxlX2xjZF9kcml2ZXIgPSB7CisJLmRydiA9IHsKKwkJLm5hbWUgPSAibG9jb21vLWJhY2tsaWdodCIsCisJfSwKKwkuZGV2aWQJPSBMT0NPTU9fREVWSURfQkFDS0xJR0hULAorCS5wcm9iZQk9IHBvb2RsZV9sY2RfcHJvYmUsCisJLnJlbW92ZQk9IHBvb2RsZV9sY2RfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcG9vZGxlX2xjZF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IGxvY29tb19kcml2ZXJfcmVnaXN0ZXIoJnBvb2RsZV9sY2RfZHJpdmVyKTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCisjaWZkZWYgQ09ORklHX1NBMTEwMF9DT0xMSUUKKwlzYTExMDBmYl9sY2RfcG93ZXIgPSBsb2NvbW9sY2RfcG93ZXI7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChwb29kbGVfbGNkX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvYml0YmxpdC5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2JpdGJsaXQuYwppbmRleCAzYzczMTU3Li45ZjcwZTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvYml0YmxpdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9iaXRibGl0LmMKQEAgLTM5LDcgKzM5LDcgQEAKIHsKIAlpbnQgYXR0cmlidXRlID0gMDsKIAotCWlmIChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhcikgPT0gMSkgeworCWlmIChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCkgPT0gMSkgewogCQlpZiAoYXR0cl91bmRlcmxpbmUoYykpCiAJCQlhdHRyaWJ1dGUgfD0gRkJDT05fQVRUUklCVVRFX1VOREVSTElORTsKIAkJaWYgKGF0dHJfcmV2ZXJzZShjKSkKQEAgLTEwMywyMiArMTAzLDkyIEBACiAJaW5mby0+ZmJvcHMtPmZiX2ZpbGxyZWN0KGluZm8sICZyZWdpb24pOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYml0X3B1dGNzX2FsaWduZWQoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQkgICAgIGNvbnN0IHUxNiAqcywgdTMyIGF0dHIsIHUzMiBjbnQsCisJCQkJICAgICB1MzIgZF9waXRjaCwgdTMyIHNfcGl0Y2gsIHUzMiBjZWxsc2l6ZSwKKwkJCQkgICAgIHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UsIHU4ICpidWYsIHU4ICpkc3QpCit7CisJdTE2IGNoYXJtYXNrID0gdmMtPnZjX2hpX2ZvbnRfbWFzayA/IDB4MWZmIDogMHhmZjsKKwl1MzIgaWR4ID0gdmMtPnZjX2ZvbnQud2lkdGggPj4gMzsKKwl1OCAqc3JjOworCisJd2hpbGUgKGNudC0tKSB7CisJCXNyYyA9IHZjLT52Y19mb250LmRhdGEgKyAoc2NyX3JlYWR3KHMrKykmCisJCQkJCSAgY2hhcm1hc2spKmNlbGxzaXplOworCisJCWlmIChhdHRyKSB7CisJCQl1cGRhdGVfYXR0cihidWYsIHNyYywgYXR0ciwgdmMpOworCQkJc3JjID0gYnVmOworCQl9CisKKwkJaWYgKGxpa2VseShpZHggPT0gMSkpCisJCQlfX2ZiX3BhZF9hbGlnbmVkX2J1ZmZlcihkc3QsIGRfcGl0Y2gsIHNyYywgaWR4LAorCQkJCQkJaW1hZ2UtPmhlaWdodCk7CisJCWVsc2UKKwkJCWZiX3BhZF9hbGlnbmVkX2J1ZmZlcihkc3QsIGRfcGl0Y2gsIHNyYywgaWR4LAorCQkJCQkgICAgICBpbWFnZS0+aGVpZ2h0KTsKKworCQlkc3QgKz0gc19waXRjaDsKKwl9CisKKwlpbmZvLT5mYm9wcy0+ZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJpdF9wdXRjc191bmFsaWduZWQoc3RydWN0IHZjX2RhdGEgKnZjLAorCQkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgdTE2ICpzLAorCQkJCSAgICAgICB1MzIgYXR0ciwgdTMyIGNudCwgdTMyIGRfcGl0Y2gsCisJCQkJICAgICAgIHUzMiBzX3BpdGNoLCB1MzIgY2VsbHNpemUsCisJCQkJICAgICAgIHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UsIHU4ICpidWYsCisJCQkJICAgICAgIHU4ICpkc3QpCit7CisJdTE2IGNoYXJtYXNrID0gdmMtPnZjX2hpX2ZvbnRfbWFzayA/IDB4MWZmIDogMHhmZjsKKwl1MzIgc2hpZnRfbG93ID0gMCwgbW9kID0gdmMtPnZjX2ZvbnQud2lkdGggJSA4OworCXUzMiBzaGlmdF9oaWdoID0gODsKKwl1MzIgaWR4ID0gdmMtPnZjX2ZvbnQud2lkdGggPj4gMzsKKwl1OCAqc3JjOworCisJd2hpbGUgKGNudC0tKSB7CisJCXNyYyA9IHZjLT52Y19mb250LmRhdGEgKyAoc2NyX3JlYWR3KHMrKykmCisJCQkJCSAgY2hhcm1hc2spKmNlbGxzaXplOworCisJCWlmIChhdHRyKSB7CisJCQl1cGRhdGVfYXR0cihidWYsIHNyYywgYXR0ciwgdmMpOworCQkJc3JjID0gYnVmOworCQl9CisKKwkJZmJfcGFkX3VuYWxpZ25lZF9idWZmZXIoZHN0LCBkX3BpdGNoLCBzcmMsIGlkeCwKKwkJCQkJaW1hZ2UtPmhlaWdodCwgc2hpZnRfaGlnaCwKKwkJCQkJc2hpZnRfbG93LCBtb2QpOworCQlzaGlmdF9sb3cgKz0gbW9kOworCQlkc3QgKz0gKHNoaWZ0X2xvdyA+PSA4KSA/IHNfcGl0Y2ggOiBzX3BpdGNoIC0gMTsKKwkJc2hpZnRfbG93ICY9IDc7CisJCXNoaWZ0X2hpZ2ggPSA4IC0gc2hpZnRfbG93OworCX0KKworCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCit9CisKIHN0YXRpYyB2b2lkIGJpdF9wdXRjcyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcywgaW50IGNvdW50LCBpbnQgeXksIGludCB4eCwKIAkJICAgICAgaW50IGZnLCBpbnQgYmcpCiB7Ci0JdW5zaWduZWQgc2hvcnQgY2hhcm1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrID8gMHgxZmYgOiAweGZmOwotCXVuc2lnbmVkIGludCB3aWR0aCA9ICh2Yy0+dmNfZm9udC53aWR0aCArIDcpID4+IDM7Ci0JdW5zaWduZWQgaW50IGNlbGxzaXplID0gdmMtPnZjX2ZvbnQuaGVpZ2h0ICogd2lkdGg7Ci0JdW5zaWduZWQgaW50IG1heGNudCA9IGluZm8tPnBpeG1hcC5zaXplL2NlbGxzaXplOwotCXVuc2lnbmVkIGludCBzY2FuX2FsaWduID0gaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gLSAxOwotCXVuc2lnbmVkIGludCBidWZfYWxpZ24gPSBpbmZvLT5waXhtYXAuYnVmX2FsaWduIC0gMTsKLQl1bnNpZ25lZCBpbnQgc2hpZnRfbG93ID0gMCwgbW9kID0gdmMtPnZjX2ZvbnQud2lkdGggJSA4OwotCXVuc2lnbmVkIGludCBzaGlmdF9oaWdoID0gOCwgcGl0Y2gsIGNudCwgc2l6ZSwgazsKLQl1bnNpZ25lZCBpbnQgaWR4ID0gdmMtPnZjX2ZvbnQud2lkdGggPj4gMzsKLQl1bnNpZ25lZCBpbnQgYXR0cmlidXRlID0gZ2V0X2F0dHJpYnV0ZShpbmZvLCBzY3JfcmVhZHcocykpOwogCXN0cnVjdCBmYl9pbWFnZSBpbWFnZTsKLQl1OCAqc3JjLCAqZHN0LCAqYnVmID0gTlVMTDsKKwl1MzIgd2lkdGggPSAodmMtPnZjX2ZvbnQud2lkdGggKyA3KS84OworCXUzMiBjZWxsc2l6ZSA9IHdpZHRoICogdmMtPnZjX2ZvbnQuaGVpZ2h0OworCXUzMiBtYXhjbnQgPSBpbmZvLT5waXhtYXAuc2l6ZS9jZWxsc2l6ZTsKKwl1MzIgc2Nhbl9hbGlnbiA9IGluZm8tPnBpeG1hcC5zY2FuX2FsaWduIC0gMTsKKwl1MzIgYnVmX2FsaWduID0gaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiAtIDE7CisJdTMyIG1vZCA9IHZjLT52Y19mb250LndpZHRoICUgOCwgY250LCBwaXRjaCwgc2l6ZTsKKwl1MzIgYXR0cmlidXRlID0gZ2V0X2F0dHJpYnV0ZShpbmZvLCBzY3JfcmVhZHcocykpOworCXU4ICpkc3QsICpidWYgPSBOVUxMOworCisJaW1hZ2UuZmdfY29sb3IgPSBmZzsKKwlpbWFnZS5iZ19jb2xvciA9IGJnOworCWltYWdlLmR4ID0geHggKiB2Yy0+dmNfZm9udC53aWR0aDsKKwlpbWFnZS5keSA9IHl5ICogdmMtPnZjX2ZvbnQuaGVpZ2h0OworCWltYWdlLmhlaWdodCA9IHZjLT52Y19mb250LmhlaWdodDsKKwlpbWFnZS5kZXB0aCA9IDE7CiAKIAlpZiAoYXR0cmlidXRlKSB7CiAJCWJ1ZiA9IGttYWxsb2MoY2VsbHNpemUsIEdGUF9LRVJORUwpOwpAQCAtMTI2LDE5ICsxOTYsMTEgQEAKIAkJCXJldHVybjsKIAl9CiAKLQlpbWFnZS5mZ19jb2xvciA9IGZnOwotCWltYWdlLmJnX2NvbG9yID0gYmc7Ci0KLQlpbWFnZS5keCA9IHh4ICogdmMtPnZjX2ZvbnQud2lkdGg7Ci0JaW1hZ2UuZHkgPSB5eSAqIHZjLT52Y19mb250LmhlaWdodDsKLQlpbWFnZS5oZWlnaHQgPSB2Yy0+dmNfZm9udC5oZWlnaHQ7Ci0JaW1hZ2UuZGVwdGggPSAxOwotCiAJd2hpbGUgKGNvdW50KSB7CiAJCWlmIChjb3VudCA+IG1heGNudCkKLQkJCWNudCA9IGsgPSBtYXhjbnQ7CisJCQljbnQgPSBtYXhjbnQ7CiAJCWVsc2UKLQkJCWNudCA9IGsgPSBjb3VudDsKKwkJCWNudCA9IGNvdW50OwogCiAJCWltYWdlLndpZHRoID0gdmMtPnZjX2ZvbnQud2lkdGggKiBjbnQ7CiAJCXBpdGNoID0gKChpbWFnZS53aWR0aCArIDcpID4+IDMpICsgc2Nhbl9hbGlnbjsKQEAgLTE0Nyw0MSArMjA5LDE4IEBACiAJCXNpemUgJj0gfmJ1Zl9hbGlnbjsKIAkJZHN0ID0gZmJfZ2V0X2J1ZmZlcl9vZmZzZXQoaW5mbywgJmluZm8tPnBpeG1hcCwgc2l6ZSk7CiAJCWltYWdlLmRhdGEgPSBkc3Q7Ci0JCWlmIChtb2QpIHsKLQkJCXdoaWxlIChrLS0pIHsKLQkJCQlzcmMgPSB2Yy0+dmNfZm9udC5kYXRhICsgKHNjcl9yZWFkdyhzKyspJgotCQkJCQkJCSAgY2hhcm1hc2spKmNlbGxzaXplOwogCi0JCQkJaWYgKGF0dHJpYnV0ZSkgewotCQkJCQl1cGRhdGVfYXR0cihidWYsIHNyYywgYXR0cmlidXRlLCB2Yyk7Ci0JCQkJCXNyYyA9IGJ1ZjsKLQkJCQl9CisJCWlmICghbW9kKQorCQkJYml0X3B1dGNzX2FsaWduZWQodmMsIGluZm8sIHMsIGF0dHJpYnV0ZSwgY250LCBwaXRjaCwKKwkJCQkJICB3aWR0aCwgY2VsbHNpemUsICZpbWFnZSwgYnVmLCBkc3QpOworCQllbHNlCisJCQliaXRfcHV0Y3NfdW5hbGlnbmVkKHZjLCBpbmZvLCBzLCBhdHRyaWJ1dGUsIGNudCwKKwkJCQkJICAgIHBpdGNoLCB3aWR0aCwgY2VsbHNpemUsICZpbWFnZSwKKwkJCQkJICAgIGJ1ZiwgZHN0KTsKIAotCQkJCWZiX3BhZF91bmFsaWduZWRfYnVmZmVyKGRzdCwgcGl0Y2gsIHNyYywgaWR4LAotCQkJCQkJaW1hZ2UuaGVpZ2h0LCBzaGlmdF9oaWdoLAotCQkJCQkJc2hpZnRfbG93LCBtb2QpOwotCQkJCXNoaWZ0X2xvdyArPSBtb2Q7Ci0JCQkJZHN0ICs9IChzaGlmdF9sb3cgPj0gOCkgPyB3aWR0aCA6IHdpZHRoIC0gMTsKLQkJCQlzaGlmdF9sb3cgJj0gNzsKLQkJCQlzaGlmdF9oaWdoID0gOCAtIHNoaWZ0X2xvdzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChrLS0pIHsKLQkJCQlzcmMgPSB2Yy0+dmNfZm9udC5kYXRhICsgKHNjcl9yZWFkdyhzKyspJgotCQkJCQkJCSAgY2hhcm1hc2spKmNlbGxzaXplOwotCi0JCQkJaWYgKGF0dHJpYnV0ZSkgewotCQkJCQl1cGRhdGVfYXR0cihidWYsIHNyYywgYXR0cmlidXRlLCB2Yyk7Ci0JCQkJCXNyYyA9IGJ1ZjsKLQkJCQl9Ci0KLQkJCQlmYl9wYWRfYWxpZ25lZF9idWZmZXIoZHN0LCBwaXRjaCwgc3JjLCBpZHgsIGltYWdlLmhlaWdodCk7Ci0JCQkJZHN0ICs9IHdpZHRoOwotCQkJfQotCQl9Ci0JCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQoaW5mbywgJmltYWdlKTsKIAkJaW1hZ2UuZHggKz0gY250ICogdmMtPnZjX2ZvbnQud2lkdGg7CiAJCWNvdW50IC09IGNudDsKKwkJcyArPSBjbnQ7CiAJfQogCiAJLyogYnVmIGlzIGFsd2F5cyBOVUxMIGV4Y2VwdCB3aGVuIGluIG1vbm9jaHJvbWUgbW9kZSwgc28gaW4gdGhpcyBjYXNlCkBAIC0xODksNiArMjI4LDcgQEAKIAkgICBOVUxMIHBvaW50ZXJzIGp1c3QgZmluZSAqLwogCWlmICh1bmxpa2VseShidWYpKQogCQlrZnJlZShidWYpOworCiB9CiAKIHN0YXRpYyB2b2lkIGJpdF9jbGVhcl9tYXJnaW5zKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IDM1Yzg4YmQuLjJlOTMyMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGdldF9jb2xvcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAogCSAgICAgIHUxNiBjLCBpbnQgaXNfZmcpCiB7Ci0JaW50IGRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIpOworCWludCBkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KTsKIAlpbnQgY29sb3IgPSAwOwogCiAJaWYgKGNvbnNvbGVfYmxhbmtlZCkgewpAQCAtMjMwLDkgKzIzMCwxMyBAQAogCXN3aXRjaCAoZGVwdGgpIHsKIAljYXNlIDE6CiAJeworCQlpbnQgY29sID0gfigweGZmZiA8PCAobWF4KGluZm8tPnZhci5ncmVlbi5sZW5ndGgsCisJCQkJCSAgbWF4KGluZm8tPnZhci5yZWQubGVuZ3RoLAorCQkJCQkgICAgICBpbmZvLT52YXIuYmx1ZS5sZW5ndGgpKSkpICYgMHhmZjsKKwogCQkvKiAwIG9yIDEgKi8KLQkJaW50IGZnID0gKGluZm8tPmZpeC52aXN1YWwgIT0gRkJfVklTVUFMX01PTk8wMSkgPyAxIDogMDsKLQkJaW50IGJnID0gKGluZm8tPmZpeC52aXN1YWwgIT0gRkJfVklTVUFMX01PTk8wMSkgPyAwIDogMTsKKwkJaW50IGZnID0gKGluZm8tPmZpeC52aXN1YWwgIT0gRkJfVklTVUFMX01PTk8wMSkgPyBjb2wgOiAwOworCQlpbnQgYmcgPSAoaW5mby0+Zml4LnZpc3VhbCAhPSBGQl9WSVNVQUxfTU9OTzAxKSA/IDAgOiBjb2w7CiAKIAkJaWYgKGNvbnNvbGVfYmxhbmtlZCkKIAkJCWZnID0gYmc7CkBAIC0yNDMsOSArMjQ3LDI1IEBACiAJY2FzZSAyOgogCQkvKgogCQkgKiBTY2FsZSBkb3duIDE2LWNvbG9ycyB0byA0IGNvbG9ycy4gRGVmYXVsdCA0LWNvbG9yIHBhbGV0dGUKLQkJICogaXMgZ3JheXNjYWxlLgorCQkgKiBpcyBncmF5c2NhbGUuIEhvd2V2ZXIsIHNpbXBseSBkaXZpZGluZyB0aGUgdmFsdWVzIGJ5IDQKKwkJICogd2lsbCBub3Qgd29yaywgYXMgY29sb3JzIDEsIDIgYW5kIDMgd2lsbCBiZSBzY2FsZWQtZG93bgorCQkgKiB0byB6ZXJvIHJlbmRlcmluZyB0aGVtIGludmlzaWJsZS4gIFNvIGVtcGlyaWNhbGx5IGNvbnZlcnQKKwkJICogY29sb3JzIHRvIGEgc2FuZSA0LWxldmVsIGdyYXlzY2FsZS4KIAkJICovCi0JCWNvbG9yIC89IDQ7CisJCXN3aXRjaCAoY29sb3IpIHsKKwkJY2FzZSAwOgorCQkJY29sb3IgPSAwOyAvKiBibGFjayAqLworCQkJYnJlYWs7CisJCWNhc2UgMSAuLi4gNjoKKwkJCWNvbG9yID0gMjsgLyogd2hpdGUgKi8KKwkJCWJyZWFrOworCQljYXNlIDcgLi4uIDg6CisJCQljb2xvciA9IDE7IC8qIGdyYXkgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29sb3IgPSAzOyAvKiBpbnRlbnNlIHdoaXRlICovCisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIDM6CiAJCS8qCkBAIC0zMTEsNiArMzMxLDM1IEBACiAJbW9kX3RpbWVyKCZvcHMtPmN1cnNvcl90aW1lciwgamlmZmllcyArIEhaLzUpOwogfQogCitzdGF0aWMgdm9pZCBmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKKworCWlmICgoIWluZm8tPnF1ZXVlLmZ1bmMgfHwgaW5mby0+cXVldWUuZnVuYyA9PSBmYl9mbGFzaGN1cnNvcikgJiYKKwkgICAgIShvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSkgeworCQlpZiAoIWluZm8tPnF1ZXVlLmZ1bmMpCisJCQlJTklUX1dPUksoJmluZm8tPnF1ZXVlLCBmYl9mbGFzaGN1cnNvciwgaW5mbyk7CisKKwkJaW5pdF90aW1lcigmb3BzLT5jdXJzb3JfdGltZXIpOworCQlvcHMtPmN1cnNvcl90aW1lci5mdW5jdGlvbiA9IGN1cnNvcl90aW1lcl9oYW5kbGVyOworCQlvcHMtPmN1cnNvcl90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gNTsKKwkJb3BzLT5jdXJzb3JfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nICkgaW5mbzsKKwkJYWRkX3RpbWVyKCZvcHMtPmN1cnNvcl90aW1lcik7CisJCW9wcy0+ZmxhZ3MgfD0gRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSOworCX0KK30KKworc3RhdGljIHZvaWQgZmJjb25fZGVsX2N1cnNvcl90aW1lcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CisKKwlpZiAoaW5mby0+cXVldWUuZnVuYyA9PSBmYl9mbGFzaGN1cnNvciAmJgorCSAgICBvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSB7CisJCWRlbF90aW1lcl9zeW5jKCZvcHMtPmN1cnNvcl90aW1lcik7CisJCW9wcy0+ZmxhZ3MgJj0gfkZCQ09OX0ZMQUdTX0NVUlNPUl9USU1FUjsKKwl9Cit9CisKICNpZm5kZWYgTU9EVUxFCiBzdGF0aWMgaW50IF9faW5pdCBmYl9jb25zb2xlX3NldHVwKGNoYXIgKnRoaXNfb3B0KQogewpAQCAtNDI2LDcgKzQ3NSw3IEBACiAJICogcmVtb3ZlIHVuZGVybGluZSBhdHRyaWJ1dGUgZnJvbSBlcmFzZSBjaGFyYWN0ZXIKIAkgKiBpZiBibGFjayBhbmQgd2hpdGUgZnJhbWVidWZmZXIuCiAJICovCi0JaWYgKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKSA9PSAxKQorCWlmIChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCkgPT0gMSkKIAkJZXJhc2UgJj0gfjB4NDAwOwogCWxvZ29faGVpZ2h0ID0gZmJfcHJlcGFyZV9sb2dvKGluZm8pOwogCWxvZ29fbGluZXMgPSAobG9nb19oZWlnaHQgKyB2Yy0+dmNfZm9udC5oZWlnaHQgLSAxKSAvCkBAIC01NjMsOSArNjEyLDcgQEAKIAl9CiAKIAlpZiAoIWVycikgewotCQlpZiAob2xkaW5mby0+cXVldWUuZnVuYyA9PSBmYl9mbGFzaGN1cnNvcikKLQkJCWRlbF90aW1lcl9zeW5jKCZvcHMtPmN1cnNvcl90aW1lcik7Ci0KKwkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihvbGRpbmZvKTsKIAkJa2ZyZWUob3BzLT5jdXJzb3Jfc3RhdGUubWFzayk7CiAJCWtmcmVlKG9wcy0+Y3Vyc29yX2RhdGEpOwogCQlrZnJlZShvbGRpbmZvLT5mYmNvbl9wYXIpOwpAQCAtNTc2LDIyICs2MjMsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbjJmYl9pbml0X25ld2luZm8oc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0JaWYgKCFpbmZvLT5xdWV1ZS5mdW5jIHx8IGluZm8tPnF1ZXVlLmZ1bmMgPT0gZmJfZmxhc2hjdXJzb3IpIHsKLQkJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwotCi0JCWlmICghaW5mby0+cXVldWUuZnVuYykKLQkJCUlOSVRfV09SSygmaW5mby0+cXVldWUsIGZiX2ZsYXNoY3Vyc29yLCBpbmZvKTsKLQotCQlpbml0X3RpbWVyKCZvcHMtPmN1cnNvcl90aW1lcik7Ci0JCW9wcy0+Y3Vyc29yX3RpbWVyLmZ1bmN0aW9uID0gY3Vyc29yX3RpbWVyX2hhbmRsZXI7Ci0JCW9wcy0+Y3Vyc29yX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyA1OwotCQlvcHMtPmN1cnNvcl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcgKSBpbmZvOwotCQlhZGRfdGltZXIoJm9wcy0+Y3Vyc29yX3RpbWVyKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGNvbjJmYl9pbml0X2Rpc3BsYXkoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCQlpbnQgdW5pdCwgaW50IHNob3dfbG9nbykKIHsKQEAgLTY3NSw3ICs3MDYsNyBAQAogIAkJCQkgbG9nb19zaG93biAhPSBGQkNPTl9MT0dPX0RPTlRTSE9XKTsKIAogIAkJaWYgKCFmb3VuZCkKLSAJCQljb24yZmJfaW5pdF9uZXdpbmZvKGluZm8pOworIAkJCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CiAgCQljb24yZmJfbWFwX2Jvb3RbdW5pdF0gPSBuZXdpZHg7CiAgCQljb24yZmJfaW5pdF9kaXNwbGF5KHZjLCBpbmZvLCB1bml0LCBzaG93X2xvZ28pOwogCX0KQEAgLTg3OCwxOCArOTA5LDcgQEAKIAl9CiAjZW5kaWYJCQkJLyogQ09ORklHX01BQyAqLwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgd29yayBxdWV1ZS4gSWYgdGhlIGRyaXZlciBwcm92aWRlcyBpdHMKLQkgKiBvd24gd29yayBxdWV1ZSB0aGlzIG1lYW5zIGl0IHdpbGwgdXNlIHNvbWV0aGluZyBiZXNpZGVzIAotCSAqIGRlZmF1bHQgdGltZXIgdG8gZmxhc2ggdGhlIGN1cnNvci4gKi8KLQlpZiAoIWluZm8tPnF1ZXVlLmZ1bmMpIHsKLQkJSU5JVF9XT1JLKCZpbmZvLT5xdWV1ZSwgZmJfZmxhc2hjdXJzb3IsIGluZm8pOwotCi0JCWluaXRfdGltZXIoJm9wcy0+Y3Vyc29yX3RpbWVyKTsKLQkJb3BzLT5jdXJzb3JfdGltZXIuZnVuY3Rpb24gPSBjdXJzb3JfdGltZXJfaGFuZGxlcjsKLQkJb3BzLT5jdXJzb3JfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDU7Ci0JCW9wcy0+Y3Vyc29yX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyApIGluZm87Ci0JCWFkZF90aW1lcigmb3BzLT5jdXJzb3JfdGltZXIpOwotCX0KKwlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOwogCXJldHVybiBkaXNwbGF5X2Rlc2M7CiB9CiAKQEAgLTkzMCw3ICs5NTAsNyBAQAogCX0KIAlpZiAocC0+dXNlcmZvbnQpCiAJCWNoYXJjbnQgPSBGTlRDSEFSQ05UKHAtPmZvbnRkYXRhKTsKLQl2Yy0+dmNfY2FuX2RvX2NvbG9yID0gKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKSAhPSAxKTsKKwl2Yy0+dmNfY2FuX2RvX2NvbG9yID0gKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KSE9MSk7CiAJdmMtPnZjX2NvbXBsZW1lbnRfbWFzayA9IHZjLT52Y19jYW5fZG9fY29sb3IgPyAweDc3MDAgOiAweDA4MDA7CiAJaWYgKGNoYXJjbnQgPT0gMjU2KSB7CiAJCXZjLT52Y19oaV9mb250X21hc2sgPSAwOwpAQCAtMTE3OCw3ICsxMTk4LDEyIEBACiAJaWYgKHAtPnVzZXJmb250KQogCQljaGFyY250ID0gRk5UQ0hBUkNOVChwLT5mb250ZGF0YSk7CiAKLQl2Yy0+dmNfY2FuX2RvX2NvbG9yID0gKGZiX2dldF9jb2xvcl9kZXB0aCh2YXIpICE9IDEpOworCXZhci0+YWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CisJaW5mby0+dmFyLmFjdGl2YXRlID0gdmFyLT5hY3RpdmF0ZTsKKwlpbmZvLT52YXIueW9mZnNldCA9IGluZm8tPnZhci54b2Zmc2V0ID0gMDsKKwlmYl9zZXRfdmFyKGluZm8sIHZhcik7CisKKwl2Yy0+dmNfY2FuX2RvX2NvbG9yID0gKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KSE9MSk7CiAJdmMtPnZjX2NvbXBsZW1lbnRfbWFzayA9IHZjLT52Y19jYW5fZG9fY29sb3IgPyAweDc3MDAgOiAweDA4MDA7CiAJaWYgKGNoYXJjbnQgPT0gMjU2KSB7CiAJCXZjLT52Y19oaV9mb250X21hc2sgPSAwOwpAQCAtMTg5OCw3ICsxOTIzLDcgQEAKIAogc3RhdGljIGludCBmYmNvbl9zd2l0Y2goc3RydWN0IHZjX2RhdGEgKnZjKQogewotCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBmYl9pbmZvICppbmZvLCAqb2xkX2luZm8gPSBOVUxMOwogCXN0cnVjdCBkaXNwbGF5ICpwID0gJmZiX2Rpc3BsYXlbdmMtPnZjX251bV07CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAlpbnQgaSwgcHJldl9jb25zb2xlOwpAQCAtMTkzMSw3ICsxOTU2LDggQEAKIAl9CiAKIAlwcmV2X2NvbnNvbGUgPSAoKHN0cnVjdCBmYmNvbl9vcHMgKilpbmZvLT5mYmNvbl9wYXIpLT5jdXJyY29uOwotCisJaWYgKHByZXZfY29uc29sZSAhPSAtMSkKKwkJb2xkX2luZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbcHJldl9jb25zb2xlXV07CiAJLyoKIAkgKiBGSVhNRTogSWYgd2UgaGF2ZSBtdWx0aXBsZSBmYmRldidzIGxvYWRlZCwgd2UgbmVlZCB0bwogCSAqIHVwZGF0ZSBhbGwgaW5mby0+Y3VycmNvbi4gIFBlcmhhcHMsIHdlIGNhbiBwbGFjZSB0aGlzCkBAIC0xOTU5LDE1ICsxOTg1LDE3IEBACiAJaW5mby0+dmFyLnlvZmZzZXQgPSBpbmZvLT52YXIueG9mZnNldCA9IHAtPnlzY3JvbGwgPSAwOwogCWZiX3NldF92YXIoaW5mbywgJnZhcik7CiAKLQlpZiAocHJldl9jb25zb2xlICE9IC0xICYmCi0JICAgIHJlZ2lzdGVyZWRfZmJbY29uMmZiX21hcFtwcmV2X2NvbnNvbGVdXSAhPSBpbmZvICYmCi0JICAgIGluZm8tPmZib3BzLT5mYl9zZXRfcGFyKQotCQlpbmZvLT5mYm9wcy0+ZmJfc2V0X3BhcihpbmZvKTsKKwlpZiAob2xkX2luZm8gIT0gTlVMTCAmJiBvbGRfaW5mbyAhPSBpbmZvKSB7CisJCWlmIChpbmZvLT5mYm9wcy0+ZmJfc2V0X3BhcikKKwkJCWluZm8tPmZib3BzLT5mYl9zZXRfcGFyKGluZm8pOworCQlmYmNvbl9kZWxfY3Vyc29yX3RpbWVyKG9sZF9pbmZvKTsKKwkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKKwl9CiAKIAlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbywgcCk7CiAJKChzdHJ1Y3QgZmJjb25fb3BzICopaW5mby0+ZmJjb25fcGFyKS0+Y3Vyc29yX3Jlc2V0ID0gMTsKIAotCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIpICE9IDEpOworCXZjLT52Y19jYW5fZG9fY29sb3IgPSAoZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpIT0xKTsKIAl2Yy0+dmNfY29tcGxlbWVudF9tYXNrID0gdmMtPnZjX2Nhbl9kb19jb2xvciA/IDB4NzcwMCA6IDB4MDgwMDsKIAl1cGRhdGVzY3JvbGxtb2RlKHAsIGluZm8sIHZjKTsKIApAQCAtMjA0OCwxMSArMjA3NiwxNiBAQAogCQkJCWZiY29uX2dlbmVyaWNfYmxhbmsodmMsIGluZm8sIGJsYW5rKTsKIAkJfQogCi0gCQlpZiAoIWJsYW5rKQotIAkJCXVwZGF0ZV9zY3JlZW4odmMpOwotIAl9CisJCWlmICghYmxhbmspCisJCQl1cGRhdGVfc2NyZWVuKHZjKTsKKwl9CiAKLSAJcmV0dXJuIDA7CisJaWYgKCFibGFuaykKKwkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKKwllbHNlCisJCWZiY29uX2RlbF9jdXJzb3JfdGltZXIoaW5mbyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZmJjb25fZnJlZV9mb250KHN0cnVjdCBkaXNwbGF5ICpwKQpAQCAtMjMzMiw3ICsyMzY1LDcgQEAKIAlpZiAoIUNPTl9JU19WSVNJQkxFKHZjKSkKIAkJcmV0dXJuIDA7CiAKLQlkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKTsKKwlkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KTsKIAlpZiAoZGVwdGggPiAzKSB7CiAJCWZvciAoaSA9IGogPSAwOyBpIDwgMTY7IGkrKykgewogCQkJayA9IHRhYmxlW2ldOwpAQCAtMjU5Myw2ICsyNjI2LDUxIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmYmNvbl9zZXRfYWxsX3ZjcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CisJc3RydWN0IHZjX2RhdGEgKnZjOworCXN0cnVjdCBkaXNwbGF5ICpwOworCWludCBpLCByb3dzLCBjb2xzOworCisJaWYgKCFvcHMgfHwgb3BzLT5jdXJyY29uIDwgMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CisJCXZjID0gdmNfY29uc1tpXS5kOworCQlpZiAoIXZjIHx8IHZjLT52Y19tb2RlICE9IEtEX1RFWFQgfHwKKwkJICAgIHJlZ2lzdGVyZWRfZmJbY29uMmZiX21hcFtpXV0gIT0gaW5mbykKKwkJCWNvbnRpbnVlOworCisJCXAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKKworCQlpbmZvLT52YXIueG9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0ID0gcC0+eXNjcm9sbCA9IDA7CisJCXZhcl90b19kaXNwbGF5KHAsICZpbmZvLT52YXIsIGluZm8pOworCQljb2xzID0gaW5mby0+dmFyLnhyZXMgLyB2Yy0+dmNfZm9udC53aWR0aDsKKwkJcm93cyA9IGluZm8tPnZhci55cmVzIC8gdmMtPnZjX2ZvbnQuaGVpZ2h0OworCQl2Y19yZXNpemUodmMsIGNvbHMsIHJvd3MpOworCisJCWlmIChDT05fSVNfVklTSUJMRSh2YykpIHsKKwkJCXVwZGF0ZXNjcm9sbG1vZGUocCwgaW5mbywgdmMpOworCQkJc2Nyb2xsYmFja19tYXggPSAwOworCQkJc2Nyb2xsYmFja19jdXJyZW50ID0gMDsKKwkJCXVwZGF0ZV92YXIodmMtPnZjX251bSwgaW5mbyk7CisJCQlmYmNvbl9zZXRfcGFsZXR0ZSh2YywgY29sb3JfdGFibGUpOworCQkJdXBkYXRlX3NjcmVlbih2Yyk7CisJCQlpZiAoc29mdGJhY2tfYnVmKSB7CisJCQkJaW50IGwgPSBmYmNvbl9zb2Z0YmFja19zaXplIC8gdmMtPnZjX3NpemVfcm93OworCQkJCWlmIChsID4gNSkKKwkJCQkJc29mdGJhY2tfZW5kID0gc29mdGJhY2tfYnVmICsgbCAqIHZjLT52Y19zaXplX3JvdzsKKwkJCQllbHNlIHsKKwkJCQkJLyogU21hbGxlciBzY3JvbGxiYWNrIG1ha2VzIG5vIHNlbnNlLCBhbmQgMAorCQkJCQkgICB3b3VsZCBzY3JldyB0aGUgb3BlcmF0aW9uIHRvdGFsbHkgKi8KKwkJCQkJc29mdGJhY2tfdG9wID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgZmJjb25fbW9kZV9kZWxldGVkKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJICAgICAgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSkKIHsKQEAgLTI3MDgsNiArMjc4Niw5IEBACiAJY2FzZSBGQl9FVkVOVF9NT0RFX0NIQU5HRToKIAkJZmJjb25fbW9kZWNoYW5nZWQoaW5mbyk7CiAJCWJyZWFrOworCWNhc2UgRkJfRVZFTlRfTU9ERV9DSEFOR0VfQUxMOgorCQlmYmNvbl9zZXRfYWxsX3ZjcyhpbmZvKTsKKwkJYnJlYWs7CiAJY2FzZSBGQl9FVkVOVF9NT0RFX0RFTEVURToKIAkJbW9kZSA9IGV2ZW50LT5kYXRhOwogCQlyZXQgPSBmYmNvbl9tb2RlX2RlbGV0ZWQoaW5mbywgbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uaCBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oCmluZGV4IDVkMzc3ODYuLjA4YmVmYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oCkBAIC0xOCw3ICsxOCw4IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2RlZmluZSBGQkNPTl9GTEFHU19JTklUIDEKKyNkZWZpbmUgRkJDT05fRkxBR1NfSU5JVCAgICAgICAgIDEKKyNkZWZpbmUgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSIDIKIAogICAgLyoKICAgICAqICAgIFRoaXMgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBsb3ctbGV2ZWwgY29uc29sZSBkcml2ZXIgYW5kIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCmluZGV4IGQyN2ZhOTEuLjA3MDVjZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKQEAgLTQ5Nyw2ICs0OTcsNTcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdmdhY29uX2RvcmVzaXplKHN0cnVjdCB2Y19kYXRhICpjLAorCQl1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc2NhbmxpbmVzID0gaGVpZ2h0ICogYy0+dmNfZm9udC5oZWlnaHQ7CisJdTggc2NhbmxpbmVzX2xvLCByNywgdnN5bmNfZW5kLCBtb2RlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZnYV9sb2NrLCBmbGFncyk7CisKKwlvdXRiX3AoVkdBX0NSVENfTU9ERSwgdmdhX3ZpZGVvX3BvcnRfcmVnKTsKKwltb2RlID0gaW5iX3AodmdhX3ZpZGVvX3BvcnRfdmFsKTsKKworCWlmIChtb2RlICYgMHgwNCkKKwkJc2NhbmxpbmVzID4+PSAxOworCisJc2NhbmxpbmVzIC09IDE7CisJc2NhbmxpbmVzX2xvID0gc2NhbmxpbmVzICYgMHhmZjsKKworCW91dGJfcChWR0FfQ1JUQ19PVkVSRkxPVywgdmdhX3ZpZGVvX3BvcnRfcmVnKTsKKwlyNyA9IGluYl9wKHZnYV92aWRlb19wb3J0X3ZhbCkgJiB+MHg0MjsKKworCWlmIChzY2FubGluZXMgJiAweDEwMCkKKwkJcjcgfD0gMHgwMjsKKwlpZiAoc2NhbmxpbmVzICYgMHgyMDApCisJCXI3IHw9IDB4NDA7CisKKwkvKiBkZXByb3RlY3QgcmVnaXN0ZXJzICovCisJb3V0Yl9wKFZHQV9DUlRDX1ZfU1lOQ19FTkQsIHZnYV92aWRlb19wb3J0X3JlZyk7CisJdnN5bmNfZW5kID0gaW5iX3AodmdhX3ZpZGVvX3BvcnRfdmFsKTsKKwlvdXRiX3AoVkdBX0NSVENfVl9TWU5DX0VORCwgdmdhX3ZpZGVvX3BvcnRfcmVnKTsKKwlvdXRiX3AodnN5bmNfZW5kICYgfjB4ODAsIHZnYV92aWRlb19wb3J0X3ZhbCk7CisKKwlvdXRiX3AoVkdBX0NSVENfSF9ESVNQLCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW91dGJfcCh3aWR0aCAtIDEsIHZnYV92aWRlb19wb3J0X3ZhbCk7CisJb3V0Yl9wKFZHQV9DUlRDX09GRlNFVCwgdmdhX3ZpZGVvX3BvcnRfcmVnKTsKKwlvdXRiX3Aod2lkdGggPj4gMSwgdmdhX3ZpZGVvX3BvcnRfdmFsKTsKKworCW91dGJfcChWR0FfQ1JUQ19WX0RJU1BfRU5ELCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW91dGJfcChzY2FubGluZXNfbG8sIHZnYV92aWRlb19wb3J0X3ZhbCk7CisJb3V0Yl9wKFZHQV9DUlRDX09WRVJGTE9XLCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW91dGJfcChyNyx2Z2FfdmlkZW9fcG9ydF92YWwpOworCisJLyogcmVwcm90ZWN0IHJlZ2lzdGVycyAqLworCW91dGJfcChWR0FfQ1JUQ19WX1NZTkNfRU5ELCB2Z2FfdmlkZW9fcG9ydF9yZWcpOworCW91dGJfcCh2c3luY19lbmQsIHZnYV92aWRlb19wb3J0X3ZhbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Z2FfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdmdhY29uX3N3aXRjaChzdHJ1Y3QgdmNfZGF0YSAqYykKIHsKIAkvKgpAQCAtNTEwLDkgKzU2MSwxMyBAQAogCS8qIFdlIGNhbiBvbmx5IGNvcHkgb3V0IHRoZSBzaXplIG9mIHRoZSB2aWRlbyBidWZmZXIgaGVyZSwKIAkgKiBvdGhlcndpc2Ugd2UgZ2V0IGludG8gVkdBIEJJT1MgKi8KIAotCWlmICghdmdhX2lzX2dmeCkKKwlpZiAoIXZnYV9pc19nZngpIHsKIAkJc2NyX21lbWNweXcoKHUxNiAqKSBjLT52Y19vcmlnaW4sICh1MTYgKikgYy0+dmNfc2NyZWVuYnVmLAotCQkJICAgIGMtPnZjX3NjcmVlbmJ1Zl9zaXplID4gdmdhX3ZyYW1fc2l6ZSA/IHZnYV92cmFtX3NpemUgOiBjLT52Y19zY3JlZW5idWZfc2l6ZSk7CisJCQkgICAgYy0+dmNfc2NyZWVuYnVmX3NpemUgPiB2Z2FfdnJhbV9zaXplID8KKwkJCQl2Z2FfdnJhbV9zaXplIDogYy0+dmNfc2NyZWVuYnVmX3NpemUpOworCQl2Z2Fjb25fZG9yZXNpemUoYywgYy0+dmNfY29scywgYy0+dmNfcm93cyk7CisJfQorCiAJcmV0dXJuIDA7CQkvKiBSZWRyYXdpbmcgbm90IG5lZWRlZCAqLwogfQogCkBAIC05NjIsNiArMTAxNywxNyBAQAogCiAjZW5kaWYKIAorc3RhdGljIGludCB2Z2Fjb25fcmVzaXplKHN0cnVjdCB2Y19kYXRhICpjLCB1bnNpZ25lZCBpbnQgd2lkdGgsCisJCQkJdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKwlpZiAod2lkdGggJSAyIHx8IHdpZHRoID4gT1JJR19WSURFT19DT0xTIHx8IGhlaWdodCA+IE9SSUdfVklERU9fTElORVMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKENPTl9JU19WSVNJQkxFKGMpICYmICF2Z2FfaXNfZ2Z4KSAvKiB3aG8ga25vd3MgKi8KKwkJdmdhY29uX2RvcmVzaXplKGMsIHdpZHRoLCBoZWlnaHQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZnYWNvbl9zY3JvbGxkZWx0YShzdHJ1Y3QgdmNfZGF0YSAqYywgaW50IGxpbmVzKQogewogCWlmICghbGluZXMpCQkvKiBUdXJuIHNjcm9sbGJhY2sgb2ZmICovCkBAIC0xMTAzLDYgKzExNjksNyBAQAogCS5jb25fYmxhbmsgPSB2Z2Fjb25fYmxhbmssCiAJLmNvbl9mb250X3NldCA9IHZnYWNvbl9mb250X3NldCwKIAkuY29uX2ZvbnRfZ2V0ID0gdmdhY29uX2ZvbnRfZ2V0LAorCS5jb25fcmVzaXplID0gdmdhY29uX3Jlc2l6ZSwKIAkuY29uX3NldF9wYWxldHRlID0gdmdhY29uX3NldF9wYWxldHRlLAogCS5jb25fc2Nyb2xsZGVsdGEgPSB2Z2Fjb25fc2Nyb2xsZGVsdGEsCiAJLmNvbl9zZXRfb3JpZ2luID0gdmdhY29uX3NldF9vcmlnaW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYyBiL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjc2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYwpAQCAtMCwwICsxLDE0NTYgQEAKKy8qCisgKiBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciBUcmlkZW50IEN5YmVyYmxhZGUvaTEgZ3JhcGhpY3MgY29yZQorICoKKyAqIENvcHlyaWdodCAyMDA1IEtudXQgUGV0ZXJzZW4gPEtudXRfUGV0ZXJzZW5AdC1vbmxpbmUuZGU+CisgKgorICogQ1JFRElUUzoKKyAqCXRyaWRlbnRmYi5jIGJ5IEphbmkgTW9ub3NlcworICoJc2VlIGZpbGVzIGFib3ZlIGZvciBmdXJ0aGVyIGNyZWRpdHMKKyAqCisgKiBUT0RPOgorICoKKyAqLworCisjZGVmaW5lIENZQkxBRkJfREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8dmlkZW8vY3libGFmYi5oPgorCisjZGVmaW5lIFZFUlNJT04gIjAuNTQiCisKK3N0cnVjdCBjeWJsYWZiX3BhciB7CisJdTMyIHBzZXVkb19wYWxbMTZdOworCXN0cnVjdCBmYl9vcHMgb3BzOworfTsKKworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBjeWJsYWZiX2ZpeCBfX2RldmluaXRkYXRhID0geworCS5pZCA9ICJDeUJsYSIsCisJLnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnlwYW5zdGVwID0gMSwKKwkudmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SLAorCS5hY2NlbCA9IEZCX0FDQ0VMX05PTkUsCit9OworCitzdGF0aWMgY2hhciAqbW9kZSBfX2RldmluaXRkYXRhID0gTlVMTDsKK3N0YXRpYyBpbnQgYnBwIF9fZGV2aW5pdGRhdGEgPSA4Oworc3RhdGljIGludCByZWYgX19kZXZpbml0ZGF0YSA9IDc1Oworc3RhdGljIGludCBmcCBfX2RldmluaXRkYXRhOworc3RhdGljIGludCBjcnQgX19kZXZpbml0ZGF0YTsKK3N0YXRpYyBpbnQgbWVtc2l6ZSBfX2RldmluaXRkYXRhOworc3RhdGljIGludCB2ZXNhZmIgX19kZXZpbml0ZGF0YTsKKworc3RhdGljIGludCBuYXRpdmV4Oworc3RhdGljIGludCBjZW50ZXI7CitzdGF0aWMgaW50IHN0cmV0Y2g7CitzdGF0aWMgaW50IHBjaXdiID0gMTsKK3N0YXRpYyBpbnQgcGNpcmIgPSAxOworc3RhdGljIGludCBwY2l3ciA9IDE7CitzdGF0aWMgaW50IHBjaXJyID0gMTsKK3N0YXRpYyBpbnQgdmVyYm9zaXR5Oworc3RhdGljIGludCBkaXNwbGF5dHlwZTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqIGlvX3ZpcnQ7IC8vIGlvc3BhY2UgdmlydHVhbCBtZW1vcnkgYWRkcmVzcworCittb2R1bGVfcGFyYW0obW9kZSxjaGFycCwwKTsKK21vZHVsZV9wYXJhbShicHAsaW50LDApOworbW9kdWxlX3BhcmFtKHJlZixpbnQsMCk7Cittb2R1bGVfcGFyYW0oZnAsaW50LDApOworbW9kdWxlX3BhcmFtKGNydCxpbnQsMCk7Cittb2R1bGVfcGFyYW0obmF0aXZleCxpbnQsMCk7Cittb2R1bGVfcGFyYW0oY2VudGVyLGludCwwKTsKK21vZHVsZV9wYXJhbShzdHJldGNoLGludCwwKTsKK21vZHVsZV9wYXJhbShwY2l3YixpbnQsMCk7Cittb2R1bGVfcGFyYW0ocGNpcmIsaW50LDApOworbW9kdWxlX3BhcmFtKHBjaXdyLGludCwwKTsKK21vZHVsZV9wYXJhbShwY2lycixpbnQsMCk7Cittb2R1bGVfcGFyYW0obWVtc2l6ZSxpbnQsMCk7Cittb2R1bGVfcGFyYW0odmVyYm9zaXR5LGludCwwKTsKK21vZHVsZV9wYXJhbSh2ZXNhZmIsaW50LDApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gUG9ydCBhY2Nlc3MgbWFjcm9zIGZvciBtZW1vcnkgbWFwcGVkIGlvCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZGVmaW5lIG91dDgocix2KSB3cml0ZWIodixpb192aXJ0K3IpCisjZGVmaW5lIG91dDMyKHIsdikgd3JpdGVsKHYsaW9fdmlydCtyKQorI2RlZmluZSBpbjgocikgcmVhZGIoaW9fdmlydCtyKQorI2RlZmluZSBpbjMyKHIpIHJlYWRsKGlvX3ZpcnQrcikKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIEhhcmR3YXJlIGFjY2VzcyBpbmxpbmUgZnVuY3Rpb25zCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZDNYNChpbnQgcmVnKQoreworCW91dDgoMHgzRDQscmVnKTsKKwlyZXR1cm4gaW44KDB4M0Q1KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWQzQzQoaW50IHJlZykKK3sKKwlvdXQ4KDB4M0M0LHJlZyk7CisJcmV0dXJuIGluOCgweDNDNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkM0NFKGludCByZWcpCit7CisJb3V0OCgweDNDRSxyZWcpOworCXJldHVybiBpbjgoMHgzQ0YpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzWDQoaW50IHJlZyx1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXQ4KDB4M0Q0LHJlZyk7CisJb3V0OCgweDNENSx2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzQzQoaW50IHJlZyx1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXQ4KDB4M0M0LHJlZyk7CisJb3V0OCgweDNDNSx2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzQ0UoaW50IHJlZyx1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXQ4KDB4M0NFLHJlZyk7CisJb3V0OCgweDNDRix2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzQzAoaW50IHJlZyx1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpbjgoMHgzREEpOwkvLyByZWFkIHRvIHJlc2V0IGluZGV4CisJb3V0OCgweDNDMCxyZWcpOworCW91dDgoMHgzQzAsdmFsKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gRW5hYmxlIG1lbW9yeSBtYXBwZWQgaW8gYW5kIHVucHJvdGVjdCByZWdpc3RlcnMKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9tbWlvKHZvaWQpCit7CisJaW50IHRtcDsKKworCW91dGIoMHgwQiwweDNDNCk7CisJaW5iKDB4M0M1KTsJCS8vIFNldCBORVcgbW9kZQorCW91dGIoU1IwRSwweDNDNCk7CS8vIHdyaXRlIGVuYWJsZSBhIGxvdCBvZiBleHRlbmRlZCBwb3J0cworCW91dGIoMHg4MCwweDNDNSk7CisKKwlvdXRiKFNSMTEsMHgzQzQpOwkvLyB3cml0ZSBlbmFibGUgdGhvc2UgZXh0ZW5kZWQgcG9ydHMgdGhhdAorCW91dGIoMHg4NywweDNDNSk7CS8vIGFyZSBub3QgYWZmZWN0ZWQgYnkgU1IwRV9OZXcKKworCW91dGIoQ1IxRSwweDNkNCk7CS8vIGNsZWFyIHdyaXRlIHByb3RlY3QgYml0IGZvciBwb3J0IDB4M2MyCisJdG1wPWluYigweDNkNSkgJiAweEJGOworCW91dGIoQ1IxRSwweDNkNCk7CisJb3V0Yih0bXAsMHgzZDUpOworCisJb3V0YihDUjM5LDB4M0Q0KTsKKwlvdXRiKGluYigweDNENSl8MHgwMSwweDNENSk7IC8vIEVuYWJsZSBtbWlvLCBldmVyeXRoaW5nIGVsc2UgdW50b3VjaGVkCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFNldCBwaXhlbCBjbG9jayBWQ0xLMQorLy8gICAtIG11bHRpcGxpZXJzIHNldCBlbHN3aGVyZQorLy8gICAtIGZyZXEgaW4gdW5pdHMgb2YgMC4wMSBNSHoKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQgc2V0X3ZjbGsoc3RydWN0IGN5YmxhZmJfcGFyICpwYXIsIGludCBmcmVxKQoreworCXUzMiBtLG4sazsKKwlpbnQgZixmaSxkLGRpOworCXU4IGxvPTAsaGk9MDsKKworCWQgPSAyMDAwOworCWsgPSBmcmVxID49IDEwMDAwID8gMCA6IGZyZXEgPj0gNTAwMCA/IDEgOiBmcmVxID49IDI1MDAgPyAyIDogMzsKKwlmb3IobSA9IDA7bTw2NDttKyspCisJZm9yKG4gPSAwO248MjUwO24rKykgeyAvLyBtYXggMjQ5IGlzIGEgaGFyZHdhcmUgbGltaXQgZm9yIGN5YmxhL2kxICEKKwkJZmkgPSAoaW50KSgoKDU4NjQ3MjcqKG4rOCkpLygobSsyKSooMTw8aykpKT4+MTIpOworCQlpZiAoKGRpID0gYWJzKGZpIC0gZnJlcSkpIDwgZCkgeworCQkJZCA9IGRpOworCQkJZiA9IGZpOworCQkJbG8gPSAodTgpIG47CisJCQloaSA9ICh1OCkgKChrPDw2KSB8IG0pOworCQl9CisJfQorCXdyaXRlM0M0KFNSMTksaGkpOworCXdyaXRlM0M0KFNSMTgsbG8pOworCWlmKHZlcmJvc2l0eSA+IDEpCisJCW91dHB1dCgicGl4Y2xvY2sgPSAlZC4lMDJkIE1Ieiwgay9tL24gJXggJXggJXhcbiIsCisJCWZyZXEvMTAwLGZyZXElMTAwLChoaSYweGMwKT4+NixoaSYweDNmLGxvKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBDeWJlcmJsYWRlIHNwZWNpZmljIEdyYXBoaWNzIEVuZ2luZSAoR0UpIHNldHVwCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQgY3libGFmYl9zZXR1cF9HRShpbnQgcGl0Y2gsaW50IGJwcCkKK3sKKwlpbnQgYmFzZSA9IChwaXRjaD4+Myk8PDIwOworCisJc3dpdGNoIChicHApIHsKKwkJY2FzZSAgODogYmFzZSB8PSAoMDw8MjkpOyBicmVhazsKKwkJY2FzZSAxNTogYmFzZSB8PSAoNTw8MjkpOyBicmVhazsKKwkJY2FzZSAxNjogYmFzZSB8PSAoMTw8MjkpOyBicmVhazsKKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjogYmFzZSB8PSAoMjw8MjkpOyBicmVhazsKKwl9CisKKwl3cml0ZTNYNChDUjM2LDB4OTApOwkvLyByZXNldCBHRQorCXdyaXRlM1g0KENSMzYsMHg4MCk7CS8vIGVuYWJsZSBHRQorCisJb3V0MzIoR0UyNCwxPDw3KTsJLy8gcmVzZXQgYWxsIEdFIHBvaW50ZXJzCisJb3V0MzIoR0UyNCwwKTsKKworCXdyaXRlM1g0KENSMkQsMHgwMCk7CS8vIEdFIFRpbWluaWdzLCBubyBkZWxheXMKKworCW91dDMyKEdFQjgsYmFzZSk7IC8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDAsIHAgMTMzCisJb3V0MzIoR0VCQyxiYXNlKTsgLy8gRGVzdGluYXRpb24gU3RyaWRlIC8gQnVmZmVyIEJhc2UgMSwgcCAxMzMKKwlvdXQzMihHRUMwLGJhc2UpOyAvLyBEZXN0aW5hdGlvbiBTdHJpZGUgLyBCdWZmZXIgQmFzZSAyLCBwIDEzMworCW91dDMyKEdFQzQsYmFzZSk7IC8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDMsIHAgMTMzCisJb3V0MzIoR0VDOCxiYXNlKTsgLy8gU291cmNlIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDAsIHAgMTMzCisJb3V0MzIoR0VDQyxiYXNlKTsgLy8gU291cmNlIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDEsIHAgMTMzCisJb3V0MzIoR0VEMCxiYXNlKTsgLy8gU291cmNlIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDIsIHAgMTMzCisJb3V0MzIoR0VENCxiYXNlKTsgLy8gU291cmNlIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDMsIHAgMTMzCisJb3V0MzIoR0U2QywwKTsJICAvLyBQYXR0ZXJuIGFuZCBTdHlsZSwgcCAxMjksIG9rCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQWx0aG91Z2ggdGhpcyBpcyBhIC5mYl9zeW5jIGZ1bmN0aW9uIHRoYXQgY291bGQgYmUgZW5hYmxlZCBpbgorLy8gY3libGFmYl9vcHMsIHdlIGRvIG5vdCBpbmNsdWRlIGl0IHRoZXJlLiBXZSBzeW5jIGltbWVkaWF0ZWx5IGJlZm9yZQorLy8gbmV3IEdFIG9wZXJhdGlvbnMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IGN5YmxhZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgc3RhdHVzLCBpPTEwMDAwMDsKKwl3aGlsZSggKChzdGF0dXM9aW4zMihHRTIwKSkgJiAweEZBODAwMDAwKSAmJiBpICE9IDApCisJCWktLTsKKworCWlmIChpID09IDApIHsKKwkJLy8gVGhlIHRpbWVvdXQgbWlnaHQgYmUgY2F1c2VkIGJ5IGRpc2FibGVkIG1taW8uCisJCS8vIENhdXNlOgorCQkvLyAgIC0gYml0IENSMzkgJiAxID09IDAgdXBvbiByZXR1cm4sIFggdHJpZGVudCBkcml2ZXIgYnVnCisJCS8vICAgLSBrZG0gYnVnIChLRF9HUkFQSElDUyBub3Qgc2V0IG9uIGZpcnN0IHN3aXRjaCkKKwkJLy8gICAtIGtlcm5lbCBkZXNpZ24gZmxhdyAoaXQgYmVsaWV2ZXMgaW4gdGhlIGNvcnJlY3RuZXNzCisJCS8vICAgICBvZiBrZG0vWAorCQkvLyBTbyB3ZSBtYWtlIHN1cmUgdGhhdCBtbWlvIGlzIGVuYWJsZWQgZmlyc3QgLi4uCisJCWVuYWJsZV9tbWlvKCk7CisvLwkJc2hvd190cmFjZShOVUxMLCZzdGF0dXMpOworCQlpPTEwMDAwMDA7CisJCXdoaWxlKCAoKHN0YXR1cz1pbjMyKEdFMjApKSAmIDB4RkE4MDAwMDApICYmIGkgIT0gMCkKKwkJCWktLTsKKwkJaWYgKGkgPT0gMCkgeworCQkJb3V0cHV0KCJHRSBUaW1lb3V0LCBzdGF0dXM6ICV4XG4iLHN0YXR1cyk7CisJCQlpZihzdGF0dXMgJiAweDgwMDAwMDAwKQorCQkJCW91dHB1dCgiQnJlc2VuaGFtIEVuZ2luZSA6IEJ1c3lcbiIpOworCQkJaWYoc3RhdHVzICYgMHg0MDAwMDAwMCkKKwkJCQlvdXRwdXQoIlNldHVwIEVuZ2luZSAgICAgOiBCdXN5XG4iKTsKKwkJCWlmKHN0YXR1cyAmIDB4MjAwMDAwMDApCisJCQkJb3V0cHV0KCJTUCAvIERQRSAgICAgICAgIDogQnVzeVxuIik7CisJCQlpZihzdGF0dXMgJiAweDEwMDAwMDAwKQorCQkJCW91dHB1dCgiTWVtb3J5IEludGVyZmFjZSA6IEJ1c3lcbiIpOworCQkJaWYoc3RhdHVzICYgMHgwODAwMDAwMCkKKwkJCQlvdXRwdXQoIkNvbSBMc3QgUHJvYyAgICAgOiBCdXN5XG4iKTsKKwkJCWlmKHN0YXR1cyAmIDB4MDQwMDAwMDApCisJCQkJb3V0cHV0KCJCbG9jayBXcml0ZSAgICAgIDogQnVzeVxuIik7CisJCQlpZihzdGF0dXMgJiAweDAyMDAwMDAwKQorCQkJCW91dHB1dCgiQ29tbWFuZCBCdWZmZXIgICA6IEZ1bGxcbiIpOworCQkJaWYoc3RhdHVzICYgMHgwMTAwMDAwMCkKKwkJCQlvdXRwdXQoIlJFU0VSVkVEICAgICAgICAgOiBCdXN5XG4iKTsKKwkJCWlmKHN0YXR1cyAmIDB4MDA4MDAwMDApCisJCQkJb3V0cHV0KCJQQ0kgV3JpdGUgQnVmZmVyIDogQnVzeVxuIik7CisJCQljeWJsYWZiX3NldHVwX0dFKGluZm8tPnZhci54cmVzLAorCQkJCQkgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIEN5YmVyYmxhZGUgc3BlY2lmaWMgZmlsbHJlY3QKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZCBjeWJsYWZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICogaW5mbywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpmcikKK3sKKwlpbnQgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCWludCBjb2w7CisKKwlzd2l0Y2ggKGJwcCkgeworCQlkZWZhdWx0OgorCQljYXNlIDg6IGNvbCA9IGZyLT5jb2xvcjsKKwkJCWNvbCB8PSBjb2wgPDw4OworCQkJY29sIHw9IGNvbCA8PDE2OworCQkJYnJlYWs7CisJCWNhc2UgMTY6IGNvbCA9ICgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbZnItPmNvbG9yXTsKKwkJCSBjb2wgfD0gY29sIDw8MTY7CisJCQkgYnJlYWs7CisJCWNhc2UgMzI6IGNvbCA9ICgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbZnItPmNvbG9yXTsKKwkJCSBicmVhazsKKwl9CisKKwljeWJsYWZiX3N5bmMoaW5mbyk7CisKKwlvdXQzMihHRTYwLGNvbCk7CisJb3V0MzIoR0U0OCxmci0+cm9wID8gMHg2NjpST1BfUyk7CisJb3V0MzIoR0U0NCwweDIwMDAwMDAwfDE8PDE5fDE8PDR8Mjw8Mik7CisJb3V0MzIoR0UwOCxwb2ludChmci0+ZHgsZnItPmR5KSk7CisJb3V0MzIoR0UwQyxwb2ludChmci0+ZHgrZnItPndpZHRoLTEsZnItPmR5K2ZyLT5oZWlnaHQtMSkpOworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQ3liZXJibGFkZSBzcGVjaWZpYyBjb3B5YXJlYQorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyB2b2lkIGN5YmxhZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqY2EpCit7CisJX191MzIgczEsczIsZDEsZDI7CisJaW50IGRpcmVjdGlvbjsKKworCXMxID0gcG9pbnQoY2EtPnN4LGNhLT5zeSk7CisJczIgPSBwb2ludChjYS0+c3grY2EtPndpZHRoLTEsY2EtPnN5K2NhLT5oZWlnaHQtMSk7CisJZDEgPSBwb2ludChjYS0+ZHgsY2EtPmR5KTsKKwlkMiA9IHBvaW50KGNhLT5keCtjYS0+d2lkdGgtMSxjYS0+ZHkrY2EtPmhlaWdodC0xKTsKKwlpZiAoKGNhLT5zeSA+IGNhLT5keSkgfHwgKChjYS0+c3kgPT0gY2EtPmR5KSAmJiAoY2EtPnN4ID4gY2EtPmR4KSkpCisJCWRpcmVjdGlvbiA9IDA7CisJZWxzZQorCQlkaXJlY3Rpb24gPSAyOworCisJY3libGFmYl9zeW5jKGluZm8pOworCisJb3V0MzIoR0U0NCwweGEwMDAwMDAwfDE8PDE5fDE8PDJ8ZGlyZWN0aW9uKTsKKwlvdXQzMihHRTAwLGRpcmVjdGlvbj9zMjpzMSk7CisJb3V0MzIoR0UwNCxkaXJlY3Rpb24/czE6czIpOworCW91dDMyKEdFMDgsZGlyZWN0aW9uP2QyOmQxKTsKKwlvdXQzMihHRTBDLGRpcmVjdGlvbj9kMTpkMik7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIEN5YmVyYmxhZGUgc3BlY2lmaWMgaW1hZ2VibGl0CisvLworLy8gQWNjZWxlcmF0ZWQgZm9yIHRoZSBtb3N0IHVzdWFsIGNhc2UsIGJsaXR0aW5nIDEtYml0IGRlZXAgY2hhcmFjdGVyCisvLyBjaGFyYWN0ZXIgaW1hZ2VzLiBFdmVyeXRoaW5nIGVsc2UgaXMgcGFzc2VkIHRvIHRoZSBnZW5lcmljIGltYWdlYmxpdC4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyB2b2lkIGN5YmxhZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKworCXUzMiBmZ2NvbCwgYmdjb2w7CisKKwlpbnQgaTsKKwlpbnQgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCWludCBpbmRleCA9IDA7CisJaW50IGluZGV4X2VuZD1pbWFnZS0+aGVpZ2h0ICogaW1hZ2UtPndpZHRoIC8gODsKKwlpbnQgd2lkdGhfZGRzPWltYWdlLT53aWR0aCAvIDMyOworCWludCB3aWR0aF9kYnM9aW1hZ2UtPndpZHRoICUgMzI7CisKKwlpZiAoaW1hZ2UtPmRlcHRoICE9IDEgfHwgYnBwIDwgOCB8fCBicHAgPiAzMiB8fCBicHAgJSA4ICE9IDAgfHwKKwkgICAgaW1hZ2UtPndpZHRoICUgOCAhPSAwIHx8IGltYWdlLT53aWR0aCA9PSAwIHx8IGltYWdlLT5oZWlnaHQgPT0gMCkgeworCQljZmJfaW1hZ2VibGl0KGluZm8saW1hZ2UpOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUiB8fAorCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUikgeworCQlmZ2NvbCA9ICgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtpbWFnZS0+ZmdfY29sb3JdOworCQliZ2NvbCA9ICgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtpbWFnZS0+YmdfY29sb3JdOworCX0gZWxzZSB7CisJCWZnY29sID0gaW1hZ2UtPmZnX2NvbG9yOworCQliZ2NvbCA9IGltYWdlLT5iZ19jb2xvcjsKKwl9CisKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDg6CisJCQlmZ2NvbCB8PSBmZ2NvbCA8PDg7IGZnY29sIHw9IGZnY29sIDw8MTY7CisJCQliZ2NvbCB8PSBiZ2NvbCA8PDg7IGJnY29sIHw9IGJnY29sIDw8MTY7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWZnY29sIHw9IGZnY29sIDw8MTY7CisJCQliZ2NvbCB8PSBiZ2NvbCA8PDE2OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkgYnJlYWs7CisJfQorCisJY3libGFmYl9zeW5jKGluZm8pOworCisJb3V0MzIoR0U2MCxmZ2NvbCk7CisJb3V0MzIoR0U2NCxiZ2NvbCk7CisJb3V0MzIoR0U0NCwweGEwMDAwMDAwIHwgMTw8MjAgfCAxPDwxOSk7CisJb3V0MzIoR0UwOCxwb2ludChpbWFnZS0+ZHgsaW1hZ2UtPmR5KSk7CisJb3V0MzIoR0UwQyxwb2ludChpbWFnZS0+ZHgraW1hZ2UtPndpZHRoLTEsaW1hZ2UtPmR5K2ltYWdlLT5oZWlnaHQtMSkpOworCisJd2hpbGUoaW5kZXggPCBpbmRleF9lbmQpIHsKKwkJZm9yKGk9MDtpPHdpZHRoX2RkcztpKyspIHsKKwkJCW91dDMyKEdFOUMsKigodTMyKikgKCh1MzIpaW1hZ2UtPmRhdGEgKyBpbmRleCkpKTsKKwkJCWluZGV4Kz00OworCQl9CisJCXN3aXRjaCh3aWR0aF9kYnMpIHsKKwkJY2FzZSAwOiBicmVhazsKKwkJY2FzZSA4OglvdXQzMihHRTlDLCooKHU4KikoKHUzMilpbWFnZS0+ZGF0YStpbmRleCkpKTsKKwkJCWluZGV4Kz0xOworCQkJYnJlYWs7CisJCWNhc2UgMTY6IG91dDMyKEdFOUMsKigodTE2KikoKHUzMilpbWFnZS0+ZGF0YStpbmRleCkpKTsKKwkJCWluZGV4Kz0yOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6IG91dDMyKEdFOUMsKHUzMikoKigodTE2KikoKHUzMilpbWFnZS0+ZGF0YStpbmRleCkpKSB8CisJCQkgICAgICAgKHUzMikoKigodTgqKSgodTMyKWltYWdlLT5kYXRhK2luZGV4KzIpKSk8PDE2KTsKKwkJCWluZGV4Kz0zOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIENoZWNrIGlmIHZpZGVvIG1vZGUgaXMgYWNjZXB0YWJsZS4gV2UgY2hhbmdlIHZhci0+Pz8/IGlmCisvLyB2aWRlbyBtb2RlIGlzIHNsaWdodGx5IG9mZiBvciByZXR1cm4gZXJyb3Igb3RoZXJ3aXNlLgorLy8gaW5mby0+Pz8/IG11c3Qgbm90IGJlIGNoYW5nZWQhCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgY3libGFmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOworCWludCBzLHQsbWF4dnlyZXM7CisKKwkvLworCS8vIHdlIHRyeSB0byBzdXBwb3J0IDgsIDE2LCAyNCBhbmQgMzIgYnBwIG1vZGVzLAorCS8vIGRlZmF1bHQgdG8gOAorCS8vCisJLy8gdGhlcmUgaXMgYSAyNCBicHAgbW9kZSwgYnV0IGZvciBub3cgd2UgY2hhbmdlIHJlcXVlc3RzIHRvIDMyIGJwcAorCS8vIChUaGlzIGlzIHdoYXQgdHJpZGVudGZiIGRvZXMgLi4uIHdpbGwgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlKQorCS8vCisJLy8KKwlpZiAoIGJwcCAlIDggIT0gMCB8fCBicHAgPCA4IHx8IGJwcCA+MzIpCisJCWJwcCA9IDg7CisJaWYgKGJwcCA9PSAyNCApCisJCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWwgPSAzMjsKKworCS8vCisJLy8gaW50ZXJsYWNlZCBtb2RlcyBhcmUgYnJva2VuLCBmYWlsIGlmIG9uZSBpcyByZXF1ZXN0ZWQKKwkvLworCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLworCS8vIGZhaWwgaWYgcmVxdWVzdGVkIHJlc29sdXRpb24gaXMgaGlnaGVyIHRoYW4gcGh5c2ljYWwKKwkvLyBmbGF0cGFuZWwgcmVzb2x1dGlvbgorCS8vCisJaWYgKChkaXNwbGF5dHlwZSA9PSBESVNQTEFZX0ZQKSAmJiBuYXRpdmV4ICYmIHZhci0+eHJlcyA+IG5hdGl2ZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8KKwkvLyB4cmVzICE9IHhyZXNfdmlydHVhbCBpcyBicm9rZW4sIGZhaWwgaWYgc3VjaCBhbgorCS8vIHVudXN1YWwgbW9kZSBpcyByZXF1ZXN0ZWQKKwkvLworCWlmICh2YXItPnhyZXMgIT0gdmFyLT54cmVzX3ZpcnR1YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8KKwkvLyB3ZSBkbyBub3QgYWxsb3cgdmNsayB0byBleGNlZWQgMjMwIE1IegorCS8vCisJaWYgKChicHA9PTMyID8gMjAwMDAwMDAwIDogMTAwMDAwMDAwKSAvIHZhci0+cGl4Y2xvY2sgPiAyMzAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLworCS8vIGNhbGMgbWF4IHlyZXNfdmlydHVhbCB0aGF0IHdvdWxkIGZpdCBpbiBtZW1vcnkKKwkvLyBhbmQgbWF4IHlyZXNfdmlydHVhbCB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHNjcm9sbGluZworCS8vIGFuZCB1c2UgbWluaW11bSBvZiB0aGUgcmVzdWx0cyBhcyBtYXh2eXJlcworCS8vCisJLy8gYWRqdXN0IHZ5cmVzX3ZpcnR1YWwgdG8gbWF4dnlyZXMgaWYgbmVjZXNzYXJ5CisJLy8gZmFpbCBpZiByZXF1ZXN0ZWQgeXJlcyBpcyBiaWdnZXIgdGhhbiBtYXh2eXJlcworCS8vCisJcyA9ICgweDFmZmZmZiAvICh2YXItPnhyZXMgKiBicHAvOCkpICsgdmFyLT55cmVzOworCXQgPSBpbmZvLT5maXguc21lbV9sZW4gLyAodmFyLT54cmVzICogYnBwLzgpOworCW1heHZ5cmVzID0gdCA8IHMgPyB0IDogczsKKwlpZiAobWF4dnlyZXMgPCB2YXItPnlyZXNfdmlydHVhbCkKKwkJdmFyLT55cmVzX3ZpcnR1YWw9bWF4dnlyZXM7CisJaWYgKG1heHZ5cmVzIDwgdmFyLT55cmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoYnBwKSB7CisJCWNhc2UgODoKKwkJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CisJCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJCXZhci0+cmVkLmxlbmd0aCA9IDY7CisJCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCQl2YXItPmJsdWUubGVuZ3RoID0gNjsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJdmFyLT5yZWQub2Zmc2V0ID0gMTE7CisJCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJCXZhci0+cmVkLmxlbmd0aCA9IDU7CisJCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CisJCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CisJCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CisJCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBQYW4gdGhlIGRpc3BsYXkKKy8vCisvLyBUaGUgZGF0YXNoZWV0cyBkZWZpbmVzIGNydCBzdGFydCBhZGRyZXNzIHRvIGJlIDIwIGJpdHMgd2lkZSBhbmQKKy8vIHRvIGJlIHByb2dyYW1tZWQgdG8gQ1IwQywgQ1IwRCwgQ1IxRSBhbmQgQ1IyNy4gQWN0dWFsbHkgdGhlcmUgaXMKKy8vIENSMkJbNV0gYXMgYW4gdW5kb2N1bWVudGVkIGV4dGVuc2lvbiBiaXQuIEVwaWEgQklPUyAyLjA3IGRvZXMgdXNlCisvLyBpdCwgc28gaXQgaXMgYWxzbyBzYWZlIHRvIGJlIHVzZWQgaGVyZS4gQlRXOiBkYXRhc2hlZXQgQ1IwRSBvbiBwYWdlCisvLyA5MCByZWFsbHkgaXMgQ1IxRSwgdGhlIHJlYWwgQ1JFIGlzIGRvY3VtZW50ZWQgb24gcGFnZSA3Mi4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IGN5YmxhZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCW9mZnNldD0odmFyLT54b2Zmc2V0Kyh2YXItPnlvZmZzZXQqdmFyLT54cmVzKSkqdmFyLT5iaXRzX3Blcl9waXhlbC8zMjsKKwlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKKwlpbmZvLT52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKKworCXdyaXRlM1g0KENSMEQsb2Zmc2V0ICYgMHhGRik7CisJd3JpdGUzWDQoQ1IwQywob2Zmc2V0ICYgMHhGRjAwKSA+PiA4KTsKKwl3cml0ZTNYNChDUjFFLChyZWFkM1g0KENSMUUpICYgMHhERikgfCAoKG9mZnNldCAmIDB4MTAwMDApID4+IDExKSk7CisJd3JpdGUzWDQoQ1IyNywocmVhZDNYNChDUjI3KSAmIDB4RjgpIHwgKChvZmZzZXQgJiAweEUwMDAwKSA+PiAxNykpOworCXdyaXRlM1g0KENSMkIsKHJlYWQzWDQoQ1IyQikgJiAweERGKSB8ICgob2Zmc2V0ICYgMHgxMDAwMDApID4+IDE1KSk7CisKKwlyZXR1cm4gMDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgd2lsbCByZWFsbHkgaGVscCBpbiBjYXNlIG9mIGEgYnVnIC4uLgorLy8gZHVtcCBtb3N0IGdhcGhpY3MgY29yZSByZWdpc3RlcnMuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZCByZWdkdW1wKHN0cnVjdCBjeWJsYWZiX3BhciAqcGFyKQoreworCWludCBpOworCisJaWYgKHZlcmJvc2l0eSA8IDIpCisJCXJldHVybjsKKworCXByaW50aygiXG4iKTsKKwlmb3IoaT0wOyBpPD0weGZmOyBpKyspIHsKKwkJb3V0YihpLDB4M2Q0KTsKKwkJcHJpbnRrKCJDUiUwMng9JTAyeCAiLGksaW5iKDB4M2Q1KSk7CisJCWlmIChpJTE2PT0xNSkKKwkJCXByaW50aygiXG4iKTsKKwl9CisKKwlvdXRiKDB4MzAsMHgzY2UpOworCW91dGIoaW5iKDB4M2NmKSB8IDB4NDAsMHgzY2YpOworCWZvcihpPTA7IGk8PTB4MWY7IGkrKykgeworCQlpZiAoaT09MCB8fCAoaT4yICYmIGk8OCkgfHwgaT09MHgxMCB8fCBpPT0weDExIHx8IGk9PTB4MTYpIHsKKwkJCW91dGIoaSwweDNkNCk7CisJCQlwcmludGsoIkNSJTAyeD0lMDJ4ICIsaSxpbmIoMHgzZDUpKTsKKwkJfSBlbHNlCisJCQlwcmludGsoIi0tLS0tLS0gIik7CisJCWlmIChpJTE2PT0xNSkKKwkJCXByaW50aygiXG4iKTsKKwl9CisJb3V0YigweDMwLDB4M2NlKTsKKwlvdXRiKGluYigweDNjZikgJiAweGJmLDB4M2NmKTsKKworCXByaW50aygiXG4iKTsKKwlmb3IoaT0wOyBpPD0weDdmOyBpKyspIHsKKwkJb3V0YihpLDB4M2NlKTsKKwkJcHJpbnRrKCJHUiUwMng9JTAyeCAiLGksaW5iKDB4M2NmKSk7CisJCWlmIChpJTE2PT0xNSkKKwkJCXByaW50aygiXG4iKTsKKwl9CisKKwlwcmludGsoIlxuIik7CisJZm9yKGk9MDsgaTw9MHhmZjsgaSsrKSB7CisJCW91dGIoaSwweDNjNCk7CisJCXByaW50aygiU1IlMDJ4PSUwMnggIixpLGluYigweDNjNSkpOworCQlpZiAoaSUxNj09MTUpCisJCQlwcmludGsoIlxuIik7CisJfQorCisJcHJpbnRrKCJcbiIpOworCWZvcihpPTA7IGkgPD0gMHgxRjsgaSsrKSB7CisJCWluYigweDNkYSk7IC8vIG5leHQgYWNjZXNzIGlzIGluZGV4IQorCQlvdXRiKGksMHgzYzApOworCQlwcmludGsoIkFSJTAyeD0lMDJ4ICIsaSxpbmIoMHgzYzEpKTsKKwkJaWYgKGklMTY9PTE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7CisKKwlpbmIoMHgzREEpOwkJCS8vIHJlc2V0IGludGVybmFsIGZsYWcgdG8gM2MwIGluZGV4CisJb3V0YigweDIwLDB4M0MwKTsJCS8vIGVuYWJsZSBhdHRyCisKKwlyZXR1cm47Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBTZXQgaGFyZHdhcmUgdG8gcmVxdWVzdGVkIHZpZGVvIG1vZGUKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgY3libGFmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBjeWJsYWZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXUzMgorCWh0b3RhbCxoZGlzcGVuZCxoc3luY3N0YXJ0LGhzeW5jZW5kLGhibGFua3N0YXJ0LGhibGFua2VuZCxwcmVlbmRmZXRjaCwKKwkJdnRvdGFsLHZkaXNwZW5kLHZzeW5jc3RhcnQsdnN5bmNlbmQsdmJsYW5rc3RhcnQsdmJsYW5rZW5kOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKKwlpbnQgYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpbnQgaTsKKworCWlmICh2ZXJib3NpdHkgPiAwKQorCQlvdXRwdXQoIlN3aXRjaGluZyB0byBuZXcgbW9kZTogIgorCQkgICAgICAgImZic2V0IC1nICVkICVkICVkICVkICVkIC10ICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkJdmFyLT54cmVzLHZhci0+eXJlcyx2YXItPnhyZXNfdmlydHVhbCwKKwkJCXZhci0+eXJlc192aXJ0dWFsLHZhci0+Yml0c19wZXJfcGl4ZWwsdmFyLT5waXhjbG9jaywKKwkJCXZhci0+bGVmdF9tYXJnaW4sdmFyLT5yaWdodF9tYXJnaW4sdmFyLT51cHBlcl9tYXJnaW4sCisJCQl2YXItPmxvd2VyX21hcmdpbix2YXItPmhzeW5jX2xlbix2YXItPnZzeW5jX2xlbik7CisKKwlodG90YWwgPSAodmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+cmlnaHRfbWFyZ2luICsKKwkJCQkJCSB2YXItPmhzeW5jX2xlbikgLyA4IC0gNTsKKwloZGlzcGVuZCA9IHZhci0+eHJlcy84IC0gMTsKKwloc3luY3N0YXJ0ID0gKHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luKS84OworCWhzeW5jZW5kID0gdmFyLT5oc3luY19sZW4vODsKKwloYmxhbmtzdGFydCA9IGhkaXNwZW5kICsgMTsKKwloYmxhbmtlbmQgPSBodG90YWwgKyAzOyAvLyBzaG91bGQgYmUgaHRvdGFsICsgNSwgYmlvcyBkb2VzIGl0IHRoaXMgd2F5CisJcHJlZW5kZmV0Y2ggPSAoKHZhci0+eHJlcyA+PiAzKSArIDEpICogKChicHArMSkgPj4gMyk7CisKKwl2dG90YWwgPSB2YXItPnlyZXMgKyB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+bG93ZXJfbWFyZ2luICsKKwkJCQkJCSB2YXItPnZzeW5jX2xlbiAtIDI7CisJdmRpc3BlbmQgPSB2YXItPnlyZXMgLSAxOworCXZzeW5jc3RhcnQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbjsKKwl2YmxhbmtzdGFydCA9IHZhci0+eXJlczsKKwl2YmxhbmtlbmQgPSB2dG90YWw7IC8vIHNob3VsZCBiZSB2dG90YWwgKyAyLCBidXQgYmlvcyBkb2VzIGl0IHRoaXMgd2F5CisJdnN5bmNlbmQgPSB2YXItPnZzeW5jX2xlbjsKKworCWVuYWJsZV9tbWlvKCk7CQkvLyBuZWNlc3NhcnkhIC4uLiBjaGVjayBYIC4uLgorCisJd3JpdGUzWDQoQ1IxMSxyZWFkM1g0KENSMTEpICYgMHg3Rik7IC8vIHVubG9jayBjcjAwIC4uIGNyMDcKKworCXdyaXRlM0NFKEdSMzAsOCk7CisKKwlpZiAoKGRpc3BsYXl0eXBlID09IERJU1BMQVlfRlApICYmIHZhci0+eHJlcyA8IG5hdGl2ZXgpIHsKKworCQkvLyBzdHJldGNoIG9yIGNlbnRlciA/CisKKwkJb3V0OCgweDNDMiwweEVCKTsKKworCQl3cml0ZTNDRShHUjMwLHJlYWQzQ0UoR1IzMCkgfCAweDgxKTsgLy8gc2hhZG93IG1vZGUgb24KKworCQlpZiAoY2VudGVyKSB7CisJCQl3cml0ZTNDRShHUjUyLChyZWFkM0NFKEdSNTIpICYgMHg3QykgfCAweDgwKTsKKwkJCXdyaXRlM0NFKEdSNTMsKHJlYWQzQ0UoR1I1MykgJiAweDdDKSB8IDB4ODApOworCQl9CisJCWVsc2UgaWYgKHN0cmV0Y2gpIHsKKwkJCXdyaXRlM0NFKEdSNUQsMCk7CisJCQl3cml0ZTNDRShHUjUyLChyZWFkM0NFKEdSNTIpICYgMHg3QykgfCAxKTsKKwkJCXdyaXRlM0NFKEdSNTMsKHJlYWQzQ0UoR1I1MykgJiAweDdDKSB8IDEpOworCQl9CisKKwl9IGVsc2UgeworCQlvdXQ4KDB4M0MyLDB4MkIpOworCQl3cml0ZTNDRShHUjMwLDgpOworCX0KKworCS8vCisJLy8gU2V0dXAgQ1J4eCByZWdzCisJLy8KKworCXdyaXRlM1g0KENSMDAsaHRvdGFsICYgMHhGRik7CisJd3JpdGUzWDQoQ1IwMSxoZGlzcGVuZCAmIDB4RkYpOworCXdyaXRlM1g0KENSMDIsaGJsYW5rc3RhcnQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjAzLGhibGFua2VuZCAmIDB4MUYpOworCXdyaXRlM1g0KENSMDQsaHN5bmNzdGFydCAmIDB4RkYpOworCXdyaXRlM1g0KENSMDUsKGhzeW5jZW5kICYgMHgxRikgfCAoKGhibGFua2VuZCAmIDB4MjApPDwyKSk7CisJd3JpdGUzWDQoQ1IwNix2dG90YWwgJiAweEZGKTsKKwl3cml0ZTNYNChDUjA3LCh2dG90YWwgJiAweDEwMCkgPj4gOCB8CisJCSAgICAgICh2ZGlzcGVuZCAmIDB4MTAwKSA+PiA3IHwKKwkJICAgICAgKHZzeW5jc3RhcnQgJiAweDEwMCkgPj4gNiB8CisJCSAgICAgICh2YmxhbmtzdGFydCAmIDB4MTAwKSA+PiA1IHwKKwkJICAgICAgMHgxMCB8CisJCSAgICAgICh2dG90YWwgJiAweDIwMCkgPj4gNCB8CisJCSAgICAgICh2ZGlzcGVuZCAmIDB4MjAwKSA+PiAzIHwKKwkJICAgICAgKHZzeW5jc3RhcnQgJiAweDIwMCkgPj4gMik7CisJd3JpdGUzWDQoQ1IwOCwwKTsKKwl3cml0ZTNYNChDUjA5LCh2YmxhbmtzdGFydCAmIDB4MjAwKSA+PiA0IHwgMHg0MCB8ICAvLyBGSVggISEhCisJCSAgICAgICgoaW5mby0+dmFyLnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKSA/IDB4ODAgOiAwKSk7CisJd3JpdGUzWDQoQ1IwQSwwKTsgIC8vIEluaXQgdG8gc29tZSByZWFzb25hYmxlIGRlZmF1bHQKKwl3cml0ZTNYNChDUjBCLDApOyAgLy8gSW5pdCB0byBzb21lIHJlYXNvbmFibGUgZGVmYXVsdAorCXdyaXRlM1g0KENSMEMsMCk7ICAvLyBPZmZzZXQgMAorCXdyaXRlM1g0KENSMEQsMCk7ICAvLyBPZmZzZXQgMAorCXdyaXRlM1g0KENSMEUsMCk7ICAvLyBJbml0IHRvIHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0CisJd3JpdGUzWDQoQ1IwRiwwKTsgIC8vIEluaXQgdG8gc29tZSByZWFzb25hYmxlIGRlZmF1bHQKKwl3cml0ZTNYNChDUjEwLHZzeW5jc3RhcnQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjExLCh2c3luY2VuZCAmIDB4MEYpKTsKKwl3cml0ZTNYNChDUjEyLHZkaXNwZW5kICYgMHhGRik7CisJd3JpdGUzWDQoQ1IxMywoKGluZm8tPnZhci54cmVzICogYnBwKS8oNCoxNikpICYgMHhGRik7CisJd3JpdGUzWDQoQ1IxNCwweDQwKTsgIC8vIGRvdWJsZSB3b3JkIG1vZGUKKwl3cml0ZTNYNChDUjE1LHZibGFua3N0YXJ0ICYgMHhGRik7CisJd3JpdGUzWDQoQ1IxNix2YmxhbmtlbmQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjE3LDB4QzMpOworCXdyaXRlM1g0KENSMTgsMHhGRik7CisJLy8JIENSMTk6IG5lZWRlZCBmb3IgaW50ZXJsYWNlZCBtb2RlcyAuLi4gaWdub3JlIGl0IGZvciBub3cKKwl3cml0ZTNYNChDUjFBLDB4MDcpOyAvLyBBcmJpdHJhdGlvbiBDb250cm9sIENvdW50ZXIgMQorCXdyaXRlM1g0KENSMUIsMHgwNyk7IC8vIEFyYml0cmF0aW9uIENvbnRyb2wgQ291bnRlciAyCisJd3JpdGUzWDQoQ1IxQywweDA3KTsgLy8gQXJiaXRyYXRpb24gQ29udHJvbCBDb3VudGVyIDMKKwl3cml0ZTNYNChDUjFELDB4MDApOyAvLyBEb24ndCBrbm93LCBkb2Vzbid0IGh1cnQgOy0pCisJd3JpdGUzWDQoQ1IxRSwoaW5mby0+dmFyLnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkgPyAweDg0IDogMHg4MCk7CisJLy8JIENSMUY6IGRvIG5vdCBzZXQsIGNvbnRhaW5zIEJJT1MgaW5mbyBhYm91dCBtZW1zaXplCisJd3JpdGUzWDQoQ1IyMCwweDIwKTsgLy8gZW5hYmUgd3IgYnVmLCBkaXNhYmxlIDE2Yml0IHBsYW5hciBtb2RlCisJd3JpdGUzWDQoQ1IyMSwweDIwKTsgLy8gZW5hYmxlIGxpbmVhciBtZW1vcnkgYWNjZXNzCisJLy8JIENSMjI6IFJPIGNwdSBsYXRjaCByZWFkYmFjaworCS8vCSBDUjIzOiA/Pz8KKwkvLwkgQ1IyNDogUk8gQVIgZmxhZyBzdGF0ZQorCS8vCSBDUjI1OiBSQU1EQUMgcncgdGltaW5nLCBwY2xrIGJ1ZmZlciB0cmlzdGF0ZSBjb250cm9sID8/Pz8KKwkvLwkgQ1IyNjogPz8/CisJd3JpdGUzWDQoQ1IyNywodmRpc3BlbmQgJiAweDQwMCkgPj4gNiB8CisJCSAgICAgICh2c3luY3N0YXJ0ICYgMHg0MDApID4+IDUgfAorCQkgICAgICAodmJsYW5rc3RhcnQgJiAweDQwMCkgPj4gNCB8CisJCSAgICAgICh2dG90YWwgJiAweDQwMCkgPj4gMyB8CisJCSAgICAgIDB4OCk7CisJLy8JIENSMjg6ID8/PworCXdyaXRlM1g0KENSMjksKHJlYWQzWDQoQ1IyOSkgJiAweENGKSB8CisJCSAgICAgICgoKChpbmZvLT52YXIueHJlcyAqIGJwcCkgLyAoNCoxNikpICYgMHgzMDApID4+NCkpOworCXdyaXRlM1g0KENSMkEscmVhZDNYNChDUjJBKSB8IDB4NDApOworCXdyaXRlM1g0KENSMkIsKGh0b3RhbCAmIDB4MTAwKSA+PiA4IHwKKwkJICAgICAgKGhkaXNwZW5kICYgMHgxMDApID4+IDcgfAorCQkgICAgICAvLyAoMHgwMCAmIDB4MTAwKSA+PiA2IHwJIGhpbnRlcmxhY2UgcGFyYSBiaXQgOCA/Pz8KKwkJICAgICAgKGhzeW5jc3RhcnQgJiAweDEwMCkgPj4gNSB8CisJCSAgICAgIChoYmxhbmtzdGFydCAmIDB4MTAwKSA+PiA0KTsKKwkvLwkgQ1IyQzogPz8/CisJLy8JIENSMkQ6IGluaXRpYWxpemVkIGluIGN5YmxhZmJfc2V0dXBfR0UoKQorCXdyaXRlM1g0KENSMkYsMHg5Mik7IC8vIGNvbnNlcnZhdGl2ZSwgYmV0dGVyIHNpZ25hbCBxdWFsaXR5CisJLy8JIENSMzA6IHJlc2VydmVkCisJLy8JIENSMzE6IHJlc2VydmVkCisJLy8JIENSMzI6IHJlc2VydmVkCisJLy8JIENSMzM6IHJlc2VydmVkCisJLy8JIENSMzQ6IGRpc2FibGVkIGluIENSMzYKKwkvLwkgQ1IzNTogZGlzYWJsZWQgaW4gQ1IzNgorCS8vCSBDUjM2OiBpbml0aWFsaXplZCBpbiBjeWJsYWZiX3NldHVwX0dFCisJLy8JIENSMzc6IGkyYywgaWdub3JlIGZvciBub3cKKwl3cml0ZTNYNChDUjM4LChicHAgPT0gOCkgPyAweDAwIDoJLy8KKwkJICAgICAgKGJwcCA9PSAxNikgPyAweDA1IDoJLy8gaGlnaGNvbG9yCisJCSAgICAgIChicHAgPT0gMjQpID8gMHgyOSA6CS8vIHBhY2tlZCAyNGJpdCB0cnVlY29sb3IKKwkJICAgICAgKGJwcCA9PSAzMikgPyAweDA5IDogMCk7CS8vIHRydWVjb2xvciwgMTYgYml0IHBpeGVsYnVzCisJd3JpdGUzWDQoQ1IzOSwweDAxIHwJCQkvLyBNTUlPIGVuYWJsZQorCQkgICAgICAocGNpcmIgPyAweDAyIDogMCkgfCAvLyBwY2kgcmVhZCBidXJzdCBlbmFibGUKKwkJICAgICAgKHBjaXdiID8gMHgwNCA6IDApKTsgLy8gcGNpIHdyaXRlIGJ1cnN0IGVuYWJsZQorCXdyaXRlM1g0KENSNTUsMHgxRiB8IC8vIHBjaSBjbG9ja3MgKiAyIGZvciBTVE9QIyBkdXJpbmcgMXN0IGRhdGEgcGhhc2UKKwkJICAgICAgKHBjaXJyID8gMHg0MCA6IDApIHwgLy8gcGNpIHJlYWQgcmV0cnkgZW5hYmxlCisJCSAgICAgIChwY2l3ciA/IDB4ODAgOiAwKSk7IC8vIHBjaSB3cml0ZSByZXRyeSBlbmFibGUKKwl3cml0ZTNYNChDUjU2LHByZWVuZGZldGNoID4+IDggPCAyID8gKHByZWVuZGZldGNoID4+IDggJiAweDAxKXwyIDogMCk7CisJd3JpdGUzWDQoQ1I1NyxwcmVlbmRmZXRjaCA+PiA4IDwgMiA/IHByZWVuZGZldGNoICYgMHhmZiA6IDApOworCXdyaXRlM1g0KENSNTgsMHg4Mik7CS8vIEJpb3MgZG9lcyB0aGlzIC4uLi4gZG9uJ3Qga25vdyBtb3JlCisJLy8KKwkvLyBTZXR1cCBTUnh4IHJlZ3MKKwkvLworCXdyaXRlM0M0KFNSMDAsMyk7CisJd3JpdGUzQzQoU1IwMSwxKTsJLy9zZXQgY2hhciBjbG9jayA4IGRvdHMgd2lkZQorCXdyaXRlM0M0KFNSMDIsMHgwRik7CS8vZW5hYmxlIDQgbWFwcyBuZWVkZWQgaW4gY2hhaW40IG1vZGUKKwl3cml0ZTNDNChTUjAzLDApOwkvL25vIGNoYXJhY3RlciBtYXAgc2VsZWN0CisJd3JpdGUzQzQoU1IwNCwweDBFKTsJLy9tZW1vcnkgbW9kZTogZXh0IG1lbSwgZXZlbiwgY2hhaW40CisKKwlvdXQ4KDB4M0M0LDB4MGIpOworCWluOCgweDNDNSk7CQkvLyBTZXQgTkVXIG1vZGUKKwl3cml0ZTNDNChTUjBELDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCisJc2V0X3ZjbGsocGFyLChicHA9PTMyID8gMjAwMDAwMDAwIDogMTAwMDAwMDAwKS8KKwkJIGluZm8tPnZhci5waXhjbG9jayk7IC8vU1IxOCxTUjE5CisKKwkvLworCS8vIFNldHVwIEdSeHggcmVncworCS8vCisJd3JpdGUzQ0UoR1IwMCwweDAwKTsJLy8gdGVzdCAuLi4gY2hlY2sKKwl3cml0ZTNDRShHUjAxLDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDIsMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisJd3JpdGUzQ0UoR1IwMywweDAwKTsJLy8gdGVzdCAuLi4gY2hlY2sKKwl3cml0ZTNDRShHUjA0LDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDUsMHg0MCk7CS8vIG5vIENHQSBjb21wYXQsYWxsb3cgMjU2IGNvbAorCXdyaXRlM0NFKEdSMDYsMHgwNSk7CS8vIGdyYXBoaWNzIG1vZGUKKwl3cml0ZTNDRShHUjA3LDB4MEYpOwkvLyBwbGFuZXM/CisJd3JpdGUzQ0UoR1IwOCwweEZGKTsJLy8gdGVzdCAuLi4gY2hlY2sKKwl3cml0ZTNDRShHUjBGLChicHA9PTMyKT8weDFBOjB4MTIpOyAvLyBkaXYgdmNsayBieSAyIGlmIDMyYnBwLCBjaGFpbjQKKwl3cml0ZTNDRShHUjIwLDB4QzApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMkYsMHhBMCk7CS8vIFBDTEsgPSBWQ0xLLCBubyBza2V3LAorCisJLy8KKwkvLyBTZXR1cCBBUnh4IHJlZ3MKKwkvLworCWZvcihpID0gMDtpIDwgMHgxMDtpKyspIC8vIHNldCBBUjAwIC4uIEFSMGYKKwkJd3JpdGUzQzAoaSxpKTsKKwl3cml0ZTNDMChBUjEwLDB4NDEpOwkvLyBncmFwaGljcyBtb2RlIGFuZCBzdXBwb3J0IDI1NiBjb2xvciBtb2RlcworCXdyaXRlM0MwKEFSMTIsMHgwRik7CS8vIHBsYW5lcworCXdyaXRlM0MwKEFSMTMsMCk7CS8vIGhvcml6b250YWwgcGVsIHBhbm5pbmcKKwlpbjgoMHgzREEpOwkJLy8gcmVzZXQgaW50ZXJuYWwgZmxhZyB0byAzYzAgaW5kZXgKKwlvdXQ4KDB4M0MwLDB4MjApOwkvLyBlbmFibGUgYXR0cgorCisJLy8KKwkvLyBTZXR1cCBoaWRkZW4gUkFNREFDIGNvbW1hbmQgcmVnaXN0ZXIKKwkvLworCWluOCgweDNDOCk7ICAvLyB0aGVzZSByZWFkcyBhcmUKKwlpbjgoMHgzQzYpOyAgLy8gbmVjZXNzYXJ5IHRvCisJaW44KDB4M0M2KTsgIC8vIHVubWFzayB0aGUgUkFNREFDCisJaW44KDB4M0M2KTsgIC8vIGNvbW1hbmQgcmVnLCBvdGhlcndpc2UKKwlpbjgoMHgzQzYpOyAgLy8gd2Ugd291bGQgd3JpdGUgdGhlIHBpeGVsbWFzayByZWchCisJb3V0OCgweDNDNiwoYnBwID09ICA4KSA/IDB4MDAgOiAJLy8gMjU2IGNvbG9ycworCQkgICAoYnBwID09IDE1KSA/IDB4MTAgOiAJLy8KKwkJICAgKGJwcCA9PSAxNikgPyAweDMwIDogCS8vIGhpY29sb3IKKwkJICAgKGJwcCA9PSAyNCkgPyAweEQwIDogCS8vIHRydWVjb2xvcgorCQkgICAoYnBwID09IDMyKSA/IDB4RDAgOiAwKTsJLy8gdHJ1ZWNvbG9yCisJaW44KDB4M0M4KTsKKworCS8vCisJLy8gR1IzMSBpcyBub3QgbWVudGlvbmVkIGluIHRoZSBkYXRhc2hlZXQKKwkvLworCWlmIChkaXNwbGF5dHlwZSA9PSBESVNQTEFZX0ZQKQorCQl3cml0ZTNDRShHUjMxLChyZWFkM0NFKEdSMzEpICYgMHg4RikgfAorCQkJICgoaW5mby0+dmFyLnlyZXMgPiAxMDI0KSA/IDB4NTAgOgorCQkJIChpbmZvLT52YXIueXJlcyA+ICAgNzY4KSA/IDB4MzAgOgorCQkJIChpbmZvLT52YXIueXJlcyA+ICAgNjAwKSA/IDB4MjAgOgorCQkJIChpbmZvLT52YXIueXJlcyA+ICAgNDgwKSA/IDB4MTAgOiAwKSk7CisKKwlpbmZvLT5maXgudmlzdWFsID0gKGJwcCA9PSA4KSA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUgorCQkJCSAgICAgIDogRkJfVklTVUFMX1RSVUVDT0xPUjsKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBpbmZvLT52YXIueHJlcyAqIChicHAgPj4gMyk7CisJaW5mby0+Y21hcC5sZW4gPSAoYnBwID09IDgpID8gMjU2OiAxNjsKKworCS8vCisJLy8gaW5pdCBhY2NlbGVyYXRpb24gZW5naW5lCisJLy8KKwljeWJsYWZiX3NldHVwX0dFKGluZm8tPnZhci54cmVzLGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CisKKwlyZWdkdW1wKHBhcik7CisKKwlyZXR1cm4gMDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBTZXQgb25lIGNvbG9yIHJlZ2lzdGVyCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBjeWJsYWZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKKwkJCSAgICAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLAorCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCisJaWYgKHJlZ25vID49IGluZm8tPmNtYXAubGVuKQorCQlyZXR1cm4gMTsKKworCWlmIChicHAgPT0gOCkgeworCQlvdXQ4KDB4M0M2LDB4RkYpOworCQlvdXQ4KDB4M0M4LHJlZ25vKTsKKwkJb3V0OCgweDNDOSxyZWQ+PjEwKTsKKwkJb3V0OCgweDNDOSxncmVlbj4+MTApOworCQlvdXQ4KDB4M0M5LGJsdWU+PjEwKTsKKworCX0gZWxzZSBpZiAoYnBwID09IDE2KQkJCQkvLyBSR0IgNTY1CisJCSgodTMyKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJCShyZWQgJiAweEY4MDApIHwKKwkJCSgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwKKwkJCSgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOworCWVsc2UgaWYgKGJwcCA9PSAzMikJCQkJLy8gQVJHQiA4ODg4CisJCSgodTMyKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJCSgodHJhbnNwICYgMHhGRjAwKSA8PDE2KSB8CisJCQkoKHJlZCAmIDB4RkYwMCkgPDwgOCkgfAorCQkJKChncmVlbiAmIDB4RkYwMCkpIHwKKwkJCSgoYmx1ZSAmIDB4RkYwMCk+PjgpOworCisJcmV0dXJuIDA7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRyeSBibGFua2luZyB0aGUgc2NyZWVuLiBGb3IgZmxhdCBwYW5lbHMgaXQgZG9lcyBub3RoaW5nCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgY3libGFmYl9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBQTUNvbnQsRFBNU0NvbnQ7CisKKwlpZiAoZGlzcGxheXR5cGUgPT0gRElTUExBWV9GUCkKKwkJcmV0dXJuIDA7CisKKwlvdXQ4KDB4ODNDOCwweDA0KTsgCQkvLyBEUE1TIENvbnRyb2wKKwlQTUNvbnQgPSBpbjgoMHg4M0M2KSAmIDB4RkM7CisKKwlEUE1TQ29udCA9IHJlYWQzQ0UoR1IyMykgJiAweEZDOworCisJc3dpdGNoIChibGFua19tb2RlKQorCXsKKwljYXNlIEZCX0JMQU5LX1VOQkxBTks6ICAgICAgIC8vIFNjcmVlbjogT24sIEhTeW5jOiBPbiwgVlN5bmM6IE9uCisJY2FzZSBGQl9CTEFOS19OT1JNQUw6CSAgICAgLy8gU2NyZWVuOiBPZmYsIEhTeW5jOiBPbiwgVlN5bmM6IE9uCisJCVBNQ29udCB8PSAweDAzOworCQlEUE1TQ29udCB8PSAweDAwOworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6IC8vIFNjcmVlbjogT2ZmLCBIU3luYzogT2ZmLCBWU3luYzogT24KKwkJUE1Db250IHw9IDB4MDI7CisJCURQTVNDb250IHw9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDogLy8gU2NyZWVuOiBPZmYsIEhTeW5jOiBPbiwgVlN5bmM6IE9mZgorCQlQTUNvbnQgfD0gMHgwMjsKKwkJRFBNU0NvbnQgfD0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046ICAgICAvLyBTY3JlZW46IE9mZiwgSFN5bmM6IE9mZiwgVlN5bmM6IE9mZgorCQlQTUNvbnQgfD0gMHgwMDsKKwkJRFBNU0NvbnQgfD0gMHgwMzsKKwkJYnJlYWs7CisJfQorCisJd3JpdGUzQ0UoR1IyMyxEUE1TQ29udCk7CisJb3V0OCgweDgzQzgsNCk7CisJb3V0OCgweDgzQzYsUE1Db250KTsKKwkvLworCS8vIGxldCBmYmNvbiBkbyBhIHNvZnRibGFuayBmb3IgdXMKKwkvLworCXJldHVybiAoYmxhbmtfbW9kZSA9PSBGQl9CTEFOS19OT1JNQUwpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIGN5YmxhZmJfb3BzIF9fZGV2aW5pdGRhdGEgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmZiX3NldGNvbHJlZyA9IGN5YmxhZmJfc2V0Y29scmVnLAorCS5mYl9wYW5fZGlzcGxheSA9IGN5YmxhZmJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rID0gY3libGFmYl9ibGFuaywKKwkuZmJfY2hlY2tfdmFyID0gY3libGFmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIgPSBjeWJsYWZiX3NldF9wYXIsCisJLmZiX2ZpbGxyZWN0ID0gY3libGFmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWE9IGN5YmxhZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IGN5YmxhZmJfaW1hZ2VibGl0LAorCS5mYl9jdXJzb3IgPSBzb2Z0X2N1cnNvciwKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBnZXRzdGFydHVwbW9kZSgpIGRlY2lkZXMgYWJvdXQgdGhlIGluaXRhbCB2aWRlbyBtb2RlCisvLworLy8gVGhlcmUgaXMgbm8gcmVhc29uIHRvIHVzZSBtb2RlZGIsIGEgbG90IG9mIHZpZGVvIG1vZGVzIHRoZXJlIHdvdWxkCisvLyBuZWVkIGFsdGVyZWQgdGltaW5ncyB0byBkaXNwbGF5IGNvcnJlY3RseS4gU28gSSBkZWNpZGVkIHRoYXQgaXQgaXMgbXVjaAorLy8gYmV0dGVyIHRvIHByb3ZpZGUgYSBsaW1pdGVkIG9wdGltaXplZCBzZXQgb2YgbW9kZXMgcGx1cyB0aGUgb3B0aW9uIG9mCisvLyB1c2luZyB0aGUgbW9kZSBpbiBlZmZlY3QgYXQgc3RhcnR1cCB0aW1lIChtaWdodCBiZSBzZWxlY3RlZCB1c2luZyB0aGUKKy8vIHZnYT0/Pz8gcGFyYW10ZXIpLiBBZnRlciB0aGF0IHRoZSB1c2VyIG1pZ2h0IHVzZSBmYnNldCB0byBzZWxlY3QgYW55CisvLyBtb2RlIGhlIGxpa2VzLCBjaGVja192YXIgd2lsbCBub3QgdHJ5IHRvIGFsdGVyIGdlb21ldHJ5IHBhcmFtZXRlcnMgYXMKKy8vIGl0IHdvdWxkIGJlIG5lY2Vzc2FyeSBvdGhlcndpc2UuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBnZXRzdGFydHVwbW9kZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwl1MzIJaHRvdGFsLGhkaXNwZW5kLGhzeW5jc3RhcnQsaHN5bmNlbmQsaGJsYW5rc3RhcnQsaGJsYW5rZW5kLAorCQl2dG90YWwsdmRpc3BlbmQsdnN5bmNzdGFydCx2c3luY2VuZCx2YmxhbmtzdGFydCx2YmxhbmtlbmQsCisJCWNyMDAsY3IwMSxjcjAyLGNyMDMsY3IwNCxjcjA1LGNyMmIsCisJCWNyMDYsY3IwNyxjcjA5LGNyMTAsY3IxMSxjcjEyLGNyMTUsY3IxNixjcjI3LAorCQljcjM4LAorCQlzcjBkLHNyMTgsc3IxOSwKKwkJZ3IwZiwKKwkJZmkscHhjbGtkaXYsdmNsa2Rpdix0bXAsaTsKKworCXN0cnVjdCBtb2R1cyB7CisJCWludCB4cmVzOyBpbnQgeXJlczsgaW50IHZ5cmVzOyBpbnQgYnBwOyBpbnQgcHhjbGs7CisJCWludCBsZWZ0X21hcmdpbjsgaW50IHJpZ2h0X21hcmdpbjsgaW50IHVwcGVyX21hcmdpbjsKKwkJaW50IGxvd2VyX21hcmdpbjsgaW50IGhzeW5jX2xlbjsgaW50IHZzeW5jX2xlbjsKKwl9ICBtb2RlZGJbNV0gPSB7CisJCXsgICAwLAkgIDAsIDgwMDAsIDAsIDAsICAgMCwgIDAsICAwLCAwLCAgIDAsICAwfSwKKwkJeyA2NDAsCTQ4MCwgMzc1NiwgMCwgMCwgLTQwLCAyNCwgMTcsIDAsIDIxNiwgIDN9LAorCQl7IDgwMCwJNjAwLCAzMjIxLCAwLCAwLCAgOTYsIDI0LCAxNCwgMCwgMTM2LCAxMX0sCisJCXsxMDI0LAk3NjgsIDI4MTUsIDAsIDAsIDE0NCwgMjQsIDI5LCAwLCAxMjAsICAzfSwKKwkJezEyODAsIDEwMjQsIDI2NjIsIDAsIDAsIDIzMiwgMTYsIDM5LCAwLCAxNjAsICAzfQorCX07CisKKwlvdXRiKDB4MDAsMHgzZDQpOyBjcjAwPWluYigweDNkNSk7IG91dGIoMHgwMSwweDNkNCk7IGNyMDE9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MDIsMHgzZDQpOyBjcjAyPWluYigweDNkNSk7IG91dGIoMHgwMywweDNkNCk7IGNyMDM9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MDQsMHgzZDQpOyBjcjA0PWluYigweDNkNSk7IG91dGIoMHgwNSwweDNkNCk7IGNyMDU9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MDYsMHgzZDQpOyBjcjA2PWluYigweDNkNSk7IG91dGIoMHgwNywweDNkNCk7IGNyMDc9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MDksMHgzZDQpOyBjcjA5PWluYigweDNkNSk7IG91dGIoMHgxMCwweDNkNCk7IGNyMTA9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MTEsMHgzZDQpOyBjcjExPWluYigweDNkNSk7IG91dGIoMHgxMiwweDNkNCk7IGNyMTI9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MTUsMHgzZDQpOyBjcjE1PWluYigweDNkNSk7IG91dGIoMHgxNiwweDNkNCk7IGNyMTY9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MjcsMHgzZDQpOyBjcjI3PWluYigweDNkNSk7IG91dGIoMHgyYiwweDNkNCk7IGNyMmI9aW5iKDB4M2Q1KTsKKwlvdXRiKDB4MzgsMHgzZDQpOyBjcjM4PWluYigweDNkNSk7IG91dGIoMHgwYiwweDNjNCk7IGluYigweDNjNSk7CisJb3V0YigweDBkLDB4M2M0KTsgc3IwZD1pbmIoMHgzYzUpOyBvdXRiKDB4MTgsMHgzYzQpOyBzcjE4PWluYigweDNjNSk7CisJb3V0YigweDE5LDB4M2M0KTsgc3IxOT1pbmIoMHgzYzUpOyBvdXRiKDB4MGYsMHgzY2UpOyBncjBmPWluYigweDNjZik7CisKKwlodG90YWwJICAgID0gY3IwMCB8IChjcjJiICYgMHgwMSkgPDwgODsKKwloZGlzcGVuZCAgICA9IGNyMDEgfCAoY3IyYiAmIDB4MDIpIDw8IDc7CisJaGJsYW5rc3RhcnQgPSBjcjAyIHwgKGNyMmIgJiAweDEwKSA8PCA0OworCWhibGFua2VuZCAgID0gKGNyMDMgJiAweDFmKSB8IChjcjA1ICYgMHg4MCkgPj4gMjsKKwloc3luY3N0YXJ0ICA9IGNyMDQgfCAoY3IyYiAmIDB4MDgpIDw8IDU7CisJaHN5bmNlbmQgICAgPSBjcjA1ICYgMHgxZjsKKworCW1vZGVkYlswXS54cmVzID0gaGJsYW5rc3RhcnQgKiA4OworCW1vZGVkYlswXS5oc3luY19sZW4gPSBoc3luY2VuZCAqIDg7CisJbW9kZWRiWzBdLnJpZ2h0X21hcmdpbiA9IGhzeW5jc3RhcnQgKiA4IC0gbW9kZWRiWzBdLnhyZXM7CisJbW9kZWRiWzBdLmxlZnRfbWFyZ2luID0gKGh0b3RhbCArIDUpICogOCAtIG1vZGVkYlswXS54cmVzIC0KKwkJbW9kZWRiWzBdLnJpZ2h0X21hcmdpbiAtIG1vZGVkYlswXS5oc3luY19sZW47CisKKwl2dG90YWwJICAgID0gY3IwNiB8IChjcjA3ICYgMHgwMSkgPDwgOCB8IChjcjA3ICYgMHgyMCkgPDwgNAorCQkJICAgfCAoY3IyNyAmIDB4ODApIDw8IDM7CisJdmRpc3BlbmQgICAgPSBjcjEyIHwgKGNyMDcgJiAweDAyKSA8PCA3IHwgKGNyMDcgJiAweDQwKSA8PCAzCisJCQkgICB8IChjcjI3ICYgMHgxMCkgPDwgNjsKKwl2c3luY3N0YXJ0ICA9IGNyMTAgfCAoY3IwNyAmIDB4MDQpIDw8IDYgfCAoY3IwNyAmIDB4ODApIDw8IDIKKwkJCSAgIHwgKGNyMjcgJiAweDIwKSA8PCA1OworCXZzeW5jZW5kICAgID0gY3IxMSAmIDB4MGY7CisJdmJsYW5rc3RhcnQgPSBjcjE1IHwgKGNyMDcgJiAweDA4KSA8PCA1IHwgKGNyMDkgJiAweDIwKSA8PCA0CisJCQkgICB8IChjcjI3ICYgMHg0MCkgPDwgNDsKKwl2YmxhbmtlbmQgICA9IGNyMTY7CisKKwltb2RlZGJbMF0ueXJlcwkgICAgICAgPSB2ZGlzcGVuZCArIDE7CisJbW9kZWRiWzBdLnZzeW5jX2xlbiAgICA9IHZzeW5jZW5kOworCW1vZGVkYlswXS5sb3dlcl9tYXJnaW4gPSB2c3luY3N0YXJ0IC0gbW9kZWRiWzBdLnlyZXM7CisJbW9kZWRiWzBdLnVwcGVyX21hcmdpbiA9IHZ0b3RhbCAtIG1vZGVkYlswXS55cmVzIC0KKwkJbW9kZWRiWzBdLmxvd2VyX21hcmdpbiAtIG1vZGVkYlswXS52c3luY19sZW4gKyAyOworCisJdG1wID0gY3IzOCAmIDB4M2M7CisJbW9kZWRiWzBdLmJwcCA9IHRtcCA9PSAwID8gOCA6IHRtcCA9PSA0ID8gMTYgOiB0bXAgPT0gMjggPyAyNCA6CisJCQl0bXAgPT0gOCA/IDMyIDogODsKKworCWZpID0gKCg1ODY0NzI3KihzcjE4KzgpKS8oKChzcjE5JjB4M2YpKzIpKigxPDwoKHNyMTkmMHhjMCk+PjYpKSkpPj4xMjsKKwlweGNsa2RpdiA9ICgoZ3IwZiAmIDB4MDgpID4+IDMgfCAoZ3IwZiAmIDB4NDApID4+IDUpICsgMTsKKwl0bXAgPSBzcjBkICYgMHgwNjsKKwl2Y2xrZGl2ID0gdG1wID09IDAgPyAyIDogdG1wID09IDIgPyA0IDogdG1wID09IDQgPyA4IDogMzsgLy8gKiAyICEKKwltb2RlZGJbMF0ucHhjbGsgPSAoKDEwMDAwMDAwMCAqIHB4Y2xrZGl2ICogdmNsa2RpdikgPj4gMSkgLyBmaTsKKworCWlmICh2ZXJib3NpdHkgPiAwKQorCQlvdXRwdXQoImRldGVjdGVkIHN0YXJ0dXAgbW9kZTogIgorCQkgICAgICAgImZic2V0IC1nICVkICVkICVkID8/PyAlZCAtdCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJICAgICAgIG1vZGVkYlswXS54cmVzLG1vZGVkYlswXS55cmVzLG1vZGVkYlswXS54cmVzLAorCQkgICAgICAgbW9kZWRiWzBdLmJwcCxtb2RlZGJbMF0ucHhjbGssbW9kZWRiWzBdLmxlZnRfbWFyZ2luLAorCQkgICAgICAgbW9kZWRiWzBdLnJpZ2h0X21hcmdpbixtb2RlZGJbMF0udXBwZXJfbWFyZ2luLAorCQkgICAgICAgbW9kZWRiWzBdLmxvd2VyX21hcmdpbixtb2RlZGJbMF0uaHN5bmNfbGVuLAorCQkgICAgICAgbW9kZWRiWzBdLnZzeW5jX2xlbik7CisKKwkvLworCS8vIFdlIHVzZSB0aGlzIGdvdG8gdGFyZ2V0IGluIGNhc2Ugb2YgYSBmYWlsZWQgY2hlY2tfdmFyLiBObywgSSByZWFsbHkKKwkvLyBkbyBub3Qgd2FudCB0byBkbyBpdCBpbiBhbm90aGVyIHdheSEKKwkvLworCisJdHJ5YWdhaW46CisKKwlpID0gKG1vZGUgPT0gTlVMTCkgPyAwIDoKKwkgICAgIXN0cm5jbXAobW9kZSwiNjQweDQ4MCIsNykgPyAxIDoKKwkgICAgIXN0cm5jbXAobW9kZSwiODAweDYwMCIsNykgPyAyIDoKKwkgICAgIXN0cm5jbXAobW9kZSwiMTAyNHg3NjgiLDgpID8gMyA6CisJICAgICFzdHJuY21wKG1vZGUsIjEyODB4MTAyNCIsOSkgPyA0IDogMDsKKworCXJlZiA9IChyZWYgPCA1MCkgPyA1MCA6IChyZWYgPiA4NSkgPyA4NSA6IHJlZjsKKworCWlmKGk9PTApIHsKKwkJaW5mby0+dmFyLnBpeGNsb2NrID0gbW9kZWRiW2ldLnB4Y2xrOworCQlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPSBtb2RlZGJbaV0uYnBwOworCX0gZWxzZSB7CisJCWluZm8tPnZhci5waXhjbG9jayA9ICgxMDAwMDAwMDAgLworCQkJKChtb2RlZGJbaV0ubGVmdF9tYXJnaW4gKyBtb2RlZGJbaV0ueHJlcyArCisJCQkgIG1vZGVkYltpXS5yaWdodF9tYXJnaW4gKyBtb2RlZGJbaV0uaHN5bmNfbGVuCisJCQkgKSAqICgKKwkJCSAgbW9kZWRiW2ldLnVwcGVyX21hcmdpbiArIG1vZGVkYltpXS55cmVzICsKKwkJCSAgbW9kZWRiW2ldLmxvd2VyX21hcmdpbiArIG1vZGVkYltpXS52c3luY19sZW4KKwkJCSApICoKKwkJCSAgcmVmIC8gMTAwMDAKKwkJCSkpOworCQlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPSBicHA7CisJfQorCisJaW5mby0+dmFyLmxlZnRfbWFyZ2luID0gbW9kZWRiW2ldLmxlZnRfbWFyZ2luOworCWluZm8tPnZhci5yaWdodF9tYXJnaW4gPSBtb2RlZGJbaV0ucmlnaHRfbWFyZ2luOworCWluZm8tPnZhci54cmVzID0gbW9kZWRiW2ldLnhyZXM7CisJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IG1vZGVkYltpXS54cmVzOworCWluZm8tPnZhci54b2Zmc2V0ID0gMDsKKwlpbmZvLT52YXIuaHN5bmNfbGVuID0gbW9kZWRiW2ldLmhzeW5jX2xlbjsKKwlpbmZvLT52YXIudXBwZXJfbWFyZ2luID0gbW9kZWRiW2ldLnVwcGVyX21hcmdpbjsKKwlpbmZvLT52YXIueXJlcyA9IG1vZGVkYltpXS55cmVzOworCWluZm8tPnZhci55cmVzX3ZpcnR1YWwgPSBtb2RlZGJbaV0udnlyZXM7CisJaW5mby0+dmFyLnlvZmZzZXQgPSAwOworCWluZm8tPnZhci5sb3dlcl9tYXJnaW4gPSBtb2RlZGJbaV0ubG93ZXJfbWFyZ2luOworCWluZm8tPnZhci52c3luY19sZW4gPSBtb2RlZGJbaV0udnN5bmNfbGVuOworCWluZm8tPnZhci5zeW5jID0gMDsKKwlpbmZvLT52YXIudm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCisJaWYoY3libGFmYl9jaGVja192YXIoJmluZm8tPnZhcixpbmZvKSkgeworCQkvLyA2NDB4NDgwLThANzUgc2hvdWxkIHJlYWxseSBuZXZlciBmYWlsLiBPbmUgY2FzZSB3b3VsZAorCQkvLyBiZSBmcCA9PSAxIGFuZCBuYXRpdmV4IDwgNjQwIC4uLiBnaXZlIHVwIHRoZW4KKwkJaWYoaT09MSAmJiBicHAgPT0gOCAmJiByZWYgPT0gNzUpeworCQkJb3V0cHV0KCJDYW4ndCBmaW5kIGEgdmFsaWQgbW9kZSA6LShcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLy8gT3VyIGRldGVjdGVkIG1vZGUgaXMgdW5saWtlbHkgdG8gZmFpbC4gSWYgaXQgZG9lcywKKwkJLy8gdHJ5IDY0MHg0ODAtOEA3NSAuLi4KKwkJaWYoaT09MCkgeworCQkJbW9kZT0iNjQweDQ4MCI7CisJCQlicHA9ODsKKwkJCXJlZj03NTsKKwkJCW91dHB1dCgiRGV0ZWN0ZWQgbW9kZSBmYWlsZWQgY2hlY2tfdmFyISAiCisJCQkgICAgICAgIlRyeWluZyA2NDB4NDgwLThANzVcbiIpOworCQkJZ290byB0cnlhZ2FpbjsKKwkJfQorCQkvLyBBIHNwZWNpZmllZCB2aWRlbyBtb2RlIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCisJCS8vIFRyeSB0aGUgc3RhcnR1cCBtb2RlIGZpcnN0CisJCW91dHB1dCgiU3BlY2lmaWVkIG1vZGUgJyVzJyBmYWlsZWQgY2hlY2shICIKKwkJCSJGYWxsaW5nIGJhY2sgdG8gc3RhcnR1cCBtb2RlLlxuIixtb2RlKTsKKwkJbW9kZT1OVUxMOworCQlnb3RvIHRyeWFnYWluOworCX0KKworCXJldHVybiAwOworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBEZXRlY3QgYWN0aXZhdGVkIG1lbW9yeSBzaXplLiBVbmRlZmluZWQgdmFsdWVzIHJlcXVpcmUKKy8vIG1lbXNpemUgcGFyYW1ldGVyLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgZ2V0X21lbXNpemUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwl1bnNpZ25lZCBpbnQgazsKKworCWlmIChtZW1zaXplKQorCQlrID0gbWVtc2l6ZSAqIEtiOworCWVsc2UgeworCQl0bXAgPSByZWFkM1g0KENSMUYpICYgMHgwRjsKKwkJc3dpdGNoICh0bXApIHsKKwkJCWNhc2UgMHgwMzogayA9IDEgKiBNYjsgYnJlYWs7CisJCQljYXNlIDB4MDc6IGsgPSAyICogTWI7IGJyZWFrOworCQkJY2FzZSAweDBGOiBrID0gNCAqIE1iOyBicmVhazsKKwkJCWNhc2UgMHgwNDogayA9IDggKiBNYjsgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWsgPSAxICogTWI7CisJCQkJb3V0cHV0KCJVbmtub3duIG1lbW9yeSBzaXplIGNvZGUgJXggaW4gQ1IxRi4iCisJCQkJICAgICAgICIgV2UgZGVmYXVsdCB0byAxIE1iIGZvciBub3csIHBsZWFzZSIKKwkJCQkgICAgICAgIiBkbyBwcm92aWRlIGEgbWVtc2l6ZSBwYXJhbWV0ZXIhXG4iLAorCQkJCSAgICAgICB0bXApOworCQl9CisJfQorCisJaWYgKHZlcmJvc2l0eSA+IDApCisJCW91dHB1dCgiZnJhbWVidWZmZXIgc2l6ZSA9ICVkIEtiXG4iLGsvS2IpOworCXJldHVybiBrOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIERldGVjdCBpZiBhIGZsYXQgcGFuZWwgbW9uaXRvciBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpYWwKKy8vIGludGVyZmFjZSBpcyBhY3RpdmUuIE92ZXJyaWRlIGlzIHBvc3NpYmxlIGJ5IGZwIGFuZCBjcnQKKy8vIHBhcmFtZXRlcnMuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgZ2V0X2Rpc3BsYXl0eXBlKHZvaWQpCit7CisJaWYgKGZwKQorCQlyZXR1cm4gRElTUExBWV9GUDsKKwlpZiAoY3J0KQorCQlyZXR1cm4gRElTUExBWV9DUlQ7CisJcmV0dXJuIChyZWFkM0NFKEdSMzMpICYgMHgxMCk/RElTUExBWV9GUDpESVNQTEFZX0NSVDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gR2V0IG5hdGl2ZSByZXNvbHV0aW9uIG9mIGZsYXQgcGFuZWwKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBfX2RldmluaXQgZ2V0X25hdGl2ZXgodm9pZCkKK3sKKwlpbnQgeCx5LHRtcDsKKworCWlmIChuYXRpdmV4KQorCQlyZXR1cm4gbmF0aXZleDsKKworCXRtcCA9IChyZWFkM0NFKEdSNTIpID4+IDQpICYgMzsKKworCXN3aXRjaCAodG1wKSB7CisJCWNhc2UgMDogIHggPSAxMjgwOyB5ID0gMTAyNDsgYnJlYWs7CisJCWNhc2UgMjogIHggPSAxMDI0OyB5ID0gNzY4OyAgYnJlYWs7CisJCWNhc2UgMzogIHggPSA4MDA7ICB5ID0gNjAwOyAgYnJlYWs7CisJCWNhc2UgNDogIHggPSAxNDAwOyB5ID0gMTA1MDsgYnJlYWs7CisJCWNhc2UgMToKKwkJZGVmYXVsdDogeCA9IDY0MDsgIHkgPSA0ODA7ICBicmVhazsKKwl9CisKKwlpZiAodmVyYm9zaXR5ID4gMCkKKwkJb3V0cHV0KCIlZHglZCBmbGF0IHBhbmVsIGZvdW5kXG4iLHgseSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN5YmxhX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqIGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICogaWQpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGN5YmxhZmJfcGFyICpwYXI7CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeWJsYWZiX3BhciksJmRldi0+ZGV2KTsKKworCWlmICghaW5mbykKKwkJZ290byBlcnJvdXRfYWxsb2M7CisKKwlwYXIgPSBpbmZvLT5wYXI7CisJcGFyLT5vcHMgPSBjeWJsYWZiX29wczsKKworCWluZm8tPmZpeCA9IGN5YmxhZmJfZml4OworCWluZm8tPmZib3BzID0gJnBhci0+b3BzOworCWluZm8tPmZpeCA9IGN5YmxhZmJfZml4OworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpIHsKKwkJb3V0cHV0KCJjb3VsZCBub3QgZW5hYmxlIGRldmljZSFcbiIpOworCQlnb3RvIGVycm91dF9lbmFibGU7CisJfQorCisJLy8gbWlnaHQgYWxyZWFkeSBiZSByZXF1ZXN0ZWQgYnkgdmdhIGNvbnNvbGUgb3IgdmVzYWZiLAorCS8vIHNvIHdlIGRvIGNhcmUgYWJvdXQgc3VjY2VzcworCXJlcXVlc3RfcmVnaW9uKDB4M2MwLDMyLCJjeWJsYWZiIik7CisKKwkvLworCS8vIEdyYXBoaWNzIEVuZ2luZSBSZWdpc3RlcnMKKwkvLworCXJlcXVlc3RfcmVnaW9uKEdFQmFzZSwweDEwMCwiY3libGFmYiIpOworCisJcmVnZHVtcChwYXIpOworCisJZW5hYmxlX21taW8oKTsKKworCS8vIHNldHVwIE1NSU8gcmVnaW9uCisJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LDEpOworCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4MjAwMDA7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCwKKwkJCQlpbmZvLT5maXgubW1pb19sZW4sImN5YmxhZmIiKSkgeworCQlvdXRwdXQoInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQgZm9yIG1taW8gcmVnaW9uIVxuIik7CisJCWdvdG8gZXJyb3V0X21taW9fcmVxbWVtOworCX0KKworCWlvX3ZpcnQgPSBpb3JlbWFwX25vY2FjaGUoaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7CisKKwlpZiAoIWlvX3ZpcnQpIHsKKwkJb3V0cHV0KCJpb3JlbWFwIGZhaWxlZCBmb3IgbW1pbyByZWdpb25cbiIpOworCQlnb3RvIGVycm91dF9tbWlvX3JlbWFwOworCX0KKworCS8vIHNldHVwIGZyYW1lYnVmZmVyIG1lbW9yeSAuLi4gbWlnaHQgYWxyZWFkeSBiZSByZXF1ZXN0ZWQKKwkvLyBieSB2ZXNhZmIuIE5vdCB0byBmYWlsIGluIGNhc2Ugb2YgYW4gdW5zdWNjZXNzZnVsIHJlcXVlc3QKKwkvLyBpcyB1c2VmdWwgZm9yIHRoZSBkZXZlbG9wbWVudCBjeWNsZQorCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwwKTsKKwlpbmZvLT5maXguc21lbV9sZW4gPSBnZXRfbWVtc2l6ZSgpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsCisJCQkJaW5mby0+Zml4LnNtZW1fbGVuLCJjeWJsYWZiIikpIHsKKwkJb3V0cHV0KCJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkIGZvciBzbWVtIHJlZ2lvbiFcbiIpOworCQlpZiAoIXZlc2FmYikKKwkJCWdvdG8gZXJyb3V0X3NtZW1fcmVxOworCX0KKworCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5zbWVtX3N0YXJ0LAorCQkJCQkgICAgaW5mby0+Zml4LnNtZW1fbGVuKTsKKworCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKKwkJb3V0cHV0KCJpb3JlbWFwIGZhaWxlZCBmb3Igc21lbSByZWdpb25cbiIpOworCQlnb3RvIGVycm91dF9zbWVtX3JlbWFwOworCX0KKworCWRpc3BsYXl0eXBlID0gZ2V0X2Rpc3BsYXl0eXBlKCk7CisKKwlpZihkaXNwbGF5dHlwZSA9PSBESVNQTEFZX0ZQKQorCQluYXRpdmV4ID0gZ2V0X25hdGl2ZXgoKTsKKworCS8vCisJLy8gRkJJTkZPX0hXQUNDRUxfWVdSQVAgICAgLi4uLiBkb2VzIG5vdCB3b3JrIChjb3VsZCBiZSBtYWRlIHRvIHdvcms/KQorCS8vIEZCSU5GT19QQVJUSUFMX1BBTl9PSyAgIC4uLi4gaXMgbm90IG9rCisJLy8gRkJJTkZPX1JFQURTX0ZBU1QJICAgLi4uLiBpcyBuZWNlc3NhcnkgZm9yIG9wdGltYWwgc2Nyb2xsaW5nCisJLy8KKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTgorCQkgICAgICB8IEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QKKwkJICAgICAgfCBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQgfCBGQklORk9fUkVBRFNfRkFTVDsKKworCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wc2V1ZG9fcGFsOworCisJaWYoZ2V0c3RhcnR1cG1vZGUoaW5mbykpCisJCWdvdG8gZXJyb3V0X2ZpbmRtb2RlOworCisJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwyNTYsMCk7CisKKwlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykpIHsKKwkJb3V0cHV0KCJDb3VsZCBub3QgcmVnaXN0ZXIgQ3lCbGEgZnJhbWVidWZmZXJcbiIpOworCQlnb3RvIGVycm91dF9yZWdpc3RlcjsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEoZGV2LGluZm8pOworCisJLy8KKwkvLyBub3JtYWwgZXhpdCBhbmQgZXJyb3IgcGF0aHMKKwkvLworCisJcmV0dXJuIDA7CisKKyBlcnJvdXRfcmVnaXN0ZXI6CisgZXJyb3V0X2ZpbmRtb2RlOgorCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworIGVycm91dF9zbWVtX3JlbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwKKwkJCSAgIGluZm8tPmZpeC5zbWVtX2xlbik7CisgZXJyb3V0X3NtZW1fcmVxOgorCWlvdW5tYXAoaW9fdmlydCk7CisgZXJyb3V0X21taW9fcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5tbWlvX3N0YXJ0LAorCQkJICAgaW5mby0+Zml4Lm1taW9fbGVuKTsKKyBlcnJvdXRfbW1pb19yZXFtZW06CisvLwlyZWxlYXNlX3JlZ2lvbigweDNjMCwzMik7CisgZXJyb3V0X2VuYWJsZToKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworIGVycm91dF9hbGxvYzoKKwlvdXRwdXQoIkN5YmxhRkIgdmVyc2lvbiAlcyBhYm9ydGluZyBpbml0LlxuIixWRVJTSU9OKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGN5YmxhX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwlpb3VubWFwKGlvX3ZpcnQpOworCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCxpbmZvLT5maXguc21lbV9sZW4pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCxpbmZvLT5maXgubW1pb19sZW4pOworCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwlvdXRwdXQoIkN5YmxhRkIgdmVyc2lvbiAlcyBub3JtYWwgZXhpdC5cbiIsVkVSU0lPTik7Cit9CisKKy8vCisvLyBMaXN0IG9mIGJvYXJkcyB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gc3VwcG9ydAorLy8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeWJsYV9kZXZpY2VzW10gPSB7CisJe1BDSV9WRU5ET1JfSURfVFJJREVOVCxDWUJFUkJMQURFaTEsUENJX0FOWV9JRCxQQ0lfQU5ZX0lELDAsMCwwfSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxjeWJsYV9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGN5YmxhZmJfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY3libGFmYiIsCisJLmlkX3RhYmxlCT0gY3libGFfZGV2aWNlcywKKwkucHJvYmUJCT0gY3libGFfcGNpX3Byb2JlLAorCS5yZW1vdmUgCT0gX19kZXZleGl0X3AoY3libGFfcGNpX3JlbW92ZSkKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIGtlcm5lbCBjb21tYW5kIGxpbmUgZXhhbXBsZToKKy8vCisvLwl2aWRlbz1jeWJsYWZiOjEyODB4MTAyNCxicHA9MTYscmVmPTUwIC4uLgorLy8KKy8vIG1vZHByb2JlIGNvbW1hbmQgbGluZSBleGFtcGxlOgorLy8KKy8vCW1vZHByb2JlIGN5YmxhZmIgbW9kZT0xMjgweDEwMjQgYnBwPTE2IHJlZj01MCAuLi4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludCBfX2RldmluaXQgY3libGFmYl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbnMgPSBOVUxMOworCWNoYXIgKm9wdDsKKworCWlmIChmYl9nZXRfb3B0aW9ucygiY3libGFmYiIsJm9wdGlvbnMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChvcHRpb25zICYmICpvcHRpb25zKQorCQl3aGlsZSgob3B0ID0gc3Ryc2VwKCZvcHRpb25zLCIsIikpICE9IE5VTEwgKSB7CisJCQlpZiAoISpvcHQpIGNvbnRpbnVlOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJicHA9Iiw0KSkKKwkJCQlicHAgPSBzaW1wbGVfc3RydG91bChvcHQrNCxOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJyZWY9Iiw0KSkKKwkJCQlyZWYgPSBzaW1wbGVfc3RydG91bChvcHQrNCxOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJmcCIsMikpCisJCQkJZGlzcGxheXR5cGUgPSBESVNQTEFZX0ZQOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJjcnQiLDMpKQorCQkJCWRpc3BsYXl0eXBlID0gRElTUExBWV9DUlQ7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsIm5hdGl2ZXg9Iiw4KSkKKwkJCQluYXRpdmV4ID0gc2ltcGxlX3N0cnRvdWwob3B0KzgsTlVMTCwwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwiY2VudGVyIiw2KSkKKwkJCQljZW50ZXIgPSAxOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJzdHJldGNoIiw3KSkKKwkJCQlzdHJldGNoID0gMTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwicGNpd2I9Iiw2KSkKKwkJCQlwY2l3YiA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs2LE5VTEwsMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsInBjaXJiPSIsNikpCisJCQkJcGNpcmIgPSBzaW1wbGVfc3RydG91bChvcHQrNixOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJwY2l3cj0iLDYpKQorCQkJCXBjaXdyID0gc2ltcGxlX3N0cnRvdWwob3B0KzYsTlVMTCwwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwicGNpcnI9Iiw2KSkKKwkJCQlwY2lyciA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs2LE5VTEwsMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsIm1lbXNpemU9Iiw4KSkKKwkJCQltZW1zaXplID0gc2ltcGxlX3N0cnRvdWwob3B0KzgsTlVMTCwwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwidmVyYm9zaXR5PSIsMTApKQorCQkJCXZlcmJvc2l0eSA9IHNpbXBsZV9zdHJ0b3VsKG9wdCsxMCxOVUxMLDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJ2ZXNhZmIiLDYpKQorCQkJCXZlc2FmYiA9IDE7CisJCQllbHNlCisJCQkJbW9kZSA9IG9wdDsKKwkJfQorI2VuZGlmCisJb3V0cHV0KCJDeWJsYUZCIHZlcnNpb24gJXMgaW5pdGlhbGl6aW5nXG4iLFZFUlNJT04pOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmN5YmxhZmJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjeWJsYWZiX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN5YmxhZmJfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGN5YmxhZmJfaW5pdCk7Cittb2R1bGVfZXhpdChjeWJsYWZiX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJLbnV0IFBldGVyc2VuIDxrbnV0X3BldGVyc2VuQHQtb25saW5lLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIEN5YmVyYmxhZGUvaTEgZ3JhcGhpY3MgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYmN2dC5jIGIvZHJpdmVycy92aWRlby9mYmN2dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTYxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMgLSBWRVNBKFRNKSBDb29yZGluYXRlZCBWaWRlbyBUaW1pbmdzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFudG9uaW5vIERhcGxhcyA8YWRhcGxhc0Bwb2wubmV0PgorICoKKyAqICAgICAgQmFzZWQgZnJvbSB0aGUgVkVTQShUTSkgQ29vcmRpbmF0ZWQgVmlkZW8gVGltaW5nIEdlbmVyYXRvciBieQorICogICAgICBHcmFoYW0gTG92ZXJpZGdlIEFwcmlsIDksIDIwMDMgYXZhaWxhYmxlIGF0CisgKiAgICAgIGh0dHA6Ly93d3cudmVzYS5vcmcvcHVibGljL0NWVC9DVlRkNnIxLnhscworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIEZCX0NWVF9DRUxMU0laRSAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRkJfQ1ZUX0dURl9DICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBGQl9DVlRfR1RGX0ogICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEZCX0NWVF9HVEZfSyAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgRkJfQ1ZUX0dURl9NICAgICAgICAgICAgICAgIDYwMAorI2RlZmluZSBGQl9DVlRfTUlOX1ZTWU5DX0JQICAgICAgICAgNTUwCisjZGVmaW5lIEZCX0NWVF9NSU5fVlBPUkNIICAgICAgICAgICAgIDMKKyNkZWZpbmUgRkJfQ1ZUX01JTl9CUE9SQ0ggICAgICAgICAgICAgNgorCisjZGVmaW5lIEZCX0NWVF9SQl9NSU5fVkJMQU5LICAgICAgICA0NjAKKyNkZWZpbmUgRkJfQ1ZUX1JCX0hCTEFOSyAgICAgICAgICAgIDE2MAorI2RlZmluZSBGQl9DVlRfUkJfVl9GUE9SQ0ggICAgICAgICAgICAzCisKKyNkZWZpbmUgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSyAxCisjZGVmaW5lIEZCX0NWVF9GTEFHX01BUkdJTlMgICAgICAgMgorI2RlZmluZSBGQl9DVlRfRkxBR19JTlRFUkxBQ0VEICAgIDQKKworc3RydWN0IGZiX2N2dF9kYXRhIHsKKwl1MzIgeHJlczsKKwl1MzIgeXJlczsKKwl1MzIgcmVmcmVzaDsKKwl1MzIgZl9yZWZyZXNoOworCXUzMiBwaXhjbG9jazsKKwl1MzIgaHBlcmlvZDsKKwl1MzIgaGJsYW5rOworCXUzMiBoZnJlcTsKKwl1MzIgaHRvdGFsOworCXUzMiB2dG90YWw7CisJdTMyIHZzeW5jOworCXUzMiBoc3luYzsKKwl1MzIgaF9mcm9udF9wb3JjaDsKKwl1MzIgaF9iYWNrX3BvcmNoOworCXUzMiB2X2Zyb250X3BvcmNoOworCXUzMiB2X2JhY2tfcG9yY2g7CisJdTMyIGhfbWFyZ2luOworCXUzMiB2X21hcmdpbjsKKwl1MzIgaW50ZXJsYWNlOworCXUzMiBhc3BlY3RfcmF0aW87CisJdTMyIGFjdGl2ZV9waXhlbHM7CisJdTMyIGZsYWdzOworCXUzMiBzdGF0dXM7Cit9OworCitzdGF0aWMgaW50IGZiX2N2dF92YmlfdGFiW10gPSB7CisJNCwgICAgICAgIC8qIDQ6MyAgICAgICovCisJNSwgICAgICAgIC8qIDE2OjkgICAgICovCisJNiwgICAgICAgIC8qIDE2OjEwICAgICovCisJNywgICAgICAgIC8qIDU6NCAgICAgICovCisJNywgICAgICAgIC8qIDE1OjkgICAgICovCisJOCwgICAgICAgIC8qIHJlc2VydmVkICovCisJOSwgICAgICAgIC8qIHJlc2VydmVkICovCisJMTAgICAgICAgIC8qIGN1c3RvbSAgICovCit9OworCisvKiByZXR1cm5zIGhwZXJpb2QgKiAxMDAwICovCitzdGF0aWMgdTMyIGZiX2N2dF9ocGVyaW9kKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiBudW0gPSAxMDAwMDAwMDAwL2N2dC0+Zl9yZWZyZXNoOworCXUzMiBkZW47CisKKwlpZiAoY3Z0LT5mbGFncyAmIEZCX0NWVF9GTEFHX1JFRFVDRURfQkxBTkspIHsKKwkJbnVtIC09IEZCX0NWVF9SQl9NSU5fVkJMQU5LICogMTAwMDsKKwkJZGVuID0gMiAqIChjdnQtPnlyZXMvY3Z0LT5pbnRlcmxhY2UgKyAyICogY3Z0LT52X21hcmdpbik7CisJfSBlbHNlIHsKKwkJbnVtIC09IEZCX0NWVF9NSU5fVlNZTkNfQlAgKiAxMDAwOworCQlkZW4gPSAyICogKGN2dC0+eXJlcy9jdnQtPmludGVybGFjZSArIGN2dC0+dl9tYXJnaW4gKiAyCisJCQkgICArIEZCX0NWVF9NSU5fVlBPUkNIICsgY3Z0LT5pbnRlcmxhY2UvMik7CisJfQorCisJcmV0dXJuIDIgKiAobnVtL2Rlbik7Cit9CisKKy8qIHJldHVybnMgaWRlYWwgZHV0eSBjeWNsZSAqIDEwMDAgKi8KK3N0YXRpYyB1MzIgZmJfY3Z0X2lkZWFsX2R1dHlfY3ljbGUoc3RydWN0IGZiX2N2dF9kYXRhICpjdnQpCit7CisJdTMyIGNfcHJpbWUgPSAoRkJfQ1ZUX0dURl9DIC0gRkJfQ1ZUX0dURl9KKSAqCisJCShGQl9DVlRfR1RGX0spICsgMjU2ICogRkJfQ1ZUX0dURl9KOworCXUzMiBtX3ByaW1lID0gKEZCX0NWVF9HVEZfSyAqIEZCX0NWVF9HVEZfTSk7CisJdTMyIGhfcGVyaW9kX2VzdCA9IGN2dC0+aHBlcmlvZDsKKworCXJldHVybiAoMTAwMCAqIGNfcHJpbWUgIC0gKChtX3ByaW1lICogaF9wZXJpb2RfZXN0KS8xMDAwKSkvMjU2OworfQorCitzdGF0aWMgdTMyIGZiX2N2dF9oYmxhbmsoc3RydWN0IGZiX2N2dF9kYXRhICpjdnQpCit7CisJdTMyIGhibGFuayA9IDA7CisKKwlpZiAoY3Z0LT5mbGFncyAmIEZCX0NWVF9GTEFHX1JFRFVDRURfQkxBTkspCisJCWhibGFuayA9IEZCX0NWVF9SQl9IQkxBTks7CisJZWxzZSB7CisJCXUzMiBpZGVhbF9kdXR5X2N5Y2xlID0gZmJfY3Z0X2lkZWFsX2R1dHlfY3ljbGUoY3Z0KTsKKwkJdTMyIGFjdGl2ZV9waXhlbHMgPSBjdnQtPmFjdGl2ZV9waXhlbHM7CisKKwkJaWYgKGlkZWFsX2R1dHlfY3ljbGUgPCAyMDAwMCkKKwkJCWhibGFuayA9IChhY3RpdmVfcGl4ZWxzICogMjAwMDApLworCQkJCSgxMDAwMDAgLSAyMDAwMCk7CisJCWVsc2UgeworCQkJaGJsYW5rID0gKGFjdGl2ZV9waXhlbHMgKiBpZGVhbF9kdXR5X2N5Y2xlKS8KKwkJCQkoMTAwMDAwIC0gaWRlYWxfZHV0eV9jeWNsZSk7CisJCX0KKwl9CisKKwloYmxhbmsgJj0gfigoMiAqIEZCX0NWVF9DRUxMU0laRSkgLSAxKTsKKworCXJldHVybiBoYmxhbms7Cit9CisKK3N0YXRpYyB1MzIgZmJfY3Z0X2hzeW5jKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiBoc3luYzsKKworCWlmIChjdnQtPmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykKKwkJaHN5bmMgPSAzMjsKKwllbHNlCisJCWhzeW5jID0gKEZCX0NWVF9DRUxMU0laRSAqIGN2dC0+aHRvdGFsKS8xMDA7CisKKwloc3luYyAmPSB+KEZCX0NWVF9DRUxMU0laRSAtIDEpOworCXJldHVybiBoc3luYzsKK30KKworc3RhdGljIHUzMiBmYl9jdnRfdmJpX2xpbmVzKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiB2YmlfbGluZXMsIG1pbl92YmlfbGluZXMsIGFjdF92YmlfbGluZXM7CisKKwlpZiAoY3Z0LT5mbGFncyAmIEZCX0NWVF9GTEFHX1JFRFVDRURfQkxBTkspIHsKKwkJdmJpX2xpbmVzID0gKDEwMDAgKiBGQl9DVlRfUkJfTUlOX1ZCTEFOSykvY3Z0LT5ocGVyaW9kICsgMTsKKwkJbWluX3ZiaV9saW5lcyA9ICBGQl9DVlRfUkJfVl9GUE9SQ0ggKyBjdnQtPnZzeW5jICsKKwkJCUZCX0NWVF9NSU5fQlBPUkNIOworCisJfSBlbHNlIHsKKwkJdmJpX2xpbmVzID0gKEZCX0NWVF9NSU5fVlNZTkNfQlAgKiAxMDAwKS9jdnQtPmhwZXJpb2QgKyAxICsKKwkJCSBGQl9DVlRfTUlOX1ZQT1JDSDsKKwkJbWluX3ZiaV9saW5lcyA9IGN2dC0+dnN5bmMgKyBGQl9DVlRfTUlOX0JQT1JDSCArCisJCQlGQl9DVlRfTUlOX1ZQT1JDSDsKKwl9CisKKwlpZiAodmJpX2xpbmVzIDwgbWluX3ZiaV9saW5lcykKKwkJYWN0X3ZiaV9saW5lcyA9IG1pbl92YmlfbGluZXM7CisJZWxzZQorCQlhY3RfdmJpX2xpbmVzID0gdmJpX2xpbmVzOworCisJcmV0dXJuIGFjdF92YmlfbGluZXM7Cit9CisKK3N0YXRpYyB1MzIgZmJfY3Z0X3Z0b3RhbChzdHJ1Y3QgZmJfY3Z0X2RhdGEgKmN2dCkKK3sKKwl1MzIgdnRvdGFsID0gY3Z0LT55cmVzL2N2dC0+aW50ZXJsYWNlOworCisJdnRvdGFsICs9IDIgKiBjdnQtPnZfbWFyZ2luICsgY3Z0LT5pbnRlcmxhY2UvMiArIGZiX2N2dF92YmlfbGluZXMoY3Z0KTsKKwl2dG90YWwgfD0gY3Z0LT5pbnRlcmxhY2UvMjsKKworCXJldHVybiB2dG90YWw7Cit9CisKK3N0YXRpYyB1MzIgZmJfY3Z0X3BpeGNsb2NrKHN0cnVjdCBmYl9jdnRfZGF0YSAqY3Z0KQoreworCXUzMiBwaXhjbG9jazsKKworCWlmIChjdnQtPmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykKKwkJcGl4Y2xvY2sgPSAoY3Z0LT5mX3JlZnJlc2ggKiBjdnQtPnZ0b3RhbCAqIGN2dC0+aHRvdGFsKS8xMDAwOworCWVsc2UKKwkJcGl4Y2xvY2sgPSAoY3Z0LT5odG90YWwgKiAxMDAwMDAwKS9jdnQtPmhwZXJpb2Q7CisKKwlwaXhjbG9jayAvPSAyNTA7CisJcGl4Y2xvY2sgKj0gMjUwOworCXBpeGNsb2NrICo9IDEwMDA7CisKKwlyZXR1cm4gcGl4Y2xvY2s7Cit9CisKK3N0YXRpYyB1MzIgZmJfY3Z0X2FzcGVjdF9yYXRpbyhzdHJ1Y3QgZmJfY3Z0X2RhdGEgKmN2dCkKK3sKKwl1MzIgeHJlcyA9IGN2dC0+eHJlczsKKwl1MzIgeXJlcyA9IGN2dC0+eXJlczsKKwl1MzIgYXNwZWN0ID0gLTE7CisKKwlpZiAoeHJlcyA9PSAoeXJlcyAqIDQpLzMgJiYgISgoeXJlcyAqIDQpICUgMykpCisJCWFzcGVjdCA9IDA7CisJZWxzZSBpZiAoeHJlcyA9PSAoeXJlcyAqIDE2KS85ICYmICEoKHlyZXMgKiAxNikgJSA5KSkKKwkJYXNwZWN0ID0gMTsKKwllbHNlIGlmICh4cmVzID09ICh5cmVzICogMTYpLzEwICYmICEoKHlyZXMgKiAxNikgJSAxMCkpCisJCWFzcGVjdCA9IDI7CisJZWxzZSBpZiAoeHJlcyA9PSAoeXJlcyAqIDUpLzQgJiYgISgoeXJlcyAqIDUpICUgNCkpCisJCWFzcGVjdCA9IDM7CisJZWxzZSBpZiAoeHJlcyA9PSAoeXJlcyAqIDE1KS85ICYmICEoKHlyZXMgKiAxNSkgJSA5KSkKKwkJYXNwZWN0ID0gNDsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmJjdnQ6IEFzcGVjdCByYXRpbyBub3QgQ1ZUICIKKwkJICAgICAgICJzdGFuZGFyZFxuIik7CisJCWFzcGVjdCA9IDc7CisJCWN2dC0+c3RhdHVzID0gMTsKKwl9CisKKwlyZXR1cm4gYXNwZWN0OworfQorCitzdGF0aWMgdm9pZCBmYl9jdnRfcHJpbnRfbmFtZShzdHJ1Y3QgZmJfY3Z0X2RhdGEgKmN2dCkKK3sKKwl1MzIgcGl4Y291bnQsIHBpeGNvdW50X21vZDsKKwlpbnQgY250ID0gMjU1LCBvZmZzZXQgPSAwLCByZWFkID0gMDsKKwl1OCAqYnVmID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOworCisJaWYgKCFidWYpCisJCXJldHVybjsKKworCW1lbXNldChidWYsIDAsIDI1Nik7CisJcGl4Y291bnQgPSAoY3Z0LT54cmVzICogKGN2dC0+eXJlcy9jdnQtPmludGVybGFjZSkpLzEwMDAwMDA7CisJcGl4Y291bnRfbW9kID0gKGN2dC0+eHJlcyAqIChjdnQtPnlyZXMvY3Z0LT5pbnRlcmxhY2UpKSAlIDEwMDAwMDA7CisJcGl4Y291bnRfbW9kIC89IDEwMDA7CisKKwlyZWFkID0gc25wcmludGYoYnVmK29mZnNldCwgY250LCAiZmJjdnQ6ICVkeCVkQCVkOiBDVlQgTmFtZSAtICIsCisJCQljdnQtPnhyZXMsIGN2dC0+eXJlcywgY3Z0LT5yZWZyZXNoKTsKKwlvZmZzZXQgKz0gcmVhZDsKKwljbnQgLT0gcmVhZDsKKworCWlmIChjdnQtPnN0YXR1cykKKwkJc25wcmludGYoYnVmK29mZnNldCwgY250LCAiTm90IGEgQ1ZUIHN0YW5kYXJkIC0gJWQuJTAzZCBNZWdhICIKKwkJCSAiUGl4ZWwgSW1hZ2VcbiIsIHBpeGNvdW50LCBwaXhjb3VudF9tb2QpOworCWVsc2UgeworCQlpZiAocGl4Y291bnQpIHsKKwkJCXJlYWQgPSBzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICIlZCIsIHBpeGNvdW50KTsKKwkJCWNudCAtPSByZWFkOworCQkJb2Zmc2V0ICs9IHJlYWQ7CisJCX0KKworCQlyZWFkID0gc25wcmludGYoYnVmK29mZnNldCwgY250LCAiLiUwM2RNIiwgcGl4Y291bnRfbW9kKTsKKwkJY250IC09IHJlYWQ7CisJCW9mZnNldCArPSByZWFkOworCisJCWlmIChjdnQtPmFzcGVjdF9yYXRpbyA9PSAwKQorCQkJcmVhZCA9IHNucHJpbnRmKGJ1ZitvZmZzZXQsIGNudCwgIjMiKTsKKwkJZWxzZSBpZiAoY3Z0LT5hc3BlY3RfcmF0aW8gPT0gMykKKwkJCXJlYWQgPSBzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICI0Iik7CisJCWVsc2UgaWYgKGN2dC0+YXNwZWN0X3JhdGlvID09IDEgfHwgY3Z0LT5hc3BlY3RfcmF0aW8gPT0gNCkKKwkJCXJlYWQgPSBzbnByaW50ZihidWYrb2Zmc2V0LCBjbnQsICI5Iik7CisJCWVsc2UgaWYgKGN2dC0+YXNwZWN0X3JhdGlvID09IDIpCisJCQlyZWFkID0gc25wcmludGYoYnVmK29mZnNldCwgY250LCAiQSIpOworCQllbHNlCisJCQlyZWFkID0gMDsKKwkJY250IC09IHJlYWQ7CisJCW9mZnNldCArPSByZWFkOworCisJCWlmIChjdnQtPmZsYWdzICYgRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSykgeworCQkJcmVhZCA9IHNucHJpbnRmKGJ1ZitvZmZzZXQsIGNudCwgIi1SIik7CisJCQljbnQgLT0gcmVhZDsKKwkJCW9mZnNldCArPSByZWFkOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGJ1Zik7CisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgZmJfY3Z0X2NvbnZlcnRfdG9fbW9kZShzdHJ1Y3QgZmJfY3Z0X2RhdGEgKmN2dCwKKwkJCQkgICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQoreworCW1vZGUtPnJlZnJlc2ggPSBjdnQtPmZfcmVmcmVzaDsKKwltb2RlLT5waXhjbG9jayA9IEtIWjJQSUNPUyhjdnQtPnBpeGNsb2NrLzEwMDApOworCW1vZGUtPmxlZnRfbWFyZ2luID0gY3Z0LT5oX2Zyb250X3BvcmNoOworCW1vZGUtPnJpZ2h0X21hcmdpbiA9IGN2dC0+aF9iYWNrX3BvcmNoOworCW1vZGUtPmhzeW5jX2xlbiA9IGN2dC0+aHN5bmM7CisJbW9kZS0+dXBwZXJfbWFyZ2luID0gY3Z0LT52X2Zyb250X3BvcmNoOworCW1vZGUtPmxvd2VyX21hcmdpbiA9IGN2dC0+dl9iYWNrX3BvcmNoOworCW1vZGUtPnZzeW5jX2xlbiA9IGN2dC0+dnN5bmM7CisKKwltb2RlLT5zeW5jICY9IH4oRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpOworCisJaWYgKGN2dC0+ZmxhZ3MgJiBGQl9DVlRfRkxBR19SRURVQ0VEX0JMQU5LKQorCQltb2RlLT5zeW5jIHw9IEZCX1NZTkNfSE9SX0hJR0hfQUNUOworCWVsc2UKKwkJbW9kZS0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Cit9CisKKy8qCisgKiBmYl9maW5kX21vZGVfY3Z0IC0gY2FsY3VsYXRlIG1vZGUgdXNpbmcgVkVTQShUTSkgQ1ZUCisgKiBAbW9kZTogcG9pbnRlciB0byBmYl92aWRlb21vZGU7IHhyZXMsIHlyZXMsIHJlZnJlc2ggYW5kIHZtb2RlIG11c3QgYmUKKyAqICAgICAgICBwcmUtZmlsbGVkIHdpdGggdGhlIGRlc2lyZWQgdmFsdWVzCisgKiBAbWFyZ2luczogYWRkIG1hcmdpbiB0byBjYWxjdWxhdGlvbiAoMS44JSBvZiB4cmVzIGFuZCB5cmVzKQorICogQHJiOiBjb21wdXRlIHdpdGggcmVkdWNlZCBibGFua2luZyAoZm9yIGZsYXRwYW5lbHMpCisgKgorICogUkVUVVJOUzoKKyAqIDAgZm9yIHN1Y2Nlc3MKKyAqIEBtb2RlIGlzIGZpbGxlZCB3aXRoIGNvbXB1dGVkIHZhbHVlcy4gIElmIGludGVybGFjZWQsIHRoZSByZWZyZXNoIGZpZWxkCisgKiB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBmaWVsZCByYXRlICgyeCB0aGUgZnJhbWUgcmF0ZSkKKyAqCisgKiBERVNDUklQVElPTjoKKyAqIENvbXB1dGVzIHZpZGVvIHRpbWluZ3MgdXNpbmcgVkVTQShUTSkgQ29vcmRpbmF0ZWQgVmlkZW8gVGltaW5ncworICovCitpbnQgZmJfZmluZF9tb2RlX2N2dChzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLCBpbnQgbWFyZ2lucywgaW50IHJiKQoreworCXN0cnVjdCBmYl9jdnRfZGF0YSBjdnQ7CisKKwltZW1zZXQoJmN2dCwgMCwgc2l6ZW9mKGN2dCkpOworCisJaWYgKG1hcmdpbnMpCisJICAgIGN2dC5mbGFncyB8PSBGQl9DVlRfRkxBR19NQVJHSU5TOworCisJaWYgKHJiKQorCSAgICBjdnQuZmxhZ3MgfD0gRkJfQ1ZUX0ZMQUdfUkVEVUNFRF9CTEFOSzsKKworCWlmIChtb2RlLT52bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQpCisJICAgIGN2dC5mbGFncyB8PSBGQl9DVlRfRkxBR19JTlRFUkxBQ0VEOworCisJY3Z0LnhyZXMgPSBtb2RlLT54cmVzOworCWN2dC55cmVzID0gbW9kZS0+eXJlczsKKwljdnQucmVmcmVzaCA9IG1vZGUtPnJlZnJlc2g7CisJY3Z0LmZfcmVmcmVzaCA9IGN2dC5yZWZyZXNoOworCWN2dC5pbnRlcmxhY2UgPSAxOworCisJaWYgKCFjdnQueHJlcyB8fCAhY3Z0LnlyZXMgfHwgIWN2dC5yZWZyZXNoKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZiY3Z0OiBJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShjdnQucmVmcmVzaCA9PSA1MCB8fCBjdnQucmVmcmVzaCA9PSA2MCB8fCBjdnQucmVmcmVzaCA9PSA3MCB8fAorCSAgICAgIGN2dC5yZWZyZXNoID09IDg1KSkgeworCQlwcmludGsoS0VSTl9JTkZPICJmYmN2dDogUmVmcmVzaCByYXRlIG5vdCBDVlQgIgorCQkgICAgICAgInN0YW5kYXJkXG4iKTsKKwkJY3Z0LnN0YXR1cyA9IDE7CisJfQorCisJY3Z0LnhyZXMgJj0gfihGQl9DVlRfQ0VMTFNJWkUgLSAxKTsKKworCWlmIChjdnQuZmxhZ3MgJiBGQl9DVlRfRkxBR19JTlRFUkxBQ0VEKSB7CisJCWN2dC5pbnRlcmxhY2UgPSAyOworCQljdnQuZl9yZWZyZXNoICo9IDI7CisJfQorCisJaWYgKGN2dC5mbGFncyAmIEZCX0NWVF9GTEFHX1JFRFVDRURfQkxBTkspIHsKKwkJaWYgKGN2dC5yZWZyZXNoICE9IDYwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJmYmN2dDogNjBIeiByZWZyZXNoIHJhdGUgIgorCQkJICAgICAgICJhZHZpc2VkIGZvciByZWR1Y2VkIGJsYW5raW5nXG4iKTsKKwkJCWN2dC5zdGF0dXMgPSAxOworCQl9CisJfQorCisJaWYgKGN2dC5mbGFncyAmIEZCX0NWVF9GTEFHX01BUkdJTlMpIHsKKwkJY3Z0LmhfbWFyZ2luID0gKGN2dC54cmVzICogMTgpLzEwMDA7CisJCWN2dC5oX21hcmdpbiAmPSB+KEZCX0NWVF9DRUxMU0laRSAtIDEpOworCQljdnQudl9tYXJnaW4gPSAoKGN2dC55cmVzL2N2dC5pbnRlcmxhY2UpKiAxOCkvMTAwMDsKKwl9CisKKwljdnQuYXNwZWN0X3JhdGlvID0gZmJfY3Z0X2FzcGVjdF9yYXRpbygmY3Z0KTsKKwljdnQuYWN0aXZlX3BpeGVscyA9IGN2dC54cmVzICsgMiAqIGN2dC5oX21hcmdpbjsKKwljdnQuaHBlcmlvZCA9IGZiX2N2dF9ocGVyaW9kKCZjdnQpOworCWN2dC52c3luYyA9IGZiX2N2dF92YmlfdGFiW2N2dC5hc3BlY3RfcmF0aW9dOworCWN2dC52dG90YWwgPSBmYl9jdnRfdnRvdGFsKCZjdnQpOworCWN2dC5oYmxhbmsgPSBmYl9jdnRfaGJsYW5rKCZjdnQpOworCWN2dC5odG90YWwgPSBjdnQuYWN0aXZlX3BpeGVscyArIGN2dC5oYmxhbms7CisJY3Z0LmhzeW5jID0gZmJfY3Z0X2hzeW5jKCZjdnQpOworCWN2dC5waXhjbG9jayA9IGZiX2N2dF9waXhjbG9jaygmY3Z0KTsKKwljdnQuaGZyZXEgPSBjdnQucGl4Y2xvY2svY3Z0Lmh0b3RhbDsKKwljdnQuaF9iYWNrX3BvcmNoID0gY3Z0LmhibGFuay8yICsgY3Z0LmhfbWFyZ2luOworCWN2dC5oX2Zyb250X3BvcmNoID0gY3Z0LmhibGFuayAtIGN2dC5oc3luYyAtIGN2dC5oX2JhY2tfcG9yY2ggKworCQkyICogY3Z0LmhfbWFyZ2luOworCWN2dC52X2JhY2tfcG9yY2ggPSAzICsgY3Z0LnZfbWFyZ2luOworCWN2dC52X2Zyb250X3BvcmNoID0gY3Z0LnZ0b3RhbCAtIGN2dC55cmVzL2N2dC5pbnRlcmxhY2UgLQorCSAgICBjdnQudl9iYWNrX3BvcmNoIC0gY3Z0LnZzeW5jOworCWZiX2N2dF9wcmludF9uYW1lKCZjdnQpOworCWZiX2N2dF9jb252ZXJ0X3RvX21vZGUoJmN2dCwgbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmJfZmluZF9tb2RlX2N2dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggNGZmODUzZi4uNzBiZTcwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtNjIsMTYgKzYyLDI2IEBACiAgKiBIZWxwZXJzCiAgKi8KIAotaW50IGZiX2dldF9jb2xvcl9kZXB0aChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK2ludCBmYl9nZXRfY29sb3JfZGVwdGgoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCSAgICAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKIHsKLQlpZiAodmFyLT5ncmVlbi5sZW5ndGggPT0gdmFyLT5ibHVlLmxlbmd0aCAmJgotCSAgICB2YXItPmdyZWVuLmxlbmd0aCA9PSB2YXItPnJlZC5sZW5ndGggJiYKLQkgICAgIXZhci0+Z3JlZW4ub2Zmc2V0ICYmICF2YXItPmJsdWUub2Zmc2V0ICYmCi0JICAgICF2YXItPnJlZC5vZmZzZXQpCi0JCXJldHVybiB2YXItPmdyZWVuLmxlbmd0aDsKLQllbHNlCi0JCXJldHVybiAodmFyLT5ncmVlbi5sZW5ndGggKyB2YXItPnJlZC5sZW5ndGggKwotCQkJdmFyLT5ibHVlLmxlbmd0aCk7CisJaW50IGRlcHRoID0gMDsKKworCWlmIChmaXgtPnZpc3VhbCA9PSBGQl9WSVNVQUxfTU9OTzAxIHx8CisJICAgIGZpeC0+dmlzdWFsID09IEZCX1ZJU1VBTF9NT05PMTApCisJCWRlcHRoID0gMTsKKwllbHNlIHsKKwkJaWYgKHZhci0+Z3JlZW4ubGVuZ3RoID09IHZhci0+Ymx1ZS5sZW5ndGggJiYKKwkJICAgIHZhci0+Z3JlZW4ubGVuZ3RoID09IHZhci0+cmVkLmxlbmd0aCAmJgorCQkgICAgdmFyLT5ncmVlbi5vZmZzZXQgPT0gdmFyLT5ibHVlLm9mZnNldCAmJgorCQkgICAgdmFyLT5ncmVlbi5vZmZzZXQgPT0gdmFyLT5yZWQub2Zmc2V0KQorCQkJZGVwdGggPSB2YXItPmdyZWVuLmxlbmd0aDsKKwkJZWxzZQorCQkJZGVwdGggPSB2YXItPmdyZWVuLmxlbmd0aCArIHZhci0+cmVkLmxlbmd0aCArCisJCQkJdmFyLT5ibHVlLmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gZGVwdGg7CiB9CiBFWFBPUlRfU1lNQk9MKGZiX2dldF9jb2xvcl9kZXB0aCk7CiAKQEAgLTgwLDE1ICs5MCw3IEBACiAgKi8KIHZvaWQgZmJfcGFkX2FsaWduZWRfYnVmZmVyKHU4ICpkc3QsIHUzMiBkX3BpdGNoLCB1OCAqc3JjLCB1MzIgc19waXRjaCwgdTMyIGhlaWdodCkKIHsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IGhlaWdodDsgaS0tOyApIHsKLQkJLyogc19waXRjaCBpcyBhIGZldyBieXRlcyBhdCB0aGUgbW9zdCwgbWVtY3B5IGlzIHN1Ym9wdGltYWwgKi8KLQkJZm9yIChqID0gMDsgaiA8IHNfcGl0Y2g7IGorKykKLQkJCWRzdFtqXSA9IHNyY1tqXTsKLQkJc3JjICs9IHNfcGl0Y2g7Ci0JCWRzdCArPSBkX3BpdGNoOwotCX0KKwlfX2ZiX3BhZF9hbGlnbmVkX2J1ZmZlcihkc3QsIGRfcGl0Y2gsIHNyYywgc19waXRjaCwgaGVpZ2h0KTsKIH0KIEVYUE9SVF9TWU1CT0woZmJfcGFkX2FsaWduZWRfYnVmZmVyKTsKIApAQCAtMjQ5LDEzICsyNTEsMTggQEAKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywgdTggKmRzdCwKIAkJCSAgICAgICBpbnQgZGVwdGgpCiB7Ci0JaW50IGksIGosIGssIGZnID0gMTsKKwlpbnQgaSwgaiwgazsKIAljb25zdCB1OCAqc3JjID0gbG9nby0+ZGF0YTsKLQl1OCBkLCB4b3IgPSAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfTU9OTzAxKSA/IDB4ZmYgOiAwOworCXU4IHhvciA9IChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9NT05PMDEpID8gMHhmZiA6IDA7CisJdTggZmcgPSAxLCBkOwogCi0JaWYgKGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKSA9PSAzKQorCWlmIChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCkgPT0gMykKIAkJZmcgPSA3OwogCisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX01PTk8wMSB8fAorCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9NT05PMTApCisJCWZnID0gfigodTgpICgweGZmZiA8PCBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoKSk7CisKIAlzd2l0Y2ggKGRlcHRoKSB7CiAJY2FzZSA0OgogCQlmb3IgKGkgPSAwOyBpIDwgbG9nby0+aGVpZ2h0OyBpKyspCkBAIC0zMTgsNyArMzI1LDcgQEAKIAogaW50IGZiX3ByZXBhcmVfbG9nbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpbnQgZGVwdGggPSBmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhcik7CisJaW50IGRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpOwogCiAJbWVtc2V0KCZmYl9sb2dvLCAwLCBzaXplb2Yoc3RydWN0IGxvZ29fZGF0YSkpOwogCkBAIC02ODQsMTEgKzY5MSwxMyBAQAogCiAJCQlpZiAoIWVyciAmJiAoZmxhZ3MgJiBGQklORk9fTUlTQ19VU0VSRVZFTlQpKSB7CiAJCQkJc3RydWN0IGZiX2V2ZW50IGV2ZW50OworCQkJCWludCBldm50ID0gKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9BTEwpID8KKwkJCQkJRkJfRVZFTlRfTU9ERV9DSEFOR0VfQUxMIDoKKwkJCQkJRkJfRVZFTlRfTU9ERV9DSEFOR0U7CiAKIAkJCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX01JU0NfVVNFUkVWRU5UOwogCQkJCWV2ZW50LmluZm8gPSBpbmZvOwotCQkJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJmZiX25vdGlmaWVyX2xpc3QsCi0JCQkJCQkgICAgRkJfRVZFTlRfTU9ERV9DSEFOR0UsCisJCQkJbm90aWZpZXJfY2FsbF9jaGFpbigmZmJfbm90aWZpZXJfbGlzdCwgZXZudCwKIAkJCQkJCSAgICAmZXZlbnQpOwogCQkJfQogCQl9CkBAIC0xMDEyLDYgKzEwMjEsNyBAQAogewogCWludCBpOwogCXN0cnVjdCBmYl9ldmVudCBldmVudDsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1vZGU7CiAKIAlpZiAobnVtX3JlZ2lzdGVyZWRfZmIgPT0gRkJfTUFYKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTA0MiwxNiArMTA1MiwxMSBAQAogCX0JCiAJZmJfaW5mby0+cGl4bWFwLm9mZnNldCA9IDA7CiAKLQlpZiAoIWZiX2luZm8tPm1vZGVsaXN0LnByZXYgfHwKLQkgICAgIWZiX2luZm8tPm1vZGVsaXN0Lm5leHQgfHwKLQkgICAgbGlzdF9lbXB0eSgmZmJfaW5mby0+bW9kZWxpc3QpKSB7Ci0JICAgICAgICBzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1vZGU7Ci0KKwlpZiAoIWZiX2luZm8tPm1vZGVsaXN0LnByZXYgfHwgIWZiX2luZm8tPm1vZGVsaXN0Lm5leHQpCiAJCUlOSVRfTElTVF9IRUFEKCZmYl9pbmZvLT5tb2RlbGlzdCk7Ci0JCWZiX3Zhcl90b192aWRlb21vZGUoJm1vZGUsICZmYl9pbmZvLT52YXIpOwotCQlmYl9hZGRfdmlkZW9tb2RlKCZtb2RlLCAmZmJfaW5mby0+bW9kZWxpc3QpOwotCX0KIAorCWZiX3Zhcl90b192aWRlb21vZGUoJm1vZGUsICZmYl9pbmZvLT52YXIpOworCWZiX2FkZF92aWRlb21vZGUoJm1vZGUsICZmYl9pbmZvLT5tb2RlbGlzdCk7CiAJcmVnaXN0ZXJlZF9mYltpXSA9IGZiX2luZm87CiAKIAlkZXZmc19ta19jZGV2KE1LREVWKEZCX01BSk9SLCBpKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYyBiL2RyaXZlcnMvdmlkZW8vZmJtb24uYwppbmRleCBjMjcxOGJiLi43MTMyMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CiAjaWZkZWYgQ09ORklHX1BQQ19PRgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CkBAIC0zMTMsMTEgKzMxNCwxMyBAQAogCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2FsY19tb2RlX3RpbWluZ3MoaW50IHhyZXMsIGludCB5cmVzLCBpbnQgcmVmcmVzaCwgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSkKK3N0YXRpYyB2b2lkIGNhbGNfbW9kZV90aW1pbmdzKGludCB4cmVzLCBpbnQgeXJlcywgaW50IHJlZnJlc2gsCisJCQkgICAgICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQogewogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJc3RydWN0IGZiX2luZm8gaW5mbzsKIAkKKwltZW1zZXQoJnZhciwgMCwgc2l6ZW9mKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbykpOwogCXZhci54cmVzID0geHJlczsKIAl2YXIueXJlcyA9IHlyZXM7CiAJZmJfZ2V0X21vZGUoRkJfVlNZTkNUSU1JTkdTIHwgRkJfSUdOT1JFTU9OLCAKQEAgLTEyNTEsOSArMTI1NCw0MSBAQAogCQktRUlOVkFMIDogMDsKIH0KIAorI2lmIGRlZmluZWQoX19pMzg2X18pCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKy8qCisgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBFRElEIGJsb2NrIGlzIG9ubHkgcmV0dXJuZWQgZm9yCisgKiB0aGUgcHJpbWFyeSBncmFwaGljcyBhZGFwdGVyLgorICovCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKmZiX2Zpcm13YXJlX2VkaWQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICplZGlkID0gTlVMTDsKKworCWlmIChkZXZpY2UpCisJCWRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKworCWlmIChkZXYpCisJCXJlcyA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCisJaWYgKHJlcyAmJiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fU0hBRE9XKQorCQllZGlkID0gZWRpZF9pbmZvLmR1bW15OworCisJcmV0dXJuIGVkaWQ7Cit9CisjZWxzZQorY29uc3QgdW5zaWduZWQgY2hhciAqZmJfZmlybXdhcmVfZWRpZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogX2kzODZfICovCisKIEVYUE9SVF9TWU1CT0woZmJfcGFyc2VfZWRpZCk7CiBFWFBPUlRfU1lNQk9MKGZiX2VkaWRfdG9fbW9uc3BlY3MpOwotCitFWFBPUlRfU1lNQk9MKGZiX2Zpcm13YXJlX2VkaWQpOwogRVhQT1JUX1NZTUJPTChmYl9nZXRfbW9kZSk7CiBFWFBPUlRfU1lNQk9MKGZiX3ZhbGlkYXRlX21vZGUpOwogRVhQT1JUX1NZTUJPTChmYl9kZXN0cm95X21vZGVkYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL0tjb25maWcKaW5kZXggYjA3NWZkMC4uNWE5Yjg5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvS2NvbmZpZwpAQCAtMywxNSArMywxMyBAQAogIwogY29uZmlnIEZCX0dFT0RFCiAJYm9vbCAiQU1EIEdlb2RlIGZhbWlseSBmcmFtZWJ1ZmZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gRkIgJiYgRVhQRVJJTUVOVEFMICYmIFg4NgorCWRlcGVuZHMgb24gRkIgJiYgUENJICYmIEVYUEVSSU1FTlRBTCAmJiBYODYKIAktLS1oZWxwLS0tCiAJICBTYXkgJ1knIGhlcmUgdG8gYWxsb3cgeW91IHRvIHNlbGVjdCBmcmFtZWJ1ZmZlciBkcml2ZXJzIGZvcgogCSAgdGhlIEFNRCBHZW9kZSBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KIAogY29uZmlnIEZCX0dFT0RFX0dYMQogCXRyaXN0YXRlICJBTUQgR2VvZGUgR1gxIGZyYW1lYnVmZmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiBGQl9HRU9ERSAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQpAQCAtMjEsOSArMTksNyBAQAogCSAgRnJhbWVidWZmZXIgZHJpdmVyIGZvciB0aGUgZGlzcGxheSBjb250cm9sbGVyIGludGVncmF0ZWQgaW50byB0aGUKIAkgIEFNRCBHZW9kZSBHWDEgcHJvY2Vzc29yLgogCi0JICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKLQkgIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4gVGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3gxZmIuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsCi0JICBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZ3gxZmIuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2Rpc3BsYXlfZ3gxLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2Rpc3BsYXlfZ3gxLmMKaW5kZXggZjQ5ODM4Ny4uOTI2ZDUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9kaXNwbGF5X2d4MS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZGlzcGxheV9neDEuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImdlb2RlZmIuaCIKICNpbmNsdWRlICJkaXNwbGF5X2d4MS5oIgogCi1zdGF0aWMgc3BpbmxvY2tfdCBneDFfY29uZl9yZWdfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3gxX2NvbmZfcmVnX2xvY2spOwogCiBzdGF0aWMgdTggZ3gxX3JlYWRfY29uZl9yZWcodTggcmVnKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9nZW9kZWZiLmggYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2dlb2RlZmIuaAppbmRleCBiN2JhYzBhLi5hZTA0ODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2dlb2RlZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2dlb2RlZmIuaApAQCAtMjksNyArMjksNiBAQAogCWludCBlbmFibGVfY3J0OwogCWludCBwYW5lbF94OyAvKiBkaW1lbnNpb25zIG9mIGFuIGF0dGFjaGVkIGZsYXQgcGFuZWwsIG5vbi16ZXJvID0+IGVuYWJsZSBwYW5lbCAqLwogCWludCBwYW5lbF95OwotCXN0cnVjdCBwY2lfZGV2ICp2aWRfZGV2OwogCXZvaWQgX19pb21lbSAqZGNfcmVnczsKIAl2b2lkIF9faW9tZW0gKnZpZF9yZWdzOwogCXN0cnVjdCBnZW9kZV9kY19vcHMgICpkY19vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jCmluZGV4IDgzODMwZDIuLjc0YTVmY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jCkBAIC0zMCw2ICszMCw2MiBAQAogc3RhdGljIGludCAgY3J0X29wdGlvbiA9IDE7CiBzdGF0aWMgY2hhciBwYW5lbF9vcHRpb25bMzJdID0gIiI7CiAKKy8qIE1vZGVzIHJlbGV2YW50IHRvIHRoZSBHWDEgKHRha2VuIGZyb20gbW9kZWRiLmMpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBfX2luaXRkYXRhIGd4MV9tb2RlZGJbXSA9IHsKKwkvKiA2NDB4NDgwLTYwIFZFU0EgKi8KKwl7IE5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk2ODIsICA0OCwgMTYsIDMzLCAxMCwgOTYsIDIsCisJICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiA2NDB4NDgwLTc1IFZFU0EgKi8KKwl7IE5VTEwsIDc1LCA2NDAsIDQ4MCwgMzE3NDYsIDEyMCwgMTYsIDE2LCAwMSwgNjQsIDMsCisJICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiA2NDB4NDgwLTg1IFZFU0EgKi8KKwl7IE5VTEwsIDg1LCA2NDAsIDQ4MCwgMjc3NzcsIDgwLCA1NiwgMjUsIDAxLCA1NiwgMywKKwkgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDgwMHg2MDAtNjAgVkVTQSAqLworCXsgTlVMTCwgNjAsIDgwMCwgNjAwLCAyNTAwMCwgODgsIDQwLCAyMywgMDEsIDEyOCwgNCwKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogODAweDYwMC03NSBWRVNBICovCisJeyBOVUxMLCA3NSwgODAwLCA2MDAsIDIwMjAyLCAxNjAsIDE2LCAyMSwgMDEsIDgwLCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiA4MDB4NjAwLTg1IFZFU0EgKi8KKwl7IE5VTEwsIDg1LCA4MDAsIDYwMCwgMTc3NjEsIDE1MiwgMzIsIDI3LCAwMSwgNjQsIDMsCisJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDEwMjR4NzY4LTYwIFZFU0EgKi8KKwl7IE5VTEwsIDYwLCAxMDI0LCA3NjgsIDE1Mzg0LCAxNjAsIDI0LCAyOSwgMywgMTM2LCA2LAorCSAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTAyNHg3NjgtNzUgVkVTQSAqLworCXsgTlVMTCwgNzUsIDEwMjQsIDc2OCwgMTI2OTAsIDE3NiwgMTYsIDI4LCAxLCA5NiwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTAyNHg3NjgtODUgVkVTQSAqLworCXsgTlVMTCwgODUsIDEwMjQsIDc2OCwgMTA1ODIsIDIwOCwgNDgsIDM2LCAxLCA5NiwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTI4MHg5NjAtNjAgVkVTQSAqLworCXsgTlVMTCwgNjAsIDEyODAsIDk2MCwgOTI1OSwgMzEyLCA5NiwgMzYsIDEsIDExMiwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTI4MHg5NjAtODUgVkVTQSAqLworCXsgTlVMTCwgODUsIDEyODAsIDk2MCwgNjczNCwgMjI0LCA2NCwgNDcsIDEsIDE2MCwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCisJLyogMTI4MHgxMDI0LTYwIFZFU0EgKi8KKwl7IE5VTEwsIDYwLCAxMjgwLCAxMDI0LCA5MjU5LCAyNDgsIDQ4LCAzOCwgMSwgMTEyLCAzLAorCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKKwkvKiAxMjgweDEwMjQtNzUgVkVTQSAqLworCXsgTlVMTCwgNzUsIDEyODAsIDEwMjQsIDc0MDcsIDI0OCwgMTYsIDM4LCAxLCAxNDQsIDMsCisJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAorCS8qIDEyODB4MTAyNC04NSBWRVNBICovCisJeyBOVUxMLCA4NSwgMTI4MCwgMTAyNCwgNjM0OSwgMjI0LCA2NCwgNDQsIDEsIDE2MCwgMywKKwkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCit9OworCiBzdGF0aWMgaW50IGd4MV9saW5lX2RlbHRhKGludCB4cmVzLCBpbnQgYnBwKQogewogCWludCBsaW5lX2RlbHRhID0geHJlcyAqIChicHAgPj4gMyk7CkBAIC00Nyw4ICsxMDMsNiBAQAogewogCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAkvKiBNYXhpbXVtIHJlc29sdXRpb24gaXMgMTI4MHgxMDI0LiAqLwogCWlmICh2YXItPnhyZXMgPiAxMjgwIHx8IHZhci0+eXJlcyA+IDEwMjQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ2LDQwICsyMDAsNDggQEAKIAlyZXR1cm4gcGFyLT52aWRfb3BzLT5ibGFua19kaXNwbGF5KGluZm8sIGJsYW5rX21vZGUpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBfX2luaXQgZ3gxZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1bnNpZ25lZCBneF9iYXNlOwogCWludCBmYl9sZW47CisJaW50IHJldDsKIAogCWd4X2Jhc2UgPSBneDFfZ3hfYmFzZSgpOwogCWlmICghZ3hfYmFzZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwYXItPnZpZF9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NZUklYLAotCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9WSURFTywgTlVMTCk7Ci0JaWYgKCFwYXItPnZpZF9kZXYpCi0JCXJldHVybiAtRU5PREVWOworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlwYXItPnZpZF9yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGFyLT52aWRfZGV2LCAxKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBhci0+dmlkX2RldiwgMSkpOworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDEsICJneDFmYiAodmlkZW8pIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCisJCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpKTsKIAlpZiAoIXBhci0+dmlkX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZ3hfYmFzZSArIDB4ODMwMCwgMHgxMDAsICJneDFmYiAoZGlzcGxheSBjb250cm9sbGVyKSIpKQorCQlyZXR1cm4gLUVCVVNZOwogCXBhci0+ZGNfcmVncyA9IGlvcmVtYXAoZ3hfYmFzZSArIDB4ODMwMCwgMHgxMDApOwogCWlmICghcGFyLT5kY19yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZ3hfYmFzZSArIDB4ODAwMDAwOworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsICJneDFmYiAoZnJhbWUgYnVmZmVyKSIpOworCWlmIChyZXQgPCAwICkKKwkJcmV0dXJuIC1FQlVTWTsKIAlpZiAoKGZiX2xlbiA9IGd4MV9mcmFtZV9idWZmZXJfc2l6ZSgpKSA8IDApCiAJCXJldHVybiAtRU5PTUVNOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CiAJaW5mby0+Zml4LnNtZW1fbGVuID0gZmJfbGVuOwogCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChpbmZvLT5maXguc21lbV9zdGFydCwgaW5mby0+Zml4LnNtZW1fbGVuKTsKIAlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlZCBLaWJ5dGUgb2YgdmlkZW8gbWVtb3J5IGF0IDB4JWx4XG4iLAotCSAgICAgICBpbmZvLT5maXguaWQsIGluZm8tPmZpeC5zbWVtX2xlbiAvIDEwMjQsIGluZm8tPmZpeC5zbWVtX3N0YXJ0KTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICIlZCBLaWJ5dGUgb2YgdmlkZW8gbWVtb3J5IGF0IDB4JWx4XG4iLAorCQkgaW5mby0+Zml4LnNtZW1fbGVuIC8gMTAyNCwgaW5mby0+Zml4LnNtZW1fc3RhcnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTYsMTMgKzI3OCwxMyBAQAogCS5mYl9jdXJzb3IJPSBzb2Z0X2N1cnNvciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqIF9faW5pdCBneDFmYl9pbml0X2ZiaW5mbyh2b2lkKQorc3RhdGljIHN0cnVjdCBmYl9pbmZvICogX19pbml0IGd4MWZiX2luaXRfZmJpbmZvKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAogCS8qIEFsbG9jIGVub3VnaCBzcGFjZSBmb3IgdGhlIHBzZXVkbyBwYWxldHRlLiAqLwotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGdlb2RlZmJfcGFyKSArIHNpemVvZih1MzIpICogMTYsIE5VTEwpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGdlb2RlZmJfcGFyKSArIHNpemVvZih1MzIpICogMTYsIGRldik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMjU1LDQ3ICszMTcsMzcgQEAKIAkvKiBDUlQgYW5kIHBhbmVsIG9wdGlvbnMgKi8KIAlwYXItPmVuYWJsZV9jcnQgPSBjcnRfb3B0aW9uOwogCWlmIChwYXJzZV9wYW5lbF9vcHRpb24oaW5mbykgPCAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCAncGFuZWwnIG9wdGlvbiAtLSBkaXNhYmxpbmcgZmxhdCBwYW5lbFxuIiwKLQkJICAgICAgIGluZm8tPmZpeC5pZCk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImd4MWZiOiBpbnZhbGlkICdwYW5lbCcgb3B0aW9uIC0tIGRpc2FibGluZyBmbGF0IHBhbmVsXG4iKTsKIAlpZiAoIXBhci0+cGFuZWxfeCkKIAkJcGFyLT5lbmFibGVfY3J0ID0gMTsgLyogZmFsbCBiYWNrIHRvIENSVCBpZiBubyBwYW5lbCBpcyBzcGVjaWZpZWQgKi8KIAogCXJldHVybiBpbmZvOwogfQogCi0KLXN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqZ3gxZmJfaW5mbzsKLQotc3RhdGljIGludCBfX2luaXQgZ3gxZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZ3gxZmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKLSAgICAgICAgc3RydWN0IGdlb2RlZmJfcGFyICpwYXI7CiAJaW50IHJldDsKIAotI2lmbmRlZiBNT0RVTEUKLQlpZiAoZmJfZ2V0X29wdGlvbnMoImd4MWZiIiwgTlVMTCkpCi0JCXJldHVybiAtRU5PREVWOwotI2VuZGlmCi0KLQlpbmZvID0gZ3gxZmJfaW5pdF9mYmluZm8oKTsKKwlpbmZvID0gZ3gxZmJfaW5pdF9mYmluZm8oJnBkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQlneDFmYl9pbmZvID0gaW5mbzsKLQogCXBhciA9IGluZm8tPnBhcjsKIAogCS8qIEdYMSBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIENTNTUzMCB2aWRlbyBkZXZpY2UgKi8KIAlwYXItPmRjX29wcyAgPSAmZ3gxX2RjX29wczsKIAlwYXItPnZpZF9vcHMgPSAmY3M1NTMwX3ZpZF9vcHM7CiAKLQlpZiAoKHJldCA9IGd4MWZiX21hcF92aWRlb19tZW1vcnkoaW5mbykpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KCkgZmFpbGVkXG4iLCBpbmZvLT5maXguaWQpOworCWlmICgocmV0ID0gZ3gxZmJfbWFwX3ZpZGVvX21lbW9yeShpbmZvLCBwZGV2KSkgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgZnJhbWUgYnVmZmVyIG9yIGNvbnRyb2xsZXIgcmVnaXN0ZXJzXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGVfb3B0aW9uLCBOVUxMLCAwLCBOVUxMLCAxNik7CisJcmV0ID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGVfb3B0aW9uLAorCQkJICAgZ3gxX21vZGVkYiwgQVJSQVlfU0laRShneDFfbW9kZWRiKSwgTlVMTCwgMTYpOwogCWlmIChyZXQgPT0gMCB8fCByZXQgPT0gNCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgZmluZCB2YWxpZCB2aWRlbyBtb2RlXG4iLCBpbmZvLT5maXguaWQpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZmluZCB2YWxpZCB2aWRlbyBtb2RlXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQpAQCAtMzEwLDM5ICszNjIsODMgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKIAlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLCBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQpOwogCXJldHVybiAwOwogCiAgIGVycjoKLQlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCisJaWYgKGluZm8tPnNjcmVlbl9iYXNlKSB7CiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwotCWlmIChwYXItPnZpZF9yZWdzKQorCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJfQorCWlmIChwYXItPnZpZF9yZWdzKSB7CiAJCWlvdW5tYXAocGFyLT52aWRfcmVncyk7Ci0JaWYgKHBhci0+ZGNfcmVncykKKwkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDEpOworCX0KKwlpZiAocGFyLT5kY19yZWdzKSB7CiAJCWlvdW5tYXAocGFyLT5kY19yZWdzKTsKLQlpZiAocGFyLT52aWRfZGV2KQotCQlwY2lfZGV2X3B1dChwYXItPnZpZF9kZXYpOworCQlyZWxlYXNlX21lbV9yZWdpb24oZ3gxX2d4X2Jhc2UoKSArIDB4ODMwMCwgMHgxMDApOworCX0KKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwogCWlmIChpbmZvKQogCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBneDFmYl9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBneDFmYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmluZm8gPSBneDFmYl9pbmZvOwotCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyID0gZ3gxZmJfaW5mby0+cGFyOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBnZW9kZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAogCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWluZm8tPnNjcmVlbl9iYXNlKTsKLQlpb3VubWFwKHBhci0+dmlkX3JlZ3MpOwotCWlvdW5tYXAocGFyLT5kY19yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CiAKLQlwY2lfZGV2X3B1dChwYXItPnZpZF9kZXYpOworCWlvdW5tYXAocGFyLT52aWRfcmVncyk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDEpOworCisJaW91bm1hcChwYXItPmRjX3JlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihneDFfZ3hfYmFzZSgpICsgMHg4MzAwLCAweDEwMCk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGd4MWZiX2lkX3RhYmxlW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfVklERU8sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZIDw8IDE2LAorCSAgMHhmZjAwMDAsIDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBneDFmYl9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBneDFmYl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImd4MWZiIiwKKwkuaWRfdGFibGUJPSBneDFmYl9pZF90YWJsZSwKKwkucHJvYmUJCT0gZ3gxZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBneDFmYl9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBneDFmYl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWlmIChmYl9nZXRfb3B0aW9ucygiZ3gxZmIiLCBOVUxMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZ3gxZmJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGd4MWZiX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmd4MWZiX2RyaXZlcik7Cit9CisKIG1vZHVsZV9pbml0KGd4MWZiX2luaXQpOwogbW9kdWxlX2V4aXQoZ3gxZmJfY2xlYW51cCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvdmlkZW9fY3M1NTMwLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL3ZpZGVvX2NzNTUzMC5jCmluZGV4IGQzNzY0YWMuLjY0OWMzOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvdmlkZW9fY3M1NTMwLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS92aWRlb19jczU1MzAuYwpAQCAtNjksOCArNjksNiBAQAogCXsgIDQzMTAsIDB4MkZCMUI4MDIsIH0sIC8qIDIzMi4wMDAwICovCiB9OwogCi0jZGVmaW5lIE5VTV9DUzU1MzBfRlJFUVVFTkNJRVMgc2l6ZW9mKGNzNTUzMF9wbGxfdGFibGUpL3NpemVvZihzdHJ1Y3QgY3M1NTMwX3BsbF9lbnRyeSkKLQogc3RhdGljIHZvaWQgY3M1NTMwX3NldF9kY2xrX2ZyZXF1ZW5jeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKQEAgLTgyLDcgKzgwLDcgQEAKIAl2YWx1ZSA9IGNzNTUzMF9wbGxfdGFibGVbMF0ucGxsX3ZhbHVlOwogCW1pbiA9IGNzNTUzMF9wbGxfdGFibGVbMF0ucGl4Y2xvY2sgLSBpbmZvLT52YXIucGl4Y2xvY2s7CiAJaWYgKG1pbiA8IDApIG1pbiA9IC1taW47Ci0JZm9yIChpID0gMTsgaSA8IE5VTV9DUzU1MzBfRlJFUVVFTkNJRVM7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKGNzNTUzMF9wbGxfdGFibGUpOyBpKyspIHsKIAkJZGlmZiA9IGNzNTUzMF9wbGxfdGFibGVbaV0ucGl4Y2xvY2sgLSBpbmZvLT52YXIucGl4Y2xvY2s7CiAJCWlmIChkaWZmIDwgMEwpIGRpZmYgPSAtZGlmZjsKIAkJaWYgKGRpZmYgPCBtaW4pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vaTgxMC9NYWtlZmlsZQppbmRleCA3OTRhZTc2Li45NmUwOGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9pODEwL01ha2VmaWxlCkBAIC00LDcgKzQsNiBAQAogCiBvYmotJChDT05GSUdfRkJfSTgxMCkJCSs9IGk4MTBmYi5vCiAKLQogaTgxMGZiLW9ianMgICAgICAgICAgICAgICAgICAgICA6PSBpODEwX21haW4ubyBpODEwX2FjY2VsLm8KIAogaWZkZWYgQ09ORklHX0ZCX0k4MTBfR1RGCkBAIC0xMiwzICsxMSw3IEBACiBlbHNlCiBpODEwZmItb2JqcyAgICAgICAgICAgICAgICAgICAgICs9IGk4MTBfZHZ0Lm8KIGVuZGlmCisKK2lmZGVmIENPTkZJR19GQl9JODEwX0kyQworaTgxMGZiLW9ianMgKz0gaTgxMC1pMmMubworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLWkyYy5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhNTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLWkyYy5jCkBAIC0wLDAgKzEsMjU3IEBACisgLyotKi0gbGludXgtYyAtKi0KKyAqICBsaW51eC9kcml2ZXJzL3ZpZGVvL2k4MTAtaTJjLmMgLS0gSW50ZWwgODEwLzgxNSBJMkMgc3VwcG9ydAorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uaW5vIERhcGxhczxhZGFwbGFzQHBvbC5uZXQ+CisgKiAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgImk4MTAuaCIKKyNpbmNsdWRlICJpODEwX3JlZ3MuaCIKKyNpbmNsdWRlICIuLi9lZGlkLmgiCisKKyNkZWZpbmUgSTgxMF9EREMgMHg1MAorLyogYml0IGxvY2F0aW9ucyBpbiB0aGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNDTF9ESVJfTUFTSwkJMHgwMDAxCisjZGVmaW5lIFNDTF9ESVIJCQkweDAwMDIKKyNkZWZpbmUgU0NMX1ZBTF9NQVNLCQkweDAwMDQKKyNkZWZpbmUgU0NMX1ZBTF9PVVQJCTB4MDAwOAorI2RlZmluZSBTQ0xfVkFMX0lOCQkweDAwMTAKKyNkZWZpbmUgU0RBX0RJUl9NQVNLCQkweDAxMDAKKyNkZWZpbmUgU0RBX0RJUgkJCTB4MDIwMAorI2RlZmluZSBTREFfVkFMX01BU0sJCTB4MDQwMAorI2RlZmluZSBTREFfVkFMX09VVAkJMHgwODAwCisjZGVmaW5lIFNEQV9WQUxfSU4JCTB4MTAwMAorCisjZGVmaW5lIERFQlVHICAvKiBkZWZpbmUgdGhpcyBmb3IgdmVyYm9zZSBFRElEIHBhcnNpbmcgb3V0cHV0ICovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJpbnRrKGZtdCwjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgaTgxMGkyY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgICpjaGFuID0gKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKilkYXRhOworICAgICAgICBzdHJ1Y3QgaTgxMGZiX3BhciAgICAgICAgICpwYXIgPSBjaGFuLT5wYXI7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOworCisJaTgxMF93cml0ZWwobW1pbywgR1BJT0IsIChzdGF0ZSA/IFNDTF9WQUxfT1VUIDogMCkgfCBTQ0xfRElSIHwKKwkJICAgIFNDTF9ESVJfTUFTSyB8IFNDTF9WQUxfTUFTSyk7CisJaTgxMF9yZWFkbChtbWlvLCBHUElPQik7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgdm9pZCBpODEwaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKyAJaTgxMF93cml0ZWwobW1pbywgR1BJT0IsIChzdGF0ZSA/IFNEQV9WQUxfT1VUIDogMCkgfCBTREFfRElSIHwKKwkJICAgIFNEQV9ESVJfTUFTSyB8IFNEQV9WQUxfTUFTSyk7CisJaTgxMF9yZWFkbChtbWlvLCBHUElPQik7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgaW50IGk4MTBpMmNfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CisKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQiwgU0NMX0RJUl9NQVNLKTsKKwlpODEwX3dyaXRlbChtbWlvLCBHUElPQiwgMCk7CisJcmV0dXJuICgwICE9IChpODEwX3JlYWRsKG1taW8sIEdQSU9CKSAmIFNDTF9WQUxfSU4pKTsKK30KKworc3RhdGljIGludCBpODEwaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgICpjaGFuID0gKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKilkYXRhOworICAgICAgICBzdHJ1Y3QgaTgxMGZiX3BhciAgICAgICAgICpwYXIgPSBjaGFuLT5wYXI7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOworCisJaTgxMF93cml0ZWwobW1pbywgR1BJT0IsIFNEQV9ESVJfTUFTSyk7CisJaTgxMF93cml0ZWwobW1pbywgR1BJT0IsIDApOworCXJldHVybiAoMCAhPSAoaTgxMF9yZWFkbChtbWlvLCBHUElPQikgJiBTREFfVkFMX0lOKSk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBkZGNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgICAqY2hhbiA9IChzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICopZGF0YTsKKyAgICAgICAgc3RydWN0IGk4MTBmYl9wYXIgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOworCisJaTgxMF93cml0ZWwobW1pbywgR1BJT0EsIChzdGF0ZSA/IFNDTF9WQUxfT1VUIDogMCkgfCBTQ0xfRElSIHwKKwkJICAgIFNDTF9ESVJfTUFTSyB8IFNDTF9WQUxfTUFTSyk7CisJaTgxMF9yZWFkbChtbWlvLCBHUElPQSk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworfQorCitzdGF0aWMgdm9pZCBpODEwZGRjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOworCisgCWk4MTBfd3JpdGVsKG1taW8sIEdQSU9BLCAoc3RhdGUgPyBTREFfVkFMX09VVCA6IDApIHwgU0RBX0RJUiB8CisJCSAgICBTREFfRElSX01BU0sgfCBTREFfVkFMX01BU0spOworCWk4MTBfcmVhZGwobW1pbywgR1BJT0EpOwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KK30KKworc3RhdGljIGludCBpODEwZGRjX2dldHNjbCh2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgICpjaGFuID0gKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKilkYXRhOworICAgICAgICBzdHJ1Y3QgaTgxMGZiX3BhciAgICAgICAgICpwYXIgPSBjaGFuLT5wYXI7CisJdTggICAgICAgICAgICAgICAgICAgICAgKm1taW8gPSBwYXItPm1taW9fc3RhcnRfdmlydHVhbDsKKworCWk4MTBfd3JpdGVsKG1taW8sIEdQSU9BLCBTQ0xfRElSX01BU0spOworCWk4MTBfd3JpdGVsKG1taW8sIEdQSU9BLCAwKTsKKwlyZXR1cm4gKDAgIT0gKGk4MTBfcmVhZGwobW1pbywgR1BJT0EpICYgU0NMX1ZBTF9JTikpOworfQorCitzdGF0aWMgaW50IGk4MTBkZGNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICAgKmNoYW4gPSAoc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAqKWRhdGE7CisgICAgICAgIHN0cnVjdCBpODEwZmJfcGFyICAgICAgICAgKnBhciA9IGNoYW4tPnBhcjsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOworCisJaTgxMF93cml0ZWwobW1pbywgR1BJT0EsIFNEQV9ESVJfTUFTSyk7CisJaTgxMF93cml0ZWwobW1pbywgR1BJT0EsIDApOworCXJldHVybiAoMCAhPSAoaTgxMF9yZWFkbChtbWlvLCBHUElPQSkgJiBTREFfVkFMX0lOKSk7Cit9CisKKyNkZWZpbmUgSTJDX0FMR09fRERDX0k4MTAgICAweDBlMDAwMAorI2RlZmluZSBJMkNfQUxHT19JMkNfSTgxMCAgIDB4MGYwMDAwCitzdGF0aWMgaW50IGk4MTBfc2V0dXBfaTJjX2J1cyhzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICpjaGFuLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgaW50IGNvbm4pCit7CisgICAgICAgIGludCByYzsKKworICAgICAgICBzdHJjcHkoY2hhbi0+YWRhcHRlci5uYW1lLCBuYW1lKTsKKyAgICAgICAgY2hhbi0+YWRhcHRlci5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFOworICAgICAgICBjaGFuLT5hZGFwdGVyLmFsZ29fZGF0YSAgICAgICAgID0gJmNoYW4tPmFsZ287CisgICAgICAgIGNoYW4tPmFkYXB0ZXIuZGV2LnBhcmVudCAgICAgICAgPSAmY2hhbi0+cGFyLT5kZXYtPmRldjsKKwlzd2l0Y2ggKGNvbm4pIHsKKwljYXNlIDE6CisJCWNoYW4tPmFkYXB0ZXIuaWQgICAgICAgICAgICAgICAgPSBJMkNfQUxHT19ERENfSTgxMDsKKwkJY2hhbi0+YWxnby5zZXRzZGEgICAgICAgICAgICAgICA9IGk4MTBkZGNfc2V0c2RhOworCQljaGFuLT5hbGdvLnNldHNjbCAgICAgICAgICAgICAgID0gaTgxMGRkY19zZXRzY2w7CisJCWNoYW4tPmFsZ28uZ2V0c2RhICAgICAgICAgICAgICAgPSBpODEwZGRjX2dldHNkYTsKKwkJY2hhbi0+YWxnby5nZXRzY2wgICAgICAgICAgICAgICA9IGk4MTBkZGNfZ2V0c2NsOworCQlicmVhazsKKwljYXNlIDI6CisJCWNoYW4tPmFkYXB0ZXIuaWQgICAgICAgICAgICAgICAgPSBJMkNfQUxHT19JMkNfSTgxMDsKKwkJY2hhbi0+YWxnby5zZXRzZGEgICAgICAgICAgICAgICA9IGk4MTBpMmNfc2V0c2RhOworCQljaGFuLT5hbGdvLnNldHNjbCAgICAgICAgICAgICAgID0gaTgxMGkyY19zZXRzY2w7CisJCWNoYW4tPmFsZ28uZ2V0c2RhICAgICAgICAgICAgICAgPSBpODEwaTJjX2dldHNkYTsKKwkJY2hhbi0+YWxnby5nZXRzY2wgICAgICAgICAgICAgICA9IGk4MTBpMmNfZ2V0c2NsOworCQlicmVhazsKKwl9CisJY2hhbi0+YWxnby51ZGVsYXkgICAgICAgICAgICAgICA9IDEwOworCWNoYW4tPmFsZ28ubWRlbGF5ICAgICAgICAgICAgICAgPSAxMDsKKyAgICAgICAgY2hhbi0+YWxnby50aW1lb3V0ICAgICAgICAgICAgICA9IChIWi8yKTsKKyAgICAgICAgY2hhbi0+YWxnby5kYXRhICAgICAgICAgICAgICAgICA9IGNoYW47CisKKyAgICAgICAgaTJjX3NldF9hZGFwZGF0YSgmY2hhbi0+YWRhcHRlciwgY2hhbik7CisKKyAgICAgICAgLyogUmFpc2UgU0NMIGFuZCBTREEgKi8KKyAgICAgICAgY2hhbi0+YWxnby5zZXRzZGEoY2hhbiwgMSk7CisgICAgICAgIGNoYW4tPmFsZ28uc2V0c2NsKGNoYW4sIDEpOworICAgICAgICB1ZGVsYXkoMjApOworCisgICAgICAgIHJjID0gaTJjX2JpdF9hZGRfYnVzKCZjaGFuLT5hZGFwdGVyKTsKKyAgICAgICAgaWYgKHJjID09IDApCisgICAgICAgICAgICAgICAgZGV2X2RiZygmY2hhbi0+cGFyLT5kZXYtPmRldiwgIkkyQyBidXMgJXMgcmVnaXN0ZXJlZC5cbiIsbmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXZfd2FybigmY2hhbi0+cGFyLT5kZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBJMkMgYnVzICIKKwkJCSAiJXMuXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGk4MTBfY3JlYXRlX2kyY19idXNzZXMoc3RydWN0IGk4MTBmYl9wYXIgKnBhcikKK3sKKyAgICAgICAgcGFyLT5jaGFuWzBdLnBhciAgICAgICAgPSBwYXI7CisJcGFyLT5jaGFuWzFdLnBhciAgICAgICAgPSBwYXI7CisJaTgxMF9zZXR1cF9pMmNfYnVzKCZwYXItPmNoYW5bMF0sICJJODEwLUREQyIsIDEpOworCWk4MTBfc2V0dXBfaTJjX2J1cygmcGFyLT5jaGFuWzFdLCAiSTgxMC1JMkMiLCAyKTsKK30KKwordm9pZCBpODEwX2RlbGV0ZV9pMmNfYnVzc2VzKHN0cnVjdCBpODEwZmJfcGFyICpwYXIpCit7CisgICAgICAgIGlmIChwYXItPmNoYW5bMF0ucGFyKQorICAgICAgICAgICAgICAgIGkyY19iaXRfZGVsX2J1cygmcGFyLT5jaGFuWzBdLmFkYXB0ZXIpOworICAgICAgICBwYXItPmNoYW5bMF0ucGFyID0gTlVMTDsKKwlpZiAocGFyLT5jaGFuWzFdLnBhcikKKwkJaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW5bMV0uYWRhcHRlcik7CisJcGFyLT5jaGFuWzFdLnBhciA9IE5VTEw7Cit9CisKK3N0YXRpYyB1OCAqaTgxMF9kb19wcm9iZV9pMmNfZWRpZChzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICpjaGFuKQoreworICAgICAgICB1OCBzdGFydCA9IDB4MDsKKyAgICAgICAgc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRyICAgPSBJODEwX0REQywKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4gICAgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZiAgICA9ICZzdGFydCwKKyAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkciAgID0gSTgxMF9EREMsCisgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgID0gSTJDX01fUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAubGVuICAgID0gRURJRF9MRU5HVEgsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgfTsKKyAgICAgICAgdTggKmJ1ZjsKKworICAgICAgICBidWYgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCFidWYpIHsKKwkJRFBSSU5USygiaTgxMC1pMmM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1zZ3NbMV0uYnVmID0gYnVmOworCisgICAgICAgIGlmIChpMmNfdHJhbnNmZXIoJmNoYW4tPmFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpIHsKKwkJRFBSSU5USygiaTgxMC1pMmM6IEkyQyBUcmFuc2ZlciBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworCX0KKyAgICAgICAgRFBSSU5USygiaTgxMC1pMmM6IFVuYWJsZSB0byByZWFkIEVESUQgYmxvY2suXG4iKTsKKyAgICAgICAga2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBpODEwX3Byb2JlX2kyY19jb25uZWN0b3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHU4ICoqb3V0X2VkaWQsIGludCBjb25uKQoreworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisgICAgICAgIHU4ICplZGlkID0gTlVMTDsKKyAgICAgICAgaW50IGk7CisKKwlEUFJJTlRLKCJpODEwLWkyYzogUHJvYmUgRERDJWkgQnVzXG4iLCBjb25uKTsKKwlpZiAoY29ubiA8IDMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJLyogRG8gdGhlIHJlYWwgd29yayAqLworCQkJZWRpZCA9IGk4MTBfZG9fcHJvYmVfaTJjX2VkaWQoJnBhci0+Y2hhbltjb25uLTFdKTsKKwkJCWlmIChlZGlkKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJRFBSSU5USygiaTgxMC1pMmM6IEdldHRpbmcgRURJRCBmcm9tIEJJT1NcbiIpOworCQllZGlkID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJCWlmIChlZGlkKQorCQkJbWVtY3B5KGVkaWQsIGZiX2Zpcm13YXJlX2VkaWQoaW5mby0+ZGV2aWNlKSwKKwkJCSAgICAgICBFRElEX0xFTkdUSCk7CisJfQorCisgICAgICAgIGlmIChvdXRfZWRpZCkKKyAgICAgICAgICAgICAgICAqb3V0X2VkaWQgPSBlZGlkOworCisgICAgICAgIHJldHVybiAoZWRpZCkgPyAwIDogMTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaAppbmRleCBmZTNiNzU3Li5kNDg5NDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKQEAgLTE2LDYgKzE2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgogI2luY2x1ZGUgPHZpZGVvL3ZnYS5oPgogCiAvKiBGZW5jZSAqLwpAQCAtMjAxLDcgKzIwNCw2IEBACiAjZGVmaW5lIEhBU19BQ0NFTEVSQVRJT04gICAgICAgICAgICAyCiAjZGVmaW5lIEFMV0FZU19TWU5DICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIExPQ0tVUCAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFVTRV9IV0NVUiAgICAgICAgICAgICAgICAgIDE2CiAKIHN0cnVjdCBndHRfZGF0YSB7CiAJc3RydWN0IGFncF9tZW1vcnkgKmk4MTBfZmJfbWVtb3J5OwpAQCAtMjQxLDYgKzI0MywxNCBAQAogCXU4IGNyMzksIGNyNDEsIGNyNzAsIHNyMDEsIG1zcjsKIH07CiAKK3N0cnVjdCBpODEwZmJfcGFyOworCitzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuIHsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyOworCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBhbGdvOworfTsKKwogc3RydWN0IGk4MTBmYl9wYXIgewogCXN0cnVjdCBtb2RlX3JlZ2lzdGVycyAgICByZWdzOwogCXN0cnVjdCBzdGF0ZV9yZWdpc3RlcnMgICBod19zdGF0ZTsKQEAgLTI1MiwxMCArMjYyLDEyIEBACiAJc3RydWN0IGhlYXBfZGF0YSAgICAgICAgIGlyaW5nOwogCXN0cnVjdCBoZWFwX2RhdGEgICAgICAgICBjdXJzb3JfaGVhcDsKIAlzdHJ1Y3Qgdmdhc3RhdGUgICAgICAgICAgc3RhdGU7CisJc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgIGNoYW5bMl07CiAJYXRvbWljX3QgICAgICAgICAgICAgICAgIHVzZV9jb3VudDsKIAl1MzIgcHNldWRvX3BhbGV0dGVbMTddOwogCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydF9waHlzOwogCXU4IF9faW9tZW0gKm1taW9fc3RhcnRfdmlydHVhbDsKKwl1OCAqZWRpZDsKIAl1MzIgcGl0Y2g7CiAJdTMyIHBpeGNvbmY7CiAJdTMyIHdhdGVybWFyazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYwppbmRleCA2ZGIxODM0Li43MDE4ZmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jCkBAIC05MiwyMCArOTIsMjEgQEAKIAkucmVzdW1lICAgPSAgICAgaTgxMGZiX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgdnJhbSAgICAgICBfX2luaXRkYXRhID0gNDsKLXN0YXRpYyBpbnQgYnBwICAgICAgICBfX2luaXRkYXRhID0gODsKLXN0YXRpYyBpbnQgbXRyciAgICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgYWNjZWwgICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgaHN5bmMxICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgaHN5bmMyICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgdnN5bmMxICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgdnN5bmMyICAgICBfX2luaXRkYXRhID0gMDsKLXN0YXRpYyBpbnQgeHJlcyAgICAgICBfX2luaXRkYXRhID0gNjQwOwotc3RhdGljIGludCB5cmVzICAgICAgIF9faW5pdGRhdGEgPSA0ODA7Ci1zdGF0aWMgaW50IHZ5cmVzICAgICAgX19pbml0ZGF0YSA9IDA7Ci1zdGF0aWMgaW50IHN5bmMgICAgICAgX19pbml0ZGF0YSA9IDA7Ci1zdGF0aWMgaW50IGV4dF92Z2EgICAgX19pbml0ZGF0YSA9IDA7Ci1zdGF0aWMgaW50IGRjb2xvciAgICAgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19kZXZpbml0ZGF0YSA9IE5VTEw7CitzdGF0aWMgaW50IHZyYW0gICAgICAgX19kZXZpbml0ZGF0YSA9IDQ7CitzdGF0aWMgaW50IGJwcCAgICAgICAgX19kZXZpbml0ZGF0YSA9IDg7CitzdGF0aWMgaW50IG10cnIgICAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGFjY2VsICAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGhzeW5jMSAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGhzeW5jMiAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHZzeW5jMSAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHZzeW5jMiAgICAgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHhyZXMgICAgICAgX19kZXZpbml0ZGF0YSA9IDY0MDsKK3N0YXRpYyBpbnQgeXJlcyAgICAgICBfX2RldmluaXRkYXRhID0gNDgwOworc3RhdGljIGludCB2eXJlcyAgICAgIF9fZGV2aW5pdGRhdGEgPSAwOworc3RhdGljIGludCBzeW5jICAgICAgIF9fZGV2aW5pdGRhdGEgPSAwOworc3RhdGljIGludCBleHRfdmdhICAgIF9fZGV2aW5pdGRhdGEgPSAwOworc3RhdGljIGludCBkY29sb3IgICAgIF9fZGV2aW5pdGRhdGEgPSAwOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTMxMCw2ICszMTEsOCBAQAogCXZhbCA9IGk4MTBfcmVhZGIoQ1JfREFUQV9DR0EsIG1taW8pOwogCWk4MTBfd3JpdGViKENSX0lOREVYX0NHQSwgbW1pbywgQ1I4MCk7CiAJaTgxMF93cml0ZWIoQ1JfREFUQV9DR0EsIG1taW8sIHZhbCB8IDEpOworCS8qIFN0b3AgTENEIGRpc3BsYXlzIGZyb20gZmxpY2tlcmluZyAqLworCWk4MTBfd3JpdGVsKE1FTV9NT0RFLCBtbWlvLCBpODEwX3JlYWRsKE1FTV9NT0RFLCBtbWlvKSB8IDQpOwogfQogCiAvKioKQEAgLTk0NywzMSArOTUwLDI0IEBACiAJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOwotCWludCBsaW5lX2xlbmd0aCwgdmlkbWVtOwotCXUzMiB4cmVzLCB5cmVzLCB2eHJlcywgdnlyZXM7Ci0KLQl4cmVzID0gdmFyLT54cmVzOwotCXlyZXMgPSB2YXItPnlyZXM7Ci0JdnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKLQl2eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsOwotCisJaW50IGxpbmVfbGVuZ3RoLCB2aWRtZW0sIG1vZGVfdmFsaWQgPSAwOworCXUzMiB2eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsLCB2eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsOwogCS8qCiAJICogIE1lbW9yeSBsaW1pdAogCSAqLwotCWxpbmVfbGVuZ3RoID0gZ2V0X2xpbmVfbGVuZ3RoKHBhciwgdnhyZXMsIAotCQkJCSAgICAgIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCisJbGluZV9sZW5ndGggPSBnZXRfbGluZV9sZW5ndGgocGFyLCB2eHJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJdmlkbWVtID0gbGluZV9sZW5ndGgqdnlyZXM7CisKIAlpZiAodmlkbWVtID4gcGFyLT5mYi5zaXplKSB7CiAJCXZ5cmVzID0gcGFyLT5mYi5zaXplL2xpbmVfbGVuZ3RoOwotCQlpZiAodnlyZXMgPCB5cmVzKSB7CisJCWlmICh2eXJlcyA8IHZhci0+eXJlcykgewogCQkJdnlyZXMgPSB5cmVzOwogCQkJdnhyZXMgPSBwYXItPmZiLnNpemUvdnlyZXM7CiAJCQl2eHJlcyAvPSB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDM7CiAJCQlsaW5lX2xlbmd0aCA9IGdldF9saW5lX2xlbmd0aChwYXIsIHZ4cmVzLCAKIAkJCQkJCSAgICAgIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCQkJdmlkbWVtID0gbGluZV9sZW5ndGggKiB5cmVzOwotCQkJaWYgKHZ4cmVzIDwgeHJlcykgeworCQkJaWYgKHZ4cmVzIDwgdmFyLT54cmVzKSB7CiAJCQkJcHJpbnRrKCJpODEwZmI6IHJlcXVpcmVkIHZpZGVvIG1lbW9yeSwgIgogCQkJCSAgICAgICAiJWQgYnl0ZXMsIGZvciAlZHglZC0lZCAodmlydHVhbCkgIgogCQkJCSAgICAgICAiaXMgb3V0IG9mIHJhbmdlXG4iLCAKQEAgLTk4MSw2ICs5NzcsMTAgQEAKIAkJCX0KIAkJfQogCX0KKworCXZhci0+eHJlc192aXJ0dWFsID0gdnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSB2eXJlczsKKwogCS8qCiAJICogTW9uaXRvciBsaW1pdAogCSAqLwpAQCAtOTk2LDI1ICs5OTYsMzkgQEAKIAkJaW5mby0+bW9uc3BlY3MuZGNsa21heCA9IDIwNDAwMDAwMDsKIAkJYnJlYWs7CiAJfQorCiAJaW5mby0+bW9uc3BlY3MuZGNsa21pbiA9IDE1MDAwMDAwOwogCi0JaWYgKGZiX3ZhbGlkYXRlX21vZGUodmFyLCBpbmZvKSkgewotCQlpZiAoZmJfZ2V0X21vZGUoRkJfTUFYVElNSU5HUywgMCwgdmFyLCBpbmZvKSkgewotCQkJaW50IGRlZmF1bHRfc3luYyA9IChpbmZvLT5tb25zcGVjcy5oZm1pbi1IRk1JTikKLQkJCQkJCXwoaW5mby0+bW9uc3BlY3MuaGZtYXgtSEZNQVgpCi0JCQkJCQl8KGluZm8tPm1vbnNwZWNzLnZmbWluLVZGTUlOKQotCQkJCQkJfChpbmZvLT5tb25zcGVjcy52Zm1heC1WRk1BWCk7Ci0JCQlwcmludGsoImk4MTBmYjogaW52YWxpZCB2aWRlbyBtb2RlJXNcbiIsCi0JCQkgICAgZGVmYXVsdF9zeW5jID8gIiIgOgotCQkJICAgICIuIFNwZWNpZnlpbmcgdnN5bmNOL2hzeW5jTiBwYXJhbWV0ZXJzIG1heSBoZWxwIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWZiX3ZhbGlkYXRlX21vZGUodmFyLCBpbmZvKSkKKwkJbW9kZV92YWxpZCA9IDE7CisKKyNpZmRlZiBDT05GSUdfRkJfSTgxMF9JMkMKKwlpZiAoIW1vZGVfdmFsaWQgJiYgaW5mby0+bW9uc3BlY3MuZ3RmICYmCisJICAgICFmYl9nZXRfbW9kZShGQl9NQVhUSU1JTkdTLCAwLCB2YXIsIGluZm8pKQorCQltb2RlX3ZhbGlkID0gMTsKKworCWlmICghbW9kZV92YWxpZCAmJiBpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuKSB7CisJCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGU7CisKKwkJbW9kZSA9IGZiX2ZpbmRfYmVzdF9tb2RlKHZhciwgJmluZm8tPm1vZGVsaXN0KTsKKwkJaWYgKG1vZGUpIHsKKwkJCWZiX3ZpZGVvbW9kZV90b192YXIodmFyLCBtb2RlKTsKKwkJCW1vZGVfdmFsaWQgPSAxOwogCQl9CiAJfQotCQotCXZhci0+eHJlcyA9IHhyZXM7Ci0JdmFyLT55cmVzID0geXJlczsKLQl2YXItPnhyZXNfdmlydHVhbCA9IHZ4cmVzOwotCXZhci0+eXJlc192aXJ0dWFsID0gdnlyZXM7CisjZW5kaWYKKwlpZiAoIW1vZGVfdmFsaWQgJiYgaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA9PSAwKSB7CisJCWlmIChmYl9nZXRfbW9kZShGQl9NQVhUSU1JTkdTLCAwLCB2YXIsIGluZm8pKSB7CisJCQlpbnQgZGVmYXVsdF9zeW5jID0gKGluZm8tPm1vbnNwZWNzLmhmbWluLUhGTUlOKQorCQkJCXwoaW5mby0+bW9uc3BlY3MuaGZtYXgtSEZNQVgpCisJCQkJfChpbmZvLT5tb25zcGVjcy52Zm1pbi1WRk1JTikKKwkJCQl8KGluZm8tPm1vbnNwZWNzLnZmbWF4LVZGTUFYKTsKKwkJCXByaW50aygiaTgxMGZiOiBpbnZhbGlkIHZpZGVvIG1vZGUlc1xuIiwKKwkJCSAgICAgICBkZWZhdWx0X3N5bmMgPyAiIiA6ICIuIFNwZWNpZnlpbmcgIgorCQkJICAgICAgICJ2c3luY04vaHN5bmNOIHBhcmFtZXRlcnMgbWF5IGhlbHAiKTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQkKIApAQCAtMTM3NSw3ICsxMzg5LDYgQEAKIAlkZWNvZGVfdmFyKCZpbmZvLT52YXIsIHBhcik7CiAJaTgxMF9sb2FkX3JlZ3MocGFyKTsKIAlpODEwX2luaXRfY3Vyc29yKHBhcik7Ci0KIAllbmNvZGVfZml4KCZpbmZvLT5maXgsIGluZm8pOwogCiAJaWYgKGluZm8tPnZhci5hY2NlbF9mbGFncyAmJiAhKHBhci0+ZGV2X2ZsYWdzICYgTE9DS1VQKSkgewpAQCAtMTQxOCw5ICsxNDMxLDggQEAKIAlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopaW5mby0+cGFyOwogCXU4IF9faW9tZW0gKm1taW8gPSBwYXItPm1taW9fc3RhcnRfdmlydHVhbDsKIAotCWlmICghKHBhci0+ZGV2X2ZsYWdzICYgVVNFX0hXQ1VSKSB8fCAhaW5mby0+dmFyLmFjY2VsX2ZsYWdzIHx8Ci0JICAgIHBhci0+ZGV2X2ZsYWdzICYgTE9DS1VQKQotCQlyZXR1cm4gc29mdF9jdXJzb3IoaW5mbywgY3Vyc29yKTsKKwlpZiAoIXBhci0+ZGV2X2ZsYWdzICYgTE9DS1VQKQorCQlyZXR1cm4gLUVOWElPOwogCiAJaWYgKGN1cnNvci0+aW1hZ2Uud2lkdGggPiA2NCB8fCBjdXJzb3ItPmltYWdlLmhlaWdodCA+IDY0KQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTgxNCw4ICsxODI2LDcyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpODEwZmJfZmluZF9pbml0X21vZGUoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSBtb2RlOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CisJc3RydWN0IGZiX21vbnNwZWNzICpzcGVjcyA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKyNpZmRlZiBDT05GSUdfRkJfSTgxMF9JMkMKKwlpbnQgaTsKKwlpbnQgZXJyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisjZW5kaWYKKworCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5tb2RlbGlzdCk7CisJbWVtc2V0KCZtb2RlLCAwLCBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSkpOworCXZhciA9IGluZm8tPnZhcjsKKyNpZmRlZiBDT05GSUdfRkJfSTgxMF9JMkMKKwlpODEwX2NyZWF0ZV9pMmNfYnVzc2VzKHBhcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWVyciA9IGk4MTBfcHJvYmVfaTJjX2Nvbm5lY3RvcihpbmZvLCAmcGFyLT5lZGlkLCBpKzEpOworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCX0KKworCWlmICghZXJyKQorCQlwcmludGsoImk4MTBmYl9pbml0X3BjaTogRERDIHByb2JlIHN1Y2Nlc3NmdWxcbiIpOworCisJZmJfZWRpZF90b19tb25zcGVjcyhwYXItPmVkaWQsICZpbmZvLT5tb25zcGVjcyk7CisKKwlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiID09IE5VTEwpCisJCXByaW50aygiaTgxMGZiX2luaXRfcGNpOiBVbmFibGUgdG8gZ2V0IE1vZGUgRGF0YWJhc2VcbiIpOworCisJc3BlY3MgPSAmaW5mby0+bW9uc3BlY3M7CisJZmJfdmlkZW9tb2RlX3RvX21vZGVsaXN0KHNwZWNzLT5tb2RlZGIsIHNwZWNzLT5tb2RlZGJfbGVuLAorCQkJCSAmaW5mby0+bW9kZWxpc3QpOworCWlmIChzcGVjcy0+bW9kZWRiICE9IE5VTEwpIHsKKwkJaWYgKHNwZWNzLT5taXNjICYgRkJfTUlTQ18xU1RfREVUQUlMKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3BlY3MtPm1vZGVkYl9sZW47IGkrKykgeworCQkJCWlmIChzcGVjcy0+bW9kZWRiW2ldLmZsYWcgJiBGQl9NT0RFX0lTX0ZJUlNUKSB7CisJCQkJCW1vZGUgPSBzcGVjcy0+bW9kZWRiW2ldOworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCW1vZGUgPSBzcGVjcy0+bW9kZWRiWzBdOworCQkJZm91bmQgPSAxOworCQl9CisKKwkJZmJfdmlkZW9tb2RlX3RvX3ZhcigmdmFyLCAmbW9kZSk7CisJfQorI2VuZGlmCisJaWYgKG1vZGVfb3B0aW9uKQorCQlmYl9maW5kX21vZGUoJnZhciwgaW5mbywgbW9kZV9vcHRpb24sIHNwZWNzLT5tb2RlZGIsCisJCQkgICAgIHNwZWNzLT5tb2RlZGJfbGVuLCAoZm91bmQpID8gJm1vZGUgOiBOVUxMLAorCQkJICAgICBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOworCisJaW5mby0+dmFyID0gdmFyOworCWZiX2Rlc3Ryb3lfbW9kZWRiKHNwZWNzLT5tb2RlZGIpOworCXNwZWNzLT5tb2RlZGIgPSBOVUxMOworfQorCiAjaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgaTgxMGZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpODEwZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKIAljaGFyICp0aGlzX29wdCwgKnN1ZmZpeCA9IE5VTEw7CiAKQEAgLTE4NTcsNiArMTkzMyw4IEBACiAJCQl2c3luYzIgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs3LCBOVUxMLCAwKTsKIAkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJkY29sb3IiLCA2KSkKIAkJCWRjb2xvciA9IDE7CisJCWVsc2UKKwkJCW1vZGVfb3B0aW9uID0gdGhpc19vcHQ7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTg2Nyw2ICsxOTQ1LDcgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAgICAqaW5mbzsKIAlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gTlVMTDsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1vZGU7CiAJaW50IGksIGVyciA9IC0xLCB2ZnJlcSwgaGZyZXEsIHBpeGNsb2NrOwogCiAJaSA9IDA7CkBAIC0xODc1LDcgKzE5NTQsNyBAQAogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXBhciA9IGluZm8tPnBhcjsKIAlwYXItPmRldiA9IGRldjsKIAogCWlmICghKGluZm8tPnBpeG1hcC5hZGRyID0ga21hbGxvYyg4KjEwMjQsIEdGUF9LRVJORUwpKSkgewpAQCAtMTkwNiwxNSArMTk4NSwyMCBAQAogCWluZm8tPmZib3BzID0gJnBhci0+aTgxMGZiX29wczsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cHNldWRvX3BhbGV0dGU7CiAJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKKwlpODEwZmJfZmluZF9pbml0X21vZGUoaW5mbyk7CiAKIAlpZiAoKGVyciA9IGluZm8tPmZib3BzLT5mYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbykpKSB7CiAJCWk4MTBmYl9yZWxlYXNlX3Jlc291cmNlKGluZm8sIHBhcik7CiAJCXJldHVybiBlcnI7CiAJfQorCisJZmJfdmFyX3RvX3ZpZGVvbW9kZSgmbW9kZSwgJmluZm8tPnZhcik7CisJZmJfYWRkX3ZpZGVvbW9kZSgmbW9kZSwgJmluZm8tPm1vZGVsaXN0KTsKIAllbmNvZGVfZml4KCZpbmZvLT5maXgsIGluZm8pOyAKIAkgCSAgICAKIAlpODEwZmJfaW5pdF9yaW5nYnVmZmVyKGluZm8pOwogCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCiAJaWYgKGVyciA8IDApIHsKICAgICAJCWk4MTBmYl9yZWxlYXNlX3Jlc291cmNlKGluZm8sIHBhcik7IAogCQlwcmludGsoImk4MTBmYl9pbml0OiBjYW5ub3QgcmVnaXN0ZXIgZnJhbWVidWZmZXIgZGV2aWNlXG4iKTsKQEAgLTE5NTMsNiArMjAzNyw4IEBACiAJc3RydWN0IGd0dF9kYXRhICpndHQgPSAmcGFyLT5pODEwX2d0dDsKIAl1bnNldF9tdHJyKHBhcik7CiAKKwlpODEwX2RlbGV0ZV9pMmNfYnVzc2VzKHBhcik7CisKIAlpZiAocGFyLT5pODEwX2d0dC5pODEwX2N1cnNvcl9tZW1vcnkpCiAJCWFncF9mcmVlX21lbW9yeShndHQtPmk4MTBfY3Vyc29yX21lbW9yeSk7CiAJaWYgKHBhci0+aTgxMF9ndHQuaTgxMF9mYl9tZW1vcnkpCkBAIC0xOTYyLDcgKzIwNDgsOCBAQAogCQlpb3VubWFwKHBhci0+bW1pb19zdGFydF92aXJ0dWFsKTsKIAlpZiAocGFyLT5hcGVydHVyZS52aXJ0dWFsKQogCQlpb3VubWFwKHBhci0+YXBlcnR1cmUudmlydHVhbCk7Ci0KKwlpZiAocGFyLT5lZGlkKQorCQlrZnJlZShwYXItPmVkaWQpOwogCWlmIChwYXItPnJlc19mbGFncyAmIEZSQU1FQlVGRkVSX1JFUSkKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+YXBlcnR1cmUucGh5c2ljYWwsCiAJCQkJICAgcGFyLT5hcGVydHVyZS5zaXplKTsKQEAgLTE5ODgsNyArMjA3NSw3IEBACiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQogCiAjaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgaTgxMGZiX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4MTBmYl9pbml0KHZvaWQpCiB7CiAJY2hhciAqb3B0aW9uID0gTlVMTDsKIApAQCAtMjAwNiw3ICsyMDkzLDcgQEAKIAogI2lmZGVmIE1PRFVMRQogCi1zdGF0aWMgaW50IF9faW5pdCBpODEwZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgaTgxMGZiX2luaXQodm9pZCkKIHsKIAloc3luYzEgKj0gMTAwMDsKIAloc3luYzIgKj0gMTAwMDsKQEAgLTIwNTQsNiArMjE0MSw4IEBACiBtb2R1bGVfcGFyYW0oZGNvbG9yLCBib29sLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGNvbG9yLCAidXNlIERpcmVjdENvbG9yIHZpc3VhbHMiCiAJCSAiIChkZWZhdWx0ID0gMCA9IFRydWVDb2xvcikiKTsKK21vZHVsZV9wYXJhbShtb2RlX29wdGlvbiwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlX29wdGlvbiwgIlNwZWNpZnkgaW5pdGlhbCB2aWRlbyBtb2RlIik7CiAKIE1PRFVMRV9BVVRIT1IoIlRvbnkgQS4gRGFwbGFzIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRldmljZSBmb3IgdGhlIEludGVsIDgxMC84MTUgYW5kIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5oIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5oCmluZGV4IDQzYjQyOTcuLjA2MDcyYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uaAorKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmgKQEAgLTgzLDYgKzgzLDIyIEBACiBleHRlcm4gdm9pZCBpODEwZmJfaW5pdF9yaW5nYnVmZmVyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIGV4dGVybiB2b2lkIGk4MTBmYl9sb2FkX2Zyb250ICAgICAodTMyIG9mZnNldCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwogCisjaWZkZWYgQ09ORklHX0ZCX0k4MTBfSTJDCisvKiBJMkMgKi8KK2V4dGVybiBpbnQgaTgxMF9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1OCAqKm91dF9lZGlkLAorCQkJCSAgICBpbnQgY29ubik7CitleHRlcm4gdm9pZCBpODEwX2NyZWF0ZV9pMmNfYnVzc2VzKHN0cnVjdCBpODEwZmJfcGFyICpwYXIpOworZXh0ZXJuIHZvaWQgaTgxMF9kZWxldGVfaTJjX2J1c3NlcyhzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpODEwX3Byb2JlX2kyY19jb25uZWN0b3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHU4ICoqb3V0X2VkaWQsCisJCQkJICAgIGludCBjb25uKQoreworCXJldHVybiAxOworfQorc3RhdGljIGlubGluZSB2b2lkIGk4MTBfY3JlYXRlX2kyY19idXNzZXMoc3RydWN0IGk4MTBmYl9wYXIgKnBhcikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaTgxMF9kZWxldGVfaTJjX2J1c3NlcyhzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyKSB7IH0KKyNlbmRpZgorCiAvKiBDb25kaXRpb25hbHMgKi8KICNpZmRlZiBDT05GSUdfWDg2CiBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaCBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKaW5kZXggNjY4MGVjOS4uMDExZTExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCkBAIC0yMzQsNyArMjM0LDYgQEAKIAogCS8qIHBhbGV0dGUgKi8KIAl1MzIgcHNldWRvX3BhbGV0dGVbMTddOwotCXN0cnVjdCB7IHU4IHJlZCwgZ3JlZW4sIGJsdWUsIHBhZDsgfSBwYWxldHRlWzI1Nl07CiAKIAkvKiBjaGlwIGluZm8gKi8KIAlpbnQgcGNpX2NoaXBzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYwppbmRleCBhMTEyYTE3Li5iZjYyZTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKQEAgLTExNywxNCArMTE3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9rZC5oPgotI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCkBAIC0yNDIsNyArMjM4LDcgQEAKIHN0YXRpYyBjaGFyICptb2RlICAgICAgID0gTlVMTDsKIAogbW9kdWxlX3BhcmFtKGFjY2VsLCBib29sLCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoYWNjZWwsICJFbmFibGUgY29uc29sZSBhY2NlbGVyYXRpb24iKTsKK01PRFVMRV9QQVJNX0RFU0MoYWNjZWwsICJFbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIik7CiBtb2R1bGVfcGFyYW0odnJhbSwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0ModnJhbSwgIlN5c3RlbSBSQU0gdG8gYWxsb2NhdGUgdG8gZnJhbWVidWZmZXIgaW4gTWlCIik7CiBtb2R1bGVfcGFyYW0odm9mZnNldCwgaW50LCBTX0lSVUdPKTsKQEAgLTQ5OCw3ICs0OTQsNyBAQAogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCXN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvOwotCWludCBpLCBqLCBlcnIsIGR2bzsKKwlpbnQgaSwgZXJyLCBkdm87CiAJaW50IGFwZXJ0dXJlX3NpemUsIHN0b2xlbl9zaXplOwogCXN0cnVjdCBhZ3Bfa2Vybl9pbmZvIGd0dF9pbmZvOwogCWludCBhZ3BfbWVtdHlwZTsKQEAgLTg0NSwxMyArODQxLDYgQEAKIAlpZiAoYmFpbGVhcmx5ID09IDUpCiAJCWJhaWxvdXQoZGluZm8pOwogCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJaiA9IGNvbG9yX3RhYmxlW2ldOwotCQlkaW5mby0+cGFsZXR0ZVtpXS5yZWQgPSBkZWZhdWx0X3JlZFtqXTsKLQkJZGluZm8tPnBhbGV0dGVbaV0uZ3JlZW4gPSBkZWZhdWx0X2dybltqXTsKLQkJZGluZm8tPnBhbGV0dGVbaV0uYmx1ZSA9IGRlZmF1bHRfYmx1W2pdOwotCX0KLQogCWlmIChiYWlsZWFybHkgPT0gNikKIAkJYmFpbG91dChkaW5mbyk7CiAKQEAgLTEzNjMsMTAgKzEzNTIsNiBAQAogCQkJZ3JlZW4gPj49IDg7CiAJCQlibHVlID4+PSA4OwogCi0JCQlkaW5mby0+cGFsZXR0ZVtyZWdub10ucmVkID0gcmVkOwotCQkJZGluZm8tPnBhbGV0dGVbcmVnbm9dLmdyZWVuID0gZ3JlZW47Ci0JCQlkaW5mby0+cGFsZXR0ZVtyZWdub10uYmx1ZSA9IGJsdWU7Ci0KIAkJCWludGVsZmJod19zZXRjb2xyZWcoZGluZm8sIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAogCQkJCQkgICAgdHJhbnNwKTsKIAkJfQpAQCAtMTQ5OSw3ICsxNDg0LDcgQEAKICNlbmRpZgogCiAJaWYgKCFkaW5mby0+aHdjdXJzb3IpCi0JCXJldHVybiBzb2Z0X2N1cnNvcihpbmZvLCBjdXJzb3IpOworCQlyZXR1cm4gLUVOWElPOwogCiAJaW50ZWxmYmh3X2N1cnNvcl9oaWRlKGRpbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCmluZGV4IGY1YmVkNTguLjViYWZjM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKQEAgLTI5LDE0ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLSNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWlzYy5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWlzYy5jCmluZGV4IGExOGRkMDIuLmQ5ZDNlOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21pc2MuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9taXNjLmMKQEAgLTY4LDYgKzY4LDkgQEAKICAqICAgICAgICAgICAgICAgIkRhdmlkIEMuIEhhbnNlbiIgPGhhdmVibHVlQHVzLmlibS5jb20+CiAgKiAgICAgICAgICAgICAgICAgICAgIEZpeGVzCiAgKgorICogICAgICAgICAgICAgICAiSWFuIFJvbWFuaWNrIiA8aWRyQHVzLmlibS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIEZpbmQgUEluUyBkYXRhIGluIEJJT1Mgb24gUG93ZXJQQyBzeXN0ZW1zLgorICoKICAqIChmb2xsb3dpbmcgYXV0aG9yIGlzIG5vdCBpbiBhbnkgcmVsYXRpb24gd2l0aCB0aGlzIGNvZGUsIGJ1dCBoaXMgY29kZQogICogIGlzIGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyKQogICoKQEAgLTQ5NiwxMCArNDk5LDM1IEBACiAJZ2V0X2Jpb3NfdmVyc2lvbih2YmlvcywgYmQpOwogCWdldF9iaW9zX291dHB1dCh2YmlvcywgYmQpOwogCWdldF9iaW9zX3R2b3V0KHZiaW9zLCBiZCk7CisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKwkvKiBPbiBQb3dlclBDIGNhcmRzLCB0aGUgUEluUyBvZmZzZXQgaXNuJ3Qgc3RvcmVkIGF0IHRoZSBlbmQgb2YgdGhlCisJICogQklPUyBpbWFnZS4gIEluc3RlYWQsIHlvdSBtdXN0IHNlYXJjaCB0aGUgZW50aXJlIEJJT1MgaW1hZ2UgZm9yCisJICogdGhlIG1hZ2ljIFBJblMgc2lnbmF0dXJlLgorCSAqCisJICogVGhpcyBhY3R1YWxseSBhcHBsaWVzIHRvIGFsbCBPcGVuRmlybXdhcmUgYmFzZSBjYXJkcy4gIFNpbmNlIHRoZXNlCisJICogY2FyZHMgY291bGQgYmUgcHV0IGluIGEgTUlQUyBvciBTUEFSQyBzeXN0ZW0sIHNob3VsZCB0aGUgY29uZGl0aW9uCisJICogYmUgc29tZXRoaW5nIGRpZmZlcmVudD8KKwkgKi8KKwlmb3IgKCBwaW5zX29mZnNldCA9IDAgOyBwaW5zX29mZnNldCA8PSAweEZGODAgOyBwaW5zX29mZnNldCsrICkgeworCQl1bnNpZ25lZCBjaGFyIGhlYWRlclszXTsKKworCQloZWFkZXJbMF0gPSByZWFkYih2YmlvcyArIHBpbnNfb2Zmc2V0KTsKKwkJaGVhZGVyWzFdID0gcmVhZGIodmJpb3MgKyBwaW5zX29mZnNldCArIDEpOworCQloZWFkZXJbMl0gPSByZWFkYih2YmlvcyArIHBpbnNfb2Zmc2V0ICsgMik7CisJCWlmICggKGhlYWRlclswXSA9PSAweDJFKSAmJiAoaGVhZGVyWzFdID09IDB4NDEpCisJCSAgICAgJiYgKChoZWFkZXJbMl0gPT0gMHg0MCkgfHwgKGhlYWRlclsyXSA9PSAweDgwKSkgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJQSW5TIGRhdGEgZm91bmQgYXQgb2Zmc2V0ICV1XG4iLAorCQkJICAgICAgIHBpbnNfb2Zmc2V0KTsKKwkJCWdldF9waW5zKHZiaW9zICsgcGluc19vZmZzZXQsIGJkKTsKKwkJCWJyZWFrOworCQl9CisJfQorI2Vsc2UKIAlwaW5zX29mZnNldCA9IHJlYWRiKHZiaW9zICsgMHg3RkZDKSB8IChyZWFkYih2YmlvcyArIDB4N0ZGRCkgPDwgOCk7CiAJaWYgKHBpbnNfb2Zmc2V0IDw9IDB4RkY4MCkgewogCQlnZXRfcGlucyh2YmlvcyArIHBpbnNfb2Zmc2V0LCBiZCk7CiAJfQorI2VuZGlmCiB9CiAKICNkZWZpbmUgZ2V0X3UxNih4KSAobGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX191MTYqKSh4KSkpKQpAQCAtNzU1LDYgKzc4Myw4IEBACiAJfQogI2VuZGlmCiAJbWF0cm94ZmJfc2V0X2xpbWl0cyhQTUlORk8gJkFDQ0VTU19GQklORk8oYmlvcykpOworCXByaW50ayhLRVJOX0lORk8gIlBJblMgbWVtdHlwZSA9ICV1XG4iLAorCSAgICAgICAoQUNDRVNTX0ZCSU5GTyh2YWx1ZXMpLnJlZy5vcHQgJiAweDFDMDApID4+IDEwKTsKIH0KIAogRVhQT1JUX1NZTUJPTChtYXRyb3hmYl9EQUNfaW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tb2RlZGIuYyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKaW5kZXggM2VkYzlmNC4uNDc1MTZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tb2RlZGIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCkBAIC00NTYsMTIgKzQ1NiwyMiBAQAogICoKICAqCVZhbGlkIG1vZGUgc3BlY2lmaWVycyBmb3IgQG1vZGVfb3B0aW9uOgogICoKLSAqCTx4cmVzPng8eXJlcz5bLTxicHA+XVtAPHJlZnJlc2g+XSBvcgorICoJPHhyZXM+eDx5cmVzPltNXVtSXVstPGJwcD5dW0A8cmVmcmVzaD5dW2ldW21dIG9yCiAgKgk8bmFtZT5bLTxicHA+XVtAPHJlZnJlc2g+XQogICoKICAqCXdpdGggPHhyZXM+LCA8eXJlcz4sIDxicHA+IGFuZCA8cmVmcmVzaD4gZGVjaW1hbCBudW1iZXJzIGFuZAogICoJPG5hbWU+IGEgc3RyaW5nLgogICoKKyAqICAgICAgSWYgJ00nIGlzIHByZXNlbnQgYWZ0ZXIgeXJlcyAoYW5kIGJlZm9yZSByZWZyZXNoL2JwcCBpZiBwcmVzZW50KSwKKyAqICAgICAgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgdGltaW5ncyB1c2luZyBWRVNBKHRtKSBDb29yZGluYXRlZAorICogICAgICBWaWRlbyBUaW1pbmdzIChDVlQpLiAgSWYgJ1InIGlzIHByZXNlbnQgYWZ0ZXIgJ00nLCB3aWxsIGNvbXB1dGUgd2l0aAorICogICAgICByZWR1Y2VkIGJsYW5raW5nIChmb3IgZmxhdHBhbmVscykuICBJZiAnaScgaXMgcHJlc2VudCwgY29tcHV0ZQorICogICAgICBpbnRlcmxhY2VkIG1vZGUuICBJZiAnbScgaXMgcHJlc2VudCwgYWRkIG1hcmdpbnMgZXF1YWwgdG8gMS44JQorICogICAgICBvZiB4cmVzIHJvdW5kZWQgZG93biB0byA4IHBpeGVscywgYW5kIDEuOCUgb2YgeXJlcy4gVGhlIGNoYXIKKyAqICAgICAgJ2knIGFuZCAnbScgbXVzdCBiZSBhZnRlciAnTScgYW5kICdSJy4gRXhhbXBsZToKKyAqCisgKiAgICAgIDEwMjR4NzY4TVItOEA2MG0gLSBSZWR1Y2VkIGJsYW5rIHdpdGggbWFyZ2lucyBhdCA2MEh6LgorICoKICAqCU5PVEU6IFRoZSBwYXNzZWQgc3RydWN0IEB2YXIgaXMgX25vdF8gY2xlYXJlZCEgIFRoaXMgYWxsb3dzIHlvdQogICoJdG8gc3VwcGx5IHZhbHVlcyBmb3IgZS5nLiB0aGUgZ3JheXNjYWxlIGFuZCBhY2NlbF9mbGFncyBmaWVsZHMuCiAgKgpAQCAtNDk1LDcgKzUwNSw3IEBACiAJdW5zaWduZWQgaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CiAJaW50IHJlc19zcGVjaWZpZWQgPSAwLCBicHBfc3BlY2lmaWVkID0gMCwgcmVmcmVzaF9zcGVjaWZpZWQgPSAwOwogCXVuc2lnbmVkIGludCB4cmVzID0gMCwgeXJlcyA9IDAsIGJwcCA9IGRlZmF1bHRfYnBwLCByZWZyZXNoID0gMDsKLQlpbnQgeXJlc19zcGVjaWZpZWQgPSAwOworCWludCB5cmVzX3NwZWNpZmllZCA9IDAsIGN2dCA9IDAsIHJiID0gMCwgaW50ZXJsYWNlID0gMCwgbWFyZ2lucyA9IDA7CiAJdTMyIGJlc3QsIGRpZmY7CiAKIAlmb3IgKGkgPSBuYW1lbGVuLTE7IGkgPj0gMDsgaS0tKSB7CkBAIC01MDYsNiArNTE2LDggQEAKIAkJCSF5cmVzX3NwZWNpZmllZCkgewogCQkJcmVmcmVzaCA9IG15X2F0b2koJm5hbWVbaSsxXSk7CiAJCQlyZWZyZXNoX3NwZWNpZmllZCA9IDE7CisJCQlpZiAoY3Z0IHx8IHJiKQorCQkJICAgIGN2dCA9IDA7CiAJCSAgICB9IGVsc2UKIAkJCWdvdG8gZG9uZTsKIAkJICAgIGJyZWFrOwpAQCAtNTE0LDYgKzUyNiw4IEBACiAJCSAgICBpZiAoIWJwcF9zcGVjaWZpZWQgJiYgIXlyZXNfc3BlY2lmaWVkKSB7CiAJCQlicHAgPSBteV9hdG9pKCZuYW1lW2krMV0pOwogCQkJYnBwX3NwZWNpZmllZCA9IDE7CisJCQlpZiAoY3Z0IHx8IHJiKQorCQkJICAgIGN2dCA9IDA7CiAJCSAgICB9IGVsc2UKIAkJCWdvdG8gZG9uZTsKIAkJICAgIGJyZWFrOwpAQCAtNTI2LDYgKzU0MCwyMiBAQAogCQkgICAgYnJlYWs7CiAJCWNhc2UgJzAnLi4uJzknOgogCQkgICAgYnJlYWs7CisJCWNhc2UgJ00nOgorCQkgICAgaWYgKCF5cmVzX3NwZWNpZmllZCkKKwkJCWN2dCA9IDE7CisJCSAgICBicmVhazsKKwkJY2FzZSAnUic6CisJCSAgICBpZiAoIWN2dCkKKwkJCXJiID0gMTsKKwkJICAgIGJyZWFrOworCQljYXNlICdtJzoKKwkJICAgIGlmICghY3Z0KQorCQkJbWFyZ2lucyA9IDE7CisJCSAgICBicmVhazsKKwkJY2FzZSAnaSc6CisJCSAgICBpZiAoIWN2dCkKKwkJCWludGVybGFjZSA9IDE7CisJCSAgICBicmVhazsKIAkJZGVmYXVsdDoKIAkJICAgIGdvdG8gZG9uZTsKIAkgICAgfQpAQCAtNTM1LDYgKzU2NSwzNCBAQAogCSAgICByZXNfc3BlY2lmaWVkID0gMTsKIAl9CiBkb25lOgorCWlmIChjdnQpIHsKKwkgICAgc3RydWN0IGZiX3ZpZGVvbW9kZSBjdnRfbW9kZTsKKwkgICAgaW50IHJldDsKKworCSAgICBEUFJJTlRLKCJDVlQgbW9kZSAlZHglZEAlZEh6JXMlcyVzXG4iLCB4cmVzLCB5cmVzLAorCQkgICAgKHJlZnJlc2gpID8gcmVmcmVzaCA6IDYwLCAocmIpID8gIiByZWR1Y2VkIGJsYW5raW5nIiA6CisJCSAgICAiIiwgKG1hcmdpbnMpID8gIiB3aXRoIG1hcmdpbnMiIDogIiIsIChpbnRlcmxhY2UpID8KKwkJICAgICIgaW50ZXJsYWNlZCIgOiAiIik7CisKKwkgICAgY3Z0X21vZGUueHJlcyA9IHhyZXM7CisJICAgIGN2dF9tb2RlLnlyZXMgPSB5cmVzOworCSAgICBjdnRfbW9kZS5yZWZyZXNoID0gKHJlZnJlc2gpID8gcmVmcmVzaCA6IDYwOworCisJICAgIGlmIChpbnRlcmxhY2UpCisJCWN2dF9tb2RlLnZtb2RlIHw9IEZCX1ZNT0RFX0lOVEVSTEFDRUQ7CisJICAgIGVsc2UKKwkJY3Z0X21vZGUudm1vZGUgJj0gfkZCX1ZNT0RFX0lOVEVSTEFDRUQ7CisKKwkgICAgcmV0ID0gZmJfZmluZF9tb2RlX2N2dCgmY3Z0X21vZGUsIG1hcmdpbnMsIHJiKTsKKworCSAgICBpZiAoIXJldCAmJiAhZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmY3Z0X21vZGUsIGJwcCkpIHsKKwkJRFBSSU5USygibW9kZWRiIENWVDogQ1ZUIG1vZGUgb2tcbiIpOworCQlyZXR1cm4gMTsKKwkgICAgfQorCisJICAgIERQUklOVEsoIkNWVCBtb2RlIGludmFsaWQsIGdldHRpbmcgbW9kZSBmcm9tIGRhdGFiYXNlXG4iKTsKKwl9CisKIAlEUFJJTlRLKCJUcnlpbmcgc3BlY2lmaWVkIHZpZGVvIG1vZGUlcyAlaXglaVxuIiwKIAkgICAgcmVmcmVzaF9zcGVjaWZpZWQgPyAiIiA6ICIgKGlnbm9yaW5nIHJlZnJlc2ggcmF0ZSkiLCB4cmVzLCB5cmVzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9pMmMuYwppbmRleCAxYTkxYmZmLi5hY2U0ODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9pMmMuYwpAQCAtMTk0LDggKzE5NCw5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBudmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyLCBpbnQgY29ubiwgdTggKipvdXRfZWRpZCkKK2ludCBudmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGNvbm4sIHU4ICoqb3V0X2VkaWQpCiB7CisJc3RydWN0IG52aWRpYV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCAqZWRpZCA9IE5VTEw7CiAJaW50IGk7CiAKQEAgLTIwNSwxMCArMjA2LDE3IEBACiAJCWlmIChlZGlkKQogCQkJYnJlYWs7CiAJfQorCisJaWYgKCFlZGlkICYmIGNvbm4gPT0gMSkgeworCQkvKiB0cnkgdG8gZ2V0IGZyb20gZmlybXdhcmUgKi8KKwkJZWRpZCA9IGttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOworCQlpZiAoZWRpZCkKKwkJCW1lbWNweShlZGlkLCBmYl9maXJtd2FyZV9lZGlkKGluZm8tPmRldmljZSksCisJCQkgICAgICAgRURJRF9MRU5HVEgpOworCX0KKwogCWlmIChvdXRfZWRpZCkKIAkJKm91dF9lZGlkID0gZWRpZDsKLQlpZiAoIWVkaWQpCi0JCXJldHVybiAxOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIChlZGlkKSA/IDAgOiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfbG9jYWwuaCBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2xvY2FsLmgKaW5kZXggOWRhMzIwOS4uYWZlZTI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfbG9jYWwuaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9sb2NhbC5oCkBAIC05NSw2ICs5NSw3IEBACiAKICNkZWZpbmUgUkVBRF9HRVQocGFyKSAoTlZfUkQzMigmKHBhciktPkZJRk9bMHgwMDExXSwgMCkgPj4gMikKIAorI2lmZGVmIF9fTElUVExFX0VORElBTgogI2RlZmluZSByZXZlcnNlX29yZGVyKGwpICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl1OCAqYSA9ICh1OCAqKShsKTsgICAgICBcCkBAIC0xMDMsNSArMTA0LDggQEAKIAkqYSA9IGJ5dGVfcmV2WyphXSwgYSsrOyBcCiAJKmEgPSBieXRlX3JldlsqYV07ICAgICAgXAogfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgcmV2ZXJzZV9vcmRlcihsKQorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KIAogI2VuZGlmCQkJCS8qIF9fTlZfTE9DQUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9vZi5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfb2YuYwppbmRleCA3ZDEyZWI4NS4uNGZhMmNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfb2YuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9vZi5jCkBAIC0zMCw4ICszMCw5IEBACiB2b2lkIG52aWRpYV9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKSB7fQogdm9pZCBudmlkaWFfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IG52aWRpYV9wYXIgKnBhcikge30KIAotaW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIGludCBjb25uLCB1OCAqKm91dF9lZGlkKQoraW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgY29ubiwgdTggKipvdXRfZWRpZCkKIHsKKwlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJdW5zaWduZWQgY2hhciAqcGVkaWQgPSBOVUxMOwogCXVuc2lnbmVkIGNoYXIgKmRpc3B0eXBlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9wcm90by5oCmluZGV4IDQyODQ3Y2UuLmNhYzQ0ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmgKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaApAQCAtMzQsNyArMzQsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX05WSURJQV9JMkMpIHx8IGRlZmluZWQgKENPTkZJR19QUENfT0YpCiB2b2lkIG52aWRpYV9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKTsKIHZvaWQgbnZpZGlhX2RlbGV0ZV9pMmNfYnVzc2VzKHN0cnVjdCBudmlkaWFfcGFyICpwYXIpOwotaW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIGludCBjb25uLAoraW50IG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgY29ubiwKIAkJCSAgICAgICB1OCAqKiBvdXRfZWRpZCk7CiAjZWxzZQogI2RlZmluZSBudmlkaWFfY3JlYXRlX2kyY19idXNzZXMoLi4uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKaW5kZXggMGJiZGNhMi4uMTFjODQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAludmlkaWFfY3JlYXRlX2kyY19idXNzZXMocGFyKTsKIAlpZiAoIXBhci0+dHdvSGVhZHMpIHsKIAkJcGFyLT5DUlRDbnVtYmVyID0gMDsKLQkJbnZpZGlhX3Byb2JlX2kyY19jb25uZWN0b3IocGFyLCAxLCAmZWRpZEEpOworCQludmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihpbmZvLCAxLCAmZWRpZEEpOwogCQlpZiAoZWRpZEEgJiYgIWZiX3BhcnNlX2VkaWQoZWRpZEEsICZ2YXIpKSB7CiAJCQlwcmludGsoIm52aWRpYWZiOiBFRElEIGZvdW5kIGZyb20gQlVTMVxuIik7CiAJCQltb25BID0gJm1vbml0b3JBOwpAQCAtNDg4LDE0ICs0ODgsMTQgQEAKIAkJb2xkaGVhZCA9IE5WX1JEMzIocGFyLT5QQ1JUQzAsIDB4MDAwMDA4NjApOwogCQlOVl9XUjMyKHBhci0+UENSVEMwLCAweDAwMDAwODYwLCBvbGRoZWFkIHwgMHgwMDAwMDAxMCk7CiAKLQkJbnZpZGlhX3Byb2JlX2kyY19jb25uZWN0b3IocGFyLCAxLCAmZWRpZEEpOworCQludmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihpbmZvLCAxLCAmZWRpZEEpOwogCQlpZiAoZWRpZEEgJiYgIWZiX3BhcnNlX2VkaWQoZWRpZEEsICZ2YXIpKSB7CiAJCQlwcmludGsoIm52aWRpYWZiOiBFRElEIGZvdW5kIGZyb20gQlVTMVxuIik7CiAJCQltb25BID0gJm1vbml0b3JBOwogCQkJZmJfZWRpZF90b19tb25zcGVjcyhlZGlkQSwgbW9uQSk7CiAJCX0KIAotCQludmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihwYXIsIDIsICZlZGlkQik7CisJCW52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKGluZm8sIDIsICZlZGlkQik7CiAJCWlmIChlZGlkQiAmJiAhZmJfcGFyc2VfZWRpZChlZGlkQiwgJnZhcikpIHsKIAkJCXByaW50aygibnZpZGlhZmI6IEVESUQgZm91bmQgZnJvbSBCVVMyXG4iKTsKIAkJCW1vbkIgPSAmbW9uaXRvckI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCmluZGV4IDUyYjE2ODUuLjM2MjBkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCkBAIC02NTgsNyArNjU4LDcgQEAKIHsKIAlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBfcml2YV9od19zdGF0ZSAqc3RhdGUgPSAmcGFyLT5Nb2RlUmVnOwotCWludCBpLCBkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyKTsKKwlpbnQgaSwgZGVwdGggPSBmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCk7CiAJaW50IGhfZGlzcGxheSA9IGluZm8tPnZhci54cmVzIC8gOCAtIDE7CiAJaW50IGhfc3RhcnQgPSAoaW5mby0+dmFyLnhyZXMgKyBpbmZvLT52YXIucmlnaHRfbWFyZ2luKSAvIDggLSAxOwogCWludCBoX2VuZCA9IChpbmZvLT52YXIueHJlcyArIGluZm8tPnZhci5yaWdodF9tYXJnaW4gKwpAQCAtODkzLDcgKzg5Myw3IEBACiAJaW50IGksIHNldCA9IGN1cnNvci0+c2V0OwogCXUxNiBmZywgYmc7CiAKLQlpZiAoY3Vyc29yLT5pbWFnZS53aWR0aCA+IE1BWF9DVVJTIHx8IGN1cnNvci0+aW1hZ2UuaGVpZ2h0ID4gTUFYX0NVUlMpCisJaWYgKCFod2N1ciB8fCBjdXJzb3ItPmltYWdlLndpZHRoID4gTUFYX0NVUlMgfHwgY3Vyc29yLT5pbWFnZS5oZWlnaHQgPiBNQVhfQ1VSUykKIAkJcmV0dXJuIC1FTlhJTzsKIAogCU5WU2hvd0hpZGVDdXJzb3IocGFyLCAwKTsKQEAgLTk3OCw2ICs5NzgsOSBAQAogCSAgICAhcGFyLT50d29IZWFkcykKIAkJcGFyLT5GUERpdGhlciA9IDA7CiAKKwlpbmZvLT5maXgudmlzdWFsID0gKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSA4KSA/CisJICAgIEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjsKKwogCW52aWRpYV9pbml0X3ZnYShpbmZvKTsKIAludmlkaWFfY2FsY19yZWdzKGluZm8pOwogCW52aWRpYV93cml0ZV9yZWdzKHBhcik7CkBAIC05OTIsOSArOTk1LDYgQEAKIAlOVldyaXRlQ3J0YyhwYXIsIDB4MTEsIDB4MDApOwogCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IChpbmZvLT52YXIueHJlc192aXJ0dWFsICoKIAkJCQkgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSA+PiAzOwotCWluZm8tPmZpeC52aXN1YWwgPSAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpID8KLQkgICAgRkJfVklTVUFMX1BTRVVET0NPTE9SIDogRkJfVklTVUFMX0RJUkVDVENPTE9SOwotCiAJaWYgKGluZm8tPnZhci5hY2NlbF9mbGFncykgewogCQlpbmZvLT5mYm9wcy0+ZmJfaW1hZ2VibGl0ID0gbnZpZGlhZmJfaW1hZ2VibGl0OwogCQlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QgPSBudmlkaWFmYl9maWxscmVjdDsKQEAgLTEzMjgsNyArMTMyOCw3IEBACiAJCWNoYXIgYnVmWzE2XTsKIAogCQltZW1zZXQoYnVmLCAwLCAxNik7Ci0JCXNucHJpbnRmKGJ1ZiwgMTUsICIlZHglZCIsIHBhci0+ZnBXaWR0aCwgcGFyLT5mcEhlaWdodCk7CisJCXNucHJpbnRmKGJ1ZiwgMTUsICIlZHglZE1SIiwgcGFyLT5mcFdpZHRoLCBwYXItPmZwSGVpZ2h0KTsKIAkJZmJfZmluZF9tb2RlKCZudmlkaWFmYl9kZWZhdWx0X3ZhciwgaW5mbywgYnVmLCBzcGVjcy0+bW9kZWRiLAogCQkJICAgICBzcGVjcy0+bW9kZWRiX2xlbiwgJm1vZGVkYiwgOCk7CiAJfQpAQCAtMTM1Niw4ICsxMzU2LDYgQEAKIAlpbmZvLT5waXhtYXAuc2l6ZSA9IDggKiAxMDI0OwogCWluZm8tPnBpeG1hcC5mbGFncyA9IEZCX1BJWE1BUF9TWVNURU07CiAKLQlpZiAoIWh3Y3VyKQotCQlpbmZvLT5mYm9wcy0+ZmJfY3Vyc29yID0gc29mdF9jdXJzb3I7CiAJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gKCFub2FjY2VsKTsKIAogCXN3aXRjaCAocGFyLT5BcmNoaXRlY3R1cmUpIHsKQEAgLTE0NzMsMTAgKzE0NzEsNiBAQAogCXBhci0+Q2hpcHNldCA9IChwZC0+dmVuZG9yIDw8IDE2KSB8IHBkLT5kZXZpY2U7CiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5WaWRpYSBkZXZpY2UvY2hpcHNldCAlWFxuIiwgcGFyLT5DaGlwc2V0KTsKIAotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXNcbiIsIHBkLT5wcmV0dHlfbmFtZSk7Ci0jZW5kaWYKLQogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInVua25vd24gTlZfQVJDSFxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX2Jhc2UwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwppbmRleCA0MmE2NTkxLi42MTE5MjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCWFkZHJlc3MgPSAodV9sb25nKSBkcC0+YWRkcnNbaV0uYWRkcmVzczsKIAogI2lmZGVmIENPTkZJR19QUEM2NAotCQlhZGRyZXNzICs9IGRwLT5waGItPnBjaV9tZW1fb2Zmc2V0OworCQlhZGRyZXNzICs9ICgoc3RydWN0IHBjaV9kbiAqKWRwLT5kYXRhKS0+cGhiLT5wY2lfbWVtX29mZnNldDsKICNlbmRpZgogCiAJCS8qIGtsdWRnZSBmb3IgdmFsa3lyaWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYyBiL2RyaXZlcnMvdmlkZW8vcHhhZmIuYwppbmRleCAzMDExMjgxLi4zNGQ0ZGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9weGFmYi5jCkBAIC00NjgsNiArNDY4LDM2IEBACiB9CiAKIC8qCisgKiBTb21lIHRvdWNoc2NyZWVucyBuZWVkIGhzeW5jIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpZGVvIGRyaXZlciB0bworICogZnVuY3Rpb24gY29ycmVjdGx5LiBXZSBleHBvcnQgaXQgaGVyZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9oc3luY190aW1lKHN0cnVjdCBweGFmYl9pbmZvICpmYmksIHVuc2lnbmVkIGludCBwY2QpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGh0aW1lOworCisJaWYgKChwY2QgPT0gMCkgfHwgKGZiaS0+ZmIudmFyLmhzeW5jX2xlbiA9PSAwKSkgeworCQlmYmktPmhzeW5jX3RpbWU9MDsKKwkJcmV0dXJuOworCX0KKworCWh0aW1lID0gKHVuc2lnbmVkIGxvbmcgbG9uZylnZXRfbGNkY2xrX2ZyZXF1ZW5jeV8xMGtoeigpICogMTAwMDA7CisJZG9fZGl2KGh0aW1lLCBwY2QgKiBmYmktPmZiLnZhci5oc3luY19sZW4pOworCWZiaS0+aHN5bmNfdGltZSA9IGh0aW1lOworfQorCit1bnNpZ25lZCBsb25nIHB4YWZiX2dldF9oc3luY190aW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkvKiBJZiBkaXNwbGF5IGlzIGJsYW5rZWQvc3VzcGVuZGVkLCBoc3luYyBpc24ndCBhY3RpdmUgKi8KKwlpZiAoIWZiaSB8fCAoZmJpLT5zdGF0ZSAhPSBDX0VOQUJMRSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGZiaS0+aHN5bmNfdGltZTsKK30KK0VYUE9SVF9TWU1CT0wocHhhZmJfZ2V0X2hzeW5jX3RpbWUpOworCisvKgogICogcHhhZmJfYWN0aXZhdGVfdmFyKCk6CiAgKglDb25maWd1cmVzIExDRCBDb250cm9sbGVyIGJhc2VkIG9uIGVudHJpZXMgaW4gdmFyIHBhcmFtZXRlci4gIFNldHRpbmdzIGFyZQogICoJb25seSB3cml0dGVuIHRvIHRoZSBjb250cm9sbGVyIGlmIGNoYW5nZXMgd2VyZSBtYWRlLgpAQCAtNjMxLDYgKzY2MSw3IEBACiAJZmJpLT5yZWdfbGNjcjEgPSBuZXdfcmVncy5sY2NyMTsKIAlmYmktPnJlZ19sY2NyMiA9IG5ld19yZWdzLmxjY3IyOwogCWZiaS0+cmVnX2xjY3IzID0gbmV3X3JlZ3MubGNjcjM7CisJc2V0X2hzeW5jX3RpbWUoZmJpLCBwY2QpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCS8qCkBAIC05MDcsNiArOTM4LDcgQEAKIAogCWNhc2UgQ1BVRlJFUV9QT1NUQ0hBTkdFOgogCQlwY2QgPSBnZXRfcGNkKGZiaS0+ZmIudmFyLnBpeGNsb2NrKTsKKwkJc2V0X2hzeW5jX3RpbWUoZmJpLCBwY2QpOwogCQlmYmktPnJlZ19sY2NyMyA9IChmYmktPnJlZ19sY2NyMyAmIH4weGZmKSB8IExDQ1IzX1BpeENsa0RpdihwY2QpOwogCQlzZXRfY3RybHJfc3RhdGUoZmJpLCBDX0VOQUJMRV9DTEtDSEFOR0UpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuaCBiL2RyaXZlcnMvdmlkZW8vcHhhZmIuaAppbmRleCBkZTE1ZmVjLi4yMmMwMGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B4YWZiLmgKKysrIGIvZHJpdmVycy92aWRlby9weGFmYi5oCkBAIC04Myw2ICs4Myw4IEBACiAJdV9pbnQJCQlyZWdfbGNjcjI7CiAJdV9pbnQJCQlyZWdfbGNjcjM7CiAKKwl1bnNpZ25lZCBsb25nCWhzeW5jX3RpbWU7CisKIAl2b2xhdGlsZSB1X2NoYXIJCXN0YXRlOwogCXZvbGF0aWxlIHVfY2hhcgkJdGFza19zdGF0ZTsKIAlzdHJ1Y3Qgc2VtYXBob3JlCWN0cmxyX3NlbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcTQwZmIuYyBiL2RyaXZlcnMvdmlkZW8vcTQwZmIuYwppbmRleCA3MWI2OWRhLi4xNjIwMTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9xNDBmYi5jCkBAIC0yMSw3ICsyMSw2IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9xNDBfbWFzdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcml2YS9mYmRldi5jIGIvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKaW5kZXggYWUyOTdlMi4uM2U5Zjk2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKKysrIGIvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKQEAgLTE5MzYsMTAgKzE5MzYsNiBAQAogCWRlZmF1bHRfcGFyLT5DaGlwc2V0ID0gKHBkLT52ZW5kb3IgPDwgMTYpIHwgcGQtPmRldmljZTsKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiblZpZGlhIGRldmljZS9jaGlwc2V0ICVYXG4iLGRlZmF1bHRfcGFyLT5DaGlwc2V0KTsKIAkKLSNpZmRlZiBDT05GSUdfUENJX05BTUVTCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzXG4iLCBwZC0+cHJldHR5X25hbWUpOwotI2VuZGlmCi0KIAlpZihkZWZhdWx0X3Bhci0+cml2YS5BcmNoaXRlY3R1cmUgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmtub3duIE5WX0FSQ0hcbiIpOwogCQlyZXQ9LUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzAyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYworICoJQ29weXJpZ2h0IChjKSBBcm5hdWQgUGF0YXJkLCBCZW4gRG9va3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICoJICAgIFMzQzI0MTAgTENEIENvbnRyb2xsZXIgRnJhbWUgQnVmZmVyIERyaXZlcgorICoJICAgIGJhc2VkIG9uIHNrZWxldG9uZmIuYywgc2ExMTAwZmIuYyBhbmQgb3RoZXJzCisgKgorICogQ2hhbmdlTG9nCisgKiAyMDA1LTA0LTA3OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogICAgICAtIHUzMiBzdGF0ZSAtPiBwbV9tZXNzYWdlX3Qgc3RhdGUKKyAqICAgICAgLSBTM0MyNDEwX3tWQSxTWn1fTENEIC0+IFMzQzI0WFgKKyAqCisgKiAyMDA1LTAzLTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogICAgICAtIFJlbW92ZWQgdGhlIGlvY3RsCisgKiAgICAgIC0gdXNlIHJlYWRsL3dyaXRlbCBpbnN0ZWFkIG9mIF9fcmF3X3dyaXRlbC9fX3Jhd19yZWFkbAorICoKKyAqIDIwMDQtMTItMDQ6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAgICAgIC0gQWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIHNldCBvbiBvciBvZmYgdGhlCisgKiAgICAgIGRlYnVnZ2luZyBtZXNhYWdlcworICogICAgICAtIFJlcGxhY2VkIDAgYW5kIDEgYnkgb24gb3Igb2ZmIHdoZW4gcmVhZGluZyB0aGUKKyAqICAgICAgL3N5cyBmaWxlcworICoKKyAqIDIwMDUtMDMtMjM6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KKyAqCS0gYWRkZWQgbm9uIDE2YnBwIG1vZGVzCisgKgktIHVwZGF0ZWQgcGxhdGZvcm0gaW5mb3JtYXRpb24gZm9yIHJhbmdlIG9mIHgveS9icHAKKyAqCS0gYWRkIGNvZGUgdG8gZW5zdXJlIHBhbGV0dGUgaXMgd3JpdHRlbiBjb3JyZWN0bHkKKyAqCS0gYWRkIHBpeGVsIGNsb2NrIGRpdmlzb3IgY29udHJvbAorICoKKyAqIDIwMDQtMTEtMTE6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAJLSBSZW1vdmVkIHRoZSB1c2Ugb2YgY3VycmNvbiBhcyBpdCBubyBtb3JlIGV4aXN0CisgKiAJLSBBZGRlZCBMQ0QgcG93ZXIgc3lzZnMgaW50ZXJmYWNlCisgKgorICogMjAwNC0xMS0wMzogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPgorICoJLSBtaW5vciBjbGVhbnVwcworICoJLSBhZGQgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydAorICoJLSBzM2MyNDEwZmJfc2V0Y29scmVnKCkgbm90IHZhbGlkIGluID44YnBwIG1vZGVzCisgKgktIHJlbW92ZWQgbGFzdCBDT05GSUdfRkJfUzNDMjQxMF9GSVhFRAorICoJLSBlbnN1cmUgbGNkIGNvbnRyb2xsZXIgc3RvcHBlZCBiZWZvcmUgY2xlYW51cAorICoJLSBhZGRlZCBzeXNmcyBpbnRlcmZhY2UgZm9yIGJhY2tsaWdodCBwb3dlcgorICoJLSBhZGRlZCBtYXNrIGZvciBncGlvIGNvbmZpZ3VyYXRpb24KKyAqCS0gZW5zdXJlZCBJUlFzIGRpc2FibGVkIGR1cmluZyBHUElPIGNvbmZpZ3VyYXRpb24KKyAqCS0gZGlzYWJsZSBUUEFMIGJlZm9yZSBlbmFibGluZyB2aWRlbworICoKKyAqIDIwMDQtMDktMjA6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAgICAgIC0gU3VwcHJlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyAqCisgKiAyMDA0LTA5LTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogCS0gY29kZSBjbGVhbnVwCisgKgorICogMjAwNC0wOS0wNzogQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqIAktIFJlbmFtZWQgZnJvbSBoMTk0MGZiLmMgdG8gczNjMjQxMGZiLmMKKyAqIAktIEFkZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGV2aWNlcworICogCS0gQmFja2xpZ2h0IHN1cHBvcnQKKyAqCisgKiAyMDA0LTA5LTA1OiBIZXJiZXJ0IFD2dHpsIDxoZXJiZXJ0QDEzdGhmbG9vci5hdD4KKyAqCS0gYWRkZWQgY2xvY2sgKGRlLSlhbGxvY2F0aW9uIGNvZGUKKyAqCS0gYWRkZWQgZml4ZW0gZmJtZW0gb3B0aW9uCisgKgorICogMjAwNC0wNy0yNzogQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqCS0gY29kZSBjbGVhbnVwCisgKgktIGFkZGVkIGEgZm9yZ290dGVuIHJldHVybiBpbiBoMTk0MGZiX2luaXQKKyAqCisgKiAyMDA0LTA3LTE5OiBIZXJiZXJ0IFD2dHpsIDxoZXJiZXJ0QDEzdGhmbG9vci5hdD4KKyAqCS0gY29kZSBjbGVhbnVwIGFuZCBleHRlbmRlZCBkZWJ1Z2dpbmcKKyAqCisgKiAyMDA0LTA3LTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICoJLSBGaXJzdCB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWxjZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZiLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisKKyNpZmRlZiBDT05GSUdfUE0KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzM2MyNDEwZmIuaCIKKworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKm1hY2hfaW5mbzsKKworLyogRGVidWdnaW5nIHN0dWZmICovCisjaWZkZWYgQ09ORklHX0ZCX1MzQzI0MTBfREVCVUcKK3N0YXRpYyBpbnQgZGVidWcJICAgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVidWcJICAgPSAwOworI2VuZGlmCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pCWlmIChkZWJ1ZykgeyBwcmludGsoS0VSTl9ERUJVRyAiczNjMjQxMGZiOiAiIG1zZyk7IH0KKworLyogdXNlZnVsIGZ1bmN0aW9ucyAqLworCisvKiBzM2MyNDEwZmJfc2V0X2xjZGFkZHIKKyAqCisgKiBpbml0aWFsaXNlIGxjZCBjb250cm9sbGVyIGFkZHJlc3MgcG9pbnRlcnMKKyovCisKK3N0YXRpYyB2b2lkIHMzYzI0MTBmYl9zZXRfbGNkYWRkcihzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPmZiLT52YXI7CisJdW5zaWduZWQgbG9uZyBzYWRkcjEsIHNhZGRyMiwgc2FkZHIzOworCisJc2FkZHIxICA9IGZiaS0+ZmItPmZpeC5zbWVtX3N0YXJ0ID4+IDE7CisJc2FkZHIyICA9IGZiaS0+ZmItPmZpeC5zbWVtX3N0YXJ0OworCXNhZGRyMiArPSAodmFyLT54cmVzICogdmFyLT55cmVzICogdmFyLT5iaXRzX3Blcl9waXhlbCkvODsKKwlzYWRkcjI+Pj0gMTsKKworCXNhZGRyMyA9ICBTM0MyNDEwX09GRlNJWkUoMCkgfCBTM0MyNDEwX1BBR0VXSURUSCh2YXItPnhyZXMpOworCisJZHByaW50aygiTENEU0FERFIxID0gMHglMDhseFxuIiwgc2FkZHIxKTsKKwlkcHJpbnRrKCJMQ0RTQUREUjIgPSAweCUwOGx4XG4iLCBzYWRkcjIpOworCWRwcmludGsoIkxDRFNBRERSMyA9IDB4JTA4bHhcbiIsIHNhZGRyMyk7CisKKwl3cml0ZWwoc2FkZHIxLCBTM0MyNDEwX0xDRFNBRERSMSk7CisJd3JpdGVsKHNhZGRyMiwgUzNDMjQxMF9MQ0RTQUREUjIpOworCXdyaXRlbChzYWRkcjMsIFMzQzI0MTBfTENEU0FERFIzKTsKK30KKworLyogczNjMjQxMGZiX2NhbGNfcGl4Y2xrKCkKKyAqCisgKiBjYWxjdWxhdGUgZGl2aXNvciBmb3IgY2xrLT5waXhjbGsKKyovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgczNjMjQxMGZiX2NhbGNfcGl4Y2xrKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGl4Y2xrKQoreworCXVuc2lnbmVkIGxvbmcgY2xrID0gY2xrX2dldF9yYXRlKGZiaS0+Y2xrKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGl2OworCisJLyogcGl4Y2xrIGlzIGluIHBpY29zZW9uY2RzLCBvdXIgY2xvY2sgaXMgaW4gSHoKKwkgKgorCSAqIEh6IC0+IHBpY29zZWNvbmRzIGlzIC8gMTBeLTEyCisJICovCisKKwlkaXYgPSAodW5zaWduZWQgbG9uZyBsb25nKWNsayAqIHBpeGNsazsKKwlkb19kaXYoZGl2LDEwMDAwMDBVTCk7CisJZG9fZGl2KGRpdiwxMDAwMDAwVUwpOworCisJZHByaW50aygicGl4Y2xrICVsZCwgZGl2aXNvciBpcyAlbGRcbiIsIHBpeGNsaywgKGxvbmcpZGl2KTsKKwlyZXR1cm4gZGl2OworfQorCisvKgorICoJczNjMjQxMGZiX2NoZWNrX3ZhcigpOgorICoJR2V0IHRoZSB2aWRlbyBwYXJhbXMgb3V0IG9mICd2YXInLiBJZiBhIHZhbHVlIGRvZXNuJ3QgZml0LCByb3VuZCBpdCB1cCwKKyAqCWlmIGl0J3MgdG9vIGJpZywgcmV0dXJuIC1FSU5WQUwuCisgKgorICovCitzdGF0aWMgaW50IHMzYzI0MTBmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7CisKKwlkcHJpbnRrKCJjaGVja192YXIodmFyPSVwLCBpbmZvPSVwKVxuIiwgdmFyLCBpbmZvKTsKKworCS8qIHZhbGlkYXRlIHgveSByZXNvbHV0aW9uICovCisKKwlpZiAodmFyLT55cmVzID4gZmJpLT5tYWNoX2luZm8tPnlyZXMubWF4KQorCQl2YXItPnlyZXMgPSBmYmktPm1hY2hfaW5mby0+eXJlcy5tYXg7CisJZWxzZSBpZiAodmFyLT55cmVzIDwgZmJpLT5tYWNoX2luZm8tPnlyZXMubWluKQorCQl2YXItPnlyZXMgPSBmYmktPm1hY2hfaW5mby0+eXJlcy5taW47CisKKwlpZiAodmFyLT54cmVzID4gZmJpLT5tYWNoX2luZm8tPnhyZXMubWF4KQorCQl2YXItPnlyZXMgPSBmYmktPm1hY2hfaW5mby0+eHJlcy5tYXg7CisJZWxzZSBpZiAodmFyLT54cmVzIDwgZmJpLT5tYWNoX2luZm8tPnhyZXMubWluKQorCQl2YXItPnhyZXMgPSBmYmktPm1hY2hfaW5mby0+eHJlcy5taW47CisKKwkvKiB2YWxpZGF0ZSBicHAgKi8KKworCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID4gZmJpLT5tYWNoX2luZm8tPmJwcC5tYXgpCisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmktPm1hY2hfaW5mby0+YnBwLm1heDsKKwllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDwgZmJpLT5tYWNoX2luZm8tPmJwcC5taW4pCisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmktPm1hY2hfaW5mby0+YnBwLm1pbjsKKworCS8qIHNldCByL2cvYiBwb3NpdGlvbnMgKi8KKworCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDE2KSB7CisJCXZhci0+cmVkLm9mZnNldAkJPSAxMTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQJPSA1OworCQl2YXItPmJsdWUub2Zmc2V0CT0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoCQk9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoCT0gNjsKKwkJdmFyLT5ibHVlLmxlbmd0aAk9IDU7CisJCXZhci0+dHJhbnNwLmxlbmd0aAk9IDA7CisJfSBlbHNlIHsKKwkJdmFyLT5yZWQubGVuZ3RoCQk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCXZhci0+cmVkLm9mZnNldAkJPSAwOworCQl2YXItPmdyZWVuLmxlbmd0aAk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCXZhci0+Z3JlZW4ub2Zmc2V0CT0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aAk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCXZhci0+Ymx1ZS5vZmZzZXQJPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGgJPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzM2MyNDEwZmJfYWN0aXZhdGVfdmFyCisgKgorICogYWN0aXZhdGUgKHNldCkgdGhlIGNvbnRyb2xsZXIgZnJvbSB0aGUgZ2l2ZW4gZnJhbWVidWZmZXIKKyAqIGluZm9ybWF0aW9uCisqLworCitzdGF0aWMgaW50IHMzYzI0MTBmYl9hY3RpdmF0ZV92YXIoc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmksCisJCQkJICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlmYmktPnJlZ3MubGNkY29uMSAmPSB+UzNDMjQxMF9MQ0RDT04xX01PREVNQVNLOworCisJZHByaW50aygiJXM6IHZhci0+eHJlcyAgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB2YXItPnhyZXMpOworCWRwcmludGsoIiVzOiB2YXItPnlyZXMgID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgdmFyLT55cmVzKTsKKwlkcHJpbnRrKCIlczogdmFyLT5icHAgICA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhci0+Yml0c19wZXJfcGl4ZWwpOworCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxOgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMUJQUDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMkJQUDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUNEJQUDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUOEJQUDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZmJpLT5yZWdzLmxjZGNvbjEgfD0gUzNDMjQxMF9MQ0RDT04xX1RGVDE2QlBQOworCQlicmVhazsKKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgc3luYy9ib3JkZXJzICovCisKKwlpZiAoIWZiaS0+bWFjaF9pbmZvLT5maXhlZF9zeW5jcykgeworCQlkcHJpbnRrKCJzZXR0aW5nIHZlcnQ6IHVwPSVkLCBsb3c9JWQsIHN5bmM9JWRcbiIsCisJCQl2YXItPnVwcGVyX21hcmdpbiwgdmFyLT5sb3dlcl9tYXJnaW4sCisJCQl2YXItPnZzeW5jX2xlbik7CisKKwkJZHByaW50aygic2V0dGluZyBob3J6OiBsZnQ9JWQsIHJ0PSVkLCBzeW5jPSVkXG4iLAorCQkJdmFyLT5sZWZ0X21hcmdpbiwgdmFyLT5yaWdodF9tYXJnaW4sCisJCQl2YXItPmhzeW5jX2xlbik7CisKKwkJZmJpLT5yZWdzLmxjZGNvbjIgPQorCQkJUzNDMjQxMF9MQ0RDT04yX1ZCUEQodmFyLT51cHBlcl9tYXJnaW4gLSAxKSB8CisJCQlTM0MyNDEwX0xDRENPTjJfVkZQRCh2YXItPmxvd2VyX21hcmdpbiAtIDEpIHwKKwkJCVMzQzI0MTBfTENEQ09OMl9WU1BXKHZhci0+dnN5bmNfbGVuIC0gMSk7CisKKwkJZmJpLT5yZWdzLmxjZGNvbjMgPQorCQkJUzNDMjQxMF9MQ0RDT04zX0hCUEQodmFyLT5yaWdodF9tYXJnaW4gLSAxKSB8CisJCQlTM0MyNDEwX0xDRENPTjNfSEZQRCh2YXItPmxlZnRfbWFyZ2luIC0gMSk7CisKKwkJZmJpLT5yZWdzLmxjZGNvbjQgJj0gflMzQzI0MTBfTENEQ09ONF9IU1BXKDB4ZmYpOworCQlmYmktPnJlZ3MubGNkY29uNCB8PSAgUzNDMjQxMF9MQ0RDT040X0hTUFcodmFyLT5oc3luY19sZW4gLSAxKTsKKwl9CisKKwkvKiB1cGRhdGUgWC9ZIGluZm8gKi8KKworCWZiaS0+cmVncy5sY2Rjb24yICY9IH5TM0MyNDEwX0xDRENPTjJfTElORVZBTCgweDNmZik7CisJZmJpLT5yZWdzLmxjZGNvbjIgfD0gIFMzQzI0MTBfTENEQ09OMl9MSU5FVkFMKHZhci0+eXJlcyAtIDEpOworCisJZmJpLT5yZWdzLmxjZGNvbjMgJj0gflMzQzI0MTBfTENEQ09OM19IT1pWQUwoMHg3ZmYpOworCWZiaS0+cmVncy5sY2Rjb24zIHw9ICBTM0MyNDEwX0xDRENPTjNfSE9aVkFMKHZhci0+eHJlcyAtIDEpOworCisJaWYgKHZhci0+cGl4Y2xvY2sgPiAwKSB7CisJCWludCBjbGtkaXYgPSBzM2MyNDEwZmJfY2FsY19waXhjbGsoZmJpLCB2YXItPnBpeGNsb2NrKTsKKworCQljbGtkaXYgPSAoY2xrZGl2IC8gMikgLTE7CisJCWlmIChjbGtkaXYgPCAwKQorCQkJY2xrZGl2ID0gMDsKKworCQlmYmktPnJlZ3MubGNkY29uMSAmPSB+UzNDMjQxMF9MQ0RDT04xX0NMS1ZBTCgweDNmZik7CisJCWZiaS0+cmVncy5sY2Rjb24xIHw9ICBTM0MyNDEwX0xDRENPTjFfQ0xLVkFMKGNsa2Rpdik7CisJfQorCisJLyogd3JpdGUgbmV3IHJlZ2lzdGVycyAqLworCisJZHByaW50aygibmV3IHJlZ2lzdGVyIHNldDpcbiIpOworCWRwcmludGsoImxjZGNvblsxXSA9IDB4JTA4bHhcbiIsIGZiaS0+cmVncy5sY2Rjb24xKTsKKwlkcHJpbnRrKCJsY2Rjb25bMl0gPSAweCUwOGx4XG4iLCBmYmktPnJlZ3MubGNkY29uMik7CisJZHByaW50aygibGNkY29uWzNdID0gMHglMDhseFxuIiwgZmJpLT5yZWdzLmxjZGNvbjMpOworCWRwcmludGsoImxjZGNvbls0XSA9IDB4JTA4bHhcbiIsIGZiaS0+cmVncy5sY2Rjb240KTsKKwlkcHJpbnRrKCJsY2Rjb25bNV0gPSAweCUwOGx4XG4iLCBmYmktPnJlZ3MubGNkY29uNSk7CisKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjEgJiB+UzNDMjQxMF9MQ0RDT04xX0VOVklELCBTM0MyNDEwX0xDRENPTjEpOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uMiwgUzNDMjQxMF9MQ0RDT04yKTsKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjMsIFMzQzI0MTBfTENEQ09OMyk7CisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb240LCBTM0MyNDEwX0xDRENPTjQpOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uNSwgUzNDMjQxMF9MQ0RDT041KTsKKworCS8qIHNldCBsY2QgYWRkcmVzcyBwb2ludGVycyAqLworCXMzYzI0MTBmYl9zZXRfbGNkYWRkcihmYmkpOworCisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb24xLCBTM0MyNDEwX0xDRENPTjEpOworfQorCisKKy8qCisgKiAgICAgIHMzYzI0MTBmYl9zZXRfcGFyIC0gT3B0aW9uYWwgZnVuY3Rpb24uIEFsdGVycyB0aGUgaGFyZHdhcmUgc3RhdGUuCisgKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCisJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMTYpCisJCWZiaS0+ZmItPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCWVsc2UKKwkJZmJpLT5mYi0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKworCWZiaS0+ZmItPmZpeC5saW5lX2xlbmd0aCAgICAgPSAodmFyLT53aWR0aCp2YXItPmJpdHNfcGVyX3BpeGVsKS84OworCisJLyogYWN0aXZhdGUgdGhpcyBuZXcgY29uZmlndXJhdGlvbiAqLworCisJczNjMjQxMGZiX2FjdGl2YXRlX3ZhcihmYmksIHZhcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3BhbGV0dGVfdXBkYXRlKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnbm8sIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGlycWVuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZmJpLT5wYWxldHRlX2J1ZmZlcltyZWdub10gPSB2YWw7CisKKwlpZiAoIWZiaS0+cGFsZXR0ZV9yZWFkeSkgeworCQlmYmktPnBhbGV0dGVfcmVhZHkgPSAxOworCisJCS8qIGVuYWJsZSBJUlEgKi8KKwkJaXJxZW4gPSByZWFkbChTM0MyNDEwX0xDRElOVE1TSyk7CisJCWlycWVuICY9IH5TM0MyNDEwX0xDRElOVF9GUlNZTkM7CisJCXdyaXRlbChpcnFlbiwgUzNDMjQxMF9MQ0RJTlRNU0spOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogZnJvbSBweGFmYi5jICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaGFuX3RvX2ZpZWxkKHVuc2lnbmVkIGludCBjaGFuLCBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQoreworCWNoYW4gJj0gMHhmZmZmOworCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKKwlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OworfQorCitzdGF0aWMgaW50IHMzYzI0MTBmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sCisJCQkgICAgICAgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKKwkJCSAgICAgICB1bnNpZ25lZCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBkcHJpbnRrKCJzZXRjb2w6IHJlZ25vPSVkLCByZ2I9JWQsJWQsJWRcbiIsIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlKTsgKi8KKworCXN3aXRjaCAoZmJpLT5mYi0+Zml4LnZpc3VhbCkgeworCWNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKKwkJLyogdHJ1ZS1jb2xvdXIsIHVzZSBwc2V1by1wYWxldHRlICovCisKKwkJaWYgKHJlZ25vIDwgMTYpIHsKKwkJCXUzMiAqcGFsID0gZmJpLT5mYi0+cHNldWRvX3BhbGV0dGU7CisKKwkJCXZhbCAgPSBjaGFuX3RvX2ZpZWxkKHJlZCwgICAmZmJpLT5mYi0+dmFyLnJlZCk7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChncmVlbiwgJmZiaS0+ZmItPnZhci5ncmVlbik7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChibHVlLCAgJmZiaS0+ZmItPnZhci5ibHVlKTsKKworCQkJcGFsW3JlZ25vXSA9IHZhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgorCQlpZiAocmVnbm8gPCAyNTYpIHsKKwkJCS8qIGN1cnJlbnRseSBhc3N1bWUgUkdCIDUtNi01IG1vZGUgKi8KKworCQkJdmFsICA9ICgocmVkICAgPj4gIDApICYgMHhmODAwKTsKKwkJCXZhbCB8PSAoKGdyZWVuID4+ICA1KSAmIDB4MDdlMCk7CisJCQl2YWwgfD0gKChibHVlICA+PiAxMSkgJiAweDAwMWYpOworCisJCQl3cml0ZWwodmFsLCBTM0MyNDEwX1RGVFBBTChyZWdubykpOworCQkJc2NoZWR1bGVfcGFsZXR0ZV91cGRhdGUoZmJpLCByZWdubywgdmFsKTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7ICAgLyogdW5rbm93biB0eXBlICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiAgICAgIHMzYzI0MTBmYl9ibGFuaworICoJQGJsYW5rX21vZGU6IHRoZSBibGFuayBtb2RlIHdlIHdhbnQuCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKgorICoJQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYKKyAqCWJsYW5raW5nIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkIGR1ZSB0byBlLmcuIGEKKyAqCXZpZGVvIG1vZGUgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGl0LiBJbXBsZW1lbnRzIFZFU0Egc3VzcGVuZAorICoJYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKKyAqCWJsYW5rX21vZGUgPT0gMjogc3VzcGVuZCB2c3luYworICoJYmxhbmtfbW9kZSA9PSAzOiBzdXNwZW5kIGhzeW5jCisgKglibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgorICoKKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMGZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlkcHJpbnRrKCJibGFuayhtb2RlPSVkLCBpbmZvPSVwKVxuIiwgYmxhbmtfbW9kZSwgaW5mbyk7CisKKwlpZiAobWFjaF9pbmZvID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJsYW5rX21vZGUgPT0gRkJfQkxBTktfVU5CTEFOSykKKwkJd3JpdGVsKDB4MCwgUzNDMjQxMF9UUEFMKTsKKwllbHNlIHsKKwkJZHByaW50aygic2V0dGluZyBUUEFMIHRvIG91dHB1dCAweDAwMDAwMFxuIik7CisJCXdyaXRlbChTM0MyNDEwX1RQQUxfRU4sIFMzQzI0MTBfVFBBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMGZiX2RlYnVnX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZWJ1ZyA/ICJvbiIgOiAib2ZmIik7Cit9CitzdGF0aWMgaW50IHMzYzI0MTBmYl9kZWJ1Z19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKG1hY2hfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJuaWNtcChidWYsICJvbiIsIDIpID09IDAgfHwKKwkgICAgc3RybmljbXAoYnVmLCAiMSIsIDEpID09IDApIHsKKwkJZGVidWcgPSAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiczNjMjQxMGZiOiBEZWJ1ZyBPbiIpOworCX0gZWxzZSBpZiAoc3RybmljbXAoYnVmLCAib2ZmIiwgMykgPT0gMCB8fAorCQkgICBzdHJuaWNtcChidWYsICIwIiwgMSkgPT0gMCkgeworCQlkZWJ1ZyA9IDA7CisJCXByaW50ayhLRVJOX0RFQlVHICJzM2MyNDEwZmI6IERlYnVnIE9mZiIpOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIERFVklDRV9BVFRSKGRlYnVnLCAwNjY2LAorCQkgICBzM2MyNDEwZmJfZGVidWdfc2hvdywKKwkJICAgczNjMjQxMGZiX2RlYnVnX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBmYl9vcHMgczNjMjQxMGZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3Zhcgk9IHMzYzI0MTBmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBzM2MyNDEwZmJfc2V0X3BhciwKKwkuZmJfYmxhbmsJPSBzM2MyNDEwZmJfYmxhbmssCisJLmZiX3NldGNvbHJlZwk9IHMzYzI0MTBmYl9zZXRjb2xyZWcsCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfY3Vyc29yCT0gc29mdF9jdXJzb3IsCit9OworCisKKy8qCisgKiBzM2MyNDEwZmJfbWFwX3ZpZGVvX21lbW9yeSgpOgorICoJQWxsb2NhdGVzIHRoZSBEUkFNIG1lbW9yeSBmb3IgdGhlIGZyYW1lIGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGlzCisgKglyZW1hcHBlZCBpbnRvIGEgbm9uLWNhY2hlZCwgbm9uLWJ1ZmZlcmVkLCBtZW1vcnkgcmVnaW9uIHRvCisgKglhbGxvdyBwYWxldHRlIGFuZCBwaXhlbCB3cml0ZXMgdG8gb2NjdXIgd2l0aG91dCBmbHVzaGluZyB0aGUKKyAqCWNhY2hlLiAgT25jZSB0aGlzIGFyZWEgaXMgcmVtYXBwZWQsIGFsbCB2aXJ0dWFsIG1lbW9yeQorICoJYWNjZXNzIHRvIHRoZSB2aWRlbyBtZW1vcnkgc2hvdWxkIG9jY3VyIGF0IHRoZSBuZXcgcmVnaW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSkKK3sKKwlkcHJpbnRrKCJtYXBfdmlkZW9fbWVtb3J5KGZiaT0lcClcbiIsIGZiaSk7CisKKwlmYmktPm1hcF9zaXplID0gUEFHRV9BTElHTihmYmktPmZiLT5maXguc21lbV9sZW4gKyBQQUdFX1NJWkUpOworCWZiaS0+bWFwX2NwdSAgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGZiaS0+ZGV2LCBmYmktPm1hcF9zaXplLAorCQkJCQkgICAgICAgJmZiaS0+bWFwX2RtYSwgR0ZQX0tFUk5FTCk7CisKKwlmYmktPm1hcF9zaXplID0gZmJpLT5mYi0+Zml4LnNtZW1fbGVuOworCisJaWYgKGZiaS0+bWFwX2NwdSkgeworCQkvKiBwcmV2ZW50IGluaXRpYWwgZ2FyYmFnZSBvbiBzY3JlZW4gKi8KKwkJZHByaW50aygibWFwX3ZpZGVvX21lbW9yeTogY2xlYXIgJXA6JTA4eFxuIiwKKwkJCWZiaS0+bWFwX2NwdSwgZmJpLT5tYXBfc2l6ZSk7CisJCW1lbXNldChmYmktPm1hcF9jcHUsIDB4ZjAsIGZiaS0+bWFwX3NpemUpOworCisJCWZiaS0+c2NyZWVuX2RtYQkJPSBmYmktPm1hcF9kbWE7CisJCWZiaS0+ZmItPnNjcmVlbl9iYXNlCT0gZmJpLT5tYXBfY3B1OworCQlmYmktPmZiLT5maXguc21lbV9zdGFydCAgPSBmYmktPnNjcmVlbl9kbWE7CisKKwkJZHByaW50aygibWFwX3ZpZGVvX21lbW9yeTogZG1hPSUwOHggY3B1PSVwIHNpemU9JTA4eFxuIiwKKwkJCWZiaS0+bWFwX2RtYSwgZmJpLT5tYXBfY3B1LCBmYmktPmZiLT5maXguc21lbV9sZW4pOworCX0KKworCXJldHVybiBmYmktPm1hcF9jcHUgPyAwIDogLUVOT01FTTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBmYl91bm1hcF92aWRlb19tZW1vcnkoc3RydWN0IHMzYzI0MTBmYl9pbmZvICpmYmkpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGZiaS0+ZGV2LGZiaS0+bWFwX3NpemUsZmJpLT5tYXBfY3B1LCBmYmktPm1hcF9kbWEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW9kaWZ5X2dwaW8odm9pZCBfX2lvbWVtICpyZWcsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzZXQsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXRtcCA9IHJlYWRsKHJlZykgJiB+bWFzazsKKwl3cml0ZWwodG1wIHwgc2V0LCByZWcpOworfQorCisKKy8qCisgKiBzM2MyNDEwZmJfaW5pdF9yZWdpc3RlcnMgLSBJbml0aWFsaXNlIGFsbCBMQ0QtcmVsYXRlZCByZWdpc3RlcnMKKyAqLworCitpbnQgczNjMjQxMGZiX2luaXRfcmVnaXN0ZXJzKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJbml0aWFsaXNlIExDRCB3aXRoIHZhbHVlcyBmcm9tIGhhcmV0ICovCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBtb2RpZnkgdGhlIGdwaW8ocykgd2l0aCBpbnRlcnJ1cHRzIHNldCAoYmpkKSAqLworCisJbW9kaWZ5X2dwaW8oUzNDMjQxMF9HUENVUCwgIG1hY2hfaW5mby0+Z3BjdXAsICBtYWNoX2luZm8tPmdwY3VwX21hc2spOworCW1vZGlmeV9ncGlvKFMzQzI0MTBfR1BDQ09OLCBtYWNoX2luZm8tPmdwY2NvbiwgbWFjaF9pbmZvLT5ncGNjb25fbWFzayk7CisJbW9kaWZ5X2dwaW8oUzNDMjQxMF9HUERVUCwgIG1hY2hfaW5mby0+Z3BkdXAsICBtYWNoX2luZm8tPmdwZHVwX21hc2spOworCW1vZGlmeV9ncGlvKFMzQzI0MTBfR1BEQ09OLCBtYWNoX2luZm8tPmdwZGNvbiwgbWFjaF9pbmZvLT5ncGRjb25fbWFzayk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjEsIFMzQzI0MTBfTENEQ09OMSk7CisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb24yLCBTM0MyNDEwX0xDRENPTjIpOworCXdyaXRlbChmYmktPnJlZ3MubGNkY29uMywgUzNDMjQxMF9MQ0RDT04zKTsKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjQsIFMzQzI0MTBfTENEQ09ONCk7CisJd3JpdGVsKGZiaS0+cmVncy5sY2Rjb241LCBTM0MyNDEwX0xDRENPTjUpOworCisgCXMzYzI0MTBmYl9zZXRfbGNkYWRkcihmYmkpOworCisJZHByaW50aygiTFBDU0VMICAgID0gMHglMDhseFxuIiwgbWFjaF9pbmZvLT5scGNzZWwpOworCXdyaXRlbChtYWNoX2luZm8tPmxwY3NlbCwgUzNDMjQxMF9MUENTRUwpOworCisJZHByaW50aygicmVwbGFjaW5nIFRQQUwgJTA4eFxuIiwgcmVhZGwoUzNDMjQxMF9UUEFMKSk7CisKKwkvKiBlbnN1cmUgdGVtcG9yYXJ5IHBhbGV0dGUgZGlzYWJsZWQgKi8KKwl3cml0ZWwoMHgwMCwgUzNDMjQxMF9UUEFMKTsKKworCS8qIEVuYWJsZSB2aWRlbyBieSBzZXR0aW5nIHRoZSBFTlZJRCBiaXQgdG8gMSAqLworCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9FTlZJRDsKKwl3cml0ZWwoZmJpLT5yZWdzLmxjZGNvbjEsIFMzQzI0MTBfTENEQ09OMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0MTBmYl93cml0ZV9wYWxldHRlKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZW50OworCisJZmJpLT5wYWxldHRlX3JlYWR5ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAoKGVudCA9IGZiaS0+cGFsZXR0ZV9idWZmZXJbaV0pID09IFBBTEVUVEVfQlVGRl9DTEVBUikKKwkJCWNvbnRpbnVlOworCisJCXdyaXRlbChlbnQsIFMzQzI0MTBfVEZUUEFMKGkpKTsKKworCQkvKiBpdCBzZWVtcyB0aGUgb25seSB3YXkgdG8ga25vdyBleGFjdGx5CisJCSAqIGlmIHRoZSBwYWxldHRlIHdyb3RlIG9rLCBpcyB0byBjaGVjaworCQkgKiB0byBzZWUgaWYgdGhlIHZhbHVlIHZlcmlmaWVzIG9rCisJCSAqLworCisJCWlmIChyZWFkdyhTM0MyNDEwX1RGVFBBTChpKSkgPT0gZW50KQorCQkJZmJpLT5wYWxldHRlX2J1ZmZlcltpXSA9IFBBTEVUVEVfQlVGRl9DTEVBUjsKKwkJZWxzZQorCQkJZmJpLT5wYWxldHRlX3JlYWR5ID0gMTsgICAvKiByZXRyeSAqLworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0MTBmYl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGxjZGlycSA9IHJlYWRsKFMzQzI0MTBfTENESU5UUE5EKTsKKworCWlmIChsY2RpcnEgJiBTM0MyNDEwX0xDRElOVF9GUlNZTkMpIHsKKwkJaWYgKGZiaS0+cGFsZXR0ZV9yZWFkeSkKKwkJCXMzYzI0MTBmYl93cml0ZV9wYWxldHRlKGZiaSk7CisKKwkJd3JpdGVsKFMzQzI0MTBfTENESU5UX0ZSU1lOQywgUzNDMjQxMF9MQ0RJTlRQTkQpOworCQl3cml0ZWwoUzNDMjQxMF9MQ0RJTlRfRlJTWU5DLCBTM0MyNDEwX0xDRFNSQ1BORCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdPSJzM2MyNDEwZmIiOworCitpbnQgX19pbml0IHMzYzI0MTBmYl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHMzYzI0MTBmYl9pbmZvICppbmZvOworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm87CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzM2MyNDEwZmJfaHcgKm1yZWdzOworCWludCByZXQ7CisJaW50IGlycTsKKwlpbnQgaTsKKworCW1hY2hfaW5mbyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAobWFjaF9pbmZvID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsIm5vIHBsYXRmb3JtIGRhdGEgZm9yIGxjZCwgY2Fubm90IGF0dGFjaFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1yZWdzID0gJm1hY2hfaW5mby0+cmVnczsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWZiaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgczNjMjQxMGZiX2luZm8pLCBkZXYpOworCWlmICghZmJpbmZvKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCisJaW5mbyA9IGZiaW5mby0+cGFyOworCWluZm8tPmZiID0gZmJpbmZvOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGZiaW5mbyk7CisKKwlzM2MyNDEwZmJfaW5pdF9yZWdpc3RlcnMoaW5mbyk7CisKKwlkcHJpbnRrKCJkZXZpbml0XG4iKTsKKworCXN0cmNweShmYmluZm8tPmZpeC5pZCwgZHJpdmVyX25hbWUpOworCisJbWVtY3B5KCZpbmZvLT5yZWdzLCAmbWFjaF9pbmZvLT5yZWdzLCBzaXplb2YoaW5mby0+cmVncykpOworCisJaW5mby0+bWFjaF9pbmZvCQkgICAgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlmYmluZm8tPmZpeC50eXBlCSAgICA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlmYmluZm8tPmZpeC50eXBlX2F1eAkgICAgPSAwOworCWZiaW5mby0+Zml4LnhwYW5zdGVwCSAgICA9IDA7CisJZmJpbmZvLT5maXgueXBhbnN0ZXAJICAgID0gMDsKKwlmYmluZm8tPmZpeC55d3JhcHN0ZXAJICAgID0gMDsKKwlmYmluZm8tPmZpeC5hY2NlbAkgICAgPSBGQl9BQ0NFTF9OT05FOworCisJZmJpbmZvLT52YXIubm9uc3RkCSAgICA9IDA7CisJZmJpbmZvLT52YXIuYWN0aXZhdGUJICAgID0gRkJfQUNUSVZBVEVfTk9XOworCWZiaW5mby0+dmFyLmhlaWdodAkgICAgPSBtYWNoX2luZm8tPmhlaWdodDsKKwlmYmluZm8tPnZhci53aWR0aAkgICAgPSBtYWNoX2luZm8tPndpZHRoOworCWZiaW5mby0+dmFyLmFjY2VsX2ZsYWdzICAgICA9IDA7CisJZmJpbmZvLT52YXIudm1vZGUJICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKworCWZiaW5mby0+ZmJvcHMJCSAgICA9ICZzM2MyNDEwZmJfb3BzOworCWZiaW5mby0+ZmxhZ3MJCSAgICA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJZmJpbmZvLT5wc2V1ZG9fcGFsZXR0ZSAgICAgID0gJmluZm8tPnBzZXVkb19wYWw7CisKKwlmYmluZm8tPnZhci54cmVzCSAgICA9IG1hY2hfaW5mby0+eHJlcy5kZWZ2YWw7CisJZmJpbmZvLT52YXIueHJlc192aXJ0dWFsICAgID0gbWFjaF9pbmZvLT54cmVzLmRlZnZhbDsKKwlmYmluZm8tPnZhci55cmVzCSAgICA9IG1hY2hfaW5mby0+eXJlcy5kZWZ2YWw7CisJZmJpbmZvLT52YXIueXJlc192aXJ0dWFsICAgID0gbWFjaF9pbmZvLT55cmVzLmRlZnZhbDsKKwlmYmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAgPSBtYWNoX2luZm8tPmJwcC5kZWZ2YWw7CisKKwlmYmluZm8tPnZhci51cHBlcl9tYXJnaW4gICAgPSBTM0MyNDEwX0xDRENPTjJfR0VUX1ZCUEQobXJlZ3MtPmxjZGNvbjIpICsxOworCWZiaW5mby0+dmFyLmxvd2VyX21hcmdpbiAgICA9IFMzQzI0MTBfTENEQ09OMl9HRVRfVkZQRChtcmVncy0+bGNkY29uMikgKzE7CisJZmJpbmZvLT52YXIudnN5bmNfbGVuCSAgICA9IFMzQzI0MTBfTENEQ09OMl9HRVRfVlNQVyhtcmVncy0+bGNkY29uMikgKyAxOworCisJZmJpbmZvLT52YXIubGVmdF9tYXJnaW4JICAgID0gUzNDMjQxMF9MQ0RDT04zX0dFVF9IRlBEKG1yZWdzLT5sY2Rjb24zKSArIDE7CisJZmJpbmZvLT52YXIucmlnaHRfbWFyZ2luICAgID0gUzNDMjQxMF9MQ0RDT04zX0dFVF9IQlBEKG1yZWdzLT5sY2Rjb24zKSArIDE7CisJZmJpbmZvLT52YXIuaHN5bmNfbGVuCSAgICA9IFMzQzI0MTBfTENEQ09ONF9HRVRfSFNQVyhtcmVncy0+bGNkY29uNCkgKyAxOworCisJZmJpbmZvLT52YXIucmVkLm9mZnNldCAgICAgID0gMTE7CisJZmJpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0ICAgID0gNTsKKwlmYmluZm8tPnZhci5ibHVlLm9mZnNldCAgICAgPSAwOworCWZiaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQgICA9IDA7CisJZmJpbmZvLT52YXIucmVkLmxlbmd0aCAgICAgID0gNTsKKwlmYmluZm8tPnZhci5ncmVlbi5sZW5ndGggICAgPSA2OworCWZiaW5mby0+dmFyLmJsdWUubGVuZ3RoICAgICA9IDU7CisJZmJpbmZvLT52YXIudHJhbnNwLmxlbmd0aCAgID0gMDsKKwlmYmluZm8tPmZpeC5zbWVtX2xlbiAgICAgICAgPQltYWNoX2luZm8tPnhyZXMubWF4ICoKKwkJCQkJbWFjaF9pbmZvLT55cmVzLm1heCAqCisJCQkJCW1hY2hfaW5mby0+YnBwLm1heCAvIDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWluZm8tPnBhbGV0dGVfYnVmZmVyW2ldID0gUEFMRVRURV9CVUZGX0NMRUFSOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpUzNDMjRYWF9WQV9MQ0QsIFNaXzFNLCAiczNjMjQxMC1sY2QiKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZGVhbGxvY19mYjsKKwl9CisKKworCWRwcmludGsoImdvdCBMQ0QgcmVnaW9uXG4iKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgczNjMjQxMGZiX2lycSwgU0FfSU5URVJSVVBULCBwZGV2LT5uYW1lLCBpbmZvKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBpcnEgJWQgLSBlcnIgJWRcbiIsIGlycSwgcmV0KTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHJlbGVhc2VfbWVtOworCX0KKworCWluZm8tPmNsayA9IGNsa19nZXQoTlVMTCwgImxjZCIpOworCWlmICghaW5mby0+Y2xrIHx8IElTX0VSUihpbmZvLT5jbGspKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGdldCBsY2QgY2xvY2sgc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byByZWxlYXNlX2lycTsKKwl9CisKKwljbGtfdXNlKGluZm8tPmNsayk7CisJY2xrX2VuYWJsZShpbmZvLT5jbGspOworCWRwcmludGsoImdvdCBhbmQgZW5hYmxlZCBjbG9ja1xuIik7CisKKwltc2xlZXAoMSk7CisKKwkvKiBJbml0aWFsaXplIHZpZGVvIG1lbW9yeSAqLworCXJldCA9IHMzYzI0MTBmYl9tYXBfdmlkZW9fbWVtb3J5KGluZm8pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIHZpZGVvIFJBTTogJWRcbiIsIHJldCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcmVsZWFzZV9jbG9jazsKKwl9CisJZHByaW50aygiZ290IHZpZGVvIG1lbW9yeVxuIik7CisKKwlyZXQgPSBzM2MyNDEwZmJfaW5pdF9yZWdpc3RlcnMoaW5mbyk7CisKKwlyZXQgPSBzM2MyNDEwZmJfY2hlY2tfdmFyKCZmYmluZm8tPnZhciwgZmJpbmZvKTsKKworCXJldCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXIgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmcmVlX3ZpZGVvX21lbW9yeTsKKwl9CisKKwkvKiBjcmVhdGUgZGV2aWNlIGZpbGVzICovCisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlYnVnKTsKKworCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCisJCWZiaW5mby0+bm9kZSwgZmJpbmZvLT5maXguaWQpOworCisJcmV0dXJuIDA7CisKK2ZyZWVfdmlkZW9fbWVtb3J5OgorCXMzYzI0MTBmYl91bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CityZWxlYXNlX2Nsb2NrOgorCWNsa19kaXNhYmxlKGluZm8tPmNsayk7CisJY2xrX3VudXNlKGluZm8tPmNsayk7CisJY2xrX3B1dChpbmZvLT5jbGspOworcmVsZWFzZV9pcnE6CisJZnJlZV9pcnEoaXJxLGluZm8pOworcmVsZWFzZV9tZW06CisgCXJlbGVhc2VfbWVtX3JlZ2lvbigodW5zaWduZWQgbG9uZylTM0MyNFhYX1ZBX0xDRCwgUzNDMjRYWF9TWl9MQ0QpOworZGVhbGxvY19mYjoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworLyogczNjMjQxMGZiX3N0b3BfbGNkCisgKgorICogc2h1dGRvd24gdGhlIGxjZCBjb250cm9sbGVyCisqLworCitzdGF0aWMgdm9pZCBzM2MyNDEwZmJfc3RvcF9sY2Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJdG1wID0gcmVhZGwoUzNDMjQxMF9MQ0RDT04xKTsKKwl3cml0ZWwodG1wICYgflMzQzI0MTBfTENEQ09OMV9FTlZJRCwgUzNDMjQxMF9MQ0RDT04xKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqICBDbGVhbnVwCisgKi8KK3N0YXRpYyBpbnQgczNjMjQxMGZiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmluZm8gPSBmYmluZm8tPnBhcjsKKwlpbnQgaXJxOworCisJczNjMjQxMGZiX3N0b3BfbGNkKCk7CisJbXNsZWVwKDEpOworCisJczNjMjQxMGZiX3VubWFwX3ZpZGVvX21lbW9yeShpbmZvKTsKKworIAlpZiAoaW5mby0+Y2xrKSB7CisgCQljbGtfZGlzYWJsZShpbmZvLT5jbGspOworIAkJY2xrX3VudXNlKGluZm8tPmNsayk7CisgCQljbGtfcHV0KGluZm8tPmNsayk7CisgCQlpbmZvLT5jbGsgPSBOVUxMOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJZnJlZV9pcnEoaXJxLGluZm8pOworCXJlbGVhc2VfbWVtX3JlZ2lvbigodW5zaWduZWQgbG9uZylTM0MyNFhYX1ZBX0xDRCwgUzNDMjRYWF9TWl9MQ0QpOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJpbmZvKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIHN1c3BlbmQgYW5kIHJlc3VtZSBzdXBwb3J0IGZvciB0aGUgbGNkIGNvbnRyb2xsZXIgKi8KKworc3RhdGljIGludCBzM2MyNDEwZmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQoreworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmluZm8gPSBmYmluZm8tPnBhcjsKKworCWlmIChsZXZlbCA9PSBTVVNQRU5EX0RJU0FCTEUgfHwgbGV2ZWwgPT0gU1VTUEVORF9QT1dFUl9ET1dOKSB7CisJCXMzYzI0MTBmYl9zdG9wX2xjZCgpOworCisJCS8qIHNsZWVwIGJlZm9yZSBkaXNhYmxpbmcgdGhlIGNsb2NrLCB3ZSBuZWVkIHRvIGVuc3VyZQorCQkgKiB0aGUgTENEIERNQSBlbmdpbmUgaXMgbm90IGdvaW5nIHRvIGdldCBiYWNrIG9uIHRoZSBidXMKKwkJICogYmVmb3JlIHRoZSBjbG9jayBnb2VzIG9mZiBhZ2FpbiAoYmpkKSAqLworCisJCW1zbGVlcCgxKTsKKwkJY2xrX2Rpc2FibGUoaW5mby0+Y2xrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwZmJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmluZm8gPSBmYmluZm8tPnBhcjsKKworCWlmIChsZXZlbCA9PSBSRVNVTUVfRU5BQkxFKSB7CisJCWNsa19lbmFibGUoaW5mby0+Y2xrKTsKKwkJbXNsZWVwKDEpOworCisJCXMzYzI0MTBmYl9pbml0X3JlZ2lzdGVycyhpbmZvKTsKKworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBzM2MyNDEwZmJfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0MTBmYl9yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgczNjMjQxMGZiX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1sY2QiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzM2MyNDEwZmJfcHJvYmUsCisJLnN1c3BlbmQJPSBzM2MyNDEwZmJfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0MTBmYl9yZXN1bWUsCisJLnJlbW92ZQkJPSBzM2MyNDEwZmJfcmVtb3ZlCit9OworCitpbnQgX19kZXZpbml0IHMzYzI0MTBmYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmczNjMjQxMGZiX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNDEwZmJfY2xlYW51cCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNDEwZmJfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChzM2MyNDEwZmJfaW5pdCk7Cittb2R1bGVfZXhpdChzM2MyNDEwZmJfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+LCBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgdGhlIHMzYzI0MTAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmggYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDA5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3MzYzI0MTBmYi5oCisgKiBDb3B5cmlnaHQgKGMpIEFybmF1ZCBQYXRhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICoJICAgIFMzQzI0MTAgTENEIENvbnRyb2xsZXIgRnJhbWUgQnVmZmVyIERyaXZlcgorICoJICAgIGJhc2VkIG9uIHNrZWxldG9uZmIuYywgc2ExMTAwZmIuaAorICoKKyAqIENoYW5nZUxvZworICoKKyAqIDIwMDQtMTItMDQ6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAgICAgIC0gTW92ZWQgZHByaW50ayB0byBzM2MyNDEwZmIuYworICoKKyAqIDIwMDQtMDktMDc6IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKiAJLSBSZW5hbWVkIGZyb20gaDE5NDBmYi5oIHRvIHMzYzI0MTBmYi5oCisgKiAJLSBDaGVuZ2VkIGgxOTQwIHRvIHMzYzI0MTAKKyAqCisgKiAyMDA0LTA3LTE1OiBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICoJLSBGaXJzdCB2ZXJzaW9uCisgKi8KKworI2lmbmRlZiBfX1MzQzI0MTBGQl9ICisjZGVmaW5lIF9fUzNDMjQxMEZCX0gKKworc3RydWN0IHMzYzI0MTBmYl9pbmZvIHsKKwlzdHJ1Y3QgZmJfaW5mbwkJKmZiOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGNsawkJKmNsazsKKworCXN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICptYWNoX2luZm87CisKKwkvKiByYXcgbWVtb3J5IGFkZHJlc3NlcyAqLworCWRtYV9hZGRyX3QJCW1hcF9kbWE7CS8qIHBoeXNpY2FsICovCisJdV9jaGFyICoJCW1hcF9jcHU7CS8qIHZpcnR1YWwgKi8KKwl1X2ludAkJCW1hcF9zaXplOworCisJc3RydWN0IHMzYzI0MTBmYl9odwlyZWdzOworCisJLyogYWRkcmVzc2VzIG9mIHBpZWNlcyBwbGFjZWQgaW4gcmF3IGJ1ZmZlciAqLworCXVfY2hhciAqCQlzY3JlZW5fY3B1OwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgYnVmZmVyICovCisJZG1hX2FkZHJfdAkJc2NyZWVuX2RtYTsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQJCXBhbGV0dGVfcmVhZHk7CisKKwkvKiBrZWVwIHRoZXNlIHJlZ2lzdGVycyBpbiBjYXNlIHdlIG5lZWQgdG8gcmUtd3JpdGUgcGFsZXR0ZSAqLworCXUzMgkJCXBhbGV0dGVfYnVmZmVyWzI1Nl07CisJdTMyCQkJcHNldWRvX3BhbFsxNl07Cit9OworCisjZGVmaW5lIFBBTEVUVEVfQlVGRl9DTEVBUiAoMHg4MDAwMDAwMCkJLyogZW50cnkgaXMgY2xlYXIvaW52YWxpZCAqLworCitpbnQgczNjMjQxMGZiX2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmItaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwppbmRleCA4NDc2OThiLi45NTk0MDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwpAQCAtMjU5LDggKzI1OSw5IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotaW50IHNhdmFnZWZiX3Byb2JlX2kyY19jb25uZWN0b3Ioc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyLCB1OCAqKm91dF9lZGlkKQoraW50IHNhdmFnZWZiX3Byb2JlX2kyY19jb25uZWN0b3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHU4ICoqb3V0X2VkaWQpCiB7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXU4ICplZGlkID0gTlVMTDsKIAlpbnQgaTsKIApAQCAtMjcwLDEyICsyNzEsMTkgQEAKIAkJaWYgKGVkaWQpCiAJCQlicmVhazsKIAl9CisKKwlpZiAoIWVkaWQpIHsKKwkJLyogdHJ5IHRvIGdldCBmcm9tIGZpcm13YXJlICovCisJCWVkaWQgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVkaWQpCisJCQltZW1jcHkoZWRpZCwgZmJfZmlybXdhcmVfZWRpZChpbmZvLT5kZXZpY2UpLAorCQkJICAgICAgIEVESURfTEVOR1RIKTsKKwl9CisKIAlpZiAob3V0X2VkaWQpCiAJCSpvdXRfZWRpZCA9IGVkaWQ7Ci0JaWYgKCFlZGlkKQotCQlyZXR1cm4gMTsKIAotCXJldHVybiAwOworCXJldHVybiAoZWRpZCkgPyAwIDogMTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmIuaCBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiLmgKaW5kZXggODU5NGIxZS4uZDZmOTQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi5oCkBAIC02MCw2ICs2MCw3IEBACiAKICNkZWZpbmUgUzNfU0FWQUdFX1NFUklFUyhjaGlwKSAgICAoKGNoaXA+PVMzX1NBVkFHRTNEKSAmJiAoY2hpcDw9UzNfU0FWQUdFMjAwMCkpCiAKKyNkZWZpbmUgUzNfTU9CSUxFX1RXSVNURVJfU0VSSUVTKGNoaXApICgoY2hpcD09UzNfVFdJU1RFUikgfHwgKGNoaXAgPT0gUzNfUFJPU0FWQUdFRERSKSkKIAogLyogQ2hpcCB0YWdzLiAgVGhlc2UgYXJlIHVzZWQgdG8gZ3JvdXAgdGhlIGFkYXB0ZXJzIGludG8KICAqIHJlbGF0ZWQgZmFtaWxpZXMuCkBAIC03Myw2ICs3NCw4IEBACiAgIFMzX1BST1NBVkFHRSwKICAgUzNfU1VQRVJTQVZBR0UsCiAgIFMzX1NBVkFHRTIwMDAsCisgIFMzX1BST1NBVkFHRUREUiwKKyAgUzNfVFdJU1RFUiwKICAgUzNfTEFTVAogfSBzYXZhZ2VfY2hpcHNldDsKIApAQCAtMTI4LDYgKzEzMSwxMCBAQAogI2RlZmluZSBCQ0lfQ01EX1NFVF9ST1AoY21kLCByb3ApICAgICgoY21kKSB8PSAoKHJvcCAmIDB4RkYpIDw8IDE2KSkKICNkZWZpbmUgQkNJX0NNRF9TRU5EX0NPTE9SICAgICAgICAgICAweDAwMDA4MDAwCiAKKyNkZWZpbmUgRElTUF9DUlQgICAgIDEKKyNkZWZpbmUgRElTUF9MQ0QgICAgIDIKKyNkZWZpbmUgRElTUF9ERlAgICAgIDMKKwogc3RydWN0IHh0aW1pbmdzIHsKIAl1bnNpZ25lZCBpbnQgQ2xvY2s7CiAJdW5zaWduZWQgaW50IEhEaXNwbGF5OwpAQCAtMTY2LDYgKzE3MywxMCBAQAogCXN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiBjaGFuOwogCXVuc2lnbmVkIGNoYXIgICAqZWRpZDsKIAl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOworCWludCBwbV9zdGF0ZTsKKwlpbnQgZGlzcGxheV90eXBlOworCWludCBkdmk7CisJaW50IGNydG9ubHk7CiAJaW50IGRhY1NwZWVkQnBwOwogCWludCBtYXhDbG9jazsKIAlpbnQgbWluQ2xvY2s7CkBAIC0zMzgsNyArMzQ5LDcgQEAKIAl9IFwKIH0KIAotZXh0ZXJuIGludCBzYXZhZ2VmYl9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwKK2V4dGVybiBpbnQgc2F2YWdlZmJfcHJvYmVfaTJjX2Nvbm5lY3RvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCQkJdTggKipvdXRfZWRpZCk7CiBleHRlcm4gdm9pZCBzYXZhZ2VmYl9jcmVhdGVfaTJjX2J1c3NlcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZCBzYXZhZ2VmYl9kZWxldGVfaTJjX2J1c3NlcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IDExN2FkNDIuLmI1Y2EzZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC0xNDAwLDYgKzE0MDAsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzYXZhZ2VmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwl1OCBzcjggPSAwLCBzcmQgPSAwOworCisJaWYgKHBhci0+ZGlzcGxheV90eXBlID09IERJU1BfQ1JUKSB7CisJCXZnYV9vdXQ4KDB4M2M0LCAweDA4KTsKKwkJc3I4ID0gdmdhX2luOCgweDNjNSk7CisJCXNyOCB8PSAweDA2OworCQl2Z2Ffb3V0OCgweDNjNSwgc3I4KTsKKwkJdmdhX291dDgoMHgzYzQsIDB4MGQpOworCQlzcmQgPSB2Z2FfaW44KDB4M2M1KTsKKwkJc3JkICY9IDB4MDM7CisKKwkJc3dpdGNoIChibGFuaykgeworCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisJCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQkJYnJlYWs7CisJCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKwkJCXNyZCB8PSAweDEwOworCQkJYnJlYWs7CisJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKKwkJCXNyZCB8PSAweDQwOworCQkJYnJlYWs7CisJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorCQkJc3JkIHw9IDB4NTA7CisJCQlicmVhazsKKwkJfQorCisJCXZnYV9vdXQ4KDB4M2M0LCAweDBkKTsKKwkJdmdhX291dDgoMHgzYzUsIHNyZCk7CisJfQorCisJaWYgKHBhci0+ZGlzcGxheV90eXBlID09IERJU1BfTENEIHx8CisJICAgIHBhci0+ZGlzcGxheV90eXBlID09IERJU1BfREZQKSB7CisJCXN3aXRjaChibGFuaykgeworCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisJCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQkJdmdhX291dDgoMHgzYzQsIDB4MzEpOyAvKiBTUjMxIGJpdCA0IC0gRlAgZW5hYmxlICovCisJCQl2Z2Ffb3V0OCgweDNjNSwgdmdhX2luOCgweDNjNSkgfCAweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKKwkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CisJCQl2Z2Ffb3V0OCgweDNjNCwgMHgzMSk7IC8qIFNSMzEgYml0IDQgLSBGUCBlbmFibGUgKi8KKwkJCXZnYV9vdXQ4KDB4M2M1LCB2Z2FfaW44KDB4M2M1KSAmIH4weDEwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChibGFuayA9PSBGQl9CTEFOS19OT1JNQUwpID8gMSA6IDA7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNhdmFnZWZiX29wcyA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKQEAgLTE0MDcsNiArMTQ1OSw3IEBACiAJLmZiX3NldF9wYXIgICAgID0gc2F2YWdlZmJfc2V0X3BhciwKIAkuZmJfc2V0Y29scmVnICAgPSBzYXZhZ2VmYl9zZXRjb2xyZWcsCiAJLmZiX3Bhbl9kaXNwbGF5ID0gc2F2YWdlZmJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rICAgICAgID0gc2F2YWdlZmJfYmxhbmssCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfU0FWQUdFX0FDQ0VMKQogCS5mYl9maWxscmVjdCAgICA9IHNhdmFnZWZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYSAgICA9IHNhdmFnZWZiX2NvcHlhcmVhLApAQCAtMTU4Myw4ICsxNjM2LDcgQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBSYW1TYXZhZ2U0W10gPSAgeyAyLCA0LCA4LCAxMiwgMTYsIDMyLCA2NCwgMzIgfTsKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBSYW1TYXZhZ2VNWFtdID0geyAyLCA4LCA0LCAxNiwgOCwgMTYsIDQsIDE2IH07CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgUmFtU2F2YWdlTkJbXSA9IHsgMCwgMiwgNCwgOCwgMTYsIDMyLCAyLCAyIH07Ci0KLQlpbnQgdmlkZW9SYW0sIHZpZGVvUmFtYnl0ZXM7CisJaW50IHZpZGVvUmFtLCB2aWRlb1JhbWJ5dGVzLCBkdmk7CiAKIAlEQkcoInNhdmFnZV9pbml0X2h3Iik7CiAKQEAgLTE3MDUsNiArMTc1NywzMCBAQAogCXByaW50ayAoS0VSTl9JTkZPICJzYXZhZ2VmYjogRGV0ZWN0ZWQgY3VycmVudCBNQ0xLIHZhbHVlIG9mICVkIGtIelxuIiwKIAkJcGFyLT5NQ0xLKTsKIAorCS8qIGNoZWNrIGZvciBEVkkvZmxhdCBwYW5lbCAqLworCWR2aSA9IDA7CisKKwlpZiAocGFyLT5jaGlwID09IFMzX1NBVkFHRTQpIHsKKwkJdW5zaWduZWQgY2hhciBzcjMwID0gMHgwMDsKKworCQl2Z2Ffb3V0OCgweDNjNCwgMHgzMCk7CisJCS8qIGNsZWFyIGJpdCAxICovCisJCXZnYV9vdXQ4KDB4M2M1LCB2Z2FfaW44KDB4M2M1KSAmIH4weDAyKTsKKwkJc3IzMCA9IHZnYV9pbjgoMHgzYzUpOworCQlpZiAoc3IzMCAmIDB4MDIgLyoweDA0ICovKSB7CisJCQlkdmkgPSAxOworCQkJcHJpbnRrKCJzYXZhZ2VmYjogRGlnaXRhbCBGbGF0IFBhbmVsIERldGVjdGVkXG4iKTsKKwkJfQorCX0KKworCWlmIChTM19TQVZBR0VfTU9CSUxFX1NFUklFUyhwYXItPmNoaXApIHx8CisJICAgIChTM19NT0JJTEVfVFdJU1RFUl9TRVJJRVMocGFyLT5jaGlwKSAmJiAhcGFyLT5jcnRvbmx5KSkKKwkJcGFyLT5kaXNwbGF5X3R5cGUgPSBESVNQX0xDRDsKKwllbHNlIGlmIChkdmkgfHwgKHBhci0+Y2hpcCA9PSBTM19TQVZBR0U0ICYmIHBhci0+ZHZpKSkKKwkJcGFyLT5kaXNwbGF5X3R5cGUgPSBESVNQX0RGUDsKKwllbHNlCisJCXBhci0+ZGlzcGxheV90eXBlID0gRElTUF9DUlQ7CisKIAkvKiBDaGVjayBMQ0QgcGFuZWwgcGFycm1hdGlvbiAqLwogCiAJaWYgKHBhci0+Y2hpcCA9PSBTM19TQVZBR0VfTVgpIHsKQEAgLTE3NTksNyArMTgzNSw4IEBACiAJCQlwYXItPlNhdmFnZVBhbmVsV2lkdGggPSBwYW5lbFg7CiAJCQlwYXItPlNhdmFnZVBhbmVsSGVpZ2h0ID0gcGFuZWxZOwogCi0JCX0KKwkJfSBlbHNlCisJCQlwYXItPmRpc3BsYXlfdHlwZSA9IERJU1BfQ1JUOwogCX0KIAogCXNhdmFnZV9nZXRfZGVmYXVsdF9wYXIgKHBhcik7CkBAIC0xODQ1LDE1ICsxOTIyLDE1IEBACiAJCXNucHJpbnRmIChpbmZvLT5maXguaWQsIDE2LCAiUHJvU2F2YWdlS00iKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9TM1RXSVNURVJfUDoKLQkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFOworCQlwYXItPmNoaXAgPSBTM19UV0lTVEVSOwogCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlR3aXN0ZXJQIik7CiAJCWJyZWFrOwogCWNhc2UgRkJfQUNDRUxfUzNUV0lTVEVSX0s6Ci0JCXBhci0+Y2hpcCA9IFMzX1BST1NBVkFHRTsKKwkJcGFyLT5jaGlwID0gUzNfVFdJU1RFUjsKIAkJc25wcmludGYgKGluZm8tPmZpeC5pZCwgMTYsICJUd2lzdGVySyIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFI6Ci0JCXBhci0+Y2hpcCA9IFMzX1BST1NBVkFHRTsKKwkJcGFyLT5jaGlwID0gUzNfUFJPU0FWQUdFRERSOwogCQlzbnByaW50ZiAoaW5mby0+Zml4LmlkLCAxNiwgIlByb1NhdmFnZUREUiIpOwogCQlicmVhazsKIAljYXNlIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFJLOgpAQCAtMTg5OSwxMiArMTk3NiwxMSBAQAogCQlpbmZvLT5waXhtYXAuYnVmX2FsaWduID0gNDsKIAkJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOwogCi0JCWZiX2FsbG9jX2NtYXAgKCZpbmZvLT5jbWFwLCBOUl9QQUxFVFRFLCAwKTsKKwkJZXJyID0gZmJfYWxsb2NfY21hcCAoJmluZm8tPmNtYXAsIE5SX1BBTEVUVEUsIDApOworCQlpZiAoIWVycikKIAkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfAogCSAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAogCQkgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQ7Ci0KLQkJZXJyID0gMDsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gZXJyOwpAQCAtMTkzMiwxNCArMjAwOCwxNCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbGVkX2VuYWJsZTsKIAotCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgInNhdmFnZWZiIikpIHsKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCAic2F2YWdlZmIiKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVxdWVzdCBQQ0kgcmVnaW9uc1xuIik7CiAJCWdvdG8gZmFpbGVkX2VuYWJsZTsKIAl9CiAKIAllcnIgPSAtRU5PTUVNOwogCi0JaWYgKHNhdmFnZV9pbml0X2ZiX2luZm8oaW5mbywgZGV2LCBpZCkpCisJaWYgKChlcnIgPSBzYXZhZ2VfaW5pdF9mYl9pbmZvKGluZm8sIGRldiwgaWQpKSkKIAkJZ290byBmYWlsZWRfaW5pdDsKIAogCWVyciA9IHNhdmFnZV9tYXBfbW1pbyhpbmZvKTsKQEAgLTE5NDcsNiArMjAyMyw3IEBACiAJCWdvdG8gZmFpbGVkX21taW87CiAKIAl2aWRlb19sZW4gPSBzYXZhZ2VfaW5pdF9odyhwYXIpOworCS8qIEZJWE1FOiBjYW50IGJlIG5lZ2F0aXZlICovCiAJaWYgKHZpZGVvX2xlbiA8IDApIHsKIAkJZXJyID0gdmlkZW9fbGVuOwogCQlnb3RvIGZhaWxlZF9tbWlvOwpAQCAtMTk1OSw3ICsyMDM2LDggQEAKIAlJTklUX0xJU1RfSEVBRCgmaW5mby0+bW9kZWxpc3QpOwogI2lmIGRlZmluZWQoQ09ORklHX0ZCX1NBVkFHRV9JMkMpCiAJc2F2YWdlZmJfY3JlYXRlX2kyY19idXNzZXMoaW5mbyk7Ci0Jc2F2YWdlZmJfcHJvYmVfaTJjX2Nvbm5lY3RvcihwYXIsICZwYXItPmVkaWQpOworCXNhdmFnZWZiX3Byb2JlX2kyY19jb25uZWN0b3IoaW5mbywgJnBhci0+ZWRpZCk7CisJa2ZyZWUocGFyLT5lZGlkKTsKIAlmYl9lZGlkX3RvX21vbnNwZWNzKHBhci0+ZWRpZCwgJmluZm8tPm1vbnNwZWNzKTsKIAlmYl92aWRlb21vZGVfdG9fbW9kZWxpc3QoaW5mby0+bW9uc3BlY3MubW9kZWRiLAogCQkJCSBpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuLApAQCAtMjExMSwxMyArMjE4OSwzMCBAQAogCiAJREJHKCJzYXZhZ2VmYl9zdXNwZW5kIik7CiAKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JZmJfc2V0X3N1c3BlbmQoaW5mbywgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7Ci0Jc2F2YWdlX2Rpc2FibGVfbW1pbyhwYXIpOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAorCXBhci0+cG1fc3RhdGUgPSBzdGF0ZS5ldmVudDsKKworCS8qCisJICogRm9yIFBNX0VWRU5UX0ZSRUVaRSwgZG8gbm90IHBvd2VyIGRvd24gc28gdGhlIGNvbnNvbGUKKwkgKiBjYW4gcmVtYWluIGFjdGl2ZS4KKwkgKi8KKwlpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFKSB7CisJCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJCXJldHVybiAwOworCX0KKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKKworCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKKwkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7CisKKwlzYXZhZ2VmYl9ibGFuayhGQl9CTEFOS19QT1dFUkRPV04sIGluZm8pOworCXNhdmFnZV9kaXNhYmxlX21taW8ocGFyKTsKKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMjcsMjIgKzIyMjIsMzQgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9CiAJCShzdHJ1Y3QgZmJfaW5mbyAqKXBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOworCWludCBjdXJfc3RhdGUgPSBwYXItPnBtX3N0YXRlOwogCiAJREJHKCJzYXZhZ2VfcmVzdW1lIik7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMCk7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKLQlpZihwY2lfZW5hYmxlX2RldmljZShkZXYpKQotCQlEQkcoImVyciIpOworCXBhci0+cG1fc3RhdGUgPSBQTV9FVkVOVF9PTjsKIAotCVNhdmFnZVByaW50UmVncygpOworCS8qCisJICogVGhlIGFkYXB0ZXIgd2FzIG5vdCBwb3dlcmVkIGRvd24gY29taW5nIGJhY2sgZnJvbSBhCisJICogUE1fRVZFTlRfRlJFRVpFLgorCSAqLworCWlmIChjdXJfc3RhdGUgPT0gUE1fRVZFTlRfRlJFRVpFKSB7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOworCQlyZXR1cm4gMDsKKwl9CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCisJaWYocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJREJHKCJlcnIiKTsKKworCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJc2F2YWdlX2VuYWJsZV9tbWlvKHBhcik7CiAJc2F2YWdlX2luaXRfaHcocGFyKTsKIAlzYXZhZ2VmYl9zZXRfcGFyIChpbmZvKTsKLQorCXNhdmFnZWZiX2JsYW5rKEZCX0JMQU5LX1VOQkxBTkssIGluZm8pOwogCWZiX3NldF9zdXNwZW5kIChpbmZvLCAwKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKQEAgLTIyNzYsMyArMjM4Myw2IEBACiAKIG1vZHVsZV9pbml0KHNhdmFnZWZiX2luaXQpOwogbW9kdWxlX2V4aXQoc2F2YWdlX2RvbmUpOworCittb2R1bGVfcGFyYW0obW9kZV9vcHRpb24sIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZV9vcHRpb24sICJTcGVjaWZ5IGluaXRpYWwgdmlkZW8gbW9kZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvMzAwdnRibC5oIGIvZHJpdmVycy92aWRlby9zaXMvMzAwdnRibC5oCmluZGV4IGI2ZDVjNzEuLmU0YjRhMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzLzMwMHZ0YmwuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy8zMDB2dGJsLmgKQEAgLTMsNyArMyw3IEBACiAvKgogICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIFNpUyAzMDAgc2VyaWVzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MCwzMSArNTAsNyBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX1N0U3RydWN0ICBTaVMzMDBfU01vZGVJRFRhYmxlW10gPQotewotCXsweDAxLDB4OTIwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MDEsMHgxMjEwLDB4MTQsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwMSwweDEwMTAsMHgxNywweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDAzLDB4ODIwOCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MDMsMHgwMjEwLDB4MTYsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwMywweDAwMTAsMHgxOCwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDA1LDB4OTIwOSwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MDYsMHg4MjA5LDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwNywweDAwMDAsMHgwNywweDAzLDB4MDMsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDA3LDB4MDAwMCwweDE5LDB4MDIsMHgwMiwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MGQsMHg5MjBhLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgwZSwweDgyMGEsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDBmLDB4MDIwMiwweDExLDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MTAsMHgwMjEyLDB4MTIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgxMSwweDAyMTIsMHgxYSwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDEyLDB4MDIxMiwweDFiLDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4MTMsMHgwMjFiLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAwfSwKLQl7MHgxMiwweDAwMTAsMHgxOCwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsIDB9LAotCXsweDEyLDB4MDIxMCwweDE4LDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwMCwgMH0sCi0JezB4ZmYsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19FeHRTdHJ1Y3QgIFNpUzMwMF9FTW9kZUlEVGFibGVbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19FeHQgU2lTMzAwX0VNb2RlSURUYWJsZVtdID0KIHsKIAl7MHg2YSwweDIyMTIsMHgwMTAyLFNJU19SSV84MDB4NjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLC0xfSwgIC8qIDgwMHg2MDB4PyAqLwogCXsweDJlLDB4MGExYiwweDAxMDEsU0lTX1JJXzY0MHg0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsLTF9LApAQCAtMTEwLDcgKzg2LDcgQEAKIAl7MHg1OSwweDkyMWIsMHgwMTM4LFNJU19SSV8zMjB4MjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDIzLC0xfSwgIC8qIDMyMHgyMDB4OCAgKi8KIAl7MHg1YywweDkyMWYsMHgwMDAwLFNJU19SSV81MTJ4Mzg0LCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LC0xfSwgIC8qIDUxMngzODR4MzIgKi8KIAl7MHg1ZCwweDAyMWQsMHgwMTM5LFNJU19SSV82NDB4NDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLC0xfSwgIC8qIDY0MHg0MDB4MTYgKi8KLSAJezB4NWUsMHgwMjFmLDB4MDAwMCxTSVNfUklfNjQweDQwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwtMX0sICAvKiA2NDB4NDAweDMyICovCisJezB4NWUsMHgwMjFmLDB4MDAwMCxTSVNfUklfNjQweDQwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwtMX0sICAvKiA2NDB4NDAweDMyICovCiAJezB4NjIsMHgwYTNmLDB4MDEzYSxTSVNfUklfNjQweDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwtMX0sCiAJezB4NjMsMHgyYTNmLDB4MDEzYixTSVNfUklfODAweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwtMX0sICAvKiA4MDB4NjAweDMyICovCiAJezB4NjQsMHgwYTdmLDB4MDEzYyxTSVNfUklfMTAyNHg3NjgsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMywtMX0sCkBAIC0xMTksOCArOTUsOCBAQAogCXsweDY4LDB4MDY3YiwweDAxM2YsU0lTX1JJXzE5MjB4MTQ0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsLTF9LAogCXsweDY5LDB4MDZmZCwweDAxNDAsU0lTX1JJXzE5MjB4MTQ0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsLTF9LAogCXsweDZiLDB4MDdmZiwweDAwMDAsU0lTX1JJXzE5MjB4MTQ0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsLTF9LAotCXsweDZjLDB4MDY3YiwweDAwMDAsU0lTX1JJXzIwNDh4MTUzNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsLTF9LCAgLyogMjA0OHgxNTM2eDggLSBub3QgaW4gQklPUyEgKi8KLQl7MHg2ZCwweDA2ZmQsMHgwMDAwLFNJU19SSV8yMDQ4eDE1MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LC0xfSwgIC8qIDIwNDh4MTUzNngxNiAtIG5vdCBpbiBCSU9TISAqLworCXsweDZjLDB4MDY3YiwweDAwMDAsU0lTX1JJXzIwNDh4MTUzNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsLTF9LCAgLyogMjA0OHgxNTM2eDggKi8KKwl7MHg2ZCwweDA2ZmQsMHgwMDAwLFNJU19SSV8yMDQ4eDE1MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LC0xfSwgIC8qIDIwNDh4MTUzNngxNiAqLwogCXsweDcwLDB4NmExYiwweDAwMDAsU0lTX1JJXzgwMHg0ODAsICAweDAwLDB4MDAsMHgwNywweDAwLDB4MmQsLTF9LCAgLyogODAweDQ4MHg4ICovCiAJezB4NzEsMHg0YTFiLDB4MDAwMCxTSVNfUklfMTAyNHg1NzYsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwtMX0sICAvKiAxMDI0eDU3Nng4ICovCiAJezB4NzQsMHg0YTFkLDB4MDAwMCxTSVNfUklfMTAyNHg1NzYsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwtMX0sICAvKiAxMDI0eDU3NngxNiAqLwpAQCAtMTY2LDc3ICsxNDIsNzcgQEAKIAl7MHhmZiwweDAwMDAsMHhmZmZmLDAsICAgICAgICAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19FeHQyU3RydWN0ICBTaVMzMDBfUmVmSW5kZXhbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19FeHQyIFNpUzMwMF9SZWZJbmRleFtdID0KIHsKLQl7MHgwODVmLDB4MGQsMHgwMywweDA1LDB4MDUsMHg2YSwgODAwLCA2MDAsIDB9LCAvKiAwMCAqLwotCXsweDA0NjcsMHgwZSwweDQ0LDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMH0sIC8qIDAxICovCi0JezB4MDA2NywweDBmLDB4MDcsMHg0OCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwfSwgLyogMDIgLSBDUlQxQ1JUQyB3YXMgMHg0ZiAqLwotCXsweDAwNjcsMHgxMCwweDA2LDB4OGIsMHgwNSwweDZhLCA4MDAsIDYwMCwgMH0sIC8qIDAzICovCi0JezB4MDE0NywweDExLDB4MDgsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwfSwgLyogMDQgKi8KLQl7MHgwMTQ3LDB4MTIsMHgwYywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDB9LCAvKiAwNSAqLwotCXsweDAwNDcsMHgxMSwweDRlLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMH0sIC8qIDA2IC0gQ1JUMUNSVEMgd2FzIDB4NTEgKi8KLQl7MHgwMDQ3LDB4MTEsMHgxMywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDB9LCAvKiAwNyAqLwotCXsweGM4NWYsMHgwNSwweDAwLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMH0sIC8qIDA4ICovCi0JezB4YzA2NywweDA2LDB4MDIsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwfSwgLyogMDkgKi8KLQl7MHhjMDY3LDB4MDcsMHgwMiwweDQ3LDB4MDQsMHgyZSwgNjQwLCA0ODAsIDB9LCAvKiAwYSAqLwotCXsweGMwNjcsMHgwOCwweDAzLDB4OGEsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMH0sIC8qIDBiICovCi0JezB4YzA0NywweDA5LDB4MDUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwfSwgLyogMGMgKi8KLQl7MHhjMDQ3LDB4MGEsMHgwOCwweDAwLDB4MDQsMHgyZSwgNjQwLCA0ODAsIDB9LCAvKiAwZCAqLwotCXsweGMwNDcsMHgwYiwweDBhLDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMH0sIC8qIDBlICovCi0JezB4YzA0NywweDBjLDB4MTAsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwfSwgLyogMGYgKi8KLQl7MHg0ODdmLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyZiwgNjQwLCA0MDAsIDB9LCAvKiAxMCAqLwotCXsweGMwNmYsMHgzMSwweDAxLDB4MDYsMHgxMywweDMxLCA3MjAsIDQ4MCwgMH0sIC8qIDExICovCi0JezB4MDA2ZiwweDMyLDB4MDMsMHgwNiwweDE0LDB4MzIsIDcyMCwgNTc2LCAwfSwgLyogMTIgKi8KLQl7MHgwMTg3LDB4MTUsMHgwNSwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxMyAqLwotICAgICAgICB7MHhjODc3LDB4MTYsMHgwOSwweDA2LDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxNCAqLwotCXsweGMwNjcsMHgxNywweDBiLDB4NDksMHgwNiwweDM3LDEwMjQsIDc2OCwgMH0sIC8qIDE1IC0gQ1JUMUNSVEMgd2FzIDB4OTcgKi8KLQl7MHgwMjY3LDB4MTgsMHgwZCwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxNiAqLwotCXsweDAwNDcsMHgxOSwweDExLDB4OGMsMHgwNiwweDM3LDEwMjQsIDc2OCwgMH0sIC8qIDE3IC0gQ1JUMUNSVEMgd2FzIDB4NTkgKi8KLQl7MHgwMDQ3LDB4MWEsMHg1MiwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB9LCAvKiAxOCAqLwotCXsweDAwMDcsMHgxYiwweDE2LDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMH0sIC8qIDE5IC0gQ1JUMUNSVEMgd2FzIDB4NWIgKi8KLQl7MHgwMzg3LDB4MWMsMHg0ZCwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB9LCAvKiAxYSAtIENSVDFDUlRDIHdhcyAweDVjICovCi0JezB4MDA3NywweDFkLDB4MTQsMHgwNywweDA3LDB4M2EsMTI4MCwxMDI0LCAwfSwgLyogMWIgKi8KLQl7MHgwMDQ3LDB4MWUsMHgxNywweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB9LCAvKiAxYyAqLwotCXsweDAwMDcsMHgxZiwweDk4LDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMH0sIC8qIDFkICovCi0JezB4MDAwNywweDIwLDB4NTksMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwfSwgLyogMWUgLSBDUlQxQ1JUQyB3YXMgMHg2MCAqLwotCXsweDAwMDcsMHgyMSwweDVhLDB4MDAsMHgwMCwweDNjLDE2MDAsMTIwMCwgMH0sIC8qIDFmICovCi0JezB4MDAwNywweDIyLDB4MWIsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwfSwgLyogMjAgKi8KLQl7MHgwMDA3LDB4MjMsMHgxZCwweDAwLDB4MDAsMHgzYywxNjAwLDEyMDAsIDB9LCAvKiAyMSAtIENSVDFDUlRDIHdhcyAweDYzICovCi0JezB4MDAwNywweDI0LDB4MWUsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwfSwgLyogMjIgKi8KLQl7MHg0MDdmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgMzIwLCAyMDAsIDB9LCAvKiAyMyAqLwotCXsweGMwN2YsMHgwMSwweDAwLDB4MDQsMHgwNCwweDUwLCAzMjAsIDI0MCwgMH0sIC8qIDI0ICovCi0JezB4MDA3NywweDAyLDB4MDQsMHgwNSwweDA1LDB4NTEsIDQwMCwgMzAwLCAwfSwgLyogMjUgKi8KLQl7MHhjODc3LDB4MDMsMHgwOSwweDA2LDB4MDYsMHg1MiwgNTEyLCAzODQsIDB9LCAvKiAyNiAqLyAgLyogd2FzIGMwNzcgKi8KLQl7MHg4MjA3LDB4MjUsMHgxZiwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB9LCAvKiAyNyAqLwotCXsweDAwMDcsMHgyNiwweDIwLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMH0sIC8qIDI4ICovCi0JezB4MDA2NywweDI3LDB4MTQsMHgwOCwweDBhLDB4NmUsMTI4MCwgOTYwLCAwfSwgLyogMjkgLSAxMjgweDk2MC02MCAqLwotCXsweDAwMjcsMHg0NSwweDNjLDB4MDgsMHgwYSwweDZlLDEyODAsIDk2MCwgMH0sIC8qIDJhIC0gMTI4MHg5NjAtODUgKi8KLQl7MHhjMDc3LDB4MzMsMHgwOSwweDA2LDB4MDAsMHgyMCwxMDI0LCA2MDAsIDB9LCAvKiAyYiAqLwotCXsweGMwNzcsMHgzNCwweDBiLDB4MDYsMHgwMCwweDIzLDExNTIsIDc2OCwgMH0sIC8qIDJjICovCS8qIFZDTEsgMHgwOSAqLwotCXsweDAwNzcsMHgzNSwweDI3LDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMH0sIC8qIDJkICovCi0JezB4MDA0NywweDM2LDB4MzcsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAwfSwgLyogMmUgKi8KLQl7MHgwMDQ3LDB4MzcsMHgwOCwweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDB9LCAvKiAyZiAqLwotCXsweDAwNzcsMHgzOCwweDA5LDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMH0sIC8qIDMwICovCi0JezB4MDA0NywweDM5LDB4MzgsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAwfSwgLyogMzEgKi8KLQl7MHgwMDQ3LDB4M2EsMHgxMSwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDB9LCAvKiAzMiAqLwotCXsweDAwNzcsMHgzYiwweDM5LDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMH0sIC8qIDMzICovCi0JezB4MDA0NywweDNjLDB4M2EsMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAwfSwgLyogMzQgKi8KLQl7MHgwMDA3LDB4M2QsMHgzYiwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDB9LCAvKiAzNSAqLwotCXsweDAwNjcsMHg0OSwweDM1LDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMH0sIC8qIDM2IDExNTJ4ODY0LTYwSHogICovCi0JezB4MDA2NywweDNlLDB4MzQsMHgwNiwweDFhLDB4MjksMTE1MiwgODY0LCAwfSwgLyogMzcgMTE1Mng4NjQtNzVIeiAqLwotCXsweDAwNDcsMHg0NCwweDNhLDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMH0sIC8qIDM4IDExNTJ4ODY0LTg1SHogKi8KLQl7MHgwMGM3LDB4M2YsMHgyOCwweDAwLDB4MTYsMHgzOSwgODQ4LCA0ODAsIDB9LCAvKiAzOSA4NDh4NDgwLTM4SHppICovCi0JezB4YzA2NywweDQwLDB4M2QsMHgwYiwweDE2LDB4MzksIDg0OCwgNDgwLCAwfSwgLyogM2EgODQ4eDQ4MC02MEh6ICAqLwotCXsweDAwYzcsMHg0MSwweDI4LDB4MDAsMHgxNywweDNmLCA4NTYsIDQ4MCwgMH0sIC8qIDNiIDg1Nng0ODAtMzhIemkgKi8KLQl7MHhjMDQ3LDB4NDIsMHgyOCwweDAwLDB4MTcsMHgzZiwgODU2LCA0ODAsIDB9LCAvKiAzYyA4NTZ4NDgwLTYwSHogICovCi0JezB4MDA2NywweDQzLDB4M2UsMHgwYywweDFiLDB4NDgsMTM2MCwgNzY4LCAwfSwgLyogM2QgMTM2MHg3NjgtNjBIeiAqLwotCXsweDAwNzcsMHg0NiwweDNmLDB4MDgsMHgwOCwweDU1LDEyODAsIDc2OCwgMH0sIC8qIDNlIDEyODB4NzY4LTYwSHogKi8KLQl7MHgwMDZmLDB4NDcsMHgwMywweDA2LDB4MTUsMHg1ZiwgNzY4LCA1NzYsIDB9LCAvKiAzZiA3Njh4NTc2ICovCi0JezB4MDAyNywweDQ4LDB4MTMsMHgwOCwweDAwLDB4NjcsMTM2MCwxMDI0LCAwfSwgLyogNDAgMTM2MHgxMDI0LTU5SHogKEJBUkNPMTM2NiBvbmx5KSAqLwotCXsweGZmZmYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMH0KKwl7MHgwODVmLDB4MGQsMHgwMywweDA1LDB4MDUsMHg2YSwgODAwLCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwMCAqLworCXsweDA0NjcsMHgwZSwweDA0LDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDAxICovCisJezB4MDA2NywweDBmLDB4MDcsMHg0OCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwLCAweDAwLCAweDAwfSwgLyogMDIgLSBDUlQxQ1JUQyB3YXMgMHg0ZiAqLworCXsweDAwNjcsMHgxMCwweDA2LDB4OGIsMHgwNSwweDZhLCA4MDAsIDYwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDAzICovCisJezB4MDE0NywweDExLDB4MDgsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAwLCAweDAwLCAweDAwfSwgLyogMDQgKi8KKwl7MHgwMTQ3LDB4MTIsMHgwYywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwNSAqLworCXsweDAwNDcsMHgxMSwweDBlLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDA2IC0gQ1JUMUNSVEMgd2FzIDB4NTEgKi8KKwl7MHgwMDQ3LDB4MTEsMHgxMywweDAwLDB4MDUsMHg2YSwgODAwLCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwNyAqLworCXsweGM4NWYsMHgwNSwweDAwLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDA4ICovCisJezB4YzA2NywweDA2LDB4MDIsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMDkgKi8KKwl7MHhjMDY3LDB4MDcsMHgwMiwweDQ3LDB4MDQsMHgyZSwgNjQwLCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwYSAqLworCXsweGMwNjcsMHgwOCwweDAzLDB4OGEsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDBiICovCisJezB4YzA0NywweDA5LDB4MDUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMGMgKi8KKwl7MHhjMDQ3LDB4MGEsMHgwOCwweDAwLDB4MDQsMHgyZSwgNjQwLCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAwZCAqLworCXsweGMwNDcsMHgwYiwweDBhLDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDBlICovCisJezB4YzA0NywweDBjLDB4MTAsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMGYgKi8KKwl7MHg0ODdmLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyZiwgNjQwLCA0MDAsIDAsIDB4NGEsIDB4NDl9LCAvKiAxMCAqLworCXsweGMwNmYsMHgzMSwweDAxLDB4MDYsMHgxMywweDMxLCA3MjAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDExICovCisJezB4MDA2ZiwweDMyLDB4NGEsMHgwNiwweDE0LDB4MzIsIDcyMCwgNTc2LCAwLCAweDAwLCAweDAwfSwgLyogMTIgKi8gLyogNGEgd2FzIDAzICovCisJezB4MDE4NywweDE1LDB4MDUsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAwLCAweDAwLCAweDAwfSwgLyogMTMgKi8KKwl7MHhjODc3LDB4MTYsMHgwOSwweDA2LDB4MDYsMHgzNywxMDI0LCA3NjgsIDAsIDB4MDAsIDB4MDB9LCAvKiAxNCAqLworCXsweGMwNjcsMHgxNywweDBiLDB4NDksMHgwNiwweDM3LDEwMjQsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDE1IC0gQ1JUMUNSVEMgd2FzIDB4OTcgKi8KKwl7MHgwMjY3LDB4MTgsMHgwZCwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDAsIDB4MDAsIDB4MDB9LCAvKiAxNiAqLworCXsweDAwNDcsMHgxOSwweDExLDB4OGMsMHgwNiwweDM3LDEwMjQsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDE3IC0gQ1JUMUNSVEMgd2FzIDB4NTkgKi8KKwl7MHgwMDQ3LDB4MWEsMHgxMiwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDAsIDB4MDAsIDB4MDB9LCAvKiAxOCAqLworCXsweDAwMDcsMHgxYiwweDE2LDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDE5IC0gQ1JUMUNSVEMgd2FzIDB4NWIgKi8KKwl7MHgwMzg3LDB4MWMsMHgwZCwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDAsIDB4MDAsIDB4MDB9LCAvKiAxYSAtIENSVDFDUlRDIHdhcyAweDVjICovCisJezB4MDA3NywweDFkLDB4MTQsMHgwNywweDA3LDB4M2EsMTI4MCwxMDI0LCAwLCAweDAwLCAweDAwfSwgLyogMWIgKi8KKwl7MHgwMDQ3LDB4MWUsMHgxNywweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDAsIDB4MDAsIDB4MDB9LCAvKiAxYyAqLworCXsweDAwMDcsMHgxZiwweDE4LDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMCwgMHgwMCwgMHgwMH0sIC8qIDFkICovCisJezB4MDAwNywweDIwLDB4MTksMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwLCAweDAwLCAweDAwfSwgLyogMWUgLSBDUlQxQ1JUQyB3YXMgMHg2MCAqLworCXsweDAwMDcsMHgyMSwweDFhLDB4MDAsMHgwMCwweDNjLDE2MDAsMTIwMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDFmICovCisJezB4MDAwNywweDIyLDB4MWIsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwLCAweDAwLCAweDAwfSwgLyogMjAgKi8KKwl7MHgwMDA3LDB4MjMsMHgxZCwweDAwLDB4MDAsMHgzYywxNjAwLDEyMDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyMSAtIENSVDFDUlRDIHdhcyAweDYzICovCisJezB4MDAwNywweDI0LDB4MWUsMHgwMCwweDAwLDB4M2MsMTYwMCwxMjAwLCAwLCAweDAwLCAweDAwfSwgLyogMjIgKi8KKwl7MHg0MDdmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgMzIwLCAyMDAsIDAsIDB4NGIsIDB4NGJ9LCAvKiAyMyAqLworCXsweGMwN2YsMHgwMSwweDAwLDB4MDQsMHgwNCwweDUwLCAzMjAsIDI0MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDI0ICovCisJezB4MDA3NywweDAyLDB4MDQsMHgwNSwweDA1LDB4NTEsIDQwMCwgMzAwLCAwLCAweDAwLCAweDAwfSwgLyogMjUgKi8KKwl7MHhjODc3LDB4MDMsMHgwOSwweDA2LDB4MDYsMHg1MiwgNTEyLCAzODQsIDAsIDB4MDAsIDB4MDB9LCAvKiAyNiAqLyAgLyogd2FzIGMwNzcgKi8KKwl7MHg4MjA3LDB4MjUsMHgxZiwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyNyAqLworCXsweDAwMDcsMHgyNiwweDIwLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMCwgMHgwMCwgMHgwMH0sIC8qIDI4ICovCisJezB4MDA2NywweDI3LDB4MTQsMHgwOCwweDBhLDB4NmUsMTI4MCwgOTYwLCAwLCAweDAwLCAweDAwfSwgLyogMjkgLSAxMjgweDk2MC02MCAqLworCXsweDAwMjcsMHg0NSwweDNjLDB4MDgsMHgwYSwweDZlLDEyODAsIDk2MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDJhIC0gMTI4MHg5NjAtODUgKi8KKwl7MHhjMDc3LDB4MzMsMHgwOSwweDA2LDB4MDAsMHgyMCwxMDI0LCA2MDAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyYiAqLworCXsweGMwNzcsMHgzNCwweDBiLDB4MDYsMHgwMCwweDIzLDExNTIsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDJjICovCS8qIFZDTEsgMHgwOSAqLworCXsweDAwNzcsMHgzNSwweDI3LDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDJkICovCisJezB4MDA0NywweDM2LDB4MzcsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogMmUgKi8KKwl7MHgwMDQ3LDB4MzcsMHgwOCwweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAyZiAqLworCXsweDAwNzcsMHgzOCwweDA5LDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMCwgMHgwMCwgMHgwMH0sIC8qIDMwICovCisJezB4MDA0NywweDM5LDB4MzgsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAwLCAweDAwLCAweDAwfSwgLyogMzEgKi8KKwl7MHgwMDQ3LDB4M2EsMHgxMSwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDAsIDB4MDAsIDB4MDB9LCAvKiAzMiAqLworCXsweDAwNzcsMHgzYiwweDM5LDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMCwgMHgwMCwgMHgwMH0sIC8qIDMzICovCisJezB4MDA0NywweDNjLDB4M2EsMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAwLCAweDAwLCAweDAwfSwgLyogMzQgKi8KKwl7MHgwMDA3LDB4M2QsMHgzYiwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDAsIDB4MDAsIDB4MDB9LCAvKiAzNSAqLworCXsweDAwNjcsMHg0OSwweDM1LDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMCwgMHgwMCwgMHgwMH0sIC8qIDM2IDExNTJ4ODY0LTYwSHogICovCisJezB4MDA2NywweDNlLDB4MzQsMHgwNiwweDFhLDB4MjksMTE1MiwgODY0LCAwLCAweDAwLCAweDAwfSwgLyogMzcgMTE1Mng4NjQtNzVIeiAqLworCXsweDAwNDcsMHg0NCwweDNhLDB4MDYsMHgxYSwweDI5LDExNTIsIDg2NCwgMCwgMHgwMCwgMHgwMH0sIC8qIDM4IDExNTJ4ODY0LTg1SHogKi8KKwl7MHgwMGM3LDB4M2YsMHgyOCwweDAwLDB4MTYsMHgzOSwgODQ4LCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAzOSA4NDh4NDgwLTM4SHppICovCisJezB4YzA2NywweDQwLDB4M2QsMHgwYiwweDE2LDB4MzksIDg0OCwgNDgwLCAwLCAweDAwLCAweDAwfSwgLyogM2EgODQ4eDQ4MC02MEh6ICAqLworCXsweDAwYzcsMHg0MSwweDI4LDB4MDAsMHgxNywweDNmLCA4NTYsIDQ4MCwgMCwgMHgwMCwgMHgwMH0sIC8qIDNiIDg1Nng0ODAtMzhIemkgKi8KKwl7MHhjMDY3LDB4NDIsMHgyOCwweDBjLDB4MTcsMHgzZiwgODU2LCA0ODAsIDAsIDB4MDAsIDB4MDB9LCAvKiAzYyA4NTZ4NDgwLTYwSHogICovCisJezB4MDA2NywweDQzLDB4M2UsMHgwZCwweDFiLDB4NDgsMTM2MCwgNzY4LCAwLCAweDAwLCAweDAwfSwgLyogM2QgMTM2MHg3NjgtNjBIeiAqLworCXsweDAwNzcsMHg0NiwweDNmLDB4MDgsMHgwOCwweDU1LDEyODAsIDc2OCwgMCwgMHgwMCwgMHgwMH0sIC8qIDNlIDEyODB4NzY4LTYwSHogKi8KKwl7MHgwMDZmLDB4NDcsMHg0YywweDA2LDB4MTUsMHg1ZiwgNzY4LCA1NzYsIDAsIDB4MDAsIDB4MDB9LCAvKiAzZiA3Njh4NTc2ICovCisJezB4MDAyNywweDQ4LDB4MTMsMHgwOCwweDAwLDB4NjcsMTM2MCwxMDI0LCAwLCAweDAwLCAweDAwfSwgLyogNDAgMTM2MHgxMDI0LTU5SHogKEJBUkNPMTM2NiBvbmx5KSAqLworCXsweGZmZmYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMCwgMHgwMCwgMHgwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfVkJNb2RlU3RydWN0IFNpUzMwMF9WQk1vZGVJRFRhYmxlW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVkJNb2RlIFNpUzMwMF9WQk1vZGVJRFRhYmxlW10gPQogewogCXsweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAogCXsweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9LApAQCAtMzAzLDUzICsyNzksMjYgQEAKIAl7MHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DUlQxVGFibGVTdHJ1Y3QgIFNpUzMwMF9DUlQxVGFibGVbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DUlQxVGFibGUgU2lTMzAwX0NSVDFUYWJsZVtdID0KIHsKLSNpZiAxCiAge3sweDJkLDB4MjcsMHgyOCwweDkwLDB4MmMsMHg4MCwweGJmLDB4MWYsICAgIC8qIDB4MDAgLSAzMjB4MjAwICovCiAgIDB4OWMsMHg4ZSwweDhmLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwMCwgICAgIC8qIEhSRSBbNF0sWzE1XSBpcyBpbnZhbGlkIC0gYnV0IGNvcnJlY3RpbmcgaXQgZG9lcyBub3Qgd29yayAqLwogICAweDAwfX0sCi0jZW5kaWYKLSNpZiAwCi0ge3sweDJkLDB4MjcsMHgyNywweDkxLDB4MmMsMHg5MiwweGJmLDB4MWYsICAgIC8qIDB4MDAgLSBjb3JyZWN0ZWQgMzIweDIwMC03MiAtIGRvZXMgbm90IHdvcmsgKi8KLSAgMHg5YywweDhlLDB4OGYsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA0LAotICAweDAwfX0sCi0jZW5kaWYKICB7ezB4MmQsMHgyNywweDI4LDB4OTAsMHgyYywweDgwLDB4MGIsMHgzZSwgICAgLyogMHgwMSAqLwogICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDAsICAgICAvKiBIUkUgWzRdLFsxNV0gaXMgaW52YWxpZCAtIGJ1dCBjb3JyZWN0aW5nIGl0IGRvZXMgbm90IHdvcmsgKi8KICAgMHgwMH19LAotI2lmIDAKLSB7ezB4MmQsMHgyNywweDI3LDB4OTEsMHgyYywweDkyLDB4MGIsMHgzZSwgICAgLyogMHgwMSAtIGNvcnJlY3RlZCAzMjB4MjQwLTYwIC0gZG9lcyBub3Qgd29yayAqLwotICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDQsCi0gIDB4MDB9fSwKLSNlbmRpZgogIHt7MHgzZCwweDMxLDB4MzEsMHg4MSwweDM3LDB4MWYsMHg3MiwweGYwLCAgICAvKiAweDAyICovCiAgIDB4NTgsMHg4YywweDU3LDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNSwKICAgMHgwMX19LAotI2lmIDAKLSB7ezB4M2QsMHgzMSwweDMxLDB4ODEsMHgzNywweDFmLDB4NzIsMHhmMCwgICAgLyogMHgwMiAtIGNvcnJlY3RlZCA0MDB4MzAwLTYwICovCi0gIDB4NTgsMHg4YywweDU3LDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNSwKLSAgMHgwMX19LAotI2VuZGlmCiAge3sweDRmLDB4M2YsMHgzZiwweDkzLDB4NDUsMHgwZCwweDI0LDB4ZjUsCiAgIDB4MDIsMHg4OCwweGZmLDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKICAgMHgwMX19LAogIHt7MHg1ZiwweDRmLDB4NTAsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAogICAweDljLDB4OGUsMHg4ZiwweDk2LDB4YjksMHgzMCwweDAwLDB4MDUsCiAgIDB4MDB9fSwKLSNpZiAwICAKLSB7ezB4NWYsMHg0ZiwweDUwLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwgICAgLyogMHgwNSAqLwotICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gIDB4MDB9fSwKLSNlbmRpZgogIHt7MHg1ZiwweDRmLDB4NGYsMHg4MywweDU1LDB4ODEsMHgwYiwweDNlLCAgICAvKiAweDA1IC0gY29ycmVjdGVkIDY0MHg0ODAtNjAgKi8KICAgMHhlOSwweDhiLDB4ZGYsMHhlOCwweDBjLDB4MDAsMHgwMCwweDA1LAogICAweDAwfX0sCi0jaWYgMAotIHt7MHg2MywweDRmLDB4NTAsMHg4NiwweDU2LDB4OWIsMHgwNiwweDNlLCAgICAvKiAweDA2ICovCi0gIDB4ZTgsMHg4YiwweGRmLDB4ZTcsMHhmZiwweDEwLDB4MDAsMHgwMSwKLSAgMHgwMH19LAotI2VuZGlmICAKICB7ezB4NjMsMHg0ZiwweDRmLDB4ODcsMHg1NiwweDliLDB4MDYsMHgzZSwgICAgLyogMHgwNiAtIGNvcnJlY3RlZCA2NDB4NDgwLTcyICovCiAgIDB4ZTgsMHg4YSwweGRmLDB4ZTcsMHgwNywweDAwLDB4MDAsMHgwMSwKICAgMHgwMH19LApAQCAtMzU5LDE5ICszMDgsOSBAQAogIHt7MHg2MywweDRmLDB4NGYsMHg4NywweDVhLDB4ODEsMHhmYiwweDFmLAogICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDUsCiAgIDB4MDB9fSwKLSNpZiAwICAKLSB7ezB4NjYsMHg0ZiwweDRmLDB4ODYsMHg1NiwweDllLDB4MDMsMHgzZSwgICAgLyogMHgwOSAqLwotICAweGU0LDB4ODcsMHhkZiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDEsCi0gIDB4MDB9fSwKLSNlbmRpZgogIHt7MHg2NywweDRmLDB4NGYsMHg4YiwweDU3LDB4ODMsMHgxMCwweDNlLCAgICAvKiAweDA5IC0gY29ycmVjdGVkIDY0MHg0ODAtMTAwICovCiAgIDB4ZTcsMHg4ZCwweGRmLDB4ZTYsMHgxMSwweDAwLDB4MDAsMHgwNSwKICAgMHgwMH19LAotI2lmIDAgIAotIHt7MHg2YywweDRmLDB4NGYsMHg4MywweDU5LDB4OWUsMHgwMCwweDNlLCAgICAvKiAweDBhICovCi0gIDB4ZTUsMHg4ZCwweGRmLDB4ZGYsMHgwMSwweDAwLDB4MDAsMHgwMSwKLSAgMHgwMH19LAotI2VuZGlmICAgIAogIHt7MHg2NywweDRmLDB4NGYsMHg4YiwweDU3LDB4ODMsMHgxMCwweDNlLCAgICAvKiAweDBhIC0gY29ycmVjdGVkIDY0MHg0ODAtMTIwICovCiAgIDB4ZTcsMHg4ZCwweGRmLDB4ZTYsMHgxMSwweDAwLDB4MDAsMHgwNSwKICAgMHgwMH19LApAQCAtNDU5LDExICszOTgsNiBAQAogIHt7MHg1NSwweGZmLDB4ZmYsMHg5OSwweDBkLDB4MGMsMHgzZSwweGJhLAogICAweDAwLDB4ODQsMHhmZiwweGZmLDB4M2YsMHgwZiwweDQxLDB4MDUsCiAgIDB4MDB9fSwKLSNpZiAwICAKLSB7ezB4ZGMsMHg5ZiwweDlmLDB4MDAsMHhhYiwweDE5LDB4ZTYsMHhlZiwgIC8qIDB4Mjc6IDEyODB4OTYwLTcwIC0gaW52YWxpZCEgKi8KLSAgMHhjMCwweGMzLDB4YmYsMHhiZiwweGU3LDB4MTAsMHgwMCwweDA3LAotICAweDAxfX0sCi0jZW5kaWYgIAogIHt7MHhkYywweDlmLDB4OWYsMHg4MCwweGFmLDB4OWQsMHhlNiwweGZmLCAgLyogMHgyNzogMTI4MHg5NjAtNjAgLSBjb3JyZWN0ICovCiAgIDB4YzAsMHg4MywweGJmLDB4YmYsMHhlNywweDEwLDB4MDAsMHgwNywKICAgMHgwMX19LApAQCAtNDk3LDkgKzQzMSw5IEBACiAge3sweDZiLDB4NTksMHg1OSwweDhmLDB4NWUsMHg4YywweDBiLDB4M2UsCiAgIDB4ZTksMHg4YiwweGRmLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwNSwKICAgMHgwMH19LAotIHt7MHg3YiwweDU5LDB4NjMsMHg5ZiwweDZhLDB4OTMsMHg2ZiwweGYwLCAgLyogMHgzMiAqLwotICAweDU4LDB4OGEsMHgzZiwweDU3LDB4NzAsMHgyMCwweDAwLDB4MDUsCi0gIDB4MDF9fSwKKyB7ezB4NmQsMHg1OSwweDU5LDB4OTEsMHg2MCwweDg5LDB4NTMsMHhmMCwgIC8qIDB4MzI6IDcyMHg1NzYsIGNvcnJlY3RlZCB0byA2MEh6ICovCisgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgMHg0MX19LAogIHt7MHhhMywweDdmLDB4N2YsMHg4NywweDg2LDB4OTcsMHgxZSwweGYxLCAgLyogMHgzMyAtIDEwMjR4NjAwICovCiAgIDB4YWUsMHg4NSwweDU3LDB4NTcsMHgxZiwweDMwLDB4MDAsMHgwMiwKICAgMHgwMX19LApAQCAtNTYwLDE4ICs0OTQsMjQgQEAKICB7ezB4Y2UsMHg5ZiwweDlmLDB4OTIsMHhhOSwweDE3LDB4MjAsMHhmNSwgIC8qIDEyODB4NzY4LTYwICovCiAgICAweDAzLDB4ODgsMHhmZiwweGZmLDB4MjEsMHgxMCwweDAwLDB4MDcsCiAgICAweDAxfX0sIC8qIDB4NDYgKi8KLSB7ezB4N2IsMHg1ZiwweDYzLDB4OWYsMHg2YSwweDkzLDB4NmYsMHhmMCwgIC8qIDc2OHg1NzYgKi8KLSAgIDB4NTgsMHg4YSwweDNmLDB4NTcsMHg3MCwweDIwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwgLyogMHg0NyAqLworIHt7MHg3NSwweDVmLDB4NWYsMHg5OSwweDY2LDB4OTAsMHg1MywweGYwLCAgLyogNzY4eDU3NiwgY29ycmVjdGVkIHRvIDYwSHogKi8KKyAgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4NDF9fSwgLyogMHg0NyAqLwogIHt7MHhjZSwweGE5LDB4YTksMHg5MiwweGIxLDB4MDcsMHgyOCwweDUyLCAgLyogMTM2MHgxMDI0IChCYXJjbyBpUSBQcm8gUjMwMCkgKi8KICAgIDB4MDIsMHg4ZSwweGZmLDB4MDAsMHgyOSwweDBkLDB4MDAsMHgwMywKICAgIDB4MDB9fSwgLyogMHg0OCAqLwogIHt7MHhjZCwweDhmLDB4OGYsMHg5MSwweDliLDB4MWIsMHg3YSwweGZmLCAgLyogMTE1Mng4NjQtNjAgKi8KICAgIDB4NjQsMHg4YywweDVmLDB4NjIsMHg3YiwweDEwLDB4MDAsMHgwNywKLSAgIDB4NDF9fSAgLyogMHg0OSAqLworICAgMHg0MX19LCAvKiAweDQ5ICovCisge3sweDVjLDB4NGYsMHg0ZiwweDgwLDB4NTcsMHg4MCwweGEzLDB4MWYsIC8qIGZha2UgNjQweDQwMEA2MEh6IChmb3IgTENEIGFuZCBUViwgbm90IGFjdHVhbGx5IHVzZWQpICovCisgICAweDk4LDB4OGMsMHg4ZiwweDk2LDB4YTQsMHgzMCwweDAwLDB4MDUsCisgICAweDQwfX0sIC8qIDB4NGEgKi8KKyB7ezB4MmMsMHgyNywweDI3LDB4OTAsMHgyZCwweDkyLDB4YTQsMHgxZiwgLyogZmFrZSAzMjB4MjAwQDYwSHogKGZvciBMQ0QgYW5kIFRWLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKyAgIDB4OTgsMHg4YywweDhmLDB4OTYsMHhhNSwweDMwLDB4MDAsMHgwNCwKKyAgIDB4MDB9fSAgLyogMHg0YiAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCAgU2lTMzAwX01DTEtEYXRhXzYzMFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX01DTEtEYXRhIFNpUzMwMF9NQ0xLRGF0YV82MzBbXSA9CiB7CiAJeyAweDVhLDB4NjQsMHg4MCwgNjZ9LAogCXsgMHhiMywweDQ1LDB4ODAsIDgzfSwKQEAgLTU4Myw3ICs1MjMsNyBAQAogCXsgMHgzNywweDYxLDB4ODAsMTAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCAgU2lTMzAwX01DTEtEYXRhXzMwMFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX01DTEtEYXRhIFNpUzMwMF9NQ0xLRGF0YV8zMDBbXSA9CiB7CiAJeyAweDY4LDB4NDMsMHg4MCwxMjV9LAogCXsgMHg2OCwweDQzLDB4ODAsMTI1fSwKQEAgLTU5NSw3ICs1MzUsNyBAQAogCXsgMHgzNywweDYxLDB4ODAsMTAwfQogfTsKIAotc3RhdGljIFNpU19WQ0xLRGF0YVN0cnVjdCBTaVMzMDBfVkNMS0RhdGFbXSA9CitzdGF0aWMgc3RydWN0IFNpU19WQ0xLRGF0YSBTaVMzMDBfVkNMS0RhdGFbXSA9CiB7CiAJeyAweDFiLDB4ZTEsIDI1fSwgLyogMHgwMCAqLwogCXsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MDEgKi8KQEAgLTY2OSw1MyArNjA5LDI2IEBACiAJeyAweGUyLDB4NDYsMTM1fSwgLyogMHg0NSAqLyAgLyogMTI4MHgxMDI0LTc1LCBiZXR0ZXIgY2xvY2sgZm9yIFZHQTIgKi8KIAl7IDB4NzAsMHgyOSwgODF9LCAvKiAweDQ2ICovICAvKiB1bnVzZWQgKi8KIAl7ICAgIDAsICAgMCwgIDB9LCAvKiAweDQ3IGN1c3RvbSAod2lsbCBiZSBmaWxsZWQgb3V0KSAqLwotCXsgMHhjZSwweDI1LDE4OX0gIC8qIDB4NDggKi8gIC8qIFJlcGxhY2VtZW50IGZvciBpbmRleCAweDFiIGZvciA3MzAgKGFuZCA1NDA/KSAqLworCXsgMHhjZSwweDI1LDE4OX0sIC8qIDB4NDggKi8gIC8qIFJlcGxhY2VtZW50IGZvciBpbmRleCAweDFiIGZvciA3MzAgKGFuZCA1NDA/KSAqLworCXsgMHgxNSwweGUxLCAyMH0sIC8qIDB4NDkgKi8gIC8qIDY0MHg0MDBANjAgKGZha2UsIG5vdCBhY3R1YWxseSB1c2VkKSAqLworCXsgMHg1ZiwweGM2LCAzM30sIC8qIDB4NGEgKi8gIC8qIDcyMHg1NzZANjAgKi8KKwl7IDB4MzcsMHg1YSwgMTB9LCAvKiAweDRiICovICAvKiAzMjB4MjAwQDYwIChmYWtlLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKwl7IDB4MmIsMHhjMiwgMzV9ICAvKiAweDRjICovICAvKiA3NjhANTc2QDYwICovCiB9OwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMDcgPSAweDEwOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBEUkFNNFR5cGUgU2lTMzAwX1NSMTVbOF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX1NSMTVbNCAqIDhdID0KIHsKLQl7MHgwMSwweDA5LDB4YTMsMHgwMH0sCi0JezB4NDMsMHg0MywweDQzLDB4MDB9LAotCXsweDFlLDB4MWUsMHgxZSwweDAwfSwKLQl7MHgyYSwweDJhLDB4MmEsMHgwMH0sCi0JezB4MDYsMHgwNiwweDA2LDB4MDB9LAotCXsweDAwLDB4MDAsMHgwMCwweDAwfSwKLQl7MHgwMCwweDAwLDB4MDAsMHgwMH0sCi0JezB4MDAsMHgwMCwweDAwLDB4MDB9CisJMHgwMSwweDA5LDB4YTMsMHgwMCwKKwkweDQzLDB4NDMsMHg0MywweDAwLAorCTB4MWUsMHgxZSwweDFlLDB4MDAsCisJMHgyYSwweDJhLDB4MmEsMHgwMCwKKwkweDA2LDB4MDYsMHgwNiwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwCiB9OwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMUYgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9TUjIxID0gMHgxNjsKLXN0YXRpYyBVQ0hBUiBTaVMzMDBfU1IyMiA9IDB4YjI7Ci1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMjMgPSAweGY2Owotc3RhdGljIFVDSEFSIFNpUzMwMF9TUjI0ID0gMHgwZDsKLXN0YXRpYyBVQ0hBUiBTaVMzMDBfU1IyNVtdID0gezB4MCwweDB9Owotc3RhdGljIFVDSEFSIFNpUzMwMF9TUjMxID0gMHgwMDsKLXN0YXRpYyBVQ0hBUiBTaVMzMDBfU1IzMiA9IDB4MTE7Ci1zdGF0aWMgVUNIQVIgU2lTMzAwX1NSMzMgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV8xXzIgPSAweDQwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV80X0QgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV80X0UgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMwMF9DUlQyRGF0YV80XzEwID0gMHg4MDsKLQotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMDBfUkdCU2Vuc2VEYXRhID0gMHhkMTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzAwX1ZpZGVvU2Vuc2VEYXRhID0gMHhiMzsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzAwX1lDU2Vuc2VEYXRhID0gMHhiOTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzAwX1JHQlNlbnNlRGF0YTIgPSAweDAxOTA7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMwMF9WaWRlb1NlbnNlRGF0YTIgPSAweDAxNzQ7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMwMF9ZQ1NlbnNlRGF0YTIgPSAweDAxNmI7Ci0KLXN0YXRpYyBjb25zdCBEUkFNNFR5cGUgU2lTMzAwX0NSNDBbNV07Ci0KLXN0YXRpYyBVQ0hBUiBTaVMzMDBfQ1I0OVsyXTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgIFNpUzMwMF9QYW5lbERlbGF5VGJsW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfUGFuZWxEZWxheVRibCBTaVMzMDBfUGFuZWxEZWxheVRibFtdID0KIHsKIAl7ezB4MDUsMHhhYX19LAogCXt7MHgwNSwweDE0fX0sCkBAIC03MzUsMzMgKzY0OCwxMSBAQAogCXt7MHgwNSwweDYwfX0KIH07CiAKLSNpZiAwCi1zdGF0aWMgY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgIFNpUzMwMF9QYW5lbERlbGF5VGJsTFZEU1tdID0KLXsKLQl7ezB4MDUsMHhhYX19LAotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MzZ9fSwKLQl7ezB4MDUsMHgxNH19LAotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MTR9fSwKLQl7ezB4MDUsMHg5MH19LAotCXt7MHgwNSwweDkwfX0sCi0Je3sweDA1LDB4MTR9fSwKLQl7ezB4MDUsMHgxNH19LAotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MTR9fSwgIC8qIDIuMDdhIChKVkMpOiAxNCw5NiAqLwotCXt7MHgwNSwweDI4fX0sICAvKiAyLjA0LjVjOiAyMCwgODAgLSBDbGV2byAoMi4wNC4yYyk6IDA1LCAyOCAqLwotCXt7MHgwNSwweDE0fX0sCi0Je3sweDA1LDB4MTR9fSwgIC8qIFNvbWUgQklPU2VzOiAwNSwgNDAgKi8KLQl7ezB4MDUsMHg2MH19Ci19OwotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNJUyBWSURFTyBCUklER0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMDBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMDBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQogewogCXsgICA2MiwgIDI1LCA4MDAsIDU0NiwxMzQ0LCA4MDZ9LAogCXsgICAzMiwgIDE1LCA5MzAsIDU0NiwxMzQ0LCA4MDZ9LApAQCAtNzcyLDcgKzY2Myw3IEBACiAJeyAgICAxLCAgIDEsMTM0NCwgODA2LDEzNDQsIDgwNn0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTMzAwX0V4dExDRDEwMjR4NzY4RGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTMzAwX0V4dExDRDEwMjR4NzY4RGF0YVtdID0KIHsKIAl7ICAgMTIsICAgNSwgODk2LCA1MTIsMTM0NCwgODA2fSwKIAl7ICAgMTIsICAgNSwgODk2LCA1MTAsMTM0NCwgODA2fSwKQEAgLTc4OSw3ICs2ODAsNyBAQAogCXsgICAgMSwgICAxLDEzNDQsIDgwNiwxMzQ0LCA4MDZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpUzMwMF9TdDJMQ0QxMjgweDEwMjREYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMDBfU3QyTENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKQEAgLTgwMSw3ICs2OTIsNyBAQAogCXsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpUzMwMF9FeHRMQ0QxMjgweDEwMjREYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMDBfRXh0TENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAyMTEsICA2MCwxMDI0LCA1MDEsMTY4OCwxMDY2fSwKIAl7ICAyMTEsICA2MCwxMDI0LCA1MDgsMTY4OCwxMDY2fSwKQEAgLTgxMyw1MyArNzA0LDExNiBAQAogCXsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCBTaVMzMDBfQ1JUMlBhcnQyXzEwMjR4NzY4XzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgU2lTMzAwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xW10gPQogeyAvKiBWRVNBIFRpbWluZyAqLwotICB7ezB4MjEsMHgxMiwweGJmLDB4ZTQsMHhjMCwweDIxLDB4NDUsMHgwOSwweDAwLDB4YTksMHgwOSwweDA0fX0sCi0gIHt7MHgyYywweDEyLDB4OWEsMHhhZSwweDg4LDB4MjEsMHg0NSwweDA5LDB4MDAsMHhhOSwweDA5LDB4MDR9fSwKLSAge3sweDIxLDB4MTIsMHhiZiwweGU0LDB4YzAsMHgyMSwweDQ1LDB4MDksMHgwMCwweGE5LDB4MDksMHgwNH19LAotICB7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0sCi0gIHt7MHgyMiwweDEzLDB4ZmUsMHgyNSwweGZmLDB4MjEsMHg0NSwweDBhLDB4MDAsMHhhOSwweDBkLDB4MDR9fSwKLSAge3sweDIyLDB4MTMsMHhmZSwweDI1LDB4ZmYsMHgyMSwweDQ1LDB4MGEsMHgwMCwweGE5LDB4MGQsMHgwNH19LAotICB7ezB4MjIsMHgxMywweGZlLDB4MjUsMHhmZiwweDIxLDB4NDUsMHgwYSwweDAwLDB4YTksMHgwZCwweDA0fX0KKwl7ezB4MjEsMHgxMiwweGJmLDB4ZTQsMHhjMCwweDIxLDB4NDUsMHgwOSwweDAwLDB4YTksMHgwOSwweDA0fX0sCisJe3sweDJjLDB4MTIsMHg5YSwweGFlLDB4ODgsMHgyMSwweDQ1LDB4MDksMHgwMCwweGE5LDB4MDksMHgwNH19LAorCXt7MHgyMSwweDEyLDB4YmYsMHhlNCwweGMwLDB4MjEsMHg0NSwweDA5LDB4MDAsMHhhOSwweDA5LDB4MDR9fSwKKwl7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0sCisJe3sweDIyLDB4MTMsMHhmZSwweDI1LDB4ZmYsMHgyMSwweDQ1LDB4MGEsMHgwMCwweGE5LDB4MGQsMHgwNH19LAorCXt7MHgyMiwweDEzLDB4ZmUsMHgyNSwweGZmLDB4MjEsMHg0NSwweDBhLDB4MDAsMHhhOSwweDBkLDB4MDR9fSwKKwl7ezB4MjIsMHgxMywweGZlLDB4MjUsMHhmZiwweDIxLDB4NDUsMHgwYSwweDAwLDB4YTksMHgwZCwweDA0fX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0IFNpUzMwMF9DUlQyUGFydDJfMTAyNHg3NjhfMltdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1BhcnQyUG9ydFRibCBTaVMzMDBfQ1JUMlBhcnQyXzEwMjR4NzY4XzJbXSA9CiB7ICAvKiBOb24tVkVTQSAqLwotIHt7MHgyOCwweDEyLDB4YTMsMHhkMCwweGFhLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKLSB7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCi0ge3sweDI4LDB4MTIsMHhhMywweGQwLDB4YWEsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAotIHt7MHgyYywweDEyLDB4OWEsMHhhZSwweDg4LDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKLSB7ezB4MjgsMHgxMywweGU3LDB4MGIsMHhlOCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCi0ge3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAotIHt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fQorCXt7MHgyOCwweDEyLDB4YTMsMHhkMCwweGFhLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKKwl7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCisJe3sweDI4LDB4MTIsMHhhMywweGQwLDB4YWEsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAorCXt7MHgyYywweDEyLDB4OWEsMHhhZSwweDg4LDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKKwl7ezB4MjgsMHgxMywweGU3LDB4MGIsMHhlOCwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCisJe3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAorCXt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19QYXJ0MlBvcnRUYmxTdHJ1Y3QgU2lTMzAwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8zW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfUGFydDJQb3J0VGJsIFNpUzMwMF9DUlQyUGFydDJfMTAyNHg3NjhfM1tdID0KIHsKLSB7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0IFNpUzMwMF9DUlQyUGFydDJfMTI4MHgxMDI0XzFbXSA9Ci17Ci0gIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19QYXJ0MlBvcnRUYmxTdHJ1Y3QgU2lTMzAwX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMltdID0KLXsKLSB7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0IFNpUzMwMF9DUlQyUGFydDJfMTI4MHgxMDI0XzNbXSA9Ci17Ci0gIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fQorCXt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTFZEUy9DaHJvbnRlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVlVQQUxEYXRhW10gPQorLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFIgc2VyaWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVMzMDBfTFZEU0JBUkNPMTM2NkRhdGFfMVtdPQoreworCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKKwl7IDgzMiwgMzg4LDEzMzEsIDgwNn0sCisJeyA4MzIsIDQzOCwxMzMxLCA4MDZ9LAorCXsgODMyLCAzODgsMTMzMSwgODA2fSwKKwl7IDgzMiwgNTE4LDEzMzEsIDgwNn0sCisJezEwNTAsIDYzOCwxMzQ0LCA4MDZ9LAorCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKKwl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0sCisJezE2ODgsMTA2NiwxNjg4LDEwNjZ9ICAgLyogMTM2MHgxMDI0ICovCit9OworCisvKiBDdXN0b20gZGF0YSBmb3IgQmFyY28gaVEgUiBzZXJpZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9MVkRTQkFSQ08xMzY2RGF0YV8yW109Cit7CisJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAorCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKKwl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCisJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAorCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKKwl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCisJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAorCXsxNjg4LDEwNjYsMTY4OCwxMDY2fSwKKwl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0gICAvKiAxMzYweDEwMjQgKi8KK307CisKKy8qIEN1c3RvbSBkYXRhIGZvciBCYXJjbyBpUSBHIHNlcmllcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzAwX0xWRFNCQVJDTzEwMjREYXRhXzFbXT0KK3sKKwl7IDgzMiwgNDM4LDEzMzEsIDgwNn0sCisJeyA4MzIsIDQwOSwxMzMxLCA4MDZ9LAorCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKKwl7IDgzMiwgNDA5LDEzMzEsIDgwNn0sCisJeyA4MzIsIDUxOCwxMzMxLCA4MDZ9LCAgIC8qIDY0MHg0ODAgKi8KKwl7MTA1MCwgNjM4LDEzNDQsIDgwNn0sICAgLyogODAweDYwMCAqLworCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwgICAvKiAxMDI0eDc2OCAqLworfTsKKworLyogQ3VzdG9tIGRhdGEgZm9yIDg0OHg0ODAgYW5kIDg1Nng0ODAgcGFyYWxsZWwgTFZEUyBwYW5lbHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9MVkRTODQ4eDQ4MERhdGFfMVtdPQoreworCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiA2NDB4NDgwIFRPRE8gKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiA4MDB4NjAwIFRPRE8gKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiAxMDI0eDc2OCBUT0RPICovCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDg0OHg0ODAgKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiA4NTZ4NDgwICovCisJezEwODgsIDUyNSwxMDg4LCA1MjV9ICAgLyogMTM2MHg3NjggVE9ETyAqLworfTsKKworLyogQ3VzdG9tIGRhdGEgZm9yIDg0OHg0ODAgcGFyYWxsZWwgcGFuZWwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9MVkRTODQ4eDQ4MERhdGFfMltdPQoreworCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiAgNjQweDQ4MCAqLworCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qICA4MDB4NjAwICovCisJezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogMTAyNHg3NjggKi8KKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJeyAgIDAsICAgMCwgICAwLCAgIDB9LAorCXsgICAwLCAgIDAsICAgMCwgICAwfSwKKwl7ICAgMCwgICAwLCAgIDAsICAgMH0sCisJezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogODQ4eDQ4MCAqLworCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDg1Nng0ODAgKi8KKwl7MTA4OCwgNTI1LDEwODgsIDUyNX0JLyogMTM2MHg3NjggVE9ETyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzAwX0NIVFZVUEFMRGF0YVtdID0KIHsKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LApAQCAtODY5LDcgKzgyMyw3IEBACiAJeyA5MzYsIDgzNiwgOTM2LCA4MzZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVk9QQUxEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzAwX0NIVFZPUEFMRGF0YVtdID0KIHsKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LApAQCAtODc5LDcgKzgzMyw3IEBACiAJeyA5NjAsIDc1MCwgOTYwLCA3NTB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVlNPUEFMRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMwMF9DSFRWU09QQUxEYXRhW10gPQogewogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCkBAIC04ODksNDg2ICs4NDMsOCBAQAogCXsgOTQ0LCA2MjUsIDk0NCwgNjI1fQogfTsKIAotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMwMF9QYW5lbFR5cGUwMF8xW10gPQotewotCXsgMTA1OSwgNjI2IH0sICAgLyogMi4wOCAqLwotCXsgMTA1OSwgNjI0IH0sCi0JeyAxMDU5LCA2MjYgfSwKLQl7IDEwNTksIDYyNCB9LAotCXsgMTA1OSwgNjI0IH0sCi0JeyAgICAwLCA2MjcgfSwKLQl7ICAgIDAsIDYyNyB9LAotCXsgICAgMCwgICAwIH0sCi0JeyAgICAwLCAgIDAgfQotI2lmIDAKLQl7MCwgNjI2fSwKLQl7MCwgNjI0fSwKLQl7MCwgNjI2fSwKLQl7MCwgNjI0fSwKLQl7MCwgNjI0fSwKLQl7MCwgNjI3fSwKLQl7MCwgNjI3fSwKLQl7MCwgICAwfSwKLQl7MCwgICAwfQotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMwMF9QYW5lbFR5cGUwMV8xW10gPQotewotCXsgICAwLCAgIDAgfSwgIC8qIDIuMDggKi8KLQl7ICAgMCwgICAwIH0sCi0JeyAgIDAsICAgMCB9LAotCXsgICAwLCAgIDAgfSwKLQl7ICAgMCwgICAwIH0sCi0JeyAgIDAsICAgMCB9LAotCXsgICAwLCAgIDAgfSwKLQl7ICAgMCwgICAwIH0sCi0JeyAgIDAsICAgMCB9Ci0jaWYgMAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCAgIDB9LAotCXsxMzQzLCAgIDB9LAotCXsgICAwLCA4MDV9LAotCXsgICAwLCA3OTR9LAotCXsgICAwLCAgIDB9Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTAyXzFbXSA9Ci17Ci0JeyAxMDU5LCA2MjYgfSwgIC8qIDIuMDggKi8KLQl7IDEwNTksIDYyNCB9LAotCXsgMTA1OSwgNjI2IH0sCi0JeyAxMDU5LCA2MjQgfSwKLQl7IDEwNTksIDYyNCB9LAotCXsgICAgMCwgNjI3IH0sCi0JeyAgICAwLCA2MjcgfSwKLQl7ICAgIDAsICAgMCB9LAotCXsgICAgMCwgICAwIH0KLSNpZiAwCi0JezAsIDYyNn0sCi0JezAsIDYyNH0sCi0JezAsIDYyNn0sCi0JezAsIDYyNH0sCi0JezAsIDYyNH0sCi0JezAsIDYyN30sCi0JezAsIDYyN30sCi0JezAsICAgMH0sCi0JezAsICAgMH0KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDNfMVtdID0KLXsKLQl7ICAgOCwgNDM2fSwKLQl7ICAgOCwgNDQwfSwKLQl7ICAgOCwgNDM2fSwKLQl7ICAgOCwgNDQwfSwKLQl7ICAgOCwgNTEyfSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMVtdID0JLyogMTI4MHgxMDI0ICovCi17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA1XzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA2XzFbXSA9CS8qIENsZXZvIFRydW1waW9uIDEwMjR4NzY4ICovCi17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA3XzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA4XzFbXSA9Ci17Ci0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNH0sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsICAgMH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA5XzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBhXzFbXSA9Ci17Ci0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNn0sCi0JezEwNTksIDYyNH0sCi0JezEwNTksIDYyNH0sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsIDYyN30sCi0JeyAgIDAsICAgMH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBiXzFbXSA9Ci17Ci0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDc5OX0sCi0JeyAgIDAsICAgMH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBjXzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBkXzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAgIDAsIDgwNX0sCi0JeyAgIDAsIDc5NH0sCi0JeyAgIDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTBlXzFbXSA9Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sICAgIC8qIDY0MHg0ODAgKi8KLQl7MTM0MywgICAwfSwgICAgLyogODAweDYwMCAqLwotCXsgICAwLCA4MDV9LCAgICAvKiAxMDI0eDc2OCAqLwotCXsgICAwLCA3OTR9LCAgICAvKiAxMjgweDEwMjQgKi8KLQl7ICAgMCwgICAwfSAgICAgLyogMTI4MHg5NjAgLSBub3QgYXBwbGljYWJsZSAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGZfMVtdID0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDBfMltdID0KLXsKLQl7OTc2LCA1Mjd9LAotCXs5NzYsIDUwMn0sCi0Jezk3NiwgNTI3fSwKLQl7OTc2LCA1MDJ9LAotCXs5NzYsIDU2N30sCi0JeyAgMCwgNjI3fSwKLQl7ICAwLCA2Mjd9LAotCXsgIDAsICAgMH0sCi0JeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDFfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDJfMltdID0KLXsKLQl7OTc2LCA1Mjd9LAotCXs5NzYsIDUwMn0sCi0Jezk3NiwgNTI3fSwKLQl7OTc2LCA1MDJ9LAotCXs5NzYsIDU2N30sCi0JeyAgMCwgNjI3fSwKLQl7ICAwLCA2Mjd9LAotCXsgIDAsICAgMH0sCi0JeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDNfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDVfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDZfMltdID0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDdfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLQl7ICAgMCwgODA1fSwKLQl7ICAgMCwgNzk0fSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDhfMltdID0KLXsKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTY3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgICAwfSwKLSAJeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDlfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGFfMltdID0KLXsKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTI3fSwKLSAJezk3NiwgNTAyfSwKLSAJezk3NiwgNTY3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgNjI3fSwKLSAJeyAgMCwgICAwfSwKLSAJeyAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGJfMltdID0KLXsKLSAJeyAxMTUyLCA3MDB9LAotIAl7IDExNTIsIDY3NX0sCi0gCXsgMTE1MiwgNzAwfSwKLSAJeyAxMTUyLCA2NzV9LAotIAl7IDExNTIsIDc0MH0sCi0gCXsgMTIzMiwgNzk5fSwKLSAJeyAgICAwLCA3OTl9LAotIAl7ICAgIDAsICAgMH0sCi0gCXsgICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGNfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGRfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGVfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMGZfMltdID0KLXsKLSAJezExNTIsIDYyMn0sCi0gCXsxMTUyLCA1OTd9LAotIAl7MTE1MiwgNjIyfSwKLSAJezExNTIsIDU5N30sCi0gCXsxMTUyLCA2NjJ9LAotIAl7MTIzMiwgNzIyfSwKLSAJeyAgIDAsIDgwNX0sCi0gCXsgICAwLCA3OTR9LAotIAl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlTlNfMVtdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgODA1fSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlTlNfMltdID0KLXsKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfSwKLQl7IDAgLCAwfQotfTsKLQotLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFIyMDAvMzAwLzQwMCAoQklPUyAyLjAwLjA3KSAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMWFbXSA9CS8qIDEyODB4MTAyNCAoMTM2NngxMDI0KSAqLworLyogQ3VzdG9tIGRlcyBkYXRhIGZvciBCYXJjbyBpUSBSMjAwLzMwMC80MDAgKEJJT1MgMi4wMC4wNykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEZXMgU2lTMzAwX1BhbmVsVHlwZTA0XzFhW10gPQkvKiAxMjgweDEwMjQgKDEzNjZ4MTAyNCkgKi8KIHsKIAl7MTMzMCwgNzk4fSwgIC8qIDMyMHgyMDAgKi8KIAl7MTMzMCwgNzk0fSwKQEAgLTEzODEsNyArODU3LDcgQEAKIAl7ICAgMCwgICAwfSAgIC8qIDEzNjB4MTAyNCAgICAgICAgICAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMmFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGVzIFNpUzMwMF9QYW5lbFR5cGUwNF8yYVtdID0KIHsKIAl7MTE1MiwgNjIyfSwKIAl7MTE1MiwgNTk3fSwKQEAgLTEzOTQsOCArODcwLDggQEAKIAl7ICAgMCwgICAwfQogfTsKIAotLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIEcyMDAvMzAwLzQwMCAoQklPUyAyLjAwLjA3KSAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMDBfUGFuZWxUeXBlMDRfMWJbXSA9CS8qIDEwMjR4NzY4ICovCisvKiBDdXN0b20gZGVzIGRhdGEgZm9yIEJhcmNvIGlRIEcyMDAvMzAwLzQwMCAoQklPUyAyLjAwLjA3KSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcyBTaVMzMDBfUGFuZWxUeXBlMDRfMWJbXSA9CS8qIDEwMjR4NzY4ICovCiB7CiAJezEzMzAsIDc5OH0sICAvKiAzMjB4MjAwICovCiAJezEzMzAsIDc5NH0sCkBAIC0xNDA2LDcgKzg4Miw3IEBACiAJeyAgIDAsIDgwNX0gICAvKiAxMDI0eDc2OCAvIDUxMngzODQgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzAwX1BhbmVsVHlwZTA0XzJiW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcyBTaVMzMDBfUGFuZWxUeXBlMDRfMmJbXSA9CiB7CiAJezExNTIsIDYyMn0sCiAJezExNTIsIDU5N30sCkBAIC0xNDE5LDM3NiArODk1LDcgQEAKIAogLyogQ1JUMSBDUlRDIGZvciBzbGF2ZSBtb2RlcyAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzAwX0xWRFNDUlQxODAweDYwMF8xW10gPQotewotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4YWYsMHgxZiwKLQkgIDB4OTAsMHg4NSwweDhmLDB4YWIsMHgzMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4ODMsMHgxZiwKLQkgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4YWYsMHgxZiwKLQkgIDB4OTAsMHg4NSwweDhmLDB4YWIsMHgzMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4ODMsMHgxZiwKLQkgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg2NSwweDRmLDB4ODksMHg1NiwweDgzLDB4MDQsMHgzZSwKLQkgIDB4ZTAsMHg4NSwweGRmLDB4ZmIsMHgxMCwweDAwLDB4MDUsCi0JICAweDAwIH19LAotCXt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLQkgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0JICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzAwX0xWRFNDUlQxODAweDYwMF8xX0hbXSA9Ci17Ci0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHhhZiwweDFmLAotCSAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHg4MywweDFmLAotCSAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHhhZiwweDFmLAotCSAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHg4MywweDFmLAotCSAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDMwLDB4MjcsMHg5NCwweDJjLDB4OTIsMHgwNCwweDNlLAotCSAgMHhlMCwweDg1LDB4ZGYsMHhmYiwweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDNkLDB4MzEsMHg4MSwweDM3LDB4MWYsMHg3MiwweGYwLAotCSAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNSwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8xW10gPQotewotCXt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4YzQsMHgxZiwKLQkgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0JICAweDAwfX0sCi0Je3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHg5NywweDFmLAotCSAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDB9fSwKLQl7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweGM0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotCSAgMHgwMH19LAotCXt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4OTcsMHgxZiwKLQkgIDB4NjAsMHg4NywweDVkLDB4ODMsMHgxMCwweDAwLDB4MDEsCi0JICAweDAwfX0sCi0Je3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHgwNCwweDNlLAotCSAgMHhlMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHgwMSwKLQkgIDB4MDB9fSwKLQl7ezB4N2UsMHg2MywweDgyLDB4NjgsMHgxNSwweDdjLDB4ZjAsCi0JICAweDVhLDB4OGYsMHg1NywweDdkLDB4MjAsMHgwMCwweDI2LAotCSAgMHgwMX19LAotCXt7MHhhMywweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmNSwKLQkgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDIsCi0JICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8xX0hbXSA9Ci17Ci0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhjNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg5NywweDFmLAotCSAgMHg2MCwweDg3LDB4NUQsMHg4MywweDEwLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweGM0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDQ0LAotCSAgMHgwMH19LAotCXt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4OTcsMHgxZiwKLQkgIDB4NjAsMHg4NywweDVELDB4ODMsMHgxMCwweDAwLDB4NDQsCi0JICAweDAwfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHgwNCwweDNlLAotCSAgMHhFMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4M2MsMHgzMSwweDgwLDB4MzUsMHgxYywweDdjLDB4ZjAsCi0JICAweDVBLDB4OEYsMHg1NywweDdELDB4MjAsMHgwMCwweDU1LAotCSAgMHgwMX19LAotCXt7MHg0ZiwweDNGLDB4OTMsMHg0NSwweDBELDB4MjQsMHhmNSwKLQkgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0JICAweDAxIH19Ci0KLSNpZiAwCi0Je3sweDM3LDB4MjcsMHg5QiwweDJiLDB4OTQsMHhjNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLQkgIDB4MDAgfX0sCi0Je3sweDM3LDB4MjcsMHg5QiwweDJiLDB4OTQsMHg5NywweDFmLAotCSAgMHg2MCwweDg3LDB4NUQsMHg4MywweDAxLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4MzcsMHgyNywweDlCLDB4MmIsMHg5NCwweGM0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDQ0LAotCSAgMHgwMH19LAotCXt7MHgzNywweDI3LDB4OUIsMHgyYiwweDk0LDB4OTcsMHgxZiwKLQkgIDB4NjAsMHg4NywweDVELDB4ODMsMHgwMSwweDAwLDB4NDQsCi0JICAweDAwfX0sCi0Je3sweDM3LDB4MjcsMHg5QiwweDJiLDB4OTQsMHgwNCwweDNlLAotCSAgMHhFMiwweDg5LDB4RGYsMHgwNSwweDAwLDB4MDAsMHg0NCwKLQkgIDB4MDB9fSwKLQl7ezB4NDEsMHgzMSwweDg1LDB4MzUsMHgxZCwweDdjLDB4ZjAsCi0JICAweDVBLDB4OEYsMHg1NywweDdELDB4MjAsMHgwMCwweDU1LAotCSAgMHgwMX19LAotCXt7MHg0ZiwweDNGLDB4OTMsMHg0NSwweDBELDB4MjQsMHhmNSwKLQkgIDB4MDIsMHg4OCwweEZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0JICAweDAxIH19Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMjgweDEwMjRfMVtdID0KLXsKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweGI0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweDgyLDB4MWYsCi0JICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweGI0LDB4MWYsCi0JICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweDgyLDB4MWYsCi0JICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4NjMsMHg0ZiwweDg3LDB4NTQsMHg5ZiwweDA0LDB4M2UsCi0JICAweGUyLDB4ODksMHhkZiwweDA1LDB4MDAsMHgwMCwweDAxLAotCSAgMHgwMCB9fSwKLQl7ezB4N2UsMHg2MywweDgyLDB4NjgsMHgxNSwweDdjLDB4ZjAsCi0JICAweDVhLDB4OGYsMHg1NywweDdkLDB4MjAsMHgwMCwweDI2LAotCSAgMHgwMSB9fSwKLQl7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0JICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotCSAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8xX0hbXSA9Ci17Ci0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhiNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg4MiwweDFmLAotCSAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhiNCwweDFmLAotCSAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg4MiwweDFmLAotCSAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHgwNCwweDNlLAotCSAgMHhlMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHgwNCwKLQkgIDB4MDAgfX0sCi0Je3sweDNjLDB4MzEsMHg4MCwweDM1LDB4MWMsMHg3YywweGYwLAotCSAgMHg1YSwweDhmLDB4NTcsMHg3ZCwweDIwLDB4MDAsMHg1NSwKLQkgIDB4MDEgfX0sCi0Je3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDE4MDB4NjAwXzJbXSA9Ci17Ci0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhmNCwweDg4LDB4OGYsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhkYiwweDhmLDB4NWQsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhmNCwweDg4LDB4OGYsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotCSAgMHhkYiwweDhmLDB4NWQsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweGJhLAotCSAgMHgxYywweDgwLDB4ZGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotCSAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDE4MDB4NjAwXzJfSFtdID0KLXsKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4M2UsCi0JICAweGY0LDB4ODgsMHg4ZiwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4M2UsCi0JICAweGRiLDB4OGYsMHg1ZCwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4M2UsCi0JICAweGY0LDB4ODgsMHg4ZiwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4M2EsMHgxYSwweDcyLDB4M2UsCi0JICAweGRiLDB4OGYsMHg1ZCwweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgyNywweDgxLDB4MzIsMHgxYSwweDcyLDB4YmEsCi0JICAweDFjLDB4ODAsMHhkZiwweDczLDB4MDAsMHgwMCwweDA1LAotCSAgMHgwMCB9fSwKLQl7ezB4M2QsMHgzMSwweDgxLDB4MzcsMHgxZiwweDcyLDB4ZjAsCi0JICAweDU4LDB4OGMsMHg1NywweDczLDB4MjAsMHgwMCwweDA1LAotCSAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMTEwMjR4NzY4XzJbXSA9Ci17Ci0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotCSAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLQkgIDB4MDAgfX0sCi0Je3sweGEzLDB4NjMsMHg4NywweDc4LDB4ODksMHgyNCwweGYxLAotCSAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMiwKLQkgIDB4MDEgfX0sCi0Je3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8yX0hbXSA9Ci17Ci0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotCSAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MzEsMHg5MywweDNlLDB4MDYsMHgyNCwweGYxLAotCSAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0sCi0Je3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfTFZEU0NSVDExMjgweDEwMjRfMltdID0KLXsKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0JICAweDcyLDB4ODgsMHhkZiwweDI1LDB4MzAsMHgwMCwweDA2LAotCSAgMHgwMCB9fSwKLQl7ezB4YTMsMHg2MywweDg3LDB4NzgsMHg4OSwweDI0LDB4ZjEsCi0JICAweGFlLDB4ODQsMHg1NywweDI1LDB4MzAsMHgwMCwweDAyLAotCSAgMHgwMSB9fSwKLQl7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0JICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotCSAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8yX0hbXSA9Ci17Ci0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MjcsMHg5MywweDM5LDB4ODEsMHgyNCwweGJiLAotCSAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDAgfX0sCi0Je3sweDRmLDB4MzEsMHg5MywweDNlLDB4ODYsMHgyNCwweGYxLAotCSAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMSwKLQkgIDB4MDEgfX0sCi0Je3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotCSAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLQkgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMVtdID0KLXsKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDlmLDB4OTIsMHhhOCwweDE0LDB4MjgsMHg1YSwKLSAgIDB4MDAsMHg4NCwweGZmLDB4MjksMHgwOSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4OWYsMHg5MiwweGE5LDB4MTcsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwNywKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMV9IW10gPQotewotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDM4LDB4MjcsMHg5YywweDJjLDB4ODAsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fSwKLSB7ezB4MzgsMHgyNywweDljLDB4MmMsMHg4MCwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LAotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDM4LDB4MjcsMHg5YywweDJjLDB4ODAsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fSwKLSB7ezB4NGQsMHgzMSwweDkxLDB4M2IsMHgwMywweDcyLDB4ZjAsCi0gICAweDU4LDB4OGMsMHg1NywweDczLDB4MjAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg2MywweDNmLDB4ODcsMHg0YSwweDkyLDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxfX0KLX07Ci0KLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMwMF9DSFRWQ1JUMVVOVFNDW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpUzMwMF9DSFRWQ1JUMVVOVFNDW10gPQogewogCXt7MHg2NCwweDRmLDB4ODgsMHg1NiwweDlmLDB4NTYsMHgzZSwKIAkgIDB4ZTgsMHg4NCwweDhmLDB4NTcsMHgyMCwweDAwLDB4MDEsCkBAIC0xODEwLDcgKzkxNyw3IEBACiAJICAweDAxIH19CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzAwX0NIVFZDUlQxT05UU0NbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTMzAwX0NIVFZDUlQxT05UU0NbXSA9CiB7CiAJe3sweDY0LDB4NGYsMHg4OCwweDVhLDB4OWYsMHgwYiwweDNlLAogCSAgMHhjMCwweDg0LDB4OGYsMHgwYywweDIwLDB4MDAsMHgwMSwKQEAgLTE4MzIsNyArOTM5LDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVkNSVDFVUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpUzMwMF9DSFRWQ1JUMVVQQUxbXSA9CiB7CiAJe3sweDc5LDB4NGYsMHg5ZCwweDVhLDB4OTAsMHg2ZiwweDNlLAogCSAgMHhmOCwweDgzLDB4OGYsMHg3MCwweDIwLDB4MDAsMHgwNSwKQEAgLTE4NTQsNyArOTYxLDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVkNSVDFPUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpUzMwMF9DSFRWQ1JUMU9QQUxbXSA9CiB7CiAJe3sweDc5LDB4NGYsMHg5ZCwweDVhLDB4OTAsMHg2ZiwweDNlLAogCSAgMHhmMCwweDgzLDB4OGYsMHg3MCwweDIwLDB4MDAsMHgwNSwKQEAgLTE4NzYsNyArOTgzLDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMDBfQ0hUVkNSVDFTT1BBTFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMDBfQ0hUVkNSVDFTT1BBTFtdID0KIHsKIAl7ezB4NzksMHg0ZiwweDlkLDB4NWEsMHg5MCwweDZmLDB4M2UsCiAJICAweGYwLDB4ODMsMHg4ZiwweDcwLDB4MjAsMHgwMCwweDA1LApAQCAtMTg5OCw3ICsxMDA1LDcgQEAKIAkgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzAwX0NIVFZSZWdfVU5UU0NbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMDBfQ0hUVlJlZ19VTlRTQ1tdID0KIHsKIAl7ezB4NGEsMHg5NCwweDAwLDB4NDgsMHhmZSwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwKIAl7ezB4NGEsMHg5NCwweDAwLDB4NDgsMHhmZSwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwKQEAgLTE5MDgsNyArMTAxNSw3IEBACiAJe3sweDhkLDB4YzQsMHgwMCwweDNiLDB4ZmIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0gIC8qIE1vZGUgMjQ6IDgwMHg2MDAgTlRTQyA3LzEwICovCiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMwMF9DSFRWUmVnX09OVFNDW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzAwX0NIVFZSZWdfT05UU0NbXSA9CiB7CiAJe3sweDQ5LDB4OTQsMHgwMCwweDM0LDB4ZmUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0sCiAJe3sweDQ5LDB4OTQsMHgwMCwweDM0LDB4ZmUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0sCkBAIC0xOTE4LDcgKzEwMjUsNyBAQAogCXt7MHg4YywweGI0LDB4MDAsMHgzMiwweGY5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19ICAvKiBNb2RlIDIzOiA4MDB4NjAwIE5UU0MgMy80ICovCiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMwMF9DSFRWUmVnX1VQQUxbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMDBfQ0hUVlJlZ19VUEFMW10gPQogewogCXt7MHg0MSwweDEyLDB4MDEsMHg1MCwweDM0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAogCXt7MHg0MSwweDEyLDB4MDAsMHg1MCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LApAQCAtMTkyOSw3ICsxMDM2LDcgQEAKIAogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMDBfQ0hUVlJlZ19PUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzAwX0NIVFZSZWdfT1BBTFtdID0KIHsKIAl7ezB4NDEsMHgxMiwweDAxLDB4NTAsMHgzNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwgLyogTW9kZSA5OiA2NDB4NDAwIFBBTCAxLzEgKi8KIAl7ezB4NDEsMHgxMiwweDAwLDB4NTAsMHgwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwKQEAgLTE5NDAsMjYgKzEwNDcsMjYgQEAKIAogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMDBfQ0hUVlJlZ19TT1BBTFtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhIFNpUzMwMF9DSFRWUmVnX1NPUEFMW10gPQogewogCXt7MHg0MSwweDEyLDB4MDEsMHg1MCwweDM0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LCAvKiBNb2RlIDk6IDY0MHg0MDAgUEFMIDEvMSAqLwogCXt7MHg0MSwweDEyLDB4MDAsMHg1MCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAogCXt7MHg0MSwweDEyLDB4MDEsMHg1MCwweDM0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAogCXt7MHg0MSwweDEyLDB4MDAsMHg1MCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LAotCXt7MHg2MCwweDMwLDB4MDAsMHgxMCwweDAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH19LCAvKiBUVzogTW9kZSAxMzogNjQweDQ4MCBQQUwgNS80ICovCi0Je3sweDgxLDB4NTAsMHgwMCwweDFiLDB4MDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0gIC8qIFRXOiBNb2RlIDE5OiA4MDB4NjAwIFBBTCAxLzEgKi8KKwl7ezB4NjAsMHgzMCwweDAwLDB4MTAsMHgwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9fSwgLyogTW9kZSAxMzogNjQweDQ4MCBQQUwgNS80ICovCisJe3sweDgxLDB4NTAsMHgwMCwweDFiLDB4MDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfX0gIC8qIE1vZGUgMTk6IDgwMHg2MDAgUEFMIDEvMSAqLwogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMwMF9DSFRWVkNMS1VOVFNDW10gID0gezB4MjksMHgyOSwweDI5LDB4MjksMHgyYSwweDJlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9DSFRWVkNMS1VOVFNDW10gID0geyAweDI5LDB4MjksMHgyOSwweDI5LDB4MmEsMHgyZSB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX0NIVFZWQ0xLT05UU0NbXSAgPSB7MHgyYywweDJjLDB4MmMsMHgyYywweDJkLDB4MmJ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX0NIVFZWQ0xLT05UU0NbXSAgPSB7IDB4MmMsMHgyYywweDJjLDB4MmMsMHgyZCwweDJiIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfQ0hUVlZDTEtTT05UU0NbXSA9IHsweDJjLDB4MmMsMHgyYywweDJjLDB4MmQsMHgyYn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfQ0hUVlZDTEtTT05UU0NbXSA9IHsgMHgyYywweDJjLDB4MmMsMHgyYywweDJkLDB4MmIgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMwMF9DSFRWVkNMS1VQQUxbXSAgID0gezB4MmYsMHgyZiwweDJmLDB4MmYsMHgyZiwweDMxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9DSFRWVkNMS1VQQUxbXSAgID0geyAweDJmLDB4MmYsMHgyZiwweDJmLDB4MmYsMHgzMSB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX0NIVFZWQ0xLT1BBTFtdICAgPSB7MHgyZiwweDJmLDB4MmYsMHgyZiwweDMwLDB4MzJ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX0NIVFZWQ0xLT1BBTFtdICAgPSB7IDB4MmYsMHgyZiwweDJmLDB4MmYsMHgzMCwweDMyIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfQ0hUVlZDTEtTT1BBTFtdICA9IHsweDJmLDB4MmYsMHgyZiwweDJmLDB4MzYsMHgyOX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfQ0hUVlZDTEtTT1BBTFtdICA9IHsgMHgyZiwweDJmLDB4MmYsMHgyZiwweDM2LDB4MjkgfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy8zMTB2dGJsLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy8zMTB2dGJsLmgKaW5kZXggMmM3MWQwNC4uNTRmY2JiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvMzEwdnRibC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzLzMxMHZ0YmwuaApAQCAtMSw5ICsxLDkgQEAKIC8qICRYRnJlZTg2JCAqLwogLyogJFhkb3RPcmckICovCiAvKgotICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIFNpUyAzMTUvMzMwIHNlcmllcworICogUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIFNpUyAzMTUvMzMwLzM0MCBzZXJpZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTUwLDM3ICs1MCwxMyBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX1N0U3RydWN0IFNpUzMxMF9TTW9kZUlEVGFibGVbXT0KLXsKLQl7MHgwMSwweDkyMDgsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsIDB4NDB9LAotCXsweDAxLDB4MTIxMCwweDE0LDB4MDEsMHgwMSwweDAwLDB4MDEsMHgwMCwgMHg0MH0sCi0JezB4MDEsMHgxMDEwLDB4MTcsMHgwMiwweDAyLDB4MDAsMHgwMSwweDAxLCAweDQwfSwKLQl7MHgwMywweDgyMDgsMHgwMywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDIsIDB4NDB9LAotCXsweDAzLDB4MDIxMCwweDE2LDB4MDEsMHgwMSwweDAwLDB4MDEsMHgwMiwgMHg0MH0sCi0JezB4MDMsMHgwMDEwLDB4MTgsMHgwMiwweDAyLDB4MDAsMHgwMSwweDAzLCAweDQwfSwKLQl7MHgwNSwweDkyMDksMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsIDB4NDB9LAotCXsweDA2LDB4ODIwOSwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwgMHg0MH0sCi0JezB4MDcsMHgwMDAwLDB4MDcsMHgwMywweDAzLDB4MDAsMHgwMSwweDAzLCAweDQwfSwKLQl7MHgwNywweDAwMDAsMHgxOSwweDAyLDB4MDIsMHgwMCwweDAxLDB4MDMsIDB4NDB9LAotCXsweDBkLDB4OTIwYSwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwgMHg0MH0sCi0JezB4MGUsMHg4MjBhLDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LCAweDQwfSwKLQl7MHgwZiwweDAyMDIsMHgxMSwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsIDB4NDB9LAotCXsweDEwLDB4MDIxMiwweDEyLDB4MDEsMHgwMSwweDAwLDB4MDAsMHgwNSwgMHg0MH0sCi0JezB4MTEsMHgwMjEyLDB4MWEsMHgwNCwweDA0LDB4MDAsMHgwMCwweDA1LCAweDQwfSwKLQl7MHgxMiwweDAyMTIsMHgxYiwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDUsIDB4NDB9LAotCXsweDEzLDB4MDIxYiwweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwgMHg0MH0sCi0JezB4MTIsMHgwMDEwLDB4MTgsMHgwMiwweDAyLDB4MDAsMHgwMCwweDA1LCAweDQwfSwKLQl7MHgxMiwweDAyMTAsMHgxOCwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsIDB4NDB9LAotCXsweGZmLDB4MDAwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwgMHg0MH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfRXh0U3RydWN0ICBTaVMzMTBfRU1vZGVJRFRhYmxlW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19FeHQgU2lTMzEwX0VNb2RlSURUYWJsZVtdID0KIHsKIAl7MHg2YSwweDIyMTIsMHgwMTAyLFNJU19SSV84MDB4NjAwLCAgMHgwMCwweDAwLDB4MDcsMHgwNiwweDAwLCAzfSwgLyogODAweDYwMHg/ICovCiAJezB4MmUsMHgwYTFiLDB4MDEwMSxTSVNfUklfNjQweDQ4MCwgIDB4MDAsMHgwMCwweDA1LDB4MDUsMHgwOCwgMn0sIC8qIDY0MHg0ODB4OCAqLwotICAgICAgICB7MHgyZiwweDBhMWIsMHgwMTAwLFNJU19SSV82NDB4NDAwLCAgMHgwMCwweDAwLDB4MDUsMHgwNSwweDEwLCAwfSwgLyogNjQweDQwMHg4ICovCisJezB4MmYsMHgwYTFiLDB4MDEwMCxTSVNfUklfNjQweDQwMCwgIDB4MDAsMHgwMCwweDA1LDB4MDUsMHgxMCwgMH0sIC8qIDY0MHg0MDB4OCAqLwogCXsweDMwLDB4MmExYiwweDAxMDMsU0lTX1JJXzgwMHg2MDAsICAweDAwLDB4MDAsMHgwNywweDA2LDB4MDAsIDN9LCAvKiA4MDB4NjAweDggKi8KLSAgICAgICAgezB4MzEsMHg0YTFiLDB4MDAwMCxTSVNfUklfNzIweDQ4MCwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHgxMSwtMX0sIC8qIDcyMHg0ODB4OCAqLworCXsweDMxLDB4NGExYiwweDAwMDAsU0lTX1JJXzcyMHg0ODAsICAweDAwLDB4MDAsMHgwNiwweDA2LDB4MTEsLTF9LCAvKiA3MjB4NDgweDggKi8KIAl7MHgzMiwweDRhMWIsMHgwMDAwLFNJU19SSV83MjB4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDEyLC0xfSwgLyogNzIweDU3Nng4ICovCiAJezB4MzMsMHg0YTFkLDB4MDAwMCxTSVNfUklfNzIweDQ4MCwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHgxMSwtMX0sIC8qIDcyMHg0ODB4MTYgKi8KIAl7MHgzNCwweDZhMWQsMHgwMDAwLFNJU19SSV83MjB4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDEyLC0xfSwgLyogNzIweDU3NngxNiAqLwpAQCAtMTAzLDEwICs3OSwxMCBAQAogCXsweDRkLDB4MGU3ZCwweDAxMWEsU0lTX1JJXzEyODB4MTAyNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MWEsIDh9LCAvKiAxMjgweDEwMjR4MTYgKi8KIAl7MHg1MCwweDlhMWIsMHgwMTMyLFNJU19SSV8zMjB4MjQwLCAgMHgwMCwweDAwLDB4MDQsMHgwNCwweDI2LCAyfSwgLyogMzIweDI0MHg4ICAqLwogCXsweDUxLDB4YmExYiwweDAxMzMsU0lTX1JJXzQwMHgzMDAsICAweDAwLDB4MDAsMHgwNywweDA3LDB4MjcsIDN9LCAvKiA0MDB4MzAweDggICovCi0gIAl7MHg1MiwweGJhMWIsMHgwMTM0LFNJU19SSV81MTJ4Mzg0LCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LCA0fSwgLyogNTEyeDM4NHg4ICAqLworCXsweDUyLDB4YmExYiwweDAxMzQsU0lTX1JJXzUxMngzODQsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsIDR9LCAvKiA1MTJ4Mzg0eDggICovCiAJezB4NTYsMHg5YTFkLDB4MDEzNSxTSVNfUklfMzIweDI0MCwgIDB4MDAsMHgwMCwweDA0LDB4MDQsMHgyNiwgMn0sIC8qIDMyMHgyNDB4MTYgKi8KIAl7MHg1NywweGJhMWQsMHgwMTM2LFNJU19SSV80MDB4MzAwLCAgMHgwMCwweDAwLDB4MDcsMHgwNywweDI3LCAzfSwgLyogNDAweDMwMHgxNiAqLwotIAl7MHg1OCwweGJhMWQsMHgwMTM3LFNJU19SSV81MTJ4Mzg0LCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LCA0fSwgLyogNTEyeDM4NHgxNiAqLworCXsweDU4LDB4YmExZCwweDAxMzcsU0lTX1JJXzUxMngzODQsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsIDR9LCAvKiA1MTJ4Mzg0eDE2ICovCiAJezB4NTksMHg5YTFiLDB4MDEzOCxTSVNfUklfMzIweDIwMCwgIDB4MDAsMHgwMCwweDA0LDB4MDQsMHgyNSwgMH0sIC8qIDMyMHgyMDB4OCAgKi8KIAl7MHg1YSwweDAyMWIsMHgwMTM4LFNJU19SSV8zMjB4MjQwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDNmLCAyfSwgLyogMzIweDI0MHg4ICBmc3RuICovCiAJezB4NWIsMHgwYTFkLDB4MDEzNSxTSVNfUklfMzIweDI0MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzZiwgMn0sIC8qIDMyMHgyNDB4MTYgZnN0biAqLwpAQCAtMTM5LDQwNiArMTE1LDMzNSBAQAogCXsweDIzLDB4MGUzYiwweDAwMDAsU0lTX1JJXzEyODB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsIDZ9LCAvKiAxMjgweDc2OHg4ICovCiAJezB4MjQsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTI4MHg3NjgsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgNn0sIC8qIDEyODB4NzY4eDE2ICovCiAJezB4MjUsMHgwZWZmLDB4MDAwMCxTSVNfUklfMTI4MHg3NjgsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwgNn0sIC8qIDEyODB4NzY4eDMyICovCi0JezB4MjYsMHgwZTNiLDB4MDAwMCxTSVNfUklfMTQwMHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MSwgOX0sIC8qIDE0MDB4MTA1MHg4ICovCi0JezB4MjcsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTQwMHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MSwgOX0sIC8qIDE0MDB4MTA1MHgxNiAqLwotCXsweDI4LDB4MGVmZiwweDAwMDAsU0lTX1JJXzE0MDB4MTA1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDEsIDl9LCAvKiAxNDAweDEwNTB4MzIqLwotCXsweDI5LDB4NGUxYiwweDAwMDAsU0lTX1JJXzExNTJ4ODY0LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsLTF9LCAvKiAxMTUyeDg2NCAqLwotCXsweDJhLDB4NGUzZCwweDAwMDAsU0lTX1JJXzExNTJ4ODY0LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsLTF9LAotCXsweDJiLDB4NGU3ZiwweDAwMDAsU0lTX1JJXzExNTJ4ODY0LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsLTF9LAotCXsweDM5LDB4NmExYiwweDAwMDAsU0lTX1JJXzg0OHg0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NDYsLTF9LCAvKiA4NDh4NDgwICovCi0JezB4M2IsMHg2YTNkLDB4MDAwMCxTSVNfUklfODQ4eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NiwtMX0sCi0JezB4M2UsMHg2YTdmLDB4MDAwMCxTSVNfUklfODQ4eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NiwtMX0sCi0JezB4M2YsMHg2YTFiLDB4MDAwMCxTSVNfUklfODU2eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwtMX0sIC8qIDg1Nng0ODAgKi8KLQl7MHg0MiwweDZhM2QsMHgwMDAwLFNJU19SSV84NTZ4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKLQl7MHg0NSwweDZhN2YsMHgwMDAwLFNJU19SSV84NTZ4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKLQl7MHg0OCwweDZhM2IsMHgwMDAwLFNJU19SSV8xMzYweDc2OCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwgLyogMTM2MHg3NjggKi8KLQl7MHg0YiwweDZhN2QsMHgwMDAwLFNJU19SSV8xMzYweDc2OCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwKLQl7MHg0ZSwweDZhZmYsMHgwMDAwLFNJU19SSV8xMzYweDc2OCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwKKwl7MHgyNiwweDBlM2IsMHgwMDAwLFNJU19SSV8xNDAweDEwNTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLCA5fSwgLyogMTQwMHgxMDUweDggKi8KKwl7MHgyNywweDBlN2QsMHgwMDAwLFNJU19SSV8xNDAweDEwNTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLCA5fSwgLyogMTQwMHgxMDUweDE2ICovCisJezB4MjgsMHgwZWZmLDB4MDAwMCxTSVNfUklfMTQwMHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywgOX0sIC8qIDE0MDB4MTA1MHgzMiovCisJezB4MjksMHg0ZTFiLDB4MDAwMCxTSVNfUklfMTE1Mng4NjQsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NSwtMX0sIC8qIDExNTJ4ODY0ICovCisJezB4MmEsMHg0ZTNkLDB4MDAwMCxTSVNfUklfMTE1Mng4NjQsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NSwtMX0sCisJezB4MmIsMHg0ZTdmLDB4MDAwMCxTSVNfUklfMTE1Mng4NjQsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NSwtMX0sCisJezB4MzksMHg2YTFiLDB4MDAwMCxTSVNfUklfODQ4eDQ4MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwtMX0sIC8qIDg0OHg0ODAgKi8KKwl7MHgzYiwweDZhM2QsMHgwMDAwLFNJU19SSV84NDh4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKKwl7MHgzZSwweDZhN2YsMHgwMDAwLFNJU19SSV84NDh4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LC0xfSwKKwl7MHgzZiwweDZhMWIsMHgwMDAwLFNJU19SSV84NTZ4NDgwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLC0xfSwgLyogODU2eDQ4MCAqLworCXsweDQyLDB4NmEzZCwweDAwMDAsU0lTX1JJXzg1Nng0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsLTF9LAorCXsweDQ1LDB4NmE3ZiwweDAwMDAsU0lTX1JJXzg1Nng0ODAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsLTF9LAorCXsweDQ4LDB4NmEzYiwweDAwMDAsU0lTX1JJXzEzNjB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGMsLTF9LCAvKiAxMzYweDc2OCAqLworCXsweDRiLDB4NmE3ZCwweDAwMDAsU0lTX1JJXzEzNjB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGMsLTF9LAorCXsweDRlLDB4NmFmZiwweDAwMDAsU0lTX1JJXzEzNjB4NzY4LCAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGMsLTF9LAogCXsweDRmLDB4OWExZiwweDAwMDAsU0lTX1JJXzMyMHgyMDAsICAweDAwLDB4MDAsMHgwNCwweDA0LDB4MjUsIDB9LCAvKiAzMjB4MjAweDMyICovCiAJezB4NTMsMHg5YTFmLDB4MDAwMCxTSVNfUklfMzIweDI0MCwgIDB4MDAsMHgwMCwweDA0LDB4MDQsMHgyNiwgMn0sIC8qIDMyMHgyNDB4MzIgKi8KIAl7MHg1NCwweGJhMWYsMHgwMDAwLFNJU19SSV80MDB4MzAwLCAgMHgwMCwweDAwLDB4MDcsMHgwNywweDI3LCAzfSwgLyogNDAweDMwMHgzMiAqLwotCXsweDVmLDB4NmExYiwweDAwMDAsU0lTX1JJXzc2OHg1NzYsICAweDAwLDB4MDAsMHgwNiwweDA2LDB4NGIsLTF9LCAvKiA3Njh4NTc2ICovCi0JezB4NjAsMHg2YTFkLDB4MDAwMCxTSVNfUklfNzY4eDU3NiwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHg0YiwtMX0sCi0JezB4NjEsMHg2YTNmLDB4MDAwMCxTSVNfUklfNzY4eDU3NiwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHg0YiwtMX0sCi0JezB4MTQsMHgwZTNiLDB4MDAwMCxTSVNfUklfMTI4MHg4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YywgN30sIC8qIDEyODB4ODAwICovCi0JezB4MTUsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTI4MHg4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YywgN30sCi0JezB4MTYsMHgwZWZmLDB4MDAwMCxTSVNfUklfMTI4MHg4MDAsIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YywgN30sCi0JezB4MTcsMHgwZTNiLDB4MDAwMCxTSVNfUklfMTY4MHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0ZCwgOX0sIC8qIDE2ODB4MTA1MCAqLwotCXsweDE4LDB4MGU3ZCwweDAwMDAsU0lTX1JJXzE2ODB4MTA1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGQsIDl9LAotCXsweDE5LDB4MGVmZiwweDAwMDAsU0lTX1JJXzE2ODB4MTA1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGQsIDl9LAotCXsweDJjLDB4MjY3YiwweDAwMDAsU0lTX1JJXzE5MjB4MTA4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGUsLTF9LCAvKiAxOTIweDEwODAoaSkgKi8KLQl7MHgyZCwweDI2ZmQsMHgwMDAwLFNJU19SSV8xOTIweDEwODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLC0xfSwKLQl7MHg3MywweDI3ZmYsMHgwMDAwLFNJU19SSV8xOTIweDEwODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLC0xfSwKLQl7MHgxZCwweDZhMWIsMHgwMDAwLFNJU19SSV85NjB4NTQwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRmLC0xfSwgLyogOTYweDU0MCAqLwotCXsweDFlLDB4NmEzZCwweDAwMDAsU0lTX1JJXzk2MHg1NDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGYsLTF9LAotCXsweDFmLDB4NmE3ZiwweDAwMDAsU0lTX1JJXzk2MHg1NDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NGYsLTF9LAotCXsweDIwLDB4NmExYiwweDAwMDAsU0lTX1JJXzk2MHg2MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NTAsLTF9LCAvKiA5NjB4NjAwICovCi0JezB4MjEsMHg2YTNkLDB4MDAwMCxTSVNfUklfOTYweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MCwtMX0sCi0JezB4MjIsMHg2YTdmLDB4MDAwMCxTSVNfUklfOTYweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MCwtMX0sCisJezB4NWYsMHg2YTFiLDB4MDAwMCxTSVNfUklfNzY4eDU3NiwgIDB4MDAsMHgwMCwweDA2LDB4MDYsMHg0ZCwtMX0sIC8qIDc2OHg1NzYgKi8KKwl7MHg2MCwweDZhMWQsMHgwMDAwLFNJU19SSV83Njh4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDRkLC0xfSwKKwl7MHg2MSwweDZhM2YsMHgwMDAwLFNJU19SSV83Njh4NTc2LCAgMHgwMCwweDAwLDB4MDYsMHgwNiwweDRkLC0xfSwKKwl7MHgxNCwweDBlM2IsMHgwMDAwLFNJU19SSV8xMjgweDgwMCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLCA3fSwgLyogMTI4MHg4MDAgKi8KKwl7MHgxNSwweDBlN2QsMHgwMDAwLFNJU19SSV8xMjgweDgwMCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLCA3fSwKKwl7MHgxNiwweDBlZmYsMHgwMDAwLFNJU19SSV8xMjgweDgwMCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDRlLCA3fSwKKwl7MHgxNywweDBlM2IsMHgwMDAwLFNJU19SSV8xNjgweDEwNTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUxLCA5fSwgLyogMTY4MHgxMDUwICovCisJezB4MTgsMHgwZTdkLDB4MDAwMCxTSVNfUklfMTY4MHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MSwgOX0sCisJezB4MTksMHgwZWZmLDB4MDAwMCxTSVNfUklfMTY4MHgxMDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MSwgOX0sCisJezB4MmMsMHgyNjdiLDB4MDAwMCxTSVNfUklfMTkyMHgxMDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwtMX0sIC8qIDE5MjB4MTA4MChpKSAqLworCXsweDJkLDB4MjZmZCwweDAwMDAsU0lTX1JJXzE5MjB4MTA4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTIsLTF9LAorCXsweDczLDB4MjdmZiwweDAwMDAsU0lTX1JJXzE5MjB4MTA4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTIsLTF9LAorCXsweDFkLDB4NmExYiwweDAwMDAsU0lTX1JJXzk2MHg1NDAsICAweDAwLDB4MDAsMHgwMCwweDAwLDB4NTMsLTF9LCAvKiA5NjB4NTQwICovCisJezB4MWUsMHg2YTNkLDB4MDAwMCxTSVNfUklfOTYweDU0MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MywtMX0sCisJezB4MWYsMHg2YTdmLDB4MDAwMCxTSVNfUklfOTYweDU0MCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MywtMX0sCisJezB4MjAsMHg2YTFiLDB4MDAwMCxTSVNfUklfOTYweDYwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1NCwtMX0sIC8qIDk2MHg2MDAgKi8KKwl7MHgyMSwweDZhM2QsMHgwMDAwLFNJU19SSV85NjB4NjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU0LC0xfSwKKwl7MHgyMiwweDZhN2YsMHgwMDAwLFNJU19SSV85NjB4NjAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU0LC0xfSwKKwl7MHgxYSwweDBlM2IsMHgwMDAwLFNJU19SSV8xMjgweDg1NCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU1LCA4fSwgLyogMTI4MHg4NTQgKi8KKwl7MHgxYiwweDBlN2QsMHgwMDAwLFNJU19SSV8xMjgweDg1NCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU1LCA4fSwKKwl7MHgxYywweDBlZmYsMHgwMDAwLFNJU19SSV8xMjgweDg1NCwgMHgwMCwweDAwLDB4MDAsMHgwMCwweDU1LCA4fSwKIAl7MHhmZiwweDAwMDAsMHgwMDAwLDAsICAgICAgICAgICAgICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLC0xfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19FeHQyU3RydWN0IFNpUzMxMF9SZWZJbmRleFtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfRXh0MiBTaVMzMTBfUmVmSW5kZXhbXSA9CiB7Ci0JezB4MDg1ZiwweDBkLDB4MDMsMHgwNSwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgwICovCi0JezB4MDA2NywweDBlLDB4MDQsMHgwNSwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgxICovCi0JezB4MDA2NywweDBmLDB4MDgsMHg0OCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgyICovCi0JezB4MDA2NywweDEwLDB4MDcsMHg4YiwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHgzICovCi0JezB4MDA0NywweDExLDB4MGEsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHg0ICovCi0JezB4MDA0NywweDEyLDB4MGQsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDQwfSwgLyogMHg1ICovCi0JezB4MDA0NywweDEzLDB4MTMsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDIwfSwgLyogMHg2ICovCi0JezB4MDEwNywweDE0LDB4MWMsMHgwMCwweDA1LDB4NmEsIDgwMCwgNjAwLCAweDIwfSwgLyogMHg3ICovCi0JezB4Yzg1ZiwweDA1LDB4MDAsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHg4ICovCi0JezB4YzA2NywweDA2LDB4MDIsMHgwNCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHg5ICovCi0JezB4YzA2NywweDA3LDB4MDIsMHg0NywweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhhICovCi0JezB4YzA2NywweDA4LDB4MDMsMHg4YSwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhiICovCi0JezB4YzA0NywweDA5LDB4MDUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhjICovCi0JezB4YzA0NywweDBhLDB4MDksMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhkICovCi0JezB4YzA0NywweDBiLDB4MGUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhlICovCi0JezB4YzA0NywweDBjLDB4MTUsMHgwMCwweDA0LDB4MmUsIDY0MCwgNDgwLCAweDQwfSwgLyogMHhmICovCi0JezB4NDg3ZiwweDA0LDB4MDAsMHgwMCwweDAwLDB4MmYsIDY0MCwgNDAwLCAweDMwfSwgLyogMHgxMCAqLwotCXsweGMwNmYsMHgzYywweDAxLDB4MDYsMHgxMywweDMxLCA3MjAsIDQ4MCwgMHgzMH0sIC8qIDB4MTEgKi8KLQl7MHgwMDZmLDB4M2QsMHgwMywweDA2LDB4MTQsMHgzMiwgNzIwLCA1NzYsIDB4MzB9LCAvKiAweDEyICovCi0JezB4MDA4NywweDE1LDB4MDYsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDMwfSwgLyogMHgxMyAqLwotCXsweGM4NzcsMHgxNiwweDBiLDB4MDYsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgyMH0sIC8qIDB4MTQgKi8KLQl7MHhjMDY3LDB4MTcsMHgwZiwweDQ5LDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MjB9LCAvKiAweDE1ICovCi0JezB4MDA2NywweDE4LDB4MTEsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDIwfSwgLyogMHgxNiAqLwotCXsweDAwNDcsMHgxOSwweDE2LDB4OGMsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgyMH0sIC8qIDB4MTcgKi8KLQl7MHgwMTA3LDB4MWEsMHgxYiwweDAwLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MTB9LCAvKiAweDE4ICovCi0JezB4MDEwNywweDFiLDB4MWYsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDEwfSwgLyogMHgxOSAqLwotCXsweDAwODcsMHgxYywweDExLDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMHgzMH0sIC8qIDB4MWEgKi8KLQl7MHgwMTM3LDB4MWQsMHgxOSwweDA3LDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB4MDB9LCAvKiAweDFiICovCi0JezB4MDEwNywweDFlLDB4MWUsMHgwMCwweDA3LDB4M2EsMTI4MCwxMDI0LCAweDAwfSwgLyogMHgxYyAqLwotCXsweDAyMDcsMHgxZiwweDIwLDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMHgwMH0sIC8qIDB4MWQgKi8KLQl7MHgwMjI3LDB4MjAsMHgyMSwweDA5LDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDB9LCAvKiAweDFlICovCi0JezB4MDQwNywweDIxLDB4MjIsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwfSwgLyogMHgxZiAqLwotCXsweDA0MDcsMHgyMiwweDIzLDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMH0sIC8qIDB4MjAgKi8KLQl7MHgwNDA3LDB4MjMsMHgyNSwweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDB9LCAvKiAweDIxICovCi0JezB4MDAwNywweDI0LDB4MjYsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwfSwgLyogMHgyMiAqLwotCXsweDAwMDcsMHgyNSwweDJjLDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMH0sIC8qIDB4MjMgKi8KLQl7MHgwMDA3LDB4MjYsMHgzNCwweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDB9LCAvKiAweDI0ICovCi0JezB4NDA3ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsIDMyMCwgMjAwLCAweDMwfSwgLyogMHgyNSAqLwotCXsweGMwN2YsMHgwMSwweDAwLDB4MDQsMHgwNCwweDUwLCAzMjAsIDI0MCwgMHgzMH0sIC8qIDB4MjYgKi8KLQl7MHgwMDdmLDB4MDIsMHgwNCwweDA1LDB4MDUsMHg1MSwgNDAwLCAzMDAsIDB4MzB9LCAvKiAweDI3ICovCi0JezB4YzA3NywweDAzLDB4MGIsMHgwNiwweDA2LDB4NTIsIDUxMiwgMzg0LCAweDMwfSwgLyogMHgyOCAqLwotCXsweDgwMDcsMHgyNywweDI3LDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMH0sIC8qIDB4MjkgKi8KLQl7MHg0MDA3LDB4MjgsMHgyOSwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDB9LCAvKiAweDJhICovCi0JezB4NDAwNywweDI5LDB4MmUsMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwfSwgLyogMHgyYiAqLwotCXsweDQwMDcsMHgyYSwweDMwLDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMH0sIC8qIDB4MmMgKi8KLQl7MHg0MDA3LDB4MmIsMHgzNSwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDB9LCAvKiAweDJkICovCi0JezB4NDAwNSwweDJjLDB4MzksMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwfSwgLyogMHgyZSAqLwotCXsweDQwMDcsMHgyZCwweDJiLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMHgwMH0sIC8qIDB4MmYgKi8KLQl7MHg0MDA3LDB4MmUsMHgzMSwweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDB9LCAvKiAweDMwICovCi0JezB4NDAwNywweDJmLDB4MzMsMHgwMCwweDAwLDB4NmMsMjA0OCwxNTM2LCAweDAwfSwgLyogMHgzMSAqLwotCXsweDQwMDcsMHgzMCwweDM3LDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMHgwMH0sIC8qIDB4MzIgKi8KLQl7MHg0MDA1LDB4MzEsMHgzOCwweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDB9LCAvKiAweDMzICovCi0JezB4MDA3NywweDMyLDB4NDAsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAweDMwfSwgLyogMHgzNCAqLwotCXsweDAwNDcsMHgzMywweDA3LDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMHgzMH0sIC8qIDB4MzUgKi8KLQl7MHgwMDQ3LDB4MzQsMHgwYSwweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDB4MzB9LCAvKiAweDM2ICovCi0JezB4MDA3NywweDM1LDB4MGIsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAweDMwfSwgLyogMHgzNyAqLwotCXsweDAwNDcsMHgzNiwweDExLDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMHgzMH0sIC8qIDB4MzggKi8KLQl7MHgwMDQ3LDB4MzcsMHgxNiwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDB4MzB9LCAvKiAweDM5ICovCi0JezB4MTEzNywweDM4LDB4MTksMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAweDMwfSwgLyogMHgzYSAqLwotCXsweDExMDcsMHgzOSwweDFlLDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMHgzMH0sIC8qIDB4M2IgKi8KLQl7MHgxMzA3LDB4M2EsMHgyMCwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDB4MzB9LCAvKiAweDNjICovCi0JezB4MDEyNywweDNiLDB4MTksMHgwOCwweDBhLDB4N2MsMTI4MCwgOTYwLCAweDMwfSwgLyogMHgzZCAqLwotCXsweDAyMjcsMHg0YywweDU5LDB4MDgsMHgwYSwweDdjLDEyODAsIDk2MCwgMHgyMH0sIC8qIDB4M2UgKi8KLQl7MHhjMDdmLDB4NGUsMHgwMCwweDA2LDB4MDQsMHg1YSwgMzIwLCAyNDAsIDB4MzB9LCAvKiAweDNmICovICAgIC8qIEZTVE4gMzIweDI0MCAqLwotICAgICAgICB7MHgwMDc3LDB4NDIsMHg1YiwweDA4LDB4MTEsMHgyMywxMjgwLCA3NjgsIDB4MzB9LCAvKiAweDQwICovICAgIC8qIDB4NWIgd2FzIDB4MTIgKi8KLQl7MHgwMTI3LDB4NDMsMHg0ZCwweDA4LDB4MGIsMHgyNiwxNDAwLDEwNTAsIDB4MzB9LCAvKiAweDQxICovCi0JezB4MDIwNywweDRiLDB4NWEsMHgwOCwweDBiLDB4MjYsMTQwMCwxMDUwLCAweDMwfSwgLyogMHg0MiAxNDAweDEwNTAtNzVIeiAqLwotCXsweDAxMjcsMHg1NCwweDZkLDB4MDAsMHgxYSwweDI5LDExNTIsIDg2NCwgMHgzMH0sIC8qIDB4NDMgMTE1Mng4NjQtNjBIeiAgKi8KLQl7MHgwMTI3LDB4NDQsMHgxOSwweDAwLDB4MWEsMHgyOSwxMTUyLCA4NjQsIDB4MzB9LCAvKiAweDQ0IDExNTJ4ODY0LTc1SHogICovCi0JezB4MDEyNywweDRhLDB4MWUsMHgwMCwweDFhLDB4MjksMTE1MiwgODY0LCAweDMwfSwgLyogMHg0NSAxMTUyeDg2NC04NUh6ICAqLwotCXsweDAwODcsMHg0NSwweDU3LDB4MDAsMHgxNiwweDM5LCA4NDgsIDQ4MCwgMHgzMH0sIC8qIDB4NDYgODQ4eDQ4MC0zOEh6aSAgKi8KLQl7MHhjMDY3LDB4NDYsMHg1NSwweDBiLDB4MTYsMHgzOSwgODQ4LCA0ODAsIDB4MzB9LCAvKiAweDQ3IDg0OHg0ODAtNjBIeiAgICovCi0JezB4MDA4NywweDQ3LDB4NTcsMHgwMCwweDE3LDB4M2YsIDg1NiwgNDgwLCAweDMwfSwgLyogMHg0OCA4NTZ4NDgwLTM4SHppICAqLwotCXsweGMwNjcsMHg0OCwweDU3LDB4MDAsMHgxNywweDNmLCA4NTYsIDQ4MCwgMHgzMH0sIC8qIDB4NDkgODU2eDQ4MC02MEh6ICAgKi8KLQl7MHgwMDY3LDB4NDksMHg1OCwweDBjLDB4MWIsMHg0OCwxMzYwLCA3NjgsIDB4MzB9LCAvKiAweDRhIDEzNjB4NzY4LTYwSHogICovCi0JezB4MDA2ZiwweDRkLDB4MDMsMHgwNiwweDE1LDB4NWYsIDc2OCwgNTc2LCAweDMwfSwgLyogMHg0YiA3Njh4NTc2LTU2SHogICAqLwotCXsweDAwNjcsMHg0ZiwweDVjLDB4MDgsMHgwZCwweDE0LDEyODAsIDgwMCwgMHgzMH0sIC8qIDB4NGMgMTI4MHg4MDAtNjBIeiAgKi8KLQl7MHgwMDY3LDB4NTAsMHg1ZCwweDBjLDB4MGUsMHgxNywxNjgwLDEwNTAsIDB4MzB9LCAvKiAweDRkIDE2ODB4MTA1MC02MEh6ICovCi0JezB4MDA4NywweDUxLDB4NjksMHgwMCwweDAwLDB4MmMsMTkyMCwxMDgwLCAweDMwfSwgLyogMHg0ZSAxOTIweDEwODAgNjBIemkgKi8KLQl7MHgwMDY3LDB4NTIsMHg2YSwweDAwLDB4MWMsMHgxZCwgOTYwLCA1NDAsIDB4MzB9LCAvKiAweDRmIDk2MHg1NDAgNjBIeiAqLwotCXsweDAwNzcsMHg1MywweDZiLDB4MGIsMHgxZCwweDIwLCA5NjAsIDYwMCwgMHgzMH0sIC8qIDB4NTAgOTYweDYwMCA2MEh6ICovCi0JezB4ZmZmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsICAgMCwgICAwLCAgICAwfQorCXsweDA4NWYsMHgwZCwweDAzLDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MCAqLworCXsweDAwNjcsMHgwZSwweDA0LDB4MDUsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MSAqLworCXsweDAwNjcsMHgwZiwweDA4LDB4NDgsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MiAqLworCXsweDAwNjcsMHgxMCwweDA3LDB4OGIsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MyAqLworCXsweDAwNDcsMHgxMSwweDBhLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NCAqLworCXsweDAwNDcsMHgxMiwweDBkLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NSAqLworCXsweDAwNDcsMHgxMywweDEzLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NiAqLworCXsweDAxMDcsMHgxNCwweDFjLDB4MDAsMHgwNSwweDZhLCA4MDAsIDYwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NyAqLworCXsweGM4NWYsMHgwNSwweDAwLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4OCAqLworCXsweGMwNjcsMHgwNiwweDAyLDB4MDQsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4OSAqLworCXsweGMwNjcsMHgwNywweDAyLDB4NDcsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4YSAqLworCXsweGMwNjcsMHgwOCwweDAzLDB4OGEsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4YiAqLworCXsweGMwNDcsMHgwOSwweDA1LDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4YyAqLworCXsweGMwNDcsMHgwYSwweDA5LDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4ZCAqLworCXsweGMwNDcsMHgwYiwweDBlLDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4ZSAqLworCXsweGMwNDcsMHgwYywweDE1LDB4MDAsMHgwNCwweDJlLCA2NDAsIDQ4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4ZiAqLworCXsweDQ4N2YsMHgwNCwweDAwLDB4MDAsMHgwMCwweDJmLCA2NDAsIDQwMCwgMHgzMCwgMHg1NSwgMHg2ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTAgKi8KKwl7MHhjMDZmLDB4M2MsMHgwMSwweDA2LDB4MTMsMHgzMSwgNzIwLCA0ODAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDExICovCisJezB4MDA2ZiwweDNkLDB4NmYsMHgwNiwweDE0LDB4MzIsIDcyMCwgNTc2LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxMiAoNmYgd2FzIDAzKSAqLworCXsweDAwODcsMHgxNSwweDA2LDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTMgKi8KKwl7MHhjODc3LDB4MTYsMHgwYiwweDA2LDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDE0ICovCisJezB4YzA2NywweDE3LDB4MGYsMHg0OSwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxNSAqLworCXsweDAwNjcsMHgxOCwweDExLDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTYgKi8KKwl7MHgwMDQ3LDB4MTksMHgxNiwweDhjLDB4MDYsMHgzNywxMDI0LCA3NjgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDE3ICovCisJezB4MDEwNywweDFhLDB4MWIsMHgwMCwweDA2LDB4MzcsMTAyNCwgNzY4LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxOCAqLworCXsweDAxMDcsMHgxYiwweDFmLDB4MDAsMHgwNiwweDM3LDEwMjQsIDc2OCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MTkgKi8KKwl7MHgwMDg3LDB4MWMsMHgxMSwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDFhICovCisJezB4MDEzNywweDFkLDB4MTksMHgwNywweDA3LDB4M2EsMTI4MCwxMDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxYiAqLworCXsweDAxMDcsMHgxZSwweDFlLDB4MDAsMHgwNywweDNhLDEyODAsMTAyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MWMgKi8KKwl7MHgwMjA3LDB4MWYsMHgyMCwweDAwLDB4MDcsMHgzYSwxMjgwLDEwMjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDFkICovCisJezB4MDIyNywweDIwLDB4MjEsMHgwOSwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgxZSAqLworCXsweDA0MDcsMHgyMSwweDIyLDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MWYgKi8KKwl7MHgwNDA3LDB4MjIsMHgyMywweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDIwICovCisJezB4MDQwNywweDIzLDB4MjUsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyMSAqLworCXsweDAwMDcsMHgyNCwweDI2LDB4MDAsMHgwOSwweDNjLDE2MDAsMTIwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MjIgKi8KKwl7MHgwMDA3LDB4MjUsMHgyYywweDAwLDB4MDksMHgzYywxNjAwLDEyMDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDIzICovCisJezB4MDAwNywweDI2LDB4MzQsMHgwMCwweDA5LDB4M2MsMTYwMCwxMjAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyNCAqLworCXsweDQwN2YsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLCAzMjAsIDIwMCwgMHgzMCwgMHg1NiwgMHg0ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MjUgKi8KKwl7MHhjMDdmLDB4MDEsMHgwMCwweDA0LDB4MDQsMHg1MCwgMzIwLCAyNDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDI2ICovCisJezB4MDA3ZiwweDAyLDB4MDQsMHgwNSwweDA1LDB4NTEsIDQwMCwgMzAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyNyAqLworCXsweGMwNzcsMHgwMywweDBiLDB4MDYsMHgwNiwweDUyLCA1MTIsIDM4NCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MjggKi8KKwl7MHg4MDA3LDB4MjcsMHgyNywweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDI5ICovCisJezB4NDAwNywweDI4LDB4MjksMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyYSAqLworCXsweDQwMDcsMHgyOSwweDJlLDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MmIgKi8KKwl7MHg0MDA3LDB4MmEsMHgzMCwweDAwLDB4MDAsMHg2OCwxOTIwLDE0NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDJjICovCisJezB4NDAwNywweDJiLDB4MzUsMHgwMCwweDAwLDB4NjgsMTkyMCwxNDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgyZCAqLworCXsweDQwMDUsMHgyYywweDM5LDB4MDAsMHgwMCwweDY4LDE5MjAsMTQ0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MmUgKi8KKwl7MHg0MDA3LDB4MmQsMHgyYiwweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDJmICovCisJezB4NDAwNywweDJlLDB4MzEsMHgwMCwweDAwLDB4NmMsMjA0OCwxNTM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgzMCAqLworCXsweDQwMDcsMHgyZiwweDMzLDB4MDAsMHgwMCwweDZjLDIwNDgsMTUzNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4MzEgKi8KKwl7MHg0MDA3LDB4MzAsMHgzNywweDAwLDB4MDAsMHg2YywyMDQ4LDE1MzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDMyICovCisJezB4NDAwNSwweDMxLDB4MzgsMHgwMCwweDAwLDB4NmMsMjA0OCwxNTM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgzMyAqLworCXsweDIwNzcsMHgzMiwweDQwLDB4MDgsMHgxOCwweDcwLCA4MDAsIDQ4MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHg0MCwgMHg1ZSwgMHg3M30sIC8qIDB4MzQgKi8KKwl7MHgyMDQ3LDB4MzMsMHgwNywweDA4LDB4MTgsMHg3MCwgODAwLCA0ODAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MDcsIDB4ZmYsIDB4ZmZ9LCAvKiAweDM1ICovCisJezB4MjA0NywweDM0LDB4MGEsMHgwOCwweDE4LDB4NzAsIDgwMCwgNDgwLCAweDMwLCAweDAwLCAweDAwLCAweDM0LCAweDBhLCAweGZmLCAweGZmfSwgLyogMHgzNiAqLworCXsweDIwNzcsMHgzNSwweDBiLDB4MDksMHgxOSwweDcxLDEwMjQsIDU3NiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzNSwgMHgwYiwgMHg1ZiwgMHg3NH0sIC8qIDB4MzcgKi8KKwl7MHgyMDQ3LDB4MzYsMHgxMSwweDA5LDB4MTksMHg3MSwxMDI0LCA1NzYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MzYsIDB4MTEsIDB4ZmYsIDB4ZmZ9LCAvKiAweDM4ICovCisJezB4MjA0NywweDM3LDB4MTYsMHgwOSwweDE5LDB4NzEsMTAyNCwgNTc2LCAweDMwLCAweDAwLCAweDAwLCAweDM3LCAweDE2LCAweGZmLCAweGZmfSwgLyogMHgzOSAqLworCXsweDMxMzcsMHgzOCwweDE5LDB4MGEsMHgwYywweDc1LDEyODAsIDcyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgxOSwgMHg2MCwgMHg3NX0sIC8qIDB4M2EgKi8KKwl7MHgzMTA3LDB4MzksMHgxZSwweDBhLDB4MGMsMHg3NSwxMjgwLCA3MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MzksIDB4MWUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDNiICovCisJezB4MzMwNywweDNhLDB4MjAsMHgwYSwweDBjLDB4NzUsMTI4MCwgNzIwLCAweDMwLCAweDAwLCAweDAwLCAweDNhLCAweDIwLCAweGZmLCAweGZmfSwgLyogMHgzYyAqLworCXsweDAxMjcsMHgzYiwweDE5LDB4MDgsMHgwYSwweDdjLDEyODAsIDk2MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4M2QgKi8KKwl7MHgwMjI3LDB4NGMsMHg1OSwweDA4LDB4MGEsMHg3YywxMjgwLCA5NjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDNlICovCisJezB4YzA3ZiwweDRlLDB4MDAsMHgwNiwweDA0LDB4NWEsIDMyMCwgMjQwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHgzZiAqLyAgICAvKiBGU1ROIDMyMHgyNDAgKi8KKwl7MHgyMDc3LDB4NDIsMHg1YiwweDA4LDB4MTEsMHgyMywxMjgwLCA3NjgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NTgsIDB4MTksIDB4NDIsIDB4NWJ9LCAvKiAweDQwICovICAgIC8qIDB4NWIgd2FzIDB4MTIgKi8KKwl7MHgyMDc3LDB4NDIsMHg1YiwweDA4LDB4MTEsMHgyMywxMjgwLCA3NjgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NTksIDB4MWUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDQxICovCisJezB4MjA3NywweDQyLDB4NWIsMHgwOCwweDExLDB4MjMsMTI4MCwgNzY4LCAweDMwLCAweDAwLCAweDAwLCAweDVhLCAweDIwLCAweGZmLCAweGZmfSwgLyogMHg0MiAqLworCXsweDAxMjcsMHg0MywweDRkLDB4MDgsMHgwYiwweDI2LDE0MDAsMTA1MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NDMgKi8KKwl7MHgwMjA3LDB4NGIsMHg1YSwweDA4LDB4MGIsMHgyNiwxNDAwLDEwNTAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDQ0IDE0MDB4MTA1MC03NUh6ICovCisJezB4MDEyNywweDU0LDB4NmQsMHgwMCwweDFhLDB4MjksMTE1MiwgODY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg0NSAxMTUyeDg2NC02MEh6ICAqLworCXsweDAxMjcsMHg0NCwweDE5LDB4MDAsMHgxYSwweDI5LDExNTIsIDg2NCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NDYgMTE1Mng4NjQtNzVIeiAgKi8KKwl7MHgwMTI3LDB4NGEsMHgxZSwweDAwLDB4MWEsMHgyOSwxMTUyLCA4NjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDQ3IDExNTJ4ODY0LTg1SHogICovCisJezB4MDA4NywweDQ1LDB4NTcsMHgwMCwweDE2LDB4MzksIDg0OCwgNDgwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg0OCA4NDh4NDgwLTM4SHppICAqLworCXsweGMwNjcsMHg0NiwweDU1LDB4MGIsMHgxNiwweDM5LCA4NDgsIDQ4MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NDkgODQ4eDQ4MC02MEh6ICAgKi8KKwl7MHgwMDg3LDB4NDcsMHg1NywweDAwLDB4MTcsMHgzZiwgODU2LCA0ODAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDRhIDg1Nng0ODAtMzhIemkgICovCisJezB4YzA2NywweDQ4LDB4NTcsMHgwMCwweDE3LDB4M2YsIDg1NiwgNDgwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg0YiA4NTZ4NDgwLTYwSHogICAqLworCXsweDAwNjcsMHg0OSwweDU4LDB4MGMsMHgxYiwweDQ4LDEzNjAsIDc2OCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NGMgMTM2MHg3NjgtNjBIeiAgKi8KKwl7MHgwMDZmLDB4NGQsMHg3MSwweDA2LDB4MTUsMHg1ZiwgNzY4LCA1NzYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDRkIDc2OHg1NzYtNTZIeiAgICovCisJezB4MjA2NywweDRmLDB4NWMsMHgwOCwweDBkLDB4MTQsMTI4MCwgODAwLCAweDMwLCAweDAwLCAweDAwLCAweDViLCAweDE5LCAweDRmLCAweDVjfSwgLyogMHg0ZSAxMjgweDgwMC02MEh6ICAqLworCXsweDIwNjcsMHg0ZiwweDVjLDB4MDgsMHgwZCwweDE0LDEyODAsIDgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHg1YywgMHgxZSwgMHhmZiwgMHhmZn0sIC8qIDB4NGYgMTI4MHg4MDAtNzVIeiAgKi8KKwl7MHgyMDY3LDB4NGYsMHg1YywweDA4LDB4MGQsMHgxNCwxMjgwLCA4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NWQsIDB4MjAsIDB4ZmYsIDB4ZmZ9LCAvKiAweDUwIDEyODB4ODAwLTg1SHogICovCisJezB4MDA2NywweDUwLDB4NWQsMHgwYywweDBlLDB4MTcsMTY4MCwxMDUwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg1MSAxNjgweDEwNTAtNjBIeiAqLworCXsweDAwODcsMHg1MSwweDY5LDB4MDAsMHgwMCwweDJjLDE5MjAsMTA4MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIDB4NTIgMTkyMHgxMDgwIDYwSHppICovCisJezB4MDA2NywweDUyLDB4NmEsMHgwMCwweDFjLDB4MWQsIDk2MCwgNTQwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogMHg1MyA5NjB4NTQwIDYwSHogKi8KKwl7MHgwMDc3LDB4NTMsMHg2YiwweDBiLDB4MWQsMHgyMCwgOTYwLCA2MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAweDU0IDk2MHg2MDAgNjBIeiAqLworCXsweDIwNjcsMHg2MSwweDc2LDB4MGQsMHgyMiwweDFhLDEyODAsIDg1NCwgMHgzMCwgMHgwMCwgMHgwMCwgMHg2MiwgMHgxOSwgMHg2MSwgMHg3Nn0sIC8qIDB4NTUgMTI4MHg4NTQtNjBIeiAgKi8KKwl7MHgyMDY3LDB4NjEsMHg3NiwweDBkLDB4MjIsMHgxYSwxMjgwLCA4NTQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4NjMsIDB4MWUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDU2IDEyODB4ODU0LTc1SHogICovCisJezB4MjA2NywweDYxLDB4NzYsMHgwZCwweDIyLDB4MWEsMTI4MCwgODU0LCAweDMwLCAweDAwLCAweDAwLCAweDY0LCAweDIwLCAweGZmLCAweGZmfSwgLyogMHg1NyAxMjgweDg1NC04NUh6ICAqLworCXsweGZmZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLCAgIDAsICAgMCwgICAgMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KIH07CiAKLSNpZmRlZiBMSU5VWF9YRjg2Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQlVQ0hBUiAgRXh0X01vZGVJRDsgICAgIC8qIE1vZGVJRCBpbiBuZXcgUk9NICovCi0JVUNIQVIgIEV4dF9NeU1vZGVJRDsgICAvKiBjb3JyZXNwb25kaW5nIE1vZGVJRCBpbiBteSB0YWJsZXMgKDAgPSBpZGVudGljYWwpICovCi0JVVNIT1JUIEV4dF9WRVNBSUQ7ICAgICAvKiBjb3JyZXNwb25kaW5nIFZFU0EgSUQgaW4gbmV3IFJPTSAqLwotfSBTaVNfRU1vZGVJRFRhYmxlNjYxW10gPSB7Ci0gICAgICAgIHsgMHg2YSwgMHgwMCwgMHgwMTAyIH0sCi0JeyAweDFkLCAweDIwLCAweDAwMDAgfSwKLQl7IDB4MWUsIDB4MjEsIDB4MDAwMCB9LAotCXsgMHgxZiwgMHgyMiwgMHgwMDAwIH0sCi0JeyAweDIwLCAweDI5LCAweDAwMDAgfSwKLQl7IDB4MjEsIDB4MmEsIDB4MDAwMCB9LAotCXsgMHgyMiwgMHgyYiwgMHgwMDAwIH0sCi0JeyAweDIzLCAweDAwLCAweDAxMWMgfSwKLQl7IDB4MjQsIDB4MDAsIDB4MDExZCB9LAotCXsgMHgyNSwgMHgwMCwgMHgwMTFlIH0sCi0JeyAweDI2LCAweDAwLCAweDAxMWYgfSwKLQl7IDB4MjcsIDB4MDAsIDB4MDEyMCB9LAotCXsgMHgyOCwgMHgwMCwgMHgwMTIxIH0sCi0JeyAweDJhLCAweDE0LCAweDAxM2QgfSwKLQl7IDB4MmIsIDB4MTUsIDB4MDEzZSB9LAotCXsgMHgyYywgMHgxNiwgMHgwMTNmIH0sCi0JeyAweDJlLCAweDAwLCAweDAxMDEgfSwKLQl7IDB4MmYsIDB4MDAsIDB4MDEwMCB9LAotCXsgMHgzMCwgMHgwMCwgMHgwMTAzIH0sCi0JeyAweDM3LCAweDAwLCAweDAxMDQgfSwKLQl7IDB4MzgsIDB4MDAsIDB4MDEwNSB9LAotCXsgMHgzYSwgMHgwMCwgMHgwMTA3IH0sCi0JeyAweDNjLCAweDAwLCAweDAxMjUgfSwKLQl7IDB4M2QsIDB4MDAsIDB4MDEyNiB9LAotCXsgMHg0MCwgMHgwMCwgMHgwMTBkIH0sCi0JeyAweDQxLCAweDAwLCAweDAxMGUgfSwKLQl7IDB4NDMsIDB4MDAsIDB4MDExMCB9LAotCXsgMHg0NCwgMHgwMCwgMHgwMTExIH0sCi0JeyAweDQ2LCAweDAwLCAweDAxMTMgfSwKLQl7IDB4NDcsIDB4MDAsIDB4MDExNCB9LAotCXsgMHg0OSwgMHgwMCwgMHgwMTE2IH0sCi0JeyAweDRhLCAweDAwLCAweDAxMTcgfSwKLQl7IDB4NGMsIDB4MDAsIDB4MDExOSB9LAotCXsgMHg0ZCwgMHgwMCwgMHgwMTFhIH0sCi0JeyAweDUwLCAweDAwLCAweDAxMjcgfSwKLQl7IDB4NTEsIDB4MDAsIDB4MDEyOCB9LAotCXsgMHg1MiwgMHgwMCwgMHgwMTI5IH0sCi0JeyAweDU2LCAweDAwLCAweDAxMmEgfSwKLQl7IDB4NTcsIDB4MDAsIDB4MDEyYiB9LAotCXsgMHg1OCwgMHgwMCwgMHgwMTJjIH0sCi0JeyAweDU5LCAweDAwLCAweDAxMmQgfSwKLQl7IDB4NWEsIDB4MTcsIDB4MDEyZSB9LAotCXsgMHg1YiwgMHgxOCwgMHgwMTJmIH0sCi0JeyAweDVjLCAweDE5LCAweDAxMzAgfSwKLQl7IDB4NWQsIDB4MDAsIDB4MDEzMSB9LAotCXsgMHg2MiwgMHgwMCwgMHgwMTEyIH0sCi0JeyAweDYzLCAweDAwLCAweDAxMTUgfSwKLQl7IDB4NjQsIDB4MDAsIDB4MDExOCB9LAotCXsgMHg2NSwgMHgwMCwgMHgwMTFiIH0sCi0JeyAweDY2LCAweDAwLCAweDAxMzIgfSwKLQl7IDB4NzUsIDB4MDAsIDB4MDEzYSB9LAotCXsgMHg3OCwgMHgwMCwgMHgwMTNiIH0sCi0JeyAweDc5LCAweDAwLCAweDAxM2MgfSwKLQl7IDB4N2IsIDB4N2MsIDB4MDEzNiB9LAotCXsgMHg3YywgMHg3ZCwgMHgwMTM3IH0sCi0JeyAweDdkLCAweDdlLCAweDAxMzggfSwKLQl7IDB4ZmYsIDB4ZmYsIDB4ZmZmZiB9Ci19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBTaVNfQ1JUMVRhYmxlU3RydWN0IFNpUzMxMF9DUlQxVGFibGVbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0NSVDFUYWJsZSBTaVMzMTBfQ1JUMVRhYmxlW10gPQogewogIHt7MHgyZCwweDI3LDB4MjgsMHg5MCwweDJjLDB4ODAsMHhiZiwweDFmLAogICAgMHg5YywweDhlLDB4OGYsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LCAvKiAweDAgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MCAqLwogIHt7MHgyZCwweDI3LDB4MjgsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAogICAgMHhlOSwweDhiLDB4ZGYsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAotICAgMHgwMH19LCAvKiAweDEgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MSAqLwogIHt7MHgzZCwweDMxLDB4MzEsMHg4MSwweDM3LDB4MWYsMHg3MiwweGYwLAogICAgMHg1OCwweDhjLDB4NTcsMHg1NywweDczLDB4MjAsMHgwMCwweDA1LAotICAgMHgwMX19LCAvKiAweDIgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MiAqLwogIHt7MHg0ZiwweDNmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAogICAgMHgwMiwweDg4LDB4ZmYsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LCAvKiAweDMgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MyAqLwogIHt7MHg1ZiwweDRmLDB4NTAsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAogICAgMHg5YywweDhlLDB4OGYsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LCAvKiAweDQgKi8KLSNpZiAwCi0ge3sweDVmLDB4NGYsMHg1MCwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sIC8qIDB4NSAqLwotI2VuZGlmCi0ge3sweDVmLDB4NGYsMHg0ZiwweDgzLDB4NTUsMHg4MSwweDBiLDB4M2UsICAgIC8qIDB4MDUgLSBjb3JyZWN0ZWQgNjQweDQ4MC02MCAqLworICAgMHgwMH19LCAgLyogMHg0ICovCisge3sweDVmLDB4NGYsMHg0ZiwweDgzLDB4NTUsMHg4MSwweDBiLDB4M2UsICAgIC8qIGNvcnJlY3RlZCA2NDB4NDgwLTYwICovCiAgICAweGU5LDB4OGIsMHhkZiwweGU4LDB4MGMsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0jaWYgMCAgIAotIHt7MHg2MywweDRmLDB4NTAsMHg4NiwweDU2LDB4OWIsMHgwNiwweDNlLAotICAgMHhlOCwweDhiLDB4ZGYsMHhlNywweGZmLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMH19LCAvKiAweDYgKi8KLSNlbmRpZgotIHt7MHg2MywweDRmLDB4NGYsMHg4NywweDU2LDB4OWIsMHgwNiwweDNlLCAgICAvKiAweDA2IC0gY29ycmVjdGVkIDY0MHg0ODAtNzIgKi8KKyAgIDB4MDB9fSwgIC8qIDB4NSAqLworIHt7MHg2MywweDRmLDB4NGYsMHg4NywweDU2LDB4OWIsMHgwNiwweDNlLCAgICAvKiBjb3JyZWN0ZWQgNjQweDQ4MC03MiAqLwogICAgMHhlOCwweDhhLDB4ZGYsMHhlNywweDA3LDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAorICAgMHgwMH19LCAgLyogMHg2ICovCiAge3sweDY0LDB4NGYsMHg0ZiwweDg4LDB4NTUsMHg5ZCwweGYyLDB4MWYsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZjMsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwfX0sIC8qIDB4NyAqLworICAgMHgwMH19LCAgLyogMHg3ICovCiAge3sweDYzLDB4NGYsMHg0ZiwweDg3LDB4NWEsMHg4MSwweGZiLDB4MWYsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sIC8qIDB4OCAqLworICAgMHgwMH19LCAgLyogMHg4ICovCiAge3sweDY1LDB4NGYsMHg0ZiwweDg5LDB4NTgsMHg4MCwweGZiLDB4MWYsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDUsICAvKiBDb3JyZWN0ZWQgVkJFICovCi0gICAweDYxfX0sIC8qIDB4OSAqLworICAgMHg2MX19LCAgLyogMHg5ICovCiAge3sweDY1LDB4NGYsMHg0ZiwweDg5LDB4NTgsMHg4MCwweDAxLDB4M2UsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4MDIsMHgwMCwweDAwLDB4MDUsCi0gICAweDYxfX0sIC8qIDB4YSAqLworICAgMHg2MX19LCAgLyogMHhhICovCiAge3sweDY3LDB4NGYsMHg0ZiwweDhiLDB4NTgsMHg4MSwweDBkLDB4M2UsCiAgICAweGUwLDB4ODMsMHhkZiwweGRmLDB4MGUsMHgwMCwweDAwLDB4MDUsICAvKiBDb3JyZWN0ZWQgVkJFICovCi0gICAweDYxfX0sIC8qIDB4YiAqLworICAgMHg2MX19LCAgLyogMHhiICovCiAge3sweDY1LDB4NGYsMHg0ZiwweDg5LDB4NTcsMHg5ZiwweGZiLDB4MWYsCiAgICAweGU2LDB4OGEsMHhkZiwweGRmLDB4ZmMsMHgxMCwweDAwLDB4MDEsICAvKiBDb3JyZWN0ZWQgVkRFLCBWQkUgKi8KLSAgIDB4MDB9fSwgLyogMHhjICovCisgICAweDAwfX0sICAvKiAweGMgKi8KICB7ezB4N2IsMHg2MywweDYzLDB4OWYsMHg2YSwweDkzLDB4NmYsMHhmMCwKICAgIDB4NTgsMHg4YSwweDU3LDB4NTcsMHg3MCwweDIwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwgLyogMHhkICovCisgICAweDAxfX0sICAvKiAweGQgKi8KICB7ezB4N2YsMHg2MywweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKICAgIDB4NTgsMHg4YywweDU3LDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHhlICovCisgICAweDAxfX0sICAvKiAweGUgKi8KICB7ezB4N2QsMHg2MywweDYzLDB4ODEsMHg2ZSwweDFkLDB4OTgsMHhmMCwKICAgIDB4N2MsMHg4MiwweDU3LDB4NTcsMHg5OSwweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHhmICovCisgICAweDAxfX0sICAvKiAweGYgKi8KICB7ezB4N2YsMHg2MywweDYzLDB4ODMsMHg2OSwweDEzLDB4NmYsMHhmMCwKICAgIDB4NTgsMHg4YiwweDU3LDB4NTcsMHg3MCwweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHgxMCAqLworICAgMHgwMX19LCAgLyogMHgxMCAqLwogIHt7MHg3ZSwweDYzLDB4NjMsMHg4MiwweDZiLDB4MTMsMHg3NSwweGYwLAogICAgMHg1OCwweDhiLDB4NTcsMHg1NywweDc2LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMX19LCAvKiAweDExICovCisgICAweDAxfX0sICAvKiAweDExICovCiAge3sweDgxLDB4NjMsMHg2MywweDg1LDB4NmQsMHgxOCwweDdhLDB4ZjAsCiAgICAweDU4LDB4OGIsMHg1NywweDU3LDB4N2IsMHgyMCwweDAwLDB4MDYsCi0gICAweDYxfX0sIC8qIDB4MTIgKi8KKyAgIDB4NjF9fSwgIC8qIDB4MTIgKi8KICB7ezB4ODMsMHg2MywweDYzLDB4ODcsMHg2ZSwweDE5LDB4ODEsMHhmMCwKICAgIDB4NTgsMHg4YiwweDU3LDB4NTcsMHg4MiwweDIwLDB4MDAsMHgwNiwKLSAgIDB4NjF9fSwgLyogMHgxMyAqLworICAgMHg2MX19LCAgLyogMHgxMyAqLwogIHt7MHg4NSwweDYzLDB4NjMsMHg4OSwweDZmLDB4MWEsMHg5MSwweGYwLAogICAgMHg1OCwweDhiLDB4NTcsMHg1NywweDkyLDB4MjAsMHgwMCwweDA2LAotICAgMHg2MX19LCAvKiAweDE0ICovCisgICAweDYxfX0sICAvKiAweDE0ICovCiAge3sweDk5LDB4N2YsMHg3ZiwweDlkLDB4ODQsMHgxYSwweDk2LDB4MWYsCiAgICAweDdmLDB4ODMsMHg3ZiwweDdmLDB4OTcsMHgxMCwweDAwLDB4MDIsCi0gICAweDAwfX0sIC8qIDB4MTUgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MTUgKi8KICB7ezB4YTMsMHg3ZiwweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmNSwKICAgIDB4MDIsMHg4OCwweGZmLDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwgLyogMHgxNiAqLworICAgMHgwMX19LCAgLyogMHgxNiAqLwogIHt7MHhhMSwweDdmLDB4N2YsMHg4NSwweDg2LDB4OTcsMHgyNCwweGY1LAogICAgMHgwMiwweDg4LDB4ZmYsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19LCAvKiAweDE3ICovCisgICAweDAxfX0sICAvKiAweDE3ICovCiAge3sweDlmLDB4N2YsMHg3ZiwweDgzLDB4ODUsMHg5MSwweDFlLDB4ZjUsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MWYsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sIC8qIDB4MTggKi8KKyAgIDB4MDF9fSwgIC8qIDB4MTggKi8KICB7ezB4YTcsMHg3ZiwweDdmLDB4OGIsMHg4OSwweDk1LDB4MjYsMHhmNSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgyNywweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwgLyogMHgxOSAqLworICAgMHgwMX19LCAgLyogMHgxOSAqLwogIHt7MHhhOSwweDdmLDB4N2YsMHg4ZCwweDhjLDB4OWEsMHgyYywweGY1LAogICAgMHgwMCwweDgzLDB4ZmYsMHhmZiwweDJkLDB4MTQsMHgwMCwweDAyLAotICAgMHg2Mn19LCAvKiAweDFhICovCisgICAweDYyfX0sICAvKiAweDFhICovCiAge3sweGFiLDB4N2YsMHg3ZiwweDhmLDB4OGQsMHg5YiwweDM1LDB4ZjUsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MzYsMHgxNCwweDAwLDB4MDIsCi0gICAweDYyfX0sIC8qIDB4MWIgKi8KKyAgIDB4NjJ9fSwgIC8qIDB4MWIgKi8KICB7ezB4Y2YsMHg5ZiwweDlmLDB4OTMsMHhiMiwweDAxLDB4MTQsMHhiYSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgxNSwweDAwLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwgLyogMHgxYyAqLworICAgMHgwMH19LCAgLyogMHgxYyAqLwogIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE5LDB4MTcsMHgyOCwweDVhLAogICAgMHgwMCwweDgzLDB4ZmYsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDFkICovCisgICAweDAxfX0sICAvKiAweDFkICovCiAge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTUsMHgxNywweDI4LDB4NWEsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MjksMHgwOSwweDAwLDB4MDcsCi0gICAweDAxfX0sIC8qIDB4MWUgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MWUgKi8KICB7ezB4ZDMsMHg5ZiwweDlmLDB4OTcsMHhhYiwweDFmLDB4MmUsMHg1YSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgyZiwweDA5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwgLyogMHgxZiAqLworICAgMHgwMX19LCAgLyogMHgxZiAqLwogIHt7MHgwOSwweGM3LDB4YzcsMHg4ZCwweGQzLDB4MGIsMHhlMCwweDEwLAogICAgMHhiMCwweDgzLDB4YWYsMHhhZiwweGUxLDB4MmYsMHgwMSwweDA0LAotICAgMHgwMH19LCAvKiAweDIwICovCisgICAweDAwfX0sICAvKiAweDIwICovCiAge3sweDA5LDB4YzcsMHhjNywweDhkLDB4ZDMsMHgwYiwweGUwLDB4MTAsCiAgICAweGIwLDB4ODMsMHhhZiwweGFmLDB4ZTEsMHgyZiwweDAxLDB4MDQsCi0gICAweDAwfX0sIC8qIDB4MjEgQCA0MDg0ICovCisgICAweDAwfX0sICAvKiAweDIxICovCiAge3sweDA5LDB4YzcsMHhjNywweDhkLDB4ZDMsMHgwYiwweGUwLDB4MTAsCiAgICAweGIwLDB4ODMsMHhhZiwweGFmLDB4ZTEsMHgyZiwweDAxLDB4MDQsCi0gICAweDAwfX0sIC8qIDB4MjIgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MjIgKi8KICB7ezB4MDksMHhjNywweGM3LDB4OGQsMHhkMywweDBiLDB4ZTAsMHgxMCwKICAgIDB4YjAsMHg4MywweGFmLDB4YWYsMHhlMSwweDJmLDB4MDEsMHgwNCwKLSAgIDB4MDB9fSwgLyogMHgyMyAqLworICAgMHgwMH19LCAgLyogMHgyMyAqLwogIHt7MHgwOSwweGM3LDB4YzcsMHg4ZCwweGQzLDB4MGIsMHhlMCwweDEwLAogICAgMHhiMCwweDgzLDB4YWYsMHhhZiwweGUxLDB4MmYsMHgwMSwweDA0LAotICAgMHgwMH19LCAvKiAweDI0ICovCisgICAweDAwfX0sICAvKiAweDI0ICovCiAge3sweDA5LDB4YzcsMHhjNywweDhkLDB4ZDMsMHgwYiwweGUwLDB4MTAsCiAgICAweGIwLDB4ODMsMHhhZiwweGFmLDB4ZTEsMHgyZiwweDAxLDB4MDQsCi0gICAweDAwfX0sIC8qIDB4MjUgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MjUgKi8KICB7ezB4MDksMHhjNywweGM3LDB4OGQsMHhkMywweDBiLDB4ZTAsMHgxMCwKICAgIDB4YjAsMHg4MywweGFmLDB4YWYsMHhlMSwweDJmLDB4MDEsMHgwNCwKLSAgIDB4MDB9fSwgLyogMHgyNiAqLworICAgMHgwMH19LCAgLyogMHgyNiAqLwogIHt7MHg0MCwweGVmLDB4ZWYsMHg4NCwweDAzLDB4MWQsMHhkYSwweDFmLAogICAgMHhhMCwweDgzLDB4OWYsMHg5ZiwweGRiLDB4MWYsMHg0MSwweDAxLAotICAgMHgwMH19LCAvKiAweDI3ICovCisgICAweDAwfX0sICAvKiAweDI3ICovCiAge3sweDQzLDB4ZWYsMHhlZiwweDg3LDB4MDYsMHgwMCwweGQ0LDB4MWYsCiAgICAweGEwLDB4ODMsMHg5ZiwweDlmLDB4ZDUsMHgxZiwweDQxLDB4MDUsCi0gICAweDYzfX0sIC8qIDB4MjggKi8KKyAgIDB4NjN9fSwgIC8qIDB4MjggKi8KICB7ezB4NDUsMHhlZiwweGVmLDB4ODksMHgwNywweDAxLDB4ZDksMHgxZiwKICAgIDB4YTAsMHg4MywweDlmLDB4OWYsMHhkYSwweDFmLDB4NDEsMHgwNSwKLSAgIDB4NjN9fSwgLyogMHgyOSAqLworICAgMHg2M319LCAgLyogMHgyOSAqLwogIHt7MHg0MCwweGVmLDB4ZWYsMHg4NCwweDAzLDB4MWQsMHhkYSwweDFmLAogICAgMHhhMCwweDgzLDB4OWYsMHg5ZiwweGRiLDB4MWYsMHg0MSwweDAxLAotICAgMHgwMH19LCAvKiAweDJhICovCisgICAweDAwfX0sICAvKiAweDJhICovCiAge3sweDQwLDB4ZWYsMHhlZiwweDg0LDB4MDMsMHgxZCwweGRhLDB4MWYsCiAgICAweGEwLDB4ODMsMHg5ZiwweDlmLDB4ZGIsMHgxZiwweDQxLDB4MDEsCi0gICAweDAwfX0sIC8qIDB4MmIgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MmIgKi8KICB7ezB4NDAsMHhlZiwweGVmLDB4ODQsMHgwMywweDFkLDB4ZGEsMHgxZiwKICAgIDB4YTAsMHg4MywweDlmLDB4OWYsMHhkYiwweDFmLDB4NDEsMHgwMSwKLSAgIDB4MDB9fSwgLyogMHgyYyAqLworICAgMHgwMH19LCAgLyogMHgyYyAqLwogIHt7MHg1OSwweGZmLDB4ZmYsMHg5ZCwweDE3LDB4MTMsMHgzMywweGJhLAogICAgMHgwMCwweDgzLDB4ZmYsMHhmZiwweDM0LDB4MGYsMHg0MSwweDA1LAotICAgMHg0NH19LCAvKiAweDJkICovCisgICAweDQ0fX0sICAvKiAweDJkICovCiAge3sweDViLDB4ZmYsMHhmZiwweDlmLDB4MTgsMHgxNCwweDM4LDB4YmEsCiAgICAweDAwLDB4ODMsMHhmZiwweGZmLDB4MzksMHgwZiwweDQxLDB4MDUsCi0gICAweDQ0fX0sIC8qIDB4MmUgKi8KKyAgIDB4NDR9fSwgIC8qIDB4MmUgKi8KICB7ezB4NWIsMHhmZiwweGZmLDB4OWYsMHgxOCwweDE0LDB4M2QsMHhiYSwKICAgIDB4MDAsMHg4MywweGZmLDB4ZmYsMHgzZSwweDBmLDB4NDEsMHgwNSwKLSAgIDB4NDR9fSwgLyogMHgyZiAqLworICAgMHg0NH19LCAgLyogMHgyZiAqLwogIHt7MHg1ZCwweGZmLDB4ZmYsMHg4MSwweDE5LDB4OTUsMHg0MSwweGJhLAogICAgMHgwMCwweDg0LDB4ZmYsMHhmZiwweDQyLDB4MGYsMHg0MSwweDA1LAotICAgMHg0NH19LCAvKiAweDMwICovCisgICAweDQ0fX0sICAvKiAweDMwICovCiAge3sweDU1LDB4ZmYsMHhmZiwweDk5LDB4MGQsMHgwYywweDNlLDB4YmEsCiAgICAweDAwLDB4ODQsMHhmZiwweGZmLDB4M2YsMHgwZiwweDQxLDB4MDUsCi0gICAweDAwfX0sIC8qIDB4MzEgKi8KKyAgIDB4MDB9fSwgIC8qIDB4MzEgKi8KICB7ezB4N2YsMHg2MywweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhiYSwKICAgIDB4MjcsMHg4YiwweGRmLDB4ZGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwgLyogMHgzMiAqLworICAgMHgwMX19LCAgLyogMHgzMiAqLwogIHt7MHg3ZiwweDYzLDB4NjMsMHg4MywweDY5LDB4MTMsMHg2ZiwweGJhLAogICAgMHgyNiwweDg5LDB4ZGYsMHhkZiwweDZmLDB4MDAsMHgwMCwweDA2LAotICAgMHgwMX19LCAvKiAweDMzICovCisgICAweDAxfX0sICAvKiAweDMzICovCiAge3sweDdmLDB4NjMsMHg2MywweDgyLDB4NmIsMHgxMywweDc1LDB4YmEsCiAgICAweDI5LDB4OGMsMHhkZiwweGRmLDB4NzUsMHgwMCwweDAwLDB4MDYsCi0gICAweDAxfX0sIC8qIDB4MzQgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MzQgKi8KICB7ezB4YTMsMHg3ZiwweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmMSwKICAgIDB4YWYsMHg4NSwweDNmLDB4M2YsMHgyNSwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwgLyogMHgzNSAqLworICAgMHgwMX19LCAgLyogMHgzNSAqLwogIHt7MHg5ZiwweDdmLDB4N2YsMHg4MywweDg1LDB4OTEsMHgxZSwweGYxLAogICAgMHhhZCwweDgxLDB4M2YsMHgzZiwweDFmLDB4MzAsMHgwMCwweDAyLAotICAgMHgwMX19LCAvKiAweDM2ICovCisgICAweDAxfX0sICAvKiAweDM2ICovCiAge3sweGE3LDB4N2YsMHg3ZiwweDg4LDB4ODksMHg5NSwweDI2LDB4ZjEsICAgLyogOTUgd2FzIDE1IC0gaWxsZWdhbCBIQkUhICovCiAgICAweGIxLDB4ODUsMHgzZiwweDNmLDB4MjcsMHgzMCwweDAwLDB4MDIsCi0gICAweDAxfX0sIC8qIDB4MzcgKi8KKyAgIDB4MDF9fSwgIC8qIDB4MzcgKi8KICB7ezB4Y2UsMHg5ZiwweDlmLDB4OTIsMHhhOSwweDE3LDB4MjgsMHhjNCwKICAgIDB4N2EsMHg4ZSwweGNmLDB4Y2YsMHgyOSwweDIxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwgLyogMHgzOCAqLworICAgMHgwMX19LCAgLyogMHgzOCAqLwogIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE1LDB4MTcsMHgyOCwweGQ0LAogICAgMHg3YSwweDhlLDB4Y2YsMHhjZiwweDI5LDB4MjEsMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDM5ICovCisgICAweDAxfX0sICAvKiAweDM5ICovCiAge3sweGQzLDB4OWYsMHg5ZiwweDk3LDB4YWIsMHgxZiwweDJlLDB4ZDQsCiAgICAweDdkLDB4ODEsMHhjZiwweGNmLDB4MmYsMHgyMSwweDAwLDB4MDcsCi0gICAweDAxfX0sIC8qIDB4M2EgKi8KLSNpZiAwICAgCi0ge3sweGRjLDB4OWYsMHg5ZiwweDAwLDB4YWIsMHgxOSwweGU2LDB4ZWYsCS8qIDEyODB4OTYwIC0gaW52YWxpZCAqLwotICAgMHhjMCwweGMzLDB4YmYsMHhiZiwweGU3LDB4MTAsMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDNiICovCi0jZW5kaWYgIAorICAgMHgwMX19LCAgLyogMHgzYSAqLwogIHt7MHhkYywweDlmLDB4OWYsMHg4MCwweGFmLDB4OWQsMHhlNiwweGZmLAkvKiAxMjgweDk2MC02MCAtIGNvcnJlY3RlZCAqLwogICAgMHhjMCwweDgzLDB4YmYsMHhiZiwweGU3LDB4MTAsMHgwMCwweDA3LAotICAgMHgwMX19LCAvKiAweDNiICovIAorICAgMHgwMX19LCAgLyogMHgzYiAqLwogIHt7MHg2YiwweDU5LDB4NTksMHg4ZiwweDVlLDB4OGMsMHgwYiwweDNlLAogICAgMHhlOSwweDhiLDB4ZGYsMHhlNywweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LCAvKiAweDNjICovCi0ge3sweDdiLDB4NTksMHg2MywweDlmLDB4NmEsMHg5MywweDZmLDB4ZjAsCi0gICAweDU4LDB4OGEsMHgzZiwweDU3LDB4NzAsMHgyMCwweDAwLDB4MDUsCi0gICAweDAxfX0sIC8qIDB4M2QgKi8KKyAgIDB4MDB9fSwgIC8qIDB4M2MgKi8KKyB7ezB4NmQsMHg1OSwweDU5LDB4OTEsMHg2MCwweDg5LDB4NTMsMHhmMCwJLyogNzIweDU3NiwgY29ycmVjdGVkIHRvIDYwSHogKi8KKyAgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4NDF9fSwgIC8qIDB4M2QgKi8KICB7ezB4ODYsMHg2YSwweDZhLDB4OGEsMHg3NCwweDA2LDB4OGMsMHgxNSwKICAgIDB4NGYsMHg4MywweGVmLDB4ZWYsMHg4ZCwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDB9fSwgLyogMHgzZSAqLworICAgMHgwMH19LCAgLyogMHgzZSAqLwogIHt7MHg4MSwweDZhLDB4NmEsMHg4NSwweDcwLDB4MDAsMHgwZiwweDNlLAogICAgMHhlYiwweDhlLDB4ZGYsMHhkZiwweDEwLDB4MDAsMHgwMCwweDAyLAotICAgMHgwMH19LCAvKiAweDNmICovCisgICAweDAwfX0sICAvKiAweDNmICovCiAge3sweGEzLDB4N2YsMHg3ZiwweDg3LDB4ODYsMHg5NywweDFlLDB4ZjEsCiAgICAweGFlLDB4ODUsMHg1NywweDU3LDB4MWYsMHgzMCwweDAwLDB4MDIsCiAgICAweDAxfX0sICAvKiAweDQwICovCkBAIC01NzgsMTEgKzQ4MywxMSBAQAogIHt7MHhkMywweDlmLDB4OWYsMHg5NywweGFiLDB4MWYsMHhmMSwweGZmLCAvKiAxMjgweDk2MC04NSAqLwogICAgMHhjMCwweDgzLDB4YmYsMHhiZiwweGYyLDB4MTAsMHgwMCwweDA3LAogICAgMHgwMX19LCAgLyogMHg0YyAqLwotIHt7MHg3YiwweDVmLDB4NjMsMHg5ZiwweDZhLDB4OTMsMHg2ZiwweGYwLCAvKiA3Njh4NTc2ICovCi0gICAweDU4LDB4OGEsMHgzZiwweDU3LDB4NzAsMHgyMCwweDAwLDB4MDUsCi0gICAweDAxfX0sICAvKiAweDRkICovCi0ge3sweDJkLDB4MjcsMHgyOCwweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsIC8qIEZTVE4gMzIweDQ4MCwgVEVNUCAtIHBvc3NpYmx5IGludmFsaWQgKi8KLSAgIDB4ZTksMHg4YiwweGRmLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyB7ezB4NzUsMHg1ZiwweDVmLDB4OTksMHg2NiwweDkwLDB4NTMsMHhmMCwgLyogNzY4eDU3NiwgY29ycmVjdGVkIHRvIDYwSHogKi8KKyAgIDB4NDEsMHg4NCwweDNmLDB4M2YsMHg1NCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4NDF9fSwgIC8qIDB4NGQgKi8KKyB7ezB4NWYsMHgyNywweDRmLDB4ODMsMHg1NSwweDgxLDB4MGIsMHgzZSwgLyogRlNUTiAzMjB4MjQwICh3b3JraW5nKSAqLworICAgMHhlOSwweDhiLDB4ZGYsMHhlOCwweDBjLDB4MDAsMHgwMCwweDA1LAogICAgMHgwMH19LCAgLyogMHg0ZSAqLwogIHt7MHhjZCwweDlmLDB4OWYsMHg5MSwweGFiLDB4MWMsMHgzYSwweGZmLCAvKiAxMjgweDgwMC02MCAqLwogICAgMHgyMCwweDgzLDB4MWYsMHgxZiwweDNiLDB4MTAsMHgwMCwweDA3LApAQCAtNjAxLDEwICs1MDYsNTggQEAKICAgIDB4MDF9fSwgIC8qIDB4NTMgKi8KICB7ezB4Y2QsMHg4ZiwweDhmLDB4OTEsMHg5YiwweDFiLDB4N2EsMHhmZiwgLyogMTE1Mng4NjQtNjAgKi8KICAgIDB4NjQsMHg4YywweDVmLDB4NjIsMHg3YiwweDEwLDB4MDAsMHgwNywKLSAgIDB4NDF9fSAgIC8qIDB4NTQgKi8KKyAgIDB4NDF9fSwgIC8qIDB4NTQgKi8KKyB7ezB4NWMsMHg0ZiwweDRmLDB4ODAsMHg1NywweDgwLDB4YTMsMHgxZiwgLyogZmFrZSA2NDB4NDAwQDYwSHogKGZvciBMQ0QgYW5kIFRWLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKyAgIDB4OTgsMHg4YywweDhmLDB4OTYsMHhhNCwweDMwLDB4MDAsMHgwNSwKKyAgIDB4NDB9fSwgIC8qIDB4NTUgKi8KKyB7ezB4MmMsMHgyNywweDI3LDB4OTAsMHgyZCwweDkyLDB4YTQsMHgxZiwgLyogZmFrZSAzMjB4MjAwQDYwSHogKGZvciBMQ0QgYW5kIFRWLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKyAgIDB4OTgsMHg4YywweDhmLDB4OTYsMHhhNSwweDMwLDB4MDAsMHgwNCwKKyAgIDB4MDB9fSwgIC8qIDB4NTYgKi8KKyB7ezB4ZDcsMHhjNywweGM3LDB4OWIsMHhkMSwweDE1LDB4ZDEsMHgxMCwgLyogMTYwMHgxMjAwIGZvciBMQ0RBICovCisgICAweGIyLDB4ODYsMHhhZiwweGIwLDB4ZDIsMHgyZiwweDAwLDB4MDMsCisgICAweDAwfX0sICAvKiAweDU3ICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTksMHgxNywweDI4LDB4ZGMsIC8qIDEyODB4NzY4ICgxMjgweDEwMjQpIDYwIEh6ICovCisgICAweDkyLDB4ODYsMHhmZiwweDkxLDB4MjksMHgyMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDU4ICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTUsMHgxNywweDI4LDB4ZGMsIC8qIDEyODB4NzY4ICgxMjgweDEwMjQpIDc1IEh6ICovCisgICAweDkyLDB4ODYsMHhmZiwweDkxLDB4MjksMHgyMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDU5ICovCisge3sweGQzLDB4OWYsMHg5ZiwweDk3LDB4YWIsMHgxZiwweDJlLDB4ZGMsIC8qIDEyODB4NzY4ICgxMjgweDEwMjQpIDg1IEh6ICovCisgICAweDk1LDB4ODksMHhmZiwweDk0LDB4MmYsMHgyMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDVhICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTksMHgxNywweDI4LDB4ZGUsIC8qIDEyODB4ODAwICgxMjgweDEwMjQpIDYwIEh6ICovCisgICAweGEyLDB4ODYsMHgxZiwweGExLDB4MjksMHgwMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDViICovCisge3sweGNlLDB4OWYsMHg5ZiwweDkyLDB4YTUsMHgxNywweDI4LDB4ZGUsIC8qIDEyODB4ODAwICgxMjgweDEwMjQpIDc1IEh6ICovCisgICAweGEyLDB4ODYsMHgxZiwweGExLDB4MjksMHgwMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDVjICovCisge3sweGQzLDB4OWYsMHg5ZiwweDk3LDB4YWIsMHgxZiwweDJlLDB4ZGUsIC8qIDEyODB4ODAwICgxMjgweDEwMjQpIDg1IEh6ICovCisgICAweGE1LDB4ODksMHgxZiwweGE0LDB4MmYsMHgwMSwweDAwLDB4MDcsCisgICAweDAxfX0sICAvKiAweDVkICovCisge3sweDdmLDB4NjMsMHg2MywweDgzLDB4NmQsMHgxZCwweDBiLDB4M2UsIC8qIDgwMHg0ODAgKHdpZGUpIDYwIEh6ICovCisgICAweGU5LDB4OGIsMHhkZiwweGU4LDB4MGMsMHgwMCwweDAwLDB4MDYsCisgICAweDAwfX0sICAvKiAweDVlICovCisge3sweGEwLDB4N2YsMHg3ZiwweDg0LDB4ODUsMHg5NywweDUyLDB4ZjAsIC8qIDEwMjR4NTc2ICh3aWRlKSA2MCBIeiAqLworICAgMHg0MSwweDg1LDB4M2YsMHg0MCwweDUzLDB4MDAsMHgwMCwweDAyLAorICAgMHgwMX19LCAgLyogMHg1ZiAqLworIHt7MHhjOSwweDlmLDB4OWYsMHg4ZCwweGIwLDB4MTUsMHhlYywweGYwLCAvKiAxMjgweDcyMCAod2lkZSkgNjAgSHogKi8KKyAgIDB4ZDQsMHg4OSwweGNmLDB4ZDMsMHhlZCwweDIwLDB4MDAsMHgwNywKKyAgIDB4MDF9fSwgIC8qIDB4NjAgKi8KKyB7ezB4Y2IsMHg5ZiwweDlmLDB4OGYsMHhhNSwweDEzLDB4NWIsMHhmZiwgLyogMTI4MHg4NTQtNjAgd2lkZSAqLworICAgMHg1NiwweDg5LDB4NTUsMHg1NSwweDVjLDB4MzAsMHgwMCwweDA3LAorICAgMHgwMX19LCAgLyogMHg2MSAqLworIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE5LDB4MTcsMHgyOCwweGRlLCAvKiAxMjgweDg1NCAoMTI4MHgxMDI0KSA2MCBIeiAqLworICAgMHhiZCwweDgxLDB4NTUsMHhiYywweDI5LDB4MDEsMHgwMCwweDA3LAorICAgMHg0MX19LCAgLyogMHg2MiAqLworIHt7MHhjZSwweDlmLDB4OWYsMHg5MiwweGE1LDB4MTcsMHgyOCwweGRlLCAvKiAxMjgweDg1NCAoMTI4MHgxMDI0KSA3NSBIeiAqLworICAgMHhiZCwweDgxLDB4NTUsMHhiYywweDI5LDB4MDEsMHgwMCwweDA3LAorICAgMHg0MX19LCAgLyogMHg2MyAqLworIHt7MHhkMywweDlmLDB4OWYsMHg5NywweGFiLDB4MWYsMHgyZSwweGRlLCAvKiAxMjgweDg1NCAoMTI4MHgxMDI0KSA4NSBIeiAqLworICAgMHhjMCwweDg0LDB4NTUsMHhiZiwweDJmLDB4MDEsMHgwMCwweDA3LAorICAgMHg0MX19ICAgLyogMHg2NCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF8zMTVbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF8zMTVbXSA9CiB7CiAJeyAweDNiLDB4MjIsMHgwMSwxNDN9LAogCXsgMHg1YywweDIzLDB4MDEsMTY2fSwKQEAgLTYxNiw3ICs1NjksNyBAQAogCXsgMHg1YywweDIzLDB4MDEsMTY2fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF82NTBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF82NTBbXSA9CiB7CiAJeyAweDVhLDB4NjQsMHg4MiwgNjZ9LAogCXsgMHhiMywweDQ1LDB4ODIsIDgzfSwKQEAgLTYyOCw3ICs1ODEsNyBAQAogCXsgMHgzNywweDIyLDB4ODIsMTMzfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF8zMzBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF8zMzBbXSA9CiB7CiAJeyAweDVjLDB4MjMsMHgwMSwxNjZ9LAogCXsgMHg1YywweDIzLDB4MDEsMTY2fSwKQEAgLTY0MCw3ICs1OTMsNyBAQAogCXsgMHg3OSwweDA2LDB4MDEsMjUwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF82NjBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF82NjBbXSA9CiB7CiAJeyAweDVjLDB4MjMsMHg4MiwxNjZ9LAogCXsgMHg1YywweDIzLDB4ODIsMTY2fSwKQEAgLTY1Miw3ICs2MDUsNyBAQAogCXsgMHgzNywweDIxLDB4ODIsMjAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF83NjBbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF83NjBbXSA9CiB7CiAJeyAweDM3LDB4MjIsMHg4MiwxMzN9LAogCXsgMHg1YywweDIzLDB4ODIsMTY2fSwKQEAgLTY2NCw3ICs2MTcsNyBAQAogCXsgMHgzNywweDIxLDB4ODIsMjAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCBTaVMzMTBfTUNMS0RhdGFfMF83NjFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YSBTaVMzMTBfTUNMS0RhdGFfMF83NjFbXSA9CiB7CiAJeyAweDM3LDB4MjIsMHg4MiwxMzN9LCAgLyogUHJlbGltaW5hcnkgKi8KIAl7IDB4NWMsMHgyMywweDgyLDE2Nn0sCkBAIC02NzYsNyArNjI5LDcgQEAKIAl7IDB4MzcsMHgyMSwweDgyLDIwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTUNMS0RhdGFTdHJ1Y3QgU2lTMzEwX01DTEtEYXRhXzBfMzQwW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTUNMS0RhdGEgU2lTMzEwX01DTEtEYXRhXzBfMzQwW10gPQogewogCXsgMHg3OSwweDA2LDB4MDEsMjUwfSwKIAl7IDB4N2MsMHgwOCwweDAxLDIwMH0sCkBAIC02ODgsOSArNjQxLDkgQEAKIAl7IDB4MjksMHgwMSwweDgxLDMwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTUNMS0RhdGFTdHJ1Y3QgU2lTMzEwX01DTEtEYXRhXzFbXSA9IC8qIEVDTEsgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX01DTEtEYXRhIFNpUzMxMF9NQ0xLRGF0YV8xW10gPSAvKiBFQ0xLICovCiB7Ci0gICAgICAgIHsgMHgyOSwweDIxLDB4ODIsMTUwfSwKKwl7IDB4MjksMHgyMSwweDgyLDE1MH0sCiAJeyAweDVjLDB4MjMsMHg4MiwxNjZ9LAogCXsgMHg2NSwweDIzLDB4ODIsMTgzfSwKIAl7IDB4MzcsMHgyMSwweDgyLDIwMH0sCkBAIC03MDAsNyArNjUzLDcgQEAKIAl7IDB4MzcsMHgyMiwweDgyLDEzM30KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTUNMS0RhdGFTdHJ1Y3QgU2lTMzEwX01DTEtEYXRhXzFfMzQwW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTUNMS0RhdGEgU2lTMzEwX01DTEtEYXRhXzFfMzQwW10gPQogewogCXsgMHg3YywweDA4LDB4MDEsMjAwfSwKIAl7IDB4N2MsMHgwOCwweDAxLDIwMH0sCkBAIC03MTIsNyArNjY1LDcgQEAKIAl7IDB4MjksMHgwMSwweDgxLDMwMH0KIH07CiAKLXN0YXRpYyBTaVNfVkNMS0RhdGFTdHJ1Y3QgU2lTMzEwX1ZDTEtEYXRhW109CitzdGF0aWMgc3RydWN0IFNpU19WQ0xLRGF0YSBTaVMzMTBfVkNMS0RhdGFbXSA9CiB7CiAJeyAweDFiLDB4ZTEsIDI1fSwgLyogMHgwMCAqLwogCXsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MDEgKi8KQEAgLTgwNSw3ICs3NTgsNyBAQAogCXsgMHgzMCwweDIzLCA4OH0sIC8qIDB4NTggMTM2MHg3NjgtNjIgKGlzIDYwSHohKSAqLwogCXsgMHg1MiwweDA3LDE0OX0sIC8qIDB4NTkgMTI4MHg5NjAtODUgKi8KIAl7IDB4NTYsMHgwNywxNTZ9LCAvKiAweDVhIDE0MDB4MTA1MC03NSAqLwotICAgCXsgMHg3MCwweDI5LCA4MX0sIC8qIDB4NWIgMTI4MHg3NjggTENEICovCisJeyAweDcwLDB4MjksIDgxfSwgLyogMHg1YiAxMjgweDc2OCBMQ0QgKi8KIAl7IDB4NDUsMHgyNSwgODN9LCAvKiAweDVjIDEyODB4ODAwICAqLwogCXsgMHg3MCwweDBhLDE0N30sIC8qIDB4NWQgMTY4MHgxMDUwICovCiAJeyAweDcwLDB4MjQsMTYyfSwgLyogMHg1ZSAxNjAweDEyMDAgKi8KQEAgLTgyMywxMCArNzc2LDE5IEBACiAJeyAweDdjLDB4NmIsIDM4fSwgLyogMHg2YSA5NjB4NTQwQDYwICovCiAJeyAweGUzLDB4NTYsIDQxfSwgLyogMHg2YiA5NjB4NjAwQDYwICovCiAJeyAweDQ1LDB4MjUsIDgzfSwgLyogMHg2YyAxMjgweDgwMCAqLwotCXsgMHg3MCwweDI4LCA5MH0gIC8qIDB4NmQgMTE1Mng4NjRANjAgKi8KKwl7IDB4NzAsMHgyOCwgOTB9LCAvKiAweDZkIDExNTJ4ODY0QDYwICovCisJeyAweDE1LDB4ZTEsIDIwfSwgLyogMHg2ZSA2NDB4NDAwQDYwIChmYWtlLCBub3QgYWN0dWFsbHkgdXNlZCkgKi8KKwl7IDB4NWYsMHhjNiwgMzN9LCAvKiAweDZmIDcyMHg1NzZANjAgKi8KKwl7IDB4MzcsMHg1YSwgMTB9LCAvKiAweDcwIDMyMHgyMDBANjAgKGZha2UsIG5vdCBhY3R1YWxseSB1c2VkKSAqLworCXsgMHgyYiwweGMyLCAzNX0sIC8qIDB4NzEgNzY4eDU3NkA2MCAqLworCXsgMHhhOCwweDQyLDEzMX0sIC8qIDB4NzIgMTYwMHgxMjAwQDYwIGZvciBMQ0RBICovCisJeyAweDFiLDB4YzEsIDM0fSwgLyogMHg3MyA4MDB4NDgwIDYwSHogKHdpZGUpICovCisJeyAweDQxLDB4NjQsIDQ4fSwgLyogMHg3NCAxMDI0eDU3NiA2MEh6ICh3aWRlKSAqLworCXsgMHg1MiwweDI3LCA3NX0sIC8qIDB4NzUgMTI4MHg3MjAgNjBIeiAod2lkZSkgKi8KKwl7IDB4NzUsMHgxMywgODR9ICAvKiAweDc2IDEyODB4ODU0IDYwSHogKHdpZGUpICovCiB9OwogCi1zdGF0aWMgU2lTX1ZCVkNMS0RhdGFTdHJ1Y3QgU2lTMzEwX1ZCVkNMS0RhdGFbXT0KK3N0YXRpYyBzdHJ1Y3QgU2lTX1ZCVkNMS0RhdGEgU2lTMzEwX1ZCVkNMS0RhdGFbXSA9CiB7CiAJeyAweDFiLDB4ZTEsIDI1fSwgLyogMHgwMCAqLwogCXsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MDEgKi8KQEAgLTg1OCwxMiArODIwLDYgQEAKIAl7IDB4NWUsMHg0MywxMTN9LCAvKiAweDFiICovCiAJeyAweGJjLDB4NDQsMTE2fSwgLyogMHgxYyAqLwogCXsgMHhlMCwweDQ2LDEzMn0sIC8qIDB4MWQgKi8KLSNpZiAwCi0JeyAweGQ0LDB4MjgsMTM1fSwgLyogMHgxZSAqLwotCXsgMHhlYSwweDJhLDEzOX0sIC8qIDB4MWYgKi8KLQl7IDB4NDEsMHgyMiwxNTd9LCAvKiAweDIwICovCi0JeyAweDcwLDB4MjQsMTYyfSwgLyogMHgyMSAqLwotI2VuZGlmCiAJeyAweGUyLDB4NDYsMTM1fSwgLyogMHgxZSAqLyAgLyogMTI4MHgxMDI0LTc1LCBiZXR0ZXIgY2xvY2sgZm9yIFZHQTIgKi8KIAl7IDB4ZTUsMHg0NiwxMzl9LCAvKiAweDFmICovICAvKiAxMDI0eDc2OC0xMjAsIGJldHRlciBjbG9jayBmb3IgVkdBMiAqLwogCXsgMHgxNSwweDAxLDE1N30sIC8qIDB4MjAgKi8gIC8qIDEyODB4MTAyNC04NSwgYmV0dGVyIGNsb2NrIGZvciBWR0EyICovCkBAIC05MTIsNyArODY4LDcgQEAKIAl7IDB4MzQsMHg2MSwgOTV9LCAvKiAweDRiIFVOVVNFRCAqLwogCXsgMHg3OCwweDI3LDEwOH0sIC8qIDB4NGMgVU5VU0VEICovCiAJeyAweDY2LDB4NDMsMTIzfSwgLyogMHg0ZCAxNDAweDEwNTAtNjAgKi8KLQl7IDB4NDEsMHg0ZSwgMjF9LCAvKiAweDRlIFVOVVNFRCAqLworCXsgMHg0MSwweDRlLCAyMX0sIC8qIDB4NGUgKi8KIAl7IDB4YTEsMHg0YSwgMjl9LCAvKiAweDRmIFVOVVNFRCAqLwogCXsgMHgxOSwweDQyLCA0Mn0sIC8qIDB4NTAgVU5VU0VEICovCiAJeyAweDU0LDB4NDYsIDU4fSwgLyogMHg1MSBVTlVTRUQgKi8KQEAgLTkyNSw3ICs4ODEsNyBAQAogCXsgMHgzMCwweDIzLCA4OH0sIC8qIDB4NTggMTM2MHg3NjgtNjIgKGlzIDYwSHohKSBURU1QLCBVTlVTRUQgKi8KIAl7IDB4NTIsMHgwNywxNDl9LCAvKiAweDU5IDEyODB4OTYwLTg1ICAqLwogCXsgMHg1NiwweDA3LDE1Nn0sIC8qIDB4NWEgMTQwMHgxMDUwLTc1ICovCi0gICAJeyAweDcwLDB4MjksIDgxfSwgLyogMHg1YiAxMjgweDc2OCBMQ0QgKFRNRFMpICovCisJeyAweDcwLDB4MjksIDgxfSwgLyogMHg1YiAxMjgweDc2OCBMQ0QgKFRNRFMpICovCiAJeyAweGNlLDB4MWUsIDczfSwgLyogMHg1YyAxMjgweDgwMF8yIExDRCAoU2lTIExWRFMpIC0gKENSVDE6IDQ1IDI1IDgzKSAqLwogCXsgMHhiZSwweDQ0LDEyMX0sIC8qIDB4NWQgMTY4MHgxMDUwIExDRCAqLwogCXsgMHg3MCwweDI0LDE2Mn0sIC8qIDB4NWUgMTYwMHgxMjAwIExDRCAqLwpAQCAtOTQzLDU3ICs4OTksMzMgQEAKIAl7IDB4N2MsMHg2YiwgMzh9LCAvKiAweDZhIDk2MHg1NDBANjAgKi8KIAl7IDB4ZTMsMHg1NiwgNDF9LCAvKiAweDZiIDk2MHg2MDBANjAgKi8KIAl7IDB4OWMsMHg2MiwgNjl9LCAvKiAweDZjIDEyODB4ODAwIChTaVMgVE1EUykgKHNwZWNpYWwpICovCi0JeyAweDcwLDB4MjgsIDkwfSAgLyogMHg2ZCAxMTUyeDg2NEA2MCAqLworCXsgMHg3MCwweDI4LCA5MH0sIC8qIDB4NmQgMTE1Mng4NjRANjAgKi8KKwl7IDB4MTUsMHhlMSwgMjB9LCAvKiAweDZlIDY0MHg0MDBANjAgKGZha2UsIG5vdCBhY3R1YWxseSB1c2VkKSAqLworCXsgMHg1ZiwweGM2LCAzM30sIC8qIDB4NmYgNzIweDU3NkA2MCAqLworCXsgMHgzNywweDVhLCAxMH0sIC8qIDB4NzAgMzIweDIwMEA2MCAoZmFrZSwgbm90IGFjdHVhbGx5IHVzZWQpICovCisJeyAweDJiLDB4YzIsIDM1fSwgLyogMHg3MSA3NjhANTc2QDYwICovCisJeyAweGE4LDB4NDIsMTMxfSwgLyogMHg3MiAxNjAweDEyMDBANjAgZm9yIExDREEgKi8KKwl7IDB4MWIsMHhjMSwgMzR9LCAvKiAweDczIDgwMHg0ODAgNjBIeiAod2lkZSkgKi8KKwl7IDB4NDEsMHg2NCwgNDh9LCAvKiAweDc0IDEwMjR4NTc2IDYwSHogKHdpZGUpICovCisJeyAweDUyLDB4MjcsIDc1fSwgLyogMHg3NSAxMjgweDcyMCA2MEh6ICh3aWRlKSAqLworCXsgMHg3NSwweDEzLCA4NH0gIC8qIDB4NzYgMTI4MHg4NTQgNjBIeiAoU2lTIExWRFMpIExDRCAqLwogfTsKIAotc3RhdGljIGNvbnN0IERSQU00VHlwZSBTaVMzMTBfU1IxNVs4XSA9IHsKLQl7MHgwMCwweDA0LDB4NjAsMHg2MH0sCi0JezB4MGYsMHgwZiwweDBmLDB4MGZ9LAotCXsweGJhLDB4YmEsMHhiYSwweGJhfSwKLQl7MHhhOSwweGE5LDB4YWMsMHhhY30sCi0JezB4YTAsMHhhMCwweGEwLDB4YTh9LAotCXsweDAwLDB4MDAsMHgwMiwweDAyfSwKLSAJezB4MzAsMHgzMCwweDQwLDB4NDB9LAotCXsweDAwLDB4YTUsMHhmYiwweGY2fQotfTsKLQotI2lmZGVmIExJTlVYX0tFUk5FTAotCi1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMDcgPSAweDE4OwotCi1zdGF0aWMgY29uc3QgRFJBTTRUeXBlIFNpUzMxMF9DUjQwWzVdID0gewotCXsweDc3LDB4NzcsMHgzMywweDMzfSwKLQl7MHg3NywweDc3LDB4MzMsMHgzM30sCi0JezB4MDAsMHgwMCwweDAwLDB4MDB9LAotCXsweDViLDB4NWIsMHgwMywweDAzfSwKLQl7MHgwMCwweDAwLDB4ZjAsMHhmOH0KLX07Ci0KLXN0YXRpYyBVQ0hBUiBTaVMzMTBfQ1I0OVtdID0gezB4YWEsMHg4OH07Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMUYgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMxMF9TUjIxID0gMHhhNTsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfU1IyMiA9IDB4ZmI7Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMjMgPSAweGY2Owotc3RhdGljIFVDSEFSIFNpUzMxMF9TUjI0ID0gMHgwZDsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfU1IyNVtdID0gezB4MzMsMHgzfTsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfU1IzMSA9IDB4MDA7Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX1NSMzIgPSAweDExOwotc3RhdGljIFVDSEFSIFNpUzMxMF9TUjMzID0gMHgwMDsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfQ1JUMkRhdGFfMV8yICA9IDB4MDA7Ci1zdGF0aWMgVUNIQVIgU2lTMzEwX0NSVDJEYXRhXzRfRCAgPSAweDAwOwotc3RhdGljIFVDSEFSIFNpUzMxMF9DUlQyRGF0YV80X0UgID0gMHgwMDsKLXN0YXRpYyBVQ0hBUiBTaVMzMTBfQ1JUMkRhdGFfNF8xMCA9IDB4ODA7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMxMF9SR0JTZW5zZURhdGEgICAgPSAweGQxOwotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMTBfVmlkZW9TZW5zZURhdGEgID0gMHhiOTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTMzEwX1lDU2Vuc2VEYXRhICAgICA9IDB4YjM7Ci1zdGF0aWMgY29uc3QgVVNIT1JUIFNpUzMxMF9SR0JTZW5zZURhdGEyICAgPSAweDAxOTA7IAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMTBfVmlkZW9TZW5zZURhdGEyID0gMHgwMTc0Owotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVMzMTBfWUNTZW5zZURhdGEyICAgID0gMHgwMTZiOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBTaVNfUGFuZWxEZWxheVRibFN0cnVjdCBTaVMzMTBfUGFuZWxEZWxheVRibFtdPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1NSMTVbNCAqIDhdID0KIHsKLSAgICAgICAge3sweDEwLDB4NDB9fSwKKwkweDAwLDB4MDQsMHg2MCwweDYwLAorCTB4MGYsMHgwZiwweDBmLDB4MGYsCisJMHhiYSwweGJhLDB4YmEsMHhiYSwKKwkweGE5LDB4YTksMHhhYywweGFjLAorCTB4YTAsMHhhMCwweGEwLDB4YTgsCisJMHgwMCwweDAwLDB4MDIsMHgwMiwKKwkweDMwLDB4MzAsMHg0MCwweDQwLAorCTB4MDAsMHhhNSwweGZiLDB4ZjYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1BhbmVsRGVsYXlUYmwgU2lTMzEwX1BhbmVsRGVsYXlUYmxbXSA9Cit7CisJe3sweDEwLDB4NDB9fSwKIAl7ezB4MTAsMHg0MH19LAogCXt7MHgxMCwweDQwfX0sCiAJe3sweDEwLDB4NDB9fSwKQEAgLTEwMTEsNyArOTQzLDcgQEAKIAl7ezB4MTAsMHg0MH19CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgU2lTMzEwX1BhbmVsRGVsYXlUYmxMVkRTW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19QYW5lbERlbGF5VGJsIFNpUzMxMF9QYW5lbERlbGF5VGJsTFZEU1tdID0KIHsKIAl7ezB4MjgsMHhjOH19LAogCXt7MHgyOCwweGM4fX0sCkBAIC0xMDM1LDE4ICs5NjcsMTggQEAKIC8qIFNJUyBWSURFTyBCUklER0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMTBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMTBfU3QyTENEMTAyNHg3NjhEYXRhW10gPQogewogCXsgICA2MiwgIDI1LCA4MDAsIDU0NiwxMzQ0LCA4MDZ9LAogCXsgICAzMiwgIDE1LCA5MzAsIDU0NiwxMzQ0LCA4MDZ9LAotICAgICAgICB7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKKwl7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKIAl7ICAxMDQsICA0NSwgOTQ1LCA0OTYsMTM0NCwgODA2fSwKIAl7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKIAl7ICAgMzEsICAxOCwxMDA4LCA2MjQsMTM0NCwgODA2fSwKIAl7ICAgIDEsICAgMSwxMzQ0LCA4MDYsMTM0NCwgODA2fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMTBfRXh0TENEMTAyNHg3NjhEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMTBfRXh0TENEMTAyNHg3NjhEYXRhW10gPQogewogCXsgICA0MiwgIDI1LDE1MzYsIDQxOSwxMzQ0LCA4MDZ9LAogCXsgICA0OCwgIDI1LDE1MzYsIDM2OSwxMzQ0LCA4MDZ9LApAQCAtMTA1Nyw3ICs5ODksNyBAQAogCXsgICAgMSwgICAxLDEzNDQsIDgwNiwxMzQ0LCA4MDZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpUzMxMF9TdDJMQ0QxMjgweDEwMjREYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVMzMTBfU3QyTENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKIAl7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKQEAgLTEwNjksNyArMTAwMSw3IEBACiAJeyAgICAxLCAgIDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTMzEwX0V4dExDRDEyODB4MTAyNERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpUzMxMF9FeHRMQ0QxMjgweDEwMjREYXRhW10gPQogewogCXsgIDIxMSwgIDYwLDEwMjQsIDUwMSwxNjg4LDEwNjZ9LAogCXsgIDIxMSwgIDYwLDEwMjQsIDUwOCwxNjg4LDEwNjZ9LApAQCAtMTA4MSw0NSArMTAxMywyMiBAQAogCXsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCBTaVMzMTBfQ1JUMlBhcnQyXzEwMjR4NzY4XzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgU2lTMzEwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xW10gPQogewotIHt7MHgyNSwweDEyLDB4YzksMHhkYywweGI2LDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKLSB7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCi0ge3sweDI1LDB4MTIsMHhjOSwweGRjLDB4YjYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAotIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwKLSB7ezB4MzgsMHgxMywweDE2LDB4MGMsMHhlNiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCi0ge3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAotIHt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fQorCXt7MHgyNSwweDEyLDB4YzksMHhkYywweGI2LDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKKwl7ezB4MmMsMHgxMiwweDlhLDB4YWUsMHg4OCwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCisJe3sweDI1LDB4MTIsMHhjOSwweGRjLDB4YjYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwKKwl7ezB4MzgsMHgxMywweDE2LDB4MGMsMHhlNiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCisJe3sweDM4LDB4MTgsMHgxNiwweDAwLDB4MDAsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgzNiwweDEzLDB4MTMsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fQogfTsKIAotLyogKioqIExDREEgKioqICovCi0KLSNpZiAwCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTENEQTE2MDB4MTIwMERhdGFfMVtdPQoteyAvKiBDbGV2bywgNjUxKzMwMUMgKi8KLQl7MTIwMCwgNDUwLCAyMDQ4LDEyNTB9LAotCXsxMjAwLCA0MDAsIDIwNDgsMTI1MH0sCi0JezEyODAsIDQ1MCwgMjA0OCwxMjUwfSwKLQl7MTI4MCwgNDAwLCAyMDQ4LDEyNTB9LAotCXsxMjAwLCA1MzAsIDIwNDgsMTI1MH0sCi0JezEzNjAsIDY1MCwgMjA0OCwxMjUwfSwKLQl7MTU4NCwgODE4LCAyMDQ4LDEyNTB9LAotCXsxNjg4LDEwNjYsIDIwNDgsMTI1MH0sCi0JezE2ODgsMTA2NiwgMjA0OCwxMjUwfSwKLSNpZiAwCi0JezIwNDgsMTI1MCwgMjA0OCwxMjUwfSAgIC8qIHRoaXMgc2hvdWxkIGJlIGNvcnJlY3QgKi8KLSNlbmRpZgotI2lmIDEKLQl7MjE2MCwxMjUwLCAyMDQ4LDEyNTB9ICAgLyogPyAqLwotI2VuZGlmCi19OwotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIExWRFMsIENIUk9OVEVMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTMzEwX0NIVFZVUEFMRGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZVUEFMRGF0YVtdID0KIHsKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LApAQCAtMTEzMCw3ICsxMDM5LDcgQEAKIAl7MTQwMCwxMDAwLDE0MDAsMTAwMH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWT1BBTERhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMxMF9DSFRWT1BBTERhdGFbXSA9CiB7CiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTExMzgsMTAgKzEwNDcsMTAgQEAKIAl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCiAJeyA4NDAsIDYyNSwgODQwLCA2MjV9LAogCXsgOTQ0LCA2MjUsIDk0NCwgNjI1fSwKLSAgICAgICAgezE0MDAsIDg3NSwxNDAwLCA4NzV9CisJezE0MDAsIDg3NSwxNDAwLCA4NzV9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVlVQQUxNRGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZVUEFMTURhdGFbXSA9CiB7CiAJeyA4NDAsIDYwMCwgODQwLCA2MDB9LAogCXsgODQwLCA2MDAsIDg0MCwgNjAwfSwKQEAgLTExNDksMTAgKzEwNTgsMTAgQEAKIAl7IDg0MCwgNjAwLCA4NDAsIDYwMH0sCiAJeyA3ODQsIDYwMCwgNzg0LCA2MDB9LAogCXsxMDY0LCA3NTAsMTA2NCwgNzUwfSwKLSAgICAgICAgezExNjAsIDk0NSwxMTYwLCA5NDV9CisJezExNjAsIDk0NSwxMTYwLCA5NDV9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVk9QQUxNRGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZPUEFMTURhdGFbXSA9CiB7CiAJeyA4NDAsIDUyNSwgODQwLCA1MjV9LAogCXsgODQwLCA1MjUsIDg0MCwgNTI1fSwKQEAgLTExNjAsMTAgKzEwNjksMTAgQEAKIAl7IDg0MCwgNTI1LCA4NDAsIDUyNX0sCiAJeyA3ODQsIDUyNSwgNzg0LCA1MjV9LAogCXsxMDQwLCA3MDAsMTA0MCwgNzAwfSwKLSAgICAgICAgezExNjAsIDg0MCwxMTYwLCA4NDB9CisJezExNjAsIDg0MCwxMTYwLCA4NDB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVlVQQUxORGF0YVtdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZVUEFMTkRhdGFbXSA9CiB7CiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTExNzQsNyArMTA4MywxOCBAQAogCXsxNDAwLDEwMDAsMTQwMCwxMDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTMzEwX0NIVFZPUEFMTkRhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpUzMxMF9DSFRWT1BBTE5EYXRhW10gPQoreworCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKKwl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCisJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAorCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKKwl7IDg0MCwgNjI1LCA4NDAsIDYyNX0sCisJeyA5NDQsIDYyNSwgOTQ0LCA2MjV9LAorCXsxNDAwLCA4NzUsMTQwMCwgODc1fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTMzEwX0NIVFZTT1BBTERhdGFbXSA9ICAgLyogKHN1cGVyIG92ZXJzY2FuIC0gbm8gZWZmZWN0IG9uIDcwMTkpICovCiB7CiAJezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTExODUsMTM0NCArMTEwNSwxMCBAQAogICAgICAgICB7MTQwMCwgODc1LDE0MDAsIDg3NX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWU09QQUxEYXRhW109ICAgLyogKHN1cGVyIG92ZXJzY2FuIC0gbm8gZWZmZWN0IG9uIDcwMTkpICovCi17Ci0JezEwMDgsIDYyNSwxMDA4LCA2MjV9LAotCXsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKLQl7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCi0JezEwMDgsIDYyNSwxMDA4LCA2MjV9LAotCXsgODQwLCA2MjUsIDg0MCwgNjI1fSwKLQl7IDk0NCwgNjI1LCA5NDQsIDYyNX0sCi0gICAgICAgIHsxNDAwLCA4NzUsMTQwMCwgODc1fQotfTsKLQotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwMF8xW109ICAvKiA4MDB4NjAwICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTAxXzFbXT0gIC8qIDEwMjR4NzY4ICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCA4MDV9LAotCXsgMCwgMH0sCi0JeyAwLCAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDJfMVtdPSAgLyogMTI4MHgxMDI0ICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDEwNjV9LAotCXsgMCwgMH0sCi0JeyAwLCAwfQotfTsKLQotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwM18xW109Ci17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTA0XzFbXT0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDVfMVtdPQotewotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCAgIDB9LAotCXsxMzQzLCAgIDB9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwNl8xW109Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTA3XzFbXT0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDhfMVtdPSAgIC8qIDE0MDB4MTA1MCAqLwotewotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDlfMVtdPSAgIC8qIDEyODB4NzY4ICovCi17Ci0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwYV8xW109ICAvKiAxNjAweDEyMDAgKi8KLXsKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0sCi0JeyAwLCAwfSwKLQl7IDAsIDB9LAotCXsgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBiXzFbXT0gIC8qIDY0MHg0ODBfMiAqLwotewotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgOCwgNTI0fSwKLQl7IDAsIDUyNH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBjXzFbXT0gIC8qIDY0MHg0ODBfMyAqLwotewotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgMCwgNTI0fSwKLQl7IDAsIDUyNH0sCi0JeyAwLCA1MjR9LAotCXsgOCwgNTI0fSwKLQl7IDAsIDUyNH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBkXzFbXT0KLXsKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgNzk4fSwKLQl7MTM0MywgNzk0fSwKLQl7MTM0MywgICAwfSwKLQl7MTM0MywgICAwfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMGVfMVtdPQotewotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCA3OTh9LAotCXsxMzQzLCA3OTR9LAotCXsxMzQzLCAgIDB9LAotCXsxMzQzLCAgIDB9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwZl8xW109Ci17Ci0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsIDc5OH0sCi0JezEzNDMsIDc5NH0sCi0JezEzNDMsICAgMH0sCi0JezEzNDMsICAgMH0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTAwXzJbXT0KLXsKLQl7OTgwLCA1Mjh9LAotCXs5ODAsIDUwM30sCi0Jezk4MCwgNTI4fSwKLQl7OTgwLCA1MDN9LAotCXs5ODAsIDU2OH0sCi0JeyAwLCA2Mjh9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwMV8yW109Ci17Ci0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDY2Mn0sCi0JezEyMzIsIDcyMn0sCi0JeyAwLCA4MDZ9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTAyXzJbXT0KLXsKLQl7MTM2OCwgNzU0fSwKLQl7MTM2OCwgNzI5fSwKLQl7MTM2OCwgNzU0fSwKLQl7MTM2OCwgNzI5fSwKLQl7MTM2OCwgNzk0fSwKLQl7MTQ0OCwgODU0fSwKLQl7MTU2MCwgOTM4fSwKLQl7ICAgMCwxMDY2fSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDNfMltdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDRfMltdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwNV8yW109Ci17Ci0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDY2Mn0sCi0JezEyMzIsIDcyMn0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTA2XzJbXT0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDdfMltdPQotewotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2NjJ9LAotCXsxMjMyLCA3MjJ9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwOF8yW109ICAvKiAxNDAweDEwNTAgKi8KLXsKLQl7MTMwOCwgNzQxfSwKLQl7MTMwOCwgNzE2fSwKLQl7MTMwOCwgNzQxfSwKLQl7MTMwOCwgNzE2fSwKLQl7MTMwOCwgNzgxfSwKLQl7MTM4OCwgODQxfSwKLQl7MTUwMCwgOTI1fSwKLQl7MTYyOCwxMDUzfSwKLQl7ICAgMCwxMDY1fSwKLQl7ICAgMCwgICAwfSwKLQl7ICAgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMDlfMltdPSAvKiAxMjgweDc2OCAqLwotewotCXsxMDgzLCA2MjJ9LAotCXsxMDgzLCA1OTd9LAotCXsxMDgzLCA2MjJ9LAotCXsxMDgzLCA1OTd9LAotCXsxMDgzLCA2NjJ9LAotCXsxMTYzLCA3MjJ9LAotCXsxMjg2LCA4MDV9LAotCXsgICAwLCA3OTR9LAotCXsgICAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwYV8yW109ICAvKiAxNjAweDEyMDAgKi8KLXsKLQl7MTU2OCwgOTIwfSwKLQl7MTU2OCwgODk1fSwKLQl7MTU2OCwgOTIwfSwKLQl7MTU2OCwgODk1fSwKLQl7MTU2OCwgOTYwfSwKLQl7MTY0OCwxMDIwfSwKLQl7MTc2MCwxMTA0fSwKLQl7MTg4OCwxMjMyfSwKLQl7MTk0OCwxMjQ1fSwKLQl7ICAgMCwgICAwfQotI2lmIDAKLQl7MTU2OCwgODUwfSwKLQl7MTU2OCwgODI1fSwKLQl7MTU2OCwgODUwfSwKLQl7MTU2OCwgODI1fSwKLQl7MTU2OCwgODkwfSwKLQl7MTY0OCwgOTUwfSwKLQl7MTc2MCwxMDM0fSwKLQl7MTg4OCwxMTYyfSwKLQl7MTk0OCwxMTc1fSwKLQl7ICAgMCwgICAwfQotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwYl8yW109ICAvKiA2NDB4NDgwXzIgKi8KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMGNfMltdPSAgLyogNjQweDQ4MF8zICovCi17Ci0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDYyMn0sCi0JezExNTIsIDU5N30sCi0JezExNTIsIDY2Mn0sCi0JezEyMzIsIDcyMn0sCi0JeyAwLCA4MDV9LAotCXsgMCwgNzk0fSwKLQl7IDAsICAgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgU2lTMzEwX1BhbmVsVHlwZTBkXzJbXT0KLXsKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjIyfSwKLQl7MTE1MiwgNTk3fSwKLQl7MTE1MiwgNjYyfSwKLQl7MTIzMiwgNzIyfSwKLQl7IDAsIDgwNX0sCi0JeyAwLCA3OTR9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVMzMTBfUGFuZWxUeXBlMGVfMltdPQotewotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2NjJ9LAotCXsxMjMyLCA3MjJ9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGUwZl8yW10gPQotewotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2MjJ9LAotCXsxMTUyLCA1OTd9LAotCXsxMTUyLCA2NjJ9LAotCXsxMjMyLCA3MjJ9LAotCXsgMCwgODA1fSwKLQl7IDAsIDc5NH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGVOU18xW109Ci17Ci0JeyA4LCAgIDB9LAotCXsgOCwgICAwfSwKLQl7IDgsICAgMH0sCi0JeyA4LCAgIDB9LAotCXsgOCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsIDgwNn0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpUzMxMF9QYW5lbFR5cGVOU18yW10gPQotewotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9LAotCXsgMCAsIDB9Ci19OwotCi0vKiBDUlQxIENSVEMgZm9yIFNsYXZlTW9kZXMgYW5kIExDREEgKi8KLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTgwMHg2MDBfMVtdID0KLXsKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweGFhLDB4MWYsCi0gICAweDkwLDB4ODUsMHg4ZiwweGFiLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweDc4LDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweGFhLDB4MWYsCi0gICAweDkwLDB4ODUsMHg4ZiwweGFiLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweDc4LDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NmIsMHg0ZiwweDhmLDB4NTUsMHg4NSwweGZhLDB4MWYsCi0gICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4N2YsMHg2MywweDgzLDB4NjksMHgxOSwweDcyLDB4ZjAsCi0gICAweDU4LDB4OGMsMHg1NywweDczLDB4MjAsMHgwMCwweDA2LAotICAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTgwMHg2MDBfMV9IW10gPQotewotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4YWEsMHgxZiwKLSAgIDB4OTAsMHg4NSwweDhmLDB4YWIsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4NzgsMHgxZiwKLSAgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4ZmEsMHgxZiwKLSAgIDB4ZTAsMHg4NSwweGRmLDB4ZmIsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4NzgsMHgxZiwKLSAgIDB4NWUsMHg4MywweDVkLDB4NzksMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0MywweDI3LDB4ODcsMHgyZCwweDFkLDB4ZmEsMHgxZiwKLSAgIDB4ZTAsMHg4NSwweGRmLDB4ZmIsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwIH19LAotIHt7MHg0ZCwweDMxLDB4OTEsMHgzNywweDA3LDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4ZCwweDU3LDB4NzMsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxODAweDYwMF8yW109Ci17Ci0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhmZiwweDg0LDB4OGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhlNiwweDhiLDB4NWQsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhmZiwweDg0LDB4OGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweDNlLAotICAgMHhlNiwweDhiLDB4NWQsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NGYsMHg4MywweDYyLDB4MTIsMHg3MiwweGJhLAotICAgMHgyNywweDhjLDB4ZGYsMHg3MywweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDAgfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDY5LDB4MTksMHg3MiwweGYwLAotICAgMHg1OCwweDhkLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDE4MDB4NjAwXzJfSFtdID0KLXsKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGZmLDB4ODQsMHg4ZiwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGQ2LDB4OGIsMHg1ZCwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGZmLDB4ODQsMHg4ZiwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4M2UsCi0gICAweGQ2LDB4OGIsMHg1ZCwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NTcsMHgyNywweDliLDB4M2EsMHgwYSwweDcyLDB4YmEsCi0gICAweDI3LDB4OGMsMHhkZiwweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMCB9fSwKLSB7ezB4NGQsMHgzMSwweDkxLDB4M2EsMHgwYSwweDcyLDB4ZjAsCi0gICAweDYzLDB4ODgsMHg1NywweDczLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMSB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTEwMjR4NzY4XzFbXSA9Ci17Ci0ge3sweDczLDB4NGYsMHg5NywweDUzLDB4ODQsMHhiNCwweDFmLAotICAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NzMsMHg0ZiwweDk3LDB4NTMsMHg4NCwweDgyLDB4MWYsCi0gICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3MywweDRmLDB4OTcsMHg1MywweDg0LDB4YjQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDczLDB4NGYsMHg5NywweDUzLDB4ODQsMHg4MiwweDFmLAotICAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NzMsMHg0ZiwweDk3LDB4NTMsMHg4NCwweDA0LDB4M2UsCi0gICAweEUyLDB4ODksMHhEZiwweDA1LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg4NywweDYzLDB4OEIsMHg2NywweDE4LDB4N2MsMHhmMCwKLSAgIDB4NUEsMHg4MSwweDU3LDB4N0QsMHgwMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweEEzLDB4N2YsMHg4NywweDgzLDB4OTQsMHgyNCwweGY1LAotICAgMHgwMiwweDg5LDB4RmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTEwMjR4NzY4XzFfSFtdID0KLXsKLSB7ezB4NGIsMHgyNywweDhmLDB4MmIsMHgxYywweGI0LDB4MWYsCi0gICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMCB9fSwKLSB7ezB4NGIsMHgyNywweDhmLDB4MmIsMHgxYywweDgyLDB4MWYsCi0gICAweDYwLDB4ODcsMHg1RCwweDgzLDB4MDEsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0YiwweDI3LDB4OGYsMHgyYiwweDFjLDB4YjQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDRiLDB4MjcsMHg4ZiwweDJiLDB4MWMsMHg4MiwweDFmLAotICAgMHg2MCwweDg3LDB4NUQsMHg4MywweDAxLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NGIsMHgyNywweDhmLDB4MmIsMHgxYywweDA0LDB4M2UsCi0gICAweEUyLDB4ODksMHhEZiwweDA1LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1NSwweDMxLDB4OTksMHgzNSwweDA2LDB4N2MsMHhmMCwKLSAgIDB4NUEsMHg4MSwweDU3LDB4N0QsMHgwMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDYzLDB4M0YsMHg4NywweDQzLDB4OTQsMHgyNCwweGY1LAotICAgMHgwMiwweDg5LDB4RmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDEgfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8yW10gPQotewotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAxIH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4N2YsMHg4NiwweGRmLDB4MjUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwIH19LAotIHt7MHhhMywweDYzLDB4ODcsMHg3OCwweDg5LDB4MjQsMHhmMSwKLSAgIDB4YmIsMHg4MiwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxIH19LAotIHt7MHhhMywweDdmLDB4ODcsMHg4MywweDk0LDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OSwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTAyNHg3NjhfMl9IW10gPQotewotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4NTcsMHg4ZSwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4M2UsMHg4NSwweDVkLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3YiwweDI3LDB4OWYsMHg0NiwweDk3LDB4MjQsMHhiYiwKLSAgIDB4N2YsMHg4NiwweGRmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwIH19LAotIHt7MHg3MSwweDMxLDB4OTUsMHg0NiwweDk3LDB4MjQsMHhmMSwKLSAgIDB4YmIsMHg4MiwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxIH19LAotIHt7MHg2MywweDNmLDB4ODcsMHg0NiwweDk3LDB4MjQsMHhmNSwKLSAgIDB4MGYsMHg4NiwweGZmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAxIH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzFbXSA9Ci17Ci0ge3sweDdlLDB4NGYsMHg4MiwweDU4LDB4MDQsMHhiOCwweDFmLAotICAgMHg5MCwweDg0LDB4OGYsMHhiOSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4N2UsMHg0ZiwweDgyLDB4NTgsMHgwNCwweDg2LDB4MWYsCi0gICAweDVlLDB4ODIsMHg1ZCwweDg3LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg3ZSwweDRmLDB4ODIsMHg1OCwweDA0LDB4YjgsMHgxZiwKLSAgIDB4OTAsMHg4NCwweDhmLDB4YjksMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDdlLDB4NGYsMHg4MiwweDU4LDB4MDQsMHg4NiwweDFmLAotICAgMHg1ZSwweDgyLDB4NWQsMHg4NywweDEwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4N2UsMHg0ZiwweDgyLDB4NTgsMHgwNCwweDA4LDB4M2UsCi0gICAweGUwLDB4ODQsMHhkZiwweDA5LDB4MDAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg5MiwweDYzLDB4OTYsMHg2YywweDE4LDB4ODAsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4ODEsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGFlLDB4N2YsMHg5MiwweDg4LDB4OTQsMHgyOCwweGY1LAotICAgMHgwMCwweDg0LDB4ZmYsMHgyOSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg5ZiwweDkyLDB4YTgsMHgxNCwweDI4LDB4NWEsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzFfSFtdID0KLXsKLSB7ezB4NTYsMHgyNywweDlhLDB4MzEsMHgxYywweGI4LDB4MWYsCi0gICAweDkwLDB4ODQsMHg4ZiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1NiwweDI3LDB4OWEsMHgzMSwweDFjLDB4ODYsMHgxZiwKLSAgIDB4NWUsMHg4MiwweDVkLDB4ODcsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDU2LDB4MjcsMHg5YSwweDMxLDB4MWMsMHhiOCwweDFmLAotICAgMHg5MCwweDg0LDB4OGYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NTYsMHgyNywweDlhLDB4MzEsMHgxYywweDg2LDB4MWYsCi0gICAweDVlLDB4ODIsMHg1ZCwweDg3LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMX19LAotIHt7MHg1NiwweDI3LDB4OWEsMHgzMSwweDFjLDB4MDgsMHgzZSwKLSAgIDB4ZTAsMHg4NCwweGRmLDB4MDksMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDYwLDB4MzEsMHg4NCwweDNhLDB4ODYsMHg4MCwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg4MSwweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NmUsMHgzZiwweDkyLDB4NDgsMHg5NCwweDI4LDB4ZjUsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzJbXSA9Ci17Ci0ge3sweGNlLDB4NzIsMHg5MSwweDgxLDB4OGYsMHgyOCwweDkyLAotICAgMHhjOCwweDhjLDB4NWQsMHg1YywweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg3MiwweDkxLDB4ODEsMHg4ZiwweDI4LDB4OTIsCi0gICAweGFmLDB4ODMsMHg0NCwweDQzLDB4MjEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDcyLDB4OTEsMHg4MSwweDhmLDB4MjgsMHg5MiwKLSAgIDB4YzgsMHg4YywweDVkLDB4NWMsMHgwMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4NzIsMHg5MSwweDgxLDB4OGYsMHgyOCwweDkyLAotICAgMHhhZiwweDgzLDB4NDQsMHg0MywweDIxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg3MiwweDkxLDB4ODEsMHg4ZiwweDI4LDB4OTIsCi0gICAweGYwLDB4ODQsMHg4NSwweDg0LDB4MTEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDYzLDB4OTIsMHg4YiwweDE5LDB4MjgsMHhkNCwKLSAgIDB4M2YsMHg4MywweDU3LDB4MjksMHgwMSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4N2YsMHg5MiwweDk5LDB4MDcsMHgyOCwweGQ0LAotICAgMHg5MywweDg3LDB4ZmYsMHgyOSwweDIxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg5ZiwweDkyLDB4YTgsMHgxNCwweDI4LDB4NWEsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzJfSFtdID0KLXsKLSB7ezB4YTYsMHg0YSwweDg5LDB4NTksMHgwNywweDI4LDB4OTIsCi0gICAweGM4LDB4OGMsMHg1ZCwweDVjLDB4MDEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhNiwweDRhLDB4ODksMHg1OSwweDA3LDB4MjgsMHg5MiwKLSAgIDB4YWYsMHg4MywweDQ0LDB4NDMsMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGE2LDB4NGEsMHg4OSwweDU5LDB4MDcsMHgyOCwweDkyLAotICAgMHhjOCwweDhjLDB4NWQsMHg1YywweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4YTYsMHg0YSwweDg5LDB4NTksMHgwNywweDI4LDB4OTIsCi0gICAweGZhLDB4ODMsMHg0NCwweDQzLDB4MzEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhNiwweDRhLDB4ODksMHg1OSwweDA3LDB4MjgsMHg5MiwKLSAgIDB4ZjAsMHg4NCwweDg1LDB4ODQsMHgxMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDljLDB4MzEsMHg4MCwweDU5LDB4ODcsMHgyOCwweGQ0LAotICAgMHgzZiwweDgzLDB4NTcsMHgyOSwweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4OGUsMHgzZiwweDkyLDB4NTksMHgwNywweDI4LDB4ZDQsCi0gICAweDkzLDB4ODcsMHhmZiwweDI5LDB4MjEsMHgwMCwweDA2LAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTMzEwX0xWRFNDUlQxMTQwMHgxMDUwXzFbXSA9Ci17Ci0gIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4OWUsMHgxZiwKLSAgICAweDhmLDB4ODEsMHg4ZiwweDlmLDB4MzAsMHgwMCwweDA1LAotICAgIDB4MDB9fSwKLSAge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHg2YywweDFmLAotICAgIDB4NWUsMHg4MSwweDVkLDB4NmQsMHgxMCwweDAwLDB4MDUsCi0gICAgMHgwMH19LAotICB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDllLDB4MWYsCi0gICAgMHg5MCwweDgzLDB4OGYsMHg5ZiwweDMwLDB4MDAsMHgwNSwKLSAgICAweDAwfX0sCi0gIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4NmMsMHgxZiwKLSAgICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgIDB4MDB9fSwKLSAge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHhlZSwweDFmLAotICAgIDB4ZGYsMHg4MiwweGRmLDB4ZWYsMHgxMCwweDAwLDB4MDUsCi0gICAgMHgwMH19LAotICB7ezB4ODMsMHg2MywweDg3LDB4NjgsMHgxNiwweDY2LDB4ZjAsCi0gICAgMHg1NywweDhlLDB4NTcsMHg2NywweDIwLDB4MDAsMHgwNiwKLSAgICAweDAxfX0sCi0gIHt7MHg5ZiwweDdmLDB4ODMsMHg4NCwweDkyLDB4MGUsMHhmMSwKLSAgICAweGZmLDB4ODYsMHhmZiwweDBmLDB4MTAsMHgwMCwweDAyLAotICAgIDB4MDEsfX0sCi0gIHt7MHhiZiwweDlmLDB4ODMsMHhhNCwweDEyLDB4MGUsMHhkZSwKLSAgICAweGZmLDB4ODYsMHhmZiwweDBmLDB4MDEsMHgwMCwweDA3LAotICAgIDB4MDF9fSwKLSAge3sweGNlLDB4YWUsMHg5MiwweGIzLDB4MDEsMHgyOCwweDEwLAotICAgIDB4MTksMHg4MCwweDE5LDB4MjksMHgwZiwweDAwLDB4MDMsCi0gICAgMHgwMH19Ci0jaWYgMAotIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4OWUsMHgxZiwKLSAgIDB4OTMsMHg4NiwweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHg2YywweDFmLAotICAgMHg2MCwweDg0LDB4NWQsMHg2ZCwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDllLDB4MWYsCi0gICAweDkzLDB4ODYsMHg4ZiwweDlmLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4NmMsMHgxZiwKLSAgIDB4NjAsMHg4NCwweDVkLDB4NmQsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHhlZSwweDFmLAotICAgMHhlMiwweDg2LDB4ZGYsMHhlZiwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHg2MywweDg3LDB4NjgsMHgxNiwweDY2LDB4ZjAsCi0gICAweDVhLDB4OGUsMHg1NywweDY3LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHg5ZiwweDdmLDB4ODMsMHg4NCwweDkyLDB4MGUsMHhmNSwKLSAgIDB4MDIsMHg4NiwweGZmLDB4MGYsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGJmLDB4OWYsMHg4MywweGE0LDB4MTIsMHgwZSwweDVhLAotICAgMHgwMiwweDg2LDB4ZmYsMHgwZiwweDA5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHhhZSwweDkyLDB4YjMsMHgwMSwweDI4LDB4MTAsCi0gICAweDFhLDB4ODAsMHgxOSwweDI5LDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19Ci0jZW5kaWYgICAKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMV9IW10gPQotewotIHt7MHg0NywweDI3LDB4OGIsMHgyYywweDFhLDB4OWUsMHgxZiwKLSAgIDB4OGYsMHg4MSwweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDZjLDB4MWYsCi0gICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgzMCwweDFlLDB4OWUsMHgxZiwKLSAgIDB4OTAsMHg4MywweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDQ3LDB4MjcsMHg4YiwweDJjLDB4MWEsMHg2YywweDFmLAotICAgMHg2MCwweDg0LDB4NWQsMHg2ZCwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweGVlLDB4MWYsCi0gICAweGRmLDB4ODYsMHhkZiwweGVmLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1MSwweDMxLDB4OTUsMHgzNiwweDA0LDB4NjYsMHhmMCwKLSAgIDB4NTcsMHg4ZSwweDU3LDB4NjcsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDVmLDB4M2YsMHg4MywweDQ0LDB4OTIsMHgwZSwweGYxLAotICAgMHhmZiwweDg2LDB4ZmYsMHgwZiwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDBlLDB4NWEsCi0gICAweDAyLDB4ODYsMHhmZiwweDBmLDB4MDksMHgwMCwweDA1LAotICAgMHgwMX19LAotIHt7MHg3NiwweDU2LDB4OWEsMHg1YiwweDg5LDB4MjgsMHgxMCwKLSAgIDB4MWMsMHg4MCwweDE5LDB4MjksMHgwYiwweDAwLDB4MDUsCi0gICAweDAwfX0KLSNpZiAwCi0ge3sweDQ3LDB4MjcsMHg4YiwweDJjLDB4MWEsMHg5ZSwweDFmLAotICAgMHg5MywweDg2LDB4OGYsMHg5ZiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDZjLDB4MWYsCi0gICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgzMCwweDFlLDB4OWUsMHgxZiwKLSAgIDB4OTIsMHg4NiwweDhmLDB4OWYsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDQ3LDB4MjcsMHg4YiwweDJjLDB4MWEsMHg2YywweDFmLAotICAgMHg2MCwweDg0LDB4NWQsMHg2ZCwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweGVlLDB4MWYsCi0gICAweGUyLDB4ODYsMHhkZiwweGVmLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1MSwweDMxLDB4OTUsMHgzNiwweDA0LDB4NjYsMHhmMCwKLSAgIDB4NWEsMHg4ZSwweDU3LDB4NjcsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDVmLDB4M2YsMHg4MywweDQ0LDB4OTIsMHgwZSwweGY1LAotICAgMHgwMiwweDg2LDB4ZmYsMHgwZiwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NmYsMHg0ZiwweDkzLDB4NTQsMHg4MiwweDBlLDB4NWEsCi0gICAweDAyLDB4ODYsMHhmZiwweDBmLDB4MDksMHgwMCwweDA1LAotICAgMHgwMX19LAotIHt7MHg3NiwweDU2LDB4OWEsMHg1YiwweDg5LDB4MjgsMHgxMCwKLSAgIDB4MWMsMHg4MCwweDE5LDB4MjksMHgwYiwweDAwLDB4MDUsCi0gICAweDAwfX0KLSNlbmRpZiAgIAotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTE0MDB4MTA1MF8yW10gPQotewotIHt7MHhjZSwweDcyLDB4OTEsMHg4NCwweDkyLDB4MjgsMHg5MiwKLSAgIDB4ZDcsMHg4YiwweDVkLDB4NWMsMHgyMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4NzIsMHg5MSwweDg0LDB4OTIsMHgyOCwweDkyLAotICAgMHhiZSwweDgyLDB4NDQsMHg0MywweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg3MiwweDkxLDB4ODQsMHg5MiwweDI4LDB4OTIsCi0gICAweGQ3LDB4OGIsMHg1ZCwweDVjLDB4MjEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhjZSwweDcyLDB4OTEsMHg4NCwweDkyLDB4MjgsMHg5MiwKLSAgIDB4YmUsMHg4MiwweDQ0LDB4NDMsMHgwMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4NzIsMHg5MSwweDg0LDB4OTIsMHgyOCwweDkyLAotICAgMHhmZiwweDgzLDB4ODUsMHg4NCwweDExLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg2MywweDkyLDB4OGUsMHgxYywweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhjZSwweDdmLDB4OTIsMHg5YywweDBhLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4OWYsMHg5MiwweGFjLDB4MWEsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHhhZSwweDkyLDB4YmMsMHgwYSwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHhjZSwweDRmLDB4OTIsMHg4YywweDFhLDB4MjgsMHg5YSwKLSAgIDB4ZGIsMHg4ZiwweDhmLDB4MjksMHgyMSwweDAwLDB4MDMsCi0gICAweDAwfX0sCi0ge3sweGNlLDB4NGYsMHg5MiwweDhjLDB4MWEsMHgyOCwweDlhLAotICAgMHhjMiwweDg2LDB4NWQsMHgyOSwweDAxLDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg0ZiwweDkyLDB4OGMsMHgxYSwweDI4LDB4OWEsCi0gICAweGRiLDB4OGYsMHg4ZiwweDI5LDB4MjEsMHgwMCwweDAzLAotICAgMHgwMH19LAotIHt7MHhjZSwweDRmLDB4OTIsMHg4YywweDFhLDB4MjgsMHg5YSwKLSAgIDB4YzIsMHg4NiwweDVkLDB4MjksMHgwMSwweDAwLDB4MDMsCi0gICAweDAwfX0sCi0ge3sweGNlLDB4NGYsMHg5MiwweDhjLDB4MWEsMHgyOCwweDllLAotICAgMHgwMywweDg3LDB4ZGYsMHgyOSwweDAxLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwKLSB7ezB4Y2UsMHg2MywweDkyLDB4OTYsMHgwNCwweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhjZSwweDdmLDB4OTIsMHhhNCwweDEyLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGNlLDB4OWYsMHg5MiwweGI0LDB4MDIsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHhhZSwweDkyLDB4YmMsMHgwYSwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19Ci0jZW5kaWYgICAKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMl9IW10gPQotewotIHt7MHhhNiwweDRhLDB4ODksMHg1YywweDBhLDB4MjgsMHg5MiwKLSAgIDB4ZDcsMHg4YiwweDVkLDB4NWMsMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGE2LDB4NGEsMHg4OSwweDVjLDB4MGEsMHgyOCwweDkyLAotICAgMHhiZSwweDgyLDB4NDQsMHg0MywweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4YTYsMHg0YSwweDg5LDB4NWMsMHgwYSwweDI4LDB4OTIsCi0gICAweGQ3LDB4OGIsMHg1ZCwweDVjLDB4MjEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhNiwweDRhLDB4ODksMHg1YywweDBhLDB4MjgsMHg5MiwKLSAgIDB4YmUsMHg4MiwweDQ0LDB4NDMsMHgwMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGE2LDB4NGEsMHg4OSwweDVjLDB4MGEsMHgyOCwweDkyLAotICAgMHhmZiwweDgzLDB4ODUsMHg4NCwweDExLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4OWMsMHgzMSwweDgwLDB4NWMsMHg4YSwweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHg4ZSwweDNmLDB4OTIsMHg1YywweDBhLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDdlLDB4NGYsMHg4MiwweDVjLDB4MGEsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4NzYsMHg1NiwweDlhLDB4NjQsMHg5MiwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDA1LAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHhhNiwweDI3LDB4OGEsMHg2NCwweDkyLDB4MjgsMHg5YSwKLSAgIDB4ZGIsMHg4ZiwweDhmLDB4MjksMHgyMSwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGE2LDB4MjcsMHg4YSwweDY0LDB4OTIsMHgyOCwweDlhLAotICAgMHhjMiwweDg2LDB4NWQsMHgyOSwweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTYsMHgyNywweDhhLDB4NjQsMHg5MiwweDI4LDB4OWEsCi0gICAweGRiLDB4OGYsMHg4ZiwweDI5LDB4MjEsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhNiwweDI3LDB4OGEsMHg2NCwweDkyLDB4MjgsMHg5YSwKLSAgIDB4YzIsMHg4NiwweDVkLDB4MjksMHgwMSwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGE2LDB4MjcsMHg4YSwweDY0LDB4OTIsMHgyOCwweDllLAotICAgMHgwMywweDg3LDB4ZGYsMHgyOSwweDAxLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OWMsMHgzMSwweDgwLDB4NjQsMHg5MiwweDI4LDB4ZDQsCi0gICAweDNmLDB4ODMsMHg1NywweDI5LDB4MDEsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHg4ZSwweDNmLDB4OTIsMHg2NCwweDEyLDB4MjgsMHhkNCwKLSAgIDB4OTMsMHg4NywweGZmLDB4MjksMHgyMSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDdlLDB4NGYsMHg4MiwweDY0LDB4MTIsMHgyOCwweDVhLAotICAgMHgxMywweDg3LDB4ZmYsMHgyOSwweDI5LDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4NzYsMHg1NiwweDlhLDB4NjQsMHg5MiwweDI4LDB4MTAsCi0gICAweDIwLDB4ODQsMHgxOSwweDI5LDB4MGYsMHgwMCwweDA1LAotICAgMHgwMH19Ci0jZW5kaWYgICAKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNjAweDEyMDBfMVtdID0KLXsKLSB7ezB4ODMsMHg0RiwweDg3LDB4NUIsMHgxMywweDA2LDB4M0UsCi0gICAweEIzLDB4ODYsMHg4RiwweDA3LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg4MywweDRGLDB4ODcsMHg1QiwweDEzLDB4RDQsMHgxRiwKLSAgIDB4ODEsMHg4NCwweDVELDB4RDUsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NEYsMHg4NywweDVCLDB4MTMsMHgwNiwweDNFLAotICAgMHhCMywweDg2LDB4OEYsMHgwNywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHg0RiwweDg3LDB4NUIsMHgxMywweEQ0LDB4MUYsCi0gICAweDgxLDB4ODQsMHg1RCwweEQ1LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg4MywweDRGLDB4ODcsMHg1QiwweDEzLDB4NTYsMHhCQSwKLSAgIDB4MDMsMHg4NiwweERGLDB4NTcsMHgwMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDk3LDB4NjMsMHg5QiwweDZGLDB4MDcsMHhDRSwweEYwLAotICAgMHg3QiwweDhFLDB4NTcsMHhDRiwweDIwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4QjMsMHg3RiwweDk3LDB4OEIsMHg4MywweDc2LDB4RjUsCi0gICAweDIzLDB4ODYsMHhGRiwweDc3LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhEMywweDlGLDB4OTcsMHhBQiwweDAzLDB4NzYsMHg1QSwKLSAgIDB4MjMsMHg4NiwweEZGLDB4NzcsMHgwOSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweEUyLDB4QUUsMHg4NiwweEJBLDB4OTIsMHg5MCwweDEwLAotICAgMHgzRCwweDgwLDB4MTksMHg5MSwweDBGLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwKLSB7ezB4RkIsMHhDNywweDlGLDB4RDMsMHg4QiwweDI2LDB4MTEsCi0gICAweEQzLDB4ODYsMHhBRiwweDI3LDB4M0YsMHgwMCwweDA3LAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHg4MywweDRmLDB4ODcsMHg1MSwweDA5LDB4YzAsMHgxZiwKLSAgIDB4OTAsMHg4NCwweDhmLDB4YzEsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NGYsMHg4NywweDUxLDB4MDksMHg4ZSwweDFmLAotICAgMHg1ZSwweDgyLDB4NWQsMHg4ZiwweDEwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHg0ZiwweDg3LDB4NTEsMHgwOSwweGMwLDB4MWYsCi0gICAweDkwLDB4ODQsMHg4ZiwweGMxLDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg4MywweDRmLDB4ODcsMHg1MSwweDA5LDB4OGUsMHgxZiwKLSAgIDB4NWUsMHg4MiwweDVkLDB4OGYsMHgxMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NGYsMHg4NywweDUxLDB4MDksMHgxMCwweDNlLAotICAgMHhlMCwweDg0LDB4ZGYsMHgxMSwweDAwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OTcsMHg2MywweDliLDB4NjUsMHgxZCwweDg4LDB4ZjAsCi0gICAweDU4LDB4OGMsMHg1NywweDg5LDB4MjAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhiMywweDdmLDB4OTcsMHg4MSwweDk5LDB4MzAsMHhmNSwKLSAgIDB4MDAsMHg4NCwweGZmLDB4MzEsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGQzLDB4OWYsMHg5NywweGExLDB4MTksMHgzMCwweDVhLAotICAgMHgwMCwweDg0LDB4ZmYsMHgzMSwweDA5LDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4ZTIsMHhhZSwweDg2LDB4YjAsMHg4OCwweDRhLDB4MTAsCi0gICAweDFhLDB4OGUsMHgxOSwweDRiLDB4MmYsMHgwMCwweDAzLAotICAgMHgwMH19LAotIHt7MHhmYiwweGM3LDB4OWYsMHhjOSwweDgxLDB4ZTAsMHgxMCwKLSAgIDB4YjAsMHg4NCwweGFmLDB4ZTEsMHgyZiwweDAwLDB4MDcsCi0gICAweDAwfX0KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8xX0hbXSA9Ci17Ci0ge3sweDVCLDB4MjcsMHg5RiwweDMzLDB4MEIsMHgwNiwweDJFLAotICAgMHhCMywweDg2LDB4OEYsMHgwNywweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NUIsMHgyNywweDlGLDB4MjksMHgwMSwweDhFLDB4MUYsCi0gICAweDgxLDB4ODQsMHg1RCwweEQ1LDB4MTAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHg1QiwweDI3LDB4OUYsMHgzMywweDBCLDB4MDYsMHgyRSwKLSAgIDB4QjMsMHg4NiwweDhGLDB4MDcsMHgyMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4NEYsMHg4NywweDVCLDB4MTMsMHhENCwweDFGLAotICAgMHg4MSwweDg0LDB4NUQsMHhENSwweDEwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4NUIsMHgyNywweDlGLDB4MzMsMHgwQiwweDU2LDB4QkEsCi0gICAweDAzLDB4ODYsMHhERiwweDU3LDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg2NSwweDMxLDB4ODksMHgzRCwweDk1LDB4Q0UsMHhGMCwKLSAgIDB4N0IsMHg4RSwweDU3LDB4Q0YsMHgyMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDczLDB4M0YsMHg5NywweDRCLDB4ODMsMHg3NiwweEY1LAotICAgMHgyMywweDg2LDB4RkYsMHg3NywweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwKLSB7ezB4RDMsMHg5RiwweDk3LDB4QUIsMHgwMywweDc2LDB4NUEsCi0gICAweDIzLDB4ODYsMHhGRiwweDc3LDB4MDksMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhFMiwweEFFLDB4ODYsMHhCQSwweDkyLDB4OTAsMHgxMCwKLSAgIDB4M0QsMHg4MCwweDE5LDB4OTEsMHgwRiwweDAwLDB4MDMsCi0gICAweDAwfX0sCi0ge3sweDk3LDB4NjMsMHg5QiwweDZGLDB4MDcsMHhFMCwweDEwLAotICAgMHhCMCwweDg0LDB4QUYsMHhFMSwweDJGLDB4MDAsMHgwNiwKLSAgIDB4MDB9fQotI2lmIDAKLSB7ezB4NWIsMHgyNywweDlmLDB4MjksMHgwMSwweGMwLDB4MWYsCi0gICAweDkwLDB4ODQsMHg4ZiwweGMxLDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDI3LDB4OWYsMHgyOSwweDAxLDB4OGUsMHgxZiwKLSAgIDB4NWUsMHg4MiwweDVkLDB4OGYsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDViLDB4MjcsMHg5ZiwweDI5LDB4MDEsMHhjMCwweDFmLAotICAgMHg5MCwweDg0LDB4OGYsMHhjMSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NWIsMHgyNywweDlmLDB4MjksMHgwMSwweDhlLDB4MWYsCi0gICAweDVlLDB4ODIsMHg1ZCwweDhmLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDI3LDB4OWYsMHgyOSwweDAxLDB4MTAsMHgzZSwKLSAgIDB4ZTAsMHg4NCwweGRmLDB4MTEsMHgwMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY1LDB4MzEsMHg4OSwweDMzLDB4OGIsMHg4OCwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg4OSwweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NzMsMHgzZiwweDk3LDB4NDEsMHg5OSwweDMwLDB4ZjUsCi0gICAweDAwLDB4ODQsMHhmZiwweDMxLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg4MywweDRmLDB4ODcsMHg1MSwweDA5LDB4MzAsMHg1YSwKLSAgIDB4MDAsMHg4NCwweGZmLDB4MzEsMHgwOSwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDhhLDB4NTYsMHg4ZSwweDU4LDB4MTAsMHg0YSwweDEwLAotICAgMHgxYSwweDhlLDB4MTksMHg0YiwweDJmLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OTcsMHg2MywweDliLDB4NjUsMHgxZCwweGUwLDB4MTAsCi0gICAweGIwLDB4ODQsMHhhZiwweGUxLDB4MmYsMHgwMCwweDA2LAotICAgMHgwMH19Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDExNjAweDEyMDBfMltdID0KLXsKLSB7ezB4RkIsMHg4NywweDg2LDB4OTcsMHgwRiwweDI2LDB4OTcsCi0gICAweDQzLDB4ODYsMHhEQiwweERBLDB4MTEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhGQiwweDg3LDB4ODYsMHg5NywweDBGLDB4MjYsMHg5NywKLSAgIDB4MkEsMHg4RCwweEMyLDB4QzEsMHgxMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweEZCLDB4ODcsMHg4NiwweDk3LDB4MEYsMHgyNiwweDk3LAotICAgMHg0MywweDg2LDB4REIsMHhEQSwweDExLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4RkIsMHg4NywweDg2LDB4OTcsMHgwRiwweDI2LDB4OTcsCi0gICAweDJBLDB4OEQsMHhDMiwweEMxLDB4MTEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhGQiwweDg3LDB4ODYsMHg5NywweDBGLDB4MjYsMHg5RiwKLSAgIDB4NkIsMHg4RSwweDAzLDB4MDIsMHgwMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweEZCLDB4NjMsMHg5RiwweEExLDB4OTksMHgyNiwweEQ1LAotICAgMHhBNywweDhBLDB4QkYsMHhCRSwweDAxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4RkIsMHg3RiwweDlGLDB4QUYsMHg4NywweDI2LDB4REQsCi0gICAweEZCLDB4OEUsMHgxMywweDEyLDB4MzEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhGQiwweDlGLDB4OUYsMHhCRiwweDk3LDB4MjYsMHg1QiwKLSAgIDB4N0IsMHg4RSwweEZGLDB4MjcsMHgzOSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweEZCLDB4QUUsMHg5RiwweEM2LDB4OUUsMHgyNiwweDExLAotICAgMHg4OCwweDhCLDB4MTksMHgyNywweDFGLDB4MDAsMHgwMywKLSAgIDB4MDB9fSwKLSB7ezB4RkIsMHhDNywweDlGLDB4RDMsMHg4QiwweDI2LDB4MTEsCi0gICAweEQzLDB4ODYsMHhBRiwweDI3LDB4M0YsMHgwMCwweDA3LAotICAgMHgwMH19Ci0jaWYgMAotIHt7MHhmYiwweDg4LDB4ODcsMHg5MCwweDA4LDB4ZTAsMHg5NiwKLSAgIDB4MjAsMHg4NCwweGI5LDB4YjgsMHgwMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGZiLDB4ODgsMHg4NywweDkwLDB4MDgsMHhlMCwweDk2LAotICAgMHgwNywweDhiLDB4YTAsMHg5ZiwweDAxLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4ZmIsMHg4OCwweDg3LDB4OTAsMHgwOCwweGUwLDB4OTYsCi0gICAweDIwLDB4ODQsMHhiOSwweGI4LDB4MDEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhmYiwweDg4LDB4ODcsMHg5MCwweDA4LDB4ZTAsMHg5NiwKLSAgIDB4MDcsMHg4YiwweGEwLDB4OWYsMHgwMSwweDAwLDB4MDcsCi0gICAweDAxfX0sCi0ge3sweGZiLDB4ODgsMHg4NywweDkwLDB4MDgsMHhlMCwweDk2LAotICAgMHg0OCwweDhjLDB4ZTEsMHhlMCwweDExLDB4MDAsMHgwNywKLSAgIDB4MDF9fSwKLSB7ezB4ZmIsMHg2MywweDlmLDB4OWEsMHg5MiwweGUwLDB4ZDQsCi0gICAweDliLDB4OGYsMHg5ZCwweDljLDB4MjEsMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhmYiwweDdmLDB4OWYsMHhhOCwweDgwLDB4ZTAsMHhkNCwKLSAgIDB4ZWYsMHg4MywweGZmLDB4ZTEsMHgyMSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweGZiLDB4OWYsMHg5ZiwweGI4LDB4OTAsMHhlMCwweDVhLAotICAgMHg2ZiwweDgzLDB4ZmYsMHhlMSwweDI5LDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4ZmIsMHhhZSwweDlmLDB4YmYsMHg5NywweGUwLDB4MTAsCi0gICAweDdjLDB4ODAsMHgxOSwweGUxLDB4MGYsMHgwMCwweDAzLAotICAgMHgwMH19LAotIHt7MHhmYiwweGM3LDB4OWYsMHhjOSwweDg0LDB4ZTAsMHgxMCwKLSAgIDB4YzcsMHg4YiwweGFmLDB4ZTEsMHgwZiwweDAwLDB4MDcsCi0gICAweDAwfX0KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8yX0hbXSA9Ci17Ci0ge3sweEQzLDB4NUYsMHg5RSwweDZGLDB4MDcsMHgyNiwweDk3LAotICAgMHg0MywweDg2LDB4REIsMHhEQSwweDExLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4RDMsMHgyNywweDk3LDB4NkYsMHgwNywweDI2LDB4OTcsCi0gICAweDZCLDB4OEUsMHg4MywweDgyLDB4MDEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhEMywweDVGLDB4OUUsMHg2RiwweDA3LDB4MjYsMHg5NywKLSAgIDB4NDMsMHg4NiwweERCLDB4REEsMHgxMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweEQzLDB4MjcsMHg5NywweDZGLDB4MDcsMHgyNiwweDk3LAotICAgMHgwNywweDhCLDB4QTAsMHg5RiwweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4RDMsMHgyNywweDk3LDB4NkYsMHgwNywweDI2LDB4OTcsCi0gICAweDZCLDB4OEUsMHg4MywweDgyLDB4MDEsMHgwMCwweDAzLAotICAgMHgwMX19LAotIHt7MHhDOSwweDMxLDB4OEQsMHg2RiwweDA3LDB4MjYsMHhENSwKLSAgIDB4QTcsMHg4QSwweEJGLDB4QkUsMHgwMSwweDAwLDB4MDMsCi0gICAweDAxfX0sCi0ge3sweEJCLDB4M0YsMHg5RiwweDZGLDB4ODcsMHgyNiwweERELAotICAgMHhGQiwweDhFLDB4MTMsMHgxMiwweDMxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4QUIsMHg0RiwweDhGLDB4NjgsMHg4MCwweEUwLDB4NUEsCi0gICAweDZGLDB4ODMsMHhGRiwweEUxLDB4MjksMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhBMywweDU2LDB4ODcsMHg2NywweDlGLDB4RTAsMHgxMCwKLSAgIDB4N0MsMHg4MCwweDE5LDB4RTEsMHgwRiwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweDk3LDB4NjMsMHg5QiwweDY4LDB4MDAsMHhFMCwweDEwLAotICAgMHhDNywweDhCLDB4QUYsMHhFMSwweDBGLDB4MDAsMHgwMiwKLSAgIDB4MDB9fQotI2lmIDAKLSB7ezB4ZDMsMHg2MCwweDlmLDB4NjgsMHgwMCwweGUwLDB4OTYsCi0gICAweDIwLDB4ODQsMHhiOSwweGI4LDB4MDEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhkMywweDYwLDB4OWYsMHg2OCwweDAwLDB4ZTAsMHg5NiwKLSAgIDB4MDcsMHg4YiwweGEwLDB4OWYsMHgwMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGQzLDB4NjAsMHg5ZiwweDY4LDB4MDAsMHhlMCwweDk2LAotICAgMHgyMCwweDg0LDB4YjksMHhiOCwweDAxLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4ZDMsMHg2MCwweDlmLDB4NjgsMHgwMCwweGUwLDB4OTYsCi0gICAweDA3LDB4OGIsMHhhMCwweDlmLDB4MDEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhkMywweDYwLDB4OWYsMHg2OCwweDAwLDB4ZTAsMHg5NiwKLSAgIDB4NDgsMHg4YywweGUxLDB4ZTAsMHgxMSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGM5LDB4MzEsMHg4ZCwweDY4LDB4MDAsMHhlMCwweGQ0LAotICAgMHg5YiwweDhmLDB4OWQsMHg5YywweDIxLDB4MDAsMHgwMywKLSAgIDB4MDF9fSwKLSB7ezB4YmIsMHgzZiwweDlmLDB4NjgsMHg4MCwweGUwLDB4ZDQsCi0gICAweGVmLDB4ODMsMHhmZiwweGUxLDB4MjEsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhhYiwweDRmLDB4OGYsMHg2OCwweDgwLDB4ZTAsMHg1YSwKLSAgIDB4NmYsMHg4MywweGZmLDB4ZTEsMHgyOSwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4NTYsMHg4NywweDY3LDB4OWYsMHhlMCwweDEwLAotICAgMHg3YywweDgwLDB4MTksMHhlMSwweDBmLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4OTcsMHg2MywweDliLDB4NjgsMHgwMCwweGUwLDB4MTAsCi0gICAweGM3LDB4OGIsMHhhZiwweGUxLDB4MGYsMHgwMCwweDAyLAotICAgMHgwMH19Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzFbXSA9Ci17Ci0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4Y2UsMHg5ZiwweDkyLDB4YTgsMHgxNCwweDI4LDB4NWEsCi0gICAweDAwLDB4ODQsMHhmZiwweDI5LDB4MDksMHgwMCwweDA3LAotICAgMHgwMX19LAotIHt7MHhjZSwweDlmLDB4OTIsMHhhOSwweDE3LDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDcsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzFfSFtdID0KLXsKLSB7ezB4MzgsMHgyNywweDljLDB4MmMsMHg4MCwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LAotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4YmYsMHgxZiwKLSAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgzMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDM4LDB4MjcsMHg5YywweDJjLDB4ODAsMHhiZiwweDFmLAotICAgMHg5YywweDhlLDB4OTYsMHhiOSwweDMwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fSwKLSB7ezB4MzgsMHgyNywweDljLDB4MmMsMHg4MCwweGJmLDB4MWYsCi0gICAweDljLDB4OGUsMHg5NiwweGI5LDB4MzAsMHgwMCwweDAwLAotICAgMHgwMH19LAotIHt7MHgzOCwweDI3LDB4OWMsMHgyYywweDgwLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDAsCi0gICAweDAwfX0sCi0ge3sweDRkLDB4MzEsMHg5MSwweDNiLDB4MDMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NjMsMHgzZiwweDg3LDB4NGEsMHg5MiwweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi0KIC8qIENSVDEgQ1JUQyBmb3IgQ2hyb250ZWwgVFYgc2xhdmUgbW9kZXMgKi8KIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWQ1JUMVVOVFNDW10gPQoteyAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMTBfQ0hUVkNSVDFVTlRTQ1tdID0KK3sKICB7ezB4NjQsMHg0ZiwweDg4LDB4NTYsMHg5ZiwweDU2LDB4M2UsCiAgICAweGU4LDB4ODQsMHg4ZiwweDU3LDB4MjAsMHgwMCwweDAxLAogICAgMHgwMCB9fSwKQEAgLTI1NDYsNyArMTEzMiw3IEBACiAgICAweDAxfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVkNSVDFPTlRTQ1tdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMTBfQ0hUVkNSVDFPTlRTQ1tdID0KIHsKICB7ezB4NjMsMHg0ZiwweDg3LDB4NWEsMHg5ZiwweDBiLDB4M2UsCiAgICAweGMwLDB4ODQsMHg4ZiwweDBjLDB4MjAsMHgwMCwweDAxLApAQCAtMjU3MSw4ICsxMTU3LDggQEAKICAgIDB4MDEgfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVMzMTBfQ0hUVkNSVDFVUEFMW10gPQoteyAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVMzMTBfQ0hUVkNSVDFVUEFMW10gPQorewogIHt7MHg3OSwweDRmLDB4OWQsMHg1YSwweDkwLDB4NmYsMHgzZSwKICAgIDB4ZjgsMHg4MywweDhmLDB4NzAsMHgyMCwweDAwLDB4MDUsCiAgICAweDAwIH19LApAQCAtMjU5Niw3ICsxMTgyLDcgQEAKICAgIDB4MDF9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpUzMxMF9DSFRWQ1JUMU9QQUxbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTMzEwX0NIVFZDUlQxT1BBTFtdID0KIHsKICB7ezB4NzksMHg0ZiwweDlkLDB4NWEsMHg5MCwweDZmLDB4M2UsCiAgICAweGYwLDB4ODMsMHg4ZiwweDcwLDB4MjAsMHgwMCwweDA1LApAQCAtMjYyMSw4ICsxMjA3LDcgQEAKICAgIDB4MDEgfX0KIH07CiAKLQotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMTBfQ0hUVlJlZ19VTlRTQ1tdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhIFNpUzMxMF9DSFRWUmVnX1VOVFNDW10gPQogewogIHt7MHg0YSwweDc3LDB4YmIsMHg5NCwweDg0LDB4NDgsMHhmZSwweDUwLDB4MDQsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LAogIHt7MHg0YSwweDc3LDB4YmIsMHg5NCwweDg0LDB4NDgsMHhmZSwweDUwLDB4MDQsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LApAQCAtMjY0Miw3ICsxMjI3LDcgQEAKICAgICAgIGZvciBQQUwtTSBhbmQgUEFMLU4gYWxsIGFib3ZlIGlzIGNvcnJlY3RlZC4KICAgICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMxMF9DSFRWUmVnX09OVFNDW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzEwX0NIVFZSZWdfT05UU0NbXSA9CiB7CiAge3sweDQ5LDB4NzcsMHhiYiwweDdiLDB4ODQsMHgzNCwweDAwLDB4NTAsMHgwNCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfX0sCiAge3sweDQ5LDB4NzcsMHhiYiwweDdiLDB4ODQsMHgzNCwweDAwLDB4NTAsMHgwNCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfX0sCkBAIC0yNjUzLDcgKzEyMzgsNyBAQAogIHt7MHhlZCwweDc3LDB4YmIsMHg2NiwweDhjLDB4MjEsMHgwMiwweDVhLDB4MDQsMHgwMCwweDgwLDB4MWYsMHg5ZiwweGMxLDB4MGMsMHgwMH19CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0IFNpUzMxMF9DSFRWUmVnX1VQQUxbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19VUEFMW10gPQogewogIHt7MHg0MSwweDdmLDB4YjcsMHgzNCwweGFkLDB4NTAsMHgzNCwweDgzLDB4MDUsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LAogIHt7MHg0MSwweDdmLDB4YjcsMHg4MCwweDg1LDB4NTAsMHgwMCwweDgzLDB4MDUsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX19LApAQCAtMjY2NCw3ICsxMjQ5LDcgQEAKICB7ezB4ZTUsMHg3ZiwweGI3LDB4MWQsMHhhNywweDNlLDB4MDQsMHg1YSwweDA1LDB4MDAsMHg4MCwweDIwLDB4M2UsMHhlNCwweDIyLDB4MDB9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCBTaVMzMTBfQ0hUVlJlZ19PUEFMW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEgU2lTMzEwX0NIVFZSZWdfT1BBTFtdID0KIHsKICB7ezB4NDEsMHg3ZiwweGI3LDB4MzYsMHhhZCwweDUwLDB4MzQsMHg4MywweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKICB7ezB4NDEsMHg3ZiwweGI3LDB4ODYsMHg4NSwweDUwLDB4MDAsMHg4MywweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKQEAgLTI2NzUsNyArMTI2MCw3IEBACiAge3sweGU0LDB4N2YsMHhiNywweDFlLDB4YWYsMHgyOSwweDM3LDB4NWEsMHgwNSwweDAwLDB4ODAsMHgyNSwweDhjLDB4YjIsMHgyYSwweDAwfX0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfVVBBTE1bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19VUEFMTVtdID0KIHsKICB7ezB4NTIsMHg3NywweGJiLDB4OTQsMHg4NCwweDQ4LDB4ZmUsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKICB7ezB4NTIsMHg3NywweGJiLDB4OTQsMHg4NCwweDQ4LDB4ZmUsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKQEAgLTI2OTEsNyArMTI3Niw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfT1BBTE1bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19PUEFMTVtdID0KIHsKICB7ezB4NTEsMHg3NywweGJiLDB4N2IsMHg4NCwweDM0LDB4MDAsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKICB7ezB4NTEsMHg3NywweGJiLDB4N2IsMHg4NCwweDM0LDB4MDAsMHg4MywweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9fSwKQEAgLTI3MDcsNyArMTI5Miw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfVVBBTE5bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19VUEFMTltdID0KIHsKICB7ezB4NDEsMHg3ZiwweGI3LDB4MzQsMHhhZCwweDUwLDB4MzQsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKICB7ezB4NDEsMHg3ZiwweGI3LDB4ODAsMHg4NSwweDUwLDB4MDAsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKQEAgLTI3MjMsNyArMTMwOCw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgU2lTMzEwX0NIVFZSZWdfT1BBTE5bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSBTaVMzMTBfQ0hUVlJlZ19PUEFMTltdID0KIHsKICB7ezB4NDEsMHg3ZiwweGI3LDB4MzYsMHhhZCwweDUwLDB4MzQsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKICB7ezB4NDEsMHg3ZiwweGI3LDB4ODYsMHg4NSwweDUwLDB4MDAsMHg2ZSwweDA1LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9fSwKQEAgLTI3MzksMTYgKzEzMjQsMTYgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VOVFNDW10gPSB7MHg0MSwweDQxLDB4NDEsMHg0MSwweDQyLDB4NDYsMHg1M307Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT05UU0NbXSA9IHsweDQ4LDB4NDgsMHg0OCwweDQ4LDB4NDUsMHg0MywweDUxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VOVFNDW10gPSB7IDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MiwweDQ2LDB4NTMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09OVFNDW10gPSB7IDB4NDgsMHg0OCwweDQ4LDB4NDgsMHg0NSwweDQzLDB4NTEgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VQQUxbXSAgPSB7MHg0NywweDQ3LDB4NDcsMHg0NywweDQ4LDB4NGEsMHg1NH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT1BBTFtdICA9IHsweDQ3LDB4NDcsMHg0NywweDQ3LDB4NDgsMHg0ZiwweDUyfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VQQUxbXSAgPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRhLDB4NTQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09QQUxbXSAgPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRmLDB4NTIgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VQQUxNW10gPSB7MHg0MSwweDQxLDB4NDEsMHg0MSwweDQyLDB4NDYsMHg1M307Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT1BBTE1bXSA9IHsweDQ4LDB4NDgsMHg0OCwweDQ4LDB4NDUsMHg0MywweDUxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VQQUxNW10gPSB7IDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MiwweDQ2LDB4NTMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09QQUxNW10gPSB7IDB4NDgsMHg0OCwweDQ4LDB4NDgsMHg0NSwweDQzLDB4NTEgfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9DSFRWVkNMS1VQQUxOW10gPSB7MHg0NywweDQ3LDB4NDcsMHg0NywweDQ4LDB4NGEsMHg1NH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0NIVFZWQ0xLT1BBTE5bXSA9IHsweDQ3LDB4NDcsMHg0NywweDQ3LDB4NDgsMHg0ZiwweDUyfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS1VQQUxOW10gPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRhLDB4NTQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9DSFRWVkNMS09QQUxOW10gPSB7IDB4NDcsMHg0NywweDQ3LDB4NDcsMHg0OCwweDRmLDB4NTIgfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vc2lzL01ha2VmaWxlCmluZGV4IGFhZWQ4YzIuLmY3YzAwNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogCiBvYmotJChDT05GSUdfRkJfU0lTKSArPSBzaXNmYi5vCiAKLXNpc2ZiLW9ianMgOj0gc2lzX21haW4ubyBzaXNfYWNjZWwubyBpbml0Lm8gaW5pdDMwMS5vCitzaXNmYi1vYmpzIDo9IHNpc19tYWluLm8gc2lzX2FjY2VsLm8gaW5pdC5vIGluaXQzMDEubyBpbml0ZXh0bGZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQuYwppbmRleCBlY2ZkNzIxLi4yYWIzODY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0LmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdC5jCkBAIC0yLDExICsyLDEyIEBACiAvKiAkWGRvdE9yZyQgKi8KIC8qCiAgKiBNb2RlIGluaXRpYWxpemluZyBjb2RlIChDUlQxIHNlY3Rpb24pIGZvcgotICogZm9yIFNpUyAzMDAvMzA1LzU0MC82MzAvNzMwIGFuZAotICogICAgIFNpUyAzMTUvNTUwLzY1MC9NNjUwLzY1MS82NjFGWC9NNjYxRlgvNzQwLzc0MShHWCkvTTc0MS8zMzAvNjYwL002NjAvNzYwL003NjAKLSAqIChVbml2ZXJzYWwgbW9kdWxlIGZvciBMaW51eCBrZXJuZWwgZnJhbWVidWZmZXIgYW5kIFhGcmVlODYgNC54KQorICogZm9yIFNpUyAzMDAvMzA1LzU0MC82MzAvNzMwLAorICogICAgIFNpUyAzMTUvNTUwL1tNXTY1MC82NTEvW01dNjYxW0ZHTV1YL1tNXTc0eFtHWF0vMzMwL1tNXTc2eFtHWF0sCisgKiAgICAgWEdJIFZvbGFyaSBWM1hUL1Y1L1Y4LCBaNworICogKFVuaXZlcnNhbCBtb2R1bGUgZm9yIExpbnV4IGtlcm5lbCBmcmFtZWJ1ZmZlciBhbmQgWC5vcmcvWEZyZWU4NiA0LngpCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MywxNyArNTQsMTIgQEAKICAqCiAgKiBGb3JtZXJseSBiYXNlZCBvbiBub24tZnVuY3Rpb25hbCBjb2RlLWZyYWdlbWVudHMgZm9yIDMwMCBzZXJpZXMgYnkgU2lTLCBJbmMuCiAgKiBVc2VkIGJ5IHBlcm1pc3Npb24uCi0gKgotICogVFcgc2F5czogVGhpcyBjb2RlIGxvb2tzIGF3ZnVsLCBJIGtub3cuIEJ1dCBwbGVhc2UgZG9uJ3QgZG8gYW55dGhpbmcgYWJvdXQKLSAqIHRoaXMgb3RoZXJ3aXNlIGRlYnVnZ2luZyB3aWxsIGJlIGhlbGwuCi0gKiBUaGUgY29kZSBpcyBleHRyZW1lbHkgZnJhZ2lsZSBhcyByZWdhcmRzIHRoZSBkaWZmZXJlbnQgY2hpcHNldHMsIGRpZmZlcmVudAotICogdmlkZW8gYnJpZGdlcyBhbmQgY29tYmluYXRpb25zIHRoZXJlb2YuIElmIGFueXRoaW5nIGlzIGNoYW5nZWQsIGV4dHJlbWUKLSAqIGNhcmUgaGFzIHRvIGJlIHRha2VuIHRoYXQgdGhhdCBjaGFuZ2UgZG9lc24ndCBicmVhayBpdCBmb3Igb3RoZXIgY2hpcHNldHMsCi0gKiBicmlkZ2VzIG9yIGNvbWJpbmF0aW9ucyB0aGVyZW9mLgotICogQWxsIGNvbW1lbnRzIGluIHRoaXMgZmlsZSBhcmUgYnkgbWUsIHJlZ2FyZGxlc3MgaWYgdGhleSBhcmUgbWFya2VkIFRXIG9yIG5vdC4KLSAqCiAgKi8KLSAKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCiAjaW5jbHVkZSAiaW5pdC5oIgogCiAjaWZkZWYgU0lTMzAwCkBAIC04NCwyNCArODAsMTMgQEAKIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCiBzdGF0aWMgdm9pZAotSW5pdENvbW1vblBvaW50ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK0luaXRDb21tb25Qb2ludGVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogeworICAgU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlICA9IFNpU19TTW9kZUlEVGFibGU7CiAgICBTaVNfUHItPlNpU19TdFJlc0luZm8gICAgID0gU2lTX1N0UmVzSW5mbzsKICAgIFNpU19Qci0+U2lTX01vZGVSZXNJbmZvICAgPSBTaVNfTW9kZVJlc0luZm87CiAgICBTaVNfUHItPlNpU19TdGFuZFRhYmxlICAgID0gU2lTX1N0YW5kVGFibGU7CiAKLSAgIFNpU19Qci0+U2lTX05UU0NQaGFzZSAgICAgPSBTaVNfTlRTQ1BoYXNlOwotICAgU2lTX1ByLT5TaVNfUEFMUGhhc2UgICAgICA9IFNpU19QQUxQaGFzZTsKLSAgIFNpU19Qci0+U2lTX05UU0NQaGFzZTIgICAgPSBTaVNfTlRTQ1BoYXNlMjsKLSAgIFNpU19Qci0+U2lTX1BBTFBoYXNlMiAgICAgPSBTaVNfUEFMUGhhc2UyOwotICAgU2lTX1ByLT5TaVNfUEFMTVBoYXNlICAgICA9IFNpU19QQUxNUGhhc2U7Ci0gICBTaVNfUHItPlNpU19QQUxOUGhhc2UgICAgID0gU2lTX1BBTE5QaGFzZTsKLSAgIFNpU19Qci0+U2lTX1BBTE1QaGFzZTIgICAgPSBTaVNfUEFMTVBoYXNlMjsKLSAgIFNpU19Qci0+U2lTX1BBTE5QaGFzZTIgICAgPSBTaVNfUEFMTlBoYXNlMjsKLSAgIFNpU19Qci0+U2lTX1NwZWNpYWxQaGFzZSAgPSBTaVNfU3BlY2lhbFBoYXNlOwotICAgU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlTSA9IFNpU19TcGVjaWFsUGhhc2VNOwotICAgU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlSiA9IFNpU19TcGVjaWFsUGhhc2VKOwotCiAgICBTaVNfUHItPlNpU19OVFNDVGltaW5nICAgICA9IFNpU19OVFNDVGltaW5nOwogICAgU2lTX1ByLT5TaVNfUEFMVGltaW5nICAgICAgPSBTaVNfUEFMVGltaW5nOwogICAgU2lTX1ByLT5TaVNfSGlUVlN0MVRpbWluZyAgPSBTaVNfSGlUVlN0MVRpbWluZzsKQEAgLTEzNyw2ICsxMjIsNyBAQAogICAgU2lTX1ByLT5TaVNfRXh0TENEMTI4MHg3NjhfMkRhdGEgPSBTaVNfRXh0TENEMTI4MHg3NjhfMkRhdGE7CiAgICBTaVNfUHItPlNpU19MQ0QxMjgweDgwMERhdGEgICAgICA9IFNpU19MQ0QxMjgweDgwMERhdGE7CiAgICBTaVNfUHItPlNpU19MQ0QxMjgweDgwMF8yRGF0YSAgICA9IFNpU19MQ0QxMjgweDgwMF8yRGF0YTsKKyAgIFNpU19Qci0+U2lTX0xDRDEyODB4ODU0RGF0YSAgICAgID0gU2lTX0xDRDEyODB4ODU0RGF0YTsKICAgIFNpU19Qci0+U2lTX0xDRDEyODB4OTYwRGF0YSAgICAgID0gU2lTX0xDRDEyODB4OTYwRGF0YTsKICAgIFNpU19Qci0+U2lTX1N0TENEMTQwMHgxMDUwRGF0YSAgID0gU2lTX1N0TENEMTQwMHgxMDUwRGF0YTsKICAgIFNpU19Qci0+U2lTX0V4dExDRDE0MDB4MTA1MERhdGEgID0gU2lTX0V4dExDRDE0MDB4MTA1MERhdGE7CkBAIC0xNDUsNjcgKzEzMSwzMCBAQAogICAgU2lTX1ByLT5TaVNfRXh0TENEMTYwMHgxMjAwRGF0YSAgPSBTaVNfRXh0TENEMTYwMHgxMjAwRGF0YTsKICAgIFNpU19Qci0+U2lTX05vU2NhbGVEYXRhICAgICAgICAgID0gU2lTX05vU2NhbGVEYXRhOwogCi0gICBTaVNfUHItPlNpU19MVkRTMzIweDQ4MERhdGFfMSAgID0gU2lTX0xWRFMzMjB4NDgwRGF0YV8xOworICAgU2lTX1ByLT5TaVNfTFZEUzMyMHgyNDBEYXRhXzEgICA9IFNpU19MVkRTMzIweDI0MERhdGFfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFMzMjB4MjQwRGF0YV8yICAgPSBTaVNfTFZEUzMyMHgyNDBEYXRhXzI7CisgICBTaVNfUHItPlNpU19MVkRTNjQweDQ4MERhdGFfMSAgID0gU2lTX0xWRFM2NDB4NDgwRGF0YV8xOwogICAgU2lTX1ByLT5TaVNfTFZEUzgwMHg2MDBEYXRhXzEgICA9IFNpU19MVkRTODAweDYwMERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFM4MDB4NjAwRGF0YV8yICAgPSBTaVNfTFZEUzgwMHg2MDBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTMTAyNHg3NjhEYXRhXzEgID0gU2lTX0xWRFMxMDI0eDc2OERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFMxMDI0eDc2OERhdGFfMiAgPSBTaVNfTFZEUzEwMjR4NzY4RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4MTAyNERhdGFfMSA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4MTAyNERhdGFfMiA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzE0MDB4MTA1MERhdGFfMSA9IFNpU19MVkRTMTQwMHgxMDUwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzE0MDB4MTA1MERhdGFfMiA9IFNpU19MVkRTMTQwMHgxMDUwRGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzE2MDB4MTIwMERhdGFfMSA9IFNpU19MVkRTMTYwMHgxMjAwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzE2MDB4MTIwMERhdGFfMiA9IFNpU19MVkRTMTYwMHgxMjAwRGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4NzY4RGF0YV8xICA9IFNpU19MVkRTMTI4MHg3NjhEYXRhXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTMTI4MHg3NjhEYXRhXzIgID0gU2lTX0xWRFMxMjgweDc2OERhdGFfMjsKICAgIFNpU19Qci0+U2lTX0xWRFMxMDI0eDYwMERhdGFfMSAgPSBTaVNfTFZEUzEwMjR4NjAwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEwMjR4NjAwRGF0YV8yICA9IFNpU19MVkRTMTAyNHg2MDBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTMTE1Mng3NjhEYXRhXzEgID0gU2lTX0xWRFMxMTUyeDc2OERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFMxMTUyeDc2OERhdGFfMiAgPSBTaVNfTFZEUzExNTJ4NzY4RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEU1hYWHhYWFhEYXRhXzEgICA9IFNpU19MVkRTWFhYeFhYWERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFMxMjgweDk2MERhdGFfMSAgPSBTaVNfTFZEUzEyODB4OTYwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4OTYwRGF0YV8yICA9IFNpU19MVkRTMTI4MHg5NjBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTNjQweDQ4MERhdGFfMSAgID0gU2lTX0xWRFM2NDB4NDgwRGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4OTYwRGF0YV8xICA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8xOwotICAgU2lTX1ByLT5TaVNfTFZEUzEyODB4OTYwRGF0YV8yICA9IFNpU19MVkRTMTI4MHgxMDI0RGF0YV8yOwotICAgU2lTX1ByLT5TaVNfTFZEUzY0MHg0ODBEYXRhXzEgICA9IFNpU19MVkRTNjQweDQ4MERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8yICAgPSBTaVNfTFZEUzY0MHg0ODBEYXRhXzI7CisgICBTaVNfUHItPlNpU19MVkRTMTAyNHg3NjhEYXRhXzEgID0gU2lTX0xWRFMxMDI0eDc2OERhdGFfMTsKIAotICAgU2lTX1ByLT5TaVNfTFZEUzg0OHg0ODBEYXRhXzEgICA9IFNpU19MVkRTODQ4eDQ4MERhdGFfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFM4NDh4NDgwRGF0YV8yICAgPSBTaVNfTFZEUzg0OHg0ODBEYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMDI0RGF0YV8xID0gU2lTX0xWRFNCQVJDTzEwMjREYXRhXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMDI0RGF0YV8yID0gU2lTX0xWRFNCQVJDTzEwMjREYXRhXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMzY2RGF0YV8xID0gU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQkFSQ08xMzY2RGF0YV8yID0gU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzI7Ci0KLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMSAgICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzEgICAgPSBTaVNfTFZEU0NSVDExMDI0eDYwMF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMTUyeDc2OF8xICAgID0gU2lTX0xWRFNDUlQxMTE1Mng3NjhfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMV9IICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMV9IICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTE1Mng3NjhfMV9IICA9IFNpU19MVkRTQ1JUMTExNTJ4NzY4XzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMiAgICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzIgICAgPSBTaVNfTFZEU0NSVDExMDI0eDYwMF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMTUyeDc2OF8yICAgID0gU2lTX0xWRFNDUlQxMTE1Mng3NjhfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMl9IICA9IFNpU19MVkRTQ1JUMTEyODB4NzY4XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMl9IICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTE1Mng3NjhfMl9IICA9IFNpU19MVkRTQ1JUMTExNTJ4NzY4XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDQ4MF8xICAgICA9IFNpU19MVkRTQ1JUMTMyMHg0ODBfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8xICAgICA9IFNpU19MVkRTQ1JUMTMyMHgyNDBfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yICAgICA9IFNpU19MVkRTQ1JUMTMyMHgyNDBfMjsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yX0ggICA9IFNpU19MVkRTQ1JUMTMyMHgyNDBfMl9IOworICAgU2lTX1ByLT5TaVNfTFZEU0NSVDEzMjB4MjQwXzMgICAgID0gU2lTX0xWRFNDUlQxMzIweDI0MF8zOworICAgU2lTX1ByLT5TaVNfTFZEU0NSVDEzMjB4MjQwXzNfSCAgID0gU2lTX0xWRFNDUlQxMzIweDI0MF8zX0g7CiAgICBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMSAgICAgPSBTaVNfTFZEU0NSVDE2NDB4NDgwXzE7CiAgICBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IICAgPSBTaVNfTFZEU0NSVDE2NDB4NDgwXzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8yICAgICA9IFNpU19MVkRTQ1JUMTY0MHg0ODBfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8yX0ggICA9IFNpU19MVkRTQ1JUMTY0MHg0ODBfMl9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzMgICAgID0gU2lTX0xWRFNDUlQxNjQweDQ4MF8zOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzNfSCAgID0gU2lTX0xWRFNDUlQxNjQweDQ4MF8zX0g7CisjaWYgMAorICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDYwMF8xICAgID0gU2lTX0xWRFNDUlQxMTAyNHg2MDBfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMV9IICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSDsKKyAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMiAgICA9IFNpU19MVkRTQ1JUMTEwMjR4NjAwXzI7CisgICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSCAgPSBTaVNfTFZEU0NSVDExMDI0eDYwMF8yX0g7CisjZW5kaWYKIAogICAgU2lTX1ByLT5TaVNfQ0hUVlVOVFNDRGF0YSA9IFNpU19DSFRWVU5UU0NEYXRhOwogICAgU2lTX1ByLT5TaVNfQ0hUVk9OVFNDRGF0YSA9IFNpU19DSFRWT05UU0NEYXRhOwogCi0gICBTaVNfUHItPlNpU19DSFRWVU5UU0NEZXNEYXRhID0gU2lTX0NIVFZVTlRTQ0Rlc0RhdGE7Ci0gICBTaVNfUHItPlNpU19DSFRWT05UU0NEZXNEYXRhID0gU2lTX0NIVFZPTlRTQ0Rlc0RhdGE7Ci0gICBTaVNfUHItPlNpU19DSFRWVVBBTERlc0RhdGEgID0gU2lTX0NIVFZVUEFMRGVzRGF0YTsKLSAgIFNpU19Qci0+U2lTX0NIVFZPUEFMRGVzRGF0YSAgPSBTaVNfQ0hUVk9QQUxEZXNEYXRhOwotCiAgICBTaVNfUHItPlNpU19QYW5lbE1pbkxWRFMgICA9IFBhbmVsXzgwMHg2MDA7ICAgIC8qIGxvd2VzdCB2YWx1ZSBMVkRTL0xDREEgKi8KICAgIFNpU19Qci0+U2lTX1BhbmVsTWluMzAxICAgID0gUGFuZWxfMTAyNHg3Njg7ICAgLyogbG93ZXN0IHZhbHVlIDMwMSAqLwogfQpAQCAtMjEzLDUwICsxNjIsMjQgQEAKIAogI2lmZGVmIFNJUzMwMAogc3RhdGljIHZvaWQKLUluaXRUbzMwMFBvaW50ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK0luaXRUbzMwMFBvaW50ZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBJbml0Q29tbW9uUG9pbnRlcihTaVNfUHIsIEh3SW5mbyk7CisgICBJbml0Q29tbW9uUG9pbnRlcihTaVNfUHIpOwogCi0gICBTaVNfUHItPlNpU19TTW9kZUlEVGFibGUgID0gU2lTMzAwX1NNb2RlSURUYWJsZTsKICAgIFNpU19Qci0+U2lTX1ZCTW9kZUlEVGFibGUgPSBTaVMzMDBfVkJNb2RlSURUYWJsZTsKICAgIFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZSAgPSBTaVMzMDBfRU1vZGVJRFRhYmxlOwogICAgU2lTX1ByLT5TaVNfUmVmSW5kZXggICAgICA9IFNpUzMwMF9SZWZJbmRleDsKICAgIFNpU19Qci0+U2lTX0NSVDFUYWJsZSAgICAgPSBTaVMzMDBfQ1JUMVRhYmxlOwotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCAgICA9IFNpUzMwMF9NQ0xLRGF0YV8zMDA7IC8qIDMwMCAqLworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CisgICAgICBTaVNfUHItPlNpU19NQ0xLRGF0YV8wID0gU2lTMzAwX01DTEtEYXRhXzMwMDsgLyogMzAwICovCiAgICB9IGVsc2UgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCAgICA9IFNpUzMwMF9NQ0xLRGF0YV82MzA7IC8qIDYzMCwgNzMwICovCisgICAgICBTaVNfUHItPlNpU19NQ0xLRGF0YV8wID0gU2lTMzAwX01DTEtEYXRhXzYzMDsgLyogNjMwLCA3MzAgKi8KICAgIH0KICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhICAgICAgPSBTaVMzMDBfVkNMS0RhdGE7Ci0gICBTaVNfUHItPlNpU19WQlZDTEtEYXRhICAgID0gKFNpU19WQlZDTEtEYXRhU3RydWN0ICopU2lTMzAwX1ZDTEtEYXRhOworICAgU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YSAgICA9IChzdHJ1Y3QgU2lTX1ZCVkNMS0RhdGEgKilTaVMzMDBfVkNMS0RhdGE7CiAKICAgIFNpU19Qci0+U2lTX1NSMTUgID0gU2lTMzAwX1NSMTU7CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgIFNpU19Qci0+cFNpU19TUjA3ID0gJlNpUzMwMF9TUjA3OwotICAgU2lTX1ByLT5TaVNfQ1I0MCAgPSBTaVMzMDBfQ1I0MDsKLSAgIFNpU19Qci0+U2lTX0NSNDkgID0gU2lTMzAwX0NSNDk7Ci0gICBTaVNfUHItPnBTaVNfU1IxRiA9ICZTaVMzMDBfU1IxRjsKLSAgIFNpU19Qci0+cFNpU19TUjIxID0gJlNpUzMwMF9TUjIxOwotICAgU2lTX1ByLT5wU2lTX1NSMjIgPSAmU2lTMzAwX1NSMjI7Ci0gICBTaVNfUHItPnBTaVNfU1IyMyA9ICZTaVMzMDBfU1IyMzsKLSAgIFNpU19Qci0+cFNpU19TUjI0ID0gJlNpUzMwMF9TUjI0OwotICAgU2lTX1ByLT5TaVNfU1IyNSAgPSBTaVMzMDBfU1IyNTsKLSAgIFNpU19Qci0+cFNpU19TUjMxID0gJlNpUzMwMF9TUjMxOwotICAgU2lTX1ByLT5wU2lTX1NSMzIgPSAmU2lTMzAwX1NSMzI7Ci0gICBTaVNfUHItPnBTaVNfU1IzMyA9ICZTaVMzMDBfU1IzMzsKLSAgIFNpU19Qci0+cFNpU19DUlQyRGF0YV8xXzIgID0gJlNpUzMwMF9DUlQyRGF0YV8xXzI7Ci0gICBTaVNfUHItPnBTaVNfQ1JUMkRhdGFfNF9EICA9ICZTaVMzMDBfQ1JUMkRhdGFfNF9EOwotICAgU2lTX1ByLT5wU2lTX0NSVDJEYXRhXzRfRSAgPSAmU2lTMzAwX0NSVDJEYXRhXzRfRTsKLSAgIFNpU19Qci0+cFNpU19DUlQyRGF0YV80XzEwID0gJlNpUzMwMF9DUlQyRGF0YV80XzEwOwotICAgU2lTX1ByLT5wU2lTX1JHQlNlbnNlRGF0YSAgICA9ICZTaVMzMDBfUkdCU2Vuc2VEYXRhOwotICAgU2lTX1ByLT5wU2lTX1ZpZGVvU2Vuc2VEYXRhICA9ICZTaVMzMDBfVmlkZW9TZW5zZURhdGE7Ci0gICBTaVNfUHItPnBTaVNfWUNTZW5zZURhdGEgICAgID0gJlNpUzMwMF9ZQ1NlbnNlRGF0YTsKLSAgIFNpU19Qci0+cFNpU19SR0JTZW5zZURhdGEyICAgPSAmU2lTMzAwX1JHQlNlbnNlRGF0YTI7Ci0gICBTaVNfUHItPnBTaVNfVmlkZW9TZW5zZURhdGEyID0gJlNpUzMwMF9WaWRlb1NlbnNlRGF0YTI7Ci0gICBTaVNfUHItPnBTaVNfWUNTZW5zZURhdGEyICAgID0gJlNpUzMwMF9ZQ1NlbnNlRGF0YTI7Ci0jZW5kaWYKLQogICAgU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibCAgICAgPSBTaVMzMDBfUGFuZWxEZWxheVRibDsKICAgIFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxMVkRTID0gU2lTMzAwX1BhbmVsRGVsYXlUYmw7CiAKQEAgLTI2NiwxMSArMTg5LDggQEAKICAgIFNpU19Qci0+U2lTX1N0MkxDRDEyODB4MTAyNERhdGEgID0gU2lTMzAwX1N0MkxDRDEyODB4MTAyNERhdGE7CiAKICAgIFNpU19Qci0+U2lTX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xICA9IFNpUzMwMF9DUlQyUGFydDJfMTAyNHg3NjhfMTsKLSAgIFNpU19Qci0+U2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMSA9IFNpUzMwMF9DUlQyUGFydDJfMTI4MHgxMDI0XzE7CiAgICBTaVNfUHItPlNpU19DUlQyUGFydDJfMTAyNHg3NjhfMiAgPSBTaVMzMDBfQ1JUMlBhcnQyXzEwMjR4NzY4XzI7Ci0gICBTaVNfUHItPlNpU19DUlQyUGFydDJfMTI4MHgxMDI0XzIgPSBTaVMzMDBfQ1JUMlBhcnQyXzEyODB4MTAyNF8yOwogICAgU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzMgID0gU2lTMzAwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8zOwotICAgU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEyODB4MTAyNF8zID0gU2lTMzAwX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMzsKIAogICAgU2lTX1ByLT5TaVNfQ0hUVlVQQUxEYXRhICA9IFNpUzMwMF9DSFRWVVBBTERhdGE7CiAgICBTaVNfUHItPlNpU19DSFRWT1BBTERhdGEgID0gU2lTMzAwX0NIVFZPUEFMRGF0YTsKQEAgLTI4MCw2NCArMjAwLDE2IEBACiAgICBTaVNfUHItPlNpU19DSFRWT1BBTE5EYXRhID0gU2lTMzAwX0NIVFZPUEFMRGF0YTsgIC8qIG5vdCBzdXBwb3J0ZWQgb24gMzAwIHNlcmllcyAqLwogICAgU2lTX1ByLT5TaVNfQ0hUVlNPUEFMRGF0YSA9IFNpUzMwMF9DSFRWU09QQUxEYXRhOwogCi0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8xID0gU2lTMzAwX1BhbmVsVHlwZTAwXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8xID0gU2lTMzAwX1BhbmVsVHlwZTAxXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8xID0gU2lTMzAwX1BhbmVsVHlwZTAyXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18xID0gU2lTMzAwX1BhbmVsVHlwZTAzXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xID0gU2lTMzAwX1BhbmVsVHlwZTA0XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8xID0gU2lTMzAwX1BhbmVsVHlwZTA1XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8xID0gU2lTMzAwX1BhbmVsVHlwZTA2XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18xID0gU2lTMzAwX1BhbmVsVHlwZTA3XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8xID0gU2lTMzAwX1BhbmVsVHlwZTA4XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8xID0gU2lTMzAwX1BhbmVsVHlwZTA5XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8xID0gU2lTMzAwX1BhbmVsVHlwZTBhXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8xID0gU2lTMzAwX1BhbmVsVHlwZTBiXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18xID0gU2lTMzAwX1BhbmVsVHlwZTBjXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8xID0gU2lTMzAwX1BhbmVsVHlwZTBkXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8xID0gU2lTMzAwX1BhbmVsVHlwZTBlXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8xID0gU2lTMzAwX1BhbmVsVHlwZTBmXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8yID0gU2lTMzAwX1BhbmVsVHlwZTAwXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8yID0gU2lTMzAwX1BhbmVsVHlwZTAxXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8yID0gU2lTMzAwX1BhbmVsVHlwZTAyXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18yID0gU2lTMzAwX1BhbmVsVHlwZTAzXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8yID0gU2lTMzAwX1BhbmVsVHlwZTA0XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8yID0gU2lTMzAwX1BhbmVsVHlwZTA1XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8yID0gU2lTMzAwX1BhbmVsVHlwZTA2XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18yID0gU2lTMzAwX1BhbmVsVHlwZTA3XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8yID0gU2lTMzAwX1BhbmVsVHlwZTA4XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8yID0gU2lTMzAwX1BhbmVsVHlwZTA5XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8yID0gU2lTMzAwX1BhbmVsVHlwZTBhXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8yID0gU2lTMzAwX1BhbmVsVHlwZTBiXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18yID0gU2lTMzAwX1BhbmVsVHlwZTBjXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8yID0gU2lTMzAwX1BhbmVsVHlwZTBkXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8yID0gU2lTMzAwX1BhbmVsVHlwZTBlXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8yID0gU2lTMzAwX1BhbmVsVHlwZTBmXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18xID0gU2lTMzAwX1BhbmVsVHlwZU5TXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18yID0gU2lTMzAwX1BhbmVsVHlwZU5TXzI7CisgICBTaVNfUHItPlNpU19MVkRTODQ4eDQ4MERhdGFfMSAgID0gU2lTMzAwX0xWRFM4NDh4NDgwRGF0YV8xOworICAgU2lTX1ByLT5TaVNfTFZEUzg0OHg0ODBEYXRhXzIgICA9IFNpUzMwMF9MVkRTODQ4eDQ4MERhdGFfMjsKKyAgIFNpU19Qci0+U2lTX0xWRFNCQVJDTzEwMjREYXRhXzEgPSBTaVMzMDBfTFZEU0JBUkNPMTAyNERhdGFfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNCQVJDTzEzNjZEYXRhXzEgPSBTaVMzMDBfTFZEU0JBUkNPMTM2NkRhdGFfMTsKKyAgIFNpU19Qci0+U2lTX0xWRFNCQVJDTzEzNjZEYXRhXzIgPSBTaVMzMDBfTFZEU0JBUkNPMTM2NkRhdGFfMjsKIAotICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7Ci0gICAgICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xID0gU2lTMzAwX1BhbmVsVHlwZTA0XzFhOwotICAgICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMiA9IFNpUzMwMF9QYW5lbFR5cGUwNF8yYTsKLSAgIH0KLSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkgewotICAgICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMSA9IFNpUzMwMF9QYW5lbFR5cGUwNF8xYjsKLSAgICAgIFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzIgPSBTaVMzMDBfUGFuZWxUeXBlMDRfMmI7Ci0gICB9Ci0KLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxODAweDYwMF8xICAgICA9IFNpUzMwMF9MVkRTQ1JUMTgwMHg2MDBfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxODAweDYwMF8xX0ggICA9IFNpUzMwMF9MVkRTQ1JUMTgwMHg2MDBfMV9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzIgICAgID0gU2lTMzAwX0xWRFNDUlQxODAweDYwMF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzJfSCAgID0gU2lTMzAwX0xWRFNDUlQxODAweDYwMF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzEgICAgPSBTaVMzMDBfTFZEU0NSVDExMDI0eDc2OF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8xX0ggID0gU2lTMzAwX0xWRFNDUlQxMTAyNHg3NjhfMV9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8yICAgID0gU2lTMzAwX0xWRFNDUlQxMTAyNHg3NjhfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg3NjhfMl9IICA9IFNpUzMwMF9MVkRTQ1JUMTEwMjR4NzY4XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHgxMDI0XzEgICA9IFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMV9IID0gU2lTMzAwX0xWRFNDUlQxMTI4MHgxMDI0XzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHgxMDI0XzIgICA9IFNpUzMwMF9MVkRTQ1JUMTEyODB4MTAyNF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMl9IID0gU2lTMzAwX0xWRFNDUlQxMTI4MHgxMDI0XzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxWFhYeFhYWF8xICAgICA9IFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxWFhYeFhYWF8xX0ggICA9IFNpUzMwMF9MVkRTQ1JUMVhYWHhYWFhfMV9IOworICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMWEgPSBTaVMzMDBfUGFuZWxUeXBlMDRfMWE7CisgICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8yYSA9IFNpUzMwMF9QYW5lbFR5cGUwNF8yYTsKKyAgIFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzFiID0gU2lTMzAwX1BhbmVsVHlwZTA0XzFiOworICAgU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMmIgPSBTaVMzMDBfUGFuZWxUeXBlMDRfMmI7CiAKICAgIFNpU19Qci0+U2lTX0NIVFZDUlQxVU5UU0MgPSBTaVMzMDBfQ0hUVkNSVDFVTlRTQzsKICAgIFNpU19Qci0+U2lTX0NIVFZDUlQxT05UU0MgPSBTaVMzMDBfQ0hUVkNSVDFPTlRTQzsKQEAgLTM2Nyw2NCArMjM5LDM4IEBACiAKICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotSW5pdFRvMzEwUG9pbnRlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorSW5pdFRvMzEwUG9pbnRlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIEluaXRDb21tb25Qb2ludGVyKFNpU19QciwgSHdJbmZvKTsKKyAgIEluaXRDb21tb25Qb2ludGVyKFNpU19Qcik7CiAKLSAgIFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZSAgPSBTaVMzMTBfU01vZGVJRFRhYmxlOwogICAgU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlICA9IFNpUzMxMF9FTW9kZUlEVGFibGU7Ci0gICBTaVNfUHItPlNpU19SZWZJbmRleCAgICAgID0gKFNpU19FeHQyU3RydWN0ICopU2lTMzEwX1JlZkluZGV4OworICAgU2lTX1ByLT5TaVNfUmVmSW5kZXggICAgICA9IFNpUzMxMF9SZWZJbmRleDsKICAgIFNpU19Qci0+U2lTX0NSVDFUYWJsZSAgICAgPSBTaVMzMTBfQ1JUMVRhYmxlOwotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzM0MCkgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzM0MDsgIC8qIDM0MCAqLwotICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU183NjEpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzM0MCkgeworICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzM0MDsgIC8qIDM0MCArIFhHSSAqLworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzc2MSkgewogICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzc2MTsgIC8qIDc2MSAtIHByZWxpbWluYXJ5ICovCi0gICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzc2MCkgeworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzc2MCkgewogICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzc2MDsgIC8qIDc2MCAqLwotICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKKyAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKICAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzAgPSBTaVMzMTBfTUNMS0RhdGFfMF82NjA7ICAvKiA2NjEvNzQxICovCi0gICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMzMCkgeworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgewogICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMCA9IFNpUzMxMF9NQ0xLRGF0YV8wXzMzMDsgIC8qIDMzMCAqLwotICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID4gU0lTXzMxNVBSTykgeworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPiBTSVNfMzE1UFJPKSB7CiAgICAgICBTaVNfUHItPlNpU19NQ0xLRGF0YV8wID0gU2lTMzEwX01DTEtEYXRhXzBfNjUwOyAgLyogNTUwLCA2NTAsIDc0MCAqLwogICAgfSBlbHNlIHsKICAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzAgPSBTaVMzMTBfTUNMS0RhdGFfMF8zMTU7ICAvKiAzMTUgKi8KICAgIH0KLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zNDApIHsKLSAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzEgICAgPSBTaVMzMTBfTUNMS0RhdGFfMV8zNDA7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zNDApIHsKKyAgICAgIFNpU19Qci0+U2lTX01DTEtEYXRhXzEgPSBTaVMzMTBfTUNMS0RhdGFfMV8zNDA7CiAgICB9IGVsc2UgewotICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMSAgICA9IFNpUzMxMF9NQ0xLRGF0YV8xOworICAgICAgU2lTX1ByLT5TaVNfTUNMS0RhdGFfMSA9IFNpUzMxMF9NQ0xLRGF0YV8xOwogICAgfQogICAgU2lTX1ByLT5TaVNfVkNMS0RhdGEgICAgICA9IFNpUzMxMF9WQ0xLRGF0YTsKICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGEgICAgPSBTaVMzMTBfVkJWQ0xLRGF0YTsKIAogICAgU2lTX1ByLT5TaVNfU1IxNSAgPSBTaVMzMTBfU1IxNTsKIAotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgU2lTX1ByLT5wU2lTX1NSMDcgPSAmU2lTMzEwX1NSMDc7Ci0gICBTaVNfUHItPlNpU19DUjQwICA9IFNpUzMxMF9DUjQwOwotICAgU2lTX1ByLT5TaVNfQ1I0OSAgPSBTaVMzMTBfQ1I0OTsKLSAgIFNpU19Qci0+cFNpU19TUjFGID0gJlNpUzMxMF9TUjFGOwotICAgU2lTX1ByLT5wU2lTX1NSMjEgPSAmU2lTMzEwX1NSMjE7Ci0gICBTaVNfUHItPnBTaVNfU1IyMiA9ICZTaVMzMTBfU1IyMjsKLSAgIFNpU19Qci0+cFNpU19TUjIzID0gJlNpUzMxMF9TUjIzOwotICAgU2lTX1ByLT5wU2lTX1NSMjQgPSAmU2lTMzEwX1NSMjQ7Ci0gICBTaVNfUHItPlNpU19TUjI1ICA9IFNpUzMxMF9TUjI1OwotICAgU2lTX1ByLT5wU2lTX1NSMzEgPSAmU2lTMzEwX1NSMzE7Ci0gICBTaVNfUHItPnBTaVNfU1IzMiA9ICZTaVMzMTBfU1IzMjsKLSAgIFNpU19Qci0+cFNpU19TUjMzID0gJlNpUzMxMF9TUjMzOwotICAgU2lTX1ByLT5wU2lTX0NSVDJEYXRhXzFfMiAgPSAmU2lTMzEwX0NSVDJEYXRhXzFfMjsKLSAgIFNpU19Qci0+cFNpU19DUlQyRGF0YV80X0QgID0gJlNpUzMxMF9DUlQyRGF0YV80X0Q7Ci0gICBTaVNfUHItPnBTaVNfQ1JUMkRhdGFfNF9FICA9ICZTaVMzMTBfQ1JUMkRhdGFfNF9FOwotICAgU2lTX1ByLT5wU2lTX0NSVDJEYXRhXzRfMTAgPSAmU2lTMzEwX0NSVDJEYXRhXzRfMTA7Ci0gICBTaVNfUHItPnBTaVNfUkdCU2Vuc2VEYXRhICAgID0gJlNpUzMxMF9SR0JTZW5zZURhdGE7Ci0gICBTaVNfUHItPnBTaVNfVmlkZW9TZW5zZURhdGEgID0gJlNpUzMxMF9WaWRlb1NlbnNlRGF0YTsKLSAgIFNpU19Qci0+cFNpU19ZQ1NlbnNlRGF0YSAgICAgPSAmU2lTMzEwX1lDU2Vuc2VEYXRhOwotICAgU2lTX1ByLT5wU2lTX1JHQlNlbnNlRGF0YTIgICA9ICZTaVMzMTBfUkdCU2Vuc2VEYXRhMjsKLSAgIFNpU19Qci0+cFNpU19WaWRlb1NlbnNlRGF0YTIgPSAmU2lTMzEwX1ZpZGVvU2Vuc2VEYXRhMjsKLSAgIFNpU19Qci0+cFNpU19ZQ1NlbnNlRGF0YTIgICAgPSAmU2lTMzEwX1lDU2Vuc2VEYXRhMjsKLSNlbmRpZgotCiAgICBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsICAgICA9IFNpUzMxMF9QYW5lbERlbGF5VGJsOwogICAgU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibExWRFMgPSBTaVMzMTBfUGFuZWxEZWxheVRibExWRFM7CiAKQEAgLTQzNSw0MSArMjgxLDYgQEAKIAogICAgU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzEgID0gU2lTMzEwX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xOwogCi0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8xID0gU2lTMzEwX1BhbmVsVHlwZTAwXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8xID0gU2lTMzEwX1BhbmVsVHlwZTAxXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8xID0gU2lTMzEwX1BhbmVsVHlwZTAyXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18xID0gU2lTMzEwX1BhbmVsVHlwZTAzXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xID0gU2lTMzEwX1BhbmVsVHlwZTA0XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8xID0gU2lTMzEwX1BhbmVsVHlwZTA1XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8xID0gU2lTMzEwX1BhbmVsVHlwZTA2XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18xID0gU2lTMzEwX1BhbmVsVHlwZTA3XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8xID0gU2lTMzEwX1BhbmVsVHlwZTA4XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8xID0gU2lTMzEwX1BhbmVsVHlwZTA5XzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8xID0gU2lTMzEwX1BhbmVsVHlwZTBhXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8xID0gU2lTMzEwX1BhbmVsVHlwZTBiXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18xID0gU2lTMzEwX1BhbmVsVHlwZTBjXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8xID0gU2lTMzEwX1BhbmVsVHlwZTBkXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8xID0gU2lTMzEwX1BhbmVsVHlwZTBlXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8xID0gU2lTMzEwX1BhbmVsVHlwZTBmXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8yID0gU2lTMzEwX1BhbmVsVHlwZTAwXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMV8yID0gU2lTMzEwX1BhbmVsVHlwZTAxXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8yID0gU2lTMzEwX1BhbmVsVHlwZTAyXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18yID0gU2lTMzEwX1BhbmVsVHlwZTAzXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8yID0gU2lTMzEwX1BhbmVsVHlwZTA0XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8yID0gU2lTMzEwX1BhbmVsVHlwZTA1XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8yID0gU2lTMzEwX1BhbmVsVHlwZTA2XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwN18yID0gU2lTMzEwX1BhbmVsVHlwZTA3XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8yID0gU2lTMzEwX1BhbmVsVHlwZTA4XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8yID0gU2lTMzEwX1BhbmVsVHlwZTA5XzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYV8yID0gU2lTMzEwX1BhbmVsVHlwZTBhXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8yID0gU2lTMzEwX1BhbmVsVHlwZTBiXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18yID0gU2lTMzEwX1BhbmVsVHlwZTBjXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZF8yID0gU2lTMzEwX1BhbmVsVHlwZTBkXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8yID0gU2lTMzEwX1BhbmVsVHlwZTBlXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8yID0gU2lTMzEwX1BhbmVsVHlwZTBmXzI7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18xID0gU2lTMzEwX1BhbmVsVHlwZU5TXzE7Ci0gICBTaVNfUHItPlNpU19QYW5lbFR5cGVOU18yID0gU2lTMzEwX1BhbmVsVHlwZU5TXzI7Ci0KICAgIFNpU19Qci0+U2lTX0NIVFZVUEFMRGF0YSAgPSBTaVMzMTBfQ0hUVlVQQUxEYXRhOwogICAgU2lTX1ByLT5TaVNfQ0hUVk9QQUxEYXRhICA9IFNpUzMxMF9DSFRWT1BBTERhdGE7CiAgICBTaVNfUHItPlNpU19DSFRWVVBBTE1EYXRhID0gU2lTMzEwX0NIVFZVUEFMTURhdGE7CkBAIC00NzgsMzMgKzI4OSwxMSBAQAogICAgU2lTX1ByLT5TaVNfQ0hUVk9QQUxORGF0YSA9IFNpUzMxMF9DSFRWT1BBTE5EYXRhOwogICAgU2lTX1ByLT5TaVNfQ0hUVlNPUEFMRGF0YSA9IFNpUzMxMF9DSFRWU09QQUxEYXRhOwogCi0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTgwMHg2MDBfMSAgICAgPSBTaVMzMTBfTFZEU0NSVDE4MDB4NjAwXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzEgICAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMSAgID0gU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8xICAgPSBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMTsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzEgICA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8xOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzFfSCAgID0gU2lTMzEwX0xWRFNDUlQxODAweDYwMF8xX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzFfSCAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8xX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8xX0ggPSBTaVMzMTBfTFZEU0NSVDExMjgweDEwMjRfMV9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExNDAweDEwNTBfMV9IID0gU2lTMzEwX0xWRFNDUlQxMTQwMHgxMDUwXzFfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzFfSCA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8xX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTgwMHg2MDBfMiAgICAgPSBTaVMzMTBfTFZEU0NSVDE4MDB4NjAwXzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzIgICAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMiAgID0gU2lTMzEwX0xWRFNDUlQxMTI4MHgxMDI0XzI7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8yICAgPSBTaVMzMTBfTFZEU0NSVDExNDAweDEwNTBfMjsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzIgICA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8yOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzJfSCAgID0gU2lTMzEwX0xWRFNDUlQxODAweDYwMF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzJfSCAgPSBTaVMzMTBfTFZEU0NSVDExMDI0eDc2OF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8yX0ggPSBTaVMzMTBfTFZEU0NSVDExMjgweDEwMjRfMl9IOwotICAgU2lTX1ByLT5TaVNfTFZEU0NSVDExNDAweDEwNTBfMl9IID0gU2lTMzEwX0xWRFNDUlQxMTQwMHgxMDUwXzJfSDsKLSAgIFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzJfSCA9IFNpUzMxMF9MVkRTQ1JUMTE2MDB4MTIwMF8yX0g7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMVhYWHhYWFhfMSAgICAgPSBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzE7Ci0gICBTaVNfUHItPlNpU19MVkRTQ1JUMVhYWHhYWFhfMV9IICAgPSBTaVMzMTBfTFZEU0NSVDFYWFh4WFhYXzFfSDsKLSAgIFNpU19Qci0+U2lTX0NIVFZDUlQxVU5UU0MgICAgICAgICA9IFNpUzMxMF9DSFRWQ1JUMVVOVFNDOwotICAgU2lTX1ByLT5TaVNfQ0hUVkNSVDFPTlRTQyAgICAgICAgID0gU2lTMzEwX0NIVFZDUlQxT05UU0M7Ci0gICBTaVNfUHItPlNpU19DSFRWQ1JUMVVQQUwgICAgICAgICAgPSBTaVMzMTBfQ0hUVkNSVDFVUEFMOwotICAgU2lTX1ByLT5TaVNfQ0hUVkNSVDFPUEFMICAgICAgICAgID0gU2lTMzEwX0NIVFZDUlQxT1BBTDsKLSAgIFNpU19Qci0+U2lTX0NIVFZDUlQxU09QQUwgICAgICAgICA9IFNpUzMxMF9DSFRWQ1JUMU9QQUw7CisgICBTaVNfUHItPlNpU19DSFRWQ1JUMVVOVFNDID0gU2lTMzEwX0NIVFZDUlQxVU5UU0M7CisgICBTaVNfUHItPlNpU19DSFRWQ1JUMU9OVFNDID0gU2lTMzEwX0NIVFZDUlQxT05UU0M7CisgICBTaVNfUHItPlNpU19DSFRWQ1JUMVVQQUwgID0gU2lTMzEwX0NIVFZDUlQxVVBBTDsKKyAgIFNpU19Qci0+U2lTX0NIVFZDUlQxT1BBTCAgPSBTaVMzMTBfQ0hUVkNSVDFPUEFMOworICAgU2lTX1ByLT5TaVNfQ0hUVkNSVDFTT1BBTCA9IFNpUzMxMF9DSFRWQ1JUMU9QQUw7CiAKICAgIFNpU19Qci0+U2lTX0NIVFZSZWdfVU5UU0MgPSBTaVMzMTBfQ0hUVlJlZ19VTlRTQzsKICAgIFNpU19Qci0+U2lTX0NIVFZSZWdfT05UU0MgPSBTaVMzMTBfQ0hUVlJlZ19PTlRTQzsKQEAgLTUyOCwyMDggKzMxNywyMDMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZAotU2lTSW5pdFB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorQk9PTEVBTgorU2lTSW5pdFB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIHN3aXRjaChId0luZm8tPmpDaGlwVHlwZSkgewotI2lmZGVmIFNJUzMxNUgKLSAgIGNhc2UgU0lTXzMxNUg6Ci0gICBjYXNlIFNJU18zMTU6Ci0gICBjYXNlIFNJU18zMTVQUk86Ci0gICBjYXNlIFNJU181NTA6Ci0gICBjYXNlIFNJU182NTA6Ci0gICBjYXNlIFNJU183NDA6Ci0gICBjYXNlIFNJU18zMzA6Ci0gICBjYXNlIFNJU182NjE6Ci0gICBjYXNlIFNJU183NDE6Ci0gICBjYXNlIFNJU182NjA6Ci0gICBjYXNlIFNJU183NjA6Ci0gICBjYXNlIFNJU183NjE6Ci0gICBjYXNlIFNJU18zNDA6Ci0gICAgICBJbml0VG8zMTBQb2ludGVyKFNpU19QciwgSHdJbmZvKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICNpZmRlZiBTSVMzMDAKLSAgIGNhc2UgU0lTXzMwMDoKLSAgIGNhc2UgU0lTXzU0MDoKLSAgIGNhc2UgU0lTXzYzMDoKLSAgIGNhc2UgU0lTXzczMDoKLSAgICAgIEluaXRUbzMwMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotICAgICAgYnJlYWs7CisgICAgICBJbml0VG8zMDBQb2ludGVyKFNpU19Qcik7CisjZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOwogI2VuZGlmCi0gICBkZWZhdWx0OgotICAgICAgYnJlYWs7CisgICB9IGVsc2UgeworI2lmZGVmIFNJUzMxNUgKKyAgICAgIEluaXRUbzMxMFBvaW50ZXIoU2lTX1ByKTsKKyNlbHNlCisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKICAgIH0KKyAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICBIRUxQRVI6IEdldCBNb2RlSUQgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2Ci1VU0hPUlQKLVNpU19HZXRNb2RlSUQoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCi0gICAgICAgICAgICAgIGludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCBpbnQgTENEd2lkdGgsIGludCBMQ0RoZWlnaHQpCisjaWZuZGVmIFNJU19YT1JHX1hGODYKK3N0YXRpYworI2VuZGlmCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldE1vZGVJRChpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCisJCWludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCBpbnQgTENEd2lkdGgsIGludCBMQ0RoZWlnaHQpCiB7Ci0gICBVU0hPUlQgTW9kZUluZGV4ID0gMDsKKyAgIHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleCA9IDA7CiAKICAgIHN3aXRjaChIRGlzcGxheSkKICAgIHsKLSAgICAgY2FzZSAzMjA6Ci0gICAgIAkgIGlmKFZEaXNwbGF5ID09IDIwMCkgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjAwW0RlcHRoXTsKLQkgIGVsc2UgaWYoVkRpc3BsYXkgPT0gMjQwKSB7Ci0JICAgICBpZihGU1ROKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDI0MF9GU1ROW0RlcHRoXTsKLQkgICAgIGVsc2UgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgNDAwOgotICAgICAgICAgIGlmKCghKFZCRmxhZ3MgJiBDUlQxX0xDREEpKSB8fCAoKExDRHdpZHRoID49IDgwMCkgJiYgKExDRHdpZHRoID49IDYwMCkpKSB7Ci0gICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMzAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNDAweDMwMFtEZXB0aF07Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgNTEyOgotICAgICAgICAgIGlmKCghKFZCRmxhZ3MgJiBDUlQxX0xDREEpKSB8fCAoKExDRHdpZHRoID49IDEwMjQpICYmIChMQ0R3aWR0aCA+PSA3NjgpKSkgewotICAgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDM4NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOwotCSAgfQotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDY0MDoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSA0ODApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0ODBbRGVwdGhdOwotCSAgZWxzZSBpZihWRGlzcGxheSA9PSA0MDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF82NDB4NDAwW0RlcHRoXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSA3MjA6Ci0gICAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKLSAgICAgICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg1NzZbRGVwdGhdOwotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDc2ODoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83Njh4NTc2W0RlcHRoXTsKLQkgIGJyZWFrOwotICAgICBjYXNlIDgwMDoKLQkgIGlmKFZEaXNwbGF5ID09IDYwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDYwMFtEZXB0aF07Ci0JICBlbHNlIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzgwMHg0ODBbRGVwdGhdOwotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDg0ODoKLQkgIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOwotCSAgYnJlYWs7Ci0gICAgIGNhc2UgODU2OgotCSAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODU2eDQ4MFtEZXB0aF07Ci0JICBicmVhazsKLSAgICAgY2FzZSA5NjA6Ci0JICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgIGlmKFZEaXNwbGF5ID09IDU0MCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfOTYweDU0MFtEZXB0aF07Ci0JICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgIGNhc2UgMTAyNDoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NTc2W0RlcHRoXTsKLSAgICAgICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NzY4W0RlcHRoXTsKLQkgIGVsc2UgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICBpZihWRGlzcGxheSA9PSA2MDApICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NjAwW0RlcHRoXTsKLQkgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxMTUyOgotICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDg2NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4ODY0W0RlcHRoXTsKLSAgICAgICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKLQkgIH0KLQkgIGJyZWFrOwotICAgICBjYXNlIDEyODA6Ci0gICAgICAgICAgc3dpdGNoKFZEaXNwbGF5KSB7Ci0JICBjYXNlIDcyMDoKLQkgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDcyMFtEZXB0aF07Ci0JICAgICBicmVhazsKLQkgIGNhc2UgNzY4OgotCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzEyODB4NzY4W0RlcHRoXTsKLQkgICAgIH0gZWxzZSB7Ci0JICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKLQkgICAgIH0KLQkgICAgIGJyZWFrOwotCSAgY2FzZSA4MDA6Ci0JICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDgwMFtEZXB0aF07Ci0JICAgICB9Ci0JICAgICBicmVhazsKLQkgIGNhc2UgOTYwOgotCSAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4OTYwW0RlcHRoXTsKLQkgICAgIGJyZWFrOwotCSAgY2FzZSAxMDI0OgotCSAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07Ci0JICAgICBicmVhazsKLQkgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxMzYwOgotICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEzNjB4NzY4W0RlcHRoXTsKLQkgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotCSAgICAgaWYoVkRpc3BsYXkgPT0gMTAyNCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMwMF8xMzYweDEwMjRbRGVwdGhdOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxNDAwOgotICAgICAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgaWYoVkRpc3BsYXkgPT0gMTA1MCkgewotCSAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE0MDB4MTA1MFtEZXB0aF07Ci0JICAgICB9Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgMTYwMDoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSAxMjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTYwMHgxMjAwW0RlcHRoXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgY2FzZSAxNjgwOgotICAgICAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDEwNTApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjgweDEwNTBbRGVwdGhdOwotCSAgfQotICAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDE5MjA6Ci0gICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMTQ0MCkgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE5MjB4MTQ0MFtEZXB0aF07Ci0JICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgaWYoVkRpc3BsYXkgPT0gMTA4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE5MjB4MTA4MFtEZXB0aF07Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgMjA0ODoKLSAgICAgICAgICBpZihWRGlzcGxheSA9PSAxNTM2KSB7Ci0gICAgICAgICAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMwMF8yMDQ4eDE1MzZbRGVwdGhdOwotICAJICAgICB9IGVsc2UgewotCSAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W0RlcHRoXTsKLSAgICAgICAgICAgICB9Ci0JICB9Ci0gICAgICAgICAgYnJlYWs7CisJY2FzZSAzMjA6CisJCWlmKFZEaXNwbGF5ID09IDIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOworCQllbHNlIGlmKFZEaXNwbGF5ID09IDI0MCkgeworCQkJaWYoKFZCRmxhZ3MgJiBDUlQyX0xDRCkgJiYgKEZTVE4pKQorCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwX0ZTVE5bRGVwdGhdOworCQkJZWxzZQorCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDQwMDoKKwkJaWYoKCEoVkJGbGFncyAmIENSVDFfTENEQSkpIHx8ICgoTENEd2lkdGggPj0gODAwKSAmJiAoTENEd2lkdGggPj0gNjAwKSkpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgNTEyOgorCQlpZigoIShWQkZsYWdzICYgQ1JUMV9MQ0RBKSkgfHwgKChMQ0R3aWR0aCA+PSAxMDI0KSAmJiAoTENEd2lkdGggPj0gNzY4KSkpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDM4NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgNjQwOgorCQlpZihWRGlzcGxheSA9PSA0ODApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0ODBbRGVwdGhdOworCQllbHNlIGlmKFZEaXNwbGF5ID09IDQwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0MDBbRGVwdGhdOworCQlicmVhazsKKwljYXNlIDcyMDoKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKKwkJZWxzZSBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NTc2W0RlcHRoXTsKKwkJYnJlYWs7CisJY2FzZSA3Njg6CisJCWlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzc2OHg1NzZbRGVwdGhdOworCQlicmVhazsKKwljYXNlIDgwMDoKKwkJaWYoVkRpc3BsYXkgPT0gNjAwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF84MDB4NjAwW0RlcHRoXTsKKwkJZWxzZSBpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84MDB4NDgwW0RlcHRoXTsKKwkJYnJlYWs7CisJY2FzZSA4NDg6CisJCWlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOworCQlicmVhazsKKwljYXNlIDg1NjoKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODU2eDQ4MFtEZXB0aF07CisJCWJyZWFrOworCWNhc2UgOTYwOgorCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDU0MCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfOTYweDU0MFtEZXB0aF07CisJCQllbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJaWYoVkRpc3BsYXkgPT0gNTc2KSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDU3NltEZXB0aF07CisJCWVsc2UgaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg3NjhbRGVwdGhdOworCQllbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQkJaWYoVkRpc3BsYXkgPT0gNjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg2MDBbRGVwdGhdOworCQl9CisJCWJyZWFrOworCWNhc2UgMTE1MjoKKwkJaWYoVkRpc3BsYXkgPT0gODY0KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTE1Mng4NjRbRGVwdGhdOworCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDEyODA6CisJCXN3aXRjaChWRGlzcGxheSkgeworCQkJY2FzZSA3MjA6CisJCQkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4NzIwW0RlcHRoXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzY4OgorCQkJCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzEyODB4NzY4W0RlcHRoXTsKKwkJCQl9IGVsc2UgeworCQkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDgwMDoKKwkJCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCQkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODAwW0RlcHRoXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDg1NDoKKwkJCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCQkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODU0W0RlcHRoXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDk2MDoKKwkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHg5NjBbRGVwdGhdOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDI0OgorCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDEwMjRbRGVwdGhdOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMTM2MDoKKwkJaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTM2MHg3NjhbRGVwdGhdOworCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCWlmKFZEaXNwbGF5ID09IDEwMjQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMDBfMTM2MHgxMDI0W0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDE0MDA6CisJCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJaWYoVkRpc3BsYXkgPT0gMTA1MCkgeworCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8xNDAweDEwNTBbRGVwdGhdOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgMTYwMDoKKwkJaWYoVkRpc3BsYXkgPT0gMTIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE2MDB4MTIwMFtEZXB0aF07CisJCWJyZWFrOworCWNhc2UgMTY4MDoKKwkJaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCQlpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTY4MHgxMDUwW0RlcHRoXTsKKwkJfQorCQlicmVhazsKKwljYXNlIDE5MjA6CisJCWlmKFZEaXNwbGF5ID09IDE0NDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xOTIweDE0NDBbRGVwdGhdOworCQllbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJaWYoVkRpc3BsYXkgPT0gMTA4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE5MjB4MTA4MFtEZXB0aF07CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyMDQ4OgorCQlpZihWRGlzcGxheSA9PSAxNTM2KSB7CisJCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCQlNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzIwNDh4MTUzNltEZXB0aF07CisJCQl9IGVsc2UgeworCQkJCU1vZGVJbmRleCA9IE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W0RlcHRoXTsKKwkJCX0KKwkJfQorCQlicmVhazsKICAgIH0KIAotICAgcmV0dXJuKE1vZGVJbmRleCk7CisgICByZXR1cm4gTW9kZUluZGV4OwogfQotI2VuZGlmCiAKLVVTSE9SVAotU2lTX0dldE1vZGVJRF9MQ0QoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCi0gICAgICAgICAgICAgICAgICBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwgVVNIT1JUIEN1c3RvbVQsIGludCBMQ0R3aWR0aCwgaW50IExDRGhlaWdodCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZUlEX0xDRChpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCisJCWludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCB1bnNpZ25lZCBzaG9ydCBDdXN0b21ULCBpbnQgTENEd2lkdGgsIGludCBMQ0RoZWlnaHQsCisJCXVuc2lnbmVkIGludCBWQkZsYWdzMikKIHsKLSAgIFVTSE9SVCBNb2RlSW5kZXggPSAwOworICAgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4ID0gMDsKIAotICAgaWYoVkJGbGFncyAmIChWQl9MVkRTIHwgVkJfMzB4QkRIKSkgeworICAgaWYoVkJGbGFnczIgJiAoVkIyX0xWRFMgfCBWQjJfMzB4QkRIKSkgewogCiAgICAgICBzd2l0Y2goSERpc3BsYXkpCiAgICAgICB7CiAJY2FzZSAzMjA6Ci0JICAgICBpZihDdXN0b21UICE9IENVVF9QQU5FTDg0OCkgewotICAgICAJICAJaWYoVkRpc3BsYXkgPT0gMjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDIwMFtEZXB0aF07Ci0JICAJZWxzZSBpZihWRGlzcGxheSA9PSAyNDApIHsKKwkgICAgIGlmKChDdXN0b21UICE9IENVVF9QQU5FTDg0OCkgJiYgKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODU2KSkgeworCQlpZihWRGlzcGxheSA9PSAyMDApIHsKKwkJICAgaWYoIUZTVE4pIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjAwW0RlcHRoXTsKKwkJfSBlbHNlIGlmKFZEaXNwbGF5ID09IDI0MCkgewogCQkgICBpZighRlNUTikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyNDBbRGVwdGhdOwotICAgICAgICAgIAkgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgICAgICAgICAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwX0ZTVE5bRGVwdGhdOworCQkgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDI0MF9GU1ROW0RlcHRoXTsKIAkJICAgfQogCQl9CiAJICAgICB9Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgIAljYXNlIDQwMDoKLQkgICAgIGlmKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSB7Ci0JICAgICAgICBpZighKChWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmIChWQkZsYWdzICYgVkJfVFJVTVBJT04pKSkgewotICAgICAgICAgIAkgICBpZihWRGlzcGxheSA9PSAzMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF80MDB4MzAwW0RlcHRoXTsKKwkgICAgIGJyZWFrOworCWNhc2UgNDAwOgorCSAgICAgaWYoKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSAmJiAoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NTYpKSB7CisJCWlmKCEoKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYgKFZCRmxhZ3MyICYgVkIyX1RSVU1QSU9OKSkpIHsKKwkJICAgaWYoVkRpc3BsYXkgPT0gMzAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNDAweDMwMFtEZXB0aF07CiAJCX0KIAkgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWNhc2UgNTEyOgotCSAgICAgaWYoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpIHsKLQkgICAgICAgIGlmKCEoKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYgKFZCRmxhZ3MgJiBWQl9UUlVNUElPTikpKSB7CisJICAgICBpZigoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpICYmIChDdXN0b21UICE9IENVVF9QQU5FTDg1NikpIHsKKwkJaWYoISgoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSAmJiAoVkJGbGFnczIgJiBWQjJfVFJVTVBJT04pKSkgewogCQkgICBpZihMQ0R3aWR0aCA+PSAxMDI0ICYmIExDRHdpZHRoICE9IDExNTIgJiYgTENEaGVpZ2h0ID49IDc2OCkgewogCQkgICAgICBpZihWRGlzcGxheSA9PSAzODQpIHsKIAkJICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOwpAQCAtNzM5LDkgKzUyMywxMCBAQAogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSA2NDA6Ci0JICAgICBpZihWRGlzcGxheSA9PSA0ODApICAgICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzY0MHg0ODBbRGVwdGhdOworCSAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQ4MFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDQwMCkgewotCSAgICAgICAgaWYoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF82NDB4NDAwW0RlcHRoXTsKKwkJaWYoKEN1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSAmJiAoQ3VzdG9tVCAhPSBDVVRfUEFORUw4NTYpKQorCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQwMFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDgwMDoKQEAgLTc1Miw2ICs1MzcsMTEgQEAKIAkgICAgICAgIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CisJY2FzZSA4NTY6CisJICAgICBpZihDdXN0b21UID09IENVVF9QQU5FTDg1NikgeworCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODU2eDQ4MFtEZXB0aF07CisJICAgICB9CisJICAgICBicmVhazsKIAljYXNlIDEwMjQ6CiAJICAgICBpZihWRGlzcGxheSA9PSA3NjgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDc2OFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewpAQCAtNzYyLDcgKzU1Miw3IEBACiAJICAgICBicmVhazsKIAljYXNlIDExNTI6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgICAgIGlmKChWRGlzcGxheSA9PSA3NjgpICYmIChMQ0RoZWlnaHQgPT0gNzY4KSkgeworCQlpZigoVkRpc3BsYXkgPT0gNzY4KSAmJiAoTENEaGVpZ2h0ID09IDc2OCkpIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKIAkJfQogCSAgICAgfQpAQCAtNzcwLDQ5ICs1NjAsNDkgQEAKICAgICAgICAgY2FzZSAxMjgwOgogCSAgICAgaWYoVkRpc3BsYXkgPT0gMTAyNCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoKFZEaXNwbGF5ID09IDc2OCkgJiYgKExDRGhlaWdodCA9PSA3NjgpKSB7CisJCWlmKChWRGlzcGxheSA9PSA3NjgpICYmIChMQ0RoZWlnaHQgPT0gNzY4KSkgewogCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKIAkJfQogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxMzYwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgICAgICBpZihDdXN0b21UID09IENVVF9CQVJDTzEzNjYpIHsKKwkJaWYoQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7CiAJCSAgIGlmKFZEaXNwbGF5ID09IDEwMjQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMDBfMTM2MHgxMDI0W0RlcHRoXTsKIAkJfQogCSAgICAgfQogCSAgICAgaWYoQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEzNjB4NzY4W0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTM2MHg3NjhbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxNDAwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTQwMHgxMDUwW0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gMTA1MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE0MDB4MTA1MFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDE2MDA6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDEyMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjAweDEyMDBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSAxMjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTYwMHgxMjAwW0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogICAgICAgfQogCi0gICB9IGVsc2UgaWYoVkJGbGFncyAmIFZCX1NJU0JSSURHRSkgeworICAgfSBlbHNlIGlmKFZCRmxhZ3MyICYgVkIyX1NJU0JSSURHRSkgewogCiAgICAgICBzd2l0Y2goSERpc3BsYXkpCiAgICAgICB7CiAJY2FzZSAzMjA6Ci0gICAgIAkgICAgIGlmKFZEaXNwbGF5ID09IDIwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDIwMFtEZXB0aF07CisJICAgICBpZihWRGlzcGxheSA9PSAyMDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOwogCSAgICAgZWxzZSBpZihWRGlzcGxheSA9PSAyNDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgCWNhc2UgNDAwOgorCSAgICAgYnJlYWs7CisJY2FzZSA0MDA6CiAJICAgICBpZihMQ0R3aWR0aCA+PSA4MDAgJiYgTENEaGVpZ2h0ID49IDYwMCkgewotICAgICAgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSAzMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF80MDB4MzAwW0RlcHRoXTsKIAkgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWNhc2UgNTEyOgogCSAgICAgaWYoTENEd2lkdGggPj0gMTAyNCAmJiBMQ0RoZWlnaHQgPj0gNzY4ICYmIExDRHdpZHRoICE9IDExNTIpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDM4NCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzUxMngzODRbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgNjQwOgpAQCAtODIxLDk2ICs2MTEsMTE1IEBACiAJICAgICBicmVhazsKIAljYXNlIDcyMDoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKIAkJZWxzZSBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NTc2W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgNzY4OgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83Njh4NTc2W0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNTc2KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzY4eDU3NltEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDgwMDoKIAkgICAgIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzgwMHg2MDBbRGVwdGhdOwogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84MDB4NDgwW0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDQ4MFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDg0ODoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODQ4eDQ4MFtEZXB0aF07CisJCWlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg0OHg0ODBbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSA4NTY6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzg1Nng0ODBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84NTZ4NDgwW0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgOTYwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA1NDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg1NDBbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSA1NDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg1NDBbRGVwdGhdOwogCQllbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxMDI0OgogCSAgICAgaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg3NjhbRGVwdGhdOwogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDU3NltEZXB0aF07CisJCWlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NTc2W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgMTE1MjoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkRpc3BsYXkgPT0gODY0KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTE1Mng4NjRbRGVwdGhdOworCQlpZihWRGlzcGxheSA9PSA4NjQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMTUyeDg2NFtEZXB0aF07CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDEyODA6CiAJICAgICBzd2l0Y2goVkRpc3BsYXkpIHsKIAkgICAgIGNhc2UgNzIwOgotCSAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4NzIwW0RlcHRoXTsKKwkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4NzIwW0RlcHRoXTsKIAkgICAgIGNhc2UgNzY4OgotCSAgICAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewogCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzAwXzEyODB4NzY4W0RlcHRoXTsKIAkJfSBlbHNlIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMxMF8xMjgweDc2OFtEZXB0aF07CiAJCX0KIAkJYnJlYWs7CiAJICAgICBjYXNlIDgwMDoKLQkgICAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODAwW0RlcHRoXTsKIAkJfQogCQlicmVhazsKKwkgICAgIGNhc2UgODU0OgorCQlpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODU0W0RlcHRoXTsKKwkJfQorCQlicmVhazsKIAkgICAgIGNhc2UgOTYwOgotCSAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4OTYwW0RlcHRoXTsKKwkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4OTYwW0RlcHRoXTsKIAkJYnJlYWs7CiAJICAgICBjYXNlIDEwMjQ6Ci0JICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHgxMDI0W0RlcHRoXTsKKwkJTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07CiAJCWJyZWFrOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAJY2FzZSAxMzYwOgotCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA3NjgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMzYweDc2OFtEZXB0aF07CisJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsgIC8qIE9WRVIxMjgwIG9ubHk/ICovCisJCWlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEzNjB4NzY4W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgMTQwMDoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgICAgICAgaWYoVkJGbGFncyAmIChWQl8zMDFDIHwgVkJfMzAyTFYgfCBWQl8zMDJFTFYpKSB7CisJCWlmKFZCRmxhZ3MyICYgVkIyX0xDRE9WRVIxMjgwQlJJREdFKSB7CiAJCSAgIGlmKFZEaXNwbGF5ID09IDEwNTApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNDAweDEwNTBbRGVwdGhdOwogCQl9CiAJICAgICB9CiAJICAgICBicmVhazsKIAljYXNlIDE2MDA6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZCRmxhZ3MgJiAoVkJfMzAxQyB8IFZCXzMwMkxWIHwgVkJfMzAyRUxWKSkgewotCSAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMTIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE2MDB4MTIwMFtEZXB0aF07CisJCWlmKFZCRmxhZ3MyICYgVkIyX0xDRE9WRVIxMjgwQlJJREdFKSB7CisJCSAgIGlmKFZEaXNwbGF5ID09IDEyMDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjAweDEyMDBbRGVwdGhdOwogCQl9CiAJICAgICB9CiAJICAgICBicmVhazsKICNpZm5kZWYgVkJfRk9SQklEX0NSVDJMQ0RfT1ZFUl8xNjAwCiAJY2FzZSAxNjgwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWQkZsYWdzICYgKFZCXzMwMUMgfCBWQl8zMDJMViB8IFZCXzMwMkVMVikpIHsKLQkgICAgICAgICAgIGlmKFZEaXNwbGF5ID09IDEwNTApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xNjgweDEwNTBbRGVwdGhdOworCQlpZihWQkZsYWdzMiAmIFZCMl9MQ0RPVkVSMTI4MEJSSURHRSkgeworCQkgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTY4MHgxMDUwW0RlcHRoXTsKKwkJfQorCSAgICAgfQorCSAgICAgYnJlYWs7CisJY2FzZSAxOTIwOgorCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCWlmKFZCRmxhZ3MyICYgVkIyX0xDRE9WRVIxNjAwQlJJREdFKSB7CisJCSAgIGlmKFZEaXNwbGF5ID09IDE0NDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xOTIweDE0NDBbRGVwdGhdOworCQl9CisJICAgICB9CisJICAgICBicmVhazsKKwljYXNlIDIwNDg6CisJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJaWYoVkJGbGFnczIgJiBWQjJfTENET1ZFUjE2MDBCUklER0UpIHsKKwkJICAgaWYoVkRpc3BsYXkgPT0gMTUzNikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMxMF8yMDQ4eDE1MzZbRGVwdGhdOwogCQl9CiAJICAgICB9CiAJICAgICBicmVhazsKQEAgLTkyMSwxNiArNzMwLDE3IEBACiAgICByZXR1cm4gTW9kZUluZGV4OwogfQogCi1VU0hPUlQKLVNpU19HZXRNb2RlSURfVFYoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksIGludCBEZXB0aCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZUlEX1RWKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoLAorCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MyKQogewotICAgVVNIT1JUIE1vZGVJbmRleCA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXggPSAwOwogCi0gICBpZihWQkZsYWdzICYgVkJfQ0hST05URUwpIHsKKyAgIGlmKFZCRmxhZ3MyICYgVkIyX0NIUk9OVEVMKSB7CiAKICAgICAgIHN3aXRjaChIRGlzcGxheSkKICAgICAgIHsKLSAgICAgIAljYXNlIDUxMjoKKwljYXNlIDUxMjoKIAkgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewogCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKIAkgICAgIH0KQEAgLTk0NCwyNyArNzU0LDI3IEBACiAJICAgICBicmVhazsKIAljYXNlIDEwMjQ6CiAJICAgICBpZihWR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NzY4W0RlcHRoXTsKKwkJaWYoVkRpc3BsYXkgPT0gNzY4KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg3NjhbRGVwdGhdOwogCSAgICAgfQogCSAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgIH0gZWxzZSBpZihWQkZsYWdzICYgVkJfU0lTVFZCUklER0UpIHsKKyAgIH0gZWxzZSBpZihWQkZsYWdzMiAmIFZCMl9TSVNUVkJSSURHRSkgewogCiAgICAgICBzd2l0Y2goSERpc3BsYXkpCiAgICAgICB7CiAJY2FzZSAzMjA6Ci0gICAgIAkgICAgIGlmKFZEaXNwbGF5ID09IDIwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDIwMFtEZXB0aF07CisJICAgICBpZihWRGlzcGxheSA9PSAyMDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOwogCSAgICAgZWxzZSBpZihWRGlzcGxheSA9PSAyNDApIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMjB4MjQwW0RlcHRoXTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MDA6Ci0gICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMzAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNDAweDMwMFtEZXB0aF07Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAJY2FzZSA1MTI6CisJICAgICBicmVhazsKKwljYXNlIDQwMDoKKwkgICAgIGlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOworCSAgICAgYnJlYWs7CisJY2FzZSA1MTI6CiAJICAgICBpZiggKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgKFRWX1lQQlBSNzUwUCB8IFRWX1lQQlBSMTA4MEkpKSkgfHwKLQkgICAgICAgICAoVkJGbGFncyAmIFRWX0hJVklTSU9OKSAJCQkJCSAgICAgIHx8Ci0JICAgICAgICAgKCghKFZCRmxhZ3MgJiAoVFZfWVBCUFIgfCBUVl9QQUxNKSkpICYmIChWQkZsYWdzICYgVFZfUEFMKSkgKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKKwkJIChWQkZsYWdzICYgVFZfSElWSVNJT04pIAkJCQkJICAgICAgfHwKKwkJICgoIShWQkZsYWdzICYgKFRWX1lQQlBSIHwgVFZfUEFMTSkpKSAmJiAoVkJGbGFncyAmIFRWX1BBTCkpICkgeworCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgNjQwOgpAQCAtOTczLDM0ICs3ODMsMzQgQEAKIAkgICAgIGJyZWFrOwogCWNhc2UgNzIwOgogCSAgICAgaWYoKCEoVkJGbGFncyAmIFRWX0hJVklTSU9OKSkgJiYgKCEoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjEwODBJKSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gNDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg0ODBbRGVwdGhdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihWRGlzcGxheSA9PSA1NzYpIHsKKwkJaWYoVkRpc3BsYXkgPT0gNDgwKSB7CisJCSAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF83MjB4NDgwW0RlcHRoXTsKKwkJfSBlbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgewogCQkgICBpZiggKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFI3NTBQKSkgfHwKIAkJICAgICAgICgoIShWQkZsYWdzICYgKFRWX1lQQlBSIHwgVFZfUEFMTSkpKSAmJiAoVkJGbGFncyAmIFRWX1BBTCkpICkKLSAgICAgICAgICAgICAgICAgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzIweDU3NltEZXB0aF07Ci0gICAgICAgICAgICAgICAgfQorCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzIweDU3NltEZXB0aF07CisJCX0KIAkgICAgIH0KICAgICAgICAgICAgICBicmVhazsKIAljYXNlIDc2ODoKIAkgICAgIGlmKCghKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikpICYmICghKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpKSkgewotCSAgICAgICAgaWYoICgoVkJGbGFncyAmIFRWX1lQQlBSKSAmJiAoVkJGbGFncyAmIFRWX1lQQlBSNzUwUCkpIHx8CisJCWlmKCAoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjc1MFApKSB8fAogCQkgICAgKCghKFZCRmxhZ3MgJiAoVFZfWVBCUFIgfCBUVl9QQUxNKSkpICYmIChWQkZsYWdzICYgVFZfUEFMKSkgKSB7Ci0gICAgICAgICAgCSAgIGlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzc2OHg1NzZbRGVwdGhdOworCQkgICBpZihWRGlzcGxheSA9PSA1NzYpIE1vZGVJbmRleCA9IE1vZGVJbmRleF83Njh4NTc2W0RlcHRoXTsKIAkJfQogICAgICAgICAgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgODAwOgogCSAgICAgaWYoVkRpc3BsYXkgPT0gNjAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDYwMFtEZXB0aF07CiAJICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDQ4MCkgewotCSAgICAgICAgaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpKSB7CisJCWlmKCEoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjc1MFApKSkgewogCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDQ4MFtEZXB0aF07CiAJCX0KIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgOTYwOgogCSAgICAgaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA2MDApIHsKKwkJaWYoVkRpc3BsYXkgPT0gNjAwKSB7CiAJCSAgIGlmKChWQkZsYWdzICYgVFZfSElWSVNJT04pIHx8ICgoVkJGbGFncyAmIFRWX1lQQlBSKSAmJiAoVkJGbGFncyAmIFRWX1lQQlBSMTA4MEkpKSkgewogCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfOTYweDYwMFtEZXB0aF07CiAJCSAgIH0KQEAgLTEwMDksMjUgKzgxOSwyOCBAQAogCSAgICAgYnJlYWs7CiAJY2FzZSAxMDI0OgogCSAgICAgaWYoVkRpc3BsYXkgPT0gNzY4KSB7Ci0JCWlmKFZCRmxhZ3MgJiAoVkJfMzAxQnxWQl8zMDFDfFZCXzMwMkJ8VkJfMzAxTFZ8VkJfMzAyTFZ8VkJfMzAyRUxWKSkgeworCQlpZihWQkZsYWdzMiAmIFZCMl8zMHhCTFYpIHsKIAkJICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEwMjR4NzY4W0RlcHRoXTsKIAkJfQogCSAgICAgfSBlbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgewotCSAgICAgICAgaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpKSB7CisJCWlmKCAoVkJGbGFncyAmIFRWX0hJVklTSU9OKSB8fAorCQkgICAgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgVFZfWVBCUFIxMDgwSSkpIHx8CisJCSAgICAoKFZCRmxhZ3MyICYgVkIyXzMweEJMVikgJiYKKwkJICAgICAoKCEoVkJGbGFncyAmIChUVl9ZUEJQUiB8IFRWX1BBTE0pKSkgJiYgKFZCRmxhZ3MgJiBUVl9QQUwpKSkgKSB7CiAJCSAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDU3NltEZXB0aF07CiAJCX0KIAkgICAgIH0KIAkgICAgIGJyZWFrOwogCWNhc2UgMTI4MDoKIAkgICAgIGlmKFZEaXNwbGF5ID09IDcyMCkgewotCSAgICAgICAgaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwKKwkJaWYoKFZCRmxhZ3MgJiBUVl9ISVZJU0lPTikgfHwKIAkJICAgKChWQkZsYWdzICYgVFZfWVBCUFIpICYmIChWQkZsYWdzICYgKFRWX1lQQlBSMTA4MEkgfCBUVl9ZUEJQUjc1MFApKSkpIHsKLQkgICAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDcyMFtEZXB0aF07CisJCSAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDcyMFtEZXB0aF07CiAJCX0KIAkgICAgIH0gZWxzZSBpZihWRGlzcGxheSA9PSAxMDI0KSB7Ci0JICAgICAgICBpZigoVkJGbGFncyAmIFRWX0hJVklTSU9OKSB8fAorCQlpZigoVkJGbGFncyAmIFRWX0hJVklTSU9OKSB8fAogCQkgICAoKFZCRmxhZ3MgJiBUVl9ZUEJQUikgJiYgKFZCRmxhZ3MgJiBUVl9ZUEJQUjEwODBJKSkpIHsKLQkgICAgICAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDEwMjRbRGVwdGhdOworCQkgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHgxMDI0W0RlcHRoXTsKIAkJfQogCSAgICAgfQogCSAgICAgYnJlYWs7CkBAIC0xMDM2LDk5ICs4NDksMzEgQEAKICAgIHJldHVybiBNb2RlSW5kZXg7CiB9CiAKLVVTSE9SVAotU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgpCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoLAorCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MyKQogewotICAgVVNIT1JUIE1vZGVJbmRleCA9IDA7CisgICBpZighKFZCRmxhZ3MyICYgVkIyX1NJU1ZHQTJCUklER0UpKSByZXR1cm4gMDsKIAotICAgaWYoIShWQkZsYWdzICYgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQikpKSByZXR1cm4gMDsKKyAgIGlmKEhEaXNwbGF5ID49IDE5MjApIHJldHVybiAwOwogCiAgICBzd2l0Y2goSERpc3BsYXkpCiAgICB7Ci0JY2FzZSAzMjA6Ci0gICAgIAkgIAlpZihWRGlzcGxheSA9PSAyMDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzMyMHgyMDBbRGVwdGhdOwotCSAgCWVsc2UgaWYoVkRpc3BsYXkgPT0gMjQwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzIweDI0MFtEZXB0aF07Ci0gICAgICAgICAgCWJyZWFrOwotICAgICAJY2FzZSA0MDA6Ci0gICAgICAgICAgCWlmKFZEaXNwbGF5ID09IDMwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzQwMHgzMDBbRGVwdGhdOwotICAgICAgICAgIAlicmVhazsKLSAgCWNhc2UgNTEyOgotCQlpZihWRGlzcGxheSA9PSAzODQpIE1vZGVJbmRleCA9IE1vZGVJbmRleF81MTJ4Mzg0W0RlcHRoXTsKLQkJYnJlYWs7Ci0JY2FzZSA2NDA6Ci0JCWlmKFZEaXNwbGF5ID09IDQ4MCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQ4MFtEZXB0aF07Ci0JCWVsc2UgaWYoVkRpc3BsYXkgPT0gNDAwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNjQweDQwMFtEZXB0aF07Ci0JCWJyZWFrOwotCWNhc2UgNzIwOgotCQlpZihWRGlzcGxheSA9PSA0ODApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg0ODBbRGVwdGhdOwotCQllbHNlIGlmKFZEaXNwbGF5ID09IDU3NikgTW9kZUluZGV4ID0gTW9kZUluZGV4XzcyMHg1NzZbRGVwdGhdOwotCQlicmVhazsKLQljYXNlIDc2ODoKLSAgICAgICAgICAJaWYoVkRpc3BsYXkgPT0gNTc2KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfNzY4eDU3NltEZXB0aF07Ci0JICAJYnJlYWs7Ci0JY2FzZSA4MDA6Ci0JCWlmKFZEaXNwbGF5ID09IDYwMCkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODAweDYwMFtEZXB0aF07Ci0gICAJICAgICAgICBlbHNlIGlmKFZEaXNwbGF5ID09IDQ4MCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzgwMHg0ODBbRGVwdGhdOwotCQlicmVhazsKLQljYXNlIDg0ODoKLQkJaWYoVkRpc3BsYXkgPT0gNDgwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfODQ4eDQ4MFtEZXB0aF07Ci0JCWJyZWFrOwotCWNhc2UgODU2OgotCQlpZihWRGlzcGxheSA9PSA0ODApIE1vZGVJbmRleCA9IE1vZGVJbmRleF84NTZ4NDgwW0RlcHRoXTsKLQkJYnJlYWs7Ci0JY2FzZSA5NjA6Ci0JCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCQkgICBpZihWRGlzcGxheSA9PSA1NDApICAgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg1NDBbRGVwdGhdOwotCQkgICBlbHNlIGlmKFZEaXNwbGF5ID09IDYwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4Xzk2MHg2MDBbRGVwdGhdOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMTAyNDoKLQkJaWYoVkRpc3BsYXkgPT0gNzY4KSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMDI0eDc2OFtEZXB0aF07Ci0JCWVsc2UgaWYoVkRpc3BsYXkgPT0gNTc2KSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTAyNHg1NzZbRGVwdGhdOwotCQlicmVhazsKLQljYXNlIDExNTI6Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA4NjQpICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMTUyeDg2NFtEZXB0aF07Ci0JCWVsc2UgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCSAgIGlmKFZEaXNwbGF5ID09IDc2OCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzExNTJ4NzY4W0RlcHRoXTsKLQkJfQotCQlicmVhazsKLQljYXNlIDEyODA6Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA3NjgpIHsKLQkJICAgaWYoVkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCSAgICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8zMDBfMTI4MHg3NjhbRGVwdGhdOwotCQkgICB9IGVsc2UgewotCQkgICAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMzEwXzEyODB4NzY4W0RlcHRoXTsKLQkJICAgfQotCQl9IGVsc2UgaWYoVkRpc3BsYXkgPT0gMTAyNCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4MTAyNFtEZXB0aF07Ci0JCWVsc2UgaWYoVkRpc3BsYXkgPT0gNzIwKSAgICBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTI4MHg3MjBbRGVwdGhdOwotCQllbHNlIGlmKFZEaXNwbGF5ID09IDgwMCkgICAgTW9kZUluZGV4ID0gTW9kZUluZGV4XzEyODB4ODAwW0RlcHRoXTsKLQkJZWxzZSBpZihWRGlzcGxheSA9PSA5NjApICAgIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMjgweDk2MFtEZXB0aF07Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDEzNjA6Ci0JICAgICAgICBpZihWRGlzcGxheSA9PSA3NjgpIE1vZGVJbmRleCA9IE1vZGVJbmRleF8xMzYweDc2OFtEZXB0aF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQwMDoKLQkJaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICAgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTQwMHgxMDUwW0RlcHRoXTsKLQkJfQotCQlicmVhazsKIAljYXNlIDE2MDA6Ci0JCWlmKFZHQUVuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCQkgICBpZihWQkZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgewotCSAgICAgICAgICAgICAgaWYoVkRpc3BsYXkgPT0gMTIwMCkgTW9kZUluZGV4ID0gTW9kZUluZGV4XzE2MDB4MTIwMFtEZXB0aF07Ci0JCSAgIH0KKwkJaWYoVkRpc3BsYXkgPT0gMTIwMCkgeworCQkJaWYoVkdBRW5naW5lICE9IFNJU18zMTVfVkdBKSByZXR1cm4gMDsKKwkJCWlmKCEoVkJGbGFnczIgJiBWQjJfMzB4QikpIHJldHVybiAwOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMTY4MDoKLQkJaWYoVkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCSAgIGlmKFZCRmxhZ3MgJiAoVkJfMzAxQnxWQl8zMDFDfFZCXzMwMkIpKSB7Ci0JICAgICAgICAgICAgICBpZihWRGlzcGxheSA9PSAxMDUwKSBNb2RlSW5kZXggPSBNb2RlSW5kZXhfMTY4MHgxMDUwW0RlcHRoXTsKLQkJICAgfQorCQlpZihWRGlzcGxheSA9PSAxMDUwKSB7CisJCQlpZihWR0FFbmdpbmUgIT0gU0lTXzMxNV9WR0EpIHJldHVybiAwOworCQkJaWYoIShWQkZsYWdzMiAmIFZCMl8zMHhCKSkgcmV0dXJuIDA7CiAJCX0KIAkJYnJlYWs7CiAgICB9CiAKLSAgIHJldHVybiBNb2RlSW5kZXg7CisgICByZXR1cm4gU2lTX0dldE1vZGVJRChWR0FFbmdpbmUsIDAsIEhEaXNwbGF5LCBWRGlzcGxheSwgRGVwdGgsIEZBTFNFLCAwLCAwKTsKIH0KIAogCkBAIC0xMTM3LDgzICs4ODIsODMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLVNpU19TZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBpbmRleCwgVVNIT1JUIGRhdGEpCitTaVNfU2V0UmVnKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBpbmRleCwgdW5zaWduZWQgc2hvcnQgZGF0YSkKIHsKLSAgIE91dFBvcnRCeXRlKHBvcnQsaW5kZXgpOwotICAgT3V0UG9ydEJ5dGUocG9ydCArIDEsZGF0YSk7CisgICBPdXRQb3J0Qnl0ZShwb3J0LCBpbmRleCk7CisgICBPdXRQb3J0Qnl0ZShwb3J0ICsgMSwgZGF0YSk7CiB9CiAKIHZvaWQKLVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgZGF0YSkKK1NpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKQogewotICAgT3V0UG9ydEJ5dGUocG9ydCxkYXRhKTsKKyAgIE91dFBvcnRCeXRlKHBvcnQsIGRhdGEpOwogfQogCiB2b2lkCi1TaVNfU2V0UmVnU2hvcnQoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBkYXRhKQorU2lTX1NldFJlZ1Nob3J0KFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKQogewotICAgT3V0UG9ydFdvcmQocG9ydCxkYXRhKTsKKyAgIE91dFBvcnRXb3JkKHBvcnQsIGRhdGEpOwogfQogCiB2b2lkCi1TaVNfU2V0UmVnTG9uZyhTSVNJT0FERFJFU1MgcG9ydCwgVUxPTkcgZGF0YSkKK1NpU19TZXRSZWdMb25nKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKLSAgIE91dFBvcnRMb25nKHBvcnQsZGF0YSk7CisgICBPdXRQb3J0TG9uZyhwb3J0LCBkYXRhKTsKIH0KIAotVUNIQVIKLVNpU19HZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBpbmRleCkKK3Vuc2lnbmVkIGNoYXIKK1NpU19HZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIHVuc2lnbmVkIHNob3J0IGluZGV4KQogewotICAgT3V0UG9ydEJ5dGUocG9ydCxpbmRleCk7CisgICBPdXRQb3J0Qnl0ZShwb3J0LCBpbmRleCk7CiAgICByZXR1cm4oSW5Qb3J0Qnl0ZShwb3J0ICsgMSkpOwogfQogCi1VQ0hBUgordW5zaWduZWQgY2hhcgogU2lTX0dldFJlZ0J5dGUoU0lTSU9BRERSRVNTIHBvcnQpCiB7CiAgICByZXR1cm4oSW5Qb3J0Qnl0ZShwb3J0KSk7CiB9CiAKLVVTSE9SVAordW5zaWduZWQgc2hvcnQKIFNpU19HZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCkKIHsKICAgIHJldHVybihJblBvcnRXb3JkKHBvcnQpKTsKIH0KIAotVUxPTkcKK3Vuc2lnbmVkIGludAogU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTIHBvcnQpCiB7CiAgICByZXR1cm4oSW5Qb3J0TG9uZyhwb3J0KSk7CiB9CiAKIHZvaWQKLVNpU19TZXRSZWdBTkRPUihTSVNJT0FERFJFU1MgUG9ydCxVU0hPUlQgSW5kZXgsVVNIT1JUIERhdGFBTkQsVVNIT1JUIERhdGFPUikKK1NpU19TZXRSZWdBTkRPUihTSVNJT0FERFJFU1MgUG9ydCwgdW5zaWduZWQgc2hvcnQgSW5kZXgsIHVuc2lnbmVkIHNob3J0IERhdGFBTkQsIHVuc2lnbmVkIHNob3J0IERhdGFPUikKIHsKLSAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCi0gIHRlbXAgPSBTaVNfR2V0UmVnKFBvcnQsSW5kZXgpOwotICB0ZW1wID0gKHRlbXAgJiAoRGF0YUFORCkpIHwgRGF0YU9SOwotICBTaVNfU2V0UmVnKFBvcnQsSW5kZXgsdGVtcCk7CisgICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LCBJbmRleCk7CisgICB0ZW1wID0gKHRlbXAgJiAoRGF0YUFORCkpIHwgRGF0YU9SOworICAgU2lTX1NldFJlZyhQb3J0LCBJbmRleCwgdGVtcCk7CiB9CiAKIHZvaWQKLVNpU19TZXRSZWdBTkQoU0lTSU9BRERSRVNTIFBvcnQsVVNIT1JUIEluZGV4LFVTSE9SVCBEYXRhQU5EKQorU2lTX1NldFJlZ0FORChTSVNJT0FERFJFU1MgUG9ydCwgdW5zaWduZWQgc2hvcnQgSW5kZXgsIHVuc2lnbmVkIHNob3J0IERhdGFBTkQpCiB7Ci0gIFVTSE9SVCB0ZW1wOworICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAotICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LEluZGV4KTsKLSAgdGVtcCAmPSBEYXRhQU5EOwotICBTaVNfU2V0UmVnKFBvcnQsSW5kZXgsdGVtcCk7CisgICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LCBJbmRleCk7CisgICB0ZW1wICY9IERhdGFBTkQ7CisgICBTaVNfU2V0UmVnKFBvcnQsIEluZGV4LCB0ZW1wKTsKIH0KIAogdm9pZAotU2lTX1NldFJlZ09SKFNJU0lPQUREUkVTUyBQb3J0LFVTSE9SVCBJbmRleCxVU0hPUlQgRGF0YU9SKQorU2lTX1NldFJlZ09SKFNJU0lPQUREUkVTUyBQb3J0LCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgdW5zaWduZWQgc2hvcnQgRGF0YU9SKQogewotICBVU0hPUlQgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKLSAgdGVtcCA9IFNpU19HZXRSZWcoUG9ydCxJbmRleCk7Ci0gIHRlbXAgfD0gRGF0YU9SOwotICBTaVNfU2V0UmVnKFBvcnQsSW5kZXgsdGVtcCk7CisgICB0ZW1wID0gU2lTX0dldFJlZyhQb3J0LCBJbmRleCk7CisgICB0ZW1wIHw9IERhdGFPUjsKKyAgIFNpU19TZXRSZWcoUG9ydCwgSW5kZXgsIHRlbXApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIyMSwxMyArOTY2LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1TaVNfRGlzcGxheU9uKFNpU19Qcml2YXRlICpTaVNfUHIpCitTaVNfRGlzcGxheU9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDEsMHhERik7CiB9CiAKIHZvaWQKLVNpU19EaXNwbGF5T2ZmKFNpU19Qcml2YXRlICpTaVNfUHIpCitTaVNfRGlzcGxheU9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MDEsMHgyMCk7CiB9CkBAIC0xMjM4LDcgKzk4Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1TaVNSZWdJbml0KFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU0lPQUREUkVTUyBCYXNlQWRkcikKK1NpU1JlZ0luaXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU0lPQUREUkVTUyBCYXNlQWRkcikKIHsKICAgIFNpU19Qci0+U2lTX1AzYzQgPSBCYXNlQWRkciArIDB4MTQ7CiAgICBTaVNfUHItPlNpU19QM2Q0ID0gQmFzZUFkZHIgKyAweDI0OwpAQCAtMTI1MSwxNiArOTk2LDE3IEBACiAgICBTaVNfUHItPlNpU19QM2M4ID0gQmFzZUFkZHIgKyAweDE4OwogICAgU2lTX1ByLT5TaVNfUDNjOSA9IEJhc2VBZGRyICsgMHgxOTsKICAgIFNpU19Qci0+U2lTX1AzY2IgPSBCYXNlQWRkciArIDB4MWI7CisgICBTaVNfUHItPlNpU19QM2NjID0gQmFzZUFkZHIgKyAweDFjOwogICAgU2lTX1ByLT5TaVNfUDNjZCA9IEJhc2VBZGRyICsgMHgxZDsKICAgIFNpU19Qci0+U2lTX1AzZGEgPSBCYXNlQWRkciArIDB4MmE7Ci0gICBTaVNfUHItPlNpU19QYXJ0MVBvcnQgPSBCYXNlQWRkciArIFNJU19DUlQyX1BPUlRfMDQ7ICAgICAvKiBEaWdpdGFsIHZpZGVvIGludGVyZmFjZSByZWdpc3RlcnMgKExDRCkgKi8KLSAgIFNpU19Qci0+U2lTX1BhcnQyUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xMDsgICAgIC8qIDMwMSBUViBFbmNvZGVyIHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfUGFydDNQb3J0ID0gQmFzZUFkZHIgKyBTSVNfQ1JUMl9QT1JUXzEyOyAgICAgLyogMzAxIE1hY3JvdmlzaW9uIHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfUGFydDRQb3J0ID0gQmFzZUFkZHIgKyBTSVNfQ1JUMl9QT1JUXzE0OyAgICAgLyogMzAxIFZHQTIgKGFuZCBMQ0QpIHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfUGFydDVQb3J0ID0gQmFzZUFkZHIgKyBTSVNfQ1JUMl9QT1JUXzE0ICsgMjsgLyogMzAxIHBhbGV0dGUgYWRkcmVzcyBwb3J0IHJlZ2lzdGVycyAqLwotICAgU2lTX1ByLT5TaVNfRERDX1BvcnQgPSBCYXNlQWRkciArIDB4MTQ7ICAgICAgICAgICAgICAgICAgLyogRERDIFBvcnQgKCA9IFAzQzQsIFNSMTEvMEEpICovCi0gICBTaVNfUHItPlNpU19WaWRDYXB0ID0gQmFzZUFkZHIgKyBTSVNfVklERU9fQ0FQVFVSRTsKLSAgIFNpU19Qci0+U2lTX1ZpZFBsYXkgPSBCYXNlQWRkciArIFNJU19WSURFT19QTEFZQkFDSzsKKyAgIFNpU19Qci0+U2lTX1BhcnQxUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8wNDsKKyAgIFNpU19Qci0+U2lTX1BhcnQyUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xMDsKKyAgIFNpU19Qci0+U2lTX1BhcnQzUG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xMjsKKyAgIFNpU19Qci0+U2lTX1BhcnQ0UG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xNDsKKyAgIFNpU19Qci0+U2lTX1BhcnQ1UG9ydCA9IEJhc2VBZGRyICsgU0lTX0NSVDJfUE9SVF8xNCArIDI7CisgICBTaVNfUHItPlNpU19ERENfUG9ydCAgPSBCYXNlQWRkciArIDB4MTQ7CisgICBTaVNfUHItPlNpU19WaWRDYXB0ICAgPSBCYXNlQWRkciArIFNJU19WSURFT19DQVBUVVJFOworICAgU2lTX1ByLT5TaVNfVmlkUGxheSAgID0gQmFzZUFkZHIgKyBTSVNfVklERU9fUExBWUJBQ0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjY4LDcgKzEwMTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19HZXRTeXNGbGFncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0dldFN5c0ZsYWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgdW5zaWduZWQgY2hhciBjcjVmLCB0ZW1wMSwgdGVtcDI7CiAKQEAgLTEyNzYsOSArMTAyMiw5IEBACiAgICAvKiAoU1IxMSBpcyB1c2VkIGZvciBEREMgYW5kIGluIGVuYWJsZS9kaXNhYmxlYnJpZGdlKSAqLwogICAgU2lTX1ByLT5TaVNfU2Vuc2libGVTUjExID0gRkFMU0U7CiAgICBTaVNfUHItPlNpU19NeUNSNjMgPSAweDYzOwotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMzMCkgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzMwKSB7CiAgICAgICBTaVNfUHItPlNpU19NeUNSNjMgPSAweDUzOwotICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAgICAgICAgICBTaVNfUHItPlNpU19TZW5zaWJsZVNSMTEgPSBUUlVFOwogICAgICAgfQogICAgfQpAQCAtMTI4Niw0MyArMTAzMiw1MiBAQAogICAgLyogWW91IHNob3VsZCB1c2UgdGhlIG1hY3Jvcywgbm90IHRoZXNlIGZsYWdzIGRpcmVjdGx5ICovCiAKICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzID0gMDsKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182NTApIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzY1MCkgewogICAgICAgY3I1ZiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDVmKSAmIDB4ZjA7CiAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1YywweDA3KTsKICAgICAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWMpICYgMHhmODsKICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4NWMsMHhmOCk7CiAgICAgICB0ZW1wMiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDVjKSAmIDB4Zjg7CiAgICAgICBpZigoIXRlbXAxKSB8fCAodGVtcDIpKSB7Ci0gICAgICAgICBzd2l0Y2goY3I1ZikgeworCSBzd2l0Y2goY3I1ZikgewogCSAgICBjYXNlIDB4ODA6CiAJICAgIGNhc2UgMHg5MDoKIAkgICAgY2FzZSAweGMwOgotCSAgICAgICBTaVNfUHItPlNpU19TeXNGbGFncyB8PSBTRl9Jc002NTA7ICBicmVhazsKKwkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUwOworCSAgICAgICBicmVhazsKIAkgICAgY2FzZSAweGEwOgogCSAgICBjYXNlIDB4YjA6CiAJICAgIGNhc2UgMHhlMDoKLQkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXM2NTE7ICAgYnJlYWs7CisJICAgICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzNjUxOworCSAgICAgICBicmVhazsKIAkgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHN3aXRjaChjcjVmKSB7CisJIHN3aXRjaChjcjVmKSB7CiAJICAgIGNhc2UgMHg5MDoKIAkgICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1YykgJiAweGY4OwogCSAgICAgICBzd2l0Y2godGVtcDEpIHsKLQkgICAgICAgICAgY2FzZSAweDAwOiBTaVNfUHItPlNpU19TeXNGbGFncyB8PSBTRl9Jc002NTI7IGJyZWFrOworCQkgIGNhc2UgMHgwMDogU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUyOyBicmVhazsKIAkJICBjYXNlIDB4NDA6IFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzTTY1MzsgYnJlYWs7CiAJCSAgZGVmYXVsdDogICBTaVNfUHItPlNpU19TeXNGbGFncyB8PSBTRl9Jc002NTA7IGJyZWFrOwogCSAgICAgICB9CiAJICAgICAgIGJyZWFrOwogCSAgICBjYXNlIDB4YjA6Ci0JICAgICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzNjUyOyAgYnJlYWs7CisJICAgICAgIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGX0lzNjUyOworCSAgICAgICBicmVhazsKIAkgICAgZGVmYXVsdDoKLQkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUwOyBicmVhazsKKwkgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfSXNNNjUwOworCSAgICAgICBicmVhazsKIAkgfQogICAgICAgfQogICAgfQotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc2MCkgewotICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OCk7Ci0gICAgICBpZih0ZW1wMSAmIDB4MzApIFNpU19Qci0+U2lTX1N5c0ZsYWdzIHw9IFNGXzc2MExGQjsKKworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNzYwICYmIFNpU19Qci0+Q2hpcFR5cGUgPD0gU0lTXzc2MSkgeworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzgpICYgMHgzMCkgeworICAgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfNzYwTEZCOworICAgICAgfQorICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzkpICYgMHhmMCkgeworICAgICAgICAgU2lTX1ByLT5TaVNfU3lzRmxhZ3MgfD0gU0ZfNzYwVU1BOworICAgICAgfQogICAgfQogfQogCkBAIC0xMzMxLDE4ICsxMDg2LDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTSW5pdFBDSWV0YyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTSW5pdFBDSWV0YyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIHN3aXRjaChId0luZm8tPmpDaGlwVHlwZSkgeworICAgc3dpdGNoKFNpU19Qci0+Q2hpcFR5cGUpIHsKKyNpZmRlZiBTSVMzMDAKICAgIGNhc2UgU0lTXzMwMDoKICAgIGNhc2UgU0lTXzU0MDoKICAgIGNhc2UgU0lTXzYzMDoKICAgIGNhc2UgU0lTXzczMDoKICAgICAgIC8qIFNldCAtIFBDSSBMSU5FQVIgQUREUkVTU0lORyBFTkFCTEUgKDB4ODApCi0gICAgICAgKiAgICAgLSBSRUxPQ0FURUQgVkdBIElPICAoMHgyMCkKLSAgICAgICAqICAgICAtIE1NSU8gRU5BQkxFICgweDEpCisgICAgICAgKiAgICAgLSBSRUxPQ0FURUQgVkdBIElPIEVOQUJMRUQgKDB4MjApCisgICAgICAgKiAgICAgLSBNTUlPIEVOQUJMRUQgKDB4MDEpCisgICAgICAgKiBMZWF2ZSBvdGhlciBiaXRzIHVudG91Y2hlZC4KICAgICAgICAqLwotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7CisgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDIwLDB4YTEpOwogICAgICAgLyogIC0gRW5hYmxlIDJEICgweDQwKQogICAgICAgICogIC0gRW5hYmxlIDNEICgweDAyKQogICAgICAgICogIC0gRW5hYmxlIDNEIFZlcnRleCBjb21tYW5kIGZldGNoICgweDEwKSA/CkBAIC0xMzUwLDYgKzExMDcsOCBAQAogICAgICAgICovCiAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4NUEpOwogICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSVMzMTVICiAgICBjYXNlIFNJU18zMTVIOgogICAgY2FzZSBTSVNfMzE1OgogICAgY2FzZSBTSVNfMzE1UFJPOgpAQCAtMTM2MiwyMSArMTEyMSwzMCBAQAogICAgY2FzZSBTSVNfNzYwOgogICAgY2FzZSBTSVNfNzYxOgogICAgY2FzZSBTSVNfMzQwOgotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7Ci0gICAgICAvKiAgLSBFbmFibGUgMkQgKDB4NDApCi0gICAgICAgKiAgLSBFbmFibGUgM0QgKDB4MDIpCisgICBjYXNlIFhHSV80MDoKKyAgICAgIC8qIFNlZSBhYm92ZSAqLworICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgyMCwweGExKTsKKyAgICAgIC8qICAtIEVuYWJsZSAzRCBHL0wgdHJhbnNmb3JtYXRpb24gZW5naW5lICgweDgwKQorICAgICAgICogIC0gRW5hYmxlIDJEICgweDQwKQogICAgICAgICogIC0gRW5hYmxlIDNEIHZlcnRleCBjb21tYW5kIGZldGNoICgweDEwKQogICAgICAgICogIC0gRW5hYmxlIDNEIGNvbW1hbmQgcGFyc2VyICgweDA4KQotICAgICAgICogIC0gRW5hYmxlIDNEIEcvTCB0cmFuc2Zvcm1hdGlvbiBlbmdpbmUgKDB4ODApCisgICAgICAgKiAgLSBFbmFibGUgM0QgKDB4MDIpCiAgICAgICAgKi8KICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MUUsMHhEQSk7CiAgICAgICBicmVhazsKKyAgIGNhc2UgWEdJXzIwOgogICAgY2FzZSBTSVNfNTUwOgotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7CisgICAgICAvKiBTZWUgYWJvdmUgKi8KKyAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MjAsMHhhMSk7CiAgICAgICAvKiBObyAzRCBlbmdpbmUgISAqLwogICAgICAgLyogIC0gRW5hYmxlIDJEICgweDQwKQorICAgICAgICogIC0gZGlzYWJsZSAzRAogICAgICAgICovCi0gICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4NDApOworICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDYwLDB4NDApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgIH0KIH0KIApAQCAtMTM4NCwzOCArMTE1Miw0MCBAQAogLyogICAgICAgICAgICAgSEVMUEVSOiBTZXRMVkRTZXRjICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1TaVNTZXRMVkRTZXRjKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorc3RhdGljCisjZW5kaWYKK3ZvaWQKK1NpU1NldExWRFNldGMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBVU0hPUlQgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKICAgIFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID0gMDsKICAgIFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTiA9IDA7CiAgICBTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID0gMDsKLSAgIFNpU19Qci0+U2lTX0lGX0RFRl9EU1ROID0gMDsKLSAgIFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROID0gMDsKICAgIFNpU19Qci0+U2lTX0lGX0RFRl9DT05FWCA9IDA7CiAKICAgIFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCA9IDA7CiAKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzIwKSByZXR1cm47CisKICAgIC8qIENoZWNrIGZvciBTaVMzMHggZmlyc3QgKi8KICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAwKTsKICAgIGlmKCh0ZW1wID09IDEpIHx8ICh0ZW1wID09IDIpKSByZXR1cm47CiAKLSAgIHN3aXRjaChId0luZm8tPmpDaGlwVHlwZSkgeworICAgc3dpdGNoKFNpU19Qci0+Q2hpcFR5cGUpIHsKICNpZmRlZiBTSVMzMDAKICAgIGNhc2UgU0lTXzU0MDoKICAgIGNhc2UgU0lTXzYzMDoKICAgIGNhc2UgU0lTXzczMDoKLSAgICAgIAl0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpOwotICAgICAgCXRlbXAgPSAodGVtcCAmIDB4MEUpID4+IDE7Ci0gICAgICAJaWYoKHRlbXAgPj0gMikgJiYgKHRlbXAgPD0gNSkpIAlTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9IDE7Ci0gICAgICAJaWYodGVtcCA9PSAzKSAgIAkJU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OID0gMTsKLSAgICAgIAlpZigodGVtcCA9PSA0KSB8fCAodGVtcCA9PSA1KSkgeworCXRlbXAgPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpICYgMHgwZSkgPj4gMTsKKwlpZigodGVtcCA+PSAyKSAmJiAodGVtcCA8PSA1KSkJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOworCWlmKHRlbXAgPT0gMykJCQlTaVNfUHItPlNpU19JRl9ERUZfVFJVTVBJT04gPSAxOworCWlmKCh0ZW1wID09IDQpIHx8ICh0ZW1wID09IDUpKSB7CiAJCS8qIFNhdmUgcG93ZXIgc3RhdHVzIChhbmQgZXJyb3IgY2hlY2spIC0gVU5VU0VEICovCiAJCVNpU19Qci0+U2lTX0JhY2t1cDcweHggPSBTaVNfR2V0Q0g3MDB4KFNpU19QciwgMHgwZSk7CiAJCVNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPSAxOwotICAgICAgICB9CisJfQogCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgU0lTMzE1SApAQCAtMTQyMywyNiArMTE5MywyNiBAQAogICAgY2FzZSBTSVNfNjUwOgogICAgY2FzZSBTSVNfNzQwOgogICAgY2FzZSBTSVNfMzMwOgotICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpOwotICAgICAgCXRlbXAgPSAodGVtcCAmIDB4MEUpID4+IDE7Ci0gICAgICAJaWYoKHRlbXAgPj0gMikgJiYgKHRlbXAgPD0gMykpIAlTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9IDE7Ci0gICAgICAJaWYodGVtcCA9PSAzKSAgCQkJU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9IDI7Ci0gICAgICAgIGJyZWFrOworCXRlbXAgPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpICYgMHgwZSkgPj4gMTsKKwlpZigodGVtcCA+PSAyKSAmJiAodGVtcCA8PSAzKSkJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOworCWlmKHRlbXAgPT0gMykJCQlTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID0gMjsKKwlicmVhazsKICAgIGNhc2UgU0lTXzY2MToKICAgIGNhc2UgU0lTXzc0MToKICAgIGNhc2UgU0lTXzY2MDoKICAgIGNhc2UgU0lTXzc2MDoKICAgIGNhc2UgU0lTXzc2MToKICAgIGNhc2UgU0lTXzM0MDoKLSAgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgIAl0ZW1wID0gKHRlbXAgJiAweGUwKSA+PiA1OwotICAgICAgCWlmKCh0ZW1wID49IDIpICYmICh0ZW1wIDw9IDMpKSAJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOwotICAgICAgCWlmKHRlbXAgPT0gMykgIAkJCVNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPSAyOwotCWlmKHRlbXAgPT0gNCkgIAkJCVNpU19Qci0+U2lTX0lGX0RFRl9DT05FWCA9IDE7ICAvKiBOb3QgeWV0IHN1cHBvcnRlZCAqLwotICAgICAgICBicmVhazsKKyAgIGNhc2UgWEdJXzIwOgorICAgY2FzZSBYR0lfNDA6CisJdGVtcCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCkgJiAweGUwKSA+PiA1OworCWlmKCh0ZW1wID49IDIpICYmICh0ZW1wIDw9IDMpKSAJU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPSAxOworCWlmKHRlbXAgPT0gMykJCQlTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID0gMjsKKwlpZih0ZW1wID09IDQpCQkJU2lTX1ByLT5TaVNfSUZfREVGX0NPTkVYID0gMTsgIC8qIE5vdCB5ZXQgc3VwcG9ydGVkICovCisJYnJlYWs7CiAjZW5kaWYKICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworCWJyZWFrOwogICAgfQogfQogCkBAIC0xNDUxLDM1ICsxMjIxLDU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1TaVNfU2V0RW5hYmxlRHN0bihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKQorU2lTX1NldEVuYWJsZURzdG4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpCiB7CiAgICBTaVNfUHItPlNpU19JRl9ERUZfRFNUTiA9IGVuYWJsZSA/IDEgOiAwOwogfQogCiB2b2lkCi1TaVNfU2V0RW5hYmxlRnN0bihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKQorU2lTX1NldEVuYWJsZUZzdG4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpCiB7CiAgICBTaVNfUHItPlNpU19JRl9ERUZfRlNUTiA9IGVuYWJsZSA/IDEgOiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICBIRUxQRVI6IEdldCBtb2RlZmxhZyAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZUZsYWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCit7CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIHJldHVybiBTaVNfUHItPkNNb2RlRmxhZzsKKyAgIH0gZWxzZSBpZihNb2RlTm8gPD0gMHgxMykgeworICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgIEhFTFBFUjogRGV0ZXJtaW5lIFJPTSB1c2FnZSAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIEJPT0xFQU4KLVNpU0RldGVybWluZVJPTUxheW91dDY2MShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTRGV0ZXJtaW5lUk9NTGF5b3V0NjYxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgVUNIQVIgICpST01BZGRyICA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgIFVTSE9SVCByb212ZXJzb2Zmcywgcm9tdm1haiA9IDEsIHJvbXZtaW4gPSAwOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IHJvbXZlcnNvZmZzLCByb212bWFqID0gMSwgcm9tdm1pbiA9IDA7CiAKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU183NjEpIHsKLSAgICAgIC8qIEkgdmVyeSBtdWNoIGFzc3VtZSA3NjEgYW5kIDM0MCB3aWxsIHVzZSBuZXcgbGF5b3V0ICovCisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgeworICAgICAgLyogWEdJIFJPTXMgZG9uJ3QgcXVhbGlmeSAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzc2MSkgeworICAgICAgLyogSSB2ZXJ5IG11Y2ggYXNzdW1lIDc2MSwgMzQwIGFuZCBuZXdlciB3aWxsIHVzZSBuZXcgbGF5b3V0ICovCiAgICAgICByZXR1cm4gVFJVRTsKLSAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAgICAgICBpZigoUk9NQWRkclsweDFhXSA9PSAnTicpICYmCi0gICAgICAgICAoUk9NQWRkclsweDFiXSA9PSAnZScpICYmCi0gICAgICAgICAoUk9NQWRkclsweDFjXSA9PSAndycpICYmCi0gICAgICAgICAoUk9NQWRkclsweDFkXSA9PSAnVicpKSB7CisJIChST01BZGRyWzB4MWJdID09ICdlJykgJiYKKwkgKFJPTUFkZHJbMHgxY10gPT0gJ3cnKSAmJgorCSAoUk9NQWRkclsweDFkXSA9PSAnVicpKSB7CiAJIHJldHVybiBUUlVFOwogICAgICAgfQogICAgICAgcm9tdmVyc29mZnMgPSBST01BZGRyWzB4MTZdIHwgKFJPTUFkZHJbMHgxN10gPDwgOCk7CkBAIC0xNDk0LDkgKzEyODQsOSBAQAogICAgICAgfQogICAgfSBlbHNlIGlmKElTX1NJUzY1MDc0MCkgewogICAgICAgaWYoKFJPTUFkZHJbMHgxYV0gPT0gJ04nKSAmJgotICAgICAgICAgKFJPTUFkZHJbMHgxYl0gPT0gJ2UnKSAmJgotICAgICAgICAgKFJPTUFkZHJbMHgxY10gPT0gJ3cnKSAmJgotICAgICAgICAgKFJPTUFkZHJbMHgxZF0gPT0gJ1YnKSkgeworCSAoUk9NQWRkclsweDFiXSA9PSAnZScpICYmCisJIChST01BZGRyWzB4MWNdID09ICd3JykgJiYKKwkgKFJPTUFkZHJbMHgxZF0gPT0gJ1YnKSkgewogCSByZXR1cm4gVFJVRTsKICAgICAgIH0KICAgIH0KQEAgLTE1MDQsNDUgKzEyOTQsNTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNpU0RldGVybWluZVJPTVVzYWdlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNEZXRlcm1pbmVST01Vc2FnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSICAqUk9NQWRkciAgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gICBVU0hPUlQgcm9tcHRyID0gMDsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyICA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCByb21wdHIgPSAwOwogCiAgICBTaVNfUHItPlNpU19Vc2VST00gPSBGQUxTRTsKICAgIFNpU19Qci0+U2lTX1JPTU5ldyA9IEZBTFNFOworICAgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ID0gMDsKIAotICAgaWYoKFJPTUFkZHIpICYmIChId0luZm8tPlVzZVJPTSkpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKLSAgICAgICAgIC8qIDMwMDogV2UgY2hlY2sgaWYgdGhlIGNvZGUgc3RhcnRzIGJlbG93IDB4MjIwIGJ5CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgcmV0dXJuOworCisgICBpZigoUk9NQWRkcikgJiYgKFNpU19Qci0+VXNlUk9NKSkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CisJIC8qIDMwMDogV2UgY2hlY2sgaWYgdGhlIGNvZGUgc3RhcnRzIGJlbG93IDB4MjIwIGJ5CiAJICAqIGNoZWNraW5nIHRoZSBqbXAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGJlZ2lubmluZwogCSAgKiBvZiB0aGUgQklPUyBpbWFnZS4KIAkgICovCiAJIGlmKChST01BZGRyWzNdID09IDB4ZTkpICYmICgoUk9NQWRkcls1XSA8PCA4KSB8IFJPTUFkZHJbNF0pID4gMHgyMWEpCiAJICAgIFNpU19Qci0+U2lTX1VzZVJPTSA9IFRSVUU7Ci0gICAgICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICAgICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCSAvKiBTb255J3MgVkFJTyBCSU9TIDEuMDkgZm9sbG93cyB0aGUgc3RhbmRhcmQsIHNvIHBlcmhhcHMKIAkgICogdGhlIG90aGVycyBkbyBhcyB3ZWxsCiAJICAqLwogCSBTaVNfUHItPlNpU19Vc2VST00gPSBUUlVFOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgIC8qIDMxNS8zMzAgc2VyaWVzIHN0aWNrIHRvIHRoZSBzdGFuZGFyZChzKSAqLworCSAvKiAzMTUvMzMwIHNlcmllcyBzdGljayB0byB0aGUgc3RhbmRhcmQocykgKi8KIAkgU2lTX1ByLT5TaVNfVXNlUk9NID0gVFJVRTsKLQkgaWYoKFNpU19Qci0+U2lTX1JPTU5ldyA9IFNpU0RldGVybWluZVJPTUxheW91dDY2MShTaVNfUHIsIEh3SW5mbykpKSB7CisJIGlmKChTaVNfUHItPlNpU19ST01OZXcgPSBTaVNEZXRlcm1pbmVST01MYXlvdXQ2NjEoU2lTX1ByKSkpIHsKIAkgICAgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ID0gMTQ7CisJICAgIFNpU19Qci0+U2lTX1BXRE9mZnNldCA9IDE3OwogCSAgICBTaVNfUHItPlNpUzY2MUxDRDJUYWJsZVNpemUgPSAzNjsKIAkgICAgLyogRmluZCBvdXQgYWJvdXQgTENEIGRhdGEgdGFibGUgZW50cnkgc2l6ZSAqLwogCSAgICBpZigocm9tcHRyID0gU0lTR0VUUk9NVygweDAxMDIpKSkgewogCSAgICAgICBpZihST01BZGRyW3JvbXB0ciArICgzMiAqIDE2KV0gPT0gMHhmZikKLQkgICAgICAgICAgU2lTX1ByLT5TaVM2NjFMQ0QyVGFibGVTaXplID0gMzI7CisJCSAgU2lTX1ByLT5TaVM2NjFMQ0QyVGFibGVTaXplID0gMzI7CiAJICAgICAgIGVsc2UgaWYoUk9NQWRkcltyb21wdHIgKyAoMzQgKiAxNildID09IDB4ZmYpCi0JICAgICAgICAgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM0OwotCSAgICAgICBlbHNlIGlmKFJPTUFkZHJbcm9tcHRyICsgKDM2ICogMTYpXSA9PSAweGZmKQkgICAvKiAwLjk0ICovCi0JICAgICAgICAgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM2OworCQkgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM0OworCSAgICAgICBlbHNlIGlmKFJPTUFkZHJbcm9tcHRyICsgKDM2ICogMTYpXSA9PSAweGZmKQkgICAvKiAwLjk0LCAyLjA1LjAwKyAqLworCQkgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM2OwogCSAgICAgICBlbHNlIGlmKCAoUk9NQWRkcltyb21wdHIgKyAoMzggKiAxNildID09IDB4ZmYpIHx8ICAgLyogMi4wMC4wMCAtIDIuMDIuMDAgKi8KLQkgICAgICAgCSAJKFJPTUFkZHJbMHg2Rl0gJiAweDAxKSApIHsJCSAgIC8qIDIuMDMuMDArICovCi0JCSAgU2lTX1ByLT5TaVM2NjFMQ0QyVGFibGVTaXplID0gMzg7CisJCSAJKFJPTUFkZHJbMHg2Rl0gJiAweDAxKSApIHsJCSAgIC8qIDIuMDMuMDAgLSA8Mi4wNS4wMCAqLworCQkgIFNpU19Qci0+U2lTNjYxTENEMlRhYmxlU2l6ZSA9IDM4OwkJICAgLyogVU1DIGRhdGEgbGF5b3V0IGFiYW5kb25lZCBhdCAyLjA1LjAwICovCiAJCSAgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ID0gMTY7CisJCSAgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ID0gMTk7CiAJICAgICAgIH0KIAkgICAgfQogCSB9CkBAIC0xNTU1LDkgKzEzNTAsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRTZWdSZWdMb3dlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdmFsdWUpCitTaVNfU2V0U2VnUmVnTG93ZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewotICAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgICB2YWx1ZSAmPSAweDAwZmY7CiAgICB0ZW1wID0gU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYikgJiAweGYwOwpAQCAtMTU2OSw5ICsxMzY0LDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZXRTZWdSZWdVcHBlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdmFsdWUpCitTaVNfU2V0U2VnUmVnVXBwZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewotICAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgICB2YWx1ZSAmPSAweDAwZmY7CiAgICB0ZW1wID0gU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYikgJiAweDBmOwpAQCAtMTU4MywyMiArMTM3OCwyMiBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldFNlZ21lbnRSZWcoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHZhbHVlKQorU2lTX1NldFNlZ21lbnRSZWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewogICAgU2lTX1NldFNlZ1JlZ0xvd2VyKFNpU19QciwgdmFsdWUpOwogICAgU2lTX1NldFNlZ1JlZ1VwcGVyKFNpU19QciwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1Jlc2V0U2VnbWVudFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX1Jlc2V0U2VnbWVudFJlZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIFNpU19TZXRTZWdtZW50UmVnKFNpU19QciwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0U2VnbWVudFJlZ092ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHZhbHVlKQorU2lTX1NldFNlZ21lbnRSZWdPdmVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKIHsKLSAgIFVTSE9SVCB0ZW1wID0gdmFsdWUgPj4gODsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAgPSB2YWx1ZSA+PiA4OwogCiAgICB0ZW1wICY9IDB4MDc7CiAgICB0ZW1wIHw9ICh0ZW1wIDw8IDQpOwpAQCAtMTYwNywxNSArMTQwMiwxNSBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1Jlc2V0U2VnbWVudFJlZ092ZXIoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19SZXNldFNlZ21lbnRSZWdPdmVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgU2lTX1NldFNlZ21lbnRSZWdPdmVyKFNpU19QciwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfUmVzZXRTZWdtZW50UmVnaXN0ZXJzKFNpU19Qcml2YXRlICpTaVNfUHIsUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19SZXNldFNlZ21lbnRSZWdpc3RlcnMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBpZigoSVNfU0lTNjV4KSB8fCAoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkpIHsKKyAgIGlmKChJU19TSVM2NXgpIHx8IChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpKSB7CiAgICAgICBTaVNfUmVzZXRTZWdtZW50UmVnKFNpU19Qcik7CiAgICAgICBTaVNfUmVzZXRTZWdtZW50UmVnT3ZlcihTaVNfUHIpOwogICAgfQpAQCAtMTYyNSw4OSArMTQyMCw4NiBAQAogLyogICAgICAgICAgICAgSEVMUEVSOiBHZXRWQlR5cGUgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1TaVNfR2V0VkJUeXBlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorc3RhdGljCisjZW5kaWYKK3ZvaWQKK1NpU19HZXRWQlR5cGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnPTAsIHJldj0wLCBub2xjZD0wLCBwNF8wZiwgcDRfMjUsIHA0XzI3OworICAgdW5zaWduZWQgc2hvcnQgZmxhZyA9IDAsIHJldiA9IDAsIG5vbGNkID0gMDsKKyAgIHVuc2lnbmVkIHNob3J0IHA0XzBmLCBwNF8yNSwgcDRfMjc7CiAKLSAgU2lTX1ByLT5TaVNfVkJUeXBlID0gMDsKKyAgIFNpU19Qci0+U2lTX1ZCVHlwZSA9IDA7CiAKLSAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTKSB8fCAoU2lTX1ByLT5TaVNfSUZfREVGX0NPTkVYKSkKLSAgICAgcmV0dXJuOworICAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTKSB8fCAoU2lTX1ByLT5TaVNfSUZfREVGX0NPTkVYKSkKKyAgICAgIHJldHVybjsKIAotICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwMCk7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkKKyAgICAgIHJldHVybjsKIAotICBpZihmbGFnID4gMykgcmV0dXJuOworICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDApOwogCi0gIHJldiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDEpOworICAgaWYoZmxhZyA+IDMpCisgICAgICByZXR1cm47CiAKLSAgaWYoZmxhZyA+PSAyKSB7Ci0gICAgIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMkI7Ci0gIH0gZWxzZSBpZihmbGFnID09IDEpIHsKLSAgICAgaWYocmV2ID49IDB4QzApIHsKLSAgICAgICAJU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQzsKLSAgICAgfSBlbHNlIGlmKHJldiA+PSAweEIwKSB7Ci0gICAgICAgCVNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMUI7Ci0JLyogQ2hlY2sgaWYgMzB4QiBESCB2ZXJzaW9uIChubyBMQ0Qgc3VwcG9ydCwgdXNlIFBhbmVsIExpbmsgaW5zdGVhZCkgKi8KLSAgICAJbm9sY2QgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIzKTsKLSAgICAgICAgaWYoIShub2xjZCAmIDB4MDIpKSBTaVNfUHItPlNpU19WQlR5cGUgfD0gVkJfTm9MQ0Q7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMTsKLSAgICAgfQotICB9Ci0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFCIHwgVkJfU0lTMzAxQyB8IFZCX1NJUzMwMkIpKSB7Ci0gICAgIGlmKHJldiA+PSAweEUwKSB7Ci0JZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzkpOwotCWlmKGZsYWcgPT0gMHhmZikgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAyTFY7Ci0JZWxzZSAJIAkgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQzsgIC8qIFZCX1NJUzMwMkVMVjsgKi8KLSAgICAgfSBlbHNlIGlmKHJldiA+PSAweEQwKSB7Ci0JU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxTFY7Ci0gICAgIH0KLSAgfQotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfMzAxQyB8IFZCXzMwMUxWIHwgVkJfMzAyTFYgfCBWQl8zMDJFTFYpKSB7Ci0gICAgIHA0XzBmID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwZik7Ci0gICAgIHA0XzI1ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNSk7Ci0gICAgIHA0XzI3ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNyk7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MGYsMHg3Zik7Ci0gICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNSwweDA4KTsKLSAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweGZkKTsKLSAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNikgJiAweDA4KSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZCVHlwZSB8PSBWQl9VTUM7Ci0gICAgIH0KLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNyxwNF8yNyk7Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUscDRfMjUpOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBmLHA0XzBmKTsKLSAgfQorICAgcmV2ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwMSk7CisKKyAgIGlmKGZsYWcgPj0gMikgeworICAgICAgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAyQjsKKyAgIH0gZWxzZSBpZihmbGFnID09IDEpIHsKKyAgICAgIGlmKHJldiA+PSAweEMwKSB7CisJIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMUM7CisgICAgICB9IGVsc2UgaWYocmV2ID49IDB4QjApIHsKKwkgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQjsKKwkgLyogQ2hlY2sgaWYgMzB4QiBESCB2ZXJzaW9uIChubyBMQ0Qgc3VwcG9ydCwgdXNlIFBhbmVsIExpbmsgaW5zdGVhZCkgKi8KKwkgbm9sY2QgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIzKTsKKwkgaWYoIShub2xjZCAmIDB4MDIpKSBTaVNfUHItPlNpU19WQlR5cGUgfD0gVkJfTm9MQ0Q7CisgICAgICB9IGVsc2UgeworCSBTaVNfUHItPlNpU19WQlR5cGUgPSBWQl9TSVMzMDE7CisgICAgICB9CisgICB9CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxQiB8IFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJCKSkgeworICAgICAgaWYocmV2ID49IDB4RTApIHsKKwkgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzkpOworCSBpZihmbGFnID09IDB4ZmYpIFNpU19Qci0+U2lTX1ZCVHlwZSA9IFZCX1NJUzMwMkxWOworCSBlbHNlIAkgCSAgU2lTX1ByLT5TaVNfVkJUeXBlID0gVkJfU0lTMzAxQzsgIC8qIFZCX1NJUzMwMkVMVjsgKi8KKyAgICAgIH0gZWxzZSBpZihyZXYgPj0gMHhEMCkgeworCSBTaVNfUHItPlNpU19WQlR5cGUgPSBWQl9TSVMzMDFMVjsKKyAgICAgIH0KKyAgIH0KKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAxTFYgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgIHA0XzBmID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwZik7CisgICAgICBwNF8yNSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUpOworICAgICAgcDRfMjcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3KTsKKyAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MGYsMHg3Zik7CisgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUsMHgwOCk7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3LDB4ZmQpOworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNikgJiAweDA4KSB7CisgICAgICAgICBTaVNfUHItPlNpU19WQlR5cGUgfD0gVkJfVU1DOworICAgICAgfQorICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNyxwNF8yNyk7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI1LHA0XzI1KTsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MGYscDRfMGYpOworICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgIEhFTFBFUjogQ2hlY2sgUkFNIHNpemUgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCiBzdGF0aWMgQk9PTEVBTgotU2lTX0NoZWNrTWVtb3J5U2l6ZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpCitTaVNfQ2hlY2tNZW1vcnlTaXplKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgQWRhcHRlck1lbVNpemUgPSBId0luZm8tPnVsVmlkZW9NZW1vcnlTaXplIC8gKDEwMjQqMTAyNCk7Ci0gIFVTSE9SVCBtZW1vcnlzaXplLG1vZGVmbGFnOworICAgdW5zaWduZWQgc2hvcnQgQWRhcHRlck1lbVNpemUgPSBTaVNfUHItPlZpZGVvTWVtb3J5U2l6ZSAvICgxMDI0KjEwMjQpOworICAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIHVuc2lnbmVkIHNob3J0IG1lbW9yeXNpemUgPSAoKG1vZGVmbGFnICYgTWVtb3J5SW5mb0ZsYWcpID4+IE1lbW9yeVNpemVTaGlmdCkgKyAxOwogCi0gIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOwotICB9IGVsc2UgewotICAgICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIH0KLSAgfQorICAgaWYoIUFkYXB0ZXJNZW1TaXplKSByZXR1cm4gVFJVRTsKIAotICBtZW1vcnlzaXplID0gbW9kZWZsYWcgJiBNZW1vcnlJbmZvRmxhZzsKLSAgbWVtb3J5c2l6ZSA+Pj0gTWVtb3J5U2l6ZVNoaWZ0OwkJLyogR2V0IHJlcXVpcmVkIG1lbW9yeSBzaXplICovCi0gIG1lbW9yeXNpemUrKzsKLQotICBpZihBZGFwdGVyTWVtU2l6ZSA8IG1lbW9yeXNpemUpIHJldHVybiBGQUxTRTsKLSAgcmV0dXJuIFRSVUU7CisgICBpZihBZGFwdGVyTWVtU2l6ZSA8IG1lbW9yeXNpemUpIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiAKQEAgLTE3MTYsNjMgKzE1MDgsNjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTSVMzMTVICi1zdGF0aWMgVUNIQVIKLVNpU19HZXQzMTBEUkFNVHlwZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorc3RhdGljIHVuc2lnbmVkIGNoYXIKK1NpU19HZXQzMTBEUkFNVHlwZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSIGRhdGEsIHRlbXA7CisgICB1bnNpZ25lZCBjaGFyIGRhdGE7CiAKICAgIGlmKCgqU2lTX1ByLT5wU2lTX1NvZnRTZXR0aW5nKSAmIFNvZnREUkFNVHlwZSkgewotICAgICBkYXRhID0gKCpTaVNfUHItPnBTaVNfU29mdFNldHRpbmcpICYgMHgwMzsKKyAgICAgIGRhdGEgPSAoKlNpU19Qci0+cFNpU19Tb2Z0U2V0dGluZykgJiAweDAzOwogICAgfSBlbHNlIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzM0MCkgewotICAgICAgICAvKiBUT0RPICovCi0JZGF0YSA9IDA7Ci0gICAgIH0gaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICAgICBkYXRhID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzgpICYgMHgwNzsKLQlpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLQkgICBkYXRhID0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OCkgJiAweGMwKSA+PiA2KTsKLQl9Ci0gICAgIH0gZWxzZSBpZihJU19TSVM1NTA2NTA3NDApIHsKLSAgICAgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4MDc7Ci0gICAgIH0gZWxzZSB7CS8qIDMxNSwgMzMwICovCi0gICAgICAgIGRhdGEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzYSkgJiAweDAzOwotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfMzMwKSB7Ci0JICAgaWYoZGF0YSA+IDEpIHsKLQkgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWYpICYgMHgzMDsKLQkgICAgICBzd2l0Y2godGVtcCkgewotCSAgICAgIGNhc2UgMHgwMDogZGF0YSA9IDE7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgxMDogZGF0YSA9IDM7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgyMDogZGF0YSA9IDM7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgzMDogZGF0YSA9IDI7IGJyZWFrOwotCSAgICAgIH0KLQkgICB9IGVsc2UgewotCSAgICAgIGRhdGEgPSAwOwotCSAgIH0KLQl9Ci0gICAgIH0KKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gWEdJXzIwKSB7CisgICAgICAgICAvKiBEbyBJIG5lZWQgdGhpcz8gU1IxNyBzZWVtcyB0byBiZSB6ZXJvIGFueXdheS4uLiAqLworCSBkYXRhID0gMDsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zNDApIHsKKwkgLyogVE9ETyAqLworCSBkYXRhID0gMDsKKyAgICAgIH0gaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisJIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgeworCSAgICBkYXRhID0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OCkgJiAweGMwKSA+PiA2KTsKKwkgfSBlbHNlIHsKKwkgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDc4KSAmIDB4MDc7CisJIH0KKyAgICAgIH0gZWxzZSBpZihJU19TSVM1NTA2NTA3NDApIHsKKwkgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4MDc7CisgICAgICB9IGVsc2UgewkvKiAzMTUsIDMzMCAqLworCSBkYXRhID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M2EpICYgMHgwMzsKKwkgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzMwKSB7CisJICAgIGlmKGRhdGEgPiAxKSB7CisJICAgICAgIHN3aXRjaChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1ZikgJiAweDMwKSB7CisJICAgICAgIGNhc2UgMHgwMDogZGF0YSA9IDE7IGJyZWFrOworCSAgICAgICBjYXNlIDB4MTA6IGRhdGEgPSAzOyBicmVhazsKKwkgICAgICAgY2FzZSAweDIwOiBkYXRhID0gMzsgYnJlYWs7CisJICAgICAgIGNhc2UgMHgzMDogZGF0YSA9IDI7IGJyZWFrOworCSAgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgIGRhdGEgPSAwOworCSAgICB9CisJIH0KKyAgICAgIH0KICAgIH0KIAogICAgcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19HZXRNQ0xLKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19HZXRNQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBpbmRleDsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IGluZGV4OwogCi0gIGluZGV4ID0gU2lTX0dldDMxMERSQU1UeXBlKFNpU19QciwgSHdJbmZvKTsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICBpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLSAgICAgICAgcmV0dXJuKChVU0hPUlQpKFNJU0dFVFJPTVcoKDB4OTAgKyAoaW5kZXggKiA1KSArIDMpKSkpOwotICAgICB9Ci0gICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSyk7Ci0gIH0gZWxzZSBpZihpbmRleCA+PSA0KSB7Ci0gICAgIGluZGV4IC09IDQ7Ci0gICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8xW2luZGV4XS5DTE9DSyk7Ci0gIH0gZWxzZSB7Ci0gICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSyk7Ci0gIH0KKyAgIGluZGV4ID0gU2lTX0dldDMxMERSQU1UeXBlKFNpU19Qcik7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgeworCSByZXR1cm4oKHVuc2lnbmVkIHNob3J0KShTSVNHRVRST01XKCgweDkwICsgKGluZGV4ICogNSkgKyAzKSkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybihTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSyk7CisgICB9IGVsc2UgaWYoaW5kZXggPj0gNCkgeworICAgICAgcmV0dXJuKFNpU19Qci0+U2lTX01DTEtEYXRhXzFbaW5kZXggLSA0XS5DTE9DSyk7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuKFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLKTsKKyAgIH0KIH0KICNlbmRpZgogCkBAIC0xNzgwLDMwICsxNTc0LDMwIEBACiAvKiAgICAgICAgICAgSEVMUEVSOiBDbGVhckJ1ZmZlciAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIExJTlVYX0tFUk5FTAorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKIHN0YXRpYyB2b2lkCi1TaVNfQ2xlYXJCdWZmZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIE1vZGVObykKK1NpU19DbGVhckJ1ZmZlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVQ0hBUiBTSVNJT01FTVRZUEUgKlZpZGVvTWVtb3J5QWRkcmVzcyA9IEh3SW5mby0+cGpWaWRlb01lbW9yeUFkZHJlc3M7Ci0gIFVMT05HICBBZGFwdGVyTWVtb3J5U2l6ZSA9IEh3SW5mby0+dWxWaWRlb01lbW9yeVNpemU7Ci0gIFVTSE9SVCBTSVNJT01FTVRZUEUgKnBCdWZmZXI7Ci0gIGludCBpOworICAgdW5zaWduZWQgY2hhciAgU0lTSU9NRU1UWVBFICptZW1hZGRyID0gU2lTX1ByLT5WaWRlb01lbW9yeUFkZHJlc3M7CisgICB1bnNpZ25lZCBpbnQgICBtZW1zaXplID0gU2lTX1ByLT5WaWRlb01lbW9yeVNpemU7CisgICB1bnNpZ25lZCBzaG9ydCBTSVNJT01FTVRZUEUgKnBCdWZmZXI7CisgICBpbnQgaTsKIAotICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+PSBNb2RlRUdBKSB7Ci0gICAgIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgU2lTX1NldE1lbW9yeShWaWRlb01lbW9yeUFkZHJlc3MsIEFkYXB0ZXJNZW1vcnlTaXplLCAwKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgcEJ1ZmZlciA9IChVU0hPUlQgU0lTSU9NRU1UWVBFICopVmlkZW9NZW1vcnlBZGRyZXNzOwotICAgICAgICBmb3IoaT0wOyBpPDB4NDAwMDsgaSsrKSB3cml0ZXcoMHgwMDAwLCAmcEJ1ZmZlcltpXSk7Ci0gICAgIH0KLSAgfSBlbHNlIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPCBNb2RlQ0dBKSB7Ci0gICAgICAgIHBCdWZmZXIgPSAoVVNIT1JUIFNJU0lPTUVNVFlQRSAqKVZpZGVvTWVtb3J5QWRkcmVzczsKLSAgICAgICAgZm9yKGk9MDsgaTwweDQwMDA7IGkrKykgd3JpdGV3KDB4MDcyMCwgJnBCdWZmZXJbaV0pOwotICAgICB9IGVsc2UgewotICAgICAgICBTaVNfU2V0TWVtb3J5KFZpZGVvTWVtb3J5QWRkcmVzcywgMHg4MDAwLCAwKTsKLSAgICAgfQotICB9CisgICBpZighbWVtYWRkciB8fCAhbWVtc2l6ZSkgcmV0dXJuOworCisgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+PSBNb2RlRUdBKSB7CisgICAgICBpZihNb2RlTm8gPiAweDEzKSB7CisJIFNpU19TZXRNZW1vcnkobWVtYWRkciwgbWVtc2l6ZSwgMCk7CisgICAgICB9IGVsc2UgeworCSBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IFNJU0lPTUVNVFlQRSAqKW1lbWFkZHI7CisJIGZvcihpID0gMDsgaSA8IDB4NDAwMDsgaSsrKSB3cml0ZXcoMHgwMDAwLCAmcEJ1ZmZlcltpXSk7CisgICAgICB9CisgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPCBNb2RlQ0dBKSB7CisgICAgICBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0IFNJU0lPTUVNVFlQRSAqKW1lbWFkZHI7CisgICAgICBmb3IoaSA9IDA7IGkgPCAweDQwMDA7IGkrKykgd3JpdGV3KDB4MDcyMCwgJnBCdWZmZXJbaV0pOworICAgfSBlbHNlIHsKKyAgICAgIFNpU19TZXRNZW1vcnkobWVtYWRkciwgMHg4MDAwLCAwKTsKKyAgIH0KIH0KICNlbmRpZgogCkBAIC0xODEyLDM1ICsxNjA2LDM2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBCT09MRUFOCi1TaVNfU2VhcmNoTW9kZUlEKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCAqTW9kZU5vLCBVU0hPUlQgKk1vZGVJZEluZGV4KQorU2lTX1NlYXJjaE1vZGVJRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgKk1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgKk1vZGVJZEluZGV4KQogewotICAgVUNIQVIgVkdBSU5GTyA9IFNpU19Qci0+U2lTX1ZHQUlORk87CisgICB1bnNpZ25lZCBjaGFyIFZHQUlORk8gPSBTaVNfUHItPlNpU19WR0FJTkZPOwogCi0gICBpZigqTW9kZU5vIDw9IDB4MTMpIHsKKyAgIGlmKCgqTW9kZU5vKSA8PSAweDEzKSB7CiAKICAgICAgIGlmKCgqTW9kZU5vKSA8PSAweDA1KSAoKk1vZGVObykgfD0gMHgwMTsKIAotICAgICAgZm9yKCpNb2RlSWRJbmRleCA9IDA7IDsoKk1vZGVJZEluZGV4KSsrKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbKk1vZGVJZEluZGV4XS5TdF9Nb2RlSUQgPT0gKCpNb2RlTm8pKSBicmVhazsKLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVsqTW9kZUlkSW5kZXhdLlN0X01vZGVJRCA9PSAweEZGKSAgIHJldHVybiBGQUxTRTsKKyAgICAgIGZvcigoKk1vZGVJZEluZGV4KSA9IDA7IDsoKk1vZGVJZEluZGV4KSsrKSB7CisJIGlmKFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVsoKk1vZGVJZEluZGV4KV0uU3RfTW9kZUlEID09ICgqTW9kZU5vKSkgYnJlYWs7CisJIGlmKFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVsoKk1vZGVJZEluZGV4KV0uU3RfTW9kZUlEID09IDB4RkYpIHJldHVybiBGQUxTRTsKICAgICAgIH0KIAotICAgICAgaWYoKk1vZGVObyA9PSAweDA3KSB7Ci0gICAgICAgICAgaWYoVkdBSU5GTyAmIDB4MTApICgqTW9kZUlkSW5kZXgpKys7ICAgLyogNDAwIGxpbmVzICovCi0gICAgICAgICAgLyogZWxzZSAzNTAgbGluZXMgKi8KKyAgICAgIGlmKCgqTW9kZU5vKSA9PSAweDA3KSB7CisJICBpZihWR0FJTkZPICYgMHgxMCkgKCpNb2RlSWRJbmRleCkrKzsgICAvKiA0MDAgbGluZXMgKi8KKwkgIC8qIGVsc2UgMzUwIGxpbmVzICovCiAgICAgICB9Ci0gICAgICBpZigqTW9kZU5vIDw9IDB4MDMpIHsKLSAgICAgICAgIGlmKCEoVkdBSU5GTyAmIDB4ODApKSAoKk1vZGVJZEluZGV4KSsrOwotICAgICAgICAgaWYoVkdBSU5GTyAmIDB4MTApICAgICgqTW9kZUlkSW5kZXgpKys7IC8qIDQwMCBsaW5lcyAgKi8KLSAgICAgICAgIC8qIGVsc2UgMzUwIGxpbmVzICAqLworICAgICAgaWYoKCpNb2RlTm8pIDw9IDB4MDMpIHsKKwkgaWYoIShWR0FJTkZPICYgMHg4MCkpICgqTW9kZUlkSW5kZXgpKys7CisJIGlmKFZHQUlORk8gJiAweDEwKSAgICAoKk1vZGVJZEluZGV4KSsrOyAvKiA0MDAgbGluZXMgICovCisJIC8qIGVsc2UgMzUwIGxpbmVzICAqLwogICAgICAgfQogICAgICAgLyogZWxzZSAyMDAgbGluZXMgICovCiAKICAgIH0gZWxzZSB7CiAKLSAgICAgIGZvcigqTW9kZUlkSW5kZXggPSAwOyA7KCpNb2RlSWRJbmRleCkrKykgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlWypNb2RlSWRJbmRleF0uRXh0X01vZGVJRCA9PSAoKk1vZGVObykpIGJyZWFrOwotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlWypNb2RlSWRJbmRleF0uRXh0X01vZGVJRCA9PSAweEZGKSAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGZvcigoKk1vZGVJZEluZGV4KSA9IDA7IDsoKk1vZGVJZEluZGV4KSsrKSB7CisJIGlmKFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVsoKk1vZGVJZEluZGV4KV0uRXh0X01vZGVJRCA9PSAoKk1vZGVObykpIGJyZWFrOworCSBpZihTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbKCpNb2RlSWRJbmRleCldLkV4dF9Nb2RlSUQgPT0gMHhGRikgcmV0dXJuIEZBTFNFOwogICAgICAgfQogCiAgICB9CkBAIC0xODUxLDEwICsxNjQ2LDEwIEBACiAvKiAgICAgICAgICAgIEhFTFBFUjogR2V0TW9kZVB0ciAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVUNIQVIKLVNpU19HZXRNb2RlUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TW9kZVB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgIFVDSEFSIGluZGV4OworICAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CiAKICAgIGlmKE1vZGVObyA8PSAweDEzKSB7CiAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfU3RUYWJsZUluZGV4OwpAQCAtMTg2Niw3OSArMTY2MSwxMjUgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgSEVMUEVSUzogR2V0IHNvbWUgaW5kaWNlcyAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldFJlZkNSVFZDTEsoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IEluZGV4LCBpbnQgVXNlV2lkZSkKK3sKKyAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfSW5mb0ZsYWcgJiBIYXZlV2lkZVRpbWluZykgeworICAgICAgaWYoVXNlV2lkZSA9PSAxKSB7CisgICAgICAgICByZXR1cm4gU2lTX1ByLT5TaVNfUmVmSW5kZXhbSW5kZXhdLkV4dF9DUlRWQ0xLX1dJREU7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfQ1JUVkNMS19OT1JNOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBTaVNfUHItPlNpU19SZWZJbmRleFtJbmRleF0uRXh0X0NSVFZDTEs7CisgICB9Cit9CisKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0UmVmQ1JUMUNSVEMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IEluZGV4LCBpbnQgVXNlV2lkZSkKK3sKKyAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfSW5mb0ZsYWcgJiBIYXZlV2lkZVRpbWluZykgeworICAgICAgaWYoVXNlV2lkZSA9PSAxKSB7CisgICAgICAgICByZXR1cm4gU2lTX1ByLT5TaVNfUmVmSW5kZXhbSW5kZXhdLkV4dF9DUlQxQ1JUQ19XSURFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHJldHVybiBTaVNfUHItPlNpU19SZWZJbmRleFtJbmRleF0uRXh0X0NSVDFDUlRDX05PUk07CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFNpU19Qci0+U2lTX1JlZkluZGV4W0luZGV4XS5FeHRfQ1JUMUNSVEM7CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgSEVMUEVSOiBMb3dNb2RlVGVzdHMgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIEJPT0xFQU4KLVNpU19Eb0xvd01vZGVUZXN0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfRG9Mb3dNb2RlVGVzdChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICAgIFVTSE9SVCB0ZW1wLHRlbXAxLHRlbXAyOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgdGVtcDEsIHRlbXAyOwogCi0gICAgaWYoKE1vZGVObyAhPSAweDAzKSAmJiAoTW9kZU5vICE9IDB4MTApICYmIChNb2RlTm8gIT0gMHgxMikpCi0gICAgICAgcmV0dXJuKFRSVUUpOwotICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxMSk7Ci0gICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDgwKTsKLSAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwKTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCwweDU1KTsKLSAgICB0ZW1wMiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwKTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCx0ZW1wMSk7Ci0gICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTEsdGVtcCk7Ci0gICAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB8fAotICAgICAgIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfMzAwKSkgewotICAgICAgIGlmKHRlbXAyID09IDB4NTUpIHJldHVybihGQUxTRSk7Ci0gICAgICAgZWxzZSByZXR1cm4oVFJVRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZih0ZW1wMiAhPSAweDU1KSByZXR1cm4oVFJVRSk7Ci0gICAgICAgZWxzZSB7Ci0gICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHgzNSwweDAxKTsKLSAgICAgICAgICByZXR1cm4oRkFMU0UpOwotICAgICAgIH0KLSAgICB9CisgICBpZigoTW9kZU5vICE9IDB4MDMpICYmIChNb2RlTm8gIT0gMHgxMCkgJiYgKE1vZGVObyAhPSAweDEyKSkKKyAgICAgIHJldHVybiBUUlVFOworICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDExKTsKKyAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MTEsMHg4MCk7CisgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwKTsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwLDB4NTUpOworICAgdGVtcDIgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwMCx0ZW1wMSk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxMSx0ZW1wKTsKKyAgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB8fAorICAgICAgKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMwMCkpIHsKKyAgICAgIGlmKHRlbXAyID09IDB4NTUpIHJldHVybiBGQUxTRTsKKyAgICAgIGVsc2UgcmV0dXJuIFRSVUU7CisgICB9IGVsc2UgeworICAgICAgaWYodGVtcDIgIT0gMHg1NSkgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlIHsKKwkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHgzNSwweDAxKTsKKwkgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgfQogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldExvd01vZGVUZXN0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0TG93TW9kZVRlc3Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgICBpZihTaVNfRG9Mb3dNb2RlVGVzdChTaVNfUHIsIE1vZGVObywgSHdJbmZvKSkgewotICAgICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gTG93TW9kZVRlc3RzOwotICAgIH0KKyAgIGlmKFNpU19Eb0xvd01vZGVUZXN0KFNpU19QciwgTW9kZU5vKSkgeworICAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBMb3dNb2RlVGVzdHM7CisgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEhFTFBFUjogRU5BQkxFIENSVDEgICAgICAgICAgICAqLworLyogICAgICAgIEhFTFBFUjogT1BFTi9DTE9TRSBDUlQxIENSVEMgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0dXBDUjV4KFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfT3BlbkNSVEMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICAgaWYoSVNfU0lTNjUwKSB7Ci0gICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0JICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDFmKTsKLQkgIGlmKElTX1NJUzY1MSkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDIwKTsKLQkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDU2LDB4ZTcpOwotICAgICAgIH0KLSAgICB9IGVsc2UgaWYoSVNfU0lTNjYxNzQxNjYwNzYwKSB7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NjEsMHhmNyk7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgxZik7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTYsMHhlNyk7Ci0gICAgICAgaWYoIVNpU19Qci0+U2lTX1JPTU5ldykgewotCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4M2EsMHhlZik7Ci0gICAgICAgfQotICAgIH0KKyAgIGlmKElTX1NJUzY1MCkgeworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgxZik7CisgICAgICBpZihJU19TSVM2NTEpIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgyMCk7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1NiwweGU3KTsKKyAgIH0gZWxzZSBpZihJU19TSVM2NjE3NDE2NjA3NjApIHsKKyAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDYxLDB4ZjcpOworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgxZik7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHg1NiwweGU3KTsKKyAgICAgIGlmKCFTaVNfUHItPlNpU19ST01OZXcpIHsKKwkgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4M2EsMHhlZik7CisgICAgICB9CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfSGFuZGxlQ1JUMShTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX0Nsb3NlQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgLyogRW5hYmxlIENSVDEgZ2F0aW5nICovCi0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCxTaVNfUHItPlNpU19NeUNSNjMsMHhiZik7CisjaWYgMCAvKiBUaGlzIGxvY2tzIHNvbWUgQ1JUQyByZWdpc3RlcnMuIFdlIGRvbid0IHdhbnQgdGhhdC4gKi8KKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAxID0gMCwgdGVtcDIgPSAwOworCisgICBpZihJU19TSVM2NjE3NDE2NjA3NjApIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKKyAgICAgICAgIHRlbXAxID0gMHhhMDsgdGVtcDIgPSAweDA4OworICAgICAgfQorICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDFmLHRlbXAxKTsKKyAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4NTYsMHhlNyx0ZW1wMik7CisgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK1NpU19IYW5kbGVDUlQxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQoreworICAgLyogRW5hYmxlIENSVDEgZ2F0aW5nICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsU2lTX1ByLT5TaVNfTXlDUjYzLDB4YmYpOwogI2lmIDAKLSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNSkgJiAweDAxKSkgewotICAgICBpZigoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTUpICYgMHgwYSkgfHwKLSAgICAgICAgKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KSAmIDB4MDEpKSB7Ci0gICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LFNpU19Qci0+U2lTX015Q1I2MywweDQwKTsKLSAgICAgfQotICB9CisgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE1KSAmIDB4MDEpKSB7CisgICAgICBpZigoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTUpICYgMHgwYSkgfHwKKyAgICAgICAgIChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDAxKSkgeworICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsU2lTX1ByLT5TaVNfTXlDUjYzLDB4NDApOworICAgICAgfQorICAgfQogI2VuZGlmCiB9CiAKQEAgLTE5NDYsNTcgKzE3ODcsNTQgQEAKIC8qICAgICAgICAgICBIRUxQRVI6IEdldENvbG9yRGVwdGggICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1VU0hPUlQKLVNpU19HZXRDb2xvckRlcHRoKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0Q29sb3JEZXB0aChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVVNIT1JUIENvbG9yRGVwdGhbNl0gPSB7IDEsIDIsIDQsIDQsIDYsIDh9OwotICBTSE9SVCAgaW5kZXg7Ci0gIFVTSE9SVCBtb2RlZmxhZzsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBDb2xvckRlcHRoWzZdID0geyAxLCAyLCA0LCA0LCA2LCA4IH07CisgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZzsKKyAgIHNob3J0IGluZGV4OwogCi0gIC8qIERvIE5PVCBjaGVjayBVc2VDdXN0b21Nb2RlLCB3aWxsIHNrcmV3IHVwIEZJRk8gKi8KLSAgaWYoTW9kZU5vID09IDB4ZmUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgaWYoTW9kZU5vIDw9IDB4MTMpCi0gICAgCW1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLSAgICAgZWxzZQotICAgIAltb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwotICB9CisgICAvKiBEbyBOT1QgY2hlY2sgVXNlQ3VzdG9tTW9kZSwgd2lsbCBza3JldyB1cCBGSUZPICovCisgICBpZihNb2RlTm8gPT0gMHhmZSkgeworICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKKyAgIH0gZWxzZSBpZihNb2RlTm8gPD0gMHgxMykgeworICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOworICAgfSBlbHNlIHsKKyAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CisgICB9CiAKLSAgaW5kZXggPSAobW9kZWZsYWcgJiBNb2RlVHlwZU1hc2spIC0gTW9kZUVHQTsKLSAgaWYoaW5kZXggPCAwKSBpbmRleCA9IDA7Ci0gIHJldHVybihDb2xvckRlcHRoW2luZGV4XSk7CisgICBpbmRleCA9IChtb2RlZmxhZyAmIE1vZGVUeXBlTWFzaykgLSBNb2RlRUdBOworICAgaWYoaW5kZXggPCAwKSBpbmRleCA9IDA7CisgICByZXR1cm4gQ29sb3JEZXB0aFtpbmRleF07CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICBIRUxQRVI6IEdldE9mZnNldCAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVVNIT1JUCi1TaVNfR2V0T2Zmc2V0KFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFNJU19IV19JTkZPIEh3SW5mbykKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0T2Zmc2V0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewotICBVU0hPUlQgeHJlcywgdGVtcCwgY29sb3JkZXB0aCwgaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCB4cmVzLCB0ZW1wLCBjb2xvcmRlcHRoLCBpbmZvZmxhZzsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPkNJbmZvRmxhZzsKLSAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OwotICB9IGVsc2UgewotICAgICBpbmZvZmxhZyA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0luZm9GbGFnOwotICAgICB4cmVzID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5YUmVzOwotICB9CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5DSW5mb0ZsYWc7CisgICAgICB4cmVzID0gU2lTX1ByLT5DSERpc3BsYXk7CisgICB9IGVsc2UgeworICAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfSW5mb0ZsYWc7CisgICAgICB4cmVzID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uWFJlczsKKyAgIH0KIAotICBjb2xvcmRlcHRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICBjb2xvcmRlcHRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICB0ZW1wID0geHJlcyAvIDE2OwotICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIHRlbXAgPDw9IDE7Ci0gIHRlbXAgKj0gY29sb3JkZXB0aDsKLSAgaWYoeHJlcyAlIDE2KSB7Ci0gICAgIGNvbG9yZGVwdGggPj49IDE7Ci0gICAgIHRlbXAgKz0gY29sb3JkZXB0aDsKLSAgfQorICAgdGVtcCA9IHhyZXMgLyAxNjsKKyAgIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgdGVtcCA8PD0gMTsKKyAgIHRlbXAgKj0gY29sb3JkZXB0aDsKKyAgIGlmKHhyZXMgJSAxNikgdGVtcCArPSAoY29sb3JkZXB0aCA+PiAxKTsKIAotICByZXR1cm4odGVtcCk7CisgICByZXR1cm4gdGVtcDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIwMDQsNTUgKzE4NDIsMjkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0U2VxUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldFNlcVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCkKIHsKLSAgIFVDSEFSIFNSZGF0YTsKLSAgIFVTSE9SVCBpOworICAgdW5zaWduZWQgY2hhciBTUmRhdGE7CisgICBpbnQgaTsKIAotICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDAsMHgwMyk7ICAgICAgICAgICAJLyogU2V0IFNSMCAgKi8KKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDAwLDB4MDMpOwogCi0gICBTUmRhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uU1JbMF07CisgICAvKiBvciAiZGlzcGxheSBvZmYiICAqLworICAgU1JkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLlNSWzBdIHwgMHgyMDsKIAotICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgICAgICBTUmRhdGEgfD0gMHgwMTsKLSAgICAgIH0KLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9UVikpIHsKLQkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgICAgIFNSZGF0YSB8PSAweDAxOyAgICAgICAgICAJCS8qIDggZG90IGNsb2NrICAqLwotICAgICAgICAgICAgfQotCSB9Ci0gICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewotCSAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICAgICAgICAgU1JkYXRhIHw9IDB4MDE7ICAgICAgICAgIAkJLyogOCBkb3QgY2xvY2sgICovCi0gICAgICAgICAgICB9Ci0JIH0KLSAgICAgIH0KKyAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRvIGZvcmNlIHg4IGRvdGNsb2NrICovCisgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHx8IChTaVNfUHItPlNpU19JRl9ERUZfTFZEUykpIHsKKworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb1RWKSkgeworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICAgIFNSZGF0YSB8PSAweDAxOworICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIFNSZGF0YSB8PSAweDAxOworCiAgICB9CiAKLSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7Ci0gICAgICAgICAgICAgICBTUmRhdGEgfD0gMHgwMTsgICAgICAgIAkJCS8qIDggZG90IGNsb2NrICAqLwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICAgICAgU1JkYXRhIHw9IDB4MDE7ICAgICAgICAgIAkJCS8qIDggZG90IGNsb2NrICAqLwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICBTUmRhdGEgfD0gMHgyMDsgICAgICAgICAgICAgICAgCQkJLyogc2NyZWVuIG9mZiAgKi8KLQogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDEsU1JkYXRhKTsKIAogICAgZm9yKGkgPSAyOyBpIDw9IDQ7IGkrKykgewotICAgICAgU1JkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLlNSW2ktMV07CisgICAgICBTUmRhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uU1JbaSAtIDFdOwogICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGksU1JkYXRhKTsKICAgIH0KIH0KQEAgLTIwNjIsMTcgKzE4NzQsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0TWlzY1JlZ3MoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRNaXNjUmVncyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4KQogewotICAgVUNIQVIgTWlzY2RhdGE7CisgICB1bnNpZ25lZCBjaGFyIE1pc2NkYXRhOwogCiAgICBNaXNjZGF0YSA9IFNpU19Qci0+U2lTX1N0YW5kVGFibGVbU3RhbmRUYWJsZUluZGV4XS5NSVNDOwogCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKLSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgewotICAgICAgICAgICAgTWlzY2RhdGEgfD0gMHgwQzsKLSAgICAgICAgIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSB7CisgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgeworCSAgIE1pc2NkYXRhIHw9IDB4MEM7CisJIH0KICAgICAgIH0KICAgIH0KIApAQCAtMjA4NCwzMyArMTg5NiwzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlRDUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgIFVTSE9SVCBTdGFuZFRhYmxlSW5kZXgpCitTaVNfU2V0Q1JUQ1JlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCkKIHsKLSAgVUNIQVIgQ1JUQ2RhdGE7Ci0gIFVTSE9SVCBpOworICAgdW5zaWduZWQgY2hhciAgQ1JUQ2RhdGE7CisgICB1bnNpZ25lZCBzaG9ydCBpOwogCi0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDExLDB4N2YpOyAgICAgICAgICAgICAgICAgICAgICAgLyogVW5sb2NrIENSVEMgKi8KKyAgIC8qIFVubG9jayBDUlRDICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDdmKTsKIAotICBmb3IoaSA9IDA7IGkgPD0gMHgxODsgaSsrKSB7Ci0gICAgIENSVENkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLkNSVENbaV07Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxpLENSVENkYXRhKTsgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgQ1JUQygzZDQpICovCi0gIH0KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICBTaVNfU2V0dXBDUjV4KFNpU19QciwgSHdJbmZvKTsKLSAgICAgZm9yKGkgPSAweDEzOyBpIDw9IDB4MTQ7IGkrKykgewotICAgICAgICBDUlRDZGF0YSA9IFNpU19Qci0+U2lTX1N0YW5kVGFibGVbU3RhbmRUYWJsZUluZGV4XS5DUlRDW2ldOwotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSxDUlRDZGF0YSk7Ci0gICAgIH0KLSAgfSBlbHNlIGlmKCAoIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAotICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApICkgICYmCi0gICAgICAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIHsgICAgICAgCSAgIC8qIGZvciA2MzBTMCAqLwotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvVFYpKSB7Ci0gICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDE4LDB4RkUpOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQorICAgZm9yKGkgPSAwOyBpIDw9IDB4MTg7IGkrKykgeworICAgICAgQ1JUQ2RhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uQ1JUQ1tpXTsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxpLENSVENkYXRhKTsKKyAgIH0KKworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgICAgICBTaVNfT3BlbkNSVEMoU2lTX1ByKTsKKyAgICAgIGZvcihpID0gMHgxMzsgaSA8PSAweDE0OyBpKyspIHsKKwkgQ1JUQ2RhdGEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW1N0YW5kVGFibGVJbmRleF0uQ1JUQ1tpXTsKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGksQ1JUQ2RhdGEpOworICAgICAgfQorICAgfSBlbHNlIGlmKCAoIChTaVNfUHItPkNoaXBUeXBlID09IFNJU182MzApIHx8CisJICAgICAgICAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSApICAmJgorCSAgICAgIChTaVNfUHItPkNoaXBSZXZpc2lvbiA+PSAweDMwKSApIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9UVikpIHsKKwkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTgsMHhGRSk7CisJIH0KKyAgICAgIH0KKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxMTgsNjQgKzE5MzEsNTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0QVRUUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRBVFRSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgpCiB7Ci0gICBVQ0hBUiBBUmRhdGE7Ci0gICBVU0hPUlQgaTsKKyAgIHVuc2lnbmVkIGNoYXIgIEFSZGF0YTsKKyAgIHVuc2lnbmVkIHNob3J0IGk7CiAKICAgIGZvcihpID0gMDsgaSA8PSAweDEzOyBpKyspIHsKICAgICAgIEFSZGF0YSA9IFNpU19Qci0+U2lTX1N0YW5kVGFibGVbU3RhbmRUYWJsZUluZGV4XS5BVFRSW2ldOwotI2lmIDAKLSAgICAgIGlmKChpIDw9IDB4MGYpIHx8IChpID09IDB4MTEpKSB7Ci0gICAgICAgICBpZihkczo0ODkgJiAweDA4KSB7Ci0JICAgIGNvbnRpbnVlOwotICAgICAgICAgfQotICAgICAgfQotI2VuZGlmCisKICAgICAgIGlmKGkgPT0gMHgxMykgewotICAgICAgICAgLyogUGl4ZWwgc2hpZnQuIElmIHNjcmVlbiBvbiBMQ0Qgb3IgVFYgaXMgc2hpZnRlZCBsZWZ0IG9yIHJpZ2h0LAotICAgICAgICAgICogdGhpcyBtaWdodCBiZSB0aGUgY2F1c2UuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgIEFSZGF0YT0wOwotICAgICAgICAgfQotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewotICAgICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIEFSZGF0YT0wOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotCSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisJIC8qIFBpeGVsIHNoaWZ0LiBJZiBzY3JlZW4gb24gTENEIG9yIFRWIGlzIHNoaWZ0ZWQgbGVmdCBvciByaWdodCwKKwkgICogdGhpcyBtaWdodCBiZSB0aGUgY2F1c2UuCisJICAqLworCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgQVJkYXRhID0gMDsKKwkgfQorCSBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7CisJICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworCQkgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSBBUmRhdGEgPSAwOworCSAgICAgICB9CisJICAgIH0KKwkgfQorCSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKIAkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvTENEKSkgewotCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgQVJkYXRhPTA7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSBBUmRhdGEgPSAwOwogCSAgICB9CiAJIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKLSAgICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAkgICAgICAgaWYoSVNfU0lTNTUwNjUwNzQwNjYwKSB7Ci0JICAgICAgICAgIC8qIDMxNSwgMzMwIGRvbid0IGRvIHRoaXMgKi8KLQkgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQjMwMkIpIHsKLQkgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIEFSZGF0YT0wOwotCSAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICBBUmRhdGEgPSAwOwotCSAgICAgICAgICB9CisJCSAgLyogMzE1LCAzMzAgZG9uJ3QgZG8gdGhpcyAqLworCQkgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEIpIHsKKwkJICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgQVJkYXRhID0gMDsKKwkJICB9IGVsc2UgeworCQkgICAgIEFSZGF0YSA9IDA7CisJCSAgfQogCSAgICAgICB9CiAJICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgIEFSZGF0YT0wOworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgQVJkYXRhID0gMDsKIAkgICAgfQotICAgICAgICAgfQorCSB9CiAgICAgICB9Ci0gICAgICBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgM2RhICAqLwotICAgICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjMCxpKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBpbmRleCAgKi8KLSAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsQVJkYXRhKTsgICAgICAgICAgICAgICAgICAvKiBzZXQgZGF0YSAgICovCisgICAgICBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsJCS8qIHJlc2V0IDNkYSAgKi8KKyAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsaSk7CS8qIHNldCBpbmRleCAgKi8KKyAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsQVJkYXRhKTsJLyogc2V0IGRhdGEgICAqLwogICAgfQotICAgU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IDNkYSAgKi8KLSAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsMHgxNCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgaW5kZXggICovCi0gICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MwLDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRhdGEgICAqLworCisgICBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsJCS8qIHJlc2V0IDNkYSAgKi8KKyAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsMHgxNCk7CS8qIHNldCBpbmRleCAgKi8KKyAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzAsMHgwMCk7CS8qIHNldCBkYXRhICAgKi8KIAogICAgU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSk7Ci0gICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MwLDB4MjApOwkJCS8qIEVuYWJsZSBBdHRyaWJ1dGUgICovCisgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MwLDB4MjApOwkvKiBFbmFibGUgQXR0cmlidXRlICAqLwogICAgU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSk7CiB9CiAKQEAgLTIxODQsMTAgKzE5OTEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0R1JDUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4KQorU2lTX1NldEdSQ1JlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCkKIHsKLSAgIFVDSEFSIEdSZGF0YTsKLSAgIFVTSE9SVCBpOworICAgdW5zaWduZWQgY2hhciAgR1JkYXRhOworICAgdW5zaWduZWQgc2hvcnQgaTsKIAogICAgZm9yKGkgPSAwOyBpIDw9IDB4MDg7IGkrKykgewogICAgICAgR1JkYXRhID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtTdGFuZFRhYmxlSW5kZXhdLkdSQ1tpXTsKQEAgLTIyMDUsMjIgKzIwMTIsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfQ2xlYXJFeHQxUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vKQorU2lTX0NsZWFyRXh0MVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgVVNIT1JUIGk7CisgICB1bnNpZ25lZCBzaG9ydCBpOwogCi0gIGZvcihpID0gMHgwQTsgaSA8PSAweDBFOyBpKyspIHsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGksMHgwMCk7Ci0gIH0KKyAgIGZvcihpID0gMHgwQTsgaSA8PSAweDBFOyBpKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxpLDB4MDApOworICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDM3LDB4RkUpOwotICAgICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgICBpZihNb2RlTm8gPT0gMHgwNiB8fCBNb2RlTm8gPj0gMHgwZSkgewotCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBlLDB4MjApOwotCX0KLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzNywweEZFKTsKKyAgICAgIGlmKE1vZGVObyA8PSAweDEzKSB7CisJIGlmKE1vZGVObyA9PSAweDA2IHx8IE1vZGVObyA+PSAweDBlKSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBlLDB4MjApOworCSB9CisgICAgICB9CisgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjI4LDMyICsyMDM1LDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1Jlc2V0Q1JUMVZDTEsoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19SZXNldENSVDFWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMCkgcmV0dXJuOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU182NjEpIHsKKwkgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMCkgcmV0dXJuOwogICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAwKSAmJgotICAgICAgICAgKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgKSB7CisJICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikpICkgewogCSByZXR1cm47CiAgICAgICB9CiAgICB9CiAKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4Q0YsMHgyMCk7Ci0gICB9IGVsc2UgewotICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzEsMHgyMCk7Ci0gICB9CisgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4Y2YsMHgyMCk7CiAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyQixTaVNfUHItPlNpU19WQ0xLRGF0YVsxXS5TUjJCKTsKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJDLFNpU19Qci0+U2lTX1ZDTEtEYXRhWzFdLlNSMkMpOwogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkQsMHg4MCk7Ci0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweGNmLDB4MTApOwotICAgfSBlbHNlIHsKLSAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4MTApOwotICAgfQorICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweGNmLDB4MTApOwogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkIsU2lTX1ByLT5TaVNfVkNMS0RhdGFbMF0uU1IyQik7CiAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyQyxTaVNfUHItPlNpU19WQ0xLRGF0YVswXS5TUjJDKTsKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJELDB4ODApOwpAQCAtMjI2NCwxOSArMjA2MywxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQxU3luYyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENSVDFTeW5jKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewotICBVU0hPUlQgc3luYzsKKyAgIHVuc2lnbmVkIHNob3J0IHN5bmM7CiAKLSAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIHN5bmMgPSBTaVNfUHItPkNJbmZvRmxhZyA+PiA4OwotICB9IGVsc2UgewotICAgICBzeW5jID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWcgPj4gODsKLSAgfQorICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgICBzeW5jID0gU2lTX1ByLT5DSW5mb0ZsYWcgPj4gODsKKyAgIH0gZWxzZSB7CisgICAgICBzeW5jID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnID4+IDg7CisgICB9CiAKLSAgc3luYyAmPSAweEMwOwotICBzeW5jIHw9IDB4MmY7Ci0gIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzIsc3luYyk7CisgICBzeW5jICY9IDB4QzA7CisgICBzeW5jIHw9IDB4MmY7CisgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2MyLHN5bmMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjI4NCw3MiArMjA4Myw2NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQxQ1JUQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQxQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUlJUSSkKIHsKLSAgVUNIQVIgIGluZGV4OwotICBVU0hPUlQgdGVtcCxpLGosbW9kZWZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpLCBqLCBtb2RlZmxhZzsKKyAgIHVuc2lnbmVkIGNoYXIgICpjcnQxZGF0YSA9IE5VTEw7CiAKLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4MTEsMHg3Zik7CQkvKiB1bmxvY2sgY3IwLTcgKi8KKyAgIG1vZGVmbGFnID0gU2lTX0dldE1vZGVGbGFnKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAKLSAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKIAotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOworICAgICAgY3J0MWRhdGEgPSAmU2lTX1ByLT5DQ1JUMUNSVENbMF07CiAKLSAgICAgZm9yKGk9MCxqPTA7aTw9NztpKyssaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLFNpU19Qci0+Q0NSVDFDUlRDW2ldKTsKLSAgICAgfQotICAgICBmb3Ioaj0weDEwO2k8PTEwO2krKyxqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGosU2lTX1ByLT5DQ1JUMUNSVENbaV0pOwotICAgICB9Ci0gICAgIGZvcihqPTB4MTU7aTw9MTI7aSsrLGorKykgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaixTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7Ci0gICAgIH0KLSAgICAgZm9yKGo9MHgwQTtpPD0xNTtpKyssaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxqLFNpU19Qci0+Q0NSVDFDUlRDW2ldKTsKLSAgICAgfQorICAgfSBlbHNlIHsKIAotICAgICB0ZW1wID0gU2lTX1ByLT5DQ1JUMUNSVENbMTZdICYgMHhFMDsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MEUsdGVtcCk7CisgICAgICB0ZW1wID0gU2lTX0dldFJlZkNSVDFDUlRDKFNpU19QciwgUlJUSSwgU2lTX1ByLT5TaVNfVXNlV2lkZSk7CiAKLSAgICAgdGVtcCA9IChTaVNfUHItPkNDUlQxQ1JUQ1sxNl0gJiAweDAxKSA8PCA1OwotICAgICBpZihtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKSB0ZW1wIHw9IDB4ODA7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDksMHg1Rix0ZW1wKTsKKyAgICAgIC8qIEFsdGVybmF0ZSBmb3IgMTYwMHgxMjAwIExDREEgKi8KKyAgICAgIGlmKCh0ZW1wID09IDB4MjApICYmIChTaVNfUHItPkFsdGVybmF0ZTE2MDB4MTIwMCkpIHRlbXAgPSAweDU3OwogCi0gIH0gZWxzZSB7CisgICAgICBjcnQxZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopJlNpU19Qci0+U2lTX0NSVDFUYWJsZVt0ZW1wXS5DUlswXTsKIAotICAgICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIH0KKyAgIH0KIAotICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDFDUlRDOworICAgLyogdW5sb2NrIGNyMC03ICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDdmKTsKIAotICAgICBmb3IoaT0wLGo9MDtpPD03O2krKyxqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGosU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUltpXSk7Ci0gICAgIH0KLSAgICAgZm9yKGo9MHgxMDtpPD0xMDtpKyssaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbaV0pOwotICAgICB9Ci0gICAgIGZvcihqPTB4MTU7aTw9MTI7aSsrLGorKykgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaixTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSW2ldKTsKLSAgICAgfQotICAgICBmb3Ioaj0weDBBO2k8PTE1O2krKyxqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGosU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUltpXSk7Ci0gICAgIH0KKyAgIGZvcihpID0gMCwgaiA9IDA7IGkgPD0gNzsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KKyAgIGZvcihqID0gMHgxMDsgaSA8PSAxMDsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KKyAgIGZvcihqID0gMHgxNTsgaSA8PSAxMjsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KKyAgIGZvcihqID0gMHgwQTsgaSA8PSAxNTsgaSsrLCBqKyspIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxqLGNydDFkYXRhW2ldKTsKKyAgIH0KIAotICAgICB0ZW1wID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxNl0gJiAweEUwOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwRSx0ZW1wKTsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBFLGNydDFkYXRhWzE2XSAmIDB4RTApOwogCi0gICAgIHRlbXAgPSAoKFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTZdKSAmIDB4MDEpIDw8IDU7Ci0gICAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpICB0ZW1wIHw9IDB4ODA7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDksMHg1Rix0ZW1wKTsKKyAgIHRlbXAgPSAoY3J0MWRhdGFbMTZdICYgMHgwMSkgPDwgNTsKKyAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXAgfD0gMHg4MDsKKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDksMHg1Rix0ZW1wKTsKIAotICB9CisgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDE0LDB4NEYpOworICAgfQogCi0gIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID4gTW9kZVZHQSkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTQsMHg0Rik7CisjaWZkZWYgU0lTMzE1SAorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfMjApIHsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDA0LGNydDFkYXRhWzRdIC0gMSk7CisgICAgICBpZighKHRlbXAgPSBjcnQxZGF0YVs1XSAmIDB4MWYpKSB7CisgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgwYywweGZiKTsKKyAgICAgIH0KKyAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MDUsMHhlMCwoKHRlbXAgLSAxKSAmIDB4MWYpKTsKKyAgICAgIHRlbXAgPSAoY3J0MWRhdGFbMTZdID4+IDUpICsgMzsKKyAgICAgIGlmKHRlbXAgPiA3KSB0ZW1wIC09IDc7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBlLDB4MWYsKHRlbXAgPDwgNSkpOworICAgfQorI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzU5LDMzICsyMTUzLDMyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFPZmZzZXQoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDFPZmZzZXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpCiB7Ci0gICBVU0hPUlQgdGVtcCwgRGlzcGxheVVuaXQsIGluZm9mbGFnOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgRGlzcGxheVVuaXQsIGluZm9mbGFnOwogCiAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5DSW5mb0ZsYWc7CiAgICB9IGVsc2UgewotICAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZzsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnOwogICAgfQogCi0gICBEaXNwbGF5VW5pdCA9IFNpU19HZXRPZmZzZXQoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7CisgICBEaXNwbGF5VW5pdCA9IFNpU19HZXRPZmZzZXQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKIAogICAgdGVtcCA9IChEaXNwbGF5VW5pdCA+PiA4KSAmIDB4MGY7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBFLDB4RjAsdGVtcCk7CiAKLSAgIHRlbXAgPSBEaXNwbGF5VW5pdCAmIDB4RkY7Ci0gICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxMyx0ZW1wKTsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDEzLERpc3BsYXlVbml0ICYgMHhGRik7CiAKICAgIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgRGlzcGxheVVuaXQgPj49IDE7CiAKICAgIERpc3BsYXlVbml0IDw8PSA1OwotICAgdGVtcCA9IChEaXNwbGF5VW5pdCAmIDB4ZmYwMCkgPj4gODsKKyAgIHRlbXAgPSAoRGlzcGxheVVuaXQgPj4gOCkgKyAxOwogICAgaWYoRGlzcGxheVVuaXQgJiAweGZmKSB0ZW1wKys7Ci0gICB0ZW1wKys7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkgeworICAgICAgaWYoTW9kZU5vID09IDB4NGEgfHwgTW9kZU5vID09IDB4NDkpIHRlbXAtLTsKKyAgIH0KICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEwLHRlbXApOwogfQogCkBAIC0yMzk0LDM5ICsyMTg3LDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFWQ0xLKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENSVDFWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewotICBVU0hPUlQgIGluZGV4PTAsIGNsa2EsIGNsa2I7CisgICB1bnNpZ25lZCBzaG9ydCBpbmRleCA9IDAsIGNsa2EsIGNsa2I7CiAKLSAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIGNsa2EgPSBTaVNfUHItPkNTUjJCOwotICAgICBjbGtiID0gU2lTX1ByLT5DU1IyQzsKLSAgfSBlbHNlIHsKLSAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7Ci0gICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBjbGthID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtpbmRleF0uUGFydDRfQTsKLQljbGtiID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtpbmRleF0uUGFydDRfQjsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xrYSA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5TUjJCOwotCWNsa2IgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uU1IyQzsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIGNsa2EgPSBTaVNfUHItPkNTUjJCOworICAgICAgY2xrYiA9IFNpU19Qci0+Q1NSMkM7CisgICB9IGVsc2UgeworICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKKyAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpICYmCisJIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworCSAvKiBBbHRlcm5hdGUgZm9yIDE2MDB4MTIwMCBMQ0RBICovCisJIGlmKChpbmRleCA9PSAweDIxKSAmJiAoU2lTX1ByLT5BbHRlcm5hdGUxNjAweDEyMDApKSBpbmRleCA9IDB4NzI7CisJIGNsa2EgPSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2luZGV4XS5QYXJ0NF9BOworCSBjbGtiID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtpbmRleF0uUGFydDRfQjsKKyAgICAgIH0gZWxzZSB7CisJIGNsa2EgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uU1IyQjsKKwkgY2xrYiA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5TUjJDOworICAgICAgfQorICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4Q0YpOwotICB9IGVsc2UgewotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweDAwKTsKLSAgfQorICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MzEsMHhDRik7CiAKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkIsY2xrYSk7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJDLGNsa2IpOworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MmIsY2xrYSk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyYyxjbGtiKTsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyRCwweDAxKTsKLSAgfSBlbHNlIHsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MkQsMHg4MCk7Ci0gIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyNpZmRlZiBTSVMzMTVICisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyRCwweDAxKTsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzIwKSB7CisgICAgICAgICB1bnNpZ25lZCBzaG9ydCBtZiA9IFNpU19HZXRNb2RlRmxhZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOworCSBpZihtZiAmIEhhbGZEQ0xLKSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJiLFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJiKSk7CisJICAgIGNsa2IgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyYyk7CisJICAgIGNsa2IgPSAoKChjbGtiICYgMHgxZikgPDwgMSkgKyAxKSB8IChjbGtiICYgMHhlMCk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJjLGNsa2IpOworCSB9CisgICAgICB9CisjZW5kaWYKKyAgIH0gZWxzZSB7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyRCwweDgwKTsKKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MzQsNDE1ICsyMjM3LDM1OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIFNJUzMwMAotc3RhdGljIFVTSE9SVAotU2lTX0RvQ2FsY0RlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNQ0xLLCBVU0hPUlQgVkNMSywgVVNIT1JUIGNvbG9yZGVwdGgsIFVTSE9SVCBrZXkpCit2b2lkCitTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCAqaWR4MSwKKwkJdW5zaWduZWQgc2hvcnQgKmlkeDIpCiB7Ci0gIGNvbnN0IFVDSEFSIFRoTG93QVtdICAgPSB7IDYxLCAzLDUyLCA1LDY4LCA3LDEwMCwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsIDMsNDIsIDUsNTQsIDcsIDc4LDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwgMywzNywgNSw0NywgNywgNjcsMTEgfTsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAxLCB0ZW1wMjsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFRoVGltaW5nWzhdID0geworCQkxLCAyLCAyLCAzLCAwLCAxLCAxLCAyCisgICB9OwogCi0gIGNvbnN0IFVDSEFSIFRoTG93QltdICAgPSB7IDgxLCA0LDcyLCA2LDg4LCA4LDEyMCwxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUsIDQsNTQsIDYsNjYsIDgsIDkwLDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MiwgNCw0NSwgNiw1NSwgOCwgNzUsMTIgfTsKLQotICBjb25zdCBVQ0hBUiBUaFRpbWluZ1tdID0geyAgMSwgMiwgMiwgMywgMCwgMSwgIDEsIDIgfTsKLQotICBVU0hPUlQgdGVtcGFoLCB0ZW1wYWwsIHRlbXBjbCwgdGVtcGJ4LCB0ZW1wOwotICBVTE9ORyAgbG9uZ3RlbXA7Ci0KLSAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTgpOwotICB0ZW1wYWggJj0gMHg2MjsKLSAgdGVtcGFoID4+PSAxOwotICB0ZW1wYWwgPSB0ZW1wYWg7Ci0gIHRlbXBhaCA+Pj0gMzsKLSAgdGVtcGFsIHw9IHRlbXBhaDsKLSAgdGVtcGFsICY9IDB4MDc7Ci0gIHRlbXBjbCA9IFRoVGltaW5nW3RlbXBhbF07Ci0gIHRlbXBieCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KTsKLSAgdGVtcGJ4ID4+PSA2OwotICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNCk7Ci0gIHRlbXBhaCA+Pj0gNDsKLSAgdGVtcGFoICY9IDB4MGM7Ci0gIHRlbXBieCB8PSB0ZW1wYWg7Ci0gIHRlbXBieCA8PD0gMTsKLSAgaWYoa2V5ID09IDApIHsKLSAgICAgdGVtcGFsID0gVGhMb3dBW3RlbXBieCArIDFdOwotICAgICB0ZW1wYWwgKj0gdGVtcGNsOwotICAgICB0ZW1wYWwgKz0gVGhMb3dBW3RlbXBieF07Ci0gIH0gZWxzZSB7Ci0gICAgIHRlbXBhbCA9IFRoTG93Qlt0ZW1wYnggKyAxXTsKLSAgICAgdGVtcGFsICo9IHRlbXBjbDsKLSAgICAgdGVtcGFsICs9IFRoTG93Qlt0ZW1wYnhdOwotICB9Ci0gIGxvbmd0ZW1wID0gdGVtcGFsICogVkNMSyAqIGNvbG9yZGVwdGg7Ci0gIHRlbXAgPSBsb25ndGVtcCAlIChNQ0xLICogMTYpOwotICBsb25ndGVtcCAvPSAoTUNMSyAqIDE2KTsKLSAgaWYodGVtcCkgbG9uZ3RlbXArKzsKLSAgcmV0dXJuKChVU0hPUlQpbG9uZ3RlbXApOworICAgdGVtcDEgPSB0ZW1wMiA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxOCkgJiAweDYyKSA+PiAxOworICAgKCppZHgyKSA9ICh1bnNpZ25lZCBzaG9ydCkoVGhUaW1pbmdbKCh0ZW1wMiA+PiAzKSB8IHRlbXAxKSAmIDB4MDddKTsKKyAgICgqaWR4MSkgPSAodW5zaWduZWQgc2hvcnQpKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KSA+PiA2KSAmIDB4MDM7CisgICAoKmlkeDEpIHw9ICh1bnNpZ25lZCBzaG9ydCkoKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNCkgPj4gNCkgJiAweDBjKSk7CisgICAoKmlkeDEpIDw8PSAxOwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfQ2FsY0RlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBWQ0xLLCBVU0hPUlQgY29sb3JkZXB0aCwgVVNIT1JUIE1DTEspCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19HZXRGSUZPVGhyZXNob2xkQTMwMCh1bnNpZ25lZCBzaG9ydCBpZHgxLCB1bnNpZ25lZCBzaG9ydCBpZHgyKQogewotICBVU0hPUlQgdGVtcGF4LCB0ZW1wYng7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUaExvd0FbOCAqIDNdID0geworCQk2MSwgMyw1MiwgNSw2OCwgNywxMDAsMTEsCisJCTQzLCAzLDQyLCA1LDU0LCA3LCA3OCwxMSwKKwkJMzQsIDMsMzcsIDUsNDcsIDcsIDY3LDExCisgICB9OwogCi0gIHRlbXBieCA9IFNpU19Eb0NhbGNEZWxheShTaVNfUHIsIE1DTEssIFZDTEssIGNvbG9yZGVwdGgsIDApOwotICB0ZW1wYXggPSBTaVNfRG9DYWxjRGVsYXkoU2lTX1ByLCBNQ0xLLCBWQ0xLLCBjb2xvcmRlcHRoLCAxKTsKLSAgaWYodGVtcGF4IDwgNCkgdGVtcGF4ID0gNDsKLSAgdGVtcGF4IC09IDQ7Ci0gIGlmKHRlbXBieCA8IHRlbXBheCkgdGVtcGJ4ID0gdGVtcGF4OwotICByZXR1cm4odGVtcGJ4KTsKKyAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpKChUaExvd0FbaWR4MSArIDFdICogaWR4MikgKyBUaExvd0FbaWR4MV0pOworfQorCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldEZJRk9UaHJlc2hvbGRCMzAwKHVuc2lnbmVkIHNob3J0IGlkeDEsIHVuc2lnbmVkIHNob3J0IGlkeDIpCit7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUaExvd0JbOCAqIDNdID0geworCQk4MSwgNCw3MiwgNiw4OCwgOCwxMjAsMTIsCisJCTU1LCA0LDU0LCA2LDY2LCA4LCA5MCwxMiwKKwkJNDIsIDQsNDUsIDYsNTUsIDgsIDc1LDEyCisgICB9OworCisgICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KSgoVGhMb3dCW2lkeDEgKyAxXSAqIGlkeDIpICsgVGhMb3dCW2lkeDFdKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfRG9DYWxjRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1DTEssIHVuc2lnbmVkIHNob3J0IFZDTEssCisJCXVuc2lnbmVkIHNob3J0IGNvbG9yZGVwdGgsIHVuc2lnbmVkIHNob3J0IGtleSkKK3sKKyAgIHVuc2lnbmVkIHNob3J0IGlkeDEsIGlkeDI7CisgICB1bnNpZ25lZCBpbnQgICBsb25ndGVtcCA9IFZDTEsgKiBjb2xvcmRlcHRoOworCisgICBTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKFNpU19QciwgJmlkeDEsICZpZHgyKTsKKworICAgaWYoa2V5ID09IDApIHsKKyAgICAgIGxvbmd0ZW1wICo9IFNpU19HZXRGSUZPVGhyZXNob2xkQTMwMChpZHgxLCBpZHgyKTsKKyAgIH0gZWxzZSB7CisgICAgICBsb25ndGVtcCAqPSBTaVNfR2V0RklGT1RocmVzaG9sZEIzMDAoaWR4MSwgaWR4Mik7CisgICB9CisgICBpZHgxID0gbG9uZ3RlbXAgJSAoTUNMSyAqIDE2KTsKKyAgIGxvbmd0ZW1wIC89IChNQ0xLICogMTYpOworICAgaWYoaWR4MSkgbG9uZ3RlbXArKzsKKyAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpbG9uZ3RlbXA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorU2lTX0NhbGNEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgVkNMSywKKwkJdW5zaWduZWQgc2hvcnQgY29sb3JkZXB0aCwgdW5zaWduZWQgc2hvcnQgTUNMSykKK3sKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAxLCB0ZW1wMjsKKworICAgdGVtcDIgPSBTaVNfRG9DYWxjRGVsYXkoU2lTX1ByLCBNQ0xLLCBWQ0xLLCBjb2xvcmRlcHRoLCAwKTsKKyAgIHRlbXAxID0gU2lTX0RvQ2FsY0RlbGF5KFNpU19QciwgTUNMSywgVkNMSywgY29sb3JkZXB0aCwgMSk7CisgICBpZih0ZW1wMSA8IDQpIHRlbXAxID0gNDsKKyAgIHRlbXAxIC09IDQ7CisgICBpZih0ZW1wMiA8IHRlbXAxKSB0ZW1wMiA9IHRlbXAxOworICAgcmV0dXJuIHRlbXAyOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFGSUZPXzMwMChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENSVDFGSUZPXzMwMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCAgVGhyZXNob2xkTG93ID0gMDsKLSAgVVNIT1JUICBpbmRleCwgVkNMSywgTUNMSywgY29sb3J0aD0wOwotICBVU0hPUlQgIHRlbXBhaCwgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IFRocmVzaG9sZExvdyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpbmRleCwgVkNMSywgTUNMSywgY29sb3J0aDsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjb2xvcnRoYXJyYXlbNl0gPSB7IDEsIDEsIDIsIDIsIDMsIDQgfTsKIAotICBpZihNb2RlTm8gPiAweDEzKSB7CisgICBpZihNb2RlTm8gPiAweDEzKSB7CiAKLSAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgICAgIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOwotICAgICB9IGVsc2UgewotICAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7Ci0gICAgICAgIGluZGV4ICY9IDB4M0Y7Ci0gICAgICAgIFZDTEsgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uQ0xPQ0s7ICAgICAgICAgICAgIC8qIEdldCBWQ0xLICAqLwotICAgICB9CisgICAgICAvKiBHZXQgVkNMSyAgKi8KKyAgICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworCSBWQ0xLID0gU2lTX1ByLT5DU1JDbG9jazsKKyAgICAgIH0gZWxzZSB7CisJIGluZGV4ID0gU2lTX0dldFJlZkNSVFZDTEsoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFNpU19Qci0+U2lTX1VzZVdpZGUpOworCSBWQ0xLID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOworICAgICAgfQogCi0gICAgIHN3aXRjaCAoU2lTX1ByLT5TaVNfTW9kZVR5cGUgLSBNb2RlRUdBKSB7ICAgICAvKiBHZXQgaGFsZiBjb2xvcmRlcHRoICovCi0gICAgICAgIGNhc2UgMCA6IGNvbG9ydGggPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAxIDogY29sb3J0aCA9IDE7IGJyZWFrOwotICAgICAgICBjYXNlIDIgOiBjb2xvcnRoID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMyA6IGNvbG9ydGggPSAyOyBicmVhazsKLSAgICAgICAgY2FzZSA0IDogY29sb3J0aCA9IDM7IGJyZWFrOwotICAgICAgICBjYXNlIDUgOiBjb2xvcnRoID0gNDsgYnJlYWs7Ci0gICAgIH0KKyAgICAgIC8qIEdldCBoYWxmIGNvbG9yZGVwdGggKi8KKyAgICAgIGNvbG9ydGggPSBjb2xvcnRoYXJyYXlbKFNpU19Qci0+U2lTX01vZGVUeXBlIC0gTW9kZUVHQSldOwogCi0gICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M0EpOwotICAgICBpbmRleCAmPSAweDA3OwotICAgICBNQ0xLID0gU2lTX1ByLT5TaVNfTUNMS0RhdGFfMFtpbmRleF0uQ0xPQ0s7ICAgICAgICAgICAvKiBHZXQgTUNMSyAgKi8KKyAgICAgIC8qIEdldCBNQ0xLICAqLworICAgICAgaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQSkgJiAweDA3OworICAgICAgTUNMSyA9IFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLOwogCi0gICAgIHRlbXBhaCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KTsKLSAgICAgdGVtcGFoICY9IDB4YzM7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MTYsMHgzYyx0ZW1wYWgpOworICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KSAmIDB4YzM7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDE2LDB4M2MsdGVtcCk7CiAKLSAgICAgZG8gewotICAgICAgICBUaHJlc2hvbGRMb3cgPSBTaVNfQ2FsY0RlbGF5KFNpU19QciwgVkNMSywgY29sb3J0aCwgTUNMSyk7Ci0gICAgICAgIFRocmVzaG9sZExvdysrOwotICAgICAgICBpZihUaHJlc2hvbGRMb3cgPCAweDEzKSBicmVhazsKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MTYsMHhmYyk7Ci0gICAgICAgIFRocmVzaG9sZExvdyA9IDB4MTM7Ci0gICAgICAgIHRlbXBhaCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KTsKLSAgICAgICAgdGVtcGFoID4+PSA2OwotICAgICAgICBpZighKHRlbXBhaCkpIGJyZWFrOwotICAgICAgICB0ZW1wYWgtLTsKLSAgICAgICAgdGVtcGFoIDw8PSA2OwotICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDE2LDB4M2YsdGVtcGFoKTsKLSAgICAgfSB3aGlsZSgwKTsKKyAgICAgIGRvIHsKKwkgVGhyZXNob2xkTG93ID0gU2lTX0NhbGNEZWxheShTaVNfUHIsIFZDTEssIGNvbG9ydGgsIE1DTEspICsgMTsKKwkgaWYoVGhyZXNob2xkTG93IDwgMHgxMykgYnJlYWs7CisJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDE2LDB4ZmMpOworCSBUaHJlc2hvbGRMb3cgPSAweDEzOworCSB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTYpID4+IDY7CisJIGlmKCF0ZW1wKSBicmVhazsKKwkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgxNiwweDNmLCgodGVtcCAtIDEpIDw8IDYpKTsKKyAgICAgIH0gd2hpbGUoMCk7CiAKLSAgfSBlbHNlIFRocmVzaG9sZExvdyA9IDI7CisgICB9IGVsc2UgVGhyZXNob2xkTG93ID0gMjsKIAotICAvKiBXcml0ZSBDUlQvQ1BVIHRocmVzaG9sZCBsb3csIENSVC9FbmdpbmUgdGhyZXNob2xkIGhpZ2ggKi8KLSAgdGVtcCA9IChUaHJlc2hvbGRMb3cgPDwgNCkgfCAweDBmOwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCx0ZW1wKTsKKyAgIC8qIFdyaXRlIENSVC9DUFUgdGhyZXNob2xkIGxvdywgQ1JUL0VuZ2luZSB0aHJlc2hvbGQgaGlnaCAqLworICAgdGVtcCA9IChUaHJlc2hvbGRMb3cgPDwgNCkgfCAweDBmOworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsdGVtcCk7CiAKLSAgdGVtcCA9IChUaHJlc2hvbGRMb3cgJiAweDEwKSA8PCAxOwotICBpZihNb2RlTm8gPiAweDEzKSB0ZW1wIHw9IDB4NDA7Ci0gIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MGYsMHg5Zix0ZW1wKTsKKyAgIHRlbXAgPSAoVGhyZXNob2xkTG93ICYgMHgxMCkgPDwgMTsKKyAgIGlmKE1vZGVObyA+IDB4MTMpIHRlbXAgfD0gMHg0MDsKKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MGYsMHg5Zix0ZW1wKTsKIAotICAvKiBXaGF0IGlzIHRoaXM/ICovCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDNCLDB4MDkpOworICAgLyogV2hhdCBpcyB0aGlzPyAqLworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M0IsMHgwOSk7CiAKLSAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgaGlnaCAqLwotICB0ZW1wID0gVGhyZXNob2xkTG93ICsgMzsKLSAgaWYodGVtcCA+IDB4MGYpIHRlbXAgPSAweDBmOwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOSx0ZW1wKTsKKyAgIC8qIFdyaXRlIENSVC9DUFUgdGhyZXNob2xkIGhpZ2ggKi8KKyAgIHRlbXAgPSBUaHJlc2hvbGRMb3cgKyAzOworICAgaWYodGVtcCA+IDB4MGYpIHRlbXAgPSAweDBmOworICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDksdGVtcCk7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19DYWxjRGVsYXkyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVDSEFSIGtleSwgUFNJU19IV19JTkZPIEh3SW5mbykKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0TGF0ZW5jeUZhY3RvcjYzMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgaW5kZXgpCiB7Ci0gIFVTSE9SVCBkYXRhLGluZGV4OwotICBjb25zdCBVQ0hBUiAgTGF0ZW5jeUZhY3RvcltdID0gewotICAgCTk3LCA4OCwgODYsIDc5LCA3NywgMDAsICAgICAgIC8qOyA2NCAgYml0ICAgIEJRPTIgICAqLwotICAgICAgICAwMCwgODcsIDg1LCA3OCwgNzYsIDU0LCAgICAgICAvKjsgNjQgIGJpdCAgICBCUT0xICAgKi8KLSAgICAgICAgOTcsIDg4LCA4NiwgNzksIDc3LCAwMCwgICAgICAgLyo7IDEyOCBiaXQgICAgQlE9MiAgICovCi0gICAgICAgIDAwLCA3OSwgNzcsIDcwLCA2OCwgNDgsICAgICAgIC8qOyAxMjggYml0ICAgIEJRPTEgICAqLwotICAgICAgICA4MCwgNzIsIDY5LCA2MywgNjEsIDAwLCAgICAgICAvKjsgNjQgIGJpdCAgICBCUT0yICAgKi8KLSAgICAgICAgMDAsIDcwLCA2OCwgNjEsIDU5LCAzNywgICAgICAgLyo7IDY0ICBiaXQgICAgQlE9MSAgICovCi0gICAgICAgIDg2LCA3NywgNzUsIDY4LCA2NiwgMDAsICAgICAgIC8qOyAxMjggYml0ICAgIEJRPTIgICAqLwotICAgICAgICAwMCwgNjgsIDY2LCA1OSwgNTcsIDM3ICAgICAgICAvKjsgMTI4IGJpdCAgICBCUT0xICAgKi8KLSAgfTsKLSAgY29uc3QgVUNIQVIgIExhdGVuY3lGYWN0b3I3MzBbXSA9IHsKLSAgICAgICAgIDY5LCA2MywgNjEsCi0JIDg2LCA3OSwgNzcsCi0JMTAzLCA5NiwgOTQsCi0JMTIwLDExMywxMTEsCi0JMTM3LDEzMCwxMjgsICAgIC8qIC0tLSBUYWJsZSBlbmRzIHdpdGggdGhpcyBlbnRyeSwgZGF0YSBiZWxvdyAqLwotCTEzNywxMzAsMTI4LAkvKiB0byBhdm9pZCB1c2luZyBpbGxlZ2FsIHZhbHVlcyAgICAgICAgICAgICAgKi8KLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLQkxMzcsMTMwLDEyOCwKLSAgfTsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExhdGVuY3lGYWN0b3JbXSA9IHsKKwkJOTcsIDg4LCA4NiwgNzksIDc3LCAgMCwgICAgICAgLyogNjQgIGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDg3LCA4NSwgNzgsIDc2LCA1NCwgICAgICAgLyogNjQgIGJpdCAgICBCUT0xICAgKi8KKwkJOTcsIDg4LCA4NiwgNzksIDc3LCAgMCwgICAgICAgLyogMTI4IGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDc5LCA3NywgNzAsIDY4LCA0OCwgICAgICAgLyogMTI4IGJpdCAgICBCUT0xICAgKi8KKwkJODAsIDcyLCA2OSwgNjMsIDYxLCAgMCwgICAgICAgLyogNjQgIGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDcwLCA2OCwgNjEsIDU5LCAzNywgICAgICAgLyogNjQgIGJpdCAgICBCUT0xICAgKi8KKwkJODYsIDc3LCA3NSwgNjgsIDY2LCAgMCwgICAgICAgLyogMTI4IGJpdCAgICBCUT0yICAgKi8KKwkJIDAsIDY4LCA2NiwgNTksIDU3LCAzNyAgICAgICAgLyogMTI4IGJpdCAgICBCUT0xICAgKi8KKyAgIH07CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMYXRlbmN5RmFjdG9yNzMwW10gPSB7CisJCSA2OSwgNjMsIDYxLAorCQkgODYsIDc5LCA3NywKKwkJMTAzLCA5NiwgOTQsCisJCTEyMCwxMTMsMTExLAorCQkxMzcsMTMwLDEyOAorICAgfTsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzMwKSB7Ci0gICAgIGluZGV4ID0gKChrZXkgJiAweDBmKSAqIDMpICsgKChrZXkgJiAweEMwKSA+PiA2KTsKLSAgICAgZGF0YSA9IExhdGVuY3lGYWN0b3I3MzBbaW5kZXhdOwotICB9IGVsc2UgewotICAgICBpbmRleCA9IChrZXkgJiAweEUwKSA+PiA1OwotICAgICBpZihrZXkgJiAweDEwKSBpbmRleCArPTY7Ci0gICAgIGlmKCEoa2V5ICYgMHgwMSkpIGluZGV4ICs9IDI0OwotICAgICBkYXRhID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgICBpZihkYXRhICYgMHgwMDgwKSBpbmRleCArPSAxMjsKLSAgICAgZGF0YSA9IExhdGVuY3lGYWN0b3JbaW5kZXhdOwotICB9Ci0gIHJldHVybihkYXRhKTsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkgeworICAgICAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydClMYXRlbmN5RmFjdG9yNzMwW2luZGV4XTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KUxhdGVuY3lGYWN0b3JbaW5kZXhdOworICAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19DYWxjRGVsYXkyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyIGtleSkKK3sKKyAgIHVuc2lnbmVkIHNob3J0IGluZGV4OworCisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKKyAgICAgIGluZGV4ID0gKChrZXkgJiAweDBmKSAqIDMpICsgKChrZXkgJiAweGMwKSA+PiA2KTsKKyAgIH0gZWxzZSB7CisgICAgICBpbmRleCA9IChrZXkgJiAweGUwKSA+PiA1OworICAgICAgaWYoa2V5ICYgMHgxMCkgICAgaW5kZXggKz0gIDY7CisgICAgICBpZighKGtleSAmIDB4MDEpKSBpbmRleCArPSAyNDsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KSAmIDB4ODApIGluZGV4ICs9IDEyOworICAgfQorICAgcmV0dXJuIFNpU19HZXRMYXRlbmN5RmFjdG9yNjMwKFNpU19QciwgaW5kZXgpOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFGSUZPXzYzMChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLAotIAkJICAgIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCitTaVNfU2V0Q1JUMUZJRk9fNjMwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKLSAgVVNIT1JUICBpLGluZGV4LGRhdGEsVkNMSyxNQ0xLLGNvbG9ydGg9MDsKLSAgVUxPTkcgICBCLGVheCxibCxkYXRhMjsKLSAgVVNIT1JUICBUaHJlc2hvbGRMb3c9MDsKLSAgVUNIQVIgICBGUUJRRGF0YVtdPSB7Ci0gIAkweDAxLDB4MjEsMHg0MSwweDYxLDB4ODEsCi0gICAgICAgIDB4MzEsMHg1MSwweDcxLDB4OTEsMHhiMSwKLSAgICAgICAgMHgwMCwweDIwLDB4NDAsMHg2MCwweDgwLAotICAgICAgICAweDMwLDB4NTAsMHg3MCwweDkwLDB4YjAsCi0JMHhGRgotICB9OwotICBVQ0hBUiAgIEZRQlFEYXRhNzMwW109IHsKLSAgICAgICAgMHgzNCwweDc0LDB4YjQsCi0JMHgyMywweDYzLDB4YTMsCi0JMHgxMiwweDUyLDB4OTIsCi0JMHgwMSwweDQxLDB4ODEsCi0JMHgwMCwweDQwLDB4ODAsCi0JMHhmZgotICB9OworICAgdW5zaWduZWQgc2hvcnQgIFRocmVzaG9sZExvdyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCAgaSwgZGF0YSwgVkNMSywgTUNMSzE2LCBjb2xvcnRoID0gMDsKKyAgIHVuc2lnbmVkIGludCAgICB0ZW1wbCwgZGF0YWw7CisgICBjb25zdCB1bnNpZ25lZCBjaGFyICpxdWV1ZWRhdGEgPSBOVUxMOworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgRlFCUURhdGFbMjFdID0geworCQkweDAxLDB4MjEsMHg0MSwweDYxLDB4ODEsCisJCTB4MzEsMHg1MSwweDcxLDB4OTEsMHhiMSwKKwkJMHgwMCwweDIwLDB4NDAsMHg2MCwweDgwLAorCQkweDMwLDB4NTAsMHg3MCwweDkwLDB4YjAsCisJCTB4ZmYKKyAgIH07CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBGUUJRRGF0YTczMFsxNl0gPSB7CisJCTB4MzQsMHg3NCwweGI0LAorCQkweDIzLDB4NjMsMHhhMywKKwkJMHgxMiwweDUyLDB4OTIsCisJCTB4MDEsMHg0MSwweDgxLAorCQkweDAwLDB4NDAsMHg4MCwKKwkJMHhmZgorICAgfTsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjb2xvcnRoYXJyYXlbNl0gPSB7CisJCTEsIDEsIDIsIDIsIDMsIDQKKyAgIH07CiAKLSAgaT0wOwotICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgICAgVkNMSyA9IFNpU19Qci0+Q1NSQ2xvY2s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7Ci0gICAgICAgaW5kZXggJj0gMHgzRjsKLSAgICAgICBWQ0xLID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOyAgICAgICAgICAvKiBHZXQgVkNMSyAgKi8KLSAgICB9CisgICBpID0gMDsKIAotICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MUEpOwotICAgIGluZGV4ICY9IDB4MDc7Ci0gICAgTUNMSyA9IFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLOyAgICAgICAgICAgLyogR2V0IE1DTEsgICovCisgICBpZihNb2RlTm8gPiAweDEzKSB7CiAKLSAgICBkYXRhMiA9IFNpU19Qci0+U2lTX01vZGVUeXBlIC0gTW9kZUVHQTsJICAvKiBHZXQgaGFsZiBjb2xvcmRlcHRoICovCi0gICAgc3dpdGNoIChkYXRhMikgewotICAgICAgICBjYXNlIDAgOiBjb2xvcnRoID0gMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMSA6IGNvbG9ydGggPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAyIDogY29sb3J0aCA9IDI7IGJyZWFrOwotICAgICAgICBjYXNlIDMgOiBjb2xvcnRoID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNCA6IGNvbG9ydGggPSAzOyBicmVhazsKLSAgICAgICAgY2FzZSA1IDogY29sb3J0aCA9IDQ7IGJyZWFrOwotICAgIH0KKyAgICAgIC8qIEdldCBWQ0xLICAqLworICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOworICAgICAgfSBlbHNlIHsKKwkgZGF0YSA9IFNpU19HZXRSZWZDUlRWQ0xLKFNpU19QciwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBTaVNfUHItPlNpU19Vc2VXaWRlKTsKKwkgVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2RhdGFdLkNMT0NLOworICAgICAgfQogCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgeworICAgICAgLyogR2V0IE1DTEsgKiAxNiAqLworICAgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDFBKSAmIDB4MDc7CisgICAgICBNQ0xLMTYgPSBTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2RhdGFdLkNMT0NLICogMTY7CiAKLSAgICAgICBkbyB7Ci0gICAgICAgICAgQiA9IFNpU19DYWxjRGVsYXkyKFNpU19QciwgRlFCUURhdGE3MzBbaV0sIEh3SW5mbykgKiBWQ0xLICogY29sb3J0aDsKLQkgIGJsID0gQiAvIChNQ0xLICogMTYpOworICAgICAgLyogR2V0IGhhbGYgY29sb3JkZXB0aCAqLworICAgICAgY29sb3J0aCA9IGNvbG9ydGhhcnJheVsoU2lTX1ByLT5TaVNfTW9kZVR5cGUgLSBNb2RlRUdBKV07CiAKLSAgICAgICAgICBpZihCID09IGJsICogMTYgKiBNQ0xLKSB7Ci0gICAgICAgICAgICAgYmwgPSBibCArIDE7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBibCA9IGJsICsgMjsKLSAgICAgICAgICB9CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKKwkgcXVldWVkYXRhID0gJkZRQlFEYXRhNzMwWzBdOworICAgICAgfSBlbHNlIHsKKwkgcXVldWVkYXRhID0gJkZRQlFEYXRhWzBdOworICAgICAgfQogCi0gICAgICAgICAgaWYoYmwgPiAweDEzKSB7Ci0gICAgICAgICAgICAgaWYoRlFCUURhdGE3MzBbaSsxXSA9PSAweEZGKSB7Ci0gICAgICAgICAgICAgICAgVGhyZXNob2xkTG93ID0gMHgxMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaSsrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgVGhyZXNob2xkTG93ID0gYmw7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0gd2hpbGUoRlFCUURhdGE3MzBbaV0gIT0gMHhGRik7CisgICAgICBkbyB7CisJIHRlbXBsID0gU2lTX0NhbGNEZWxheTIoU2lTX1ByLCBxdWV1ZWRhdGFbaV0pICogVkNMSyAqIGNvbG9ydGg7CiAKLSAgICB9IGVsc2UgeworCSBkYXRhbCA9IHRlbXBsICUgTUNMSzE2OworCSB0ZW1wbCA9ICh0ZW1wbCAvIE1DTEsxNikgKyAxOworCSBpZihkYXRhbCkgdGVtcGwrKzsKIAotICAgICAgIGRvIHsKLSAgICAgICAgICBCID0gU2lTX0NhbGNEZWxheTIoU2lTX1ByLCBGUUJRRGF0YVtpXSwgSHdJbmZvKSAqIFZDTEsgKiBjb2xvcnRoOwotICAgICAgICAgIGJsID0gQiAvIChNQ0xLICogMTYpOworCSBpZih0ZW1wbCA+IDB4MTMpIHsKKwkgICAgaWYocXVldWVkYXRhW2kgKyAxXSA9PSAweEZGKSB7CisJICAgICAgIFRocmVzaG9sZExvdyA9IDB4MTM7CisJICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGkrKzsKKwkgfSBlbHNlIHsKKwkgICAgVGhyZXNob2xkTG93ID0gdGVtcGw7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9IHdoaWxlKHF1ZXVlZGF0YVtpXSAhPSAweEZGKTsKIAotICAgICAgICAgIGlmKEIgPT0gYmwgKiAxNiAqIE1DTEspIHsKLSAgICAgICAgICAgICBibCA9IGJsICsgMTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGJsID0gYmwgKyAyOwotICAgICAgICAgIH0KKyAgIH0gZWxzZSB7CiAKLSAgICAgICAgICBpZihibCA+IDB4MTMpIHsKLSAgICAgICAgICAgICBpZihGUUJRRGF0YVtpKzFdID09IDB4RkYpIHsKLSAgICAgICAgICAgICAgICBUaHJlc2hvbGRMb3cgPSAweDEzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBUaHJlc2hvbGRMb3cgPSBibDsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgfSB3aGlsZShGUUJRRGF0YVtpXSAhPSAweEZGKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotICAgIH0gZWxzZSB7Ci0gICAgICBpID0gOTsKLSAgICB9Ci0gICAgVGhyZXNob2xkTG93ID0gMHgwMjsKLSAgfQorICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNzMwKSBpID0gOTsKKyAgICAgIFRocmVzaG9sZExvdyA9IDB4MDI7CisKKyAgIH0KKworICAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgbG93LCBDUlQvRW5naW5lIHRocmVzaG9sZCBoaWdoICovCisgICBkYXRhID0gKChUaHJlc2hvbGRMb3cgJiAweDBmKSA8PCA0KSB8IDB4MGY7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCxkYXRhKTsKKworICAgZGF0YSA9IChUaHJlc2hvbGRMb3cgJiAweDEwKSA8PCAxOworICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRiwweERGLGRhdGEpOworCisgICAvKiBXaGF0IGlzIHRoaXM/ICovCisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQiwweDA5KTsKKworICAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgaGlnaCAoZ2FwID0gMykgKi8KKyAgIGRhdGEgPSBUaHJlc2hvbGRMb3cgKyAzOworICAgaWYoZGF0YSA+IDB4MGYpIGRhdGEgPSAweDBmOworICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwOSwweDgwLGRhdGEpOwogCiAgIC8qIFdyaXRlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgcXVldWUgKi8KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotCi0gICAgIGRhdGEyID0gRlFCUURhdGE3MzBbaV07Ci0gICAgIGRhdGEyID0gKGRhdGEyICYgMHhDMCkgPj4gNTsKLSAgICAgZGF0YTIgPDw9IDg7Ci0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZjgsMHg4MDAwMDA1MCk7Ci0gICAgIGVheCA9IFNpU19HZXRSZWdMb25nKDB4Y2ZjKTsKLSAgICAgZWF4ICY9IDB4ZmZmZmY5ZmY7Ci0gICAgIGVheCB8PSBkYXRhMjsKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZmMsZWF4KTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICB0ZW1wbCA9IHNpc2ZiX3JlYWRfbmJyaWRnZV9wY2lfZHdvcmQoU2lTX1ByLCAweDUwKTsKICNlbHNlCi0gICAgIC8qIFdlIHVzZSBwY2kgZnVuY3Rpb25zIFggb2ZmZXJzLiBXZSB1c2UgcGNpdGFnIDAsIGJlY2F1c2UKLSAgICAgICogd2Ugd2FudCB0byByZWFkL3dyaXRlIHRvIHRoZSBob3N0IGJyaWRnZSAod2hpY2ggaXMgYWx3YXlzCi0gICAgICAqIDAwOjAwLjAgb24gNjMwLCA3MzAgYW5kIDU0MCksIG5vdCB0aGUgVkdBIGRldmljZS4KLSAgICAgICovCi0gICAgIGVheCA9IHBjaVJlYWRMb25nKDB4MDAwMDAwMDAsIDB4NTApOwotICAgICBlYXggJj0gMHhmZmZmZjlmZjsKLSAgICAgZWF4IHw9IGRhdGEyOwotICAgICBwY2lXcml0ZUxvbmcoMHgwMDAwMDAwMCwgMHg1MCwgZWF4KTsKKyAgIHRlbXBsID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHg1MCk7CiAjZW5kaWYKIAotICAgICAvKiBXcml0ZSBHVUkgZ3JhbnQgdGltZXIgKFBDSSBjb25maWcgMHhBMykgKi8KLSAgICAgZGF0YTIgPSBGUUJRRGF0YTczMFtpXSA8PCA4OwotICAgICBkYXRhMiA9IChkYXRhMiAmIDB4MGYwMCkgfCAoKGRhdGEyICYgMHgzMDAwKSA+PiA4KTsKLSAgICAgZGF0YTIgPDw9IDIwOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSB7CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZjgsMHg4MDAwMDBBMCk7Ci0gICAgIGVheCA9IFNpU19HZXRSZWdMb25nKDB4Y2ZjKTsKLSAgICAgZWF4ICY9IDB4MDBmZmZmZmY7Ci0gICAgIGVheCB8PSBkYXRhMjsKLSAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZmMsZWF4KTsKKyAgICAgIHRlbXBsICY9IDB4ZmZmZmY5ZmY7CisgICAgICB0ZW1wbCB8PSAoKHF1ZXVlZGF0YVtpXSAmIDB4YzApIDw8IDMpOworCisgICB9IGVsc2UgeworCisgICAgICB0ZW1wbCAmPSAweGYwZmZmZmZmOworICAgICAgaWYoIChNb2RlTm8gPD0gMHgxMykgJiYKKyAgICAgICAgICAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSAmJgorCSAgKFNpU19Qci0+Q2hpcFJldmlzaW9uID49IDB4MzApICkgeworCSB0ZW1wbCB8PSAweDBiMDAwMDAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHRlbXBsIHw9ICgocXVldWVkYXRhW2ldICYgMHhmMCkgPDwgMjApOworICAgICAgfQorCisgICB9CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4NTAsIHRlbXBsKTsKKyAgIHRlbXBsID0gc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4QTApOwogI2Vsc2UKLSAgICAgZWF4ID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7Ci0gICAgIGVheCAmPSAweDAwZmZmZmZmOwotICAgICBlYXggfD0gZGF0YTI7Ci0gICAgIHBjaVdyaXRlTG9uZygweDAwMDAwMDAwLCAweEEwLCBlYXgpOworICAgcGNpV3JpdGVMb25nKDB4MDAwMDAwMDAsIDB4NTAsIHRlbXBsKTsKKyAgIHRlbXBsID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7CiAjZW5kaWYKIAotICB9IGVsc2UgeworICAgLyogR1VJIGdyYW50IHRpbWVyIChQQ0kgY29uZmlnIDB4QTMpICovCisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKIAotICAgICBkYXRhMiA9IEZRQlFEYXRhW2ldOwotICAgICBkYXRhMiA9IChkYXRhMiAmIDB4ZjApID4+IDQ7Ci0gICAgIGRhdGEyIDw8PSAyNDsKKyAgICAgIHRlbXBsICY9IDB4MDBmZmZmZmY7CisgICAgICBkYXRhbCA9IHF1ZXVlZGF0YVtpXSA8PCA4OworICAgICAgdGVtcGwgfD0gKCgoZGF0YWwgJiAweDBmMDApIHwgKChkYXRhbCAmIDB4MzAwMCkgPj4gOCkpIDw8IDIwKTsKIAotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgICBTaVNfU2V0UmVnTG9uZygweGNmOCwweDgwMDAwMDUwKTsKLSAgICAgZWF4ID0gU2lTX0dldFJlZ0xvbmcoMHhjZmMpOwotICAgICBlYXggJj0gMHhmMGZmZmZmZjsKLSAgICAgZWF4IHw9IGRhdGEyOwotICAgICBTaVNfU2V0UmVnTG9uZygweGNmYyxlYXgpOworICAgfSBlbHNlIHsKKworICAgICAgdGVtcGwgJj0gMHhmMGZmZmZmZjsKKyAgICAgIHRlbXBsIHw9ICgocXVldWVkYXRhW2ldICYgMHgwZikgPDwgMjQpOworCisgICB9CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4QTAsIHRlbXBsKTsKICNlbHNlCi0gICAgIGVheCA9IHBjaVJlYWRMb25nKDB4MDAwMDAwMDAsIDB4NTApOwotICAgICBlYXggJj0gMHhmMGZmZmZmZjsKLSAgICAgZWF4IHw9IGRhdGEyOwotICAgICBwY2lXcml0ZUxvbmcoMHgwMDAwMDAwMCwgMHg1MCwgZWF4KTsKKyAgIHBjaVdyaXRlTG9uZygweDAwMDAwMDAwLCAweEEwLCB0ZW1wbCk7CiAjZW5kaWYKLQotICAgICAvKiBXcml0ZSBHVUkgZ3JhbnQgdGltZXIgKFBDSSBjb25maWcgMHhBMykgKi8KLSAgICAgZGF0YTIgPSBGUUJRRGF0YVtpXTsKLSAgICAgZGF0YTIgJj0gMHgwZjsKLSAgICAgZGF0YTIgPDw9IDI0OwotCi0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICAgIFNpU19TZXRSZWdMb25nKDB4Y2Y4LDB4ODAwMDAwQTApOwotICAgICBlYXggPSBTaVNfR2V0UmVnTG9uZygweGNmYyk7Ci0gICAgIGVheCAmPSAweGYwZmZmZmZmOwotICAgICBlYXggfD0gZGF0YTI7Ci0gICAgIFNpU19TZXRSZWdMb25nKDB4Y2ZjLGVheCk7Ci0jZWxzZQotICAgICBlYXggPSBwY2lSZWFkTG9uZygweDAwMDAwMDAwLCAweEEwKTsKLSAgICAgZWF4ICY9IDB4ZjBmZmZmZmY7Ci0gICAgIGVheCB8PSBkYXRhMjsKLSAgICAgcGNpV3JpdGVMb25nKDB4MDAwMDAwMDAsIDB4QTAsIGVheCk7Ci0jZW5kaWYKLQotICB9Ci0KLSAgLyogV3JpdGUgQ1JUL0NQVSB0aHJlc2hvbGQgbG93LCBDUlQvRW5naW5lIHRocmVzaG9sZCBoaWdoICovCi0gIGRhdGEgPSAoKFRocmVzaG9sZExvdyAmIDB4MGYpIDw8IDQpIHwgMHgwZjsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsZGF0YSk7Ci0KLSAgZGF0YSA9IChUaHJlc2hvbGRMb3cgJiAweDEwKSA8PCAxOwotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4REYsZGF0YSk7Ci0KLSAgLyogV2hhdCBpcyB0aGlzPyAqLwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQiwweDA5KTsKLQotICAvKiBXcml0ZSBDUlQvQ1BVIHRocmVzaG9sZCBoaWdoIChnYXAgPSAzKSAqLwotICBkYXRhID0gVGhyZXNob2xkTG93ICsgMzsKLSAgaWYoZGF0YSA+IDB4MGYpIGRhdGEgPSAweDBmOwotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA5LDB4ODAsZGF0YSk7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBTSVMzMDAgKi8KIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q1JUMUZJRk9fMzEwKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQxRklGT18zMTAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCBtb2RlZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IG1vZGVmbGFnOwogCi0gIC8qIGRpc2FibGUgYXV0by10aHJlc2hvbGQgKi8KLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4M0QsMHhGRSk7CisgICAvKiBkaXNhYmxlIGF1dG8tdGhyZXNob2xkICovCisgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweEZFKTsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLSAgfQorICAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweEFFKTsKLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDksMHhGMCk7Ci0gIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICAgICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB7Ci0JICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsMHgzNCk7Ci0JICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKLQl9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCghKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpKSB8fCAoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDgsMHgzNCk7Ci0gICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4M0QsMHgwMSk7Ci0JfQotICAgICB9Ci0gIH0KKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA4LDB4QUUpOworICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDksMHhGMCk7CisgICBpZihNb2RlTm8gPiAweDEzKSB7CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgeworCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweDM0KTsKKwkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKKwkgaWYoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgeworCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweDM0KTsKKwkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgaWYoKCEobW9kZWZsYWcgJiBEb3VibGVTY2FuTW9kZSkpIHx8ICghKG1vZGVmbGFnICYgSGFsZkRDTEspKSkgeworCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwOCwweDM0KTsKKwkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzRCwweDAxKTsKKwkgfQorICAgICAgfQorICAgfQogfQogI2VuZGlmCiAKQEAgLTI4NTEsMzg1ICsyNTk3LDM3MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRWQ0xLU3RhdGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLSAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVJZEluZGV4KQorU2lTX1NldFZDTEtTdGF0ZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgZGF0YT0wLCBWQ0xLPTAsIGluZGV4PTA7CisgICB1bnNpZ25lZCBzaG9ydCBkYXRhID0gMCwgVkNMSyA9IDAsIGluZGV4ID0gMDsKIAotICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewotICAgICAgICBWQ0xLID0gU2lTX1ByLT5DU1JDbG9jazsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0gICAgICAgIFZDTEsgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uQ0xPQ0s7Ci0gICAgIH0KLSAgfQorICAgaWYoTW9kZU5vID4gMHgxMykgeworICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgICAgICBWQ0xLID0gU2lTX1ByLT5DU1JDbG9jazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpbmRleCA9IFNpU19HZXRWQ0xLMlB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICAgICBWQ0xLID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOworICAgICAgfQorICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMwMAorICAgICAgaWYoVkNMSyA+IDE1MCkgZGF0YSB8PSAweDgwOworICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweDdCLGRhdGEpOwogCi0gICAgIGlmKFZDTEsgPiAxNTApIGRhdGEgfD0gMHg4MDsKLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweDdCLGRhdGEpOworICAgICAgZGF0YSA9IDB4MDA7CisgICAgICBpZihWQ0xLID49IDE1MCkgZGF0YSB8PSAweDA4OworICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweEY3LGRhdGEpOworI2VuZGlmCisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFhHSV8yMCkgeworI2lmZGVmIFNJUzMxNUgKKyAgICAgIGlmKFZDTEsgPj0gMTY2KSBkYXRhIHw9IDB4MGM7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4ZjMsZGF0YSk7CiAKLSAgICAgZGF0YSA9IDB4MDA7Ci0gICAgIGlmKFZDTEsgPj0gMTUwKSBkYXRhIHw9IDB4MDg7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MzIsMHhGNyxkYXRhKTsKKyAgICAgIGlmKFZDTEsgPj0gMTY2KSB7CisgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgxZiwweGU3KTsKKyAgICAgIH0KKyNlbmRpZgorICAgfSBlbHNlIHsKKyNpZmRlZiBTSVMzMTVICisgICAgICBpZihWQ0xLID49IDIwMCkgZGF0YSB8PSAweDBjOworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfMjApIGRhdGEgJj0gfjB4MDQ7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4ZjMsZGF0YSk7CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlICE9IFhHSV8yMCkgeworICAgICAgICAgZGF0YSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDFmKSAmIDB4ZTc7CisJIGlmKFZDTEsgPCAyMDApIGRhdGEgfD0gMHgxMDsKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWYsZGF0YSk7CisgICAgICB9CisjZW5kaWYKKyAgIH0KIAotICB9IGVsc2UgeworICAgLyogREFDIHNwZWVkICovCisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKIAotICAgICBpZihWQ0xLID49IDE2NikgZGF0YSB8PSAweDBjOwotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4ZjMsZGF0YSk7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA3LDB4RTgsMHgxMCk7CiAKLSAgICAgaWYoVkNMSyA+PSAxNjYpIHsKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MWYsMHhlNyk7Ci0gICAgIH0KLSAgfQorICAgfSBlbHNlIHsKIAotICAvKiBEQUMgc3BlZWQgKi8KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICAgZGF0YSA9IDB4MDM7CisgICAgICBpZihWQ0xLID49IDI2MCkgICAgICBkYXRhID0gMHgwMDsKKyAgICAgIGVsc2UgaWYoVkNMSyA+PSAxNjApIGRhdGEgPSAweDAxOworICAgICAgZWxzZSBpZihWQ0xLID49IDEzNSkgZGF0YSA9IDB4MDI7CiAKLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweEU4LDB4MTApOworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTQwKSB7CisgICAgICAgICBpZigoVkNMSyA9PSAyMDMpIHx8IChWQ0xLIDwgMjM0KSkgZGF0YSA9IDB4MDI7CisgICAgICB9CiAKLSAgfSBlbHNlIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweEZDLGRhdGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPiBTSVNfMzE1UFJPKSB7CisgICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSBkYXRhICY9IDB4ZmM7CisgICAgICAgICB9CisgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA3LDB4RjgsZGF0YSk7CisgICAgICB9CiAKLSAgICAgZGF0YSA9IDB4MDM7Ci0gICAgIGlmKChWQ0xLID49IDEzNSkgJiYgKFZDTEsgPCAxNjApKSAgICAgIGRhdGEgPSAweDAyOwotICAgICBlbHNlIGlmKChWQ0xLID49IDE2MCkgJiYgKFZDTEsgPCAyNjApKSBkYXRhID0gMHgwMTsKLSAgICAgZWxzZSBpZihWQ0xLID49IDI2MCkgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4MDA7Ci0KLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzU0MCkgewotICAgICAgICBpZigoVkNMSyA9PSAyMDMpIHx8IChWQ0xLIDwgMjM0KSkgICBkYXRhID0gMHgwMjsKLSAgICAgfQotCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwNywweEZDLGRhdGEpOwotICAgICB9IGVsc2UgewotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+IFNJU18zMTVQUk8pIHsKLSAgICAgICAgICAgaWYoTW9kZU5vID4gMHgxMykgZGF0YSAmPSAweGZjOwotICAgICAgICB9Ci0gICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MDcsMHhGOCxkYXRhKTsKLSAgICAgfQotCi0gIH0KKyAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQxTW9kZVJlZ3MoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCkKK1NpU19TZXRDUlQxTW9kZVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpCiB7Ci0gIFVTSE9SVCBkYXRhLGluZm9mbGFnPTAsbW9kZWZsYWc7Ci0gIFVTSE9SVCByZXNpbmRleCx4cmVzOworICAgdW5zaWduZWQgc2hvcnQgZGF0YSwgaW5mb2ZsYWcgPSAwLCBtb2RlZmxhZywgcmVzaW5kZXg7CiAjaWZkZWYgU0lTMzE1SAotICBVU0hPUlQgZGF0YTIsZGF0YTM7Ci0gIFVMT05HICBsb25nZGF0YTsKLSAgVUNIQVIgICpST01BZGRyICA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyICA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCBkYXRhMiwgZGF0YTM7CiAjZW5kaWYKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPkNJbmZvRmxhZzsKLSAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OwotICB9IGVsc2UgewotICAgICByZXNpbmRleCA9IFNpU19HZXRSZXNJbmZvKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpOwotICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgCW1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgCWluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWc7Ci0JeHJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7Ci0gICAgIH0gZWxzZSB7Ci0gICAgCW1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLQl4cmVzID0gU2lTX1ByLT5TaVNfU3RSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7Ci0gICAgIH0KLSAgfQorICAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICAvKiBEaXNhYmxlIERQTVMgKi8KLSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MUYsMHgzRik7CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5DSW5mb0ZsYWc7CisgICB9IGVsc2UgeworICAgICAgcmVzaW5kZXggPSBTaVNfR2V0UmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOworICAgICAgaWYoTW9kZU5vID4gMHgxMykgeworCSBpbmZvZmxhZyA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZzsKKyAgICAgIH0KKyAgIH0KIAotICBkYXRhID0gMDsKLSAgaWYoTW9kZU5vID4gMHgxMykgewotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVFR0EpIHsKLSAgICAgICAgZGF0YSB8PSAweDAyOwotICAgICAgICBkYXRhIHw9ICgoU2lTX1ByLT5TaVNfTW9kZVR5cGUgLSBNb2RlVkdBKSA8PCAyKTsKLSAgICAgfQotICAgICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIGRhdGEgfD0gMHgyMDsKLSAgfQotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDA2LDB4QzAsZGF0YSk7CisgICAvKiBEaXNhYmxlIERQTVMgKi8KKyAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDFGLDB4M0YpOwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlICE9IFNJU18zMDApIHsKLSAgICAgZGF0YSA9IDA7Ci0gICAgIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgewotICAgICAgICBpZih4cmVzIDw9IDgwMCkgICAgICAgZGF0YSA9IDB4MDAyMDsKLSAgICAgICAgZWxzZSBpZih4cmVzIDw9IDEwMjQpIGRhdGEgPSAweDAwMzU7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICBkYXRhID0gMHgwMDQ4OwotICAgICB9Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDE5LChkYXRhICYgMHhGRikpOwotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNkNCwweDFhLDB4RkMsKGRhdGEgPj4gOCkpOwotICB9CisgICBkYXRhID0gMDsKKyAgIGlmKE1vZGVObyA+IDB4MTMpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID4gTW9kZUVHQSkgeworICAgICAgICAgZGF0YSB8PSAweDAyOworICAgICAgICAgZGF0YSB8PSAoKFNpU19Qci0+U2lTX01vZGVUeXBlIC0gTW9kZVZHQSkgPDwgMik7CisgICAgICB9CisgICAgICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIGRhdGEgfD0gMHgyMDsKKyAgIH0KKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MDYsMHhDMCxkYXRhKTsKIAotICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB7Ci0gICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MDEsMHgwOCk7Ci0gIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzMwMCkgeworICAgICAgZGF0YSA9IDA7CisgICAgICBpZihpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpIHsKKwkgLyogZGF0YSA9IChIc3luYyAvIDgpIC0gKChIdG90YWwgLyA4KSAvIDIpICsgMyAqLworCSBpbnQgaHJzID0gKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDA0KSB8CisJCSAgICAoKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDBiKSAmIDB4YzApIDw8IDIpKSAtIDM7CisJIGludCBodG8gPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MDApIHwKKwkJICAgICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MGIpICYgMHgwMykgPDwgOCkpICsgNTsKKwkgZGF0YSA9IGhycyAtIChodG8gPj4gMSkgKyAzOworICAgICAgfQorICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTksZGF0YSk7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNkNCwweDFhLDB4RkMsKChkYXRhID4+IDgpICYgMHgwMykpOworICAgfQogCi0gIGRhdGEgPSAwOwotICBpZihtb2RlZmxhZyAmIExpbmVDb21wYXJlT2ZmKSBkYXRhID0gMHgwODsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4RjcsZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MEYsMHhCNyxkYXRhKTsKLSAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZUVHQSkgewotICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4NDApOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQorICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgeworICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgwMSwweDA4KTsKKyAgIH0KIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7Ci0gICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMxLDB4ZmIpOwotICB9CisgICBkYXRhID0gMDsKKyAgIGlmKG1vZGVmbGFnICYgTGluZUNvbXBhcmVPZmYpIGRhdGEgPSAweDA4OworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CisgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBGLDB4RjcsZGF0YSk7CisgICB9IGVsc2UgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBYR0lfMjApIGRhdGEgfD0gMHgyMDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVFR0EpIHsKKwkgaWYoTW9kZU5vID4gMHgxMykgeworCSAgICBkYXRhIHw9IDB4NDA7CisJIH0KKyAgICAgIH0KKyAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MEYsMHhCNyxkYXRhKTsKKyAgIH0KIAogI2lmZGVmIFNJUzMxNUgKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMxNVBSTykgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MzEsMHhmYik7CisgICB9CiAKLSAgICAgZGF0YSA9IFNpU19HZXQzMTBEUkFNVHlwZShTaVNfUHIsIEh3SW5mbyk7Ci0gICAgIGRhdGEgPSBTaVNfUHItPlNpU19TUjE1WzJdW2RhdGFdOwotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA9PSBNb2RlVGV4dCkgewotICAgICAgICBkYXRhICY9IDB4Yzc7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGEyID0gU2lTX0dldE9mZnNldChTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JZGF0YTIgPj49IDE7Ci0JaWYoaW5mb2ZsYWcgJiBJbnRlcmxhY2VNb2RlKSBkYXRhMiA+Pj0gMTsKLQlkYXRhMyA9IFNpU19HZXRDb2xvckRlcHRoKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpID4+IDE7Ci0JaWYoIWRhdGEzKSBkYXRhMysrOwotCWRhdGEyIC89IGRhdGEzOwotCWlmKGRhdGEyID49IDB4NTApIHsKLQkgICBkYXRhICY9IDB4MGY7Ci0JICAgZGF0YSB8PSAweDUwOwotCX0KLSAgICAgfQotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNyxkYXRhKTsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMxNVBSTykgewogCi0gIH0gZWxzZSBpZiggKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMzApIHx8Ci0gICAgICAgICAgICAgKChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzYwKSAmJiAoU2lTX1ByLT5TaVNfU3lzRmxhZ3MgJiBTRl83NjBMRkIpKSkgeworICAgICAgZGF0YSA9IFNpU19Qci0+U2lTX1NSMTVbKDIgKiA0KSArIFNpU19HZXQzMTBEUkFNVHlwZShTaVNfUHIpXTsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVUZXh0KSB7CisJIGRhdGEgJj0gMHhjNzsKKyAgICAgIH0gZWxzZSB7CisJIGRhdGEyID0gU2lTX0dldE9mZnNldChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJSVEkpID4+IDE7CisJIGlmKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkgZGF0YTIgPj49IDE7CisJIGRhdGEzID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KSA+PiAxOworCSBpZihkYXRhMykgZGF0YTIgLz0gZGF0YTM7CisJIGlmKGRhdGEyID49IDB4NTApIHsKKwkgICAgZGF0YSAmPSAweDBmOworCSAgICBkYXRhIHw9IDB4NTA7CisJIH0KKyAgICAgIH0KKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE3LGRhdGEpOwogCi0gICAgIGRhdGEgPSBTaVNfR2V0MzEwRFJBTVR5cGUoU2lTX1ByLCBId0luZm8pOwotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfMzMwKSB7Ci0gICAgICAgIGRhdGEgPSBTaVNfUHItPlNpU19TUjE1WzJdW2RhdGFdOwotICAgICB9IGVsc2UgewotICAgICAgICBpZihTaVNfUHItPlNpU19ST01OZXcpIAkgICAgZGF0YSA9IFJPTUFkZHJbMHhmNl07Ci0gICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSBkYXRhID0gUk9NQWRkclsweDEwMCArIGRhdGFdOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gMHhiYTsKLSAgICAgfQotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA8PSBNb2RlRUdBKSB7Ci0gICAgICAgIGRhdGEgJj0gMHhjNzsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0JICAgZGF0YTIgPSBTaVNfUHItPkNTUkNsb2NrOwotCX0gZWxzZSB7Ci0gICAgICAgICAgIGRhdGEyID0gU2lTX0dldFZDTEsyUHRyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCxId0luZm8pOwotICAgICAgICAgICBkYXRhMiA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2RhdGEyXS5DTE9DSzsKLQl9CisgICB9IGVsc2UgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgfHwgKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgU0ZfNzYwTEZCKSkgewogCi0JZGF0YTMgPSBTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KSA+PiAxOwotCWlmKGRhdGEzKSBkYXRhMiAqPSBkYXRhMzsKKyAgICAgIGRhdGEgPSBTaVNfR2V0MzEwRFJBTVR5cGUoU2lTX1ByKTsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgeworCSBkYXRhID0gU2lTX1ByLT5TaVNfU1IxNVsoMiAqIDQpICsgZGF0YV07CisgICAgICB9IGVsc2UgeworCSBpZihTaVNfUHItPlNpU19ST01OZXcpCSAgICAgZGF0YSA9IFJPTUFkZHJbMHhmNl07CisJIGVsc2UgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSBkYXRhID0gUk9NQWRkclsweDEwMCArIGRhdGFdOworCSBlbHNlCQkJICAgICBkYXRhID0gMHhiYTsKKyAgICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlIDw9IE1vZGVFR0EpIHsKKwkgZGF0YSAmPSAweGM3OworICAgICAgfSBlbHNlIHsKKwkgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJICAgIGRhdGEyID0gU2lTX1ByLT5DU1JDbG9jazsKKwkgfSBlbHNlIHsKKwkgICAgZGF0YTIgPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKKwkgICAgZGF0YTIgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtkYXRhMl0uQ0xPQ0s7CisJIH0KIAotCWxvbmdkYXRhID0gU2lTX0dldE1DTEsoU2lTX1ByLCBId0luZm8pICogMTAyNDsKKwkgZGF0YTMgPSBTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpID4+IDE7CisJIGlmKGRhdGEzKSBkYXRhMiAqPSBkYXRhMzsKIAotCWRhdGEyID0gbG9uZ2RhdGEgLyBkYXRhMjsKKwkgZGF0YTIgPSAoKHVuc2lnbmVkIGludCkoU2lTX0dldE1DTEsoU2lTX1ByKSAqIDEwMjQpKSAvIGRhdGEyOwogCi0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMzMCkgewotCSAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlICE9IE1vZGUxNkJwcCkgewotICAgICAgICAgICAgICBpZiAgICAgKGRhdGEyID49IDB4MTljKSBkYXRhID0gMHhiYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4MTQwKSBkYXRhID0gMHg3YTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4MTAxKSBkYXRhID0gMHgzYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4ZjUpICBkYXRhID0gMHgzMjsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4ZTIpICBkYXRhID0gMHgyYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4YzQpICBkYXRhID0gMHgyMjsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4YWMpICBkYXRhID0gMHgxYTsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4OWUpICBkYXRhID0gMHgxMjsKLQkgICAgICBlbHNlIGlmKGRhdGEyID49IDB4OGUpICBkYXRhID0gMHgwYTsKLQkgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBkYXRhID0gMHgwMjsKLQkgICB9IGVsc2UgewotCSAgICAgIGlmKGRhdGEyID49IDB4MTI3KSAgICAgIGRhdGEgPSAweGJhOwotCSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAweDdhOwotCSAgIH0KLQl9IGVsc2UgeyAgLyogNzYwK0xGQiAqLwotCSAgIGlmICAgICAoZGF0YTIgPj0gMHgxOTApIGRhdGEgPSAweGJhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHhmZikgIGRhdGEgPSAweDdhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHhkMykgIGRhdGEgPSAweDNhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHhhOSkgIGRhdGEgPSAweDFhOwotCSAgIGVsc2UgaWYoZGF0YTIgPj0gMHg5MykgIGRhdGEgPSAweDBhOwotCSAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAweDAyOwotCX0KLSAgICAgfQotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNyxkYXRhKTsKLSAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zNDApIHsKLSAgICAgLyogVE9ETyAqLwotICB9CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkgeworCSAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSAhPSBNb2RlMTZCcHApIHsKKwkgICAgICAgaWYgICAgIChkYXRhMiA+PSAweDE5YykgZGF0YSA9IDB4YmE7CisJICAgICAgIGVsc2UgaWYoZGF0YTIgPj0gMHgxNDApIGRhdGEgPSAweDdhOworCSAgICAgICBlbHNlIGlmKGRhdGEyID49IDB4MTAxKSBkYXRhID0gMHgzYTsKKwkgICAgICAgZWxzZSBpZihkYXRhMiA+PSAweGY1KSAgZGF0YSA9IDB4MzI7CisJICAgICAgIGVsc2UgaWYoZGF0YTIgPj0gMHhlMikgIGRhdGEgPSAweDJhOworCSAgICAgICBlbHNlIGlmKGRhdGEyID49IDB4YzQpICBkYXRhID0gMHgyMjsKKwkgICAgICAgZWxzZSBpZihkYXRhMiA+PSAweGFjKSAgZGF0YSA9IDB4MWE7CisJICAgICAgIGVsc2UgaWYoZGF0YTIgPj0gMHg5ZSkgIGRhdGEgPSAweDEyOworCSAgICAgICBlbHNlIGlmKGRhdGEyID49IDB4OGUpICBkYXRhID0gMHgwYTsKKwkgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IDB4MDI7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGlmKGRhdGEyID49IDB4MTI3KSAgICAgIGRhdGEgPSAweGJhOworCSAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBkYXRhID0gMHg3YTsKKwkgICAgfQorCSB9IGVsc2UgeyAgLyogNzZ4K0xGQiAqLworCSAgICBpZiAgICAgKGRhdGEyID49IDB4MTkwKSBkYXRhID0gMHhiYTsKKwkgICAgZWxzZSBpZihkYXRhMiA+PSAweGZmKSAgZGF0YSA9IDB4N2E7CisJICAgIGVsc2UgaWYoZGF0YTIgPj0gMHhkMykgIGRhdGEgPSAweDNhOworCSAgICBlbHNlIGlmKGRhdGEyID49IDB4YTkpICBkYXRhID0gMHgxYTsKKwkgICAgZWxzZSBpZihkYXRhMiA+PSAweDkzKSAgZGF0YSA9IDB4MGE7CisJICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAweDAyOworCSB9CisgICAgICB9CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNyxkYXRhKTsKKworICAgfQorICAgICAgLyogWEdJOiBOb3RoaW5nLiAqLworICAgICAgLyogVE9ETzogQ2hlY2sgU2lTMzQwICovCiAjZW5kaWYKIAotICBkYXRhID0gMHg2MDsKLSAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgIT0gTW9kZVRleHQpIHsKLSAgICAgZGF0YSBePSAweDYwOwotICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSAhPSBNb2RlRUdBKSB7Ci0gICAgICAgIGRhdGEgXj0gMHhBMDsKLSAgICAgfQotICB9Ci0gIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MjEsMHgxRixkYXRhKTsKKyAgIGRhdGEgPSAweDYwOworICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgIT0gTW9kZVRleHQpIHsKKyAgICAgIGRhdGEgXj0gMHg2MDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlICE9IE1vZGVFR0EpIHsKKyAgICAgICAgIGRhdGEgXj0gMHhBMDsKKyAgICAgIH0KKyAgIH0KKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2M0LDB4MjEsMHgxRixkYXRhKTsKIAotICBTaVNfU2V0VkNMS1N0YXRlKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgTW9kZUlkSW5kZXgpOworICAgU2lTX1NldFZDTEtTdGF0ZShTaVNfUHIsIE1vZGVObywgUlJUSSwgTW9kZUlkSW5kZXgpOwogCiAjaWZkZWYgU0lTMzE1SAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMSkgJiAweDQwKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDUyLDB4MmMpOwotICAgICB9IGVsc2UgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1MiwweDZjKTsKLSAgICAgfQotICB9CisgICBpZigoKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpICYmIChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzY2MSkpIHx8CisgICAgICAgKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzQwKSkgeworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MCkgeworICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NTIsMHgyYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NTIsMHg2Yyk7CisgICAgICB9CisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfMjApIHsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSAmIDB4NDApIHsKKyAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDUyLDB4MzMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDUyLDB4NzMpOworICAgICAgfQorICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NTEsMHgwMik7CisgICB9CiAjZW5kaWYKIH0KIAorI2lmZGVmIFNJUzMxNUgKK3N0YXRpYyB2b2lkCitTaVNfU2V0dXBEdWFsQ2hpcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKK3sKKyNpZiAwCisgICAvKiBUT0RPOiBGaW5kIG91dCBhYm91dCBJT0FkZHJlc3MyICovCisgICBTSVNJT0FERFJFU1MgUDJfM2MyID0gU2lTX1ByLT5JT0FkZHJlc3MyICsgMHgxMjsKKyAgIFNJU0lPQUREUkVTUyBQMl8zYzQgPSBTaVNfUHItPklPQWRkcmVzczIgKyAweDE0OworICAgU0lTSU9BRERSRVNTIFAyXzNjZSA9IFNpU19Qci0+SU9BZGRyZXNzMiArIDB4MWU7CisgICBpbnQgaTsKKworICAgaWYoKFNpU19Qci0+Q2hpcFJldmlzaW9uICE9IDApIHx8CisgICAgICAoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzYSkgJiAweDA0KSkpCisgICAgICByZXR1cm47CisKKyAgIGZvcihpID0gMDsgaSA8PSA0OyBpKyspIHsJCQkJCS8qIFNSMDAgLSBTUjA0ICovCisgICAgICBTaVNfU2V0UmVnKFAyXzNjNCxpLFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxpKSk7CisgICB9CisgICBmb3IoaSA9IDA7IGkgPD0gODsgaSsrKSB7CQkJCQkvKiBHUjAwIC0gR1IwOCAqLworICAgICAgU2lTX1NldFJlZyhQMl8zY2UsaSxTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzY2UsaSkpOworICAgfQorICAgU2lTX1NldFJlZyhQMl8zYzQsMHgwNSwweDg2KTsKKyAgIFNpU19TZXRSZWcoUDJfM2M0LDB4MDYsU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDYpKTsJLyogU1IwNiAqLworICAgU2lTX1NldFJlZyhQMl8zYzQsMHgyMSxTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyMSkpOwkvKiBTUjIxICovCisgICBTaVNfU2V0UmVnQnl0ZShQMl8zYzIsU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYykpOwkvKiBNSVNDICovCisgICBTaVNfU2V0UmVnKFAyXzNjNCwweDA1LDB4MDApOworI2VuZGlmCit9CisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICBMT0FEIERBQyAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgMAogc3RhdGljIHZvaWQKLVNpU19DbGVhckRBQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVTE9ORyBwb3J0KQorU2lTX1dyaXRlREFDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNJT0FERFJFU1MgREFDRGF0YSwgdW5zaWduZWQgc2hvcnQgc2hpZnRmbGFnLAorICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRsLCB1bnNpZ25lZCBzaG9ydCBhaCwgdW5zaWduZWQgc2hvcnQgYWwsIHVuc2lnbmVkIHNob3J0IGRoKQogewotICAgaW50IGk7CisgICB1bnNpZ25lZCBzaG9ydCBkMSwgZDIsIGQzOwogCi0gICBPdXRQb3J0Qnl0ZShwb3J0LCAwKTsKLSAgIHBvcnQrKzsKLSAgIGZvciAoaT0wOyBpIDwgKDI1NiAqIDMpOyBpKyspIHsKLSAgICAgIE91dFBvcnRCeXRlKHBvcnQsIDApOworICAgc3dpdGNoKGRsKSB7CisgICBjYXNlICAwOiBkMSA9IGRoOyBkMiA9IGFoOyBkMyA9IGFsOyBicmVhazsKKyAgIGNhc2UgIDE6IGQxID0gYWg7IGQyID0gYWw7IGQzID0gZGg7IGJyZWFrOworICAgZGVmYXVsdDogZDEgPSBhbDsgZDIgPSBkaDsgZDMgPSBhaDsKICAgIH0KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotU2lTX1dyaXRlREFDKFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU0lPQUREUkVTUyBEQUNEYXRhLCBVU0hPUlQgc2hpZnRmbGFnLAotICAgICAgICAgICAgIFVTSE9SVCBkbCwgVVNIT1JUIGFoLCBVU0hPUlQgYWwsIFVTSE9SVCBkaCkKLXsKLSAgVVNIT1JUIHRlbXAsYmgsYmw7Ci0KLSAgYmggPSBhaDsKLSAgYmwgPSBhbDsKLSAgaWYoZGwgIT0gMCkgewotICAgICB0ZW1wID0gYmg7Ci0gICAgIGJoID0gZGg7Ci0gICAgIGRoID0gdGVtcDsKLSAgICAgaWYoZGwgPT0gMSkgewotICAgICAgICB0ZW1wID0gYmw7Ci0gICAgICAgIGJsID0gZGg7Ci0gICAgICAgIGRoID0gdGVtcDsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgdGVtcCA9IGJsOwotICAgICAgICBibCA9IGJoOwotICAgICAgICBiaCA9IHRlbXA7Ci0gICAgIH0KLSAgfQotICBpZihzaGlmdGZsYWcpIHsKLSAgICAgZGggPDw9IDI7Ci0gICAgIGJoIDw8PSAyOwotICAgICBibCA8PD0gMjsKLSAgfQotICBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLChVU0hPUlQpZGgpOwotICBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLChVU0hPUlQpYmgpOwotICBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLChVU0hPUlQpYmwpOworICAgU2lTX1NldFJlZ0J5dGUoREFDRGF0YSwgKGQxIDw8IHNoaWZ0ZmxhZykpOworICAgU2lTX1NldFJlZ0J5dGUoREFDRGF0YSwgKGQyIDw8IHNoaWZ0ZmxhZykpOworICAgU2lTX1NldFJlZ0J5dGUoREFDRGF0YSwgKGQzIDw8IHNoaWZ0ZmxhZykpOwogfQogCiB2b2lkCi1TaVNfTG9hZERBQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4KQorU2lTX0xvYWREQUMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gICBVU0hPUlQgZGF0YSxkYXRhMjsKLSAgIFVTSE9SVCB0aW1lLGksaixrLG0sbixvOwotICAgVVNIT1JUIHNpLGRpLGJ4LGRsLGFsLGFoLGRoOwotICAgVVNIT1JUIHNoaWZ0ZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGRhdGEsIGRhdGEyLCB0aW1lLCBpLCBqLCBrLCBtLCBuLCBvOworICAgdW5zaWduZWQgc2hvcnQgc2ksIGRpLCBieCwgc2Y7CiAgICBTSVNJT0FERFJFU1MgREFDQWRkciwgREFDRGF0YTsKLSAgIGNvbnN0IFVTSE9SVCAqdGFibGUgPSBOVUxMOworICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFibGUgPSBOVUxMOwogCi0gICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICAgZGF0YSA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICB9IGVsc2UgewotICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0JIGRhdGEgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBkYXRhID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgICB9Ci0gICB9CisgICBkYXRhID0gU2lTX0dldE1vZGVGbGFnKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCkgJiBEQUNJbmZvRmxhZzsKIAotICAgZGF0YSAmPSBEQUNJbmZvRmxhZzsKLSAgIHRpbWUgPSA2NDsKLSAgIGlmKGRhdGEgPT0gMHgwMCkgdGFibGUgPSBTaVNfTURBX0RBQzsKLSAgIGlmKGRhdGEgPT0gMHgwOCkgdGFibGUgPSBTaVNfQ0dBX0RBQzsKLSAgIGlmKGRhdGEgPT0gMHgxMCkgdGFibGUgPSBTaVNfRUdBX0RBQzsKLSAgIGlmKGRhdGEgPT0gMHgxOCkgeworICAgaiA9IHRpbWUgPSA2NDsKKyAgIGlmKGRhdGEgPT0gMHgwMCkgICAgICB0YWJsZSA9IFNpU19NREFfREFDOworICAgZWxzZSBpZihkYXRhID09IDB4MDgpIHRhYmxlID0gU2lTX0NHQV9EQUM7CisgICBlbHNlIGlmKGRhdGEgPT0gMHgxMCkgdGFibGUgPSBTaVNfRUdBX0RBQzsKKyAgIGVsc2UgaWYoZGF0YSA9PSAweDE4KSB7CisgICAgICBqID0gMTY7CiAgICAgICB0aW1lID0gMjU2OwogICAgICAgdGFibGUgPSBTaVNfVkdBX0RBQzsKICAgIH0KLSAgIGlmKHRpbWUgPT0gMjU2KSBqID0gMTY7Ci0gICBlbHNlICAgICAgICAgICAgaiA9IHRpbWU7CiAKICAgIGlmKCAoIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICYmICAgICAgICAvKiAzMDFCLURIIExDRCAqLwogICAgICAgICAgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSApICAgICAgICB8fAogICAgICAgIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSAgICAgICB8fCAgIC8qIExDREEgKi8KICAgICAgICAoIShTaVNfUHItPlNpU19TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSkgKSB7ICAvKiBQcm9ncmFtbWluZyBDUlQxICovCisgICAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOwogICAgICAgREFDQWRkciA9IFNpU19Qci0+U2lTX1AzYzg7CiAgICAgICBEQUNEYXRhID0gU2lTX1ByLT5TaVNfUDNjOTsKLSAgICAgIHNoaWZ0ZmxhZyA9IDA7Ci0gICAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOworICAgICAgc2YgPSAwOwogICAgfSBlbHNlIHsKLSAgICAgIHNoaWZ0ZmxhZyA9IDE7CiAgICAgICBEQUNBZGRyID0gU2lTX1ByLT5TaVNfUGFydDVQb3J0OwogICAgICAgREFDRGF0YSA9IFNpU19Qci0+U2lTX1BhcnQ1UG9ydCArIDE7CisgICAgICBzZiA9IDI7CiAgICB9CiAKICAgIFNpU19TZXRSZWdCeXRlKERBQ0FkZHIsMHgwMCk7CiAKLSAgIGZvcihpPTA7IGk8ajsgaSsrKSB7CisgICBmb3IoaSA9IDA7IGkgPCBqOyBpKyspIHsKICAgICAgIGRhdGEgPSB0YWJsZVtpXTsKLSAgICAgIGZvcihrPTA7IGs8MzsgaysrKSB7CisgICAgICBmb3IoayA9IDA7IGsgPCAzOyBrKyspIHsKIAlkYXRhMiA9IDA7Ci0JaWYoZGF0YSAmIDB4MDEpIGRhdGEyID0gMHgyQTsKKwlpZihkYXRhICYgMHgwMSkgZGF0YTIgKz0gMHgyQTsKIAlpZihkYXRhICYgMHgwMikgZGF0YTIgKz0gMHgxNTsKLQlpZihzaGlmdGZsYWcpIGRhdGEyIDw8PSAyOwotCVNpU19TZXRSZWdCeXRlKERBQ0RhdGEsIGRhdGEyKTsKKwlTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLCAoZGF0YTIgPDwgc2YpKTsKIAlkYXRhID4+PSAyOwogICAgICAgfQogICAgfQogCiAgICBpZih0aW1lID09IDI1NikgewogICAgICAgZm9yKGkgPSAxNjsgaSA8IDMyOyBpKyspIHsKLSAgIAkgZGF0YSA9IHRhYmxlW2ldOwotCSBpZihzaGlmdGZsYWcpIGRhdGEgPDw9IDI7CisJIGRhdGEgPSB0YWJsZVtpXSA8PCBzZjsKIAkgZm9yKGsgPSAwOyBrIDwgMzsgaysrKSBTaVNfU2V0UmVnQnl0ZShEQUNEYXRhLCBkYXRhKTsKICAgICAgIH0KICAgICAgIHNpID0gMzI7CiAgICAgICBmb3IobSA9IDA7IG0gPCA5OyBtKyspIHsKLSAgICAgICAgIGRpID0gc2k7Ci0gICAgICAgICBieCA9IHNpICsgNDsKLSAgICAgICAgIGRsID0gMDsKLSAgICAgICAgIGZvcihuID0gMDsgbiA8IDM7IG4rKykgewotICAJICAgIGZvcihvID0gMDsgbyA8IDU7IG8rKykgewotCSAgICAgICBkaCA9IHRhYmxlW3NpXTsKLQkgICAgICAgYWggPSB0YWJsZVtkaV07Ci0JICAgICAgIGFsID0gdGFibGVbYnhdOworCSBkaSA9IHNpOworCSBieCA9IHNpICsgNDsKKwkgZm9yKG4gPSAwOyBuIDwgMzsgbisrKSB7CisJICAgIGZvcihvID0gMDsgbyA8IDU7IG8rKykgeworCSAgICAgICBTaVNfV3JpdGVEQUMoU2lTX1ByLCBEQUNEYXRhLCBzZiwgbiwgdGFibGVbZGldLCB0YWJsZVtieF0sIHRhYmxlW3NpXSk7CiAJICAgICAgIHNpKys7Ci0JICAgICAgIFNpU19Xcml0ZURBQyhTaVNfUHIsIERBQ0RhdGEsIHNoaWZ0ZmxhZywgZGwsIGFoLCBhbCwgZGgpOwogCSAgICB9CiAJICAgIHNpIC09IDI7CiAJICAgIGZvcihvID0gMDsgbyA8IDM7IG8rKykgewotCSAgICAgICBkaCA9IHRhYmxlW2J4XTsKLQkgICAgICAgYWggPSB0YWJsZVtkaV07Ci0JICAgICAgIGFsID0gdGFibGVbc2ldOworCSAgICAgICBTaVNfV3JpdGVEQUMoU2lTX1ByLCBEQUNEYXRhLCBzZiwgbiwgdGFibGVbZGldLCB0YWJsZVtzaV0sIHRhYmxlW2J4XSk7CiAJICAgICAgIHNpLS07Ci0JICAgICAgIFNpU19Xcml0ZURBQyhTaVNfUHIsIERBQ0RhdGEsIHNoaWZ0ZmxhZywgZGwsIGFoLCBhbCwgZGgpOwogCSAgICB9Ci0JICAgIGRsKys7CiAJIH0gICAgICAgICAgICAvKiBmb3IgbiA8IDMgKi8KIAkgc2kgKz0gNTsKICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgbSA8IDkgKi8KQEAgLTMyNDEsODkgKzI5NzIsMTE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDFHcm91cChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpCitTaVNfU2V0Q1JUMUdyb3VwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgIFN0YW5kVGFibGVJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXg7CisgICB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleDsKIAotICBTaVNfUHItPlNpU19DUlQxTW9kZSA9IE1vZGVObzsKLSAgU3RhbmRUYWJsZUluZGV4ID0gU2lTX0dldE1vZGVQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKLSAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExvd01vZGVUZXN0cykgewotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU3dpdGNoQ1JUMikpIHsKLSAgICAgICAgU2lTX0Rpc2FibGVCcmlkZ2UoU2lTX1ByLCBId0luZm8pOwotICAgICB9Ci0gIH0KKyAgIFNpU19Qci0+U2lTX0NSVDFNb2RlID0gTW9kZU5vOwogCi0gIFNpU19SZXNldFNlZ21lbnRSZWdpc3RlcnMoU2lTX1ByLCBId0luZm8pOworICAgU3RhbmRUYWJsZUluZGV4ID0gU2lTX0dldE1vZGVQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICBTaVNfU2V0U2VxUmVncyhTaVNfUHIsIFN0YW5kVGFibGVJbmRleCwgSHdJbmZvKTsKLSAgU2lTX1NldE1pc2NSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4LCBId0luZm8pOwotICBTaVNfU2V0Q1JUQ1JlZ3MoU2lTX1ByLCBId0luZm8sIFN0YW5kVGFibGVJbmRleCk7Ci0gIFNpU19TZXRBVFRSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4LCBId0luZm8pOwotICBTaVNfU2V0R1JDUmVncyhTaVNfUHIsIFN0YW5kVGFibGVJbmRleCk7Ci0gIFNpU19DbGVhckV4dDFSZWdzKFNpU19QciwgSHdJbmZvLCBNb2RlTm8pOwotICBTaVNfUmVzZXRDUlQxVkNMSyhTaVNfUHIsIEh3SW5mbyk7CisgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU3dpdGNoQ1JUMikpIHsKKyAgICAgICAgIFNpU19EaXNhYmxlQnJpZGdlKFNpU19Qcik7CisgICAgICB9CisgICB9CiAKLSAgU2lTX1ByLT5TaVNfU2VsZWN0Q1JUMlJhdGUgPSAwOwotICBTaVNfUHItPlNpU19TZXRGbGFnICY9ICh+UHJvZ3JhbW1pbmdDUlQyKTsKKyAgIFNpU19SZXNldFNlZ21lbnRSZWdpc3RlcnMoU2lTX1ByKTsKIAotI2lmZGVmIExJTlVYX1hGODYKLSAgeGY4NkRydk1zZ1ZlcmIoMCwgWF9QUk9CRUQsIDQsICIoaW5pdDogVkJUeXBlPTB4JTA0eCwgVkJJbmZvPTB4JTA0eClcbiIsCisgICBTaVNfU2V0U2VxUmVncyhTaVNfUHIsIFN0YW5kVGFibGVJbmRleCk7CisgICBTaVNfU2V0TWlzY1JlZ3MoU2lTX1ByLCBTdGFuZFRhYmxlSW5kZXgpOworICAgU2lTX1NldENSVENSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4KTsKKyAgIFNpU19TZXRBVFRSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4KTsKKyAgIFNpU19TZXRHUkNSZWdzKFNpU19QciwgU3RhbmRUYWJsZUluZGV4KTsKKyAgIFNpU19DbGVhckV4dDFSZWdzKFNpU19QciwgTW9kZU5vKTsKKyAgIFNpU19SZXNldENSVDFWQ0xLKFNpU19Qcik7CisKKyAgIFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlID0gMDsKKyAgIFNpU19Qci0+U2lTX1NldEZsYWcgJj0gKH5Qcm9ncmFtbWluZ0NSVDIpOworCisjaWZkZWYgU0lTX1hPUkdfWEY4NgorICAgeGY4NkRydk1zZ1ZlcmIoMCwgWF9QUk9CRUQsIDQsICIoaW5pdDogVkJUeXBlPTB4JTA0eCwgVkJJbmZvPTB4JTA0eClcbiIsCiAgICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZCVHlwZSwgU2lTX1ByLT5TaVNfVkJJbmZvKTsKICNlbmRpZgogCi0gIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldFNpbXVTY2FuTW9kZSkgewotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRTaW11U2Nhbk1vZGUpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisgICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKKyAgICAgIH0KKyAgIH0KIAotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOwotICB9CisgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CisgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKKyAgIH0KIAotICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7CisgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogCi0gIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKLSAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyAmPSB+UHJvZ3JhbW1pbmdDUlQyOwotICB9CisgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CisgICAgICBTaVNfUHItPlNpU19TZXRGbGFnICY9IH5Qcm9ncmFtbWluZ0NSVDI7CisgICB9CiAKLSAgaWYoUmVmcmVzaFJhdGVUYWJsZUluZGV4ICE9IDB4RkZGRikgewotICAgICBTaVNfU2V0Q1JUMVN5bmMoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwotICAgICBTaVNfU2V0Q1JUMUNSVEMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7Ci0gICAgIFNpU19TZXRDUlQxT2Zmc2V0KFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOwotICAgICBTaVNfU2V0Q1JUMVZDTEsoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7Ci0gIH0KKyAgIGlmKFJlZnJlc2hSYXRlVGFibGVJbmRleCAhPSAweEZGRkYpIHsKKyAgICAgIFNpU19TZXRDUlQxU3luYyhTaVNfUHIsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBTaVNfU2V0Q1JUMUNSVEMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICAgU2lTX1NldENSVDFPZmZzZXQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICAgU2lTX1NldENSVDFWQ0xLKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKyAgIH0KIAorICAgc3dpdGNoKFNpU19Qci0+Q2hpcFR5cGUpIHsKICNpZmRlZiBTSVMzMDAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICBTaVNfU2V0Q1JUMUZJRk9fMzAwKFNpU19QciwgTW9kZU5vLEh3SW5mbyxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwotICB9IGVsc2UgaWYoKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgfHwKLSAgICAgICAgICAgIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNTQwKSkgewotICAgICBTaVNfU2V0Q1JUMUZJRk9fNjMwKFNpU19QciwgTW9kZU5vLCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7Ci0gIH0KKyAgIGNhc2UgU0lTXzMwMDoKKyAgICAgIFNpU19TZXRDUlQxRklGT18zMDAoU2lTX1ByLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBicmVhazsKKyAgIGNhc2UgU0lTXzU0MDoKKyAgIGNhc2UgU0lTXzYzMDoKKyAgIGNhc2UgU0lTXzczMDoKKyAgICAgIFNpU19TZXRDUlQxRklGT182MzAoU2lTX1ByLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBicmVhazsKICNlbmRpZgorICAgZGVmYXVsdDoKICNpZmRlZiBTSVMzMTVICi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIFNpU19TZXRDUlQxRklGT18zMTAoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8pOwotICB9CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkgeworICAgICAgICAgdW5zaWduZWQgY2hhciBzcjJiID0gMCwgc3IyYyA9IDA7CisgICAgICAgICBzd2l0Y2goTW9kZU5vKSB7CisJIGNhc2UgMHgwMDoKKwkgY2FzZSAweDAxOiBzcjJiID0gMHg0ZTsgc3IyYyA9IDB4ZTk7IGJyZWFrOworCSBjYXNlIDB4MDQ6CisJIGNhc2UgMHgwNToKKwkgY2FzZSAweDBkOiBzcjJiID0gMHgxYjsgc3IyYyA9IDB4ZTM7IGJyZWFrOworCSB9CisJIGlmKHNyMmIpIHsKKyAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDJiLHNyMmIpOworCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgyYyxzcjJjKTsKKwkgICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjMiwoU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjYykgfCAweDBjKSk7CisJIH0KKyAgICAgIH0KKyAgICAgIFNpU19TZXRDUlQxRklGT18zMTAoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICB9CisKKyAgIFNpU19TZXRDUlQxTW9kZVJlZ3MoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCisjaWZkZWYgU0lTMzE1SAorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfNDApIHsKKyAgICAgIFNpU19TZXR1cER1YWxDaGlwKFNpU19Qcik7CisgICB9CiAjZW5kaWYKIAotICBTaVNfU2V0Q1JUMU1vZGVSZWdzKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgU2lTX0xvYWREQUMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotICBTaVNfTG9hZERBQyhTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBNb2RlSWRJbmRleCk7Ci0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgaWYoU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlcikgewotICAgICBTaVNfQ2xlYXJCdWZmZXIoU2lTX1ByLEh3SW5mbyxNb2RlTm8pOwotICB9CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorICAgaWYoU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlcikgeworICAgICAgU2lTX0NsZWFyQnVmZmVyKFNpU19QciwgTW9kZU5vKTsKKyAgIH0KICNlbmRpZgogCi0gIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFN3aXRjaENSVDIgfCBTZXRDUlQyVG9MQ0RBKSkpIHsKLSAgICAgU2lTX1dhaXRSZXRyYWNlMShTaVNfUHIpOwotICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0gIH0KKyAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFN3aXRjaENSVDIgfCBTZXRDUlQyVG9MQ0RBKSkpIHsKKyAgICAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgICAgIFNpU19EaXNwbGF5T24oU2lTX1ByKTsKKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzMzEsMzMgKzMwODcsNjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfUmVzZXRWQihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0luaXRWQihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSICAqUk9NQWRkciAgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gICBVU0hPUlQgdGVtcDsKKyAgIHVuc2lnbmVkIGNoYXIgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCi0gICAvKiBWQiBwcm9ncmFtbWluZyBjbG9jayAqLwotICAgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7Ci0gICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKLSAgICAgICAgIHRlbXAgPSBST01BZGRyW1ZCMzEwRGF0YV8xXzJfT2Zmc2V0XSB8IDB4NDA7Ci0JIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgdGVtcCA9IFJPTUFkZHJbMHg4MF0gfCAweDQwOwotCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLHRlbXApOwotICAgICAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKLSAgICAgICAgIHRlbXAgPSBST01BZGRyWzB4N2VdIHwgMHg0MDsKLSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgdGVtcCA9IFJPTUFkZHJbMHg4MF0gfCAweDQwOwotCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLHRlbXApOworICAgU2lTX1ByLT5Jbml0X1A0XzBFID0gMDsKKyAgIGlmKFNpU19Qci0+U2lTX1JPTU5ldykgeworICAgICAgU2lTX1ByLT5Jbml0X1A0XzBFID0gUk9NQWRkclsweDgyXTsKKyAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV80MCkgeworICAgICAgaWYoU2lTX1ByLT5TaVNfWEdJUk9NKSB7CisgICAgICAgICBTaVNfUHItPkluaXRfUDRfMEUgPSBST01BZGRyWzB4ODBdOwogICAgICAgfQogICAgfQogfQogCitzdGF0aWMgdm9pZAorU2lTX1Jlc2V0VkIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisjaWZkZWYgU0lTMzE1SAorICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKKworICAgLyogVkIgcHJvZ3JhbW1pbmcgY2xvY2sgKi8KKyAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKKwkgdGVtcCA9IFJPTUFkZHJbVkIzMTBEYXRhXzFfMl9PZmZzZXRdIHwgMHg0MDsKKwkgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB0ZW1wID0gUk9NQWRkclsweDgwXSB8IDB4NDA7CisJIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsdGVtcCk7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxICYmIFNpU19Qci0+Q2hpcFR5cGUgPCBYR0lfMjApIHsKKwkgdGVtcCA9IFJPTUFkZHJbMHg3ZV0gfCAweDQwOworCSBpZihTaVNfUHItPlNpU19ST01OZXcpIHRlbXAgPSBST01BZGRyWzB4ODBdIHwgMHg0MDsKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMix0ZW1wKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV80MCkgeworICAgICAgdGVtcCA9IDB4NDA7CisgICAgICBpZihTaVNfUHItPlNpU19YR0lST00pIHRlbXAgfD0gUk9NQWRkclsweDdlXTsKKyAgICAgIC8qIENhbiB3ZSBkbyB0aGlzIG9uIGFueSBjaGlwc2V0PyAqLworICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMix0ZW1wKTsKKyAgIH0KKyNlbmRpZgorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICBIRUxQRVI6IFNFVCBWSURFTyBSRUdJU1RFUlMgICAgICAgKi8KKy8qICAgIEhFTFBFUjogU0VUIFZJREVPL0NBUFRVUkUgUkVHSVNURVJTICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1N0cmFuZ2VTdHVmZihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1N0cmFuZ2VTdHVmZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIGlmKChJU19TSVM2NTEpIHx8IChJU19TSVNNNjUwKSkgeworICAgLyogU2lTNjV4IGFuZCBYR0kgc2V0IHVwIHNvbWUgc29ydCBvZiAibG9jayBtb2RlIiBmb3IgdGV4dAorICAgICogd2hpY2ggbG9ja3MgQ1JUMiBpbiBzb21lIHdheSB0byBDUlQxIHRpbWluZy4gRGlzYWJsZQorICAgICogdGhpcyBoZXJlLgorICAgICovCisjaWZkZWYgU0lTMzE1SAorICAgaWYoKElTX1NJUzY1MSkgfHwgKElTX1NJU002NTApIHx8CisgICAgICBTaVNfUHItPkNoaXBUeXBlID09IFNJU18zNDAgfHwKKyAgICAgIFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzQwKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1ZpZENhcHQsIDB4M2YsIDB4MDApOyAgIC8qIEZpZGRsZSB3aXRoIGNhcHR1cmUgcmVncyAqLwogICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19WaWRDYXB0LCAweDAwLCAweDAwKTsKICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfVmlkUGxheSwgMHgwMCwgMHg4Nik7ICAgLyogKEJJT1MgZG9lcyBOT1QgdW5sb2NrKSAqLwpAQCAtMzM2NSw0OSArMzE1MCw5OSBAQAogICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19WaWRQbGF5LCAweDNmLCAweGVmKTsKICAgIH0KICAgIC8qICEhISBUaGlzIGRvZXMgbm90IHN1cHBvcnQgbW9kZXMgPCAweDEzICEhISAqLworI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgIFhGcmVlODY6IFNFVCBTQ1JFRU4gUElUQ0ggICAgICAgICAqLworLyogICAgIEhFTFBFUjogU0VUIEFHUCBUSU1JTkcgRk9SIFNpUzc2MCAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CiBzdGF0aWMgdm9pZAotU2lTX1NldFBpdGNoQ1JUMShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybikKK1NpU19IYW5kbGU3NjAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisjaWZkZWYgU0lTMzE1SAorICAgdW5zaWduZWQgaW50IHNvbWViYXNlOworICAgdW5zaWduZWQgY2hhciB0ZW1wMSwgdGVtcDIsIHRlbXAzOworCisgICBpZiggKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzc2MCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAoKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwgMHg1YykgJiAweGY4KSAhPSAweDgwKSB8fAorICAgICAgICghKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgU0ZfNzYwTEZCKSkgICAgICAgICAgICAgICAgIHx8CisgICAgICAgKCEoU2lTX1ByLT5TaVNfU3lzRmxhZ3MgJiBTRl83NjBVTUEpKSApCisgICAgICByZXR1cm47CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzb21lYmFzZSA9IHNpc2ZiX3JlYWRfbWlvX3BjaV93b3JkKFNpU19QciwgMHg3NCk7CisjZWxzZQorICAgc29tZWJhc2UgPSBwY2lSZWFkV29yZCgweDAwMDAxMDAwLCAweDc0KTsKKyNlbmRpZgorICAgc29tZWJhc2UgJj0gMHhmZmZmOworCisgICBpZihzb21lYmFzZSA9PSAwKSByZXR1cm47CisKKyAgIHRlbXAzID0gU2lTX0dldFJlZ0J5dGUoKHNvbWViYXNlICsgMHg4NSkpICYgMHhiNzsKKworICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MCkgeworICAgICAgdGVtcDEgPSAweDIxOworICAgICAgdGVtcDIgPSAweDAzOworICAgICAgdGVtcDMgfD0gMHgwODsKKyAgIH0gZWxzZSB7CisgICAgICB0ZW1wMSA9IDB4MjU7CisgICAgICB0ZW1wMiA9IDB4MGI7CisgICB9CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICBzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9ieXRlKFNpU19QciwgMHg3ZSwgdGVtcDEpOworICAgc2lzZmJfd3JpdGVfbmJyaWRnZV9wY2lfYnl0ZShTaVNfUHIsIDB4OGQsIHRlbXAyKTsKKyNlbHNlCisgICBwY2lXcml0ZUJ5dGUoMHgwMDAwMDAwMCwgMHg3ZSwgdGVtcDEpOworICAgcGNpV3JpdGVCeXRlKDB4MDAwMDAwMDAsIDB4OGQsIHRlbXAyKTsKKyNlbmRpZgorCisgICBTaVNfU2V0UmVnQnl0ZSgoc29tZWJhc2UgKyAweDg1KSwgdGVtcDMpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFgub3JnL1hGcmVlODY6IFNFVCBTQ1JFRU4gUElUQ0ggICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFNJU19YT1JHX1hGODYKK3N0YXRpYyB2b2lkCitTaVNfU2V0UGl0Y2hDUlQxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybikKIHsKICAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIFVTaG9ydCBIRGlzcGxheSA9IHBTaVMtPnNjcm5QaXRjaCA+PiAzOworICAgdW5zaWduZWQgc2hvcnQgSERpc3BsYXkgPSBwU2lTLT5zY3JuUGl0Y2ggPj4gMzsKIAogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MTMsKEhEaXNwbGF5ICYgMHhGRikpOwotICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRSwweEYwLChIRGlzcGxheT4+OCkpOworICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRSwweEYwLChIRGlzcGxheSA+PiA4KSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0UGl0Y2hDUlQyKFNpU19Qcml2YXRlICpTaVNfUHIsIFNjcm5JbmZvUHRyIHBTY3JuKQorU2lTX1NldFBpdGNoQ1JUMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4pCiB7CiAgICBTSVNQdHIgcFNpUyA9IFNJU1BUUihwU2Nybik7Ci0gICBVU2hvcnQgSERpc3BsYXkgPSBwU2lTLT5zY3JuUGl0Y2gyID4+IDM7CisgICB1bnNpZ25lZCBzaG9ydCBIRGlzcGxheSA9IHBTaVMtPnNjcm5QaXRjaDIgPj4gMzsKIAogICAgIC8qIFVubG9jayBDUlQyICovCiAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpCi0gICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRiwgMHgwMSk7CisgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkYsIDB4MDEpOwogICAgZWxzZQotICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MjQsIDB4MDEpOworICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDI0LCAweDAxKTsKIAogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwNywoSERpc3BsYXkgJiAweEZGKSk7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDksMHhGMCwoSERpc3BsYXkgPj4gOCkpOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldFBpdGNoKFNpU19Qcml2YXRlICpTaVNfUHIsIFNjcm5JbmZvUHRyIHBTY3JuKQorU2lTX1NldFBpdGNoKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybikKIHsKICAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKICAgIEJPT0xFQU4gaXNzbGF2ZW1vZGUgPSBGQUxTRTsKIAotICAgaWYoIChwU2lTLT5WQkZsYWdzICYgVkJfVklERU9CUklER0UpICYmCisgICBpZiggKHBTaVMtPlZCRmxhZ3MyICYgVkIyX1ZJREVPQlJJREdFKSAmJgogICAgICAgICggKChwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmCi0gICAgICAgICAgKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApICYgMHhhMCkgPT0gMHgyMCkgfHwKLSAgICAgICAgICgocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSAmJgorCSAgKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApICYgMHhhMCkgPT0gMHgyMCkgfHwKKwkgKChwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmCiAJICAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDUwKSA9PSAweDEwKSApICkgewogICAgICAgaXNzbGF2ZW1vZGUgPSBUUlVFOwogICAgfQpAQCAtMzQyNyw1OSArMzI2Miw1OSBAQAogLyogICAgICAgICAgICAgICAgIFNpU1NldE1vZGUoKSAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogLyogV2UgbmVlZCBwU2NybiBmb3Igc2V0dGluZyB0aGUgcGl0Y2ggY29ycmVjdGx5ICovCiBCT09MRUFOCi1TaVNTZXRNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sU2NybkluZm9QdHIgcFNjcm4sVVNIT1JUIE1vZGVObywgQk9PTEVBTiBkb3NldHBpdGNoKQorU2lTU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sIHVuc2lnbmVkIHNob3J0IE1vZGVObywgQk9PTEVBTiBkb3NldHBpdGNoKQogI2Vsc2UKIEJPT0xFQU4KLVNpU1NldE1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyxVU0hPUlQgTW9kZU5vKQorU2lTU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogI2VuZGlmCiB7Ci0gICBVU0hPUlQgIE1vZGVJZEluZGV4OwotICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gSHdJbmZvLT51bElPQWRkcmVzczsKLSAgIHVuc2lnbmVkIGNoYXIgYmFja3VwcmVnPTA7Ci0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICBVU0hPUlQgIEtlZXBMb2NrUmVnOwotICAgVUxPTkcgICB0ZW1wOworICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gU2lTX1ByLT5JT0FkZHJlc3M7CisgICB1bnNpZ25lZCBzaG9ydCBSZWFsTW9kZU5vLCBNb2RlSWRJbmRleDsKKyAgIHVuc2lnbmVkIGNoYXIgIGJhY2t1cHJlZyA9IDA7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorICAgdW5zaWduZWQgc2hvcnQgS2VlcExvY2tSZWc7CiAKICAgIFNpU19Qci0+VXNlQ3VzdG9tTW9kZSA9IEZBTFNFOwogICAgU2lTX1ByLT5DUlQxVXNlc0N1c3RvbU1vZGUgPSBGQUxTRTsKICNlbmRpZgogCi0gICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgIE1vZGVObyA9IDB4ZmU7Ci0gICB9Ci0KLSAgIFNpU0luaXRQdHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTUmVnSW5pdChTaVNfUHIsIEJhc2VBZGRyKTsKLSAgIFNpU19HZXRTeXNGbGFncyhTaVNfUHIsIEh3SW5mbyk7Ci0KLSNpZiBkZWZpbmVkKExJTlVYX1hGODYpICYmIChkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fQU1ENjRfXykpCi0gICBpZihwU2NybikgU2lTX1ByLT5TaVNfVkdBSU5GTyA9IFNpU19HZXRTZXRCSU9TU2NyYXRjaChwU2NybiwgMHg0ODksIDB4ZmYpOwotICAgZWxzZQotI2VuZGlmCi0gICAgICAgICBTaVNfUHItPlNpU19WR0FJTkZPID0gMHgxMTsKLQotICAgU2lTSW5pdFBDSWV0YyhTaVNfUHIsIEh3SW5mbyk7Ci0gICBTaVNTZXRMVkRTZXRjKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU0RldGVybWluZVJPTVVzYWdlKFNpU19QciwgSHdJbmZvKTsKLQogICAgU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlciA9IDA7CiAKLSAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworICAgICAgTW9kZU5vID0gMHhmZTsKKyAgIH0gZWxzZSB7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAogICAgICAgaWYoIShNb2RlTm8gJiAweDgwKSkgU2lTX1ByLT5TaVNfZmxhZ19jbGVhcmJ1ZmZlciA9IDE7CiAjZW5kaWYKICAgICAgIE1vZGVObyAmPSAweDdmOwogICAgfQogCi0jaWZkZWYgTElOVVhfS0VSTkVMCisgICAvKiBEb24ndCB1c2UgRlNUTiBtb2RlIGZvciBDUlQxICovCisgICBSZWFsTW9kZU5vID0gTW9kZU5vOworICAgaWYoTW9kZU5vID09IDB4NWIpIE1vZGVObyA9IDB4NTY7CisKKyAgIFNpU0luaXRQdHIoU2lTX1ByKTsKKyAgIFNpU1JlZ0luaXQoU2lTX1ByLCBCYXNlQWRkcik7CisgICBTaVNfR2V0U3lzRmxhZ3MoU2lTX1ByKTsKKworICAgU2lTX1ByLT5TaVNfVkdBSU5GTyA9IDB4MTE7CisjaWYgZGVmaW5lZChTSVNfWE9SR19YRjg2KSAmJiAoZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX0FNRDY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorICAgaWYocFNjcm4pIFNpU19Qci0+U2lTX1ZHQUlORk8gPSBTaVNfR2V0U2V0QklPU1NjcmF0Y2gocFNjcm4sIDB4NDg5LCAweGZmKTsKKyNlbmRpZgorCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAogICAgS2VlcExvY2tSZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSk7CiAjZW5kaWYKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA1LDB4ODYpOwogCi0gICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsIEh3SW5mbyk7CisgICBTaVNJbml0UENJZXRjKFNpU19Qcik7CisgICBTaVNTZXRMVkRTZXRjKFNpU19Qcik7CisgICBTaVNEZXRlcm1pbmVST01Vc2FnZShTaVNfUHIpOworCisgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIpOwogCiAgICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgICBpZighKFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByLCAmTW9kZU5vLCAmTW9kZUlkSW5kZXgpKSkgcmV0dXJuIEZBTFNFOwpAQCAtMzQ4NywxMyArMzMyMiwxMyBAQAogICAgICAgTW9kZUlkSW5kZXggPSAwOwogICAgfQogCi0gICBTaVNfR2V0VkJUeXBlKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19HZXRWQlR5cGUoU2lTX1ByKTsKIAogICAgLyogSW5pdC9yZXN0b3JlIHNvbWUgVkIgcmVnaXN0ZXJzICovCi0KLSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgIFNpU19SZXNldFZCKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19Jbml0VkIoU2lTX1ByKTsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgICAgU2lTX1Jlc2V0VkIoU2lTX1ByKTsKIAkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweDEwKTsKIAkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4MGMpOwogICAgICAgICAgYmFja3VwcmVnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpOwpAQCAtMzUwMywyMSArMzMzOCwyMCBAQAogICAgfQogCiAgICAvKiBHZXQgVkIgaW5mb3JtYXRpb24gKGNvbm5lY3RvcnMsIGNvbm5lY3RlZCBkZXZpY2VzKSAqLwotICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgPyAwIDogMSk7Ci0gICBTaVNfU2V0WVBiUHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTX1NldFRWTW9kZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisgICBTaVNfR2V0VkJJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgPyAwIDogMSk7CisgICBTaVNfU2V0WVBiUHIoU2lTX1ByKTsKKyAgIFNpU19TZXRUVk1vZGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIFNpU19HZXRMQ0RSZXNJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8pOwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICAvKiAzLiBDaGVjayBtZW1vcnkgc2l6ZSAoS2VybmVsIGZyYW1lYnVmZmVyIGRyaXZlciBvbmx5KSAqLwotICAgdGVtcCA9IFNpU19DaGVja01lbW9yeVNpemUoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgpOwotICAgaWYoIXRlbXApIHJldHVybigwKTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICAvKiBDaGVjayBtZW1vcnkgc2l6ZSAoa2VybmVsIGZyYW1lYnVmZmVyIGRyaXZlciBvbmx5KSAqLworICAgaWYoIVNpU19DaGVja01lbW9yeVNpemUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgfQogI2VuZGlmCiAKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICBTaVNfU2V0dXBDUjV4KFNpU19QciwgSHdJbmZvKTsKLSAgIH0KKyAgIFNpU19PcGVuQ1JUQyhTaVNfUHIpOwogCiAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIFNpU19Qci0+Q1JUMVVzZXNDdXN0b21Nb2RlID0gVFJVRTsKQEAgLTM1MzAsMzggKzMzNjQsNDEgQEAKICAgIC8qIFNldCBtb2RlIG9uIENSVDEgKi8KICAgIGlmKCAoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFNldENSVDJUb0xDREEpKSB8fAogICAgICAgICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFN3aXRjaENSVDIpKSApIHsKLSAgICAgIFNpU19TZXRDUlQxR3JvdXAoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgpOworICAgICAgU2lTX1NldENSVDFHcm91cChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogICAgfQogCiAgICAvKiBTZXQgbW9kZSBvbiBDUlQyICovCiAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU3dpdGNoQ1JUMiB8IFNldENSVDJUb0xDREEpKSB7CiAgICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSAgICB8fAotICAgICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyAgICAgPT0gMSkgfHwKLSAgICAgICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAgICE9IDApIHx8Ci0gICAgICAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTiAhPSAwKSApIHsKLSAgICAgICAgIFNpU19TZXRDUlQyR3JvdXAoU2lTX1ByLCBId0luZm8sIE1vZGVObyk7CisJICAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgICAgID09IDEpIHx8CisJICAoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAgICE9IDApIHx8CisJICAoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OICE9IDApICkgeworCSBTaVNfU2V0Q1JUMkdyb3VwKFNpU19QciwgUmVhbE1vZGVObyk7CiAgICAgICB9CiAgICB9CiAKICAgIFNpU19IYW5kbGVDUlQxKFNpU19Qcik7CiAKLSAgIFNpU19TdHJhbmdlU3R1ZmYoU2lTX1ByLCBId0luZm8pOworICAgU2lTX1N0cmFuZ2VTdHVmZihTaVNfUHIpOwogCiAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOwogCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMxNUgKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgIGlmKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLCBId0luZm8pKSkgeworCSBpZighKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsMHhmYik7CiAJIH0KICAgICAgIH0KICAgIH0KKyNlbmRpZgogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICAgICBpZighU2lTX1ByLT5TaVNfUk9NTmV3KSB7Ci0JICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CisgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisjaWZkZWYgU0lTMzE1SAorCSBpZighU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisJICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB7CiAJICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzUsMHgwMSk7CiAJICAgIH0gZWxzZSB7CiAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM1LDB4RkUpOwpAQCAtMzU3NCwyMyArMzQxMSwyNCBAQAogCSAgICBpZigoTW9kZU5vID09IDB4MDMpIHx8IChNb2RlTm8gPT0gMHgxMCkpIHsKIAkgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHg1MSwweDgwKTsKIAkgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzZDQsMHg1NiwweDA4KTsKLSAgICAgICAgICAgIH0KKwkgICAgfQogCSB9CiAKIAkgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApICYgU2V0Q1JUMlRvTENEKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM4LDB4ZmMpOwogCSB9Ci0gICAgICB9IGVsc2UgaWYoKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApKSB7Ci0gICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXByZWcpOworI2VuZGlmCisgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKKwkgICAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CisJIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1LGJhY2t1cHJlZyk7CiAgICAgICB9CiAgICB9CiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogICAgaWYocFNjcm4pIHsKICAgICAgIC8qIFNldFBpdGNoOiBBZGFwdCB0byB2aXJ0dWFsIHNpemUgJiBwb3NpdGlvbiAqLwogICAgICAgaWYoKE1vZGVObyA+IDB4MTMpICYmIChkb3NldHBpdGNoKSkgewotICAgICAgICAgU2lTX1NldFBpdGNoKFNpU19QciwgcFNjcm4pOworCSBTaVNfU2V0UGl0Y2goU2lTX1ByLCBwU2Nybik7CiAgICAgICB9CiAKICAgICAgIC8qIEJhY2t1cC9TZXQgTW9kZU5vIGluIEJJT1Mgc2NyYXRjaCBhcmVhICovCkBAIC0zNTk4LDMzICszNDM2LDM3IEBACiAgICB9CiAjZW5kaWYKIAotI2lmZGVmIExJTlVYX0tFUk5FTCAgLyogV2UgbmV2ZXIgbG9jayByZWdpc3RlcnMgaW4gWEY4NiAqLwotICAgaWYoS2VlcExvY2tSZWcgPT0gMHhBMSkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUsMHg4Nik7Ci0gICBlbHNlIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA1LDB4MDApOworICAgU2lTX0Nsb3NlQ1JUQyhTaVNfUHIpOworCisgICBTaVNfSGFuZGxlNzYwKFNpU19Qcik7CisKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisgICAvKiBXZSBuZXZlciBsb2NrIHJlZ2lzdGVycyBpbiBYRjg2ICovCisgICBpZihLZWVwTG9ja1JlZyAhPSAweEExKSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSwweDAwKTsKICNlbmRpZgogCiAgICByZXR1cm4gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgIFhGcmVlODY6IFNpU0JJT1NTZXRNb2RlKCkgICAgICAgICovCisvKiAgICAgICBYLm9yZy9YRnJlZTg2OiBTaVNCSU9TU2V0TW9kZSgpICAgICAqLwogLyogICAgICAgICAgIGZvciBub24tRHVhbC1IZWFkIG1vZGUgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogQk9PTEVBTgotU2lTQklPU1NldE1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgU2NybkluZm9QdHIgcFNjcm4sCitTaVNCSU9TU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sCiAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKQogewogICAgU0lTUHRyIHBTaVMgPSBTSVNQVFIocFNjcm4pOwotICAgVVNob3J0IE1vZGVObyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8gPSAwOwogCiAgICBTaVNfUHItPlVzZUN1c3RvbU1vZGUgPSBGQUxTRTsKIAogICAgaWYoKElzQ3VzdG9tKSAmJiAoU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKHBTY3JuLCBtb2RlLCBwU2lTLT5WQkZsYWdzKSkpIHsKIAogICAgICAgeGY4NkRydk1zZ1ZlcmIocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAzLCAiU2V0dGluZyBjdXN0b20gbW9kZSAlZHglZFxuIiwKLQkgCVNpU19Qci0+Q0hEaXNwbGF5LAorCQlTaVNfUHItPkNIRGlzcGxheSwKIAkJKG1vZGUtPkZsYWdzICYgVl9JTlRFUkxBQ0UgPyBTaVNfUHItPkNWRGlzcGxheSAqIDIgOgogCQkgICAobW9kZS0+RmxhZ3MgJiBWX0RCTFNDQU4gPyBTaVNfUHItPkNWRGlzcGxheSAvIDIgOgogCQkgICAgICBTaVNfUHItPkNWRGlzcGxheSkpKTsKQEAgLTM2MzIsMzIgKzM0NzQsMzMgQEAKICAgIH0gZWxzZSB7CiAKICAgICAgIC8qIERvbid0IG5lZWQgdmJmbGFncyBoZXJlOyBjaGVja3MgZG9uZSBlYXJsaWVyICovCi0gICAgICBNb2RlTm8gPSBTaVNfR2V0TW9kZU51bWJlcihwU2NybiwgbW9kZSwgMCk7CisgICAgICBNb2RlTm8gPSBTaVNfR2V0TW9kZU51bWJlcihwU2NybiwgbW9kZSwgcFNpUy0+VkJGbGFncyk7CiAgICAgICBpZighTW9kZU5vKSByZXR1cm4gRkFMU0U7CiAKICAgICAgIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywgIlNldHRpbmcgc3RhbmRhcmQgbW9kZSAweCV4XG4iLCBNb2RlTm8pOwogCiAgICB9CiAKLSAgIHJldHVybihTaVNTZXRNb2RlKFNpU19QciwgSHdJbmZvLCBwU2NybiwgTW9kZU5vLCBUUlVFKSk7CisgICByZXR1cm4oU2lTU2V0TW9kZShTaVNfUHIsIHBTY3JuLCBNb2RlTm8sIFRSVUUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgIFhGcmVlODY6IFNpU0JJT1NTZXRNb2RlQ1JUMigpICAgICAgICovCisvKiAgICBYLm9yZy9YRnJlZTg2OiBTaVNCSU9TU2V0TW9kZUNSVDIoKSAgICAqLwogLyogICAgICAgICAgIGZvciBEdWFsLUhlYWQgbW9kZXMgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIEJPT0xFQU4KLVNpU0JJT1NTZXRNb2RlQ1JUMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBTY3JuSW5mb1B0ciBwU2NybiwKK1NpU0JJT1NTZXRNb2RlQ1JUMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sCiAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKQogewotICAgVVNIT1JUICBNb2RlSWRJbmRleDsKLSAgIFNJU0lPQUREUkVTUyBCYXNlQWRkciA9IEh3SW5mby0+dWxJT0FkZHJlc3M7Ci0gICBVU2hvcnQgIE1vZGVObyAgID0gMDsKLSAgIHVuc2lnbmVkIGNoYXIgYmFja3VwcmVnPTA7Ci0gICBTSVNQdHIgIHBTaVMgICAgID0gU0lTUFRSKHBTY3JuKTsKKyAgIFNJU0lPQUREUkVTUyBCYXNlQWRkciA9IFNpU19Qci0+SU9BZGRyZXNzOworICAgU0lTUHRyICBwU2lTID0gU0lTUFRSKHBTY3JuKTsKICNpZmRlZiBTSVNEVUFMSEVBRAogICAgU0lTRW50UHRyIHBTaVNFbnQgPSBwU2lTLT5lbnRpdHlQcml2YXRlOwogI2VuZGlmCisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleDsKKyAgIHVuc2lnbmVkIHNob3J0IE1vZGVObyA9IDA7CisgICB1bnNpZ25lZCBjaGFyICBiYWNrdXByZWcgPSAwOwogCiAgICBTaVNfUHItPlVzZUN1c3RvbU1vZGUgPSBGQUxTRTsKIApAQCAtMzY3MiwyMiArMzUxNSwyNSBAQAogCiAgICB9IGVsc2UgewogCi0gICAgICAgICBNb2RlTm8gPSBTaVNfR2V0TW9kZU51bWJlcihwU2NybiwgbW9kZSwgMCk7Ci0gICAgICAgICBpZighTW9kZU5vKSByZXR1cm4gRkFMU0U7CisJIE1vZGVObyA9IFNpU19HZXRNb2RlTnVtYmVyKHBTY3JuLCBtb2RlLCBwU2lTLT5WQkZsYWdzKTsKKwkgaWYoIU1vZGVObykgcmV0dXJuIEZBTFNFOwogCiAgICB9CiAKICAgIFNpU1JlZ0luaXQoU2lTX1ByLCBCYXNlQWRkcik7Ci0gICBTaVNJbml0UHRyKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU19HZXRTeXNGbGFncyhTaVNfUHIsIEh3SW5mbyk7Ci0jaWYgKGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19BTUQ2NF9fKSkKKyAgIFNpU0luaXRQdHIoU2lTX1ByKTsKKyAgIFNpU19HZXRTeXNGbGFncyhTaVNfUHIpOworI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19BTUQ2NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQogICAgU2lTX1ByLT5TaVNfVkdBSU5GTyA9IFNpU19HZXRTZXRCSU9TU2NyYXRjaChwU2NybiwgMHg0ODksIDB4ZmYpOwogI2Vsc2UKICAgIFNpU19Qci0+U2lTX1ZHQUlORk8gPSAweDExOwogI2VuZGlmCi0gICBTaVNJbml0UENJZXRjKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU1NldExWRFNldGMoU2lTX1ByLCBId0luZm8pOwotICAgU2lTRGV0ZXJtaW5lUk9NVXNhZ2UoU2lTX1ByLCBId0luZm8pOworCisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSwweDg2KTsKKworICAgU2lTSW5pdFBDSWV0YyhTaVNfUHIpOworICAgU2lTU2V0TFZEU2V0YyhTaVNfUHIpOworICAgU2lTRGV0ZXJtaW5lUk9NVXNhZ2UoU2lTX1ByKTsKIAogICAgLyogU2F2ZSBtb2RlIGluZm8gc28gd2UgY2FuIHNldCBpdCBmcm9tIHdpdGhpbiBTZXRNb2RlIGZvciBDUlQxICovCiAjaWZkZWYgU0lTRFVBTEhFQUQKQEAgLTM3MDAsMjMgKzM1NDYsMjAgQEAKICAgICAgIHBTaVNFbnQtPkNSVDJDUjM1ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpOwogICAgICAgcFNpU0VudC0+Q1JUMkNSMzggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7CiAjaWYgMAotICAgICAgLyogV2UgY2FuJ3Qgc2V0IENSVDIgbW9kZSBiZWZvcmUgQ1JUMSBtb2RlIGlzIHNldCAqLworICAgICAgLyogV2UgY2FuJ3Qgc2V0IENSVDIgbW9kZSBiZWZvcmUgQ1JUMSBtb2RlIGlzIHNldCAtIHNheXMgd2hvLi4uPyAqLwogICAgICAgaWYocFNpU0VudC0+Q1JUMU1vZGVObyA9PSAtMSkgewotICAgIAkgeGY4NkRydk1zZ1ZlcmIocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAzLAorCSB4Zjg2RHJ2TXNnVmVyYihwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sIDMsCiAJCSJTZXR0aW5nIENSVDIgbW9kZSBkZWxheWVkIHVudGlsIGFmdGVyIHNldHRpbmcgQ1JUMSBtb2RlXG4iKTsKLSAgIAkgcmV0dXJuIFRSVUU7CisJIHJldHVybiBUUlVFOwogICAgICAgfQogI2VuZGlmCiAgICAgICBwU2lTRW50LT5DUlQyTW9kZVNldCA9IFRSVUU7CiAgICB9CiAjZW5kaWYKIAotICAgLyogV2UgZG9uJ3QgY2xlYXIgdGhlIGJ1ZmZlciBpbiBYICovCi0gICBTaVNfUHItPlNpU19mbGFnX2NsZWFyYnVmZmVyPTA7Ci0KICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCi0gICAgICBVU0hPUlQgdGVtcHRlbXAgPSBTaVNfUHItPkNWRGlzcGxheTsKKyAgICAgIHVuc2lnbmVkIHNob3J0IHRlbXB0ZW1wID0gU2lTX1ByLT5DVkRpc3BsYXk7CiAKICAgICAgIGlmKFNpU19Qci0+Q01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpICAgICB0ZW1wdGVtcCA+Pj0gMTsKICAgICAgIGVsc2UgaWYoU2lTX1ByLT5DSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKSB0ZW1wdGVtcCA8PD0gMTsKQEAgLTM3MjgsMTMgKzM1NzEsMTEgQEAKICAgIH0gZWxzZSB7CiAKICAgICAgIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKLSAgIAkgICJTZXR0aW5nIHN0YW5kYXJkIG1vZGUgMHgleCBvbiBDUlQyXG4iLCBNb2RlTm8pOworCSAgIlNldHRpbmcgc3RhbmRhcmQgbW9kZSAweCV4IG9uIENSVDJcbiIsIE1vZGVObyk7CiAKICAgIH0KIAotICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUsMHg4Nik7Ci0KLSAgIFNpU19VbkxvY2tDUlQyKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAKICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIGlmKCEoU2lTX1NlYXJjaE1vZGVJRChTaVNfUHIsICZNb2RlTm8sICZNb2RlSWRJbmRleCkpKSByZXR1cm4gRkFMU0U7CkBAIC0zNzQyLDU2ICszNTgzLDU5IEBACiAgICAgICBNb2RlSWRJbmRleCA9IDA7CiAgICB9CiAKLSAgIFNpU19HZXRWQlR5cGUoU2lTX1ByLCBId0luZm8pOworICAgU2lTX0dldFZCVHlwZShTaVNfUHIpOwogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JIFNpU19SZXNldFZCKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19Jbml0VkIoU2lTX1ByKTsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSBTaVNfUmVzZXRWQihTaVNfUHIpOwogCSBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4MTApOwogCSBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDAsMHgwYyk7Ci0gICAgICAgICBiYWNrdXByZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7CisJIGJhY2t1cHJlZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBiYWNrdXByZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7CisJIGJhY2t1cHJlZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KTsKICAgICAgIH0KICAgIH0KIAogICAgLyogR2V0IFZCIGluZm9ybWF0aW9uIChjb25uZWN0b3JzLCBjb25uZWN0ZWQgZGV2aWNlcykgKi8KICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgIFNpU19HZXRWQkluZm8oU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIDEpOworICAgICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIDEpOwogICAgfSBlbHNlIHsKICAgICAgIC8qIElmIHRoaXMgaXMgYSBjdXN0b20gbW9kZSwgd2UgZG9uJ3QgY2hlY2sgdGhlIG1vZGVmbGFnIGZvciBDUlQyTW9kZSAqLwotICAgICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgMCk7CisgICAgICBTaVNfR2V0VkJJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgMCk7CiAgICB9Ci0gICBTaVNfU2V0WVBiUHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTX1NldFRWTW9kZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisgICBTaVNfU2V0WVBiUHIoU2lTX1ByKTsKKyAgIFNpU19TZXRUVk1vZGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIFNpU19HZXRMQ0RSZXNJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8pOworCisgICBTaVNfUmVzZXRTZWdtZW50UmVnaXN0ZXJzKFNpU19Qcik7CiAKICAgIC8qIFNldCBtb2RlIG9uIENSVDIgKi8KICAgIGlmKCAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpICAgIHx8CiAgICAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTICAgICA9PSAxKSB8fAogICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICAgIT0gMCkgfHwKICAgICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OICE9IDApICkgewotICAgICAgU2lTX1NldENSVDJHcm91cChTaVNfUHIsIEh3SW5mbywgTW9kZU5vKTsKKyAgICAgIFNpU19TZXRDUlQyR3JvdXAoU2lTX1ByLCBNb2RlTm8pOwogICAgfQogCi0gICBTaVNfU3RyYW5nZVN0dWZmKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU19TdHJhbmdlU3R1ZmYoU2lTX1ByKTsKIAogICAgU2lTX0Rpc3BsYXlPbihTaVNfUHIpOwogICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjNiwweEZGKTsKIAotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgIGlmKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLCBId0luZm8pKSkgeworCSBpZighKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsMHhmYik7CiAJIH0KICAgICAgIH0KICAgIH0KIAotICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgICAgaWYoIVNpU19Qci0+U2lTX1JPTU5ldykgewotCSAgICBpZihTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpIHsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSBpZighU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisJICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB7CiAJICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzUsMHgwMSk7CiAJICAgIH0gZWxzZSB7CiAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM1LDB4RkUpOwpAQCAtMzgwMyw4ICszNjQ3LDggQEAKIAkgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApICYgU2V0Q1JUMlRvTENEKSB7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM4LDB4ZmMpOwogCSB9Ci0gICAgICB9IGVsc2UgaWYoKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApKSB7CisgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKKwkgICAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CiAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXByZWcpOwogICAgICAgfQogICAgfQpAQCAtMzgxMiwyNSArMzY1NiwyNyBAQAogICAgLyogU2V0UGl0Y2g6IEFkYXB0IHRvIHZpcnR1YWwgc2l6ZSAmIHBvc2l0aW9uICovCiAgICBTaVNfU2V0UGl0Y2hDUlQyKFNpU19QciwgcFNjcm4pOwogCisgICBTaVNfSGFuZGxlNzYwKFNpU19Qcik7CisKICAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgWEZyZWU4NjogU2lTQklPU1NldE1vZGVDUlQxKCkgICAgICAgKi8KKy8qICAgIFgub3JnL1hGcmVlODY6IFNpU0JJT1NTZXRNb2RlQ1JUMSgpICAgICovCiAvKiAgICAgICAgICAgZm9yIER1YWwtSGVhZCBtb2RlcyAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogQk9PTEVBTgotU2lTQklPU1NldE1vZGVDUlQxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFNjcm5JbmZvUHRyIHBTY3JuLAorU2lTQklPU1NldE1vZGVDUlQxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybiwKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKQogeworICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gU2lTX1ByLT5JT0FkZHJlc3M7CiAgICBTSVNQdHIgIHBTaVMgPSBTSVNQVFIocFNjcm4pOwotICAgU0lTSU9BRERSRVNTIEJhc2VBZGRyID0gSHdJbmZvLT51bElPQWRkcmVzczsKLSAgIFVTSE9SVCAgTW9kZUlkSW5kZXgsIE1vZGVObz0wOwotICAgVUNIQVIgYmFja3VwcmVnPTA7CisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgTW9kZU5vID0gMDsKKyAgIHVuc2lnbmVkIGNoYXIgIGJhY2t1cHJlZyA9IDA7CiAjaWZkZWYgU0lTRFVBTEhFQUQKICAgIFNJU0VudFB0ciBwU2lTRW50ID0gcFNpUy0+ZW50aXR5UHJpdmF0ZTsKLSAgIFVDSEFSIGJhY2t1cGNyMzAsIGJhY2t1cGNyMzEsIGJhY2t1cGNyMzgsIGJhY2t1cGNyMzUsIGJhY2t1cHA0MGQ9MDsKKyAgIHVuc2lnbmVkIGNoYXIgIGJhY2t1cGNyMzAsIGJhY2t1cGNyMzEsIGJhY2t1cGNyMzgsIGJhY2t1cGNyMzUsIGJhY2t1cHA0MGQ9MDsKICAgIEJPT0xFQU4gYmFja3VwY3VzdG9tOwogI2VuZGlmCiAKQEAgLTM4MzgsNDMgKzM2ODQsNDEgQEAKIAogICAgaWYoKElzQ3VzdG9tKSAmJiAoU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKHBTY3JuLCBtb2RlLCBwU2lTLT5WQkZsYWdzKSkpIHsKIAotICAgICAgICAgVVNIT1JUIHRlbXB0ZW1wID0gU2lTX1ByLT5DVkRpc3BsYXk7CisJIHVuc2lnbmVkIHNob3J0IHRlbXB0ZW1wID0gU2lTX1ByLT5DVkRpc3BsYXk7CiAKLSAgICAgICAgIGlmKFNpU19Qci0+Q01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpICAgICB0ZW1wdGVtcCA+Pj0gMTsKLSAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5DSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKSB0ZW1wdGVtcCA8PD0gMTsKKwkgaWYoU2lTX1ByLT5DTW9kZUZsYWcgJiBEb3VibGVTY2FuTW9kZSkgICAgIHRlbXB0ZW1wID4+PSAxOworCSBlbHNlIGlmKFNpU19Qci0+Q0luZm9GbGFnICYgSW50ZXJsYWNlTW9kZSkgdGVtcHRlbXAgPDw9IDE7CiAKLSAgICAgICAgIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKKwkgeGY4NkRydk1zZ1ZlcmIocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAzLAogCSAJIlNldHRpbmcgY3VzdG9tIG1vZGUgJWR4JWQgb24gQ1JUMVxuIiwKIAkgCVNpU19Qci0+Q0hEaXNwbGF5LCB0ZW1wdGVtcCk7CiAJIE1vZGVObyA9IDB4ZmU7CiAKICAgIH0gZWxzZSB7CiAKLSAgICAgICAgIE1vZGVObyA9IFNpU19HZXRNb2RlTnVtYmVyKHBTY3JuLCBtb2RlLCAwKTsKLSAgICAgICAgIGlmKCFNb2RlTm8pIHJldHVybiBGQUxTRTsKKwkgTW9kZU5vID0gU2lTX0dldE1vZGVOdW1iZXIocFNjcm4sIG1vZGUsIDApOyAvKiBkb24ndCBnaXZlIFZCRmxhZ3MgKi8KKwkgaWYoIU1vZGVObykgcmV0dXJuIEZBTFNFOwogCi0gICAgICAgICB4Zjg2RHJ2TXNnVmVyYihwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sIDMsCisJIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKIAkgCSJTZXR0aW5nIHN0YW5kYXJkIG1vZGUgMHgleCBvbiBDUlQxXG4iLCBNb2RlTm8pOwogICAgfQogCi0gICBTaVNJbml0UHRyKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU0luaXRQdHIoU2lTX1ByKTsKICAgIFNpU1JlZ0luaXQoU2lTX1ByLCBCYXNlQWRkcik7Ci0gICBTaVNfR2V0U3lzRmxhZ3MoU2lTX1ByLCBId0luZm8pOwotI2lmIChkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fQU1ENjRfXykpCisgICBTaVNfR2V0U3lzRmxhZ3MoU2lTX1ByKTsKKyNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fQU1ENjRfXykgfHwgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKICAgIFNpU19Qci0+U2lTX1ZHQUlORk8gPSBTaVNfR2V0U2V0QklPU1NjcmF0Y2gocFNjcm4sIDB4NDg5LCAweGZmKTsKICNlbHNlCiAgICBTaVNfUHItPlNpU19WR0FJTkZPID0gMHgxMTsKICNlbmRpZgotICAgU2lTSW5pdFBDSWV0YyhTaVNfUHIsIEh3SW5mbyk7Ci0gICBTaVNTZXRMVkRTZXRjKFNpU19QciwgSHdJbmZvKTsKLSAgIFNpU0RldGVybWluZVJPTVVzYWdlKFNpU19QciwgSHdJbmZvKTsKLQotICAgLyogV2UgZG9uJ3QgY2xlYXIgdGhlIGJ1ZmZlciBpbiBYICovCi0gICBTaVNfUHItPlNpU19mbGFnX2NsZWFyYnVmZmVyID0gMDsKIAogICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUsMHg4Nik7CiAKLSAgIFNpU19VbkxvY2tDUlQyKFNpU19QciwgSHdJbmZvKTsKKyAgIFNpU0luaXRQQ0lldGMoU2lTX1ByKTsKKyAgIFNpU1NldExWRFNldGMoU2lTX1ByKTsKKyAgIFNpU0RldGVybWluZVJPTVVzYWdlKFNpU19Qcik7CisKKyAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAKICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKICAgICAgIGlmKCEoU2lTX1NlYXJjaE1vZGVJRChTaVNfUHIsICZNb2RlTm8sICZNb2RlSWRJbmRleCkpKSByZXR1cm4gRkFMU0U7CkBAIC0zODgzLDEwICszNzI3LDExIEBACiAgICB9CiAKICAgIC8qIERldGVybWluZSBWQlR5cGUgKi8KLSAgIFNpU19HZXRWQlR5cGUoU2lTX1ByLCBId0luZm8pOworICAgU2lTX0dldFZCVHlwZShTaVNfUHIpOwogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICBTaVNfSW5pdFZCKFNpU19Qcik7CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgICAgIGJhY2t1cHJlZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiYWNrdXByZWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7CkBAIC0zODk1LDI1ICszNzQwLDI5IEBACiAKICAgIC8qIEdldCBWQiBpbmZvcm1hdGlvbiAoY29ubmVjdG9ycywgY29ubmVjdGVkIGRldmljZXMpICovCiAgICAvKiAoV2UgZG9uJ3QgY2FyZSBpZiB0aGUgY3VycmVudCBtb2RlIGlzIGEgQ1JUMiBtb2RlKSAqLwotICAgU2lTX0dldFZCSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgMCk7Ci0gICBTaVNfU2V0WVBiUHIoU2lTX1ByLCBId0luZm8pOwotICAgU2lTX1NldFRWTW9kZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7Ci0gICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisgICBTaVNfR2V0VkJJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgMCk7CisgICBTaVNfU2V0WVBiUHIoU2lTX1ByKTsKKyAgIFNpU19TZXRUVk1vZGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgIFNpU19HZXRMQ0RSZXNJbmZvKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0TG93TW9kZVRlc3QoU2lTX1ByLCBNb2RlTm8pOwogCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgU2lTX1NldHVwQ1I1eChTaVNfUHIsIEh3SW5mbyk7Ci0gICB9CisgICBTaVNfT3BlbkNSVEMoU2lTX1ByKTsKIAogICAgLyogU2V0IG1vZGUgb24gQ1JUMSAqLwotICAgU2lTX1NldENSVDFHcm91cChTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisgICBTaVNfU2V0Q1JUMUdyb3VwKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgICBTaVNfU2V0Q1JUMkdyb3VwKFNpU19QciwgSHdJbmZvLCBNb2RlTm8pOworICAgICAgU2lTX1NldENSVDJHcm91cChTaVNfUHIsIE1vZGVObyk7CiAgICB9CiAKICAgIC8qIFNldFBpdGNoOiBBZGFwdCB0byB2aXJ0dWFsIHNpemUgJiBwb3NpdGlvbiAqLwogICAgU2lTX1NldFBpdGNoQ1JUMShTaVNfUHIsIHBTY3JuKTsKIAorICAgU2lTX0hhbmRsZUNSVDEoU2lTX1ByKTsKKworICAgU2lTX1N0cmFuZ2VTdHVmZihTaVNfUHIpOworCisgICBTaVNfQ2xvc2VDUlRDKFNpU19Qcik7CisKICNpZmRlZiBTSVNEVUFMSEVBRAogICAgaWYocFNpUy0+RHVhbEhlYWRNb2RlKSB7CiAgICAgICBwU2lTRW50LT5DUlQxTW9kZU5vID0gTW9kZU5vOwpAQCAtMzkzMyw3ICszNzgyLDcgQEAKICNpZmRlZiBTSVNEVUFMSEVBRAogICAgaWYocFNpUy0+RHVhbEhlYWRNb2RlKSB7CiAgICAgICBpZihwU2lTRW50LT5DUlQyTW9kZU5vICE9IC0xKSB7Ci0gICAgICAgICB4Zjg2RHJ2TXNnVmVyYihwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sIDMsCisJIHhmODZEcnZNc2dWZXJiKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywgMywKIAkJCQkiKFJlLSlTZXR0aW5nIG1vZGUgZm9yIENSVDJcbiIpOwogCSBiYWNrdXBjdXN0b20gPSBTaVNfUHItPlVzZUN1c3RvbU1vZGU7CiAJIGJhY2t1cGNyMzAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CkBAIC0zOTUyLDkgKzM4MDEsMTEgQEAKIAkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUscFNpU0VudC0+Q1JUMkNSMzUpOwogCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCxwU2lTRW50LT5DUlQyQ1IzOCk7CiAJIH0KLQkgU2lTQklPU1NldE1vZGVDUlQyKFNpU19QciwgSHdJbmZvLCBwU2lTRW50LT5wU2Nybl8xLAorCisJIFNpU0JJT1NTZXRNb2RlQ1JUMihTaVNfUHIsIHBTaVNFbnQtPnBTY3JuXzEsCiAJCQkgICAgcFNpU0VudC0+Q1JUMkRNb2RlLCBwU2lTRW50LT5DUlQySXNDdXN0b20pOwotICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzAsYmFja3VwY3IzMCk7CisKKwkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzAsYmFja3VwY3IzMCk7CiAJIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxLGJhY2t1cGNyMzEpOwogCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXBjcjM1KTsKIAkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgsYmFja3VwY3IzOCk7CkBAIC0zOTcwLDIyICszODIxLDIwIEBACiAgICAgKiBwb3NzaWJseSBvdmVyd3JpdHRlbgogICAgICovCiAKLSAgIFNpU19IYW5kbGVDUlQxKFNpU19Qcik7Ci0KLSAgIFNpU19TdHJhbmdlU3R1ZmYoU2lTX1ByLCBId0luZm8pOwotCiAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICBTaVNfU2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2M2LDB4RkYpOwogCi0gICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAkgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgsYmFja3VwcmVnKTsKLSAgICAgIH0gZWxzZSBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKLSAgICAgICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKKyAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAorICAgICAgICAgICAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CiAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSxiYWNrdXByZWcpOwogICAgICAgfQogICAgfQogCisgICBTaVNfSGFuZGxlNzYwKFNpU19Qcik7CisKICAgIC8qIEJhY2t1cC9TZXQgTW9kZU5vIGluIEJJT1Mgc2NyYXRjaCBhcmVhICovCiAgICBTaVNfR2V0U2V0TW9kZUlEKHBTY3JuLE1vZGVObyk7CiAKQEAgLTM5OTMsODQgKzM4NDIsNiBAQAogfQogI2VuZGlmIC8qIExpbnV4X1hGODYgKi8KIAotCi0jaWZkZWYgTElOVVhfWEY4NgotQk9PTEVBTgotU2lTX0dldFBhbmVsSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKLXsKLSAgY29uc3QgVVNIT1JUIFBhbmVsVHlwZVRhYmxlMzAwWzE2XSA9IHsKLSAgICAgIDB4YzEwMSwgMHhjMTE3LCAweDAxMjEsIDB4YzEzNSwgMHhjMTQyLCAweGMxNTIsIDB4YzE2MiwgMHhjMDcyLAotICAgICAgMHhjMTgxLCAweGMxOTIsIDB4YzFhMSwgMHhjMWI2LCAweGMxYzIsIDB4YzBkMiwgMHhjMWUyLCAweGMxZjIKLSAgfTsKLSAgY29uc3QgVVNIT1JUIFBhbmVsVHlwZVRhYmxlMzEwMzB4WzE2XSA9IHsKLSAgICAgIDB4YzEwMiwgMHhjMTEyLCAweDAxMjIsIDB4YzEzMiwgMHhjMTQyLCAweGMxNTIsIDB4YzE2OSwgMHhjMTc5LAotICAgICAgMHgwMTg5LCAweGMxOTIsIDB4YzFhMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKLSAgfTsKLSAgY29uc3QgVVNIT1JUIFBhbmVsVHlwZVRhYmxlMzEwTFZEU1sxNl0gPSB7Ci0gICAgICAweGMxMTEsIDB4YzEyMiwgMHhjMTMzLCAweGMxNDQsIDB4YzE1NSwgMHhjMTY2LCAweGMxNzcsIDB4YzE4OCwKLSAgICAgIDB4YzE5OSwgMHhjMGFhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCi0gIH07Ci0gIFVTSE9SVCB0ZW1wYXgsdGVtcGJ4LHRlbXA7Ci0KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotCi0gICAgIHRlbXBheCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE4KTsKLSAgICAgdGVtcGJ4ID0gdGVtcGF4ICYgMHgwRjsKLSAgICAgaWYoISh0ZW1wYXggJiAweDEwKSl7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpewotICAgICAgICAgICB0ZW1wYnggPSAwOwotICAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzgpOwotICAgICAgICAgICBpZih0ZW1wICYgMHg0MCkgdGVtcGJ4IHw9IDB4MDg7Ci0gICAgICAgICAgIGlmKHRlbXAgJiAweDIwKSB0ZW1wYnggfD0gMHgwMjsKLSAgICAgICAgICAgaWYodGVtcCAmIDB4MDEpIHRlbXBieCB8PSAweDAxOwotICAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzkpOwotICAgICAgICAgICBpZih0ZW1wICYgMHg4MCkgdGVtcGJ4IHw9IDB4MDQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAgdGVtcGJ4ID0gUGFuZWxUeXBlVGFibGUzMDBbdGVtcGJ4XTsKLSAgICAgdGVtcGJ4IHw9IExDRFN5bmM7Ci0gICAgIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM2LHRlbXApOwotICAgICB0ZW1wID0gKHRlbXBieCAmIDB4RkYwMCkgPj4gODsKLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgzNyx+KExDRFN5bmNCaXR8TENEUkdCMThCaXQpLHRlbXApOwotCi0gIH0gZWxzZSB7Ci0KLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgcmV0dXJuIDA7Ci0KLSAgICAgdGVtcGF4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWEpOwotICAgICB0ZW1wYXggJj0gMHgxZTsKLSAgICAgdGVtcGF4ID4+PSAxOwotICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7Ci0gICAgICAgIGlmKHRlbXBheCA9PSAwKSB7Ci0gICAgICAgICAgIC8qIFRPRE86IEluY2x1ZGUgSFVHRSBkZXRlY3Rpb24gcm91dGluZQotCSAgICAgICAgICAgIChQcm9iYWJseSBub3Qgd29ydGggYm90aGVyaW5nKQotCSAgICAqLwotICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICB0ZW1wID0gdGVtcGF4ICYgMHhmZjsKLSAgICAgICAgdGVtcGF4LS07Ci0gICAgICAgIHRlbXBieCA9IFBhbmVsVHlwZVRhYmxlMzEwTFZEU1t0ZW1wYXhdOwotICAgICB9IGVsc2UgewotICAgICAgICB0ZW1wYnggPSBQYW5lbFR5cGVUYWJsZTMxMDMweFt0ZW1wYXhdOwotICAgICAgICB0ZW1wID0gdGVtcGJ4ICYgMHhmZjsKLSAgICAgfQotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNix0ZW1wKTsKLSAgICAgdGVtcGJ4ID0gKHRlbXBieCAmIDB4ZmYwMCkgPj4gODsKLSAgICAgdGVtcCA9IHRlbXBieCAmIDB4YzE7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MzcsfihMQ0RTeW5jQml0fExDRFJHQjE4Qml0KSx0ZW1wKTsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgICAgdGVtcCA9IHRlbXBieCAmIDB4MDQ7Ci0gICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MzksMHhmYix0ZW1wKTsKLSAgICAgfQotCi0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQogI2lmbmRlZiBHRVRCSVRTVFIKICNkZWZpbmUgQklUTUFTSyhoLGwpICAgIAkoKCh1bnNpZ25lZCkoMVUgPDwgKChoKS0obCkrMSkpLTEpPDwobCkpCiAjZGVmaW5lIEdFTk1BU0sobWFzaykgICAJQklUTUFTSygxP21hc2ssMD9tYXNrKQpAQCAtNDA3OCwyNiArMzg0OSwyOCBAQAogI2RlZmluZSBHRVRCSVRTVFIodmFsLGZyb20sdG8pICAoKEdFVEJJVFModmFsLGZyb20pKSA8PCAoMD90bykpCiAjZW5kaWYKIAotc3RhdGljIHZvaWQKLVNpU19DYWxjQ1JSZWdpc3RlcnMoU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGRlcHRoKQordm9pZAorU2lTX0NhbGNDUlJlZ2lzdGVycyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGRlcHRoKQogeworICAgaW50IHggPSAxOyAvKiBGaXggc3luYyAqLworCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1swXSAgPSAgKChTaVNfUHItPkNIVG90YWwgPj4gMykgLSA1KSAmIDB4ZmY7CQkvKiBDUjAgKi8KICAgIFNpU19Qci0+Q0NSVDFDUlRDWzFdICA9ICAoU2lTX1ByLT5DSERpc3BsYXkgPj4gMykgLSAxOwkJCS8qIENSMSAqLwogICAgU2lTX1ByLT5DQ1JUMUNSVENbMl0gID0gIChTaVNfUHItPkNIQmxhbmtTdGFydCA+PiAzKSAtIDE7CQkJLyogQ1IyICovCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1szXSAgPSAgKCgoU2lTX1ByLT5DSEJsYW5rRW5kID4+IDMpIC0gMSkgJiAweDFGKSB8IDB4ODA7CS8qIENSMyAqLwogICAgU2lTX1ByLT5DQ1JUMUNSVENbNF0gID0gIChTaVNfUHItPkNIU3luY1N0YXJ0ID4+IDMpICsgMzsJCQkvKiBDUjQgKi8KICAgIFNpU19Qci0+Q0NSVDFDUlRDWzVdICA9ICAoKCgoU2lTX1ByLT5DSEJsYW5rRW5kID4+IDMpIC0gMSkgJiAweDIwKSA8PCAyKSB8CS8qIENSNSAqLwotICAgICAgIAkJCSAgICAoKChTaVNfUHItPkNIU3luY0VuZCA+PiAzKSArIDMpICYgMHgxRik7CisJCQkgICAgKCgoU2lTX1ByLT5DSFN5bmNFbmQgPj4gMykgKyAzKSAmIDB4MUYpOwogCi0gICBTaVNfUHItPkNDUlQxQ1JUQ1s2XSAgPSAgKFNpU19Qci0+Q1ZUb3RhbCAtIDIpICYgMHhGRjsJCQkvKiBDUjYgKi8KLSAgIFNpU19Qci0+Q0NSVDFDUlRDWzddICA9ICAoKChTaVNfUHItPkNWVG90YWwgLSAyKSAmIDB4MTAwKSA+PiA4KQkJLyogQ1I3ICovCi0gCSAJCSAgfCAoKChTaVNfUHItPkNWRGlzcGxheSAtIDEpICYgMHgxMDApID4+IDcpCi0JIAkJICB8ICgoU2lTX1ByLT5DVlN5bmNTdGFydCAmIDB4MTAwKSA+PiA2KQotCSAJICAJICB8ICgoKFNpU19Qci0+Q1ZCbGFua1N0YXJ0IC0gMSkgJiAweDEwMCkgPj4gNSkKKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzZdICA9ICAoU2lTX1ByLT5DVlRvdGFsICAgICAgIC0gMikgJiAweEZGOwkJCS8qIENSNiAqLworICAgU2lTX1ByLT5DQ1JUMUNSVENbN10gID0gICgoKFNpU19Qci0+Q1ZUb3RhbCAgICAgLSAyKSAmIDB4MTAwKSA+PiA4KQkJLyogQ1I3ICovCisJCQkgIHwgKCgoU2lTX1ByLT5DVkRpc3BsYXkgICAtIDEpICYgMHgxMDApID4+IDcpCisJCQkgIHwgKCgoU2lTX1ByLT5DVlN5bmNTdGFydCAtIHgpICYgMHgxMDApID4+IDYpCisJCQkgIHwgKCgoU2lTX1ByLT5DVkJsYW5rU3RhcnQtIDEpICYgMHgxMDApID4+IDUpCiAJCQkgIHwgMHgxMAotCSAJCSAgfCAoKChTaVNfUHItPkNWVG90YWwgLSAyKSAmIDB4MjAwKSAgID4+IDQpCi0JIAkJICB8ICgoKFNpU19Qci0+Q1ZEaXNwbGF5IC0gMSkgJiAweDIwMCkgPj4gMykKLQkgCQkgIHwgKChTaVNfUHItPkNWU3luY1N0YXJ0ICYgMHgyMDApID4+IDIpOworCQkJICB8ICgoKFNpU19Qci0+Q1ZUb3RhbCAgICAgLSAyKSAmIDB4MjAwKSA+PiA0KQorCQkJICB8ICgoKFNpU19Qci0+Q1ZEaXNwbGF5ICAgLSAxKSAmIDB4MjAwKSA+PiAzKQorCQkJICB8ICgoKFNpU19Qci0+Q1ZTeW5jU3RhcnQgLSB4KSAmIDB4MjAwKSA+PiAyKTsKIAogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTZdID0gKCgoKFNpU19Qci0+Q1ZCbGFua1N0YXJ0IC0gMSkgJiAweDIwMCkgPj4gNCkgPj4gNSk7IAkvKiBDUjkgKi8KIApAQCAtNDEwNiw1NSArMzg3OSw0NCBAQAogICAgICAgZWxzZSBpZihTaVNfUHItPkNIRGlzcGxheSA+PSA2NDApICBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0gfD0gMHg0MDsKICAgIH0KIAotI2lmIDAKLSAgIGlmIChtb2RlLT5WU2NhbiA+PSAzMikKLQlyZWdwLT5DUlRDWzldIHw9IDB4MUY7Ci0gICBlbHNlIGlmIChtb2RlLT5WU2NhbiA+IDEpCi0JcmVncC0+Q1JUQ1s5XSB8PSBtb2RlLT5WU2NhbiAtIDE7Ci0jZW5kaWYKLQotICAgU2lTX1ByLT5DQ1JUMUNSVENbOF0gPSAgKFNpU19Qci0+Q1ZTeW5jU3RhcnQgICAgICkgJiAweEZGOwkJCS8qIENSMTAgKi8KLSAgIFNpU19Qci0+Q0NSVDFDUlRDWzldID0gICgoU2lTX1ByLT5DVlN5bmNFbmQgICAgICApICYgMHgwRikgfCAweDgwOwkJLyogQ1IxMSAqLworICAgU2lTX1ByLT5DQ1JUMUNSVENbOF0gPSAgKFNpU19Qci0+Q1ZTeW5jU3RhcnQgIC0geCkgJiAweEZGOwkJCS8qIENSMTAgKi8KKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzldID0gICgoU2lTX1ByLT5DVlN5bmNFbmQgICAtIHgpICYgMHgwRikgfCAweDgwOwkJLyogQ1IxMSAqLwogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTBdID0gKFNpU19Qci0+Q1ZEaXNwbGF5ICAgIC0gMSkgJiAweEZGOwkJCS8qIENSMTIgKi8KICAgIFNpU19Qci0+Q0NSVDFDUlRDWzExXSA9IChTaVNfUHItPkNWQmxhbmtTdGFydCAtIDEpICYgMHhGRjsJCQkvKiBDUjE1ICovCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1sxMl0gPSAoU2lTX1ByLT5DVkJsYW5rRW5kICAgLSAxKSAmIDB4RkY7CQkJLyogQ1IxNiAqLwogCiAgICBTaVNfUHItPkNDUlQxQ1JUQ1sxM10gPQkJCQkJCQkvKiBTUkEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVlRvdGFsICAgICAtMiksIDEwOjEwLCAwOjApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVkRpc3BsYXkgICAtMSksIDEwOjEwLCAxOjEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rU3RhcnQtMSksIDEwOjEwLCAyOjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNTdGFydCAgICksIDEwOjEwLCAzOjMpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rRW5kICAtMSksICAgODo4LCA0OjQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNFbmQgICAgICksICAgNDo0LCA1OjUpIDsKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVlRvdGFsICAgICAtMiksIDEwOjEwLCAwOjApIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVkRpc3BsYXkgICAtMSksIDEwOjEwLCAxOjEpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rU3RhcnQtMSksIDEwOjEwLCAyOjIpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNTdGFydCAteCksIDEwOjEwLCAzOjMpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVkJsYW5rRW5kICAtMSksICAgODo4LCA0OjQpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DVlN5bmNFbmQgICAgICksICAgNDo0LCA1OjUpIDsKIAogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTRdID0JCQkJCQkJLyogU1JCICovCi0gICAgICAgICAgICAgICAgICAgICAgICBHRVRCSVRTVFIoKFNpU19Qci0+Q0hUb3RhbCAgICAgID4+IDMpIC0gNSwgOTo4LCAxOjApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVEJJVFNUUigoU2lTX1ByLT5DSERpc3BsYXkgICAgPj4gMykgLSAxLCA5OjgsIDM6MikgfAotICAgICAgICAgICAgICAgICAgICAgICAgR0VUQklUU1RSKChTaVNfUHItPkNIQmxhbmtTdGFydCA+PiAzKSAtIDEsIDk6OCwgNTo0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRCSVRTVFIoKFNpU19Qci0+Q0hTeW5jU3RhcnQgID4+IDMpICsgMywgOTo4LCA3OjYpIDsKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DSFRvdGFsICAgICAgPj4gMykgLSA1LCA5OjgsIDE6MCkgfAorCQkJR0VUQklUU1RSKChTaVNfUHItPkNIRGlzcGxheSAgICA+PiAzKSAtIDEsIDk6OCwgMzoyKSB8CisJCQlHRVRCSVRTVFIoKFNpU19Qci0+Q0hCbGFua1N0YXJ0ID4+IDMpIC0gMSwgOTo4LCA1OjQpIHwKKwkJCUdFVEJJVFNUUigoU2lTX1ByLT5DSFN5bmNTdGFydCAgPj4gMykgKyAzLCA5OjgsIDc6NikgOwogCiAKICAgIFNpU19Qci0+Q0NSVDFDUlRDWzE1XSA9CQkJCQkJCS8qIFNSQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUQklUU1RSKChTaVNfUHItPkNIQmxhbmtFbmQgPj4gMykgLSAxLCA3OjYsIDE6MCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgR0VUQklUU1RSKChTaVNfUHItPkNIU3luY0VuZCAgPj4gMykgKyAzLCA1OjUsIDI6MikgOworCQkJR0VUQklUU1RSKChTaVNfUHItPkNIQmxhbmtFbmQgPj4gMykgLSAxLCA3OjYsIDE6MCkgfAorCQkJR0VUQklUU1RSKChTaVNfUHItPkNIU3luY0VuZCAgPj4gMykgKyAzLCA1OjUsIDI6MikgOwogfQogCiB2b2lkCi1TaVNfQ2FsY0xDREFDUlQxVGltaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTaVNfQ2FsY0xDREFDUlQxVGltaW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICAgVVNIT1JUIG1vZGVmbGFnLCB0ZW1wYXgsIHRlbXBieCwgVkdBSERFID0gU2lTX1ByLT5TaVNfVkdBSERFOwotICAgaW50IGksajsKKyAgIHVuc2lnbmVkIHNob3J0IG1vZGVmbGFnLCB0ZW1wYXgsIHRlbXBieCA9IDAsIHJlbWFpbmluZyA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBWR0FIREUgPSBTaVNfUHItPlNpU19WR0FIREU7CisgICBpbnQgaSwgajsKIAogICAgLyogMToxIGRhdGE6IHVzZSBkYXRhIHNldCBieSBzZXRjcnQxY3J0YygpICovCiAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSByZXR1cm47CiAKLSAgIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLSAgIH0gZWxzZSBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICB9CisgICBtb2RlZmxhZyA9IFNpU19HZXRNb2RlRmxhZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogCiAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSBWR0FIREUgPj49IDE7CiAKQEAgLTQxNjQsMzIgKzM5MjYsOTEgQEAKICAgIFNpU19Qci0+Q1ZEaXNwbGF5ID0gU2lTX1ByLT5TaVNfVkdBVkRFOwogICAgU2lTX1ByLT5DVkJsYW5rU3RhcnQgPSBTaVNfUHItPlNpU19WR0FWREU7CiAKLSAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxIVCAtIFNpU19Qci0+UGFuZWxYUmVzOwotICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOyAgLyogbm90IC8yICEgKi8KLSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7Ci0gICAgICB0ZW1wYXggPSBTaVNfUHItPlBhbmVsWFJlczsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMwMAorICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBSFQ7CisgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgeworICAgICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5QYW5lbEhUOworICAgICAgfQorICAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGJ4ID4+PSAxOworICAgICAgcmVtYWluaW5nID0gdGVtcGJ4ICUgODsKKyNlbmRpZgorICAgfSBlbHNlIHsKKyNpZmRlZiBTSVMzMTVICisgICAgICAvKiBPSyBmb3IgTENEQSwgTFZEUyAqLworICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5QYW5lbEhUIC0gU2lTX1ByLT5QYW5lbFhSZXM7CisgICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIREU7ICAvKiBub3QgLzIgISAqLworICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKyAgICAgICAgIHRlbXBheCA9IFNpU19Qci0+UGFuZWxYUmVzOworICAgICAgfQorICAgICAgdGVtcGJ4ICs9IHRlbXBheDsKKyAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBieCAtPSBWR0FIREU7CisjZW5kaWYKICAgIH0KLSAgIHRlbXBieCArPSB0ZW1wYXg7Ci0gICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYnggLT0gVkdBSERFOwogICAgU2lTX1ByLT5DSFRvdGFsID0gU2lTX1ByLT5DSEJsYW5rRW5kID0gdGVtcGJ4OwogCi0gICB0ZW1wYXggPSBWR0FIREU7Ci0gICB0ZW1wYnggPSBTaVNfUHItPkNIVG90YWw7Ci0gICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5QYW5lbFhSZXM7Ci0gICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYnggPj49IDE7Ci0gICAgICB0ZW1wYXggKz0gKCh0ZW1wYnggLSB0ZW1wYXgpID4+IDEpOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisjaWZkZWYgU0lTMzAwCisgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPT0gU2lTX1ByLT5QYW5lbFhSZXMpIHsKKwkgU2lTX1ByLT5DSFN5bmNTdGFydCA9IFNpU19Qci0+U2lTX1ZHQUhERSArICgoU2lTX1ByLT5QYW5lbEhSUyArIDEpICYgfjEpOworCSBTaVNfUHItPkNIU3luY0VuZCA9IFNpU19Qci0+Q0hTeW5jU3RhcnQgKyBTaVNfUHItPlBhbmVsSFJFOworCSBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB7CisJICAgIFNpU19Qci0+Q0hTeW5jU3RhcnQgPj49IDE7CisJICAgIFNpU19Qci0+Q0hTeW5jRW5kID4+PSAxOworCSB9CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKwkgdGVtcGF4ID0gKFNpU19Qci0+UGFuZWxYUmVzIC0gU2lTX1ByLT5TaVNfVkdBSERFKSA+PiAxOworCSB0ZW1wYnggPSAoU2lTX1ByLT5QYW5lbEhSUyArIDEpICYgfjE7CisJIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKKwkgICAgdGVtcGF4ID4+PSAxOworCSAgICB0ZW1wYnggPj49IDE7CisJIH0KKwkgU2lTX1ByLT5DSFN5bmNTdGFydCA9IChWR0FIREUgKyB0ZW1wYXggKyB0ZW1wYnggKyA3KSAmIH43OworCSB0ZW1wYXggPSBTaVNfUHItPlBhbmVsSFJFICsgNzsKKwkgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGF4ID4+PSAxOworCSBTaVNfUHItPkNIU3luY0VuZCA9IChTaVNfUHItPkNIU3luY1N0YXJ0ICsgdGVtcGF4KSAmIH43OworICAgICAgfSBlbHNlIHsKKwkgU2lTX1ByLT5DSFN5bmNTdGFydCA9IFNpU19Qci0+U2lTX1ZHQUhERTsKKwkgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgeworCSAgICBTaVNfUHItPkNIU3luY1N0YXJ0ID4+PSAxOworCSAgICB0ZW1wYXggPSAoKFNpU19Qci0+Q0hUb3RhbCAtIFNpU19Qci0+Q0hTeW5jU3RhcnQpIC8gMykgPDwgMTsKKwkgICAgU2lTX1ByLT5DSFN5bmNFbmQgPSBTaVNfUHItPkNIU3luY1N0YXJ0ICsgdGVtcGF4OworCSB9IGVsc2UgeworCSAgICBTaVNfUHItPkNIU3luY0VuZCA9IChTaVNfUHItPkNIU3luY1N0YXJ0ICsgKFNpU19Qci0+Q0hUb3RhbCAvIDEwKSArIDcpICYgfjc7CisJICAgIFNpU19Qci0+Q0hTeW5jU3RhcnQgKz0gODsKKwkgfQorICAgICAgfQorI2VuZGlmCisgICB9IGVsc2UgeworI2lmZGVmIFNJUzMxNUgKKyAgICAgIHRlbXBheCA9IFZHQUhERTsKKyAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJIHRlbXBieCA9IFNpU19Qci0+UGFuZWxYUmVzOworCSBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYnggPj49IDE7CisJIHRlbXBheCArPSAoKHRlbXBieCAtIHRlbXBheCkgPj4gMSk7CisgICAgICB9CisgICAgICB0ZW1wYXggKz0gU2lTX1ByLT5QYW5lbEhSUzsKKyAgICAgIFNpU19Qci0+Q0hTeW5jU3RhcnQgPSB0ZW1wYXg7CisgICAgICB0ZW1wYXggKz0gU2lTX1ByLT5QYW5lbEhSRTsKKyAgICAgIFNpU19Qci0+Q0hTeW5jRW5kID0gdGVtcGF4OworI2VuZGlmCiAgICB9CiAKLSAgIHRlbXBheCArPSBTaVNfUHItPlBhbmVsSFJTOwotICAgU2lTX1ByLT5DSFN5bmNTdGFydCA9IHRlbXBheDsKLSAgIHRlbXBheCArPSBTaVNfUHItPlBhbmVsSFJFOwotICAgU2lTX1ByLT5DSFN5bmNFbmQgPSB0ZW1wYXg7Ci0KICAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxWVCAtIFNpU19Qci0+UGFuZWxZUmVzOwogICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBVkRFOwogICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKICAgICAgIHRlbXBheCA9IFNpU19Qci0+UGFuZWxZUmVzOworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworI2lmZGVmIFNJUzMwMAorICAgICAgLyogU3R1cGlkIGhhY2sgZm9yIDY0MHg0MDAvMzIweDIwMCAqLworICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgeworCSBpZigodGVtcGF4ICsgdGVtcGJ4KSA9PSA0MzgpIHRlbXBieCArPSAxNjsKKyAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF84MDB4NjAwKSB8fAorCQkoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDYwMCkpIHsKKwkgdGVtcGF4ID0gMDsKKwkgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBVlQ7CisgICAgICB9CisjZW5kaWYKICAgIH0KICAgIFNpU19Qci0+Q1ZUb3RhbCA9IFNpU19Qci0+Q1ZCbGFua0VuZCA9IHRlbXBieCArIHRlbXBheDsKIApAQCAtNDIwMSwyMiArNDAyMiwyOCBAQAogICAgU2lTX1ByLT5DVlN5bmNTdGFydCA9IHRlbXBheDsKICAgIHRlbXBheCArPSBTaVNfUHItPlBhbmVsVlJFOwogICAgU2lTX1ByLT5DVlN5bmNFbmQgPSB0ZW1wYXg7CisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgIFNpU19Qci0+Q1ZTeW5jU3RhcnQtLTsKKyAgICAgIFNpU19Qci0+Q1ZTeW5jRW5kLS07CisgICB9CiAKICAgIFNpU19DYWxjQ1JSZWdpc3RlcnMoU2lTX1ByLCA4KTsKKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzE1XSAmPSB+MHhGODsKKyAgIFNpU19Qci0+Q0NSVDFDUlRDWzE1XSB8PSAocmVtYWluaW5nIDw8IDQpOwogICAgU2lTX1ByLT5DQ1JUMUNSVENbMTZdICY9IH4weEUwOwogCiAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsMHgxMSwweDdmKTsKIAotICAgZm9yKGk9MCxqPTA7aTw9NztpKyssaisrKSB7CisgICBmb3IoaSA9IDAsIGogPSAwOyBpIDw9IDc7IGkrKywgaisrKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaixTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7CiAgICB9Ci0gICBmb3Ioaj0weDEwO2k8PTEwO2krKyxqKyspIHsKKyAgIGZvcihqID0gMHgxMDsgaSA8PSAxMDsgaSsrLCBqKyspIHsKICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCxqLFNpU19Qci0+Q0NSVDFDUlRDW2ldKTsKICAgIH0KLSAgIGZvcihqPTB4MTU7aTw9MTI7aSsrLGorKykgeworICAgZm9yKGogPSAweDE1OyBpIDw9IDEyOyBpKyssIGorKykgewogICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LGosU2lTX1ByLT5DQ1JUMUNSVENbaV0pOwogICAgfQotICAgZm9yKGo9MHgwQTtpPD0xNTtpKyssaisrKSB7CisgICBmb3IoaiA9IDB4MEE7IGkgPD0gMTU7IGkrKywgaisrKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsaixTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7CiAgICB9CiAKQEAgLTQyMjcsMTA5MiArNDA1NCwxOTIgQEAKICAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXBheCB8PSAweDgwOwogICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgwOSwweDVGLHRlbXBheCk7CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIlZCAlZCAlZCAlZCAgJWQgJWQgJWQgJWQgICglZCAlZCAlZCAlZClcbiIsCi0gICAgICAgCVNpU19Qci0+Q0hEaXNwbGF5LCBTaVNfUHItPkNIU3luY1N0YXJ0LCBTaVNfUHItPkNIU3luY0VuZCwgU2lTX1ByLT5DSFRvdGFsLAorCVNpU19Qci0+Q0hEaXNwbGF5LCBTaVNfUHItPkNIU3luY1N0YXJ0LCBTaVNfUHItPkNIU3luY0VuZCwgU2lTX1ByLT5DSFRvdGFsLAogCVNpU19Qci0+Q1ZEaXNwbGF5LCBTaVNfUHItPkNWU3luY1N0YXJ0LCBTaVNfUHItPkNWU3luY0VuZCwgU2lTX1ByLT5DVlRvdGFsLAogCVNpU19Qci0+Q0hCbGFua1N0YXJ0LCBTaVNfUHItPkNIQmxhbmtFbmQsIFNpU19Qci0+Q1ZCbGFua1N0YXJ0LCBTaVNfUHItPkNWQmxhbmtFbmQpOwotCiAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIiB7ezB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsXG4iLAotICAgCVNpU19Qci0+Q0NSVDFDUlRDWzBdLCBTaVNfUHItPkNDUlQxQ1JUQ1sxXSwKKwlTaVNfUHItPkNDUlQxQ1JUQ1swXSwgU2lTX1ByLT5DQ1JUMUNSVENbMV0sCiAJU2lTX1ByLT5DQ1JUMUNSVENbMl0sIFNpU19Qci0+Q0NSVDFDUlRDWzNdLAogCVNpU19Qci0+Q0NSVDFDUlRDWzRdLCBTaVNfUHItPkNDUlQxQ1JUQ1s1XSwKIAlTaVNfUHItPkNDUlQxQ1JUQ1s2XSwgU2lTX1ByLT5DQ1JUMUNSVENbN10pOwogICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIgICAweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LFxuIiwKLSAgIAlTaVNfUHItPkNDUlQxQ1JUQ1s4XSwgU2lTX1ByLT5DQ1JUMUNSVENbOV0sCisJU2lTX1ByLT5DQ1JUMUNSVENbOF0sIFNpU19Qci0+Q0NSVDFDUlRDWzldLAogCVNpU19Qci0+Q0NSVDFDUlRDWzEwXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTFdLAogCVNpU19Qci0+Q0NSVDFDUlRDWzEyXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTNdLAogCVNpU19Qci0+Q0NSVDFDUlRDWzE0XSwgU2lTX1ByLT5DQ1JUMUNSVENbMTVdKTsKICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAgMHglMDJ4fX0sXG4iLCBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0pOwogI2VuZGlmCisjZW5kaWYKIH0KIAotI2lmZGVmIExJTlVYX1hGODYKLQogdm9pZAotU2lTX01ha2VDbG9ja1JlZ3MoU2NybkluZm9QdHIgcFNjcm4sIGludCBjbG9jaywgVUNIQVIgKnAyYiwgVUNIQVIgKnAyYykKLXsKLSAgIGludCAgICAgICAgICBvdXRfbiwgb3V0X2RuLCBvdXRfZGl2LCBvdXRfc2JpdCwgb3V0X3NjYWxlOwotICAgdW5zaWduZWQgaW50IHZjbGtbNV07Ci0KLSNkZWZpbmUgTWlkeCAgICAgICAgIDAKLSNkZWZpbmUgTmlkeCAgICAgICAgIDEKLSNkZWZpbmUgVkxEaWR4ICAgICAgIDIKLSNkZWZpbmUgUGlkeCAgICAgICAgIDMKLSNkZWZpbmUgUFNOaWR4ICAgICAgIDQKLQotICAgaWYoU2lTX2NvbXB1dGVfdmNsayhjbG9jaywgJm91dF9uLCAmb3V0X2RuLCAmb3V0X2RpdiwgJm91dF9zYml0LCAmb3V0X3NjYWxlKSkgewotICAgICAgKCpwMmIpID0gKG91dF9kaXYgPT0gMikgPyAweDgwIDogMHgwMDsKLSAgICAgICgqcDJiKSB8PSAoKG91dF9uIC0gMSkgJiAweDdmKTsKLSAgICAgICgqcDJjKSA9IChvdXRfZG4gLSAxKSAmIDB4MWY7Ci0gICAgICAoKnAyYykgfD0gKCgob3V0X3NjYWxlIC0gMSkgJiAzKSA8PCA1KTsKLSAgICAgICgqcDJjKSB8PSAoKG91dF9zYml0ICYgMHgwMSkgPDwgNyk7Ci0jaWZkZWYgVFdERUJVRwotICAgICAgeGY4NkRydk1zZyhwU2Nybi0+c2NybkluZGV4LCBYX0lORk8sICJDbG9jayAlZDogbiAlZCBkbiAlZCBkaXYgJWQgc2IgJWQgc2MgJWRcbiIsCi0gICAgICAgIAkgY2xvY2ssIG91dF9uLCBvdXRfZG4sIG91dF9kaXYsIG91dF9zYml0LCBvdXRfc2NhbGUpOworU2lTX0dlbmVyaWNfQ29udmVydENSRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciAqY3JkYXRhLAorCQkJaW50IHhyZXMsIGludCB5cmVzLAorI2lmZGVmIFNJU19YT1JHX1hGODYKKwkJCURpc3BsYXlNb2RlUHRyIGN1cnJlbnQKICNlbmRpZgotICAgfSBlbHNlIHsKLSAgICAgIFNpU0NhbGNDbG9jayhwU2NybiwgY2xvY2ssIDIsIHZjbGspOwotICAgICAgKCpwMmIpID0gKHZjbGtbVkxEaWR4XSA9PSAyKSA/IDB4ODAgOiAweDAwOwotICAgICAgKCpwMmIpIHw9ICh2Y2xrW01pZHhdIC0gMSkgJiAweDdmOwotICAgICAgKCpwMmMpID0gKHZjbGtbTmlkeF0gLSAxKSAmIDB4MWY7Ci0gICAgICBpZih2Y2xrW1BpZHhdIDw9IDQpIHsKLSAgICAgICAgIC8qIHBvc3RzY2FsZSAxLDIsMyw0ICovCi0gICAgICAgICAoKnAyYykgfD0gKCh2Y2xrW1BpZHhdIC0gMSkgJiAzKSA8PCA1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIC8qIHBvc3RzY2FsZSA2LDggKi8KLSAgICAgICAgICgqcDJjKSB8PSAoKCh2Y2xrW1BpZHhdIC8gMikgLSAxKSAmIDMpIDw8IDU7Ci0JICgqcDJjKSB8PSAweDgwOwotICAgICAgfQotI2lmZGVmIFRXREVCVUcKLSAgICAgIHhmODZEcnZNc2cocFNjcm4tPnNjcm5JbmRleCwgWF9JTkZPLCAiQ2xvY2sgJWQ6IG4gJWQgZG4gJWQgZGl2ICVkIHNjICVkXG4iLAotICAgICAgICAJIGNsb2NrLCB2Y2xrW01pZHhdLCB2Y2xrW05pZHhdLCB2Y2xrW1ZMRGlkeF0sIHZjbGtbUGlkeF0pOworI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKwkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBCT09MRUFOIHdyaXRlcmVzCiAjZW5kaWYKLSAgIH0KLX0KLQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT0gWEZSRUU4Ni9YLk9SRyA9PT09PT09PT09PT09PT09PSAqLwotCi0vKiBIZWxwZXIgZnVuY3Rpb25zICovCi0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0KLVVTSE9SVAotU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKFNjcm5JbmZvUHRyIHBTY3JuLCBEaXNwbGF5TW9kZVB0ciBtb2RlLCBpbnQgVkJGbGFncykKKykKIHsKLSAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIGludCAgICBkZXB0aCA9IHBTaVMtPkN1cnJlbnRMYXlvdXQuYml0c1BlclBpeGVsOwotCi0gICBwU2lTLT5TaVNfUHItPkNNb2RlRmxhZyA9IDA7Ci0gICAKLSAgIHBTaVMtPlNpU19Qci0+Q0RDbG9jayA9IG1vZGUtPkNsb2NrOwotCi0gICBwU2lTLT5TaVNfUHItPkNIRGlzcGxheSA9IG1vZGUtPkhEaXNwbGF5OwotICAgcFNpUy0+U2lTX1ByLT5DSFN5bmNTdGFydCA9IG1vZGUtPkhTeW5jU3RhcnQ7Ci0gICBwU2lTLT5TaVNfUHItPkNIU3luY0VuZCA9IG1vZGUtPkhTeW5jRW5kOwotICAgcFNpUy0+U2lTX1ByLT5DSFRvdGFsID0gbW9kZS0+SFRvdGFsOwotCi0gICBwU2lTLT5TaVNfUHItPkNWRGlzcGxheSA9IG1vZGUtPlZEaXNwbGF5OwotICAgcFNpUy0+U2lTX1ByLT5DVlN5bmNTdGFydCA9IG1vZGUtPlZTeW5jU3RhcnQ7Ci0gICBwU2lTLT5TaVNfUHItPkNWU3luY0VuZCA9IG1vZGUtPlZTeW5jRW5kOwotICAgcFNpUy0+U2lTX1ByLT5DVlRvdGFsID0gbW9kZS0+VlRvdGFsOwotCi0gICBwU2lTLT5TaVNfUHItPkNGbGFncyA9IG1vZGUtPkZsYWdzOwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfSU5URVJMQUNFKSB7Ci0gICAgICBwU2lTLT5TaVNfUHItPkNWRGlzcGxheSA+Pj0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZTeW5jU3RhcnQgPj49IDE7Ci0gICAgICBwU2lTLT5TaVNfUHItPkNWU3luY0VuZCA+Pj0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZUb3RhbCA+Pj0gMTsKLSAgIH0KLSAgIGlmKHBTaVMtPlNpU19Qci0+Q0ZsYWdzICYgVl9EQkxTQ0FOKSB7Ci0gICAgICAvKiBwU2lTLT5TaVNfUHItPkNEQ2xvY2sgPDw9IDE7ICovCi0gICAgICBwU2lTLT5TaVNfUHItPkNWRGlzcGxheSA8PD0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZTeW5jU3RhcnQgPDw9IDE7Ci0gICAgICBwU2lTLT5TaVNfUHItPkNWU3luY0VuZCA8PD0gMTsKLSAgICAgIHBTaVMtPlNpU19Qci0+Q1ZUb3RhbCA8PD0gMTsKLSAgIH0KLQotICAgcFNpUy0+U2lTX1ByLT5DSEJsYW5rU3RhcnQgPSBwU2lTLT5TaVNfUHItPkNIRGlzcGxheTsKLSAgIHBTaVMtPlNpU19Qci0+Q0hCbGFua0VuZCA9IHBTaVMtPlNpU19Qci0+Q0hUb3RhbDsKLSAgIHBTaVMtPlNpU19Qci0+Q1ZCbGFua1N0YXJ0ID0gcFNpUy0+U2lTX1ByLT5DVlN5bmNTdGFydCAtIDE7Ci0gICBwU2lTLT5TaVNfUHItPkNWQmxhbmtFbmQgPSBwU2lTLT5TaVNfUHItPkNWVG90YWw7Ci0KLSAgIFNpU19NYWtlQ2xvY2tSZWdzKHBTY3JuLCBwU2lTLT5TaVNfUHItPkNEQ2xvY2ssICZwU2lTLT5TaVNfUHItPkNTUjJCLCAmcFNpUy0+U2lTX1ByLT5DU1IyQyk7Ci0KLSAgIHBTaVMtPlNpU19Qci0+Q1NSQ2xvY2sgPSAocFNpUy0+U2lTX1ByLT5DRENsb2NrIC8gMTAwMCkgKyAxOwotCi0gICBTaVNfQ2FsY0NSUmVnaXN0ZXJzKHBTaVMtPlNpU19QciwgZGVwdGgpOwotCi0gICBzd2l0Y2goZGVwdGgpIHsKLSAgIGNhc2UgODogIHBTaVMtPlNpU19Qci0+Q01vZGVGbGFnIHw9IDB4MjIzYjsgYnJlYWs7Ci0gICBjYXNlIDE2OiBwU2lTLT5TaVNfUHItPkNNb2RlRmxhZyB8PSAweDIyN2Q7IGJyZWFrOwotICAgY2FzZSAzMjogcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcgfD0gMHgyMmZmOyBicmVhazsKLSAgIGRlZmF1bHQ6IHJldHVybiAwOwotICAgfQotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfREJMU0NBTikKLSAgICAgIHBTaVMtPlNpU19Qci0+Q01vZGVGbGFnIHw9IERvdWJsZVNjYW5Nb2RlOwotCi0gICBpZigocFNpUy0+U2lTX1ByLT5DVkRpc3BsYXkgPj0gMTAyNCkJfHwKLSAgICAgIChwU2lTLT5TaVNfUHItPkNWVG90YWwgPj0gMTAyNCkgICB8fAotICAgICAgKHBTaVMtPlNpU19Qci0+Q0hEaXNwbGF5ID49IDEwMjQpKQotICAgICAgcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcgfD0gTGluZUNvbXBhcmVPZmY7Ci0KLSAgIGlmKHBTaVMtPlNpU19Qci0+Q0ZsYWdzICYgVl9DTEtESVYyKQotICAgICAgcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcgfD0gSGFsZkRDTEs7Ci0KLSAgIHBTaVMtPlNpU19Qci0+Q0luZm9GbGFnID0gMHgwMDA3OwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfTkhTWU5DKQotICAgICAgcFNpUy0+U2lTX1ByLT5DSW5mb0ZsYWcgfD0gMHg0MDAwOwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfTlZTWU5DKQotICAgICAgcFNpUy0+U2lTX1ByLT5DSW5mb0ZsYWcgfD0gMHg4MDAwOwotCi0gICBpZihwU2lTLT5TaVNfUHItPkNGbGFncyAmIFZfSU5URVJMQUNFKQotICAgICAgcFNpUy0+U2lTX1ByLT5DSW5mb0ZsYWcgfD0gSW50ZXJsYWNlTW9kZTsKLQotICAgcFNpUy0+U2lTX1ByLT5Vc2VDdXN0b21Nb2RlID0gVFJVRTsKLSNpZmRlZiBUV0RFQlVHCi0gICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIkN1c3RvbSBtb2RlICVkeCVkOlxuIiwKLSAgIAlwU2lTLT5TaVNfUHItPkNIRGlzcGxheSxwU2lTLT5TaVNfUHItPkNWRGlzcGxheSk7Ci0gICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIk1vZGVmbGFnICUwNHgsIEluZm9mbGFnICUwNHhcbiIsCi0gICAJcFNpUy0+U2lTX1ByLT5DTW9kZUZsYWcsIHBTaVMtPlNpU19Qci0+Q0luZm9GbGFnKTsKLSAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiIHt7MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCxcbiIsCi0gICAJcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMF0sIHBTaVMtPlNpU19Qci0+Q0NSVDFDUlRDWzFdLAotCXBTaVMtPlNpU19Qci0+Q0NSVDFDUlRDWzJdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1szXSwKLQlwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1s0XSwgcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbNV0sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbNl0sIHBTaVMtPlNpU19Qci0+Q0NSVDFDUlRDWzddKTsKLSAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LFxuIiwKLSAgIAlwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1s4XSwgcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbOV0sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTBdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1sxMV0sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTJdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1sxM10sCi0JcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTRdLCBwU2lTLT5TaVNfUHItPkNDUlQxQ1JUQ1sxNV0pOwotICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIgIDB4JTAyeH19LFxuIiwgcFNpUy0+U2lTX1ByLT5DQ1JUMUNSVENbMTZdKTsKLSAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiQ2xvY2s6IDB4JTAyeCwgMHglMDJ4LCAlZFxuIiwKLSAgIAlwU2lTLT5TaVNfUHItPkNTUjJCLCBwU2lTLT5TaVNfUHItPkNTUjJDLCBwU2lTLT5TaVNfUHItPkNTUkNsb2NrKTsKLSNlbmRpZgotICAgcmV0dXJuIDE7Ci19Ci0KLWludAotU2lTX0ZpbmRQYW5lbEZyb21EQihTSVNQdHIgcFNpUywgVVNIT1JUIHBhbmVsdmVuZG9yLCBVU0hPUlQgcGFuZWxwcm9kdWN0LCBpbnQgKm1heHgsIGludCAqbWF4eSwgaW50ICpwcmVmeCwgaW50ICpwcmVmeSkKLXsKLSAgIGludCBpLCBqOwotICAgQk9PTEVBTiBkb25lID0gRkFMU0U7Ci0KLSAgIGkgPSAwOwotICAgd2hpbGUoKCFkb25lKSAmJiAoU2lTX1BsYXNtYVRhYmxlW2ldLnZlbmRvcikgJiYgcGFuZWx2ZW5kb3IpIHsKLSAgICAgIGlmKFNpU19QbGFzbWFUYWJsZVtpXS52ZW5kb3IgPT0gcGFuZWx2ZW5kb3IpIHsKLSAgICAgICAgIGZvcihqPTA7IGo8U2lTX1BsYXNtYVRhYmxlW2ldLnByb2R1Y3RudW07IGorKykgewotCSAgICBpZihTaVNfUGxhc21hVGFibGVbaV0ucHJvZHVjdFtqXSA9PSBwYW5lbHByb2R1Y3QpIHsKLQkgICAgICAgaWYoU2lTX1BsYXNtYVRhYmxlW2ldLm1heHggJiYgU2lTX1BsYXNtYVRhYmxlW2ldLm1heHkpIHsKLQkgICAgICAgICAgKCptYXh4KSA9IChpbnQpU2lTX1BsYXNtYVRhYmxlW2ldLm1heHg7Ci0JCSAgKCptYXh5KSA9IChpbnQpU2lTX1BsYXNtYVRhYmxlW2ldLm1heHk7Ci0JCSAgKCpwcmVmeCkgPSAoaW50KVNpU19QbGFzbWFUYWJsZVtpXS5wcmVmeDsKLQkJICAoKnByZWZ5KSA9IChpbnQpU2lTX1BsYXNtYVRhYmxlW2ldLnByZWZ5OwotCQkgIGRvbmUgPSBUUlVFOwotCQkgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JICAgICAgIAkgICAgICAgICJJZGVudGlmaWVkICVzLCBjb3JyZWN0aW5nIG1heCBYIHJlcyAlZCwgbWF4IFkgcmVzICVkXG4iLAotCQkJIFNpU19QbGFzbWFUYWJsZVtpXS5wbGFzbWFuYW1lLAotCQkgICAgICAgICBTaVNfUGxhc21hVGFibGVbaV0ubWF4eCwgU2lTX1BsYXNtYVRhYmxlW2ldLm1heHkpOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgfQotIAkgICAgfQotCSB9Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICB9Ci0gICByZXR1cm4gKGRvbmUpID8gMSA6IDA7Ci19Ci0KLS8qIEJ1aWxkIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbW9kZXM6Ci0gKiBCdWlsdC1pbiBtb2RlcyBmb3Igd2hpY2ggd2UgaGF2ZSBhbGwgZGF0YSBhcmUgTV9UX0RFRkFVTFQsCi0gKiBtb2RlcyBkZXJpdmVkIGZyb20gRERDIG9yIGRhdGFiYXNlIGRhdGEgYXJlIE1fVF9CVUlMVElOCi0gKi8KLURpc3BsYXlNb2RlUHRyCi1TaVNCdWlsZEJ1aWx0SW5Nb2RlTGlzdChTY3JuSW5mb1B0ciBwU2NybiwgQk9PTEVBTiBpbmNsdWRlbGNkbW9kZXMsIEJPT0xFQU4gaXNmb3JkdmkpCi17Ci0gICBTSVNQdHIgICAgICAgICBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIHVuc2lnbmVkIHNob3J0IFZSRSwgVkJFLCBWUlMsIFZCUywgVkRFLCBWVDsKICAgIHVuc2lnbmVkIHNob3J0IEhSRSwgSEJFLCBIUlMsIEhCUywgSERFLCBIVDsKLSAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyLCBjcl9kYXRhMzsKLSAgIHVuc2lnbmVkIGNoYXIgIHNyMmIsIHNyMmM7Ci0gICBmbG9hdCAgICAgICAgICBudW0sIGRlbnVtLCBwb3N0c2NhbGFyLCBkaXZpZGVyOwotICAgaW50ICAgICAgICAgICAgQSwgQiwgQywgRCwgRSwgRiwgdGVtcCwgaSwgaiwgaywgbCwgaW5kZXgsIHZjbGtpbmRleDsKLSAgIERpc3BsYXlNb2RlUHRyIG5ldyA9IE5VTEwsIGN1cnJlbnQgPSBOVUxMLCBmaXJzdCA9IE5VTEw7Ci0gICBCT09MRUFOICAgICAgICBkb25lID0gRkFMU0U7Ci0jaWYgMAotICAgRGlzcGxheU1vZGVQdHIgYmFja3VwID0gTlVMTDsKLSNlbmRpZgorICAgdW5zaWduZWQgc2hvcnQgVlJFLCBWQkUsIFZSUywgVkJTLCBWREUsIFZUOworICAgdW5zaWduZWQgY2hhciAgc3JfZGF0YSwgY3JfZGF0YSwgY3JfZGF0YTI7CisgICBpbnQgICAgICAgICAgICBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wOwogCi0gICBwU2lTLT5iYWNrdXBtb2RlbGlzdCA9IE5VTEw7Ci0gICBwU2lTLT5BZGRlZFBsYXNtYU1vZGVzID0gRkFMU0U7CisgICBzcl9kYXRhID0gY3JkYXRhWzE0XTsKIAotICAgLyogSW5pdGlhbGl6ZSBvdXIgcG9pbnRlcnMgKi8KLSAgIGlmKHBTaVMtPlZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIFNJUzMwMAotICAgICAgSW5pdFRvMzAwUG9pbnRlcihwU2lTLT5TaVNfUHIsICZwU2lTLT5zaXNod19leHQpOwotI2Vsc2UKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0gICB9IGVsc2UgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgSW5pdFRvMzEwUG9pbnRlcihwU2lTLT5TaVNfUHIsICZwU2lTLT5zaXNod19leHQpOwotI2Vsc2UKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0gICB9IGVsc2UgcmV0dXJuIE5VTEw7CisgICAvKiBIb3Jpem9udGFsIHRvdGFsICovCisgICBIVCA9ICBjcmRhdGFbMF0gfCAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgwMykgPDwgOCk7CisgICBBID0gSFQgKyA1OwogCi0gICBpID0gMDsKLSAgIHdoaWxlKHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLkV4dF9JbmZvRmxhZyAhPSAweEZGRkYpIHsKKyAgIC8qIEhvcml6b250YWwgZGlzcGxheSBlbmFibGUgZW5kICovCisgICBIREUgPSBjcmRhdGFbMV0gfCAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgwQykgPDwgNik7CisgICBFID0gSERFICsgMTsKIAotICAgICAgaW5kZXggPSBwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5FeHRfQ1JUMUNSVEM7CisgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLworICAgSFJTID0gY3JkYXRhWzRdIHwgKCh1bnNpZ25lZCBzaG9ydCkoc3JfZGF0YSAmIDB4QzApIDw8IDIpOworICAgRiA9IEhSUyAtIEUgLSAzOwogCi0gICAgICAvKiAweDVhICgzMjB4MjQwKSBpcyBhIHB1cmUgRlRTTiBtb2RlLCBub3QgRFNUTiEgKi8KLSAgICAgIGlmKCghcFNpUy0+RlNUTikgJiYKLQkgKHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLk1vZGVJRCA9PSAweDVhKSkgIHsKLSAgICAgICAgICAgaSsrOwotICAgICAgCSAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYoKHBTaVMtPkZTVE4pICYmCi0gICAgICAgICAocFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uWFJlcyA9PSAzMjApICYmCi0JIChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5ZUmVzID09IDI0MCkgJiYKLQkgKHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLk1vZGVJRCAhPSAweDVhKSkgewotCSAgIGkrKzsKLQkgICBjb250aW51ZTsKLSAgICAgIH0KKyAgIC8qIEhvcml6b250YWwgYmxhbmsgc3RhcnQgKi8KKyAgIEhCUyA9IGNyZGF0YVsyXSB8ICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgJiAweDMwKSA8PCA0KTsKIAotICAgICAgaWYoIShuZXcgPSB4YWxsb2Moc2l6ZW9mKERpc3BsYXlNb2RlUmVjKSkpKSByZXR1cm4gZmlyc3Q7Ci0gICAgICBtZW1zZXQobmV3LCAwLCBzaXplb2YoRGlzcGxheU1vZGVSZWMpKTsKLSAgICAgIGlmKCEobmV3LT5uYW1lID0geGFsbG9jKDEwKSkpIHsKLSAgICAgIAkJeGZyZWUobmV3KTsKLQkJcmV0dXJuIGZpcnN0OwotICAgICAgfQotICAgICAgaWYoIWZpcnN0KSBmaXJzdCA9IG5ldzsKLSAgICAgIGlmKGN1cnJlbnQpIHsKLSAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBuZXc7Ci0JIG5ldy0+cHJldiA9IGN1cnJlbnQ7Ci0gICAgICB9CisgICBzcl9kYXRhID0gY3JkYXRhWzE1XTsKKyAgIGNyX2RhdGEgPSBjcmRhdGFbNV07CiAKLSAgICAgIGN1cnJlbnQgPSBuZXc7CisgICAvKiBIb3Jpem9udGFsIGJsYW5rIGVuZCAqLworICAgSEJFID0gKGNyZGF0YVszXSAmIDB4MWYpIHwKKyAgICAgICAgICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDgwKSA+PiAyKSB8CisgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgwMykgPDwgNik7CiAKLSAgICAgIHNwcmludGYoY3VycmVudC0+bmFtZSwgIiVkeCVkIiwgcFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uWFJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uWVJlcyk7CisgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KKyAgIEhSRSA9IChjcl9kYXRhICYgMHgxZikgfCAoKHNyX2RhdGEgJiAweDA0KSA8PCAzKTsKIAotICAgICAgY3VycmVudC0+c3RhdHVzID0gTU9ERV9PSzsKKyAgIHRlbXAgPSBIQkUgLSAoKEUgLSAxKSAmIDI1NSk7CisgICBCID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDI1Nik7CiAKLSAgICAgIGN1cnJlbnQtPnR5cGUgPSBNX1RfREVGQVVMVDsKKyAgIHRlbXAgPSBIUkUgLSAoKEUgKyBGICsgMykgJiA2Myk7CisgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDY0KTsKIAotICAgICAgdmNsa2luZGV4ID0gcFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uRXh0X0NSVFZDTEs7Ci0gICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHZjbGtpbmRleCAmPSAweDNGOworICAgRCA9IEIgLSBGIC0gQzsKIAotICAgICAgc3IyYiA9IHBTaVMtPlNpU19Qci0+U2lTX1ZDTEtEYXRhW3ZjbGtpbmRleF0uU1IyQjsKLSAgICAgIHNyMmMgPSBwU2lTLT5TaVNfUHItPlNpU19WQ0xLRGF0YVt2Y2xraW5kZXhdLlNSMkM7Ci0KLSAgICAgIGRpdmlkZXIgPSAoc3IyYiAmIDB4ODApID8gMi4wIDogMS4wOwotICAgICAgcG9zdHNjYWxhciA9IChzcjJjICYgMHg4MCkgPwotICAgICAgICAgICAgICAoICgoKHNyMmMgPj4gNSkgJiAweDAzKSA9PSAweDAyKSA/IDYuMCA6IDguMCkgOiAoKChzcjJjID4+IDUpICYgMHgwMykgKyAxLjApOwotICAgICAgbnVtID0gKHNyMmIgJiAweDdmKSArIDEuMDsKLSAgICAgIGRlbnVtID0gKHNyMmMgJiAweDFmKSArIDEuMDsKLQorI2lmZGVmIFNJU19YT1JHX1hGODYKKyAgIGN1cnJlbnQtPkhEaXNwbGF5ICAgPSAoRSAqIDgpOworICAgY3VycmVudC0+SFN5bmNTdGFydCA9IChFICogOCkgKyAoRiAqIDgpOworICAgY3VycmVudC0+SFN5bmNFbmQgICA9IChFICogOCkgKyAoRiAqIDgpICsgKEMgKiA4KTsKKyAgIGN1cnJlbnQtPkhUb3RhbCAgICAgPSAoRSAqIDgpICsgKEYgKiA4KSArIChDICogOCkgKyAoRCAqIDgpOwogI2lmZGVmIFRXREVCVUcKLSAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAic3IyYjogJXggc3IyYyAleCBkaXYgJWYgcHMgJWYgbnVtICVmIGRlbnVtICVmXG4iLAotICAgICAgICAgc3IyYiwgc3IyYywgZGl2aWRlciwgcG9zdHNjYWxhciwgbnVtLCBkZW51bSk7Ci0jZW5kaWYKLQotICAgICAgY3VycmVudC0+Q2xvY2sgPSAoaW50KSgxNDMxOCAqIChkaXZpZGVyIC8gcG9zdHNjYWxhcikgKiAobnVtIC8gZGVudW0pKTsKLQotICAgICAgc3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTRdOwotCS8qIGluU0lTSURYUkVHKFNJU1NSLCAweDBiLCBzcl9kYXRhKTsgKi8KLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMF07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDAsIGNyX2RhdGEpOyAqLwotCi0gICAgICAvKiBIb3Jpem9udGFsIHRvdGFsICovCi0gICAgICBIVCA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDgpOwotICAgICAgQSA9IEhUICsgNTsKLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMV07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDEsIGNyX2RhdGEpOyAqLwotCi0gICAgICAvKiBIb3Jpem9udGFsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLwotICAgICAgSERFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MEMpIDw8IDYpOwotICAgICAgRSA9IEhERSArIDE7ICAvKiAweDgwIDB4NjQgKi8KLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbNF07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDQsIGNyX2RhdGEpOyAqLwotCi0gICAgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLwotICAgICAgSFJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4QzApIDw8IDIpOwotICAgICAgRiA9IEhSUyAtIEUgLSAzOyAgLyogMHgwNiAweDA2ICovCi0KLSAgICAgIGNyX2RhdGEgPSBwU2lTLT5TaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzJdOwotCS8qIGluU0lTSURYUkVHKFNJU0NSLCAweDAyLCBjcl9kYXRhKTsgKi8KLQotICAgICAgLyogSG9yaXpvbnRhbCBibGFuayBzdGFydCAqLwotICAgICAgSEJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MzApIDw8IDQpOwotCi0gICAgICBzcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxNV07Ci0JLyogaW5TSVNJRFhSRUcoU0lTU1IsIDB4MGMsIHNyX2RhdGEpOyAqLwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlszXTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgwMywgY3JfZGF0YSk7ICAqLwotCi0gICAgICBjcl9kYXRhMiA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbNV07Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDUsIGNyX2RhdGEyKTsgKi8KLQotICAgICAgLyogSG9yaXpvbnRhbCBibGFuayBlbmQgKi8KLSAgICAgIEhCRSA9IChjcl9kYXRhICYgMHgxZikgfAotICAgICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKGNyX2RhdGEyICYgMHg4MCkgPj4gMikgfAotCSAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDYpOwotCi0gICAgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KLSAgICAgIEhSRSA9IChjcl9kYXRhMiAmIDB4MWYpIHwgKChzcl9kYXRhICYgMHgwNCkgPDwgMyk7Ci0KLSAgICAgIHRlbXAgPSBIQkUgLSAoKEUgLSAxKSAmIDI1NSk7Ci0gICAgICBCID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDI1Nik7Ci0KLSAgICAgIHRlbXAgPSBIUkUgLSAoKEUgKyBGICsgMykgJiA2Myk7Ci0gICAgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDY0KTsgLyogMHgwYiAweDBiICovCi0KLSAgICAgIEQgPSBCIC0gRiAtIEM7Ci0KLSAgICAgIGlmKChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5YUmVzID09IDMyMCkgJiYKLQkgKChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5ZUmVzID09IDIwMCkgfHwKLQkgIChwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5ZUmVzID09IDI0MCkpKSB7Ci0KLQkgLyogVGVycmlibGUgaGFjaywgYnV0IGNvcnJlY3QgQ1JUQyBkYXRhIGZvcgotCSAgKiB0aGVzZSBtb2RlcyBvbmx5IHByb2R1Y2VzIGEgYmxhY2sgc2NyZWVuLi4uCi0JICAqIChIUkUgaXMgMCwgbGVhZGluZyBpbnRvIGEgdG9vIGxhcmdlIEMgYW5kCi0JICAqIGEgbmVnYXRpdmUgRC4gVGhlIENSVCBjb250cm9sbGVyIGRvZXMgbm90Ci0JICAqIHNlZW0gdG8gbGlrZSBjb3JyZWN0aW5nIEhSRSB0byA1MAotCSAgKi8KLQkgY3VycmVudC0+SERpc3BsYXkgICA9IDMyMDsKLSAgICAgICAgIGN1cnJlbnQtPkhTeW5jU3RhcnQgPSAzMjg7Ci0gICAgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gMzc2OwotICAgICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IDQwMDsKLQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgY3VycmVudC0+SERpc3BsYXkgICA9IChFICogOCk7Ci0gICAgICAgICBjdXJyZW50LT5IU3luY1N0YXJ0ID0gKEUgKiA4KSArIChGICogOCk7Ci0gICAgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gKEUgKiA4KSArIChGICogOCkgKyAoQyAqIDgpOwotICAgICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IChFICogOCkgKyAoRiAqIDgpICsgKEMgKiA4KSArIChEICogOCk7Ci0KLSAgICAgIH0KLQotI2lmZGVmIFRXREVCVUcKLSAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLAotICAgICAgICAiSDogQSAlZCBCICVkIEMgJWQgRCAlZCBFICVkIEYgJWQgIEhUICVkIEhERSAlZCBIUlMgJWQgSEJTICVkIEhCRSAlZCBIUkUgJWRcbiIsCi0gICAgICAJQSwgQiwgQywgRCwgRSwgRiwgSFQsIEhERSwgSFJTLCBIQlMsIEhCRSwgSFJFKTsKLSNlbmRpZgotCi0gICAgICBzcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxM107Ci0JLyogaW5TSVNJRFhSRUcoU0lTU1IsIDB4MEEsIHNyX2RhdGEpOyAqLwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls2XTsKLSAgICAgICAgLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDYsIGNyX2RhdGEpOyAqLwotCi0gICAgICBjcl9kYXRhMiA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbN107Ci0gICAgICAgIC8qIGluU0lTSURYUkVHKFNJU0NSLCAweDA3LCBjcl9kYXRhMik7ICAqLwotCi0gICAgICAvKiBWZXJ0aWNhbCB0b3RhbCAqLwotICAgICAgVlQgPSAoY3JfZGF0YSAmIDB4RkYpIHwKLSAgICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKGNyX2RhdGEyICYgMHgwMSkgPDwgOCkgfAotCSAgICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEyICYgMHgyMCkgPDwgNCkgfAotCSAgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMSkgPDwgMTApOwotICAgICAgQSA9IFZUICsgMjsKLQotICAgICAgY3JfZGF0YSA9IHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTBdOwotCS8qIGluU0lTSURYUkVHKFNJU0NSLCAweDEyLCBjcl9kYXRhKTsgICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLwotICAgICAgVkRFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoY3JfZGF0YTIgJiAweDAyKSA8PCA3KSB8Ci0JICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4NDApIDw8IDMpIHwKLQkgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDAyKSA8PCA5KTsKLSAgICAgIEUgPSBWREUgKyAxOwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls4XTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgxMCwgY3JfZGF0YSk7ICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLwotICAgICAgVlJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgICAoKHVuc2lnbmVkIHNob3J0KSAoY3JfZGF0YTIgJiAweDA0KSA8PCA2KSB8Ci0JICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4ODApIDw8IDIpIHwKLQkgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDA4KSA8PCA3KTsKLSAgICAgIEYgPSBWUlMgKyAxIC0gRTsKLQotICAgICAgY3JfZGF0YSA9ICBwU2lTLT5TaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzExXTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgxNSwgY3JfZGF0YSk7ICAqLwotCi0gICAgICBjcl9kYXRhMyA9IChwU2lTLT5TaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzE2XSAmIDB4MDEpIDw8IDU7Ci0JLyogaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDksIGNyX2RhdGEzKTsgICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIGJsYW5rIHN0YXJ0ICovCi0gICAgICBWQlMgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLSAgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDgpIDw8IDUpIHwKLQkgICAgKCh1bnNpZ25lZCBzaG9ydCkgKGNyX2RhdGEzICYgMHgyMCkgPDwgNCkgfAotCSAgICAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDQpIDw8IDgpOwotCi0gICAgICBjcl9kYXRhID0gIHBTaVMtPlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTJdOwotCS8qIGluU0lTSURYUkVHKFNJU0NSLCAweDE2LCBjcl9kYXRhKTsgKi8KLQotICAgICAgLyogVmVydGljYWwgYmxhbmsgZW5kICovCi0gICAgICBWQkUgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLSAgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgxMCkgPDwgNCk7Ci0gICAgICB0ZW1wID0gVkJFIC0gKChFIC0gMSkgJiA1MTEpOwotICAgICAgQiA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA1MTIpOwotCi0gICAgICBjcl9kYXRhID0gcFNpUy0+U2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls5XTsKLQkvKiBpblNJU0lEWFJFRyhTSVNDUiwgMHgxMSwgY3JfZGF0YSk7ICovCi0KLSAgICAgIC8qIFZlcnRpY2FsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KLSAgICAgIFZSRSA9IChjcl9kYXRhICYgMHgwZikgfCAoKHNyX2RhdGEgJiAweDIwKSA+PiAxKTsKLSAgICAgIHRlbXAgPSBWUkUgLSAoKEUgKyBGIC0gMSkgJiAzMSk7Ci0gICAgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDMyKTsKLQotICAgICAgRCA9IEIgLSBGIC0gQzsKLQotICAgICAgY3VycmVudC0+VkRpc3BsYXkgICA9IFZERSArIDE7Ci0gICAgICBjdXJyZW50LT5WU3luY1N0YXJ0ID0gVlJTICsgMTsKLSAgICAgIGN1cnJlbnQtPlZTeW5jRW5kICAgPSAoKFZSUyAmIH4weDFmKSB8IFZSRSkgKyAxOwotICAgICAgaWYoVlJFIDw9IChWUlMgJiAweDFmKSkgY3VycmVudC0+VlN5bmNFbmQgKz0gMzI7Ci0gICAgICBjdXJyZW50LT5WVG90YWwgICAgID0gRSArIEQgKyBDICsgRjsKLQotI2lmIDAKLSAgICAgIGN1cnJlbnQtPlZEaXNwbGF5ICAgPSBFOwotICAgICAgY3VycmVudC0+VlN5bmNTdGFydCA9IEUgKyBEOwotICAgICAgY3VycmVudC0+VlN5bmNFbmQgICA9IEUgKyBEICsgQzsKLSAgICAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBFICsgRCArIEMgKyBGOwotI2VuZGlmCi0KLSNpZmRlZiBUV0RFQlVHCi0gICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywKLSAgICAgICAgIlY6IEEgJWQgQiAlZCBDICVkIEQgJWQgRSAlZCBGICVkICBWVCAlZCBWREUgJWQgVlJTICVkIFZCUyAlZCBWQkUgJWQgVlJFICVkXG4iLAotICAgICAgCUEsIEIsIEMsIEQsIEUsIEYsIFZULCBWREUsIFZSUywgVkJTLCBWQkUsIFZSRSk7Ci0jZW5kaWYKLQotICAgICAgaWYocFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uRXh0X0luZm9GbGFnICYgMHg0MDAwKQotICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfTkhTWU5DOwotICAgICAgZWxzZQotICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUEhTWU5DOwotCi0gICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19SZWZJbmRleFtpXS5FeHRfSW5mb0ZsYWcgJiAweDgwMDApCi0gICAgICAJICBjdXJyZW50LT5GbGFncyB8PSBWX05WU1lOQzsKLSAgICAgIGVsc2UKLSAgICAgICAgICBjdXJyZW50LT5GbGFncyB8PSBWX1BWU1lOQzsKLQotICAgICAgaWYocFNpUy0+U2lTX1ByLT5TaVNfUmVmSW5kZXhbaV0uRXh0X0luZm9GbGFnICYgMHgwMDgwKQotICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfSU5URVJMQUNFOwotCi0gICAgICBqID0gMDsKLSAgICAgIHdoaWxlKHBTaVMtPlNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtqXS5FeHRfTW9kZUlEICE9IDB4ZmYpIHsKLSAgICAgICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCA9PQotCSAgICAgICAgICAgICAgICAgIHBTaVMtPlNpU19Qci0+U2lTX1JlZkluZGV4W2ldLk1vZGVJRCkgewotICAgICAgICAgICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpIHsKLQkgICAgICAJICBjdXJyZW50LT5GbGFncyB8PSBWX0RCTFNDQU47Ci0gICAgICAgICAgICAgIH0KLQkgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0JICBqKys7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGN1cnJlbnQtPkZsYWdzICYgVl9JTlRFUkxBQ0UpIHsKLSAgICAgICAgIGN1cnJlbnQtPlZEaXNwbGF5IDw8PSAxOwotCSBjdXJyZW50LT5WU3luY1N0YXJ0IDw8PSAxOwotCSBjdXJyZW50LT5WU3luY0VuZCA8PD0gMTsKLQkgY3VycmVudC0+VlRvdGFsIDw8PSAxOwotCSBjdXJyZW50LT5WVG90YWwgfD0gMTsKLSAgICAgIH0KLSAgICAgIGlmKGN1cnJlbnQtPkZsYWdzICYgVl9EQkxTQ0FOKSB7Ci0gICAgICAgICBjdXJyZW50LT5DbG9jayA+Pj0gMTsKLQkgY3VycmVudC0+VkRpc3BsYXkgPj49IDE7Ci0JIGN1cnJlbnQtPlZTeW5jU3RhcnQgPj49IDE7Ci0JIGN1cnJlbnQtPlZTeW5jRW5kID4+PSAxOwotCSBjdXJyZW50LT5WVG90YWwgPj49IDE7Ci0gICAgICB9Ci0KLSNpZmRlZiBUV0RFQlVHCi0gICAgICB4Zjg2RHJ2TXNnKHBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywKLSAgICAgIAkiQnVpbHQtaW46ICVzICUuMmYgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCi0JY3VycmVudC0+bmFtZSwgKGZsb2F0KWN1cnJlbnQtPkNsb2NrIC8gMTAwMCwKLQljdXJyZW50LT5IRGlzcGxheSwgY3VycmVudC0+SFN5bmNTdGFydCwgY3VycmVudC0+SFN5bmNFbmQsIGN1cnJlbnQtPkhUb3RhbCwKLQljdXJyZW50LT5WRGlzcGxheSwgY3VycmVudC0+VlN5bmNTdGFydCwgY3VycmVudC0+VlN5bmNFbmQsIGN1cnJlbnQtPlZUb3RhbCk7CisgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywKKwkJIkg6IEEgJWQgQiAlZCBDICVkIEQgJWQgRSAlZCBGICVkICBIVCAlZCBIREUgJWQgSFJTICVkIEhCUyAlZCBIQkUgJWQgSFJFICVkXG4iLAorCQlBLCBCLCBDLCBELCBFLCBGLCBIVCwgSERFLCBIUlMsIEhCUywgSEJFLCBIUkUpOwogI2Vsc2UKLSAgICAgICAgKHZvaWQpVkJTOyAgKHZvaWQpSEJTOyAgKHZvaWQpQTsKKyAgICh2b2lkKVZCUzsgICh2b2lkKUhCUzsgICh2b2lkKUE7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKyAgIGlmKHdyaXRlcmVzKSB2YXItPnhyZXMgPSB4cmVzID0gRSAqIDg7CisgICB2YXItPmxlZnRfbWFyZ2luID0gRCAqIDg7CisgICB2YXItPnJpZ2h0X21hcmdpbiA9IEYgKiA4OworICAgdmFyLT5oc3luY19sZW4gPSBDICogODsKICNlbmRpZgogCi0gICAgICBpKys7Ci0gICB9CisgICAvKiBWZXJ0aWNhbCAqLworICAgc3JfZGF0YSA9IGNyZGF0YVsxM107CisgICBjcl9kYXRhID0gY3JkYXRhWzddOwogCi0gICAvKiBBZGQgbm9uLXN0YW5kYXJkIExDRCBtb2RlcyBmb3IgcGFuZWwncyBkZXRhaWxlZCB0aW1pbmdzICovCisgICAvKiBWZXJ0aWNhbCB0b3RhbCAqLworICAgVlQgID0gY3JkYXRhWzZdIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YSAmIDB4MDEpIDw8IDgpIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YSAmIDB4MjApIDw8IDQpIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoc3JfZGF0YSAmIDB4MDEpIDw8IDEwKTsKKyAgIEEgPSBWVCArIDI7CiAKLSAgIGlmKCFpbmNsdWRlbGNkbW9kZXMpIHJldHVybiBmaXJzdDsKKyAgIC8qIFZlcnRpY2FsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLworICAgVkRFID0gY3JkYXRhWzEwXSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDAyKSA8PCA3KSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDQwKSA8PCAzKSB8CisJICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgJiAweDAyKSA8PCA5KTsKKyAgIEUgPSBWREUgKyAxOwogCi0gICBpZihwU2lTLT5TaVNfUHItPkNQX1ZlbmRvcikgewotICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJDaGVja2luZyBkYXRhYmFzZSBmb3IgdmVuZG9yICV4LCBwcm9kdWN0ICV4XG4iLAotICAgICAgICAgcFNpUy0+U2lTX1ByLT5DUF9WZW5kb3IsIHBTaVMtPlNpU19Qci0+Q1BfUHJvZHVjdCk7Ci0gICB9CisgICAvKiBWZXJ0aWNhbCByZXRyYWNlICg9c3luYykgc3RhcnQgKi8KKyAgIFZSUyA9IGNyZGF0YVs4XSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDA0KSA8PCA2KSB8CisJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEgJiAweDgwKSA8PCAyKSB8CisJICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgJiAweDA4KSA8PCA3KTsKKyAgIEYgPSBWUlMgKyAxIC0gRTsKIAotICAgaSA9IDA7Ci0gICB3aGlsZSgoIWRvbmUpICYmIChTaVNfUGxhc21hVGFibGVbaV0udmVuZG9yKSAmJiAocFNpUy0+U2lTX1ByLT5DUF9WZW5kb3IpKSB7CisgICBjcl9kYXRhMiA9IChjcmRhdGFbMTZdICYgMHgwMSkgPDwgNTsKIAotICAgICBpZihTaVNfUGxhc21hVGFibGVbaV0udmVuZG9yID09IHBTaVMtPlNpU19Qci0+Q1BfVmVuZG9yKSB7Ci0KLSAgICAgICAgZm9yKGo9MDsgajxTaVNfUGxhc21hVGFibGVbaV0ucHJvZHVjdG51bTsgaisrKSB7Ci0KLQkgICAgaWYoU2lTX1BsYXNtYVRhYmxlW2ldLnByb2R1Y3Rbal0gPT0gcFNpUy0+U2lTX1ByLT5DUF9Qcm9kdWN0KSB7Ci0KLQkgICAgICAgeGY4NkRydk1zZyhwU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgICAgCSAgIklkZW50aWZpZWQgJXMgcGFuZWwsIGFkZGluZyBzcGVjaWZpYyBtb2Rlc1xuIiwKLQkJICBTaVNfUGxhc21hVGFibGVbaV0ucGxhc21hbmFtZSk7Ci0KLQkgICAgICAgZm9yKGs9MDsgazxTaVNfUGxhc21hVGFibGVbaV0ubW9kZW51bTsgaysrKSB7Ci0KLQkgICAgICAgICAgaWYoaXNmb3JkdmkpIHsKLQkJICAgICBpZighKFNpU19QbGFzbWFUYWJsZVtpXS5wbGFzbWFtb2Rlc1trXSAmIDB4ODApKSBjb250aW51ZTsKLQkJICB9IGVsc2UgewotCQkgICAgIGlmKCEoU2lTX1BsYXNtYVRhYmxlW2ldLnBsYXNtYW1vZGVzW2tdICYgMHg0MCkpIGNvbnRpbnVlOwotCQkgIH0KLQotCQkgIGwgPSBTaVNfUGxhc21hVGFibGVbaV0ucGxhc21hbW9kZXNba10gJiAweDNmOwotCi0JCSAgaWYocFNpUy0+VkJGbGFncyAmIChWQl8zMDF8VkJfMzAxQnxWQl8zMDJCfFZCXzMwMUxWKSkgewotCQkgICAgIGlmKGlzZm9yZHZpKSB7Ci0JCSAgICAgICAgaWYoU2lTX1BsYXNtYU1vZGVbbF0uVkRpc3BsYXkgPiAxMDI0KSBjb250aW51ZTsKLQkJICAgICB9Ci0JCSAgfQotCi0JICAgICAgICAgIGlmKCEobmV3ID0geGFsbG9jKHNpemVvZihEaXNwbGF5TW9kZVJlYykpKSkgcmV0dXJuIGZpcnN0OwotCi0gICAgICAgICAgICAgICAgICBtZW1zZXQobmV3LCAwLCBzaXplb2YoRGlzcGxheU1vZGVSZWMpKTsKLSAgICAgICAgICAgICAgICAgIGlmKCEobmV3LT5uYW1lID0geGFsbG9jKDEyKSkpIHsKLSAgICAgIAkJICAgICB4ZnJlZShuZXcpOwotCQkgICAgIHJldHVybiBmaXJzdDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmKCFmaXJzdCkgZmlyc3QgPSBuZXc7Ci0gICAgICAgICAgICAgICAgICBpZihjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gbmV3OwotCSAgICAgICAgICAgICBuZXctPnByZXYgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3OwotCi0JCSAgcFNpUy0+QWRkZWRQbGFzbWFNb2RlcyA9IFRSVUU7Ci0KLQkJICBzdHJjcHkoY3VycmVudC0+bmFtZSwgU2lTX1BsYXNtYU1vZGVbbF0ubmFtZSk7Ci0JICAgICAgICAgIC8qIHNwcmludGYoY3VycmVudC0+bmFtZSwgIiVkeCVkIiwgU2lTX1BsYXNtYU1vZGVbbF0uSERpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpU19QbGFzbWFNb2RlW2xdLlZEaXNwbGF5KTsgKi8KLQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdHVzID0gTU9ERV9PSzsKLQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHlwZSA9IE1fVF9CVUlMVElOOwotCi0JCSAgY3VycmVudC0+Q2xvY2sgPSBTaVNfUGxhc21hTW9kZVtsXS5jbG9jazsKLSAgICAgICAgICAgIAkgIGN1cnJlbnQtPlN5bnRoQ2xvY2sgPSBjdXJyZW50LT5DbG9jazsKLQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+SERpc3BsYXkgICA9IFNpU19QbGFzbWFNb2RlW2xdLkhEaXNwbGF5OwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+SFN5bmNTdGFydCA9IGN1cnJlbnQtPkhEaXNwbGF5ICsgU2lTX1BsYXNtYU1vZGVbbF0uSEZyb250UG9yY2g7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gY3VycmVudC0+SFN5bmNTdGFydCArIFNpU19QbGFzbWFNb2RlW2xdLkhTeW5jV2lkdGg7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5IVG90YWwgICAgID0gU2lTX1BsYXNtYU1vZGVbbF0uSFRvdGFsOwotCi0JCSAgY3VycmVudC0+VkRpc3BsYXkgICA9IFNpU19QbGFzbWFNb2RlW2xdLlZEaXNwbGF5OwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+VlN5bmNTdGFydCA9IGN1cnJlbnQtPlZEaXNwbGF5ICsgU2lTX1BsYXNtYU1vZGVbbF0uVkZyb250UG9yY2g7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5WU3luY0VuZCAgID0gY3VycmVudC0+VlN5bmNTdGFydCArIFNpU19QbGFzbWFNb2RlW2xdLlZTeW5jV2lkdGg7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5WVG90YWwgICAgID0gU2lTX1BsYXNtYU1vZGVbbF0uVlRvdGFsOwotCi0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5DcnRjSERpc3BsYXkgPSBjdXJyZW50LT5IRGlzcGxheTsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNIQmxhbmtTdGFydCA9IGN1cnJlbnQtPkhTeW5jU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5DcnRjSFN5bmNTdGFydCA9IGN1cnJlbnQtPkhTeW5jU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICBjdXJyZW50LT5DcnRjSFN5bmNFbmQgPSBjdXJyZW50LT5IU3luY0VuZDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNIQmxhbmtFbmQgPSBjdXJyZW50LT5IU3luY0VuZDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNIVG90YWwgPSBjdXJyZW50LT5IVG90YWw7Ci0KLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWRGlzcGxheSA9IGN1cnJlbnQtPlZEaXNwbGF5OwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+Q3J0Y1ZCbGFua1N0YXJ0ID0gY3VycmVudC0+VlN5bmNTdGFydDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWU3luY1N0YXJ0ID0gY3VycmVudC0+VlN5bmNTdGFydDsKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWU3luY0VuZCA9IGN1cnJlbnQtPlZTeW5jRW5kOwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+Q3J0Y1ZCbGFua0VuZCA9IGN1cnJlbnQtPlZTeW5jRW5kOwotICAgICAgICAgICAgICAgICAgY3VycmVudC0+Q3J0Y1ZUb3RhbCA9IGN1cnJlbnQtPlZUb3RhbDsKLQotICAgICAgICAgICAgICAgICAgaWYoU2lTX1BsYXNtYU1vZGVbbF0uU3luY0ZsYWdzICYgU0lTX1BMX0hTWU5DUCkKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUEhTWU5DOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9OSFNZTkM7Ci0KLSAgICAgICAgICAgICAgICAgIGlmKFNpU19QbGFzbWFNb2RlW2xdLlN5bmNGbGFncyAmIFNJU19QTF9WU1lOQ1ApCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5GbGFncyB8PSBWX1BWU1lOQzsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfTlZTWU5DOwotCi0JCSAgaWYoY3VycmVudC0+SERpc3BsYXkgPiBwU2lTLT5MQ0R3aWR0aCkKLQkJICAgICBwU2lTLT5MQ0R3aWR0aCA9IHBTaVMtPlNpU19Qci0+Q1BfTWF4WCA9IGN1cnJlbnQtPkhEaXNwbGF5OwotCSAgICAgICAgICBpZihjdXJyZW50LT5WRGlzcGxheSA+IHBTaVMtPkxDRGhlaWdodCkKLQkJICAgICBwU2lTLT5MQ0RoZWlnaHQgPSBwU2lTLT5TaVNfUHItPkNQX01heFkgPSBjdXJyZW50LT5WRGlzcGxheTsKLQotCQkgIHhmODZEcnZNc2cocFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JCSAgCSJcdEFkZGluZyBcIiVzXCIgdG8gbGlzdCBvZiBidWlsdC1pbiBtb2Rlc1xuIiwgY3VycmVudC0+bmFtZSk7Ci0KLSAgICAgICAgICAgICAgIH0KLQkgICAgICAgZG9uZSA9IFRSVUU7Ci0JICAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICB9Ci0KLSAgICAgaSsrOwotCi0gICB9Ci0KLSAgIGlmKHBTaVMtPlNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEpIHsKLQotICAgICAgZm9yKGk9MDsgaTw3OyBpKyspIHsKLQotICAgICAgICAgaWYocFNpUy0+U2lTX1ByLT5DUF9EYXRhVmFsaWRbaV0pIHsKLQotICAgICAgICAgICAgaWYoIShuZXcgPSB4YWxsb2Moc2l6ZW9mKERpc3BsYXlNb2RlUmVjKSkpKSByZXR1cm4gZmlyc3Q7Ci0KLSAgICAgICAgICAgIG1lbXNldChuZXcsIDAsIHNpemVvZihEaXNwbGF5TW9kZVJlYykpOwotICAgICAgICAgICAgaWYoIShuZXctPm5hbWUgPSB4YWxsb2MoMTApKSkgewotICAgICAgCQl4ZnJlZShuZXcpOwotCQlyZXR1cm4gZmlyc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighZmlyc3QpIGZpcnN0ID0gbmV3OwotICAgICAgICAgICAgaWYoY3VycmVudCkgewotICAgICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IG5ldzsKLQkgICAgICAgbmV3LT5wcmV2ID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VycmVudCA9IG5ldzsKLQotICAgICAgICAgICAgc3ByaW50ZihjdXJyZW50LT5uYW1lLCAiJWR4JWQiLCBwU2lTLT5TaVNfUHItPkNQX0hEaXNwbGF5W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lTLT5TaVNfUHItPkNQX1ZEaXNwbGF5W2ldKTsKLQotICAgICAgICAgICAgY3VycmVudC0+c3RhdHVzID0gTU9ERV9PSzsKLQotICAgICAgICAgICAgY3VycmVudC0+dHlwZSA9IE1fVF9CVUlMVElOOwotCi0gICAgICAgICAgICBjdXJyZW50LT5DbG9jayA9IHBTaVMtPlNpU19Qci0+Q1BfQ2xvY2tbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5TeW50aENsb2NrID0gY3VycmVudC0+Q2xvY2s7Ci0KLSAgICAgICAgICAgIGN1cnJlbnQtPkhEaXNwbGF5ICAgPSBwU2lTLT5TaVNfUHItPkNQX0hEaXNwbGF5W2ldOwotICAgICAgICAgICAgY3VycmVudC0+SFN5bmNTdGFydCA9IHBTaVMtPlNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPkhTeW5jRW5kICAgPSBwU2lTLT5TaVNfUHItPkNQX0hTeW5jRW5kW2ldOwotICAgICAgICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IHBTaVMtPlNpU19Qci0+Q1BfSFRvdGFsW2ldOwotCi0gICAgICAgICAgICBjdXJyZW50LT5WRGlzcGxheSAgID0gcFNpUy0+U2lTX1ByLT5DUF9WRGlzcGxheVtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPlZTeW5jU3RhcnQgPSBwU2lTLT5TaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5WU3luY0VuZCAgID0gcFNpUy0+U2lTX1ByLT5DUF9WU3luY0VuZFtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBwU2lTLT5TaVNfUHItPkNQX1ZUb3RhbFtpXTsKLQotICAgICAgICAgICAgY3VycmVudC0+Q3J0Y0hEaXNwbGF5ID0gY3VycmVudC0+SERpc3BsYXk7Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjSEJsYW5rU3RhcnQgPSBwU2lTLT5TaVNfUHItPkNQX0hCbGFua1N0YXJ0W2ldOwotICAgICAgICAgICAgY3VycmVudC0+Q3J0Y0hTeW5jU3RhcnQgPSBjdXJyZW50LT5IU3luY1N0YXJ0OwotICAgICAgICAgICAgY3VycmVudC0+Q3J0Y0hTeW5jRW5kID0gY3VycmVudC0+SFN5bmNFbmQ7Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjSEJsYW5rRW5kID0gcFNpUy0+U2lTX1ByLT5DUF9IQmxhbmtFbmRbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjSFRvdGFsID0gY3VycmVudC0+SFRvdGFsOwotCi0gICAgICAgICAgICBjdXJyZW50LT5DcnRjVkRpc3BsYXkgPSBjdXJyZW50LT5WRGlzcGxheTsKLSAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWQmxhbmtTdGFydCA9IHBTaVMtPlNpU19Qci0+Q1BfVkJsYW5rU3RhcnRbaV07Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjVlN5bmNTdGFydCA9IGN1cnJlbnQtPlZTeW5jU3RhcnQ7Ci0gICAgICAgICAgICBjdXJyZW50LT5DcnRjVlN5bmNFbmQgPSBjdXJyZW50LT5WU3luY0VuZDsKLSAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWQmxhbmtFbmQgPSBwU2lTLT5TaVNfUHItPkNQX1ZCbGFua0VuZFtpXTsKLSAgICAgICAgICAgIGN1cnJlbnQtPkNydGNWVG90YWwgPSBjdXJyZW50LT5WVG90YWw7Ci0KLQkgICAgaWYocFNpUy0+U2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0pIHsKLSAgICAgICAgICAgICAgIGlmKHBTaVMtPlNpU19Qci0+Q1BfSFN5bmNfUFtpXSkKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUEhTWU5DOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9OSFNZTkM7Ci0KLSAgICAgICAgICAgICAgIGlmKHBTaVMtPlNpU19Qci0+Q1BfVlN5bmNfUFtpXSkKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUFZTWU5DOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9OVlNZTkM7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgIC8qIE5vIHN5bmMgZGF0YT8gVXNlIHBvc2l0aXZlIHN5bmMuLi4gKi8KLQkgICAgICAgY3VycmVudC0+RmxhZ3MgfD0gVl9QSFNZTkM7Ci0JICAgICAgIGN1cnJlbnQtPkZsYWdzIHw9IFZfUFZTWU5DOwotCSAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBmaXJzdDsKLQotfQotCi0vKiBUcmFuc2xhdGUgYSBtb2RlIG51bWJlciBpbnRvIHRoZSBWRVNBIHBlbmRhbnQgKi8KLWludAotU2lTVHJhbnNsYXRlVG9WRVNBKFNjcm5JbmZvUHRyIHBTY3JuLCBpbnQgbW9kZW51bWJlcikKLXsKLSAgIFNJU1B0ciBwU2lTID0gU0lTUFRSKHBTY3JuKTsKLSAgIGludCAgICBpID0gMDsKLQotICAgLyogSW5pdGlhbGl6ZSBvdXIgcG9pbnRlcnMgKi8KLSAgIGlmKHBTaVMtPlZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIFNJUzMwMAotCUluaXRUbzMwMFBvaW50ZXIocFNpUy0+U2lTX1ByLCAmcFNpUy0+c2lzaHdfZXh0KTsKLSNlbHNlCi0JcmV0dXJuIC0xOwotI2VuZGlmCi0gICB9IGVsc2UgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgIAlJbml0VG8zMTBQb2ludGVyKHBTaVMtPlNpU19QciwgJnBTaVMtPnNpc2h3X2V4dCk7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotICAgfSBlbHNlIHJldHVybiAtMTsKLQotICAgaWYobW9kZW51bWJlciA8PSAweDEzKSByZXR1cm4gbW9kZW51bWJlcjsKLQotI2lmZGVmIFNJUzMxNUgKLSAgIGlmKHBTaVMtPlJPTTY2MU5ldykgewotICAgICAgd2hpbGUoU2lTX0VNb2RlSURUYWJsZTY2MVtpXS5FeHRfTW9kZUlEICE9IDB4ZmYpIHsKLSAgICAgICAgIGlmKFNpU19FTW9kZUlEVGFibGU2NjFbaV0uRXh0X01vZGVJRCA9PSBtb2RlbnVtYmVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludClTaVNfRU1vZGVJRFRhYmxlNjYxW2ldLkV4dF9WRVNBSUQ7Ci0gICAgICAgICB9Ci0gICAgICAgICBpKys7Ci0gICAgICB9Ci0gICB9IGVsc2UgewotI2VuZGlmCi0gICAgICB3aGlsZShwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbaV0uRXh0X01vZGVJRCAhPSAweGZmKSB7Ci0gICAgICAgICBpZihwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbaV0uRXh0X01vZGVJRCA9PSBtb2RlbnVtYmVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludClwU2lTLT5TaVNfUHItPlNpU19FTW9kZUlEVGFibGVbaV0uRXh0X1ZFU0FJRDsKLSAgICAgICAgIH0KLSAgICAgICAgIGkrKzsKLSAgICAgIH0KLSNpZmRlZiBTSVMzMTVICi0gICB9Ci0jZW5kaWYKLSAgIHJldHVybiAtMTsKLX0KLQotLyogVHJhbnNsYXRlIGEgbmV3IEJJT1MgbW9kZSBudW1iZXIgaW50byB0aGUgZHJpdmVyJ3MgcGVuZGFudCAqLwotaW50Ci1TaVNUcmFuc2xhdGVUb09sZE1vZGUoaW50IG1vZGVudW1iZXIpCi17Ci0jaWZkZWYgU0lTMzE1SAotICAgaW50ICAgIGkgPSAwOwotCi0gICB3aGlsZShTaVNfRU1vZGVJRFRhYmxlNjYxW2ldLkV4dF9Nb2RlSUQgIT0gMHhmZikgewotICAgICAgaWYoU2lTX0VNb2RlSURUYWJsZTY2MVtpXS5FeHRfTW9kZUlEID09IG1vZGVudW1iZXIpIHsKLSAgICAgICAgIGlmKFNpU19FTW9kZUlEVGFibGU2NjFbaV0uRXh0X015TW9kZUlEKQotICAgICAgICAgICAgcmV0dXJuIChpbnQpU2lTX0VNb2RlSURUYWJsZTY2MVtpXS5FeHRfTXlNb2RlSUQ7Ci0JIGVsc2UKLQkgICAgcmV0dXJuIG1vZGVudW1iZXI7Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICB9Ci0jZW5kaWYKLSAgIHJldHVybiBtb2RlbnVtYmVyOwotfQotCi0jZW5kaWYgIC8qIFhmcmVlODYgKi8KLQotI2lmZGVmIExJTlVYX0tFUk5FTAotaW50Ci1zaXNmYl9tb2RlX3JhdGVfdG9fZGNsb2NrKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0JCQkgIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCkKLXsKLSAgICBVU0hPUlQgTW9kZU5vID0gbW9kZW5vOwotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA9IDAsIENsb2NrSW5kZXggPSAwOwotICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSAwOwotICAgIGludCAgICBDbG9jazsKLQotICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSNpZmRlZiBTSVMzMDAKLSAgICAgICBJbml0VG8zMDBQb2ludGVyKFNpU19QciwgSHdJbmZvKTsKLSNlbHNlCi0gICAgICAgcmV0dXJuIDY1ICogMTAwMDsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgIEluaXRUbzMxMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gNjUgKiAxMDAwOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHs7Ci0gICAgCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgbW9kZSAleFxuIiwgTW9kZU5vKTsKLSAgICAJcmV0dXJuIDY1ICogMTAwMDsKLSAgICB9Ci0KLSAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlJFRmluZGV4OwotICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCArPSAocmF0ZWluZGV4IC0gMSk7Ci0gICAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7Ci0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgIENsb2NrSW5kZXggJj0gMHgzRjsKLSAgICB9Ci0gICAgQ2xvY2sgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtDbG9ja0luZGV4XS5DTE9DSyAqIDEwMDA7Ci0gICAgCi0gICAgcmV0dXJuKENsb2NrKTsKLX0KLQotQk9PTEVBTgotc2lzZmJfZ2V0dG90YWxmcm9tbW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciBtb2Rlbm8sIGludCAqaHRvdGFsLCBpbnQgKnZ0b3RhbCwgdW5zaWduZWQgY2hhciByYXRlaW5kZXgpCi17Ci0gICAgVVNIT1JUIE1vZGVObyA9IG1vZGVubzsKLSAgICBVU0hPUlQgTW9kZUlkSW5kZXggPSAwLCBDUlQxSW5kZXggPSAwOwotICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyOwotCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotI2lmZGVmIFNJUzMwMAotICAgICAgIEluaXRUbzMwMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotI2lmZGVmIFNJUzMxNUgKLSAgICAgICBJbml0VG8zMTBQb2ludGVyKFNpU19QciwgSHdJbmZvKTsKLSNlbHNlCi0gICAgICAgcmV0dXJuIEZBTFNFOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHJldHVybiBGQUxTRTsKLQotICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUkVGaW5kZXg7Ci0gICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICs9IChyYXRlaW5kZXggLSAxKTsKLSAgICBDUlQxSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQxQ1JUQzsKLQotICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxNF07Ci0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzBdOwotICAgICpodG90YWwgPSAoKChjcl9kYXRhICYgMHhmZikgfCAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDgpKSArIDUpICogODsKLQotICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxM107Ci0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzZdOwotICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbN107Ci0gICAgKnZ0b3RhbCA9ICgoY3JfZGF0YSAmIDB4RkYpIHwKLSAgICAgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEyICYgMHgwMSkgPDwgIDgpIHwKLQkgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YTIgJiAweDIwKSA8PCAgNCkgfAotCSAgICAgICAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICAmIDB4MDEpIDw8IDEwKSkgKyAyOwotCi0gICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKQotICAgICAgICp2dG90YWwgKj0gMjsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi1pbnQKLXNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotCQkJIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwKLQkJCSBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKLXsKLSAgICBVU0hPUlQgTW9kZU5vID0gbW9kZW5vOwotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA9IDAsIGluZGV4ID0gMDsKLSAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ID0gMDsKLSAgICB1bnNpZ25lZCBzaG9ydCBWUkUsIFZCRSwgVlJTLCBWQlMsIFZERSwgVlQ7Ci0gICAgdW5zaWduZWQgc2hvcnQgSFJFLCBIQkUsIEhSUywgSEJTLCBIREUsIEhUOwotICAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyLCBjcl9kYXRhMzsKLSAgICBpbnQgICAgICAgICAgICBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wLCBqOwotICAgCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotI2lmZGVmIFNJUzMwMAotICAgICAgIEluaXRUbzMwMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0jaWZkZWYgU0lTMzE1SAotICAgICAgIEluaXRUbzMxMFBvaW50ZXIoU2lTX1ByLCBId0luZm8pOwotI2Vsc2UKLSAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmKCEoU2lTX1NlYXJjaE1vZGVJRChTaVNfUHIsICZNb2RlTm8sICZNb2RlSWRJbmRleCkpKSByZXR1cm4gMDsKLQotICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUkVGaW5kZXg7Ci0gICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICs9IChyYXRlaW5kZXggLSAxKTsKLSAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDFDUlRDOwotCi0gICAgc3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTRdOwotCi0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMF07Ci0KLSAgICAvKiBIb3Jpem9udGFsIHRvdGFsICovCi0gICAgSFQgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLSAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMykgPDwgOCk7Ci0gICAgQSA9IEhUICsgNTsKLQotICAgIGNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzFdOwotCQotICAgIC8qIEhvcml6b250YWwgZGlzcGxheSBlbmFibGUgZW5kICovCi0gICAgSERFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDBDKSA8PCA2KTsKLSAgICBFID0gSERFICsgMTsKLQotICAgIGNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzRdOwotCQotICAgIC8qIEhvcml6b250YWwgcmV0cmFjZSAoPXN5bmMpIHN0YXJ0ICovCi0gICAgSFJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweEMwKSA8PCAyKTsKLSAgICBGID0gSFJTIC0gRSAtIDM7Ci0KLSAgICBjcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsyXTsKLQkKLSAgICAvKiBIb3Jpem9udGFsIGJsYW5rIHN0YXJ0ICovCi0gICAgSEJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDMwKSA8PCA0KTsKLQotICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzE1XTsKLQkKLSAgICBjcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlszXTsKLQotICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls1XTsKLQkKLSAgICAvKiBIb3Jpem9udGFsIGJsYW5rIGVuZCAqLwotICAgIEhCRSA9IChjcl9kYXRhICYgMHgxZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4ODApID4+IDIpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMykgPDwgNik7Ci0KLSAgICAvKiBIb3Jpem9udGFsIHJldHJhY2UgKD1zeW5jKSBlbmQgKi8KLSAgICBIUkUgPSAoY3JfZGF0YTIgJiAweDFmKSB8ICgoc3JfZGF0YSAmIDB4MDQpIDw8IDMpOwotCi0gICAgdGVtcCA9IEhCRSAtICgoRSAtIDEpICYgMjU1KTsKLSAgICBCID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDI1Nik7Ci0KLSAgICB0ZW1wID0gSFJFIC0gKChFICsgRiArIDMpICYgNjMpOwotICAgIEMgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgNjQpOwotCi0gICAgRCA9IEIgLSBGIC0gQzsKLQotICAgIGlmKChTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLlhSZXMgPT0gMzIwKSAmJgotICAgICAgICgoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5ZUmVzID09IDIwMCkgfHwKLQkoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5ZUmVzID09IDI0MCkpKSB7Ci0KLQkgLyogVGVycmlibGUgaGFjaywgYnV0IHRoZSBjb3JyZWN0IENSVEMgZGF0YSBmb3IKLQkgICogdGhlc2UgbW9kZXMgb25seSBwcm9kdWNlcyBhIGJsYWNrIHNjcmVlbi4uLgotCSAgKi8KLSAgICAgICB2YXItPmxlZnRfbWFyZ2luID0gKDQwMCAtIDM3Nik7Ci0gICAgICAgdmFyLT5yaWdodF9tYXJnaW4gPSAoMzI4IC0gMzIwKTsKLSAgICAgICB2YXItPmhzeW5jX2xlbiA9ICgzNzYgLSAzMjgpOwotCi0gICAgfSBlbHNlIHsKLQotICAgICAgIHZhci0+bGVmdF9tYXJnaW4gPSBEICogODsKLSAgICAgICB2YXItPnJpZ2h0X21hcmdpbiA9IEYgKiA4OwotICAgICAgIHZhci0+aHN5bmNfbGVuID0gQyAqIDg7Ci0KLSAgICB9Ci0KLSAgICBzcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxM107Ci0KLSAgICBjcl9kYXRhID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls2XTsKLQotICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUls3XTsKLQotICAgIC8qIFZlcnRpY2FsIHRvdGFsICovCi0gICAgVlQgPSAoY3JfZGF0YSAmIDB4RkYpIHwKLSAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDEpIDw8IDgpIHwKKyAgIC8qIFZlcnRpY2FsIGJsYW5rIHN0YXJ0ICovCisgICBWQlMgPSBjcmRhdGFbMTFdIHwKKwkgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YSAgJiAweDA4KSA8PCA1KSB8CiAJICgodW5zaWduZWQgc2hvcnQpKGNyX2RhdGEyICYgMHgyMCkgPDwgNCkgfAotCSAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDEpIDw8IDEwKTsKLSAgICBBID0gVlQgKyAyOworCSAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICAmIDB4MDQpIDw8IDgpOwogCi0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTBdOwotCQotICAgIC8qIFZlcnRpY2FsIGRpc3BsYXkgZW5hYmxlIGVuZCAqLwotICAgIFZERSA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDIpIDw8IDcpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4NDApIDw8IDMpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwMikgPDwgOSk7Ci0gICAgRSA9IFZERSArIDE7CisgICAvKiBWZXJ0aWNhbCBibGFuayBlbmQgKi8KKyAgIFZCRSA9IGNyZGF0YVsxMl0gfCAoKHVuc2lnbmVkIHNob3J0KShzcl9kYXRhICYgMHgxMCkgPDwgNCk7CisgICB0ZW1wID0gVkJFIC0gKChFIC0gMSkgJiA1MTEpOworICAgQiA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA1MTIpOwogCi0gICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbOF07CisgICAvKiBWZXJ0aWNhbCByZXRyYWNlICg9c3luYykgZW5kICovCisgICBWUkUgPSAoY3JkYXRhWzldICYgMHgwZikgfCAoKHNyX2RhdGEgJiAweDIwKSA+PiAxKTsKKyAgIHRlbXAgPSBWUkUgLSAoKEUgKyBGIC0gMSkgJiAzMSk7CisgICBDID0gKHRlbXAgPiAwKSA/IHRlbXAgOiAodGVtcCArIDMyKTsKIAotICAgIC8qIFZlcnRpY2FsIHJldHJhY2UgKD1zeW5jKSBzdGFydCAqLwotICAgIFZSUyA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDQpIDw8IDYpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4ODApIDw8IDIpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwOCkgPDwgNyk7Ci0gICAgRiA9IFZSUyArIDEgLSBFOworICAgRCA9IEIgLSBGIC0gQzsKIAotICAgIGNyX2RhdGEgPSAgU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW2luZGV4XS5DUlsxMV07Ci0KLSAgICBjcl9kYXRhMyA9IChTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzE2XSAmIDB4MDEpIDw8IDU7Ci0KLSAgICAvKiBWZXJ0aWNhbCBibGFuayBzdGFydCAqLwotICAgIFZCUyA9IChjcl9kYXRhICYgMHhmZikgfAotICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMiAmIDB4MDgpIDw8IDUpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChjcl9kYXRhMyAmIDB4MjApIDw8IDQpIHwKLQkgICgodW5zaWduZWQgc2hvcnQpIChzcl9kYXRhICYgMHgwNCkgPDwgOCk7Ci0KLSAgICBjcl9kYXRhID0gIFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTJdOwotCi0gICAgLyogVmVydGljYWwgYmxhbmsgZW5kICovCi0gICAgVkJFID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0gICAgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkgKHNyX2RhdGEgJiAweDEwKSA8PCA0KTsKLSAgICB0ZW1wID0gVkJFIC0gKChFIC0gMSkgJiA1MTEpOwotICAgIEIgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgNTEyKTsKLQotICAgIGNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzldOwotCi0gICAgLyogVmVydGljYWwgcmV0cmFjZSAoPXN5bmMpIGVuZCAqLwotICAgIFZSRSA9IChjcl9kYXRhICYgMHgwZikgfCAoKHNyX2RhdGEgJiAweDIwKSA+PiAxKTsKLSAgICB0ZW1wID0gVlJFIC0gKChFICsgRiAtIDEpICYgMzEpOwotICAgIEMgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgMzIpOwotCi0gICAgRCA9IEIgLSBGIC0gQzsKLSAgICAgIAotICAgIHZhci0+dXBwZXJfbWFyZ2luID0gRDsKLSAgICB2YXItPmxvd2VyX21hcmdpbiA9IEY7Ci0gICAgdmFyLT52c3luY19sZW4gPSBDOwotCi0gICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWcgJiAweDgwMDApCi0gICAgICAgdmFyLT5zeW5jICY9IH5GQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Ci0gICAgZWxzZQotICAgICAgIHZhci0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Ci0KLSAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZyAmIDB4NDAwMCkgICAgICAgCi0gICAgICAgdmFyLT5zeW5jICY9IH5GQl9TWU5DX0hPUl9ISUdIX0FDVDsKLSAgICBlbHNlCi0gICAgICAgdmFyLT5zeW5jIHw9IEZCX1NZTkNfSE9SX0hJR0hfQUNUOwotCQkKLSAgICB2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKLSAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZyAmIDB4MDA4MCkKLSAgICAgICB2YXItPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKLSAgICBlbHNlIHsKLSAgICAgICBqID0gMDsKLSAgICAgICB3aGlsZShTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCAhPSAweGZmKSB7Ci0gICAgICAgICAgaWYoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW2pdLkV4dF9Nb2RlSUQgPT0KLQkgICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLk1vZGVJRCkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpIHsKLQkgICAgICAJICB2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOwotICAgICAgICAgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCSAgaisrOwotICAgICAgIH0KLSAgICB9ICAgICAgIAotCi0gICAgaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7Ci0jaWYgMCAgLyogRG8gdGhpcz8gKi8KLSAgICAgICB2YXItPnVwcGVyX21hcmdpbiA8PD0gMTsKLSAgICAgICB2YXItPmxvd2VyX21hcmdpbiA8PD0gMTsKLSAgICAgICB2YXItPnZzeW5jX2xlbiA8PD0gMTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2CisgICBjdXJyZW50LT5WRGlzcGxheSAgID0gVkRFICsgMTsKKyAgIGN1cnJlbnQtPlZTeW5jU3RhcnQgPSBWUlMgKyAxOworICAgY3VycmVudC0+VlN5bmNFbmQgICA9ICgoVlJTICYgfjB4MWYpIHwgVlJFKSArIDE7CisgICBpZihWUkUgPD0gKFZSUyAmIDB4MWYpKSBjdXJyZW50LT5WU3luY0VuZCArPSAzMjsKKyAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBFICsgRCArIEMgKyBGOworI2lmIDAKKyAgIGN1cnJlbnQtPlZEaXNwbGF5ICAgPSBFOworICAgY3VycmVudC0+VlN5bmNTdGFydCA9IEUgKyBEOworICAgY3VycmVudC0+VlN5bmNFbmQgICA9IEUgKyBEICsgQzsKKyAgIGN1cnJlbnQtPlZUb3RhbCAgICAgPSBFICsgRCArIEMgKyBGOwogI2VuZGlmCi0gICAgfSBlbHNlIGlmKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7Ci0gICAgICAgdmFyLT51cHBlcl9tYXJnaW4gPj49IDE7Ci0gICAgICAgdmFyLT5sb3dlcl9tYXJnaW4gPj49IDE7Ci0gICAgICAgdmFyLT52c3luY19sZW4gPj49IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7ICAgICAgIAotfQkJCSAgCi0KKyNpZmRlZiBUV0RFQlVHCisgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywKKwkiVjogQSAlZCBCICVkIEMgJWQgRCAlZCBFICVkIEYgJWQgIFZUICVkIFZERSAlZCBWUlMgJWQgVkJTICVkIFZCRSAlZCBWUkUgJWRcbiIsCisJQSwgQiwgQywgRCwgRSwgRiwgVlQsIFZERSwgVlJTLCBWQlMsIFZCRSwgVlJFKTsKICNlbmRpZgorI2VuZGlmCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorICAgaWYod3JpdGVyZXMpIHZhci0+eXJlcyA9IHlyZXMgPSBFOworICAgdmFyLT51cHBlcl9tYXJnaW4gPSBEOworICAgdmFyLT5sb3dlcl9tYXJnaW4gPSBGOworICAgdmFyLT52c3luY19sZW4gPSBDOworI2VuZGlmCisKKyAgIGlmKCh4cmVzID09IDMyMCkgJiYgKCh5cmVzID09IDIwMCkgfHwgKHlyZXMgPT0gMjQwKSkpIHsKKwkvKiBUZXJyaWJsZSBoYWNrLCBidXQgY29ycmVjdCBDUlRDIGRhdGEgZm9yCisJICogdGhlc2UgbW9kZXMgb25seSBwcm9kdWNlcyBhIGJsYWNrIHNjcmVlbi4uLgorCSAqIChIUkUgaXMgMCwgbGVhZGluZyBpbnRvIGEgdG9vIGxhcmdlIEMgYW5kCisJICogYSBuZWdhdGl2ZSBELiBUaGUgQ1JUIGNvbnRyb2xsZXIgZG9lcyBub3QKKwkgKiBzZWVtIHRvIGxpa2UgY29ycmVjdGluZyBIUkUgdG8gNTApCisJICovCisjaWZkZWYgU0lTX1hPUkdfWEY4NgorICAgICAgY3VycmVudC0+SERpc3BsYXkgICA9IDMyMDsKKyAgICAgIGN1cnJlbnQtPkhTeW5jU3RhcnQgPSAzMjg7CisgICAgICBjdXJyZW50LT5IU3luY0VuZCAgID0gMzc2OworICAgICAgY3VycmVudC0+SFRvdGFsICAgICA9IDQwMDsKKyNlbmRpZgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKyAgICAgIHZhci0+bGVmdF9tYXJnaW4gPSAoNDAwIC0gMzc2KTsKKyAgICAgIHZhci0+cmlnaHRfbWFyZ2luID0gKDMyOCAtIDMyMCk7CisgICAgICB2YXItPmhzeW5jX2xlbiA9ICgzNzYgLSAzMjgpOworI2VuZGlmCisKKyAgIH0KKworfQorCisKKwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0LmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0LmgKaW5kZXggN2UzNmI3YS4uNjM0YzBhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvaW5pdC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBEYXRhIGFuZCBwcm90b3R5cGVzIGZvciBpbml0LmMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTUwLDE4ICs1MCwyNCBAQAogICoKICAqLwogCi0jaWZuZGVmIF9JTklUXwotI2RlZmluZSBfSU5JVF8KKyNpZm5kZWYgX0lOSVRfSF8KKyNkZWZpbmUgX0lOSVRfSF8KIAogI2luY2x1ZGUgIm9zZGVmLmgiCiAjaW5jbHVkZSAiaW5pdGRlZi5oIgogCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpbmNsdWRlICJzaXMuaCIKKyNkZWZpbmUgU0lTX05FRURfaW5TSVNSRUcKKyNkZWZpbmUgU0lTX05FRURfaW5TSVNSRUdXCisjZGVmaW5lIFNJU19ORUVEX2luU0lTUkVHTAorI2RlZmluZSBTSVNfTkVFRF9vdXRTSVNSRUcKKyNkZWZpbmUgU0lTX05FRURfb3V0U0lTUkVHVworI2RlZmluZSBTSVNfTkVFRF9vdXRTSVNSRUdMCiAjaW5jbHVkZSAic2lzX3JlZ3MuaCIKICNlbmRpZgogCi0jaWZkZWYgTElOVVhfS0VSTkVMCisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAogI2luY2x1ZGUgInZnYXR5cGVzLmgiCiAjaW5jbHVkZSAidnN0cnVjdC5oIgogI2lmZGVmIFNJU19DUApAQCAtNzMsNiArNzksMTAgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2luY2x1ZGUgPHZpZGVvL2ZiY29uLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzaXMuaCIKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKICNpbmNsdWRlIDxsaW51eC9zaXNmYi5oPgogI2Vsc2UKICNpbmNsdWRlIDx2aWRlby9zaXNmYi5oPgpAQCAtODAsNDQgKzkwLDQ1IEBACiAjZW5kaWYKIAogLyogTW9kZSBudW1iZXJzICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8zMjB4MjAwW10gICAgICA9IHsweDU5LCAweDQxLCAweDAwLCAweDRmfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzMyMHgyNDBbXSAgICAgID0gezB4NTAsIDB4NTYsIDB4MDAsIDB4NTN9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMzIweDI0MF9GU1ROW10gPSB7MHg1YSwgMHg1YiwgMHgwMCwgMHgwMH07ICAvKiBGU1ROICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF80MDB4MzAwW10gICAgICA9IHsweDUxLCAweDU3LCAweDAwLCAweDU0fTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzUxMngzODRbXSAgICAgID0gezB4NTIsIDB4NTgsIDB4MDAsIDB4NWN9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfNjQweDQwMFtdICAgICAgPSB7MHgyZiwgMHg1ZCwgMHgwMCwgMHg1ZX07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF82NDB4NDgwW10gICAgICA9IHsweDJlLCAweDQ0LCAweDAwLCAweDYyfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzcyMHg0ODBbXSAgICAgID0gezB4MzEsIDB4MzMsIDB4MDAsIDB4MzV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfNzIweDU3NltdICAgICAgPSB7MHgzMiwgMHgzNCwgMHgwMCwgMHgzNn07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF83Njh4NTc2W10gICAgICA9IHsweDVmLCAweDYwLCAweDAwLCAweDYxfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzgwMHg0ODBbXSAgICAgID0gezB4NzAsIDB4N2EsIDB4MDAsIDB4NzZ9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfODAweDYwMFtdICAgICAgPSB7MHgzMCwgMHg0NywgMHgwMCwgMHg2M307Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF84NDh4NDgwW10gICAgICA9IHsweDM5LCAweDNiLCAweDAwLCAweDNlfTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4Xzg1Nng0ODBbXSAgICAgID0gezB4M2YsIDB4NDIsIDB4MDAsIDB4NDV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfOTYweDU0MFtdICAgICAgPSB7MHgxZCwgMHgxZSwgMHgwMCwgMHgxZn07ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4Xzk2MHg2MDBbXSAgICAgID0gezB4MjAsIDB4MjEsIDB4MDAsIDB4MjJ9OyAgLyogMzE1IHNlcmllcyBvbmx5ICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xMDI0eDc2OFtdICAgICA9IHsweDM4LCAweDRhLCAweDAwLCAweDY0fTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzEwMjR4NTc2W10gICAgID0gezB4NzEsIDB4NzQsIDB4MDAsIDB4Nzd9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTAyNHg2MDBbXSAgICAgPSB7MHgyMCwgMHgyMSwgMHgwMCwgMHgyMn07ICAvKiAzMDAgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzEyODB4MTAyNFtdICAgID0gezB4M2EsIDB4NGQsIDB4MDAsIDB4NjV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTI4MHg5NjBbXSAgICAgPSB7MHg3YywgMHg3ZCwgMHgwMCwgMHg3ZX07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xMTUyeDc2OFtdICAgICA9IHsweDIzLCAweDI0LCAweDAwLCAweDI1fTsgIC8qIDMwMCBzZXJpZXMgb25seSAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTE1Mng4NjRbXSAgICAgPSB7MHgyOSwgMHgyYSwgMHgwMCwgMHgyYn07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8zMDBfMTI4MHg3NjhbXSA9IHsweDU1LCAweDVhLCAweDAwLCAweDVifTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzMxMF8xMjgweDc2OFtdID0gezB4MjMsIDB4MjQsIDB4MDAsIDB4MjV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTI4MHg3MjBbXSAgICAgPSB7MHg3OSwgMHg3NSwgMHgwMCwgMHg3OH07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xMjgweDgwMFtdICAgICA9IHsweDE0LCAweDE1LCAweDAwLCAweDE2fTsKLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzEzNjB4NzY4W10gICAgID0gezB4NDgsIDB4NGIsIDB4MDAsIDB4NGV9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMzAwXzEzNjB4MTAyNFtdPSB7MHg2NywgMHg2ZiwgMHgwMCwgMHg3Mn07ICAvKiAzMDAgc2VyaWVzLCBCQVJDTyBvbmx5ICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8xNDAweDEwNTBbXSAgICA9IHsweDI2LCAweDI3LCAweDAwLCAweDI4fTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTY4MHgxMDUwW10gICAgPSB7MHgxNywgMHgxOCwgMHgwMCwgMHgxOX07ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzE2MDB4MTIwMFtdICAgID0gezB4M2MsIDB4M2QsIDB4MDAsIDB4NjZ9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMTkyMHgxMDgwW10gICAgPSB7MHgyYywgMHgyZCwgMHgwMCwgMHg3M307ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgTW9kZUluZGV4XzE5MjB4MTQ0MFtdICAgID0gezB4NjgsIDB4NjksIDB4MDAsIDB4NmJ9Owotc3RhdGljIGNvbnN0IFVTSE9SVCBNb2RlSW5kZXhfMzAwXzIwNDh4MTUzNltdPSB7MHg2YywgMHg2ZCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgY29uc3QgVVNIT1JUIE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W109IHsweDZjLCAweDZkLCAweDAwLCAweDZlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMzIweDIwMFtdICAgICAgPSB7MHg1OSwgMHg0MSwgMHgwMCwgMHg0Zn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMyMHgyNDBbXSAgICAgID0gezB4NTAsIDB4NTYsIDB4MDAsIDB4NTN9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8zMjB4MjQwX0ZTVE5bXSA9IHsweDVhLCAweDViLCAweDAwLCAweDAwfTsgIC8qIEZTVE4gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfNDAweDMwMFtdICAgICAgPSB7MHg1MSwgMHg1NywgMHgwMCwgMHg1NH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzUxMngzODRbXSAgICAgID0gezB4NTIsIDB4NTgsIDB4MDAsIDB4NWN9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF82NDB4NDAwW10gICAgICA9IHsweDJmLCAweDVkLCAweDAwLCAweDVlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfNjQweDQ4MFtdICAgICAgPSB7MHgyZSwgMHg0NCwgMHgwMCwgMHg2Mn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzcyMHg0ODBbXSAgICAgID0gezB4MzEsIDB4MzMsIDB4MDAsIDB4MzV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF83MjB4NTc2W10gICAgICA9IHsweDMyLCAweDM0LCAweDAwLCAweDM2fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfNzY4eDU3NltdICAgICAgPSB7MHg1ZiwgMHg2MCwgMHgwMCwgMHg2MX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzgwMHg0ODBbXSAgICAgID0gezB4NzAsIDB4N2EsIDB4MDAsIDB4NzZ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF84MDB4NjAwW10gICAgICA9IHsweDMwLCAweDQ3LCAweDAwLCAweDYzfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfODQ4eDQ4MFtdICAgICAgPSB7MHgzOSwgMHgzYiwgMHgwMCwgMHgzZX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4Xzg1Nng0ODBbXSAgICAgID0gezB4M2YsIDB4NDIsIDB4MDAsIDB4NDV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF85NjB4NTQwW10gICAgICA9IHsweDFkLCAweDFlLCAweDAwLCAweDFmfTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF85NjB4NjAwW10gICAgICA9IHsweDIwLCAweDIxLCAweDAwLCAweDIyfTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xMDI0eDc2OFtdICAgICA9IHsweDM4LCAweDRhLCAweDAwLCAweDY0fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTAyNHg1NzZbXSAgICAgPSB7MHg3MSwgMHg3NCwgMHgwMCwgMHg3N307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzEwMjR4NjAwW10gICAgID0gezB4MjAsIDB4MjEsIDB4MDAsIDB4MjJ9OyAgLyogMzAwIHNlcmllcyBvbmx5ICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzEyODB4MTAyNFtdICAgID0gezB4M2EsIDB4NGQsIDB4MDAsIDB4NjV9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xMjgweDk2MFtdICAgICA9IHsweDdjLCAweDdkLCAweDAwLCAweDdlfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTE1Mng3NjhbXSAgICAgPSB7MHgyMywgMHgyNCwgMHgwMCwgMHgyNX07ICAvKiAzMDAgc2VyaWVzIG9ubHkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTE1Mng4NjRbXSAgICAgPSB7MHgyOSwgMHgyYSwgMHgwMCwgMHgyYn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMwMF8xMjgweDc2OFtdID0gezB4NTUsIDB4NWEsIDB4MDAsIDB4NWJ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8zMTBfMTI4MHg3NjhbXSA9IHsweDIzLCAweDI0LCAweDAwLCAweDI1fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTI4MHg3MjBbXSAgICAgPSB7MHg3OSwgMHg3NSwgMHgwMCwgMHg3OH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzEyODB4ODAwW10gICAgID0gezB4MTQsIDB4MTUsIDB4MDAsIDB4MTZ9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xMjgweDg1NFtdICAgICA9IHsweDFhLCAweDFiLCAweDAwLCAweDFjfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTM2MHg3NjhbXSAgICAgPSB7MHg0OCwgMHg0YiwgMHgwMCwgMHg0ZX07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMwMF8xMzYweDEwMjRbXT0gezB4NjcsIDB4NmYsIDB4MDAsIDB4NzJ9OyAgLyogMzAwIHNlcmllcywgQkFSQ08gb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xNDAweDEwNTBbXSAgICA9IHsweDI2LCAweDI3LCAweDAwLCAweDI4fTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xNjgweDEwNTBbXSAgICA9IHsweDE3LCAweDE4LCAweDAwLCAweDE5fTsgIC8qIDMxNSBzZXJpZXMgb25seSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8xNjAweDEyMDBbXSAgICA9IHsweDNjLCAweDNkLCAweDAwLCAweDY2fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTkyMHgxMDgwW10gICAgPSB7MHgyYywgMHgyZCwgMHgwMCwgMHg3M307ICAvKiAzMTUgc2VyaWVzIG9ubHkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNb2RlSW5kZXhfMTkyMHgxNDQwW10gICAgPSB7MHg2OCwgMHg2OSwgMHgwMCwgMHg2Yn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTW9kZUluZGV4XzMwMF8yMDQ4eDE1MzZbXT0gezB4NmMsIDB4NmQsIDB4MDAsIDB4MDB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1vZGVJbmRleF8zMTBfMjA0OHgxNTM2W109IHsweDZjLCAweDZkLCAweDAwLCAweDZlfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVNfRFJBTVR5cGVbMTddWzVdPXsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfRFJBTVR5cGVbMTddWzVdPXsKIAl7MHgwQywweDBBLDB4MDIsMHg0MCwweDM5fSwKIAl7MHgwRCwweDBBLDB4MDEsMHg0MCwweDQ4fSwKIAl7MHgwQywweDA5LDB4MDIsMHgyMCwweDM1fSwKQEAgLTEzNyw3ICsxNDgsNyBAQAogCXsweDA5LDB4MDgsMHgwMSwweDAxLDB4MDB9CiB9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNpU19TRFJEUkFNX1RZUEVbMTNdWzVdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfU0RSRFJBTV9UWVBFWzEzXVs1XSA9CiB7CiAJeyAyLDEyLCA5LDY0LDB4MzV9LAogCXsgMSwxMywgOSw2NCwweDQ0fSwKQEAgLTE1NCw3ICsxNjUsNyBAQAogCXsgMSwgOSwgOCwgMiwweDAwfQogfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVNfRERSRFJBTV9UWVBFWzRdWzVdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfRERSRFJBTV9UWVBFWzRdWzVdID0KIHsKIAl7IDIsMTIsIDksNjQsMHgzNX0sCiAJeyAyLDEyLCA4LDMyLDB4MzF9LApAQCAtMTYyLDcgKzE3Myw3IEBACiAJeyAyLCA5LCA4LCA0LDB4MDF9CiB9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNpU19NREFfREFDW10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX01EQV9EQUNbXSA9CiB7CiAJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAogICAgICAgICAweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsCkBAIC0xNzQsNyArMTg1LDcgQEAKICAgICAgICAgMHgzRiwweDNGLDB4M0YsMHgzRiwweDNGLDB4M0YsMHgzRiwweDNGCiB9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNpU19DR0FfREFDW10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0NHQV9EQUNbXSA9CiB7CiAgICAgICAgIDB4MDAsMHgxMCwweDA0LDB4MTQsMHgwMSwweDExLDB4MDksMHgxNSwKICAgICAgICAgMHgwMCwweDEwLDB4MDQsMHgxNCwweDAxLDB4MTEsMHgwOSwweDE1LApAQCAtMTg2LDcgKzE5Nyw3IEBACiAgICAgICAgIDB4MkEsMHgzQSwweDJFLDB4M0UsMHgyQiwweDNCLDB4MkYsMHgzRgogfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBTaVNfRUdBX0RBQ1tdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19FR0FfREFDW10gPQogewogICAgICAgICAweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA1LDB4MTUsCiAgICAgICAgIDB4MjAsMHgzMCwweDI0LDB4MzQsMHgyMSwweDMxLDB4MjUsMHgzNSwKQEAgLTE5OCw3ICsyMDksNyBAQAogICAgICAgICAweDJBLDB4M0EsMHgyRSwweDNFLDB4MkIsMHgzQiwweDJGLDB4M0YKIH07CiAKLXN0YXRpYyBjb25zdCBVU0hPUlQgU2lTX1ZHQV9EQUNbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfVkdBX0RBQ1tdID0KIHsKIAkweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA5LDB4MTUsCiAJMHgyQSwweDNBLDB4MkUsMHgzRSwweDJCLDB4M0IsMHgyRiwweDNGLApAQCAtMjEyLDcgKzIyMywzMSBAQAogCTB4MEIsMHgwQywweDBELDB4MEYsMHgxMAogfTsKIAotc3RhdGljIGNvbnN0IFNpU19TdFJlc0luZm9TdHJ1Y3QgU2lTX1N0UmVzSW5mb1tdPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfU3QgU2lTX1NNb2RlSURUYWJsZVtdID0KK3sKKwl7MHgwMSwweDkyMDgsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHg0MH0sCisJezB4MDEsMHgxMjEwLDB4MTQsMHgwMSwweDAxLDB4MDAsMHgwMSwweDAwLDB4NDB9LAorCXsweDAxLDB4MTAxMCwweDE3LDB4MDIsMHgwMiwweDAwLDB4MDEsMHgwMSwweDQwfSwKKwl7MHgwMywweDgyMDgsMHgwMywweDAwLDB4MDAsMHgwMCwweDAxLDB4MDIsMHg0MH0sCisJezB4MDMsMHgwMjEwLDB4MTYsMHgwMSwweDAxLDB4MDAsMHgwMSwweDAyLDB4NDB9LAorCXsweDAzLDB4MDAxMCwweDE4LDB4MDIsMHgwMiwweDAwLDB4MDEsMHgwMywweDQwfSwKKwl7MHgwNSwweDkyMDksMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHg0MH0sCisJezB4MDYsMHg4MjA5LDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LDB4NDB9LAorCXsweDA3LDB4MDAwMCwweDA3LDB4MDMsMHgwMywweDAwLDB4MDEsMHgwMywweDQwfSwKKwl7MHgwNywweDAwMDAsMHgxOSwweDAyLDB4MDIsMHgwMCwweDAxLDB4MDMsMHg0MH0sCisJezB4MGQsMHg5MjBhLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDB9LAorCXsweDBlLDB4ODIwYSwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDQwfSwKKwl7MHgwZiwweDAyMDIsMHgxMSwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsMHg0MH0sCisJezB4MTAsMHgwMjEyLDB4MTIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDA1LDB4NDB9LAorCXsweDExLDB4MDIxMiwweDFhLDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwNSwweDQwfSwKKwl7MHgxMiwweDAyMTIsMHgxYiwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDUsMHg0MH0sCisJezB4MTMsMHgwMjFiLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4NDB9LAorCXsweDEyLDB4MDAxMCwweDE4LDB4MDIsMHgwMiwweDAwLDB4MDAsMHgwNSwweDQwfSwKKwl7MHgxMiwweDAyMTAsMHgxOCwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDUsMHg0MH0sCisJezB4ZmYsMHgwMDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19TdFJlc0luZm9fUyBTaVNfU3RSZXNJbmZvW109CiB7CiAJeyA2NDAsNDAwfSwKIAl7IDY0MCwzNTB9LApAQCAtMjIxLDcgKzI1Niw3IEBACiAJeyA2NDAsNDgwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19Nb2RlUmVzSW5mb1N0cnVjdCBTaVNfTW9kZVJlc0luZm9bXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19Nb2RlUmVzSW5mb19TIFNpU19Nb2RlUmVzSW5mb1tdID0KIHsKIAl7ICAzMjAsIDIwMCwgOCwgOH0sICAgLyogMHgwMCAqLwogCXsgIDMyMCwgMjQwLCA4LCA4fSwgICAvKiAweDAxICovCkBAIC0yNTYsMTEgKzI5MSwxMiBAQAogCXsgMTI4MCwgODAwLCA4LDE2fSwgICAvKiAweDFlICovCiAJeyAxOTIwLDEwODAsIDgsMTZ9LCAgIC8qIDB4MWYgKi8KIAl7ICA5NjAsIDU0MCwgOCwxNn0sICAgLyogMHgyMCAqLwotCXsgIDk2MCwgNjAwLCA4LDE2fSAgICAvKiAweDIxICovCisJeyAgOTYwLCA2MDAsIDgsMTZ9LCAgIC8qIDB4MjEgKi8KKwl7IDEyODAsIDg1NCwgOCwxNn0gICAgLyogMHgyMiAqLwogfTsKIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCi1zdGF0aWMgY29uc3QgU2lTX1N0YW5kVGFibGVTdHJ1Y3QgU2lTX1N0YW5kVGFibGVbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1N0YW5kVGFibGVfUyBTaVNfU3RhbmRUYWJsZVtdPQogewogLyogMHgwMDogTURfMF8yMDAgKi8KICB7CkBAIC03MDQsMTEgKzc0MCwxMSBAQAogLyogU0lTIFZJREVPIEJSSURHRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1NvZnRTZXR0aW5nICA9IDB4MzA7ICAgLyogUkFNIHNldHRpbmcgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19Tb2Z0U2V0dGluZyAgPSAweDMwOyAgIC8qIFJBTSBzZXR0aW5nICovCiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfT3V0cHV0U2VsZWN0ID0gMHg0MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19PdXRwdXRTZWxlY3QgPSAweDQwOwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX05UU0NUaW1pbmdbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19OVFNDVGltaW5nW10gPSB7CiAJMHgxNywweDFkLDB4MDMsMHgwOSwweDA1LDB4MDYsMHgwYywweDBjLAogCTB4OTQsMHg0OSwweDAxLDB4MGEsMHgwNiwweDBkLDB4MDQsMHgwYSwKIAkweDA2LDB4MTQsMHgwZCwweDA0LDB4MGEsMHgwMCwweDg1LDB4MWIsCkBAIC03MTksNyArNzU1LDcgQEAKIAkweDAwLDB4NDAsMHg0NCwweDAwLDB4ZGIsMHgwMiwweDNiLDB4MDAKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUEFMVGltaW5nW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfUEFMVGltaW5nW10gPSB7CiAJMHgxOSwweDUyLDB4MzUsMHg2ZSwweDA0LDB4MzgsMHgzZCwweDcwLAogCTB4OTQsMHg0OSwweDAxLDB4MTIsMHgwNiwweDNlLDB4MzUsMHg2ZCwKIAkweDA2LDB4MTQsMHgzZSwweDM1LDB4NmQsMHgwMCwweDQ1LDB4MmIsCkBAIC03MzAsOCArNzY2LDggQEAKIAkweDAwLDB4NDAsMHgzZSwweDAwLDB4ZTEsMHgwMiwweDI4LDB4MDAKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfSGlUVkV4dFRpbWluZ1tdID0gewotICAgICAgICAweDMyLDB4NjUsMHgyYywweDVmLDB4MDgsMHgzMSwweDNhLDB4NjQsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfSGlUVkV4dFRpbWluZ1tdID0geworCTB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NCwKIAkweDI4LDB4MDIsMHgwMSwweDNkLDB4MDYsMHgzZSwweDM1LDB4NmQsCiAJMHgwNiwweDE0LDB4M2UsMHgzNSwweDZkLDB4MDAsMHhjNSwweDNmLAogCTB4NjQsMHg5MCwweDMzLDB4OGMsMHgxOCwweDM2LDB4M2UsMHgxMywKQEAgLTc0MSw4ICs3NzcsOCBAQAogCTB4NjMsMHg0ZiwweDI3LDB4MDAsMHhmYywweGZmLDB4NmEsMHgwMAogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19IaVRWU3QxVGltaW5nW10gPSB7Ci0gICAgICAgIDB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19IaVRWU3QxVGltaW5nW10gPSB7CisJMHgzMiwweDY1LDB4MmMsMHg1ZiwweDA4LDB4MzEsMHgzYSwweDY1LAogCTB4MjgsMHgwMiwweDAxLDB4M2QsMHgwNiwweDNlLDB4MzUsMHg2ZCwKIAkweDA2LDB4MTQsMHgzZSwweDM1LDB4NmQsMHgwMCwweGM1LDB4M2YsCiAJMHg2NSwweDkwLDB4N2IsMHhhOCwweDAzLDB4ZjAsMHg4NywweDAzLApAQCAtNzUyLDggKzc4OCw4IEBACiAJMHhhZiwweDVkLDB4MGUsMHgwMCwweGZjLDB4ZmYsMHgyZCwweDAwCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZTdDJUaW1pbmdbXSA9IHsKLSAgICAgICAgMHgzMiwweDY1LDB4MmMsMHg1ZiwweDA4LDB4MzEsMHgzYSwweDY0LAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0hpVFZTdDJUaW1pbmdbXSA9IHsKKwkweDMyLDB4NjUsMHgyYywweDVmLDB4MDgsMHgzMSwweDNhLDB4NjQsCiAJMHgyOCwweDAyLDB4MDEsMHgzZCwweDA2LDB4M2UsMHgzNSwweDZkLAogCTB4MDYsMHgxNCwweDNlLDB4MzUsMHg2ZCwweDAwLDB4YzUsMHgzZiwKIAkweDY0LDB4OTAsMHgzMywweDhjLDB4MTgsMHgzNiwweDNlLDB4MTMsCkBAIC03NjQsOCArODAwLDggQEAKIH07CiAKICNpZiAwCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZUZXh0VGltaW5nW10gPSB7Ci0gICAgICAgIDB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19IaVRWVGV4dFRpbWluZ1tdID0geworCTB4MzIsMHg2NSwweDJjLDB4NWYsMHgwOCwweDMxLDB4M2EsMHg2NSwKIAkweDI4LDB4MDIsMHgwMSwweDNkLDB4MDYsMHgzZSwweDM1LDB4NmQsCiAJMHgwNiwweDE0LDB4M2UsMHgzNSwweDZkLDB4MDAsMHhjNSwweDNmLAogCTB4NjUsMHg5MCwweGU3LDB4YmMsMHgwMywweDBjLDB4OTcsMHgwMywKQEAgLTc3Niw4ICs4MTIsOCBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZHcm91cDNEYXRhW10gPSB7Ci0gICAgICAgIDB4MDAsMHgxYSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHg1ZiwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19IaVRWR3JvdXAzRGF0YVtdID0geworCTB4MDAsMHgxYSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHg1ZiwKIAkweDA1LDB4MjEsMHhiMiwweGIyLDB4NTUsMHg3NywweDJhLDB4YTYsCiAJMHgyNSwweDJmLDB4NDcsMHhmYSwweGM4LDB4ZmYsMHg4ZSwweDIwLAogCTB4OGMsMHg2ZSwweDYwLDB4MmUsMHg1OCwweDQ4LDB4NzIsMHg0NCwKQEAgLTc4Nyw4ICs4MjMsOCBAQAogCTB4MTgsMHgwNSwweDE4LDB4MDUsMHg0YywweGE4LDB4MDEKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfSGlUVkdyb3VwM1NpbXVbXSA9IHsKLSAgICAgICAgMHgwMCwweDFhLDB4MjIsMHg2MywweDYyLDB4MjIsMHgwOCwweDk1LAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0hpVFZHcm91cDNTaW11W10gPSB7CisJMHgwMCwweDFhLDB4MjIsMHg2MywweDYyLDB4MjIsMHgwOCwweDk1LAogCTB4ZGIsMHgyMCwweGI4LDB4YjgsMHg1NSwweDQ3LDB4MmEsMHhhNiwKIAkweDI1LDB4MmYsMHg0NywweGZhLDB4YzgsMHhmZiwweDhlLDB4MjAsCiAJMHg4YywweDZlLDB4NjAsMHgxNSwweDI2LDB4ZDMsMHhlNCwweDExLApAQCAtNzk5LDggKzgzNSw4IEBACiB9OwogCiAjaWYgMAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19IaVRWR3JvdXAzVGV4dFtdID0gewotICAgICAgICAweDAwLDB4MWEsMHgyMiwweDYzLDB4NjIsMHgyMiwweDA4LDB4YTcsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfSGlUVkdyb3VwM1RleHRbXSA9IHsKKwkweDAwLDB4MWEsMHgyMiwweDYzLDB4NjIsMHgyMiwweDA4LDB4YTcsCiAJMHhmNSwweDIwLDB4Y2UsMHhjZSwweDU1LDB4NDcsMHgyYSwweGE2LAogCTB4MjUsMHgyZiwweDQ3LDB4ZmEsMHhjOCwweGZmLDB4OGUsMHgyMCwKIAkweDhjLDB4NmUsMHg2MCwweDE4LDB4MmMsMHgwYywweDIwLDB4MjIsCkBAIC04MTEsMTM2ICs4NDcsMTQxIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfTlRTQ1BoYXNlW10gICAgPSB7MHgyMSwweGVkLDB4YmEsMHgwOH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BBTFBoYXNlW10gICAgID0gezB4MmEsMHgwNSwweGUzLDB4MDB9Owotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QQUxNUGhhc2VbXSAgICA9IHsweDIxLDB4RTQsMHgyRSwweDlCfTsKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUEFMTlBoYXNlW10gICAgPSB7MHgyMSwweEY0LDB4M0UsMHhCQX07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX05UU0NQaGFzZTJbXSAgID0gezB4MjEsMHhGMCwweDdCLDB4RDZ9Owotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QQUxQaGFzZTJbXSAgICA9IHsweDJhLDB4MDksMHg4NiwweGU5fTsKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUEFMTVBoYXNlMltdICAgPSB7MHgyMSwweEU2LDB4RUYsMHhBNH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BBTE5QaGFzZTJbXSAgID0gezB4MjEsMHhGNiwweDk0LDB4NDZ9Owotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19TcGVjaWFsUGhhc2VbXSA9IHsweDFlLDB4OGMsMHg1YywweDdhfTsKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfU3BlY2lhbFBoYXNlTVtdPSB7MHgxZSwweDgzLDB4MGEsMHhlMH07Ci1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1NwZWNpYWxQaGFzZUpbXT0gezB4MjUsMHhkNCwweGZkLDB4NWV9OwotCi1zdGF0aWMgY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgU2lTX1N0UEFMRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfU3RQQUxEYXRhW10gPQogewotIHsgICAgMSwgICAxLCA4NjQsIDUyNSwxMjcwLCA0MDAsIDEwMCwgICAwLCA3NjAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCi0geyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDM1MCwgMTAwLCAgIDAsIDc2MCwweGY0LDB4ZmYsMHgxYywweDIyfSwKLSB7ICAgIDEsICAgMSwgODY0LCA1MjUsMTI3MCwgNDAwLCAgIDAsICAgMCwgNzIwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAotIHsgICAgMSwgICAxLCA4NjQsIDUyNSwxMjcwLCAzNTAsICAgMCwgICAwLCA3MjAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCi0geyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQ4MCwgIDUwLCAgIDAsIDc2MCwweGY0LDB4ZmYsMHgxYywweDIyfSwKLSB7ICAgIDEsICAgMSwgODY0LCA1MjUsMTI3MCwgNjAwLCAgNTAsICAgMCwgICAwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9CisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQwMCwgMTAwLCAwLCA3NjAsICAgIDAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDM1MCwgMTAwLCAwLCA3NjAsICAgIDAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQwMCwgICAwLCAwLCA3MjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDM1MCwgICAwLCAwLCA3MjAsICAgIDAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDQ4MCwgIDUwLCAwLCA3NjAsICAgIDAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCisgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDYwMCwgIDUwLCAwLCAgIDAsMHgzMDAsMHhmNCwweGZmLDB4MWMsMHgyMn0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfVFZEYXRhU3RydWN0ICBTaVNfRXh0UEFMRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfRXh0UEFMRGF0YVtdID0KIHsKLSB7ICAgMjcsICAxMCwgODQ4LCA0NDgsMTI3MCwgNTMwLCAgNTAsICAgMCwgIDUwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9LCAgLyogNjQweDQwMCwgMzIweDIwMCAqLwotIHsgIDEwOCwgIDM1LCA4NDgsIDM5OCwxMjcwLCA1MzAsICA1MCwgICAwLCAgNTAsMHhmNCwweGZmLDB4MWMsMHgyMn0sCi0geyAgIDEyLCAgIDUsIDk1NCwgNDQ4LDEyNzAsIDUzMCwgIDUwLCAgIDAsICA1MCwweGYxLDB4MDQsMHgxZiwweDE4fSwKLSB7ICAgIDksICAgNCwgOTYwLCA0NjMsMTY0NCwgNDM4LCAgNTAsICAgMCwgIDUwLDB4ZjQsMHgwYiwweDFjLDB4MGF9LAotIHsgICAgOSwgICA0LCA4NDgsIDUyOCwxMjcwLCA1MzAsICAgMCwgICAwLCAgNTAsMHhmNSwweGZiLDB4MWIsMHgyYX0sICAvKiA2NDB4NDgwLCAzMjB4MjQwICovCi0vKnsgIDM2LCAgMjUsMTA2MCwgNjQ4LDEzMTYsIDUzMCwgNDM4LCAgIDAsIDQzOCwweGViLDB4MDUsMHgyNSwweDE2fSwqLy8qIDgwMHg2MDAsIDQwMHgzMDAgKi8KLSB7ICAgMzYsICAyNSwxMDYwLCA2NDgsMTI3MCwgNTMwLCA0MzgsICAgMCwgNDM4LDB4ZWIsMHgwNSwweDI1LDB4MTZ9LCAgLyogODAweDYwMCwgNDAweDMwMCAtIGJldHRlciAqLwotIHsgICAgMywgICAyLDEwODAsIDYxOSwxMjcwLCA1NDAsIDQzOCwgICAwLCA0MzgsMHhmMywweDAwLDB4MWQsMHgyMH0sICAvKiA3MjB4NTc2ICovCi0geyAgICAxLCAgIDEsMTE3MCwgODIxLDEyNzAsIDUyMCwgNjg2LCAgIDAsIDY4NiwweEYzLDB4MDAsMHgxRCwweDIwfSwgIC8qIDEwMjR4NzY4ICovCi0geyAgICAxLCAgIDEsMTE3MCwgODIxLDEyNzAsIDUyMCwgNjg2LCAgIDAsIDY4NiwweEYzLDB4MDAsMHgxRCwweDIwfSwgIC8qIDEwMjR4NzY4IChmb3IgTlRTQyBlcXUpICovCi0geyAgICA5LCAgIDQsIDg0OCwgNTI4LDEyNzAsIDUzMCwgICAwLCAgIDAsICA1MCwweGY1LDB4ZmIsMHgxYiwweDJhfSAgIC8qIDcyMHg0ODAgdGVzdCAqLworIHsgICAyNywgIDEwLCA4NDgsIDQ0OCwxMjcwLCA1MzAsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9LCAgLyogNjQweDQwMCwgMzIweDIwMCAqLworIHsgIDEwOCwgIDM1LCA4NDgsIDM5OCwxMjcwLCA1MzAsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjQsMHhmZiwweDFjLDB4MjJ9LAorIHsgICAxMiwgICA1LCA5NTQsIDQ0OCwxMjcwLCA1MzAsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAorIHsgICAgOSwgICA0LCA5NjAsIDQ2MywxNjQ0LCA0MzgsICA1MCwgMCwgIDUwLCAgICAwLDB4ZjQsMHgwYiwweDFjLDB4MGF9LAorIHsgICAgOSwgICA0LCA4NDgsIDUyOCwxMjcwLCA1MzAsICAgMCwgMCwgIDUwLCAgICAwLDB4ZjUsMHhmYiwweDFiLDB4MmF9LCAgLyogNjQweDQ4MCwgMzIweDI0MCAqLworIHsgICAzNiwgIDI1LDEwNjAsIDY0OCwxMjcwLCA1MzAsIDQzOCwgMCwgNDM4LCAgICAwLDB4ZWIsMHgwNSwweDI1LDB4MTZ9LCAgLyogODAweDYwMCwgNDAweDMwMCAqLworIHsgICAgMywgICAyLDEwODAsIDYxOSwxMjcwLCA1NDAsIDQzOCwgMCwgNDM4LCAgICAwLDB4ZjMsMHgwMCwweDFkLDB4MjB9LCAgLyogNzIweDU3NiAqLworIHsgICAgMSwgICAxLDExNzAsIDgyMSwxMjcwLCA1MjAsIDY4NiwgMCwgNjg2LCAgICAwLDB4RjMsMHgwMCwweDFELDB4MjB9LCAgLyogMTAyNHg3NjggKi8KKyB7ICAgIDEsICAgMSwxMTcwLCA4MjEsMTI3MCwgNTIwLCA2ODYsIDAsIDY4NiwgICAgMCwweEYzLDB4MDAsMHgxRCwweDIwfSwgIC8qIDEwMjR4NzY4IChmb3IgTlRTQyBlcXUpICovCisgeyAgICA5LCAgIDQsIDg0OCwgNTI4LDEyNzAsIDUzMCwgICAwLCAwLCAgNTAsICAgIDAsMHhmNSwweGZiLDB4MWIsMHgyYX0gICAvKiA3MjB4NDgwICovCiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgU2lTX1N0TlRTQ0RhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19UVkRhdGEgU2lTX1N0TlRTQ0RhdGFbXSA9CiB7Ci0geyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgIDUwLCAgIDAsIDc2MCwweGYxLDB4MDQsMHgxZiwweDE4fSwKLSB7ICAgIDEsICAgMSwgODU4LCA1MjUsMTI3MCwgMzUwLCAgNTAsICAgMCwgNjQwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAotIHsgICAgMSwgICAxLCA4NTgsIDUyNSwxMjcwLCA0MDAsICAgMCwgICAwLCA3MjAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCi0geyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgICAwLCAgIDAsIDcyMCwweGY0LDB4MGIsMHgxYywweDBhfSwKLSB7ICAgIDEsICAgMSwgODU4LCA1MjUsMTI3MCwgNDgwLCAgIDAsICAgMCwgNzYwLDB4ZjEsMHgwNCwweDFmLDB4MTh9CisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgIDUwLCAwLCA3NjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgIDUwLCAwLCA2NDAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgICAwLCAwLCA3MjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgICAwLCAwLCA3MjAsICAgIDAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCisgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQ4MCwgICAwLCAwLCA3NjAsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfVFZEYXRhU3RydWN0ICBTaVNfRXh0TlRTQ0RhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19UVkRhdGEgU2lTX0V4dE5UU0NEYXRhW10gPQogewotIHsgIDE0MywgIDY1LCA4NTgsIDQ0MywxMjcwLCA0NDAsIDE3MSwgICAwLCAxNzEsMHhmMSwweDA0LDB4MWYsMHgxOH0sICAgIC8qIDY0MHg0MDAsIDMyMHgyMDAgKi8KLSB7ICAgODgsICAzNSwgODU4LCAzOTMsMTI3MCwgNDQwLCAxNzEsICAgMCwgMTcxLDB4ZjEsMHgwNCwweDFmLDB4MTh9LAotIHsgIDE0MywgIDcwLCA5MjQsIDQ0MywxMjcwLCA0NDAsICA5MiwgICAwLCAgOTIsMHhmMSwweDA0LDB4MWYsMHgxOH0sCi0geyAgMTQzLCAgNzAsIDkyNCwgMzkzLDEyNzAsIDQ0MCwgIDkyLCAgIDAsICA5MiwweGY0LDB4MGIsMHgxYywweDBhfSwKLSB7ICAxNDMsICA3NiwgODM2LCA1MjMsMTI3MCwgNDQwLCAyMjQsICAgMCwgICAwLDB4ZjEsMHgwNSwweDFmLDB4MTZ9LCAgICAvKiA2NDB4NDgwLCAzMjB4MjQwICovCi0geyAgMTQzLCAxMjAsMTA1NiwgNjQzLDEyNzAsIDQ0MCwgICAwLCAxMjgsICAgMCwweGY0LDB4MTAsMHgxYywweDAwfSwgICAgLyogODAweDYwMCwgNDAweDMwMCAgKi8KLS8qeyAgIDIsICAgMSwgODU4LCA1MDMsMTI3MCwgNDgwLCAgIDAsIDEyOCwgICAwLDB4ZWUsMHgwYywweDIyLDB4MDh9LCovICAvKiA3MjB4NDgwICAob2xkLCBmcm9tIDY1MCkgKi8KLSB7ICAxNDMsICA3NiwgODM2LCA1MjMsMTI3MCwgNDQwLCAgIDAsIDEyOCwgICAwLDB4ZWUsMHgwYywweDIyLDB4MDh9LCAgICAvKiA3MjB4NDgwIC0gQkVUVEVSIChmcm9tIDMwMCBzZXJpZXMpICovCi0vKnsgIDY1LCAgNjQsMTA1NiwgNzkxLDEyNzAsIDQ4MCwgNjM4LCAgIDAsICAgMCwweEVFLDB4MEMsMHgyMiwweDA4fSAqLyAgLyogMTAyNHg3NjggKDUyNWkpICovCi0geyAgICAxLCAgIDEsMTEwMCwgODExLDE0MTIsIDQ0MCwgICAwLCAxMjgsICAgMCwweGVlLDB4MGMsMHgyMiwweDA4fSwgICAgLyogMTAyNHg3NjggKDUyNWkpIENPUlJFQ1RFRCAqLwotIHsgICA2NSwgIDY0LDEwNTYsIDc5MSwxMjcwLCA0ODAsIDQ1NSwgICAwLCAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworIHsgIDE0MywgIDY1LCA4NTgsIDQ0MywxMjcwLCA0NDAsIDE3MSwgMCwgMTcxLCAgICAwLDB4ZjEsMHgwNCwweDFmLDB4MTh9LCAgICAvKiA2NDB4NDAwLCAzMjB4MjAwICovCisgeyAgIDg4LCAgMzUsIDg1OCwgMzkzLDEyNzAsIDQ0MCwgMTcxLCAwLCAxNzEsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgMTQzLCAgNzAsIDkyNCwgNDQzLDEyNzAsIDQ0MCwgIDkyLCAwLCAgOTIsICAgIDAsMHhmMSwweDA0LDB4MWYsMHgxOH0sCisgeyAgMTQzLCAgNzAsIDkyNCwgMzkzLDEyNzAsIDQ0MCwgIDkyLCAwLCAgOTIsICAgIDAsMHhmNCwweDBiLDB4MWMsMHgwYX0sCisgeyAgMTQzLCAgNzYsIDgzNiwgNTIzLDEyNzAsIDQ0MCwgMjI0LCAwLCAgIDAsICAgIDAsMHhmMSwweDA1LDB4MWYsMHgxNn0sICAgIC8qIDY0MHg0ODAsIDMyMHgyNDAgKi8KKyB7ICAxNDMsIDEyMCwxMDU2LCA2NDMsMTI3MCwgNDQwLCAgIDAsIDEsICAgMCwgICAgMCwweGY0LDB4MTAsMHgxYywweDAwfSwgICAgLyogODAweDYwMCwgNDAweDMwMCAgKi8KKyB7ICAxNDMsICA3NiwgODM2LCA1MjMsMTI3MCwgNDQwLCAgIDAsIDEsICAgMCwgICAgMCwweGVlLDB4MGMsMHgyMiwweDA4fSwgICAgLyogNzIweDQ4MCAtIEJFVFRFUiAoZnJvbSAzMDAgc2VyaWVzKSAqLworIHsgICAgMSwgICAxLDExMDAsIDgxMSwxNDEyLCA0NDAsICAgMCwgMSwgICAwLCAgICAwLDB4ZWUsMHgwYywweDIyLDB4MDh9LCAgICAvKiAxMDI0eDc2OCAoNTI1aSkgQ09SUkVDVEVEICovCisjaWYgMCAgLyogZmxpbW1lcnQgdW5kIGlzdCB1bnRlbiBhYmdlc2Nobml0dGVuIChOVFNDSFQsIE5UU0MgY2xvY2spICovCisgeyAgIDY1LCAgNjQsMTA1NiwgNzkxLDEyNzAsIDQ4MCwgNDU1LCAwLCAgIDAsICAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworI2VuZGlmCisjaWYgMAorIHsgICAgMSwgICAxLDExMDAsIDgxMSwxNDEyLCA0NDAsICAgMCwgMSwgICAwLCAgICAwLDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgICAvKiAxMDI0eDc2OCAoNTI1cCkgKi8KKyNlbmRpZgorI2lmIDAKKyB7ICAgIDEsICAgMSwxMTIwLCA4MjEsMTUxNiwgNDIwLCAgIDAsIDEsICAgMCwgICAgMCwweDAwLDB4MDAsMHgwMCwweDAwfSAgICAgLyogMTAyNHg3NjggKDUyNXApICovCisjZW5kaWYKKyNpZiAwCisgeyAgICAxLCAgIDEsIDkzOCwgODIxLDE1MTYsIDQyMCwgICAwLCAxLCAgIDAsICAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworI2VuZGlmCisjaWYgMCAvKiB6b29tIGhpbiwgdW50ZW4gYWJnZXNjaG5pdHRlbiAoTlRTQzJIVCwgTlRTQzEwMjQgY2xvY2spICovCisgeyAgICAxLCAgIDEsMTA3MiwgNzkxLDEyNzAsIDQ4MCwgNDU1LCAwLCAgIDAsICAgIDAsMHgwMCwweDAwLDB4MDAsMHgwMH0gICAgIC8qIDEwMjR4NzY4ICg1MjVwKSAqLworI2VuZGlmCisjaWYgMSAvKiB6dSB3ZWl0IGxpbmtzIChzcXVlZXplZCkgKE5UU0MySFQsIE5UU0MxMDI0IGNsb2NrKSAqLworIHsgICAgMSwgICAxLDExMDAsIDg0NiwxMjcwLCA0NDAsIDQ1NSwgMCwgICAwLCAgICAwLDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgICAvKiAxMDI0eDc2OCAoNTI1cCkgKi8KKyNlbmRpZgorI2lmIDAgLyogenUgd2VpdCBsaW5rcywgcmVjaHRzIGFiZ2VzY2huaXR0ZW4gKE5UU0MySFQsIE5UU0MxMDI0IGNsb2NrKSAqLworIHsgICAgMSwgICAxLDExMDAsIDg0NiwxNDEyLCA0NDAsIDQ1NSwgMCwgICAwLCAgICAwLDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgICAvKiAxMDI0eDc2OCAoNTI1cCkgKi8KKyNlbmRpZgogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdEhpVFZEYXRhW10gPSAgLyogU2xhdmUgKyBUVlNpbXUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfU3RIaVRWRGF0YVtdID0gIC8qIFNsYXZlICsgVFZTaW11ICovCiB7Ci0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MzIwLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MzIwLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4M2MwLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTUwLDEyOCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDEsICAgMSwgMHgzN2MsMHgyMzMsMHgyYjIsMHgzMjAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMSwgICAxLCAweDM3YywweDIzMywweDJiMiwweDJiYywgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MzIwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHgzN2MsMHgyMzMsMHgyYjIsMHgyYmMsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMSwgICAxLCAweDM3YywweDIzMywweDJiMiwweDNjMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTUwLCAxLCAwLCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdDJIaVRWRGF0YVtdID0gLyogU2xhdmUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfU3QySGlUVkRhdGFbXSA9IC8qIFNsYXZlICovCiB7Ci0geyAgICAzLCAgIDEsIDB4MzQ4LDB4MWUzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAJICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAzLCAgIDEsIDB4MzQ4LDB4MWUzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4MzdjLDB4MjMzLDB4MmIyLDB4MmJjLCAgICAwLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICA1LCAgIDIsIDB4MzQ4LDB4MjMzLDB4NjcwLDB4M2MwLDB4MDhkLDEyOCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTdjLDEyOCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDMsICAgMSwgMHgzNDgsMHgxZTMsMHg2NzAsMHgzYzAsMHgwMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMSwgICAxLCAweDM3YywweDIzMywweDJiMiwweDJiYywgCSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICAzLCAgIDEsIDB4MzQ4LDB4MWUzLDB4NjcwLDB4M2MwLDB4MDMyLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHgzN2MsMHgyMzMsMHgyYjIsMHgyYmMsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgNSwgICAyLCAweDM0OCwweDIzMywweDY3MCwweDNjMCwweDA4ZCwgMSwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICA4LCAgIDUsIDB4NDFhLDB4MmFiLDB4NjcwLDB4M2MwLDB4MTdjLCAxLCAwLCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19FeHRIaVRWRGF0YVtdID0KLXsKLSB7ICAgIDYsICAgMSwgMHgzNDgsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDMsICAgMSwgMHgzYzAsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDYsICAgMSwgMHgzNDgsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDMsICAgMSwgMHgzYzAsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDUsICAgMSwgMHgzNDgsMHgyMzMsMHg2NzAsMHgzYzAsMHgxNjYsMTI4LCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDY0MHg0ODAgICAqLwotIHsgICAxNiwgICA1LCAweDQxYSwweDJhYiwweDY3MCwweDNjMCwweDE0MywxMjgsIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogODAweDYwMCAgICovCi0geyAgIDI1LCAgMTIsIDB4NGVjLDB4MzUzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sICAvKiAxMDI0eDc2OCAgKi8KLSB7ICAgIDUsICAgNCwgMHg2MjcsMHg0NjQsMHg2NzAsMHgzYzAsMHgxMjgsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDEyODB4MTAyNCAqLwotIHsgICAgNCwgICAxLCAweDQxYSwweDIzMywweDYwYywweDNjMCwweDE0MywxMjgsIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogODAweDQ4MCAgICovCi0geyAgICA1LCAgIDIsIDB4NTc4LDB4MjkzLDB4NjcwLDB4M2MwLDB4MDMyLCAgMCwgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sICAvKiAxMDI0eDU3NiAgKi8KLSB7ICAgIDgsICAgNSwgMHg2ZDYsMHgzMjMsMHg2NzAsMHgzYzAsMHgxMjgsICAwLCAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDEyODB4NzIwICAqLwotIHsgIDEzNywgIDMyLCAweDNkNCwweDIzMywweDY2MywweDNiZiwweDE0MywgIDAsIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9ICAgLyogOTYweDYwMCAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YSBTaVNfRXh0SGlUVkRhdGFbXSA9Cit7IC8qIGFsbCBvayAqLworIHsgICAgNiwgICAxLCAweDM0OCwweDIzMywweDY2MCwweDNjMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICAzLCAgIDEsIDB4M2MwLDB4MjMzLDB4NjYwLDB4M2MwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDYsICAgMSwgMHgzNDgsMHgyMzMsMHg2NjAsMHgzYzAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorIHsgICAgMywgICAxLCAweDNjMCwweDIzMywweDY2MCwweDNjMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgeyAgICA1LCAgIDEsIDB4MzQ4LDB4MjMzLDB4NjcwLDB4M2MwLDB4MTY2LCAxLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDY0MHg0ODAgICAqLworIHsgICAxNiwgICA1LCAweDQxYSwweDJhYiwweDY3MCwweDNjMCwweDE0MywgMSwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA4MDB4NjAwICAgKi8KKyB7ICAgMjUsICAxMiwgMHg0ZWMsMHgzNTMsMHg2NzAsMHgzYzAsMHgwMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LCAgLyogMTAyNHg3NjggICovCisgeyAgICA1LCAgIDQsIDB4NjI3LDB4NDY0LDB4NjcwLDB4M2MwLDB4MTI4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDEyODB4MTAyNCAqLworIHsgICAgNCwgICAxLCAweDQxYSwweDIzMywweDYwYywweDNjMCwweDE0MywgMSwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA4MDB4NDgwICAgKi8KKyB7ICAgIDUsICAgMiwgMHg1NzgsMHgyOTMsMHg2NzAsMHgzYzAsMHgwMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LCAgLyogMTAyNHg1NzYgICovCisgeyAgICA4LCAgIDUsIDB4NmQ2LDB4MzIzLDB4NjcwLDB4M2MwLDB4MTI4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDEyODB4NzIwICAqLworIHsgICAgOCwgICAzLCAweDRlYywweDM1MywweDY3MCwweDNjMCwweDAzMiwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA5NjB4NjAwICAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdDUyNXBEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhIFNpU19TdDUyNXBEYXRhW10gPQogewotIHsgICAgMSwgICAxLCAweDZiNCwweDIwZCwweDRmNiwweDE5MCwgICA1MCwgIDAsIDB4MmY4LCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxNWUsICAgNTAsICAwLCAweDI4MCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4NmI0LDB4MjBkLDB4NGY2LDB4MTkwLCAgIDUwLCAgMCwgMHgyZjgsIDB4MDAsMHgwMCwweDAwLDB4MDB9LAotIHsgICAgMSwgICAxLCAweDZiNCwweDIwZCwweDRmNiwweDE1ZSwgICA1MCwgIDAsIDB4MjgwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxZTAsICAgIDAsICAwLCAweDJmOCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxOTAsICAgNTAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxNWUsICAgNTAsIDAsIDB4MjgwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxOTAsICAgNTAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxNWUsICAgNTAsIDAsIDB4MjgwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2YjQsMHgyMGQsMHg0ZjYsMHgxZTAsICAgIDAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19TdDc1MHBEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhIFNpU19TdDc1MHBEYXRhW10gPQogewotIHsgICAgMSwgICAxLCAweDY3MiwweDJlZSwweDUwMCwweDE5MCwgICA1MCwgIDAsIDB4MmY4LCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxNWUsICAgNTAsICAwLCAweDI4MCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgICAxLCAgIDEsIDB4NjcyLDB4MmVlLDB4NTAwLDB4MTkwLCAgICAwLCAgMCwgMHgyZDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LAotIHsgICAgMSwgICAxLCAweDY3MiwweDJlZSwweDUwMCwweDE1ZSwgICAgMCwgIDAsIDB4MmQwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxZTAsICAgIDAsICAwLCAweDJmOCwgMHgwMCwweDAwLDB4MDAsMHgwMH0KKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxOTAsICAgNTAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxNWUsICAgNTAsIDAsIDB4MjgwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxOTAsICAgIDAsIDAsIDB4MmQwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxNWUsICAgIDAsIDAsIDB4MmQwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDEsICAgMSwgMHg2NzIsMHgyZWUsMHg1MDAsMHgxZTAsICAgIDAsIDAsIDB4MmY4LCAwLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgIFNpU19FeHQ3NTBwRGF0YVtdID0KLXsKLSB7ICAxNDMsICA2NSwgMHgzNWEsMHgxYmIsMHg0ZjYsMHgxYjgsMHgwYWIsICAwLCAweDBhYiwgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgIDg4LCAgMzUsIDB4MzVhLDB4MTg5LDB4NGY2LDB4MWI4LDB4MGFiLCAgMCwgMHgwYWIsIDB4MDAsMHgwMCwweDAwLDB4MDB9LAotIHsgICAxOCwgICA1LCAweDMzOSwweDFhZSwweDUwMCwweDJkMCwweDA1YywgIDAsIDB4MDVjLCAweDAwLDB4MDAsMHgwMCwweDAwfSwKLSB7ICAxNDMsICA3MCwgMHgzOWMsMHgxODksMHg0ZjYsMHgxYjgsMHgwNWMsICAwLCAweDA1YywgMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0geyAgIDk5LCAgMzIsIDB4MzIwLDB4MWZlLDB4NTAwLDB4MmQwLCAgIDUwLCAgMCwgICAgIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogNjQweDQ4MCAgKi8KLSB7ICAgIDUsICAgNCwgMHg1ZDgsMHgyOWUsMHg1MDAsMHgyYTgsICAgNTAsICAwLCAgICAgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0sICAvKiA4MDB4NjAwICAqLwotIHsgICA5OSwgIDMyLCAweDMyMCwweDFmZSwweDUwMCwweDJkMCwgICA1MCwgIDAsICAgICAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDcyMHg0ODAgdGVzdCBXT1JLUyAqLwotIHsgICA2OCwgIDY0LCAweDU1ZiwweDM0NiwweDUwMCwweDJhOCwweDI3ZSwgIDAsICAgICAwLCAweDAwLDB4MDAsMHgwMCwweDAwfSwgIC8qIDEwMjR4NzY4ICovCi0geyAgICA1LCAgIDIsIDB4M2E3LDB4MjI2LDB4NTAwLDB4MmE4LCAgICAwLDEyOCwgICAgIDAsIDB4MDAsMHgwMCwweDAwLDB4MDB9LCAgLyogNzIweDU3NiAgKi8KLSB7ICAgMjUsICAyNCwgMHg1ZDgsMHgyZjMsMHg0NjAsMHgyYTgsICAgNTAsICAwLCAgICAgMCwgMHgwMCwweDAwLDB4MDAsMHgwMH0gICAvKiAxMjgweDcyMCBXT1JLUyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhIFNpU19FeHQ3NTBwRGF0YVtdID0KK3sgLyogYWxsIG9rICovCisgeyAgICAzLCAgMSwgIDkzNSwgNDcwLCAxMTMwLCA2ODAsICA1MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiAzMjB4MjAwLzY0MHg0MDAgKi8KKyB7ICAgMjQsICA3LCAgOTM1LCA0MjAsIDExMzAsIDY4MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDMsICAxLCAgOTM1LCA0NzAsIDExMzAsIDY4MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgMjQsICA3LCAgOTM1LCA0MjAsIDExMzAsIDY4MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyB7ICAgIDIsICAxLCAxMTAwLCA1OTAsIDExMzAsIDY0MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDY0MHg0ODAgKi8KKyB7ICAgIDMsICAyLCAxMjEwLCA2OTAsIDExMzAsIDY2MCwgIDUwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDgwMHg2MDAgT0sgKi8KKyB7ICAgIDIsICAxLCAxMTAwLCA1NjIsIDExMzAsIDY0MCwgICAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDcyMHg0ODAgT0sgKi8KKyB7ICAgIDEsICAxLCAxMzc1LCA4NzgsIDExMzAsIDY0MCwgNjM4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIC8qIDEwMjR4NzY4IE9LICovCisgeyAgICA1LCAgMywgMTEwMCwgNjc1LCAxMTMwLCA2NDAsICAgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMH0sICAvKiA3MjAvNzY4eDU3NiBPSyAqLworIHsgICAyNSwgMjQsIDE0OTYsIDc1NSwgMTEyMCwgNjgwLCAgNTAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9ICAgLyogMTI4MHg3MjAgT0sgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDEyODB4NzIwRGF0YVtdID0gIC8qIDIuMDMuMDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4NzIwRGF0YVtdID0gIC8qIDIuMDMuMDAgKi8KIHsKIAl7ICA0NCwgICAxNSwgIDg2NCwgIDQzMCwgMTQwOCwgIDgwNiB9LCAvKiA2NDB4NDAwICovCiAJeyAxMjgsICAgMzUsICA3OTIsICAzODUsIDE0MDgsICA4MDYgfSwKQEAgLTk2Miw3ICsxMDAzLDcgQEAKICAqIChOb3RlOiAxMjgweDc2OF8zIGlzIG5vdyBzcGVjaWFsIGZvciBTaVMzMDEvTmV0VmlzdGEKICAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19TdExDRDEyODB4NzY4XzJEYXRhW10gPSAvKiAyLjAzLjAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19TdExDRDEyODB4NzY4XzJEYXRhW10gPSAvKiAyLjAzLjAwICovCiB7CiAJeyAgNjQsICAgMjEsICA4NTgsICA0MzQsIDE0MDgsICA4MDYgfSwgLyogNjQweDQwMCAqLwogCXsgIDMyLCAgICA5LCAgODU4LCAgMzcyLCAxNDA4LCAgODA2IH0sCkBAIC05NzcsNyArMTAxOCw3IEBACiAJeyAgMTYsICAgMTUsIDE2MDAsICA3NTAsIDE2MDAsICA4MDYgfSAgLyogMTI4MHg3MjAgLSBmcm9tIEV4dCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfRXh0TENEMTI4MHg3NjhfMkRhdGFbXSA9IC8qIDIuMDMuMDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0V4dExDRDEyODB4NzY4XzJEYXRhW10gPSAvKiAyLjAzLjAwICovCiB7CiAJeyAgMTYsICAgIDUsICA5NjAsICA0MTAsIDE2MDAsICA4MDYgfSwgLyogNjQweDQwMCAqLwogCXsgIDY0LCAgIDIxLCAxMTUyLCAgMzY0LCAxNjAwLCAgODA2IH0sCkBAIC05OTMsNyArMTAzNCw3IEBACiB9OwogCiAjaWYgMCAgLyogTm90IHVzZWQ7IF8zIG5vdyByZXNlcnZlZCBmb3IgTmV0VmlzdGEgKFNpUzMwMSkgKi8KLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDEyODB4NzY4XzNEYXRhW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVNfTENEMTI4MHg3NjhfM0RhdGFbXSA9CiB7CiAJeyAgNjQsICAgMjUsIDEwNTYsICA0MjIsIDE2NjQsICA3OTggfSwJCQkvKiA2NDB4NDAwICovCiAJeyAxMjgsICAgMzksICA4ODQsICAzOTYsIDE0MDgsICA4MDYgfSwgLyogLDY0MCAqLwpAQCAtMTAwOSw3ICsxMDUwLDcgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfTENEMTI4MHg4MDBEYXRhW10gPSAvKiAwLjkzLjEyYSAoVE1EUykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4ODAwRGF0YVtdID0gLyogMC45My4xMmEgKFRNRFMpICovCiB7CiAJeyAxMjgsICAgNTEsIDExMjIsICA0MTIsIDE0MDgsICA4MTYgfSwgIC8qIDY0MHg0MDAgKi8KIAl7IDEyOCwgICA0OSwgMTIzMiwgIDM2MSwgMTQwOCwgIDgxNiB9LApAQCAtMTAyNCw3ICsxMDY1LDcgQEAKIAl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9ICAgLyogMTI4MHg3MjAgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDEyODB4ODAwXzJEYXRhW10gPSAvKiAyLjAzLjAwIChMVkRTKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSBTaVNfTENEMTI4MHg4MDBfMkRhdGFbXSA9IC8qIDIuMDMuMDAgKExWRFMpICovCiB7CiAJeyAgOTcsICAgNDIsIDEzNDQsICA0MDksIDE1NTIsICA4MTIgfSwgLyogNjQweDQwMCAqLwogCXsgIDk3LCAgIDM1LCAxMjgwLCAgMzU4LCAxNTUyLCAgODEyIH0sCkBAIC0xMDM5LDcgKzEwODAsNDIgQEAKIAl7ICA5NywgICA5MCwgMTYwMCwgIDczMCwgMTU1MiwgIDgxMiB9ICAvKiAxMjgweDcyMCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfTENEMTI4MHg5NjBEYXRhW10gPQorI2lmIDAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4ODAwXzNEYXRhW10gPSAvKiAyLjAyLjA1YSAoTFZEUyk7IG0yNTAgKi8KK3sKKwl7IDEyOCwgICA1MSwgMTEyMiwgIDQxMiwgMTQwOCwgIDgxNiB9LCAvKiA2NDB4NDAwICovCisJeyAxMjgsICAgNDksIDEyMzIsICAzNjEsIDE0MDgsICA4MTYgfSwKKwl7IDEyOCwgICA1MSwgMTEyMiwgIDQxMiwgMTQwOCwgIDgxNiB9LAorCXsgMTI4LCAgIDQ5LCAxMjMyLCAgMzYxLCAxNDA4LCAgODE2IH0sCisJeyAgIDgsICAgIDMsICA4ODAsICA0OTEsIDE0MDgsICA4MTYgfSwgLyogNjQweDQ4MCAqLworCXsgIDExLCAgICA2LCAxMDI0LCAgNjEyLCAxNDA4LCAgODE2IH0sIC8qIDgwMHg2MDAgKi8KKwl7ICAyMiwgICAyMSwgMTQwMCwgIDc4NCwgMTQwOCwgIDgxNiB9LCAvKiAxMDI0eDc2OCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sIC8qIDEyODB4MTAyNCAqLworCXsgICAxLCAgICAxLCAxNDA4LCAgODE2LCAxNDA4LCAgODE2IH0sIC8qIDEyODB4ODAwICovCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwgLyogMTI4MHg3NjggLSBwYXRjaCBpbmRleCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0gIC8qIDEyODB4NzIwICovCit9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4ODU0RGF0YVtdID0gLyogMi4yMS4wMENTIChMVkRTKSAqLworeworCXsgIDU2LCAgIDE1LCAgOTM2LCAgNDEwLCAxNjY0LCAgODYxIH0sICAvKiA2NDB4NDAwICovCisJeyAgNjQsICAgMjUsIDE1ODYsICAzNTUsIDE2NjQsICA4NjEgfSwKKwl7ICA1NiwgICAxNSwgIDkzNiwgIDQxMCwgMTY2NCwgIDg2MSB9LAorCXsgIDY0LCAgIDI1LCAxNTg2LCAgMzU1LCAxNjY0LCAgODYxIH0sCisJeyAgOTEsICAgNDUsIDE0NjQsICA0ODUsIDE2NjQsICA4NjEgfSwgIC8qIDY0MHg0ODAgKi8KKwl7IDE4MiwgICA3NSwgIDk3NiwgIDYwNSwgMTY2NCwgIDg2MSB9LCAgLyogODAweDYwMCAqLworCXsgIDkxLCAgIDY2LCAxMzQyLCAgNzc0LCAxNjY0LCAgODYxIH0sICAvKiAxMDI0eDc2OCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sICAvKiAxMjgweDEwMjQgKi8KKwl7ICAyNiwgICAyNSwgMTcwOCwgIDgwNywgMTY2NCwgIDg2MSB9LCAgLyogMTI4MHg4MDAgKi8KKwl7ICAxMywgICAxMiwgMTcwOCwgIDc3NCwgMTY2NCwgIDg2MSB9LCAgLyogMTI4MHg3NjggLSBwYXRjaCBpbmRleCAqLworCXsgIDUyLCAgIDQ1LCAxNzA4LCAgNzI1LCAxNjY0LCAgODYxIH0sICAvKiAxMjgweDcyMCAqLworCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMSwgICAgMSwgMTY2NCwgIDg2MSwgMTY2NCwgIDg2MSB9ICAgLyogMTI4MHg4NTQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0xDRDEyODB4OTYwRGF0YVtdID0KIHsKIAl7ICAgIDksICAgMiwgIDgwMCwgIDUwMCwgMTgwMCwgMTAwMCB9LAogCXsgICAgOSwgICAyLCAgODAwLCAgNTAwLCAxODAwLCAxMDAwIH0sCkBAIC0xMDQ5LDEwICsxMTI1LDE1IEBACiAJeyAgIDMwLCAgMTEsIDEwNTYsICA2MjUsIDE4MDAsIDEwMDAgfSwKIAl7ICAgIDUsICAgMywgMTM1MCwgIDgwMCwgMTgwMCwgMTAwMCB9LAogCXsgICAgMSwgICAxLCAxNTc2LCAxMDUwLCAxNTc2LCAxMDUwIH0sCi0JeyAgICAxLCAgIDEsIDE4MDAsIDEwMDAsIDE4MDAsIDEwMDAgfQorCXsgICAgMSwgICAxLCAxODAwLCAxMDAwLCAxODAwLCAxMDAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19TdExDRDE0MDB4MTA1MERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19TdExDRDE0MDB4MTA1MERhdGFbXSA9CiB7CiAJeyAyMTEsICAxMDAsIDIxMDAsICA0MDgsIDE2ODgsIDEwNjYgfSwKIAl7IDIxMSwgICA2NCwgMTUzNiwgIDM1OCwgMTY4OCwgMTA2NiB9LApAQCAtMTA2MiwxMCArMTE0MywxNSBAQAogCXsgMjExLCAgIDcyLCAxMDA4LCAgNjA5LCAxNjg4LCAxMDY2IH0sCiAJeyAyMTEsICAxMjgsIDE0MDAsICA3NzYsIDE2ODgsIDEwNjYgfSwKIAl7IDIxMSwgIDIwNSwgMTY4MCwgMTA0MSwgMTY4OCwgMTA2NiB9LAotCXsgICAxLCAgICAxLCAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2IH0KKwl7ICAgMSwgICAgMSwgMTY4OCwgMTA2NiwgMTY4OCwgMTA2NiB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0sCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVNfRXh0TENEMTQwMHgxMDUwRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX0V4dExDRDE0MDB4MTA1MERhdGFbXSA9CiB7CiAvKgl7IDIxMSwgICA2MCwgMTI2MCwgIDQxMCwgMTY4OCwgMTA2NiB9LCAgICA2NDB4NDAwICg2MzMwKSAqLwogCXsgMjExLCAgMTAwLCAyMTAwLCAgNDA4LCAxNjg4LCAxMDY2IH0sIC8qIDY0MHg0MDAgKDYzMjUpIFdPUktTICovCkBAIC0xMDgwLDEwICsxMTY2LDEzIEBACiAJeyAyMTEsICAyMDUsIDE2ODAsIDEwNDEsIDE2ODgsIDEwNjYgfSwgLyogMTI4MHgxMDI0IC0gbm90IHVzZWQgKGFsd2F5cyB1bnNjYWxlZCkgKi8KIAl7ICAgMSwgICAgMSwgMTY4OCwgMTA2NiwgMTY4OCwgMTA2NiB9LCAvKiAxNDAweDEwNTAgKi8KIAl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LCAvKiBrbHVkZ2UgKi8KLQl7IDIxMSwgIDEyMCwgMTQwMCwgIDczMCwgMTY4OCwgMTA2NiB9ICAvKiAxMjgweDcyMCAqLworCXsgMjExLCAgMTIwLCAxNDAwLCAgNzMwLCAxNjg4LCAxMDY2IH0sIC8qIDEyODB4NzIwICovCisJeyAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSwKKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9LAorCXsgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0xDRDE2ODB4MTA1MERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19MQ0QxNjgweDEwNTBEYXRhW10gPQogewogCXsgIDk1LCAgIDI0LCAxMjYwLCAgNDEwLCAxOTAwLCAxMDY2IH0sIC8qICAwIDY0MHg0MDAgKi8KIAl7ICAxMCwgICAgMywgMTcxMCwgIDM2MiwgMTkwMCwgMTA2NiB9LApAQCAtMTA5NywxMCArMTE4NiwxMSBAQAogCXsgIDk1LCAgIDY5LCAxODAwLCAgODE3LCAxOTAwLCAxMDY2IH0sIC8qICA5IDEyODB4ODAwIHBhdGNoIGluZGV4ICovCiAJeyAgMTMsICAgIDksIDE5MDAsICA3MzksIDE5MDAsIDEwNjYgfSwgLyogMTAgMTI4MHg3MjAgKi8KIAl7ICA5NSwgICA5NCwgMTg4MCwgMTA2NiwgMTkwMCwgMTA2NiB9LCAvKiAxMSAxNDAweDEwNTAgcGF0Y2ggaW5kZXggKi8KLQl7ICAgMSwgICAgMSwgMTkwMCwgMTA2NiwgMTkwMCwgMTA2NiB9ICAvKiAxMiAxNjgweDEwNTAgKi8KKwl7ICAgMSwgICAgMSwgMTkwMCwgMTA2NiwgMTkwMCwgMTA2NiB9LCAvKiAxMiAxNjgweDEwNTAgKi8KKwl7ICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19TdExDRDE2MDB4MTIwMERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19TdExDRDE2MDB4MTIwMERhdGFbXSA9CiB7CiAJezI3LCAgNCwgODAwLCA1MDAsIDIxNjAsIDEyNTAgfSwKIAl7MjcsICA0LCA4MDAsIDUwMCwgMjE2MCwgMTI1MCB9LApAQCAtMTExMSwxMCArMTIwMSwxNCBAQAogCXsgNSwgIDIsMTM1MCwgODAwLCAyMTYwLCAxMjUwIH0sCiAJezEzNSw4OCwxNjAwLDExMDAsIDIxNjAsIDEyNTAgfSwKIAl7NzIsIDQ5LDE2ODAsMTA5MiwgMjE2MCwgMTI1MCB9LAotCXsgMSwgIDEsMjE2MCwxMjUwLCAyMTYwLCAxMjUwIH0KKwl7IDEsICAxLDIxNjAsMTI1MCwgMjE2MCwgMTI1MCB9LAorCXsgMCwgIDAsICAgMCwgICAwLCAgICAwLCAgICAwIH0sCisJeyAwLCAgMCwgICAwLCAgIDAsICAgIDAsICAgIDAgfSwKKwl7IDAsICAwLCAgIDAsICAgMCwgICAgMCwgICAgMCB9LAorCXsgMCwgIDAsICAgMCwgICAwLCAgICAwLCAgICAwIH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTENERGF0YVN0cnVjdCAgU2lTX0V4dExDRDE2MDB4MTIwMERhdGFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhIFNpU19FeHRMQ0QxNjAweDEyMDBEYXRhW10gPQogewogCXs3MiwxMSwgOTkwLCA0MjIsIDIxNjAsIDEyNTAgfSwgLyogNjQweDQwMCAoNjMzMCkgV09SS1MgKi8KIC8qCXsyNywgNCwgODAwLCA1MDAsIDIxNjAsIDEyNTAgfSwgICAgNjQweDQwMCAoNjIzNSkgKi8KQEAgLTExMjcsMTAgKzEyMjEsMTQgQEAKIAl7IDUsIDIsMTM1MCwgODAwLCAyMTYwLCAxMjUwIH0sCiAJezI3LDE2LDE1MDAsMTA2NCwgMjE2MCwgMTI1MCB9LCAvKiAxMjgweDEwMjQgKi8KIAl7NzIsNDksMTY4MCwxMDkyLCAyMTYwLCAxMjUwIH0sIC8qIDE0MDB4MTA1MCAoNjMzMCwgd2FzIG5vdCBzdXBwb3J0ZWQgb24gNjMyNSkgKi8KLQl7IDEsIDEsMjE2MCwxMjUwLCAyMTYwLCAxMjUwIH0KKwl7IDEsIDEsMjE2MCwxMjUwLCAyMTYwLCAxMjUwIH0sCisJeyAwLCAwLCAgIDAsICAgMCwgICAgMCwgICAgMCB9LAorCXsgMCwgMCwgICAwLCAgIDAsICAgIDAsICAgIDAgfSwKKwl7IDAsIDAsICAgMCwgICAwLCAgICAwLCAgICAwIH0sCisJeyAwLCAwLCAgIDAsICAgMCwgICAgMCwgICAgMCB9CiB9OwogCi1zdGF0aWMgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgIFNpU19Ob1NjYWxlRGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTX05vU2NhbGVEYXRhW10gPQogewogCXsgMSwgMSwgODAwLCA0NDksIDgwMCwgNDQ5IH0sICAvKiAweDAwOiAzMjB4MjAwLCA2NDB4NDAwICovCiAJeyAxLCAxLCA4MDAsIDQ0OSwgODAwLCA0NDkgfSwKQEAgLTExNjIsMTQgKzEyNjAsMTggQEAKIAl7IDEsIDEsMTgwOCwgODA4LDE4MDgsIDgwOCB9LCAgLyogMHgxYjogMTM2MHg3NjggKi8KIAl7IDEsIDEsMTEwNCwgNTYzLDExMDQsIDU2MyB9LCAgLyogMHgxYzogOTYweDU0MCAqLwogCXsgMSwgMSwxMTIwLCA2MTgsMTEyMCwgNjE4IH0sICAvKiAweDFkOiA5NjB4NjAwICovCi0JeyAxLCAxLDE0MDgsIDgxNiwxNDA4LCA4MTYgfSAgIC8qIDB4MWY6IDEyODB4ODAwIChUTURTIHNwZWNpYWwpICovCisJeyAxLCAxLDE0MDgsIDgxNiwxNDA4LCA4MTYgfSwgIC8qIDB4MWY6IDEyODB4ODAwIChUTURTIHNwZWNpYWwpICovCisJeyAxLCAxLDE3NjAsMTIzNSwxNzYwLDEyMzUgfSwgIC8qIDB4MjA6IDE2MDB4MTIwMCBmb3IgTENEQSAqLworCXsgMSwgMSwyMDQ4LDEzMjAsMjA0OCwxMzIwIH0sICAvKiAweDIxOiAxNjAweDEyMDAgZm9yIG5vbi1TaVMgTFZEUyAqLworCXsgMSwgMSwxNjY0LCA4NjEsMTY2NCwgODYxIH0gICAvKiAweDIyOiAxMjgweDg1NCAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTFZEUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzMyMHg0ODBEYXRhXzFbXT0KKy8qIEZTVE4vRFNUTiAzMjB4MjQwLCAyIHZhcmlhbnRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzMyMHgyNDBEYXRhXzFbXT0KIHsKIAl7IDg0OCwgNDMzLCA0MDAsIDUyNX0sCiAJeyA4NDgsIDM4OSwgNDAwLCA1MjV9LApAQCAtMTE3NywxNTcgKzEyNzksNDAgQEAKIAl7IDg0OCwgMzg5LCA0MDAsIDUyNX0sCiAJeyA4NDgsIDUxOCwgNDAwLCA1MjV9LAogCXsxMDU2LCA2MjgsIDQwMCwgNTI1fSwKLQl7IDQwMCwgNTI1LCA0MDAsIDUyNX0sCi0JeyA4MDAsIDQ0OSwxMDAwLCA2NDR9LAotCXsgODAwLCA1MjUsMTAwMCwgNjM1fQorCXsgNDAwLCA1MjUsIDQwMCwgNTI1fSAgLyogeFNUTiAqLwogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFM2NDB4NDgwRGF0YV8xW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzMyMHgyNDBEYXRhXzJbXT0KK3sKKwl7IDgwMCwgNDQ1LCA4MDAsIDUyNX0sCisJeyA4MDAsIDM5NSwgODAwLCA1MjV9LAorCXsgODAwLCA0NDUsIDgwMCwgNTI1fSwKKwl7IDgwMCwgMzk1LCA4MDAsIDUyNX0sCisJeyA4MDAsIDUyNSwgODAwLCA1MjV9LAorCXsxMDU2LCA2MjgsMTA1NiwgNjI4fSwKKwl7IDQ4MCwgNTI1LCA0ODAsIDUyNX0gLyogeFNUTiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEgU2lTX0xWRFM2NDB4NDgwRGF0YV8xW109CiB7CiAJeyA4MDAsIDQ0NSwgODAwLCA1MjV9LCAgIC8qIDgwMCwgNDQ5LCA4MDAsIDQ0OSAqLwogCXsgODAwLCAzOTUsIDgwMCwgNTI1fSwKIAl7IDgwMCwgNDQ1LCA4MDAsIDUyNX0sCiAJeyA4MDAsIDM5NSwgODAwLCA1MjV9LAotCXsgODAwLCA1MjUsIDgwMCwgNTI1fSwKLQl7IDgwMCwgNTI1LCA4MDAsIDUyNX0sICAgLyogcHNldWRvICovCi0JeyA4MDAsIDUyNSwgODAwLCA1MjV9ICAgIC8qIHBzZXVkbyAqLworCXsgODAwLCA1MjUsIDgwMCwgNTI1fQogfTsKIAotLyogRlNUTiAzMjB4MjQwICovCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzY0MHg0ODBEYXRhXzJbXT0KLXsKLQl7IDgwMCwgNDQ1LCA4MDAsIDUyNX0sCi0JeyA4MDAsIDM5NSwgODAwLCA1MjV9LAotCXsgODAwLCA0NDUsIDgwMCwgNTI1fSwKLQl7IDgwMCwgMzk1LCA4MDAsIDUyNX0sCi0JeyA4MDAsIDUyNSwgODAwLCA1MjV9LAotICAgICAgICB7IDgwMCwgNTI1LCA4MDAsIDUyNX0sICAgLyogcHNldWRvICovCi0JeyA4MDAsIDUyNSwgODAwLCA1MjV9ICAgIC8qIHBzZXVkbyAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFM4MDB4NjAwRGF0YV8xW109CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzgwMHg2MDBEYXRhXzFbXT0KIHsKIAl7IDg0OCwgNDMzLDEwNjAsIDYyOX0sCiAJeyA4NDgsIDM4OSwxMDYwLCA2Mjl9LAogCXsgODQ4LCA0MzMsMTA2MCwgNjI5fSwKIAl7IDg0OCwgMzg5LDEwNjAsIDYyOX0sCiAJeyA4NDgsIDUxOCwxMDYwLCA2Mjl9LAotCXsxMDU2LCA2MjgsMTA1NiwgNjI4fSwKIAl7MTA1NiwgNjI4LDEwNTYsIDYyOH0KIH07CiAKLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTODAweDYwMERhdGFfMltdPQotewotCXsxMDU2LCA2MjgsMTA1NiwgNjI4fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxMDI0eDc2OERhdGFfMVtdPQotewotCXsgODQwLCA0MzgsMTM0NCwgODA2fSwKLQl7IDg0MCwgNDA5LDEzNDQsIDgwNn0sCi0JeyA4NDAsIDQzOCwxMzQ0LCA4MDZ9LAotCXsgODQwLCA0MDksMTM0NCwgODA2fSwKLQl7IDg0MCwgNTE4LDEzNDQsIDgwNn0sICAgLyogNjQweDQ4MCAqLwotCXsxMDUwLCA2MzgsMTM0NCwgODA2fSwgICAvKiA4MDB4NjAwICovCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LCAgIC8qIDEwMjR4NzY4ICovCi19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzEwMjR4NzY4RGF0YV8yW109Ci17Ci0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzEyODB4MTAyNERhdGFfMVtdPQotewotCXsxMDQ4LCA0NDIsMTY4OCwxMDY2fSwKLQl7MTA0OCwgMzkyLDE2ODgsMTA2Nn0sCi0JezEwNDgsIDQ0MiwxNjg4LDEwNjZ9LAotCXsxMDQ4LCAzOTIsMTY4OCwxMDY2fSwKLQl7MTA0OCwgNTIyLDE2ODgsMTA2Nn0sCi0JezEyMDgsIDY0MiwxNjg4LDEwNjZ9LAotCXsxNDMyLCA4MTAsMTY4OCwxMDY2fSwKLQl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTI4MHgxMDI0RGF0YV8yW109Ci17Ci0JezE2ODgsMTA2NiwxNjg4LDEwNjZ9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzE0MDB4MTA1MERhdGFfMVtdPQotewotICAgICAgICB7IDkyOCwgNDE2LCAxNjg4LDEwNjZ9LAotCXsgOTI4LCAzNjYsIDE2ODgsMTA2Nn0sCi0JeyA5MjgsIDQxNiwgMTY4OCwxMDY2fSwKLQl7IDkyOCwgMzY2LCAxNjg4LDEwNjZ9LAotCXsgOTI4LCA0OTYsIDE2ODgsMTA2Nn0sCi0JezEwODgsIDYxNiwgMTY4OCwxMDY2fSwKLQl7MTMxMiwgNzg0LCAxNjg4LDEwNjZ9LAotCXsxNTY4LDEwNDAsIDE2ODgsMTA2Nn0sCi0JezE2ODgsMTA2NiwgMTY4OCwxMDY2fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxNDAweDEwNTBEYXRhXzJbXT0KLXsKLSAgICAgICAgezE2ODgsMTA2NiwgMTY4OCwxMDY2fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxNjAweDEyMDBEYXRhXzFbXT0KLXsKLSAgIAl7MTA4OCwgNTIwLCAyMDQ4LDEzMjB9LAotCXsxMDg4LCA0NzAsIDIwNDgsMTMyMH0sCi0JezEwODgsIDUyMCwgMjA0OCwxMzIwfSwKLQl7MTA4OCwgNDcwLCAyMDQ4LDEzMjB9LAotCXsxMDg4LCA2MDAsIDIwNDgsMTMyMH0sCi0JezEyNDgsIDcyMCwgMjA0OCwxMzIwfSwKLQl7MTQ3MiwgODg4LCAyMDQ4LDEzMjB9LAotCXsxNzI4LDExNDQsIDIwNDgsMTMyMH0sCi0JezE4NDgsMTE3MCwgMjA0OCwxMzIwfSwKLQl7MjA0OCwxMzIwLCAyMDQ4LDEzMjB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzE2MDB4MTIwMERhdGFfMltdPQotewotICAgICAgICB7MjA0OCwxMzIwLCAyMDQ4LDEzMjB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzEyODB4OTYwRGF0YV8xW109Ci17Ci0JeyA4NDAsIDQzOCwxMzQ0LCA4MDZ9LAotCXsgODQwLCA0MDksMTM0NCwgODA2fSwKLQl7IDg0MCwgNDM4LDEzNDQsIDgwNn0sCi0JeyA4NDAsIDQwOSwxMzQ0LCA4MDZ9LAotCXsgODQwLCA1MTgsMTM0NCwgODA2fSwKLQl7MTA1MCwgNjM4LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsgODAwLCA0NDksMTI4MCwgODAxfSwKLQl7IDgwMCwgNTI1LDEyODAsIDgxM30KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTI4MHg5NjBEYXRhXzJbXT0KLXsKLQl7MTM0NCwgODA2LDEzNDQsIDgwNn0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTI4MHg3NjhEYXRhXzFbXT0KLXsKLQl7IDc2OCwgNDM4LCAxNDA4LCA4MDZ9LAotCXsgNzY4LCAzODgsIDE0MDgsIDgwNn0sCi0JeyA3NjgsIDQzOCwgMTQwOCwgODA2fSwKLQl7IDc2OCwgMzg4LCAxNDA4LCA4MDZ9LAotCXsgNzY4LCA1MTgsIDE0MDgsIDgwNn0sCi0JeyA5MjgsIDYzOCwgMTQwOCwgODA2fSwKLQl7MTE1MiwgODA2LCAxNDA4LCA4MDZ9LAotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0sCi0JezE0MDgsIDgwNiwgMTQwOCwgODA2fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxMjgweDc2OERhdGFfMltdPQotewotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTAyNHg2MDBEYXRhXzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzEwMjR4NjAwRGF0YV8xW10gPQogewogCXsgODQwLCA2MDQsMTM0NCwgODAwfSwKIAl7IDg0MCwgNTYwLDEzNDQsIDgwMH0sCkBAIC0xMzM4LDEyNCArMTMyMywxOCBAQAogCXsxMzQ0LCA4MDAsMTM0NCwgODAwfQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFMxMDI0eDYwMERhdGFfMltdID0KLXsKLQl7MTM0NCwgODAwLDEzNDQsIDgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTMTE1Mng3NjhEYXRhXzFbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSBTaVNfTFZEUzEwMjR4NzY4RGF0YV8xW109CiB7CiAJeyA4NDAsIDQzOCwxMzQ0LCA4MDZ9LAogCXsgODQwLCA0MDksMTM0NCwgODA2fSwKIAl7IDg0MCwgNDM4LDEzNDQsIDgwNn0sCiAJeyA4NDAsIDQwOSwxMzQ0LCA4MDZ9LAotCXsgODQwLCA1MTgsMTM0NCwgODA2fSwKLQl7MTA1MCwgNjM4LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzExNTJ4NzY4RGF0YV8yW10gPQotewotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fQotfTsKLQotLyogUGFzcyAxOjEgZGF0YSAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFNYWFh4WFhYRGF0YV8xW109Ci17Ci0gICAgICAgIHsgODAwLCA0NDksICA4MDAsIDQ0OX0sCi0JeyA4MDAsIDQ0OSwgIDgwMCwgNDQ5fSwKLQl7IDkwMCwgNDQ5LCAgOTAwLCA0NDl9LAotCXsgOTAwLCA0NDksICA5MDAsIDQ0OX0sCi0JeyA4MDAsIDUyNSwgIDgwMCwgNTI1fSwgIC8qICA2NDB4NDgwICAqLwotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0sICAvKiAgODAweDYwMCAgKi8KLQl7MTM0NCwgODA2LCAxMzQ0LCA4MDZ9LCAgLyogMTAyNHg3NjggICovCi0JezE2ODgsMTA2NiwgMTY4OCwxMDY2fSwgIC8qIDEyODB4MTAyNCAqLyAgLyogSU5TRVJURUQgKi8KLSAJezE2ODgsIDgwNiwgMTY4OCwgODA2fSwgIC8qIDEyODB4NzY4ICAqLwotfTsKLQotLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFIgc2VyaWVzICovCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEU0JBUkNPMTM2NkRhdGFfMVtdPQotewotCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKLQl7IDgzMiwgMzg4LDEzMzEsIDgwNn0sCi0JeyA4MzIsIDQzOCwxMzMxLCA4MDZ9LAotCXsgODMyLCAzODgsMTMzMSwgODA2fSwKLQl7IDgzMiwgNTE4LDEzMzEsIDgwNn0sCi0JezEwNTAsIDYzOCwxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKLQl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0sCi0JezE2ODgsMTA2NiwxNjg4LDEwNjZ9ICAgLyogMTM2MHgxMDI0ICovCi19OwotCi0vKiBDdXN0b20gZGF0YSBmb3IgQmFyY28gaVEgUiBzZXJpZXMgKi8KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTQkFSQ08xMzY2RGF0YV8yW109Ci17Ci0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKLQl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKLQl7MTM0NCwgODA2LDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAotCXsxNjg4LDEwNjYsMTY4OCwxMDY2fSwKLQl7MTY4OCwxMDY2LDE2ODgsMTA2Nn0gICAvKiAxMzYweDEwMjQgKi8KLX07Ci0KLS8qIEN1c3RvbSBkYXRhIGZvciBCYXJjbyBpUSBHIHNlcmllcyAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFNCQVJDTzEwMjREYXRhXzFbXT0KLXsKLQl7IDgzMiwgNDM4LDEzMzEsIDgwNn0sCi0JeyA4MzIsIDQwOSwxMzMxLCA4MDZ9LAotCXsgODMyLCA0MzgsMTMzMSwgODA2fSwKLQl7IDgzMiwgNDA5LDEzMzEsIDgwNn0sCi0JeyA4MzIsIDUxOCwxMzMxLCA4MDZ9LCAgIC8qIDY0MHg0ODAgKi8KKwl7IDg0MCwgNTE4LDEzNDQsIDgwNn0sICAgLyogNjQweDQ4MCAqLwogCXsxMDUwLCA2MzgsMTM0NCwgODA2fSwgICAvKiA4MDB4NjAwICovCiAJezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LCAgIC8qIDEwMjR4NzY4ICovCiB9OwogCi0vKiBDdXN0b20gZGF0YSBmb3IgQmFyY28gaVEgRyBzZXJpZXMgKi8KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgIFNpU19MVkRTQkFSQ08xMDI0RGF0YV8yW109Ci17Ci0JezEzNDQsIDgwNiwxMzQ0LCA4MDZ9Ci19OwotCi0vKiBDdXN0b20gZGF0YSBmb3IgODQ4eDQ4MCBwYXJhbGxlbCBwYW5lbCAqLwotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0xWRFM4NDh4NDgwRGF0YV8xW109Ci17Ci0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDY0MHg0ODAgVE9ETyAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDgwMHg2MDAgVE9ETyAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDEwMjR4NzY4IFRPRE8gKi8KLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogODQ4eDQ4MCAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSAgIC8qIDEzNjB4NzY4IFRPRE8gKi8KLX07Ci0KLS8qIEN1c3RvbSBkYXRhIGZvciA4NDh4NDgwIHBhcmFsbGVsIHBhbmVsICovCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICBTaVNfTFZEUzg0OHg0ODBEYXRhXzJbXT0KLXsKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JezEwODgsIDUyNSwxMDg4LCA1MjV9LCAgLyogIDY0MHg0ODAgKi8KLQl7MTA4OCwgNTI1LDEwODgsIDUyNX0sICAvKiAgODAweDYwMCAqLwotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDEwMjR4NzY4ICovCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsgICAwLCAgIDAsICAgMCwgICAwfSwKLQl7ICAgMCwgICAwLCAgIDAsICAgMH0sCi0JeyAgIDAsICAgMCwgICAwLCAgIDB9LAotCXsxMDg4LCA1MjUsMTA4OCwgNTI1fSwgIC8qIDg0OHg0ODAgKi8KLQl7MTA4OCwgNTI1LDEwODgsIDUyNX0JLyogMTM2MHg3NjggVE9ETyAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0NIVFZVTlRTQ0RhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpU19DSFRWVU5UU0NEYXRhW109CiB7CiAJeyA4NDAsIDYwMCwgODQwLCA2MDB9LAogCXsgODQwLCA2MDAsIDg0MCwgNjAwfSwKQEAgLTE0NjYsNyArMTM0NSw3IEBACiAgICAgICAgIHsxMTYwLCA5NDUsMTE2MCwgOTQ1fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgU2lTX0NIVFZPTlRTQ0RhdGFbXT0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhIFNpU19DSFRWT05UU0NEYXRhW109CiB7CiAJeyA4NDAsIDUyNSwgODQwLCA1MjV9LAogCXsgODQwLCA1MjUsIDg0MCwgNTI1fSwKQEAgLTE0NzcsNTUgKzEzNTYsOSBAQAogICAgICAgICB7MTE2MCwgODQwLDExNjAsIDg0MH0KIH07CiAKLS8qIENocm9udGVsIFRWIFNrZXcgKi8KLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVNfQ0hUVlVOVFNDRGVzRGF0YVtdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVNfQ0hUVk9OVFNDRGVzRGF0YVtdPQotewotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICBTaVNfQ0hUVlVQQUxEZXNEYXRhW109Ci17Ci0JezI1NiwgIDB9LAotCXsyNTYsICAwfSwKLQl7MjU2LCAgMH0sCi0JezI1NiwgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0sCi0JeyAwLCAgIDB9Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgIFNpU19DSFRWT1BBTERlc0RhdGFbXT0KLXsKLQl7MjU2LCAgMH0sCi0JezI1NiwgIDB9LAotCXsyNTYsICAwfSwKLQl7MjU2LCAgMH0sCi0JeyAwLCAgIDB9LAotCXsgMCwgICAwfSwKLQl7IDAsICAgMH0KLX07Ci0KIC8qIENSVDEgQ1JUQyBkYXRhIGZvciBzbGF2ZSBtb2RlcyAqLwogCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMzIweDQ4MF8xW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTMyMHgyNDBfMVtdID0KIHsKICB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweGFhLDB4MWYsCiAgICAweDkwLDB4ODUsMHg4ZiwweGFiLDB4MzAsMHgwMCwweDA1LApAQCAtMTU1MCw3ICsxMzgzLDExMiBAQAogICAgMHgwMCB9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfMVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YSBTaVNfTFZEU0NSVDEzMjB4MjQwXzJbXSA9Cit7Cisge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgzMCwweDAwLDB4MDUsCisgICAweDAwfX0sCisge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKKyAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCisgICAweDAxfX0sCisjaWYgMAorIHt7MHgyZCwweDI3LDB4OTAsMHgyYywweDgwLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGU3LDB4MDQsMHgwMCwweDAwLDB4MDAsCisgICAweDAwfX0KKyNlbmRpZgorIHt7MHg1ZiwweDRmLDB4ODMsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGU4LDB4MGMsMHgwMCwweDAwLDB4MDUsCisgICAweDAwfX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTX0xWRFNDUlQxMzIweDI0MF8yX0hbXSA9Cit7Cisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAorICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCisgICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKKyAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCisgICAweDAwfX0sCisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAorICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCisgICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKKyAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCisgICAweDAxfX0sCisge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgIDB4MDB9fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTMyMHgyNDBfM1tdID0KK3sKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCisgICAweDAwfX0sCisge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDAwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKKyAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCisgICAweDAwfX0sCisge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAorICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKKyAgIDB4MDF9fSwKKyB7ezB4MmQsMHgyNywweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsCisgICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAorICAgMHgwMH19Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgU2lTX0xWRFNDUlQxMzIweDI0MF8zX0hbXSA9Cit7Cisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAorICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCisgICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKKyAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCisgICAweDAwfX0sCisge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAorICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKKyAgIDB4MDB9fSwKKyB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCisgICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAorICAgMHgwMH19LAorIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKKyAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCisgICAweDAxfX0sCisge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAorICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKKyAgIDB4MDB9fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTY0MHg0ODBfMVtdID0KIHsKICB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCiAgICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LApAQCAtMTU3Miw3ICsxNTEwLDcgQEAKICAgIDB4MDF9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIFNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IW10gPQogewogIHt7MHgyZCwweDI4LDB4OTAsMHgyYiwweGEwLDB4YmYsMHgxZiwKICAgIDB4OWMsMHg4ZSwweDk2LDB4YjksMHgwMCwweDAwLDB4MDAsCkBAIC0xNTkxLDg3OCArMTUyOSwxMzQgQEAKICAgIDB4MDB9fQogfTsKIAotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfMltdID0KLXsKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgzMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4MmQsMHgyNywweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAotICAgMHgwMH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxNjQweDQ4MF8yX0hbXSA9Ci17Ci0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAotICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAotICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCi0gICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTY0MHg0ODBfM1tdID0KLXsKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDVmLDB4NGYsMHg4MiwweDU1LDB4ODEsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZGYsMHgwNCwweDAwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NWYsMHg0ZiwweDgyLDB4NTUsMHg4MSwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhkZiwweDA0LDB4MDAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg1ZiwweDRmLDB4ODIsMHg1NSwweDgxLDB4MGIsMHgzZSwKLSAgIDB4ZTksMHg4YiwweGRmLDB4MDQsMHgwMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDdmLDB4NjMsMHg4MywweDZjLDB4MWMsMHg3MiwweGYwLAotICAgMHg1OCwweDhjLDB4NTcsMHg3MywweDIwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fSwKLSB7ezB4MmQsMHgyNywweDkwLDB4MmMsMHg4MCwweDBiLDB4M2UsCi0gICAweGU5LDB4OGIsMHhlNywweDA0LDB4MDAsMHgwMCwweDAwLAotICAgMHgwMH19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxNjQweDQ4MF8zX0hbXSA9Ci17Ci0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHhhYSwweDFmLAotICAgMHg5MCwweDg1LDB4OGYsMHhhYiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDgzLDB4MWYsCi0gICAweDVlLDB4ODMsMHg1ZCwweDc5LDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg2NSwweDRmLDB4ODksMHg1NCwweDlmLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY1LDB4NGYsMHg4OSwweDU2LDB4ODMsMHg4MywweDFmLAotICAgMHg1ZSwweDgzLDB4NWQsMHg3OSwweDEwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NjUsMHg0ZiwweDg5LDB4NTYsMHg4MywweDA0LDB4M2UsCi0gICAweGUwLDB4ODUsMHhkZiwweGZiLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg3ZiwweDYzLDB4ODMsMHg2YywweDFjLDB4NzIsMHhmMCwKLSAgIDB4NTgsMHg4YywweDU3LDB4NzMsMHgyMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweDJkLDB4MjcsMHg5MCwweDJjLDB4ODAsMHgwYiwweDNlLAotICAgMHhlOSwweDhiLDB4ZTcsMHgwNCwweDAwLDB4MDAsMHgwMCwKLSAgIDB4MDB9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFbXSA9Ci17Ci0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHg1YSwweDNlLAotICAgMHhlOCwweDhmLDB4OGYsMHg1YiwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweDJlLDB4M2UsCi0gICAweGI5LDB4ODAsMHg1ZCwweDJmLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4NWEsMHgzZSwKLSAgIDB4ZTgsMHg4ZiwweDhmLDB4NWIsMHgwMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHgyZSwweDNlLAotICAgMHhiOSwweDgwLDB4NWQsMHgyZiwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweGFmLDB4YmEsCi0gICAweDNiLDB4ODIsMHhkZiwweGIwLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg3ZSwweDYzLDB4ODIsMHg2OCwweDE1LDB4MWUsMHhmMSwKLSAgIDB4YWUsMHg4NSwweDU3LDB4MWYsMHgzMCwweDAwLDB4MjYsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgxZSwweGYxLAotICAgMHhhZSwweDg1LDB4NTcsMHgxZiwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSFtdID0KLXsKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweGM0LDB4MWYsCi0gICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4OTcsMHgxZiwKLSAgIDB4NjAsMHg4NywweDVkLDB4ODMsMHgxMCwweDAwLDB4NDQsCi0gICAweDAwfX0sCi0ge3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhjNCwweDFmLAotICAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLSAgIDB4MDB9fSwKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweDk3LDB4MWYsCi0gICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4MDQsMHgzZSwKLSAgIDB4ZTIsMHg4OSwweGRmLDB4MDUsMHgwMCwweDAwLDB4NDQsCi0gICAweDAwfX0sCi0ge3sweDNjLDB4MzEsMHg4MCwweDM1LDB4MWMsMHg3YywweGYwLAotICAgMHg1YSwweDhmLDB4NTcsMHg3ZCwweDIwLDB4MDAsMHg1NSwKLSAgIDB4MDF9fSwKLSB7ezB4NGYsMHgzZiwweDkzLDB4NDUsMHgwZCwweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMTAyNHg2MDBfMltdID0KLXsKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4MzEsMHg4NywweDVkLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotICAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NzIsMHg4OCwweGRmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGEzLDB4NjMsMHg4NywweDc4LDB4ODksMHgyNCwweGYxLAotICAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4YTMsMHg3ZiwweDg3LDB4ODYsMHg5NywweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMTAyNHg2MDBfMl9IW10gPQotewotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4NGEsMHg4MCwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotICAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NGYsMHgyNywweDkzLDB4MzksMHgwMSwweDI0LDB4YmIsCi0gICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4MzEsMHg4NywweDVkLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotICAgMHg3MiwweDg4LDB4ZGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NGYsMHgzMSwweDkzLDB4M2UsMHgwNiwweDI0LDB4ZjEsCi0gICAweGFlLDB4ODQsMHg1NywweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg0ZiwweDNmLDB4OTMsMHg0NSwweDBkLDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVNfTFZEU0NSVDExMTUyeDc2OF8xW10gPQotewotIHt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHg5NywweDFmLAotICAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NjQsMHg0ZiwweDg4LDB4NTQsMHg5ZiwweGM0LDB4MWYsCi0gICAweDkyLDB4ODksMHg4ZiwweGI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg2NCwweDRmLDB4ODgsMHg1NCwweDlmLDB4OTcsMHgxZiwKLSAgIDB4NjAsMHg4NywweDVkLDB4ODMsMHgxMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDY0LDB4NGYsMHg4OCwweDU0LDB4OWYsMHgwNCwweDNlLAotICAgMHhlMiwweDg5LDB4ZGYsMHgwNSwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4N2UsMHg2MywweDgyLDB4NjgsMHgxNSwweDdjLDB4ZjAsCi0gICAweDVhLDB4OGYsMHg1NywweDdkLDB4MjAsMHgwMCwweDI2LAotICAgMHgwMX19LAotIHt7MHhhMywweDdmLDB4ODcsMHg4NiwweDk3LDB4MjQsMHhmNSwKLSAgIDB4MDIsMHg4OCwweGZmLDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVNfTFZEU0NSVDExMTUyeDc2OF8xX0hbXSA9Ci17Ci0ge3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHhjNCwweDFmLAotICAgMHg5MiwweDg5LDB4OGYsMHhiNSwweDMwLDB4MDAsMHg0NCwKLSAgIDB4MDB9fSwKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweDk3LDB4MWYsCi0gICAweDYwLDB4ODcsMHg1ZCwweDgzLDB4MTAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgyZiwweDI3LDB4OTMsMHgyYiwweDkwLDB4YzQsMHgxZiwKLSAgIDB4OTIsMHg4OSwweDhmLDB4YjUsMHgzMCwweDAwLDB4NDQsCi0gICAweDAwfX0sCi0ge3sweDJmLDB4MjcsMHg5MywweDJiLDB4OTAsMHg5NywweDFmLAotICAgMHg2MCwweDg3LDB4NWQsMHg4MywweDEwLDB4MDAsMHg0NCwKLSAgIDB4MDB9fSwKLSB7ezB4MmYsMHgyNywweDkzLDB4MmIsMHg5MCwweDA0LDB4M2UsCi0gICAweGUyLDB4ODksMHhkZiwweDA1LDB4MDAsMHgwMCwweDQ0LAotICAgMHgwMH19LAotIHt7MHgzYywweDMxLDB4ODAsMHgzNSwweDFjLDB4N2MsMHhmMCwKLSAgIDB4NWEsMHg4ZiwweDU3LDB4N2QsMHgyMCwweDAwLDB4NTUsCi0gICAweDAxfX0sCi0ge3sweDRmLDB4M2YsMHg5MywweDQ1LDB4MGQsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTExNTJ4NzY4XzJbXSA9Ci17Ci0ge3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotICAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDRmLDB4ODcsMHg2ZSwweDlmLDB4MjQsMHhiYiwKLSAgIDB4NGEsMHg4MCwweDhmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAwfX0sCi0ge3sweGEzLDB4NGYsMHg4NywweDZlLDB4OWYsMHgyNCwweGJiLAotICAgMHgzMSwweDg3LDB4NWQsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDB9fSwKLSB7ezB4YTMsMHg0ZiwweDg3LDB4NmUsMHg5ZiwweDI0LDB4YmIsCi0gICAweDcyLDB4ODgsMHhkZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMH19LAotIHt7MHhhMywweDYzLDB4ODcsMHg3OCwweDg5LDB4MjQsMHhmMSwKLSAgIDB4YWUsMHg4NCwweDU3LDB4MjUsMHgzMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGEzLDB4N2YsMHg4NywweDg2LDB4OTcsMHgyNCwweGY1LAotICAgMHgwMiwweDg4LDB4ZmYsMHgyNSwweDEwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTExNTJ4NzY4XzJfSFtdID0KLXsKLSB7ezB4NGYsMHgyNywweDkzLDB4MzksMHgwMSwweDI0LDB4YmIsCi0gICAweDRhLDB4ODAsMHg4ZiwweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4MzEsMHg4NywweDVkLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MjcsMHg5MywweDM5LDB4MDEsMHgyNCwweGJiLAotICAgMHg0YSwweDgwLDB4OGYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NGYsMHgyNywweDkzLDB4MzksMHgwMSwweDI0LDB4YmIsCi0gICAweDMxLDB4ODcsMHg1ZCwweDI1LDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg0ZiwweDI3LDB4OTMsMHgzOSwweDAxLDB4MjQsMHhiYiwKLSAgIDB4NzIsMHg4OCwweGRmLDB4MjUsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDRmLDB4MzEsMHg5MywweDNlLDB4MDYsMHgyNCwweGYxLAotICAgMHhhZSwweDg0LDB4NTcsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NGYsMHgzZiwweDkzLDB4NDUsMHgwZCwweDI0LDB4ZjUsCi0gICAweDAyLDB4ODgsMHhmZiwweDI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19Ci19OwotCi1zdGF0aWMgY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgU2lTX0xWRFNDUlQxMTI4MHg3NjhfMVtdID0KLXsKLSB7ezB4NWIsMHg0ZiwweDlmLDB4NTUsMHgxOSwweGI0LDB4MWYsCi0gICAweDljLDB4OGUsMHg4ZiwweGI1LDB4MTAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDRmLDB4OWYsMHg1NSwweDE5LDB4ODIsMHgxZiwKLSAgIDB4NmEsMHg4YywweDVkLDB4ODMsMHgzMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDViLDB4NGYsMHg5ZiwweDU1LDB4MTksMHhiNCwweDFmLAotICAgMHg5YywweDhlLDB4OGYsMHhiNSwweDEwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4NWIsMHg0ZiwweDlmLDB4NTUsMHgxOSwweDgyLDB4MWYsCi0gICAweDZhLDB4OGMsMHg1ZCwweDgzLDB4MzAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg1YiwweDRmLDB4OWYsMHg1NSwweDE5LDB4MDQsMHgzZSwKLSAgIDB4ZWMsMHg4ZSwweGRmLDB4MDUsMHgyMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDZmLDB4NjMsMHg5MywweDY5LDB4OGQsMHg3YywweGYwLAotICAgMHg2NCwweDg2LDB4NTcsMHg3ZCwweDIwLDB4MDAsMHgwNSwKLSAgIDB4MDF9fSwKLSB7ezB4OGIsMHg3ZiwweDhmLDB4ODUsMHgwOSwweDI0LDB4ZjUsCi0gICAweDBjLDB4OGUsMHhmZiwweDI1LDB4MzAsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhhYiwweDlmLDB4OGYsMHhhNSwweDg5LDB4MjQsMHhmNSwKLSAgIDB4MGMsMHg4ZSwweGZmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAxfX0sCi0ge3sweGFiLDB4OWYsMHg4ZiwweGE1LDB4ODksMHgyNCwweGY1LAotICAgMHgwYywweDhlLDB4ZmYsMHgyNSwweDMwLDB4MDAsMHgwNiwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEyODB4NzY4XzFfSFtdID0KLXsKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDllLDB4MWYsCi0gICAweDkzLDB4ODYsMHg4ZiwweDlmLDB4MzAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgyYywweDFhLDB4NmMsMHgxZiwKLSAgIDB4NjAsMHg4NCwweDVkLDB4NmQsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDQ3LDB4MjcsMHg4YiwweDMwLDB4MWUsMHg5ZSwweDFmLAotICAgMHg5MiwweDg2LDB4OGYsMHg5ZiwweDMwLDB4MDAsMHgwNSwKLSAgIDB4MDB9fSwKLSB7ezB4NDcsMHgyNywweDhiLDB4MmMsMHgxYSwweDZjLDB4MWYsCi0gICAweDYwLDB4ODQsMHg1ZCwweDZkLDB4MTAsMHgwMCwweDA1LAotICAgMHgwMH19LAotIHt7MHg0NywweDI3LDB4OGIsMHgyYywweDFhLDB4ZWUsMHgxZiwKLSAgIDB4ZTIsMHg4NiwweGRmLDB4ZWYsMHgxMCwweDAwLDB4MDUsCi0gICAweDAwfX0sCi0ge3sweDUxLDB4MzEsMHg5NSwweDM2LDB4MDQsMHg2NiwweGYwLAotICAgMHg1YSwweDhlLDB4NTcsMHg2NywweDIwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4NWYsMHgzZiwweDgzLDB4NDQsMHg5MiwweDBlLDB4ZjUsCi0gICAweDAyLDB4ODYsMHhmZiwweDBmLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg2ZiwweDRmLDB4OTMsMHg1NCwweDgyLDB4MGUsMHg1YSwKLSAgIDB4MDIsMHg4NiwweGZmLDB4MGYsMHgwOSwweDAwLDB4MDUsCi0gICAweDAxfX0sCi0ge3sweDZmLDB4NGYsMHg5MywweDU0LDB4ODIsMHgwZSwweDVhLAotICAgMHgwMiwweDg2LDB4ZmYsMHgwZiwweDA5LDB4MDAsMHgwNSwKLSAgIDB4MDF9fQotfTsKLQotc3RhdGljIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgIFNpU19MVkRTQ1JUMTEyODB4NzY4XzJbXSA9Ci17Ci0ge3sweGFiLDB4NjAsMHg5ZiwweDgwLDB4MDQsMHgyNCwweGJiLAotICAgMHg1NCwweDg2LDB4ZGIsMHhkYSwweDAwLDB4MDAsMHgwMiwKLSAgIDB4MDB9fSwKLSB7ezB4YWIsMHg2MCwweDlmLDB4ODAsMHgwNCwweDI0LDB4YmIsCi0gICAweDNiLDB4OGQsMHhjMiwweGMxLDB4MDAsMHgwMCwweDAyLAotICAgMHgwMH19LAotIHt7MHhhYiwweDYwLDB4OWYsMHg4MCwweDA0LDB4MjQsMHhiYiwKLSAgIDB4NTQsMHg4NiwweGRiLDB4ZGEsMHgwMCwweDAwLDB4MDIsCi0gICAweDAwfX0sCi0ge3sweGFiLDB4NjAsMHg5ZiwweDgwLDB4MDQsMHgyNCwweGJiLAotICAgMHgzYiwweDhkLDB4YzIsMHhjMSwweDAwLDB4MDAsMHgwMiwKLSAgIDB4MDB9fSwKLSB7ezB4YWIsMHg2MCwweDlmLDB4ODAsMHgwNCwweDI0LDB4YjMsCi0gICAweDdjLDB4OGUsMHgwMywweDAyLDB4MTAsMHgwMCwweDAyLAotICAgMHgwMX19LAotIHt7MHhhYiwweDYzLDB4OGYsMHg4YSwweDhlLDB4MjQsMHhmMSwKLSAgIDB4YjYsMHg4OCwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDIsCi0gICAweDAxfX0sCi0ge3sweGFiLDB4N2YsMHg4ZiwweDk4LDB4OWMsMHgyNCwweGY1LAotICAgMHgwYSwweDhjLDB4ZmYsMHgyNSwweDMwLDB4MDAsMHgwMiwKLSAgIDB4MDF9fSwKLSB7ezB4YWIsMHg5ZiwweDhmLDB4YTgsMHg4YywweDI0LDB4ZjUsCi0gICAweDBhLDB4OGMsMHhmZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhYiwweDlmLDB4OGYsMHhhOCwweDhjLDB4MjQsMHhmNSwKLSAgIDB4MGEsMHg4YywweGZmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAxfX0KLX07Ci0KLXN0YXRpYyBjb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICBTaVNfTFZEU0NSVDExMjgweDc2OF8yX0hbXSA9Ci17Ci0ge3sweDgzLDB4MzgsMHg5NywweDU4LDB4OWMsMHgyNCwweGJiLAotICAgMHg1NCwweDg2LDB4ZGIsMHhkYSwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHgzOCwweDk3LDB4NTgsMHg5YywweDI0LDB4YmIsCi0gICAweDNiLDB4OGQsMHhjMiwweGMxLDB4MDAsMHgwMCwweDAxLAotICAgMHgwMH19LAotIHt7MHg4MywweDM4LDB4OTcsMHg1OCwweDljLDB4MjQsMHhiYiwKLSAgIDB4NTQsMHg4NiwweGRiLDB4ZGEsMHgwMCwweDAwLDB4MDEsCi0gICAweDAwfX0sCi0ge3sweDgzLDB4MzgsMHg5NywweDU4LDB4OWMsMHgyNCwweGJiLAotICAgMHgzYiwweDhkLDB4YzIsMHhjMSwweDAwLDB4MDAsMHgwMSwKLSAgIDB4MDB9fSwKLSB7ezB4ODMsMHgzOCwweDk3LDB4NTgsMHg5YywweDI0LDB4YjMsCi0gICAweDdjLDB4OGUsMHgwMywweDAyLDB4MTAsMHgwMCwweDAxLAotICAgMHgwMX19LAotIHt7MHg3OSwweDMxLDB4OWQsMHg1OCwweDljLDB4MjQsMHhmMSwKLSAgIDB4YjYsMHg4OCwweDU3LDB4MjUsMHgxMCwweDAwLDB4MDEsCi0gICAweDAxfX0sCi0ge3sweDZiLDB4M2YsMHg4ZiwweDU4LDB4OWMsMHgyNCwweGY1LAotICAgMHgwYSwweDhjLDB4ZmYsMHgyNSwweDMwLDB4MDAsMHgwMSwKLSAgIDB4MDF9fSwKLSB7ezB4YWIsMHg5ZiwweDhmLDB4YTgsMHg4YywweDI0LDB4ZjUsCi0gICAweDBhLDB4OGMsMHhmZiwweDI1LDB4MzAsMHgwMCwweDA2LAotICAgMHgwMX19LAotIHt7MHhhYiwweDlmLDB4OGYsMHhhOCwweDhjLDB4MjQsMHhmNSwKLSAgIDB4MGEsMHg4YywweGZmLDB4MjUsMHgzMCwweDAwLDB4MDYsCi0gICAweDAxfX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENPTU1PTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIExJTlVYX1hGODYKLQotI2RlZmluZSBTSVNfUExfSFNZTkNQIDB4MDEKLSNkZWZpbmUgU0lTX1BMX0hTWU5DTiAweDAyCi0jZGVmaW5lIFNJU19QTF9WU1lOQ1AgMHgwNAotI2RlZmluZSBTSVNfUExfVlNZTkNOIDB4MDgKLSNkZWZpbmUgU0lTX1BMX0RWSSAgICAweDgwCi0KLXR5cGVkZWYgc3RydWN0IF9TaVNfUGxhc21hTW9kZXMKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgVUxPTkcgIGNsb2NrOwotICBVU0hPUlQgSERpc3BsYXksIEhUb3RhbCwgSEZyb250UG9yY2gsIEhTeW5jV2lkdGg7Ci0gIFVTSE9SVCBWRGlzcGxheSwgVlRvdGFsLCBWRnJvbnRQb3JjaCwgVlN5bmNXaWR0aDsKLSAgVUNIQVIgIFN5bmNGbGFnczsKLX0gU2lTX1BsYXNtYU1vZGVzOwotCi10eXBlZGVmIHN0cnVjdCBfU2lTX1BsYXNtYVRhYmxlcwotewotICAgVVNIT1JUIHZlbmRvcjsKLSAgIFVDSEFSICBwcm9kdWN0bnVtOwotICAgVVNIT1JUIHByb2R1Y3RbNV07Ci0gICBjb25zdCBjaGFyICpERENuYW1lc1s1XTsKLSAgIGNvbnN0IGNoYXIgKnBsYXNtYW5hbWU7Ci0gICBVU0hPUlQgbWF4eCxtYXh5OwotICAgVVNIT1JUIHByZWZ4LCBwcmVmeTsKLSAgIFVDSEFSICBtb2RlbnVtOwotICAgVUNIQVIgIHBsYXNtYW1vZGVzWzIwXTsgIC8qIHwgMHg4MCA9IERWSS1jYXBhYmxlLCB8IDB4NDAgPSBhbmFsb2cgKi8KLX0gU2lTX1BsYXNtYVRhYmxlczsKLQotc3RhdGljIGNvbnN0IFNpU19QbGFzbWFNb2RlcyBTaVNfUGxhc21hTW9kZVtdID0gewotICAgeyAgIjY0MHg0MDAiLAkJLyogMDA6IElCTSA0MDBANzAgKi8KLSAgICAgIDI1MTc1LAotICAgICAgIDY0MCwgIDgwMCwgMTcsICA2NCwKLSAgICAgICA0MDAsICA0NDksIDEzLCAgIDIsCi0gICAgICBTSVNfUExfSFNZTkNOIHwgU0lTX1BMX1ZTWU5DTiB9LAotICAgeyAgIjY0MHg0ODAiLAkJLyogMDE6IFZFU0EgNDgwQDcyICovCi0gICAgICAzMTUwMCwKLSAgICAgICA2NDAsICA4MzIsIDI0LCAgNDAsCi0gICAgICAgNDgwLCAgNTIwLCAgOSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DTiB8IFNJU19QTF9WU1lOQ04gfSwKLSAgIHsgICI4MDB4NjAwIiwJCS8qIDAyOiBWRVNBIDYwMEA3MiAqLwotICAgICAgNTAwMDAsCi0gICAgICAgODAwLCAxMDQwLCA1NiwgMTIwLAotICAgICAgIDYwMCwgIDY2NiwgMzcsICAgNiwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiODY0eDQ4MCIsCQkvKiAwMzogQ2VyZWIgd2lkZSAxICovCi0gICAgICA0MjUyNiwKLSAgICAgICA4NjQsIDExMzQsIDIyLCAgODYsCi0gICAgICAgNDgwLCAgNTAwLCAgMSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ04gfSwKLSAgIHsgICI4NDh4NDgwIiwJCS8qIDA0OiBWRVNBIHdpZGUgKE5FQzEpICovCi0gICAgICAzMzc1MCwKLSAgICAgICA4NDgsIDEwODgsIDE2LCAxMTIsCi0gICAgICAgNDgwLCAgNTE3LCAgNiwgICA4LAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMDI0eDU3NiIsCQkvKiAwNTogVkVTQSB3aWRlIChORUMyKSAqLwotICAgICAgNDcyNTAsCi0gICAgICAxMDI0LCAxMzIwLCAxNiwgMTQ0LAotICAgICAgIDU3NiwgIDU5NiwgIDIsICAgNCwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiMTI4MHg3MjAiLAkJLyogMDY6IFZFU0Egd2lkZSAoTkVDMykgKi8KLSAgICAgIDc2NTAwLAotICAgICAgMTI4MCwgMTY5NiwgNDgsIDE3NiwKLSAgICAgICA3MjAsICA3NTAsICA0LCAgIDgsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjEzNjB4NzY1IiwJCS8qIDA3OiBWRVNBIHdpZGUgKE5FQzQpICovCi0gICAgICA4NTUwMCwKLSAgICAgIDEzNjAsIDE3OTIsIDY0LCAxNzYsCi0gICAgICAgNzY1LCAgNzk1LCAgNCwgICA4LAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMDI0eDYwMCIsCQkvKiAwODogQ0VSRUIgd2lkZSAyICovCi0gICAgICA1MTIwMCwKLSAgICAgIDEwMjQsIDEzNTIsIDUxLCAxNjQsCi0gICAgICAgNjAwLCAgNjI4LCAgMSwgICA0LAotICAgICAgU0lTX1BMX0hTWU5DTiB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMDI0eDc2OCIsCQkvKiAwOTogVkVTQSA3NjhANzUgKi8KLSAgICAgIDc4NzUwLAotICAgICAgMTAyNCwgMTMxMiwgIDE2LCA5NiwKLSAgICAgICA3NjgsICA4MDAsICAgMSwgIDMsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjExNTJ4ODY0IiwJCS8qIDEwOiBWRVNBIDExNTJ4ODY0QDc1ICovCi0gICAgICAxMDgwMDAsCi0gICAgICAxMTUyLCAxNjAwLCA2NCwgMTI4LAotICAgICAgIDg2NCwgIDkwMCwgIDEsICAgMywKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiMTI4MHgxMDI0IiwJCS8qIDExOiBWRVNBIDEwMjRANjAgKi8KLSAgICAgIDEwODAwMCwKLSAgICAgIDEyODAsIDE2ODgsIDQ4LCAxMTIsCi0gICAgICAxMDI0LCAxMDY2LCAgMSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMjgweDc2OCIsCQkvKiAxMjogV19YR0EgKi8KLSAgICAgIDgxMDAwLAotICAgICAgMTI4MCwgMTY4OCwgNDgsIDExMiwKLSAgICAgICA3NjgsICA4MDIsICAzLCAgIDYsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DTiB9LAotICAgeyAgIjEyODB4NzY4IiwJCS8qIDEzOiBJL08gRGF0YSBXX1hHQUA1Nkh6ICovCi0gICAgICA3NjA2NCwKLSAgICAgIDEyODAsIDE2ODgsIDQ4LCAxMTIsCi0gICAgICAgNzY4LCAgODAyLCAgMiwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMzc2eDc2OCIsCQkvKiAxNDogSS9PIFdpZGUgWEdBICovCi0gICAgICA4NzM0MCwKLSAgICAgIDEzNzYsIDE4MDgsIDMyLCAxMjgsCi0gICAgICAgNzY4LCAgODA2LCAgMywgICA2LAotICAgICAgU0lTX1BMX0hTWU5DTiB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMjgweDk2MCIsCQkvKiAxNTogVkVTQSA5NjBANjAgKi8KLSAgICAgIDEwODAwMCwKLSAgICAgIDEyODAsIDE4MDAsIDk2LCAxMTIsCi0gICAgICAgOTYwLCAxMDAwLCAgMSwgICAzLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxNDAweDEwNTAiLAkJLyogMTY6IFZFU0EgMTA1MEA2MEh6ICovCi0gICAgICAxMDgwMDAsCi0gICAgICAxNDAwLCAxNjg4LCA0OCwgMTEyLAotICAgICAgMTA1MCwgMTA2NiwgIDEsICAgMywKLSAgICAgIFNJU19QTF9IU1lOQ04gfCBTSVNfUExfVlNZTkNOIH0sCi0gICB7ICAiMTM2MHg3NjgiLAkJLyogMTc6IFZFU0Egd2lkZSAoTkVDNC8yKSAqLwotICAgICAgODU1MDAsCi0gICAgICAxMzYwLCAxNzkyLCA2NCwgMTEyLAotICAgICAgIDc2NSwgIDc5NSwgIDMsICAgNiwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiODAweDYwMCIsCQkvKiAxODogVkVTQSA2MDBANTYgKi8KLSAgICAgIDM2MDAwLAotICAgICAgIDgwMCwgMTAyNCwgMjQsICAgMiwKLSAgICAgICA2MDAsICA2MjUsICAxLCAgIDIsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjEwNzJ4NjAwIiwJCS8qIDE5OiBQYW5hc29uaWMgMTA3Mng2MDAgKHN5bmM/KSAqLwotICAgICAgNTQxMDAsCi0gICAgICAgMTA3MiwgMTQyNCwgNDgsIDE3NiwKLSAgICAgICAgNjAwLCAgNjI4LCAxNiwgICAxLAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICI4NDh4NDgwIiwJCS8qIDIwOiBQYW5hc29uaWMgODQ4eDQ4MCAoc3luYz8pICovCi0gICAgICAzMzA3MCwJCQkvKiBpcyA4NTJ4NDgwLCBidXQgd2UgY2FuJ3QgdXNlIDg1MiAqLwotICAgICAgICA4NDgsIDEwNjgsIDIwLCAgNDAsCS8qIGRpZmZlcnMgZnJvbSBEREMgZGF0YSwgYmV0dGVyIGNlbnRlcmVkICovCi0gICAgICAgIDQ4MCwgIDUxNiwgIDMsICAgNSwJLyogd29uJ3Qgd29yayBhc3N1bWluZ2x5LCBiZWNhdXNlIGRhdGEgaXMgJSA4ICovCi0gICAgICBTSVNfUExfSFNZTkNOIHwgU0lTX1BMX1ZTWU5DTiB9LAotICAgeyAgIjEyODB4NzIwIiwJCS8qIDIxOiBXSURFNzIwKDYwKSAoYWthICI3NTBwIikgKFBhbmFzb25pYykgKi8KLSAgICAgIDc0MzAwLAotICAgICAgMTI4MCwgMTY1MCwxMTAsICA0MCwKLSAgICAgICA3MjAsICA3NTAsICA1LCAgIDUsCi0gICAgICBTSVNfUExfSFNZTkNQIHwgU0lTX1BMX1ZTWU5DUCB9LAotICAgeyAgIjEyODB4NzY4IiwJCS8qIDIyOiAxMjgweDc2OEA1Ni41IChQYW5hc29uaWMpICovCi0gICAgICA3NjIwMCwJCQkvKiAoQWNjb3JkaW5nIHRvIG1hbnVhbCBub3Qgc3VwcG9ydGVkIGZvciBIRE1JOyBidXQgd29ya3MpICovCi0gICAgICAxMjgwLCAxNjgwLCAxNiwgIDI0LAotICAgICAgIDc2OCwgIDgwMiwgIDIsICAgNSwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiMTI4MHg3MjBANTAiLAkJLyogMjM6IFdJREU3MjAoNTApIChha2EgIjc1MHAiKSAoUGFuYXNvbmljKSAqLwotICAgICAgNzQzMDAsCQkJLyogUGFuYXNvbmljIHN0YXRlcyA0NS4wa0h6LiBOb3QgcG9zc2libGUuIFRoaXMgb25lIHdvcmtzICh3aXRoIHNvbWUgb3ZlcnNjYW4pICovCi0gICAgICAxMjgwLCAxOTgwLDQwMCwgIDgwLAotICAgICAgIDcyMCwgIDc1MCwgIDEsICAgMiwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiNzIweDQ4MCIsCQkvKiAyNDogNzIweDQ4MCAoYWthICI1MjVwIiBhbmQgIjQ4MHAiKSAoUGFuYXNvbmljKSAqLwotICAgICAgMjcwMDAsCi0gICAgICAgNzIwLCAgODU2LCA0MCwgIDMyLAotICAgICAgIDQ4MCwgIDUyNSwgIDEsICAgMywKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi0gICB7ICAiNzIweDU3NiIsCQkvKiAyNTogNzIweDU3NiAoYWthICI2MjVwImFuZCAiNTc2cCIpIChQYW5hc29uaWMpICovCi0gICAgICAyNzUwMCwKLSAgICAgICA3MjAsICA4NjQsIDE2LCAgNjQsCi0gICAgICAgNTc2LCAgNjI1LCAgNSwgICA2LAotICAgICAgU0lTX1BMX0hTWU5DUCB8IFNJU19QTF9WU1lOQ1AgfSwKLSAgIHsgICIxMjgweDcyMEA1MCIsCQkvKiAyNjogV0lERTcyMCg1MCkgKGFrYSAiNzUwcCIpIChHZW5lcmljKSAqLwotICAgICAgNzQzMDAsCi0gICAgICAxMjgwLCAxOTgwLDQwMCwgIDgwLAotICAgICAgIDcyMCwgIDc1MCwgIDUsICAgNSwKLSAgICAgIFNJU19QTF9IU1lOQ1AgfCBTSVNfUExfVlNZTkNQIH0sCi19OwotCi0vKgotMjcuMDAgIDcyMCA3NTUgNzkxIDg1OCAgNDgwIDQ4MCA0ODQgNTI1Ci0yNy41MCAgNzIwIDczMiA3OTUgODY0ICA1NzYgNTgxIDU4NyA2MjUKLSovCi0KLXN0YXRpYyBjb25zdCBTaVNfUGxhc21hVGFibGVzIFNpU19QbGFzbWFUYWJsZVtdID0gewotI2lmIDAgIC8qIFByb2R1Y3QgSURzIG1pc3NpbmcgKi8KLSAgIHsgMHgzOGEzLCA0LAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA0MlZQNC80MlZQNEQvNDJWUDRHLzQyVlA0REciLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICAxMSwgICAvKiBBbGwgRFZJLCBleGNlcHQgMCwgNywgMTMgKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDd8MHg0MCwgOXwweGMwLDEwfDB4YzAsMTF8MHhjMCwxM3wweDQwLDE0fDB4YzAsCi0gICAgICAxN3wweGMwLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAorQk9PTEVBTgkJU2lTSW5pdFB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRChpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksCisJCQkJaW50IERlcHRoLCBCT09MRUFOIEZTVE4sIGludCBMQ0R3aXRoLCBpbnQgTENEaGVpZ2h0KTsKICNlbmRpZgotI2lmIDAgIC8qIFByb2R1Y3QgSURzIG1pc3NpbmcgKi8KLSAgIHsgMHgzOGEzLCAzLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA0MlBEMS81MFBEMS81MFBEMiIsCi0gICAgIDAsIDAsCi0gICAgIDAsIDAsCi0gICAgIDUsICAgLyogRFZJIGVudGlyZWx5IHVua25vd24gKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDl8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsCi0gICAgICAgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotICAgeyAweDM4YTMsIDEsCi0gICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIk5FQyBQbGFzbWFTeW5jIDQyUEQzIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgMTAsICAgLyogRFZJIGVudGlyZWx5IHVua25vd24gKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCAzfDB4YzAsIDR8MHhjMCwgNXwweGMwLCA2fDB4YzAsIDd8MHg0MCwgOHwweGMwLCA5fDB4YzAsCi0gICAgICAgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotICAgeyAweDM4YTMsIDIsCi0gICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIk5FQyBQbGFzbWFTeW5jIDQyVk0zLzYxWE0xIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgMTEsICAvKiBEVkkgZW50aXJlbHkgdW5rbm93biAqLwotICAgICB7IDB8MHg0MCwgMXwweGMwLCAyfDB4YzAsIDN8MHhjMCwgNHwweGMwLCA1fDB4YzAsIDZ8MHhjMCwgOHwweGMwLCA5fDB4YzAsMTF8MHhjMCwKLSAgICAgIDE3fDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzhhMywgMiwKLSAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICIiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiTkVDIFBsYXNtYVN5bmMgNDJNUDEvNDJNUDIiLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICA2LCAgIC8qIERWSSBlbnRpcmVseSB1bmtub3duICovCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsIDJ8MHhjMCwgNHwweGMwLCA5fDB4YzAsMTF8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzOGEzLCAxLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA1ME1QMSIsCi0gICAgIDAsIDAsCi0gICAgIDAsIDAsCi0gICAgIDEwLCAgIC8qIERWSSBlbnRpcmVseSB1bmtub3duICovCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsIDJ8MHhjMCwgNHwweGMwLCA3fDB4NDAsIDl8MHhjMCwxMHwweGMwLDExfDB4YzAsMTN8MHg0MCwxNHwweGMwLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKK3Vuc2lnbmVkIHNob3J0CVNpU19HZXRNb2RlSURfTENEKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksCisJCQkJaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwKKwkJCQl1bnNpZ25lZCBzaG9ydCBDdXN0b21ULCBpbnQgTENEd2l0aCwgaW50IExDRGhlaWdodCwKKwkJCQl1bnNpZ25lZCBpbnQgVkJGbGFnczIpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRF9UVihpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IEhEaXNwbGF5LAorCQkJCWludCBWRGlzcGxheSwgaW50IERlcHRoLCB1bnNpZ25lZCBpbnQgVkJGbGFnczIpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgSERpc3BsYXksCisJCQkJaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgsIHVuc2lnbmVkIGludCBWQkZsYWdzMik7CisKK3ZvaWQJCVNpU19TZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIHVuc2lnbmVkIHNob3J0IGluZGV4LCB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3ZvaWQJCVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3ZvaWQJCVNpU19TZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCwgdW5zaWduZWQgc2hvcnQgZGF0YSk7Cit2b2lkCQlTaVNfU2V0UmVnTG9uZyhTSVNJT0FERFJFU1MgcG9ydCwgdW5zaWduZWQgaW50IGRhdGEpOwordW5zaWduZWQgY2hhcglTaVNfR2V0UmVnKFNJU0lPQUREUkVTUyBwb3J0LCB1bnNpZ25lZCBzaG9ydCBpbmRleCk7Cit1bnNpZ25lZCBjaGFyCVNpU19HZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0KTsKK3Vuc2lnbmVkIHNob3J0CVNpU19HZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCk7Cit1bnNpZ25lZCBpbnQJU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTIHBvcnQpOwordm9pZAkJU2lTX1NldFJlZ0FORE9SKFNJU0lPQUREUkVTUyBQb3J0LCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgdW5zaWduZWQgc2hvcnQgRGF0YUFORCwKKwkJCQl1bnNpZ25lZCBzaG9ydCBEYXRhT1IpOwordm9pZAkJU2lTX1NldFJlZ0FORChTSVNJT0FERFJFU1MgUG9ydCx1bnNpZ25lZCBzaG9ydCBJbmRleCwgdW5zaWduZWQgc2hvcnQgRGF0YUFORCk7Cit2b2lkCQlTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTIFBvcnQsdW5zaWduZWQgc2hvcnQgSW5kZXgsIHVuc2lnbmVkIHNob3J0IERhdGFPUik7CisKK3ZvaWQJCVNpU19EaXNwbGF5T24oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordm9pZAkJU2lTX0Rpc3BsYXlPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordm9pZAkJU2lTUmVnSW5pdChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTSU9BRERSRVNTIEJhc2VBZGRyKTsKKyNpZm5kZWYgU0lTX0xJTlVYX0tFUk5FTAordm9pZAkJU2lTU2V0TFZEU2V0YyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAjZW5kaWYKLSAgIHsgMHgzOGEzLCA0LAotICAgICB7IDB4YTQ4MiwgMHhhNDgzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIlBYLTQyVk0iLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiTkVDIFBsYXNtYVN5bmMgNDJNUDMvNDJNUDQvNTBNUDIvNjFNUDEiLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICAxMSwgICAvKiBBbGwgRFZJIGV4Y2VwdCAwLCA3LCAxMywgMTcgKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDd8MHg0MCwgOXwweGMwLDEwfDB4YzAsMTF8MHhjMCwxM3wweDQwLDE0fDB4YzAsCi0gICAgICAxN3wweDQwLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotI2lmIDAgIC8qIFByb2R1Y3QgSURzIG1pc3NpbmcgKi8KLSAgIHsgMHgzOGEzLCAxLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyAzMzAwVyIsCi0gICAgIDAsIDAsCi0gICAgIDAsIDAsCi0gICAgIDMsCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsMTh8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzOGEzLCAxLAotICAgICB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJORUMgUGxhc21hU3luYyA0MjAwVyIsCi0gICAgIDQsICAgLyogRFZJIGVudGlyZWx5IHVua25vd24gKi8KLSAgICAgeyAwfDB4NDAsIDF8MHhjMCwgMnwweGMwLCA0fDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsCi0gICAgICAgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgICB9Ci0gICB9LAotICAgeyAweDM4YTMsIDEsCi0gICAgIHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIk5FQyBQbGFzbWFTeW5jIDQyMTBXIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgNiwgICAvKiBEVkkgZW50aXJlbHkgdW5rbm93biAqLwotICAgICB7IDB8MHg0MCwgMXwweGMwLCAyfDB4YzAsIDR8MHhjMCwgOXwweGMwLDExfDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwKLSAgICAgICAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzhhMywgMSwKLSAgICAgeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICIiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiTkVDIFBsYXNtYVN5bmMgNTAwMFciLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICA3LCAgIC8qIERWSSBlbnRpcmVseSB1bmtub3duICovCi0gICAgIHsgMHwweDQwLCAxfDB4YzAsIDJ8MHhjMCwgNHwweGMwLCA3fDB4NDAsIDl8MHhjMCwxMXwweGMwLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSNlbmRpZgotICAgeyAweDQxMmYsIDIsCi0gICAgIHsgMHgwMDBjLCAweDAwMGIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwKLSAgICAgeyAiIiwgIiIsICIiLCAiIiwgIiIgfSwKLSAgICAgIlBpb25lZXIgNTAzQ01YL1BEQS01MDAyIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgNiwgICAvKiBEVkkgdW5rbm93biAqLwotICAgICB7IDF8MHhjMCwgMnwweGMwLCA5fDB4YzAsMTF8MHhjMCwxMnwweGMwLDE1fDB4YzAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwKLSAgICAgICAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzRhOSwgMSwKLSAgICAgeyAweGEwMGUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICIiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiUGFuYXNvbmljIFRILTQyIiwKLSAgICAgMCwgMCwKLSAgICAgMCwgMCwKLSAgICAgNSwgICAvKiBObyBEVkkgb3V0cHV0ICovCi0gICAgIHsgMXwweDQwLCAyfDB4NDAsIDR8MHg0MCwgOXwweDQwLDE1fDB4NDAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzNGE5LCAxLAotICAgICB7IDB4YTAwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIlRILTQyUFcqNCIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJQYW5hc29uaWMgVEgtNDJQVzUiLAotICAgICAwLCAwLAotICAgICAwLCAwLAotICAgICAxLCAgIC8qIE5vIHNwZWNpYWwgbW9kZXMgb3RoZXJ3aXNlOyBubyBEVkkuICovCi0gICAgIHsyMHwweDQwLDE5fDB4NDAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHg0YzJlLCAxLAotICAgICB7IDB4OWIwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIlBMVi1aMiIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJTYW55byBQTFYtWjIgKG5vbiBIRENQLW1vZGUpIiwgCS8qIEhEQ1AgbW9kZSB3b3VsZCBiZSBpZCA5YjA2LCBidXQgbm90IG5lZWRlZCAqLwotICAgICAxMjgwLCA3NjgsCQkJCS8qIGFzIGl0IHRoZW4gYWR2ZXJ0aXNlcyBjb3JyZWN0IHNpemUgKi8KLSAgICAgMTI4MCwgNzIwLAotICAgICAxLCAgIC8qIDEyODB4NzIwLCBubyBzcGVjaWFsIG1vZGVzIG90aGVyd2lzZSAqLwotICAgICB7MjF8MHhjMCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwKLSAgICAgICAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAgIH0KLSAgIH0sCi0gICB7IDB4MzRhOSwgMSwKLSAgICAgeyAweGQwMzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LAotICAgICB7ICJBRTUwMFUgKERWSS1EKSIsICIiLCAiIiwgIiIsICIiIH0sCi0gICAgICJQYW5hc29uaWMgQUU1MDBVIiwKLSAgICAgMTI4MCwgNzY4LAotICAgICAxMjgwLCA3MjAsCi0gICAgIDEsICAgLyogMTI4MHg3MjAsIG5vIHNwZWNpYWwgbW9kZXMgb3RoZXJ3aXNlICovCi0gICAgIHsyMXwweGMwLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgzNGE5LCAxLAotICAgICB7IDB4ZDA0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sCi0gICAgIHsgIkFFNzAwVSAoSERNSSkiLCAiIiwgIiIsICIiLCAiIiB9LAotICAgICAiUGFuYXNvbmljIEFFNzAwVSIsCi0gICAgIDEzNjAsIDc2OCwKLSAgICAgMTI4MCwgNzIwLAotICAgICA2LCAgIC8qIDEyODB4NzIwLzYwLCAxMjgweDcyMC81MCwgMTI4MHg3NjhANTYoZGlnaXRhbC9hbmFsb2cpLCA3MjB4NDgwLCA3MjB4NTc2ICovCi0gICAgIHsyMXwweGMwLDIzfDB4YzAsMjJ8MHg4MCwxM3wweDQwLDI0fDB4ODAsMjV8MHg4MCwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLAotICAgICAgIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICwgMCAgICAgLCAwICAgICAsIDAgICAgICAgfQotICAgfSwKLSAgIHsgMHgwMDAwIH0KLX07Cit2b2lkCQlTaVNfU2V0RW5hYmxlRHN0bihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGVuYWJsZSk7Cit2b2lkCQlTaVNfU2V0RW5hYmxlRnN0bihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGVuYWJsZSk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TW9kZUZsYWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CitCT09MRUFOCQlTaVNEZXRlcm1pbmVST01MYXlvdXQ2NjEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworI2lmbmRlZiBTSVNfTElOVVhfS0VSTkVMCit2b2lkCQlTaVNfR2V0VkJUeXBlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKICNlbmRpZgogCi0jaWZkZWYgTElOVVhfWEY4NgotVVNIT1JUICBTaVNfR2V0TW9kZUlEKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LAotCQkJICBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwgaW50IExDRHdpdGgsIGludCBMQ0RoZWlnaHQpOworQk9PTEVBTgkJU2lTX1NlYXJjaE1vZGVJRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgKk1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCAqTW9kZUlkSW5kZXgpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit1bnNpZ25lZCBzaG9ydCAgU2lTX0dldFJlZkNSVFZDTEsoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IEluZGV4LCBpbnQgVXNlV2lkZSk7Cit1bnNpZ25lZCBzaG9ydCAgU2lTX0dldFJlZkNSVDFDUlRDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgaW50IFVzZVdpZGUpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldENvbG9yRGVwdGgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0T2Zmc2V0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUlJUSSk7CisjaWZkZWYgU0lTMzAwCit2b2lkCQlTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCAqaWR4MSwKKwkJCQl1bnNpZ25lZCBzaG9ydCAqaWR4Mik7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0RklGT1RocmVzaG9sZEIzMDAodW5zaWduZWQgc2hvcnQgaWR4MSwgdW5zaWduZWQgc2hvcnQgaWR4Mik7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TGF0ZW5jeUZhY3RvcjYzMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgaW5kZXgpOwogI2VuZGlmCi1VU0hPUlQgIFNpU19HZXRNb2RlSURfTENEKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgsIEJPT0xFQU4gRlNUTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIEN1c3RvbVQsIGludCBMQ0R3aXRoLCBpbnQgTENEaGVpZ2h0KTsKLVVTSE9SVCAgU2lTX0dldE1vZGVJRF9UVihpbnQgVkdBRW5naW5lLCBVTE9ORyBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoKTsKLVVTSE9SVCAgU2lTX0dldE1vZGVJRF9WR0EyKGludCBWR0FFbmdpbmUsIFVMT05HIFZCRmxhZ3MsIGludCBIRGlzcGxheSwgaW50IFZEaXNwbGF5LCBpbnQgRGVwdGgpOwotCi12b2lkIAlTaVNfU2V0UmVnKFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgaW5kZXgsIFVTSE9SVCBkYXRhKTsKLXZvaWQgCVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgZGF0YSk7Ci12b2lkICAJU2lTX1NldFJlZ1Nob3J0KFNJU0lPQUREUkVTUyBwb3J0LCBVU0hPUlQgZGF0YSk7Ci12b2lkCVNpU19TZXRSZWdMb25nKFNJU0lPQUREUkVTUyBwb3J0LCBVTE9ORyBkYXRhKTsKLVVDSEFSCVNpU19HZXRSZWcoU0lTSU9BRERSRVNTIHBvcnQsIFVTSE9SVCBpbmRleCk7Ci1VQ0hBUiAJU2lTX0dldFJlZ0J5dGUoU0lTSU9BRERSRVNTIHBvcnQpOwotVVNIT1JUCVNpU19HZXRSZWdTaG9ydChTSVNJT0FERFJFU1MgcG9ydCk7Ci1VTE9ORwlTaVNfR2V0UmVnTG9uZyhTSVNJT0FERFJFU1MgcG9ydCk7Ci12b2lkCVNpU19TZXRSZWdBTkRPUihTSVNJT0FERFJFU1MgUG9ydCwgVVNIT1JUIEluZGV4LCBVU0hPUlQgRGF0YUFORCwgVVNIT1JUIERhdGFPUik7Ci12b2lkIAlTaVNfU2V0UmVnQU5EKFNJU0lPQUREUkVTUyBQb3J0LFVTSE9SVCBJbmRleCwgVVNIT1JUIERhdGFBTkQpOwotdm9pZAlTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTIFBvcnQsVVNIT1JUIEluZGV4LCBVU0hPUlQgRGF0YU9SKTsKLXZvaWQJU2lTX0Rpc3BsYXlPbihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXZvaWQJU2lTX0Rpc3BsYXlPZmYoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci12b2lkCVNpU1JlZ0luaXQoU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTSU9BRERSRVNTIEJhc2VBZGRyKTsKLUJPT0xFQU4gU2lTRGV0ZXJtaW5lUk9NTGF5b3V0NjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfU2V0RW5hYmxlRHN0bihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKTsKLXZvaWQJU2lTX1NldEVuYWJsZUZzdG4oU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGVuYWJsZSk7Ci1CT09MRUFOCVNpU19TZWFyY2hNb2RlSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUICpNb2RlTm8sIFVTSE9SVCAqTW9kZUlkSW5kZXgpOwotVUNIQVIJU2lTX0dldE1vZGVQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4KTsKLVVTSE9SVAlTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpOwotVVNIT1JUCVNpU19HZXRPZmZzZXQoU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfTG9hZERBQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpOwotdm9pZAlTaVNfQ2FsY0xDREFDUlQxVGltaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci0KLSNpZmRlZiBMSU5VWF9YRjg2Ci1CT09MRUFOCVNpU1NldE1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyxTY3JuSW5mb1B0ciBwU2NybixVU0hPUlQgTW9kZU5vLCBCT09MRUFOIGRvc2V0cGl0Y2gpOwotQk9PTEVBTglTaVNCSU9TU2V0TW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBTY3JuSW5mb1B0ciBwU2NybiwKLSAgICAgICAgICAgICAgIERpc3BsYXlNb2RlUHRyIG1vZGUsIEJPT0xFQU4gSXNDdXN0b20pOwotQk9PTEVBTglTaVNCSU9TU2V0TW9kZUNSVDIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgU2NybkluZm9QdHIgcFNjcm4sCi0gICAgICAgICAgICAgICBEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKTsKLUJPT0xFQU4JU2lTQklPU1NldE1vZGVDUlQxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFNjcm5JbmZvUHRyIHBTY3JuLAotICAgICAgICAgICAgICAgRGlzcGxheU1vZGVQdHIgbW9kZSwgQk9PTEVBTiBJc0N1c3RvbSk7Ci1pbnQJU2lTVHJhbnNsYXRlVG9WRVNBKFNjcm5JbmZvUHRyIHBTY3JuLCBpbnQgbW9kZW51bWJlcik7Ci1pbnQJU2lTVHJhbnNsYXRlVG9PbGRNb2RlKGludCBtb2RlbnVtYmVyKTsKLUJPT0xFQU4JU2lTX0dldFBhbmVsSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPKTsKLVVTSE9SVCAJU2lTX0NoZWNrQnVpbGRDdXN0b21Nb2RlKFNjcm5JbmZvUHRyIHBTY3JuLCBEaXNwbGF5TW9kZVB0ciBtb2RlLCBpbnQgVkJGbGFncyk7Ci1EaXNwbGF5TW9kZVB0ciBTaVNCdWlsZEJ1aWx0SW5Nb2RlTGlzdChTY3JuSW5mb1B0ciBwU2NybiwgQk9PTEVBTiBpbmNsdWRlbGNkbW9kZXMsIEJPT0xFQU4gaXNmb3JkdmkpOwotaW50IAlTaVNfRmluZFBhbmVsRnJvbURCKFNJU1B0ciBwU2lTLCBVU0hPUlQgcGFuZWx2ZW5kb3IsIFVTSE9SVCBwYW5lbHByb2R1Y3QsIGludCAqbWF4eCwgaW50ICptYXh5LCBpbnQgKnByZWZ4LCBpbnQgKnByZWZ5KTsKLXZvaWQgICAgU2lTX01ha2VDbG9ja1JlZ3MoU2NybkluZm9QdHIgcFNjcm4sIGludCBjbG9jaywgVUNIQVIgKnAyYiwgVUNIQVIgKnAyYyk7Ci0jZWxzZQotQk9PTEVBTglTaVNTZXRNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sVVNIT1JUIE1vZGVObyk7Cit2b2lkCQlTaVNfTG9hZERBQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorQk9PTEVBTgkJU2lTU2V0TW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQlCT09MRUFOIGRvc2V0cGl0Y2gpOworQk9PTEVBTgkJU2lTQklPU1NldE1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIFNjcm5JbmZvUHRyIHBTY3JuLAorCQkJCURpc3BsYXlNb2RlUHRyIG1vZGUsIEJPT0xFQU4gSXNDdXN0b20pOworQk9PTEVBTgkJU2lTQklPU1NldE1vZGVDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTY3JuSW5mb1B0ciBwU2NybiwKKwkJCQlEaXNwbGF5TW9kZVB0ciBtb2RlLCBCT09MRUFOIElzQ3VzdG9tKTsKK0JPT0xFQU4JCVNpU0JJT1NTZXRNb2RlQ1JUMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgU2NybkluZm9QdHIgcFNjcm4sCisJCQkJRGlzcGxheU1vZGVQdHIgbW9kZSwgQk9PTEVBTiBJc0N1c3RvbSk7CisjZW5kaWYKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitCT09MRUFOCQlTaVNTZXRNb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pOworI2VuZGlmCit2b2lkCQlTaVNfQ2FsY0NSUmVnaXN0ZXJzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZGVwdGgpOwordm9pZAkJU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2Cit2b2lkCQlTaVNfR2VuZXJpY19Db252ZXJ0Q1JEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyICpjcmRhdGEsIGludCB4cmVzLAorCQkJCWludCB5cmVzLCBEaXNwbGF5TW9kZVB0ciBjdXJyZW50KTsKKyNlbmRpZgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKK3ZvaWQJCVNpU19HZW5lcmljX0NvbnZlcnRDUkRhdGEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgKmNyZGF0YSwgaW50IHhyZXMsCisJCQkJaW50IHlyZXMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBCT09MRUFOIHdyaXRlcmVzKTsKICNlbmRpZgogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi1pbnQgICAgCXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLQkJCSAgICAgIFVDSEFSIG1vZGVubywgVUNIQVIgcmF0ZWluZGV4KTsKLWludCAgICAJc2lzZmJfbW9kZV9yYXRlX3RvX2RkYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0JCQlVQ0hBUiBtb2Rlbm8sIFVDSEFSIHJhdGVpbmRleCwKLQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKTsKLUJPT0xFQU4gc2lzZmJfZ2V0dG90YWxmcm9tbW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotCQkgICAgICAgCVVDSEFSIG1vZGVubywgaW50ICpodG90YWwsIGludCAqdnRvdGFsLCBVQ0hBUiByYXRlaW5kZXgpOworLyogRnJvbSBpbml0MzAxLmM6ICovCitleHRlcm4gdm9pZAkJU2lTX0dldFZCSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBpbnQgY2hrY3J0Mm1vZGUpOworZXh0ZXJuIHZvaWQJCVNpU19HZXRMQ0RSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRZUGJQcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitleHRlcm4gdm9pZAkJU2lTX1NldFRWTW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB2b2lkCQlTaVNfVW5Mb2NrQ1JUMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitleHRlcm4gdm9pZAkJU2lTX0Rpc2FibGVCcmlkZ2Uoc3RydWN0IFNpU19Qcml2YXRlICopOworZXh0ZXJuIEJPT0xFQU4JCVNpU19TZXRDUlQyR3JvdXAoc3RydWN0IFNpU19Qcml2YXRlICosIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0UmF0ZVB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB2b2lkCQlTaVNfV2FpdFJldHJhY2UxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0UmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDB4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRWQ0xLMlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKTsKK2V4dGVybiBCT09MRUFOCQlTaVNfSXNWQU1vZGUoc3RydWN0IFNpU19Qcml2YXRlICopOworZXh0ZXJuIEJPT0xFQU4JCVNpU19Jc0R1YWxFZGdlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqKTsKKworI2lmZGVmIFNJU19YT1JHX1hGODYKKy8qIEZyb20gb3RoZXIgbW9kdWxlczogKi8KK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfQ2hlY2tCdWlsZEN1c3RvbU1vZGUoU2NybkluZm9QdHIgcFNjcm4sIERpc3BsYXlNb2RlUHRyIG1vZGUsCisJCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIJU2lTX0dldFNldEJJT1NTY3JhdGNoKFNjcm5JbmZvUHRyIHBTY3JuLCB1bnNpZ25lZCBzaG9ydCBvZmZzZXQsCisJCQkJdW5zaWduZWQgY2hhciB2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgY2hhcglTaVNfR2V0U2V0TW9kZUlEKFNjcm5JbmZvUHRyIHBTY3JuLCB1bnNpZ25lZCBjaGFyIGlkKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCAJU2lTX0dldE1vZGVOdW1iZXIoU2NybkluZm9QdHIgcFNjcm4sIERpc3BsYXlNb2RlUHRyIG1vZGUsCisJCQkJdW5zaWduZWQgaW50IFZCRmxhZ3MpOwogI2VuZGlmCiAKLS8qIGluaXQzMDEuYzogKi8KLWV4dGVybiB2b2lkICAgICBTaVNfR2V0VkJJbmZvKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLQkJCSAgICAgICAJUFNJU19IV19JTkZPIEh3SW5mbywgaW50IGNoa2NydDJtb2RlKTsKLWV4dGVybiB2b2lkICAgICBTaVNfR2V0TENEUmVzSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0JCQkgICAgICAgCVBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRZUGJQcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLWV4dGVybiB2b2lkIAlTaVNfU2V0VFZNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci1leHRlcm4gdm9pZCAgICAgU2lTX1VuTG9ja0NSVDIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci1leHRlcm4gdm9pZCAgICAgU2lTX0Rpc2FibGVCcmlkZ2UoU2lTX1ByaXZhdGUgKiwgUFNJU19IV19JTkZPKTsKLWV4dGVybiBCT09MRUFOICBTaVNfU2V0Q1JUMkdyb3VwKFNpU19Qcml2YXRlICosIFBTSVNfSFdfSU5GTywgVVNIT1JUKTsKLWV4dGVybiBVU0hPUlQgICBTaVNfR2V0UmF0ZVB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldFJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4KTsKLWV4dGVybiBVU0hPUlQgICBTaVNfR2V0Q0g3MDB4KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYXgpOwotZXh0ZXJuIFVTSE9SVCAgIFNpU19HZXRWQ0xLMlB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIEJPT0xFQU4gIFNpU19Jc1ZBTW9kZShTaVNfUHJpdmF0ZSAqLCBQU0lTX0hXX0lORk8pOwotZXh0ZXJuIEJPT0xFQU4gIFNpU19Jc0R1YWxFZGdlKFNpU19Qcml2YXRlICosIFBTSVNfSFdfSU5GTyk7Ci0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0vKiBGcm9tIG90aGVyIHNpcyBkcml2ZXIgbW9kdWxlczogKi8KLWV4dGVybiBpbnQgICAgICBTaVNfY29tcHV0ZV92Y2xrKGludCBDbG9jaywgaW50ICpvdXRfbiwgaW50ICpvdXRfZG4sIGludCAqb3V0X2RpdiwKLQkgICAgIAkgCSAJaW50ICpvdXRfc2JpdCwgaW50ICpvdXRfc2NhbGUpOwotZXh0ZXJuIHZvaWQgCVNpU0NhbGNDbG9jayhTY3JuSW5mb1B0ciBwU2NybiwgaW50IGNsb2NrLCBpbnQgbWF4X1ZMRCwgdW5zaWduZWQgaW50ICp2Y2xrKTsKLQotZXh0ZXJuIFVDSEFSICAgCVNpU19HZXRTZXRCSU9TU2NyYXRjaChTY3JuSW5mb1B0ciBwU2NybiwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpOwotZXh0ZXJuIFVDSEFSICAgCVNpU19HZXRTZXRNb2RlSUQoU2NybkluZm9QdHIgcFNjcm4sIFVDSEFSIGlkKTsKLWV4dGVybiBVU0hPUlQgCVNpU19HZXRNb2RlTnVtYmVyKFNjcm5JbmZvUHRyIHBTY3JuLCBEaXNwbGF5TW9kZVB0ciBtb2RlLCBVTE9ORyBWQkZsYWdzKTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisjaWZkZWYgU0lTMzAwCitleHRlcm4gdW5zaWduZWQgaW50CXNpc2ZiX3JlYWRfbmJyaWRnZV9wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworZXh0ZXJuIHZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLAorCQkJCXVuc2lnbmVkIGludCB2YWwpOworI2VuZGlmCisjaWZkZWYgU0lTMzE1SAorZXh0ZXJuIHZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2J5dGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcsCisJCQkJdW5zaWduZWQgY2hhciB2YWwpOworZXh0ZXJuIHVuc2lnbmVkIGludAlzaXNmYl9yZWFkX21pb19wY2lfd29yZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHJlZyk7CisjZW5kaWYKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuYwppbmRleCAyNzRkYWNkLi4yZDg4ZjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0MzAxLmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdDMwMS5jCkBAIC0yLDExICsyLDEyIEBACiAvKiAkWGRvdE9yZyQgKi8KIC8qCiAgKiBNb2RlIGluaXRpYWxpemluZyBjb2RlIChDUlQyIHNlY3Rpb24pCi0gKiBmb3IgU2lTIDMwMC8zMDUvNTQwLzYzMC83MzAgYW5kCi0gKiAgICAgU2lTIDMxNS81NTAvNjUwL002NTAvNjUxLzY2MUZYL002NjF4WC83NDAvNzQxKEdYKS9NNzQxLzMzMC82NjAvTTY2MC83NjAvTTc2MAotICogKFVuaXZlcnNhbCBtb2R1bGUgZm9yIExpbnV4IGtlcm5lbCBmcmFtZWJ1ZmZlciBhbmQgWEZyZWU4Ni9YLm9yZyA0LngpCisgKiBmb3IgU2lTIDMwMC8zMDUvNTQwLzYzMC83MzAsCisgKiAgICAgU2lTIDMxNS81NTAvW01dNjUwLzY1MS9bTV02NjFbRkdNXVgvW01dNzR4W0dYXS8zMzAvW01dNzZ4W0dYXSwKKyAqICAgICBYR0kgVjNYVC9WNS9WOCwgWjcKKyAqIChVbml2ZXJzYWwgbW9kdWxlIGZvciBMaW51eCBrZXJuZWwgZnJhbWVidWZmZXIgYW5kIFgub3JnL1hGcmVlODYgNC54KQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtMzgsNyArMzksNyBAQAogICogKiAzKSBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICAqICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAgKiAqCi0gKiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IKKyAqICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICAqICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogICogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogICogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCkBAIC01NCwyMCArNTUsMjAgQEAKICAqIEZvcm1lcmx5IGJhc2VkIG9uIG5vbi1mdW5jdGlvbmFsIGNvZGUtZnJhZ2VtZW50cyBmb3IgMzAwIHNlcmllcyBieSBTaVMsIEluYy4KICAqIFVzZWQgYnkgcGVybWlzc2lvbi4KICAqCi0gKiBUVyBzYXlzOiBUaGlzIGNvZGUgbG9va3MgYXdmdWwsIEkga25vdy4gQnV0IHBsZWFzZSBkb24ndCBkbyBhbnl0aGluZyBhYm91dAotICogdGhpcyBvdGhlcndpc2UgZGVidWdnaW5nIHdpbGwgYmUgaGVsbC4KLSAqIFRoZSBjb2RlIGlzIGV4dHJlbWVseSBmcmFnaWxlIGFzIHJlZ2FyZHMgdGhlIGRpZmZlcmVudCBjaGlwc2V0cywgZGlmZmVyZW50Ci0gKiB2aWRlbyBicmlkZ2VzIGFuZCBjb21iaW5hdGlvbnMgdGhlcmVvZi4gSWYgYW55dGhpbmcgaXMgY2hhbmdlZCwgZXh0cmVtZQotICogY2FyZSBoYXMgdG8gYmUgdGFrZW4gdGhhdCB0aGF0IGNoYW5nZSBkb2Vzbid0IGJyZWFrIGl0IGZvciBvdGhlciBjaGlwc2V0cywKLSAqIGJyaWRnZXMgb3IgY29tYmluYXRpb25zIHRoZXJlb2YuCi0gKiBBbGwgY29tbWVudHMgaW4gdGhpcyBmaWxlIGFyZSBieSBtZSwgcmVnYXJkbGVzcyBpZiBtYXJrZWQgVFcgb3Igbm90LgotICoKICAqLwogCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKICNpZiAxCiAjZGVmaW5lIFNFVF9FTUkJCS8qIDMwMkxWL0VMVjogU2V0IEVNSSB2YWx1ZXMgKi8KICNlbmRpZgogCisjaWYgMQorI2RlZmluZSBTRVRfUFdECQkvKiAzMDEvMzAyTFY6IFNldCBQV0QgKi8KKyNlbmRpZgorCiAjZGVmaW5lIENPTVBBTF9IQUNLCS8qIE5lZWRlZCBmb3IgQ29tcGFsIDE0MDB4MTA1MCAoRU1JKSAqLwogI2RlZmluZSBDT01QQVFfSEFDSwkvKiBOZWVkZWQgZm9yIEludmVudGVjL0NvbXBhcSAxMjgweDEwMjQgKEVNSSkgKi8KICNkZWZpbmUgQVNVU19IQUNLCS8qIE5lZWRlZCBmb3IgQXN1cyBBMkggMTAyNHg3NjggKEVNSSkgKi8KQEAgLTg1LDI2ICs4NiwzNSBAQAogI2RlZmluZSBTaVNfSTJDREVMQVkgICAgICAxMDAwCiAjZGVmaW5lIFNpU19JMkNERUxBWVNIT1JUICAxNTAKIAotc3RhdGljIFVTSE9SVCBTaVNfR2V0QklPU0xDRFJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1zdGF0aWMgdm9pZCBTaVNfU2V0Q0g3MHh4KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYngpOworc3RhdGljIHVuc2lnbmVkIHNob3J0CVNpU19HZXRCSU9TTENEUmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorc3RhdGljIHZvaWQJCVNpU19TZXRDSDcweHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgY2hhciB2YWwpOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgIEhFTFBFUjogTG9jay9VbmxvY2sgQ1JUMiAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1VuTG9ja0NSVDIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19VbkxvY2tDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpCisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFhHSV8yMCkKKyAgICAgIHJldHVybjsKKyAgIGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkKICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZiwweDAxKTsKICAgIGVsc2UKICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyNCwweDAxKTsKIH0KIAotc3RhdGljIHZvaWQKLVNpU19Mb2NrQ1JUMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKK3N0YXRpYworI2VuZGlmCit2b2lkCitTaVNfTG9ja0NSVDIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gWEdJXzIwKQorICAgICAgcmV0dXJuOworICAgZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKQogICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRiwweEZFKTsKICAgIGVsc2UKICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MjQsMHhGRSk7CkBAIC0xMTUsOSArMTI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0UmVnU1IxMUFORE9SKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFVTSE9SVCBEYXRhQU5ELCBVU0hPUlQgRGF0YU9SKQorU2lTX1NldFJlZ1NSMTFBTkRPUihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRGF0YUFORCwgdW5zaWduZWQgc2hvcnQgRGF0YU9SKQogewotICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAgICAgICBEYXRhQU5EICY9IDB4MGY7CiAgICAgICBEYXRhT1IgICY9IDB4MGY7CiAgICB9CkBAIC0xMjksMTIgKzEzOSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIFNJUzMxNUgKLXN0YXRpYyBVQ0hBUiAqCi1HZXRMQ0RTdHJ1Y3RQdHI2NjEoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK0dldExDRFN0cnVjdFB0cjY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgIFVDSEFSICAqbXlwdHIgPSBOVUxMOwotICAgVVNIT1JUIHJvbWluZGV4ID0gMCwgcmVnID0gMCwgaWR4ID0gMDsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIGNoYXIgICpteXB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCByb21pbmRleCA9IDAsIHJlZyA9IDAsIGlkeCA9IDA7CiAKICAgIC8qIFVzZSB0aGUgQklPUyB0YWJsZXMgb25seSBmb3IgTFZEUyBwYW5lbHM7IFRNRFMgaXMgdW5yZWxpYWJsZQogICAgICogZHVlIHRvIHRoZSB2YXJpYXR5IG9mIHBhbmVscyB0aGUgQklPUyBkb2Vzbid0IGtub3cgYWJvdXQuCkBAIC0xNDQsMTUgKzE1NCwxNSBAQAogICAgICovCiAKICAgIGlmKChTaVNfUHItPlNpU19ST01OZXcpICYmCi0gICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHx8ICghU2lTX1ByLT5QYW5lbFNlbGZEZXRlY3RlZCkpKSB7CisgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHx8ICghU2lTX1ByLT5QYW5lbFNlbGZEZXRlY3RlZCkpKSB7CiAKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgcmVnID0gMHgzYzsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gMHg3ZDsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSByZWcgPSAweDNjOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDB4N2Q7CiAKICAgICAgIGlkeCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQscmVnKSAmIDB4MWYpICogMjY7CiAKICAgICAgIGlmKGlkeCA8ICg4KjI2KSkgewotICAgICAgICAgbXlwdHIgPSAoVUNIQVIgKikmU2lTX0xDRFN0cnVjdDY2MVtpZHhdOworICAgICAgICAgbXlwdHIgPSAodW5zaWduZWQgY2hhciAqKSZTaVNfTENEU3RydWN0NjYxW2lkeF07CiAgICAgICB9CiAgICAgICByb21pbmRleCA9IFNJU0dFVFJPTVcoMHgxMDApOwogICAgICAgaWYocm9taW5kZXgpIHsKQEAgLTE2MywxMSArMTczLDExIEBACiAgICByZXR1cm4gbXlwdHI7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLUdldExDRFN0cnVjdFB0cjY2MV8yKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0dldExDRFN0cnVjdFB0cjY2MV8yKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICAgVVNIT1JUIHJvbXB0ciA9IDA7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCByb21wdHIgPSAwOwogCiAgICAvKiBVc2UgdGhlIEJJT1MgdGFibGVzIG9ubHkgZm9yIExWRFMgcGFuZWxzOyBUTURTIGlzIHVucmVsaWFibGUKICAgICAqIGR1ZSB0byB0aGUgdmFyaWF0eSBvZiBwYW5lbHMgdGhlIEJJT1MgZG9lc24ndCBrbm93IGFib3V0LgpAQCAtMTc3LDEyICsxODcsMTIgQEAKICAgICAqLwogCiAgICBpZigoU2lTX1ByLT5TaVNfUk9NTmV3KSAmJgotICAgICAgKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB8fCAoIVNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQpKSkgeworICAgICAgKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB8fCAoIVNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQpKSkgewogICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDEwMik7CiAgICAgICByb21wdHIgKz0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNCkgKiBTaVNfUHItPlNpUzY2MUxDRDJUYWJsZVNpemUpOwogICAgfQogCi0gICByZXR1cm4ocm9tcHRyKTsKKyAgIHJldHVybiByb21wdHI7CiB9CiAjZW5kaWYKIApAQCAtMTkxLDE4NiArMjAxLDE4NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIEJPT0xFQU4KLVNpU19BZGp1c3RDUlQyUmF0ZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVVNIT1JUIFJSVEksIFVTSE9SVCAqaSwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19BZGp1c3RDUlQyUmF0ZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUlJUSSwgdW5zaWduZWQgc2hvcnQgKmkpCiB7Ci0gIFVTSE9SVCBjaGVja21hc2s9MCxtb2RlaWQsaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCBjaGVja21hc2s9MCwgbW9kZWlkLCBpbmZvZmxhZzsKIAotICBtb2RlaWQgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgKCppKV0uTW9kZUlEOworICAgbW9kZWlkID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLk1vZGVJRDsKIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykgewogCi0gICAgICAJY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyOwotCWlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyXzEzNTsKLQkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLQkgICAgICBjaGVja21hc2sgfD0gU3VwcG9ydFJBTURBQzJfMTYyOwotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIHsKLQkJIGNoZWNrbWFzayB8PSBTdXBwb3J0UkFNREFDMl8yMDI7Ci0JICAgICAgfQotCSAgIH0KLQl9CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0UkFNREFDMjsKKwkgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSAgICBjaGVja21hc2sgfD0gU3VwcG9ydFJBTURBQzJfMTM1OworCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgICAgICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyXzE2MjsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUkFNREFDMjAyKSB7CisJCSAgY2hlY2ttYXNrIHw9IFN1cHBvcnRSQU1EQUMyXzIwMjsKKwkgICAgICAgfQorCSAgICB9CisJIH0KIAotICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAKLSAgICAgCWNoZWNrbWFzayB8PSBTdXBwb3J0TENEOwotCWlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICAgICBpZigoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpICYmIChTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewotCSAgICAgICAgIGlmKG1vZGVpZCA9PSAweDJlKSBjaGVja21hc2sgfD0gU3VwcG9ydDY0MDQ4MDYwSHo7Ci0JICAgICAgfQotCSAgIH0KLQl9CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0TENEOworCSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CisJICAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CisJICAgICAgICAgIGlmKG1vZGVpZCA9PSAweDJlKSBjaGVja21hc2sgfD0gU3VwcG9ydDY0MDQ4MDYwSHo7CisJICAgICAgIH0KKwkgICAgfQorCSB9CiAKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKIAotICAgICAgCWNoZWNrbWFzayB8PSBTdXBwb3J0SGlWaXNpb247CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0SGlWaXNpb247CiAKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MHxTZXRDUlQyVG9BVklERU98U2V0Q1JUMlRvU1ZJREVPfFNldENSVDJUb1NDQVJUKSkgeworICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MHxTZXRDUlQyVG9BVklERU98U2V0Q1JUMlRvU1ZJREVPfFNldENSVDJUb1NDQVJUKSkgewogCi0gICAgICAgIGNoZWNrbWFzayB8PSBTdXBwb3J0VFY7Ci0JaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0JICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRUVjEwMjQ7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgewotCSAgICAgICAgIGNoZWNrbWFzayB8PSBTdXBwb3J0WVBiUHI3NTBwOwotCSAgICAgIH0KLQkgICB9Ci0JfQorCSBjaGVja21hc2sgfD0gU3VwcG9ydFRWOworCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKwkgICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRUVjEwMjQ7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI3NTBwKSB7CisJICAgICAgICAgIGNoZWNrbWFzayB8PSBTdXBwb3J0WVBiUHI3NTBwOworCSAgICAgICB9CisJICAgIH0KKwkgfQogCi0gICAgIH0KKyAgICAgIH0KIAotICB9IGVsc2UgewkvKiBMVkRTICovCisgICB9IGVsc2UgewkvKiBMVkRTICovCiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgIAlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewotICAgICAgICAgICBjaGVja21hc2sgfD0gU3VwcG9ydENIVFY7Ci0gICAgICAJfQotICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwkgICAgY2hlY2ttYXNrIHw9IFN1cHBvcnRDSFRWOworCSB9CisgICAgICB9CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgIAljaGVja21hc2sgfD0gU3VwcG9ydExDRDsKLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJIGNoZWNrbWFzayB8PSBTdXBwb3J0TENEOworICAgICAgfQogCi0gIH0KKyAgIH0KIAotICAvKiBMb29rIGJhY2t3YXJkcyBpbiB0YWJsZSBmb3IgbWF0Y2hpbmcgQ1JUMiBtb2RlICovCi0gIGZvcig7IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyAoKmkpXS5Nb2RlSUQgPT0gbW9kZWlkOyAoKmkpLS0pIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgKCppKV0uRXh0X0luZm9GbGFnOwotICAgICBpZihpbmZvZmxhZyAmIGNoZWNrbWFzaykgcmV0dXJuIFRSVUU7Ci0gICAgIGlmKCgqaSkgPT0gMCkgYnJlYWs7Ci0gIH0KKyAgIC8qIExvb2sgYmFja3dhcmRzIGluIHRhYmxlIGZvciBtYXRjaGluZyBDUlQyIG1vZGUgKi8KKyAgIGZvcig7IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyAoKmkpXS5Nb2RlSUQgPT0gbW9kZWlkOyAoKmkpLS0pIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLkV4dF9JbmZvRmxhZzsKKyAgICAgIGlmKGluZm9mbGFnICYgY2hlY2ttYXNrKSByZXR1cm4gVFJVRTsKKyAgICAgIGlmKCgqaSkgPT0gMCkgYnJlYWs7CisgICB9CiAKLSAgLyogTG9vayB0aHJvdWdoIHRoZSB3aG9sZSBtb2RlLXNlY3Rpb24gb2YgdGhlIHRhYmxlIGZyb20gdGhlIGJlZ2lubmluZwotICAgKiBmb3IgYSBtYXRjaGluZyBDUlQyIG1vZGUgaWYgbm8gbW9kZSB3YXMgZm91bmQgeWV0LgotICAgKi8KLSAgZm9yKCgqaSkgPSAwOyA7ICgqaSkrKykgewotICAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgKCppKV0uTW9kZUlEICE9IG1vZGVpZCkgYnJlYWs7Ci0gICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLkV4dF9JbmZvRmxhZzsKLSAgICAgaWYoaW5mb2ZsYWcgJiBjaGVja21hc2spIHJldHVybiBUUlVFOwotICB9Ci0gIHJldHVybiBGQUxTRTsKKyAgIC8qIExvb2sgdGhyb3VnaCB0aGUgd2hvbGUgbW9kZS1zZWN0aW9uIG9mIHRoZSB0YWJsZSBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAqIGZvciBhIG1hdGNoaW5nIENSVDIgbW9kZSBpZiBubyBtb2RlIHdhcyBmb3VuZCB5ZXQuCisgICAgKi8KKyAgIGZvcigoKmkpID0gMDsgOyAoKmkpKyspIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyAoKmkpXS5Nb2RlSUQgIT0gbW9kZWlkKSBicmVhazsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArICgqaSldLkV4dF9JbmZvRmxhZzsKKyAgICAgIGlmKGluZm9mbGFnICYgY2hlY2ttYXNrKSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICBHZXQgcmF0ZSBpbmRleCAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1VU0hPUlQKLVNpU19HZXRSYXRlUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCit1bnNpZ25lZCBzaG9ydAorU2lTX0dldFJhdGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFNIT1JUICBMQ0RSZWZyZXNoSW5kZXhbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLAotCQkJICAgICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0JCQkgICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLQkJCSAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci0gIFVTSE9SVCBSUlRJLGksYmFja3VwX2k7Ci0gIFVTSE9SVCBtb2RlZmxhZyxpbmRleCx0ZW1wLGJhY2t1cGluZGV4OworICAgdW5zaWduZWQgc2hvcnQgUlJUSSxpLGJhY2t1cF9pOworICAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcsaW5kZXgsdGVtcCxiYWNrdXBpbmRleDsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBMQ0RSZWZyZXNoSW5kZXhbXSA9IHsKKwkJMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICAgfTsKIAotICAvKiBEbyBOT1QgY2hlY2sgZm9yIFVzZUN1c3RvbU1vZGUgaGVyZSwgd2lsbCBza3JldyB1cCBGSUZPICovCi0gIGlmKE1vZGVObyA9PSAweGZlKSByZXR1cm4gMDsKKyAgIC8qIERvIE5PVCBjaGVjayBmb3IgVXNlQ3VzdG9tTW9kZSBoZXJlLCB3aWxsIHNrcmV3IHVwIEZJRk8gKi8KKyAgIGlmKE1vZGVObyA9PSAweGZlKSByZXR1cm4gMDsKIAotICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gIH0KKyAgIGlmKE1vZGVObyA8PSAweDEzKSB7CisgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisgICB9IGVsc2UgeworICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKyAgIH0KIAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHJldHVybiAwOwotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwkgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgcmV0dXJuIDA7CisgICAgICB9CisgICB9CiAKLSAgaWYoTW9kZU5vIDwgMHgxNCkgcmV0dXJuIDB4RkZGRjsKKyAgIGlmKE1vZGVObyA8IDB4MTQpIHJldHVybiAweEZGRkY7CiAKLSAgaW5kZXggPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzMpID4+IFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlKSAmIDB4MEY7Ci0gIGJhY2t1cGluZGV4ID0gaW5kZXg7CisgICBpbmRleCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMykgPj4gU2lTX1ByLT5TaVNfU2VsZWN0Q1JUMlJhdGUpICYgMHgwRjsKKyAgIGJhY2t1cGluZGV4ID0gaW5kZXg7CiAKLSAgaWYoaW5kZXggPiAwKSBpbmRleC0tOworICAgaWYoaW5kZXggPiAwKSBpbmRleC0tOwogCi0gIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpCQlpbmRleCA9IDA7Ci0JICAgZWxzZSBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgaW5kZXggPSBiYWNrdXBpbmRleCA9IDA7Ci0JfQotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpKSB7Ci0gICAgICAgICAgICAgIHRlbXAgPSBMQ0RSZWZyZXNoSW5kZXhbU2lTX0dldEJJT1NMQ0RSZXNJbmZvKFNpU19QcildOwotICAgICAgICAgICAgICBpZihpbmRleCA+IHRlbXApIGluZGV4ID0gdGVtcDsKLQkgICB9Ci0JfQotICAgICB9IGVsc2UgewotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIGluZGV4ID0gMDsKLQlpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIGluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgeworCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkJCSBpbmRleCA9IDA7CisJICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIGluZGV4ID0gYmFja3VwaW5kZXggPSAwOworCSB9CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeworCSAgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkgeworCSAgICAgICB0ZW1wID0gTENEUmVmcmVzaEluZGV4W1NpU19HZXRCSU9TTENEUmVzSW5mbyhTaVNfUHIpXTsKKwkgICAgICAgaWYoaW5kZXggPiB0ZW1wKSBpbmRleCA9IHRlbXA7CisJICAgIH0KKwkgfQorICAgICAgfSBlbHNlIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSBpbmRleCA9IDA7CisJIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworCSAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgaW5kZXggPSAwOworCSB9CisgICAgICB9CisgICB9CiAKLSAgUlJUSSA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUkVGaW5kZXg7Ci0gIE1vZGVObyA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLk1vZGVJRDsKKyAgIFJSVEkgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlJFRmluZGV4OworICAgTW9kZU5vID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uTW9kZUlEOwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgRHJpdmVyTW9kZSkpIHsKLSAgICAgICAgaWYoIChTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9WRVNBSUQgPT0gMHgxMDUpIHx8Ci0gICAgICAgICAgICAoU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfVkVTQUlEID09IDB4MTA3KSApIHsKLSAgICAgICAgICAgaWYoYmFja3VwaW5kZXggPD0gMSkgUlJUSSsrOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBEcml2ZXJNb2RlKSkgeworCSBpZiggKFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1ZFU0FJRCA9PSAweDEwNSkgfHwKKwkgICAgIChTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9WRVNBSUQgPT0gMHgxMDcpICkgeworCSAgICBpZihiYWNrdXBpbmRleCA8PSAxKSBSUlRJKys7CisJIH0KKyAgICAgIH0KKyAgIH0KIAotICBpID0gMDsKLSAgZG8gewotICAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaV0uTW9kZUlEICE9IE1vZGVObykgYnJlYWs7Ci0gICAgIHRlbXAgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaV0uRXh0X0luZm9GbGFnOwotICAgICB0ZW1wICY9IE1vZGVUeXBlTWFzazsKLSAgICAgaWYodGVtcCA8IFNpU19Qci0+U2lTX01vZGVUeXBlKSBicmVhazsKLSAgICAgaSsrOwotICAgICBpbmRleC0tOwotICB9IHdoaWxlKGluZGV4ICE9IDB4RkZGRik7CisgICBpID0gMDsKKyAgIGRvIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEkgKyBpXS5Nb2RlSUQgIT0gTW9kZU5vKSBicmVhazsKKyAgICAgIHRlbXAgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaV0uRXh0X0luZm9GbGFnOworICAgICAgdGVtcCAmPSBNb2RlVHlwZU1hc2s7CisgICAgICBpZih0ZW1wIDwgU2lTX1ByLT5TaVNfTW9kZVR5cGUpIGJyZWFrOworICAgICAgaSsrOworICAgICAgaW5kZXgtLTsKKyAgIH0gd2hpbGUoaW5kZXggIT0gMHhGRkZGKTsKIAotICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgIAl0ZW1wID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSSArIGkgLSAxXS5FeHRfSW5mb0ZsYWc7Ci0gICAgICAJaWYodGVtcCAmIEludGVybGFjZU1vZGUpIGkrKzsKLSAgICAgfQotICB9CisgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJIHRlbXAgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJICsgaSAtIDFdLkV4dF9JbmZvRmxhZzsKKwkgaWYodGVtcCAmIEludGVybGFjZU1vZGUpIGkrKzsKKyAgICAgIH0KKyAgIH0KIAotICBpLS07CisgICBpLS07CiAKLSAgaWYoKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkpKSB7Ci0gICAgIGJhY2t1cF9pID0gaTsKLSAgICAgaWYoIShTaVNfQWRqdXN0Q1JUMlJhdGUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJLCAmaSwgSHdJbmZvKSkpIHsKLQlpID0gYmFja3VwX2k7Ci0gICAgIH0KLSAgfQorICAgaWYoKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkpKSB7CisgICAgICBiYWNrdXBfaSA9IGk7CisgICAgICBpZighKFNpU19BZGp1c3RDUlQyUmF0ZShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJSVEksICZpKSkpIHsKKwkgaSA9IGJhY2t1cF9pOworICAgICAgfQorICAgfQogCi0gIHJldHVybihSUlRJICsgaSk7CisgICByZXR1cm4gKFJSVEkgKyBpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM3OCwxNSArMzg5LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NhdmVDUlQySW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vKQorU2lTX1NhdmVDUlQySW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVU0hPUlQgdGVtcDEsdGVtcDI7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wMSwgdGVtcDI7CiAKLSAgLyogU3RvcmUgQ1JUMSBNb2RlTm8gaW4gQ1IzNCAqLwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNCxNb2RlTm8pOwotICB0ZW1wMSA9IChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgPj4gODsKLSAgdGVtcDIgPSB+KFNldEluU2xhdmVNb2RlID4+IDgpOwotICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNkNCwweDMxLHRlbXAyLHRlbXAxKTsKKyAgIC8qIFN0b3JlIENSVDEgTW9kZU5vIGluIENSMzQgKi8KKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM0LE1vZGVObyk7CisgICB0ZW1wMSA9IChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgPj4gODsKKyAgIHRlbXAyID0gfihTZXRJblNsYXZlTW9kZSA+PiA4KTsKKyAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QM2Q0LDB4MzEsdGVtcDIsdGVtcDEpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzk1LDM1ICs0MDYsMzUgQEAKIAogI2lmZGVmIFNJUzMwMAogc3RhdGljIEJPT0xFQU4KLVNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DUjM2QklPU1dvcmQyM2Ioc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIHRlbXAsdGVtcDE7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLHRlbXAxOwogCi0gIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewotICAgICBpZigoUk9NQWRkclsweDIzM10gPT0gMHgxMikgJiYgKFJPTUFkZHJbMHgyMzRdID09IDB4MzQpKSB7Ci0gICAgICAgIHRlbXAgPSAxIDw8ICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYpID4+IDQpICYgMHgwZik7Ci0gICAgICAgIHRlbXAxID0gU0lTR0VUUk9NVygweDIzYik7Ci0gICAgICAgIGlmKHRlbXAxICYgdGVtcCkgcmV0dXJuIFRSVUU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKKyAgICAgIGlmKChST01BZGRyWzB4MjMzXSA9PSAweDEyKSAmJiAoUk9NQWRkclsweDIzNF0gPT0gMHgzNCkpIHsKKwkgdGVtcCA9IDEgPDwgKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNCkgJiAweDBmKTsKKwkgdGVtcDEgPSBTSVNHRVRST01XKDB4MjNiKTsKKwkgaWYodGVtcDEgJiB0ZW1wKSByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIEJPT0xFQU4KLVNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DUjM2QklPU1dvcmQyM2Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIHRlbXAsdGVtcDE7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLHRlbXAxOwogCi0gIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewotICAgICBpZigoUk9NQWRkclsweDIzM10gPT0gMHgxMikgJiYgKFJPTUFkZHJbMHgyMzRdID09IDB4MzQpKSB7Ci0gICAgICAgIHRlbXAgPSAxIDw8ICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYpID4+IDQpICYgMHgwZik7Ci0gICAgICAgIHRlbXAxID0gU0lTR0VUUk9NVygweDIzZCk7Ci0gICAgICAgIGlmKHRlbXAxICYgdGVtcCkgcmV0dXJuIFRSVUU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKKyAgICAgIGlmKChST01BZGRyWzB4MjMzXSA9PSAweDEyKSAmJiAoUk9NQWRkclsweDIzNF0gPT0gMHgzNCkpIHsKKwkgdGVtcCA9IDEgPDwgKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNCkgJiAweDBmKTsKKwkgdGVtcDEgPSBTSVNHRVRST01XKDB4MjNkKTsKKwkgaWYodGVtcDEgJiB0ZW1wKSByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCkBAIC00MzIsODUgKzQ0Myw3NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX0REQzJEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgZGVsYXl0aW1lKQorU2lTX0REQzJEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgaW50IGRlbGF5dGltZSkKIHsKLSAgVVNIT1JUIGksIGo7CisgICB1bnNpZ25lZCBpbnQgaSwgajsKIAotICBmb3IoaT0wOyBpPGRlbGF5dGltZTsgaSsrKSB7Ci0gICAgIGogKz0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MDUpOwotICB9CisgICBmb3IoaSA9IDA7IGkgPCBkZWxheXRpbWU7IGkrKykgeworICAgICAgaiArPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNSk7CisgICB9CiB9CiAKICNpZiBkZWZpbmVkKFNJUzMwMCkgfHwgZGVmaW5lZChTSVMzMTVIKQogc3RhdGljIHZvaWQKLVNpU19HZW5lcmljRGVsYXkoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIGRlbGF5KQorU2lTX0dlbmVyaWNEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgZGVsYXkpCiB7Ci0gIFVTSE9SVCB0ZW1wLGZsYWc7Ci0KLSAgZmxhZyA9IFNpU19HZXRSZWdCeXRlKDB4NjEpICYgMHgxMDsKLQotICB3aGlsZShkZWxheSkgewotICAgICB0ZW1wID0gU2lTX0dldFJlZ0J5dGUoMHg2MSkgJiAweDEwOwotICAgICBpZih0ZW1wID09IGZsYWcpIGNvbnRpbnVlOwotICAgICBmbGFnID0gdGVtcDsKLSAgICAgZGVsYXktLTsKLSAgfQorICAgU2lTX0REQzJEZWxheShTaVNfUHIsIGRlbGF5ICogMzYpOwogfQogI2VuZGlmCiAKICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotU2lTX0xvbmdEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgZGVsYXkpCitTaVNfTG9uZ0RlbGF5KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBkZWxheSkKIHsKLSAgd2hpbGUoZGVsYXktLSkgewotICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwweDE5ZGYpOwotICB9CisgICB3aGlsZShkZWxheS0tKSB7CisgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNjYyMyk7CisgICB9CiB9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCiBzdGF0aWMgdm9pZAotU2lTX1Nob3J0RGVsYXkoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIGRlbGF5KQorU2lTX1Nob3J0RGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IGRlbGF5KQogewotICB3aGlsZShkZWxheS0tKSB7Ci0gICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLDB4NDIpOwotICB9CisgICB3aGlsZShkZWxheS0tKSB7CisgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNjYpOworICAgfQogfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkCi1TaVNfUGFuZWxEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgRGVsYXlUaW1lKQorU2lTX1BhbmVsRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IERlbGF5VGltZSkKIHsKICNpZiBkZWZpbmVkKFNJUzMwMCkgfHwgZGVmaW5lZChTSVMzMTVIKQotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBQYW5lbElELCBEZWxheUluZGV4LCBEZWxheT0wOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgUGFuZWxJRCwgRGVsYXlJbmRleCwgRGVsYXk9MDsKICNlbmRpZgogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwCiAKICAgICAgIFBhbmVsSUQgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNik7CiAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSBQYW5lbElEICY9IDB4Zjc7Ci0gICAgICAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE4KSAmIDB4MTApKSBQYW5lbElEID0gMHgxMjsKKwkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSBQYW5lbElEICY9IDB4Zjc7CisJIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTgpICYgMHgxMCkpIFBhbmVsSUQgPSAweDEyOwogICAgICAgfQogICAgICAgRGVsYXlJbmRleCA9IFBhbmVsSUQgPj4gNDsKICAgICAgIGlmKChEZWxheVRpbWUgPj0gMikgJiYgKChQYW5lbElEICYgMHgwZikgPT0gMSkpICB7Ci0gICAgICAgICBEZWxheSA9IDM7CisJIERlbGF5ID0gMzsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZihEZWxheVRpbWUgPj0gMikgRGVsYXlUaW1lIC09IDI7Ci0gICAgICAgICBpZighKERlbGF5VGltZSAmIDB4MDEpKSB7Ci0gICAgICAgCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMF07Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgIAkgICAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsW0RlbGF5SW5kZXhdLnRpbWVyWzFdOwotICAgICAgICAgfQorCSBpZihEZWxheVRpbWUgPj0gMikgRGVsYXlUaW1lIC09IDI7CisJIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKKwkgICAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsW0RlbGF5SW5kZXhdLnRpbWVyWzBdOworCSB9IGVsc2UgeworCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMV07CisJIH0KIAkgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7Ci0gICAgICAgICAgICBpZihST01BZGRyWzB4MjIwXSAmIDB4NDApIHsKLSAgICAgICAgICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIERlbGF5ID0gKFVTSE9SVClST01BZGRyWzB4MjI1XTsKLSAgICAgICAgICAgICAgIGVsc2UgCSAgICAJICAgICAgIERlbGF5ID0gKFVTSE9SVClST01BZGRyWzB4MjI2XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KKwkgICAgaWYoUk9NQWRkclsweDIyMF0gJiAweDQwKSB7CisJICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIERlbGF5ID0gKHVuc2lnbmVkIHNob3J0KVJPTUFkZHJbMHgyMjVdOworCSAgICAgICBlbHNlIAkgICAgCSAgICAgICBEZWxheSA9ICh1bnNpZ25lZCBzaG9ydClST01BZGRyWzB4MjI2XTsKKwkgICAgfQorCSB9CiAgICAgICB9CiAgICAgICBTaVNfU2hvcnREZWxheShTaVNfUHIsIERlbGF5KTsKIApAQCAtNTIwLDIzICs1MjIsMjMgQEAKIAogI2lmZGVmIFNJUzMxNUgKIAotICAgICAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpICAgIHx8Ci0gICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgfHwKLQkgKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMzApICAgIHx8CisgICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSAgICB8fAorCSAoU2lTX1ByLT5DaGlwVHlwZSA8PSBTSVNfMzE1UFJPKSB8fAorCSAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzMwKSAgICB8fAogCSAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgewogCi0gICAgICAgICBpZighKERlbGF5VGltZSAmIDB4MDEpKSB7CisJIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKIAkgICAgU2lTX0REQzJEZWxheShTaVNfUHIsIDB4MTAwMCk7Ci0gICAgICAgICB9IGVsc2UgeworCSB9IGVsc2UgewogCSAgICBTaVNfRERDMkRlbGF5KFNpU19QciwgMHg0MDAwKTsKLSAgICAgICAgIH0KKwkgfQogCiAgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIC8qIHx8Ci0gICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ09NUEFRMTI4MCkgfHwKKwkgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBUTEyODApIHx8CiAJIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9DTEVWTzE0MDApICovICkgewkJCS8qIDMxNSBzZXJpZXMsIExWRFM7IFNwZWNpYWwgKi8KIAotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSB7Ci0gICAgICAgICAgICBQYW5lbElEID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYpOworCSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApIHsKKwkgICAgUGFuZWxJRCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM2KTsKIAkgICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xNDAwKSB7CiAJICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWIpICYgMHgxMCkpIFBhbmVsSUQgPSAweDEyOwogCSAgICB9CkBAIC01NDYsMzUgKzU0OCwzNSBAQAogCSAgICAgICBEZWxheUluZGV4ID0gUGFuZWxJRCA+PiA0OwogCSAgICB9CiAJICAgIGlmKChEZWxheVRpbWUgPj0gMikgJiYgKChQYW5lbElEICYgMHgwZikgPT0gMSkpICB7Ci0gICAgICAgICAgICAgICBEZWxheSA9IDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgaWYoRGVsYXlUaW1lID49IDIpIERlbGF5VGltZSAtPSAyOwotICAgICAgICAgICAgICAgaWYoIShEZWxheVRpbWUgJiAweDAxKSkgewotICAgICAgIAkJICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxMVkRTW0RlbGF5SW5kZXhdLnRpbWVyWzBdOwotICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAJCSAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsTFZEU1tEZWxheUluZGV4XS50aW1lclsxXTsKLSAgICAgICAgICAgICAgIH0KKwkgICAgICAgRGVsYXkgPSAzOworCSAgICB9IGVsc2UgeworCSAgICAgICBpZihEZWxheVRpbWUgPj0gMikgRGVsYXlUaW1lIC09IDI7CisJICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKKwkJICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxMVkRTW0RlbGF5SW5kZXhdLnRpbWVyWzBdOworCQl9IGVsc2UgeworCQkgIERlbGF5ID0gU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibExWRFNbRGVsYXlJbmRleF0udGltZXJbMV07CisJICAgICAgIH0KIAkgICAgICAgaWYoKFNpU19Qci0+U2lTX1VzZVJPTSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLSAgICAgICAgICAgICAgICAgIGlmKFJPTUFkZHJbMHgxM2NdICYgMHg0MCkgewotICAgICAgICAgICAgICAgICAgICAgaWYoIShEZWxheVRpbWUgJiAweDAxKSkgewotCSAgICAJICAgICAgICBEZWxheSA9IChVU0hPUlQpUk9NQWRkclsweDE3ZV07Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCSAgICAJICAgICAgICBEZWxheSA9IChVU0hPUlQpUk9NQWRkclsweDE3Zl07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisJCSAgaWYoUk9NQWRkclsweDEzY10gJiAweDQwKSB7CisJCSAgICAgaWYoIShEZWxheVRpbWUgJiAweDAxKSkgeworCQkJRGVsYXkgPSAodW5zaWduZWQgc2hvcnQpUk9NQWRkclsweDE3ZV07CisJCSAgICAgfSBlbHNlIHsKKwkJCURlbGF5ID0gKHVuc2lnbmVkIHNob3J0KVJPTUFkZHJbMHgxN2ZdOworCQkgICAgIH0KKwkJICB9CisJICAgICAgIH0KKwkgICAgfQogCSAgICBTaVNfU2hvcnREZWxheShTaVNfUHIsIERlbGF5KTsKIAkgfQogCiAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsJCQkvKiAzMTUgc2VyaWVzLCBhbGwgYnJpZGdlcyAqLwogCiAJIERlbGF5SW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgPj4gNDsKLSAgICAgICAgIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKLSAgICAgICAJICAgIERlbGF5ID0gU2lTX1ByLT5TaVNfUGFuZWxEZWxheVRibFtEZWxheUluZGV4XS50aW1lclswXTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMV07Ci0gICAgICAgICB9CisJIGlmKCEoRGVsYXlUaW1lICYgMHgwMSkpIHsKKwkgICAgRGVsYXkgPSBTaVNfUHItPlNpU19QYW5lbERlbGF5VGJsW0RlbGF5SW5kZXhdLnRpbWVyWzBdOworCSB9IGVsc2UgeworCSAgICBEZWxheSA9IFNpU19Qci0+U2lTX1BhbmVsRGVsYXlUYmxbRGVsYXlJbmRleF0udGltZXJbMV07CisJIH0KIAkgRGVsYXkgPDw9IDg7CiAJIFNpU19EREMyRGVsYXkoU2lTX1ByLCBEZWxheSk7CiAKQEAgLTU4NywxMiArNTg5LDExIEBACiAKICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotU2lTX1BhbmVsRGVsYXlMb29wKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIERlbGF5VGltZSwgVVNIT1JUIERlbGF5TG9vcCkKK1NpU19QYW5lbERlbGF5TG9vcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRGVsYXlUaW1lLCB1bnNpZ25lZCBzaG9ydCBEZWxheUxvb3ApCiB7CiAgICBpbnQgaTsKLSAgIGZvcihpPTA7IGk8RGVsYXlMb29wOyBpKyspIHsKLSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCBEZWxheVRpbWUpOworICAgZm9yKGkgPSAwOyBpIDwgRGVsYXlMb29wOyBpKyspIHsKKyAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgRGVsYXlUaW1lKTsKICAgIH0KIH0KICNlbmRpZgpAQCAtNjAyLDg2ICs2MDMsODYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLVNpU19XYWl0UmV0cmFjZTEoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19XYWl0UmV0cmFjZTEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB3YXRjaGRvZzsKKyAgIHVuc2lnbmVkIHNob3J0IHdhdGNoZG9nOwogCi0gIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDFmKSAmIDB4YzApIHJldHVybjsKLSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxNykgJiAweDgwKSkgcmV0dXJuOworICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MWYpICYgMHhjMCkgcmV0dXJuOworICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgxNykgJiAweDgwKSkgcmV0dXJuOwogCi0gIHdhdGNoZG9nID0gNjU1MzU7Ci0gIHdoaWxlKChTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKSAmIDB4MDgpICYmIC0td2F0Y2hkb2cpOwotICB3YXRjaGRvZyA9IDY1NTM1OwotICB3aGlsZSgoIShTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKSAmIDB4MDgpKSAmJiAtLXdhdGNoZG9nKTsKKyAgIHdhdGNoZG9nID0gNjU1MzU7CisgICB3aGlsZSgoU2lTX0dldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNkYSkgJiAweDA4KSAmJiAtLXdhdGNoZG9nKTsKKyAgIHdhdGNoZG9nID0gNjU1MzU7CisgICB3aGlsZSgoIShTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKSAmIDB4MDgpKSAmJiAtLXdhdGNoZG9nKTsKIH0KIAogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCiBzdGF0aWMgdm9pZAotU2lTX1dhaXRSZXRyYWNlMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgcmVnKQorU2lTX1dhaXRSZXRyYWNlMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnKQogewotICBVU0hPUlQgd2F0Y2hkb2c7CisgICB1bnNpZ25lZCBzaG9ydCB3YXRjaGRvZzsKIAotICB3YXRjaGRvZyA9IDY1NTM1OwotICB3aGlsZSgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQscmVnKSAmIDB4MDIpICYmIC0td2F0Y2hkb2cpOwotICB3YXRjaGRvZyA9IDY1NTM1OwotICB3aGlsZSgoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxyZWcpICYgMHgwMikpICYmIC0td2F0Y2hkb2cpOworICAgd2F0Y2hkb2cgPSA2NTUzNTsKKyAgIHdoaWxlKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxyZWcpICYgMHgwMikgJiYgLS13YXRjaGRvZyk7CisgICB3YXRjaGRvZyA9IDY1NTM1OworICAgd2hpbGUoKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQscmVnKSAmIDB4MDIpKSAmJiAtLXdhdGNoZG9nKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgdm9pZAotU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19XYWl0VkJSZXRyYWNlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICNpZmRlZiBTSVMzMDAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDIwKSkgcmV0dXJuOwotICAgICB9Ci0gICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDgwKSkgewotICAgICAgICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDI1KTsKLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CisJIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDIwKSkgcmV0dXJuOworICAgICAgfQorICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKSAmIDB4ODApKSB7CisJIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgICAgIH0gZWxzZSB7CisJIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDI1KTsKKyAgICAgIH0KICNlbmRpZgotICB9IGVsc2UgeworICAgfSBlbHNlIHsKICNpZmRlZiBTSVMzMTVICi0gICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDQwKSkgewotICAgICAgICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDMwKTsKLSAgICAgfQorICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKSAmIDB4NDApKSB7CisJIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgICAgIH0gZWxzZSB7CisJIFNpU19XYWl0UmV0cmFjZTIoU2lTX1ByLCAweDMwKTsKKyAgICAgIH0KICNlbmRpZgotICB9CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfVkJXYWl0KFNpU19Qcml2YXRlICpTaVNfUHIpCitTaVNfVkJXYWl0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgdGVtcGFsLHRlbXAsaSxqOworICAgdW5zaWduZWQgc2hvcnQgdGVtcGFsLHRlbXAsaSxqOwogCi0gIHRlbXAgPSAwOwotICBmb3IoaT0wOyBpPDM7IGkrKykgewotICAgIGZvcihqPTA7IGo8MTAwOyBqKyspIHsKLSAgICAgICB0ZW1wYWwgPSBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsKLSAgICAgICBpZih0ZW1wICYgMHgwMSkgewotICAgICAgICAgIGlmKCh0ZW1wYWwgJiAweDA4KSkgIGNvbnRpbnVlOwotICAgICAgICAgIGVsc2UgYnJlYWs7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZighKHRlbXBhbCAmIDB4MDgpKSBjb250aW51ZTsKLSAgICAgICAgICBlbHNlIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0gICAgdGVtcCBePSAweDAxOwotICB9CisgICB0ZW1wID0gMDsKKyAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykgeworICAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykgeworICAgICAgICB0ZW1wYWwgPSBTaVNfR2V0UmVnQnl0ZShTaVNfUHItPlNpU19QM2RhKTsKKyAgICAgICAgaWYodGVtcCAmIDB4MDEpIHsKKwkgICBpZigodGVtcGFsICYgMHgwOCkpICBjb250aW51ZTsKKwkgICBlbHNlIGJyZWFrOworICAgICAgICB9IGVsc2UgeworCSAgIGlmKCEodGVtcGFsICYgMHgwOCkpIGNvbnRpbnVlOworCSAgIGVsc2UgYnJlYWs7CisgICAgICAgIH0KKyAgICAgfQorICAgICB0ZW1wIF49IDB4MDE7CisgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfVkJMb25nV2FpdChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX1ZCTG9uZ1dhaXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIFNpU19WQldhaXQoU2lTX1ByKTsKLSAgfSBlbHNlIHsKLSAgICAgU2lTX1dhaXRSZXRyYWNlMShTaVNfUHIpOwotICB9CisgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworICAgICAgU2lTX1ZCV2FpdChTaVNfUHIpOworICAgfSBlbHNlIHsKKyAgICAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY5MCwyMzcgKzY5MSwyMjUgQEAKIAogI2lmZGVmIFNJUzMwMAogc3RhdGljIEJPT0xFQU4KLVNpU19JczMwMUIoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19JczMwMUIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDEpID49IDB4YjApIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAxKSA+PSAweGIwKSByZXR1cm4gVFJVRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiBzdGF0aWMgQk9PTEVBTgotU2lTX0NSVDJJc0xDRChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0NSVDJJc0xDRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGZsYWc7Ci0KLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpOwotICAgICBpZihmbGFnICYgMHgyMCkgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgaWYoZmxhZyAmIDB4MjApIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4MjApIHJldHVybiBUUlVFOworICAgfQorICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApICYgMHgyMCkgcmV0dXJuIFRSVUU7CisgICByZXR1cm4gRkFMU0U7CiB9CiAKIEJPT0xFQU4KLVNpU19Jc0R1YWxFZGdlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfSXNEdWFsRWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICNpZmRlZiBTSVMzMTVICi0gIFVTSE9SVCBmbGFnOwotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfNjUwKSB8fCAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWYpICYgMHhmMCkpIHsKLSAgICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgICAgaWYoZmxhZyAmIEVuYWJsZUR1YWxFZGdlKSByZXR1cm4gVFJVRTsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNjUwKSB8fCAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NWYpICYgMHhmMCkpIHsKKwkgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpICYgRW5hYmxlRHVhbEVkZ2UpIHJldHVybiBUUlVFOworICAgICAgfQorICAgfQogI2VuZGlmCi0gIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KIAogQk9PTEVBTgotU2lTX0lzVkFNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfSXNWQU1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAjaWZkZWYgU0lTMzE1SAotICBVU0hPUlQgZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGZsYWc7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgaWYoKGZsYWcgJiBFbmFibGVEdWFsRWRnZSkgJiYgKGZsYWcgJiBTZXRUb0xDREEpKSByZXR1cm4gVFJVRTsKLSAgfQorICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKKyAgICAgIGlmKChmbGFnICYgRW5hYmxlRHVhbEVkZ2UpICYmIChmbGFnICYgU2V0VG9MQ0RBKSkgcmV0dXJuIFRSVUU7CisgICB9CiAjZW5kaWYKLSAgcmV0dXJuIEZBTFNFOworICAgcmV0dXJuIEZBTFNFOwogfQogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc1ZBb3JMQ0QoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc1ZBb3JMQ0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgICByZXR1cm4gVFJVRTsKLSAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHJldHVybiBUUlVFOwotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfSXNWQU1vZGUoU2lTX1ByKSkgIHJldHVybiBUUlVFOworICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSByZXR1cm4gVFJVRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiBzdGF0aWMgQk9PTEVBTgotU2lTX0lzRHVhbExpbmsoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc0R1YWxMaW5rKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogI2lmZGVmIFNJUzMxNUgKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgaWYoKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSB8fAotICAgICAgICAoU2lTX0lzVkFNb2RlKFNpU19QciwgSHdJbmZvKSkpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRER1YWxMaW5rKSByZXR1cm4gVFJVRTsKLSAgICAgfQotICB9CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBpZigoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSB8fAorICAgICAgICAgKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgeworCSBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENERHVhbExpbmspIHJldHVybiBUUlVFOworICAgICAgfQorICAgfQogI2VuZGlmCi0gIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfVFZFbmFibGVkKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfVFZFbmFibGVkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBpZigoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMCkgJiAweDBmKSAhPSAweDBjKSByZXR1cm4gVFJVRTsKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDFMVjMwMkxWKSkgewotICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDRkKSAmIDB4MTApIHJldHVybiBUUlVFOwotICB9Ci0gIHJldHVybiBGQUxTRTsKKyAgIGlmKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwKSAmIDB4MGYpICE9IDB4MGMpIHJldHVybiBUUlVFOworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTWVBCUFIpIHsKKyAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4NGQpICYgMHgxMCkgcmV0dXJuIFRSVUU7CisgICB9CisgICByZXR1cm4gRkFMU0U7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfTENEQUVuYWJsZWQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19MQ0RBRW5hYmxlZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMykgJiAweDA0KSByZXR1cm4gVFJVRTsKLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMykgJiAweDA0KSByZXR1cm4gVFJVRTsKKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfNjYxKSkgewotICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg3OSkgJiAweDEwKSByZXR1cm4gVFJVRTsKLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSkgeworICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzkpICYgMHgxMCkgcmV0dXJuIFRSVUU7CisgICB9CisgICByZXR1cm4gRkFMU0U7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0lzTm90TTY1MG9yTGF0ZXIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjUwKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1Zik7Ci0gICAgIGZsYWcgJj0gMHhGMDsKLSAgICAgLyogQ2hlY2sgZm9yIHJldmlzaW9uICE9IEEwIG9ubHkgKi8KLSAgICAgaWYoKGZsYWcgPT0gMHhlMCkgfHwgKGZsYWcgPT0gMHhjMCkgfHwKLSAgICAgICAgKGZsYWcgPT0gMHhiMCkgfHwgKGZsYWcgPT0gMHg5MCkpIHJldHVybiBGQUxTRTsKLSAgfSBlbHNlIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHJldHVybiBGQUxTRTsKLSAgcmV0dXJuIFRSVUU7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU182NTApIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1ZikgJiAweGYwOworICAgICAgLyogQ2hlY2sgZm9yIHJldmlzaW9uICE9IEEwIG9ubHkgKi8KKyAgICAgIGlmKChmbGFnID09IDB4ZTApIHx8IChmbGFnID09IDB4YzApIHx8CisgICAgICAgICAoZmxhZyA9PSAweGIwKSB8fCAoZmxhZyA9PSAweDkwKSkgcmV0dXJuIEZBTFNFOworICAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgcmV0dXJuIEZBTFNFOworICAgcmV0dXJuIFRSVUU7CiB9CiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKIHN0YXRpYyBCT09MRUFOCi1TaVNfSXNZUGJQcihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0lzWVBiUHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOwotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIGlmKGZsYWcgJiBFbmFibGVDSFlQYlByKSByZXR1cm4gVFJVRTsgIC8qID0gWVByUGIgPSAweDA4ICovCi0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgLyogWVByUGIgPSAweDA4ICovCisgICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCkgJiBFbmFibGVDSFlQYlByKSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc0NoU2NhcnQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc0NoU2NhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOwotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIGlmKGZsYWcgJiBFbmFibGVDSFNjYXJ0KSByZXR1cm4gVFJVRTsgIC8qID0gU2NhcnQgPSAweDA0ICovCi0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgLyogU2NhcnQgPSAweDA0ICovCisgICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCkgJiBFbmFibGVDSFNjYXJ0KSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19Jc1RWT3JZUGJQck9yU2NhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotICAgICBpZihmbGFnICYgU2V0Q1JUMlRvVFYpICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLSAgICAgaWYoZmxhZyAmIEVuYWJsZUNIWVBiUHIpICAgICAgcmV0dXJuIFRSVUU7ICAvKiA9IFlQclBiID0gMHgwOCAqLwotICAgICBpZihmbGFnICYgRW5hYmxlQ0hTY2FydCkgICAgICByZXR1cm4gVFJVRTsgIC8qID0gU2NhcnQgPSAweDA0IC0gVFcgKi8KLSAgfSBlbHNlIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgICAgaWYoZmxhZyAmIFNldENSVDJUb1RWKSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKKyAgICAgIGlmKGZsYWcgJiBTZXRDUlQyVG9UVikgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKKyAgICAgIGlmKGZsYWcgJiBFbmFibGVDSFlQYlByKSAgICAgIHJldHVybiBUUlVFOyAgLyogPSBZUHJQYiA9IDB4MDggKi8KKyAgICAgIGlmKGZsYWcgJiBFbmFibGVDSFNjYXJ0KSAgICAgIHJldHVybiBUUlVFOyAgLyogPSBTY2FydCA9IDB4MDQgLSBUVyAqLworICAgfSBlbHNlIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CisgICAgICBpZihmbGFnICYgU2V0Q1JUMlRvVFYpICAgICAgICByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzE1SAogc3RhdGljIEJPT0xFQU4KLVNpU19Jc0xDRE9yTENEQShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0lzTENET3JMQ0RBKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGZsYWc7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgICAgaWYoZmxhZyAmIFNldENSVDJUb0xDRCkgcmV0dXJuIFRSVUU7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIGlmKGZsYWcgJiBTZXRUb0xDREEpICAgIHJldHVybiBUUlVFOwotICB9IGVsc2UgewotICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotICAgICBpZihmbGFnICYgU2V0Q1JUMlRvTENEKSByZXR1cm4gVFJVRTsKLSAgfQotICByZXR1cm4gRkFMU0U7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOworICAgICAgaWYoZmxhZyAmIFNldENSVDJUb0xDRCkgcmV0dXJuIFRSVUU7CisgICAgICBmbGFnID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpOworICAgICAgaWYoZmxhZyAmIFNldFRvTENEQSkgICAgcmV0dXJuIFRSVUU7CisgICB9IGVsc2UgeworICAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKKyAgICAgIGlmKGZsYWcgJiBTZXRDUlQyVG9MQ0QpIHJldHVybiBUUlVFOworICAgfQorICAgcmV0dXJuIEZBTFNFOwogfQogI2VuZGlmCiAKIHN0YXRpYyBCT09MRUFOCi1TaVNfQnJpZGdlSXNPbihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX0hhdmVCcmlkZ2Uoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7Ci0gICAgIHJldHVybiBUUlVFOwotICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgZmxhZyA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MDApOwotICAgICBpZigoZmxhZyA9PSAxKSB8fCAoZmxhZyA9PSAyKSkgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgcmV0dXJuIEZBTFNFOworICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAwKTsKKyAgICAgIGlmKChmbGFnID09IDEpIHx8IChmbGFnID09IDIpKSByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIEJPT0xFQU4KLVNpU19CcmlkZ2VJc0VuYWJsZWQoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19CcmlkZ2VJc0VuYWJsZWQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBmbGFnOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzsKIAotICBpZihTaVNfQnJpZGdlSXNPbihTaVNfUHIpKSB7Ci0gICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgIGZsYWcgJj0gMHhhMDsKLSAgICAgICBpZigoZmxhZyA9PSAweDgwKSB8fCAoZmxhZyA9PSAweDIwKSkgcmV0dXJuIFRSVUU7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgZmxhZyAmPSAweDUwOwotICAgICAgIGlmKChmbGFnID09IDB4NDApIHx8IChmbGFnID09IDB4MTApKSByZXR1cm4gVFJVRTsKLSAgICAgfQotICB9Ci0gIHJldHVybiBGQUxTRTsKKyAgIGlmKFNpU19IYXZlQnJpZGdlKFNpU19QcikpIHsKKyAgICAgIGZsYWcgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCWZsYWcgJj0gMHhhMDsKKwlpZigoZmxhZyA9PSAweDgwKSB8fCAoZmxhZyA9PSAweDIwKSkgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworCWZsYWcgJj0gMHg1MDsKKwlpZigoZmxhZyA9PSAweDQwKSB8fCAoZmxhZyA9PSAweDEwKSkgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICB9CisgICByZXR1cm4gRkFMU0U7CiB9CiAKIHN0YXRpYyBCT09MRUFOCi1TaVNfQnJpZGdlSW5TbGF2ZW1vZGUoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19CcmlkZ2VJblNsYXZlbW9kZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGZsYWcxOworICAgdW5zaWduZWQgc2hvcnQgZmxhZzE7CiAKLSAgZmxhZzEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMSk7Ci0gIGlmKGZsYWcxICYgKFNldEluU2xhdmVNb2RlID4+IDgpKSByZXR1cm4gVFJVRTsKLSAgcmV0dXJuIEZBTFNFOworICAgZmxhZzEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMSk7CisgICBpZihmbGFnMSAmIChTZXRJblNsYXZlTW9kZSA+PiA4KSkgcmV0dXJuIFRSVUU7CisgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MjgsMTE5ICs5MTcsOTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFNldHVwIGdlbmVyYWwgcHVycG9zZSBJTyBmb3IgQ2hyb250ZWwgY29tbXVuaWNhdGlvbiAqLworI2lmZGVmIFNJUzMwMAogdm9pZAotU2lTX1NldENocm9udGVsR1BJTyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgbXl2YmluZm8pCitTaVNfU2V0Q2hyb250ZWxHUElPKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBteXZiaW5mbykKIHsKLSAgIHVuc2lnbmVkIGxvbmcgIGFjcGliYXNlOworICAgdW5zaWduZWQgaW50ICAgYWNwaWJhc2U7CiAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgICBpZighKFNpU19Qci0+U2lTX0NoU1cpKSByZXR1cm47CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgIFNpU19TZXRSZWdMb25nKDB4Y2Y4LDB4ODAwMDA4NzQpOwkJICAgICAgIC8qIGdldCBBQ1BJIGJhc2UgKi8KLSAgIGFjcGliYXNlID0gU2lTX0dldFJlZ0xvbmcoMHhjZmMpOworI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKKyAgIGFjcGliYXNlID0gc2lzZmJfcmVhZF9scGNfcGNpX2R3b3JkKFNpU19QciwgMHg3NCk7CiAjZWxzZQogICAgYWNwaWJhc2UgPSBwY2lSZWFkTG9uZygweDAwMDAwODAwLCAweDc0KTsKICNlbmRpZgogICAgYWNwaWJhc2UgJj0gMHhGRkZGOwotICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoVVNIT1JUKShhY3BpYmFzZSArIDB4M2MpKTsgIC8qIEFDUEkgcmVnaXN0ZXIgMHgzYzogR1AgRXZlbnQgMSBJL08gbW9kZSBzZWxlY3QgKi8KKyAgIGlmKCFhY3BpYmFzZSkgcmV0dXJuOworICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoYWNwaWJhc2UgKyAweDNjKSk7CS8qIEFDUEkgcmVnaXN0ZXIgMHgzYzogR1AgRXZlbnQgMSBJL08gbW9kZSBzZWxlY3QgKi8KICAgIHRlbXAgJj0gMHhGRUZGOwotICAgU2lTX1NldFJlZ1Nob3J0KChVU0hPUlQpKGFjcGliYXNlICsgMHgzYyksIHRlbXApOwotICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoVVNIT1JUKShhY3BpYmFzZSArIDB4M2MpKTsKLSAgIHRlbXAgPSBTaVNfR2V0UmVnU2hvcnQoKFVTSE9SVCkoYWNwaWJhc2UgKyAweDNhKSk7ICAvKiBBQ1BJIHJlZ2lzdGVyIDB4M2E6IEdQIFBpbiBMZXZlbCAobG93L2hpZ2gpICovCisgICBTaVNfU2V0UmVnU2hvcnQoKGFjcGliYXNlICsgMHgzYyksIHRlbXApOworICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoYWNwaWJhc2UgKyAweDNjKSk7CisgICB0ZW1wID0gU2lTX0dldFJlZ1Nob3J0KChhY3BpYmFzZSArIDB4M2EpKTsJLyogQUNQSSByZWdpc3RlciAweDNhOiBHUCBQaW4gTGV2ZWwgKGxvdy9oaWdoKSAqLwogICAgdGVtcCAmPSAweEZFRkY7CiAgICBpZighKG15dmJpbmZvICYgU2V0Q1JUMlRvVFYpKSB0ZW1wIHw9IDB4MDEwMDsKLSAgIFNpU19TZXRSZWdTaG9ydCgoVVNIT1JUKShhY3BpYmFzZSArIDB4M2EpLCB0ZW1wKTsKLSAgIHRlbXAgPSBTaVNfR2V0UmVnU2hvcnQoKFVTSE9SVCkoYWNwaWJhc2UgKyAweDNhKSk7CisgICBTaVNfU2V0UmVnU2hvcnQoKGFjcGliYXNlICsgMHgzYSksIHRlbXApOworICAgdGVtcCA9IFNpU19HZXRSZWdTaG9ydCgoYWNwaWJhc2UgKyAweDNhKSk7CiB9CisjZW5kaWYKIAogdm9pZAotU2lTX0dldFZCSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8sIGludCBjaGVja2NydDJtb2RlKQorU2lTX0dldFZCSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgaW50IGNoZWNrY3J0Mm1vZGUpCiB7Ci0gIFVTSE9SVCB0ZW1wYXgsdGVtcGJ4LHRlbXA7Ci0gIFVTSE9SVCBtb2RlZmxhZywgcmVzaW5mbz0wOworICAgdW5zaWduZWQgc2hvcnQgdGVtcGF4LCB0ZW1wYngsIHRlbXA7CisgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZywgcmVzaW5mbyA9IDA7CiAKLSAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICB9IGVsc2UgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5DTW9kZUZsYWc7Ci0gIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwotICB9CisgICBTaVNfUHItPlNpU19TZXRGbGFnID0gMDsKIAotICBTaVNfUHItPlNpU19TZXRGbGFnID0gMDsKKyAgIG1vZGVmbGFnID0gU2lTX0dldE1vZGVGbGFnKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAKLSAgU2lTX1ByLT5TaVNfTW9kZVR5cGUgPSBtb2RlZmxhZyAmIE1vZGVUeXBlTWFzazsKKyAgIFNpU19Qci0+U2lTX01vZGVUeXBlID0gbW9kZWZsYWcgJiBNb2RlVHlwZU1hc2s7CiAKLSAgdGVtcGJ4ID0gMDsKLSAgaWYoU2lTX0JyaWRnZUlzT24oU2lTX1ByKSkgewotICAgIAl0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotI2lmIDAKLSAgIAlpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKLQkgICAvKiBOTyAtIFlQYlByIG5vdCBzZXQgeWV0ICEgKi8KLQkgICBpZihTaVNfUHItPlNpU19ZUGJQciAmIDxhbGwgeXBicHIgZXhjZXB0IDUyNWk+KSB7Ci0JICAgICAgdGVtcCAmPSAoU2V0Q1JUMlRvSGlWaXNpb24gfCBTd2l0Y2hDUlQyIHwgU2V0U2ltdVNjYW5Nb2RlKTsgCS8qIDB4ODMgKi8KLQkgICAgICB0ZW1wIHw9IFNldENSVDJUb0hpVmlzaW9uOyAgIAkJCQkJLyogMHg4MCAqLwotICAgCSAgIH0KLQkgICBpZihTaVNfUHItPlNpU19ZUGJQciAmIDx5cGJwcjUyNWk+KSB7Ci0JICAgICAgdGVtcCAmPSAoU2V0Q1JUMlRvSGlWaXNpb24gfCBTd2l0Y2hDUlQyIHwgU2V0U2ltdVNjYW5Nb2RlKTsgCS8qIDB4ODMgKi8KLQkgICAgICB0ZW1wIHw9IFNldENSVDJUb1NWSURFTzsgIAkJCQkJLyogMHgwOCAqLwotCSAgIH0KLQl9Ci0jZW5kaWYKLSAgICAJdGVtcGJ4IHw9IHRlbXA7Ci0gICAgCXRlbXBheCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSA8PCA4OwotICAgICAgICB0ZW1wYXggJj0gKERyaXZlck1vZGUgfCBMb2FkREFDRmxhZyB8IFNldE5vdFNpbXVNb2RlIHwgU2V0UEFMVFYpOwotICAgIAl0ZW1wYnggfD0gdGVtcGF4OworICAgaWYoKE1vZGVObyA+IDB4MTMpICYmICghU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSkgeworICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk87CisgICB9CisKKyAgIHRlbXBieCA9IDA7CisKKyAgIGlmKFNpU19IYXZlQnJpZGdlKFNpU19QcikpIHsKKworCXRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CisJdGVtcGJ4IHw9IHRlbXA7CisJdGVtcGF4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpIDw8IDg7CisJdGVtcGF4ICY9IChEcml2ZXJNb2RlIHwgTG9hZERBQ0ZsYWcgfCBTZXROb3RTaW11TW9kZSB8IFNldFBBTFRWKTsKKwl0ZW1wYnggfD0gdGVtcGF4OwogCiAjaWZkZWYgU0lTMzE1SAotCWlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xDREEpIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTENEQSkgewogCSAgICAgIGlmKE1vZGVObyA9PSAweDAzKSB7Ci0JICAgICAgICAgLyogTW9kZSAweDAzIGlzIG5ldmVyIGluIGRyaXZlciBtb2RlICovCisJCSAvKiBNb2RlIDB4MDMgaXMgbmV2ZXIgaW4gZHJpdmVyIG1vZGUgKi8KIAkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDMxLDB4YmYpOwogCSAgICAgIH0KIAkgICAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSAmIChEcml2ZXJNb2RlID4+IDgpKSkgewotCSAgICAgICAgIC8qIFJlc2V0IExDREEgc2V0dGluZyBpZiBub3QgZHJpdmVyIG1vZGUgKi8KKwkJIC8qIFJlc2V0IExDREEgc2V0dGluZyBpZiBub3QgZHJpdmVyIG1vZGUgKi8KIAkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM4LDB4ZmMpOwogCSAgICAgIH0KIAkgICAgICBpZihJU19TSVM2NTApIHsKLQkgICAgICAgICBpZihTaVNfUHItPlNpU19Vc2VMQ0RBKSB7CisJCSBpZihTaVNfUHItPlNpU19Vc2VMQ0RBKSB7CiAJCSAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHg1ZikgJiAweEYwKSB7CiAJCSAgICAgICBpZigoTW9kZU5vIDw9IDB4MTMpIHx8ICghKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMxKSAmIChEcml2ZXJNb2RlID4+IDgpKSkpIHsKLQkJICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzgsKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSk7CisJCQkgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzgsKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSk7CiAJCSAgICAgICB9CiAJCSAgICB9CiAJCSB9CiAJICAgICAgfQogCSAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgICAgCSAgICAgIGlmKCh0ZW1wICYgKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSkgPT0gKEVuYWJsZUR1YWxFZGdlIHwgU2V0VG9MQ0RBKSkgewotICAgICAgICAgIAkgdGVtcGJ4IHw9IFNldENSVDJUb0xDREE7CisJICAgICAgaWYoKHRlbXAgJiAoRW5hYmxlRHVhbEVkZ2UgfCBTZXRUb0xDREEpKSA9PSAoRW5hYmxlRHVhbEVkZ2UgfCBTZXRUb0xDREEpKSB7CisJCSB0ZW1wYnggfD0gU2V0Q1JUMlRvTENEQTsKIAkgICAgICB9CiAJICAgfQogCi0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikpIHsKLQkgICAgICB0ZW1wYnggJj0gfihTZXRDUlQyVG9SQU1EQUMpOwotCSAgIH0KLQotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsgLyogTmV3IENSIGxheW91dCAqLwogCSAgICAgIHRlbXBieCAmPSB+KFNldENSVDJUb1lQYlByNTI1NzUwIHwgU2V0Q1JUMlRvSGlWaXNpb24pOwotCSAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTWVBCUFIpIHsKLQkgICAgICAgICBpZih0ZW1wICYgMHgwNCkgewotCQkgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KSAmIDB4ZTA7Ci0JCSAgICBpZih0ZW1wID09IDB4NjApIHRlbXBieCB8PSBTZXRDUlQyVG9IaVZpc2lvbjsKLQkJICAgIGVsc2UgICAgICAgICAgICAgdGVtcGJ4IHw9IFNldENSVDJUb1lQYlByNTI1NzUwOwotCQkgfQotCSAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNISVZJU0lPTikgewotCSAgICAgICAgIGlmKHRlbXAgJiAweDA0KSB7Ci0JCSAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpICYgMHhlMDsKLQkJICAgIGlmKHRlbXAgPT0gMHg2MCkgdGVtcGJ4IHw9IFNldENSVDJUb0hpVmlzaW9uOworCSAgICAgIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KSAmIDB4MDQpIHsKKwkJIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSkgJiAweGUwOworCQkgaWYodGVtcCA9PSAweDYwKSB0ZW1wYnggfD0gU2V0Q1JUMlRvSGlWaXNpb247CisJCSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1lQQlBSKSB7CisJCSAgICB0ZW1wYnggfD0gU2V0Q1JUMlRvWVBiUHI1MjU3NTA7CiAJCSB9CiAJICAgICAgfQotICAJICAgfQorCSAgIH0KIAogCSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKIAkgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzgpOwpAQCAtMTA0OCw3ICsxMDE1LDcgQEAKIAkJIHRlbXBieCB8PSBTZXRDUlQyVG9MQ0RBOwogCSAgICAgIH0KIAkgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLQkgICAgICAgICBpZih0ZW1wICYgRW5hYmxlQ0hZUGJQcikgeworCQkgaWYodGVtcCAmIEVuYWJsZUNIWVBiUHIpIHsKIAkJICAgIHRlbXBieCB8PSBTZXRDUlQyVG9DSFlQYlByOwogCQkgfQogCSAgICAgIH0KQEAgLTEwNTcsNDQgKzEwMjQsNDkgQEAKIAogI2VuZGlmICAvKiBTSVMzMTVIICovCiAKLSAgICAJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWR0EyKSkgeworCSAgIHRlbXBieCAmPSB+KFNldENSVDJUb1JBTURBQyk7CisJfQorCisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAkgICB0ZW1wID0gU2V0Q1JUMlRvU1ZJREVPICAgfAotCSAgICAgICAgICBTZXRDUlQyVG9BVklERU8gICB8Ci0JICAgICAgICAgIFNldENSVDJUb1NDQVJUICAgIHwKLQkgICAgICAgICAgU2V0Q1JUMlRvTENEQSAgICAgfAotCSAgICAgICAgICBTZXRDUlQyVG9MQ0QgICAgICB8Ci0JICAgICAgICAgIFNldENSVDJUb1JBTURBQyAgIHwKLSAgICAgICAgICAgICAgICAgIFNldENSVDJUb0hpVmlzaW9uIHwKKwkJICBTZXRDUlQyVG9BVklERU8gICB8CisJCSAgU2V0Q1JUMlRvU0NBUlQgICAgfAorCQkgIFNldENSVDJUb0xDREEgICAgIHwKKwkJICBTZXRDUlQyVG9MQ0QgICAgICB8CisJCSAgU2V0Q1JUMlRvUkFNREFDICAgfAorCQkgIFNldENSVDJUb0hpVmlzaW9uIHwKIAkJICBTZXRDUlQyVG9ZUGJQcjUyNTc1MDsKLSAgICAJfSBlbHNlIHsKLSAgICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgICAgIAkgdGVtcCA9IFNldENSVDJUb0FWSURFTyB8CisJfSBlbHNlIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJCSB0ZW1wID0gU2V0Q1JUMlRvQVZJREVPIHwKIAkJICAgICAgICBTZXRDUlQyVG9TVklERU8gfAogCQkgICAgICAgIFNldENSVDJUb1NDQVJUICB8CiAJCSAgICAgICAgU2V0Q1JUMlRvTENEQSAgIHwKIAkJICAgICAgICBTZXRDUlQyVG9MQ0QgICAgfAogCQkgICAgICAgIFNldENSVDJUb0NIWVBiUHI7Ci0gICAgICAJICAgICAgfSBlbHNlIHsKLSAgICAgICAgCSB0ZW1wID0gU2V0Q1JUMlRvTENEQSAgIHwKKwkgICAgICB9IGVsc2UgeworCQkgdGVtcCA9IFNldENSVDJUb0xDREEgICB8CiAJCSAgICAgICAgU2V0Q1JUMlRvTENEOwogCSAgICAgIH0KIAkgICB9IGVsc2UgewotICAgICAgCSAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgIAkgdGVtcCA9IFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvTENEOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAJIHRlbXAgPSBTZXRDUlQyVG9MQ0Q7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJCSB0ZW1wID0gU2V0Q1JUMlRvVFYgfCBTZXRDUlQyVG9MQ0Q7CisJICAgICAgfSBlbHNlIHsKKwkJIHRlbXAgPSBTZXRDUlQyVG9MQ0Q7CiAJICAgICAgfQogCSAgIH0KLSAgICAJfQorCX0KIAotICAgIAlpZighKHRlbXBieCAmIHRlbXApKSB7Ci0gICAgICAJICAgdGVtcGF4ID0gRGlzYWJsZUNSVDJEaXNwbGF5OwotICAgICAgCSAgIHRlbXBieCA9IDA7Ci0gICAgCX0KKwlpZighKHRlbXBieCAmIHRlbXApKSB7CisJICAgdGVtcGF4ID0gRGlzYWJsZUNSVDJEaXNwbGF5OworCSAgIHRlbXBieCA9IDA7CisJfQogCi0gICAJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICBVU0hPUlQgY2xlYXJtYXNrID0gKCBEcml2ZXJNb2RlIAkgICB8CisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKworCSAgIHVuc2lnbmVkIHNob3J0IGNsZWFybWFzayA9ICggRHJpdmVyTW9kZSB8CiAJCQkJRGlzYWJsZUNSVDJEaXNwbGF5IHwKIAkJCQlMb2FkREFDRmxhZyAJICAgfAogCQkJCVNldE5vdFNpbXVNb2RlIAkgICB8CkBAIC0xMTAyLDEwNiArMTA3NCwxMDQgQEAKIAkJCQlTZXRQQUxUViAJICAgfAogCQkJCVN3aXRjaENSVDIJICAgfAogCQkJCVNldFNpbXVTY2FuTW9kZSApOwotICAgICAgCSAgIGlmKHRlbXBieCAmIFNldENSVDJUb0xDREEpICAgICAgICB0ZW1wYnggJj0gKGNsZWFybWFzayB8IFNldENSVDJUb0xDREEpOworCisJICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvTENEQSkgICAgICAgIHRlbXBieCAmPSAoY2xlYXJtYXNrIHwgU2V0Q1JUMlRvTENEQSk7CiAJICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvUkFNREFDKSAgICAgIHRlbXBieCAmPSAoY2xlYXJtYXNrIHwgU2V0Q1JUMlRvUkFNREFDKTsKIAkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9MQ0QpICAgICAgICAgdGVtcGJ4ICY9IChjbGVhcm1hc2sgfCBTZXRDUlQyVG9MQ0QpOwogCSAgIGlmKHRlbXBieCAmIFNldENSVDJUb1NDQVJUKSAgICAgICB0ZW1wYnggJj0gKGNsZWFybWFzayB8IFNldENSVDJUb1NDQVJUKTsKIAkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9IaVZpc2lvbikgICAgdGVtcGJ4ICY9IChjbGVhcm1hc2sgfCBTZXRDUlQyVG9IaVZpc2lvbik7CiAJICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHRlbXBieCAmPSAoY2xlYXJtYXNrIHwgU2V0Q1JUMlRvWVBiUHI1MjU3NTApOwotICAgCX0gZWxzZSB7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKworCX0gZWxzZSB7CisKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAJICAgICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvTENEQSkgewotCSAgICAgICAgIHRlbXBieCAmPSAoMHhGRjAwfFN3aXRjaENSVDJ8U2V0U2ltdVNjYW5Nb2RlKTsKKwkJIHRlbXBieCAmPSAoMHhGRjAwfFN3aXRjaENSVDJ8U2V0U2ltdVNjYW5Nb2RlKTsKIAkgICAgICB9CiAJICAgfQotICAgICAgCSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgICAgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9UVikgewotICAgICAgICAgIAkgdGVtcGJ4ICY9ICgweEZGMDB8U2V0Q1JUMlRvVFZ8U3dpdGNoQ1JUMnxTZXRTaW11U2Nhbk1vZGUpOworCSAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgeworCSAgICAgIGlmKHRlbXBieCAmIFNldENSVDJUb1RWKSB7CisJCSB0ZW1wYnggJj0gKDB4RkYwMHxTZXRDUlQyVG9UVnxTd2l0Y2hDUlQyfFNldFNpbXVTY2FuTW9kZSk7CiAJICAgICAgfQotICAgICAgCSAgIH0KLSAgICAgIAkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9MQ0QpIHsKLSAgICAgICAgICAgICAgdGVtcGJ4ICY9ICgweEZGMDB8U2V0Q1JUMlRvTENEfFN3aXRjaENSVDJ8U2V0U2ltdVNjYW5Nb2RlKTsKIAkgICB9Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICBpZih0ZW1wYnggJiBTZXRDUlQyVG9MQ0QpIHsKKwkgICAgICB0ZW1wYnggJj0gKDB4RkYwMHxTZXRDUlQyVG9MQ0R8U3dpdGNoQ1JUMnxTZXRTaW11U2Nhbk1vZGUpOworCSAgIH0KKwkgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAJICAgICAgaWYodGVtcGJ4ICYgU2V0Q1JUMlRvTENEQSkgewogCSAgICAgICAgIHRlbXBieCB8PSBTZXRDUlQyVG9MQ0Q7CiAJICAgICAgfQogCSAgIH0KKwogCX0KIAotICAgIAlpZih0ZW1wYXggJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHsKLSAgICAgIAkgICBpZighKHRlbXBieCAmIChTd2l0Y2hDUlQyIHwgU2V0U2ltdVNjYW5Nb2RlKSkpIHsKLSAgICAgICAgICAgICAgdGVtcGJ4ID0gU2V0U2ltdVNjYW5Nb2RlIHwgRGlzYWJsZUNSVDJEaXNwbGF5OwotICAgICAgCSAgIH0KLSAgICAJfQorCWlmKHRlbXBheCAmIERpc2FibGVDUlQyRGlzcGxheSkgeworCSAgIGlmKCEodGVtcGJ4ICYgKFN3aXRjaENSVDIgfCBTZXRTaW11U2Nhbk1vZGUpKSkgeworCSAgICAgIHRlbXBieCA9IFNldFNpbXVTY2FuTW9kZSB8IERpc2FibGVDUlQyRGlzcGxheTsKKwkgICB9CisJfQogCi0gICAgCWlmKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkpIHRlbXBieCB8PSBTZXRTaW11U2Nhbk1vZGU7CisJaWYoISh0ZW1wYnggJiBEcml2ZXJNb2RlKSkgdGVtcGJ4IHw9IFNldFNpbXVTY2FuTW9kZTsKIAogCS8qIExWRFMvQ0hST05URUwgKExDRC9UVikgYW5kIDMwMUJESCAoTENEKSBjYW4gb25seSBiZSBzbGF2ZSBpbiA4YnBwIG1vZGVzICovCiAJaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPD0gTW9kZVZHQSkgewogCSAgIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgfHwKIAkgICAgICAgKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgJiYgKHRlbXBieCAmIFNldENSVDJUb0xDRCkpICkgewotCSAgICAgICBtb2RlZmxhZyAmPSAofkNSVDJNb2RlKTsKKwkgICAgICBtb2RlZmxhZyAmPSAofkNSVDJNb2RlKTsKIAkgICB9CiAJfQogCi0gICAgCWlmKCEodGVtcGJ4ICYgU2V0U2ltdVNjYW5Nb2RlKSkgewotICAgICAgCSAgIGlmKHRlbXBieCAmIFN3aXRjaENSVDIpIHsKLSAgICAgICAgICAgICAgaWYoKCEobW9kZWZsYWcgJiBDUlQyTW9kZSkpICYmIChjaGVja2NydDJtb2RlKSkgewotCQkgaWYoIChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYKLQkJICAgICAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSApIHsKLQkJICAgIGlmKHJlc2luZm8gIT0gU0lTX1JJXzE2MDB4MTIwMCkgewotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wYnggfD0gU2V0U2ltdVNjYW5Nb2RlOwotCQkgICAgfQotCQkgfSBlbHNlIHsKLSAgICAgICAgICAgIAkgICAgdGVtcGJ4IHw9IFNldFNpbXVTY2FuTW9kZTsKLQkgICAgICAgICB9CisJaWYoISh0ZW1wYnggJiBTZXRTaW11U2Nhbk1vZGUpKSB7CisJICAgaWYodGVtcGJ4ICYgU3dpdGNoQ1JUMikgeworCSAgICAgIGlmKCghKG1vZGVmbGFnICYgQ1JUMk1vZGUpKSAmJiAoY2hlY2tjcnQybW9kZSkpIHsKKwkJIGlmKHJlc2luZm8gIT0gU0lTX1JJXzE2MDB4MTIwMCkgeworCQkgICAgdGVtcGJ4IHw9IFNldFNpbXVTY2FuTW9kZTsKKwkJIH0KICAgICAgICAgICAgICAgfQotICAgICAgCSAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlmKFNpU19CcmlkZ2VJc0VuYWJsZWQoU2lTX1ByLEh3SW5mbykpIHsKLSAgICAgICAgICAJIGlmKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkpIHsKLSAgICAgICAgICAgIAkgICAgaWYoU2lTX0JyaWRnZUluU2xhdmVtb2RlKFNpU19QcikpIHsKKwkgICB9IGVsc2UgeworCSAgICAgIGlmKFNpU19CcmlkZ2VJc0VuYWJsZWQoU2lTX1ByKSkgeworCQkgaWYoISh0ZW1wYnggJiBEcml2ZXJNb2RlKSkgeworCQkgICAgaWYoU2lTX0JyaWRnZUluU2xhdmVtb2RlKFNpU19QcikpIHsKIAkJICAgICAgIHRlbXBieCB8PSBTZXRTaW11U2Nhbk1vZGU7Ci0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAJICAgfQotICAgIAl9CisJCSAgICB9CisJCSB9CisJICAgICAgfQorCSAgIH0KKwl9CiAKLSAgICAJaWYoISh0ZW1wYnggJiBEaXNhYmxlQ1JUMkRpc3BsYXkpKSB7Ci0gICAgICAgICAgIGlmKHRlbXBieCAmIERyaXZlck1vZGUpIHsKLSAgICAgICAgICAgICAgaWYodGVtcGJ4ICYgU2V0U2ltdVNjYW5Nb2RlKSB7Ci0gICAgICAgICAgCSBpZigoIShtb2RlZmxhZyAmIENSVDJNb2RlKSkgJiYgKGNoZWNrY3J0Mm1vZGUpKSB7Ci0JICAgICAgICAgICAgaWYoIChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYKLQkJICAgICAgICAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSApIHsKLQkJICAgICAgIGlmKHJlc2luZm8gIT0gU0lTX1JJXzE2MDB4MTIwMCkgewotCQkgICAgICAgICAgdGVtcGJ4IHw9IFNldEluU2xhdmVNb2RlOwotCQkgICAgICAgfQotCQkgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIAkgICAgICAgdGVtcGJ4IHw9IFNldEluU2xhdmVNb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRlbXBieCB8PSBTZXRJblNsYXZlTW9kZTsKLSAgICAgIAkgICB9Ci0gICAgCX0KKwlpZighKHRlbXBieCAmIERpc2FibGVDUlQyRGlzcGxheSkpIHsKKwkgICBpZih0ZW1wYnggJiBEcml2ZXJNb2RlKSB7CisJICAgICAgaWYodGVtcGJ4ICYgU2V0U2ltdVNjYW5Nb2RlKSB7CisJCSBpZigoIShtb2RlZmxhZyAmIENSVDJNb2RlKSkgJiYgKGNoZWNrY3J0Mm1vZGUpKSB7CisJCSAgICBpZihyZXNpbmZvICE9IFNJU19SSV8xNjAweDEyMDApIHsKKwkJICAgICAgIHRlbXBieCB8PSBTZXRJblNsYXZlTW9kZTsKKwkJICAgIH0KKwkJIH0KKwkgICAgICB9CisJICAgfSBlbHNlIHsKKwkgICAgICB0ZW1wYnggfD0gU2V0SW5TbGF2ZU1vZGU7CisJICAgfQorCX0KIAotICB9CisgICB9CiAKLSAgU2lTX1ByLT5TaVNfVkJJbmZvID0gdGVtcGJ4OworICAgU2lTX1ByLT5TaVNfVkJJbmZvID0gdGVtcGJ4OwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHsKLSAgICAgU2lTX1NldENocm9udGVsR1BJTyhTaVNfUHIsIFNpU19Qci0+U2lTX1ZCSW5mbyk7Ci0gIH0KKyNpZmRlZiBTSVMzMDAKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgeworICAgICAgU2lTX1NldENocm9udGVsR1BJTyhTaVNfUHIsIFNpU19Qci0+U2lTX1ZCSW5mbyk7CisgICB9CisjZW5kaWYKIAotI2lmZGVmIFRXREVCVUcKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiAoVkJJbmZvPSAweCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisjaWYgMAorICAgcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiAoaW5pdDMwMTogVkJJbmZvPSAweCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbywgU2lTX1ByLT5TaVNfU2V0RmxhZyk7CiAjZW5kaWYKLSNpZmRlZiBMSU5VWF9YRjg2Ci0gIHhmODZEcnZNc2dWZXJiKDAsIFhfUFJPQkVELCAzLCAiKGluaXQzMDE6IFZCSW5mbz0weCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKKyNlbmRpZgorI2lmZGVmIFNJU19YT1JHX1hGODYKKyNpZmRlZiBUV0RFQlVHCisgICB4Zjg2RHJ2TXNnKDAsIFhfUFJPQkVELCAiKGluaXQzMDE6IFZCSW5mbz0weCUwNHgsIFNldEZsYWc9MHglMDR4KVxuIiwKICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbywgU2lTX1ByLT5TaVNfU2V0RmxhZyk7CiAjZW5kaWYKICNlbmRpZgpAQCAtMTIxMiw0MSArMTE4Miw0MSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1NldFlQYlByKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0WVBiUHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAKLSAgVUNIQVIgdGVtcDsKKyAgIHVuc2lnbmVkIGNoYXIgdGVtcDsKIAotICAvKiBOb3RlOiBUaGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBvbiAzMHhMViBzeXN0ZW1zLgotICAgKiBDUjM4IGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIG9uIExWRFMvQ0g3MDE5IHN5c3RlbXMuCi0gICAqIE9uIDY2MSBhbmQgbGF0ZXIsIHRoZXNlIGJpdHMgbW92ZWQgdG8gQ1IzNS4KLSAgICoKLSAgICogT24gMzAxLCAzMDFCLCBvbmx5IEhpVmlzaW9uIDEwODBpIGlzIHN1cHBvcnRlZC4KLSAgICogT24gMzB4TFYsIDMwMUMsIG9ubHkgWVBiUHIgMTA4MGkgaXMgc3VwcG9ydGVkLgotICAgKi8KKyAgIC8qIE5vdGU6IFRoaXMgdmFyaWFibGUgaXMgb25seSB1c2VkIG9uIDMweExWIHN5c3RlbXMuCisgICAgKiBDUjM4IGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIG9uIExWRFMvQ0g3MDE5IHN5c3RlbXMuCisgICAgKiBPbiA2NjEgYW5kIGxhdGVyLCB0aGVzZSBiaXRzIG1vdmVkIHRvIENSMzUuCisgICAgKgorICAgICogT24gMzAxLCAzMDFCLCBvbmx5IEhpVmlzaW9uIDEwODBpIGlzIHN1cHBvcnRlZC4KKyAgICAqIE9uIDMweExWLCAzMDFDLCBvbmx5IFlQYlByIDEwODBpIGlzIHN1cHBvcnRlZC4KKyAgICAqLwogCi0gIFNpU19Qci0+U2lTX1lQYlByID0gMDsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgcmV0dXJuOworICAgU2lTX1ByLT5TaVNfWVBiUHIgPSAwOworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSByZXR1cm47CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0JU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQckhpVmlzaW9uOwotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSkgeworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQckhpVmlzaW9uOworICAgICAgfQorICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFMVjMwMkxWIHwgVkJfU0lTMzAxQykpIHsKLSAgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKLQlpZih0ZW1wICYgMHgwOCkgewotCSAgIHN3aXRjaCgodGVtcCA+PiA0KSkgewotCSAgIGNhc2UgMHgwMDogU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQcjUyNWk7ICAgICBicmVhazsKLQkgICBjYXNlIDB4MDE6IFNpU19Qci0+U2lTX1lQYlByID0gWVBiUHI1MjVwOyAgICAgYnJlYWs7Ci0JICAgY2FzZSAweDAyOiBTaVNfUHItPlNpU19ZUGJQciA9IFlQYlByNzUwcDsgICAgIGJyZWFrOwotCSAgIGNhc2UgMHgwMzogU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQckhpVmlzaW9uOyBicmVhazsKLQkgICB9Ci0JfQotICAgICB9Ci0gIH0KKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1lQQlBSKSB7CisJIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7CisJIGlmKHRlbXAgJiAweDA4KSB7CisJICAgIHN3aXRjaCgodGVtcCA+PiA0KSkgeworCSAgICBjYXNlIDB4MDA6IFNpU19Qci0+U2lTX1lQYlByID0gWVBiUHI1MjVpOyAgICAgYnJlYWs7CisJICAgIGNhc2UgMHgwMTogU2lTX1ByLT5TaVNfWVBiUHIgPSBZUGJQcjUyNXA7ICAgICBicmVhazsKKwkgICAgY2FzZSAweDAyOiBTaVNfUHItPlNpU19ZUGJQciA9IFlQYlByNzUwcDsgICAgIGJyZWFrOworCSAgICBjYXNlIDB4MDM6IFNpU19Qci0+U2lTX1lQYlByID0gWVBiUHJIaVZpc2lvbjsgYnJlYWs7CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQogCiB9CiAKQEAgLTEyNTUsMTk5ICsxMjI1LDIwNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1NldFRWTW9kZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0VFZNb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCB0ZW1wLCB0ZW1wMSwgcmVzaW5mbyA9IDAsIHJvbWluZGV4ID0gMDsKLSAgVUNIQVIgIE91dHB1dFNlbGVjdCA9ICpTaVNfUHItPnBTaVNfT3V0cHV0U2VsZWN0OworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgdGVtcDEsIHJlc2luZm8gPSAwLCByb21pbmRleCA9IDA7CisgICB1bnNpZ25lZCBjaGFyICBPdXRwdXRTZWxlY3QgPSAqU2lTX1ByLT5wU2lTX091dHB1dFNlbGVjdDsKIAotICBTaVNfUHItPlNpU19UVk1vZGUgPSAwOworICAgU2lTX1ByLT5TaVNfVFZNb2RlID0gMDsKIAotICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgcmV0dXJuOwotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHJldHVybjsKKyAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpKSByZXR1cm47CisgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHJldHVybjsKIAotICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwotICB9CisgICBpZihNb2RlTm8gPiAweDEzKSB7CisgICAgICByZXNpbmZvID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfUkVTSU5GTzsKKyAgIH0KIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKKyAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSB7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0UEFMVFYpIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldFBBTFRWKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLSAgICAgICAgdGVtcCA9IDA7Ci0gICAgICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAotICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKLSAgICAgICAgICAgdGVtcCA9IDB4MzU7Ci0JICAgcm9taW5kZXggPSAweGZlOwotICAgICAgICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgdGVtcCA9IDB4Mzg7Ci0JICAgcm9taW5kZXggPSAweGYzOwotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMzApIHJvbWluZGV4ID0gMHgxMWI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYodGVtcCkgewotICAgICAgICAgICBpZihyb21pbmRleCAmJiBTaVNfUHItPlNpU19Vc2VST00gJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLQkgICAgICBPdXRwdXRTZWxlY3QgPSBST01BZGRyW3JvbWluZGV4XTsKLQkgICAgICBpZighKE91dHB1dFNlbGVjdCAmIEVuYWJsZVBBTE1OKSkgewotICAgICAgICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzZDQsdGVtcCwweDNGKTsKLQkgICAgICB9Ci0JICAgfQotCSAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LHRlbXApOwotCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gICAgICAgICAgICAgIGlmKHRlbXAxICYgRW5hYmxlUEFMTSkgewkJLyogMHg0MCAqLwotICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxNOwotCSAgICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSAmPSB+VFZTZXRQQUw7Ci0JICAgICAgfSBlbHNlIGlmKHRlbXAxICYgRW5hYmxlUEFMTikgewkvKiAweDgwICovCi0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKLSAgICAgICAgICAgICAgfQotCSAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlmKHRlbXAxICYgRW5hYmxlTlRTQ0opIHsJCS8qIDB4NDAgKi8KLQkgICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXROVFNDSjsKLSAgCSAgICAgIH0KLQkgICB9Ci0gICAgICAgIH0KLQkvKiBUcmFuc2xhdGUgSGlWaXNpb24vWVBiUHIgdG8gb3VyIG5ldyBmbGFncyAqLwotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfWVBiUHIgPT0gWVBiUHI3NTBwKSAgICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjc1MHA7Ci0JICAgZWxzZSBpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQcjUyNXApICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNXA7Ci0JICAgZWxzZQlpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQckhpVmlzaW9uKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRIaVZpc2lvbjsKLQkgICBlbHNlCQkJCQkgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0WVBiUHI1MjVpOwotCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjUyNWkpKSB7Ci0JICAgICAgU2lTX1ByLT5TaVNfVkJJbmZvICY9IH5TZXRDUlQyVG9IaVZpc2lvbjsKLQkgICAgICBTaVNfUHItPlNpU19WQkluZm8gfD0gU2V0Q1JUMlRvWVBiUHI1MjU3NTA7Ci0JICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0SGlWaXNpb24pIHsKLQkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7Ci0JICAgfQotCX0KLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICBpZihTaVNfUHItPlNpU19DSE92ZXJTY2FuKSB7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMSkgewotICAgICAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpOwotICAgICAgICAgICAgICBpZigodGVtcCAmIFRWT3ZlclNjYW4pIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7Ci0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgICAJICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDc5KTsKLSAgICAgIAkgICAgICBpZigodGVtcCAmIDB4ODApIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7Ci0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLSAJICAgICAgfQotCSAgIH0KLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfQ0hTT3ZlclNjYW4pIHsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotCSAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOCk7Ci0gICAgIAkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkgewotICAgICAgICAgICAgICBpZih0ZW1wICYgRW5hYmxlUEFMTSkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxNOwotCSAgICAgIGVsc2UgaWYodGVtcCAmIEVuYWJsZVBBTE4pIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTE47Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgaWYodGVtcCAmIEVuYWJsZU5UU0NKKSB7Ci0JICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0TlRTQ0o7Ci0gIAkgICAgICB9Ci0JICAgfQotCX0KLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKwkgdGVtcCA9IDA7CisJIGlmKChTaVNfUHItPkNoaXBUeXBlID09IFNJU182MzApIHx8CisJICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApKSB7CisJICAgIHRlbXAgPSAweDM1OworCSAgICByb21pbmRleCA9IDB4ZmU7CisJIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIHRlbXAgPSAweDM4OworCSAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgWEdJXzIwKSB7CisJICAgICAgIHJvbWluZGV4ID0gMHhmMzsKKwkgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzMwKSByb21pbmRleCA9IDB4MTFiOworCSAgICB9CisJIH0KKwkgaWYodGVtcCkgeworCSAgICBpZihyb21pbmRleCAmJiBTaVNfUHItPlNpU19Vc2VST00gJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKKwkgICAgICAgT3V0cHV0U2VsZWN0ID0gUk9NQWRkcltyb21pbmRleF07CisJICAgICAgIGlmKCEoT3V0cHV0U2VsZWN0ICYgRW5hYmxlUEFMTU4pKSB7CisJCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LHRlbXAsMHgzRik7CisJICAgICAgIH0KKwkgICAgfQorCSAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCx0ZW1wKTsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKwkgICAgICAgaWYodGVtcDEgJiBFbmFibGVQQUxNKSB7CQkvKiAweDQwICovCisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTTsKKwkJICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWU2V0UEFMOworCSAgICAgICB9IGVsc2UgaWYodGVtcDEgJiBFbmFibGVQQUxOKSB7CS8qIDB4ODAgKi8KKwkJICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxOOworCSAgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgIGlmKHRlbXAxICYgRW5hYmxlTlRTQ0opIHsJLyogMHg0MCAqLworCQkgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldE5UU0NKOworCSAgICAgICB9CisJICAgIH0KKwkgfQorCSAvKiBUcmFuc2xhdGUgSGlWaXNpb24vWVBiUHIgdG8gb3VyIG5ldyBmbGFncyAqLworCSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgeworCSAgICBpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQcjc1MHApICAgICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNzUwcDsKKwkgICAgZWxzZSBpZihTaVNfUHItPlNpU19ZUGJQciA9PSBZUGJQcjUyNXApICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNXA7CisJICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfWVBiUHIgPT0gWVBiUHJIaVZpc2lvbikgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0SGlWaXNpb247CisJICAgIGVsc2UJCQkJICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNWk7CisJICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjUyNWkpKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbyAmPSB+U2V0Q1JUMlRvSGlWaXNpb247CisJICAgICAgIFNpU19Qci0+U2lTX1ZCSW5mbyB8PSBTZXRDUlQyVG9ZUGJQcjUyNTc1MDsKKwkgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0SGlWaXNpb24pIHsKKwkgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOworCSAgICB9CisJIH0KKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKKwkgaWYoU2lTX1ByLT5TaVNfQ0hPdmVyU2NhbikgeworCSAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDEpIHsKKwkgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM1KTsKKwkgICAgICAgaWYoKHRlbXAgJiBUVk92ZXJTY2FuKSB8fCAoU2lTX1ByLT5TaVNfQ0hPdmVyU2NhbiA9PSAxKSkgeworCQkgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldENIT3ZlclNjYW47CisJICAgICAgIH0KKwkgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgeworCSAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4NzkpOworCSAgICAgICBpZigodGVtcCAmIDB4ODApIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7CisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKKwkgICAgICAgfQorCSAgICB9CisJICAgIGlmKFNpU19Qci0+U2lTX0NIU092ZXJTY2FuKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldENIT3ZlclNjYW47CisJICAgIH0KKwkgfQorCSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKwkgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM4KTsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKwkgICAgICAgaWYodGVtcCAmIEVuYWJsZVBBTE0pICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTTsKKwkgICAgICAgZWxzZSBpZih0ZW1wICYgRW5hYmxlUEFMTikgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgaWYodGVtcCAmIEVuYWJsZU5UU0NKKSB7CisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0TlRTQ0o7CisJICAgICAgIH0KKwkgICAgfQorCSB9CisgICAgICB9CiAKLSAgfSBlbHNlIHsgIC8qIDY2MSBhbmQgbGF0ZXIgKi8KKyAgIH0gZWxzZSB7ICAvKiA2NjEgYW5kIGxhdGVyICovCiAKLSAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7Ci0gICAgIGlmKHRlbXAxICYgMHgwMSkgewotICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7Ci0JaWYodGVtcDEgJiAweDA4KSB7Ci0JICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKLQl9IGVsc2UgaWYodGVtcDEgJiAweDA0KSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWU2V0UEFMOwotCSAgIH0KLQkgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUxNOwotCX0KLSAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYodGVtcDEgJiAweDAyKSB7Ci0JICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0TlRTQ0o7Ci0JfQotICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICAgICBpZihTaVNfUHItPlNpU19DSE92ZXJTY2FuKSB7Ci0gICAgICAgICAgIGlmKCh0ZW1wMSAmIDB4MTApIHx8IChTaVNfUHItPlNpU19DSE92ZXJTY2FuID09IDEpKSB7Ci0JICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKLQkgICB9Ci0JfQotICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7Ci0JICAgdGVtcDEgJj0gMHhlMDsKLQkgICBpZih0ZW1wMSA9PSAweDAwKSAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNTI1aTsKLQkgICBlbHNlIGlmKHRlbXAxID09IDB4MjApIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNTI1cDsKLQkgICBlbHNlIGlmKHRlbXAxID09IDB4NDApIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNzUwcDsKLQl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLQkgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gKFRWU2V0SGlWaXNpb24gfCBUVlNldFBBTCk7Ci0JfQotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MCB8IFNldENSVDJUb0hpVmlzaW9uKSkgewotCSAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzgwMHg0ODAgfHwgcmVzaW5mbyA9PSBTSVNfUklfMTAyNHg1NzYgfHwgcmVzaW5mbyA9PSBTSVNfUklfMTI4MHg3MjApIHsKLQkgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZBc3BlY3QxNjk7Ci0JICAgfSBlbHNlIHsKLQkgICAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM5KTsKLQkgICAgICBpZih0ZW1wMSAmIDB4MDIpIHsKLQkJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0SGlWaXNpb24pKSB7Ci0JCSAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZBc3BlY3QxNjk7Ci0JCSB9IGVsc2UgewotCQkgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDNMQjsKLQkJIH0KLQkgICAgICB9IGVsc2UgewotCQkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDM7Ci0JICAgICAgfQotCSAgIH0KLQl9Ci0gICAgIH0KLSAgfQorICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNSk7CisgICAgICBpZih0ZW1wMSAmIDB4MDEpIHsKKwkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOworCSBpZih0ZW1wMSAmIDB4MDgpIHsKKwkgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMTjsKKwkgfSBlbHNlIGlmKHRlbXAxICYgMHgwNCkgeworCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworCSAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWU2V0UEFMOworCSAgICB9CisJICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTE07CisJIH0KKyAgICAgIH0gZWxzZSB7CisJIGlmKHRlbXAxICYgMHgwMikgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXROVFNDSjsKKwkgfQorICAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7CisJIGlmKFNpU19Qci0+U2lTX0NIT3ZlclNjYW4pIHsKKwkgICAgaWYoKHRlbXAxICYgMHgxMCkgfHwgKFNpU19Qci0+U2lTX0NIT3ZlclNjYW4gPT0gMSkpIHsKKwkgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0Q0hPdmVyU2NhbjsKKwkgICAgfQorCSB9CisgICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworCSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCSAgICB0ZW1wMSAmPSAweGUwOworCSAgICBpZih0ZW1wMSA9PSAweDAwKSAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFlQYlByNTI1aTsKKwkgICAgZWxzZSBpZih0ZW1wMSA9PSAweDIwKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRZUGJQcjUyNXA7CisJICAgIGVsc2UgaWYodGVtcDEgPT0gMHg0MCkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0WVBiUHI3NTBwOworCSB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IChUVlNldEhpVmlzaW9uIHwgVFZTZXRQQUwpOworCSB9CisJIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9ZUGJQcjUyNTc1MCB8IFNldENSVDJUb0hpVmlzaW9uKSkgeworCSAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NDgwIHx8IHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NTc2IHx8IHJlc2luZm8gPT0gU0lTX1JJXzEyODB4NzIwKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVkFzcGVjdDE2OTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzOSk7CisJICAgICAgIGlmKHRlbXAxICYgMHgwMikgeworCQkgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0SGlWaXNpb24pKSB7CisJCSAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0MTY5OworCQkgIH0gZWxzZSB7CisJCSAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDNMQjsKKwkJICB9CisJICAgICAgIH0gZWxzZSB7CisJCSAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWQXNwZWN0NDM7CisJICAgICAgIH0KKwkgICAgfQorCSB9CisgICAgICB9CisgICB9CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvU0NBUlQpIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldFBBTDsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1NDQVJUKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRQQUw7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLSAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOwotCVNpU19Qci0+U2lTX1RWTW9kZSAmPSB+KFRWU2V0UEFMTSB8IFRWU2V0UEFMTiB8IFRWU2V0TlRTQ0opOwotICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVpIHwgVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpIHsKLQkgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gfihUVlNldFBBTCB8IFRWU2V0TlRTQ0ogfCBUVlNldFBBTE0gfCBUVlNldFBBTE4pOwotCX0KLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0UEFMOworCSBTaVNfUHItPlNpU19UVk1vZGUgJj0gfihUVlNldFBBTE0gfCBUVlNldFBBTE4gfCBUVlNldE5UU0NKKTsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRZUGJQcjUyNWkgfCBUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gfihUVlNldFBBTCB8IFRWU2V0TlRTQ0ogfCBUVlNldFBBTE0gfCBUVlNldFBBTE4pOworCSB9CisgICAgICB9CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXROb3RTaW11TW9kZSkpIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0VFZTaW11TW9kZTsKLSAgICAgICAgfQotICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCSBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldE5vdFNpbXVNb2RlKSkgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRUVlNpbXVNb2RlOworCSB9CisgICAgICB9CiAKLSAgICAgaWYoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkpIHsKLSAgICAgICAgLyogQklPUyBzZXRzIFRWTlRTQzEwMjQgd2l0aG91dCBjaGVja2luZyA1MjVwIGhlcmUuIFdyb25nPyAqLwotICAgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldEhpVmlzaW9uIHwgVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpKSB7Ci0gICAgICAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NzY4KSB7Ci0gICAgICAgICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldE5UU0MxMDI0OwotCSAgIH0KLSAgICAgICAgfQotICAgICB9CisgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgeworCSBpZihyZXNpbmZvID09IFNJU19SSV8xMDI0eDc2OCkgeworCSAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgeworCSAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXQ1MjVwMTAyNDsKKwkgICAgfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0SGlWaXNpb24gfCBUVlNldFlQYlByNzUwcCkpKSB7CisJICAgICAgIFNpU19Qci0+U2lTX1RWTW9kZSB8PSBUVlNldE5UU0MxMDI0OworCSAgICB9CisJIH0KKyAgICAgIH0KIAotICAgICBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZSUExMRElWMlhPOwotICAgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pICYmCi0gICAgICAgIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLQlTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkgewotICAgICAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKLSAgICAgfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgewotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlICY9IH5UVlJQTExESVYyWE87Ci0gICAgICAgIH0KLSAgICAgfQorICAgICAgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWUlBMTERJVjJYTzsKKyAgICAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgJiYKKwkgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgeworCSBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKKyAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpIHsKKwkgU2lTX1ByLT5TaVNfVFZNb2RlICY9IH5UVlJQTExESVYyWE87CisgICAgICB9IGVsc2UgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpKSB7CisJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgeworCSAgICBTaVNfUHItPlNpU19UVk1vZGUgJj0gflRWUlBMTERJVjJYTzsKKwkgfQorICAgICAgfQogCi0gIH0KKyAgIH0KIAotICBTaVNfUHItPlNpU19WQkluZm8gJj0gflNldFBBTFRWOworICAgU2lTX1ByLT5TaVNfVkJJbmZvICY9IH5TZXRQQUxUVjsKIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCi0gIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiKGluaXQzMDE6IFRWTW9kZSAleCwgVkJJbmZvICV4KVxuIiwgU2lTX1ByLT5TaVNfVFZNb2RlLCBTaVNfUHItPlNpU19WQkluZm8pOworICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIoaW5pdDMwMTogVFZNb2RlICV4LCBWQkluZm8gJXgpXG4iLCBTaVNfUHItPlNpU19UVk1vZGUsIFNpU19Qci0+U2lTX1ZCSW5mbyk7CisjZW5kaWYKICNlbmRpZgogfQogCkBAIC0xNDU1LDQxICsxNDMwLDQ2IEBACiAvKiAgICAgICAgICAgICAgIEdFVCBMQ0QgSU5GTyAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIFVTSE9SVAotU2lTX0dldEJJT1NMQ0RSZXNJbmZvKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19HZXRCSU9TTENEUmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgIFVTSE9SVCB0ZW1wID0gU2lTX1ByLT5TaVNfTENEUmVzSW5mbzsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAgPSBTaVNfUHItPlNpU19MQ0RSZXNJbmZvOwogICAgLyogVHJhbnNsYXRlIG15IExDRFJlc0luZm8gdG8gQklPUyB2YWx1ZSAqLwotICAgaWYodGVtcCA9PSBQYW5lbF8xMjgweDc2OF8yKSAgdGVtcCA9IFBhbmVsXzEyODB4NzY4OwotICAgaWYodGVtcCA9PSBQYW5lbF8xMjgweDgwMF8yKSAgdGVtcCA9IFBhbmVsXzEyODB4ODAwOworICAgc3dpdGNoKHRlbXApIHsKKyAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMjogdGVtcCA9IFBhbmVsXzEyODB4NzY4OyAgICBicmVhazsKKyAgIGNhc2UgUGFuZWxfMTI4MHg4MDBfMjogdGVtcCA9IFBhbmVsXzEyODB4ODAwOyAgICBicmVhazsKKyAgIGNhc2UgUGFuZWxfMTI4MHg4NTQ6ICAgdGVtcCA9IFBhbmVsNjYxXzEyODB4ODU0OyBicmVhazsKKyAgIH0KICAgIHJldHVybiB0ZW1wOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX0dldExDREluZm9CSU9TKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0TENESW5mb0JJT1Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAjaWZkZWYgU0lTMzE1SAotICAgVUNIQVIgICpST01BZGRyOwotICAgVVNIT1JUIHRlbXA7CisgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkcjsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQYW5lbGRhdGEgZHJpdmVyOiBbJWQgJWRdIFtIICVkICVkXSBbViAlZCAlZF0gW0MgJWQgMHglMDJ4IDB4JTAyeF1cbiIsCi0gICAgICAJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCisJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCiAJU2lTX1ByLT5QYW5lbEhSUywgU2lTX1ByLT5QYW5lbEhSRSwKIAlTaVNfUHItPlBhbmVsVlJTLCBTaVNfUHItPlBhbmVsVlJFLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLkNMT0NLLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLlBhcnQ0X0EsCiAJU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtTaVNfUHItPlBhbmVsVkNMS0lkeDMxNV0uUGFydDRfQik7CiAjZW5kaWYKKyNlbmRpZgogCi0gICBpZigoUk9NQWRkciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIsIEh3SW5mbykpKSB7CisgICBpZigoUk9NQWRkciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIpKSkgewogICAgICAgaWYoKHRlbXAgPSBTSVNHRVRST01XKDYpKSAhPSBTaVNfUHItPlBhbmVsSFQpIHsKLSAgICAgICAgIFNpU19Qci0+U2lTX05lZWRSb21Nb2RlRGF0YSA9IFRSVUU7CisJIFNpU19Qci0+U2lTX05lZWRSb21Nb2RlRGF0YSA9IFRSVUU7CiAJIFNpU19Qci0+UGFuZWxIVCAgPSB0ZW1wOwogICAgICAgfQogICAgICAgaWYoKHRlbXAgPSBTSVNHRVRST01XKDgpKSAhPSBTaVNfUHItPlBhbmVsVlQpIHsKLSAgICAgICAgIFNpU19Qci0+U2lTX05lZWRSb21Nb2RlRGF0YSA9IFRSVUU7Ci0gICAgICAgICBTaVNfUHItPlBhbmVsVlQgID0gdGVtcDsKKwkgU2lTX1ByLT5TaVNfTmVlZFJvbU1vZGVEYXRhID0gVFJVRTsKKwkgU2lTX1ByLT5QYW5lbFZUICA9IHRlbXA7CiAgICAgICB9CiAgICAgICBTaVNfUHItPlBhbmVsSFJTID0gU0lTR0VUUk9NVygxMCk7CiAgICAgICBTaVNfUHItPlBhbmVsSFJFID0gU0lTR0VUUk9NVygxMik7CkBAIC0xNDk3LDU2ICsxNDc3LDU4IEBACiAgICAgICBTaVNfUHItPlBhbmVsVlJFID0gU0lTR0VUUk9NVygxNik7CiAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEtfQ1VTVE9NXzMxNTsKICAgICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uQ0xPQ0sgPQotCSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uQ0xPQ0sgPSAoVVNIT1JUKSgoVUNIQVIpUk9NQWRkclsxOF0pOworCSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uQ0xPQ0sgPSAodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKVJPTUFkZHJbMThdKTsKICAgICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uU1IyQiA9CiAJIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbVkNMS19DVVNUT01fMzE1XS5QYXJ0NF9BID0gUk9NQWRkclsxOV07CiAgICAgICBTaVNfUHItPlNpU19WQ0xLRGF0YVtWQ0xLX0NVU1RPTV8zMTVdLlNSMkMgPQogCSBTaVNfUHItPlNpU19WQlZDTEtEYXRhW1ZDTEtfQ1VTVE9NXzMxNV0uUGFydDRfQiA9IFJPTUFkZHJbMjBdOwogCisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmZGVmIFRXREVCVUcKICAgICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiUGFuZWxkYXRhIEJJT1M6ICBbJWQgJWRdIFtIICVkICVkXSBbViAlZCAlZF0gW0MgJWQgMHglMDJ4IDB4JTAyeF1cbiIsCi0gICAgICAJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCisJU2lTX1ByLT5QYW5lbEhULCBTaVNfUHItPlBhbmVsVlQsCiAJU2lTX1ByLT5QYW5lbEhSUywgU2lTX1ByLT5QYW5lbEhSRSwKIAlTaVNfUHItPlBhbmVsVlJTLCBTaVNfUHItPlBhbmVsVlJFLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLkNMT0NLLAogCVNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTVdLlBhcnQ0X0EsCiAJU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVtTaVNfUHItPlBhbmVsVkNMS0lkeDMxNV0uUGFydDRfQik7CiAjZW5kaWYKKyNlbmRpZgogCiAgICB9CiAjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaGVja1NjYWxpbmcoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHJlc2luZm8sIGNvbnN0IFVDSEFSICpub25zY2FsaW5nbW9kZXMpCitTaVNfQ2hlY2tTY2FsaW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZXNpbmZvLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbm9uc2NhbGluZ21vZGVzKQogewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZShub25zY2FsaW5nbW9kZXNbaV0gIT0gMHhmZikgewotICAgICAgICBpZihub25zY2FsaW5nbW9kZXNbaSsrXSA9PSByZXNpbmZvKSB7Ci0JICAgaWYoKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgfHwKLQkgICAgICAoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkpIHsKLQkgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7Ci0JICAgfQotCSAgIGJyZWFrOwotCX0KLSAgICB9CisgICBpbnQgaSA9IDA7CisgICB3aGlsZShub25zY2FsaW5nbW9kZXNbaV0gIT0gMHhmZikgeworICAgICAgaWYobm9uc2NhbGluZ21vZGVzW2krK10gPT0gcmVzaW5mbykgeworCSBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB8fAorCSAgICAoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkpIHsKKwkgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOworCSB9CisJIGJyZWFrOworICAgICAgfQorICAgfQogfQogCiB2b2lkCi1TaVNfR2V0TENEUmVzSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0JCSAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19HZXRMQ0RSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogeworICB1bnNpZ25lZCBzaG9ydCB0ZW1wLG1vZGVmbGFnLHJlc2luZm89MCxtb2RleHJlcz0wLG1vZGV5cmVzPTA7CisgIEJPT0xFQU4gcGFuZWxjYW5zY2FsZSA9IEZBTFNFOwogI2lmZGVmIFNJUzMwMAotICBVQ0hBUiAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBTZXJpZXNMQ0RSZXNbXSA9CisgIHVuc2lnbmVkIGNoYXIgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBTZXJpZXNMQ0RSZXNbXSA9CiAgICAgICAgICAgeyAwLCAgMSwgIDIsICAzLCAgNywgIDQsICA1LCAgOCwKIAkgICAgMCwgIDAsIDEwLCAgMCwgIDAsICAwLCAgMCwgMTUgfTsKICNlbmRpZgogI2lmZGVmIFNJUzMxNUgKLSAgVUNIQVIgICAqbXlwdHIgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICAgKm15cHRyID0gTlVMTDsKICNlbmRpZgotICBVU0hPUlQgIHRlbXAsbW9kZWZsYWcscmVzaW5mbz0wLG1vZGV4cmVzPTAsbW9kZXlyZXM9MDsKLSAgQk9PTEVBTiBwYW5lbGNhbnNjYWxlID0gRkFMU0U7CiAKICAgU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAgPSAwOwogICBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9IDA7CkBAIC0xNTU3LDE0ICsxNTM5LDE0IEBACiAgIFNpU19Qci0+UGFuZWxWUkUgICAgICAgID0gOTk5OyAvKiBWU3luYyBlbmQgKi8KICAgU2lTX1ByLT5TaVNfTmVlZFJvbU1vZGVEYXRhID0gRkFMU0U7CiAKKyAgLyogQWx0ZXJuYXRpdmUgMTYwMHgxMjAwQDYwIHRpbWluZyBmb3IgMTYwMHgxMjAwIExDREEgKi8KKyAgU2lTX1ByLT5BbHRlcm5hdGUxNjAweDEyMDAgPSBGQUxTRTsKKwogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkpIHJldHVybjsKIAotICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gIH0gZWxzZSBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPkNNb2RlRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKyAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKworICBpZigoTW9kZU5vID4gMHgxMykgJiYgKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpKSB7CiAgICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogICAgICBtb2RleHJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZm9dLkhUb3RhbDsKICAgICAgbW9kZXlyZXMgPSBTaVNfUHItPlNpU19Nb2RlUmVzSW5mb1tyZXNpbmZvXS5WVG90YWw7CkBAIC0xNTc1LDE2ICsxNTU3LDE2IEBACiAgIC8qIEZvciBicm9rZW4gQklPU2VzOiBBc3N1bWUgMTAyNHg3NjggKi8KICAgaWYodGVtcCA9PSAwKSB0ZW1wID0gMHgwMjsKIAotICBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgfHwgKFNpU19Qci0+U2lTX1JPTU5ldykpIHsKKyAgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgfHwgKFNpU19Qci0+U2lTX1JPTU5ldykpIHsKICAgICAgU2lTX1ByLT5TaVNfTENEVHlwZUluZm8gPSAoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzkpICYgMHg3YykgPj4gMjsKLSAgfSBlbHNlIGlmKChId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB8fCAoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkpIHsKKyAgfSBlbHNlIGlmKChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHx8IChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpKSB7CiAgICAgIFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvID0gdGVtcCA+PiA0OwogICB9IGVsc2UgewogICAgICBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9ICh0ZW1wICYgMHgwRikgLSAxOwogICB9CiAgIHRlbXAgJj0gMHgwZjsKICNpZmRlZiBTSVMzMDAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICAgICAgLyogVmVyeSBvbGQgQklPU2VzIG9ubHkga25vdyA3IHNpemVzIChOZXRWaXN0YSAyMTc5LCAxLjAxZykgKi8KICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7CiAgICAgICAgIGlmKHRlbXAgPCAweDBmKSB0ZW1wICY9IDB4MDc7CkBAIC0xNTk1LDE3ICsxNTc3LDIyIEBACiAjZW5kaWYKIAogICAvKiBUcmFuc2xhdGUgdG8gb3VyIGludGVybmFsIHR5cGVzICovCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKLSAgICAgaWYodGVtcCA9PSBQYW5lbDMxMF82NDB4NDgwXzIpIHRlbXAgPSBQYW5lbF82NDB4NDgwXzI7Ci0gICAgIGlmKHRlbXAgPT0gUGFuZWwzMTBfNjQweDQ4MF8zKSB0ZW1wID0gUGFuZWxfNjQweDQ4MF8zOworI2lmZGVmIFNJUzMxNUgKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTUwKSB7CisgICAgIGlmICAgICAodGVtcCA9PSBQYW5lbDMxMF8xMTUyeDc2OCkgIHRlbXAgPSBQYW5lbF8zMjB4MjQwXzI7IC8qIFZlcmlmaWVkIHdvcmtpbmcgKi8KKyAgICAgZWxzZSBpZih0ZW1wID09IFBhbmVsMzEwXzMyMHgyNDBfMikgdGVtcCA9IFBhbmVsXzMyMHgyNDBfMjsKKyAgICAgZWxzZSBpZih0ZW1wID09IFBhbmVsMzEwXzMyMHgyNDBfMykgdGVtcCA9IFBhbmVsXzMyMHgyNDBfMzsKKyAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICBpZih0ZW1wID09IFBhbmVsNjYxXzEyODB4ODU0KSAgICAgICB0ZW1wID0gUGFuZWxfMTI4MHg4NTQ7CiAgIH0KKyNlbmRpZgogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsJLyogU2lTIExWRFMgKi8KKyAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewkJLyogU2lTIExWRFMgKi8KICAgICAgaWYodGVtcCA9PSBQYW5lbDMxMF8xMjgweDc2OCkgewogICAgICAgICB0ZW1wID0gUGFuZWxfMTI4MHg3NjhfMjsKICAgICAgfQogICAgICBpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLSAgICAgICAgaWYodGVtcCA9PSBQYW5lbDY2MV8xMjgweDgwMCkgeworCWlmKHRlbXAgPT0gUGFuZWw2NjFfMTI4MHg4MDApIHsKIAkgICB0ZW1wID0gUGFuZWxfMTI4MHg4MDBfMjsKIAl9CiAgICAgIH0KQEAgLTE2MTMsMTMgKzE2MDAsMTcgQEAKIAogICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gdGVtcDsKIAorI2lmZGVmIFNJUzMwMAogICBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgewotICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gUGFuZWxfQmFyY28xMzY2OworCVNpU19Qci0+U2lTX0xDRFJlc0luZm8gPSBQYW5lbF9CYXJjbzEzNjY7CiAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgewotICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gUGFuZWxfODQ4eDQ4MDsKKwlTaVNfUHItPlNpU19MQ0RSZXNJbmZvID0gUGFuZWxfODQ4eDQ4MDsKKyAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSB7CisJU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9IFBhbmVsXzg1Nng0ODA7CiAgICAgIH0KICAgfQorI2VuZGlmCiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA8IFNpU19Qci0+U2lTX1BhbmVsTWluMzAxKQpAQCAtMTYzMywxMCArMTYyNCwxNiBAQAogICBTaVNfUHItPlNpU19MQ0RJbmZvID0gdGVtcCAmIH4weDAwMGU7CiAgIC8qIE5lZWQgdGVtcCBiZWxvdyEgKi8KIAotICAvKiBUaGVzZSBjYW4ndCBzY2FsZSBubyBtYXR0ZXIgd2hhdCAqLworICAvKiBUaGVzZSBtdXN0L2Nhbid0IHNjYWxlIG5vIG1hdHRlciB3aGF0ICovCiAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisgIGNhc2UgUGFuZWxfMzIweDI0MF8xOgorICBjYXNlIFBhbmVsXzMyMHgyNDBfMjoKKyAgY2FzZSBQYW5lbF8zMjB4MjQwXzM6CiAgIGNhc2UgUGFuZWxfMTI4MHg5NjA6CiAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5Eb250RXhwYW5kTENEOworICAgICAgYnJlYWs7CisgIGNhc2UgUGFuZWxfNjQweDQ4MDoKKyAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKICAgfQogCiAgIHBhbmVsY2Fuc2NhbGUgPSAoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpID8gVFJVRSA6IEZBTFNFOwpAQCAtMTY0Niw0MSArMTY0Myw0MSBAQAogCiAgIC8qIER1YWwgbGluaywgUGFzcyAxOjEgQklPUyBkZWZhdWx0LCBldGMuICovCiAjaWZkZWYgU0lTMzE1SAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgewogICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgICBpZih0ZW1wICYgMHgwOCkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RQYXNzMTE7CisJaWYodGVtcCAmIDB4MDgpIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUGFzczExOwogICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0RVQUxMSU5LKSB7CisJaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB7CiAJICAgaWYodGVtcCAmIDB4MDIpIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENERHVhbExpbms7Ci0JfSBlbHNlIGlmKChteXB0ciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIsIEh3SW5mbykpKSB7Ci0gICAgICAgICAgIGlmKG15cHRyWzJdICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0REdWFsTGluazsKKwl9IGVsc2UgaWYoKG15cHRyID0gR2V0TENEU3RydWN0UHRyNjYxKFNpU19QcikpKSB7CisJICAgaWYobXlwdHJbMl0gJiAweDAxKSBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IExDRER1YWxMaW5rOwogCX0KICAgICAgfQotICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKLSAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzkpICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RQYXNzMTE7CisJaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzkpICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RQYXNzMTE7CiAgICAgIH0KICAgICAgaWYoKFNpU19Qci0+U2lTX1JPTU5ldykgJiYgKCEoU2lTX1ByLT5QYW5lbFNlbGZEZXRlY3RlZCkpKSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gJj0gfihMQ0RSR0IxOEJpdCk7CisJU2lTX1ByLT5TaVNfTENESW5mbyAmPSB+KExDRFJHQjE4Qml0KTsKIAl0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzUpOwotICAgICAgICBpZih0ZW1wICYgMHgwMSkgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0RSR0IxOEJpdDsKLQlpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7CisJaWYodGVtcCAmIDB4MDEpIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUkdCMThCaXQ7CisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRFVBTExJTkspIHsKIAkgICBpZih0ZW1wICYgMHgwMikgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBMQ0REdWFsTGluazsKIAl9CiAgICAgIH0gZWxzZSBpZighKFNpU19Qci0+U2lTX1JPTU5ldykpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgewotICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xMDI0KSAmJgorCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0RVQUxMSU5LKSB7CisJICAgaWYoKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NMRVZPMTAyNCkgJiYKIAkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkpIHsKIAkgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IExDRER1YWxMaW5rOwogCSAgIH0KLSAgICAgICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSB8fAorCSAgIGlmKChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgfHwKIAkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHx8Ci0gICAgICAgICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2MDB4MTIwMCkgfHwKKwkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNjAweDEyMDApIHx8CiAJICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTY4MHgxMDUwKSkgewogCSAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENERHVhbExpbms7CiAJICAgfQotICAgICAgICB9CisJfQogICAgICB9CiAgIH0KICNlbmRpZgpAQCAtMTY5MSwxMiArMTY4OCwxMiBAQAogICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5MQ0RQYXNzMTE7CiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7Ci0gICAgICAgIC8qIEFsd2F5cyBjZW50ZXIgc2NyZWVuIG9uIFNpUyBMVkRTIChpZiBzY2FsaW5nIGlzIGRpc2FibGVkKSAqLwotICAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5MQ0RQYXNzMTE7CisJLyogQWx3YXlzIGNlbnRlciBzY3JlZW4gb24gU2lTIExWRFMgKGlmIHNjYWxpbmcgaXMgZGlzYWJsZWQpICovCisJU2lTX1ByLT5TaVNfTENESW5mbyAmPSB+TENEUGFzczExOwogICAgICB9IGVsc2UgewotICAgICAgICAvKiBCeSBkZWZhdWx0LCBwYXNzIDE6MSBvbiBTaVMgVE1EUyAoaWYgc2NhbGluZyBpcyBzdXBwb3J0ZWQpICovCi0gICAgICAgIGlmKHBhbmVsY2Fuc2NhbGUpICAgICAgICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUGFzczExOwotICAgICAgICBpZihTaVNfUHItPkNlbnRlclNjcmVlbiA9PSAxKSBTaVNfUHItPlNpU19MQ0RJbmZvICY9IH5MQ0RQYXNzMTE7CisJLyogQnkgZGVmYXVsdCwgcGFzcyAxOjEgb24gU2lTIFRNRFMgKGlmIHNjYWxpbmcgaXMgc3VwcG9ydGVkKSAqLworCWlmKHBhbmVsY2Fuc2NhbGUpICAgICAgICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gTENEUGFzczExOworCWlmKFNpU19Qci0+Q2VudGVyU2NyZWVuID09IDEpIFNpU19Qci0+U2lTX0xDREluZm8gJj0gfkxDRFBhc3MxMTsKICAgICAgfQogICB9CiAKQEAgLTE3MDQsMTkgKzE3MDEsMTUgQEAKICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLMTA4XzJfMzE1OwogCiAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7Ci0gICAgIGNhc2UgUGFuZWxfMzIweDQ4MDogICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAgMzIwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA0ODA7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9ICA0MDA7IFNpU19Qci0+UGFuZWxWVCAgID0gIDUyNTsKLQkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEsyODsKLQkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEsyODsKLQkJCSAgICBicmVhazsKLSAgICAgY2FzZSBQYW5lbF82NDB4NDgwXzI6Ci0gICAgIGNhc2UgUGFuZWxfNjQweDQ4MF8zOiAgU2lTX1ByLT5QYW5lbFhSZXMgPSAgNjQwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA0ODA7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsVlJTICA9ICAgMjQ7IFNpU19Qci0+UGFuZWxWUkUgID0gICAgMzsKKyAgICAgY2FzZSBQYW5lbF8zMjB4MjQwXzE6CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8yOgorICAgICBjYXNlIFBhbmVsXzMyMHgyNDBfMzogIFNpU19Qci0+UGFuZWxYUmVzID0gIDY0MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNDgwOworCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAyNDsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzI4OwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzI4OwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6ICAgIFNpU19Qci0+UGFuZWxYUmVzID0gIDY0MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNDgwOwotICAgICAJCQkgICAgCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOworCQkJCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzI4OwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzI4OwogCQkJICAgIGJyZWFrOwpAQCAtMTcyOCw1MiArMTcyMSw1MiBAQAogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzQwOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEwMjR4NjAwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTAyNDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNjAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxMzQ0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxMzQ0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDI0OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMzY7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAyIC8qIDg4ICovIDsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA2OwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLNjVfMzAwOworCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzY1XzMwMDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEs2NV8zMTU7Ci0gICAgIAkJCSAgICBicmVhazsKKwkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xMDI0eDc2ODogICBTaVNfUHItPlBhbmVsWFJlcyA9IDEwMjQ7IFNpU19Qci0+UGFuZWxZUmVzID0gIDc2ODsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OwogCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICAyNDsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTM2OwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMzsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA2OwotCQkJICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkJCSAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsSFJTID0gMjM7Ci0JCQkgICAgICAgCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA1OworCQkJCQkJICAgICAgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA1OwogCQkJICAgIH0KIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEs2NV8zMDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLNjVfMzE1OwotCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIsIEh3SW5mbyk7CisJCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19Qcik7CiAJCQkgICAgYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfMTE1Mng3Njg6ICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAxMTUyOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA3Njg7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDEzNDQ7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKLQkJCSAgICBTaVNfUHItPlBhbmVsSFJTICA9ICAgMjQ7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxMzQ0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDY7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDI0OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMzY7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAzOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDY7Ci0JCQkgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCQkJICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCQkJICAgICAgIFNpU19Qci0+UGFuZWxIUlMgPSAyMzsKLQkJCSAgICAgICAJCQkgICAgICBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDU7CisJCQkJCQkgICAgICBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDU7CiAJCQkgICAgfQotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLNjVfMzAwOworCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzY1XzMwMDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEs2NV8zMTU7Ci0gICAgIAkJCSAgICBicmVhazsKKwkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xMTUyeDg2NDogICBTaVNfUHItPlBhbmVsWFJlcyA9IDExNTI7IFNpU19Qci0+UGFuZWxZUmVzID0gIDg2NDsKLSAgICAgCQkJICAgIGJyZWFrOworCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4NzIwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNzIwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjUwOyBTaVNfUHItPlBhbmVsVlQgICA9ICA3NTA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjUwOyBTaVNfUHItPlBhbmVsVlQgICA9ICA3NTA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgMTEwOyBTaVNfUHItPlBhbmVsSFJFICA9ICAgNDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICA1OyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDU7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4NzIwOwogCQkJICAgIC8qIERhdGEgYWJvdmUgZm9yIFRNRFMgKHByb2plY3Rvcik7IGdldCBmcm9tIEJJT1MgZm9yIExWRFMgKi8KLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4NzY4OiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNzY4OwotICAgICAJCQkgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgeworCQkJICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsSFQgICA9IDE0MDg7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEs4MV8zMDA7IC8qID8gKi8KIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEs4MV8zMTU7IC8qID8gKi8KIAkJCSAgICB9IGVsc2UgewotICAgICAJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjg4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDI7CisJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjg4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MDI7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDQ4OyBTaVNfUHItPlBhbmVsSFJTICA9ICAxMTI7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAzOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDY7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLODFfMzAwOwpAQCAtMTc4MSw3NyArMTc3NCwxMDAgQEAKIAkJCSAgICB9CiAJCQkgICAgYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMjogU2lTX1ByLT5QYW5lbFhSZXMgPSAxMjgwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA3Njg7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDE2NjA7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKKwkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDE2NjA7IFNpU19Qci0+UGFuZWxWVCAgID0gIDgwNjsKIAkJCSAgICBTaVNfUHItPlBhbmVsSFJTICA9ICAgNDg7IFNpU19Qci0+UGFuZWxIUkUgID0gIDExMjsKIAkJCSAgICBTaVNfUHItPlBhbmVsVlJTICA9ICAgIDM7IFNpU19Qci0+UGFuZWxWUkUgID0gICAgNjsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEtfMTI4MHg3NjhfMjsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4ODAwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgODAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNDA4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTY7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNDA4OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTY7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgID0gIDIxOyBTaVNfUHItPlBhbmVsSFJFICA9ICAgMjQ7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgID0gICA0OyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4ODAwXzMxNTsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4ODAwXzI6IFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgODAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNTUyOyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTI7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNTUyOyBTaVNfUHItPlBhbmVsVlQgICA9ICA4MTI7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgID0gIDQ4OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMTI7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgID0gICA0OyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4ODAwXzMxNV8yOwotCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIsIEh3SW5mbyk7CisJCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19Qcik7CisJCQkgICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMTI4MHg4NTQ6ICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAxMjgwOyBTaVNfUHItPlBhbmVsWVJlcyA9ICA4NTQ7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjY0OyBTaVNfUHItPlBhbmVsVlQgICA9ICA4NjE7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgID0gIDE2OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxMTI7CisJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgID0gICAxOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CisJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLXzEyODB4ODU0OworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEyODB4OTYwOiAgIFNpU19Qci0+UGFuZWxYUmVzID0gMTI4MDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgOTYwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxODAwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEwMDA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxODAwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEwMDA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLMTA4XzNfMzAwOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzEwOF8zXzMxNTsKLQkJIAkgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB7CisJCQkgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMDAgPSBWQ0xLMTAwXzMwMDsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEsxMDBfMzE1OwogCQkJICAgIH0KIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDEyODA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTAyNDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwogCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICA0ODsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTEyOwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMTsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwID0gVkNMSzEwOF8zXzMwMDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVkNMS0lkeDMxNSA9IFZDTEsxMDhfMl8zMTU7Ci0JCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19QciwgSHdJbmZvKTsKKwkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByKTsKIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xNDAweDEwNTA6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDE0MDA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTA1MDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwotCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICA0ODsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTEyOyAvKiBIUkUgT0sgZm9yIExWRFMsIG5vdCBmb3IgTENEQSAqLworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OworCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICA0ODsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgMTEyOwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMTsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICAzOwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzEwOF8yXzMxNTsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIFNpU19HZXRMQ0RJbmZvQklPUyhTaVNfUHIpOwogCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMDogIFNpU19Qci0+UGFuZWxYUmVzID0gMTYwMDsgU2lTX1ByLT5QYW5lbFlSZXMgPSAxMjAwOwotICAgICAJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAyMTYwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEyNTA7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAyMTYwOyBTaVNfUHItPlBhbmVsVlQgICA9IDEyNTA7CiAJCQkgICAgU2lTX1ByLT5QYW5lbEhSUyAgPSAgIDY0OyBTaVNfUHItPlBhbmVsSFJFICA9ICAxOTI7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZSUyAgPSAgICAxOyBTaVNfUHItPlBhbmVsVlJFICA9ICAgIDM7CiAJCQkgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLMTYyXzMxNTsKLQkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByLCBId0luZm8pOworCQkJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1RNRFNMQ0RBKSB7CisJCQkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgeworCQkJCSAgU2lTX1ByLT5QYW5lbEhUICA9IDE3NjA7IFNpU19Qci0+UGFuZWxWVCAgPSAxMjM1OworCQkJCSAgU2lTX1ByLT5QYW5lbEhSUyA9ICAgNDg7IFNpU19Qci0+UGFuZWxIUkUgPSAgIDMyOworCQkJCSAgU2lTX1ByLT5QYW5lbFZSUyA9ICAgIDI7IFNpU19Qci0+UGFuZWxWUkUgPSAgICA0OworCQkJCSAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLMTMwXzMxNTsKKwkJCQkgIFNpU19Qci0+QWx0ZXJuYXRlMTYwMHgxMjAwID0gVFJVRTsKKwkJCSAgICAgICB9CisJCQkgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTKSB7CisJCQkgICAgICAgU2lTX1ByLT5QYW5lbEhUICA9IDIwNDg7IFNpU19Qci0+UGFuZWxWVCAgPSAxMzIwOworCQkJICAgICAgIFNpU19Qci0+UGFuZWxIUlMgPSBTaVNfUHItPlBhbmVsSFJFID0gOTk5OworCQkJICAgICAgIFNpU19Qci0+UGFuZWxWUlMgPSBTaVNfUHItPlBhbmVsVlJFID0gOTk5OworCQkJICAgIH0KKwkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByKTsKIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF8xNjgweDEwNTA6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDE2ODA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTA1MDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTkwMDsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTkwMDsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwogCQkJICAgIFNpU19Qci0+UGFuZWxIUlMgID0gICAyNjsgU2lTX1ByLT5QYW5lbEhSRSAgPSAgIDc2OwogCQkJICAgIFNpU19Qci0+UGFuZWxWUlMgID0gICAgMzsgU2lTX1ByLT5QYW5lbFZSRSAgPSAgICA2OwogCQkJICAgIFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1ID0gVkNMSzEyMV8zMTU7Ci0JCQkgICAgU2lTX0dldExDREluZm9CSU9TKFNpU19QciwgSHdJbmZvKTsKKwkJCSAgICBTaVNfR2V0TENESW5mb0JJT1MoU2lTX1ByKTsKIAkJCSAgICBicmVhazsKICAgICAgY2FzZSBQYW5lbF9CYXJjbzEzNjY6ICBTaVNfUHItPlBhbmVsWFJlcyA9IDEzNjA7IFNpU19Qci0+UGFuZWxZUmVzID0gMTAyNDsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTY4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAxMDY2OwotICAgICAJCQkgICAgYnJlYWs7CisJCQkgICAgU2lTX1ByLT5QYW5lbEhUICAgPSAxNjg4OyBTaVNfUHItPlBhbmVsVlQgICA9IDEwNjY7CisJCQkgICAgYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfODQ4eDQ4MDogICAgU2lTX1ByLT5QYW5lbFhSZXMgPSAgODQ4OyBTaVNfUHItPlBhbmVsWVJlcyA9ICA0ODA7Ci0gICAgIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IDEwODg7IFNpU19Qci0+UGFuZWxWVCAgID0gIDUyNTsKLSAgICAgCQkJICAgIGJyZWFrOworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTA4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAgNTI1OworCQkJICAgIGJyZWFrOworICAgICBjYXNlIFBhbmVsXzg1Nng0ODA6ICAgIFNpU19Qci0+UGFuZWxYUmVzID0gIDg1NjsgU2lTX1ByLT5QYW5lbFlSZXMgPSAgNDgwOworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTA4ODsgU2lTX1ByLT5QYW5lbFZUICAgPSAgNTI1OworCQkJICAgIGJyZWFrOwogICAgICBjYXNlIFBhbmVsX0N1c3RvbTogICAgIFNpU19Qci0+UGFuZWxYUmVzID0gU2lTX1ByLT5DUF9NYXhYOwotICAgIAkJCSAgICBTaVNfUHItPlBhbmVsWVJlcyA9IFNpU19Qci0+Q1BfTWF4WTsKKwkJCSAgICBTaVNfUHItPlBhbmVsWVJlcyA9IFNpU19Qci0+Q1BfTWF4WTsKIAkJCSAgICBTaVNfUHItPlBhbmVsSFQgICA9IFNpU19Qci0+Q0hUb3RhbDsKIAkJCSAgICBTaVNfUHItPlBhbmVsVlQgICA9IFNpU19Qci0+Q1ZUb3RhbDsKIAkJCSAgICBpZihTaVNfUHItPkNQX1ByZWZlcnJlZEluZGV4ICE9IC0xKSB7CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFhSZXMgPSBTaVNfUHItPkNQX0hEaXNwbGF5W1NpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXhdOwotICAgIAkJCSAgICAgICBTaVNfUHItPlBhbmVsWVJlcyA9IFNpU19Qci0+Q1BfVkRpc3BsYXlbU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleF07CisJCQkgICAgICAgU2lTX1ByLT5QYW5lbFlSZXMgPSBTaVNfUHItPkNQX1ZEaXNwbGF5W1NpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXhdOwogCQkJICAgICAgIFNpU19Qci0+UGFuZWxIVCAgID0gU2lTX1ByLT5DUF9IVG90YWxbU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleF07CiAJCQkgICAgICAgU2lTX1ByLT5QYW5lbFZUICAgPSBTaVNfUHItPkNQX1ZUb3RhbFtTaVNfUHItPkNQX1ByZWZlcnJlZEluZGV4XTsKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsSFJTICA9IFNpU19Qci0+Q1BfSFN5bmNTdGFydFtTaVNfUHItPkNQX1ByZWZlcnJlZEluZGV4XTsKQEAgLTE4NjMsMjIgKzE4NzksMjIgQEAKIAkJCSAgICAgICBTaVNfUHItPlBhbmVsVlJTIC09IFNpU19Qci0+UGFuZWxZUmVzOwogCQkJICAgICAgIFNpU19Qci0+UGFuZWxWUkUgLT0gU2lTX1ByLT5QYW5lbFZSUzsKIAkJCSAgICAgICBpZihTaVNfUHItPkNQX1ByZWZDbG9jaykgewotCQkJICAgICAgICAgIGludCBpZHg7Ci0JCQkgICAgICAgICAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLX0NVU1RPTV8zMTU7CisJCQkJICBpbnQgaWR4OworCQkJCSAgU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTUgPSBWQ0xLX0NVU1RPTV8zMTU7CiAJCQkJICBTaVNfUHItPlBhbmVsVkNMS0lkeDMwMCA9IFZDTEtfQ1VTVE9NXzMwMDsKLQkJCQkgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIGlkeCA9IFZDTEtfQ1VTVE9NXzMwMDsKKwkJCQkgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgaWR4ID0gVkNMS19DVVNUT01fMzAwOwogCQkJCSAgZWxzZQkJCQkgICBpZHggPSBWQ0xLX0NVU1RPTV8zMTU7Ci0gICAgICAJCQkgICAgICAgICAgU2lTX1ByLT5TaVNfVkNMS0RhdGFbaWR4XS5DTE9DSyA9Ci0JIAkJICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbaWR4XS5DTE9DSyA9IFNpU19Qci0+Q1BfUHJlZkNsb2NrOwotICAgICAgCQkJICAgICAgICAgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW2lkeF0uU1IyQiA9Ci0gIAkgCQkJICAgICBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2lkeF0uUGFydDRfQSA9IFNpU19Qci0+Q1BfUHJlZlNSMkI7Ci0gICAgICAJCQkgICAgICAgICAgU2lTX1ByLT5TaVNfVkNMS0RhdGFbaWR4XS5TUjJDID0KLQkgCQkJICAgICBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2lkeF0uUGFydDRfQiA9IFNpU19Qci0+Q1BfUHJlZlNSMkM7CisJCQkJICBTaVNfUHItPlNpU19WQ0xLRGF0YVtpZHhdLkNMT0NLID0KKwkJCQkgICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbaWR4XS5DTE9DSyA9IFNpU19Qci0+Q1BfUHJlZkNsb2NrOworCQkJCSAgU2lTX1ByLT5TaVNfVkNMS0RhdGFbaWR4XS5TUjJCID0KKwkJCQkgICAgIFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbaWR4XS5QYXJ0NF9BID0gU2lTX1ByLT5DUF9QcmVmU1IyQjsKKwkJCQkgIFNpU19Qci0+U2lTX1ZDTEtEYXRhW2lkeF0uU1IyQyA9CisJCQkJICAgICBTaVNfUHItPlNpU19WQlZDTEtEYXRhW2lkeF0uUGFydDRfQiA9IFNpU19Qci0+Q1BfUHJlZlNSMkM7CiAJCQkgICAgICAgfQogCQkJICAgIH0KIAkJCSAgICBicmVhazsKICAgICAgZGVmYXVsdDoJCSAgICBTaVNfUHItPlBhbmVsWFJlcyA9IDEwMjQ7IFNpU19Qci0+UGFuZWxZUmVzID0gIDc2ODsKLSAgICAgCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OworCQkJICAgIFNpU19Qci0+UGFuZWxIVCAgID0gMTM0NDsgU2lTX1ByLT5QYW5lbFZUICAgPSAgODA2OwogCQkJICAgIGJyZWFrOwogICB9CiAKQEAgLTE4ODcsMTQgKzE5MDMsMTYgQEAKICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfRFNUTikgICAgICAgICAgICAgIHx8CiAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAogICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkgfHwKLSAgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgKSB7CisgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpICB8fAorICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSApIHsKICAgICAgU2lTX1ByLT5QYW5lbEhSUyA9IDk5OTsKICAgICAgU2lTX1ByLT5QYW5lbEhSRSA9IDk5OTsKICAgfQogCiAgIGlmKCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAogICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkgfHwKLSAgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgKSB7CisgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpICB8fAorICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSApIHsKICAgICAgU2lTX1ByLT5QYW5lbFZSUyA9IDk5OTsKICAgICAgU2lTX1ByLT5QYW5lbFZSRSA9IDk5OTsKICAgfQpAQCAtMTkxMiwxOCArMTkzMCwxOCBAQAogICAgICBjYXNlIFBhbmVsX0N1c3RvbToKICAgICAgY2FzZSBQYW5lbF8xMTUyeDg2NDoKICAgICAgY2FzZSBQYW5lbF8xMjgweDc2ODoJLyogVE1EUyBvbmx5ICovCi0gICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKKwlTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7CiAJYnJlYWs7CiAKICAgICAgY2FzZSBQYW5lbF84MDB4NjAwOiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub25zY2FsaW5nbW9kZXNbXSA9IHsKIAkgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgMHhmZgogCX07CiAJU2lTX0NoZWNrU2NhbGluZyhTaVNfUHIsIHJlc2luZm8sIG5vbnNjYWxpbmdtb2Rlcyk7CiAJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBQYW5lbF8xMDI0eDc2ODogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCiAJICAgMHhmZgpAQCAtMTkzMiw3ICsxOTUwLDcgQEAKIAlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzEyODB4NzIwOiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub25zY2FsaW5nbW9kZXNbXSA9IHsKIAkgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgU0lTX1JJXzg1Nng0ODAsIFNJU19SSV85NjB4NTQwLCBTSVNfUklfOTYweDYwMCwgU0lTX1JJXzEwMjR4NTc2LFNJU19SSV8xMDI0eDYwMCwKIAkgICAweGZmCkBAIC0xOTQ0LDcgKzE5NjIsNyBAQAogCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMjogeyAgLyogTFZEUyBvbmx5ICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub25zY2FsaW5nbW9kZXNbXSA9IHsKIAkgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgU0lTX1JJXzg1Nng0ODAsIFNJU19SSV85NjB4NTQwLCBTSVNfUklfOTYweDYwMCwgU0lTX1JJXzEwMjR4NTc2LFNJU19SSV8xMDI0eDYwMCwKIAkgICBTSVNfUklfMTE1Mng3NjgsMHhmZgpAQCAtMTk1MiwyMyArMTk3MCwyMyBAQAogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwogCXN3aXRjaChyZXNpbmZvKSB7CiAJY2FzZSBTSVNfUklfMTI4MHg3MjA6ICBpZihTaVNfUHItPlVzZVBhbmVsU2NhbGVyID09IC0xKSB7Ci0JICAgICAgCQkJICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7Ci0JICAgCQkgICAgICAgfQotCSAgIAkJICAgICAgIGJyZWFrOworCQkJCSAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOworCQkJICAgICAgIH0KKwkJCSAgICAgICBicmVhazsKIAl9Ci0gICAgICAgIGJyZWFrOworCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgUGFuZWxfMTI4MHg4MDA6IHsgIAkvKiBTaVMgVE1EUyBzcGVjaWFsIChBdmVyYXRlYyA2MjAwIHNlcmllcykgKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIG5vbnNjYWxpbmdtb2Rlc1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vbnNjYWxpbmdtb2Rlc1tdID0gewogCSAgIFNJU19SSV83MjB4NDgwLCBTSVNfUklfNzIweDU3NiwgU0lTX1JJXzc2OHg1NzYsIFNJU19SSV84MDB4NDgwLCBTSVNfUklfODQ4eDQ4MCwKIAkgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAogCSAgIFNJU19SSV8xMTUyeDc2OCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LDB4ZmYKIAl9OwogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwotICAgICAgICBicmVhazsKKwlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzEyODB4ODAwXzI6ICB7IAkvKiBTaVMgTFZEUyAqLwotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCiAJICAgU0lTX1JJXzExNTJ4NzY4LDB4ZmYKQEAgLTE5NzcsNjYgKzE5OTUsODMgQEAKIAlzd2l0Y2gocmVzaW5mbykgewogCWNhc2UgU0lTX1JJXzEyODB4NzIwOgogCWNhc2UgU0lTX1JJXzEyODB4NzY4OiAgaWYoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkgewotCSAgICAgIAkJCSAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOwotCSAgIAkJICAgICAgIH0KLQkgICAJCSAgICAgICBicmVhazsKKwkJCQkgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKKwkJCSAgICAgICB9CisJCQkgICAgICAgYnJlYWs7CiAJfQotICAgICAgICBicmVhazsKKwlicmVhazsKICAgICAgfQotICAgICBjYXNlIFBhbmVsXzEyODB4OTYwOiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBub25zY2FsaW5nbW9kZXNbXSA9IHsKKyAgICAgY2FzZSBQYW5lbF8xMjgweDg1NDogeyAgCS8qIFNpUyBMVkRTICovCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCi0JICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCwKLQkgICAweGZmCisJICAgU0lTX1JJXzExNTJ4NzY4LDB4ZmYKIAl9OwogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwotICAgICAgICBicmVhazsKKwlzd2l0Y2gocmVzaW5mbykgeworCWNhc2UgU0lTX1JJXzEyODB4NzIwOgorCWNhc2UgU0lTX1JJXzEyODB4NzY4OgorCWNhc2UgU0lTX1JJXzEyODB4ODAwOiAgaWYoU2lTX1ByLT5Vc2VQYW5lbFNjYWxlciA9PSAtMSkgeworCQkJCSAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOworCQkJICAgICAgIH0KKwkJCSAgICAgICBicmVhazsKKwl9CisJYnJlYWs7CiAgICAgIH0KLSAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6IHsKLSAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIG5vbnNjYWxpbmdtb2Rlc1tdID0geworICAgICBjYXNlIFBhbmVsXzEyODB4OTYwOiB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgU0lTX1JJXzcyMHg0ODAsIFNJU19SSV83MjB4NTc2LCBTSVNfUklfNzY4eDU3NiwgU0lTX1JJXzgwMHg0ODAsIFNJU19SSV84NDh4NDgwLAogCSAgIFNJU19SSV84NTZ4NDgwLCBTSVNfUklfOTYweDU0MCwgU0lTX1JJXzk2MHg2MDAsIFNJU19SSV8xMDI0eDU3NixTSVNfUklfMTAyNHg2MDAsCiAJICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCwKLQkgICBTSVNfUklfMTI4MHg5NjAsMHhmZgorCSAgIFNJU19SSV8xMjgweDg1NCwweGZmCisJfTsKKwlTaVNfQ2hlY2tTY2FsaW5nKFNpU19QciwgcmVzaW5mbywgbm9uc2NhbGluZ21vZGVzKTsKKwlicmVhazsKKyAgICAgfQorICAgICBjYXNlIFBhbmVsXzEyODB4MTAyNDogeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vbnNjYWxpbmdtb2Rlc1tdID0geworCSAgIFNJU19SSV83MjB4NDgwLCBTSVNfUklfNzIweDU3NiwgU0lTX1JJXzc2OHg1NzYsIFNJU19SSV84MDB4NDgwLCBTSVNfUklfODQ4eDQ4MCwKKwkgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAorCSAgIFNJU19SSV8xMTUyeDc2OCxTSVNfUklfMTE1Mng4NjQsU0lTX1JJXzEyODB4NzIwLFNJU19SSV8xMjgweDc2OCxTSVNfUklfMTI4MHg4MDAsCisJICAgU0lTX1JJXzEyODB4ODU0LFNJU19SSV8xMjgweDk2MCwweGZmCiAJfTsKIAlTaVNfQ2hlY2tTY2FsaW5nKFNpU19QciwgcmVzaW5mbywgbm9uc2NhbGluZ21vZGVzKTsKIAlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MDogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAotCSAgICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3NjgsU0lTX1JJXzEyODB4ODAwLFNJU19SSV8xMjgweDk2MCwKLQkgICAgIDB4ZmYKKwkgICAgIFNJU19SSV8xMTUyeDc2OCxTSVNfUklfMTE1Mng4NjQsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCxTSVNfUklfMTI4MHg4NTQsCisJICAgICBTSVNfUklfMTI4MHg5NjAsMHhmZgogCX07CiAJU2lTX0NoZWNrU2NhbGluZyhTaVNfUHIsIHJlc2luZm8sIG5vbnNjYWxpbmdtb2Rlcyk7Ci0gICAgICAgIHN3aXRjaChyZXNpbmZvKSB7CisJc3dpdGNoKHJlc2luZm8pIHsKIAljYXNlIFNJU19SSV8xMjgweDcyMDogIGlmKFNpU19Qci0+VXNlUGFuZWxTY2FsZXIgPT0gLTEpIHsKLQkgICAgICAJCQkgIFNpU19Qci0+U2lTX0xDREluZm8gfD0gRG9udEV4cGFuZExDRDsKLQkgICAJCSAgICAgICB9Ci0JICAgCQkgICAgICAgYnJlYWs7CisJCQkJICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IERvbnRFeHBhbmRMQ0Q7CisJCQkgICAgICAgfQorCQkJICAgICAgIGJyZWFrOwogCWNhc2UgU0lTX1JJXzEyODB4MTAyNDogU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOwotCSAgICAgIAkJICAgICAgIGJyZWFrOworCQkJICAgICAgIGJyZWFrOwogCX0KIAlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMDogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAogCSAgICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg3MjAsU0lTX1JJXzEyODB4NzY4LFNJU19SSV8xMjgweDgwMCwKLQkgICAgIFNJU19SSV8xMjgweDk2MCxTSVNfUklfMTM2MHg3NjgsU0lTX1JJXzEzNjB4MTAyNCwweGZmCisJICAgICBTSVNfUklfMTI4MHg4NTQsU0lTX1JJXzEyODB4OTYwLFNJU19SSV8xMzYweDc2OCxTSVNfUklfMTM2MHgxMDI0LDB4ZmYKIAl9OwogCVNpU19DaGVja1NjYWxpbmcoU2lTX1ByLCByZXNpbmZvLCBub25zY2FsaW5nbW9kZXMpOwotICAgICAgICBicmVhazsKKwlicmVhazsKICAgICAgfQogICAgICBjYXNlIFBhbmVsXzE2ODB4MTA1MDogewotICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgbm9uc2NhbGluZ21vZGVzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9uc2NhbGluZ21vZGVzW10gPSB7CiAJICAgICBTSVNfUklfNzIweDQ4MCwgU0lTX1JJXzcyMHg1NzYsIFNJU19SSV83Njh4NTc2LCBTSVNfUklfODAweDQ4MCwgU0lTX1JJXzg0OHg0ODAsCiAJICAgICBTSVNfUklfODU2eDQ4MCwgU0lTX1JJXzk2MHg1NDAsIFNJU19SSV85NjB4NjAwLCBTSVNfUklfMTAyNHg1NzYsU0lTX1JJXzEwMjR4NjAwLAotCSAgICAgU0lTX1JJXzExNTJ4NzY4LFNJU19SSV8xMTUyeDg2NCxTSVNfUklfMTI4MHg5NjAsU0lTX1JJXzEzNjB4NzY4LFNJU19SSV8xMzYweDEwMjQsCi0JICAgICAweGZmCisJICAgICBTSVNfUklfMTE1Mng3NjgsU0lTX1JJXzExNTJ4ODY0LFNJU19SSV8xMjgweDg1NCxTSVNfUklfMTI4MHg5NjAsU0lTX1JJXzEzNjB4NzY4LAorCSAgICAgU0lTX1JJXzEzNjB4MTAyNCwweGZmCiAJfTsKIAlTaVNfQ2hlY2tTY2FsaW5nKFNpU19QciwgcmVzaW5mbywgbm9uc2NhbGluZ21vZGVzKTsKIAlicmVhazsKQEAgLTIwNDQsMjUgKzIwNzksMjUgQEAKICAgICAgfQogICB9CiAKKyNpZmRlZiBTSVMzMDAKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgewotICAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvID0gMHg4MCB8IDB4NDAgfCAweDIwOyAgIC8qIG5lZyBoL3Ygc3luYywgUkdCMjQoRDAgPSAwKSAqLworICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCB8fCBTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgeworCVNpU19Qci0+U2lTX0xDREluZm8gPSAweDgwIHwgMHg0MCB8IDB4MjA7ICAgLyogbmVnIGgvdiBzeW5jLCBSR0IyNChEMCA9IDApICovCiAgICAgIH0KICAgfQogCi0jaWZkZWYgU0lTMzAwCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7CisJaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7CiAJICAgaWYoKFJPTUFkZHJbMHgyMzNdID09IDB4MTIpICYmIChST01BZGRyWzB4MjM0XSA9PSAweDM0KSkgewotICAgICAgICAgICAgICBpZighKFJPTUFkZHJbMHgyMzVdICYgMHgwMikpIHsKLQkgICAgICAgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9ICh+RG9udEV4cGFuZExDRCk7Ci0gCSAgICAgIH0KKwkgICAgICBpZighKFJPTUFkZHJbMHgyMzVdICYgMHgwMikpIHsKKwkJIFNpU19Qci0+U2lTX0xDREluZm8gJj0gKH5Eb250RXhwYW5kTENEKTsKKwkgICAgICB9CiAJICAgfQotICAgICAgICB9Ci0gICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKKwl9CisgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKIAlpZigoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpICYmICgoTW9kZU5vID09IDB4MDMpIHx8IChNb2RlTm8gPT0gMHgxMCkpKSB7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gJj0gKH5Eb250RXhwYW5kTENEKTsKKwkgICBTaVNfUHItPlNpU19MQ0RJbmZvICY9ICh+RG9udEV4cGFuZExDRCk7CiAJfQogICAgICB9CiAgIH0KQEAgLTIwODAsNyArMjExNSw3IEBACiAKICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKICAgY2FzZSBQYW5lbF82NDB4NDgwOgotICAgICBTaVNfUHItPlNpU19MQ0RJbmZvIHw9IExDRFBhc3MxMTsKKyAgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSAoRG9udEV4cGFuZExDRCB8IExDRFBhc3MxMSk7CiAgICAgIGJyZWFrOwogICBjYXNlIFBhbmVsXzEyODB4ODAwOgogICAgICAvKiBEb24ndCBwYXNzIDE6MSBieSBkZWZhdWx0IChUTURTIHNwZWNpYWwpICovCkBAIC0yMDk3LDcgKzIxMzIsNyBAQAogICAgICBicmVhazsKICAgfQogCi0gIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworICBpZigoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB8fCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfVU5LTk9XTkxDRCkpIHsKICAgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSAoRG9udEV4cGFuZExDRCB8IExDRFBhc3MxMSk7CiAgIH0KIApAQCAtMjEwNywxOSArMjE0MiwxOSBAQAogICB9CiAKICAgLyogTFZEUyBEREEgKi8KLSAgaWYoISgoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSkpIHsKKyAgaWYoISgoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSkgewogCiAgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB8fCAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpKSB7CiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OID09IDApIHsKIAkgICBpZihNb2RlTm8gPT0gMHgxMikgewogCSAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHsKLQkgICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CisJCSBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CiAJICAgICAgfQogCSAgIH0gZWxzZSBpZihNb2RlTm8gPiAweDEzKSB7CiAJICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDYwMCkgewotCSAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpKSB7Ci0JICAgICAgICAgICAgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzgwMHg2MDApIHx8IChyZXNpbmZvID09IFNJU19SSV80MDB4MzAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CisJCSBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgeworCQkgICAgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzgwMHg2MDApIHx8IChyZXNpbmZvID09IFNJU19SSV80MDB4MzAwKSkgeworCQkgICAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOwogCQkgICAgfQogCQkgfQogCSAgICAgIH0KQEAgLTIxMjgsMTggKzIxNjMsMTggQEAKICAgICAgfQogCiAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OID09IDEpIHsKKwlpZihTaVNfUHItPlNpU19JRl9ERUZfVFJVTVBJT04gPT0gMSkgewogCSAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gRW5hYmxlTFZEU0REQTsKLSAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CiAJICAgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOwogCX0gZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODApIHsKIAkgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7CiAJfSBlbHNlIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewotICAgICAgICAgICAgICBpZihyZXNpbmZvID09IFNJU19SSV81MTJ4Mzg0KSBTaVNfUHItPlNpU19TZXRGbGFnIHw9IEVuYWJsZUxWRFNEREE7Ci0gICAgICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzgwMHg2MDApIHsKLSAgICAgICAgICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfNDAweDMwMCkgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOwotICAgICAgICAgICB9CisJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgeworCSAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzUxMngzODQpIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gRW5hYmxlTFZEU0REQTsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF84MDB4NjAwKSB7CisJICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfNDAweDMwMCkgU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBFbmFibGVMVkRTRERBOworCSAgIH0KIAl9CiAgICAgIH0KIApAQCAtMjE0OCwyMSArMjE4MywyMSBAQAogICAvKiBWRVNBIHRpbWluZyAqLwogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewogICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXROb3RTaW11TW9kZSkgewotICAgICAJU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBMQ0RWRVNBVGltaW5nOworCVNpU19Qci0+U2lTX1NldEZsYWcgfD0gTENEVkVTQVRpbWluZzsKICAgICAgfQogICB9IGVsc2UgewogICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IExDRFZFU0FUaW1pbmc7CiAgIH0KIAotI2lmZGVmIExJTlVYX0tFUk5FTAotI2lmZGVmIFRXREVCVUcKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisjaWYgMAogICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IChMQ0RJbmZvPTB4JTA0eCBMQ0RSZXNJbmZvPTB4JTAyeCBMQ0RUeXBlSW5mbz0weCUwMngpXG4iLAogCVNpU19Qci0+U2lTX0xDREluZm8sIFNpU19Qci0+U2lTX0xDRFJlc0luZm8sIFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvKTsKICNlbmRpZgogI2VuZGlmCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICAgeGY4NkRydk1zZ1ZlcmIoMCwgWF9QUk9CRUQsIDQsCi0gIAkiKGluaXQzMDE6IExDREluZm89MHglMDR4IExDRFJlc0luZm89MHglMDJ4IExDRFR5cGVJbmZvPTB4JTAyeCBTZXRGbGFnPTB4JTA0eClcbiIsCisJIihpbml0MzAxOiBMQ0RJbmZvPTB4JTA0eCBMQ0RSZXNJbmZvPTB4JTAyeCBMQ0RUeXBlSW5mbz0weCUwMnggU2V0RmxhZz0weCUwNHgpXG4iLAogCVNpU19Qci0+U2lTX0xDREluZm8sIFNpU19Qci0+U2lTX0xDRFJlc0luZm8sIFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvLCBTaVNfUHItPlNpU19TZXRGbGFnKTsKICNlbmRpZgogfQpAQCAtMjE3MSw0NSArMjIwNiw0NiBAQAogLyogICAgICAgICAgICAgICAgIEdFVCBWQ0xLICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLVVTSE9SVAotU2lTX0dldFZDTEsyUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQordW5zaWduZWQgc2hvcnQKK1NpU19HZXRWQ0xLMlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgQ1JUMkluZGV4LFZDTEtJbmRleD0wLFZDTEtJbmRleEdFTj0wOwotICBVU0hPUlQgbW9kZWZsYWcscmVzaW5mbyx0ZW1wYng7Ci0gIGNvbnN0IFVDSEFSICpDSFRWVkNMS1B0ciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IENSVDJJbmRleCwgVkNMS0luZGV4ID0gMCwgVkNMS0luZGV4R0VOID0gMCwgVkNMS0luZGV4R0VOQ1JUID0gMDsKKyAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcsIHJlc2luZm8sIHRlbXBieDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqQ0hUVlZDTEtQdHIgPSBOVUxMOwogCiAgIGlmKE1vZGVObyA8PSAweDEzKSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfUmVzSW5mbzsKICAgICAgQ1JUMkluZGV4ID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKICAgICAgVkNMS0luZGV4R0VOID0gKFNpU19HZXRSZWdCeXRlKChTaVNfUHItPlNpU19QM2NhKzB4MDIpKSA+PiAyKSAmIDB4MDM7CisgICAgIFZDTEtJbmRleEdFTkNSVCA9IFZDTEtJbmRleEdFTjsKICAgfSBlbHNlIHsKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk87CiAgICAgIENSVDJJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOwogICAgICBWQ0xLSW5kZXhHRU4gPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlRWQ0xLOwotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSBWQ0xLSW5kZXhHRU4gJj0gMHgzZjsKKyAgICAgVkNMS0luZGV4R0VOQ1JUID0gU2lTX0dldFJlZkNSVFZDTEsoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCShTaVNfUHItPlNpU19TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSA/IFNpU19Qci0+U2lTX1VzZVdpZGVDUlQyIDogU2lTX1ByLT5TaVNfVXNlV2lkZSk7CiAgIH0KIAogICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeyAgICAvKiAzMHgvQi9MViAqLwogCiAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpIHsKIAotICAgICAgICBDUlQySW5kZXggPj49IDY7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeyAgICAgIAkvKiAgTENEICovCisJQ1JUMkluZGV4ID4+PSA2OworCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeyAgICAgIAkvKiAgTENEICovCiAKLSAgICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCSAgICAgIFZDTEtJbmRleCA9IFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwOwogCSAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7Ci0JICAgICAgICAgVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOOworCQkgVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOOwogCSAgICAgIH0KIAkgICB9IGVsc2UgewogCSAgICAgIFZDTEtJbmRleCA9IFNpU19Qci0+UGFuZWxWQ0xLSWR4MzE1OwogCSAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CiAJCSBzd2l0Y2gocmVzaW5mbykgewotCQkgLyogT25seSB0aG9zZSB3aG9zZSBJbmRleEdFTiBkb2Vzbid0IG1hdGNoIFZCVkNMSyBhcnJheSAqLwotCQkgY2FzZSBTSVNfUklfMTI4MHg3MjA6IFZDTEtJbmRleCA9IFZDTEtfMTI4MHg3MjA7IGJyZWFrOworCQkgLyogQ29ycmVjdCB0aG9zZSB3aG9zZSBJbmRleEdFTiBkb2Vzbid0IG1hdGNoIFZCVkNMSyBhcnJheSAqLwogCQkgY2FzZSBTSVNfUklfNzIweDQ4MDogIFZDTEtJbmRleCA9IFZDTEtfNzIweDQ4MDsgIGJyZWFrOwogCQkgY2FzZSBTSVNfUklfNzIweDU3NjogIFZDTEtJbmRleCA9IFZDTEtfNzIweDU3NjsgIGJyZWFrOwogCQkgY2FzZSBTSVNfUklfNzY4eDU3NjogIFZDTEtJbmRleCA9IFZDTEtfNzY4eDU3NjsgIGJyZWFrOwpAQCAtMjIxOCwxOCArMjI1NCwxOSBAQAogCQkgY2FzZSBTSVNfUklfODAweDQ4MDogIFZDTEtJbmRleCA9IFZDTEtfODAweDQ4MDsgIGJyZWFrOwogCQkgY2FzZSBTSVNfUklfMTAyNHg1NzY6IFZDTEtJbmRleCA9IFZDTEtfMTAyNHg1NzY7IGJyZWFrOwogCQkgY2FzZSBTSVNfUklfMTE1Mng4NjQ6IFZDTEtJbmRleCA9IFZDTEtfMTE1Mng4NjQ7IGJyZWFrOworCQkgY2FzZSBTSVNfUklfMTI4MHg3MjA6IFZDTEtJbmRleCA9IFZDTEtfMTI4MHg3MjA7IGJyZWFrOwogCQkgY2FzZSBTSVNfUklfMTM2MHg3Njg6IFZDTEtJbmRleCA9IFZDTEtfMTM2MHg3Njg7IGJyZWFrOwogCQkgZGVmYXVsdDogICAgICAgICAgICAgIFZDTEtJbmRleCA9IFZDTEtJbmRleEdFTjsKIAkJIH0KIAogCQkgaWYoTW9kZU5vIDw9IDB4MTMpIHsKLQkJICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDw9IFNJU18zMTVQUk8pIHsKKwkJICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgewogCQkgICAgICAgaWYoU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQyA9PSAxKSBWQ0xLSW5kZXggPSAweDQyOwotCSAgICAgICAgICAgIH0gZWxzZSB7CisJCSAgICB9IGVsc2UgewogCQkgICAgICAgaWYoU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQyA9PSAxKSBWQ0xLSW5kZXggPSAweDAwOwogCQkgICAgfQogCQkgfQotCQkgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgeworCQkgaWYoU2lTX1ByLT5DaGlwVHlwZSA8PSBTSVNfMzE1UFJPKSB7CiAJCSAgICBpZihWQ0xLSW5kZXggPT0gMCkgVkNMS0luZGV4ID0gMHg0MTsKIAkJICAgIGlmKFZDTEtJbmRleCA9PSAxKSBWQ0xLSW5kZXggPSAweDQzOwogCQkgICAgaWYoVkNMS0luZGV4ID09IDQpIFZDTEtJbmRleCA9IDB4NDQ7CkBAIC0yMjM3LDQ5ICsyMjc0LDQ2IEBACiAJICAgICAgfQogCSAgIH0KIAotICAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsgICAgICAgICAgICAgICAgIAkvKiAgVFYgKi8KKwl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsgICAgICAgICAgICAgICAgIAkvKiAgVFYgKi8KIAogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0gICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWUlBMTERJVjJYTykgCQlWQ0xLSW5kZXggPSBIaVRWVkNMS0RJVjI7Ci0gICAgIAkgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJVkNMS0luZGV4ID0gSGlUVlZDTEs7Ci0gICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgewotICAgICAgICAgICAgCSBpZihtb2RlZmxhZyAmIENoYXJ4OERvdCkgCSAgICAJCVZDTEtJbmRleCA9IEhpVFZTaW11VkNMSzsKLSAgICAgICAgICAgIAkgZWxzZSAJCQkgIAkgICAgCQlWQ0xLSW5kZXggPSBIaVRWVGV4dFZDTEs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI3NTBwKSAJVkNMS0luZGV4ID0gWVBiUHI3NTBwVkNMSzsKLQkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSAgIAlWQ0xLSW5kZXggPSBUVlZDTEtESVYyOwotCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZSUExMRElWMlhPKSAgICAgCVZDTEtJbmRleCA9IFRWVkNMS0RJVjI7Ci0gICAgICAgICAgIGVsc2UgICAgICAgICAJCSAgICAgICAgICAgIAkgIAlWQ0xLSW5kZXggPSBUVlZDTEs7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZSUExMRElWMlhPKSAJICAgVkNMS0luZGV4ID0gSGlUVlZDTEtESVYyOworCSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIFZDTEtJbmRleCA9IEhpVFZWQ0xLOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgICAgIFZDTEtJbmRleCA9IEhpVFZTaW11VkNMSzsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApICBWQ0xLSW5kZXggPSBZUGJQcjc1MHBWQ0xLOworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjUyNXApICAgIFZDTEtJbmRleCA9IFRWVkNMS0RJVjI7CisJICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlJQTExESVYyWE8pICAgICAgVkNMS0luZGV4ID0gVFZWQ0xLRElWMjsKKwkgICBlbHNlCQkJCQkJICAgVkNMS0luZGV4ID0gVFZWQ0xLOwogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgVkNMS0luZGV4ICs9IFRWQ0xLQkFTRV8zMDA7Ci0gIAkgICBlbHNlIAkgICAgICAgICAgICAgICAgICAgIFZDTEtJbmRleCArPSBUVkNMS0JBU0VfMzE1OworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgVkNMS0luZGV4ICs9IFRWQ0xLQkFTRV8zMDA7CisJICAgZWxzZQkJCQkgICBWQ0xLSW5kZXggKz0gVFZDTEtCQVNFXzMxNTsKIAotICAgICAgICB9IGVsc2UgeyAgICAgICAgIAkJCQkJCS8qIFZHQTIgKi8KKwl9IGVsc2UgewkJCQkJCQkvKiBWR0EyICovCiAKLQkgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU47Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0JCSBpZiggKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApICYmCi0JCSAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSkgeworCSAgIFZDTEtJbmRleCA9IFZDTEtJbmRleEdFTkNSVDsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICAgICBpZihNb2RlTm8gPiAweDEzKSB7CisJCSBpZiggKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgJiYKKwkJICAgICAoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpIHsKIAkJICAgIGlmKFZDTEtJbmRleCA9PSAweDE0KSBWQ0xLSW5kZXggPSAweDM0OwogCQkgfQogCQkgLyogQmV0dGVyIFZHQTIgY2xvY2sgZm9yIDEyODB4MTAyNEA3NSAqLwogCQkgaWYoVkNMS0luZGV4ID09IDB4MTcpIFZDTEtJbmRleCA9IDB4NDU7CiAJICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkgICB9CisJfQogCiAgICAgIH0gZWxzZSB7ICAgLyogSWYgbm90IHByb2dyYW1taW5nIENSVDIgKi8KIAotICAgICAgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU47Ci0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0JICAgICAgaWYoIChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfNjMwKSAmJgotCQkgIChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfMzAwKSApIHsKKwlWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU5DUlQ7CisJaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJICAgaWYoTW9kZU5vID4gMHgxMykgeworCSAgICAgIGlmKCAoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNjMwKSAmJgorCQkgIChTaVNfUHItPkNoaXBUeXBlICE9IFNJU18zMDApICkgewogCQkgaWYoVkNMS0luZGV4ID09IDB4MWIpIFZDTEtJbmRleCA9IDB4NDg7CiAJICAgICAgfQogCSAgIH0KLSAgICAgICAgfQorCX0KICAgICAgfQogCiAgIH0gZWxzZSB7ICAgICAgIC8qICAgTFZEUyAgKi8KQEAgLTIyODgsMTIgKzIzMjIsMTIgQEAKIAogICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSB7CiAKLSAgICAgICAgaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgKSB7CisJaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgKSB7CiAKIAkgICBWQ0xLSW5kZXggJj0gMHgxZjsKLSAgICAgICAgICAgdGVtcGJ4ID0gMDsKKwkgICB0ZW1wYnggPSAwOwogCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgdGVtcGJ4ICs9IDE7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKIAkgICAgICB0ZW1wYnggKz0gMjsKIAkgICAgICBpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKIAkJIGlmKFNpU19Qci0+U2lTX0NIU092ZXJTY2FuKSB0ZW1wYnggPSA4OwpAQCAtMjMwNiw2NiArMjM0MCw2OCBAQAogCQkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSB0ZW1wYnggKz0gMTsKIAkgICAgICB9CiAJICAgfQotICAgICAgIAkgICBzd2l0Y2godGVtcGJ4KSB7Ci0gICAgICAgICAgICAgY2FzZSAgMDogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VOVFNDOyAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAgMTogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09OVFNDOyAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAgMjogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VQQUw7ICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAgMzogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09QQUw7ICAgYnJlYWs7CisJICAgc3dpdGNoKHRlbXBieCkgeworCSAgICAgY2FzZSAgMDogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VOVFNDOyAgYnJlYWs7CisJICAgICBjYXNlICAxOiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT05UU0M7ICBicmVhazsKKwkgICAgIGNhc2UgIDI6IENIVFZWQ0xLUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlZDTEtVUEFMOyAgIGJyZWFrOworCSAgICAgY2FzZSAgMzogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09QQUw7ICAgYnJlYWs7CiAJICAgICBjYXNlICA0OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLVVBBTE07ICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICA1OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT1BBTE07ICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICA2OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLVVBBTE47ICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICA3OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT1BBTE47ICBicmVhazsKKwkgICAgIGNhc2UgIDU6IENIVFZWQ0xLUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlZDTEtPUEFMTTsgIGJyZWFrOworCSAgICAgY2FzZSAgNjogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS1VQQUxOOyAgYnJlYWs7CisJICAgICBjYXNlICA3OiBDSFRWVkNMS1B0ciA9IFNpU19Qci0+U2lTX0NIVFZWQ0xLT1BBTE47ICBicmVhazsKIAkgICAgIGNhc2UgIDg6IENIVFZWQ0xLUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlZDTEtTT1BBTDsgIGJyZWFrOwogCSAgICAgZGVmYXVsdDogQ0hUVlZDTEtQdHIgPSBTaVNfUHItPlNpU19DSFRWVkNMS09QQUw7ICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgVkNMS0luZGV4ID0gQ0hUVlZDTEtQdHJbVkNMS0luZGV4XTsKKwkgICB9CisJICAgVkNMS0luZGV4ID0gQ0hUVlZDTEtQdHJbVkNMS0luZGV4XTsKIAotICAgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCSAgICAgIFZDTEtJbmRleCA9IFNpU19Qci0+UGFuZWxWQ0xLSWR4MzAwOwogCSAgIH0gZWxzZSB7CiAJICAgICAgVkNMS0luZGV4ID0gU2lTX1ByLT5QYW5lbFZDTEtJZHgzMTU7CiAJICAgfQogCisjaWZkZWYgU0lTMzAwCiAJICAgLyogU3BlY2lhbCBUaW1pbmc6IEJhcmNvIGlRIFBybyBSIHNlcmllcyAqLwogCSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgVkNMS0luZGV4ID0gMHg0NDsKIAotCSAgIC8qIFNwZWNpYWwgVGltaW5nOiA4NDh4NDgwIHBhcmFsbGVsIGx2ZHMgKi8KLQkgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgewotCSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICAvKiBTcGVjaWFsIFRpbWluZzogODQ4eDQ4MCBhbmQgODU2eDQ4MCBwYXJhbGxlbCBsdmRzIHBhbmVscyAqLworCSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODQ4IHx8IFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSB7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAJCSBWQ0xLSW5kZXggPSBWQ0xLMzRfMzAwOwotCSAgICAgICAgIC8qIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEzNjB4NzY4KSBWQ0xLSW5kZXggPSA/OyAqLworCQkgLyogaWYocmVzaW5mbyA9PSBTSVNfUklfMTM2MHg3NjgpIFZDTEtJbmRleCA9ID87ICovCiAJICAgICAgfSBlbHNlIHsKIAkJIFZDTEtJbmRleCA9IFZDTEszNF8zMTU7CiAJCSAvKiBpZihyZXNpbmZvID09IFNJU19SSV8xMzYweDc2OCkgVkNMS0luZGV4ID0gPzsgKi8KIAkgICAgICB9CiAJICAgfQorI2VuZGlmCiAKLSAgICAgICAgfSBlbHNlIHsKKwl9IGVsc2UgewogCi0JICAgVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOOwotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgICAgICAgaWYoTW9kZU5vID4gMHgxMykgewotCQkgaWYoIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjMwKSAmJgotICAgICAgICAgICAgICAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIHsKKwkgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU5DUlQ7CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJICAgICAgaWYoTW9kZU5vID4gMHgxMykgeworCQkgaWYoIChTaVNfUHItPkNoaXBUeXBlID09IFNJU182MzApICYmCisJCSAgICAgKFNpU19Qci0+Q2hpcFJldmlzaW9uID49IDB4MzApICkgewogCQkgICAgaWYoVkNMS0luZGV4ID09IDB4MTQpIFZDTEtJbmRleCA9IDB4MmU7Ci0JICAgICAgICAgfQotICAgICAgICAgICAgICB9CisJCSB9CisJICAgICAgfQogCSAgIH0KLSAgICAgICAgfQorCX0KIAogICAgICB9IGVsc2UgeyAgLyogaWYgbm90IHByb2dyYW1taW5nIENSVDIgKi8KIAotICAgICAgICBWQ0xLSW5kZXggPSBWQ0xLSW5kZXhHRU47Ci0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0JICAgICAgaWYoIChId0luZm8tPmpDaGlwVHlwZSAhPSBTSVNfNjMwKSAmJgotCSAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzMwMCkgKSB7CisJVkNMS0luZGV4ID0gVkNMS0luZGV4R0VOQ1JUOworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKE1vZGVObyA+IDB4MTMpIHsKKwkgICAgICBpZiggKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzYzMCkgJiYKKwkJICAoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfMzAwKSApIHsKIAkJIGlmKFZDTEtJbmRleCA9PSAweDFiKSBWQ0xLSW5kZXggPSAweDQ4OwogCSAgICAgIH0KICNpZiAwCi0JICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgeworCSAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkgewogCQkgaWYoVkNMS0luZGV4ID09IDB4MGIpIFZDTEtJbmRleCA9IDB4NDA7ICAgLyogMTAyNHg3NjgtNzAgKi8KIAkJIGlmKFZDTEtJbmRleCA9PSAweDBkKSBWQ0xLSW5kZXggPSAweDQxOyAgIC8qIDEwMjR4NzY4LTc1ICovCiAJICAgICAgfQpAQCAtMjM3NywxMSArMjQxMywxMyBAQAogCiAgIH0KIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiVkNMS0luZGV4ICVkICgweCV4KVxuIiwgVkNMS0luZGV4LCBWQ0xLSW5kZXgpOwogI2VuZGlmCisjZW5kaWYKIAotICByZXR1cm4oVkNMS0luZGV4KTsKKyAgcmV0dXJuIFZDTEtJbmRleDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzODksMjYgKzI0MjcsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q1JUMk1vZGVSZWdzKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQyTW9kZVJlZ3Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCBpLGosbW9kZWZsYWc7Ci0gIFVTSE9SVCB0ZW1wY2wsdGVtcGFoPTA7CisgIHVuc2lnbmVkIHNob3J0IGksIGosIG1vZGVmbGFnLCB0ZW1wYWg9MDsKKyAgc2hvcnQgdGVtcGNsOwogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCi0gIFVTSE9SVCB0ZW1wYmw7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBibDsKICNlbmRpZgogI2lmZGVmIFNJUzMxNUgKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgdGVtcGFoMiwgdGVtcGJsMjsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYWgyLCB0ZW1wYmwyOwogI2VuZGlmCiAKLSAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICB9IGVsc2UgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5DTW9kZUZsYWc7Ci0gIH0gZWxzZSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gIH0KKyAgbW9kZWZsYWcgPSBTaVNfR2V0TW9kZUZsYWcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CiAKQEAgLTI0MTgsMTggKzI0NDksMTggQEAKICAgfSBlbHNlIHsKIAogICAgICBmb3IoaT0wLGo9NDsgaTwzOyBpKyssaisrKSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxqLDApOwotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHg3Rik7CiAgICAgIH0KIAogICAgICB0ZW1wY2wgPSBTaVNfUHItPlNpU19Nb2RlVHlwZTsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgIC8qIC0tLS0gMzAwIHNlcmllcyAtLS0tICovCiAKLSAgICAgICAgLyogRm9yIDMwMUJESDogKHdpdGggTENEIHZpYSBMVkRTKSAqLwotICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgeworCS8qIEZvciAzMDFCREg6ICh3aXRoIExDRCB2aWEgTFZEUykgKi8KKwlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewogCSAgIHRlbXBibCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyKTsKIAkgICB0ZW1wYmwgJj0gMHhlZjsKIAkgICB0ZW1wYmwgfD0gMHgwMjsKQEAgLTI0MzgsMTYgKzI0NjksMTYgQEAKIAkgICAgICB0ZW1wYmwgJj0gMHhmZDsKIAkgICB9CiAJICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzIsdGVtcGJsKTsKLSAgICAgICAgfQorCX0KIAotICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgICAgICAgIHRlbXBjbCAtPSBNb2RlVkdBOwotICAgICAgICAgICBpZigodGVtcGNsID4gMCkgfHwgKHRlbXBjbCA9PSAwKSkgeyAgICAgIC8qIHRlbXBjbCBpcyBVU0hPUlQgLT4gYWx3YXlzIHRydWUhICovCi0gICAgICAgICAgICAgIHRlbXBhaCA9ICgoMHgxMCA+PiB0ZW1wY2wpIHwgMHg4MCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHRlbXBhaCA9IDB4ODA7CisJaWYoTW9kZU5vID4gMHgxMykgeworCSAgIHRlbXBjbCAtPSBNb2RlVkdBOworCSAgIGlmKHRlbXBjbCA+PSAwKSB7CisJICAgICAgdGVtcGFoID0gKCgweDEwID4+IHRlbXBjbCkgfCAweDgwKTsKKwkgICB9CisJfSBlbHNlIHRlbXBhaCA9IDB4ODA7CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICB0ZW1wYWggXj0gMHhBMDsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgIHRlbXBhaCBePSAweEEwOwogCiAjZW5kaWYgIC8qIFNJUzMwMCAqLwogCkBAIC0yNDU1LDIyICsyNDg2LDE2IEBACiAKICNpZmRlZiBTSVMzMTVIICAgIC8qIC0tLS0tLS0gMzE1LzMzMCBzZXJpZXMgLS0tLS0tICovCiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgewotCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDA4KTsKLSAgICAgICAgICAgfQotICAgICAgICB9CisJaWYoTW9kZU5vID4gMHgxMykgeworCSAgIHRlbXBjbCAtPSBNb2RlVkdBOworCSAgIGlmKHRlbXBjbCA+PSAwKSB7CisJICAgICAgdGVtcGFoID0gKDB4MDggPj4gdGVtcGNsKTsKKwkgICAgICBpZiAodGVtcGFoID09IDApIHRlbXBhaCA9IDE7CisJICAgICAgdGVtcGFoIHw9IDB4NDA7CisJICAgfQorCX0gZWxzZSB0ZW1wYWggPSAweDQwOwogCi0gICAgICAgIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgICAgdGVtcGNsIC09IE1vZGVWR0E7Ci0gICAgICAgICAgIGlmKCh0ZW1wY2wgPiAwKSB8fCAodGVtcGNsID09IDApKSB7ICAvKiB0ZW1wY2wgaXMgVVNIT1JUIC0+IGFsd2F5cyB0cnVlISAqLwotICAgICAgICAgICAgICB0ZW1wYWggPSAoMHgwOCA+PiB0ZW1wY2wpOwotICAgICAgICAgICAgICBpZiAodGVtcGFoID09IDApIHRlbXBhaCA9IDE7Ci0gICAgICAgICAgICAgIHRlbXBhaCB8PSAweDQwOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB0ZW1wYWggPSAweDQwOwotCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB0ZW1wYWggXj0gMHg1MDsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgdGVtcGFoIF49IDB4NTA7CiAKICNlbmRpZiAgLyogU0lTMzE1SCAqLwogCkBAIC0yNDc4LDg0ICsyNTAzLDg5IEBACiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSB0ZW1wYWggPSAwOwogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCx0ZW1wYWgpOworICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLHRlbXBhaCk7CiAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4YTAsdGVtcGFoKTsKLSAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7Ci0gICAgICAgICAgIGlmKElTX1NJUzc0MCkgeworI2lmZGVmIFNJUzMxNUgKKwlpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7CisJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4YTAsdGVtcGFoKTsKKwl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKwkgICBpZihJU19TSVM3NDApIHsKIAkgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLHRlbXBhaCk7CiAJICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4YTAsdGVtcGFoKTsKKwkgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHhhMCx0ZW1wYWgpOwogCSAgIH0KLSAgICAgICAgfQorCX0KKyNlbmRpZgogICAgICB9CiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICAgICB0ZW1wYWggPSAweDAxOwotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewotICAgICAgCSAgIHRlbXBhaCB8PSAweDAyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgewotICAgICAgCSAgIHRlbXBhaCBePSAweDA1OwotICAgICAgCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgewotICAgICAgICAgICAgICB0ZW1wYWggXj0gMHgwMTsKLSAgICAgIAkgICB9Ci0gICAgICAgIH0KKwl0ZW1wYWggPSAweDAxOworCWlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CisJICAgdGVtcGFoIHw9IDB4MDI7CisJfQorCWlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgeworCSAgIHRlbXBhaCBePSAweDA1OworCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgeworCSAgICAgIHRlbXBhaCBePSAweDAxOworCSAgIH0KKwl9CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSAgdGVtcGFoID0gMDsKKwlpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSAgdGVtcGFoID0gMDsKIAotICAgICAgCSAgIHRlbXBhaCA9ICh0ZW1wYWggPDwgNSkgJiAweEZGOwotICAgICAgCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsdGVtcGFoKTsKLSAgICAgIAkgICB0ZW1wYWggPSAodGVtcGFoID4+IDUpICYgMHhGRjsKKwkgICB0ZW1wYWggPSAodGVtcGFoIDw8IDUpICYgMHhGRjsKKwkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLHRlbXBhaCk7CisJICAgdGVtcGFoID0gKHRlbXBhaCA+PiA1KSAmIDB4RkY7CiAKLSAgICAgICAgfSBlbHNlIHsKKwl9IGVsc2UgewogCi0gICAgICAJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJFLDB4RjgsdGVtcGFoKTsKKwkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpICB0ZW1wYWggPSAweDA4OworCSAgIGVsc2UgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSkgICAgICAgICAgIHRlbXBhaCB8PSAweDA4OworCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSwweEYwLHRlbXBhaCk7CisJICAgdGVtcGFoICY9IH4weDA4OwogCi0gICAgICAgIH0KKwl9CiAKLSAgICAgICAgaWYoKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVWR0EpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkpIHsKLSAgICAgIAkgICB0ZW1wYWggfD0gMHgxMDsKLSAgICAgICAgfQorCWlmKChTaVNfUHItPlNpU19Nb2RlVHlwZSA9PSBNb2RlVkdBKSAmJiAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpKSB7CisJICAgdGVtcGFoIHw9IDB4MTA7CisJfQogCiAJdGVtcGFoIHw9IDB4ODA7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMSkgeworCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMSkgewogCSAgIGlmKFNpU19Qci0+UGFuZWxYUmVzIDwgMTI4MCAmJiBTaVNfUHItPlBhbmVsWVJlcyA8IDk2MCkgdGVtcGFoICY9IH4weDgwOwotICAgICAgICB9CisJfQogCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKIAkgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIChUVlNldFlQYlByNzUwcCB8IFRWU2V0WVBiUHI1MjVwKSkpIHsKLSAgICAgIAkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotICAgICAgICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKKwkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCQkgdGVtcGFoIHw9IDB4MjA7CiAJICAgICAgfQotICAgICAgCSAgIH0KLSAgICAgICAgfQorCSAgIH0KKwl9CiAKLSAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBELDB4NDAsdGVtcGFoKTsKKwlTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MEQsMHg0MCx0ZW1wYWgpOwogCiAJdGVtcGFoID0gMHg4MDsKIAlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDEpIHsKIAkgICBpZihTaVNfUHItPlBhbmVsWFJlcyA8IDEyODAgJiYgU2lTX1ByLT5QYW5lbFlSZXMgPCA5NjApIHRlbXBhaCA9IDA7CiAJfQogCi0JaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYWggfD0gMHg0MDsKKwlpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wYWggfD0gMHg0MDsKIAotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZSUExMRElWMlhPKSB7Ci0gICAgICAgICAgICAgIHRlbXBhaCB8PSAweDQwOwotICAgICAgIAkgICB9Ci0gICAgICAgIH0KKwkgICAgICB0ZW1wYWggfD0gMHg0MDsKKwkgICB9CisJfQogCi0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MEMsdGVtcGFoKTsKKwlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBDLHRlbXBhaCk7CiAKICAgICAgfSBlbHNlIHsgIC8qIExWRFMgKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAogI2lmZGVmIFNJUzMxNUgKIAkgICAvKiBMVkRTIGNhbiBvbmx5IGJlIHNsYXZlIGluIDhicHAgbW9kZXMgKi8KQEAgLTI1NjYsMzYgKzI1OTYsMzAgQEAKIAkgICAgICB9CiAJICAgfQogCi0JICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFoIHw9IDB4MDI7Ci0gICAgCSAgIH0KKwkgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgIHRlbXBhaCB8PSAweDAyOwogCi0JICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLQkgICAgICB0ZW1wYWggXj0gMHgwMTsKLQkgICB9CisJICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpICAgICAgICB0ZW1wYWggXj0gMHgwMTsKIAotCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgewotCSAgICAgIHRlbXBhaCA9IDE7Ci0JICAgfQorCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgdGVtcGFoID0gMTsKIAotICAgIAkgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmUsMHhGMCx0ZW1wYWgpOworCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweEYwLHRlbXBhaCk7CiAjZW5kaWYKIAotICAgICAgICB9IGVsc2UgeworCX0gZWxzZSB7CiAKICNpZmRlZiBTSVMzMDAKIAkgICB0ZW1wYWggPSAwOwogCSAgIGlmKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpICYmIChTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpICkgewotICAgICAgICAgICAgICB0ZW1wYWggfD0gMHgwMjsKLSAgICAJICAgfQorCSAgICAgIHRlbXBhaCB8PSAweDAyOworCSAgIH0KIAkgICB0ZW1wYWggPDw9IDU7CiAKLQkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpICB0ZW1wYWggPSAwOworCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgdGVtcGFoID0gMDsKIAogCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsdGVtcGFoKTsKICNlbmRpZgogCi0gICAgICAgIH0KKwl9CiAKICAgICAgfQogCkBAIC0yNjAzLDEwICsyNjI3LDEwIEBACiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAKICNpZmRlZiBTSVMzMTVICi0gICAgICAgIHVuc2lnbmVkIGNoYXIgYnJpZGdlcmV2ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwMSk7CisJLyogdW5zaWduZWQgY2hhciBicmlkZ2VyZXYgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDAxKTsgKi8KIAogCS8qIFRoZSBmb2xsb3dpbmcgaXMgbmVhcmx5IHVucHJlZGl0YWJsZSBhbmQgdmFyaWVzIGZyb20gbWFjaGluZQogCSAqIHRvIG1hY2hpbmUuIEVzcGVjaWFsbHkgdGhlIDMwMURIIHNlZW1zIHRvIGJlIGEgcmVhbCB0cm91YmxlCkBAIC0yNjE5LDI1ICsyNjQzLDI4IEBACiAKIAkvKiA3NDAgdmFyaWFudHMgbWF0Y2ggZm9yIDMweEIsIDMwMUItREgsIDMweExWICovCiAKLSAgICAgICAgaWYoIShJU19TSVM3NDApKSB7Ci0gICAgICAgICAgIHRlbXBhaCA9IDB4MDQ7CQkJCQkJICAgLyogRm9yIGFsbCBicmlkZ2VzICovCi0gICAgICAgICAgIHRlbXBibCA9IDB4ZmI7Ci0gICAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFoID0gMHgwMDsKLQkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHsKKwlpZighKElTX1NJUzc0MCkpIHsKKwkgICB0ZW1wYWggPSAweDA0OwkJCQkJCSAgIC8qIEZvciBhbGwgYnJpZGdlcyAqLworCSAgIHRlbXBibCA9IDB4ZmI7CisJICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworCSAgICAgIHRlbXBhaCA9IDB4MDA7CisJICAgICAgaWYoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkgewogCSAgICAgICAgIHRlbXBibCA9IDB4ZmY7CiAJICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMyx0ZW1wYmwsdGVtcGFoKTsKKwkgICB9CisJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLHRlbXBibCx0ZW1wYWgpOwogCX0KIAogCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGFyZSByZXNwb25zaWJsZSBmb3IgZXZlbnR1YWxseSB3cm9uZyBjb2xvcnMKIAkgKiBpbiBUViBvdXRwdXQuIFRoZSBESCAoVkJfTm9MQ0QpIGNvbmRpdGlvbnMgYXJlIHVua25vd247IHRoZQogCSAqIGIwIHdhcyBmb3VuZCBpbiBzb21lIDY1MSBtYWNoaW5lIChQaW07IFA0XzIzPTB4ZTUpOyB0aGUgYjEgdmVyc2lvbgogCSAqIGluIGEgNjUwIGJveCAoSmFrZSkuIFdoYXQgaXMgdGhlIGNyaXRlcmlhPworCSAqIEFkZGVuZHVtOiBBbm90aGVyIGNvbWJpbmF0aW9uIDY1MSszMDFCLURIKGIxKSAoUmFwbykgbmVlZHMgc2FtZQorCSAqIHRyZWF0bWVudCBsaWtlIHRoZSA2NTErMzAxQi1ESChiMCkgY2FzZS4gU2VlbXMgbW9yZSB0byBiZSB0aGUKKwkgKiBjaGlwc2V0IHRoYW4gdGhlIGJyaWRnZSByZXZpc2lvbi4KIAkgKi8KIAotCWlmKChJU19TSVM3NDApIHx8IChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB8fCAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgeworCWlmKChJU19TSVM3NDApIHx8IChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHx8IChTaVNfUHItPlNpU19ST01OZXcpKSB7CiAJICAgdGVtcGFoID0gMHgzMDsKIAkgICB0ZW1wYmwgPSAweGMwOwogCSAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHx8CkBAIC0yNjQ5LDIwICsyNjc2LDMwIEBACiAJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIxLDB4M2YsdGVtcGJsKTsKIAl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7CiAJICAgLyogRml4ZXMgIlRWLWJsdWUtYnVnIiBvbiAzMTUrMzAxICovCi0JICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyYywweGNmKTsgICAgIC8qIEZvciAzMDEgICAqLworCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHhjZik7CS8qIEZvciAzMDEgICAqLwogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjEsMHgzZik7Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHgzMCk7ICAgICAgLyogRm9yIDMweExWICovCisJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHgzMCk7CS8qIEZvciAzMHhMViAqLwogCSAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMSwweGMwKTsKLQl9IGVsc2UgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoYnJpZGdlcmV2ID09IDB4YjApKSB7Ci0JICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJjLDB4MzApOyAgICAgIC8qIEZvciAzMHhCLURIIHJldiBiMCAob3IgIkRIIG9uIDY1MSI/KSAqLwotCSAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMSwweGMwKTsKKwl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpIHsJCS8qIEZvciAzMDFCLURIICovCisJICAgdGVtcGFoID0gMHgzMDsgdGVtcGFoMiA9IDB4YzA7CisJICAgdGVtcGJsID0gMHhjZjsgdGVtcGJsMiA9IDB4M2Y7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZCbHVlID09IDApIHsKKwkgICAgICAgICB0ZW1wYWggPSB0ZW1wYWgyID0gMHgwMDsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZCbHVlID09IC0xKSB7CisJICAgICAgLyogU2V0IG9uIDY1MS9NNjUwLCBjbGVhciBvbiAzMTUvNjUwICovCisJICAgICAgaWYoIShJU19TSVM2NXgpKSAvKiAoYnJpZGdlcmV2ICE9IDB4YjApICovIHsKKwkgICAgICAgICB0ZW1wYWggPSB0ZW1wYWgyID0gMHgwMDsKKwkgICAgICB9CisJICAgfQorCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyYyx0ZW1wYmwsdGVtcGFoKTsKKwkgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjEsdGVtcGJsMix0ZW1wYWgyKTsKIAl9IGVsc2UgewotCSAgIHRlbXBhaCA9IDB4MzA7IHRlbXBhaDIgPSAweGMwOwkJICAgICAgIC8qIEZvciAzMHhCIChhbmQgMzAxQkRIIHJldiBiMSkgKi8KKwkgICB0ZW1wYWggPSAweDMwOyB0ZW1wYWgyID0gMHhjMDsJCSAgICAgICAvKiBGb3IgMzB4QiwgMzAxQyAqLwogCSAgIHRlbXBibCA9IDB4Y2Y7IHRlbXBibDIgPSAweDNmOwogCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKIAkgICAgICB0ZW1wYWggPSB0ZW1wYWgyID0gMHgwMDsKLQkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHsKKwkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSB7CiAJCSB0ZW1wYmwgPSB0ZW1wYmwyID0gMHhmZjsKIAkgICAgICB9CiAJICAgfQpAQCAtMjY3NiwyMyArMjcxMywyMyBAQAogCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMywweDdmLHRlbXBhaCk7CiAJfSBlbHNlIHsKIAkgICB0ZW1wYWggPSAweDAwOwotICAgICAgICAgICB0ZW1wYmwgPSAweDdmOwotICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7Ci0gICAgICAgICAgICAgIHRlbXBibCA9IDB4ZmY7Ci0JICAgICAgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpKSB0ZW1wYWggPSAweDgwOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMyx0ZW1wYmwsdGVtcGFoKTsKKwkgICB0ZW1wYmwgPSAweDdmOworCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKKwkgICAgICB0ZW1wYmwgPSAweGZmOworCSAgICAgIGlmKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHRlbXBhaCA9IDB4ODA7CisJICAgfQorCSAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMyx0ZW1wYmwsdGVtcGFoKTsKIAl9CiAKICNlbmRpZiAvKiBTSVMzMTVIICovCiAKLSAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAKICNpZmRlZiBTSVMzMDAKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyMSwweDNmKTsKKwlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIxLDB4M2YpOwogCi0gICAgICAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHx8Ci0gICAgICAgICAgICgoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmCisJaWYoKFNpU19Qci0+U2lTX1ZCSW5mbyAmIERpc2FibGVDUlQyRGlzcGxheSkgfHwKKwkgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJgogCSAgICAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkpIHsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDIzLDB4N0YpOwogCX0gZWxzZSB7CkBAIC0yNzAyLDkgKzI3MzksOSBAQAogCiAgICAgIH0KIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBELDB4ODApOwotICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFDKSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwRCwweDgwKTsKKwlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDTFYpIHsKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M0EsMHhDMCk7CiAgICAgICAgIH0KICAgICAgfQpAQCAtMjcxMiwxNiArMjc0OSwxNiBAQAogICB9IGVsc2UgeyAgLyogTFZEUyAqLwogCiAjaWZkZWYgU0lTMzE1SAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CiAKLSAgICAgICAgICAgdGVtcGFoID0gMHgwNDsKKwkgICB0ZW1wYWggPSAweDA0OwogCSAgIHRlbXBibCA9IDB4ZmI7Ci0gICAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFoID0gMHgwMDsKLQkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHRlbXBibCA9IDB4ZmY7Ci0gICAgICAgICAgIH0KKwkgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CisJICAgICAgdGVtcGFoID0gMHgwMDsKKwkgICAgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSB0ZW1wYmwgPSAweGZmOworCSAgIH0KIAkgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsdGVtcGJsLHRlbXBhaCk7CiAKIAkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBEaXNhYmxlQ1JUMkRpc3BsYXkpIHsKQEAgLTI3MzAsNyArMjc2Nyw3IEBACiAKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmMsMHgzMCk7CiAKLQl9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzU1MCkgeworCX0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU181NTApIHsKIAogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsMHhmYik7CiAJICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJjLDB4MzApOwpAQCAtMjc0OCwyMTIgKzI3ODUsMTIwIEBACiAvKiAgICAgICAgICAgIEdFVCBSRVNPTFVUSU9OIERBVEEgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotVVNIT1JUCi1TaVNfR2V0UmVzSW5mbyhTaVNfUHJpdmF0ZSAqU2lTX1ByLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4KQordW5zaWduZWQgc2hvcnQKK1NpU19HZXRSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBpZihNb2RlTm8gPD0gMHgxMykgcmV0dXJuKChVU0hPUlQpU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9SZXNJbmZvKTsKLSAgZWxzZSAgICAgICAgICAgICAgIHJldHVybigoVVNIT1JUKVNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk8pOworICAgaWYoTW9kZU5vIDw9IDB4MTMpCisgICAgICByZXR1cm4gKCh1bnNpZ25lZCBzaG9ydClTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X1Jlc0luZm8pOworICAgZWxzZQorICAgICAgcmV0dXJuICgodW5zaWduZWQgc2hvcnQpU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfUkVTSU5GTyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMlJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0dldENSVDJSZXNJbmZvKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgeHJlcyx5cmVzLG1vZGVmbGFnPTAscmVzaW5kZXg7CisgICB1bnNpZ25lZCBzaG9ydCB4cmVzLCB5cmVzLCBtb2RlZmxhZz0wLCByZXNpbmRleDsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OwotICAgICBpZihTaVNfUHItPkNNb2RlRmxhZyAmIEhhbGZEQ0xLKSB4cmVzICo9IDI7Ci0gICAgIFNpU19Qci0+U2lTX1ZHQUhERSA9IFNpU19Qci0+U2lTX0hERSA9IHhyZXM7Ci0gICAgIHlyZXMgPSBTaVNfUHItPkNWRGlzcGxheTsKLSAgICAgaWYoU2lTX1ByLT5DTW9kZUZsYWcgJiBEb3VibGVTY2FuTW9kZSkgeXJlcyAqPSAyOwotICAgICBTaVNfUHItPlNpU19WR0FWREUgPSBTaVNfUHItPlNpU19WREUgPSB5cmVzOwotICAgICByZXR1cm47Ci0gIH0KKyAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgeworICAgICAgeHJlcyA9IFNpU19Qci0+Q0hEaXNwbGF5OworICAgICAgaWYoU2lTX1ByLT5DTW9kZUZsYWcgJiBIYWxmRENMSykgeHJlcyA8PD0gMTsKKyAgICAgIFNpU19Qci0+U2lTX1ZHQUhERSA9IFNpU19Qci0+U2lTX0hERSA9IHhyZXM7CisgICAgICAvKiBEb3VibGVTY2FuTW9kZS1jaGVjayBkb25lIGluIENoZWNrQ2FsY0N1c3RvbU1vZGUoKSEgKi8KKyAgICAgIFNpU19Qci0+U2lTX1ZHQVZERSA9IFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+Q1ZEaXNwbGF5OworICAgICAgcmV0dXJuOworICAgfQogCi0gIHJlc2luZGV4ID0gU2lTX0dldFJlc0luZm8oU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICByZXNpbmRleCA9IFNpU19HZXRSZXNJbmZvKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpOwogCi0gIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0gICAgIHhyZXMgPSBTaVNfUHItPlNpU19TdFJlc0luZm9bcmVzaW5kZXhdLkhUb3RhbDsKLSAgICAgeXJlcyA9IFNpU19Qci0+U2lTX1N0UmVzSW5mb1tyZXNpbmRleF0uVlRvdGFsOwotICB9IGVsc2UgewotICAgICB4cmVzID0gU2lTX1ByLT5TaVNfTW9kZVJlc0luZm9bcmVzaW5kZXhdLkhUb3RhbDsKLSAgICAgeXJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gIH0KKyAgIGlmKE1vZGVObyA8PSAweDEzKSB7CisgICAgICB4cmVzID0gU2lTX1ByLT5TaVNfU3RSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7CisgICAgICB5cmVzID0gU2lTX1ByLT5TaVNfU3RSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7CisgICB9IGVsc2UgeworICAgICAgeHJlcyA9IFNpU19Qci0+U2lTX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5IVG90YWw7CisgICAgICB5cmVzID0gU2lTX1ByLT5TaVNfTW9kZVJlc0luZm9bcmVzaW5kZXhdLlZUb3RhbDsKKyAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CisgICB9CiAKLSAgaWYoIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROICYmICFTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgeworICAgaWYoIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROICYmICFTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgewogCi0gICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpKSB7Ci0gICAgICAgIGlmKChNb2RlTm8gIT0gMHgwMykgJiYgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSkgewotICAgICAgICAgICBpZih5cmVzID09IDM1MCkgeXJlcyA9IDQwMDsKLSAgICAgICAgfQotICAgICAgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzYSkgJiAweDAxKSB7Ci0gCSAgIGlmKE1vZGVObyA9PSAweDEyKSB5cmVzID0gNDAwOwotICAgICAgICB9Ci0gICAgIH0KKyAgICAgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkpIHsKKwkgaWYoKE1vZGVObyAhPSAweDAzKSAmJiAoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSB7CisJICAgIGlmKHlyZXMgPT0gMzUwKSB5cmVzID0gNDAwOworCSB9CisJIGlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDNhKSAmIDB4MDEpIHsKKwkgICAgaWYoTW9kZU5vID09IDB4MTIpIHlyZXMgPSA0MDA7CisJIH0KKyAgICAgIH0KIAotICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICB4cmVzICo9IDI7Ci0gICAgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHlyZXMgKj0gMjsKKyAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgICAgIHhyZXMgPDw9IDE7CisgICAgICBpZihtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKSB5cmVzIDw8PSAxOwogCi0gIH0KKyAgIH0KIAotICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpICYmICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkpIHsKKyAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgJiYgKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpKSkgewogCi0jaWYgMAotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEQSB8IFNldENSVDJUb0xDRCB8IFNldENSVDJUb0hpVmlzaW9uKSkgewotICAgICAgICAgICBpZih4cmVzID09IDcyMCkgeHJlcyA9IDY0MDsKLQl9Ci0jZW5kaWYKLQotCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKKwkgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKIAkgICBjYXNlIFBhbmVsXzEwMjR4NzY4OgogCSAgICAgIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpKSB7Ci0gICAgICAgICAgICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpKSB7Ci0gICAgICAgICAgCSAgICBpZih5cmVzID09IDM1MCkgeXJlcyA9IDM1NzsKLSAgICAgICAgICAJICAgIGlmKHlyZXMgPT0gNDAwKSB5cmVzID0gNDIwOwotICAgICAgICAgICAgCSAgICBpZih5cmVzID09IDQ4MCkgeXJlcyA9IDUyNTsKLSAgICAgICAgCSB9Ci0gICAgICAJICAgICAgfQorCQkgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkpIHsKKwkJICAgIGlmKHlyZXMgPT0gMzUwKSB5cmVzID0gMzU3OworCQkgICAgaWYoeXJlcyA9PSA0MDApIHlyZXMgPSA0MjA7CisJCSAgICBpZih5cmVzID09IDQ4MCkgeXJlcyA9IDUyNTsKKwkJIH0KKwkgICAgICB9CiAJICAgICAgYnJlYWs7CiAJICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6CiAJICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkpIHsKIAkJIC8qIEJJT1MgYnVnIC0gZG9lcyB0aGlzIHJlZ2FyZGxlc3Mgb2Ygc2NhbGluZyAqLwotICAgICAgCQkgaWYoeXJlcyA9PSA0MDApIHlyZXMgPSA0MDU7CisJCSBpZih5cmVzID09IDQwMCkgeXJlcyA9IDQwNTsKIAkgICAgICB9Ci0gICAgICAJICAgICAgaWYoeXJlcyA9PSAzNTApIHlyZXMgPSAzNjA7Ci0gICAgICAJICAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpIHsKLSAgICAgICAgICAgICAgICAgaWYoeXJlcyA9PSAzNjApIHlyZXMgPSAzNzU7Ci0gICAgICAJICAgICAgfQorCSAgICAgIGlmKHlyZXMgPT0gMzUwKSB5cmVzID0gMzYwOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSB7CisJCSBpZih5cmVzID09IDM2MCkgeXJlcyA9IDM3NTsKKwkgICAgICB9CiAJICAgICAgYnJlYWs7CiAJICAgY2FzZSBQYW5lbF8xNjAweDEyMDA6CiAJICAgICAgaWYoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpIHsKLSAgICAgICAgCSBpZih5cmVzID09IDEwMjQpIHlyZXMgPSAxMDU2OwotICAgICAgCSAgICAgIH0KKwkJIGlmKHlyZXMgPT0gMTAyNCkgeXJlcyA9IDEwNTY7CisJICAgICAgfQogCSAgICAgIGJyZWFrOwotCSAgIH0KLQl9CisJIH0KKyAgICAgIH0KIAotICB9IGVsc2UgeworICAgfSBlbHNlIHsKIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvSGlWaXNpb24pKSB7Ci0gICAgICAgICAgIGlmKHhyZXMgPT0gNzIwKSB4cmVzID0gNjQwOwotCX0KLSAgICAgfSBlbHNlIGlmKHhyZXMgPT0gNzIwKSB4cmVzID0gNjQwOworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0hpVmlzaW9uKSkgeworCSAgICBpZih4cmVzID09IDcyMCkgeHJlcyA9IDY0MDsKKwkgfQorICAgICAgfSBlbHNlIGlmKHhyZXMgPT0gNzIwKSB4cmVzID0gNjQwOwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSB7Ci0JeXJlcyA9IDQwMDsKLSAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTcpICYgMHg4MCkgeXJlcyA9IDQ4MDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg4MCkgeXJlcyA9IDQ4MDsKLSAgICAgICAgfQotICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfRFNUTiB8fCBTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgIHlyZXMgPSA0ODA7Ci0gICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSB7CisJIHlyZXMgPSA0MDA7CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTcpICYgMHg4MCkgeXJlcyA9IDQ4MDsKKwkgfSBlbHNlIHsKKwkgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg4MCkgeXJlcyA9IDQ4MDsKKwkgfQorCSBpZihTaVNfUHItPlNpU19JRl9ERUZfRFNUTiB8fCBTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgeXJlcyA9IDQ4MDsKKyAgICAgIH0KIAotICB9Ci0gIFNpU19Qci0+U2lTX1ZHQUhERSA9IFNpU19Qci0+U2lTX0hERSA9IHhyZXM7Ci0gIFNpU19Qci0+U2lTX1ZHQVZERSA9IFNpU19Qci0+U2lTX1ZERSA9IHlyZXM7CisgICB9CisgICBTaVNfUHItPlNpU19WR0FIREUgPSBTaVNfUHItPlNpU19IREUgPSB4cmVzOworICAgU2lTX1ByLT5TaVNfVkdBVkRFID0gU2lTX1ByLT5TaVNfVkRFID0geXJlczsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICBHRVQgQ1JUMiBUSU1JTkcgREFUQSAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgQk9PTEVBTgotU2lTX0dldExWRFNDUlQxUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLQkJICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgVVNIT1JUICpSZXNJbmRleCwKLQkJICAgVVNIT1JUICpEaXNwbGF5VHlwZSkKLSB7Ci0gIFVTSE9SVCBtb2RlZmxhZz0wOwotCi0gIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKLSAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgcmV0dXJuIEZBTFNFOwotICAgICB9Ci0gIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgICAgcmV0dXJuIEZBTFNFOwotICB9IGVsc2UKLSAgICAgcmV0dXJuIEZBTFNFOwotCi0gIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0gICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLSAgICAgKCpSZXNJbmRleCkgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X0NSVDJDUlRDOwotICB9IGVsc2UgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwotICAgICAoKlJlc0luZGV4KSA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOwotICB9Ci0KLSAgKCpSZXNJbmRleCkgJj0gMHgzRjsKLQotICBpZigoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgewotICAgICAoKkRpc3BsYXlUeXBlKSA9IDE4OwotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pICgqRGlzcGxheVR5cGUpKys7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gICAgICAJKCpEaXNwbGF5VHlwZSkgKz0gMjsKLQlpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKLQkgICBpZihTaVNfUHItPlNpU19DSFNPdmVyU2NhbikgKCpEaXNwbGF5VHlwZSkgPSA5OTsKLQl9Ci0JaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSB7Ci0JICAgKCpEaXNwbGF5VHlwZSkgPSAxODsgIC8qIFBBTE0gdXNlcyBOVFNDIGRhdGEgKi8KLQkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pICgqRGlzcGxheVR5cGUpKys7Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgewotCSAgICgqRGlzcGxheVR5cGUpID0gMjA7ICAvKiBQQUxOIHVzZXMgUEFMIGRhdGEgICovCi0JICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSAoKkRpc3BsYXlUeXBlKSsrOwotCX0KLSAgICAgfQotICB9IGVsc2UgewotICAgICBzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgewotICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6ICAgKCpEaXNwbGF5VHlwZSkgPSA1MDsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfNjQweDQ4MF8yOiAoKkRpc3BsYXlUeXBlKSA9IDUyOyBicmVhazsKLSAgICAgY2FzZSBQYW5lbF82NDB4NDgwXzM6ICgqRGlzcGxheVR5cGUpID0gNTQ7IGJyZWFrOwotICAgICBjYXNlIFBhbmVsXzgwMHg2MDA6ICAgKCpEaXNwbGF5VHlwZSkgPSAgMDsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfMTAyNHg2MDA6ICAoKkRpc3BsYXlUeXBlKSA9IDIzOyBicmVhazsKLSAgICAgY2FzZSBQYW5lbF8xMDI0eDc2ODogICgqRGlzcGxheVR5cGUpID0gIDQ7IGJyZWFrOwotICAgICBjYXNlIFBhbmVsXzExNTJ4NzY4OiAgKCpEaXNwbGF5VHlwZSkgPSAyNzsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfMTI4MHg3Njg6ICAoKkRpc3BsYXlUeXBlKSA9IDQwOyBicmVhazsKLSAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6ICgqRGlzcGxheVR5cGUpID0gIDg7IGJyZWFrOwotICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MDogKCpEaXNwbGF5VHlwZSkgPSAxNDsgYnJlYWs7Ci0gICAgIGNhc2UgUGFuZWxfMTYwMHgxMjAwOiAoKkRpc3BsYXlUeXBlKSA9IDM2OyBicmVhazsKLSAgICAgZGVmYXVsdDogcmV0dXJuIEZBTFNFOwotICAgICB9Ci0KLSAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgKCpEaXNwbGF5VHlwZSkrKzsKLQotICAgICBzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgewotICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6Ci0gICAgIGNhc2UgUGFuZWxfNjQweDQ4MF8yOgotICAgICBjYXNlIFBhbmVsXzY0MHg0ODBfMzoKLSAgICAgICAgYnJlYWs7Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSAoKkRpc3BsYXlUeXBlKSArPSAyOwotICAgICB9Ci0KLSAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgewotICAgICAgICAoKkRpc3BsYXlUeXBlKSA9IDEyOwotCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspICgqRGlzcGxheVR5cGUpKys7Ci0gICAgIH0KLSAgfQotCi0jaWYgMAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgewotICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFNpU19Qci0+U2lTX1BhbmVsMzIweDQ4MCl7Ci0gICAgICAgICgqRGlzcGxheVR5cGUpID0gMjI7Ci0gICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMlB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LAotCSAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFVTSE9SVCAqQ1JUMkluZGV4LFVTSE9SVCAqUmVzSW5kZXgsCi0JICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCB1bnNpZ25lZCBzaG9ydCAqQ1JUMkluZGV4LAorCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqUmVzSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wYng9MCx0ZW1wYWw9MCxyZXNpbmZvPTA7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBieD0wLCB0ZW1wYWw9MCwgcmVzaW5mbz0wOwogCiAgIGlmKE1vZGVObyA8PSAweDEzKSB7CiAgICAgIHRlbXBhbCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CkBAIC0yOTY2LDE4ICsyOTExLDIwIEBACiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExDRCAqLwogCi0gICAgICAgIHRlbXBieCA9IFNpU19Qci0+U2lTX0xDRFJlc0luZm87CisJdGVtcGJ4ID0gU2lTX1ByLT5TaVNfTENEUmVzSW5mbzsKIAlpZighKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSkgdGVtcGJ4ICs9IDMyOwogCisJLyogcGF0Y2ggaW5kZXggKi8KIAlpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2ODB4MTA1MCkgewogCSAgIGlmICAgICAocmVzaW5mbyA9PSBTSVNfUklfMTI4MHg4MDApICB0ZW1wYWwgPSAgOTsKIAkgICBlbHNlIGlmKHJlc2luZm8gPT0gU0lTX1JJXzE0MDB4MTA1MCkgdGVtcGFsID0gMTE7CiAJfSBlbHNlIGlmKChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4ODAwKSB8fAotCSAgICAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDgwMF8yKSkgeworCQkgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4ODAwXzIpIHx8CisJCSAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHg4NTQpKSB7CiAJICAgaWYgICAgIChyZXNpbmZvID09IFNJU19SSV8xMjgweDc2OCkgIHRlbXBhbCA9ICA5OwogCX0KIAotICAJaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKwlpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewogCSAgIC8qIFBhc3MgMToxIG9ubHkgKGNlbnRlci1zY3JlZW4gaGFuZGxlZCBvdXRzaWRlKSAqLwogCSAgIC8qIFRoaXMgaXMgbmV2ZXIgY2FsbGVkIGZvciB0aGUgcGFuZWwncyBuYXRpdmUgcmVzb2x1dGlvbiAqLwogCSAgIC8qIHNpbmNlIFBhc3MxOjEgd2lsbCBub3QgYmUgc2V0IGluIHRoaXMgY2FzZSAqLwpAQCAtMjk5MSw4ICsyOTM4LDggQEAKIAlpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9DT01QQVExMjgwKSB7CiAJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHsKIAkgICAgICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgewotCSAgICAgICAgIHRlbXBieCA9IDIwMDsKLQkgICAgICAgICBpZighKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSkgdGVtcGJ4Kys7CisJCSB0ZW1wYnggPSAyMDA7CisJCSBpZighKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSkgdGVtcGJ4Kys7CiAJICAgICAgfQogCSAgIH0KIAl9CkBAIC0zMDAwLDIzICsyOTQ3LDIzIEBACiAKICAgICAgfSBlbHNlIHsJCQkJCQkgIAkvKiBUViAqLwogCi0gICAgIAlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgewotICAgICAgICAgICAvKiBpZihTaVNfUHItPlNpU19WR0FWREUgPiA0ODApIFNpU19Qci0+U2lTX1RWTW9kZSAmPSAoflRWU2V0VFZTaW11TW9kZSk7ICovCi0gICAgICAgICAgIHRlbXBieCA9IDI7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgICAvKiBpZihTaVNfUHItPlNpU19WR0FWREUgPiA0ODApIFNpU19Qci0+U2lTX1RWTW9kZSAmPSAoflRWU2V0VFZTaW11TW9kZSk7ICovCisJICAgdGVtcGJ4ID0gMjsKKwkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewogCSAgICAgIHRlbXBieCA9IDEzOwotICAgICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkpIHRlbXBieCA9IDE0OwotICAgICAgICAgICB9CisJICAgICAgaWYoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpKSB0ZW1wYnggPSAxNDsKKwkgICB9CiAJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApICAgICAgdGVtcGJ4ID0gNzsKLQkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSB0ZW1wYnggPSA2OwotCSAgIGVsc2UgCQkJCQl0ZW1wYnggPSA1OwotCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgICAgIHRlbXBieCArPSA1OwotICAgICAgIAl9IGVsc2UgewotICAgICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkgCQl0ZW1wYnggPSAzOwotICAgICAgICAgICBlbHNlIAkJCQkJdGVtcGJ4ID0gNDsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSAJdGVtcGJ4ICs9IDU7Ci0gICAgICAgCX0KKwkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkJdGVtcGJ4ID0gNzsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKQl0ZW1wYnggPSA2OworCSAgIGVsc2UJCQkJCQl0ZW1wYnggPSA1OworCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkJdGVtcGJ4ICs9IDU7CisJfSBlbHNlIHsKKwkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkJCXRlbXBieCA9IDM7CisJICAgZWxzZQkJCQkJCXRlbXBieCA9IDQ7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKQl0ZW1wYnggKz0gNTsKKwl9CiAKICAgICAgfQogCkBAIC0zMDI0LDI2ICsyOTcxLDM0IEBACiAKICAgICAgaWYoTW9kZU5vID4gMHgxMykgewogICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVk5vSGlWaXNpb24pIHsKLSAgICAgIAkgICBpZih0ZW1wYWwgPT0gNikgdGVtcGFsID0gNzsKLSAgICAgICAgICAgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg0ODApIHx8Ci0JICAgICAgKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg1NzYpIHx8Ci0JICAgICAgKHJlc2luZm8gPT0gU0lTX1JJXzc2OHg1NzYpKSB7CisJICAgc3dpdGNoKHJlc2luZm8pIHsKKwkgICBjYXNlIFNJU19SSV83MjB4NDgwOgogCSAgICAgIHRlbXBhbCA9IDY7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0UEFMIHwgVFZTZXRQQUxOKSkgewotCSAgICAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg0ODApIHRlbXBhbCA9IDk7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0UEFMIHwgVFZTZXRQQUxOKSkJdGVtcGFsID0gOTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIFNJU19SSV83MjB4NTc2OgorCSAgIGNhc2UgU0lTX1JJXzc2OHg1NzY6CisJICAgY2FzZSBTSVNfUklfMTAyNHg1NzY6IC8qIE5vdCBpbiBOVFNDIG9yIFlQQlBSIG1vZGUgKGV4Y2VwdCAxMDgwaSkhICovCisJICAgICAgdGVtcGFsID0gNjsKKwkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCQkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApCXRlbXBhbCA9IDg7CiAJICAgICAgfQotCSAgIH0KLQkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgewotCSAgICAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NzY4KSB0ZW1wYWwgPSA4OworCSAgICAgIGJyZWFrOworCSAgIGNhc2UgU0lTX1JJXzgwMHg0ODA6CisJICAgICAgdGVtcGFsID0gNDsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIFNJU19SSV81MTJ4Mzg0OgorCSAgIGNhc2UgU0lTX1JJXzEwMjR4NzY4OgorCSAgICAgIHRlbXBhbCA9IDc7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKKwkJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKQl0ZW1wYWwgPSA4OwogCSAgICAgIH0KLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgewotCQkgaWYoKHJlc2luZm8gPT0gU0lTX1JJXzcyMHg1NzYpIHx8Ci0JICAgICAgICAgICAgKHJlc2luZm8gPT0gU0lTX1JJXzc2OHg1NzYpKSB7Ci0JICAgICAgICAgICAgdGVtcGFsID0gODsKLQkgICAgICAgICB9Ci0JCSBpZihyZXNpbmZvID09IFNJU19SSV8xMjgweDcyMCkgdGVtcGFsID0gOTsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIFNJU19SSV8xMjgweDcyMDoKKwkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgeworCQkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApCXRlbXBhbCA9IDk7CiAJICAgICAgfQorCSAgICAgIGJyZWFrOwogCSAgIH0KIAl9CiAgICAgIH0KQEAgLTMwNTYsNjUgKzMwMTEsNjAgQEAKICAgICAgdGVtcGJ4ID0gMDsKICAgICAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHgpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHsKIAotICAgICAgICB0ZW1wYnggPSAxMDsKLQlpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHRlbXBieCArPSAxOwotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkgewotCSAgIHRlbXBieCArPSAyOworCXRlbXBieCA9IDkwOworCWlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7CisJICAgdGVtcGJ4ID0gOTI7CiAJICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPiBNb2RlVkdBKSB7CiAJICAgICAgaWYoU2lTX1ByLT5TaVNfQ0hTT3ZlclNjYW4pIHRlbXBieCA9IDk5OwogCSAgIH0KLQkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE0pIHsKLQkgICAgICB0ZW1wYnggPSA5MDsKLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHRlbXBieCArPSAxOwotCSAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE4pIHsKLQkgICAgICB0ZW1wYnggPSA5MjsKLQkgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHRlbXBieCArPSAxOwotCSAgIH0KLSAgICAgICAgfQorCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgICAgICB0ZW1wYnggPSA5NDsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgdGVtcGJ4ID0gOTY7CisJfQorCWlmKHRlbXBieCAhPSA5OSkgeworCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgdGVtcGJ4Kys7CisJfQogCiAgICAgIH0gZWxzZSB7CiAKLSAgICAgICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKLQljYXNlIFBhbmVsXzY0MHg0ODA6ICAgdGVtcGJ4ID0gNjsgIGJyZWFrOwotCWNhc2UgUGFuZWxfNjQweDQ4MF8yOgotCWNhc2UgUGFuZWxfNjQweDQ4MF8zOiB0ZW1wYnggPSAzMDsgYnJlYWs7Ci0JY2FzZSBQYW5lbF84MDB4NjAwOiAgIHRlbXBieCA9IDA7ICBicmVhazsKLQljYXNlIFBhbmVsXzEwMjR4NjAwOiAgdGVtcGJ4ID0gMTU7IGJyZWFrOwotCWNhc2UgUGFuZWxfMTAyNHg3Njg6ICB0ZW1wYnggPSAyOyAgYnJlYWs7Ci0JY2FzZSBQYW5lbF8xMTUyeDc2ODogIHRlbXBieCA9IDE3OyBicmVhazsKLQljYXNlIFBhbmVsXzEyODB4NzY4OiAgdGVtcGJ4ID0gMTg7IGJyZWFrOwotCWNhc2UgUGFuZWxfMTI4MHgxMDI0OiB0ZW1wYnggPSA0OyAgYnJlYWs7Ci0JY2FzZSBQYW5lbF8xNDAweDEwNTA6IHRlbXBieCA9IDg7ICBicmVhazsKLQljYXNlIFBhbmVsXzE2MDB4MTIwMDogdGVtcGJ4ID0gMjE7IGJyZWFrOworCXN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisJY2FzZSBQYW5lbF82NDB4NDgwOiAgIHRlbXBieCA9IDEyOyBicmVhazsKKwljYXNlIFBhbmVsXzMyMHgyNDBfMTogdGVtcGJ4ID0gMTA7IGJyZWFrOworCWNhc2UgUGFuZWxfMzIweDI0MF8yOgorCWNhc2UgUGFuZWxfMzIweDI0MF8zOiB0ZW1wYnggPSAxNDsgYnJlYWs7CisJY2FzZSBQYW5lbF84MDB4NjAwOiAgIHRlbXBieCA9IDE2OyBicmVhazsKKwljYXNlIFBhbmVsXzEwMjR4NjAwOiAgdGVtcGJ4ID0gMTg7IGJyZWFrOworCWNhc2UgUGFuZWxfMTE1Mng3Njg6CisJY2FzZSBQYW5lbF8xMDI0eDc2ODogIHRlbXBieCA9IDIwOyBicmVhazsKKwljYXNlIFBhbmVsXzEyODB4NzY4OiAgdGVtcGJ4ID0gMjI7IGJyZWFrOworCWNhc2UgUGFuZWxfMTI4MHgxMDI0OiB0ZW1wYnggPSAyNDsgYnJlYWs7CisJY2FzZSBQYW5lbF8xNDAweDEwNTA6IHRlbXBieCA9IDI2OyBicmVhazsKKwljYXNlIFBhbmVsXzE2MDB4MTIwMDogdGVtcGJ4ID0gMjg7IGJyZWFrOworI2lmZGVmIFNJUzMwMAogCWNhc2UgUGFuZWxfQmFyY28xMzY2OiB0ZW1wYnggPSA4MDsgYnJlYWs7CisjZW5kaWYKIAl9CiAKIAlzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgeworCWNhc2UgUGFuZWxfMzIweDI0MF8xOgorCWNhc2UgUGFuZWxfMzIweDI0MF8yOgorCWNhc2UgUGFuZWxfMzIweDI0MF8zOgogCWNhc2UgUGFuZWxfNjQweDQ4MDoKLQljYXNlIFBhbmVsXzY0MHg0ODBfMjoKLQljYXNlIFBhbmVsXzY0MHg0ODBfMzoKIAkgICBicmVhazsKIAlkZWZhdWx0OgogCSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB0ZW1wYngrKzsKIAl9CiAKLQlpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSB0ZW1wYnggPSA3OworCWlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHRlbXBieCA9IDMwOwogCisjaWZkZWYgU0lTMzAwCiAJaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSB7CiAJICAgdGVtcGJ4ID0gODI7CiAJICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHRlbXBieCsrOwotCX0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgeworCX0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCB8fCBTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgewogCSAgIHRlbXBieCA9IDg0OwogCSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB0ZW1wYngrKzsKIAl9Ci0KLQlpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCAhPSBDVVRfQkFSQ08xMzY2KSAmJgotICAgICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpKSB7Ci0gICAgICAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYKLQkgICAgICAoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkpIHsKLSAgICAgICAgICAgICAgdGVtcGFsID0gMDsKLQkgICB9Ci0gICAgICAgIH0KKyNlbmRpZgogCiAgICAgIH0KIApAQCAtMzEyNCwxMiArMzA3NCwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX0dldFJBTURBQzJEQVRBKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0dldFJBTURBQzJEQVRBKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wYXg9MCx0ZW1wYng9MDsKLSAgVVNIT1JUIHRlbXAxPTAsbW9kZWZsYWc9MCx0ZW1wY3g9MDsKLSAgVVNIT1JUIGluZGV4OworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXg9MCwgdGVtcGJ4PTAsIGluZGV4LCBkb3RjbG9jazsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcDE9MCwgbW9kZWZsYWc9MCwgdGVtcGN4PTA7CiAKICAgU2lTX1ByLT5TaVNfUlZCSENNQVggID0gMTsKICAgU2lTX1ByLT5TaVNfUlZCSENGQUNUID0gMTsKQEAgLTMxNDMsMTAgKzMwOTIsMTIgQEAKICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfU3RhbmRUYWJsZVtpbmRleF0uQ1JUQ1s2XTsKICAgICAgdGVtcDEgPSBTaVNfUHItPlNpU19TdGFuZFRhYmxlW2luZGV4XS5DUlRDWzddOwogCisgICAgIGRvdGNsb2NrID0gKG1vZGVmbGFnICYgQ2hhcng4RG90KSA/IDggOiA5OworCiAgIH0gZWxzZSB7CiAKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLSAgICAgaW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQxQ1JUQzsKKyAgICAgaW5kZXggPSBTaVNfR2V0UmVmQ1JUMUNSVEMoU2lTX1ByLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFNpU19Qci0+U2lTX1VzZVdpZGVDUlQyKTsKIAogICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzBdOwogICAgICB0ZW1wYXggfD0gKFNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMTRdIDw8IDgpOwpAQCAtMzE1OCwyMiArMzEwOSwxNiBAQAogICAgICB0ZW1wYnggfD0gdGVtcGN4OwogICAgICB0ZW1wMSAgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbaW5kZXhdLkNSWzddOwogCisgICAgIGRvdGNsb2NrID0gODsKKwogICB9CiAKICAgaWYodGVtcDEgJiAweDAxKSB0ZW1wYnggfD0gMHgwMTAwOwogICBpZih0ZW1wMSAmIDB4MjApIHRlbXBieCB8PSAweDAyMDA7CiAKICAgdGVtcGF4ICs9IDU7Ci0KLSAgLyogQ2hhcng4RG90IGlzIG5vIG1vcmUgdXNlZCAoYW5kIGFzc3VtZWQpLCBzbyB3ZSBzZXQgaXQgKi8KLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7Ci0gICAgIG1vZGVmbGFnIHw9IENoYXJ4OERvdDsKLSAgfQotCi0gIGlmKG1vZGVmbGFnICYgQ2hhcng4RG90KSB0ZW1wYXggKj0gODsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgIHRlbXBheCAqPSA5OwotCi0gIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICB0ZW1wYXggPDw9IDE7CisgIHRlbXBheCAqPSBkb3RjbG9jazsKKyAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGF4IDw8PSAxOwogCiAgIHRlbXBieCsrOwogCkBAIC0zMTgyLDEzICszMTI3LDU2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMkRhdGFMVkRTKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfQ2FsY1BhbmVsTGlua1RpbWluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICAgVVNIT1JUIENSVDJJbmRleCwgUmVzSW5kZXg7Ci0gICBjb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgKkxWRFNEYXRhID0gTlVMTDsKKyAgIHVuc2lnbmVkIHNob3J0IFJlc0luZGV4OwogCi0gICBTaVNfR2V0Q1JUMlJlc0luZm8oU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8pOworICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHsKKwkgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJICAgIFJlc0luZGV4ID0gU2lTX1ByLT5DSFRvdGFsOworCSAgICBpZihTaVNfUHItPkNNb2RlRmxhZyAmIEhhbGZEQ0xLKSBSZXNJbmRleCA8PD0gMTsKKwkgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IFJlc0luZGV4OworCSAgICBTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+U2lTX1ZUID0gU2lTX1ByLT5DVlRvdGFsOworCSB9IGVsc2UgeworCSAgICBpZihNb2RlTm8gPCAweDEzKSB7CisJICAgICAgIFJlc0luZGV4ID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgUmVzSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQ19OUzsKKwkgICAgfQorCSAgICBpZihSZXNJbmRleCA9PSAweDA5KSB7CisJICAgICAgIGlmKFNpU19Qci0+QWx0ZXJuYXRlMTYwMHgxMjAwKSAgICAgICAgUmVzSW5kZXggPSAweDIwOyAvKiAxNjAweDEyMDAgTENEQSAqLworCSAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIFJlc0luZGV4ID0gMHgyMTsgLyogMTYwMHgxMjAwIExWRFMgKi8KKwkgICAgfQorCSAgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhW1Jlc0luZGV4XS5WR0FIVDsKKwkgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19Ob1NjYWxlRGF0YVtSZXNJbmRleF0uVkdBVlQ7CisJICAgIFNpU19Qci0+U2lTX0hUICAgID0gU2lTX1ByLT5TaVNfTm9TY2FsZURhdGFbUmVzSW5kZXhdLkxDREhUOworCSAgICBTaVNfUHItPlNpU19WVCAgICA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhW1Jlc0luZGV4XS5MQ0RWVDsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IFNpU19Qci0+UGFuZWxIVDsKKwkgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19WVCA9IFNpU19Qci0+UGFuZWxWVDsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBUaGlzIGhhbmRsZXMgY3VzdG9tIG1vZGVzIGFuZCBjdXN0b20gcGFuZWxzICovCisgICAgICBTaVNfUHItPlNpU19IREUgPSBTaVNfUHItPlBhbmVsWFJlczsKKyAgICAgIFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+UGFuZWxZUmVzOworICAgICAgU2lTX1ByLT5TaVNfSFQgID0gU2lTX1ByLT5QYW5lbEhUOworICAgICAgU2lTX1ByLT5TaVNfVlQgID0gU2lTX1ByLT5QYW5lbFZUOworICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlBhbmVsSFQgLSAoU2lTX1ByLT5QYW5lbFhSZXMgLSBTaVNfUHItPlNpU19WR0FIREUpOworICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlBhbmVsVlQgLSAoU2lTX1ByLT5QYW5lbFlSZXMgLSBTaVNfUHItPlNpU19WR0FWREUpOworICAgfQorfQorCitzdGF0aWMgdm9pZAorU2lTX0dldENSVDJEYXRhTFZEUyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQoreworICAgdW5zaWduZWQgc2hvcnQgQ1JUMkluZGV4LCBSZXNJbmRleCwgYmFja3VwOworICAgY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YSAqTFZEU0RhdGEgPSBOVUxMOworCisgICBTaVNfR2V0Q1JUMlJlc0luZm8oU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAogICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKICAgICAgIFNpU19Qci0+U2lTX1JWQkhDTUFYICA9IDE7CkBAIC0zMTk5LDEzMyArMzE4Nyw5NCBAQAogICAgICAgU2lTX1ByLT5TaVNfUlkyQ09FID0gMDsKICAgICAgIFNpU19Qci0+U2lTX1JZM0NPRSA9IDA7CiAgICAgICBTaVNfUHItPlNpU19SWTRDT0UgPSAwOworICAgICAgU2lTX1ByLT5TaVNfUlZCSFJTMiA9IDA7CiAgICB9CiAKICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CiAKICNpZmRlZiBTSVMzMTVICi0gICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgewotCSAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLQkgICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IFNpU19Qci0+Q0hUb3RhbDsKLQkgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19WVCA9IFNpU19Qci0+Q1ZUb3RhbDsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgaWYoTW9kZU5vIDwgMHgxMykgewotCSAgICAgICAgICBSZXNJbmRleCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7Ci0JICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgIFJlc0luZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfQ1JUMkNSVENfTlM7Ci0JICAgICAgIH0KLQkgICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19Ob1NjYWxlRGF0YVtSZXNJbmRleF0uVkdBSFQ7Ci0gICAgICAgICAgICAgICBTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhW1Jlc0luZGV4XS5WR0FWVDsKLSAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0hUICAgID0gU2lTX1ByLT5TaVNfTm9TY2FsZURhdGFbUmVzSW5kZXhdLkxDREhUOwotICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgICAgPSBTaVNfUHItPlNpU19Ob1NjYWxlRGF0YVtSZXNJbmRleF0uTENEVlQ7Ci0JICAgIH0KLQkgfSBlbHNlIHsKLSAgICAgCSAgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+U2lTX0hUID0gU2lTX1ByLT5QYW5lbEhUOwotICAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlNpU19WVCA9IFNpU19Qci0+UGFuZWxWVDsKLQkgfQotICAgICAgfSBlbHNlIHsKLQkgLyogVGhpcyBoYW5kbGVzIGN1c3RvbSBtb2RlcyBhbmQgY3VzdG9tIHBhbmVscyAqLwotCSBTaVNfUHItPlNpU19IREUgPSBTaVNfUHItPlBhbmVsWFJlczsKLSAgICAgICAgIFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+UGFuZWxZUmVzOwotICAgICAgICAgU2lTX1ByLT5TaVNfSFQgID0gU2lTX1ByLT5QYW5lbEhUOwotICAgICAgICAgU2lTX1ByLT5TaVNfVlQgID0gU2lTX1ByLT5QYW5lbFZUOwotCSBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+UGFuZWxIVCAtIChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX1ZHQUhERSk7Ci0JIFNpU19Qci0+U2lTX1ZHQVZUID0gU2lTX1ByLT5QYW5lbFZUIC0gKFNpU19Qci0+UGFuZWxZUmVzIC0gU2lTX1ByLT5TaVNfVkdBVkRFKTsKLSAgICAgIH0KLQotICAgICAgU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KTsKLQorICAgICAgU2lTX0NhbGNQYW5lbExpbmtUaW1pbmcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICAgU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogI2VuZGlmCiAKICAgIH0gZWxzZSB7CiAKICAgICAgIC8qIDMwMUJESCBuZWVkcyBMVkRTIERhdGEgKi8KKyAgICAgIGJhY2t1cCA9IFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTOwogICAgICAgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgewogCSBTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9IDE7CiAgICAgICB9CiAKICAgICAgIFNpU19HZXRDUlQyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgCQkmQ1JUMkluZGV4LCAmUmVzSW5kZXgsIEh3SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgICAgICZDUlQySW5kZXgsICZSZXNJbmRleCk7CiAKLSAgICAgIC8qIDMwMUJESCBuZWVkcyBMVkRTIERhdGEgKi8KLSAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkpIHsKLSAgICAgICAgIFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID0gMDsKLSAgICAgIH0KKyAgICAgIFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID0gYmFja3VwOwogCi0gICAgICBzd2l0Y2ggKENSVDJJbmRleCkgewotICAgICAgCSBjYXNlICAwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM4MDB4NjAwRGF0YV8xOyAgICBicmVhazsKLQkgY2FzZSAgMTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTODAweDYwMERhdGFfMjsgICAgYnJlYWs7Ci0gICAgICAJIGNhc2UgIDI6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEwMjR4NzY4RGF0YV8xOyAgIGJyZWFrOwotCSBjYXNlICAzOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMDI0eDc2OERhdGFfMjsgICBicmVhazsKLSAgICAgIAkgY2FzZSAgNDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTI4MHgxMDI0RGF0YV8xOyAgYnJlYWs7Ci0gICAgICAJIGNhc2UgIDU6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEyODB4MTAyNERhdGFfMjsgIGJyZWFrOwotCSBjYXNlICA2OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8xOyAgICBicmVhazsKLSAgICAgICAgIGNhc2UgIDc6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEU1hYWHhYWFhEYXRhXzE7ICAgIGJyZWFrOwotCSBjYXNlICA4OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxNDAweDEwNTBEYXRhXzE7ICBicmVhazsKLQkgY2FzZSAgOTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTQwMHgxMDUwRGF0YV8yOyAgYnJlYWs7Ci0gICAgICAJIGNhc2UgMTA6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlVOVFNDRGF0YTsgICAgICAgIGJyZWFrOwotICAgICAgCSBjYXNlIDExOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZPTlRTQ0RhdGE7ICAgICAgICBicmVhazsKLSAgICAgIAkgY2FzZSAxMjogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVVBBTERhdGE7ICAgICAgICAgYnJlYWs7Ci0gICAgICAJIGNhc2UgMTM6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9QQUxEYXRhOyAgICAgICAgIGJyZWFrOwotICAgICAgCSBjYXNlIDE0OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMzMjB4NDgwRGF0YV8xOyAgICBicmVhazsKLQkgY2FzZSAxNTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTAyNHg2MDBEYXRhXzE7ICAgYnJlYWs7Ci0JIGNhc2UgMTY6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEwMjR4NjAwRGF0YV8yOyAgIGJyZWFrOwotCSBjYXNlIDE3OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMTUyeDc2OERhdGFfMTsgICBicmVhazsKLQkgY2FzZSAxODogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTE1Mng3NjhEYXRhXzI7ICAgYnJlYWs7Ci0JIGNhc2UgMTk6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEyODB4NzY4RGF0YV8xOyAgIGJyZWFrOwotCSBjYXNlIDIwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMjgweDc2OERhdGFfMjsgICBicmVhazsKLQkgY2FzZSAyMTogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTYwMHgxMjAwRGF0YV8xOyAgYnJlYWs7Ci0JIGNhc2UgMjI6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzE2MDB4MTIwMERhdGFfMjsgIGJyZWFrOwotCSBjYXNlIDMwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8yOyAgICBicmVhazsKKyAgICAgIHN3aXRjaChDUlQySW5kZXgpIHsKKwkgY2FzZSAxMDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMzIweDI0MERhdGFfMTsgICAgYnJlYWs7CisJIGNhc2UgMTQ6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzMyMHgyNDBEYXRhXzI7ICAgIGJyZWFrOworCSBjYXNlIDEyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM2NDB4NDgwRGF0YV8xOyAgICBicmVhazsKKwkgY2FzZSAxNjogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTODAweDYwMERhdGFfMTsgICAgYnJlYWs7CisJIGNhc2UgMTg6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzEwMjR4NjAwRGF0YV8xOyAgIGJyZWFrOworCSBjYXNlIDIwOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFMxMDI0eDc2OERhdGFfMTsgICBicmVhazsKKyNpZmRlZiBTSVMzMDAKIAkgY2FzZSA4MDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTQkFSQ08xMzY2RGF0YV8xOyAgYnJlYWs7CiAJIGNhc2UgODE6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEU0JBUkNPMTM2NkRhdGFfMjsgIGJyZWFrOwogCSBjYXNlIDgyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFNCQVJDTzEwMjREYXRhXzE7ICBicmVhazsKLQkgY2FzZSA4MzogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTQkFSQ08xMDI0RGF0YV8yOyAgYnJlYWs7CiAJIGNhc2UgODQ6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfTFZEUzg0OHg0ODBEYXRhXzE7ICAgIGJyZWFrOwogCSBjYXNlIDg1OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0xWRFM4NDh4NDgwRGF0YV8yOyAgICBicmVhazsKLQkgY2FzZSA5MDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVVBBTE1EYXRhOyAgICAgICAgYnJlYWs7Ci0gICAgICAJIGNhc2UgOTE6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9QQUxNRGF0YTsgICAgICAgIGJyZWFrOwotICAgICAgCSBjYXNlIDkyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZVUEFMTkRhdGE7ICAgICAgICBicmVhazsKLSAgICAgIAkgY2FzZSA5MzogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWT1BBTE5EYXRhOyAgICAgICAgYnJlYWs7Ci0JIGNhc2UgOTk6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlNPUEFMRGF0YTsJICAgICAgIGJyZWFrOyAgLyogU3VwZXIgT3ZlcnNjYW4gKi8KLQkgZGVmYXVsdDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19MVkRTMTAyNHg3NjhEYXRhXzE7ICAgYnJlYWs7CisjZW5kaWYKKwkgY2FzZSA5MDogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVU5UU0NEYXRhOyAgICAgICAgYnJlYWs7CisJIGNhc2UgOTE6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9OVFNDRGF0YTsgICAgICAgIGJyZWFrOworCSBjYXNlIDkyOiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZVUEFMRGF0YTsgICAgICAgICBicmVhazsKKwkgY2FzZSA5MzogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWT1BBTERhdGE7ICAgICAgICAgYnJlYWs7CisJIGNhc2UgOTQ6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlVQQUxNRGF0YTsgICAgICAgIGJyZWFrOworCSBjYXNlIDk1OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZPUEFMTURhdGE7ICAgICAgICBicmVhazsKKwkgY2FzZSA5NjogTFZEU0RhdGEgPSBTaVNfUHItPlNpU19DSFRWVVBBTE5EYXRhOyAgICAgICAgYnJlYWs7CisJIGNhc2UgOTc6IExWRFNEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVk9QQUxORGF0YTsgICAgICAgIGJyZWFrOworCSBjYXNlIDk5OiBMVkRTRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZTT1BBTERhdGE7CSAgICAgICBicmVhazsKICAgICAgIH0KIAotICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSAoTFZEU0RhdGErUmVzSW5kZXgpLT5WR0FIVDsKLSAgICAgIFNpU19Qci0+U2lTX1ZHQVZUID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+VkdBVlQ7Ci0gICAgICBTaVNfUHItPlNpU19IVCAgICA9IChMVkRTRGF0YStSZXNJbmRleCktPkxDREhUOwotICAgICAgU2lTX1ByLT5TaVNfVlQgICAgPSAoTFZEU0RhdGErUmVzSW5kZXgpLT5MQ0RWVDsKKyAgICAgIGlmKExWRFNEYXRhKSB7CisJIFNpU19Qci0+U2lTX1ZHQUhUID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+VkdBSFQ7CisJIFNpU19Qci0+U2lTX1ZHQVZUID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+VkdBVlQ7CisJIFNpU19Qci0+U2lTX0hUICAgID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+TENESFQ7CisJIFNpU19Qci0+U2lTX1ZUICAgID0gKExWRFNEYXRhK1Jlc0luZGV4KS0+TENEVlQ7CisgICAgICB9IGVsc2UgeworCSBTaVNfQ2FsY1BhbmVsTGlua1RpbWluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICB9CiAKLSAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpKSB7Ci0gICAgICAgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJiAoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkpIHsKLSAgICAgICAgICAgIGlmKCghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgfHwgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSkgewotCSAgICAgICBTaVNfUHItPlNpU19IREUgPSBTaVNfUHItPlBhbmVsWFJlczsKLSAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZERSA9IFNpU19Qci0+UGFuZWxZUmVzOwotCSAgICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEzNjYpIHsKLQkJICBpZihSZXNJbmRleCA8IDB4MDgpIHsKLQkJICAgICBTaVNfUHItPlNpU19IREUgPSAxMjgwOwotICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVkRFID0gMTAyNDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgIGlmKCAoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikpICYmCisJICAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJgorCSAgKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpICkgeworCSBpZiggKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpKSB8fAorCSAgICAgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSApIHsKKwkgICAgU2lTX1ByLT5TaVNfSERFID0gU2lTX1ByLT5QYW5lbFhSZXM7CisgICAgICAgICAgICBTaVNfUHItPlNpU19WREUgPSBTaVNfUHItPlBhbmVsWVJlczsKKyNpZmRlZiBTSVMzMDAKKwkgICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7CisJICAgICAgIGlmKFJlc0luZGV4IDwgMHgwOCkgeworCQkgIFNpU19Qci0+U2lTX0hERSA9IDEyODA7CisJCSAgU2lTX1ByLT5TaVNfVkRFID0gMTAyNDsKKwkgICAgICAgfQorCSAgICB9CisjZW5kaWYKICAgICAgICAgIH0KICAgICAgIH0KICAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19HZXRDUlQyRGF0YTMwMShTaVNfUHJpdmF0ZSAqU2lTX1ByLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCSAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMkRhdGEzMDEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gTlVMTDsKLSAgVVNIT1JUIHRlbXBheCx0ZW1wYngsbW9kZWZsYWcscm9tcHRyPTA7Ci0gIFVTSE9SVCByZXNpbmZvLENSVDJJbmRleCxSZXNJbmRleDsKLSAgY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgKkxDRFB0ciA9IE5VTEw7Ci0gIGNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgICpUVlB0ciAgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBheCwgdGVtcGJ4LCBtb2RlZmxhZywgcm9tcHRyPTA7CisgIHVuc2lnbmVkIHNob3J0IHJlc2luZm8sIENSVDJJbmRleCwgUmVzSW5kZXg7CisgIGNvbnN0IHN0cnVjdCBTaVNfTENERGF0YSAqTENEUHRyID0gTlVMTDsKKyAgY29uc3Qgc3RydWN0IFNpU19UVkRhdGEgICpUVlB0ciAgPSBOVUxMOwogI2lmZGVmIFNJUzMxNUgKLSAgU0hPUlQgIHJlc2luZm82NjE7CisgIHNob3J0IHJlc2luZm82NjE7CiAjZW5kaWYKIAogICBpZihNb2RlTm8gPD0gMHgxMykgewpAQCAtMzM0MCw2NyArMzI4OSw2OSBAQAogI2lmZGVmIFNJUzMxNUgKICAgICAgcmVzaW5mbzY2MSA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uUk9NTU9ERUlEWDY2MTsKICAgICAgaWYoIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICAgJiYKLSAgICAgICAgIChTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykgJiYKLSAgICAgICAgIChyZXNpbmZvNjYxID49IDApICAgICAgICAgICAgICAgICAgICAgJiYKKwkgKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSAmJgorCSAocmVzaW5mbzY2MSA+PSAwKSAgICAgICAgICAgICAgICAgICAgICYmCiAJIChTaVNfUHItPlNpU19OZWVkUm9tTW9kZURhdGEpICkgewotICAgICAgICBpZigoUk9NQWRkciA9IEdldExDRFN0cnVjdFB0cjY2MShTaVNfUHIsIEh3SW5mbykpKSB7CisJaWYoKFJPTUFkZHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjEoU2lTX1ByKSkpIHsKIAkgICBpZigocm9tcHRyID0gKFNJU0dFVFJPTVcoMjEpKSkpIHsKLSAgICAgICAgICAgICAgcm9tcHRyICs9IChyZXNpbmZvNjYxICogMTApOwotCSAgICAgIFJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7CisJICAgICAgcm9tcHRyICs9IChyZXNpbmZvNjYxICogMTApOworCSAgICAgIFJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCSAgIH0KIAl9CiAgICAgIH0KICNlbmRpZgogICB9Ci0gIAorCiAgIFNpU19Qci0+U2lTX05ld0ZsaWNrZXJNb2RlID0gMDsKICAgU2lTX1ByLT5TaVNfUlZCSFJTID0gNTA7CiAgIFNpU19Qci0+U2lTX1JZMUNPRSA9IDA7CiAgIFNpU19Qci0+U2lTX1JZMkNPRSA9IDA7CiAgIFNpU19Qci0+U2lTX1JZM0NPRSA9IDA7CiAgIFNpU19Qci0+U2lTX1JZNENPRSA9IDA7CisgIFNpU19Qci0+U2lTX1JWQkhSUzIgPSAwOwogCi0gIFNpU19HZXRDUlQyUmVzSW5mbyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LEh3SW5mbyk7CisgIFNpU19HZXRDUlQyUmVzSW5mbyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KTsKIAotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpeworICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKIAogICAgICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKIAotICAgICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAxOwotICAgICAgICBTaVNfUHItPlNpU19SVkJIQ0ZBQ1QgPSAxOwotICAgICAgICBTaVNfUHItPlNpU19WR0FIVCAgICAgPSBTaVNfUHItPkNIVG90YWw7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZHQVZUICAgICA9IFNpU19Qci0+Q1ZUb3RhbDsKLSAgICAgICAgU2lTX1ByLT5TaVNfSFQgICAgICAgID0gU2lTX1ByLT5DSFRvdGFsOwotICAgICAgICBTaVNfUHItPlNpU19WVCAgICAgICAgPSBTaVNfUHItPkNWVG90YWw7CisJU2lTX1ByLT5TaVNfUlZCSENNQVggID0gMTsKKwlTaVNfUHItPlNpU19SVkJIQ0ZBQ1QgPSAxOwogCVNpU19Qci0+U2lTX0hERSAgICAgICA9IFNpU19Qci0+U2lTX1ZHQUhERTsKLSAgICAgICAgU2lTX1ByLT5TaVNfVkRFICAgICAgID0gU2lTX1ByLT5TaVNfVkdBVkRFOworCVNpU19Qci0+U2lTX1ZERSAgICAgICA9IFNpU19Qci0+U2lTX1ZHQVZERTsKKworCXRlbXBheCA9IFNpU19Qci0+Q0hUb3RhbDsKKwlpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYXggPDw9IDE7CisJU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPlNpU19IVCA9IHRlbXBheDsKKwlTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+U2lTX1ZUID0gU2lTX1ByLT5DVlRvdGFsOwogCiAgICAgIH0gZWxzZSB7CiAKLSAgICAgICAgU2lTX0dldFJBTURBQzJEQVRBKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCVNpU19HZXRSQU1EQUMyREFUQShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKICAgICAgfQogCiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewogCiAgICAgIFNpU19HZXRDUlQyUHRyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAmQ1JUMkluZGV4LCZSZXNJbmRleCxId0luZm8pOworCQkgICAgJkNSVDJJbmRleCwmUmVzSW5kZXgpOwogCiAgICAgIHN3aXRjaChDUlQySW5kZXgpIHsKLSAgICAgICAgY2FzZSAgMjogVFZQdHIgPSBTaVNfUHItPlNpU19FeHRIaVRWRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgMzogVFZQdHIgPSBTaVNfUHItPlNpU19FeHRQQUxEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAgNDogVFZQdHIgPSBTaVNfUHItPlNpU19FeHROVFNDRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgNTogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ1MjVpRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgNjogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ1MjVwRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgNzogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ3NTBwRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAgODogVFZQdHIgPSBTaVNfUHItPlNpU19TdFBBTERhdGE7ICAgICBicmVhazsKLSAgICAgICAgY2FzZSAgOTogVFZQdHIgPSBTaVNfUHItPlNpU19TdE5UU0NEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogVFZQdHIgPSBTaVNfUHItPlNpU19TdDUyNWlEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTogVFZQdHIgPSBTaVNfUHItPlNpU19TdDUyNXBEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjogVFZQdHIgPSBTaVNfUHItPlNpU19TdDc1MHBEYXRhOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogVFZQdHIgPSBTaVNfUHItPlNpU19TdDFIaVRWRGF0YTsgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDogVFZQdHIgPSBTaVNfUHItPlNpU19TdDJIaVRWRGF0YTsgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogVFZQdHIgPSBTaVNfUHItPlNpU19TdFBBTERhdGE7ICAgICBicmVhazsKKwljYXNlICAyOiBUVlB0ciA9IFNpU19Qci0+U2lTX0V4dEhpVFZEYXRhOyAgIGJyZWFrOworCWNhc2UgIDM6IFRWUHRyID0gU2lTX1ByLT5TaVNfRXh0UEFMRGF0YTsgICAgYnJlYWs7CisJY2FzZSAgNDogVFZQdHIgPSBTaVNfUHItPlNpU19FeHROVFNDRGF0YTsgICBicmVhazsKKwljYXNlICA1OiBUVlB0ciA9IFNpU19Qci0+U2lTX0V4dDUyNWlEYXRhOyAgIGJyZWFrOworCWNhc2UgIDY6IFRWUHRyID0gU2lTX1ByLT5TaVNfRXh0NTI1cERhdGE7ICAgYnJlYWs7CisJY2FzZSAgNzogVFZQdHIgPSBTaVNfUHItPlNpU19FeHQ3NTBwRGF0YTsgICBicmVhazsKKwljYXNlICA4OiBUVlB0ciA9IFNpU19Qci0+U2lTX1N0UEFMRGF0YTsgICAgIGJyZWFrOworCWNhc2UgIDk6IFRWUHRyID0gU2lTX1ByLT5TaVNfU3ROVFNDRGF0YTsgICAgYnJlYWs7CisJY2FzZSAxMDogVFZQdHIgPSBTaVNfUHItPlNpU19TdDUyNWlEYXRhOyAgICBicmVhazsKKwljYXNlIDExOiBUVlB0ciA9IFNpU19Qci0+U2lTX1N0NTI1cERhdGE7ICAgIGJyZWFrOworCWNhc2UgMTI6IFRWUHRyID0gU2lTX1ByLT5TaVNfU3Q3NTBwRGF0YTsgICAgYnJlYWs7CisJY2FzZSAxMzogVFZQdHIgPSBTaVNfUHItPlNpU19TdDFIaVRWRGF0YTsgICBicmVhazsKKwljYXNlIDE0OiBUVlB0ciA9IFNpU19Qci0+U2lTX1N0MkhpVFZEYXRhOyAgIGJyZWFrOworCWRlZmF1bHQ6IFRWUHRyID0gU2lTX1ByLT5TaVNfU3RQQUxEYXRhOyAgICAgYnJlYWs7CiAgICAgIH0KIAogICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAoVFZQdHIrUmVzSW5kZXgpLT5SVkJIQ01BWDsKQEAgLTM0MDksNzMgKzMzNjAsNzcgQEAKICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgICAgID0gKFRWUHRyK1Jlc0luZGV4KS0+VkdBVlQ7CiAgICAgIFNpU19Qci0+U2lTX0hERSAgICAgICA9IChUVlB0citSZXNJbmRleCktPlRWSERFOwogICAgICBTaVNfUHItPlNpU19WREUgICAgICAgPSAoVFZQdHIrUmVzSW5kZXgpLT5UVlZERTsKLSAgICAgU2lTX1ByLT5TaVNfUlZCSFJTICAgID0gKFRWUHRyK1Jlc0luZGV4KS0+UlZCSFJTOwotICAgICBTaVNfUHItPlNpU19OZXdGbGlja2VyTW9kZSA9IChUVlB0citSZXNJbmRleCktPkZsaWNrZXJNb2RlOworICAgICBTaVNfUHItPlNpU19SVkJIUlMyICAgPSAoVFZQdHIrUmVzSW5kZXgpLT5SVkJIUlMyICYgMHgwZmZmOwogICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB7Ci0gICAgICAgIFNpU19Qci0+U2lTX1JWQkhSUyA9IChUVlB0citSZXNJbmRleCktPkhBTEZSVkJIUlM7CisJU2lTX1ByLT5TaVNfUlZCSFJTID0gKFRWUHRyK1Jlc0luZGV4KS0+SEFMRlJWQkhSUzsKKwlpZihTaVNfUHItPlNpU19SVkJIUlMyKSB7CisJICAgU2lTX1ByLT5TaVNfUlZCSFJTMiA9ICgoU2lTX1ByLT5TaVNfUlZCSFJTMiArIDMpID4+IDEpIC0gMzsKKwkgICB0ZW1wYXggPSAoKFRWUHRyK1Jlc0luZGV4KS0+UlZCSFJTMiA+PiAxMikgJiAweDA3OworCSAgIGlmKChUVlB0citSZXNJbmRleCktPlJWQkhSUzIgJiAweDgwMDApIFNpU19Qci0+U2lTX1JWQkhSUzIgLT0gdGVtcGF4OworCSAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1JWQkhSUzIgKz0gdGVtcGF4OworCX0KKyAgICAgfSBlbHNlIHsKKwlTaVNfUHItPlNpU19SVkJIUlMgICAgPSAoVFZQdHIrUmVzSW5kZXgpLT5SVkJIUlM7CiAgICAgIH0KKyAgICAgU2lTX1ByLT5TaVNfTmV3RmxpY2tlck1vZGUgPSAoKFRWUHRyK1Jlc0luZGV4KS0+RmxpY2tlck1vZGUpIDw8IDc7CiAKICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKIAotICAgICAgICBpZigocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpICB8fAotICAgICAgICAgICAocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB8fAotICAgICAgICAgICAocmVzaW5mbyA9PSBTSVNfUklfMTI4MHg3MjApKSB7CisJaWYoKHJlc2luZm8gPT0gU0lTX1JJXzk2MHg2MDApICAgfHwKKwkgICAocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpICB8fAorCSAgIChyZXNpbmZvID09IFNJU19SSV8xMjgweDEwMjQpIHx8CisJICAgKHJlc2luZm8gPT0gU0lTX1JJXzEyODB4NzIwKSkgewogCSAgIFNpU19Qci0+U2lTX05ld0ZsaWNrZXJNb2RlID0gMHg0MDsKIAl9CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgU2lTX1ByLT5TaVNfVFZNb2RlIHw9IFRWU2V0VFZTaW11TW9kZTsKKwlpZihTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSBTaVNfUHItPlNpU19UVk1vZGUgfD0gVFZTZXRUVlNpbXVNb2RlOwogCi0gICAgICAgIFNpU19Qci0+U2lTX0hUID0gRXh0SGlUVkhUOwotICAgICAgICBTaVNfUHItPlNpU19WVCA9IEV4dEhpVFZWVDsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSB7Ci0gICAgICAgICAgICAgIFNpU19Qci0+U2lTX0hUID0gU3RIaVRWSFQ7Ci0gICAgICAgICAgICAgIFNpU19Qci0+U2lTX1ZUID0gU3RIaVRWVlQ7Ci0jaWYgMAotICAgICAgICAgICAgICBpZighKG1vZGVmbGFnICYgQ2hhcng4RG90KSkgewotICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19IVCA9IFN0SGlUZXh0VFZIVDsKLSAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSBTdEhpVGV4dFRWVlQ7Ci0gICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlTaVNfUHItPlNpU19IVCA9IEV4dEhpVFZIVDsKKwlTaVNfUHItPlNpU19WVCA9IEV4dEhpVFZWVDsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgeworCSAgICAgIFNpU19Qci0+U2lTX0hUID0gU3RIaVRWSFQ7CisJICAgICAgU2lTX1ByLT5TaVNfVlQgPSBTdEhpVFZWVDsKKwkgICB9CisJfQogCiAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgewogCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI3NTBwKSB7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0hUID0gMTY1MDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSA3NTA7CisJaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApIHsKKwkgICBTaVNfUHItPlNpU19IVCA9IDE2NTA7CisJICAgU2lTX1ByLT5TaVNfVlQgPSA3NTA7CiAJfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSB7CiAJICAgU2lTX1ByLT5TaVNfSFQgPSBOVFNDSFQ7CisJICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXQ1MjVwMTAyNCkgU2lTX1ByLT5TaVNfSFQgPSBOVFNDMkhUOwogCSAgIFNpU19Qci0+U2lTX1ZUID0gTlRTQ1ZUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBTaVNfUHItPlNpU19IVCA9IE5UU0NIVDsKKwl9IGVsc2UgeworCSAgIFNpU19Qci0+U2lTX0hUID0gTlRTQ0hUOwogCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQzEwMjQpIFNpU19Qci0+U2lTX0hUID0gTlRTQzJIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSBOVFNDVlQ7Ci0gICAgICAgIH0KKwkgICBTaVNfUHItPlNpU19WVCA9IE5UU0NWVDsKKwl9CiAKICAgICAgfSBlbHNlIHsKIAotICAgICAgICBTaVNfUHItPlNpU19SWTFDT0UgPSAoVFZQdHIrUmVzSW5kZXgpLT5SWTFDT0U7Ci0gICAgICAgIFNpU19Qci0+U2lTX1JZMkNPRSA9IChUVlB0citSZXNJbmRleCktPlJZMkNPRTsKLSAgICAgICAgU2lTX1ByLT5TaVNfUlkzQ09FID0gKFRWUHRyK1Jlc0luZGV4KS0+UlkzQ09FOwotICAgICAgICBTaVNfUHItPlNpU19SWTRDT0UgPSAoVFZQdHIrUmVzSW5kZXgpLT5SWTRDT0U7CisJU2lTX1ByLT5TaVNfUlkxQ09FID0gKFRWUHRyK1Jlc0luZGV4KS0+UlkxQ09FOworCVNpU19Qci0+U2lTX1JZMkNPRSA9IChUVlB0citSZXNJbmRleCktPlJZMkNPRTsKKwlTaVNfUHItPlNpU19SWTNDT0UgPSAoVFZQdHIrUmVzSW5kZXgpLT5SWTNDT0U7CisJU2lTX1ByLT5TaVNfUlk0Q09FID0gKFRWUHRyK1Jlc0luZGV4KS0+Ulk0Q09FOwogCi0gICAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlkxQ09FID0gMHgwMDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlkyQ09FID0gMHhmNDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlkzQ09FID0gMHgxMDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlk0Q09FID0gMHgzODsKLSAgICAgICAgfQorCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKKwkgICBTaVNfUHItPlNpU19SWTFDT0UgPSAweDAwOworCSAgIFNpU19Qci0+U2lTX1JZMkNPRSA9IDB4ZjQ7CisJICAgU2lTX1ByLT5TaVNfUlkzQ09FID0gMHgxMDsKKwkgICBTaVNfUHItPlNpU19SWTRDT0UgPSAweDM4OworCX0KIAotICAgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgewotICAgICAgICAgICBTaVNfUHItPlNpU19IVCA9IE5UU0NIVDsKKwlpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgeworCSAgIFNpU19Qci0+U2lTX0hUID0gTlRTQ0hUOwogCSAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQzEwMjQpIFNpU19Qci0+U2lTX0hUID0gTlRTQzJIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgPSBOVFNDVlQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0hUID0gUEFMSFQ7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZUID0gUEFMVlQ7Ci0gICAgICAgIH0KKwkgICBTaVNfUHItPlNpU19WVCA9IE5UU0NWVDsKKwl9IGVsc2UgeworCSAgIFNpU19Qci0+U2lTX0hUID0gUEFMSFQ7CisJICAgU2lTX1ByLT5TaVNfVlQgPSBQQUxWVDsKKwl9CiAKICAgICAgfQogCkBAIC0zNDg2LDQyICszNDQxLDUzIEBACiAKICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAKLSAgICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgPSBTaVNfUHItPkNIVG90YWw7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZHQVZUID0gU2lTX1ByLT5DVlRvdGFsOwotICAgICAgICBTaVNfUHItPlNpU19IVCAgICA9IFNpU19Qci0+Q0hUb3RhbDsKLSAgICAgICAgU2lTX1ByLT5TaVNfVlQgICAgPSBTaVNfUHItPkNWVG90YWw7CiAJU2lTX1ByLT5TaVNfSERFICAgPSBTaVNfUHItPlNpU19WR0FIREU7Ci0gICAgICAgIFNpU19Qci0+U2lTX1ZERSAgID0gU2lTX1ByLT5TaVNfVkdBVkRFOworCVNpU19Qci0+U2lTX1ZERSAgID0gU2lTX1ByLT5TaVNfVkdBVkRFOworCisJdGVtcGF4ID0gU2lTX1ByLT5DSFRvdGFsOworCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBheCA8PD0gMTsKKwlTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+U2lTX0hUID0gdGVtcGF4OworCVNpU19Qci0+U2lTX1ZHQVZUID0gU2lTX1ByLT5TaVNfVlQgPSBTaVNfUHItPkNWVG90YWw7CiAKICAgICAgfSBlbHNlIHsKIAotICAgICAgICBCT09MRUFOIGdvdGl0ID0gRkFMU0U7CisJQk9PTEVBTiBnb3RpdCA9IEZBTFNFOwogCi0gICAgICAgIGlmKChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYgKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpKSB7CisJaWYoKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSAmJiAoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkpIHsKIAotICAgICAgICAgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+UGFuZWxIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgPSBTaVNfUHItPlBhbmVsVlQ7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX0hUICAgID0gU2lTX1ByLT5QYW5lbEhUOwotICAgICAgICAgICBTaVNfUHItPlNpU19WVCAgICA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICBTaVNfUHItPlNpU19WR0FIVCA9IFNpU19Qci0+UGFuZWxIVDsKKwkgICBTaVNfUHItPlNpU19WR0FWVCA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICBTaVNfUHItPlNpU19IVCAgICA9IFNpU19Qci0+UGFuZWxIVDsKKwkgICBTaVNfUHItPlNpU19WVCAgICA9IFNpU19Qci0+UGFuZWxWVDsKIAkgICBnb3RpdCA9IFRSVUU7CiAKIAl9IGVsc2UgaWYoICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgJiYgKHJvbXB0cikgJiYgKFJPTUFkZHIpICkgewogCiAjaWZkZWYgU0lTMzE1SAogCSAgIFNpU19Qci0+U2lTX1JWQkhDTUFYICA9IFJPTUFkZHJbcm9tcHRyXTsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfUlZCSENGQUNUID0gUk9NQWRkcltyb21wdHIrMV07Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZHQUhUICAgICA9IFJPTUFkZHJbcm9tcHRyKzJdIHwgKChST01BZGRyW3JvbXB0ciszXSAmIDB4MGYpIDw8IDgpOwotICAgICAgICAgICBTaVNfUHItPlNpU19WR0FWVCAgICAgPSBST01BZGRyW3JvbXB0cis0XSB8ICgoUk9NQWRkcltyb21wdHIrM10gJiAweGYwKSA8PCA0KTsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfSFQgICAgICAgID0gUk9NQWRkcltyb21wdHIrNV0gfCAoKFJPTUFkZHJbcm9tcHRyKzZdICYgMHgwZikgPDwgOCk7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZUICAgICAgICA9IFJPTUFkZHJbcm9tcHRyKzddIHwgKChST01BZGRyW3JvbXB0cis2XSAmIDB4ZjApIDw8IDQpOworCSAgIFNpU19Qci0+U2lTX1JWQkhDRkFDVCA9IFJPTUFkZHJbcm9tcHRyKzFdOworCSAgIFNpU19Qci0+U2lTX1ZHQUhUICAgICA9IFJPTUFkZHJbcm9tcHRyKzJdIHwgKChST01BZGRyW3JvbXB0ciszXSAmIDB4MGYpIDw8IDgpOworCSAgIFNpU19Qci0+U2lTX1ZHQVZUICAgICA9IChST01BZGRyW3JvbXB0cis0XSA8PCA0KSB8ICgoUk9NQWRkcltyb21wdHIrM10gJiAweGYwKSA+PiA0KTsKKwkgICBTaVNfUHItPlNpU19IVCAgICAgICAgPSBST01BZGRyW3JvbXB0cis1XSB8ICgoUk9NQWRkcltyb21wdHIrNl0gJiAweDBmKSA8PCA4KTsKKwkgICBTaVNfUHItPlNpU19WVCAgICAgICAgPSAoUk9NQWRkcltyb21wdHIrN10gPDwgNCkgfCAoKFJPTUFkZHJbcm9tcHRyKzZdICYgMHhmMCkgPj4gNCk7CisJICAgU2lTX1ByLT5TaVNfUlZCSFJTMiAgID0gUk9NQWRkcltyb21wdHIrOF0gfCAoKFJPTUFkZHJbcm9tcHRyKzldICYgMHgwZikgPDwgOCk7CisJICAgaWYoKFNpU19Qci0+U2lTX1JWQkhSUzIpICYmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgeworCSAgICAgIFNpU19Qci0+U2lTX1JWQkhSUzIgPSAoKFNpU19Qci0+U2lTX1JWQkhSUzIgKyAzKSA+PiAxKSAtIDM7CisJICAgICAgdGVtcGF4ID0gKFJPTUFkZHJbcm9tcHRyKzldID4+IDQpICYgMHgwNzsKKwkgICAgICBpZihST01BZGRyW3JvbXB0cis5XSAmIDB4ODApIFNpU19Qci0+U2lTX1JWQkhSUzIgLT0gdGVtcGF4OworCSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfUlZCSFJTMiArPSB0ZW1wYXg7CisJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1ZHQUhUKSBnb3RpdCA9IFRSVUU7CiAJICAgZWxzZSB7CiAJICAgICAgU2lTX1ByLT5TaVNfTENESW5mbyB8PSBEb250RXhwYW5kTENEOwogCSAgICAgIFNpU19Qci0+U2lTX0xDREluZm8gJj0gfkxDRFBhc3MxMTsKKwkgICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAxOworCSAgICAgIFNpU19Qci0+U2lTX1JWQkhDRkFDVCA9IDE7CiAJICAgICAgU2lTX1ByLT5TaVNfVkdBSFQgICA9IFNpU19Qci0+UGFuZWxIVDsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgICA9IFNpU19Qci0+UGFuZWxWVDsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfSFQgICAgICA9IFNpU19Qci0+UGFuZWxIVDsKLSAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfVlQgICAgICA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICAgICBTaVNfUHItPlNpU19WR0FWVCAgID0gU2lTX1ByLT5QYW5lbFZUOworCSAgICAgIFNpU19Qci0+U2lTX0hUICAgICAgPSBTaVNfUHItPlBhbmVsSFQ7CisJICAgICAgU2lTX1ByLT5TaVNfVlQgICAgICA9IFNpU19Qci0+UGFuZWxWVDsKKwkgICAgICBTaVNfUHItPlNpU19SVkJIUlMyID0gMDsKIAkgICAgICBnb3RpdCA9IFRSVUU7CiAJICAgfQogI2VuZGlmCkBAIC0zNTMwLDI4ICszNDk2LDMwIEBACiAKIAlpZighZ290aXQpIHsKIAotICAgICAgICAgICBTaVNfR2V0Q1JUMlB0cihTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNSVDJJbmRleCwmUmVzSW5kZXgsSHdJbmZvKTsKKwkgICBTaVNfR2V0Q1JUMlB0cihTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJCSAgJkNSVDJJbmRleCwmUmVzSW5kZXgpOwogCi0gICAgICAgICAgIHN3aXRjaChDUlQySW5kZXgpIHsKKwkgICBzd2l0Y2goQ1JUMkluZGV4KSB7CiAJICAgICAgY2FzZSBQYW5lbF8xMDI0eDc2OCAgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfRXh0TENEMTAyNHg3NjhEYXRhOyAgIGJyZWFrOwogCSAgICAgIGNhc2UgUGFuZWxfMTAyNHg3NjggICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0MkxDRDEwMjR4NzY4RGF0YTsgICBicmVhazsKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4NzIwICAgICAgOgogCSAgICAgIGNhc2UgUGFuZWxfMTI4MHg3MjAgICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX0xDRDEyODB4NzIwRGF0YTsgICAgICBicmVhazsKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4NzY4XzIgICAgOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19FeHRMQ0QxMjgweDc2OF8yRGF0YTsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgUGFuZWxfMTI4MHg3NjhfMisgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0TENEMTI4MHg3NjhfMkRhdGE7ICBicmVhazsKKwkgICAgICBjYXNlIFBhbmVsXzEyODB4NzY4XzIrIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19TdExDRDEyODB4NzY4XzJEYXRhOyAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xMjgweDgwMCAgICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4ODAwICArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDgwMERhdGE7ICAgICAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xMjgweDgwMF8yICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4ODAwXzIrIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDgwMF8yRGF0YTsgICAgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xMjgweDg1NCAgICAgIDoKKwkgICAgICBjYXNlIFBhbmVsXzEyODB4ODU0ICArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDg1NERhdGE7ICAgICAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xMjgweDk2MCAgICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzEyODB4OTYwICArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxMjgweDk2MERhdGE7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0ICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDEyODB4MTAyNERhdGE7ICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQgKyAzMjogTENEUHRyID0gU2lTX1ByLT5TaVNfU3QyTENEMTI4MHgxMDI0RGF0YTsgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MCAgICAgOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOyAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgUGFuZWxfMTQwMHgxMDUwICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0TENEMTQwMHgxMDUwRGF0YTsgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBQYW5lbF8xNjAweDEyMDAgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfRXh0TENEMTYwMHgxMjAwRGF0YTsgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMCArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19TdExDRDE2MDB4MTIwMERhdGE7ICAgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfRXh0TENEMTI4MHgxMDI0RGF0YTsgIGJyZWFrOworCSAgICAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0ICsgMzI6IExDRFB0ciA9IFNpU19Qci0+U2lTX1N0MkxDRDEyODB4MTAyNERhdGE7ICBicmVhazsKKwkgICAgICBjYXNlIFBhbmVsXzE0MDB4MTA1MCAgICAgOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOyAgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xNDAweDEwNTAgKyAzMjogTENEUHRyID0gU2lTX1ByLT5TaVNfU3RMQ0QxNDAweDEwNTBEYXRhOyAgIGJyZWFrOworCSAgICAgIGNhc2UgUGFuZWxfMTYwMHgxMjAwICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDE2MDB4MTIwMERhdGE7ICBicmVhazsKKwkgICAgICBjYXNlIFBhbmVsXzE2MDB4MTIwMCArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19TdExDRDE2MDB4MTIwMERhdGE7ICAgYnJlYWs7CiAJICAgICAgY2FzZSBQYW5lbF8xNjgweDEwNTAgICAgIDoKIAkgICAgICBjYXNlIFBhbmVsXzE2ODB4MTA1MCArIDMyOiBMQ0RQdHIgPSBTaVNfUHItPlNpU19MQ0QxNjgweDEwNTBEYXRhOyAgICAgYnJlYWs7CiAJICAgICAgY2FzZSAxMDAJCSAgICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX05vU2NhbGVEYXRhOwkgICAgYnJlYWs7CkBAIC0zNTU5LDI3MSArMzUyNywzNDAgQEAKIAkgICAgICBjYXNlIDIwMCAgICAgICAgICAgICAgICAgOiBMQ0RQdHIgPSBTaVMzMTBfRXh0Q29tcGFxMTI4MHgxMDI0RGF0YTsgICAgYnJlYWs7CiAJICAgICAgY2FzZSAyMDEgICAgICAgICAgICAgICAgIDogTENEUHRyID0gU2lTX1ByLT5TaVNfU3QyTENEMTI4MHgxMDI0RGF0YTsgIGJyZWFrOwogI2VuZGlmCi0gICAgICAgICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDEwMjR4NzY4RGF0YTsgICBicmVhazsKLSAgICAgICAgICAgfQorCSAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICA6IExDRFB0ciA9IFNpU19Qci0+U2lTX0V4dExDRDEwMjR4NzY4RGF0YTsgICBicmVhazsKKwkgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwotICAgICAgICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIkdldENSVDJEYXRhOiBJbmRleCAlZCBSZXNJbmRleCAlZFxuIiwgQ1JUMkluZGV4LCBSZXNJbmRleCk7CisJICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJHZXRDUlQyRGF0YTogSW5kZXggJWQgUmVzSW5kZXggJWRcbiIsIENSVDJJbmRleCwgUmVzSW5kZXgpOworI2VuZGlmCiAjZW5kaWYKIAotICAgICAgICAgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAoTENEUHRyK1Jlc0luZGV4KS0+UlZCSENNQVg7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1JWQkhDRkFDVCA9IChMQ0RQdHIrUmVzSW5kZXgpLT5SVkJIQ0ZBQ1Q7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZHQUhUICAgICA9IChMQ0RQdHIrUmVzSW5kZXgpLT5WR0FIVDsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfVkdBVlQgICAgID0gKExDRFB0citSZXNJbmRleCktPlZHQVZUOwotICAgICAgICAgICBTaVNfUHItPlNpU19IVCAgICAgICAgPSAoTENEUHRyK1Jlc0luZGV4KS0+TENESFQ7Ci0gICAgICAgICAgIFNpU19Qci0+U2lTX1ZUICAgICAgICA9IChMQ0RQdHIrUmVzSW5kZXgpLT5MQ0RWVDsKKwkgICBTaVNfUHItPlNpU19SVkJIQ01BWCAgPSAoTENEUHRyK1Jlc0luZGV4KS0+UlZCSENNQVg7CisJICAgU2lTX1ByLT5TaVNfUlZCSENGQUNUID0gKExDRFB0citSZXNJbmRleCktPlJWQkhDRkFDVDsKKwkgICBTaVNfUHItPlNpU19WR0FIVCAgICAgPSAoTENEUHRyK1Jlc0luZGV4KS0+VkdBSFQ7CisJICAgU2lTX1ByLT5TaVNfVkdBVlQgICAgID0gKExDRFB0citSZXNJbmRleCktPlZHQVZUOworCSAgIFNpU19Qci0+U2lTX0hUICAgICAgICA9IChMQ0RQdHIrUmVzSW5kZXgpLT5MQ0RIVDsKKwkgICBTaVNfUHItPlNpU19WVCAgICAgICAgPSAoTENEUHRyK1Jlc0luZGV4KS0+TENEVlQ7CiAKICAgICAgICAgfQogCiAJdGVtcGF4ID0gU2lTX1ByLT5QYW5lbFhSZXM7Ci0gICAgICAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxZUmVzOworCXRlbXBieCA9IFNpU19Qci0+UGFuZWxZUmVzOwogCi0JaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewotICAgICAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykgewotICAgICAgICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgICAgICAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgdGVtcGJ4ID0gNTYwOwotICAgICAgICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDApIHRlbXBieCA9IDY0MDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAgICAgKFNpU19Qci0+U2lTX1ZHQVZERSA9PSAzNTcpIHRlbXBieCA9IDUyNzsKLSAgICAgICAgICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gNDIwKSB0ZW1wYnggPSA2MjA7Ci0gICAgICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDUyNSkgdGVtcGJ4ID0gNzc1OwotICAgICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA2MDApIHRlbXBieCA9IDc3NTsKLSAgICAgICAgICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSB0ZW1wYnggPSA1NjA7Ci0gICAgICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgdGVtcGJ4ID0gNjQwOwotICAgICAgICAgICB9Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHg5NjApIHsKLSAgICAgICAgICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSAgdGVtcGJ4ID0gNzAwOwotICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDApICB0ZW1wYnggPSA4MDA7Ci0gICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDEwMjQpIHRlbXBieCA9IDk2MDsKLQl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHsKLSAgICAgICAgICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPT0gMzYwKSB0ZW1wYnggPSA3Njg7Ci0gICAgICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM3NSkgdGVtcGJ4ID0gODAwOwotICAgICAgICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDUpIHRlbXBieCA9IDg2NDsKLSAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSB7CisJc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKKwljYXNlIFBhbmVsXzEwMjR4NzY4OgorCSAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSB7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJCSBpZiAgICAgKFNpU19Qci0+U2lTX1ZHQVZERSA9PSAzNTApIHRlbXBieCA9IDU2MDsKKwkJIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgdGVtcGJ4ID0gNjQwOworCSAgICAgIH0KKwkgICB9IGVsc2UgeworCSAgICAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1NykgdGVtcGJ4ID0gNTI3OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQyMCkgdGVtcGJ4ID0gNjIwOworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDUyNSkgdGVtcGJ4ID0gNzc1OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDYwMCkgdGVtcGJ4ID0gNzc1OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgdGVtcGJ4ID0gNTYwOworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgdGVtcGJ4ID0gNjQwOworCSAgIH0KKwkgICBicmVhazsKKwljYXNlIFBhbmVsXzEyODB4OTYwOgorCSAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgIHRlbXBieCA9IDcwMDsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSA0MDApICB0ZW1wYnggPSA4MDA7CisJICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gMTAyNCkgdGVtcGJ4ID0gOTYwOworCSAgIGJyZWFrOworCWNhc2UgUGFuZWxfMTI4MHgxMDI0OgorCSAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM2MCkgdGVtcGJ4ID0gNzY4OworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM3NSkgdGVtcGJ4ID0gODAwOworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwNSkgdGVtcGJ4ID0gODY0OworCSAgIGJyZWFrOworCWNhc2UgUGFuZWxfMTYwMHgxMjAwOgogCSAgIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpKSB7Ci0gICAgICAgICAgICAgIGlmICAgICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IDM1MCkgIHRlbXBieCA9IDg3NTsKLSAgICAgICAgICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPT0gNDAwKSAgdGVtcGJ4ID0gMTAwMDsKLSAgICAgICAgICAgfQotICAgICAgICB9CisJICAgICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPT0gMzUwKSAgdGVtcGJ4ID0gODc1OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgIHRlbXBieCA9IDEwMDA7CisJICAgfQorCSAgIGJyZWFrOworCX0KIAotICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgewotICAgICAgICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIREU7Ci0gICAgICAgICAgIHRlbXBieCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKLSAgICAgICAgfQorCWlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOworCSAgIHRlbXBieCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKKwl9CiAKLSAgICAgICAgU2lTX1ByLT5TaVNfSERFID0gdGVtcGF4OwotICAgICAgICBTaVNfUHItPlNpU19WREUgPSB0ZW1wYng7CisJU2lTX1ByLT5TaVNfSERFID0gdGVtcGF4OworCVNpU19Qci0+U2lTX1ZERSA9IHRlbXBieDsKICAgICAgfQogICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0Q1JUMkRhdGEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMkRhdGEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CisgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKLSAgICAgICAgU2lTX0dldENSVDJEYXRhTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKLSAgICAgfSBlbHNlIHsKLQlpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7Ci0JICAgLyogTmVlZCBMVkRTIERhdGEgZm9yIExDRCBvbiAzMDFCLURIICovCi0JICAgU2lTX0dldENSVDJEYXRhTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKLQl9IGVsc2UgewotCSAgIFNpU19HZXRDUlQyRGF0YTMwMShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKLSAgICAgICAgfQotICAgICB9CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CisgICAgICAgICBTaVNfR2V0Q1JUMkRhdGFMVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKyAgICAgIH0gZWxzZSB7CisJIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkpIHsKKwkgICAgLyogTmVlZCBMVkRTIERhdGEgZm9yIExDRCBvbiAzMDFCLURIICovCisJICAgIFNpU19HZXRDUlQyRGF0YUxWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSB9IGVsc2UgeworCSAgICBTaVNfR2V0Q1JUMkRhdGEzMDEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSB9CisgICAgICB9CiAKLSAgfSBlbHNlIHsKKyAgIH0gZWxzZSB7CiAKLSAgICAgU2lTX0dldENSVDJEYXRhTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKKyAgICAgIFNpU19HZXRDUlQyRGF0YUxWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogCi0gIH0KKyAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgR0VUIExWRFMgREVTIChTS0VXKSBEQVRBICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZAotU2lTX0dldExWRFNEZXNQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgVVNIT1JUICpQYW5lbEluZGV4LAotCQkgIFVTSE9SVCAqUmVzSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgY29uc3Qgc3RydWN0IFNpU19MVkRTRGVzICoKK1NpU19HZXRMVkRTRGVzUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgbW9kZWZsYWc7CisgICBjb25zdCBzdHJ1Y3QgU2lTX0xWRFNEZXMgKlBhbmVsRGVzUHRyID0gTlVMTDsKIAotICBpZihNb2RlTm8gPD0gMHgxMykgewotICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gICAgICgqUmVzSW5kZXgpID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKLSAgfSBlbHNlIHsKLSAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLSAgICAgKCpSZXNJbmRleCkgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKLSAgfQorI2lmZGVmIFNJUzMwMAorICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CiAKLSAgKCpSZXNJbmRleCkgJj0gMHgxRjsKLSAgKCpQYW5lbEluZGV4KSA9IDA7Ci0KLSAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgICgqUGFuZWxJbmRleCkgPSA1MDsKLSAgICAgICAgaWYoKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSAmJiAoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE0pKSkgKCpQYW5lbEluZGV4KSArPSAyOwotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pICgqUGFuZWxJbmRleCkgKz0gMTsKLSAgICAgICAgLyogTm90aGluZyBzcGVjaWFsIG5lZWRlZCBmb3IgU092ZXJzY2FuICAgICovCi0gICAgICAgIC8qIFBBTE0gdXNlcyBOVFNDIGRhdGEsIFBBTE4gdXNlcyBQQUwgZGF0YSAqLwotICAgICB9Ci0gIH0KLQotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKLSAgICAgKlBhbmVsSW5kZXggPSBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbzsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICAgICAvKiBBcyBsb25nIGFzIHdlIGRvbidzIHVzZSB0aGUgQklPUyB0YWJsZXMsIHdlCi0JICogbmVlZCB0byBjb252ZXJ0IHRoZSBUeXBlSW5mbyBhcyBmb3IgMzE1IHNlcmllcwotCSAqLwotICAgICAgICAoKlBhbmVsSW5kZXgpID0gU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAtIDE7Ci0gICAgIH0KLSAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKLSAgICAgICAgKCpQYW5lbEluZGV4KSArPSAxNjsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgewotICAgICAgICAgICAoKlBhbmVsSW5kZXgpID0gMzI7Ci0gICAgICAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICgqUGFuZWxJbmRleCkrKzsKLQl9Ci0gICAgIH0KLSAgfQotCi0gIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBTZXRET1NNb2RlKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfNjQweDQ4MCkgewotICAgICAgICAoKlJlc0luZGV4KSA9IDc7Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg4MCkgKCpSZXNJbmRleCkrKzsKLSAgICAgICAgfQotICAgICB9Ci0gIH0KKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSBpZihTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSA0KSB7CisJICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgeworCSAgICAgICBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzFhOworCSAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgeworCQkgIFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMmE7CisJICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEwMjQpIHsKKwkgICAgICAgUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwNF8xYjsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKwkJICBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzJiOworCSAgICAgICB9CisJICAgIH0KKwkgfQorICAgICAgfQorICAgfQorI2VuZGlmCisgICByZXR1cm4gUGFuZWxEZXNQdHI7CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfR2V0TFZEU0Rlc0RhdGEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19HZXRMVkRTRGVzRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCBtb2RlZmxhZzsKLSAgVVNIT1JUIFBhbmVsSW5kZXgsUmVzSW5kZXg7Ci0gIGNvbnN0ICBTaVNfTFZEU0Rlc1N0cnVjdCAqUGFuZWxEZXNQdHIgPSBOVUxMOworICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZywgUmVzSW5kZXg7CisgIGNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcyAqUGFuZWxEZXNQdHIgPSBOVUxMOwogCiAgIFNpU19Qci0+U2lTX0xDREhERVMgPSAwOwogICBTaVNfUHItPlNpU19MQ0RWREVTID0gMDsKIAorICAvKiBTb21lIHNwZWNpYWwgY2FzZXMgKi8KKyAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisKKyAgICAgLyogVHJ1bXBpb24gKi8KKyAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OKSB7CisJaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgeworCSAgIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSBTaVNfUHItPlBhbmVsWVJlcykgeworCSAgICAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOworCSAgIH0KKwl9CisJcmV0dXJuOworICAgICB9CisKKyAgICAgLyogNjQweDQ4MCBvbiBMVkRTICovCisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCWlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MCAmJiBTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSAzKSB7CisJICAgU2lTX1ByLT5TaVNfTENESERFUyA9IDg7CisJICAgaWYgICAgIChTaVNfUHItPlNpU19WR0FWREUgPj0gNDgwKSBTaVNfUHItPlNpU19MQ0RWREVTID0gNTEyOworCSAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID49IDQwMCkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IDQzNjsKKwkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA+PSAzNTApIFNpU19Qci0+U2lTX0xDRFZERVMgPSA0NDA7CisJICAgcmV0dXJuOworCX0KKyAgICAgfQorCisgIH0gLyogTENEICovCisKICAgaWYoIChTaVNfUHItPlVzZUN1c3RvbU1vZGUpIAkJICAgICAgICAgfHwKICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsX0N1c3RvbSkgICB8fAogICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODQ4KSAgICAgIHx8Ci0gICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSAmJgotICAgICAgIChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgJiYKLSAgICAgICAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpICkgeworICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSAgICAgIHx8CisgICAgICAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkgKSB7CiAgICAgIHJldHVybjsKICAgfQogCi0gIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworICBpZihNb2RlTm8gPD0gMHgxMykgUmVzSW5kZXggPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X0NSVDJDUlRDOworICBlbHNlICAgICAgICAgICAgICAgUmVzSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKKworICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKIAogI2lmZGVmIFNJUzMxNUgKICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKLSAgICAgICAgLyogbm9uLXBhc3MgMToxIG9ubHksIHNlZSBhYm92ZSAqLwotICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgIT0gU2lTX1ByLT5QYW5lbFhSZXMpIHsKLSAgICAgICAgICAgU2lTX1ByLT5TaVNfTENESERFUyA9IFNpU19Qci0+U2lTX0hUIC0gKChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX1ZHQUhERSkgLyAyKTsKKwkvKiBub24tcGFzcyAxOjEgb25seSwgc2VlIGFib3ZlICovCisJaWYoU2lTX1ByLT5TaVNfVkdBSERFICE9IFNpU19Qci0+UGFuZWxYUmVzKSB7CisJICAgU2lTX1ByLT5TaVNfTENESERFUyA9IFNpU19Qci0+U2lTX0hUIC0gKChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX1ZHQUhERSkgLyAyKTsKIAl9CiAJaWYoU2lTX1ByLT5TaVNfVkdBVkRFICE9IFNpU19Qci0+UGFuZWxZUmVzKSB7CiAJICAgU2lTX1ByLT5TaVNfTENEVkRFUyA9IFNpU19Qci0+U2lTX1ZUIC0gKChTaVNfUHItPlBhbmVsWVJlcyAtIFNpU19Qci0+U2lTX1ZHQVZERSkgLyAyKTsKIAl9CiAgICAgIH0KICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IFNpU19Qci0+UGFuZWxZUmVzKSB7Ci0gICAgICAgIHN3aXRjaChTaVNfUHItPlNpU19DdXN0b21UKSB7Ci0gICAgICAgIGNhc2UgQ1VUX1VOSVdJTEwxMDI0OgotICAgICAgICBjYXNlIENVVF9VTklXSUxMMTAyNDI6Ci0gICAgICAgIGNhc2UgQ1VUX0NMRVZPMTQwMDoKKwlzd2l0Y2goU2lTX1ByLT5TaVNfQ3VzdG9tVCkgeworCWNhc2UgQ1VUX1VOSVdJTEwxMDI0OgorCWNhc2UgQ1VUX1VOSVdJTEwxMDI0MjoKKwljYXNlIENVVF9DTEVWTzE0MDA6CiAJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewogCSAgICAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOwogCSAgIH0KIAkgICBicmVhazsKIAl9Ci0JaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHsKKwlzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgeworCWNhc2UgUGFuZWxfMTI4MHgxMDI0OgogCSAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgIT0gQ1VUX0NPTVBBUTEyODApIHsKIAkgICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKIAkgICB9CisJICAgYnJlYWs7CisJY2FzZSBQYW5lbF8xMjgweDgwMDoJLyogVmVyaWZpZWQgZm9yIEF2ZXJhdGVjIDYyNDAgKi8KKwljYXNlIFBhbmVsXzEyODB4ODAwXzI6CS8qIFZlcmlmaWVkIGZvciBBc3VzIEE0TCAqLworCWNhc2UgUGFuZWxfMTI4MHg4NTQ6ICAgIC8qIE5vdCB2ZXJpZmllZCB5ZXQgRklYTUUgKi8KKwkgICBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkgICBicmVhazsKIAl9CiAgICAgIH0KICNlbmRpZgogCiAgIH0gZWxzZSB7CiAKLSAgICAgU2lTX0dldExWRFNEZXNQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICZQYW5lbEluZGV4LCAmUmVzSW5kZXgsIEh3SW5mbyk7CisgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHsKIAotICAgICBzd2l0Y2goUGFuZWxJbmRleCkgewotICAgICAJY2FzZSAgMDogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwMF8xOyAgICBicmVhazsgICAvKiAtLS0gICovCi0gICAgIAljYXNlICAxOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTAxXzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAgMjogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwMl8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgIDM6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDNfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlICA0OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA0XzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAgNTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwNV8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgIDY6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDZfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlICA3OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA3XzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAgODogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwOF8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgIDk6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDlfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDEwOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBhXzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAxMTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwYl8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgMTI6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGNfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDEzOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBkXzE7ICAgIGJyZWFrOwotICAgICAJY2FzZSAxNDogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwZV8xOyAgICBicmVhazsKLSAgICAgCWNhc2UgMTU6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGZfMTsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDE2OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTAwXzI7ICAgIGJyZWFrOyAgICAvKiAtLS0gKi8KLSAgICAgCWNhc2UgMTc6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDFfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDE4OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTAyXzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAxOTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwM18yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjA6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDRfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDIxOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA1XzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAyMjogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwNl8yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjM6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMDdfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDI0OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTA4XzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAyNTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwOV8yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjY6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGFfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDI3OiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBiXzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAyODogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwY18yOyAgICBicmVhazsKLSAgICAgCWNhc2UgMjk6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlMGRfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDMwOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZTBlXzI7ICAgIGJyZWFrOwotICAgICAJY2FzZSAzMTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19QYW5lbFR5cGUwZl8yOyAgICBicmVhazsKLQljYXNlIDMyOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX1BhbmVsVHlwZU5TXzE7ICAgIGJyZWFrOyAgICAvKiBwYXNzIDE6MSAqLwotCWNhc2UgMzM6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfUGFuZWxUeXBlTlNfMjsgICAgYnJlYWs7Ci0gICAgIAljYXNlIDUwOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX0NIVFZVTlRTQ0Rlc0RhdGE7IGJyZWFrOyAgICAvKiBUViAqLwotICAgICAJY2FzZSA1MTogUGFuZWxEZXNQdHIgPSBTaVNfUHItPlNpU19DSFRWT05UU0NEZXNEYXRhOyBicmVhazsKLSAgICAgCWNhc2UgNTI6IFBhbmVsRGVzUHRyID0gU2lTX1ByLT5TaVNfQ0hUVlVQQUxEZXNEYXRhOyAgYnJlYWs7Ci0gICAgIAljYXNlIDUzOiBQYW5lbERlc1B0ciA9IFNpU19Qci0+U2lTX0NIVFZPUEFMRGVzRGF0YTsgIGJyZWFrOwotCWRlZmF1bHQ6IHJldHVybjsKKwlpZigoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICYmICghKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkpKSB7CisJICAgaWYoUmVzSW5kZXggPD0gMykgU2lTX1ByLT5TaVNfTENESERFUyA9IDI1NjsKKwl9CisKKyAgICAgfSBlbHNlIGlmKChQYW5lbERlc1B0ciA9IFNpU19HZXRMVkRTRGVzUHRyKFNpU19QcikpKSB7CisKKwlTaVNfUHItPlNpU19MQ0RIREVTID0gKFBhbmVsRGVzUHRyK1Jlc0luZGV4KS0+TENESERFUzsKKwlTaVNfUHItPlNpU19MQ0RWREVTID0gKFBhbmVsRGVzUHRyK1Jlc0luZGV4KS0+TENEVkRFUzsKKworICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKKworCWlmKFNpU19Qci0+U2lTX1ZHQUhERSAhPSBTaVNfUHItPlBhbmVsWFJlcykgeworCSAgIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlNpU19IVCAtICgoU2lTX1ByLT5QYW5lbFhSZXMgLSBTaVNfUHItPlNpU19WR0FIREUpIC8gMik7CisJfQorCWlmKFNpU19Qci0+U2lTX1ZHQVZERSAhPSBTaVNfUHItPlBhbmVsWVJlcykgeworCSAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlNpU19WVCAtICgoU2lTX1ByLT5QYW5lbFlSZXMgLSBTaVNfUHItPlNpU19WR0FWREUpIC8gMik7CisJfSBlbHNlIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkgICB9IGVsc2UgeworCSAgICAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisJICAgICAgY2FzZSBQYW5lbF84MDB4NjAwOgorCSAgICAgIGNhc2UgUGFuZWxfMTAyNHg3Njg6CisJICAgICAgY2FzZSBQYW5lbF8xMjgweDEwMjQ6CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUOworCQkgYnJlYWs7CisJICAgICAgY2FzZSBQYW5lbF8xNDAweDEwNTA6CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkJIGJyZWFrOworCSAgICAgIH0KKwkgICB9CisJfQorCisgICAgIH0gZWxzZSB7CisKKyAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CisjaWZkZWYgU0lTMzAwCisJICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKKwkgICBjYXNlIFBhbmVsXzgwMHg2MDA6CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IFNpU19Qci0+UGFuZWxZUmVzKSB7CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTsKKwkgICAgICB9IGVsc2UgeworCQkgU2lTX1ByLT5TaVNfTENESERFUyA9IFNpU19Qci0+UGFuZWxIVCArIDM7CisJCSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUOworCQkgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDQwMCkgU2lTX1ByLT5TaVNfTENEVkRFUyAtPSAyOworCQkgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfTENEVkRFUyAtPSA0OworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICBjYXNlIFBhbmVsXzEwMjR4NzY4OgorCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSBTaVNfUHItPlBhbmVsWVJlcykgeworCQkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IFNpU19Qci0+UGFuZWxWVCAtIDE7CisJICAgICAgfSBlbHNlIHsKKwkJIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlBhbmVsSFQgLSAxOworCQkgaWYoU2lTX1ByLT5TaVNfVkdBVkRFIDw9IDQwMCkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IFNpU19Qci0+UGFuZWxWVCAtIDg7CisJCSBpZihTaVNfUHItPlNpU19WR0FWREUgPD0gMzUwKSBTaVNfUHItPlNpU19MQ0RWREVTID0gU2lTX1ByLT5QYW5lbFZUIC0gMTI7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgIGNhc2UgUGFuZWxfMTAyNHg2MDA6CisJICAgZGVmYXVsdDoKKwkgICAgICBpZiggKFNpU19Qci0+U2lTX1ZHQUhERSA9PSBTaVNfUHItPlBhbmVsWFJlcykgJiYKKwkJICAoU2lTX1ByLT5TaVNfVkdBVkRFID09IFNpU19Qci0+UGFuZWxZUmVzKSApIHsKKwkJIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOworCSAgICAgIH0gZWxzZSB7CisJCSBTaVNfUHItPlNpU19MQ0RIREVTID0gU2lTX1ByLT5QYW5lbEhUIC0gMTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgfQorCisJICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFR5cGVJbmZvKSB7CisJICAgY2FzZSAxOgorCSAgICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlNpU19MQ0RWREVTID0gMDsKKwkgICAgICBicmVhazsKKwkgICBjYXNlIDM6IC8qIDY0MHg0ODAgb25seT8gKi8KKwkgICAgICBTaVNfUHItPlNpU19MQ0RIREVTID0gODsKKwkgICAgICBpZiAgICAgKFNpU19Qci0+U2lTX1ZHQVZERSA+PSA0ODApIFNpU19Qci0+U2lTX0xDRFZERVMgPSA1MTI7CisJICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WR0FWREUgPj0gNDAwKSBTaVNfUHItPlNpU19MQ0RWREVTID0gNDM2OworCSAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID49IDM1MCkgU2lTX1ByLT5TaVNfTENEVkRFUyA9IDQ0MDsKKwkgICAgICBicmVhazsKKwkgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBTSVMzMTVICisJICAgc3dpdGNoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8pIHsKKwkgICBjYXNlIFBhbmVsXzEwMjR4NzY4OgorCSAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0OgorCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZHQVZERSA9PSBTaVNfUHItPlBhbmVsWVJlcykgeworCSAgICAgICAgIFNpU19Qci0+U2lTX0xDRFZERVMgPSBTaVNfUHItPlBhbmVsVlQgLSAxOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICBjYXNlIFBhbmVsXzMyMHgyNDBfMToKKwkgICBjYXNlIFBhbmVsXzMyMHgyNDBfMjoKKwkgICBjYXNlIFBhbmVsXzMyMHgyNDBfMzoKKwkgICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gNTI0OworCSAgICAgIGJyZWFrOworCSAgIH0KKyNlbmRpZgorCX0KICAgICAgfQogCi0gICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSAoUGFuZWxEZXNQdHIrUmVzSW5kZXgpLT5MQ0RIREVTOwotICAgICBTaVNfUHItPlNpU19MQ0RWREVTID0gKFBhbmVsRGVzUHRyK1Jlc0luZGV4KS0+TENEVkRFUzsKLQogICAgICBpZigoTW9kZU5vIDw9IDB4MTMpICYmIChTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkpIHsKLSAgICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICAgICAgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKKwltb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisJaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CiAJICAgaWYoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgU2lTX1ByLT5TaVNfTENESERFUyA9IDYzMjsKLSAgICAgICAgfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSB7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHgxMDI0KSB7Ci0gICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPj0gUGFuZWxfMTAyNHg3NjgpIHsKLQkgICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJfSBlbHNlIGlmKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpKSB7CisJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xMjgweDEwMjQpIHsKKwkgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID49IFBhbmVsXzEwMjR4NzY4KSB7CisJICAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAJICAgICAgICAgICAgaWYoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgU2lTX1ByLT5TaVNfTENESERFUyA9IDMyMDsKIAkgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpICBTaVNfUHItPlNpU19MQ0RIREVTID0gNDgwOwotICAgICAgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgU2lTX1ByLT5TaVNfTENESERFUyA9IDgwNDsKKyNpZmRlZiBTSVMzMTVICisJCSAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSAgU2lTX1ByLT5TaVNfTENESERFUyA9IDQ4MDsKKwkJICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSBTaVNfUHItPlNpU19MQ0RIREVTID0gODA0OwogCQkgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNjAweDEyMDApIFNpU19Qci0+U2lTX0xDREhERVMgPSA3MDQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfTENESERFUyA9IDMyMDsKLQkgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgU2lTX1ByLT5TaVNfTENESERFUyA9IDYzMjsKKwkJICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKKwkJICAgICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSAzMjA7CisJCSAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgU2lTX1ByLT5TaVNfTENESERFUyA9IDYzMjsKIAkJICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSBTaVNfUHItPlNpU19MQ0RIREVTID0gNTQyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgCSAgICB9CisjZW5kaWYKKwkJIH0KKwkgICAgICB9CisJICAgfQorCX0KICAgICAgfQogICB9CiB9CkBAIC0zODMyLDU0ICszODY5LDkwIEBACiAvKiAgICAgICAgICAgRElTQUJMRSBWSURFTyBCUklER0UgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIFNJUzMxNUgKK3N0YXRpYyBpbnQKK1NpU19IYW5kbGVQV0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisgICBpbnQgcmV0ID0gMDsKKyNpZmRlZiBTRVRfUFdECisgICB1bnNpZ25lZCBjaGFyICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IHJvbXB0ciA9IEdldExDRFN0cnVjdFB0cjY2MV8yKFNpU19Qcik7CisgICB1bnNpZ25lZCBjaGFyICBkcml2ZXJtb2RlID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MDsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CisKKyAgIGlmKCAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUFdEKSAmJgorICAgICAgIChyb21wdHIpCQkJCSYmCisgICAgICAgKFNpU19Qci0+U2lTX1BXRE9mZnNldCkgKSB7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJiLFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ICsgMF0pOworICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYyxST01BZGRyW3JvbXB0ciArIFNpU19Qci0+U2lTX1BXRE9mZnNldCArIDFdKTsKKyAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MmQsUk9NQWRkcltyb21wdHIgKyBTaVNfUHItPlNpU19QV0RPZmZzZXQgKyAyXSk7CisgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJlLFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfUFdET2Zmc2V0ICsgM10pOworICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyZixST01BZGRyW3JvbXB0ciArIFNpU19Qci0+U2lTX1BXRE9mZnNldCArIDRdKTsKKyAgICAgIHRlbXAgPSAweDAwOworICAgICAgaWYoKFJPTUFkZHJbcm9tcHRyICsgMl0gJiAoMHgwNiA8PCAxKSkgJiYgIWRyaXZlcm1vZGUpIHsKKyAgICAgICAgIHRlbXAgPSAweDgwOworCSByZXQgPSAxOworICAgICAgfQorICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3LDB4N2YsdGVtcCk7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorI2lmZGVmIFRXREVCVUcKKyAgICAgIHhmODZEcnZNc2coMCwgMCwgIlNldHRpbmcgUFdEICV4XG4iLCB0ZW1wKTsKKyNlbmRpZgorI2VuZGlmCisgICB9CisjZW5kaWYKKyAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKwogLyogTkVWRVIgdXNlIGFueSB2YXJpYWJsZXMgKFZCSW5mbyksIHRoaXMgd2lsbCBiZSBjYWxsZWQKICAqIGZyb20gb3V0c2lkZSB0aGUgY29udGV4dCBvZiBtb2Rlc3dpdGNoIQogICogTVVTVCBjYWxsIGdldFZCVHlwZSBiZWZvcmUgY2FsbGluZyB0aGlzCiAgKi8KIHZvaWQKLVNpU19EaXNhYmxlQnJpZGdlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfRGlzYWJsZUJyaWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICNpZmRlZiBTSVMzMTVICi0gIFVTSE9SVCB0ZW1wYWgscHVzaGF4PTAsbW9kZW51bTsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoLCBwdXNoYXg9MCwgbW9kZW51bTsKICNlbmRpZgotICBVU0hPUlQgdGVtcD0wOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsgICAvKiA9PT09PSBGb3IgMzB4Qi9MViA9PT09PSAqLworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsJCS8qID09PT09IEZvciAzMHhCL0MvTFYgPT09PT0gKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisJaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAKICNpZmRlZiBTSVMzMDAJICAgLyogMzAwIHNlcmllcyAqLwogCi0JICAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNiKFNpU19QcixId0luZm8pKSkgewotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkUpOworCSAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIpKSkgeworCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRSk7CiAJICAgICAgfSBlbHNlIHsKLQkJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLEh3SW5mbywweEY3LDB4MDgpOworCQkgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGNywweDA4KTsKIAkgICAgICB9Ci0JICAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMyk7CiAJICAgfQogCSAgIGlmKFNpU19JczMwMUIoU2lTX1ByKSkgewogCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MWYsMHgzZik7CiAJICAgICAgU2lTX1Nob3J0RGVsYXkoU2lTX1ByLDEpOwotICAgICAgICAgICB9CisJICAgfQogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDAsMHhERik7CiAJICAgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweERGKTsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweERGKTsKLQkgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsSHdJbmZvKTsKLQkgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpKSB7CisJICAgU2lTX1VuTG9ja0NSVDIoU2lTX1ByKTsKKwkgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CiAJICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ODApOwogCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMiwweDQwKTsKIAkgICB9Ci0JICAgaWYoICghKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSkgfHwKLQkgICAgICAgKCEoU2lTX0NSMzZCSU9TV29yZDIzZChTaVNfUHIsIEh3SW5mbykpKSApIHsKLQkgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgewotICAgICAgICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkQpOworCSAgIGlmKCAoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSB8fAorCSAgICAgICAoIShTaVNfQ1IzNkJJT1NXb3JkMjNkKFNpU19QcikpKSApIHsKKwkgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkQpOwogCSAgICAgIH0gZWxzZSB7Ci0JCSBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDA0KTsKKwkJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RkIsMHgwNCk7CiAJICAgICAgfQogCSAgIH0KIApAQCAtMzg4OSwxMzAgKzM5NjIsMTI3IEBACiAKICNpZmRlZiBTSVMzMTVICSAgIC8qIDMxNSBzZXJpZXMgKi8KIAorCSAgIGludCBkaWRwd2QgPSAwOwogCSAgIEJPT0xFQU4gY3VzdG9tMSA9ICgoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ09NUEFRMTI4MCkgfHwKIAkgICAgICAgICAgICAgICAgICAgICAgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NMRVZPMTQwMCkpID8gVFJVRSA6IEZBTFNFOwogCiAJICAgbW9kZW51bSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM0KSAmIDB4N2Y7CiAKLSAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgeworCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKIAogI2lmZGVmIFNFVF9FTUkKLQkgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7CisJICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAJCSBpZihTaVNfUHItPlNpU19DdXN0b21UICE9IENVVF9DTEVWTzE0MDApIHsKLQkgICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4MGMpOworCQkgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzMCwweDBjKTsKIAkJIH0KIAkgICAgICB9CiAjZW5kaWYKLQkgICAgICBpZiggKG1vZGVudW0gPD0gMHgxMykgICAgICAgICAgICAgICAgICB8fAotCQkgIChTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpICAgICAgfHwKLQkJICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpICkgewotCSAgICAgCSBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4RkUpOwotCQkgaWYoY3VzdG9tMSkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCisJICAgICAgZGlkcHdkID0gU2lTX0hhbmRsZVBXRChTaVNfUHIpOworCisJICAgICAgaWYoIChtb2RlbnVtIDw9IDB4MTMpICAgICAgICAgICB8fAorCQkgIChTaVNfSXNWQU1vZGUoU2lTX1ByKSkgICAgICB8fAorCQkgICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSApIHsKKwkJIGlmKCFkaWRwd2QpIHsKKwkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhmZSk7CisJCSAgICBpZihjdXN0b20xKSBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDMpOworCQkgfSBlbHNlIHsKKwkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhmYyk7CisJCSB9CiAJICAgICAgfQogCiAJICAgICAgaWYoIWN1c3RvbTEpIHsKIAkJIFNpU19EREMyRGVsYXkoU2lTX1ByLDB4ZmYwMCk7CiAJCSBTaVNfRERDMkRlbGF5KFNpU19QciwweGUwMDApOwotCSAgICAgICAgIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzYsMHgwMCk7Ci0gICAgICAgICAgICAgICAgIHB1c2hheCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA2KTsKKwkJIFNpU19TZXRSZWdCeXRlKFNpU19Qci0+U2lTX1AzYzYsMHgwMCk7CisJCSBwdXNoYXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNik7CiAJCSBpZihJU19TSVM3NDApIHsKIAkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDA2LDB4RTMpOwogCQkgfQotCSAgICAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAzKTsKKwkgICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDMpOwogCSAgICAgIH0KIAotICAgICAgICAgICB9Ci0KLQkgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QciwgSHdJbmZvKSkpIHsKLQkgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zNDApIHsKLQkgICAgICAgICB0ZW1wYWggPSAweGVmOwotCSAgICAgICAgIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgdGVtcGFoID0gMHhmNzsKLQkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDRjLHRlbXBhaCk7Ci0JICAgICAgfQogCSAgIH0KIAotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpKSB7CisJICAgICAgLyogaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zNDApIHsqLworCQkgdGVtcGFoID0gMHhlZjsKKwkJIGlmKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB0ZW1wYWggPSAweGY3OworCQkgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0Yyx0ZW1wYWgpOworCSAgICAgIC8qfSovCisJICAgfQorCisJICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUYsfjB4MTApOwogCSAgIH0KIAogCSAgIHRlbXBhaCA9IDB4M2Y7Ci0JICAgaWYoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpIHsKKwkgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSB7CiAJICAgICAgdGVtcGFoID0gMHg3ZjsKLQkgICAgICBpZighKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkpIHRlbXBhaCA9IDB4YmY7CisJICAgICAgaWYoIShTaVNfSXNWQU1vZGUoU2lTX1ByKSkpIHRlbXBhaCA9IDB4YmY7CiAJICAgfQogCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUYsdGVtcGFoKTsKIAotICAgICAgICAgICBpZigoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSB8fAotCSAgICAgICgoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgJiYgKG1vZGVudW0gPD0gMHgxMykpKSB7CisJICAgaWYoKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSB8fAorCSAgICAgICgoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgJiYgKG1vZGVudW0gPD0gMHgxMykpKSB7CiAKIAkgICAgICBTaVNfRGlzcGxheU9mZihTaVNfUHIpOwotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkJIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAyKTsKKwkgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CisJCSBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOwogCSAgICAgIH0KIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweERGKTsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFFLDB4REYpOwogCiAJICAgfQogCi0JICAgaWYoKCEoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSkgfHwKLQkgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpICYmIChtb2RlbnVtIDw9IDB4MTMpKSkgeworCSAgIGlmKCghKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgfHwKKwkgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpICYmIChtb2RlbnVtIDw9IDB4MTMpKSkgewogCi0JICAgICAgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHsKKwkgICAgICBpZighKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB7CiAJCSBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4ZGYpOwogCQkgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKIAkgICAgICB9CiAJICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4ODApOwogCi0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgewotCQkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDIpOworCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkJIFNpU19QYW5lbERlbGF5KFNpU19QciwgMik7CiAJICAgICAgfQogCiAJICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MzIsMHhERik7CiAJICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApOwotICAgICAgICAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHgxMCk7CisJICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4MTApOwogCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4REYpOwogCSAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsdGVtcCk7CiAKIAkgICB9CiAKLQkgICBpZihTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIsSHdJbmZvKSkgeworCSAgIGlmKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpIHsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4N2YpOwogCSAgIH0KIAotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CisKKwkgICAgICBpZiggKCEoU2lTX0lzVkFNb2RlKFNpU19QcikpKSAgJiYKKwkJICAoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSAmJgorCQkgICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSApIHsKKworCQkgaWYoY3VzdG9tMSkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAyKTsKKwkJIGlmKCFkaWRwd2QpIHsKKwkJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7CisJCSB9CisJCSBpZihjdXN0b20xKSBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDQpOworCSAgICAgIH0KIAogCSAgICAgIGlmKCFjdXN0b20xKSB7Ci0KLQkgICAgICAgICBpZighKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkpIHsKLQkgICAgICAgICAgICBpZighKFNpU19DUlQySXNMQ0QoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICAgICAgICAgICAgaWYoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHsKLQkJICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgIH0KLQotCSAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA2LHB1c2hheCk7Ci0KLQkJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKLQkgICAgICAgICAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QciwgSHdJbmZvKSkgewotCQkgICAgICAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAyMCk7Ci0JCSAgICB9Ci0JICAgICAgICAgfQotCi0JICAgICAgfSBlbHNlIHsKLQotCQkgaWYoKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgfHwKLQkJICAgICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcixId0luZm8pKSkpIHsKLQkJICAgIGlmKCghKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QciwgSHdJbmZvKSkpIHx8Ci0JCSAgICAgICAoIShTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkpKSB7Ci0JCSAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7Ci0JICAgICAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7Ci0JCSAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgNCk7CisJCSBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNixwdXNoYXgpOworCQkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CisJCSAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QcikpIHsKKwkJICAgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIDMsIDIwKTsKIAkJICAgIH0KIAkJIH0KLQogCSAgICAgIH0KLSAgICAgICAgICAgfQorCisJICAgfQogCiAjZW5kaWYgLyogU0lTMzE1SCAqLwogCkBAIC00MDIwLDM2ICs0MDkwLDM2IEBACiAKICAgICAgfSBlbHNlIHsgICAgIC8qID09PT09PT09PT09PSBGb3IgMzAxID09PT09PT09PT09PT09PT0gKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogI2lmZGVmIFNJUzMwMAotICAgICAgICAgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwOCk7Ci0JICAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCSAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIpKSkgeworCSAgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RjcsMHgwOCk7CisJICAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAzKTsKIAkgICB9CiAjZW5kaWYKIAl9CiAKLSAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMCwweERGKTsgICAgICAgICAgIC8qIGRpc2FibGUgVkIgKi8KLSAgICAgICAgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKKwlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4REYpOyAgICAgICAgICAgLyogZGlzYWJsZSBWQiAqLworCVNpU19EaXNwbGF5T2ZmKFNpU19Qcik7CiAKLSAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4ODApOworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHg4MCk7CiAJfQogCi0gICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4REYpOyAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGxvY2sgbW9kZSAqLworCVNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4REYpOyAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGxvY2sgbW9kZSAqLwogCi0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKLSAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCwweDEwKTsKKwlpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisJICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKTsKKwkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4MTApOwogCSAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4MjApOwogCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLHRlbXApOwogCX0gZWxzZSB7CiAjaWZkZWYgU0lTMzAwCi0gICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweERGKTsgICAgICAgICAgICAvKiBkaXNhYmxlIENSVDIgKi8KLQkgICAgaWYoICghKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSkgfHwKLQkgICAgICAgICghKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLEh3SW5mbykpKSApIHsKLQkJU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDIpOwotCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDA0KTsKKwkgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MUUsMHhERik7ICAgICAgICAgICAgLyogZGlzYWJsZSBDUlQyICovCisJICAgIGlmKCAoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSB8fAorCQkoIShTaVNfQ1IzNkJJT1NXb3JkMjNkKFNpU19QcikpKSApIHsKKwkJU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAyKTsKKwkJU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDA0KTsKIAkgICAgfQogI2VuZGlmCiAJfQpAQCAtNDA1OCwzNCArNDEyOCwzNCBAQAogCiAgIH0gZWxzZSB7ICAgICAvKiA9PT09PT09PT09PT0gRm9yIExWRFMgPT09PT09PT09PT09PSovCiAKLSAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAKICNpZmRlZiBTSVMzMDAJLyogMzAwIHNlcmllcyAqLwogCiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKSB7Ci0JICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwOTBFKTsKKwkgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDBFLDB4MDkpOwogCX0KIAotCWlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183MzApIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApIHsKIAkgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDExKSAmIDB4MDgpKSB7Ci0JICAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByLEh3SW5mbyk7CisJICAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKIAkgICB9Ci0JICAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNiKFNpU19QcixId0luZm8pKSkgewotCSAgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLEh3SW5mbywweEY3LDB4MDgpOwotCSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAzKTsKKwkgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByKSkpIHsKKwkgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDgpOworCSAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMyk7CiAJICAgfQogCX0gZWxzZSB7CiAJICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxMSkgJiAweDA4KSkgewogCSAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg0MCkpIHsKLSAgCSAgICAgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIsSHdJbmZvKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByLEh3SW5mbyk7CisJCSBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByKSkpIHsKKwkJICAgIFNpU19XYWl0VkJSZXRyYWNlKFNpU19Qcik7CiAJCSAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA2KSAmIDB4MWMpKSB7CiAJCSAgICAgICBTaVNfRGlzcGxheU9mZihTaVNfUHIpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGNywweDA4KTsKLQkgICAgICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMyk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQorCQkgICAgfQorCQkgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGNywweDA4KTsKKwkJICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMyk7CisJCSB9CisJICAgICAgfQogCSAgIH0KIAl9CiAKQEAgLTQwOTQsMTQgKzQxNjQsMTQgQEAKIAlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1AzYzQsMHgzMiwweERGKTsKIAogCVNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4REYpOwotCVNpU19VbkxvY2tDUlQyKFNpU19QcixId0luZm8pOworCVNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAJU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ODApOwogCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMiwweDQwKTsKIAotCWlmKCAoIShTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkpIHx8Ci0JICAgICghKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLEh3SW5mbykpKSApIHsKLQkgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7Ci0JICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkIsMHgwNCk7CisJaWYoICghKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByKSkpICkgeworCSAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMik7CisJICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDA0KTsKIAl9CiAKICNlbmRpZiAgLyogU0lTMzAwICovCkBAIC00MTEwLDExMyArNDE4MCwxMTMgQEAKIAogI2lmZGVmIFNJUzMxNUgJLyogMzE1IHNlcmllcyAqLwogCi0gICAgICAgIGlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzQwKSB7Ci0gICAgICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NGMsfjB4MTgpOwotCSAgIH0KLSAgICAgICAgfQorCWlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByKSkpIHsKKwkgICAvKmlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzQwKSB7ICovIC8qIFhHSSBuZWVkcyB0aGlzICovCisJICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0Yyx+MHgxOCk7CisJICAgLyogfSAqLworCX0KIAogCWlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCSAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDYxKTsKIAkgICAgICBpZih0ZW1wIDwgMSkgewotCSAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4YWM3Nik7Ci0JICAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMDY2KTsKKwkJIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsMHhhYyk7CisJCSBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LDB4MDApOwogCSAgICAgIH0KIAotCSAgICAgIGlmKCAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JICAgICAgICAgIChTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcixId0luZm8pKSApIHsKLQkgIAkgU2lTX1NldENINzAxeChTaVNfUHIsMHgzZTQ5KTsKKwkgICAgICBpZiggKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJCSAgKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByKSkgKSB7CisJCSBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LDB4M2UpOwogCSAgICAgIH0KIAkgICB9CiAKLQkgICBpZiggKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpKSB8fAotCSAgICAgICAoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSApIHsKKwkgICBpZiggKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICAgIChTaVNfSXNWQU1vZGUoU2lTX1ByKSkgKSB7CiAJICAgICAgU2lTX0Nocm9udGVsNzAxeEJMT2ZmKFNpU19Qcik7Ci0JICAgICAgU2lTX0Nocm9udGVsNzAxeE9mZihTaVNfUHIsSHdJbmZvKTsKKwkgICAgICBTaVNfQ2hyb250ZWw3MDF4T2ZmKFNpU19Qcik7CiAJICAgfQogCi0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzc0MCkgewotCSAgICAgIGlmKCAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JICAgICAgICAgIChTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcixId0luZm8pKSApIHsKLQkgICAJIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDE0OSk7Ci0gIAkgICAgICB9CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfNzQwKSB7CisJICAgICAgaWYoICghKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpKSB8fAorCQkgIChTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcikpICkgeworCQkgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSwweDAxKTsKKwkgICAgICB9CiAJICAgfQogCiAJfQogCiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSB7Ci0JICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwOCk7Ci0JICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDMpOworCSAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RjcsMHgwOCk7CisJICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAzKTsKIAl9CiAKIAlpZiggKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMCkgICB8fAotCSAgICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JICAgICghKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByLEh3SW5mbykpKSApIHsKKwkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByKSkpICkgewogCSAgIFNpU19EaXNwbGF5T2ZmKFNpU19Qcik7CiAJfQogCiAJaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApICAgfHwKLQkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpKSB8fAotCSAgICAoIShTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpKSApIHsKKwkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgKSB7CiAJICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4ODApOwogCX0KIAotCWlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183NDApIHsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4N2YpOwogCX0KIAogCVNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNjNCwweDMyLDB4REYpOwogCiAJaWYoIChTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApICAgfHwKLQkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByLEh3SW5mbykpKSB8fAotCSAgICAoIShTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpKSApIHsKKwkgICAgKCEoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkpIHx8CisJICAgICghKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgKSB7CiAJICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MUUsMHhERik7CiAJfQogCiAJaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSB7Ci0JICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKKwkgICBpZihTaVNfQ1JUMklzTENEKFNpU19QcikpIHsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4ZGYpOwotCSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKLQkgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4YmYpOwotCSAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MWUsMHhlZik7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTUwKSB7CisJCSBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4YmYpOworCQkgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxZSwweGVmKTsKIAkgICAgICB9CiAJICAgfQogCX0gZWxzZSB7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgewotCSAgICAgIGlmKFNpU19Jc0xDRE9yTENEQShTaVNfUHIsSHdJbmZvKSkgewotCSAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MWUsMHhkZik7CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisJICAgICAgaWYoU2lTX0lzTENET3JMQ0RBKFNpU19QcikpIHsKKwkJIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MWUsMHhkZik7CiAJICAgICAgfQotCSAgIH0gZWxzZSBpZihTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpIHsKKwkgICB9IGVsc2UgaWYoU2lTX0lzVkFNb2RlKFNpU19QcikpIHsKIAkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4ZGYpOwogCSAgIH0KIAl9CiAKIAlpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLQkgICBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkgeworCSAgIGlmKFNpU19Jc0R1YWxFZGdlKFNpU19QcikpIHsKIAkgICAgICAvKiBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4ZmYpOyAqLwogCSAgIH0gZWxzZSB7CiAJICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMywweGZiKTsKIAkgICB9CiAJfQogCi0JU2lTX1VuTG9ja0NSVDIoU2lTX1ByLEh3SW5mbyk7CisJU2lTX1VuTG9ja0NSVDIoU2lTX1ByKTsKIAotCWlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU181NTApIHsKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHg4MCk7IC8qIERpcmVjdERWRCBQQUw/Ki8KIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHg0MCk7IC8qIFZCIGNsb2NrIC8gNCA/ICovCiAJfSBlbHNlIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAwKSAgIHx8Ci0JICAgICAgICAgICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIsSHdJbmZvKSkpIHx8Ci0JCSAgICghKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkpICkgeworCQkgICAoIShTaVNfSXNEdWFsRWRnZShTaVNfUHIpKSkgfHwKKwkJICAgKCEoU2lTX0lzVkFNb2RlKFNpU19QcikpKSApIHsKIAkgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4ZjcpOwogCX0KIAogICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApIHsKLQkgICBpZihTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkgewotCSAgICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLEh3SW5mbykpKSB7Ci0JIAkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDIpOwotCQkgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkIsMHgwNCk7CisJICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSB7CisJICAgICAgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSkgeworCQkgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAyKTsKKwkJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RkIsMHgwNCk7CiAJICAgICAgfQogCSAgIH0KICAgICAgICAgfQpAQCAtNDIzNyw3OCArNDMwNyw4MSBAQAogICogZnJvbSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGEgbW9kZSBzd2l0Y2ghCiAgKiBNVVNUIGNhbGwgZ2V0VkJUeXBlIGJlZm9yZSBjYWxsaW5nIHRoaXMKICAqLwotc3RhdGljIHZvaWQKLVNpU19FbmFibGVCcmlkZ2UoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitzdGF0aWMKKyNlbmRpZgordm9pZAorU2lTX0VuYWJsZUJyaWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIHRlbXA9MCx0ZW1wYWg7CisgIHVuc2lnbmVkIHNob3J0IHRlbXA9MCwgdGVtcGFoOwogI2lmZGVmIFNJUzMxNUgKLSAgVVNIT1JUIHRlbXAxLHB1c2hheD0wOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wMSwgcHVzaGF4PTA7CiAgIEJPT0xFQU4gZGVsYXlsb25nID0gRkFMU0U7CiAjZW5kaWYKIAogICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7ICAgLyogPT09PT09IEZvciAzMDFCIGV0IGFsICA9PT09PT0gKi8KKyAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsJCS8qID09PT09PSBGb3IgMzAxQiBldCBhbCAgPT09PT09ICovCiAKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgICAvKiAzMDAgc2VyaWVzICovCiAKLQkgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgeworCSBpZihTaVNfQ1JUMklzTENEKFNpU19QcikpIHsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogCSAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMik7CiAJICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewotCSAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDAwKTsKKwkgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDAwKTsKIAkgICAgfQotCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxTFYzMDJMViB8IFZCX05vTENEKSkgewotCSAgICAgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLCBId0luZm8pKSkgewotCSAgICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMCk7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVNMVkRTIHwgVkJfTm9MQ0QpKSB7CisJICAgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzZChTaVNfUHIpKSkgeworCQkgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMCk7CiAJICAgICAgIH0KIAkgICAgfQogCSB9CiAKIAkgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJgotCSAgICAoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpKSB7CisJICAgIChTaVNfQ1JUMklzTENEKFNpU19QcikpKSB7CiAKIAkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsgICAJCS8qIEVuYWJsZSBDUlQyICovCi0gICAgICAgICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0JICAgIFNpU19VbkxvY2tDUlQyKFNpU19QcixId0luZm8pOworCSAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CisJICAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHhCRik7CiAJICAgIGlmKFNpU19CcmlkZ2VJblNsYXZlbW9kZShTaVNfUHIpKSB7Ci0gICAgICAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHgxRik7Ci0gICAgICAJICAgIH0gZWxzZSB7Ci0gICAgICAJICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDFGLDB4NDApOwotICAgICAgICAgICAgfQorCSAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4MUYpOworCSAgICB9IGVsc2UgeworCSAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHgxRiwweDQwKTsKKwkgICAgfQogCSAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDEzKSAmIDB4NDApKSB7CiAJICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTYpICYgMHgxMCkpIHsKLQkJICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByLEh3SW5mbykpKSB7Ci0JCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotICAgICAgICAgICAgICAgICAgfQotCQkgIFNpU19XYWl0VkJSZXRyYWNlKFNpU19QcixId0luZm8pOwotICAgICAgICAgICAgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwMCk7Ci0gICAgICAgICAgICAgICB9CisJCSAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNiKFNpU19QcikpKSB7CisJCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkJICB9CisJCSAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKKwkJICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDApOworCSAgICAgICB9CiAJICAgIH0KIAogCSB9IGVsc2UgewogCiAJICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMikgJiAweERGOyAgICAgICAgICAgICAvKiBsb2NrIG1vZGUgKi8KLSAgICAgICAgICAgIGlmKFNpU19CcmlkZ2VJblNsYXZlbW9kZShTaVNfUHIpKSB7Ci0gICAgICAgICAgICAgICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7Ci0gICAgICAgICAgICAgICBpZighKHRlbXBhaCAmIFNldENSVDJUb1JBTURBQykpIHRlbXAgfD0gMHgyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyLHRlbXApOworCSAgICBpZihTaVNfQnJpZGdlSW5TbGF2ZW1vZGUoU2lTX1ByKSkgeworCSAgICAgICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMCk7CisJICAgICAgIGlmKCEodGVtcGFoICYgU2V0Q1JUMlRvUkFNREFDKSkgdGVtcCB8PSAweDIwOworCSAgICB9CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyLHRlbXApOwogCSAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4MjApOwogCSAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDAsMHgxRiwweDIwKTsgICAgICAgIC8qIGVuYWJsZSBWQiBwcm9jZXNzb3IgKi8KIAkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDFGLDB4QzApOwogCSAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0JICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLQkgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDEwKSkgewotCQkgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIsSHdJbmZvKSkpIHsKLQkJICAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMSk7Ci0gICAgICAgICAgICAgICAgICAgICB9CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKwkgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSB7CisJCSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDEwKSkgeworCQkgICAgIGlmKCEoU2lTX0NSMzZCSU9TV29yZDIzYihTaVNfUHIpKSkgeworCQkgICAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMSk7CisJCSAgICAgfQogCQkgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNiwweDAxKTsKLQkgCSAgfQorCQkgIH0KIAkgICAgICAgfQogCSAgICB9CiAKQEAgLTQzMjIsMzEgKzQzOTUsMzIgQEAKICNpZmRlZiBTSVMzMTVIICAgIC8qIDMxNSBzZXJpZXMgKi8KIAogI2lmZGVmIFNFVF9FTUkKLQkgVUNIQVIgICByMzA9MCwgcjMxPTAsIHIzMj0wLCByMzM9MCwgY3IzNj0wOwotCSAvKiBVU0hPUlQgIGVtaWRlbGF5PTA7ICovCisJIHVuc2lnbmVkIGNoYXIgICByMzA9MCwgcjMxPTAsIHIzMj0wLCByMzM9MCwgY3IzNj0wOworCSBpbnQgZGlkcHdkID0gMDsKKwkgLyogdW5zaWduZWQgc2hvcnQgIGVtaWRlbGF5PTA7ICovCiAjZW5kaWYKIAotCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB7CisJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKIAkgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxZiwweGVmKTsKICNpZmRlZiBTRVRfRU1JCi0JICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAJICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7CiAJICAgIH0KICNlbmRpZgogCSB9CiAKLSAgICAgICAgIGlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLCBId0luZm8pKSkgewotCSAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zNDApIHsKKwkgaWYoIShTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIpKSkgeworCSAgICAvKmlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzQwKSB7ICovCiAJICAgICAgIHRlbXBhaCA9IDB4MTA7Ci0JICAgICAgIGlmKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgICAgICAgaWYoU2lTX1RWRW5hYmxlZChTaVNfUHIsIEh3SW5mbykpIHRlbXBhaCA9IDB4MTg7Ci0JICAgICAgICAgIGVsc2UgCQkJICAgICAgICAgICAgdGVtcGFoID0gMHgwODsKKwkgICAgICAgaWYoU2lTX0xDREFFbmFibGVkKFNpU19QcikpIHsKKwkJICBpZihTaVNfVFZFbmFibGVkKFNpU19QcikpIHRlbXBhaCA9IDB4MTg7CisJCSAgZWxzZQkJCSAgICB0ZW1wYWggPSAweDA4OwogCSAgICAgICB9CiAJICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NGMsdGVtcGFoKTsKLQkgICAgfQorCSAgICAvKn0qLwogCSB9CiAKLQkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgeworCSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CiAKIAkgICAgU2lTX1NldFJlZ0J5dGUoU2lTX1ByLT5TaVNfUDNjNiwweDAwKTsKIAkgICAgU2lTX0Rpc3BsYXlPZmYoU2lTX1ByKTsKQEAgLTQzNTUsNDIgKzQ0MjksNTEgQEAKIAkgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2M0LDB4MDYsMHhFMyk7CiAJICAgIH0KIAotCSAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QciwgSHdJbmZvKSkgewotICAgICAgICAgICAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2KSAmIDB4MDIpKSB7Ci0JCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAyKTsKLQkJICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMik7Ci0JCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAyKTsKLQkJICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7Ci0JCSAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDB4NDUwMCk7CisJICAgIGRpZHB3ZCA9IFNpU19IYW5kbGVQV0QoU2lTX1ByKTsKKworCSAgICBpZihTaVNfSXNWQW9yTENEKFNpU19QcikpIHsKKwkgICAgICAgaWYoIWRpZHB3ZCkgeworCQkgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNikgJiAweDAyKSkgeworCQkgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIDMsIDIpOworCQkgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNiwweDAyKTsKKwkJICAgICBTaVNfUGFuZWxEZWxheUxvb3AoU2lTX1ByLCAzLCAyKTsKKwkJICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNFTUkpIHsKKwkJICAgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgMTc2NjQpOworCQkgICAgIH0KKwkJICB9CisJICAgICAgIH0gZWxzZSB7CisJCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgMywgMik7CisJCSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CisJCSAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDE3NjY0KTsKIAkJICB9CiAJICAgICAgIH0KIAkgICAgfQogCiAJICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzEpICYgMHg0MCkpIHsKLSAgICAgICAgICAgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIEh3SW5mbywgMywgMTApOworCSAgICAgICBTaVNfUGFuZWxEZWxheUxvb3AoU2lTX1ByLCAzLCAxMCk7CiAJICAgICAgIGRlbGF5bG9uZyA9IFRSVUU7CiAJICAgIH0KIAogCSB9CiAKLQkgaWYoIShTaVNfSXNWQU1vZGUoU2lTX1ByLEh3SW5mbykpKSB7CisJIGlmKCEoU2lTX0lzVkFNb2RlKFNpU19QcikpKSB7CiAKLSAgICAgICAgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMikgJiAweERGOworCSAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MzIpICYgMHhERjsKIAkgICAgaWYoU2lTX0JyaWRnZUluU2xhdmVtb2RlKFNpU19QcikpIHsKLSAgICAgICAgICAgICAgIHRlbXBhaCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDMwKTsKLSAgICAgICAgICAgICAgIGlmKCEodGVtcGFoICYgU2V0Q1JUMlRvUkFNREFDKSkgewotCQkgIGlmKCEoU2lTX0xDREFFbmFibGVkKFNpU19QciwgSHdJbmZvKSkpIHRlbXAgfD0gMHgyMDsKKwkgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOworCSAgICAgICBpZighKHRlbXBhaCAmIFNldENSVDJUb1JBTURBQykpIHsKKwkJICBpZighKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIpKSkgdGVtcCB8PSAweDIwOwogCSAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMix0ZW1wKTsKKwkgICAgfQorCSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzMix0ZW1wKTsKIAogCSAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUDNjNCwweDFFLDB4MjApOyAgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgQ1JUMiAqLwogCiAJICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmUsMHg3Zik7CiAJICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDgwKTsKIAotCSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB7Ci0JICAgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAyKTsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgeworCSAgICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOwogCSAgICB9CiAKIAkgfSBlbHNlIHsKQEAgLTQ0MDIsMzggKzQ0ODUsNDggQEAKIAkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLDB4MWYsMHgyMCk7CiAJIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDgwKTsKIAotCSB0ZW1wYWggPSAweGMwOwotCSBpZihTaVNfSXNEdWFsRWRnZShTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgdGVtcGFoID0gMHg4MDsKLQkgICAgaWYoIShTaVNfSXNWQU1vZGUoU2lTX1ByLCBId0luZm8pKSkgdGVtcGFoID0gMHg0MDsKKwkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUE9XRVIpIHsKKwkgICAgaWYoIChTaVNfTENEQUVuYWJsZWQoU2lTX1ByKSkgfHwKKwkgICAgICAgIChTaVNfQ1JUMklzTENEKFNpU19QcikpICkgeworCSAgICAgICAvKiBFbmFibGUgIkxWRFMgUExMIHBvd2VyIG9uIiAoZXZlbiBvbiAzMDFDKSAqLworCSAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJhLDB4N2YpOworCSAgICAgICAvKiBFbmFibGUgIkxWRFMgRHJpdmVyIFBvd2VyIG9uIiAoZXZlbiBvbiAzMDFDKSAqLworCSAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4N2YpOworCSAgICB9CiAJIH0KLSAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxRix0ZW1wYWgpOwogCi0JIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgdGVtcGFoID0gMHhjMDsKKwkgaWYoU2lTX0lzRHVhbEVkZ2UoU2lTX1ByKSkgeworCSAgICB0ZW1wYWggPSAweDgwOworCSAgICBpZighKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgdGVtcGFoID0gMHg0MDsKKwkgfQorCSBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUYsdGVtcGFoKTsKIAotCSAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMik7CisJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKKworCSAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDIpOwogCiAJICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxZiwweDEwKTsKIAkgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4ODApOwogCiAJICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgIT0gQ1VUX0NMRVZPMTQwMCkgewogI2lmZGVmIFNFVF9FTUkKLQkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgewotCSAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4MGMpOwotCQkgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCAweDUwMCk7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0VNSSkgeworCQkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7CisJCSAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDIwNDgpOwogCSAgICAgICB9CiAjZW5kaWYKIAkgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI3LDB4MGMpOwogCi0JICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAjaWZkZWYgU0VUX0VNSQogCQkgIGNyMzYgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNik7CiAKIAkJICBpZihTaVNfUHItPlNpU19ST01OZXcpIHsKLQkJICAgICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0JCSAgICAgVVNIT1JUIHJvbXB0ciA9IEdldExDRFN0cnVjdFB0cjY2MV8yKFNpU19QciwgSHdJbmZvKTsKKwkJICAgICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisJCSAgICAgdW5zaWduZWQgc2hvcnQgcm9tcHRyID0gR2V0TENEU3RydWN0UHRyNjYxXzIoU2lTX1ByKTsKIAkJICAgICBpZihyb21wdHIpIHsKLQkJICAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgyMCk7IC8qIFJlc2V0ICovCisJCQlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgyMCk7IC8qIFJlc2V0ICovCiAJCQlTaVNfUHItPkVNSV8zMCA9IDA7CiAJCQlTaVNfUHItPkVNSV8zMSA9IFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ICsgMF07CiAJCQlTaVNfUHItPkVNSV8zMiA9IFJPTUFkZHJbcm9tcHRyICsgU2lTX1ByLT5TaVNfRU1JT2Zmc2V0ICsgMV07CkBAIC00NTExLDIxICs0NjA0LDIxIEBACiAJCSAgaWYoIVNpU19Qci0+T3ZlcnJ1bGVFTUkpIHsKICNpZmRlZiBDT01QQUxfSEFDSwogCQkgICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBTDE0MDBfMikgewotCQkgICAgICAgIGlmKChjcjM2ICYgMHgwZikgPT0gMHgwOSkgeworCQkJaWYoKGNyMzYgJiAweDBmKSA9PSAweDA5KSB7CiAJCQkgICByMzAgPSAweDYwOyByMzEgPSAweDA1OyByMzIgPSAweDYwOyByMzMgPSAweDAwOwogCQkJfQogIAkJICAgICB9CiAjZW5kaWYKICNpZmRlZiBDT01QQVFfSEFDSwogCQkgICAgIGlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBUTEyODApIHsKLQkJICAgICAgICBpZigoY3IzNiAmIDB4MGYpID09IDB4MDMpIHsKKwkJCWlmKChjcjM2ICYgMHgwZikgPT0gMHgwMykgewogCQkJICAgcjMwID0gMHgyMDsgcjMxID0gMHgxMjsgcjMyID0gMHhkMDsgcjMzID0gMHg2YjsKIAkJCX0KIAkJICAgICB9CiAjZW5kaWYKICNpZmRlZiBBU1VTX0hBQ0sKIAkJICAgICBpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9BU1VTQTJIXzIpIHsKLQkJICAgICAgICBpZigoY3IzNiAmIDB4MGYpID09IDB4MDIpIHsKKwkJCWlmKChjcjM2ICYgMHgwZikgPT0gMHgwMikgewogCQkJICAgLyogcjMwID0gMHg2MDsgcjMxID0gMHgwNTsgcjMyID0gMHg2MDsgcjMzID0gMHgzMzsgICovICAgLyogcmV2IDIgKi8KIAkJCSAgIC8qIHIzMCA9IDB4MjA7IHIzMSA9IDB4MDU7IHIzMiA9IDB4NjA7IHIzMyA9IDB4MzM7ICAqLyAgIC8qIHJldiAzICovCiAJCQkgICAvKiByMzAgPSAweDYwOyByMzEgPSAweDBkOyByMzIgPSAweDcwOyByMzMgPSAweDQwOyAgKi8gICAvKiByZXYgNCAqLwpAQCAtNDUzMywxMSArNDYyNiwxMSBAQAogCQkJfQogCQkgICAgIH0KICNlbmRpZgotIAkJICB9CisJCSAgfQogCiAJCSAgaWYoIShTaVNfUHItPk92ZXJydWxlRU1JICYmICghcjMwKSAmJiAoIXIzMSkgJiYgKCFyMzIpICYmICghcjMzKSkpIHsKIAkJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgyMCk7IC8qIFJlc2V0ICovCi0JCSAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDB4NTAwKTsKKwkJICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgMjA0OCk7CiAJCSAgfQogCQkgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzEscjMxKTsKIAkJICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMyLHIzMik7CkBAIC00NTQ3LDM2ICs0NjQwLDQ0IEBACiAJCSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzNCwweDEwKTsKIAogI2lmZGVmIFNFVF9FTUkKLQkJICBpZiggKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIsIEh3SW5mbykpIHx8Ci0JICAgICAgICAgICAgICAoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpICkgewotCSAgICAgICAgICAgICBpZihyMzAgJiAweDQwKSB7Ci0JCSAgICAgICAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCA1KTsKKwkJICBpZiggKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIpKSB8fAorCQkgICAgICAoU2lTX0NSVDJJc0xDRChTaVNfUHIpKSApIHsKKwkJICAgICBpZihyMzAgJiAweDQwKSB7CisJCQkvKlNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYSwweDgwKTsqLworCQkJU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgMywgNSk7CiAJCQlpZihkZWxheWxvbmcpIHsKLQkJCSAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIEh3SW5mbywgMywgNSk7CisJCQkgICBTaVNfUGFuZWxEZWxheUxvb3AoU2lTX1ByLCAzLCA1KTsKIAkJCSAgIGRlbGF5bG9uZyA9IEZBTFNFOwogCQkJfQotCQkJU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByLEh3SW5mbyk7CisJCQlTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIpOworCQkJU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKIAkJCWlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0FTVVNBMkhfMikgewotCQkJICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDB4NTAwKTsKKwkJCSAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCAxMjgwKTsKIAkJCX0KLQkgICAgICAgICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4NDApOyAgIC8qIEVuYWJsZSAqLwotCSAgICAgICAgICAgICB9CisJCQlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHg0MCk7ICAgLyogRW5hYmxlICovCisJCQkvKlNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MmEsMHg3Zik7Ki8KKwkJICAgICB9CiAJCSAgfQogI2VuZGlmCiAJICAgICAgIH0KIAkgICAgfQogCi0JICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICAgIGlmKFNpU19Jc1ZBb3JMQ0QoU2lTX1ByLCBId0luZm8pKSB7Ci0JCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgSHdJbmZvLCAzLCAxMCk7CisJICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByKSkpIHsKKwkgICAgICAgaWYoU2lTX0lzVkFvckxDRChTaVNfUHIpKSB7CisJCSAgU2lTX1BhbmVsRGVsYXlMb29wKFNpU19QciwgMywgMTApOwogCQkgIGlmKGRlbGF5bG9uZykgewotCQkgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIEh3SW5mbywgMywgMTApOworCQkgICAgIFNpU19QYW5lbERlbGF5TG9vcChTaVNfUHIsIDMsIDEwKTsKIAkJICB9Ci0gICAgICAgICAgICAgICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIsSHdJbmZvKTsKLQkJICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7Ci0JIAkgICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCAweDUwMCk7CisJCSAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKKwkJICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNFTUkpIHsKKwkJICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgMjA0OCk7CisJCSAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKIAkJICB9Ci0JCSAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4MDEpOworCQkgIGlmKCFkaWRwd2QpIHsKKwkJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMSk7CisJCSAgfSBlbHNlIHsKKwkJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHgwMyk7CisJCSAgfQogCSAgICAgICB9CiAJICAgIH0KIApAQCAtNDU4Niw3ICs0Njg3LDcgQEAKIAogCSB9CiAKLQkgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIsSHdJbmZvKSkpIHsKKwkgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSkgewogCSAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4N2YpOwogCSB9CiAKQEAgLTQ1OTYsMjYgKzQ2OTcsMjYgQEAKIAogICAgIH0gZWxzZSB7CS8qID09PT09PT09PT09PSAgRm9yIDMwMSA9PT09PT09PT09PT09PT09ICovCiAKLSAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLSAgICAgICAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGQiwweDAwKTsKLQkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAwKTsKKyAgICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDAwKTsKKwkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMCk7CiAJICB9CiAgICAgICAgfQogCiAgICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyKSAmIDB4REY7ICAgICAgICAgIC8qIGxvY2sgbW9kZSAqLwogICAgICAgIGlmKFNpU19CcmlkZ2VJblNsYXZlbW9kZShTaVNfUHIpKSB7Ci0gICAgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOwotICAgICAgICAgIGlmKCEodGVtcGFoICYgU2V0Q1JUMlRvUkFNREFDKSkgdGVtcCB8PSAweDIwOworCSAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzApOworCSAgaWYoISh0ZW1wYWggJiBTZXRDUlQyVG9SQU1EQUMpKSB0ZW1wIHw9IDB4MjA7CiAgICAgICAgfQogICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDMyLHRlbXApOwogCiAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsgICAgICAgICAgICAgICAgICAvKiBlbmFibGUgQ1JUMiAqLwogCi0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSk7Ci0gICAgICAgICAgaWYoISh0ZW1wICYgMHg4MCkpIHsKLSAgICAgICAgICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkUsMHg4MCk7ICAgICAgICAgLyogQlZCRE9FTkFCTEU9MSAqLworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJFKTsKKwkgIGlmKCEodGVtcCAmIDB4ODApKSB7CisJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkUsMHg4MCk7ICAgICAgICAgLyogQlZCRE9FTkFCTEU9MSAqLwogCSAgfQogICAgICAgIH0KIApAQCAtNDYyMywxNSArNDcyNCwxNSBAQAogCiAgICAgICAgU2lTX1ZCTG9uZ1dhaXQoU2lTX1ByKTsKICAgICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7Ci0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4N2YpOworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHg3Zik7CiAgICAgICAgfQogICAgICAgIFNpU19WQkxvbmdXYWl0KFNpU19Qcik7CiAKLSAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgSHdJbmZvLCAxKTsKLSAgICAgICAgICAgICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGNywweDAwKTsKKyAgICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RjcsMHgwMCk7CiAJICB9CiAgICAgICAgfQogCkBAIC00NjM5LDQ5ICs0NzQwLDQ5IEBACiAKICAgfSBlbHNlIHsgICAvKiA9PT09PT09PT09PT09PT09PT09IEZvciBMVkRTID09PT09PT09PT09PT09PT09PSAqLwogCi0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgeworICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgIC8qIDMwMCBzZXJpZXMgKi8KIAotICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSB7Ci0gICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgewotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOworICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSB7CisJICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDEpOworCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMSk7CiAJICB9Ci0gICAgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkIsMHgwMCk7Ci0JICBpZighKFNpU19DUjM2QklPU1dvcmQyM2QoU2lTX1ByLEh3SW5mbykpKSB7Ci0JICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMCk7CisJICBTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEZCLDB4MDApOworCSAgaWYoIShTaVNfQ1IzNkJJT1NXb3JkMjNkKFNpU19QcikpKSB7CisJICAgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIDApOwogCSAgfQogICAgICAgIH0KIAogICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2M0LDB4MUUsMHgyMCk7CiAgICAgICAgU2lTX0Rpc3BsYXlPbihTaVNfUHIpOwotICAgICAgIFNpU19VbkxvY2tDUlQyKFNpU19QcixId0luZm8pOworICAgICAgIFNpU19VbkxvY2tDUlQyKFNpU19Qcik7CiAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMiwweEJGKTsKICAgICAgICBpZihTaVNfQnJpZGdlSW5TbGF2ZW1vZGUoU2lTX1ByKSkgewotICAgICAgCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDFGKTsKKwkgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEsMHgxRik7CiAgICAgICAgfSBlbHNlIHsKLSAgICAgIAkgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDFGLDB4NDApOworCSAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4MUYsMHg0MCk7CiAgICAgICAgfQogCiAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKSB7Ci0gICAgICAgICAgaWYoIShTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkpIHsKLQkgICAgIFNpU19XYWl0VkJSZXRyYWNlKFNpU19QciwgSHdJbmZvKTsKLQkgICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MEIwRSk7Ci0gICAgICAgICAgfQorCSAgaWYoIShTaVNfQ1JUMklzTENEKFNpU19QcikpKSB7CisJICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIpOworCSAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwRSwweDBCKTsKKwkgIH0KICAgICAgICB9CiAKLSAgICAgICBpZihTaVNfQ1JUMklzTENEKFNpU19QciwgSHdJbmZvKSkgewotICAgICAgICAgIGlmKCEoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTMpICYgMHg0MCkpIHsKLSAgICAgICAgICAgICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KSAmIDB4MTApKSB7Ci0JICAgICAgICBpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByLEh3SW5mbykpKSB7Ci0JIAkgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMSk7Ci0gICAgICAgIAkgICBTaVNfUGFuZWxEZWxheShTaVNfUHIsIEh3SW5mbywgMSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIsIEh3SW5mbyk7Ci0gICAgICAgICAgICAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RjcsMHgwMCk7Ci0gICAgICAgICAgICAgfQorICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxMykgJiAweDQwKSkgeworCSAgICAgaWYoIShTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxNikgJiAweDEwKSkgeworCQlpZighKFNpU19DUjM2QklPU1dvcmQyM2IoU2lTX1ByKSkpIHsKKwkJICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkJICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCAxKTsKKwkJfQorCQlTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIpOworCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDApOworCSAgICAgfQogCSAgfQogICAgICAgIH0KIApAQCAtNDY5MSw5NCArNDc5Miw5NCBAQAogCiAjaWZkZWYgU0lTMzE1SCAgICAvKiAzMTUgc2VyaWVzICovCiAKLSAgICAgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcixId0luZm8pKSkgewotICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzM0MCkgewotICAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0YywweDE4KTsKLQkgIH0KKyAgICAgICBpZighKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpKSB7CisJICAvKmlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzQwKSB7Ki8gIC8qIFhHSSBuZWVkcyB0aGlzICovCisJICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NGMsMHgxOCk7CisJICAvKn0qLwogICAgICAgIH0KIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMCkgewotCSAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkgICAgIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLEh3SW5mbywweEZCLDB4MDApOwotCSAgICAgU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDApOwotICAgICAgICAgIH0KKwkgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCSAgICAgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsMHhGQiwweDAwKTsKKwkgICAgIFNpU19QYW5lbERlbGF5KFNpU19QciwgMCk7CisJICB9CiAgICAgICAgfQogCiAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsKLSAgICAgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsSHdJbmZvKTsKKyAgICAgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIpOwogCiAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweGY3KTsKIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKKwkgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKIAkgIHRlbXAgJj0gMHgyMDsKIAkgIFNpU19DaHJvbnRlbDcwMXhCTE9mZihTaVNfUHIpOwogICAgICAgIH0KIAotICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlICE9IFNJU181NTApIHsKLSAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJlLDB4N2YpOworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzU1MCkgeworCSAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyZSwweDdmKTsKICAgICAgICB9CiAKLSAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7Ci0gICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgICAgICAgICAgaWYoU2lTX0lzTENET3JMQ0RBKFNpU19QciwgSHdJbmZvKSkgewotCSAgIAlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUUsMHgyMCk7CisgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisJICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKwkgICAgIGlmKFNpU19Jc0xDRE9yTENEQShTaVNfUHIpKSB7CisJCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDIwKTsKIAkgICAgIH0KIAkgIH0KICAgICAgICB9CiAKICAgICAgICB0ZW1wMSA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkUpOwogICAgICAgIGlmKCEodGVtcDEgJiAweDgwKSkgewotICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSwweDgwKTsKKwkgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRSwweDgwKTsKICAgICAgICB9CiAKICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKLSAgICAgICAgICBpZih0ZW1wKSB7Ci0JICAgICBTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIsIEh3SW5mbyk7CisJICBpZih0ZW1wKSB7CisJICAgICBTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIpOwogCSAgfQogICAgICAgIH0KIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMCkgewotICAgICAgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByLCBId0luZm8pKSB7CisJICBpZihTaVNfQ1JUMklzTENEKFNpU19QcikpIHsKIAkgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDIwKTsKLQkgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApIHsKKwkgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzU1MCkgewogCQlTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUUsMHg0MCk7CiAJCVNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDEwKTsKIAkgICAgIH0KIAkgIH0KLSAgICAgICB9IGVsc2UgaWYoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSB7Ci0gICAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzc0MCkgewotICAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRSwweDIwKTsKKyAgICAgICB9IGVsc2UgaWYoU2lTX0lzVkFNb2RlKFNpU19QcikpIHsKKwkgIGlmKFNpU19Qci0+Q2hpcFR5cGUgIT0gU0lTXzc0MCkgeworCSAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFFLDB4MjApOwogCSAgfQogICAgICAgIH0KIAotICAgICAgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLEh3SW5mbykpKSB7Ci0gICAgICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCwweDdmKTsKKyAgICAgICBpZighKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcikpKSB7CisJICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwLDB4N2YpOwogICAgICAgIH0KIAogICAgICAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICAgIAkgIGlmKFNpU19Jc1RWT3JZUGJQck9yU2NhcnQoU2lTX1ByLEh3SW5mbykpIHsKLSAgICAgICAgICAgICBTaVNfQ2hyb250ZWw3MDF4T24oU2lTX1ByLEh3SW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmKCAoU2lTX0lzVkFNb2RlKFNpU19QcixId0luZm8pKSB8fAotCSAgICAgIChTaVNfSXNMQ0RPckxDREEoU2lTX1ByLEh3SW5mbykpICkgewotICAgICAgICAgICAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMShTaVNfUHIsSHdJbmZvKTsKLSAgICAgICAgICB9CisJICBpZihTaVNfSXNUVk9yWVBiUHJPclNjYXJ0KFNpU19QcikpIHsKKwkgICAgIFNpU19DaHJvbnRlbDcwMXhPbihTaVNfUHIpOworCSAgfQorCSAgaWYoIChTaVNfSXNWQU1vZGUoU2lTX1ByKSkgfHwKKwkgICAgICAoU2lTX0lzTENET3JMQ0RBKFNpU19QcikpICkgeworCSAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKFNpU19Qcik7CisJICB9CiAgICAgICAgfQogCiAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgICAgCSAgaWYoIShTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIsSHdJbmZvKSkpIHsKLSAJICAgICBpZiggKFNpU19Jc1ZBTW9kZShTaVNfUHIsSHdJbmZvKSkgfHwKLQkgICAgICAgICAoU2lTX0lzTENET3JMQ0RBKFNpU19QcixId0luZm8pKSApIHsKLQkgICAgIAlTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIsIEh3SW5mbyk7Ci0JICAgICAJU2lTX0Nocm9udGVsSW5pdFRWVlN5bmMoU2lTX1ByLEh3SW5mbyk7Ci0gICAgICAgICAgICAgfQotICAgICAgIAkgIH0KKwkgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByKSkpIHsKKwkgICAgIGlmKCAoU2lTX0lzVkFNb2RlKFNpU19QcikpIHx8CisJCSAoU2lTX0lzTENET3JMQ0RBKFNpU19QcikpICkgeworCQlTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHIpOworCQlTaVNfQ2hyb250ZWxJbml0VFZWU3luYyhTaVNfUHIpOworCSAgICAgfQorCSAgfQogICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDApIHsKLSAgICAgICAJICBpZighKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcixId0luZm8pKSkgewotCSAgICAgaWYoU2lTX0NSVDJJc0xDRChTaVNfUHIsIEh3SW5mbykpIHsKLQkJU2lTX1BhbmVsRGVsYXkoU2lTX1ByLCBId0luZm8sIDEpOwotCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QcixId0luZm8sMHhGNywweDAwKTsKKwkgIGlmKCEoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByKSkpIHsKKwkgICAgIGlmKFNpU19DUlQySXNMQ0QoU2lTX1ByKSkgeworCQlTaVNfUGFuZWxEZWxheShTaVNfUHIsIDEpOworCQlTaVNfU2V0UmVnU1IxMUFORE9SKFNpU19QciwweEY3LDB4MDApOwogCSAgICAgfQogCSAgfQogICAgICAgIH0KQEAgLTQ3OTcsMjQzICs0ODk4LDIwNCBAQAogCiAvKiBTZXQgQ1JUMiBPRkZTRVQgLyBQSVRDSCAqLwogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQyT2Zmc2V0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLQkgICAgICAgICAgVVNIT1JUIFJSVEksIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0Q1JUMk9mZnNldChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUlJUSSkKIHsKLSAgVVNIT1JUIG9mZnNldDsKLSAgVUNIQVIgdGVtcDsKKyAgIHVuc2lnbmVkIHNob3J0IG9mZnNldDsKKyAgIHVuc2lnbmVkIGNoYXIgIHRlbXA7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHJldHVybjsKKyAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSByZXR1cm47CiAKLSAgb2Zmc2V0ID0gU2lTX0dldE9mZnNldChTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJSVEksSHdJbmZvKTsKKyAgIG9mZnNldCA9IFNpU19HZXRPZmZzZXQoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSUlRJKTsKIAotICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF82NDB4NDgwXzIpIHx8Ci0gICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMykpIHsKLSAgICAgb2Zmc2V0ID4+PSAxOwotICB9CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA3LChvZmZzZXQgJiAweEZGKSk7CisgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA5LChvZmZzZXQgPj4gOCkpOwogCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDcsKG9mZnNldCAmIDB4RkYpKTsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwOSwob2Zmc2V0ID4+IDgpKTsKLSAgdGVtcCA9IChVQ0hBUikoKChvZmZzZXQgPj4gMykgJiAweEZGKSArIDEpOwotICBpZihvZmZzZXQgJSA4KSB0ZW1wKys7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDMsdGVtcCk7CisgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpKCgob2Zmc2V0ID4+IDMpICYgMHhGRikgKyAxKTsKKyAgIGlmKG9mZnNldCAmIDB4MDcpIHRlbXArKzsKKyAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDMsdGVtcCk7CiB9CiAKIC8qIFNldCBDUlQyIHN5bmMgYW5kIFBhbmVsTGluayBtb2RlICovCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDJTeW5jKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQyU3luYyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wYWg9MCx0ZW1wYmwsaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYWg9MCwgdGVtcGJsLCBpbmZvZmxhZzsKIAotICB0ZW1wYmwgPSAweEMwOworICAgdGVtcGJsID0gMHhDMDsKIAotICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPkNJbmZvRmxhZzsKLSAgfSBlbHNlIHsKLSAgICAgaW5mb2ZsYWcgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZzsKLSAgfQorICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgICBpbmZvZmxhZyA9IFNpU19Qci0+Q0luZm9GbGFnOworICAgfSBlbHNlIHsKKyAgICAgIGluZm9mbGFnID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWc7CisgICB9CiAKLSAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewkJCQkJLyogTFZEUyAqLworICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewkJCQkJLyogTFZEUyAqLwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgIHRlbXBhaCA9IDA7Ci0gICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJiAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFN5bmMpKSB7Ci0gICAgICAgIHRlbXBhaCA9IFNpU19Qci0+U2lTX0xDREluZm87Ci0gICAgIH0gZWxzZSB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OwotICAgICB0ZW1wYWggJj0gMHhDMDsKLSAgICAgdGVtcGFoIHw9IDB4MjA7Ci0gICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGFoIHw9IDB4MTA7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotICAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAotICAgICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgewotCSAgIHRlbXBhaCB8PSAweGYwOwotICAgICAgICB9Ci0JaWYoIChTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgfHwKLSAgICAgICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfRFNUTikgfHwKLSAgICAgICAgICAgIChTaVNfUHItPlNpU19JRl9ERUZfVFJVTVBJT04pIHx8Ci0gICAgICAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpICkgewotICAgICAgICAgICB0ZW1wYWggfD0gMHgzMDsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgICAgICAgIHRlbXBhaCA+Pj0gMzsKLQkgICB0ZW1wYWggJj0gMHgxODsKLSAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4RTcsdGVtcGFoKTsKLQkgICAvKiBEb24ndCBjYXJlIGFib3V0IDEyLzE4LzI0IGJpdCBtb2RlIC0gVFYgaXMgdmlhIFZHQSwgbm90IFBMICovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLDB4ZTApOwotICAgICAgICB9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLHRlbXBhaCk7Ci0gICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJIHRlbXBhaCA9IDA7CisgICAgICB9IGVsc2UgaWYoKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgJiYgKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RTeW5jKSkgeworCSB0ZW1wYWggPSBTaVNfUHItPlNpU19MQ0RJbmZvOworICAgICAgfSBlbHNlIHRlbXBhaCA9IGluZm9mbGFnID4+IDg7CisgICAgICB0ZW1wYWggJj0gMHhDMDsKKyAgICAgIHRlbXBhaCB8PSAweDIwOworICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgeworCSBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAorCSAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgeworCSAgICB0ZW1wYWggfD0gMHhmMDsKKwkgfQorCSBpZiggKFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSB8fAorCSAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9EU1ROKSB8fAorCSAgICAgKFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTikgfHwKKwkgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgfHwKKwkgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgKSB7CisJICAgIHRlbXBhaCB8PSAweDMwOworCSB9CisJIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0ZTVE4pIHx8CisJICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX0RTVE4pICkgeworCSAgICB0ZW1wYWggJj0gfjB4YzA7CisJIH0KKyAgICAgIH0KKyAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKwkgICAgdGVtcGFoID4+PSAzOworCSAgICB0ZW1wYWggJj0gMHgxODsKKwkgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4RTcsdGVtcGFoKTsKKwkgICAgLyogRG9uJ3QgY2FyZSBhYm91dCAxMi8xOC8yNCBiaXQgbW9kZSAtIFRWIGlzIHZpYSBWR0EsIG5vdCBQTCAqLworCSB9IGVsc2UgeworCSAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRiwweGUwKTsKKwkgfQorICAgICAgfSBlbHNlIHsKKwkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKKyAgICAgIH0KIAotICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKKyAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAvKiAtLS0tIDMwMCBzZXJpZXMgLS0tICovCiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7CQkJLyogNjMwIC0gMzAxQigtREgpICovCisJIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgewkJCS8qIDYzMCAtIDMwMUIoLURIKSAqLwogCi0JICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKLQkgICB0ZW1wYmwgPSAwOwotICAgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKLQkgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEU3luYykgewotCSAgICAgICAgIHRlbXBhaCA9IFNpU19Qci0+U2lTX0xDREluZm87Ci0JCSB0ZW1wYmwgPSAodGVtcGFoID4+IDYpICYgMHgwMzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIHRlbXBhaCAmPSAweEMwOwotICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLSAgCSAgIHRlbXBhaCB8PSAweGMwOwotICAgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRix0ZW1wYWgpOwotCSAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICYmICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkpIHsKLQkgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWEsMHhmMCx0ZW1wYmwpOwotCSAgIH0KKwkgICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKKwkgICAgdGVtcGJsID0gMDsKKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RTeW5jKSB7CisJCSAgdGVtcGFoID0gU2lTX1ByLT5TaVNfTENESW5mbzsKKwkJICB0ZW1wYmwgPSAodGVtcGFoID4+IDYpICYgMHgwMzsKKwkgICAgICAgfQorCSAgICB9CisJICAgIHRlbXBhaCAmPSAweEMwOworCSAgICB0ZW1wYWggfD0gMHgyMDsKKwkgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKKwkgICAgdGVtcGFoIHw9IDB4YzA7CisJICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLHRlbXBhaCk7CisJICAgIGlmKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpICYmICghKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSkpIHsKKwkgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFhLDB4ZjAsdGVtcGJsKTsKKwkgICAgfQogCi0gICAgICAgIH0gZWxzZSB7CQkJCQkJCS8qIDYzMCAtIDMwMSAqLworCSB9IGVsc2UgewkJCQkJCQkvKiA2MzAgLSAzMDEgKi8KIAotICAgICAgICAgICB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OwotICAgICAgICAgICB0ZW1wYWggJj0gMHhDMDsKLSAgICAgICAgICAgdGVtcGFoIHw9IDB4MjA7Ci0JICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLSAgICAgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKKwkgICAgdGVtcGFoID0gKChpbmZvZmxhZyA+PiA4KSAmIDB4YzApIHwgMHgyMDsKKwkgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKKwkgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKIAotICAgICAgICB9CisJIH0KIAogI2VuZGlmIC8qIFNJUzMwMCAqLwogCi0gICAgIH0gZWxzZSB7CisgICAgICB9IGVsc2UgewogCiAjaWZkZWYgU0lTMzE1SCAgLyogLS0tLS0tLSAzMTUgc2VyaWVzIC0tLS0tLSAqLwogCi0gICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsJICAJCS8qIDMxNSAtIExWRFMgKi8KKwkgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewkgIAkJLyogMzE1IC0gTFZEUyAqLwogCi0JICAgdGVtcGJsID0gMDsKLQkgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ09NUEFRMTI4MCkgJiYKLQkgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpKSB7Ci0JICAgICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKLQkgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEU3luYykgewotCSAgICAgICAgdGVtcGJsID0gKChTaVNfUHItPlNpU19MQ0RJbmZvICYgMHhjMCkgPj4gNik7Ci0JICAgICAgfQotCSAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xNDAwKSAgJiYKLQkgICAgICAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSkgewotICAgICAgIAkgICAgICB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OwotCSAgICAgIHRlbXBibCA9IDB4MDM7Ci0JICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzcpOwotCSAgICAgIHRlbXBibCA9ICh0ZW1wYWggPj4gNikgJiAweDAzOwotCSAgICAgIHRlbXBibCB8PSAweDA4OwotCSAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGJsIHw9IDB4MDQ7Ci0JICAgfQotCSAgIHRlbXBhaCAmPSAweEMwOwotICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLQkgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSAgIHRlbXBhaCB8PSAweGMwOwotICAgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRix0ZW1wYWgpOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgxYSwweGYwLHRlbXBibCk7Ci0JICAgICAgfQotCSAgIH0KKwkgICAgdGVtcGJsID0gMDsKKwkgICAgaWYoKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0NPTVBBUTEyODApICYmCisJICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkpIHsKKwkgICAgICAgdGVtcGFoID0gaW5mb2ZsYWcgPj4gODsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFN5bmMpIHsKKwkJIHRlbXBibCA9ICgoU2lTX1ByLT5TaVNfTENESW5mbyAmIDB4YzApID4+IDYpOworCSAgICAgICB9CisJICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQ0xFVk8xNDAwKSAgJiYKKwkJICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSkgeworCSAgICAgICB0ZW1wYWggPSBpbmZvZmxhZyA+PiA4OworCSAgICAgICB0ZW1wYmwgPSAweDAzOworCSAgICB9IGVsc2UgeworCSAgICAgICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNyk7CisJICAgICAgIHRlbXBibCA9ICh0ZW1wYWggPj4gNikgJiAweDAzOworCSAgICAgICB0ZW1wYmwgfD0gMHgwODsKKwkgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYmwgfD0gMHgwNDsKKwkgICAgfQorCSAgICB0ZW1wYWggJj0gMHhDMDsKKwkgICAgdGVtcGFoIHw9IDB4MjA7CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGFoIHw9IDB4MTA7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpICAgdGVtcGFoIHw9IDB4YzA7CisJICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxOSwweDBGLHRlbXBhaCk7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgeworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKKwkJICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWEsMHhmMCx0ZW1wYmwpOworCSAgICAgICB9CisJICAgIH0KIAotICAgICAgICB9IGVsc2UgewkJCQkJCQkvKiAzMTUgLSBUTURTICovCisJIH0gZWxzZSB7CQkJCQkJCS8qIDMxNSAtIFRNRFMgKi8KIAotICAgICAgICAgICB0ZW1wYWggPSB0ZW1wYmwgPSBpbmZvZmxhZyA+PiA4OwotCSAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLQkgICAgICB0ZW1wYmwgPSAwOwotCSAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFDKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgewotCSAgICAgICAgIGlmKE1vZGVObyA8PSAweDEzKSB7Ci0JICAgICAgICAgICAgdGVtcGFoID0gU2lTX0dldFJlZ0J5dGUoKFNpU19Qci0+U2lTX1AzY2ErMHgwMikpOwotICAJICAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKLQkgICAgICAgICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7Ci0JICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFN5bmMpIHsKLQkgICAgICAgICAgICAgICB0ZW1wYWggPSBTaVNfUHItPlNpU19MQ0RJbmZvOworCSAgICB0ZW1wYWggPSB0ZW1wYmwgPSBpbmZvZmxhZyA+PiA4OworCSAgICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJICAgICAgIHRlbXBibCA9IDA7CisJICAgICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvUkFNREFDKSkgeworCQkgIGlmKE1vZGVObyA8PSAweDEzKSB7CisJCSAgICAgdGVtcGFoID0gU2lTX0dldFJlZ0J5dGUoKFNpU19Qci0+U2lTX1AzY2ErMHgwMikpOworCQkgIH0KKwkgICAgICAgfQorCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKKwkJICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CisJCSAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEU3luYykgeworCQkgICAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfTENESW5mbzsKIAkJICAgICAgIHRlbXBibCA9ICh0ZW1wYWggPj4gNikgJiAweDAzOwogCQkgICAgfQotCSAgICAgICAgIH0KLQkgICAgICB9Ci0JICAgfQotCSAgIHRlbXBhaCAmPSAweEMwOwotICAgICAgICAgICB0ZW1wYWggfD0gMHgyMDsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpKSB0ZW1wYWggfD0gMHgxMDsKLQkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9Ob0xDRCkgewotCSAgICAgIC8qIEltaXRhdGUgQklPUyBidWcgKi8KLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgIHRlbXBhaCB8PSAweGMwOwotCSAgIH0KLQkgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQykgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKLQkgICAgICB0ZW1wYWggPj49IDM7Ci0JICAgICAgdGVtcGFoICY9IDB4MTg7Ci0JICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4ZTcsdGVtcGFoKTsKLQkgICB9IGVsc2UgewotICAgICAgICAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTksMHgwRix0ZW1wYWgpOwotCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgewotCSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgxYSwweGYwLHRlbXBibCk7Ci0JCSB9Ci0JICAgICAgfQotCSAgIH0KKwkJICB9CisJICAgICAgIH0KKwkgICAgfQorCSAgICB0ZW1wYWggJj0gMHhDMDsKKwkgICAgdGVtcGFoIHw9IDB4MjA7CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFJHQjE4Qml0KSkgdGVtcGFoIHw9IDB4MTA7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSB7CisJICAgICAgIC8qIEltaXRhdGUgQklPUyBidWcgKi8KKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpICB0ZW1wYWggfD0gMHhjMDsKKwkgICAgfQorCSAgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QykgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykpIHsKKwkgICAgICAgdGVtcGFoID4+PSAzOworCSAgICAgICB0ZW1wYWggJj0gMHgxODsKKwkgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEzLDB4ZTcsdGVtcGFoKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4MEYsdGVtcGFoKTsKKwkgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CisJCSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CisJCSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFhLDB4ZjAsdGVtcGJsKTsKKwkJICB9CisJICAgICAgIH0KKwkgICAgfQogCi0gICAgICAgIH0KKyAgICAgICAgIH0KICNlbmRpZiAgLyogU0lTMzE1SCAqLwogICAgICAgfQogICAgfQogfQogCi0vKiBTZXQgQ1JUMiBGSUZPIG9uIDMwMC82MzAvNzMwICovCisvKiBTZXQgQ1JUMiBGSUZPIG9uIDMwMC81NDAvNjMwLzczMCAqLwogI2lmZGVmIFNJUzMwMAogc3RhdGljIHZvaWQKLVNpU19TZXRDUlQyRklGT18zMDAoU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLAotICAgICAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDJGSUZPXzMwMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcix1bnNpZ25lZCBzaG9ydCBNb2RlTm8pCiB7Ci0gIFVDSEFSICAqUk9NQWRkciAgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCB0ZW1wLGluZGV4OwotICBVU0hPUlQgbW9kZWlkaW5kZXgscmVmcmVzaHJhdGV0YWJsZWluZGV4OwotICBVU0hPUlQgVkNMSz0wLE1DTEssY29sb3J0aD0wLGRhdGEyPTA7Ci0gIFVTSE9SVCB0ZW1wYWwsIHRlbXBhaCwgdGVtcGJ4LCB0ZW1wY2wsIHRlbXBheDsKLSAgVVNIT1JUIENSVDFNb2RlTm8sQ1JUMk1vZGVObzsKLSAgVVNIT1JUIFNlbGVjdFJhdGVfYmFja3VwOwotICBVTE9ORyAgZGF0YSxlYXg7Ci0gIGNvbnN0IFVDSEFSICBMYXRlbmN5RmFjdG9yW10gPSB7Ci0gIAk5NywgODgsIDg2LCA3OSwgNzcsIDAwLCAgICAgICAvKjsgNjQgIGJpdCAgICBCUT0yICAgKi8KLSAgICAgICAgMDAsIDg3LCA4NSwgNzgsIDc2LCA1NCwgICAgICAgLyo7IDY0ICBiaXQgICAgQlE9MSAgICovCi0gICAgICAgIDk3LCA4OCwgODYsIDc5LCA3NywgMDAsICAgICAgIC8qOyAxMjggYml0ICAgIEJRPTIgICAqLwotICAgICAgICAwMCwgNzksIDc3LCA3MCwgNjgsIDQ4LCAgICAgICAvKjsgMTI4IGJpdCAgICBCUT0xICAgKi8KLSAgICAgICAgODAsIDcyLCA2OSwgNjMsIDYxLCAwMCwgICAgICAgLyo7IDY0ICBiaXQgICAgQlE9MiAgICovCi0gICAgICAgIDAwLCA3MCwgNjgsIDYxLCA1OSwgMzcsICAgICAgIC8qOyA2NCAgYml0ICAgIEJRPTEgICAqLwotICAgICAgICA4NiwgNzcsIDc1LCA2OCwgNjYsIDAwLCAgICAgICAvKjsgMTI4IGJpdCAgICBCUT0yICAgKi8KLSAgICAgICAgMDAsIDY4LCA2NiwgNTksIDU3LCAzNyAgICAgICAgLyo7IDEyOCBiaXQgICAgQlE9MSAgICovCi0gIH07Ci0gIGNvbnN0IFVDSEFSICBMYXRlbmN5RmFjdG9yNzMwW10gPSB7Ci0gICAgICAgICA2OSwgNjMsIDYxLAotCSA4NiwgNzksIDc3LAotCTEwMywgOTYsIDk0LAotCTEyMCwxMTMsMTExLAotCTEzNywxMzAsMTI4LCAgICAvKiA8LS0gbGFzdCBlbnRyeSwgZGF0YSBiZWxvdyAqLwotCTEzNywxMzAsMTI4LAkvKiB0byBhdm9pZCB1c2luZyBpbGxlZ2FsIHZhbHVlcyAqLwotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotCTEzNywxMzAsMTI4LAotICB9OwotICBjb25zdCBVQ0hBUiBUaExvd0JbXSAgID0gewotICAJODEsIDQsIDcyLCA2LCA4OCwgOCwxMjAsMTIsCi0gICAgICAgIDU1LCA0LCA1NCwgNiwgNjYsIDgsIDkwLDEyLAotICAgICAgICA0MiwgNCwgNDUsIDYsIDU1LCA4LCA3NSwxMgotICB9OwotICBjb25zdCBVQ0hBUiBUaFRpbWluZ1tdID0gewotICAJMSwgMiwgMiwgMywgMCwgMSwgMSwgMgorICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciAgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpbmRleCwgbW9kZWlkaW5kZXgsIHJlZnJlc2hyYXRldGFibGVpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgVkNMSyA9IDAsIE1DTEssIGNvbG9ydGggPSAwLCBkYXRhMiA9IDA7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBieCwgdGVtcGNsLCBDUlQxTW9kZU5vLCBDUlQyTW9kZU5vLCBTZWxlY3RSYXRlX2JhY2t1cDsKKyAgdW5zaWduZWQgaW50ICAgZGF0YSwgcGNpNTAsIHBjaUEwOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjb2xvcnRoYXJyYXlbXSA9IHsKKyAgCTEsIDEsIDIsIDIsIDMsIDQKICAgfTsKIAogICBTZWxlY3RSYXRlX2JhY2t1cCA9IFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlOwpAQCAtNTA0NCwyMzIgKzUxMDYsMTU5IEBACiAgICAgIFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByLCAmQ1JUMU1vZGVObywgJm1vZGVpZGluZGV4KTsKICAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyAmPSAoflByb2dyYW1taW5nQ1JUMik7CiAgICAgIFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlID0gMDsKLSAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQxTW9kZU5vLCBtb2RlaWRpbmRleCwgSHdJbmZvKTsKKyAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQxTW9kZU5vLCBtb2RlaWRpbmRleCk7CiAKICAgICAgaWYoQ1JUMU1vZGVObyA+PSAweDEzKSB7Ci0gICAgICAgIGluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbcmVmcmVzaHJhdGV0YWJsZWluZGV4XS5FeHRfQ1JUVkNMSzsKLSAgICAgICAgaW5kZXggJj0gMHgzRjsKLSAgICAgICAgVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5DTE9DSzsJCQkvKiBHZXQgVkNMSyAqLworICAgICAgICAvKiBHZXQgVkNMSyAqLworCWluZGV4ID0gU2lTX0dldFJlZkNSVFZDTEsoU2lTX1ByLCByZWZyZXNocmF0ZXRhYmxlaW5kZXgsIFNpU19Qci0+U2lTX1VzZVdpZGUpOworCVZDTEsgPSBTaVNfUHItPlNpU19WQ0xLRGF0YVtpbmRleF0uQ0xPQ0s7CiAKLQljb2xvcnRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLENSVDFNb2RlTm8sbW9kZWlkaW5kZXgpOyAJLyogR2V0IGNvbG9yZGVwdGggKi8KLSAgICAgICAgY29sb3J0aCA+Pj0gMTsKLSAgICAgICAgaWYoIWNvbG9ydGgpIGNvbG9ydGgrKzsKKwkvKiBHZXQgY29sb3JkZXB0aCAqLworCWNvbG9ydGggPSBTaVNfR2V0Q29sb3JEZXB0aChTaVNfUHIsQ1JUMU1vZGVObyxtb2RlaWRpbmRleCkgPj4gMTsKKwlpZighY29sb3J0aCkgY29sb3J0aCsrOwogICAgICB9CiAKICAgfSBlbHNlIHsKIAogICAgICBDUlQxTW9kZU5vID0gMHhmZTsKLSAgICAgVkNMSyA9IFNpU19Qci0+Q1NSQ2xvY2tfQ1JUMTsJCQkJCS8qIEdldCBWQ0xLICovCi0gICAgIGRhdGEyID0gKFNpU19Qci0+Q01vZGVGbGFnX0NSVDEgJiBNb2RlVHlwZU1hc2spIC0gMjsKLSAgICAgc3dpdGNoKGRhdGEyKSB7CQkJCQkJCS8qIEdldCBjb2xvciBkZXB0aCAqLwotICAgICAgICBjYXNlIDAgOiBjb2xvcnRoID0gMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMSA6IGNvbG9ydGggPSAxOyBicmVhazsKLSAgICAgICAgY2FzZSAyIDogY29sb3J0aCA9IDI7IGJyZWFrOwotICAgICAgICBjYXNlIDMgOiBjb2xvcnRoID0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNCA6IGNvbG9ydGggPSAzOyBicmVhazsKLSAgICAgICAgY2FzZSA1IDogY29sb3J0aCA9IDQ7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiBjb2xvcnRoID0gMjsKLSAgICAgfQorCisgICAgIC8qIEdldCBWQ0xLICovCisgICAgIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrX0NSVDE7CisKKyAgICAgLyogR2V0IGNvbG9yIGRlcHRoICovCisgICAgIGNvbG9ydGggPSBjb2xvcnRoYXJyYXlbKChTaVNfUHItPkNNb2RlRmxhZ19DUlQxICYgTW9kZVR5cGVNYXNrKSAtIDIpXTsKIAogICB9CiAKICAgaWYoQ1JUMU1vZGVObyA+PSAweDEzKSB7Ci0gICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgewotICAgICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4M0EpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxQSk7Ci0gICAgfQotICAgIGluZGV4ICY9IDB4MDc7Ci0gICAgTUNMSyA9IFNpU19Qci0+U2lTX01DTEtEYXRhXzBbaW5kZXhdLkNMT0NLOwkJCQkvKiBHZXQgTUNMSyAqLworICAgICAvKiBHZXQgTUNMSyAqLworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU18zMDApIHsKKyAgICAgICAgaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgzQSk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MUEpOworICAgICB9CisgICAgIGluZGV4ICY9IDB4MDc7CisgICAgIE1DTEsgPSBTaVNfUHItPlNpU19NQ0xLRGF0YV8wW2luZGV4XS5DTE9DSzsKIAotICAgIGRhdGEyID0gKGNvbG9ydGggKiBWQ0xLKSAvIE1DTEs7CisgICAgIHRlbXAgPSAoKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KSA+PiA2KSAmIDB4MDMpIDw8IDE7CisgICAgIGlmKCF0ZW1wKSB0ZW1wKys7CisgICAgIHRlbXAgPDw9IDI7CiAKLSAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgIHRlbXAgPSAoKHRlbXAgJiAweDAwRkYpID4+IDYpIDw8IDE7Ci0gICAgaWYodGVtcCA9PSAwKSB0ZW1wID0gMTsKLSAgICB0ZW1wIDw8PSAyOwotICAgIHRlbXAgJj0gMHhmZjsKKyAgICAgZGF0YTIgPSB0ZW1wIC0gKChjb2xvcnRoICogVkNMSykgLyBNQ0xLKTsKIAotICAgIGRhdGEyID0gdGVtcCAtIGRhdGEyOworICAgICB0ZW1wID0gKDI4ICogMTYpICUgZGF0YTI7CisgICAgIGRhdGEyID0gKDI4ICogMTYpIC8gZGF0YTI7CisgICAgIGlmKHRlbXApIGRhdGEyKys7CiAKLSAgICBpZigoMjggKiAxNikgJSBkYXRhMikgewotICAgICAgCWRhdGEyID0gKDI4ICogMTYpIC8gZGF0YTI7Ci0gICAgICAJZGF0YTIrKzsKLSAgICB9IGVsc2UgewotICAgICAgCWRhdGEyID0gKDI4ICogMTYpIC8gZGF0YTI7Ci0gICAgfQorICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU18zMDApIHsKIAotICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKKwlTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKFNpU19QciwgJnRlbXBieCwgJnRlbXBjbCk7CisJZGF0YSA9IFNpU19HZXRGSUZPVGhyZXNob2xkQjMwMCh0ZW1wYngsIHRlbXBjbCk7CiAKLQl0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxOCk7Ci0JdGVtcGFoICY9IDB4NjI7Ci0JdGVtcGFoID4+PSAxOwotCXRlbXBhbCA9IHRlbXBhaDsKLQl0ZW1wYWggPj49IDM7Ci0JdGVtcGFsIHw9IHRlbXBhaDsKLQl0ZW1wYWwgJj0gMHgwNzsKLQl0ZW1wY2wgPSBUaFRpbWluZ1t0ZW1wYWxdOwotCXRlbXBieCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE2KTsKLQl0ZW1wYnggPj49IDY7Ci0JdGVtcGFoID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotCXRlbXBhaCA+Pj0gNDsKLQl0ZW1wYWggJj0gMHgwYzsKLQl0ZW1wYnggfD0gdGVtcGFoOwotCXRlbXBieCA8PD0gMTsKLQl0ZW1wYWwgPSBUaExvd0JbdGVtcGJ4ICsgMV07Ci0JdGVtcGFsICo9IHRlbXBjbDsKLQl0ZW1wYWwgKz0gVGhMb3dCW3RlbXBieF07Ci0JZGF0YSA9IHRlbXBhbDsKKyAgICAgfSBlbHNlIHsKIAotICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzMwKSB7Ci0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgICBTaVNfU2V0UmVnTG9uZygweGNmOCwweDgwMDAwMDUwKTsKLSAgICAgICBlYXggPSBTaVNfR2V0UmVnTG9uZygweGNmYyk7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorCXBjaTUwID0gc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4NTApOworCXBjaUEwID0gc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChTaVNfUHIsIDB4YTApOwogI2Vsc2UKLSAgICAgICBlYXggPSBwY2lSZWFkTG9uZygweDAwMDAwMDAwLCAweDUwKTsKKwlwY2k1MCA9IHBjaVJlYWRMb25nKDB4MDAwMDAwMDAsIDB4NTApOworCXBjaUEwID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7CiAjZW5kaWYKLSAgICAgICB0ZW1wYWwgPSAoVVNIT1JUKShlYXggPj4gOCk7Ci0gICAgICAgdGVtcGFsICY9IDB4MDY7Ci0gICAgICAgdGVtcGFsIDw8PSA1OwogCi0jaWZkZWYgTElOVVhfS0VSTkVMCi0gICAgICAgU2lTX1NldFJlZ0xvbmcoMHhjZjgsMHg4MDAwMDBBMCk7Ci0gICAgICAgZWF4ID0gU2lTX0dldFJlZ0xvbmcoMHhjZmMpOwotI2Vsc2UKLSAgICAgICBlYXggPSBwY2lSZWFkTG9uZygweDAwMDAwMDAwLCAweEEwKTsKLSNlbmRpZgotICAgICAgIHRlbXAgPSAoVVNIT1JUKShlYXggPj4gMjgpOwotICAgICAgIHRlbXAgJj0gMHgwRjsKLSAgICAgICB0ZW1wYWwgfD0gdGVtcDsKKyAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzMwKSB7CiAKLSAgICAgICB0ZW1wYnggPSB0ZW1wYWw7ICAgLyogQklPUyBCVUcgKDIuMDQuNWQsIDIuMDQuNmEgdXNlIGFoIGhlcmUsIHdoaWNoIGlzIHVuc2V0ISkgKi8KLSAgICAgICB0ZW1wYnggPSAwOyAgICAgICAgLyogLS0gZG8gaXQgbGlrZSB0aGUgQklPUyBhbnl3YXkuLi4gKi8KLSAgICAgICB0ZW1wYXggPSB0ZW1wYng7Ci0gICAgICAgdGVtcGJ4ICY9IDB4YzA7Ci0gICAgICAgdGVtcGJ4ID4+PSA2OwotICAgICAgIHRlbXBheCAmPSAweDBmOwotICAgICAgIHRlbXBheCAqPSAzOwotICAgICAgIHRlbXBieCArPSB0ZW1wYXg7CisJICAgaW5kZXggPSAodW5zaWduZWQgc2hvcnQpKCgocGNpQTAgPj4gMjgpICYgMHgwZikgKiAzKTsKKwkgICBpbmRleCArPSAodW5zaWduZWQgc2hvcnQpKCgocGNpNTAgPj4gOSkpICYgMHgwMyk7CiAKLSAgICAgICBkYXRhID0gTGF0ZW5jeUZhY3RvcjczMFt0ZW1wYnhdOwotICAgICAgIGRhdGEgKz0gMTU7Ci0gICAgICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KTsKLSAgICAgICBpZighKHRlbXAgJiAweDgwKSkgZGF0YSArPSA1OworCSAgIC8qIEJJT1MgQlVHICgyLjA0LjVkLCAyLjA0LjZhIHVzZSBhaCBoZXJlLCB3aGljaCBpcyB1bnNldCEpICovCisJICAgaW5kZXggPSAwOyAgLyogLS0gZG8gaXQgbGlrZSB0aGUgQklPUyBhbnl3YXkuLi4gKi8KIAotICAgIH0gZWxzZSB7CisJfSBlbHNlIHsKIAotICAgICAgIGluZGV4ID0gMDsKLSAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgICAgIGlmKHRlbXAgJiAweDAwODApIGluZGV4ICs9IDEyOworCSAgIHBjaTUwID4+PSAyNDsKKwkgICBwY2lBMCA+Pj0gMjQ7CiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSAgICAgICBTaVNfU2V0UmVnTG9uZygweGNmOCwweDgwMDAwMEEwKTsKLSAgICAgICBlYXggPSBTaVNfR2V0UmVnTG9uZygweGNmYyk7Ci0jZWxzZQotICAgICAgIC8qIFdlIHVzZSBwY2kgZnVuY3Rpb25zIFggb2ZmZXJzLiBXZSB1c2UgdGFnIDAsIGJlY2F1c2UKLSAgICAgICAgKiB3ZSB3YW50IHRvIHJlYWQvd3JpdGUgdG8gdGhlIGhvc3QgYnJpZGdlICh3aGljaCBpcyBhbHdheXMKLSAgICAgICAgKiAwMDowMC4wIG9uIDYzMCwgNzMwIGFuZCA1NDApLCBub3QgdGhlIFZHQSBkZXZpY2UuCi0gICAgICAgICovCi0gICAgICAgZWF4ID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHhBMCk7Ci0jZW5kaWYKLSAgICAgICB0ZW1wID0gKFVTSE9SVCkoZWF4ID4+IDI0KTsKLSAgICAgICBpZighKHRlbXAmMHgwMSkpIGluZGV4ICs9IDI0OworCSAgIGluZGV4ID0gKHBjaTUwID4+IDEpICYgMHgwNzsKIAotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgICAgIFNpU19TZXRSZWdMb25nKDB4Y2Y4LDB4ODAwMDAwNTApOwotICAgICAgIGVheCA9IFNpU19HZXRSZWdMb25nKDB4Y2ZjKTsKLSNlbHNlCi0gICAgICAgZWF4ID0gcGNpUmVhZExvbmcoMHgwMDAwMDAwMCwgMHg1MCk7Ci0jZW5kaWYKLSAgICAgICB0ZW1wPShVU0hPUlQpKGVheCA+PiAyNCk7Ci0gICAgICAgaWYodGVtcCAmIDB4MDEpIGluZGV4ICs9IDY7CisJICAgaWYocGNpNTAgJiAweDAxKSAgICBpbmRleCArPSA2OworCSAgIGlmKCEocGNpQTAgJiAweDAxKSkgaW5kZXggKz0gMjQ7CiAKLSAgICAgICB0ZW1wID0gKHRlbXAgJiAweDBGKSA+PiAxOwotICAgICAgIGluZGV4ICs9IHRlbXA7CisJICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpICYgMHg4MCkgaW5kZXggKz0gMTI7CiAKLSAgICAgICBkYXRhID0gTGF0ZW5jeUZhY3RvcltpbmRleF07Ci0gICAgICAgZGF0YSArPSAxNTsKLSAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTQpOwotICAgICAgIGlmKCEodGVtcCAmIDB4ODApKSBkYXRhICs9IDU7Ci0gICAgfQorCX0KIAotICAgIGRhdGEgKz0gZGF0YTI7CQkJCS8qIENSVDEgUmVxdWVzdCBQZXJpb2QgKi8KKwlkYXRhID0gU2lTX0dldExhdGVuY3lGYWN0b3I2MzAoU2lTX1ByLCBpbmRleCkgKyAxNTsKKwlpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDE0KSAmIDB4ODApKSBkYXRhICs9IDU7CiAKLSAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKLSAgICBTaVNfUHItPlNpU19TZWxlY3RDUlQyUmF0ZSA9IFNlbGVjdFJhdGVfYmFja3VwOworICAgICB9CiAKLSAgICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisgICAgIGRhdGEgKz0gZGF0YTI7CQkJCQkJLyogQ1JUMSBSZXF1ZXN0IFBlcmlvZCAqLwogCi0gICAgICAgQ1JUMk1vZGVObyA9IE1vZGVObzsKLSAgICAgICBTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJkNSVDJNb2RlTm8sICZtb2RlaWRpbmRleCk7CisgICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOworICAgICBTaVNfUHItPlNpU19TZWxlY3RDUlQyUmF0ZSA9IFNlbGVjdFJhdGVfYmFja3VwOwogCi0gICAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQyTW9kZU5vLCBtb2RlaWRpbmRleCwgSHdJbmZvKTsKKyAgICAgaWYoIVNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCi0gICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLENSVDJNb2RlTm8sbW9kZWlkaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaHJhdGV0YWJsZWluZGV4LEh3SW5mbyk7Ci0gICAgICAgVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5DTE9DSzsgICAgICAgICAgICAgICAgLyogR2V0IFZDTEsgICovCisJQ1JUMk1vZGVObyA9IE1vZGVObzsKKwlTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJkNSVDJNb2RlTm8sICZtb2RlaWRpbmRleCk7CiAKLSAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgewotICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewotCSAgICAgaWYoUk9NQWRkclsweDIyMF0gJiAweDAxKSB7Ci0gICAgICAgICAgICAgICAgVkNMSyA9IFJPTUFkZHJbMHgyMjldIHwgKFJPTUFkZHJbMHgyMmFdIDw8IDgpOwotCSAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9CisJcmVmcmVzaHJhdGV0YWJsZWluZGV4ID0gU2lTX0dldFJhdGVQdHIoU2lTX1ByLCBDUlQyTW9kZU5vLCBtb2RlaWRpbmRleCk7CiAKLSAgICB9IGVsc2UgeworCS8qIEdldCBWQ0xLICAqLworCWluZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgQ1JUMk1vZGVObywgbW9kZWlkaW5kZXgsIHJlZnJlc2hyYXRldGFibGVpbmRleCk7CisJVkNMSyA9IFNpU19Qci0+U2lTX1ZDTEtEYXRhW2luZGV4XS5DTE9DSzsKIAotICAgICAgIENSVDJNb2RlTm8gPSAweGZlOwotICAgICAgIFZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOwkJCQkJLyogR2V0IFZDTEsgKi8KKwlpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fCAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgeworCSAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgeworCSAgICAgIGlmKFJPTUFkZHJbMHgyMjBdICYgMHgwMSkgeworCQkgVkNMSyA9IFJPTUFkZHJbMHgyMjldIHwgKFJPTUFkZHJbMHgyMmFdIDw8IDgpOworCSAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICB9CisgICAgIH0gZWxzZSB7CiAKLSAgICBjb2xvcnRoID0gU2lTX0dldENvbG9yRGVwdGgoU2lTX1ByLENSVDJNb2RlTm8sbW9kZWlkaW5kZXgpOyAvKiBHZXQgY29sb3JkZXB0aCAqLwotICAgIGNvbG9ydGggPj49IDE7Ci0gICAgaWYoIWNvbG9ydGgpIGNvbG9ydGgrKzsKKwkvKiBHZXQgVkNMSyAqLworCUNSVDJNb2RlTm8gPSAweGZlOworCVZDTEsgPSBTaVNfUHItPkNTUkNsb2NrOwogCi0gICAgZGF0YSA9IGRhdGEgKiBWQ0xLICogY29sb3J0aDsKLSAgICBpZihkYXRhICUgKE1DTEsgPDwgNCkpIHsKLSAgICAgIAlkYXRhID0gZGF0YSAvIChNQ0xLIDw8IDQpOwotICAgICAgCWRhdGErKzsKLSAgICB9IGVsc2UgewotICAgICAgCWRhdGEgPSBkYXRhIC8gKE1DTEsgPDwgNCk7Ci0gICAgfQorICAgICB9CiAKLSAgICBpZihkYXRhIDw9IDYpIGRhdGEgPSA2OwotICAgIGlmKGRhdGEgPiAweDE0KSBkYXRhID0gMHgxNDsKKyAgICAgLyogR2V0IGNvbG9yZGVwdGggKi8KKyAgICAgY29sb3J0aCA9IFNpU19HZXRDb2xvckRlcHRoKFNpU19QcixDUlQyTW9kZU5vLG1vZGVpZGluZGV4KSA+PiAxOworICAgICBpZighY29sb3J0aCkgY29sb3J0aCsrOwogCi0gICAgdGVtcCA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDEpOwotICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKLSAgICAgICBpZihkYXRhIDw9IDB4MGYpIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxMzsKLSAgICAgICBlbHNlICAgICAgICAgICAgIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxNjsKLSAgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgewotICAgICAgIAkgIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxMzsKLSAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZiggKCAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzYzMCkgfHwKLSAgICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkgKSAgJiYKLSAgICAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIC8qIDYzMHMgb3IgNzMwKHM/KSAqLwotICAgICAgewotCSAgdGVtcCA9ICh0ZW1wICYgKH4weDFGKSkgfCAweDFiOwotICAgICAgfSBlbHNlIHsKLQkgIHRlbXAgPSAodGVtcCAmICh+MHgxRikpIHwgMHgxNjsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ZTAsdGVtcCk7CisgICAgIGRhdGEgPSBkYXRhICogVkNMSyAqIGNvbG9ydGg7CisgICAgIHRlbXAgPSBkYXRhICUgKE1DTEsgPDwgNCk7CisgICAgIGRhdGEgPSBkYXRhIC8gKE1DTEsgPDwgNCk7CisgICAgIGlmKHRlbXApIGRhdGErKzsKIAotICAgIGlmKCAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzYzMCkgJiYKLSAgICAgICAgKEh3SW5mby0+akNoaXBSZXZpc2lvbiA+PSAweDMwKSApIC8qIDYzMHMsIE5PVCA3MzAgKi8KLSAgICB7Ci0gICAJaWYoZGF0YSA+IDB4MTMpIGRhdGEgPSAweDEzOwotICAgIH0KLSAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDIsMHhlMCxkYXRhKTsKKyAgICAgaWYoZGF0YSA8IDYpIGRhdGEgPSA2OworICAgICBlbHNlIGlmKGRhdGEgPiAweDE0KSBkYXRhID0gMHgxNDsKKworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU18zMDApIHsKKyAgICAgICAgdGVtcCA9IDB4MTY7CisJaWYoKGRhdGEgPD0gMHgwZikgfHwgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSkKKwkgICB0ZW1wID0gMHgxMzsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcCA9IDB4MTY7CisJaWYoKCAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAorCSAgICAgKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkgKSAgJiYKKwkgICAoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpCisJICAgdGVtcCA9IDB4MWI7CisgICAgIH0KKyAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4ZTAsdGVtcCk7CisKKyAgICAgaWYoKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzYzMCkgJiYKKwkoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpIHsKKwlpZihkYXRhID4gMHgxMykgZGF0YSA9IDB4MTM7CisgICAgIH0KKyAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLDB4ZTAsZGF0YSk7CiAKICAgfSBlbHNlIHsgIC8qIElmIG1vZGUgPD0gMHgxMywgd2UganVzdCByZXN0b3JlIGV2ZXJ5dGhpbmcgKi8KIAotICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOwotICAgIFNpU19Qci0+U2lTX1NlbGVjdENSVDJSYXRlID0gU2VsZWN0UmF0ZV9iYWNrdXA7CisgICAgIFNpU19Qci0+U2lTX1NldEZsYWcgfD0gUHJvZ3JhbW1pbmdDUlQyOworICAgICBTaVNfUHItPlNpU19TZWxlY3RDUlQyUmF0ZSA9IFNlbGVjdFJhdGVfYmFja3VwOwogCiAgIH0KIH0KQEAgLTUyNzgsMTAgKzUyNjcsMTAgQEAKIC8qIFNldCBDUlQyIEZJRk8gb24gMzE1LzMzMCBzZXJpZXMgKi8KICNpZmRlZiBTSVMzMTVICiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDJGSUZPXzMxMChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDJGSUZPXzMxMChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDNCKTsKLSAgaWYoIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzYwKSAgICAgICYmCisgIGlmKCAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzYwKSAgICAgICYmCiAgICAgICAoU2lTX1ByLT5TaVNfU3lzRmxhZ3MgJiBTRl83NjBMRkIpICAmJgogICAgICAgKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGUzMkJwcCkgJiYKICAgICAgIChTaVNfUHItPlNpU19WR0FIREUgPj0gMTI4MCkJICAmJgpAQCAtNTI5OSwzMzcgKzUyODgsMTYyIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIFVTSE9SVAotU2lTX0dldFZHQUhUMihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfR2V0VkdBSFQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVTE9ORyB0ZW1wYXgsdGVtcGJ4OworICB1bnNpZ25lZCBpbnQgdGVtcGF4LHRlbXBieDsKIAogICB0ZW1wYnggPSAoU2lTX1ByLT5TaVNfVkdBVlQgLSBTaVNfUHItPlNpU19WR0FWREUpICogU2lTX1ByLT5TaVNfUlZCSENNQVg7CiAgIHRlbXBheCA9IChTaVNfUHItPlNpU19WVCAtIFNpU19Qci0+U2lTX1ZERSkgKiBTaVNfUHItPlNpU19SVkJIQ0ZBQ1Q7CiAgIHRlbXBheCA9ICh0ZW1wYXggKiBTaVNfUHItPlNpU19IVCkgLyB0ZW1wYng7Ci0gIHJldHVybigoVVNIT1JUKXRlbXBheCk7CisgIHJldHVybiAodW5zaWduZWQgc2hvcnQpdGVtcGF4OwogfQogCiAvKiBTZXQgUGFydCAxIC8gU2lTIGJyaWRnZSBzbGF2ZSBtb2RlICovCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMV8zMDEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvLFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCitTaVNfU2V0R3JvdXAxXzMwMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgIHB1c2gxLHB1c2gyOwotICBVU0hPUlQgIHRlbXBheCx0ZW1wYngsdGVtcGN4LHRlbXA7Ci0gIFVTSE9SVCAgcmVzaW5mbyxtb2RlZmxhZyx4cmVzPTA7Ci0gIHVuc2lnbmVkIGNoYXIgcDFfNywgcDFfODsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcCwgbW9kZWZsYWcsIGksIGosIHhyZXM9MCwgVkdBVkRFOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgQ1JUcmFuc2xhdGlvbltdID0geworICAgICAgIC8qIENSMCAgIENSMSAgIENSMiAgIENSMyAgIENSNCAgIENSNSAgIENSNiAgIENSNyAgICovCisJICAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLAorICAgICAgIC8qIENSOCAgIENSOSAgIFNSMEEgIFNSMEIgIFNSMEMgIFNSMEQgIFNSMEUgIENSMEYgICovCisJICAweDAwLCAweDBiLCAweDE3LCAweDE4LCAweDE5LCAweDAwLCAweDFhLCAweDAwLAorICAgICAgIC8qIENSMTAgIENSMTEgIENSMTIgIENSMTMgIENSMTQgIENSMTUgIENSMTYgIENSMTcgICovCisJICAweDBjLCAweDBkLCAweDBlLCAweDAwLCAweDBmLCAweDEwLCAweDExLCAweDAwCisgIH07CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotICAgICByZXNpbmZvID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9SZXNJbmZvOwogICB9IGVsc2UgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5DTW9kZUZsYWc7Ci0gICAgIHJlc2luZm8gPSAwOwogICAgICB4cmVzID0gU2lTX1ByLT5DSERpc3BsYXk7CiAgIH0gZWxzZSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0gICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogICAgICB4cmVzID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5YUmVzOwogICB9CiAKICAgLyogVGhlIGZvbGxvd2luZyBpcyBvbmx5IGRvbmUgaWYgYnJpZGdlIGlzIGluIHNsYXZlIG1vZGU6ICovCiAKLSAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpICYmIChNb2RlTm8gPiAweDEzKSkgewotICAgICBpZih4cmVzID49IDE2MDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZih4cmVzID49IDE2MDApIHsgIC8qIEJJT1M6ID09IDE2MDAgKi8KICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgzMSwweDA0KTsKICAgICAgfQogICB9CiAKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMywweGZmKTsgICAgICAgICAgICAgICAgICAvKiBzZXQgTUFYIEhUICovCisgIFNpU19Qci0+Q0hUb3RhbCA9IDgyMjQ7ICAvKiBNYXggSFQsIDB4MjAyMCwgcmVzdWx0cyBpbiAweDNmZiBpbiByZWdpc3RlcnMgKi8KIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICBtb2RlZmxhZyB8PSBDaGFyeDhEb3Q7CisgIFNpU19Qci0+Q0hEaXNwbGF5ID0gU2lTX1ByLT5TaVNfVkdBSERFOworICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSBTaVNfUHItPkNIRGlzcGxheSA+Pj0gMTsKIAotICBpZihtb2RlZmxhZyAmIENoYXJ4OERvdCkgdGVtcGN4ID0gMHgwODsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgIHRlbXBjeCA9IDB4MDk7Ci0KLSAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiAweDA0IEhvcml6b250YWwgRGlzcGxheSBFbmQgKi8KLSAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGF4ID4+PSAxOwotICB0ZW1wYXggPSAoKHRlbXBheCAvIHRlbXBjeCkgLSAxKSAmIDB4ZmY7Ci0gIHRlbXBieCA9IHRlbXBheDsKLQotICB0ZW1wID0gdGVtcGF4OwotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA0LHRlbXApOwotCisgIFNpU19Qci0+Q0hCbGFua1N0YXJ0ID0gU2lTX1ByLT5DSERpc3BsYXk7CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgewotICAgICAgICB0ZW1wICs9IDI7Ci0gICAgIH0KLSAgfQotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgewotICAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NjAwKSB0ZW1wIC09IDI7Ci0gIH0KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwNSx0ZW1wKTsgICAgICAgICAgICAgICAgIC8qIDB4MDUgSG9yaXpvbnRhbCBEaXNwbGF5IFN0YXJ0ICovCi0KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwNiwweDAzKTsgICAgICAgICAgICAgICAgIC8qIDB4MDYgSG9yaXpvbnRhbCBCbGFuayBlbmQgICAgICovCi0KLSAgdGVtcGF4ID0gMHhGRkZGOwotICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgdGVtcGF4ID0gU2lTX0dldFZHQUhUMihTaVNfUHIpOwotICBpZih0ZW1wYXggPj0gU2lTX1ByLT5TaVNfVkdBSFQpIHRlbXBheCA9IFNpU19Qci0+U2lTX1ZHQUhUOwotICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICAgIHRlbXBheCA+Pj0gMTsKLSAgdGVtcGF4ID0gKHRlbXBheCAvIHRlbXBjeCkgLSA1OwotICB0ZW1wY3ggPSB0ZW1wYXg7Ci0KLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLSAgICAgdGVtcCA9IHRlbXBjeCAtIDE7Ci0gICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKLSAgICAgICAgdGVtcCAtPSA2OwotICAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpIHsKLSAgICAgICAgICAgdGVtcCAtPSAyOwotICAgICAgICAgICBpZihNb2RlTm8gPiAweDEzKSB0ZW1wIC09IDEwOwotICAgICAgICB9Ci0gICAgIH0KLSAgfSBlbHNlIHsKLSAgICAgdGVtcGN4ID0gKHRlbXBjeCArIHRlbXBieCkgPj4gMTsKLSAgICAgdGVtcCA9ICh0ZW1wY3ggJiAweDAwRkYpICsgMjsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgICAgdGVtcC0tOwotICAgICAgICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB7Ci0gICAgICAgICAgIGlmKChtb2RlZmxhZyAmIENoYXJ4OERvdCkpIHsKLSAgICAgICAgICAgICAgdGVtcCArPSA0OwotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gODAwKSB0ZW1wIC09IDY7Ci0gICAgICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBSERFID09IDgwMCkgdGVtcCArPSAyOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9IGVsc2UgewotICAgICAgICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB7Ci0gICAgICAgICAgIHRlbXAgLT0gNDsKLSAgICAgICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHg5NjApICYmCi0JICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTYwMHgxMjAwKSkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gODAwKSB7Ci0gICAgICAgICAgICAgICAgIHRlbXAgLT0gNzsKLQkgICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX01vZGVUeXBlID09IE1vZGVFR0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDEwMjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xMjgweDEwMjQpCi0JCSAgCSAgICAgdGVtcCArPSA3OwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICB9Ci0JCSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvICE9IFBhbmVsXzE0MDB4MTA1MCkgewotICAgICAgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gMTI4MCkgewotICAgICAgICAgICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgdGVtcCArPSAyODsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9CisgICAgIFNpU19Qci0+Q0hCbGFua1N0YXJ0ICs9IDE2OwogICB9CiAKLSAgcDFfNyA9IHRlbXA7Ci0gIHAxXzggPSAweDAwOwotCi0gIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgewotICAgICAgICBpZihNb2RlTm8gPD0gMHgwMSkgewotCSAgIHAxXzcgPSAweDJhOwotCSAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpKSBwMV84ID0gMHg2MTsKLQkgICBlbHNlIAkgICAgICAJCQlwMV84ID0gMHg0MTsKLQl9IGVsc2UgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZVRleHQpIHsKLQkgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgcDFfNyA9IDB4NTQ7Ci0JICAgZWxzZSAJICAgIAkJCXAxXzcgPSAweDU1OwotCSAgIHAxXzggPSAweDAwOwotCX0gZWxzZSBpZihNb2RlTm8gPD0gMHgxMykgewotCSAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLQkgICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgewotCQkgcDFfNyA9IDB4MzA7Ci0JCSBwMV84ID0gMHgwMzsKLQkgICAgICB9IGVsc2UgewotCSAJIHAxXzcgPSAweDJmOwotCQkgcDFfOCA9IDB4MDI7Ci0JICAgICAgfQotCSAgIH0gZWxzZSB7Ci0JICAgICAgcDFfNyA9IDB4NWI7Ci0JICAgICAgcDFfOCA9IDB4MDM7Ci0JICAgfQotCX0gZWxzZSBpZiggKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYKLQkgICAgICAgICAgICAoKE1vZGVObyA9PSAweDUwKSB8fCAoTW9kZU5vID09IDB4NTYpIHx8IChNb2RlTm8gPT0gMHg1MykpKSB8fAotCSAgICAgICAgICAgKChId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSAmJgotCQkgICAgKHJlc2luZm8gPT0gU0lTX1JJXzMyMHgyMDAgfHwgcmVzaW5mbyA9PSBTSVNfUklfMzIweDI0MCkpICkgewotCSAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpKSB7Ci0JICAgICAgcDFfNyA9IDB4MzAsCi0JICAgICAgcDFfOCA9IDB4MDM7Ci0JICAgfSBlbHNlIHsKLQkgICAgICBwMV83ID0gMHgyZjsKLQkgICAgICBwMV84ID0gMHgwMzsKLQkgICB9Ci0gICAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwfFRWU2V0WVBiUHI3NTBwKSkgewotICAgICAgICBwMV83ID0gMHg2MzsKLQlpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgcDFfNyA9IDB4NTU7Ci0gICAgIH0KLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSB7Ci0gICAgICAgIGlmKCEobW9kZWZsYWcgJiBIYWxmRENMSykpIHsKLQkgICBwMV83ID0gMHhiMjsKLQkgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgewotCSAgICAgIHAxXzcgPSAweGFiOwotCSAgIH0KLQl9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVwKSB7Ci0JICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgcDFfNyA9IDB4MzA7Ci0JfQotICAgICB9Ci0gIH0KLQotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA3LHAxXzcpOwkJCS8qIDB4MDcgSG9yaXpvbnRhbCBSZXRyYWNlIFN0YXJ0ICovCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDgscDFfOCk7CQkJLyogMHgwOCBIb3Jpem9udGFsIFJldHJhY2UgRW5kICAgKi8KLQotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE4LDB4MDMpOyAgICAgICAgICAgICAgICAJLyogMHgxOCBTUjA4IChGSUZPIFRocmVzaG9sZD8pICAgKi8KLQotICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDE5LDB4RjApOwotCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDksMHhGRik7ICAgICAgICAgICAgICAgIAkvKiAweDA5IFNldCBNYXggVlQgICAgKi8KLQotICB0ZW1wY3ggPSAweDEyMTsKLSAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBVkRFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogMHgwRSBWZXJ0aWNhbCBEaXNwbGF5IEVuZCAqLwotICBpZiAgICAgKHRlbXBieCA9PSAzNTcpIHRlbXBieCA9IDM1MDsKLSAgZWxzZSBpZih0ZW1wYnggPT0gMzYwKSB0ZW1wYnggPSAzNTA7Ci0gIGVsc2UgaWYodGVtcGJ4ID09IDM3NSkgdGVtcGJ4ID0gMzUwOwotICBlbHNlIGlmKHRlbXBieCA9PSA0MDUpIHRlbXBieCA9IDQwMDsKLSAgZWxzZSBpZih0ZW1wYnggPT0gNDIwKSB0ZW1wYnggPSA0MDA7Ci0gIGVsc2UgaWYodGVtcGJ4ID09IDUyNSkgdGVtcGJ4ID0gNDgwOwotICBwdXNoMiA9IHRlbXBieDsKKyAgU2lTX1ByLT5DSEJsYW5rRW5kID0gMzI7CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSB7Ci0gICAgICAJaWYoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpIHsKLSAgICAgICAgICAgaWYgICAgICh0ZW1wYnggPT0gMzUwKSB0ZW1wYnggKz0gNTsKLSAgICAgICAgICAgZWxzZSBpZih0ZW1wYnggPT0gNDgwKSB0ZW1wYnggKz0gNTsKLSAgICAgIAl9Ci0gICAgIH0KKyAgICAgaWYoeHJlcyA9PSAxNjAwKSBTaVNfUHItPkNIQmxhbmtFbmQgKz0gODA7CiAgIH0KLSAgdGVtcGJ4IC09IDI7Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTAsdGVtcCk7ICAgICAgICAJCS8qIDB4MTAgdmVydGljYWwgQmxhbmsgU3RhcnQgKi8KIAotICB0ZW1wYnggPSBwdXNoMjsKLSAgdGVtcGJ4LS07Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0jaWYgMAotICAvKiBNaXNzaW5nIGNvZGUgZnJvbSA2MzAvMzAxQiAyLjA0LjVhIGFuZCA2NTAvMzAyTFYgMS4xMC42cyAoY2FsbGVzIGludCAyZikgKi8KLSAgaWYoeHh4KCkpIHsKLSAgICAgIGlmKHRlbXAgPT0gMHhkZikgdGVtcCA9IDB4ZGE7CisgIHRlbXAgPSBTaVNfUHItPlNpU19WR0FIVCAtIDk2OworICBpZighKG1vZGVmbGFnICYgSGFsZkRDTEspKSB0ZW1wIC09IDMyOworICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSB7CisgICAgIHRlbXAgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgwNCk7CisgICAgIHRlbXAgfD0gKChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwYikgJiAweGMwKSA8PCAyKTsKKyAgICAgdGVtcCAtPSAzOworICAgICB0ZW1wIDw8PSAzOworICB9IGVsc2UgeworICAgICBpZihTaVNfUHItPlNpU19SVkJIUlMyKSB0ZW1wID0gU2lTX1ByLT5TaVNfUlZCSFJTMjsKICAgfQotI2VuZGlmCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEUsdGVtcCk7CisgIFNpU19Qci0+Q0hTeW5jU3RhcnQgPSB0ZW1wOworCisgIFNpU19Qci0+Q0hTeW5jRW5kID0gMHhmZmU4OyAJLyogcmVzdWx0cyBpbiAweDIwMDAgaW4gcmVnaXN0ZXJzICovCisKKyAgU2lTX1ByLT5DVlRvdGFsID0gMjA0OTsgIAkvKiBNYXggVlQsIDB4MDgwMSwgcmVzdWx0cyBpbiAweDdmZiBpbiByZWdpc3RlcnMgKi8KKworICBWR0FWREUgPSBTaVNfUHItPlNpU19WR0FWREU7CisgIGlmICAgICAoVkdBVkRFID09ICAzNTcpIFZHQVZERSA9ICAzNTA7CisgIGVsc2UgaWYoVkdBVkRFID09ICAzNjApIFZHQVZERSA9ICAzNTA7CisgIGVsc2UgaWYoVkdBVkRFID09ICAzNzUpIFZHQVZERSA9ICAzNTA7CisgIGVsc2UgaWYoVkdBVkRFID09ICA0MDUpIFZHQVZERSA9ICA0MDA7CisgIGVsc2UgaWYoVkdBVkRFID09ICA0MjApIFZHQVZERSA9ICA0MDA7CisgIGVsc2UgaWYoVkdBVkRFID09ICA1MjUpIFZHQVZERSA9ICA0ODA7CisgIGVsc2UgaWYoVkdBVkRFID09IDEwNTYpIFZHQVZERSA9IDEwMjQ7CisgIFNpU19Qci0+Q1ZEaXNwbGF5ID0gVkdBVkRFOworCisgIFNpU19Qci0+Q1ZCbGFua1N0YXJ0ID0gU2lTX1ByLT5DVkRpc3BsYXk7CisKKyAgU2lTX1ByLT5DVkJsYW5rRW5kID0gMTsKKyAgaWYoTW9kZU5vID09IDB4M2MpIFNpU19Qci0+Q1ZCbGFua0VuZCA9IDIyNjsKKworICB0ZW1wID0gKFNpU19Qci0+U2lTX1ZHQVZUIC0gVkdBVkRFKSA+PiAxOworICBTaVNfUHItPkNWU3luY1N0YXJ0ID0gVkdBVkRFICsgdGVtcDsKKworICB0ZW1wID4+PSAzOworICBTaVNfUHItPkNWU3luY0VuZCA9IFNpU19Qci0+Q1ZTeW5jU3RhcnQgKyB0ZW1wOworCisgIFNpU19DYWxjQ1JSZWdpc3RlcnMoU2lTX1ByLCAwKTsKKyAgU2lTX1ByLT5DQ1JUMUNSVENbMTZdICY9IH4weEUwOworCisgIGZvcihpID0gMDsgaSA8PSA3OyBpKyspIHsKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsQ1JUcmFuc2xhdGlvbltpXSxTaVNfUHItPkNDUlQxQ1JUQ1tpXSk7CisgIH0KKyAgZm9yKGkgPSAweDEwLCBqID0gODsgaSA8PSAweDEyOyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uW2ldLFNpU19Qci0+Q0NSVDFDUlRDW2pdKTsKKyAgfQorICBmb3IoaSA9IDB4MTUsIGogPSAxMTsgaSA8PSAweDE2OyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uW2ldLFNpU19Qci0+Q0NSVDFDUlRDW2pdKTsKKyAgfQorICBmb3IoaSA9IDB4MGEsIGogPSAxMzsgaSA8PSAweDBjOyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uW2ldLFNpU19Qci0+Q0NSVDFDUlRDW2pdKTsKKyAgfQorCisgIHRlbXAgPSBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0gJiAweEUwOworICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LENSVHJhbnNsYXRpb25bMHgwRV0sMHgxRix0ZW1wKTsKKworICB0ZW1wID0gKFNpU19Qci0+Q0NSVDFDUlRDWzE2XSAmIDB4MDEpIDw8IDU7CisgIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXAgfD0gMHg4MDsKKyAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCxDUlRyYW5zbGF0aW9uWzB4MDldLDB4NUYsdGVtcCk7CiAKICAgdGVtcCA9IDA7Ci0gIGlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXAgfD0gMHg4MDsKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgewotICAgICBpZih0ZW1wYnggJiAweDAyMDApICAgICAgICB0ZW1wIHw9IDB4MjA7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwQiwweDVGLHRlbXApOwotICAgICBpZih0ZW1wYnggJiAweDAxMDApICB0ZW1wY3ggfD0gMHgwMDBhOwotICAgICBpZih0ZW1wYnggJiAweDA0MDApICB0ZW1wY3ggfD0gMHgxMjAwOwotICB9IGVsc2UgewotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBCLHRlbXApOwotICAgICBpZih0ZW1wYnggJiAweDAxMDApICB0ZW1wY3ggfD0gMHgwMDAyOwotICAgICBpZih0ZW1wYnggJiAweDA0MDApICB0ZW1wY3ggfD0gMHgwNjAwOwotICB9CisgIHRlbXAgfD0gKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDAxKSAmIDB4MDEpOworICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wIHw9IDB4MDg7CisgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTYsdGVtcCk7ICAgICAgICAgICAgICAJLyogU1IwMTogSGFsZkRDTEtbM10sIDgvOSBkaXYgZG90Y2xvY2tbMF0gKi8KIAotICBpZih0ZW1wYnggJiAweDAyMDApICB0ZW1wY3ggfD0gMHgwMDQwOworICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBGLDB4MDApOyAgICAgICAgICAgICAgCS8qIENSMTQ6ICh0ZXh0IG1vZGU6IHVuZGVybGluZSBsb2NhdGlvbikgKi8KKyAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMiwweDAwKTsgICAgICAgICAgICAgIAkvKiBDUjE3OiBuL2EgKi8KIAotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDExLDB4MDApOyAgICAgICAgICAgICAgICAJLyogMHgxMSBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KLQotICB0ZW1wYXggPSAoU2lTX1ByLT5TaVNfVkdBVlQgLSB0ZW1wYngpID4+IDI7Ci0KLSAgaWYoKE1vZGVObyA+IDB4MTMpIHx8IChId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSkgewotICAgICBpZihyZXNpbmZvICE9IFNJU19SSV8xMjgweDEwMjQpIHsKLQl0ZW1wYnggKz0gKHRlbXBheCA8PCAxKTsKLSAgICAgfQotICB9IGVsc2UgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xNDAweDEwNTApIHsKLQl0ZW1wYnggKz0gKHRlbXBheCA8PCAxKTsKLSAgICAgfQotICB9Ci0KLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKLSAgICAgdGVtcGJ4IC09IDEwOwotICB9IGVsc2UgewotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKLSAgICAgICAgICAgdGVtcGJ4ICs9IDQwOwotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBSERFID09IDgwMCkgdGVtcGJ4ICs9IDEwOwotCSAgIH0KLQl9Ci0gICAgIH0KLSAgfQotICB0ZW1wYXggPj49IDI7Ci0gIHRlbXBheCsrOwotICB0ZW1wYXggKz0gdGVtcGJ4OwotICBwdXNoMSA9IHRlbXBheDsKLSAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKLSAgICAgaWYodGVtcGJ4IDw9IDUxMykgIHsKLSAgICAgCWlmKHRlbXBheCA+PSA1MTMpIHRlbXBieCA9IDUxMzsKLSAgICAgfQotICB9Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEMsdGVtcCk7CQkJLyogMHgwQyBWZXJ0aWNhbCBSZXRyYWNlIFN0YXJ0ICovCi0KLSAgdGVtcGJ4LS07Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwRkY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTAsdGVtcCk7Ci0KLSAgaWYodGVtcGJ4ICYgMHgwMTAwKSB0ZW1wY3ggfD0gMHgwMDA4OwotCi0gIGlmKHRlbXBieCAmIDB4MDIwMCkgewotICAgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEIsMHgyMCk7Ci0gIH0KLSAgdGVtcGJ4Kys7Ci0KLSAgaWYodGVtcGJ4ICYgMHgwMTAwKSB0ZW1wY3ggfD0gMHgwMDA0OwotICBpZih0ZW1wYnggJiAweDAyMDApIHRlbXBjeCB8PSAweDAwODA7Ci0gIGlmKHRlbXBieCAmIDB4MDQwMCkgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSAgICAgICAgdGVtcGN4IHw9IDB4MDgwMDsKLSAgICAgZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDEpIHRlbXBjeCB8PSAweDA4MDA7Ci0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wY3ggfD0gMHgwQzAwOwotICB9Ci0KLSAgdGVtcGJ4ID0gcHVzaDE7Ci0gIHRlbXAgPSB0ZW1wYnggJiAweDAwMEY7Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MEQsdGVtcCk7ICAgICAgICAJCS8qIDB4MEQgdmVydGljYWwgUmV0cmFjZSBFbmQgKi8KLQotICBpZih0ZW1wYnggJiAweDAwMTApIHRlbXBjeCB8PSAweDIwMDA7Ci0KLSAgdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwQSx0ZW1wKTsgICAgICAgICAgICAgIAkvKiAweDBBIENSMDcgKi8KLQotICB0ZW1wID0gKHRlbXBjeCAmIDB4RkYwMCkgPj4gODsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNyx0ZW1wKTsgICAgICAgICAgICAgIAkvKiAweDE3IFNSMEEgKi8KLQotICB0ZW1wYXggPSBtb2RlZmxhZzsKLSAgdGVtcCA9ICh0ZW1wYXggJiAweEZGMDApID4+IDg7Ci0gIHRlbXAgPSAodGVtcCA+PiAxKSAmIDB4MDk7Ci0gIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSkgdGVtcCB8PSAweDAxOwkJLyogQWx3YXlzIDggZG90Y2xvY2sgKi8KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNix0ZW1wKTsgICAgICAgICAgICAgIAkvKiAweDE2IFNSMDEgKi8KLQotICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBGLDB4MDApOyAgICAgICAgICAgICAgCS8qIDB4MEYgQ1IxNCAqLwotCi0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTIsMHgwMCk7ICAgICAgICAgICAgICAJLyogMHgxMiBDUjE3ICovCi0KLSAgdGVtcCA9IDB4MDA7CisgIHRlbXAgPSAwOwogICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUkdCMThCaXQpIHsKLSAgICAgaWYoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMCkgJiAweDAxKSB7Ci0JdGVtcCA9IDB4ODA7Ci0gICAgIH0KKyAgICAgdGVtcCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAwKSAmIDB4MDEpIDw8IDc7CiAgIH0KLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxQSx0ZW1wKTsgICAgICAgICAgICAgICAgCS8qIDB4MUEgU1IwRSAqLworICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFBLHRlbXApOyAgICAgICAgICAgICAgICAJLyogU1IwRSwgZGl0aGVyWzddICovCiAKICAgdGVtcCA9IFNpU19HZXRSZWdCeXRlKChTaVNfUHItPlNpU19QM2NhKzB4MDIpKTsKLSAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxYix0ZW1wKTsKKyAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxYix0ZW1wKTsJCQkvKiA/ICovCisKKyNpZmRlZiBTSVNfWE9SR19YRjg2CisjaWZkZWYgVFdERUJVRworICAgeGY4NkRydk1zZygwLCBYX0lORk8sICIlZCAlZCAlZCAlZCAgJWQgJWQgJWQgJWQgICglZCAlZCAlZCAlZClcbiIsCisJU2lTX1ByLT5DSERpc3BsYXksIFNpU19Qci0+Q0hTeW5jU3RhcnQsIFNpU19Qci0+Q0hTeW5jRW5kLCBTaVNfUHItPkNIVG90YWwsCisJU2lTX1ByLT5DVkRpc3BsYXksIFNpU19Qci0+Q1ZTeW5jU3RhcnQsIFNpU19Qci0+Q1ZTeW5jRW5kLCBTaVNfUHItPkNWVG90YWwsCisJU2lTX1ByLT5DSEJsYW5rU3RhcnQsIFNpU19Qci0+Q0hCbGFua0VuZCwgU2lTX1ByLT5DVkJsYW5rU3RhcnQsIFNpU19Qci0+Q1ZCbGFua0VuZCk7CisKKyAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiIHt7MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCxcbiIsCisJU2lTX1ByLT5DQ1JUMUNSVENbMF0sIFNpU19Qci0+Q0NSVDFDUlRDWzFdLAorCVNpU19Qci0+Q0NSVDFDUlRDWzJdLCBTaVNfUHItPkNDUlQxQ1JUQ1szXSwKKwlTaVNfUHItPkNDUlQxQ1JUQ1s0XSwgU2lTX1ByLT5DQ1JUMUNSVENbNV0sCisJU2lTX1ByLT5DQ1JUMUNSVENbNl0sIFNpU19Qci0+Q0NSVDFDUlRDWzddKTsKKyAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAgMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCxcbiIsCisJU2lTX1ByLT5DQ1JUMUNSVENbOF0sIFNpU19Qci0+Q0NSVDFDUlRDWzldLAorCVNpU19Qci0+Q0NSVDFDUlRDWzEwXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTFdLAorCVNpU19Qci0+Q0NSVDFDUlRDWzEyXSwgU2lTX1ByLT5DQ1JUMUNSVENbMTNdLAorCVNpU19Qci0+Q0NSVDFDUlRDWzE0XSwgU2lTX1ByLT5DQ1JUMUNSVENbMTVdKTsKKyAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiICAgMHglMDJ4fX0sXG4iLCBTaVNfUHItPkNDUlQxQ1JUQ1sxNl0pOworI2VuZGlmCisjZW5kaWYKIH0KIAogLyogU2V0dXAgcGFuZWwgbGluawpAQCAtNTYzNywxOCArNTQ1MSwxOCBAQAogICogMzAwL0xWRFMrVFYsIDMwMC8zMDFCLURILCAzMTUvTFZEUytUViwgMzE1L0xDREEKICAqLwogc3RhdGljIHZvaWQKLVNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCkKK1NpU19TZXRHcm91cDFfTFZEUyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgbW9kZWZsYWcscmVzaW5mbzsKLSAgVVNIT1JUIHB1c2gyLHRlbXBheCx0ZW1wYngsdGVtcGN4LHRlbXA7Ci0gIFVMT05HIHRlbXBlYXg9MCx0ZW1wZWJ4LHRlbXBlY3gsdGVtcHZjZmFjdD0wOworICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZywgcmVzaW5mbyA9IDA7CisgIHVuc2lnbmVkIHNob3J0IHB1c2gyLCB0ZW1wYXgsIHRlbXBieCwgdGVtcGN4LCB0ZW1wOworICB1bnNpZ25lZCBpbnQgICB0ZW1wZWF4ID0gMCwgdGVtcGVieCwgdGVtcGVjeCwgdGVtcHZjZmFjdCA9IDA7CiAgIEJPT0xFQU4gaXNsdmRzID0gRkFMU0UsIGlzc2lzICA9IEZBTFNFLCBjaGtkY2xrZmlyc3QgPSBGQUxTRTsKICNpZmRlZiBTSVMzMDAKLSAgVVNIT1JUIGNydDJjcnRjOworICB1bnNpZ25lZCBzaG9ydCBjcnQyY3J0YyA9IDA7CiAjZW5kaWYKICNpZmRlZiBTSVMzMTVICi0gIFVTSE9SVCBwdXNoY3g7CisgIHVuc2lnbmVkIHNob3J0IHB1c2hjeDsKICNlbmRpZgogCiAgIGlmKE1vZGVObyA8PSAweDEzKSB7CkBAIC01NjU5LDE1ICs1NDczLDExIEBACiAjZW5kaWYKICAgfSBlbHNlIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOwotICAgICByZXNpbmZvID0gMDsKLSNpZmRlZiBTSVMzMDAKLSAgICAgY3J0MmNydGMgPSAwOwotI2VuZGlmCiAgIH0gZWxzZSB7CiAgICAgIG1vZGVmbGFnID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CiAgICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogI2lmZGVmIFNJUzMwMAotICAgICBjcnQyY3J0YyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CisgICAgIGNydDJjcnRjID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfQ1JUMkNSVEM7CiAjZW5kaWYKICAgfQogCkBAIC01NjgxLDE0ICs1NDkxLDE0IEBACiAgICAgIGlzc2lzID0gVFJVRTsKICAgfQogCi0gIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKGlzbHZkcykgJiYgKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpKSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoaXNsdmRzKSAmJiAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkpIHsKICAgICAgaWYoKCFTaVNfUHItPlNpU19JRl9ERUZfRlNUTikgJiYgKCFTaVNfUHItPlNpU19JRl9ERUZfRFNUTikpIHsKICAgICAgICAgY2hrZGNsa2ZpcnN0ID0gVFJVRTsKICAgICAgfQogICB9CiAKICNpZmRlZiBTSVMzMTVICi0gIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpIHsKICAgICAgaWYoSVNfU0lTMzMwKSB7CiAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRCwweDEwKTsKICAgICAgfSBlbHNlIGlmKElTX1NJUzc0MCkgewpAQCAtNTcwNCw3ICs1NTE0LDcgQEAKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkQsMHgwMCk7CiAgICAgICAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogICAgICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJELDB4MGYpOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDKSB7CiAJICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHx8CiAJICAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSkgewogCSAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRCwweDIwKTsKQEAgLTU3MjAsMTAgKzU1MzAsMTAgQEAKICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfTENESERFUzsKICAgaWYoaXNsdmRzKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBpZigoIVNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSAmJiAoIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROKSkgewotICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF82NDB4NDgwKSAmJgotICAgICAgICAgICAgICAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpKSB7Ci0gIAkgICAgICB0ZW1wYXggLT0gODsKKwlpZighU2lTX1ByLT5TaVNfSUZfREVGX0ZTVE4gJiYgIVNpU19Qci0+U2lTX0lGX0RFRl9EU1ROKSB7CisJICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MCkgJiYKKwkgICAgICAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpKSB7CisJICAgICAgdGVtcGF4IC09IDg7CiAJICAgfQogCX0KICAgICAgfQpAQCAtNTczNiwxMyArNTU0NiwxNCBAQAogCiAgIHRlbXBieCA9IFNpU19Qci0+U2lTX0hERTsKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7Ci0gICAgIGlmKChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMikgfHwKLSAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSkgewotICAgICAgICB0ZW1wYnggPj49IDE7Ci0gICAgIH0KICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewogICAgICAgICB0ZW1wYnggPSBTaVNfUHItPlBhbmVsWFJlczsKICAgICAgfQorICAgICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8zMjB4MjQwXzEpIHx8CisgICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMikgfHwKKyAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSkgeworICAgICAgICB0ZW1wYnggPj49IDE7CisgICAgIH0KICAgfQogCiAgIHRlbXBheCArPSB0ZW1wYng7CkBAIC01NzY3LDI1ICs1NTc4LDI1IEBACiAgIHRlbXAgPSAodGVtcGN4ID4+IDMpICYgMHgwMEZGOwogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OKSB7Ci0gICAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgICAgc3dpdGNoKE1vZGVObykgewotICAgICAgICAgICBjYXNlIDB4MDQ6Ci0gICAgICAgICAgIGNhc2UgMHgwNToKLSAgICAgICAgICAgY2FzZSAweDBkOiB0ZW1wID0gMHg1NjsgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgMHgxMDogdGVtcCA9IDB4NjA7IGJyZWFrOwotICAgICAgICAgICBjYXNlIDB4MTM6IHRlbXAgPSAweDVmOyBicmVhazsKLSAgICAgICAgICAgY2FzZSAweDQwOgotICAgICAgICAgICBjYXNlIDB4NDE6Ci0gICAgICAgICAgIGNhc2UgMHg0ZjoKLSAgICAgICAgICAgY2FzZSAweDQzOgotICAgICAgICAgICBjYXNlIDB4NDQ6Ci0gICAgICAgICAgIGNhc2UgMHg2MjoKLSAgICAgICAgICAgY2FzZSAweDU2OgotICAgICAgICAgICBjYXNlIDB4NTM6Ci0gICAgICAgICAgIGNhc2UgMHg1ZDoKLSAgICAgICAgICAgY2FzZSAweDVlOiB0ZW1wID0gMHg1NDsgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQorCWlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKKwkgICBzd2l0Y2goTW9kZU5vKSB7CisJICAgY2FzZSAweDA0OgorCSAgIGNhc2UgMHgwNToKKwkgICBjYXNlIDB4MGQ6IHRlbXAgPSAweDU2OyBicmVhazsKKwkgICBjYXNlIDB4MTA6IHRlbXAgPSAweDYwOyBicmVhazsKKwkgICBjYXNlIDB4MTM6IHRlbXAgPSAweDVmOyBicmVhazsKKwkgICBjYXNlIDB4NDA6CisJICAgY2FzZSAweDQxOgorCSAgIGNhc2UgMHg0ZjoKKwkgICBjYXNlIDB4NDM6CisJICAgY2FzZSAweDQ0OgorCSAgIGNhc2UgMHg2MjoKKwkgICBjYXNlIDB4NTY6CisJICAgY2FzZSAweDUzOgorCSAgIGNhc2UgMHg1ZDoKKwkgICBjYXNlIDB4NWU6IHRlbXAgPSAweDU0OyBicmVhazsKKwkgICB9CisJfQogICAgICB9CiAgIH0KICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNCx0ZW1wKTsJCQkvKiBCUExIUlMgKi8KQEAgLTU3OTMsMTIgKzU2MDQsMTIgQEAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAgICAgIHRlbXAgKz0gMjsKICAgICAgaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewotICAgICAgICB0ZW1wICs9IDg7Ci0gICAgICAgIGlmKFNpU19Qci0+UGFuZWxIUkUgIT0gOTk5KSB7Ci0gICAgICAgICAgIHRlbXAgPSB0ZW1wY3ggKyBTaVNfUHItPlBhbmVsSFJFOworCXRlbXAgKz0gODsKKwlpZihTaVNfUHItPlBhbmVsSFJFICE9IDk5OSkgeworCSAgIHRlbXAgPSB0ZW1wY3ggKyBTaVNfUHItPlBhbmVsSFJFOwogCSAgIGlmKHRlbXAgPj0gU2lTX1ByLT5TaVNfSFQpIHRlbXAgLT0gU2lTX1ByLT5TaVNfSFQ7CiAJICAgdGVtcCA+Pj0gMzsKLSAgICAgICAgfQorCX0KICAgICAgfQogICB9IGVsc2UgewogICAgICB0ZW1wICs9IDEwOwpAQCAtNTgwNiw5ICs1NjE3LDYgQEAKIAogICB0ZW1wICY9IDB4MUY7CiAgIHRlbXAgfD0gKCh0ZW1wY3ggJiAweDA3KSA8PCA1KTsKLSNpZiAwCi0gIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSB0ZW1wID0gMHgyMDsgICAgICAgCQkvKiBXUk9ORz8gQklPUyBsb2FkcyBjbCwgbm90IGFoICovCi0jZW5kaWYKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxNSx0ZW1wKTsJCQkvKiBCUExIUkUgKi8KIAogICAvKiBWZXJ0aWNhbCAqLwpAQCAtNTgyNiw5ICs1NjM0LDkgQEAKICAgcHVzaDIgPSB0ZW1wYng7CiAKICAgdGVtcGN4ID0gU2lTX1ByLT5TaVNfVkdBVlQgLSBTaVNfUHItPlNpU19WR0FWREU7Ci0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICBpZighKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSB7CisJaWYoIShTaVNfUHItPlNpU19MQ0RJbmZvICYgTENEUGFzczExKSkgewogCSAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZUIC0gU2lTX1ByLT5QYW5lbFlSZXM7CiAJfQogICAgICB9CkBAIC01ODQ0LDE5ICs1NjUyLDE5IEBACiAgICAgIGlmKGlzc2lzKSB0ZW1wYngrKzsKICAgfSBlbHNlIHsKICAgICAgdGVtcGJ4ICs9IHRlbXBjeDsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgdGVtcGJ4Kys7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgdGVtcGJ4Kys7CiAgICAgIGVsc2UgaWYoaXNzaXMpICAgICAgICAgICAgICAgICAgIHRlbXBieCsrOwogICB9CiAKLSAgaWYodGVtcGJ4ID49IFNpU19Qci0+U2lTX1ZUKSB0ZW1wYnggLT0gU2lTX1ByLT5TaVNfVlQ7CS8qIEJQTFZSUyAgKi8KKyAgaWYodGVtcGJ4ID49IFNpU19Qci0+U2lTX1ZUKSB0ZW1wYnggLT0gU2lTX1ByLT5TaVNfVlQ7CiAKICAgdGVtcCA9IHRlbXBieCAmIDB4MDBGRjsKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX1RSVU1QSU9OKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgaWYoTW9kZU5vID09IDB4MTApIHRlbXAgPSAweGE5OworCWlmKE1vZGVObyA9PSAweDEwKSB0ZW1wID0gMHhhOTsKICAgICAgfQogICB9Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTgsdGVtcCk7CisgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTgsdGVtcCk7CQkJLyogQlBMVlJTICovCiAKICAgdGVtcGN4ID4+PSAzOwogICB0ZW1wY3grKzsKQEAgLTU4NzksMTMgKzU2ODcsMTMgQEAKICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQVZERSAhPSBTaVNfUHItPlNpU19WREUpIHRlbXAgfD0gMHg0MDsKICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIEVuYWJsZUxWRFNEREEpICAgICAgICAgIHRlbXAgfD0gMHg0MDsKICAgdGVtcGJ4ID0gMHg4NzsKLSAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB8fAotICAgICAoSHdJbmZvLT5qQ2hpcFJldmlzaW9uID49IDB4MzApKSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB8fAorICAgICAoU2lTX1ByLT5DaGlwUmV2aXNpb24gPj0gMHgzMCkpIHsKICAgICAgdGVtcGJ4ID0gMHgwNzsKICAgICAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMSkgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgewogCWlmKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDApICYgMHgwMykgICAgdGVtcCB8PSAweDgwOwogICAgICB9Ci0gICAgIC8qIENocm9udGVsIDcwMXggb3BlcmF0ZXMgaW4gMjRiaXQgbW9kZSAoOC04LTgsIDJ4MTJiaXQgbXV0bGlwbGV4ZWQpIHZpYSBWR0EyICovCisgICAgIC8qIENocm9udGVsIDcwMXggb3BlcmF0ZXMgaW4gMjRiaXQgbW9kZSAoOC04LTgsIDJ4MTJiaXQgbXVsdGlwbGV4ZWQpIHZpYSBWR0EyICovCiAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RSR0IxOEJpdCkgewogCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKIAkgICBpZihTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgwNikgJiAweDEwKSAgICAgIHRlbXAgfD0gMHg4MDsKQEAgLTU4OTYsNTkgKzU3MDQsNTggQEAKICAgfQogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUEsdGVtcGJ4LHRlbXApOwogCi0gIHRlbXBieCA9IHB1c2gyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkvKiBCUExWREVFICovCisgIHRlbXBieCA9IHB1c2gyOwkJCQkJCS8qIEJQTFZERUUgKi8KIAotICB0ZW1wY3ggPSBTaVNfUHItPlNpU19MQ0RWREVTOyAgICAgICAgICAgICAgICAgICAgICAgIAkJLyogQlBMVkRFUyAqLworICB0ZW1wY3ggPSBTaVNfUHItPlNpU19MQ0RWREVTOwkJCQkJLyogQlBMVkRFUyAqLwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewogICAgICBzd2l0Y2goU2lTX1ByLT5TaVNfTENEUmVzSW5mbykgewogICAgICBjYXNlIFBhbmVsXzY0MHg0ODA6Ci0gICAgICAgIHRlbXBieCA9IFNpU19Qci0+U2lTX1ZHQVZERSAtIDE7Ci0gICAgICAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKKwl0ZW1wYnggPSBTaVNfUHItPlNpU19WR0FWREUgLSAxOworCXRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZERTsKIAlicmVhazsKICAgICAgY2FzZSBQYW5lbF84MDB4NjAwOgotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewotICAgICAgICAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NjAwKSB0ZW1wY3grKzsKLSAgICAgICAgfQorCWlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CisJICAgaWYocmVzaW5mbyA9PSBTSVNfUklfODAweDYwMCkgdGVtcGN4Kys7CisJfQogCWJyZWFrOwogICAgICBjYXNlIFBhbmVsXzEwMjR4NjAwOgotICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewotICAgICAgICAgICBpZihyZXNpbmZvID09IFNJU19SSV8xMDI0eDYwMCkgdGVtcGN4Kys7Ci0gICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSB7CisJaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKKwkgICBpZihyZXNpbmZvID09IFNJU19SSV8xMDI0eDYwMCkgdGVtcGN4Kys7CisJICAgaWYoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpIHsKIAkgICAgICBpZihyZXNpbmZvID09IFNJU19SSV84MDB4NjAwKSB0ZW1wY3grKzsKIAkgICB9Ci0gICAgICAgIH0KKwl9CiAJYnJlYWs7CiAgICAgIGNhc2UgUGFuZWxfMTAyNHg3Njg6Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLSAgICAgICAgICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpIHRlbXBjeCsrOworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CisJICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpIHRlbXBjeCsrOwogCSAgIH0KLSAgICAgICAgfQorCX0KIAlicmVhazsKICAgICAgfQogICB9CiAKICAgdGVtcCA9ICgodGVtcGJ4ID4+IDgpICYgMHgwNykgPDwgMzsKLSAgdGVtcCA9IHRlbXAgfCAoKHRlbXBjeCA+PiA4KSAmIDB4MDcpOworICB0ZW1wIHw9ICgodGVtcGN4ID4+IDgpICYgMHgwNyk7CiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUQsdGVtcCk7Ci0gIC8qIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9GU1ROKSB0ZW1wYngrKzsgICovCiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MUMsdGVtcGJ4KTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxQix0ZW1wY3gpOwogCiAgIC8qIFZlcnRpY2FsIHNjYWxpbmcgKi8KIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAgICAgLyogMzAwIHNlcmllcyAqLwogICAgICB0ZW1wZWF4ID0gU2lTX1ByLT5TaVNfVkdBVkRFIDw8IDY7Ci0gICAgIHRlbXAgPSAodGVtcGVheCAlIChVTE9ORylTaVNfUHItPlNpU19WREUpOwotICAgICB0ZW1wZWF4ID0gdGVtcGVheCAvIChVTE9ORylTaVNfUHItPlNpU19WREU7CisgICAgIHRlbXAgPSAodGVtcGVheCAlICh1bnNpZ25lZCBpbnQpU2lTX1ByLT5TaVNfVkRFKTsKKyAgICAgdGVtcGVheCA9IHRlbXBlYXggLyAodW5zaWduZWQgaW50KVNpU19Qci0+U2lTX1ZERTsKICAgICAgaWYodGVtcCkgdGVtcGVheCsrOwogCiAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBFbmFibGVMVkRTRERBKSB0ZW1wZWF4ID0gMHgzRjsKIAotICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAmIDB4MDBGRik7CisgICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweDAwRkYpOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFFLHRlbXApOyAgICAgIAkvKiBCUExWQ0ZBQ1QgKi8KICAgICAgdGVtcHZjZmFjdCA9IHRlbXA7CiAjZW5kaWYgLyogU0lTMzAwICovCkBAIC01OTYzLDIwICs1NzcwLDIwIEBACiAgICAgIGlmKHRlbXApIHRlbXBlYXgrKzsKICAgICAgdGVtcHZjZmFjdCA9IHRlbXBlYXg7CiAKLSAgICAgdGVtcCA9IChVU0hPUlQpKHRlbXBlYXggJiAweDAwRkYpOworICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSh0ZW1wZWF4ICYgMHgwMEZGKTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzNyx0ZW1wKTsKLSAgICAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWF4ICYgMHgwMEZGMDApID4+IDgpOworICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgodGVtcGVheCAmIDB4MDBGRjAwKSA+PiA4KTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzNix0ZW1wKTsKLSAgICAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWF4ICYgMHgwMDAzMDAwMCkgPj4gMTYpOworICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgodGVtcGVheCAmIDB4MDAwMzAwMDApID4+IDE2KTsKICAgICAgaWYoU2lTX1ByLT5TaVNfVkRFID09IFNpU19Qci0+U2lTX1ZHQVZERSkgdGVtcCB8PSAweDA0OwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM1LHRlbXApOwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAyRUxWKSkgewotICAgICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAmIDB4MDBGRik7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1BBUlQ0U0NBTEVSKSB7CisgICAgICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweDAwRkYpOwogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDNjLHRlbXApOwotICAgICAgICB0ZW1wID0gKFVTSE9SVCkoKHRlbXBlYXggJiAweDAwRkYwMCkgPj4gOCk7CisgICAgICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKCh0ZW1wZWF4ICYgMHgwMEZGMDApID4+IDgpOwogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDNiLHRlbXApOwotICAgICAgICB0ZW1wID0gKFVTSE9SVCkoKCh0ZW1wZWF4ICYgMHgwMDAzMDAwMCkgPj4gMTYpIDw8IDYpOworICAgICAgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgoKHRlbXBlYXggJiAweDAwMDMwMDAwKSA+PiAxNikgPDwgNik7CiAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzYSwweDNmLHRlbXApOwogICAgICAgICB0ZW1wID0gMDsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkRFICE9IFNpU19Qci0+U2lTX1ZHQVZERSkgdGVtcCB8PSAweDA4OwpAQCAtNTk5NywyOSArNTgwNCwyOSBAQAogICAgICB0ZW1wZWN4ID0gMHhGRkZGOwogICB9IGVsc2UgewogICAgICB0ZW1wZWN4ID0gdGVtcGVieCAvIFNpU19Qci0+U2lTX0hERTsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgewogICAgICAgICBpZih0ZW1wZWJ4ICUgU2lTX1ByLT5TaVNfSERFKSB0ZW1wZWN4Kys7CiAgICAgIH0KICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgdGVtcGVheCA9ICh0ZW1wZWJ4IC8gdGVtcGVjeCkgLSAxOwogICB9IGVsc2UgewogICAgICB0ZW1wZWF4ID0gKChTaVNfUHItPlNpU19WR0FIVCA8PCAxNikgLyB0ZW1wZWN4KSAtIDE7CiAgIH0KICAgdGVtcGVjeCA9ICh0ZW1wZWN4IDw8IDE2KSB8ICh0ZW1wZWF4ICYgMHhGRkZGKTsKLSAgdGVtcCA9IChVU0hPUlQpKHRlbXBlY3ggJiAweDAwRkYpOworICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSh0ZW1wZWN4ICYgMHgwMEZGKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxRix0ZW1wKTsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgIHRlbXBlYXggPSAoU2lTX1ByLT5TaVNfVkdBVkRFIDw8IDE4KSAvIHRlbXB2Y2ZhY3Q7Ci0gICAgIHRlbXBieCA9IChVU0hPUlQpKHRlbXBlYXggJiAweEZGRkYpOworICAgICB0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweEZGRkYpOwogICB9IGVsc2UgewogICAgICB0ZW1wZWF4ID0gU2lTX1ByLT5TaVNfVkdBVkRFIDw8IDY7CiAgICAgIHRlbXBieCA9IHRlbXB2Y2ZhY3QgJiAweDNmOwogICAgICBpZih0ZW1wYnggPT0gMCkgdGVtcGJ4ID0gNjQ7CiAgICAgIHRlbXBlYXggLz0gdGVtcGJ4OwotICAgICB0ZW1wYnggPSAoVVNIT1JUKSh0ZW1wZWF4ICYgMHhGRkZGKTsKKyAgICAgdGVtcGJ4ID0gKHVuc2lnbmVkIHNob3J0KSh0ZW1wZWF4ICYgMHhGRkZGKTsKICAgfQogICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSB0ZW1wYngtLTsKICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIEVuYWJsZUxWRFNEREEpIHsKQEAgLTYwMzIsMjQgKzU4MzksMjQgQEAKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyMCx0ZW1wKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyMSx0ZW1wYngpOwogCi0gIHRlbXBlY3ggPj49IDE2OyAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIEJQTEhDRkFDVCAgKi8KKyAgdGVtcGVjeCA+Pj0gMTY7CQkJCQkJLyogQlBMSENGQUNUICAqLwogICBpZighY2hrZGNsa2ZpcnN0KSB7CiAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBlY3ggPj49IDE7CiAgIH0KLSAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWN4ICYgMHhGRjAwKSA+PiA4KTsKKyAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBlY3ggJiAweEZGMDApID4+IDgpOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDIyLHRlbXApOwotICB0ZW1wID0gKFVTSE9SVCkodGVtcGVjeCAmIDB4MDBGRik7CisgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlY3ggJiAweDAwRkYpOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDIzLHRlbXApOwogCiAjaWZkZWYgU0lTMzE1SAotICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKLSAgICAgICAgaWYoKGlzbHZkcykgfHwgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFZCX1NJUzMwMUxWMzAyTFYpKSB7CisgICAgICAgIGlmKChpc2x2ZHMpIHx8IChTaVNfUHItPlNpU19WQkluZm8gJiBWQl9TSVNMVkRTKSkgewogICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4MjApOwogCX0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYoaXNsdmRzKSB7Ci0gICAgICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgICAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgICAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxZSwweDAzKTsKICAgICAgICAgICAgfSBlbHNlIHsKIAkgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDFlLDB4MjMpOwpAQCAtNjA2MSwxNyArNTg2OCwyNiBAQAogCiAjaWZkZWYgU0lTMzAwCiAgIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9UUlVNUElPTikgewotICAgICBpbnQgaTsKLSAgICAgVUNIQVIgVHJ1bXBNb2RlMTNbNF0gICA9IHsgMHgwMSwgMHgxMCwgMHgyYywgMHgwMCB9OwotICAgICBVQ0hBUiBUcnVtcE1vZGUxMF8xWzRdID0geyAweDAxLCAweDEwLCAweDI3LCAweDAwIH07Ci0gICAgIFVDSEFSIFRydW1wTW9kZTEwXzJbNF0gPSB7IDB4MDEsIDB4MTYsIDB4MTAsIDB4MDAgfTsKKyAgICAgdW5zaWduZWQgY2hhciAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgICAgIHVuc2lnbmVkIGNoYXIgKnRydW1wZGF0YTsKKyAgICAgaW50ICAgaSwgaiA9IGNydDJjcnRjOworICAgICB1bnNpZ25lZCBjaGFyIFRydW1wTW9kZTEzWzRdICAgPSB7IDB4MDEsIDB4MTAsIDB4MmMsIDB4MDAgfTsKKyAgICAgdW5zaWduZWQgY2hhciBUcnVtcE1vZGUxMF8xWzRdID0geyAweDAxLCAweDEwLCAweDI3LCAweDAwIH07CisgICAgIHVuc2lnbmVkIGNoYXIgVHJ1bXBNb2RlMTBfMls0XSA9IHsgMHgwMSwgMHgxNiwgMHgxMCwgMHgwMCB9OworCisgICAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgeworCXRydW1wZGF0YSA9ICZST01BZGRyWzB4ODAwMSArIChqICogODApXTsKKyAgICAgfSBlbHNlIHsKKwlpZihTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSAweDBlKSBqICs9IDc7CisJdHJ1bXBkYXRhID0gJlNpUzMwMF9UcnVtcGlvbkRhdGFbal1bMF07CisgICAgIH0KIAogICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAyLDB4YmYpOwogICAgICBmb3IoaT0wOyBpPDU7IGkrKykgewotICAgICAgICBTaVNfU2V0VHJ1bXBpb25CbG9jayhTaVNfUHIsICZTaVMzMDBfVHJ1bXBpb25EYXRhW2NydDJjcnRjXVswXSk7CisJU2lTX1NldFRydW1waW9uQmxvY2soU2lTX1ByLCB0cnVtcGRhdGEpOwogICAgICB9CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgaWYoTW9kZU5vID09IDB4MTMpIHsKKwlpZihNb2RlTm8gPT0gMHgxMykgewogCSAgIGZvcihpPTA7IGk8NDsgaSsrKSB7CiAJICAgICAgU2lTX1NldFRydW1waW9uQmxvY2soU2lTX1ByLCAmVHJ1bXBNb2RlMTNbMF0pOwogCSAgIH0KQEAgLTYwOTUsNjcgKzU5MTEsNjYgQEAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyOSwweDVBKTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyQSwweDRCKTsKICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQ0LH4weDA3LDB4MDMpOwotICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19IREU7ICAgICAgICAgICAgICAgICAgICAgICAJCS8qIEJscHMgPSBsY2RoZGVlKGxjZGhkZXMrSERFKSArIDY0ICovCi0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wYXggPj49IDE7CisgICAgIHRlbXBheCA9IFNpU19Qci0+U2lTX0hERTsJCQkJCS8qIEJscHMgPSBsY2RoZGVlKGxjZGhkZXMrSERFKSArIDY0ICovCisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8xIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8yIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSB0ZW1wYXggPj49IDE7CiAgICAgIHRlbXBheCArPSA2NDsKLSAgICAgdGVtcCA9IHRlbXBheCAmIDB4MDBGRjsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzOCx0ZW1wKTsKLSAgICAgdGVtcCA9ICgodGVtcGF4ICYgMHhGRjAwKSA+PiA4KSA8PCAzOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM4LHRlbXBheCAmIDB4ZmYpOworICAgICB0ZW1wID0gKHRlbXBheCA+PiA4KSA8PCAzOwogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MzUsfjB4MDc4LHRlbXApOwotICAgICB0ZW1wYXggKz0gMzI7CQkgICAgICAgICAgICAgICAgICAgICAJCS8qIEJscGU9bEJscHMrMzIgKi8KLSAgICAgdGVtcCA9IHRlbXBheCAmIDB4MDBGRjsKLSAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0ZTVE4pIHRlbXAgPSAwOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM5LHRlbXApOwotICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNBLDB4MDApOyAgICAgICAgCS8qIEJmbG1sPTAgKi8KLSAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNDLH4weDAwNywweDAwKTsKKyAgICAgdGVtcGF4ICs9IDMyOwkJCQkJCS8qIEJscGUgPSBsQmxwcyszMiAqLworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDM5LHRlbXBheCAmIDB4ZmYpOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNBLDB4MDApOwkJLyogQmZsbWwgPSAwICovCisgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0MsfjB4MDA3KTsKIAogICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WREU7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wYXggPj49IDE7CisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8xIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8yIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSB0ZW1wYXggPj49IDE7CiAgICAgIHRlbXBheCA+Pj0gMTsKLSAgICAgdGVtcCA9IHRlbXBheCAmIDB4MDBGRjsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzQix0ZW1wKTsKLSAgICAgdGVtcCA9ICgodGVtcGF4ICYgMHhGRjAwKSA+PiA4KSA8PCAzOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNCLHRlbXBheCAmIDB4ZmYpOworICAgICB0ZW1wID0gKHRlbXBheCA+PiA4KSA8PCAzOwogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0MsfjB4MDM4LHRlbXApOwogCiAgICAgIHRlbXBlYXggPSBTaVNfUHItPlNpU19IREU7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wZWF4ID4+PSAxOwotICAgICB0ZW1wZWF4IDw8PSAyOyAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogQkR4RklGT1NUT1AgPSAoSERFKjQpLzEyOCAqLwotICAgICB0ZW1wZWJ4ID0gMTI4OwotICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAlIHRlbXBlYngpOwotICAgICB0ZW1wZWF4ID0gdGVtcGVheCAvIHRlbXBlYng7CisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8xIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8yIHx8CisgICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMzIweDI0MF8zKSB0ZW1wZWF4ID4+PSAxOworICAgICB0ZW1wZWF4IDw8PSAyOwkJCSAJCQkvKiBCRHhGSUZPU1RPUCA9IChIREUqNCkvMTI4ICovCisgICAgIHRlbXAgPSB0ZW1wZWF4ICYgMHg3ZjsKKyAgICAgdGVtcGVheCA+Pj0gNzsKICAgICAgaWYodGVtcCkgdGVtcGVheCsrOwotICAgICB0ZW1wID0gKFVTSE9SVCkodGVtcGVheCAmIDB4MDAzRik7Ci0gICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHg0NSx+MHgwRkYsdGVtcCk7Ci0gICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0YsMHgwMCk7ICAgICAgICAgCS8qIEJEeFdhZHJzdDAgKi8KKyAgICAgdGVtcCA9IHRlbXBlYXggJiAweDNmOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQ1LHRlbXApOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNGLDB4MDApOwkJLyogQkR4V2FkcnN0MCAqLwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNFLDB4MDApOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNELDB4MTApOwotICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4M0MsfjB4MDQwLDB4MDApOworICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDNDLH4weDA0MCk7CiAKICAgICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfSERFOwotICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMiB8fAotICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzY0MHg0ODBfMykgdGVtcGF4ID4+PSAxOwotICAgICB0ZW1wYXggPj49IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogQkR4V2Fkcm9mZiA9IEhERSo0LzgvOCAqLworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMSB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMiB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMykgdGVtcGF4ID4+PSAxOworICAgICB0ZW1wYXggPj49IDQ7CQkJCQkJLyogQkR4V2Fkcm9mZiA9IEhERSo0LzgvOCAqLwogICAgICBwdXNoY3ggPSB0ZW1wYXg7CiAgICAgIHRlbXAgPSB0ZW1wYXggJiAweDAwRkY7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NDMsdGVtcCk7CiAgICAgIHRlbXAgPSAoKHRlbXBheCAmIDB4RkYwMCkgPj4gOCkgPDwgMzsKICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQ0LH4weDBGOCx0ZW1wKTsKIAotICAgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WREU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogQkR4V2FkcnN0MSA9IEJEeFdhZHJzdDAgKyBCRHhXYWRyb2ZmICogVkRFICovCi0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8yIHx8Ci0gICAgICAgIFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfNjQweDQ4MF8zKSB0ZW1wYXggPj49IDE7Ci0gICAgIHRlbXBlYXggPSAodGVtcGF4ICogcHVzaGN4KTsKLSAgICAgdGVtcGVieCA9IDB4MDAxMDAwMDAgKyB0ZW1wZWF4OwotICAgICB0ZW1wID0gKFVTSE9SVCl0ZW1wZWJ4ICYgMHgwMDAwMDBGRjsKKyAgICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkRFOwkJCQkgCS8qIEJEeFdhZHJzdDEgPSBCRHhXYWRyc3QwICsgQkR4V2Fkcm9mZiAqIFZERSAqLworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMSB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMiB8fAorICAgICAgICBTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzMyMHgyNDBfMykgdGVtcGF4ID4+PSAxOworICAgICB0ZW1wZWF4ID0gdGVtcGF4ICogcHVzaGN4OworICAgICB0ZW1wID0gdGVtcGVheCAmIDB4RkY7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NDIsdGVtcCk7Ci0gICAgIHRlbXAgPSAoVVNIT1JUKSgodGVtcGVieCAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICB0ZW1wID0gKHRlbXBlYXggJiAweEZGMDApID4+IDg7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4NDEsdGVtcCk7Ci0gICAgIHRlbXAgPSAoVVNIT1JUKSgodGVtcGVieCAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgdGVtcCA9ICgodGVtcGVheCAmIDB4RkYwMDAwKSA+PiAxNikgfCAweDEwOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDQwLHRlbXApOwotICAgICB0ZW1wID0gKFVTSE9SVCkoKCh0ZW1wZWJ4ICYgMHgwMTAwMDAwMCkgPj4gMjQpIDw8IDcpOworICAgICB0ZW1wID0gKCh0ZW1wZWF4ICYgMHgwMTAwMDAwMCkgPj4gMjQpIDw8IDc7CiAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgzQyx+MHgwODAsdGVtcCk7CiAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyRiwweDAzKTsKQEAgLTYxOTIsMjAgKzYwMDcsMjAgQEAKIAogLyogU2V0IFBhcnQgMSAqLwogc3RhdGljIHZvaWQKLVNpU19TZXRHcm91cDEoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldEdyb3VwMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewogI2lmIGRlZmluZWQoU0lTMzAwKSB8fCBkZWZpbmVkKFNJUzMxNUgpCi0gIFVDSEFSICAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIGNoYXIgICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CiAjZW5kaWYKLSAgVVNIT1JUICB0ZW1wPTAsIHRlbXBheD0wLCB0ZW1wYng9MCwgdGVtcGN4PTAsIGJyaWRnZWFkZD0wOwotICBVU0hPUlQgIHB1c2hieD0wLCBDUlQxSW5kZXg9MCwgbW9kZWZsYWcsIHJlc2luZm89MDsKKyAgdW5zaWduZWQgc2hvcnQgIHRlbXA9MCwgdGVtcGF4PTAsIHRlbXBieD0wLCB0ZW1wY3g9MCwgYnJpZGdlYWRkPTA7CisgIHVuc2lnbmVkIHNob3J0ICBwdXNoYng9MCwgQ1JUMUluZGV4PTAsIG1vZGVmbGFnLCByZXNpbmZvPTA7CiAjaWZkZWYgU0lTMzE1SAotICBVU0hPUlQgIHRlbXBibD0wOworICB1bnNpZ25lZCBzaG9ydCAgdGVtcGJsPTA7CiAjZW5kaWYKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7Ci0gICAgIFNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbywgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKyAgICAgU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgcmV0dXJuOwogICB9CiAKQEAgLTYyMTQsNDcgKzYwMjksNDcgQEAKICAgfSBlbHNlIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICBtb2RlZmxhZyA9IFNpU19Qci0+Q01vZGVGbGFnOwogICB9IGVsc2UgewotICAgICBDUlQxSW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQxQ1JUQzsKKyAgICAgQ1JUMUluZGV4ID0gU2lTX0dldFJlZkNSVDFDUlRDKFNpU19QciwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBTaVNfUHItPlNpU19Vc2VXaWRlQ1JUMik7CiAgICAgIHJlc2luZm8gPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9SRVNJTkZPOwogICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwogICB9CiAKLSAgU2lTX1NldENSVDJPZmZzZXQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7CisgIFNpU19TZXRDUlQyT2Zmc2V0KFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAotICBpZiggISAoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSAmJgorICBpZiggISAoKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpICYmCiAgICAgICAgICAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgJiYKICAgICAgICAgIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpICkgewogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUggKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCApIHsKICNpZmRlZiBTSVMzMDAKLSAgCVNpU19TZXRDUlQyRklGT18zMDAoU2lTX1ByLCBNb2RlTm8sIEh3SW5mbyk7CisJU2lTX1NldENSVDJGSUZPXzMwMChTaVNfUHIsIE1vZGVObyk7CiAjZW5kaWYKICAgICAgfSBlbHNlIHsKICNpZmRlZiBTSVMzMTVICi0gICAgICAgIFNpU19TZXRDUlQyRklGT18zMTAoU2lTX1ByLCBId0luZm8pOworCVNpU19TZXRDUlQyRklGT18zMTAoU2lTX1ByKTsKICNlbmRpZgogICAgICB9CiAKICAgICAgLyogMS4gSG9yaXpvbnRhbCBzZXR1cCAqLwogCi0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUggKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCApIHsKIAogI2lmZGVmIFNJUzMwMCAgIC8qIC0tLS0tLS0tLS0tLS0gMzAwIHNlcmllcyAtLS0tLS0tLS0tLS0tLSovCiAKLSAgICAJdGVtcCA9IChTaVNfUHItPlNpU19WR0FIVCAtIDEpICYgMHgwRkY7ICAgCQkgIC8qIEJUVkdBMkhUIDB4MDgsMHgwOSAqLwotICAgIAlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA4LHRlbXApOyAgICAgICAgICAgICAgLyogQ1JUMiBIb3Jpem9udGFsIFRvdGFsICovCisJdGVtcCA9IChTaVNfUHItPlNpU19WR0FIVCAtIDEpICYgMHgwRkY7ICAgCQkgIC8qIEJUVkdBMkhUIDB4MDgsMHgwOSAqLworCVNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDgsdGVtcCk7ICAgICAgICAgICAgICAvKiBDUlQyIEhvcml6b250YWwgVG90YWwgKi8KIAotICAgIAl0ZW1wID0gKCgoU2lTX1ByLT5TaVNfVkdBSFQgLSAxKSAmIDB4RkYwMCkgPj4gOCkgPDwgNDsKLSAgICAJU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDA5LDB4MGYsdGVtcCk7ICAgIC8qIENSVDIgSG9yaXpvbnRhbCBUb3RhbCBPdmVyZmxvdyBbNzo0XSAqLworCXRlbXAgPSAoKChTaVNfUHItPlNpU19WR0FIVCAtIDEpICYgMHhGRjAwKSA+PiA4KSA8PCA0OworCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwOSwweDBmLHRlbXApOyAgICAvKiBDUlQyIEhvcml6b250YWwgVG90YWwgT3ZlcmZsb3cgWzc6NF0gKi8KIAotICAgIAl0ZW1wID0gKFNpU19Qci0+U2lTX1ZHQUhERSArIDEyKSAmIDB4MEZGOyAgICAgICAgICAgICAgICAgLyogQlRWR0EySERFRSAweDBBLDB4MEMgKi8KLSAgICAJU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwQSx0ZW1wKTsgICAgICAgICAgICAgIC8qIENSVDIgSG9yaXpvbnRhbCBEaXNwbGF5IEVuYWJsZSBFbmQgKi8KKwl0ZW1wID0gKFNpU19Qci0+U2lTX1ZHQUhERSArIDEyKSAmIDB4MEZGOyAgICAgICAgICAgICAgICAgLyogQlRWR0EySERFRSAweDBBLDB4MEMgKi8KKwlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDBBLHRlbXApOyAgICAgICAgICAgICAgLyogQ1JUMiBIb3Jpem9udGFsIERpc3BsYXkgRW5hYmxlIEVuZCAqLwogCiAJcHVzaGJ4ID0gU2lTX1ByLT5TaVNfVkdBSERFICsgMTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ4ICBCVFZHQTJIUlMgMHgwQiwweDBDICovCi0gICAgCXRlbXBjeCA9IChTaVNfUHItPlNpU19WR0FIVCAtIFNpU19Qci0+U2lTX1ZHQUhERSkgPj4gMjsKLSAgICAJdGVtcGJ4ID0gcHVzaGJ4ICsgdGVtcGN4OwotICAgIAl0ZW1wY3ggPDw9IDE7Ci0gICAgCXRlbXBjeCArPSB0ZW1wYng7CisJdGVtcGN4ID0gKFNpU19Qci0+U2lTX1ZHQUhUIC0gU2lTX1ByLT5TaVNfVkdBSERFKSA+PiAyOworCXRlbXBieCA9IHB1c2hieCArIHRlbXBjeDsKKwl0ZW1wY3ggPDw9IDE7CisJdGVtcGN4ICs9IHRlbXBieDsKIAogCWJyaWRnZWFkZCA9IDEyOwogCkBAIC02MzAxLDcgKzYxMTYsNyBAQAogCWJyaWRnZWFkZCA9IDE2OwogCiAJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKLQkgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisJICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7CiAJICAgICAgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSB8fAogCQkgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSkgewogCQkgaWYocmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0KSB7CkBAIC02MzE5LDcgKzYxMzQsNyBAQAogCiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CiAKLSAgICAgICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CisJaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAJICAgdGVtcGJ4ID0gU2lTX1ByLT5DSFN5bmNTdGFydCArIGJyaWRnZWFkZDsKIAkgICB0ZW1wY3ggPSBTaVNfUHItPkNIU3luY0VuZCArIGJyaWRnZWFkZDsKIAkgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIVDsKQEAgLTYzNDEsMjIgKzYxNTYsMjIgQEAKIAkgICAgICBjcjUgID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbNV07CiAJICAgICAgY3IxNSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzE1XTsKIAkgICB9Ci0gICAgICAgICAgIHRlbXBieCA9ICgoY3I0IHwgKChjcjE0ICYgMHhDMCkgPDwgMikpIC0gMykgPDwgMzsgCQkgICAgLyogKFZHQUhSUy0zKSo4ICovCi0gICAgICAgICAgIHRlbXBjeCA9ICgoKGNyNSAmIDB4MWYpIHwgKChjcjE1ICYgMHgwNCkgPDwgKDUtMikpKSAtIDMpIDw8IDM7ICAgLyogKFZHQUhSRS0zKSo4ICovCisJICAgdGVtcGJ4ID0gKChjcjQgfCAoKGNyMTQgJiAweEMwKSA8PCAyKSkgLSAzKSA8PCAzOyAJCSAgICAvKiAoVkdBSFJTLTMpKjggKi8KKwkgICB0ZW1wY3ggPSAoKChjcjUgJiAweDFmKSB8ICgoY3IxNSAmIDB4MDQpIDw8ICg1LTIpKSkgLSAzKSA8PCAzOyAgIC8qIChWR0FIUkUtMykqOCAqLwogCSAgIHRlbXBjeCAmPSAweDAwRkY7CiAJICAgdGVtcGN4IHw9ICh0ZW1wYnggJiAweEZGMDApOwotICAgICAgICAgICB0ZW1wYnggKz0gYnJpZGdlYWRkOwotICAgICAgICAgICB0ZW1wY3ggKz0gYnJpZGdlYWRkOworCSAgIHRlbXBieCArPSBicmlkZ2VhZGQ7CisJICAgdGVtcGN4ICs9IGJyaWRnZWFkZDsKIAkgICB0ZW1wYXggPSBTaVNfUHItPlNpU19WR0FIVDsKIAkgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSB0ZW1wYXggPj49IDE7CiAJICAgdGVtcGF4LS07CiAJICAgaWYodGVtcGN4ID4gdGVtcGF4KSB0ZW1wY3ggPSB0ZW1wYXg7Ci0gICAgICAgIH0KKwl9CiAKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgewotICAgICAgCSAgIHRlbXBieCA9IDEwNDA7Ci0gICAgICAJICAgdGVtcGN4ID0gMTA0NDsgICAvKiBIV0N1cnNvciBidWchICovCi0gICAgICAgIH0KKwlpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXROVFNDMTAyNCB8IFRWU2V0NTI1cDEwMjQpKSB7CisJICAgdGVtcGJ4ID0gMTA0MDsKKwkgICB0ZW1wY3ggPSAxMDQ0OyAgIC8qIEhXQ3Vyc29yIGJ1ZyEgKi8KKwl9CiAKICAgICAgfQogCkBAIC02MzcyLDE4ICs2MTg3LDE4IEBACiAgICAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX1ZHQVZUIC0gMTsKICAgICAgdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU182NjEpIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotCSAgIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwkgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKIAkgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKIAkgICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvU1ZJREVPIHwgU2V0Q1JUMlRvQVZJREVPKSkgewogCSAgICAgICAgICAgIHRlbXAtLTsKIAkgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KKwkgICAgICB9CiAJICAgfSBlbHNlIHsKLSAJICAgICAgdGVtcC0tOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworCSAgICAgIHRlbXAtLTsKKwkgICB9CisJfSBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKIAkgICB0ZW1wLS07CiAJfQogICAgICB9CkBAIC02Mzk1LDkgKzYyMTAsOSBAQAogICAgICB0ZW1wID0gKCh0ZW1wYnggPj4gNSkgJiAweDM4KSB8ICgodGVtcGN4ID4+IDgpICYgMHgwNyk7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTIsdGVtcCk7ICAgICAgICAgICAgICAgICAvKiBPdmVyZmxvdyAqLwogCi0gICAgIGlmKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkpIHsKLSAgICAgICAgdGVtcGJ4Kys7Ci0gICAJdGVtcGF4ID0gdGVtcGJ4OworICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSkgeworCXRlbXBieCsrOworCXRlbXBheCA9IHRlbXBieDsKIAl0ZW1wY3grKzsKIAl0ZW1wY3ggLT0gdGVtcGF4OwogCXRlbXBjeCA+Pj0gMjsKQEAgLTY0MDcsOCArNjIyMiw4IEBACiAJdGVtcGN4ICs9IHRlbXBieDsKIAl0ZW1wY3grKzsKICAgICAgfSBlbHNlIHsKLSAgCXRlbXBieCA9IChTaVNfUHItPlNpU19WR0FWVCArIFNpU19Qci0+U2lTX1ZHQVZERSkgPj4gMTsgICAgICAgICAgICAgICAgIC8qICBCVFZHQTJWUlMgICAgIDB4MTAsMHgxMSAgICovCi0gIAl0ZW1wY3ggPSAoKFNpU19Qci0+U2lTX1ZHQVZUIC0gU2lTX1ByLT5TaVNfVkdBVkRFKSA+PiA0KSArIHRlbXBieCArIDE7ICAvKiAgQlRWR0EyVlJFICAgICAweDExICAgICAgICAqLworCXRlbXBieCA9IChTaVNfUHItPlNpU19WR0FWVCArIFNpU19Qci0+U2lTX1ZHQVZERSkgPj4gMTsgICAgICAgICAgICAgICAgIC8qICBCVFZHQTJWUlMgICAgIDB4MTAsMHgxMSAgICovCisJdGVtcGN4ID0gKChTaVNfUHItPlNpU19WR0FWVCAtIFNpU19Qci0+U2lTX1ZHQVZERSkgPj4gNCkgKyB0ZW1wYnggKyAxOyAgLyogIEJUVkdBMlZSRSAgICAgMHgxMSAgICAgICAgKi8KICAgICAgfQogCiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CkBAIC02NDE2LDcgKzYyMzEsNyBAQAogCSAgIHRlbXBieCA9IFNpU19Qci0+Q1ZTeW5jU3RhcnQ7CiAJICAgdGVtcGN4ID0gU2lTX1ByLT5DVlN5bmNFbmQ7CiAJfQotICAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKKwlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9SQU1EQUMpIHsKIAkgICB1bnNpZ25lZCBjaGFyIGNyOCwgY3I3LCBjcjEzOwogCSAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCSAgICAgIGNyOCAgICA9IFNpU19Qci0+Q0NSVDFDUlRDWzhdOwpAQCAtNjQyOSwxMSArNjI0NCwxMSBAQAogCSAgICAgIGNyMTMgICA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzEzXTsKIAkgICAgICB0ZW1wY3ggPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUls5XTsKIAkgICB9Ci0gICAgICAJICAgdGVtcGJ4ID0gY3I4OwotICAgICAgCSAgIGlmKGNyNyAgJiAweDA0KSB0ZW1wYnggfD0gMHgwMTAwOwotICAgICAgCSAgIGlmKGNyNyAgJiAweDgwKSB0ZW1wYnggfD0gMHgwMjAwOwotICAgICAgCSAgIGlmKGNyMTMgJiAweDA4KSB0ZW1wYnggfD0gMHgwNDAwOwotICAgICAgIAl9CisJICAgdGVtcGJ4ID0gY3I4OworCSAgIGlmKGNyNyAgJiAweDA0KSB0ZW1wYnggfD0gMHgwMTAwOworCSAgIGlmKGNyNyAgJiAweDgwKSB0ZW1wYnggfD0gMHgwMjAwOworCSAgIGlmKGNyMTMgJiAweDA4KSB0ZW1wYnggfD0gMHgwNDAwOworCX0KICAgICAgfQogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDEwLHRlbXBieCk7ICAgICAgICAgICAgICAgLyogQ1JUMiBWZXJ0aWNhbCBSZXRyYWNlIFN0YXJ0ICovCiAKQEAgLTY0NDIsMTMgKzYyNTcsMTMgQEAKIAogICAgICAvKiAzLiBQYW5lbCBkZWxheSBjb21wZW5zYXRpb24gKi8KIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgewogCiAjaWZkZWYgU0lTMzAwICAvKiAtLS0tLS0tLS0tIDMwMCBzZXJpZXMgLS0tLS0tLS0tLS0tLS0gKi8KIAogCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU1ZCKSB7CiAJICAgdGVtcCA9IDB4MjA7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzMwMCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMwMCkgewogCSAgICAgIHRlbXAgPSAweDEwOwogCSAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpICB0ZW1wID0gMHgyYzsKIAkgICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgdGVtcCA9IDB4MjA7CkBAIC02NDYwLDI0ICs2Mjc1LDIzIEBACiAJICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF9DdXN0b20pICAgICAgIHRlbXAgPSAweDJjOwogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSAJICAgIHRlbXAgPSAweDA4OwogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7Ci0gICAgICAJICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIAkgICAgdGVtcCA9IDB4MmM7Ci0gICAgICAJICAgICAgZWxzZSAJCQkJCSAgICB0ZW1wID0gMHgyMDsKLSAgICAJICAgfQorCSAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSAJICAgIHRlbXAgPSAweDJjOworCSAgICAgIGVsc2UgCQkJCQkgICAgdGVtcCA9IDB4MjA7CisJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewogCSAgICAgIGlmKFJPTUFkZHJbMHgyMjBdICYgMHg4MCkgewotCSAgICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWTm9ZUGJQckhpVmlzaW9uKQotCSAgIAkgICAgdGVtcCA9IFJPTUFkZHJbMHgyMjFdOworCQkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb1lQYlBySGlWaXNpb24pCisJCSAgICB0ZW1wID0gUk9NQWRkclsweDIyMV07CiAJCSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKQogCQkgICAgdGVtcCA9IFJPTUFkZHJbMHgyMjJdOwogCQkgZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkKIAkJICAgIHRlbXAgPSBST01BZGRyWzB4MjIzXTsKIAkJIGVsc2UKIAkJICAgIHRlbXAgPSBST01BZGRyWzB4MjI0XTsKLQkJIHRlbXAgJj0gMHgzYzsKIAkgICAgICB9CiAJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgIGlmKFNpU19Qci0+UERDICE9IC0xKSAgdGVtcCA9IFNpU19Qci0+UERDICYgMHgzYzsKKwkgICAgICBpZihTaVNfUHItPlBEQyAhPSAtMSkgIHRlbXAgPSBTaVNfUHItPlBEQzsKIAkgICB9CiAKIAl9IGVsc2UgewpAQCAtNjQ4NywxNSArNjMwMSwxNyBAQAogCSAgIH0KIAkgICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKIAkgICAgICBpZihST01BZGRyWzB4MjIwXSAmIDB4ODApIHsKLQkgICAgICAgICB0ZW1wID0gUk9NQWRkclsweDIyMF0gJiAweDNjOworCSAgICAgICAgIHRlbXAgPSBST01BZGRyWzB4MjIwXTsKIAkgICAgICB9CiAJICAgfQogCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewotCSAgICAgIGlmKFNpU19Qci0+UERDICE9IC0xKSB0ZW1wID0gU2lTX1ByLT5QREMgJiAweDNjOworCSAgICAgIGlmKFNpU19Qci0+UERDICE9IC0xKSB0ZW1wID0gU2lTX1ByLT5QREM7CiAJICAgfQotICAgICAgICB9CisJfQogCi0gICAgCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgxMyx+MHgzQyx0ZW1wKTsgICAvKiBQYW5lbCBMaW5rIERlbGF5IENvbXBlbnNhdGlvbjsgKFNvZnR3YXJlIENvbW1hbmQgUmVzZXQ7IFBvd2VyIFNhdmluZykgKi8KKwl0ZW1wICY9IDB4M2M7CisKKwlTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MTMsfjB4M0MsdGVtcCk7ICAgLyogUGFuZWwgTGluayBEZWxheSBDb21wZW5zYXRpb247IChTb2Z0d2FyZSBDb21tYW5kIFJlc2V0OyBQb3dlciBTYXZpbmcpICovCiAKICNlbmRpZiAgLyogU0lTMzAwICovCiAKQEAgLTY1MDMsMTYgKzYzMTksMTYgQEAKIAogI2lmZGVmIFNJUzMxNUggICAvKiAtLS0tLS0tLS0tLS0tLS0gMzE1LzMzMCBzZXJpZXMgLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU182NjEpIHsKKwlpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzY2MSkgewogCiAJICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewogCi0JICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgdGVtcCA9IDB4MDM7Ci0JICAgICAgZWxzZSAJCSAgICAgICAgICAgICAgIHRlbXAgPSAweDAwOworCSAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgdGVtcCA9IDB4MDM7CisJICAgICAgZWxzZSAJCSAgICAgICAgICAgICAgdGVtcCA9IDB4MDA7CiAKIAkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgdGVtcCA9IDB4MGE7CiAJICAgICAgdGVtcGJsID0gMHhGMDsKLQkgICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjUwKSB7CisJICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjUwKSB7CiAJCSBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKIAkJICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpKSB0ZW1wYmwgPSAweDBGOwogCQkgfQpAQCAtNjUzMSwxMCArNjM0NywxMCBAQAogCiAJfSAvKiA8IDY2MSAqLwogCi0gICAgCXRlbXBheCA9IDA7Ci0gICAgCWlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXBheCB8PSAweDgwOwotICAgIAlpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICB0ZW1wYXggfD0gMHg0MDsKLSAgICAJU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJDLDB4M2YsdGVtcGF4KTsKKwl0ZW1wYXggPSAwOworCWlmKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpIHRlbXBheCB8PSAweDgwOworCWlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgICAgIHRlbXBheCB8PSAweDQwOworCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgyQywweDNmLHRlbXBheCk7CiAKICNlbmRpZiAgLyogU0lTMzE1SCAqLwogCkBAIC02NTQ0LDIxICs2MzYwLDIxIEBACiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKICAgICAgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgewotICAgICAgICAvKiBGb3IgMzAxQkRIIHdpdGggTENELCB3ZSBzZXQgdXAgdGhlIFBhbmVsIExpbmsgKi8KLQlTaVNfU2V0R3JvdXAxX0xWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJLyogRm9yIDMwMUJESCB3aXRoIExDRCwgd2Ugc2V0IHVwIHRoZSBQYW5lbCBMaW5rICovCisJU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7Ci0gICAgCVNpU19TZXRHcm91cDFfMzAxKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCVNpU19TZXRHcm91cDFfMzAxKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgfQogICB9IGVsc2UgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7Ci0JU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKwlTaVNfU2V0R3JvdXAxX0xWRFMoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogICAgICB9IGVsc2UgewogCWlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggIT0gMCkgewotICAgICAgICAgICBpZigoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHx8IChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHsKLSAgICAJICAgICAgU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLE1vZGVJZEluZGV4LCBId0luZm8sUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKLSAgICAgICAgICAgfQorCSAgIGlmKCghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgfHwgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgeworCSAgICAgIFNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHIsIE1vZGVObyxNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgIH0KIAl9IGVsc2UgewotCSAgIFNpU19TZXRHcm91cDFfTFZEUyhTaVNfUHIsIE1vZGVObyxNb2RlSWRJbmRleCwgSHdJbmZvLFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJICAgU2lTX1NldEdyb3VwMV9MVkRTKFNpU19QciwgTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJfQogICAgICB9CiAgIH0KQEAgLTY1NjksMTEgKzYzODUsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTSVMzMTVICi1zdGF0aWMgVUNIQVIgKgotU2lTX0dldEdyb3VwMkNMVlhQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHRhYmxldHlwZSwgUFNJU19IV19JTkZPIEh3SW5mbykKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK1NpU19HZXRHcm91cDJDTFZYUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgdGFibGV0eXBlKQogewotICAgY29uc3QgVUNIQVIgICp0YWJsZXB0ciA9IE5VTEw7Ci0gICBVU0hPUlQgICAgICAgYSwgYiwgcCA9IDA7CisgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZXB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCAgICAgIGEsIGIsIHAgPSAwOwogCiAgICBhID0gU2lTX1ByLT5TaVNfVkdBSERFOwogICAgYiA9IFNpU19Qci0+U2lTX0hERTsKQEAgLTY2MDYsMjUgKzY0MjIsMjUgQEAKICAgICAgIGlmKCh0YWJsZXB0cltwXSB8IHRhYmxlcHRyW3ArMV0gPDwgOCkgPT0gMHhmZmZmKSBwIC09IDB4NDI7CiAgICB9CiAgICBwICs9IDI7Ci0gICByZXR1cm4oKFVDSEFSICopJnRhYmxlcHRyW3BdKTsKKyAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIgKikmdGFibGVwdHJbcF0pOwogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMl9DX0VMVihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0JICAgICAgCSAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldEdyb3VwMl9DX0VMVihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkgICAgICAJICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKLSAgIFVDSEFSICp0YWJsZXB0cjsKKyAgIHVuc2lnbmVkIGNoYXIgKnRhYmxlcHRyOworICAgdW5zaWduZWQgY2hhciB0ZW1wOwogICAgaW50IGksIGo7Ci0gICBVQ0hBUiB0ZW1wOwogCi0gICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAyRUxWKSkpIHJldHVybjsKKyAgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVEFQNFNDQUxFUikpIHJldHVybjsKIAotICAgdGFibGVwdHIgPSBTaVNfR2V0R3JvdXAyQ0xWWFB0cihTaVNfUHIsIDAsIEh3SW5mbyk7CisgICB0YWJsZXB0ciA9IFNpU19HZXRHcm91cDJDTFZYUHRyKFNpU19QciwgMCk7CiAgICBmb3IoaSA9IDB4ODAsIGogPSAwOyBpIDw9IDB4YmY7IGkrKywgaisrKSB7CiAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwgaSwgdGFibGVwdHJbal0pOwogICAgfQogICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLSAgICAgIHRhYmxlcHRyID0gU2lTX0dldEdyb3VwMkNMVlhQdHIoU2lTX1ByLCAxLCBId0luZm8pOworICAgICAgdGFibGVwdHIgPSBTaVNfR2V0R3JvdXAyQ0xWWFB0cihTaVNfUHIsIDEpOwogICAgICAgZm9yKGkgPSAweGMwLCBqID0gMDsgaSA8PSAweGZmOyBpKyssIGorKykgewogICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsIGksIHRhYmxlcHRyW2pdKTsKICAgICAgIH0KQEAgLTY2MzUsMTIgKzY0NTEsMTIgQEAKIH0KIAogc3RhdGljIEJPT0xFQU4KLVNpU19HZXRDUlQyUGFydDJQdHIoU2lTX1ByaXZhdGUgKlNpU19QcixVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwKLQkJICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsVVNIT1JUICpDUlQySW5kZXgsCi0JCSAgICBVU0hPUlQgKlJlc0luZGV4LFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfR2V0Q1JUMlBhcnQyUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLHVuc2lnbmVkIHNob3J0IE1vZGVObyx1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCx1bnNpZ25lZCBzaG9ydCAqQ1JUMkluZGV4LAorCQkgICAgdW5zaWduZWQgc2hvcnQgKlJlc0luZGV4KQogewogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHJldHVybiBGQUxTRTsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMTVIKSByZXR1cm4gRkFMU0U7CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpCiAgICAgICgqUmVzSW5kZXgpID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKQEAgLTY2NjEsODIgKzY0NzcsNzkgQEAKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpICgqQ1JUMkluZGV4KSA9IDIwNjsKICAgICAgfQogICB9Ci0gIHJldHVybigoKCpDUlQySW5kZXgpICE9IDApKTsKKyAgcmV0dXJuICgoKCpDUlQySW5kZXgpICE9IDApKTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU0lTMzAwCiBzdGF0aWMgdm9pZAotU2lTX0dyb3VwMkxDRFNwZWNpYWwoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIE1vZGVObywgVVNIT1JUIGNydDJjcnRjKQorU2lTX0dyb3VwMkxDRFNwZWNpYWwoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgY3J0MmNydGMpCiB7Ci0gICBVU0hPUlQgdGVtcGN4OwotICAgY29uc3QgVUNIQVIgYXRhYmxlW10gPSB7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wY3g7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhdGFibGVbXSA9IHsKICAgICAgICAweGMzLDB4OWUsMHhjMywweDllLDB4MDIsMHgwMiwweDAyLAogICAgICAgIDB4YWIsMHg4NywweGFiLDB4OWUsMHhlNywweDAyLDB4MDIKICAgIH07CiAKICAgIGlmKCFTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHsKLSAgICAgIGlmKCAoICggKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182MzApIHx8Ci0gICAgICAgICAgICAgIChId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzMwKSApICYmCi0gICAgICAgICAgICAoSHdJbmZvLT5qQ2hpcFJldmlzaW9uID4gMikgKSAgJiYKLSAgICAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgJiYKLSAgICAgICAgICAoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpICAmJgotICAgICAgICAgICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgKSB7Ci0gICAgICAgICBpZihNb2RlTm8gPT0gMHgxMykgewotICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCwweEI5KTsKLSAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHhDQyk7Ci0gICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDA2LDB4QTYpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKChjcnQyY3J0YyAmIDB4M0YpID09IDQpIHsKLSAgICAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyQik7Ci0gICAgICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4MTMpOwotICAgICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCwweEU1KTsKLSAgICAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHgwOCk7Ci0gICAgICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDA2LDB4RTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQorICAgICAgaWYoICggKCAoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjMwKSB8fAorCSAgICAgIChTaVNfUHItPkNoaXBUeXBlID09IFNJU183MzApICkgJiYKKwkgICAgKFNpU19Qci0+Q2hpcFJldmlzaW9uID4gMikgKSAgJiYKKwkgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEwMjR4NzY4KSAmJgorCSAgKCEoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExDRFZFU0FUaW1pbmcpKSAgJiYKKwkgICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSkgKSB7CisJIGlmKE1vZGVObyA9PSAweDEzKSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDQsMHhCOSk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHhDQyk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDYsMHhBNik7CisJIH0gZWxzZSBpZigoY3J0MmNydGMgJiAweDNGKSA9PSA0KSB7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyQik7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDIsMHgxMyk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDQsMHhFNSk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDUsMHgwOCk7CisJICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDYsMHhFMik7CisJIH0KICAgICAgIH0KIAotICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkgewotICAgICAgICAgaWYoU2lTX1ByLT5TaVNfTENEVHlwZUluZm8gPT0gMHgwYykgewotICAgICAgICAgICAgY3J0MmNydGMgJj0gMHgxZjsKLSAgICAgICAgICAgIHRlbXBjeCA9IDA7Ci0gICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldE5vdFNpbXVNb2RlKSkgewotICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgIHRlbXBjeCArPSA3OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcGN4ICs9IGNydDJjcnRjOwotICAgICAgICAgICAgaWYoY3J0MmNydGMgPj0gNCkgewotICAgICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNiwweGZmKTsKLSAgICAgICAgICAgIH0KKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkgeworCSBpZihTaVNfUHItPlNpU19MQ0RUeXBlSW5mbyA9PSAweDBjKSB7CisJICAgIGNydDJjcnRjICY9IDB4MWY7CisJICAgIHRlbXBjeCA9IDA7CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Tm90U2ltdU1vZGUpKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJCSAgdGVtcGN4ICs9IDc7CisJICAgICAgIH0KKwkgICAgfQorCSAgICB0ZW1wY3ggKz0gY3J0MmNydGM7CisJICAgIGlmKGNydDJjcnRjID49IDQpIHsKKwkgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNiwweGZmKTsKKwkgICAgfQogCi0gICAgICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldE5vdFNpbXVNb2RlKSkgewotICAgICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgIGlmKGNydDJjcnRjID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyOCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4MTgpOwotICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCxhdGFibGVbdGVtcGN4XSk7Ci0gICAgICAgICB9CisJICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Tm90U2ltdU1vZGUpKSB7CisJICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB7CisJCSAgaWYoY3J0MmNydGMgPT0gNCkgeworCQkgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHgyOCk7CisJCSAgfQorCSAgICAgICB9CisJICAgIH0KKwkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMiwweDE4KTsKKwkgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCxhdGFibGVbdGVtcGN4XSk7CisJIH0KICAgICAgIH0KICAgIH0KIH0KIAogLyogRm9yIEVDUyBBOTA3LiBIaWdobHkgcHJlbGltaW5hcnkuICovCiBzdGF0aWMgdm9pZAotU2lTX1NldDMwMFBhcnQyUmVncyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgIAkJICAgIFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJICAgIFVTSE9SVCBNb2RlTm8pCitTaVNfU2V0MzAwUGFydDJSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVU0hPUlQgY3J0MmNydGMsIHJlc2luZGV4OwotICBpbnQgICAgaSxqOwotICBjb25zdCAgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqQ1JUMlBhcnQyUHRyID0gTlVMTDsKKyAgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgKkNSVDJQYXJ0MlB0ciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IGNydDJjcnRjLCByZXNpbmRleDsKKyAgaW50IGksIGo7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzMwMCkgcmV0dXJuOwotICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikpIHJldHVybjsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSAhPSBTSVNfMzAwKSByZXR1cm47CisgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSkgcmV0dXJuOwogICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpIHJldHVybjsKIAogICBpZihNb2RlTm8gPD0gMHgxMykgewpAQCAtNjc1OCwxMyArNjU3MSwxMyBAQAogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDEsMHg4MCwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbMF0pOwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDIsMHg4MCwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbMV0pOwogICBmb3IoaSA9IDIsIGogPSAweDA0OyBqIDw9IDB4MDY7IGkrKywgaisrICkgewotICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxqLChDUlQyUGFydDJQdHIrcmVzaW5kZXgpLT5DUltpXSk7CisgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGosKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSW2ldKTsKICAgfQogICBmb3IoaiA9IDB4MWM7IGogPD0gMHgxZDsgaSsrLCBqKysgKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGosKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSW2ldKTsKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaiwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbaV0pOwogICB9CiAgIGZvcihqID0gMHgxZjsgaiA8PSAweDIxOyBpKyssIGorKyApIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaiwoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbaV0pOworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxqLChDUlQyUGFydDJQdHIrcmVzaW5kZXgpLT5DUltpXSk7CiAgIH0KICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMywoQ1JUMlBhcnQyUHRyK3Jlc2luZGV4KS0+Q1JbMTBdKTsKICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDI1LDB4MGYsKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSWzExXSk7CkBAIC02NzcyLDE1ICs2NTg1LDE1IEBACiAjZW5kaWYKIAogc3RhdGljIHZvaWQKLVNpU19TZXRUVlNwZWNpYWwoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObykKK1NpU19TZXRUVlNwZWNpYWwoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpKSByZXR1cm47CisgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSkgcmV0dXJuOwogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWTm9IaVZpc2lvbikpIHJldHVybjsKICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSByZXR1cm47CiAKICAgaWYoIShTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgewotICAgICAgICBjb25zdCBVQ0hBUiBzcGVjaWFsdHZbXSA9IHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBzcGVjaWFsdHZbXSA9IHsKIAkJMHhhNywweDA3LDB4ZjIsMHg2ZSwweDE3LDB4OGIsMHg3MywweDUzLAogCQkweDEzLDB4NDAsMHgzNCwweGY0LDB4NjMsMHhiYiwweGNjLDB4N2EsCiAJCTB4NTgsMHhlNCwweDczLDB4ZGEsMHgxMwpAQCAtNjgxMywxNiArNjYyNiwxNiBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMl9UYWlsKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8pCitTaVNfU2V0R3JvdXAyX1RhaWwoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKLSAgVVNIT1JUIHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IHRlbXA7CiAKICAgaWYoIShTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfVkdBVkRFID09IDUyNSkgewogCXRlbXAgPSAweGMzOwogCWlmKFNpU19Qci0+U2lTX01vZGVUeXBlIDw9IE1vZGVWR0EpIHsKIAkgICB0ZW1wKys7Ci0JICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB0ZW1wICs9IDI7CisJICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB0ZW1wICs9IDI7CiAJfQogCVNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MmYsdGVtcCk7CiAJU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgzMCwweGIzKTsKQEAgLTY4MzAsNyArNjY0Myw3IEBACiAJdGVtcCA9IDB4NGQ7CiAJaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPD0gTW9kZVZHQSkgewogCSAgIHRlbXArKzsKLQkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHRlbXArKzsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHRlbXArKzsKIAl9CiAJU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyZix0ZW1wKTsKICAgICAgfQpAQCAtNjgzOCw3ICs2NjUxLDcgQEAKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHsKLQlpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCMzAyQikgeworCWlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEIpIHsKIAkgICBTaVNfU2V0UmVnT1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWEsMHgwMyk7CiAJICAgLyogTm90IGFsd2F5cyBmb3IgTFYsIHNlZSBTZXRHcnAyICovCiAJfQpAQCAtNjg3MiwxNyArNjY4NSwxNyBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldEdyb3VwMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVU0hPUlQgICAgICBpLCBqLCB0ZW1wYXgsIHRlbXBieCwgdGVtcGN4LCB0ZW1wY2gsIHRlbXBjbCwgdGVtcDsKLSAgVVNIT1JUICAgICAgcHVzaDIsIG1vZGVmbGFnLCBjcnQyY3J0YywgYnJpZGdlb2Zmc2V0OwotICBVTE9ORyAgICAgICBsb25ndGVtcDsKLSAgY29uc3QgICAgICAgVUNIQVIgKlBoYXNlUG9pbnQ7Ci0gIGNvbnN0ICAgICAgIFVDSEFSICpUaW1pbmdQb2ludDsKKyAgdW5zaWduZWQgc2hvcnQgaSwgaiwgdGVtcGF4LCB0ZW1wYngsIHRlbXBjeCwgdGVtcGNoLCB0ZW1wY2wsIHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IHB1c2gyLCBtb2RlZmxhZywgY3J0MmNydGMsIGJyaWRnZW9mZnNldDsKKyAgdW5zaWduZWQgaW50ICAgbG9uZ3RlbXAsIFBoYXNlSW5kZXg7CisgIEJPT0xFQU4gICAgICAgIG5ld3R2cGhhc2U7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlRpbWluZ1BvaW50OwogI2lmZGVmIFNJUzMxNUgKLSAgVVNIT1JUICAgICAgcmVzaW5kZXgsIENSVDJJbmRleDsKLSAgY29uc3QgICAgICAgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqQ1JUMlBhcnQyUHRyID0gTlVMTDsKKyAgdW5zaWduZWQgc2hvcnQgcmVzaW5kZXgsIENSVDJJbmRleDsKKyAgY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgKkNSVDJQYXJ0MlB0ciA9IE5VTEw7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgcmV0dXJuOwogI2VuZGlmCkBAIC02OTA4LDkgKzY3MjEsMTYgQEAKIAogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAwLHRlbXApOwogCi0gIFBoYXNlUG9pbnQgID0gU2lTX1ByLT5TaVNfUEFMUGhhc2U7CisgIFBoYXNlSW5kZXggID0gMHgwMTsgLyogU2lTX1BBTFBoYXNlICovCiAgIFRpbWluZ1BvaW50ID0gU2lTX1ByLT5TaVNfUEFMVGltaW5nOwogCisgIG5ld3R2cGhhc2UgPSBGQUxTRTsKKyAgaWYoIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpICYmCisgICAgICAoICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgfHwKKwkoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSApICkgeworICAgICBuZXd0dnBoYXNlID0gVFJVRTsKKyAgfQorCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB7CiAKICAgICAgVGltaW5nUG9pbnQgPSBTaVNfUHItPlNpU19IaVRWRXh0VGltaW5nOwpAQCAtNjkxOCw4MiArNjczOCw1NCBAQAogICAgICAgICBUaW1pbmdQb2ludCA9IFNpU19Qci0+U2lTX0hpVFZTdDJUaW1pbmc7CiAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgewogCSAgIFRpbWluZ1BvaW50ID0gU2lTX1ByLT5TaVNfSGlUVlN0MVRpbWluZzsKLSNpZiAwCi0gICAgICAgICAgIGlmKCEobW9kZWZsYWcgJiBDaGFyeDhEb3QpKSAgVGltaW5nUG9pbnQgPSBTaVNfUHItPlNpU19IaVRWVGV4dFRpbWluZzsKLSNlbmRpZgogICAgICAgICB9CiAgICAgIH0KIAogICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKIAotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgICAgICBUaW1pbmdQb2ludCA9ICZTaVNfWVBiUHJUYWJsZVsyXVswXTsKLSAgICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgVGltaW5nUG9pbnQgPSAmU2lTX1lQYlByVGFibGVbMV1bMF07Ci0gICAgIGVsc2UJCQkJCSAgVGltaW5nUG9pbnQgPSAmU2lTX1lQYlByVGFibGVbMF1bMF07CisgICAgIGkgPSAwOworICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgICAgICBpID0gMjsKKyAgICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgaSA9IDE7CiAKLSAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX05UU0NQaGFzZTsKKyAgICAgVGltaW5nUG9pbnQgPSAmU2lTX1lQYlByVGFibGVbaV1bMF07CisKKyAgICAgUGhhc2VJbmRleCA9IDB4MDA7IC8qIFNpU19OVFNDUGhhc2UgKi8KIAogICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKIAotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLSAgICAgICAgICggKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB8fAotCSAgIChTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFRWU2ltdU1vZGUpICkgKSB7Ci0gICAgICAgIFBoYXNlUG9pbnQgPSBTaVNfUHItPlNpU19QQUxQaGFzZTI7Ci0gICAgIH0KKyAgICAgaWYobmV3dHZwaGFzZSkgUGhhc2VJbmRleCA9IDB4MDk7IC8qIFNpU19QQUxQaGFzZTIgKi8KIAogICB9IGVsc2UgewogCiAgICAgIFRpbWluZ1BvaW50ID0gU2lTX1ByLT5TaVNfTlRTQ1RpbWluZzsKLSAgICAgUGhhc2VQb2ludCAgPSBTaVNfUHItPlNpU19OVFNDUGhhc2U7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opIHsKLQlQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMUGhhc2U7Ci0gICAgIH0KLQotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLQkgKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8Ci0JICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgKSApIHsKLSAgICAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX05UU0NQaGFzZTI7Ci0JaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDSikgewotCSAgIFBoYXNlUG9pbnQgPSBTaVNfUHItPlNpU19QQUxQaGFzZTI7Ci0JfQotICAgICB9CisgICAgIFBoYXNlSW5kZXggID0gKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opID8gMHgwMSA6IDB4MDA7CS8qIFNpU19QQUxQaGFzZSA6IFNpU19OVFNDUGhhc2UgKi8KKyAgICAgaWYobmV3dHZwaGFzZSkgUGhhc2VJbmRleCArPSA4OwkJCQkJLyogU2lTX1BBTFBoYXNlMiA6IFNpU19OVFNDUGhhc2UyICovCiAKICAgfQogCi0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgewotICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMTVBoYXNlOwotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLQkgKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8Ci0JICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgKSApIHsKLSAgICAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX1BBTE1QaGFzZTI7Ci0gICAgIH0KLSAgfQotCi0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgewotICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMTlBoYXNlOwotICAgICBpZiggKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgJiYKLQkgKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8Ci0JICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkgKSApIHsKLQlQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfUEFMTlBoYXNlMjsKLSAgICAgfQorICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRQQUxNIHwgVFZTZXRQQUxOKSkgeworICAgICBQaGFzZUluZGV4ID0gKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgPyAweDAyIDogMHgwMzsJLyogU2lTX1BBTE1QaGFzZSA6IFNpU19QQUxOUGhhc2UgKi8KKyAgICAgaWYobmV3dHZwaGFzZSkgUGhhc2VJbmRleCArPSA4OwkJCQkJLyogU2lTX1BBTE1QaGFzZTIgOiBTaVNfUEFMTlBoYXNlMiAqLwogICB9CiAKICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgewotICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlOwogICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTE0pIHsKLSAgICAgICAgUGhhc2VQb2ludCA9IFNpU19Qci0+U2lTX1NwZWNpYWxQaGFzZU07CisgICAgICAgIFBoYXNlSW5kZXggPSAweDA1OyAvKiBTaVNfU3BlY2lhbFBoYXNlTSAqLwogICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDSikgewotICAgICAgICBQaGFzZVBvaW50ID0gU2lTX1ByLT5TaVNfU3BlY2lhbFBoYXNlSjsKKyAgICAgICAgUGhhc2VJbmRleCA9IDB4MTE7IC8qIFNpU19TcGVjaWFsUGhhc2VKICovCisgICAgIH0gZWxzZSB7CisgICAgICAgIFBoYXNlSW5kZXggPSAweDEwOyAvKiBTaVNfU3BlY2lhbFBoYXNlICovCiAgICAgIH0KICAgfQogCi0gIGZvcihpPTB4MzEsIGo9MDsgaTw9MHgzNDsgaSsrLCBqKyspIHsKLSAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxQaGFzZVBvaW50W2pdKTsKKyAgZm9yKGkgPSAweDMxLCBqID0gMDsgaSA8PSAweDM0OyBpKyssIGorKykgeworICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxpLFNpU19UVlBoYXNlWyhQaGFzZUluZGV4ICogNCkgKyBqXSk7CiAgIH0KIAotICBmb3IoaT0weDAxLCBqPTA7IGk8PTB4MkQ7IGkrKywgaisrKSB7CisgIGZvcihpID0gMHgwMSwgaiA9IDA7IGkgPD0gMHgyRDsgaSsrLCBqKyspIHsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxUaW1pbmdQb2ludFtqXSk7CiAgIH0KLSAgZm9yKGk9MHgzOTsgaTw9MHg0NTsgaSsrLCBqKyspIHsKKyAgZm9yKGkgPSAweDM5OyBpIDw9IDB4NDU7IGkrKywgaisrKSB7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksVGltaW5nUG9pbnRbal0pOwogICB9CiAKQEAgLTcwMTAsMjggKzY4MDIsMzIgQEAKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgzNyxTaVNfUHItPlNpU19SWTNDT0UpOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDM4LFNpU19Qci0+U2lTX1JZNENPRSk7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIAl0ZW1wYXggPSA5NTA7Ci0gIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICAgICAgCXRlbXBheCA9IDUyMDsKLSAgZWxzZSAJCQkgICAgICAgICAgICAJCXRlbXBheCA9IDQ0MDsgLyogTlRTQywgWVBiUHIgNTI1LCA3NTAgKi8KKyAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pCXRlbXBheCA9IDk1MDsKKyAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNzUwcCkgIHRlbXBheCA9IDY4MDsKKyAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFBBTCkJdGVtcGF4ID0gNTIwOworICBlbHNlCQkJCQkJdGVtcGF4ID0gNDQwOyAvKiBOVFNDLCBZUGJQciA1MjUgKi8KIAotICBpZiggKCAoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVk5vSGlWaXNpb24pKSAmJiAoU2lTX1ByLT5TaVNfVkRFIDw9IHRlbXBheCkgKSB8fAorICBpZiggKChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgJiYgKFNpU19Qci0+U2lTX1ZERSA8PSB0ZW1wYXgpKSB8fAogICAgICAgKCAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb0hpVmlzaW9uKSAmJgogICAgICAgICAoKFNpU19Qci0+U2lTX1ZHQUhERSA9PSAxMDI0KSB8fCAoU2lTX1ByLT5TaVNfVkRFIDw9IHRlbXBheCkpICkgKSB7CiAKICAgICAgdGVtcGF4IC09IFNpU19Qci0+U2lTX1ZERTsKLSAgICAgdGVtcGF4ID4+PSAyOworICAgICB0ZW1wYXggPj49IDE7CisgICAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSkgeworICAgICAgICB0ZW1wYXggPj49IDE7CisgICAgIH0KICAgICAgdGVtcGF4ICY9IDB4MDBmZjsKIAotICAgICB0ZW1wID0gdGVtcGF4ICsgKFVTSE9SVClUaW1pbmdQb2ludFswXTsKKyAgICAgdGVtcCA9IHRlbXBheCArICh1bnNpZ25lZCBzaG9ydClUaW1pbmdQb2ludFswXTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMSx0ZW1wKTsKIAotICAgICB0ZW1wID0gdGVtcGF4ICsgKFVTSE9SVClUaW1pbmdQb2ludFsxXTsKKyAgICAgdGVtcCA9IHRlbXBheCArICh1bnNpZ25lZCBzaG9ydClUaW1pbmdQb2ludFsxXTsKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMix0ZW1wKTsKIAogICAgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb1lQYlBySGlWaXNpb24pICYmIChTaVNfUHItPlNpU19WR0FIREUgPj0gMTAyNCkpIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKLSAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwMSwweDFiKTsgIC8qIDE5ICovCi0gICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MDIsMHg1NCk7ICAvKiA1MiAqLworICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLDB4MWIpOworICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4NTQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLDB4MTcpOwogICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAyLDB4MWQpOwpAQCAtNzA0MSwxNCArNjgzNywxNCBAQAogICB9CiAKICAgdGVtcGN4ID0gU2lTX1ByLT5TaVNfSFQ7Ci0gIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGN4ID4+PSAxOworICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wY3ggPj49IDE7CiAgIHRlbXBjeC0tOwotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHRlbXBjeC0tOworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHRlbXBjeC0tOwogICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFCLHRlbXBjeCk7CiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgxRCwweEYwLCgodGVtcGN4ID4+IDgpICYgMHgwZikpOwogCiAgIHRlbXBjeCA9IFNpU19Qci0+U2lTX0hUID4+IDE7Ci0gIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGN4ID4+PSAxOworICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wY3ggPj49IDE7CiAgIHRlbXBjeCArPSA3OwogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgdGVtcGN4IC09IDQ7CiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMiwweDBGLCgodGVtcGN4IDw8IDQpICYgMHhmMCkpOwpAQCAtNzA3NSw3ICs2ODcxLDcgQEAKICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDJBLDB4MEYsKCh0ZW1wY3ggPDwgNCkgJiAweGYwKSk7CiAKICAgdGVtcGN4ID0gU2lTX1ByLT5TaVNfSFQgPj4gMTsKLSAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wY3ggPj49IDE7CisgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHRlbXBjeCA+Pj0gMTsKICAgaiArPSAyOwogICB0ZW1wY3ggLT0gKFRpbWluZ1BvaW50W2pdIHwgKChUaW1pbmdQb2ludFtqKzFdKSA8PCA4KSk7CiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyRCwweDBGLCgodGVtcGN4IDw8IDQpICYgMHhmMCkpOwpAQCAtNzA5NCw3ICs2ODkwLDcgQEAKICAgfSBlbHNlIGlmKCAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpICYmCiAgICAgICAgICAgICAgKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwfFRWU2V0WVBiUHI3NTBwKSkpICkgewogICAgICB0ZW1wYnggPj49IDE7Ci0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSB7CiAJICAgaWYoKE1vZGVObyA8PSAweDEzKSAmJiAoY3J0MmNydGMgPT0gMSkpIHRlbXBieCsrOwogCX0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewpAQCAtNzEyMywyMyArNjkxOSwxMSBAQAogICB9CiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MzAsdGVtcCk7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUEFSVDRPVkVSRkxPVykgewogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MTAsMHhkZiwoKHRlbXBieCAmIDB4MDQwMCkgPj4gNSkpOwogICB9CiAKLSNpZiAwCi0gIC8qIFRFU1QgcXFxcSAqLwotICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkgewotICAgICBmb3IoaT0weDAxLCBqPTA7IGk8PTB4MkQ7IGkrKywgaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksVGltaW5nUG9pbnRbal0pOwotICAgICB9Ci0gICAgIGZvcihpPTB4Mzk7IGk8PTB4NDU7IGkrKywgaisrKSB7Ci0gICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksVGltaW5nUG9pbnRbal0pOwotICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkRFOwogICAgICBpZiggKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSAmJgogICAgICAgICAgKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSkgKSB7CkBAIC03MTUwLDcgKzY5MzQsNyBAQAogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQ2LHRlbXApOwogICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQ3LHRlbXBieCk7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTUEFSVDRPVkVSRkxPVykgewogCVNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxMCwweGJmLCgodGVtcGJ4ICYgMHgwNDAwKSA+PiA0KSk7CiAgICAgIH0KICAgfQpAQCAtNzE2NSwxNCArNjk0OSwxNyBAQAogCiAgIHRlbXBjaCA9IHRlbXBjbCA9IDB4MDE7CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZHQUhERSA+PSAxMDI0KSB7Ci0gICAgICAgIGlmKCghKG1vZGVmbGFnICYgSGFsZkRDTEspKSB8fCAoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzE1SCkpIHsKLSAgICAgICAgICAgdGVtcGNoID0gMHgxOTsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkdBSERFID49IDk2MCkgeworICAgICAgICBpZigoIShtb2RlZmxhZyAmIEhhbGZEQ0xLKSkgfHwgKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzE1SCkpIHsKIAkgICB0ZW1wY2wgPSAweDIwOwotICAgICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gMTI4MCkgewotICAgICAgICAgICAgICB0ZW1wY2ggPSAweDE0OworCSAgIGlmKFNpU19Qci0+U2lTX1ZHQUhERSA+PSAxMjgwKSB7CisgICAgICAgICAgICAgIHRlbXBjaCA9IDIwOwogICAgICAgICAgICAgICB0ZW1wYnggJj0gfjB4MjA7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZHQUhERSA+PSAxMDI0KSB7CisgICAgICAgICAgICAgIHRlbXBjaCA9IDI1OworICAgICAgICAgICB9IGVsc2UgeworCSAgICAgIHRlbXBjaCA9IDI1OyAvKiBPSyAqLworCSAgIH0KICAgICAgICAgfQogICAgICB9CiAgIH0KQEAgLTcxODAsNyArNjk2Nyw3IEBACiAgIGlmKCEodGVtcGJ4ICYgMHgyMCkpIHsKICAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGNsIDw8PSAxOwogICAgICBsb25ndGVtcCA9ICgoU2lTX1ByLT5TaVNfVkdBSERFICogdGVtcGNoKSAvIHRlbXBjbCkgPDwgMTM7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgbG9uZ3RlbXAgPDw9IDM7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgbG9uZ3RlbXAgPDw9IDM7CiAgICAgIHRlbXBheCA9IGxvbmd0ZW1wIC8gU2lTX1ByLT5TaVNfSERFOwogICAgICBpZihsb25ndGVtcCAlIFNpU19Qci0+U2lTX0hERSkgdGVtcGF4Kys7CiAgICAgIHRlbXBieCB8PSAoKHRlbXBheCA+PiA4KSAmIDB4MUYpOwpAQCAtNzE5MCw3ICs2OTc3LDcgQEAKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHg0NCx0ZW1wYXgpOwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4NDUsMHhDMCx0ZW1wYngpOwogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKIAogICAgICB0ZW1wY3ggJj0gMHgwNzsKICAgICAgaWYodGVtcGJ4ICYgMHgyMCkgdGVtcGN4ID0gMDsKQEAgLTcyMTksNyArNzAwNiw3IEBACiAKICAgICAgU2lTX1NldFRWU3BlY2lhbChTaVNfUHIsIE1vZGVObyk7CiAKLSAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQykgeworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhDTFYpIHsKICAgICAgICAgdGVtcCA9IDA7CiAgICAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkgdGVtcCA9IDg7CiAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHg0ZSwweGY3LHRlbXApOwpAQCAtNzI0Niw3ICs3MDMzLDcgQEAKICAgLyogRnJvbSBoZXJlOiBQYXJ0MiBMQ0Qgc2V0dXAgKi8KIAogICB0ZW1wYnggPSBTaVNfUHItPlNpU19IREU7Ci0gIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGJ4ID4+PSAxOworICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wYnggPj49IDE7CiAgIHRlbXBieC0tOwkJCSAgICAgICAgIAkvKiBSSEFDVEUgPSBIREUgLSAxICovCiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MkMsdGVtcGJ4KTsKICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDJCLDB4MEYsKCh0ZW1wYnggPj4gNCkgJiAweGYwKSk7CkBAIC03MjU2LDEwICs3MDQzLDggQEAKICAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZUVHQSkgewogICAgICAgICBpZihTaVNfUHItPlNpU19WR0FIREUgPj0gMTAyNCkgewogICAgICAgICAgICB0ZW1wID0gMHgwMjsKLQkgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotICAgICAgICAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTENEVkVTQVRpbWluZykgewotICAgICAgICAgICAgICAgICB0ZW1wID0gMHgwMTsKLQkgICAgICB9CisgICAgICAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMQ0RWRVNBVGltaW5nKSB7CisgICAgICAgICAgICAgIHRlbXAgPSAweDAxOwogCSAgIH0KICAgICAgICAgfQogICAgICB9CkBAIC03Mjg5LDExICs3MDc0LDExIEBACiAKICNpZmRlZiBTSVMzMTVICiAgIGlmKFNpU19HZXRDUlQyUGFydDJQdHIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSZDUlQySW5kZXgsICZyZXNpbmRleCwgSHdJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkmQ1JUMkluZGV4LCAmcmVzaW5kZXgpKSB7CiAgICAgICBzd2l0Y2goQ1JUMkluZGV4KSB7CisgICAgICAgIGNhc2UgMjA2OiBDUlQyUGFydDJQdHIgPSBTaVMzMTBfQ1JUMlBhcnQyX0FzdXMxMDI0eDc2OF8zOyAgICBicmVhazsKKwlkZWZhdWx0OgogICAgICAgICBjYXNlIDIwMDogQ1JUMlBhcnQyUHRyID0gU2lTX1ByLT5TaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzE7ICAgYnJlYWs7Ci0JY2FzZSAyMDY6IENSVDJQYXJ0MlB0ciA9IFNpUzMxMF9DUlQyUGFydDJfQXN1czEwMjR4NzY4XzM7ICAgIGJyZWFrOwotCWRlZmF1bHQ6ICBDUlQyUGFydDJQdHIgPSBTaVNfUHItPlNpU19DUlQyUGFydDJfMTAyNHg3NjhfMzsgICBicmVhazsKICAgICAgIH0KIAogICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLDB4ODAsKENSVDJQYXJ0MlB0cityZXNpbmRleCktPkNSWzBdKTsKQEAgLTczMTIsNyArNzA5Nyw2IEBACiAKICAgICAgIFNpU19TZXRHcm91cDJfVGFpbChTaVNfUHIsIE1vZGVObyk7CiAKLQogICB9IGVsc2UgewogI2VuZGlmCiAKQEAgLTczNDksOSArNzEzMywxMSBAQAogCiAgICAgLyogTm9uLWV4cGFuZGluZzogbGNkdmRlcyA9IHRlbXBjeCA9IFZULTE7IGxjZHZkZWUgPSB0ZW1wYnggPSBWREUtMSAqLwogCisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmZGVmIFRXREVCVUcKICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgImxjZHZkZXMgMHgleCBsY2R2ZGVlIDB4JXhcbiIsIHRlbXBjeCwgdGVtcGJ4KTsKICNlbmRpZgorI2VuZGlmCiAKICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDA1LHRlbXBjeCk7CS8qIGxjZHZkZXMgICovCiAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNix0ZW1wYngpOwkvKiBsY2R2ZGVlICAqLwpAQCAtNzQwMSw5ICs3MTg3LDExIEBACiAgICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5DVlN5bmNTdGFydDsKICAgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAibGNkdnJzIDB4JXhcbiIsIHRlbXBieCk7CiAjZW5kaWYKKyNlbmRpZgogCiAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgwNCx0ZW1wYngpOwkgICAgLyogbGNkdnJzICovCiAKQEAgLTc0MTYsMjYgKzcyMDQsMzAgQEAKICAgICAgICB0ZW1wIHw9IChTaVNfUHItPkNWU3luY0VuZCAmIDB4MGYpOwogICAgIH0KIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJsY2R2cmVbMzowXSAweCV4XG4iLCAodGVtcCAmIDB4MGYpKTsKICNlbmRpZgorI2VuZGlmCiAKICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDAxLHRlbXApOwogCiAjaWZkZWYgU0lTMzAwCi0gICAgU2lTX0dyb3VwMkxDRFNwZWNpYWwoU2lTX1ByLCBId0luZm8sIE1vZGVObywgY3J0MmNydGMpOworICAgIFNpU19Hcm91cDJMQ0RTcGVjaWFsKFNpU19QciwgTW9kZU5vLCBjcnQyY3J0Yyk7CiAjZW5kaWYKIAogICAgIGJyaWRnZW9mZnNldCA9IDc7Ci0gICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSAgICAgICAgICBicmlkZ2VvZmZzZXQgKz0gMjsKLSAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxQyB8IFZCX1NJUzMwMkVMVikpIGJyaWRnZW9mZnNldCsrOwotICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgICAgICAgIAkJIGJyaWRnZW9mZnNldCsrOworICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikJYnJpZGdlb2Zmc2V0ICs9IDI7CisgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4Q0xWKQlicmlkZ2VvZmZzZXQgKz0gMjsgLyogT0sgZm9yIEF2ZXJhdGVjIDEyODB4ODAwICgzMDFDKSAqLworICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpCQkJYnJpZGdlb2Zmc2V0Kys7CisgICAgZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDJMVikJYnJpZGdlb2Zmc2V0Kys7ICAgIC8qIE9LIGZvciBBc3VzIEE0TCAxMjgweDgwMCAqLworICAgIC8qIEhpZ2hlciBicmlkZ2VvZmZzZXQgc2hpZnRzIHRvIHRoZSBMRUZUICovCiAKICAgICB0ZW1wID0gMDsKICAgICBpZigoU2lTX1ByLT5TaVNfTENESW5mbyAmIERvbnRFeHBhbmRMQ0QpICYmICghKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpKSkgewogICAgICAgIGlmKFNpU19Qci0+UGFuZWxYUmVzICE9IFNpU19Qci0+U2lTX0hERSkgewotICAgICAgICAgIHRlbXAgPSBTaVNfUHItPlNpU19IVCAtICgoU2lTX1ByLT5QYW5lbFhSZXMgLSBTaVNfUHItPlNpU19IREUpIC8gMik7Ci0JICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIsIEh3SW5mbykpIHRlbXAgPj49IDE7CisJICB0ZW1wID0gU2lTX1ByLT5TaVNfSFQgLSAoKFNpU19Qci0+UGFuZWxYUmVzIC0gU2lTX1ByLT5TaVNfSERFKSAvIDIpOworCSAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByKSkgdGVtcCA+Pj0gMTsKICAgICAgICB9CiAgICAgfQogICAgIHRlbXAgKz0gYnJpZGdlb2Zmc2V0OwpAQCAtNzQ1MCwxNSArNzI0MiwxNyBAQAogICAgICAgICAgIHRlbXBieCA9IFNpU19Qci0+UGFuZWxYUmVzIC0gKChTaVNfUHItPlBhbmVsWFJlcyAtIFNpU19Qci0+U2lTX0hERSkgLyAyKTsKICAgICAgICB9CiAgICAgfQotICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgeworICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHsKICAgICAgICB0ZW1wY3ggPj49IDE7CiAgICAgICAgdGVtcGJ4ID4+PSAxOwogICAgICAgIHRlbXBheCA+Pj0gMTsKICAgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAibGNkaGRlZSAweCV4XG4iLCB0ZW1wYngpOwogI2VuZGlmCisjZW5kaWYKIAogICAgIHRlbXBieCArPSBicmlkZ2VvZmZzZXQ7CiAKQEAgLTc0ODAsMTMgKzcyNzQsMTYgQEAKIAogICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICAgIHRlbXBieCA9IFNpU19Qci0+Q0hTeW5jU3RhcnQ7Ci0gICAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYnggPj49IDE7CisgICAgICAgaWYobW9kZWZsYWcgJiBIYWxmRENMSykgdGVtcGJ4IDw8PSAxOworICAgICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHRlbXBieCA+Pj0gMTsKICAgICAgICB0ZW1wYnggKz0gYnJpZGdlb2Zmc2V0OwogICAgIH0KIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJsY2RocnMgMHgleFxuIiwgdGVtcGJ4KTsKICNlbmRpZgorI2VuZGlmCiAKICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFDLHRlbXBieCk7CSAgICAvKiBsY2RocnMgKi8KICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MUQsMHgwRiwoKHRlbXBieCA+PiA0KSAmIDB4ZjApKTsKQEAgLTc1MDEsMjAgKzcyOTgsMjMgQEAKIAogICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogICAgICAgIHRlbXBieCA9IFNpU19Qci0+Q0hTeW5jRW5kOwotICAgICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgdGVtcGJ4ID4+PSAxOworICAgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspIHRlbXBieCA8PD0gMTsKKyAgICAgICBpZihTaVNfSXNEdWFsTGluayhTaVNfUHIpKSB0ZW1wYnggPj49IDE7CiAgICAgICAgdGVtcGJ4ICs9IGJyaWRnZW9mZnNldDsKICAgICB9CiAKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAibGNkaHJlIDB4JXhcbiIsIHRlbXBieCk7CiAjZW5kaWYKKyNlbmRpZgogCiAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMSx0ZW1wYngpOwkgICAgLyogbGNkaHJlICovCiAKICAgICBTaVNfU2V0R3JvdXAyX1RhaWwoU2lTX1ByLCBNb2RlTm8pOwogCiAjaWZkZWYgU0lTMzAwCi0gICAgU2lTX1NldDMwMFBhcnQyUmVncyhTaVNfUHIsIEh3SW5mbywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgTW9kZU5vKTsKKyAgICBTaVNfU2V0MzAwUGFydDJSZWdzKFNpU19QciwgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgTW9kZU5vKTsKICNlbmRpZgogI2lmZGVmIFNJUzMxNUgKICAgfSAvKiBDUlQyLUxDRCBmcm9tIHRhYmxlICovCkBAIC03NTI2LDExICs3MzI2LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldEdyb3VwMyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0R3JvdXAzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVU0hPUlQgCWk7Ci0gIGNvbnN0IFVDSEFSICAJKnRlbXBkaTsKKyAgdW5zaWduZWQgc2hvcnQgaTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdGVtcGRpOwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHJldHVybjsKIApAQCAtNzU3MCw3ICs3MzY5LDcgQEAKICAgICAgZm9yKGk9MDsgaTw9MHgzRTsgaSsrKSB7CiAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDNQb3J0LGksdGVtcGRpW2ldKTsKICAgICAgfQotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxQyB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4Q0xWKSB7CiAJaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjUyNXApIHsKIAkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQzUG9ydCwweDI4LDB4M2YpOwogCX0KQEAgLTc1ODcsMzUgKzczODYsNDMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTSVMzMTVICisjaWYgMAogc3RhdGljIHZvaWQKLVNpU19TaGlmdFhQb3MoU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHNoaWZ0KQorU2lTX1NoaWZ0WFBvcyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHNoaWZ0KQogewotICAgVVNIT1JUIHRlbXAsIHRlbXAxLCB0ZW1wMjsKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXAsIHRlbXAxLCB0ZW1wMjsKIAogICAgdGVtcDEgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDFmKTsKICAgIHRlbXAyID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyMCk7Ci0gICB0ZW1wID0gKFVTSE9SVCkoKGludCkoKHRlbXAxIHwgKCh0ZW1wMiAmIDB4ZjApIDw8IDQpKSkgKyBzaGlmdCk7CisgICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgoaW50KSgodGVtcDEgfCAoKHRlbXAyICYgMHhmMCkgPDwgNCkpKSArIHNoaWZ0KTsKICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MWYsdGVtcCk7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MjAsMHgwZiwoKHRlbXAgPj4gNCkgJiAweGYwKSk7CiAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHgyYikgJiAweDBmOwotICAgdGVtcCA9IChVU0hPUlQpKChpbnQpKHRlbXApICsgc2hpZnQpOworICAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGludCkodGVtcCkgKyBzaGlmdCk7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4MmIsMHhmMCwodGVtcCAmIDB4MGYpKTsKICAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsMHg0Myk7CiAgICB0ZW1wMiA9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LDB4NDIpOwotICAgdGVtcCA9IChVU0hPUlQpKChpbnQpKCh0ZW1wMSB8ICgodGVtcDIgJiAweGYwKSA8PCA0KSkpICsgc2hpZnQpOworICAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGludCkoKHRlbXAxIHwgKCh0ZW1wMiAmIDB4ZjApIDw8IDQpKSkgKyBzaGlmdCk7CiAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQzLHRlbXApOwogICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQyUG9ydCwweDQyLDB4MGYsKCh0ZW1wID4+IDQpICYgMHhmMCkpOwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0R3JvdXA0X0NfRUxWKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCkKK1NpU19TZXRHcm91cDRfQ19FTFYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gICBVU0hPUlQgdGVtcCwgdGVtcDEsIHJlc2luZm8gPSAwOworICAgdW5zaWduZWQgc2hvcnQgdGVtcCwgdGVtcDEsIHJlc2luZm8gPSAwOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCi0gICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpKSByZXR1cm47CisgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweENMVikpIHJldHVybjsKICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0hpVmlzaW9uIHwgU2V0Q1JUMlRvWVBiUHI1MjU3NTApKSkgcmV0dXJuOwogCisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFhHSV8yMCkgcmV0dXJuOworCisgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSAmJiAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgeworICAgICAgaWYoIShST01BZGRyWzB4NjFdICYgMHgwNCkpIHJldHVybjsKKyAgIH0KKwogICAgaWYoTW9kZU5vID4gMHgxMykgewogICAgICAgcmVzaW5mbyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X1JFU0lORk87CiAgICB9CkBAIC03NjI1LDcgKzc0MzIsNyBAQAogICAgaWYoISh0ZW1wICYgMHgwMSkpIHsKICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhkZik7CiAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI1LDB4ZmMpOwotICAgICAgaWYoKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKKyAgICAgIGlmKChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzY2MSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjUsMHhmOCk7CiAgICAgICB9CiAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBmLDB4ZmIpOwpAQCAtNzYzMywyNCArNzQ0MCwyOSBAQAogICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldFlQYlByNTI1cCkgdGVtcCA9IDB4MDAwMjsKICAgICAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRIaVZpc2lvbikgIHRlbXAgPSAweDA0MDA7CiAgICAgICBlbHNlCQkJCQkgICB0ZW1wID0gMHgwNDAyOwotICAgICAgaWYoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHx8IChTaVNfUHItPlNpU19ST01OZXcpKSB7CisgICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB8fCAoU2lTX1ByLT5TaVNfUk9NTmV3KSkgewogICAgICAgICAgdGVtcDEgPSAwOwogCSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVkFzcGVjdDQzKSB0ZW1wMSA9IDQ7CiAJIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgwZiwweGZiLHRlbXAxKTsKIAkgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZBc3BlY3Q0M0xCKSB0ZW1wIHw9IDB4MDE7CiAJIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNiwweDdjLCh0ZW1wICYgMHhmZikpOworCSBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhmYiwodGVtcCA+PiA4KSk7CisJIGlmKE1vZGVObyA+IDB4MTMpIHsKKyAgICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDM5LDB4ZmQpOworICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRlbXAxID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4M2IpICYgMHgwMzsKIAkgaWYodGVtcDEgPT0gMHgwMSkgdGVtcCB8PSAweDAxOwogCSBpZih0ZW1wMSA9PSAweDAzKSB0ZW1wIHw9IDB4MDQ7ICAvKiA/IHdoeSBub3QgMHgxMD8gKi8KIAkgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4ZjgsKHRlbXAgJiAweGZmKSk7Ci0gICAgICB9Ci0gICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhmYiwodGVtcCA+PiA4KSk7Ci0gICAgICBpZihNb2RlTm8gPiAweDEzKSB7Ci0gICAgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDNiLDB4ZmQpOworCSBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2EsMHhmYiwodGVtcCA+PiA4KSk7CisJIGlmKE1vZGVObyA+IDB4MTMpIHsKKyAgICAgICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4M2IsMHhmZCk7CisgICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU182NjEpIHsgCQkvKiA/ICovCisjaWYgMAorICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNjYxKSB7IAkJLyogPyAqLwogICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZBc3BlY3Q0MykgewogICAgICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRZUGJQcjc1MHApIHsKIAkgICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjgpIHsKQEAgLTc2NjMsMjkgKzc0NzUsMzAgQEAKIAkgICAgfQogICAgICAgICAgfQogICAgICAgfQorI2VuZGlmCisKICAgIH0KKwogfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q1JUMlZDTEsoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldENSVDJWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0gIFVTSE9SVCB2Y2xraW5kZXg7Ci0gIFVTSE9SVCB0ZW1wLCByZWcxLCByZWcyOworICB1bnNpZ25lZCBzaG9ydCB2Y2xraW5kZXgsIHRlbXAsIHJlZzEsIHJlZzI7CiAKICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgIHJlZzEgPSBTaVNfUHItPkNTUjJCOwogICAgICByZWcyID0gU2lTX1ByLT5DU1IyQzsKICAgfSBlbHNlIHsKLSAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdJbmZvKTsKKyAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgICAgcmVnMSA9IFNpU19Qci0+U2lTX1ZCVkNMS0RhdGFbdmNsa2luZGV4XS5QYXJ0NF9BOwogICAgICByZWcyID0gU2lTX1ByLT5TaVNfVkJWQ0xLRGF0YVt2Y2xraW5kZXhdLlBhcnQ0X0I7CiAgIH0KIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDMTAyNCkgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0TlRTQzEwMjQgfCBUVlNldDUyNXAxMDI0KSkgewogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBhLDB4NTcpOwogIAlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDBiLDB4NDYpOwogCVNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MWYsMHhmNik7CkBAIC03NzA1LDExICs3NTE4LDM1IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0R3JvdXA0KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgCSAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfU2V0RHVhbExpbmtFdGMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB0ZW1wYXgsdGVtcGN4LHRlbXBieCxtb2RlZmxhZyx0ZW1wLHJlc2luZm87Ci0gIFVMT05HIHRlbXBlYngsdGVtcGVheCx0ZW1wbG9uZzsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgeworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNEVUFMTElOSykgeworCWlmKChTaVNfQ1JUMklzTENEKFNpU19QcikpIHx8CisJICAgKFNpU19Jc1ZBTW9kZShTaVNfUHIpKSkgeworCSAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0REdWFsTGluaykgeworCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweDJjKTsKKwkgICB9IGVsc2UgeworCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjcsfjB4MjApOworCSAgIH0KKwl9CisgICAgIH0KKyAgfQorICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNFTUkpIHsKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYSwweDAwKTsKKyNpZmRlZiBTRVRfRU1JCisgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7CisjZW5kaWYKKyAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzNCwweDEwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorU2lTX1NldEdyb3VwNChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQoreworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgsIHRlbXBjeCwgdGVtcGJ4LCBtb2RlZmxhZywgdGVtcCwgcmVzaW5mbzsKKyAgdW5zaWduZWQgaW50ICAgdGVtcGVieCwgdGVtcGVheCwgdGVtcGxvbmc7CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwpAQCAtNzcyMiwzOCArNzU1OSwyNCBAQAogICAgICByZXNpbmZvID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfUkVTSU5GTzsKICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEQSkgewotICAgICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI0LDB4MGUpOwotICAgICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFDIHwgVkJfU0lTMzAyTFYpKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MTAsMHg5Zik7Ci0gICAgIH0KLSAgfQotCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikgewotCSAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgewotCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweDJjKTsKLQkgICB9IGVsc2UgewotCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjcsfjB4MjApOwotCSAgIH0KLQotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKLQkgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDJhLDB4MDApOwotI2lmZGVmIFNFVF9FTUkKLQkgICAgICBTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDMwLDB4MGMpOwotI2VuZGlmCi0JICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzNCwweDEwKTsKLQkgICB9CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMxNUgpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgeworCWlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKKwkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI0LDB4MGUpOwogCX0KLSAgIAlyZXR1cm47CisgICAgIH0KKyAgfQorCisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMHhDTFYgfCBWQl9TSVMzMDJMVikpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwlTaVNfU2V0UmVnQU5EKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDEwLDB4OWYpOworICAgICB9CisgIH0KKworICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpIHsKKwlTaVNfU2V0RHVhbExpbmtFdGMoU2lTX1ByKTsKKwlyZXR1cm47CiAgICAgIH0KICAgfQogCkBAIC03Nzc3LDE2ICs3NjAwLDE2IEBACiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MTUsdGVtcCk7CiAKICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfVkdBSERFOwotICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICAgICAgIHRlbXBieCA+Pj0gMTsKLSAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYnggPj49IDE7CisgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgIHRlbXBieCA+Pj0gMTsKKyAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByKSkgdGVtcGJ4ID4+PSAxOwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDRCkgewogICAgICB0ZW1wID0gMDsKICAgICAgaWYodGVtcGJ4ID4gODAwKSAgICAgICAgdGVtcCA9IDB4NjA7CiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikgewogICAgICB0ZW1wID0gMDsKLSAgICAgaWYodGVtcGJ4ID09IDEwMjQpICAgICAgdGVtcCA9IDB4QTA7Ci0gICAgIGVsc2UgaWYodGVtcGJ4ID4gMTAyNCkgIHRlbXAgPSAweEMwOworICAgICBpZih0ZW1wYnggPiAxMDI0KSAgICAgICB0ZW1wID0gMHhDMDsKKyAgICAgZWxzZSBpZih0ZW1wYnggPj0gOTYwKSAgdGVtcCA9IDB4QTA7CiAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcCkpIHsKICAgICAgdGVtcCA9IDA7CiAgICAgIGlmKHRlbXBieCA+PSAxMjgwKSAgICAgIHRlbXAgPSAweDQwOwpAQCAtNzc5Niw4ICs3NjE5LDEzIEBACiAgICAgIGlmKHRlbXBieCA+PSAxMDI0KSAgICAgIHRlbXAgPSAweEEwOwogICB9CiAKKyAgdGVtcCB8PSBTaVNfUHItPkluaXRfUDRfMEU7CisKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7Ci0gICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHgxMDI0KSB0ZW1wIHw9IDB4MEE7CisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHgxMDI0KSB7CisgICAgICAgIHRlbXAgJj0gMHhmMDsKKyAgICAgICAgdGVtcCB8PSAweDBBOworICAgICB9CiAgIH0KIAogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MEUsMHgxMCx0ZW1wKTsKQEAgLTc4MjQsMTUgKzc2NTIsMTUgQEAKICAgdGVtcGVheCAvPSB0ZW1wZWJ4OwogICBpZih0ZW1wbG9uZykgdGVtcGVheCsrOwogCi0gIHRlbXAgPSAoVVNIT1JUKSh0ZW1wZWF4ICYgMHgwMDAwMDBGRik7CisgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYXggJiAweDAwMDAwMEZGKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxQix0ZW1wKTsKLSAgdGVtcCA9IChVU0hPUlQpKCh0ZW1wZWF4ICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKCh0ZW1wZWF4ICYgMHgwMDAwRkYwMCkgPj4gOCk7CiAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MUEsdGVtcCk7Ci0gIHRlbXAgPSAoVVNIT1JUKSgodGVtcGVheCA+PiAxMikgJiAweDcwKTsgLyogc2ljISAqLworICB0ZW1wID0gKHVuc2lnbmVkIHNob3J0KSgodGVtcGVheCA+PiAxMikgJiAweDcwKTsgLyogc2ljISAqLwogICB0ZW1wIHw9ICh0ZW1wY3ggJiAweDRGKTsKICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxOSx0ZW1wKTsKIAotICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKKyAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxQywweDI4KTsKIApAQCAtNzg0MCwyMyArNzY2OCwyNiBAQAogICAgICB0ZW1wYnggPSAwOwogICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRIaVZpc2lvbiB8IFRWU2V0WVBiUHI3NTBwKSkgdGVtcGJ4ID0gMHgwODsKICAgICAgdGVtcGF4ID0gU2lTX1ByLT5TaVNfVkdBSERFOwotICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAgICAgICAgICAgIHRlbXBheCA+Pj0gMTsKLSAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYXggPj49IDE7CisgICAgIGlmKG1vZGVmbGFnICYgSGFsZkRDTEspICAgIHRlbXBheCA+Pj0gMTsKKyAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByKSkgdGVtcGF4ID4+PSAxOwogICAgICBpZih0ZW1wYXggPiA4MDApIHsKICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CiAJICAgdGVtcGF4IC09IDgwMDsKLQl9IGVsc2UgeyAgLyogNjUxKzMwMUM6IE9ubHkgaWYgVFZOb0hpdmlOb1lQYlByICovCisJfSBlbHNlIHsKIAkgICB0ZW1wYnggPSAweDA4OwotICAgICAgICAgICBpZih0ZW1wYXggPT0gMTAyNCkgdGVtcGF4ICo9IDI1OwotICAgICAgICAgICBlbHNlCSAgICAgICAgICAgICAgdGVtcGF4ICo9IDIwOworCSAgIGlmKHRlbXBheCA9PSA5NjApCSAgIHRlbXBheCAqPSAyNTsgLyogQ29ycmVjdCAqLworICAgICAgICAgICBlbHNlIGlmKHRlbXBheCA9PSAxMDI0KSB0ZW1wYXggKj0gMjU7CisgICAgICAgICAgIGVsc2UJCQkgICB0ZW1wYXggKj0gMjA7CiAJICAgdGVtcCA9IHRlbXBheCAlIDMyOwogCSAgIHRlbXBheCAvPSAzMjsKIAkgICBpZih0ZW1wKSB0ZW1wYXgrKzsKIAkgICB0ZW1wYXgrKzsKLQkgICBpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFZOb1lQYlBySGlWaXNpb24pIHx8Ci0JICAgICAgKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0WVBiUHI1MjVpKSkgewotCSAgICAgIGlmKHJlc2luZm8gPT0gU0lTX1JJXzEwMjR4NzY4KSB7Ci0JICAgICAgICAgLyogT3RoZXJ3aXNlIHdoaXRlIGxpbmUgYXQgcmlnaHQgZWRnZSAqLworCSAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CisJICAgICAgaWYocmVzaW5mbyA9PSBTSVNfUklfMTAyNHg3NjggfHwKKwkgICAgICAgICByZXNpbmZvID09IFNJU19SSV8xMDI0eDU3NiB8fAorCQkgcmVzaW5mbyA9PSBTSVNfUklfMTI4MHgxMDI0IHx8CisJCSByZXNpbmZvID09IFNJU19SSV8xMjgweDcyMCkgeworCSAgICAgICAgIC8qIE90aGVyd2lzZSB3aGl0ZSBsaW5lIG9yIGdhcmJhZ2UgYXQgcmlnaHQgZWRnZSAqLwogCSAgICAgICAgIHRlbXBheCA9ICh0ZW1wYXggJiAweGZmMDApIHwgMHgyMDsKIAkgICAgICB9CiAJICAgfQpAQCAtNzg2OCw3ICs3Njk5LDcgQEAKICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxRSx0ZW1wKTsKIAogICAgICB0ZW1wID0gMHgwMDM2OyB0ZW1wYnggPSAweEQwOwotICAgICBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMxNUgpICYmIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSkgeworICAgICBpZigoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzE1SCkgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CiAJdGVtcCA9IDB4MDAyNjsgdGVtcGJ4ID0gMHhDMDsgLyogU2VlIEVuL0Rpc2FibGVCcmlkZ2UoKSAqLwogICAgICB9CiAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CkBAIC03ODg0LDM2ICs3NzE1LDI0IEBACiAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgxRix0ZW1wYngsdGVtcCk7CiAKICAgICAgdGVtcGJ4ID0gU2lTX1ByLT5TaVNfSFQgPj4gMTsKLSAgICAgaWYoU2lTX0lzRHVhbExpbmsoU2lTX1ByLCBId0luZm8pKSB0ZW1wYnggPj49IDE7CisgICAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QcikpIHRlbXBieCA+Pj0gMTsKICAgICAgdGVtcGJ4IC09IDI7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjIsdGVtcGJ4KTsKICAgICAgdGVtcCA9ICh0ZW1wYnggPj4gNSkgJiAweDM4OwogICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjEsMHhDMCx0ZW1wKTsKIAotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSB7CisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpIHsKIAlpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNCwweDBlKTsKIAkgICAvKiBMQ0QtdG9vLWRhcmstZXJyb3Itc291cmNlLCBzZWUgRmluYWxpemVMQ0QoKSAqLwogCX0KLQlpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzE1SCkgewotCSAgIGlmKFNpU19Jc0R1YWxMaW5rKFNpU19QciwgSHdJbmZvKSkgewotCSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNywweDJjKTsKLQkgICB9IGVsc2UgewotCSAgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjcsfjB4MjApOwotCSAgIH0KLQl9Ci0JaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgewotCSAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MmEsMHgwMCk7Ci0jaWZkZWYgU0VUX0VNSQotCSAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MzAsMHgwYyk7Ci0jZW5kaWYKLQkgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDM0LDB4MTApOwotCX0KICAgICAgfQogCisgICAgIFNpU19TZXREdWFsTGlua0V0YyhTaVNfUHIpOworCiAgIH0gIC8qIDMwMUIgKi8KIAotICBTaVNfU2V0Q1JUMlZDTEsoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7CisgIFNpU19TZXRDUlQyVkNMSyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03OTIxLDggKzc3NDAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXRHcm91cDUoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX1NldEdyb3VwNShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSAgcmV0dXJuOwpAQCAtNzkzMCw3ICs3NzQ4LDcgQEAKICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPT0gTW9kZVZHQSkgewogICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRJblNsYXZlTW9kZSB8IExvYWREQUNGbGFnKSkpIHsKICAgICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1AzYzQsMHgxRSwweDIwKTsKLSAgICAgICAgU2lTX0xvYWREQUMoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgpOworICAgICAgICBTaVNfTG9hZERBQyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogICAgICB9CiAgIH0KIH0KQEAgLTc5MzksMTE2ICs3NzU3LDE1NiBAQAogLyogICAgIE1PRElGWSBDUlQxIEdST1VQIEZPUiBTTEFWRSBNT0RFICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkCi1TaVNfTW9kQ1JUMUNSVEMoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pCi17Ci0gIFVTSE9SVCB0ZW1wYWgsaSxtb2RlZmxhZyxqOwotICBVU0hPUlQgUmVzSW5kZXgsRGlzcGxheVR5cGU7Ci0gIGNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgKkxWRFNDUlQxUHRyPU5VTEw7CitzdGF0aWMgQk9PTEVBTgorU2lTX0dldExWRFNDUlQxUHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHVuc2lnbmVkIHNob3J0ICpSZXNJbmRleCwKKwkJICAgdW5zaWduZWQgc2hvcnQgKkRpc3BsYXlUeXBlKQorIHsKKyAgdW5zaWduZWQgc2hvcnQgbW9kZWZsYWcgPSAwOworICBCT09MRUFOIGNoZWNraGQgPSBUUlVFOwogCi0gIGlmKE1vZGVObyA8PSAweDEzKSBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0gIGVsc2UgICAgICAgICAgICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOworICAvKiBQYXNzIDE6MSBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KKworICBpZihNb2RlTm8gPD0gMHgxMykgeworICAgICBtb2RlZmxhZyA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CisgICAgICgqUmVzSW5kZXgpID0gU2lTX1ByLT5TaVNfU01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9DUlQyQ1JUQzsKKyAgfSBlbHNlIHsKKyAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKyAgICAgKCpSZXNJbmRleCkgPSBTaVNfUHItPlNpU19SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKKyAgfQorCisgICgqUmVzSW5kZXgpICY9IDB4M0Y7CisKKyAgaWYoKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHgpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikpIHsKKworICAgICAoKkRpc3BsYXlUeXBlKSA9IDgwOworICAgICBpZigoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICYmICghKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTSkpKSB7CisgICAgICAJKCpEaXNwbGF5VHlwZSkgPSA4MjsKKwlpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKKwkgICBpZihTaVNfUHItPlNpU19DSFNPdmVyU2NhbikgKCpEaXNwbGF5VHlwZSkgPSA4NDsKKwl9CisgICAgIH0KKyAgICAgaWYoKCpEaXNwbGF5VHlwZSkgIT0gODQpIHsKKyAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSAoKkRpc3BsYXlUeXBlKSsrOworICAgICB9CisKKyAgfSBlbHNlIHsKKworICAgICAoKkRpc3BsYXlUeXBlID0gMCk7CisgICAgIHN3aXRjaChTaVNfUHItPlNpU19MQ0RSZXNJbmZvKSB7CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8xOiAoKkRpc3BsYXlUeXBlKSA9IDUwOworCQkJICAgY2hlY2toZCA9IEZBTFNFOworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8yOiAoKkRpc3BsYXlUeXBlKSA9IDE0OworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMzIweDI0MF8zOiAoKkRpc3BsYXlUeXBlKSA9IDE4OworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfNjQweDQ4MDogICAoKkRpc3BsYXlUeXBlKSA9IDEwOworCQkJICAgYnJlYWs7CisgICAgIGNhc2UgUGFuZWxfMTAyNHg2MDA6ICAoKkRpc3BsYXlUeXBlKSA9IDI2OworCQkJICAgYnJlYWs7CisgICAgIGRlZmF1bHQ6IHJldHVybiBUUlVFOworICAgICB9CisKKyAgICAgaWYoY2hlY2toZCkgeworICAgICAgICBpZihtb2RlZmxhZyAmIEhhbGZEQ0xLKSAoKkRpc3BsYXlUeXBlKSsrOworICAgICB9CisKKyAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDYwMCkgeworICAgICAgICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgKCpEaXNwbGF5VHlwZSkgKz0gMjsKKyAgICAgfQorCisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK1NpU19Nb2RDUlQxQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCit7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBhaCwgaSwgbW9kZWZsYWcsIGosIFJlc0luZGV4LCBEaXNwbGF5VHlwZTsKKyAgY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEgKkxWRFNDUlQxUHRyPU5VTEw7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBDUklkeFtdID0geworCTB4MDAsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCisJMHgwNywgMHgxMCwgMHgxMSwgMHgxNSwgMHgxNgorICB9OwogCiAgIGlmKChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEzNjYpIHx8CiAgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9CQVJDTzEwMjQpIHx8Ci0gICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkpCisgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg0OCkgIHx8CisgICAgIChTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9QQU5FTDg1NikgKQogICAgICByZXR1cm47CiAKKyAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMpIHsKKyAgICAgaWYoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSkgeworICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgcmV0dXJuOworICAgICB9CisgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgeworICAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgcmV0dXJuOworICB9IGVsc2UgcmV0dXJuOworCisgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHJldHVybjsKKworICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKKyAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpIHJldHVybjsKKyAgfQorCiAgIGlmKCEoU2lTX0dldExWRFNDUlQxUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAmUmVzSW5kZXgsICZEaXNwbGF5VHlwZSkpKSB7CiAgICAgIHJldHVybjsKICAgfQogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKLSAgICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpIHJldHVybjsKLSAgfQotCiAgIHN3aXRjaChEaXNwbGF5VHlwZSkgewotICAgIGNhc2UgMCA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzE7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDEgOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxODAweDYwMF8xX0g7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyIDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTgwMHg2MDBfMjsgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE4MDB4NjAwXzJfSDsgICAgICAgICBicmVhazsKLSAgICBjYXNlIDQgOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg3NjhfMTsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1IDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NzY4XzFfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNiA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8yOyAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDcgOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg3NjhfMl9IOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4IDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8xOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgOSA6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDEwMjRfMV9IOyAgICAgICBicmVhazsKLSAgICBjYXNlIDEwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHgxMDI0XzI7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4MTAyNF8yX0g7ICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDFYWFh4WFhYXzE7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDEzOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxWFhYeFhYWF8xX0g7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8xOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExNDAweDEwNTBfMV9IOyAgICAgICBicmVhazsKLSAgICBjYXNlIDE2OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTQwMHgxMDUwXzI7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8yX0g7ICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTg6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFVTlRTQzsgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDE5OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0NIVFZDUlQxT05UU0M7ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMVVQQUw7ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjE6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFPUEFMOyAgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDIyOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDQ4MF8xOyAgICAgICAgICAgYnJlYWs7IC8qIEZTVE4gKi8KLSAgICBjYXNlIDIzOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMTsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzFfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjU6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDYwMF8yOyAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDI2OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMl9IOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTExNTJ4NzY4XzE7ICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjg6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMTUyeDc2OF8xX0g7ICAgICAgICBicmVhazsKLSAgICBjYXNlIDI5OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTE1Mng3NjhfMjsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTExNTJ4NzY4XzJfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzY6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExNjAweDEyMDBfMTsgICAgICAgICBicmVhazsKLSAgICBjYXNlIDM3OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTYwMHgxMjAwXzFfSDsgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzODogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTE2MDB4MTIwMF8yOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzk6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExNjAweDEyMDBfMl9IOyAgICAgICBicmVhazsKLSAgICBjYXNlIDQwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMTsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0MTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEyODB4NzY4XzFfSDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDI6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMjgweDc2OF8yOyAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDQzOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTI4MHg3NjhfMl9IOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1MDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMTsgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNTE6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzFfSDsgICAgICAgICBicmVhazsKLSAgICBjYXNlIDUyOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8yOyAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1MzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMl9IOyAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNTQ6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDE2NDB4NDgwXzM7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDU1OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8zX0g7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMVNPUEFMOyAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDc2OF8xOyAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDUwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8xOyAgICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE0OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yOyAgICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE1OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8yX0g7ICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE4OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8zOyAgICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDE5OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMzIweDI0MF8zX0g7ICAgICAgICAgYnJlYWs7IC8qIHhTVE4gKi8KKyAgICBjYXNlIDEwOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxNjQweDQ4MF8xOyAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IOyAgICAgICAgIGJyZWFrOworI2lmIDAgLyogV29ya3MgYmV0dGVyIHdpdGggY2FsY3VsYXRlZCBudW1iZXJzICovCisgICAgY2FzZSAyNjogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzE7ICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfTFZEU0NSVDExMDI0eDYwMF8xX0g7ICAgICAgICBicmVhazsKKyAgICBjYXNlIDI4OiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0xWRFNDUlQxMTAyNHg2MDBfMjsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOTogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSDsgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSA4MDogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMVVOVFNDOyAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgODE6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFPTlRTQzsgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDgyOiBMVkRTQ1JUMVB0ciA9IFNpU19Qci0+U2lTX0NIVFZDUlQxVVBBTDsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4MzogTFZEU0NSVDFQdHIgPSBTaVNfUHItPlNpU19DSFRWQ1JUMU9QQUw7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgODQ6IExWRFNDUlQxUHRyID0gU2lTX1ByLT5TaVNfQ0hUVkNSVDFTT1BBTDsgICAgICAgICAgICAgICBicmVhazsKICAgfQogCi0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDExLDB4N2YpOworICBpZihMVkRTQ1JUMVB0cikgewogCi0gIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1JbMF07Ci0gIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDAwLHRlbXBhaCk7CisgICAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUDNkNCwweDExLDB4N2YpOwogCi0gIGZvcihpPTB4MDIsaj0xO2k8PTB4MDU7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MDYsaj01O2k8PTB4MDc7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MTAsaj03O2k8PTB4MTE7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MTUsaj05O2k8PTB4MTY7aSsrLGorKyl7Ci0gICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUltqXTsKLSAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsaSx0ZW1wYWgpOwotICB9Ci0gIGZvcihpPTB4MEEsaj0xMTtpPD0weDBDO2krKyxqKyspewotICAgIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1Jbal07Ci0gICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2M0LGksdGVtcGFoKTsKLSAgfQorICAgICBmb3IoaSA9IDA7IGkgPD0gMTA7IGkrKykgeworICAgICAgICB0ZW1wYWggPSAoTFZEU0NSVDFQdHIgKyBSZXNJbmRleCktPkNSW2ldOworICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsQ1JJZHhbaV0sdGVtcGFoKTsKKyAgICAgfQogCi0gIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1JbMTRdOwotICB0ZW1wYWggJj0gMHhFMDsKLSAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzYzQsMHgwRSwweDFmLHRlbXBhaCk7CisgICAgIGZvcihpID0gMHgwQSwgaiA9IDExOyBpIDw9IDB4MEM7IGkrKywgaisrKSB7CisgICAgICAgIHRlbXBhaCA9IChMVkRTQ1JUMVB0ciArIFJlc0luZGV4KS0+Q1Jbal07CisgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCxpLHRlbXBhaCk7CisgICAgIH0KIAotICB0ZW1wYWggPSAoTFZEU0NSVDFQdHIgKyBSZXNJbmRleCktPkNSWzE0XTsKLSAgdGVtcGFoICY9IDB4MDE7Ci0gIHRlbXBhaCA8PD0gNTsKLSAgaWYobW9kZWZsYWcgJiBEb3VibGVTY2FuTW9kZSkgIHRlbXBhaCB8PSAweDA4MDsKLSAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgwOSx+MHgwMjAsdGVtcGFoKTsKKyAgICAgdGVtcGFoID0gKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUlsxNF0gJiAweEUwOworICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDBFLDB4MWYsdGVtcGFoKTsKKworICAgICBpZihNb2RlTm8gPD0gMHgxMykgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOworICAgICBlbHNlICAgICAgICAgICAgICAgbW9kZWZsYWcgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKKworICAgICB0ZW1wYWggPSAoKExWRFNDUlQxUHRyICsgUmVzSW5kZXgpLT5DUlsxNF0gJiAweDAxKSA8PCA1OworICAgICBpZihtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKSB0ZW1wYWggfD0gMHg4MDsKKyAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgwOSx+MHgwMjAsdGVtcGFoKTsKKworICB9IGVsc2UgeworCisgICAgIFNpU19DYWxjTENEQUNSVDFUaW1pbmcoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKworICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04MDU2LDI0ICs3OTE0LDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotU2lTX1NldENSVDJFQ0xLKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDUlQyRUNMSyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBjbGtiYXNlLCB2Y2xraW5kZXg9MDsKLSAgVUNIQVIgIHNyMmIsIHNyMmM7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgY2xrYmFzZSwgdmNsa2luZGV4ID0gMDsKKyAgdW5zaWduZWQgY2hhciAgc3IyYiwgc3IyYzsKIAotICBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF82NDB4NDgwKSB8fCAoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpIHsKLQlTaVNfUHItPlNpU19TZXRGbGFnICY9ICh+UHJvZ3JhbW1pbmdDUlQyKTsKLSAgICAgICAgaWYoKFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEsgJiAweDNmKSA9PSAyKSB7Ci0JICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LS07Ci0JfQotCXZjbGtpbmRleCA9IFNpU19HZXRWQ0xLMlB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7Ci0JU2lTX1ByLT5TaVNfU2V0RmxhZyB8PSBQcm9ncmFtbWluZ0NSVDI7CisgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBMQ0RQYXNzMTEpIHsKKyAgICAgU2lTX1ByLT5TaVNfU2V0RmxhZyAmPSAoflByb2dyYW1taW5nQ1JUMik7CisgICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEsgPT0gMikgeworCVJlZnJlc2hSYXRlVGFibGVJbmRleC0tOworICAgICB9CisgICAgIHZjbGtpbmRleCA9IFNpU19HZXRWQ0xLMlB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworICAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKICAgfSBlbHNlIHsKLSAgICAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKKyAgICAgdmNsa2luZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAgIH0KIAogICBzcjJiID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbdmNsa2luZGV4XS5TUjJCOwpAQCAtODA4Miw3ICs3OTQwLDcgQEAKICAgaWYoKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgfHwgKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTAyNCkpIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlUk9NKSB7CiAJaWYoUk9NQWRkclsweDIyMF0gJiAweDAxKSB7Ci0gICAgICAgICAgIHNyMmIgPSBST01BZGRyWzB4MjI3XTsKKwkgICBzcjJiID0gUk9NQWRkclsweDIyN107CiAJICAgc3IyYyA9IFJPTUFkZHJbMHgyMjhdOwogCX0KICAgICAgfQpAQCAtODA5MSw3ICs3OTQ5LDcgQEAKICAgY2xrYmFzZSA9IDB4MDJCOwogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0xDREEpKSB7CiAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7Ci0gICAgCWNsa2Jhc2UgKz0gMzsKKwljbGtiYXNlICs9IDM7CiAgICAgIH0KICAgfQogCkBAIC04MTExLDM2OCArNzk2OSwzMzEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0Q0hUVlJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KQorU2lTX1NldENIVFZSZWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpCiB7Ci0jaWYgZGVmaW5lZChTSVMzMDApIHx8IGRlZmluZWQoU0lTMzE1SCkKLSAgVVNIT1JUIHRlbXAsIHRlbXBieDsKLSNlbmRpZgotICBVU0hPUlQgdGVtcGNsOwotICBVU0hPUlQgVFZUeXBlLCByZXNpbmRleDsKLSAgY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpDSFRWUmVnRGF0YSA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCBUVlR5cGUsIHJlc2luZGV4OworICAgY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YSAqQ0hUVlJlZ0RhdGEgPSBOVUxMOwogCi0gIGlmKE1vZGVObyA8PSAweDEzKQotICAgICB0ZW1wY2wgPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X0NSVDJDUlRDOwotICBlbHNlCi0gICAgIHRlbXBjbCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOworICAgaWYoTW9kZU5vIDw9IDB4MTMpCisgICAgICByZXNpbmRleCA9IFNpU19Qci0+U2lTX1NNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CisgICBlbHNlCisgICAgICByZXNpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVDJDUlRDOwogCi0gIFRWVHlwZSA9IDA7Ci0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7Ci0gIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gIAlUVlR5cGUgKz0gMjsKLQlpZihTaVNfUHItPlNpU19Nb2RlVHlwZSA+IE1vZGVWR0EpIHsKLQkgICBpZihTaVNfUHItPlNpU19DSFNPdmVyU2NhbikgVFZUeXBlID0gODsKLQl9Ci0JaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSB7Ci0JCVRWVHlwZSA9IDQ7Ci0JCWlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7Ci0JfSBlbHNlIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMTikgewotCQlUVlR5cGUgPSA2OwotCQlpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIFRWVHlwZSArPSAxOwotCX0KLSAgfQotICBzd2l0Y2goVFZUeXBlKSB7Ci0gICAgIGNhc2UgIDA6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VTlRTQzsgYnJlYWs7Ci0gICAgIGNhc2UgIDE6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PTlRTQzsgYnJlYWs7Ci0gICAgIGNhc2UgIDI6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMOyAgYnJlYWs7Ci0gICAgIGNhc2UgIDM6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7Ci0gICAgIGNhc2UgIDQ6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMTTsgYnJlYWs7Ci0gICAgIGNhc2UgIDU6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMTTsgYnJlYWs7Ci0gICAgIGNhc2UgIDY6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMTjsgYnJlYWs7Ci0gICAgIGNhc2UgIDc6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMTjsgYnJlYWs7Ci0gICAgIGNhc2UgIDg6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19TT1BBTDsgYnJlYWs7Ci0gICAgIGRlZmF1bHQ6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7Ci0gIH0KLSAgcmVzaW5kZXggPSB0ZW1wY2wgJiAweDNGOworICAgcmVzaW5kZXggJj0gMHgzRjsKIAotICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDEpIHsKKyAgIFRWVHlwZSA9IDA7CisgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIFRWVHlwZSArPSAxOworICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKyAgICAgIFRWVHlwZSArPSAyOworICAgICAgaWYoU2lTX1ByLT5TaVNfTW9kZVR5cGUgPiBNb2RlVkdBKSB7CisJIGlmKFNpU19Qci0+U2lTX0NIU092ZXJTY2FuKSBUVlR5cGUgPSA4OworICAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSB7CisJIFRWVHlwZSA9IDQ7CisJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7CisgICAgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxOKSB7CisJIFRWVHlwZSA9IDY7CisJIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0Q0hPdmVyU2NhbikgVFZUeXBlICs9IDE7CisgICAgICB9CisgICB9CisKKyAgIHN3aXRjaChUVlR5cGUpIHsKKyAgICAgIGNhc2UgIDA6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VTlRTQzsgYnJlYWs7CisgICAgICBjYXNlICAxOiBDSFRWUmVnRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZSZWdfT05UU0M7IGJyZWFrOworICAgICAgY2FzZSAgMjogQ0hUVlJlZ0RhdGEgPSBTaVNfUHItPlNpU19DSFRWUmVnX1VQQUw7ICBicmVhazsKKyAgICAgIGNhc2UgIDM6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7CisgICAgICBjYXNlICA0OiBDSFRWUmVnRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZSZWdfVVBBTE07IGJyZWFrOworICAgICAgY2FzZSAgNTogQ0hUVlJlZ0RhdGEgPSBTaVNfUHItPlNpU19DSFRWUmVnX09QQUxNOyBicmVhazsKKyAgICAgIGNhc2UgIDY6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19VUEFMTjsgYnJlYWs7CisgICAgICBjYXNlICA3OiBDSFRWUmVnRGF0YSA9IFNpU19Qci0+U2lTX0NIVFZSZWdfT1BBTE47IGJyZWFrOworICAgICAgY2FzZSAgODogQ0hUVlJlZ0RhdGEgPSBTaVNfUHItPlNpU19DSFRWUmVnX1NPUEFMOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IENIVFZSZWdEYXRhID0gU2lTX1ByLT5TaVNfQ0hUVlJlZ19PUEFMOyAgYnJlYWs7CisgICB9CisKKworICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKSB7CiAKICNpZmRlZiBTSVMzMDAKIAotICAgICAvKiBDaHJvbnRlbCA3MDA1IC0gSSBhc3N1bWUgdGhhdCBpdCBkb2VzIG5vdCBjb21lIHdpdGggYSAzMTUgc2VyaWVzIGNoaXAgKi8KKyAgICAgIC8qIENocm9udGVsIDcwMDUgLSBJIGFzc3VtZSB0aGF0IGl0IGRvZXMgbm90IGNvbWUgd2l0aCBhIDMxNSBzZXJpZXMgY2hpcCAqLwogCi0gICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgbW9kZXMgPjgwMHg2MDAgKi8KLSAgICAgaWYgKHJlc2luZGV4ID4gNSkgcmV0dXJuOworICAgICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBtb2RlcyA+ODAweDYwMCAqLworICAgICAgaWYgKHJlc2luZGV4ID4gNSkgcmV0dXJuOwogCi0gICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSB7Ci0gICAgCVNpU19TZXRDSDcwMHgoU2lTX1ByLDB4NDMwNCk7ICAgLyogMHg0MD03NnVBIChQQUwpOyAweDAzPTE1Yml0IG5vbi1tdWx0aSBSR0IqLwotICAgIAlTaVNfU2V0Q0g3MDB4KFNpU19QciwweDY5MDkpOwkvKiBCbGFjayBsZXZlbCBmb3IgUEFMICgxMDUpKi8KLSAgICAgfSBlbHNlIHsKLSAgICAJU2lTX1NldENINzAweChTaVNfUHIsMHgwMzA0KTsgICAvKiB1cHBlciBuaWJibGU9NzF1QSAoTlRTQyksIDB4MDM9MTViaXQgbm9uLW11bHRpIFJHQiovCi0gICAgCVNpU19TZXRDSDcwMHgoU2lTX1ByLDB4NzEwOSk7CS8qIEJsYWNrIGxldmVsIGZvciBOVFNDICgxMTMpKi8KLSAgICAgfQorICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpIHsKKwkgU2lTX1NldENINzAweChTaVNfUHIsMHgwNCwweDQzKTsgIC8qIDB4NDA9NzZ1QSAoUEFMKTsgMHgwMz0xNWJpdCBub24tbXVsdGkgUkdCKi8KKwkgU2lTX1NldENINzAweChTaVNfUHIsMHgwOSwweDY5KTsgIC8qIEJsYWNrIGxldmVsIGZvciBQQUwgKDEwNSkqLworICAgICAgfSBlbHNlIHsKKwkgU2lTX1NldENINzAweChTaVNfUHIsMHgwNCwweDAzKTsgICAvKiB1cHBlciBuaWJibGU9NzF1QSAoTlRTQyksIDB4MDM9MTViaXQgbm9uLW11bHRpIFJHQiovCisJIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MDksMHg3MSk7ICAgLyogQmxhY2sgbGV2ZWwgZm9yIE5UU0MgKDExMykqLworICAgICAgfQogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzBdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MDA7CS8qIE1vZGUgcmVnaXN0ZXIgKi8KLSAgICAgU2lTX1NldENINzAweChTaVNfUHIsdGVtcGJ4KTsKLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMV07Ci0gICAgIHRlbXBieD0oKHRlbXAmMHgwMEZGKTw8OCl8MHgwNzsJLyogU3RhcnQgYWN0aXZlIHZpZGVvIHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7Ci0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzJdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MDg7CS8qIFBvc2l0aW9uIG92ZXJmbG93IHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7Ci0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzNdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MEE7CS8qIEhvcml6IFBvc2l0aW9uIHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7Ci0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzRdOwotICAgICB0ZW1wYng9KCh0ZW1wJjB4MDBGRik8PDgpfDB4MEI7CS8qIFZlcnRpY2FsIFBvc2l0aW9uIHJlZ2lzdGVyICovCi0gICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLHRlbXBieCk7CisgICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDAwLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMF0pOwkvKiBNb2RlIHJlZ2lzdGVyICovCisgICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDA3LENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMV0pOwkvKiBTdGFydCBhY3RpdmUgdmlkZW8gcmVnaXN0ZXIgKi8KKyAgICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MDgsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1syXSk7CS8qIFBvc2l0aW9uIG92ZXJmbG93IHJlZ2lzdGVyICovCisgICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweDBhLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbM10pOwkvKiBIb3JpeiBQb3NpdGlvbiByZWdpc3RlciAqLworICAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwYixDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzRdKTsJLyogVmVydGljYWwgUG9zaXRpb24gcmVnaXN0ZXIgKi8KIAotICAgICAvKiBTZXQgbWluaW11bSBmbGlja2VyIGZpbHRlciBmb3IgTHVtYSBjaGFubmVsIChTUjEtMD0wMCksCisgICAgICAvKiBTZXQgbWluaW11bSBmbGlja2VyIGZpbHRlciBmb3IgTHVtYSBjaGFubmVsIChTUjEtMD0wMCksCiAgICAgICAgICAgICAgICAgbWluaW11bSB0ZXh0IGVuaGFuY2VtZW50IChTMy0yPTEwKSwKICAgIAkgICAgICAgIG1heGltdW0gZmxpY2tlciBmaWx0ZXIgZm9yIENocm9tYSBjaGFubmVsIChTNS00PTEwKQogCSAgICAgICAgPTAwMTAxMDAwPTB4MjggKFdoZW4gcmVhZGluZywgUzEtMC0+UzMtMiwgYW5kIFMzLTItPlMxLTAhKQotICAgICAgKi8KLSAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgyODAxKTsKKyAgICAgICAqLworICAgICAgU2lTX1NldENINzAweChTaVNfUHIsMHgwMSwweDI4KTsKIAotICAgICAvKiBTZXQgdmlkZW8gYmFuZHdpZHRoCisgICAgICAvKiBTZXQgdmlkZW8gYmFuZHdpZHRoCiAgICAgICAgICAgICBIaWdoIGJhbmR3aXRoIEx1bWEgY29tcG9zaXRlIHZpZGVvIGZpbHRlcihTMD0xKQogICAgICAgICAgICAgbG93IGJhbmR3aXRoIEx1bWEgUy12aWRlbyBmaWx0ZXIgKFMyLTE9MDApCiAJICAgIGRpc2FibGUgcGVhayBmaWx0ZXIgaW4gUy12aWRlbyBjaGFubmVsIChTMz0wKQogCSAgICBoaWdoIGJhbmR3aWR0aCBDaHJvbWEgRmlsdGVyIChTNS00PTExKQogCSAgICA9MDAxMTAwMDE9MHgzMQotICAgICAqLwotICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwweGIxMDMpOyAgICAgICAvKiBvbGQ6IDMxMDMgKi8KLQotICAgICAvKiBSZWdpc3RlciAweDNEIGRvZXMgbm90IGV4aXN0IGluIG5vbi1tYWNyb3Zpc2lvbiByZWdpc3RlciBtYXAKLSAgICAgICAgICAgIChNYXliZSB0aGlzIGlzIGEgbWFjcm92aXNpb24gcmVnaXN0ZXI/KQogICAgICAgKi8KKyAgICAgIFNpU19TZXRDSDcwMHgoU2lTX1ByLDB4MDMsMHhiMSk7ICAgICAgIC8qIG9sZDogMzEwMyAqLworCisgICAgICAvKiBSZWdpc3RlciAweDNEIGRvZXMgbm90IGV4aXN0IGluIG5vbi1tYWNyb3Zpc2lvbiByZWdpc3RlciBtYXAKKyAgICAgICAgICAgIChNYXliZSB0aGlzIGlzIGEgbWFjcm92aXNpb24gcmVnaXN0ZXI/KQorICAgICAgICovCiAjaWZuZGVmIFNJU19DUAotICAgICBTaVNfU2V0Q0g3MHh4KFNpU19QciwweDAwM0QpOworICAgICAgU2lTX1NldENINzB4eChTaVNfUHIsMHgzZCwweDAwKTsKICNlbmRpZgogCi0gICAgIC8qIFJlZ2lzdGVyIDB4MTAgb25seSBjb250YWlucyAxIHdyaXRhYmxlIGJpdCAoUzApIGZvciBzZW5zaW5nLAotICAgICAgICAgICAgYWxsIG90aGVyIGJpdHMgYSByZWFkLW9ubHkuIE1hY3JvdmlzaW9uPwotICAgICAgKi8KLSAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMTAsMHgxRik7CisgICAgICAvKiBSZWdpc3RlciAweDEwIG9ubHkgY29udGFpbnMgMSB3cml0YWJsZSBiaXQgKFMwKSBmb3Igc2Vuc2luZywKKyAgICAgICAgICAgICBhbGwgb3RoZXIgYml0cyBhIHJlYWQtb25seS4gTWFjcm92aXNpb24/CisgICAgICAgKi8KKyAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxMCwweDAwLDB4MUYpOwogCi0gICAgIC8qIFJlZ2lzdGVyIDB4MTEgb25seSBjb250YWlucyAzIHdyaXRhYmxlIGJpdHMgKFMwLVMyKSBmb3IKLSAgICAgICAgICAgIGNvbnRyYXN0IGVuaGFuY2VtZW50IChzZXQgdG8gMDEwIC0+IGdhaW4gMSBZb3V0ID0gMTcvMTYqKFlpbi0zMCkgKQotICAgICAgKi8KLSAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAyMTEsMHhGOCk7CisgICAgICAvKiBSZWdpc3RlciAweDExIG9ubHkgY29udGFpbnMgMyB3cml0YWJsZSBiaXRzIChTMC1TMikgZm9yCisgICAgICAgICAgICAgY29udHJhc3QgZW5oYW5jZW1lbnQgKHNldCB0byAwMTAgLT4gZ2FpbiAxIFlvdXQgPSAxNy8xNiooWWluLTMwKSApCisgICAgICAgKi8KKyAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxMSwweDAyLDB4RjgpOwogCi0gICAgIC8qIENsZWFyIERTRU4KLSAgICAgICovCi0gICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDFDLDB4RUYpOworICAgICAgLyogQ2xlYXIgRFNFTgorICAgICAgICovCisgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWMsMHgwMCwweEVGKTsKIAotICAgICBpZighKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSkgewkJLyogLS0tLSBOVFNDIC0tLS0gKi8KLSAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldENIT3ZlclNjYW4pIHsKLSAgICAgICAgIGlmKHJlc2luZGV4ID09IDB4MDQpIHsgICAJCQkvKiA2NDB4NDgwIG92ZXJzY2FuOiBNb2RlIDE2ICovCi0gICAgICAJICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMjAsMHhFRik7ICAgCS8qIGxvb3AgZmlsdGVyIG9mZiAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDEyMSwweEZFKTsgICAgICAvKiBBQ0lWIG9uLCBubyBuZWVkIHRvIHNldCBGU0NJICovCi0gICAgICAgICB9IGVsc2UgaWYocmVzaW5kZXggPT0gMHgwNSkgeyAgICAJCS8qIDgwMHg2MDAgb3ZlcnNjYW46IE1vZGUgMjMgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMTgsMHhGMCk7CS8qIDB4MTgtMHgxZjogRlNDSSA0NjksNzYyLDA0OCAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MEMxOSwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMUEsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDFCLDB4RjApOwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAxQywweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMUQsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDFFLDB4RjApOwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAxRiwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMjAsMHhFRik7ICAgICAgIC8qIExvb3AgZmlsdGVyIG9uIGZvciBtb2RlIDIzICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDIxLDB4RkUpOyAgICAgICAvKiBBQ0lWIG9mZiwgbmVlZCB0byBzZXQgRlNDSSAqLwotICAgICAgICAgfQotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7ICAgICAJCQkgLyogLS0tLS0gNjQweDQ4MCB1bmRlcnNjYW47IE1vZGUgMTcgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMjAsMHhFRik7IAkgLyogbG9vcCBmaWx0ZXIgb2ZmICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTIxLDB4RkUpOwotICAgICAgICAgfSBlbHNlIGlmKHJlc2luZGV4ID09IDB4MDUpIHsgICAJCSAvKiAtLS0tLSA4MDB4NjAwIHVuZGVyc2NhbjogTW9kZSAyNCAqLwotI2lmIDAKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMTgsMHhGMCk7ICAgICAgIC8qIChGU0NJIHdhcyAweDFmMWM3MWM3IC0gdGhpcyBpcyBmb3IgbW9kZSAyMikgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDA5MTksMHhGMCk7CSAvKiBGU0NJIGZvciBtb2RlIDI0IGlzIDQyOCw1NTQsODUxICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwODFBLDB4RjApOyAgICAgICAvKiAxOThiM2E2MyAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MGIxQiwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDA0MUMsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTFELDB4RjApOwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDYxRSwweEYwKTsKLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDA1MUYsMHhGMCk7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDIwLDB4RUYpOyAgICAgICAvKiBsb29wIGZpbHRlciBvZmYgZm9yIG1vZGUgMjQgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAwMjEsMHhGRSk7CSAvKiBBQ0lWIG9mZiwgbmVlZCB0byBzZXQgRlNDSSAqLwotI2VuZGlmICAgICAvKiBBbGwgYWx0ZXJuYXRpdmVzIHdyb25nIChkYXRhc2hlZXQgd3Jvbmc/KSwgZG9uJ3QgdXNlIEZTQ0kgKi8KLQkgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAyMCwweEVGKTsgCSAvKiBsb29wIGZpbHRlciBvZmYgKi8KLSAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDAxMjEsMHhGRSk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9IGVsc2UgewkJCQkJCS8qIC0tLS0gUEFMIC0tLS0gKi8KLSAgICAgICAgICAgLyogV2UgZG9uJ3QgcGxheSBhcm91bmQgd2l0aCBGU0NJIGluIFBBTCBtb2RlICovCi0gICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7Ci0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMDIwLDB4RUYpOyAJLyogbG9vcCBmaWx0ZXIgb2ZmICovCi0gICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTIxLDB4RkUpOyAgICAgIC8qIEFDSVYgb24gKi8KKyAgICAgIGlmKCEoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpKSB7CQkvKiAtLS0tIE5UU0MgLS0tLSAqLworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRDSE92ZXJTY2FuKSB7CisgICAgICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7ICAgCQkJLyogNjQweDQ4MCBvdmVyc2NhbjogTW9kZSAxNiAqLworICAgICAgCSAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MjAsMHgwMCwweEVGKTsJLyogbG9vcCBmaWx0ZXIgb2ZmICovCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MjEsMHgwMSwweEZFKTsJLyogQUNJViBvbiwgbm8gbmVlZCB0byBzZXQgRlNDSSAqLworICAgICAgICAgICAgfSBlbHNlIGlmKHJlc2luZGV4ID09IDB4MDUpIHsgICAgCQkvKiA4MDB4NjAwIG92ZXJzY2FuOiBNb2RlIDIzICovCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MTgsMHgwMSwweEYwKTsJLyogMHgxOC0weDFmOiBGU0NJIDQ2OSw3NjIsMDQ4ICovCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MTksMHgwQywweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxYSwweDAwLDB4RjApOworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFiLDB4MDAsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWMsMHgwMCwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxZCwweDAwLDB4RjApOworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFlLDB4MDAsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWYsMHgwMCwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMCwweDAxLDB4RUYpOwkvKiBMb29wIGZpbHRlciBvbiBmb3IgbW9kZSAyMyAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIxLDB4MDAsMHhGRSk7CS8qIEFDSVYgb2ZmLCBuZWVkIHRvIHNldCBGU0NJICovCisgICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDAyMCwweEVGKTsgCS8qIGxvb3AgZmlsdGVyIG9mZiAqLwotICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MDEyMSwweEZFKTsgICAgICAvKiBBQ0lWIG9uICovCisgICAgICAgICAgICBpZihyZXNpbmRleCA9PSAweDA0KSB7ICAgICAJCQkvKiAtLS0tLSA2NDB4NDgwIHVuZGVyc2NhbjsgTW9kZSAxNyAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIwLDB4MDAsMHhFRik7CS8qIGxvb3AgZmlsdGVyIG9mZiAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIxLDB4MDEsMHhGRSk7CisgICAgICAgICAgICB9IGVsc2UgaWYocmVzaW5kZXggPT0gMHgwNSkgeyAgIAkJLyogLS0tLS0gODAweDYwMCB1bmRlcnNjYW46IE1vZGUgMjQgKi8KKyNpZiAwCisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MTgsMHgwMSwweEYwKTsJLyogKEZTQ0kgd2FzIDB4MWYxYzcxYzcgLSB0aGlzIGlzIGZvciBtb2RlIDIyKSAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDE5LDB4MDksMHhGMCk7CS8qIEZTQ0kgZm9yIG1vZGUgMjQgaXMgNDI4LDU1NCw4NTEgKi8KKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxYSwweDA4LDB4RjApOyAgICAgICAvKiAxOThiM2E2MyAqLworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFiLDB4MGIsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWMsMHgwNCwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgxZCwweDAxLDB4RjApOworICAgICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDFlLDB4MDYsMHhGMCk7CisgICAgICAgICAgICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MWYsMHgwNSwweEYwKTsKKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMCwweDAwLDB4RUYpOwkvKiBsb29wIGZpbHRlciBvZmYgZm9yIG1vZGUgMjQgKi8KKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMSwweDAwLDB4RkUpOwkqIEFDSVYgb2ZmLCBuZWVkIHRvIHNldCBGU0NJICovCisjZW5kaWYgICAgICAgICAvKiBBbGwgYWx0ZXJuYXRpdmVzIHdyb25nIChkYXRhc2hlZXQgd3Jvbmc/KSwgZG9uJ3QgdXNlIEZTQ0kgKi8KKwkgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIwLDB4MDAsMHhFRik7CSAvKiBsb29wIGZpbHRlciBvZmYgKi8KKyAgICAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMSwweDAxLDB4RkUpOworICAgICAgICAgICAgfQogICAgICAgICAgfQotICAgICB9Ci0gICAgIAorICAgICAgfSBlbHNlIHsJCQkJCQkvKiAtLS0tIFBBTCAtLS0tICovCisgICAgICAgICAvKiBXZSBkb24ndCBwbGF5IGFyb3VuZCB3aXRoIEZTQ0kgaW4gUEFMIG1vZGUgKi8KKyAgICAgICAgIGlmKHJlc2luZGV4ID09IDB4MDQpIHsKKyAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMCwweDAwLDB4RUYpOwkvKiBsb29wIGZpbHRlciBvZmYgKi8KKyAgICAgICAgICAgIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgyMSwweDAxLDB4RkUpOwkvKiBBQ0lWIG9uICovCisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIwLDB4MDAsMHhFRik7CS8qIGxvb3AgZmlsdGVyIG9mZiAqLworICAgICAgICAgICAgU2lTX1NldENINzB4eEFORE9SKFNpU19QciwweDIxLDB4MDEsMHhGRSk7CS8qIEFDSVYgb24gKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKwogI2VuZGlmICAvKiAzMDAgKi8KIAotICB9IGVsc2UgeworICAgfSBlbHNlIHsKIAotICAgICAvKiBDaHJvbnRlbCA3MDE5IC0gYXNzdW1lZCB0aGF0IGl0IGRvZXMgbm90IGNvbWUgd2l0aCBhIDMwMCBzZXJpZXMgY2hpcCAqLworICAgICAgLyogQ2hyb250ZWwgNzAxOSAtIGFzc3VtZWQgdGhhdCBpdCBkb2VzIG5vdCBjb21lIHdpdGggYSAzMDAgc2VyaWVzIGNoaXAgKi8KIAogI2lmZGVmIFNJUzMxNUgKIAotICAgICAvKiBXZSBkb24ndCBzdXBwb3J0IG1vZGVzID4xMDI0eDc2OCAqLwotICAgICBpZiAocmVzaW5kZXggPiA2KSByZXR1cm47CisgICAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzBdOwotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldE5UU0NKKSB7Ci0gICAgICAgIHRlbXAgfD0gMHgxMDsKLSAgICAgfQotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MDA7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7CisgICAgICAvKiBXZSBkb24ndCBzdXBwb3J0IG1vZGVzID4xMDI0eDc2OCAqLworICAgICAgaWYgKHJlc2luZGV4ID4gNikgcmV0dXJuOwogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzFdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MDE7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7CisgICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1swXTsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opIHRlbXAgfD0gMHgxMDsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDAsdGVtcCk7CiAKLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMl07Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwMjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDEsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1sxXSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAyLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMl0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwNCxDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzNdKTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDMsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s0XSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDA1LENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbNV0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwNixDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzZdKTsKIAotICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1szXTsKLSAgICAgdGVtcGJ4PSgodGVtcCAmIDB4MDBGRikgPDwgOCkgfCAweDA0OwotICAgICBTaVNfU2V0Q0g3MDF4KFNpU19Qcix0ZW1wYngpOworICAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbN107CisgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldE5UU0NKKSB0ZW1wID0gMHg2NjsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDcsdGVtcCk7CiAKLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbNF07Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwMzsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDgsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s4XSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDE1LENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbOV0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgxZixDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzEwXSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDBjLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTFdKTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MGQsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1sxMl0pOworICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwZSxDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzEzXSk7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDBmLENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTRdKTsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MTAsQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1sxNV0pOwogCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzVdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MDU7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbNl07Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwNjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKLQotICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s3XTsKLSAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXROVFNDSikgewotCXRlbXAgPSAweDY2OwotICAgICB9Ci0gICAgIHRlbXBieD0oKHRlbXAgJiAweDAwRkYpIDw8IDgpIHwgMHgwNzsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsdGVtcGJ4KTsKLQotICAgICB0ZW1wID0gQ0hUVlJlZ0RhdGFbcmVzaW5kZXhdLlJlZ1s4XTsKLSAgICAgdGVtcGJ4PSgodGVtcCAmIDB4MDBGRikgPDwgOCkgfCAweDA4OwotICAgICBTaVNfU2V0Q0g3MDF4KFNpU19Qcix0ZW1wYngpOwotCi0gICAgIHRlbXAgPSBDSFRWUmVnRGF0YVtyZXNpbmRleF0uUmVnWzldOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MTU7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTBdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MWY7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTFdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGM7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTJdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGQ7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTNdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGU7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTRdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MGY7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IENIVFZSZWdEYXRhW3Jlc2luZGV4XS5SZWdbMTVdOwotICAgICB0ZW1wYng9KCh0ZW1wICYgMHgwMEZGKSA8PCA4KSB8IDB4MTA7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7Ci0KLSAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MjEpICYgfjB4MDI7Ci0gICAgIC8qIEQxIHNob3VsZCBiZSBzZXQgZm9yIFBBTCwgUEFMLU4gYW5kIE5UU0MtSiwKLSAgICAgICAgYnV0IEkgd29uJ3QgZG8gdGhhdCBmb3IgUEFMIHVubGVzcyBzb21lYm9keQotCXRlbGxzIG1lIHRvIGRvIHNvLiBTaW5jZSB0aGUgQklPUyB1c2VzCi0Jbm9uLWRlZmF1bHQgQ0lWIHZhbHVlcyBhbmQgYmxhY2tsZXZlbHMsCi0JdGhpcyBtaWdodCBiZSBjb21wZW5zYXRlZCBhbnl3YXkuCi0gICAgICAqLwotICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRQQUxOIHwgVFZTZXROVFNDSikpIHRlbXAgfD0gMHgwMjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKCh0ZW1wIDw8IDgpIHwgMHgyMSkpOworICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MjEpICYgfjB4MDI7CisgICAgICAvKiBEMSBzaG91bGQgYmUgc2V0IGZvciBQQUwsIFBBTC1OIGFuZCBOVFNDLUosCisgICAgICAgICBidXQgSSB3b24ndCBkbyB0aGF0IGZvciBQQUwgdW5sZXNzIHNvbWVib2R5CisJIHRlbGxzIG1lIHRvIGRvIHNvLiBTaW5jZSB0aGUgQklPUyB1c2VzCisJIG5vbi1kZWZhdWx0IENJViB2YWx1ZXMgYW5kIGJsYWNrbGV2ZWxzLAorCSB0aGlzIG1pZ2h0IGJlIGNvbXBlbnNhdGVkIGFueXdheS4KKyAgICAgICAqLworICAgICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0UEFMTiB8IFRWU2V0TlRTQ0opKSB0ZW1wIHw9IDB4MDI7CisgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDIxLHRlbXApOwogCiAjZW5kaWYJLyogMzE1ICovCiAKLSAgfQorICAgfQogCiAjaWZkZWYgU0lTX0NQCi0gIFNJU19DUF9JTklUMzAxX0NQMworICAgU0lTX0NQX0lOSVQzMDFfQ1AzCiAjZW5kaWYKIAogfQogCi12b2lkCi1TaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQotewotICBVU0hPUlQgdGVtcDsKLQotICAvKiBFbmFibGUgQ2hyb250ZWwgNzAxOSBMQ0QgcGFuZWwgYmFja2xpZ2h0ICovCi0gIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9DSDcweHggPT0gMikgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjU2Nik7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKLSAgICAgICAgdGVtcCB8PSAweDIwOwotCVNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2Nik7Ci0gICAgIH0KLSAgfQotfQotCi12b2lkCi1TaVNfQ2hyb250ZWw3MDF4QkxPZmYoU2lTX1ByaXZhdGUgKlNpU19QcikKLXsKLSAgVVNIT1JUIHRlbXA7Ci0KLSAgLyogRGlzYWJsZSBDaHJvbnRlbCA3MDE5IExDRCBwYW5lbCBiYWNrbGlnaHQgKi8KLSAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAyKSB7Ci0gICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKLSAgICAgdGVtcCAmPSAweERGOwotICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NjYpOwotICB9Ci19Ci0KICNpZmRlZiBTSVMzMTVIICAvKiAtLS0tLS0tLS0tLSAzMTUgc2VyaWVzIG9ubHkgLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZAotU2lTX0Nocm9udGVsUG93ZXJTZXF1ZW5jaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCit2b2lkCitTaVNfQ2hyb250ZWw3MDF4QkxPbihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVUNIQVIgcmVndGFibGVbXSAgICAgID0geyAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiIH07Ci0gIFVDSEFSIHRhYmxlMTAyNF83NDBbXSA9IHsgMHgwMSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMSB9OwotICBVQ0hBUiB0YWJsZTE0MDBfNzQwW10gPSB7IDB4MDEsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDEgfTsKLSAgVUNIQVIgYXN1czEwMjRfNzQwW10gID0geyAweDE5LCAweDZlLCAweDAxLCAweDE5LCAweDA5IH07Ci0gIFVDSEFSIGFzdXMxNDAwXzc0MFtdICA9IHsgMHgxOSwgMHg2ZSwgMHgwMSwgMHgxOSwgMHgwOSB9OwotICBVQ0hBUiB0YWJsZTEwMjRfNjUwW10gPSB7IDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxNDAwXzY1MFtdID0geyAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyIH07Ci0gIFVDSEFSICp0YWJsZXB0ciA9IE5VTEw7CisgICB1bnNpZ25lZCBzaG9ydCB0ZW1wOworCisgICAvKiBFbmFibGUgQ2hyb250ZWwgNzAxOSBMQ0QgcGFuZWwgYmFja2xpZ2h0ICovCisgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKyAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgeworCSBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LDB4NjUpOworICAgICAgfSBlbHNlIHsKKwkgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjYpOworCSB0ZW1wIHw9IDB4MjA7CisJIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjYsdGVtcCk7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQKK1NpU19DaHJvbnRlbDcwMXhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKK3sKKyAgIHVuc2lnbmVkIHNob3J0IHRlbXA7CisKKyAgIC8qIERpc2FibGUgQ2hyb250ZWwgNzAxOSBMQ0QgcGFuZWwgYmFja2xpZ2h0ICovCisgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKyAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDY2KTsKKyAgICAgIHRlbXAgJj0gMHhERjsKKyAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjYsdGVtcCk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkCitTaVNfQ2hyb250ZWxQb3dlclNlcXVlbmNpbmcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCit7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJlZ3RhYmxlW10gICAgICA9IHsgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZTEwMjRfNzQwW10gPSB7IDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxNDAwXzc0MFtdID0geyAweDAxLCAweDZlLCAweDAxLCAweDAxLCAweDAxIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFzdXMxMDI0Xzc0MFtdICA9IHsgMHgxOSwgMHg2ZSwgMHgwMSwgMHgxOSwgMHgwOSB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc3VzMTQwMF83NDBbXSAgPSB7IDB4MTksIDB4NmUsIDB4MDEsIDB4MTksIDB4MDkgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxMDI0XzY1MFtdID0geyAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTQwMF82NTBbXSA9IHsgMHgwMSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMiB9OworICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZXB0ciA9IE5VTEw7CiAgIGludCBpOwogCiAgIC8qIFNldCB1cCBQb3dlciB1cC9kb3duIHRpbWluZyAqLwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQVNVU0wzMDAwRCkgdGFibGVwdHIgPSBhc3VzMTAyNF83NDA7Ci0gICAgICAgIGVsc2UgICAgCQkJICAgICAgICAgIHRhYmxlcHRyID0gdGFibGUxMDI0Xzc0MDsKKwlpZihTaVNfUHItPlNpU19DdXN0b21UID09IENVVF9BU1VTTDMwMDBEKSB0YWJsZXB0ciA9IGFzdXMxMDI0Xzc0MDsKKwllbHNlICAgIAkJCSAgICAgICAgICB0YWJsZXB0ciA9IHRhYmxlMTAyNF83NDA7CiAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMjgweDEwMjQpIHx8Ci0gICAgICAgICAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHx8CisJICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgfHwKIAkgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSkgewogCWlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0FTVVNMMzAwMEQpIHRhYmxlcHRyID0gYXN1czE0MDBfNzQwOwogICAgICAgICBlbHNlCQkJCQkgIHRhYmxlcHRyID0gdGFibGUxNDAwXzc0MDsKICAgICAgfSBlbHNlIHJldHVybjsKICAgfSBlbHNlIHsKICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xMDI0eDc2OCkgewotICAgICAgICB0YWJsZXB0ciA9IHRhYmxlMTAyNF82NTA7CisJdGFibGVwdHIgPSB0YWJsZTEwMjRfNjUwOwogICAgICB9IGVsc2UgaWYoKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTI4MHgxMDI0KSB8fAotICAgICAgICAgICAgICAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSB8fAorCSAgICAgICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNDAweDEwNTApIHx8CiAJICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2MDB4MTIwMCkpIHsKLSAgICAgICAgdGFibGVwdHIgPSB0YWJsZTE0MDBfNjUwOworCXRhYmxlcHRyID0gdGFibGUxNDAwXzY1MDsKICAgICAgfSBlbHNlIHJldHVybjsKICAgfQogCiAgIGZvcihpPTA7IGk8NTsgaSsrKSB7Ci0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0YWJsZXB0cltpXSA8PCA4KSB8IHJlZ3RhYmxlW2ldKTsKKyAgICAgU2lTX1NldENINzAxeChTaVNfUHIsIHJlZ3RhYmxlW2ldLCB0YWJsZXB0cltpXSk7CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZXRDSDcwMXhGb3JMQ0QoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TZXRDSDcwMXhGb3JMQ0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSIHJlZ3RhYmxlW10gICAgICA9IHsgMHgxYywgMHg1ZiwgMHg2NCwgMHg2ZiwgMHg3MCwgMHg3MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcyLCAweDczLCAweDc0LCAweDc2LCAweDc4LCAweDdkLCAweDY2IH07Ci0gIFVDSEFSIHRhYmxlMTAyNF83NDBbXSA9IHsgMHg2MCwgMHgwMiwgMHgwMCwgMHgwNywgMHg0MCwgMHhlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEzLCAweGM4LCAweGM3LCAweGFjLCAweGUwLCAweDAyLCAweDQ0IH07Ci0gIFVDSEFSIHRhYmxlMTI4MF83NDBbXSA9IHsgMHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKLSAgIAkJCSAgICAweGFkLCAweGRiLCAweGY2LCAweGFjLCAweGUwLCAweDAyLCAweDQ0IH07Ci0gIFVDSEFSIHRhYmxlMTQwMF83NDBbXSA9IHsgMHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFkLCAweGRiLCAweGY2LCAweGFjLCAweGUwLCAweDAyLCAweDQ0IH07Ci0gIFVDSEFSIHRhYmxlMTYwMF83NDBbXSA9IHsgMHg2MCwgMHgwNCwgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKLSAgCQkJICAgIDB4YWQsIDB4ZGUsIDB4ZjYsIDB4YWMsIDB4NjAsIDB4MWEsIDB4NDQgfTsKLSAgVUNIQVIgdGFibGUxMDI0XzY1MFtdID0geyAweDYwLCAweDAyLCAweDAwLCAweDA3LCAweDQwLCAweGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTMsIDB4YzgsIDB4YzcsIDB4YWMsIDB4NjAsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxMjgwXzY1MFtdID0geyAweDYwLCAweDAzLCAweDExLCAweDAwLCAweDQwLCAweGUzLAotICAgCQkgICAJICAgIDB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4ZTAsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxNDAwXzY1MFtdID0geyAweDYwLCAweDAzLCAweDExLCAweDAwLCAweDQwLCAweGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4NjAsIDB4MDIgfTsKLSAgVUNIQVIgdGFibGUxNjAwXzY1MFtdID0geyAweDYwLCAweDA0LCAweDExLCAweDAwLCAweDQwLCAweGUzLAotICAJCQkgICAgMHhhZCwgMHhkZSwgMHhmNiwgMHhhYywgMHg2MCwgMHgxYSB9OwotICBVQ0hBUiAqdGFibGVwdHIgPSBOVUxMOwotICBVU0hPUlQgdGVtcGJoOworICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWJsZXB0ciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IHRlbXBiaDsKICAgaW50IGk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJlZ3RhYmxlW10gPSB7CisJCTB4MWMsIDB4NWYsIDB4NjQsIDB4NmYsIDB4NzAsIDB4NzEsCisJCTB4NzIsIDB4NzMsIDB4NzQsIDB4NzYsIDB4NzgsIDB4N2QsIDB4NjYKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxMDI0Xzc0MFtdID0geworCQkweDYwLCAweDAyLCAweDAwLCAweDA3LCAweDQwLCAweGVkLAorCQkweGEzLCAweGM4LCAweGM3LCAweGFjLCAweGUwLCAweDAyLCAweDQ0CisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTI4MF83NDBbXSA9IHsKKwkJMHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKKwkJMHhhZCwgMHhkYiwgMHhmNiwgMHhhYywgMHhlMCwgMHgwMiwgMHg0NAorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZTE0MDBfNzQwW10gPSB7CisJCTB4NjAsIDB4MDMsIDB4MTEsIDB4MDAsIDB4NDAsIDB4ZTMsCisJCTB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4ZTAsIDB4MDIsIDB4NDQKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxNjAwXzc0MFtdID0geworCQkweDYwLCAweDA0LCAweDExLCAweDAwLCAweDQwLCAweGUzLAorCQkweGFkLCAweGRlLCAweGY2LCAweGFjLCAweDYwLCAweDFhLCAweDQ0CisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTAyNF82NTBbXSA9IHsKKwkJMHg2MCwgMHgwMiwgMHgwMCwgMHgwNywgMHg0MCwgMHhlZCwKKwkJMHhhMywgMHhjOCwgMHhjNywgMHhhYywgMHg2MCwgMHgwMgorICB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZTEyODBfNjUwW10gPSB7CisJCTB4NjAsIDB4MDMsIDB4MTEsIDB4MDAsIDB4NDAsIDB4ZTMsCisJCTB4YWQsIDB4ZGIsIDB4ZjYsIDB4YWMsIDB4ZTAsIDB4MDIKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGUxNDAwXzY1MFtdID0geworCQkweDYwLCAweDAzLCAweDExLCAweDAwLCAweDQwLCAweGVmLAorCQkweGFkLCAweGRiLCAweGY2LCAweGFjLCAweDYwLCAweDAyCisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlMTYwMF82NTBbXSA9IHsKKwkJMHg2MCwgMHgwNCwgMHgxMSwgMHgwMCwgMHg0MCwgMHhlMywKKwkJMHhhZCwgMHhkZSwgMHhmNiwgMHhhYywgMHg2MCwgMHgxYQorICB9OwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpICAgICAgIHRhYmxlcHRyID0gdGFibGUxMDI0Xzc0MDsKICAgICAgZWxzZSBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4MTAyNCkgdGFibGVwdHIgPSB0YWJsZTEyODBfNzQwOwogICAgICBlbHNlIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSB0YWJsZXB0ciA9IHRhYmxlMTQwMF83NDA7CkBAIC04NDk5LDEzOCArODMyMCwxMzkgQEAKICAgICAgfQogICB9CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgdGVtcGJoID0gMHgwZDsKLSAgZWxzZSAgICAgCQkJICAgdGVtcGJoID0gMHgwYzsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB0ZW1wYmggPSAweDBkOworICBlbHNlICAgICAJCQkgIHRlbXBiaCA9IDB4MGM7CiAKICAgZm9yKGkgPSAwOyBpIDwgdGVtcGJoOyBpKyspIHsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRhYmxlcHRyW2ldIDw8IDgpIHwgcmVndGFibGVbaV0pOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwgcmVndGFibGVbaV0sIHRhYmxlcHRyW2ldKTsKICAgfQotICBTaVNfQ2hyb250ZWxQb3dlclNlcXVlbmNpbmcoU2lTX1ByLEh3SW5mbyk7CisgIFNpU19DaHJvbnRlbFBvd2VyU2VxdWVuY2luZyhTaVNfUHIpOwogICB0ZW1wYmggPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDFlKTsKICAgdGVtcGJoIHw9IDB4YzA7Ci0gIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wYmggPDwgOCkgfCAweDFlKTsKKyAgU2lTX1NldENINzAxeChTaVNfUHIsMHgxZSx0ZW1wYmgpOwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgIHRlbXBiaCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MWMpOwogICAgICB0ZW1wYmggJj0gMHhmYjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXBiaCA8PCA4KSB8IDB4MWMpOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDFjLHRlbXBiaCk7CiAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmQsMHgwMyk7CiAgICAgIHRlbXBiaCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjQpOwogICAgICB0ZW1wYmggfD0gMHg0MDsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXBiaCA8PCA4KSB8IDB4NjQpOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY0LHRlbXBiaCk7CiAgICAgIHRlbXBiaCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MDMpOwogICAgICB0ZW1wYmggJj0gMHgzZjsKLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXBiaCA8PCA4KSB8IDB4MDMpOworICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAzLHRlbXBiaCk7CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbFJlc2V0VlN5bmMoU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19DaHJvbnRlbFJlc2V0VlN5bmMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgIHVuc2lnbmVkIGNoYXIgdGVtcCwgdGVtcDE7CiAKICAgdGVtcDEgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDQ5KTsKLSAgU2lTX1NldENINzAxeChTaVNfUHIsMHgzZTQ5KTsKKyAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSwweDNlKTsKICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NDcpOwogICB0ZW1wICY9IDB4N2Y7CS8qIFVzZSBleHRlcm5hbCBWU1lOQyAqLwotICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NDcpOwotICBTaVNfTG9uZ0RlbGF5KFNpU19QciwzKTsKKyAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0Nyx0ZW1wKTsKKyAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDMpOwogICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0Nyk7CiAgIHRlbXAgfD0gMHg4MDsJLyogVXNlIGludGVybmFsIFZTWU5DICovCi0gIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg0Nyk7Ci0gIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wMSA8PCA4KSB8IDB4NDkpOworICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ3LHRlbXApOworICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LHRlbXAxKTsKIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbDcwMXhPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0Nocm9udGVsNzAxeE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgdGVtcDsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAogICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID09IFNJU183NDApIHsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MWMpOwogICAgICAgICB0ZW1wIHw9IDB4MDQ7CS8qIEludmVydCBYQ0xLIHBoYXNlICovCi0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHgxYyk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MWMsdGVtcCk7CiAgICAgIH0KLSAgICAgaWYoU2lTX0lzWVBiUHIoU2lTX1ByLCBId0luZm8pKSB7CisgICAgIGlmKFNpU19Jc1lQYlByKFNpU19QcikpIHsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MDEpOwogCXRlbXAgJj0gMHgzZjsKIAl0ZW1wIHw9IDB4ODA7CS8qIEVuYWJsZSBZUHJQYiAoSERUVikgKi8KLQlTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4MDEpOworCVNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDEsdGVtcCk7CiAgICAgIH0KLSAgICAgaWYoU2lTX0lzQ2hTY2FydChTaVNfUHIsIEh3SW5mbykpIHsKKyAgICAgaWYoU2lTX0lzQ2hTY2FydChTaVNfUHIpKSB7CiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDAxKTsKIAl0ZW1wICY9IDB4M2Y7CiAJdGVtcCB8PSAweGMwOwkvKiBFbmFibGUgU0NBUlQgKyBDVkJTICovCi0JU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDAxKTsKKwlTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAxLHRlbXApOwogICAgICB9Ci0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CiAgICAgICAgIFNpU19DaHJvbnRlbFJlc2V0VlN5bmMoU2lTX1ByKTsKLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgyMDQ5KTsgICAvKiBFbmFibGUgVFYgcGF0aCAqLworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LDB4MjApOyAgIC8qIEVuYWJsZSBUViBwYXRoICovCiAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MjA0OSk7ICAgLyogRW5hYmxlIFRWIHBhdGggKi8KKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSwweDIwKTsgICAvKiBFbmFibGUgVFYgcGF0aCAqLwogICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0OSk7Ci0gICAgICAgIGlmKFNpU19Jc1lQYlByKFNpU19QcixId0luZm8pKSB7CisgICAgICAgIGlmKFNpU19Jc1lQYlByKFNpU19QcikpIHsKICAgICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NzMpOwogCSAgIHRlbXAgfD0gMHg2MDsKLQkgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NzMpOworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzMsdGVtcCk7CiAgICAgICAgIH0KICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NDcpOwogICAgICAgICB0ZW1wICY9IDB4N2Y7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg0Nyk7Ci0gICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDIpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ3LHRlbXApOworICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMik7CiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDQ3KTsKICAgICAgICAgdGVtcCB8PSAweDgwOwotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NDcpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ3LHRlbXApOwogICAgICB9CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbDcwMXhPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DaHJvbnRlbDcwMXhPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB0ZW1wOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCiAgIC8qIENvbXBsZXRlIHBvd2VyIGRvd24gb2YgTFZEUyAqLwogICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgewotICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwxKTsKLQlTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwweDE2ZmYpOwotCVNpU19TZXRDSDcwMXgoU2lTX1ByLDB4YWM3Nik7Ci0JU2lTX1NldENINzAxeChTaVNfUHIsMHgwMDY2KTsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLCAxKTsKKwlTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNTg4Nyk7CisJU2lTX1NldENINzAxeChTaVNfUHIsMHg3NiwweGFjKTsKKwlTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LDB4MDApOwogICAgICB9IGVsc2UgewotICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwyKTsKKyAgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDIpOwogCXRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDc2KTsKIAl0ZW1wICY9IDB4ZmM7Ci0JU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDc2KTsKLQlTaVNfU2V0Q0g3MDF4KFNpU19QciwweDAwNjYpOworCVNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsdGVtcCk7CisJU2lTX1NldENINzAxeChTaVNfUHIsMHg2NiwweDAwKTsKICAgICAgfQogICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfQ2hyb250ZWxSZXNldERCKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfQ2hyb250ZWxSZXNldERCKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgICBVU0hPUlQgdGVtcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDRhKTsgIC8qIFZlcnNpb24gSUQgKi8KICAgICAgICAgdGVtcCAmPSAweDAxOwogICAgICAgICBpZighdGVtcCkgewogCi0gICAgICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcixId0luZm8pKSB7CisgICAgICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcikpIHsKIAkgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0OSk7Ci0JICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgzZTQ5KTsKKwkgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ5LDB4M2UpOwogCSAgIH0KLQkgICAvKiBSZXNldCBDaHJvbnRlbCA3MDE5IGRhdGFwYXRoICovCi0gICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MTA0OCk7Ci0gICAgICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDEpOwotICAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDE4NDgpOwogCi0JICAgaWYoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLCBId0luZm8pKSB7CisJICAgLyogUmVzZXQgQ2hyb250ZWwgNzAxOSBkYXRhcGF0aCAqLworICAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ4LDB4MTApOworICAgICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMSk7CisgICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDgsMHgxOCk7CisKKwkgICBpZihTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSB7CiAJICAgICAgU2lTX0Nocm9udGVsUmVzZXRWU3luYyhTaVNfUHIpOwotCSAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg0OSk7CisJICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OSx0ZW1wKTsKIAkgICB9CiAKICAgICAgICAgfSBlbHNlIHsKQEAgLTg2MzgsNzIgKzg0NjAsNzIgQEAKIAkgICAvKiBDbGVhci9zZXQvY2xlYXIgR1BJTyAqLwogICAgICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg1Yyk7CiAJICAgdGVtcCAmPSAweGVmOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg1Yyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg1Yyx0ZW1wKTsKIAkgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg1Yyk7CiAJICAgdGVtcCB8PSAweDEwOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg1Yyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg1Yyx0ZW1wKTsKIAkgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg1Yyk7CiAJICAgdGVtcCAmPSAweGVmOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg1Yyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg1Yyx0ZW1wKTsKIAkgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg2MSk7CiAJICAgaWYoIXRlbXApIHsKLQkgICAgICBTaVNfU2V0Q0g3MDF4Rm9yTENEKFNpU19QciwgSHdJbmZvKTsKKwkgICAgICBTaVNfU2V0Q0g3MDF4Rm9yTENEKFNpU19Qcik7CiAJICAgfQogICAgICAgICB9CiAKICAgICAgfSBlbHNlIHsgLyogNjUwICovCiAgICAgICAgIC8qIFJlc2V0IENocm9udGVsIDcwMTkgZGF0YXBhdGggKi8KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgxMDQ4KTsKLSAgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsMSk7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MTg0OCk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDgsMHgxMCk7CisgICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLCAxKTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg0OCwweDE4KTsKICAgICAgfQogfQogCiBzdGF0aWMgdm9pZAotU2lTX0Nocm9udGVsSW5pdFRWVlN5bmMoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DaHJvbnRlbEluaXRUVlZTeW5jKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgICBVU0hPUlQgdGVtcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCi0gICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcixId0luZm8pKSB7CisgICAgICAgIGlmKFNpU19XZUhhdmVCYWNrbGlnaHRDdHJsKFNpU19QcikpIHsKICAgICAgICAgICAgU2lTX0Nocm9udGVsUmVzZXRWU3luYyhTaVNfUHIpOwogICAgICAgICB9CiAKICAgICAgfSBlbHNlIHsKIAotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweGFmNzYpOyAgLyogUG93ZXIgdXAgTFZEUyBibG9jayAqLworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDc2LDB4YWYpOyAgLyogUG93ZXIgdXAgTFZEUyBibG9jayAqLwogICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg0OSk7CiAgICAgICAgIHRlbXAgJj0gMTsKICAgICAgICAgaWYodGVtcCAhPSAxKSB7ICAvKiBUViBibG9jayBwb3dlcmVkPyAoMCA9IHllcywgMSA9IG5vKSAqLwogCSAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDQ3KTsKIAkgICB0ZW1wICY9IDB4NzA7Ci0JICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDQ3KTsgIC8qIGVuYWJsZSBWU1lOQyAqLwotCSAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDMpOworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDcsdGVtcCk7ICAvKiBlbmFibGUgVlNZTkMgKi8KKwkgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMyk7CiAJICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NDcpOwogCSAgIHRlbXAgfD0gMHg4MDsKLQkgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NDcpOyAgLyogZGlzYWJsZSBWU1lOQyAqLworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NDcsdGVtcCk7ICAvKiBkaXNhYmxlIFZTWU5DICovCiAgICAgICAgIH0KIAogICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCi1TaVNfQ2hyb250ZWxEb1NvbWV0aGluZzMoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19DaHJvbnRlbERvU29tZXRoaW5nMyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICAgICBVU0hPUlQgdGVtcCx0ZW1wMTsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcCx0ZW1wMTsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDYxKTsKICAgICAgICAgaWYodGVtcCA8IDEpIHsKICAgICAgICAgICAgdGVtcCsrOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2MSk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2MSx0ZW1wKTsKICAgICAgICAgfQotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQ1NjYpOyAgLyogUGFuZWwgcG93ZXIgb24gKi8KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhZjc2KTsgIC8qIEFsbCBwb3dlciBvbiAqLwotICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwxKTsKLSAgICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsMHgxNmZmKTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2NiwweDQ1KTsgIC8qIFBhbmVsIHBvd2VyIG9uICovCisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsMHhhZik7ICAvKiBBbGwgcG93ZXIgb24gKi8KKyAgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDEpOworICAgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNTg4Nyk7CiAKICAgICAgfSBlbHNlIHsgIC8qIDY1MCAqLwogCkBAIC04NzExLDM4ICs4NTMzLDM4IEBACiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDYxKTsKICAgICAgICAgaWYodGVtcCA8IDIpIHsKICAgICAgICAgICAgdGVtcCsrOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2MSk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2MSx0ZW1wKTsKIAkgICB0ZW1wMSA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhYzc2KTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg3NiwweGFjKTsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjYpOwogICAgICAgICB0ZW1wIHw9IDB4NWY7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2Nik7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjYsdGVtcCk7CiAgICAgICAgIGlmKE1vZGVObyA+IDB4MTMpIHsKLSAgICAgICAgICAgaWYoU2lTX1dlSGF2ZUJhY2tsaWdodEN0cmwoU2lTX1ByLCBId0luZm8pKSB7Ci0JICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsMHgzZmYpOworICAgICAgICAgICBpZihTaVNfV2VIYXZlQmFja2xpZ2h0Q3RybChTaVNfUHIpKSB7CisJICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsIDEwMjMpOwogCSAgIH0gZWxzZSB7Ci0JICAgICAgU2lTX0dlbmVyaWNEZWxheShTaVNfUHIsMHgyZmYpOworCSAgICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLCA3NjcpOwogCSAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYoIXRlbXAxKQotCSAgICAgIFNpU19HZW5lcmljRGVsYXkoU2lTX1ByLDB4MmZmKTsKKwkgICAgICBTaVNfR2VuZXJpY0RlbGF5KFNpU19QciwgNzY3KTsKICAgICAgICAgfQogICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg3Nik7CiAgICAgICAgIHRlbXAgfD0gMHgwMzsKLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDc2KTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg3Nix0ZW1wKTsKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjYpOwogICAgICAgICB0ZW1wICY9IDB4N2Y7Ci0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2Nik7Ci0gICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDEpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDY2LHRlbXApOworICAgICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMSk7CiAKICAgICAgfQogfQogCiBzdGF0aWMgdm9pZAotU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICAgIFVTSE9SVCB0ZW1wLHRlbXBjbCx0ZW1wY2g7CisgICAgIHVuc2lnbmVkIHNob3J0IHRlbXAsdGVtcGNsLHRlbXBjaDsKIAogICAgICBTaVNfTG9uZ0RlbGF5KFNpU19QciwgMSk7CiAgICAgIHRlbXBjbCA9IDM7CkBAIC04NzUzLDg3ICs4NTc1LDg3IEBACiAgICAgICAgdGVtcCAmPSAweDA0OyAgLyogUExMIHN0YWJsZT8gLT4gYmFpbCBvdXQgKi8KICAgICAgICBpZih0ZW1wID09IDB4MDQpIGJyZWFrOwogCi0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgeworICAgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogICAgICAgICAgIC8qIFBvd2VyIGRvd24gTFZEUyBvdXRwdXQsIFBMTCBub3JtYWwgb3BlcmF0aW9uICovCi0gICAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhYzc2KTsKKyAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDc2LDB4YWMpOwogICAgICAgIH0KIAotICAgICAgIFNpU19TZXRDSDcwMXhGb3JMQ0QoU2lTX1ByLEh3SW5mbyk7CisgICAgICAgU2lTX1NldENINzAxeEZvckxDRChTaVNfUHIpOwogCiAgICAgICAgaWYodGVtcGNsID09IDApIHsKICAgICAgICAgICAgaWYodGVtcGNoID09IDMpIGJyZWFrOwotCSAgIFNpU19DaHJvbnRlbFJlc2V0REIoU2lTX1ByLEh3SW5mbyk7CisJICAgU2lTX0Nocm9udGVsUmVzZXREQihTaVNfUHIpOwogCSAgIHRlbXBjbCA9IDM7CiAJICAgdGVtcGNoKys7CiAgICAgICAgfQogICAgICAgIHRlbXBjbC0tOwogICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDc2KTsKICAgICAgICB0ZW1wICY9IDB4ZmI7ICAvKiBSZXNldCBQTEwgKi8KLSAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4NzYpOwotICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDIpOworICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsdGVtcCk7CisgICAgICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDIpOwogICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDc2KTsKICAgICAgICB0ZW1wIHw9IDB4MDQ7ICAvKiBQTEwgbm9ybWFsIG9wZXJhdGlvbiAqLwotICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg3Nik7Ci0gICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzc0MCkgewotICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4ZTA3OCk7CS8qIFBMTCBsb29wIGZpbHRlciAqLworICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsdGVtcCk7CisgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg3OCwweGUwKTsJLyogUExMIGxvb3AgZmlsdGVyICovCiAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDYwNzgpOworICAgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzgsMHg2MCk7CiAgICAgICAgfQotICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLDIpOworICAgICAgIFNpU19Mb25nRGVsYXkoU2lTX1ByLCAyKTsKICAgICB9IHdoaWxlKDApOwogCi0gICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMDc3KTsgIC8qIE1WPyAqLworICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzcsMHgwMCk7ICAvKiBNVj8gKi8KIH0KIAogc3RhdGljIHZvaWQKLVNpU19DaHJvbnRlbERvU29tZXRoaW5nMShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgICBVU0hPUlQgdGVtcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgdGVtcDsKIAogICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHgwMyk7CiAgICAgIHRlbXAgfD0gMHg4MDsJLyogU2V0IGRhdGFwYXRoIDEgdG8gVFYgICAqLwogICAgICB0ZW1wICY9IDB4YmY7CS8qIFNldCBkYXRhcGF0aCAyIHRvIExWRFMgKi8KLSAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDAzKTsKKyAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMyx0ZW1wKTsKIAotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQwKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkgewogCiAgICAgICAgIHRlbXAgPSBTaVNfR2V0Q0g3MDF4KFNpU19QciwweDFjKTsKICAgICAgICAgdGVtcCAmPSAweGZiOwkvKiBOb3JtYWwgWENMSyBwaGFzZSAqLwotICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwodGVtcCA8PCA4KSB8IDB4MWMpOworICAgICAgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDFjLHRlbXApOwogCiAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MmQsMHgwMyk7CiAKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4NjQpOwogICAgICAgICB0ZW1wIHw9IDB4NDA7CS8qID8gQml0IG5vdCBkZWZpbmVkICovCi0gICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCh0ZW1wIDw8IDgpIHwgMHg2NCk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjQsdGVtcCk7CiAKICAgICAgICAgdGVtcCA9IFNpU19HZXRDSDcwMXgoU2lTX1ByLDB4MDMpOwogICAgICAgICB0ZW1wICY9IDB4M2Y7CS8qIEQxIGlucHV0IHRvIGJvdGggTFZEUyBhbmQgVFYgKi8KLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsKHRlbXAgPDwgOCkgfCAweDAzKTsKKyAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHgwMyx0ZW1wKTsKIAogCWlmKFNpU19Qci0+U2lTX0N1c3RvbVQgPT0gQ1VUX0FTVVNMMzAwMEQpIHsKLQkgICBTaVNfU2V0Q0g3MDF4KFNpU19QciwweDQwNjMpOyAvKiBMVkRTIG9mZiAqLworCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NjMsMHg0MCk7IC8qIExWRFMgb2ZmICovCiAJICAgU2lTX0xvbmdEZWxheShTaVNfUHIsIDEpOwotCSAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4MDA2Myk7IC8qIExWRFMgb24gKi8KLQkgICBTaVNfQ2hyb250ZWxSZXNldERCKFNpU19QciwgSHdJbmZvKTsKLQkgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoU2lTX1ByLCBId0luZm8pOwotCSAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMyhTaVNfUHIsIDAsIEh3SW5mbyk7CisJICAgU2lTX1NldENINzAxeChTaVNfUHIsMHg2MywweDAwKTsgLyogTFZEUyBvbiAqLworCSAgIFNpU19DaHJvbnRlbFJlc2V0REIoU2lTX1ByKTsKKwkgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoU2lTX1ByKTsKKwkgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzMoU2lTX1ByLCAwKTsKIAl9IGVsc2UgewogICAgICAgICAgICB0ZW1wID0gU2lTX0dldENINzAxeChTaVNfUHIsMHg2Nik7CiAgICAgICAgICAgIGlmKHRlbXAgIT0gMHg0NSkgewotICAgICAgICAgICAgICBTaVNfQ2hyb250ZWxSZXNldERCKFNpU19QciwgSHdJbmZvKTsKLSAgICAgICAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcyKFNpU19QciwgSHdJbmZvKTsKLSAgICAgICAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmczKFNpU19QciwgMCwgSHdJbmZvKTsKKyAgICAgICAgICAgICAgU2lTX0Nocm9udGVsUmVzZXREQihTaVNfUHIpOworICAgICAgICAgICAgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzIoU2lTX1ByKTsKKyAgICAgICAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmczKFNpU19QciwgMCk7CiAgICAgICAgICAgIH0KIAl9CiAKICAgICAgfSBlbHNlIHsgLyogNjUwICovCiAKLSAgICAgICAgU2lTX0Nocm9udGVsUmVzZXREQihTaVNfUHIsSHdJbmZvKTsKLSAgICAgICAgU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcyKFNpU19QcixId0luZm8pOworICAgICAgICBTaVNfQ2hyb250ZWxSZXNldERCKFNpU19Qcik7CisgICAgICAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMihTaVNfUHIpOwogICAgICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzQpOwotICAgICAgICBTaVNfQ2hyb250ZWxEb1NvbWV0aGluZzMoU2lTX1ByLHRlbXAsSHdJbmZvKTsKLSAgICAgICAgU2lTX1NldENINzAxeChTaVNfUHIsMHhhZjc2KTsgIC8qIEFsbCBwb3dlciBvbiwgTFZEUyBub3JtYWwgb3BlcmF0aW9uICovCisgICAgICAgIFNpU19DaHJvbnRlbERvU29tZXRoaW5nMyhTaVNfUHIsdGVtcCk7CisgICAgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLDB4NzYsMHhhZik7ICAvKiBBbGwgcG93ZXIgb24sIExWRFMgbm9ybWFsIG9wZXJhdGlvbiAqLwogCiAgICAgIH0KIApAQCAtODg0NSwxNSArODY2NywxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogQk9PTEVBTgotU2lTX1NldENSVDJHcm91cChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vKQorU2lTX1NldENSVDJHcm91cChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewogI2lmZGVmIFNJUzMwMAotICAgVUNIQVIgICpST01BZGRyICA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyICA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CiAjZW5kaWYKLSAgIFVTSE9SVCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4OwotI2lmIDAKLSAgIFVTSE9SVCB0ZW1wOwotI2VuZGlmCisgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4OwogCiAgICBTaVNfUHItPlNpU19TZXRGbGFnIHw9IFByb2dyYW1taW5nQ1JUMjsKIApAQCAtODg2NiwzNyArODY4NSwzNyBAQAogICAgLyogVXNlZCBmb3Igc2hpZnRpbmcgQ1IzMyAqLwogICAgU2lTX1ByLT5TaVNfU2VsZWN0Q1JUMlJhdGUgPSA0OwogCi0gICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIsIEh3SW5mbyk7CisgICBTaVNfVW5Mb2NrQ1JUMihTaVNfUHIpOwogCi0gICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7CisgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSBTaVNfR2V0UmF0ZVB0cihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogCiAgICBTaVNfU2F2ZUNSVDJJbmZvKFNpU19QcixNb2RlTm8pOwogCiAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7Ci0gICAgICBTaVNfRGlzYWJsZUJyaWRnZShTaVNfUHIsSHdJbmZvKTsKLSAgICAgIGlmKChTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSAmJiAoSHdJbmZvLT5qQ2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKKyAgICAgIFNpU19EaXNhYmxlQnJpZGdlKFNpU19Qcik7CisgICAgICBpZigoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgJiYgKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzczMCkpIHsKICAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MDAsMHg4MCk7CiAgICAgICB9Ci0gICAgICBTaVNfU2V0Q1JUMk1vZGVSZWdzKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvKTsKKyAgICAgIFNpU19TZXRDUlQyTW9kZVJlZ3MoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKICAgIH0KIAogICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgRGlzYWJsZUNSVDJEaXNwbGF5KSB7Ci0gICAgICBTaVNfTG9ja0NSVDIoU2lTX1ByLCBId0luZm8pOworICAgICAgU2lTX0xvY2tDUlQyKFNpU19Qcik7CiAgICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KIAotICAgU2lTX0dldENSVDJEYXRhKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworICAgU2lTX0dldENSVDJEYXRhKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAogICAgLyogU2V0IHVwIFBhbmVsIExpbmsgZm9yIExWRFMgYW5kIExDREEgKi8KICAgIFNpU19Qci0+U2lTX0xDREhERVMgPSBTaVNfUHItPlNpU19MQ0RWREVTID0gMDsKICAgIGlmKCAoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgfHwKICAgICAgICAoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX05vTENEKSAmJiAoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSkgfHwKLSAgICAgICAoKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSkgKSB7Ci0gICAgICBTaVNfR2V0TFZEU0Rlc0RhdGEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIEh3SW5mbyk7CisgICAgICAgKChTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSkgKSB7CisgICAgICBTaVNfR2V0TFZEU0Rlc0RhdGEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogICAgfQogCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiKGluaXQzMDE6IExDREhERVMgMHglMDN4IExDRFZERVMgMHglMDN4KVxuIiwgU2lTX1ByLT5TaVNfTENESERFUywgU2lTX1ByLT5TaVNfTENEVkRFUyk7CiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiKGluaXQzMDE6IEhERSAgICAgMHglMDN4IFZERSAgICAgMHglMDN4KVxuIiwgU2lTX1ByLT5TaVNfSERFLCBTaVNfUHItPlNpU19WREUpOwpAQCAtODkwNyw4NiArODcyNiw3OSBAQAogI2VuZGlmCiAKICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKLSAgICAgIFNpU19TZXRHcm91cDEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisgICAgICBTaVNfU2V0R3JvdXAxKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICAgIH0KIAogICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7CisgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7CiAKLQkgICBTaVNfU2V0R3JvdXAyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCSBTaVNfU2V0R3JvdXAyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKICNpZmRlZiBTSVMzMTVICi0JICAgU2lTX1NldEdyb3VwMl9DX0VMVihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgSHdJbmZvKTsKKwkgU2lTX1NldEdyb3VwMl9DX0VMVihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAjZW5kaWYKLSAgICAgIAkgICBTaVNfU2V0R3JvdXAzKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgSHdJbmZvKTsKLSAgICAgIAkgICBTaVNfU2V0R3JvdXA0KFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCSBTaVNfU2V0R3JvdXAzKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CisJIFNpU19TZXRHcm91cDQoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogI2lmZGVmIFNJUzMxNUgKLQkgICBTaVNfU2V0R3JvdXA0X0NfRUxWKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKwkgU2lTX1NldEdyb3VwNF9DX0VMVihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOwogI2VuZGlmCi0gICAgICAJICAgU2lTX1NldEdyb3VwNShTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIEh3SW5mbyk7CisJIFNpU19TZXRHcm91cDUoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKIAotCSAgIFNpU19TZXRDUlQyU3luYyhTaVNfUHIsIE1vZGVObywgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworCSBTaVNfU2V0Q1JUMlN5bmMoU2lTX1ByLCBNb2RlTm8sIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKLQkgICAvKiBGb3IgMzAxQkRIIChQYW5lbCBsaW5rIGluaXRpYWxpemF0aW9uKTogKi8KLQkgICBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7Ci0JICAgICAgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF82NDB4NDgwKSB7Ci0JCSBpZighKChTaVNfUHItPlNpU19TZXRGbGFnICYgU2V0RE9TTW9kZSkgJiYgKChNb2RlTm8gPT0gMHgwMykgfHwgKE1vZGVObyA9PSAweDEwKSkpKSB7Ci0JCSAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgewotCQkgICAgICAgU2lTX01vZENSVDFDUlRDKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLQkgICAgICB9Ci0JICAgICAgU2lTX1NldENSVDJFQ0xLKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsCi0JCSAgICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JICAgfQotICAgICAgICB9CisJIC8qIEZvciAzMDFCREggKFBhbmVsIGxpbmsgaW5pdGlhbGl6YXRpb24pOiAqLworCSBpZigoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfTm9MQ0QpICYmIChTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7CisKKwkgICAgaWYoISgoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIFNldERPU01vZGUpICYmICgoTW9kZU5vID09IDB4MDMpIHx8IChNb2RlTm8gPT0gMHgxMCkpKSkgeworCSAgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgeworCQkgIFNpU19Nb2RDUlQxQ1JUQyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgU2lTX1NldENSVDJFQ0xLKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKKwkgfQorICAgICAgfQogCiAgICB9IGVsc2UgewogCi0gICAgICAgIFNpU19TZXRDUlQyU3luYyhTaVNfUHIsIE1vZGVObywgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBId0luZm8pOworICAgICAgU2lTX1NldENSVDJTeW5jKFNpU19QciwgTW9kZU5vLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwogCi0gICAgICAgIGlmKCEoU2lTX1ByLT5TaVNfTENESW5mbyAmIExDRFBhc3MxMSkpIHsKLSAgICAJICAgU2lTX01vZENSVDFDUlRDKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4LEh3SW5mbyk7Ci0JfQorICAgICAgU2lTX01vZENSVDFDUlRDKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAotICAgICAgICBTaVNfU2V0Q1JUMkVDTEsoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsSHdJbmZvKTsKKyAgICAgIFNpU19TZXRDUlQyRUNMSyhTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4LFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKLQlpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7Ci0gICAgIAkgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ICE9IDApIHsKLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKLQkgICAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKKyAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKKwkgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCAhPSAwKSB7CisJICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeworCSAgICAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDIpIHsKICNpZmRlZiBTSVMzMTVICi0JCSAgICBTaVNfU2V0Q0g3MDF4Rm9yTENEKFNpU19QcixId0luZm8pOworCQkgIFNpU19TZXRDSDcwMXhGb3JMQ0QoU2lTX1ByKTsKICNlbmRpZgotCQkgfQotCSAgICAgIH0KLQkgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgewotICAgICAgIAkJIFNpU19TZXRDSFRWUmVnKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKLQkgICAgICB9Ci0gICAgIAkgICB9Ci0JfQorCSAgICAgICB9CisJICAgIH0KKwkgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKwkgICAgICAgU2lTX1NldENIVFZSZWcoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICB9CisJIH0KKyAgICAgIH0KIAogICAgfQogCiAjaWZkZWYgU0lTMzAwCi0gICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMxNUgpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKIAkgaWYoU2lTX1ByLT5TaVNfVXNlT0VNKSB7CiAJICAgIGlmKChTaVNfUHItPlNpU19Vc2VST00pICYmIChTaVNfUHItPlNpU19Vc2VPRU0gPT0gLTEpKSB7CiAJICAgICAgIGlmKChST01BZGRyWzB4MjMzXSA9PSAweDEyKSAmJiAoUk9NQWRkclsweDIzNF0gPT0gMHgzNCkpIHsKLQkgICAgICAgICAgU2lTX09FTTMwMFNldHRpbmcoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsCi0JICAgICAgIAkJCSAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCQkgIFNpU19PRU0zMDBTZXR0aW5nKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAkgICAgICAgfQogCSAgICB9IGVsc2UgewotICAgICAgIAkgICAgICAgU2lTX09FTTMwMFNldHRpbmcoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsCi0JICAgICAgIAkJCSBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICAgICBTaVNfT0VNMzAwU2V0dGluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJICAgIH0KIAkgfQogCSBpZihTaVNfUHItPlNpU19JRl9ERUZfTFZEUyA9PSAxKSB7Ci0gICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAorCSAgICBpZigoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB8fAogCSAgICAgICAoU2lTX1ByLT5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMDI0KSkgewotCSAgICAgICBTZXRPRU1MQ0REYXRhMihTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBNb2RlSWRJbmRleCxSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICAgICBTZXRPRU1MQ0REYXRhMihTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKIAkgICAgfQogCSAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CiAgICAgICAgICB9CkBAIC04OTk1LDIxICs4ODA3LDIxIEBACiAjZW5kaWYKIAogI2lmZGVmIFNJUzMxNUgKLSAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMTVIKSB7CisgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMTVIKSB7CiAgICAgICBpZihTaVNfUHItPlNpU19TZXRGbGFnICYgTG93TW9kZVRlc3RzKSB7Ci0JIGlmKEh3SW5mby0+akNoaXBUeXBlIDwgU0lTXzY2MSkgewotCSAgICBTaVNfRmluYWxpemVMQ0QoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBId0luZm8pOwotICAgICAgICAgICAgU2lTX09FTTMxMFNldHRpbmcoU2lTX1ByLCBId0luZm8sIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CisJIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfNjYxKSB7CisJICAgIFNpU19GaW5hbGl6ZUxDRChTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgpOworCSAgICBTaVNfT0VNMzEwU2V0dGluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJIH0gZWxzZSB7Ci0JICAgIFNpU19PRU02NjFTZXR0aW5nKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOworCSAgICBTaVNfT0VNNjYxU2V0dGluZyhTaVNfUHIsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAJIH0KLSAgICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QYXJ0MVBvcnQsMHgwMSwweDQwKTsKKwkgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDAxLDB4NDApOwogICAgICAgfQogICAgfQogI2VuZGlmCiAKICAgIGlmKFNpU19Qci0+U2lTX1NldEZsYWcgJiBMb3dNb2RlVGVzdHMpIHsKLSAgICAgIFNpU19FbmFibGVCcmlkZ2UoU2lTX1ByLCBId0luZm8pOworICAgICAgU2lTX0VuYWJsZUJyaWRnZShTaVNfUHIpOwogICAgfQogCiAgICBTaVNfRGlzcGxheU9uKFNpU19Qcik7CkBAIC05MDE3LDE1ICs4ODI5LDE1IEBACiAgICBpZihTaVNfUHItPlNpU19JRl9ERUZfQ0g3MHh4ID09IDEpIHsKICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAJIC8qIERpc2FibGUgTENEIHBhbmVsIHdoZW4gdXNpbmcgVFYgKi8KLQkgU2lTX1NldFJlZ1NSMTFBTkRPUihTaVNfUHIsSHdJbmZvLDB4RkYsMHgwQyk7CisJIFNpU19TZXRSZWdTUjExQU5ET1IoU2lTX1ByLDB4RkYsMHgwQyk7CiAgICAgICB9IGVsc2UgewogCSAvKiBEaXNhYmxlIFRWIHdoZW4gdXNpbmcgTENEICovCi0JIFNpU19TZXRDSDcweHhBTkRPUihTaVNfUHIsMHgwMTBFLDB4RjgpOworCSBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByLDB4MGUsMHgwMSwweGY4KTsKICAgICAgIH0KICAgIH0KIAogICAgaWYoU2lTX1ByLT5TaVNfU2V0RmxhZyAmIExvd01vZGVUZXN0cykgewotICAgICAgU2lTX0xvY2tDUlQyKFNpU19QcixId0luZm8pOworICAgICAgU2lTX0xvY2tDUlQyKFNpU19Qcik7CiAgICB9CiAKICAgIHJldHVybiBUUlVFOwpAQCAtOTAzNywxMyArODg0OSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotU2lTX1NpUzMweEJMT24oU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TaVMzMHhCTE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAvKiBTd2l0Y2ggb24gTENEIGJhY2tsaWdodCBvbiBTaVMzMHhMViAqLwogICBTaVNfRERDMkRlbGF5KFNpU19QciwweGZmMDApOwogICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYpICYgMHgwMikpIHsKICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4MDIpOwotICAgICBTaVNfV2FpdFZCUmV0cmFjZShTaVNfUHIsSHdJbmZvKTsKKyAgICAgU2lTX1dhaXRWQlJldHJhY2UoU2lTX1ByKTsKICAgfQogICBpZighKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYpICYgMHgwMSkpIHsKICAgICAgU2lTX1NldFJlZ09SKFNpU19Qci0+U2lTX1BhcnQ0UG9ydCwweDI2LDB4MDEpOwpAQCAtOTA1MSwxMiArODg2MywxMSBAQAogfQogCiB2b2lkCi1TaVNfU2lTMzB4QkxPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK1NpU19TaVMzMHhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgLyogU3dpdGNoIG9mZiBMQ0QgYmFja2xpZ2h0IG9uIFNpUzMweExWICovCiAgIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRSk7Ci0gIFNpU19TZXRSZWdBTkQoU2lTX1ByLT5TaVNfUGFydDRQb3J0LDB4MjYsMHhGRCk7Ci0gIFNpU19EREMyRGVsYXkoU2lTX1ByLDB4ZTAwMCk7CisgIFNpU19EREMyRGVsYXkoU2lTX1ByLDB4ZmYwMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MDY0LDcgKzg4NzUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVNpU19TZXR1cEREQ04oU2lTX1ByaXZhdGUgKlNpU19QcikKK1NpU19TZXR1cEREQ04oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSA9IH5TaVNfUHItPlNpU19ERENfRGF0YTsKICAgU2lTX1ByLT5TaVNfRERDX05DbGsgID0gflNpU19Qci0+U2lTX0REQ19DbGs7CkBAIC05MDc1LDEyICs4ODg2LDEyIEBACiB9CiAKICNpZmRlZiBTSVMzMDAKLXN0YXRpYyBVQ0hBUiAqCi1TaVNfU2V0VHJ1bXBCbG9ja0xvb3AoU2lTX1ByaXZhdGUgKlNpU19QciwgVUNIQVIgKmRhdGFwdHIpCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitTaVNfU2V0VHJ1bXBCbG9ja0xvb3Aoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgKmRhdGFwdHIpCiB7CiAgIGludCBpLCBqLCBudW07Ci0gIFVTSE9SVCB0ZW1wYWgsdGVtcDsKLSAgVUNIQVIgKm15ZGF0YXB0cjsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoLHRlbXA7CisgIHVuc2lnbmVkIGNoYXIgKm15ZGF0YXB0cjsKIAogICBmb3IoaT0wOyBpPDIwOyBpKyspIHsJCQkJLyogRG8gMjAgYXR0ZW1wdHMgdG8gd3JpdGUgKi8KICAgICAgbXlkYXRhcHRyID0gZGF0YXB0cjsKQEAgLTkwODgsNyArODg5OSw3IEBACiAgICAgIGlmKCFudW0pIHJldHVybiBteWRhdGFwdHI7CiAgICAgIGlmKGkpIHsKICAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLQlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCoyKTsKKwlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCAqIDIpOwogICAgICB9CiAgICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdGFydCBjb25kaXRpb24gKi8KICAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHI7CkBAIC05MTEwLDEyICs4OTIxLDEyIEBACiB9CiAKIHN0YXRpYyBCT09MRUFOCi1TaVNfU2V0VHJ1bXBpb25CbG9jayhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVQ0hBUiAqZGF0YXB0cikKK1NpU19TZXRUcnVtcGlvbkJsb2NrKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyICpkYXRhcHRyKQogewogICBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciA9IDB4RjA7ICAJCS8qIERBQiAoRGV2aWNlIEFkZHJlc3MgQnl0ZSkgKi8KICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCQkvKiBCaXQgMCA9IFNDOyAgQml0IDEgPSBTRCAqLwotICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDAyOyAgICAgICAgICAgICAgCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwMTsgICAgICAgICAgICAgIAkvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KKyAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwMjsJCQkvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBEYXRhICovCisgIFNpU19Qci0+U2lTX0REQ19DbGsgICA9IDB4MDE7CQkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgQ2xrICovCiAgIFNpU19TZXR1cEREQ04oU2lTX1ByKTsKIAogICBTaVNfU2V0U3dpdGNoRERDMihTaVNfUHIpOwpAQCAtOTEyNCw5ICs4OTM1LDExIEBACiAgICAgIGRhdGFwdHIgPSBTaVNfU2V0VHJ1bXBCbG9ja0xvb3AoU2lTX1ByLCBkYXRhcHRyKTsKICAgICAgaWYoIWRhdGFwdHIpIHJldHVybiBGQUxTRTsKICAgfQorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgIHhmODZEcnZNc2coMCwgWF9JTkZPLCAiVHJ1bXBpb24gYmxvY2sgc3VjY2Vzc1xuIik7CiAjZW5kaWYKKyNlbmRpZgogICByZXR1cm4gVFJVRTsKIH0KICNlbmRpZgpAQCAtOTEzOSwxNTUgKzg5NTIsMTIxIEBACiAgKi8KIAogc3RhdGljIEJPT0xFQU4KLVNpU19TZXRDaFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4LCBVU0hPUlQgbXlvcikKK1NpU19TZXRDaFJlZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgc2hvcnQgbXlvcikKIHsKLSAgVVNIT1JUIHRlbXBhaCx0ZW1wLGk7CisgIHVuc2lnbmVkIHNob3J0IHRlbXAsIGk7CiAKICAgZm9yKGk9MDsgaTwyMDsgaSsrKSB7CQkJCS8qIERvIDIwIGF0dGVtcHRzIHRvIHdyaXRlICovCiAgICAgIGlmKGkpIHsKLSAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLQlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCk7CisJU2lTX1NldFN0b3AoU2lTX1ByKTsKKwlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCAqIDQpOwogICAgICB9Ci0gICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdGFydCBjb25kaXRpb24gKi8KLSAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHI7Ci0gICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsdGVtcGFoKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLwotICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJLyogICAgKEVSUk9SOiBubyBhY2spICovCi0gICAgIHRlbXBhaCA9IHRlbXBieCAmIDB4MDBGRjsJCQkvKiBXcml0ZSBSQUIgKi8KLSAgICAgdGVtcGFoIHw9IG15b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICg3MDB4OiBzZXQgYml0IDcsIHNlZSBkYXRhc2hlZXQpICovCi0gICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsdGVtcGFoKTsKLSAgICAgaWYodGVtcCkgY29udGludWU7CQkJCS8qICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICB0ZW1wYWggPSAodGVtcGJ4ICYgMHhGRjAwKSA+PiA4OwotICAgICB0ZW1wID0gU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLHRlbXBhaCk7CS8qIFdyaXRlIGRhdGEgKi8KLSAgICAgaWYodGVtcCkgY29udGludWU7CQkJCS8qICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICBpZihTaVNfU2V0U3RvcChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdG9wIGNvbmRpdGlvbiAqLworICAgICBpZihTaVNfU2V0U3RhcnQoU2lTX1ByKSkgY29udGludWU7CQkJCQkvKiBTZXQgc3RhcnQgY29uZGl0aW9uICovCisgICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgKEVSUk9SOiBubyBhY2spICovCisgICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsIChyZWcgfCBteW9yKSk7CQkJLyogV3JpdGUgUkFCICg3MDB4OiBzZXQgYml0IDcsIHNlZSBkYXRhc2hlZXQpICovCisgICAgIGlmKHRlbXApIGNvbnRpbnVlOwkJCQkJCQkvKiAgICAoRVJST1I6IG5vIGFjaykgKi8KKyAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19QciwgdmFsKTsJCQkJLyogV3JpdGUgZGF0YSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgKEVSUk9SOiBubyBhY2spICovCisgICAgIGlmKFNpU19TZXRTdG9wKFNpU19QcikpIGNvbnRpbnVlOwkJCQkJLyogU2V0IHN0b3AgY29uZGl0aW9uICovCiAgICAgIFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCA9IDE7CiAgICAgIHJldHVybiBUUlVFOwogICB9CiAgIHJldHVybiBGQUxTRTsKIH0KIAotI2lmIDAKLSNpZmRlZiBTSVMzMDAKLS8qIFdyaXRlIFRydW1waW9uIHJlZ2lzdGVyICovCi1zdGF0aWMgdm9pZAotU2lTX1NldFRydW1wUmVnKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYngpCi17Ci0gIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhGMDsgIAkJLyogREFCIChEZXZpY2UgQWRkcmVzcyBCeXRlKSAqLwotICBTaVNfUHItPlNpU19ERENfSW5kZXggPSAweDExOwkJCS8qIEJpdCAwID0gU0M7ICBCaXQgMSA9IFNEICovCi0gIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDI7ICAgICAgICAgICAgICAJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLwotICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDAxOyAgICAgICAgICAgICAgCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwotICBTaVNfU2V0dXBERENOKFNpU19Qcik7Ci0gIFNpU19TZXRDaFJlZyhTaVNfUHIsIHRlbXBieCwgMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCiAvKiBXcml0ZSB0byBDaHJvbnRlbCA3MDB4ICovCi0vKiBQYXJhbWV0ZXIgaXMgW0RhdGEgKFMxNS1TOCkgfCBSZWdpc3RlciBubyAoUzctUzApXSAqLwogdm9pZAotU2lTX1NldENINzAweChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KQorU2lTX1NldENINzAweChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKICAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweEVBOyAgCQkvKiBEQUIgKERldmljZSBBZGRyZXNzIEJ5dGUpICovCiAKKyAgU2lTX0REQzJEZWxheShTaVNfUHIsU2lTX0kyQ0RFTEFZU0hPUlQpOworCiAgIGlmKCEoU2lTX1ByLT5TaVNfQ2hyb250ZWxJbml0KSkgewogICAgICBTaVNfUHItPlNpU19ERENfSW5kZXggPSAweDExOwkJLyogQml0IDAgPSBTQzsgIEJpdCAxID0gU0QgKi8KLSAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwMjsgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KLSAgICAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwMTsgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLworICAgICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDAyOwkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLworICAgICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDAxOwkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgQ2xrICovCiAgICAgIFNpU19TZXR1cEREQ04oU2lTX1ByKTsKICAgfQogCi0gIGlmKCAoIShTaVNfU2V0Q2hSZWcoU2lTX1ByLCB0ZW1wYngsIDB4ODApKSkgJiYKKyAgaWYoICghKFNpU19TZXRDaFJlZyhTaVNfUHIsIHJlZywgdmFsLCAweDgwKSkpICYmCiAgICAgICAoIShTaVNfUHItPlNpU19DaHJvbnRlbEluaXQpKSApIHsKLSAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwYTsJCS8qIEJpdCA3ID0gU0M7ICBCaXQgNiA9IFNEICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4ODA7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBEYXRhICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19DbGsgICA9IDB4NDA7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KKyAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwYTsKKyAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHg4MDsKKyAgICAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHg0MDsKICAgICAgU2lTX1NldHVwRERDTihTaVNfUHIpOwogCi0gICAgIFNpU19TZXRDaFJlZyhTaVNfUHIsIHRlbXBieCwgMHg4MCk7CisgICAgIFNpU19TZXRDaFJlZyhTaVNfUHIsIHJlZywgdmFsLCAweDgwKTsKICAgfQogfQogCiAvKiBXcml0ZSB0byBDaHJvbnRlbCA3MDF4ICovCiAvKiBQYXJhbWV0ZXIgaXMgW0RhdGEgKFMxNS1TOCkgfCBSZWdpc3RlciBubyAoUzctUzApXSAqLwogdm9pZAotU2lTX1NldENINzAxeChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KQorU2lTX1NldENINzAxeChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCQkvKiBCaXQgMCA9IFNDOyAgQml0IDEgPSBTRCAqLwotICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDA4OyAgICAgICAgICAgICAgICAgLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLwotICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDA0OyAgICAgICAgICAgICAgICAgLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgQ2xrICovCisgIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDg7CQkJLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLworICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDA0OwkJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwogICBTaVNfU2V0dXBERENOKFNpU19Qcik7Ci0gIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhFQTsgIAkJLyogREFCIChEZXZpY2UgQWRkcmVzcyBCeXRlKSAqLwotICBTaVNfU2V0Q2hSZWcoU2lTX1ByLCB0ZW1wYngsIDApOworICBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciA9IDB4RUE7CQkvKiBEQUIgKERldmljZSBBZGRyZXNzIEJ5dGUpICovCisgIFNpU19TZXRDaFJlZyhTaVNfUHIsIHJlZywgdmFsLCAwKTsKIH0KIAotc3RhdGljIHZvaWQKLVNpU19TZXRDSDcweHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitzdGF0aWMKKyNlbmRpZgordm9pZAorU2lTX1NldENINzB4eChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKQotICAgICBTaVNfU2V0Q0g3MDB4KFNpU19Qcix0ZW1wYngpOworICAgICBTaVNfU2V0Q0g3MDB4KFNpU19QciwgcmVnLCB2YWwpOwogICBlbHNlCi0gICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLHRlbXBieCk7CisgICAgIFNpU19TZXRDSDcwMXgoU2lTX1ByLCByZWcsIHZhbCk7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19HZXRDaFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgbXlvcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorU2lTX0dldENoUmVnKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBteW9yKQogewotICBVU0hPUlQgdGVtcGFoLHRlbXAsaTsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoLCB0ZW1wLCBpOwogCiAgIGZvcihpPTA7IGk8MjA7IGkrKykgewkJCQkvKiBEbyAyMCBhdHRlbXB0cyB0byByZWFkICovCiAgICAgIGlmKGkpIHsKLSAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLQlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCk7CisJU2lTX1NldFN0b3AoU2lTX1ByKTsKKwlTaVNfRERDMkRlbGF5KFNpU19QcixTaVNfSTJDREVMQVlTSE9SVCAqIDQpOwogICAgICB9Ci0gICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCS8qIFNldCBzdGFydCBjb25kaXRpb24gKi8KLSAgICAgdGVtcGFoID0gU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHI7Ci0gICAgIHRlbXAgPSBTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsdGVtcGFoKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLwotICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICB0ZW1wYWggPSBTaVNfUHItPlNpU19ERENfUmVhZEFkZHIgfCBteW9yOwkvKiBXcml0ZSBSQUIgKDcwMHg6IHwgMHg4MCkgKi8KLSAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19Qcix0ZW1wYWgpOwotICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLwotICAgICBpZiAoU2lTX1NldFN0YXJ0KFNpU19QcikpIGNvbnRpbnVlOwkvKiBSZS1zdGFydCAqLwotICAgICB0ZW1wYWggPSBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciB8IDB4MDE7LyogREFCIHwgMHgwMSA9IFJlYWQgKi8KLSAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19Qcix0ZW1wYWgpOwkvKiBEQUIgKFMwPTE9cmVhZCkgKi8KLSAgICAgaWYodGVtcCkgY29udGludWU7CQkJCS8qICAgICAgICAoRVJST1I6IG5vIGFjaykgKi8KLSAgICAgdGVtcGFoID0gU2lTX1JlYWREREMyRGF0YShTaVNfUHIsdGVtcGFoKTsJLyogUmVhZCBieXRlICovCi0gICAgIGlmKFNpU19TZXRTdG9wKFNpU19QcikpIGNvbnRpbnVlOwkJLyogU3RvcCBjb25kaXRpb24gKi8KKyAgICAgaWYoU2lTX1NldFN0YXJ0KFNpU19QcikpIGNvbnRpbnVlOwkJCQkJLyogU2V0IHN0YXJ0IGNvbmRpdGlvbiAqLworICAgICB0ZW1wID0gU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyKTsJLyogV3JpdGUgREFCIChTMD0wPXdyaXRlKSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLworICAgICB0ZW1wID0gU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLFNpU19Qci0+U2lTX0REQ19SZWFkQWRkciB8IG15b3IpOwkvKiBXcml0ZSBSQUIgKDcwMHg6IHwgMHg4MCkgKi8KKyAgICAgaWYodGVtcCkgY29udGludWU7CQkJCQkJCS8qICAgICAgICAoRVJST1I6IG5vIGFjaykgKi8KKyAgICAgaWYgKFNpU19TZXRTdGFydChTaVNfUHIpKSBjb250aW51ZTsJCQkJLyogUmUtc3RhcnQgKi8KKyAgICAgdGVtcCA9IFNpU19Xcml0ZUREQzJEYXRhKFNpU19QcixTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciB8IDB4MDEpOy8qIERBQiAoUzA9MT1yZWFkKSAqLworICAgICBpZih0ZW1wKSBjb250aW51ZTsJCQkJCQkJLyogICAgICAgIChFUlJPUjogbm8gYWNrKSAqLworICAgICB0ZW1wYWggPSBTaVNfUmVhZEREQzJEYXRhKFNpU19Qcik7CQkJCQkvKiBSZWFkIGJ5dGUgKi8KKyAgICAgaWYoU2lTX1NldFN0b3AoU2lTX1ByKSkgY29udGludWU7CQkJCQkvKiBTdG9wIGNvbmRpdGlvbiAqLwogICAgICBTaVNfUHItPlNpU19DaHJvbnRlbEluaXQgPSAxOwotICAgICByZXR1cm4odGVtcGFoKTsKKyAgICAgcmV0dXJuIHRlbXBhaDsKICAgfQogICByZXR1cm4gMHhGRkZGOwogfQogCi0jaWYgMAotI2lmZGVmIFNJUzMwMAotLyogUmVhZCBmcm9tIFRydW1waW9uICovCi1zdGF0aWMgVVNIT1JUCi1TaVNfR2V0VHJ1bXBSZWcoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKLXsKLSAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweEYwOwkvKiBEQUIgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCS8qIEJpdCAwID0gU0M7ICBCaXQgMSA9IFNEICovCi0gIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDI7ICAgICAgICAgLyogQml0bWFzayBpbiBJbmRleFJlZyBmb3IgRGF0YSAqLwotICBTaVNfUHItPlNpU19ERENfQ2xrICAgPSAweDAxOyAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwotICBTaVNfU2V0dXBERENOKFNpU19Qcik7Ci0gIFNpU19Qci0+U2lTX0REQ19SZWFkQWRkciA9IHRlbXBieDsKLSAgcmV0dXJuKFNpU19HZXRDaFJlZyhTaVNfUHIsMCkpOwotfQotI2VuZGlmCi0jZW5kaWYKLQogLyogUmVhZCBmcm9tIENocm9udGVsIDcwMHggKi8KIC8qIFBhcmFtZXRlciBpcyBbUmVnaXN0ZXIgbm8gKFM3LVMwKV0gKi8KLVVTSE9SVAotU2lTX0dldENINzAweChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KQordW5zaWduZWQgc2hvcnQKK1NpU19HZXRDSDcwMHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBieCkKIHsKLSAgVVNIT1JUIHJlc3VsdDsKKyAgdW5zaWduZWQgc2hvcnQgcmVzdWx0OwogCiAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhFQTsJCS8qIERBQiAqLwogCisgIFNpU19EREMyRGVsYXkoU2lTX1ByLFNpU19JMkNERUxBWVNIT1JUKTsKKwogICBpZighKFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCkpIHsKICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgxMTsJCS8qIEJpdCAwID0gU0M7ICBCaXQgMSA9IFNEICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19EYXRhICA9IDB4MDI7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBEYXRhICovCi0gICAgIFNpU19Qci0+U2lTX0REQ19DbGsgICA9IDB4MDE7ICAgICAgICAgICAgICAvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KKyAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwMjsJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KKyAgICAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwMTsJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLwogICAgICBTaVNfU2V0dXBERENOKFNpU19Qcik7CiAgIH0KIApAQCAtOTMwMyw1MiArOTA4Miw2OSBAQAogCiAgICAgIHJlc3VsdCA9IFNpU19HZXRDaFJlZyhTaVNfUHIsMHg4MCk7CiAgIH0KLSAgcmV0dXJuKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJlYWQgZnJvbSBDaHJvbnRlbCA3MDF4ICovCiAvKiBQYXJhbWV0ZXIgaXMgW1JlZ2lzdGVyIG5vIChTNy1TMCldICovCi1VU0hPUlQKLVNpU19HZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKK3Vuc2lnbmVkIHNob3J0CitTaVNfR2V0Q0g3MDF4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYngpCiB7CiAgIFNpU19Qci0+U2lTX0REQ19JbmRleCA9IDB4MTE7CQkJLyogQml0IDAgPSBTQzsgIEJpdCAxID0gU0QgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0RhdGEgID0gMHgwODsgICAgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KLSAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwNDsgICAgICAgICAgICAgICAgIC8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIENsayAqLworICBTaVNfUHItPlNpU19ERENfRGF0YSAgPSAweDA4OwkJCS8qIEJpdG1hc2sgaW4gSW5kZXhSZWcgZm9yIERhdGEgKi8KKyAgU2lTX1ByLT5TaVNfRERDX0NsayAgID0gMHgwNDsJCQkvKiBCaXRtYXNrIGluIEluZGV4UmVnIGZvciBDbGsgKi8KICAgU2lTX1NldHVwRERDTihTaVNfUHIpOwogICBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciA9IDB4RUE7CQkvKiBEQUIgKi8KIAogICBTaVNfUHItPlNpU19ERENfUmVhZEFkZHIgPSB0ZW1wYng7CiAKLSAgcmV0dXJuKFNpU19HZXRDaFJlZyhTaVNfUHIsMCkpOworICByZXR1cm4gU2lTX0dldENoUmVnKFNpU19QciwwKTsKIH0KIAogLyogUmVhZCBmcm9tIENocm9udGVsIDcweHggKi8KIC8qIFBhcmFtZXRlciBpcyBbUmVnaXN0ZXIgbm8gKFM3LVMwKV0gKi8KLXN0YXRpYyBVU0hPUlQKLVNpU19HZXRDSDcweHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCkKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitzdGF0aWMKKyNlbmRpZgordW5zaWduZWQgc2hvcnQKK1NpU19HZXRDSDcweHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBieCkKIHsKICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0NINzB4eCA9PSAxKQotICAgICByZXR1cm4oU2lTX0dldENINzAweChTaVNfUHIsIHRlbXBieCkpOworICAgICByZXR1cm4gU2lTX0dldENINzAweChTaVNfUHIsIHRlbXBieCk7CiAgIGVsc2UKLSAgICAgcmV0dXJuKFNpU19HZXRDSDcwMXgoU2lTX1ByLCB0ZW1wYngpKTsKKyAgICAgcmV0dXJuIFNpU19HZXRDSDcwMXgoU2lTX1ByLCB0ZW1wYngpOworfQorCit2b2lkCitTaVNfU2V0Q0g3MHh4QU5ET1Ioc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJdW5zaWduZWQgY2hhciBteW9yLCB1bnNpZ25lZCBzaG9ydCBteWFuZCkKK3sKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGJsOworCisgIHRlbXBibCA9IChTaVNfR2V0Q0g3MHh4KFNpU19QciwgKHJlZyAmIDB4RkYpKSAmIG15YW5kKSB8IG15b3I7CisgIFNpU19TZXRDSDcweHgoU2lTX1ByLCByZWcsIHRlbXBibCk7CiB9CiAKIC8qIE91ciBvd24gRERDIGZ1bmN0aW9ucyAqLwotc3RhdGljIFVTSE9SVAotU2lTX0luaXRERENSZWdzKFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGxvbmcgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKLSAgICAgICAgICAgICAgICBVU0hPUlQgYWRhcHRudW0sIFVTSE9SVCBERENkYXRhdHlwZSwgQk9PTEVBTiBjaGVja2NyMzIpCisjaWZuZGVmIFNJU19YT1JHX1hGODYKK3N0YXRpYworI2VuZGlmCit1bnNpZ25lZCBzaG9ydAorU2lTX0luaXRERENSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBhZGFwdG51bSwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsIEJPT0xFQU4gY2hlY2tjcjMyLAorCQl1bnNpZ25lZCBpbnQgVkJGbGFnczIpCiB7CiAgICAgIHVuc2lnbmVkIGNoYXIgZGRjZHR5cGVbXSA9IHsgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMiwgMHhhNiB9OwogICAgICB1bnNpZ25lZCBjaGFyIGZsYWcsIGNyMzI7Ci0gICAgIFVTSE9SVCAgICAgICAgdGVtcCA9IDAsIG15YWRhcHRudW0gPSBhZGFwdG51bTsKKyAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgIHRlbXAgPSAwLCBteWFkYXB0bnVtID0gYWRhcHRudW07CiAKICAgICAgaWYoYWRhcHRudW0gIT0gMCkgewotICAgICAgICBpZighKFZCRmxhZ3MgJiAoVkJfMzAxfFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkpIHJldHVybiAweEZGRkY7Ci0JaWYoKFZCRmxhZ3MgJiBWQl8zMHhCREgpICYmIChhZGFwdG51bSA9PSAxKSkgcmV0dXJuIDB4RkZGRjsKLSAgICAgfQkKLSAgICAgCisJaWYoIShWQkZsYWdzMiAmIFZCMl9TSVNUTURTQlJJREdFKSkgcmV0dXJuIDB4RkZGRjsKKwlpZigoVkJGbGFnczIgJiBWQjJfMzB4QkRIKSAmJiAoYWRhcHRudW0gPT0gMSkpIHJldHVybiAweEZGRkY7CisgICAgIH0KKwogICAgICAvKiBhZGFwdGVybnVtIGZvciBTaVMgYnJpZGdlczogMCA9IENSVDEsIDEgPSBMQ0QsIDIgPSBWR0EyICovCi0gICAgIAorCiAgICAgIFNpU19Qci0+U2lTX0Nocm9udGVsSW5pdCA9IDA7ICAgLyogZm9yY2UgcmUtZGV0ZWN0aW9uISAqLwogCiAgICAgIFNpU19Qci0+U2lTX0REQ19TZWNBZGRyID0gMDsKQEAgLTkzNjAsNyArOTE1Niw3IEBACiAgICAgIGNyMzIgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzMik7CiAKICNpZiAwCi0gICAgIGlmKFZCRmxhZ3MgJiBWQl9TSVNCUklER0UpIHsKKyAgICAgaWYoVkJGbGFnczIgJiBWQjJfU0lTQlJJREdFKSB7CiAJaWYobXlhZGFwdG51bSA9PSAwKSB7CiAJICAgaWYoIShjcjMyICYgMHgyMCkpIHsKIAkgICAgICBteWFkYXB0bnVtID0gMjsKQEAgLTkzNzYsMjAgKzkxNzIsMjAgQEAKICNlbmRpZgogCiAgICAgIGlmKFZHQUVuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewkJLyogMzAwIHNlcmllcyAqLwotCQorCiAgICAgICAgIGlmKG15YWRhcHRudW0gIT0gMCkgewogCSAgIGZsYWcgPSAwOwotCSAgIGlmKFZCRmxhZ3MgJiBWQl9TSVNCUklER0UpIHsKKwkgICBpZihWQkZsYWdzMiAmIFZCMl9TSVNCUklER0UpIHsKIAkgICAgICBTaVNfUHItPlNpU19ERENfUG9ydCA9IFNpU19Qci0+U2lTX1BhcnQ0UG9ydDsKICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwZjsKIAkgICB9CiAgICAgICAgIH0KIAotCWlmKCEoVkJGbGFncyAmIFZCXzMwMSkpIHsKKwlpZighKFZCRmxhZ3MyICYgVkIyXzMwMSkpIHsKIAkgICBpZigoY3IzMiAmIDB4ODApICYmIChjaGVja2NyMzIpKSB7CiAgICAgICAgICAgICAgIGlmKG15YWRhcHRudW0gPj0gMSkgewogCSAgICAgICAgIGlmKCEoY3IzMiAmIDB4MDgpKSB7Ci0JICAgICAgICAgICAgIG15YWRhcHRudW0gPSAxOworCQkgICAgIG15YWRhcHRudW0gPSAxOwogCQkgICAgIGlmKCEoY3IzMiAmIDB4MTApKSByZXR1cm4gMHhGRkZGOwogICAgICAgICAgICAgICAgICB9CiAJICAgICAgfQpAQCAtOTQwMSwxNyArOTE5NywxNyBAQAogCiAgICAgIH0gZWxzZSB7CQkJCQkJLyogMzE1LzMzMCBzZXJpZXMgKi8KIAotICAgICAJLyogaGVyZSB3ZSBzaW1wbGlmeTogMCA9IENSVDEsIDEgPSBDUlQyIChWR0EsIExDRCkgKi8KKwkvKiBoZXJlIHdlIHNpbXBsaWZ5OiAwID0gQ1JUMSwgMSA9IENSVDIgKFZHQSwgTENEKSAqLwogCi0JaWYoVkJGbGFncyAmIFZCX1NJU0JSSURHRSkgeworCWlmKFZCRmxhZ3MyICYgVkIyX1NJU0JSSURHRSkgewogCSAgIGlmKG15YWRhcHRudW0gPT0gMikgewogCSAgICAgIG15YWRhcHRudW0gPSAxOwotICAgICAgICAgICB9CisJICAgfQogCX0KIAogICAgICAgICBpZihteWFkYXB0bnVtID09IDEpIHsKLSAgICAgCSAgIGZsYWcgPSAwOwotCSAgIGlmKFZCRmxhZ3MgJiBWQl9TSVNCUklER0UpIHsKKwkgICBmbGFnID0gMDsKKwkgICBpZihWQkZsYWdzMiAmIFZCMl9TSVNCUklER0UpIHsKIAkgICAgICBTaVNfUHItPlNpU19ERENfUG9ydCA9IFNpU19Qci0+U2lTX1BhcnQ0UG9ydDsKICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4ID0gMHgwZjsKIAkgICB9CkBAIC05NDI5LDkzICs5MjI1LDk2IEBACiAgICAgICAgIHRlbXAgPSBteWFkYXB0bnVtOwogICAgICAgICBpZihteWFkYXB0bnVtID09IDEpIHsKICAgICAgICAgICAgdGVtcCA9IDA7Ci0JICAgaWYoVkJGbGFncyAmIFZCX0xWRFMpIGZsYWcgPSAweGZmOworCSAgIGlmKFZCRmxhZ3MyICYgVkIyX0xWRFMpIGZsYWcgPSAweGZmOwogICAgICAgICB9CiAKIAlpZihmbGFnKSB0ZW1wID0gMDsKICAgICB9Ci0gICAgCisKICAgICBTaVNfUHItPlNpU19ERENfRGF0YSA9IDB4MDIgPDwgdGVtcDsKICAgICBTaVNfUHItPlNpU19ERENfQ2xrICA9IDB4MDEgPDwgdGVtcDsKIAogICAgIFNpU19TZXR1cEREQ04oU2lTX1ByKTsKIAorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJEREMgUG9ydCAleCBJbmRleCAleCBTaGlmdCAlZFxuIiwKICAgICAJCVNpU19Qci0+U2lTX0REQ19Qb3J0LCBTaVNfUHItPlNpU19ERENfSW5kZXgsIHRlbXApOwogI2VuZGlmCi0gICAgCisjZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIFVTSE9SVAotU2lTX1dyaXRlREFCRERDKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19Xcml0ZURBQkREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIGlmKFNpU19TZXRTdGFydChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwogICAgaWYoU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLCBTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkcikpIHsKLSAgCXJldHVybiAweEZGRkY7CisgICAgICByZXR1cm4gMHhGRkZGOwogICAgfQogICAgaWYoU2lTX1dyaXRlRERDMkRhdGEoU2lTX1ByLCBTaVNfUHItPlNpU19ERENfU2VjQWRkcikpIHsKLSAgIAlyZXR1cm4gMHhGRkZGOworICAgICAgcmV0dXJuIDB4RkZGRjsKICAgIH0KLSAgIHJldHVybigwKTsKKyAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByaXZhdGUgKlNpU19QcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorU2lTX1ByZXBhcmVSZWFkRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgaWYoU2lTX1NldFN0YXJ0KFNpU19QcikpIHJldHVybiAweEZGRkY7CiAgICBpZihTaVNfV3JpdGVEREMyRGF0YShTaVNfUHIsIChTaVNfUHItPlNpU19ERENfRGV2aWNlQWRkciB8IDB4MDEpKSkgewotICAgCXJldHVybiAweEZGRkY7CisgICAgICByZXR1cm4gMHhGRkZGOwogICAgfQotICAgcmV0dXJuKDApOworICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19QcmVwYXJlRERDKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19QcmVwYXJlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgaWYoU2lTX1dyaXRlREFCRERDKFNpU19QcikpIFNpU19Xcml0ZURBQkREQyhTaVNfUHIpOwotICAgaWYoU2lTX1ByZXBhcmVSZWFkRERDKFNpU19QcikpIHJldHVybihTaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByKSk7Ci0gICByZXR1cm4oMCk7CisgICBpZihTaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByKSkgcmV0dXJuIChTaVNfUHJlcGFyZVJlYWREREMoU2lTX1ByKSk7CisgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKLVNpU19TZW5kQUNLKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB5ZXNubykKK1NpU19TZW5kQUNLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB5ZXNubykKIHsKICAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CiAgICBpZih5ZXNubykgewogICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX0REQ19Qb3J0LAotICAgICAgCQkgICAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgICAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKIAkJICAgICAgU2lTX1ByLT5TaVNfRERDX0RhdGEpOwogICAgfSBlbHNlIHsKICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgICAgIAkJICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKKwkJICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAorCQkgICAgICBTaVNfUHItPlNpU19ERENfTkRhdGEsCiAJCSAgICAgIDApOwogICAgfQogICAgU2lTX1NldFNDTEtIaWdoKFNpU19Qcik7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19Eb1Byb2JlRERDKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19Eb1Byb2JlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICAgIHVuc2lnbmVkIGNoYXIgbWFzaywgdmFsdWU7Ci0gICAgVVNIT1JUICB0ZW1wLCByZXQ9MDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgdGVtcCwgcmV0PTA7CiAgICAgQk9PTEVBTiBmYWlsZWQgPSBGQUxTRTsKIAogICAgIFNpU19TZXRTd2l0Y2hEREMyKFNpU19Qcik7CiAgICAgaWYoU2lTX1ByZXBhcmVEREMoU2lTX1ByKSkgewogICAgICAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQcm9iZTogUHJlcGFyZSBmYWlsZWRcbiIpOwogI2VuZGlmCi0gICAgICAgICByZXR1cm4oMHhGRkZGKTsKKyNlbmRpZgorICAgICAgICAgcmV0dXJuIDB4RkZGRjsKICAgICB9CiAgICAgbWFzayA9IDB4ZjA7CiAgICAgdmFsdWUgPSAweDIwOwogICAgIGlmKFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID09IDB4YTApIHsKLSAgICAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIsIDApOworICAgICAgIHRlbXAgPSAodW5zaWduZWQgY2hhcilTaVNfUmVhZEREQzJEYXRhKFNpU19Qcik7CiAgICAgICAgU2lTX1NlbmRBQ0soU2lTX1ByLCAwKTsKICAgICAgICBpZih0ZW1wID09IDApIHsKICAgICAgICAgICAgbWFzayA9IDB4ZmY7CkBAIC05NTIzLDM0ICs5MzIyLDQxIEBACiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmFpbGVkID0gVFJVRTsKIAkgICByZXQgPSAweEZGRkY7CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmZGVmIFRXREVCVUcKICAgICAgICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQcm9iZTogUmVhZCAxIGZhaWxlZFxuIik7CiAjZW5kaWYKKyNlbmRpZgogICAgICAgIH0KICAgICB9CiAgICAgaWYoZmFpbGVkID09IEZBTFNFKSB7Ci0gICAgICAgdGVtcCA9ICh1bnNpZ25lZCBjaGFyKVNpU19SZWFkRERDMkRhdGEoU2lTX1ByLCAwKTsKKyAgICAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIpOwogICAgICAgIFNpU19TZW5kQUNLKFNpU19QciwgMSk7CiAgICAgICAgdGVtcCAmPSBtYXNrOwogICAgICAgIGlmKHRlbXAgPT0gdmFsdWUpIHJldCA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgcmV0ID0gMHhGRkZGOworI2lmZGVmIFNJU19YT1JHX1hGODYKICNpZmRlZiBUV0RFQlVHCiAgICAgICAgICAgeGY4NkRydk1zZygwLCBYX0lORk8sICJQcm9iZTogUmVhZCAyIGZhaWxlZFxuIik7CiAjZW5kaWYKKyNlbmRpZgogICAgICAgICAgIGlmKFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID09IDB4YTApIHsKICAgICAgICAgICAgICBpZih0ZW1wID09IDB4MzApIHJldCA9IDA7CiAgICAgICAgICAgfQogICAgICAgIH0KICAgICB9CiAgICAgU2lTX1NldFN0b3AoU2lTX1ByKTsKLSAgICByZXR1cm4ocmV0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfUHJvYmVEREMoU2lTX1ByaXZhdGUgKlNpU19QcikKKyNpZm5kZWYgU0lTX1hPUkdfWEY4Ngorc3RhdGljCisjZW5kaWYKK3Vuc2lnbmVkIHNob3J0CitTaVNfUHJvYmVEREMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICBVU0hPUlQgZmxhZzsKKyAgIHVuc2lnbmVkIHNob3J0IGZsYWc7CiAKICAgIGZsYWcgPSAweDE4MDsKICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhMDsKQEAgLTk1NjAsMTYgKzkzNjYsMTkgQEAKICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhNjsKICAgIGlmKCEoU2lTX0RvUHJvYmVEREMoU2lTX1ByKSkpIGZsYWcgfD0gMHgxMDsKICAgIGlmKCEoZmxhZyAmIDB4MWEpKSBmbGFnID0gMDsKLSAgIHJldHVybihmbGFnKTsKKyAgIHJldHVybiBmbGFnOwogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfUmVhZEREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgRERDZGF0YXR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKKyNpZm5kZWYgU0lTX1hPUkdfWEY4Ngorc3RhdGljCisjZW5kaWYKK3Vuc2lnbmVkIHNob3J0CitTaVNfUmVhZEREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKIHsKLSAgIFVTSE9SVCBmbGFnLCBsZW5ndGgsIGk7CisgICB1bnNpZ25lZCBzaG9ydCBmbGFnLCBsZW5ndGgsIGk7CiAgICB1bnNpZ25lZCBjaGFyIGNoa3N1bSxnb3RjaGE7CiAKLSAgIGlmKEREQ2RhdGF0eXBlID4gNCkgcmV0dXJuIDB4RkZGRjsgIAorICAgaWYoRERDZGF0YXR5cGUgPiA0KSByZXR1cm4gMHhGRkZGOwogCiAgICBmbGFnID0gMDsKICAgIFNpU19TZXRTd2l0Y2hEREMyKFNpU19Qcik7CkBAIC05NTc5LDIxICs5Mzg4LDIxIEBACiAgICAgICBjaGtzdW0gPSAwOwogICAgICAgZ290Y2hhID0gMDsKICAgICAgIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLSAgICAgICAgIGJ1ZmZlcltpXSA9ICh1bnNpZ25lZCBjaGFyKVNpU19SZWFkRERDMkRhdGEoU2lTX1ByLCAwKTsKKwkgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIpOwogCSBjaGtzdW0gKz0gYnVmZmVyW2ldOwogCSBnb3RjaGEgfD0gYnVmZmVyW2ldOwogCSBTaVNfU2VuZEFDSyhTaVNfUHIsIDApOwogICAgICAgfQotICAgICAgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIsIDApOworICAgICAgYnVmZmVyW2ldID0gKHVuc2lnbmVkIGNoYXIpU2lTX1JlYWREREMyRGF0YShTaVNfUHIpOwogICAgICAgY2hrc3VtICs9IGJ1ZmZlcltpXTsKICAgICAgIFNpU19TZW5kQUNLKFNpU19QciwgMSk7Ci0gICAgICBpZihnb3RjaGEpIGZsYWcgPSAoVVNIT1JUKWNoa3N1bTsKKyAgICAgIGlmKGdvdGNoYSkgZmxhZyA9ICh1bnNpZ25lZCBzaG9ydCljaGtzdW07CiAgICAgICBlbHNlIGZsYWcgPSAweEZGRkY7CiAgICB9IGVsc2UgewogICAgICAgZmxhZyA9IDB4RkZGRjsKICAgIH0KICAgIFNpU19TZXRTdG9wKFNpU19Qcik7Ci0gICByZXR1cm4oZmxhZyk7CisgICByZXR1cm4gZmxhZzsKIH0KIAogLyogT3VyIHByaXZhdGUgRERDIGZ1bmN0aW9ucwpAQCAtOTYxNywxNyArOTQyNiwyNSBAQAogICAgICAgIGlmIEREQ2RhdGF0eXBlID0gMDogIFJldHVybnMgc3VwcG9ydGVkIEREQyBtb2RlcwogCiAgKi8KLVVTSE9SVAotU2lTX0hhbmRsZUREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBsb25nIFZCRmxhZ3MsIGludCBWR0FFbmdpbmUsCi0gICAgICAgICAgICAgIFVTSE9SVCBhZGFwdG51bSwgVVNIT1JUIEREQ2RhdGF0eXBlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCit1bnNpZ25lZCBzaG9ydAorU2lTX0hhbmRsZUREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBWR0FFbmdpbmUsCisgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGFkYXB0bnVtLCB1bnNpZ25lZCBzaG9ydCBERENkYXRhdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCSAgICAgIHVuc2lnbmVkIGludCBWQkZsYWdzMikKIHsKLSAgIHVuc2lnbmVkIGNoYXIgc3IxZixjcjE3PTE7Ci0gICBVU0hPUlQgcmVzdWx0OworICAgdW5zaWduZWQgY2hhciAgc3IxZiwgY3IxNz0xOworICAgdW5zaWduZWQgc2hvcnQgcmVzdWx0OwogCi0gICBpZihhZGFwdG51bSA+IDIpIHJldHVybiAweEZGRkY7Ci0gICBpZihERENkYXRhdHlwZSA+IDQpIHJldHVybiAweEZGRkY7Ci0gICBpZigoIShWQkZsYWdzICYgVkJfVklERU9CUklER0UpKSAmJiAoYWRhcHRudW0gPiAwKSkgcmV0dXJuIDB4RkZGRjsKLSAgIGlmKFNpU19Jbml0RERDUmVncyhTaVNfUHIsIFZCRmxhZ3MsIFZHQUVuZ2luZSwgYWRhcHRudW0sIEREQ2RhdGF0eXBlLCBGQUxTRSkgPT0gMHhGRkZGKSByZXR1cm4gMHhGRkZGOworICAgaWYoYWRhcHRudW0gPiAyKQorICAgICAgcmV0dXJuIDB4RkZGRjsKKworICAgaWYoRERDZGF0YXR5cGUgPiA0KQorICAgICAgcmV0dXJuIDB4RkZGRjsKKworICAgaWYoKCEoVkJGbGFnczIgJiBWQjJfVklERU9CUklER0UpKSAmJiAoYWRhcHRudW0gPiAwKSkKKyAgICAgIHJldHVybiAweEZGRkY7CisKKyAgIGlmKFNpU19Jbml0RERDUmVncyhTaVNfUHIsIFZCRmxhZ3MsIFZHQUVuZ2luZSwgYWRhcHRudW0sIEREQ2RhdGF0eXBlLCBGQUxTRSwgVkJGbGFnczIpID09IDB4RkZGRikKKyAgICAgIHJldHVybiAweEZGRkY7CiAKICAgIHNyMWYgPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsMHgxZik7CiAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUDNjNCwweDFmLDB4M2YsMHgwNCk7CkBAIC05NjU2LDEwICs5NDczLDEyIEBACiAJICAgIChidWZmZXJbNF0gPT0gMHhmZikgJiYgKGJ1ZmZlcls1XSA9PSAweGZmKSAmJgogCSAgICAoYnVmZmVyWzZdID09IDB4ZmYpICYmIChidWZmZXJbN10gPT0gMHgwMCkgJiYKIAkgICAgKGJ1ZmZlclsweDEyXSA9PSAxKSkgewotCSAgICBpZihhZGFwdG51bSA9PSAxKSB7Ci0JICAgICAgIGlmKCEoYnVmZmVyWzB4MTRdICYgMHg4MCkpIHJlc3VsdCA9IDB4RkZGRTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgaWYoYnVmZmVyWzB4MTRdICYgMHg4MCkgICAgcmVzdWx0ID0gMHhGRkZFOworCSAgICBpZighU2lTX1ByLT5ERENQb3J0TWl4dXApIHsKKwkgICAgICAgaWYoYWRhcHRudW0gPT0gMSkgeworCSAgICAgICAgICBpZighKGJ1ZmZlclsweDE0XSAmIDB4ODApKSByZXN1bHQgPSAweEZGRkU7CisJICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgIGlmKGJ1ZmZlclsweDE0XSAmIDB4ODApICAgIHJlc3VsdCA9IDB4RkZGRTsKKwkgICAgICAgfQogCSAgICB9CiAJIH0KICAgICAgIH0KQEAgLTk2NzEsODMyICs5NDkwLDEwIEBACiAgICByZXR1cm4gcmVzdWx0OwogfQogCi0jaWZkZWYgTElOVVhfWEY4NgotCi1zdGF0aWMgQk9PTEVBTgotY2hlY2tlZGlkMSh1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0gICAvKiBDaGVjayBoZWFkZXIgKi8KLSAgIGlmKChidWZmZXJbMF0gIT0gMHgwMCkgfHwKLSAgICAgIChidWZmZXJbMV0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbMl0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbM10gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbNF0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbNV0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbNl0gIT0gMHhmZikgfHwKLSAgICAgIChidWZmZXJbN10gIT0gMHgwMCkpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgIC8qIENoZWNrIEVESUQgdmVyc2lvbiBhbmQgcmV2aXNpb24gKi8KLSAgIGlmKChidWZmZXJbMHgxMl0gIT0gMSkgfHwgKGJ1ZmZlclsweDEzXSA+IDQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgIC8qIENoZWNrIHdlZWsgb2YgbWFudWZhY3R1cmUgZm9yIHNhbml0eSAqLwotICAgaWYoYnVmZmVyWzB4MTBdID4gNTMpIHJldHVybiBGQUxTRTsKLQotICAgLyogQ2hlY2sgeWVhciBvZiBtYW51ZmFjdHVyZSBmb3Igc2FuaXR5ICovCi0gICBpZihidWZmZXJbMHgxMV0gPiA0MCkgcmV0dXJuIEZBTFNFOwotCi0gICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIEJPT0xFQU4KLWNoZWNrZWRpZDIodW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotICAgVVNIT1JUIHllYXIgPSBidWZmZXJbNl0gfCAoYnVmZmVyWzddIDw8IDgpOwotCi0gICAvKiBDaGVjayBFRElEIHZlcnNpb24gKi8KLSAgIGlmKChidWZmZXJbMF0gJiAweGYwKSAhPSAweDIwKSByZXR1cm4gRkFMU0U7Ci0KLSAgIC8qIENoZWNrIHdlZWsgb2YgbWFudWZhY3R1cmUgZm9yIHNhbml0eSAqLwotICAgaWYoYnVmZmVyWzVdID4gNTMpIHJldHVybiBGQUxTRTsKLQotICAgLyogQ2hlY2sgeWVhciBvZiBtYW51ZmFjdHVyZSBmb3Igc2FuaXR5ICovCi0gICBpZigoeWVhciAhPSAwKSAmJiAoKHllYXIgPCAxOTkwKSB8fCAoeWVhciA+IDIwMzApKSkgcmV0dXJuIEZBTFNFOwotCi0gICByZXR1cm4gVFJVRTsKLX0KLQotLyogU2Vuc2UgdGhlIExDRCBwYXJhbWV0ZXJzIChDUjM2LCBDUjM3KSB2aWEgRERDICovCi0vKiBTaVMzMHgoQikgb25seSAqLwotVVNIT1JUCi1TaVNfU2Vuc2VMQ0REREMoU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTUHRyIHBTaVMpCi17Ci0gICBVU0hPUlQgRERDZGF0YXR5cGUsIHBhbmVsdHlwZSwgZmxhZywgeHJlcz0wLCB5cmVzPTA7Ci0gICBVU0hPUlQgaW5kZXgsIG15aW5kZXgsIGx1bXNpemUsIG51bWNvZGVzLCBwYW5lbHZlbmRvciwgcGFuZWxwcm9kdWN0OwotICAgaW50IG1heHg9MCwgbWF4eT0wLCBwcmVmeD0wLCBwcmVmeT0wOwotICAgdW5zaWduZWQgY2hhciBjcjM3PTAsIHNlZWtjb2RlOwotICAgQk9PTEVBTiBjaGVja2V4cGFuZCA9IEZBTFNFOwotICAgQk9PTEVBTiBoYXZlc3luYyA9IEZBTFNFOwotICAgQk9PTEVBTiBpbmRiID0gRkFMU0U7Ci0gICBpbnQgcmV0cnksIGk7Ci0gICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gICBmb3IoaT0wOyBpPDc7IGkrKykgU2lTX1ByLT5DUF9EYXRhVmFsaWRbaV0gPSBGQUxTRTsKLSAgIFNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEgPSBGQUxTRTsKLSAgIFNpU19Qci0+Q1BfTWF4WCA9IFNpU19Qci0+Q1BfTWF4WSA9IFNpU19Qci0+Q1BfTWF4Q2xvY2sgPSAwOwotICAgU2lTX1ByLT5DUF9QcmVmZXJyZWRYID0gU2lTX1ByLT5DUF9QcmVmZXJyZWRZID0gMDsKLSAgIFNpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXggPSAtMTsKLSAgIFNpU19Qci0+Q1BfUHJlZkNsb2NrID0gMDsKLSAgIFNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQgPSBGQUxTRTsKLQotICAgaWYoIShwU2lTLT5WQkZsYWdzICYgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQikpKSByZXR1cm4gMDsKLSAgIGlmKHBTaVMtPlZCRmxhZ3MgJiBWQl8zMHhCREgpIHJldHVybiAwOwotICAKLSAgIGlmKFNpU19Jbml0RERDUmVncyhTaVNfUHIsIHBTaVMtPlZCRmxhZ3MsIHBTaVMtPlZHQUVuZ2luZSwgMSwgMCwgRkFMU0UpID09IDB4RkZGRikgcmV0dXJuIDA7Ci0gICAKLSAgIFNpU19Qci0+U2lTX0REQ19TZWNBZGRyID0gMHgwMDsKLSAgIAotICAgLyogUHJvYmUgc3VwcG9ydGVkIERBJ3MgKi8KLSAgIGZsYWcgPSBTaVNfUHJvYmVEREMoU2lTX1ByKTsKLSNpZmRlZiBUV0RFQlVHCi0gICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfSU5GTywKLSAgIAkiQ1JUMiBEREMgY2FwYWJpbGl0aWVzIDB4JXhcbiIsIGZsYWcpOwotI2VuZGlmCQotICAgaWYoZmxhZyAmIDB4MTApIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhNjsJLyogRURJRCBWMiAoRlApICovCi0gICAgICBERENkYXRhdHlwZSA9IDQ7Ci0gICB9IGVsc2UgaWYoZmxhZyAmIDB4MDgpIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhMjsJLyogRURJRCBWMiAoUCZELUQgTW9uaXRvcikgKi8KLSAgICAgIEREQ2RhdGF0eXBlID0gMzsKLSAgIH0gZWxzZSBpZihmbGFnICYgMHgwMikgewotICAgICAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweGEwOwkvKiBFRElEIFYxICovCi0gICAgICBERENkYXRhdHlwZSA9IDE7Ci0gICB9IGVsc2UgcmV0dXJuIDA7CQkJCS8qIG5vIEREQyBzdXBwb3J0IChvciBubyBkZXZpY2UgYXR0YWNoZWQpICovCi0gICAKLSAgIC8qIFJlYWQgdGhlIGVudGlyZSBFRElEICovCi0gICByZXRyeSA9IDI7Ci0gICBkbyB7Ci0gICAgICBpZihTaVNfUmVhZEREQyhTaVNfUHIsIEREQ2RhdGF0eXBlLCBidWZmZXIpKSB7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotCSAJIkNSVDI6IEREQyByZWFkIGZhaWxlZCAoYXR0ZW1wdCAlZCksICVzXG4iLAotCQkoMy1yZXRyeSksIChyZXRyeSA9PSAxKSA/ICJnaXZpbmcgdXAiIDogInJldHJ5aW5nIik7Ci0JIHJldHJ5LS07Ci0JIGlmKHJldHJ5ID09IDApIHJldHVybiAweEZGRkY7Ci0gICAgICB9IGVsc2UgYnJlYWs7Ci0gICB9IHdoaWxlKDEpOwotCi0jaWZkZWYgVFdERUJVRwotICAgZm9yKGk9MDsgaTwyNTY7IGkrPTE2KSB7Ci0gICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLSAgICAgICAJIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JYnVmZmVyW2ldLCAgICBidWZmZXJbaSsxXSwgYnVmZmVyW2krMl0sIGJ1ZmZlcltpKzNdLAotCWJ1ZmZlcltpKzRdLCAgYnVmZmVyW2krNV0sIGJ1ZmZlcltpKzZdLCBidWZmZXJbaSs3XSwKLQlidWZmZXJbaSs4XSwgIGJ1ZmZlcltpKzldLCBidWZmZXJbaSsxMF0sIGJ1ZmZlcltpKzExXSwKLQlidWZmZXJbaSsxMl0sIGJ1ZmZlcltpKzEzXSwgYnVmZmVyW2krMTRdLCBidWZmZXJbaSsxNV0pOwotICAgfQotI2VuZGlmICAgCi0gICAKLSAgIC8qIEFuYWx5emUgRURJRCBhbmQgcmV0cmlldmUgTENEIHBhbmVsIGluZm9ybWF0aW9uICovCi0gICBwYW5lbHR5cGUgPSAwOwotICAgc3dpdGNoKEREQ2RhdGF0eXBlKSB7Ci0gICBjYXNlIDE6CQkJCQkJCS8qIEFuYWx5emUgRURJRCBWMSAqLwotICAgICAgLyogQ2F0Y2ggYSBmZXcgY2xlYXIgY2FzZXM6ICovCi0gICAgICBpZighKGNoZWNrZWRpZDEoYnVmZmVyKSkpIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JIAkiTENEIHNlbnNlOiBFRElEIGNvcnJ1cHRcbiIpOwotCSByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgaWYoIShidWZmZXJbMHgxNF0gJiAweDgwKSkgewotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgICAgICJMQ0Qgc2Vuc2U6IEF0dGFjaGVkIGRpc3BsYXkgZXhwZWN0cyBhbmFsb2cgaW5wdXQgKDB4JTAyeClcbiIsCi0JCWJ1ZmZlclsweDE0XSk7Ci0gICAgICAJIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBpZigoYnVmZmVyWzB4MThdICYgMHgxOCkgIT0gMHgwOCkgewotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgCSJMQ0Qgc2Vuc2U6IFdhcm5pbmc6IEF0dGFjaGVkIGRpc3BsYXkgaXMgbm90IG9mIFJHQiBidXQgb2YgJXMgdHlwZSAoMHglMDJ4KVxuIiwKLQkJKChidWZmZXJbMHgxOF0gJiAweDE4KSA9PSAweDAwKSA/ICJtb25vY2hyb21lL2dyZXlzY2FsZSIgOgotCQkgICggKChidWZmZXJbMHgxOF0gJiAweDE4KSA9PSAweDEwKSA/ICJub24tUkdCIG11bHRpY29sb3IiIDoKLQkJICAgICAidW5kZWZpbmVkIiksCi0JCWJ1ZmZlclsweDE4XSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdyBhbmFseXplIHRoZSBmaXJzdCBEZXRhaWxlZCBUaW1pbmcgQmxvY2sgYW5kIHNlZQotICAgICAgICogaWYgdGhlIHByZWZlcnJlZCB0aW1pbmcgbW9kZSBpcyBzdG9yZWQgdGhlcmUuIElmIHNvLAotICAgICAgICogY2hlY2sgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIHBhbmVsIGZvciB3aGljaCB3ZSBhbHJlYWR5Ci0gICAgICAgKiBrbm93IHRoZSB0aW1pbmcuCi0gICAgICAgKi8KLQotICAgICAgcGFuZWx0eXBlID0gUGFuZWxfQ3VzdG9tOwotICAgICAgY2hlY2tleHBhbmQgPSBGQUxTRTsKLQotICAgICAgcGFuZWx2ZW5kb3IgPSBidWZmZXJbOV0gfCAoYnVmZmVyWzhdIDw8IDgpOwotICAgICAgcGFuZWxwcm9kdWN0ID0gYnVmZmVyWzEwXSB8IChidWZmZXJbMTFdIDw8IDgpOwotCi0gICAgICAvKiBPdmVycnVsZSBib2d1cyBwcmVmZXJyZWQgbW9kZXMgZnJvbSBkYXRhYmFzZSAqLwotICAgICAgaWYoKGluZGIgPSBTaVNfRmluZFBhbmVsRnJvbURCKHBTaVMsIHBhbmVsdmVuZG9yLCBwYW5lbHByb2R1Y3QsICZtYXh4LCAmbWF4eSwgJnByZWZ4LCAmcHJlZnkpKSkgewotICAgICAgICAgaWYocHJlZngpIFNpU19Qci0+Q1BfUHJlZmVycmVkWCA9IHhyZXMgPSBwcmVmeDsKLQkgaWYocHJlZnkpIFNpU19Qci0+Q1BfUHJlZmVycmVkWSA9IHlyZXMgPSBwcmVmeTsKLSAgICAgIH0KLQotICAgICAgaWYoYnVmZmVyWzB4MThdICYgMHgwMikgewotCi0gICAgICAgICBVU0hPUlQgcGNsayA9IChidWZmZXJbMHgzNl0gfCAoYnVmZmVyWzB4MzddIDw8IDgpKTsKLQkgVVNIT1JUIHBoYiAgPSAoYnVmZmVyWzB4MzldIHwgKChidWZmZXJbMHgzYV0gJiAweDBmKSA8PCA4KSk7Ci0JIFVTSE9SVCBwdmIgID0gKGJ1ZmZlclsweDNjXSB8ICgoYnVmZmVyWzB4M2RdICYgMHgwZikgPDwgOCkpOwotCi0JIGlmKCF4cmVzKSBTaVNfUHItPkNQX1ByZWZlcnJlZFggPSB4cmVzID0gYnVmZmVyWzB4MzhdIHwgKChidWZmZXJbMHgzYV0gJiAweGYwKSA8PCA0KTsKLSAgICAgICAgIGlmKCF5cmVzKSBTaVNfUHItPkNQX1ByZWZlcnJlZFkgPSB5cmVzID0gYnVmZmVyWzB4M2JdIHwgKChidWZmZXJbMHgzZF0gJiAweGYwKSA8PCA0KTsKLQotICAgICAgICAgc3dpdGNoKHhyZXMpIHsKLSNpZiAwCSAgICAvKiBUcmVhdCBhcyBjdXN0b20gKi8KLSAgICAgICAgICAgIGNhc2UgODAwOgotCSAgICAgICAgaWYoeXJlcyA9PSA2MDApIHsKLQkgICAgIAkgICBwYW5lbHR5cGUgPSBQYW5lbF84MDB4NjAwOwotCSAgICAgCSAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBjYXNlIDEwMjQ6Ci0JICAgICAgICBpZih5cmVzID09IDc2OCkgewotCSAgICAgCSAgIHBhbmVsdHlwZSA9IFBhbmVsXzEwMjR4NzY4OwotCSAgICAgCSAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDEyODA6Ci0JICAgICAgICBpZih5cmVzID09IDEwMjQpIHsKLQkgICAgIAkgICBwYW5lbHR5cGUgPSBQYW5lbF8xMjgweDEwMjQ7Ci0JCSAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgICAgIH0gZWxzZSBpZih5cmVzID09IDk2MCkgewotCSAgICAgICAgICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCSAgICAgIHBhbmVsdHlwZSA9IFBhbmVsMzAwXzEyODB4OTYwOwotCQkgICB9IGVsc2UgewotCQkgICAgICBwYW5lbHR5cGUgPSBQYW5lbDMxMF8xMjgweDk2MDsKLQkJICAgfQotCSAgICAgICAgfSBlbHNlIGlmKHlyZXMgPT0gNzY4KSB7Ci0JCSAgIGlmKCAocGNsayA9PSA4MTAwKSAmJgotCQkgICAgICAgKHBoYiA9PSAoMTY4OCAtIDEyODApKSAmJgotCQkgICAgICAgKHB2YiA9PSAoODAyIC0gNzY4KSkgKSB7Ci0JICAgICAgIAkgICAgICBwYW5lbHR5cGUgPSBQYW5lbF8xMjgweDc2ODsKLQkJICAgICAgY2hlY2tleHBhbmQgPSBGQUxTRTsKLQkJICAgICAgY3IzNyB8PSAweDEwOwotCQkgICB9Ci0JICAgICAgICB9IGVsc2UgaWYoeXJlcyA9PSA4MDApIHsKLQkJICAgaWYoIChwY2xrID09IDY5MDApICYmCi0JCSAgICAgICAocGhiID09ICgxNDA4IC0gMTI4MCkpICYmCi0JCSAgICAgICAocHZiID09ICg4MTYgLSA4MDApKSApIHsKLQkgICAgICAgCSAgICAgIHBhbmVsdHlwZSA9IFBhbmVsXzEyODB4ODAwOwotCQkgICB9Ci0JCX0KLQkgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE0MDA6Ci0JICAgICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgICAgIGlmKHlyZXMgPT0gMTA1MCkgewotCSAgICAgICAgICAgICAgcGFuZWx0eXBlID0gUGFuZWwzMTBfMTQwMHgxMDUwOwotCQkgICAgICBjaGVja2V4cGFuZCA9IFRSVUU7Ci0JICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAJICAgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjAwOgotCSAgICAgICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCSAgIGlmKHBTaVMtPlZCRmxhZ3MgJiBWQl8zMDFDKSB7Ci0JICAgICAgICAgICAgICBpZih5cmVzID09IDEyMDApIHsKLQkgICAgICAgICAgICAgICAgIHBhbmVsdHlwZSA9IFBhbmVsMzEwXzE2MDB4MTIwMDsKLQkJICAgICAgICAgY2hlY2tleHBhbmQgPSBUUlVFOwotCQkgICAgICB9Ci0JICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAJICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotCSAvKiBTYXZlIHN5bmM6IFRoaXMgaXMgdXNlZCBpZiAiUGFzcyAxOjEiIGlzIG9mZjsgaW4gdGhpcyBjYXNlCi0JICAqIHdlIGFsd2F5cyB1c2UgdGhlIHBhbmVsJ3MgbmF0aXZlIG1vZGUgPSB0aGlzICJwcmVmZXJyZWQgbW9kZSIKLQkgICogd2UganVzdCBoYXZlIGJlZW4gYW5hbHlzaW5nLiBIZW5jZSwgd2UgYWxzbyBuZWVkIGl0cyBzeW5jLgotCSAgKi8KLQkgaWYoKGJ1ZmZlclsweDQ3XSAmIDB4MTgpID09IDB4MTgpIHsKLQkgICAgY3IzNyB8PSAoKCgoYnVmZmVyWzB4NDddICYgMHgwNikgXiAweDA2KSA8PCA1KSB8IDB4MjApOwotCSAgICBoYXZlc3luYyA9IFRSVUU7Ci0JIH0gZWxzZSB7Ci0JICAgIC8qIFdoYXQgbm93PyBUaGVyZSBpcyBubyBkaWdpdGFsIHNlcGFyYXRlIG91dHB1dCB0aW1pbmcuLi4gKi8KLQkgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1dBUk5JTkcsCi0JICAgICAgIAkgICAiTENEIHNlbnNlOiBVbmFibGUgdG8gcmV0cmlldmUgU3luYyBwb2xhcml0eSBpbmZvcm1hdGlvblxuIik7Ci0JICAgIGNyMzcgfD0gMHhjMDsgIC8qIERlZmF1bHQgKi8KLQkgfQotCi0gICAgICB9Ci0KLSAgICAgIC8qIENoZWNrIGFnYWluc3Qgb3VyIGRhdGFiYXNlOyBlZy4gU2FueW8gWjIgcHJvamVjdG9yIHJlcG9ydHMKLSAgICAgICAqIDEwMjR4NzY4IGFzIHByZWZlcnJlZCBtb2RlLCBhbHRob3VnaCBpdCBzdXBwb3J0cyAxMjgweDcyMAotICAgICAgICogbmF0aXZlbHkgaW4gbm9uLUhEQ1AgbW9kZS4gVHJlYXQgc3VjaCB3cm9uZ2x5IHJlcG9ydGluZwotICAgICAgICogcGFuZWxzIGFzIGN1c3RvbSBhbmQgZml4dXAgYWN0dWFsIG1heGltdW0gcmVzb2x1dGlvbnMuCi0gICAgICAgKi8KLSAgICAgIGlmKHBhbmVsdHlwZSAhPSBQYW5lbF9DdXN0b20pIHsKLSAgICAgICAgIGlmKGluZGIpIHsKLQkgICAgcGFuZWx0eXBlID0gUGFuZWxfQ3VzdG9tOwotCSAgICBTaVNfUHItPkNQX01heFggPSBtYXh4OwotCSAgICBTaVNfUHItPkNQX01heFkgPSBtYXh5OwotCSAgICAvKiBMZWF2ZSBwcmVmZXJyZWQgdW5jaGFuZ2VkIChNVVNUIGNvbnRhaW4gYSB2YWxpZCBtb2RlISkgKi8KLQkgfQotICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgcGFuZWwgdGhpcyBpcywgd2UgdGFrZSBpdAotICAgICAgICogYXMgYSBjdXN0b20gcGFuZWwgYW5kIGRlcml2ZSB0aGUgdGltaW5nIGRhdGEgZnJvbSB0aGUKLSAgICAgICAqIGRldGFpbGVkIHRpbWluZyBibG9ja3MKLSAgICAgICAqLwotICAgICAgaWYocGFuZWx0eXBlID09IFBhbmVsX0N1c3RvbSkgewotCi0JIGludCBpLCB0ZW1wLCBiYXNlID0gMHgzNjsKLQkgdW5zaWduZWQgbG9uZyBlc3RwYWNrOwotCSBjb25zdCB1bnNpZ25lZCBzaG9ydCBlc3R4W10gPSB7Ci0JIAk3MjAsIDcyMCwgNjQwLCA2NDAsIDY0MCwgNjQwLCA4MDAsIDgwMCwKLQkJODAwLCA4MDAsIDgzMiwxMDI0LDEwMjQsMTAyNCwxMDI0LDEyODAsCi0JCTExNTIKLQkgfTsKLQkgY29uc3QgdW5zaWduZWQgc2hvcnQgZXN0eVtdID0gewotCSAJNDAwLCA0MDAsIDQ4MCwgNDgwLCA0ODAsIDQ4MCwgNjAwLCA2MDAsCi0JCTYwMCwgNjAwLCA2MjQsIDc2OCwgNzY4LCA3NjgsIDc2OCwxMDI0LAotCQk4NzAKLQkgfTsKLQkgY29uc3QgaW50IGVzdGNsa1tdID0gewotCSAgICAgICAgICAgIDAsICAgICAwLCAyNTEwMCwgICAwLCAzMTUwMCwgMzE1MDAsIDM2MTAwLCA0MDAwMCwKLQkJNTAxMDAsIDQ5NTAwLCAgICAgMCwgICAwLCA2NTEwMCwgNzUyMDAsIDc4NzAwLDEzNTIwMCwKLQkJMAotCSB9OwotCi0JIHBhbmVsdHlwZSA9IDA7Ci0JIFNpU19Qci0+Q1BfU3VwcG9ydHM2NDA0ODA3NSA9IFRSVUU7Ci0KLQkgLyogRmluZCB0aGUgbWF4aW11bSByZXNvbHV0aW9uICovCi0KLQkgLyogMS4gRnJvbSBFc3RhYmxpc2hlZCB0aW1pbmdzICovCi0JIGVzdHBhY2sgPSAoYnVmZmVyWzB4MjNdIDw8IDkpIHwgKGJ1ZmZlclsweDI0XSA8PCAxKSB8ICgoYnVmZmVyWzB4MjVdID4+IDcpICYgMHgwMSk7Ci0JIGZvcihpPTE2OyBpPj0wOyBpLS0pIHsKLQkgICAgIGlmKGVzdHBhY2sgJiAoMSA8PCBpKSkgewotCSAgICAgICAgaWYoZXN0eFsxNiAtIGldID4gU2lTX1ByLT5DUF9NYXhYKSBTaVNfUHItPkNQX01heFggPSBlc3R4WzE2IC0gaV07Ci0JCWlmKGVzdHlbMTYgLSBpXSA+IFNpU19Qci0+Q1BfTWF4WSkgU2lTX1ByLT5DUF9NYXhZID0gZXN0eVsxNiAtIGldOwotCQlpZihlc3RjbGtbMTYgLSBpXSA+IFNpU19Qci0+Q1BfTWF4Q2xvY2spIFNpU19Qci0+Q1BfTWF4Q2xvY2sgPSBlc3RjbGtbMTYgLSBpXTsKLQkgICAgIH0KLQkgfQotCi0JIC8qIEJ5IGRlZmF1bHQgd2UgZHJpdmUgdGhlIExDRCBhdCA3NUh6IGluIDY0MHg0ODAgbW9kZTsgaWYKLSAgCSAgKiB0aGUgcGFuZWwgZG9lcyBub3QgcHJvdmlkZSB0aGlzIG1vZGUsIHVzZSA2MGh6Ci0JICAqLwotCSBpZighKGJ1ZmZlclsweDIzXSAmIDB4MDQpKSBTaVNfUHItPkNQX1N1cHBvcnRzNjQwNDgwNzUgPSBGQUxTRTsKLQotCSAvKiAyLiBGcm9tIFN0YW5kYXJkIFRpbWluZ3MgKi8KLQkgZm9yKGk9MHgyNjsgaSA8IDB4MzY7IGkrPTIpIHsKLQkgICAgaWYoKGJ1ZmZlcltpXSAhPSAweDAxKSAmJiAoYnVmZmVyW2krMV0gIT0gMHgwMSkpIHsKLQkgICAgICAgdGVtcCA9IChidWZmZXJbaV0gKyAzMSkgKiA4OwotCSAgICAgICBpZih0ZW1wID4gU2lTX1ByLT5DUF9NYXhYKSBTaVNfUHItPkNQX01heFggPSB0ZW1wOwotCSAgICAgICBzd2l0Y2goKGJ1ZmZlcltpKzFdICYgMHhjMCkgPj4gNikgewotCSAgICAgICBjYXNlIDB4MDM6IHRlbXAgPSB0ZW1wICogOSAvIDE2OyBicmVhazsKLQkgICAgICAgY2FzZSAweDAyOiB0ZW1wID0gdGVtcCAqIDQgLyA1OyAgYnJlYWs7Ci0JICAgICAgIGNhc2UgMHgwMTogdGVtcCA9IHRlbXAgKiAzIC8gNDsgIGJyZWFrOwotCSAgICAgICB9Ci0JICAgICAgIGlmKHRlbXAgPiBTaVNfUHItPkNQX01heFkpIFNpU19Qci0+Q1BfTWF4WSA9IHRlbXA7Ci0JICAgIH0KLQkgfQotCi0JIC8qIE5vdyBleHRyYWN0IHRoZSBEZXRhaWxlZCBUaW1pbmdzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBtb2RlcyAqLwotCi0gICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyssIGJhc2UgKz0gMTgpIHsKLQotCSAgICAvKiBJcyB0aGlzIGEgZGV0YWlsZWQgdGltaW5nIGJsb2NrIG9yIGEgbW9uaXRvciBkZXNjcmlwdG9yPyAqLwotCSAgICBpZihidWZmZXJbYmFzZV0gfHwgYnVmZmVyW2Jhc2UrMV0gfHwgYnVmZmVyW2Jhc2UrMl0pIHsKLQotICAgICAgCSAgICAgICB4cmVzID0gYnVmZmVyW2Jhc2UrMl0gfCAoKGJ1ZmZlcltiYXNlKzRdICYgMHhmMCkgPDwgNCk7Ci0gICAgICAgICAgICAgICB5cmVzID0gYnVmZmVyW2Jhc2UrNV0gfCAoKGJ1ZmZlcltiYXNlKzddICYgMHhmMCkgPDwgNCk7Ci0KLQkgICAgICAgU2lTX1ByLT5DUF9IRGlzcGxheVtpXSA9IHhyZXM7Ci0JICAgICAgIFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSA9IHhyZXMgKyAoYnVmZmVyW2Jhc2UrOF0gfCAoKGJ1ZmZlcltiYXNlKzExXSAmIDB4YzApIDw8IDIpKTsKLSAgICAgICAgICAgICAgIFNpU19Qci0+Q1BfSFN5bmNFbmRbaV0gICA9IFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSArIChidWZmZXJbYmFzZSs5XSB8ICgoYnVmZmVyW2Jhc2UrMTFdICYgMHgzMCkgPDwgNCkpOwotCSAgICAgICBTaVNfUHItPkNQX0hUb3RhbFtpXSA9IHhyZXMgKyAoYnVmZmVyW2Jhc2UrM10gfCAoKGJ1ZmZlcltiYXNlKzRdICYgMHgwZikgPDwgOCkpOwotCSAgICAgICBTaVNfUHItPkNQX0hCbGFua1N0YXJ0W2ldID0geHJlcyArIDE7Ci0JICAgICAgIFNpU19Qci0+Q1BfSEJsYW5rRW5kW2ldID0gU2lTX1ByLT5DUF9IVG90YWxbaV07Ci0KLQkgICAgICAgU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA9IHlyZXM7Ci0gICAgICAgICAgICAgICBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0gPSB5cmVzICsgKCgoYnVmZmVyW2Jhc2UrMTBdICYgMHhmMCkgPj4gNCkgfCAoKGJ1ZmZlcltiYXNlKzExXSAmIDB4MGMpIDw8IDIpKTsKLSAgICAgICAgICAgICAgIFNpU19Qci0+Q1BfVlN5bmNFbmRbaV0gPSBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0gKyAoKGJ1ZmZlcltiYXNlKzEwXSAmIDB4MGYpIHwgKChidWZmZXJbYmFzZSsxMV0gJiAweDAzKSA8PCA0KSk7Ci0JICAgICAgIFNpU19Qci0+Q1BfVlRvdGFsW2ldID0geXJlcyArIChidWZmZXJbYmFzZSs2XSB8ICgoYnVmZmVyW2Jhc2UrN10gJiAweDBmKSA8PCA4KSk7Ci0JICAgICAgIFNpU19Qci0+Q1BfVkJsYW5rU3RhcnRbaV0gPSB5cmVzICsgMTsKLQkgICAgICAgU2lTX1ByLT5DUF9WQmxhbmtFbmRbaV0gPSBTaVNfUHItPkNQX1ZUb3RhbFtpXTsKLQotCSAgICAgICBTaVNfUHItPkNQX0Nsb2NrW2ldID0gKGJ1ZmZlcltiYXNlXSB8IChidWZmZXJbYmFzZSsxXSA8PCA4KSkgKiAxMDsKLQotCSAgICAgICBTaVNfUHItPkNQX0RhdGFWYWxpZFtpXSA9IFRSVUU7Ci0KLQkgICAgICAgLyogU29ydCBvdXQgaW52YWxpZCB0aW1pbmdzLCBpbnRlcmxhY2UgYW5kIHRvbyBoaWdoIGNsb2NrcyAqLwotCSAgICAgICBpZigoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSAmIDcpCQkJCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSA+IFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSkgIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfSERpc3BsYXlbaV0gPj0gU2lTX1ByLT5DUF9IU3luY0VuZFtpXSkgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX0hEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfSFRvdGFsW2ldKSAgICAgCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldID49IFNpU19Qci0+Q1BfSFN5bmNFbmRbaV0pIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSA+IFNpU19Qci0+Q1BfSFRvdGFsW2ldKSAgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX0hTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9IVG90YWxbaV0pICAgICAgCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA+IFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSkgIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0gPj0gU2lTX1ByLT5DUF9WU3luY0VuZFtpXSkgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX1ZEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfVlRvdGFsW2ldKSAgICAgCQkJICB8fAotCSAgICAgICAgICAoU2lTX1ByLT5DUF9WU3luY1N0YXJ0W2ldID4gU2lTX1ByLT5DUF9WU3luY0VuZFtpXSkgIAkJCSAgfHwKLQkgICAgICAgICAgKFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSA+IFNpU19Qci0+Q1BfVlRvdGFsW2ldKSAgICAJCQkgIHx8Ci0JICAgICAgICAgIChTaVNfUHItPkNQX1ZTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9WVG90YWxbaV0pICAgICAgCQkJICB8fAotCQkgICgoKHBTaVMtPlZCRmxhZ3MgJiBWQl8zMDFDKSAmJiAoU2lTX1ByLT5DUF9DbG9ja1tpXSA+IDE2MjUwMCkpIHx8Ci0JICAgICAgICAgICAoKCEocFNpUy0+VkJGbGFncyAmIFZCXzMwMUMpKSAmJgotCQkgICAgKChTaVNfUHItPkNQX0Nsb2NrW2ldID4gMTA4MjAwKSB8fCAoU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA+IDEwMjQpIHx8Ci0JCSAgICAgKFNpU19Qci0+Q1BfSERpc3BsYXlbaV0gPiAxNjAwKSkpKSAJCQkJICB8fAotCQkgIChidWZmZXJbYmFzZSsxN10gJiAweDgwKSkgewotCi0JICAgICAgICAgIFNpU19Qci0+Q1BfRGF0YVZhbGlkW2ldID0gRkFMU0U7Ci0KLQkgICAgICAgfSBlbHNlIHsKLQotCQkgIFNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEgPSBUUlVFOwotCi0JCSAgaWYoeHJlcyA+IFNpU19Qci0+Q1BfTWF4WCkgU2lTX1ByLT5DUF9NYXhYID0geHJlczsKLQkgICAgICAgICAgaWYoeXJlcyA+IFNpU19Qci0+Q1BfTWF4WSkgU2lTX1ByLT5DUF9NYXhZID0geXJlczsKLQkJICBpZihTaVNfUHItPkNQX0Nsb2NrW2ldID4gU2lTX1ByLT5DUF9NYXhDbG9jaykgU2lTX1ByLT5DUF9NYXhDbG9jayA9IFNpU19Qci0+Q1BfQ2xvY2tbaV07Ci0KLQkJICBpZigoU2lTX1ByLT5DUF9QcmVmZXJyZWRYID09IHhyZXMpICYmIChTaVNfUHItPkNQX1ByZWZlcnJlZFkgPT0geXJlcykpIHsKLQkgICAgICAgICAgICAgU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleCA9IGk7Ci0JCSAgICAgU2lTX01ha2VDbG9ja1JlZ3MocFNpUy0+cFNjcm4sIFNpU19Qci0+Q1BfQ2xvY2tbaV0sICZTaVNfUHItPkNQX1ByZWZTUjJCLCAmU2lTX1ByLT5DUF9QcmVmU1IyQyk7Ci0JCSAgICAgU2lTX1ByLT5DUF9QcmVmQ2xvY2sgPSAoU2lTX1ByLT5DUF9DbG9ja1tpXSAvIDEwMDApICsgMTsKLQkgICAgICAgICAgfQotCi0JICAgICAgICAgIC8qIEV4dHJhY3QgdGhlIHN5bmMgcG9sYXJpc2F0aW9uIGluZm9ybWF0aW9uLiBUaGlzIG9ubHkgd29ya3MKLQkgICAgICAgICAgICogaWYgdGhlIEZsYWdzIGluZGljYXRlIGEgZGlnaXRhbCBzZXBhcmF0ZSBvdXRwdXQuCi0JICAgICAgICAgICAqLwotCSAgICAgICAgICBpZigoYnVmZmVyW2Jhc2UrMTddICYgMHgxOCkgPT0gMHgxOCkgewotCQkgICAgIFNpU19Qci0+Q1BfSFN5bmNfUFtpXSA9IChidWZmZXJbYmFzZSsxN10gJiAweDAyKSA/IFRSVUUgOiBGQUxTRTsKLQkJICAgICBTaVNfUHItPkNQX1ZTeW5jX1BbaV0gPSAoYnVmZmVyW2Jhc2UrMTddICYgMHgwNCkgPyBUUlVFIDogRkFMU0U7Ci0JCSAgICAgU2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0gPSBUUlVFOwotCQkgICAgIGlmKChpID09IFNpU19Qci0+Q1BfUHJlZmVycmVkSW5kZXgpICYmICghaGF2ZXN5bmMpKSB7Ci0JICAgICAgICAgICAgICAgIGNyMzcgfD0gKCgoKGJ1ZmZlcltiYXNlKzE3XSAmIDB4MDYpIF4gMHgwNikgPDwgNSkgfCAweDIwKTsKLQkJCWhhdmVzeW5jID0gVFJVRTsKLQkgICAJICAgICB9Ci0JICAgICAgICAgIH0gZWxzZSB7Ci0JCSAgICAgU2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0gPSBGQUxTRTsKLQkJICB9Ci0KLQkgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYoKCFidWZmZXJbYmFzZV0pICYmICghYnVmZmVyW2Jhc2UrMV0pICYmICghYnVmZmVyW2Jhc2UrMl0pICYmICghYnVmZmVyW2Jhc2UrNF0pKSB7Ci0KLQkgICAgICAgLyogTWF4aW11bSBwaXhjbG9jayBmcm9tIE1vbml0b3IgUmFuZ2UgTGltaXRzICovCi0JICAgICAgIGlmKChidWZmZXJbYmFzZSszXSA9PSAweGZkKSAmJiAoYnVmZmVyW2Jhc2UrOV0gIT0gMHhmZikpIHsKLQkgICAgICAgICAgaW50IG1heGNsayA9IGJ1ZmZlcltiYXNlKzldICogMTA7Ci0JCSAgLyogTW9yZSB0aGFuIDE3MCBpcyBub3Qgc3VwcG9ydGVkIGFueXdheSAqLwotCQkgIGlmKG1heGNsayA8PSAxNzApIFNpU19Qci0+Q1BfTWF4Q2xvY2sgPSBtYXhjbGsgKiAxMDAwOwotCSAgICAgICB9Ci0KLQkgICAgfQotCi0JIH0KLQotCSBpZihTaVNfUHItPkNQX01heFggJiYgU2lTX1ByLT5DUF9NYXhZKSB7Ci0JICAgIHBhbmVsdHlwZSA9IFBhbmVsX0N1c3RvbTsKLQkgICAgY2hlY2tleHBhbmQgPSBGQUxTRTsKLQkgICAgY3IzNyB8PSAweDEwOwotCSAgICBTaVNfUHItPkNQX1ZlbmRvciA9IHBhbmVsdmVuZG9yOwotCSAgICBTaVNfUHItPkNQX1Byb2R1Y3QgPSBwYW5lbHByb2R1Y3Q7Ci0JIH0KLQotICAgICAgfQotCi0gICAgICBpZihwYW5lbHR5cGUgJiYgY2hlY2tleHBhbmQpIHsKLSAgICAgICAgIC8qIElmIGFueSBvZiB0aGUgRXN0YWJsaXNoZWQgbG93LXJlcyBtb2RlcyBpcyBzdXBwb3J0ZWQsIHRoZQotCSAgKiBwYW5lbCBjYW4gc2NhbGUgYXV0b21hdGljYWxseS4gRm9yIDgwMHg2MDAgcGFuZWxzLCB3ZSBvbmx5IAotCSAgKiBjaGVjayB0aGUgZXZlbiBsb3dlciBvbmVzLgotCSAgKi8KLQkgaWYocGFuZWx0eXBlID09IFBhbmVsXzgwMHg2MDApIHsKLQkgICAgaWYoYnVmZmVyWzB4MjNdICYgMHhmYykgY3IzNyB8PSAweDEwOwotCSB9IGVsc2UgewotICAgICAgICAgICAgaWYoYnVmZmVyWzB4MjNdKQkgICAgY3IzNyB8PSAweDEwOwotCSB9Ci0gICAgICB9Ci0gICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgY2FzZSAzOgkJCQkJCQkvKiBBbmFseXplIEVESUQgVjIgKi8KLSAgIGNhc2UgNDoKLSAgICAgIGluZGV4ID0gMDsKLQotICAgICAgaWYoIShjaGVja2VkaWQyKGJ1ZmZlcikpKSB7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotCSAJIkxDRCBzZW5zZTogRURJRCBjb3JydXB0XG4iKTsKLQkgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmKChidWZmZXJbMHg0MV0gJiAweDBmKSA9PSAweDAzKSB7Ci0gICAgICAgICBpbmRleCA9IDB4NDIgKyAzOwotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgCSJMQ0Qgc2Vuc2U6IERpc3BsYXkgc3VwcG9ydHMgVE1EUyBpbnB1dCBvbiBwcmltYXJ5IGludGVyZmFjZVxuIik7Ci0gICAgICB9IGVsc2UgaWYoKGJ1ZmZlclsweDQxXSAmIDB4ZjApID09IDB4MzApIHsKLSAgICAgICAgIGluZGV4ID0gMHg0NiArIDM7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotCSAJIkxDRCBzZW5zZTogRGlzcGxheSBzdXBwb3J0cyBUTURTIGlucHV0IG9uIHNlY29uZGFyeSBpbnRlcmZhY2VcbiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JIAkiTENEIHNlbnNlOiBEaXNwbGF5IGRvZXMgbm90IHN1cHBvcnQgVE1EUyB2aWRlbyBpbnRlcmZhY2UgKDB4JTAyeClcbiIsCi0JCWJ1ZmZlclsweDQxXSk7Ci0JIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBTaVNfUHItPkNQX1ZlbmRvciA9IHBhbmVsdmVuZG9yID0gYnVmZmVyWzJdIHwgKGJ1ZmZlclsxXSA8PCA4KTsKLSAgICAgIFNpU19Qci0+Q1BfUHJvZHVjdCA9IHBhbmVscHJvZHVjdCA9IGJ1ZmZlclszXSB8IChidWZmZXJbNF0gPDwgOCk7Ci0KLSAgICAgIHBhbmVsdHlwZSA9IFBhbmVsX0N1c3RvbTsKLSAgICAgIFNpU19Qci0+Q1BfTWF4WCA9IFNpU19Qci0+Q1BfUHJlZmVycmVkWCA9IHhyZXMgPSBidWZmZXJbMHg3Nl0gfCAoYnVmZmVyWzB4NzddIDw8IDgpOwotICAgICAgU2lTX1ByLT5DUF9NYXhZID0gU2lTX1ByLT5DUF9QcmVmZXJyZWRZID0geXJlcyA9IGJ1ZmZlclsweDc4XSB8IChidWZmZXJbMHg3OV0gPDwgOCk7Ci0KLSAgICAgIHN3aXRjaCh4cmVzKSB7Ci0jaWYgMAotICAgICAgICAgY2FzZSA4MDA6Ci0JICAgICBpZih5cmVzID09IDYwMCkgewotCSAgICAgCXBhbmVsdHlwZSA9IFBhbmVsXzgwMHg2MDA7Ci0JICAgICAJY2hlY2tleHBhbmQgPSBUUlVFOwotCSAgICAgfQotCSAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgIGNhc2UgMTAyNDoKLQkgICAgIGlmKHlyZXMgPT0gNzY4KSB7Ci0JICAgICAJcGFuZWx0eXBlID0gUGFuZWxfMTAyNHg3Njg7Ci0JICAgICAJY2hlY2tleHBhbmQgPSBUUlVFOwotCSAgICAgfQotCSAgICAgYnJlYWs7Ci0JIGNhc2UgMTI4MDoKLQkgICAgIGlmKHlyZXMgPT0gOTYwKSB7Ci0JICAgICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgIAkgICBwYW5lbHR5cGUgPSBQYW5lbDMxMF8xMjgweDk2MDsKLQkJfSBlbHNlIHsKLQkJICAgcGFuZWx0eXBlID0gUGFuZWwzMDBfMTI4MHg5NjA7Ci0JCX0KLQkgICAgIH0gZWxzZSBpZih5cmVzID09IDEwMjQpIHsKLQkgICAgIAlwYW5lbHR5cGUgPSBQYW5lbF8xMjgweDEwMjQ7Ci0JCWNoZWNrZXhwYW5kID0gVFJVRTsKLQkgICAgIH0KLQkgICAgIC8qIDEyODB4NzY4IHRyZWF0ZWQgYXMgY3VzdG9tIGhlcmUgKi8KLQkgICAgIGJyZWFrOwotCSBjYXNlIDE0MDA6Ci0JICAgICBpZihwU2lTLT5WR0FFbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICAgICAgIGlmKHlyZXMgPT0gMTA1MCkgewotCSAgICAgICAgICAgcGFuZWx0eXBlID0gUGFuZWwzMTBfMTQwMHgxMDUwOwotCQkgICBjaGVja2V4cGFuZCA9IFRSVUU7Ci0JICAgICAgICB9Ci0JICAgICB9Ci0gICAgICAJICAgICBicmVhazsKLQkgY2FzZSAxNjAwOgotCSAgICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICBpZihwU2lTLT5WQkZsYWdzICYgVkJfMzAxQykgewotCSAgICAgICAgICAgaWYoeXJlcyA9PSAxMjAwKSB7Ci0JICAgICAgICAgICAgICBwYW5lbHR5cGUgPSBQYW5lbDMxMF8xNjAweDEyMDA7Ci0JCSAgICAgIGNoZWNrZXhwYW5kID0gVFJVRTsKLQkJICAgfQotCSAgICAgICAgfQotCSAgICAgfQotICAgICAgCSAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIERldGVybWluZSBpZiBSR0IxOCBvciBSR0IyNCAqLwotICAgICAgaWYoaW5kZXgpIHsKLSAgICAgICAgIGlmKChidWZmZXJbaW5kZXhdID09IDB4MjApIHx8IChidWZmZXJbaW5kZXhdID09IDB4MzQpKSB7Ci0JICAgIGNyMzcgfD0gMHgwMTsKLQkgfQotICAgICAgfQotCi0gICAgICBpZihjaGVja2V4cGFuZCkgewotICAgICAgICAgLyogVE9ETyAtIGZvciBub3csIHdlIGxldCB0aGUgcGFuZWwgc2NhbGUgKi8KLQkgY3IzNyB8PSAweDEwOwotICAgICAgfQotCi0gICAgICAvKiBOb3cgc2VlayA0LUJ5dGUgVGltaW5nIGNvZGVzIGFuZCBleHRyYWN0IHN5bmMgcG9sIGluZm8gKi8KLSAgICAgIGluZGV4ID0gMHg4MDsKLSAgICAgIGlmKGJ1ZmZlclsweDdlXSAmIDB4MjApIHsJCQkgICAgLyogc2tpcCBMdW1pbmFuY2UgVGFibGUgKGlmIHByb3ZpZGVkKSAqLwotICAgICAgICAgbHVtc2l6ZSA9IGJ1ZmZlclsweDgwXSAmIDB4MWY7Ci0JIGlmKGJ1ZmZlclsweDgwXSAmIDB4ODApIGx1bXNpemUgKj0gMzsKLQkgbHVtc2l6ZSsrOyAgLyogbHVtaW5hbmNlIGhlYWRlciBieXRlICovCi0JIGluZGV4ICs9IGx1bXNpemU7Ci0gICAgICB9Ci0jaWYgMCAvKiAicGl4ZWwgcmF0ZSIgPSBwaXhlbCBjbG9jaz8gKi8KLSAgICAgIGlmKGJ1ZmZlclsweDdlXSAmIDB4MWMpIHsKLSAgICAgICAgIGZvcihpPTA7IGk8KChidWZmZXJbMHg3ZV0gJiAweDFjKSA+PiAyKTsgaSsrKSB7Ci0JICAgIGlmKGJ1ZmZlcltpbmRleCArIChpKjgpICsgNl0gJiYgKGJ1ZmZlcltpbmRleCArIChpKjgpICsgN10gJiAweDBmKSkgewotCSAgICAgICBpbnQgY2xrID0gKGJ1ZmZlcltpbmRleCArIChpKjgpICsgNl0gfCAoKGJ1ZmZlcltpbmRleCArIChpKjgpICsgN10gJiAweDBmKSA8PCA0KSkgKiAxMDAwOwotCSAgICAgICBpZihjbGsgPiBTaVNfUHItPkNQX01heENsb2NrKSBTaVNfUHItPkNQX01heENsb2NrID0gY2xrOwotCSAgICB9Ci0JIH0KLSAgICAgIH0KLSNlbmRpZgotICAgICAgaW5kZXggKz0gKCgoYnVmZmVyWzB4N2VdICYgMHgxYykgPj4gMikgKiA4KTsgICAvKiBza2lwIEZyZXF1ZW5jeSBSYW5nZXMgKi8KLSAgICAgIGlmKGJ1ZmZlclsweDdlXSAmIDB4MDMpIHsKLSAgICAgICAgIGZvcihpPTA7IGk8KGJ1ZmZlclsweDdlXSAmIDB4MDMpOyBpKyspIHsKLQkgICAgaWYoKGJ1ZmZlcltpbmRleCArIChpKjI3KSArIDldKSB8fCAoYnVmZmVyW2luZGV4ICsgKGkqMjcpICsgMTBdKSkgewotCSAgICAgICBpbnQgY2xrID0gKChidWZmZXJbaW5kZXggKyAoaSoyNykgKyA5XSkgfCAoKGJ1ZmZlcltpbmRleCArIChpKjI3KSArIDldKSA8PCA4KSkgKiAxMDsKLQkgICAgICAgaWYoY2xrID4gU2lTX1ByLT5DUF9NYXhDbG9jaykgU2lTX1ByLT5DUF9NYXhDbG9jayA9IGNsazsKLQkgICAgfQotCSB9Ci0gICAgICB9Ci0gICAgICBpbmRleCArPSAoKGJ1ZmZlclsweDdlXSAmIDB4MDMpICogMjcpOyAgICAgICAgIC8qIHNraXAgRGV0YWlsZWQgUmFuZ2UgTGltaXRzICovCi0gICAgICBudW1jb2RlcyA9IChidWZmZXJbMHg3Zl0gJiAweGY4KSA+PiAzOwotICAgICAgaWYobnVtY29kZXMpIHsKLSAgICAgICAgIG15aW5kZXggPSBpbmRleDsKLSAJIHNlZWtjb2RlID0gKHhyZXMgLSAyNTYpIC8gMTY7Ci0gICAgIAkgZm9yKGk9MDsgaTxudW1jb2RlczsgaSsrKSB7Ci0JICAgIGlmKGJ1ZmZlcltteWluZGV4XSA9PSBzZWVrY29kZSkgYnJlYWs7Ci0JICAgIG15aW5kZXggKz0gNDsKLQkgfQotCSBpZihidWZmZXJbbXlpbmRleF0gPT0gc2Vla2NvZGUpIHsKLQkgICAgY3IzNyB8PSAoKCgoYnVmZmVyW215aW5kZXggKyAxXSAmIDB4MGMpIF4gMHgwYykgPDwgNCkgfCAweDIwKTsKLQkgICAgaGF2ZXN5bmMgPSBUUlVFOwotCSB9IGVsc2UgewotCSAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfV0FSTklORywKLQkgICAgICAgICJMQ0Qgc2Vuc2U6IFVuYWJsZSB0byByZXRyaWV2ZSBTeW5jIHBvbGFyaXR5IGluZm9ybWF0aW9uXG4iKTsKLQkgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9XQVJOSU5HLAotCSAgICAgIkxDRCBzZW5zZTogVW5hYmxlIHRvIHJldHJpZXZlIFN5bmMgcG9sYXJpdHkgaW5mb3JtYXRpb25cbiIpOwotICAgICAgfQotCi0gICAgICAvKiBDaGVjayBhZ2FpbnN0IG91ciBkYXRhYmFzZTsgRWcuIFNhbnlvIHByb2plY3RvciByZXBvcnRzCi0gICAgICAgKiAxMDI0eDc2OCBpbiBub24tSERQQyBtb2RlLCBhbHRob3VnaCBpdCBzdXBwb3J0cyAxMjgweDcyMC4KLSAgICAgICAqIFRyZWF0IHN1Y2ggd3JvbmdseSByZXBvcnRpbmcgcGFuZWxzIGFzIGN1c3RvbS4KLSAgICAgICAqLwotICAgICAgaWYocGFuZWx0eXBlICE9IFBhbmVsX0N1c3RvbSkgewotICAgICAgICAgaW50IG1heHgsIG1heHksIHByZWZ4LCBwcmVmeTsKLSAgICAgICAgIGlmKChTaVNfRmluZFBhbmVsRnJvbURCKHBTaVMsIHBhbmVsdmVuZG9yLCBwYW5lbHByb2R1Y3QsICZtYXh4LCAmbWF4eSwgJnByZWZ4LCAmcHJlZnkpKSkgewotCSAgICBwYW5lbHR5cGUgPSBQYW5lbF9DdXN0b207Ci0JICAgIFNpU19Qci0+Q1BfTWF4WCA9IG1heHg7Ci0JICAgIFNpU19Qci0+Q1BfTWF4WSA9IG1heHk7Ci0JICAgIGNyMzcgfD0gMHgxMDsKLQkgICAgLyogTGVhdmUgcHJlZmVycmVkIHVuY2hhbmdlZCAoTVVTVCBiZSBhIHZhbGlkIG1vZGUhKSAqLwotCSB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdyBzZWVrIHRoZSBkZXRhaWxlZCB0aW1pbmcgZGVzY3JpcHRpb25zIGZvciBjdXN0b20gcGFuZWxzICovCi0gICAgICBpZihwYW5lbHR5cGUgPT0gUGFuZWxfQ3VzdG9tKSB7Ci0KLSAgICAgICAgIFNpU19Qci0+Q1BfU3VwcG9ydHM2NDA0ODA3NSA9IFRSVUU7Ci0KLSAgICAgICAgIGluZGV4ICs9IChudW1jb2RlcyAqIDQpOwotCSBudW1jb2RlcyA9IGJ1ZmZlclsweDdmXSAmIDB4MDc7Ci0JIGZvcihpPTA7IGk8bnVtY29kZXM7IGkrKywgaW5kZXggKz0gMTgpIHsKLQkgICAgeHJlcyA9IGJ1ZmZlcltpbmRleCsyXSB8ICgoYnVmZmVyW2luZGV4KzRdICYgMHhmMCkgPDwgNCk7Ci0gICAgICAgICAgICB5cmVzID0gYnVmZmVyW2luZGV4KzVdIHwgKChidWZmZXJbaW5kZXgrN10gJiAweGYwKSA8PCA0KTsKLQotCSAgICBTaVNfUHItPkNQX0hEaXNwbGF5W2ldID0geHJlczsKLQkgICAgU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldID0geHJlcyArIChidWZmZXJbaW5kZXgrOF0gfCAoKGJ1ZmZlcltpbmRleCsxMV0gJiAweGMwKSA8PCAyKSk7Ci0gICAgICAgICAgICBTaVNfUHItPkNQX0hTeW5jRW5kW2ldID0gU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldICsgKGJ1ZmZlcltpbmRleCs5XSB8ICgoYnVmZmVyW2luZGV4KzExXSAmIDB4MzApIDw8IDQpKTsKLQkgICAgU2lTX1ByLT5DUF9IVG90YWxbaV0gPSB4cmVzICsgKGJ1ZmZlcltpbmRleCszXSB8ICgoYnVmZmVyW2luZGV4KzRdICYgMHgwZikgPDwgOCkpOwotCSAgICBTaVNfUHItPkNQX0hCbGFua1N0YXJ0W2ldID0geHJlcyArIDE7Ci0JICAgIFNpU19Qci0+Q1BfSEJsYW5rRW5kW2ldID0gU2lTX1ByLT5DUF9IVG90YWxbaV07Ci0KLQkgICAgU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA9IHlyZXM7Ci0gICAgICAgICAgICBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0gPSB5cmVzICsgKCgoYnVmZmVyW2luZGV4KzEwXSAmIDB4ZjApID4+IDQpIHwgKChidWZmZXJbaW5kZXgrMTFdICYgMHgwYykgPDwgMikpOwotICAgICAgICAgICAgU2lTX1ByLT5DUF9WU3luY0VuZFtpXSA9IFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSArICgoYnVmZmVyW2luZGV4KzEwXSAmIDB4MGYpIHwgKChidWZmZXJbaW5kZXgrMTFdICYgMHgwMykgPDwgNCkpOwotCSAgICBTaVNfUHItPkNQX1ZUb3RhbFtpXSA9IHlyZXMgKyAoYnVmZmVyW2luZGV4KzZdIHwgKChidWZmZXJbaW5kZXgrN10gJiAweDBmKSA8PCA4KSk7Ci0JICAgIFNpU19Qci0+Q1BfVkJsYW5rU3RhcnRbaV0gPSB5cmVzICsgMTsKLQkgICAgU2lTX1ByLT5DUF9WQmxhbmtFbmRbaV0gPSBTaVNfUHItPkNQX1ZUb3RhbFtpXTsKLQotCSAgICBTaVNfUHItPkNQX0Nsb2NrW2ldID0gKGJ1ZmZlcltpbmRleF0gfCAoYnVmZmVyW2luZGV4KzFdIDw8IDgpKSAqIDEwOwotCi0JICAgIFNpU19Qci0+Q1BfRGF0YVZhbGlkW2ldID0gVFJVRTsKLQotCSAgICBpZigoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSAmIDcpCQkJCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfSERpc3BsYXlbaV0gPiBTaVNfUHItPkNQX0hTeW5jU3RhcnRbaV0pICAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9IRGlzcGxheVtpXSA+PSBTaVNfUHItPkNQX0hTeW5jRW5kW2ldKSAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX0hEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfSFRvdGFsW2ldKSAgICAgCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfSFN5bmNTdGFydFtpXSA+PSBTaVNfUHItPkNQX0hTeW5jRW5kW2ldKSAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldID4gU2lTX1ByLT5DUF9IVG90YWxbaV0pICAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX0hTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9IVG90YWxbaV0pICAgICAgCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0gPiBTaVNfUHItPkNQX1ZTeW5jU3RhcnRbaV0pICAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9WRGlzcGxheVtpXSA+PSBTaVNfUHItPkNQX1ZTeW5jRW5kW2ldKSAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX1ZEaXNwbGF5W2ldID49IFNpU19Qci0+Q1BfVlRvdGFsW2ldKSAgICAgCQkJfHwKLQkgICAgICAgKFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSA+IFNpU19Qci0+Q1BfVlN5bmNFbmRbaV0pICAJCQl8fAotCSAgICAgICAoU2lTX1ByLT5DUF9WU3luY1N0YXJ0W2ldID4gU2lTX1ByLT5DUF9WVG90YWxbaV0pICAgIAkJCXx8Ci0JICAgICAgIChTaVNfUHItPkNQX1ZTeW5jRW5kW2ldID4gU2lTX1ByLT5DUF9WVG90YWxbaV0pICAgICAgCQkJfHwKLQkgICAgICAgKCgocFNpUy0+VkJGbGFncyAmIFZCXzMwMUMpICYmIChTaVNfUHItPkNQX0Nsb2NrW2ldID4gMTYyNTAwKSkgfHwKLQkgICAgICAgICgoIShwU2lTLT5WQkZsYWdzICYgVkJfMzAxQykpICYmCi0JCSAoKFNpU19Qci0+Q1BfQ2xvY2tbaV0gPiAxMDgyMDApIHx8IChTaVNfUHItPkNQX1ZEaXNwbGF5W2ldID4gMTAyNCkpKSkJfHwKLQkgICAgICAgKGJ1ZmZlcltpbmRleCArIDE3XSAmIDB4ODApKSB7Ci0KLQkgICAgICAgU2lTX1ByLT5DUF9EYXRhVmFsaWRbaV0gPSBGQUxTRTsKLQotCSAgICB9IGVsc2UgewotCi0JICAgICAgIFNpU19Qci0+Q1BfSGF2ZUN1c3RvbURhdGEgPSBUUlVFOwotCi0JICAgICAgIGlmKFNpU19Qci0+Q1BfQ2xvY2tbaV0gPiBTaVNfUHItPkNQX01heENsb2NrKSBTaVNfUHItPkNQX01heENsb2NrID0gU2lTX1ByLT5DUF9DbG9ja1tpXTsKLQotCSAgICAgICBpZigoU2lTX1ByLT5DUF9QcmVmZXJyZWRYID09IHhyZXMpICYmIChTaVNfUHItPkNQX1ByZWZlcnJlZFkgPT0geXJlcykpIHsKLQkgICAgICAgICAgU2lTX1ByLT5DUF9QcmVmZXJyZWRJbmRleCA9IGk7Ci0JCSAgU2lTX01ha2VDbG9ja1JlZ3MocFNpUy0+cFNjcm4sIFNpU19Qci0+Q1BfQ2xvY2tbaV0sICZTaVNfUHItPkNQX1ByZWZTUjJCLCAmU2lTX1ByLT5DUF9QcmVmU1IyQyk7Ci0JCSAgU2lTX1ByLT5DUF9QcmVmQ2xvY2sgPSAoU2lTX1ByLT5DUF9DbG9ja1tpXSAvIDEwMDApICsgMTsKLQkJICBpZighaGF2ZXN5bmMpIHsKLQkgICAgICAgICAgICAgY3IzNyB8PSAoKCgoYnVmZmVyW2luZGV4ICsgMTddICYgMHgwNikgXiAweDA2KSA8PCA1KSB8IDB4MjApOwotCQkgICAgIGhhdmVzeW5jID0gVFJVRTsKLQkgICAJICB9Ci0JICAgICAgIH0KLQotCSAgICAgICBTaVNfUHItPkNQX0hTeW5jX1BbaV0gPSAoYnVmZmVyW2luZGV4ICsgMTddICYgMHgwMikgPyBUUlVFIDogRkFMU0U7Ci0JICAgICAgIFNpU19Qci0+Q1BfVlN5bmNfUFtpXSA9IChidWZmZXJbaW5kZXggKyAxN10gJiAweDA0KSA/IFRSVUUgOiBGQUxTRTsKLQkgICAgICAgU2lTX1ByLT5DUF9TeW5jVmFsaWRbaV0gPSBUUlVFOwotCi0JICAgIH0KLQkgfQotCi0JIGNyMzcgfD0gMHgxMDsKLQotICAgICAgfQotCi0gICAgICBicmVhazsKLQotICAgfQotCi0gICAvKiAxMjgweDk2MCBwYW5lbHMgYXJlIGFsd2F5cyBSR0IyNCwgdW5hYmxlIHRvIHNjYWxlIGFuZCB1c2UKLSAgICAqIGhpZ2ggYWN0aXZlIHN5bmMgcG9sYXJpdHkKLSAgICAqLwotICAgaWYocFNpUy0+VkdBRW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0gICAgICBpZihwYW5lbHR5cGUgPT0gUGFuZWwzMTBfMTI4MHg5NjApIGNyMzcgJj0gMHgwZTsKLSAgIH0gZWxzZSB7Ci0gICAgICBpZihwYW5lbHR5cGUgPT0gUGFuZWwzMDBfMTI4MHg5NjApIGNyMzcgJj0gMHgwZTsKLSAgIH0KLQotICAgZm9yKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0gICAgICBpZihTaVNfUHItPkNQX0RhdGFWYWxpZFtpXSkgewotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLSAgICAgICAgICAgICJOb24tc3RhbmRhcmQgTENEL0RWSS1EIHRpbWluZyBkYXRhIG5vLiAlZDpcbiIsIGkpOwotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgIiAgIEhEaXNwbGF5ICVkIEhTeW5jICVkIEhTeW5jRW5kICVkIEhUb3RhbCAlZFxuIiwKLQkgICAgU2lTX1ByLT5DUF9IRGlzcGxheVtpXSwgU2lTX1ByLT5DUF9IU3luY1N0YXJ0W2ldLAotCSAgICBTaVNfUHItPkNQX0hTeW5jRW5kW2ldLCBTaVNfUHItPkNQX0hUb3RhbFtpXSk7Ci0gICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfUFJPQkVELAotICAgICAgICAgICAgIiAgIFZEaXNwbGF5ICVkIFZTeW5jICVkIFZTeW5jRW5kICVkIFZUb3RhbCAlZFxuIiwKLSAgICAgICAgICAgIFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0sIFNpU19Qci0+Q1BfVlN5bmNTdGFydFtpXSwKLSAgIAkgICAgU2lTX1ByLT5DUF9WU3luY0VuZFtpXSwgU2lTX1ByLT5DUF9WVG90YWxbaV0pOwotICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwKLQkgICAgIiAgIFBpeGVsIGNsb2NrOiAlMy4zZk1oelxuIiwgKGZsb2F0KVNpU19Qci0+Q1BfQ2xvY2tbaV0gLyAxMDAwKTsKLQkgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX0lORk8sCi0JICAgICIgICBUbyB1c2UgdGhpcywgYWRkIFwiJWR4JWRcIiB0byB0aGUgbGlzdCBvZiBNb2RlcyBpbiB0aGUgU2NyZWVuIHNlY3Rpb25cbiIsCi0JICAgIFNpU19Qci0+Q1BfSERpc3BsYXlbaV0sCi0JICAgIFNpU19Qci0+Q1BfVkRpc3BsYXlbaV0pOwotICAgICAgfQotICAgfQotCi0gICBpZihwYW5lbHR5cGUpIHsKLSAgICAgICBpZighU2lTX1ByLT5DUF9QcmVmZXJyZWRYKSBTaVNfUHItPkNQX1ByZWZlcnJlZFggPSBTaVNfUHItPkNQX01heFg7Ci0gICAgICAgaWYoIVNpU19Qci0+Q1BfUHJlZmVycmVkWSkgU2lTX1ByLT5DUF9QcmVmZXJyZWRZID0gU2lTX1ByLT5DUF9NYXhZOwotICAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzIsMHgwOCk7Ci0gICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QM2Q0LDB4MzYscGFuZWx0eXBlKTsKLSAgICAgICBjcjM3ICY9IDB4ZjE7Ci0gICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1AzZDQsMHgzNywweDBjLGNyMzcpOwotICAgICAgIFNpU19Qci0+UGFuZWxTZWxmRGV0ZWN0ZWQgPSBUUlVFOwotI2lmZGVmIFRXREVCVUcKLSAgICAgICB4Zjg2RHJ2TXNnVmVyYihwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX1BST0JFRCwgMywgCi0gICAgICAgCSAgICJMQ0Qgc2Vuc2U6IFtEREMgTENEIHJlc3VsdHM6IDB4JTAyeCwgMHglMDJ4XVxuIiwgcGFuZWx0eXBlLCBjcjM3KTsKLSNlbmRpZgkKLSAgIH0gZWxzZSB7Ci0gICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QM2Q0LDB4MzIsfjB4MDgpOwotICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUDNkNCwweDM2LDB4MDApOwotICAgfQotICAgcmV0dXJuIDA7Ci19Ci0gICAKLVVTSE9SVAotU2lTX1NlbnNlVkdBMkREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNQdHIgcFNpUykKLXsKLSAgIFVTSE9SVCBERENkYXRhdHlwZSxmbGFnOwotICAgQk9PTEVBTiBmb3VuZGNydCA9IEZBTFNFOwotICAgaW50IHJldHJ5OwotICAgdW5zaWduZWQgY2hhciBidWZmZXJbMjU2XTsKLQotICAgaWYoIShwU2lTLT5WQkZsYWdzICYgKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQikpKSByZXR1cm4gMDsKLQotICAgaWYoU2lTX0luaXRERENSZWdzKFNpU19QciwgcFNpUy0+VkJGbGFncywgcFNpUy0+VkdBRW5naW5lLCAyLCAwLCBGQUxTRSkgPT0gMHhGRkZGKSByZXR1cm4gMDsKLSAgIAotICAgU2lTX1ByLT5TaVNfRERDX1NlY0FkZHIgPSAweDAwOwotICAgCi0gICAvKiBQcm9iZSBzdXBwb3J0ZWQgREEncyAqLwotICAgZmxhZyA9IFNpU19Qcm9iZUREQyhTaVNfUHIpOwotICAgaWYoZmxhZyAmIDB4MTApIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhNjsJLyogRURJRCBWMiAoRlApICovCi0gICAgICBERENkYXRhdHlwZSA9IDQ7Ci0gICB9IGVsc2UgaWYoZmxhZyAmIDB4MDgpIHsKLSAgICAgIFNpU19Qci0+U2lTX0REQ19EZXZpY2VBZGRyID0gMHhhMjsJLyogRURJRCBWMiAoUCZELUQgTW9uaXRvcikgKi8KLSAgICAgIEREQ2RhdGF0eXBlID0gMzsKLSAgIH0gZWxzZSBpZihmbGFnICYgMHgwMikgewotICAgICAgU2lTX1ByLT5TaVNfRERDX0RldmljZUFkZHIgPSAweGEwOwkvKiBFRElEIFYxICovCi0gICAgICBERENkYXRhdHlwZSA9IDE7Ci0gICB9IGVsc2UgewotICAgCXhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JCSJWR0EyIHNlbnNlOiBEbyBEREMgYW5zd2VyXG4iKTsKLSAgIAlyZXR1cm4gMDsJCQkJLyogbm8gRERDIHN1cHBvcnQgKG9yIG5vIGRldmljZSBhdHRhY2hlZCkgKi8KLSAgIH0KLQotICAgLyogUmVhZCB0aGUgZW50aXJlIEVESUQgKi8KLSAgIHJldHJ5ID0gMjsKLSAgIGRvIHsKLSAgICAgIGlmKFNpU19SZWFkRERDKFNpU19QciwgRERDZGF0YXR5cGUsIGJ1ZmZlcikpIHsKLSAgICAgICAgIHhmODZEcnZNc2cocFNpUy0+cFNjcm4tPnNjcm5JbmRleCwgWF9QUk9CRUQsCi0JIAkiVkdBMiBzZW5zZTogRERDIHJlYWQgZmFpbGVkIChhdHRlbXB0ICVkKSwgJXNcbiIsCi0JCSgzLXJldHJ5KSwgKHJldHJ5ID09IDEpID8gImdpdmluZyB1cCIgOiAicmV0cnlpbmciKTsKLQkgcmV0cnktLTsKLQkgaWYocmV0cnkgPT0gMCkgcmV0dXJuIDB4RkZGRjsKLSAgICAgIH0gZWxzZSBicmVhazsKLSAgIH0gd2hpbGUoMSk7Ci0KLSAgIC8qIEFuYWx5emUgRURJRC4gV2UgZG9uJ3QgaGF2ZSBtYW55IGNoYW5jZXMgdG8KLSAgICAqIGRpc3Rpbmd1aXNoIGEgZmxhdCBwYW5lbCBmcm9tIGEgQ1JULi4uCi0gICAgKi8KLSAgIHN3aXRjaChERENkYXRhdHlwZSkgewotICAgY2FzZSAxOgotICAgICAgaWYoIShjaGVja2VkaWQxKGJ1ZmZlcikpKSB7Ci0gICAgICAgICAgeGY4NkRydk1zZyhwU2lTLT5wU2Nybi0+c2NybkluZGV4LCBYX0VSUk9SLAotCSAgCSJWR0EyIHNlbnNlOiBFRElEIGNvcnJ1cHRcbiIpOwotICAgICAgCSAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBpZihidWZmZXJbMHgxNF0gJiAweDgwKSB7CQkJLyogRGlzcGxheSB1c2VzIGRpZ2l0YWwgaW5wdXQgKi8KLSAgICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfRVJST1IsCi0JICAJIlZHQTIgc2Vuc2U6IEF0dGFjaGVkIGRpc3BsYXkgZXhwZWN0cyBkaWdpdGFsIGlucHV0XG4iKTsKLSAgICAgIAkgIHJldHVybiAwOwotICAgICAgfQotICAgICAgU2lTX1ByLT5DUF9WZW5kb3IgPSBidWZmZXJbOV0gfCAoYnVmZmVyWzhdIDw8IDgpOwotICAgICAgU2lTX1ByLT5DUF9Qcm9kdWN0ID0gYnVmZmVyWzEwXSB8IChidWZmZXJbMTFdIDw8IDgpOwotICAgICAgZm91bmRjcnQgPSBUUlVFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIDM6Ci0gICBjYXNlIDQ6Ci0gICAgICBpZighKGNoZWNrZWRpZDIoYnVmZmVyKSkpIHsKLSAgICAgICAgICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfRVJST1IsCi0JICAJIlZHQTIgc2Vuc2U6IEVESUQgY29ycnVwdFxuIik7Ci0gICAgICAJICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGlmKCAoKGJ1ZmZlclsweDQxXSAmIDB4MGYpICE9IDB4MDEpICYmICAJLyogRGlzcGxheSBkb2VzIG5vdCBzdXBwb3J0IGFuYWxvZyBpbnB1dCAqLwotICAgICAgICAgICgoYnVmZmVyWzB4NDFdICYgMHgwZikgIT0gMHgwMikgJiYKLQkgICgoYnVmZmVyWzB4NDFdICYgMHhmMCkgIT0gMHgxMCkgJiYKLQkgICgoYnVmZmVyWzB4NDFdICYgMHhmMCkgIT0gMHgyMCkgKSB7Ci0JICB4Zjg2RHJ2TXNnKHBTaVMtPnBTY3JuLT5zY3JuSW5kZXgsIFhfRVJST1IsCi0JICAgICAJIlZHQTIgc2Vuc2U6IEF0dGFjaGVkIGRpc3BsYXkgZG9lcyBub3Qgc3VwcG9ydCBhbmFsb2cgaW5wdXQgKDB4JTAyeClcbiIsCi0JCWJ1ZmZlclsweDQxXSk7Ci0JICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIFNpU19Qci0+Q1BfVmVuZG9yID0gYnVmZmVyWzJdIHwgKGJ1ZmZlclsxXSA8PCA4KTsKLSAgICAgIFNpU19Qci0+Q1BfUHJvZHVjdCA9IGJ1ZmZlclszXSB8IChidWZmZXJbNF0gPDwgOCk7Ci0gICAgICBmb3VuZGNydCA9IFRSVUU7Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgaWYoZm91bmRjcnQpIHsKLSAgICAgIFNpU19TZXRSZWdPUihTaVNfUHItPlNpU19QM2Q0LDB4MzIsMHgxMCk7Ci0gICB9Ci0gICByZXR1cm4oMCk7Ci19Ci0KLSNlbmRpZgotCi12b2lkCi1TaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCxVU0hPUlQgdGVtcGJoKQotewotICBVU0hPUlQgdGVtcGJsOwotCi0gIHRlbXBibCA9IFNpU19HZXRDSDcweHgoU2lTX1ByLCh0ZW1wYXggJiAweDAwRkYpKTsKLSAgdGVtcGJsID0gKCgodGVtcGJsICYgdGVtcGJoKSA8PCA4KSB8IHRlbXBheCk7Ci0gIFNpU19TZXRDSDcweHgoU2lTX1ByLHRlbXBibCk7Ci19Ci0KIC8qIEdlbmVyaWMgSTJDIGZ1bmN0aW9ucyBmb3IgQ2hyb250ZWwgJiBEREMgLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkCi1TaVNfU2V0U3dpdGNoRERDMihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorU2lTX1NldFN3aXRjaEREQzIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgIFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpOwogICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7CkBAIC0xMDUwNSwxMjUgKzk1MDIsMTI3IEBACiAgIFNpU19XYWl0UmV0cmFjZTEoU2lTX1ByKTsKIH0KIAotVVNIT1JUCi1TaVNfUmVhZEREQzFCaXQoU2lTX1ByaXZhdGUgKlNpU19QcikKK3Vuc2lnbmVkIHNob3J0CitTaVNfUmVhZEREQzFCaXQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7CiAgICBTaVNfV2FpdFJldHJhY2UxKFNpU19Qcik7Ci0gICByZXR1cm4oKFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDExKSAmIDB4MDIpID4+IDEpOworICAgcmV0dXJuICgoU2lTX0dldFJlZyhTaVNfUHItPlNpU19QM2M0LDB4MTEpICYgMHgwMikgPj4gMSk7CiB9CiAKIC8qIFNldCBJMkMgc3RhcnQgY29uZGl0aW9uICovCiAvKiBUaGlzIGlzIGRvbmUgYnkgYSBTRCBoaWdoLXRvLWxvdyB0cmFuc2l0aW9uIHdoaWxlIFNDIGlzIGhpZ2ggKi8KLXN0YXRpYyBVU0hPUlQKLVNpU19TZXRTdGFydChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfU2V0U3RhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIGlmKFNpU19TZXRTQ0xLTG93KFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJICAgICAgICAgICAvKiAoU0MtPmxvdykgICovCisgIGlmKFNpU19TZXRTQ0xLTG93KFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJLyogKFNDLT5sb3cpICAqLwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gICAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKLQkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAgICAgICAgICAgIAkJCSAgIC8qIFNELT5oaWdoICovCi0gIGlmKFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCSAgICAgICAgICAgLyogU0MtPmhpZ2ggKi8KKwkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgIFNpU19Qci0+U2lTX0REQ19EYXRhKTsgICAgICAgIAkJLyogU0QtPmhpZ2ggKi8KKyAgaWYoU2lTX1NldFNDTEtIaWdoKFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJLyogU0MtPmhpZ2ggKi8KICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX0REQ19Qb3J0LAotICAJCSAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAotICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAotCQkgIDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJICAgLyogU0QtPmxvdyA9IHN0YXJ0IGNvbmRpdGlvbiAqLwotICBpZihTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIChTQy0+bG93KSAqLworCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICBTaVNfUHItPlNpU19ERENfTkRhdGEsCisJCSAgMHgwMCk7CQkJCQkvKiBTRC0+bG93ID0gc3RhcnQgY29uZGl0aW9uICovCisgIGlmKFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCS8qIChTQy0+bG93KSAqLwogICByZXR1cm4gMDsKIH0KIAogLyogU2V0IEkyQyBzdG9wIGNvbmRpdGlvbiAqLwogLyogVGhpcyBpcyBkb25lIGJ5IGEgU0QgbG93LXRvLWhpZ2ggdHJhbnNpdGlvbiB3aGlsZSBTQyBpcyBoaWdoICovCi1zdGF0aWMgVVNIT1JUCi1TaVNfU2V0U3RvcChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfU2V0U3RvcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgaWYoU2lTX1NldFNDTEtMb3coU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIChTQy0+bG93KSAqLworICBpZihTaVNfU2V0U0NMS0xvdyhTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCS8qIChTQy0+bG93KSAqLwogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gIAkgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAotICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAotCQkgIDB4MDApOyAgICAgICAgICAJCSAgIAkJCSAgIC8qIFNELT5sb3cgICAqLwotICBpZihTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIFNDLT5oaWdoICAqLworCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICBTaVNfUHItPlNpU19ERENfTkRhdGEsCisJCSAgMHgwMCk7CQkJCQkvKiBTRC0+bG93ICAgKi8KKyAgaWYoU2lTX1NldFNDTEtIaWdoKFNpU19QcikpIHJldHVybiAweEZGRkY7CQkJLyogU0MtPmhpZ2ggICovCiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKLQkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAJICAgCQkJICAgLyogU0QtPmhpZ2ggPSBzdG9wIGNvbmRpdGlvbiAqLwotICBpZihTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKSkgcmV0dXJuIDB4RkZGRjsJCQkgICAgICAgICAgIC8qIChTQy0+aGlnaCkgKi8KKwkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgIFNpU19Qci0+U2lTX0REQ19EYXRhKTsJCQkvKiBTRC0+aGlnaCA9IHN0b3AgY29uZGl0aW9uICovCisgIGlmKFNpU19TZXRTQ0xLSGlnaChTaVNfUHIpKSByZXR1cm4gMHhGRkZGOwkJCS8qIChTQy0+aGlnaCkgKi8KICAgcmV0dXJuIDA7CiB9CiAKIC8qIFdyaXRlIDggYml0cyBvZiBkYXRhICovCi1zdGF0aWMgVVNIT1JUCi1TaVNfV3JpdGVEREMyRGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGF4KQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfV3JpdGVEREMyRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgdGVtcGF4KQogewotICBVU0hPUlQgaSxmbGFnLHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IGksZmxhZyx0ZW1wOwogCiAgIGZsYWcgPSAweDgwOwotICBmb3IoaT0wOyBpPDg7IGkrKykgewotICAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CQkJCSAgICAgICAgICAgICAgICAgICAgICAvKiBTQy0+bG93ICovCisgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CQkJCQkvKiBTQy0+bG93ICovCiAgICAgaWYodGVtcGF4ICYgZmxhZykgewogICAgICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX0REQ19Qb3J0LAotICAgICAgCQkgICAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAotCQkgICAgICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAgICAgICAgICAgCQkgICAgICAvKiBXcml0ZSBiaXQgKDEpIHRvIFNEICovCisJCSAgICAgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICAgICAgU2lTX1ByLT5TaVNfRERDX05EYXRhLAorCQkgICAgICBTaVNfUHItPlNpU19ERENfRGF0YSk7CQkJLyogV3JpdGUgYml0ICgxKSB0byBTRCAqLwogICAgIH0gZWxzZSB7CiAgICAgICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gICAgICAJCSAgICAgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19ERENfTkRhdGEsCi0JCSAgICAgIDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgIC8qIFdyaXRlIGJpdCAoMCkgdG8gU0QgKi8KKwkJICAgICAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAorCQkgICAgICBTaVNfUHItPlNpU19ERENfTkRhdGEsCisJCSAgICAgIDB4MDApOwkJCQkJLyogV3JpdGUgYml0ICgwKSB0byBTRCAqLwogICAgIH0KLSAgICBTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKTsJCQkJICAgICAgICAgICAgICAgICAgICAgIC8qIFNDLT5oaWdoICovCisgICAgU2lTX1NldFNDTEtIaWdoKFNpU19Qcik7CQkJCQkvKiBTQy0+aGlnaCAqLwogICAgIGZsYWcgPj49IDE7CiAgIH0KLSAgdGVtcCA9IFNpU19DaGVja0FDSyhTaVNfUHIpOwkJCQkgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgYWNrbm93bGVkZ2UgKi8KLSAgcmV0dXJuKHRlbXApOworICB0ZW1wID0gU2lTX0NoZWNrQUNLKFNpU19Qcik7CQkJCQkvKiBDaGVjayBhY2tub3dsZWRnZSAqLworICByZXR1cm4gdGVtcDsKIH0KIAotc3RhdGljIFVTSE9SVAotU2lTX1JlYWREREMyRGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGF4KQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfUmVhZEREQzJEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICBVU0hPUlQgaSx0ZW1wLGdldGRhdGE7CisgIHVuc2lnbmVkIHNob3J0IGksIHRlbXAsIGdldGRhdGE7CiAKLSAgZ2V0ZGF0YT0wOwotICBmb3IoaT0wOyBpPDg7IGkrKykgeworICBnZXRkYXRhID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgZ2V0ZGF0YSA8PD0gMTsKICAgICBTaVNfU2V0U0NMS0xvdyhTaVNfUHIpOwogICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgICAJCSAgICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKKwkJICAgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKIAkJICAgIFNpU19Qci0+U2lTX0REQ19EYXRhKTsKICAgICBTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKTsKICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19ERENfUG9ydCxTaVNfUHItPlNpU19ERENfSW5kZXgpOwogICAgIGlmKHRlbXAgJiBTaVNfUHItPlNpU19ERENfRGF0YSkgZ2V0ZGF0YSB8PSAweDAxOwogICB9Ci0gIHJldHVybihnZXRkYXRhKTsKKyAgcmV0dXJuIGdldGRhdGE7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19TZXRTQ0xLTG93KFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19TZXRTQ0xLTG93KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewogICBTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfRERDX1BvcnQsCi0gIAkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCi0gICAgICAgICAgICAgICAgICBTaVNfUHItPlNpU19ERENfTkNsaywKLQkJICAweDAwKTsgICAgICAJCQkJCS8qIFNldFNDTEtMb3coKSAgKi8KKwkJICBTaVNfUHItPlNpU19ERENfSW5kZXgsCisJCSAgU2lTX1ByLT5TaVNfRERDX05DbGssCisJCSAgMHgwMCk7CQkJCQkvKiBTZXRTQ0xLTG93KCkgICovCiAgIFNpU19EREMyRGVsYXkoU2lTX1ByLFNpU19JMkNERUxBWVNIT1JUKTsKICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLVNpU19TZXRTQ0xLSGlnaChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitTaVNfU2V0U0NMS0hpZ2goc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCB0ZW1wLCB3YXRjaGRvZz0xMDAwOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCB3YXRjaGRvZz0xMDAwOwogCiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19OQ2xrLAorCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKKwkJICBTaVNfUHItPlNpU19ERENfTkNsaywKIAkJICBTaVNfUHItPlNpU19ERENfQ2xrKTsgIAkJCS8qIFNldFNDTEtIaWdoKCkgICovCiAgIGRvIHsKICAgICB0ZW1wID0gU2lTX0dldFJlZyhTaVNfUHItPlNpU19ERENfUG9ydCxTaVNfUHItPlNpU19ERENfSW5kZXgpOwogICB9IHdoaWxlKCghKHRlbXAgJiBTaVNfUHItPlNpU19ERENfQ2xrKSkgJiYgLS13YXRjaGRvZyk7CiAgIGlmICghd2F0Y2hkb2cpIHsKKyNpZmRlZiBTSVNfWE9SR19YRjg2CiAjaWZkZWYgVFdERUJVRwogICAgICAgICB4Zjg2RHJ2TXNnKDAsIFhfSU5GTywgIlNldENsa0hpZ2ggZmFpbGVkXG4iKTsKICNlbmRpZgorI2VuZGlmCiAgIAlyZXR1cm4gMHhGRkZGOwogICB9CiAgIFNpU19EREMyRGVsYXkoU2lTX1ByLFNpU19JMkNERUxBWVNIT1JUKTsKQEAgLTEwNjMyLDIxICs5NjMxLDIxIEBACiAKIC8qIENoZWNrIEkyQyBhY2tub3dsZWRnZSAqLwogLyogUmV0dXJucyAwIGlmIGFjayBvaywgbm9uLTAgaWYgYWNrIG5vdCBvayAqLwotc3RhdGljIFVTSE9SVAotU2lTX0NoZWNrQUNLKFNpU19Qcml2YXRlICpTaVNfUHIpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19DaGVja0FDSyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIHRlbXBhaDsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGFoOwogCiAgIFNpU19TZXRTQ0xLTG93KFNpU19Qcik7CQkJCSAgICAgICAgICAgLyogKFNDLT5sb3cpICovCiAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19ERENfUG9ydCwKLSAgCQkgIFNpU19Qci0+U2lTX0REQ19JbmRleCwKLSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKLQkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7ICAgICAJCQkgICAvKiAoU0QtPmhpZ2gpICovCisJCSAgU2lTX1ByLT5TaVNfRERDX0luZGV4LAorCQkgIFNpU19Qci0+U2lTX0REQ19ORGF0YSwKKwkJICBTaVNfUHItPlNpU19ERENfRGF0YSk7CQkJICAgLyogKFNELT5oaWdoKSAqLwogICBTaVNfU2V0U0NMS0hpZ2goU2lTX1ByKTsJCQkJICAgICAgICAgICAvKiBTQy0+aGlnaCA9IGNsb2NrIGltcHVsc2UgZm9yIGFjayAqLwogICB0ZW1wYWggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX0REQ19Qb3J0LFNpU19Qci0+U2lTX0REQ19JbmRleCk7IC8qIFJlYWQgU0QgKi8KICAgU2lTX1NldFNDTEtMb3coU2lTX1ByKTsJCQkJICAgICAgICAgICAvKiBTQy0+bG93ID0gZW5kIG9mIGNsb2NrIGltcHVsc2UgKi8KLSAgaWYodGVtcGFoICYgU2lTX1ByLT5TaVNfRERDX0RhdGEpIHJldHVybigxKTsJCQkgICAvKiBBY2sgT0sgaWYgYml0ID0gMCAqLwotICBlbHNlIHJldHVybigwKTsKKyAgaWYodGVtcGFoICYgU2lTX1ByLT5TaVNfRERDX0RhdGEpIHJldHVybiAxOwkJCSAgIC8qIEFjayBPSyBpZiBiaXQgPSAwICovCisgIHJldHVybiAwOwogfQogCiAvKiBFbmQgb2YgSTJDIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTA2NTYsNjcgKzk2NTUsNjcgQEAKIAogI2lmZGVmIFNJUzMxNUgKIAotc3RhdGljIFVTSE9SVAotR2V0UkFNREFDcm9tcHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0dldFJBTURBQ3JvbXB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgcm9tcHRyOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IHJvbXB0cjsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDEyOCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUIzMDJCKQorICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MTJhKTsKICAgfSBlbHNlIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDFhOCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUIzMDJCKQorICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MWFhKTsKICAgfQotICByZXR1cm4ocm9tcHRyKTsKKyAgcmV0dXJuIHJvbXB0cjsKIH0KIAotc3RhdGljIFVTSE9SVAotR2V0TENEcm9tcHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0dldExDRHJvbXB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgcm9tcHRyOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IHJvbXB0cjsKIAotICBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDEyMCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MTIyKTsKICAgfSBlbHNlIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDFhMCk7Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikKKyAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKQogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MWEyKTsKICAgfQotICByZXR1cm4ocm9tcHRyKTsKKyAgcmV0dXJuIHJvbXB0cjsKIH0KIAotc3RhdGljIFVTSE9SVAotR2V0VFZyb21wdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbykKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorR2V0VFZyb21wdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIHJvbXB0cjsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCByb21wdHI7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzMwKSB7CisgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPCBTSVNfMzMwKSB7CiAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxMTQpOwotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpCisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExYSk7CiAgIH0gZWxzZSB7CiAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxOTQpOwotICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpCisgICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDE5YSk7CiAgIH0KLSAgcmV0dXJuKHJvbXB0cik7CisgIHJldHVybiByb21wdHI7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLUdldExDRFB0ckluZGV4QklPUyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitHZXRMQ0RQdHJJbmRleEJJT1Moc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CiAKLSAgaWYoKElTX1NJUzY1MCkgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpKSB7Ci0gICAgIGlmKCEoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLCBId0luZm8pKSkgeworICBpZigoSVNfU0lTNjUwKSAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykpIHsKKyAgICAgaWYoIShTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIpKSkgewogICAgICAgICBpZigoaW5kZXggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgJiAweGYwKSkgewogCSAgIGluZGV4ID4+PSA0OwogCSAgIGluZGV4ICo9IDM7CkBAIC0xMDcyOSw3ICs5NzI4LDEyIEBACiAKICAgaW5kZXggPSBTaVNfR2V0QklPU0xDRFJlc0luZm8oU2lTX1ByKSAmIDB4MEY7CiAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSAgICAgIGluZGV4IC09IDU7Ci0gIGVsc2UgaWYoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyA9PSBQYW5lbF8xNjAweDEyMDApIGluZGV4IC09IDY7CisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIHsgIC8qIDEuMTUuMjAgYW5kIGxhdGVyIChub3QgVkIgc3BlY2lmaWMpICovCisgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSBpbmRleCAtPSA1OworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzEyODB4NzY4KSBpbmRleCAtPSA1OworICB9IGVsc2UgeworICAgICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsXzE2MDB4MTIwMCkgaW5kZXggLT0gNjsKKyAgfQogICBpbmRleC0tOwogICBpbmRleCAqPSAzOwogICBpZihTaVNfUHItPlNpU19MQ0RJbmZvICYgRG9udEV4cGFuZExDRCkgaW5kZXggKz0gMjsKQEAgLTEwNzM3LDEwICs5NzQxLDEwIEBACiAgIHJldHVybiBpbmRleDsKIH0KIAotc3RhdGljIFVTSE9SVAotR2V0TENEUHRySW5kZXgoU2lTX1ByaXZhdGUgKlNpU19QcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorR2V0TENEUHRySW5kZXgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gIFVTSE9SVCBpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CiAKICAgaW5kZXggPSAoKFNpU19HZXRCSU9TTENEUmVzSW5mbyhTaVNfUHIpICYgMHgwRikgLSAxKSAqIDM7CiAgIGlmKFNpU19Qci0+U2lTX0xDREluZm8gJiBEb250RXhwYW5kTENEKSAgICAgICAgIGluZGV4ICs9IDI7CkBAIC0xMDc0OCwxMCArOTc1MiwxMCBAQAogICByZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyBVU0hPUlQKLUdldFRWUHRySW5kZXgoU2lTX1ByaXZhdGUgKlNpU19QcikKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorR2V0VFZQdHJJbmRleChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGluZGV4OworICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKIAogICBpbmRleCA9IDA7CiAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0UEFMKSBpbmRleCA9IDE7CkBAIC0xMDc2OSwxMCArOTc3MywxMCBAQAogICByZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyBVTE9ORwotR2V0T0VNVFZQdHI2NjFfMl9HRU4oU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IGFkZG1lKQorc3RhdGljIHVuc2lnbmVkIGludAorR2V0T0VNVFZQdHI2NjFfMl9HRU4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBhZGRtZSkKIHsKLSAgIFVTSE9SVCBpbmRleCA9IDAsIHRlbXAgPSAwOworICAgdW5zaWduZWQgc2hvcnQgaW5kZXggPSAwLCB0ZW1wID0gMDsKIAogICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUwpICAgaW5kZXggPSAxOwogICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxNKSAgaW5kZXggPSAyOwpAQCAtMTA3ODQsNyArOTc4OCw3IEBACiAgICAgICBpZihTaVNfUHItPlNpU19UVk1vZGUgJiBUVlNldE5UU0NKKSBpbmRleCA9IDc7CiAgICB9CiAKLSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAgICAgICBpZigoIShTaVNfUHItPlNpU19WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkpIHx8CiAgICAgICAgICAoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSkgewogCSBpbmRleCArPSBhZGRtZTsKQEAgLTEwNzkyLDI1ICs5Nzk2LDI1IEBACiAgICAgICB9CiAgICAgICB0ZW1wICs9IDB4MDEwMDsKICAgIH0KLSAgIHJldHVybihVTE9ORykoaW5kZXggfCAodGVtcCA8PCAxNikpOworICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKGluZGV4IHwgKHRlbXAgPDwgMTYpKTsKIH0KIAotc3RhdGljIFVMT05HCi1HZXRPRU1UVlB0cjY2MV8yX09MRChTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIGludAorR2V0T0VNVFZQdHI2NjFfMl9PTEQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICByZXR1cm4oR2V0T0VNVFZQdHI2NjFfMl9HRU4oU2lTX1ByLCA4KSk7CisgICByZXR1cm4gKEdldE9FTVRWUHRyNjYxXzJfR0VOKFNpU19QciwgOCkpOwogfQogCiAjaWYgMAotc3RhdGljIFVMT05HCi1HZXRPRU1UVlB0cjY2MV8yX05FVyhTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIGludAorR2V0T0VNVFZQdHI2NjFfMl9ORVcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpCiB7Ci0gICByZXR1cm4oR2V0T0VNVFZQdHI2NjFfMl9HRU4oU2lTX1ByLCA2KSk7CisgICByZXR1cm4gKEdldE9FTVRWUHRyNjYxXzJfR0VOKFNpU19QciwgNikpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLUdldE9FTVRWUHRyNjYxKFNpU19Qcml2YXRlICpTaVNfUHIpCitHZXRPRU1UVlB0cjY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKICAgIGludCBpbmRleCA9IDA7CiAKQEAgLTEwODMzLDEwICs5ODM3LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXREZWxheUNvbXAoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywgVVNIT1JUIE1vZGVObykKK1NldERlbGF5Q29tcChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBkZWxheT0wLGluZGV4LG15aW5kZXgsdGVtcCxyb21wdHI9MDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBkZWxheT0wLGluZGV4LG15aW5kZXgsdGVtcCxyb21wdHI9MDsKICAgQk9PTEVBTiBkb2NoaXB0ZXN0ID0gVFJVRTsKIAogICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9MQ0RBKSB7CkBAIC0xMDg0OCwxOSArOTg1MiwxOSBAQAogICAvKiBGaW5kIGRlbGF5IChmcm9tIFJPTSwgaW50ZXJuYWwgdGFibGVzLCBQQ0kgc3Vic3lzdGVtKSAqLwogCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1JBTURBQykgewkJCS8qIC0tLS0tLS0tLS0tLSBWR0EgKi8KLSAgICAgCisKICAgICAgaWYoKFNpU19Qci0+U2lTX1VzZVJPTSkgJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLSAgICAgICAgcm9tcHRyID0gR2V0UkFNREFDcm9tcHRyKFNpU19QciwgSHdJbmZvKTsKKyAgICAgICAgcm9tcHRyID0gR2V0UkFNREFDcm9tcHRyKFNpU19Qcik7CiAgICAgIH0KICAgICAgaWYocm9tcHRyKSBkZWxheSA9IFJPTUFkZHJbcm9tcHRyXTsKICAgICAgZWxzZSB7CiAgICAgICAgIGRlbGF5ID0gMHgwNDsKLSAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQjMwMkIpIHsKKyAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QikgewogCSAgIGlmKElTX1NJUzY1MCkgewogCSAgICAgIGRlbGF5ID0gMHgwYTsKIAkgICB9IGVsc2UgaWYoSVNfU0lTNzQwKSB7CiAJICAgICAgZGVsYXkgPSAweDAwOwotCSAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA8IFNJU18zMzApIHsKKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA8IFNJU18zMzApIHsKIAkgICAgICBkZWxheSA9IDB4MGM7CiAJICAgfSBlbHNlIHsKIAkgICAgICBkZWxheSA9IDB4MGM7CkBAIC0xMDkwMSw4ICs5OTA1LDEyIEBACiAJICAgU2lTX1NldFJlZ0FORE9SKFNpU19Qci0+U2lTX1BhcnQxUG9ydCwweDJkLDB4MGYsZGVsYXkpOwogCX0gZWxzZSB7CiAJICAgZGVsYXkgPSAweDBjOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUMpIGRlbGF5ID0gMHgwMzsKLQkgICBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFDKSB7CisJICAgICAgZGVsYXkgPSAweDAzOworCSAgICAgIGlmKChTaVNfUHItPlBhbmVsWFJlcyA+IDEyODApICYmIChTaVNfUHItPlBhbmVsWVJlcyA+IDEwMjQpKSB7CisJICAgICAgICAgZGVsYXkgPSAweDAwOworCSAgICAgIH0KKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogCSAgICAgIGlmKElTX1NJUzc0MCkgZGVsYXkgPSAweDAxOwogCSAgICAgIGVsc2UgICAgICAgICAgZGVsYXkgPSAweDAzOwogCSAgIH0KQEAgLTEwOTQ3LDEyICs5OTU1LDEyIEBACiAKICAgICAgaWYoIWdvdGl0ZnJvbXBjaSkgewogCi0gICAgICAgIGluZGV4ID0gR2V0TENEUHRySW5kZXhCSU9TKFNpU19QciwgSHdJbmZvKTsKKyAgICAgICAgaW5kZXggPSBHZXRMQ0RQdHJJbmRleEJJT1MoU2lTX1ByKTsKICAgICAgICAgbXlpbmRleCA9IEdldExDRFB0ckluZGV4KFNpU19Qcik7CiAKLSAgICAgICAgaWYoSVNfU0lTNjUwICYmIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFMVjMwMkxWKSkgeworICAgICAgICBpZihJU19TSVM2NTAgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CiAKLSAgICAgICAgICAgaWYoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByLCBId0luZm8pKSB7CisgICAgICAgICAgIGlmKFNpU19Jc05vdE02NTBvckxhdGVyKFNpU19QcikpIHsKIAogICAgICAgICAgICAgICBpZigoU2lTX1ByLT5TaVNfVXNlUk9NKSAmJiAoIShTaVNfUHItPlNpU19ST01OZXcpKSkgewogCSAgICAgICAgIC8qIEFsd2F5cyB1c2UgdGhlIHNlY29uZCBwb2ludGVyIG9uIDY1MDsgc29tZSBCSU9TZXMgKi8KQEAgLTEwOTc4LDExICs5OTg2LDEyIEBACiAJCSAgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkJCSAgICAgICYmCiAJICAgICAgICAgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvICE9IFBhbmVsXzEyODB4MTAyNCkgJiYKIAkJICAoU2lTX1ByLT5TaVNfTENEUmVzSW5mbyAhPSBQYW5lbF8xMjgweDc2OCkgICYmCi0JCSAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHg5NjApKSB7CisJCSAgKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfMTI4MHg5NjApICAmJgorCQkgIChTaVNfUHItPlNpU19MQ0RSZXNJbmZvICE9IFBhbmVsXzE2MDB4MTIwMCkgICYmCisJCSAgKChyb21wdHIgPSBHZXRMQ0Ryb21wdHIoU2lTX1ByKSkpKSB7CiAKIAkgICAvKiBEYXRhIGZvciAxMjgweDEwMjQgd3JvbmcgaW4gMzAxQiBCSU9TICovCi0gICAgICAgICAgIHJvbXB0ciA9IEdldExDRHJvbXB0cihTaVNfUHIsIEh3SW5mbyk7Ci0JICAgaWYoIXJvbXB0cikgcmV0dXJuOworCSAgIC8qIERhdGEgZm9yIDE2MDB4MTIwMCB3cm9uZyBpbiAzMDFDIEJJT1MgKi8KIAkgICBkZWxheSA9IFJPTUFkZHJbKHJvbXB0ciArIGluZGV4KV07CiAKICAgICAgICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX0lGX0RFRl9MVkRTID09IDEpIHsKQEAgLTEwOTkzLDE0ICsxMDAwMiwxNSBAQAogCX0gZWxzZSB7CiAKICAgICAgICAgICAgZGVsYXkgPSBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fMzAxW215aW5kZXhdOwotCSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpIHsKKwkgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSB7CiAJICAgICAgaWYoSVNfU0lTNzQwKSBkZWxheSA9IDB4MDE7Ci0JICAgICAgZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA8PSBTSVNfMzE1UFJPKSBkZWxheSA9IFNpUzMxMF9MQ0REZWxheUNvbXBlbnNhdGlvbl8zeHgzMDFMVltteWluZGV4XTsKKwkgICAgICBlbHNlIGlmKFNpU19Qci0+Q2hpcFR5cGUgPD0gU0lTXzMxNVBSTykgZGVsYXkgPSBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fM3h4MzAxTFZbbXlpbmRleF07CiAJICAgICAgZWxzZSAgICAgICAgICBkZWxheSA9IFNpUzMxMF9MQ0REZWxheUNvbXBlbnNhdGlvbl82NTAzMDFMVltteWluZGV4XTsKIAkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQykgewogCSAgICAgIGlmKElTX1NJUzc0MCkgZGVsYXkgPSAweDAxOyAgLyogPyAqLwogCSAgICAgIGVsc2UgICAgICAgICAgZGVsYXkgPSAweDAzOwotCSAgIH0gZWxzZSBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCMzAyQikgeworCSAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTYwMHgxMjAwKSBkZWxheSA9IDB4MDA7IC8qIGV4cGVyaWVuY2UgKi8KKwkgICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QikgewogCSAgICAgIGlmKElTX1NJUzc0MCkgZGVsYXkgPSAweDAxOwogCSAgICAgIGVsc2UgICAgICAgICAgZGVsYXkgPSBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fM3h4MzAxQltteWluZGV4XTsKIAkgICB9CkBAIC0xMTAxMywxNCArMTAwMjMsMTQgQEAKIAlTaVNfU2V0UmVnQU5ET1IoU2lTX1ByLT5TaVNfUGFydDFQb3J0LDB4MkQsMHgwRiwoKGRlbGF5IDw8IDQpICYgMHhmMCkpOwogCWRvY2hpcHRlc3QgPSBGQUxTRTsKICAgICAgfQotICAgICAKKwogICB9IGVsc2UgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsJCQkvKiAtLS0tLS0tLS0tLS0gVFYgKi8KIAogICAgICBpbmRleCA9IEdldFRWUHRySW5kZXgoU2lTX1ByKTsKLSAgICAgCi0gICAgIGlmKElTX1NJUzY1MCAmJiAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxTFYzMDJMVikpIHsKIAotICAgICAgICBpZihTaVNfSXNOb3RNNjUwb3JMYXRlcihTaVNfUHIsSHdJbmZvKSkgeworICAgICBpZihJU19TSVM2NTAgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7CisKKyAgICAgICAgaWYoU2lTX0lzTm90TTY1MG9yTGF0ZXIoU2lTX1ByKSkgewogCiAgICAgICAgICAgIGlmKChTaVNfUHItPlNpU19Vc2VST00pICYmICghKFNpU19Qci0+U2lTX1JPTU5ldykpKSB7CiAJICAgICAgLyogQWx3YXlzIHVzZSB0aGUgc2Vjb25kIHBvaW50ZXIgb24gNjUwOyBzb21lIEJJT1NlcyAqLwpAQCAtMTEwNjIsNyArMTAwNzIsNyBAQAogCiAgICAgIH0gZWxzZSBpZigoU2lTX1ByLT5TaVNfVXNlUk9NKSAmJiAoIShTaVNfUHItPlNpU19ST01OZXcpKSkgewogCi0gICAgICAgIHJvbXB0ciA9IEdldFRWcm9tcHRyKFNpU19QciwgSHdJbmZvKTsKKyAgICAgICAgcm9tcHRyID0gR2V0VFZyb21wdHIoU2lTX1ByKTsKIAlpZighcm9tcHRyKSByZXR1cm47CiAJZGVsYXkgPSBST01BZGRyW3JvbXB0ciArIGluZGV4XTsKIApAQCAtMTEwNzMsNyArMTAwODMsNyBAQAogICAgICB9IGVsc2UgewogCiAJZGVsYXkgPSBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl8zMDFbaW5kZXhdOwotICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpIHsKKyAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzB4QkxWKSB7CiAJICAgaWYoSVNfU0lTNzQwKSB7CiAJICAgICAgZGVsYXkgPSBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl83NDAzMDFCW2luZGV4XTsKIAkgICAgICAvKiBMVjogdXNlIDMwMSBkYXRhPyBCSU9TIGJ1Zz8gKi8KQEAgLTExMDg1LDE4ICsxMDA5NSwxOCBAQAogCiAgICAgIH0KIAotICAgICBpZihTaVNfTENEQUVuYWJsZWQoU2lTX1ByLCBId0luZm8pKSB7CisgICAgIGlmKFNpU19MQ0RBRW5hYmxlZChTaVNfUHIpKSB7CiAJZGVsYXkgJj0gMHgwZjsKIAlkb2NoaXB0ZXN0ID0gRkFMU0U7CiAgICAgIH0KLSAgICAKKwogICB9IGVsc2UgcmV0dXJuOwogCiAgIC8qIFdyaXRlIGRlbGF5ICovCiAKICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTVkIpIHsKIAotICAgICBpZihJU19TSVM2NTAgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpICYmIGRvY2hpcHRlc3QpIHsKKyAgICAgaWYoSVNfU0lTNjUwICYmIChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNMVkRTKSAmJiBkb2NoaXB0ZXN0KSB7CiAKICAgICAgICAgdGVtcCA9IChTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgJiAweGYwKSA+PiA0OwogICAgICAgICBpZih0ZW1wID09IDgpIHsJCS8qIDE0MDB4MTA1MCBCSU9TIChDT01QQUwpICovCkBAIC0xMTEzNCwxMSArMTAxNDQsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldEFudGlGbGlja2VyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldEFudGlGbGlja2VyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBpbmRleCx0ZW1wLHRlbXAxLHJvbXB0cj0wOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IGluZGV4LHRlbXAsdGVtcDEscm9tcHRyPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgKFRWU2V0WVBiUHI3NTBwfFRWU2V0WVBiUHI1MjVwKSkgcmV0dXJuOwogCkBAIC0xMTE1MiwxNCArMTAxNjEsMTQgQEAKICAgdGVtcDEgPSB0ZW1wOwogCiAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSAmJiAoIShTaVNfUHItPlNpU19ST01OZXcpKSkgewotICAgICBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjYxKSB7CisgICAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzY2MSkgewogICAgICAgICB0ZW1wMSA9IEdldE9FTVRWUHRyNjYxKFNpU19Qcik7CiAgICAgICAgIHRlbXAxID4+PSAxOwogICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MjYwKTsKLSAgICAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzc2MCkgeworICAgICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU183NjApIHsKIAkgICByb21wdHIgPSBTSVNHRVRST01XKDB4MzYwKTsKIAl9Ci0gICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzMwKSB7CisgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMzApIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDE5Mik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxMTIpOwpAQCAtMTExNzgsMTEgKzEwMTg3LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRFZGdlRW5oYW5jZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRFZGdlRW5oYW5jZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCBpbmRleCx0ZW1wLHRlbXAxLHJvbXB0cj0wOworICB1bnNpZ25lZCBjaGFyICAqUk9NQWRkciA9IFNpU19Qci0+VmlydHVhbFJvbUJhc2U7CisgIHVuc2lnbmVkIHNob3J0IGluZGV4LHRlbXAsdGVtcDEscm9tcHRyPTA7CiAKICAgdGVtcCA9IHRlbXAxID0gR2V0VFZQdHJJbmRleChTaVNfUHIpID4+IDE7IAkvKiAwOiBOVFNDL1lQYlByLCAxOiBQQUwsIDI6IEhpVFYgKi8KIApAQCAtMTExOTIsMTQgKzEwMjAwLDE0IEBACiAgICAgIGluZGV4ID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5WQl9FeHRUVkVkZ2VJbmRleDsKIAogICBpZihTaVNfUHItPlNpU19Vc2VST00gJiYgKCEoU2lTX1ByLT5TaVNfUk9NTmV3KSkpIHsKLSAgICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgeworICAgICBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDI2Yyk7Ci0gICAgICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU183NjApIHsKKyAgICAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfNzYwKSB7CiAJICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDM2Yyk7CiAJfQogCXRlbXAxID0gR2V0T0VNVFZQdHI2NjEoU2lTX1ByKTsKICAgICAgICAgdGVtcDEgPj49IDE7Ci0gICAgIH0gZWxzZSBpZihId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfMzMwKSB7CisgICAgIH0gZWxzZSBpZihTaVNfUHItPkNoaXBUeXBlID49IFNJU18zMzApIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDFhNCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxMjQpOwpAQCAtMTEyMTcsMTAgKzEwMjI1LDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldFlGaWx0ZXIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRZRmlsdGVyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCBpbmRleCwgdGVtcCwgaSwgajsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsIHRlbXAsIGksIGo7CiAKICAgaWYoTW9kZU5vIDw9IDB4MTMpIHsKICAgICAgaW5kZXggPSBTaVNfUHItPlNpU19TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlZCX1N0VFZZRmlsdGVySW5kZXg7CkBAIC0xMTIzNSw3ICsxMDI0Miw3IEBACiAgIGVsc2UgaWYoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRQQUxOKSAgICB0ZW1wID0gNDsgIC8qIFBBTC1OICovCiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSB0ZW1wID0gMTsgIC8qIEhpVmlzaW9uIHVzZXMgUEFMICovCiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7CisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgewogICAgICBmb3IoaT0weDM1LCBqPTA7IGk8PTB4Mzg7IGkrKywgaisrKSB7CiAgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksU2lTMzEwX1RWWUZpbHRlcjJbdGVtcF1baW5kZXhdW2pdKTsKICAgICAgfQpAQCAtMTEyNTAsMjMgKzEwMjU3LDIyIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRQaGFzZUluY3IoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldFBoYXNlSW5jcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcCxpLGoscmVzaW5mbyxyb21wdHI9MDsKLSAgVUxPTkcgIGxpbmRleDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBpbmRleCx0ZW1wLGksaixyZXNpbmZvLHJvbXB0cj0wOworICB1bnNpZ25lZCBpbnQgIGxpbmRleDsKIAogICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgcmV0dXJuOwogCiAgIC8qIE5UU0MtSiBkYXRhIG5vdCBpbiBCSU9TLCBhbmQgYWxyZWFkeSBzZXQgaW4gU2V0R3JvdXAyICovCiAgIGlmKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0TlRTQ0opIHJldHVybjsKIAotICBpZigoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzY2MSkgfHwgU2lTX1ByLT5TaVNfUk9NTmV3KSB7CisgIGlmKChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NjEpIHx8IFNpU19Qci0+U2lTX1JPTU5ldykgewogICAgICBsaW5kZXggPSBHZXRPRU1UVlB0cjY2MV8yX09MRChTaVNfUHIpICYgMHhmZmZmOwogICAgICBsaW5kZXggPDw9IDI7CiAgICAgIGZvcihqPTAsIGk9MHgzMTsgaTw9MHgzNDsgaSsrLCBqKyspIHsKLSAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxTaVM2NjFfVFZQaGFzZVtsaW5kZXggKyBqXSk7CisgICAgICAgIFNpU19TZXRSZWcoU2lTX1ByLT5TaVNfUGFydDJQb3J0LGksU2lTX1RWUGhhc2VbbGluZGV4ICsgal0pOwogICAgICB9CiAgICAgIHJldHVybjsKICAgfQpAQCAtMTEyODYsMTcgKzEwMjkyLDE3IEBACiAgICAqLwogICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExNik7Ci0gICAgIGlmKEh3SW5mby0+akNoaXBUeXBlID49IFNJU18zMzApIHsKKyAgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzMwKSB7CiAgICAgICAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxOTYpOwogICAgICB9Ci0gICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKICAgICAgICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExYyk7Ci0JaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMzMCkgeworCWlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMzMCkgewogCSAgIHJvbXB0ciA9IFNJU0dFVFJPTVcoMHgxOWMpOwogCX0KIAlpZigoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICYmICghKFNpU19Qci0+U2lTX1RWTW9kZSAmIFRWU2V0VFZTaW11TW9kZSkpKSB7CiAJICAgcm9tcHRyID0gU0lTR0VUUk9NVygweDExNik7Ci0JICAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgPj0gU0lTXzMzMCkgeworCSAgIGlmKFNpU19Qci0+Q2hpcFR5cGUgPj0gU0lTXzMzMCkgewogICAgICAgICAgICAgICByb21wdHIgPSBTSVNHRVRST01XKDB4MTk2KTsKICAgICAgICAgICAgfQogCX0KQEAgLTExMzExLDcgKzEwMzE3LDcgQEAKICAgICAgaW5kZXggPSB0ZW1wICUgMjsKICAgICAgdGVtcCA+Pj0gMTsgICAgICAgICAgLyogMDpOVFNDLCAxOlBBTCwgMjpIaVRWICovCiAgICAgIGZvcihqPTAsIGk9MHgzMTsgaTw9MHgzNDsgaSsrLCBqKyspIHsKLSAgICAgICAgaWYoIShTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpKQorICAgICAgICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikpCiAJICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxTaVMzMTBfVFZQaGFzZUluY3IxW3RlbXBdW2luZGV4XVtqXSk7CiAgICAgICAgIGVsc2UgaWYoKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB8fCAoU2lTX1ByLT5TaVNfVFZNb2RlICYgVFZTZXRUVlNpbXVNb2RlKSkKICAgICAgICAgICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0MlBvcnQsaSxTaVMzMTBfVFZQaGFzZUluY3IyW3RlbXBdW2luZGV4XVtqXSk7CkBAIC0xMTMyMCw3ICsxMDMyNiw3IEBACiAgICAgIH0KICAgfQogCi0gIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDFCTFYzMDJCTFYpICYmICghKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSkpIHsKKyAgaWYoKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgJiYgKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSkgewogICAgICBpZigoIShTaVNfUHItPlNpU19UVk1vZGUgJiAoVFZTZXRQQUwgfCBUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkpICYmIChNb2RlTm8gPiAweDEzKSkgewogICAgICAgICBpZigocmVzaW5mbyA9PSBTSVNfUklfNjQweDQ4MCkgfHwKIAkgICAocmVzaW5mbyA9PSBTSVNfUklfODAweDYwMCkpIHsKQEAgLTExMzM5LDExICsxMDM0NSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotU2V0RGVsYXlDb21wNjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFVTSE9SVCBNb2RlTm8sCi0gICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUlRJKQorU2V0RGVsYXlDb21wNjYxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJUSSkKIHsKLSAgIFVTSE9SVCBkZWxheSA9IDAsIHJvbXB0ciA9IDAsIGluZGV4LCBsY2RwZGNpbmRleDsKLSAgIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IGRlbGF5ID0gMCwgcm9tcHRyID0gMCwgaW5kZXgsIGxjZHBkY2luZGV4OworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOwogCiAgICBpZighKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9UViB8IFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEgfCBTZXRDUlQyVG9SQU1EQUMpKSkKICAgICAgIHJldHVybjsKQEAgLTExMzU5LDcgKzEwMzY1LDcgQEAKICAgICAgICAgIGlmKFNpU19Qci0+VXNlQ3VzdG9tTW9kZSkgewogCSAgICBpbmRleCA9IFNpU19Qci0+Q1NSQ2xvY2s7CiAgICAgICAgICB9IGVsc2UgaWYoTW9kZU5vID4gMHgxMykgewotICAgICAgICAgICAgaW5kZXggPSBTaVNfR2V0VkNMSzJQdHIoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCxSVEksSHdJbmZvKTsKKyAgICAgICAgICAgIGluZGV4ID0gU2lTX0dldFZDTEsyUHRyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgsUlRJKTsKICAgICAgICAgICAgIGluZGV4ID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbaW5kZXhdLkNMT0NLOwogICAgICAgICAgfQogCSBpZihpbmRleCA8IDI1KSBpbmRleCA9IDI1OwpAQCAtMTEzODcsNyArMTAzOTMsMzYgQEAKICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSAoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlRJXS5FeHRfUERDID4+IDQpOwogICAgZGVsYXkgfD0gKGRlbGF5IDw8IDgpOwogCi0gICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBYR0lfMjApIHsKKworICAgICAgZGVsYXkgPSAweDA2MDY7CisgICAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiBTZXRDUlQyVG9UVikgeworCisJIGRlbGF5ID0gMHgwNDA0OworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfWEdJUk9NKSB7CisJICAgICBpbmRleCA9IEdldFRWUHRySW5kZXgoU2lTX1ByKTsKKwkgICAgIGlmKChyb21wdHIgPSBTSVNHRVRST01XKDB4MzVlKSkpIHsKKwkgICAgICAgIGRlbGF5ID0gKFJPTUFkZHJbcm9tcHRyICsgaW5kZXhdICYgMHgwZikgPDwgMTsKKwkJZGVsYXkgfD0gKGRlbGF5IDw8IDgpOworCSAgICAgfQorCSB9CisKKwkgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKKwkgICAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBYR0lfNDAgJiYgU2lTX1ByLT5DaGlwUmV2aXNpb24gPT0gMHgwMikgeworCSAgICAgICBkZWxheSAtPSAweDA0MDQ7CisJICAgIH0KKwkgfQorICAgICAgfQorCisgICB9IGVsc2UgaWYoU2lTX1ByLT5DaGlwVHlwZSA+PSBTSVNfMzQwKSB7CisKKyAgICAgIGRlbGF5ID0gMHgwNjA2OworICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKKyAgICAgICAgIGRlbGF5ID0gMHgwNDA0OworICAgICAgfQorICAgICAgLyogVE9ETyAoZXZlbnR1YWxseSkgKi8KKworICAgfSBlbHNlIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAKICAgICAgIC8qIDMuIFRWICovCiAKQEAgLTExNDA2LDcgKzEwNDQxLDcgQEAKICAgICAgIC8qIDQuIExDRCwgTENEQSAoZm9yIG5ldyBST00gb25seSBMViBhbmQgbm9uLVBhc3MgMToxKSAqLwogCiAgICAgICBpZiggKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gIT0gUGFuZWxfQ3VzdG9tKSAmJgotICAgICAgICAgICgocm9tcHRyID0gR2V0TENEU3RydWN0UHRyNjYxXzIoU2lTX1ByLCBId0luZm8pKSkgKSB7CisgICAgICAgICAgKChyb21wdHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjFfMihTaVNfUHIpKSkgKSB7CiAKIAkgbGNkcGRjaW5kZXggPSAoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfVU1DKSA/IDE0IDogMTI7CiAKQEAgLTExNDI2LDYgKzEwNDYxLDcgQEAKIAkgICAgY2FzZSBQYW5lbF8xMjgweDc2OF8yOmRlbGF5ID0gMHgwMDA0OyBicmVhazsKIAkgICAgY2FzZSBQYW5lbF8xMjgweDgwMDoKIAkgICAgY2FzZSBQYW5lbF8xMjgweDgwMF8yOmRlbGF5ID0gMHgwMDA0OyBicmVhazsgLyogVmVyaWZpZWQgZm9yIDEyODB4ODAwICovCisJICAgIGNhc2UgUGFuZWxfMTI4MHg4NTQ6ICBkZWxheSA9IDB4MDAwNDsgYnJlYWs7IC8qIEZJWE1FICovCiAJICAgIGNhc2UgUGFuZWxfMTI4MHgxMDI0OiBkZWxheSA9IDB4MWUwNDsgYnJlYWs7CiAJICAgIGNhc2UgUGFuZWxfMTQwMHgxMDUwOiBkZWxheSA9IDB4MDAwNDsgYnJlYWs7CiAJICAgIGNhc2UgUGFuZWxfMTYwMHgxMjAwOiBkZWxheSA9IDB4MDQwMDsgYnJlYWs7CkBAIC0xMTQ2OSwxMCArMTA1MDUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldENSVDJTeW5jRGl0aGVyNjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBSVEkpCitTZXRDUlQyU3luY0RpdGhlcjY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBSVEkpCiB7Ci0gICBVU0hPUlQgaW5mb2ZsYWc7Ci0gICBVQ0hBUiB0ZW1wOworICAgdW5zaWduZWQgc2hvcnQgaW5mb2ZsYWc7CisgICB1bnNpZ25lZCBjaGFyICB0ZW1wOwogCiAgICBpZihTaVNfUHItPlNpU19WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKIApAQCAtMTE1MTMsMTIgKzEwNTQ5LDE2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRQYW5lbFBhcm1zNjYxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pCitTZXRQYW5lbFBhcm1zNjYxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKQogewotICAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICAgVVNIT1JUIHJvbXB0ciwgdGVtcDEsIHRlbXAyOworICAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICAgdW5zaWduZWQgc2hvcnQgcm9tcHRyLCB0ZW1wMSwgdGVtcDI7CiAKLSAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIChWQl9TSVMzMDFMViB8IFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWKSkgeworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgKFZCX1NJU0xWRFMgfCBWQl9TSVMzMHhDKSkgeworICAgICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNCwweDBmKTsKKyAgIH0KKworICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogICAgICAgaWYoU2lTX1ByLT5MVkRTSEwgIT0gLTEpIHsKICAgICAgICAgIFNpU19TZXRSZWdBTkRPUihTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyNCwweGZjLFNpU19Qci0+TFZEU0hMKTsKICAgICAgIH0KQEAgLTExNTI2LDggKzEwNTY2LDggQEAKIAogICAgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSB7CiAKLSAgICAgIGlmKChyb21wdHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjFfMihTaVNfUHIsIEh3SW5mbykpKSB7Ci0gICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAxTFYgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMVikpIHsKKyAgICAgIGlmKChyb21wdHIgPSBHZXRMQ0RTdHJ1Y3RQdHI2NjFfMihTaVNfUHIpKSkgeworICAgICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykgewogICAgICAgICAgICAgdGVtcDEgPSAoUk9NQWRkcltyb21wdHJdICYgMHgwMykgfCAweDBjOwogCSAgICB0ZW1wMiA9IDB4ZmM7CiAJICAgIGlmKFNpU19Qci0+TFZEU0hMICE9IC0xKSB7CkBAIC0xMTU0Niw0OCArMTA1ODYsNDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNpU19PRU0zMTBTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxVU0hPUlQgUlJUSSkKK1NpU19PRU0zMTBTZXR0aW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSUlRJKQogewogICAgaWYoKFNpU19Qci0+U2lTX1JPTU5ldykgJiYgKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJU0xWRFMpKSB7Ci0gICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsUlJUSSk7CisgICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewotICAgICAgICAgU2V0Q1JUMlN5bmNEaXRoZXI2NjEoU2lTX1ByLEh3SW5mbyxNb2RlTm8sUlJUSSk7Ci0gICAgICAgICBTZXRQYW5lbFBhcm1zNjYxKFNpU19QcixId0luZm8pOworICAgICAgICAgU2V0Q1JUMlN5bmNEaXRoZXI2NjEoU2lTX1ByLCBNb2RlTm8sIFJSVEkpOworICAgICAgICAgU2V0UGFuZWxQYXJtczY2MShTaVNfUHIpOwogICAgICAgfQogICAgfSBlbHNlIHsKLSAgICAgIFNldERlbGF5Q29tcChTaVNfUHIsSHdJbmZvLE1vZGVObyk7CisgICAgICBTZXREZWxheUNvbXAoU2lTX1ByLE1vZGVObyk7CiAgICB9CiAKICAgIGlmKChTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgJiYgKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSkgewotICAgICAgU2V0QW50aUZsaWNrZXIoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgpOwotICAgICAgU2V0UGhhc2VJbmNyKFNpU19QcixId0luZm8sTW9kZU5vLE1vZGVJZEluZGV4KTsKLSAgICAgIFNldFlGaWx0ZXIoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgpOworICAgICAgU2V0QW50aUZsaWNrZXIoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICBTZXRQaGFzZUluY3IoU2lTX1ByLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICBTZXRZRmlsdGVyKFNpU19QcixNb2RlTm8sTW9kZUlkSW5kZXgpOwogICAgICAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxKSB7Ci0gICAgICAgICBTZXRFZGdlRW5oYW5jZShTaVNfUHIsSHdJbmZvLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICAgICBTZXRFZGdlRW5oYW5jZShTaVNfUHIsTW9kZU5vLE1vZGVJZEluZGV4KTsKICAgICAgIH0KICAgIH0KIH0KIAogc3RhdGljIHZvaWQKLVNpU19PRU02NjFTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJSVEkpCitTaVNfT0VNNjYxU2V0dGluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpCiB7CiAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewogCi0gICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgsUlJUSSk7CisgICAgICBTZXREZWxheUNvbXA2NjEoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSUlRJKTsKIAogICAgICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7Ci0gICAgICAgICBTZXRDUlQyU3luY0RpdGhlcjY2MShTaVNfUHIsSHdJbmZvLE1vZGVObyxSUlRJKTsKLSAgICAgICAgIFNldFBhbmVsUGFybXM2NjEoU2lTX1ByLEh3SW5mbyk7CisgICAgICAgICBTZXRDUlQyU3luY0RpdGhlcjY2MShTaVNfUHIsIE1vZGVObywgUlJUSSk7CisgICAgICAgICBTZXRQYW5lbFBhcm1zNjYxKFNpU19Qcik7CiAgICAgICB9CiAKICAgICAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgICAgICBTZXRQaGFzZUluY3IoU2lTX1ByLEh3SW5mbyxNb2RlTm8sTW9kZUlkSW5kZXgpOwotICAgICAgICAgU2V0WUZpbHRlcihTaVNfUHIsSHdJbmZvLE1vZGVObyxNb2RlSWRJbmRleCk7Ci0gICAgICAgICBTZXRBbnRpRmxpY2tlcihTaVNfUHIsSHdJbmZvLE1vZGVObyxNb2RlSWRJbmRleCk7CisgICAgICAgICBTZXRQaGFzZUluY3IoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgICAgICAgIFNldFlGaWx0ZXIoU2lTX1ByLCBNb2RlTm8sIE1vZGVJZEluZGV4KTsKKyAgICAgICAgIFNldEFudGlGbGlja2VyKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAgICAgICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMDEpIHsKLSAgICAgICAgICAgIFNldEVkZ2VFbmhhbmNlKFNpU19QcixId0luZm8sTW9kZU5vLE1vZGVJZEluZGV4KTsKKyAgICAgICAgICAgIFNldEVkZ2VFbmhhbmNlKFNpU19QciwgTW9kZU5vLCBNb2RlSWRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICB9CiAgICB9CkBAIC0xMTYwMSwxMyArMTA2NDAsMTIgQEAKICAqIHByYXkgdGhhdCB3ZSBoYXZlIGEgYmFja3VwLi4uCiAgKi8KIHN0YXRpYyB2b2lkCi1TaVNfRmluYWxpemVMQ0QoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFBTSVNfSFdfSU5GTyBId0luZm8pCitTaVNfRmluYWxpemVMQ0Qoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVTSE9SVCB0ZW1wY2wsdGVtcGNoLHRlbXBibCx0ZW1wYmgsdGVtcGJ4LHRlbXBheCx0ZW1wOwotICBVU0hPUlQgcmVzaW5mbyxtb2RlZmxhZzsKKyAgdW5zaWduZWQgc2hvcnQgdGVtcGNsLHRlbXBjaCx0ZW1wYmwsdGVtcGJoLHRlbXBieCx0ZW1wYXgsdGVtcDsKKyAgdW5zaWduZWQgc2hvcnQgcmVzaW5mbyxtb2RlZmxhZzsKIAotICBpZighKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUxWMzAyTFYpKSByZXR1cm47CisgIGlmKCEoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTTFZEUykpIHJldHVybjsKICAgaWYoU2lTX1ByLT5TaVNfUk9NTmV3KSByZXR1cm47CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CkBAIC0xMTY3OCw3ICsxMDcxNiw3IEBACiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAgICAgIGlmKFNpU19Qci0+U2lTX0xDRFJlc0luZm8gPT0gUGFuZWxfMTAyNHg3NjgpIHsKLQlpZihTaVNfUHItPlNpU19WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYpKSB7CisJaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTRU1JKSB7CiAJICAgU2lTX1NldFJlZyhTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgyYSwweDAwKTsKICNpZmRlZiBTRVRfRU1JCiAJICAgU2lTX1NldFJlZ0FORChTaVNfUHItPlNpU19QYXJ0NFBvcnQsMHgzMCwweDBjKTsKQEAgLTExODA2LDExICsxMDg0NCwxMSBAQAogI2lmZGVmIFNJUzMwMAogCiBzdGF0aWMgdm9pZAotU2V0T0VNTENERGF0YTIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLSAgICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmVGFiSW5kZXgpCitTZXRPRU1MQ0REYXRhMihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQl1bnNpZ25lZCBzaG9ydCBSZWZUYWJJbmRleCkKIHsKLSAgVVNIT1JUIGNydDJjcnRjPTAsIG1vZGVmbGFnLCBteWluZGV4PTA7Ci0gIFVDSEFSICB0ZW1wOworICB1bnNpZ25lZCBzaG9ydCBjcnQyY3J0Yz0wLCBtb2RlZmxhZywgbXlpbmRleD0wOworICB1bnNpZ25lZCBjaGFyICB0ZW1wOwogICBpbnQgaTsKIAogICBpZihNb2RlTm8gPD0gMHgxMykgewpAQCAtMTE4NDksMjEgKzEwODg3LDIxIEBACiAgIH0KIH0KIAotc3RhdGljIFVTSE9SVAotR2V0T0VNTENEUHRyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sIGludCBGbGFnKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitHZXRPRU1MQ0RQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBGbGFnKQogewotICBVQ0hBUiAgKlJPTUFkZHIgPSBId0luZm8tPnBqVmlydHVhbFJvbUJhc2U7Ci0gIFVTSE9SVCB0ZW1wYng9MCxyb21wdHI9MDsKLSAgVUNIQVIgY3VzdG9tdGFibGUzMDBbXSA9IHsKLSAgCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCB0ZW1wYng9MCxyb21wdHI9MDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY3VzdG9tdGFibGUzMDBbXSA9IHsKKwkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCiAJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmCiAgIH07Ci0gIFVDSEFSIGN1c3RvbXRhYmxlNjMwW10gPSB7Ci0gIAkweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGN1c3RvbXRhYmxlNjMwW10gPSB7CisJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAogCTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZgogICB9OwogCi0gIGlmKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMDApIHsKKyAgaWYoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfMzAwKSB7CiAKICAgICB0ZW1wYnggPSBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzZDQsMHgzNikgJiAweDBmOwogICAgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMSkgdGVtcGJ4ICY9IDB4MDc7CkBAIC0xMTkxMiwxMSArMTA5NTAsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldE9FTUxDRERlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldE9FTUxDRERlbGF5KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIGluZGV4LHRlbXAscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsdGVtcCxyb21wdHI9MDsKIAogICBpZihTaVNfUHItPlNpU19MQ0RSZXNJbmZvID09IFBhbmVsX0N1c3RvbSkgcmV0dXJuOwogCkBAIC0xMTkyNywyMiArMTA5NjQsMjIgQEAKICAgfQogCiAgIC8qIFRoZSBQYW5lbCBDb21wZW5zYXRpb24gRGVsYXkgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGFibGVzCi0gICAqIGhlcmUuIFVuZm9ydHVuYXRlbHksIHZhcmlvdXMgQklPUyB2ZXJzaW9ucyBkb24ndCBjYXNlIGFib3V0CisgICAqIGhlcmUuIFVuZm9ydHVuYXRlbHksIHZhcmlvdXMgQklPUyB2ZXJzaW9ucyBkb24ndCBjYXJlIGFib3V0CiAgICAqIGEgdW5pZm9ybSB3YXkgdXNpbmcgZWcuIFJPTSBieXRlIDB4MjIwLCBidXQgdXNlIGRpZmZlcmVudAogICAgKiBoYXJkIGNvZGVkIGRlbGF5cyAoMHgwNCwgMHgyMCwgMHgxOCkgaW4gU2V0R3JvdXAxKCkuCi0gICAqIFRodXMgd2UgZG9uJ3Qgc2V0IHRoaXMgaWYgdGhlIHVzZXIgc2VsZWN0IGEgY3VzdG9tIHBkYyBvciBpZgorICAgKiBUaHVzIHdlIGRvbid0IHNldCB0aGlzIGlmIHRoZSB1c2VyIHNlbGVjdGVkIGEgY3VzdG9tIHBkYyBvciBpZgogICAgKiB3ZSBvdGhlcndpc2UgZGV0ZWN0ZWQgYSB2YWxpZCBwZGMuCiAgICAqLwogICBpZihTaVNfUHItPlBEQyAhPSAtMSkgcmV0dXJuOwogCi0gIHRlbXAgPSBHZXRPRU1MQ0RQdHIoU2lTX1ByLEh3SW5mbywgMCk7CisgIHRlbXAgPSBHZXRPRU1MQ0RQdHIoU2lTX1ByLCAwKTsKIAogICBpZihTaVNfUHItPlVzZUN1c3RvbU1vZGUpCiAgICAgIGluZGV4ID0gMDsKICAgZWxzZQogICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1ZCTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlZCX0xDRERlbGF5SW5kZXg7CiAKLSAgaWYoSHdJbmZvLT5qQ2hpcFR5cGUgIT0gU0lTXzMwMCkgeworICBpZihTaVNfUHItPkNoaXBUeXBlICE9IFNJU18zMDApIHsKICAgICAgaWYocm9tcHRyKSB7CiAJcm9tcHRyICs9ICh0ZW1wICogMik7CiAJcm9tcHRyID0gU0lTR0VUUk9NVyhyb21wdHIpOwpAQCAtMTE5ODYsMTIgKzExMDIzLDExIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRPRU1MQ0REYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4KQorU2V0T0VNTENERGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKICNpZiAwICAvKiBVbmZpbmlzaGVkOyBEYXRhIHRhYmxlIG1pc3NpbmcgKi8KLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBpbmRleCx0ZW1wOwogCiAgIGlmKChTaVNfUHItPlNpU19Vc2VST00pIHsKICAgICAgaWYoIShST01BZGRyWzB4MjM3XSAmIDB4MDEpKSByZXR1cm47CkBAIC0xMTk5OSw4ICsxMTAzNSw4IEBACiAgICAgIC8qIE5vIHJvbSBwb2ludGVyIGluIEJJT1MgaGVhZGVyISAqLwogICB9CiAKLSAgdGVtcCA9IEdldE9FTUxDRFB0cihTaVNfUHIsSHdJbmZvLCAxKTsKLSAgaWYodGVtcCA9IDB4RkZGRikgcmV0dXJuOworICB0ZW1wID0gR2V0T0VNTENEUHRyKFNpU19QciwgMSk7CisgIGlmKHRlbXAgPT0gMHhGRkZGKSByZXR1cm47CiAKICAgaW5kZXggPSBTaVNfUHItPlNpU19WQk1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5fVkJfTENESEluZGV4OwogICBmb3IoaT0weDE0LCBqPTA7IGk8PTB4MTc7IGkrKywgaisrKSB7CkBAIC0xMjAxOCwxMCArMTEwNTQsMTAgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgVVNIT1JUCi1HZXRPRU1UVlB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByKQorc3RhdGljIHVuc2lnbmVkIHNob3J0CitHZXRPRU1UVlB0cihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QcikKIHsKLSAgVVNIT1JUIGluZGV4OworICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKIAogICBpbmRleCA9IDA7CiAgIGlmKCEoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSAgaW5kZXggKz0gNDsKQEAgLTEyMDM3LDExICsxMTA3MywxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotU2V0T0VNVFZEZWxheShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCkKK1NldE9FTVRWRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7Ci0gIFVDSEFSICAqUk9NQWRkciA9IEh3SW5mby0+cGpWaXJ0dWFsUm9tQmFzZTsKLSAgVVNIT1JUIGluZGV4LHRlbXAscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsdGVtcCxyb21wdHI9MDsKIAogICBpZihTaVNfUHItPlNpU19Vc2VST00pIHsKICAgICAgaWYoIShST01BZGRyWzB4MjM4XSAmIDB4MDEpKSByZXR1cm47CkBAIC0xMjA3MCwxMSArMTExMDUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLVNldE9FTUFudGlGbGlja2VyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRPRU1BbnRpRmxpY2tlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcCxyb21wdHI9MDsKKyAgdW5zaWduZWQgY2hhciAgKlJPTUFkZHIgPSBTaVNfUHItPlZpcnR1YWxSb21CYXNlOworICB1bnNpZ25lZCBzaG9ydCBpbmRleCx0ZW1wLHJvbXB0cj0wOwogCiAgIGlmKFNpU19Qci0+U2lTX1VzZVJPTSkgewogICAgICBpZighKFJPTUFkZHJbMHgyMzhdICYgMHgwMSkpIHJldHVybjsKQEAgLTEyMDk5LDExICsxMTEzMywxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotU2V0T0VNUGhhc2VJbmNyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpCitTZXRPRU1QaGFzZUluY3Ioc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObyx1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsaSxqLHRlbXAscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsaSxqLHRlbXAscm9tcHRyPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pIHJldHVybjsKIApAQCAtMTIxMTksNyArMTExNTIsNyBAQAogCiAgIGluZGV4ID0gU2lTX1ByLT5TaVNfVkJNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uVkJfVFZQaGFzZUluZGV4OwogCi0gIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMwMUJMVjMwMkJMVikgeworICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVMzMHhCTFYpIHsKICAgICAgZm9yKGk9MHgzMSwgaj0wOyBpPD0weDM0OyBpKyssIGorKykgewogICAgICAgICBTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxpLFNpUzMwMF9QaGFzZTJbdGVtcF1baW5kZXhdW2pdKTsKICAgICAgfQpAQCAtMTIxNDAsMTEgKzExMTczLDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1TZXRPRU1ZRmlsdGVyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4KQorU2V0T0VNWUZpbHRlcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCkKIHsKLSAgVUNIQVIgICpST01BZGRyID0gSHdJbmZvLT5walZpcnR1YWxSb21CYXNlOwotICBVU0hPUlQgaW5kZXgsdGVtcCxpLGoscm9tcHRyPTA7CisgIHVuc2lnbmVkIGNoYXIgICpST01BZGRyID0gU2lTX1ByLT5WaXJ0dWFsUm9tQmFzZTsKKyAgdW5zaWduZWQgc2hvcnQgaW5kZXgsdGVtcCxpLGoscm9tcHRyPTA7CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgKFNldENSVDJUb1NDQVJUIHwgU2V0Q1JUMlRvSGlWaXNpb24gfCBTZXRDUlQyVG9ZUGJQcjUyNTc1MCkpIHJldHVybjsKIApAQCAtMTIxNjIsNyArMTExOTQsNyBAQAogCiAgIGluZGV4ID0gU2lTX1ByLT5TaVNfVkJNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uVkJfVFZZRmlsdGVySW5kZXg7CiAKLSAgaWYoU2lTX1ByLT5TaVNfVkJUeXBlICYgVkJfU0lTMzAxQkxWMzAyQkxWKSB7CisgIGlmKFNpU19Qci0+U2lTX1ZCVHlwZSAmIFZCX1NJUzMweEJMVikgewogICAgICAgZm9yKGk9MHgzNSwgaj0wOyBpPD0weDM4OyBpKyssIGorKykgewogICAgICAgIAlTaVNfU2V0UmVnKFNpU19Qci0+U2lTX1BhcnQyUG9ydCxpLFNpUzMwMF9GaWx0ZXIyW3RlbXBdW2luZGV4XVtqXSk7CiAgICAgICB9CkBAIC0xMjE4NSwxMSArMTEyMTcsMTEgQEAKICAgfQogfQogCi1zdGF0aWMgVVNIT1JUCi1TaVNfU2VhcmNoVkJNb2RlSUQoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUICpNb2RlTm8pCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK1NpU19TZWFyY2hWQk1vZGVJRChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgKk1vZGVObykKIHsKLSAgIFVTSE9SVCBNb2RlSWRJbmRleDsKLSAgIFVDSEFSIFZHQUlORk8gPSBTaVNfUHItPlNpU19WR0FJTkZPOworICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXg7CisgICB1bnNpZ25lZCBjaGFyICBWR0FJTkZPID0gU2lTX1ByLT5TaVNfVkdBSU5GTzsKIAogICAgaWYoKk1vZGVObyA8PSA1KSAqTW9kZU5vIHw9IDE7CiAKQEAgLTEyMjEwLDEwICsxMTI0MiwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotU2lTX09FTTMwMFNldHRpbmcoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbywKLQkJICBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFVTSE9SVCBSZWZUYWJsZUluZGV4KQorU2lTX09FTTMwMFNldHRpbmcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgdW5zaWduZWQgc2hvcnQgUmVmVGFibGVJbmRleCkKIHsKLSAgVVNIT1JUIE9FTU1vZGVJZEluZGV4PTA7CisgIHVuc2lnbmVkIHNob3J0IE9FTU1vZGVJZEluZGV4ID0gMDsKIAogICBpZighU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSB7CiAgICAgIE9FTU1vZGVJZEluZGV4ID0gU2lTX1NlYXJjaFZCTW9kZUlEKFNpU19QciwmTW9kZU5vKTsKQEAgLTEyMjIxLDE4ICsxMTI1MywxOCBAQAogICB9CiAKICAgaWYoU2lTX1ByLT5TaVNfVkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7Ci0gICAgIFNldE9FTUxDRERlbGF5KFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKKyAgICAgU2V0T0VNTENERGVsYXkoU2lTX1ByLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKICAgICAgaWYoU2lTX1ByLT5TaVNfSUZfREVGX0xWRFMgPT0gMSkgewotICAgICAgICBTZXRPRU1MQ0REYXRhKFNpU19QciwgSHdJbmZvLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKKyAgICAgICAgU2V0T0VNTENERGF0YShTaVNfUHIsIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOwogICAgICB9CiAgIH0KICAgaWYoU2lTX1ByLT5Vc2VDdXN0b21Nb2RlKSByZXR1cm47CiAgIGlmKFNpU19Qci0+U2lTX1ZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0gICAgIFNldE9FTVRWRGVsYXkoU2lTX1ByLCBId0luZm8sIE1vZGVObyxPRU1Nb2RlSWRJbmRleCk7CisgICAgIFNldE9FTVRWRGVsYXkoU2lTX1ByLCBNb2RlTm8sT0VNTW9kZUlkSW5kZXgpOwogICAgICBpZihTaVNfUHItPlNpU19WQlR5cGUgJiBWQl9TSVNWQikgewotICAgICAgICBTZXRPRU1BbnRpRmxpY2tlcihTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBPRU1Nb2RlSWRJbmRleCk7Ci0gICAgCVNldE9FTVBoYXNlSW5jcihTaVNfUHIsIEh3SW5mbywgTW9kZU5vLCBPRU1Nb2RlSWRJbmRleCk7Ci0gICAgICAgCVNldE9FTVlGaWx0ZXIoU2lTX1ByLCBId0luZm8sIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOworICAgICAgICBTZXRPRU1BbnRpRmxpY2tlcihTaVNfUHIsIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOworICAgIAlTZXRPRU1QaGFzZUluY3IoU2lTX1ByLCBNb2RlTm8sIE9FTU1vZGVJZEluZGV4KTsKKyAgICAgICAJU2V0T0VNWUZpbHRlcihTaVNfUHIsIE1vZGVObywgT0VNTW9kZUlkSW5kZXgpOwogICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuaCBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuaAppbmRleCBmODRlYjU0Li5mNDc1YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0MzAxLmgKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdDMwMS5oCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqIERhdGEgYW5kIHByb3RvdHlwZXMgZm9yIGluaXQzMDEuYwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtNTAsMTggKzUwLDE4IEBACiAgKgogICovCiAKLSNpZm5kZWYgIF9JTklUMzAxXwotI2RlZmluZSAgX0lOSVQzMDFfCisjaWZuZGVmICBfSU5JVDMwMV9IXworI2RlZmluZSAgX0lOSVQzMDFfSF8KIAogI2luY2x1ZGUgIm9zZGVmLmgiCiAjaW5jbHVkZSAiaW5pdGRlZi5oIgogCi0jaWZkZWYgTElOVVhfWEY4NgorI2lmZGVmIFNJU19YT1JHX1hGODYKICNpbmNsdWRlICJzaXMuaCIKICNpbmNsdWRlICJzaXNfcmVncy5oIgogI2VuZGlmCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCiAjaW5jbHVkZSAidmdhdHlwZXMuaCIKICNpbmNsdWRlICJ2c3RydWN0LmgiCiAjaWZkZWYgU0lTX0NQCkBAIC02OSw4ICs2OSwxMyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpbmNsdWRlIDx2aWRlby9mYmNvbi5oPgorI2VuZGlmCisjaW5jbHVkZSAic2lzLmgiCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaW5jbHVkZSA8bGludXgvc2lzZmIuaD4KICNlbHNlCkBAIC03OCw3ICs4Myw3IEBACiAjZW5kaWYKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1lQYlByVGFibGVbM11bNjRdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX1lQYlByVGFibGVbM11bNjRdID0gewogICB7CiAgICAgMHgxNywweDFkLDB4MDMsMHgwOSwweDA1LDB4MDYsMHgwYywweDBjLAogICAgIDB4OTQsMHg0OSwweDAxLDB4MGEsMHgwNiwweDBkLDB4MDQsMHgwYSwKQEAgLTkwLDE3ICs5NSwxNyBAQAogICAgIDB4MDAsMHg0MCwweDQ0LDB4MDAsMHhkYiwweDAyLDB4M2IsMHgwMAogICB9LAogICB7Ci0gICAgMHgxZCwweDExLDB4MDYsMHgwOSwweDBiLDB4MGMsMHgwYywweDBjLAorICAgIDB4MzMsMHgwNiwweDA2LDB4MDksMHgwYiwweDBjLDB4MGMsMHgwYywKICAgICAweDk4LDB4MGEsMHgwMSwweDBkLDB4MDYsMHgwZCwweDA0LDB4MGEsCiAgICAgMHgwNiwweDE0LDB4MGQsMHgwNCwweDBhLDB4MDAsMHg4NSwweDNmLAotICAgIDB4MGMsMHg1MCwweGIyLDB4OWYsMHgxNiwweDU5LDB4NGMgLyoweDRmKi8sMHgxMywKKyAgICAweDBjLDB4NTAsMHhiMiwweDlmLDB4MTYsMHg1OSwweDRmLDB4MTMsCiAgICAgMHhhZCwweDExLDB4YWQsMHgxZCwweDQwLDB4OGEsMHgzZCwweGI4LAotICAgIDB4NTEsMHg1ZSwweDYwLDB4NTcgLyoweDQ5Ki8sMHg3YiAvKjB4N2QqLywweDkyLDB4MGYsMHg0MCwKLSAgICAweDYwLDB4ODAsMHgxNCwweDkwLDB4OGMsMHg2MCwweDE0LDB4NGIsCisgICAgMHg1MSwweDVlLDB4NjAsMHg0OSwweDdkLDB4OTIsMHgwZiwweDQwLAorICAgIDB4NjAsMHg4MCwweDE0LDB4OTAsMHg4YywweDYwLDB4MTQsMHg0ZSwKICAgICAweDQzLDB4NDEsMHgxMSwweDAwLDB4ZmMsMHhmZiwweDMyLDB4MDAKICAgfSwKICAgewotI2lmIDEKKyNpZiAwIC8qIE9LLCBidXQgc3RpY2tzIHRvIGxlZnQgZWRnZSAqLwogICAgIDB4MTMsMHgxZCwweGU4LDB4MDksMHgwOSwweGVkLDB4MGMsMHgwYywKICAgICAweDk4LDB4MGEsMHgwMSwweDBjLDB4MDYsMHgwZCwweDA0LDB4MGEsCiAgICAgMHgwNiwweDE0LDB4MGQsMHgwNCwweDBhLDB4MDAsMHg4NSwweDNmLApAQCAtMTEwLDIwICsxMTUsNDIgQEAKICAgICAweDYwLDB4ODAsMHgxNCwweDkwLDB4OGMsMHg2MCwweDE0LDB4MjcsCiAgICAgMHgwMCwweDQwLDB4MTEsMHgwMCwweGZjLDB4ZmYsMHgzMiwweDAwCiAjZW5kaWYKLSNpZiAwCi0gICAgMHgyYSwweDE0LDB4ZTgsMHgwOSwweDA5LDB4ZWQsMHgwYywweDBjLCAgLyogVEVTVCAoMC45MykgLSBCQUQgKi8KKyNpZiAxIC8qIFBlcmZlY3QgKi8KKyAgICAweDIzLDB4MmQsMHhlOCwweDA5LDB4MDksMHhlZCwweDBjLDB4MGMsCiAgICAgMHg5OCwweDBhLDB4MDEsMHgwYywweDA2LDB4MGQsMHgwNCwweDBhLAogICAgIDB4MDYsMHgxNCwweDBkLDB4MDQsMHgwYSwweDAwLDB4ODUsMHgzZiwKLSAgICAweGVkLDB4NTAsMHg3MCwweDllLDB4MTYsMHg1NywweDZjLDB4MTMsCi0gICAgMHgyNywweDBiLDB4MjcsMHhmYiwweDMwLDB4MjcsMHgxNSwweGIwLAotICAgIDB4M2IsMHhkYiwweDYxLDB4MjQsMHg3OCwweDkyLDB4MGYsMHhmZiwKLSAgICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDE0LDB4NmYsCi0gICAgMHgwMCwweDUyLDB4YmIsMHgwMCwweGQ1LDB4ZjcsMHhhMiwweDAwCisgICAgMHhlZCwweDUwLDB4NzAsMHg5ZiwweDE2LDB4NTksMHg2MCwweDEzLAorICAgIDB4MjcsMHgwYiwweDI3LDB4ZmMsMHgzMCwweDI3LDB4MWMsMHhiMCwKKyAgICAweDRiLDB4NGIsMHg2ZiwweDJmLDB4NjMsMHg5MiwweDBmLDB4NDAsCisgICAgMHg2MCwweDgwLDB4MTQsMHg5MCwweDhjLDB4NjAsMHgxNCwweDczLAorICAgIDB4MDAsMHg0MCwweDExLDB4MDAsMHhmYywweGZmLDB4MzIsMHgwMAogI2VuZGlmCiAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfSGlUVkdyb3VwM18xW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfVFZQaGFzZVtdID0KK3sKKwkweDIxLDB4RUQsMHhCQSwweDA4LAkvKiAweDAwIFNpU19OVFNDUGhhc2UgKi8KKwkweDJBLDB4MDUsMHhFMywweDAwLAkvKiAweDAxIFNpU19QQUxQaGFzZSAqLworCTB4MjEsMHhFNCwweDJFLDB4OUIsCS8qIDB4MDIgU2lTX1BBTE1QaGFzZSAqLworCTB4MjEsMHhGNCwweDNFLDB4QkEsCS8qIDB4MDMgU2lTX1BBTE5QaGFzZSAqLworCTB4MUUsMHg4QiwweEEyLDB4QTcsCisJMHgxRSwweDgzLDB4MEEsMHhFMCwJLyogMHgwNSBTaVNfU3BlY2lhbFBoYXNlTSAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDIxLDB4RjAsMHg3QiwweEQ2LAkvKiAweDA4IFNpU19OVFNDUGhhc2UyICovCisJMHgyQSwweDA5LDB4ODYsMHhFOSwJLyogMHgwOSBTaVNfUEFMUGhhc2UyICovCisJMHgyMSwweEU2LDB4RUYsMHhBNCwJLyogMHgwYSBTaVNfUEFMTVBoYXNlMiAqLworCTB4MjEsMHhGNiwweDk0LDB4NDYsCS8qIDB4MGIgU2lTX1BBTE5QaGFzZTIgKi8KKwkweDFFLDB4OEIsMHhBMiwweEE3LAorCTB4MUUsMHg4MywweDBBLDB4RTAsCS8qIDB4MGQgU2lTX1NwZWNpYWxQaGFzZU0gKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgxZSwweDhjLDB4NWMsMHg3YSwJLyogMHgxMCBTaVNfU3BlY2lhbFBoYXNlICovCisJMHgyNSwweGQ0LDB4ZmQsMHg1ZQkvKiAweDExIFNpU19TcGVjaWFsUGhhc2VKICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfSGlUVkdyb3VwM18xW10gPSB7CiAgICAgMHgwMCwgMHgxNCwgMHgxNSwgMHgyNSwgMHg1NSwgMHgxNSwgMHgwYiwgMHgxMywKICAgICAweGIxLCAweDQxLCAweDYyLCAweDYyLCAweGZmLCAweGY0LCAweDQ1LCAweGE2LAogICAgIDB4MjUsIDB4MmYsIDB4NjcsIDB4ZjYsIDB4YmYsIDB4ZmYsIDB4OGUsIDB4MjAsCkBAIC0xMzQsNyArMTYxLDcgQEAKICAgICAweDFhLCAweDFmLCAweDI1LCAweDJhLCAweDRjLCAweGFhLCAweDAxCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX0hpVFZHcm91cDNfMltdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX0hpVFZHcm91cDNfMltdID0gewogICAgIDB4MDAsIDB4MTQsIDB4MTUsIDB4MjUsIDB4NTUsIDB4MTUsIDB4MGIsIDB4N2EsCiAgICAgMHg1NCwgMHg0MSwgMHhlNywgMHhlNywgMHhmZiwgMHhmNCwgMHg0NSwgMHhhNiwKICAgICAweDI1LCAweDJmLCAweDY3LCAweGY2LCAweGJmLCAweGZmLCAweDhlLCAweDIwLApAQCAtMTQ3LDcgKzE3NCw3IEBACiAKIC8qIDMwMUMgLyAzMDJFTFYgZXh0ZW5kZWQgUGFydDIgVFYgcmVnaXN0ZXJzICg0IHRhcCBzY2FsZXIpICovCiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfUGFydDJDTFZYXzFbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19QYXJ0MkNMVlhfMVtdID0gewogICAgIDB4MDAsMHgwMCwKICAgICAweDAwLDB4MjAsMHgwMCwweDAwLDB4N0YsMHgyMCwweDAyLDB4N0YsMHg3RCwweDIwLDB4MDQsMHg3RiwweDdELDB4MUYsMHgwNiwweDdFLAogICAgIDB4N0MsMHgxRCwweDA5LDB4N0UsMHg3QywweDFCLDB4MEIsMHg3RSwweDdDLDB4MTksMHgwRSwweDdELDB4N0MsMHgxNywweDExLDB4N0MsCkBAIC0xNTUsNyArMTgyLDcgQEAKICAgICAweDdFLDB4MDksMHgxRCwweDdDLDB4N0YsMHgwNiwweDFGLDB4N0MsMHg3RiwweDA0LDB4MjAsMHg3RCwweDAwLDB4MDIsMHgyMCwweDdFCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BhcnQyQ0xWWF8yW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfUGFydDJDTFZYXzJbXSA9IHsKICAgICAweDAwLDB4MDAsCiAgICAgMHgwMCwweDIwLDB4MDAsMHgwMCwweDdGLDB4MjAsMHgwMiwweDdGLDB4N0QsMHgyMCwweDA0LDB4N0YsMHg3RCwweDFGLDB4MDYsMHg3RSwKICAgICAweDdDLDB4MUQsMHgwOSwweDdFLDB4N0MsMHgxQiwweDBCLDB4N0UsMHg3QywweDE5LDB4MEUsMHg3RCwweDdDLDB4MTcsMHgxMSwweDdDLApAQCAtMTYzLDcgKzE5MCw3IEBACiAgICAgMHg3RSwweDA5LDB4MUQsMHg3QywweDdGLDB4MDYsMHgxRiwweDdDLDB4N0YsMHgwNCwweDIwLDB4N0QsMHgwMCwweDAyLDB4MjAsMHg3RQogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QYXJ0MkNMVlhfM1tdID0geyAgLyogTlRTQywgNTI1aSwgNTI1cCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX1BhcnQyQ0xWWF8zW10gPSB7ICAvKiBOVFNDLCA1MjVpLCA1MjVwICovCiAgICAgMHhFMCwweDAxLAogICAgIDB4MDQsMHgxQSwweDA0LDB4N0UsMHgwMywweDFBLDB4MDYsMHg3RCwweDAxLDB4MUEsMHgwOCwweDdELDB4MDAsMHgxOSwweDBBLDB4N0QsCiAgICAgMHg3RiwweDE5LDB4MEMsMHg3QywweDdFLDB4MTgsMHgwRSwweDdDLDB4N0UsMHgxNywweDEwLDB4N0IsMHg3RCwweDE1LDB4MTIsMHg3QywKQEAgLTE4Miw3ICsyMDksNyBAQAogICAgIDB4RkYsMHhGRgogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QYXJ0MkNMVlhfNFtdID0geyAgIC8qIFBBTCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTX1BhcnQyQ0xWWF80W10gPSB7ICAgLyogUEFMICovCiAgICAgMHg1OCwweDAyLAogICAgIDB4MDUsMHgxOSwweDA1LDB4N0QsMHgwMywweDE5LDB4MDYsMHg3RSwweDAyLDB4MTksMHgwOCwweDdELDB4MDEsMHgxOCwweDBBLDB4N0QsCiAgICAgMHgwMCwweDE4LDB4MEMsMHg3QywweDdGLDB4MTcsMHgwRSwweDdDLDB4N0UsMHgxNiwweDBGLDB4N0QsMHg3RSwweDE0LDB4MTEsMHg3RCwKQEAgLTIwMSw3ICsyMjgsNyBAQAogICAgIDB4RkYsMHhGRgogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpU19QYXJ0MkNMVlhfNVtdID0geyAgIC8qIDc1MHAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19QYXJ0MkNMVlhfNVtdID0geyAgIC8qIDc1MHAgKi8KICAgICAweDAwLDB4MDMsCiAgICAgMHgwNSwweDE5LDB4MDUsMHg3RCwweDAzLDB4MTksMHgwNiwweDdFLDB4MDIsMHgxOSwweDA4LDB4N0QsMHgwMSwweDE4LDB4MEEsMHg3RCwKICAgICAweDAwLDB4MTgsMHgwQywweDdDLDB4N0YsMHgxNywweDBFLDB4N0MsMHg3RSwweDE2LDB4MEYsMHg3RCwweDdFLDB4MTQsMHgxMSwweDdELApAQCAtMjEwLDcgKzIzNyw3IEBACiAgICAgMHhGRiwweEZGCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1BhcnQyQ0xWWF82W10gPSB7ICAgLyogMTA4MGkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19QYXJ0MkNMVlhfNltdID0geyAgIC8qIDEwODBpICovCiAgICAgMHgwMCwweDA0LAogICAgIDB4MDQsMHgxQSwweDA0LDB4N0UsMHgwMiwweDFCLDB4MDUsMHg3RSwweDAxLDB4MUEsMHgwNywweDdFLDB4MDAsMHgxQSwweDA5LDB4N0QsCiAgICAgMHg3RiwweDE5LDB4MEIsMHg3RCwweDdFLDB4MTgsMHgwRCwweDdELDB4N0QsMHgxNywweDEwLDB4N0MsMHg3RCwweDE1LDB4MTIsMHg3QywKQEAgLTIyMSw3ICsyNDgsNyBAQAogCiAjaWZkZWYgU0lTMzE1SAogLyogNjYxIGV0IGFsIExDRCBkYXRhIHN0cnVjdHVyZSAoMi4wMy4wMCkgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVNfTENEU3RydWN0NjYxW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfTENEU3RydWN0NjYxW10gPSB7CiAgICAgLyogMTAyNHg3NjggKi8KIC8qICB0eXBlfENSMzd8ICAgSERFICAgfCAgIFZERSAgIHwgICAgSFQgICB8ICAgIFZUICAgfCAgIGhzcyAgICB8IGhzZSAgICovCiAgICAgMHgwMiwweEMwLDB4MDAsMHgwNCwweDAwLDB4MDMsMHg0MCwweDA1LDB4MjYsMHgwMywweDEwLDB4MDAsMHg4OCwKQEAgLTI0OSwxMSArMjc2LDIwIEBACiAgICAgLyogMTY4MHgxMDUwICovCiAgICAgMHgwRCwweEUwLDB4OTAsMHgwNiwweDFBLDB4MDQsMHg2QywweDA3LDB4MkEsMHgwNCwweDFBLDB4MDAsMHg0QywKICAgICAweDAwLDB4MDMsMHgwMCwweDA2LDB4MDAsMHg3OSwweEJFLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LAorICAgIC8qIDEyODB4ODAwXzMgKi8KKyAgICAweDBDLDB4RTAsMHgwMCwweDA1LDB4MjAsMHgwMywweEFBLDB4MDUsMHgyRSwweDAzLDB4MzAsMHgwMCwweDUwLAorICAgIDB4MDAsMHgwNCwweDAwLDB4MDMsMHgwMCwweDQ3LDB4QTksMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsCisgICAgLyogODAweDYwMCAqLworICAgIDB4MDEsMHhDMCwweDIwLDB4MDMsMHg1OCwweDAyLDB4MjAsMHgwNCwweDc0LDB4MDIsMHgyQSwweDAwLDB4ODAsCisgICAgMHgwMCwweDA2LDB4MDAsMHgwNCwweDAwLDB4MjgsMHg2MywweDRCLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKyAgICAvKiAxMjgweDg1NCAqLworICAgIDB4MDgsMHhFMCwweDAwLDB4MDUsMHg1NiwweDAzLDB4ODAsMHgwNiwweDVkLDB4MDMsMHgxMCwweDAwLDB4NzAsCisgICAgMHgwMCwweDAxLDB4MDAsMHgwMywweDAwLDB4NTQsMHg3NSwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOAogfTsKICNlbmRpZgogCiAjaWZkZWYgU0lTMzAwCi1zdGF0aWMgVUNIQVIgU2lTMzAwX1RydW1waW9uRGF0YVs3XVs4MF0gPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBTaVMzMDBfVHJ1bXBpb25EYXRhWzE0XVs4MF0gPSB7CiAgIHsgMHgwMiwweDBBLDB4MEEsMHgwMSwweDA0LDB4MDEsMHgwMCwweDAzLDB4MEQsMHgwMCwweDBELDB4MTAsMHg3RiwweDAwLDB4ODAsMHgwMiwKICAgICAweDIwLDB4MDMsMHgwQiwweDAwLDB4OTAsMHgwMSwweEMxLDB4MDEsMHg2MCwweDBDLDB4MzAsMHgxMCwweDAwLDB4MDAsMHgwNCwweDIzLAogICAgIDB4MDAsMHgwMCwweDAzLDB4MjgsMHgwMywweDEwLDB4MDUsMHgwOCwweDQwLDB4MTAsMHgwMCwweDEwLDB4MDQsMHgyMywweDAwLDB4MjMsCkBAIC0yODgsMTE5ICszMjQsMTgyIEBACiAgICAgMHg0MCwweDA1LDB4MTMsMHgwMCwweDAwLDB4MDMsMHgyNiwweDAzLDB4ODgsMHgwQywweDMwLDB4OTAsMHgwMCwweDAwLDB4MDQsMHgyMywKICAgICAweDAwLDB4MDEsMHgwMywweDI0LDB4MDMsMHgyOCwweDA2LDB4MDgsMHg0MCwweDkwLDB4MDAsMHg5MCwweDA0LDB4MjMsMHgwMCwweDIzLAogICAgIDB4MDMsMHgxMSwweDYwLDB4NDAsMHgwNSwweEZGLDB4MEYsMHhGNCwweDE4LDB4MDEsMHgwMCwweDA4LDB4MDEsMHgwMCwweDA4LDB4MDEsCi0gICAgMHgwMCwweDA4LDB4MDEsMHgwMSwweDAyLDB4QjAsMHgwMCwweDAwLDB4MDIsMHhCQSwweEYwLDB4NUIsMHgwMSwweEJFLDB4MDEsMHgwMCB9CisgICAgMHgwMCwweDA4LDB4MDEsMHgwMSwweDAyLDB4QjAsMHgwMCwweDAwLDB4MDIsMHhCQSwweEYwLDB4NUIsMHgwMSwweEJFLDB4MDEsMHgwMCB9LAorICAvKiB2YXJpYW50IDIgKi8KKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDdGLDB4MDAsMHg4MCwweDAyLAorICAgIDB4MjAsMHgwMywweDE1LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDE4LDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg0NCwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxOCwweDAwLDB4MTgsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweEE2LDB4MDEsMHhGRiwweDAzLDB4RkYsMHgxOSwweDAxLDB4MDAsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDQsMHgwQywweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDdGLDB4MDAsMHg4MCwweDAyLAorICAgIDB4MjAsMHgwMywweDE1LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDE4LDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg0NCwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxOCwweDAwLDB4MTgsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweEE2LDB4MDEsMHhGRiwweDAzLDB4RkYsMHgxOSwweDAxLDB4MDAsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDQsMHgwQywweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDhBLDB4MDAsMHhEOCwweDAyLAorICAgIDB4ODQsMHgwMywweDE2LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDFDLDB4MDAsMHgyMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg1MywweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxQywweDAwLDB4MTYsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweERBLDB4MDEsMHhGRiwweDBGLDB4RjQsMHgxOCwweDA3LDB4MDUsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDEsMHgwQiwweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDcyLDB4MDAsMHhEOCwweDAyLAorICAgIDB4ODQsMHgwMywweDE2LDB4MDAsMHg5MCwweDAxLDB4QzEsMHgwMSwweDYwLDB4MEMsMHgzMCwweDFDLDB4MDAsMHgyMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg1MywweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHgxQywweDAwLDB4MTYsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweERBLDB4MDEsMHhGRiwweDBGLDB4RjQsMHgxOCwweDA3LDB4MDUsMHgwNSwweDEzLDB4MDQsMHgwNCwweDA1LAorICAgIDB4MDEsMHgwQiwweDEzLDB4MEEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhGMCwweDU1LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwMiwweDAwLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweDdGLDB4MDAsMHg4MCwweDAyLAorICAgIDB4MjAsMHgwMywweDE2LDB4MDAsMHhFMCwweDAxLDB4MEQsMHgwMiwweDYwLDB4MEMsMHgzMCwweDk4LDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHg0NSwweDAzLDB4NDgsMHgwNiwweDA4LDB4NDAsMHg5OCwweDAwLDB4OTgsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweEY0LDB4MDEsMHhGRiwweDBGLDB4RjQsMHgxOCwweDAxLDB4MDAsMHgwNSwweDAxLDB4MDAsMHgwNSwweDA1LAorICAgIDB4MDQsMHgwQywweDA4LDB4MDUsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhFQSwweDU4LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwMiwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweEJGLDB4MDAsMHgyMCwweDAzLAorICAgIDB4MjAsMHgwNCwweDBELDB4MDAsMHg1OCwweDAyLDB4NzEsMHgwMiwweDgwLDB4MEMsMHgzMCwweDlBLDB4MDAsMHhGQSwweDAzLDB4MUQsCisgICAgMHgwMCwweDAxLDB4MDMsMHgyMiwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHg5OCwweDAwLDB4OTgsMHgwNCwweDFELDB4MDAsMHgxRCwKKyAgICAweDAzLDB4MTEsMHg2MCwweDM5LDB4MDMsMHg0MCwweDA1LDB4RjQsMHgxOCwweDA3LDB4MDIsMHgwNiwweDA0LDB4MDEsMHgwNiwweDBCLAorICAgIDB4MDIsMHgwQSwweDIwLDB4MTksMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhFQSwweDU4LDB4MDEsMHhCRSwweDAxLDB4MDAgfSwKKyAgeyAweDAyLDB4MEEsMHgwQSwweDAxLDB4MDQsMHgwMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MEQsMHgxMCwweEVGLDB4MDAsMHgwMCwweDA0LAorICAgIDB4NDAsMHgwNSwweDEzLDB4MDAsMHgwMCwweDAzLDB4MjYsMHgwMywweDg4LDB4MEMsMHgzMCwweDkwLDB4MDAsMHgwMCwweDA0LDB4MjMsCisgICAgMHgwMCwweDAxLDB4MDMsMHgyNCwweDAzLDB4MjgsMHgwNiwweDA4LDB4NDAsMHg5MCwweDAwLDB4OTAsMHgwNCwweDIzLDB4MDAsMHgyMywKKyAgICAweDAzLDB4MTEsMHg2MCwweDQwLDB4MDUsMHhGRiwweDBGLDB4RjQsMHgxOCwweDAxLDB4MDAsMHgwOCwweDAxLDB4MDAsMHgwOCwweDAxLAorICAgIDB4MDAsMHgwOCwweDAxLDB4MDEsMHgwMiwweEIwLDB4MDAsMHgwMCwweDAyLDB4QkEsMHhFQSwweDU4LDB4MDEsMHhCRSwweDAxLDB4MDAgfQogfTsKICNlbmRpZgogCi12b2lkCVNpU19VbkxvY2tDUlQyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfRW5hYmxlQ1JUMihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLVVTSE9SVAlTaVNfR2V0UmF0ZVB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfV2FpdFJldHJhY2UxKFNpU19Qcml2YXRlICpTaVNfUHIpOwotQk9PTEVBTglTaVNfSXNEdWFsRWRnZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLUJPT0xFQU4JU2lTX0lzVkFNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZAlTaVNfU2V0Q2hyb250ZWxHUElPKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBteXZiaW5mbyk7Ci12b2lkCVNpU19HZXRWQkluZm8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywKLSAgICAgICAgICAgICAgCVVTSE9SVCBNb2RlSWRJbmRleCwgUFNJU19IV19JTkZPIEh3SW5mbywKLQkgICAgICAJaW50IGNoZWNrY3J0Mm1vZGUpOwotdm9pZAlTaVNfU2V0WVBiUHIoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci12b2lkICAgIFNpU19TZXRUVk1vZGUoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXZvaWQJU2lTX0dldExDRFJlc0luZm8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLVVTSE9SVAlTaVNfR2V0VkNMSzJQdHIoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LAotICAgICAgICAgICAgICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotVVNIT1JUCVNpU19HZXRSZXNJbmZvKFNpU19Qcml2YXRlICpTaVNfUHIsVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgpOwotdm9pZAlTaVNfRGlzYWJsZUJyaWRnZShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLUJPT0xFQU4JU2lTX1NldENSVDJHcm91cChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLCBVU0hPUlQgTW9kZU5vKTsKLXZvaWQJU2lTX1NpUzMweEJMT24oU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci12b2lkCVNpU19TaVMzMHhCTE9mZihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKK3ZvaWQJCVNpU19VbkxvY2tDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNpZm5kZWYgU0lTX0xJTlVYX0tFUk5FTAordm9pZAkJU2lTX0xvY2tDUlQyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNlbmRpZgordm9pZAkJU2lTX0VuYWJsZUNSVDIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldFJhdGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpOwordm9pZAkJU2lTX1dhaXRSZXRyYWNlMShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitCT09MRUFOCQlTaVNfSXNEdWFsRWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitCT09MRUFOCQlTaVNfSXNWQU1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwordm9pZAkJU2lTX0dldFZCSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIGludCBjaGVja2NydDJtb2RlKTsKK3ZvaWQJCVNpU19TZXRZUGJQcihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7Cit2b2lkICAgIAlTaVNfU2V0VFZNb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit2b2lkCQlTaVNfR2V0TENEUmVzSW5mbyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0VkNMSzJQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwordW5zaWduZWQgc2hvcnQJU2lTX0dldFJlc0luZm8oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsdW5zaWduZWQgc2hvcnQgTW9kZU5vLHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK3ZvaWQJCVNpU19EaXNhYmxlQnJpZGdlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNpZm5kZWYgU0lTX0xJTlVYX0tFUk5FTAordm9pZAkJU2lTX0VuYWJsZUJyaWRnZShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisjZW5kaWYKK0JPT0xFQU4JCVNpU19TZXRDUlQyR3JvdXAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObyk7Cit2b2lkCQlTaVNfU2lTMzB4QkxPbihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7Cit2b2lkCQlTaVNfU2lTMzB4QkxPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOwogCi12b2lkICAgCVNpU19TZXRDSDcwMHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci1VU0hPUlQgCVNpU19HZXRDSDcwMHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci12b2lkICAgCVNpU19TZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci1VU0hPUlQgCVNpU19HZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCk7Ci12b2lkICAgCVNpU19TZXRDSDcweHhBTkRPUihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGF4LFVTSE9SVCB0ZW1wYmgpOwordm9pZAkJU2lTX1NldENINzAweChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDB4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgpOwordm9pZAkJU2lTX1NldENINzAxeChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCk7Cit1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDF4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgpOworI2lmbmRlZiBTSVNfTElOVVhfS0VSTkVMCit2b2lkCQlTaVNfU2V0Q0g3MHh4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3Vuc2lnbmVkIHNob3J0CVNpU19HZXRDSDcweHgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBheCk7CisjZW5kaWYKK3ZvaWQJCVNpU19TZXRDSDcweHhBTkRPUihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJdW5zaWduZWQgY2hhciBvcnZhbCx1bnNpZ25lZCBzaG9ydCBhbmR2YWwpOwogI2lmZGVmIFNJUzMxNUgKLXN0YXRpYyB2b2lkICAgCVNpU19DaHJvbnRlbDcwMXhPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXN0YXRpYyB2b2lkICAgCVNpU19DaHJvbnRlbDcwMXhPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci1zdGF0aWMgdm9pZCAgIAlTaVNfQ2hyb250ZWxJbml0VFZWU3luYyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXN0YXRpYyB2b2lkICAJU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotdm9pZCAgIAlTaVNfQ2hyb250ZWw3MDF4QkxPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvKTsKLXZvaWQgICAJU2lTX0Nocm9udGVsNzAxeEJMT2ZmKFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHZvaWQJU2lTX0Nocm9udGVsNzAxeE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB2b2lkCVNpU19DaHJvbnRlbDcwMXhPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHZvaWQJU2lTX0Nocm9udGVsSW5pdFRWVlN5bmMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHZvaWQJU2lTX0Nocm9udGVsRG9Tb21ldGhpbmcxKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3ZvaWQJCVNpU19DaHJvbnRlbDcwMXhCTE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3ZvaWQJCVNpU19DaHJvbnRlbDcwMXhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAjZW5kaWYgLyogMzE1ICovCiAKICNpZmRlZiBTSVMzMDAKLSNpZiAwCi1zdGF0aWMgIHZvaWQgICAgU2lTX1NldFRydW1wUmVnKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYngpOwotc3RhdGljICBVU0hPUlQgIFNpU19HZXRUcnVtcFJlZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLSNlbmRpZgotc3RhdGljICBCT09MRUFOCVNpU19TZXRUcnVtcGlvbkJsb2NrKFNpU19Qcml2YXRlICpTaVNfUHIsIFVDSEFSICpkYXRhcHRyKTsKK3N0YXRpYyAgQk9PTEVBTglTaVNfU2V0VHJ1bXBpb25CbG9jayhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciAqZGF0YXB0cik7Cit2b2lkCQlTaVNfU2V0Q2hyb250ZWxHUElPKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBteXZiaW5mbyk7CiAjZW5kaWYKIAotdm9pZCAgICBTaVNfRERDMkRlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBkZWxheXRpbWUpOwotVVNIT1JUICBTaVNfUmVhZEREQzFCaXQoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1VU0hPUlQgIFNpU19IYW5kbGVEREMoU2lTX1ByaXZhdGUgKlNpU19QciwgVUxPTkcgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKLQkJICAgICAgVVNIT1JUIGFkYXB0bnVtLCBVU0hPUlQgRERDZGF0YXR5cGUsIFVDSEFSICpidWZmZXIpOwotI2lmZGVmIExJTlVYX1hGODYKLVVTSE9SVCAgU2lTX1NlbnNlTENERERDKFNpU19Qcml2YXRlICpTaVNfUHIsIFNJU1B0ciBwU2lTKTsKLVVTSE9SVCAgU2lTX1NlbnNlVkdBMkREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNQdHIgcFNpUyk7Ci0jZW5kaWYKK3ZvaWQJCVNpU19EREMyRGVsYXkoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGludCBkZWxheXRpbWUpOwordW5zaWduZWQgc2hvcnQJU2lTX1JlYWREREMxQml0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3Vuc2lnbmVkIHNob3J0CVNpU19IYW5kbGVEREMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgVkdBRW5naW5lLAorCQkJdW5zaWduZWQgc2hvcnQgYWRhcHRudW0sIHVuc2lnbmVkIHNob3J0IEREQ2RhdGF0eXBlLAorCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgVkJGbGFnczIpOwogCi1zdGF0aWMgdm9pZCAgICAJU2lTX1NldFN3aXRjaEREQzIoU2lTX1ByaXZhdGUgKlNpU19Qcik7Ci1zdGF0aWMgVVNIT1JUICAJU2lTX1NldFN0YXJ0KFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19TZXRTdG9wKFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19TZXRTQ0xLTG93KFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19TZXRTQ0xLSGlnaChTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfUmVhZEREQzJEYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYXgpOwotc3RhdGljIFVTSE9SVCAgCVNpU19Xcml0ZUREQzJEYXRhKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCB0ZW1wYXgpOwotc3RhdGljIFVTSE9SVCAgCVNpU19DaGVja0FDSyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfSW5pdEREQ1JlZ3MoU2lTX1ByaXZhdGUgKlNpU19QciwgVUxPTkcgVkJGbGFncywgaW50IFZHQUVuZ2luZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCBhZGFwdG51bSwgVVNIT1JUIEREQ2RhdGF0eXBlLCBCT09MRUFOIGNoZWNrY3IzMik7Ci1zdGF0aWMgVVNIT1JUICAJU2lTX1dyaXRlREFCRERDKFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19QcmVwYXJlUmVhZEREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfUHJlcGFyZUREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyB2b2lkICAgIAlTaVNfU2VuZEFDSyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgeWVzbm8pOwotc3RhdGljIFVTSE9SVCAgCVNpU19Eb1Byb2JlRERDKFNpU19Qcml2YXRlICpTaVNfUHIpOwotc3RhdGljIFVTSE9SVCAgCVNpU19Qcm9iZUREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLXN0YXRpYyBVU0hPUlQgIAlTaVNfUmVhZEREQyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgRERDZGF0YXR5cGUsIFVDSEFSICpidWZmZXIpOwotCi0jaWZkZWYgU0lTMzE1SAotc3RhdGljIHZvaWQgICAgCVNpU19PRU0zMTBTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJSVEkpOwotc3RhdGljIHZvaWQgICAgCVNpU19PRU02NjFTZXR0aW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgVVNIT1JUIFJSVEkpOwotc3RhdGljIHZvaWQgICAgCVNpU19GaW5hbGl6ZUxDRChTaVNfUHJpdmF0ZSAqLCBVU0hPUlQsIFVTSE9SVCwgUFNJU19IV19JTkZPKTsKKyNpZmRlZiBTSVNfWE9SR19YRjg2Cit1bnNpZ25lZCBzaG9ydAkJU2lTX0luaXRERENSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgVkJGbGFncywKKwkJCQlpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBzaG9ydCBhZGFwdG51bSwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJQk9PTEVBTiBjaGVja2NyMzIsIHVuc2lnbmVkIGludCBWQkZsYWdzMik7Cit1bnNpZ25lZCBzaG9ydAkJU2lTX1Byb2JlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3Vuc2lnbmVkIHNob3J0CQlTaVNfUmVhZEREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX0luaXRERENSZWdzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgVkJGbGFncywKKwkJCQlpbnQgVkdBRW5naW5lLCB1bnNpZ25lZCBzaG9ydCBhZGFwdG51bSwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJQk9PTEVBTiBjaGVja2NyMzIsIHVuc2lnbmVkIGludCBWQkZsYWdzMik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX1Byb2JlRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfUmVhZEREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgRERDZGF0YXR5cGUsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKICNlbmRpZgorc3RhdGljIHZvaWQJCVNpU19TZXRTd2l0Y2hEREMyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfU2V0U3RhcnQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHVuc2lnbmVkIHNob3J0CVNpU19TZXRTdG9wKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfU2V0U0NMS0xvdyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX1NldFNDTEtIaWdoKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfUmVhZEREQzJEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfV3JpdGVEREMyRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgdGVtcGF4KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfQ2hlY2tBQ0soc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworc3RhdGljIHVuc2lnbmVkIHNob3J0CVNpU19Xcml0ZURBQkREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJU2lTX1ByZXBhcmVSZWFkRERDKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfUHJlcGFyZUREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CitzdGF0aWMgdm9pZAkJU2lTX1NlbmRBQ0soc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHllc25vKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlTaVNfRG9Qcm9iZUREQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CisKICNpZmRlZiBTSVMzMDAKLXN0YXRpYyB2b2lkICAgIAlTaVNfT0VNMzAwU2V0dGluZyhTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmVGFiaW5kZXgpOwotc3RhdGljIHZvaWQgICAgCVNldE9FTUxDRERhdGEyKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0luZm8sCi0JCSAgICAgICAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZUYWJsZUluZGV4KTsKK3N0YXRpYyB2b2lkCQlTaVNfT0VNMzAwU2V0dGluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZUYWJpbmRleCk7CitzdGF0aWMgdm9pZAkJU2V0T0VNTENERGF0YTIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsCisJCQkJdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCx1bnNpZ25lZCBzaG9ydCBSZWZUYWJsZUluZGV4KTsKKyNlbmRpZgorI2lmZGVmIFNJUzMxNUgKK3N0YXRpYyB2b2lkCQlTaVNfT0VNMzEwU2V0dGluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlTm8sdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJSVEkpOworc3RhdGljIHZvaWQJCVNpU19PRU02NjFTZXR0aW5nKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVObyx1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUlJUSSk7CitzdGF0aWMgdm9pZAkJU2lTX0ZpbmFsaXplTENEKHN0cnVjdCBTaVNfUHJpdmF0ZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOwogI2VuZGlmCiAKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnKFNJU0lPQUREUkVTUywgVVNIT1JULCBVU0hPUlQpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUywgVVNIT1JUKTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnU2hvcnQoU0lTSU9BRERSRVNTLCBVU0hPUlQpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRSZWdMb25nKFNJU0lPQUREUkVTUywgVUxPTkcpOwotZXh0ZXJuIFVDSEFSICAgIFNpU19HZXRSZWcoU0lTSU9BRERSRVNTLCBVU0hPUlQpOwotZXh0ZXJuIFVDSEFSICAgIFNpU19HZXRSZWdCeXRlKFNJU0lPQUREUkVTUyk7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldFJlZ1Nob3J0KFNJU0lPQUREUkVTUyk7Ci1leHRlcm4gVUxPTkcgICAgU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTKTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnQU5ET1IoU0lTSU9BRERSRVNTLCBVU0hPUlQsIFVTSE9SVCwgVVNIT1JUKTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTLCBVU0hPUlQsIFVTSE9SVCk7Ci1leHRlcm4gdm9pZCAgICAgU2lTX1NldFJlZ0FORChTSVNJT0FERFJFU1MsIFVTSE9SVCwgVVNIT1JUKTsKLWV4dGVybiB2b2lkICAgICBTaVNfRGlzcGxheU9mZihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLWV4dGVybiB2b2lkICAgICBTaVNfRGlzcGxheU9uKFNpU19Qcml2YXRlICpTaVNfUHIpOwotZXh0ZXJuIEJPT0xFQU4gIFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByaXZhdGUgKiwgVVNIT1JUICosIFVTSE9SVCAqKTsKLWV4dGVybiBVQ0hBUiAgICBTaVNfR2V0TW9kZVB0cihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgpOwotZXh0ZXJuIFVTSE9SVCAgIFNpU19HZXRDb2xvckRlcHRoKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldE9mZnNldChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgCVVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBTSVNfSFdfSU5GTyBId0luZm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19Mb2FkREFDKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTywgVVNIT1JUIE1vZGVObywKLSAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci1leHRlcm4gdm9pZAlTaVNfQ2FsY0xDREFDUlQxVGltaW5nKFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBNb2RlTm8sIFVTSE9SVCBNb2RlSWRJbmRleCk7Ci0jaWZkZWYgTElOVVhfWEY4NgotZXh0ZXJuIHZvaWQgICAgIFNpU19NYWtlQ2xvY2tSZWdzKFNjcm5JbmZvUHRyIHBTY3JuLCBpbnQgY2xvY2ssIFVDSEFSICpwMmIsIFVDSEFSICpwMmMpOwotZXh0ZXJuIGludCAJU2lTX0ZpbmRQYW5lbEZyb21EQihTSVNQdHIgcFNpUywgVVNIT1JUIHBhbmVsdmVuZG9yLCBVU0hPUlQgcGFuZWxwcm9kdWN0LAotCQkJaW50ICptYXh4LCBpbnQgKm1heHksIGludCAqcHJlZngsIGludCAqcHJlZnkpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWcoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWdCeXRlKFNJU0lPQUREUkVTUywgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWdTaG9ydChTSVNJT0FERFJFU1MsIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0UmVnTG9uZyhTSVNJT0FERFJFU1MsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgY2hhcglTaVNfR2V0UmVnKFNJU0lPQUREUkVTUywgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIJU2lTX0dldFJlZ0J5dGUoU0lTSU9BRERSRVNTKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0UmVnU2hvcnQoU0lTSU9BRERSRVNTKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQJU2lTX0dldFJlZ0xvbmcoU0lTSU9BRERSRVNTKTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0UmVnQU5ET1IoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0UmVnT1IoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRSZWdBTkQoU0lTSU9BRERSRVNTLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQJCVNpU19EaXNwbGF5T2ZmKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiB2b2lkCQlTaVNfRGlzcGxheU9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiBCT09MRUFOCQlTaVNfU2VhcmNoTW9kZUlEKHN0cnVjdCBTaVNfUHJpdmF0ZSAqLCB1bnNpZ25lZCBzaG9ydCAqLCB1bnNpZ25lZCBzaG9ydCAqKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TW9kZUZsYWcoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVQdHIoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRDb2xvckRlcHRoKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0T2Zmc2V0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCk7CitleHRlcm4gdm9pZAkJU2lTX0xvYWREQUMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCk7CitleHRlcm4gdm9pZAkJU2lTX0NhbGNMQ0RBQ1JUMVRpbWluZyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KTsKK2V4dGVybiB2b2lkCQlTaVNfQ2FsY0NSUmVnaXN0ZXJzKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZGVwdGgpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRSZWZDUlRWQ0xLKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCBJbmRleCwgaW50IFVzZVdpZGUpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRSZWZDUlQxQ1JUQyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgSW5kZXgsIGludCBVc2VXaWRlKTsKKyNpZmRlZiBTSVMzMDAKK2V4dGVybiB2b2lkCQlTaVNfR2V0RklGT1RocmVzaG9sZEluZGV4MzAwKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCAqdGVtcGJ4LAorCQkJCXVuc2lnbmVkIHNob3J0ICp0ZW1wY2wpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRGSUZPVGhyZXNob2xkQjMwMCh1bnNpZ25lZCBzaG9ydCB0ZW1wYngsIHVuc2lnbmVkIHNob3J0IHRlbXBjbCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldExhdGVuY3lGYWN0b3I2MzAoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IGluZGV4KTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCitleHRlcm4gdW5zaWduZWQgaW50CXNpc2ZiX3JlYWRfbmJyaWRnZV9wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworZXh0ZXJuIHVuc2lnbmVkIGludAlzaXNmYl9yZWFkX2xwY19wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworI2VuZGlmCiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0ZGVmLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0ZGVmLmgKaW5kZXggNTVhODJkNi4uMjY0YjU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvaW5pdGRlZi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXRkZWYuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIGluaXQuYyBhbmQgaW5pdDMwMS5jCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MywxOSArNTMsMjAgQEAKICNpZm5kZWYgX0lOSVRERUZfCiAjZGVmaW5lIF9JTklUREVGXwogCi0jZGVmaW5lIElTX1NJUzMzMAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU18zMzApCi0jZGVmaW5lIElTX1NJUzU1MAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU181NTApCi0jZGVmaW5lIElTX1NJUzY1MAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU182NTApICAvKiBBbGwgdmVyc2lvbnMsIGluY2wgNjUxLCBNNjV4ICovCi0jZGVmaW5lIElTX1NJUzc0MAkJKEh3SW5mby0+akNoaXBUeXBlID09IFNJU183NDApCisjZGVmaW5lIElTX1NJUzMzMAkJKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzMzMCkKKyNkZWZpbmUgSVNfU0lTNTUwCQkoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNTUwKQorI2RlZmluZSBJU19TSVM2NTAJCShTaVNfUHItPkNoaXBUeXBlID09IFNJU182NTApICAvKiBBbGwgdmVyc2lvbnMsIGluY2wgNjUxLCBNNjV4ICovCisjZGVmaW5lIElTX1NJUzc0MAkJKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzc0MCkKICNkZWZpbmUgSVNfU0lTNjUxCSAgICAgICAgKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgKFNGX0lzNjUxIHwgU0ZfSXM2NTIpKQogI2RlZmluZSBJU19TSVNNNjUwCSAgICAgICAgKFNpU19Qci0+U2lTX1N5c0ZsYWdzICYgKFNGX0lzTTY1MCB8IFNGX0lzTTY1MiB8IFNGX0lzTTY1MykpCiAjZGVmaW5lIElTX1NJUzY1eCAgICAgICAgICAgICAgIChJU19TSVM2NTEgfHwgSVNfU0lTTTY1MCkgICAgICAgLyogT25seSBzcGVjaWFsIHZlcnNpb25zIG9mIDY1eCAqLwotI2RlZmluZSBJU19TSVM2NjEJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjYxKQotI2RlZmluZSBJU19TSVM3NDEJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzQxKQotI2RlZmluZSBJU19TSVM2NjAJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNjYwKQotI2RlZmluZSBJU19TSVM3NjAJCShId0luZm8tPmpDaGlwVHlwZSA9PSBTSVNfNzYwKQotI2RlZmluZSBJU19TSVM2NjE3NDE2NjA3NjAJKElTX1NJUzY2MSB8fCBJU19TSVM3NDEgfHwgSVNfU0lTNjYwIHx8IElTX1NJUzc2MCkKLSNkZWZpbmUgSVNfU0lTNjUwNzQwICAgICAgICAgICAgKChId0luZm8tPmpDaGlwVHlwZSA+PSBTSVNfNjUwKSAmJiAoSHdJbmZvLT5qQ2hpcFR5cGUgPCBTSVNfMzMwKSkKKyNkZWZpbmUgSVNfU0lTNjYxCQkoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNjYxKQorI2RlZmluZSBJU19TSVM3NDEJCShTaVNfUHItPkNoaXBUeXBlID09IFNJU183NDEpCisjZGVmaW5lIElTX1NJUzY2MAkJKFNpU19Qci0+Q2hpcFR5cGUgPT0gU0lTXzY2MCkKKyNkZWZpbmUgSVNfU0lTNzYwCQkoU2lTX1ByLT5DaGlwVHlwZSA9PSBTSVNfNzYwKQorI2RlZmluZSBJU19TSVM3NjEJCShTaVNfUHItPkNoaXBUeXBlID09IFNJU183NjEpCisjZGVmaW5lIElTX1NJUzY2MTc0MTY2MDc2MAkoSVNfU0lTNjYxIHx8IElTX1NJUzc0MSB8fCBJU19TSVM2NjAgfHwgSVNfU0lTNzYwIHx8IElTX1NJUzc2MSkKKyNkZWZpbmUgSVNfU0lTNjUwNzQwICAgICAgICAgICAgKChTaVNfUHItPkNoaXBUeXBlID49IFNJU182NTApICYmIChTaVNfUHItPkNoaXBUeXBlIDwgU0lTXzMzMCkpCiAjZGVmaW5lIElTX1NJUzU1MDY1MDc0MCAgICAgICAgIChJU19TSVM1NTAgfHwgSVNfU0lTNjUwNzQwKQogI2RlZmluZSBJU19TSVM2NTA3NDA2NjAgICAgICAgICAoSVNfU0lTNjUwIHx8IElTX1NJUzc0MCB8fCBJU19TSVM2NjE3NDE2NjA3NjApCiAjZGVmaW5lIElTX1NJUzU1MDY1MDc0MDY2MCAgICAgIChJU19TSVM1NTAgfHwgSVNfU0lTNjUwNzQwNjYwKQpAQCAtNzMsMjQgKzc0LDM3IEBACiAjZGVmaW5lIFNJU0dFVFJPTVcoeCkJCShST01BZGRyWyh4KV0gfCAoUk9NQWRkclsoeCkrMV0gPDwgOCkpCiAKIC8qIFNpU19WQlR5cGUgKi8KLSNkZWZpbmUgVkJfU0lTMzAxCSAgICAgIAkweDAwMDEKLSNkZWZpbmUgVkJfU0lTMzAxQiAgICAgICAgCTB4MDAwMgotI2RlZmluZSBWQl9TSVMzMDJCICAgICAgICAJMHgwMDA0Ci0jZGVmaW5lIFZCX1NJUzMwMUxWICAgICAJMHgwMDA4Ci0jZGVmaW5lIFZCX1NJUzMwMkxWICAgICAJMHgwMDEwCisjZGVmaW5lIFZCX1NJUzMwMQkJMHgwMDAxCisjZGVmaW5lIFZCX1NJUzMwMUIJCTB4MDAwMgorI2RlZmluZSBWQl9TSVMzMDJCCQkweDAwMDQKKyNkZWZpbmUgVkJfU0lTMzAxTFYJCTB4MDAwOAorI2RlZmluZSBWQl9TSVMzMDJMVgkJMHgwMDEwCiAjZGVmaW5lIFZCX1NJUzMwMkVMVgkJMHgwMDIwCi0jZGVmaW5lIFZCX1NJUzMwMUMgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBWQl9TSVMzMDFDCQkweDAwNDAKKyNkZWZpbmUgVkJfU0lTMzA3VAkJMHgwMDgwCisjZGVmaW5lIFZCX1NJUzMwN0xWCQkweDAxMDAKICNkZWZpbmUgVkJfVU1DCQkJMHg0MDAwCiAjZGVmaW5lIFZCX05vTENEICAgICAgICAJMHg4MDAwCi0jZGVmaW5lIFZCX1NJUzMwMUJMVjMwMkJMViAgICAgIChWQl9TSVMzMDFCfFZCX1NJUzMwMUN8VkJfU0lTMzAyQnxWQl9TSVMzMDFMVnxWQl9TSVMzMDJMVnxWQl9TSVMzMDJFTFYpCi0jZGVmaW5lIFZCX1NJUzMwMUIzMDJCICAgICAgICAgIChWQl9TSVMzMDFCfFZCX1NJUzMwMUN8VkJfU0lTMzAyQikKLSNkZWZpbmUgVkJfU0lTMzAxTFYzMDJMViAgICAgICAgKFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTVkIJCShWQl9TSVMzMDEgfCBWQl9TSVMzMDFCTFYzMDJCTFYpCi0jZGVmaW5lIFZCX1NJU1RNRFMJCShWQl9TSVMzMDEgfCBWQl9TSVMzMDFCMzAyQikKLSNkZWZpbmUgVkJfU0lTTFZEUwkJVkJfU0lTMzAxTFYzMDJMVgotI2RlZmluZSBWQl9TSVNMQ0RBCQkoVkJfU0lTMzAyQnxWQl9TSVMzMDFDfFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTWVBCUFIJCShWQl9TSVMzMDFDfFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1NJUzMwMkVMVikKLSNkZWZpbmUgVkJfU0lTSElWSVNJT04JCShWQl9TSVMzMDF8VkJfU0lTMzAxQnxWQl9TSVMzMDJCKQorI2RlZmluZSBWQl9TSVMzMHhCCQkoVkJfU0lTMzAxQiB8IFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJCIHwgVkJfU0lTMzA3VCkKKyNkZWZpbmUgVkJfU0lTMzB4QwkJKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDdUKQorI2RlZmluZSBWQl9TSVNUTURTCQkoVkJfU0lTMzAxIHwgVkJfU0lTMzAxQiB8IFZCX1NJUzMwMUMgfCBWQl9TSVMzMDJCIHwgVkJfU0lTMzA3VCkKKyNkZWZpbmUgVkJfU0lTTFZEUwkJKFZCX1NJUzMwMUxWIHwgVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTMzB4QkxWCQkoVkJfU0lTMzB4QiB8IFZCX1NJU0xWRFMpCisjZGVmaW5lIFZCX1NJUzMweENMVgkJKFZCX1NJUzMweEMgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTVkIJCShWQl9TSVMzMDEgfCBWQl9TSVMzMHhCTFYpCisjZGVmaW5lIFZCX1NJU0xDREEJCShWQl9TSVMzMDJCIHwgVkJfU0lTMzAxQyAgfCBWQl9TSVMzMDdUICB8IFZCX1NJU0xWRFMpCisjZGVmaW5lIFZCX1NJU1RNRFNMQ0RBCQkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QpCisjZGVmaW5lIFZCX1NJU1BBUlQ0U0NBTEVSCShWQl9TSVMzMDFDIHwgVkJfU0lTMzA3VCB8IFZCX1NJUzMwMkVMViB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNISVZJU0lPTgkJKFZCX1NJUzMwMSB8IFZCX1NJUzMwMUIgfCBWQl9TSVMzMDJCKQorI2RlZmluZSBWQl9TSVNZUEJQUgkJKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDdUICB8IFZCX1NJUzMwMUxWIHwgVkJfU0lTMzAyTFYgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTVEFQNFNDQUxFUgkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QgfCBWQl9TSVMzMDJFTFYgfCBWQl9TSVMzMDdMVikKKyNkZWZpbmUgVkJfU0lTUEFSVDRPVkVSRkxPVwkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMViB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNQV0QJCShWQl9TSVMzMDFDIHwgVkJfU0lTMzA3VCB8IFZCX1NJU0xWRFMpCisjZGVmaW5lIFZCX1NJU0VNSQkJKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWIHwgVkJfU0lTMzA3TFYpCisjZGVmaW5lIFZCX1NJU1BPV0VSCQkoVkJfU0lTMzAxQyB8IFZCX1NJUzMwN1QgfCBWQl9TSVMzMDJMViB8IFZCX1NJUzMwMkVMViB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNEVUFMTElOSwkJKFZCX1NJUzMwMkxWIHwgVkJfU0lTMzAyRUxWIHwgVkJfU0lTMzA3VCB8IFZCX1NJUzMwN0xWKQorI2RlZmluZSBWQl9TSVNWR0EyCQlWQl9TSVNUTURTCisjZGVmaW5lIFZCX1NJU1JBTURBQzIwMgkJKFZCX1NJUzMwMUMgfCBWQl9TSVMzMDdUKQogCiAvKiBWQkluZm8gKi8KICNkZWZpbmUgU2V0U2ltdVNjYW5Nb2RlICAgICAgICAgMHgwMDAxICAgLyogQ1IgMzAgKi8KQEAgLTE2MCw2ICsxNzQsNyBAQAogI2RlZmluZSBTdXBwb3J0UkFNREFDMl8yMDIgICAgICAweDA0MDAgIC8qIEMgICAgICAgICAgICAgKDw9IDIwMk1oeikgKi8KICNkZWZpbmUgSW50ZXJsYWNlTW9kZSAgICAgICAgICAgMHgwMDgwCiAjZGVmaW5lIFN5bmNQUCAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBIYXZlV2lkZVRpbWluZwkJMHgyMDAwCS8qIEhhdmUgc3BlY2lmaWMgd2lkZS0gYW5kIG5vbi13aWRlIHRpbWluZyAqLwogI2RlZmluZSBTeW5jUE4gICAgICAgICAgICAgICAgICAweDQwMDAKICNkZWZpbmUgU3luY05QICAgICAgICAgICAgICAgICAgMHg4MDAwCiAjZGVmaW5lIFN5bmNOTiAgICAgICAgICAgICAgICAgIDB4YzAwMApAQCAtMTg4LDYgKzIwMyw3IEBACiAjZGVmaW5lIFRWU2V0VFZTaW11TW9kZQkJMHgwMjAwIC8qIG5ldyAweDIwMCwgcHJldi4gMHg4MDAgKi8KICNkZWZpbmUgVFZSUExMRElWMlhPCQkweDA0MDAgLyogcHJldiAweDEwMDAgKi8KICNkZWZpbmUgVFZTZXROVFNDMTAyNAkJMHgwODAwIC8qIG5ldyAweDEwMCwgcHJldi4gMHgyMDAwICovCisjZGVmaW5lIFRWU2V0NTI1cDEwMjQJCTB4MTAwMCAvKiBUVyAqLwogI2RlZmluZSBUVkFzcGVjdDQzCQkweDIwMDAKICNkZWZpbmUgVFZBc3BlY3QxNjkJCTB4NDAwMAogI2RlZmluZSBUVkFzcGVjdDQzTEIJCTB4ODAwMApAQCAtMjA4LDcgKzIyNCw4IEBACiAjZGVmaW5lIFNGX0lzTTY2MQkJMHgwMDIwCiAjZGVmaW5lIFNGX0lzTTc0MQkJMHgwMDQwCiAjZGVmaW5lIFNGX0lzTTc2MAkJMHgwMDgwCi0jZGVmaW5lIFNGXzc2MExGQgkJMHg4MDAwICAvKiA3NjA6IFdlIGhhdmUgTEZCICovCisjZGVmaW5lIFNGXzc2MFVNQQkJMHg0MDAwICAvKiA3Nng6IFdlIGhhdmUgVU1BICovCisjZGVmaW5lIFNGXzc2MExGQgkJMHg4MDAwICAvKiA3Nng6IFdlIGhhdmUgTEZCICovCiAKIC8qIENSMzIgKE5ld2VyIDYzMCwgYW5kIDMxNSBzZXJpZXMpCiAKQEAgLTIyOCwyNSArMjQ1LDE5IEBACiAjZGVmaW5lIFRWT3ZlclNjYW5TaGlmdCAgICAgICAgIDQKIAogLyogQ1IzNSAoNjYxIHNlcmllcyBvbmx5KQotCiAgICBbMF0gICAgMSA9IFBBTCwgMCA9IE5UU0MKICAgIFsxXSAgICAxID0gTlRTQy1KIChpZiBEMCA9IDApCiAgICBbMl0gICAgMSA9IFBBTE0gKGlmIEQwID0gMSkKICAgIFszXSAgICAxID0gUEFMTiAoaWYgRDAgPSAxKQogICAgWzRdICAgIDEgPSBPdmVyc2NhbiAoQ2hyb250ZWwgb25seSkKICAgIFs3OjVdICAob25seSBpZiBEMiBpbiBDUjM4IGlzIHNldCkKLSAgICAgICAgICAwMDAgIDUyNWkKLSAJICAwMDEgIDUyNXAKKwkgIDAwMCAgNTI1aQorCSAgMDAxICA1MjVwCiAJICAwMTAgIDc1MHAKIAkgIDAxMSAgMTA4MGkgKG9yIEhpVmlzaW9uIG9uIDMwMSwgMzAxQikKLQotICAgVGhlc2UgYml0cyBhcmUgYmVpbmcgdHJhbnNsYXRlZCB0byBUVk1vZGUgZmxhZy4KLQogKi8KIAotLyoKLSAgIENSMzcKLQorLyogQ1IzNwogICAgWzBdICAgU2V0IDI0LzE4IGJpdCAoMC8xKSBSR0IgdG8gTFZEUy9UTURTIHRyYW5zbWl0dGVyIChzZXQgYnkgQklPUykKICAgIFszOjFdIEV4dGVybmFsIGNoaXAKICAgICAgICAgIDMwMCBzZXJpZXM6CkBAIC0yNjAsNyArMjcxLDcgQEAKIAkgICAgMDEwICAgTFZEUwogCSAgICAwMTEgICBMVkRTICsgQ2hyb250ZWwgNzAxOQogCSAgNjYwIHNlcmllcyBbMjoxXSBvbmx5OgotCSAgICAgcmVzZXJ2ZWQgKG5vdyBpbiBDUjM4KQorCSAgICAgcmVzZXJ2ZWQgKGNoaXAgdHlwZSBub3cgaW4gQ1IzOCkKIAkgIEFsbCBvdGhlciBjb21iaW5hdGlvbnMgcmVzZXJ2ZWQKICAgIFszXSAgICA2NjEgb25seTogUGFzcyAxOjEgZGF0YQogICAgWzRdICAgIExWRFM6IDA6IFBhbmVsIExpbmsgZXhwYW5kcyAvIDE6IFBhbmVsIExpbmsgZG9lcyBub3QgZXhwYW5kCkBAIC0zMjAsNiArMzMxLDcgQEAKICNkZWZpbmUgRW5hYmxlMzAyTFZfRHVhbExpbmsgICAgMHgwNCAgIC8qIDMwMkxWIG9ubHk7IGVuYWJsZSBkdWFsIGxpbmsgKi8KIAogLyogQ1IzOSAoNjYxIGFuZCBsYXRlcikKKyAgIERbN10gICBMVkRTIChTaVMgb3IgdGhpcmQgcGFydHkpCiAgICBEWzE6MF0gWVBiUHIgQXNwZWN0IFJhdGlvCiAgICAgICAgICAgMDAgNDozIGxldHRlcmJveAogCSAgMDEgNDozCkBAIC0zNDEsNyArMzUzLDcgQEAKIAkgMDEwMSBTZXQgQ29udHJhc3QgZXZlbnQKIAkgMDExMCBTZXQgTXV0ZSBldmVudAogCSAwMTExIFNldCBWb2x1bWUgVXAvRG93biBldmVudAotICAgWzRdICAgRW5hYmxlIEJhY2tsaWdodCBDb250cm9sIGJ5IEJJT1MvZHJpdmVyIAorICAgWzRdICAgRW5hYmxlIEJhY2tsaWdodCBDb250cm9sIGJ5IEJJT1MvZHJpdmVyCiAgICAgICAgICAoc2V0IGJ5IGRyaXZlcjsgc2V0IG1lYW5zIHRoYXQgdGhlIEJJT1Mgc2hvdWxkCiAJIG5vdCB0b3VjaCB0aGUgYmFja2xpZ2h0IHJlZ2lzdGVycyBiZWNhdXNlIGVnLgogCSB0aGUgZHJpdmVyIGFscmVhZHkgc3dpdGNoZWQgb2ZmIHRoZSBiYWNrbGlnaHQpCkBAIC0zNTAsNiArMzYyLDI2IEBACiAgICBbN10gICBUViBVbmRlclNjYW4vT3ZlclNjYW4gKHNldCBieSBCSU9TKQogKi8KIAorLyogQ1I3QyAtIDY2MSBhbmQgbGF0ZXIKKyAgIFs3XSAgIER1YWxFZGdlIGVuYWJsZWQgKG9yOiB0byBiZSBlbmFibGVkKQorICAgWzZdICAgQ1JUMiA9IFRWL0xDRC9WR0EgZW5hYmxlZCAob3I6IHRvIGJlIGVuYWJsZWQpCisgICBbNV0gICBJbml0IGRvbmUgKHNldCBhdCBlbmQgb2YgU2lTX0luaXQpCisgICB7NF0gICBMVkRTIExDRCBjYXBhYmlsaXRpZXMKKyAgIFszXSAgIExWRFMgTENEIGNhcGFiaWxpdGllcworICAgWzJdICAgTFZEUyBMQ0QgY2FwYWJpbGl0aWVzIChQV0QpCisgICBbMV0gICBMVkRTIExDRCBjYXBhYmlsaXRpZXMgKFBXRCkKKyAgIFswXSAgIExWRFM9MSwgVE1EUz0wIChTaVMgb3IgdGhpcmQgcGFydHkpCisqLworCisvKiBDUjdFIC0gNjYxIGFuZCBsYXRlcgorICAgVkJUeXBlOgorICAgWzddIExWRFMgKHRoaXJkIHBhcnR5KQorICAgWzNdIDMwMUMKKyAgIFsyXSAzMDJMVgorICAgWzFdIDMwMUxWCisgICBbMF0gMzAxQgorKi8KKwogLyogTENEUmVzSW5mbyAqLwogI2RlZmluZSBQYW5lbDMwMF84MDB4NjAwICAgICAgICAweDAxCS8qIENSMzYgKi8KICNkZWZpbmUgUGFuZWwzMDBfMTAyNHg3NjggICAgICAgMHgwMgpAQCAtMzU5LDcgKzM5MSw2IEBACiAjZGVmaW5lIFBhbmVsMzAwXzEwMjR4NjAwICAgICAgIDB4MDYKICNkZWZpbmUgUGFuZWwzMDBfMTE1Mng3NjggICAgICAgMHgwNwogI2RlZmluZSBQYW5lbDMwMF8xMjgweDc2OCAgICAgICAweDBhCi0jZGVmaW5lIFBhbmVsMzAwXzMyMHg0ODAgICAgICAgIDB4MGUgCS8qIGZzdG4gLSBUaGlzIGlzIGZha2UsIGNhbiBiZSBhbnkgKi8KICNkZWZpbmUgUGFuZWwzMDBfQ3VzdG9tCQkweDBmCiAjZGVmaW5lIFBhbmVsMzAwX0JhcmNvMTM2NiAgICAgIDB4MTAKIApAQCAtMzc0LDkgKzQwNSw5IEBACiAjZGVmaW5lIFBhbmVsMzEwXzE0MDB4MTA1MCAgICAgIDB4MDkKICNkZWZpbmUgUGFuZWwzMTBfMTI4MHg3NjggICAgICAgMHgwYQogI2RlZmluZSBQYW5lbDMxMF8xNjAweDEyMDAgICAgICAweDBiCi0jZGVmaW5lIFBhbmVsMzEwXzY0MHg0ODBfMiAgICAgIDB4MGMKLSNkZWZpbmUgUGFuZWwzMTBfNjQweDQ4MF8zICAgICAgMHgwZAotI2RlZmluZSBQYW5lbDMxMF8zMjB4NDgwICAgICAgICAweDBlICAgIC8qIGZzdG4gLSBUVzogVGhpcyBpcyBmYWtlLCBjYW4gYmUgYW55ICovCisjZGVmaW5lIFBhbmVsMzEwXzMyMHgyNDBfMiAgICAgIDB4MGMgICAgLyogeFNUTiAqLworI2RlZmluZSBQYW5lbDMxMF8zMjB4MjQwXzMgICAgICAweDBkICAgIC8qIHhTVE4gKi8KKyNkZWZpbmUgUGFuZWwzMTBfMzIweDI0MF8xICAgICAgMHgwZSAgICAvKiB4U1ROIC0gVGhpcyBpcyBmYWtlLCBjYW4gYmUgYW55ICovCiAjZGVmaW5lIFBhbmVsMzEwX0N1c3RvbQkJMHgwZgogCiAjZGVmaW5lIFBhbmVsNjYxXzgwMHg2MDAgICAgICAgIDB4MDEKQEAgLTM4Niw3ICs0MTcsNyBAQAogI2RlZmluZSBQYW5lbDY2MV8xMDI0eDYwMCAgICAgICAweDA1CiAjZGVmaW5lIFBhbmVsNjYxXzExNTJ4ODY0ICAgICAgIDB4MDYKICNkZWZpbmUgUGFuZWw2NjFfMTI4MHg5NjAgICAgICAgMHgwNwotI2RlZmluZSBQYW5lbDY2MV8xMTUyeDc2OCAgICAgICAweDA4CisjZGVmaW5lIFBhbmVsNjYxXzEyODB4ODU0ICAgICAgIDB4MDgKICNkZWZpbmUgUGFuZWw2NjFfMTQwMHgxMDUwICAgICAgMHgwOQogI2RlZmluZSBQYW5lbDY2MV8xMjgweDc2OCAgICAgICAweDBhCiAjZGVmaW5lIFBhbmVsNjYxXzE2MDB4MTIwMCAgICAgIDB4MGIKQEAgLTQxMCwxNCArNDQxLDE2IEBACiAjZGVmaW5lIFBhbmVsXzE2ODB4MTA1MCAgICAgICAgIDB4MGQgICAgLyogNjYxZXRjICAqLwogI2RlZmluZSBQYW5lbF8xMjgweDcyMAkJMHgwZSAgICAvKiA2NjFldGMgICovCiAjZGVmaW5lIFBhbmVsX0N1c3RvbQkJMHgwZgkvKiBNVVNUIEJFIDB4MGYgKGZvciBEVkkgRERDIGRldGVjdGlvbikgKi8KLSNkZWZpbmUgUGFuZWxfMzIweDQ4MCAgICAgICAgICAgMHgxMCAgICAvKiBTaVMgNTUwIGZzdG4gLSBUVzogVGhpcyBpcyBmYWtlLCBjYW4gYmUgYW55ICovCisjZGVmaW5lIFBhbmVsXzMyMHgyNDBfMSAgICAgICAgIDB4MTAgICAgLyogU2lTIDU1MCB4U1ROICovCiAjZGVmaW5lIFBhbmVsX0JhcmNvMTM2NiAgICAgICAgIDB4MTEKICNkZWZpbmUgUGFuZWxfODQ4eDQ4MAkJMHgxMgotI2RlZmluZSBQYW5lbF82NDB4NDgwXzIJCTB4MTMgICAgLyogU2lTIDU1MCAqLwotI2RlZmluZSBQYW5lbF82NDB4NDgwXzMJCTB4MTQgICAgLyogU2lTIDU1MCAqLworI2RlZmluZSBQYW5lbF8zMjB4MjQwXzIJCTB4MTMgICAgLyogU2lTIDU1MCB4U1ROICovCisjZGVmaW5lIFBhbmVsXzMyMHgyNDBfMwkJMHgxNCAgICAvKiBTaVMgNTUwIHhTVE4gKi8KICNkZWZpbmUgUGFuZWxfMTI4MHg3NjhfMiAgICAgICAgMHgxNQkvKiAzMHhMViAqLwogI2RlZmluZSBQYW5lbF8xMjgweDc2OF8zICAgICAgICAweDE2ICAgIC8qICh1bnVzZWQpICovCiAjZGVmaW5lIFBhbmVsXzEyODB4ODAwXzIJMHgxNyAgICAvKiAzMHhMViAqLworI2RlZmluZSBQYW5lbF84NTZ4NDgwCQkweDE4CisjZGVmaW5lIFBhbmVsXzEyODB4ODU0CQkweDE5CS8qIDY2MWV0YyAqLwogCiAvKiBJbmRleCBpbiBNb2RlUmVzSW5mbyB0YWJsZSAqLwogI2RlZmluZSBTSVNfUklfMzIweDIwMCAgICAwCkBAIC00NTQsNiArNDg3LDcgQEAKICNkZWZpbmUgU0lTX1JJXzE5MjB4MTA4MCAzMQogI2RlZmluZSBTSVNfUklfOTYweDU0MCAgIDMyCiAjZGVmaW5lIFNJU19SSV85NjB4NjAwICAgMzMKKyNkZWZpbmUgU0lTX1JJXzEyODB4ODU0ICAzNAogCiAvKiBDUjVGICovCiAjZGVmaW5lIElzTTY1MCAgICAgICAgICAgICAgICAgIDB4ODAKQEAgLTQ4MiwxNiArNTE2LDE4IEBACiAjZGVmaW5lIFZDTEsxMDBfMzAwICAgICAgICAgICAgIDB4NDMgICAvKiBJbmRleCBpbiBWQ0xLRGF0YSB0YWJsZSAoMzAwKSAqLwogI2RlZmluZSBWQ0xLMzRfMzAwICAgICAgICAgICAgICAweDNkICAgLyogSW5kZXggaW4gVkNMS0RhdGEgdGFibGUgKDMwMCkgKi8KICNkZWZpbmUgVkNMS19DVVNUT01fMzAwCQkweDQ3Ci0jZGVmaW5lIFZDTEs2NV8zMTUgICAgICAgICAgICAgIDB4MGIgICAvKiBJbmRleCBpbiAoVkIpVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KLSNkZWZpbmUgVkNMSzEwOF8yXzMxNSAgICAgICAgICAgMHgxOSAgIC8qIEluZGV4IGluIChWQilWQ0xLRGF0YSB0YWJsZSAoMzE1KSAqLwotI2RlZmluZSBWQ0xLODFfMzE1CQkweDViICAgLyogSW5kZXggaW4gKFZCKVZDTEtEYXRhIHRhYmxlICgzMTUpICovCi0jZGVmaW5lIFZDTEsxNjJfMzE1ICAgICAgICAgICAgIDB4NWUgICAvKiBJbmRleCBpbiAoVkIpVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KLSNkZWZpbmUgVkNMSzEwOF8zXzMxNSAgICAgICAgICAgMHg0NSAgIC8qIEluZGV4IGluIFZCVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KLSNkZWZpbmUgVkNMSzEwMF8zMTUgICAgICAgICAgICAgMHg0NiAgIC8qIEluZGV4IGluIFZCVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KKworI2RlZmluZSBWQ0xLNjVfMzE1ICAgICAgICAgICAgICAweDBiICAgLyogSW5kaWNlcyBpbiAoVkIpVkNMS0RhdGEgdGFibGUgKDMxNSkgKi8KKyNkZWZpbmUgVkNMSzEwOF8yXzMxNSAgICAgICAgICAgMHgxOQorI2RlZmluZSBWQ0xLODFfMzE1CQkweDViCisjZGVmaW5lIFZDTEsxNjJfMzE1ICAgICAgICAgICAgIDB4NWUKKyNkZWZpbmUgVkNMSzEwOF8zXzMxNSAgICAgICAgICAgMHg0NQorI2RlZmluZSBWQ0xLMTAwXzMxNSAgICAgICAgICAgICAweDQ2CiAjZGVmaW5lIFZDTEszNF8zMTUgICAgICAgICAgICAgIDB4NTUKICNkZWZpbmUgVkNMSzY4XzMxNQkJMHgwZAotI2RlZmluZSBWQ0xLXzEyODB4ODAwXzMxNV8yCTB4NWMgICAvKiBJbmRleCBpbiBWQlZDTEtEYXRhIHRhYmxlICgzMTUpICovCi0jZGVmaW5lIFZDTEsxMjFfMzE1CQkweDVkICAgLyogSW5kZXggaW4gVkJWQ0xLRGF0YSB0YWJsZSAoMzE1KSAqLworI2RlZmluZSBWQ0xLXzEyODB4ODAwXzMxNV8yCTB4NWMKKyNkZWZpbmUgVkNMSzEyMV8zMTUJCTB4NWQKKyNkZWZpbmUgVkNMSzEzMF8zMTUJCTB4NzIKICNkZWZpbmUgVkNMS18xMjgweDcyMAkJMHg1ZgogI2RlZmluZSBWQ0xLXzEyODB4NzY4XzIJCTB4NjAKICNkZWZpbmUgVkNMS18xMjgweDc2OF8zCQkweDYxICAgLyogKHVudXNlZD8pICovCkBAIC01MDcsNiArNTQzLDcgQEAKICNkZWZpbmUgVkNMS18xMTUyeDg2NAkJMHg2NAogI2RlZmluZSBWQ0xLXzEzNjB4NzY4CQkweDU4CiAjZGVmaW5lIFZDTEtfMTI4MHg4MDBfMzE1CTB4NmMKKyNkZWZpbmUgVkNMS18xMjgweDg1NAkJMHg3NgogCiAjZGVmaW5lIFRWQ0xLQkFTRV8zMDAJCTB4MjEgICAvKiBJbmRpY2VzIG9uIFRWIGNsb2NrcyBpbiBWQ0xLRGF0YSB0YWJsZSAoMzAwKSAqLwogI2RlZmluZSBUVkNMS0JBU0VfMzE1CSAgICAgICAgMHgzYSAgIC8qIEluZGljZXMgb24gVFYgY2xvY2tzIGluIChWQilWQ0xLRGF0YSB0YWJsZSAoMzE1KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvaW5pdGV4dGxmYi5jIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdGV4dGxmYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODU2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0ZXh0bGZiLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBTaVMgMzAwLzU0MC82MzBbU10vNzMwW1NdCisgKiBTaVMgMzE1W0V8UFJPXS81NTAvW01dNjV4L1tNXTY2eFtGfE18R11YL1tNXTc0eFtHWF0vMzMwL1tNXTc2eFtHWF0KKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNworICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PSAyLjQuMTQgYW5kID49Mi42LjMKKyAqCisgKiBMaW51eCBrZXJuZWwgc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBpbml0LmMvaW5pdDMwMS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgbmFtZWQgTGljZW5zZSwKKyAqIG9yIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIEF1dGhvcjoJVGhvbWFzIFdpbmlzY2hob2ZlciA8dGhvbWFzQHdpbmlzY2hob2Zlci5uZXQ+CisgKi8KKworI2luY2x1ZGUgIm9zZGVmLmgiCisjaW5jbHVkZSAiaW5pdGRlZi5oIgorI2luY2x1ZGUgInZnYXR5cGVzLmgiCisjaW5jbHVkZSAidnN0cnVjdC5oIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2ludAkJc2lzZmJfbW9kZV9yYXRlX3RvX2RjbG9jayhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwKKwkJCXVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCk7CitpbnQJCXNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciBtb2Rlbm8sCisJCQl1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOworI2VuZGlmCitCT09MRUFOCQlzaXNmYl9nZXR0b3RhbGZyb21tb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyIG1vZGVubywKKwkJCWludCAqaHRvdGFsLCBpbnQgKnZ0b3RhbCwgdW5zaWduZWQgY2hhciByYXRlaW5kZXgpOworCitleHRlcm4gQk9PTEVBTglTaVNJbml0UHRyKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiBCT09MRUFOCVNpU19TZWFyY2hNb2RlSUQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0ICpNb2RlTm8sCisJCQl1bnNpZ25lZCBzaG9ydCAqTW9kZUlkSW5kZXgpOworZXh0ZXJuIHZvaWQJU2lTX0dlbmVyaWNfQ29udmVydENSRGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciAqY3JkYXRhLAorCQkJaW50IHhyZXMsIGludCB5cmVzLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgQk9PTEVBTiB3cml0ZXJlcyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCitpbnQKK3Npc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgbW9kZW5vLAorCQkJdW5zaWduZWQgY2hhciByYXRlaW5kZXgpCit7CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vID0gbW9kZW5vOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4ID0gMCwgQ2xvY2tJbmRleCA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgUlJUSSA9IDA7CisgICAgaW50IENsb2NrOworCisgICAgaWYoIVNpU0luaXRQdHIoU2lTX1ByKSkgcmV0dXJuIDY1MDAwOworCisgICAgaWYocmF0ZWluZGV4ID4gMCkgcmF0ZWluZGV4LS07CisKKyNpZmRlZiBTSVMzMTVICisgICAgc3dpdGNoKE1vZGVObykgeworICAgIGNhc2UgMHg1YTogTW9kZU5vID0gMHg1MDsgYnJlYWs7CisgICAgY2FzZSAweDViOiBNb2RlTm8gPSAweDU2OworICAgIH0KKyNlbmRpZgorCisgICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHs7CisgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBtb2RlICV4XG4iLCBNb2RlTm8pOworICAgICAgIHJldHVybiA2NTAwMDsKKyAgICB9CisKKyAgICBSUlRJID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5SRUZpbmRleDsKKworICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZyAmIEhhdmVXaWRlVGltaW5nKSB7CisgICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlV2lkZSA9PSAxKSB7CisJICAvKiBXaWRlIHNjcmVlbjogSWdub3JlIHJhdGVpbmRleCAqLworCSAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlRWQ0xLX1dJREU7CisgICAgICAgfSBlbHNlIHsKKwkgIFJSVEkgKz0gcmF0ZWluZGV4OworCSAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlRWQ0xLX05PUk07CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgUlJUSSArPSByYXRlaW5kZXg7CisgICAgICAgQ2xvY2tJbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlRWQ0xLOworICAgIH0KKworICAgIENsb2NrID0gU2lTX1ByLT5TaVNfVkNMS0RhdGFbQ2xvY2tJbmRleF0uQ0xPQ0sgKiAxMDAwOworCisgICAgcmV0dXJuIENsb2NrOworfQorCitpbnQKK3Npc2ZiX21vZGVfcmF0ZV90b19kZGF0YShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgY2hhciBtb2Rlbm8sCisJCQl1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vID0gbW9kZW5vOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4ID0gMCwgaW5kZXggPSAwLCBSUlRJID0gMDsKKyAgICBpbnQgICAgICAgICAgICBqOworCisgICAgaWYoIVNpU0luaXRQdHIoU2lTX1ByKSkgcmV0dXJuIDA7CisKKyAgICBpZihyYXRlaW5kZXggPiAwKSByYXRlaW5kZXgtLTsKKworI2lmZGVmIFNJUzMxNUgKKyAgICBzd2l0Y2goTW9kZU5vKSB7CisgICAgICAgY2FzZSAweDVhOiBNb2RlTm8gPSAweDUwOyBicmVhazsKKyAgICAgICBjYXNlIDB4NWI6IE1vZGVObyA9IDB4NTY7CisgICAgfQorI2VuZGlmCisKKyAgICBpZighKFNpU19TZWFyY2hNb2RlSUQoU2lTX1ByLCAmTW9kZU5vLCAmTW9kZUlkSW5kZXgpKSkgcmV0dXJuIDA7CisKKyAgICBSUlRJID0gU2lTX1ByLT5TaVNfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5SRUZpbmRleDsKKyAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfSW5mb0ZsYWcgJiBIYXZlV2lkZVRpbWluZykgeworICAgICAgIGlmKFNpU19Qci0+U2lTX1VzZVdpZGUgPT0gMSkgeworCSAgLyogV2lkZSBzY3JlZW46IElnbm9yZSByYXRlaW5kZXggKi8KKwkgIGluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDX1dJREU7CisgICAgICAgfSBlbHNlIHsKKwkgIFJSVEkgKz0gcmF0ZWluZGV4OworCSAgaW5kZXggPSBTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfQ1JUMUNSVENfTk9STTsKKyAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICBSUlRJICs9IHJhdGVpbmRleDsKKyAgICAgICBpbmRleCA9IFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9DUlQxQ1JUQzsKKyAgICB9CisKKyAgICBTaVNfR2VuZXJpY19Db252ZXJ0Q1JEYXRhKFNpU19QciwKKwkJCSh1bnNpZ25lZCBjaGFyICopJlNpU19Qci0+U2lTX0NSVDFUYWJsZVtpbmRleF0uQ1JbMF0sCisJCQlTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5YUmVzLAorCQkJU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uWVJlcywKKwkJCXZhciwgRkFMU0UpOworCisgICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnICYgMHg4MDAwKQorICAgICAgIHZhci0+c3luYyAmPSB+RkJfU1lOQ19WRVJUX0hJR0hfQUNUOworICAgIGVsc2UKKyAgICAgICB2YXItPnN5bmMgfD0gRkJfU1lOQ19WRVJUX0hJR0hfQUNUOworCisgICAgaWYoU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0luZm9GbGFnICYgMHg0MDAwKQorICAgICAgIHZhci0+c3luYyAmPSB+RkJfU1lOQ19IT1JfSElHSF9BQ1Q7CisgICAgZWxzZQorICAgICAgIHZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKKworICAgIHZhci0+dm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZyAmIDB4MDA4MCkKKyAgICAgICB2YXItPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKKyAgICBlbHNlIHsKKyAgICAgICBqID0gMDsKKyAgICAgICB3aGlsZShTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCAhPSAweGZmKSB7CisJICBpZihTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbal0uRXh0X01vZGVJRCA9PQorCSAgICAgICAgICAgICAgICAgIFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLk1vZGVJRCkgeworCSAgICAgIGlmKFNpU19Qci0+U2lTX0VNb2RlSURUYWJsZVtqXS5FeHRfTW9kZUZsYWcgJiBEb3VibGVTY2FuTW9kZSkgeworCSAgICAgIAkgIHZhci0+dm1vZGUgPSBGQl9WTU9ERV9ET1VCTEU7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgfQorCSAgaisrOworICAgICAgIH0KKyAgICB9CisKKyAgICBpZigodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKKyNpZiAwICAvKiBEbyB0aGlzPyAqLworICAgICAgIHZhci0+dXBwZXJfbWFyZ2luIDw8PSAxOworICAgICAgIHZhci0+bG93ZXJfbWFyZ2luIDw8PSAxOworICAgICAgIHZhci0+dnN5bmNfbGVuIDw8PSAxOworI2VuZGlmCisgICAgfSBlbHNlIGlmKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7CisgICAgICAgdmFyLT51cHBlcl9tYXJnaW4gPj49IDE7CisgICAgICAgdmFyLT5sb3dlcl9tYXJnaW4gPj49IDE7CisgICAgICAgdmFyLT52c3luY19sZW4gPj49IDE7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogTGludXggPj0gMi41ICovCisKK0JPT0xFQU4KK3Npc2ZiX2dldHRvdGFsZnJvbW1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCBpbnQgKmh0b3RhbCwKKwkJCWludCAqdnRvdGFsLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8gPSBtb2Rlbm87CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXggPSAwLCBDUlQxSW5kZXggPSAwOworICAgIHVuc2lnbmVkIHNob3J0IFJSVEkgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgIHNyX2RhdGEsIGNyX2RhdGEsIGNyX2RhdGEyOworCisgICAgaWYoIVNpU0luaXRQdHIoU2lTX1ByKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYocmF0ZWluZGV4ID4gMCkgcmF0ZWluZGV4LS07CisKKyNpZmRlZiBTSVMzMTVICisgICAgc3dpdGNoKE1vZGVObykgeworICAgICAgIGNhc2UgMHg1YTogTW9kZU5vID0gMHg1MDsgYnJlYWs7CisgICAgICAgY2FzZSAweDViOiBNb2RlTm8gPSAweDU2OworICAgIH0KKyNlbmRpZgorCisgICAgaWYoIShTaVNfU2VhcmNoTW9kZUlEKFNpU19QciwgJk1vZGVObywgJk1vZGVJZEluZGV4KSkpIHJldHVybiBGQUxTRTsKKworICAgIFJSVEkgPSBTaVNfUHItPlNpU19FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlJFRmluZGV4OworICAgIGlmKFNpU19Qci0+U2lTX1JlZkluZGV4W1JSVEldLkV4dF9JbmZvRmxhZyAmIEhhdmVXaWRlVGltaW5nKSB7CisgICAgICAgaWYoU2lTX1ByLT5TaVNfVXNlV2lkZSA9PSAxKSB7CisJICAvKiBXaWRlIHNjcmVlbjogSWdub3JlIHJhdGVpbmRleCAqLworCSAgQ1JUMUluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDX1dJREU7CisgICAgICAgfSBlbHNlIHsKKwkgIFJSVEkgKz0gcmF0ZWluZGV4OworCSAgQ1JUMUluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDX05PUk07CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgUlJUSSArPSByYXRlaW5kZXg7CisgICAgICAgQ1JUMUluZGV4ID0gU2lTX1ByLT5TaVNfUmVmSW5kZXhbUlJUSV0uRXh0X0NSVDFDUlRDOworICAgIH0KKworICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxNF07CisgICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzBdOworICAgICpodG90YWwgPSAoKChjcl9kYXRhICYgMHhmZikgfCAoKHVuc2lnbmVkIHNob3J0KSAoc3JfZGF0YSAmIDB4MDMpIDw8IDgpKSArIDUpICogODsKKworICAgIHNyX2RhdGEgPSBTaVNfUHItPlNpU19DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxM107CisgICAgY3JfZGF0YSA9IFNpU19Qci0+U2lTX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzZdOworICAgIGNyX2RhdGEyID0gU2lTX1ByLT5TaVNfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbN107CisgICAgKnZ0b3RhbCA9ICgoY3JfZGF0YSAmIDB4RkYpIHwKKwkgICAgICAgKCh1bnNpZ25lZCBzaG9ydCkoY3JfZGF0YTIgJiAweDAxKSA8PCAgOCkgfAorCSAgICAgICAoKHVuc2lnbmVkIHNob3J0KShjcl9kYXRhMiAmIDB4MjApIDw8ICA0KSB8CisJICAgICAgICgodW5zaWduZWQgc2hvcnQpKHNyX2RhdGEgICYgMHgwMSkgPDwgMTApKSArIDI7CisKKyAgICBpZihTaVNfUHItPlNpU19SZWZJbmRleFtSUlRJXS5FeHRfSW5mb0ZsYWcgJiBJbnRlcmxhY2VNb2RlKQorICAgICAgICp2dG90YWwgKj0gMjsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvb2VtMzAwLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMDAuaAppbmRleCBiMTM1OGI3Li5iNzNmMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMDAuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMDAuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBPRU0gRGF0YSBmb3IgMzAwIHNlcmllcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtNTAsNyArNTAsNyBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTVRWRGVsYXkzMDFbOF1bNF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX09FTVRWRGVsYXkzMDFbOF1bNF0gPQogewogCXsweDA4LDB4MDgsMHgwOCwweDA4fSwKIAl7MHgwOCwweDA4LDB4MDgsMHgwOH0sCkBAIC02Miw3ICs2Miw3IEBACiAJezB4MjAsMHgyMCwweDIwLDB4MjB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTVRWRGVsYXlMVkRTWzhdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9PRU1UVkRlbGF5TFZEU1s4XVs0XSA9CiB7CiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LAogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKQEAgLTc0LDcgKzc0LDcgQEAKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfT0VNVFZGbGlja2VyWzhdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9PRU1UVkZsaWNrZXJbOF1bNF0gPQogewogCXsweDAwLDB4MDAsMHgwMCwweDAwfSwKIAl7MHgwMCwweDAwLDB4MDAsMHgwMH0sCkBAIC04NiwyNSArODYsNyBAQAogCXsweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotI2lmIDAgICAvKiBUVzogTm90IHVzZWQgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfT0VNTENERGVsYXkxWzEyXVs0XT17Ci0JezB4MmMsMHgyYywweDJjLDB4MmN9LAotCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKLQl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCi0JezB4MmMsMHgyYywweDJjLDB4MmN9LAotCXsweDJjLDB4MmMsMHgyYywweDJjfSwKLQl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCi0JezB4MjAsMHgyMCwweDIwLDB4MjB9LAotCXsweDI0LDB4MjQsMHgyNCwweDI0fSwKLQl7MHgyNCwweDI0LDB4MjQsMHgyNH0sCi0JezB4MjAsMHgyMCwweDIwLDB4MjB9LAotCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKLQl7MHgyNCwweDI0LDB4MjQsMHgyNH0KLX07Ci0jZW5kaWYKLQotLyogRnJvbSA2MzAvMzAxQiBCSU9TICovCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTUxDRERlbGF5Mls2NF1bNF0gPQkJIC8qIGZvciAzMDEvMzAxYi8zMDJiLzMwMUxWLzMwMkxWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfT0VNTENERGVsYXkyWzY0XVs0XSA9CQkgLyogZm9yIDMwMS8zMDFiLzMwMmIvMzAxTFYvMzAyTFYgKi8KIHsKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LApAQCAtMTcyLDggKzE1NCw3IEBACiAJezB4MjAsMHgyMCwweDIwLDB4MjB9CiB9OwogCi0vKiBGcm9tIDMwMC8zMDFMViBCSU9TICovCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTUxDRERlbGF5NFsxMl1bNF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX09FTUxDRERlbGF5NFsxMl1bNF0gPQogewogCXsweDJjLDB4MmMsMHgyYywweDJjfSwKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCkBAIC0xODksOCArMTcwLDcgQEAKIAl7MHgyNCwweDI0LDB4MjQsMHgyNH0KIH07CiAKLS8qIEZyb20gMzAwLzMwMUxWIEJJT1MgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfT0VNTENERGVsYXk1WzMyXVs0XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfT0VNTENERGVsYXk1WzMyXVs0XSA9CiB7CiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LAogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKQEAgLTIyNiw4ICsyMDYsOCBAQAogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKIH07CiAKLS8qIEFkZGVkIGZvciBMVkRTICovCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX09FTUxDRERlbGF5M1s2NF1bNF0gPSB7CS8qIEZvciBMVkRTICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfT0VNTENERGVsYXkzWzY0XVs0XSA9CQkvKiBGb3IgTFZEUyAqLworewogCXsweDIwLDB4MjAsMHgyMCwweDIwfSwKIAl7MHgyMCwweDIwLDB4MjAsMHgyMH0sCiAJezB4MjAsMHgyMCwweDIwLDB4MjB9LApAQCAtMjk0LDcgKzI3NCw3IEBACiAJezB4MjAsMHgyMCwweDIwLDB4MjB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX1BoYXNlMVs4XVs1XVs0XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfUGhhc2UxWzhdWzVdWzRdID0KIHsKICAgICB7CiAJezB4MjEsMHhlZCwweDAwLDB4MDh9LApAQCAtMzU0LDExICszMzQsMTAgQEAKICAgICB9CiB9OwogCi0KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfUGhhc2UyWzhdWzVdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMwMF9QaGFzZTJbOF1bNV1bNF0gPQogewogICAgIHsKLSAgICAgICAgezB4MjEsMHhlZCwweDAwLDB4MDh9LAorCXsweDIxLDB4ZWQsMHgwMCwweDA4fSwKIAl7MHgyMSwweGVkLDB4OGEsMHgwOH0sCiAJezB4MjEsMHhlZCwweDhhLDB4MDh9LAogCXsweDIxLDB4ZWQsMHg4YSwweDA4fSwKQEAgLTM3Miw0MiArMzUxLDQyIEBACiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDIxLDB4ZWQsMHgwMCwweDA4fSwKKwl7MHgyMSwweGVkLDB4MDAsMHgwOH0sCiAJezB4MjEsMHhlZCwweDhhLDB4MDh9LAogCXsweDIxLDB4ZWQsMHg4YSwweDA4fSwKIAl7MHgyMSwweGVkLDB4OGEsMHgwOH0sCiAJezB4MjEsMHhlZCwweDhhLDB4MDh9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9CiAgICAgfSwKICAgICB7Ci0gICAgICAgIHsweDJhLDB4MDUsMHhkMywweDAwfSwKKwl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZDMsMHgwMH0sCkBAIC00MTUsNyArMzk0LDcgQEAKICAgICB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzAwX0ZpbHRlcjFbMTBdWzE2XVs0XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMDBfRmlsdGVyMVsxMF1bMTZdWzRdID0KIHsKICAgICB7CiAJezB4MDAsMHhmNCwweDEwLDB4Mzh9LApAQCAtNTk5LDcgKzU3OCw3IEBACiAgICAgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMDBfRmlsdGVyMlsxMF1bOV1bN10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzAwX0ZpbHRlcjJbMTBdWzldWzddID0KIHsKICAgICB7CiAJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LApAQCAtNzE0LDE0MiArNjkzLDE0NCBAQAogfTsKIAogLyogQ3VzdG9tIGRhdGEgZm9yIEJhcmNvIGlRIFBybyBSMzAwICovCi1zdGF0aWMgY29uc3QgVUNIQVIgYmFyY29fcDFbMl1bOV1bN11bM10gPSB7Ci0gICAgewotCXsgIHsgMHgxNiwgMHhjZiwgMHgwMCB9LAotCSAgIHsgMHgxOCwgMHgwMCwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlNywgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgxOSwgMHgwMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDE4LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDFlLCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDE2LCAweDAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MjYsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7IDB4MWUsIDB4MTksIDB4MDAgfSwKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0sCi0JewotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDI2LCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDFlLCAweDAwIH0sCi0JICAgeyAgICAwLCAgICAwLCAgICAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4ZDEsIDB4MDAgfSwKLQkgICB7IDB4MTgsIDB4MDAsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MTEsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7IDB4MWUsIDB4MjYsIDB4MDAgfQotCX0sCi0JewotCSAgIHsgMHgxNiwgMHhkMSwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlNywgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgzMCwgMHgwMCB9LAotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDE3LCAweGEwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGEwLCAweDAwIH0sCi0JICAgeyAweDFiLCAweDJhLCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAgICAwLCAgICAwLCAgICAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4MDAsIDB4MDAgfSwKLQkgICB7IDB4MTcsIDB4YWEsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4YTAsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MmEsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0KLSAgICB9LAotICAgIHsKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDE4LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDI2LCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDE5LCAweDAwIH0KLQl9LAotCXsKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0sCi0JewotCSAgIHsgMHgxNiwgMHhjZiwgMHgwMCB9LAotCSAgIHsgMHgxOCwgMHgwMCwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlNywgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgxOSwgMHgwMCB9LAotCX0sCi0JewotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAweDE2LCAweGNmLCAweDAwIH0sCi0JICAgeyAweDE4LCAweDAwLCAweDAwIH0sCi0JICAgeyAweDFhLCAweGU3LCAweDAwIH0sCi0JICAgeyAweDFiLCAweDI2LCAweDAwIH0sCi0JICAgeyAweDFjLCAweGZmLCAweDAwIH0sCi0JICAgeyAweDFkLCAweDFjLCAweDAwIH0sCi0JICAgeyAweDFlLCAweDFlLCAweDAwIH0KLQl9LAotCXsKLQkgICB7IDB4MTYsIDB4ZDEsIDB4MDAgfSwKLQkgICB7IDB4MTgsIDB4MDAsIDB4MDAgfSwKLQkgICB7IDB4MWEsIDB4ZTYsIDB4MDAgfSwKLQkgICB7IDB4MWIsIDB4MTEsIDB4MDAgfSwKLQkgICB7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKLQkgICB7IDB4MWQsIDB4MWMsIDB4MDAgfSwKLQkgICB7IDB4MWUsIDB4MjYsIDB4MDAgfQotCX0sCi0JewotCSAgIHsgMHgxOCwgMHgwMCwgMHgwMCB9LAotCSAgIHsgMHgxYSwgMHhlMCwgMHgwMCB9LAotCSAgIHsgMHgxYiwgMHgyNiwgMHgwMCB9LAotCSAgIHsgMHgxYywgMHhmZiwgMHgwMCB9LAotCSAgIHsgMHgxZCwgMHgxYywgMHgwMCB9LAotCSAgIHsgMHgxZSwgMHgzMCwgMHgwMCB9LAotCSAgIHsgICAgMCwgICAgMCwgICAgMCB9Ci0JfSwKLQl7Ci0JICAgeyAgICAwLCAgICAwLCAgICAwIH0KLQl9LAotCXsKLQkgICB7ICAgIDAsICAgIDAsICAgIDAgfQotCX0KLSAgICB9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiYXJjb19wMVsyXVs5XVs3XVszXSA9Cit7CisgIHsKKyAgICAgeworCXsgMHgxNiwgMHhjZiwgMHgwMCB9LAorCXsgMHgxOCwgMHgwMCwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgxOSwgMHgwMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKKwl7IDB4MTgsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MWUsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MTYsIDB4MDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE2LCAweGNmLCAweDAwIH0sCisJeyAweDFhLCAweGU3LCAweDAwIH0sCisJeyAweDFiLCAweDI2LCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAweDFlLCAweDE5LCAweDAwIH0sCisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgICAgMCwgICAgMCwgICAgMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MjYsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MWUsIDB4MDAgfSwKKwl7ICAgIDAsICAgIDAsICAgIDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE2LCAweGQxLCAweDAwIH0sCisJeyAweDE4LCAweDAwLCAweDAwIH0sCisJeyAweDFhLCAweGU3LCAweDAwIH0sCisJeyAweDFiLCAweDExLCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAweDFlLCAweDI2LCAweDAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgMHgxNiwgMHhkMSwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgzMCwgMHgwMCB9LAorCXsgICAgMCwgICAgMCwgICAgMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MTcsIDB4YTAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4YTAsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MmEsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7ICAgIDAsICAgIDAsICAgIDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE2LCAweDAwLCAweDAwIH0sCisJeyAweDE3LCAweGFhLCAweDAwIH0sCisJeyAweDFhLCAweGEwLCAweDAwIH0sCisJeyAweDFiLCAweDJhLCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfQorICB9LAorICB7CisgICAgIHsKKwl7IDB4MTYsIDB4Y2YsIDB4MDAgfSwKKwl7IDB4MTgsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTcsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MjYsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MTksIDB4MDAgfQorICAgICB9LAorICAgICB7CisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgMHgxNiwgMHhjZiwgMHgwMCB9LAorCXsgMHgxOCwgMHgwMCwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgxOSwgMHgwMCB9LAorICAgICB9LAorICAgICB7CisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgMHgxNiwgMHhjZiwgMHgwMCB9LAorCXsgMHgxOCwgMHgwMCwgMHgwMCB9LAorCXsgMHgxYSwgMHhlNywgMHgwMCB9LAorCXsgMHgxYiwgMHgyNiwgMHgwMCB9LAorCXsgMHgxYywgMHhmZiwgMHgwMCB9LAorCXsgMHgxZCwgMHgxYywgMHgwMCB9LAorCXsgMHgxZSwgMHgxZSwgMHgwMCB9CisgICAgIH0sCisgICAgIHsKKwl7IDB4MTYsIDB4ZDEsIDB4MDAgfSwKKwl7IDB4MTgsIDB4MDAsIDB4MDAgfSwKKwl7IDB4MWEsIDB4ZTYsIDB4MDAgfSwKKwl7IDB4MWIsIDB4MTEsIDB4MDAgfSwKKwl7IDB4MWMsIDB4ZmYsIDB4MDAgfSwKKwl7IDB4MWQsIDB4MWMsIDB4MDAgfSwKKwl7IDB4MWUsIDB4MjYsIDB4MDAgfQorICAgICB9LAorICAgICB7CisJeyAweDE4LCAweDAwLCAweDAwIH0sCisJeyAweDFhLCAweGUwLCAweDAwIH0sCisJeyAweDFiLCAweDI2LCAweDAwIH0sCisJeyAweDFjLCAweGZmLCAweDAwIH0sCisJeyAweDFkLCAweDFjLCAweDAwIH0sCisJeyAweDFlLCAweDMwLCAweDAwIH0sCisJeyAgICAwLCAgICAwLCAgICAwIH0KKyAgICAgfSwKKyAgICAgeworCXsgICAgMCwgICAgMCwgICAgMCB9CisgICAgIH0sCisgICAgIHsKKwl7ICAgIDAsICAgIDAsICAgIDAgfQorICAgICB9CisgIH0KIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvb2VtMzEwLmggYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMTAuaAppbmRleCAyYjdkYjkxLi44ZmNlNTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMTAuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9vZW0zMTAuaApAQCAtMSw5ICsxLDkgQEAKIC8qICRYRnJlZTg2JCAqLwogLyogJFhkb3RPcmckICovCiAvKgotICogT0VNIERhdGEgZm9yIDMxNS8zMzAgc2VyaWVzCisgKiBPRU0gRGF0YSBmb3IgMzE1LzMzMC8zNDAgc2VyaWVzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKICAqCiAgKiBJZiBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoZSBmb2xsb3dpbmcgbGljZW5zZSB0ZXJtcwogICogYXBwbHk6CkBAIC01MCwyMDYgKzUwLDIwNiBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzMwMVtdID0JICAgIAkJLyogMzAxICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fMzAxW10gPQkgICAgCQkvKiAzMDEgKi8KIHsKLQkJIDB4MDAsMHgwMCwweDAwLCAgICAvKiAgIDgwMHg2MDAgKi8KLQkJIDB4MGIsMHgwYiwweDBiLCAgICAvKiAgMTAyNHg3NjggKi8KLQkJIDB4MDgsMHgwOCwweDA4LCAgICAvKiAxMjgweDEwMjQgKi8KLQkJIDB4MDAsMHgwMCwweDAwLCAgICAvKiAgIDY0MHg0ODAgKHVua25vd24pICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLwotCQkgMHgwMCwweDAwLDB4MDAsICAgIC8qICAxMTUyeDg2NCAodW5rbm93bikgKi8KLQkJIDB4MDgsMHgwOCwweDA4LCAgICAvKiAgMTI4MHg5NjAgKGd1ZXNzZWQpICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLwotCQkgMHgwOCwweDA4LDB4MDgsICAgIC8qIDE0MDB4MTA1MCAqLwotCQkgMHgwOCwweDA4LDB4MDgsICAgIC8qICAxMjgweDc2OCAgKGd1ZXNzZWQpICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogMTYwMHgxMjAwICovCi0JCSAweDAwLDB4MDAsMHgwMCwgICAgLyogICAzMjB4NDgwICh1bmtub3duKSAqLwotCQkgMHgwMCwweDAwLDB4MDAsCi0JCSAweDAwLDB4MDAsMHgwMCwKLQkJIDB4MDAsMHgwMCwweDAwCisJMHgwMCwweDAwLDB4MDAsICAgIC8qICAgODAweDYwMCAqLworCTB4MGIsMHgwYiwweDBiLCAgICAvKiAgMTAyNHg3NjggKi8KKwkweDA4LDB4MDgsMHgwOCwgICAgLyogMTI4MHgxMDI0ICovCisJMHgwMCwweDAwLDB4MDAsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KKwkweDAwLDB4MDAsMHgwMCwgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLworCTB4MDAsMHgwMCwweDAwLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCisJMHgwOCwweDA4LDB4MDgsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDAwLDB4MDAsMHgwMCwgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLworCTB4MDgsMHgwOCwweDA4LCAgICAvKiAxNDAweDEwNTAgKi8KKwkweDA4LDB4MDgsMHgwOCwgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KKwkweDAwLDB4MDAsMHgwMCwgICAgLyogMTYwMHgxMjAwICovCisJMHgwMCwweDAwLDB4MDAsICAgIC8qICAgMzIweDQ4MCAodW5rbm93bikgKi8KKwkweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMAogfTsKIAogLyogVGhpcyBpcyBjb250YWluZWQgaW4gNjUwKzMwMUIgQklPU2VzLCBidXQgaXQgaXMgd3JvbmcgLSBzbyB3ZSBkb24ndCB1c2UgaXQgKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUwMzAxTFZbXSA9CSAgIAkvKiA2NTAgKyAzMHhMViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzY1MDMwMUxWW10gPQkgICAJLyogNjUwICsgMzB4TFYgKi8KIHsKLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgIDgwMHg2MDAgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTAyNHg3NjggKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAxMjgweDEwMjQgKi8KLSAgICAgICAgICAgICAgICAgMHgwMSwweDAxLDB4MDEsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTAyNHg2MDAgKHVua25vd24pICovCi0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogIDExNTJ4ODY0ICh1bmtub3duKSAqLwotCQkgMHgwMSwweDAxLDB4MDEsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTE1Mng3NjggKHVua25vd24pICovCi0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogMTQwMHgxMDUwICovCi0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAxNjAweDEyMDAgKi8KLQkJIDB4MDIsMHgwMiwweDAyLAotCQkgMHgwMiwweDAyLDB4MDIsCi0JCSAweDAyLDB4MDIsMHgwMiwKLQkJIDB4MDIsMHgwMiwweDAyCisJMHgwMSwweDAxLDB4MDEsICAgIC8qICAgODAweDYwMCAqLworCTB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTAyNHg3NjggKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogMTI4MHgxMDI0ICovCisJMHgwMSwweDAxLDB4MDEsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLworCTB4MDEsMHgwMSwweDAxLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCisJMHgwMSwweDAxLDB4MDEsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLworCTB4MDEsMHgwMSwweDAxLCAgICAvKiAxNDAweDEwNTAgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KKwkweDAxLDB4MDEsMHgwMSwgICAgLyogMTYwMHgxMjAwICovCisJMHgwMiwweDAyLDB4MDIsCisJMHgwMiwweDAyLDB4MDIsCisJMHgwMiwweDAyLDB4MDIsCisJMHgwMiwweDAyLDB4MDIKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUxMzAxTFZbXSA9CSAgCS8qIE02NTAvNjUxIDMwMUxWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUxMzAxTFZbXSA9CSAgCS8qIE02NTAvNjUxIDMwMUxWICovCiB7Ci0gICAgICAgICAgICAgICAgIDB4MzMsMHgzMywweDMzLCAgICAvKiAgIDgwMHg2MDAgKGd1ZXNzZWQpIC0gbmV3OiBQYW5lbFR5cGUsIG5vdCBQYW5lbFJlcyAhICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDEwMjR4NzY4ICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogMTI4MHgxMDI0ICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogICA2NDB4NDgwICh1bmtub3duKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMDI0eDYwMCAodW5rbm93bikgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDEyODB4OTYwIChndWVzc2VkKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMTUyeDc2OCAodW5rbm93bikgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAxNDAweDEwNTAgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTI4MHg3NjggIChndWVzc2VkKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qIDE2MDB4MTIwMCAqLwotCQkgMHgzMywweDMzLDB4MzMsCi0JCSAweDMzLDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMywweDMzLAotCQkgMHgzMywweDMzLDB4MzMKKwkweDMzLDB4MzMsMHgzMywgICAgLyogICA4MDB4NjAwIChndWVzc2VkKSAtIG5ldzogUGFuZWxUeXBlLCBub3QgUGFuZWxSZXMgISAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTAyNHg3NjggKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogMTI4MHgxMDI0ICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAgNjQweDQ4MCAodW5rbm93bikgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTE1Mng4NjQgKHVua25vd24pICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAxNDAweDEwNTAgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDEyODB4NzY4ICAoZ3Vlc3NlZCkgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogMTYwMHgxMjAwICovCisJMHgzMywweDMzLDB4MzMsCisJMHgzMywweDMzLDB4MzMsCisJMHgzMywweDMzLDB4MzMsCisJMHgzMywweDMzLDB4MzMKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fNjUxMzAyTFZbXSA9CSAgIAkvKiBNNjUwLzY1MSAzMDJMViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzY1MTMwMkxWW10gPQkgICAJLyogTTY1MC82NTEgMzAyTFYgKi8KIHsKLSAgICAgICAgICAgICAgICAgMHgzMywweDMzLDB4MzMsICAgIC8qICAgODAweDYwMCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTAyNHg3NjggKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAxMjgweDEwMjQgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgIDY0MHg0ODAgKHVua25vd24pICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDEwMjR4NjAwICh1bmtub3duKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMTUyeDg2NCAodW5rbm93bikgKi8KLQkJIDB4MzMsMHgzMywweDMzLCAgICAvKiAgMTI4MHg5NjAgKGd1ZXNzZWQpICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogIDExNTJ4NzY4ICh1bmtub3duKSAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qIDE0MDB4MTA1MCAqLwotCQkgMHgzMywweDMzLDB4MzMsICAgIC8qICAxMjgweDc2OCAgKGd1ZXNzZWQpICovCi0JCSAweDMzLDB4MzMsMHgzMywgICAgLyogMTYwMHgxMjAwICovCi0JCSAweDMzLDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMywweDMzLAotCQkgMHgzMywweDMzLDB4MzMsCi0JCSAweDMzLDB4MzMsMHgzMworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgIDgwMHg2MDAgKGd1ZXNzZWQpICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAxMDI0eDc2OCAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAxMjgweDEwMjQgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogICA2NDB4NDgwICh1bmtub3duKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTAyNHg2MDAgKHVua25vd24pICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qICAxMTUyeDg2NCAodW5rbm93bikgKi8KKwkweDMzLDB4MzMsMHgzMywgICAgLyogIDEyODB4OTYwIChndWVzc2VkKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTE1Mng3NjggKHVua25vd24pICovCisJMHgzMywweDMzLDB4MzMsICAgIC8qIDE0MDB4MTA1MCAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAgMTI4MHg3NjggIChndWVzc2VkKSAqLworCTB4MzMsMHgzMywweDMzLCAgICAvKiAxNjAweDEyMDAgKi8KKwkweDMzLDB4MzMsMHgzMywKKwkweDMzLDB4MzMsMHgzMywKKwkweDMzLDB4MzMsMHgzMywKKwkweDMzLDB4MzMsMHgzMwogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9MQ0REZWxheUNvbXBlbnNhdGlvbl8zeHgzMDFCW10gPQkgICAJLyogMzB4QiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzN4eDMwMUJbXSA9CSAgIAkvKiAzMHhCICovCiB7Ci0JCSAweDAxLDB4MDEsMHgwMSwgICAgLyogICA4MDB4NjAwICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NzY4ICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogMTI4MHgxMDI0ICovCi0gICAgICAgICAgICAgICAgIDB4MDgsMHgwOCwweDA4LCAgICAvKiAgIDY0MHg0ODAgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTAyNHg2MDAgKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4ODY0IChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTE1Mng3NjggKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogMTQwMHgxMDUwIChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDc2OCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAxNjAweDEyMDAgKGd1ZXNzZWQpICovCi0JCSAweDAyLDB4MDIsMHgwMiwKLQkJIDB4MDIsMHgwMiwweDAyLAotCQkgMHgwMiwweDAyLDB4MDIsCi0JCSAweDAyLDB4MDIsMHgwMgorCTB4MDEsMHgwMSwweDAxLCAgICAvKiAgIDgwMHg2MDAgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NzY4ICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qIDEyODB4MTAyNCAqLworCTB4MDgsMHgwOCwweDA4LCAgICAvKiAgIDY0MHg0ODAgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NjAwIChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAgMTE1Mng4NjQgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4NzY4IChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAxNDAweDEwNTAgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDc2OCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogMTYwMHgxMjAwIChndWVzc2VkKSAqLworCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX0xDRERlbGF5Q29tcGVuc2F0aW9uXzN4eDMwMUxWW10gPQkgICAJLyogMzE1KzMweExWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfTENERGVsYXlDb21wZW5zYXRpb25fM3h4MzAxTFZbXSA9CSAgIAkvKiAzMTUrMzB4TFYgKi8KIHsKLQkJIDB4MDEsMHgwMSwweDAxLCAgICAvKiAgIDgwMHg2MDAgKi8KLQkJIDB4MDQsMHgwNCwweDA0LCAgICAvKiAgMTAyNHg3NjggKEE1MzEvQklPUyAxLjE0LjA1ZjogNCAtIHdvcmtzIHdpdGggNiAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qIDEyODB4MTAyNCAqLwotICAgICAgICAgICAgICAgICAweDA4LDB4MDgsMHgwOCwgICAgLyogICA2NDB4NDgwICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NjAwIChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qICAxMTUyeDg2NCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTI4MHg5NjAgKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4NzY4IChndWVzc2VkKSAqLwotCQkgMHgwQywweDBDLDB4MEMsICAgIC8qIDE0MDB4MTA1MCAoZ3Vlc3NlZCkgKi8KLQkJIDB4MEMsMHgwQywweDBDLCAgICAvKiAgMTI4MHg3NjggKGd1ZXNzZWQpICovCi0JCSAweDBDLDB4MEMsMHgwQywgICAgLyogMTYwMHgxMjAwIChndWVzc2VkKSAqLwotCQkgMHgwMiwweDAyLDB4MDIsCi0JCSAweDAyLDB4MDIsMHgwMiwKLQkJIDB4MDIsMHgwMiwweDAyLAotCQkgMHgwMiwweDAyLDB4MDIKKwkweDAxLDB4MDEsMHgwMSwgICAgLyogICA4MDB4NjAwICovCisJMHgwNCwweDA0LDB4MDQsICAgIC8qICAxMDI0eDc2OCAoQTUzMS9CSU9TIDEuMTQuMDVmOiA0IC0gd29ya3Mgd2l0aCA2ICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qIDEyODB4MTAyNCAqLworCTB4MDgsMHgwOCwweDA4LCAgICAvKiAgIDY0MHg0ODAgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDEwMjR4NjAwIChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAgMTE1Mng4NjQgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDk2MCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogIDExNTJ4NzY4IChndWVzc2VkKSAqLworCTB4MEMsMHgwQywweDBDLCAgICAvKiAxNDAweDEwNTAgKGd1ZXNzZWQpICovCisJMHgwQywweDBDLDB4MEMsICAgIC8qICAxMjgweDc2OCAoZ3Vlc3NlZCkgKi8KKwkweDBDLDB4MEMsMHgwQywgICAgLyogMTYwMHgxMjAwIChndWVzc2VkKSAqLworCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyLAorCTB4MDIsMHgwMiwweDAyCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX1RWRGVsYXlDb21wZW5zYXRpb25fMzAxW10gPSAJCS8qIDMwMSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWRGVsYXlDb21wZW5zYXRpb25fMzAxW10gPSAJCS8qIDMwMSAqLwogewotCQkgMHgwMiwweDAyLCAgICAvKiBOVFNDIEVuaGFuY2VkLCBTdGFuZGFyZCAqLwotICAgICAgICAgICAgICAgICAweDAyLDB4MDIsICAgIC8qIFBBTCAqLwotCQkgMHgwOCwweDBiICAgICAvKiBIaVZpc2lvbiAqLworCTB4MDIsMHgwMiwgICAgLyogTlRTQyBFbmhhbmNlZCwgU3RhbmRhcmQgKi8KKwkweDAyLDB4MDIsICAgIC8qIFBBTCAqLworCTB4MDgsMHgwYiAgICAgLyogSGlWaXNpb24gKi8KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl8zMDFCW10gPQkJLyogMzB4QiwgMzB4TFYgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVkRlbGF5Q29tcGVuc2F0aW9uXzMwMUJbXSA9CQkvKiAzMHhCLCAzMHhMViAqLwogewotCQkgMHgwMywweDAzLAotCQkgMHgwMywweDAzLAotCQkgMHgwMywweDAzCisJMHgwMywweDAzLAorCTB4MDMsMHgwMywKKwkweDAzLDB4MDMKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl83NDAzMDFCW10gPQkvKiA3NDAgKyAzMHhCICgzMHhMVj8pICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl83NDAzMDFCW10gPQkvKiA3NDAgKyAzMHhCICgzMHhMVj8pICovCiB7Ci0JCSAweDA1LDB4MDUsCi0JCSAweDA1LDB4MDUsCi0JCSAweDA1LDB4MDUKKwkweDA1LDB4MDUsCisJMHgwNSwweDA1LAorCTB4MDUsMHgwNQogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9UVkRlbGF5Q29tcGVuc2F0aW9uXzY1MTMwMUxWW10gPQkvKiBNNjUwLCA2NTEsIDMwMUxWICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl82NTEzMDFMVltdID0JLyogTTY1MCwgNjUxLCAzMDFMViAqLwogewotCQkgMHgzMywweDMzLAotCQkgMHgzMywweDMzLAotCQkgMHgzMywweDMzCisJMHgzMywweDMzLAorCTB4MzMsMHgzMywKKwkweDMzLDB4MzMKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl82NTEzMDJMVltdID0JLyogTTY1MCwgNjUxLCAzMDJMViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWRGVsYXlDb21wZW5zYXRpb25fNjUxMzAyTFZbXSA9CS8qIE02NTAsIDY1MSwgMzAyTFYgKi8KIHsKLQkJIDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMywKLQkJIDB4MzMsMHgzMworCTB4MzMsMHgzMywKKwkweDMzLDB4MzMsCisJMHgzMywweDMzCiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1RWRGVsYXk2NjFfMzAxW10gPQkJCS8qIDY2MSwgMzAxICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVNfVFZEZWxheTY2MV8zMDFbXSA9CQkJLyogNjYxLCAzMDEgKi8KIHsKLQkJIDB4NDQsMHg0NCwKLQkJIDB4NDQsMHg0NCwKLQkJIDB4MDAsMHgwMCwKLQkJIDB4NDQsMHg0NCwKLQkJIDB4NDQsMHg0NCwKLQkJIDB4NDQsMHg0NAorCTB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsCisJMHgwMCwweDAwLAorCTB4NDQsMHg0NCwKKwkweDQ0LDB4NDQsCisJMHg0NCwweDQ0CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTX1RWRGVsYXk2NjFfMzAxQltdID0JCQkvKiA2NjEsIDMwMUIgZXQgYWwgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpU19UVkRlbGF5NjYxXzMwMUJbXSA9CQkJLyogNjYxLCAzMDFCIGV0IGFsICovCiB7Ci0JCSAweDQ0LDB4NDQsCi0JCSAweDQ0LDB4NDQsCi0JCSAweDAwLDB4MDAsCi0JCSAweDQ0LDB4NDQsCi0JCSAweDQ0LDB4NDQsCi0JCSAweDQ0LDB4NDQKKwkweDQ0LDB4NDQsCisJMHg0NCwweDQ0LAorCTB4MDAsMHgwMCwKKwkweDQ0LDB4NDQsCisJMHg0NCwweDQ0LAorCTB4NDQsMHg0NAogfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIFNpUzMxMF9UVkRlbGF5Q29tcGVuc2F0aW9uX0xWRFNbXSA9CQkvKiBMVkRTICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZEZWxheUNvbXBlbnNhdGlvbl9MVkRTW10gPQkJLyogTFZEUyAqLwogewotCQkgMHgwYSwweDBhLAotCQkgMHgwYSwweDBhLAotCQkgMHgwYSwweDBhCisJMHgwYSwweDBhLAorCTB4MGEsMHgwYSwKKwkweDBhLDB4MGEKIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZBbnRpRmxpY2sxWzZdWzJdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVkFudGlGbGljazFbNl1bMl0gPQogewotICAgICAgICAgICAgezB4NCwweDB9LAotCSAgICB7MHg0LDB4OH0sCi0JICAgIHsweDAsMHgwfSwKLQkgICAgezB4MCwweDB9LAotCSAgICB7MHgwLDB4MH0sCi0JICAgIHsweDAsMHgwfQorCXsweDQsMHgwfSwKKwl7MHg0LDB4OH0sCisJezB4MCwweDB9LAorCXsweDAsMHgwfSwKKwl7MHgwLDB4MH0sCisJezB4MCwweDB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX1RWRWRnZTFbNl1bMl0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWRWRnZTFbNl1bMl0gPQogewotICAgICAgICAgICAgezB4MCwweDR9LAotCSAgICB7MHgwLDB4NH0sCi0JICAgIHsweDAsMHgwfSwKLQkgICAgezB4MCwweDB9LAotCSAgICB7MHgwLDB4MH0sCi0JICAgIHsweDAsMHgwfQorCXsweDAsMHg0fSwKKwl7MHgwLDB4NH0sCisJezB4MCwweDB9LAorCXsweDAsMHgwfSwKKwl7MHgwLDB4MH0sCisJezB4MCwweDB9CiB9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgU2lTMzEwX1RWWUZpbHRlcjFbNV1bOF1bNF0gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2lTMzEwX1RWWUZpbHRlcjFbNV1bOF1bNF0gPQogewotIHsKKyAgIHsKIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCS8qIE5UU0MgKi8KIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LApAQCAtMjU4LDggKzI1OCw4IEBACiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LAogCXsweGVlLDB4MGMsMHgyMiwweDA4fSwKIAl7MHhlYiwweDE1LDB4MjUsMHhmNn0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MDAsMHhmNCwweDEwLDB4Mzh9LAkvKiBQQUwgKi8KIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZjEsMHhmNywweDFmLDB4MzJ9LApAQCAtMjY4LDggKzI2OCw4IEBACiAJezB4ZjEsMHhmNywweDFmLDB4MzJ9LAogCXsweGYzLDB4MDAsMHgxZCwweDIwfSwKIAl7MHhmYywweGZiLDB4MTQsMHgyYX0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MDAsMHgwMCwweDAwLDB4MDB9LAkvKiBIaVZpc2lvbiAqLwogCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwKIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCkBAIC0yNzgsOSArMjc4LDkgQEAKIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LAogCXsweGVlLDB4MGMsMHgyMiwweDA4fQotIH0sCi0gewotIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCS8qIFBBTC1NICovCisgICB9LAorICAgeworCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwJLyogUEFMLU0gKi8KIAl7MHgwMCwweGY0LDB4MTAsMHgzOH0sCiAJezB4ZWIsMHgwNCwweDEwLDB4MTh9LAogCXsweGY3LDB4MDYsMHgxOSwweDE0fSwKQEAgLTI4OCw5ICsyODgsOSBAQAogCXsweGViLDB4MDQsMHgyNSwweDE4fSwKIAl7MHhlYiwweDA0LDB4MjUsMHgxOH0sCiAJezB4ZWIsMHgxNSwweDI1LDB4ZjZ9Ci0gfSwKLSB7Ci0gCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwJLyogUEFMLU4gKi8KKyAgIH0sCisgICB7CisJezB4MDAsMHhmNCwweDEwLDB4Mzh9LAkvKiBQQUwtTiAqLwogCXsweDAwLDB4ZjQsMHgxMCwweDM4fSwKIAl7MHhlYiwweDA0LDB4MTAsMHgxOH0sCiAJezB4ZjcsMHgwNiwweDE5LDB4MTR9LApAQCAtMjk4LDEyICsyOTgsMTIgQEAKIAl7MHhlYiwweDA0LDB4MjUsMHgxOH0sCiAJezB4ZWIsMHgwNCwweDI1LDB4MTh9LAogCXsweGViLDB4MTUsMHgyNSwweGY2fQotIH0KKyAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZZRmlsdGVyMls1XVs5XVs3XSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTaVMzMTBfVFZZRmlsdGVyMls1XVs5XVs3XSA9CiB7Ci0geworICAgewogCXsweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2fSwJLyogTlRTQyAqLwogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0Nn0sCkBAIC0zMTMsOCArMzEzLDggQEAKIAl7MHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQ30sCiAJezB4MDEsMHgwMSwweEZDLDB4RjgsMHgwOCwweDI2LDB4Mzh9LAogCXsweEZGLDB4RkYsMHhGQywweDAwLDB4MEYsMHgyMiwweDI4fQotIH0sCi0geworICAgfSwKKyAgIHsKIAl7MHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0Nn0sICAgLyogUEFMICovCiAJezB4MDEsMHgwMiwweEZFLDB4RjcsMHgwMywweDI3LDB4M0N9LAogCXsweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2fSwKQEAgLTMyNCw4ICszMjQsOCBAQAogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHgwMSwweDAxLDB4RkMsMHhGOCwweDA4LDB4MjYsMHgzOH0sCiAJezB4RkYsMHhGRiwweEZDLDB4MDAsMHgwRiwweDIyLDB4Mjh9Ci0gfSwKLSB7CisgICB9LAorICAgewogCXsweDAwLDB4MDAsMHgwMCwweEY0LDB4RkYsMHgxQywweDIyfSwJLyogSGlWaXNpb24gKi8KIAl7MHgwMCwweDAwLDB4MDAsMHhGNCwweEZGLDB4MUMsMHgyMn0sCiAJezB4MDAsMHgwMCwweDAwLDB4RjQsMHhGRiwweDFDLDB4MjJ9LApAQCAtMzM1LDkgKzMzNSw5IEBACiAJezB4MDAsMHgwMCwweDAwLDB4RjQsMHhGRiwweDFDLDB4MjJ9LAogCXsweDAwLDB4MDAsMHgwMCwweEY0LDB4RkYsMHgxQywweDIyfSwKIAl7MHgwMCwweDAwLDB4MDAsMHhGNCwweEZGLDB4MUMsMHgyMn0KLSB9LAotIHsKLSAJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LCAJLyogUEFMLU0gKi8KKyAgIH0sCisgICB7CisJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LCAJLyogUEFMLU0gKi8KIAl7MHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQ30sCiAJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LAogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKQEAgLTM0Niw5ICszNDYsOSBAQAogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHgwMSwweDAxLDB4RkMsMHhGOCwweDA4LDB4MjYsMHgzOH0sCiAJezB4RkYsMHhGRiwweEZDLDB4MDAsMHgwRiwweDIyLDB4Mjh9Ci0gfSwKLSB7Ci0gCXsweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2fSwJLyogUEFMLU4gKi8KKyAgIH0sCisgICB7CisJezB4RkYsMHgwMywweDAyLDB4RjYsMHhGQywweDI3LDB4NDZ9LAkvKiBQQUwtTiAqLwogCXsweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDfSwKIAl7MHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0Nn0sCiAJezB4MDEsMHgwMiwweEZFLDB4RjcsMHgwMywweDI3LDB4M0N9LApAQCAtMzU3LDU4ICszNTcsMzkgQEAKIAl7MHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQ30sCiAJezB4MDEsMHgwMSwweEZDLDB4RjgsMHgwOCwweDI2LDB4Mzh9LAogCXsweEZGLDB4RkYsMHhGQywweDAwLDB4MEYsMHgyMiwweDI4fQotIH0KKyAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZQaGFzZUluY3IxWzNdWzJdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVlBoYXNlSW5jcjFbM11bMl1bNF0gPQogewotIHsKKyAgIHsKIAl7MHgyMSwweGVkLDB4YmEsMHgwOH0sCiAJezB4MjEsMHhlZCwweGJhLDB4MDh9Ci0gfSwKLSB7CisgICB9LAorICAgewogCXsweDJhLDB4MDUsMHhlMywweDAwfSwKIAl7MHgyYSwweDA1LDB4ZTMsMHgwMH0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfQotIH0KKyAgIH0KIH07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVMzMTBfVFZQaGFzZUluY3IyWzNdWzJdWzRdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNpUzMxMF9UVlBoYXNlSW5jcjJbM11bMl1bNF0gPQogewotIHsKKyAgIHsKIAl7MHgyMSwweGYwLDB4N2IsMHhkNn0sCiAJezB4MjEsMHhmMCwweDdiLDB4ZDZ9Ci0gfSwKLSB7CisgICB9LAorICAgewogCXsweDJhLDB4MGEsMHg0MSwweGU5fSwKIAl7MHgyYSwweDBhLDB4NDEsMHhlOX0KLSB9LAotIHsKKyAgIH0sCisgICB7CiAJezB4MmEsMHgwNSwweGQzLDB4MDB9LAogCXsweDJhLDB4MDUsMHhkMywweDAwfQotIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBVQ0hBUiBTaVM2NjFfVFZQaGFzZVtdID0gewotICAgIDB4MjEsMHhFRCwweEJBLDB4MDgsCi0gICAgMHgyQSwweDA1LDB4RTMsMHgwMCwKLSAgICAweDIxLDB4RTQsMHgyRSwweDlCLAotICAgIDB4MjEsMHhGNCwweDNFLDB4QkEsCi0gICAgMHgxRSwweDhCLDB4QTIsMHhBNywKLSAgICAweDFFLDB4ODMsMHgwQSwweEUwLAotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsCi0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAweDIxLDB4RjAsMHg3QiwweEQ2LAotICAgIDB4MkEsMHgwOSwweDg2LDB4RTksCi0gICAgMHgyMSwweEU2LDB4RUYsMHhBNCwKLSAgICAweDIxLDB4RjYsMHg5NCwweDQ2LAotICAgIDB4MUUsMHg4QiwweEEyLDB4QTcsCi0gICAgMHgxRSwweDgzLDB4MEEsMHhFMCwKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLAotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAKKyAgIH0KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxNyw3ICszOTgsNyBAQAogCiAvKiBJbnZlbnRlYyAvIENvbXBhcSBQcmVzYXJpbyAzMDQ1VVMsIDMwMTcgKi8KIAotc3RhdGljIGNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICBTaVMzMTBfRXh0Q29tcGFxMTI4MHgxMDI0RGF0YVtdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEgU2lTMzEwX0V4dENvbXBhcTEyODB4MTAyNERhdGFbXSA9CiB7CiAJeyAgMjExLCAgNjAsMTAyNCwgNTAxLDE2ODgsMTA2Nn0sCiAJeyAgMjExLCAgNjAsMTAyNCwgNTA4LDE2ODgsMTA2Nn0sCkBAIC00MzEsMTcgKzQxMiwxNyBAQAogCiAvKiBBc3VzIEEyeHh4SCBfMiAqLwogCi1zdGF0aWMgY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCBTaVMzMTBfQ1JUMlBhcnQyX0FzdXMxMDI0eDc2OF8zW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBTaVNfUGFydDJQb3J0VGJsIFNpUzMxMF9DUlQyUGFydDJfQXN1czEwMjR4NzY4XzNbXSA9CiB7Ci0ge3sweDI1LDB4MTMsMHhjOSwweDI1LDB4ZmYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAotIHt7MHgyYywweDEzLDB4OWEsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKLSB7ezB4MjUsMHgxMywweGM5LDB4MjUsMHhmZiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCi0ge3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH19LAotIHt7MHgzOCwweDEzLDB4MTMsMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKLSB7ezB4MzgsMHgxMywweDE2LDB4MjUsMHhmZiwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCi0ge3sweDM2LDB4MTMsMHgxMywweDI1LDB4ZmYsMHg1YSwweDQ1LDB4MGEsMHgwNywweGZhLDB4MGEsMHgyNH19LAotIHt7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fSwKLSB7ezB4MjUsMHgxMywweGM5LDB4MjUsMHhmZiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0KKwl7ezB4MjUsMHgxMywweGM5LDB4MjUsMHhmZiwweDU5LDB4NDUsMHgwOSwweDA3LDB4ZjksMHgwOSwweDI0fX0sCisJe3sweDJjLDB4MTMsMHg5YSwweDI1LDB4ZmYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgyNSwweDEzLDB4YzksMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fSwKKwl7ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX0sCisJe3sweDM4LDB4MTMsMHgxMywweDI1LDB4ZmYsMHg1OSwweDQ1LDB4MDksMHgwNywweGY5LDB4MDksMHgyNH19LAorCXt7MHgzOCwweDEzLDB4MTYsMHgyNSwweGZmLDB4NWEsMHg0NSwweDBhLDB4MDcsMHhmYSwweDBhLDB4MjR9fSwKKwl7ezB4MzYsMHgxMywweDEzLDB4MjUsMHhmZiwweDVhLDB4NDUsMHgwYSwweDA3LDB4ZmEsMHgwYSwweDI0fX0sCisJe3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH19LAorCXt7MHgyNSwweDEzLDB4YzksMHgyNSwweGZmLDB4NTksMHg0NSwweDA5LDB4MDcsMHhmOSwweDA5LDB4MjR9fQogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9vc2RlZi5oIGIvZHJpdmVycy92aWRlby9zaXMvb3NkZWYuaAppbmRleCAxNTkzOWIwLi44NDFjYTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9vc2RlZi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL29zZGVmLmgKQEAgLTMsNyArMyw3IEBACiAvKgogICogT1MgZGVwZW5kaW5nIGRlZmluZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTU1LDggKzU1LDExIEBACiAjZGVmaW5lIF9TSVNfT1NERUZfSF8KIAogLyogVGhlIGNob2ljZXMgYXJlOiAqLwotI2RlZmluZSBMSU5VWF9LRVJORUwJICAgLyogTGludXgga2VybmVsIGZyYW1lYnVmZmVyICovCi0vKiAjZGVmaW5lIExJTlVYX1hGODYgKi8gICAvKiBYRnJlZTg2L1gub3JnICovCisjZGVmaW5lIFNJU19MSU5VWF9LRVJORUwJCS8qIExpbnV4IGtlcm5lbCBmcmFtZWJ1ZmZlciAqLworI3VuZGVmICBTSVNfWE9SR19YRjg2CQkJLyogWEZyZWU4Ni9YLm9yZyAqLworCisjdW5kZWYgU0lTX0xJTlVYX0tFUk5FTF8yNAorI3VuZGVmIFNJU19MSU5VWF9LRVJORUxfMjYKIAogI2lmZGVmIE91dFBvcnRCeXRlCiAjdW5kZWYgT3V0UG9ydEJ5dGUKQEAgLTg2LDggKzg5LDkgQEAKIC8qICBMSU5VWCBLRVJORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKICNkZWZpbmUgU0lTMzAwCkBAIC05Nyw2ICsxMDEsMTIgQEAKICNkZWZpbmUgU0lTMzE1SAogI2VuZGlmCiAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFNJU19MSU5VWF9LRVJORUxfMjYKKyNlbHNlCisjZGVmaW5lIFNJU19MSU5VWF9LRVJORUxfMjQKKyNlbmRpZgorCiAjaWYgIWRlZmluZWQoU0lTMzAwKSAmJiAhZGVmaW5lZChTSVMzMTVIKQogI3dhcm5pbmcgTmVpdGhlciBDT05GSUdfRkJfU0lTXzMwMCBub3IgQ09ORklHX0ZCX1NJU18zMTUgaXMgc2V0CiAjd2FybmluZyBzaXNmYiB3aWxsIG5vdCB3b3JrIQpAQCAtMTA5LDEzICsxMTksMTUgQEAKICNkZWZpbmUgSW5Qb3J0V29yZChwKSAgICBpbncoKFNJU0lPQUREUkVTUykocCkpCiAjZGVmaW5lIEluUG9ydExvbmcocCkgICAgaW5sKChTSVNJT0FERFJFU1MpKHApKQogI2RlZmluZSBTaVNfU2V0TWVtb3J5KE1lbW9yeUFkZHJlc3MsTWVtb3J5U2l6ZSx2YWx1ZSkgbWVtc2V0X2lvKE1lbW9yeUFkZHJlc3MsIHZhbHVlLCBNZW1vcnlTaXplKQotI2VuZGlmCisKKyNlbmRpZiAvKiBMSU5VWF9LRVJORUwgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgWEZyZWU4Ni9YLm9yZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorCiAjZGVmaW5lIFNJUzMwMAogI2RlZmluZSBTSVMzMTVICiAKQEAgLTEyNiw2ICsxMzgsNyBAQAogI2RlZmluZSBJblBvcnRXb3JkKHApICAgIGluU0lTUkVHVygoSU9BRERSRVNTKShwKSkKICNkZWZpbmUgSW5Qb3J0TG9uZyhwKSAgICBpblNJU1JFR0woKElPQUREUkVTUykocCkpCiAjZGVmaW5lIFNpU19TZXRNZW1vcnkoTWVtb3J5QWRkcmVzcyxNZW1vcnlTaXplLHZhbHVlKSBtZW1zZXQoTWVtb3J5QWRkcmVzcywgdmFsdWUsIE1lbW9yeVNpemUpCi0jZW5kaWYKKworI2VuZGlmIC8qIFhGODYgKi8KIAogI2VuZGlmICAvKiBfT1NERUZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKaW5kZXggZDAxMDNjMS4uMGI2ZTYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKQEAgLTEsOCArMSwxMCBAQAogLyoKLSAqIFNpUyAzMDAvNjMwLzczMC81NDAvMzE1LzU1MC9bTV02NTAvNjUxL1tNXTY2MVtGTV1YLzc0MC9bTV03NDFbR1hdLzMzMC9bTV03NjBbR1hdCisgKiBTaVMgMzAwLzU0MC82MzBbU10vNzMwW1NdLAorICogU2lTIDMxNVtFfFBST10vNTUwL1tNXTY1eC9bTV02NjFbRnxNXVgvNzQwL1tNXTc0MVtHWF0vMzMwL1tNXTc2eFtHWF0sCisgKiBYR0kgVjNYVC9WNS9WOCwgWjcKICAqIGZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIExpbnV4IGtlcm5lbHMgPj0yLjQuMTQgYW5kID49Mi42LjMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xOSw4ICsyMSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKICAqLwogCi0jaWZuZGVmIF9TSVNfSAotI2RlZmluZSBfU0lTX0gKKyNpZm5kZWYgX1NJU19IXworI2RlZmluZSBfU0lTX0hfCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CkBAIC0zNSwyNiArMzcsMzcgQEAKICNpbmNsdWRlICJ2Z2F0eXBlcy5oIgogI2luY2x1ZGUgInZzdHJ1Y3QuaCIKIAotI2RlZmluZSBWRVJfTUFKT1IgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVkVSX01JTk9SICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFZFUl9MRVZFTCAgICAgICAgICAgICAgICAgMTcKLQotI3VuZGVmIFNJU19DT05GSUdfQ09NUEFUCisjZGVmaW5lIFZFUl9NQUpPUgkJMQorI2RlZmluZSBWRVJfTUlOT1IJCTgKKyNkZWZpbmUgVkVSX0xFVkVMCQk5CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNkZWZpbmUgU0lTX1BDSV9HRVRfQ0xBU1MoYSwgYikgcGNpX2dldF9jbGFzcyhhLCBiKQorI2RlZmluZSBTSVNfUENJX0dFVF9ERVZJQ0UoYSxiLGMpIHBjaV9nZXRfZGV2aWNlKGEsYixjKQorI2RlZmluZSBTSVNfUENJX0dFVF9TTE9UKGEsYikgcGNpX2dldF9zbG90KGEsYikKKyNkZWZpbmUgU0lTX1BDSV9QVVRfREVWSUNFKGEpIHBjaV9kZXZfcHV0KGEpCiAjaWZkZWYgQ09ORklHX0NPTVBBVAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCiAjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgotI2RlZmluZSBTSVNfQ09ORklHX0NPTVBBVAorI2RlZmluZSBTSVNfT0xEX0NPTkZJR19DT01QQVQKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNkZWZpbmUgU0lTX05FV19DT05GSUdfQ09NUEFUCiAjZW5kaWYKLSNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTkpCi0jaWZkZWYgX194ODZfNjRfXwotLyogU2hvdWxkbid0IHdlIGNoZWNrIGZvciBDT05GSUdfSUEzMl9FTVVMQVRJT04gaGVyZT8gKi8KKyNlbmRpZgkvKiBDT05GSUdfQ09NUEFUICovCisjZWxzZSAgLyogMi40ICovCisjZGVmaW5lIFNJU19QQ0lfR0VUX0NMQVNTKGEsIGIpIHBjaV9maW5kX2NsYXNzKGEsIGIpCisjZGVmaW5lIFNJU19QQ0lfR0VUX0RFVklDRShhLGIsYykgcGNpX2ZpbmRfZGV2aWNlKGEsYixjKQorI2RlZmluZSBTSVNfUENJX0dFVF9TTE9UKGEsYikgcGNpX2ZpbmRfc2xvdChhLGIpCisjZGVmaW5lIFNJU19QQ0lfUFVUX0RFVklDRShhKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTkpCisjaWZkZWYgX194ODZfNjRfXwkvKiBTaG91bGRuJ3Qgd2UgY2hlY2sgZm9yIENPTkZJR19JQTMyX0VNVUxBVElPTiBoZXJlPyAqLwogI2luY2x1ZGUgPGFzbS9pb2N0bDMyLmg+Ci0jZGVmaW5lIFNJU19DT05GSUdfQ09NUEFUCisjZGVmaW5lIFNJU19PTERfQ09ORklHX0NPTVBBVAogI2VuZGlmCiAjZW5kaWYKLQorI2VuZGlmIC8qIDIuNCAqLwogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQogI2RlZmluZSBTSVNfSU9UWVBFMSB2b2lkIF9faW9tZW0KICNkZWZpbmUgU0lTX0lPVFlQRTIgX19pb21lbQpAQCAtNzksMjI4ICs5MiwzMTIgQEAKIAogLyogVG8gYmUgaW5jbHVkZWQgaW4gcGNpX2lkcy5oICovCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNjUwX1ZHQQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY1MF9WR0EgIDB4NjMyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY1MF9WR0EJMHg2MzI1CiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV82NTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NTAgICAgICAweDA2NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NTAJCTB4MDY1MAogI2VuZGlmCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNjUxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjUxICAgICAgMHgwNjUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNjUxCQkweDA2NTEKICNlbmRpZgogI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1NJXzc0MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzc0MCAgICAgIDB4MDc0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzc0MAkJMHgwNzQwCiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV8zMzAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMzAgICAgICAweDAzMzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV8zMzAJCTB4MDMzMAogI2VuZGlmCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNjYwX1ZHQQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MF9WR0EgIDB4NjMzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MF9WR0EJMHg2MzMwCiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV82NjEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NjEgICAgICAweDA2NjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV82NjEJCTB4MDY2MQogI2VuZGlmCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNzQxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzQxICAgICAgMHgwNzQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzQxCQkweDA3NDEKICNlbmRpZgogI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1NJXzY2MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MCAgICAgIDB4MDY2MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzY2MAkJMHgwNjYwCiAjZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV83NjAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83NjAgICAgICAweDA3NjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSV83NjAJCTB4MDc2MAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0lfNzYxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzYxCQkweDA3NjEKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfWEdJCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfWEdJCQkweDE4Y2EKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfWEdJXzIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWEdJXzIwCQkweDAwMjAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfWEdJXzQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWEdJXzQwCQkweDAwNDAKICNlbmRpZgogCiAvKiBUbyBiZSBpbmNsdWRlZCBpbiBmYi5oICovCiAjaWZuZGVmIEZCX0FDQ0VMX1NJU19HTEFNT1VSXzIKLSNkZWZpbmUgRkJfQUNDRUxfU0lTX0dMQU1PVVJfMgkgIDQwCS8qIFNpUyAzMTUsIDY1eCwgNzQwLCA2NjEsIDc0MSAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0lTX0dMQU1PVVJfMgk0MAkvKiBTaVMgMzE1LCA2NXgsIDc0MCwgNjYxLCA3NDEgICovCiAjZW5kaWYKICNpZm5kZWYgRkJfQUNDRUxfU0lTX1hBQlJFCi0jZGVmaW5lIEZCX0FDQ0VMX1NJU19YQUJSRSAgICAgICAgNDEJLyogU2lTIDMzMCAoIlhhYnJlIiksIDc2MCAJKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0lTX1hBQlJFCTQxCS8qIFNpUyAzMzAgKCJYYWJyZSIpLCA3NnggCSovCisjZW5kaWYKKyNpZm5kZWYgRkJfQUNDRUxfWEdJX1ZPTEFSSV9WCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfVgk0NwkvKiBYR0kgVm9sYXJpIFZ4IChWM1hULCBWNSwgVjgpCSovCisjZW5kaWYKKyNpZm5kZWYgRkJfQUNDRUxfWEdJX1ZPTEFSSV9aCisjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfWgk0OAkvKiBYR0kgVm9sYXJpIFo3CQkqLwogI2VuZGlmCiAKLSNkZWZpbmUgTUFYX1JPTV9TQ0FOICAgICAgICAgICAgICAweDEwMDAwCi0KIC8qIGl2aWRlby0+Y2FwcyAqLwotI2RlZmluZSBIV19DVVJTT1JfQ0FQICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgVFVSQk9fUVVFVUVfQ0FQICAgICAgICAgICAweDQwCi0jZGVmaW5lIEFHUF9DTURfUVVFVUVfQ0FQICAgICAgICAgMHgyMAotI2RlZmluZSBWTV9DTURfUVVFVUVfQ0FQICAgICAgICAgIDB4MTAKLSNkZWZpbmUgTU1JT19DTURfUVVFVUVfQ0FQICAgICAgICAweDA4CisjZGVmaW5lIEhXX0NVUlNPUl9DQVAJCTB4ODAKKyNkZWZpbmUgVFVSQk9fUVVFVUVfQ0FQCQkweDQwCisjZGVmaW5lIEFHUF9DTURfUVVFVUVfQ0FQCTB4MjAKKyNkZWZpbmUgVk1fQ01EX1FVRVVFX0NBUAkweDEwCisjZGVmaW5lIE1NSU9fQ01EX1FVRVVFX0NBUAkweDA4CiAKIC8qIEZvciAzMDAgc2VyaWVzICovCi0jZGVmaW5lIFRVUkJPX1FVRVVFX0FSRUFfU0laRSAgICAgMHg4MDAwMCAvKiA1MTJLICovCi0jZGVmaW5lIEhXX0NVUlNPUl9BUkVBX1NJWkVfMzAwICAgMHgxMDAwICAvKiA0SyAqLworI2RlZmluZSBUVVJCT19RVUVVRV9BUkVBX1NJWkUJKDUxMiAqIDEwMjQpCS8qIDUxMksgKi8KKyNkZWZpbmUgSFdfQ1VSU09SX0FSRUFfU0laRV8zMDAJNDA5NgkJLyogNEsgKi8KIAogLyogRm9yIDMxNS9YYWJyZSBzZXJpZXMgKi8KLSNkZWZpbmUgQ09NTUFORF9RVUVVRV9BUkVBX1NJWkUgICAweDgwMDAwIC8qIDUxMksgKi8KLSNkZWZpbmUgQ09NTUFORF9RVUVVRV9USFJFU0hPTEQgICAweDFGCi0jZGVmaW5lIEhXX0NVUlNPUl9BUkVBX1NJWkVfMzE1ICAgMHg0MDAwICAvKiAxNksgKi8KKyNkZWZpbmUgQ09NTUFORF9RVUVVRV9BUkVBX1NJWkUJKDUxMiAqIDEwMjQpCS8qIDUxMksgKi8KKyNkZWZpbmUgQ09NTUFORF9RVUVVRV9BUkVBX1NJWkVfWjcgKDEyOCAqIDEwMjQpCS8qIDEyOGsgZm9yIFhHSSBaNyAqLworI2RlZmluZSBIV19DVVJTT1JfQVJFQV9TSVpFXzMxNQkxNjM4NAkJLyogMTZLICovCisjZGVmaW5lIENPTU1BTkRfUVVFVUVfVEhSRVNIT0xECTB4MUYKIAotI2RlZmluZSBTSVNfT0hfQUxMT0NfU0laRSAgICAgICAgIDQwMDAKLSNkZWZpbmUgU0VOVElORUwgICAgICAgICAgICAgICAgICAweDdmZmZmZmZmCisjZGVmaW5lIFNJU19PSF9BTExPQ19TSVpFCTQwMDAKKyNkZWZpbmUgU0VOVElORUwJCTB4N2ZmZmZmZmYKIAotI2RlZmluZSBTRVFfQURSICAgICAgICAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgU0VRX0RBVEEgICAgICAgICAgICAgICAgICAweDE1Ci0jZGVmaW5lIERBQ19BRFIgICAgICAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBEQUNfREFUQSAgICAgICAgICAgICAgICAgIDB4MTkKLSNkZWZpbmUgQ1JUQ19BRFIgICAgICAgICAgICAgICAgICAweDI0Ci0jZGVmaW5lIENSVENfREFUQSAgICAgICAgICAgICAgICAgMHgyNQotI2RlZmluZSBEQUMyX0FEUiAgICAgICAgICAgICAgICAgICgweDE2LTB4MzApCi0jZGVmaW5lIERBQzJfREFUQSAgICAgICAgICAgICAgICAgKDB4MTctMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDFfQURSICAgICAgICAgICAgICAoMHgwNC0weDMwKQotI2RlZmluZSBWQl9QQVJUMV9EQVRBICAgICAgICAgICAgICgweDA1LTB4MzApCi0jZGVmaW5lIFZCX1BBUlQyX0FEUiAgICAgICAgICAgICAgKDB4MTAtMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDJfREFUQSAgICAgICAgICAgICAoMHgxMS0weDMwKQotI2RlZmluZSBWQl9QQVJUM19BRFIgICAgICAgICAgICAgICgweDEyLTB4MzApCi0jZGVmaW5lIFZCX1BBUlQzX0RBVEEgICAgICAgICAgICAgKDB4MTMtMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDRfQURSICAgICAgICAgICAgICAoMHgxNC0weDMwKQotI2RlZmluZSBWQl9QQVJUNF9EQVRBICAgICAgICAgICAgICgweDE1LTB4MzApCisjZGVmaW5lIFNFUV9BRFIJCQkweDE0CisjZGVmaW5lIFNFUV9EQVRBCQkweDE1CisjZGVmaW5lIERBQ19BRFIJCQkweDE4CisjZGVmaW5lIERBQ19EQVRBCQkweDE5CisjZGVmaW5lIENSVENfQURSCQkweDI0CisjZGVmaW5lIENSVENfREFUQQkJMHgyNQorI2RlZmluZSBEQUMyX0FEUgkJKDB4MTYtMHgzMCkKKyNkZWZpbmUgREFDMl9EQVRBCQkoMHgxNy0weDMwKQorI2RlZmluZSBWQl9QQVJUMV9BRFIJCSgweDA0LTB4MzApCisjZGVmaW5lIFZCX1BBUlQxX0RBVEEJCSgweDA1LTB4MzApCisjZGVmaW5lIFZCX1BBUlQyX0FEUgkJKDB4MTAtMHgzMCkKKyNkZWZpbmUgVkJfUEFSVDJfREFUQQkJKDB4MTEtMHgzMCkKKyNkZWZpbmUgVkJfUEFSVDNfQURSCQkoMHgxMi0weDMwKQorI2RlZmluZSBWQl9QQVJUM19EQVRBCQkoMHgxMy0weDMwKQorI2RlZmluZSBWQl9QQVJUNF9BRFIJCSgweDE0LTB4MzApCisjZGVmaW5lIFZCX1BBUlQ0X0RBVEEJCSgweDE1LTB4MzApCiAKLSNkZWZpbmUgU0lTU1IJCQkgIGl2aWRlby0+U2lTX1ByLlNpU19QM2M0Ci0jZGVmaW5lIFNJU0NSICAgICAgICAgICAgICAgICAgICAgaXZpZGVvLT5TaVNfUHIuU2lTX1AzZDQKLSNkZWZpbmUgU0lTREFDQSAgICAgICAgICAgICAgICAgICBpdmlkZW8tPlNpU19Qci5TaVNfUDNjOAotI2RlZmluZSBTSVNEQUNEICAgICAgICAgICAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19QM2M5Ci0jZGVmaW5lIFNJU1BBUlQxICAgICAgICAgICAgICAgICAgaXZpZGVvLT5TaVNfUHIuU2lTX1BhcnQxUG9ydAotI2RlZmluZSBTSVNQQVJUMiAgICAgICAgICAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19QYXJ0MlBvcnQKLSNkZWZpbmUgU0lTUEFSVDMgICAgICAgICAgICAgICAgICBpdmlkZW8tPlNpU19Qci5TaVNfUGFydDNQb3J0Ci0jZGVmaW5lIFNJU1BBUlQ0ICAgICAgICAgICAgICAgICAgaXZpZGVvLT5TaVNfUHIuU2lTX1BhcnQ0UG9ydAotI2RlZmluZSBTSVNQQVJUNSAgICAgICAgICAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19QYXJ0NVBvcnQKLSNkZWZpbmUgU0lTREFDMkEgICAgICAgICAgICAgICAgICBTSVNQQVJUNQotI2RlZmluZSBTSVNEQUMyRCAgICAgICAgICAgICAgICAgIChTSVNQQVJUNSArIDEpCi0jZGVmaW5lIFNJU01JU0NSICAgICAgICAgICAgICAgICAgKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgxYykKLSNkZWZpbmUgU0lTTUlTQ1cgICAgICAgICAgICAgICAgICBpdmlkZW8tPlNpU19Qci5TaVNfUDNjMgotI2RlZmluZSBTSVNJTlBTVEFUCQkgIChpdmlkZW8tPlNpU19Qci5SZWxJTyArIDB4MmEpCi0jZGVmaW5lIFNJU1BFTAkJCSAgaXZpZGVvLT5TaVNfUHIuU2lTX1AzYzYKKyNkZWZpbmUgU0lTU1IJCQlpdmlkZW8tPlNpU19Qci5TaVNfUDNjNAorI2RlZmluZSBTSVNDUgkJCWl2aWRlby0+U2lTX1ByLlNpU19QM2Q0CisjZGVmaW5lIFNJU0RBQ0EJCQlpdmlkZW8tPlNpU19Qci5TaVNfUDNjOAorI2RlZmluZSBTSVNEQUNECQkJaXZpZGVvLT5TaVNfUHIuU2lTX1AzYzkKKyNkZWZpbmUgU0lTUEFSVDEJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0MVBvcnQKKyNkZWZpbmUgU0lTUEFSVDIJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0MlBvcnQKKyNkZWZpbmUgU0lTUEFSVDMJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0M1BvcnQKKyNkZWZpbmUgU0lTUEFSVDQJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0NFBvcnQKKyNkZWZpbmUgU0lTUEFSVDUJCWl2aWRlby0+U2lTX1ByLlNpU19QYXJ0NVBvcnQKKyNkZWZpbmUgU0lTREFDMkEJCVNJU1BBUlQ1CisjZGVmaW5lIFNJU0RBQzJECQkoU0lTUEFSVDUgKyAxKQorI2RlZmluZSBTSVNNSVNDUgkJKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgxYykKKyNkZWZpbmUgU0lTTUlTQ1cJCWl2aWRlby0+U2lTX1ByLlNpU19QM2MyCisjZGVmaW5lIFNJU0lOUFNUQVQJCShpdmlkZW8tPlNpU19Qci5SZWxJTyArIDB4MmEpCisjZGVmaW5lIFNJU1BFTAkJCWl2aWRlby0+U2lTX1ByLlNpU19QM2M2CisjZGVmaW5lIFNJU1ZHQUVOQUJMRQkJKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgxMykKKyNkZWZpbmUgU0lTVklECQkJKGl2aWRlby0+U2lTX1ByLlJlbElPICsgMHgwMiAtIDB4MzApCisjZGVmaW5lIFNJU0NBUAkJCShpdmlkZW8tPlNpU19Qci5SZWxJTyArIDB4MDAgLSAweDMwKQogCi0jZGVmaW5lIElORF9TSVNfUEFTU1dPUkQgICAgICAgICAgMHgwNSAgLyogU1JzICovCi0jZGVmaW5lIElORF9TSVNfQ09MT1JfTU9ERSAgICAgICAgMHgwNgotI2RlZmluZSBJTkRfU0lTX1JBTURBQ19DT05UUk9MICAgIDB4MDcKLSNkZWZpbmUgSU5EX1NJU19EUkFNX1NJWkUgICAgICAgICAweDE0Ci0jZGVmaW5lIElORF9TSVNfTU9EVUxFX0VOQUJMRSAgICAgMHgxRQotI2RlZmluZSBJTkRfU0lTX1BDSV9BRERSRVNTX1NFVCAgIDB4MjAKLSNkZWZpbmUgSU5EX1NJU19UVVJCT1FVRVVFX0FEUiAgICAweDI2Ci0jZGVmaW5lIElORF9TSVNfVFVSQk9RVUVVRV9TRVQgICAgMHgyNwotI2RlZmluZSBJTkRfU0lTX1BPV0VSX09OX1RSQVAgICAgIDB4MzgKLSNkZWZpbmUgSU5EX1NJU19QT1dFUl9PTl9UUkFQMiAgICAweDM5Ci0jZGVmaW5lIElORF9TSVNfQ01EUVVFVUVfU0VUICAgICAgMHgyNgotI2RlZmluZSBJTkRfU0lTX0NNRFFVRVVFX1RIUkVTSE9MRCAgMHgyNworI2RlZmluZSBJTkRfU0lTX1BBU1NXT1JECQkweDA1ICAvKiBTUnMgKi8KKyNkZWZpbmUgSU5EX1NJU19DT0xPUl9NT0RFCQkweDA2CisjZGVmaW5lIElORF9TSVNfUkFNREFDX0NPTlRST0wJCTB4MDcKKyNkZWZpbmUgSU5EX1NJU19EUkFNX1NJWkUJCTB4MTQKKyNkZWZpbmUgSU5EX1NJU19NT0RVTEVfRU5BQkxFCQkweDFFCisjZGVmaW5lIElORF9TSVNfUENJX0FERFJFU1NfU0VUCQkweDIwCisjZGVmaW5lIElORF9TSVNfVFVSQk9RVUVVRV9BRFIJCTB4MjYKKyNkZWZpbmUgSU5EX1NJU19UVVJCT1FVRVVFX1NFVAkJMHgyNworI2RlZmluZSBJTkRfU0lTX1BPV0VSX09OX1RSQVAJCTB4MzgKKyNkZWZpbmUgSU5EX1NJU19QT1dFUl9PTl9UUkFQMgkJMHgzOQorI2RlZmluZSBJTkRfU0lTX0NNRFFVRVVFX1NFVAkJMHgyNgorI2RlZmluZSBJTkRfU0lTX0NNRFFVRVVFX1RIUkVTSE9MRAkweDI3CiAKLSNkZWZpbmUgSU5EX1NJU19BR1BfSU9fUEFEICAgICAgICAweDQ4CisjZGVmaW5lIElORF9TSVNfQUdQX0lPX1BBRAkweDQ4CiAKLSNkZWZpbmUgU0lTX0NSVDJfV0VOQUJMRV8zMDAgCSAgMHgyNCAgLyogUGFydDEgKi8KLSNkZWZpbmUgU0lTX0NSVDJfV0VOQUJMRV8zMTUgCSAgMHgyRgorI2RlZmluZSBTSVNfQ1JUMl9XRU5BQkxFXzMwMAkweDI0ICAvKiBQYXJ0MSAqLworI2RlZmluZSBTSVNfQ1JUMl9XRU5BQkxFXzMxNQkweDJGCiAKLSNkZWZpbmUgU0lTX1BBU1NXT1JEICAgICAgICAgICAgICAweDg2ICAvKiBTUjA1ICovCisjZGVmaW5lIFNJU19QQVNTV09SRAkJMHg4NiAgLyogU1IwNSAqLwogCi0jZGVmaW5lIFNJU19JTlRFUkxBQ0VEX01PREUgICAgICAgMHgyMCAgLyogU1IwNiAqLwotI2RlZmluZSBTSVNfOEJQUF9DT0xPUl9NT0RFICAgICAgIDB4MAotI2RlZmluZSBTSVNfMTVCUFBfQ09MT1JfTU9ERSAgICAgIDB4MQotI2RlZmluZSBTSVNfMTZCUFBfQ09MT1JfTU9ERSAgICAgIDB4MgotI2RlZmluZSBTSVNfMzJCUFBfQ09MT1JfTU9ERSAgICAgIDB4NAorI2RlZmluZSBTSVNfSU5URVJMQUNFRF9NT0RFCTB4MjAgIC8qIFNSMDYgKi8KKyNkZWZpbmUgU0lTXzhCUFBfQ09MT1JfTU9ERQkweDAKKyNkZWZpbmUgU0lTXzE1QlBQX0NPTE9SX01PREUJMHgxCisjZGVmaW5lIFNJU18xNkJQUF9DT0xPUl9NT0RFCTB4MgorI2RlZmluZSBTSVNfMzJCUFBfQ09MT1JfTU9ERQkweDQKIAotI2RlZmluZSBTSVNfRU5BQkxFXzJEICAgICAgICAgICAgIDB4NDAgIC8qIFNSMUUgKi8KKyNkZWZpbmUgU0lTX0VOQUJMRV8yRAkJMHg0MCAgLyogU1IxRSAqLwogCi0jZGVmaW5lIFNJU19NRU1fTUFQX0lPX0VOQUJMRSAgICAgMHgwMSAgLyogU1IyMCAqLwotI2RlZmluZSBTSVNfUENJX0FERFJfRU5BQkxFICAgICAgIDB4ODAKKyNkZWZpbmUgU0lTX01FTV9NQVBfSU9fRU5BQkxFCTB4MDEgIC8qIFNSMjAgKi8KKyNkZWZpbmUgU0lTX1BDSV9BRERSX0VOQUJMRQkweDgwCiAKLSNkZWZpbmUgU0lTX0FHUF9DTURRVUVVRV9FTkFCTEUgICAweDgwICAvKiAzMTUvMzMwIHNlcmllcyBTUjI2ICovCi0jZGVmaW5lIFNJU19WUkFNX0NNRFFVRVVFX0VOQUJMRSAgMHg0MAotI2RlZmluZSBTSVNfTU1JT19DTURfRU5BQkxFICAgICAgIDB4MjAKLSNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzUxMmsgICAweDAwCi0jZGVmaW5lIFNJU19DTURfUVVFVUVfU0laRV8xTSAgICAgMHgwNAotI2RlZmluZSBTSVNfQ01EX1FVRVVFX1NJWkVfMk0gICAgIDB4MDgKLSNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzRNICAgICAweDBDCi0jZGVmaW5lIFNJU19DTURfUVVFVUVfUkVTRVQgICAgICAgMHgwMQotI2RlZmluZSBTSVNfQ01EX0FVVE9fQ09SUgkgIDB4MDIKKyNkZWZpbmUgU0lTX0FHUF9DTURRVUVVRV9FTkFCTEUJCTB4ODAgIC8qIDMxNS8zMzAvMzQwIHNlcmllcyBTUjI2ICovCisjZGVmaW5lIFNJU19WUkFNX0NNRFFVRVVFX0VOQUJMRQkweDQwCisjZGVmaW5lIFNJU19NTUlPX0NNRF9FTkFCTEUJCTB4MjAKKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzUxMmsJCTB4MDAKKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFXzFNCQkweDA0CisjZGVmaW5lIFNJU19DTURfUVVFVUVfU0laRV8yTQkJMHgwOAorI2RlZmluZSBTSVNfQ01EX1FVRVVFX1NJWkVfNE0JCTB4MEMKKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9SRVNFVAkJMHgwMQorI2RlZmluZSBTSVNfQ01EX0FVVE9fQ09SUgkJMHgwMgogCi0jZGVmaW5lIFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUgIDB4MDEgIC8qIENSMzAgKi8KLSNkZWZpbmUgU0lTX01PREVfU0VMRUNUX0NSVDIgICAgICAweDAyCi0jZGVmaW5lIFNJU19WQl9PVVRQVVRfQ09NUE9TSVRFICAgMHgwNAotI2RlZmluZSBTSVNfVkJfT1VUUFVUX1NWSURFTyAgICAgIDB4MDgKLSNkZWZpbmUgU0lTX1ZCX09VVFBVVF9TQ0FSVCAgICAgICAweDEwCi0jZGVmaW5lIFNJU19WQl9PVVRQVVRfTENEICAgICAgICAgMHgyMAotI2RlZmluZSBTSVNfVkJfT1VUUFVUX0NSVDIgICAgICAgIDB4NDAKLSNkZWZpbmUgU0lTX1ZCX09VVFBVVF9ISVZJU0lPTiAgICAweDgwCisjZGVmaW5lIFNJU19DTURfUVVFVUVfU0laRV9aN182NGsJMHgwMCAvKiBYR0kgWjcgKi8KKyNkZWZpbmUgU0lTX0NNRF9RVUVVRV9TSVpFX1o3XzEyOGsJMHgwNAogCi0jZGVmaW5lIFNJU19WQl9PVVRQVVRfRElTQUJMRSAgICAgMHgyMCAgLyogQ1IzMSAqLwotI2RlZmluZSBTSVNfRFJJVkVSX01PREUgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgU0lTX1NJTVVMVEFORU9VU19WSUVXX0VOQUJMRQkweDAxICAvKiBDUjMwICovCisjZGVmaW5lIFNJU19NT0RFX1NFTEVDVF9DUlQyCQkweDAyCisjZGVmaW5lIFNJU19WQl9PVVRQVVRfQ09NUE9TSVRFCQkweDA0CisjZGVmaW5lIFNJU19WQl9PVVRQVVRfU1ZJREVPCQkweDA4CisjZGVmaW5lIFNJU19WQl9PVVRQVVRfU0NBUlQJCTB4MTAKKyNkZWZpbmUgU0lTX1ZCX09VVFBVVF9MQ0QJCTB4MjAKKyNkZWZpbmUgU0lTX1ZCX09VVFBVVF9DUlQyCQkweDQwCisjZGVmaW5lIFNJU19WQl9PVVRQVVRfSElWSVNJT04JCTB4ODAKIAotI2RlZmluZSBTSVNfVkJfQ09NUE9TSVRFICAgICAgICAgIDB4MDEgIC8qIENSMzIgKi8KLSNkZWZpbmUgU0lTX1ZCX1NWSURFTyAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIFNJU19WQl9TQ0FSVCAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBTSVNfVkJfTENEICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgU0lTX1ZCX0NSVDIgICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFNJU19DUlQxICAgICAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBTSVNfVkJfSElWSVNJT04gICAgICAgICAgIDB4NDAKLSNkZWZpbmUgU0lTX1ZCX1lQQlBSICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIFNJU19WQl9UViAgICAgICAgICAgICAgICAgKFNJU19WQl9DT01QT1NJVEUgfCBTSVNfVkJfU1ZJREVPIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVNfVkJfU0NBUlQgfCBTSVNfVkJfSElWSVNJT04gfCBTSVNfVkJfWVBCUFIpCisjZGVmaW5lIFNJU19WQl9PVVRQVVRfRElTQUJMRQkweDIwICAvKiBDUjMxICovCisjZGVmaW5lIFNJU19EUklWRVJfTU9ERQkJMHg0MAogCi0jZGVmaW5lIFNJU19FWFRFUk5BTF9DSElQX01BU0sgICAgCSAgIDB4MEUgIC8qIENSMzcgKDwgU2lTIDY2MCkgKi8KLSNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfU0lTMzAxICAgICAgICAgICAweDAxICAvKiBpbiBDUjM3IDw8IDEgISAqLwotI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfVFJVTVBJT04gICAgICAgICAweDAzCi0jZGVmaW5lIFNJU19FWFRFUk5BTF9DSElQX0xWRFNfQ0hST05URUwgICAgMHgwNAotI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9DSFJPTlRFTCAgICAgICAgIDB4MDUKLSNkZWZpbmUgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEUyAgICAgICAgICAweDAyCi0jZGVmaW5lIFNJUzMxMF9FWFRFUk5BTF9DSElQX0xWRFNfQ0hST05URUwgMHgwMworI2RlZmluZSBTSVNfVkJfQ09NUE9TSVRFCTB4MDEgIC8qIENSMzIgKi8KKyNkZWZpbmUgU0lTX1ZCX1NWSURFTwkJMHgwMgorI2RlZmluZSBTSVNfVkJfU0NBUlQJCTB4MDQKKyNkZWZpbmUgU0lTX1ZCX0xDRAkJMHgwOAorI2RlZmluZSBTSVNfVkJfQ1JUMgkJMHgxMAorI2RlZmluZSBTSVNfQ1JUMQkJMHgyMAorI2RlZmluZSBTSVNfVkJfSElWSVNJT04JCTB4NDAKKyNkZWZpbmUgU0lTX1ZCX1lQQlBSCQkweDgwCisjZGVmaW5lIFNJU19WQl9UVgkJKFNJU19WQl9DT01QT1NJVEUgfCBTSVNfVkJfU1ZJREVPIHwgXAorCQkJCVNJU19WQl9TQ0FSVCB8IFNJU19WQl9ISVZJU0lPTiB8IFNJU19WQl9ZUEJQUikKIAotI2RlZmluZSBTSVNfQUdQXzJYICAgICAgICAgICAgICAgIDB4MjAgIC8qIENSNDggKi8KKyNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfTUFTSwkJCTB4MEUgIC8qIENSMzcgKDwgU2lTIDY2MCkgKi8KKyNkZWZpbmUgU0lTX0VYVEVSTkFMX0NISVBfU0lTMzAxCQkweDAxICAvKiBpbiBDUjM3IDw8IDEgISAqLworI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTCQkJMHgwMgorI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9UUlVNUElPTgkJMHgwMworI2RlZmluZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTX0NIUk9OVEVMCQkweDA0CisjZGVmaW5lIFNJU19FWFRFUk5BTF9DSElQX0NIUk9OVEVMCQkweDA1CisjZGVmaW5lIFNJUzMxMF9FWFRFUk5BTF9DSElQX0xWRFMJCTB4MDIKKyNkZWZpbmUgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTAkweDAzCiAKLSNkZWZpbmUgSFdfREVWSUNFX0VYVEVOU0lPTgkgIFNJU19IV19JTkZPCi0jZGVmaW5lIFBIV19ERVZJQ0VfRVhURU5TSU9OICAgICAgUFNJU19IV19JTkZPCisjZGVmaW5lIFNJU19BR1BfMlgJCTB4MjAgIC8qIENSNDggKi8KKworLyogdmJmbGFncywgcHJpdmF0ZSBlbnRyaWVzIChvdGhlcnMgaW4gc2lzZmIuaCkgKi8KKyNkZWZpbmUgVkJfQ09ORVhBTlQJCTB4MDAwMDA4MDAJLyogNjYxIHNlcmllcyBvbmx5ICovCisjZGVmaW5lIFZCX1RSVU1QSU9OCQlWQl9DT05FWEFOVAkvKiAzMDAgc2VyaWVzIG9ubHkgKi8KKyNkZWZpbmUgVkJfMzAyRUxWCQkweDAwMDA0MDAwCisjZGVmaW5lIFZCXzMwMQkJCTB4MDAxMDAwMDAJLyogVmlkZW8gYnJpZGdlIHR5cGUgKi8KKyNkZWZpbmUgVkJfMzAxQgkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgVkJfMzAyQgkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVkJfMzB4QkRICQkweDAwODAwMDAwCS8qIDMweEIgREggdmVyc2lvbiAody9vIExDRCBzdXBwb3J0KSAqLworI2RlZmluZSBWQl9MVkRTCQkJMHgwMTAwMDAwMAorI2RlZmluZSBWQl9DSFJPTlRFTAkJMHgwMjAwMDAwMAorI2RlZmluZSBWQl8zMDFMVgkJMHgwNDAwMDAwMAorI2RlZmluZSBWQl8zMDJMVgkJMHgwODAwMDAwMAorI2RlZmluZSBWQl8zMDFDCQkJMHgxMDAwMDAwMAorCisjZGVmaW5lIFZCX1NJU0JSSURHRQkJKFZCXzMwMXxWQl8zMDFCfFZCXzMwMUN8VkJfMzAyQnxWQl8zMDFMVnxWQl8zMDJMVnxWQl8zMDJFTFYpCisjZGVmaW5lIFZCX1ZJREVPQlJJREdFCQkoVkJfU0lTQlJJREdFIHwgVkJfTFZEUyB8IFZCX0NIUk9OVEVMIHwgVkJfQ09ORVhBTlQpCisKKy8qIHZiZmxhZ3MyIChzdGF0aWMgc3R1ZmYgb25seSEpICovCisjZGVmaW5lIFZCMl9TSVNVTUMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVkIyXzMwMQkJCTB4MDAwMDAwMDIJLyogVmlkZW8gYnJpZGdlIHR5cGUgKi8KKyNkZWZpbmUgVkIyXzMwMUIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVkIyXzMwMUMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVkIyXzMwN1QJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVkIyXzMwMkIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVkIyXzMwMUxWCQkweDAwMDAxMDAwCisjZGVmaW5lIFZCMl8zMDJMVgkJMHgwMDAwMjAwMAorI2RlZmluZSBWQjJfMzAyRUxWCQkweDAwMDA0MDAwCisjZGVmaW5lIFZCMl8zMDdMVgkJMHgwMDAwODAwMAorI2RlZmluZSBWQjJfMzB4QkRICQkweDA4MDAwMDAwICAgICAgLyogMzB4QiBESCB2ZXJzaW9uICh3L28gTENEIHN1cHBvcnQpICovCisjZGVmaW5lIFZCMl9DT05FWEFOVAkJMHgxMDAwMDAwMAorI2RlZmluZSBWQjJfVFJVTVBJT04JCTB4MjAwMDAwMDAKKyNkZWZpbmUgVkIyX0xWRFMJCTB4NDAwMDAwMDAKKyNkZWZpbmUgVkIyX0NIUk9OVEVMCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgVkIyX1NJU0xWRFNCUklER0UJKFZCMl8zMDFMViB8IFZCMl8zMDJMViB8IFZCMl8zMDJFTFYgfCBWQjJfMzA3TFYpCisjZGVmaW5lIFZCMl9TSVNUTURTQlJJREdFCShWQjJfMzAxICAgfCBWQjJfMzAxQiAgfCBWQjJfMzAxQyAgIHwgVkIyXzMwMkIgfCBWQjJfMzA3VCkKKyNkZWZpbmUgVkIyX1NJU0JSSURHRQkJKFZCMl9TSVNMVkRTQlJJREdFIHwgVkIyX1NJU1RNRFNCUklER0UpCisKKyNkZWZpbmUgVkIyX1NJU1RNRFNMQ0RBQlJJREdFCShWQjJfMzAxQyB8IFZCMl8zMDdUKQorI2RlZmluZSBWQjJfU0lTTENEQUJSSURHRQkoVkIyX1NJU1RNRFNMQ0RBQlJJREdFIHwgVkIyXzMwMUxWIHwgVkIyXzMwMkxWIHwgVkIyXzMwMkVMViB8IFZCMl8zMDdMVikKKworI2RlZmluZSBWQjJfU0lTSElWSVNJT05CUklER0UJKFZCMl8zMDEgIHwgVkIyXzMwMUIgfCBWQjJfMzAyQikKKyNkZWZpbmUgVkIyX1NJU1lQQlBSQlJJREdFCShWQjJfMzAxQyB8IFZCMl8zMDdUIHwgVkIyX1NJU0xWRFNCUklER0UpCisjZGVmaW5lIFZCMl9TSVNZUEJQUkFSQlJJREdFCShWQjJfMzAxQyB8IFZCMl8zMDdUIHwgVkIyXzMwN0xWKQorI2RlZmluZSBWQjJfU0lTVEFQNFNDQUxFUgkoVkIyXzMwMUMgfCBWQjJfMzA3VCB8IFZCMl8zMDJFTFYgfCBWQjJfMzA3TFYpCisjZGVmaW5lIFZCMl9TSVNUVkJSSURHRQkJKFZCMl9TSVNISVZJU0lPTkJSSURHRSB8IFZCMl9TSVNZUEJQUkJSSURHRSkKKworI2RlZmluZSBWQjJfU0lTVkdBMkJSSURHRQkoVkIyXzMwMSB8IFZCMl8zMDFCIHwgVkIyXzMwMUMgfCBWQjJfMzAyQiB8IFZCMl8zMDdUKQorCisjZGVmaW5lIFZCMl9WSURFT0JSSURHRQkJKFZCMl9TSVNCUklER0UgfCBWQjJfTFZEUyB8IFZCMl9DSFJPTlRFTCB8IFZCMl9DT05FWEFOVCkKKworI2RlZmluZSBWQjJfMzB4QgkJKFZCMl8zMDFCICB8IFZCMl8zMDFDICAgfCBWQjJfMzAyQiAgfCBWQjJfMzA3VCkKKyNkZWZpbmUgVkIyXzMweEJMVgkJKFZCMl8zMHhCICB8IFZCMl9TSVNMVkRTQlJJREdFKQorI2RlZmluZSBWQjJfMzB4QwkJKFZCMl8zMDFDICB8IFZCMl8zMDdUKQorI2RlZmluZSBWQjJfMzB4Q0xWCQkoVkIyXzMwMUMgIHwgVkIyXzMwN1QgICB8IFZCMl8zMDJFTFZ8IFZCMl8zMDdMVikKKyNkZWZpbmUgVkIyX1NJU0VNSUJSSURHRQkoVkIyXzMwMkxWIHwgVkIyXzMwMkVMViB8IFZCMl8zMDdMVikKKyNkZWZpbmUgVkIyX0xDRDE2Mk1IWkJSSURHRQkoVkIyXzMwMUMgIHwgVkIyXzMwN1QpCisjZGVmaW5lIFZCMl9MQ0RPVkVSMTI4MEJSSURHRQkoVkIyXzMwMUMgIHwgVkIyXzMwN1QgICB8IFZCMl8zMDJMViB8IFZCMl8zMDJFTFYgfCBWQjJfMzA3TFYpCisjZGVmaW5lIFZCMl9MQ0RPVkVSMTYwMEJSSURHRQkoVkIyXzMwN1QgIHwgVkIyXzMwN0xWKQorI2RlZmluZSBWQjJfUkFNREFDMjAyTUhaQlJJREdFCShWQjJfMzAxQyAgfCBWQjJfMzA3VCkKIAogLyogSS9PIHBvcnQgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBpblNJU1JFRyhiYXNlKSAgICAgICAgICBpbmIoYmFzZSkKKyNkZWZpbmUgaW5TSVNSRUcoYmFzZSkJCWluYihiYXNlKQogCi0jZGVmaW5lIG91dFNJU1JFRyhiYXNlLHZhbCkgICAgIG91dGIodmFsLGJhc2UpCisjZGVmaW5lIG91dFNJU1JFRyhiYXNlLHZhbCkJb3V0Yih2YWwsYmFzZSkKIAogI2RlZmluZSBvclNJU1JFRyhiYXNlLHZhbCkgICAgICAJCQlcCi0JCSAgICBkbyB7IAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0U0lTUkVHKGJhc2UsIF9fVGVtcCB8ICh2YWwpKTsgCVwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKwkJZG8gewkJCQkJXAorCQkJdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCisJCQlvdXRTSVNSRUcoYmFzZSwgX19UZW1wIHwgKHZhbCkpO1wKKwkJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBhbmRTSVNSRUcoYmFzZSx2YWwpICAgICAJCQlcCi0JCSAgICBkbyB7IAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0U0lTUkVHKGJhc2UsIF9fVGVtcCAmICh2YWwpKTsgCVwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKwkJZG8gewkJCQkJXAorCQkJdTggX19UZW1wID0gaW5TSVNSRUcoYmFzZSk7IAlcCisJCQlvdXRTSVNSRUcoYmFzZSwgX19UZW1wICYgKHZhbCkpO1wKKwkJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBpblNJU0lEWFJFRyhiYXNlLGlkeCx2YXIpICAgCQlcCi0JCSAgICBkbyB7IAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNSRUcoYmFzZSwgaWR4KTsgCVwKLQkJICAgICAgdmFyID0gaW5TSVNSRUcoKGJhc2UpKzEpOwlcCi0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIGluU0lTSURYUkVHKGJhc2UsaWR4LHZhcikJCQlcCisJCWRvIHsJCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOyAJCVwKKwkJCXZhciA9IGluU0lTUkVHKChiYXNlKSsxKTsJXAorCQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIG91dFNJU0lEWFJFRyhiYXNlLGlkeCx2YWwpICAJCVwKLQkJICAgIGRvIHsgCQkJXAotICAgICAgICAgICAgICAgICAgICAgIG91dFNJU1JFRyhiYXNlLCBpZHgpOyAJXAotCQkgICAgICBvdXRTSVNSRUcoKGJhc2UpKzEsIHZhbCk7IFwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgb3V0U0lTSURYUkVHKGJhc2UsaWR4LHZhbCkJCQlcCisJCWRvIHsJCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOwkJXAorCQkJb3V0U0lTUkVHKChiYXNlKSsxLCB2YWwpOwlcCisJCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgb3JTSVNJRFhSRUcoYmFzZSxpZHgsdmFsKSAgIAkJCQlcCi0JCSAgICBkbyB7IAkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgIHU4IF9fVGVtcDsgCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNSRUcoYmFzZSwgaWR4KTsgICAJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgX19UZW1wID0gaW5TSVNSRUcoKGJhc2UpKzEpIHwgKHZhbCk7IAlcCi0JCSAgICAgIG91dFNJU1JFRygoYmFzZSkrMSwgX19UZW1wKTsJCVwKLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgb3JTSVNJRFhSRUcoYmFzZSxpZHgsdmFsKQkJCQlcCisJCWRvIHsJCQkJCQlcCisJCQl1OCBfX1RlbXA7IAkJCQlcCisJCQlvdXRTSVNSRUcoYmFzZSwgaWR4KTsgICAJCVwKKwkJCV9fVGVtcCA9IGluU0lTUkVHKChiYXNlKSsxKSB8ICh2YWwpOyAJXAorCQkJb3V0U0lTUkVHKChiYXNlKSsxLCBfX1RlbXApOwkJXAorCQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIGFuZFNJU0lEWFJFRyhiYXNlLGlkeCxhbmQpICAJCQkJXAotCQkgICAgZG8geyAJCQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICB1OCBfX1RlbXA7IAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0U0lTUkVHKGJhc2UsIGlkeCk7ICAgCQkJXAotICAgICAgICAgICAgICAgICAgICAgIF9fVGVtcCA9IGluU0lTUkVHKChiYXNlKSsxKSAmIChhbmQpOyAJXAotCQkgICAgICBvdXRTSVNSRUcoKGJhc2UpKzEsIF9fVGVtcCk7CQlcCi0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIGFuZFNJU0lEWFJFRyhiYXNlLGlkeCxhbmQpCQkJCVwKKwkJZG8gewkJCQkJCVwKKwkJCXU4IF9fVGVtcDsgCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOyAgIAkJXAorCQkJX19UZW1wID0gaW5TSVNSRUcoKGJhc2UpKzEpICYgKGFuZCk7IAlcCisJCQlvdXRTSVNSRUcoKGJhc2UpKzEsIF9fVGVtcCk7CQlcCisJCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgc2V0U0lTSURYUkVHKGJhc2UsaWR4LGFuZCxvcikgICAJCSAgIAkJXAotCQkgICAgZG8geyAJCQkJICAgCQlcCi0gICAgICAgICAgICAgICAgICAgICAgdTggX19UZW1wOyAJCSAgIAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNSRUcoYmFzZSwgaWR4KTsgICAJCSAgIAkJXAotICAgICAgICAgICAgICAgICAgICAgIF9fVGVtcCA9IChpblNJU1JFRygoYmFzZSkrMSkgJiAoYW5kKSkgfCAob3IpOyAJXAotCQkgICAgICBvdXRTSVNSRUcoKGJhc2UpKzEsIF9fVGVtcCk7CQkJXAotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRTSVNJRFhSRUcoYmFzZSxpZHgsYW5kLG9yKSAgIAkJCQlcCisJCWRvIHsJCQkJCQkJXAorCQkJdTggX19UZW1wOyAJCQkJCVwKKwkJCW91dFNJU1JFRyhiYXNlLCBpZHgpOwkJCQlcCisJCQlfX1RlbXAgPSAoaW5TSVNSRUcoKGJhc2UpKzEpICYgKGFuZCkpIHwgKG9yKTsgCVwKKwkJCW91dFNJU1JFRygoYmFzZSkrMSwgX19UZW1wKTsJCQlcCisJCX0gd2hpbGUgKDApCiAKIC8qIE1NSU8gYWNjZXNzIG1hY3JvcyAqLwogI2RlZmluZSBNTUlPX0lOOChiYXNlLCBvZmZzZXQpICByZWFkYigoYmFzZStvZmZzZXQpKQpAQCAtMzIyLDE5ICs0MTksMTkgQEAKICNkZWZpbmUgTU1JT19RVUVVRV9SRUFEUE9SVCAgICAgUV9SRUFEX1BUUgogCiAjaWZuZGVmIEZCX0JMQU5LX1VOQkxBTksKLSNkZWZpbmUgRkJfQkxBTktfVU5CTEFOSyAJMAorI2RlZmluZSBGQl9CTEFOS19VTkJMQU5LCTAKICNlbmRpZgogI2lmbmRlZiBGQl9CTEFOS19OT1JNQUwKLSNkZWZpbmUgRkJfQkxBTktfTk9STUFMICAJMQorI2RlZmluZSBGQl9CTEFOS19OT1JNQUwJCTEKICNlbmRpZgogI2lmbmRlZiBGQl9CTEFOS19WU1lOQ19TVVNQRU5ECi0jZGVmaW5lIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQgCTIKKyNkZWZpbmUgRkJfQkxBTktfVlNZTkNfU1VTUEVORAkyCiAjZW5kaWYKICNpZm5kZWYgRkJfQkxBTktfSFNZTkNfU1VTUEVORAotI2RlZmluZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EIAkzCisjZGVmaW5lIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQJMwogI2VuZGlmCiAjaWZuZGVmIEZCX0JMQU5LX1BPV0VSRE9XTgotI2RlZmluZSBGQl9CTEFOS19QT1dFUkRPV04gCTQKKyNkZWZpbmUgRkJfQkxBTktfUE9XRVJET1dOCTQKICNlbmRpZgogCiBlbnVtIF9TSVNfTENEX1RZUEUgewpAQCAtMzQ3LDE4ICs0NDQsMTkgQEAKICAgICBMQ0RfMTYwMHgxMjAwLAogICAgIExDRF8xOTIweDE0NDAsCiAgICAgTENEXzIwNDh4MTUzNiwKLSAgICBMQ0RfMzIweDQ4MCwgICAgICAgLyogRlNUTiAqLworICAgIExDRF8zMjB4MjQwLAkvKiBGU1ROICovCiAgICAgTENEXzE0MDB4MTA1MCwKICAgICBMQ0RfMTE1Mng4NjQsCiAgICAgTENEXzExNTJ4NzY4LAogICAgIExDRF8xMjgweDc2OCwKICAgICBMQ0RfMTAyNHg2MDAsCi0gICAgTENEXzY0MHg0ODBfMiwgICAgIC8qIERTVE4gKi8KLSAgICBMQ0RfNjQweDQ4MF8zLCAgICAgLyogRFNUTiAqLworICAgIExDRF8zMjB4MjQwXzIsCS8qIERTVE4gKi8KKyAgICBMQ0RfMzIweDI0MF8zLAkvKiBEU1ROICovCiAgICAgTENEXzg0OHg0ODAsCiAgICAgTENEXzEyODB4ODAwLAogICAgIExDRF8xNjgweDEwNTAsCiAgICAgTENEXzEyODB4NzIwLAorICAgIExDRF8xMjgweDg1NCwKICAgICBMQ0RfQ1VTVE9NLAogICAgIExDRF9VTktOT1dOCiB9OwpAQCAtMzY4LDMxICs0NjYsNTAgQEAKICAgICBBR1BfQ01EX1FVRVVFLAogICAgIFZNX0NNRF9RVUVVRSwKIH07Ci10eXBlZGVmIHVuc2lnbmVkIGludCBTSVNfQ01EVFlQRTsKKworc3RydWN0IFNJU19PSCB7CisJc3RydWN0IFNJU19PSCAqcG9oX25leHQ7CisJc3RydWN0IFNJU19PSCAqcG9oX3ByZXY7CisJdTMyICAgICAgICAgICAgb2Zmc2V0OworCXUzMiAgICAgICAgICAgIHNpemU7Cit9OworCitzdHJ1Y3QgU0lTX09IQUxMT0MgeworCXN0cnVjdCBTSVNfT0hBTExPQyAqcG9oYV9uZXh0OworCXN0cnVjdCBTSVNfT0ggYW9oWzFdOworfTsKKworc3RydWN0IFNJU19IRUFQIHsKKwlzdHJ1Y3QgU0lTX09ICW9oX2ZyZWU7CisJc3RydWN0IFNJU19PSAlvaF91c2VkOworCXN0cnVjdCBTSVNfT0gJKnBvaF9mcmVlbGlzdDsKKwlzdHJ1Y3QgU0lTX09IQUxMT0MgKnBvaGFfY2hhaW47CisJdTMyCQltYXhfZnJlZXNpemU7CisJc3RydWN0IHNpc192aWRlb19pbmZvICp2aW5mbzsKK307CiAKIC8qIE91ciAicGFyIiAqLwogc3RydWN0IHNpc192aWRlb19pbmZvIHsKIAlpbnQJCWNhcmRudW1iZXI7CiAJc3RydWN0IGZiX2luZm8gICptZW15c2VsZmFuZGk7CiAKLQlTSVNfSFdfSU5GTyAJc2lzaHdfZXh0OwotCVNpU19Qcml2YXRlICAJU2lTX1ByOworCXN0cnVjdCBTaVNfUHJpdmF0ZSBTaVNfUHI7CiAKLQlzaXNmYl9pbmZvIAlzaXNmYmluZm87CS8qIEZvciBpb2N0bCBTSVNGQl9HRVRfSU5GTyAqLworCXN0cnVjdCBzaXNmYl9pbmZvIHNpc2ZiaW5mbzsJLyogRm9yIGlvY3RsIFNJU0ZCX0dFVF9JTkZPICovCiAKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVmYXVsdF92YXI7CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHNpc2ZiX2ZpeDsKLQl1MzIgCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQlwc2V1ZG9fcGFsZXR0ZVsxN107CiAjZW5kaWYKIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXN0cnVjdCBkaXNwbGF5IAkJIHNpc19kaXNwOworCXN0cnVjdCBkaXNwbGF5CQkgc2lzX2Rpc3A7CiAJc3RydWN0IGRpc3BsYXlfc3dpdGNoIAkgc2lzZmJfc3c7CiAJc3RydWN0IHsKIAkJdTE2IHJlZCwgZ3JlZW4sIGJsdWUsIHBhZDsKLQl9IAkJc2lzX3BhbGV0dGVbMjU2XTsKKwl9CQlzaXNfcGFsZXR0ZVsyNTZdOwogCXVuaW9uIHsKICNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKIAkJdTE2IGNmYjE2WzE2XTsKQEAgLTQwMCwxMCArNTE3LDEwIEBACiAjaWZkZWYgRkJDT05fSEFTX0NGQjMyCiAJCXUzMiBjZmIzMlsxNl07CiAjZW5kaWYKLQl9IAkJc2lzX2ZiY29uX2NtYXA7CisJfQkJc2lzX2ZiY29uX2NtYXA7CiAjZW5kaWYKIAotICAgICAgICBzdHJ1Y3Qgc2lzZmJfbW9uaXRvciB7CisJc3RydWN0IHNpc2ZiX21vbml0b3IgewogCQl1MTYgaG1pbjsKIAkJdTE2IGhtYXg7CiAJCXUxNiB2bWluOwpAQCAtNDExLDE2MyArNTI4LDE2NiBAQAogCQl1MzIgZGNsb2NrbWF4OwogCQl1OCAgZmVhdHVyZTsKIAkJQk9PTEVBTiBkYXRhdmFsaWQ7Ci0JfSAJCXNpc2ZiX3RoaXNtb25pdG9yOworCX0JCXNpc2ZiX3RoaXNtb25pdG9yOwogCi0JaW50ICAgICAgICAgICAJY2hpcF9pZDsKKwl1bnNpZ25lZCBzaG9ydAljaGlwX2lkOwkvKiBQQ0kgSUQgb2YgY2hpcCAqLworCXVuc2lnbmVkIHNob3J0CWNoaXBfdmVuZG9yOwkvKiBQQ0kgSUQgb2YgdmVuZG9yICovCiAJY2hhcgkJbXlpZFs0MF07CiAKIAlzdHJ1Y3QgcGNpX2RldiAgKm5icmlkZ2U7CisJc3RydWN0IHBjaV9kZXYgICpscGNkZXY7CiAKIAlpbnQJCW1uaTsJLyogTW9kZSBudW1iZXIgaW5kZXggKi8KIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWludCAgCQljdXJyY29uOworCWludAkJY3VycmNvbjsKICNlbmRpZgogCiAJdW5zaWduZWQgbG9uZwl2aWRlb19zaXplOwotCXVuc2lnbmVkIGxvbmcgCXZpZGVvX2Jhc2U7CisJdW5zaWduZWQgbG9uZwl2aWRlb19iYXNlOwogCXVuc2lnbmVkIGxvbmcJbW1pb19zaXplOwotCXVuc2lnbmVkIGxvbmcgCW1taW9fYmFzZTsKLQl1bnNpZ25lZCBsb25nIAl2Z2FfYmFzZTsKKwl1bnNpZ25lZCBsb25nCW1taW9fYmFzZTsKKwl1bnNpZ25lZCBsb25nCXZnYV9iYXNlOwogCi0JU0lTX0lPVFlQRTEgIAkqdmlkZW9fdmJhc2U7Ci0JU0lTX0lPVFlQRTEgCSptbWlvX3ZiYXNlOworCXVuc2lnbmVkIGxvbmcJdmlkZW9fb2Zmc2V0OwogCi0JdW5zaWduZWQgY2hhciAgICpiaW9zX2FiYXNlOworCXVuc2lnbmVkIGxvbmcJVU1Bc2l6ZSwgTEZCc2l6ZTsKIAotCWludCAJCW10cnI7CisJU0lTX0lPVFlQRTEJKnZpZGVvX3ZiYXNlOworCVNJU19JT1RZUEUxCSptbWlvX3ZiYXNlOworCisJdW5zaWduZWQgY2hhcgkqYmlvc19hYmFzZTsKKworCWludAkJbXRycjsKIAogCXUzMgkJc2lzZmJfbWVtOwogCi0JdTMyIAkJc2lzZmJfcGFybV9tZW07Ci0JaW50IAkgICAJc2lzZmJfYWNjZWw7Ci0JaW50IAkJc2lzZmJfeXBhbjsKLQlpbnQgCQlzaXNmYl9tYXg7Ci0JaW50IAkJc2lzZmJfdXNlcm9tOwotCWludCAJCXNpc2ZiX3VzZW9lbTsKKwl1MzIJCXNpc2ZiX3Bhcm1fbWVtOworCWludAkJc2lzZmJfYWNjZWw7CisJaW50CQlzaXNmYl95cGFuOworCWludAkJc2lzZmJfbWF4OworCWludAkJc2lzZmJfdXNlcm9tOworCWludAkJc2lzZmJfdXNlb2VtOwogCWludAkJc2lzZmJfbW9kZV9pZHg7CiAJaW50CQlzaXNmYl9wYXJtX3JhdGU7CiAJaW50CQlzaXNmYl9jcnQxb2ZmOwogCWludAkJc2lzZmJfZm9yY2VjcnQxOwogCWludAkJc2lzZmJfY3J0MnR5cGU7CiAJaW50CQlzaXNmYl9jcnQyZmxhZ3M7Ci0JaW50IAkJc2lzZmJfZHN0bjsKLQlpbnQgCQlzaXNmYl9mc3RuOworCWludAkJc2lzZmJfZHN0bjsKKwlpbnQJCXNpc2ZiX2ZzdG47CiAJaW50CQlzaXNmYl90dnBsdWc7CiAJaW50CQlzaXNmYl90dnN0ZDsKLQlpbnQJCXNpc2ZiX2ZpbHRlcjsKIAlpbnQJCXNpc2ZiX25vY3J0MnJhdGU7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJaW50CQlzaXNmYl9pbnZlcnNlOwogI2VuZGlmCiAKLQl1MzIgCQloZWFwc3RhcnQ7ICAgICAgICAJLyogb2Zmc2V0ICAqLwotCVNJU19JT1RZUEUxICAJKnNpc2ZiX2hlYXBfc3RhcnQ7IAkvKiBhZGRyZXNzICovCi0JU0lTX0lPVFlQRTEgIAkqc2lzZmJfaGVhcF9lbmQ7ICAgCS8qIGFkZHJlc3MgKi8KLQl1MzIgCSAgICAgIAlzaXNmYl9oZWFwX3NpemU7CisJdTMyCQloZWFwc3RhcnQ7CQkvKiBvZmZzZXQgICovCisJU0lTX0lPVFlQRTEJKnNpc2ZiX2hlYXBfc3RhcnQ7CS8qIGFkZHJlc3MgKi8KKwlTSVNfSU9UWVBFMQkqc2lzZmJfaGVhcF9lbmQ7CS8qIGFkZHJlc3MgKi8KKwl1MzIJCXNpc2ZiX2hlYXBfc2l6ZTsKIAlpbnQJCWhhdmVub2hlYXA7Ci0jaWYgMAotCVNJU19IRUFQICAgICAgIAlzaXNmYl9oZWFwOwotI2VuZGlmCiAKKwlzdHJ1Y3QgU0lTX0hFQVAJc2lzZmJfaGVhcDsJCS8qIFRoaXMgY2FyZCdzIHZyYW0gaGVhcCAqLwogCi0JaW50ICAgIAkJdmlkZW9fYnBwOwotCWludCAgICAJCXZpZGVvX2NtYXBfbGVuOwotCWludCAgICAJCXZpZGVvX3dpZHRoOwotCWludCAgICAJCXZpZGVvX2hlaWdodDsKLQl1bnNpZ25lZCBpbnQgCXJlZnJlc2hfcmF0ZTsKKwlpbnQJCXZpZGVvX2JwcDsKKwlpbnQJCXZpZGVvX2NtYXBfbGVuOworCWludAkJdmlkZW9fd2lkdGg7CisJaW50CQl2aWRlb19oZWlnaHQ7CisJdW5zaWduZWQgaW50CXJlZnJlc2hfcmF0ZTsKIAotCXVuc2lnbmVkIGludCAJY2hpcDsKLQl1OCAgIAkJcmV2aXNpb25faWQ7CisJdW5zaWduZWQgaW50CWNoaXA7CisJdTgJCXJldmlzaW9uX2lkOworCWludAkJc2lzdmdhX2VuYWJsZWQ7CQkvKiBQQ0kgZGV2aWNlIHdhcyBlbmFibGVkICovCiAKLQlpbnQgICAgCQl2aWRlb19saW5lbGVuZ3RoOwkvKiByZWFsIHBpdGNoICovCisJaW50CQl2aWRlb19saW5lbGVuZ3RoOwkvKiByZWFsIHBpdGNoICovCiAJaW50CQlzY3JucGl0Y2hDUlQxOwkJLyogcGl0Y2ggcmVnYXJkaW5nIGludGVybGFjZSAqLwogCi0gICAgICAgIHUxNiAJCURzdENvbG9yOwkJLyogRm9yIDJkIGFjY2VsZXJhdGlvbiAqLwotCXUzMiAgCQlTaVMzMTBfQWNjZWxEZXB0aDsKLQl1MzIgIAkJQ29tbWFuZFJlZzsKLQlpbnQJCWNtZHF1ZXVlbGVuZ3RoOworCXUxNgkJRHN0Q29sb3I7CQkvKiBGb3IgMmQgYWNjZWxlcmF0aW9uICovCisJdTMyCQlTaVMzMTBfQWNjZWxEZXB0aDsKKwl1MzIJCUNvbW1hbmRSZWc7CisJaW50CQljbWRxdWV1ZWxlbmd0aDsJCS8qIEN1cnJlbnQgKGZvciBhY2NlbCkgKi8KKwl1MzIJCWNtZFF1ZXVlU2l6ZTsJCS8qIFRvdGFsIHNpemUgaW4gS0IgKi8KIAotCXNwaW5sb2NrX3QgICAgIAlsb2NrYWNjZWw7CQkvKiBEbyBub3QgdXNlIG91dHNpZGUgb2Yga2VybmVsISAqLworCXNwaW5sb2NrX3QJbG9ja2FjY2VsOwkJLyogRG8gbm90IHVzZSBvdXRzaWRlIG9mIGtlcm5lbCEgKi8KIAotICAgICAgICB1bnNpZ25lZCBpbnQgICAJcGNpYnVzOwotCXVuc2lnbmVkIGludCAgIAlwY2lzbG90OwotCXVuc2lnbmVkIGludCAgIAlwY2lmdW5jOworCXVuc2lnbmVkIGludAlwY2lidXM7CisJdW5zaWduZWQgaW50CXBjaXNsb3Q7CisJdW5zaWduZWQgaW50CXBjaWZ1bmM7CiAKLQlpbnQgCSAgICAgICAJYWNjZWw7CisJaW50CQlhY2NlbDsKKwlpbnQJCWVuZ2luZW9rOwogCi0JdTE2IAkJc3Vic3lzdmVuZG9yOwotCXUxNiAJCXN1YnN5c2RldmljZTsKKwl1MTYJCXN1YnN5c3ZlbmRvcjsKKwl1MTYJCXN1YnN5c2RldmljZTsKIAotCXUzMiAgCQl2YmZsYWdzOwkJLyogUmVwbGFjaW5nIGRlcHJlY2F0ZWQgc3R1ZmYgZnJvbSBhYm92ZSAqLwotCXUzMiAgCQljdXJyZW50dmJmbGFnczsKKwl1MzIJCXZiZmxhZ3M7CQkvKiBSZXBsYWNpbmcgZGVwcmVjYXRlZCBzdHVmZiBmcm9tIGFib3ZlICovCisJdTMyCQljdXJyZW50dmJmbGFnczsKKwl1MzIJCXZiZmxhZ3MyOwogCiAJaW50CQlsY2R4cmVzLCBsY2R5cmVzOwogCWludAkJbGNkZGVmbW9kZWlkeCwgdHZkZWZtb2RlaWR4LCBkZWZtb2RlaWR4OwotCXUzMiAgCQlDUlQyTENEVHlwZTsgICAgICAgIAkvKiBkZWZpbmVkIGluICJTSVNfTENEX1RZUEUiICovCisJdTMyCQlDUlQyTENEVHlwZTsJCS8qIGRlZmluZWQgaW4gIlNJU19MQ0RfVFlQRSIgKi8KKwl1MzIJCWN1ckZTVE4sIGN1ckRTVE47CiAKLQlpbnQgICAgCQljdXJyZW50X2JwcDsKLQlpbnQgICAgCQljdXJyZW50X3dpZHRoOwotCWludCAgICAJCWN1cnJlbnRfaGVpZ2h0OwotCWludCAgICAJCWN1cnJlbnRfaHRvdGFsOwotCWludCAgICAJCWN1cnJlbnRfdnRvdGFsOworCWludAkJY3VycmVudF9icHA7CisJaW50CQljdXJyZW50X3dpZHRoOworCWludAkJY3VycmVudF9oZWlnaHQ7CisJaW50CQljdXJyZW50X2h0b3RhbDsKKwlpbnQJCWN1cnJlbnRfdnRvdGFsOwogCWludAkJY3VycmVudF9saW5lbGVuZ3RoOwotCV9fdTMyICAJCWN1cnJlbnRfcGl4Y2xvY2s7Ci0JaW50ICAgIAkJY3VycmVudF9yZWZyZXNoX3JhdGU7CisJX191MzIJCWN1cnJlbnRfcGl4Y2xvY2s7CisJaW50CQljdXJyZW50X3JlZnJlc2hfcmF0ZTsKIAotCXU4ICAJCW1vZGVfbm87Ci0JdTggIAkJcmF0ZV9pZHg7Ci0JaW50ICAgIAkJbW9kZWNoYW5nZWQ7Ci0JdW5zaWduZWQgY2hhciAJbW9kZXByZWNoYW5nZTsKKwl1bnNpZ25lZCBpbnQJY3VycmVudF9iYXNlOworCisJdTgJCW1vZGVfbm87CisJdTgJCXJhdGVfaWR4OworCWludAkJbW9kZWNoYW5nZWQ7CisJdW5zaWduZWQgY2hhcgltb2RlcHJlY2hhbmdlOwogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXU4IAkJc2lzZmJfbGFzdHJhdGVzWzEyOF07CisJdTgJCXNpc2ZiX2xhc3RyYXRlc1sxMjhdOwogI2VuZGlmCiAKLQlpbnQgIAkJbmV3cm9tOwotCWludCAgCQlyZWdpc3RlcmVkOworCWludAkJbmV3cm9tOworCWludAkJaGF2ZVhHSVJPTTsKKwlpbnQJCXJlZ2lzdGVyZWQ7CiAJaW50CQl3YXJuY291bnQ7CisjaWZkZWYgU0lTX09MRF9DT05GSUdfQ09NUEFUCisJaW50CQlpb2N0bDMycmVnaXN0ZXJlZDsKKyNlbmRpZgogCi0JaW50IAkJc2lzdmdhX2VuZ2luZTsKLQlpbnQgCQlod2N1cnNvcl9zaXplOwotCWludCAJCUNSVDJfd3JpdGVfZW5hYmxlOwotCXU4ICAgICAgICAgICAgCWNhcHM7CisJaW50CQlzaXN2Z2FfZW5naW5lOworCWludAkJaHdjdXJzb3Jfc2l6ZTsKKwlpbnQJCUNSVDJfd3JpdGVfZW5hYmxlOworCXU4CQljYXBzOwogCi0JdTggCQlkZXRlY3RlZHBkYzsKLQl1OCAJCWRldGVjdGVkcGRjYTsKLQl1OCAJCWRldGVjdGVkbGNkYTsKKwl1OAkJZGV0ZWN0ZWRwZGM7CisJdTgJCWRldGVjdGVkcGRjYTsKKwl1OAkJZGV0ZWN0ZWRsY2RhOwogCi0JU0lTX0lPVFlQRTEgCSpod2N1cnNvcl92YmFzZTsKKwlTSVNfSU9UWVBFMQkqaHdjdXJzb3JfdmJhc2U7CiAKLQlpbnQgCQljaHJvbnRlbHR5cGU7Ci0JaW50ICAgIAkJdHZ4cG9zLCB0dnlwb3M7Ci0JdTggICAgICAgICAgICAgIHAyXzFmLHAyXzIwLHAyXzJiLHAyXzQyLHAyXzQzLHAyXzAxLHAyXzAyOworCWludAkJY2hyb250ZWx0eXBlOworCWludAkJdHZ4cG9zLCB0dnlwb3M7CisJdTgJCXAyXzFmLHAyXzIwLHAyXzJiLHAyXzQyLHAyXzQzLHAyXzAxLHAyXzAyOwogCWludAkJdHZ4LCB0dnk7CiAKLQl1OCAJCXNpc2ZibG9ja2VkOworCXU4CQlzaXNmYmxvY2tlZDsKKworCXN0cnVjdCBzaXNmYl9pbmZvIHNpc2ZiX2luZm9ibG9jazsKKworCXN0cnVjdCBzaXNmYl9jbWQgc2lzZmJfY29tbWFuZDsKKworCXUzMgkJc2lzZmJfaWQ7CisKKwl1OAkJc2lzZmJfY2FuX3Bvc3Q7CisJdTgJCXNpc2ZiX2NhcmRfcG9zdGVkOworCXU4CQlzaXNmYl93YXNfYm9vdF9kZXZpY2U7CiAKIAlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKm5leHQ7CiB9OwogCi10eXBlZGVmIHN0cnVjdCBfU0lTX09IIHsKLQlzdHJ1Y3QgX1NJU19PSCAqcG9oX25leHQ7Ci0Jc3RydWN0IF9TSVNfT0ggKnBvaF9wcmV2OwotCXUzMiAgICAgICAgICAgIG9mZnNldDsKLQl1MzIgICAgICAgICAgICBzaXplOwotfSBTSVNfT0g7Ci0KLXR5cGVkZWYgc3RydWN0IF9TSVNfT0hBTExPQyB7Ci0Jc3RydWN0IF9TSVNfT0hBTExPQyAqcG9oYV9uZXh0OwotCVNJU19PSCBhb2hbMV07Ci19IFNJU19PSEFMTE9DOwotCi10eXBlZGVmIHN0cnVjdCBfU0lTX0hFQVAgewotCVNJU19PSCAgICAgIG9oX2ZyZWU7Ci0JU0lTX09IICAgICAgb2hfdXNlZDsKLQlTSVNfT0ggICAgICAqcG9oX2ZyZWVsaXN0OwotCVNJU19PSEFMTE9DICpwb2hhX2NoYWluOwotCXUzMiAgICAgICAgIG1heF9mcmVlc2l6ZTsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKnZpbmZvOwotfSBTSVNfSEVBUDsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5jCmluZGV4IDMwZTkwYTUuLmJhYjkzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKLSAqIFNpUyAzMDAvNjMwLzczMC81NDAvMzE1LzU1MC82NXgvNzR4LzMzMC83NjAgZnJhbWUgYnVmZmVyIGRyaXZlcgotICogZm9yIExpbnV4IGtlcm5lbHMgMi40LnggYW5kIDIuNi54CisgKiBTaVMgMzAwLzU0MC82MzBbU10vNzMwW1NdLAorICogU2lTIDMxNVtFfFBST10vNTUwL1tNXTY1MC82NTEvW01dNjYxW0Z8TV1YLzc0MC9bTV03NDFbR1hdLzMzMC9bTV03NjBbR1hdLAorICogWEdJIFYzWFQvVjUvVjgsIFo3CisgKiBmcmFtZSBidWZmZXIgZHJpdmVyIGZvciBMaW51eCBrZXJuZWxzID49IDIuNC4xNCBhbmQgPj0yLjYuMwogICoKICAqIDJEIGFjY2VsZXJhdGlvbiBwYXJ0CiAgKgpAQCAtMTksNyArMjEsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCiAgKgogICogQmFzZWQgb24gdGhlIFhGcmVlODYvWC5vcmcgZHJpdmVyIHdoaWNoIGlzCi0gKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCisgKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogQXV0aG9yOiBUaG9tYXMgV2luaXNjaGhvZmVyIDx0aG9tYXNAd2luaXNjaGhvZmVyLm5ldD4KICAqCQkJKHNlZSBodHRwOi8vd3d3LndpbmlzY2hob2Zlci5uZXQvCkBAIC0zMCwxMyArMzIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZWxlY3Rpb24uaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE4OCw3ICsxODgsNyBAQAogfQogI2VuZGlmCiAKLS8qIDMxNS8zMzAgc2VyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIDMxNS8zMzAvMzQwIHNlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogc3RhdGljIHZvaWQKQEAgLTIwMiw3ICsyMDIsNyBAQAogewogCVNpUzMxMFNldHVwRFNUQ29sb3JEZXB0aChpdmlkZW8tPkRzdENvbG9yKTsKIAlTaVMzMTBTZXR1cFNSQ1BpdGNoKGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCkKLQlTaVMzMTBTZXR1cERTVFJlY3QoaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoLCAweGZmZmYpCisJU2lTMzEwU2V0dXBEU1RSZWN0KGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCwgMHgwZmZmKQogCWlmKHRyYW5zX2NvbG9yICE9IC0xKSB7CiAJCVNpUzMxMFNldHVwUk9QKDB4MEEpCiAJCVNpUzMxMFNldHVwU1JDVHJhbnModHJhbnNfY29sb3IpCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJLyogU2lTU2V0dXBDTURGbGFnKEJJVEJMVCB8IFNSQ1ZJREVPKSAqLwogCX0KIAlTaVMzMTBTZXR1cENNREZsYWcoaXZpZGVvLT5TaVMzMTBfQWNjZWxEZXB0aCkKLQkvKiBUaGUgMzE1IHNlcmllcyBpcyBzbWFydCBlbm91Z2ggdG8ga25vdyB0aGUgZGlyZWN0aW9uICovCisJLyogVGhlIGNoaXAgaXMgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhlIGRpcmVjdGlvbiAqLwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjIzLDM1ICsyMjMsMzggQEAKIAl1MzIgc3JjYmFzZSA9IDAsIGRzdGJhc2UgPSAwOwogCWludCBteW1pbiA9IG1pbihzcmNfeSwgZHN0X3kpOwogCWludCBteW1heCA9IG1heChzcmNfeSwgZHN0X3kpOwotCQorCiAJLyogQWx0aG91Z2ggdGhlIGNoaXAga25vd3MgdGhlIGRpcmVjdGlvbiB0byB1c2UKLQkgKiBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmVhcyBvdmVybGFwLCAKKwkgKiBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmVhcyBvdmVybGFwLAogCSAqIHRoYXQgbG9naWMgZmFpbHMgaWYgd2UgZmlkZGxlIHdpdGggdGhlIGJpdG1hcAogCSAqIGFkZHJlc3Nlcy4gVGhlcmVmb3JlLCB3ZSBjaGVjayBpZiB0aGUgc291cmNlCi0JICogYW5kIGRlc3RpbmF0aW9uIGJsaXR0aW5nIGFyZWFzIG92ZXJsYXAgYW5kIAotCSAqIGFkYXB0IHRoZSBiaXRtYXAgYWRkcmVzc2VzIHN5bmNocm9ub3VzbHkgCisJICogYW5kIGRlc3RpbmF0aW9uIGJsaXR0aW5nIGFyZWFzIG92ZXJsYXAgYW5kCisJICogYWRhcHQgdGhlIGJpdG1hcCBhZGRyZXNzZXMgc3luY2hyb25vdXNseQogCSAqIGlmIHRoZSBjb29yZGluYXRlcyBleGNlZWQgdGhlIHZhbGlkIHJhbmdlLgotCSAqIFRoZSB0aGUgYXJlYXMgZG8gbm90IG92ZXJsYXAsIHdlIGRvIG91ciAKKwkgKiBUaGUgdGhlIGFyZWFzIGRvIG5vdCBvdmVybGFwLCB3ZSBkbyBvdXIKIAkgKiBub3JtYWwgY2hlY2suCiAJICovCi0JaWYoKG15bWF4IC0gbXltaW4pIDwgaGVpZ2h0KSB7IAotCSAgIGlmKChzcmNfeSA+PSAyMDQ4KSB8fCAoZHN0X3kgPj0gMjA0OCkpIHsJICAgICAgCi0JICAgICAgc3JjYmFzZSA9IGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCAqIG15bWluOwotCSAgICAgIGRzdGJhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBteW1pbjsKLQkgICAgICBzcmNfeSAtPSBteW1pbjsKLQkgICAgICBkc3RfeSAtPSBteW1pbjsKLQkgICB9CisJaWYoKG15bWF4IC0gbXltaW4pIDwgaGVpZ2h0KSB7CisJCWlmKChzcmNfeSA+PSAyMDQ4KSB8fCAoZHN0X3kgPj0gMjA0OCkpIHsKKwkJCXNyY2Jhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBteW1pbjsKKwkJCWRzdGJhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBteW1pbjsKKwkJCXNyY195IC09IG15bWluOworCQkJZHN0X3kgLT0gbXltaW47CisJCX0KIAl9IGVsc2UgewotCSAgIGlmKHNyY195ID49IDIwNDgpIHsKLQkgICAgICBzcmNiYXNlID0gaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoICogc3JjX3k7Ci0JICAgICAgc3JjX3kgPSAwOwotCSAgIH0KLQkgICBpZihkc3RfeSA+PSAyMDQ4KSB7Ci0JICAgICAgZHN0YmFzZSA9IGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCAqIGRzdF95OwotCSAgICAgIGRzdF95ID0gMDsKLQkgICB9CisJCWlmKHNyY195ID49IDIwNDgpIHsKKwkJCXNyY2Jhc2UgPSBpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGggKiBzcmNfeTsKKwkJCXNyY195ID0gMDsKKwkJfQorCQlpZihkc3RfeSA+PSAyMDQ4KSB7CisJCQlkc3RiYXNlID0gaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoICogZHN0X3k7CisJCQlkc3RfeSA9IDA7CisJCX0KIAl9CiAKKwlzcmNiYXNlICs9IGl2aWRlby0+dmlkZW9fb2Zmc2V0OworCWRzdGJhc2UgKz0gaXZpZGVvLT52aWRlb19vZmZzZXQ7CisKIAlTaVMzMTBTZXR1cFNSQ0Jhc2Uoc3JjYmFzZSk7CiAJU2lTMzEwU2V0dXBEU1RCYXNlKGRzdGJhc2UpOwogCVNpUzMxMFNldHVwUmVjdCh3aWR0aCwgaGVpZ2h0KQpAQCAtMjY0LDcgKzI2Nyw3IEBACiBTaVMzMTBTZXR1cEZvclNvbGlkRmlsbChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgdTMyIGNvbG9yLCBpbnQgcm9wKQogewogCVNpUzMxMFNldHVwUEFURkcoY29sb3IpCi0JU2lTMzEwU2V0dXBEU1RSZWN0KGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCwgMHhmZmZmKQorCVNpUzMxMFNldHVwRFNUUmVjdChpdmlkZW8tPnZpZGVvX2xpbmVsZW5ndGgsIDB4MGZmZikKIAlTaVMzMTBTZXR1cERTVENvbG9yRGVwdGgoaXZpZGVvLT5Ec3RDb2xvcik7CiAJU2lTMzEwU2V0dXBST1Aoc2lzUGF0QUxVQ29udltyb3BdKQogCVNpUzMxMFNldHVwQ01ERmxhZyhQQVRGRyB8IGl2aWRlby0+U2lTMzEwX0FjY2VsRGVwdGgpCkBAIC0yNzksNiArMjgyLDcgQEAKIAkJZHN0YmFzZSA9IGl2aWRlby0+dmlkZW9fbGluZWxlbmd0aCAqIHk7CiAJCXkgPSAwOwogCX0KKwlkc3RiYXNlICs9IGl2aWRlby0+dmlkZW9fb2Zmc2V0OwogCVNpUzMxMFNldHVwRFNUQmFzZShkc3RiYXNlKQogCVNpUzMxMFNldHVwRFNUWFkoeCx5KQogCVNpUzMxMFNldHVwUmVjdCh3LGgpCkBAIC0yOTQsMzg0ICsyOTgsMTUzIEBACiBpbnQgc2lzZmJfaW5pdGFjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogI2lmZGVmIFNJU0ZCX1VTRV9TUElOTE9DS1MKLSAgICBzcGluX2xvY2tfaW5pdCgmaXZpZGVvLT5sb2NrYWNjZWwpOworCXNwaW5fbG9ja19pbml0KCZpdmlkZW8tPmxvY2thY2NlbCk7CiAjZW5kaWYKLSAgICByZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgc2lzZmJfc3luY2FjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICAgCVNpUzMwMFN5bmMoaXZpZGVvKTsKKwkJU2lTMzAwU3luYyhpdmlkZW8pOwogI2VuZGlmCi0gICAgfSBlbHNlIHsKKwl9IGVsc2UgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0gICAgCVNpUzMxMFN5bmMoaXZpZGVvKTsKKwkJU2lTMzEwU3luYyhpdmlkZW8pOwogI2VuZGlmCi0gICAgfQorCX0KIH0KIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkgIC8qIC0tLS0tLS0tLS0tLS0tLSAyLjUgLS0tLS0tLS0tLS0tLS0tICovCiAKIGludCBmYmNvbl9zaXNfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLSAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLSAgIENSSVRGTEFHUworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKKwlDUklURkxBR1MKIAotICAgaWYoIWl2aWRlby0+YWNjZWwpCi0gICAJcmV0dXJuIDA7CisJaWYoKCFpdmlkZW8tPmFjY2VsKSB8fCAoIWl2aWRlby0+ZW5naW5lb2spKQorCQlyZXR1cm4gMDsKIAotICAgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLSAgICAgIFNpUzMwMFN5bmMoaXZpZGVvKTsKLSNlbmRpZgotICAgfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotICAgICAgU2lTMzEwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0gICB9Ci0gICBDUklURU5ECi0gICByZXR1cm4gMDsKKwlDUklUQkVHSU4KKwlzaXNmYl9zeW5jYWNjZWwoaXZpZGVvKTsKKwlDUklURU5ECisKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBmYmNvbl9zaXNfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKLSAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLSAgIHUzMiBjb2wgPSAwOwotICAgdTMyIHZ4cmVzID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbDsKLSAgIHUzMiB2eXJlcyA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7Ci0gICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgIENSSVRGTEFHUworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKKwl1MzIgY29sID0gMDsKKwl1MzIgdnhyZXMgPSBpbmZvLT52YXIueHJlc192aXJ0dWFsOworCXUzMiB2eXJlcyA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJQ1JJVEZMQUdTCiAKLSAgIGlmKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKSB7Ci0JcmV0dXJuOwotICAgfQorCWlmKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CiAKLSAgIGlmKCFpdmlkZW8tPmFjY2VsKSB7Ci0JY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOwotCXJldHVybjsKLSAgIH0KLSAgIAotICAgaWYoIXJlY3QtPndpZHRoIHx8ICFyZWN0LT5oZWlnaHQgfHwgcmVjdC0+ZHggPj0gdnhyZXMgfHwgcmVjdC0+ZHkgPj0gdnlyZXMpIHsKLQlyZXR1cm47Ci0gICB9CisJaWYoKCFpdmlkZW8tPmFjY2VsKSB8fCAoIWl2aWRlby0+ZW5naW5lb2spKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAotICAgLyogQ2xpcHBpbmcgKi8KLSAgIHdpZHRoID0gKChyZWN0LT5keCArIHJlY3QtPndpZHRoKSA+IHZ4cmVzKSA/ICh2eHJlcyAtIHJlY3QtPmR4KSA6IHJlY3QtPndpZHRoOwotICAgaGVpZ2h0ID0gKChyZWN0LT5keSArIHJlY3QtPmhlaWdodCkgPiB2eXJlcykgPyAodnlyZXMgLSByZWN0LT5keSkgOiByZWN0LT5oZWlnaHQ7CisJaWYoIXJlY3QtPndpZHRoIHx8ICFyZWN0LT5oZWlnaHQgfHwgcmVjdC0+ZHggPj0gdnhyZXMgfHwgcmVjdC0+ZHkgPj0gdnlyZXMpCisJCXJldHVybjsKIAotICAgc3dpdGNoKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCS8qIENsaXBwaW5nICovCisJd2lkdGggPSAoKHJlY3QtPmR4ICsgcmVjdC0+d2lkdGgpID4gdnhyZXMpID8gKHZ4cmVzIC0gcmVjdC0+ZHgpIDogcmVjdC0+d2lkdGg7CisJaGVpZ2h0ID0gKChyZWN0LT5keSArIHJlY3QtPmhlaWdodCkgPiB2eXJlcykgPyAodnlyZXMgLSByZWN0LT5keSkgOiByZWN0LT5oZWlnaHQ7CisKKwlzd2l0Y2goaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OiAgY29sID0gcmVjdC0+Y29sb3I7CiAJCSBicmVhazsKIAljYXNlIDE2OgogCWNhc2UgMzI6IGNvbCA9ICgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVjdC0+Y29sb3JdOwogCQkgYnJlYWs7Ci0gICB9CisJfQogCi0gICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAotICAgICAgQ1JJVEJFR0lOCi0gICAgICBTaVMzMDBTZXR1cEZvclNvbGlkRmlsbChpdmlkZW8sIGNvbCwgbXlyb3BzW3JlY3QtPnJvcF0pOwotICAgICAgU2lTMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgQ1JJVEVORAotICAgICAgU2lTMzAwU3luYyhpdmlkZW8pOworCQlDUklUQkVHSU4KKwkJU2lTMzAwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCBjb2wsIG15cm9wc1tyZWN0LT5yb3BdKTsKKwkJU2lTMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOworCQlDUklURU5ECiAjZW5kaWYKLSAgIH0gZWxzZSB7CisJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotICAgICAgQ1JJVEJFR0lOCi0gICAgICBTaVMzMTBTZXR1cEZvclNvbGlkRmlsbChpdmlkZW8sIGNvbCwgbXlyb3BzW3JlY3QtPnJvcF0pOwotICAgICAgU2lTMzEwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgQ1JJVEVORAotICAgICAgU2lTMzEwU3luYyhpdmlkZW8pOworCQlDUklUQkVHSU4KKwkJU2lTMzEwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCBjb2wsIG15cm9wc1tyZWN0LT5yb3BdKTsKKwkJU2lTMzEwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCByZWN0LT5keCwgcmVjdC0+ZHksIHdpZHRoLCBoZWlnaHQpOworCQlDUklURU5ECiAjZW5kaWYKLSAgIH0KKwl9CiAKKwlzaXNmYl9zeW5jYWNjZWwoaXZpZGVvKTsKIH0KIAogdm9pZCBmYmNvbl9zaXNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKIHsKLSAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLSAgIHUzMiB2eHJlcyA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7Ci0gICB1MzIgdnlyZXMgPSBpbmZvLT52YXIueXJlc192aXJ0dWFsOwotICAgaW50IHdpZHRoID0gYXJlYS0+d2lkdGg7Ci0gICBpbnQgaGVpZ2h0ID0gYXJlYS0+aGVpZ2h0OwotICAgQ1JJVEZMQUdTCisJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOworCXUzMiB2eHJlcyA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7CisJdTMyIHZ5cmVzID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKKwlpbnQgd2lkdGggPSBhcmVhLT53aWR0aDsKKwlpbnQgaGVpZ2h0ID0gYXJlYS0+aGVpZ2h0OworCUNSSVRGTEFHUwogCi0gICBpZihpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykgewotCXJldHVybjsKLSAgIH0KKwlpZihpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOwogCi0gICBpZighaXZpZGVvLT5hY2NlbCkgewotICAgCWNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKLQlyZXR1cm47Ci0gICB9CisJaWYoKCFpdmlkZW8tPmFjY2VsKSB8fCAoIWl2aWRlby0+ZW5naW5lb2spKSB7CisJCWNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKKwkJcmV0dXJuOworCX0KIAotICAgaWYoIXdpZHRoIHx8ICFoZWlnaHQgfHwKLSAgICAgIGFyZWEtPnN4ID49IHZ4cmVzIHx8IGFyZWEtPnN5ID49IHZ5cmVzIHx8Ci0gICAgICBhcmVhLT5keCA+PSB2eHJlcyB8fCBhcmVhLT5keSA+PSB2eXJlcykgewotICAgCXJldHVybjsKLSAgIH0KKwlpZighd2lkdGggfHwgIWhlaWdodCB8fAorCSAgIGFyZWEtPnN4ID49IHZ4cmVzIHx8IGFyZWEtPnN5ID49IHZ5cmVzIHx8CisJICAgYXJlYS0+ZHggPj0gdnhyZXMgfHwgYXJlYS0+ZHkgPj0gdnlyZXMpCisJCXJldHVybjsKIAotICAgLyogQ2xpcHBpbmcgKi8KLSAgIGlmKChhcmVhLT5zeCArIHdpZHRoKSA+IHZ4cmVzKSB3aWR0aCA9IHZ4cmVzIC0gYXJlYS0+c3g7Ci0gICBpZigoYXJlYS0+ZHggKyB3aWR0aCkgPiB2eHJlcykgd2lkdGggPSB2eHJlcyAtIGFyZWEtPmR4OwotICAgaWYoKGFyZWEtPnN5ICsgaGVpZ2h0KSA+IHZ5cmVzKSBoZWlnaHQgPSB2eXJlcyAtIGFyZWEtPnN5OwotICAgaWYoKGFyZWEtPmR5ICsgaGVpZ2h0KSA+IHZ5cmVzKSBoZWlnaHQgPSB2eXJlcyAtIGFyZWEtPmR5OworCS8qIENsaXBwaW5nICovCisJaWYoKGFyZWEtPnN4ICsgd2lkdGgpID4gdnhyZXMpIHdpZHRoID0gdnhyZXMgLSBhcmVhLT5zeDsKKwlpZigoYXJlYS0+ZHggKyB3aWR0aCkgPiB2eHJlcykgd2lkdGggPSB2eHJlcyAtIGFyZWEtPmR4OworCWlmKChhcmVhLT5zeSArIGhlaWdodCkgPiB2eXJlcykgaGVpZ2h0ID0gdnlyZXMgLSBhcmVhLT5zeTsKKwlpZigoYXJlYS0+ZHkgKyBoZWlnaHQpID4gdnlyZXMpIGhlaWdodCA9IHZ5cmVzIC0gYXJlYS0+ZHk7CiAKLSAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICAgICBpbnQgeGRpciwgeWRpcjsKKwkJaW50IHhkaXIsIHlkaXI7CiAKLSAgICAgIGlmKGFyZWEtPnN4IDwgYXJlYS0+ZHgpIHhkaXIgPSAwOwotICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgeGRpciA9IDE7Ci0gICAgICBpZihhcmVhLT5zeSA8IGFyZWEtPmR5KSB5ZGlyID0gMDsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIHlkaXIgPSAxOworCQlpZihhcmVhLT5zeCA8IGFyZWEtPmR4KSB4ZGlyID0gMDsKKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgeGRpciA9IDE7CisJCWlmKGFyZWEtPnN5IDwgYXJlYS0+ZHkpIHlkaXIgPSAwOworCQllbHNlICAgICAgICAgICAgICAgICAgICB5ZGlyID0gMTsKIAotICAgICAgQ1JJVEJFR0lOCi0gICAgICBTaVMzMDBTZXR1cEZvclNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIHhkaXIsIHlkaXIsIDMsIC0xKTsKLSAgICAgIFNpUzMwMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBhcmVhLT5zeCwgYXJlYS0+c3ksIGFyZWEtPmR4LCBhcmVhLT5keSwKLSAgICAgIAkJCQkJIHdpZHRoLCBoZWlnaHQpOwotICAgICAgQ1JJVEVORAotICAgICAgU2lTMzAwU3luYyhpdmlkZW8pOworCQlDUklUQkVHSU4KKwkJU2lTMzAwU2V0dXBGb3JTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCB4ZGlyLCB5ZGlyLCAzLCAtMSk7CisJCVNpUzMwMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBhcmVhLT5zeCwgYXJlYS0+c3ksCisJCQkJCWFyZWEtPmR4LCBhcmVhLT5keSwgd2lkdGgsIGhlaWdodCk7CisJCUNSSVRFTkQKICNlbmRpZgotICAgfSBlbHNlIHsKKwl9IGVsc2UgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0gICAgICBDUklUQkVHSU4KLSAgICAgIFNpUzMxMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGl2aWRlbywgMywgLTEpOwotICAgICAgU2lTMzEwU3Vic2VxdWVudFNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIGFyZWEtPnN4LCBhcmVhLT5zeSwgYXJlYS0+ZHgsIGFyZWEtPmR5LAotICAgICAgCQkJCQkgd2lkdGgsIGhlaWdodCk7Ci0gICAgICBDUklURU5ECi0gICAgICBTaVMzMTBTeW5jKGl2aWRlbyk7CisJCUNSSVRCRUdJTgorCQlTaVMzMTBTZXR1cEZvclNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIDMsIC0xKTsKKwkJU2lTMzEwU3Vic2VxdWVudFNjcmVlblRvU2NyZWVuQ29weShpdmlkZW8sIGFyZWEtPnN4LCBhcmVhLT5zeSwKKwkJCQkJYXJlYS0+ZHgsIGFyZWEtPmR5LCB3aWR0aCwgaGVpZ2h0KTsKKwkJQ1JJVEVORAogI2VuZGlmCi0gICB9CisJfQorCisJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CiB9CiAKICNlbmRpZgogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApICAvKiAtLS0tLS0tLS0tLS0tLSAyLjQgLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgZmJjb25fc2lzX2Jtb3ZlKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3JjeSwgaW50IHNyY3gsCi0JCQkgICAgaW50IGRzdHksIGludCBkc3R4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopcC0+ZmJfaW5mby0+cGFyOwotCi0JQ1JJVEZMQUdTCi0KLQlpZighaXZpZGVvLT5hY2NlbCkgewotCSAgICBzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKLQkgICAgY2FzZSA4OgotI2lmZGVmIEZCQ09OX0hBU19DRkI4Ci0JICAgICAgIGZiY29uX2NmYjhfYm1vdmUocCwgc3JjeSwgc3JjeCwgZHN0eSwgZHN0eCwgaGVpZ2h0LCB3aWR0aCk7Ci0jZW5kaWYKLQkgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTY6Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JICAgICAgIGZiY29uX2NmYjE2X2Jtb3ZlKHAsIHNyY3ksIHNyY3gsIGRzdHksIGRzdHgsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotI2lmZGVmIEZCQ09OX0hBU19DRkIzMgotCSAgICAgICBmYmNvbl9jZmIzMl9ibW92ZShwLCBzcmN5LCBzcmN4LCBkc3R5LCBkc3R4LCBoZWlnaHQsIHdpZHRoKTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQkgICAgcmV0dXJuOwotCX0KLQotCXNyY3ggKj0gZm9udHdpZHRoKHApOwotCXNyY3kgKj0gZm9udGhlaWdodChwKTsKLQlkc3R4ICo9IGZvbnR3aWR0aChwKTsKLQlkc3R5ICo9IGZvbnRoZWlnaHQocCk7Ci0Jd2lkdGggKj0gZm9udHdpZHRoKHApOwotCWhlaWdodCAqPSBmb250aGVpZ2h0KHApOwotCi0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLQkgICBpbnQgeGRpciwgeWRpcjsKLQotCSAgIGlmKHNyY3ggPCBkc3R4KSB4ZGlyID0gMDsKLQkgICBlbHNlICAgICAgICAgICAgeGRpciA9IDE7Ci0JICAgaWYoc3JjeSA8IGRzdHkpIHlkaXIgPSAwOwotCSAgIGVsc2UgICAgICAgICAgICB5ZGlyID0gMTsKLQotCSAgIENSSVRCRUdJTgotCSAgIFNpUzMwMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGl2aWRlbywgeGRpciwgeWRpciwgMywgLTEpOwotCSAgIFNpUzMwMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBzcmN4LCBzcmN5LCBkc3R4LCBkc3R5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgU2lTMzAwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCSAgIENSSVRCRUdJTgotCSAgIFNpUzMxMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGl2aWRlbywgMywgLTEpOwotCSAgIFNpUzMxMFN1YnNlcXVlbnRTY3JlZW5Ub1NjcmVlbkNvcHkoaXZpZGVvLCBzcmN4LCBzcmN5LCBkc3R4LCBkc3R5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgU2lTMzEwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfQotfQotCi1zdGF0aWMgdm9pZCBmYmNvbl9zaXNfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJaW50IHNyY3ksIGludCBzcmN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBjb2xvcikKLXsKLSAgICAgICAgc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopcC0+ZmJfaW5mby0+cGFyOwotCUNSSVRGTEFHUwotCi0Jc3JjeCAqPSBmb250d2lkdGgocCk7Ci0Jc3JjeSAqPSBmb250aGVpZ2h0KHApOwotCXdpZHRoICo9IGZvbnR3aWR0aChwKTsKLQloZWlnaHQgKj0gZm9udGhlaWdodChwKTsKLQotCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JICAgQ1JJVEJFR0lOCi0JICAgU2lTMzAwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCBjb2xvciwgMyk7Ci0JICAgU2lTMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaXZpZGVvLCBzcmN4LCBzcmN5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgU2lTMzAwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCSAgIENSSVRCRUdJTgotCSAgIFNpUzMxMFNldHVwRm9yU29saWRGaWxsKGl2aWRlbywgY29sb3IsIDMpOwotCSAgIFNpUzMxMFN1YnNlcXVlbnRTb2xpZEZpbGxSZWN0KGl2aWRlbywgc3JjeCwgc3JjeSwgd2lkdGgsIGhlaWdodCk7Ci0JICAgQ1JJVEVORAotCSAgIFNpUzMxMFN5bmMoaXZpZGVvKTsKLSNlbmRpZgotCX0KLX0KLQotdm9pZCBmYmNvbl9zaXNfY2xlYXI4KHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCWludCBzcmN5LCBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKXAtPmZiX2luZm8tPnBhcjsKLQl1MzIgYmd4OwotCi0JaWYoIWl2aWRlby0+YWNjZWwpIHsKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAotCSAgICBmYmNvbl9jZmI4X2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgIHJldHVybjsKLQl9Ci0KLQliZ3ggPSBhdHRyX2JnY29sX2VjKHAsIGNvbnApOwotCWZiY29uX3Npc19jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoLCBiZ3gpOwotfQotCi12b2lkIGZiY29uX3Npc19jbGVhcjE2KHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCWludCBzcmN5LCBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotICAgICAgICBzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilwLT5mYl9pbmZvLT5wYXI7Ci0JdTMyIGJneDsKLQotCWlmKCFpdmlkZW8tPmFjY2VsKSB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JICAgIGZiY29uX2NmYjE2X2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgIHJldHVybjsKLQl9Ci0KLQliZ3ggPSAoKHVfaW50MTZfdCopcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2xfZWMocCwgY29ucCldOwotCWZiY29uX3Npc19jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoLCBiZ3gpOwotfQotCi12b2lkIGZiY29uX3Npc19jbGVhcjMyKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCWludCBzcmN5LCBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKXAtPmZiX2luZm8tPnBhcjsKLQl1MzIgYmd4OwotCi0JaWYoIWl2aWRlby0+YWNjZWwpIHsKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLQkgICAgZmJjb25fY2ZiMzJfY2xlYXIoY29ucCwgcCwgc3JjeSwgc3JjeCwgaGVpZ2h0LCB3aWR0aCk7Ci0jZW5kaWYKLQkgICAgcmV0dXJuOwotCX0KLQotCWJneCA9ICgodV9pbnQzMl90KilwLT5kaXNwc3dfZGF0YSlbYXR0cl9iZ2NvbF9lYyhwLCBjb25wKV07Ci0JZmJjb25fc2lzX2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgsIGJneCk7Ci19Ci0KLXZvaWQgZmJjb25fc2lzX3JldmMoc3RydWN0IGRpc3BsYXkgKnAsIGludCBzcmN4LCBpbnQgc3JjeSkKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilwLT5mYl9pbmZvLT5wYXI7Ci0JQ1JJVEZMQUdTCi0KLQlpZighaXZpZGVvLT5hY2NlbCkgewotCSAgICBzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKLQkgICAgY2FzZSAxNjoKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQkgICAgICAgZmJjb25fY2ZiMTZfcmV2YyhwLCBzcmN4LCBzcmN5KTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLQkgICAgICAgZmJjb25fY2ZiMzJfcmV2YyhwLCBzcmN4LCBzcmN5KTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQkgICAgcmV0dXJuOwotCX0KLQotCXNyY3ggKj0gZm9udHdpZHRoKHApOwotCXNyY3kgKj0gZm9udGhlaWdodChwKTsKLQotCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JICAgQ1JJVEJFR0lOCi0JICAgU2lTMzAwU2V0dXBGb3JTb2xpZEZpbGwoaXZpZGVvLCAwLCAweDBhKTsKLQkgICBTaVMzMDBTdWJzZXF1ZW50U29saWRGaWxsUmVjdChpdmlkZW8sIHNyY3gsIHNyY3ksIGZvbnR3aWR0aChwKSwgZm9udGhlaWdodChwKSk7Ci0JICAgQ1JJVEVORAotCSAgIFNpUzMwMFN5bmMoaXZpZGVvKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKLQkgICBDUklUQkVHSU4KLQkgICBTaVMzMTBTZXR1cEZvclNvbGlkRmlsbChpdmlkZW8sIDAsIDB4MGEpOwotCSAgIFNpUzMxMFN1YnNlcXVlbnRTb2xpZEZpbGxSZWN0KGl2aWRlbywgc3JjeCwgc3JjeSwgZm9udHdpZHRoKHApLCBmb250aGVpZ2h0KHApKTsKLQkgICBDUklURU5ECi0JICAgU2lTMzEwU3luYyhpdmlkZW8pOwotI2VuZGlmCi0JfQotfQotCi0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLXN0cnVjdCBkaXNwbGF5X3N3aXRjaCBmYmNvbl9zaXM4ID0gewotCS5zZXR1cAkJPSBmYmNvbl9jZmI4X3NldHVwLAotCS5ibW92ZQkJPSBmYmNvbl9zaXNfYm1vdmUsCi0JLmNsZWFyCQk9IGZiY29uX3Npc19jbGVhcjgsCi0JLnB1dGMJCT0gZmJjb25fY2ZiOF9wdXRjLAotCS5wdXRjcwkJPSBmYmNvbl9jZmI4X3B1dGNzLAotCS5yZXZjCQk9IGZiY29uX2NmYjhfcmV2YywKLQkuY2xlYXJfbWFyZ2lucwk9IGZiY29uX2NmYjhfY2xlYXJfbWFyZ2lucywKLQkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci1zdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fc2lzMTYgPSB7Ci0JLnNldHVwCQk9IGZiY29uX2NmYjE2X3NldHVwLAotCS5ibW92ZQkJPSBmYmNvbl9zaXNfYm1vdmUsCi0JLmNsZWFyCQk9IGZiY29uX3Npc19jbGVhcjE2LAotCS5wdXRjCQk9IGZiY29uX2NmYjE2X3B1dGMsCi0JLnB1dGNzCQk9IGZiY29uX2NmYjE2X3B1dGNzLAotCS5yZXZjCQk9IGZiY29uX3Npc19yZXZjLAotCS5jbGVhcl9tYXJnaW5zCT0gZmJjb25fY2ZiMTZfY2xlYXJfbWFyZ2lucywKLQkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi1zdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fc2lzMzIgPSB7Ci0JLnNldHVwCQk9IGZiY29uX2NmYjMyX3NldHVwLAotCS5ibW92ZQkJPSBmYmNvbl9zaXNfYm1vdmUsCi0JLmNsZWFyCQk9IGZiY29uX3Npc19jbGVhcjMyLAotCS5wdXRjCQk9IGZiY29uX2NmYjMyX3B1dGMsCi0JLnB1dGNzCQk9IGZiY29uX2NmYjMyX3B1dGNzLAotCS5yZXZjCQk9IGZiY29uX3Npc19yZXZjLAotCS5jbGVhcl9tYXJnaW5zCT0gZmJjb25fY2ZiMzJfY2xlYXJfbWFyZ2lucywKLQkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCisjaW5jbHVkZSAic2lzZmJfYWNjZWxfMl80LmgiCiAKICNlbmRpZiAvKiBLRVJORUwgVkVSU0lPTiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfYWNjZWwuaCBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5oCmluZGV4IGJiMjhmMzMuLjA0NmUyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19hY2NlbC5oCkBAIC0xLDYgKzEsOCBAQAogLyoKLSAqIFNpUyAzMDAvNjMwLzczMC81NDAvMzE1LzU1MC82NTAvNzQwIGZyYW1lIGJ1ZmZlciBkcml2ZXIKLSAqIGZvciBMaW51eCBrZXJuZWxzIDIuNC54IGFuZCAyLjUueAorICogU2lTIDMwMC81NDAvNjMwW1NdLzczMFtTXSwKKyAqIFNpUyAzMTVbRXxQUk9dLzU1MC9bTV02NTAvNjUxL1tNXTY2MVtGfE1dWC83NDAvW01dNzQxW0dYXS8zMzAvW01dNzYwW0dYXSwKKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNworICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PSAyLjQuMTQgYW5kID49Mi42LjMKICAqCiAgKiAyRCBhY2NlbGVyYXRpb24gcGFydAogICoKQEAgLTI4Myw2ICsyODUsOCBAQAogICB7IFwKICAgCXdoaWxlKCAoTU1JT19JTjE2KGl2aWRlby0+bW1pb192YmFzZSwgUV9TVEFUVVMrMikgJiAweDgwMDApICE9IDB4ODAwMCl7fTsgXAogICAJd2hpbGUoIChNTUlPX0lOMTYoaXZpZGVvLT5tbWlvX3ZiYXNlLCBRX1NUQVRVUysyKSAmIDB4ODAwMCkgIT0gMHg4MDAwKXt9OyBcCisJd2hpbGUoIChNTUlPX0lOMTYoaXZpZGVvLT5tbWlvX3ZiYXNlLCBRX1NUQVRVUysyKSAmIDB4ODAwMCkgIT0gMHg4MDAwKXt9OyBcCisgIAl3aGlsZSggKE1NSU9fSU4xNihpdmlkZW8tPm1taW9fdmJhc2UsIFFfU1RBVFVTKzIpICYgMHg4MDAwKSAhPSAweDgwMDApe307IFwKICAgCUNtZFF1ZUxlbiA9IDA7IFwKICAgfQogCkBAIC00MDIsNiArNDA2LDcgQEAKIAkJCWludCBzcmN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOwogI2VuZGlmCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwzNCkKK2ludCAgZmJjb25fc2lzX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pOwogdm9pZCBmYmNvbl9zaXNfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CiB2b2lkIGZiY29uX3Npc19jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKaW5kZXggNjk4MjY2MC4uNDJjNTRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCkBAIC0xLDkgKzEsMTAgQEAKIC8qCi0gKiBTaVMgMzAwLzMwNS81NDAvNjMwKFMpLzczMChTKQotICogU2lTIDMxNShIL1BSTykvNTV4LyhNKTY1eC8oTSk2NjEoRi9NKVgvNzQwLzc0MShHWCkvMzMwLyhNKTc2MAorICogU2lTIDMwMC81NDAvNjMwW1NdLzczMFtTXSwKKyAqIFNpUyAzMTVbRXxQUk9dLzU1MC9bTV02NXgvW01dNjZ4W0Z8TXxHXVgvW01dNzR4W0dYXS8zMzAvW01dNzZ4W0dYXSwKKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNwogICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PSAyLjQuMTQgYW5kID49Mi42LjMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xOSwxMSArMjAsMTEgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKICAqCi0gKiBBdXRob3I6ICAgCVRob21hcyBXaW5pc2NoaG9mZXIgPHRob21hc0B3aW5pc2NoaG9mZXIubmV0PgorICogQXV0aG9yOglUaG9tYXMgV2luaXNjaGhvZmVyIDx0aG9tYXNAd2luaXNjaGhvZmVyLm5ldD4KICAqCiAgKiBBdXRob3Igb2YgKHByYWN0aWNhbGx5IHdpcGVkKSBjb2RlIGJhc2U6CiAgKgkJU2lTICh3d3cuc2lzLmNvbSkKLSAqCSAJQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zLCBJbmMuCisgKgkJQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zLCBJbmMuCiAgKgogICogU2VlIGh0dHA6Ly93d3cud2luaXNjaGhvZmVyLm5ldC8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIHVwZGF0ZXMKICAqCkBAIC00NiwxNiArNDcsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjZW5kaWYKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtOTQsNzEgKzk0LDc1IEBACiAjZW5kaWYKICNlbmRpZgogCitzdGF0aWMgdm9pZCBzaXNmYl9oYW5kbGVfY29tbWFuZChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywKKwkJCQkgc3RydWN0IHNpc2ZiX2NtZCAqc2lzZmJfY29tbWFuZCk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBoZWxwZXIgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHZvaWQgX19pbml0CiBzaXNmYl9zZXRkZWZhdWx0cGFybXModm9pZCkKIHsKLQlzaXNmYl9vZmYgCQk9IDA7Ci0Jc2lzZmJfcGFybV9tZW0gCQk9IDA7Ci0Jc2lzZmJfYWNjZWwgCQk9IC0xOwotCXNpc2ZiX3lwYW4gICAgICAJPSAtMTsKLQlzaXNmYl9tYXggCQk9IC0xOwotCXNpc2ZiX3VzZXJvbSAgICAJPSAtMTsKLSAgICAgICAgc2lzZmJfdXNlb2VtICAgIAk9IC0xOworCXNpc2ZiX29mZgkJPSAwOworCXNpc2ZiX3Bhcm1fbWVtCQk9IDA7CisJc2lzZmJfYWNjZWwJCT0gLTE7CisJc2lzZmJfeXBhbgkJPSAtMTsKKwlzaXNmYl9tYXgJCT0gLTE7CisJc2lzZmJfdXNlcm9tCQk9IC0xOworCXNpc2ZiX3VzZW9lbQkJPSAtMTsKICNpZmRlZiBNT0RVTEUKIAkvKiBNb2R1bGU6ICJOb25lIiBmb3IgMi40LCBkZWZhdWx0IG1vZGUgZm9yIDIuNSsgKi8KICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2lzZmJfbW9kZV9pZHggCQk9IC0xOworCXNpc2ZiX21vZGVfaWR4CQk9IC0xOwogI2Vsc2UKLQlzaXNmYl9tb2RlX2lkeCAgCT0gTU9ERV9JTkRFWF9OT05FOworCXNpc2ZiX21vZGVfaWR4CQk9IE1PREVfSU5ERVhfTk9ORTsKICNlbmRpZgogI2Vsc2UKIAkvKiBTdGF0aWM6IERlZmF1bHQgbW9kZSAqLwotCXNpc2ZiX21vZGVfaWR4ICAJPSAtMTsKKwlzaXNmYl9tb2RlX2lkeAkJPSAtMTsKICNlbmRpZgotCXNpc2ZiX3Bhcm1fcmF0ZSAJPSAtMTsKLQlzaXNmYl9jcnQxb2ZmIAkJPSAwOwotCXNpc2ZiX2ZvcmNlY3J0MSAJPSAtMTsKLQlzaXNmYl9jcnQydHlwZSAgCT0gLTE7Ci0Jc2lzZmJfY3J0MmZsYWdzIAk9IDA7Ci0Jc2lzZmJfcGRjIAkJPSAweGZmOwotCXNpc2ZiX3BkY2EgCQk9IDB4ZmY7Ci0Jc2lzZmJfc2NhbGVsY2QgIAk9IC0xOworCXNpc2ZiX3Bhcm1fcmF0ZQkJPSAtMTsKKwlzaXNmYl9jcnQxb2ZmCQk9IDA7CisJc2lzZmJfZm9yY2VjcnQxCQk9IC0xOworCXNpc2ZiX2NydDJ0eXBlCQk9IC0xOworCXNpc2ZiX2NydDJmbGFncwkJPSAwOworCXNpc2ZiX3BkYwkJPSAweGZmOworCXNpc2ZiX3BkY2EJCT0gMHhmZjsKKwlzaXNmYl9zY2FsZWxjZAkJPSAtMTsKIAlzaXNmYl9zcGVjaWFsdGltaW5nIAk9IENVVF9OT05FOwotCXNpc2ZiX2x2ZHNobCAJCT0gLTE7Ci0Jc2lzZmJfZHN0biAgICAgCQk9IDA7Ci0Jc2lzZmJfZnN0biAJCT0gMDsKLQlzaXNmYl90dnBsdWcgICAgCT0gLTE7Ci0Jc2lzZmJfdHZzdGQgICAgIAk9IC0xOwotCXNpc2ZiX3R2eHBvc29mZnNldCAJPSAwOwotCXNpc2ZiX3R2eXBvc29mZnNldCAJPSAwOwotCXNpc2ZiX2ZpbHRlciAJCT0gLTE7Ci0Jc2lzZmJfbm9jcnQycmF0ZSAJPSAwOworCXNpc2ZiX2x2ZHNobAkJPSAtMTsKKwlzaXNmYl9kc3RuCQk9IDA7CisJc2lzZmJfZnN0bgkJPSAwOworCXNpc2ZiX3R2cGx1ZwkJPSAtMTsKKwlzaXNmYl90dnN0ZAkJPSAtMTsKKwlzaXNmYl90dnhwb3NvZmZzZXQJPSAwOworCXNpc2ZiX3R2eXBvc29mZnNldAk9IDA7CisJc2lzZmJfbm9jcnQycmF0ZQk9IDA7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0Jc2lzZmJfaW52ZXJzZSAgIAk9IDA7Ci0Jc2lzZmJfZm9udG5hbWVbMF0gCT0gMDsKKwlzaXNmYl9pbnZlcnNlCQk9IDA7CisJc2lzZmJfZm9udG5hbWVbMF0JPSAwOwogI2VuZGlmCiAjaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCi0Jc2lzZmJfcmVzZXRjYXJkIAk9IDA7Ci0Jc2lzZmJfdmlkZW9yYW0gIAk9IDA7CisJc2lzZmJfcmVzZXRjYXJkCQk9IDA7CisJc2lzZmJfdmlkZW9yYW0JCT0gMDsKICNlbmRpZgogfQogCisvKiAtLS0tLS0tLS0tLS0tIFBhcmFtZXRlciBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tICovCisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdAogc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHVuc2lnbmVkIGludCB2ZXNhbW9kZSwgQk9PTEVBTiBxdWlldCkKIHsKIAlpbnQgaSA9IDAsIGogPSAwOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKIAlpZih2ZXNhbW9kZSA9PSAwKSB7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJCXNpc2ZiX21vZGVfaWR4ID0gTU9ERV9JTkRFWF9OT05FOwogI2Vsc2UKLQkJaWYoIXF1aWV0KSB7Ci0JCSAgIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgbW9kZS4gVXNpbmcgZGVmYXVsdC5cbiIpOwotCQl9CisJCWlmKCFxdWlldCkKKwkJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgbW9kZS4gVXNpbmcgZGVmYXVsdC5cbiIpOworCiAJCXNpc2ZiX21vZGVfaWR4ID0gREVGQVVMVF9NT0RFOwogI2VuZGlmCiAJCXJldHVybjsKQEAgLTE2OSw5NSArMTczLDEwMiBAQAogCXdoaWxlKHNpc2Jpb3NfbW9kZVtpKytdLm1vZGVfbm9bMF0gIT0gMCkgewogCQlpZiggKHNpc2Jpb3NfbW9kZVtpLTFdLnZlc2FfbW9kZV9ub18xID09IHZlc2Ftb2RlKSB8fAogCQkgICAgKHNpc2Jpb3NfbW9kZVtpLTFdLnZlc2FfbW9kZV9ub18yID09IHZlc2Ftb2RlKSApIHsKLQkJICAgIGlmKHNpc2ZiX2ZzdG4pIHsKLQkJICAgICAgIGlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1MCB8fAotCQkgICAgICAgICAgc2lzYmlvc19tb2RlW2ktMV0ubW9kZV9ub1sxXSA9PSAweDU2IHx8Ci0JCSAgICAgICAgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTMpIGNvbnRpbnVlOwotCSAgICAgICAgICAgIH0gZWxzZSB7Ci0JCSAgICAgICBpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NWEgfHwKLQkJICAgICAgICAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YikgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgICBzaXNmYl9tb2RlX2lkeCA9IGkgLSAxOwotCQkgICAgaiA9IDE7Ci0JCSAgICBicmVhazsKKwkJCWlmKHNpc2ZiX2ZzdG4pIHsKKwkJCQlpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTAgfHwKKwkJCQkgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTYgfHwKKwkJCQkgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTMpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NWEgfHwKKwkJCQkgICBzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NWIpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2lzZmJfbW9kZV9pZHggPSBpIC0gMTsKKwkJCWogPSAxOworCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYoKCFqKSAmJiAhcXVpZXQpIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgVkVTQSBtb2RlIDB4JXgnXG4iLCB2ZXNhbW9kZSk7CisJaWYoKCFqKSAmJiAhcXVpZXQpCisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgVkVTQSBtb2RlIDB4JXgnXG4iLCB2ZXNhbW9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgdm9pZCBfX2RldmluaXQKIHNpc2ZiX3NlYXJjaF9tb2RlKGNoYXIgKm5hbWUsIEJPT0xFQU4gcXVpZXQpCiB7Ci0JaW50IGkgPSAwOwogCXVuc2lnbmVkIGludCBqID0gMCwgeHJlcyA9IDAsIHlyZXMgPSAwLCBkZXB0aCA9IDAsIHJhdGUgPSAwOworCWludCBpID0gMDsKIAljaGFyIHN0cmJ1ZlsxNl0sIHN0cmJ1ZjFbMjBdOwogCWNoYXIgKm5hbWVwdHIgPSBuYW1lOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKIAlpZihuYW1lID09IE5VTEwpIHsKLQkgICBpZighcXVpZXQpIHsKLQkgICAgICBwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBJbnRlcm5hbCBlcnJvciwgdXNpbmcgZGVmYXVsdCBtb2RlLlxuIik7Ci0JICAgfQotCSAgIHNpc2ZiX21vZGVfaWR4ID0gREVGQVVMVF9NT0RFOwotCSAgIHJldHVybjsKKwkJaWYoIXF1aWV0KQorCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogSW50ZXJuYWwgZXJyb3IsIHVzaW5nIGRlZmF1bHQgbW9kZS5cbiIpOworCisJCXNpc2ZiX21vZGVfaWR4ID0gREVGQVVMVF9NT0RFOworCQlyZXR1cm47CiAJfQogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgICBpZighc3RybmljbXAobmFtZSwgc2lzYmlvc19tb2RlW01PREVfSU5ERVhfTk9ORV0ubmFtZSwgc3RybGVuKG5hbWUpKSkgewotCSAgIGlmKCFxdWlldCkgewotCSAgICAgIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IE1vZGUgJ25vbmUnIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gVXNpbmcgZGVmYXVsdC5cbiIpOwotCSAgIH0KLQkgICBzaXNmYl9tb2RlX2lkeCA9IERFRkFVTFRfTU9ERTsKLQkgICByZXR1cm47CisJaWYoIXN0cm5pY21wKG5hbWUsIHNpc2Jpb3NfbW9kZVtNT0RFX0lOREVYX05PTkVdLm5hbWUsIHN0cmxlbihuYW1lKSkpIHsKKwkJaWYoIXF1aWV0KQorCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogTW9kZSAnbm9uZScgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBVc2luZyBkZWZhdWx0LlxuIik7CisKKwkJc2lzZmJfbW9kZV9pZHggPSBERUZBVUxUX01PREU7CisJCXJldHVybjsKIAl9CiAjZW5kaWYKIAlpZihzdHJsZW4obmFtZSkgPD0gMTkpIHsKLQkgICBzdHJjcHkoc3RyYnVmMSwgbmFtZSk7Ci0JICAgZm9yKGk9MDsgaTxzdHJsZW4oc3RyYnVmMSk7IGkrKykgewotCSAgICAgIGlmKHN0cmJ1ZjFbaV0gPCAnMCcgfHwgc3RyYnVmMVtpXSA+ICc5Jykgc3RyYnVmMVtpXSA9ICcgJzsKLQkgICB9CisJCXN0cmNweShzdHJidWYxLCBuYW1lKTsKKwkJZm9yKGkgPSAwOyBpIDwgc3RybGVuKHN0cmJ1ZjEpOyBpKyspIHsKKwkJCWlmKHN0cmJ1ZjFbaV0gPCAnMCcgfHwgc3RyYnVmMVtpXSA+ICc5Jykgc3RyYnVmMVtpXSA9ICcgJzsKKwkJfQogCi0JICAgLyogVGhpcyBkb2VzIHNvbWUgZnV6enkgbW9kZSBuYW1pbmcgZGV0ZWN0aW9uICovCi0JICAgaWYoc3NjYW5mKHN0cmJ1ZjEsICIldSAldSAldSAldSIsICZ4cmVzLCAmeXJlcywgJmRlcHRoLCAmcmF0ZSkgPT0gNCkgewotCSAgICAgIGlmKChyYXRlIDw9IDMyKSB8fCAoZGVwdGggPiAzMikpIHsKLQkgICAgICAgICBqID0gcmF0ZTsgcmF0ZSA9IGRlcHRoOyBkZXB0aCA9IGo7Ci0JICAgICAgfQotCSAgICAgIHNwcmludGYoc3RyYnVmLCAiJXV4JXV4JXUiLCB4cmVzLCB5cmVzLCBkZXB0aCk7Ci0JICAgICAgbmFtZXB0ciA9IHN0cmJ1ZjsKLQkgICAgICBzaXNmYl9wYXJtX3JhdGUgPSByYXRlOwotCSAgIH0gZWxzZSBpZihzc2NhbmYoc3RyYnVmMSwgIiV1ICV1ICV1IiwgJnhyZXMsICZ5cmVzLCAmZGVwdGgpID09IDMpIHsKLQkgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiV1eCV1eCV1IiwgeHJlcywgeXJlcywgZGVwdGgpOwotCSAgICAgIG5hbWVwdHIgPSBzdHJidWY7Ci0JICAgfSBlbHNlIHsKLQkgICAgICB4cmVzID0gMDsKLQkgICAgICBpZigoc3NjYW5mKHN0cmJ1ZjEsICIldSAldSIsICZ4cmVzLCAmeXJlcykgPT0gMikgJiYgKHhyZXMgIT0gMCkpIHsKLQkgICAgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiV1eCV1eDgiLCB4cmVzLCB5cmVzKTsKLQkgICAgICAgICBuYW1lcHRyID0gc3RyYnVmOwotCSAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHNpbXBsZV9zdHJ0b3VsKG5hbWUsIE5VTEwsIDApLCBxdWlldCk7Ci0JICAgICAgICAgcmV0dXJuOwotCSAgICAgIH0KLQkgICB9CisJCS8qIFRoaXMgZG9lcyBzb21lIGZ1enp5IG1vZGUgbmFtaW5nIGRldGVjdGlvbiAqLworCQlpZihzc2NhbmYoc3RyYnVmMSwgIiV1ICV1ICV1ICV1IiwgJnhyZXMsICZ5cmVzLCAmZGVwdGgsICZyYXRlKSA9PSA0KSB7CisJCQlpZigocmF0ZSA8PSAzMikgfHwgKGRlcHRoID4gMzIpKSB7CisJCQkJaiA9IHJhdGU7IHJhdGUgPSBkZXB0aDsgZGVwdGggPSBqOworCQkJfQorCQkJc3ByaW50ZihzdHJidWYsICIldXgldXgldSIsIHhyZXMsIHlyZXMsIGRlcHRoKTsKKwkJCW5hbWVwdHIgPSBzdHJidWY7CisJCQlzaXNmYl9wYXJtX3JhdGUgPSByYXRlOworCQl9IGVsc2UgaWYoc3NjYW5mKHN0cmJ1ZjEsICIldSAldSAldSIsICZ4cmVzLCAmeXJlcywgJmRlcHRoKSA9PSAzKSB7CisJCQlzcHJpbnRmKHN0cmJ1ZiwgIiV1eCV1eCV1IiwgeHJlcywgeXJlcywgZGVwdGgpOworCQkJbmFtZXB0ciA9IHN0cmJ1ZjsKKwkJfSBlbHNlIHsKKwkJCXhyZXMgPSAwOworCQkJaWYoKHNzY2FuZihzdHJidWYxLCAiJXUgJXUiLCAmeHJlcywgJnlyZXMpID09IDIpICYmICh4cmVzICE9IDApKSB7CisJCQkJc3ByaW50ZihzdHJidWYsICIldXgldXg4IiwgeHJlcywgeXJlcyk7CisJCQkJbmFtZXB0ciA9IHN0cmJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHNpbXBsZV9zdHJ0b3VsKG5hbWUsIE5VTEwsIDApLCBxdWlldCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CiAJfQogCiAJaSA9IDA7IGogPSAwOwogCXdoaWxlKHNpc2Jpb3NfbW9kZVtpXS5tb2RlX25vWzBdICE9IDApIHsKIAkJaWYoIXN0cm5pY21wKG5hbWVwdHIsIHNpc2Jpb3NfbW9kZVtpKytdLm5hbWUsIHN0cmxlbihuYW1lcHRyKSkpIHsKLQkJICAgCWlmKHNpc2ZiX2ZzdG4pIHsKLQkJICAgICAgCQlpZihzaXNiaW9zX21vZGVbaS0xXS5tb2RlX25vWzFdID09IDB4NTAgfHwKLQkJICAgICAgICAgCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1NiB8fAotCQkgICAgICAgICAJICAgc2lzYmlvc19tb2RlW2ktMV0ubW9kZV9ub1sxXSA9PSAweDUzKSBjb250aW51ZTsKLQkgICAgICAgICAgIAl9IGVsc2UgewotCQkgICAgICAJCWlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YSB8fAotCQkgICAgICAgICAJICAgc2lzYmlvc19tb2RlW2ktMV0ubW9kZV9ub1sxXSA9PSAweDViKSBjb250aW51ZTsKLQkJICAgCX0KLQkJICAgCXNpc2ZiX21vZGVfaWR4ID0gaSAtIDE7Ci0JCSAgIAlqID0gMTsKLQkJICAgCWJyZWFrOworCQkJaWYoc2lzZmJfZnN0bikgeworCQkJCWlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1MCB8fAorCQkJCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1NiB8fAorCQkJCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1MykKKwkJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmKHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YSB8fAorCQkJCSAgIHNpc2Jpb3NfbW9kZVtpLTFdLm1vZGVfbm9bMV0gPT0gMHg1YikKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlzaXNmYl9tb2RlX2lkeCA9IGkgLSAxOworCQkJaiA9IDE7CisJCQlicmVhazsKIAkJfQogCX0KLQlpZigoIWopICYmICFxdWlldCkgcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogSW52YWxpZCBtb2RlICclcydcbiIsIG5hbWVwdHIpOworCisJaWYoKCFqKSAmJiAhcXVpZXQpCisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgbW9kZSAnJXMnXG4iLCBuYW1lcHRyKTsKIH0KIAogI2lmbmRlZiBNT0RVTEUKQEAgLTI2NSw3ICsyNzYsNyBAQAogc2lzZmJfZ2V0X3ZnYV9tb2RlX2Zyb21fa2VybmVsKHZvaWQpCiB7CiAjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmIGRlZmluZWQoQ09ORklHX1ZJREVPX1NFTEVDVCkKLSAgIAljaGFyIG15bW9kZVszMl07CisJY2hhciBteW1vZGVbMzJdOwogCWludCAgbXlkZXB0aCA9IHNjcmVlbl9pbmZvLmxmYl9kZXB0aDsKIAogCWlmKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EgIT0gVklERU9fVFlQRV9WTEZCKSByZXR1cm47CkBAIC0yNzQsMTUgKzI4NSwxNyBAQAogCSAgICAoc2NyZWVuX2luZm8ubGZiX2hlaWdodCA+PSAyMDApICYmIChzY3JlZW5faW5mby5sZmJfaGVpZ2h0IDw9IDE1MzYpICYmCiAJICAgIChteWRlcHRoID49IDgpICYmIChteWRlcHRoIDw9IDMyKSApIHsKIAotCSAgICBpZihteWRlcHRoID09IDI0KSBteWRlcHRoID0gMzI7CisJCWlmKG15ZGVwdGggPT0gMjQpIG15ZGVwdGggPSAzMjsKIAotCSAgICBzcHJpbnRmKG15bW9kZSwgIiV1eCV1eCV1Iiwgc2NyZWVuX2luZm8ubGZiX3dpZHRoLAotCSAgICAJCQkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCwKKwkJc3ByaW50ZihteW1vZGUsICIldXgldXgldSIsIHNjcmVlbl9pbmZvLmxmYl93aWR0aCwKKwkJCQkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCwKIAkJCQkJbXlkZXB0aCk7CiAKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBVc2luZyB2Z2EgbW9kZSAlcyBwcmUtc2V0IGJ5IGtlcm5lbCBhcyBkZWZhdWx0XG4iLCBteW1vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkJInNpc2ZiOiBVc2luZyB2Z2EgbW9kZSAlcyBwcmUtc2V0IGJ5IGtlcm5lbCBhcyBkZWZhdWx0XG4iLAorCQkJbXltb2RlKTsKIAotCSAgICBzaXNmYl9zZWFyY2hfbW9kZShteW1vZGUsIFRSVUUpOworCQlzaXNmYl9zZWFyY2hfbW9kZShteW1vZGUsIFRSVUUpOwogCX0KICNlbmRpZgogCXJldHVybjsKQEAgLTI5NCwyNiArMzA3LDI1IEBACiB7CiAJaW50IGkgPSAwOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKIAlpZihuYW1lID09IE5VTEwpIHJldHVybjsKIAogCXdoaWxlKHNpc19jcnQydHlwZVtpXS50eXBlX25vICE9IC0xKSB7Ci0JICAgCWlmKCFzdHJuaWNtcChuYW1lLCBzaXNfY3J0MnR5cGVbaV0ubmFtZSwgc3RybGVuKHNpc19jcnQydHlwZVtpXS5uYW1lKSkpIHsKLQkgICAgICAJCXNpc2ZiX2NydDJ0eXBlID0gc2lzX2NydDJ0eXBlW2ldLnR5cGVfbm87Ci0JICAgICAgCQlzaXNmYl90dnBsdWcgPSBzaXNfY3J0MnR5cGVbaV0udHZwbHVnX25vOwotCSAgICAgIAkJc2lzZmJfY3J0MmZsYWdzID0gc2lzX2NydDJ0eXBlW2ldLmZsYWdzOwotCSAgICAgIAkJYnJlYWs7Ci0JICAgCX0KLQkgICAJaSsrOworCQlpZighc3RybmljbXAobmFtZSwgc2lzX2NydDJ0eXBlW2ldLm5hbWUsIHN0cmxlbihzaXNfY3J0MnR5cGVbaV0ubmFtZSkpKSB7CisJCQlzaXNmYl9jcnQydHlwZSA9IHNpc19jcnQydHlwZVtpXS50eXBlX25vOworCQkJc2lzZmJfdHZwbHVnID0gc2lzX2NydDJ0eXBlW2ldLnR2cGx1Z19ubzsKKwkJCXNpc2ZiX2NydDJmbGFncyA9IHNpc19jcnQydHlwZVtpXS5mbGFnczsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKIAl9CiAKIAlzaXNmYl9kc3RuID0gKHNpc2ZiX2NydDJmbGFncyAmIEZMXzU1MF9EU1ROKSA/IDEgOiAwOwogCXNpc2ZiX2ZzdG4gPSAoc2lzZmJfY3J0MmZsYWdzICYgRkxfNTUwX0ZTVE4pID8gMSA6IDA7CiAKLQlpZihzaXNmYl9jcnQydHlwZSA8IDApIHsKKwlpZihzaXNmYl9jcnQydHlwZSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEludmFsaWQgQ1JUMiB0eXBlOiAlc1xuIiwgbmFtZSk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKQEAgLTMyMSwxNiArMzMzLDE3IEBACiB7CiAJaW50IGkgPSAwOwogCi0JLyogQkVXQVJFOiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLworCS8qIFdlIGRvbid0IGtub3cgdGhlIGhhcmR3YXJlIHNwZWNzIHlldCBhbmQgdGhlcmUgaXMgbm8gaXZpZGVvICovCiAKLQlpZihuYW1lID09IE5VTEwpIHJldHVybjsKKwlpZihuYW1lID09IE5VTEwpCisJCXJldHVybjsKIAogCXdoaWxlKHNpc190dnR5cGVbaV0udHlwZV9ubyAhPSAtMSkgewotCSAgIAlpZighc3RybmljbXAobmFtZSwgc2lzX3R2dHlwZVtpXS5uYW1lLCBzdHJsZW4oc2lzX3R2dHlwZVtpXS5uYW1lKSkpIHsKLQkgICAgICAJCXNpc2ZiX3R2c3RkID0gc2lzX3R2dHlwZVtpXS50eXBlX25vOwotCSAgICAgIAkJYnJlYWs7Ci0JICAgCX0KLQkgICAJaSsrOworCQlpZighc3RybmljbXAobmFtZSwgc2lzX3R2dHlwZVtpXS5uYW1lLCBzdHJsZW4oc2lzX3R2dHlwZVtpXS5uYW1lKSkpIHsKKwkJCXNpc2ZiX3R2c3RkID0gc2lzX3R2dHlwZVtpXS50eXBlX25vOworCQkJYnJlYWs7CisJCX0KKwkJaSsrOwogCX0KIH0KIApAQCAtMzQwLDM4ICszNTMsMTAxIEBACiAJaW50IGkgPSAwOwogCUJPT0xFQU4gZm91bmQgPSBGQUxTRTsKIAotCS8qIEJFV0FSRTogV2UgZG9uJ3Qga25vdyB0aGUgaGFyZHdhcmUgc3BlY3MgeWV0IGFuZCB0aGVyZSBpcyBubyBpdmlkZW8gKi8KKwkvKiBXZSBkb24ndCBrbm93IHRoZSBoYXJkd2FyZSBzcGVjcyB5ZXQgYW5kIHRoZXJlIGlzIG5vIGl2aWRlbyAqLwogCi0JaWYobmFtZSA9PSBOVUxMKSByZXR1cm47CisJaWYobmFtZSA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAlpZighc3RybmljbXAobmFtZSwgIm5vbmUiLCA0KSkgewotCSAgICAgICAgc2lzZmJfc3BlY2lhbHRpbWluZyA9IENVVF9GT1JDRU5PTkU7CisJCXNpc2ZiX3NwZWNpYWx0aW1pbmcgPSBDVVRfRk9SQ0VOT05FOwogCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFNwZWNpYWwgdGltaW5nIGRpc2FibGVkXG4iKTsKIAl9IGVsc2UgewotCSAgIHdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCAhPSAwKSB7Ci0JICAgICAgaWYoIXN0cm5pY21wKG5hbWUsbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSwgc3RybGVuKG15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpKSkgewotCQkgc2lzZmJfc3BlY2lhbHRpbWluZyA9IG15Y3VzdG9tdHRhYmxlW2ldLlNwZWNpYWxJRDsKLQkJIGZvdW5kID0gVFJVRTsKLQkJIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBTcGVjaWFsIHRpbWluZyBmb3IgJXMgJXMgZm9yY2VkIChcIiVzXCIpXG4iLAotCQkgCW15Y3VzdG9tdHRhYmxlW2ldLnZlbmRvck5hbWUsIG15Y3VzdG9tdHRhYmxlW2ldLmNhcmROYW1lLAotCQkgCW15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpOwotCQkgYnJlYWs7Ci0JICAgICAgfQotCSAgICAgIGkrKzsKLQkgICB9Ci0JICAgaWYoIWZvdW5kKSB7Ci0JICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAic2lzZmI6IEludmFsaWQgU3BlY2lhbFRpbWluZyBwYXJhbWV0ZXIsIHZhbGlkIGFyZToiKTsKLQkgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJcdFwibm9uZVwiICh0byBkaXNhYmxlIHNwZWNpYWwgdGltaW5ncylcbiIpOwotCSAgICAgIGkgPSAwOwotCSAgICAgIHdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCAhPSAwKSB7Ci0JCSBwcmludGsoS0VSTl9XQVJOSU5HICJcdFwiJXNcIiAoZm9yICVzICVzKVxuIiwKLQkJICAgICBteWN1c3RvbXR0YWJsZVtpXS5vcHRpb25OYW1lLAotCQkgICAgIG15Y3VzdG9tdHRhYmxlW2ldLnZlbmRvck5hbWUsCi0JCSAgICAgbXljdXN0b210dGFibGVbaV0uY2FyZE5hbWUpOwotCQkgaSsrOwotCSAgICAgIH0KLSAgICAgICAgICAgfQotIAl9CisJCXdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCAhPSAwKSB7CisJCQlpZighc3RybmljbXAobmFtZSxteWN1c3RvbXR0YWJsZVtpXS5vcHRpb25OYW1lLAorCQkJICAgc3RybGVuKG15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpKSkgeworCQkJCXNpc2ZiX3NwZWNpYWx0aW1pbmcgPSBteWN1c3RvbXR0YWJsZVtpXS5TcGVjaWFsSUQ7CisJCQkJZm91bmQgPSBUUlVFOworCQkJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBTcGVjaWFsIHRpbWluZyBmb3IgJXMgJXMgZm9yY2VkIChcIiVzXCIpXG4iLAorCQkJCQlteWN1c3RvbXR0YWJsZVtpXS52ZW5kb3JOYW1lLAorCQkJCQlteWN1c3RvbXR0YWJsZVtpXS5jYXJkTmFtZSwKKwkJCQkJbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwkJaWYoIWZvdW5kKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzaXNmYjogSW52YWxpZCBTcGVjaWFsVGltaW5nIHBhcmFtZXRlciwgdmFsaWQgYXJlOiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiXHRcIm5vbmVcIiAodG8gZGlzYWJsZSBzcGVjaWFsIHRpbWluZ3MpXG4iKTsKKwkJCWkgPSAwOworCQkJd2hpbGUobXljdXN0b210dGFibGVbaV0uY2hpcElEICE9IDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJcdFwiJXNcIiAoZm9yICVzICVzKVxuIiwKKwkJCQkJbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSwKKwkJCQkJbXljdXN0b210dGFibGVbaV0udmVuZG9yTmFtZSwKKwkJCQkJbXljdXN0b210dGFibGVbaV0uY2FyZE5hbWUpOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyogLS0tLS0tLS0tLS0gVmFyaW91cyBkZXRlY3Rpb24gcm91dGluZXMgLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9kZXRlY3RfY3VzdG9tX3RpbWluZyhzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3sKKwl1bnNpZ25lZCBjaGFyICpiaW9zdmVyID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpiaW9zZGF0ZSA9IE5VTEw7CisJQk9PTEVBTiBmb290cHJpbnQ7CisJdTMyIGNoa3N1bSA9IDA7CisJaW50IGksIGo7CisKKwlpZihpdmlkZW8tPlNpU19Qci5Vc2VST00pIHsKKwkJYmlvc3ZlciA9IGl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlICsgMHgwNjsKKwkJYmlvc2RhdGUgPSBpdmlkZW8tPlNpU19Qci5WaXJ0dWFsUm9tQmFzZSArIDB4MmM7CisJCWZvcihpID0gMDsgaSA8IDMyNzY4OyBpKyspCisJCQljaGtzdW0gKz0gaXZpZGVvLT5TaVNfUHIuVmlydHVhbFJvbUJhc2VbaV07CisJfQorCisJaSA9IDA7CisJZG8geworCQlpZiggKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCA9PSBpdmlkZW8tPmNoaXApCQkJJiYKKwkJICAgICgoIXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zdmVyc2lvbikpIHx8CisJCSAgICAgKGl2aWRlby0+U2lTX1ByLlVzZVJPTSAmJgorCQkgICAgICAoIXN0cm5jbXAobXljdXN0b210dGFibGVbaV0uYmlvc3ZlcnNpb24sIGJpb3N2ZXIsCisJCQkJc3RybGVuKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3N2ZXJzaW9uKSkpKSkJJiYKKwkJICAgICgoIXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSkpIHx8CisJCSAgICAgKGl2aWRlby0+U2lTX1ByLlVzZVJPTSAmJgorCQkgICAgICAoIXN0cm5jbXAobXljdXN0b210dGFibGVbaV0uYmlvc2RhdGUsIGJpb3NkYXRlLAorCQkJCXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSkpKSkpCQkmJgorCQkgICAgKCghbXljdXN0b210dGFibGVbaV0uYmlvc2Noa3N1bSkgfHwKKwkJICAgICAoaXZpZGVvLT5TaVNfUHIuVXNlUk9NICYmCisJCSAgICAgIChteWN1c3RvbXR0YWJsZVtpXS5iaW9zY2hrc3VtID09IGNoa3N1bSkpKQkJJiYKKwkJICAgIChteWN1c3RvbXR0YWJsZVtpXS5wY2lzdWJzeXN2ZW5kb3IgPT0gaXZpZGVvLT5zdWJzeXN2ZW5kb3IpICYmCisJCSAgICAobXljdXN0b210dGFibGVbaV0ucGNpc3Vic3lzY2FyZCA9PSBpdmlkZW8tPnN1YnN5c2RldmljZSkgKSB7CisJCQlmb290cHJpbnQgPSBUUlVFOworCQkJZm9yKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCQkJaWYobXljdXN0b210dGFibGVbaV0uYmlvc0Zvb3RwcmludEFkZHJbal0pIHsKKwkJCQkJaWYoaXZpZGVvLT5TaVNfUHIuVXNlUk9NKSB7CisJCQkJCQlpZihpdmlkZW8tPlNpU19Qci5WaXJ0dWFsUm9tQmFzZVtteWN1c3RvbXR0YWJsZVtpXS5iaW9zRm9vdHByaW50QWRkcltqXV0gIT0KKwkJCQkJCQlteWN1c3RvbXR0YWJsZVtpXS5iaW9zRm9vdHByaW50RGF0YVtqXSkgeworCQkJCQkJCWZvb3RwcmludCA9IEZBTFNFOworCQkJCQkJfQorCQkJCQl9IGVsc2UKKwkJCQkJCWZvb3RwcmludCA9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCWlmKGZvb3RwcmludCkgeworCQkJCWl2aWRlby0+U2lTX1ByLlNpU19DdXN0b21UID0gbXljdXN0b210dGFibGVbaV0uU3BlY2lhbElEOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSWRlbnRpZmllZCBbJXMgJXNdLCBzcGVjaWFsIHRpbWluZyBhcHBsaWVzXG4iLAorCQkJCQlteWN1c3RvbXR0YWJsZVtpXS52ZW5kb3JOYW1lLAorCQkJCW15Y3VzdG9tdHRhYmxlW2ldLmNhcmROYW1lKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFtzcGVjaWFsdGltaW5nIHBhcmFtZXRlciBuYW1lOiAlc11cbiIsCisJCQkJCW15Y3VzdG9tdHRhYmxlW2ldLm9wdGlvbk5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWkrKzsKKwl9IHdoaWxlKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCk7CiB9CiAKIHN0YXRpYyBCT09MRUFOIF9fZGV2aW5pdApAQCAtMzg0LDIyICs0NjAsMjMgQEAKIAkgICBidWZmZXJbMl0gIT0gMHhmZiB8fCBidWZmZXJbM10gIT0gMHhmZiB8fAogCSAgIGJ1ZmZlcls0XSAhPSAweGZmIHx8IGJ1ZmZlcls1XSAhPSAweGZmIHx8CiAJICAgYnVmZmVyWzZdICE9IDB4ZmYgfHwgYnVmZmVyWzddICE9IDB4MDApIHsKLQkgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEJhZCBFRElEIGhlYWRlclxuIik7Ci0JICAgcmV0dXJuIEZBTFNFOworCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEJhZCBFRElEIGhlYWRlclxuIik7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKIAlpZihidWZmZXJbMHgxMl0gIT0gMHgwMSkgewotCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBFRElEIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkgICAJYnVmZmVyWzB4MTJdKTsKLQkgICByZXR1cm4gRkFMU0U7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBFRElEIHZlcnNpb24gJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCWJ1ZmZlclsweDEyXSk7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKIAltb25pdG9yLT5mZWF0dXJlID0gYnVmZmVyWzB4MThdOwogCiAJaWYoIWJ1ZmZlclsweDE0XSAmIDB4ODApIHsKLQkgICBpZighKGJ1ZmZlclsweDE0XSAmIDB4MDgpKSB7Ci0JICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFdBUk5JTkc6IE1vbml0b3IgZG9lcyBub3Qgc3VwcG9ydCBzZXBhcmF0ZSBzeW5jc1xuIik7Ci0JICAgfQorCQlpZighKGJ1ZmZlclsweDE0XSAmIDB4MDgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJInNpc2ZiOiBXQVJOSU5HOiBNb25pdG9yIGRvZXMgbm90IHN1cHBvcnQgc2VwYXJhdGUgc3luY3NcbiIpOworCQl9CiAJfQogCiAJaWYoYnVmZmVyWzB4MTNdID49IDB4MDEpIHsKQEAgLTQwOSw3ICs0ODYsNyBAQAogCSAgICBqID0gMHgzNjsKIAkgICAgZm9yKGk9MDsgaTw0OyBpKyspIHsKIAkgICAgICAgaWYoYnVmZmVyW2pdICAgICA9PSAweDAwICYmIGJ1ZmZlcltqICsgMV0gPT0gMHgwMCAmJgotCSAgICAgICAgICBidWZmZXJbaiArIDJdID09IDB4MDAgJiYgYnVmZmVyW2ogKyAzXSA9PSAweGZkICYmCisJCSAgYnVmZmVyW2ogKyAyXSA9PSAweDAwICYmIGJ1ZmZlcltqICsgM10gPT0gMHhmZCAmJgogCQkgIGJ1ZmZlcltqICsgNF0gPT0gMHgwMCkgewogCQkgIG1vbml0b3ItPmhtaW4gPSBidWZmZXJbaiArIDddOwogCQkgIG1vbml0b3ItPmhtYXggPSBidWZmZXJbaiArIDhdOwpAQCAtNDM1LDcgKzUxMiw3IEBACiAJICAgZW1vZGVzID0gYnVmZmVyWzB4MjNdIHwgKGJ1ZmZlclsweDI0XSA8PCA4KSB8IChidWZmZXJbMHgyNV0gPDwgMTYpOwogCSAgIGZvcihpID0gMDsgaSA8IDEzOyBpKyspIHsKIAkgICAgICBpZihlbW9kZXMgJiBzaXNmYl9kZGNzbW9kZXNbaV0ubWFzaykgewotCSAgICAgICAgIGlmKG1vbml0b3ItPmhtaW4gPiBzaXNmYl9kZGNzbW9kZXNbaV0uaCkgbW9uaXRvci0+aG1pbiA9IHNpc2ZiX2RkY3Ntb2Rlc1tpXS5oOworCQkgaWYobW9uaXRvci0+aG1pbiA+IHNpc2ZiX2RkY3Ntb2Rlc1tpXS5oKSBtb25pdG9yLT5obWluID0gc2lzZmJfZGRjc21vZGVzW2ldLmg7CiAJCSBpZihtb25pdG9yLT5obWF4IDwgc2lzZmJfZGRjc21vZGVzW2ldLmgpIG1vbml0b3ItPmhtYXggPSBzaXNmYl9kZGNzbW9kZXNbaV0uaCArIDE7CiAJCSBpZihtb25pdG9yLT52bWluID4gc2lzZmJfZGRjc21vZGVzW2ldLnYpIG1vbml0b3ItPnZtaW4gPSBzaXNmYl9kZGNzbW9kZXNbaV0udjsKIAkJIGlmKG1vbml0b3ItPnZtYXggPCBzaXNmYl9kZGNzbW9kZXNbaV0udikgbW9uaXRvci0+dm1heCA9IHNpc2ZiX2RkY3Ntb2Rlc1tpXS52OwpAQCAtNDQ2LDgwICs1MjMsODEgQEAKIAkgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkgICAgICB4cmVzID0gKGJ1ZmZlcltpbmRleF0gKyAzMSkgKiA4OwogCSAgICAgIHN3aXRjaChidWZmZXJbaW5kZXggKyAxXSAmIDB4YzApIHsKLQkgICAgICAgICBjYXNlIDB4YzA6IHlyZXMgPSAoeHJlcyAqIDkpIC8gMTY7IGJyZWFrOwotCSAgICAgICAgIGNhc2UgMHg4MDogeXJlcyA9ICh4cmVzICogNCkgLyAgNTsgYnJlYWs7Ci0JICAgICAgICAgY2FzZSAweDQwOiB5cmVzID0gKHhyZXMgKiAzKSAvICA0OyBicmVhazsKLQkgICAgICAgICBkZWZhdWx0OiAgIHlyZXMgPSB4cmVzOwkgICAgYnJlYWs7CisJCSBjYXNlIDB4YzA6IHlyZXMgPSAoeHJlcyAqIDkpIC8gMTY7IGJyZWFrOworCQkgY2FzZSAweDgwOiB5cmVzID0gKHhyZXMgKiA0KSAvICA1OyBicmVhazsKKwkJIGNhc2UgMHg0MDogeXJlcyA9ICh4cmVzICogMykgLyAgNDsgYnJlYWs7CisJCSBkZWZhdWx0OiAgIHlyZXMgPSB4cmVzOwkgICAgYnJlYWs7CiAJICAgICAgfQogCSAgICAgIHJlZnJlc2ggPSAoYnVmZmVyW2luZGV4ICsgMV0gJiAweDNmKSArIDYwOwogCSAgICAgIGlmKCh4cmVzID49IDY0MCkgJiYgKHlyZXMgPj0gNDgwKSkgewotICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkgICAgICAgICAgICBpZigoeHJlcyA9PSBzaXNmYl9kZGNmbW9kZXNbal0ueCkgJiYKLQkgICAgICAgICAgICAgICAoeXJlcyA9PSBzaXNmYl9kZGNmbW9kZXNbal0ueSkgJiYKKwkJIGZvcihqID0gMDsgaiA8IDg7IGorKykgeworCQkgICAgaWYoKHhyZXMgPT0gc2lzZmJfZGRjZm1vZGVzW2pdLngpICYmCisJCSAgICAgICAoeXJlcyA9PSBzaXNmYl9kZGNmbW9kZXNbal0ueSkgJiYKIAkJICAgICAgIChyZWZyZXNoID09IHNpc2ZiX2RkY2Ztb2Rlc1tqXS52KSkgewogCQkgICAgICBpZihtb25pdG9yLT5obWluID4gc2lzZmJfZGRjZm1vZGVzW2pdLmgpIG1vbml0b3ItPmhtaW4gPSBzaXNmYl9kZGNmbW9kZXNbal0uaDsKIAkJICAgICAgaWYobW9uaXRvci0+aG1heCA8IHNpc2ZiX2RkY2Ztb2Rlc1tqXS5oKSBtb25pdG9yLT5obWF4ID0gc2lzZmJfZGRjZm1vZGVzW2pdLmggKyAxOwogCQkgICAgICBpZihtb25pdG9yLT52bWluID4gc2lzZmJfZGRjc21vZGVzW2pdLnYpIG1vbml0b3ItPnZtaW4gPSBzaXNmYl9kZGNzbW9kZXNbal0udjsKIAkJICAgICAgaWYobW9uaXRvci0+dm1heCA8IHNpc2ZiX2RkY3Ntb2Rlc1tqXS52KSBtb25pdG9yLT52bWF4ID0gc2lzZmJfZGRjc21vZGVzW2pdLnY7Ci0JCSAgICAgIGlmKG1vbml0b3ItPmRjbG9ja21heCA8IHNpc2ZiX2RkY3Ntb2Rlc1tqXS5kKSBtb25pdG9yLT5kY2xvY2ttYXggPSBzaXNmYl9kZGNzbW9kZXNbaV0uZDsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgfQorCQkgICAgICBpZihtb25pdG9yLT5kY2xvY2ttYXggPCBzaXNmYl9kZGNzbW9kZXNbal0uZCkgbW9uaXRvci0+ZGNsb2NrbWF4ID0gc2lzZmJfZGRjc21vZGVzW2pdLmQ7CisJCSAgICB9CisJCSB9CiAJICAgICAgfQogCSAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgIH0KKwkgICB9CiAJICAgaWYoKG1vbml0b3ItPmhtaW4gPD0gbW9uaXRvci0+aG1heCkgJiYgKG1vbml0b3ItPnZtaW4gPD0gbW9uaXRvci0+dm1heCkpIHsKIAkgICAgICBtb25pdG9yLT5kYXRhdmFsaWQgPSBUUlVFOwogCSAgIH0KIAl9CiAKLSAJcmV0dXJuKG1vbml0b3ItPmRhdGF2YWxpZCk7CisJcmV0dXJuIG1vbml0b3ItPmRhdGF2YWxpZDsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0CiBzaXNmYl9oYW5kbGVfZGRjKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3Qgc2lzZmJfbW9uaXRvciAqbW9uaXRvciwgaW50IGNydG5vKQogewotCVVTSE9SVCAgdGVtcCwgaSwgcmVhbGNydG5vID0gY3J0bm87Ci0gICAJdTggICAgICBidWZmZXJbMjU2XTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpLCByZWFsY3J0bm8gPSBjcnRubzsKKwl1bnNpZ25lZCBjaGFyICBidWZmZXJbMjU2XTsKIAogCW1vbml0b3ItPmRhdGF2YWxpZCA9IEZBTFNFOwogCiAJaWYoY3J0bm8pIHsKLSAgICAgICAJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpICAgICAgcmVhbGNydG5vID0gMTsKLSAgICAgIAkgICBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfVkdBKSByZWFsY3J0bm8gPSAyOwotICAgICAgCSAgIGVsc2UgcmV0dXJuOwotICAgCX0KKwkgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX0xDRCkgICAgICByZWFsY3J0bm8gPSAxOworCSAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9WR0EpIHJlYWxjcnRubyA9IDI7CisJICAgZWxzZSByZXR1cm47CisJfQogCi0JaWYoKGl2aWRlby0+c2lzZmJfY3J0MW9mZikgJiYgKCFjcnRubykpIHJldHVybjsKKwlpZigoaXZpZGVvLT5zaXNmYl9jcnQxb2ZmKSAmJiAoIWNydG5vKSkKKwkJcmV0dXJuOwogCi0gICAgCXRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCi0JCQkJcmVhbGNydG5vLCAwLCAmYnVmZmVyWzBdKTsKLSAgIAlpZigoIXRlbXApIHx8ICh0ZW1wID09IDB4ZmZmZikpIHsKLSAgICAgIAkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHByb2JpbmcgZmFpbGVkXG4iLCBjcnRubyArIDEpOworCXRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCisJCQkJcmVhbGNydG5vLCAwLCAmYnVmZmVyWzBdLCBpdmlkZW8tPnZiZmxhZ3MyKTsKKwlpZigoIXRlbXApIHx8ICh0ZW1wID09IDB4ZmZmZikpIHsKKwkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHByb2JpbmcgZmFpbGVkXG4iLCBjcnRubyArIDEpOwogCSAgIHJldHVybjsKLSAgIAl9IGVsc2UgewotICAgICAgCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgc3VwcG9ydGVkXG4iLCBjcnRubyArIDEpOwotICAgICAgCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgbGV2ZWw6ICVzJXMlcyVzXG4iLAotCSAgIAljcnRubyArIDEsCi0JICAgCSh0ZW1wICYgMHgxYSkgPyAiIiA6ICJbbm9uZSBvZiB0aGUgc3VwcG9ydGVkXSIsCi0JICAgCSh0ZW1wICYgMHgwMikgPyAiMiAiIDogIiIsCi0JICAgCSh0ZW1wICYgMHgwOCkgPyAiRCZQIiA6ICIiLAotICAgICAgICAgICAJKHRlbXAgJiAweDEwKSA/ICJGUERJLTIiIDogIiIpOwotICAgICAgCSAgIGlmKHRlbXAgJiAweDAyKSB7CisJfSBlbHNlIHsKKwkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHN1cHBvcnRlZFxuIiwgY3J0bm8gKyAxKTsKKwkgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIGxldmVsOiAlcyVzJXMlc1xuIiwKKwkJY3J0bm8gKyAxLAorCQkodGVtcCAmIDB4MWEpID8gIiIgOiAiW25vbmUgb2YgdGhlIHN1cHBvcnRlZF0iLAorCQkodGVtcCAmIDB4MDIpID8gIjIgIiA6ICIiLAorCQkodGVtcCAmIDB4MDgpID8gIkQmUCIgOiAiIiwKKwkJKHRlbXAgJiAweDEwKSA/ICJGUERJLTIiIDogIiIpOworCSAgIGlmKHRlbXAgJiAweDAyKSB7CiAJICAgICAgaSA9IDM7ICAvKiBOdW1iZXIgb2YgcmV0cnlzICovCiAJICAgICAgZG8gewotCSAgICAJIHRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCi0JCQkJICAgICByZWFsY3J0bm8sIDEsICZidWZmZXJbMF0pOworCQkgdGVtcCA9IFNpU19IYW5kbGVEREMoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnZiZmxhZ3MsIGl2aWRlby0+c2lzdmdhX2VuZ2luZSwKKwkJCQkgICAgIHJlYWxjcnRubywgMSwgJmJ1ZmZlclswXSwgaXZpZGVvLT52YmZsYWdzMik7CiAJICAgICAgfSB3aGlsZSgodGVtcCkgJiYgaS0tKTsKLSAgICAgICAgICAgICAgaWYoIXRlbXApIHsKLQkgICAgCSBpZihzaXNmYl9pbnRlcnByZXRfZWRpZChtb25pdG9yLCAmYnVmZmVyWzBdKSkgeworCSAgICAgIGlmKCF0ZW1wKSB7CisJCSBpZihzaXNmYl9pbnRlcnByZXRfZWRpZChtb25pdG9yLCAmYnVmZmVyWzBdKSkgewogCQkgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IE1vbml0b3IgcmFuZ2UgSCAlZC0lZEtIeiwgViAlZC0lZEh6LCBNYXguIGRvdGNsb2NrICVkTUh6XG4iLAotCQkgICAgCW1vbml0b3ItPmhtaW4sIG1vbml0b3ItPmhtYXgsIG1vbml0b3ItPnZtaW4sIG1vbml0b3ItPnZtYXgsCisJCQltb25pdG9yLT5obWluLCBtb25pdG9yLT5obWF4LCBtb25pdG9yLT52bWluLCBtb25pdG9yLT52bWF4LAogCQkJbW9uaXRvci0+ZGNsb2NrbWF4IC8gMTAwMCk7CiAJCSB9IGVsc2UgewotCSAgICAgICAJICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgRURJRCBjb3JydXB0XG4iLCBjcnRubyArIDEpOwotCSAgICAJIH0KKwkJICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgRURJRCBjb3JydXB0XG4iLCBjcnRubyArIDEpOworCQkgfQogCSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAJIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDUlQlZCBEREMgcmVhZGluZyBmYWlsZWRcbiIsIGNydG5vICsgMSk7CisJCSBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ1JUJWQgRERDIHJlYWRpbmcgZmFpbGVkXG4iLCBjcnRubyArIDEpOwogCSAgICAgIH0KIAkgICB9IGVsc2UgewogCSAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBWRVNBIEQmUCBhbmQgRlBESS0yIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKQEAgLTUyNyw2ICs2MDUsOCBAQAogCX0KIH0KIAorLyogLS0tLS0tLS0tLS0tLS0gTW9kZSB2YWxpZGF0aW9uIC0tLS0tLS0tLS0tLS0tLSAqLworCiBzdGF0aWMgQk9PTEVBTgogc2lzZmJfdmVyaWZ5X3JhdGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHN0cnVjdCBzaXNmYl9tb25pdG9yICptb25pdG9yLAogCQlpbnQgbW9kZV9pZHgsIGludCByYXRlX2lkeCwgaW50IHJhdGUpCkBAIC01MzQsNDIgKzYxNCw0OSBAQAogCWludCBodG90YWwsIHZ0b3RhbDsKIAl1bnNpZ25lZCBpbnQgZGNsb2NrLCBoc3luYzsKIAotCWlmKCFtb25pdG9yLT5kYXRhdmFsaWQpIHJldHVybiBUUlVFOworCWlmKCFtb25pdG9yLT5kYXRhdmFsaWQpCisJCXJldHVybiBUUlVFOwogCi0JaWYobW9kZV9pZHggPCAwKSByZXR1cm4gRkFMU0U7CisJaWYobW9kZV9pZHggPCAwKQorCQlyZXR1cm4gRkFMU0U7CiAKIAkvKiBTa2lwIGZvciAzMjB4MjAwLCAzMjB4MjQwLCA2NDB4NDAwICovCi0gICAgCXN3aXRjaChzaXNiaW9zX21vZGVbbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldKSB7Ci0gICAgCWNhc2UgMHg1OToKLSAgICAJY2FzZSAweDQxOgotICAgIAljYXNlIDB4NGY6Ci0gICAgCWNhc2UgMHg1MDoKLSAgICAJY2FzZSAweDU2OgotICAgIAljYXNlIDB4NTM6Ci0gICAgCWNhc2UgMHgyZjoKLSAgICAJY2FzZSAweDVkOgotICAgIAljYXNlIDB4NWU6Ci0gICAgCQlyZXR1cm4gVFJVRTsKKwlzd2l0Y2goc2lzYmlvc19tb2RlW21vZGVfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXSkgeworCWNhc2UgMHg1OToKKwljYXNlIDB4NDE6CisJY2FzZSAweDRmOgorCWNhc2UgMHg1MDoKKwljYXNlIDB4NTY6CisJY2FzZSAweDUzOgorCWNhc2UgMHgyZjoKKwljYXNlIDB4NWQ6CisJY2FzZSAweDVlOgorCQlyZXR1cm4gVFJVRTsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWNhc2UgMHg1YToKIAljYXNlIDB4NWI6CiAJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgcmV0dXJuIFRSVUU7CiAjZW5kaWYKLSAgICAJfQorCX0KIAotCWlmKHJhdGUgPCAobW9uaXRvci0+dm1pbiAtIDEpKSByZXR1cm4gRkFMU0U7Ci0JaWYocmF0ZSA+IChtb25pdG9yLT52bWF4ICsgMSkpIHJldHVybiBGQUxTRTsKKwlpZihyYXRlIDwgKG1vbml0b3ItPnZtaW4gLSAxKSkKKwkJcmV0dXJuIEZBTFNFOworCWlmKHJhdGUgPiAobW9uaXRvci0+dm1heCArIDEpKQorCQlyZXR1cm4gRkFMU0U7CiAKLQlpZihzaXNmYl9nZXR0b3RhbGZyb21tb2RlKCZpdmlkZW8tPlNpU19QciwgJml2aWRlby0+c2lzaHdfZXh0LAorCWlmKHNpc2ZiX2dldHRvdGFsZnJvbW1vZGUoJml2aWRlby0+U2lTX1ByLAogCQkJCSAgc2lzYmlvc19tb2RlW21vZGVfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZodG90YWwsICZ2dG90YWwsIHJhdGVfaWR4KSkgeworCQkJCSAgJmh0b3RhbCwgJnZ0b3RhbCwgcmF0ZV9pZHgpKSB7CiAJCWRjbG9jayA9IChodG90YWwgKiB2dG90YWwgKiByYXRlKSAvIDEwMDA7Ci0JCWlmKGRjbG9jayA+IChtb25pdG9yLT5kY2xvY2ttYXggKyAxMDAwKSkgcmV0dXJuIEZBTFNFOworCQlpZihkY2xvY2sgPiAobW9uaXRvci0+ZGNsb2NrbWF4ICsgMTAwMCkpCisJCQlyZXR1cm4gRkFMU0U7CiAJCWhzeW5jID0gZGNsb2NrIC8gaHRvdGFsOwotCQlpZihoc3luYyA8IChtb25pdG9yLT5obWluIC0gMSkpIHJldHVybiBGQUxTRTsKLQkJaWYoaHN5bmMgPiAobW9uaXRvci0+aG1heCArIDEpKSByZXR1cm4gRkFMU0U7CisJCWlmKGhzeW5jIDwgKG1vbml0b3ItPmhtaW4gLSAxKSkKKwkJCXJldHVybiBGQUxTRTsKKwkJaWYoaHN5bmMgPiAobW9uaXRvci0+aG1heCArIDEpKQorCQkJcmV0dXJuIEZBTFNFOwogICAgICAgICB9IGVsc2UgewotCSAgCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIEZBTFNFOwogCX0KIAlyZXR1cm4gVFJVRTsKIH0KQEAgLTU3Nyw4MiArNjY0LDc5IEBACiBzdGF0aWMgaW50CiBzaXNmYl92YWxpZGF0ZV9tb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgbXlpbmRleCwgdTMyIHZiZmxhZ3MpCiB7Ci0gICB1MTYgeHJlcz0wLCB5cmVzLCBteXJlczsKKwl1MTYgeHJlcz0wLCB5cmVzLCBteXJlczsKIAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLSAgICAgIGlmKCEoc2lzYmlvc19tb2RlW215aW5kZXhdLmNoaXBzZXQgJiBNRF9TSVMzMDApKSByZXR1cm4oLTEpOwotICAgfQorCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQlpZighKHNpc2Jpb3NfbW9kZVtteWluZGV4XS5jaGlwc2V0ICYgTURfU0lTMzAwKSkKKwkJCXJldHVybiAtMSA7CisJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKLSAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgaWYoIShzaXNiaW9zX21vZGVbbXlpbmRleF0uY2hpcHNldCAmIE1EX1NJUzMxNSkpIHJldHVybigtMSk7Ci0gICB9CisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCWlmKCEoc2lzYmlvc19tb2RlW215aW5kZXhdLmNoaXBzZXQgJiBNRF9TSVMzMTUpKQorCQkJcmV0dXJuIC0xOworCX0KICNlbmRpZgogCi0gICBteXJlcyA9IHNpc2Jpb3NfbW9kZVtteWluZGV4XS55cmVzOworCW15cmVzID0gc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXM7CiAKLSAgIHN3aXRjaCh2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpIHsKKwlzd2l0Y2godmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7CiAKLSAgICAgY2FzZSBDUlQyX0xDRDoKKwljYXNlIENSVDJfTENEOgorCQl4cmVzID0gaXZpZGVvLT5sY2R4cmVzOyB5cmVzID0gaXZpZGVvLT5sY2R5cmVzOwogCi0gICAgICAgIHhyZXMgPSBpdmlkZW8tPmxjZHhyZXM7IHlyZXMgPSBpdmlkZW8tPmxjZHlyZXM7CisJCWlmKChpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCAhPSBDVVRfUEFORUw4NDgpICYmCisJCSAgIChpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCAhPSBDVVRfUEFORUw4NTYpKSB7CisJCQlpZihzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcyA+IHhyZXMpCisJCQkJcmV0dXJuIC0xOworCQkJaWYobXlyZXMgPiB5cmVzKQorCQkJCXJldHVybiAtMTsKKwkJfQogCi0JaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgIT0gQ1VUX1BBTkVMODQ4KSB7Ci0JICAgCWlmKHNpc2Jpb3NfbW9kZVtteWluZGV4XS54cmVzID4geHJlcykgcmV0dXJuKC0xKTsKLSAgICAgICAgICAgCWlmKG15cmVzID4geXJlcykgcmV0dXJuKC0xKTsKKwkJaWYoaXZpZGVvLT5zaXNmYl9mc3RuKSB7CisJCQlpZihzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcyA9PSAzMjApIHsKKwkJCQlpZihteXJlcyA9PSAyNDApIHsKKwkJCQkJc3dpdGNoKHNpc2Jpb3NfbW9kZVtteWluZGV4XS5tb2RlX25vWzFdKSB7CisJCQkJCQljYXNlIDB4NTA6IG15aW5kZXggPSBNT0RFX0ZTVE5fODsgIGJyZWFrOworCQkJCQkJY2FzZSAweDU2OiBteWluZGV4ID0gTU9ERV9GU1ROXzE2OyBicmVhazsKKwkJCQkJCWNhc2UgMHg1MzogcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoU2lTX0dldE1vZGVJRF9MQ0QoaXZpZGVvLT5zaXN2Z2FfZW5naW5lLCB2YmZsYWdzLCBzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcywKKwkJCSAJc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXMsIDAsIGl2aWRlby0+c2lzZmJfZnN0biwKKwkJCSAJaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQsIHhyZXMsIHlyZXMsIGl2aWRlby0+dmJmbGFnczIpIDwgMHgxNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDUlQyX1RWOgorCQlpZihTaVNfR2V0TW9kZUlEX1RWKGl2aWRlby0+c2lzdmdhX2VuZ2luZSwgdmJmbGFncywgc2lzYmlvc19tb2RlW215aW5kZXhdLnhyZXMsCisJCQkJc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXMsIDAsIGl2aWRlby0+dmJmbGFnczIpIDwgMHgxNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDUlQyX1ZHQToKKwkJaWYoU2lTX0dldE1vZGVJRF9WR0EyKGl2aWRlby0+c2lzdmdhX2VuZ2luZSwgdmJmbGFncywgc2lzYmlvc19tb2RlW215aW5kZXhdLnhyZXMsCisJCQkJc2lzYmlvc19tb2RlW215aW5kZXhdLnlyZXMsIDAsIGl2aWRlby0+dmJmbGFnczIpIDwgMHgxNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOwogCX0KIAotCWlmKHZiZmxhZ3MgJiAoVkJfTFZEUyB8IFZCXzMweEJESCkpIHsKLQkgICBpZihzaXNiaW9zX21vZGVbbXlpbmRleF0ueHJlcyA9PSAzMjApIHsKLQkgICAgICBpZigobXlyZXMgPT0gMjQwKSB8fCAobXlyZXMgPT0gNDgwKSkgewotCQkgaWYoIWl2aWRlby0+c2lzZmJfZnN0bikgewotCQkgICAgaWYoc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1YSB8fAotCQkgICAgICAgc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1YikKLQkJICAgICAgIHJldHVybigtMSk7Ci0JCSB9IGVsc2UgewotCQkgICAgaWYoc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1MCB8fAotCQkgICAgICAgc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1NiB8fAotCQkgICAgICAgc2lzYmlvc19tb2RlW215aW5kZXhdLm1vZGVfbm9bMV0gPT0gMHg1MykKLQkJICAgICAgIHJldHVybigtMSk7Ci0JCSB9Ci0JICAgICAgfQotCSAgIH0KLQl9Ci0KLQlpZihTaVNfR2V0TW9kZUlEX0xDRChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIHZiZmxhZ3MsIHNpc2Jpb3NfbW9kZVtteWluZGV4XS54cmVzLAotCQkJICAgICBzaXNiaW9zX21vZGVbbXlpbmRleF0ueXJlcywgMCwgaXZpZGVvLT5zaXNmYl9mc3RuLAotCQkJICAgICBpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCwgeHJlcywgeXJlcykgPCAweDE0KSB7Ci0JICAgCXJldHVybigtMSk7Ci0JfQotCWJyZWFrOwotCi0gICAgIGNhc2UgQ1JUMl9UVjoKLQlpZihTaVNfR2V0TW9kZUlEX1RWKGl2aWRlby0+c2lzdmdhX2VuZ2luZSwgdmJmbGFncywgc2lzYmlvc19tb2RlW215aW5kZXhdLnhyZXMsCi0JICAgICAgICAgICAgICAgICAgICBzaXNiaW9zX21vZGVbbXlpbmRleF0ueXJlcywgMCkgPCAweDE0KSB7Ci0JICAgCXJldHVybigtMSk7Ci0JfQotCWJyZWFrOwotCi0gICAgIGNhc2UgQ1JUMl9WR0E6Ci0gICAgICAgIGlmKFNpU19HZXRNb2RlSURfVkdBMihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIHZiZmxhZ3MsIHNpc2Jpb3NfbW9kZVtteWluZGV4XS54cmVzLAotCSAgICAgICAgICAgICAgICAgICAgICBzaXNiaW9zX21vZGVbbXlpbmRleF0ueXJlcywgMCkgPCAweDE0KSB7Ci0JICAgCXJldHVybigtMSk7Ci0JfQotCWJyZWFrOwotICAgICB9Ci0KLSAgICAgcmV0dXJuKG15aW5kZXgpOworCXJldHVybiBteWluZGV4OwogfQogCiBzdGF0aWMgdTgKIHNpc2ZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHVuc2lnbmVkIGludCByYXRlLCBpbnQgbW9kZV9pZHgpCiB7Ci0JdTE2IHhyZXMsIHlyZXM7CiAJaW50IGkgPSAwOwotCi0JeHJlcyA9IHNpc2Jpb3NfbW9kZVttb2RlX2lkeF0ueHJlczsKLQl5cmVzID0gc2lzYmlvc19tb2RlW21vZGVfaWR4XS55cmVzOworCXUxNiB4cmVzID0gc2lzYmlvc19tb2RlW21vZGVfaWR4XS54cmVzOworCXUxNiB5cmVzID0gc2lzYmlvc19tb2RlW21vZGVfaWR4XS55cmVzOwogCiAJaXZpZGVvLT5yYXRlX2lkeCA9IDA7CiAJd2hpbGUoKHNpc2ZiX3ZyYXRlW2ldLmlkeCAhPSAwKSAmJiAoc2lzZmJfdnJhdGVbaV0ueHJlcyA8PSB4cmVzKSkgewpAQCAtNjcyLDE0ICs3NTYsMTQgQEAKIAkJCQkJCXJhdGUsIHNpc2ZiX3ZyYXRlW2ktMV0ucmVmcmVzaCk7CiAJCQkJCWl2aWRlby0+cmF0ZV9pZHggPSBzaXNmYl92cmF0ZVtpLTFdLmlkeDsKIAkJCQkJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSBzaXNmYl92cmF0ZVtpLTFdLnJlZnJlc2g7Ci0JCQkJfSAKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgaWYoKHJhdGUgLSBzaXNmYl92cmF0ZVtpXS5yZWZyZXNoKSA8PSAyKSB7CiAJCQkJRFBSSU5USygic2lzZmI6IEFkanVzdGluZyByYXRlIGZyb20gJWQgZG93biB0byAlZFxuIiwKIAkJCQkJCXJhdGUsIHNpc2ZiX3ZyYXRlW2ldLnJlZnJlc2gpOwotCSAgICAgICAgICAgCQlpdmlkZW8tPnJhdGVfaWR4ID0gc2lzZmJfdnJhdGVbaV0uaWR4OwotCQkgICAJCWJyZWFrOwotCSAgICAgICAJCX0KKwkJCQlpdmlkZW8tPnJhdGVfaWR4ID0gc2lzZmJfdnJhdGVbaV0uaWR4OworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJCWkrKzsKIAl9CkBAIC02OTUsMjUyICs3NzksMzIxIEBACiBzdGF0aWMgQk9PTEVBTgogc2lzZmJfYnJpZGdlaXNzbGF2ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIHVuc2lnbmVkIGNoYXIgUDFfMDA7CisJdW5zaWduZWQgY2hhciBQMV8wMDsKIAotICAgaWYoIShpdmlkZW8tPnZiZmxhZ3MgJiBWQl9WSURFT0JSSURHRSkpIHJldHVybiBGQUxTRTsKKwlpZighKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfVklERU9CUklER0UpKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgIGluU0lTSURYUkVHKFNJU1BBUlQxLDB4MDAsUDFfMDApOwotICAgaWYoICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSAmJiAoUDFfMDAgJiAweGEwKSA9PSAweDIwKSB8fAotICAgICAgICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJiAoUDFfMDAgJiAweDUwKSA9PSAweDEwKSApIHsKLQkgICByZXR1cm4gVFJVRTsKLSAgIH0gZWxzZSB7Ci0gICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgIH0KKwlpblNJU0lEWFJFRyhTSVNQQVJUMSwweDAwLFAxXzAwKTsKKwlpZiggKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmIChQMV8wMCAmIDB4YTApID09IDB4MjApIHx8CisJICAgICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJiAoUDFfMDAgJiAweDUwKSA9PSAweDEwKSApIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KIH0KIAogc3RhdGljIEJPT0xFQU4KIHNpc2ZiYWxsb3dyZXRyYWNlY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIHU4IHRlbXA7CisJdTggdGVtcDsKIAotICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHgxNyx0ZW1wKTsKLSAgIGlmKCEodGVtcCAmIDB4ODApKSByZXR1cm4gRkFMU0U7CisJaW5TSVNJRFhSRUcoU0lTQ1IsMHgxNyx0ZW1wKTsKKwlpZighKHRlbXAgJiAweDgwKSkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICBpblNJU0lEWFJFRyhTSVNTUiwweDFmLHRlbXApOwotICAgaWYodGVtcCAmIDB4YzApIHJldHVybiBGQUxTRTsKKwlpblNJU0lEWFJFRyhTSVNTUiwweDFmLHRlbXApOworCWlmKHRlbXAgJiAweGMwKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOwogfQogCiBzdGF0aWMgQk9PTEVBTgogc2lzZmJjaGVja3ZyZXRyYWNlY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIGlmKCFzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkgcmV0dXJuIEZBTFNFOworCWlmKCFzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICBpZihpblNJU1JFRyhTSVNJTlBTVEFUKSAmIDB4MDgpIHJldHVybiBUUlVFOwotICAgZWxzZSAJCQkgICByZXR1cm4gRkFMU0U7CisJaWYoaW5TSVNSRUcoU0lTSU5QU1RBVCkgJiAweDA4KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKIH0KIAogc3RhdGljIHZvaWQKIHNpc2Zid2FpdHJldHJhY2VjcnQxKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgaW50IHdhdGNoZG9nOworCWludCB3YXRjaGRvZzsKIAotICAgaWYoIXNpc2ZiYWxsb3dyZXRyYWNlY3J0MShpdmlkZW8pKSByZXR1cm47CisJaWYoIXNpc2ZiYWxsb3dyZXRyYWNlY3J0MShpdmlkZW8pKQorCQlyZXR1cm47CiAKLSAgIHdhdGNoZG9nID0gNjU1MzY7Ci0gICB3aGlsZSgoIShpblNJU1JFRyhTSVNJTlBTVEFUKSAmIDB4MDgpKSAmJiAtLXdhdGNoZG9nKTsKLSAgIHdhdGNoZG9nID0gNjU1MzY7Ci0gICB3aGlsZSgoaW5TSVNSRUcoU0lTSU5QU1RBVCkgJiAweDA4KSAmJiAtLXdhdGNoZG9nKTsKKwl3YXRjaGRvZyA9IDY1NTM2OworCXdoaWxlKCghKGluU0lTUkVHKFNJU0lOUFNUQVQpICYgMHgwOCkpICYmIC0td2F0Y2hkb2cpOworCXdhdGNoZG9nID0gNjU1MzY7CisJd2hpbGUoKGluU0lTUkVHKFNJU0lOUFNUQVQpICYgMHgwOCkgJiYgLS13YXRjaGRvZyk7CiB9CiAKIHN0YXRpYyBCT09MRUFOCiBzaXNmYmNoZWNrdnJldHJhY2VjcnQyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgdW5zaWduZWQgY2hhciB0ZW1wLCByZWc7CisJdW5zaWduZWQgY2hhciB0ZW1wLCByZWc7CiAKLSAgIHN3aXRjaChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUpIHsKLSAgIGNhc2UgU0lTXzMwMF9WR0E6IHJlZyA9IDB4MjU7IGJyZWFrOwotICAgY2FzZSBTSVNfMzE1X1ZHQTogcmVnID0gMHgzMDsgYnJlYWs7Ci0gICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICB9CisJc3dpdGNoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSkgeworCWNhc2UgU0lTXzMwMF9WR0E6IHJlZyA9IDB4MjU7IGJyZWFrOworCWNhc2UgU0lTXzMxNV9WR0E6IHJlZyA9IDB4MzA7IGJyZWFrOworCWRlZmF1bHQ6CSAgcmV0dXJuIEZBTFNFOworCX0KIAotICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsIHJlZywgdGVtcCk7Ci0gICBpZih0ZW1wICYgMHgwMikgcmV0dXJuIFRSVUU7Ci0gICBlbHNlIAkgICByZXR1cm4gRkFMU0U7CisJaW5TSVNJRFhSRUcoU0lTUEFSVDEsIHJlZywgdGVtcCk7CisJaWYodGVtcCAmIDB4MDIpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOwogfQogCiBzdGF0aWMgQk9PTEVBTgogc2lzZmJfQ2hlY2tWQlJldHJhY2Uoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCiB7Ci0gICBpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpIHsKLSAgICAgIGlmKHNpc2ZiX2JyaWRnZWlzc2xhdmUoaXZpZGVvKSkgewotICAgICAgICAgcmV0dXJuKHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoaXZpZGVvKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgcmV0dXJuKHNpc2ZiY2hlY2t2cmV0cmFjZWNydDIoaXZpZGVvKSk7Ci0gICAgICB9Ci0gICB9IAotICAgcmV0dXJuKHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoaXZpZGVvKSk7CisJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7CisJCWlmKCFzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIHsKKwkJCXJldHVybiBzaXNmYmNoZWNrdnJldHJhY2VjcnQyKGl2aWRlbyk7CisJCX0KKwl9CisJcmV0dXJuIHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoaXZpZGVvKTsKIH0KIAogc3RhdGljIHUzMgogc2lzZmJfc2V0dXB2YmJsYW5rZmxhZ3Moc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHUzMiAqdmNvdW50LCB1MzIgKmhjb3VudCkKIHsKLSAgIHU4IGlkeCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKLSAgIHUzMiByZXQgPSAwOworCXU4IGlkeCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKKwl1MzIgcmV0ID0gMDsKIAotICAgKCp2Y291bnQpID0gKCpoY291bnQpID0gMDsKKwkoKnZjb3VudCkgPSAoKmhjb3VudCkgPSAwOwogCi0gICBpZigoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSAmJiAoIShzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpKSkgewotICAgICAgcmV0IHw9IChGQl9WQkxBTktfSEFWRV9WU1lOQyAgfAotICAgICAgCSAgICAgIEZCX1ZCTEFOS19IQVZFX0hCTEFOSyB8Ci0gICAgICAgICAgICAgIEZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8Ci0JICAgICAgRkJfVkJMQU5LX0hBVkVfVkNPVU5UIHwKLQkgICAgICBGQl9WQkxBTktfSEFWRV9IQ09VTlQpOwotICAgICAgc3dpdGNoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSkgewotICAgICAgICAgY2FzZSBTSVNfMzAwX1ZHQTogaWR4ID0gMHgyNTsgYnJlYWs7Ci0JIGRlZmF1bHQ6Ci0gICAgICAgICBjYXNlIFNJU18zMTVfVkdBOiBpZHggPSAweDMwOyBicmVhazsKLSAgICAgIH0KLSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQxLChpZHgrMCkscmVnMSk7IC8qIDMwICovCi0gICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMSwoaWR4KzEpLHJlZzIpOyAvKiAzMSAqLwotICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCsyKSxyZWczKTsgLyogMzIgKi8KLSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQxLChpZHgrMykscmVnNCk7IC8qIDMzICovCi0gICAgICBpZihyZWcxICYgMHgwMSkgcmV0IHw9IEZCX1ZCTEFOS19WQkxBTktJTkc7Ci0gICAgICBpZihyZWcxICYgMHgwMikgcmV0IHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKLSAgICAgIGlmKHJlZzQgJiAweDgwKSByZXQgfD0gRkJfVkJMQU5LX0hCTEFOS0lORzsKLSAgICAgICgqdmNvdW50KSA9IHJlZzMgfCAoKHJlZzQgJiAweDcwKSA8PCA0KTsKLSAgICAgICgqaGNvdW50KSA9IHJlZzIgfCAoKHJlZzQgJiAweDBmKSA8PCA4KTsKLSAgIH0gZWxzZSBpZihzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkgewotICAgICAgcmV0IHw9IChGQl9WQkxBTktfSEFWRV9WU1lOQyAgfAotICAgICAgICAgICAgICBGQl9WQkxBTktfSEFWRV9WQkxBTksgfAotCSAgICAgIEZCX1ZCTEFOS19IQVZFX1ZDT1VOVCB8Ci0JICAgICAgRkJfVkJMQU5LX0hBVkVfSENPVU5UKTsKLSAgICAgIHJlZzEgPSBpblNJU1JFRyhTSVNJTlBTVEFUKTsKLSAgICAgIGlmKHJlZzEgJiAweDA4KSByZXQgfD0gRkJfVkJMQU5LX1ZTWU5DSU5HOwotICAgICAgaWYocmVnMSAmIDB4MDEpIHJldCB8PSBGQl9WQkxBTktfVkJMQU5LSU5HOwotICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHgyMCxyZWcxKTsKLSAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4MWIscmVnMSk7Ci0gICAgICBpblNJU0lEWFJFRyhTSVNDUiwweDFjLHJlZzIpOwotICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHgxZCxyZWczKTsKLSAgICAgICgqdmNvdW50KSA9IHJlZzIgfCAoKHJlZzMgJiAweDA3KSA8PCA4KTsKLSAgICAgICgqaGNvdW50KSA9IChyZWcxIHwgKChyZWczICYgMHgxMCkgPDwgNCkpIDw8IDM7Ci0gICB9Ci0gICByZXR1cm4gcmV0OworCWlmKChpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpICYmICghKHNpc2ZiX2JyaWRnZWlzc2xhdmUoaXZpZGVvKSkpKSB7CisKKwkJcmV0IHw9IChGQl9WQkxBTktfSEFWRV9WU1lOQyAgfAorCQkJRkJfVkJMQU5LX0hBVkVfSEJMQU5LIHwKKwkJCUZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8CisJCQlGQl9WQkxBTktfSEFWRV9WQ09VTlQgfAorCQkJRkJfVkJMQU5LX0hBVkVfSENPVU5UKTsKKwkJc3dpdGNoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSkgeworCQkJY2FzZSBTSVNfMzAwX1ZHQTogaWR4ID0gMHgyNTsgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJY2FzZSBTSVNfMzE1X1ZHQTogaWR4ID0gMHgzMDsgYnJlYWs7CisJCX0KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCswKSxyZWcxKTsgLyogMzAgKi8KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCsxKSxyZWcyKTsgLyogMzEgKi8KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCsyKSxyZWczKTsgLyogMzIgKi8KKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsKGlkeCszKSxyZWc0KTsgLyogMzMgKi8KKwkJaWYocmVnMSAmIDB4MDEpIHJldCB8PSBGQl9WQkxBTktfVkJMQU5LSU5HOworCQlpZihyZWcxICYgMHgwMikgcmV0IHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKKwkJaWYocmVnNCAmIDB4ODApIHJldCB8PSBGQl9WQkxBTktfSEJMQU5LSU5HOworCQkoKnZjb3VudCkgPSByZWczIHwgKChyZWc0ICYgMHg3MCkgPDwgNCk7CisJCSgqaGNvdW50KSA9IHJlZzIgfCAoKHJlZzQgJiAweDBmKSA8PCA4KTsKKworCX0gZWxzZSBpZihzaXNmYmFsbG93cmV0cmFjZWNydDEoaXZpZGVvKSkgeworCisJCXJldCB8PSAoRkJfVkJMQU5LX0hBVkVfVlNZTkMgIHwKKwkJCUZCX1ZCTEFOS19IQVZFX1ZCTEFOSyB8CisJCQlGQl9WQkxBTktfSEFWRV9WQ09VTlQgfAorCQkJRkJfVkJMQU5LX0hBVkVfSENPVU5UKTsKKwkJcmVnMSA9IGluU0lTUkVHKFNJU0lOUFNUQVQpOworCQlpZihyZWcxICYgMHgwOCkgcmV0IHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKKwkJaWYocmVnMSAmIDB4MDEpIHJldCB8PSBGQl9WQkxBTktfVkJMQU5LSU5HOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDIwLHJlZzEpOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDFiLHJlZzEpOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDFjLHJlZzIpOworCQlpblNJU0lEWFJFRyhTSVNDUiwweDFkLHJlZzMpOworCQkoKnZjb3VudCkgPSByZWcyIHwgKChyZWczICYgMHgwNykgPDwgOCk7CisJCSgqaGNvdW50KSA9IChyZWcxIHwgKChyZWczICYgMHgxMCkgPDwgNCkpIDw8IDM7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAogc2lzZmJfbXlibGFuayhzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IGJsYW5rKQogewotICAgdTggc3IwMSwgc3IxMSwgc3IxZiwgY3I2Mz0wLCBwMl8wLCBwMV8xMzsKLSAgIEJPT0xFQU4gYmFja2xpZ2h0ID0gVFJVRTsKKwl1OCBzcjAxLCBzcjExLCBzcjFmLCBjcjYzPTAsIHAyXzAsIHAxXzEzOworCUJPT0xFQU4gYmFja2xpZ2h0ID0gVFJVRTsKIAotICAgc3dpdGNoKGJsYW5rKSB7Ci0gICBjYXNlIEZCX0JMQU5LX1VOQkxBTks6CS8qIG9uICovCi0gICAgICBzcjAxICA9IDB4MDA7Ci0gICAgICBzcjExICA9IDB4MDA7Ci0gICAgICBzcjFmICA9IDB4MDA7Ci0gICAgICBjcjYzICA9IDB4MDA7Ci0gICAgICBwMl8wICA9IDB4MjA7Ci0gICAgICBwMV8xMyA9IDB4MDA7Ci0gICAgICBiYWNrbGlnaHQgPSBUUlVFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEZCX0JMQU5LX05PUk1BTDoJLyogYmxhbmsgKi8KLSAgICAgIHNyMDEgID0gMHgyMDsKLSAgICAgIHNyMTEgID0gMHgwMDsKLSAgICAgIHNyMWYgID0gMHgwMDsKLSAgICAgIGNyNjMgID0gMHgwMDsKLSAgICAgIHAyXzAgID0gMHgyMDsKLSAgICAgIHAxXzEzID0gMHgwMDsKLSAgICAgIGJhY2tsaWdodCA9IFRSVUU7Ci0gICAgICBicmVhazsKLSAgIGNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoJLyogbm8gdnN5bmMgKi8KLSAgICAgIHNyMDEgID0gMHgyMDsKLSAgICAgIHNyMTEgID0gMHgwODsKLSAgICAgIHNyMWYgID0gMHg4MDsKLSAgICAgIGNyNjMgID0gMHg0MDsKLSAgICAgIHAyXzAgID0gMHg0MDsKLSAgICAgIHAxXzEzID0gMHg4MDsKLSAgICAgIGJhY2tsaWdodCA9IEZBTFNFOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CS8qIG5vIGhzeW5jICovCi0gICAgICBzcjAxICA9IDB4MjA7Ci0gICAgICBzcjExICA9IDB4MDg7Ci0gICAgICBzcjFmICA9IDB4NDA7Ci0gICAgICBjcjYzICA9IDB4NDA7Ci0gICAgICBwMl8wICA9IDB4ODA7Ci0gICAgICBwMV8xMyA9IDB4NDA7Ci0gICAgICBiYWNrbGlnaHQgPSBGQUxTRTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CS8qIG9mZiAqLwotICAgICAgc3IwMSAgPSAweDIwOwotICAgICAgc3IxMSAgPSAweDA4OwotICAgICAgc3IxZiAgPSAweGMwOwotICAgICAgY3I2MyAgPSAweDQwOwotICAgICAgcDJfMCAgPSAweGMwOwotICAgICAgcDFfMTMgPSAweGMwOwotICAgICAgYmFja2xpZ2h0ID0gRkFMU0U7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KKwlzd2l0Y2goYmxhbmspIHsKKwkJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgkvKiBvbiAqLworCQkJc3IwMSAgPSAweDAwOworCQkJc3IxMSAgPSAweDAwOworCQkJc3IxZiAgPSAweDAwOworCQkJY3I2MyAgPSAweDAwOworCQkJcDJfMCAgPSAweDIwOworCQkJcDFfMTMgPSAweDAwOworCQkJYmFja2xpZ2h0ID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlIEZCX0JMQU5LX05PUk1BTDoJLyogYmxhbmsgKi8KKwkJCXNyMDEgID0gMHgyMDsKKwkJCXNyMTEgID0gMHgwMDsKKwkJCXNyMWYgID0gMHgwMDsKKwkJCWNyNjMgID0gMHgwMDsKKwkJCXAyXzAgID0gMHgyMDsKKwkJCXAxXzEzID0gMHgwMDsKKwkJCWJhY2tsaWdodCA9IFRSVUU7CisJCQlicmVhazsKKwkJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgkvKiBubyB2c3luYyAqLworCQkJc3IwMSAgPSAweDIwOworCQkJc3IxMSAgPSAweDA4OworCQkJc3IxZiAgPSAweDgwOworCQkJY3I2MyAgPSAweDQwOworCQkJcDJfMCAgPSAweDQwOworCQkJcDFfMTMgPSAweDgwOworCQkJYmFja2xpZ2h0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgkvKiBubyBoc3luYyAqLworCQkJc3IwMSAgPSAweDIwOworCQkJc3IxMSAgPSAweDA4OworCQkJc3IxZiAgPSAweDQwOworCQkJY3I2MyAgPSAweDQwOworCQkJcDJfMCAgPSAweDgwOworCQkJcDFfMTMgPSAweDQwOworCQkJYmFja2xpZ2h0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CS8qIG9mZiAqLworCQkJc3IwMSAgPSAweDIwOworCQkJc3IxMSAgPSAweDA4OworCQkJc3IxZiAgPSAweGMwOworCQkJY3I2MyAgPSAweDQwOworCQkJcDJfMCAgPSAweGMwOworCQkJcDFfMTMgPSAweGMwOworCQkJYmFja2xpZ2h0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCX0KIAotICAgaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDEpIHsKKwlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfQ1JUMSkgewogCi0gICAgICBpZiggKCFpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgfHwKLSAgICAgICAgICAoKGl2aWRlby0+c2lzZmJfdGhpc21vbml0b3IuZGF0YXZhbGlkKSAmJgotICAgICAgICAgICAoaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvci5mZWF0dXJlICYgMHhlMCkpKSB7CisJCWlmKCAoIWl2aWRlby0+c2lzZmJfdGhpc21vbml0b3IuZGF0YXZhbGlkKSB8fAorCQkgICAgKChpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgJiYKKwkJICAgICAoaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvci5mZWF0dXJlICYgMHhlMCkpKSB7CiAKLQkgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNDUiwgaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MywgMHhiZiwgY3I2Myk7Ci0JIH0KKwkJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJCXNldFNJU0lEWFJFRyhTSVNDUiwgaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MywgMHhiZiwgY3I2Myk7CisJCQl9CiAKLQkgaWYoIShzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNTUiwgMHgwMSwgfjB4MjAsIHNyMDEpOwotCSAgICBzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MWYsIDB4M2YsIHNyMWYpOwotCSB9Ci0gICAgICB9CisJCQlpZighKHNpc2ZiX2JyaWRnZWlzc2xhdmUoaXZpZGVvKSkpIHsKKwkJCQlzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MDEsIH4weDIwLCBzcjAxKTsKKwkJCQlzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MWYsIDB4M2YsIHNyMWYpOworCQkJfQorCQl9CiAKLSAgIH0KKwl9CiAKLSAgIGlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX0xDRCkgeworCWlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX0xDRCkgewogCi0gICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfMzAxTFZ8VkJfMzAyTFZ8VkJfMzAyRUxWKSkgewotCSBpZihiYWNrbGlnaHQpIHsKLQkgICAgU2lTX1NpUzMweEJMT24oJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQpOwotCSB9IGVsc2UgewotCSAgICBTaVNfU2lTMzB4QkxPZmYoJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQpOwotCSB9Ci0gICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7Ci0JICAgIGlmKGJhY2tsaWdodCkgewotCSAgICAgICBTaVNfQ2hyb250ZWw3MDF4QkxPbigmaXZpZGVvLT5TaVNfUHIsJml2aWRlby0+c2lzaHdfZXh0KTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgU2lTX0Nocm9udGVsNzAxeEJMT2ZmKCZpdmlkZW8tPlNpU19Qcik7Ci0JICAgIH0KLQkgfQotICAgICAgfQorCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0xWRFNCUklER0UpIHsKKwkJCWlmKGJhY2tsaWdodCkgeworCQkJCVNpU19TaVMzMHhCTE9uKCZpdmlkZW8tPlNpU19Qcik7CisJCQl9IGVsc2UgeworCQkJCVNpU19TaVMzMHhCTE9mZigmaXZpZGVvLT5TaVNfUHIpOworCQkJfQorCQl9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKKwkJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpIHsKKwkJCQlpZihiYWNrbGlnaHQpIHsKKwkJCQkJU2lTX0Nocm9udGVsNzAxeEJMT24oJml2aWRlby0+U2lTX1ByKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTaVNfQ2hyb250ZWw3MDF4QkxPZmYoJml2aWRlby0+U2lTX1ByKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJfQogCi0gICAgICBpZigoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYKLSAgICAgICAgICAoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMXxWQl8zMHhCREh8VkJfTFZEUykpKSB8fAotICAgICAgICAgKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmCi0gICAgICAgICAgKChpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfTFZEUyB8IFZCX0NIUk9OVEVMKSkgPT0gVkJfTFZEUykpKSB7Ci0gICAgICAgICAgc2V0U0lTSURYUkVHKFNJU1NSLCAweDExLCB+MHgwYywgc3IxMSk7Ci0gICAgICB9CisJCWlmKCgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSAmJgorCQkgICAgKGl2aWRlby0+dmJmbGFnczIgJiAoVkIyXzMwMXxWQjJfMzB4QkRIfFZCMl9MVkRTKSkpIHx8CisJCSAgICgoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJgorCQkgICAgKChpdmlkZW8tPnZiZmxhZ3MyICYgKFZCMl9MVkRTIHwgVkIyX0NIUk9OVEVMKSkgPT0gVkIyX0xWRFMpKSkgeworCQkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDExLCB+MHgwYywgc3IxMSk7CisJCX0KIAotICAgICAgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0gICAgICAgICBpZigoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgJiYKLSAgICAgICAgICAgICghKGl2aWRlby0+dmJmbGFncyAmIFZCXzMweEJESCkpKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgxMywgMHgzZiwgcDFfMTMpOwotCSB9Ci0gICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0gICAgICAgICBpZigoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgJiYKLSAgICAgICAgICAgICghKGl2aWRlby0+dmJmbGFncyAmIFZCXzMweEJESCkpKSB7Ci0JICAgIHNldFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgwMCwgMHgxZiwgcDJfMCk7Ci0JIH0KLSAgICAgIH0KKwkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCQlpZigoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCKSAmJgorCQkJICAgKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCREgpKSkgeworCQkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgxMywgMHgzZiwgcDFfMTMpOworCQkJfQorCQl9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCQlpZigoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCKSAmJgorCQkJICAgKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCREgpKSkgeworCQkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgwMCwgMHgxZiwgcDJfMCk7CisJCQl9CisJCX0KIAotICAgfSBlbHNlIGlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX1ZHQSkgeworCX0gZWxzZSBpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9WR0EpIHsKIAotICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCKSkgewotICAgICAgICAgc2V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDAwLCAweDFmLCBwMl8wKTsKLSAgICAgIH0KKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhCKSB7CisJCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MDAsIDB4MWYsIHAyXzApOworCQl9CiAKLSAgIH0KKwl9CiAKLSAgIHJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAorLyogLS0tLS0tLS0tLS0tLSBDYWxsYmFja3MgZnJvbSBpbml0LmMvaW5pdDMwMS5jICAtLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKK3Vuc2lnbmVkIGludAorc2lzZmJfcmVhZF9uYnJpZGdlX3BjaV9kd29yZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHJlZykKK3sKKyAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKVNpU19Qci0+aXZpZGVvOworICAgdTMyIHZhbCA9IDA7CisKKyAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChpdmlkZW8tPm5icmlkZ2UsIHJlZywgJnZhbCk7CisgICByZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisKK3ZvaWQKK3Npc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworICAgc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopU2lTX1ByLT5pdmlkZW87CisKKyAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoaXZpZGVvLT5uYnJpZGdlLCByZWcsICh1MzIpdmFsKTsKK30KKwordW5zaWduZWQgaW50CitzaXNmYl9yZWFkX2xwY19wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpCit7CisgICBzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilTaVNfUHItPml2aWRlbzsKKyAgIHUzMiB2YWwgPSAwOworCisgICBpZighaXZpZGVvLT5scGNkZXYpIHJldHVybiAwOworCisgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoaXZpZGVvLT5scGNkZXYsIHJlZywgJnZhbCk7CisgICByZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Cit2b2lkCitzaXNmYl93cml0ZV9uYnJpZGdlX3BjaV9ieXRlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKyAgIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKVNpU19Qci0+aXZpZGVvOworCisgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXZpZGVvLT5uYnJpZGdlLCByZWcsICh1OCl2YWwpOworfQorCit1bnNpZ25lZCBpbnQKK3Npc2ZiX3JlYWRfbWlvX3BjaV93b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnKQoreworICAgc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopU2lTX1ByLT5pdmlkZW87CisgICB1MTYgdmFsID0gMDsKKworICAgaWYoIWl2aWRlby0+bHBjZGV2KSByZXR1cm4gMDsKKworICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoaXZpZGVvLT5scGNkZXYsIHJlZywgJnZhbCk7CisgICByZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisjZW5kaWYKKwogLyogLS0tLS0tLS0tLS0gRkJEZXYgcmVsYXRlZCByb3V0aW5lcyBmb3IgYWxsIHNlcmllcyAtLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50CkBAIC05NTIsNyArMTEwNSw3IEBACiBzdGF0aWMgdm9pZAogc2lzZmJfc2V0X3ZwYXJtcyhzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgIAlzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKKwlzd2l0Y2goaXZpZGVvLT52aWRlb19icHApIHsKIAljYXNlIDg6CiAJCWl2aWRlby0+RHN0Q29sb3IgPSAweDAwMDA7CiAJCWl2aWRlby0+U2lTMzEwX0FjY2VsRGVwdGggPSAweDAwMDAwMDAwOwpAQCAtOTcyLDE0ICsxMTI1LDEzIEBACiAJCWl2aWRlby0+dmlkZW9fY21hcF9sZW4gPSAxNjsKIAkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogVW5zdXBwb3J0ZWQgZGVwdGggJWQiLCBpdmlkZW8tPnZpZGVvX2JwcCk7CiAJCWl2aWRlby0+YWNjZWwgPSAwOwotCQlicmVhazsKLSAgIAl9CisJfQogfQogCiBzdGF0aWMgaW50CiBzaXNmYl9jYWxjX21heHlyZXMoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCWludCBtYXh5cmVzID0gaXZpZGVvLT5oZWFwc3RhcnQgLyAodmFyLT54cmVzX3ZpcnR1YWwgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKSk7CisJaW50IG1heHlyZXMgPSBpdmlkZW8tPnNpc2ZiX21lbSAvICh2YXItPnhyZXNfdmlydHVhbCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpKTsKIAogCWlmKG1heHlyZXMgPiAzMjc2NykgbWF4eXJlcyA9IDMyNzY3OwogCkBAIC05OTYsMzAgKzExNDgsMjkgQEAKIAkJCWl2aWRlby0+c2NybnBpdGNoQ1JUMSA8PD0gMTsKIAkJfQogCX0KLQogfQogCiBzdGF0aWMgdm9pZAogc2lzZmJfc2V0X3BpdGNoKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewotICAgCUJPT0xFQU4gaXNzbGF2ZW1vZGUgPSBGQUxTRTsKKwlCT09MRUFOIGlzc2xhdmVtb2RlID0gRkFMU0U7CiAJdW5zaWduZWQgc2hvcnQgSERpc3BsYXkxID0gaXZpZGVvLT5zY3JucGl0Y2hDUlQxID4+IDM7CiAJdW5zaWduZWQgc2hvcnQgSERpc3BsYXkyID0gaXZpZGVvLT52aWRlb19saW5lbGVuZ3RoID4+IDM7CiAKLSAgIAlpZihzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIGlzc2xhdmVtb2RlID0gVFJVRTsKKwlpZihzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIGlzc2xhdmVtb2RlID0gVFJVRTsKIAotICAgCS8qIFdlIG5lZWQgdG8gc2V0IHBpdGNoIGZvciBDUlQxIGlmIGJyaWRnZSBpcyBpbiBzbGF2ZSBtb2RlLCB0b28gKi8KLSAgIAlpZigoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AxKSB8fCAoaXNzbGF2ZW1vZGUpKSB7Ci0gICAJCW91dFNJU0lEWFJFRyhTSVNDUiwweDEzLChIRGlzcGxheTEgJiAweEZGKSk7Ci0gICAJCXNldFNJU0lEWFJFRyhTSVNTUiwweDBFLDB4RjAsKEhEaXNwbGF5MSA+PiA4KSk7CisJLyogV2UgbmVlZCB0byBzZXQgcGl0Y2ggZm9yIENSVDEgaWYgYnJpZGdlIGlzIGluIHNsYXZlIG1vZGUsIHRvbyAqLworCWlmKChpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDEpIHx8IChpc3NsYXZlbW9kZSkpIHsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLDB4MTMsKEhEaXNwbGF5MSAmIDB4RkYpKTsKKwkJc2V0U0lTSURYUkVHKFNJU1NSLDB4MEUsMHhGMCwoSERpc3BsYXkxID4+IDgpKTsKIAl9CiAKLSAgIAkvKiBXZSBtdXN0IG5vdCBzZXQgdGhlIHBpdGNoIGZvciBDUlQyIGlmIGJyaWRnZSBpcyBpbiBzbGF2ZSBtb2RlICovCi0gICAJaWYoKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBWQl9ESVNQVFlQRV9ESVNQMikgJiYgKCFpc3NsYXZlbW9kZSkpIHsKKwkvKiBXZSBtdXN0IG5vdCBzZXQgdGhlIHBpdGNoIGZvciBDUlQyIGlmIGJyaWRnZSBpcyBpbiBzbGF2ZSBtb2RlICovCisJaWYoKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBWQl9ESVNQVFlQRV9ESVNQMikgJiYgKCFpc3NsYXZlbW9kZSkpIHsKIAkJb3JTSVNJRFhSRUcoU0lTUEFSVDEsaXZpZGVvLT5DUlQyX3dyaXRlX2VuYWJsZSwweDAxKTsKLSAgIAkJb3V0U0lTSURYUkVHKFNJU1BBUlQxLDB4MDcsKEhEaXNwbGF5MiAmIDB4RkYpKTsKLSAgIAkJc2V0U0lTSURYUkVHKFNJU1BBUlQxLDB4MDksMHhGMCwoSERpc3BsYXkyID4+IDgpKTsKLSAgIAl9CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDA3LChIRGlzcGxheTIgJiAweEZGKSk7CisJCXNldFNJU0lEWFJFRyhTSVNQQVJUMSwweDA5LDB4RjAsKEhEaXNwbGF5MiA+PiA4KSk7CisJfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTA1NiwxMiArMTIwNyw0MSBAQAogfQogCiBzdGF0aWMgaW50CitzaXNmYl9zZXRfbW9kZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IGNscnNjcm4pCit7CisJdW5zaWduZWQgc2hvcnQgbW9kZW5vID0gaXZpZGVvLT5tb2RlX25vOworCisJLyogPj0yLjYuMTIncyBmYmNvbiBjbGVhcnMgdGhlIHNjcmVlbiBhbnl3YXkgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTIpCisJaWYoIWNscnNjcm4pIG1vZGVubyB8PSAweDgwOworI2Vsc2UKKwltb2Rlbm8gfD0gMHg4MDsKKyNlbmRpZgorCisJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOworCisJc2lzZmJfcHJlX3NldG1vZGUoaXZpZGVvKTsKKworCWlmKFNpU1NldE1vZGUoJml2aWRlby0+U2lTX1ByLCBtb2Rlbm8pID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogU2V0dGluZyBtb2RlWzB4JXhdIGZhaWxlZFxuIiwgaXZpZGVvLT5tb2RlX25vKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOworCisJc2lzZmJfcG9zdF9zZXRtb2RlKGl2aWRlbyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CiBzaXNmYl9kb19zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaXNhY3RpdmUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKIAl1bnNpZ25lZCBpbnQgaHRvdGFsID0gMCwgdnRvdGFsID0gMDsKIAl1bnNpZ25lZCBpbnQgZHJhdGUgPSAwLCBocmF0ZSA9IDA7Ci0JaW50IGZvdW5kX21vZGUgPSAwOworCWludCBmb3VuZF9tb2RlID0gMCwgcmV0OwogCWludCBvbGRfbW9kZTsKIAl1MzIgcGl4Y2xvY2s7CiAKQEAgLTEwODgsMTEgKzEyNjgsMTEgQEAKIAl9CiAKIAlpZihwaXhjbG9jayAmJiBodG90YWwgJiYgdnRvdGFsKSB7Ci0JICAgCWRyYXRlID0gMTAwMDAwMDAwMCAvIHBpeGNsb2NrOwotCSAgIAlocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOwotCSAgIAlpdmlkZW8tPnJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOworCQlkcmF0ZSA9IDEwMDAwMDAwMDAgLyBwaXhjbG9jazsKKwkJaHJhdGUgPSAoZHJhdGUgKiAxMDAwKSAvIGh0b3RhbDsKKwkJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSAodW5zaWduZWQgaW50KSAoaHJhdGUgKiAyIC8gdnRvdGFsKTsKIAl9IGVsc2UgewotCSAgIAlpdmlkZW8tPnJlZnJlc2hfcmF0ZSA9IDYwOworCQlpdmlkZW8tPnJlZnJlc2hfcmF0ZSA9IDYwOwogCX0KIAogCW9sZF9tb2RlID0gaXZpZGVvLT5zaXNmYl9tb2RlX2lkeDsKQEAgLTExMTMsNiArMTI5Myw3IEBACiAJaWYoZm91bmRfbW9kZSkgewogCQlpdmlkZW8tPnNpc2ZiX21vZGVfaWR4ID0gc2lzZmJfdmFsaWRhdGVfbW9kZShpdmlkZW8sCiAJCQkJaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCwgaXZpZGVvLT5jdXJyZW50dmJmbGFncyk7CisJCWl2aWRlby0+bW9kZV9ubyA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXTsKIAl9IGVsc2UgewogCQlpdmlkZW8tPnNpc2ZiX21vZGVfaWR4ID0gLTE7CiAJfQpAQCAtMTEzMSwxMCArMTMxMiwxMCBAQAogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJaWYoaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvci5kYXRhdmFsaWQpIHsKLQkgICBpZighc2lzZmJfdmVyaWZ5X3JhdGUoaXZpZGVvLCAmaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvciwgaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCwKKwkJaWYoIXNpc2ZiX3ZlcmlmeV9yYXRlKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIGl2aWRlby0+c2lzZmJfbW9kZV9pZHgsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIGl2aWRlby0+cmF0ZV9pZHgsIGl2aWRlby0+cmVmcmVzaF9yYXRlKSkgewotCSAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBXQVJOSU5HOiBSZWZyZXNoIHJhdGUgZXhjZWVkcyBtb25pdG9yIHNwZWNzIVxuIik7Ci0JICAgfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFdBUk5JTkc6IFJlZnJlc2ggcmF0ZSBleGNlZWRzIG1vbml0b3Igc3BlY3MhXG4iKTsKKwkJfQogCX0KICNlbmRpZgogCkBAIC0xMTQzLDI0ICsxMzI0LDkgQEAKICNlbHNlCiAJaWYoaXNhY3RpdmUpIHsKICNlbmRpZgotCQlzaXNmYl9wcmVfc2V0bW9kZShpdmlkZW8pOwotCi0JCWlmKFNpU1NldE1vZGUoJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQsIGl2aWRlby0+bW9kZV9ubykgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogU2V0dGluZyBtb2RlWzB4JXhdIGZhaWxlZFxuIiwgaXZpZGVvLT5tb2RlX25vKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOwotCi0JCXNpc2ZiX3Bvc3Rfc2V0bW9kZShpdmlkZW8pOwotCi0JCWl2aWRlby0+dmlkZW9fYnBwICAgID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLmJwcDsKLQkJaXZpZGVvLT52aWRlb193aWR0aCAgPSBzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ueHJlczsKLQkJaXZpZGVvLT52aWRlb19oZWlnaHQgPSBzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ueXJlczsKLQotCQlzaXNmYl9jYWxjX3BpdGNoKGl2aWRlbywgdmFyKTsKLQkJc2lzZmJfc2V0X3BpdGNoKGl2aWRlbyk7Ci0KKwkJLyogSWYgYWNjZWxlcmF0aW9uIHRvIGJlIHVzZWQ/IE5lZWQgdG8ga25vdworCQkgKiBiZWZvcmUgcHJlL3Bvc3Rfc2V0X21vZGUoKQorCQkgKi8KIAkJaXZpZGVvLT5hY2NlbCA9IDA7CiAjaWYgZGVmaW5lZChGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgZGVmaW5lZChGQklORk9fSFdBQ0NFTF9YUEFOKQogI2lmZGVmIFNUVVBJRF9BQ0NFTEZfVEVYVF9TSElUCkBAIC0xMTc1LDYgKzEzNDEsMTcgQEAKIAkJaWYodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKSBpdmlkZW8tPmFjY2VsID0gLTE7CiAjZW5kaWYKIAorCQlpZigocmV0ID0gc2lzZmJfc2V0X21vZGUoaXZpZGVvLCAxKSkpIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpdmlkZW8tPnZpZGVvX2JwcCAgICA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5icHA7CisJCWl2aWRlby0+dmlkZW9fd2lkdGggID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLnhyZXM7CisJCWl2aWRlby0+dmlkZW9faGVpZ2h0ID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLnlyZXM7CisKKwkJc2lzZmJfY2FsY19waXRjaChpdmlkZW8sIHZhcik7CisJCXNpc2ZiX3NldF9waXRjaChpdmlkZW8pOworCiAJCXNpc2ZiX3NldF92cGFybXMoaXZpZGVvKTsKIAogCQlpdmlkZW8tPmN1cnJlbnRfd2lkdGggPSBpdmlkZW8tPnZpZGVvX3dpZHRoOwpAQCAtMTE4NiwxOCArMTM2Myw0MyBAQAogCQlpdmlkZW8tPmN1cnJlbnRfcGl4Y2xvY2sgPSB2YXItPnBpeGNsb2NrOwogCQlpdmlkZW8tPmN1cnJlbnRfcmVmcmVzaF9yYXRlID0gaXZpZGVvLT5yZWZyZXNoX3JhdGU7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgICAgICAgICAgIGl2aWRlby0+c2lzZmJfbGFzdHJhdGVzW2l2aWRlby0+bW9kZV9ub10gPSBpdmlkZW8tPnJlZnJlc2hfcmF0ZTsKKwkJaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbaXZpZGVvLT5tb2RlX25vXSA9IGl2aWRlby0+cmVmcmVzaF9yYXRlOwogI2VuZGlmCiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkCitzaXNmYl9zZXRfYmFzZV9DUlQxKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfUEFTU1dPUkQsIFNJU19QQVNTV09SRCk7CisKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4MEQsIGJhc2UgJiAweEZGKTsKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4MEMsIChiYXNlID4+IDgpICYgMHhGRik7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDBELCAoYmFzZSA+PiAxNikgJiAweEZGKTsKKwlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDM3LCAweEZFLCAoYmFzZSA+PiAyNCkgJiAweDAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzaXNmYl9zZXRfYmFzZV9DUlQyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfRElTUDIpIHsKKwkJb3JTSVNJRFhSRUcoU0lTUEFSVDEsIGl2aWRlby0+Q1JUMl93cml0ZV9lbmFibGUsIDB4MDEpOworCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDYsIChiYXNlICYgMHhGRikpOworCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDUsICgoYmFzZSA+PiA4KSAmIDB4RkYpKTsKKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQxLCAweDA0LCAoKGJhc2UgPj4gMTYpICYgMHhGRikpOworCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMiwgMHg3RiwgKChiYXNlID4+IDI0KSAmIDB4MDEpIDw8IDcpOworCQl9CisJfQorfQorCiBzdGF0aWMgaW50CiBzaXNmYl9wYW5fdmFyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKIHsKLQl1bnNpZ25lZCBpbnQgYmFzZTsKLQogCWlmKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTIwNSwzOCArMTQwNywyNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQliYXNlID0gKHZhci0+eW9mZnNldCAqIHZhci0+eHJlc192aXJ0dWFsKSArIHZhci0+eG9mZnNldDsKKwlpdmlkZW8tPmN1cnJlbnRfYmFzZSA9ICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCkgKyB2YXItPnhvZmZzZXQ7CiAKLSAgICAgICAgLyogY2FsY3VsYXRlIGJhc2UgYnBwIGRlcC4gKi8KLSAgICAgICAgc3dpdGNoKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwkvKiBjYWxjdWxhdGUgYmFzZSBicHAgZGVwLiAqLworCXN3aXRjaCh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSAzMjoKLSAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgCWJhc2UgPj49IDE7Ci0gICAgICAgIAlicmVhazsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJaXZpZGVvLT5jdXJyZW50X2Jhc2UgPj49IDE7CisJCWJyZWFrOwogCWNhc2UgODoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgCWJhc2UgPj49IDI7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgIH0KLQkKLQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfUEFTU1dPUkQsIFNJU19QQVNTV09SRCk7Ci0KLSAgICAgICAgb3V0U0lTSURYUkVHKFNJU0NSLCAweDBELCBiYXNlICYgMHhGRik7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLCAweDBDLCAoYmFzZSA+PiA4KSAmIDB4RkYpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwRCwgKGJhc2UgPj4gMTYpICYgMHhGRik7Ci0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCXNldFNJU0lEWFJFRyhTSVNTUiwgMHgzNywgMHhGRSwgKGJhc2UgPj4gMjQpICYgMHgwMSk7CisJZGVmYXVsdDoKKwkJaXZpZGVvLT5jdXJyZW50X2Jhc2UgPj49IDI7CisJCWJyZWFrOwogCX0KLSAgICAgICAgaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7Ci0JCW9yU0lTSURYUkVHKFNJU1BBUlQxLCBpdmlkZW8tPkNSVDJfd3JpdGVfZW5hYmxlLCAweDAxKTsKLSAgICAgICAgCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwNiwgKGJhc2UgJiAweEZGKSk7Ci0gICAgICAgIAlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDUsICgoYmFzZSA+PiA4KSAmIDB4RkYpKTsKLSAgICAgICAgCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwNCwgKChiYXNlID4+IDE2KSAmIDB4RkYpKTsKLQkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MDIsIDB4N0YsICgoYmFzZSA+PiAyNCkgJiAweDAxKSA8PCA3KTsKLQkJfQotICAgICAgICB9CisKKwlpdmlkZW8tPmN1cnJlbnRfYmFzZSArPSAoaXZpZGVvLT52aWRlb19vZmZzZXQgPj4gMik7CisKKwlzaXNmYl9zZXRfYmFzZV9DUlQxKGl2aWRlbywgaXZpZGVvLT5jdXJyZW50X2Jhc2UpOworCXNpc2ZiX3NldF9iYXNlX0NSVDIoaXZpZGVvLCBpdmlkZW8tPmN1cnJlbnRfYmFzZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI0NCw1MTQgKzE0MzQsOCBAQAogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAKLXN0YXRpYyB2b2lkCi1zaXNmYl9jcnRjX3RvX3ZhcihzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCi17Ci0JdTE2IFZSRSwgVkJFLCBWUlMsIFZCUywgVkRFLCBWVDsKLQl1MTYgSFJFLCBIQkUsIEhSUywgSEJTLCBIREUsIEhUOwotCXU4ICBzcl9kYXRhLCBjcl9kYXRhLCBjcl9kYXRhMiwgY3JfZGF0YTMsIG1yX2RhdGE7Ci0JaW50IEEsIEIsIEMsIEQsIEUsIEYsIHRlbXA7Ci0JdW5zaWduZWQgaW50IGhyYXRlLCBkcmF0ZSwgbWF4eXJlczsKLQotCWluU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NPTE9SX01PREUsIHNyX2RhdGEpOwotCi0JaWYoc3JfZGF0YSAmIFNJU19JTlRFUkxBQ0VEX01PREUpCi0JICAgdmFyLT52bW9kZSA9IEZCX1ZNT0RFX0lOVEVSTEFDRUQ7Ci0JZWxzZQotCSAgIHZhci0+dm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOwotCi0Jc3dpdGNoKChzcl9kYXRhICYgMHgxQykgPj4gMikgewotCWNhc2UgU0lTXzhCUFBfQ09MT1JfTU9ERToKLQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0lTXzE2QlBQX0NPTE9SX01PREU6Ci0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBTSVNfMzJCUFBfQ09MT1JfTU9ERToKLQkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOwotCQlicmVhazsKLQl9Ci0KLQlzaXNmYl9icHBfdG9fdmFyKGl2aWRlbywgdmFyKTsKLQkKLQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwQSwgc3JfZGF0YSk7Ci0gICAgICAgIGluU0lTSURYUkVHKFNJU0NSLCAweDA2LCBjcl9kYXRhKTsKLSAgICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDcsIGNyX2RhdGEyKTsKLQotCVZUID0gKGNyX2RhdGEgJiAweEZGKSB8Ci0JICAgICAoKHUxNikgKGNyX2RhdGEyICYgMHgwMSkgPDwgOCkgfAotCSAgICAgKCh1MTYpIChjcl9kYXRhMiAmIDB4MjApIDw8IDQpIHwKLQkgICAgICgodTE2KSAoc3JfZGF0YSAgJiAweDAxKSA8PCAxMCk7Ci0JQSA9IFZUICsgMjsKLQotCWluU0lTSURYUkVHKFNJU0NSLCAweDEyLCBjcl9kYXRhKTsKLQotCVZERSA9IChjcl9kYXRhICYgMHhmZikgfAotCSAgICAgICgodTE2KSAoY3JfZGF0YTIgJiAweDAyKSA8PCA3KSB8Ci0JICAgICAgKCh1MTYpIChjcl9kYXRhMiAmIDB4NDApIDw8IDMpIHwKLQkgICAgICAoKHUxNikgKHNyX2RhdGEgICYgMHgwMikgPDwgOSk7Ci0JRSA9IFZERSArIDE7Ci0KLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgxMCwgY3JfZGF0YSk7Ci0KLQlWUlMgPSAoY3JfZGF0YSAmIDB4ZmYpIHwKLQkgICAgICAoKHUxNikgKGNyX2RhdGEyICYgMHgwNCkgPDwgNikgfAotCSAgICAgICgodTE2KSAoY3JfZGF0YTIgJiAweDgwKSA8PCAyKSB8Ci0JICAgICAgKCh1MTYpIChzcl9kYXRhICAmIDB4MDgpIDw8IDcpOwotCUYgPSBWUlMgKyAxIC0gRTsKLQotCWluU0lTSURYUkVHKFNJU0NSLCAweDE1LCBjcl9kYXRhKTsKLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgwOSwgY3JfZGF0YTMpOwotCi0JaWYoY3JfZGF0YTMgJiAweDgwKSB2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOwotCi0JVkJTID0gKGNyX2RhdGEgJiAweGZmKSB8Ci0JICAgICAgKCh1MTYpIChjcl9kYXRhMiAmIDB4MDgpIDw8IDUpIHwKLQkgICAgICAoKHUxNikgKGNyX2RhdGEzICYgMHgyMCkgPDwgNCkgfAotCSAgICAgICgodTE2KSAoc3JfZGF0YSAmIDB4MDQpIDw8IDgpOwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MTYsIGNyX2RhdGEpOwotCi0JVkJFID0gKGNyX2RhdGEgJiAweGZmKSB8ICgodTE2KSAoc3JfZGF0YSAmIDB4MTApIDw8IDQpOwotCXRlbXAgPSBWQkUgLSAoKEUgLSAxKSAmIDUxMSk7Ci0JQiA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA1MTIpOwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MTEsIGNyX2RhdGEpOwotCi0JVlJFID0gKGNyX2RhdGEgJiAweDBmKSB8ICgoc3JfZGF0YSAmIDB4MjApID4+IDEpOwotCXRlbXAgPSBWUkUgLSAoKEUgKyBGIC0gMSkgJiAzMSk7Ci0JQyA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyAzMik7Ci0KLQlEID0gQiAtIEYgLSBDOwotCi0gICAgICAgIHZhci0+eXJlcyA9IEU7Ci0JdmFyLT51cHBlcl9tYXJnaW4gPSBEOwotCXZhci0+bG93ZXJfbWFyZ2luID0gRjsKLQl2YXItPnZzeW5jX2xlbiA9IEM7Ci0KLQlpZigodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKLQkgICB2YXItPnlyZXMgPDw9IDE7Ci0JICAgdmFyLT51cHBlcl9tYXJnaW4gPDw9IDE7Ci0JICAgdmFyLT5sb3dlcl9tYXJnaW4gPDw9IDE7Ci0JICAgdmFyLT52c3luY19sZW4gPDw9IDE7Ci0JfSBlbHNlIGlmKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7Ci0JICAgdmFyLT55cmVzID4+PSAxOwotCSAgIHZhci0+dXBwZXJfbWFyZ2luID4+PSAxOwotCSAgIHZhci0+bG93ZXJfbWFyZ2luID4+PSAxOwotCSAgIHZhci0+dnN5bmNfbGVuID4+PSAxOwotCX0KLQotCWluU0lTSURYUkVHKFNJU1NSLCAweDBiLCBzcl9kYXRhKTsKLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgwMCwgY3JfZGF0YSk7Ci0KLQlIVCA9IChjcl9kYXRhICYgMHhmZikgfCAoKHUxNikgKHNyX2RhdGEgJiAweDAzKSA8PCA4KTsKLQlBID0gSFQgKyA1OwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDEsIGNyX2RhdGEpOwotCi0JSERFID0gKGNyX2RhdGEgJiAweGZmKSB8ICgodTE2KSAoc3JfZGF0YSAmIDB4MEMpIDw8IDYpOwotCUUgPSBIREUgKyAxOwotCi0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDQsIGNyX2RhdGEpOwotCi0JSFJTID0gKGNyX2RhdGEgJiAweGZmKSB8ICgodTE2KSAoc3JfZGF0YSAmIDB4QzApIDw8IDIpOwotCUYgPSBIUlMgLSBFIC0gMzsKLQotCWluU0lTSURYUkVHKFNJU0NSLCAweDAyLCBjcl9kYXRhKTsKLQotCUhCUyA9IChjcl9kYXRhICYgMHhmZikgfCAoKHUxNikgKHNyX2RhdGEgJiAweDMwKSA8PCA0KTsKLQotCWluU0lTSURYUkVHKFNJU1NSLCAweDBjLCBzcl9kYXRhKTsKLQlpblNJU0lEWFJFRyhTSVNDUiwgMHgwMywgY3JfZGF0YSk7Ci0JaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MDUsIGNyX2RhdGEyKTsKLQotCUhCRSA9IChjcl9kYXRhICYgMHgxZikgfAotCSAgICAgICgodTE2KSAoY3JfZGF0YTIgJiAweDgwKSA+PiAyKSB8Ci0JICAgICAgKCh1MTYpIChzcl9kYXRhICAmIDB4MDMpIDw8IDYpOwotCUhSRSA9IChjcl9kYXRhMiAmIDB4MWYpIHwgKChzcl9kYXRhICYgMHgwNCkgPDwgMyk7Ci0KLQl0ZW1wID0gSEJFIC0gKChFIC0gMSkgJiAyNTUpOwotCUIgPSAodGVtcCA+IDApID8gdGVtcCA6ICh0ZW1wICsgMjU2KTsKLQotCXRlbXAgPSBIUkUgLSAoKEUgKyBGICsgMykgJiA2Myk7Ci0JQyA9ICh0ZW1wID4gMCkgPyB0ZW1wIDogKHRlbXAgKyA2NCk7Ci0KLQlEID0gQiAtIEYgLSBDOwotCi0JdmFyLT54cmVzID0gRSAqIDg7Ci0JaWYodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpIHsKLQkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7Ci0JfQotCi0JaWYoKHZhci0+eHJlcyA9PSAzMjApICYmCi0JICAgKHZhci0+eXJlcyA9PSAyMDAgfHwgdmFyLT55cmVzID09IDI0MCkpIHsKLQkJLyogVGVycmlibGUgaGFjaywgYnV0IHRoZSBjb3JyZWN0IENSVEMgZGF0YSBmb3IKLQkgIAkgKiB0aGVzZSBtb2RlcyBvbmx5IHByb2R1Y2VzIGEgYmxhY2sgc2NyZWVuLi4uCi0JICAJICovCi0gICAgICAgCQl2YXItPmxlZnRfbWFyZ2luID0gKDQwMCAtIDM3Nik7Ci0gICAgICAgCQl2YXItPnJpZ2h0X21hcmdpbiA9ICgzMjggLSAzMjApOwotICAgICAgIAkJdmFyLT5oc3luY19sZW4gPSAoMzc2IC0gMzI4KTsKLQl9IGVsc2UgewotCSAgIAl2YXItPmxlZnRfbWFyZ2luID0gRCAqIDg7Ci0JICAgCXZhci0+cmlnaHRfbWFyZ2luID0gRiAqIDg7Ci0JICAgCXZhci0+aHN5bmNfbGVuID0gQyAqIDg7Ci0JfQotCXZhci0+YWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7Ci0KLQl2YXItPnN5bmMgPSAwOwotCi0JbXJfZGF0YSA9IGluU0lTUkVHKFNJU01JU0NSKTsKLQlpZihtcl9kYXRhICYgMHg4MCkKLQkgICB2YXItPnN5bmMgJj0gfkZCX1NZTkNfVkVSVF9ISUdIX0FDVDsKLQllbHNlCi0JICAgdmFyLT5zeW5jIHw9IEZCX1NZTkNfVkVSVF9ISUdIX0FDVDsKLQotCWlmKG1yX2RhdGEgJiAweDQwKQotCSAgIHZhci0+c3luYyAmPSB+RkJfU1lOQ19IT1JfSElHSF9BQ1Q7Ci0JZWxzZQotCSAgIHZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKLQotCVZUICs9IDI7Ci0JVlQgPDw9IDE7Ci0JSFQgPSAoSFQgKyA1KSAqIDg7Ci0KLQlpZigodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKLQkgICBWVCA8PD0gMTsKLQl9Ci0JaHJhdGUgPSBpdmlkZW8tPnJlZnJlc2hfcmF0ZSAqIFZUIC8gMjsKLQlkcmF0ZSA9IChocmF0ZSAqIEhUKSAvIDEwMDA7Ci0JdmFyLT5waXhjbG9jayA9ICh1MzIpICgxMDAwMDAwMDAwIC8gZHJhdGUpOwotCi0JaWYoaXZpZGVvLT5zaXNmYl95cGFuKSB7Ci0JICAgbWF4eXJlcyA9IHNpc2ZiX2NhbGNfbWF4eXJlcyhpdmlkZW8sIHZhcik7Ci0JICAgaWYoaXZpZGVvLT5zaXNmYl9tYXgpIHsKLQkgICAgICB2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7Ci0JICAgfSBlbHNlIHsKLQkgICAgICBpZih2YXItPnlyZXNfdmlydHVhbCA+IG1heHlyZXMpIHsKLQkgICAgICAgICB2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7Ci0JICAgICAgfQotCSAgIH0KLQkgICBpZih2YXItPnlyZXNfdmlydHVhbCA8PSB2YXItPnlyZXMpIHsKLQkgICAgICB2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQkgICB9Ci0JfSBlbHNlIHsKLQkgICB2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQl9Ci0KLX0KLQotc3RhdGljIGludAotc2lzX2dldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgKnJlZCwgdW5zaWduZWQgKmdyZWVuLCB1bnNpZ25lZCAqYmx1ZSwKLQkJCSB1bnNpZ25lZCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0KLQlpZihyZWdubyA+PSBpdmlkZW8tPnZpZGVvX2NtYXBfbGVuKSByZXR1cm4gMTsKLQotCSpyZWQgICA9IGl2aWRlby0+c2lzX3BhbGV0dGVbcmVnbm9dLnJlZDsKLQkqZ3JlZW4gPSBpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5ncmVlbjsKLQkqYmx1ZSAgPSBpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5ibHVlOwotCSp0cmFuc3AgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNpc2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwotCi0JaWYocmVnbm8gPj0gaXZpZGVvLT52aWRlb19jbWFwX2xlbikgcmV0dXJuIDE7Ci0KLQlpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5yZWQgICA9IHJlZDsKLQlpdmlkZW8tPnNpc19wYWxldHRlW3JlZ25vXS5ncmVlbiA9IGdyZWVuOwotCWl2aWRlby0+c2lzX3BhbGV0dGVbcmVnbm9dLmJsdWUgID0gYmx1ZTsKLQotCXN3aXRjaChpdmlkZW8tPnZpZGVvX2JwcCkgewotI2lmZGVmIEZCQ09OX0hBU19DRkI4Ci0JY2FzZSA4OgotCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQ0EsIHJlZ25vKTsKLQkJb3V0U0lTUkVHKFNJU0RBQ0QsIChyZWQgPj4gMTApKTsKLQkJb3V0U0lTUkVHKFNJU0RBQ0QsIChncmVlbiA+PiAxMCkpOwotCQlvdXRTSVNSRUcoU0lTREFDRCwgKGJsdWUgPj4gMTApKTsKLQkJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7Ci0JCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQzJBLCByZWdubyk7Ci0JCQlvdXRTSVNSRUcoU0lTREFDMkQsIChyZWQgPj4gOCkpOwotCQkJb3V0U0lTUkVHKFNJU0RBQzJELCAoZ3JlZW4gPj4gOCkpOwotCQkJb3V0U0lTUkVHKFNJU0RBQzJELCAoYmx1ZSA+PiA4KSk7Ci0JCX0KLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQljYXNlIDE2OgotCQlpdmlkZW8tPnNpc19mYmNvbl9jbWFwLmNmYjE2W3JlZ25vXSA9Ci0JCSAgICAoKHJlZCAmIDB4ZjgwMCkpIHwgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLQljYXNlIDMyOgotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQlpdmlkZW8tPnNpc19mYmNvbl9jbWFwLmNmYjMyW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgKGJsdWUpOwotCQlicmVhazsKLSNlbmRpZgotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc2lzZmJfc2V0X2Rpc3AoaW50IGNvbiwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAgICAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQlzdHJ1Y3QgZGlzcGxheSAgICAgICAgICAgKmRpc3BsYXk7Ci0Jc3RydWN0IGRpc3BsYXlfc3dpdGNoICAgICpzdzsKLQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZml4OwotCWxvbmcgICBmbGFnczsKLQotCWRpc3BsYXkgPSAoY29uID49IDApID8gJmZiX2Rpc3BsYXlbY29uXSA6ICZpdmlkZW8tPnNpc19kaXNwOwotCi0Jc2lzZmJfZ2V0X2ZpeCgmZml4LCBjb24sIGluZm8pOwotCi0JZGlzcGxheS0+dmFyID0gKnZhcjsKLQlkaXNwbGF5LT5zY3JlZW5fYmFzZSA9IChjaGFyICopaXZpZGVvLT52aWRlb192YmFzZTsKLQlkaXNwbGF5LT52aXN1YWwgPSBmaXgudmlzdWFsOwotCWRpc3BsYXktPnR5cGUgPSBmaXgudHlwZTsKLQlkaXNwbGF5LT50eXBlX2F1eCA9IGZpeC50eXBlX2F1eDsKLQlkaXNwbGF5LT55cGFuc3RlcCA9IGZpeC55cGFuc3RlcDsKLQlkaXNwbGF5LT55d3JhcHN0ZXAgPSBmaXgueXdyYXBzdGVwOwotCWRpc3BsYXktPmxpbmVfbGVuZ3RoID0gZml4LmxpbmVfbGVuZ3RoOwotCWRpc3BsYXktPmNhbl9zb2Z0X2JsYW5rID0gMTsKLQlkaXNwbGF5LT5pbnZlcnNlID0gaXZpZGVvLT5zaXNmYl9pbnZlcnNlOwotCWRpc3BsYXktPm5leHRfbGluZSA9IGZpeC5saW5lX2xlbmd0aDsKLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCi0Jc3dpdGNoKGl2aWRlby0+dmlkZW9fYnBwKSB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLQljYXNlIDg6CXN3ID0gaXZpZGVvLT5hY2NlbCA/ICZmYmNvbl9zaXM4IDogJmZiY29uX2NmYjg7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JY2FzZSAxNjpzdyA9IGl2aWRlby0+YWNjZWwgPyAmZmJjb25fc2lzMTYgOiAmZmJjb25fY2ZiMTY7Ci0JCWRpc3BsYXktPmRpc3Bzd19kYXRhID0gJml2aWRlby0+c2lzX2ZiY29uX2NtYXAuY2ZiMTY7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi0JY2FzZSAzMjpzdyA9IGl2aWRlby0+YWNjZWwgPyAmZmJjb25fc2lzMzIgOiAmZmJjb25fY2ZiMzI7Ci0JCWRpc3BsYXktPmRpc3Bzd19kYXRhID0gJml2aWRlby0+c2lzX2ZiY29uX2NtYXAuY2ZiMzI7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDpzdyA9ICZmYmNvbl9kdW1teTsKLQkJYnJlYWs7Ci0JfQotCW1lbWNweSgmaXZpZGVvLT5zaXNmYl9zdywgc3csIHNpemVvZigqc3cpKTsKLQlkaXNwbGF5LT5kaXNwc3cgPSAmaXZpZGVvLT5zaXNmYl9zdzsKLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0gICAgICAgIGlmKGl2aWRlby0+c2lzZmJfeXBhbikgewotICAJICAgIC8qIGRpc3BsYXktPnNjcm9sbG1vZGUgPSAwOyAgKi8KLQl9IGVsc2UgewotCSAgICBkaXNwbGF5LT5zY3JvbGxtb2RlID0gU0NST0xMX1lSRURSQVc7Ci0JICAgIGl2aWRlby0+c2lzZmJfc3cuYm1vdmUgPSBmYmNvbl9yZWRyYXdfYm1vdmU7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotc2lzZmJfZG9faW5zdGFsbF9jbWFwKGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQotICAgICAgICBpZihjb24gIT0gaXZpZGVvLT5jdXJyY29uKSByZXR1cm47Ci0KLSAgICAgICAgaWYoZmJfZGlzcGxheVtjb25dLmNtYXAubGVuKSB7Ci0JCWZiX3NldF9jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgMSwgc2lzZmJfc2V0Y29scmVnLCBpbmZvKTsKLSAgICAgICAgfSBlbHNlIHsKLQkJaW50IHNpemUgPSBzaXNmYl9nZXRfY21hcF9sZW4oJmZiX2Rpc3BsYXlbY29uXS52YXIpOwotCQlmYl9zZXRfY21hcChmYl9kZWZhdWx0X2NtYXAoc2l6ZSksIDEsIHNpc2ZiX3NldGNvbHJlZywgaW5mbyk7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1zaXNmYl9nZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0KLQlpZihjb24gPT0gLTEpIHsKLQkJbWVtY3B5KHZhciwgJml2aWRlby0+ZGVmYXVsdF92YXIsIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsKLQl9IGVsc2UgewotCQkqdmFyID0gZmJfZGlzcGxheVtjb25dLnZhcjsKLQl9Ci0KLQlpZihpdmlkZW8tPnNpc2ZiX2ZzdG4pIHsKLQkgICAJaWYodmFyLT54cmVzID09IDMyMCAmJiB2YXItPnlyZXMgPT0gNDgwKSB2YXItPnlyZXMgPSAyNDA7Ci0gICAgICAgIH0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zaXNmYl9zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0JaW50IGVycjsKLQotCWZiX2Rpc3BsYXlbY29uXS52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7Ci0KLSAgICAgICAgaWYoc2lzZmJfZG9fc2V0X3Zhcih2YXIsIGNvbiA9PSBpdmlkZW8tPmN1cnJjb24sIGluZm8pKSB7Ci0JCXNpc2ZiX2NydGNfdG9fdmFyKGl2aWRlbywgdmFyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc2lzZmJfY3J0Y190b192YXIoaXZpZGVvLCB2YXIpOwotCi0Jc2lzZmJfc2V0X2Rpc3AoY29uLCB2YXIsIGluZm8pOwotCi0JaWYoaW5mby0+Y2hhbmdldmFyKSB7Ci0JCSgqaW5mby0+Y2hhbmdldmFyKShjb24pOwotCX0KLQotCWlmKChlcnIgPSBmYl9hbGxvY19jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgMCwgMCkpKSB7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0Jc2lzZmJfZG9faW5zdGFsbF9jbWFwKGNvbiwgaW5mbyk7Ci0KLSNpZiAwCS8qIFdoeSB3YXMgdGhpcyBjYWxsZWQgaGVyZT8gKi8KLQl1bnNpZ25lZCBpbnQgY29scywgcm93czsKLQljb2xzID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLmNvbHM7Ci0Jcm93cyA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5yb3dzOwotIAl2Y19yZXNpemVfY29uKHJvd3MsIGNvbHMsIGZiX2Rpc3BsYXlbY29uXS5jb25wLT52Y19udW0pOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNpc2ZiX2dldF9jbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBpbnQga3NwYywgaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwotCXN0cnVjdCBkaXNwbGF5ICpkaXNwbGF5OwotCi0JZGlzcGxheSA9IChjb24gPj0gMCkgPyAmZmJfZGlzcGxheVtjb25dIDogJml2aWRlby0+c2lzX2Rpc3A7Ci0KLSAgICAgICAgaWYoY29uID09IGl2aWRlby0+Y3VycmNvbikgewotCi0JCXJldHVybiBmYl9nZXRfY21hcChjbWFwLCBrc3BjLCBzaXNfZ2V0Y29scmVnLCBpbmZvKTsKLQotCX0gZWxzZSBpZihkaXNwbGF5LT5jbWFwLmxlbikgewotCi0JCWZiX2NvcHlfY21hcCgmZGlzcGxheS0+Y21hcCwgY21hcCwga3NwYyA/IDAgOiAyKTsKLQotCX0gZWxzZSB7Ci0KLQkJaW50IHNpemUgPSBzaXNmYl9nZXRfY21hcF9sZW4oJmRpc3BsYXktPnZhcik7Ci0JCWZiX2NvcHlfY21hcChmYl9kZWZhdWx0X2NtYXAoc2l6ZSksIGNtYXAsIGtzcGMgPyAwIDogMik7Ci0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2lzZmJfc2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIGludCBrc3BjLCBpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0Jc3RydWN0IGRpc3BsYXkgKmRpc3BsYXk7Ci0JaW50IGVyciwgc2l6ZTsKLQotCWRpc3BsYXkgPSAoY29uID49IDApID8gJmZiX2Rpc3BsYXlbY29uXSA6ICZpdmlkZW8tPnNpc19kaXNwOwotCi0Jc2l6ZSA9IHNpc2ZiX2dldF9jbWFwX2xlbigmZGlzcGxheS0+dmFyKTsKLQlpZihkaXNwbGF5LT5jbWFwLmxlbiAhPSBzaXplKSB7Ci0JCWVyciA9IGZiX2FsbG9jX2NtYXAoJmRpc3BsYXktPmNtYXAsIHNpemUsIDApOwotCQlpZihlcnIpCXJldHVybiBlcnI7Ci0JfQotICAgICAgICAKLQlpZihjb24gPT0gaXZpZGVvLT5jdXJyY29uKSB7Ci0JCXJldHVybiBmYl9zZXRfY21hcChjbWFwLCBrc3BjLCBzaXNmYl9zZXRjb2xyZWcsIGluZm8pOwotCX0gZWxzZSB7Ci0JCWZiX2NvcHlfY21hcChjbWFwLCAmZGlzcGxheS0+Y21hcCwga3NwYyA/IDAgOiAxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2lzZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvKiBpbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQlpbnQgZXJyOwotCi0JaWYodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSByZXR1cm4gLUVJTlZBTDsKLQotCWlmKCh2YXItPnhvZmZzZXQrZmJfZGlzcGxheVtjb25dLnZhci54cmVzID4gZmJfZGlzcGxheVtjb25dLnZhci54cmVzX3ZpcnR1YWwpIHx8Ci0JICAgKHZhci0+eW9mZnNldCtmYl9kaXNwbGF5W2Nvbl0udmFyLnlyZXMgPiBmYl9kaXNwbGF5W2Nvbl0udmFyLnlyZXNfdmlydHVhbCkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0gICAgICAgIGlmKGNvbiA9PSBpdmlkZW8tPmN1cnJjb24pIHsKLQkgICAJaWYoKGVyciA9IHNpc2ZiX3Bhbl92YXIoaXZpZGVvLCB2YXIpKSA8IDApIHJldHVybiBlcnI7Ci0JfQotCi0JZmJfZGlzcGxheVtjb25dLnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwotCWZiX2Rpc3BsYXlbY29uXS52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zaXNmYl91cGRhdGVfdmFyKGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQotICAgICAgICByZXR1cm4oc2lzZmJfcGFuX3ZhcihpdmlkZW8sICZmYl9kaXNwbGF5W2Nvbl0udmFyKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNpc2ZiX3N3aXRjaChpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7Ci0JaW50IGNvbHMsIHJvd3M7Ci0KLSAgICAgICAgaWYoZmJfZGlzcGxheVtpdmlkZW8tPmN1cnJjb25dLmNtYXAubGVuKSB7Ci0JCWZiX2dldF9jbWFwKCZmYl9kaXNwbGF5W2l2aWRlby0+Y3VycmNvbl0uY21hcCwgMSwgc2lzX2dldGNvbHJlZywgaW5mbyk7Ci0JfQotCi0JZmJfZGlzcGxheVtjb25dLnZhci5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKLQotCWlmKCFtZW1jbXAoJmZiX2Rpc3BsYXlbY29uXS52YXIsICZmYl9kaXNwbGF5W2l2aWRlby0+Y3VycmNvbl0udmFyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAlzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSkpIHsKLQkJaXZpZGVvLT5jdXJyY29uID0gY29uOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpdmlkZW8tPmN1cnJjb24gPSBjb247Ci0KLQlzaXNmYl9kb19zZXRfdmFyKCZmYl9kaXNwbGF5W2Nvbl0udmFyLCAxLCBpbmZvKTsKLQotCXNpc2ZiX3NldF9kaXNwKGNvbiwgJmZiX2Rpc3BsYXlbY29uXS52YXIsIGluZm8pOwotCi0Jc2lzZmJfZG9faW5zdGFsbF9jbWFwKGNvbiwgaW5mbyk7Ci0KLQljb2xzID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLmNvbHM7Ci0Jcm93cyA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS5yb3dzOwotCXZjX3Jlc2l6ZV9jb24ocm93cywgY29scywgZmJfZGlzcGxheVtjb25dLmNvbnAtPnZjX251bSk7Ci0KLQlzaXNmYl91cGRhdGVfdmFyKGNvbiwgaW5mbyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNpc2ZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOworI2luY2x1ZGUgInNpc2ZiX2ZiZGV2XzJfNC5oIgogCi0Jc2lzZmJfbXlibGFuayhpdmlkZW8sIGJsYW5rKTsKLX0KICNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0gRkJEZXYgcmVsYXRlZCByb3V0aW5lcyBmb3IgMi42IHNlcmllcyAtLS0tLS0tLS0tLSAqLwpAQCAtMTc2MSwxMyArMTQ0NSwxMyBAQAogc3RhdGljIGludAogc2lzZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7Ci0gICAgCXJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzaXNmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKIHsKLSAgICAJcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3NzYsMTYgKzE0NjAsMTcgQEAKIHsKIAlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7CiAKLQlpZihyZWdubyA+PSBzaXNmYl9nZXRfY21hcF9sZW4oJmluZm8tPnZhcikpIHJldHVybiAxOworCWlmKHJlZ25vID49IHNpc2ZiX2dldF9jbWFwX2xlbigmaW5mby0+dmFyKSkKKwkJcmV0dXJuIDE7CiAKIAlzd2l0Y2goaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgotCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQ0EsIHJlZ25vKTsKKwkJb3V0U0lTUkVHKFNJU0RBQ0EsIHJlZ25vKTsKIAkJb3V0U0lTUkVHKFNJU0RBQ0QsIChyZWQgPj4gMTApKTsKIAkJb3V0U0lTUkVHKFNJU0RBQ0QsIChncmVlbiA+PiAxMCkpOwogCQlvdXRTSVNSRUcoU0lTREFDRCwgKGJsdWUgPj4gMTApKTsKIAkJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0RJU1AyKSB7Ci0JCSAgICAgICAgb3V0U0lTUkVHKFNJU0RBQzJBLCByZWdubyk7CisJCQlvdXRTSVNSRUcoU0lTREFDMkEsIHJlZ25vKTsKIAkJCW91dFNJU1JFRyhTSVNEQUMyRCwgKHJlZCA+PiA4KSk7CiAJCQlvdXRTSVNSRUcoU0lTREFDMkQsIChncmVlbiA+PiA4KSk7CiAJCQlvdXRTSVNSRUcoU0lTREFDMkQsIChibHVlID4+IDgpKTsKQEAgLTE3OTMsNyArMTQ3OCw5IEBACiAJCWJyZWFrOwogCWNhc2UgMTY6CiAJCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KLQkJICAgICgocmVkICYgMHhmODAwKSkgfCAoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8ICgoYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOworCQkJCShyZWQgJiAweGY4MDApICAgICAgICAgIHwKKwkJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8CisJCQkJKChibHVlICYgMHhmODAwKSA+PiAxMSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6CiAJCXJlZCA+Pj0gODsKQEAgLTE4MTEsMTMgKzE0OTgsMTMgQEAKIHsKIAlpbnQgZXJyOwogCi0gICAgICAgIGlmKChlcnIgPSBzaXNmYl9kb19zZXRfdmFyKCZpbmZvLT52YXIsIDEsIGluZm8pKSkgeworCWlmKChlcnIgPSBzaXNmYl9kb19zZXRfdmFyKCZpbmZvLT52YXIsIDEsIGluZm8pKSkKIAkJcmV0dXJuIGVycjsKLQl9CisKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTApCiAJc2lzZmJfZ2V0X2ZpeCgmaW5mby0+Zml4LCBpbmZvLT5jdXJyY29uLCBpbmZvKTsKICNlbHNlCi0gICAgICAJc2lzZmJfZ2V0X2ZpeCgmaW5mby0+Zml4LCAtMSwgaW5mbyk7CisJc2lzZmJfZ2V0X2ZpeCgmaW5mby0+Zml4LCAtMSwgaW5mbyk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MjksNyArMTUxNiw3IEBACiAJdW5zaWduZWQgaW50IGh0b3RhbCA9IDAsIHZ0b3RhbCA9IDAsIG15cmF0ZWluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgZHJhdGUgPSAwLCBocmF0ZSA9IDAsIG1heHlyZXM7CiAJaW50IGZvdW5kX21vZGUgPSAwOwotCWludCByZWZyZXNoX3JhdGUsIHNlYXJjaF9pZHg7CisJaW50IHJlZnJlc2hfcmF0ZSwgc2VhcmNoX2lkeCwgdGlkeDsKIAlCT09MRUFOIHJlY2FsY19jbG9jayA9IEZBTFNFOwogCXUzMiBwaXhjbG9jazsKIApAQCAtMTg0OCw3ICsxNTM1LDggQEAKIAl9IGVsc2UgaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7CiAJCXZ0b3RhbCArPSB2YXItPnlyZXM7CiAJCXZ0b3RhbCA8PD0gMTsKLQl9IGVsc2UgCXZ0b3RhbCArPSB2YXItPnlyZXM7CisJfSBlbHNlCisJCXZ0b3RhbCArPSB2YXItPnlyZXM7CiAKIAlpZighKGh0b3RhbCkgfHwgISh2dG90YWwpKSB7CiAJCVNJU0ZBSUwoInNpc2ZiOiBubyB2YWxpZCB0aW1pbmcgZGF0YSIpOwpAQCAtMTg2MCw2MCArMTU0OCw2OCBAQAogCQlpZiggKHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS54cmVzID09IHZhci0+eHJlcykgJiYKIAkJICAgIChzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueXJlcyA9PSB2YXItPnlyZXMpICYmCiAJCSAgICAoc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLmJwcCA9PSB2YXItPmJpdHNfcGVyX3BpeGVsKSkgewotCQkgICAgICAgIGlmKHNpc2ZiX3ZhbGlkYXRlX21vZGUoaXZpZGVvLCBzZWFyY2hfaWR4LCBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzKSA+IDApIHsKLQkJCSAgIGZvdW5kX21vZGUgPSAxOwotCQkJICAgYnJlYWs7CisJCQlpZigodGlkeCA9IHNpc2ZiX3ZhbGlkYXRlX21vZGUoaXZpZGVvLCBzZWFyY2hfaWR4LAorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncykpID4gMCkgeworCQkJCWZvdW5kX21vZGUgPSAxOworCQkJCXNlYXJjaF9pZHggPSB0aWR4OworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCXNlYXJjaF9pZHgrKzsKIAl9CiAKIAlpZighZm91bmRfbW9kZSkgewotICAgICAgICAgICAgICAgIHNlYXJjaF9pZHggPSAwOworCQlzZWFyY2hfaWR4ID0gMDsKIAkJd2hpbGUoc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9bMF0gIT0gMCkgewogCQkgICBpZiggKHZhci0+eHJlcyA8PSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueHJlcykgJiYKIAkJICAgICAgICh2YXItPnlyZXMgPD0gc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLnlyZXMpICYmCiAJCSAgICAgICAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0uYnBwKSApIHsKLQkJICAgICAgICAgIGlmKHNpc2ZiX3ZhbGlkYXRlX21vZGUoaXZpZGVvLHNlYXJjaF9pZHgsIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MpID4gMCkgewotCQkJICAgICBmb3VuZF9tb2RlID0gMTsKLQkJCSAgICAgYnJlYWs7Ci0JCQkgIH0KKwkJCWlmKCh0aWR4ID0gc2lzZmJfdmFsaWRhdGVfbW9kZShpdmlkZW8sc2VhcmNoX2lkeCwKKwkJCQkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MpKSA+IDApIHsKKwkJCQlmb3VuZF9tb2RlID0gMTsKKwkJCQlzZWFyY2hfaWR4ID0gdGlkeDsKKwkJCQlicmVhazsKKwkJCX0KIAkJICAgfQogCQkgICBzZWFyY2hfaWR4Kys7Ci0JICAgICAgICB9CisJCX0KIAkJaWYoZm91bmRfbW9kZSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBBZGFwdGVkIGZyb20gJWR4JWR4JWQgdG8gJWR4JWR4JWRcbiIsCi0JCSAgIAkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwsCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSJzaXNmYjogQWRhcHRlZCBmcm9tICVkeCVkeCVkIHRvICVkeCVkeCVkXG4iLAorCQkJCXZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsLAogCQkJCXNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS54cmVzLAogCQkJCXNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS55cmVzLAogCQkJCXZhci0+Yml0c19wZXJfcGl4ZWwpOwogCQkJdmFyLT54cmVzID0gc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLnhyZXM7Ci0JCSAgICAgIAl2YXItPnlyZXMgPSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueXJlczsKLQotCisJCQl2YXItPnlyZXMgPSBzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ueXJlczsKIAkJfSBlbHNlIHsKLQkJICAgCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhaWxlZCB0byBmaW5kIHN1cHBvcnRlZCBtb2RlIG5lYXIgJWR4JWR4JWRcbiIsCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkic2lzZmI6IEZhaWxlZCB0byBmaW5kIHN1cHBvcnRlZCBtb2RlIG5lYXIgJWR4JWR4JWRcbiIsCiAJCQkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCQkgICAJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAotCWlmKCAoKGl2aWRlby0+dmJmbGFncyAmIFZCX0xWRFMpIHx8CQkJLyogU2xhdmUgbW9kZXMgb24gTFZEUyBhbmQgMzAxQi1ESCAqLwotCSAgICAgKChpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMHhCREgpICYmIChpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9MQ0QpKSkgJiYKKwlpZiggKChpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX0xWRFMpIHx8CisJICAgICAoKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4QkRIKSAmJiAoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIENSVDJfTENEKSkpICYmCiAJICAgICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDgpICkgewotCSAgICAJcmVmcmVzaF9yYXRlID0gNjA7CisJCS8qIFNsYXZlIG1vZGVzIG9uIExWRFMgYW5kIDMwMUItREggKi8KKwkJcmVmcmVzaF9yYXRlID0gNjA7CiAJCXJlY2FsY19jbG9jayA9IFRSVUU7Ci0JfSBlbHNlIGlmKCAoaXZpZGVvLT5jdXJyZW50X2h0b3RhbCA9PSBodG90YWwpICYmCS8qIHg9eCAmIHk9eSAmIGM9YyAtPiBhc3N1bWUgZGVwdGggY2hhbmdlICovCi0JICAgIAkgICAoaXZpZGVvLT5jdXJyZW50X3Z0b3RhbCA9PSB2dG90YWwpICYmCi0JICAgIAkgICAoaXZpZGVvLT5jdXJyZW50X3BpeGNsb2NrID09IHBpeGNsb2NrKSApIHsKKwl9IGVsc2UgaWYoIChpdmlkZW8tPmN1cnJlbnRfaHRvdGFsID09IGh0b3RhbCkgJiYKKwkJICAgKGl2aWRlby0+Y3VycmVudF92dG90YWwgPT0gdnRvdGFsKSAmJgorCQkgICAoaXZpZGVvLT5jdXJyZW50X3BpeGNsb2NrID09IHBpeGNsb2NrKSApIHsKKwkJLyogeD14ICYgeT15ICYgYz1jIC0+IGFzc3VtZSBkZXB0aCBjaGFuZ2UgKi8KIAkJZHJhdGUgPSAxMDAwMDAwMDAwIC8gcGl4Y2xvY2s7Ci0JICAgICAgICBocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOwotCSAgICAgICAgcmVmcmVzaF9yYXRlID0gKHVuc2lnbmVkIGludCkgKGhyYXRlICogMiAvIHZ0b3RhbCk7Ci0JfSBlbHNlIGlmKCAoIChpdmlkZW8tPmN1cnJlbnRfaHRvdGFsICE9IGh0b3RhbCkgfHwJLyogeCE9eCB8IHkhPXkgJiBjPWMgLT4gaW52YWxpZCBwaXhjbG9jayAqLwotCSAgICAJICAgICAoaXZpZGVvLT5jdXJyZW50X3Z0b3RhbCAhPSB2dG90YWwpICkgJiYKLQkgICAgCSAgIChpdmlkZW8tPmN1cnJlbnRfcGl4Y2xvY2sgPT0gdmFyLT5waXhjbG9jaykgKSB7CisJCWhyYXRlID0gKGRyYXRlICogMTAwMCkgLyBodG90YWw7CisJCXJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOworCX0gZWxzZSBpZiggKCAoaXZpZGVvLT5jdXJyZW50X2h0b3RhbCAhPSBodG90YWwpIHx8CisJCSAgICAgKGl2aWRlby0+Y3VycmVudF92dG90YWwgIT0gdnRvdGFsKSApICYmCisJCSAgIChpdmlkZW8tPmN1cnJlbnRfcGl4Y2xvY2sgPT0gdmFyLT5waXhjbG9jaykgKSB7CisJCS8qIHghPXggfCB5IT15ICYgYz1jIC0+IGludmFsaWQgcGl4Y2xvY2sgKi8KIAkJaWYoaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldXSkgewotCQkJcmVmcmVzaF9yYXRlID0gaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldXTsKKwkJCXJlZnJlc2hfcmF0ZSA9CisJCQkJaXZpZGVvLT5zaXNmYl9sYXN0cmF0ZXNbc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldXTsKIAkJfSBlbHNlIGlmKGl2aWRlby0+c2lzZmJfcGFybV9yYXRlICE9IC0xKSB7CiAJCQkvKiBTaWMsIHNpc2ZiX3Bhcm1fcmF0ZSAtIHdhbnQgdG8ga25vdyBvcmlnaW5hbGx5IGRlc2lyZWQgcmF0ZSBoZXJlICovCiAJCQlyZWZyZXNoX3JhdGUgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fcmF0ZTsKQEAgLTE5MjMsOCArMTYxOSw4IEBACiAJCXJlY2FsY19jbG9jayA9IFRSVUU7CiAJfSBlbHNlIGlmKChwaXhjbG9jaykgJiYgKGh0b3RhbCkgJiYgKHZ0b3RhbCkpIHsKIAkJZHJhdGUgPSAxMDAwMDAwMDAwIC8gcGl4Y2xvY2s7Ci0JICAgCWhyYXRlID0gKGRyYXRlICogMTAwMCkgLyBodG90YWw7Ci0JICAgCXJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOworCQlocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOworCQlyZWZyZXNoX3JhdGUgPSAodW5zaWduZWQgaW50KSAoaHJhdGUgKiAyIC8gdnRvdGFsKTsKIAl9IGVsc2UgaWYoaXZpZGVvLT5jdXJyZW50X3JlZnJlc2hfcmF0ZSkgewogCQlyZWZyZXNoX3JhdGUgPSBpdmlkZW8tPmN1cnJlbnRfcmVmcmVzaF9yYXRlOwogCQlyZWNhbGNfY2xvY2sgPSBUUlVFOwpAQCAtMTkzNyw3MiArMTYzMyw3MiBAQAogCiAJLyogRXZlbnR1YWxseSByZWNhbGN1bGF0ZSB0aW1pbmcgYW5kIGNsb2NrICovCiAJaWYocmVjYWxjX2Nsb2NrKSB7Ci0JICAgaWYoIW15cmF0ZWluZGV4KSBteXJhdGVpbmRleCA9IHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS5yYXRlX2lkeDsKLQkgICB2YXItPnBpeGNsb2NrID0gKHUzMikgKDEwMDAwMDAwMDAgLyBzaXNmYl9tb2RlX3JhdGVfdG9fZGNsb2NrKCZpdmlkZW8tPlNpU19QciwKLQkgICAJCQkJCSZpdmlkZW8tPnNpc2h3X2V4dCwKKwkJaWYoIW15cmF0ZWluZGV4KSBteXJhdGVpbmRleCA9IHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS5yYXRlX2lkeDsKKwkJdmFyLT5waXhjbG9jayA9ICh1MzIpICgxMDAwMDAwMDAwIC8gc2lzZmJfbW9kZV9yYXRlX3RvX2RjbG9jaygmaXZpZGVvLT5TaVNfUHIsCiAJCQkJCQlzaXNiaW9zX21vZGVbc2VhcmNoX2lkeF0ubW9kZV9ub1tpdmlkZW8tPm1uaV0sCiAJCQkJCQlteXJhdGVpbmRleCkpOwotCSAgIHNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YSgmaXZpZGVvLT5TaVNfUHIsICZpdmlkZW8tPnNpc2h3X2V4dCwKLQkJIAkJICAgIHNpc2Jpb3NfbW9kZVtzZWFyY2hfaWR4XS5tb2RlX25vW2l2aWRlby0+bW5pXSwgbXlyYXRlaW5kZXgsCXZhcik7Ci0JICAgaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9ET1VCTEUpIHsKLQkgICAgICB2YXItPnBpeGNsb2NrIDw8PSAxOwotCSAgIH0KKwkJc2lzZmJfbW9kZV9yYXRlX3RvX2RkYXRhKCZpdmlkZW8tPlNpU19QciwKKwkJCQkJc2lzYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldLAorCQkJCQlteXJhdGVpbmRleCwgdmFyKTsKKwkJaWYoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9ET1VCTEUpIHsKKwkJCXZhci0+cGl4Y2xvY2sgPDw9IDE7CisJCX0KIAl9CiAKIAlpZihpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgewotCSAgIGlmKCFzaXNmYl92ZXJpZnlfcmF0ZShpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLCBzZWFyY2hfaWR4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBteXJhdGVpbmRleCwgcmVmcmVzaF9yYXRlKSkgewotCSAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBXQVJOSU5HOiBSZWZyZXNoIHJhdGUgZXhjZWVkcyBtb25pdG9yIHNwZWNzIVxuIik7Ci0JICAgfQorCQlpZighc2lzZmJfdmVyaWZ5X3JhdGUoaXZpZGVvLCAmaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvciwgc2VhcmNoX2lkeCwKKwkJCQlteXJhdGVpbmRleCwgcmVmcmVzaF9yYXRlKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJzaXNmYjogV0FSTklORzogUmVmcmVzaCByYXRlIGV4Y2VlZHMgbW9uaXRvciBzcGVjcyFcbiIpOworCQl9CiAJfQogCiAJLyogQWRhcHQgUkdCIHNldHRpbmdzICovCiAJc2lzZmJfYnBwX3RvX3ZhcihpdmlkZW8sIHZhcik7Ci0JCisKIAkvKiBTYW5pdHkgY2hlY2sgZm9yIG9mZnNldHMgKi8KIAlpZih2YXItPnhvZmZzZXQgPCAwKSB2YXItPnhvZmZzZXQgPSAwOwogCWlmKHZhci0+eW9mZnNldCA8IDApIHZhci0+eW9mZnNldCA9IDA7CiAKLQlpZih2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkgewotCSAgIHZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOwotCX0KKwlpZih2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CiAKIAlpZihpdmlkZW8tPnNpc2ZiX3lwYW4pIHsKLQkgICBtYXh5cmVzID0gc2lzZmJfY2FsY19tYXh5cmVzKGl2aWRlbywgdmFyKTsKLQkgICBpZihpdmlkZW8tPnNpc2ZiX21heCkgewotCSAgICAgIHZhci0+eXJlc192aXJ0dWFsID0gbWF4eXJlczsKLQkgICB9IGVsc2UgewotCSAgICAgIGlmKHZhci0+eXJlc192aXJ0dWFsID4gbWF4eXJlcykgewotCSAgICAgICAgIHZhci0+eXJlc192aXJ0dWFsID0gbWF4eXJlczsKLQkgICAgICB9Ci0JICAgfQotCSAgIGlmKHZhci0+eXJlc192aXJ0dWFsIDw9IHZhci0+eXJlcykgewotCSAgICAgIHZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOwotCSAgIH0KKwkJbWF4eXJlcyA9IHNpc2ZiX2NhbGNfbWF4eXJlcyhpdmlkZW8sIHZhcik7CisJCWlmKGl2aWRlby0+c2lzZmJfbWF4KSB7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7CisJCX0gZWxzZSB7CisJCQlpZih2YXItPnlyZXNfdmlydHVhbCA+IG1heHlyZXMpIHsKKwkJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heHlyZXM7CisJCQl9CisJCX0KKwkJaWYodmFyLT55cmVzX3ZpcnR1YWwgPD0gdmFyLT55cmVzKSB7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKwkJfQogCX0gZWxzZSB7Ci0JICAgaWYodmFyLT55cmVzICE9IHZhci0+eXJlc192aXJ0dWFsKSB7Ci0JICAgICAgdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7Ci0JICAgfQotCSAgIHZhci0+eG9mZnNldCA9IDA7Ci0JICAgdmFyLT55b2Zmc2V0ID0gMDsKKwkJaWYodmFyLT55cmVzICE9IHZhci0+eXJlc192aXJ0dWFsKSB7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKwkJfQorCQl2YXItPnhvZmZzZXQgPSAwOworCQl2YXItPnlvZmZzZXQgPSAwOwogCX0KLQkKKwogCS8qIFRydW5jYXRlIG9mZnNldHMgdG8gbWF4aW11bSBpZiB0b28gaGlnaCAqLwogCWlmKHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzKSB7Ci0JICAgdmFyLT54b2Zmc2V0ID0gdmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMgLSAxOworCQl2YXItPnhvZmZzZXQgPSB2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcyAtIDE7CiAJfQogCiAJaWYodmFyLT55b2Zmc2V0ID4gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMpIHsKLQkgICB2YXItPnlvZmZzZXQgPSB2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcyAtIDE7CisJCXZhci0+eW9mZnNldCA9IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzIC0gMTsKIAl9Ci0JCisKIAkvKiBTZXQgZXZlcnl0aGluZyBlbHNlIHRvIDAgKi8KLQl2YXItPnJlZC5tc2JfcmlnaHQgPSAKLQl2YXItPmdyZWVuLm1zYl9yaWdodCA9Ci0JdmFyLT5ibHVlLm1zYl9yaWdodCA9Ci0JdmFyLT50cmFuc3Aub2Zmc2V0ID0KLQl2YXItPnRyYW5zcC5sZW5ndGggPQotCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7CisJdmFyLT5yZWQubXNiX3JpZ2h0ID0KKwkJdmFyLT5ncmVlbi5tc2JfcmlnaHQgPQorCQl2YXItPmJsdWUubXNiX3JpZ2h0ID0KKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0KKwkJdmFyLT50cmFuc3AubGVuZ3RoID0KKwkJdmFyLT50cmFuc3AubXNiX3JpZ2h0ID0gMDsKIAogCXJldHVybiAwOwogfQpAQCAtMjAxMywyMSArMTcwOSwyMSBAQAogCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKIAlpbnQgZXJyOwogCi0JaWYodmFyLT54b2Zmc2V0ID4gKHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzKSkgeworCWlmKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZih2YXItPnlvZmZzZXQgPiAodmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAotCWlmKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgcmV0dXJuIC1FSU5WQUw7CisJaWYodmFyLT55b2Zmc2V0ID4gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZih2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8Ci0JICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKSB7CisJICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKLQlpZigoZXJyID0gc2lzZmJfcGFuX3ZhcihpdmlkZW8sIHZhcikpIDwgMCkgcmV0dXJuIGVycjsKKwlpZigoZXJyID0gc2lzZmJfcGFuX3ZhcihpdmlkZW8sIHZhcikpIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwogCWluZm8tPnZhci55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OwpAQCAtMjA0MCw3ICsxNzM2LDcgQEAKIHsKIAlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKilpbmZvLT5wYXI7CiAKLQlyZXR1cm4oc2lzZmJfbXlibGFuayhpdmlkZW8sIGJsYW5rKSk7CisJcmV0dXJuIHNpc2ZiX215YmxhbmsoaXZpZGVvLCBibGFuayk7CiB9CiAKICNlbmRpZgpAQCAtMjA1NiwxNTMgKzE3NTIsMTg0IEBACiAJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBzaXNfdmlkZW9faW5mbwkqaXZpZGVvID0gKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqKWluZm8tPnBhcjsKLQlzdHJ1Y3Qgc2lzX21lbXJlcSAJc2lzbWVtcmVxOwotCXN0cnVjdCBmYl92YmxhbmsgIAlzaXN2YmJsYW5rOwotCXNpc2ZiX2luZm8gICAgICAgIAl4OworCXN0cnVjdCBzaXNfbWVtcmVxCXNpc21lbXJlcTsKKwlzdHJ1Y3QgZmJfdmJsYW5rCXNpc3ZiYmxhbms7CiAJdTMyCQkJZ3B1MzIgPSAwOwogI2lmbmRlZiBfX3VzZXIKICNkZWZpbmUgX191c2VyCiAjZW5kaWYKIAl1MzIgX191c2VyIAkJKmFyZ3AgPSAodTMyIF9fdXNlciAqKWFyZzsKIAotCXN3aXRjaCAoY21kKSB7CisJc3dpdGNoKGNtZCkgewogCSAgIGNhc2UgRkJJT19BTExPQzoKLQkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHsKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCQlyZXR1cm4gLUVQRVJNOwotCQl9Ci0JCWlmKGNvcHlfZnJvbV91c2VyKCZzaXNtZW1yZXEsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHNpc21lbXJlcSkpKSB7Ci0JCSAgIAlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCisJCWlmKGNvcHlfZnJvbV91c2VyKCZzaXNtZW1yZXEsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHNpc21lbXJlcSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJc2lzX21hbGxvYygmc2lzbWVtcmVxKTsKKwogCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmc2lzbWVtcmVxLCBzaXplb2Yoc2lzbWVtcmVxKSkpIHsKIAkJCXNpc19mcmVlKCh1MzIpc2lzbWVtcmVxLm9mZnNldCk7Ci0JCSAgICAJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlicmVhazsKIAogCSAgIGNhc2UgRkJJT19GUkVFOgotCQlpZighY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgeworCQlpZighY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJCXJldHVybiAtRVBFUk07Ci0JCX0KLQkJaWYoZ2V0X3VzZXIoZ3B1MzIsIGFyZ3ApKSB7CisKKwkJaWYoZ2V0X3VzZXIoZ3B1MzIsIGFyZ3ApKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCQlzaXNfZnJlZShncHUzMik7CiAJCWJyZWFrOwogCiAJICAgY2FzZSBGQklPR0VUX1ZCTEFOSzoKIAkJc2lzdmJibGFuay5jb3VudCA9IDA7CiAJCXNpc3ZiYmxhbmsuZmxhZ3MgPSBzaXNmYl9zZXR1cHZiYmxhbmtmbGFncyhpdmlkZW8sICZzaXN2YmJsYW5rLnZjb3VudCwgJnNpc3ZiYmxhbmsuaGNvdW50KTsKLQkJaWYoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnNpc3ZiYmxhbmssIHNpemVvZihzaXN2YmJsYW5rKSkpIHsKKworCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmc2lzdmJibGFuaywgc2l6ZW9mKHNpc3ZiYmxhbmspKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CisKIAkJYnJlYWs7CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9JTkZPX1NJWkU6Ci0JICAgICAgICByZXR1cm4gcHV0X3VzZXIoc2l6ZW9mKHNpc2ZiX2luZm8pLCBhcmdwKTsKKwkJcmV0dXJuIHB1dF91c2VyKHNpemVvZihzdHJ1Y3Qgc2lzZmJfaW5mbyksIGFyZ3ApOwogCiAJICAgY2FzZSBTSVNGQl9HRVRfSU5GT19PTEQ6Ci0JICAgICAgICBpZihpdmlkZW8tPndhcm5jb3VudCsrIDwgNTApIHsKLQkgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9HRVRfSU5GTzogIC8qIEZvciBjb21tdW5pY2F0aW9uIHdpdGggWCBkcml2ZXIgKi8KLQkJeC5zaXNmYl9pZCAgICAgICAgID0gU0lTRkJfSUQ7Ci0JCXguc2lzZmJfdmVyc2lvbiAgICA9IFZFUl9NQUpPUjsKLQkJeC5zaXNmYl9yZXZpc2lvbiAgID0gVkVSX01JTk9SOwotCQl4LnNpc2ZiX3BhdGNobGV2ZWwgPSBWRVJfTEVWRUw7Ci0JCXguY2hpcF9pZCA9IGl2aWRlby0+Y2hpcF9pZDsKLQkJeC5tZW1vcnkgPSBpdmlkZW8tPnZpZGVvX3NpemUgLyAxMDI0OwotCQl4LmhlYXBzdGFydCA9IGl2aWRlby0+aGVhcHN0YXJ0IC8gMTAyNDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaWQgICAgICAgICA9IFNJU0ZCX0lEOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl92ZXJzaW9uICAgID0gVkVSX01BSk9SOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9yZXZpc2lvbiAgID0gVkVSX01JTk9SOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9wYXRjaGxldmVsID0gVkVSX0xFVkVMOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5jaGlwX2lkID0gaXZpZGVvLT5jaGlwX2lkOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9wY2lfdmVuZG9yID0gaXZpZGVvLT5jaGlwX3ZlbmRvcjsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2subWVtb3J5ID0gaXZpZGVvLT52aWRlb19zaXplIC8gMTAyNDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suaGVhcHN0YXJ0ID0gaXZpZGVvLT5oZWFwc3RhcnQgLyAxMDI0OwogCQlpZihpdmlkZW8tPm1vZGVjaGFuZ2VkKSB7Ci0JCSAgIHguZmJ2aWRtb2RlID0gaXZpZGVvLT5tb2RlX25vOworCQkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suZmJ2aWRtb2RlID0gaXZpZGVvLT5tb2RlX25vOwogCQl9IGVsc2UgewotCQkgICB4LmZidmlkbW9kZSA9IGl2aWRlby0+bW9kZXByZWNoYW5nZTsKKwkJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLmZidmlkbW9kZSA9IGl2aWRlby0+bW9kZXByZWNoYW5nZTsKIAkJfQotCQl4LnNpc2ZiX2NhcHMgPSBpdmlkZW8tPmNhcHM7Ci0JCXguc2lzZmJfdHFsZW4gPSA1MTI7IC8qIHlldCBmaXhlZCAqLwotCQl4LnNpc2ZiX3BjaWJ1cyA9IGl2aWRlby0+cGNpYnVzOwotCQl4LnNpc2ZiX3BjaXNsb3QgPSBpdmlkZW8tPnBjaXNsb3Q7Ci0JCXguc2lzZmJfcGNpZnVuYyA9IGl2aWRlby0+cGNpZnVuYzsKLQkJeC5zaXNmYl9sY2RwZGMgPSBpdmlkZW8tPmRldGVjdGVkcGRjOwotCQl4LnNpc2ZiX2xjZHBkY2EgPSBpdmlkZW8tPmRldGVjdGVkcGRjYTsKLQkJeC5zaXNmYl9sY2RhID0gaXZpZGVvLT5kZXRlY3RlZGxjZGE7Ci0JCXguc2lzZmJfdmJmbGFncyA9IGl2aWRlby0+dmJmbGFnczsKLQkJeC5zaXNmYl9jdXJyZW50dmJmbGFncyA9IGl2aWRlby0+Y3VycmVudHZiZmxhZ3M7Ci0JCXguc2lzZmJfc2NhbGVsY2QgPSBpdmlkZW8tPlNpU19Qci5Vc2VQYW5lbFNjYWxlcjsKLQkJeC5zaXNmYl9zcGVjaWFsdGltaW5nID0gaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQ7Ci0JCXguc2lzZmJfaGF2ZWVtaSA9IGl2aWRlby0+U2lTX1ByLkhhdmVFTUkgPyAxIDogMDsKLQkJeC5zaXNmYl9oYXZlZW1pbGNkID0gaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSUxDRCA/IDEgOiAwOwotCQl4LnNpc2ZiX2VtaTMwID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMwOwotCQl4LnNpc2ZiX2VtaTMxID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMxOwotCQl4LnNpc2ZiX2VtaTMyID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMyOwotCQl4LnNpc2ZiX2VtaTMzID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMzOwotCQl4LnNpc2ZiX3R2eHBvcyA9ICh1MTYpKGl2aWRlby0+dHZ4cG9zICsgMzIpOwotCQl4LnNpc2ZiX3R2eXBvcyA9ICh1MTYpKGl2aWRlby0+dHZ5cG9zICsgMzIpOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9jYXBzID0gaXZpZGVvLT5jYXBzOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl90cWxlbiA9IGl2aWRlby0+Y21kUXVldWVTaXplIC8gMTAyNDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfcGNpYnVzID0gaXZpZGVvLT5wY2lidXM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3BjaXNsb3QgPSBpdmlkZW8tPnBjaXNsb3Q7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3BjaWZ1bmMgPSBpdmlkZW8tPnBjaWZ1bmM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2xjZHBkYyA9IGl2aWRlby0+ZGV0ZWN0ZWRwZGM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2xjZHBkY2EgPSBpdmlkZW8tPmRldGVjdGVkcGRjYTsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfbGNkYSA9IGl2aWRlby0+ZGV0ZWN0ZWRsY2RhOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl92YmZsYWdzID0gaXZpZGVvLT52YmZsYWdzOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9jdXJyZW50dmJmbGFncyA9IGl2aWRlby0+Y3VycmVudHZiZmxhZ3M7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3NjYWxlbGNkID0gaXZpZGVvLT5TaVNfUHIuVXNlUGFuZWxTY2FsZXI7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3NwZWNpYWx0aW1pbmcgPSBpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaGF2ZWVtaSA9IGl2aWRlby0+U2lTX1ByLkhhdmVFTUkgPyAxIDogMDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaGF2ZWVtaWxjZCA9IGl2aWRlby0+U2lTX1ByLkhhdmVFTUlMQ0QgPyAxIDogMDsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfZW1pMzAgPSBpdmlkZW8tPlNpU19Qci5FTUlfMzA7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2VtaTMxID0gaXZpZGVvLT5TaVNfUHIuRU1JXzMxOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl9lbWkzMiA9IGl2aWRlby0+U2lTX1ByLkVNSV8zMjsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfZW1pMzMgPSBpdmlkZW8tPlNpU19Qci5FTUlfMzM7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3R2eHBvcyA9ICh1MTYpKGl2aWRlby0+dHZ4cG9zICsgMzIpOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl90dnlwb3MgPSAodTE2KShpdmlkZW8tPnR2eXBvcyArIDMyKTsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfaGVhcHNpemUgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZSAvIDEwMjQ7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3ZpZGVvb2Zmc2V0ID0gaXZpZGVvLT52aWRlb19vZmZzZXQ7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2N1cmZzdG4gPSBpdmlkZW8tPmN1ckZTVE47CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2N1cmRzdG4gPSBpdmlkZW8tPmN1ckRTVE47CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX3ZiZmxhZ3MyID0gaXZpZGVvLT52YmZsYWdzMjsKKwkJaXZpZGVvLT5zaXNmYl9pbmZvYmxvY2suc2lzZmJfY2FuX3Bvc3QgPSBpdmlkZW8tPnNpc2ZiX2Nhbl9wb3N0ID8gMSA6IDA7CisJCWl2aWRlby0+c2lzZmJfaW5mb2Jsb2NrLnNpc2ZiX2NhcmRfcG9zdGVkID0gaXZpZGVvLT5zaXNmYl9jYXJkX3Bvc3RlZCA/IDEgOiAwOworCQlpdmlkZW8tPnNpc2ZiX2luZm9ibG9jay5zaXNmYl93YXNfYm9vdF9kZXZpY2UgPSBpdmlkZW8tPnNpc2ZiX3dhc19ib290X2RldmljZSA/IDEgOiAwOwogCi0JCWlmKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ4LCBzaXplb2YoeCkpKSB7CisJCWlmKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpdmlkZW8tPnNpc2ZiX2luZm9ibG9jaywKKwkJCQkJCXNpemVvZihpdmlkZW8tPnNpc2ZiX2luZm9ibG9jaykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCSAgICAgICAgYnJlYWs7CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9WQlJTVEFUVVNfT0xEOgotCSAgIAlpZihpdmlkZW8tPndhcm5jb3VudCsrIDwgNTApIHsKLQkgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9HRVRfVkJSU1RBVFVTOgotCSAgICAgICAgaWYoc2lzZmJfQ2hlY2tWQlJldHJhY2UoaXZpZGVvKSkgeworCQlpZihzaXNmYl9DaGVja1ZCUmV0cmFjZShpdmlkZW8pKQogCQkJcmV0dXJuIHB1dF91c2VyKCh1MzIpMSwgYXJncCk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXJldHVybiBwdXRfdXNlcigodTMyKTAsIGFyZ3ApOwotCQl9CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9BVVRPTUFYSU1JWkVfT0xEOgotCSAgIAlpZihpdmlkZW8tPndhcm5jb3VudCsrIDwgNTApIHsKLQkgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9HRVRfQVVUT01BWElNSVpFOgotCSAgICAgICAgaWYoaXZpZGVvLT5zaXNmYl9tYXgpCXJldHVybiBwdXRfdXNlcigodTMyKTEsIGFyZ3ApOwotCQllbHNlCQkJcmV0dXJuIHB1dF91c2VyKCh1MzIpMCwgYXJncCk7CisJCWlmKGl2aWRlby0+c2lzZmJfbWF4KQorCQkJcmV0dXJuIHB1dF91c2VyKCh1MzIpMSwgYXJncCk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcigodTMyKTAsIGFyZ3ApOwogCiAJICAgY2FzZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFX09MRDoKLQkgICAJaWYoaXZpZGVvLT53YXJuY291bnQrKyA8IDUwKSB7Ci0JCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBEZXByZWNhdGVkIGlvY3RsIGNhbGwgcmVjZWl2ZWQgLSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiFcbiIpOwotCQl9CisJCWlmKGl2aWRlby0+d2FybmNvdW50KysgPCAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkic2lzZmI6IERlcHJlY2F0ZWQgaW9jdGwgY2FsbCByZWNlaXZlZCAtIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIVxuIik7CiAJICAgY2FzZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFOgotCQlpZihjb3B5X2Zyb21fdXNlcigmZ3B1MzIsIGFyZ3AsIHNpemVvZihncHUzMikpKSB7CisJCWlmKGdldF91c2VyKGdwdTMyLCBhcmdwKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CisKIAkJaXZpZGVvLT5zaXNmYl9tYXggPSAoZ3B1MzIpID8gMSA6IDA7CiAJCWJyZWFrOwogCiAJICAgY2FzZSBTSVNGQl9TRVRfVFZQT1NPRkZTRVQ6Ci0JCWlmKGNvcHlfZnJvbV91c2VyKCZncHUzMiwgYXJncCwgc2l6ZW9mKGdwdTMyKSkpIHsKKwkJaWYoZ2V0X3VzZXIoZ3B1MzIsIGFyZ3ApKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCQlzaXNmYl9zZXRfVFZ4cG9zb2Zmc2V0KGl2aWRlbywgKChpbnQpKGdwdTMyID4+IDE2KSkgLSAzMik7CiAJCXNpc2ZiX3NldF9UVnlwb3NvZmZzZXQoaXZpZGVvLCAoKGludCkoZ3B1MzIgJiAweGZmZmYpKSAtIDMyKTsKIAkJYnJlYWs7CiAKIAkgICBjYXNlIFNJU0ZCX0dFVF9UVlBPU09GRlNFVDoKLQkgICAgICAgIHJldHVybiBwdXRfdXNlcigodTMyKSgoKGl2aWRlby0+dHZ4cG9zKzMyKTw8MTYpfCgoaXZpZGVvLT50dnlwb3MrMzIpJjB4ZmZmZikpLAotCQkJCWFyZ3ApOworCQlyZXR1cm4gcHV0X3VzZXIoKHUzMikoKChpdmlkZW8tPnR2eHBvcyszMik8PDE2KXwoKGl2aWRlby0+dHZ5cG9zKzMyKSYweGZmZmYpKSwKKwkJCQkJCQlhcmdwKTsKKworCSAgIGNhc2UgU0lTRkJfQ09NTUFORDoKKwkJaWYoY29weV9mcm9tX3VzZXIoJml2aWRlby0+c2lzZmJfY29tbWFuZCwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJCXNpemVvZihzdHJ1Y3Qgc2lzZmJfY21kKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzaXNmYl9oYW5kbGVfY29tbWFuZChpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX2NvbW1hbmQpOworCisJCWlmKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpdmlkZW8tPnNpc2ZiX2NvbW1hbmQsCisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBzaXNmYl9jbWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOwogCiAJICAgY2FzZSBTSVNGQl9TRVRfTE9DSzoKLQkJaWYoY29weV9mcm9tX3VzZXIoJmdwdTMyLCBhcmdwLCBzaXplb2YoZ3B1MzIpKSkgeworCQlpZihnZXRfdXNlcihncHUzMiwgYXJncCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCiAJCWl2aWRlby0+c2lzZmJsb2NrZWQgPSAoZ3B1MzIpID8gMSA6IDA7CiAJCWJyZWFrOwogCiAJICAgZGVmYXVsdDoKKyNpZmRlZiBTSVNfTkVXX0NPTkZJR19DT01QQVQKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKyNlbHNlCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCiAJfQogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGxvbmcgc2lzZmJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKKyNpZmRlZiBTSVNfTkVXX0NPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nCitzaXNmYl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0OworCiAJbG9ja19rZXJuZWwoKTsKIAlyZXQgPSBzaXNmYl9pb2N0bChOVUxMLCBmLCBjbWQsIGFyZywgaW5mbyk7CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtMjIxOSw3ICsxOTQ2LDcgQEAKIAogCXN0cmNweShmaXgtPmlkLCBpdmlkZW8tPm15aWQpOwogCi0JZml4LT5zbWVtX3N0YXJ0ICA9IGl2aWRlby0+dmlkZW9fYmFzZTsKKwlmaXgtPnNtZW1fc3RhcnQgID0gaXZpZGVvLT52aWRlb19iYXNlICsgaXZpZGVvLT52aWRlb19vZmZzZXQ7CiAJZml4LT5zbWVtX2xlbiAgICA9IGl2aWRlby0+c2lzZmJfbWVtOwogCWZpeC0+dHlwZSAgICAgICAgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CiAJZml4LT50eXBlX2F1eCAgICA9IDA7CkBAIC0yMjMxLDExICsxOTU4LDE3IEBACiAJZml4LT5tbWlvX3N0YXJ0ICA9IGl2aWRlby0+bW1pb19iYXNlOwogCWZpeC0+bW1pb19sZW4gICAgPSBpdmlkZW8tPm1taW9fc2l6ZTsKIAlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICBmaXgtPmFjY2VsICAgID0gRkJfQUNDRUxfU0lTX0dMQU1PVVI7Ci0JfSBlbHNlIGlmKChpdmlkZW8tPmNoaXAgPT0gU0lTXzMzMCkgfHwgKGl2aWRlby0+Y2hpcCA9PSBTSVNfNzYwKSkgewotCSAgIGZpeC0+YWNjZWwgICAgPSBGQl9BQ0NFTF9TSVNfWEFCUkU7CisJCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TSVNfR0xBTU9VUjsKKwl9IGVsc2UgaWYoKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzMwKSB8fAorCQkgIChpdmlkZW8tPmNoaXAgPT0gU0lTXzc2MCkgfHwKKwkJICAoaXZpZGVvLT5jaGlwID09IFNJU183NjEpKSB7CisJCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TSVNfWEFCUkU7CisJfSBlbHNlIGlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJZml4LT5hY2NlbCA9IEZCX0FDQ0VMX1hHSV9WT0xBUklfWjsKKwl9IGVsc2UgaWYoaXZpZGVvLT5jaGlwID49IFhHSV80MCkgeworCQlmaXgtPmFjY2VsID0gRkJfQUNDRUxfWEdJX1ZPTEFSSV9WOwogCX0gZWxzZSB7Ci0JICAgZml4LT5hY2NlbCAgICA9IEZCX0FDQ0VMX1NJU19HTEFNT1VSXzI7CisJCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TSVNfR0xBTU9VUl8yOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjI1MSw0MCArMTk4NCw0MSBAQAogCS5mYl9zZXRfdmFyCT0gc2lzZmJfc2V0X3ZhciwKIAkuZmJfZ2V0X2NtYXAJPSBzaXNmYl9nZXRfY21hcCwKIAkuZmJfc2V0X2NtYXAJPSBzaXNmYl9zZXRfY21hcCwKLSAgICAgICAgLmZiX3Bhbl9kaXNwbGF5ID0gc2lzZmJfcGFuX2Rpc3BsYXksCisJLmZiX3Bhbl9kaXNwbGF5ID0gc2lzZmJfcGFuX2Rpc3BsYXksCiAJLmZiX2lvY3RsCT0gc2lzZmJfaW9jdGwKIH07CiAjZW5kaWYKIAogI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNpc2ZiX29wcyA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZmJfb3BlbiAgICAgICAgPSBzaXNmYl9vcGVuLAotCS5mYl9yZWxlYXNlICAgICA9IHNpc2ZiX3JlbGVhc2UsCi0JLmZiX2NoZWNrX3ZhciAgID0gc2lzZmJfY2hlY2tfdmFyLAotCS5mYl9zZXRfcGFyICAgICA9IHNpc2ZiX3NldF9wYXIsCi0JLmZiX3NldGNvbHJlZyAgID0gc2lzZmJfc2V0Y29scmVnLAotICAgICAgICAuZmJfcGFuX2Rpc3BsYXkgPSBzaXNmYl9wYW5fZGlzcGxheSwKLSAgICAgICAgLmZiX2JsYW5rICAgICAgID0gc2lzZmJfYmxhbmssCi0JLmZiX2ZpbGxyZWN0ICAgID0gZmJjb25fc2lzX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYSAgICA9IGZiY29uX3Npc19jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0ICAgPSBjZmJfaW1hZ2VibGl0LAotCS5mYl9jdXJzb3IgICAgICA9IHNvZnRfY3Vyc29yLAotCS5mYl9zeW5jICAgICAgICA9IGZiY29uX3Npc19zeW5jLAotCS5mYl9pb2N0bCAgICAgICA9IHNpc2ZiX2lvY3RsLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkuZmJfY29tcGF0X2lvY3RsID0gc2lzZmJfY29tcGF0X2lvY3RsLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmJfb3Blbgk9IHNpc2ZiX29wZW4sCisJLmZiX3JlbGVhc2UJPSBzaXNmYl9yZWxlYXNlLAorCS5mYl9jaGVja192YXIJPSBzaXNmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBzaXNmYl9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcJPSBzaXNmYl9zZXRjb2xyZWcsCisJLmZiX3Bhbl9kaXNwbGF5CT0gc2lzZmJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rCT0gc2lzZmJfYmxhbmssCisJLmZiX2ZpbGxyZWN0CT0gZmJjb25fc2lzX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGZiY29uX3Npc19jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfY3Vyc29yCT0gc29mdF9jdXJzb3IsCisJLmZiX3N5bmMJPSBmYmNvbl9zaXNfc3luYywKKyNpZmRlZiBTSVNfTkVXX0NPTkZJR19DT01QQVQKKwkuZmJfY29tcGF0X2lvY3RsPSBzaXNmYl9jb21wYXRfaW9jdGwsCiAjZW5kaWYKKwkuZmJfaW9jdGwJPSBzaXNmYl9pb2N0bAogfTsKICNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIENoaXAgZ2VuZXJhdGlvbiBkZXBlbmRlbnQgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBzaXNmYl9nZXRfbm9ydGhicmlkZ2UoaW50IGJhc2VjaGlwaWQpCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBfX2RldmluaXQKK3Npc2ZiX2dldF9ub3J0aGJyaWRnZShpbnQgYmFzZWNoaXBpZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CiAJaW50IG5icmlkZ2VudW0sIG5icmlkZ2VpZHgsIGk7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgbmJyaWRnZWlkc1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBuYnJpZGdlaWRzW10gPSB7CiAJCVBDSV9ERVZJQ0VfSURfU0lfNTQwLAkvKiBmb3IgU2lTIDU0MCBWR0EgKi8KIAkJUENJX0RFVklDRV9JRF9TSV82MzAsCS8qIGZvciBTaVMgNjMwLzczMCBWR0EgKi8KIAkJUENJX0RFVklDRV9JRF9TSV83MzAsCkBAIC0yMjkyLDEzICsyMDI2LDE0IEBACiAJCVBDSV9ERVZJQ0VfSURfU0lfNjUwLCAgIC8qIGZvciBTaVMgNjUwLzY1MS83NDAgVkdBICovCiAJCVBDSV9ERVZJQ0VfSURfU0lfNjUxLAogCQlQQ0lfREVWSUNFX0lEX1NJXzc0MCwKLQkJUENJX0RFVklDRV9JRF9TSV82NjEsCS8qIGZvciBTaVMgNjYxLzc0MS82NjAvNzYwIFZHQSAqLworCQlQQ0lfREVWSUNFX0lEX1NJXzY2MSwJLyogZm9yIFNpUyA2NjEvNzQxLzY2MC83NjAvNzYxIFZHQSAqLwogCQlQQ0lfREVWSUNFX0lEX1NJXzc0MSwKIAkJUENJX0RFVklDRV9JRF9TSV82NjAsCi0JCVBDSV9ERVZJQ0VfSURfU0lfNzYwCisJCVBDSV9ERVZJQ0VfSURfU0lfNzYwLAorCQlQQ0lfREVWSUNFX0lEX1NJXzc2MQogCX07CiAKLSAgICAJc3dpdGNoKGJhc2VjaGlwaWQpIHsKKwlzd2l0Y2goYmFzZWNoaXBpZCkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJY2FzZSBTSVNfNTQwOgluYnJpZGdlaWR4ID0gMDsgbmJyaWRnZW51bSA9IDE7IGJyZWFrOwogCWNhc2UgU0lTXzYzMDoJbmJyaWRnZWlkeCA9IDE7IG5icmlkZ2VudW0gPSAyOyBicmVhazsKQEAgLTIzMDYsMzUgKzIwNDEsNDAgQEAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWNhc2UgU0lTXzU1MDogICBuYnJpZGdlaWR4ID0gMzsgbmJyaWRnZW51bSA9IDE7IGJyZWFrOwogCWNhc2UgU0lTXzY1MDoJbmJyaWRnZWlkeCA9IDQ7IG5icmlkZ2VudW0gPSAzOyBicmVhazsKLQljYXNlIFNJU182NjA6CW5icmlkZ2VpZHggPSA3OyBuYnJpZGdlbnVtID0gNDsgYnJlYWs7CisJY2FzZSBTSVNfNjYwOgluYnJpZGdlaWR4ID0gNzsgbmJyaWRnZW51bSA9IDU7IGJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IG5icmlkZ2VudW07IGkrKykgewotCQlpZigocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlaWRzW25icmlkZ2VpZHgraV0sIE5VTEwpKSkgYnJlYWs7CisJCWlmKChwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksCisJCQkJbmJyaWRnZWlkc1tuYnJpZGdlaWR4K2ldLCBOVUxMKSkpCisJCQlicmVhazsKIAl9CiAJcmV0dXJuIHBkZXY7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNpc2ZiX2dldF9kcmFtX3NpemUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc2lzZmJfZ2V0X2RyYW1fc2l6ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICNpZiBkZWZpbmVkKENPTkZJR19GQl9TSVNfMzAwKSB8fCBkZWZpbmVkKENPTkZJR19GQl9TSVNfMzE1KQogCXU4IHJlZzsKICNlbmRpZgogCiAJaXZpZGVvLT52aWRlb19zaXplID0gMDsKKwlpdmlkZW8tPlVNQXNpemUgPSBpdmlkZW8tPkxGQnNpemUgPSAwOwogCiAJc3dpdGNoKGl2aWRlby0+Y2hpcCkgewogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJY2FzZSBTSVNfMzAwOgotCSAgICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsIDB4MTQsIHJlZyk7CisJCWluU0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOwogCQlpdmlkZW8tPnZpZGVvX3NpemUgPSAoKHJlZyAmIDB4M0YpICsgMSkgPDwgMjA7CiAJCWJyZWFrOwogCWNhc2UgU0lTXzU0MDoKIAljYXNlIFNJU182MzA6CiAJY2FzZSBTSVNfNzMwOgotCSAgIAlpZighaXZpZGVvLT5uYnJpZGdlKSByZXR1cm4gLTE7Ci0JICAgCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGl2aWRlby0+bmJyaWRnZSwgMHg2MywgJnJlZyk7CisJCWlmKCFpdmlkZW8tPm5icmlkZ2UpCisJCQlyZXR1cm4gLTE7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGl2aWRlby0+bmJyaWRnZSwgMHg2MywgJnJlZyk7CiAJCWl2aWRlby0+dmlkZW9fc2l6ZSA9IDEgPDwgKCgocmVnICYgMHg3MCkgPj4gNCkgKyAyMSk7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC0yMzQyLDQ1ICsyMDgyLDY4IEBACiAJY2FzZSBTSVNfMzE1SDoKIAljYXNlIFNJU18zMTVQUk86CiAJY2FzZSBTSVNfMzE1OgotCSAgIAlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgcmVnKTsKKwkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MTQsIHJlZyk7CiAJCWl2aWRlby0+dmlkZW9fc2l6ZSA9ICgxIDw8ICgocmVnICYgMHhmMCkgPj4gNCkpIDw8IDIwOwogCQlzd2l0Y2goKHJlZyA+PiAyKSAmIDB4MDMpIHsKIAkJY2FzZSAweDAxOgogCQljYXNlIDB4MDM6Ci0JCSAgIGl2aWRlby0+dmlkZW9fc2l6ZSA8PD0gMTsKLQkJICAgYnJlYWs7CisJCQlpdmlkZW8tPnZpZGVvX3NpemUgPDw9IDE7CisJCQlicmVhazsKIAkJY2FzZSAweDAyOgotCQkgICBpdmlkZW8tPnZpZGVvX3NpemUgKz0gKGl2aWRlby0+dmlkZW9fc2l6ZS8yKTsKKwkJCWl2aWRlby0+dmlkZW9fc2l6ZSArPSAoaXZpZGVvLT52aWRlb19zaXplLzIpOwogCQl9Ci0JICAgCWJyZWFrOworCQlicmVhazsKIAljYXNlIFNJU18zMzA6Ci0JICAgCWluU0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOworCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgcmVnKTsKIAkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KSkgPDwgMjA7CiAJCWlmKHJlZyAmIDB4MGMpIGl2aWRlby0+dmlkZW9fc2l6ZSA8PD0gMTsKLQkgICAJYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgU0lTXzU1MDoKIAljYXNlIFNJU182NTA6CiAJY2FzZSBTSVNfNzQwOgotCSAgICAJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MTQsIHJlZyk7CisJCWluU0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOwogCQlpdmlkZW8tPnZpZGVvX3NpemUgPSAoKChyZWcgJiAweDNmKSArIDEpIDw8IDIpIDw8IDIwOwogCQlicmVhazsKIAljYXNlIFNJU182NjE6CiAJY2FzZSBTSVNfNzQxOgotCSAgICAgCWluU0lTSURYUkVHKFNJU0NSLCAweDc5LCByZWcpOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg3OSwgcmVnKTsKIAkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KSkgPDwgMjA7Ci0JICAgCWJyZWFrOworCQlicmVhazsKIAljYXNlIFNJU182NjA6CiAJY2FzZSBTSVNfNzYwOgorCWNhc2UgU0lTXzc2MToKIAkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4NzksIHJlZyk7CiAJCXJlZyA9IChyZWcgJiAweGYwKSA+PiA0OwotCQlpZihyZWcpCWl2aWRlby0+dmlkZW9fc2l6ZSA9ICgxIDw8IHJlZykgPDwgMjA7CisJCWlmKHJlZykJeworCQkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgcmVnKSA8PCAyMDsKKwkJCWl2aWRlby0+VU1Bc2l6ZSA9IGl2aWRlby0+dmlkZW9fc2l6ZTsKKwkJfQogCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg3OCwgcmVnKTsKIAkJcmVnICY9IDB4MzA7CiAJCWlmKHJlZykgewotCQkgICBpZihyZWcgPT0gMHgxMCkgaXZpZGVvLT52aWRlb19zaXplICs9ICgzMiA8PCAyMCk7Ci0JCSAgIGVsc2UJCSAgIGl2aWRlby0+dmlkZW9fc2l6ZSArPSAoNjQgPDwgMjApOworCQkJaWYocmVnID09IDB4MTApIHsKKwkJCQlpdmlkZW8tPkxGQnNpemUgPSAoMzIgPDwgMjApOworCQkJfSBlbHNlIHsKKwkJCQlpdmlkZW8tPkxGQnNpemUgPSAoNjQgPDwgMjApOworCQkJfQorCQkJaXZpZGVvLT52aWRlb19zaXplICs9IGl2aWRlby0+TEZCc2l6ZTsKIAkJfQotCSAgIAlicmVhazsKKwkJYnJlYWs7CisJY2FzZSBTSVNfMzQwOgorCWNhc2UgWEdJXzIwOgorCWNhc2UgWEdJXzQwOgorCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgcmVnKTsKKwkJaXZpZGVvLT52aWRlb19zaXplID0gKDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KSkgPDwgMjA7CisJCWlmKGl2aWRlby0+Y2hpcCAhPSBYR0lfMjApIHsKKwkJCXJlZyA9IChyZWcgJiAweDBjKSA+PiAyOworCQkJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSB7CisJCQkJaWYocmVnICYgMHgwMSkgcmVnID0gMHgwMjsKKwkJCQllbHNlCSAgICAgICByZWcgPSAweDAwOworCQkJfQorCQkJaWYocmVnID09IDB4MDIpCQlpdmlkZW8tPnZpZGVvX3NpemUgPDw9IDE7CisJCQllbHNlIGlmKHJlZyA9PSAweDAzKQlpdmlkZW8tPnZpZGVvX3NpemUgPDw9IDI7CisJCX0KKwkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CkBAIC0yMzkwLDE3ICsyMTUzLDI0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tIHZpZGVvIGJyaWRnZSBkZXZpY2UgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc2lzZmJfZGV0ZWN0X1ZCX2Nvbm5lY3Qoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3Npc2ZiX2RldGVjdF9WQl9jb25uZWN0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogCXU4IGNyMzIsIHRlbXA7CiAKKwkvKiBObyBDUlQyIG9uIFhHSSBaNyAqLworCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gMDsKKwkJcmV0dXJuOworCX0KKwogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CiAJCWluU0lTSURYUkVHKFNJU1NSLCAweDE3LCB0ZW1wKTsKIAkJaWYoKHRlbXAgJiAweDBGKSAmJiAoaXZpZGVvLT5jaGlwICE9IFNJU18zMDApKSB7CiAJCQkvKiBQQUwvTlRTQyBpcyBzdG9yZWQgb24gU1IxNiBvbiBzdWNoIG1hY2hpbmVzICovCiAJCQlpZighKGl2aWRlby0+dmJmbGFncyAmIChUVl9QQUwgfCBUVl9OVFNDIHwgVFZfUEFMTSB8IFRWX1BBTE4pKSkgewotCQkgICAJCWluU0lTSURYUkVHKFNJU1NSLCAweDE2LCB0ZW1wKTsKKwkJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgdGVtcCk7CiAJCQkJaWYodGVtcCAmIDB4MjApCiAJCQkJCWl2aWRlby0+dmJmbGFncyB8PSBUVl9QQUw7CiAJCQkJZWxzZQpAQCAtMjQzNSwyOCArMjIwNSwyOSBAQAogCiAJaWYoaXZpZGVvLT5zaXNmYl90dnBsdWcgIT0gLTEpIHsKIAkgICBpZiggKGl2aWRlby0+c2lzdmdhX2VuZ2luZSAhPSBTSVNfMzE1X1ZHQSkgfHwKLQkgICAgICAgKCEoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUN8VkJfMzAxTFZ8VkJfMzAyTFYpKSkgKSB7CisJICAgICAgICghKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTWVBCUFJCUklER0UpKSApIHsKIAkgICAgICBpZihpdmlkZW8tPnNpc2ZiX3R2cGx1ZyAmIFRWX1lQQlBSKSB7Ci0JICAgICAgICAgaXZpZGVvLT5zaXNmYl90dnBsdWcgPSAtMTsKKwkJIGl2aWRlby0+c2lzZmJfdHZwbHVnID0gLTE7CiAJCSBwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBZUGJQciBub3Qgc3VwcG9ydGVkXG4iKTsKIAkgICAgICB9CiAJICAgfQogCX0KIAlpZihpdmlkZW8tPnNpc2ZiX3R2cGx1ZyAhPSAtMSkgewogCSAgIGlmKCAoaXZpZGVvLT5zaXN2Z2FfZW5naW5lICE9IFNJU18zMTVfVkdBKSB8fAotCSAgICAgICAoIShpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfMzAxfFZCXzMwMUJ8VkJfMzAyQikpKSApIHsKKwkgICAgICAgKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNISVZJU0lPTkJSSURHRSkpICkgewogCSAgICAgIGlmKGl2aWRlby0+c2lzZmJfdHZwbHVnICYgVFZfSElWSVNJT04pIHsKLQkgICAgICAgICBpdmlkZW8tPnNpc2ZiX3R2cGx1ZyA9IC0xOworCQkgaXZpZGVvLT5zaXNmYl90dnBsdWcgPSAtMTsKIAkJIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IEhpVmlzaW9uIG5vdCBzdXBwb3J0ZWRcbiIpOwogCSAgICAgIH0KIAkgICB9CiAJfQogCWlmKGl2aWRlby0+c2lzZmJfdHZzdGQgIT0gLTEpIHsKLQkgICBpZiggKCEoaXZpZGVvLT52YmZsYWdzICYgVkJfU0lTQlJJREdFKSkgJiYKLQkgICAgICAgKCEoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgJiYgKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSkpICkgeworCSAgIGlmKCAoIShpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0JSSURHRSkpICYmCisJICAgICAgICghKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmCisJCQkoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkpKSApIHsKIAkgICAgICBpZihpdmlkZW8tPnNpc2ZiX3R2c3RkICYgKFRWX1BBTE4gfCBUVl9QQUxOIHwgVFZfTlRTQ0opKSB7Ci0JICAgICAgICAgaXZpZGVvLT5zaXNmYl90dnN0ZCA9IC0xOwotCSAgICAgICAgIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IFBBTE0vUEFMTi9OVFNDSiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJIGl2aWRlby0+c2lzZmJfdHZzdGQgPSAtMTsKKwkJIHByaW50ayhLRVJOX0VSUiAic2lzZmI6IFBBTE0vUEFMTi9OVFNDSiBub3Qgc3VwcG9ydGVkXG4iKTsKIAkgICAgICB9CiAJICAgfQogCX0KQEAgLTI0NjgsNyArMjIzOSw3IEBACiAJCWlmKGNyMzIgJiBTSVNfVkJfWVBCUFIpICAgICAJIGl2aWRlby0+dmJmbGFncyB8PSAoVFZfWVBCUFJ8VFZfWVBCUFI1MjVJKTsgLyogZGVmYXVsdDogNDgwaSAqLwogCQllbHNlIGlmKGNyMzIgJiBTSVNfVkJfSElWSVNJT04pICBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfSElWSVNJT047CiAJCWVsc2UgaWYoY3IzMiAmIFNJU19WQl9TQ0FSVCkgICAgIGl2aWRlby0+dmJmbGFncyB8PSBUVl9TQ0FSVDsKLQkgCWVsc2UgeworCQllbHNlIHsKIAkJCWlmKGNyMzIgJiBTSVNfVkJfU1ZJREVPKSAgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfU1ZJREVPOwogCQkJaWYoY3IzMiAmIFNJU19WQl9DT01QT1NJVEUpIGl2aWRlby0+dmJmbGFncyB8PSBUVl9BVklERU87CiAJCX0KQEAgLTI0ODUsMTY1ICsyMjU2LDQ0IEBACiAJICAgIH0KIAkgICAgaWYoIShpdmlkZW8tPnZiZmxhZ3MgJiAoVFZfUEFMIHwgVFZfTlRTQyB8IFRWX1BBTE0gfCBUVl9QQUxOIHwgVFZfTlRTQ0opKSkgewogCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgICAgIAlpblNJU0lEWFJFRyhTSVNTUiwgMHgzOCwgdGVtcCk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgzOCwgdGVtcCk7CiAJCQlpZih0ZW1wICYgMHgwMSkgaXZpZGVvLT52YmZsYWdzIHw9IFRWX1BBTDsKIAkJCWVsc2UJCWl2aWRlby0+dmJmbGFncyB8PSBUVl9OVFNDOwogCQl9IGVsc2UgaWYoKGl2aWRlby0+Y2hpcCA8PSBTSVNfMzE1UFJPKSB8fCAoaXZpZGVvLT5jaGlwID49IFNJU18zMzApKSB7Ci0gICAgICAgICAgICAgICAgCWluU0lTSURYUkVHKFNJU1NSLCAweDM4LCB0ZW1wKTsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDM4LCB0ZW1wKTsKIAkJCWlmKHRlbXAgJiAweDAxKSBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfUEFMOwogCQkJZWxzZQkJaXZpZGVvLT52YmZsYWdzIHw9IFRWX05UU0M7Ci0JICAgIAl9IGVsc2UgewotCSAgICAgICAgCWluU0lTSURYUkVHKFNJU0NSLCAweDc5LCB0ZW1wKTsKKwkJfSBlbHNlIHsKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDc5LCB0ZW1wKTsKIAkJCWlmKHRlbXAgJiAweDIwKQlpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfUEFMOwogCQkJZWxzZQkJaXZpZGVvLT52YmZsYWdzIHw9IFRWX05UU0M7Ci0JICAgIAl9CisJCX0KIAkgICAgfQogCX0KIAogCS8qIENvcHkgZm9yY2VDUlQxIG9wdGlvbiB0byBDUlQxb2ZmIGlmIG9wdGlvbiBpcyBnaXZlbiAqLwotICAgIAlpZihpdmlkZW8tPnNpc2ZiX2ZvcmNlY3J0MSAhPSAtMSkgewotICAgIAkgICBpdmlkZW8tPnNpc2ZiX2NydDFvZmYgPSAoaXZpZGVvLT5zaXNmYl9mb3JjZWNydDEpID8gMCA6IDE7Ci0gICAgCX0KLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNpc2ZiX2dldF9WQl90eXBlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQotewotCWNoYXIgc3Rkc3RyW10gICAgPSAic2lzZmI6IERldGVjdGVkIjsKLQljaGFyIGJyaWRnZXN0cltdID0gInZpZGVvIGJyaWRnZSI7Ci0JdTggdmJfY2hpcGlkOwotCXU4IHJlZzsKLQotCWluU0lTSURYUkVHKFNJU1BBUlQ0LCAweDAwLCB2Yl9jaGlwaWQpOwotCXN3aXRjaCh2Yl9jaGlwaWQpIHsKLQljYXNlIDB4MDE6Ci0JCWluU0lTSURYUkVHKFNJU1BBUlQ0LCAweDAxLCByZWcpOwotCQlpZihyZWcgPCAweGIwKSB7Ci0JCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0JCX0gZWxzZSBpZihyZWcgPCAweGMwKSB7Ci0JCSAJaXZpZGVvLT52YmZsYWdzIHw9IFZCXzMwMUI7Ci0JCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwweDIzLHJlZyk7Ci0JCQlpZighKHJlZyAmIDB4MDIpKSB7Ci0JCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzB4QkRIOwotCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxQi1ESCAlc1xuIiwgc3Rkc3RyLCBicmlkZ2VzdHIpOwotCQkJfSBlbHNlIHsKLQkJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUIgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKLQkJCX0KLQkJfSBlbHNlIGlmKHJlZyA8IDB4ZDApIHsKLQkJIAlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQzsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUMgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKLQkJfSBlbHNlIGlmKHJlZyA8IDB4ZTApIHsKLQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDFMVjsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUxWICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0JCX0gZWxzZSBpZihyZWcgPD0gMHhlMSkgewotCQkgICAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzkscmVnKTsKLQkJCWlmKHJlZyA9PSAweGZmKSB7Ci0JCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAyTFY7Ci0JCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDJMViAlc1xuIiwgc3Rkc3RyLCBicmlkZ2VzdHIpOwotCQkJfSBlbHNlIHsKLQkJCSAgIGl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDFDOwotCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxQyhQNCkgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKLSNpZiAwCi0JCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAyRUxWOwotCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAyRUxWICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0jZW5kaWYKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIDB4MDI6Ci0JCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDJCOwotCQlwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDJCICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7Ci0JCWJyZWFrOwotCX0KLQotCWlmKCghKGl2aWRlby0+dmJmbGFncyAmIFZCX1ZJREVPQlJJREdFKSkgJiYgKGl2aWRlby0+Y2hpcCAhPSBTSVNfMzAwKSkgewotCQlpblNJU0lEWFJFRyhTSVNDUiwgMHgzNywgcmVnKTsKLQkJcmVnICY9IFNJU19FWFRFUk5BTF9DSElQX01BU0s7Ci0JCXJlZyA+Pj0gMTsKLQkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLQkJCXN3aXRjaChyZWcpIHsKLQkJCSAgIGNhc2UgU0lTX0VYVEVSTkFMX0NISVBfTFZEUzoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfTFZEUzsKLQkJCQlicmVhazsKLQkJCSAgIGNhc2UgU0lTX0VYVEVSTkFMX0NISVBfVFJVTVBJT046Ci0JCQkJaXZpZGVvLT52YmZsYWdzIHw9IFZCX1RSVU1QSU9OOwotCQkJCWJyZWFrOwotCQkJICAgY2FzZSBTSVNfRVhURVJOQUxfQ0hJUF9DSFJPTlRFTDoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfQ0hST05URUw7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlIFNJU19FWFRFUk5BTF9DSElQX0xWRFNfQ0hST05URUw6Ci0JCQkJaXZpZGVvLT52YmZsYWdzIHw9IChWQl9MVkRTIHwgVkJfQ0hST05URUwpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ0hST05URUwpIGl2aWRlby0+Y2hyb250ZWx0eXBlID0gMTsKLSNlbmRpZgotCQl9IGVsc2UgaWYoaXZpZGVvLT5jaGlwIDwgU0lTXzY2MSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0JCQlzd2l0Y2ggKHJlZykgewotCSAJICAgCSAgIGNhc2UgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEUzoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfTFZEUzsKLQkJCQlicmVhazsKLQkJICAgCSAgIGNhc2UgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTDoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl9DSFJPTlRFTCkgaXZpZGVvLT5jaHJvbnRlbHR5cGUgPSAyOwotI2VuZGlmCi0JCX0gZWxzZSBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0JCQlpblNJU0lEWFJFRyhTSVNDUiwgMHgzOCwgcmVnKTsKLQkJCXJlZyA+Pj0gNTsKLQkJCXN3aXRjaChyZWcpIHsKLQkJCSAgIGNhc2UgMHgwMjoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfTFZEUzsKLQkJCQlicmVhazsKLQkJCSAgIGNhc2UgMHgwMzoKLQkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7Ci0JCQkJYnJlYWs7Ci0JCQkgICBjYXNlIDB4MDQ6Ci0JCQkJaXZpZGVvLT52YmZsYWdzIHw9IChWQl9MVkRTIHwgVkJfQ09ORVhBTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ0hST05URUwpIGl2aWRlby0+Y2hyb250ZWx0eXBlID0gMjsKLSNlbmRpZgotCQl9Ci0JCWlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0xWRFMpIHsKLQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgTFZEUyB0cmFuc21pdHRlclxuIiwgc3Rkc3RyKTsKLQkJfQotCQlpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl9UUlVNUElPTikgewotCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBUcnVtcGlvbiBadXJhYyBMQ0Qgc2NhbGVyXG4iLCBzdGRzdHIpOwotCQl9Ci0JCWlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7Ci0JCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIENocm9udGVsIFRWIGVuY29kZXJcbiIsIHN0ZHN0cik7Ci0JCX0KLQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ09ORVhBTlQpIHsKLQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgQ29uZXhhbnQgZXh0ZXJuYWwgZGV2aWNlXG4iLCBzdGRzdHIpOwotCQl9Ci0JfQotCi0JaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfU0lTQlJJREdFKSB7Ci0JCVNpU19TZW5zZTMweChpdmlkZW8pOwotCX0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl9DSFJPTlRFTCkgewotCQlTaVNfU2Vuc2VDaChpdmlkZW8pOworCWlmKGl2aWRlby0+c2lzZmJfZm9yY2VjcnQxICE9IC0xKSB7CisJICAgaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gKGl2aWRlby0+c2lzZmJfZm9yY2VjcnQxKSA/IDAgOiAxOwogCX0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIFNlbnNpbmcgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBCT09MRUFOIF9fZGV2aW5pdCBzaXNmYl90ZXN0X0REQzEoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgQk9PTEVBTiBfX2RldmluaXQKK3Npc2ZiX3Rlc3RfRERDMShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICAgICB1bnNpZ25lZCBzaG9ydCBvbGQ7CiAgICAgaW50IGNvdW50ID0gNDg7CiAKICAgICBvbGQgPSBTaVNfUmVhZEREQzFCaXQoJml2aWRlby0+U2lTX1ByKTsKICAgICBkbyB7Ci0gICAgICAgCWlmKG9sZCAhPSBTaVNfUmVhZEREQzFCaXQoJml2aWRlby0+U2lTX1ByKSkgYnJlYWs7CisJaWYob2xkICE9IFNpU19SZWFkRERDMUJpdCgmaXZpZGVvLT5TaVNfUHIpKSBicmVhazsKICAgICB9IHdoaWxlKGNvdW50LS0pOwogICAgIHJldHVybiAoY291bnQgPT0gLTEpID8gRkFMU0UgOiBUUlVFOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc2lzZmJfc2Vuc2VfY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfc2Vuc2VfY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICAgICBCT09MRUFOIG11c3R3YWl0ID0gRkFMU0U7CiAgICAgdTggIHNyMUYsIGNyMTc7CkBAIC0yNjk5LDcgKzIzNDksOCBAQAogICAgIGlmKHRlbXAgPT0gMHhmZmZmKSB7CiAgICAgICAgaSA9IDM7CiAgICAgICAgZG8gewotICAgICAgICAgIHRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIDAsIDAsIE5VTEwpOworCSAgdGVtcCA9IFNpU19IYW5kbGVEREMoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnZiZmxhZ3MsCisJCWl2aWRlby0+c2lzdmdhX2VuZ2luZSwgMCwgMCwgTlVMTCwgaXZpZGVvLT52YmZsYWdzMik7CiAgICAgICAgfSB3aGlsZSgoKHRlbXAgPT0gMCkgfHwgKHRlbXAgPT0gMHhmZmZmKSkgJiYgaS0tKTsKIAogICAgICAgIGlmKCh0ZW1wID09IDApIHx8ICh0ZW1wID09IDB4ZmZmZikpIHsKQEAgLTI3MjMsNyArMjM3NCw5NiBAQAogfQogCiAvKiBEZXRlcm1pbmUgYW5kIGRldGVjdCBhdHRhY2hlZCBkZXZpY2VzIG9uIFNpUzMweCAqLwotc3RhdGljIGludCBfX2RldmluaXQgU0lTRG9TZW5zZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgdTE2IHR5cGUsIHUxNiB0ZXN0KQorc3RhdGljIHZvaWQgX19kZXZpbml0CitTaVNfU2Vuc2VMQ0Qoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbMjU2XTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wLCByZWFsY3J0bm8sIGk7CisJdTggcmVnLCBjcjM3ID0gMCwgcGFuZWx0eXBlID0gMDsKKwl1MTYgeHJlcywgeXJlczsKKworCWl2aWRlby0+U2lTX1ByLlBhbmVsU2VsZkRldGVjdGVkID0gRkFMU0U7CisKKwkvKiBMQ0QgZGV0ZWN0aW9uIG9ubHkgZm9yIFRNRFMgYnJpZGdlcyAqLworCWlmKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNUTURTQlJJREdFKSkKKwkJcmV0dXJuOworCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4QkRIKQorCQlyZXR1cm47CisKKwkvKiBJZiBMQ0QgYWxyZWFkeSBzZXQgdXAgYnkgQklPUywgc2tpcCBpdCAqLworCWluU0lTSURYUkVHKFNJU0NSLCAweDMyLCByZWcpOworCWlmKHJlZyAmIDB4MDgpCisJCXJldHVybjsKKworCXJlYWxjcnRubyA9IDE7CisJaWYoaXZpZGVvLT5TaVNfUHIuRERDUG9ydE1peHVwKQorCQlyZWFsY3J0bm8gPSAwOworCisJLyogQ2hlY2sgRERDIGNhcGFiaWxpdGllcyAqLworCXRlbXAgPSBTaVNfSGFuZGxlRERDKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT52YmZsYWdzLCBpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsCisJCQkJcmVhbGNydG5vLCAwLCAmYnVmZmVyWzBdLCBpdmlkZW8tPnZiZmxhZ3MyKTsKKworCWlmKCghdGVtcCkgfHwgKHRlbXAgPT0gMHhmZmZmKSB8fCAoISh0ZW1wICYgMHgwMikpKQorCQlyZXR1cm47CisKKwkvKiBSZWFkIEREQyBkYXRhICovCisJaSA9IDM7ICAvKiBOdW1iZXIgb2YgcmV0cnlzICovCisJZG8geworCQl0ZW1wID0gU2lTX0hhbmRsZUREQygmaXZpZGVvLT5TaVNfUHIsIGl2aWRlby0+dmJmbGFncywKKwkJCQlpdmlkZW8tPnNpc3ZnYV9lbmdpbmUsIHJlYWxjcnRubywgMSwKKwkJCQkmYnVmZmVyWzBdLCBpdmlkZW8tPnZiZmxhZ3MyKTsKKwl9IHdoaWxlKCh0ZW1wKSAmJiBpLS0pOworCisJaWYodGVtcCkKKwkJcmV0dXJuOworCisJLyogTm8gZGlnaXRhbCBkZXZpY2UgKi8KKwlpZighKGJ1ZmZlclsweDE0XSAmIDB4ODApKQorCQlyZXR1cm47CisKKwkvKiBGaXJzdCBkZXRhaWxlZCB0aW1pbmcgcHJlZmVycmVkIHRpbWluZz8gKi8KKwlpZighKGJ1ZmZlclsweDE4XSAmIDB4MDIpKQorCQlyZXR1cm47CisKKwl4cmVzID0gYnVmZmVyWzB4MzhdIHwgKChidWZmZXJbMHgzYV0gJiAweGYwKSA8PCA0KTsKKwl5cmVzID0gYnVmZmVyWzB4M2JdIHwgKChidWZmZXJbMHgzZF0gJiAweGYwKSA8PCA0KTsKKworCXN3aXRjaCh4cmVzKSB7CisJCWNhc2UgMTAyNDoKKwkJCWlmKHlyZXMgPT0gNzY4KQorCQkJCXBhbmVsdHlwZSA9IDB4MDI7CisJCQlicmVhazsKKwkJY2FzZSAxMjgwOgorCQkJaWYoeXJlcyA9PSAxMDI0KQorCQkJCXBhbmVsdHlwZSA9IDB4MDM7CisJCQlicmVhazsKKwkJY2FzZSAxNjAwOgorCQkJaWYoKHlyZXMgPT0gMTIwMCkgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4QykpCisJCQkJcGFuZWx0eXBlID0gMHgwYjsKKwkJCWJyZWFrOworCX0KKworCWlmKCFwYW5lbHR5cGUpCisJCXJldHVybjsKKworCWlmKGJ1ZmZlclsweDIzXSkKKwkJY3IzNyB8PSAweDEwOworCisJaWYoKGJ1ZmZlclsweDQ3XSAmIDB4MTgpID09IDB4MTgpCisJCWNyMzcgfD0gKCgoKGJ1ZmZlclsweDQ3XSAmIDB4MDYpIF4gMHgwNikgPDwgNSkgfCAweDIwKTsKKwllbHNlCisJCWNyMzcgfD0gMHhjMDsKKworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzNiwgcGFuZWx0eXBlKTsKKwljcjM3ICY9IDB4ZjE7CisJc2V0U0lTSURYUkVHKFNJU0NSLCAweDM3LCAweDBjLCBjcjM3KTsKKwlvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgwOCk7CisKKwlpdmlkZW8tPlNpU19Qci5QYW5lbFNlbGZEZXRlY3RlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitTSVNEb1NlbnNlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1MTYgdHlwZSwgdTE2IHRlc3QpCiB7CiAgICAgaW50IHRlbXAsIG15dGVzdCwgcmVzdWx0LCBpLCBqOwogCkBAIC0yNzQ5LDEwICsyNDg5LDExIEBACiAgICAgICAgfQogICAgICAgIGlmKChyZXN1bHQgPT0gMCkgfHwgKHJlc3VsdCA+PSAyKSkgYnJlYWs7CiAgICAgfQotICAgIHJldHVybihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBTaVNfU2Vuc2UzMHgoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK1NpU19TZW5zZTMweChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKICAgICB1OCAgYmFja3VwUDRfMGQsYmFja3VwUDJfMDAsYmFja3VwUDJfNGQsYmFja3VwU1JfMWUsYmlvc2ZsYWc9MDsKICAgICB1MTYgc3Zocz0wLCBzdmhzX2M9MDsKQEAgLTI3NjIsMzYgKzI1MDMsNTEgQEAKICAgICBjaGFyIHN0ZHN0cltdID0gInNpc2ZiOiBEZXRlY3RlZCI7CiAgICAgY2hhciB0dnN0cltdICA9ICJUViBjb25uZWN0ZWQgdG8iOwogCi0gICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfMzAxKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMDEpIHsKICAgICAgICBzdmhzID0gMHgwMGI5OyBjdmJzID0gMHgwMGIzOyB2Z2EyID0gMHgwMGQxOwogICAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MDEsbXlmbGFnKTsKICAgICAgICBpZihteWZsYWcgJiAweDA0KSB7CiAJICBzdmhzID0gMHgwMGRkOyBjdmJzID0gMHgwMGVlOyB2Z2EyID0gMHgwMGZkOwogICAgICAgIH0KLSAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUIgfCBWQl8zMDJCKSkgeworICAgIH0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MyICYgKFZCMl8zMDFCIHwgVkIyXzMwMkIpKSB7CiAgICAgICAgc3ZocyA9IDB4MDE2YjsgY3ZicyA9IDB4MDE3NDsgdmdhMiA9IDB4MDE5MDsKLSAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUxWIHwgVkJfMzAyTFYpKSB7CisgICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFnczIgJiAoVkIyXzMwMUxWIHwgVkIyXzMwMkxWKSkgewogICAgICAgIHN2aHMgPSAweDAyMDA7IGN2YnMgPSAweDAxMDA7Ci0gICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDFDIHwgVkJfMzAyRUxWKSkgeworICAgIH0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MyICYgKFZCMl8zMDFDIHwgVkIyXzMwMkVMViB8IFZCMl8zMDdUIHwgVkIyXzMwN0xWKSkgewogICAgICAgIHN2aHMgPSAweDAxNmI7IGN2YnMgPSAweDAxMTA7IHZnYTIgPSAweDAxOTA7Ci0gICAgfSBlbHNlIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICAgICByZXR1cm47CiAKICAgICB2Z2EyX2MgPSAweDBlMDg7IHN2aHNfYyA9IDB4MDQwNDsgY3Zic19jID0gMHgwODA0OwotICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDFMVnxWQl8zMDJMVnxWQl8zMDJFTFYpKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCMl8zMDFMVnxWQjJfMzAyTFZ8VkIyXzMwMkVMVnxWQjJfMzA3TFYpKSB7CiAgICAgICAgc3Zoc19jID0gMHgwNDA4OyBjdmJzX2MgPSAweDA4MDg7CiAgICAgfQorCiAgICAgYmlvc2ZsYWcgPSAyOworICAgIGlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworICAgICAgIGJpb3NmbGFnID0gaXZpZGVvLT5iaW9zX2FiYXNlWzB4NThdICYgMHgwMzsKKyAgICB9IGVsc2UgaWYoaXZpZGVvLT5uZXdyb20pIHsKKyAgICAgICBpZihpdmlkZW8tPmJpb3NfYWJhc2VbMHg1ZF0gJiAweDA0KSBiaW9zZmxhZyB8PSAweDAxOworICAgIH0gZWxzZSBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKyAgICAgICBpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHsKKyAgICAgICAgICBiaW9zZmxhZyA9IGl2aWRlby0+Ymlvc19hYmFzZVsweGZlXSAmIDB4MDM7CisgICAgICAgfQorICAgIH0KIAogICAgIGlmKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzAwKSB7CiAgICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgzYixteWZsYWcpOwogICAgICAgIGlmKCEobXlmbGFnICYgMHgwMSkpIHZnYTIgPSB2Z2EyX2MgPSAwOwogICAgIH0KIAorICAgIGlmKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNWR0EyQlJJREdFKSkgeworICAgICAgIHZnYTIgPSB2Z2EyX2MgPSAwOworICAgIH0KKwogICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MWUsYmFja3VwU1JfMWUpOwogICAgIG9yU0lTSURYUkVHKFNJU1NSLDB4MWUsMHgyMCk7CiAKICAgICBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDBkLGJhY2t1cFA0XzBkKTsKLSAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMDFDKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhDKSB7CiAgICAgICAgc2V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGQsfjB4MDcsMHgwMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICBvclNJU0lEWFJFRyhTSVNQQVJUNCwweDBkLDB4MDQpOwpAQCAtMjgwMiwxMSArMjU1OCwxMSBAQAogICAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDAwLCgoYmFja3VwUDJfMDAgfCAweDFjKSAmIDB4ZmMpKTsKIAogICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4NGQsYmFja3VwUDJfNGQpOwotICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDFDfFZCXzMwMUxWfFZCXzMwMkxWfFZCXzMwMkVMVikpIHsKKyAgICBpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU1lQQlBSQlJJREdFKSB7CiAgICAgICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4NGQsKGJhY2t1cFAyXzRkICYgfjB4MTApKTsKICAgICB9CiAKLSAgICBpZighKGl2aWRlby0+dmJmbGFncyAmIFZCXzMwMUMpKSB7CisgICAgaWYoIShpdmlkZW8tPnZiZmxhZ3MyICYgVkIyXzMweENMVikpIHsKICAgICAgICBTSVNEb1NlbnNlKGl2aWRlbywgMCwgMCk7CiAgICAgfQogCkBAIC0yODI2LDEyICsyNTgyLDExIEBACiAKICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4M2YpOwogCi0gICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfMzAxQykgeworICAgIGlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfMzB4Q0xWKSB7CiAgICAgICAgb3JTSVNJRFhSRUcoU0lTUEFSVDQsMHgwZCwweDA0KTsKICAgICB9CiAKLSAgICBpZigoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSAmJgotICAgICAgIChpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfMzAxQ3xWQl8zMDFMVnxWQl8zMDJMVnxWQl8zMDJFTFYpKSkgeworICAgIGlmKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpICYmIChpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU1lQQlBSQlJJREdFKSkgewogICAgICAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDRkLChiYWNrdXBQMl80ZCB8IDB4MTApKTsKICAgICAgICBTaVNfRERDMkRlbGF5KCZpdmlkZW8tPlNpU19QciwgMHgyMDAwKTsKICAgICAgICBpZigocmVzdWx0ID0gU0lTRG9TZW5zZShpdmlkZW8sIHN2aHMsIDB4MDYwNCkpKSB7CkBAIC0yODY0LDcgKzI2MTksNyBAQAogICAgIG91dFNJU0lEWFJFRyhTSVNQQVJUNCwweDBkLGJhY2t1cFA0XzBkKTsKICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxZSxiYWNrdXBTUl8xZSk7CiAKLSAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMDFDKSB7CisgICAgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl8zMHhDTFYpIHsKICAgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMiwweDAwLGJpb3NmbGFnKTsKICAgICAgICBpZihiaW9zZmxhZyAmIDB4MjApIHsKICAgICAgICAgICBmb3IobXlmbGFnID0gMjsgbXlmbGFnID4gMDsgbXlmbGFnLS0pIHsKQEAgLTI4NzgsNyArMjYzMyw4IEBACiB9CiAKIC8qIERldGVybWluZSBhbmQgZGV0ZWN0IGF0dGFjaGVkIFRWJ3Mgb24gQ2hyb250ZWwgKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBTaVNfU2Vuc2VDaChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorU2lTX1NlbnNlQ2goc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTXzMwMCkgfHwgZGVmaW5lZChDT05GSUdfRkJfU0lTXzMxNSkKICAgICB1OCB0ZW1wMSwgdGVtcDI7CkBAIC0yODk5LDcgKzI2NTUsNyBAQAogICAgICAgIC8qIFNlZSBDaHJvbnRlbCBUQjMxIGZvciBleHBsYW5hdGlvbiAqLwogICAgICAgIHRlbXAyID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGUpOwogICAgICAgIGlmKCgodGVtcDIgJiAweDA3KSA9PSAweDAxKSB8fCAodGVtcDIgJiAweDA0KSkgewotCSAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIwZSk7CisJICBTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgwZSwgMHgwYik7CiAJICBTaVNfRERDMkRlbGF5KCZpdmlkZW8tPlNpU19QciwgMzAwKTsKICAgICAgICB9CiAgICAgICAgdGVtcDIgPSBTaVNfR2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgyNSk7CkBAIC0yOTA5LDE1ICsyNjY1LDE1IEBACiAJICAgLyogUmVhZCBwb3dlciBzdGF0dXMgKi8KIAkgICB0ZW1wMSA9IFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDBlKTsKIAkgICBpZigodGVtcDEgJiAweDAzKSAhPSAweDAzKSB7Ci0gICAgIAkgICAgICAgIC8qIFBvd2VyIGFsbCBvdXRwdXRzICovCi0JCVNpU19TZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDBCMEUpOworCQkvKiBQb3dlciBhbGwgb3V0cHV0cyAqLworCQlTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgwZSwweDBiKTsKIAkJU2lTX0REQzJEZWxheSgmaXZpZGVvLT5TaVNfUHIsIDMwMCk7CiAJICAgfQogCSAgIC8qIFNlbnNlIGNvbm5lY3RlZCBUViBkZXZpY2VzICovCiAJICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JICAgICAgIFNpU19TZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDAxMTApOworCSAgICAgICBTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgxMCwgMHgwMSk7CiAJICAgICAgIFNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKLQkgICAgICAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MDAxMCk7CisJICAgICAgIFNpU19TZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDEwLCAweDAwKTsKIAkgICAgICAgU2lTX0REQzJEZWxheSgmaXZpZGVvLT5TaVNfUHIsIDB4OTYpOwogCSAgICAgICB0ZW1wMSA9IFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDEwKTsKIAkgICAgICAgaWYoISh0ZW1wMSAmIDB4MDgpKSAgICAgICB0ZXN0W2ldID0gMHgwMjsKQEAgLTI5MzAsNyArMjY4Niw3IEBACiAJICAgZWxzZSBpZih0ZXN0WzBdID09IHRlc3RbMl0pIHRlbXAxID0gdGVzdFswXTsKIAkgICBlbHNlIGlmKHRlc3RbMV0gPT0gdGVzdFsyXSkgdGVtcDEgPSB0ZXN0WzFdOwogCSAgIGVsc2UgewotCSAgIAlwcmludGsoS0VSTl9JTkZPCisJCXByaW50ayhLRVJOX0lORk8KIAkJCSJzaXNmYjogVFYgZGV0ZWN0aW9uIHVucmVsaWFibGUgLSB0ZXN0IHJlc3VsdHMgdmFyaWVkXG4iKTsKIAkJdGVtcDEgPSB0ZXN0WzJdOwogCSAgIH0KQEAgLTI5NDUsMTEgKzI3MDEsMTEgQEAKIAkJb3JTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4MDEpOwogCQlhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDA2KTsKIAkgICB9IGVsc2UgewotIAkJU2lTX1NldENINzB4eEFORE9SKCZpdmlkZW8tPlNpU19QciwgMHgwMTBFLDB4RjgpOworCQlTaVNfU2V0Q0g3MHh4QU5ET1IoJml2aWRlby0+U2lTX1ByLCAweDBlLCAweDAxLCAweEY4KTsKIAkJYW5kU0lTSURYUkVHKFNJU0NSLCAweDMyLCB+MHgwNyk7CiAJICAgfQogICAgICAgIH0gZWxzZSBpZih0ZW1wMSA9PSAwKSB7Ci0JICBTaVNfU2V0Q0g3MHh4QU5ET1IoJml2aWRlby0+U2lTX1ByLCAweDAxMEUsMHhGOCk7CisJICBTaVNfU2V0Q0g3MHh4QU5ET1IoJml2aWRlby0+U2lTX1ByLCAweDBlLCAweDAxLCAweEY4KTsKIAkgIGFuZFNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgfjB4MDcpOwogICAgICAgIH0KICAgICAgICAvKiBTZXQgZ2VuZXJhbCBwdXJwb3NlIElPIGZvciBDaHJvbnRlbCBjb21tdW5pY2F0aW9uICovCkBAIC0yOTYwLDE5ICsyNzE2LDE5IEBACiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWl2aWRlby0+U2lTX1ByLlNpU19JRl9ERUZfQ0g3MHh4ID0gMjsJCS8qIENocm9udGVsIDcwMTkgKi8KLSAgICAgICAgdGVtcDEgPSBTaVNfR2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHg0OSk7Ci0JU2lTX1NldENINzAxeCgmaXZpZGVvLT5TaVNfUHIsIDB4MjA0OSk7CisJdGVtcDEgPSBTaVNfR2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHg0OSk7CisJU2lTX1NldENINzAxeCgmaXZpZGVvLT5TaVNfUHIsIDB4NDksIDB4MjApOwogCVNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKIAl0ZW1wMiA9IFNpU19HZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAweDIwKTsKIAl0ZW1wMiB8PSAweDAxOwotCVNpU19TZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAodGVtcDIgPDwgOCkgfCAweDIwKTsKKwlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHgyMCwgdGVtcDIpOwogCVNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKIAl0ZW1wMiBePSAweDAxOwotCVNpU19TZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAodGVtcDIgPDwgOCkgfCAweDIwKTsKKwlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHgyMCwgdGVtcDIpOwogCVNpU19EREMyRGVsYXkoJml2aWRlby0+U2lTX1ByLCAweDk2KTsKIAl0ZW1wMiA9IFNpU19HZXRDSDcwMXgoJml2aWRlby0+U2lTX1ByLCAweDIwKTsKLQlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgKHRlbXAxIDw8IDgpIHwgMHg0OSk7Ci0gICAgICAgIHRlbXAxID0gMDsKKwlTaVNfU2V0Q0g3MDF4KCZpdmlkZW8tPlNpU19QciwgMHg0OSwgdGVtcDEpOworCXRlbXAxID0gMDsKIAlpZih0ZW1wMiAmIDB4MDIpIHRlbXAxIHw9IDB4MDE7CiAJaWYodGVtcDIgJiAweDEwKSB0ZW1wMSB8PSAweDAxOwogCWlmKHRlbXAyICYgMHgwNCkgdGVtcDEgfD0gMHgwMjsKQEAgLTI5ODMsMTggKzI3MzksMTggQEAKIAkgICAgIGl2aWRlby0+dmJmbGFncyB8PSBUVl9BVklERU87CiAJICAgICBvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgwMSk7CiAJICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDA2KTsKLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWNhc2UgMHgwMjoKIAkgICAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNWSURFTyBvdXRwdXRcbiIsIHN0ZHN0cik7CiAJICAgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVFZfU1ZJREVPOwogCSAgICAgb3JTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4MDIpOwogCSAgICAgYW5kU0lTSURYUkVHKFNJU0NSLCAweDMyLCB+MHgwNSk7Ci0gICAgICAgICAgICAgYnJlYWs7CisJICAgICBicmVhazsKIAljYXNlIDB4MDQ6CiAJICAgICBwcmludGsoS0VSTl9JTkZPICIlcyBTQ0FSVCBvdXRwdXRcbiIsIHN0ZHN0cik7CiAJICAgICBvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgwNCk7CiAJICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDAzKTsKLSAgICAgICAgICAgICBicmVhazsKKwkgICAgIGJyZWFrOwogCWRlZmF1bHQ6CiAJICAgICBhbmRTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIH4weDA3KTsKIAl9CkBAIC0zMDAyLDEzICsyNzU4LDQ0OSBAQAogICAgIH0KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhlYXAgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfZ2V0X1ZCX3R5cGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCit7CisJY2hhciBzdGRzdHJbXSAgICA9ICJzaXNmYjogRGV0ZWN0ZWQiOworCWNoYXIgYnJpZGdlc3RyW10gPSAidmlkZW8gYnJpZGdlIjsKKwl1OCB2Yl9jaGlwaWQ7CisJdTggcmVnOworCisJLyogTm8gQ1JUMiBvbiBYR0kgWjcgKi8KKwlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKQorCQlyZXR1cm47CisKKwlpblNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwMCwgdmJfY2hpcGlkKTsKKwlzd2l0Y2godmJfY2hpcGlkKSB7CisJY2FzZSAweDAxOgorCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwMSwgcmVnKTsKKwkJaWYocmVnIDwgMHhiMCkgeworCQkJaXZpZGVvLT52YmZsYWdzIHw9IFZCXzMwMTsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAxICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisJCX0gZWxzZSBpZihyZWcgPCAweGMwKSB7CisJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQjsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxQjsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MjMscmVnKTsKKwkJCWlmKCEocmVnICYgMHgwMikpIHsKKwkJCSAgIGl2aWRlby0+dmJmbGFncyB8PSBWQl8zMHhCREg7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCSAgIGl2aWRlby0+dmJmbGFnczIgfD0gVkIyXzMweEJESDsKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUItREggJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJCX0gZWxzZSB7CisJCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDFCICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisJCQl9CisJCX0gZWxzZSBpZihyZWcgPCAweGQwKSB7CisJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQzsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxQzsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUMgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJfSBlbHNlIGlmKHJlZyA8IDB4ZTApIHsKKwkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDFMVjsJLyogRGVwcmVjYXRlZCAqLworCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxTFY7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBTaVMzMDFMViAlc1xuIiwgc3Rkc3RyLCBicmlkZ2VzdHIpOworCQl9IGVsc2UgaWYocmVnIDw9IDB4ZTEpIHsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzkscmVnKTsKKwkJCWlmKHJlZyA9PSAweGZmKSB7CisJCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAyTFY7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCSAgIGl2aWRlby0+dmJmbGFnczIgfD0gVkIyXzMwMkxWOworCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAyTFYgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJCX0gZWxzZSB7CisJCQkgICBpdmlkZW8tPnZiZmxhZ3MgfD0gVkJfMzAxQzsJLyogRGVwcmVjYXRlZCAqLworCQkJICAgaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAxQzsKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMUMoUDQpICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisjaWYgMAorCQkJICAgaXZpZGVvLT52YmZsYWdzIHw9IFZCXzMwMkVMVjsJLyogRGVwcmVjYXRlZCAqLworCQkJICAgaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfMzAyRUxWOworCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMgU2lTMzAyRUxWICVzXG4iLCBzdGRzdHIsIGJyaWRnZXN0cik7CisjZW5kaWYKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIDB4MDI6CisJCWl2aWRlby0+dmJmbGFncyB8PSBWQl8zMDJCOwkvKiBEZXByZWNhdGVkICovCisJCWl2aWRlby0+dmJmbGFnczIgfD0gVkIyXzMwMkI7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIFNpUzMwMkIgJXNcbiIsIHN0ZHN0ciwgYnJpZGdlc3RyKTsKKwkJYnJlYWs7CisJfQorCisJaWYoKCEoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9WSURFT0JSSURHRSkpICYmIChpdmlkZW8tPmNoaXAgIT0gU0lTXzMwMCkpIHsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MzcsIHJlZyk7CisJCXJlZyAmPSBTSVNfRVhURVJOQUxfQ0hJUF9NQVNLOworCQlyZWcgPj49IDE7CisJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJCQlzd2l0Y2gocmVnKSB7CisJCQkgICBjYXNlIFNJU19FWFRFUk5BTF9DSElQX0xWRFM6CisJCQkJaXZpZGVvLT52YmZsYWdzIHw9IFZCX0xWRFM7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IFZCMl9MVkRTOworCQkJCWJyZWFrOworCQkJICAgY2FzZSBTSVNfRVhURVJOQUxfQ0hJUF9UUlVNUElPTjoKKwkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9UUlVNUElPTik7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IChWQjJfTFZEUyB8IFZCMl9UUlVNUElPTik7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlIFNJU19FWFRFUk5BTF9DSElQX0NIUk9OVEVMOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl9DSFJPTlRFTDsJLyogRGVwcmVjYXRlZCAqLworCQkJCWl2aWRlby0+dmJmbGFnczIgfD0gVkIyX0NIUk9OVEVMOworCQkJCWJyZWFrOworCQkJICAgY2FzZSBTSVNfRVhURVJOQUxfQ0hJUF9MVkRTX0NIUk9OVEVMOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSAoVkJfTFZEUyB8IFZCX0NIUk9OVEVMKTsJLyogRGVwcmVjYXRlZCAqLworCQkJCWl2aWRlby0+dmJmbGFnczIgfD0gKFZCMl9MVkRTIHwgVkIyX0NIUk9OVEVMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpIGl2aWRlby0+Y2hyb250ZWx0eXBlID0gMTsKKyNlbmRpZgorCQl9IGVsc2UgaWYoaXZpZGVvLT5jaGlwIDwgU0lTXzY2MSkgeworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJCQlzd2l0Y2ggKHJlZykgeworCQkJICAgY2FzZSBTSVMzMTBfRVhURVJOQUxfQ0hJUF9MVkRTOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl9MVkRTOwkvKiBEZXByZWNhdGVkICovCisJCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfTFZEUzsKKwkJCQlicmVhazsKKwkJCSAgIGNhc2UgU0lTMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTDoKKwkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IChWQjJfTFZEUyB8IFZCMl9DSFJPTlRFTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX0NIUk9OVEVMKSBpdmlkZW8tPmNocm9udGVsdHlwZSA9IDI7CisjZW5kaWYKKwkJfSBlbHNlIGlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDM4LCByZWcpOworCQkJcmVnID4+PSA1OworCQkJc3dpdGNoKHJlZykgeworCQkJICAgY2FzZSAweDAyOgorCQkJCWl2aWRlby0+dmJmbGFncyB8PSBWQl9MVkRTOwkvKiBEZXByZWNhdGVkICovCisJCQkJaXZpZGVvLT52YmZsYWdzMiB8PSBWQjJfTFZEUzsKKwkJCQlicmVhazsKKwkJCSAgIGNhc2UgMHgwMzoKKwkJCQlpdmlkZW8tPnZiZmxhZ3MgfD0gKFZCX0xWRFMgfCBWQl9DSFJPTlRFTCk7CS8qIERlcHJlY2F0ZWQgKi8KKwkJCQlpdmlkZW8tPnZiZmxhZ3MyIHw9IChWQjJfTFZEUyB8IFZCMl9DSFJPTlRFTCk7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlIDB4MDQ6CisJCQkJaXZpZGVvLT52YmZsYWdzIHw9IChWQl9MVkRTIHwgVkJfQ09ORVhBTlQpOwkvKiBEZXByZWNhdGVkICovCisJCQkJaXZpZGVvLT52YmZsYWdzMiB8PSAoVkIyX0xWRFMgfCBWQjJfQ09ORVhBTlQpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgaXZpZGVvLT5jaHJvbnRlbHR5cGUgPSAyOworI2VuZGlmCisJCX0KKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9MVkRTKSB7CisJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIExWRFMgdHJhbnNtaXR0ZXJcbiIsIHN0ZHN0cik7CisJCX0KKwkJaWYoKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfVFJVTVBJT04pKSB7CisJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIFRydW1waW9uIFp1cmFjIExDRCBzY2FsZXJcbiIsIHN0ZHN0cik7CisJCX0KKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgeworCQkgICBwcmludGsoS0VSTl9JTkZPICIlcyBDaHJvbnRlbCBUViBlbmNvZGVyXG4iLCBzdGRzdHIpOworCQl9CisJCWlmKChpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ09ORVhBTlQpKSB7CisJCSAgIHByaW50ayhLRVJOX0lORk8gIiVzIENvbmV4YW50IGV4dGVybmFsIGRldmljZVxuIiwgc3Rkc3RyKTsKKwkJfQorCX0KKworCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTQlJJREdFKSB7CisJCVNpU19TZW5zZUxDRChpdmlkZW8pOworCQlTaVNfU2Vuc2UzMHgoaXZpZGVvKTsKKwl9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgeworCQlTaVNfU2Vuc2VDaChpdmlkZW8pOworCX0KK30KKworLyogLS0tLS0tLS0tLSBFbmdpbmUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitzaXNmYl9lbmdpbmVfaW5pdChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3sKKworCS8qIEluaXRpYWxpemUgY29tbWFuZCBxdWV1ZSAod2UgdXNlIE1NSU8gb25seSkgKi8KKworCS8qIEJFRk9SRSBUSElTIElTIENBTExFRCwgVEhFIEVOR0lORVMgKk1VU1QqIEJFIFNZTkMnRUQgKi8KKworCWl2aWRlby0+Y2FwcyAmPSB+KFRVUkJPX1FVRVVFX0NBUCAgICB8CisJCQkgIE1NSU9fQ01EX1FVRVVFX0NBUCB8CisJCQkgIFZNX0NNRF9RVUVVRV9DQVAgICB8CisJCQkgIEFHUF9DTURfUVVFVUVfQ0FQKTsKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCXUzMiB0cXVldWVfcG9zOworCQl1OCB0cV9zdGF0ZTsKKworCQl0cXVldWVfcG9zID0gKGl2aWRlby0+dmlkZW9fc2l6ZSAtIGl2aWRlby0+Y21kUXVldWVTaXplKSAvICg2NCAqIDEwMjQpOworCisJCWluU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfU0VULCB0cV9zdGF0ZSk7CisJCXRxX3N0YXRlIHw9IDB4ZjA7CisJCXRxX3N0YXRlICY9IDB4ZmM7CisJCXRxX3N0YXRlIHw9ICh1OCkodHF1ZXVlX3BvcyA+PiA4KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfU0VULCB0cV9zdGF0ZSk7CisKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfQURSLCAodTgpKHRxdWV1ZV9wb3MgJiAweGZmKSk7CisKKwkJaXZpZGVvLT5jYXBzIHw9IFRVUkJPX1FVRVVFX0NBUDsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisJCXUzMiB0ZW1wcSA9IDAsIHRlbXBsOworCQl1OCAgdGVtcDsKKworCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB7CisJCQlzd2l0Y2goaXZpZGVvLT5jbWRRdWV1ZVNpemUpIHsKKwkJCWNhc2UgKDY0ICogMTAyNCk6CisJCQkJdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV9aN182NGs7CisJCQkJYnJlYWs7CisJCQljYXNlICgxMjggKiAxMDI0KToKKwkJCWRlZmF1bHQ6CisJCQkJdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV9aN18xMjhrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoKGl2aWRlby0+Y21kUXVldWVTaXplKSB7CisJCQljYXNlICg0ICogMTAyNCAqIDEwMjQpOgorCQkJCXRlbXAgPSBTSVNfQ01EX1FVRVVFX1NJWkVfNE07CisJCQkJYnJlYWs7CisJCQljYXNlICgyICogMTAyNCAqIDEwMjQpOgorCQkJCXRlbXAgPSBTSVNfQ01EX1FVRVVFX1NJWkVfMk07CisJCQkJYnJlYWs7CisJCQljYXNlICgxICogMTAyNCAqIDEwMjQpOgorCQkJCXRlbXAgPSBTSVNfQ01EX1FVRVVFX1NJWkVfMU07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJY2FzZSAoNTEyICogMTAyNCk6CisJCQkJdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV81MTJrOworCQkJfQorCQl9CisKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1RIUkVTSE9MRCwgQ09NTUFORF9RVUVVRV9USFJFU0hPTEQpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfQ01EUVVFVUVfU0VULCBTSVNfQ01EX1FVRVVFX1JFU0VUKTsKKworCQlpZigoaXZpZGVvLT5jaGlwID49IFhHSV80MCkgJiYgaXZpZGVvLT5tb2RlY2hhbmdlZCkgeworCQkJLyogTXVzdCBkaXNhYmxlIGR1YWwgcGlwZSBvbiBYR0lfNDAuIENhbid0IGRvCisJCQkgKiB0aGlzIGluIE1NSU8gbW9kZSwgYmVjYXVzZSBpdCByZXF1aXJlcworCQkJICogc2V0dGluZy9jbGVhcmluZyBhIGJpdCBpbiB0aGUgTU1JTyBmaXJlIHRyaWdnZXIKKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQlpZighKCh0ZW1wbCA9IE1NSU9fSU4zMihpdmlkZW8tPm1taW9fdmJhc2UsIDB4ODI0MCkpICYgKDEgPDwgMTApKSkgeworCisJCQkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfV1JJVEVfUFRSLCAwKTsKKworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19DTURRVUVVRV9TRVQsICh0ZW1wIHwgU0lTX1ZSQU1fQ01EUVVFVUVfRU5BQkxFKSk7CisKKwkJCQl0ZW1wcSA9IE1NSU9fSU4zMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfUkVBRF9QVFIpOworCQkJCU1NSU9fT1VUMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBRX1dSSVRFX1BUUiwgdGVtcHEpOworCisJCQkJdGVtcHEgPSAodTMyKShpdmlkZW8tPnZpZGVvX3NpemUgLSBpdmlkZW8tPmNtZFF1ZXVlU2l6ZSk7CisJCQkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfQkFTRV9BRERSLCB0ZW1wcSk7CisKKwkJCQl3cml0ZWwoMHgxNjgwMDAwMCArIDB4ODI0MCwgaXZpZGVvLT52aWRlb192YmFzZSArIHRlbXBxKTsKKwkJCQl3cml0ZWwodGVtcGwgfCAoMSA8PCAxMCksIGl2aWRlby0+dmlkZW9fdmJhc2UgKyB0ZW1wcSArIDQpOworCQkJCXdyaXRlbCgweDE2OEYwMDAwLCBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgdGVtcHEgKyA4KTsKKwkJCQl3cml0ZWwoMHgxNjhGMDAwMCwgaXZpZGVvLT52aWRlb192YmFzZSArIHRlbXBxICsgMTIpOworCisJCQkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIFFfV1JJVEVfUFRSLCAodGVtcHEgKyAxNikpOworCisJCQkJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CisKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfQ01EUVVFVUVfU0VULCBTSVNfQ01EX1FVRVVFX1JFU0VUKTsKKworCQkJfQorCQl9CisKKwkJdGVtcHEgPSBNTUlPX0lOMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBNTUlPX1FVRVVFX1JFQURQT1JUKTsKKwkJTU1JT19PVVQzMihpdmlkZW8tPm1taW9fdmJhc2UsIE1NSU9fUVVFVUVfV1JJVEVQT1JULCB0ZW1wcSk7CisKKwkJdGVtcCB8PSAoU0lTX01NSU9fQ01EX0VOQUJMRSB8IFNJU19DTURfQVVUT19DT1JSKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1NFVCwgdGVtcCk7CisKKwkJdGVtcHEgPSAodTMyKShpdmlkZW8tPnZpZGVvX3NpemUgLSBpdmlkZW8tPmNtZFF1ZXVlU2l6ZSk7CisJCU1NSU9fT1VUMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBNTUlPX1FVRVVFX1BIWUJBU0UsIHRlbXBxKTsKKworCQlpdmlkZW8tPmNhcHMgfD0gTU1JT19DTURfUVVFVUVfQ0FQOworCX0KKyNlbmRpZgorCisJaXZpZGVvLT5lbmdpbmVvayA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfZGV0ZWN0X2xjZF90eXBlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCXU4IHJlZzsKKwlpbnQgaTsKKworCWluU0lTSURYUkVHKFNJU0NSLCAweDM2LCByZWcpOworCXJlZyAmPSAweDBmOworCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQlpdmlkZW8tPkNSVDJMQ0RUeXBlID0gc2lzMzAwcGFuZWx0eXBlW3JlZ107CisJfSBlbHNlIGlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCWl2aWRlby0+Q1JUMkxDRFR5cGUgPSBzaXM2NjFwYW5lbHR5cGVbcmVnXTsKKwl9IGVsc2UgeworCQlpdmlkZW8tPkNSVDJMQ0RUeXBlID0gc2lzMzEwcGFuZWx0eXBlW3JlZ107CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gU0lTXzU1MCkgJiYgKHNpc2ZiX2ZzdG4pKSB7CisJCQlpZigoaXZpZGVvLT5DUlQyTENEVHlwZSAhPSBMQ0RfMzIweDI0MF8yKSAmJgorCQkJICAgKGl2aWRlby0+Q1JUMkxDRFR5cGUgIT0gTENEXzMyMHgyNDBfMykpIHsKKwkJCQlpdmlkZW8tPkNSVDJMQ0RUeXBlID0gTENEXzMyMHgyNDA7CisJCQl9CisJCX0KKwl9CisKKwlpZihpdmlkZW8tPkNSVDJMQ0RUeXBlID09IExDRF9VTktOT1dOKSB7CisJCS8qIEZvciBicm9rZW4gQklPU2VzOiBBc3N1bWUgMTAyNHg3NjgsIFJHQjE4ICovCisJCWl2aWRlby0+Q1JUMkxDRFR5cGUgPSBMQ0RfMTAyNHg3Njg7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwweDM2LDB4ZjAsMHgwMik7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwweDM3LDB4ZWUsMHgwMSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSW52YWxpZCBwYW5lbCBJRCAoJTAyeCksIGFzc3VtaW5nIDEwMjR4NzY4LCBSR0IxOFxuIiwgcmVnKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBTSVNfTENEX05VTUJFUjsgaSsrKSB7CisJCWlmKGl2aWRlby0+Q1JUMkxDRFR5cGUgPT0gc2lzX2xjZF9kYXRhW2ldLmxjZHR5cGUpIHsKKwkJCWl2aWRlby0+bGNkeHJlcyA9IHNpc19sY2RfZGF0YVtpXS54cmVzOworCQkJaXZpZGVvLT5sY2R5cmVzID0gc2lzX2xjZF9kYXRhW2ldLnlyZXM7CisJCQlpdmlkZW8tPmxjZGRlZm1vZGVpZHggPSBzaXNfbGNkX2RhdGFbaV0uZGVmYXVsdF9tb2RlX2lkeDsKKwkJCWJyZWFrOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKKwlpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfQkFSQ08xMzY2KSB7CisJCWl2aWRlby0+bGNkeHJlcyA9IDEzNjA7IGl2aWRlby0+bGNkeXJlcyA9IDEwMjQ7CisJCWl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IERFRkFVTFRfTU9ERV8xMzYwOworCX0gZWxzZSBpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpIHsKKwkJaXZpZGVvLT5sY2R4cmVzID0gIDg0ODsgaXZpZGVvLT5sY2R5cmVzID0gIDQ4MDsKKwkJaXZpZGVvLT5sY2RkZWZtb2RlaWR4ID0gREVGQVVMVF9NT0RFXzg0ODsKKwl9IGVsc2UgaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgPT0gQ1VUX1BBTkVMODU2KSB7CisJCWl2aWRlby0+bGNkeHJlcyA9ICA4NTY7IGl2aWRlby0+bGNkeXJlcyA9ICA0ODA7CisJCWl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IERFRkFVTFRfTU9ERV84NTY7CisJfQorI2VuZGlmCisKKwlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IERldGVjdGVkICVkeCVkIGZsYXQgcGFuZWxcbiIsCisJCQlpdmlkZW8tPmxjZHhyZXMsIGl2aWRlby0+bGNkeXJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfc2F2ZV9wZGNfZW1pKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJLyogU2F2ZSB0aGUgY3VycmVudCBQYW5lbERlbGF5Q29tcGVuc2F0aW9uIGlmIHRoZSBMQ0QgaXMgY3VycmVudGx5IHVzZWQgKi8KKwlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIChWQjJfTFZEUyB8IFZCMl8zMHhCREgpKSB7CisJCQlpbnQgdG1wOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsMHgzMCx0bXApOworCQkJaWYodG1wICYgMHgyMCkgeworCQkJCS8qIEN1cnJlbnRseSBvbiBMQ0Q/IElmIHllcywgcmVhZCBjdXJyZW50IHBkYyAqLworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQxLDB4MTMsaXZpZGVvLT5kZXRlY3RlZHBkYyk7CisJCQkJaXZpZGVvLT5kZXRlY3RlZHBkYyAmPSAweDNjOworCQkJCWlmKGl2aWRlby0+U2lTX1ByLlBEQyA9PSAtMSkgeworCQkJCQkvKiBMZXQgb3B0aW9uIG92ZXJyaWRlIGRldGVjdGlvbiAqLworCQkJCQlpdmlkZW8tPlNpU19Qci5QREMgPSBpdmlkZW8tPmRldGVjdGVkcGRjOworCQkJCX0KKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogRGV0ZWN0ZWQgTENEIFBEQyAweCUwMnhcbiIsCisJCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGMpOworCQkJfQorCQkJaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYKKwkJCSAgIChpdmlkZW8tPlNpU19Qci5QREMgIT0gaXZpZGVvLT5kZXRlY3RlZHBkYykpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQyAweCUwMnhcbiIsCisJCQkJCWl2aWRlby0+U2lTX1ByLlBEQyk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7CisKKwkJLyogVHJ5IHRvIGZpbmQgYWJvdXQgTENEQSAqLworCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0xDREFCUklER0UpIHsKKwkJCWludCB0bXA7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMSwweDEzLHRtcCk7CisJCQlpZih0bXAgJiAweDA0KSB7CisJCQkJaXZpZGVvLT5TaVNfUHIuU2lTX1VzZUxDREEgPSBUUlVFOworCQkJCWl2aWRlby0+ZGV0ZWN0ZWRsY2RhID0gMHgwMzsKKwkJCX0KKwkJfQorCisJCS8qIFNhdmUgUERDICovCisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTTFZEU0JSSURHRSkgeworCQkJaW50IHRtcDsKKwkJCWluU0lTSURYUkVHKFNJU0NSLDB4MzAsdG1wKTsKKwkJCWlmKCh0bXAgJiAweDIwKSB8fCAoaXZpZGVvLT5kZXRlY3RlZGxjZGEgIT0gMHhmZikpIHsKKwkJCQkvKiBDdXJyZW50bHkgb24gTENEPyBJZiB5ZXMsIHJlYWQgY3VycmVudCBwZGMgKi8KKwkJCQl1OCBwZGM7CisJCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgyRCxwZGMpOworCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGMgID0gKHBkYyAmIDB4MGYpIDw8IDE7CisJCQkJaXZpZGVvLT5kZXRlY3RlZHBkY2EgPSAocGRjICYgMHhmMCkgPj4gMzsKKwkJCQlpblNJU0lEWFJFRyhTSVNQQVJUMSwweDM1LHBkYyk7CisJCQkJaXZpZGVvLT5kZXRlY3RlZHBkYyB8PSAoKHBkYyA+PiA3KSAmIDB4MDEpOworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQxLDB4MjAscGRjKTsKKwkJCQlpdmlkZW8tPmRldGVjdGVkcGRjYSB8PSAoKHBkYyA+PiA2KSAmIDB4MDEpOworCQkJCWlmKGl2aWRlby0+bmV3cm9tKSB7CisJCQkJCS8qIE5ldyBST00gaW52YWxpZGF0ZXMgb3RoZXIgUERDIHJlc3AuICovCisJCQkJCWlmKGl2aWRlby0+ZGV0ZWN0ZWRsY2RhICE9IDB4ZmYpIHsKKwkJCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGMgPSAweGZmOworCQkJCQl9IGVsc2UgeworCQkJCQkJaXZpZGVvLT5kZXRlY3RlZHBkY2EgPSAweGZmOworCQkJCQl9CisJCQkJfQorCQkJCWlmKGl2aWRlby0+U2lTX1ByLlBEQyA9PSAtMSkgeworCQkJCQlpZihpdmlkZW8tPmRldGVjdGVkcGRjICE9IDB4ZmYpIHsKKwkJCQkJCWl2aWRlby0+U2lTX1ByLlBEQyA9IGl2aWRlby0+ZGV0ZWN0ZWRwZGM7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYoaXZpZGVvLT5TaVNfUHIuUERDQSA9PSAtMSkgeworCQkJCQlpZihpdmlkZW8tPmRldGVjdGVkcGRjYSAhPSAweGZmKSB7CisJCQkJCQlpdmlkZW8tPlNpU19Qci5QRENBID0gaXZpZGVvLT5kZXRlY3RlZHBkY2E7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYoaXZpZGVvLT5kZXRlY3RlZHBkYyAhPSAweGZmKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJCSJzaXNmYjogRGV0ZWN0ZWQgTENEIFBEQyAweCUwMnggKGZvciBMQ0Q9Q1JUMilcbiIsCisJCQkJCQlpdmlkZW8tPmRldGVjdGVkcGRjKTsKKwkJCQl9CisJCQkJaWYoaXZpZGVvLT5kZXRlY3RlZHBkY2EgIT0gMHhmZikgeworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCQkic2lzZmI6IERldGVjdGVkIExDRCBQREMxIDB4JTAyeCAoZm9yIExDRD1DUlQxKVxuIiwKKwkJCQkJCWl2aWRlby0+ZGV0ZWN0ZWRwZGNhKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNhdmUgRU1JICovCisJCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0VNSUJSSURHRSkgeworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzAsaXZpZGVvLT5TaVNfUHIuRU1JXzMwKTsKKwkJCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwweDMxLGl2aWRlby0+U2lTX1ByLkVNSV8zMSk7CisJCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgzMixpdmlkZW8tPlNpU19Qci5FTUlfMzIpOworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzMsaXZpZGVvLT5TaVNfUHIuRU1JXzMzKTsKKwkJCQlpdmlkZW8tPlNpU19Qci5IYXZlRU1JID0gVFJVRTsKKwkJCQlpZigodG1wICYgMHgyMCkgfHwgKGl2aWRlby0+ZGV0ZWN0ZWRsY2RhICE9IDB4ZmYpKSB7CisJCQkJCWl2aWRlby0+U2lTX1ByLkhhdmVFTUlMQ0QgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIExldCB1c2VyIG92ZXJyaWRlIGRldGVjdGVkIFBEQ3MgKGFsbCBicmlkZ2VzKSAqLworCQlpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyXzMweEJMVikgeworCQkJaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYKKwkJCSAgIChpdmlkZW8tPlNpU19Qci5QREMgIT0gaXZpZGVvLT5kZXRlY3RlZHBkYykpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQyAweCUwMnggKGZvciBMQ0Q9Q1JUMilcbiIsCisJCQkJCWl2aWRlby0+U2lTX1ByLlBEQyk7CisJCQl9CisJCQlpZigoaXZpZGVvLT5TaVNfUHIuUERDQSAhPSAtMSkgJiYKKwkJCSAgIChpdmlkZW8tPlNpU19Qci5QRENBICE9IGl2aWRlby0+ZGV0ZWN0ZWRwZGNhKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBVc2luZyBMQ0QgUERDMSAweCUwMnggKGZvciBMQ0Q9Q1JUMSlcbiIsCisJCQkJIGl2aWRlby0+U2lTX1ByLlBEQ0EpOworCQkJfQorCQl9CisKKwl9CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5IG1hbmFnZXIgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgdTMyIF9fZGV2aW5pdAogc2lzZmJfZ2V0aGVhcHN0YXJ0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogCXUzMiByZXQgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fbWVtICogMTAyNDsKLQl1MzIgbWF4ID0gaXZpZGVvLT52aWRlb19zaXplIC0gaXZpZGVvLT5od2N1cnNvcl9zaXplOworCXUzMiBtYXhvZmZzID0gaXZpZGVvLT52aWRlb19zaXplIC0gaXZpZGVvLT5od2N1cnNvcl9zaXplIC0gaXZpZGVvLT5jbWRRdWV1ZVNpemU7CiAJdTMyIGRlZjsKIAogCS8qIENhbGN1bGF0ZSBoZWFwIHN0YXJ0ID0gZW5kIG9mIG1lbW9yeSBmb3IgY29uc29sZQpAQCAtMzAxNiwzMSArMzIwOCw2MyBAQAogCSAqIENDQ0NDQ0NDREREREREREREREREREREREREREREREREREREREhISEhRUVFRUVFRUVFRCiAJICogQyA9IGNvbnNvbGUsIEQgPSBoZWFwLCBIID0gSFdDdXJzb3IsIFEgPSBjbWQtcXVldWUKIAkgKgorCSAqIE9uIDc2eCBpbiBVTUErTEZCIG1vZGUsIHRoZSBsYXlvdXQgaXMgYXMgZm9sbG93czoKKwkgKiBERERERERERERERENDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0hISEhRUVFRUVFRUVFRUQorCSAqIHdoZXJlIHRoZSBoZWFwIGlzIHRoZSBlbnRpcmUgVU1BIGFyZWEsIGV2ZW50dWFsbHkKKwkgKiBpbnRvIHRoZSBMRkIgYXJlYSBpZiB0aGUgZ2l2ZW4gbWVtIHBhcmFtZXRlciBpcworCSAqIGhpZ2hlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBVTUEgbWVtb3J5LgorCSAqCiAJICogQmFzaWNhbGx5IGdpdmVuIGJ5ICJtZW0iIHBhcmFtZXRlcgogCSAqCiAJICogbWF4aW11bSA9IHZpZGVvc2l6ZSAtIGNtZF9xdWV1ZSAtIGh3Y3Vyc29yCiAJICogICAgICAgICAgIChyZXN1bHRzIGluIGEgaGVhcCBvZiBzaXplIDApCiAJICogZGVmYXVsdCA9IFNpUyAzMDA6IGRlcGVuZHMgb24gdmlkZW9zaXplCi0JICogICAgICAgICAgIFNpUyAzMTUvMzMwOiAzMmsgYmVsb3cgbWF4CisJICogICAgICAgICAgIFNpUyAzMTUvMzMwLzM0MC9YR0k6IDMyayBiZWxvdyBtYXgKIAkgKi8KIAogCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotCSAgIG1heCAtPSBUVVJCT19RVUVVRV9BUkVBX1NJWkU7Ci0JICAgaWYoaXZpZGVvLT52aWRlb19zaXplID4gMHgxMDAwMDAwKSB7Ci0JICAgICAgZGVmID0gMHhjMDAwMDA7Ci0JICAgfSBlbHNlIGlmKGl2aWRlby0+dmlkZW9fc2l6ZSA+IDB4ODAwMDAwKSB7Ci0JICAgICAgZGVmID0gMHg4MDAwMDA7Ci0JICAgfSBlbHNlIHsKLQkgICAgICBkZWYgPSAweDQwMDAwMDsKLQkgICB9CisJCWlmKGl2aWRlby0+dmlkZW9fc2l6ZSA+IDB4MTAwMDAwMCkgeworCQkJZGVmID0gMHhjMDAwMDA7CisJCX0gZWxzZSBpZihpdmlkZW8tPnZpZGVvX3NpemUgPiAweDgwMDAwMCkgeworCQkJZGVmID0gMHg4MDAwMDA7CisJCX0gZWxzZSB7CisJCQlkZWYgPSAweDQwMDAwMDsKKwkJfQorCX0gZWxzZSBpZihpdmlkZW8tPlVNQXNpemUgJiYgaXZpZGVvLT5MRkJzaXplKSB7CisJCXJldCA9IGRlZiA9IDA7CiAJfSBlbHNlIHsKLQkgICBtYXggLT0gQ09NTUFORF9RVUVVRV9BUkVBX1NJWkU7Ci0JICAgZGVmID0gbWF4IC0gMHg4MDAwOworCQlkZWYgPSBtYXhvZmZzIC0gMHg4MDAwOwogCX0KIAotICAgICAgICBpZigoIXJldCkgfHwgKHJldCA+IG1heCkgfHwgKGl2aWRlby0+Y2FyZG51bWJlciAhPSAwKSkgewotCSAgIHJldCA9IGRlZjsKLSAgICAgICAgfQorCS8qIFVzZSBkZWZhdWx0IGZvciBzZWNvbmRhcnkgY2FyZCBmb3Igbm93IChGSVhNRSkgKi8KKwlpZigoIXJldCkgfHwgKHJldCA+IG1heG9mZnMpIHx8IChpdmlkZW8tPmNhcmRudW1iZXIgIT0gMCkpCisJCXJldCA9IGRlZjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgX19kZXZpbml0CitzaXNmYl9nZXRoZWFwc2l6ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKK3sKKwl1MzIgbWF4ID0gaXZpZGVvLT52aWRlb19zaXplIC0gaXZpZGVvLT5od2N1cnNvcl9zaXplIC0gaXZpZGVvLT5jbWRRdWV1ZVNpemU7CisJdTMyIHJldCA9IDA7CisKKwlpZihpdmlkZW8tPlVNQXNpemUgJiYgaXZpZGVvLT5MRkJzaXplKSB7CisJCWlmKCAoIWl2aWRlby0+c2lzZmJfcGFybV9tZW0pCQkJfHwKKwkJICAgICgoaXZpZGVvLT5zaXNmYl9wYXJtX21lbSAqIDEwMjQpID4gbWF4KQl8fAorCQkgICAgKChtYXggLSAoaXZpZGVvLT5zaXNmYl9wYXJtX21lbSAqIDEwMjQpKSA8IGl2aWRlby0+VU1Bc2l6ZSkgKSB7CisJCQlyZXQgPSBpdmlkZW8tPlVNQXNpemU7CisJCQltYXggLT0gaXZpZGVvLT5VTUFzaXplOworCQl9IGVsc2UgeworCQkJcmV0ID0gbWF4IC0gKGl2aWRlby0+c2lzZmJfcGFybV9tZW0gKiAxMDI0KTsKKwkJCW1heCA9IGl2aWRlby0+c2lzZmJfcGFybV9tZW0gKiAxMDI0OworCQl9CisJCWl2aWRlby0+dmlkZW9fb2Zmc2V0ID0gcmV0OworCQlpdmlkZW8tPnNpc2ZiX21lbSA9IG1heDsKKwl9IGVsc2UgeworCQlyZXQgPSBtYXggLSBpdmlkZW8tPmhlYXBzdGFydDsKKwkJaXZpZGVvLT5zaXNmYl9tZW0gPSBpdmlkZW8tPmhlYXBzdGFydDsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzA0OCwxMTkgKzMyNzIsNzUgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBzaXNmYl9oZWFwX2luaXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCiB7Ci0gICAgIFNJU19PSCAqcG9oOworCXN0cnVjdCBTSVNfT0ggKnBvaDsKIAotICAgICBpdmlkZW8tPmhlYXBzdGFydCA9IGl2aWRlby0+c2lzZmJfbWVtID0gc2lzZmJfZ2V0aGVhcHN0YXJ0KGl2aWRlbyk7CisJaXZpZGVvLT52aWRlb19vZmZzZXQgPSAwOworCWlmKGl2aWRlby0+c2lzZmJfcGFybV9tZW0pIHsKKwkJaWYoIChpdmlkZW8tPnNpc2ZiX3Bhcm1fbWVtIDwgKDIgKiAxMDI0ICogMTAyNCkpIHx8CisJCSAgICAoaXZpZGVvLT5zaXNmYl9wYXJtX21lbSA+IGl2aWRlby0+dmlkZW9fc2l6ZSkgKSB7CisJCQlpdmlkZW8tPnNpc2ZiX3Bhcm1fbWVtID0gMDsKKwkJfQorCX0KIAotICAgICBpdmlkZW8tPnNpc2ZiX2hlYXBfc3RhcnQgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgaXZpZGVvLT5oZWFwc3RhcnQ7Ci0gICAgIGl2aWRlby0+c2lzZmJfaGVhcF9lbmQgICA9IGl2aWRlby0+dmlkZW9fdmJhc2UgKyBpdmlkZW8tPnZpZGVvX3NpemU7CisJaXZpZGVvLT5oZWFwc3RhcnQgPSBzaXNmYl9nZXRoZWFwc3RhcnQoaXZpZGVvKTsKKwlpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZSA9IHNpc2ZiX2dldGhlYXBzaXplKGl2aWRlbyk7CiAKLSAgICAgLyogSW5pdGlhbGl6ZSBjb21tYW5kIHF1ZXVlIChXZSB1c2UgTU1JTyBvbmx5KSAqLworCWl2aWRlby0+c2lzZmJfaGVhcF9zdGFydCA9IGl2aWRlby0+dmlkZW9fdmJhc2UgKyBpdmlkZW8tPmhlYXBzdGFydDsKKwlpdmlkZW8tPnNpc2ZiX2hlYXBfZW5kICAgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfc3RhcnQgKyBpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZTsKIAotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0gICAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotICAgICAgICB1MzIgdGVtcHEgPSAwOwotCXU4ICB0ZW1wID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogTWVtb3J5IGhlYXAgc3RhcnRpbmcgYXQgJWRLLCBzaXplICVkS1xuIiwKKwkJKGludCkoaXZpZGVvLT5oZWFwc3RhcnQgLyAxMDI0KSwgKGludCkoaXZpZGVvLT5zaXNmYl9oZWFwX3NpemUgLyAxMDI0KSk7CiAKLSAgICAgICAgaXZpZGVvLT5zaXNmYl9oZWFwX2VuZCAtPSBDT01NQU5EX1FVRVVFX0FSRUFfU0laRTsKKwlpdmlkZW8tPnNpc2ZiX2hlYXAudmluZm8gPSBpdmlkZW87CiAKLQlvdXRTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfQ01EUVVFVUVfVEhSRVNIT0xELCBDT01NQU5EX1FVRVVFX1RIUkVTSE9MRCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1NFVCwgU0lTX0NNRF9RVUVVRV9SRVNFVCk7CisJaXZpZGVvLT5zaXNmYl9oZWFwLnBvaGFfY2hhaW4gPSBOVUxMOworCWl2aWRlby0+c2lzZmJfaGVhcC5wb2hfZnJlZWxpc3QgPSBOVUxMOwogCi0JdGVtcHEgPSBNTUlPX0lOMzIoaXZpZGVvLT5tbWlvX3ZiYXNlLCBNTUlPX1FVRVVFX1JFQURQT1JUKTsKLQlNTUlPX09VVDMyKGl2aWRlby0+bW1pb192YmFzZSwgTU1JT19RVUVVRV9XUklURVBPUlQsIHRlbXBxKTsKKwlwb2ggPSBzaXNmYl9wb2hfbmV3X25vZGUoJml2aWRlby0+c2lzZmJfaGVhcCk7CisJaWYocG9oID09IE5VTEwpCisJCXJldHVybiAxOwogCi0JdGVtcCA9IFNJU19DTURfUVVFVUVfU0laRV81MTJrOwotCXRlbXAgfD0gKFNJU19NTUlPX0NNRF9FTkFCTEUgfCBTSVNfQ01EX0FVVE9fQ09SUik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX0NNRFFVRVVFX1NFVCwgdGVtcCk7CisJcG9oLT5wb2hfbmV4dCA9ICZpdmlkZW8tPnNpc2ZiX2hlYXAub2hfZnJlZTsKKwlwb2gtPnBvaF9wcmV2ID0gJml2aWRlby0+c2lzZmJfaGVhcC5vaF9mcmVlOworCXBvaC0+c2l6ZSA9IGl2aWRlby0+c2lzZmJfaGVhcF9zaXplOworCXBvaC0+b2Zmc2V0ID0gaXZpZGVvLT5oZWFwc3RhcnQ7CiAKLQl0ZW1wcSA9ICh1MzIpKGl2aWRlby0+dmlkZW9fc2l6ZSAtIENPTU1BTkRfUVVFVUVfQVJFQV9TSVpFKTsKLQlNTUlPX09VVDMyKGl2aWRlby0+bW1pb192YmFzZSwgTU1JT19RVUVVRV9QSFlCQVNFLCB0ZW1wcSk7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm9oX2ZyZWUucG9oX25leHQgPSBwb2g7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm9oX2ZyZWUucG9oX3ByZXYgPSBwb2g7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm9oX2ZyZWUuc2l6ZSA9IDA7CisJaXZpZGVvLT5zaXNmYl9oZWFwLm1heF9mcmVlc2l6ZSA9IHBvaC0+c2l6ZTsKIAotCWl2aWRlby0+Y2FwcyB8PSBNTUlPX0NNRF9RVUVVRV9DQVA7Ci0gICAgIH0KLSNlbmRpZgorCWl2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkLnBvaF9uZXh0ID0gJml2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkOworCWl2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkLnBvaF9wcmV2ID0gJml2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkOworCWl2aWRlby0+c2lzZmJfaGVhcC5vaF91c2VkLnNpemUgPSBTRU5USU5FTDsKIAotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0gICAgIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgewotICAgICAJdW5zaWduZWQgbG9uZyB0cXVldWVfcG9zOwotCXU4IHRxX3N0YXRlOworCWlmKGl2aWRlby0+Y2FyZG51bWJlciA9PSAwKSB7CisJCS8qIEZvciB0aGUgZmlyc3QgY2FyZCwgbWFrZSB0aGlzIGhlYXAgdGhlICJnbG9iYWwiIG9uZQorCQkgKiBmb3Igb2xkIERSTSAod2hpY2ggY291bGQgaGFuZGxlIG9ubHkgb25lIGNhcmQpCisJCSAqLworCQlzaXNmYl9oZWFwID0gJml2aWRlby0+c2lzZmJfaGVhcDsKKwl9CiAKLQlpdmlkZW8tPnNpc2ZiX2hlYXBfZW5kIC09IFRVUkJPX1FVRVVFX0FSRUFfU0laRTsKLQotCXRxdWV1ZV9wb3MgPSAoaXZpZGVvLT52aWRlb19zaXplIC0gVFVSQk9fUVVFVUVfQVJFQV9TSVpFKSAvICg2NCAqIDEwMjQpOwotCi0JaW5TSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfVFVSQk9RVUVVRV9TRVQsIHRxX3N0YXRlKTsKLQl0cV9zdGF0ZSB8PSAweGYwOwotCXRxX3N0YXRlICY9IDB4ZmM7Ci0JdHFfc3RhdGUgfD0gKHU4KSh0cXVldWVfcG9zID4+IDgpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19UVVJCT1FVRVVFX1NFVCwgdHFfc3RhdGUpOwotCi0Jb3V0U0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1RVUkJPUVVFVUVfQURSLCAodTgpKHRxdWV1ZV9wb3MgJiAweGZmKSk7Ci0KLQlpdmlkZW8tPmNhcHMgfD0gVFVSQk9fUVVFVUVfQ0FQOwotICAgICB9Ci0jZW5kaWYKLQotICAgICAvKiBSZXNlcnZlIG1lbW9yeSBmb3IgdGhlIEhXQ3Vyc29yICovCi0gICAgIGl2aWRlby0+c2lzZmJfaGVhcF9lbmQgLT0gaXZpZGVvLT5od2N1cnNvcl9zaXplOwotICAgICBpdmlkZW8tPmh3Y3Vyc29yX3ZiYXNlID0gaXZpZGVvLT5zaXNmYl9oZWFwX2VuZDsKLSAgICAgaXZpZGVvLT5jYXBzIHw9IEhXX0NVUlNPUl9DQVA7Ci0KLSAgICAgaXZpZGVvLT5zaXNmYl9oZWFwX3NpemUgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfZW5kIC0gaXZpZGVvLT5zaXNmYl9oZWFwX3N0YXJ0OwotCi0gICAgIGlmKGl2aWRlby0+Y2FyZG51bWJlciA9PSAwKSB7Ci0KLSAgICAgCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBNZW1vcnkgaGVhcCBzdGFydGluZyBhdCAlZEssIHNpemUgJWRLXG4iLAotICAgICAJCShpbnQpKGl2aWRlby0+aGVhcHN0YXJ0IC8gMTAyNCksIChpbnQpKGl2aWRlby0+c2lzZmJfaGVhcF9zaXplIC8gMTAyNCkpOwotCi0Jc2lzZmJfaGVhcC52aW5mbyA9IGl2aWRlbzsKLQotICAgICAJc2lzZmJfaGVhcC5wb2hhX2NoYWluID0gTlVMTDsKLSAgICAgCXNpc2ZiX2hlYXAucG9oX2ZyZWVsaXN0ID0gTlVMTDsKLQotICAgICAJcG9oID0gc2lzZmJfcG9oX25ld19ub2RlKCk7Ci0gICAgIAlpZihwb2ggPT0gTlVMTCkgcmV0dXJuIDE7Ci0KLSAgICAgCXBvaC0+cG9oX25leHQgPSAmc2lzZmJfaGVhcC5vaF9mcmVlOwotICAgICAJcG9oLT5wb2hfcHJldiA9ICZzaXNmYl9oZWFwLm9oX2ZyZWU7Ci0gICAgIAlwb2gtPnNpemUgPSBpdmlkZW8tPnNpc2ZiX2hlYXBfc2l6ZTsKLSAgICAgCXBvaC0+b2Zmc2V0ID0gaXZpZGVvLT5oZWFwc3RhcnQ7Ci0KLSAgICAgCXNpc2ZiX2hlYXAub2hfZnJlZS5wb2hfbmV4dCA9IHBvaDsKLSAgICAgCXNpc2ZiX2hlYXAub2hfZnJlZS5wb2hfcHJldiA9IHBvaDsKLSAgICAgCXNpc2ZiX2hlYXAub2hfZnJlZS5zaXplID0gMDsKLSAgICAgCXNpc2ZiX2hlYXAubWF4X2ZyZWVzaXplID0gcG9oLT5zaXplOwotCi0gICAgIAlzaXNmYl9oZWFwLm9oX3VzZWQucG9oX25leHQgPSAmc2lzZmJfaGVhcC5vaF91c2VkOwotICAgICAJc2lzZmJfaGVhcC5vaF91c2VkLnBvaF9wcmV2ID0gJnNpc2ZiX2hlYXAub2hfdXNlZDsKLSAgICAgCXNpc2ZiX2hlYXAub2hfdXNlZC5zaXplID0gU0VOVElORUw7Ci0KLSAgICAgfSBlbHNlIHsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJTa2lwcGVkIGhlYXAgaW5pdGlhbGl6YXRpb24gZm9yIHNlY29uZGFyeSBjYXJkc1xuIik7Ci0KLSAgICAgfQotCi0gICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgU0lTX09IICoKLXNpc2ZiX3BvaF9uZXdfbm9kZSh2b2lkKQorc3RhdGljIHN0cnVjdCBTSVNfT0ggKgorc2lzZmJfcG9oX25ld19ub2RlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCkKIHsKLQlpbnQgICAgICAgICAgIGk7Ci0JdW5zaWduZWQgbG9uZyBjT2hzOwotCVNJU19PSEFMTE9DICAgKnBvaGE7Ci0JU0lTX09IICAgICAgICAqcG9oOworCXN0cnVjdCBTSVNfT0hBTExPQwkqcG9oYTsKKwlzdHJ1Y3QgU0lTX09ICQkqcG9oOworCXVuc2lnbmVkIGxvbmcJCWNPaHM7CisJaW50CQkJaTsKIAotCWlmKHNpc2ZiX2hlYXAucG9oX2ZyZWVsaXN0ID09IE5VTEwpIHsKKwlpZihtZW1oZWFwLT5wb2hfZnJlZWxpc3QgPT0gTlVMTCkgewogCQlwb2hhID0ga21hbGxvYyhTSVNfT0hfQUxMT0NfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmKCFwb2hhKSByZXR1cm4gTlVMTDsKKwkJaWYoIXBvaGEpCisJCQlyZXR1cm4gTlVMTDsKIAotCQlwb2hhLT5wb2hhX25leHQgPSBzaXNmYl9oZWFwLnBvaGFfY2hhaW47Ci0JCXNpc2ZiX2hlYXAucG9oYV9jaGFpbiA9IHBvaGE7CisJCXBvaGEtPnBvaGFfbmV4dCA9IG1lbWhlYXAtPnBvaGFfY2hhaW47CisJCW1lbWhlYXAtPnBvaGFfY2hhaW4gPSBwb2hhOwogCi0JCWNPaHMgPSAoU0lTX09IX0FMTE9DX1NJWkUgLSBzaXplb2YoU0lTX09IQUxMT0MpKSAvIHNpemVvZihTSVNfT0gpICsgMTsKKwkJY09ocyA9IChTSVNfT0hfQUxMT0NfU0laRSAtIHNpemVvZihzdHJ1Y3QgU0lTX09IQUxMT0MpKSAvIHNpemVvZihzdHJ1Y3QgU0lTX09IKSArIDE7CiAKIAkJcG9oID0gJnBvaGEtPmFvaFswXTsKIAkJZm9yKGkgPSBjT2hzIC0gMTsgaSAhPSAwOyBpLS0pIHsKQEAgLTMxNjksMzIgKzMzNDksMzIgQEAKIAkJfQogCiAJCXBvaC0+cG9oX25leHQgPSBOVUxMOwotCQlzaXNmYl9oZWFwLnBvaF9mcmVlbGlzdCA9ICZwb2hhLT5hb2hbMF07CisJCW1lbWhlYXAtPnBvaF9mcmVlbGlzdCA9ICZwb2hhLT5hb2hbMF07CiAJfQogCi0JcG9oID0gc2lzZmJfaGVhcC5wb2hfZnJlZWxpc3Q7Ci0Jc2lzZmJfaGVhcC5wb2hfZnJlZWxpc3QgPSBwb2gtPnBvaF9uZXh0OworCXBvaCA9IG1lbWhlYXAtPnBvaF9mcmVlbGlzdDsKKwltZW1oZWFwLT5wb2hfZnJlZWxpc3QgPSBwb2gtPnBvaF9uZXh0OwogCi0JcmV0dXJuIChwb2gpOworCXJldHVybiBwb2g7CiB9CiAKLXN0YXRpYyBTSVNfT0ggKgotc2lzZmJfcG9oX2FsbG9jYXRlKHUzMiBzaXplKQorc3RhdGljIHN0cnVjdCBTSVNfT0ggKgorc2lzZmJfcG9oX2FsbG9jYXRlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgdTMyIHNpemUpCiB7Ci0JU0lTX09IICpwb2hUaGlzOwotCVNJU19PSCAqcG9oUm9vdDsKLQlpbnQgICAgIGJBbGxvY2F0ZWQgPSAwOworCXN0cnVjdCBTSVNfT0gJKnBvaFRoaXM7CisJc3RydWN0IFNJU19PSAkqcG9oUm9vdDsKKwlpbnQJCWJBbGxvY2F0ZWQgPSAwOwogCi0JaWYoc2l6ZSA+IHNpc2ZiX2hlYXAubWF4X2ZyZWVzaXplKSB7CisJaWYoc2l6ZSA+IG1lbWhlYXAtPm1heF9mcmVlc2l6ZSkgewogCQlEUFJJTlRLKCJzaXNmYjogQ2FuJ3QgYWxsb2NhdGUgJWRrIHZpZGVvIG1lbW9yeVxuIiwKIAkJCSh1bnNpZ25lZCBpbnQpIHNpemUgLyAxMDI0KTsKLQkJcmV0dXJuIChOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcG9oVGhpcyA9IHNpc2ZiX2hlYXAub2hfZnJlZS5wb2hfbmV4dDsKKwlwb2hUaGlzID0gbWVtaGVhcC0+b2hfZnJlZS5wb2hfbmV4dDsKIAotCXdoaWxlKHBvaFRoaXMgIT0gJnNpc2ZiX2hlYXAub2hfZnJlZSkgewotCQlpZiAoc2l6ZSA8PSBwb2hUaGlzLT5zaXplKSB7CisJd2hpbGUocG9oVGhpcyAhPSAmbWVtaGVhcC0+b2hfZnJlZSkgeworCQlpZihzaXplIDw9IHBvaFRoaXMtPnNpemUpIHsKIAkJCWJBbGxvY2F0ZWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMyMDQsMTggKzMzODQsMTYgQEAKIAlpZighYkFsbG9jYXRlZCkgewogCQlEUFJJTlRLKCJzaXNmYjogQ2FuJ3QgYWxsb2NhdGUgJWRrIHZpZGVvIG1lbW9yeVxuIiwKIAkJCSh1bnNpZ25lZCBpbnQpIHNpemUgLyAxMDI0KTsKLQkJcmV0dXJuIChOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYoc2l6ZSA9PSBwb2hUaGlzLT5zaXplKSB7CiAJCXBvaFJvb3QgPSBwb2hUaGlzOwogCQlzaXNmYl9kZWxldGVfbm9kZShwb2hUaGlzKTsKIAl9IGVsc2UgewotCQlwb2hSb290ID0gc2lzZmJfcG9oX25ld19ub2RlKCk7Ci0KLQkJaWYocG9oUm9vdCA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQl9CisJCXBvaFJvb3QgPSBzaXNmYl9wb2hfbmV3X25vZGUobWVtaGVhcCk7CisJCWlmKHBvaFJvb3QgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOwogCiAJCXBvaFJvb3QtPm9mZnNldCA9IHBvaFRoaXMtPm9mZnNldDsKIAkJcG9oUm9vdC0+c2l6ZSA9IHNpemU7CkBAIC0zMjI0LDMzICszNDAyLDI1IEBACiAJCXBvaFRoaXMtPnNpemUgLT0gc2l6ZTsKIAl9CiAKLQlzaXNmYl9oZWFwLm1heF9mcmVlc2l6ZSAtPSBzaXplOworCW1lbWhlYXAtPm1heF9mcmVlc2l6ZSAtPSBzaXplOwogCi0JcG9oVGhpcyA9ICZzaXNmYl9oZWFwLm9oX3VzZWQ7CisJcG9oVGhpcyA9ICZtZW1oZWFwLT5vaF91c2VkOwogCXNpc2ZiX2luc2VydF9ub2RlKHBvaFRoaXMsIHBvaFJvb3QpOwogCi0JcmV0dXJuIChwb2hSb290KTsKKwlyZXR1cm4gcG9oUm9vdDsKIH0KIAogc3RhdGljIHZvaWQKLXNpc2ZiX2RlbGV0ZV9ub2RlKFNJU19PSCAqcG9oKQorc2lzZmJfZGVsZXRlX25vZGUoc3RydWN0IFNJU19PSCAqcG9oKQogewotCVNJU19PSCAqcG9oX3ByZXY7Ci0JU0lTX09IICpwb2hfbmV4dDsKLQotCXBvaF9wcmV2ID0gcG9oLT5wb2hfcHJldjsKLQlwb2hfbmV4dCA9IHBvaC0+cG9oX25leHQ7Ci0KLQlwb2hfcHJldi0+cG9oX25leHQgPSBwb2hfbmV4dDsKLQlwb2hfbmV4dC0+cG9oX3ByZXYgPSBwb2hfcHJldjsKKwlwb2gtPnBvaF9wcmV2LT5wb2hfbmV4dCA9IHBvaC0+cG9oX25leHQ7CisJcG9oLT5wb2hfbmV4dC0+cG9oX3ByZXYgPSBwb2gtPnBvaF9wcmV2OwogfQogCiBzdGF0aWMgdm9pZAotc2lzZmJfaW5zZXJ0X25vZGUoU0lTX09IICpwb2hMaXN0LCBTSVNfT0ggKnBvaCkKK3Npc2ZiX2luc2VydF9ub2RlKHN0cnVjdCBTSVNfT0ggKnBvaExpc3QsIHN0cnVjdCBTSVNfT0ggKnBvaCkKIHsKLQlTSVNfT0ggKnBvaFRlbXA7Ci0KLQlwb2hUZW1wID0gcG9oTGlzdC0+cG9oX25leHQ7CisJc3RydWN0IFNJU19PSCAqcG9oVGVtcCA9IHBvaExpc3QtPnBvaF9uZXh0OwogCiAJcG9oTGlzdC0+cG9oX25leHQgPSBwb2g7CiAJcG9oVGVtcC0+cG9oX3ByZXYgPSBwb2g7CkBAIC0zMjU5LDIwICszNDI5LDIwIEBACiAJcG9oLT5wb2hfbmV4dCA9IHBvaFRlbXA7CiB9CiAKLXN0YXRpYyBTSVNfT0ggKgotc2lzZmJfcG9oX2ZyZWUodTMyIGJhc2UpCitzdGF0aWMgc3RydWN0IFNJU19PSCAqCitzaXNmYl9wb2hfZnJlZShzdHJ1Y3QgU0lTX0hFQVAgKm1lbWhlYXAsIHUzMiBiYXNlKQogewotCVNJU19PSCAqcG9oVGhpczsKLQlTSVNfT0ggKnBvaF9mcmVlZDsKLQlTSVNfT0ggKnBvaF9wcmV2OwotCVNJU19PSCAqcG9oX25leHQ7Ci0JdTMyICAgICB1bFVwcGVyOwotCXUzMiAgICAgdWxMb3dlcjsKLQlpbnQgICAgIGZvdW5kTm9kZSA9IDA7CisJc3RydWN0IFNJU19PSCAqcG9oVGhpczsKKwlzdHJ1Y3QgU0lTX09IICpwb2hfZnJlZWQ7CisJc3RydWN0IFNJU19PSCAqcG9oX3ByZXY7CisJc3RydWN0IFNJU19PSCAqcG9oX25leHQ7CisJdTMyICAgIHVsVXBwZXI7CisJdTMyICAgIHVsTG93ZXI7CisJaW50ICAgIGZvdW5kTm9kZSA9IDA7CiAKLQlwb2hfZnJlZWQgPSBzaXNmYl9oZWFwLm9oX3VzZWQucG9oX25leHQ7CisJcG9oX2ZyZWVkID0gbWVtaGVhcC0+b2hfdXNlZC5wb2hfbmV4dDsKIAotCXdoaWxlKHBvaF9mcmVlZCAhPSAmc2lzZmJfaGVhcC5vaF91c2VkKSB7CisJd2hpbGUocG9oX2ZyZWVkICE9ICZtZW1oZWFwLT5vaF91c2VkKSB7CiAJCWlmKHBvaF9mcmVlZC0+b2Zmc2V0ID09IGJhc2UpIHsKIAkJCWZvdW5kTm9kZSA9IDE7CiAJCQlicmVhazsKQEAgLTMyODEsMTcgKzM0NTEsMTggQEAKIAkJcG9oX2ZyZWVkID0gcG9oX2ZyZWVkLT5wb2hfbmV4dDsKIAl9CiAKLQlpZighZm91bmROb2RlKSByZXR1cm4oTlVMTCk7CisJaWYoIWZvdW5kTm9kZSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlzaXNmYl9oZWFwLm1heF9mcmVlc2l6ZSArPSBwb2hfZnJlZWQtPnNpemU7CisJbWVtaGVhcC0+bWF4X2ZyZWVzaXplICs9IHBvaF9mcmVlZC0+c2l6ZTsKIAogCXBvaF9wcmV2ID0gcG9oX25leHQgPSBOVUxMOwogCXVsVXBwZXIgPSBwb2hfZnJlZWQtPm9mZnNldCArIHBvaF9mcmVlZC0+c2l6ZTsKIAl1bExvd2VyID0gcG9oX2ZyZWVkLT5vZmZzZXQ7CiAKLQlwb2hUaGlzID0gc2lzZmJfaGVhcC5vaF9mcmVlLnBvaF9uZXh0OworCXBvaFRoaXMgPSBtZW1oZWFwLT5vaF9mcmVlLnBvaF9uZXh0OwogCi0Jd2hpbGUocG9oVGhpcyAhPSAmc2lzZmJfaGVhcC5vaF9mcmVlKSB7CisJd2hpbGUocG9oVGhpcyAhPSAmbWVtaGVhcC0+b2hfZnJlZSkgewogCQlpZihwb2hUaGlzLT5vZmZzZXQgPT0gdWxVcHBlcikgewogCQkJcG9oX25leHQgPSBwb2hUaGlzOwogCQl9IGVsc2UgaWYoKHBvaFRoaXMtPm9mZnNldCArIHBvaFRoaXMtPnNpemUpID09IHVsTG93ZXIpIHsKQEAgLTMzMDUsNzAgKzM0NzYsODggQEAKIAlpZihwb2hfcHJldiAmJiBwb2hfbmV4dCkgewogCQlwb2hfcHJldi0+c2l6ZSArPSAocG9oX2ZyZWVkLT5zaXplICsgcG9oX25leHQtPnNpemUpOwogCQlzaXNmYl9kZWxldGVfbm9kZShwb2hfbmV4dCk7Ci0JCXNpc2ZiX2ZyZWVfbm9kZShwb2hfZnJlZWQpOwotCQlzaXNmYl9mcmVlX25vZGUocG9oX25leHQpOwotCQlyZXR1cm4ocG9oX3ByZXYpOworCQlzaXNmYl9mcmVlX25vZGUobWVtaGVhcCwgcG9oX2ZyZWVkKTsKKwkJc2lzZmJfZnJlZV9ub2RlKG1lbWhlYXAsIHBvaF9uZXh0KTsKKwkJcmV0dXJuIHBvaF9wcmV2OwogCX0KIAogCWlmKHBvaF9wcmV2KSB7CiAJCXBvaF9wcmV2LT5zaXplICs9IHBvaF9mcmVlZC0+c2l6ZTsKLQkJc2lzZmJfZnJlZV9ub2RlKHBvaF9mcmVlZCk7Ci0JCXJldHVybihwb2hfcHJldik7CisJCXNpc2ZiX2ZyZWVfbm9kZShtZW1oZWFwLCBwb2hfZnJlZWQpOworCQlyZXR1cm4gcG9oX3ByZXY7CiAJfQogCiAJaWYocG9oX25leHQpIHsKIAkJcG9oX25leHQtPnNpemUgKz0gcG9oX2ZyZWVkLT5zaXplOwogCQlwb2hfbmV4dC0+b2Zmc2V0ID0gcG9oX2ZyZWVkLT5vZmZzZXQ7Ci0JCXNpc2ZiX2ZyZWVfbm9kZShwb2hfZnJlZWQpOwotCQlyZXR1cm4ocG9oX25leHQpOworCQlzaXNmYl9mcmVlX25vZGUobWVtaGVhcCwgcG9oX2ZyZWVkKTsKKwkJcmV0dXJuIHBvaF9uZXh0OwogCX0KIAotCXNpc2ZiX2luc2VydF9ub2RlKCZzaXNmYl9oZWFwLm9oX2ZyZWUsIHBvaF9mcmVlZCk7CisJc2lzZmJfaW5zZXJ0X25vZGUoJm1lbWhlYXAtPm9oX2ZyZWUsIHBvaF9mcmVlZCk7CiAKLQlyZXR1cm4ocG9oX2ZyZWVkKTsKKwlyZXR1cm4gcG9oX2ZyZWVkOwogfQogCiBzdGF0aWMgdm9pZAotc2lzZmJfZnJlZV9ub2RlKFNJU19PSCAqcG9oKQorc2lzZmJfZnJlZV9ub2RlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgc3RydWN0IFNJU19PSCAqcG9oKQogewotCWlmKHBvaCA9PSBOVUxMKSByZXR1cm47CisJaWYocG9oID09IE5VTEwpCisJCXJldHVybjsKIAotCXBvaC0+cG9oX25leHQgPSBzaXNmYl9oZWFwLnBvaF9mcmVlbGlzdDsKLQlzaXNmYl9oZWFwLnBvaF9mcmVlbGlzdCA9IHBvaDsKKwlwb2gtPnBvaF9uZXh0ID0gbWVtaGVhcC0+cG9oX2ZyZWVsaXN0OworCW1lbWhlYXAtPnBvaF9mcmVlbGlzdCA9IHBvaDsKK30KKworc3RhdGljIHZvaWQKK3Npc19pbnRfbWFsbG9jKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3Qgc2lzX21lbXJlcSAqcmVxKQoreworCXN0cnVjdCBTSVNfT0ggKnBvaCA9IE5VTEw7CisKKwlpZigoaXZpZGVvKSAmJiAoaXZpZGVvLT5zaXNmYl9pZCA9PSBTSVNGQl9JRCkgJiYgKCFpdmlkZW8tPmhhdmVub2hlYXApKQorCQlwb2ggPSBzaXNmYl9wb2hfYWxsb2NhdGUoJml2aWRlby0+c2lzZmJfaGVhcCwgKHUzMilyZXEtPnNpemUpOworCisJaWYocG9oID09IE5VTEwpIHsKKwkJcmVxLT5vZmZzZXQgPSByZXEtPnNpemUgPSAwOworCQlEUFJJTlRLKCJzaXNmYjogVmlkZW8gUkFNIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQlyZXEtPm9mZnNldCA9IHBvaC0+b2Zmc2V0OworCQlyZXEtPnNpemUgPSBwb2gtPnNpemU7CisJCURQUklOVEsoInNpc2ZiOiBWaWRlbyBSQU0gYWxsb2NhdGlvbiBzdWNjZWVkZWQ6IDB4JWx4XG4iLAorCQkJKHBvaC0+b2Zmc2V0ICsgaXZpZGVvLT52aWRlb192YmFzZSkpOworCX0KIH0KIAogdm9pZAogc2lzX21hbGxvYyhzdHJ1Y3Qgc2lzX21lbXJlcSAqcmVxKQogewotCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gc2lzZmJfaGVhcC52aW5mbzsKLQlTSVNfT0ggKnBvaCA9IE5VTEw7CisJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBzaXNmYl9oZWFwLT52aW5mbzsKIAotCWlmKChpdmlkZW8pICYmICghaXZpZGVvLT5oYXZlbm9oZWFwKSkgewotCSAgIHBvaCA9IHNpc2ZiX3BvaF9hbGxvY2F0ZSgodTMyKXJlcS0+c2l6ZSk7Ci0JfQorCWlmKCZpdmlkZW8tPnNpc2ZiX2hlYXAgPT0gc2lzZmJfaGVhcCkKKwkJc2lzX2ludF9tYWxsb2MoaXZpZGVvLCByZXEpOworCWVsc2UKKwkJcmVxLT5vZmZzZXQgPSByZXEtPnNpemUgPSAwOworfQogCi0JaWYocG9oID09IE5VTEwpIHsKLQkgICByZXEtPm9mZnNldCA9IHJlcS0+c2l6ZSA9IDA7Ci0JICAgRFBSSU5USygic2lzZmI6IFZpZGVvIFJBTSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JfSBlbHNlIHsKLQkgICByZXEtPm9mZnNldCA9IHBvaC0+b2Zmc2V0OwotCSAgIHJlcS0+c2l6ZSA9IHBvaC0+c2l6ZTsKLQkgICBEUFJJTlRLKCJzaXNmYjogVmlkZW8gUkFNIGFsbG9jYXRpb24gc3VjY2VlZGVkOiAweCVseFxuIiwKLQkgICAJICAgIChwb2gtPm9mZnNldCArIGl2aWRlby0+dmlkZW9fdmJhc2UpKTsKLQl9Cit2b2lkCitzaXNfbWFsbG9jX25ldyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNpc19tZW1yZXEgKnJlcSkKK3sKKwlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNpc19pbnRfbWFsbG9jKGl2aWRlbywgcmVxKTsKIH0KIAogLyogc2lzX2ZyZWU6IHUzMiBiZWNhdXNlICJiYXNlIiBpcyBvZmZzZXQgaW5zaWRlIHZpZGVvIHJhbSwgY2FuIG5ldmVyIGJlID40R0IgKi8KIAotdm9pZAotc2lzX2ZyZWUodTMyIGJhc2UpCitzdGF0aWMgdm9pZAorc2lzX2ludF9mcmVlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1MzIgYmFzZSkKIHsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHNpc2ZiX2hlYXAudmluZm87Ci0JU0lTX09IICpwb2g7CisJc3RydWN0IFNJU19PSCAqcG9oOwogCi0JaWYoKCFpdmlkZW8pIHx8IChpdmlkZW8tPmhhdmVub2hlYXApKSByZXR1cm47CisJaWYoKCFpdmlkZW8pIHx8IChpdmlkZW8tPnNpc2ZiX2lkICE9IFNJU0ZCX0lEKSB8fCAoaXZpZGVvLT5oYXZlbm9oZWFwKSkKKwkJcmV0dXJuOwogCi0JcG9oID0gc2lzZmJfcG9oX2ZyZWUoKHUzMiliYXNlKTsKKwlwb2ggPSBzaXNmYl9wb2hfZnJlZSgmaXZpZGVvLT5zaXNmYl9oZWFwLCBiYXNlKTsKIAogCWlmKHBvaCA9PSBOVUxMKSB7CiAJCURQUklOVEsoInNpc2ZiOiBzaXNmYl9wb2hfZnJlZSgpIGZhaWxlZCBhdCBiYXNlIDB4JXhcbiIsCkBAIC0zMzc2LDkgKzM1NjUsNjMgQEAKIAl9CiB9CiAKK3ZvaWQKK3Npc19mcmVlKHUzMiBiYXNlKQoreworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gc2lzZmJfaGVhcC0+dmluZm87CisKKwlzaXNfaW50X2ZyZWUoaXZpZGVvLCBiYXNlKTsKK30KKwordm9pZAorc2lzX2ZyZWVfbmV3KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgYmFzZSkKK3sKKwlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNpc19pbnRfZnJlZShpdmlkZW8sIGJhc2UpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0TW9kZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkCitzaXNmYl9jaGVja19lbmdpbmVfYW5kX3N5bmMoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pCit7CisJdTggY3IzMCwgY3IzMTsKKworCS8qIENoZWNrIGlmIE1NSU8gYW5kIGVuZ2luZXMgYXJlIGVuYWJsZWQsCisJICogYW5kIHN5bmMgaW4gY2FzZSB0aGV5IGFyZS4gQ2FuJ3QgdXNlCisJICogaXZpZGVvLT5hY2NlbCBoZXJlLCBhcyB0aGlzIG1pZ2h0IGhhdmUKKwkgKiBiZWVuIGNoYW5nZWQgYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgorCSAqLworCWluU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1BDSV9BRERSRVNTX1NFVCwgY3IzMCk7CisJaW5TSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfTU9EVUxFX0VOQUJMRSwgY3IzMSk7CisJLyogTU1JTyBhbmQgMkQvM0QgZW5naW5lIGVuYWJsZWQ/ICovCisJaWYoKGNyMzAgJiBTSVNfTUVNX01BUF9JT19FTkFCTEUpICYmIChjcjMxICYgMHg0MikpIHsKKyNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAorCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKKwkJCS8qIERvbid0IGNhcmUgYWJvdXQgVHVyYm9RdWV1ZS4gSXQncworCQkJICogZW5vdWdoIHRvIGtub3cgdGhhdCB0aGUgZW5naW5lcworCQkJICogYXJlIGVuYWJsZWQKKwkJCSAqLworCQkJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CisJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkJLyogQ2hlY2sgdGhhdCBhbnkgcXVldWUgbW9kZSBpcworCQkJICogZW5hYmxlZCwgYW5kIHRoYXQgdGhlIHF1ZXVlCisJCQkgKiBpcyBub3QgaW4gdGhlIHN0YXRlIG9mICJyZXNldCIKKwkJCSAqLworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MjYsIGNyMzApOworCQkJaWYoKGNyMzAgJiAweGUwKSAmJiAoIShjcjMwICYgMHgwMSkpKSB7CisJCQkJc2lzZmJfc3luY2FjY2VsKGl2aWRlbyk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQKIHNpc2ZiX3ByZV9zZXRtb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQogewogCXU4IGNyMzAgPSAwLCBjcjMxID0gMCwgY3IzMyA9IDAsIGNyMzUgPSAwLCBjcjM4ID0gMDsKQEAgLTMzODYsNiArMzYyOSw4IEBACiAKIAlpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICY9IChWQl9WSURFT0JSSURHRSB8IFZCX0RJU1BUWVBFX0RJU1AyKTsKIAorCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKIAlpblNJU0lEWFJFRyhTSVNDUiwgMHgzMSwgY3IzMSk7CiAJY3IzMSAmPSB+MHg2MDsKIAljcjMxIHw9IDB4MDQ7CkBAIC0zNDEzLDQxICszNjU4LDQzIEBACiAKIAlTaVNfU2V0RW5hYmxlRHN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKIAlTaVNfU2V0RW5hYmxlRnN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKKwlpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPmN1ckRTVE4gPSAwOwogCiAJc3dpdGNoKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBWQl9ESVNQVFlQRV9ESVNQMikgewogCiAJICAgY2FzZSBDUlQyX1RWOgogCSAgICAgIGNyMzggJj0gfjB4YzA7ICAgLyogQ2xlYXIgUEFMLU0gLyBQQUwtTiBiaXRzICovCi0JICAgICAgaWYoKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSKSAmJiAoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUN8VkJfMzAxTFZ8VkJfMzAyTFYpKSkgeworCSAgICAgIGlmKChpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUikgJiYgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTWVBCUFJCUklER0UpKSB7CiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKLQkgICAgICAgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotCSAgICAgICAgICAgIGNyMzggfD0gMHgwNDsKLQkgICAgICAgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUjUyNVApICAgICAgIGNyMzUgfD0gMHgyMDsKKwkJIGlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCSAgICBjcjM4IHw9IDB4MDQ7CisJCSAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUjUyNVApICAgICAgIGNyMzUgfD0gMHgyMDsKIAkJICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFI3NTBQKSAgY3IzNSB8PSAweDQwOwogCQkgICAgZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ZUEJQUjEwODBJKSBjcjM1IHw9IDB4NjA7CiAJCSAgICBjcjMwIHw9IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEU7CiAJCSAgICBjcjM1ICY9IH4weDAxOwogCQkgICAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSAoVFZfWVBCUFIgfCAoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFJBTEwpKTsKLQkgICAgICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMTVfVkdBKSB7Ci0JICAgICAgICAgICAgY3IzMCB8PSAoMHg4MCB8IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOworCQkgfSBlbHNlIGlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgeworCQkgICAgY3IzMCB8PSAoMHg4MCB8IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOwogCQkgICAgY3IzOCB8PSAweDA4OwotCSAgICAgICAgICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSNTI1UCkgICAgICAgY3IzOCB8PSAweDEwOworCQkgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFI1MjVQKSAgICAgICBjcjM4IHw9IDB4MTA7CiAJCSAgICBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSNzUwUCkgIGNyMzggfD0gMHgyMDsKIAkJICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfWVBCUFIxMDgwSSkgY3IzOCB8PSAweDMwOwogCQkgICAgY3IzMSAmPSB+MHgwMTsKIAkJICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gKFRWX1lQQlBSIHwgKGl2aWRlby0+dmJmbGFncyAmIFRWX1lQQlBSQUxMKSk7Ci0JICAgICAgICAgfQorCQkgfQogI2VuZGlmCi0JICAgICAgfSBlbHNlIGlmKChpdmlkZW8tPnZiZmxhZ3MgJiBUVl9ISVZJU0lPTikgJiYgKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDF8VkJfMzAxQnxWQl8zMDJCKSkpIHsKLQkgICAgICAgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotCSAgICAgICAgICAgIGNyMzggfD0gMHgwNDsKLQkgICAgICAgICAgICBjcjM1IHw9IDB4NjA7Ci0JICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICBjcjMwIHw9IDB4ODA7Ci0JICAgICAgICAgfQorCSAgICAgIH0gZWxzZSBpZigoaXZpZGVvLT52YmZsYWdzICYgVFZfSElWSVNJT04pICYmCisJCQkJKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTSElWSVNJT05CUklER0UpKSB7CisJCSBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgeworCQkgICAgY3IzOCB8PSAweDA0OworCQkgICAgY3IzNSB8PSAweDYwOworCQkgfSBlbHNlIHsKKwkJICAgIGNyMzAgfD0gMHg4MDsKKwkJIH0KIAkJIGNyMzAgfD0gU0lTX1NJTVVMVEFORU9VU19WSUVXX0VOQUJMRTsKLQkgICAgICAgICBjcjMxIHw9IDB4MDE7Ci0JICAgICAgICAgY3IzNSB8PSAweDAxOworCQkgY3IzMSB8PSAweDAxOworCQkgY3IzNSB8PSAweDAxOwogCQkgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBUVl9ISVZJU0lPTjsKIAkgICAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfU0NBUlQpIHsKIAkJIGNyMzAgPSAoU0lTX1ZCX09VVFBVVF9TQ0FSVCB8IFNJU19TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOwpAQCAtMzQ2Niw4ICszNzEzLDggQEAKIAkgICAgICB9CiAJICAgICAgY3IzMSB8PSBTSVNfRFJJVkVSX01PREU7CiAKLQkgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiAoVFZfQVZJREVPfFRWX1NWSURFTykpIHsKLQkgICAgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9QQUwpIHsKKwkgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiAoVFZfQVZJREVPIHwgVFZfU1ZJREVPKSkgeworCQkgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfUEFMKSB7CiAJCSAgICBjcjMxIHw9IDB4MDE7IGNyMzUgfD0gMHgwMTsKIAkJICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVFZfUEFMOwogCQkgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVFZfUEFMTSkgewpAQCAtMzQ3NiwxNCArMzcyMywxNCBAQAogCQkgICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX1BBTE4pIHsKIAkJICAgICAgIGNyMzggfD0gMHg4MDsgY3IzNSB8PSAweDA4OwogCQkgICAgICAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBUVl9QQUxOOwotCSAgCSAgICB9Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCSAgICB9CisJCSB9IGVsc2UgewogCQkgICAgY3IzMSAmPSB+MHgwMTsgY3IzNSAmPSB+MHgwMTsKIAkJICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVFZfTlRTQzsKIAkJICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFRWX05UU0NKKSB7CiAJCSAgICAgICBjcjM4IHw9IDB4NDA7IGNyMzUgfD0gMHgwMjsKIAkJICAgICAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVFZfTlRTQ0o7Ci0JIAkgICAgfQorCQkgICAgfQogCQkgfQogCSAgICAgIH0KIAkgICAgICBicmVhazsKQEAgLTM0OTMsNiArMzc0MCw4IEBACiAJICAgICAgY3IzMSB8PSBTSVNfRFJJVkVSX01PREU7CiAJICAgICAgU2lTX1NldEVuYWJsZURzdG4oJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnNpc2ZiX2RzdG4pOwogCSAgICAgIFNpU19TZXRFbmFibGVGc3RuKCZpdmlkZW8tPlNpU19QciwgaXZpZGVvLT5zaXNmYl9mc3RuKTsKKwkgICAgICBpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPnNpc2ZiX2ZzdG47CisJICAgICAgaXZpZGVvLT5jdXJEU1ROID0gaXZpZGVvLT5zaXNmYl9kc3RuOwogCSAgICAgIGJyZWFrOwogCiAJICAgY2FzZSBDUlQyX1ZHQToKQEAgLTM1MjUsOSArMzc3NCw5IEBACiAJfQogCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzMSwgY3IzMSk7CiAKLQlpZihpdmlkZW8tPmFjY2VsKSBzaXNmYl9zeW5jYWNjZWwoaXZpZGVvKTsKLQogCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VPRU0gPSBpdmlkZW8tPnNpc2ZiX3VzZW9lbTsKKworCXNpc2ZiX2NoZWNrX2VuZ2luZV9hbmRfc3luYyhpdmlkZW8pOwogfQogCiAvKiBGaXggU1IxMSBmb3IgNjYxIGFuZCBsYXRlciAqLwpAQCAtMzUzNSwxMjUgKzM3ODQsMTI5IEBACiBzdGF0aWMgdm9pZAogc2lzZmJfZml4dXBfU1IxMShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLSAgICB1OCAgdG1wcmVnOworCXU4ICB0bXByZWc7CiAKLSAgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotICAgICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MTEsdG1wcmVnKTsKLSAgICAgICBpZih0bXByZWcgJiAweDIwKSB7Ci0gICAgICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgzZSx0bXByZWcpOwotCSAgdG1wcmVnID0gKHRtcHJlZyArIDEpICYgMHhmZjsKLQkgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNlLHRtcHJlZyk7Ci0JICBpblNJU0lEWFJFRyhTSVNTUiwweDExLHRtcHJlZyk7Ci0gICAgICAgfQotICAgICAgIGlmKHRtcHJlZyAmIDB4ZjApIHsKLSAgICAgICAgICBhbmRTSVNJRFhSRUcoU0lTU1IsMHgxMSwweDBmKTsKLSAgICAgICB9Ci0gICAgfQorCWlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCWluU0lTSURYUkVHKFNJU1NSLDB4MTEsdG1wcmVnKTsKKwkJaWYodG1wcmVnICYgMHgyMCkgeworCQkJaW5TSVNJRFhSRUcoU0lTU1IsMHgzZSx0bXByZWcpOworCQkJdG1wcmVnID0gKHRtcHJlZyArIDEpICYgMHhmZjsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwweDNlLHRtcHJlZyk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwweDExLHRtcHJlZyk7CisJCX0KKwkJaWYodG1wcmVnICYgMHhmMCkgeworCQkJYW5kU0lTSURYUkVHKFNJU1NSLDB4MTEsMHgwZik7CisJCX0KKwl9CiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc2lzZmJfc2V0X1RWeHBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCkKK3N0YXRpYyB2b2lkCitzaXNmYl9zZXRfVFZ4cG9zb2Zmc2V0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgdmFsKQogewotICAgaWYodmFsID4gMzIpIHZhbCA9IDMyOwotICAgaWYodmFsIDwgLTMyKSB2YWwgPSAtMzI7Ci0gICBpdmlkZW8tPnR2eHBvcyA9IHZhbDsKKwlpZih2YWwgPiAzMikgdmFsID0gMzI7CisJaWYodmFsIDwgLTMyKSB2YWwgPSAtMzI7CisJaXZpZGVvLT50dnhwb3MgPSB2YWw7CiAKLSAgIGlmKGl2aWRlby0+c2lzZmJsb2NrZWQpIHJldHVybjsKLSAgIGlmKCFpdmlkZW8tPm1vZGVjaGFuZ2VkKSByZXR1cm47CisJaWYoaXZpZGVvLT5zaXNmYmxvY2tlZCkgcmV0dXJuOworCWlmKCFpdmlkZW8tPm1vZGVjaGFuZ2VkKSByZXR1cm47CiAKLSAgIGlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX1RWKSB7CisJaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIENSVDJfVFYpIHsKIAotICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfQ0hST05URUwpIHsKKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgewogCi0JIGludCB4ID0gaXZpZGVvLT50dng7CisJCQlpbnQgeCA9IGl2aWRlby0+dHZ4OwogCi0JIHN3aXRjaChpdmlkZW8tPmNocm9udGVsdHlwZSkgewotCSBjYXNlIDE6Ci0JICAgICB4ICs9IHZhbDsKLQkgICAgIGlmKHggPCAwKSB4ID0gMDsKLQkgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDA1LDB4ODYpOwotCSAgICAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsICgoKHggJiAweGZmKSA8PCA4KSB8IDB4MGEpKTsKLQkgICAgIFNpU19TZXRDSDcweHhBTkRPUigmaXZpZGVvLT5TaVNfUHIsICgoKHggJiAweDAxMDApIDw8IDEpIHwgMHgwOCksMHhGRCk7Ci0JICAgICBicmVhazsKLQkgY2FzZSAyOgotCSAgICAgLyogTm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLwotCSAgICAgYnJlYWs7Ci0JIH0KKwkJCXN3aXRjaChpdmlkZW8tPmNocm9udGVsdHlwZSkgeworCQkJY2FzZSAxOgorCQkJCXggKz0gdmFsOworCQkJCWlmKHggPCAwKSB4ID0gMDsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKKwkJCQlTaVNfU2V0Q0g3MDB4KCZpdmlkZW8tPlNpU19QciwgMHgwYSwgKHggJiAweGZmKSk7CisJCQkJU2lTX1NldENINzB4eEFORE9SKCZpdmlkZW8tPlNpU19QciwgMHgwOCwgKCh4ICYgMHgwMTAwKSA+PiA3KSwgMHhGRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJLyogTm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLworCQkJCWJyZWFrOworCQkJfQogCi0gICAgICB9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfU0lTQlJJREdFKSB7CisJCX0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MyICYgVkIyX1NJU0JSSURHRSkgewogCi0JIHU4IHAyXzFmLHAyXzIwLHAyXzJiLHAyXzQyLHAyXzQzOwotCSB1bnNpZ25lZCBzaG9ydCB0ZW1wOworCQkJdTggcDJfMWYscDJfMjAscDJfMmIscDJfNDIscDJfNDM7CisJCQl1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCi0JIHAyXzFmID0gaXZpZGVvLT5wMl8xZjsKLQkgcDJfMjAgPSBpdmlkZW8tPnAyXzIwOwotCSBwMl8yYiA9IGl2aWRlby0+cDJfMmI7Ci0JIHAyXzQyID0gaXZpZGVvLT5wMl80MjsKLQkgcDJfNDMgPSBpdmlkZW8tPnAyXzQzOworCQkJcDJfMWYgPSBpdmlkZW8tPnAyXzFmOworCQkJcDJfMjAgPSBpdmlkZW8tPnAyXzIwOworCQkJcDJfMmIgPSBpdmlkZW8tPnAyXzJiOworCQkJcDJfNDIgPSBpdmlkZW8tPnAyXzQyOworCQkJcDJfNDMgPSBpdmlkZW8tPnAyXzQzOwogCi0JIHRlbXAgPSBwMl8xZiB8ICgocDJfMjAgJiAweGYwKSA8PCA0KTsKLQkgdGVtcCArPSAodmFsICogMik7Ci0JIHAyXzFmID0gdGVtcCAmIDB4ZmY7Ci0JIHAyXzIwID0gKHRlbXAgJiAweGYwMCkgPj4gNDsKLQkgcDJfMmIgPSAoKHAyXzJiICYgMHgwZikgKyAodmFsICogMikpICYgMHgwZjsKLQkgdGVtcCA9IHAyXzQzIHwgKChwMl80MiAmIDB4ZjApIDw8IDQpOwotCSB0ZW1wICs9ICh2YWwgKiAyKTsKLQkgcDJfNDMgPSB0ZW1wICYgMHhmZjsKLQkgcDJfNDIgPSAodGVtcCAmIDB4ZjAwKSA+PiA0OwotCSBvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgxZixwMl8xZik7Ci0JIHNldFNJU0lEWFJFRyhTSVNQQVJUMiwweDIwLDB4MEYscDJfMjApOwotCSBzZXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgyYiwweEYwLHAyXzJiKTsKLQkgc2V0U0lTSURYUkVHKFNJU1BBUlQyLDB4NDIsMHgwRixwMl80Mik7Ci0JIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDQzLHAyXzQzKTsKLSAgICAgIH0KLSAgIH0KKwkJCXRlbXAgPSBwMl8xZiB8ICgocDJfMjAgJiAweGYwKSA8PCA0KTsKKwkJCXRlbXAgKz0gKHZhbCAqIDIpOworCQkJcDJfMWYgPSB0ZW1wICYgMHhmZjsKKwkJCXAyXzIwID0gKHRlbXAgJiAweGYwMCkgPj4gNDsKKwkJCXAyXzJiID0gKChwMl8yYiAmIDB4MGYpICsgKHZhbCAqIDIpKSAmIDB4MGY7CisJCQl0ZW1wID0gcDJfNDMgfCAoKHAyXzQyICYgMHhmMCkgPDwgNCk7CisJCQl0ZW1wICs9ICh2YWwgKiAyKTsKKwkJCXAyXzQzID0gdGVtcCAmIDB4ZmY7CisJCQlwMl80MiA9ICh0ZW1wICYgMHhmMDApID4+IDQ7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgxZixwMl8xZik7CisJCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgyMCwweDBGLHAyXzIwKTsKKwkJCXNldFNJU0lEWFJFRyhTSVNQQVJUMiwweDJiLDB4RjAscDJfMmIpOworCQkJc2V0U0lTSURYUkVHKFNJU1BBUlQyLDB4NDIsMHgwRixwMl80Mik7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHg0MyxwMl80Myk7CisJCX0KKwl9CiB9CiAKLXN0YXRpYyB2b2lkIHNpc2ZiX3NldF9UVnlwb3NvZmZzZXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIGludCB2YWwpCitzdGF0aWMgdm9pZAorc2lzZmJfc2V0X1RWeXBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCkKIHsKLSAgIGlmKHZhbCA+IDMyKSB2YWwgPSAzMjsKLSAgIGlmKHZhbCA8IC0zMikgdmFsID0gLTMyOwotICAgaXZpZGVvLT50dnlwb3MgPSB2YWw7CisJaWYodmFsID4gMzIpIHZhbCA9IDMyOworCWlmKHZhbCA8IC0zMikgdmFsID0gLTMyOworCWl2aWRlby0+dHZ5cG9zID0gdmFsOwogCi0gICBpZihpdmlkZW8tPnNpc2ZibG9ja2VkKSByZXR1cm47Ci0gICBpZighaXZpZGVvLT5tb2RlY2hhbmdlZCkgcmV0dXJuOworCWlmKGl2aWRlby0+c2lzZmJsb2NrZWQpIHJldHVybjsKKwlpZighaXZpZGVvLT5tb2RlY2hhbmdlZCkgcmV0dXJuOwogCi0gICBpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9UVikgeworCWlmKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX1RWKSB7CiAKLSAgICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7CisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpIHsKIAotCSBpbnQgeSA9IGl2aWRlby0+dHZ5OworCQkJaW50IHkgPSBpdmlkZW8tPnR2eTsKIAotCSBzd2l0Y2goaXZpZGVvLT5jaHJvbnRlbHR5cGUpIHsKLQkgY2FzZSAxOgotCSAgICB5IC09IHZhbDsKLQkgICAgaWYoeSA8IDApIHkgPSAwOwotCSAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKLQkgICAgU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsICgoKHkgJiAweGZmKSA8PCA4KSB8IDB4MGIpKTsKLQkgICAgU2lTX1NldENINzB4eEFORE9SKCZpdmlkZW8tPlNpU19QciwgKCh5ICYgMHgwMTAwKSB8IDB4MDgpLDB4RkUpOwotCSAgICBicmVhazsKLQkgY2FzZSAyOgotCSAgICAvKiBOb3Qgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlICovCi0JICAgIGJyZWFrOwotCSB9CisJCQlzd2l0Y2goaXZpZGVvLT5jaHJvbnRlbHR5cGUpIHsKKwkJCWNhc2UgMToKKwkJCQl5IC09IHZhbDsKKwkJCQlpZih5IDwgMCkgeSA9IDA7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLDB4MDUsMHg4Nik7CisJCQkJU2lTX1NldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIsICh5ICYgMHhmZikpOworCQkJCVNpU19TZXRDSDcweHhBTkRPUigmaXZpZGVvLT5TaVNfUHIsIDB4MDgsICgoeSAmIDB4MDEwMCkgPj4gOCksIDB4RkUpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgKi8KKwkJCQlicmVhazsKKwkJCX0KIAotICAgICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX1NJU0JSSURHRSkgeworCQl9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9TSVNCUklER0UpIHsKIAotCSBjaGFyIHAyXzAxLCBwMl8wMjsKLQkgdmFsIC89IDI7Ci0JIHAyXzAxID0gaXZpZGVvLT5wMl8wMTsKLQkgcDJfMDIgPSBpdmlkZW8tPnAyXzAyOworCQkJY2hhciBwMl8wMSwgcDJfMDI7CisJCQl2YWwgLz0gMjsKKwkJCXAyXzAxID0gaXZpZGVvLT5wMl8wMTsKKwkJCXAyXzAyID0gaXZpZGVvLT5wMl8wMjsKIAotCSBwMl8wMSArPSB2YWw7Ci0JIHAyXzAyICs9IHZhbDsKLQkgd2hpbGUoKHAyXzAxIDw9IDApIHx8IChwMl8wMiA8PSAwKSkgewotCSAgICBwMl8wMSArPSAyOwotCSAgICBwMl8wMiArPSAyOwotCSB9Ci0JIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDAxLHAyXzAxKTsKLQkgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4MDIscDJfMDIpOwotICAgICAgfQotICAgfQorCQkJcDJfMDEgKz0gdmFsOworCQkJcDJfMDIgKz0gdmFsOworCQkJaWYoIShpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgKFRWX0hJVklTSU9OIHwgVFZfWVBCUFIpKSkgeworCQkJCXdoaWxlKChwMl8wMSA8PSAwKSB8fCAocDJfMDIgPD0gMCkpIHsKKwkJCQkJcDJfMDEgKz0gMjsKKwkJCQkJcDJfMDIgKz0gMjsKKwkJCQl9CisJCQl9CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgwMSxwMl8wMSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgwMixwMl8wMik7CisJCX0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zNjY4LDIwNyArMzkyMSwxNzIgQEAKIAl1OCByZWcxOwogI2VuZGlmCiAKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MDUsIDB4ODYpOwogCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKIAlzaXNmYl9maXh1cF9TUjExKGl2aWRlbyk7CiAjZW5kaWYKIAogCS8qIE5vdyB3ZSBhY3R1YWxseSBIQVZFIGNoYW5nZWQgdGhlIGRpc3BsYXkgbW9kZSAqLwotICAgICAgICBpdmlkZW8tPm1vZGVjaGFuZ2VkID0gMTsKKwlpdmlkZW8tPm1vZGVjaGFuZ2VkID0gMTsKIAogCS8qIFdlIGNhbid0IHN3aXRjaCBvZmYgQ1JUMSBpZiBicmlkZ2UgaXMgaW4gc2xhdmUgbW9kZSAqLwotCWlmKGl2aWRlby0+dmJmbGFncyAmIFZCX1ZJREVPQlJJREdFKSB7CisJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9WSURFT0JSSURHRSkgewogCQlpZihzaXNmYl9icmlkZ2Vpc3NsYXZlKGl2aWRlbykpIGRvaXQgPSBGQUxTRTsKLQl9IGVsc2UgaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gMDsKKwl9IGVsc2UKKwkJaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID0gMDsKIAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiAJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgaWYoKGl2aWRlby0+c2lzZmJfY3J0MW9mZikgJiYgKGRvaXQpKSB7Ci0JICAgICAgICBjcnQxaXNvZmYgPSBUUlVFOwotCQlyZWcgPSAweDAwOwotCSAgIH0gZWxzZSB7Ci0JICAgICAgICBjcnQxaXNvZmYgPSBGQUxTRTsKLQkJcmVnID0gMHg4MDsKLQkgICB9Ci0JICAgc2V0U0lTSURYUkVHKFNJU0NSLCAweDE3LCAweDdmLCByZWcpOworCQlpZigoaXZpZGVvLT5zaXNmYl9jcnQxb2ZmKSAmJiAoZG9pdCkpIHsKKwkJCWNydDFpc29mZiA9IFRSVUU7CisJCQlyZWcgPSAweDAwOworCQl9IGVsc2UgeworCQkJY3J0MWlzb2ZmID0gRkFMU0U7CisJCQlyZWcgPSAweDgwOworCQl9CisJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHgxNywgMHg3ZiwgcmVnKTsKIAl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQogCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCSAgIGlmKChpdmlkZW8tPnNpc2ZiX2NydDFvZmYpICYmIChkb2l0KSkgewotCSAgICAgICAgY3J0MWlzb2ZmID0gVFJVRTsKLQkJcmVnICA9IDB4NDA7Ci0JCXJlZzEgPSAweGMwOwotCSAgIH0gZWxzZSB7Ci0JICAgICAgICBjcnQxaXNvZmYgPSBGQUxTRTsKLQkJcmVnICA9IDB4MDA7Ci0JCXJlZzEgPSAweDAwOwotCi0JICAgfQotCSAgIHNldFNJU0lEWFJFRyhTSVNDUiwgaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MywgfjB4NDAsIHJlZyk7Ci0JICAgc2V0U0lTSURYUkVHKFNJU1NSLCAweDFmLCB+MHhjMCwgcmVnMSk7CisJCWlmKChpdmlkZW8tPnNpc2ZiX2NydDFvZmYpICYmIChkb2l0KSkgeworCQkJY3J0MWlzb2ZmID0gVFJVRTsKKwkJCXJlZyAgPSAweDQwOworCQkJcmVnMSA9IDB4YzA7CisJCX0gZWxzZSB7CisJCQljcnQxaXNvZmYgPSBGQUxTRTsKKwkJCXJlZyAgPSAweDAwOworCQkJcmVnMSA9IDB4MDA7CisJCX0KKwkJc2V0U0lTSURYUkVHKFNJU0NSLCBpdmlkZW8tPlNpU19Qci5TaVNfTXlDUjYzLCB+MHg0MCwgcmVnKTsKKwkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDFmLCB+MHhjMCwgcmVnMSk7CiAJfQogI2VuZGlmCiAKIAlpZihjcnQxaXNvZmYpIHsKLQkgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICY9IH5WQl9ESVNQVFlQRV9DUlQxOwotCSAgIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVkJfU0lOR0xFX01PREU7CisJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJj0gflZCX0RJU1BUWVBFX0NSVDE7CisJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVkJfU0lOR0xFX01PREU7CiAJfSBlbHNlIHsKLQkgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IFZCX0RJU1BUWVBFX0NSVDE7Ci0JICAgaWYoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDIpIHsKLQkgIAlpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IFZCX01JUlJPUl9NT0RFOwotCSAgIH0gZWxzZSB7Ci0JIAlpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IFZCX1NJTkdMRV9NT0RFOwotCSAgIH0KKwkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBWQl9ESVNQVFlQRV9DUlQxOworCQlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgVkJfRElTUFRZUEVfQ1JUMikgeworCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBWQl9NSVJST1JfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gVkJfU0lOR0xFX01PREU7CisJCX0KIAl9CiAKLSAgICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1JBTURBQ19DT05UUk9MLCB+MHgwNCk7CisJYW5kU0lTSURYUkVHKFNJU1NSLCBJTkRfU0lTX1JBTURBQ19DT05UUk9MLCB+MHgwNCk7CiAKIAlpZihpdmlkZW8tPmN1cnJlbnR2YmZsYWdzICYgQ1JUMl9UVikgewotCSAgIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX1NJU0JSSURHRSkgewotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4MWYsaXZpZGVvLT5wMl8xZik7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHgyMCxpdmlkZW8tPnAyXzIwKTsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMiwweDJiLGl2aWRlby0+cDJfMmIpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4NDIsaXZpZGVvLT5wMl80Mik7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHg0MyxpdmlkZW8tPnAyXzQzKTsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUMiwweDAxLGl2aWRlby0+cDJfMDEpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQyLDB4MDIsaXZpZGVvLT5wMl8wMik7Ci0JICAgfSBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIFZCX0NIUk9OVEVMKSB7Ci0JICAgICAgaWYoaXZpZGVvLT5jaHJvbnRlbHR5cGUgPT0gMSkgewotCSAgICAgICAgIGl2aWRlby0+dHZ4ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGEpOwotCSAgICAgICAgIGl2aWRlby0+dHZ4IHw9ICgoKFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDA4KSAmIDB4MDIpID4+IDEpIDw8IDgpOwotCSAgICAgICAgIGl2aWRlby0+dHZ5ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIpOwotCSAgICAgICAgIGl2aWRlby0+dHZ5IHw9ICgoU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MDgpICYgMHgwMSkgPDwgOCk7Ci0gCSAgICAgIH0KLQkgICB9CisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTQlJJREdFKSB7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMiwweDFmLGl2aWRlby0+cDJfMWYpOworCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHgyMCxpdmlkZW8tPnAyXzIwKTsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQyLDB4MmIsaXZpZGVvLT5wMl8yYik7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMiwweDQyLGl2aWRlby0+cDJfNDIpOworCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDIsMHg0MyxpdmlkZW8tPnAyXzQzKTsKKwkJCWluU0lTSURYUkVHKFNJU1BBUlQyLDB4MDEsaXZpZGVvLT5wMl8wMSk7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUMiwweDAyLGl2aWRlby0+cDJfMDIpOworCQl9IGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9DSFJPTlRFTCkgeworCQkJaWYoaXZpZGVvLT5jaHJvbnRlbHR5cGUgPT0gMSkgeworCQkJCWl2aWRlby0+dHZ4ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGEpOworCQkJCWl2aWRlby0+dHZ4IHw9ICgoKFNpU19HZXRDSDcwMHgoJml2aWRlby0+U2lTX1ByLCAweDA4KSAmIDB4MDIpID4+IDEpIDw8IDgpOworCQkJCWl2aWRlby0+dHZ5ID0gU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MGIpOworCQkJCWl2aWRlby0+dHZ5IHw9ICgoU2lTX0dldENINzAweCgmaXZpZGVvLT5TaVNfUHIsIDB4MDgpICYgMHgwMSkgPDwgOCk7CisJCQl9CisJCX0KIAl9CiAKIAlpZihpdmlkZW8tPnR2eHBvcykgewotICAgCSAgIHNpc2ZiX3NldF9UVnhwb3NvZmZzZXQoaXZpZGVvLCBpdmlkZW8tPnR2eHBvcyk7CisJCXNpc2ZiX3NldF9UVnhwb3NvZmZzZXQoaXZpZGVvLCBpdmlkZW8tPnR2eHBvcyk7CiAJfQogCWlmKGl2aWRlby0+dHZ5cG9zKSB7Ci0gICAJICAgc2lzZmJfc2V0X1RWeXBvc29mZnNldChpdmlkZW8sIGl2aWRlby0+dHZ5cG9zKTsKKwkJc2lzZmJfc2V0X1RWeXBvc29mZnNldChpdmlkZW8sIGl2aWRlby0+dHZ5cG9zKTsKIAl9CiAKLQlpZigoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIENSVDJfVFYpICYmIChpdmlkZW8tPnZiZmxhZ3MgJiBWQl8zMDEpKSB7ICAvKiBTZXQgZmlsdGVyIGZvciBTaVMzMDEgKi8KKwkvKiBFdmVudHVhbGx5IHN5bmMgZW5naW5lcyAqLworCXNpc2ZiX2NoZWNrX2VuZ2luZV9hbmRfc3luYyhpdmlkZW8pOwogCi0JICAgCXVuc2lnbmVkIGNoYXIgZmlsdGVyX3RiID0gMDsKKwkvKiAoUmUtKUluaXRpYWxpemUgY2hpcCBlbmdpbmVzICovCisJaWYoaXZpZGVvLT5hY2NlbCkgeworCQlzaXNmYl9lbmdpbmVfaW5pdChpdmlkZW8pOworCX0gZWxzZSB7CisJCWl2aWRlby0+ZW5naW5lb2sgPSAwOworCX0KK30KIAotCQlzd2l0Y2ggKGl2aWRlby0+dmlkZW9fd2lkdGgpIHsKLQkJICAgY2FzZSAzMjA6Ci0JCQlmaWx0ZXJfdGIgPSAoaXZpZGVvLT52YmZsYWdzICYgVFZfTlRTQykgPyA0IDogMTI7Ci0JCQlicmVhazsKLQkJICAgY2FzZSA2NDA6Ci0JCQlmaWx0ZXJfdGIgPSAoaXZpZGVvLT52YmZsYWdzICYgVFZfTlRTQykgPyA1IDogMTM7Ci0JCQlicmVhazsKLQkJICAgY2FzZSA3MjA6Ci0JCQlmaWx0ZXJfdGIgPSAoaXZpZGVvLT52YmZsYWdzICYgVFZfTlRTQykgPyA2IDogMTQ7Ci0JCQlicmVhazsKLQkJICAgY2FzZSA0MDA6Ci0JCSAgIGNhc2UgODAwOgotCQkJZmlsdGVyX3RiID0gKGl2aWRlby0+dmJmbGFncyAmIFRWX05UU0MpID8gNyA6IDE1OwotCQkJYnJlYWs7Ci0JCSAgIGRlZmF1bHQ6Ci0JCQlpdmlkZW8tPnNpc2ZiX2ZpbHRlciA9IC0xOwotCQkJYnJlYWs7CitzdGF0aWMgaW50CitzaXNmYl9yZXNldF9tb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCWlmKHNpc2ZiX3NldF9tb2RlKGl2aWRlbywgMCkpCisJCXJldHVybiAxOworCisJc2lzZmJfc2V0X3BpdGNoKGl2aWRlbyk7CisJc2lzZmJfc2V0X2Jhc2VfQ1JUMShpdmlkZW8sIGl2aWRlby0+Y3VycmVudF9iYXNlKTsKKwlzaXNmYl9zZXRfYmFzZV9DUlQyKGl2aWRlbywgaXZpZGVvLT5jdXJyZW50X2Jhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzaXNmYl9oYW5kbGVfY29tbWFuZChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgc3RydWN0IHNpc2ZiX2NtZCAqc2lzZmJfY29tbWFuZCkKK3sKKwlpbnQgbXljcnQxb2ZmOworCisJc3dpdGNoKHNpc2ZiX2NvbW1hbmQtPnNpc2ZiX2NtZCkgeworCWNhc2UgU0lTRkJfQ01EX0dFVFZCRkxBR1M6CisJCWlmKCFpdmlkZW8tPm1vZGVjaGFuZ2VkKSB7CisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMF0gPSBTSVNGQl9DTURfRVJSX0VBUkxZOworCQl9IGVsc2UgeworCQkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzBdID0gU0lTRkJfQ01EX0VSUl9PSzsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFsxXSA9IGl2aWRlby0+Y3VycmVudHZiZmxhZ3M7CisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMl0gPSBpdmlkZW8tPnZiZmxhZ3MyOwogCQl9Ci0KLQkJb3JTSVNJRFhSRUcoU0lTUEFSVDEsIGl2aWRlby0+Q1JUMl93cml0ZV9lbmFibGUsIDB4MDEpOwotCi0JCWlmKGl2aWRlby0+dmJmbGFncyAmIFRWX05UU0MpIHsKLQotCQkgICAgICAgIGFuZFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzYSwgMHgxZik7Ci0KLQkJCWlmIChpdmlkZW8tPnZiZmxhZ3MgJiBUVl9TVklERU8pIHsKLQotCQkJICAgICAgICBhbmRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzAsIDB4ZGYpOwotCi0JCQl9IGVsc2UgaWYgKGl2aWRlby0+dmJmbGFncyAmIFRWX0FWSURFTykgewotCi0JCQkgICAgICAgIG9yU0lTSURYUkVHKFNJU1BBUlQyLCAweDMwLCAweDIwKTsKLQotCQkJCXN3aXRjaCAoaXZpZGVvLT52aWRlb193aWR0aCkgewotCQkJCWNhc2UgNjQwOgotCQkJCSAgICAgICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM1LCAweEVCKTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM2LCAweDA0KTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM3LCAweDI1KTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM4LCAweDE4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3MjA6Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNSwgMHhFRSk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNiwgMHgwQyk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNywgMHgyMik7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzOCwgMHgwOCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDAwOgotCQkJCWNhc2UgODAwOgotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzUsIDB4RUIpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzYsIDB4MTUpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzcsIDB4MjUpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzgsIDB4RjYpOwotCQkJCQlicmVhazsKKwkJYnJlYWs7CisJY2FzZSBTSVNGQl9DTURfU1dJVENIQ1JUMToKKwkJLyogYXJnWzBdOiAwID0gb2ZmLCAxID0gb24sIDk5ID0gcXVlcnkgKi8KKwkJaWYoIWl2aWRlby0+bW9kZWNoYW5nZWQpIHsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfRUFSTFk7CisJCX0gZWxzZSBpZihzaXNmYl9jb21tYW5kLT5zaXNmYl9hcmdbMF0gPT0gOTkpIHsKKwkJCS8qIFF1ZXJ5ICovCisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMV0gPSBpdmlkZW8tPnNpc2ZiX2NydDFvZmYgPyAwIDogMTsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfT0s7CisJCX0gZWxzZSBpZihpdmlkZW8tPnNpc2ZibG9ja2VkKSB7CisJCQlzaXNmYl9jb21tYW5kLT5zaXNmYl9yZXN1bHRbMF0gPSBTSVNGQl9DTURfRVJSX0xPQ0tFRDsKKwkJfSBlbHNlIGlmKCghKGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgJiBDUlQyX0VOQUJMRSkpICYmCisJCQkJCShzaXNmYl9jb21tYW5kLT5zaXNmYl9hcmdbMF0gPT0gMCkpIHsKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfTk9DUlQyOworCQl9IGVsc2UgeworCQkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzBdID0gU0lTRkJfQ01EX0VSUl9PSzsKKwkJCW15Y3J0MW9mZiA9IHNpc2ZiX2NvbW1hbmQtPnNpc2ZiX2FyZ1swXSA/IDAgOiAxOworCQkJaWYoICgoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDEpICYmIG15Y3J0MW9mZikgfHwKKwkJCSAgICAoKCEoaXZpZGVvLT5jdXJyZW50dmJmbGFncyAmIFZCX0RJU1BUWVBFX0NSVDEpKSAmJiAhbXljcnQxb2ZmKSApIHsKKwkJCQlpdmlkZW8tPnNpc2ZiX2NydDFvZmYgPSBteWNydDFvZmY7CisJCQkJaWYoc2lzZmJfcmVzZXRfbW9kZShpdmlkZW8pKSB7CisJCQkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX3Jlc3VsdFswXSA9IFNJU0ZCX0NNRF9FUlJfT1RIRVI7CiAJCQkJfQogCQkJfQotCi0JCX0gZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBUVl9QQUwpIHsKLQotCQkJYW5kU0lTSURYUkVHKFNJU1BBUlQyLCAweDNBLCAweDFGKTsKLQotCQkJaWYgKGl2aWRlby0+dmJmbGFncyAmIFRWX1NWSURFTykgewotCi0JCQkgICAgICAgIGFuZFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzMCwgMHhERik7Ci0KLQkJCX0gZWxzZSBpZiAoaXZpZGVvLT52YmZsYWdzICYgVFZfQVZJREVPKSB7Ci0KLQkJCSAgICAgICAgb3JTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzAsIDB4MjApOwotCi0JCQkJc3dpdGNoIChpdmlkZW8tPnZpZGVvX3dpZHRoKSB7Ci0JCQkJY2FzZSA2NDA6Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNSwgMHhGMSk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNiwgMHhGNyk7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzNywgMHgxRik7Ci0JCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUMiwgMHgzOCwgMHgzMik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNzIwOgotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzUsIDB4RjMpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzYsIDB4MDApOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzcsIDB4MUQpOwotCQkJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MzgsIDB4MjApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQwMDoKLQkJCQljYXNlIDgwMDoKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM1LCAweEZDKTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM2LCAweEZCKTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM3LCAweDE0KTsKLQkJCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDM4LCAweDJBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQorCQkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzFdID0gaXZpZGVvLT5zaXNmYl9jcnQxb2ZmID8gMCA6IDE7CiAJCX0KLQotCQlpZigoaXZpZGVvLT5zaXNmYl9maWx0ZXIgPj0gMCkgJiYgKGl2aWRlby0+c2lzZmJfZmlsdGVyIDw9IDcpKSB7Ci0JCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDM1LChzaXNfVFZfZmlsdGVyW2ZpbHRlcl90Yl0uZmlsdGVyW2l2aWRlby0+c2lzZmJfZmlsdGVyXVswXSkpOwotCQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgzNiwoc2lzX1RWX2ZpbHRlcltmaWx0ZXJfdGJdLmZpbHRlcltpdmlkZW8tPnNpc2ZiX2ZpbHRlcl1bMV0pKTsKLQkJICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4MzcsKHNpc19UVl9maWx0ZXJbZmlsdGVyX3RiXS5maWx0ZXJbaXZpZGVvLT5zaXNmYl9maWx0ZXJdWzJdKSk7Ci0JCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMiwweDM4LChzaXNfVFZfZmlsdGVyW2ZpbHRlcl90Yl0uZmlsdGVyW2l2aWRlby0+c2lzZmJfZmlsdGVyXVszXSkpOwotCQl9Ci0JICAKKwkJYnJlYWs7CisJLyogbW9yZSB0byBjb21lICovCisJZGVmYXVsdDoKKwkJc2lzZmJfY29tbWFuZC0+c2lzZmJfcmVzdWx0WzBdID0gU0lTRkJfQ01EX0VSUl9VTktOT1dOOworCQlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBVbmtub3duIGNvbW1hbmQgMHgleFxuIiwKKwkJCXNpc2ZiX2NvbW1hbmQtPnNpc2ZiX2NtZCk7CiAJfQogfQogCiAjaWZuZGVmIE1PRFVMRQotU0lTSU5JVFNUQVRJQyBpbnQgX19pbml0IHNpc2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitTSVNJTklUU1RBVElDIGludCBfX2luaXQKK3Npc2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7CiAJY2hhciAqdGhpc19vcHQ7Ci0JCisKIAlzaXNmYl9zZXRkZWZhdWx0cGFybXMoKTsKIAotICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IE9wdGlvbnMgJXNcbiIsIG9wdGlvbnMpOwotCi0JaWYoIW9wdGlvbnMgfHwgISgqb3B0aW9ucykpIHsKKwlpZighb3B0aW9ucyB8fCAhKCpvcHRpb25zKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJd2hpbGUoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CiAKQEAgLTM4ODAsOSArNDA5OCw5IEBACiAJCQkvKiBOZWVkIHRvIGNoZWNrIGNydDIgdHlwZSBmaXJzdCBmb3IgZnN0bi9kc3RuICovCiAJCQlzaXNmYl9zZWFyY2hfY3J0MnR5cGUodGhpc19vcHQgKyAxNCk7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ0dm1vZGU6Iiw3KSkgewotCQkgICAgICAgIHNpc2ZiX3NlYXJjaF90dnN0ZCh0aGlzX29wdCArIDcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ0dnN0YW5kYXJkOiIsMTEpKSB7CiAJCQlzaXNmYl9zZWFyY2hfdHZzdGQodGhpc19vcHQgKyA3KTsKKwkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInR2c3RhbmRhcmQ6IiwxMSkpIHsKKwkJCXNpc2ZiX3NlYXJjaF90dnN0ZCh0aGlzX29wdCArIDExKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgIm1vZGU6IiwgNSkpIHsKIAkJCXNpc2ZiX3NlYXJjaF9tb2RlKHRoaXNfb3B0ICsgNSwgRkFMU0UpOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidmVzYToiLCA1KSkgewpAQCAtMzg5Miw3NCArNDExMCw3MiBAQAogCQkJc2lzZmJfaW52ZXJzZSA9IDE7CiAJCQkvKiBmYl9pbnZlcnRfY21hcHMoKTsgKi8KIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgImZvbnQ6IiwgNSkpIHsKLQkJICAgICAgICBpZihzdHJsZW4odGhpc19vcHQgKyA1KSA8IDQwKSB7CisJCQlpZihzdHJsZW4odGhpc19vcHQgKyA1KSA8IDQwKSB7CiAJCQkgICBzdHJuY3B5KHNpc2ZiX2ZvbnRuYW1lLCB0aGlzX29wdCArIDUsIHNpemVvZihzaXNmYl9mb250bmFtZSkgLSAxKTsKIAkJCSAgIHNpc2ZiX2ZvbnRuYW1lW3NpemVvZihzaXNmYl9mb250bmFtZSkgLSAxXSA9ICdcMCc7CiAJCQl9CiAjZW5kaWYKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInJhdGU6IiwgNSkpIHsKIAkJCXNpc2ZiX3Bhcm1fcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7Ci0JCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJmaWx0ZXI6IiwgNykpIHsKLQkJCXNpc2ZiX2ZpbHRlciA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgImZvcmNlY3J0MToiLCAxMCkpIHsKIAkJCXNpc2ZiX2ZvcmNlY3J0MSA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyAxMCwgTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgIm1lbToiLDQpKSB7Ci0JCSAgICAgICAgc2lzZmJfcGFybV9tZW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOworCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAibWVtOiIsNCkpIHsKKwkJCXNpc2ZiX3Bhcm1fbWVtID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA0LCBOVUxMLCAwKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInBkYzoiLCA0KSkgewotCQkgICAgICAgIHNpc2ZiX3BkYyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNCwgTlVMTCwgMCk7CisJCQlzaXNmYl9wZGMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAicGRjMToiLCA1KSkgewotCQkgICAgICAgIHNpc2ZiX3BkY2EgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOworCQkJc2lzZmJfcGRjYSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJub2FjY2VsIiwgNykpIHsKIAkJCXNpc2ZiX2FjY2VsID0gMDsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgImFjY2VsIiwgNSkpIHsKIAkJCXNpc2ZiX2FjY2VsID0gLTE7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJub3lwYW4iLCA2KSkgewotCQkgICAgICAgIHNpc2ZiX3lwYW4gPSAwOworCQkJc2lzZmJfeXBhbiA9IDA7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ5cGFuIiwgNCkpIHsKLQkJICAgICAgICBzaXNmYl95cGFuID0gLTE7CisJCQlzaXNmYl95cGFuID0gLTE7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJub21heCIsIDUpKSB7Ci0JCSAgICAgICAgc2lzZmJfbWF4ID0gMDsKKwkJCXNpc2ZiX21heCA9IDA7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJtYXgiLCAzKSkgewotCQkgICAgICAgIHNpc2ZiX21heCA9IC0xOworCQkJc2lzZmJfbWF4ID0gLTE7CiAJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJ1c2Vyb206IiwgNykpIHsKIAkJCXNpc2ZiX3VzZXJvbSA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKIAkJfSBlbHNlIGlmKCFzdHJuaWNtcCh0aGlzX29wdCwgInVzZW9lbToiLCA3KSkgewogCQkJc2lzZmJfdXNlb2VtID0gKGludClzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAibm9jcnQycmF0ZSIsIDEwKSkgewogCQkJc2lzZmJfbm9jcnQycmF0ZSA9IDE7Ci0JIAl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAic2NhbGVsY2Q6IiwgOSkpIHsKLQkJICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAyOwotCQkgICAgICAgIHRlbXAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID09IDApIHx8ICh0ZW1wID09IDEpKSB7CisJCX0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJzY2FsZWxjZDoiLCA5KSkgeworCQkJdW5zaWduZWQgbG9uZyB0ZW1wID0gMjsKKwkJCXRlbXAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOworCQkJaWYoKHRlbXAgPT0gMCkgfHwgKHRlbXAgPT0gMSkpIHsKIAkJCSAgIHNpc2ZiX3NjYWxlbGNkID0gdGVtcCBeIDE7Ci0JCSAgICAgICAgfQorCQkJfQogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidHZ4cG9zb2Zmc2V0OiIsIDEzKSkgewotCQkgICAgICAgIGludCB0ZW1wID0gMDsKLQkJICAgICAgICB0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID49IC0zMikgJiYgKHRlbXAgPD0gMzIpKSB7CisJCQlpbnQgdGVtcCA9IDA7CisJCQl0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOworCQkJaWYoKHRlbXAgPj0gLTMyKSAmJiAodGVtcCA8PSAzMikpIHsKIAkJCSAgIHNpc2ZiX3R2eHBvc29mZnNldCA9IHRlbXA7Ci0JCSAgICAgICAgfQorCQkJfQogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidHZ5cG9zb2Zmc2V0OiIsIDEzKSkgewotCQkgICAgICAgIGludCB0ZW1wID0gMDsKLQkJICAgICAgICB0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID49IC0zMikgJiYgKHRlbXAgPD0gMzIpKSB7CisJCQlpbnQgdGVtcCA9IDA7CisJCQl0ZW1wID0gKGludClzaW1wbGVfc3RydG9sKHRoaXNfb3B0ICsgMTMsIE5VTEwsIDApOworCQkJaWYoKHRlbXAgPj0gLTMyKSAmJiAodGVtcCA8PSAzMikpIHsKIAkJCSAgIHNpc2ZiX3R2eXBvc29mZnNldCA9IHRlbXA7Ci0JCSAgICAgICAgfQorCQkJfQogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAic3BlY2lhbHRpbWluZzoiLCAxNCkpIHsKIAkJCXNpc2ZiX3NlYXJjaF9zcGVjaWFsdGltaW5nKHRoaXNfb3B0ICsgMTQpOwogCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAibHZkc2hsOiIsIDcpKSB7Ci0JCSAgICAgICAgaW50IHRlbXAgPSA0OwotCQkgICAgICAgIHRlbXAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApOwotCQkgICAgICAgIGlmKCh0ZW1wID49IDApICYmICh0ZW1wIDw9IDMpKSB7CisJCQlpbnQgdGVtcCA9IDQ7CisJCQl0ZW1wID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKKwkJCWlmKCh0ZW1wID49IDApICYmICh0ZW1wIDw9IDMpKSB7CiAJCQkgICBzaXNmYl9sdmRzaGwgPSB0ZW1wOwotCQkgICAgICAgIH0KKwkJCX0KIAkJfSBlbHNlIGlmKHRoaXNfb3B0WzBdID49ICcwJyAmJiB0aGlzX29wdFswXSA8PSAnOScpIHsKIAkJCXNpc2ZiX3NlYXJjaF9tb2RlKHRoaXNfb3B0LCBUUlVFKTsKICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLQkgICAgICAgIH0gZWxzZSBpZighc3RybmljbXAodGhpc19vcHQsICJyZXNldGNhcmQiLCA5KSkgewotCQkgIAlzaXNmYl9yZXNldGNhcmQgPSAxOworCQl9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAicmVzZXRjYXJkIiwgOSkpIHsKKwkJCXNpc2ZiX3Jlc2V0Y2FyZCA9IDE7CiAJICAgICAgICB9IGVsc2UgaWYoIXN0cm5pY21wKHRoaXNfb3B0LCAidmlkZW9yYW06IiwgOSkpIHsKLQkJICAJc2lzZmJfdmlkZW9yYW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOworCQkJc2lzZmJfdmlkZW9yYW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDksIE5VTEwsIDApOwogI2VuZGlmCiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogSW52YWxpZCBvcHRpb24gJXNcbiIsIHRoaXNfb3B0KTsKQEAgLTM5NjcsNjMgKzQxODMsOTkgQEAKIAogCX0KIAotCi0KIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgVUNIQVIgKiBfX2RldmluaXQgc2lzX2ZpbmRfcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQKK3Npc2ZiX2NoZWNrX3JvbShTSVNfSU9UWVBFMSAqcm9tX2Jhc2UsIHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCVNJU19JT1RZUEUxICpyb207CisJaW50IHJvbXB0cjsKKworCWlmKChyZWFkYihyb21fYmFzZSkgIT0gMHg1NSkgfHwgKHJlYWRiKHJvbV9iYXNlICsgMSkgIT0gMHhhYSkpCisJCXJldHVybiAwOworCisJcm9tcHRyID0gKHJlYWRiKHJvbV9iYXNlICsgMHgxOCkgfCAocmVhZGIocm9tX2Jhc2UgKyAweDE5KSA8PCA4KSk7CisJaWYocm9tcHRyID4gKDB4MTAwMDAgLSA4KSkKKwkJcmV0dXJuIDA7CisKKwlyb20gPSByb21fYmFzZSArIHJvbXB0cjsKKworCWlmKChyZWFkYihyb20pICAgICAhPSAnUCcpIHx8IChyZWFkYihyb20gKyAxKSAhPSAnQycpIHx8CisJICAgKHJlYWRiKHJvbSArIDIpICE9ICdJJykgfHwgKHJlYWRiKHJvbSArIDMpICE9ICdSJykpCisJCXJldHVybiAwOworCisJaWYoKHJlYWRiKHJvbSArIDQpIHwgKHJlYWRiKHJvbSArIDUpIDw8IDgpKSAhPSBpdmlkZW8tPmNoaXBfdmVuZG9yKQorCQlyZXR1cm4gMDsKKworCWlmKChyZWFkYihyb20gKyA2KSB8IChyZWFkYihyb20gKyA3KSA8PCA4KSkgIT0gaXZpZGVvLT5jaGlwX2lkKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqIF9fZGV2aW5pdAorc2lzZmJfZmluZF9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JVVNIT1JUIHBjaWlkOwotCWludCAgICByb21wdHI7Ci0JVUNIQVIgICpteXJvbWJhc2U7Ci0JdTMyICAgIHRlbXA7Ci0JU0lTX0lPVFlQRTEgKnJvbV9iYXNlLCAqcm9tOworCVNJU19JT1RZUEUxICpyb21fYmFzZTsKKwl1bnNpZ25lZCBjaGFyICpteXJvbWJhc2UgPSBOVUxMOworCXUzMiB0ZW1wOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTEpCisJc2l6ZV90IHJvbXNpemU7CiAKLQlpZighKG15cm9tYmFzZSA9IHZtYWxsb2MoNjU1MzYpKSkgcmV0dXJuIE5VTEw7CisJLyogRmlyc3QsIHRyeSB0aGUgb2ZmaWNpYWwgcGNpIFJPTSBmdW5jdGlvbnMgKGV4Y2VwdAorCSAqIG9uIGludGVncmF0ZWQgY2hpcHNldHMgd2hpY2ggaGF2ZSBubyBST00pLgorCSAqLworCisJaWYoIWl2aWRlby0+bmJyaWRnZSkgeworCisJCWlmKChyb21fYmFzZSA9IHBjaV9tYXBfcm9tKHBkZXYsICZyb21zaXplKSkpIHsKKworCQkJaWYoc2lzZmJfY2hlY2tfcm9tKHJvbV9iYXNlLCBpdmlkZW8pKSB7CisKKwkJCQlpZigobXlyb21iYXNlID0gdm1hbGxvYyg2NTUzNikpKSB7CisKKwkJCQkJLyogV29yayBhcm91bmQgYnVnIGluIHBjaS9yb20uYzogRm9sa3MgZm9yZ290IHRvIGNoZWNrCisJCQkJCSAqIHdoZXRoZXIgdGhlIHNpemUgcmV0cmlldmVkIGZyb20gdGhlIEJJT1MgaW1hZ2UgZXZlbnR1YWxseQorCQkJCQkgKiBpcyBsYXJnZXIgdGhhbiB0aGUgbWFwcGVkIHNpemUKKwkJCQkJICovCisJCQkJCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgUENJX1JPTV9SRVNPVVJDRSkgPCByb21zaXplKQorCQkJCQkJcm9tc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CisKKwkJCQkJbWVtY3B5X2Zyb21pbyhteXJvbWJhc2UsIHJvbV9iYXNlLAorCQkJCQkJCShyb21zaXplID4gNjU1MzYpID8gNjU1MzYgOiByb21zaXplKTsKKwkJCQl9CisJCQl9CisJCQlwY2lfdW5tYXBfcm9tKHBkZXYsIHJvbV9iYXNlKTsKKwkJfQorCX0KKworCWlmKG15cm9tYmFzZSkgcmV0dXJuIG15cm9tYmFzZTsKKyNlbmRpZgorCisJLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBjb252ZW50aW9uYWwgd2F5LiAqLwogCiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQogCi0gICAgICAgIGZvcih0ZW1wID0gMHgwMDBjMDAwMDsgdGVtcCA8IDB4MDAwZjAwMDA7IHRlbXAgKz0gMHgwMDAwMTAwMCkgeworCWZvcih0ZW1wID0gMHgwMDBjMDAwMDsgdGVtcCA8IDB4MDAwZjAwMDA7IHRlbXAgKz0gMHgwMDAwMTAwMCkgewogCi0gICAgICAgICAgICByb21fYmFzZSA9IGlvcmVtYXAodGVtcCwgMHgxMDAwMCk7Ci0JICAgIGlmKCFyb21fYmFzZSkgY29udGludWU7CisJCXJvbV9iYXNlID0gaW9yZW1hcCh0ZW1wLCA2NTUzNik7CisJCWlmKCFyb21fYmFzZSkKKwkJCWNvbnRpbnVlOwogCi0JICAgIGlmKChyZWFkYihyb21fYmFzZSkgIT0gMHg1NSkgfHwgKHJlYWRiKHJvbV9iYXNlICsgMSkgIT0gMHhhYSkpIHsKLQkgICAgICAgaW91bm1hcChyb21fYmFzZSk7Ci0gICAgICAgICAgICAgICBjb250aW51ZTsKLQkgICAgfQorCQlpZighc2lzZmJfY2hlY2tfcm9tKHJvbV9iYXNlLCBpdmlkZW8pKSB7CisJCQlpb3VubWFwKHJvbV9iYXNlKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKLQkgICAgcm9tcHRyID0gKHVuc2lnbmVkIHNob3J0KShyZWFkYihyb21fYmFzZSArIDB4MTgpIHwgKHJlYWRiKHJvbV9iYXNlICsgMHgxOSkgPDwgOCkpOwotCSAgICBpZihyb21wdHIgPiAoMHgxMDAwMCAtIDgpKSB7Ci0JICAgICAgIGlvdW5tYXAocm9tX2Jhc2UpOwotCSAgICAgICBjb250aW51ZTsKLQkgICAgfQorCQlpZigobXlyb21iYXNlID0gdm1hbGxvYyg2NTUzNikpKQorCQkJbWVtY3B5X2Zyb21pbyhteXJvbWJhc2UsIHJvbV9iYXNlLCA2NTUzNik7CiAKLQkgICAgcm9tID0gcm9tX2Jhc2UgKyByb21wdHI7CisJCWlvdW5tYXAocm9tX2Jhc2UpOworCQlicmVhazsKIAotCSAgICBpZigocmVhZGIocm9tKSAgICAgIT0gJ1AnKSB8fCAocmVhZGIocm9tICsgMSkgIT0gJ0MnKSB8fAotCSAgICAgICAocmVhZGIocm9tICsgMikgIT0gJ0knKSB8fCAocmVhZGIocm9tICsgMykgIT0gJ1InKSkgewotCSAgICAgICBpb3VubWFwKHJvbV9iYXNlKTsKLQkgICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgICBwY2lpZCA9IHJlYWRiKHJvbSArIDQpIHwgKHJlYWRiKHJvbSArIDUpIDw8IDgpOwotCSAgICBpZihwY2lpZCAhPSAweDEwMzkpIHsKLQkgICAgICAgaW91bm1hcChyb21fYmFzZSk7Ci0JICAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgICAgcGNpaWQgPSByZWFkYihyb20gKyA2KSB8IChyZWFkYihyb20gKyA3KSA8PCA4KTsKLQkgICAgaWYocGNpaWQgPT0gaXZpZGVvLT5jaGlwX2lkKSB7Ci0JICAgICAgIG1lbWNweV9mcm9taW8obXlyb21iYXNlLCByb21fYmFzZSwgNjU1MzYpOwotCSAgICAgICBpb3VubWFwKHJvbV9iYXNlKTsKLQkgICAgICAgcmV0dXJuIG15cm9tYmFzZTsKLQkgICAgfQotCi0JICAgIGlvdW5tYXAocm9tX2Jhc2UpOwogICAgICAgICB9CiAKICNlbHNlCkBAIC00MDM0LDc1MiArNDI4NiwxNjAzIEBACiAKIAlyb21fYmFzZSA9IGlvcmVtYXAoaXZpZGVvLT52aWRlb19iYXNlLCA2NTUzNik7CiAJaWYocm9tX2Jhc2UpIHsKLQkgICBpZigocmVhZGIocm9tX2Jhc2UpID09IDB4NTUpICYmIChyZWFkYihyb21fYmFzZSArIDEpID09IDB4YWEpKSB7Ci0JICAgICAgcm9tcHRyID0gKHUxNikocmVhZGIocm9tX2Jhc2UgKyAweDE4KSB8IChyZWFkYihyb21fYmFzZSArIDB4MTkpIDw8IDgpKTsKLQkgICAgICBpZihyb21wdHIgPD0gKDB4MTAwMDAgLSA4KSkgewotCSAgICAgICAgIHJvbSA9IHJvbV9iYXNlICsgcm9tcHRyOwotCQkgaWYoKHJlYWRiKHJvbSkgICAgID09ICdQJykgJiYgKHJlYWRiKHJvbSArIDEpID09ICdDJykgJiYKLQkJICAgIChyZWFkYihyb20gKyAyKSA9PSAnSScpICYmIChyZWFkYihyb20gKyAzKSA9PSAnUicpKSB7Ci0JCSAgICBwY2lpZCA9IHJlYWRiKHJvbSArIDQpIHwgKHJlYWRiKHJvbSArIDUpIDw8IDgpOwotCQkgICAgaWYocGNpaWQgPT0gMHgxMDM5KSB7Ci0JCSAgICAgICBwY2lpZCA9IHJlYWRiKHJvbSArIDYpIHwgKHJlYWRiKHJvbSArIDcpIDw8IDgpOwotCQkgICAgICAgaWYocGNpaWQgPT0gaXZpZGVvLT5jaGlwX2lkKSB7Ci0JCQkgIG1lbWNweV9mcm9taW8obXlyb21iYXNlLCByb21fYmFzZSwgNjU1MzYpOwotCQkJICBpb3VubWFwKHJvbV9iYXNlKTsKLQkJCSAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUk9NX0FERFJFU1MsIHRlbXApOwotCQkJICByZXR1cm4gbXlyb21iYXNlOwotCQkgICAgICAgfQotCQkgICAgfQotCQkgfQotCSAgICAgIH0KLQkgICB9Ci0JICAgaW91bm1hcChyb21fYmFzZSk7CisJCWlmKHNpc2ZiX2NoZWNrX3JvbShyb21fYmFzZSwgaXZpZGVvKSkgeworCQkJaWYoKG15cm9tYmFzZSA9IHZtYWxsb2MoNjU1MzYpKSkKKwkJCQltZW1jcHlfZnJvbWlvKG15cm9tYmFzZSwgcm9tX2Jhc2UsIDY1NTM2KTsKKwkJfQorCQlpb3VubWFwKHJvbV9iYXNlKTsKIAl9Ci0gICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX1JPTV9BRERSRVNTLCB0ZW1wKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX1JPTV9BRERSRVNTLCB0ZW1wKTsKIAogI2VuZGlmCiAKLSAgICAgICAJdmZyZWUobXlyb21iYXNlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisJcmV0dXJuIG15cm9tYmFzZTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9wb3N0X21hcF92cmFtKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCB1bnNpZ25lZCBpbnQgKm1hcHNpemUsCisJCQl1bnNpZ25lZCBpbnQgbWluKQoreworCWl2aWRlby0+dmlkZW9fdmJhc2UgPSBpb3JlbWFwKGl2aWRlby0+dmlkZW9fYmFzZSwgKCptYXBzaXplKSk7CisKKwlpZighaXZpZGVvLT52aWRlb192YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJzaXNmYjogVW5hYmxlIHRvIG1hcCBtYXhpbXVtIHZpZGVvIFJBTSBmb3Igc2l6ZSBkZXRlY3Rpb25cbiIpOworCQkoKm1hcHNpemUpID4+PSAxOworCQl3aGlsZSgoIShpdmlkZW8tPnZpZGVvX3ZiYXNlID0gaW9yZW1hcChpdmlkZW8tPnZpZGVvX2Jhc2UsICgqbWFwc2l6ZSkpKSkpIHsKKwkJCSgqbWFwc2l6ZSkgPj49IDE7CisJCQlpZigoKm1hcHNpemUpIDwgKG1pbiA8PCAyMCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoaXZpZGVvLT52aWRlb192YmFzZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJInNpc2ZiOiBWaWRlbyBSQU0gc2l6ZSBkZXRlY3Rpb24gbGltaXRlZCB0byAlZE1CXG4iLAorCQkJCShpbnQpKCgqbWFwc2l6ZSkgPj4gMjApKTsKKwkJfQorCX0KIH0KIAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiBzdGF0aWMgaW50IF9fZGV2aW5pdAotc2lzZmJfY2hrYnVzd2lkdGgzMDAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIFNJU19JT1RZUEUxICpGQkFkZHJlc3MpCitzaXNmYl9wb3N0XzMwMF9idXN3aWR0aChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbykKIHsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlTSVNfSU9UWVBFMSAqRkJBZGRyZXNzID0gaXZpZGVvLT52aWRlb192YmFzZTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOworCXVuc2lnbmVkIGNoYXIgcmVnOwogCWludCBpLCBqOwotCVVTSE9SVCB0ZW1wOwotCVVDSEFSIHJlZzsKIAotCWFuZFNJU0lEWFJFRyhTSVNTUiwweDE1LDB4RkIpOwotCW9yU0lTSURYUkVHKFNJU1NSLDB4MTUsMHgwNCk7Ci0gICAJb3V0U0lTSURYUkVHKFNJU1NSLDB4MTMsMHgwMCk7Ci0gICAJb3V0U0lTSURYUkVHKFNJU1NSLDB4MTQsMHhCRik7CisJYW5kU0lTSURYUkVHKFNJU1NSLCAweDE1LCAweEZCKTsKKwlvclNJU0lEWFJFRyhTSVNTUiwgMHgxNSwgMHgwNCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDAwKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4QkYpOwogCi0JZm9yKGk9MDsgaTwyOyBpKyspIHsKLQkgICB0ZW1wID0gMHgxMjM0OwotCSAgIGZvcihqPTA7IGo8NDsgaisrKSB7Ci0JICAgICAgd3JpdGV3KHRlbXAsIEZCQWRkcmVzcyk7Ci0JICAgICAgaWYocmVhZHcoRkJBZGRyZXNzKSA9PSB0ZW1wKSBicmVhazsKLQkgICAgICBvclNJU0lEWFJFRyhTSVNTUiwweDNjLDB4MDEpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MDUscmVnKTsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNTUiwweDA1LHJlZyk7Ci0JICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLDB4M2MsMHhmZSk7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgwNSxyZWcpOwotCSAgICAgIGluU0lTSURYUkVHKFNJU1NSLDB4MDUscmVnKTsKLQkgICAgICB0ZW1wKys7Ci0JICAgfQorCWZvcihpID0gMDsgaSA8IDI7IGkrKykgeworCQl0ZW1wID0gMHgxMjM0OworCQlmb3IoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCXdyaXRldyh0ZW1wLCBGQkFkZHJlc3MpOworCQkJaWYocmVhZHcoRkJBZGRyZXNzKSA9PSB0ZW1wKQorCQkJCWJyZWFrOworCQkJb3JTSVNJRFhSRUcoU0lTU1IsIDB4M2MsIDB4MDEpOworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MDUsIHJlZyk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgcmVnKTsKKwkJCWFuZFNJU0lEWFJFRyhTSVNTUiwgMHgzYywgMHhmZSk7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgcmVnKTsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDA1LCByZWcpOworCQkJdGVtcCsrOworCQl9CiAJfQogCiAJd3JpdGVsKDB4MDEyMzQ1NjdMLCBGQkFkZHJlc3MpOwotCXdyaXRlbCgweDQ1Njc4OUFCTCwgKEZCQWRkcmVzcys0KSk7Ci0Jd3JpdGVsKDB4ODlBQkNERUZMLCAoRkJBZGRyZXNzKzgpKTsKLQl3cml0ZWwoMHhDREVGMDEyM0wsIChGQkFkZHJlc3MrMTIpKTsKLQlpblNJU0lEWFJFRyhTSVNTUiwweDNiLHJlZyk7CisJd3JpdGVsKDB4NDU2Nzg5QUJMLCAoRkJBZGRyZXNzICsgNCkpOworCXdyaXRlbCgweDg5QUJDREVGTCwgKEZCQWRkcmVzcyArIDgpKTsKKwl3cml0ZWwoMHhDREVGMDEyM0wsIChGQkFkZHJlc3MgKyAxMikpOworCisJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2IsIHJlZyk7CiAJaWYocmVnICYgMHgwMSkgewotCSAgIGlmKHJlYWRsKChGQkFkZHJlc3MrMTIpKSA9PSAweENERUYwMTIzTCkgcmV0dXJuKDQpOyAgLyogQ2hhbm5lbCBBIDEyOGJpdCAqLworCQlpZihyZWFkbCgoRkJBZGRyZXNzICsgMTIpKSA9PSAweENERUYwMTIzTCkKKwkJCXJldHVybiA0OwkvKiBDaGFubmVsIEEgMTI4Yml0ICovCiAJfQotCWlmKHJlYWRsKChGQkFkZHJlc3MrNCkpID09IDB4NDU2Nzg5QUJMKSAgICAgcmV0dXJuKDIpOyAgLyogQ2hhbm5lbCBCIDY0Yml0ICovCi0JcmV0dXJuKDEpOwkJCQkJCS8qIDMyYml0ICovCisKKwlpZihyZWFkbCgoRkJBZGRyZXNzICsgNCkpID09IDB4NDU2Nzg5QUJMKQorCQlyZXR1cm4gMjsJCS8qIENoYW5uZWwgQiA2NGJpdCAqLworCisJcmV0dXJuIDE7CQkJLyogMzJiaXQgKi8KK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3Npc2ZiX3Bvc3RfMzAwX3J3dGVzdChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IGl0ZXJhdGlvbiwgaW50IGJ1c3dpZHRoLAorCQkJaW50IFBzZXVkb1JhbmtDYXBhY2l0eSwgaW50IFBzZXVkb0FkclBpbkNvdW50LAorCQkJdW5zaWduZWQgaW50IG1hcHNpemUpCit7CisJU0lTX0lPVFlQRTEgKkZCQWRkciA9IGl2aWRlby0+dmlkZW9fdmJhc2U7CisJdW5zaWduZWQgc2hvcnQgc3IxNDsKKwl1bnNpZ25lZCBpbnQgaywgUmFua0NhcGFjaXR5LCBQYWdlQ2FwYWNpdHksIEJhbmtOdW1IaWdoLCBCYW5rTnVtTWlkOworCXVuc2lnbmVkIGludCBQaHlzaWNhbEFkck90aGVyUGFnZSwgUGh5c2ljYWxBZHJIaWdoLCBQaHlzaWNhbEFkckhhbGZQYWdlOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTaVNfRFJBTVR5cGVbMTddWzVdID0geworCQl7MHgwQywweDBBLDB4MDIsMHg0MCwweDM5fSwKKwkJezB4MEQsMHgwQSwweDAxLDB4NDAsMHg0OH0sCisJCXsweDBDLDB4MDksMHgwMiwweDIwLDB4MzV9LAorCQl7MHgwRCwweDA5LDB4MDEsMHgyMCwweDQ0fSwKKwkJezB4MEMsMHgwOCwweDAyLDB4MTAsMHgzMX0sCisJCXsweDBELDB4MDgsMHgwMSwweDEwLDB4NDB9LAorCQl7MHgwQywweDBBLDB4MDEsMHgyMCwweDM0fSwKKwkJezB4MEMsMHgwOSwweDAxLDB4MDgsMHgzMn0sCisJCXsweDBCLDB4MDgsMHgwMiwweDA4LDB4MjF9LAorCQl7MHgwQywweDA4LDB4MDEsMHgwOCwweDMwfSwKKwkJezB4MEEsMHgwOCwweDAyLDB4MDQsMHgxMX0sCisJCXsweDBCLDB4MEEsMHgwMSwweDEwLDB4Mjh9LAorCQl7MHgwOSwweDA4LDB4MDIsMHgwMiwweDAxfSwKKwkJezB4MEIsMHgwOSwweDAxLDB4MDgsMHgyNH0sCisJCXsweDBCLDB4MDgsMHgwMSwweDA0LDB4MjB9LAorCQl7MHgwQSwweDA4LDB4MDEsMHgwMiwweDEwfSwKKwkJezB4MDksMHgwOCwweDAxLDB4MDEsMHgwMH0KKwl9OworCisJIGZvcihrID0gMDsgayA8PSAxNjsgaysrKSB7CisKKwkJUmFua0NhcGFjaXR5ID0gYnVzd2lkdGggKiBTaVNfRFJBTVR5cGVba11bM107CisKKwkJaWYoUmFua0NhcGFjaXR5ICE9IFBzZXVkb1JhbmtDYXBhY2l0eSkKKwkJCWNvbnRpbnVlOworCisJCWlmKChTaVNfRFJBTVR5cGVba11bMl0gKyBTaVNfRFJBTVR5cGVba11bMF0pID4gUHNldWRvQWRyUGluQ291bnQpCisJCQljb250aW51ZTsKKworCQlCYW5rTnVtSGlnaCA9IFJhbmtDYXBhY2l0eSAqIDE2ICogaXRlcmF0aW9uIC0gMTsKKwkJaWYoaXRlcmF0aW9uID09IDMpIHsgICAgICAgICAgICAgLyogUmFuayBObyAqLworCQkJQmFua051bU1pZCAgPSBSYW5rQ2FwYWNpdHkgKiAxNiAtIDE7CisJCX0gZWxzZSB7CisJCQlCYW5rTnVtTWlkICA9IFJhbmtDYXBhY2l0eSAqIDE2ICogaXRlcmF0aW9uIC8gMiAtIDE7CisJCX0KKworCQlQYWdlQ2FwYWNpdHkgPSAoMSA8PCBTaVNfRFJBTVR5cGVba11bMV0pICogYnVzd2lkdGggKiA0OworCQlQaHlzaWNhbEFkckhpZ2ggPSBCYW5rTnVtSGlnaDsKKwkJUGh5c2ljYWxBZHJIYWxmUGFnZSA9IChQYWdlQ2FwYWNpdHkgLyAyICsgUGh5c2ljYWxBZHJIaWdoKSAlIFBhZ2VDYXBhY2l0eTsKKwkJUGh5c2ljYWxBZHJPdGhlclBhZ2UgPSBQYWdlQ2FwYWNpdHkgKiBTaVNfRFJBTVR5cGVba11bMl0gKyBQaHlzaWNhbEFkckhpZ2g7CisKKwkJYW5kU0lTSURYUkVHKFNJU1NSLCAweDE1LCAweEZCKTsgLyogVGVzdCAqLworCQlvclNJU0lEWFJFRyhTSVNTUiwgMHgxNSwgMHgwNCk7ICAvKiBUZXN0ICovCisJCXNyMTQgPSAoU2lTX0RSQU1UeXBlW2tdWzNdICogYnVzd2lkdGgpIC0gMTsKKwkJaWYoYnVzd2lkdGggPT0gNCkgICAgICBzcjE0IHw9IDB4ODA7CisJCWVsc2UgaWYoYnVzd2lkdGggPT0gMikgc3IxNCB8PSAweDQwOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIFNpU19EUkFNVHlwZVtrXVs0XSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgc3IxNCk7CisKKwkJQmFua051bUhpZ2ggPDw9IDE2OworCQlCYW5rTnVtTWlkIDw8PSAxNjsKKworCQlpZigoQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkckhpZ2ggICAgICA+PSBtYXBzaXplKSB8fAorCQkgICAoQmFua051bU1pZCAgKyBQaHlzaWNhbEFkckhpZ2ggICAgICA+PSBtYXBzaXplKSB8fAorCQkgICAoQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkckhhbGZQYWdlICA+PSBtYXBzaXplKSB8fAorCQkgICAoQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkck90aGVyUGFnZSA+PSBtYXBzaXplKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFdyaXRlIGRhdGEgKi8KKwkJd3JpdGV3KCgodW5zaWduZWQgc2hvcnQpUGh5c2ljYWxBZHJIaWdoKSwKKwkJCQkoRkJBZGRyICsgQmFua051bUhpZ2ggKyBQaHlzaWNhbEFkckhpZ2gpKTsKKwkJd3JpdGV3KCgodW5zaWduZWQgc2hvcnQpQmFua051bU1pZCksCisJCQkJKEZCQWRkciArIEJhbmtOdW1NaWQgICsgUGh5c2ljYWxBZHJIaWdoKSk7CisJCXdyaXRldygoKHVuc2lnbmVkIHNob3J0KVBoeXNpY2FsQWRySGFsZlBhZ2UpLAorCQkJCShGQkFkZHIgKyBCYW5rTnVtSGlnaCArIFBoeXNpY2FsQWRySGFsZlBhZ2UpKTsKKwkJd3JpdGV3KCgodW5zaWduZWQgc2hvcnQpUGh5c2ljYWxBZHJPdGhlclBhZ2UpLAorCQkJCShGQkFkZHIgKyBCYW5rTnVtSGlnaCArIFBoeXNpY2FsQWRyT3RoZXJQYWdlKSk7CisKKwkJLyogUmVhZCBkYXRhICovCisJCWlmKHJlYWR3KEZCQWRkciArIEJhbmtOdW1IaWdoICsgUGh5c2ljYWxBZHJIaWdoKSA9PSBQaHlzaWNhbEFkckhpZ2gpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0Ci1zaXNmYl9zZXRyYW1zaXplMzAwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc2lzZmJfcG9zdF8zMDBfcmFtc2l6ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IG1hcHNpemUpCiB7Ci0Jc3RydWN0ICBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotICAJU0lTX0lPVFlQRTEgKkZCQWRkciA9IGl2aWRlby0+dmlkZW9fdmJhc2U7Ci0JU0lTX0lPVFlQRTEgKkFkZHI7Ci0JVVNIT1JUIAlzcjEzLCBzcjE0PTAsIGJ1c3dpZHRoLCBEb25lLCBkYXRhLCBUb3RhbENhcGFjaXR5LCBQaHlzaWNhbEFkck90aGVyUGFnZT0wOwotCWludCAgICAgUHNldWRvUmFua0NhcGFjaXR5LCBQc2V1ZG9Ub3RhbENhcGFjaXR5LCBQc2V1ZG9BZHJQaW5Db3VudDsKLSAgIAlpbnQgICAgIFJhbmtDYXBhY2l0eSwgQWRyUGluQ291bnQsIEJhbmtOdW1IaWdoLCBCYW5rTnVtTWlkLCBNQjJCYW5rOwotICAgCWludCAgICAgUGFnZUNhcGFjaXR5LCBQaHlzaWNhbEFkckhpZ2gsIFBoeXNpY2FsQWRySGFsZlBhZ2UsIGksIGosIGs7Ci0JY29uc3QgCVVTSE9SVCBTaVNfRFJBTVR5cGVbMTddWzVdID0gewotCQkJezB4MEMsMHgwQSwweDAyLDB4NDAsMHgzOX0sCi0JCQl7MHgwRCwweDBBLDB4MDEsMHg0MCwweDQ4fSwKLQkJCXsweDBDLDB4MDksMHgwMiwweDIwLDB4MzV9LAotCQkJezB4MEQsMHgwOSwweDAxLDB4MjAsMHg0NH0sCi0JCQl7MHgwQywweDA4LDB4MDIsMHgxMCwweDMxfSwKLQkJCXsweDBELDB4MDgsMHgwMSwweDEwLDB4NDB9LAotCQkJezB4MEMsMHgwQSwweDAxLDB4MjAsMHgzNH0sCi0JCQl7MHgwQywweDA5LDB4MDEsMHgwOCwweDMyfSwKLQkJCXsweDBCLDB4MDgsMHgwMiwweDA4LDB4MjF9LAotCQkJezB4MEMsMHgwOCwweDAxLDB4MDgsMHgzMH0sCi0JCQl7MHgwQSwweDA4LDB4MDIsMHgwNCwweDExfSwKLQkJCXsweDBCLDB4MEEsMHgwMSwweDEwLDB4Mjh9LAotCQkJezB4MDksMHgwOCwweDAyLDB4MDIsMHgwMX0sCi0JCQl7MHgwQiwweDA5LDB4MDEsMHgwOCwweDI0fSwKLQkJCXsweDBCLDB4MDgsMHgwMSwweDA0LDB4MjB9LAotCQkJezB4MEEsMHgwOCwweDAxLDB4MDIsMHgxMH0sCi0JCQl7MHgwOSwweDA4LDB4MDEsMHgwMSwweDAwfQotCQl9OworCXN0cnVjdAlzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludAlpLCBqLCBidXN3aWR0aDsKKwlpbnQJUHNldWRvUmFua0NhcGFjaXR5LCBQc2V1ZG9BZHJQaW5Db3VudDsKIAotICAgICAgICBidXN3aWR0aCA9IHNpc2ZiX2Noa2J1c3dpZHRoMzAwKHBkZXYsIEZCQWRkcik7CisJYnVzd2lkdGggPSBzaXNmYl9wb3N0XzMwMF9idXN3aWR0aChpdmlkZW8pOwogCi0gICAJTUIyQmFuayA9IDE2OwotICAgCURvbmUgPSAwOwotICAgCWZvcihpID0gNjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIAkgICBpZihEb25lKSBicmVhazsKLSAgICAgIAkgICBQc2V1ZG9SYW5rQ2FwYWNpdHkgPSAxIDw8IGk7Ci0gICAgICAJICAgZm9yKGogPSA0OyBqID49IDE7IGotLSkgewotICAgICAgICAgICAgICBpZihEb25lKSBicmVhazsKLSAgICAgICAgICAgICAgUHNldWRvVG90YWxDYXBhY2l0eSA9IFBzZXVkb1JhbmtDYXBhY2l0eSAqIGo7Ci0gICAgICAgICAgICAgIFBzZXVkb0FkclBpbkNvdW50ID0gMTUgLSBqOwotICAgICAgICAgICAgICBpZihQc2V1ZG9Ub3RhbENhcGFjaXR5IDw9IDY0KSB7Ci0gICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8PSAxNjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKERvbmUpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBSYW5rQ2FwYWNpdHkgPSBidXN3aWR0aCAqIFNpU19EUkFNVHlwZVtrXVszXTsKLSAgICAgICAgICAgICAgICAgICAgQWRyUGluQ291bnQgPSBTaVNfRFJBTVR5cGVba11bMl0gKyBTaVNfRFJBTVR5cGVba11bMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmKFJhbmtDYXBhY2l0eSA9PSBQc2V1ZG9SYW5rQ2FwYWNpdHkpCi0gICAgICAgICAgICAgICAgICAgICAgIGlmKEFkclBpbkNvdW50IDw9IFBzZXVkb0FkclBpbkNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGogPT0gMykgeyAgICAgICAgICAgICAvKiBSYW5rIE5vICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtOdW1IaWdoID0gUmFua0NhcGFjaXR5ICogTUIyQmFuayAqIDMgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5rTnVtTWlkICA9IFJhbmtDYXBhY2l0eSAqIE1CMkJhbmsgKiAxIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFua051bUhpZ2ggPSBSYW5rQ2FwYWNpdHkgKiBNQjJCYW5rICogaiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmtOdW1NaWQgID0gUmFua0NhcGFjaXR5ICogTUIyQmFuayAqIGogLyAyIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlQ2FwYWNpdHkgPSAoMSA8PCBTaVNfRFJBTVR5cGVba11bMV0pICogYnVzd2lkdGggKiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzaWNhbEFkckhpZ2ggPSBCYW5rTnVtSGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxBZHJIYWxmUGFnZSA9IChQYWdlQ2FwYWNpdHkgLyAyICsgUGh5c2ljYWxBZHJIaWdoKSAlIFBhZ2VDYXBhY2l0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxBZHJPdGhlclBhZ2UgPSBQYWdlQ2FwYWNpdHkgKiBTaVNfRFJBTVR5cGVba11bMl0gKyBQaHlzaWNhbEFkckhpZ2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLDB4MTUsMHhGQik7IC8qIFRlc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsMHgxNSwweDA0KTsgIC8qIFRlc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxDYXBhY2l0eSA9IFNpU19EUkFNVHlwZVtrXVszXSAqIGJ1c3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzcjEzID0gU2lTX0RSQU1UeXBlW2tdWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZihidXN3aWR0aCA9PSA0KSBzcjE0ID0gKFRvdGFsQ2FwYWNpdHkgLSAxKSB8IDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJ1c3dpZHRoID09IDIpIHNyMTQgPSAoVG90YWxDYXBhY2l0eSAtIDEpIHwgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYnVzd2lkdGggPT0gMSkgc3IxNCA9IChUb3RhbENhcGFjaXR5IC0gMSkgfCAweDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxMyxzcjEzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4MTQsc3IxNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIgPSBGQkFkZHIgKyBCYW5rTnVtSGlnaCAqIDY0ICogMTAyNCArIFBoeXNpY2FsQWRySGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKigoVVNIT1JUICopKEFkZHIpKSA9IChVU0hPUlQpUGh5c2ljYWxBZHJIaWdoOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpUGh5c2ljYWxBZHJIaWdoKSwgQWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIgPSBGQkFkZHIgKyBCYW5rTnVtTWlkICogNjQgKiAxMDI0ICsgUGh5c2ljYWxBZHJIaWdoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAqKChVU0hPUlQgKikoQWRkcikpID0gKFVTSE9SVClCYW5rTnVtTWlkOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpQmFua051bU1pZCksIEFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyID0gRkJBZGRyICsgQmFua051bUhpZ2ggKiA2NCAqIDEwMjQgKyBQaHlzaWNhbEFkckhhbGZQYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAqKChVU0hPUlQgKikoQWRkcikpID0gKFVTSE9SVClQaHlzaWNhbEFkckhhbGZQYWdlOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpUGh5c2ljYWxBZHJIYWxmUGFnZSksIEFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyID0gRkJBZGRyICsgQmFua051bUhpZ2ggKiA2NCAqIDEwMjQgKyBQaHlzaWNhbEFkck90aGVyUGFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKigoVVNIT1JUICopKEFkZHIpKSA9IFBoeXNpY2FsQWRyT3RoZXJQYWdlOyAqLwotCQkJICB3cml0ZXcoKChVU0hPUlQpUGh5c2ljYWxBZHJPdGhlclBhZ2UpLCBBZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIgPSBGQkFkZHIgKyBCYW5rTnVtSGlnaCAqIDY0ICogMTAyNCArIFBoeXNpY2FsQWRySGlnaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWR3KEFkZHIpOyAvKiAqKChVU0hPUlQgKikoQWRkcikpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhID09IFBoeXNpY2FsQWRySGlnaCkgRG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0gIC8qIGlmICovCi0gICAgICAgICAgICAgICAgIH0gIC8qIGZvciBrICovCi0gICAgICAgICAgICAgIH0gIC8qIGlmICovCi0gICAgICAJICAgfSAgLyogZm9yIGogKi8KLSAgIAl9ICAvKiBmb3IgaSAqLworCWZvcihpID0gNjsgaSA+PSAwOyBpLS0pIHsKKwkJUHNldWRvUmFua0NhcGFjaXR5ID0gMSA8PCBpOworCQlmb3IoaiA9IDQ7IGogPj0gMTsgai0tKSB7CisJCQlQc2V1ZG9BZHJQaW5Db3VudCA9IDE1IC0gajsKKwkJCWlmKChQc2V1ZG9SYW5rQ2FwYWNpdHkgKiBqKSA8PSA2NCkgeworCQkJCWlmKHNpc2ZiX3Bvc3RfMzAwX3J3dGVzdChpdmlkZW8sCisJCQkJCQlqLAorCQkJCQkJYnVzd2lkdGgsCisJCQkJCQlQc2V1ZG9SYW5rQ2FwYWNpdHksCisJCQkJCQlQc2V1ZG9BZHJQaW5Db3VudCwKKwkJCQkJCW1hcHNpemUpKQorCQkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzaXNmYl9wb3N0X3NpczMwMChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfcG9zdF9zaXMzMDAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgY2hhciAqYmlvcyA9IGl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlOwogCXU4ICByZWcsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2ODsKIAl1MTYgaW5kZXgsIHJpbmRleCwgbWVtdHlwZSA9IDA7CisJdW5zaWduZWQgaW50IG1hcHNpemU7CiAKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNSwweDg2KTsKKwlpZighaXZpZGVvLT5TaVNfUHIuVXNlUk9NKQorCQliaW9zID0gTlVMTDsKIAotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg1Ml0gJiAweDgwKSB7Ci0JICAgICAgbWVtdHlwZSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg1Ml07Ci0gCSAgIH0gZWxzZSB7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTU1IsMHgzYSxtZW10eXBlKTsKLQkgICB9Ci0JICAgbWVtdHlwZSAmPSAweDA3OworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwlpZihiaW9zKSB7CisJCWlmKGJpb3NbMHg1Ml0gJiAweDgwKSB7CisJCQltZW10eXBlID0gYmlvc1sweDUyXTsKKwkJfSBlbHNlIHsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDNhLCBtZW10eXBlKTsKKwkJfQorCQltZW10eXBlICY9IDB4MDc7CiAJfQogCisJdjMgPSAweDgwOyB2NiA9IDB4ODA7CiAJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA8PSAweDEzKSB7Ci0JICAgdjEgPSAweDQ0OyB2MiA9IDB4NDI7IHYzID0gMHg4MDsKLQkgICB2NCA9IDB4NDQ7IHY1ID0gMHg0MjsgdjYgPSAweDgwOworCQl2MSA9IDB4NDQ7IHYyID0gMHg0MjsKKwkJdjQgPSAweDQ0OyB2NSA9IDB4NDI7CiAJfSBlbHNlIHsKLQkgICB2MSA9IDB4Njg7IHYyID0gMHg0MzsgdjMgPSAweDgwOyAgLyogQXNzdW1lIDEyNU1oeiBNQ0xLICovCi0JICAgdjQgPSAweDY4OyB2NSA9IDB4NDM7IHY2ID0gMHg4MDsgIC8qIEFzc3VtZSAxMjVNaHogRUNMSyAqLwotCSAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgICAgIGluZGV4ID0gbWVtdHlwZSAqIDU7Ci0JICAgICAgcmluZGV4ID0gaW5kZXggKyAweDU0OwotCSAgICAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQkgICAgICB2MyA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgICAgIHJpbmRleCA9IGluZGV4ICsgMHg3YzsKLQkgICAgICB2NCA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgICAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgICAgdjYgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQkgICB9CisJCXYxID0gMHg2ODsgdjIgPSAweDQzOyAvKiBBc3N1bWUgMTI1TWh6IE1DTEsgKi8KKwkJdjQgPSAweDY4OyB2NSA9IDB4NDM7IC8qIEFzc3VtZSAxMjVNaHogRUNMSyAqLworCQlpZihiaW9zKSB7CisJCQlpbmRleCA9IG1lbXR5cGUgKiA1OworCQkJcmluZGV4ID0gaW5kZXggKyAweDU0OworCQkJdjEgPSBiaW9zW3JpbmRleCsrXTsKKwkJCXYyID0gYmlvc1tyaW5kZXgrK107CisJCQl2MyA9IGJpb3NbcmluZGV4KytdOworCQkJcmluZGV4ID0gaW5kZXggKyAweDdjOworCQkJdjQgPSBiaW9zW3JpbmRleCsrXTsKKwkJCXY1ID0gYmlvc1tyaW5kZXgrK107CisJCQl2NiA9IGJpb3NbcmluZGV4KytdOworCQl9CiAJfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI4LHYxKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyOSx2Mik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MmEsdjMpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJlLHY0KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyZix2NSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MzAsdjYpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyOCwgdjEpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyOSwgdjIpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyYSwgdjMpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyZSwgdjQpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyZiwgdjUpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgzMCwgdjYpOworCiAJdjEgPSAweDEwOwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4YTRdOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDA3LHYxKTsgICAgICAgLyogREFDIHNwZWVkICovCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTEsMHgwZik7ICAgICAvKiBEREMsIHBvd2VyIHNhdmUgKi8KKwlpZihiaW9zKQorCQl2MSA9IGJpb3NbMHhhNF07CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDA3LCB2MSk7ICAgICAgIC8qIERBQyBzcGVlZCAqLworCisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDExLCAweDBmKTsgICAgIC8qIEREQywgcG93ZXIgc2F2ZSAqLworCiAJdjEgPSAweDAxOyB2MiA9IDB4NDM7IHYzID0gMHgxZTsgdjQgPSAweDJhOwogCXY1ID0gMHgwNjsgdjYgPSAweDAwOyB2NyA9IDB4MDA7IHY4ID0gMHgwMDsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBtZW10eXBlICs9IDB4YTU7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGVdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVttZW10eXBlICsgOF07Ci0JICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyAxNl07Ci0JICAgdjQgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyAyNF07Ci0JICAgdjUgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyAzMl07Ci0JICAgdjYgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyA0MF07Ci0JICAgdjcgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyA0OF07Ci0JICAgdjggPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW21lbXR5cGUgKyA1Nl07CisJaWYoYmlvcykgeworCQltZW10eXBlICs9IDB4YTU7CisJCXYxID0gYmlvc1ttZW10eXBlXTsKKwkJdjIgPSBiaW9zW21lbXR5cGUgKyA4XTsKKwkJdjMgPSBiaW9zW21lbXR5cGUgKyAxNl07CisJCXY0ID0gYmlvc1ttZW10eXBlICsgMjRdOworCQl2NSA9IGJpb3NbbWVtdHlwZSArIDMyXTsKKwkJdjYgPSBiaW9zW21lbXR5cGUgKyA0MF07CisJCXY3ID0gYmlvc1ttZW10eXBlICsgNDhdOworCQl2OCA9IGJpb3NbbWVtdHlwZSArIDU2XTsKIAl9Ci0JaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA+PSAweDgwKSB2MyAmPSAweGZkOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE1LHYxKTsgICAgICAgLyogUmFtIHR5cGUgKGFzc3VtaW5nIDAsIEJJT1MgMHhhNSBzdGVwIDgpICovCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTYsdjIpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE3LHYzKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxOCx2NCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTksdjUpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDFhLHY2KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxYix2Nyk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MWMsdjgpOwkgICAvKiAtLS0tICovCi0JYW5kU0lTSURYUkVHKFNJU1NSLDB4MTUsMHhmYik7Ci0Jb3JTSVNJRFhSRUcoU0lTU1IsMHgxNSwweDA0KTsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4NTNdICYgMHgwMikgewotCSAgICAgIG9yU0lTSURYUkVHKFNJU1NSLDB4MTksMHgyMCk7Ci0JICAgfQorCWlmKGl2aWRlby0+cmV2aXNpb25faWQgPj0gMHg4MCkKKwkJdjMgJj0gMHhmZDsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTUsIHYxKTsgICAgICAgLyogUmFtIHR5cGUgKGFzc3VtaW5nIDAsIEJJT1MgMHhhNSBzdGVwIDgpICovCisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCB2Mik7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE3LCB2Myk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2NCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCB2NSk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFhLCB2Nik7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCB2Nyk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFjLCB2OCk7CSAgIC8qIC0tLS0gKi8KKwlhbmRTSVNJRFhSRUcoU0lTU1IsIDB4MTUgLDB4ZmIpOworCW9yU0lTSURYUkVHKFNJU1NSLCAweDE1LCAweDA0KTsKKwlpZihiaW9zKSB7CisJCWlmKGJpb3NbMHg1M10gJiAweDAyKSB7CisJCQlvclNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgyMCk7CisJCX0KIAl9CiAJdjEgPSAweDA0OwkJCSAgIC8qIERBQyBwZWRlc3RhbCAoQklPUyAweGU1KSAqLwotCWlmKGl2aWRlby0+cmV2aXNpb25faWQgPj0gMHg4MCkgdjEgfD0gMHgwMTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxZix2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjAsMHhhMCk7ICAgICAvKiBsaW5lYXIgJiByZWxvY2F0ZWQgaW8gKi8KKwlpZihpdmlkZW8tPnJldmlzaW9uX2lkID49IDB4ODApCisJCXYxIHw9IDB4MDE7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFmLCB2MSk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIwLCAweGE0KTsgICAgIC8qIGxpbmVhciAmIHJlbG9jYXRlZCBpbyAmIGRpc2FibGUgYTAwMDAgKi8KIAl2MSA9IDB4ZjY7IHYyID0gMHgwZDsgdjMgPSAweDAwOwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGU4XTsKLQkgICB2MiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhlOV07Ci0JICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZWFdOworCWlmKGJpb3MpIHsKKwkJdjEgPSBiaW9zWzB4ZThdOworCQl2MiA9IGJpb3NbMHhlOV07CisJCXYzID0gYmlvc1sweGVhXTsKIAl9Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjMsdjEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI0LHYyKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyNSx2Myk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjEsMHg4NCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsMHgwMCk7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4MzcsMHgwMCk7Ci0Jb3JTSVNJRFhSRUcoU0lTUEFSVDEsMHgyNCwweDAxKTsgICAvKiB1bmxvY2sgY3J0MiAqLwotCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDAwLDB4MDApOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMywgdjEpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyNCwgdjIpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyNSwgdjMpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMSwgMHg4NCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIyLCAweDAwKTsKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4MzcsIDB4MDApOworCW9yU0lTSURYUkVHKFNJU1BBUlQxLCAweDI0LCAweDAxKTsgICAvKiB1bmxvY2sgY3J0MiAqLworCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMCwgMHgwMCk7CiAJdjEgPSAweDQwOyB2MiA9IDB4MTE7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZWNdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGViXTsKKwlpZihiaW9zKSB7CisJCXYxID0gYmlvc1sweGVjXTsKKwkJdjIgPSBiaW9zWzB4ZWJdOwogCX0KLQlvdXRTSVNJRFhSRUcoU0lTUEFSVDEsMHgwMix2MSk7Ci0JaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA+PSAweDgwKSB2MiAmPSB+MHgwMTsKLQlpblNJU0lEWFJFRyhTSVNQQVJUNCwweDAwLHJlZyk7CisJb3V0U0lTSURYUkVHKFNJU1BBUlQxLCAweDAyLCB2MSk7CisKKwlpZihpdmlkZW8tPnJldmlzaW9uX2lkID49IDB4ODApCisJCXYyICY9IH4weDAxOworCisJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDAsIHJlZyk7CiAJaWYoKHJlZyA9PSAxKSB8fCAocmVnID09IDIpKSB7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4MzcsMHgwMik7Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQyLDB4MDAsMHgxYyk7Ci0JICAgdjQgPSAweDAwOyB2NSA9IDB4MDA7IHY2ID0gMHgxMDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2NCA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhmNV07Ci0JICAgICAgdjUgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZjZdOwotCSAgICAgIHY2ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGY3XTsKLQkgICB9Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGQsdjQpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUNCwweDBlLHY1KTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgxMCx2Nik7Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGYsMHgzZik7Ci0JICAgaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgwMSxyZWcpOwotCSAgIGlmKHJlZyA+PSAweGIwKSB7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgyMyxyZWcpOwotCSAgICAgIHJlZyAmPSAweDIwOwotCSAgICAgIHJlZyA8PD0gMTsKLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgyMyxyZWcpOwotCSAgIH0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDM3LCAweDAyKTsKKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQyLCAweDAwLCAweDFjKTsKKwkJdjQgPSAweDAwOyB2NSA9IDB4MDA7IHY2ID0gMHgxMDsKKwkJaWYoaXZpZGVvLT5TaVNfUHIuVXNlUk9NKSB7CisJCQl2NCA9IGJpb3NbMHhmNV07CisJCQl2NSA9IGJpb3NbMHhmNl07CisJCQl2NiA9IGJpb3NbMHhmN107CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDBkLCB2NCk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwZSwgdjUpOworCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDQsIDB4MTAsIHY2KTsKKwkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDBmLCAweDNmKTsKKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDEsIHJlZyk7CisJCWlmKHJlZyA+PSAweGIwKSB7CisJCQlpblNJU0lEWFJFRyhTSVNQQVJUNCwgMHgyMywgcmVnKTsKKwkJCXJlZyAmPSAweDIwOworCQkJcmVnIDw8PSAxOworCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDIzLCByZWcpOworCQl9CiAJfSBlbHNlIHsKLQkgICB2MiAmPSB+MHgxMDsKKwkJdjIgJj0gfjB4MTA7CiAJfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDMyLHYyKTsKLQlhbmRTSVNJRFhSRUcoU0lTUEFSVDEsMHgyNCwweGZlKTsgIC8qIExvY2sgQ1JUMiAqLwotCWluU0lTSURYUkVHKFNJU1NSLDB4MTYscmVnKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzIsIHYyKTsKKworCWFuZFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgyNCwgMHhmZSk7ICAvKiBMb2NrIENSVDIgKi8KKworCWluU0lTSURYUkVHKFNJU1NSLCAweDE2LCByZWcpOwogCXJlZyAmPSAweGMzOwotCW91dFNJU0lEWFJFRyhTSVNDUiwweDM1LHJlZyk7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4ODMsMHgwMCk7CisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDM1LCByZWcpOworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4MywgMHgwMCk7CiAjaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCiAJaWYoc2lzZmJfdmlkZW9yYW0pIHsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxMywweDI4KTsgIC8qID8gKi8KLQkgICByZWcgPSAoKHNpc2ZiX3ZpZGVvcmFtID4+IDEwKSAtIDEpIHwgMHg0MDsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNCxyZWcpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4MjgpOyAgLyogPyAqLworCQlyZWcgPSAoKHNpc2ZiX3ZpZGVvcmFtID4+IDEwKSAtIDEpIHwgMHg0MDsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCByZWcpOwogCX0gZWxzZSB7CiAjZW5kaWYKLQkgICAvKiBOZWVkIHRvIG1hcCBtYXggRkIgc2l6ZSBmb3IgZmluZGluZyBvdXQgYWJvdXQgUkFNIHNpemUgKi8KLQkgICBpdmlkZW8tPnZpZGVvX3ZiYXNlID0gaW9yZW1hcChpdmlkZW8tPnZpZGVvX2Jhc2UsIDB4NDAwMDAwMCk7Ci0JICAgaWYoaXZpZGVvLT52aWRlb192YmFzZSkgewotCSAgICAgIHNpc2ZiX3NldHJhbXNpemUzMDAocGRldik7Ci0JICAgICAgaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKLQkgICB9IGVsc2UgewotCSAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogRmFpbGVkIHRvIG1hcCBtZW1vcnkgZm9yIHNpemUgZGV0ZWN0aW9uLCBhc3N1bWluZyA4TUJcbiIpOwotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDEzLDB4MjgpOyAgLyogPyAqLwotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDE0LDB4NDcpOyAgLyogOE1CLCA2NGJpdCBkZWZhdWx0ICovCi0JICAgfQorCQkvKiBOZWVkIHRvIG1hcCBtYXggRkIgc2l6ZSBmb3IgZmluZGluZyBvdXQgYWJvdXQgUkFNIHNpemUgKi8KKwkJbWFwc2l6ZSA9IDY0IDw8IDIwOworCQlzaXNmYl9wb3N0X21hcF92cmFtKGl2aWRlbywgJm1hcHNpemUsIDQpOworCisJCWlmKGl2aWRlby0+dmlkZW9fdmJhc2UpIHsKKwkJCXNpc2ZiX3Bvc3RfMzAwX3JhbXNpemUocGRldiwgbWFwc2l6ZSk7CisJCQlpb3VubWFwKGl2aWRlby0+dmlkZW9fdmJhc2UpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkic2lzZmI6IEZhaWxlZCB0byBtYXAgbWVtb3J5IGZvciBzaXplIGRldGVjdGlvbiwgYXNzdW1pbmcgOE1CXG4iKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgyOCk7ICAvKiA/ICovCisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NDcpOyAgLyogOE1CLCA2NGJpdCBkZWZhdWx0ICovCisJCX0KICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKIAl9CiAjZW5kaWYKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhlNl07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ZTddOworCWlmKGJpb3MpIHsKKwkJdjEgPSBiaW9zWzB4ZTZdOworCQl2MiA9IGJpb3NbMHhlN107CiAJfSBlbHNlIHsKLQkgICBpblNJU0lEWFJFRyhTSVNTUiwweDNhLHJlZyk7Ci0JICAgaWYoKHJlZyAmIDB4MzApID09IDB4MzApIHsKLQkgICAgICB2MSA9IDB4MDQ7IC8qIFBDSSAqLwotCSAgICAgIHYyID0gMHg5MjsKLQkgICB9IGVsc2UgewotCSAgICAgIHYxID0gMHgxNDsgLyogQUdQICovCi0JICAgICAgdjIgPSAweGIyOwotCSAgIH0KKwkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2EsIHJlZyk7CisJCWlmKChyZWcgJiAweDMwKSA9PSAweDMwKSB7CisJCQl2MSA9IDB4MDQ7IC8qIFBDSSAqLworCQkJdjIgPSAweDkyOworCQl9IGVsc2UgeworCQkJdjEgPSAweDE0OyAvKiBBR1AgKi8KKwkJCXYyID0gMHhiMjsKKwkJfQogCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyMSx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsdjIpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMSwgdjEpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMiwgdjIpOworCisJLyogU2Vuc2UgQ1JUMSAqLworCXNpc2ZiX3NlbnNlX2NydDEoaXZpZGVvKTsKKworCS8qIFNldCBkZWZhdWx0IG1vZGUsIGRvbid0IGNsZWFyIHNjcmVlbiAqLworCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VPRU0gPSBGQUxTRTsKKwlTaVNfU2V0RW5hYmxlRHN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKKwlTaVNfU2V0RW5hYmxlRnN0bigmaXZpZGVvLT5TaVNfUHIsIEZBTFNFKTsKKwlpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPmN1ckRTVE4gPSAwOworCWl2aWRlby0+U2lTX1ByLlZpZGVvTWVtb3J5U2l6ZSA9IDggPDwgMjA7CisJU2lTU2V0TW9kZSgmaXZpZGVvLT5TaVNfUHIsIDB4MmUgfCAweDgwKTsKKworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwkvKiBEaXNwbGF5IG9mZiAqLworCW9yU0lTSURYUkVHKFNJU1NSLCAweDAxLCAweDIwKTsKKworCS8qIFNhdmUgbW9kZSBudW1iZXIgaW4gQ1IzNCAqLworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzNCwgMHgyZSk7CisKKwkvKiBMZXQgZXZlcnlvbmUga25vdyB3aGF0IHRoZSBjdXJyZW50IG1vZGUgaXMgKi8KKwlpdmlkZW8tPm1vZGVwcmVjaGFuZ2UgPSAweDJlOwogfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNpc2ZiX3Bvc3Rfc2lzMzE1MzMwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorI2lmIDAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorc2lzZmJfcG9zdF9zaXMzMTUzMzAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0jaWZkZWYgWUVUX1RPX0JFX0RPTkUKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1OCAgcmVnLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2Nywgdjg7Ci0JdTE2IGluZGV4LCByaW5kZXgsIG1lbXR5cGUgPSAwOwotCXUzMiByZWcxXzMyLCByZWcyXzMyLCByZWczXzMyOwotCWludCBpOwotCi0JLyogVW5sb2NrICovCi0JLyogb3V0U0lTSURYUkVHKDB4M2M0LDB4MDUsMHg4Nik7ICovCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MDUsMHg4Nik7Ci0KLQkvKiBFbmFibGUgcmVsb2NhdGVkIGkvbyBwb3J0cyAqLwotCS8qIHNldFNJU0lEWFJFRygweDNjNCwweDIwLH4weDEwLDB4MjApOyAqLwotCXNldFNJU0lEWFJFRyhTSVNTUiwweDIwLH4weDEwLDB4MjApOwotCi0JLyogQ2xlYXIgcmVncyAqLwotCWZvcihpID0gMDsgaSA8IDB4MjI7IGkrKykgewotCSAgIG91dFNJU0lEWFJFRyhTSVNTUiwoMHgwNiArIGkpLDB4MDApOwotCX0KLQl2MSA9IDB4MGQ7Ci0JaWYoIGlzIDMzMCkgdjEgPSAweDBiOwotCWZvcihpID0gMDsgaSA8IHYxOyBpKyspIHsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsKDB4MzEgKyBpKSwweDAwKTsKLQl9Ci0JZm9yKGkgPSAwOyBpIDwgMHgxMDsgaSsrKSB7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLCgweDMwICsgaSksMHgwMCk7Ci0JfQotCi0JLyogUmVzZXQgY2xvY2tzICovCi0JcmVnID0gaW5TSVNSRUcoU0lTTUlTQ1IpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI4LDB4ODEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJBLDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI5LDB4RTEpOwotCW91dFNJU1JFRyhTSVNNSVNDVywocmVnIHwgMHgwYykpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJCLDB4ODEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJELDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJDLDB4RTEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJFLDB4ODEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDMwLDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJGLDB4RTEpOwotCVNpU19EREMyRGVsYXkoLi4uLik7Ci0Jb3V0U0lTUkVHKFNJU01JU0NXLHJlZyk7Ci0KLQkvKiBHZXQgbWVtb3J5IHR5cGUgKi8KLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4NTJdICYgMHg4MCkpIHsKLQkgICAgICBtZW10eXBlID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDUyXTsKLSAJICAgfSBlbHNlIHsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNTUiwweDNhLG1lbXR5cGUpOwotCSAgIH0KLQkgICBtZW10eXBlICY9IDB4MDM7Ci0JICAgaWYoIGlzIDMzMCApIHsKLQkgICAgICBpZihtZW10eXBlIDw9IDEpIG1lbXR5cGUgPSAwOwotCSAgICAgIGVsc2UgewotCSAgICAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4NUYscmVnKTsKLQkJIHJlZyAmPSAweDMwOwotCQkgc3dpdGNoKHJlZykgewotCQkgY2FzZSAweDAwOiBtZW10eXBlID0gMTsgYnJlYWs7Ci0JCSBjYXNlIDB4MTA6IG1lbXR5cGUgPSAzOyBicmVhazsKLQkJIGNhc2UgMHgyMDogbWVtdHlwZSA9IDM7IGJyZWFrOwotCQkgZGVmYXVsdDogICBtZW10eXBlID0gMjsKLQkJIH0KLQkgICAgICB9Ci0JICAgfQotCX0KLQotCS8qIFNldCBjbG9ja3MgKi8KLQl2MSA9IDB4M2I7IHYyID0gMHgyMjsgdjMgPSAweDAxOyAgLyogQXNzdW1lIDE0M01oeiBNQ0xLICovCi0JdjQgPSAweDVjOyB2NSA9IDB4MjM7IHY2ID0gMHgwMTsgIC8qIEFzc3VtZSAxNjZNaHogRUNMSyAqLwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIGluZGV4ID0gbWVtdHlwZSAqIDU7Ci0JICAgcmluZGV4ID0gaW5kZXggKyAweDU0OwotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQkgICB2MyA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgIHJpbmRleCA9IGluZGV4ICsgMHg2ODsKLQkgICB2NCA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbcmluZGV4KytdOwotCSAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtyaW5kZXgrK107Ci0JICAgdjYgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW3JpbmRleCsrXTsKLQl9Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjgsdjEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI5LHYyKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyYSx2Myk7Ci0JaWYoIGlzIDMzMCApIHsKLQkgICBpblNJU0lEWFJFRyhTSVNTUiwweDNhLHJlZyk7Ci0JICAgcmVnICY9IDB4MDM7Ci0JICAgaWYocmVnID49IDIpIHsKLQkgICAgICAuLi4KLQkgICB9Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDJlLHY0KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyZix2NSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MzAsdjYpOwotCi0JLyogRW5kIG9mIGNvbXAgd2l0aCAzMzAgKi8KLQotCXYxID0gMHgxODsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDdjXTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgwNyx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTEsMHgwZik7Ci0KLQl2MSA9IDB4MDA7IHYyID0gMHgwZjsgdjMgPSAweGJhOyB2NCA9IDB4YTk7Ci0JdjUgPSAweGEwOyB2NiA9IDB4MDA7IHY3ID0gMHgzMDsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICBpbmRleCA9IG1lbXR5cGUgKyAweDdkOwotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleF07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgNF07Ci0JICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgOF07Ci0JICAgdjQgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMTJdOwotCSAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDE2XTsKLQkgICB2NiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXggKyAyMF07Ci0JICAgdjcgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMjRdOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNSx2MSk7ICAgICAgIC8qIFJhbSB0eXBlIChhc3N1bWluZyAwLCBCSU9TIDB4N2Qgc3RlcCA0KSAqLwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE2LHYyKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNyx2Myk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MTgsdjQpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDE5LHY1KTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxYSx2Nik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MWIsdjcpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDFjLHY4KTsJICAgLyogLS0tLSAqLwotCi0JdjEgPSAweDc3OyB2MiA9IDB4Nzc7IHYzID0gMHgwMDsgdjQgPSAweDViOyB2NSA9IDB4MDA7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgaW5kZXggPSBtZW10eXBlICsgMHhhMjsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXhdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDRdOwotCSAgIHYzID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDhdOwotCSAgIHY0ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDEyXTsKLQkgICB2NSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXggKyAxNl07Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNDUiwweDQwLHYxKTsKLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0MSx2Mik7Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4NDIsdjMpOwotCW91dFNJU0lEWFJFRyhTSVNDUiwweDQzLHY0KTsKLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0NCx2NSk7Ci0KLQlpZiggaXMgMzMwICkgewotCi0JICAgdjEgPSAweDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhCQV07Ci0JICAgfQotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDU5LHYxKTsKLQotCSAgIHYxID0gMHg7IHYyID0gMHg7IHYzID0gMHg7IHY0ID0gMHg7Ci0JICAgdjUgPSAweDsgdjYgPSAweDsgdjcgPSAweDsgdjggPSAweDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICBpbmRleCA9IG1lbXR5cGUgKyAweGJlOwotCSAgICAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleF07Ci0JICAgICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgNF07Ci0JICAgICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgOF07Ci0JICAgICAgdjQgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMTJdOwotCSAgICAgIHY1ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDE2XTsKLQkgICAgICB2NiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbaW5kZXggKyAyMF07Ci0JICAgICAgdjcgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW2luZGV4ICsgMjRdOwotCSAgICAgIHY4ID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpbmRleCArIDI4XTsKLQkgICB9Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NjgsdjEpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDY5LHYyKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg2YSx2Myk7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NmIsdjQpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDZjLHY1KTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg2ZCx2Nik7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NmUsdjcpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDZmLHY4KTsKLQotCSAgIHYxID0gMHgyMDsKLQkgICBpblNJU0lEWFJFRyhTSVNTUiwweDNiLHJlZyk7Ci0KLQkgICBpZighKHJlZyAmIDB4MDQpKSB7Ci0JICAgICAgaW5TSVNJRFhSRUcoU0lTQ1IsMHg1RixyZWcpOwotCSAgICAgIHJlZyAmPSAweDMwOwotCSAgICAgIGlmKHJlZykgdjEgPSAweDIzOwotCSAgIH0KLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0OCx2MSk7Ci0JICAgb3V0U0lTSURYUkVHKFNJU0NSLDB4NGMsMHgyMCk7Ci0KLQkgICB4eD0geHh4KCk7Ci0JICAgaWYoeHggPj0gMSkgewotCSAgICAgIHYxID0gMHg7Ci0JICAgICAgaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgICAgICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4QkFdOwotCSAgICAgIH0KLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg1OSx2MSk7Ci0JICAgfQotCi0KLQotCX0gZWxzZSB7Ci0KLQkgICBvdXRTSVNJRFhSRUcoU0lTQ1IsMHg0OCwweDIzKTsKLQotCSAgIGFuZFNJU0lEWFJFRyhTSVNTUiwweDE2LDB4MGYpOwotCSAgIGlmKG1lbXR5cGUgPD0gMSkgewotCSAgICAgIG9yU0lTSURYUkVHKFNJU1NSLDB4MTYsMHg4MCk7Ci0JICAgfSBlbHNlIHsKLQkgICAgICB2MSA9IDB4MGY7Ci0JICAgICAgaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgICAgICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4ODEgKyBtZW10eXBlXTsKLQkgICAgICB9Ci0JICAgICAgaWYoISh2MSAmIDB4MTApKSB2MiA9IDB4YzA7Ci0JICAgICAgZWxzZSAgICAgICAgICAgICB2MiA9IDB4ZDA7Ci0JICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsMHgxNix2Mik7Ci0JICAgICAgYW5kU0lTSURYUkVHKFNJU1NSLDB4MTYsMHgwZik7Ci0JICAgICAgaWYoISh2MSAmIDB4MTApKSB2MiA9IDB4ODA7Ci0JICAgICAgZWxzZSAgICAgICAgICAgICB2MiA9IDB4QTA7Ci0JICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsMHgxNix2Mik7Ci0gCSAgIH0KLQotCSAgIGlmKG1lbXR5cGUgPj0gMikgewotCSAgICAgIGNvbnN0IHU4IHNyM2NzZXExW10gPSB7IDB4YzAsMHhlMCwweGYwLDB4ZTAsMHhmMCwweGEwLDB4YjAsMHhhMCwweGIwLDB4OTAsMHhkMCB9OwotCSAgICAgIGNvbnN0IHU4IHNyM2NzZXEyW10gPSB7IDB4YzAsMHhhMCwweGIwLDB4YTAsMHhiMCwweGUwLDB4ZjAsMHhhMCwweGIwLDB4OTAsMHhkMCB9OwotCSAgICAgIGZvcihpID0gMDsgaSA8IDExOyBpKyspIHsKLQkgICAgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgzYyxzcjNjc2VxMVtpXSk7Ci0JICAgICAgfQotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNkLDB4MDApOwotCSAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNkLDB4MDQpOwotCSAgICAgIFNpU19EREMyRGVsYXkoMHgyMDApOwotCSAgICAgIHYxID0gaW5TSVNJRFhSRUcoU0lTQ1IsMHhFQyk7Ci0JICAgICAgdjIgPSBpblNJU0lEWFJFRyhTSVNDUiwweEVEKTsKLQkgICAgICByZWcxXzMyID0gKHYyIDw8IDgpIHwgdjE7Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4M0QsMHgwMCk7Ci0JICAgICAgZm9yKGkgPSAwOyBpIDwgMTE7IGkrKykgewotCSAgICAgICAgIG91dFNJU0lEWFJFRyhTSVNTUiwweDNjLHNyM2NzZXEyW2ldKTsKLQkgICAgICB9Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4M2QsMHgwMCk7Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLDB4M2QsMHgwNCk7Ci0JICAgICAgU2lTX0REQzJEZWxheSgweDIwMCk7Ci0JICAgICAgdjEgPSBpblNJU0lEWFJFRyhTSVNDUiwweEVDKTsKLQkgICAgICB2MiA9IGluU0lTSURYUkVHKFNJU0NSLDB4RUQpOwotCSAgICAgIHJlZzJfMzIgPSAodjIgPDwgOCkgfCB2MTsKLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgzRCwweDAwKTsKLQkgICAgICByZWczXzMyID0gcmVnMl8zMiA8PCAxOwotCSAgICAgIHJlZzJfMzIgPj49IDE7Ci0JICAgICAgcmVnM18zMiArPSByZWcyXzMyOwotCSAgICAgIHYxID0gMHg0MDsKLQkgICAgICBpZihyZWczXzMyID4gcmVnMV8zMikgdjEgPSAweDEwOwotCSAgICAgICAgIG91dFNJU0lEWFJFRyhTSVNDUiwweDU5LHYxKTsKLQkgICB9Ci0KLQl9Ci0KLQl2MSA9IDB4MDA7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4OTldOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgxZix2MSk7Ci0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyMCwweDIwKTsKLQotCXYxID0gMHhmNjsgdjIgPSAweDBkOyB2MyA9IDB4MzM7Ci0JaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4OWNdOwotCSAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDlkXTsKLQkgICB2MyA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg5ZV07Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNTUiwweDIzLHYxKTsKLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyNCx2Mik7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjUsdjMpOwotCi0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjEsMHg4NCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsMHgwMCk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjcsMHgxZik7Ci0KLQl2MSA9IDB4MDA7IHYyID0gMHgwMDsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg5Rl07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4QTFdOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgzMSx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MzMsdjIpOwotCi0JdjEgPSAweDExOwotCWlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweEEwXTsKLQl9Ci0JdjIgPSBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDAwKTsKLQlpZigodjIgIT0gMSkgJiYgKHYyICE9IDIpKSB2MSAmPSAweGVmOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDMyLHYxKTsKLQotCS8qIEFHUCAqLwotCXBjaV9yZWFkX2NvbmZpZ19sb25nKHBkZXYsIDB4NTAsICZyZWcxXzMyKTsKLQlyZWcxXzMyID4+PSAyMDsKLQlyZWcxXzMyICY9IDB4MGY7Ci0JaWYocmVnMV8zMiA9PSAxKSB7Ci0JICAgdjEgPSAweEFBOyB2MiA9IDB4MzM7Ci0JICAgaWYoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NKSB7Ci0JICAgICAgdjEgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4RjddOwotCSAgICAgIHYyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweDlFXTsKLQkgICB9Ci0JfSBlbHNlIHsKLQkgICB2MSA9IDB4ODg7IHYyID0gMHgwMzsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhGOF07Ci0JICAgICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4RjZdOwotCSAgIH0KLQl9Ci0Jb3V0U0lTSURYUkVHKFNJU0NSLDB4NDksdjEpOwotCW91dFNJU0lEWFJFRyhTSVNTUiwweDI1LHYyKTsKLQotCXYxID0gaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgwMCk7Ci0JaWYoKHYxID09IDEpIHx8ICh2MSA9PSAyKSkgewotCSAgIG9yU0lTSURYUkVHKFNJU1BBUlQxLDB4MkYsMHgwMSk7ICAvKiBVbmxvY2sgQ1JUMiAqLwotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDAwLDB4MDApOwotCSAgIHYxID0gMHgwMDsKLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhiNl07Ci0JICAgfQotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUMSwweDAyLHYxKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDEsMHgyRSwweDA4KTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDIsMHgwMCwweDFjKTsKLQkgICB2MSA9IDB4NDA7IHYyID0gMHgwMDsgdjMgPSAweDgwOwotCSAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSkgewotCSAgICAgIHYxID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVsweGI3XTsKLQkgICAgICB2MiA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHhiOF07Ci0JICAgICAgdjMgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4YmJdOwotCSAgIH0KLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgwZCx2MSk7Ci0JICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MGUsdjIpOwotCSAgIG91dFNJU0lEWFJFRyhTSVNQQVJUNCwweDEwLHYzKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTUEFSVDQsMHgwRiwweDNGKTsKLQotCSAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MDEscmVnKTsKLQkgICBpZihyZWcgPj0gMHhiMCkgewotCSAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MjMscmVnKTsKLQkgICAgICByZWcgJj0gMHgyMDsKLQkgICAgICByZWcgPDw9IDE7Ci0JICAgICAgb3V0U0lTSURYUkVHKFNJU1BBUlQ0LDB4MjMscmVnKTsKLQkgICB9Ci0JfQotCW91dFNJU0lEWFJFRyhTSVNDUiwweDM3LDB4MDIpOyAvKiBXaHk/ICovCi0KLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg4MywweDAwKTsKLQlvdXRTSVNJRFhSRUcoU0lTQ1IsMHg5MCwweDAwKTsKLQlhbmRTSVNJRFhSRUcoU0lTU1IsMHg1QiwweERGKTsKLQlvdXRTSVNJRFhSRUcoU0lTVklELDB4MDAsMHg4Nik7Ci0Jb3V0U0lTSURYUkVHKFNJU1ZJRCwweDMyLDB4MDApOwotCW91dFNJU0lEWFJFRyhTSVNWSUQsMHgzMCwweDAwKTsKLQlvdXRTSVNJRFhSRUcoU0lTVklELDB4MzIsMHgwMSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1ZJRCwweDMwLDB4MDApOwotCW9yU0lTSURYUkVHKFNJU0NSLDB4NjMsMHg4MCk7Ci0JLyogRW5kIG9mIEluaXQxICovCi0KLQkvKiBTZXQgTW9kZSAweDJlICovCi0KLQkvKiBSYW1zaXplICovCi0Jb3JTSVNJRFhSRUcoU0lTU1IsMHgxNiwweDBmKTsKLQlvclNJU0lEWFJFRyhTSVNTUiwweDE4LDB4QTkpOwotCW9yU0lTSURYUkVHKFNJU1NSLDB4MTksMHhBMCk7Ci0Jb3JTSVNJRFhSRUcoU0lTU1IsMHgxQiwweDMwKTsKLQlhbmRTSVNJRFhSRUcoU0lTU1IsMHgxNywweEY4KTsKLQlvclNJU0lEWFJFRyhTSVNTUiwweDE5LDB4MDMpOwotCWFuZFNJRElEWFJFRyhTSVNTUiwweDEzLDB4MDApOwotCi0JLyogTmVlZCB0byBtYXAgbWF4IEZCIHNpemUgZm9yIGZpbmRpbmcgb3V0IGFib3V0IFJBTSBzaXplICovCi0JaXZpZGVvLT52aWRlb192YmFzZSA9IGlvcmVtYXAoaXZpZGVvLT52aWRlb19iYXNlLCAweDQwMDAwMDApOwotCWlmKGl2aWRlby0+dmlkZW9fdmJhc2UpIHsKLQkgICAvKiBGaW5kIG91dCBhYm91dCBidXMgd2lkdGggKi8KLQkgICBpZihtZW10eXBlIDw9IDEpIHsKLQkgICAgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNCwweDAyKTsKLQkgICAgICBhbmRTSVNJRFhSRUcoU0lTU1IsMHgxNiwweDBGKTsKLQkgICAgICBvclNJU0lEWFJFRyhTSVNTUiwweDE2LDB4ODApOwotCi0JICAgICAgLi4uCi0KLQkgICB9IGVsc2UgewotCi0JICAgICAgLi4uCi0KLQkgICB9Ci0KLQkgICAvKiBGaW5kIG91dCBhYm91dCBzaXplICovCi0KLQotCSAgIGlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7Ci0JfSBlbHNlIHsKLQkgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEZhaWxlZCB0byBtYXAgbWVtb3J5IGZvciBzaXplIGRldGVjdGlvbiwgYXNzdW1pbmcgOE1CXG4iKTsKLQkgICBvdXRTSVNJRFhSRUcoU0lTU1IsMHgxNCwweD8/KTsgIC8qIDhNQiwgNjRiaXQgZGVmYXVsdCAqLwotCX0KLQotCS8qIEFHUCAoTWlzc2luZzogQ2hlY2tzIGZvciBWSUEgYW5kIEFNRCBob3N0cykgKi8KLQl2MSA9IDB4QTU7IHYyID0gMHhGQjsKLQlpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICB2MSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2VbMHg5QV07Ci0JICAgdjIgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlWzB4OUJdOwotCX0KLQlvdXRTSVNJRFhSRUcoU0lTU1IsMHgyMSx2MSk7Ci0Jb3V0U0lTSURYUkVHKFNJU1NSLDB4MjIsdjIpOwotCi0jZW5kaWYKLQlyZXR1cm47CisJLyogVE9ETyAqLwogfQogI2VuZGlmCiAKLQotc3RhdGljIGludCBfX2RldmluaXQgc2lzZmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3Npc2ZiX3Bvc3RfeGdpX2RlbGF5KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgZGVsYXkpCiB7Ci0Jc3RydWN0IHNpc2ZiX2NoaXBfaW5mbyAJKmNoaXBpbmZvID0gJnNpc2ZiX2NoaXBfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKLQlzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gCSppdmlkZW8gPSBOVUxMOwotCXN0cnVjdCBmYl9pbmZvIAkJKnNpc19mYl9pbmZvID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCByZWc7CisKKwlmb3IoaSA9IDA7IGkgPD0gKGRlbGF5ICogMTAgKiAzNik7IGkrKykgeworCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgcmVnKTsKKwkJcmVnKys7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc2lzZmJfZmluZF9ob3N0X2JyaWRnZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgc3RydWN0IHBjaV9kZXYgKm15cGRldiwKKwkJCQl1bnNpZ25lZCBzaG9ydCBwY2l2ZW5kb3IpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSgocGRldiA9IFNJU19QQ0lfR0VUX0NMQVNTKFBDSV9DTEFTU19CUklER0VfSE9TVCwgcGRldikpKSB7CisJCXRlbXAgPSBwZGV2LT52ZW5kb3I7CisJCVNJU19QQ0lfUFVUX0RFVklDRShwZGV2KTsKKwkJaWYodGVtcCA9PSBwY2l2ZW5kb3IpIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzaXNmYl9wb3N0X3hnaV9yd3Rlc3Qoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIGludCBzdGFydGEsCisJCQl1bnNpZ25lZCBpbnQgZW5kYSwgdW5zaWduZWQgaW50IG1hcHNpemUpCit7CisJdW5zaWduZWQgaW50IHBvczsKKwlpbnQgaTsKKworCXdyaXRlbCgwLCBpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKKworCWZvcihpID0gc3RhcnRhOyBpIDw9IGVuZGE7IGkrKykgeworCQlwb3MgPSAxIDw8IGk7CisJCWlmKHBvcyA8IG1hcHNpemUpCisJCQl3cml0ZWwocG9zLCBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgcG9zKTsKKwl9CisKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDE1MCk7CisKKwlpZihyZWFkbChpdmlkZW8tPnZpZGVvX3ZiYXNlKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWZvcihpID0gc3RhcnRhOyBpIDw9IGVuZGE7IGkrKykgeworCQlwb3MgPSAxIDw8IGk7CisJCWlmKHBvcyA8IG1hcHNpemUpIHsKKwkJCWlmKHJlYWRsKGl2aWRlby0+dmlkZW9fdmJhc2UgKyBwb3MpICE9IHBvcykKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9wb3N0X3hnaV9yYW1zaXplKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKQoreworCXVuc2lnbmVkIGludCBidXN3aWR0aCwgcmFua3NpemUsIGNoYW5uZWxhYiwgbWFwc2l6ZTsKKwlpbnQgaSwgaiwgaywgbDsKKwl1OCByZWcsIHNyMTQ7CisJc3RhdGljIGNvbnN0IHU4IGRyYW1zcjEzWzEyICogNV0gPSB7CisJCTB4MDIsIDB4MGUsIDB4MGIsIDB4ODAsIDB4NWQsCisJCTB4MDIsIDB4MGUsIDB4MGEsIDB4NDAsIDB4NTksCisJCTB4MDIsIDB4MGQsIDB4MGIsIDB4NDAsIDB4NGQsCisJCTB4MDIsIDB4MGUsIDB4MDksIDB4MjAsIDB4NTUsCisJCTB4MDIsIDB4MGQsIDB4MGEsIDB4MjAsIDB4NDksCisJCTB4MDIsIDB4MGMsIDB4MGIsIDB4MjAsIDB4M2QsCisJCTB4MDIsIDB4MGUsIDB4MDgsIDB4MTAsIDB4NTEsCisJCTB4MDIsIDB4MGQsIDB4MDksIDB4MTAsIDB4NDUsCisJCTB4MDIsIDB4MGMsIDB4MGEsIDB4MTAsIDB4MzksCisJCTB4MDIsIDB4MGQsIDB4MDgsIDB4MDgsIDB4NDEsCisJCTB4MDIsIDB4MGMsIDB4MDksIDB4MDgsIDB4MzUsCisJCTB4MDIsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MzEKKwl9OworCXN0YXRpYyBjb25zdCB1OCBkcmFtc3IxM180WzQgKiA1XSA9IHsKKwkJMHgwMiwgMHgwZCwgMHgwOSwgMHg0MCwgMHg0NSwKKwkJMHgwMiwgMHgwYywgMHgwOSwgMHgyMCwgMHgzNSwKKwkJMHgwMiwgMHgwYywgMHgwOCwgMHgxMCwgMHgzMSwKKwkJMHgwMiwgMHgwYiwgMHgwOCwgMHgwOCwgMHgyMQorCX07CisKKwkvKiBFbmFibGUgbGluZWFyIG1vZGUsIGRpc2FibGUgMHhhMDAwMCBhZGRyZXNzIGRlY29kaW5nICovCisJLyogV2UgZGlzYWJsZSBhMDAwMCBhZGRyZXNzIGRlY29kaW5nLCBiZWNhdXNlCisJICogLSBpZiBydW5uaW5nIG9uIHg4NiwgaWYgdGhlIGNhcmQgaXMgZGlzYWJsZWQsIGl0IG1lYW5zCisJICogICB0aGF0IGFub3RoZXIgY2FyZCBpcyBpbiB0aGUgc3lzdGVtLiBXZSBkb24ndCB3YW50CisJICogICB0byBpbnRlcnBoZXJlIHdpdGggdGhhdCBwcmltYXJ5IGNhcmQncyB0ZXh0bW9kZS4KKwkgKiAtIGlmIHJ1bm5pbmcgb24gbm9uLXg4NiwgdGhlcmUgdXN1YWxseSBpcyBubyBWR0Egd2luZG93CisJICogICBhdCBhMDAwMC4KKwkgKi8KKwlvclNJU0lEWFJFRyhTSVNTUiwgMHgyMCwgKDB4ODAgfCAweDA0KSk7CisKKwkvKiBOZWVkIHRvIG1hcCBtYXggRkIgc2l6ZSBmb3IgZmluZGluZyBvdXQgYWJvdXQgUkFNIHNpemUgKi8KKwltYXBzaXplID0gMjU2IDw8IDIwOworCXNpc2ZiX3Bvc3RfbWFwX3ZyYW0oaXZpZGVvLCAmbWFwc2l6ZSwgMzIpOworCisJaWYoIWl2aWRlby0+dmlkZW9fdmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogVW5hYmxlIHRvIGRldGVjdCBSQU0gc2l6ZS4gU2V0dGluZyBkZWZhdWx0LlxuIik7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgzNSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0MSk7CisJCS8qIFRPRE8gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIE5vbi1pbnRlcmxlYXZpbmcgKi8KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTUsIDB4MDApOworCS8qIE5vIHRpbGluZyAqLworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxYywgMHgwMCk7CisKKwlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB7CisKKwkJY2hhbm5lbGFiID0gMTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4OTcsIHJlZyk7CisJCWlmKCEocmVnICYgMHgwMSkpIHsJLyogU2luZ2xlIDMyLzE2ICovCisJCQlidXN3aWR0aCA9IDMyOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweGIxKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg1Mik7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJc3IxNCA9IDB4MDI7CisJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMywgMjQsIG1hcHNpemUpKQorCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgzMSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NDIpOworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIzLCAyMywgbWFwc2l6ZSkpCisJCQkJZ290byBiYWlsX291dDsKKworCQkJYnVzd2lkdGggPSAxNjsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhiMSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NDEpOworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCXNyMTQgPSAweDAxOworCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjIsIDIzLCBtYXBzaXplKSkKKwkJCQlnb3RvIGJhaWxfb3V0OworCQkJZWxzZQorCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgzMSk7CisJCX0gZWxzZSB7CQkvKiBEdWFsIDE2LzggKi8KKwkJCWJ1c3dpZHRoID0gMTY7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4YjEpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDQxKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisJCQlzcjE0ID0gMHgwMTsKKwkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIyLCAyMywgbWFwc2l6ZSkpCisJCQkJZ290byBiYWlsX291dDsKKworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDMxKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHgzMSk7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjIsIDIyLCBtYXBzaXplKSkKKwkJCQlnb3RvIGJhaWxfb3V0OworCisJCQlidXN3aWR0aCA9IDg7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4YjEpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDMwKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisJCQlzcjE0ID0gMHgwMDsKKwkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIxLCAyMiwgbWFwc2l6ZSkpCisJCQkJZ290byBiYWlsX291dDsKKwkJCWVsc2UKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4MzEpOworCQl9CisKKwl9IGVsc2UgewkvKiBYR0lfNDAgKi8KKworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg5NywgcmVnKTsKKwkJaWYoIShyZWcgJiAweDEwKSkgeworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4MzksIHJlZyk7CisJCQlyZWcgPj49IDE7CisJCX0KKworCQlpZihyZWcgJiAweDAxKSB7CS8qIEREUklJICovCisJCQlidXN3aWR0aCA9IDMyOworCQkJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSB7CisJCQkJY2hhbm5lbGFiID0gMjsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4YTEpOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0NCk7CisJCQkJc3IxNCA9IDB4MDQ7CisJCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMywgMjQsIG1hcHNpemUpKQorCQkJCQlnb3RvIGJhaWxfb3V0OworCisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDIxKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4MzQpOworCQkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIyLCAyMywgbWFwc2l6ZSkpCisJCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCQljaGFubmVsYWIgPSAxOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhhMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDQwKTsKKwkJCQlzcjE0ID0gMHgwMDsKKwkJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMiwgMjMsIG1hcHNpemUpKQorCQkJCQlnb3RvIGJhaWxfb3V0OworCisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDIxKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4MzApOworCQkJfSBlbHNlIHsKKwkJCQljaGFubmVsYWIgPSAzOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhhMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDRjKTsKKwkJCQlzcjE0ID0gMHgwYzsKKwkJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIzLCAyNSwgbWFwc2l6ZSkpCisJCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCQljaGFubmVsYWIgPSAyOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0OCk7CisJCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJCQlzcjE0ID0gMHgwODsKKwkJCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCAyMywgMjQsIG1hcHNpemUpKQorCQkJCQlnb3RvIGJhaWxfb3V0OworCisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweDIxKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4M2MpOworCQkJCXNyMTQgPSAweDBjOworCisJCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjMsIDI0LCBtYXBzaXplKSkgeworCQkJCQljaGFubmVsYWIgPSAzOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYW5uZWxhYiA9IDI7CisJCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHgzOCk7CisJCQkJCXNyMTQgPSAweDA4OworCQkJCX0KKwkJCX0KKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisKKwkJfSBlbHNlIHsJLyogRERSICovCisKKwkJCWJ1c3dpZHRoID0gNjQ7CisJCQlpZihpdmlkZW8tPnJldmlzaW9uX2lkID09IDIpIHsKKwkJCQljaGFubmVsYWIgPSAxOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHhhMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDUyKTsKKwkJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCQkJCXNyMTQgPSAweDAyOworCQkJCWlmKHNpc2ZiX3Bvc3RfeGdpX3J3dGVzdChpdmlkZW8sIDIzLCAyNCwgbWFwc2l6ZSkpCisJCQkJCWdvdG8gYmFpbF9vdXQ7CisKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4MjEpOworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHg0Mik7CisJCQl9IGVsc2UgeworCQkJCWNoYW5uZWxhYiA9IDI7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCAweGExKTsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTQsIDB4NWEpOworCQkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisJCQkJc3IxNCA9IDB4MGE7CisJCQkJaWYoc2lzZmJfcG9zdF94Z2lfcnd0ZXN0KGl2aWRlbywgMjQsIDI1LCBtYXBzaXplKSkKKwkJCQkJZ290byBiYWlsX291dDsKKworCQkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxMywgMHgyMSk7CisJCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweDRhKTsKKwkJCX0KKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMSk7CisKKwkJfQorCX0KKworYmFpbF9vdXQ6CisJc2V0U0lTSURYUkVHKFNJU1NSLCAweDE0LCAweGYwLCBzcjE0KTsKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDEpOworCisJaiA9IChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDUgOiA5OworCWsgPSAoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgPyAxMiA6IDQ7CisKKwlmb3IoaSA9IDA7IGkgPCBrOyBpKyspIHsKKworCQlyZWcgPSAoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgPworCQkJCWRyYW1zcjEzWyhpICogNSkgKyA0XSA6IGRyYW1zcjEzXzRbKGkgKiA1KSArIDRdOworCQlzZXRTSVNJRFhSRUcoU0lTU1IsIDB4MTMsIDB4ODAsIHJlZyk7CisJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgNTApOworCisJCXJhbmtzaXplID0gKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApID8KKwkJCQlkcmFtc3IxM1soaSAqIDUpICsgM10gOiBkcmFtc3IxM180WyhpICogNSkgKyAzXTsKKworCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgxMywgcmVnKTsKKwkJaWYocmVnICYgMHg4MCkgcmFua3NpemUgPDw9IDE7CisKKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQkJaWYoYnVzd2lkdGggPT0gMTYpICAgICAgcmFua3NpemUgPDw9IDE7CisJCQllbHNlIGlmKGJ1c3dpZHRoID09IDMyKSByYW5rc2l6ZSA8PD0gMjsKKwkJfSBlbHNlIHsKKwkJCWlmKGJ1c3dpZHRoID09IDY0KSAgICAgIHJhbmtzaXplIDw8PSAxOworCQl9CisKKwkJcmVnID0gMDsKKwkJbCA9IGNoYW5uZWxhYjsKKwkJaWYobCA9PSAzKSBsID0gNDsKKwkJaWYoKHJhbmtzaXplICogbCkgPD0gMjU2KSB7CisJCQl3aGlsZSgocmFua3NpemUgPj49IDEpKSByZWcgKz0gMHgxMDsKKwkJfQorCisJCWlmKCFyZWcpIGNvbnRpbnVlOworCisJCXNldFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgMHgwZiwgKHJlZyAmIDB4ZjApKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKworCQlpZihzaXNmYl9wb3N0X3hnaV9yd3Rlc3QoaXZpZGVvLCBqLCAoKHJlZyA+PiA0KSArIGNoYW5uZWxhYiAtIDIgKyAyMCksIG1hcHNpemUpKQorCQkJYnJlYWs7CisJfQorCisJaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitzaXNmYl9wb3N0X3hnaV9zZXRjbG9ja3Moc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHU4IHJlZ2IpCit7CisJdTggdjEsIHYyLCB2MzsKKwlpbnQgaW5kZXg7CisJc3RhdGljIGNvbnN0IHU4IGNzOTBbOCAqIDNdID0geworCQkweDE2LCAweDAxLCAweDAxLAorCQkweDNlLCAweDAzLCAweDAxLAorCQkweDdjLCAweDA4LCAweDAxLAorCQkweDc5LCAweDA2LCAweDAxLAorCQkweDI5LCAweDAxLCAweDgxLAorCQkweDVjLCAweDIzLCAweDAxLAorCQkweDVjLCAweDIzLCAweDAxLAorCQkweDVjLCAweDIzLCAweDAxCisJfTsKKwlzdGF0aWMgY29uc3QgdTggY3NiOFs4ICogM10gPSB7CisJCTB4NWMsIDB4MjMsIDB4MDEsCisJCTB4MjksIDB4MDEsIDB4MDEsCisJCTB4N2MsIDB4MDgsIDB4MDEsCisJCTB4NzksIDB4MDYsIDB4MDEsCisJCTB4MjksIDB4MDEsIDB4ODEsCisJCTB4NWMsIDB4MjMsIDB4MDEsCisJCTB4NWMsIDB4MjMsIDB4MDEsCisJCTB4NWMsIDB4MjMsIDB4MDEKKwl9OworCisJcmVnYiA9IDA7ICAvKiAhICovCisKKwlpbmRleCA9IHJlZ2IgKiAzOworCXYxID0gY3M5MFtpbmRleF07IHYyID0gY3M5MFtpbmRleCArIDFdOyB2MyA9IGNzOTBbaW5kZXggKyAyXTsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJdjEgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHg5MCArIGluZGV4XTsKKwkJdjIgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHg5MCArIGluZGV4ICsgMV07CisJCXYzID0gaXZpZGVvLT5iaW9zX2FiYXNlWzB4OTAgKyBpbmRleCArIDJdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjgsIHYxKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjksIHYyKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MmEsIHYzKTsKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwlpbmRleCA9IHJlZ2IgKiAzOworCXYxID0gY3NiOFtpbmRleF07IHYyID0gY3NiOFtpbmRleCArIDFdOyB2MyA9IGNzYjhbaW5kZXggKyAyXTsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJdjEgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHhiOCArIGluZGV4XTsKKwkJdjIgPSBpdmlkZW8tPmJpb3NfYWJhc2VbMHhiOCArIGluZGV4ICsgMV07CisJCXYzID0gaXZpZGVvLT5iaW9zX2FiYXNlWzB4YjggKyBpbmRleCArIDJdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MmUsIHYxKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MmYsIHYyKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzAsIHYzKTsKKwlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK3Npc2ZiX3Bvc3RfeGdpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGNoYXIgKmJpb3MgPSBpdmlkZW8tPmJpb3NfYWJhc2U7CisJc3RydWN0IHBjaV9kZXYgKm15cGRldiA9IE5VTEw7CisJY29uc3QgdTggKnB0ciwgKnB0cjI7CisJdTggdjEsIHYyLCB2MywgdjQsIHY1LCByZWcsIHJhbXR5cGU7CisJdTMyIHJlZ2EsIHJlZ2IsIHJlZ2Q7CisJaW50IGksIGosIGssIGluZGV4OworCXN0YXRpYyBjb25zdCB1OCBjczc4WzNdID0geyAweGY2LCAweDBkLCAweDAwIH07CisJc3RhdGljIGNvbnN0IHU4IGNzNzZbMl0gPSB7IDB4YTMsIDB4ZmIgfTsKKwlzdGF0aWMgY29uc3QgdTggY3M3YlszXSA9IHsgMHhjMCwgMHgxMSwgMHgwMCB9OworCXN0YXRpYyBjb25zdCB1OCBjczE1OFs4XSA9IHsKKwkJMHg4OCwgMHhhYSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorCX07CisJc3RhdGljIGNvbnN0IHU4IGNzMTYwWzhdID0geworCQkweDQ0LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisJfTsKKwlzdGF0aWMgY29uc3QgdTggY3MxNjhbOF0gPSB7CisJCTB4NDgsIDB4NzgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczEyOFszICogOF0gPSB7CisJCTB4OTAsIDB4MjgsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NzcsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NzcsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczE0OFsyICogOF0gPSB7CisJCTB4NTUsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczMxYVs4ICogNF0gPSB7CisJCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCTB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczMzYVs4ICogNF0gPSB7CisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczQ1YVs4ICogMl0gPSB7CisJCTB4MDAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczE3MFs3ICogOF0gPSB7CisJCTB4NTQsIDB4MzIsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NTQsIDB4NDMsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MGEsIDB4MDUsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4NDQsIDB4MzQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MTAsIDB4MGEsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MTEsIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDUsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczFhOFszICogOF0gPSB7CisJCTB4ZjAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCXN0YXRpYyBjb25zdCB1OCBjczEwMFsyICogOF0gPSB7CisJCTB4YzQsIDB4MDQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4YzQsIDB4MDQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCisJLyogVkdBIGVuYWJsZSAqLworCXJlZyA9IGluU0lTUkVHKFNJU1ZHQUVOQUJMRSkgfCAweDAxOworCW91dFNJU1JFRyhTSVNWR0FFTkFCTEUsIHJlZyk7CisKKwkvKiBNaXNjICovCisJcmVnID0gaW5TSVNSRUcoU0lTTUlTQ1IpIHwgMHgwMTsKKwlvdXRTSVNSRUcoU0lTTUlTQ1csIHJlZyk7CisKKwkvKiBVbmxvY2sgU1IgKi8KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MDUsIDB4ODYpOworCWluU0lTSURYUkVHKFNJU1NSLCAweDA1LCByZWcpOworCWlmKHJlZyAhPSAweGExKQorCQlyZXR1cm4gMDsKKworCS8qIENsZWFyIHNvbWUgcmVncyAqLworCWZvcihpID0gMDsgaSA8IDB4MjI7IGkrKykgeworCQlpZigweDA2ICsgaSA9PSAweDIwKSBjb250aW51ZTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDA2ICsgaSwgMHgwMCk7CisJfQorCWZvcihpID0gMDsgaSA8IDB4MGI7IGkrKykgeworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzEgKyBpLCAweDAwKTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgMHgxMDsgaSsrKSB7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzMCArIGksIDB4MDApOworCX0KKworCXB0ciA9IGNzNzg7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXB0ciA9IChjb25zdCB1OCAqKSZiaW9zWzB4NzhdOworCX0KKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIzICsgaSwgcHRyW2ldKTsKKwl9CisKKwlwdHIgPSBjczc2OworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlwdHIgPSAoY29uc3QgdTggKikmYmlvc1sweDc2XTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgyMSArIGksIHB0cltpXSk7CisJfQorCisJdjEgPSAweDE4OyB2MiA9IDB4MDA7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDc0XTsKKwkJdjIgPSBiaW9zWzB4NzVdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MDcsIHYxKTsKKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTEsIDB4MGYpOworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxZiwgdjIpOworCS8qIFBDSSBsaW5lYXIgbW9kZSwgUmVsSU8gZW5hYmxlZCwgQTAwMDAgZGVjb2RpbmcgZGlzYWJsZWQgKi8KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjAsIDB4ODAgfCAweDIwIHwgMHgwNCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDI3LCAweDc0KTsKKworCXB0ciA9IGNzN2I7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXB0ciA9IChjb25zdCB1OCAqKSZiaW9zWzB4N2JdOworCX0KKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDMxICsgaSwgcHRyW2ldKTsKKwl9CisKKwlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCWlmKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMikgeworCQkJc2V0U0lTSURYUkVHKFNJU1NSLCAweDNiLCAweDNmLCAweGMwKTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4N2QsIDB4ZmUpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4N2UsIDB4MGYpOworCX0KKwlpZihpdmlkZW8tPnJldmlzaW9uX2lkID09IDApIHsJLyogNDAgKmFuZCogMjA/ICovCisJCWFuZFNJU0lEWFJFRyhTSVNDUiwgMHg1OCwgMHhkNyk7CisJCWluU0lTSURYUkVHKFNJU0NSLCAweGNiLCByZWcpOworCQlpZihyZWcgJiAweDIwKSB7CisJCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NTgsIDB4ZDcsIChyZWcgJiAweDEwKSA/IDB4MDggOiAweDIwKTsgLyogPTB4MjggWjcgPyAqLworCQl9CisJfQorCisJcmVnID0gKGl2aWRlby0+Y2hpcCA9PSBYR0lfNDApID8gMHgyMCA6IDB4MDA7CisJc2V0U0lTSURYUkVHKFNJU0NSLCAweDM4LCAweDFmLCByZWcpOworCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MzYsIDB4NzApOworCX0gZWxzZSB7CisJCW91dFNJU0lEWFJFRyhTSVNWSUQsIDB4MDAsIDB4ODYpOworCQlvdXRTSVNJRFhSRUcoU0lTVklELCAweDMyLCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1ZJRCwgMHgzMCwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNWSUQsIDB4MzIsIDB4MDEpOworCQlvdXRTSVNJRFhSRUcoU0lTVklELCAweDMwLCAweDAwKTsKKwkJYW5kU0lTSURYUkVHKFNJU1ZJRCwgMHgyZiwgMHhkZik7CisJCWFuZFNJU0lEWFJFRyhTSVNDQVAsIDB4MDAsIDB4M2YpOworCisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgyZiwgMHgwMSk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMCwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgwMiwgYmlvc1sweDdlXSk7CisJCW91dFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgyZSwgMHgwOCk7CisJCWFuZFNJU0lEWFJFRyhTSVNQQVJUMSwgMHgzNSwgMHg3Zik7CisJCWFuZFNJU0lEWFJFRyhTSVNQQVJUMSwgMHg1MCwgMHhmZSk7CisKKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDAsIHJlZyk7CisJCWlmKHJlZyA9PSAxIHx8IHJlZyA9PSAyKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDIsIDB4MDAsIDB4MWMpOworCQkJb3V0U0lTSURYUkVHKFNJU1BBUlQ0LCAweDBkLCBiaW9zWzB4N2ZdKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNQQVJUNCwgMHgwZSwgYmlvc1sweDgwXSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTUEFSVDQsIDB4MTAsIGJpb3NbMHg4MV0pOworCQkJYW5kU0lTSURYUkVHKFNJU1BBUlQ0LCAweDBmLCAweDNmKTsKKworCQkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDEsIHJlZyk7CisJCQlpZigocmVnICYgMHhmMCkgPj0gMHhiMCkgeworCQkJCWluU0lTSURYUkVHKFNJU1BBUlQ0LCAweDIzLCByZWcpOworCQkJCWlmKHJlZyAmIDB4MjApIHJlZyB8PSAweDQwOworCQkJCW91dFNJU0lEWFJFRyhTSVNQQVJUNCwgMHgyMywgcmVnKTsKKwkJCQlyZWcgPSAocmVnICYgMHgyMCkgPyAweDAyIDogMHgwMDsKKwkJCQlzZXRTSVNJRFhSRUcoU0lTUEFSVDEsIDB4MWUsIDB4ZmQsIHJlZyk7CisJCQl9CisJCX0KKworCQl2MSA9IGJpb3NbMHg3N107CisKKwkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2IsIHJlZyk7CisJCWlmKHJlZyAmIDB4MDIpIHsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDNhLCByZWcpOworCQkJdjIgPSAocmVnICYgMHgzMCkgPj4gMzsKKwkJCWlmKCEodjIgJiAweDA0KSkgdjIgXj0gMHgwMjsKKwkJCWluU0lTSURYUkVHKFNJU1NSLCAweDM5LCByZWcpOworCQkJaWYocmVnICYgMHg4MCkgdjIgfD0gMHg4MDsKKwkJCXYyIHw9IDB4MDE7CisKKwkJCWlmKChteXBkZXYgPSBTSVNfUENJX0dFVF9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgMHgwNzMwLCBOVUxMKSkpIHsKKwkJCQlTSVNfUENJX1BVVF9ERVZJQ0UobXlwZGV2KTsKKwkJCQlpZigoKHYyICYgMHgwNikgPT0gMikgfHwgKCh2MiAmIDB4MDYpID09IDQpKQorCQkJCQl2MiAmPSAweGY5OworCQkJCXYyIHw9IDB4MDg7CisJCQkJdjEgJj0gMHhmZTsKKwkJCX0gZWxzZSB7CisJCQkJbXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDczNSwgTlVMTCk7CisJCQkJaWYoIW15cGRldikKKwkJCQkJbXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDY0NSwgTlVMTCk7CisJCQkJaWYoIW15cGRldikKKwkJCQkJbXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIDB4MDY1MCwgTlVMTCk7CisJCQkJaWYobXlwZGV2KSB7CisJCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChteXBkZXYsIDB4OTQsICZyZWdkKTsKKwkJCQkJcmVnZCAmPSAweGZmZmZmZWZmOworCQkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG15cGRldiwgMHg5NCwgcmVnZCk7CisJCQkJCXYxICY9IDB4ZmU7CisJCQkJCVNJU19QQ0lfUFVUX0RFVklDRShteXBkZXYpOworCQkJCX0gZWxzZSBpZihzaXNmYl9maW5kX2hvc3RfYnJpZGdlKGl2aWRlbywgcGRldiwgUENJX1ZFTkRPUl9JRF9TSSkpIHsKKwkJCQkJdjEgJj0gMHhmZTsKKwkJCQl9IGVsc2UgaWYoc2lzZmJfZmluZF9ob3N0X2JyaWRnZShpdmlkZW8sIHBkZXYsIDB4MTEwNikgfHwKKwkJCQkJICBzaXNmYl9maW5kX2hvc3RfYnJpZGdlKGl2aWRlbywgcGRldiwgMHgxMDIyKSB8fAorCQkJCQkgIHNpc2ZiX2ZpbmRfaG9zdF9icmlkZ2UoaXZpZGVvLCBwZGV2LCAweDcwMGUpIHx8CisJCQkJCSAgc2lzZmJfZmluZF9ob3N0X2JyaWRnZShpdmlkZW8sIHBkZXYsIDB4MTBkZSkpIHsKKwkJCQkJaWYoKHYyICYgMHgwNikgPT0gNCkKKwkJCQkJCXYyIF49IDB4MDY7CisJCQkJCXYyIHw9IDB4MDg7CisJCQkJfQorCQkJfQorCQkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDVmLCAweGYwLCB2Mik7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDIyLCB2MSk7CisKKwkJaWYoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSB7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgzYiwgdjEpOworCQkJaW5TSVNJRFhSRUcoU0lTU1IsIDB4M2EsIHYyKTsKKwkJCXJlZ2QgPSBiaW9zWzB4OTAgKyAzXSB8IChiaW9zWzB4OTAgKyA0XSA8PCA4KTsKKwkJCWlmKCAoISh2MSAmIDB4MDIpKSAmJiAodjIgJiAweDMwKSAmJiAocmVnZCA8IDB4Y2YpICkKKwkJCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NWYsIDB4ZjEsIDB4MDEpOworCisJCQlpZigobXlwZGV2ID0gU0lTX1BDSV9HRVRfREVWSUNFKDB4MTBkZSwgMHgwMWUwLCBOVUxMKSkpIHsKKwkJCQkvKiBUT0RPOiBzZXQgQ1I1ZiAmMHhmMSB8IDB4MDEgZm9yIHZlcnNpb24gNjU3MAorCQkJCSAqIG9mIG5mb3JjZSAyIFJPTQorCQkJCSAqLworCQkJCWlmKDApCisJCQkJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHg1ZiwgMHhmMSwgMHgwMSk7CisJCQkJU0lTX1BDSV9QVVRfREVWSUNFKG15cGRldik7CisJCQl9CisJCX0KKworCQl2MSA9IDB4MzA7CisJCWluU0lTSURYUkVHKFNJU1NSLCAweDNiLCByZWcpOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg1ZiwgdjIpOworCQlpZigoIShyZWcgJiAweDAyKSkgJiYgKHYyICYgMHgwZSkpCisJCQl2MSB8PSAweDA4OworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjcsIHYxKTsKKworCQlpZihiaW9zWzB4NjRdICYgMHgwMSkgeworCQkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDVmLCAweGYwLCBiaW9zWzB4NjRdKTsKKwkJfQorCisJCXYxID0gYmlvc1sweDRmN107CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmcmVnZCk7CisJCXJlZ2QgPSAocmVnZCA+PiAyMCkgJiAweDBmOworCQlpZihyZWdkID09IDEpIHsKKwkJCXYxICY9IDB4ZmM7CisJCQlvclNJU0lEWFJFRyhTSVNDUiwgMHg1ZiwgMHgwOCk7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDQ4LCB2MSk7CisKKwkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDQ3LCAweDA0LCBiaW9zWzB4NGY2XSAmIDB4ZmIpOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NDksIDB4ZjAsIGJpb3NbMHg0ZjhdICYgMHgwZik7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHg0YSwgMHg2MCwgYmlvc1sweDRmOV0gJiAweDlmKTsKKwkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDRiLCAweDA4LCBiaW9zWzB4NGZhXSAmIDB4ZjcpOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NGMsIDB4ODAsIGJpb3NbMHg0ZmJdICYgMHg3Zik7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg3MCwgYmlvc1sweDRmY10pOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NzEsIDB4ZjAsIGJpb3NbMHg0ZmRdICYgMHgwZik7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg3NCwgMHhkMCk7CisJCXNldFNJU0lEWFJFRyhTSVNDUiwgMHg3NCwgMHhjZiwgYmlvc1sweDRmZV0gJiAweDMwKTsKKwkJc2V0U0lTSURYUkVHKFNJU0NSLCAweDc1LCAweGUwLCBiaW9zWzB4NGZmXSAmIDB4MWYpOworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NzYsIDB4ZTAsIGJpb3NbMHg1MDBdICYgMHgxZik7CisJCXYxID0gYmlvc1sweDUwMV07CisJCWlmKChteXBkZXYgPSBTSVNfUENJX0dFVF9ERVZJQ0UoMHg4MDg2LCAweDI1MzAsIE5VTEwpKSkgeworCQkJdjEgPSAweGYwOworCQkJU0lTX1BDSV9QVVRfREVWSUNFKG15cGRldik7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDc3LCB2MSk7CisJfQorCisJLyogUkFNIHR5cGUgKi8KKworCXJlZ2IgPSAwOwkvKiAhICovCisKKwl2MSA9IDB4ZmY7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDE0MCArIHJlZ2JdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4NmQsIHYxKTsKKworCXB0ciA9IGNzMTI4OworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlwdHIgPSAoY29uc3QgdTggKikmYmlvc1sweDEyOF07CisJfQorCWZvcihpID0gMCwgaiA9IDA7IGkgPCAzOyBpKyssIGogKz0gOCkgeworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4NjggKyBpLCBwdHJbaiArIHJlZ2JdKTsKKwl9CisKKwlwdHIgID0gY3MzMWE7CisJcHRyMiA9IGNzMzNhOworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlpbmRleCA9IChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDB4MzFhIDogMHgzYTY7CisJCXB0ciAgPSAoY29uc3QgdTggKikmYmlvc1tpbmRleF07CisJCXB0cjIgPSAoY29uc3QgdTggKikmYmlvc1tpbmRleCArIDB4MjBdOworCX0KKwlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYoaSA9PSAwKSB7CisJCQlyZWdkID0gbGUzMl90b19jcHUoKCh1MzIgKilwdHIpW3JlZ2JdKTsKKwkJCXJlZ2EgPSAweDZiOworCQl9IGVsc2UgeworCQkJcmVnZCA9IGxlMzJfdG9fY3B1KCgodTMyICopcHRyMilbcmVnYl0pOworCQkJcmVnYSA9IDB4NmU7CisJCX0KKwkJcmVnID0gMHgwMDsKKwkJZm9yKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJcmVnICY9IDB4ZjM7CisJCQlpZihyZWdkICYgMHgwMSkgcmVnIHw9IDB4MDQ7CisJCQlpZihyZWdkICYgMHgwMikgcmVnIHw9IDB4MDg7CisJCQlyZWdkID4+PSAyOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCByZWdhLCByZWcpOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsIHJlZ2EsIHJlZyk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgcmVnYSwgcmVnKTsKKwkJCXJlZyArPSAweDEwOworCQl9CisJfQorCisJYW5kU0lTSURYUkVHKFNJU0NSLCAweDZlLCAweGZjKTsKKworCXB0ciAgPSBOVUxMOworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlpbmRleCA9IChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDB4MzVhIDogMHgzZTY7CisJCXB0ciAgPSAoY29uc3QgdTggKikmYmlvc1tpbmRleF07CisJfQorCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzZXRTSVNJRFhSRUcoU0lTQ1IsIDB4NmUsIDB4ZmMsIGkpOworCQlyZWcgPSAweDAwOworCQlmb3IoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCXJlZ2QgPSAwOworCQkJaWYocHRyKSB7CisJCQkJcmVnZCA9IGxlMzJfdG9fY3B1KCgodTMyICopcHRyKVtyZWdiICogOF0pOworCQkJCXB0ciArPSA0OworCQkJfQorCQkJLyogcmVnID0gMHgwMDsgKi8KKwkJCWZvcihrID0gMDsgayA8IDE2OyBrKyspIHsKKwkJCQlyZWcgJj0gMHhmYzsKKwkJCQlpZihyZWdkICYgMHgwMSkgcmVnIHw9IDB4MDE7CisJCQkJaWYocmVnZCAmIDB4MDIpIHJlZyB8PSAweDAyOworCQkJCXJlZ2QgPj49IDI7CisJCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDZmLCByZWcpOworCQkJCWluU0lTSURYUkVHKFNJU0NSLCAweDZmLCByZWcpOworCQkJCWluU0lTSURYUkVHKFNJU0NSLCAweDZmLCByZWcpOworCQkJCXJlZyArPSAweDA4OworCQkJfQorCQl9CisJfQorCisJcHRyICA9IGNzMTQ4OworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlwdHIgID0gKGNvbnN0IHU4ICopJmJpb3NbMHgxNDhdOworCX0KKwlmb3IoaSA9IDAsIGogPSAwOyBpIDwgMjsgaSsrLCBqICs9IDgpIHsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgwICsgaSwgcHRyW2ogKyByZWdiXSk7CisJfQorCisJYW5kU0lTSURYUkVHKFNJU0NSLCAweDg5LCAweDhmKTsKKworCXB0ciAgPSBjczQ1YTsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJaW5kZXggPSAoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgPyAweDQ1YSA6IDB4NGU2OworCQlwdHIgID0gKGNvbnN0IHU4ICopJmJpb3NbaW5kZXhdOworCX0KKwlyZWdkID0gbGUxNl90b19jcHUoKChjb25zdCB1MTYgKilwdHIpW3JlZ2JdKTsKKwlyZWcgPSAweDgwOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCQlyZWcgJj0gMHhmYzsKKwkJaWYocmVnZCAmIDB4MDEpIHJlZyB8PSAweDAxOworCQlpZihyZWdkICYgMHgwMikgcmVnIHw9IDB4MDI7CisJCXJlZ2QgPj49IDI7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4OSwgcmVnKTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODksIHJlZyk7CisJCWluU0lTSURYUkVHKFNJU0NSLCAweDg5LCByZWcpOworCQlyZWcgKz0gMHgxMDsKKwl9CisKKwl2MSA9IDB4YjU7IHYyID0gMHgyMDsgdjMgPSAweGYwOyB2NCA9IDB4MTM7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDExOCArIHJlZ2JdOworCQl2MiA9IGJpb3NbMHhmOCArIHJlZ2JdOworCQl2MyA9IGJpb3NbMHgxMjAgKyByZWdiXTsKKwkJdjQgPSBiaW9zWzB4MWNhXTsKKwl9CisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDQ1LCB2MSAmIDB4MGYpOworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg5OSwgKHYxID4+IDQpICYgMHgwNyk7CisJb3JTSVNJRFhSRUcoU0lTQ1IsIDB4NDAsIHYxICYgMHg4MCk7CisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDQxLCB2Mik7CisKKwlwdHIgID0gY3MxNzA7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXB0ciAgPSAoY29uc3QgdTggKikmYmlvc1sweDE3MF07CisJfQorCWZvcihpID0gMCwgaiA9IDA7IGkgPCA3OyBpKyssIGogKz0gOCkgeworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OTAgKyBpLCBwdHJbaiArIHJlZ2JdKTsKKwl9CisKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4NTksIHYzKTsKKworCXB0ciAgPSBjczFhODsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJcHRyICA9IChjb25zdCB1OCAqKSZiaW9zWzB4MWE4XTsKKwl9CisJZm9yKGkgPSAwLCBqID0gMDsgaSA8IDM7IGkrKywgaiArPSA4KSB7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHhjMyArIGksIHB0cltqICsgcmVnYl0pOworCX0KKworCXB0ciAgPSBjczEwMDsKKwlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJcHRyICA9IChjb25zdCB1OCAqKSZiaW9zWzB4MTAwXTsKKwl9CisJZm9yKGkgPSAwLCBqID0gMDsgaSA8IDI7IGkrKywgaiArPSA4KSB7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4YSArIGksIHB0cltqICsgcmVnYl0pOworCX0KKworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHhjZiwgdjQpOworCisJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgzLCAweDA5KTsKKwlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODcsIDB4MDApOworCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQlpZiggKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMSkgfHwKKwkJICAgIChpdmlkZW8tPnJldmlzaW9uX2lkID09IDIpICkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDhjLCAweDg3KTsKKwkJfQorCX0KKworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNywgMHgwMCk7CisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFhLCAweDg3KTsKKworCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE1LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFjLCAweDAwKTsKKwl9CisKKwlyYW10eXBlID0gMHgwMDsgdjEgPSAweDEwOworCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQlyYW10eXBlID0gYmlvc1sweDYyXTsKKwkJdjEgPSBiaW9zWzB4MWQyXTsKKwl9CisJaWYoIShyYW10eXBlICYgMHg4MCkpIHsKKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk3LCB2MSk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg5NywgcmVnKTsKKwkJCWlmKHJlZyAmIDB4MTApIHsKKwkJCQlyYW10eXBlID0gKHJlZyAmIDB4MDEpIDw8IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpblNJU0lEWFJFRyhTSVNTUiwgMHgzOSwgcmVnKTsKKwkJCXJhbXR5cGUgPSByZWcgJiAweDAyOworCQkJaWYoIShyYW10eXBlKSkgeworCQkJCWluU0lTSURYUkVHKFNJU1NSLCAweDNhLCByZWcpOworCQkJCXJhbXR5cGUgPSAocmVnID4+IDEpICYgMHgwMTsKKwkJCX0KKwkJfQorCX0KKwlyYW10eXBlICY9IDB4MDc7CisKKwlyZWdiID0gMDsJLyogISAqLworCisJc3dpdGNoKHJhbXR5cGUpIHsKKwljYXNlIDA6CisJCXNpc2ZiX3Bvc3RfeGdpX3NldGNsb2NrcyhpdmlkZW8sIHJlZ2IpOworCQlpZigoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgfHwKKwkJICAgKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMSkgICB8fAorCQkgICAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSkgeworCQkJdjEgPSBjczE1OFtyZWdiXTsgdjIgPSBjczE2MFtyZWdiXTsgdjMgPSBjczE2OFtyZWdiXTsKKwkJCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQkJCXYxID0gYmlvc1tyZWdiICsgMHgxNThdOworCQkJCXYyID0gYmlvc1tyZWdiICsgMHgxNjBdOworCQkJCXYzID0gYmlvc1tyZWdiICsgMHgxNjhdOworCQkJfQorCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCB2MSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHYyKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgdjMpOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCAweDg4KTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHgwMCk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHg4OCk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgYmlvc1tyZWdiICsgMHgxNjhdKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4MiwgMHg3Nyk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIDB4MDApOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHJlZyk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIDB4ODgpOworCQkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHJlZyk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIGJpb3NbcmVnYiArIDB4MTYwXSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIGJpb3NbcmVnYiArIDB4MTU4XSk7CisJCX0KKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk3LCAweDAwKTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OTgsIDB4MDEpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OWEsIDB4MDIpOworCisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOCwgMHgwMSk7CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB8fAorCQkgICAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSkgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDQwKTsKKwkJfSBlbHNlIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgyMCk7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJaWYoKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHx8IChiaW9zWzB4MWNiXSAhPSAweDBjKSkgeworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweDAwKTsKKwkJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSB8fAorCQkJICAgKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMikpIHsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTksIDB4NDApOworCQkJfSBlbHNlIHsKKwkJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTksIDB4MjApOworCQkJfQorCQl9IGVsc2UgaWYoKGl2aWRlby0+Y2hpcCA9PSBYR0lfNDApICYmIChiaW9zWzB4MWNiXSA9PSAweDBjKSkgeworCQkJLyogb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDBjKTsgKi8gLyogPyAqLworCQl9CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHg4MCk7CisJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgNCk7CisJCXYxID0gMHgzMTsgdjIgPSAweDAzOyB2MyA9IDB4ODM7IHY0ID0gMHgwMzsgdjUgPSAweDgzOworCQlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJCXYxID0gYmlvc1sweGYwXTsKKwkJCWluZGV4ID0gKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApID8gMHg0YjIgOiAweDUzZTsKKwkJCXYyID0gYmlvc1tpbmRleF07CisJCQl2MyA9IGJpb3NbaW5kZXggKyAxXTsKKwkJCXY0ID0gYmlvc1tpbmRleCArIDJdOworCQkJdjUgPSBiaW9zW2luZGV4ICsgM107CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2MSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgKChpdmlkZW8tPmNoaXAgPT0gWEdJXzIwKSA/IDB4MDIgOiAweDAxKSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgdjIpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIHYzKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAzKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDIyKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2MSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgwMCk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgdjQpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIHY1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIDB4NzcpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODYsIDB4MDApOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg2LCAweDg4KTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODYsIHJlZyk7CisJCXYxID0gY3MxNjhbcmVnYl07IHYyID0gY3MxNjBbcmVnYl07IHYzID0gY3MxNThbcmVnYl07CisJCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQkJdjEgPSBiaW9zW3JlZ2IgKyAweDE2OF07CisJCQl2MiA9IGJpb3NbcmVnYiArIDB4MTYwXTsKKwkJCXYzID0gYmlvc1tyZWdiICsgMHgxNThdOworCQl9CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgdjEpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIDB4NzcpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIDB4MDApOworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NSwgcmVnKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCAweDg4KTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4ODUsIHJlZyk7CisJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NSwgdjIpOworCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIHYzKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk4LCAweDAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDlhLCAweDAyKTsKKworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjgsIDB4NjQpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MjksIDB4NjMpOworCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDE1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDIwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweGM1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDIzKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk3LDB4MTEpOworCQlzaXNmYl9wb3N0X3hnaV9zZXRjbG9ja3MoaXZpZGVvLCByZWdiKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQ2KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweGM1KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDIzKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDAwKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDgwKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDA0KTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAwKTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJdjEgPSAweDMxOworCQlpZihpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJCXYxID0gYmlvc1sweGYwXTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIHYxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDA2KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDA0KTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDg0KTsKKwkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2lzZmJfcG9zdF94Z2lfc2V0Y2xvY2tzKGl2aWRlbywgcmVnYik7CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSAmJgorCQkgICAoKGl2aWRlby0+cmV2aXNpb25faWQgPT0gMSkgfHwKKwkJICAgIChpdmlkZW8tPnJldmlzaW9uX2lkID09IDIpKSkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCBiaW9zW3JlZ2IgKyAweDE1OF0pOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCBiaW9zW3JlZ2IgKyAweDE2MF0pOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg2LCBiaW9zW3JlZ2IgKyAweDE2OF0pOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDgyLCAweDg4KTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHgwMCk7CisJCQlpblNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgcmVnKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg4NiwgMHg4OCk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIDB4NzcpOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCAweDAwKTsKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDg1LCByZWcpOworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCAweDg4KTsKKwkJCWluU0lTSURYUkVHKFNJU0NSLCAweDg1LCByZWcpOworCQkJdjEgPSBjczE2MFtyZWdiXTsgdjIgPSBjczE1OFtyZWdiXTsKKwkJCWlmKGl2aWRlby0+aGF2ZVhHSVJPTSkgeworCQkJCXYxID0gYmlvc1tyZWdiICsgMHgxNjBdOworCQkJCXYyID0gYmlvc1tyZWdiICsgMHgxNThdOworCQkJfQorCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDg1LCB2MSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4ODIsIHYyKTsKKwkJfQorCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTQ1IsIDB4OTcsIDB4MTEpOworCQl9CisJCWlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSAmJiAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSkgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDk4LCAweDAxKTsKKwkJfSBlbHNlIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNDUiwgMHg5OCwgMHgwMyk7CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU0NSLCAweDlhLCAweDAyKTsKKworCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIDB4MDEpOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCAweDAwKTsKKwkJfQorCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTksIDB4NDApOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4MDApOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4ODApOworCQlpZigoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgJiYgKGJpb3NbMHgxY2JdICE9IDB4MGMpKSB7CisJCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCQkJc2lzZmJfcG9zdF94Z2lfZGVsYXkoaXZpZGVvLCAweDQzKTsKKwkJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgMHg0Myk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIDB4MDApOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDQwKTsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHgwMCk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4ODApOworCQl9CisJCXNpc2ZiX3Bvc3RfeGdpX2RlbGF5KGl2aWRlbywgNCk7CisJCXYxID0gMHgzMTsKKwkJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCQl2MSA9IGJpb3NbMHhmMF07CisJCX0KKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE4LCB2MSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxOSwgMHgwMSk7CisJCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfNDApIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgYmlvc1sweDUzZV0pOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCBiaW9zWzB4NTNmXSk7CisJCX0gZWxzZSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4MDUpOworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCAweDg1KTsKKwkJfQorCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4NDMpOworCQlpZihpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSB7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MWIsIDB4MDEpOworCQl9IGVsc2UgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDFiLCAweDAzKTsKKwkJfQorCQlzaXNmYl9wb3N0X3hnaV9kZWxheShpdmlkZW8sIDB4MjIpOworCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTgsIHYxKTsKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE5LCAweDAwKTsKKwkJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDE2LCBiaW9zWzB4NTQwXSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIGJpb3NbMHg1NDFdKTsKKwkJfSBlbHNlIHsKKwkJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNiwgMHgwNSk7CisJCQlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MTYsIDB4ODUpOworCQl9CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxYiwgMHgwMCk7CisJfQorCisJcmVnYiA9IDA7CS8qICEgKi8KKwl2MSA9IDB4MDM7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDExMCArIHJlZ2JdOworCX0KKwlvdXRTSVNJRFhSRUcoU0lTU1IsIDB4MWIsIHYxKTsKKworCS8qIFJBTSBzaXplICovCisJdjEgPSAweDAwOyB2MiA9IDB4MDA7CisJaWYoaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisJCXYxID0gYmlvc1sweDYyXTsKKwkJdjIgPSBiaW9zWzB4NjNdOworCX0KKwlyZWdiID0gMDsJLyogISAqLworCXJlZ2QgPSAxIDw8IHJlZ2I7CisJaWYoKHYxICYgMHg0MCkgJiYgKHYyICYgcmVnZCkgJiYgaXZpZGVvLT5oYXZlWEdJUk9NKSB7CisKKwkJb3V0U0lTSURYUkVHKFNJU1NSLCAweDEzLCBiaW9zW3JlZ2IgKyAweGUwXSk7CisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgxNCwgYmlvc1tyZWdiICsgMHhlMCArIDhdKTsKKworCX0gZWxzZSB7CisKKwkJLyogU2V0IGRlZmF1bHQgbW9kZSwgZG9uJ3QgY2xlYXIgc2NyZWVuICovCisJCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VPRU0gPSBGQUxTRTsKKwkJU2lTX1NldEVuYWJsZURzdG4oJml2aWRlby0+U2lTX1ByLCBGQUxTRSk7CisJCVNpU19TZXRFbmFibGVGc3RuKCZpdmlkZW8tPlNpU19QciwgRkFMU0UpOworCQlpdmlkZW8tPmN1ckZTVE4gPSBpdmlkZW8tPmN1ckRTVE4gPSAwOworCQlpdmlkZW8tPlNpU19Qci5WaWRlb01lbW9yeVNpemUgPSA4IDw8IDIwOworCQlTaVNTZXRNb2RlKCZpdmlkZW8tPlNpU19QciwgMHgyZSB8IDB4ODApOworCisJCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwkJLyogRGlzYWJsZSByZWFkLWNhY2hlICovCisJCWFuZFNJU0lEWFJFRyhTSVNTUiwgMHgyMSwgMHhkZik7CisJCXNpc2ZiX3Bvc3RfeGdpX3JhbXNpemUoaXZpZGVvKTsKKwkJLyogRW5hYmxlIHJlYWQtY2FjaGUgKi8KKwkJb3JTSVNJRFhSRUcoU0lTU1IsIDB4MjEsIDB4MjApOworCisJfQorCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICItLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yKGkgPSAwOyBpIDwgMHhmZjsgaSsrKSB7CisJCWluU0lTSURYUkVHKFNJU0NSLCBpLCByZWcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiQ1IlMDJ4KCV4KSA9IDB4JTAyeFxuIiwgaSwgU0lTQ1IsIHJlZyk7CisJfQorCWZvcihpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQlpblNJU0lEWFJFRyhTSVNTUiwgaSwgcmVnKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlNSJTAyeCgleCkgPSAweCUwMnhcbiIsIGksIFNJU1NSLCByZWcpOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworI2VuZGlmCisKKwkvKiBTZW5zZSBDUlQxICovCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQlvclNJU0lEWFJFRyhTSVNDUiwgMHgzMiwgMHgyMCk7CisJfSBlbHNlIHsKKwkJaW5TSVNJRFhSRUcoU0lTUEFSVDQsIDB4MDAsIHJlZyk7CisJCWlmKChyZWcgPT0gMSkgfHwgKHJlZyA9PSAyKSkgeworCQkJc2lzZmJfc2Vuc2VfY3J0MShpdmlkZW8pOworCQl9IGVsc2UgeworCQkJb3JTSVNJRFhSRUcoU0lTQ1IsIDB4MzIsIDB4MjApOworCQl9CisJfQorCisJLyogU2V0IGRlZmF1bHQgbW9kZSwgZG9uJ3QgY2xlYXIgc2NyZWVuICovCisJaXZpZGVvLT5TaVNfUHIuU2lTX1VzZU9FTSA9IEZBTFNFOworCVNpU19TZXRFbmFibGVEc3RuKCZpdmlkZW8tPlNpU19QciwgRkFMU0UpOworCVNpU19TZXRFbmFibGVGc3RuKCZpdmlkZW8tPlNpU19QciwgRkFMU0UpOworCWl2aWRlby0+Y3VyRlNUTiA9IGl2aWRlby0+Y3VyRFNUTiA9IDA7CisJU2lTU2V0TW9kZSgmaXZpZGVvLT5TaVNfUHIsIDB4MmUgfCAweDgwKTsKKworCW91dFNJU0lEWFJFRyhTSVNTUiwgMHgwNSwgMHg4Nik7CisKKwkvKiBEaXNwbGF5IG9mZiAqLworCW9yU0lTSURYUkVHKFNJU1NSLCAweDAxLCAweDIwKTsKKworCS8qIFNhdmUgbW9kZSBudW1iZXIgaW4gQ1IzNCAqLworCW91dFNJU0lEWFJFRyhTSVNDUiwgMHgzNCwgMHgyZSk7CisKKwkvKiBMZXQgZXZlcnlvbmUga25vdyB3aGF0IHRoZSBjdXJyZW50IG1vZGUgaXMgKi8KKwlpdmlkZW8tPm1vZGVwcmVjaGFuZ2UgPSAweDJlOworCisJaWYoaXZpZGVvLT5jaGlwID09IFhHSV80MCkgeworCQlpblNJU0lEWFJFRyhTSVNDUiwgMHhjYSwgcmVnKTsKKwkJaW5TSVNJRFhSRUcoU0lTQ1IsIDB4Y2MsIHYxKTsKKwkJaWYoKHJlZyAmIDB4MTApICYmICghKHYxICYgMHgwNCkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkic2lzZmI6IFBsZWFzZSBjb25uZWN0IHBvd2VyIHRvIHRoZSBjYXJkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzaXNmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3Qgc2lzZmJfY2hpcF9pbmZvCSpjaGlwaW5mbyA9ICZzaXNmYl9jaGlwX2luZm9bZW50LT5kcml2ZXJfZGF0YV07CisJc3RydWN0IHNpc192aWRlb19pbmZvCSppdmlkZW8gPSBOVUxMOworCXN0cnVjdCBmYl9pbmZvCQkqc2lzX2ZiX2luZm8gPSBOVUxMOwogCXUxNiByZWcxNjsKIAl1OCAgcmVnOwotCWludCBzaXN2Z2FfZW5hYmxlZCA9IDAsIGk7CisJaW50IGksIHJldDsKIAotCWlmKHNpc2ZiX29mZikgcmV0dXJuIC1FTlhJTzsKKwlpZihzaXNmYl9vZmYpCisJCXJldHVybiAtRU5YSU87CiAKICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzKSkKIAlzaXNfZmJfaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZigqaXZpZGVvKSwgJnBkZXYtPmRldik7Ci0JaWYoIXNpc19mYl9pbmZvKSByZXR1cm4gLUVOT01FTTsKKwlpZighc2lzX2ZiX2luZm8pCisJCXJldHVybiAtRU5PTUVNOwogI2Vsc2UKIAlzaXNfZmJfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpzaXNfZmJfaW5mbykgKyBzaXplb2YoKml2aWRlbyksIEdGUF9LRVJORUwpOwotCWlmKCFzaXNfZmJfaW5mbykgcmV0dXJuIC1FTk9NRU07CisJaWYoIXNpc19mYl9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoc2lzX2ZiX2luZm8sIDAsIHNpemVvZigqc2lzX2ZiX2luZm8pICsgc2l6ZW9mKCppdmlkZW8pKTsKIAlzaXNfZmJfaW5mby0+cGFyID0gKChjaGFyICopc2lzX2ZiX2luZm8gKyBzaXplb2YoKnNpc19mYl9pbmZvKSk7CiAjZW5kaWYKQEAgLTQ3ODcsMjcgKzU4OTAsMzQgQEAKIAlpdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopc2lzX2ZiX2luZm8tPnBhcjsKIAlpdmlkZW8tPm1lbXlzZWxmYW5kaSA9IHNpc19mYl9pbmZvOwogCisJaXZpZGVvLT5zaXNmYl9pZCA9IFNJU0ZCX0lEOworCiAJaWYoY2FyZF9saXN0ID09IE5VTEwpIHsKLQkgICBpdmlkZW8tPmNhcmRudW1iZXIgPSAwOworCQlpdmlkZW8tPmNhcmRudW1iZXIgPSAwOwogCX0gZWxzZSB7Ci0JICAgc3RydWN0IHNpc192aWRlb19pbmZvICpjb3VudHZpZGVvID0gY2FyZF9saXN0OwotCSAgIGl2aWRlby0+Y2FyZG51bWJlciA9IDE7Ci0JICAgd2hpbGUoKGNvdW50dmlkZW8gPSBjb3VudHZpZGVvLT5uZXh0KSAhPSBOVUxMKSBpdmlkZW8tPmNhcmRudW1iZXIrKzsKKwkJc3RydWN0IHNpc192aWRlb19pbmZvICpjb3VudHZpZGVvID0gY2FyZF9saXN0OworCQlpdmlkZW8tPmNhcmRudW1iZXIgPSAxOworCQl3aGlsZSgoY291bnR2aWRlbyA9IGNvdW50dmlkZW8tPm5leHQpICE9IDApCisJCQlpdmlkZW8tPmNhcmRudW1iZXIrKzsKIAl9CiAKIAlzdHJuY3B5KGl2aWRlby0+bXlpZCwgY2hpcGluZm8tPmNoaXBfbmFtZSwgMzApOwogCiAJaXZpZGVvLT53YXJuY291bnQgPSAwOwogCWl2aWRlby0+Y2hpcF9pZCA9IHBkZXYtPmRldmljZTsKKwlpdmlkZW8tPmNoaXBfdmVuZG9yID0gcGRldi0+dmVuZG9yOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJml2aWRlby0+cmV2aXNpb25faWQpOwotCWl2aWRlby0+c2lzaHdfZXh0LmpDaGlwUmV2aXNpb24gPSBpdmlkZW8tPnJldmlzaW9uX2lkOworCWl2aWRlby0+U2lTX1ByLkNoaXBSZXZpc2lvbiA9IGl2aWRlby0+cmV2aXNpb25faWQ7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZyZWcxNik7Ci0Jc2lzdmdhX2VuYWJsZWQgPSByZWcxNiAmIDB4MDE7CisJaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCA9IHJlZzE2ICYgMHgwMTsKIAlpdmlkZW8tPnBjaWJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwogCWl2aWRlby0+cGNpc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKIAlpdmlkZW8tPnBjaWZ1bmMgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CiAJaXZpZGVvLT5zdWJzeXN2ZW5kb3IgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOwogCWl2aWRlby0+c3Vic3lzZGV2aWNlID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKKyNpZmRlZiBTSVNfT0xEX0NPTkZJR19DT01QQVQKKwlpdmlkZW8tPmlvY3RsMzJyZWdpc3RlcmVkID0gMDsKKyNlbmRpZgogCiAjaWZuZGVmIE1PRFVMRQogCWlmKHNpc2ZiX21vZGVfaWR4ID09IC0xKSB7CkBAIC00ODI3LDYgKzU5MzcsMjQgQEAKIAogCWl2aWRlby0+c2lzZmJfdGhpc21vbml0b3IuZGF0YXZhbGlkID0gRkFMU0U7CiAKKwlpdmlkZW8tPmN1cnJlbnRfYmFzZSA9IDA7CisKKwlpdmlkZW8tPmVuZ2luZW9rID0gMDsKKworCWl2aWRlby0+c2lzZmJfd2FzX2Jvb3RfZGV2aWNlID0gMDsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikpCisJaWYocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9TSEFET1cpIHsKKwkJaWYoaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCkKKwkJCWl2aWRlby0+c2lzZmJfd2FzX2Jvb3RfZGV2aWNlID0gMTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFBDSSBkZXZpY2UgaXMgZGlzYWJsZWQsICIKKwkJCQkiYnV0IG1hcmtlZCBhcyBib290IHZpZGVvIGRldmljZSA/Pz9cbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBJIHdpbGwgbm90IGFjY2VwdCB0aGlzICIKKwkJCQkiYXMgdGhlIHByaW1hcnkgVkdBIGRldmljZVxuIik7CisJCX0KKwl9CisjZW5kaWYKKwogCWl2aWRlby0+c2lzZmJfcGFybV9tZW0gPSBzaXNmYl9wYXJtX21lbTsKIAlpdmlkZW8tPnNpc2ZiX2FjY2VsID0gc2lzZmJfYWNjZWw7CiAJaXZpZGVvLT5zaXNmYl95cGFuID0gc2lzZmJfeXBhbjsKQEAgLTQ4NDYsNyArNTk3NCw2IEBACiAJaXZpZGVvLT5zaXNmYl90dnN0ZCA9IHNpc2ZiX3R2c3RkOwogCWl2aWRlby0+dHZ4cG9zID0gc2lzZmJfdHZ4cG9zb2Zmc2V0OwogCWl2aWRlby0+dHZ5cG9zID0gc2lzZmJfdHZ5cG9zb2Zmc2V0OwotCWl2aWRlby0+c2lzZmJfZmlsdGVyID0gc2lzZmJfZmlsdGVyOwogCWl2aWRlby0+c2lzZmJfbm9jcnQycmF0ZSA9IHNpc2ZiX25vY3J0MnJhdGU7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCWl2aWRlby0+c2lzZmJfaW52ZXJzZSA9IHNpc2ZiX2ludmVyc2U7CkBAIC00ODU0LDcgKzU5ODEsNyBAQAogCiAJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSAwOwogCWlmKGl2aWRlby0+c2lzZmJfcGFybV9yYXRlICE9IC0xKSB7Ci0JICAgaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fcmF0ZTsKKwkJaXZpZGVvLT5yZWZyZXNoX3JhdGUgPSBpdmlkZW8tPnNpc2ZiX3Bhcm1fcmF0ZTsKIAl9CiAKIAlpdmlkZW8tPlNpU19Qci5Vc2VQYW5lbFNjYWxlciA9IHNpc2ZiX3NjYWxlbGNkOwpAQCAtNDg2Myw4ICs1OTkwLDggQEAKIAlpdmlkZW8tPlNpU19Qci5MVkRTSEwgPSBzaXNmYl9sdmRzaGw7CiAKIAlpdmlkZW8tPlNpU19Qci5TaVNfQmFja3VwNzB4eCA9IDB4ZmY7Ci0gICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19DSE92ZXJTY2FuID0gLTE7Ci0gICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19DaFNXID0gRkFMU0U7CisJaXZpZGVvLT5TaVNfUHIuU2lTX0NIT3ZlclNjYW4gPSAtMTsKKwlpdmlkZW8tPlNpU19Qci5TaVNfQ2hTVyA9IEZBTFNFOwogCWl2aWRlby0+U2lTX1ByLlNpU19Vc2VMQ0RBID0gRkFMU0U7CiAJaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSSA9IEZBTFNFOwogCWl2aWRlby0+U2lTX1ByLkhhdmVFTUlMQ0QgPSBGQUxTRTsKQEAgLTQ4NzMsMTIgKzYwMDAsMTMgQEAKIAlpdmlkZW8tPlNpU19Qci5TaVNfTXlDUjYzID0gMHg2MzsKIAlpdmlkZW8tPlNpU19Qci5QREMgID0gLTE7CiAJaXZpZGVvLT5TaVNfUHIuUERDQSA9IC0xOworCWl2aWRlby0+U2lTX1ByLkREQ1BvcnRNaXh1cCA9IEZBTFNFOwogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CiAJaWYoaXZpZGVvLT5jaGlwID49IFNJU18zMzApIHsKLQkgICBpdmlkZW8tPlNpU19Qci5TaVNfTXlDUjYzID0gMHg1MzsKLQkgICBpZihpdmlkZW8tPmNoaXAgPj0gU0lTXzY2MSkgewotCSAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19TZW5zaWJsZVNSMTEgPSBUUlVFOwotCSAgIH0KKwkJaXZpZGVvLT5TaVNfUHIuU2lTX015Q1I2MyA9IDB4NTM7CisJCWlmKGl2aWRlby0+Y2hpcCA+PSBTSVNfNjYxKSB7CisJCQlpdmlkZW8tPlNpU19Qci5TaVNfU2Vuc2libGVTUjExID0gVFJVRTsKKwkJfQogCX0KICNlbmRpZgogCkBAIC00ODkxLDkgKzYwMTksOSBAQAogCQlzd2l0Y2goaXZpZGVvLT5uYnJpZGdlLT5kZXZpY2UpIHsKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAogCQljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzMwOgotCQkgICAJaXZpZGVvLT5jaGlwID0gU0lTXzczMDsKKwkJCWl2aWRlby0+Y2hpcCA9IFNJU183MzA7CiAJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDczMCIpOwotCQkgICAJYnJlYWs7CisJCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CiAJCWNhc2UgUENJX0RFVklDRV9JRF9TSV82NTE6CkBAIC00OTAxLDIyICs2MDI5LDI4IEBACiAJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDY1MSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9TSV83NDA6Ci0JCSAgIAlpdmlkZW8tPmNoaXAgPSBTSVNfNzQwOworCQkJaXZpZGVvLT5jaGlwID0gU0lTXzc0MDsKIAkJCXN0cmNweShpdmlkZW8tPm15aWQsICJTaVMgNzQwIik7CiAJCQlicmVhazsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzY2MToKLQkJICAgCWl2aWRlby0+Y2hpcCA9IFNJU182NjE7CisJCQlpdmlkZW8tPmNoaXAgPSBTSVNfNjYxOwogCQkJc3RyY3B5KGl2aWRlby0+bXlpZCwgIlNpUyA2NjEiKTsKIAkJCWJyZWFrOwogCQljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzQxOgotCQkgICAJaXZpZGVvLT5jaGlwID0gU0lTXzc0MTsKKwkJCWl2aWRlby0+Y2hpcCA9IFNJU183NDE7CiAJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDc0MSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9TSV83NjA6Ci0JCSAgIAlpdmlkZW8tPmNoaXAgPSBTSVNfNzYwOworCQkJaXZpZGVvLT5jaGlwID0gU0lTXzc2MDsKIAkJCXN0cmNweShpdmlkZW8tPm15aWQsICJTaVMgNzYwIik7CiAJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzc2MToKKwkJCWl2aWRlby0+Y2hpcCA9IFNJU183NjE7CisJCQlzdHJjcHkoaXZpZGVvLT5teWlkLCAiU2lTIDc2MSIpOworCQkJYnJlYWs7CiAjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC00OTI0LDcxICs2MDU4LDgzIEBACiAJc3RyY3B5KHNpc19mYl9pbmZvLT5tb2RlbmFtZSwgaXZpZGVvLT5teWlkKTsKICNlbmRpZgogCi0JaXZpZGVvLT5zaXNod19leHQuakNoaXBUeXBlID0gaXZpZGVvLT5jaGlwOworCWl2aWRlby0+U2lTX1ByLkNoaXBUeXBlID0gaXZpZGVvLT5jaGlwOworCisJaXZpZGVvLT5TaVNfUHIuaXZpZGVvID0gKHZvaWQgKilpdmlkZW87CiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCWlmKChpdmlkZW8tPnNpc2h3X2V4dC5qQ2hpcFR5cGUgPT0gU0lTXzMxNVBSTykgfHwKLQkgICAoaXZpZGVvLT5zaXNod19leHQuakNoaXBUeXBlID09IFNJU18zMTUpKSB7Ci0JCWl2aWRlby0+c2lzaHdfZXh0LmpDaGlwVHlwZSA9IFNJU18zMTVIOworCWlmKChpdmlkZW8tPlNpU19Qci5DaGlwVHlwZSA9PSBTSVNfMzE1UFJPKSB8fAorCSAgIChpdmlkZW8tPlNpU19Qci5DaGlwVHlwZSA9PSBTSVNfMzE1KSkgeworCQlpdmlkZW8tPlNpU19Qci5DaGlwVHlwZSA9IFNJU18zMTVIOwogCX0KICNlbmRpZgogCisJaWYoIWl2aWRlby0+c2lzdmdhX2VuYWJsZWQpIHsKKwkJaWYocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJCWlmKGl2aWRlby0+bmJyaWRnZSkgU0lTX1BDSV9QVVRfREVWSUNFKGl2aWRlby0+bmJyaWRnZSk7CisJCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJCQlrZnJlZShzaXNfZmJfaW5mbyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwogCWl2aWRlby0+dmlkZW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlpdmlkZW8tPm1taW9fYmFzZSAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CiAJaXZpZGVvLT5tbWlvX3NpemUgID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKIAlpdmlkZW8tPlNpU19Qci5SZWxJTyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSArIDB4MzA7Ci0JaXZpZGVvLT5zaXNod19leHQudWxJT0FkZHJlc3MgPSBpdmlkZW8tPnZnYV9iYXNlID0gaXZpZGVvLT5TaVNfUHIuUmVsSU87CisJaXZpZGVvLT5TaVNfUHIuSU9BZGRyZXNzID0gaXZpZGVvLT52Z2FfYmFzZSA9IGl2aWRlby0+U2lTX1ByLlJlbElPOwogCi0JaWYoIXNpc3ZnYV9lbmFibGVkKSB7Ci0JICAgCWlmKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JICAgICAgCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgICAgCQlrZnJlZShzaXNfZmJfaW5mbyk7Ci0JICAgICAgCQlyZXR1cm4gLUVJTzsKLQkgICAJfQotCX0KLQotCVNpU1JlZ0luaXQoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPnNpc2h3X2V4dC51bElPQWRkcmVzcyk7CisJU2lTUmVnSW5pdCgmaXZpZGVvLT5TaVNfUHIsIGl2aWRlby0+U2lTX1ByLklPQWRkcmVzcyk7CiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAogCS8qIEZpbmQgUENJIHN5c3RlbXMgZm9yIENocm9udGVsL0dQSU8gY29tbXVuaWNhdGlvbiBzZXR1cCAqLwogCWlmKGl2aWRlby0+Y2hpcCA9PSBTSVNfNjMwKSB7Ci0JICAgaT0wOwotICAgICAgICAgICBkbyB7Ci0JICAgICAgaWYobXljaHN3dGFibGVbaV0uc3Vic3lzVmVuZG9yID09IGl2aWRlby0+c3Vic3lzdmVuZG9yICYmCi0JICAgICAgICAgbXljaHN3dGFibGVbaV0uc3Vic3lzQ2FyZCAgID09IGl2aWRlby0+c3Vic3lzZGV2aWNlKSB7Ci0JCSBpdmlkZW8tPlNpU19Qci5TaVNfQ2hTVyA9IFRSVUU7Ci0JCSBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IElkZW50aWZpZWQgWyVzICVzXSByZXF1aXJpbmcgQ2hyb250ZWwvR1BJTyBzZXR1cFxuIiwKLQkJICAgICAgICBteWNoc3d0YWJsZVtpXS52ZW5kb3JOYW1lLCBteWNoc3d0YWJsZVtpXS5jYXJkTmFtZSk7Ci0JCSBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgIH0gd2hpbGUobXljaHN3dGFibGVbaV0uc3Vic3lzVmVuZG9yICE9IDApOworCQlpID0gMDsKKyAgICAgICAgCWRvIHsKKwkJCWlmKG15Y2hzd3RhYmxlW2ldLnN1YnN5c1ZlbmRvciA9PSBpdmlkZW8tPnN1YnN5c3ZlbmRvciAmJgorCQkJICAgbXljaHN3dGFibGVbaV0uc3Vic3lzQ2FyZCAgID09IGl2aWRlby0+c3Vic3lzZGV2aWNlKSB7CisJCQkJaXZpZGVvLT5TaVNfUHIuU2lTX0NoU1cgPSBUUlVFOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSWRlbnRpZmllZCBbJXMgJXNdICIKKwkJCQkJInJlcXVpcmluZyBDaHJvbnRlbC9HUElPIHNldHVwXG4iLAorCQkJCQlteWNoc3d0YWJsZVtpXS52ZW5kb3JOYW1lLAorCQkJCQlteWNoc3d0YWJsZVtpXS5jYXJkTmFtZSk7CisJCQkJaXZpZGVvLT5scGNkZXYgPSBTSVNfUENJX0dFVF9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgMHgwMDA4LCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkrKzsKKwkJfSB3aGlsZShteWNoc3d0YWJsZVtpXS5zdWJzeXNWZW5kb3IgIT0gMCk7CiAJfQogI2VuZGlmCiAKLSAgICAgICAgb3V0U0lTSURYUkVHKFNJU1NSLCAweDA1LCAweDg2KTsKLQotCWlmKCAoIXNpc3ZnYV9lbmFibGVkKQotI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotCQkgIAkgICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQorI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1CisJaWYoKGl2aWRlby0+Y2hpcCA9PSBTSVNfNzYwKSAmJiAoaXZpZGVvLT5uYnJpZGdlKSkgeworCQlpdmlkZW8tPmxwY2RldiA9IFNJU19QQ0lfR0VUX1NMT1QoaXZpZGVvLT5uYnJpZGdlLT5idXMsICgyIDw8IDMpKTsKKwl9CiAjZW5kaWYKLQkJCSAgICAgIAkJCSAgICkgewotCSAgIAlmb3IoaSA9IDB4MzA7IGkgPD0gMHgzZjsgaSsrKSB7Ci0JICAgICAgCQlvdXRTSVNJRFhSRUcoU0lTQ1IsaSwweDAwKTsKLQkgICAJfQorCisJb3V0U0lTSURYUkVHKFNJU1NSLCAweDA1LCAweDg2KTsKKworCWlmKCAoIWl2aWRlby0+c2lzdmdhX2VuYWJsZWQpCisjaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCisJCQkgICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQorI2VuZGlmCisJCQkJCQkgICApIHsKKwkJZm9yKGkgPSAweDMwOyBpIDw9IDB4M2Y7IGkrKykgeworCQkJb3V0U0lTSURYUkVHKFNJU0NSLCBpLCAweDAwKTsKKwkJfQogCX0KIAogCS8qIEZpbmQgb3V0IGFib3V0IGN1cnJlbnQgdmlkZW8gbW9kZSAqLwogCWl2aWRlby0+bW9kZXByZWNoYW5nZSA9IDB4MDM7Ci0JaW5TSVNJRFhSRUcoU0lTQ1IsMHgzNCxyZWcpOworCWluU0lTSURYUkVHKFNJU0NSLCAweDM0LCByZWcpOwogCWlmKHJlZyAmIDB4N2YpIHsKIAkJaXZpZGVvLT5tb2RlcHJlY2hhbmdlID0gcmVnICYgMHg3ZjsKLQl9IGVsc2UgaWYoc2lzdmdhX2VuYWJsZWQpIHsKKwl9IGVsc2UgaWYoaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCkgewogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLQkJdW5zaWduZWQgY2hhciBTSVNfSU9UWVBFMiAqdHQgPSBpb3JlbWFwKDAsIDB4MTAwMCk7CisJCXVuc2lnbmVkIGNoYXIgU0lTX0lPVFlQRTIgKnR0ID0gaW9yZW1hcCgweDQwMCwgMHgxMDApOwogCQlpZih0dCkgewotCQkgICAJaXZpZGVvLT5tb2RlcHJlY2hhbmdlID0gcmVhZGIodHQgKyAweDQ0OSk7Ci0JCSAgIAlpb3VubWFwKHR0KTsKKwkJCWl2aWRlby0+bW9kZXByZWNoYW5nZSA9IHJlYWRiKHR0ICsgMHg0OSk7CisJCQlpb3VubWFwKHR0KTsKIAkJfQogI2VuZGlmCiAJfQpAQCAtNDk5NiwyMTkgKzYxNDIsMjIxIEBACiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaWZkZWYgTU9EVUxFCiAJaWYoKHJlZyAmIDB4ODApICYmIChyZWcgIT0gMHhmZikpIHsKLQkgICBpZigoc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldKSAhPSAweEZGKSB7Ci0JICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IENhbm5vdCBpbml0aWFsaXplIGRpc3BsYXkgbW9kZSwgWCBzZXJ2ZXIgaXMgYWN0aXZlXG4iKTsKLQkgICAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgICAga2ZyZWUoc2lzX2ZiX2luZm8pOwotCSAgICAgIHJldHVybiAtRUJVU1k7Ci0JICAgfQotCX0KLSNlbmRpZgkKLSNlbmRpZgotCi0JaXZpZGVvLT5zaXNod19leHQuYkludGVncmF0ZWRNTUVuYWJsZWQgPSBUUlVFOwotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JICAgaWYoaXZpZGVvLT5jaGlwICE9IFNJU18zMDApIHsKLQkgICAgICBpblNJU0lEWFJFRyhTSVNTUiwgMHgxYSwgcmVnKTsKLQkgICAgICBpZighKHJlZyAmIDB4MTApKSB7Ci0JCSBpdmlkZW8tPnNpc2h3X2V4dC5iSW50ZWdyYXRlZE1NRW5hYmxlZCA9IEZBTFNFOwotCSAgICAgIH0KLQkgICB9Ci0JfQotI2VuZGlmCi0KLQlpdmlkZW8tPmJpb3NfYWJhc2UgPSBOVUxMOwotCWlmKGl2aWRlby0+c2lzZmJfdXNlcm9tKSB7Ci0JICAgIGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2UgPSBzaXNfZmluZF9yb20ocGRldik7Ci0JICAgIGl2aWRlby0+Ymlvc19hYmFzZSA9IGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2U7Ci0JICAgIGlmKGl2aWRlby0+c2lzaHdfZXh0LnBqVmlydHVhbFJvbUJhc2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFZpZGVvIFJPTSBmb3VuZCBhbmQgY29waWVkXG4iKTsKLQkJaXZpZGVvLT5zaXNod19leHQuVXNlUk9NID0gVFJVRTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSA9IEZBTFNFOwotCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFZpZGVvIFJPTSBub3QgZm91bmRcbiIpOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZSA9IE5VTEw7Ci0JICAgIGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSA9IEZBTFNFOwotCSAgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVmlkZW8gUk9NIHVzYWdlIGRpc2FibGVkXG4iKTsKLQl9Ci0KLSAgICAgICAgLyogRmluZCBzeXN0ZW1zIGZvciBzcGVjaWFsIGN1c3RvbSB0aW1pbmcgKi8KLQlpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfTk9ORSkgewotCSAgIGludCBqOwotCSAgIHVuc2lnbmVkIGNoYXIgKmJpb3N2ZXIgPSBOVUxMOwotICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpiaW9zZGF0ZSA9IE5VTEw7Ci0JICAgQk9PTEVBTiBmb290cHJpbnQ7Ci0JICAgdTMyIGNoa3N1bSA9IDA7Ci0KLQkgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICBiaW9zdmVyID0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZSArIDB4MDY7Ci0JICAgICAgYmlvc2RhdGUgPSBpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlICsgMHgyYzsKLSAgICAgICAgICAgICAgZm9yKGk9MDsgaTwzMjc2ODsgaSsrKSBjaGtzdW0gKz0gaXZpZGVvLT5zaXNod19leHQucGpWaXJ0dWFsUm9tQmFzZVtpXTsKLQkgICB9Ci0KLQkgICBpPTA7Ci0gICAgICAgICAgIGRvIHsKLQkgICAgICBpZiggKG15Y3VzdG9tdHRhYmxlW2ldLmNoaXBJRCA9PSBpdmlkZW8tPmNoaXApICYmCi0JICAgICAgICAgICgoIXN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zdmVyc2lvbikpIHx8Ci0JCSAgIChpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00gJiYKLQkJICAgKCFzdHJuY21wKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3N2ZXJzaW9uLCBiaW9zdmVyLCBzdHJsZW4obXljdXN0b210dGFibGVbaV0uYmlvc3ZlcnNpb24pKSkpKSAmJgotCSAgICAgICAgICAoKCFzdHJsZW4obXljdXN0b210dGFibGVbaV0uYmlvc2RhdGUpKSB8fAotCQkgICAoaXZpZGVvLT5zaXNod19leHQuVXNlUk9NICYmCi0JCSAgICghc3RybmNtcChteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSwgYmlvc2RhdGUsIHN0cmxlbihteWN1c3RvbXR0YWJsZVtpXS5iaW9zZGF0ZSkpKSkpICYmCi0JCSAgKCghbXljdXN0b210dGFibGVbaV0uYmlvc2Noa3N1bSkgfHwKLQkJICAgKGl2aWRlby0+c2lzaHdfZXh0LlVzZVJPTSAmJgotCSAgICAgICAgICAgKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3NjaGtzdW0gPT0gY2hrc3VtKSkpCSYmCi0JCSAgKG15Y3VzdG9tdHRhYmxlW2ldLnBjaXN1YnN5c3ZlbmRvciA9PSBpdmlkZW8tPnN1YnN5c3ZlbmRvcikgJiYKLQkJICAobXljdXN0b210dGFibGVbaV0ucGNpc3Vic3lzY2FyZCA9PSBpdmlkZW8tPnN1YnN5c2RldmljZSkgKSB7Ci0JCSBmb290cHJpbnQgPSBUUlVFOwotCSAgICAgICAgIGZvcihqID0gMDsgaiA8IDU7IGorKykgewotCSAgICAgICAgICAgIGlmKG15Y3VzdG9tdHRhYmxlW2ldLmJpb3NGb290cHJpbnRBZGRyW2pdKSB7Ci0JCSAgICAgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5Vc2VST00pIHsKLQkgICAgICAgICAgICAgICAgICBpZihpdmlkZW8tPnNpc2h3X2V4dC5walZpcnR1YWxSb21CYXNlW215Y3VzdG9tdHRhYmxlW2ldLmJpb3NGb290cHJpbnRBZGRyW2pdXSAhPQotCQkgICAgICAJCW15Y3VzdG9tdHRhYmxlW2ldLmJpb3NGb290cHJpbnREYXRhW2pdKSB7Ci0JCSAgICAgICAgICAgICBmb290cHJpbnQgPSBGQUxTRTsKLQkJCSAgfQotCQkgICAgICAgfSBlbHNlIGZvb3RwcmludCA9IEZBTFNFOwotCQkgICAgfQotCSAgICAgICAgIH0KLQkgICAgICAgICBpZihmb290cHJpbnQpIHsKLQkgCSAgICBpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9IG15Y3VzdG9tdHRhYmxlW2ldLlNwZWNpYWxJRDsKLQkJICAgIHByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogSWRlbnRpZmllZCBbJXMgJXNdLCBzcGVjaWFsIHRpbWluZyBhcHBsaWVzXG4iLAotCQkgICAgICAgIG15Y3VzdG9tdHRhYmxlW2ldLnZlbmRvck5hbWUsCi0JCQlteWN1c3RvbXR0YWJsZVtpXS5jYXJkTmFtZSk7Ci0JCSAgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IFtzcGVjaWFsdGltaW5nIHBhcmFtZXRlciBuYW1lOiAlc11cbiIsCi0JCSAgICAJbXljdXN0b210dGFibGVbaV0ub3B0aW9uTmFtZSk7Ci0JICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIH0KLQkgICAgICB9Ci0gICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgfSB3aGlsZShteWN1c3RvbXR0YWJsZVtpXS5jaGlwSUQpOwotCX0KLQotI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCi0JaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7Ci0JCWlmKCAoIXNpc3ZnYV9lbmFibGVkKQotI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotCQkgICAgCQkgICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQotI2VuZGlmCi0JCSAgCQkJCQkgICApIHsKLQkJCWlmKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzAwKSB7Ci0JCQkJc2lzZmJfcG9zdF9zaXMzMDAocGRldik7Ci0JCQl9CisJCWlmKChzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ubW9kZV9ub1tpdmlkZW8tPm1uaV0pCisJCQkJCQkJCQkhPSAweEZGKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogQ2Fubm90IGluaXRpYWxpemUgZGlzcGxheSBtb2RlLCAiCisJCQkJCSAiWCBzZXJ2ZXIgaXMgYWN0aXZlXG4iKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3JfNDsKIAkJfQogCX0KICNlbmRpZgorI2VuZGlmCisKKwkvKiBTZWFyY2ggYW5kIGNvcHkgUk9NIGltYWdlICovCisJaXZpZGVvLT5iaW9zX2FiYXNlID0gTlVMTDsKKwlpdmlkZW8tPlNpU19Qci5WaXJ0dWFsUm9tQmFzZSA9IE5VTEw7CisJaXZpZGVvLT5TaVNfUHIuVXNlUk9NID0gRkFMU0U7CisJaXZpZGVvLT5oYXZlWEdJUk9NID0gaXZpZGVvLT5TaVNfUHIuU2lTX1hHSVJPTSA9IEZBTFNFOworCWlmKGl2aWRlby0+c2lzZmJfdXNlcm9tKSB7CisJCWl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlID0gc2lzZmJfZmluZF9yb20ocGRldik7CisJCWl2aWRlby0+Ymlvc19hYmFzZSA9IGl2aWRlby0+U2lTX1ByLlZpcnR1YWxSb21CYXNlOworCQlpdmlkZW8tPlNpU19Qci5Vc2VST00gPSAoaXZpZGVvLT5TaVNfUHIuVmlydHVhbFJvbUJhc2UpID8gVFJVRSA6IEZBTFNFOworCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVmlkZW8gUk9NICVzZm91bmRcbiIsCisJCQlpdmlkZW8tPlNpU19Qci5Vc2VST00gPyAiIiA6ICJub3QgIik7CisJCWlmKChpdmlkZW8tPlNpU19Qci5Vc2VST00pICYmIChpdmlkZW8tPmNoaXAgPj0gWEdJXzIwKSkgeworCQkgICBpdmlkZW8tPlNpU19Qci5Vc2VST00gPSBGQUxTRTsKKwkJICAgaXZpZGVvLT5oYXZlWEdJUk9NID0gaXZpZGVvLT5TaVNfUHIuU2lTX1hHSVJPTSA9IFRSVUU7CisJCSAgIGlmKCAoaXZpZGVvLT5yZXZpc2lvbl9pZCA9PSAyKSAmJgorCQkgICAgICAgKCEoaXZpZGVvLT5iaW9zX2FiYXNlWzB4MWQxXSAmIDB4MDEpKSApIHsKKwkJCWl2aWRlby0+U2lTX1ByLkREQ1BvcnRNaXh1cCA9IFRSVUU7CisJCSAgIH0KKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBWaWRlbyBST00gdXNhZ2UgZGlzYWJsZWRcbiIpOworCX0KKworCS8qIEZpbmQgc3lzdGVtcyBmb3Igc3BlY2lhbCBjdXN0b20gdGltaW5nICovCisJaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgPT0gQ1VUX05PTkUpIHsKKwkJc2lzZmJfZGV0ZWN0X2N1c3RvbV90aW1pbmcoaXZpZGVvKTsKKwl9CisKKwkvKiBQT1NUIGNhcmQgaW4gY2FzZSB0aGlzIGhhcyBub3QgYmVlbiBkb25lIGJ5IHRoZSBCSU9TICovCisJaWYoICghaXZpZGVvLT5zaXN2Z2FfZW5hYmxlZCkKKyNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKwkJCSAgICAgfHwgKHNpc2ZiX3Jlc2V0Y2FyZCkKKyNlbmRpZgorCQkJCQkJICkgeworI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCisJCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzAwX1ZHQSkgeworCQkJaWYoaXZpZGVvLT5jaGlwID09IFNJU18zMDApIHsKKwkJCQlzaXNmYl9wb3N0X3NpczMwMChwZGV2KTsKKwkJCQlpdmlkZW8tPnNpc2ZiX2Nhbl9wb3N0ID0gMTsKKwkJCX0KKwkJfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQotCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCQlpZiggKCFzaXN2Z2FfZW5hYmxlZCkKLSNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLQkJICAgIAkJICAgICB8fCAoc2lzZmJfcmVzZXRjYXJkKQotI2VuZGlmCi0JCSAgCQkJCQkgICkgewotCQkJaWYoKGl2aWRlby0+Y2hpcCA9PSBTSVNfMzE1SCkgICB8fAorCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKKwkJCWludCByZXN1bHQgPSAxOworCQkvKglpZigoaXZpZGVvLT5jaGlwID09IFNJU18zMTVIKSAgIHx8CiAJCQkgICAoaXZpZGVvLT5jaGlwID09IFNJU18zMTUpICAgIHx8CiAJCQkgICAoaXZpZGVvLT5jaGlwID09IFNJU18zMTVQUk8pIHx8CiAJCQkgICAoaXZpZGVvLT5jaGlwID09IFNJU18zMzApKSB7CiAJCQkJc2lzZmJfcG9zdF9zaXMzMTUzMzAocGRldik7CisJCQl9IGVsc2UgKi8gaWYoaXZpZGVvLT5jaGlwID09IFhHSV8yMCkgeworCQkJCXJlc3VsdCA9IHNpc2ZiX3Bvc3RfeGdpKHBkZXYpOworCQkJCWl2aWRlby0+c2lzZmJfY2FuX3Bvc3QgPSAxOworCQkJfSBlbHNlIGlmKChpdmlkZW8tPmNoaXAgPT0gWEdJXzQwKSAmJiBpdmlkZW8tPmhhdmVYR0lST00pIHsKKwkJCQlyZXN1bHQgPSBzaXNmYl9wb3N0X3hnaShwZGV2KTsKKwkJCQlpdmlkZW8tPnNpc2ZiX2Nhbl9wb3N0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IENhcmQgaXMgbm90ICIKKwkJCQkJIlBPU1RlZCBhbmQgc2lzZmIgY2FuJ3QgZG8gdGhpcyBlaXRoZXIuXG4iKTsKKwkJCX0KKwkJCWlmKCFyZXN1bHQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBGYWlsZWQgdG8gUE9TVCBjYXJkXG4iKTsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyb3JfMzsKIAkJCX0KIAkJfQotCX0KICNlbmRpZgotCi0JaWYoc2lzZmJfZ2V0X2RyYW1fc2l6ZShpdmlkZW8pKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIGRldGVybWluZSBSQU0gc2l6ZS5cbiIpOwotCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7Ci0JCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJa2ZyZWUoc2lzX2ZiX2luZm8pOwotCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpdmlkZW8tPnNpc2ZiX2NhcmRfcG9zdGVkID0gMTsKKworCS8qIEZpbmQgb3V0IGFib3V0IFJBTSBzaXplICovCisJaWYoc2lzZmJfZ2V0X2RyYW1fc2l6ZShpdmlkZW8pKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIGRldGVybWluZSBWUkFNIHNpemUuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl8zOworCX0KKworCisJLyogRW5hYmxlIFBDSSBhZGRyZXNzaW5nIGFuZCBNTUlPICovCiAJaWYoKGl2aWRlby0+c2lzZmJfbW9kZV9pZHggPCAwKSB8fAogCSAgICgoc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldKSAhPSAweEZGKSkgewotCSAgICAgICAgLyogRW5hYmxlIFBDSV9MSU5FQVJfQUREUkVTU0lORyBhbmQgTU1JT19FTkFCTEUgICovCi0JICAgICAgICBvclNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19QQ0lfQUREUkVTU19TRVQsIChTSVNfUENJX0FERFJfRU5BQkxFIHwgU0lTX01FTV9NQVBfSU9fRU5BQkxFKSk7Ci0gICAgICAgICAgICAgICAgLyogRW5hYmxlIDJEIGFjY2VsZXJhdG9yIGVuZ2luZSAqLwotCSAgICAgICAgb3JTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfTU9EVUxFX0VOQUJMRSwgU0lTX0VOQUJMRV8yRCk7CisJCS8qIEVuYWJsZSBQQ0lfTElORUFSX0FERFJFU1NJTkcgYW5kIE1NSU9fRU5BQkxFICAqLworCQlvclNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19QQ0lfQUREUkVTU19TRVQsIChTSVNfUENJX0FERFJfRU5BQkxFIHwgU0lTX01FTV9NQVBfSU9fRU5BQkxFKSk7CisJCS8qIEVuYWJsZSAyRCBhY2NlbGVyYXRvciBlbmdpbmUgKi8KKwkJb3JTSVNJRFhSRUcoU0lTU1IsIElORF9TSVNfTU9EVUxFX0VOQUJMRSwgU0lTX0VOQUJMRV8yRCk7CiAJfQogCiAJaWYoc2lzZmJfcGRjICE9IDB4ZmYpIHsKLQkgICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHNpc2ZiX3BkYyAmPSAweDNjOwotCSAgIGVsc2UJCQkJICAgICAgICAgICAgc2lzZmJfcGRjICY9IDB4MWY7Ci0JICAgaXZpZGVvLT5TaVNfUHIuUERDID0gc2lzZmJfcGRjOworCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpCisJCQlzaXNmYl9wZGMgJj0gMHgzYzsKKwkJZWxzZQorCQkJc2lzZmJfcGRjICY9IDB4MWY7CisJCWl2aWRlby0+U2lTX1ByLlBEQyA9IHNpc2ZiX3BkYzsKIAl9CiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKIAlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMxNV9WR0EpIHsKLQkgICBpZihzaXNmYl9wZGNhICE9IDB4ZmYpIGl2aWRlby0+U2lTX1ByLlBEQ0EgPSBzaXNmYl9wZGNhICYgMHgxZjsKKwkJaWYoc2lzZmJfcGRjYSAhPSAweGZmKQorCQkJaXZpZGVvLT5TaVNfUHIuUERDQSA9IHNpc2ZiX3BkY2EgJiAweDFmOwogCX0KICNlbmRpZgogCiAJaWYoIXJlcXVlc3RfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSwgInNpc2ZiIEZCIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogRmF0YWwgZXJyb3I6IFVuYWJsZSB0byByZXNlcnZlIGZyYW1lIGJ1ZmZlciBtZW1vcnlcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIHJlc2VydmUgJWRNQiBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIsCisJCQkJKGludCkoaXZpZGVvLT52aWRlb19zaXplID4+IDIwKSk7CiAJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IElzIHRoZXJlIGFub3RoZXIgZnJhbWVidWZmZXIgZHJpdmVyIGFjdGl2ZT9cbiIpOwotCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7Ci0JCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJa2ZyZWUoc2lzX2ZiX2luZm8pOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl8zOwogCX0KIAogCWlmKCFyZXF1ZXN0X21lbV9yZWdpb24oaXZpZGVvLT5tbWlvX2Jhc2UsIGl2aWRlby0+bW1pb19zaXplLCAic2lzZmIgTU1JTyIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gcmVzZXJ2ZSBNTUlPIHJlZ2lvblxuIik7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSk7Ci0JCWlmKGl2aWRlby0+Ymlvc19hYmFzZSkgdmZyZWUoaXZpZGVvLT5iaW9zX2FiYXNlKTsKLQkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCQlrZnJlZShzaXNfZmJfaW5mbyk7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycm9yXzI7CiAJfQogCiAJaXZpZGVvLT52aWRlb192YmFzZSA9IGlvcmVtYXAoaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwotCWl2aWRlby0+c2lzaHdfZXh0LnBqVmlkZW9NZW1vcnlBZGRyZXNzID0gaXZpZGVvLT52aWRlb192YmFzZTsKKwlpdmlkZW8tPlNpU19Qci5WaWRlb01lbW9yeUFkZHJlc3MgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlOwogCWlmKCFpdmlkZW8tPnZpZGVvX3ZiYXNlKSB7Ci0JICAgCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gbWFwIGZyYW1lIGJ1ZmZlciBtZW1vcnlcbiIpOwotCSAgIAlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwotCSAgIAlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT5tbWlvX2Jhc2UsIGl2aWRlby0+bW1pb19zaXplKTsKLQkJaWYoaXZpZGVvLT5iaW9zX2FiYXNlKSB2ZnJlZShpdmlkZW8tPmJpb3NfYWJhc2UpOwotCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgCWtmcmVlKHNpc19mYl9pbmZvKTsKLQkgICAJcmV0dXJuIC1FTk9ERVY7CisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gbWFwIGZyYW1lYnVmZmVyIG1lbW9yeVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3JfMTsKIAl9CiAKIAlpdmlkZW8tPm1taW9fdmJhc2UgPSBpb3JlbWFwKGl2aWRlby0+bW1pb19iYXNlLCBpdmlkZW8tPm1taW9fc2l6ZSk7CiAJaWYoIWl2aWRlby0+bW1pb192YmFzZSkgewotCSAgIAlwcmludGsoS0VSTl9FUlIgInNpc2ZiOiBGYXRhbCBlcnJvcjogVW5hYmxlIHRvIG1hcCBNTUlPIHJlZ2lvblxuIik7Ci0JICAgCWlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7Ci0JICAgCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSk7Ci0JICAgCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPm1taW9fYmFzZSwgaXZpZGVvLT5tbWlvX3NpemUpOwotCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7CisJCXByaW50ayhLRVJOX0VSUiAic2lzZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gbWFwIE1NSU8gcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKK2Vycm9yXzA6CWlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7CitlcnJvcl8xOglyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOworZXJyb3JfMjoJcmVsZWFzZV9tZW1fcmVnaW9uKGl2aWRlby0+bW1pb19iYXNlLCBpdmlkZW8tPm1taW9fc2l6ZSk7CitlcnJvcl8zOgl2ZnJlZShpdmlkZW8tPmJpb3NfYWJhc2UpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorZXJyb3JfNDoKKyNlbmRpZgorCQlpZihpdmlkZW8tPmxwY2RldikKKwkJCVNJU19QQ0lfUFVUX0RFVklDRShpdmlkZW8tPmxwY2Rldik7CisJCWlmKGl2aWRlby0+bmJyaWRnZSkKKwkJCVNJU19QQ0lfUFVUX0RFVklDRShpdmlkZW8tPm5icmlkZ2UpOwogCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JICAgCWtmcmVlKHNpc19mYl9pbmZvKTsKLQkgICAJcmV0dXJuIC1FTk9ERVY7CisJCWlmKCFpdmlkZW8tPnNpc3ZnYV9lbmFibGVkKQorCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShzaXNfZmJfaW5mbyk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IEZyYW1lYnVmZmVyIGF0IDB4JWx4LCBtYXBwZWQgdG8gMHglbHgsIHNpemUgJWxka1xuIiwKLQkgICAgICAgCWl2aWRlby0+dmlkZW9fYmFzZSwgKFVMT05HKWl2aWRlby0+dmlkZW9fdmJhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSAvIDEwMjQpOworCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBWaWRlbyBSQU0gYXQgMHglbHgsIG1hcHBlZCB0byAweCVseCwgc2l6ZSAlbGRrXG4iLAorCQlpdmlkZW8tPnZpZGVvX2Jhc2UsICh1bnNpZ25lZCBsb25nKWl2aWRlby0+dmlkZW9fdmJhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSAvIDEwMjQpOworCisJaWYoaXZpZGVvLT52aWRlb19vZmZzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFZpZXdwb3J0IG9mZnNldCAlbGRrXG4iLAorCQkJaXZpZGVvLT52aWRlb19vZmZzZXQgLyAxMDI0KTsKKwl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogTU1JTyBhdCAweCVseCwgbWFwcGVkIHRvIDB4JWx4LCBzaXplICVsZGtcbiIsCi0JICAgICAgIAlpdmlkZW8tPm1taW9fYmFzZSwgKFVMT05HKWl2aWRlby0+bW1pb192YmFzZSwgaXZpZGVvLT5tbWlvX3NpemUgLyAxMDI0KTsKKwkJaXZpZGVvLT5tbWlvX2Jhc2UsICh1bnNpZ25lZCBsb25nKWl2aWRlby0+bW1pb192YmFzZSwgaXZpZGVvLT5tbWlvX3NpemUgLyAxMDI0KTsKIAorCisJLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBjb21tYW5kIHF1ZXVlICovCisJaWYoaXZpZGVvLT5zaXN2Z2FfZW5naW5lID09IFNJU18zMDBfVkdBKSB7CisJCWl2aWRlby0+Y21kUXVldWVTaXplID0gVFVSQk9fUVVFVUVfQVJFQV9TSVpFOworCX0gZWxzZSB7CisJCWlmKGl2aWRlby0+Y2hpcCA9PSBYR0lfMjApIHsKKwkJCWl2aWRlby0+Y21kUXVldWVTaXplID0gQ09NTUFORF9RVUVVRV9BUkVBX1NJWkVfWjc7CisJCX0gZWxzZSB7CisJCQlpdmlkZW8tPmNtZFF1ZXVlU2l6ZSA9IENPTU1BTkRfUVVFVUVfQVJFQV9TSVpFOworCQl9CisJfQorCisJLyogRW5naW5lcyBhcmUgbm8gbG9uZ2VyIGluaXRpYWxpemVkIGhlcmU7IHRoaXMgaXMKKwkgKiBub3cgZG9uZSBhZnRlciB0aGUgZmlyc3QgbW9kZS1zd2l0Y2ggKGlmIHRoZQorCSAqIHN1Ym1pdHRlZCB2YXIgaGFzIGl0cyBhY2NlbGVyYXRpb24gZmxhZ3Mgc2V0KS4KKwkgKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgYmFzZSBvZiB0aGUgKHVudXNlZCkgaHcgY3Vyc29yICovCisJaXZpZGVvLT5od2N1cnNvcl92YmFzZSA9IGl2aWRlby0+dmlkZW9fdmJhc2UKKwkJCQkgKyBpdmlkZW8tPnZpZGVvX3NpemUKKwkJCQkgLSBpdmlkZW8tPmNtZFF1ZXVlU2l6ZQorCQkJCSAtIGl2aWRlby0+aHdjdXJzb3Jfc2l6ZTsKKwlpdmlkZW8tPmNhcHMgfD0gSFdfQ1VSU09SX0NBUDsKKworCS8qIEluaXRpYWxpemUgb2Zmc2NyZWVuIG1lbW9yeSBtYW5hZ2VyICovCiAJaWYoKGl2aWRlby0+aGF2ZW5vaGVhcCA9IHNpc2ZiX2hlYXBfaW5pdChpdmlkZW8pKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzaXNmYjogRmFpbGVkIHRvIGluaXRpYWxpemUgb2Zmc2NyZWVuIG1lbW9yeSBoZWFwXG4iKTsKIAl9CiAKIAkvKiBVc2VkIGZvciBjbGVhcmluZyB0aGUgc2NyZWVuIG9ubHksIHRoZXJlZm9yZSByZXNwZWN0IG91ciBtZW0gbGltaXQgKi8KLQlpdmlkZW8tPnNpc2h3X2V4dC51bFZpZGVvTWVtb3J5U2l6ZSA9IGl2aWRlby0+c2lzZmJfbWVtOworCWl2aWRlby0+U2lTX1ByLlZpZGVvTWVtb3J5QWRkcmVzcyArPSBpdmlkZW8tPnZpZGVvX29mZnNldDsKKwlpdmlkZW8tPlNpU19Qci5WaWRlb01lbW9yeVNpemUgPSBpdmlkZW8tPnNpc2ZiX21lbTsKIAotCWl2aWRlby0+bXRyciA9IDA7CisJaXZpZGVvLT5tdHJyID0gLTE7CiAKIAlpdmlkZW8tPnZiZmxhZ3MgPSAwOwogCWl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IERFRkFVTFRfTENETU9ERTsKIAlpdmlkZW8tPnR2ZGVmbW9kZWlkeCAgPSBERUZBVUxUX1RWTU9ERTsKIAlpdmlkZW8tPmRlZm1vZGVpZHggICAgPSBERUZBVUxUX01PREU7CiAKLQlpdmlkZW8tPm5ld3JvbSA9IFNpU0RldGVybWluZVJPTUxheW91dDY2MSgmaXZpZGVvLT5TaVNfUHIsICZpdmlkZW8tPnNpc2h3X2V4dCk7CisJaXZpZGVvLT5uZXdyb20gPSAwOworCWlmKGl2aWRlby0+Y2hpcCA8IFhHSV8yMCkgeworCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHsKKwkJCWl2aWRlby0+bmV3cm9tID0gU2lTRGV0ZXJtaW5lUk9NTGF5b3V0NjYxKCZpdmlkZW8tPlNpU19Qcik7CisJCX0KKwl9CiAKIAlpZigoaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCA8IDApIHx8CiAJICAgKChzaXNiaW9zX21vZGVbaXZpZGVvLT5zaXNmYl9tb2RlX2lkeF0ubW9kZV9ub1tpdmlkZW8tPm1uaV0pICE9IDB4RkYpKSB7CkBAIC01MjE3LDE5MiArNjM2NSw1NyBAQAogCiAJCXNpc2ZiX2dldF9WQl90eXBlKGl2aWRlbyk7CiAKLQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfVklERU9CUklER0UpIHsKKwkJaWYoaXZpZGVvLT52YmZsYWdzMiAmIFZCMl9WSURFT0JSSURHRSkgewogCQkJc2lzZmJfZGV0ZWN0X1ZCX2Nvbm5lY3QoaXZpZGVvKTsKIAkJfQogCiAJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgPSBpdmlkZW8tPnZiZmxhZ3MgJiAoVkJfVklERU9CUklER0UgfCBUVl9TVEFOREFSRCk7CiAKLQkJaWYoaXZpZGVvLT52YmZsYWdzICYgVkJfVklERU9CUklER0UpIHsKLQkJICAgaWYoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSAhPSAtMSkgewotCQkgICAgICBpZigoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSA9PSBDUlQyX0xDRCkgJiYgKGl2aWRlby0+dmJmbGFncyAmIENSVDJfTENEKSkgewotCQkgICAgICAgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IENSVDJfTENEOwotCQkgICAgICB9IGVsc2UgaWYoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSAhPSBDUlQyX0xDRCkgewotCQkgICAgICAgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IGl2aWRlby0+c2lzZmJfY3J0MnR5cGU7Ci0JCSAgICAgIH0KLQkJICAgfSBlbHNlIHsKLQkJICAgICAgLyogQ2hyb250ZWwgNzAweCBUViBkZXRlY3Rpb24gb2Z0ZW4gdW5yZWxpYWJsZSwgdGhlcmVmb3JlIHVzZSBhCi0JCSAgICAgICAqIGRpZmZlcmVudCBkZWZhdWx0IG9yZGVyIG9uIHN1Y2ggbWFjaGluZXMKLQkJICAgICAgICovCi0JCSAgICAgIGlmKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmIChpdmlkZW8tPnZiZmxhZ3MgJiBWQl9DSFJPTlRFTCkpIHsKLQkJICAgICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpICAgICAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX0xDRDsKLQkJICAgICAgICAgZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKSAgaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1RWOwotCQkgICAgICAgICBlbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfVkdBKSBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IENSVDJfVkdBOwotCQkgICAgICB9IGVsc2UgewotCQkgICAgICAgICBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKSAgICAgICBpdmlkZW8tPmN1cnJlbnR2YmZsYWdzIHw9IENSVDJfVFY7Ci0JCSAgICAgICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9MQ0Q7Ci0JCSAgICAgICAgIGVsc2UgaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9WR0EpIGl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9WR0E7Ci0JCSAgICAgIH0KLQkJICAgfQorCQkvKiBEZWNpZGUgb24gd2hpY2ggQ1JUMiBkZXZpY2UgdG8gdXNlICovCisJCWlmKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfVklERU9CUklER0UpIHsKKwkJCWlmKGl2aWRlby0+c2lzZmJfY3J0MnR5cGUgIT0gLTEpIHsKKwkJCQlpZigoaXZpZGVvLT5zaXNmYl9jcnQydHlwZSA9PSBDUlQyX0xDRCkgJiYKKwkJCQkgICAoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpKSB7CisJCQkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9MQ0Q7CisJCQkJfSBlbHNlIGlmKGl2aWRlby0+c2lzZmJfY3J0MnR5cGUgIT0gQ1JUMl9MQ0QpIHsKKwkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBpdmlkZW8tPnNpc2ZiX2NydDJ0eXBlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogQ2hyb250ZWwgNzAweCBUViBkZXRlY3Rpb24gb2Z0ZW4gdW5yZWxpYWJsZSwgdGhlcmVmb3JlCisJCQkJICogdXNlIGEgZGlmZmVyZW50IGRlZmF1bHQgb3JkZXIgb24gc3VjaCBtYWNoaW5lcworCQkJCSAqLworCQkJCWlmKChpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpICYmCisJCQkJICAgKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfQ0hST05URUwpKSB7CisJCQkJCWlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfTENEKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX0xDRDsKKwkJCQkJZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1RWOworCQkJCQllbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfVkdBKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1ZHQTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1RWKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX1RWOworCQkJCQllbHNlIGlmKGl2aWRlby0+dmJmbGFncyAmIENSVDJfTENEKQorCQkJCQkJaXZpZGVvLT5jdXJyZW50dmJmbGFncyB8PSBDUlQyX0xDRDsKKwkJCQkJZWxzZSBpZihpdmlkZW8tPnZiZmxhZ3MgJiBDUlQyX1ZHQSkKKwkJCQkJCWl2aWRlby0+Y3VycmVudHZiZmxhZ3MgfD0gQ1JUMl9WR0E7CisJCQkJfQorCQkJfQogCQl9CiAKIAkJaWYoaXZpZGVvLT52YmZsYWdzICYgQ1JUMl9MQ0QpIHsKLQkJICAgaW5TSVNJRFhSRUcoU0lTQ1IsIDB4MzYsIHJlZyk7Ci0JCSAgIHJlZyAmPSAweDBmOwotCQkgICBpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkJICAgICAgaXZpZGVvLT5DUlQyTENEVHlwZSA9IHNpczMwMHBhbmVsdHlwZVtyZWddOwotCQkgICB9IGVsc2UgaWYoaXZpZGVvLT5jaGlwID49IFNJU182NjEpIHsKLQkJICAgICAgaXZpZGVvLT5DUlQyTENEVHlwZSA9IHNpczY2MXBhbmVsdHlwZVtyZWddOwotCQkgICB9IGVsc2UgewotCQkgICAgICBpdmlkZW8tPkNSVDJMQ0RUeXBlID0gc2lzMzEwcGFuZWx0eXBlW3JlZ107Ci0JCSAgICAgIGlmKChpdmlkZW8tPmNoaXAgPT0gU0lTXzU1MCkgJiYgKHNpc2ZiX2ZzdG4pKSB7Ci0JCSAgICAgICAgIGlmKChpdmlkZW8tPkNSVDJMQ0RUeXBlICE9IExDRF82NDB4NDgwXzIpICYmCi0JCQkgICAgKGl2aWRlby0+Q1JUMkxDRFR5cGUgIT0gTENEXzY0MHg0ODBfMykpIHsKLQkJICAgICAgCSAgICBpdmlkZW8tPkNSVDJMQ0RUeXBlID0gTENEXzMyMHg0ODA7Ci0JCQkgfQotCQkgICAgICB9Ci0JCSAgIH0KLQkJICAgaWYoaXZpZGVvLT5DUlQyTENEVHlwZSA9PSBMQ0RfVU5LTk9XTikgewotCQkgICAgICAvKiBGb3IgYnJva2VuIEJJT1NlczogQXNzdW1lIDEwMjR4NzY4LCBSR0IxOCAqLwotCQkgICAgICBpdmlkZW8tPkNSVDJMQ0RUeXBlID0gTENEXzEwMjR4NzY4OwotCQkgICAgICBzZXRTSVNJRFhSRUcoU0lTQ1IsMHgzNiwweGYwLDB4MDIpOwotCQkgICAgICBzZXRTSVNJRFhSRUcoU0lTQ1IsMHgzNywweGVlLDB4MDEpOwotCQkgICAgICBwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEludmFsaWQgcGFuZWwgSUQgKCUwMngpLCBhc3N1bWluZyAxMDI0eDc2OCwgUkdCMThcbiIsIHJlZyk7Ci0JCSAgIH0KLQkJICAgZm9yKGkgPSAwOyBpIDwgU0lTX0xDRF9OVU1CRVI7IGkrKykgewotCQkgICAgICBpZihpdmlkZW8tPkNSVDJMQ0RUeXBlID09IHNpc19sY2RfZGF0YVtpXS5sY2R0eXBlKSB7Ci0JCSAgICAgICAgIGl2aWRlby0+bGNkeHJlcyA9IHNpc19sY2RfZGF0YVtpXS54cmVzOwotCQkJIGl2aWRlby0+bGNkeXJlcyA9IHNpc19sY2RfZGF0YVtpXS55cmVzOwotCQkJIGl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IHNpc19sY2RfZGF0YVtpXS5kZWZhdWx0X21vZGVfaWR4OwotCQkJIGJyZWFrOwotCQkgICAgICB9Ci0JCSAgIH0KLQkJICAgaWYoaXZpZGVvLT5TaVNfUHIuU2lTX0N1c3RvbVQgPT0gQ1VUX0JBUkNPMTM2NikgewotCSAgIAkJaXZpZGVvLT5sY2R4cmVzID0gMTM2MDsgaXZpZGVvLT5sY2R5cmVzID0gMTAyNDsgaXZpZGVvLT5sY2RkZWZtb2RlaWR4ID0gOTk7Ci0JCSAgIH0gZWxzZSBpZihpdmlkZW8tPlNpU19Qci5TaVNfQ3VzdG9tVCA9PSBDVVRfUEFORUw4NDgpIHsKLQkgICAJCWl2aWRlby0+bGNkeHJlcyA9ICA4NDg7IGl2aWRlby0+bGNkeXJlcyA9ICA0ODA7IGl2aWRlby0+bGNkZGVmbW9kZWlkeCA9IDQ3OwotCQkgICB9Ci0JCSAgIHByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogRGV0ZWN0ZWQgJWR4JWQgZmxhdCBwYW5lbFxuIiwKLQkJICAgCQlpdmlkZW8tPmxjZHhyZXMsIGl2aWRlby0+bGNkeXJlcyk7CisJCQlzaXNmYl9kZXRlY3RfbGNkX3R5cGUoaXZpZGVvKTsKIAkJfQogCi0jaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IFBhbmVsRGVsYXlDb21wZW5zYXRpb24gaWYgdGhlIExDRCBpcyBjdXJyZW50bHkgdXNlZCAqLwotCQlpZihpdmlkZW8tPnNpc3ZnYV9lbmdpbmUgPT0gU0lTXzMwMF9WR0EpIHsKLQkgICAgICAgICAgIGlmKGl2aWRlby0+dmJmbGFncyAmIChWQl9MVkRTIHwgVkJfMzB4QkRIKSkgewotCQkgICAgICAgaW50IHRtcDsKLQkJICAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4MzAsdG1wKTsKLQkJICAgICAgIGlmKHRtcCAmIDB4MjApIHsKLQkJICAgICAgICAgIC8qIEN1cnJlbnRseSBvbiBMQ0Q/IElmIHllcywgcmVhZCBjdXJyZW50IHBkYyAqLwotCQkgICAgICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgxMyxpdmlkZW8tPmRldGVjdGVkcGRjKTsKLQkJCSAgaXZpZGVvLT5kZXRlY3RlZHBkYyAmPSAweDNjOwotCQkJICBpZihpdmlkZW8tPlNpU19Qci5QREMgPT0gLTEpIHsKLQkJCSAgICAgLyogTGV0IG9wdGlvbiBvdmVycmlkZSBkZXRlY3Rpb24gKi8KLQkJCSAgICAgaXZpZGVvLT5TaVNfUHIuUERDID0gaXZpZGVvLT5kZXRlY3RlZHBkYzsKLQkJCSAgfQotCQkJICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogRGV0ZWN0ZWQgTENEIFBEQyAweCUwMnhcbiIsCi0gIAkJCSAgICAgICAgIGl2aWRlby0+ZGV0ZWN0ZWRwZGMpOwotCQkgICAgICAgfQotCQkgICAgICAgaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYgKGl2aWRlby0+U2lTX1ByLlBEQyAhPSBpdmlkZW8tPmRldGVjdGVkcGRjKSkgewotCQkgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFVzaW5nIExDRCBQREMgMHglMDJ4XG4iLAotCQkJCSBpdmlkZW8tPlNpU19Qci5QREMpOwotCQkgICAgICAgfQotCSAgICAgICAgICAgfQotCQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19GQl9TSVNfMzE1Ci0JCWlmKGl2aWRlby0+c2lzdmdhX2VuZ2luZSA9PSBTSVNfMzE1X1ZHQSkgewotCi0JCSAgIC8qIFRyeSB0byBmaW5kIGFib3V0IExDREEgKi8KLQkJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUMgfCBWQl8zMDJCIHwgVkJfMzAxTFYgfCBWQl8zMDJMViB8IFZCXzMwMkVMVikpIHsKLQkJICAgICAgaW50IHRtcDsKLQkJICAgICAgaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgxMyx0bXApOwotCQkgICAgICBpZih0bXAgJiAweDA0KSB7Ci0JCSAgICAgICAgIGl2aWRlby0+U2lTX1ByLlNpU19Vc2VMQ0RBID0gVFJVRTsKLQkJICAgICAgICAgaXZpZGVvLT5kZXRlY3RlZGxjZGEgPSAweDAzOwotCQkgICAgICB9Ci0JICAgICAgICAgICB9Ci0KLQkJICAgLyogU2F2ZSBQREMgKi8KLQkJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUxWIHwgVkJfMzAyTFYgfCBWQl8zMDJFTFYpKSB7Ci0JCSAgICAgIGludCB0bXA7Ci0JCSAgICAgIGluU0lTSURYUkVHKFNJU0NSLDB4MzAsdG1wKTsKLQkJICAgICAgaWYoKHRtcCAmIDB4MjApIHx8IChpdmlkZW8tPmRldGVjdGVkbGNkYSAhPSAweGZmKSkgewotCQkgICAgICAgICAvKiBDdXJyZW50bHkgb24gTENEPyBJZiB5ZXMsIHJlYWQgY3VycmVudCBwZGMgKi8KLQkJCSB1OCBwZGM7Ci0JCSAgICAgICAgIGluU0lTSURYUkVHKFNJU1BBUlQxLDB4MkQscGRjKTsKLQkJCSBpdmlkZW8tPmRldGVjdGVkcGRjICA9IChwZGMgJiAweDBmKSA8PCAxOwotCQkJIGl2aWRlby0+ZGV0ZWN0ZWRwZGNhID0gKHBkYyAmIDB4ZjApID4+IDM7Ci0JCQkgaW5TSVNJRFhSRUcoU0lTUEFSVDEsMHgzNSxwZGMpOwotCQkJIGl2aWRlby0+ZGV0ZWN0ZWRwZGMgfD0gKChwZGMgPj4gNykgJiAweDAxKTsKLQkJCSBpblNJU0lEWFJFRyhTSVNQQVJUMSwweDIwLHBkYyk7Ci0JCQkgaXZpZGVvLT5kZXRlY3RlZHBkY2EgfD0gKChwZGMgPj4gNikgJiAweDAxKTsKLQkJCSBpZihpdmlkZW8tPm5ld3JvbSkgewotCQkJICAgIC8qIE5ldyBST00gaW52YWxpZGF0ZXMgb3RoZXIgUERDIHJlc3AuICovCi0JCQkgICAgaWYoaXZpZGVvLT5kZXRlY3RlZGxjZGEgIT0gMHhmZikgewotCQkJICAgICAgIGl2aWRlby0+ZGV0ZWN0ZWRwZGMgPSAweGZmOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgaXZpZGVvLT5kZXRlY3RlZHBkY2EgPSAweGZmOwotCQkJICAgIH0KLQkJCSB9Ci0JCQkgaWYoaXZpZGVvLT5TaVNfUHIuUERDID09IC0xKSB7Ci0JCQkgICAgaWYoaXZpZGVvLT5kZXRlY3RlZHBkYyAhPSAweGZmKSB7Ci0JCQkgICAgICAgaXZpZGVvLT5TaVNfUHIuUERDID0gaXZpZGVvLT5kZXRlY3RlZHBkYzsKLQkJCSAgICB9Ci0JCQkgfQotCQkJIGlmKGl2aWRlby0+U2lTX1ByLlBEQ0EgPT0gLTEpIHsKLQkJCSAgICBpZihpdmlkZW8tPmRldGVjdGVkcGRjYSAhPSAweGZmKSB7Ci0JCQkgICAgICAgaXZpZGVvLT5TaVNfUHIuUERDQSA9IGl2aWRlby0+ZGV0ZWN0ZWRwZGNhOwotCQkJICAgIH0KLQkJCSB9Ci0JCQkgaWYoaXZpZGVvLT5kZXRlY3RlZHBkYyAhPSAweGZmKSB7Ci0JCQkgICAgcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICAgInNpc2ZiOiBEZXRlY3RlZCBMQ0QgUERDIDB4JTAyeCAoZm9yIExDRD1DUlQyKVxuIiwKLSAgCQkJICAgICAgICAgIGl2aWRlby0+ZGV0ZWN0ZWRwZGMpOwotCQkJIH0KLQkJCSBpZihpdmlkZW8tPmRldGVjdGVkcGRjYSAhPSAweGZmKSB7Ci0JCQkgICAgcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICAgInNpc2ZiOiBEZXRlY3RlZCBMQ0QgUERDMSAweCUwMnggKGZvciBMQ0Q9Q1JUMSlcbiIsCi0gIAkJCSAgICAgICAgICBpdmlkZW8tPmRldGVjdGVkcGRjYSk7Ci0JCQkgfQotCQkgICAgICB9Ci0KLQkJICAgICAgLyogU2F2ZSBFTUkgKi8KLQkJICAgICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMkxWIHwgVkJfMzAyRUxWKSkgewotCQkgICAgICAgICBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDMwLGl2aWRlby0+U2lTX1ByLkVNSV8zMCk7Ci0JCQkgaW5TSVNJRFhSRUcoU0lTUEFSVDQsMHgzMSxpdmlkZW8tPlNpU19Qci5FTUlfMzEpOwotCQkJIGluU0lTSURYUkVHKFNJU1BBUlQ0LDB4MzIsaXZpZGVvLT5TaVNfUHIuRU1JXzMyKTsKLQkJCSBpblNJU0lEWFJFRyhTSVNQQVJUNCwweDMzLGl2aWRlby0+U2lTX1ByLkVNSV8zMyk7Ci0JCQkgaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSSA9IFRSVUU7Ci0JCQkgaWYoKHRtcCAmIDB4MjApIHx8IChpdmlkZW8tPmRldGVjdGVkbGNkYSAhPSAweGZmKSkgewotCQkJICAJaXZpZGVvLT5TaVNfUHIuSGF2ZUVNSUxDRCA9IFRSVUU7Ci0JCQkgfQotCQkgICAgICB9Ci0JCSAgIH0KLQotCQkgICAvKiBMZXQgdXNlciBvdmVycmlkZSBkZXRlY3RlZCBQRENzIChhbGwgYnJpZGdlcykgKi8KLQkJICAgaWYoaXZpZGVvLT52YmZsYWdzICYgKFZCXzMwMUIgfCBWQl8zMDFDIHwgVkJfMzAxTFYgfCBWQl8zMDJMViB8IFZCXzMwMkVMVikpIHsKLQkJICAgICAgaWYoKGl2aWRlby0+U2lTX1ByLlBEQyAhPSAtMSkgJiYgKGl2aWRlby0+U2lTX1ByLlBEQyAhPSBpdmlkZW8tPmRldGVjdGVkcGRjKSkgewotCQkgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQyAweCUwMnggKGZvciBMQ0Q9Q1JUMilcbiIsCi0JCQkJIGl2aWRlby0+U2lTX1ByLlBEQyk7Ci0JCSAgICAgIH0KLQkJICAgICAgaWYoKGl2aWRlby0+U2lTX1ByLlBEQ0EgIT0gLTEpICYmIChpdmlkZW8tPlNpU19Qci5QRENBICE9IGl2aWRlby0+ZGV0ZWN0ZWRwZGNhKSkgewotCQkgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzaXNmYjogVXNpbmcgTENEIFBEQzEgMHglMDJ4IChmb3IgTENEPUNSVDEpXG4iLAotCQkJCSBpdmlkZW8tPlNpU19Qci5QRENBKTsKLQkJICAgICAgfQotCQkgICB9Ci0KLQkJfQotI2VuZGlmCisJCXNpc2ZiX3NhdmVfcGRjX2VtaShpdmlkZW8pOwogCiAJCWlmKCFpdmlkZW8tPnNpc2ZiX2NydDFvZmYpIHsKLQkJICAgCXNpc2ZiX2hhbmRsZV9kZGMoaXZpZGVvLCAmaXZpZGVvLT5zaXNmYl90aGlzbW9uaXRvciwgMCk7CisJCQlzaXNmYl9oYW5kbGVfZGRjKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIDApOwogCQl9IGVsc2UgewotCQkgICAJaWYoKGl2aWRlby0+dmJmbGFncyAmIChWQl8zMDF8VkJfMzAxQnxWQl8zMDFDfFZCXzMwMkIpKSAmJgotCQkgICAgICAJICAgKGl2aWRlby0+dmJmbGFncyAmIChDUlQyX1ZHQSB8IENSVDJfTENEKSkpIHsKLQkJICAgICAgCQlzaXNmYl9oYW5kbGVfZGRjKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIDEpOwotCQkgICAJfQorCQkJaWYoKGl2aWRlby0+dmJmbGFnczIgJiBWQjJfU0lTVE1EU0JSSURHRSkgJiYKKwkJCSAgIChpdmlkZW8tPnZiZmxhZ3MgJiAoQ1JUMl9WR0EgfCBDUlQyX0xDRCkpKSB7CisJCQkJc2lzZmJfaGFuZGxlX2RkYyhpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLCAxKTsKKwkJCX0KIAkJfQogCiAJCWlmKGl2aWRlby0+c2lzZmJfbW9kZV9pZHggPj0gMCkgewpAQCAtNTQzNCw3ICs2NDQ3LDggQEAKIAkJaXZpZGVvLT5tb2RlX25vID0gc2lzYmlvc19tb2RlW2l2aWRlby0+c2lzZmJfbW9kZV9pZHhdLm1vZGVfbm9baXZpZGVvLT5tbmldOwogCiAJCWlmKGl2aWRlby0+cmVmcmVzaF9yYXRlICE9IDApIHsKLQkJCXNpc2ZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoaXZpZGVvLCBpdmlkZW8tPnJlZnJlc2hfcmF0ZSwgaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCk7CisJCQlzaXNmYl9zZWFyY2hfcmVmcmVzaF9yYXRlKGl2aWRlbywgaXZpZGVvLT5yZWZyZXNoX3JhdGUsCisJCQkJCQlpdmlkZW8tPnNpc2ZiX21vZGVfaWR4KTsKIAkJfQogCiAJCWlmKGl2aWRlby0+cmF0ZV9pZHggPT0gMCkgewpAQCAtNTQ0Myw5ICs2NDU3LDEyIEBACiAJCX0KIAogCQlpZihpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLmRhdGF2YWxpZCkgewotCQkJaWYoIXNpc2ZiX3ZlcmlmeV9yYXRlKGl2aWRlbywgJml2aWRlby0+c2lzZmJfdGhpc21vbml0b3IsIGl2aWRlby0+c2lzZmJfbW9kZV9pZHgsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgaXZpZGVvLT5yYXRlX2lkeCwgaXZpZGVvLT5yZWZyZXNoX3JhdGUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFdBUk5JTkc6IFJlZnJlc2ggcmF0ZSBleGNlZWRzIG1vbml0b3Igc3BlY3MhXG4iKTsKKwkJCWlmKCFzaXNmYl92ZXJpZnlfcmF0ZShpdmlkZW8sICZpdmlkZW8tPnNpc2ZiX3RoaXNtb25pdG9yLAorCQkJCQkJaXZpZGVvLT5zaXNmYl9tb2RlX2lkeCwKKwkJCQkJCWl2aWRlby0+cmF0ZV9pZHgsCisJCQkJCQlpdmlkZW8tPnJlZnJlc2hfcmF0ZSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogV0FSTklORzogUmVmcmVzaCByYXRlICIKKwkJCQkJCQkiZXhjZWVkcyBtb25pdG9yIHNwZWNzIVxuIik7CiAJCQl9CiAJCX0KIApAQCAtNTQ1NCwyOCArNjQ3MSwzNCBAQAogCQlpdmlkZW8tPnZpZGVvX2hlaWdodCA9IHNpc2Jpb3NfbW9kZVtpdmlkZW8tPnNpc2ZiX21vZGVfaWR4XS55cmVzOwogCiAJCXNpc2ZiX3NldF92cGFybXMoaXZpZGVvKTsKLQkJCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCQogCi0JCS8qIC0tLS0tLS0tLS0tLS0tLS0gRm9yIDIuNDogTm93IHN3aXRjaCB0aGUgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0gKi8JCQotCQkKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IE1vZGUgaXMgJWR4JWR4JWQgKCVkSHopXG4iLAotCSAgICAgICAJCWl2aWRlby0+dmlkZW9fd2lkdGgsIGl2aWRlby0+dmlkZW9faGVpZ2h0LCBpdmlkZW8tPnZpZGVvX2JwcCwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tIEZvciAyLjQ6IE5vdyBzd2l0Y2ggdGhlIG1vZGUgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IFNldHRpbmcgbW9kZSAlZHglZHglZCAoJWRIeilcbiIsCisJCQlpdmlkZW8tPnZpZGVvX3dpZHRoLCBpdmlkZW8tPnZpZGVvX2hlaWdodCwgaXZpZGVvLT52aWRlb19icHAsCiAJCQlpdmlkZW8tPnJlZnJlc2hfcmF0ZSk7CiAKKwkJLyogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFjY2VsZXJhdGlvbiBpcyB0byBiZQorCQkgKiB1c2VkLiBOZWVkIHRvIGtub3cgYmVmb3JlIHByZS9wb3N0X3NldF9tb2RlKCkKKwkJICovCisJCWl2aWRlby0+YWNjZWwgPSAwOworCQlpdmlkZW8tPmRlZmF1bHRfdmFyLmFjY2VsX2ZsYWdzICY9IH5GQl9BQ0NFTEZfVEVYVDsKKwkJaWYoaXZpZGVvLT5zaXNmYl9hY2NlbCkgeworCQkJaXZpZGVvLT5hY2NlbCA9IC0xOworCQkJaXZpZGVvLT5kZWZhdWx0X3Zhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKKwkJfQorCisJCS8qIE5vdyBzd2l0Y2ggdGhlIG1vZGUgKi8KIAkJc2lzZmJfcHJlX3NldG1vZGUoaXZpZGVvKTsKIAotCQlpZihTaVNTZXRNb2RlKCZpdmlkZW8tPlNpU19QciwgJml2aWRlby0+c2lzaHdfZXh0LCBpdmlkZW8tPm1vZGVfbm8pID09IDApIHsKKwkJaWYoU2lTU2V0TW9kZSgmaXZpZGVvLT5TaVNfUHIsIGl2aWRlby0+bW9kZV9ubykgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogRmF0YWwgZXJyb3I6IFNldHRpbmcgbW9kZVsweCV4XSBmYWlsZWRcbiIsCiAJCQkJCQkJCQlpdmlkZW8tPm1vZGVfbm8pOwotCQkJaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKKwkJCXJldCA9IC1FSU5WQUw7CiAJCQlpb3VubWFwKGl2aWRlby0+bW1pb192YmFzZSk7Ci0JCQlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGl2aWRlby0+bW1pb19iYXNlLCBpdmlkZW8tPm1taW9fc2l6ZSk7Ci0JCQlpZihpdmlkZW8tPmJpb3NfYWJhc2UpIHZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7Ci0JCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JCQlrZnJlZShzaXNfZmJfaW5mbyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3JfMDsKIAkJfQogCiAJCW91dFNJU0lEWFJFRyhTSVNTUiwgSU5EX1NJU19QQVNTV09SRCwgU0lTX1BBU1NXT1JEKTsKQEAgLTU0ODgsMTggKzY1MTEsMTcgQEAKIAkJLyogRm9yY2UgcmVzZXQgb2YgeCB2aXJ0dWFsIGluIGNydGNfdG9fdmFyICovCiAJCWl2aWRlby0+ZGVmYXVsdF92YXIueHJlc192aXJ0dWFsID0gMDsKIAorCQkvKiBDb3B5IG1vZGUgdGltaW5nIHRvIHZhciAqLwogCQlzaXNmYl9jcnRjX3RvX3ZhcihpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKIAorCQkvKiBGaW5kIG91dCBhYm91dCBzY3JlZW4gcGl0Y2ggKi8KIAkJc2lzZmJfY2FsY19waXRjaChpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKIAkJc2lzZmJfc2V0X3BpdGNoKGl2aWRlbyk7CiAKLQkJaXZpZGVvLT5hY2NlbCA9IDA7Ci0JCWlmKGl2aWRlby0+c2lzZmJfYWNjZWwpIHsKLQkJICAgaXZpZGVvLT5hY2NlbCA9IC0xOwotCQkgICBpdmlkZW8tPmRlZmF1bHRfdmFyLmFjY2VsX2ZsYWdzIHw9IEZCX0FDQ0VMRl9URVhUOwotCQl9CisJCS8qIEluaXQgdGhlIGFjY2VsZXJhdG9yIChkb2VzIG5vdGhpbmcgY3VycmVudGx5KSAqLwogCQlzaXNmYl9pbml0YWNjZWwoaXZpZGVvKTsKLQkJCisKKwkJLyogSW5pdCBzb21lIGZiaW5mbyBlbnRyaWVzICovCiAJCXNpc19mYl9pbmZvLT5ub2RlICA9IC0xOwogCQlzaXNfZmJfaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOwogCQlzaXNfZmJfaW5mby0+ZmJvcHMgPSAmc2lzZmJfb3BzOwpAQCAtNTUxNSw0MSArNjUzNyw0MiBAQAogI2Vsc2UJCS8qIC0tLS0tLS0tLSBGb3IgMi42OiBTZXR1cCBhIHNvbWV3aGF0IHNhbmUgZGVmYXVsdCB2YXIgLS0tLS0tLS0tLS0tICovCiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IERlZmF1bHQgbW9kZSBpcyAlZHglZHglZCAoJWRIeilcbiIsCi0JICAgICAgIAkJaXZpZGVvLT52aWRlb193aWR0aCwgaXZpZGVvLT52aWRlb19oZWlnaHQsIGl2aWRlby0+dmlkZW9fYnBwLAorCQkJaXZpZGVvLT52aWRlb193aWR0aCwgaXZpZGVvLT52aWRlb19oZWlnaHQsIGl2aWRlby0+dmlkZW9fYnBwLAogCQkJaXZpZGVvLT5yZWZyZXNoX3JhdGUpOwogCisJCS8qIFNldCB1cCB0aGUgZGVmYXVsdCB2YXIgYWNjb3JkaW5nIHRvIGNob3NlbiBkZWZhdWx0IGRpc3BsYXkgbW9kZSAqLwogCQlpdmlkZW8tPmRlZmF1bHRfdmFyLnhyZXMgPSBpdmlkZW8tPmRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IGl2aWRlby0+dmlkZW9fd2lkdGg7CiAJCWl2aWRlby0+ZGVmYXVsdF92YXIueXJlcyA9IGl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gaXZpZGVvLT52aWRlb19oZWlnaHQ7CiAJCWl2aWRlby0+ZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwgPSBpdmlkZW8tPnZpZGVvX2JwcDsKIAogCQlzaXNmYl9icHBfdG9fdmFyKGl2aWRlbywgJml2aWRlby0+ZGVmYXVsdF92YXIpOwotCQkKKwogCQlpdmlkZW8tPmRlZmF1bHRfdmFyLnBpeGNsb2NrID0gKHUzMikgKDEwMDAwMDAwMDAgLwotCQkJCXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQsCi0JCQkJCQlpdmlkZW8tPm1vZGVfbm8sIGl2aWRlby0+cmF0ZV9pZHgpKTsKLQkJCQkJCQotCQlpZihzaXNmYl9tb2RlX3JhdGVfdG9fZGRhdGEoJml2aWRlby0+U2lTX1ByLCAmaXZpZGVvLT5zaXNod19leHQsCi0JCQkgCWl2aWRlby0+bW9kZV9ubywgaXZpZGVvLT5yYXRlX2lkeCwgJml2aWRlby0+ZGVmYXVsdF92YXIpKSB7Ci0JCSAgIGlmKChpdmlkZW8tPmRlZmF1bHRfdmFyLnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7Ci0JCSAgICAgIGl2aWRlby0+ZGVmYXVsdF92YXIucGl4Y2xvY2sgPDw9IDE7Ci0JICAgCSAgIH0KLQkgICAgICAgIH0KKwkJCXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPm1vZGVfbm8sIGl2aWRlby0+cmF0ZV9pZHgpKTsKKworCQlpZihzaXNmYl9tb2RlX3JhdGVfdG9fZGRhdGEoJml2aWRlby0+U2lTX1ByLCBpdmlkZW8tPm1vZGVfbm8sCisJCQkJCQlpdmlkZW8tPnJhdGVfaWR4LCAmaXZpZGVvLT5kZWZhdWx0X3ZhcikpIHsKKwkJCWlmKChpdmlkZW8tPmRlZmF1bHRfdmFyLnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKSB7CisJCQkJaXZpZGVvLT5kZWZhdWx0X3Zhci5waXhjbG9jayA8PD0gMTsKKwkJCX0KKwkJfQogCiAJCWlmKGl2aWRlby0+c2lzZmJfeXBhbikgewotCQkgICAvKiBNYXhpbWl6ZSByZWdhcmRsZXNzIG9mIHNpc2ZiX21heCBhdCBzdGFydHVwICovCi0JICAgIAkgICBpdmlkZW8tPmRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9IHNpc2ZiX2NhbGNfbWF4eXJlcyhpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKLQkgICAgCSAgIGlmKGl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsIDwgaXZpZGVvLT5kZWZhdWx0X3Zhci55cmVzKSB7Ci0JICAgICAgICAgICAgICBpdmlkZW8tPmRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9IGl2aWRlby0+ZGVmYXVsdF92YXIueXJlczsKLQkgICAgCSAgIH0KKwkJCS8qIE1heGltaXplIHJlZ2FyZGxlc3Mgb2Ygc2lzZmJfbWF4IGF0IHN0YXJ0dXAgKi8KKwkJCWl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0KKwkJCQlzaXNmYl9jYWxjX21heHlyZXMoaXZpZGVvLCAmaXZpZGVvLT5kZWZhdWx0X3Zhcik7CisJCQlpZihpdmlkZW8tPmRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA8IGl2aWRlby0+ZGVmYXVsdF92YXIueXJlcykgeworCQkJCWl2aWRlby0+ZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gaXZpZGVvLT5kZWZhdWx0X3Zhci55cmVzOworCQkJfQogCQl9CiAKIAkJc2lzZmJfY2FsY19waXRjaChpdmlkZW8sICZpdmlkZW8tPmRlZmF1bHRfdmFyKTsKIAogCQlpdmlkZW8tPmFjY2VsID0gMDsKIAkJaWYoaXZpZGVvLT5zaXNmYl9hY2NlbCkgewotCQkgICBpdmlkZW8tPmFjY2VsID0gLTE7CisJCQlpdmlkZW8tPmFjY2VsID0gLTE7CiAjaWZkZWYgU1RVUElEX0FDQ0VMRl9URVhUX1NISVQKLQkJICAgaXZpZGVvLT5kZWZhdWx0X3Zhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKKwkJCWl2aWRlby0+ZGVmYXVsdF92YXIuYWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7CiAjZW5kaWYKIAkJfQogCQlzaXNmYl9pbml0YWNjZWwoaXZpZGVvKTsKQEAgLTU1NjYsMjEgKzY1ODksMjEgQEAKICNlbmRpZgogCQlzaXNfZmJfaW5mby0+dmFyID0gaXZpZGVvLT5kZWZhdWx0X3ZhcjsKIAkJc2lzX2ZiX2luZm8tPmZpeCA9IGl2aWRlby0+c2lzZmJfZml4OwotCQlzaXNfZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlOworCQlzaXNfZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBpdmlkZW8tPnZpZGVvX3ZiYXNlICsgaXZpZGVvLT52aWRlb19vZmZzZXQ7CiAJCXNpc19mYl9pbmZvLT5mYm9wcyA9ICZzaXNmYl9vcHM7CiAKIAkJc2lzZmJfZ2V0X2ZpeCgmc2lzX2ZiX2luZm8tPmZpeCwgLTEsIHNpc19mYl9pbmZvKTsKIAkJc2lzX2ZiX2luZm8tPnBzZXVkb19wYWxldHRlID0gaXZpZGVvLT5wc2V1ZG9fcGFsZXR0ZTsKLQkJCisKIAkJZmJfYWxsb2NfY21hcCgmc2lzX2ZiX2luZm8tPmNtYXAsIDI1NiAsIDApOwogI2VuZGlmCQkvKiAyLjYgKi8KIAotCQlwcmludGsoS0VSTl9ERUJVRyAic2lzZmI6IEluaXRpYWwgdmJmbGFncyAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpaXZpZGVvLT52YmZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBJbml0aWFsIHZiZmxhZ3MgMHgleFxuIiwgKGludClpdmlkZW8tPnZiZmxhZ3MpOwogCiAjaWZkZWYgQ09ORklHX01UUlIKIAkJaXZpZGVvLT5tdHJyID0gbXRycl9hZGQoaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUsCiAJCQkJCU1UUlJfVFlQRV9XUkNPTUIsIDEpOwotCQlpZighaXZpZGVvLT5tdHJyKSB7CisJCWlmKGl2aWRlby0+bXRyciA8IDApIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogRmFpbGVkIHRvIGFkZCBNVFJSc1xuIik7CiAJCX0KICNlbmRpZgpAQCAtNTU5MSwxNCArNjYxNCw5IEBACiAKIAkJaWYocmVnaXN0ZXJfZnJhbWVidWZmZXIoc2lzX2ZiX2luZm8pIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJzaXNmYjogRmF0YWwgZXJyb3I6IEZhaWxlZCB0byByZWdpc3RlciBmcmFtZWJ1ZmZlclxuIik7Ci0JCQlpb3VubWFwKGl2aWRlby0+dmlkZW9fdmJhc2UpOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWlvdW5tYXAoaXZpZGVvLT5tbWlvX3ZiYXNlKTsKLQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPnZpZGVvX2Jhc2UsIGl2aWRlby0+dmlkZW9fc2l6ZSk7Ci0JCQlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT5tbWlvX2Jhc2UsIGl2aWRlby0+bW1pb19zaXplKTsKLQkJCWlmKGl2aWRlby0+Ymlvc19hYmFzZSkgdmZyZWUoaXZpZGVvLT5iaW9zX2FiYXNlKTsKLQkJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJCWtmcmVlKHNpc19mYl9pbmZvKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBlcnJvcl8wOwogCQl9CiAKIAkJaXZpZGVvLT5yZWdpc3RlcmVkID0gMTsKQEAgLTU2MDcsMjEgKzY2MjUsNDcgQEAKIAkJaXZpZGVvLT5uZXh0ID0gY2FyZF9saXN0OwogCQljYXJkX2xpc3QgPSBpdmlkZW87CiAKKyNpZmRlZiBTSVNfT0xEX0NPTkZJR19DT01QQVQKKwkJeworCQlpbnQgcmV0OworCQkvKiBPdXIgaW9jdGxzIGFyZSBhbGwgIjMyLzY0Yml0IGNvbXBhdGlibGUiICovCisJCXJldCA9ICByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT19BTExPQywgICAgICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT19GUkVFLCAgICAgICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT0dFVF9WQkxBTkssICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0lORk9fU0laRSwgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0lORk8sICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX1RWUE9TT0ZGU0VULCAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX1RWUE9TT0ZGU0VULCAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX0xPQ0ssICAgICAgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX1ZCUlNUQVRVUywgICAgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0FVVE9NQVhJTUlaRSwgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX0FVVE9NQVhJTUlaRSwgTlVMTCk7CisJCXJldCB8PSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfQ09NTUFORCwgICAgICAgICAgTlVMTCk7CisJCWlmKHJldCkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJzaXNmYjogRXJyb3IgcmVnaXN0ZXJpbmcgaW9jdGwzMiB0cmFuc2xhdGlvbnNcbiIpOworCQllbHNlCisJCQlpdmlkZW8tPmlvY3RsMzJyZWdpc3RlcmVkID0gMTsKKwkJfQorI2VuZGlmCisKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2lzZmI6IDJEIGFjY2VsZXJhdGlvbiBpcyAlcywgeS1wYW5uaW5nICVzXG4iLAotCQkgICAgIGl2aWRlby0+c2lzZmJfYWNjZWwgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgICAgIGl2aWRlby0+c2lzZmJfeXBhbiAgPwotCQkgICAgIAkoaXZpZGVvLT5zaXNmYl9tYXggPyAiZW5hYmxlZCAoYXV0by1tYXgpIiA6ICJlbmFibGVkIChubyBhdXRvLW1heCkiKSA6ICJkaXNhYmxlZCIpOworCQkJaXZpZGVvLT5zaXNmYl9hY2NlbCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCQlpdmlkZW8tPnNpc2ZiX3lwYW4gID8KKwkJCQkoaXZpZGVvLT5zaXNmYl9tYXggPyAiZW5hYmxlZCAoYXV0by1tYXgpIiA6CisJCQkJCQkiZW5hYmxlZCAobm8gYXV0by1tYXgpIikgOgorCQkJCQkJCQkJImRpc2FibGVkIik7CiAKIAotCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlLCBWZXJzaW9uICVkLiVkLiVkXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlIHZlcnNpb24gJWQuJWQuJWRcbiIsCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JICAgICAgIAkJR0VUX0ZCX0lEWChzaXNfZmJfaW5mby0+bm9kZSksCisJCQlHRVRfRkJfSURYKHNpc19mYl9pbmZvLT5ub2RlKSwKICNlbHNlCi0JICAgICAgIAkJc2lzX2ZiX2luZm8tPm5vZGUsCisJCQlzaXNfZmJfaW5mby0+bm9kZSwKICNlbmRpZgogCQkJaXZpZGVvLT5teWlkLCBWRVJfTUFKT1IsIFZFUl9NSU5PUiwgVkVSX0xFVkVMKTsKIAotCQlwcmludGsoS0VSTl9JTkZPICJzaXNmYjogKEMpIDIwMDEtMjAwNCBUaG9tYXMgV2luaXNjaGhvZmVyLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUaG9tYXMgV2luaXNjaGhvZmVyXG4iKTsKIAogCX0JLyogaWYgbW9kZSA9ICJub25lIiAqLwogCkBAIC01NjM0LDI2ICs2Njc4LDYyIEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzaXNmYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGZiX2luZm8gICAgICAgICpzaXNfZmJfaW5mbyA9IGl2aWRlby0+bWVteXNlbGZhbmRpOwotCWludCAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkID0gaXZpZGVvLT5yZWdpc3RlcmVkOworCXN0cnVjdCBzaXNfdmlkZW9faW5mbwkqaXZpZGVvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBmYl9pbmZvCQkqc2lzX2ZiX2luZm8gPSBpdmlkZW8tPm1lbXlzZWxmYW5kaTsKKwlpbnQJCQlyZWdpc3RlcmVkID0gaXZpZGVvLT5yZWdpc3RlcmVkOworCWludAkJCW1vZGVjaGFuZ2VkID0gaXZpZGVvLT5tb2RlY2hhbmdlZDsKKworI2lmZGVmIFNJU19PTERfQ09ORklHX0NPTVBBVAorCWlmKGl2aWRlby0+aW9jdGwzMnJlZ2lzdGVyZWQpIHsKKwkJaW50IHJldDsKKwkJcmV0ID0gIHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEZCSU9fQUxMT0MpOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oRkJJT19GUkVFKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEZCSU9HRVRfVkJMQU5LKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKFNJU0ZCX0dFVF9JTkZPX1NJWkUpOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX0lORk8pOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfR0VUX1RWUE9TT0ZGU0VUKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKFNJU0ZCX1NFVF9UVlBPU09GRlNFVCk7CisJCXJldCB8PSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihTSVNGQl9TRVRfTE9DSyk7CisJCXJldCB8PSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihTSVNGQl9HRVRfVkJSU1RBVFVTKTsKKwkJcmV0IHw9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKFNJU0ZCX0dFVF9BVVRPTUFYSU1JWkUpOworCQlyZXQgfD0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oU0lTRkJfU0VUX0FVVE9NQVhJTUlaRSk7CisJCXJldCB8PSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihTSVNGQl9DT01NQU5EKTsKKwkJaWYocmV0KQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICJzaXNmYjogRXJyb3IgdW5yZWdpc3RlcmluZyBpb2N0bDMyIHRyYW5zbGF0aW9uc1xuIik7CisJfQorI2VuZGlmCiAKIAkvKiBVbm1hcCAqLwotCWlvdW5tYXAoaXZpZGVvLT52aWRlb192YmFzZSk7CiAJaW91bm1hcChpdmlkZW8tPm1taW9fdmJhc2UpOwotCXZmcmVlKGl2aWRlby0+Ymlvc19hYmFzZSk7CisJaW91bm1hcChpdmlkZW8tPnZpZGVvX3ZiYXNlKTsKIAogCS8qIFJlbGVhc2UgbWVtIHJlZ2lvbnMgKi8KIAlyZWxlYXNlX21lbV9yZWdpb24oaXZpZGVvLT52aWRlb19iYXNlLCBpdmlkZW8tPnZpZGVvX3NpemUpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihpdmlkZW8tPm1taW9fYmFzZSwgaXZpZGVvLT5tbWlvX3NpemUpOwogCisJdmZyZWUoaXZpZGVvLT5iaW9zX2FiYXNlKTsKKworCWlmKGl2aWRlby0+bHBjZGV2KQorCQlTSVNfUENJX1BVVF9ERVZJQ0UoaXZpZGVvLT5scGNkZXYpOworCisJaWYoaXZpZGVvLT5uYnJpZGdlKQorCQlTSVNfUENJX1BVVF9ERVZJQ0UoaXZpZGVvLT5uYnJpZGdlKTsKKwogI2lmZGVmIENPTkZJR19NVFJSCiAJLyogUmVsZWFzZSBNVFJSIHJlZ2lvbiAqLwotCWlmKGl2aWRlby0+bXRycikgeworCWlmKGl2aWRlby0+bXRyciA+PSAwKQogCQltdHJyX2RlbChpdmlkZW8tPm10cnIsIGl2aWRlby0+dmlkZW9fYmFzZSwgaXZpZGVvLT52aWRlb19zaXplKTsKLQl9CiAjZW5kaWYKIAorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCS8qIElmIGRldmljZSB3YXMgZGlzYWJsZWQgd2hlbiBzdGFydGluZywgZGlzYWJsZQorCSAqIGl0IHdoZW4gcXVpdHRpbmcuCisJICovCisJaWYoIWl2aWRlby0+c2lzdmdhX2VuYWJsZWQpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwogCS8qIFVucmVnaXN0ZXIgdGhlIGZyYW1lYnVmZmVyICovCiAJaWYoaXZpZGVvLT5yZWdpc3RlcmVkKSB7CiAJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoc2lzX2ZiX2luZm8pOwpAQCAtNTY2NCw3ICs2NzQ0LDcgQEAKICNlbmRpZgogCX0KIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwkvKiBPSywgb3VyIGl2aWRlbyBpcyBnb25lIGZvciBnb29kIGZyb20gaGVyZS4gKi8KIAogCS8qIFRPRE86IFJlc3RvcmUgdGhlIGluaXRpYWwgbW9kZQogCSAqIFRoaXMgc291bmRzIGVhc3kgYnV0IGlzIGFzIGdvb2QgYXMgaW1wb3NzaWJsZQpAQCAtNTY3MywxNSArNjc1MywxNSBAQAogCSAqIGZyb20gbWFjaGluZSB0byBtYWNoaW5lLiBEZXBlbmRzIG9uIHRoZSB0eXBlCiAJICogb2YgaW50ZWdyYXRpb24gYmV0d2VlbiBjaGlwc2V0IGFuZCBicmlkZ2UuCiAJICovCi0JaWYocmVnaXN0ZXJlZCkgewotCSAgIHByaW50ayhLRVJOX0lORk8gInNpc2ZiOiBSZXN0b3Jpbmcgb2YgdGV4dCBtb2RlIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKLQl9CisJaWYocmVnaXN0ZXJlZCAmJiBtb2RlY2hhbmdlZCkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInNpc2ZiOiBSZXN0b3Jpbmcgb2YgdGV4dCBtb2RlIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzaXNmYl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gInNpc2ZiIiwKIAkuaWRfdGFibGUgCT0gc2lzZmJfcGNpX3RhYmxlLAotCS5wcm9iZSAJCT0gc2lzZmJfcHJvYmUsCisJLnByb2JlCQk9IHNpc2ZiX3Byb2JlLAogCS5yZW1vdmUgCT0gX19kZXZleGl0X3Aoc2lzZmJfcmVtb3ZlKQogfTsKIApAQCAtNTY5MywxMCArNjc3MywxMSBAQAogCiAJaWYoZmJfZ2V0X29wdGlvbnMoInNpc2ZiIiwgJm9wdGlvbnMpKQogCQlyZXR1cm4gLUVOT0RFVjsKKwogCXNpc2ZiX3NldHVwKG9wdGlvbnMpOwogI2VuZGlmCiAjZW5kaWYKLQlyZXR1cm4ocGNpX3JlZ2lzdGVyX2RyaXZlcigmc2lzZmJfZHJpdmVyKSk7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNpc2ZiX2RyaXZlcik7CiB9CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOCkKQEAgLTU3MTEsMzYgKzY3OTIsMTI5IEBACiAKICNpZmRlZiBNT0RVTEUKIAotc3RhdGljIGNoYXIgICAgICAgICAqbW9kZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgIHZlc2EgPSAtMTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZSA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNydDFvZmYgPSAxOwotc3RhdGljIHVuc2lnbmVkIGludCBtZW0gPSAwOwotc3RhdGljIGNoYXIgICAgICAgICAqZm9yY2VjcnQydHlwZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgIGZvcmNlY3J0MSA9IC0xOwotc3RhdGljIGludCAgICAgICAgICBwZGMgPSAtMTsKLXN0YXRpYyBpbnQgICAgICAgICAgcGRjMSA9IC0xOwotc3RhdGljIGludCAgICAgICAgICBub2FjY2VsID0gLTE7Ci1zdGF0aWMgaW50ICAgICAgICAgIG5veXBhbiAgPSAtMTsKLXN0YXRpYyBpbnQJICAgIG5vbWF4ID0gLTE7CitzdGF0aWMgY2hhcgkJKm1vZGUgPSBOVUxMOworc3RhdGljIGludAkJdmVzYSA9IC0xOworc3RhdGljIHVuc2lnbmVkIGludAlyYXRlID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJY3J0MW9mZiA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50CW1lbSA9IDA7CitzdGF0aWMgY2hhcgkJKmZvcmNlY3J0MnR5cGUgPSBOVUxMOworc3RhdGljIGludAkJZm9yY2VjcnQxID0gLTE7CitzdGF0aWMgaW50CQlwZGMgPSAtMTsKK3N0YXRpYyBpbnQJCXBkYzEgPSAtMTsKK3N0YXRpYyBpbnQJCW5vYWNjZWwgPSAtMTsKK3N0YXRpYyBpbnQJCW5veXBhbiAgPSAtMTsKK3N0YXRpYyBpbnQJCW5vbWF4ID0gLTE7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1zdGF0aWMgaW50ICAgICAgICAgIGludmVyc2UgPSAwOworc3RhdGljIGludAkJaW52ZXJzZSA9IDA7CiAjZW5kaWYKLXN0YXRpYyBpbnQgICAgICAgICAgdXNlcm9tID0gLTE7Ci1zdGF0aWMgaW50ICAgICAgICAgIHVzZW9lbSA9IC0xOwotc3RhdGljIGNoYXIgICAgICAgICAqdHZzdGFuZGFyZCA9IE5VTEw7Ci1zdGF0aWMgaW50CSAgICBub2NydDJyYXRlID0gMDsKLXN0YXRpYyBpbnQgICAgICAgICAgc2NhbGVsY2QgPSAtMTsKLXN0YXRpYyBjaGFyCSAgICAqc3BlY2lhbHRpbWluZyA9IE5VTEw7Ci1zdGF0aWMgaW50CSAgICBsdmRzaGwgPSAtMTsKLXN0YXRpYyBpbnQJICAgIHR2eHBvc29mZnNldCA9IDAsIHR2eXBvc29mZnNldCA9IDA7Ci1zdGF0aWMgaW50CSAgICBmaWx0ZXIgPSAtMTsKK3N0YXRpYyBpbnQJCXVzZXJvbSA9IC0xOworc3RhdGljIGludAkJdXNlb2VtID0gLTE7CitzdGF0aWMgY2hhcgkJKnR2c3RhbmRhcmQgPSBOVUxMOworc3RhdGljIGludAkJbm9jcnQycmF0ZSA9IDA7CitzdGF0aWMgaW50CQlzY2FsZWxjZCA9IC0xOworc3RhdGljIGNoYXIJCSpzcGVjaWFsdGltaW5nID0gTlVMTDsKK3N0YXRpYyBpbnQJCWx2ZHNobCA9IC0xOworc3RhdGljIGludAkJdHZ4cG9zb2Zmc2V0ID0gMCwgdHZ5cG9zb2Zmc2V0ID0gMDsKICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLXN0YXRpYyBpbnQJICAgIHJlc2V0Y2FyZCA9IDA7Ci1zdGF0aWMgaW50CSAgICB2aWRlb3JhbSA9IDA7CitzdGF0aWMgaW50CQlyZXNldGNhcmQgPSAwOworc3RhdGljIGludAkJdmlkZW9yYW0gPSAwOwogI2VuZGlmCiAKLU1PRFVMRV9ERVNDUklQVElPTigiU2lTIDMwMC81NDAvNjMwLzczMC8zMTUvNTUwLzY1eC82NjEvNzR4LzMzMC83NjAgZnJhbWVidWZmZXIgZGV2aWNlIGRyaXZlciIpOworc3RhdGljIGludCBfX2luaXQgc2lzZmJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzaXNmYl9zZXRkZWZhdWx0cGFybXMoKTsKKworCWlmKHJhdGUpCisJCXNpc2ZiX3Bhcm1fcmF0ZSA9IHJhdGU7CisKKwlpZigoc2NhbGVsY2QgPT0gMCkgfHwgKHNjYWxlbGNkID09IDEpKQorCQlzaXNmYl9zY2FsZWxjZCA9IHNjYWxlbGNkIF4gMTsKKworCS8qIE5lZWQgdG8gY2hlY2sgY3J0MiB0eXBlIGZpcnN0IGZvciBmc3RuL2RzdG4gKi8KKworCWlmKGZvcmNlY3J0MnR5cGUpCisJCXNpc2ZiX3NlYXJjaF9jcnQydHlwZShmb3JjZWNydDJ0eXBlKTsKKworCWlmKHR2c3RhbmRhcmQpCisJCXNpc2ZiX3NlYXJjaF90dnN0ZCh0dnN0YW5kYXJkKTsKKworCWlmKG1vZGUpCisJCXNpc2ZiX3NlYXJjaF9tb2RlKG1vZGUsIEZBTFNFKTsKKwllbHNlIGlmKHZlc2EgIT0gLTEpCisJCXNpc2ZiX3NlYXJjaF92ZXNhbW9kZSh2ZXNhLCBGQUxTRSk7CisKKwlzaXNmYl9jcnQxb2ZmID0gKGNydDFvZmYgPT0gMCkgPyAxIDogMDsKKworCXNpc2ZiX2ZvcmNlY3J0MSA9IGZvcmNlY3J0MTsKKwlpZihmb3JjZWNydDEgPT0gMSkKKwkJc2lzZmJfY3J0MW9mZiA9IDA7CisJZWxzZSBpZihmb3JjZWNydDEgPT0gMCkKKwkJc2lzZmJfY3J0MW9mZiA9IDE7CisKKwlpZihub2FjY2VsID09IDEpCisJCXNpc2ZiX2FjY2VsID0gMDsKKwllbHNlIGlmKG5vYWNjZWwgPT0gMCkKKwkJc2lzZmJfYWNjZWwgPSAxOworCisJaWYobm95cGFuID09IDEpCisJCXNpc2ZiX3lwYW4gPSAwOworCWVsc2UgaWYobm95cGFuID09IDApCisJCXNpc2ZiX3lwYW4gPSAxOworCisJaWYobm9tYXggPT0gMSkKKwkJc2lzZmJfbWF4ID0gMDsKKwllbHNlIGlmKG5vbWF4ID09IDApCisJCXNpc2ZiX21heCA9IDE7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZihpbnZlcnNlKSBzaXNmYl9pbnZlcnNlID0gMTsKKyNlbmRpZgorCisJaWYobWVtKQorCQlzaXNmYl9wYXJtX21lbSA9IG1lbTsKKworCWlmKHVzZXJvbSAhPSAtMSkKKwkJc2lzZmJfdXNlcm9tID0gdXNlcm9tOworCisJaWYodXNlb2VtICE9IC0xKQorCQlzaXNmYl91c2VvZW0gPSB1c2VvZW07CisKKyAgICAgICAgaWYocGRjICE9IC0xKQorCQlzaXNmYl9wZGMgID0gKHBkYyAgJiAweDdmKTsKKworCWlmKHBkYzEgIT0gLTEpCisJCXNpc2ZiX3BkY2EgPSAocGRjMSAmIDB4MWYpOworCisJc2lzZmJfbm9jcnQycmF0ZSA9IG5vY3J0MnJhdGU7CisKKwlpZihzcGVjaWFsdGltaW5nKQorCQlzaXNmYl9zZWFyY2hfc3BlY2lhbHRpbWluZyhzcGVjaWFsdGltaW5nKTsKKworCWlmKChsdmRzaGwgPj0gMCkgJiYgKGx2ZHNobCA8PSAzKSkKKwkJc2lzZmJfbHZkc2hsID0gbHZkc2hsOworCisJc2lzZmJfdHZ4cG9zb2Zmc2V0ID0gdHZ4cG9zb2Zmc2V0OworCXNpc2ZiX3R2eXBvc29mZnNldCA9IHR2eXBvc29mZnNldDsKKworI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQorCXNpc2ZiX3Jlc2V0Y2FyZCA9IChyZXNldGNhcmQpID8gMSA6IDA7CisJaWYodmlkZW9yYW0pCisJCXNpc2ZiX3ZpZGVvcmFtID0gdmlkZW9yYW07CisjZW5kaWYKKworCXJldHVybiBzaXNmYl9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXNmYl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXNmYl9kcml2ZXIpOworCXByaW50ayhLRVJOX0RFQlVHICJzaXNmYjogTW9kdWxlIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoc2lzZmJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2lzZmJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lTIDMwMC81NDAvNjMwLzczMC8zMTUvNTV4LzY1eC82NjEvNzR4LzMzMC83NngvMzR4LCBYR0kgVjNYVC9WNS9WOC9aNyBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJUaG9tYXMgV2luaXNjaGhvZmVyIDx0aG9tYXNAd2luaXNjaGhvZmVyLm5ldD4sIE90aGVycyIpOwogCkBAIC01NzY0LDcgKzY5MzgsNiBAQAogTU9EVUxFX1BBUk0odHZzdGFuZGFyZCwgInMiKTsKIE1PRFVMRV9QQVJNKHR2eHBvc29mZnNldCwgImkiKTsKIE1PRFVMRV9QQVJNKHR2eXBvc29mZnNldCwgImkiKTsKLU1PRFVMRV9QQVJNKGZpbHRlciwgImkiKTsKIE1PRFVMRV9QQVJNKG5vY3J0MnJhdGUsICJpIik7CiBNT0RVTEVfUEFSTShpbnZlcnNlLCAiaSIpOwogI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQpAQCAtNTc5Myw3ICs2OTY2LDYgQEAKIG1vZHVsZV9wYXJhbSh0dnN0YW5kYXJkLCBjaGFycCwgMCk7CiBtb2R1bGVfcGFyYW0odHZ4cG9zb2Zmc2V0LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHR2eXBvc29mZnNldCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShmaWx0ZXIsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0obm9jcnQycmF0ZSwgaW50LCAwKTsKICNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKIG1vZHVsZV9wYXJhbShyZXNldGNhcmQsIGludCwgMCk7CkBAIC01ODAxLDI1ICs2OTczLDM1IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBNT0RVTEVfUEFSTV9ERVNDKG1lbSwKIAkiXG5EZXRlcm1pbmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZGVvIG1lbW9yeSBoZWFwIGluIEtCLiBUaGlzIGhlYXAgaXMgdXNlZFxuIgogCSAgImZvciB2aWRlbyBSQU0gbWFuYWdlbWVudCBmb3IgZWcuIERSTS9EUkkuIE9uIDMwMCBzZXJpZXMsIHRoZSBkZWZhdWx0IGRlcGVuZHNcbiIKIAkgICJvbiB0aGUgYW1vdW50IG9mIHZpZGVvIFJBTSBhdmFpbGFibGUuIElmIDhNQiBvZiB2aWRlbyBSQU0gb3IgbGVzcyBpcyBhdmFpbGFibGUsXG4iCiAJICAidGhlIGhlYXAgc3RhcnRzIGF0IDQwOTZLQiwgaWYgYmV0d2VlbiA4IGFuZCAxNk1CIGFyZSBhdmFpbGFibGUgYXQgODE5MktCLFxuIgotCSAgIm90aGVyd2lzZSBhdCAxMjI4OEtCLiBPbiAzMTUgYW5kIFhhYnJlIHNlcmllcywgdGhlIGhlYXAgc2l6ZSBpcyAzMktCIGJ5IGRlZmF1bHQuXG4iCisJICAib3RoZXJ3aXNlIGF0IDEyMjg4S0IuIE9uIDMxNS8zMzAvMzQwIHNlcmllcywgdGhlIGhlYXAgc2l6ZSBpcyAzMktCIGJ5IGRlZmF1bHQuXG4iCiAJICAiVGhlIHZhbHVlIGlzIHRvIGJlIHNwZWNpZmllZCB3aXRob3V0ICdLQicgYW5kIG11c3QgbWF0Y2ggdGhlIE1heFhGQk1lbSBzZXR0aW5nXG4iCiAJICAiZm9yIFhGcmVlODYgNC54L1gub3JnIDYuNyBhbmQgbGF0ZXIuXG4iKTsKKyNlbHNlCitNT0RVTEVfUEFSTV9ERVNDKG1lbSwKKwkiXG5EZXRlcm1pbmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZGVvIG1lbW9yeSBoZWFwIGluIEtCLiBUaGlzIGhlYXAgaXMgdXNlZFxuIgorCSAgImZvciB2aWRlbyBSQU0gbWFuYWdlbWVudCBmb3IgZWcuIERSTS9EUkkuIE9uIDMwMCBzZXJpZXMsIHRoZSBkZWZhdWx0IGRlcGVuZHNcbiIKKwkgICJvbiB0aGUgYW1vdW50IG9mIHZpZGVvIFJBTSBhdmFpbGFibGUuIElmIDhNQiBvZiB2aWRlbyBSQU0gb3IgbGVzcyBpcyBhdmFpbGFibGUsXG4iCisJICAidGhlIGhlYXAgc3RhcnRzIGF0IDQwOTZLQiwgaWYgYmV0d2VlbiA4IGFuZCAxNk1CIGFyZSBhdmFpbGFibGUgYXQgODE5MktCLFxuIgorCSAgIm90aGVyd2lzZSBhdCAxMjI4OEtCLiBPbiAzMTUvMzMwLzM0MCBzZXJpZXMsIHRoZSBoZWFwIHNpemUgaXMgMzJLQiBieSBkZWZhdWx0LlxuIgorCSAgIlRoZSB2YWx1ZSBpcyB0byBiZSBzcGVjaWZpZWQgd2l0aG91dCAnS0InLlxuIik7CisjZW5kaWYKIAogTU9EVUxFX1BBUk1fREVTQyhub2FjY2VsLAotICAgICAgICAiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCAyRCBhY2NlbGVyYXRpb24gd2lsbCBiZSBkaXNhYmxlZC5cbiIKKwkiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCAyRCBhY2NlbGVyYXRpb24gd2lsbCBiZSBkaXNhYmxlZC5cbiIKIAkgICIoZGVmYXVsdDogMClcbiIpOwogCiBNT0RVTEVfUEFSTV9ERVNDKG5veXBhbiwKLSAgICAgICAgIlxuSWYgc2V0IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gMCwgeS1wYW5uaW5nIHdpbGwgYmUgZGlzYWJsZWQgYW5kIHNjcm9sbGluZ1xuIgotIAkgICJ3aWxsIGJlIHBlcmZvcm1lZCBieSByZWRyYXdpbmcgdGhlIHNjcmVlbi4gKGRlZmF1bHQ6IDApXG4iKTsKKwkiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCB5LXBhbm5pbmcgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc2Nyb2xsaW5nXG4iCisJICAid2lsbCBiZSBwZXJmb3JtZWQgYnkgcmVkcmF3aW5nIHRoZSBzY3JlZW4uIChkZWZhdWx0OiAwKVxuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0Mobm9tYXgsCi0gICAgICAgICJcbklmIHktcGFubmluZyBpcyBlbmFibGVkLCBzaXNmYiB3aWxsIGJ5IGRlZmF1bHQgdXNlIHRoZSBlbnRpcmUgYXZhaWxhYmxlIHZpZGVvXG4iCisJIlxuSWYgeS1wYW5uaW5nIGlzIGVuYWJsZWQsIHNpc2ZiIHdpbGwgYnkgZGVmYXVsdCB1c2UgdGhlIGVudGlyZSBhdmFpbGFibGUgdmlkZW9cbiIKIAkgICJtZW1vcnkgZm9yIHRoZSB2aXJ0dWFsIHNjcmVlbiBpbiBvcmRlciB0byBvcHRpbWl6ZSBzY3JvbGxpbmcgcGVyZm9ybWFuY2UuIElmXG4iCiAJICAidGhpcyBpcyBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCBzaXNmYiB3aWxsIG5vdCBkbyB0aGlzIGFuZCB0aGVyZWJ5IFxuIgogCSAgImVuYWJsZSB0aGUgdXNlciB0byBwb3NpdGl2ZWx5IHNwZWNpZnkgYSB2aXJ0dWFsIFkgc2l6ZSBvZiB0aGUgc2NyZWVuIHVzaW5nXG4iCkBAIC01ODI3LDMwICs3MDA5LDMwIEBACiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKIE1PRFVMRV9QQVJNX0RFU0MobW9kZSwKLSAgICAgICAgIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBbWF14W1ldeFtEZXB0aF0sIGVnLlxuIgotICAgICAgICAgICIxMDI0eDc2OHgxNi4gT3RoZXIgZm9ybWF0cyBzdXBwb3J0ZWQgaW5jbHVkZSBYeFktRGVwdGggYW5kXG4iCi0gCSAgIlh4WS1EZXB0aEBSYXRlLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG9ubHkgb25lIChkZWNpbWFsIG9yIGhleGFkZWNpbWFsKVxuIgorCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGlzcGxheSBtb2RlIGluIHRoZSBmb3JtYXQgW1hdeFtZXXhbRGVwdGhdLCBlZy5cbiIKKwkgICIxMDI0eDc2OHgxNi4gT3RoZXIgZm9ybWF0cyBzdXBwb3J0ZWQgaW5jbHVkZSBYeFktRGVwdGggYW5kXG4iCisJICAiWHhZLURlcHRoQFJhdGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb25seSBvbmUgKGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwpXG4iCiAJICAibnVtYmVyLCBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgVkVTQSBtb2RlIG51bWJlci4gKGRlZmF1bHQ6IG5vbmUgaWZcbiIKIAkgICJzaXNmYiBpcyBhIG1vZHVsZTsgdGhpcyBsZWF2ZXMgdGhlIGNvbnNvbGUgdW50b3VjaGVkIGFuZCB0aGUgZHJpdmVyIHdpbGxcbiIKIAkgICJvbmx5IGRvIHRoZSB2aWRlbyBtZW1vcnkgbWFuYWdlbWVudCBmb3IgZWcuIERSTS9EUkk7IDgwMHg2MDB4OCBpZiBzaXNmYlxuIgogCSAgImlzIGluIHRoZSBrZXJuZWwpXG4iKTsKIE1PRFVMRV9QQVJNX0RFU0ModmVzYSwKLSAgICAgICAgIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy4gMHgxMTdcbiIKLSAgICAgICAgICAiKGRlZmF1bHQ6IDB4MDAwMCBpZiBzaXNmYiBpcyBhIG1vZHVsZTsgdGhpcyBsZWF2ZXMgdGhlIGNvbnNvbGUgdW50b3VjaGVkXG4iCisJIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy4gMHgxMTdcbiIKKwkgICIoZGVmYXVsdDogMHgwMDAwIGlmIHNpc2ZiIGlzIGEgbW9kdWxlOyB0aGlzIGxlYXZlcyB0aGUgY29uc29sZSB1bnRvdWNoZWRcbiIKIAkgICJhbmQgdGhlIGRyaXZlciB3aWxsIG9ubHkgZG8gdGhlIHZpZGVvIG1lbW9yeSBtYW5hZ2VtZW50IGZvciBlZy4gRFJNL0RSSTtcbiIKIAkgICIweDAxMDMgaWYgc2lzZmIgaXMgaW4gdGhlIGtlcm5lbClcbiIpOwogI2VuZGlmCiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBNT0RVTEVfUEFSTV9ERVNDKG1vZGUsCi0gICAgICAgIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBpbiB0aGUgZm9ybWF0IFh4WXhEZXB0aCxcbiIKLSAgICAgICAgICJlZy4gMTAyNHg3Njh4MTYuIE90aGVyIGZvcm1hdHMgc3VwcG9ydGVkIGluY2x1ZGUgWHhZLURlcHRoIGFuZFxuIgorCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBYeFl4RGVwdGgsXG4iCisJICJlZy4gMTAyNHg3Njh4MTYuIE90aGVyIGZvcm1hdHMgc3VwcG9ydGVkIGluY2x1ZGUgWHhZLURlcHRoIGFuZFxuIgogCSAiWHhZLURlcHRoQFJhdGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb25seSBvbmUgKGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwpXG4iCiAJICJudW1iZXIsIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBWRVNBIG1vZGUgbnVtYmVyLiAoZGVmYXVsdDogODAweDYwMHg4KVxuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmVzYSwKLSAgICAgICAiXG5TZWxlY3RzIHRoZSBkZXNpcmVkIGRlZmF1bHQgZGlzcGxheSBtb2RlIGJ5IFZFU0EgZGVmaW5lZCBtb2RlIG51bWJlciwgZWcuXG4iCi0gICAgICAgICAiMHgxMTcgKGRlZmF1bHQ6IDB4MDEwMylcbiIpOworCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy5cbiIKKwkgIjB4MTE3IChkZWZhdWx0OiAweDAxMDMpXG4iKTsKICNlbmRpZgogCiBNT0RVTEVfUEFSTV9ERVNDKHJhdGUsCkBAIC01ODgwLDE2ICs3MDYyLDE2IEBACiAJICAidGhlbXNlbHZlcy4gRGVmYXVsdDogMSBvbiBMVkRTIHBhbmVscywgMCBvbiBUTURTIHBhbmVsc1xuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0MocGRjLAotICAgICAgICAiXG5UaGlzIGlzIGZvciBtYW51YWxseSBzZWxlY3RpbmcgdGhlIExDRCBwYW5lbCBkZWxheSBjb21wZW5zYXRpb24uIFRoZSBkcml2ZXJcbiIKKwkiXG5UaGlzIGlzIGZvciBtYW51YWxseSBzZWxlY3RpbmcgdGhlIExDRCBwYW5lbCBkZWxheSBjb21wZW5zYXRpb24uIFRoZSBkcml2ZXJcbiIKIAkgICJzaG91bGQgZGV0ZWN0IHRoaXMgY29ycmVjdGx5IGluIG1vc3QgY2FzZXM7IGhvd2V2ZXIsIHNvbWV0aW1lcyB0aGlzIGlzIG5vdFxuIgogCSAgInBvc3NpYmxlLiBJZiB5b3Ugc2VlICdzbWFsbCB3YXZlcycgb24gdGhlIExDRCwgdHJ5IHNldHRpbmcgdGhpcyB0byA0LCAzMiBvciAyNFxuIgotCSAgIm9uIGEgMzAwIHNlcmllcyBjaGlwc2V0OyA2IG9uIGEgMzE1IHNlcmllcyBjaGlwc2V0LiBJZiB0aGUgcHJvYmxlbSBwZXJzaXN0cyxcbiIKLQkgICJ0cnkgb3RoZXIgdmFsdWVzIChvbiAzMDAgc2VyaWVzOiBiZXR3ZWVuIDQgYW5kIDYwIGluIHN0ZXBzIG9mIDQ7IG9uIDMxNSBzZXJpZXM6XG4iCi0JICAiYW55IHZhbHVlIGZyb20gMCB0byAzMSkuIChkZWZhdWx0OiBhdXRvZGV0ZWN0ZWQsIGlmIExDRCBpcyBhY3RpdmUgZHVyaW5nIHN0YXJ0KVxuIik7CisJICAib24gYSAzMDAgc2VyaWVzIGNoaXBzZXQ7IDYgb24gb3RoZXIgY2hpcHNldHMuIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLCB0cnlcbiIKKwkgICJvdGhlciB2YWx1ZXMgKG9uIDMwMCBzZXJpZXM6IGJldHdlZW4gNCBhbmQgNjAgaW4gc3RlcHMgb2YgNDsgb3RoZXJ3aXNlOiBhbnlcbiIKKwkgICJ2YWx1ZSBmcm9tIDAgdG8gMzEpLiAoZGVmYXVsdDogYXV0b2RldGVjdGVkLCBpZiBMQ0QgaXMgYWN0aXZlIGR1cmluZyBzdGFydClcbiIpOwogCiAjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKIE1PRFVMRV9QQVJNX0RFU0MocGRjMSwKLSAgICAgICAgIlxuVGhpcyBpcyBzYW1lIGFzIHBkYywgYnV0IGZvciBMQ0QtdmlhIENSVDEuIEhlbmNlLCB0aGlzIGlzIGZvciB0aGUgMzE1LzMzMFxuIgorCSJcblRoaXMgaXMgc2FtZSBhcyBwZGMsIGJ1dCBmb3IgTENELXZpYSBDUlQxLiBIZW5jZSwgdGhpcyBpcyBmb3IgdGhlIDMxNS8zMzAvMzQwXG4iCiAJICAic2VyaWVzIG9ubHkuIChkZWZhdWx0OiBhdXRvZGV0ZWN0ZWQgaWYgTENEIGlzIGluIExDRC12aWEtQ1JUMSBtb2RlIGR1cmluZ1xuIgogCSAgInN0YXJ0dXApIC0gTm90ZTogY3VycmVudGx5LCB0aGlzIGhhcyBubyBlZmZlY3QgYmVjYXVzZSBMQ0QtdmlhLUNSVDEgaXMgbm90XG4iCiAJICAiaW1wbGVtZW50ZWQgeWV0LlxuIik7CkBAIC01OTEzLDE3ICs3MDk1LDEzIEBACiAJIlxuUmVsb2NhdGUgVFYgb3V0cHV0IHZlcnRpY2FsbHkuIFBvc3NpYmxlIHBhcmFtZXRlcnM6IC0zMiB0aHJvdWdoIDMyLlxuIgogCSAgIkRlZmF1bHQ6IDBcbiIpOwogCi1NT0RVTEVfUEFSTV9ERVNDKGZpbHRlciwKLQkiXG5TZWxlY3RzIFRWIGZsaWNrZXIgZmlsdGVyIHR5cGUgKG9ubHkgZm9yIHN5c3RlbXMgd2l0aCBhIFNpUzMwMSB2aWRlbyBicmlkZ2UpLlxuIgotCSAgIihQb3NzaWJsZSB2YWx1ZXMgMC03LCBkZWZhdWx0OiBbbm8gZmlsdGVyXSlcbiIpOwotCiBNT0RVTEVfUEFSTV9ERVNDKG5vY3J0MnJhdGUsCiAJIlxuU2V0dGluZyB0aGlzIHRvIDEgd2lsbCBmb3JjZSB0aGUgZHJpdmVyIHRvIHVzZSB0aGUgZGVmYXVsdCByZWZyZXNoIHJhdGUgZm9yXG4iCiAJICAiQ1JUMiBpZiBDUlQyIHR5cGUgaXMgVkdBLiAoZGVmYXVsdDogMCwgdXNlIHNhbWUgcmF0ZSBhcyBDUlQxKVxuIik7CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKIE1PRFVMRV9QQVJNX0RFU0MoaW52ZXJzZSwKLSAgICAgICAgIlxuU2V0dGluZyB0aGlzIHRvIGFueXRoaW5nIGJ1dCAwIHNob3VsZCBpbnZlcnQgdGhlIGRpc3BsYXkgY29sb3JzLCBidXQgdGhpc1xuIgorCSJcblNldHRpbmcgdGhpcyB0byBhbnl0aGluZyBidXQgMCBzaG91bGQgaW52ZXJ0IHRoZSBkaXNwbGF5IGNvbG9ycywgYnV0IHRoaXNcbiIKIAkgICJkb2VzIG5vdCBzZWVtIHRvIHdvcmsuIChkZWZhdWx0OiAwKVxuIik7CiAjZW5kaWYKIApAQCAtNTkzMSw5OCArNzEwOSwyMyBAQAogI2lmZGVmIENPTkZJR19GQl9TSVNfMzAwCiBNT0RVTEVfUEFSTV9ERVNDKHJlc2V0Y2FyZCwKIAkiXG5TZXQgdGhpcyB0byAxIGluIG9yZGVyIHRvIHJlc2V0IChQT1NUKSB0aGUgY2FyZCBvbiBub24teDg2IG1hY2hpbmVzIHdoZXJlXG4iCi0JICAidGhlIEJJT1MgZGlkIG5vdCBQT1NUIHRoZSBjYXJkIChvbmx5IHN1cHBvcnRlZCBmb3IgU2lTIDMwMC8zMDUgY3VycmVudGx5KS5cbiIKLQkgICJEZWZhdWx0OiAwXG4iKTsKKwkgICJ0aGUgQklPUyBkaWQgbm90IFBPU1QgdGhlIGNhcmQgKG9ubHkgc3VwcG9ydGVkIGZvciBTaVMgMzAwLzMwNSBhbmQgWEdJIGNhcmRzXG4iCisJICAiY3VycmVudGx5KS4gRGVmYXVsdDogMFxuIik7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmlkZW9yYW0sCiAJIlxuU2V0IHRoaXMgdG8gdGhlIGFtb3VudCBvZiB2aWRlbyBSQU0gKGluIGtpbG9ieXRlKSB0aGUgY2FyZCBoYXMuIFJlcXVpcmVkIG9uXG4iCiAJICAic29tZSBub24teDg2IGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlIG1lbW9yeSBhdXRvIGRldGVjdGlvbiBmYWlscy4gT25seVxuIgotCSAgInJlbGV2YW50IGlmIHJlc2V0Y2FyZCBpcyBzZXQsIHRvby4gRGVmYXVsdDogW2F1dG8tZGV0ZWN0XVxuIik7CisJICAicmVsZXZhbnQgaWYgcmVzZXRjYXJkIGlzIHNldCwgdG9vLiBTaVMzMDAvMzA1IG9ubHkuIERlZmF1bHQ6IFthdXRvLWRldGVjdF1cbiIpOwogI2VuZGlmCiAjZW5kaWYKIAotc3RhdGljIGludCBfX2RldmluaXQgc2lzZmJfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlzaXNmYl9zZXRkZWZhdWx0cGFybXMoKTsKLQotCWlmKHJhdGUpIHNpc2ZiX3Bhcm1fcmF0ZSA9IHJhdGU7Ci0KLQlpZigoc2NhbGVsY2QgPT0gMCkgfHwgKHNjYWxlbGNkID09IDEpKSB7Ci0JICAgc2lzZmJfc2NhbGVsY2QgPSBzY2FsZWxjZCBeIDE7Ci0JfQotCi0JLyogTmVlZCB0byBjaGVjayBjcnQyIHR5cGUgZmlyc3QgZm9yIGZzdG4vZHN0biAqLwotCi0JaWYoZm9yY2VjcnQydHlwZSkKLQkJc2lzZmJfc2VhcmNoX2NydDJ0eXBlKGZvcmNlY3J0MnR5cGUpOwotCi0JaWYodHZzdGFuZGFyZCkKLQkJc2lzZmJfc2VhcmNoX3R2c3RkKHR2c3RhbmRhcmQpOwotCi0JaWYobW9kZSkKLQkJc2lzZmJfc2VhcmNoX21vZGUobW9kZSwgRkFMU0UpOwotCWVsc2UgaWYodmVzYSAhPSAtMSkKLQkJc2lzZmJfc2VhcmNoX3Zlc2Ftb2RlKHZlc2EsIEZBTFNFKTsKLQotCXNpc2ZiX2NydDFvZmYgPSAoY3J0MW9mZiA9PSAwKSA/IDEgOiAwOwotCi0Jc2lzZmJfZm9yY2VjcnQxID0gZm9yY2VjcnQxOwotCWlmKGZvcmNlY3J0MSA9PSAxKSAgICAgIHNpc2ZiX2NydDFvZmYgPSAwOwotCWVsc2UgaWYoZm9yY2VjcnQxID09IDApIHNpc2ZiX2NydDFvZmYgPSAxOwotCi0JaWYobm9hY2NlbCA9PSAxKSAgICAgIHNpc2ZiX2FjY2VsID0gMDsKLQllbHNlIGlmKG5vYWNjZWwgPT0gMCkgc2lzZmJfYWNjZWwgPSAxOwotCi0JaWYobm95cGFuID09IDEpICAgICAgIHNpc2ZiX3lwYW4gPSAwOwotCWVsc2UgaWYobm95cGFuID09IDApICBzaXNmYl95cGFuID0gMTsKLQotCWlmKG5vbWF4ID09IDEpICAgICAgICBzaXNmYl9tYXggPSAwOwotCWVsc2UgaWYobm9tYXggPT0gMCkgICBzaXNmYl9tYXggPSAxOwotCQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWlmKGludmVyc2UpICAgICAgICAgICBzaXNmYl9pbnZlcnNlID0gMTsKLSNlbmRpZgotCi0JaWYobWVtKQkJICAgICAgc2lzZmJfcGFybV9tZW0gPSBtZW07Ci0KLQlpZih1c2Vyb20gIT0gLTEpICAgICAgc2lzZmJfdXNlcm9tID0gdXNlcm9tOwotCWlmKHVzZW9lbSAhPSAtMSkgICAgICBzaXNmYl91c2VvZW0gPSB1c2VvZW07Ci0KLSAgICAgICAgaWYocGRjICE9IC0xKSAgc2lzZmJfcGRjICA9IChwZGMgICYgMHg3Zik7Ci0JaWYocGRjMSAhPSAtMSkgc2lzZmJfcGRjYSA9IChwZGMxICYgMHgxZik7Ci0KLQlzaXNmYl9ub2NydDJyYXRlID0gbm9jcnQycmF0ZTsKLQotCWlmKHNwZWNpYWx0aW1pbmcpCi0JCXNpc2ZiX3NlYXJjaF9zcGVjaWFsdGltaW5nKHNwZWNpYWx0aW1pbmcpOwotCi0JaWYoKGx2ZHNobCA+PSAwKSAmJiAobHZkc2hsIDw9IDMpKSAgc2lzZmJfbHZkc2hsID0gbHZkc2hsOwotCi0JaWYoZmlsdGVyICE9IC0xKSBzaXNmYl9maWx0ZXIgPSBmaWx0ZXI7Ci0KLQlzaXNmYl90dnhwb3NvZmZzZXQgPSB0dnhwb3NvZmZzZXQ7Ci0Jc2lzZmJfdHZ5cG9zb2Zmc2V0ID0gdHZ5cG9zb2Zmc2V0OwotCi0jaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCi0gCXNpc2ZiX3Jlc2V0Y2FyZCA9IChyZXNldGNhcmQpID8gMSA6IDA7Ci0JaWYodmlkZW9yYW0pICAgIHNpc2ZiX3ZpZGVvcmFtID0gdmlkZW9yYW07Ci0jZW5kaWYKLQotICAgICAgICByZXR1cm4oc2lzZmJfaW5pdCgpKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNpc2ZiX3JlbW92ZV9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpc2ZiX2RyaXZlcik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgInNpc2ZiOiBNb2R1bGUgdW5sb2FkZWRcbiIpOwotfQotCi1tb2R1bGVfaW5pdChzaXNmYl9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChzaXNmYl9yZW1vdmVfbW9kdWxlKTsKLQogI2VuZGlmIAkgICAvKiAgL01PRFVMRSAgKi8KIAorLyogX0dQTCBvbmx5IGZvciBuZXcgc3ltYm9scy4gKi8KIEVYUE9SVF9TWU1CT0woc2lzX21hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKHNpc19mcmVlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNpc19tYWxsb2NfbmV3KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNpc19mcmVlX25ldyk7CisKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uaAppbmRleCBhNjY3OGE3Li40NDViY2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmgKQEAgLTEsOSArMSwxMCBAQAogLyoKLSAqIFNpUyAzMDAvMzA1LzU0MC82MzAoUykvNzMwKFMpCi0gKiBTaVMgMzE1KEgvUFJPKS81NXgvKE0pNjV4LyhNKTY2MShGL00pWC83NDAvNzQxKEdYKS8zMzAvKE0pNzYwCisgKiBTaVMgMzAwLzMwNS81NDAvNjMwKFMpLzczMChTKSwKKyAqIFNpUyAzMTVbRXxQUk9dLzU1MC9bTV02NXgvW01dNjZ4W0Z8TXxHXVgvW01dNzR4W0dYXS8zMzAvW01dNzZ4W0dYXSwKKyAqIFhHSSBWM1hUL1Y1L1Y4LCBaNwogICogZnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgTGludXgga2VybmVscyA+PTIuNC4xNCBhbmQgPj0yLjYuMwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYS4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYS4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIzLDEzICsyNCw5IEBACiAjaWZuZGVmIF9TSVNGQl9NQUlOCiAjZGVmaW5lIF9TSVNGQl9NQUlOCiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCiAjaW5jbHVkZSAidnN0cnVjdC5oIgogI2luY2x1ZGUgInNpcy5oIgogCi0jZGVmaW5lIE1PREVfSU5ERVhfTk9ORSAgICAgICAgICAgMCAgLyogaW5kZXggZm9yIG1vZGU9bm9uZSAqLwotCiAvKiBGYmNvbiBzdHVmZiAqLwogc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBteV9kZWZhdWx0X3ZhciA9IHsKIAkueHJlcyAgICAgICAgICAgID0gMCwKQEAgLTYwLDYgKzU3LDggQEAKIAkudm1vZGUgICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKIH07CiAKKyNkZWZpbmUgTU9ERV9JTkRFWF9OT05FICAgICAgICAgICAwICAvKiBpbmRleCBmb3IgbW9kZT1ub25lICovCisKIC8qIEJvb3QtdGltZSBwYXJhbWV0ZXJzICovCiBzdGF0aWMgaW50IHNpc2ZiX29mZiA9IDA7CiBzdGF0aWMgaW50IHNpc2ZiX3Bhcm1fbWVtID0gMDsKQEAgLTkzLDcgKzkyLDYgQEAKIHN0YXRpYyBpbnQgc2lzZmJfdHZzdGQgID0gLTE7CiBzdGF0aWMgaW50IHNpc2ZiX3R2eHBvc29mZnNldCA9IDA7CiBzdGF0aWMgaW50IHNpc2ZiX3R2eXBvc29mZnNldCA9IDA7Ci1zdGF0aWMgaW50IHNpc2ZiX2ZpbHRlciA9IC0xOwogc3RhdGljIGludCBzaXNmYl9ub2NydDJyYXRlID0gMDsKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBpbnQgIHNpc2ZiX2ludmVyc2UgPSAwOwpAQCAtMTA2LDEyICsxMDQsMTIgQEAKIAogLyogTGlzdCBvZiBzdXBwb3J0ZWQgY2hpcHMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2lzZmJfY2hpcF9pbmZvIHsKLSAgICAgICAgaW50IAkJY2hpcDsKLQlpbnQgCQl2Z2FlbmdpbmU7CisJaW50CQljaGlwOworCWludAkJdmdhZW5naW5lOwogCWludAkJbW5pOwotCWludCAJCWh3Y3Vyc29yX3NpemU7CisJaW50CQlod2N1cnNvcl9zaXplOwogCWludAkJQ1JUMl93cml0ZV9lbmFibGU7Ci0JY29uc3QgY2hhciAJKmNoaXBfbmFtZTsKKwljb25zdCBjaGFyCSpjaGlwX25hbWU7CiB9IHNpc2ZiX2NoaXBfaW5mb1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBTSVNfMzAwLCAgICBTSVNfMzAwX1ZHQSwgMCwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMDAgKiAyLCBTSVNfQ1JUMl9XRU5BQkxFXzMwMCwgIlNpUyAzMDAvMzA1IiB9LAogCXsgU0lTXzU0MCwgICAgU0lTXzMwMF9WR0EsIDAsIEhXX0NVUlNPUl9BUkVBX1NJWkVfMzAwICogMiwgU0lTX0NSVDJfV0VOQUJMRV8zMDAsICJTaVMgNTQwIiB9LApAQCAtMTIzLDYgKzEyMSw4IEBACiAJeyBTSVNfNjUwLCAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlNpUyA2NTAiIH0sCiAJeyBTSVNfMzMwLCAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlNpUyAzMzAiIH0sCiAJeyBTSVNfNjYwLCAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlNpUyA2NjAiIH0sCisJeyBYR0lfMjAsICAgICBTSVNfMzE1X1ZHQSwgMSwgSFdfQ1VSU09SX0FSRUFfU0laRV8zMTUgKiA0LCBTSVNfQ1JUMl9XRU5BQkxFXzMxNSwgIlhHSSBaNyIgfSwKKwl7IFhHSV80MCwgICAgIFNJU18zMTVfVkdBLCAxLCBIV19DVVJTT1JfQVJFQV9TSVpFXzMxNSAqIDQsIFNJU19DUlQyX1dFTkFCTEVfMzE1LCAiWEdJIFYzWFQvVjUvVjgiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19kZXZpbml0ZGF0YSBzaXNmYl9wY2lfdGFibGVbXSA9IHsKQEAgLTEzOSw2ICsxMzksOCBAQAogCXsgUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV82NTBfVkdBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA3fSwKIAl7IFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfMzMwLCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOH0sCiAJeyBQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzY2MF9WR0EsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDl9LAorCXsgUENJX1ZFTkRPUl9JRF9YR0ksUENJX0RFVklDRV9JRF9YR0lfMjAsICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLDEwfSwKKwl7IFBDSV9WRU5ET1JfSURfWEdJLFBDSV9ERVZJQ0VfSURfWEdJXzQwLCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwxMX0sCiAjZW5kaWYKIAl7IDAgfQogfTsKQEAgLTE0NywxMyArMTQ5LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKmNhcmRfbGlzdCA9IE5VTEw7CiAKLS8qIFRPRE86IFRoaXMgaXMgbm90IGhhbmRsZWQgY2FyZC13aXNlIGJlY2F1c2UgdGhlIERSTQotICAgZG9lcyBub3QgcmVmZXIgdG8gYSB1bmlxdWUgZmIgd2hlbiBjYWxsaW5nIHNpc19hbGxvYwotICAgb3Igc2lzX2ZyZWUuIFRoZXJlZm9yZSwgdGhpcyBpcyBoYW5kbGVkIGdsb2JhbGx5IGZvcgotICAgbm93IChob3BpbmcgdGhhdCBub2JvZHkgaXMgY3JhenkgZW5vdWdoIHRvIHJ1biB0d28KLSAgIFNpUyBjYXJkcyBhdCB0aGUgc2FtZSB0aW1lKS4KKy8qIFRoZSBtZW1vcnkgaGVhcCBpcyBub3cgaGFuZGxlZCBjYXJkLXdpc2UsIGJ5IHVzaW5nCisgICBzaXNfbWFsbG9jX25ldy9zaXNfZnJlZV9uZXcuIEhvd2V2ZXIsIHRoZSBEUk0gZG9lcworICAgbm90IGRvIHRoaXMgeWV0LiBVbnRpbCBpdCBkb2VzLCB3ZSBrZWVwIGEgImdsb2JhbCIKKyAgIGhlYXAgd2hpY2ggaXMgYWN0dWFsbHkgdGhlIGZpcnN0IGNhcmQncyBvbmUuCiAgKi8KLXN0YXRpYyBTSVNfSEVBUCAgICAgICAJc2lzZmJfaGVhcDsKK3N0YXRpYyBzdHJ1Y3QgU0lTX0hFQVAJKnNpc2ZiX2hlYXA7CiAKICNkZWZpbmUgTURfU0lTMzAwIDEKICNkZWZpbmUgTURfU0lTMzE1IDIKQEAgLTE4MSw4ICsxODIsMTAgQEAKIAl7IjMyMHgyNDB4MTYiLCAgIHsweDU2LDB4NTZ9LCAweDAxMzUsIDB4MDAwMCwgIDMyMCwgIDI0MCwgMTYsIDEsICA0MCwgMTUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMzIweDI0MHgyNCIsICAgezB4NTMsMHg1M30sIDB4MDAwMCwgMHgwMDAwLCAgMzIwLCAgMjQwLCAzMiwgMSwgIDQwLCAxNSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIzMjB4MjQweDMyIiwgICB7MHg1MywweDUzfSwgMHgwMDAwLCAweDAwMDAsICAzMjAsICAyNDAsIDMyLCAxLCAgNDAsIDE1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKLQl7IjMyMHgyNDB4OCIsICAgIHsweDVhLDB4NWF9LCAweDAxMzIsIDB4MDAwMCwgIDMyMCwgIDQ4MCwgIDgsIDEsICA0MCwgMzAsICAgICAgICAgICBNRF9TSVMzMTV9LCAgLyogRlNUTiAqLwotLyoxMCovCXsiMzIweDI0MHgxNiIsICAgezB4NWIsMHg1Yn0sIDB4MDEzNSwgMHgwMDAwLCAgMzIwLCAgNDgwLCAxNiwgMSwgIDQwLCAzMCwgICAgICAgICAgIE1EX1NJUzMxNX0sICAvKiBGU1ROICovCisjZGVmaW5lIE1PREVfRlNUTl84CTkKKyNkZWZpbmUgTU9ERV9GU1ROXzE2CTEwCisJeyIzMjB4MjQweDgiLCAgICB7MHg1YSwweDVhfSwgMHgwMTMyLCAweDAwMDAsICAzMjAsICAyNDAsICA4LCAxLCAgNDAsIDE1LCAgICAgICAgICAgTURfU0lTMzE1fSwgIC8qIEZTVE4gKi8KKy8qMTAqLwl7IjMyMHgyNDB4MTYiLCAgIHsweDViLDB4NWJ9LCAweDAxMzUsIDB4MDAwMCwgIDMyMCwgIDI0MCwgMTYsIDEsICA0MCwgMTUsICAgICAgICAgICBNRF9TSVMzMTV9LCAgLyogRlNUTiAqLwogCXsiNDAweDMwMHg4IiwgICAgezB4NTEsMHg1MX0sIDB4MDEzMywgMHgwMDAwLCAgNDAwLCAgMzAwLCAgOCwgMSwgIDUwLCAxOCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI0MDB4MzAweDE2IiwgICB7MHg1NywweDU3fSwgMHgwMTM2LCAweDAwMDAsICA0MDAsICAzMDAsIDE2LCAxLCAgNTAsIDE4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjQwMHgzMDB4MjQiLCAgIHsweDU0LDB4NTR9LCAweDAwMDAsIDB4MDAwMCwgIDQwMCwgIDMwMCwgMzIsIDEsICA1MCwgMTgsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LApAQCAtMjE1LDE4ICsyMTgsMjAgQEAKIC8qNDAqLwl7IjgwMHg0ODB4MTYiLCAgIHsweDdhLDB4N2F9LCAweDAwMDAsIDB4MDAwMCwgIDgwMCwgIDQ4MCwgMTYsIDEsIDEwMCwgMzAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODAweDQ4MHgyNCIsICAgezB4NzYsMHg3Nn0sIDB4MDAwMCwgMHgwMDAwLCAgODAwLCAgNDgwLCAzMiwgMSwgMTAwLCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4MDB4NDgweDMyIiwgICB7MHg3NiwweDc2fSwgMHgwMDAwLCAweDAwMDAsICA4MDAsICA0ODAsIDMyLCAxLCAxMDAsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKLSNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgICA0MyAvKiBpbmRleCBmb3IgODAweDYwMHg4ICovCi0jZGVmaW5lIERFRkFVTFRfTENETU9ERSAgICAgICAgICAgNDMgLyogaW5kZXggZm9yIDgwMHg2MDB4OCAqLwotI2RlZmluZSBERUZBVUxUX1RWTU9ERSAgICAgICAgICAgIDQzIC8qIGluZGV4IGZvciA4MDB4NjAweDggKi8KKyNkZWZpbmUgREVGQVVMVF9NT0RFCQk0MyAvKiBpbmRleCBmb3IgODAweDYwMHg4ICovCisjZGVmaW5lIERFRkFVTFRfTENETU9ERQkJNDMgLyogaW5kZXggZm9yIDgwMHg2MDB4OCAqLworI2RlZmluZSBERUZBVUxUX1RWTU9ERQkJNDMgLyogaW5kZXggZm9yIDgwMHg2MDB4OCAqLwogCXsiODAweDYwMHg4IiwgICAgezB4MzAsMHgzMH0sIDB4MDEwMywgMHgwMTAzLCAgODAwLCAgNjAwLCAgOCwgMiwgMTAwLCAzNywgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4MDB4NjAweDE2IiwgICB7MHg0NywweDQ3fSwgMHgwMTE0LCAweDAxMTQsICA4MDAsICA2MDAsIDE2LCAyLCAxMDAsIDM3LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjgwMHg2MDB4MjQiLCAgIHsweDYzLDB4NjN9LCAweDAxM2IsIDB4MDExNSwgIDgwMCwgIDYwMCwgMzIsIDIsIDEwMCwgMzcsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODAweDYwMHgzMiIsICAgezB4NjMsMHg2M30sIDB4MDEzYiwgMHgwMTE1LCAgODAwLCAgNjAwLCAzMiwgMiwgMTAwLCAzNywgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4NDh4NDgweDgiLCAgICB7MHgzOSwweDM5fSwgMHgwMDAwLCAweDAwMDAsICA4NDgsICA0ODAsICA4LCAyLCAxMDYsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKKyNkZWZpbmUgREVGQVVMVF9NT0RFXzg0OAk0OAogCXsiODQ4eDQ4MHgxNiIsICAgezB4M2IsMHgzYn0sIDB4MDAwMCwgMHgwMDAwLCAgODQ4LCAgNDgwLCAxNiwgMiwgMTA2LCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4NDh4NDgweDI0IiwgICB7MHgzZSwweDNlfSwgMHgwMDAwLCAweDAwMDAsICA4NDgsICA0ODAsIDMyLCAyLCAxMDYsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIC8qNTAqLwl7Ijg0OHg0ODB4MzIiLCAgIHsweDNlLDB4M2V9LCAweDAwMDAsIDB4MDAwMCwgIDg0OCwgIDQ4MCwgMzIsIDIsIDEwNiwgMzAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODU2eDQ4MHg4IiwgICAgezB4M2YsMHgzZn0sIDB4MDAwMCwgMHgwMDAwLCAgODU2LCAgNDgwLCAgOCwgMiwgMTA3LCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCisjZGVmaW5lIERFRkFVTFRfTU9ERV84NTYJNTIKIAl7Ijg1Nng0ODB4MTYiLCAgIHsweDQyLDB4NDJ9LCAweDAwMDAsIDB4MDAwMCwgIDg1NiwgIDQ4MCwgMTYsIDIsIDEwNywgMzAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiODU2eDQ4MHgyNCIsICAgezB4NDUsMHg0NX0sIDB4MDAwMCwgMHgwMDAwLCAgODU2LCAgNDgwLCAzMiwgMiwgMTA3LCAzMCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyI4NTZ4NDgweDMyIiwgICB7MHg0NSwweDQ1fSwgMHgwMDAwLCAweDAwMDAsICA4NTYsICA0ODAsIDMyLCAyLCAxMDcsIDMwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKQEAgLTI3MCw0MiArMjc1LDQ3IEBACiAJeyIxMjgweDgwMHgxNiIsICB7MHgxNSwweDE1fSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA4MDAsIDE2LCAxLCAxNjAsIDUwLCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjEyODB4ODAweDI0IiwgIHsweDE2LDB4MTZ9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDgwMCwgMzIsIDEsIDE2MCwgNTAsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTI4MHg4MDB4MzIiLCAgezB4MTYsMHgxNn0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgODAwLCAzMiwgMSwgMTYwLCA1MCwgICAgICAgICAgIE1EX1NJUzMxNX0sCisJeyIxMjgweDg1NHg4IiwgICB7MHgxNCwweDE0fSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA4NTQsICA4LCAxLCAxNjAsIDUzLCAgICAgICAgICAgTURfU0lTMzE1fSwKKwl7IjEyODB4ODU0eDE2IiwgIHsweDE1LDB4MTV9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDg1NCwgMTYsIDEsIDE2MCwgNTMsICAgICAgICAgICBNRF9TSVMzMTV9LAorCXsiMTI4MHg4NTR4MjQiLCAgezB4MTYsMHgxNn0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgODU0LCAzMiwgMSwgMTYwLCA1MywgICAgICAgICAgIE1EX1NJUzMxNX0sCisJeyIxMjgweDg1NHgzMiIsICB7MHgxNiwweDE2fSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA4NTQsIDMyLCAxLCAxNjAsIDUzLCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjEyODB4OTYweDgiLCAgIHsweDdjLDB4N2N9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDk2MCwgIDgsIDEsIDE2MCwgNjAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAotCXsiMTI4MHg5NjB4MTYiLCAgezB4N2QsMHg3ZH0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgOTYwLCAxNiwgMSwgMTYwLCA2MCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCisvKjEwMCovCXsiMTI4MHg5NjB4MTYiLCAgezB4N2QsMHg3ZH0sIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgOTYwLCAxNiwgMSwgMTYwLCA2MCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxMjgweDk2MHgyNCIsICB7MHg3ZSwweDdlfSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA5NjAsIDMyLCAxLCAxNjAsIDYwLCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEyODB4OTYweDMyIiwgIHsweDdlLDB4N2V9LCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDk2MCwgMzIsIDEsIDE2MCwgNjAsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTI4MHgxMDI0eDgiLCAgezB4M2EsMHgzYX0sIDB4MDEwNywgMHgwMTA3LCAxMjgwLCAxMDI0LCAgOCwgMiwgMTYwLCA2NCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCi0vKjEwMCovCXsiMTI4MHgxMDI0eDE2IiwgezB4NGQsMHg0ZH0sIDB4MDExYSwgMHgwMTFhLCAxMjgwLCAxMDI0LCAxNiwgMiwgMTYwLCA2NCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCisJeyIxMjgweDEwMjR4MTYiLCB7MHg0ZCwweDRkfSwgMHgwMTFhLCAweDAxMWEsIDEyODAsIDEwMjQsIDE2LCAyLCAxNjAsIDY0LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEyODB4MTAyNHgyNCIsIHsweDY1LDB4NjV9LCAweDAxM2QsIDB4MDExYiwgMTI4MCwgMTAyNCwgMzIsIDIsIDE2MCwgNjQsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTI4MHgxMDI0eDMyIiwgezB4NjUsMHg2NX0sIDB4MDEzZCwgMHgwMTFiLCAxMjgwLCAxMDI0LCAzMiwgMiwgMTYwLCA2NCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxMzYweDc2OHg4IiwgICB7MHg0OCwweDQ4fSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsICA3NjgsICA4LCAxLCAxNzAsIDQ4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEzNjB4NzY4eDE2IiwgIHsweDRiLDB4NGJ9LCAweDAwMDAsIDB4MDAwMCwgMTM2MCwgIDc2OCwgMTYsIDEsIDE3MCwgNDgsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTM2MHg3Njh4MjQiLCAgezB4NGUsMHg0ZX0sIDB4MDAwMCwgMHgwMDAwLCAxMzYwLCAgNzY4LCAzMiwgMSwgMTcwLCA0OCwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCi0JeyIxMzYweDc2OHgzMiIsICB7MHg0ZSwweDRlfSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsICA3NjgsIDMyLCAxLCAxNzAsIDQ4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKKy8qMTEwKi8JeyIxMzYweDc2OHgzMiIsICB7MHg0ZSwweDRlfSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsICA3NjgsIDMyLCAxLCAxNzAsIDQ4LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjEzNjB4MTAyNHg4IiwgIHsweDY3LDB4Njd9LCAweDAwMDAsIDB4MDAwMCwgMTM2MCwgMTAyNCwgIDgsIDEsIDE3MCwgNjQsIE1EX1NJUzMwMCAgICAgICAgICB9LAorI2RlZmluZSBERUZBVUxUX01PREVfMTM2MAkxMTIKIAl7IjEzNjB4MTAyNHgxNiIsIHsweDZmLDB4NmZ9LCAweDAwMDAsIDB4MDAwMCwgMTM2MCwgMTAyNCwgMTYsIDEsIDE3MCwgNjQsIE1EX1NJUzMwMCAgICAgICAgICB9LAogCXsiMTM2MHgxMDI0eDI0IiwgezB4NzIsMHg3Mn0sIDB4MDAwMCwgMHgwMDAwLCAxMzYwLCAxMDI0LCAzMiwgMSwgMTcwLCA2NCwgTURfU0lTMzAwICAgICAgICAgIH0sCi0vKjExMCovCXsiMTM2MHgxMDI0eDMyIiwgezB4NzIsMHg3Mn0sIDB4MDAwMCwgMHgwMDAwLCAxMzYwLCAxMDI0LCAzMiwgMSwgMTcwLCA2NCwgTURfU0lTMzAwICAgICAgICAgIH0sCisJeyIxMzYweDEwMjR4MzIiLCB7MHg3MiwweDcyfSwgMHgwMDAwLCAweDAwMDAsIDEzNjAsIDEwMjQsIDMyLCAxLCAxNzAsIDY0LCBNRF9TSVMzMDAgICAgICAgICAgfSwKIAl7IjE0MDB4MTA1MHg4IiwgIHsweDI2LDB4MjZ9LCAweDAwMDAsIDB4MDAwMCwgMTQwMCwgMTA1MCwgIDgsIDEsIDE3NSwgNjUsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTQwMHgxMDUweDE2IiwgezB4MjcsMHgyN30sIDB4MDAwMCwgMHgwMDAwLCAxNDAwLCAxMDUwLCAxNiwgMSwgMTc1LCA2NSwgICAgICAgICAgIE1EX1NJUzMxNX0sCiAJeyIxNDAweDEwNTB4MjQiLCB7MHgyOCwweDI4fSwgMHgwMDAwLCAweDAwMDAsIDE0MDAsIDEwNTAsIDMyLCAxLCAxNzUsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjE0MDB4MTA1MHgzMiIsIHsweDI4LDB4Mjh9LCAweDAwMDAsIDB4MDAwMCwgMTQwMCwgMTA1MCwgMzIsIDEsIDE3NSwgNjUsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTYwMHgxMjAweDgiLCAgezB4M2MsMHgzY30sIDB4MDEzMCwgMHgwMTFjLCAxNjAwLCAxMjAwLCAgOCwgMSwgMjAwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCi0JeyIxNjAweDEyMDB4MTYiLCB7MHgzZCwweDNkfSwgMHgwMTMxLCAweDAxMWUsIDE2MDAsIDEyMDAsIDE2LCAxLCAyMDAsIDc1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKKy8qMTIwKi8JeyIxNjAweDEyMDB4MTYiLCB7MHgzZCwweDNkfSwgMHgwMTMxLCAweDAxMWUsIDE2MDAsIDEyMDAsIDE2LCAxLCAyMDAsIDc1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjE2MDB4MTIwMHgyNCIsIHsweDY2LDB4NjZ9LCAweDAxM2UsIDB4MDExZiwgMTYwMCwgMTIwMCwgMzIsIDEsIDIwMCwgNzUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAogCXsiMTYwMHgxMjAweDMyIiwgezB4NjYsMHg2Nn0sIDB4MDEzZSwgMHgwMTFmLCAxNjAwLCAxMjAwLCAzMiwgMSwgMjAwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxNjgweDEwNTB4OCIsICB7MHgxNywweDE3fSwgMHgwMDAwLCAweDAwMDAsIDE2ODAsIDEwNTAsICA4LCAxLCAyMTAsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKLS8qMTIwKi8JeyIxNjgweDEwNTB4MTYiLCB7MHgxOCwweDE4fSwgMHgwMDAwLCAweDAwMDAsIDE2ODAsIDEwNTAsIDE2LCAxLCAyMTAsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKKwl7IjE2ODB4MTA1MHgxNiIsIHsweDE4LDB4MTh9LCAweDAwMDAsIDB4MDAwMCwgMTY4MCwgMTA1MCwgMTYsIDEsIDIxMCwgNjUsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTY4MHgxMDUweDI0IiwgezB4MTksMHgxOX0sIDB4MDAwMCwgMHgwMDAwLCAxNjgwLCAxMDUwLCAzMiwgMSwgMjEwLCA2NSwgICAgICAgICAgIE1EX1NJUzMxNX0sCiAJeyIxNjgweDEwNTB4MzIiLCB7MHgxOSwweDE5fSwgMHgwMDAwLCAweDAwMDAsIDE2ODAsIDEwNTAsIDMyLCAxLCAyMTAsIDY1LCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjE5MjB4MTA4MHg4IiwgIHsweDJjLDB4MmN9LCAweDAwMDAsIDB4MDAwMCwgMTkyMCwgMTA4MCwgIDgsIDEsIDI0MCwgNjcsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTkyMHgxMDgweDE2IiwgezB4MmQsMHgyZH0sIDB4MDAwMCwgMHgwMDAwLCAxOTIwLCAxMDgwLCAxNiwgMSwgMjQwLCA2NywgICAgICAgICAgIE1EX1NJUzMxNX0sCiAJeyIxOTIweDEwODB4MjQiLCB7MHg3MywweDczfSwgMHgwMDAwLCAweDAwMDAsIDE5MjAsIDEwODAsIDMyLCAxLCAyNDAsIDY3LCAgICAgICAgICAgTURfU0lTMzE1fSwKLQl7IjE5MjB4MTA4MHgzMiIsIHsweDczLDB4NzN9LCAweDAwMDAsIDB4MDAwMCwgMTkyMCwgMTA4MCwgMzIsIDEsIDI0MCwgNjcsICAgICAgICAgICBNRF9TSVMzMTV9LAorLyoxMzAqLwl7IjE5MjB4MTA4MHgzMiIsIHsweDczLDB4NzN9LCAweDAwMDAsIDB4MDAwMCwgMTkyMCwgMTA4MCwgMzIsIDEsIDI0MCwgNjcsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMTkyMHgxNDQweDgiLCAgezB4NjgsMHg2OH0sIDB4MDEzZiwgMHgwMDAwLCAxOTIwLCAxNDQwLCAgOCwgMSwgMjQwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIxOTIweDE0NDB4MTYiLCB7MHg2OSwweDY5fSwgMHgwMTQwLCAweDAwMDAsIDE5MjAsIDE0NDAsIDE2LCAxLCAyNDAsIDc1LCBNRF9TSVMzMDB8TURfU0lTMzE1fSwKIAl7IjE5MjB4MTQ0MHgyNCIsIHsweDZiLDB4NmJ9LCAweDAxNDEsIDB4MDAwMCwgMTkyMCwgMTQ0MCwgMzIsIDEsIDI0MCwgNzUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAotLyoxMzAqLwl7IjE5MjB4MTQ0MHgzMiIsIHsweDZiLDB4NmJ9LCAweDAxNDEsIDB4MDAwMCwgMTkyMCwgMTQ0MCwgMzIsIDEsIDI0MCwgNzUsIE1EX1NJUzMwMHxNRF9TSVMzMTV9LAorCXsiMTkyMHgxNDQweDMyIiwgezB4NmIsMHg2Yn0sIDB4MDE0MSwgMHgwMDAwLCAxOTIwLCAxNDQwLCAzMiwgMSwgMjQwLCA3NSwgTURfU0lTMzAwfE1EX1NJUzMxNX0sCiAJeyIyMDQ4eDE1MzZ4OCIsICB7MHg2YywweDZjfSwgMHgwMDAwLCAweDAwMDAsIDIwNDgsIDE1MzYsICA4LCAxLCAyNTYsIDk2LCAgICAgICAgICAgTURfU0lTMzE1fSwKIAl7IjIwNDh4MTUzNngxNiIsIHsweDZkLDB4NmR9LCAweDAwMDAsIDB4MDAwMCwgMjA0OCwgMTUzNiwgMTYsIDEsIDI1NiwgOTYsICAgICAgICAgICBNRF9TSVMzMTV9LAogCXsiMjA0OHgxNTM2eDI0IiwgezB4NmUsMHg2ZX0sIDB4MDAwMCwgMHgwMDAwLCAyMDQ4LCAxNTM2LCAzMiwgMSwgMjU2LCA5NiwgICAgICAgICAgIE1EX1NJUzMxNX0sCkBAIC0zMTMsMTMgKzMyMywxMyBAQAogCXsiXDAiLCB7MHgwMCwweDAwfSwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIH07CiAKLSNkZWZpbmUgU0lTX0xDRF9OVU1CRVIgMTcKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX3Npc19sY2RfZGF0YSB7CisjZGVmaW5lIFNJU19MQ0RfTlVNQkVSIDE4CitzdGF0aWMgc3RydWN0IF9zaXNfbGNkX2RhdGEgewogCXUzMiBsY2R0eXBlOwogCXUxNiB4cmVzOwogCXUxNiB5cmVzOwogCXU4ICBkZWZhdWx0X21vZGVfaWR4OwotfSBzaXNfbGNkX2RhdGFbXSA9IHsKK30gc2lzX2xjZF9kYXRhW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7IExDRF82NDB4NDgwLCAgICA2NDAsICA0ODAsICAyMyB9LAogCXsgTENEXzgwMHg2MDAsICAgIDgwMCwgIDYwMCwgIDQzIH0sCiAJeyBMQ0RfMTAyNHg2MDAsICAxMDI0LCAgNjAwLCAgNjcgfSwKQEAgLTMyOSwzNCArMzM5LDM4IEBACiAJeyBMQ0RfMTI4MHg3MjAsICAxMjgwLCAgNzIwLCAgODMgfSwKIAl7IExDRF8xMjgweDc2OCwgIDEyODAsICA3NjgsICA4NyB9LAogCXsgTENEXzEyODB4ODAwLCAgMTI4MCwgIDgwMCwgIDkxIH0sCi0JeyBMQ0RfMTI4MHg5NjAsICAxMjgwLCAgOTYwLCAgOTUgfSwKLQl7IExDRF8xMjgweDEwMjQsIDEyODAsIDEwMjQsICA5OSB9LAotCXsgTENEXzE0MDB4MTA1MCwgMTQwMCwgMTA1MCwgMTExIH0sCi0JeyBMQ0RfMTY4MHgxMDUwLCAxNjgwLCAxMDUwLCAxMTkgfSwKLQl7IExDRF8xNjAweDEyMDAsIDE2MDAsIDEyMDAsIDExNSB9LAotCXsgTENEXzY0MHg0ODBfMiwgIDY0MCwgIDQ4MCwgIDIzIH0sCi0JeyBMQ0RfNjQweDQ4MF8zLCAgNjQwLCAgNDgwLCAgMjMgfSwKLQl7IExDRF8zMjB4NDgwLCAgICAzMjAsICA0ODAsICAgOSB9LAorCXsgTENEXzEyODB4ODU0LCAgMTI4MCwgIDg1NCwgIDk1IH0sCisJeyBMQ0RfMTI4MHg5NjAsICAxMjgwLCAgOTYwLCAgOTkgfSwKKwl7IExDRF8xMjgweDEwMjQsIDEyODAsIDEwMjQsIDEwMyB9LAorCXsgTENEXzE0MDB4MTA1MCwgMTQwMCwgMTA1MCwgMTE1IH0sCisJeyBMQ0RfMTY4MHgxMDUwLCAxNjgwLCAxMDUwLCAxMjMgfSwKKwl7IExDRF8xNjAweDEyMDAsIDE2MDAsIDEyMDAsIDExOSB9LAorCXsgTENEXzMyMHgyNDBfMiwgIDMyMCwgIDI0MCwgICA5IH0sCisJeyBMQ0RfMzIweDI0MF8zLCAgMzIwLCAgMjQwLCAgIDkgfSwKKwl7IExDRF8zMjB4MjQwLCAgICAzMjAsICAyNDAsICAgOSB9LAogfTsKIAogLyogQ1IzNiBldmFsdWF0aW9uICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIHNpczMwMHBhbmVsdHlwZVtdID0KLSAgICB7IExDRF9VTktOT1dOLCAgIExDRF84MDB4NjAwLCAgIExDRF8xMDI0eDc2OCwgIExDRF8xMjgweDEwMjQsCi0gICAgICBMQ0RfMTI4MHg5NjAsICBMQ0RfNjQweDQ4MCwgICBMQ0RfMTAyNHg2MDAsICBMQ0RfMTE1Mng3NjgsCi0gICAgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwKLSAgICAgIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2lzMzAwcGFuZWx0eXBlW10gX19kZXZpbml0ZGF0YSA9IHsKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfODAweDYwMCwgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAorCUxDRF8xMjgweDk2MCwgIExDRF82NDB4NDgwLCAgIExDRF8xMDI0eDYwMCwgIExDRF8xMTUyeDc2OCwKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTiwgICBMQ0RfVU5LTk9XTgorfTsKIAotc3RhdGljIGNvbnN0IFVTSE9SVCBzaXMzMTBwYW5lbHR5cGVbXSA9Ci0gICAgeyBMQ0RfVU5LTk9XTiwgICBMQ0RfODAweDYwMCwgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAotICAgICAgTENEXzY0MHg0ODAsICAgTENEXzEwMjR4NjAwLCAgTENEXzExNTJ4ODY0LCAgTENEXzEyODB4OTYwLAotICAgICAgTENEXzExNTJ4NzY4LCAgTENEXzE0MDB4MTA1MCwgTENEXzEyODB4NzY4LCAgTENEXzE2MDB4MTIwMCwKLSAgICAgIExDRF82NDB4NDgwXzIsIExDRF82NDB4NDgwXzMsIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2lzMzEwcGFuZWx0eXBlW10gX19kZXZpbml0ZGF0YSA9IHsKKwlMQ0RfVU5LTk9XTiwgICBMQ0RfODAweDYwMCwgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAorCUxDRF82NDB4NDgwLCAgIExDRF8xMDI0eDYwMCwgIExDRF8xMTUyeDg2NCwgIExDRF8xMjgweDk2MCwKKwlMQ0RfMTE1Mng3NjgsICBMQ0RfMTQwMHgxMDUwLCBMQ0RfMTI4MHg3NjgsICBMQ0RfMTYwMHgxMjAwLAorCUxDRF8zMjB4MjQwXzIsIExDRF8zMjB4MjQwXzMsIExDRF9VTktOT1dOLCAgIExDRF9VTktOT1dOCit9OwogCi1zdGF0aWMgY29uc3QgVVNIT1JUIHNpczY2MXBhbmVsdHlwZVtdID0KLSAgICB7IExDRF9VTktOT1dOLCAgIExDRF84MDB4NjAwLCAgIExDRF8xMDI0eDc2OCwgIExDRF8xMjgweDEwMjQsCi0gICAgICBMQ0RfNjQweDQ4MCwgICBMQ0RfMTAyNHg2MDAsICBMQ0RfMTE1Mng4NjQsICBMQ0RfMTI4MHg5NjAsCi0gICAgICBMQ0RfMTE1Mng3NjgsICBMQ0RfMTQwMHgxMDUwLCBMQ0RfMTI4MHg3NjgsICBMQ0RfMTYwMHgxMjAwLAotICAgICAgTENEXzEyODB4ODAwLCAgTENEXzE2ODB4MTA1MCwgTENEXzEyODB4NzIwLCAgTENEX1VOS05PV04gfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzaXM2NjFwYW5lbHR5cGVbXSBfX2RldmluaXRkYXRhID0geworCUxDRF9VTktOT1dOLCAgIExDRF84MDB4NjAwLCAgIExDRF8xMDI0eDc2OCwgIExDRF8xMjgweDEwMjQsCisJTENEXzY0MHg0ODAsICAgTENEXzEwMjR4NjAwLCAgTENEXzExNTJ4ODY0LCAgTENEXzEyODB4OTYwLAorCUxDRF8xMjgweDg1NCwgIExDRF8xNDAweDEwNTAsIExDRF8xMjgweDc2OCwgIExDRF8xNjAweDEyMDAsCisJTENEXzEyODB4ODAwLCAgTENEXzE2ODB4MTA1MCwgTENEXzEyODB4NzIwLCAgTENEX1VOS05PV04KK307CiAKICNkZWZpbmUgRkxfNTUwX0RTVE4gMHgwMQogI2RlZmluZSBGTF81NTBfRlNUTiAweDAyCkBAIC00MTMsNyArNDI3LDYgQEAKIH0gc2lzZmJfdnJhdGVbXSA9IHsKIAl7MSwgIDMyMCwgIDIwMCwgIDcwLCAgVFJVRX0sCiAJezEsICAzMjAsICAyNDAsICA2MCwgIFRSVUV9LAotCXsxLCAgMzIwLCAgNDgwLCAgNjAsICBUUlVFfSwKIAl7MSwgIDQwMCwgIDMwMCwgIDYwLCAgVFJVRX0sCiAJezEsICA1MTIsICAzODQsICA2MCwgIFRSVUV9LAogCXsxLCAgNjQwLCAgNDAwLCAgNzIsICBUUlVFfSwKQEAgLTQzNywxMCArNDUwLDExIEBACiAJezQsIDEwMjQsICA3NjgsICA3NSwgRkFMU0V9LCB7NSwgMTAyNCwgIDc2OCwgIDg1LCAgVFJVRX0sIHs2LCAxMDI0LCAgNzY4LCAxMDAsICBUUlVFfSwKIAl7NywgMTAyNCwgIDc2OCwgMTIwLCAgVFJVRX0sCiAJezEsIDExNTIsICA3NjgsICA2MCwgIFRSVUV9LAotCXsxLCAxMTUyLCAgODY0LCAgNjAsICBUUlVFfSwgezEsIDExNTIsICA4NjQsICA3NSwgIFRSVUV9LCB7MiwgMTE1MiwgIDg2NCwgIDg0LCAgVFJVRX0sCisJezEsIDExNTIsICA4NjQsICA2MCwgIFRSVUV9LCB7MiwgMTE1MiwgIDg2NCwgIDc1LCAgVFJVRX0sIHszLCAxMTUyLCAgODY0LCAgODQsICBUUlVFfSwKIAl7MSwgMTI4MCwgIDcyMCwgIDYwLCAgVFJVRX0sIHsyLCAxMjgwLCAgNzIwLCAgNzUsICBUUlVFfSwgezMsIDEyODAsICA3MjAsICA4NSwgIFRSVUV9LAogCXsxLCAxMjgwLCAgNzY4LCAgNjAsICBUUlVFfSwKIAl7MSwgMTI4MCwgIDgwMCwgIDYwLCAgVFJVRX0sCisJezEsIDEyODAsICA4NTQsICA2MCwgIFRSVUV9LAogCXsxLCAxMjgwLCAgOTYwLCAgNjAsICBUUlVFfSwgezIsIDEyODAsICA5NjAsICA4NSwgIFRSVUV9LAogCXsxLCAxMjgwLCAxMDI0LCAgNDMsICBUUlVFfSwgezIsIDEyODAsIDEwMjQsICA2MCwgIFRSVUV9LCB7MywgMTI4MCwgMTAyNCwgIDc1LCAgVFJVRX0sCiAJezQsIDEyODAsIDEwMjQsICA4NSwgIFRSVUV9LApAQCAtNDU5LDEyICs0NzMsMTIgQEAKIAl7MCwgICAgMCwgICAgMCwgICAwLCBGQUxTRX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX3Npc2ZiZGRjc21vZGVzIHsKK3N0YXRpYyBzdHJ1Y3QgX3Npc2ZiZGRjc21vZGVzIHsKIAl1MzIgbWFzazsKIAl1MTYgaDsKIAl1MTYgdjsKIAl1MzIgZDsKLX0gc2lzZmJfZGRjc21vZGVzW10gPSB7Cit9IHNpc2ZiX2RkY3Ntb2Rlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyAweDEwMDAwLCA2NywgNzUsIDEwODAwMH0sCiAJeyAweDA4MDAwLCA0OCwgNzIsICA1MDAwMH0sCiAJeyAweDA0MDAwLCA0NiwgNzUsICA0OTUwMH0sCkBAIC00ODAsNDkgKzQ5NCw0OSBAQAogCXsgMHgwMDAwMSwgMzgsIDYwLCAgNDAwMDB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IF9zaXNmYmRkY2Ztb2RlcyB7CitzdGF0aWMgc3RydWN0IF9zaXNmYmRkY2Ztb2RlcyB7CiAJdTE2IHg7CiAJdTE2IHk7CiAJdTE2IHY7CiAJdTE2IGg7CiAJdTMyIGQ7Ci19IHNpc2ZiX2RkY2Ztb2Rlc1tdID0gewotICAgICAgIHsgMTI4MCwgMTAyNCwgODUsIDkyLCAxNTc1MDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNjAsIDc1LCAxNjIwMDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNjUsIDgyLCAxNzU1MDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNzAsIDg4LCAxODkwMDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgNzUsIDk0LCAyMDI1MDB9LAotICAgICAgIHsgMTYwMCwgMTIwMCwgODUsIDEwNywyMjk1MDB9LAotICAgICAgIHsgMTkyMCwgMTQ0MCwgNjAsIDkwLCAyMzQwMDB9LAotICAgICAgIHsgMTkyMCwgMTQ0MCwgNzUsIDExMywyOTcwMDB9Cit9IHNpc2ZiX2RkY2Ztb2Rlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAxMjgwLCAxMDI0LCA4NSwgOTIsIDE1NzUwMH0sCisJeyAxNjAwLCAxMjAwLCA2MCwgNzUsIDE2MjAwMH0sCisJeyAxNjAwLCAxMjAwLCA2NSwgODIsIDE3NTUwMH0sCisJeyAxNjAwLCAxMjAwLCA3MCwgODgsIDE4OTAwMH0sCisJeyAxNjAwLCAxMjAwLCA3NSwgOTQsIDIwMjUwMH0sCisJeyAxNjAwLCAxMjAwLCA4NSwgMTA3LDIyOTUwMH0sCisJeyAxOTIwLCAxNDQwLCA2MCwgOTAsIDIzNDAwMH0sCisJeyAxOTIwLCAxNDQwLCA3NSwgMTEzLDI5NzAwMH0KIH07CiAKICNpZmRlZiBDT05GSUdfRkJfU0lTXzMwMAogc3RhdGljIHN0cnVjdCBfY2hzd3RhYmxlIHsKLSAgICB1MTYgIHN1YnN5c1ZlbmRvcjsKLSAgICB1MTYgIHN1YnN5c0NhcmQ7Ci0gICAgY2hhciAqdmVuZG9yTmFtZTsKLSAgICBjaGFyICpjYXJkTmFtZTsKKwl1MTYgIHN1YnN5c1ZlbmRvcjsKKwl1MTYgIHN1YnN5c0NhcmQ7CisJY2hhciAqdmVuZG9yTmFtZTsKKwljaGFyICpjYXJkTmFtZTsKIH0gbXljaHN3dGFibGVbXSBfX2RldmluaXRkYXRhID0gewotICAgICAgICB7IDB4MTYzMSwgMHgxMDAyLCAiTWl0YWNoaSIsICIweDEwMDIiIH0sCisJeyAweDE2MzEsIDB4MTAwMiwgIk1pdGFjaGkiLCAiMHgxMDAyIiB9LAogCXsgMHgxMDcxLCAweDc1MjEsICJNaXRhYyIgICwgIjc1MjFQIiAgfSwKIAl7IDAsICAgICAgMCwgICAgICAiIiAgICAgICAsICIiICAgICAgIH0KIH07CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBfY3VzdG9tdHRhYmxlIHsKLSAgICB1MTYgICBjaGlwSUQ7Ci0gICAgY2hhciAgKmJpb3N2ZXJzaW9uOwotICAgIGNoYXIgICpiaW9zZGF0ZTsKLSAgICB1MzIgICBiaW9zY2hrc3VtOwotICAgIHUxNiAgIGJpb3NGb290cHJpbnRBZGRyWzVdOwotICAgIHU4ICAgIGJpb3NGb290cHJpbnREYXRhWzVdOwotICAgIHUxNiAgIHBjaXN1YnN5c3ZlbmRvcjsKLSAgICB1MTYgICBwY2lzdWJzeXNjYXJkOwotICAgIGNoYXIgICp2ZW5kb3JOYW1lOwotICAgIGNoYXIgICpjYXJkTmFtZTsKLSAgICB1MzIgICBTcGVjaWFsSUQ7Ci0gICAgY2hhciAgKm9wdGlvbk5hbWU7CisJdTE2ICAgY2hpcElEOworCWNoYXIgICpiaW9zdmVyc2lvbjsKKwljaGFyICAqYmlvc2RhdGU7CisJdTMyICAgYmlvc2Noa3N1bTsKKwl1MTYgICBiaW9zRm9vdHByaW50QWRkcls1XTsKKwl1OCAgICBiaW9zRm9vdHByaW50RGF0YVs1XTsKKwl1MTYgICBwY2lzdWJzeXN2ZW5kb3I7CisJdTE2ICAgcGNpc3Vic3lzY2FyZDsKKwljaGFyICAqdmVuZG9yTmFtZTsKKwljaGFyICAqY2FyZE5hbWU7CisJdTMyICAgU3BlY2lhbElEOworCWNoYXIgICpvcHRpb25OYW1lOwogfSBteWN1c3RvbXR0YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBTSVNfNjMwLCAiMi4wMC4wNyIsICIwOS8yNy8yMDAyLTEzOjM4OjI1IiwKIAkgIDB4MzI0MEE4LApAQCAtNjQzLDYgKzY1NywxMyBAQAogCSAgMCwgMCwKIAkgICJHZW5lcmljIiwgIkxWRFMvUGFyYWxsZWwgODQ4eDQ4MCIsIENVVF9QQU5FTDg0OCwgIlBBTkVMODQ4eDQ4MCIKIAl9LAorCXsgNDMyMiwgIiIsICIiLAkJCS8qIG5ldmVyIGF1dG9kZXRlY3RlZCAqLworCSAgMCwKKwkgIHsgMCwgMCwgMCwgMCwgMCB9LAorCSAgeyAwLCAwLCAwLCAwLCAwIH0sCisJICAwLCAwLAorCSAgIkdlbmVyaWMiLCAiTFZEUy9QYXJhbGxlbCA4NTZ4NDgwIiwgQ1VUX1BBTkVMODU2LCAiUEFORUw4NTZ4NDgwIgorCX0sCiAJeyAwLCAiIiwgIiIsCiAJICAwLAogCSAgeyAwLCAwLCAwLCAwIH0sCkBAIC02NTIsMTU1ICs2NzMsNiBAQAogCX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX3Npc19UVl9maWx0ZXIgewotCXU4IGZpbHRlcls5XVs0XTsKLX0gc2lzX1RWX2ZpbHRlcltdID0gewotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIE5UU0NGaWx0ZXJfMCAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19LAotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIE5UU0NGaWx0ZXJfMSAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl8yICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhFQiwweDA0LDB4MjUsMHgxOH0sCi0JICAgezB4RjEsMHgwNSwweDFGLDB4MTZ9LAotCSAgIHsweEY2LDB4MDYsMHgxQSwweDE0fSwKLQkgICB7MHhGQSwweDA2LDB4MTYsMHgxNH0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl8zICovCi0JICAgezB4RjEsMHgwNCwweDFGLDB4MTh9LAotCSAgIHsweEVFLDB4MEQsMHgyMiwweDA2fSwKLQkgICB7MHhGNywweDA2LDB4MTksMHgxNH0sCi0JICAgezB4RjQsMHgwQiwweDFDLDB4MEF9LAotCSAgIHsweEZBLDB4MDcsMHgxNiwweDEyfSwKLQkgICB7MHhGOSwweDBBLDB4MTcsMHgwQ30sCi0JICAgezB4MDAsMHgwNywweDEwLDB4MTJ9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl80IC0gMzIwICovCi0JICAgezB4MDAsMHhFMCwweDEwLDB4NjB9LAotCSAgIHsweDAwLDB4RUUsMHgxMCwweDQ0fSwKLQkgICB7MHgwMCwweEY0LDB4MTAsMHgzOH0sCi0JICAgezB4RjgsMHhGNCwweDE4LDB4Mzh9LAotCSAgIHsweEZDLDB4RkIsMHgxNCwweDJBfSwKLQkgICB7MHgwMCwweDAwLDB4MTAsMHgyMH0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl81IC0gNjQwICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhFQiwweDA0LDB4MjUsMHgxOH0sCi0JICAgezB4RjEsMHgwNSwweDFGLDB4MTZ9LAotCSAgIHsweEY2LDB4MDYsMHgxQSwweDE0fSwKLQkgICB7MHhGQSwweDA2LDB4MTYsMHgxNH0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl82IC0gNzIwICovCi0JICAgezB4RUIsMHgwNCwweDI1LDB4MTh9LAotCSAgIHsweEU3LDB4MEUsMHgyOSwweDA0fSwKLQkgICB7MHhFRSwweDBDLDB4MjIsMHgwOH0sCi0JICAgezB4RjYsMHgwQiwweDFBLDB4MEF9LAotCSAgIHsweEY5LDB4MEEsMHgxNywweDBDfSwKLQkgICB7MHhGQywweDBBLDB4MTQsMHgwQ30sCi0JICAgezB4MDAsMHgwOCwweDEwLDB4MTB9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogTlRTQ0ZpbHRlcl83IC0gODAwICovCi0JICAgezB4RUMsMHgwMiwweDI0LDB4MUN9LAotCSAgIHsweEYyLDB4MDQsMHgxRSwweDE4fSwKLQkgICB7MHhFQiwweDE1LDB4MjUsMHhGNn0sCi0JICAgezB4RjQsMHgxMCwweDFDLDB4MDB9LAotCSAgIHsweEY4LDB4MEYsMHgxOCwweDAyfSwKLQkgICB7MHgwMCwweDA0LDB4MTAsMHgxOH0sCi0JICAgezB4MDEsMHgwNiwweDBGLDB4MTR9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogUEFMRmlsdGVyXzAgKi8KLQkgICB7MHgwMCwweEUwLDB4MTAsMHg2MH0sCi0JICAgezB4MDAsMHhFRSwweDEwLDB4NDR9LAotCSAgIHsweDAwLDB4RjQsMHgxMCwweDM4fSwKLQkgICB7MHhGOCwweEY0LDB4MTgsMHgzOH0sCi0JICAgezB4RkMsMHhGQiwweDE0LDB4MkF9LAotCSAgIHsweDAwLDB4MDAsMHgxMCwweDIwfSwKLQkgICB7MHgwMCwweDA0LDB4MTAsMHgxOH0sIAotCSAgIHsweEZGLDB4RkYsMHhGRiwweEZGfSB9fSwKLQl7IHt7MHgwMCwweDAwLDB4MDAsMHg0MH0sICAvKiBQQUxGaWx0ZXJfMSAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19LAotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIFBBTEZpbHRlcl8yICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGMSwweEY3LDB4MDEsMHgzMn0sCi0JICAgezB4RjUsMHhGQiwweDFCLDB4MkF9LAotCSAgIHsweEY5LDB4RkYsMHgxNywweDIyfSwKLQkgICB7MHhGQiwweDAxLDB4MTUsMHgxRX0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogUEFMRmlsdGVyXzMgKi8KLQkgICB7MHhGNSwweEZCLDB4MUIsMHgyQX0sCi0JICAgezB4RUUsMHhGRSwweDIyLDB4MjR9LAotCSAgIHsweEYzLDB4MDAsMHgxRCwweDIwfSwKLQkgICB7MHhGOSwweDAzLDB4MTcsMHgxQX0sCi0JICAgezB4RkIsMHgwMiwweDE0LDB4MUV9LAotCSAgIHsweEZCLDB4MDQsMHgxNSwweDE4fSwKLQkgICB7MHgwMCwweDA2LDB4MTAsMHgxNH0sIAotCSAgIHsweEZGLDB4RkYsMHhGRiwweEZGfSB9fSwKLQl7IHt7MHgwMCwweDAwLDB4MDAsMHg0MH0sICAvKiBQQUxGaWx0ZXJfNCAtIDMyMCAqLwotCSAgIHsweDAwLDB4RTAsMHgxMCwweDYwfSwKLQkgICB7MHgwMCwweEVFLDB4MTAsMHg0NH0sCi0JICAgezB4MDAsMHhGNCwweDEwLDB4Mzh9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGQywweEZCLDB4MTQsMHgyQX0sCi0JICAgezB4MDAsMHgwMCwweDEwLDB4MjB9LAotCSAgIHsweDAwLDB4MDQsMHgxMCwweDE4fSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19LAotCXsge3sweDAwLDB4MDAsMHgwMCwweDQwfSwgIC8qIFBBTEZpbHRlcl81IC0gNjQwICovCi0JICAgezB4RjUsMHhFRSwweDFCLDB4NDR9LAotCSAgIHsweEY4LDB4RjQsMHgxOCwweDM4fSwKLQkgICB7MHhGMSwweEY3LDB4MUYsMHgzMn0sCi0JICAgezB4RjUsMHhGQiwweDFCLDB4MkF9LAotCSAgIHsweEY5LDB4RkYsMHgxNywweDIyfSwKLQkgICB7MHhGQiwweDAxLDB4MTUsMHgxRX0sCi0JICAgezB4MDAsMHgwNCwweDEwLDB4MTh9LCAKLQkgICB7MHhGRiwweEZGLDB4RkYsMHhGRn0gfX0sCi0JeyB7ezB4MDAsMHgwMCwweDAwLDB4NDB9LCAgLyogUEFMRmlsdGVyXzYgLSA3MjAgKi8KLQkgICB7MHhGNSwweEVFLDB4MUIsMHgyQX0sCi0JICAgezB4RUUsMHhGRSwweDIyLDB4MjR9LAotCSAgIHsweEYzLDB4MDAsMHgxRCwweDIwfSwKLQkgICB7MHhGOSwweDAzLDB4MTcsMHgxQX0sCi0JICAgezB4RkIsMHgwMiwweDE0LDB4MUV9LAotCSAgIHsweEZCLDB4MDQsMHgxNSwweDE4fSwKLQkgICB7MHgwMCwweDA2LDB4MTAsMHgxNH0sIAotCSAgIHsweEZGLDB4RkYsMHhGRiwweEZGfSB9fSwKLQl7IHt7MHgwMCwweDAwLDB4MDAsMHg0MH0sICAvKiBQQUxGaWx0ZXJfNyAtIDgwMCAqLwotCSAgIHsweEY1LDB4RUUsMHgxQiwweDQ0fSwKLQkgICB7MHhGOCwweEY0LDB4MTgsMHgzOH0sCi0JICAgezB4RkMsMHhGQiwweDE0LDB4MkF9LAotCSAgIHsweEVCLDB4MDUsMHgyNSwweDE2fSwKLQkgICB7MHhGMSwweDA1LDB4MUYsMHgxNn0sCi0JICAgezB4RkEsMHgwNywweDE2LDB4MTJ9LAotCSAgIHsweDAwLDB4MDcsMHgxMCwweDEyfSwgCi0JICAgezB4RkYsMHhGRiwweEZGLDB4RkZ9IH19Ci19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQgKi8KQEAgLTgxMSwxNDUgKzY4MywxNTkgQEAKIC8qIEludGVyZmFjZSB0byB0aGUgbG93IGxldmVsIGNvbnNvbGUgZHJpdmVyICovCiBTSVNJTklUU1RBVElDIGludCBzaXNmYl9pbml0KHZvaWQpOwogCi0KIC8qIGZiZGV2IHJvdXRpbmVzICovCi1zdGF0aWMgaW50ICAgICAgc2lzZmJfZ2V0X2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgaW50IGNvbiwKLQkJCSAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfZ2V0X2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9nZXRfZml4KHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCAKLQkJCSAgICAgIGludCBjb24sCi0JCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfZ2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCi0JCQkgICAgICBpbnQgY29uLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIHNpc2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIAotCQkJICAgICAgaW50IGNvbiwKLQkJCSAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9jcnRjX3RvX3ZhcihzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywKLQkJCSAgICAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfZ2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIAotCQkJICAgICAgIGludCBrc3BjLCAKLQkJCSAgICAgICBpbnQgY29uLAotCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9zZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgCi0JCQkgICAgICAgaW50IGtzcGMsIAotCQkJICAgICAgIGludCBjb24sCi0JCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwkJCQotc3RhdGljIGludCAgICAgIHNpc2ZiX3VwZGF0ZV92YXIoaW50IGNvbiwgCi0JCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9zd2l0Y2goaW50IGNvbiwgCitzdGF0aWMgaW50CXNpc2ZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCisJCQkJaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50CXNpc2ZiX2dldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50CXNpc2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJaW50IGNvbiwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZAlzaXNmYl9jcnRjX3RvX3ZhcihzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywKKwkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CitzdGF0aWMgaW50CXNpc2ZiX2dldF9jbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLAorCQkJCWludCBrc3BjLAorCQkJCWludCBjb24sCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludAlzaXNmYl9zZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwKKwkJCQlpbnQga3NwYywKKwkJCQlpbnQgY29uLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfdXBkYXRlX3ZhcihpbnQgY29uLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfc3dpdGNoKGludCBjb24sCiAJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9ibGFuayhpbnQgYmxhbmssIAotCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9zZXRfZGlzcChpbnQgY29uLCAKLQkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIHNpc19nZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkICpyZWQsIHVuc2lnbmVkICpncmVlbiwKLQkJCSAgICAgIHVuc2lnbmVkICpibHVlLCB1bnNpZ25lZCAqdHJhbnNwLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwotc3RhdGljIHZvaWQgICAgIHNpc2ZiX2RvX2luc3RhbGxfY21hcChpbnQgY29uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIHNpc2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGNvbiwKLQkJICAgICAgIAkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwkJICAgICAgCi0jZW5kaWYJCQkKK3N0YXRpYyB2b2lkCXNpc2ZiX2JsYW5rKGludCBibGFuaywKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZAlzaXNmYl9zZXRfZGlzcChpbnQgY29uLAorCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzX2dldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgKnJlZCwgdW5zaWduZWQgKmdyZWVuLAorCQkJCXVuc2lnbmVkICpibHVlLCB1bnNpZ25lZCAqdHJhbnNwLAorCQkJCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX2RvX2luc3RhbGxfY21hcChpbnQgY29uLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCBjb24sCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworI2VuZGlmCiAKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1zdGF0aWMgaW50ICAgICAgc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICAJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkgICAgICAgCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgc2lzZmJfYmxhbmsoaW50IGJsYW5rLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CQkJCi1leHRlcm4gdm9pZCAgICAgZmJjb25fc2lzX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKLWV4dGVybiB2b2lkICAgICBmYmNvbl9zaXNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpOwotZXh0ZXJuIGludCAgICAgIGZiY29uX3Npc19zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludAlzaXNmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQJc2lzZmJfYmxhbmsoaW50IGJsYW5rLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKK2V4dGVybiB2b2lkCWZiY29uX3Npc19maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpOworZXh0ZXJuIHZvaWQJZmJjb25fc2lzX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSk7CitleHRlcm4gaW50CWZiY29uX3Npc19zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKICNlbmRpZgotCQkJCisKIC8qIEludGVybmFsIDJEIGFjY2VsZXJhdG9yIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCAgICAgIHNpc2ZiX2luaXRhY2NlbChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1leHRlcm4gdm9pZCAgICAgc2lzZmJfc3luY2FjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK2V4dGVybiBpbnQJc2lzZmJfaW5pdGFjY2VsKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK2V4dGVybiB2b2lkCXNpc2ZiX3N5bmNhY2NlbChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7CiAKIC8qIEludGVybmFsIGdlbmVyYWwgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkICAgICBzaXNmYl9zZWFyY2hfbW9kZShjaGFyICpuYW1lLCBCT09MRUFOIHF1aWV0KTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl92YWxpZGF0ZV9tb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBpbnQgbW9kZWluZGV4LCB1MzIgdmJmbGFncyk7Ci1zdGF0aWMgdTggICAgICAgc2lzZmJfc2VhcmNoX3JlZnJlc2hfcmF0ZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgdW5zaWduZWQgaW50IHJhdGUsCi0JCQlpbnQgaW5kZXgpOwotc3RhdGljIGludCAgICAgIHNpc2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKLQkJCXVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKLQkJCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKLXN0YXRpYyBpbnQgICAgICBzaXNmYl9kb19zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaXNhY3RpdmUsCi0JCSAgICAgIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfcHJlX3NldG1vZGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIHZvaWQgICAgIHNpc2ZiX3Bvc3Rfc2V0bW9kZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1zdGF0aWMgQk9PTEVBTiAgc2lzZmJfQ2hlY2tWQlJldHJhY2Uoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIEJPT0xFQU4gIHNpc2ZiY2hlY2t2cmV0cmFjZWNydDIoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIEJPT0xFQU4gIHNpc2ZiY2hlY2t2cmV0cmFjZWNydDEoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIEJPT0xFQU4gIHNpc2ZiX2JyaWRnZWlzc2xhdmUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOwotc3RhdGljIHZvaWQgICAgIHNpc2ZiX2RldGVjdF9WQl9jb25uZWN0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9nZXRfVkJfdHlwZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfc2V0X1RWeHBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfc2V0X1RWeXBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCk7CitzdGF0aWMgdm9pZAlzaXNmYl9zZWFyY2hfbW9kZShjaGFyICpuYW1lLCBCT09MRUFOIHF1aWV0KTsKK3N0YXRpYyBpbnQJc2lzZmJfdmFsaWRhdGVfbW9kZShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IG1vZGVpbmRleCwgdTMyIHZiZmxhZ3MpOworc3RhdGljIHU4CXNpc2ZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHVuc2lnbmVkIGludCByYXRlLAorCQkJCWludCBpbmRleCk7CitzdGF0aWMgaW50CXNpc2ZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKKwkJCQl1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCisJCQkJc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOworc3RhdGljIGludAlzaXNmYl9kb19zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaXNhY3RpdmUsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIHZvaWQJc2lzZmJfcHJlX3NldG1vZGUoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOworc3RhdGljIHZvaWQJc2lzZmJfcG9zdF9zZXRtb2RlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyBCT09MRUFOCXNpc2ZiX0NoZWNrVkJSZXRyYWNlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyBCT09MRUFOCXNpc2ZiY2hlY2t2cmV0cmFjZWNydDIoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOworc3RhdGljIEJPT0xFQU4Jc2lzZmJjaGVja3ZyZXRyYWNlY3J0MShzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7CitzdGF0aWMgQk9PTEVBTglzaXNmYl9icmlkZ2Vpc3NsYXZlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX2RldGVjdF9WQl9jb25uZWN0KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX2dldF9WQl90eXBlKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKK3N0YXRpYyB2b2lkCXNpc2ZiX3NldF9UVnhwb3NvZmZzZXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIGludCB2YWwpOworc3RhdGljIHZvaWQJc2lzZmJfc2V0X1RWeXBvc29mZnNldChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbywgaW50IHZhbCk7CisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMDAKK3Vuc2lnbmVkIGludAlzaXNmYl9yZWFkX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnKTsKK3ZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2R3b3JkKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludAlzaXNmYl9yZWFkX2xwY19wY2lfZHdvcmQoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZCX1NJU18zMTUKK3ZvaWQJCXNpc2ZiX3dyaXRlX25icmlkZ2VfcGNpX2J5dGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3Vuc2lnbmVkIGludAlzaXNmYl9yZWFkX21pb19wY2lfd29yZChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgaW50IHJlZyk7CisjZW5kaWYKIAogLyogU2lTLXNwZWNpZmljIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotdm9pZCAgICAgICAgICAgIHNpc19tYWxsb2Moc3RydWN0IHNpc19tZW1yZXEgKnJlcSk7Ci12b2lkICAgICAgICAgICAgc2lzX2ZyZWUodTMyIGJhc2UpOwordm9pZAkJCXNpc19tYWxsb2Moc3RydWN0IHNpc19tZW1yZXEgKnJlcSk7Cit2b2lkCQkJc2lzX21hbGxvY19uZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzaXNfbWVtcmVxICpyZXEpOwordm9pZAkJCXNpc19mcmVlKHUzMiBiYXNlKTsKK3ZvaWQJCQlzaXNfZnJlZV9uZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBiYXNlKTsKIAogLyogSW50ZXJuYWwgaGVhcCByb3V0aW5lcyAqLwotc3RhdGljIGludCAgICAgIHNpc2ZiX2hlYXBfaW5pdChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7Ci1zdGF0aWMgU0lTX09IICAgKnNpc2ZiX3BvaF9uZXdfbm9kZSh2b2lkKTsKLXN0YXRpYyBTSVNfT0ggICAqc2lzZmJfcG9oX2FsbG9jYXRlKHUzMiBzaXplKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9kZWxldGVfbm9kZShTSVNfT0ggKnBvaCk7Ci1zdGF0aWMgdm9pZCAgICAgc2lzZmJfaW5zZXJ0X25vZGUoU0lTX09IICpwb2hMaXN0LCBTSVNfT0ggKnBvaCk7Ci1zdGF0aWMgU0lTX09IICAgKnNpc2ZiX3BvaF9mcmVlKHUzMiBiYXNlKTsKLXN0YXRpYyB2b2lkICAgICBzaXNmYl9mcmVlX25vZGUoU0lTX09IICpwb2gpOwotCi0vKiBTZW5zaW5nIHJvdXRpbmVzICovCi1zdGF0aWMgdm9pZCAgICAgU2lTX1NlbnNlMzB4KHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvKTsKLXN0YXRpYyB2b2lkICAgICBTaVNfU2Vuc2VDaChzdHJ1Y3Qgc2lzX3ZpZGVvX2luZm8gKml2aWRlbyk7CitzdGF0aWMgaW50CQlzaXNmYl9oZWFwX2luaXQoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8pOworc3RhdGljIHN0cnVjdCBTSVNfT0ggKglzaXNmYl9wb2hfbmV3X25vZGUoc3RydWN0IFNJU19IRUFQICptZW1oZWFwKTsKK3N0YXRpYyBzdHJ1Y3QgU0lTX09IICoJc2lzZmJfcG9oX2FsbG9jYXRlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgdTMyIHNpemUpOworc3RhdGljIHZvaWQJCXNpc2ZiX2RlbGV0ZV9ub2RlKHN0cnVjdCBTSVNfT0ggKnBvaCk7CitzdGF0aWMgdm9pZAkJc2lzZmJfaW5zZXJ0X25vZGUoc3RydWN0IFNJU19PSCAqcG9oTGlzdCwgc3RydWN0IFNJU19PSCAqcG9oKTsKK3N0YXRpYyBzdHJ1Y3QgU0lTX09IICoJc2lzZmJfcG9oX2ZyZWUoc3RydWN0IFNJU19IRUFQICptZW1oZWFwLCB1MzIgYmFzZSk7CitzdGF0aWMgdm9pZAkJc2lzZmJfZnJlZV9ub2RlKHN0cnVjdCBTSVNfSEVBUCAqbWVtaGVhcCwgc3RydWN0IFNJU19PSCAqcG9oKTsKIAogLyogUm91dGluZXMgZnJvbSBpbml0LmMvaW5pdDMwMS5jICovCi1leHRlcm4gVVNIT1JUICAgU2lTX0dldE1vZGVJRF9MQ0QoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksIGludCBEZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOIEZTVE4sIFVTSE9SVCBDdXN0b21ULCBpbnQgTENEd2l0aCwgaW50IExDRGhlaWdodCk7Ci1leHRlcm4gVVNIT1JUICAgU2lTX0dldE1vZGVJRF9UVihpbnQgVkdBRW5naW5lLCBVTE9ORyBWQkZsYWdzLCBpbnQgSERpc3BsYXksIGludCBWRGlzcGxheSwgaW50IERlcHRoKTsKLWV4dGVybiBVU0hPUlQgICBTaVNfR2V0TW9kZUlEX1ZHQTIoaW50IFZHQUVuZ2luZSwgVUxPTkcgVkJGbGFncywgaW50IEhEaXNwbGF5LCBpbnQgVkRpc3BsYXksIGludCBEZXB0aCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldE1vZGVJRF9MQ0QoaW50IFZHQUVuZ2luZSwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBIRGlzcGxheSwKKwkJCQlpbnQgVkRpc3BsYXksIGludCBEZXB0aCwgQk9PTEVBTiBGU1ROLCB1bnNpZ25lZCBzaG9ydCBDdXN0b21ULAorCQkJCWludCBMQ0R3aXRoLCBpbnQgTENEaGVpZ2h0LCB1bnNpZ25lZCBpbnQgVkJGbGFnczIpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19HZXRNb2RlSURfVFYoaW50IFZHQUVuZ2luZSwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBIRGlzcGxheSwKKwkJCQlpbnQgVkRpc3BsYXksIGludCBEZXB0aCwgdW5zaWduZWQgaW50IFZCRmxhZ3MyKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0TW9kZUlEX1ZHQTIoaW50IFZHQUVuZ2luZSwgdW5zaWduZWQgaW50IFZCRmxhZ3MsIGludCBIRGlzcGxheSwKKwkJCQlpbnQgVkRpc3BsYXksIGludCBEZXB0aCwgdW5zaWduZWQgaW50IFZCRmxhZ3MyKTsKK2V4dGVybiB2b2lkCQlTaVNSZWdJbml0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBTSVNJT0FERFJFU1MgQmFzZUFkZHIpOworZXh0ZXJuIEJPT0xFQU4JCVNpU1NldE1vZGUoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IE1vZGVObyk7CitleHRlcm4gdm9pZAkJU2lTX1NldEVuYWJsZURzdG4oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRFbmFibGVGc3RuKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCBpbnQgZW5hYmxlKTsKIAotZXh0ZXJuIHZvaWQgCVNpU1JlZ0luaXQoU2lTX1ByaXZhdGUgKlNpU19QciwgU0lTSU9BRERSRVNTIEJhc2VBZGRyKTsKLWV4dGVybiBCT09MRUFOICBTaVNTZXRNb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0RldmljZUluZm8sIFVTSE9SVCBNb2RlTm8pOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRFbmFibGVEc3RuKFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRFbmFibGVGc3RuKFNpU19Qcml2YXRlICpTaVNfUHIsIGludCBlbmFibGUpOworZXh0ZXJuIEJPT0xFQU4JCVNpU0RldGVybWluZVJPTUxheW91dDY2MShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAKLWV4dGVybiBCT09MRUFOICBTaVNEZXRlcm1pbmVST01MYXlvdXQ2NjEoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3SW5mbyk7Ci0KLWV4dGVybiBCT09MRUFOICBzaXNmYl9nZXR0b3RhbGZyb21tb2RlKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0RldmljZUV4dGVuc2lvbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCBpbnQgKmh0b3RhbCwgaW50ICp2dG90YWwsIHVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4KTsKK2V4dGVybiBCT09MRUFOCQlzaXNmYl9nZXR0b3RhbGZyb21tb2RlKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyIG1vZGVubywKKwkJCQlpbnQgKmh0b3RhbCwgaW50ICp2dG90YWwsIHVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4KTsKICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1leHRlcm4gaW50CXNpc2ZiX21vZGVfcmF0ZV90b19kY2xvY2soU2lTX1ByaXZhdGUgKlNpU19QciwKLQkJICAgIAlQU0lTX0hXX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sCi0JCQl1bnNpZ25lZCBjaGFyIG1vZGVubywgdW5zaWduZWQgY2hhciByYXRlaW5kZXgpOwotZXh0ZXJuIGludCAgICAgIHNpc2ZiX21vZGVfcmF0ZV90b19kZGF0YShTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sCi0JCQl1bnNpZ25lZCBjaGFyIG1vZGVubywgdW5zaWduZWQgY2hhciByYXRlaW5kZXgsCi0JCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CitleHRlcm4gaW50CQlzaXNmYl9tb2RlX3JhdGVfdG9fZGNsb2NrKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLAorCQkJCXVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCk7CitleHRlcm4gaW50CQlzaXNmYl9tb2RlX3JhdGVfdG9fZGRhdGEoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGNoYXIgbW9kZW5vLAorCQkJCXVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4LCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2V4dGVybiB2b2lkCQlTaVNfR2VuZXJpY19Db252ZXJ0Q1JEYXRhKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBjaGFyICpjcmRhdGEsIGludCB4cmVzLAorCQkJCWludCB5cmVzLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgQk9PTEVBTiB3cml0ZXJlcyk7CiAjZW5kaWYKIAogLyogQ2hyb250ZWwgVFYsIEREQyBhbmQgRFBNUyBmdW5jdGlvbnMgKi8KLWV4dGVybiBVU0hPUlQgCVNpU19HZXRDSDcwMHgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCk7Ci1leHRlcm4gdm9pZCAJU2lTX1NldENINzAweChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLWV4dGVybiBVU0hPUlQgCVNpU19HZXRDSDcwMXgoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBieCk7Ci1leHRlcm4gdm9pZCAJU2lTX1NldENINzAxeChTaVNfUHJpdmF0ZSAqU2lTX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLWV4dGVybiB2b2lkICAgICBTaVNfU2V0Q0g3MHh4QU5ET1IoU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIHRlbXBheCxVU0hPUlQgdGVtcGJoKTsKLWV4dGVybiB2b2lkICAgICBTaVNfRERDMkRlbGF5KFNpU19Qcml2YXRlICpTaVNfUHIsIFVTSE9SVCBkZWxheXRpbWUpOwotZXh0ZXJuIHZvaWQgICAgIFNpU19TZXRDaHJvbnRlbEdQSU8oU2lTX1ByaXZhdGUgKlNpU19QciwgVVNIT1JUIG15dmJpbmZvKTsKLWV4dGVybiBVU0hPUlQgICBTaVNfSGFuZGxlRERDKFNpU19Qcml2YXRlICpTaVNfUHIsIFVMT05HIFZCRmxhZ3MsIGludCBWR0FFbmdpbmUsCi0JCSAgICAgICAgICAgICAgVVNIT1JUIGFkYXB0bnVtLCBVU0hPUlQgRERDZGF0YXR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gVVNIT1JUICAgU2lTX1JlYWREREMxQml0KFNpU19Qcml2YXRlICpTaVNfUHIpOwotZXh0ZXJuIHZvaWQgCVNpU19DaHJvbnRlbDcwMXhCTE9uKFNpU19Qcml2YXRlICpTaVNfUHIsIFBTSVNfSFdfSU5GTyBId0RldmljZUluZm8pOwotZXh0ZXJuIHZvaWQgCVNpU19DaHJvbnRlbDcwMXhCTE9mZihTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKLWV4dGVybiB2b2lkIAlTaVNfU2lTMzB4QkxPbihTaVNfUHJpdmF0ZSAqU2lTX1ByLCBQU0lTX0hXX0lORk8gSHdEZXZpY2VJbmZvKTsKLWV4dGVybiB2b2lkIAlTaVNfU2lTMzB4QkxPZmYoU2lTX1ByaXZhdGUgKlNpU19QciwgUFNJU19IV19JTkZPIEh3RGV2aWNlSW5mbyk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX0dldENINzAweChzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnKTsKK2V4dGVybiB2b2lkCQlTaVNfU2V0Q0g3MDB4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydAlTaVNfR2V0Q0g3MDF4KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBzaG9ydCByZWcpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRDSDcwMXgoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgY2hhciB2YWwpOworZXh0ZXJuIHZvaWQJCVNpU19TZXRDSDcweHhBTkRPUihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIGNoYXIgbXlvciwgdW5zaWduZWQgY2hhciBteWFuZCk7CitleHRlcm4gdm9pZAkJU2lTX0REQzJEZWxheShzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgaW50IGRlbGF5dGltZSk7CitleHRlcm4gdm9pZAkJU2lTX1NldENocm9udGVsR1BJTyhzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19QciwgdW5zaWduZWQgc2hvcnQgbXl2YmluZm8pOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CVNpU19IYW5kbGVEREMoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIsIHVuc2lnbmVkIGludCBWQkZsYWdzLCBpbnQgVkdBRW5naW5lLAorCQkJCXVuc2lnbmVkIHNob3J0IGFkYXB0bnVtLCB1bnNpZ25lZCBzaG9ydCBERENkYXRhdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCXVuc2lnbmVkIGludCBWQkZsYWdzMik7CitleHRlcm4gdW5zaWduZWQgc2hvcnQJU2lTX1JlYWREREMxQml0KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKKyNpZmRlZiBDT05GSUdfRkJfU0lTXzMxNQorZXh0ZXJuIHZvaWQJCVNpU19DaHJvbnRlbDcwMXhCTE9uKHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByKTsKK2V4dGVybiB2b2lkCQlTaVNfQ2hyb250ZWw3MDF4QkxPZmYoc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworI2VuZGlmCitleHRlcm4gdm9pZAkJU2lTX1NpUzMweEJMT24oc3RydWN0IFNpU19Qcml2YXRlICpTaVNfUHIpOworZXh0ZXJuIHZvaWQJCVNpU19TaVMzMHhCTE9mZihzdHJ1Y3QgU2lTX1ByaXZhdGUgKlNpU19Qcik7CiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy92Z2F0eXBlcy5oIGIvZHJpdmVycy92aWRlby9zaXMvdmdhdHlwZXMuaAppbmRleCA1MDdiYmExLi44MzFiOWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy92Z2F0eXBlcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3ZnYXR5cGVzLmgKQEAgLTMsNyArMyw3IEBACiAvKgogICogR2VuZXJhbCB0eXBlIGRlZmluaXRpb25zIGZvciB1bml2ZXJzYWwgbW9kZSBzd2l0Y2hpbmcgbW9kdWxlcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgYnkgVGhvbWFzIFdpbmlzY2hob2ZlciwgVmllbm5hLCBBdXN0cmlhCiAgKgogICogSWYgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgdGVybXMKICAqIGFwcGx5OgpAQCAtNTAsMTEgKzUwLDEwIEBACiAgKgogICovCiAKLSNpZm5kZWYgX1ZHQVRZUEVTXwotI2RlZmluZSBfVkdBVFlQRVNfCisjaWZuZGVmIF9WR0FUWVBFU19IXworI2RlZmluZSBfVkdBVFlQRVNfSF8KIAotI2lmZGVmIExJTlVYX0tFUk5FTCAgLyogV2UgZG9uJ3Qgd2FudCB0aGUgWCBkcml2ZXIgdG8gZGVwZW5kIG9uIGtlcm5lbCBzb3VyY2UgKi8KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjZW5kaWYKIApAQCAtNjYsNDEgKzY1LDEzIEBACiAjZGVmaW5lIFRSVUUgICAgMQogI2VuZGlmCiAKLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLSNlbmRpZgotCi0jaWZuZGVmIENIQVIKLXR5cGVkZWYgY2hhciBDSEFSOwotI2VuZGlmCi0KLSNpZm5kZWYgU0hPUlQKLXR5cGVkZWYgc2hvcnQgU0hPUlQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBMT05HCi10eXBlZGVmIGxvbmcgIExPTkc7Ci0jZW5kaWYKLQotI2lmbmRlZiBVQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVDSEFSOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNIT1JUCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKLSNlbmRpZgotCi0jaWZuZGVmIFVMT05HCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Ci0jZW5kaWYKLQogI2lmbmRlZiBCT09MRUFOCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJPT0xFQU47CiAjZW5kaWYKIAogI2RlZmluZSBTSVNJT01FTVRZUEUKIAotI2lmZGVmIExJTlVYX0tFUk5FTAorI2lmZGVmIFNJU19MSU5VWF9LRVJORUwKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBTSVNJT0FERFJFU1M7CiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDgpCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gIC8qIE5lZWQgX19pb21lbSAqLwpAQCAtMTA5LDcgKzgwLDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBMSU5VWF9YRjg2CisjaWZkZWYgU0lTX1hPUkdfWEY4NgogI2lmIFhGODZfVkVSU0lPTl9DVVJSRU5UIDwgWEY4Nl9WRVJTSU9OX05VTUVSSUMoNCwyLDAsMCwwKQogdHlwZWRlZiB1bnNpZ25lZCBsb25nIElPQUREUkVTUzsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBTSVNJT0FERFJFU1M7CkBAIC0xMTgsNyArODksNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotZW51bSBfU0lTX0NISVBfVFlQRSB7Cit0eXBlZGVmIGVudW0gX1NJU19DSElQX1RZUEUgewogICAgIFNJU19WR0FMZWdhY3kgPSAwLAogICAgIFNJU181MzAsCiAgICAgU0lTX09MRCwKQEAgLTEyOCwxMTUgKzk5LDI3IEBACiAgICAgU0lTXzU0MCwKICAgICBTSVNfMzE1SCwgICAvKiBTaVMgMzEwICovCiAgICAgU0lTXzMxNSwKLSAgICBTSVNfMzE1UFJPLAorICAgIFNJU18zMTVQUk8sIC8qIFNpUyAzMjUgKi8KICAgICBTSVNfNTUwLAogICAgIFNJU182NTAsCiAgICAgU0lTXzc0MCwKICAgICBTSVNfMzMwLAogICAgIFNJU182NjEsCiAgICAgU0lTXzc0MSwKLSAgICBTSVNfNjYwLAorICAgIFNJU182NzAsCisgICAgU0lTXzY2MCA9IDM1LAogICAgIFNJU183NjAsCiAgICAgU0lTXzc2MSwKLSAgICBTSVNfMzQwLAorICAgIFNJU183NjIsCisgICAgU0lTXzc3MCwKKyAgICBTSVNfMzQwID0gNTUsCisgICAgU0lTXzM0MSwKKyAgICBTSVNfMzQyLAorICAgIFhHSV8yMCAgPSA3NSwKKyAgICBYR0lfNDAsCiAgICAgTUFYX1NJU19DSElQCi19OworfSBTSVNfQ0hJUF9UWVBFOwogCi0jaWZuZGVmIFNJU19IV19JTkZPCi10eXBlZGVmIHN0cnVjdCBfU0lTX0hXX0lORk8gIFNJU19IV19JTkZPLCAqUFNJU19IV19JTkZPOwotCi1zdHJ1Y3QgX1NJU19IV19JTkZPCi17Ci0jaWZkZWYgTElOVVhfWEY4NgotICAgIFBDSVRBRyBQY2lUYWc7CQkgLyogUENJIFRhZyAqLwotI2VuZGlmCi0KLSAgICBVQ0hBUiAqcGpWaXJ0dWFsUm9tQmFzZTsJIC8qIFJPTSBpbWFnZSAqLwotCi0gICAgQk9PTEVBTiBVc2VST007CQkgLyogVXNlIHRoZSBST00gaW1hZ2UgaWYgcHJvdmlkZWQgKi8KLQotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgIFVDSEFSIFNJU0lPTUVNVFlQRSAqcGpWaWRlb01lbW9yeUFkZHJlc3M7Ci0gICAgCQkJCSAvKiBiYXNlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIExpbmVhciBWR0EgbWVtb3J5ICovCi0KLSAgICBVTE9ORyAgdWxWaWRlb01lbW9yeVNpemU7ICAgIC8qIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbWVtb3J5IG9uIHRoZSBib2FyZCAqLwotI2VuZGlmCi0KLSAgICBTSVNJT0FERFJFU1MgdWxJT0FkZHJlc3M7ICAgIC8qIGJhc2UgSS9PIGFkZHJlc3Mgb2YgVkdBIHBvcnRzICgweDNCMDsgcmVsb2NhdGVkKSAqLwotCi0gICAgVUNIQVIgIGpDaGlwVHlwZTsgICAgICAgICAgICAvKiBVc2VkIHRvIElkZW50aWZ5IFNpUyBHcmFwaGljcyBDaGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbmVkIGluIHRoZSBlbnVtICJTSVNfQ0hJUF9UWVBFIiAoYWJvdmUgb3Igc2lzZmIuaCkgKi8KLQotICAgIFVDSEFSICBqQ2hpcFJldmlzaW9uOyAgICAgICAgLyogVXNlZCB0byBJZGVudGlmeSBTaVMgR3JhcGhpY3MgQ2hpcCBSZXZpc2lvbiAqLwotCi0gICAgQk9PTEVBTiBiSW50ZWdyYXRlZE1NRW5hYmxlZDsvKiBzdXBwb3J0aW5nIGludGVncmF0aW9uIE1NIGVuYWJsZSAqLwotfTsKLSNlbmRpZgotCi0vKiBBZGR0aW9uYWwgSU9DVExzIGZvciBjb21tdW5pY2F0aW9uIHNpc2ZiIDw+IFggZHJpdmVyICAgICAgICAqLwotLyogSWYgY2hhbmdpbmcgdGhpcywgc2lzZmIuaCBtdXN0IGFsc28gYmUgY2hhbmdlZCAoZm9yIHNpc2ZiKSAqLwotCi0jaWZkZWYgTElOVVhfWEY4NiAgLyogV2UgZG9uJ3Qgd2FudCB0aGUgWCBkcml2ZXIgdG8gZGVwZW5kIG9uIHRoZSBrZXJuZWwgc291cmNlICovCi0KLS8qIGlvY3RsIGZvciBpZGVudGlmeWluZyBhbmQgZ2l2aW5nIHNvbWUgaW5mbyAoZXNwLiBtZW1vcnkgaGVhcCBzdGFydCkgKi8KLSNkZWZpbmUgU0lTRkJfR0VUX0lORk9fU0laRQkweDgwMDRmMzAwCi0jZGVmaW5lIFNJU0ZCX0dFVF9JTkZPCQkweDgwMDBmMzAxICAvKiBNdXN0IGJlIHBhdGNoZWQgd2l0aCByZXN1bHQgZnJvbSAuLi5fU0laRSBhdCBEWzI5OjE2XSAqLwotLyogZGVwcmVjYXRlZCBpb2N0bCBudW1iZXIgKGZvciBvbGRlciB2ZXJzaW9ucyBvZiBzaXNmYikgKi8KLSNkZWZpbmUgU0lTRkJfR0VUX0lORk9fT0xEICAgIAkweDgwMDQ2ZWY4Ci0KLS8qIGlvY3RscyBmb3IgdHYgcGFyYW1ldGVycyAocG9zaXRpb24pICovCi0jZGVmaW5lIFNJU0ZCX1NFVF9UVlBPU09GRlNFVCAgIDB4NDAwNGYzMDQKLQotLyogbG9jayBzaXNmYiBmcm9tIHJlZ2lzdGVyIGFjY2VzcyAqLwotI2RlZmluZSBTSVNGQl9TRVRfTE9DSwkJMHg0MDA0ZjMwNgotCi0vKiBTdHJ1Y3R1cmUgYXJndW1lbnQgZm9yIFNJU0ZCX0dFVF9JTkZPIGlvY3RsICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NJU0ZCX0lORk8gc2lzZmJfaW5mbywgKnBzaXNmYl9pbmZvOwotCi1zdHJ1Y3QgX1NJU0ZCX0lORk8gewotCUNBUkQzMiAJc2lzZmJfaWQ7ICAgICAgICAgCS8qIGZvciBpZGVudGlmeWluZyBzaXNmYiAqLwotI2lmbmRlZiBTSVNGQl9JRAotI2RlZmluZSBTSVNGQl9JRAkgIDB4NTM0OTUzNDYgICAgLyogSWRlbnRpZnkgbXlzZWxmIHdpdGggJ1NJU0YnICovCi0jZW5kaWYKLSAJQ0FSRDMyIAljaGlwX2lkOwkJLyogUENJIElEIG9mIGRldGVjdGVkIGNoaXAgKi8KLQlDQVJEMzIJbWVtb3J5OwkJCS8qIHZpZGVvIG1lbW9yeSBpbiBLQiB3aGljaCBzaXNmYiBtYW5hZ2VzICovCi0JQ0FSRDMyCWhlYXBzdGFydDsgICAgICAgICAgICAgCS8qIGhlYXAgc3RhcnQgKD0gc2lzZmIgIm1lbSIgYXJndW1lbnQpIGluIEtCICovCi0JQ0FSRDggCWZidmlkbW9kZTsJCS8qIGN1cnJlbnQgc2lzZmIgbW9kZSAqLwotCi0JQ0FSRDggCXNpc2ZiX3ZlcnNpb247Ci0JQ0FSRDgJc2lzZmJfcmV2aXNpb247Ci0JQ0FSRDggCXNpc2ZiX3BhdGNobGV2ZWw7Ci0KLQlDQVJEOCAJc2lzZmJfY2FwczsJCS8qIHNpc2ZiJ3MgY2FwYWJpbGl0aWVzICovCi0KLQlDQVJEMzIgCXNpc2ZiX3RxbGVuOwkJLyogdHVyYm8gcXVldWUgbGVuZ3RoIChpbiBLQikgKi8KLQotCUNBUkQzMiAJc2lzZmJfcGNpYnVzOyAgICAgIAkvKiBUaGUgY2FyZCdzIFBDSSBJRCAqLwotCUNBUkQzMiAJc2lzZmJfcGNpc2xvdDsKLQlDQVJEMzIgCXNpc2ZiX3BjaWZ1bmM7Ci0KLQlDQVJEOCAJc2lzZmJfbGNkcGRjOwotCi0JQ0FSRDgJc2lzZmJfbGNkYTsKLQotCUNBUkQzMglzaXNmYl92YmZsYWdzOwotCUNBUkQzMglzaXNmYl9jdXJyZW50dmJmbGFnczsKLQotCUNBUkQzMiAJc2lzZmJfc2NhbGVsY2Q7Ci0JQ0FSRDMyIAlzaXNmYl9zcGVjaWFsdGltaW5nOwotCi0JQ0FSRDggCXNpc2ZiX2hhdmVlbWk7Ci0JQ0FSRDggCXNpc2ZiX2VtaTMwLHNpc2ZiX2VtaTMxLHNpc2ZiX2VtaTMyLHNpc2ZiX2VtaTMzOwotCUNBUkQ4IAlzaXNmYl9oYXZlZW1pbGNkOwotCi0JQ0FSRDggCXNpc2ZiX2xjZHBkY2E7Ci0KLQlDQVJEMTYgIHNpc2ZiX3R2eHBvcywgc2lzZmJfdHZ5cG9zOyAgCS8qIFdhcm5pbmc6IFZhbHVlcyArIDMyICEgKi8KLQotCUNBUkQ4IHJlc2VydmVkWzIwOF07IAkJCS8qIGZvciBmdXR1cmUgdXNlICovCi19OwotI2VuZGlmCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy92c3RydWN0LmggYi9kcml2ZXJzL3ZpZGVvL3Npcy92c3RydWN0LmgKaW5kZXggZDRkNTVjOS4uOWFlMzI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvdnN0cnVjdC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3ZzdHJ1Y3QuaApAQCAtMyw3ICszLDcgQEAKIC8qCiAgKiBHZW5lcmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgdW5pdmVyc2FsIG1vZGUgc3dpdGNoaW5nIG1vZHVsZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYQogICoKICAqIElmIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhlIGZvbGxvd2luZyBsaWNlbnNlIHRlcm1zCiAgKiBhcHBseToKQEAgLTUwLDYyNyArNTAsNTE0IEBACiAgKgogICovCiAKLSNpZm5kZWYgX1ZTVFJVQ1RfCi0jZGVmaW5lIF9WU1RSVUNUXworI2lmbmRlZiBfVlNUUlVDVF9IXworI2RlZmluZSBfVlNUUlVDVF9IXwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QKLXsKLSAJVUNIQVIgdGltZXJbMl07Ci19IFNpU19QYW5lbERlbGF5VGJsU3RydWN0Oworc3RydWN0IFNpU19QYW5lbERlbGF5VGJsIHsKKyAJdW5zaWduZWQgY2hhciB0aW1lclsyXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfTENERGF0YVN0cnVjdAotewotCVVTSE9SVCBSVkJIQ01BWDsKLQlVU0hPUlQgUlZCSENGQUNUOwotCVVTSE9SVCBWR0FIVDsKLQlVU0hPUlQgVkdBVlQ7Ci0JVVNIT1JUIExDREhUOwotCVVTSE9SVCBMQ0RWVDsKLX0gU2lTX0xDRERhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0xDRERhdGEgeworCXVuc2lnbmVkIHNob3J0IFJWQkhDTUFYOworCXVuc2lnbmVkIHNob3J0IFJWQkhDRkFDVDsKKwl1bnNpZ25lZCBzaG9ydCBWR0FIVDsKKwl1bnNpZ25lZCBzaG9ydCBWR0FWVDsKKwl1bnNpZ25lZCBzaG9ydCBMQ0RIVDsKKwl1bnNpZ25lZCBzaG9ydCBMQ0RWVDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfVFZEYXRhU3RydWN0Ci17Ci0JVVNIT1JUIFJWQkhDTUFYOwotCVVTSE9SVCBSVkJIQ0ZBQ1Q7Ci0JVVNIT1JUIFZHQUhUOwotCVVTSE9SVCBWR0FWVDsKLQlVU0hPUlQgVFZIREU7Ci0JVVNIT1JUIFRWVkRFOwotCVVTSE9SVCBSVkJIUlM7Ci0JVUNIQVIgIEZsaWNrZXJNb2RlOwotCVVTSE9SVCBIQUxGUlZCSFJTOwotCVVDSEFSICBSWTFDT0U7Ci0JVUNIQVIgIFJZMkNPRTsKLQlVQ0hBUiAgUlkzQ09FOwotCVVDSEFSICBSWTRDT0U7Ci19IFNpU19UVkRhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX1RWRGF0YSB7CisJdW5zaWduZWQgc2hvcnQgUlZCSENNQVg7CisJdW5zaWduZWQgc2hvcnQgUlZCSENGQUNUOworCXVuc2lnbmVkIHNob3J0IFZHQUhUOworCXVuc2lnbmVkIHNob3J0IFZHQVZUOworCXVuc2lnbmVkIHNob3J0IFRWSERFOworCXVuc2lnbmVkIHNob3J0IFRWVkRFOworCXVuc2lnbmVkIHNob3J0IFJWQkhSUzsKKwl1bnNpZ25lZCBjaGFyICBGbGlja2VyTW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBIQUxGUlZCSFJTOworCXVuc2lnbmVkIHNob3J0IFJWQkhSUzI7CisJdW5zaWduZWQgY2hhciAgUlkxQ09FOworCXVuc2lnbmVkIGNoYXIgIFJZMkNPRTsKKwl1bnNpZ25lZCBjaGFyICBSWTNDT0U7CisJdW5zaWduZWQgY2hhciAgUlk0Q09FOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19MVkRTRGF0YVN0cnVjdAotewotCVVTSE9SVCBWR0FIVDsKLQlVU0hPUlQgVkdBVlQ7Ci0JVVNIT1JUIExDREhUOwotCVVTSE9SVCBMQ0RWVDsKLX0gU2lTX0xWRFNEYXRhU3RydWN0Oworc3RydWN0IFNpU19MVkRTRGF0YSB7CisJdW5zaWduZWQgc2hvcnQgVkdBSFQ7CisJdW5zaWduZWQgc2hvcnQgVkdBVlQ7CisJdW5zaWduZWQgc2hvcnQgTENESFQ7CisJdW5zaWduZWQgc2hvcnQgTENEVlQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX0xWRFNEZXNTdHJ1Y3QKLXsKLQlVU0hPUlQgTENESERFUzsKLQlVU0hPUlQgTENEVkRFUzsKLX0gU2lTX0xWRFNEZXNTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0xWRFNEZXMgeworCXVuc2lnbmVkIHNob3J0IExDREhERVM7CisJdW5zaWduZWQgc2hvcnQgTENEVkRFUzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfTFZEU0NSVDFEYXRhU3RydWN0Ci17Ci0JVUNIQVIgIENSWzE1XTsKLX0gU2lTX0xWRFNDUlQxRGF0YVN0cnVjdDsKK3N0cnVjdCBTaVNfTFZEU0NSVDFEYXRhIHsKKwl1bnNpZ25lZCBjaGFyICBDUlsxNV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX0xDREFDUlQxRGF0YVN0cnVjdAotewotCVVDSEFSICBDUlsxN107Ci19IFNpU19MQ0RBQ1JUMURhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhIHsKKwl1bnNpZ25lZCBjaGFyICBSZWdbMTZdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19DSFRWUmVnRGF0YVN0cnVjdAotewotCVVDSEFSICBSZWdbMTZdOwotfSBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX1N0IHsKKwl1bnNpZ25lZCBjaGFyICBTdF9Nb2RlSUQ7CisJdW5zaWduZWQgc2hvcnQgU3RfTW9kZUZsYWc7CisJdW5zaWduZWQgY2hhciAgU3RfU3RUYWJsZUluZGV4OworCXVuc2lnbmVkIGNoYXIgIFN0X0NSVDJDUlRDOworCXVuc2lnbmVkIGNoYXIgIFN0X1Jlc0luZm87CisJdW5zaWduZWQgY2hhciAgVkJfU3RUVkZsaWNrZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9TdFRWRWRnZUluZGV4OworCXVuc2lnbmVkIGNoYXIgIFZCX1N0VFZZRmlsdGVySW5kZXg7CisJdW5zaWduZWQgY2hhciAgU3RfUERDOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19TdFN0cnVjdAotewotCVVDSEFSICBTdF9Nb2RlSUQ7Ci0JVVNIT1JUIFN0X01vZGVGbGFnOwotCVVDSEFSICBTdF9TdFRhYmxlSW5kZXg7Ci0JVUNIQVIgIFN0X0NSVDJDUlRDOwotCVVDSEFSICBTdF9SZXNJbmZvOwotCVVDSEFSICBWQl9TdFRWRmxpY2tlckluZGV4OwotCVVDSEFSICBWQl9TdFRWRWRnZUluZGV4OwotCVVDSEFSICBWQl9TdFRWWUZpbHRlckluZGV4OwotCVVDSEFSICBTdF9QREM7Ci19IFNpU19TdFN0cnVjdDsKK3N0cnVjdCBTaVNfVkJNb2RlIHsKKwl1bnNpZ25lZCBjaGFyICBNb2RlSUQ7CisJdW5zaWduZWQgY2hhciAgVkJfVFZEZWxheUluZGV4OworCXVuc2lnbmVkIGNoYXIgIFZCX1RWRmxpY2tlckluZGV4OworCXVuc2lnbmVkIGNoYXIgIFZCX1RWUGhhc2VJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9UVllGaWx0ZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9MQ0REZWxheUluZGV4OworCXVuc2lnbmVkIGNoYXIgIF9WQl9MQ0RISW5kZXg7CisJdW5zaWduZWQgY2hhciAgX1ZCX0xDRFZJbmRleDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfVkJNb2RlU3RydWN0Ci17Ci0JVUNIQVIgIE1vZGVJRDsKLQlVQ0hBUiAgVkJfVFZEZWxheUluZGV4OwotCVVDSEFSICBWQl9UVkZsaWNrZXJJbmRleDsKLQlVQ0hBUiAgVkJfVFZQaGFzZUluZGV4OwotCVVDSEFSICBWQl9UVllGaWx0ZXJJbmRleDsKLQlVQ0hBUiAgVkJfTENERGVsYXlJbmRleDsKLQlVQ0hBUiAgX1ZCX0xDREhJbmRleDsKLQlVQ0hBUiAgX1ZCX0xDRFZJbmRleDsKLX0gU2lTX1ZCTW9kZVN0cnVjdDsKK3N0cnVjdCBTaVNfU3RhbmRUYWJsZV9TIHsKKwl1bnNpZ25lZCBjaGFyICBDUlRfQ09MUzsKKwl1bnNpZ25lZCBjaGFyICBST1dTOworCXVuc2lnbmVkIGNoYXIgIENIQVJfSEVJR0hUOworCXVuc2lnbmVkIHNob3J0IENSVF9MRU47CisJdW5zaWduZWQgY2hhciAgU1JbNF07CisJdW5zaWduZWQgY2hhciAgTUlTQzsKKwl1bnNpZ25lZCBjaGFyICBDUlRDWzB4MTldOworCXVuc2lnbmVkIGNoYXIgIEFUVFJbMHgxNF07CisJdW5zaWduZWQgY2hhciAgR1JDWzldOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19TdGFuZFRhYmxlU3RydWN0Ci17Ci0JVUNIQVIgIENSVF9DT0xTOwotCVVDSEFSICBST1dTOwotCVVDSEFSICBDSEFSX0hFSUdIVDsKLQlVU0hPUlQgQ1JUX0xFTjsKLQlVQ0hBUiAgU1JbNF07Ci0JVUNIQVIgIE1JU0M7Ci0JVUNIQVIgIENSVENbMHgxOV07Ci0JVUNIQVIgIEFUVFJbMHgxNF07Ci0JVUNIQVIgIEdSQ1s5XTsKLX0gU2lTX1N0YW5kVGFibGVTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX0V4dCB7CisJdW5zaWduZWQgY2hhciAgRXh0X01vZGVJRDsKKwl1bnNpZ25lZCBzaG9ydCBFeHRfTW9kZUZsYWc7CisJdW5zaWduZWQgc2hvcnQgRXh0X1ZFU0FJRDsKKwl1bnNpZ25lZCBjaGFyICBFeHRfUkVTSU5GTzsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVkZsaWNrZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVkVkZ2VJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVllGaWx0ZXJJbmRleDsKKwl1bnNpZ25lZCBjaGFyICBWQl9FeHRUVllGaWx0ZXJJbmRleFJPTTY2MTsKKwl1bnNpZ25lZCBjaGFyICBSRUZpbmRleDsKKwljaGFyICAgICAgICAgICBST01NT0RFSURYNjYxOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19FeHRTdHJ1Y3QKLXsKLQlVQ0hBUiAgRXh0X01vZGVJRDsKLQlVU0hPUlQgRXh0X01vZGVGbGFnOwotCVVTSE9SVCBFeHRfVkVTQUlEOwotCVVDSEFSICBFeHRfUkVTSU5GTzsKLQlVQ0hBUiAgVkJfRXh0VFZGbGlja2VySW5kZXg7Ci0JVUNIQVIgIFZCX0V4dFRWRWRnZUluZGV4OwotCVVDSEFSICBWQl9FeHRUVllGaWx0ZXJJbmRleDsKLQlVQ0hBUiAgVkJfRXh0VFZZRmlsdGVySW5kZXhST002NjE7Ci0JVUNIQVIgIFJFRmluZGV4OwotCUNIQVIgICBST01NT0RFSURYNjYxOwotfSBTaVNfRXh0U3RydWN0Oworc3RydWN0IFNpU19FeHQyIHsKKwl1bnNpZ25lZCBzaG9ydCBFeHRfSW5mb0ZsYWc7CisJdW5zaWduZWQgY2hhciAgRXh0X0NSVDFDUlRDOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlRWQ0xLOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlQyQ1JUQzsKKwl1bnNpZ25lZCBjaGFyICBFeHRfQ1JUMkNSVENfTlM7CisJdW5zaWduZWQgY2hhciAgTW9kZUlEOworCXVuc2lnbmVkIHNob3J0IFhSZXM7CisJdW5zaWduZWQgc2hvcnQgWVJlczsKKwl1bnNpZ25lZCBjaGFyICBFeHRfUERDOworCXVuc2lnbmVkIGNoYXIgIEV4dF9GYWtlQ1JUMkNSVEM7CisJdW5zaWduZWQgY2hhciAgRXh0X0Zha2VDUlQyQ2xrOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlQxQ1JUQ19OT1JNOworCXVuc2lnbmVkIGNoYXIgIEV4dF9DUlRWQ0xLX05PUk07CisJdW5zaWduZWQgY2hhciAgRXh0X0NSVDFDUlRDX1dJREU7CisJdW5zaWduZWQgY2hhciAgRXh0X0NSVFZDTEtfV0lERTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfRXh0MlN0cnVjdAotewotCVVTSE9SVCBFeHRfSW5mb0ZsYWc7Ci0JVUNIQVIgIEV4dF9DUlQxQ1JUQzsKLQlVQ0hBUiAgRXh0X0NSVFZDTEs7Ci0JVUNIQVIgIEV4dF9DUlQyQ1JUQzsKLQlVQ0hBUiAgRXh0X0NSVDJDUlRDX05TOwotCVVDSEFSICBNb2RlSUQ7Ci0JVVNIT1JUIFhSZXM7Ci0JVVNIT1JUIFlSZXM7Ci0JVUNIQVIgIEV4dF9QREM7Ci19IFNpU19FeHQyU3RydWN0Oworc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwgeworIAl1bnNpZ25lZCBjaGFyICBDUlsxMl07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1BhcnQyUG9ydFRibFN0cnVjdAotewotIAlVQ0hBUiAgQ1JbMTJdOwotfSBTaVNfUGFydDJQb3J0VGJsU3RydWN0Oworc3RydWN0IFNpU19DUlQxVGFibGUgeworCXVuc2lnbmVkIGNoYXIgIENSWzE3XTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfQ1JUMVRhYmxlU3RydWN0Ci17Ci0JVUNIQVIgIENSWzE3XTsKLX0gU2lTX0NSVDFUYWJsZVN0cnVjdDsKK3N0cnVjdCBTaVNfTUNMS0RhdGEgeworCXVuc2lnbmVkIGNoYXIgIFNSMjgsU1IyOSxTUjJBOworCXVuc2lnbmVkIHNob3J0IENMT0NLOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19NQ0xLRGF0YVN0cnVjdAotewotCVVDSEFSICBTUjI4LFNSMjksU1IyQTsKLQlVU0hPUlQgQ0xPQ0s7Ci19IFNpU19NQ0xLRGF0YVN0cnVjdDsKK3N0cnVjdCBTaVNfVkNMS0RhdGEgeworCXVuc2lnbmVkIGNoYXIgIFNSMkIsU1IyQzsKKwl1bnNpZ25lZCBzaG9ydCBDTE9DSzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TaVNfVkNMS0RhdGFTdHJ1Y3QKLXsKLQlVQ0hBUiAgU1IyQixTUjJDOwotCVVTSE9SVCBDTE9DSzsKLX0gU2lTX1ZDTEtEYXRhU3RydWN0Oworc3RydWN0IFNpU19WQlZDTEtEYXRhIHsKKwl1bnNpZ25lZCBjaGFyICBQYXJ0NF9BLFBhcnQ0X0I7CisJdW5zaWduZWQgc2hvcnQgQ0xPQ0s7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1ZCVkNMS0RhdGFTdHJ1Y3QKLXsKLQlVQ0hBUiAgUGFydDRfQSxQYXJ0NF9COwotCVVTSE9SVCBDTE9DSzsKLX0gU2lTX1ZCVkNMS0RhdGFTdHJ1Y3Q7CitzdHJ1Y3QgU2lTX1N0UmVzSW5mb19TIHsKKwl1bnNpZ25lZCBzaG9ydCBIVG90YWw7CisJdW5zaWduZWQgc2hvcnQgVlRvdGFsOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NpU19TdFJlc0luZm9TdHJ1Y3QKLXsKLQlVU0hPUlQgSFRvdGFsOwotCVVTSE9SVCBWVG90YWw7Ci19IFNpU19TdFJlc0luZm9TdHJ1Y3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9TaVNfTW9kZVJlc0luZm9TdHJ1Y3QKLXsKLQlVU0hPUlQgSFRvdGFsOwotCVVTSE9SVCBWVG90YWw7Ci0JVUNIQVIgIFhDaGFyOwotCVVDSEFSICBZQ2hhcjsKLX0gU2lTX01vZGVSZXNJbmZvU3RydWN0OwotCi0KLQotdHlwZWRlZiBVQ0hBUiBEUkFNNFR5cGVbNF07CitzdHJ1Y3QgU2lTX01vZGVSZXNJbmZvX1MgeworCXVuc2lnbmVkIHNob3J0IEhUb3RhbDsKKwl1bnNpZ25lZCBzaG9ydCBWVG90YWw7CisJdW5zaWduZWQgY2hhciAgWENoYXI7CisJdW5zaWduZWQgY2hhciAgWUNoYXI7Cit9OwogCiAvKiBEZWZpbmVzIGZvciBTaVNfQ3VzdG9tVCAqLwogLyogTmV2ZXIgY2hhbmdlIHRoZXNlIGZvciBzaXNmYiBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIENVVF9OT05FICAgICAgICAgIDAKLSNkZWZpbmUgQ1VUX0ZPUkNFTk9ORSAgICAgMQotI2RlZmluZSBDVVRfQkFSQ08xMzY2ICAgICAyCi0jZGVmaW5lIENVVF9CQVJDTzEwMjQgICAgIDMKLSNkZWZpbmUgQ1VUX0NPTVBBUTEyODAgICAgNAotI2RlZmluZSBDVVRfQ09NUEFRMTI4MDIgICA1Ci0jZGVmaW5lIENVVF9QQU5FTDg0OCAgICAgIDYKLSNkZWZpbmUgQ1VUX0NMRVZPMTAyNCAgICAgNwotI2RlZmluZSBDVVRfQ0xFVk8xMDI0MiAgICA4Ci0jZGVmaW5lIENVVF9DTEVWTzE0MDAgICAgIDkKLSNkZWZpbmUgQ1VUX0NMRVZPMTQwMDIgICAgMTAKLSNkZWZpbmUgQ1VUX1VOSVdJTEwxMDI0ICAgMTEKLSNkZWZpbmUgQ1VUX0FTVVNMMzAwMEQgICAgMTIKLSNkZWZpbmUgQ1VUX1VOSVdJTEwxMDI0MiAgMTMKLSNkZWZpbmUgQ1VUX0FDRVIxMjgwICAgICAgMTQKLSNkZWZpbmUgQ1VUX0NPTVBBTDE0MDBfMSAgMTUKLSNkZWZpbmUgQ1VUX0NPTVBBTDE0MDBfMiAgMTYKLSNkZWZpbmUgQ1VUX0FTVVNBMkhfMSAgICAgMTcKLSNkZWZpbmUgQ1VUX0FTVVNBMkhfMiAgICAgMTgKKyNkZWZpbmUgQ1VUX05PTkUJCSAwCisjZGVmaW5lIENVVF9GT1JDRU5PTkUJCSAxCisjZGVmaW5lIENVVF9CQVJDTzEzNjYJCSAyCisjZGVmaW5lIENVVF9CQVJDTzEwMjQJCSAzCisjZGVmaW5lIENVVF9DT01QQVExMjgwCQkgNAorI2RlZmluZSBDVVRfQ09NUEFRMTI4MDIJCSA1CisjZGVmaW5lIENVVF9QQU5FTDg0OAkJIDYKKyNkZWZpbmUgQ1VUX0NMRVZPMTAyNAkJIDcKKyNkZWZpbmUgQ1VUX0NMRVZPMTAyNDIJCSA4CisjZGVmaW5lIENVVF9DTEVWTzE0MDAJCSA5CisjZGVmaW5lIENVVF9DTEVWTzE0MDAyCQkxMAorI2RlZmluZSBDVVRfVU5JV0lMTDEwMjQJCTExCisjZGVmaW5lIENVVF9BU1VTTDMwMDBECQkxMgorI2RlZmluZSBDVVRfVU5JV0lMTDEwMjQyCTEzCisjZGVmaW5lIENVVF9BQ0VSMTI4MAkJMTQKKyNkZWZpbmUgQ1VUX0NPTVBBTDE0MDBfMQkxNQorI2RlZmluZSBDVVRfQ09NUEFMMTQwMF8yCTE2CisjZGVmaW5lIENVVF9BU1VTQTJIXzEJCTE3CisjZGVmaW5lIENVVF9BU1VTQTJIXzIJCTE4CisjZGVmaW5lIENVVF9VTktOT1dOTENECQkxOQorI2RlZmluZSBDVVRfQU9QODA2MAkJMjAKKyNkZWZpbmUgQ1VUX1BBTkVMODU2CQkyMQogCi10eXBlZGVmIHN0cnVjdCBfU2lTX1ByaXZhdGUKK3N0cnVjdCBTaVNfUHJpdmF0ZQogewotI2lmZGVmIExJTlVYX0tFUk5FTAotICAgICAgICBTSVNJT0FERFJFU1MgUmVsSU87CisJdW5zaWduZWQgY2hhcgkJCUNoaXBUeXBlOworCXVuc2lnbmVkIGNoYXIJCQlDaGlwUmV2aXNpb247CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorCVBDSVRBRwkJCQlQY2lUYWc7CiAjZW5kaWYKLQlTSVNJT0FERFJFU1MgU2lTX1AzYzQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2Q0OwotCVNJU0lPQUREUkVTUyBTaVNfUDNjMDsKLQlTSVNJT0FERFJFU1MgU2lTX1AzY2U7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2MyOwotCVNJU0lPQUREUkVTUyBTaVNfUDNjYTsKLQlTSVNJT0FERFJFU1MgU2lTX1AzYzY7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2M3OwotCVNJU0lPQUREUkVTUyBTaVNfUDNjODsKLQlTSVNJT0FERFJFU1MgU2lTX1AzYzk7Ci0JU0lTSU9BRERSRVNTIFNpU19QM2NiOwotCVNJU0lPQUREUkVTUyBTaVNfUDNjZDsKLQlTSVNJT0FERFJFU1MgU2lTX1AzZGE7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0MVBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0MlBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0M1BvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0NFBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19QYXJ0NVBvcnQ7Ci0JU0lTSU9BRERSRVNTIFNpU19WaWRDYXB0OwotCVNJU0lPQUREUkVTUyBTaVNfVmlkUGxheTsKLQlVU0hPUlQgU2lTX0lGX0RFRl9MVkRTOwotCVVTSE9SVCBTaVNfSUZfREVGX0NINzB4eDsKLQlVU0hPUlQgU2lTX0lGX0RFRl9DT05FWDsKLQlVU0hPUlQgU2lTX0lGX0RFRl9UUlVNUElPTjsKLQlVU0hPUlQgU2lTX0lGX0RFRl9EU1ROOwotCVVTSE9SVCBTaVNfSUZfREVGX0ZTVE47Ci0JVVNIT1JUIFNpU19TeXNGbGFnczsKLQlVQ0hBUiAgU2lTX1ZHQUlORk87Ci0jaWZkZWYgTElOVVhfWEY4NgotICAgICAgICBVU0hPUlQgU2lTX0NQMSwgU2lTX0NQMiwgU2lTX0NQMywgU2lTX0NQNDsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisJdm9pZAkJCQkqaXZpZGVvOwogI2VuZGlmCi0JQk9PTEVBTiBTaVNfVXNlUk9NOwotCUJPT0xFQU4gU2lTX1JPTU5ldzsKLQlCT09MRUFOIFNpU19OZWVkUm9tTW9kZURhdGE7Ci0JQk9PTEVBTiBQYW5lbFNlbGZEZXRlY3RlZDsKLQlpbnQgICAgIFNpU19DSE92ZXJTY2FuOwotCUJPT0xFQU4gU2lTX0NIU092ZXJTY2FuOwotCUJPT0xFQU4gU2lTX0NoU1c7Ci0JQk9PTEVBTiBTaVNfVXNlTENEQTsKLQlpbnQgICAgIFNpU19Vc2VPRU07Ci0JVUxPTkcgICBTaVNfQ3VzdG9tVDsKLQlVU0hPUlQgIFNpU19CYWNrdXA3MHh4OwotCUJPT0xFQU4gSGF2ZUVNSTsKLQlCT09MRUFOIEhhdmVFTUlMQ0Q7Ci0JQk9PTEVBTiBPdmVycnVsZUVNSTsKLQlVQ0hBUiAgRU1JXzMwLEVNSV8zMSxFTUlfMzIsRU1JXzMzOwotCVVTSE9SVCBTaVNfRU1JT2Zmc2V0OwotCVNIT1JUICBQREMsIFBEQ0E7Ci0JVUNIQVIgIFNpU19NeUNSNjM7Ci0JVVNIT1JUIFNpU19DUlQxTW9kZTsKLQlVU0hPUlQgU2lTX2ZsYWdfY2xlYXJidWZmZXI7Ci0JaW50ICAgIFNpU19SQU1UeXBlOwotCVVDSEFSICBTaVNfQ2hhbm5lbEFCOwotCVVDSEFSICBTaVNfRGF0YUJ1c1dpZHRoOwotCVVTSE9SVCBTaVNfTW9kZVR5cGU7Ci0JVVNIT1JUIFNpU19WQkluZm87Ci0JVVNIT1JUIFNpU19UVk1vZGU7Ci0JVVNIT1JUIFNpU19MQ0RSZXNJbmZvOwotCVVTSE9SVCBTaVNfTENEVHlwZUluZm87Ci0JVVNIT1JUIFNpU19MQ0RJbmZvOwotCVVTSE9SVCBTaVNfTENESW5mbzY2MTsKLQlVU0hPUlQgU2lTX1ZCVHlwZTsKLQlVU0hPUlQgU2lTX1ZCRXh0SW5mbzsKLQlVU0hPUlQgU2lTX1lQYlByOwotCVVTSE9SVCBTaVNfU2VsZWN0Q1JUMlJhdGU7Ci0JVVNIT1JUIFNpU19TZXRGbGFnOwotCVVTSE9SVCBTaVNfUlZCSENGQUNUOwotCVVTSE9SVCBTaVNfUlZCSENNQVg7Ci0JVVNIT1JUIFNpU19SVkJIUlM7Ci0JVVNIT1JUIFNpU19WR0FWVDsKLQlVU0hPUlQgU2lTX1ZHQUhUOwotCVVTSE9SVCBTaVNfVlQ7Ci0JVVNIT1JUIFNpU19IVDsKLQlVU0hPUlQgU2lTX1ZHQVZERTsKLQlVU0hPUlQgU2lTX1ZHQUhERTsKLQlVU0hPUlQgU2lTX1ZERTsKLQlVU0hPUlQgU2lTX0hERTsKLQlVU0hPUlQgU2lTX05ld0ZsaWNrZXJNb2RlOwotCVVTSE9SVCBTaVNfUlkxQ09FOwotCVVTSE9SVCBTaVNfUlkyQ09FOwotCVVTSE9SVCBTaVNfUlkzQ09FOwotCVVTSE9SVCBTaVNfUlk0Q09FOwotCVVTSE9SVCBTaVNfTENESERFUzsKLQlVU0hPUlQgU2lTX0xDRFZERVM7Ci0JVVNIT1JUIFNpU19ERENfUG9ydDsKLQlVU0hPUlQgU2lTX0REQ19JbmRleDsKLQlVU0hPUlQgU2lTX0REQ19EYXRhOwotCVVTSE9SVCBTaVNfRERDX05EYXRhOwotCVVTSE9SVCBTaVNfRERDX0NsazsKLQlVU0hPUlQgU2lTX0REQ19OQ2xrOwotCVVTSE9SVCBTaVNfRERDX0RldmljZUFkZHI7Ci0JVVNIT1JUIFNpU19ERENfUmVhZEFkZHI7Ci0JVVNIT1JUIFNpU19ERENfU2VjQWRkcjsKLQlVU0hPUlQgU2lTX0Nocm9udGVsSW5pdDsKLQlCT09MRUFOIFNpU19TZW5zaWJsZVNSMTE7Ci0JVVNIT1JUIFNpUzY2MUxDRDJUYWJsZVNpemU7Ci0KLQlVU0hPUlQgU2lTX1BhbmVsTWluTFZEUzsKLQlVU0hPUlQgU2lTX1BhbmVsTWluMzAxOwotCi0JY29uc3QgU2lTX1N0U3RydWN0ICAgICAgICAgICpTaVNfU01vZGVJRFRhYmxlOwotCWNvbnN0IFNpU19TdGFuZFRhYmxlU3RydWN0ICAqU2lTX1N0YW5kVGFibGU7Ci0JY29uc3QgU2lTX0V4dFN0cnVjdCAgICAgICAgICpTaVNfRU1vZGVJRFRhYmxlOwotCWNvbnN0IFNpU19FeHQyU3RydWN0ICAgICAgICAqU2lTX1JlZkluZGV4OwotCWNvbnN0IFNpU19WQk1vZGVTdHJ1Y3QgICAgICAqU2lTX1ZCTW9kZUlEVGFibGU7Ci0JY29uc3QgU2lTX0NSVDFUYWJsZVN0cnVjdCAgICpTaVNfQ1JUMVRhYmxlOwotCWNvbnN0IFNpU19NQ0xLRGF0YVN0cnVjdCAgICAqU2lTX01DTEtEYXRhXzA7Ci0JY29uc3QgU2lTX01DTEtEYXRhU3RydWN0ICAgICpTaVNfTUNMS0RhdGFfMTsKLQlTaVNfVkNMS0RhdGFTdHJ1Y3QgICAgCSAgICAqU2lTX1ZDTEtEYXRhOwotCVNpU19WQlZDTEtEYXRhU3RydWN0ICAgICAgICAqU2lTX1ZCVkNMS0RhdGE7Ci0JY29uc3QgU2lTX1N0UmVzSW5mb1N0cnVjdCAgICpTaVNfU3RSZXNJbmZvOwotCWNvbnN0IFNpU19Nb2RlUmVzSW5mb1N0cnVjdCAqU2lTX01vZGVSZXNJbmZvOwotCi0JY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgICpwU2lTX091dHB1dFNlbGVjdDsKLQljb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgKnBTaVNfU29mdFNldHRpbmc7Ci0KLQljb25zdCBEUkFNNFR5cGUgKlNpU19TUjE1OyAvKiBwb2ludGVyIDogcG9pbnQgdG8gYXJyYXkgKi8KLSNpZmRlZiBMSU5VWF9LRVJORUwKLQlVQ0hBUiAqcFNpU19TUjA3OwotCWNvbnN0IERSQU00VHlwZSAqU2lTX0NSNDA7IC8qIHBvaW50ZXIgOiBwb2ludCB0byBhcnJheSAqLwotCVVDSEFSICpTaVNfQ1I0OTsKLQlVQ0hBUiAqU2lTX1NSMjU7Ci0JVUNIQVIgKnBTaVNfU1IxRjsKLQlVQ0hBUiAqcFNpU19TUjIxOwotCVVDSEFSICpwU2lTX1NSMjI7Ci0JVUNIQVIgKnBTaVNfU1IyMzsKLQlVQ0hBUiAqcFNpU19TUjI0OwotCVVDSEFSICpwU2lTX1NSMzE7Ci0JVUNIQVIgKnBTaVNfU1IzMjsKLQlVQ0hBUiAqcFNpU19TUjMzOwotCVVDSEFSICpwU2lTX0NSVDJEYXRhXzFfMjsKLQlVQ0hBUiAqcFNpU19DUlQyRGF0YV80X0Q7Ci0JVUNIQVIgKnBTaVNfQ1JUMkRhdGFfNF9FOwotCVVDSEFSICpwU2lTX0NSVDJEYXRhXzRfMTA7Ci0JY29uc3QgVVNIT1JUICpwU2lTX1JHQlNlbnNlRGF0YTsKLQljb25zdCBVU0hPUlQgKnBTaVNfVmlkZW9TZW5zZURhdGE7Ci0JY29uc3QgVVNIT1JUICpwU2lTX1lDU2Vuc2VEYXRhOwotCWNvbnN0IFVTSE9SVCAqcFNpU19SR0JTZW5zZURhdGEyOwotCWNvbnN0IFVTSE9SVCAqcFNpU19WaWRlb1NlbnNlRGF0YTI7Ci0JY29uc3QgVVNIT1JUICpwU2lTX1lDU2Vuc2VEYXRhMjsKKwl1bnNpZ25lZCBjaGFyIAkJCSpWaXJ0dWFsUm9tQmFzZTsKKwlCT09MRUFOCQkJCVVzZVJPTTsKKyNpZmRlZiBTSVNfTElOVVhfS0VSTkVMCisJdW5zaWduZWQgY2hhciBTSVNJT01FTVRZUEUJKlZpZGVvTWVtb3J5QWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJCQlWaWRlb01lbW9yeVNpemU7CiAjZW5kaWYKKwlTSVNJT0FERFJFU1MJCQlJT0FkZHJlc3M7CisJU0lTSU9BRERSRVNTCQkJSU9BZGRyZXNzMjsgIC8qIEZvciBkdWFsIGNoaXAgWEdJIHZvbGFyaSAqLwogCi0JY29uc3QgU2lTX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgKlNpU19QYW5lbERlbGF5VGJsOwotCWNvbnN0IFNpU19QYW5lbERlbGF5VGJsU3RydWN0ICpTaVNfUGFuZWxEZWxheVRibExWRFM7CisjaWZkZWYgU0lTX0xJTlVYX0tFUk5FTAorCVNJU0lPQUREUkVTUwkJCVJlbElPOworI2VuZGlmCisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzQ7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzZDQ7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzA7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2U7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzI7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2E7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzY7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzc7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzg7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzYzk7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2I7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2M7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzY2Q7CisJU0lTSU9BRERSRVNTCQkJU2lTX1AzZGE7CisJU0lTSU9BRERSRVNTCQkJU2lTX1BhcnQxUG9ydDsKKwlTSVNJT0FERFJFU1MJCQlTaVNfUGFydDJQb3J0OworCVNJU0lPQUREUkVTUwkJCVNpU19QYXJ0M1BvcnQ7CisJU0lTSU9BRERSRVNTCQkJU2lTX1BhcnQ0UG9ydDsKKwlTSVNJT0FERFJFU1MJCQlTaVNfUGFydDVQb3J0OworCVNJU0lPQUREUkVTUwkJCVNpU19WaWRDYXB0OworCVNJU0lPQUREUkVTUwkJCVNpU19WaWRQbGF5OworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0lGX0RFRl9MVkRTOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0lGX0RFRl9DSDcweHg7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfSUZfREVGX0NPTkVYOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0lGX0RFRl9UUlVNUElPTjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19JRl9ERUZfRFNUTjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19JRl9ERUZfRlNUTjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19TeXNGbGFnczsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX1ZHQUlORk87CisjaWZkZWYgU0lTX1hPUkdfWEY4NgorCXVuc2lnbmVkIHNob3J0CQkJU2lTX0NQMSwgU2lTX0NQMiwgU2lTX0NQMywgU2lTX0NQNDsKKyNlbmRpZgorCUJPT0xFQU4JCQkJU2lTX1VzZVJPTTsKKwlCT09MRUFOCQkJCVNpU19ST01OZXc7CisJQk9PTEVBTgkJCQlTaVNfWEdJUk9NOworCUJPT0xFQU4JCQkJU2lTX05lZWRSb21Nb2RlRGF0YTsKKwlCT09MRUFOCQkJCVBhbmVsU2VsZkRldGVjdGVkOworCUJPT0xFQU4JCQkJRERDUG9ydE1peHVwOworCWludAkJCQlTaVNfQ0hPdmVyU2NhbjsKKwlCT09MRUFOCQkJCVNpU19DSFNPdmVyU2NhbjsKKwlCT09MRUFOCQkJCVNpU19DaFNXOworCUJPT0xFQU4JCQkJU2lTX1VzZUxDREE7CisJaW50CQkJCVNpU19Vc2VPRU07CisJdW5zaWduZWQgaW50CQkJU2lTX0N1c3RvbVQ7CisJaW50CQkJCVNpU19Vc2VXaWRlLCBTaVNfVXNlV2lkZUNSVDI7CisJaW50CQkJCVNpU19UVkJsdWU7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfQmFja3VwNzB4eDsKKwlCT09MRUFOCQkJCUhhdmVFTUk7CisJQk9PTEVBTgkJCQlIYXZlRU1JTENEOworCUJPT0xFQU4JCQkJT3ZlcnJ1bGVFTUk7CisJdW5zaWduZWQgY2hhcgkJCUVNSV8zMCxFTUlfMzEsRU1JXzMyLEVNSV8zMzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19FTUlPZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUFdET2Zmc2V0OworCXNob3J0CQkJCVBEQywgUERDQTsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX015Q1I2MzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19DUlQxTW9kZTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19mbGFnX2NsZWFyYnVmZmVyOworCWludAkJCQlTaVNfUkFNVHlwZTsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX0NoYW5uZWxBQjsKKwl1bnNpZ25lZCBjaGFyCQkJU2lTX0RhdGFCdXNXaWR0aDsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19Nb2RlVHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19WQkluZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVFZNb2RlOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0xDRFJlc0luZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfTENEVHlwZUluZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfTENESW5mbzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19MQ0RJbmZvNjYxOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1ZCVHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19WQkV4dEluZm87CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfWVBiUHI7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfU2VsZWN0Q1JUMlJhdGU7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfU2V0RmxhZzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19SVkJIQ0ZBQ1Q7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUlZCSENNQVg7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUlZCSFJTOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1JWQkhSUzI7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVkdBVlQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVkdBSFQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVlQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfSFQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfVkdBVkRFOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1ZHQUhERTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19WREU7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfSERFOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX05ld0ZsaWNrZXJNb2RlOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1JZMUNPRTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19SWTJDT0U7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfUlkzQ09FOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1JZNENPRTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19MQ0RIREVTOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0xDRFZERVM7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfRERDX1BvcnQ7CisJdW5zaWduZWQgc2hvcnQJCQlTaVNfRERDX0luZGV4OworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19EYXRhOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19ORGF0YTsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19ERENfQ2xrOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19OQ2xrOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19EZXZpY2VBZGRyOworCXVuc2lnbmVkIHNob3J0CQkJU2lTX0REQ19SZWFkQWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19ERENfU2VjQWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19DaHJvbnRlbEluaXQ7CisJQk9PTEVBTgkJCQlTaVNfU2Vuc2libGVTUjExOworCXVuc2lnbmVkIHNob3J0CQkJU2lTNjYxTENEMlRhYmxlU2l6ZTsKKworCXVuc2lnbmVkIHNob3J0CQkJU2lTX1BhbmVsTWluTFZEUzsKKwl1bnNpZ25lZCBzaG9ydAkJCVNpU19QYW5lbE1pbjMwMTsKKworCWNvbnN0IHN0cnVjdCBTaVNfU3QJCSpTaVNfU01vZGVJRFRhYmxlOworCWNvbnN0IHN0cnVjdCBTaVNfU3RhbmRUYWJsZV9TCSpTaVNfU3RhbmRUYWJsZTsKKwljb25zdCBzdHJ1Y3QgU2lTX0V4dAkJKlNpU19FTW9kZUlEVGFibGU7CisJY29uc3Qgc3RydWN0IFNpU19FeHQyCQkqU2lTX1JlZkluZGV4OworCWNvbnN0IHN0cnVjdCBTaVNfVkJNb2RlCQkqU2lTX1ZCTW9kZUlEVGFibGU7CisJY29uc3Qgc3RydWN0IFNpU19DUlQxVGFibGUJKlNpU19DUlQxVGFibGU7CisJY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YQkqU2lTX01DTEtEYXRhXzA7CisJY29uc3Qgc3RydWN0IFNpU19NQ0xLRGF0YQkqU2lTX01DTEtEYXRhXzE7CisJc3RydWN0IFNpU19WQ0xLRGF0YQkJKlNpU19WQ0xLRGF0YTsKKwlzdHJ1Y3QgU2lTX1ZCVkNMS0RhdGEJCSpTaVNfVkJWQ0xLRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1N0UmVzSW5mb19TCSpTaVNfU3RSZXNJbmZvOworCWNvbnN0IHN0cnVjdCBTaVNfTW9kZVJlc0luZm9fUwkqU2lTX01vZGVSZXNJbmZvOworCisJY29uc3QgdW5zaWduZWQgY2hhcgkJKnBTaVNfT3V0cHV0U2VsZWN0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpwU2lTX1NvZnRTZXR0aW5nOworCisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19TUjE1OworCisJY29uc3Qgc3RydWN0IFNpU19QYW5lbERlbGF5VGJsCSpTaVNfUGFuZWxEZWxheVRibDsKKwljb25zdCBzdHJ1Y3QgU2lTX1BhbmVsRGVsYXlUYmwJKlNpU19QYW5lbERlbGF5VGJsTFZEUzsKIAogCS8qIFNpUyBicmlkZ2UgKi8KIAotCWNvbnN0IFVDSEFSICpTaVNfTlRTQ1BoYXNlOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMUGhhc2U7Ci0JY29uc3QgVUNIQVIgKlNpU19OVFNDUGhhc2UyOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMUGhhc2UyOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMTVBoYXNlOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMTlBoYXNlOwotCWNvbnN0IFVDSEFSICpTaVNfUEFMTVBoYXNlMjsKLQljb25zdCBVQ0hBUiAqU2lTX1BBTE5QaGFzZTI7Ci0JY29uc3QgVUNIQVIgKlNpU19TcGVjaWFsUGhhc2U7Ci0JY29uc3QgVUNIQVIgKlNpU19TcGVjaWFsUGhhc2VNOwotCWNvbnN0IFVDSEFSICpTaVNfU3BlY2lhbFBoYXNlSjsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19FeHRMQ0QxMDI0eDc2OERhdGE7Ci0JY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgICpTaVNfU3QyTENEMTAyNHg3NjhEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0xDRDEyODB4NzIwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19TdExDRDEyODB4NzY4XzJEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0V4dExDRDEyODB4NzY4XzJEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0xDRDEyODB4ODAwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19MQ0QxMjgweDgwMF8yRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19MQ0QxMjgweDk2MERhdGE7Ci0JY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgICpTaVNfRXh0TENEMTI4MHgxMDI0RGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19TdDJMQ0QxMjgweDEwMjREYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX1N0TENEMTQwMHgxMDUwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX1N0TENEMTYwMHgxMjAwRGF0YTsKLQljb25zdCBTaVNfTENERGF0YVN0cnVjdCAgKlNpU19FeHRMQ0QxNjAweDEyMDBEYXRhOwotCWNvbnN0IFNpU19MQ0REYXRhU3RydWN0ICAqU2lTX0xDRDE2ODB4MTA1MERhdGE7Ci0JY29uc3QgU2lTX0xDRERhdGFTdHJ1Y3QgICpTaVNfTm9TY2FsZURhdGE7Ci0JY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgICpTaVNfU3RQQUxEYXRhOwotCWNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgICAqU2lTX0V4dFBBTERhdGE7Ci0JY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgICpTaVNfU3ROVFNDRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHROVFNDRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19TdDFIaVRWRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19TdDJIaVRWRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHRIaVRWRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19TdDUyNWlEYXRhOwotCWNvbnN0IFNpU19UVkRhdGFTdHJ1Y3QgICAqU2lTX1N0NTI1cERhdGE7Ci0JY29uc3QgU2lTX1RWRGF0YVN0cnVjdCAgICpTaVNfU3Q3NTBwRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHQ1MjVpRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHQ1MjVwRGF0YTsKLQljb25zdCBTaVNfVFZEYXRhU3RydWN0ICAgKlNpU19FeHQ3NTBwRGF0YTsKLQljb25zdCBVQ0hBUiAqU2lTX05UU0NUaW1pbmc7Ci0JY29uc3QgVUNIQVIgKlNpU19QQUxUaW1pbmc7Ci0JY29uc3QgVUNIQVIgKlNpU19IaVRWRXh0VGltaW5nOwotCWNvbnN0IFVDSEFSICpTaVNfSGlUVlN0MVRpbWluZzsKLQljb25zdCBVQ0hBUiAqU2lTX0hpVFZTdDJUaW1pbmc7Ci0JY29uc3QgVUNIQVIgKlNpU19IaVRWR3JvdXAzRGF0YTsKLQljb25zdCBVQ0hBUiAqU2lTX0hpVFZHcm91cDNTaW11OworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0V4dExDRDEwMjR4NzY4RGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19TdDJMQ0QxMDI0eDc2OERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfTENEMTI4MHg3MjBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX1N0TENEMTI4MHg3NjhfMkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfRXh0TENEMTI4MHg3NjhfMkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfTENEMTI4MHg4MDBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0xDRDEyODB4ODAwXzJEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0xDRDEyODB4ODU0RGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19MQ0QxMjgweDk2MERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfRXh0TENEMTI4MHgxMDI0RGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19TdDJMQ0QxMjgweDEwMjREYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX1N0TENEMTQwMHgxMDUwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19FeHRMQ0QxNDAweDEwNTBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX1N0TENEMTYwMHgxMjAwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xDRERhdGEJKlNpU19FeHRMQ0QxNjAweDEyMDBEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTENERGF0YQkqU2lTX0xDRDE2ODB4MTA1MERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MQ0REYXRhCSpTaVNfTm9TY2FsZURhdGE7CisJY29uc3Qgc3RydWN0IFNpU19UVkRhdGEJCSpTaVNfU3RQQUxEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhCQkqU2lTX0V4dFBBTERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19UVkRhdGEJCSpTaVNfU3ROVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHROVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19TdDFIaVRWRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19TdDJIaVRWRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHRIaVRWRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19TdDUyNWlEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfVFZEYXRhCQkqU2lTX1N0NTI1cERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19UVkRhdGEJCSpTaVNfU3Q3NTBwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHQ1MjVpRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHQ1MjVwRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX1RWRGF0YQkJKlNpU19FeHQ3NTBwRGF0YTsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX05UU0NUaW1pbmc7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19QQUxUaW1pbmc7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19IaVRWRXh0VGltaW5nOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpTaVNfSGlUVlN0MVRpbWluZzsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0hpVFZTdDJUaW1pbmc7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19IaVRWR3JvdXAzRGF0YTsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0hpVFZHcm91cDNTaW11OwogI2lmIDAKLQljb25zdCBVQ0hBUiAqU2lTX0hpVFZUZXh0VGltaW5nOwotCWNvbnN0IFVDSEFSICpTaVNfSGlUVkdyb3VwM1RleHQ7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19IaVRWVGV4dFRpbWluZzsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0hpVFZHcm91cDNUZXh0OwogI2VuZGlmCiAKLQljb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0ICpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzE7Ci0JY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqU2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMTsKLQljb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0ICpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzI7Ci0JY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqU2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMjsKLQljb25zdCBTaVNfUGFydDJQb3J0VGJsU3RydWN0ICpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzM7Ci0JY29uc3QgU2lTX1BhcnQyUG9ydFRibFN0cnVjdCAqU2lTX0NSVDJQYXJ0Ml8xMjgweDEwMjRfMzsKKwljb25zdCBzdHJ1Y3QgU2lTX1BhcnQyUG9ydFRibAkqU2lTX0NSVDJQYXJ0Ml8xMDI0eDc2OF8xOworCWNvbnN0IHN0cnVjdCBTaVNfUGFydDJQb3J0VGJsCSpTaVNfQ1JUMlBhcnQyXzEwMjR4NzY4XzI7CisJY29uc3Qgc3RydWN0IFNpU19QYXJ0MlBvcnRUYmwJKlNpU19DUlQyUGFydDJfMTAyNHg3NjhfMzsKIAogCS8qIExWRFMsIENocm9udGVsICovCiAKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzgwMHg2MDBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFM4MDB4NjAwRGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTAyNHg3NjhEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxMDI0eDc2OERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4MTAyNERhdGFfMTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4MTAyNERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4OTYwRGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTI4MHg5NjBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNDAweDEwNTBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNDAweDEwNTBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNjAweDEyMDBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxNjAweDEyMDBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxMjgweDc2OERhdGFfMTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzEyODB4NzY4RGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTAyNHg2MDBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFMxMDI0eDYwMERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzExNTJ4NzY4RGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTMTE1Mng3NjhEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFM2NDB4NDgwRGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTNjQweDQ4MERhdGFfMjsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzMyMHg0ODBEYXRhXzE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0xWRFNYWFh4WFhYRGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMzY2RGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMzY2RGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMDI0RGF0YV8xOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTQkFSQ08xMDI0RGF0YV8yOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19MVkRTODQ4eDQ4MERhdGFfMTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfTFZEUzg0OHg0ODBEYXRhXzI7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0NIVFZVTlRTQ0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0NIVFZPTlRTQ0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEYXRhU3RydWN0ICAqU2lTX0NIVFZVUEFMRGF0YTsKLQljb25zdCBTaVNfTFZEU0RhdGFTdHJ1Y3QgICpTaVNfQ0hUVk9QQUxEYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWVVBBTE1EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWT1BBTE1EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWVVBBTE5EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWT1BBTE5EYXRhOwotCWNvbnN0IFNpU19MVkRTRGF0YVN0cnVjdCAgKlNpU19DSFRWU09QQUxEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTMzIweDI0MERhdGFfMTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfTFZEUzMyMHgyNDBEYXRhXzI7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFM2NDB4NDgwRGF0YV8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTODAweDYwMERhdGFfMTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfTFZEUzEwMjR4NjAwRGF0YV8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTMTAyNHg3NjhEYXRhXzE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFNCQVJDTzEzNjZEYXRhXzI7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFNCQVJDTzEwMjREYXRhXzE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0xWRFM4NDh4NDgwRGF0YV8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19MVkRTODQ4eDQ4MERhdGFfMjsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfQ0hUVlVOVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfQ0hUVk9OVFNDRGF0YTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNEYXRhCSpTaVNfQ0hUVlVQQUxEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RhdGEJKlNpU19DSFRWT1BBTERhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZVUEFMTURhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZPUEFMTURhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZVUEFMTkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZPUEFMTkRhdGE7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTRGF0YQkqU2lTX0NIVFZTT1BBTERhdGE7CiAKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwMF8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTAxXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDJfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwM18xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA0XzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDVfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwNl8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA3XzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDhfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwOV8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBhXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGJfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwY18xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBkXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGVfMTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwZl8xOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZU5TXzE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDBfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwMV8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTAyXzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDNfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwNF8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA1XzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDZfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwN18yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTA4XzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMDlfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwYV8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBiXzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGNfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGUwZF8yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX1BhbmVsVHlwZTBlXzI7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfUGFuZWxUeXBlMGZfMjsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19QYW5lbFR5cGVOU18yOwotCWNvbnN0IFNpU19MVkRTRGVzU3RydWN0ICAqU2lTX0NIVFZVTlRTQ0Rlc0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfQ0hUVk9OVFNDRGVzRGF0YTsKLQljb25zdCBTaVNfTFZEU0Rlc1N0cnVjdCAgKlNpU19DSFRWVVBBTERlc0RhdGE7Ci0JY29uc3QgU2lTX0xWRFNEZXNTdHJ1Y3QgICpTaVNfQ0hUVk9QQUxEZXNEYXRhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzFhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzJhOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzFiOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0RlcwkqU2lTX1BhbmVsVHlwZTA0XzJiOwogCi0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTgwMHg2MDBfMTsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTAyNHg3NjhfMTsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTI4MHgxMDI0XzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTE0MDB4MTA1MF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDc2OF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMDI0eDYwMF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMTUyeDc2OF8xOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExNjAweDEyMDBfMTsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxODAweDYwMF8xX0g7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEwMjR4NzY4XzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTI4MHgxMDI0XzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTQwMHgxMDUwXzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTI4MHg3NjhfMV9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMDI0eDYwMF8xX0g7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTExNTJ4NzY4XzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTYwMHgxMjAwXzFfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxODAweDYwMF8yOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMDI0eDc2OF8yOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDEwMjRfMjsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTQwMHgxMDUwXzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEyODB4NzY4XzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEwMjR4NjAwXzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTExNTJ4NzY4XzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTE2MDB4MTIwMF8yOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE4MDB4NjAwXzJfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTAyNHg3NjhfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDEwMjRfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExNDAweDEwNTBfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExMjgweDc2OF8yX0g7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTEwMjR4NjAwXzJfSDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0xWRFNDUlQxMTE1Mng3NjhfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDExNjAweDEyMDBfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDFYWFh4WFhYXzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMVhYWHhYWFhfMV9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE2NDB4NDgwXzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTY0MHg0ODBfMV9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE2NDB4NDgwXzI7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTY0MHg0ODBfMl9IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDE2NDB4NDgwXzM7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19MVkRTQ1JUMTY0MHg0ODBfM19IOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfTFZEU0NSVDEzMjB4NDgwXzE7Ci0JY29uc3QgU2lTX0xWRFNDUlQxRGF0YVN0cnVjdCAgKlNpU19DSFRWQ1JUMVVOVFNDOwotCWNvbnN0IFNpU19MVkRTQ1JUMURhdGFTdHJ1Y3QgICpTaVNfQ0hUVkNSVDFPTlRTQzsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0NIVFZDUlQxVVBBTDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0NIVFZDUlQxT1BBTDsKLQljb25zdCBTaVNfTFZEU0NSVDFEYXRhU3RydWN0ICAqU2lTX0NIVFZDUlQxU09QQUw7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEJKlNpU19MVkRTQ1JUMTMyMHgyNDBfMTsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0xWRFNDUlQxMzIweDI0MF8yOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfTFZEU0NSVDEzMjB4MjQwXzJfSDsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0xWRFNDUlQxMzIweDI0MF8zOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfTFZEU0NSVDEzMjB4MjQwXzNfSDsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0xWRFNDUlQxNjQweDQ4MF8xOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfTFZEU0NSVDE2NDB4NDgwXzFfSDsKKwljb25zdCBzdHJ1Y3QgU2lTX0xWRFNDUlQxRGF0YQkqU2lTX0NIVFZDUlQxVU5UU0M7CisJY29uc3Qgc3RydWN0IFNpU19MVkRTQ1JUMURhdGEJKlNpU19DSFRWQ1JUMU9OVFNDOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfQ0hUVkNSVDFVUEFMOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfQ0hUVkNSVDFPUEFMOworCWNvbnN0IHN0cnVjdCBTaVNfTFZEU0NSVDFEYXRhCSpTaVNfQ0hUVkNSVDFTT1BBTDsKIAotCWNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCAqU2lTX0NIVFZSZWdfVU5UU0M7Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19PTlRTQzsKLQljb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgKlNpU19DSFRWUmVnX1VQQUw7Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19PUEFMOwotCWNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCAqU2lTX0NIVFZSZWdfVVBBTE07Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19PUEFMTTsKLQljb25zdCBTaVNfQ0hUVlJlZ0RhdGFTdHJ1Y3QgKlNpU19DSFRWUmVnX1VQQUxOOwotCWNvbnN0IFNpU19DSFRWUmVnRGF0YVN0cnVjdCAqU2lTX0NIVFZSZWdfT1BBTE47Ci0JY29uc3QgU2lTX0NIVFZSZWdEYXRhU3RydWN0ICpTaVNfQ0hUVlJlZ19TT1BBTDsKKwljb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhCSpTaVNfQ0hUVlJlZ19VTlRTQzsKKwljb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhCSpTaVNfQ0hUVlJlZ19PTlRTQzsKKwljb25zdCBzdHJ1Y3QgU2lTX0NIVFZSZWdEYXRhCSpTaVNfQ0hUVlJlZ19VUEFMOworCWNvbnN0IHN0cnVjdCBTaVNfQ0hUVlJlZ0RhdGEJKlNpU19DSFRWUmVnX09QQUw7CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfVVBBTE07CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfT1BBTE07CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfVVBBTE47CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfT1BBTE47CisJY29uc3Qgc3RydWN0IFNpU19DSFRWUmVnRGF0YQkqU2lTX0NIVFZSZWdfU09QQUw7CiAKLQljb25zdCBVQ0hBUiAqU2lTX0NIVFZWQ0xLVU5UU0M7Ci0JY29uc3QgVUNIQVIgKlNpU19DSFRWVkNMS09OVFNDOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtVUEFMOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtPUEFMOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtVUEFMTTsKLQljb25zdCBVQ0hBUiAqU2lTX0NIVFZWQ0xLT1BBTE07Ci0JY29uc3QgVUNIQVIgKlNpU19DSFRWVkNMS1VQQUxOOwotCWNvbnN0IFVDSEFSICpTaVNfQ0hUVlZDTEtPUEFMTjsKLQljb25zdCBVQ0hBUiAqU2lTX0NIVFZWQ0xLU09QQUw7CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19DSFRWVkNMS1VOVFNDOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpTaVNfQ0hUVlZDTEtPTlRTQzsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLVVBBTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLT1BBTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLVVBBTE07CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19DSFRWVkNMS09QQUxNOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpTaVNfQ0hUVlZDTEtVUEFMTjsKKwljb25zdCB1bnNpZ25lZCBjaGFyCQkqU2lTX0NIVFZWQ0xLT1BBTE47CisJY29uc3QgdW5zaWduZWQgY2hhcgkJKlNpU19DSFRWVkNMS1NPUEFMOwogCi0JVVNIT1JUICBQYW5lbFhSZXMsIFBhbmVsSFQ7Ci0JVVNIT1JUICBQYW5lbFlSZXMsIFBhbmVsVlQ7Ci0JVVNIT1JUICBQYW5lbEhSUywgIFBhbmVsSFJFOwotICAJVVNIT1JUIAlQYW5lbFZSUywgIFBhbmVsVlJFOwotCVVTSE9SVCAgUGFuZWxWQ0xLSWR4MzAwOwotCVVTSE9SVCAgUGFuZWxWQ0xLSWR4MzE1OworCXVuc2lnbmVkIHNob3J0CQkJUGFuZWxYUmVzLCBQYW5lbEhUOworCXVuc2lnbmVkIHNob3J0CQkJUGFuZWxZUmVzLCBQYW5lbFZUOworCXVuc2lnbmVkIHNob3J0CQkJUGFuZWxIUlMsICBQYW5lbEhSRTsKKwl1bnNpZ25lZCBzaG9ydAkJCVBhbmVsVlJTLCAgUGFuZWxWUkU7CisJdW5zaWduZWQgc2hvcnQJCQlQYW5lbFZDTEtJZHgzMDA7CisJdW5zaWduZWQgc2hvcnQJCQlQYW5lbFZDTEtJZHgzMTU7CisJQk9PTEVBTgkJCQlBbHRlcm5hdGUxNjAweDEyMDA7CiAKLQlCT09MRUFOIFVzZUN1c3RvbU1vZGU7Ci0JQk9PTEVBTiBDUlQxVXNlc0N1c3RvbU1vZGU7Ci0JVVNIT1JUICBDSERpc3BsYXk7Ci0JVVNIT1JUICBDSFN5bmNTdGFydDsKLQlVU0hPUlQgIENIU3luY0VuZDsKLQlVU0hPUlQgIENIVG90YWw7Ci0JVVNIT1JUICBDSEJsYW5rU3RhcnQ7Ci0JVVNIT1JUICBDSEJsYW5rRW5kOwotCVVTSE9SVCAgQ1ZEaXNwbGF5OwotCVVTSE9SVCAgQ1ZTeW5jU3RhcnQ7Ci0JVVNIT1JUICBDVlN5bmNFbmQ7Ci0JVVNIT1JUICBDVlRvdGFsOwotCVVTSE9SVCAgQ1ZCbGFua1N0YXJ0OwotCVVTSE9SVCAgQ1ZCbGFua0VuZDsKLQlVTE9ORyAgIENEQ2xvY2s7Ci0JVUxPTkcgICBDRmxhZ3M7ICAgCi0JVUNIQVIgICBDQ1JUMUNSVENbMTddOwotCVVDSEFSICAgQ1NSMkI7Ci0JVUNIQVIgICBDU1IyQzsKLQlVU0hPUlQgIENTUkNsb2NrOwotCVVTSE9SVCAgQ1NSQ2xvY2tfQ1JUMTsKLQlVU0hPUlQgIENNb2RlRmxhZzsKLQlVU0hPUlQgIENNb2RlRmxhZ19DUlQxOwotCVVTSE9SVCAgQ0luZm9GbGFnOworCUJPT0xFQU4JCQkJVXNlQ3VzdG9tTW9kZTsKKwlCT09MRUFOCQkJCUNSVDFVc2VzQ3VzdG9tTW9kZTsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIRGlzcGxheTsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIU3luY1N0YXJ0OworCXVuc2lnbmVkIHNob3J0CQkJQ0hTeW5jRW5kOworCXVuc2lnbmVkIHNob3J0CQkJQ0hUb3RhbDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIQmxhbmtTdGFydDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNIQmxhbmtFbmQ7CisJdW5zaWduZWQgc2hvcnQJCQlDVkRpc3BsYXk7CisJdW5zaWduZWQgc2hvcnQJCQlDVlN5bmNTdGFydDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNWU3luY0VuZDsKKwl1bnNpZ25lZCBzaG9ydAkJCUNWVG90YWw7CisJdW5zaWduZWQgc2hvcnQJCQlDVkJsYW5rU3RhcnQ7CisJdW5zaWduZWQgc2hvcnQJCQlDVkJsYW5rRW5kOworCXVuc2lnbmVkIGludAkJCUNEQ2xvY2s7CisJdW5zaWduZWQgaW50CQkJQ0ZsYWdzOworCXVuc2lnbmVkIGNoYXIJCQlDQ1JUMUNSVENbMTddOworCXVuc2lnbmVkIGNoYXIJCQlDU1IyQjsKKwl1bnNpZ25lZCBjaGFyCQkJQ1NSMkM7CisJdW5zaWduZWQgc2hvcnQJCQlDU1JDbG9jazsKKwl1bnNpZ25lZCBzaG9ydAkJCUNTUkNsb2NrX0NSVDE7CisJdW5zaWduZWQgc2hvcnQJCQlDTW9kZUZsYWc7CisJdW5zaWduZWQgc2hvcnQJCQlDTW9kZUZsYWdfQ1JUMTsKKwl1bnNpZ25lZCBzaG9ydAkJCUNJbmZvRmxhZzsKIAotCWludAlMVkRTSEw7Ci0JCi0JQk9PTEVBTiBCYWNrdXA7Ci0JVUNIQVIgQmFja3VwX01vZGU7Ci0JVUNIQVIgQmFja3VwXzE0OwotCVVDSEFSIEJhY2t1cF8xNTsKLQlVQ0hBUiBCYWNrdXBfMTY7Ci0JVUNIQVIgQmFja3VwXzE3OwotCVVDSEFSIEJhY2t1cF8xODsKLQlVQ0hBUiBCYWNrdXBfMTk7Ci0JVUNIQVIgQmFja3VwXzFhOwotCVVDSEFSIEJhY2t1cF8xYjsKLQlVQ0hBUiBCYWNrdXBfMWM7Ci0JVUNIQVIgQmFja3VwXzFkOwotCQotCWludCAgICAgVXNlUGFuZWxTY2FsZXI7Ci0JaW50CUNlbnRlclNjcmVlbjsKKwlpbnQJCQkJTFZEU0hMOwogCi0JVVNIT1JUICBDUF9WZW5kb3IsIENQX1Byb2R1Y3Q7Ci0JQk9PTEVBTiBDUF9IYXZlQ3VzdG9tRGF0YTsKLQlpbnQgICAgIENQX1ByZWZlcnJlZFgsIENQX1ByZWZlcnJlZFksIENQX1ByZWZlcnJlZEluZGV4OwotCWludAlDUF9NYXhYLCBDUF9NYXhZLCBDUF9NYXhDbG9jazsKLQlVQ0hBUiAgIENQX1ByZWZTUjJCLCBDUF9QcmVmU1IyQzsKLQlVU0hPUlQgIENQX1ByZWZDbG9jazsKLQlCT09MRUFOIENQX1N1cHBvcnRzNjQwNDgwNzU7Ci0JaW50ICAgICBDUF9IRGlzcGxheVs3XSwgQ1BfVkRpc3BsYXlbN107CS8qIEZvciBDdXN0b20gTENEIHBhbmVsIGRpbWVuc2lvbnMgKi8KLSAgICAJaW50ICAgICBDUF9IVG90YWxbN10sIENQX1ZUb3RhbFs3XTsKLSAgICAJaW50ICAgICBDUF9IU3luY1N0YXJ0WzddLCBDUF9WU3luY1N0YXJ0WzddOwotICAgIAlpbnQgICAgIENQX0hTeW5jRW5kWzddLCBDUF9WU3luY0VuZFs3XTsKLQlpbnQgICAgIENQX0hCbGFua1N0YXJ0WzddLCBDUF9WQmxhbmtTdGFydFs3XTsKLQlpbnQgICAgIENQX0hCbGFua0VuZFs3XSwgQ1BfVkJsYW5rRW5kWzddOwotICAgIAlpbnQgICAgIENQX0Nsb2NrWzddOwotCUJPT0xFQU4gQ1BfRGF0YVZhbGlkWzddOwotCUJPT0xFQU4gQ1BfSFN5bmNfUFs3XSwgQ1BfVlN5bmNfUFs3XSwgQ1BfU3luY1ZhbGlkWzddOwotfSBTaVNfUHJpdmF0ZTsKKwlCT09MRUFOCQkJCUJhY2t1cDsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwX01vZGU7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xNDsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwXzE1OworCXVuc2lnbmVkIGNoYXIJCQlCYWNrdXBfMTY7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xNzsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwXzE4OworCXVuc2lnbmVkIGNoYXIJCQlCYWNrdXBfMTk7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xYTsKKwl1bnNpZ25lZCBjaGFyCQkJQmFja3VwXzFiOworCXVuc2lnbmVkIGNoYXIJCQlCYWNrdXBfMWM7CisJdW5zaWduZWQgY2hhcgkJCUJhY2t1cF8xZDsKKworCXVuc2lnbmVkIGNoYXIJCQlJbml0X1A0XzBFOworCisJaW50CQkJCVVzZVBhbmVsU2NhbGVyOworCWludAkJCQlDZW50ZXJTY3JlZW47CisKKwl1bnNpZ25lZCBzaG9ydAkJCUNQX1ZlbmRvciwgQ1BfUHJvZHVjdDsKKwlCT09MRUFOCQkJCUNQX0hhdmVDdXN0b21EYXRhOworCWludAkJCQlDUF9QcmVmZXJyZWRYLCBDUF9QcmVmZXJyZWRZLCBDUF9QcmVmZXJyZWRJbmRleDsKKwlpbnQJCQkJQ1BfTWF4WCwgQ1BfTWF4WSwgQ1BfTWF4Q2xvY2s7CisJdW5zaWduZWQgY2hhcgkJCUNQX1ByZWZTUjJCLCBDUF9QcmVmU1IyQzsKKwl1bnNpZ25lZCBzaG9ydAkJCUNQX1ByZWZDbG9jazsKKwlCT09MRUFOCQkJCUNQX1N1cHBvcnRzNjQwNDgwNzU7CisJaW50CQkJCUNQX0hEaXNwbGF5WzddLCBDUF9WRGlzcGxheVs3XTsJLyogRm9yIEN1c3RvbSBMQ0QgcGFuZWwgZGltZW5zaW9ucyAqLworCWludAkJCQlDUF9IVG90YWxbN10sIENQX1ZUb3RhbFs3XTsKKwlpbnQJCQkJQ1BfSFN5bmNTdGFydFs3XSwgQ1BfVlN5bmNTdGFydFs3XTsKKwlpbnQJCQkJQ1BfSFN5bmNFbmRbN10sIENQX1ZTeW5jRW5kWzddOworCWludAkJCQlDUF9IQmxhbmtTdGFydFs3XSwgQ1BfVkJsYW5rU3RhcnRbN107CisJaW50CQkJCUNQX0hCbGFua0VuZFs3XSwgQ1BfVkJsYW5rRW5kWzddOworCWludAkJCQlDUF9DbG9ja1s3XTsKKwlCT09MRUFOCQkJCUNQX0RhdGFWYWxpZFs3XTsKKwlCT09MRUFOCQkJCUNQX0hTeW5jX1BbN10sIENQX1ZTeW5jX1BbN10sIENQX1N5bmNWYWxpZFs3XTsKK307CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwppbmRleCA2OThjYTkyLi44MWE2ZDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKQEAgLTEwNjEsNiArMTA2MSwxMSBAQAogCiAJY2hpcF9pZCA9IGlkLT5kZXZpY2U7CiAKKwlpZihjaGlwX2lkID09IENZQkVSQkxBREVpMSkKKwkJb3V0cHV0KCIqKiogUGxlYXNlIGRvIHVzZSBjeWJsYWZiLCBDeWJlcmJsYWRlL2kxIHN1cHBvcnQgIgorCQkgICAgICAgIndpbGwgc29vbiBiZSByZW1vdmVkIGZyb20gdHJpZGVudGZiIVxuIik7CisKKwogCS8qIElmIFBDSSBpZCBpcyAweDk2NjAgdGhlbiBmdXJ0aGVyIGRldGVjdCBjaGlwIHR5cGUgKi8KIAkKIAlpZiAoY2hpcF9pZCA9PSBUR1VJOTY2MCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKaW5kZXggYTI3MjU5Mi4uMWNhODAyNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby92ZXNhZmIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPHZpZGVvL3ZnYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAKQEAgLTU0LDYgKzU1LDcgQEAKIHN0YXRpYyB2b2lkICAgICAgICAgICAgKCpwbWlfc3RhcnQpKHZvaWQpOwogc3RhdGljIHZvaWQgICAgICAgICAgICAoKnBtaV9wYWwpKHZvaWQpOwogc3RhdGljIGludCAgICAgICAgICAgICBkZXB0aDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgdmdhX2NvbXBhdDsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTg2LDYgKzg4LDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmVzYWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGVyciA9IDE7CisKKwlpZiAodmdhX2NvbXBhdCkgeworCQlpbnQgbG9vcCA9IDEwMDAwOworCQl1OCBzZXEgPSAwLCBjcnRjMTcgPSAwOworCisJCWVyciA9IDA7CisKKwkJaWYgKGJsYW5rKSB7CisJCQlzZXEgPSAweDIwOworCQkJY3J0YzE3ID0gMHgwMDsKKwkJfSBlbHNlIHsKKwkJCXNlcSA9IDB4MDA7CisJCQljcnRjMTcgPSAweDgwOworCQl9CisKKwkJdmdhX3dzZXEoTlVMTCwgMHgwMCwgMHgwMSk7CisJCXNlcSB8PSB2Z2FfcnNlcShOVUxMLCAweDAxKSAmIH4weDIwOworCQl2Z2Ffd3NlcShOVUxMLCAweDAwLCBzZXEpOworCisJCWNydGMxNyB8PSB2Z2FfcmNydChOVUxMLCAweDE3KSAmIH4weDgwOworCQl3aGlsZSAobG9vcC0tKTsKKwkJdmdhX3djcnQoTlVMTCwgMHgxNywgY3J0YzE3KTsKKwkJdmdhX3dzZXEoTlVMTCwgMHgwMCwgMHgwMyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHZvaWQgdmVzYV9zZXRwYWxldHRlKGludCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKIAkJCSAgICB1bnNpZ25lZCBibHVlKQogewpAQCAtMTc2LDYgKzIwOSw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5mYl9zZXRjb2xyZWcJPSB2ZXNhZmJfc2V0Y29scmVnLAogCS5mYl9wYW5fZGlzcGxheQk9IHZlc2FmYl9wYW5fZGlzcGxheSwKKwkuZmJfYmxhbmsgICAgICAgPSB2ZXNhZmJfYmxhbmssCiAJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKIAkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKQEAgLTQyOSw2ICs0NjMsMTAgQEAKIAlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQgfAogCQkoeXBhbikgPyBGQklORk9fSFdBQ0NFTF9ZUEFOIDogMDsKIAorCXZnYV9jb21wYXQgPSAoc2NyZWVuX2luZm8uY2FwYWJpbGl0aWVzICYgMikgPyAwIDogMTsKKwlwcmludGsoInZlc2FmYjogTW9kZSBpcyAlc1ZHQSBjb21wYXRpYmxlXG4iLAorCSAgICAgICAodmdhX2NvbXBhdCkgPyAiIiA6ICJub3QgIik7CisKIAlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZnYXN0YXRlLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYXN0YXRlLmMKaW5kZXggMGVhNjJkOC4uY2E5Mjk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92Z2FzdGF0ZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmdhc3RhdGUuYwpAQCAtMzQyLDE2ICszNDIsMTEgQEAKIAlpZiAoc3RhdGUtPnZpZHN0YXRlICE9IE5VTEwpIHsKIAkJc3RydWN0IHJlZ3N0YXRlICpzYXZlZCA9IChzdHJ1Y3QgcmVnc3RhdGUgKikgc3RhdGUtPnZpZHN0YXRlOwogCi0JCWlmIChzYXZlZC0+dmdhX2ZvbnQwKSAKLQkJCXZmcmVlKHNhdmVkLT52Z2FfZm9udDApOwotCQlpZiAoc2F2ZWQtPnZnYV9mb250MSkgCi0JCQl2ZnJlZShzYXZlZC0+dmdhX2ZvbnQxKTsKLQkJaWYgKHNhdmVkLT52Z2FfdGV4dCkKLQkJCXZmcmVlKHNhdmVkLT52Z2FfdGV4dCk7Ci0JCWlmIChzYXZlZC0+dmdhX2NtYXApCi0JCQl2ZnJlZShzYXZlZC0+dmdhX2NtYXApOwotCQlpZiAoc2F2ZWQtPmF0dHIpCi0JCQl2ZnJlZShzYXZlZC0+YXR0cik7CisJCXZmcmVlKHNhdmVkLT52Z2FfZm9udDApOworCQl2ZnJlZShzYXZlZC0+dmdhX2ZvbnQxKTsKKwkJdmZyZWUoc2F2ZWQtPnZnYV90ZXh0KTsKKwkJdmZyZWUoc2F2ZWQtPnZnYV9jbWFwKTsKKwkJdmZyZWUoc2F2ZWQtPmF0dHIpOwogCQlrZnJlZShzYXZlZCk7CiAJCXN0YXRlLT52aWRzdGF0ZSA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby93MTAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMKaW5kZXggYWRjZGE2OS4uMDAzMGMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby93MTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5jCkBAIC01LDkgKzUsMTUgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIEFUSSBDb3JwLgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUmljaGFyZCBQdXJkaWUKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJYW4gTW9sdG9uCiAgKgogICogUmV3cml0dGVuIGZvciAyLjYgYnkgUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PgogICoKKyAqIEdlbmVyaWMgcGxhdGZvcm0gc3VwcG9ydCBieSBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgorICogYW5kIFJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4KKyAqCisgKiB3MzJ4eCBzdXBwb3J0IGJ5IElhbiBNb2x0b24KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMjEsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgpAQCAtMzAsMTE0ICszNiw3OCBAQAogLyoKICAqIFByb3RvdHlwZXMKICAqLwotc3RhdGljIHZvaWQgdzEwMGZiX3NhdmVfYnVmZmVyKHZvaWQpOwotc3RhdGljIHZvaWQgdzEwMGZiX2NsZWFyX2J1ZmZlcih2b2lkKTsKLXN0YXRpYyB2b2lkIHcxMDBmYl9yZXN0b3JlX2J1ZmZlcih2b2lkKTsKLXN0YXRpYyB2b2lkIHcxMDBmYl9jbGVhcl9zY3JlZW4odTMyIG1vZGUsIGxvbmcgaW50IG9mZnNldCk7Ci1zdGF0aWMgdm9pZCB3MTAwX3Jlc3VtZSh2b2lkKTsKIHN0YXRpYyB2b2lkIHcxMDBfc3VzcGVuZCh1MzIgbW9kZSk7Ci1zdGF0aWMgdm9pZCB3MTAwX2luaXRfcXZnYV9yb3RhdGlvbih1MTYgZGVnKTsKLXN0YXRpYyB2b2lkIHcxMDBfaW5pdF92Z2Ffcm90YXRpb24odTE2IGRlZyk7CiBzdGF0aWMgdm9pZCB3MTAwX3ZzeW5jKHZvaWQpOwotc3RhdGljIHZvaWQgdzEwMF9pbml0X3NoYXJwX2xjZCh1MzIgbW9kZSk7Ci1zdGF0aWMgdm9pZCB3MTAwX3B3bV9zZXR1cCh2b2lkKTsKLXN0YXRpYyB2b2lkIHcxMDBfSW5pdEV4dE1lbSh1MzIgbW9kZSk7Ci1zdGF0aWMgdm9pZCB3MTAwX2h3X2luaXQodm9pZCk7Ci1zdGF0aWMgdTE2IHcxMDBfc2V0X2Zhc3RzeXNjbGsodTE2IEZyZXEpOwotCi1zdGF0aWMgdm9pZCBsY2R0Z19od19pbml0KHUzMiBtb2RlKTsKLXN0YXRpYyB2b2lkIGxjZHRnX2xjZF9jaGFuZ2UodTMyIG1vZGUpOwotc3RhdGljIHZvaWQgbGNkdGdfcmVzdW1lKHZvaWQpOwotc3RhdGljIHZvaWQgbGNkdGdfc3VzcGVuZCh2b2lkKTsKLQotCi0vKiBSZWdpc3RlciBvZmZzZXRzICYgbGVuZ3RocyAqLwotI2RlZmluZSBSRU1BUFBFRF9GQl9MRU4gICAweDE1ZmZmZgotCi0jZGVmaW5lIEJJVFNfUEVSX1BJWEVMICAgIDE2CitzdGF0aWMgdm9pZCB3MTAwX2h3X2luaXQoc3RydWN0IHcxMDBmYl9wYXIqKTsKK3N0YXRpYyB2b2lkIHcxMDBfcHdtX3NldHVwKHN0cnVjdCB3MTAwZmJfcGFyKik7CitzdGF0aWMgdm9pZCB3MTAwX2luaXRfY2xvY2tzKHN0cnVjdCB3MTAwZmJfcGFyKik7CitzdGF0aWMgdm9pZCB3MTAwX3NldHVwX21lbW9yeShzdHJ1Y3QgdzEwMGZiX3BhciopOworc3RhdGljIHZvaWQgdzEwMF9pbml0X2xjZChzdHJ1Y3QgdzEwMGZiX3BhciopOworc3RhdGljIHZvaWQgdzEwMF9zZXRfZGlzcHJlZ3Moc3RydWN0IHcxMDBmYl9wYXIqKTsKK3N0YXRpYyB2b2lkIHcxMDBfdXBkYXRlX2VuYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHcxMDBfdXBkYXRlX2Rpc2FibGUodm9pZCk7CitzdGF0aWMgdm9pZCBjYWxjX2hzeW5jKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpOworc3RydWN0IHcxMDBfcGxsX2luZm8gKncxMDBfZ2V0X3h0YWxfdGFibGUodW5zaWduZWQgaW50IGZyZXEpOwogCiAvKiBQc2V1ZG8gcGFsZXR0ZSBzaXplICovCiAjZGVmaW5lIE1BWF9QQUxFVFRFUyAgICAgIDE2CiAKLS8qIGZvciByZXNvbHV0aW9uIGNoYW5nZSAqLwotI2RlZmluZSBMQ0RfTU9ERV9JTklUICgtMSkKLSNkZWZpbmUgTENEX01PREVfNDgwICAgIDAKLSNkZWZpbmUgTENEX01PREVfMzIwICAgIDEKLSNkZWZpbmUgTENEX01PREVfMjQwICAgIDIKLSNkZWZpbmUgTENEX01PREVfNjQwICAgIDMKLQotI2RlZmluZSBMQ0RfU0hBUlBfUVZHQSAwCi0jZGVmaW5lIExDRF9TSEFSUF9WR0EgIDEKLQotI2RlZmluZSBMQ0RfTU9ERV9QT1JUUkFJVAkwCi0jZGVmaW5lIExDRF9NT0RFX0xBTkRTQ0FQRQkxCi0KICNkZWZpbmUgVzEwMF9TVVNQRU5EX0VYVE1FTSAwCiAjZGVmaW5lIFcxMDBfU1VTUEVORF9BTEwgICAgMQogCi0vKiBHZW5lcmFsIGZyYW1lIGJ1ZmZlciBkYXRhIHN0cnVjdHVyZXMgKi8KLXN0cnVjdCB3MTAwZmJfcGFyIHsKLQl1MzIgeHJlczsKLQl1MzIgeXJlczsKLQlpbnQgZmFzdHN5c2Nsa19tb2RlOwotCWludCBsY2RNb2RlOwotCWludCByb3RhdGlvbl9mbGFnOwotCWludCBibGFua2luZ19mbGFnOwotCWludCBjb21hZGo7Ci0JaW50IHBoYWRhZGo7Ci19OwotCi1zdGF0aWMgc3RydWN0IHcxMDBmYl9wYXIgKmN1cnJlbnRfcGFyOworI2RlZmluZSBCSVRTX1BFUl9QSVhFTCAgICAxNgogCiAvKiBSZW1hcHBlZCBhZGRyZXNzZXMgZm9yIGJhc2UgY2ZnLCBtZW1tYXBwZWQgcmVncyBhbmQgdGhlIGZyYW1lIGJ1ZmZlciBpdHNlbGYgKi8KIHN0YXRpYyB2b2lkICpyZW1hcHBlZF9iYXNlOwogc3RhdGljIHZvaWQgKnJlbWFwcGVkX3JlZ3M7CiBzdGF0aWMgdm9pZCAqcmVtYXBwZWRfZmJ1ZjsKIAotLyogRXh0ZXJuYWwgRnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkKCp3MTAwZmJfc3NwX3NlbmQpKHU4IGFkcnMsIHU4IGRhdGEpOworI2RlZmluZSBSRU1BUFBFRF9GQl9MRU4gICAweDE1ZmZmZgorCisvKiBUaGlzIGlzIHRoZSBvZmZzZXQgaW4gdGhlIHcxMDAncyBhZGRyZXNzIHNwYWNlIHdlIG1hcCB0aGUgY3VycmVudAorICAgZnJhbWVidWZmZXIgbWVtb3J5IHRvLiBXZSB1c2UgdGhlIHBvc2l0aW9uIG9mIGV4dGVybmFsIG1lbW9yeSBhcworICAgd2UgY2FuIHJlbWFwIGludGVybmFsIG1lbW9yeSB0byB0aGVyZSBpZiBleHRlcm5hbCBpc24ndCBwcmVzZW50LiAqLworI2RlZmluZSBXMTAwX0ZCX0JBU0UgTUVNX0VYVF9CQVNFX1ZBTFVFCisKIAogLyoKICAqIFN5c2ZzIGZ1bmN0aW9ucwogICovCi0KLXN0YXRpYyBzc2l6ZV90IHJvdGF0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgZmxpcF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIscGFyLT5yb3RhdGlvbl9mbGFnKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIixwYXItPmZsaXApOwogfQogCi1zdGF0aWMgc3NpemVfdCByb3RhdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGZsaXBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdW5zaWduZWQgaW50IHJvdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZmxpcDsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi0Jcm90YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJZmxpcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCi0JaWYgKHJvdGF0ZSA+IDApIHBhci0+cm90YXRpb25fZmxhZyA9IDE7Ci0JZWxzZSBwYXItPnJvdGF0aW9uX2ZsYWcgPSAwOworCWlmIChmbGlwID4gMCkKKwkJcGFyLT5mbGlwID0gMTsKKwllbHNlCisJCXBhci0+ZmxpcCA9IDA7CiAKLQlpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzMyMCkKLQkJdzEwMF9pbml0X3F2Z2Ffcm90YXRpb24ocGFyLT5yb3RhdGlvbl9mbGFnID8gMjcwIDogOTApOwotCWVsc2UgaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV8yNDApCi0JCXcxMDBfaW5pdF9xdmdhX3JvdGF0aW9uKHBhci0+cm90YXRpb25fZmxhZyA/IDE4MCA6IDApOwotCWVsc2UgaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV82NDApCi0JCXcxMDBfaW5pdF92Z2Ffcm90YXRpb24ocGFyLT5yb3RhdGlvbl9mbGFnID8gMjcwIDogOTApOwotCWVsc2UgaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV80ODApCi0JCXcxMDBfaW5pdF92Z2Ffcm90YXRpb24ocGFyLT5yb3RhdGlvbl9mbGFnID8gMTgwIDogMCk7CisJdzEwMF91cGRhdGVfZGlzYWJsZSgpOworCXcxMDBfc2V0X2Rpc3ByZWdzKHBhcik7CisJdzEwMF91cGRhdGVfZW5hYmxlKCk7CisKKwljYWxjX2hzeW5jKHBhcik7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihyb3RhdGlvbiwgMDY0NCwgcm90YXRpb25fc2hvdywgcm90YXRpb25fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGZsaXAsIDA2NDQsIGZsaXBfc2hvdywgZmxpcF9zdG9yZSk7CiAKIHN0YXRpYyBzc2l6ZV90IHcxMDBmYl9yZWdfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQl1bnNpZ25lZCBsb25nIHBhcmFtOwotCXVuc2lnbmVkIGxvbmcgcmVnczsKKwl1bnNpZ25lZCBsb25nIHJlZ3MsIHBhcmFtOwogCXJlZ3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KTsKIAlwYXJhbSA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyByZWdzKTsKIAlwcmludGsoIlJlYWQgUmVnaXN0ZXIgMHglMDhsWDogMHglMDhsWFxuIiwgcmVncywgcGFyYW0pOwpAQCAtMTQ4LDggKzExOCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHcxMDBmYl9yZWdfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdW5zaWduZWQgbG9uZyByZWdzOwotCXVuc2lnbmVkIGxvbmcgcGFyYW07CisJdW5zaWduZWQgbG9uZyByZWdzLCBwYXJhbTsKIAlzc2NhbmYoYnVmLCAiJWx4ICVseCIsICZyZWdzLCAmcGFyYW0pOwogCiAJaWYgKHJlZ3MgPD0gMHgyMDAwKSB7CkBAIC0xNjMsNTQgKzEzMiw1NiBAQAogc3RhdGljIERFVklDRV9BVFRSKHJlZ193cml0ZSwgMDIwMCwgTlVMTCwgdzEwMGZiX3JlZ193cml0ZSk7CiAKIAotc3RhdGljIHNzaXplX3QgZmFzdHN5c2Nsa19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGZhc3RwbGxjbGtfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyPWluZm8tPnBhcjsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLHBhci0+ZmFzdHN5c2Nsa19tb2RlKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIixwYXItPmZhc3RwbGxfbW9kZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZhc3RzeXNjbGtfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBmYXN0cGxsY2xrX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCBwYXJhbTsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi0JcGFyYW0gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQotCWlmIChwYXJhbSA9PSA3NSkgewotCQlwcmludGsoIlNldCBmYXN0c3lzY2xrICVkXG4iLCBwYXJhbSk7Ci0JCXBhci0+ZmFzdHN5c2Nsa19tb2RlID0gcGFyYW07Ci0JCXcxMDBfc2V0X2Zhc3RzeXNjbGsocGFyLT5mYXN0c3lzY2xrX21vZGUpOwotCX0gZWxzZSBpZiAocGFyYW0gPT0gMTAwKSB7Ci0JCXByaW50aygiU2V0IGZhc3RzeXNjbGsgJWRcbiIsIHBhcmFtKTsKLQkJcGFyLT5mYXN0c3lzY2xrX21vZGUgPSBwYXJhbTsKLQkJdzEwMF9zZXRfZmFzdHN5c2NsayhwYXItPmZhc3RzeXNjbGtfbW9kZSk7CisJaWYgKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApID4gMCkgeworCQlwYXItPmZhc3RwbGxfbW9kZT0xOworCQlwcmludGsoIncxMDBmYjogVXNpbmcgZmFzdCBzeXN0ZW0gY2xvY2sgKGlmIHBvc3NpYmxlKVxuIik7CisJfSBlbHNlIHsKKwkJcGFyLT5mYXN0cGxsX21vZGU9MDsKKwkJcHJpbnRrKCJ3MTAwZmI6IFVzaW5nIG5vcm1hbCBzeXN0ZW0gY2xvY2tcbiIpOwogCX0KKworCXcxMDBfaW5pdF9jbG9ja3MocGFyKTsKKwljYWxjX2hzeW5jKHBhcik7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihmYXN0c3lzY2xrLCAwNjQ0LCBmYXN0c3lzY2xrX3Nob3csIGZhc3RzeXNjbGtfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGZhc3RwbGxjbGssIDA2NDQsIGZhc3RwbGxjbGtfc2hvdywgZmFzdHBsbGNsa19zdG9yZSk7CiAKIC8qCi0gKiBUaGUgdG91Y2hzY3JlZW4gb24gdGhpcyBkZXZpY2UgbmVlZHMgY2VydGFpbiBpbmZvcm1hdGlvbgotICogZnJvbSB0aGUgdmlkZW8gZHJpdmVyIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS4gV2UgZXhwb3J0IGl0IGhlcmUuCisgKiBTb21lIHRvdWNoc2NyZWVucyBuZWVkIGhzeW5jIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpZGVvIGRyaXZlciB0bworICogZnVuY3Rpb24gY29ycmVjdGx5LiBXZSBleHBvcnQgaXQgaGVyZS4KICAqLwotaW50IHcxMDBmYl9nZXRfeHJlcyh2b2lkKSB7Ci0JcmV0dXJuIGN1cnJlbnRfcGFyLT54cmVzOwotfQordW5zaWduZWQgbG9uZyB3MTAwZmJfZ2V0X2hzeW5jbGVuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi1pbnQgdzEwMGZiX2dldF9ibGFua2luZyh2b2lkKSB7Ci0JcmV0dXJuIGN1cnJlbnRfcGFyLT5ibGFua2luZ19mbGFnOworCS8qIElmIGRpc3BsYXkgaXMgYmxhbmtlZC9zdXNwZW5kZWQsIGhzeW5jIGlzbid0IGFjdGl2ZSAqLworCWlmIChwYXItPmJsYW5rZWQpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIHBhci0+aHN5bmNfbGVuOwogfQorRVhQT1JUX1NZTUJPTCh3MTAwZmJfZ2V0X2hzeW5jbGVuKTsKIAotaW50IHcxMDBmYl9nZXRfZmFzdHN5c2Nsayh2b2lkKSB7Ci0JcmV0dXJuIGN1cnJlbnRfcGFyLT5mYXN0c3lzY2xrX21vZGU7CitzdGF0aWMgdm9pZCB3MTAwZmJfY2xlYXJfc2NyZWVuKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJbWVtc2V0X2lvKHJlbWFwcGVkX2ZidWYgKyAoVzEwMF9GQl9CQVNFLU1FTV9XSU5ET1dfQkFTRSksIDAsIChwYXItPnhyZXMgKiBwYXItPnlyZXMgKiBCSVRTX1BFUl9QSVhFTC84KSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHcxMDBmYl9nZXRfeHJlcyk7Ci1FWFBPUlRfU1lNQk9MKHcxMDBmYl9nZXRfYmxhbmtpbmcpOwotRVhQT1JUX1NZTUJPTCh3MTAwZmJfZ2V0X2Zhc3RzeXNjbGspOwogCiAKIC8qCkBAIC0yMzQsNyArMjA1LDYgQEAKIAkgKiBhY2NvcmRpbmcgdG8gdGhlIFJHQiBiaXRmaWVsZCBpbmZvcm1hdGlvbi4KIAkgKi8KIAlpZiAocmVnbm8gPCBNQVhfUEFMRVRURVMpIHsKLQogCQl1MzIgKnBhbCA9IGluZm8tPnBzZXVkb19wYWxldHRlOwogCiAJCXZhbCA9IChyZWQgJiAweGY4MDApIHwgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKQEAgLTI1MCwxMTUgKzIyMCw5MCBAQAogICovCiBzdGF0aWMgaW50IHcxMDBmYl9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHcxMDBmYl9wYXIgKnBhcjsKLQlwYXI9aW5mby0+cGFyOworCXN0cnVjdCB3MTAwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IHcxMDBfdGdfaW5mbyAqdGcgPSBwYXItPm1hY2gtPnRnOwogCiAJc3dpdGNoKGJsYW5rX21vZGUpIHsKIAotIAljYXNlIEZCX0JMQU5LX05PUk1BTDogLyogTm9ybWFsIGJsYW5raW5nICovCi0JY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOiAvKiBWRVNBIGJsYW5rICh2c3luYyBvZmYpICovCi0JY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOiAvKiBWRVNBIGJsYW5rIChoc3luYyBvZmYpICovCi0gCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOiAvKiBQb3dlcm9mZiAqLwotICAJCWlmIChwYXItPmJsYW5raW5nX2ZsYWcgPT0gMCkgewotCQkJdzEwMGZiX3NhdmVfYnVmZmVyKCk7Ci0JCQlsY2R0Z19zdXNwZW5kKCk7Ci0JCQlwYXItPmJsYW5raW5nX2ZsYWcgPSAxOworIAljYXNlIEZCX0JMQU5LX05PUk1BTDogICAgICAgICAvKiBOb3JtYWwgYmxhbmtpbmcgKi8KKwljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6ICAvKiBWRVNBIGJsYW5rICh2c3luYyBvZmYpICovCisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOiAgLyogVkVTQSBibGFuayAoaHN5bmMgb2ZmKSAqLworIAljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjogICAgICAvKiBQb3dlcm9mZiAqLworICAJCWlmIChwYXItPmJsYW5rZWQgPT0gMCkgeworCQkJaWYodGcgJiYgdGctPnN1c3BlbmQpCisJCQkJdGctPnN1c3BlbmQocGFyKTsKKwkJCXBhci0+YmxhbmtlZCA9IDE7CiAgIAkJfQogICAJCWJyZWFrOwogCiAgCWNhc2UgRkJfQkxBTktfVU5CTEFOSzogLyogVW5ibGFua2luZyAqLwotICAJCWlmIChwYXItPmJsYW5raW5nX2ZsYWcgIT0gMCkgewotCQkJdzEwMGZiX3Jlc3RvcmVfYnVmZmVyKCk7Ci0JCQlsY2R0Z19yZXN1bWUoKTsKLQkJCXBhci0+YmxhbmtpbmdfZmxhZyA9IDA7CisgIAkJaWYgKHBhci0+YmxhbmtlZCAhPSAwKSB7CisJCQlpZih0ZyAmJiB0Zy0+cmVzdW1lKQorCQkJCXRnLT5yZXN1bWUocGFyKTsKKwkJCXBhci0+YmxhbmtlZCA9IDA7CiAgIAkJfQogICAJCWJyZWFrOwogIAl9CiAJcmV0dXJuIDA7CiB9CiAKKwogLyoKICAqICBDaGFuZ2UgdGhlIHJlc29sdXRpb24gYnkgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgaGFyZHdhcmUgZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyB2b2lkIHcxMDBmYl9jaGFuZ2VyZXMoaW50IHJvdGF0ZV9tb2RlLCB1MzIgbW9kZSkKK3N0YXRpYyB2b2lkIHcxMDBmYl9hY3RpdmF0ZV92YXIoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKIHsKLQl1MTYgcm90YXRpb249MDsKKwlzdHJ1Y3QgdzEwMF90Z19pbmZvICp0ZyA9IHBhci0+bWFjaC0+dGc7CiAKLQlzd2l0Y2gocm90YXRlX21vZGUpIHsKLQljYXNlIExDRF9NT0RFX0xBTkRTQ0FQRToKLQkJcm90YXRpb249KGN1cnJlbnRfcGFyLT5yb3RhdGlvbl9mbGFnID8gMjcwIDogOTApOwotCQlicmVhazsKLQljYXNlIExDRF9NT0RFX1BPUlRSQUlUOgotCQlyb3RhdGlvbj0oY3VycmVudF9wYXItPnJvdGF0aW9uX2ZsYWcgPyAxODAgOiAwKTsKLQkJYnJlYWs7Ci0JfQorCXcxMDBfcHdtX3NldHVwKHBhcik7CisJdzEwMF9zZXR1cF9tZW1vcnkocGFyKTsKKwl3MTAwX2luaXRfY2xvY2tzKHBhcik7CisJdzEwMGZiX2NsZWFyX3NjcmVlbihwYXIpOworCXcxMDBfdnN5bmMoKTsKIAotCXcxMDBfcHdtX3NldHVwKCk7Ci0Jc3dpdGNoKG1vZGUpIHsKLQljYXNlIExDRF9TSEFSUF9RVkdBOgotCQl3MTAwX3ZzeW5jKCk7Ci0JCXcxMDBfc3VzcGVuZChXMTAwX1NVU1BFTkRfRVhUTUVNKTsKLQkJdzEwMF9pbml0X3NoYXJwX2xjZChMQ0RfU0hBUlBfUVZHQSk7Ci0JCXcxMDBfaW5pdF9xdmdhX3JvdGF0aW9uKHJvdGF0aW9uKTsKLQkJdzEwMF9Jbml0RXh0TWVtKExDRF9TSEFSUF9RVkdBKTsKLQkJdzEwMGZiX2NsZWFyX3NjcmVlbihMQ0RfU0hBUlBfUVZHQSwgMCk7Ci0JCWxjZHRnX2xjZF9jaGFuZ2UoTENEX1NIQVJQX1FWR0EpOwotCQlicmVhazsKLQljYXNlIExDRF9TSEFSUF9WR0E6Ci0JCXcxMDBmYl9jbGVhcl9zY3JlZW4oTENEX1NIQVJQX1FWR0EsIDApOwotCQl3cml0ZWwoMHhCRkZGQTAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfRVhUX01FTV9MT0NBVElPTik7Ci0JCXcxMDBfSW5pdEV4dE1lbShMQ0RfU0hBUlBfVkdBKTsKLQkJdzEwMGZiX2NsZWFyX3NjcmVlbihMQ0RfU0hBUlBfVkdBLCAweDIwMDAwMCk7Ci0JCXcxMDBfdnN5bmMoKTsKLQkJdzEwMF9pbml0X3NoYXJwX2xjZChMQ0RfU0hBUlBfVkdBKTsKLQkJaWYgKHJvdGF0aW9uICE9IDApCi0JCQl3MTAwX2luaXRfdmdhX3JvdGF0aW9uKHJvdGF0aW9uKTsKLQkJbGNkdGdfbGNkX2NoYW5nZShMQ0RfU0hBUlBfVkdBKTsKLQkJYnJlYWs7Ci0JfQorCXcxMDBfdXBkYXRlX2Rpc2FibGUoKTsKKwl3MTAwX2luaXRfbGNkKHBhcik7CisJdzEwMF9zZXRfZGlzcHJlZ3MocGFyKTsKKwl3MTAwX3VwZGF0ZV9lbmFibGUoKTsKKworCWNhbGNfaHN5bmMocGFyKTsKKworCWlmICghcGFyLT5ibGFua2VkICYmIHRnICYmIHRnLT5jaGFuZ2UpCisJCXRnLT5jaGFuZ2UocGFyKTsKIH0KIAotLyoKLSAqIFNldCB1cCB0aGUgZGlzcGxheSBmb3IgdGhlIGZiIHN1YnN5c3RlbQorCisvKiBTZWxlY3QgdGhlIHNtYWxsZXN0IG1vZGUgdGhhdCBhbGxvd3MgdGhlIGRlc2lyZWQgcmVzb2x1dGlvbiB0byBiZQorICogZGlzcGxheWVkLiBJZiBkZXNpcmVkLCB0aGUgeCBhbmQgeSBwYXJhbWV0ZXJzIGNhbiBiZSByb3VuZGVkIHVwIHRvCisgKiBtYXRjaCB0aGUgc2VsZWN0ZWQgbW9kZS4KICAqLwotc3RhdGljIHZvaWQgdzEwMGZiX2FjdGl2YXRlX3ZhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9tb2RlICp3MTAwZmJfZ2V0X21vZGUoc3RydWN0IHcxMDBmYl9wYXIgKnBhciwgdW5zaWduZWQgaW50ICp4LCB1bnNpZ25lZCBpbnQgKnksIGludCBzYXZldmFsKQogewotCXUzMiB0ZW1wMzI7Ci0Jc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7Ci0Jc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCXN0cnVjdCB3MTAwX21vZGUgKm1vZGUgPSBOVUxMOworCXN0cnVjdCB3MTAwX21vZGUgKm1vZGVsaXN0ID0gcGFyLT5tYWNoLT5tb2RlbGlzdDsKKwl1bnNpZ25lZCBpbnQgYmVzdF94ID0gMHhmZmZmZmZmZiwgYmVzdF95ID0gMHhmZmZmZmZmZjsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCS8qIFNldCB0aGUgaGFyZHdhcmUgdG8gNTY1ICovCi0JdGVtcDMyID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tRElTUF9ERUJVRzIpOwotCXRlbXAzMiAmPSAweGZmN2ZmZmZmOwotCXRlbXAzMiB8PSAweDAwODAwMDAwOwotCXdyaXRlbCh0ZW1wMzIsIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREVCVUcyKTsKKwlmb3IgKGkgPSAwIDsgaSA8IHBhci0+bWFjaC0+bnVtX21vZGVzIDsgaSsrKSB7CisJCWlmIChtb2RlbGlzdFtpXS54cmVzID49ICp4ICYmIG1vZGVsaXN0W2ldLnlyZXMgPj0gKnkgJiYKKwkJCQltb2RlbGlzdFtpXS54cmVzIDwgYmVzdF94ICYmIG1vZGVsaXN0W2ldLnlyZXMgPCBiZXN0X3kpIHsKKwkJCWJlc3RfeCA9IG1vZGVsaXN0W2ldLnhyZXM7CisJCQliZXN0X3kgPSBtb2RlbGlzdFtpXS55cmVzOworCQkJbW9kZSA9ICZtb2RlbGlzdFtpXTsKKwkJfSBlbHNlIGlmKG1vZGVsaXN0W2ldLnhyZXMgPj0gKnkgJiYgbW9kZWxpc3RbaV0ueXJlcyA+PSAqeCAmJgorCQkgICAgICAgIG1vZGVsaXN0W2ldLnhyZXMgPCBiZXN0X3kgJiYgbW9kZWxpc3RbaV0ueXJlcyA8IGJlc3RfeCkgeworCQkJYmVzdF94ID0gbW9kZWxpc3RbaV0ueXJlczsKKwkJCWJlc3RfeSA9IG1vZGVsaXN0W2ldLnhyZXM7CisJCQltb2RlID0gJm1vZGVsaXN0W2ldOworCQl9CisJfQogCi0JaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV9JTklUKSB7Ci0JCXcxMDBfaW5pdF9zaGFycF9sY2QoTENEX1NIQVJQX1ZHQSk7Ci0JCXcxMDBfaW5pdF92Z2Ffcm90YXRpb24ocGFyLT5yb3RhdGlvbl9mbGFnID8gMjcwIDogOTApOwotCQlwYXItPmxjZE1vZGUgPSBMQ0RfTU9ERV82NDA7Ci0JCWxjZHRnX2h3X2luaXQoTENEX1NIQVJQX1ZHQSk7Ci0JfSBlbHNlIGlmICh2YXItPnhyZXMgPT0gMzIwICYmIHZhci0+eXJlcyA9PSAyNDApIHsKLQkJaWYgKHBhci0+bGNkTW9kZSAhPSBMQ0RfTU9ERV8zMjApIHsKLQkJCXcxMDBmYl9jaGFuZ2VyZXMoTENEX01PREVfTEFORFNDQVBFLCBMQ0RfU0hBUlBfUVZHQSk7Ci0JCQlwYXItPmxjZE1vZGUgPSBMQ0RfTU9ERV8zMjA7Ci0JCX0KLQl9IGVsc2UgaWYgKHZhci0+eHJlcyA9PSAyNDAgJiYgdmFyLT55cmVzID09IDMyMCkgewotCQlpZiAocGFyLT5sY2RNb2RlICE9IExDRF9NT0RFXzI0MCkgewotCQkJdzEwMGZiX2NoYW5nZXJlcyhMQ0RfTU9ERV9QT1JUUkFJVCwgTENEX1NIQVJQX1FWR0EpOwotCQkJcGFyLT5sY2RNb2RlID0gTENEX01PREVfMjQwOwotCQl9Ci0JfSBlbHNlIGlmICh2YXItPnhyZXMgPT0gNjQwICYmIHZhci0+eXJlcyA9PSA0ODApIHsKLQkJaWYgKHBhci0+bGNkTW9kZSAhPSBMQ0RfTU9ERV82NDApIHsKLQkJCXcxMDBmYl9jaGFuZ2VyZXMoTENEX01PREVfTEFORFNDQVBFLCBMQ0RfU0hBUlBfVkdBKTsKLQkJCXBhci0+bGNkTW9kZSA9IExDRF9NT0RFXzY0MDsKLQkJfQotCX0gZWxzZSBpZiAodmFyLT54cmVzID09IDQ4MCAmJiB2YXItPnlyZXMgPT0gNjQwKSB7Ci0JCWlmIChwYXItPmxjZE1vZGUgIT0gTENEX01PREVfNDgwKSB7Ci0JCQl3MTAwZmJfY2hhbmdlcmVzKExDRF9NT0RFX1BPUlRSQUlULCBMQ0RfU0hBUlBfVkdBKTsKLQkJCXBhci0+bGNkTW9kZSA9IExDRF9NT0RFXzQ4MDsKLQkJfQotCX0gZWxzZSBwcmludGsoS0VSTl9FUlIgIlcxMDBGQjogUmVzb2x1dGlvbiBlcnJvciFcbiIpOworCWlmIChtb2RlICYmIHNhdmV2YWwpIHsKKwkJKnggPSBiZXN0X3g7CisJCSp5ID0gYmVzdF95OworCX0KKworCXJldHVybiBtb2RlOwogfQogCiAKQEAgLTM2NiwzMSArMzExLDE5IEBACiAgKiAgdzEwMGZiX2NoZWNrX3ZhcigpOgogICogIEdldCB0aGUgdmlkZW8gcGFyYW1zIG91dCBvZiAndmFyJy4gSWYgYSB2YWx1ZSBkb2Vzbid0IGZpdCwgcm91bmQgaXQgdXAsCiAgKiAgaWYgaXQncyB0b28gYmlnLCByZXR1cm4gLUVJTlZBTC4KLSAqCiAgKi8KIHN0YXRpYyBpbnQgdzEwMGZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JaWYgKHZhci0+eHJlcyA8IHZhci0+eXJlcykgeyAvKiBQb3J0cmFpdCBtb2RlICovCi0JCWlmICgodmFyLT54cmVzID4gNDgwKSB8fCAodmFyLT55cmVzID4gNjQwKSkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAoKHZhci0+eHJlcyA+IDI0MCkgfHwgKHZhci0+eXJlcyA+IDMyMCkpIHsKLQkJCXZhci0+eHJlcyA9IDQ4MDsKLQkJCXZhci0+eXJlcyA9IDY0MDsKLQkJfSBlbHNlIHsKLQkJCXZhci0+eHJlcyA9IDI0MDsKLQkJCXZhci0+eXJlcyA9IDMyMDsKLQkJfQotCX0gZWxzZSB7IC8qIExhbmRzY2FwZSBtb2RlICovCi0JCWlmICgodmFyLT54cmVzID4gNjQwKSB8fCAodmFyLT55cmVzID4gNDgwKSkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAoKHZhci0+eHJlcyA+IDMyMCkgfHwgKHZhci0+eXJlcyA+IDI0MCkpIHsKLQkJCXZhci0+eHJlcyA9IDY0MDsKLQkJCXZhci0+eXJlcyA9IDQ4MDsKLQkJfSBlbHNlIHsKLQkJCXZhci0+eHJlcyA9IDMyMDsKLQkJCXZhci0+eXJlcyA9IDI0MDsKLQkJfQotCX0KKwlzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyPWluZm8tPnBhcjsKKworCWlmKCF3MTAwZmJfZ2V0X21vZGUocGFyLCAmdmFyLT54cmVzLCAmdmFyLT55cmVzLCAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyLT5tYWNoLT5tZW0gJiYgKCh2YXItPnhyZXMqdmFyLT55cmVzKkJJVFNfUEVSX1BJWEVMLzgpID4gKHBhci0+bWFjaC0+bWVtLT5zaXplKzEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXBhci0+bWFjaC0+bWVtICYmICgodmFyLT54cmVzKnZhci0+eXJlcypCSVRTX1BFUl9QSVhFTC84KSA+IChNRU1fSU5UX1NJWkUrMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZhci0+eHJlc192aXJ0dWFsID0gbWF4KHZhci0+eHJlc192aXJ0dWFsLCB2YXItPnhyZXMpOwogCXZhci0+eXJlc192aXJ0dWFsID0gbWF4KHZhci0+eXJlc192aXJ0dWFsLCB2YXItPnlyZXMpOwpAQCAtNDA5LDEzICszNDIsMTEgQEAKIAl2YXItPnRyYW5zcC5vZmZzZXQgPSB2YXItPnRyYW5zcC5sZW5ndGggPSAwOwogCiAJdmFyLT5ub25zdGQgPSAwOwotCiAJdmFyLT5oZWlnaHQgPSAtMTsKIAl2YXItPndpZHRoID0gLTE7CiAJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7Ci0KIAl2YXItPnN5bmMgPSAwOwotCXZhci0+cGl4Y2xvY2sgPSAweDA0OwkvKiAxNzE1MjE7ICovCisJdmFyLT5waXhjbG9jayA9IDB4MDQ7ICAvKiAxNzE1MjE7ICovCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQzMCwyNzQgKzM2MSwyODYgQEAKIHsKIAlzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyPWluZm8tPnBhcjsKIAotCXBhci0+eHJlcyA9IGluZm8tPnZhci54cmVzOwotCXBhci0+eXJlcyA9IGluZm8tPnZhci55cmVzOworCWlmIChwYXItPnhyZXMgIT0gaW5mby0+dmFyLnhyZXMgfHwgcGFyLT55cmVzICE9IGluZm8tPnZhci55cmVzKQl7CisJCXBhci0+eHJlcyA9IGluZm8tPnZhci54cmVzOworCQlwYXItPnlyZXMgPSBpbmZvLT52YXIueXJlczsKKwkJcGFyLT5tb2RlID0gdzEwMGZiX2dldF9tb2RlKHBhciwgJnBhci0+eHJlcywgJnBhci0+eXJlcywgMCk7CiAKLQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWluZm8tPmZpeC55cGFuc3RlcCA9IDA7CisJCWluZm8tPmZpeC55d3JhcHN0ZXAgPSAwOworCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBwYXItPnhyZXMgKiBCSVRTX1BFUl9QSVhFTCAvIDg7CiAKLQlpbmZvLT5maXgueXBhbnN0ZXAgPSAwOwotCWluZm8tPmZpeC55d3JhcHN0ZXAgPSAwOworCQlpZiAoKHBhci0+eHJlcypwYXItPnlyZXMqQklUU19QRVJfUElYRUwvOCkgPiAoTUVNX0lOVF9TSVpFKzEpKSB7CisJCQlwYXItPmV4dG1lbV9hY3RpdmUgPSAxOworCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gcGFyLT5tYWNoLT5tZW0tPnNpemUrMTsKKwkJfSBlbHNlIHsKKwkJCXBhci0+ZXh0bWVtX2FjdGl2ZSA9IDA7CisJCQlpbmZvLT5maXguc21lbV9sZW4gPSBNRU1fSU5UX1NJWkUrMTsKKwkJfQogCi0JaWYgKHBhci0+YmxhbmtpbmdfZmxhZykKLQkJdzEwMGZiX2NsZWFyX2J1ZmZlcigpOwotCi0JdzEwMGZiX2FjdGl2YXRlX3ZhcihpbmZvKTsKLQotCWlmIChwYXItPmxjZE1vZGUgPT0gTENEX01PREVfNDgwKSB7Ci0JCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICg0ODAgKiBCSVRTX1BFUl9QSVhFTCkgLyA4OwotCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDIwMDAwMDsKLQl9IGVsc2UgaWYgKHBhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV8zMjApIHsKLQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKDMyMCAqIEJJVFNfUEVSX1BJWEVMKSAvIDg7Ci0JCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NjAwMDA7Ci0JfSBlbHNlIGlmIChwYXItPmxjZE1vZGUgPT0gTENEX01PREVfMjQwKSB7Ci0JCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICgyNDAgKiBCSVRTX1BFUl9QSVhFTCkgLyA4OwotCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDYwMDAwOwotCX0gZWxzZSBpZiAocGFyLT5sY2RNb2RlID09IExDRF9NT0RFX0lOSVQgfHwgcGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzY0MCkgewotCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSAoNjQwICogQklUU19QRVJfUElYRUwpIC8gODsKLQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgyMDAwMDA7CisJCXcxMDBmYl9hY3RpdmF0ZV92YXIocGFyKTsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIAogCiAvKgotICogICAgICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucworICogIEZyYW1lIGJ1ZmZlciBvcGVyYXRpb25zCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHcxMDBmYl9vcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm93bmVyICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5mYl9jaGVja192YXIgPSB3MTAwZmJfY2hlY2tfdmFyLAotCS5mYl9zZXRfcGFyID0gdzEwMGZiX3NldF9wYXIsCisJLmZiX3NldF9wYXIgICA9IHcxMDBmYl9zZXRfcGFyLAogCS5mYl9zZXRjb2xyZWcgPSB3MTAwZmJfc2V0Y29scmVnLAotCS5mYl9ibGFuayA9IHcxMDBmYl9ibGFuaywKLQkuZmJfZmlsbHJlY3QgPSBjZmJfZmlsbHJlY3QsCi0JLmZiX2NvcHlhcmVhID0gY2ZiX2NvcHlhcmVhLAorCS5mYl9ibGFuayAgICAgPSB3MTAwZmJfYmxhbmssCisJLmZiX2ZpbGxyZWN0ICA9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgID0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0LAotCS5mYl9jdXJzb3IgPSBzb2Z0X2N1cnNvciwKKwkuZmJfY3Vyc29yICAgID0gc29mdF9jdXJzb3IsCiB9OwogCi0KLXN0YXRpYyB2b2lkIHcxMDBmYl9jbGVhcl9zY3JlZW4odTMyIG1vZGUsIGxvbmcgaW50IG9mZnNldCkKLXsKLQlpbnQgaSwgbnVtUGl4ID0gMDsKLQotCWlmIChtb2RlID09IExDRF9TSEFSUF9WR0EpCi0JCW51bVBpeCA9IDY0MCAqIDQ4MDsKLQllbHNlIGlmIChtb2RlID09IExDRF9TSEFSUF9RVkdBKQotCQludW1QaXggPSAzMjAgKiAyNDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtUGl4OyBpKyspCi0JCXdyaXRldygweGZmZmYsIHJlbWFwcGVkX2ZidWYgKyBvZmZzZXQgKyAoMippKSk7Ci19Ci0KLQotLyogTmVlZCB0byBzcGxpdCB1cCB0aGUgYnVmZmVycyB0byBzdGF5IHdpdGhpbiB0aGUgbGltaXRzIG9mIGttYWxsb2MgKi8KLSNkZWZpbmUgVzEwMF9CVUZfTlVNCTYKLXN0YXRpYyB1aW50MzJfdCAqZ1NhdmVJbWFnZVB0cltXMTAwX0JVRl9OVU1dID0geyBOVUxMIH07Ci0KLXN0YXRpYyB2b2lkIHcxMDBmYl9zYXZlX2J1ZmZlcih2b2lkKQotewotCWludCBpLCBqLCBidWZzaXplOwotCi0JYnVmc2l6ZT0oY3VycmVudF9wYXItPnhyZXMgKiBjdXJyZW50X3Bhci0+eXJlcyAqIEJJVFNfUEVSX1BJWEVMIC8gOCkgLyBXMTAwX0JVRl9OVU07Ci0JZm9yIChpID0gMDsgaSA8IFcxMDBfQlVGX05VTTsgaSsrKSB7Ci0JCWlmIChnU2F2ZUltYWdlUHRyW2ldID09IE5VTEwpCi0JCQlnU2F2ZUltYWdlUHRyW2ldID0ga21hbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGdTYXZlSW1hZ2VQdHJbaV0gPT0gTlVMTCkgewotCQkJdzEwMGZiX2NsZWFyX2J1ZmZlcigpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2MgcHJlLW9mZiBpbWFnZSBidWZmZXIgJWRcbiIsIGkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChqID0gMDsgaiA8IGJ1ZnNpemUvNDsgaisrKQotCQkJKihnU2F2ZUltYWdlUHRyW2ldICsgaikgPSByZWFkbChyZW1hcHBlZF9mYnVmICsgKGJ1ZnNpemUqaSkgKyBqKjQpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCB3MTAwZmJfcmVzdG9yZV9idWZmZXIodm9pZCkKLXsKLQlpbnQgaSwgaiwgYnVmc2l6ZTsKLQotCWJ1ZnNpemU9KGN1cnJlbnRfcGFyLT54cmVzICogY3VycmVudF9wYXItPnlyZXMgKiBCSVRTX1BFUl9QSVhFTCAvIDgpIC8gVzEwMF9CVUZfTlVNOwotCWZvciAoaSA9IDA7IGkgPCBXMTAwX0JVRl9OVU07IGkrKykgewotCQlpZiAoZ1NhdmVJbWFnZVB0cltpXSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBmaW5kIHByZS1vZmYgaW1hZ2UgYnVmZmVyICVkXG4iLCBpKTsKLQkJCXcxMDBmYl9jbGVhcl9idWZmZXIoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCAoYnVmc2l6ZS80KTsgaisrKQotCQkJd3JpdGVsKCooZ1NhdmVJbWFnZVB0cltpXSArIGopLHJlbWFwcGVkX2ZidWYgKyAoYnVmc2l6ZSppKSArIChqKjQpKTsKLQkJa2ZyZWUoZ1NhdmVJbWFnZVB0cltpXSk7Ci0JCWdTYXZlSW1hZ2VQdHJbaV0gPSBOVUxMOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCB3MTAwZmJfY2xlYXJfYnVmZmVyKHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IFcxMDBfQlVGX05VTTsgaSsrKSB7Ci0JCWtmcmVlKGdTYXZlSW1hZ2VQdHJbaV0pOwotCQlnU2F2ZUltYWdlUHRyW2ldID0gTlVMTDsKLQl9Ci19Ci0KLQogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB3MTAwZmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQorc3RhdGljIHZvaWQgdzEwMGZiX3NhdmVfdmlkbWVtKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJaW50IG1lbXNpemU7CisKKwlpZiAocGFyLT5leHRtZW1fYWN0aXZlKSB7CisJCW1lbXNpemU9cGFyLT5tYWNoLT5tZW0tPnNpemU7CisJCXBhci0+c2F2ZWRfZXh0bWVtID0gdm1hbGxvYyhtZW1zaXplKTsKKwkJaWYgKHBhci0+c2F2ZWRfZXh0bWVtKQorCQkJbWVtY3B5X2Zyb21pbyhwYXItPnNhdmVkX2V4dG1lbSwgcmVtYXBwZWRfZmJ1ZiArIChXMTAwX0ZCX0JBU0UtTUVNX1dJTkRPV19CQVNFKSwgbWVtc2l6ZSk7CisJfQorCW1lbXNpemU9TUVNX0lOVF9TSVpFOworCXBhci0+c2F2ZWRfaW50bWVtID0gdm1hbGxvYyhtZW1zaXplKTsKKwlpZiAocGFyLT5zYXZlZF9pbnRtZW0gJiYgcGFyLT5leHRtZW1fYWN0aXZlKQorCQltZW1jcHlfZnJvbWlvKHBhci0+c2F2ZWRfaW50bWVtLCByZW1hcHBlZF9mYnVmICsgKFcxMDBfRkJfQkFTRS1NRU1fSU5UX0JBU0VfVkFMVUUpLCBtZW1zaXplKTsKKwllbHNlIGlmIChwYXItPnNhdmVkX2ludG1lbSkKKwkJbWVtY3B5X2Zyb21pbyhwYXItPnNhdmVkX2ludG1lbSwgcmVtYXBwZWRfZmJ1ZiArIChXMTAwX0ZCX0JBU0UtTUVNX1dJTkRPV19CQVNFKSwgbWVtc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHcxMDBmYl9yZXN0b3JlX3ZpZG1lbShzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyKQoreworCWludCBtZW1zaXplOworCisJaWYgKHBhci0+ZXh0bWVtX2FjdGl2ZSAmJiBwYXItPnNhdmVkX2V4dG1lbSkgeworCQltZW1zaXplPXBhci0+bWFjaC0+bWVtLT5zaXplOworCQltZW1jcHlfdG9pbyhyZW1hcHBlZF9mYnVmICsgKFcxMDBfRkJfQkFTRS1NRU1fV0lORE9XX0JBU0UpLCBwYXItPnNhdmVkX2V4dG1lbSwgbWVtc2l6ZSk7CisJCXZmcmVlKHBhci0+c2F2ZWRfZXh0bWVtKTsKKwl9CisJaWYgKHBhci0+c2F2ZWRfaW50bWVtKSB7CisJCW1lbXNpemU9TUVNX0lOVF9TSVpFOworCQlpZiAocGFyLT5leHRtZW1fYWN0aXZlKQorCQkJbWVtY3B5X3RvaW8ocmVtYXBwZWRfZmJ1ZiArIChXMTAwX0ZCX0JBU0UtTUVNX0lOVF9CQVNFX1ZBTFVFKSwgcGFyLT5zYXZlZF9pbnRtZW0sIG1lbXNpemUpOworCQllbHNlCisJCQltZW1jcHlfdG9pbyhyZW1hcHBlZF9mYnVmICsgKFcxMDBfRkJfQkFTRS1NRU1fV0lORE9XX0JBU0UpLCBwYXItPnNhdmVkX2ludG1lbSwgbWVtc2l6ZSk7CisJCXZmcmVlKHBhci0+c2F2ZWRfaW50bWVtKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdzEwMGZiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHVpbnQzMl90IGxldmVsKQogewogCWlmIChsZXZlbCA9PSBTVVNQRU5EX1BPV0VSX0RPV04pIHsKIAkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAkJc3RydWN0IHcxMDBmYl9wYXIgKnBhcj1pbmZvLT5wYXI7CisJCXN0cnVjdCB3MTAwX3RnX2luZm8gKnRnID0gcGFyLT5tYWNoLT50ZzsKIAotCQl3MTAwZmJfc2F2ZV9idWZmZXIoKTsKLQkJbGNkdGdfc3VzcGVuZCgpOworCQl3MTAwZmJfc2F2ZV92aWRtZW0ocGFyKTsKKwkJaWYodGcgJiYgdGctPnN1c3BlbmQpCisJCQl0Zy0+c3VzcGVuZChwYXIpOwogCQl3MTAwX3N1c3BlbmQoVzEwMF9TVVNQRU5EX0FMTCk7Ci0JCXBhci0+YmxhbmtpbmdfZmxhZyA9IDE7CisJCXBhci0+YmxhbmtlZCA9IDE7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHcxMDBmYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IHcxMDBmYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1aW50MzJfdCBsZXZlbCkKIHsKIAlpZiAobGV2ZWwgPT0gUkVTVU1FX1BPV0VSX09OKSB7CiAJCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOworCQlzdHJ1Y3QgdzEwMF90Z19pbmZvICp0ZyA9IHBhci0+bWFjaC0+dGc7CiAKLQkJdzEwMF9yZXN1bWUoKTsKLQkJdzEwMGZiX3Jlc3RvcmVfYnVmZmVyKCk7Ci0JCWxjZHRnX3Jlc3VtZSgpOwotCQlwYXItPmJsYW5raW5nX2ZsYWcgPSAwOworCQl3MTAwX2h3X2luaXQocGFyKTsKKwkJdzEwMGZiX2FjdGl2YXRlX3ZhcihwYXIpOworCQl3MTAwZmJfcmVzdG9yZV92aWRtZW0ocGFyKTsKKwkJaWYodGcgJiYgdGctPnJlc3VtZSkKKwkJCXRnLT5yZXN1bWUocGFyKTsKKwkJcGFyLT5ibGFua2VkID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQotI2RlZmluZSB3MTAwZmJfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHcxMDBmYl9yZXN1bWUJTlVMTAorI2RlZmluZSB3MTAwZmJfc3VzcGVuZCAgTlVMTAorI2RlZmluZSB3MTAwZmJfcmVzdW1lICAgTlVMTAogI2VuZGlmCiAKIAogaW50IF9faW5pdCB3MTAwZmJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogeworCWludCBlcnIgPSAtRUlPOwogCXN0cnVjdCB3MTAwZmJfbWFjaF9pbmZvICppbmY7Ci0Jc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBOVUxMOwogCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl1bnNpZ25lZCBpbnQgY2hpcF9pZDsKIAogCWlmICghbWVtKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIHJlbWFwIHRoZSBhcmVhcyB3ZSdyZSBnb2luZyB0byB1c2UgKi8KKwkvKiBSZW1hcCB0aGUgY2hpcCBiYXNlIGFkZHJlc3MgKi8KIAlyZW1hcHBlZF9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQrVzEwMF9DRkdfQkFTRSwgVzEwMF9DRkdfTEVOKTsKIAlpZiAocmVtYXBwZWRfYmFzZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTzsKKwkJZ290byBvdXQ7CiAKKwkvKiBNYXAgdGhlIHJlZ2lzdGVyIHNwYWNlICovCiAJcmVtYXBwZWRfcmVncyA9IGlvcmVtYXBfbm9jYWNoZShtZW0tPnN0YXJ0K1cxMDBfUkVHX0JBU0UsIFcxMDBfUkVHX0xFTik7Ci0JaWYgKHJlbWFwcGVkX3JlZ3MgPT0gTlVMTCkgewotCQlpb3VubWFwKHJlbWFwcGVkX2Jhc2UpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJaWYgKHJlbWFwcGVkX3JlZ3MgPT0gTlVMTCkKKwkJZ290byBvdXQ7CiAKLQlyZW1hcHBlZF9mYnVmID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQrTUVNX0VYVF9CQVNFX1ZBTFVFLCBSRU1BUFBFRF9GQl9MRU4pOwotCWlmIChyZW1hcHBlZF9mYnVmID09IE5VTEwpIHsKLQkJaW91bm1hcChyZW1hcHBlZF9iYXNlKTsKLQkJaW91bm1hcChyZW1hcHBlZF9yZWdzKTsKLQkJcmV0dXJuIC1FSU87CisJLyogSWRlbnRpZnkgdGhlIGNoaXAgKi8KKwlwcmludGsoIkZvdW5kICIpOworCWNoaXBfaWQgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1DSElQX0lEKTsKKwlzd2l0Y2goY2hpcF9pZCkgeworCQljYXNlIENISVBfSURfVzEwMDogIHByaW50aygidzEwMCIpOyAgYnJlYWs7CisJCWNhc2UgQ0hJUF9JRF9XMzIwMDogcHJpbnRrKCJ3MzIwMCIpOyBicmVhazsKKwkJY2FzZSBDSElQX0lEX1czMjIwOiBwcmludGsoInczMjIwIik7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJVbmtub3duIGltYWdlb24gY2hpcCBJRFxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CiAJfQorCXByaW50aygiIGF0IDB4JTA4bHguXG4iLCBtZW0tPnN0YXJ0K1cxMDBfQ0ZHX0JBU0UpOworCisJLyogUmVtYXAgdGhlIGZyYW1lYnVmZmVyICovCisJcmVtYXBwZWRfZmJ1ZiA9IGlvcmVtYXBfbm9jYWNoZShtZW0tPnN0YXJ0K01FTV9XSU5ET1dfQkFTRSwgTUVNX1dJTkRPV19TSVpFKTsKKwlpZiAocmVtYXBwZWRfZmJ1ZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKIAogCWluZm89ZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCB3MTAwZmJfcGFyKSwgZGV2KTsKIAlpZiAoIWluZm8pIHsKLQkJaW91bm1hcChyZW1hcHBlZF9iYXNlKTsKLQkJaW91bm1hcChyZW1hcHBlZF9yZWdzKTsKLQkJaW91bm1hcChyZW1hcHBlZF9mYnVmKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAotCWluZm8tPmRldmljZT1kZXY7CiAJcGFyID0gaW5mby0+cGFyOwotCWN1cnJlbnRfcGFyPWluZm8tPnBhcjsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKIAogCWluZiA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlwYXItPnBoYWRhZGogPSBpbmYtPnBoYWRhZGo7Ci0JcGFyLT5jb21hZGogPSBpbmYtPmNvbWFkajsKLQlwYXItPmZhc3RzeXNjbGtfbW9kZSA9IDc1OwotCXBhci0+bGNkTW9kZSA9IExDRF9NT0RFX0lOSVQ7Ci0JcGFyLT5yb3RhdGlvbl9mbGFnPTA7Ci0JcGFyLT5ibGFua2luZ19mbGFnPTA7Ci0JdzEwMGZiX3NzcF9zZW5kID0gaW5mLT53MTAwZmJfc3NwX3NlbmQ7CisJcGFyLT5jaGlwX2lkID0gY2hpcF9pZDsKKwlwYXItPm1hY2ggPSBpbmY7CisJcGFyLT5mYXN0cGxsX21vZGUgPSAwOworCXBhci0+YmxhbmtlZCA9IDA7CiAKLQl3MTAwX2h3X2luaXQoKTsKLQl3MTAwX3B3bV9zZXR1cCgpOworCXBhci0+cGxsX3RhYmxlPXcxMDBfZ2V0X3h0YWxfdGFibGUoaW5mLT54dGFsX2ZyZXEpOworCWlmICghcGFyLT5wbGxfdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBtYXRjaGluZyBYdGFsIGRlZmluaXRpb24gZm91bmRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGttYWxsb2Moc2l6ZW9mICh1MzIpICogTUFYX1BBTEVUVEVTLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8tPnBzZXVkb19wYWxldHRlKSB7Ci0JCWlvdW5tYXAocmVtYXBwZWRfYmFzZSk7Ci0JCWlvdW5tYXAocmVtYXBwZWRfcmVncyk7Ci0JCWlvdW5tYXAocmVtYXBwZWRfZmJ1Zik7Ci0JCXJldHVybiAtRU5PTUVNOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKIAl9CiAKIAlpbmZvLT5mYm9wcyA9ICZ3MTAwZmJfb3BzOwogCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CiAJaW5mby0+bm9kZSA9IC0xOwotCWluZm8tPnNjcmVlbl9iYXNlID0gcmVtYXBwZWRfZmJ1ZjsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IHJlbWFwcGVkX2ZidWYgKyAoVzEwMF9GQl9CQVNFLU1FTV9XSU5ET1dfQkFTRSk7CiAJaW5mby0+c2NyZWVuX3NpemUgPSBSRU1BUFBFRF9GQl9MRU47CiAKLQlpbmZvLT52YXIueHJlcyA9IDY0MDsKKwlzdHJjcHkoaW5mby0+Zml4LmlkLCAidzEwMGZiIik7CisJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJaW5mby0+Zml4LnR5cGVfYXV4ID0gMDsKKwlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gbWVtLT5zdGFydCtXMTAwX0ZCX0JBU0U7CisJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBtZW0tPnN0YXJ0K1cxMDBfUkVHX0JBU0U7CisJaW5mby0+Zml4Lm1taW9fbGVuID0gVzEwMF9SRUdfTEVOOworCisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkgPCAwKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXBhci0+bW9kZSA9ICZpbmYtPm1vZGVsaXN0WzBdOworCWlmKGluZi0+aW5pdF9tb2RlICYgSU5JVF9NT0RFX1JPVEFURUQpIHsKKwkJaW5mby0+dmFyLnhyZXMgPSBwYXItPm1vZGUtPnlyZXM7CisJCWluZm8tPnZhci55cmVzID0gcGFyLT5tb2RlLT54cmVzOworCX0KKwllbHNlIHsKKwkJaW5mby0+dmFyLnhyZXMgPSBwYXItPm1vZGUtPnhyZXM7CisJCWluZm8tPnZhci55cmVzID0gcGFyLT5tb2RlLT55cmVzOworCX0KKworCWlmKGluZi0+aW5pdF9tb2RlICY9IElOSVRfTU9ERV9GTElQUEVEKQorCQlwYXItPmZsaXAgPSAxOworCWVsc2UKKwkJcGFyLT5mbGlwID0gMDsKKwogCWluZm8tPnZhci54cmVzX3ZpcnR1YWwgPSBpbmZvLT52YXIueHJlczsKLQlpbmZvLT52YXIueXJlcyA9IDQ4MDsKIAlpbmZvLT52YXIueXJlc192aXJ0dWFsID0gaW5mby0+dmFyLnlyZXM7Ci0JaW5mby0+dmFyLnBpeGNsb2NrID0gMHgwNDsJLyogMTcxNTIxOyAqLworCWluZm8tPnZhci5waXhjbG9jayA9IDB4MDQ7ICAvKiAxNzE1MjE7ICovCiAJaW5mby0+dmFyLnN5bmMgPSAwOwogCWluZm8tPnZhci5ncmF5c2NhbGUgPSAwOwogCWluZm8tPnZhci54b2Zmc2V0ID0gaW5mby0+dmFyLnlvZmZzZXQgPSAwOwogCWluZm8tPnZhci5hY2NlbF9mbGFncyA9IDA7CiAJaW5mby0+dmFyLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfTk9XOwogCi0Jc3RyY3B5KGluZm8tPmZpeC5pZCwgIncxMDBmYiIpOwotCWluZm8tPmZpeC50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwotCWluZm8tPmZpeC50eXBlX2F1eCA9IDA7Ci0JaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfTk9ORTsKLQlpbmZvLT5maXguc21lbV9zdGFydCA9IG1lbS0+c3RhcnQrTUVNX0VYVF9CQVNFX1ZBTFVFOwotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gbWVtLT5zdGFydCtXMTAwX1JFR19CQVNFOwotCWluZm8tPmZpeC5tbWlvX2xlbiA9IFcxMDBfUkVHX0xFTjsKKwl3MTAwX2h3X2luaXQocGFyKTsKIAotCXcxMDBmYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbyk7CisJaWYgKHcxMDBmYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbykgPCAwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCXcxMDBmYl9zZXRfcGFyKGluZm8pOwogCiAJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgewotCQlrZnJlZShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSk7Ci0JCWlvdW5tYXAocmVtYXBwZWRfYmFzZSk7Ci0JCWlvdW5tYXAocmVtYXBwZWRfcmVncyk7Ci0JCWlvdW5tYXAocmVtYXBwZWRfZmJ1Zik7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKIAl9CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZmFzdHN5c2Nsayk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2Zhc3RwbGxjbGspOwogCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdfcmVhZCk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZ193cml0ZSk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JvdGF0aW9uKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZmxpcCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLCBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQpOwogCXJldHVybiAwOworb3V0OgorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisJa2ZyZWUoaW5mby0+cHNldWRvX3BhbGV0dGUpOworCWlmIChyZW1hcHBlZF9mYnVmICE9IE5VTEwpCisJCWlvdW5tYXAocmVtYXBwZWRfZmJ1Zik7CisJaWYgKHJlbWFwcGVkX3JlZ3MgIT0gTlVMTCkKKwkJaW91bm1hcChyZW1hcHBlZF9yZWdzKTsKKwlpZiAocmVtYXBwZWRfYmFzZSAhPSBOVUxMKQorCQlpb3VubWFwKHJlbWFwcGVkX2Jhc2UpOworCWlmIChpbmZvKQorCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCXJldHVybiBlcnI7CiB9CiAKIAogc3RhdGljIGludCB3MTAwZmJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB3MTAwZmJfcGFyICpwYXI9aW5mby0+cGFyOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2Zhc3RzeXNjbGspOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9mYXN0cGxsY2xrKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnX3JlYWQpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdfd3JpdGUpOwotCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yb3RhdGlvbik7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2ZsaXApOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAotCXcxMDBmYl9jbGVhcl9idWZmZXIoKTsKKwl2ZnJlZShwYXItPnNhdmVkX2ludG1lbSk7CisJdmZyZWUocGFyLT5zYXZlZF9leHRtZW0pOwogCWtmcmVlKGluZm8tPnBzZXVkb19wYWxldHRlKTsKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCiAJaW91bm1hcChyZW1hcHBlZF9iYXNlKTsKIAlpb3VubWFwKHJlbWFwcGVkX3JlZ3MpOwpAQCAtNzIxLDEwICs2NjQsNTQgQEAKIAl1ZGVsYXkoMTAwKTsKIH0KIAorc3RhdGljIHZvaWQgdzEwMF91cGRhdGVfZGlzYWJsZSh2b2lkKQoreworCXVuaW9uIGRpc3BfZGJfYnVmX2NudGxfd3JfdSBkaXNwX2RiX2J1Zl93cl9jbnRsOworCisJLyogUHJldmVudCBkaXNwbGF5IHVwZGF0ZXMgKi8KKwlkaXNwX2RiX2J1Zl93cl9jbnRsLmYuZGJfYnVmX2NudGwgPSAweDFlOworCWRpc3BfZGJfYnVmX3dyX2NudGwuZi51cGRhdGVfZGJfYnVmID0gMDsKKwlkaXNwX2RiX2J1Zl93cl9jbnRsLmYuZW5fZGJfYnVmID0gMDsKKwl3cml0ZWwoKHUzMikgKGRpc3BfZGJfYnVmX3dyX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tRElTUF9EQl9CVUZfQ05UTCk7Cit9CisKK3N0YXRpYyB2b2lkIHcxMDBfdXBkYXRlX2VuYWJsZSh2b2lkKQoreworCXVuaW9uIGRpc3BfZGJfYnVmX2NudGxfd3JfdSBkaXNwX2RiX2J1Zl93cl9jbnRsOworCisJLyogRW5hYmxlIGRpc3BsYXkgdXBkYXRlcyAqLworCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5kYl9idWZfY250bCA9IDB4MWU7CisJZGlzcF9kYl9idWZfd3JfY250bC5mLnVwZGF0ZV9kYl9idWYgPSAxOworCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5lbl9kYl9idWYgPSAxOworCXdyaXRlbCgodTMyKSAoZGlzcF9kYl9idWZfd3JfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RCX0JVRl9DTlRMKTsKK30KKwordW5zaWduZWQgbG9uZyB3MTAwZmJfZ3Bpb19yZWFkKGludCBwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwlpZiAocG9ydD09VzEwMF9HUElPX1BPUlRfQSkKKwkJdmFsdWUgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1HUElPX0RBVEEpOworCWVsc2UKKwkJdmFsdWUgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1HUElPX0RBVEEyKTsKKworCXJldHVybiB2YWx1ZTsKK30KKwordm9pZCB3MTAwZmJfZ3Bpb193cml0ZShpbnQgcG9ydCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlpZiAocG9ydD09VzEwMF9HUElPX1BPUlRfQSkKKwkJdmFsdWUgPSB3cml0ZWwodmFsdWUsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQSk7CisJZWxzZQorCQl2YWx1ZSA9IHdyaXRlbCh2YWx1ZSwgcmVtYXBwZWRfcmVncyArIG1tR1BJT19EQVRBMik7Cit9CitFWFBPUlRfU1lNQk9MKHcxMDBmYl9ncGlvX3JlYWQpOworRVhQT1JUX1NZTUJPTCh3MTAwZmJfZ3Bpb193cml0ZSk7CisKIC8qCiAgKiBJbml0aWFsaXphdGlvbiBvZiBjcml0aWNhbCB3MTAwIGhhcmR3YXJlCiAgKi8KLXN0YXRpYyB2b2lkIHcxMDBfaHdfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgdzEwMF9od19pbml0KHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCiB7CiAJdTMyIHRlbXAzMjsKIAl1bmlvbiBjaWZfY250bF91IGNpZl9jbnRsOwpAQCAtNzM1LDggKzcyMiw4IEBACiAJdW5pb24gY3B1X2RlZmF1bHRzX3UgY3B1X2RlZmF1bHQ7CiAJdW5pb24gY2lmX3dyaXRlX2RiZ191IGNpZl93cml0ZV9kYmc7CiAJdW5pb24gd3JhcF9zdGFydF9kaXJfdSB3cmFwX3N0YXJ0X2RpcjsKLQl1bmlvbiBtY19leHRfbWVtX2xvY2F0aW9uX3UgbWNfZXh0X21lbV9sb2M7CiAJdW5pb24gY2lmX2lvX3UgY2lmX2lvOworCXN0cnVjdCB3MTAwX2dwaW9fcmVncyAqZ3BpbyA9IHBhci0+bWFjaC0+Z3BpbzsKIAogCXcxMDBfc29mdF9yZXNldCgpOwogCkBAIC03OTEsMTkgKzc3OCw2IEBACiAJY2ZncmVnX2Jhc2UuZi5jZmdyZWdfYmFzZSA9IFcxMDBfQ0ZHX0JBU0U7CiAJd3JpdGVsKCh1MzIpIChjZmdyZWdfYmFzZS52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DRkdSRUdfQkFTRSk7CiAKLQkvKiBUaGlzIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGludGVybmFsIHcxMDAgYWRkcmVzc2VzICovCi0Jd3JpdGVsKDB4MTVGRjEwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX0ZCX0xPQ0FUSU9OKTsKLQotCW1jX2V4dF9tZW1fbG9jLnZhbCA9IGRlZk1DX0VYVF9NRU1fTE9DQVRJT047Ci0JbWNfZXh0X21lbV9sb2MuZi5tY19leHRfbWVtX3N0YXJ0ID0gTUVNX0VYVF9CQVNFX1ZBTFVFID4+IDg7Ci0JbWNfZXh0X21lbV9sb2MuZi5tY19leHRfbWVtX3RvcCA9IE1FTV9FWFRfVE9QX1ZBTFVFID4+IDg7Ci0Jd3JpdGVsKCh1MzIpIChtY19leHRfbWVtX2xvYy52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OKTsKLQotCWlmICgoY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfMjQwKSB8fCAoY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfMzIwKSkKLQkJdzEwMF9Jbml0RXh0TWVtKExDRF9TSEFSUF9RVkdBKTsKLQllbHNlCi0JCXcxMDBfSW5pdEV4dE1lbShMQ0RfU0hBUlBfVkdBKTsKLQogCXdyYXBfc3RhcnRfZGlyLnZhbCA9IGRlZldSQVBfU1RBUlRfRElSOwogCXdyYXBfc3RhcnRfZGlyLmYuc3RhcnRfYWRkciA9IFdSQVBfQlVGX0JBU0VfVkFMVUUgPj4gMTsKIAl3cml0ZWwoKHUzMikgKHdyYXBfc3RhcnRfZGlyLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVdSQVBfU1RBUlRfRElSKTsKQEAgLTgxMywzMzkgKzc4NywzMDAgQEAKIAl3cml0ZWwoKHUzMikgKHdyYXBfdG9wX2Rpci52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1XUkFQX1RPUF9ESVIpOwogCiAJd3JpdGVsKCh1MzIpIDB4MjQ0MCwgcmVtYXBwZWRfcmVncyArIG1tUkJCTV9DTlRMKTsKKworCS8qIFNldCB0aGUgaGFyZHdhcmUgdG8gNTY1IGNvbG91ciAqLworCXRlbXAzMiA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREVCVUcyKTsKKwl0ZW1wMzIgJj0gMHhmZjdmZmZmZjsKKwl0ZW1wMzIgfD0gMHgwMDgwMDAwMDsKKwl3cml0ZWwodGVtcDMyLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RFQlVHMik7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBHUElPIGxpbmVzICovCisJaWYgKGdwaW8pIHsKKwkJd3JpdGVsKGdwaW8tPmluaXRfZGF0YTEsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQSk7CisJCXdyaXRlbChncGlvLT5pbml0X2RhdGEyLCByZW1hcHBlZF9yZWdzICsgbW1HUElPX0RBVEEyKTsKKwkJd3JpdGVsKGdwaW8tPmdwaW9fZGlyMSwgIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fQ05UTDEpOworCQl3cml0ZWwoZ3Bpby0+Z3Bpb19vZTEsICAgcmVtYXBwZWRfcmVncyArIG1tR1BJT19DTlRMMik7CisJCXdyaXRlbChncGlvLT5ncGlvX2RpcjIsICByZW1hcHBlZF9yZWdzICsgbW1HUElPX0NOVEwzKTsKKwkJd3JpdGVsKGdwaW8tPmdwaW9fb2UyLCAgIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fQ05UTDQpOworCX0KIH0KIAogCi0vKgotICogVHlwZXMKLSAqLwotCi1zdHJ1Y3QgcGxsX3Bhcm0gewotCXUxNiBmcmVxOwkJLyogZGVzaXJlZCBGb3V0IGZvciBQTEwgKi8KLQl1OCBNOwotCXU4IE5faW50OwotCXU4IE5fZmFjOwotCXU4IHRmZ29hbDsKLQl1OCBsb2NrX3RpbWU7Ci19OwotCiBzdHJ1Y3QgcG93ZXJfc3RhdGUgewogCXVuaW9uIGNsa19waW5fY250bF91IGNsa19waW5fY250bDsKIAl1bmlvbiBwbGxfcmVmX2ZiX2Rpdl91IHBsbF9yZWZfZmJfZGl2OwogCXVuaW9uIHBsbF9jbnRsX3UgcGxsX2NudGw7CiAJdW5pb24gc2Nsa19jbnRsX3Ugc2Nsa19jbnRsOwogCXVuaW9uIHBjbGtfY250bF91IHBjbGtfY250bDsKLQl1bmlvbiBjbGtfdGVzdF9jbnRsX3UgY2xrX3Rlc3RfY250bDsKIAl1bmlvbiBwd3JtZ3RfY250bF91IHB3cm1ndF9jbnRsOwotCXUzMiBmcmVxOwkJLyogRm91dCBmb3IgUExMIGNhbGlicmF0aW9uICovCi0JdTggdGYxMDA7CQkvKiBmb3IgcGxsIGNhbGlicmF0aW9uICovCi0JdTggdGY4MDsJCS8qIGZvciBwbGwgY2FsaWJyYXRpb24gKi8KLQl1OCB0ZjIwOwkJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IE07CQkJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IE5faW50OwkJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IE5fZmFjOwkJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IGxvY2tfdGltZTsJLyogZm9yIHBsbCBjYWxpYnJhdGlvbiAqLwotCXU4IHRmZ29hbDsJCS8qIGZvciBwbGwgY2FsaWJyYXRpb24gKi8KLQl1OCBhdXRvX21vZGU7CS8qIGhhcmR3YXJlIGF1dG8gc3dpdGNoPyAqLwotCXU4IHB3bV9tb2RlOwkJLyogMCBmYXN0LCAxIG5vcm1hbC9zbG93ICovCi0JdTE2IGZhc3Rfc2NsazsJLyogZmFzdCBjbGsgZnJlcSAqLwotCXUxNiBub3JtX3NjbGs7CS8qIHNsb3cgY2xrIGZyZXEgKi8KKwlpbnQgYXV0b19tb2RlOyAgLyogc3lzdGVtIGNsb2NrIGF1dG8gY2hhbmdpbmc/ICovCiB9OwogCiAKLS8qCi0gKiBHbG9iYWwgc3RhdGUgdmFyaWFibGVzCi0gKi8KLQogc3RhdGljIHN0cnVjdCBwb3dlcl9zdGF0ZSB3MTAwX3B3cl9zdGF0ZTsKIAotLyogVGhpcyB0YWJsZSBpcyBzcGVjaWZpYyBmb3IgMTIuNU1IeiByZWYgY3J5c3RhbC4gICovCi1zdGF0aWMgc3RydWN0IHBsbF9wYXJtIGdQTExUYWJsZVtdID0gewotICAgIC8qZnJlcSAgICAgTSAgIE5faW50ICAgIE5fZmFjICB0ZmdvYWwgIGxvY2tfdGltZSAqLwotICAgIHsgNTAsICAgICAgMCwgICAxLCAgICAgICAwLCAgICAgMHhFMCwgICAgICAgIDU2fSwgLyogIDUwLjAwIE1IeiAqLwotICAgIHsgNzUsICAgICAgMCwgICA1LCAgICAgICAwLCAgICAgMHhERSwJICAgICAzN30sIC8qICA3NS4wMCBNSHogKi8KLSAgICB7MTAwLCAgICAgIDAsICAgNywgICAgICAgMCwgICAgIDB4RTAsICAgICAgICAyOH0sIC8qIDEwMC4wMCBNSHogKi8KLSAgICB7MTI1LCAgICAgIDAsICAgOSwgICAgICAgMCwgICAgIDB4RTAsICAgICAgICAyMn0sIC8qIDEyNS4wMCBNSHogKi8KLSAgICB7MTUwLCAgICAgIDAsICAgMTEsICAgICAgMCwgICAgIDB4RTAsICAgICAgICAxN30sIC8qIDE1MC4wMCBNSHogKi8KLSAgICB7ICAwLCAgICAgIDAsICAgMCwgICAgICAgMCwgICAgICAgIDAsICAgICAgICAgMH0gIC8qIFRlcm1pbmF0b3IgKi8KKy8qIFRoZSBQTEwgRm91dCBpcyBkZXRlcm1pbmVkIGJ5IChYdGFsRnJlcS8oTSsxKSkgKiAoKE5faW50KzEpICsgKE5fZmFjLzgpKSAqLworCisvKiAxMi41TUh6IENyeXN0YWwgUExMIFRhYmxlICovCitzdGF0aWMgc3RydWN0IHcxMDBfcGxsX2luZm8geHRhbF8xMjUwMDAwMFtdID0geworCS8qZnJlcSAgICAgTSAgIE5faW50ICAgIE5fZmFjICB0ZmdvYWwgIGxvY2tfdGltZSAqLworCXsgNTAsICAgICAgMCwgICAxLCAgICAgICAwLCAgICAgMHhlMCwgICAgICAgIDU2fSwgIC8qICA1MC4wMCBNSHogKi8KKwl7IDc1LCAgICAgIDAsICAgNSwgICAgICAgMCwgICAgIDB4ZGUsICAgICAgICAzN30sICAvKiAgNzUuMDAgTUh6ICovCisJezEwMCwgICAgICAwLCAgIDcsICAgICAgIDAsICAgICAweGUwLCAgICAgICAgMjh9LCAgLyogMTAwLjAwIE1IeiAqLworCXsxMjUsICAgICAgMCwgICA5LCAgICAgICAwLCAgICAgMHhlMCwgICAgICAgIDIyfSwgIC8qIDEyNS4wMCBNSHogKi8KKwl7MTUwLCAgICAgIDAsICAgMTEsICAgICAgMCwgICAgIDB4ZTAsICAgICAgICAxN30sICAvKiAxNTAuMDAgTUh6ICovCisJeyAgMCwgICAgICAwLCAgIDAsICAgICAgIDAsICAgICAgICAwLCAgICAgICAgIDB9LCAgLyogVGVybWluYXRvciAqLwogfTsKIAorLyogMTQuMzE4TUh6IENyeXN0YWwgUExMIFRhYmxlICovCitzdGF0aWMgc3RydWN0IHcxMDBfcGxsX2luZm8geHRhbF8xNDMxODAwMFtdID0geworCS8qZnJlcSAgICAgTSAgIE5faW50ICAgIE5fZmFjICB0ZmdvYWwgIGxvY2tfdGltZSAqLworCXsgNDAsICAgICAgNCwgICAxMywgICAgICAwLCAgICAgMHhlMCwgICAgICAgIDgwfSwgLyogdGZnb2FsIGd1ZXNzZWQgKi8KKwl7IDUwLCAgICAgIDEsICAgNiwgICAgICAgMCwgICAgIDB4ZTAsCSAgICAgNjR9LCAvKiAgNTAuMDUgTUh6ICovCisJeyA1NywgICAgICAyLCAgIDExLCAgICAgIDAsICAgICAweGUwLCAgICAgICAgNTN9LCAvKiB0ZmdvYWwgZ3Vlc3NlZCAqLworCXsgNzUsICAgICAgMCwgICA0LCAgICAgICAzLCAgICAgMHhlMCwJICAgICA0M30sIC8qICA3NS4wOCBNSHogKi8KKwl7MTAwLCAgICAgIDAsICAgNiwgICAgICAgMCwgICAgIDB4ZTAsICAgICAgICAzMn0sIC8qIDEwMC4xMCBNSHogKi8KKwl7ICAwLCAgICAgIDAsICAgMCwgICAgICAgMCwgICAgICAgIDAsICAgICAgICAgMH0sCit9OwogCi1zdGF0aWMgdTggdzEwMF9wbGxfZ2V0X3Rlc3Rjb3VudCh1OCB0ZXN0Y2xrX3NlbCkKKy8qIDE2TUh6IENyeXN0YWwgUExMIFRhYmxlICovCitzdGF0aWMgc3RydWN0IHcxMDBfcGxsX2luZm8geHRhbF8xNjAwMDAwMFtdID0geworCS8qZnJlcSAgICAgTSAgIE5faW50ICAgIE5fZmFjICB0ZmdvYWwgIGxvY2tfdGltZSAqLworCXsgNzIsICAgICAgMSwgICA4LCAgICAgICAwLCAgICAgMHhlMCwgICAgICAgIDQ4fSwgLyogdGZnb2FsIGd1ZXNzZWQgKi8KKwl7IDk1LCAgICAgIDEsICAgMTAsICAgICAgNywgICAgIDB4ZTAsICAgICAgICAzOH0sIC8qIHRmZ29hbCBndWVzc2VkICovCisJeyA5NiwgICAgICAxLCAgIDExLCAgICAgIDAsICAgICAweGUwLCAgICAgICAgMzZ9LCAvKiB0ZmdvYWwgZ3Vlc3NlZCAqLworCXsgIDAsICAgICAgMCwgICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgICAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxsX2VudHJpZXMgeworCWludCB4dGFsX2ZyZXE7CisJc3RydWN0IHcxMDBfcGxsX2luZm8gKnBsbF90YWJsZTsKK30gdzEwMF9wbGxfdGFibGVzW10gPSB7CisJeyAxMjUwMDAwMCwgJnh0YWxfMTI1MDAwMDBbMF0gfSwKKwl7IDE0MzE4MDAwLCAmeHRhbF8xNDMxODAwMFswXSB9LAorCXsgMTYwMDAwMDAsICZ4dGFsXzE2MDAwMDAwWzBdIH0sCisJeyAwIH0sCit9OworCitzdHJ1Y3QgdzEwMF9wbGxfaW5mbyAqdzEwMF9nZXRfeHRhbF90YWJsZSh1bnNpZ25lZCBpbnQgZnJlcSkKIHsKLQl1ZGVsYXkoNSk7CisJc3RydWN0IHBsbF9lbnRyaWVzICpwbGxfZW50cnkgPSB3MTAwX3BsbF90YWJsZXM7CiAKLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYuc3RhcnRfY2hlY2tfZnJlcSA9IDB4MDsKLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYudGVzdGNsa19zZWwgPSB0ZXN0Y2xrX3NlbDsKLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYudHN0Y291bnRfcnN0ID0gMHgxOwkvKnJlc2V0IHRlc3QgY291bnQgKi8KLQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7Ci0JdzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC5mLnRzdGNvdW50X3JzdCA9IDB4MDsKLQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7Ci0KLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYuc3RhcnRfY2hlY2tfZnJlcSA9IDB4MTsKLQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7Ci0KLQl1ZGVsYXkoMjApOwotCi0JdzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC52YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYuc3RhcnRfY2hlY2tfZnJlcSA9IDB4MDsKLQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7Ci0KLQlyZXR1cm4gdzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC5mLnRlc3RfY291bnQ7CisJZG8geworCQlpZiAoZnJlcSA9PSBwbGxfZW50cnktPnh0YWxfZnJlcSkKKwkJCXJldHVybiBwbGxfZW50cnktPnBsbF90YWJsZTsKKwkJcGxsX2VudHJ5Kys7CisJfSB3aGlsZSAocGxsX2VudHJ5LT54dGFsX2ZyZXEpOworCXJldHVybiAwOwogfQogCiAKLXN0YXRpYyB1OCB3MTAwX3BsbF9hZGp1c3Qodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdzEwMF9nZXRfdGVzdGNvdW50KHVuc2lnbmVkIGludCB0ZXN0Y2xrX3NlbCkKIHsKKwl1bmlvbiBjbGtfdGVzdF9jbnRsX3UgY2xrX3Rlc3RfY250bDsKKworCXVkZWxheSg1KTsKKworCS8qIFNlbGVjdCB0aGUgdGVzdCBjbG9jayBzb3VyY2UgYW5kIHJlc2V0ICovCisJY2xrX3Rlc3RfY250bC5mLnN0YXJ0X2NoZWNrX2ZyZXEgPSAweDA7CisJY2xrX3Rlc3RfY250bC5mLnRlc3RjbGtfc2VsID0gdGVzdGNsa19zZWw7CisJY2xrX3Rlc3RfY250bC5mLnRzdGNvdW50X3JzdCA9IDB4MTsgLyogc2V0IHJlc2V0ICovCisJd3JpdGVsKCh1MzIpIChjbGtfdGVzdF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19URVNUX0NOVEwpOworCisJY2xrX3Rlc3RfY250bC5mLnRzdGNvdW50X3JzdCA9IDB4MDsgLyogY2xlYXIgcmVzZXQgKi8KKwl3cml0ZWwoKHUzMikgKGNsa190ZXN0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7CisKKwkvKiBSdW4gY2xvY2sgdGVzdCAqLworCWNsa190ZXN0X2NudGwuZi5zdGFydF9jaGVja19mcmVxID0gMHgxOworCXdyaXRlbCgodTMyKSAoY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKKworCS8qIEdpdmUgdGhlIHRlc3QgdGltZSB0byBjb21wbGV0ZSAqLworCXVkZWxheSgyMCk7CisKKwkvKiBSZXR1cm4gdGhlIHJlc3VsdCAqLworCWNsa190ZXN0X2NudGwudmFsID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tQ0xLX1RFU1RfQ05UTCk7CisJY2xrX3Rlc3RfY250bC5mLnN0YXJ0X2NoZWNrX2ZyZXEgPSAweDA7CisJd3JpdGVsKCh1MzIpIChjbGtfdGVzdF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19URVNUX0NOVEwpOworCisJcmV0dXJuIGNsa190ZXN0X2NudGwuZi50ZXN0X2NvdW50OworfQorCisKK3N0YXRpYyBpbnQgdzEwMF9wbGxfYWRqdXN0KHN0cnVjdCB3MTAwX3BsbF9pbmZvICpwbGwpCit7CisJdW5zaWduZWQgaW50IHRmODA7CisJdW5zaWduZWQgaW50IHRmMjA7CisKKwkvKiBJbml0aWFsIFNldHRpbmdzICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHdkbiA9IDB4MDsgICAgIC8qIHBvd2VyIGRvd24gKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9yZXNldCA9IDB4MDsgICAgLyogbm90IHJlc2V0ICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfdGNwb2ZmID0gMHgxOyAgIC8qIEhpLVogKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wdmcgPSAweDA7ICAgICAgLyogVkNPIGdhaW4gPSAwICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfdmNvZnIgPSAweDA7ICAgIC8qIFZDTyBmcmVxdWVuY3kgcmFuZ2UgY29udHJvbCA9IG9mZiAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2lvZmZzZXQgPSAweDA7ICAvKiBjdXJyZW50IG9mZnNldCBpbnNpZGUgVkNPID0gMCAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Jpbmdfb2ZmID0gMHgwOworCisJLyogV2FpIE1pbmcgODAgcGVyY2VudCBvZiBWREQgMS4zViBnaXZlcyAxLjA0ViwgbWluaW11bSBvcGVyYXRpbmcgdm9sdGFnZSBpcyAxLjA4VgorCSAqIHRoZXJlZm9yZSwgY29tbWVudGVkIG91dCB0aGUgZm9sbG93aW5nIGxpbmVzCisJICogdGY4MCBtZWFudCB0ZjEwMAorCSAqLwogCWRvIHsKLQkJLyogV2FpIE1pbmcgODAgcGVyY2VudCBvZiBWREQgMS4zViBnaXZlcyAxLjA0ViwgbWluaW11bSBvcGVyYXRpbmcgdm9sdGFnZSBpcyAxLjA4VgotCQkgKiB0aGVyZWZvcmUsIGNvbW1lbnRlZCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lcwotCQkgKiB0ZjgwIG1lYW50IHRmMTAwCi0JCSAqIHNldCBWQ08gaW5wdXQgPSAwLjggKiBWREQKLQkJICovCisJCS8qIHNldCBWQ08gaW5wdXQgPSAwLjggKiBWREQgKi8KIAkJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfZGFjdGFsID0gMHhkOwogCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKIAotCQl3MTAwX3B3cl9zdGF0ZS50ZjgwID0gdzEwMF9wbGxfZ2V0X3Rlc3Rjb3VudCgweDEpOwkvKiBQTExDTEsgKi8KLQkJaWYgKHcxMDBfcHdyX3N0YXRlLnRmODAgPj0gKHcxMDBfcHdyX3N0YXRlLnRmZ29hbCkpIHsKKwkJdGY4MCA9IHcxMDBfZ2V0X3Rlc3Rjb3VudChURVNUQ0xLX1NSQ19QTEwpOworCQlpZiAodGY4MCA+PSAocGxsLT50ZmdvYWwpKSB7CiAJCQkvKiBzZXQgVkNPIGlucHV0ID0gMC4yICogVkREICovCiAJCQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9kYWN0YWwgPSAweDc7CiAJCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKIAotCQkJdzEwMF9wd3Jfc3RhdGUudGYyMCA9IHcxMDBfcGxsX2dldF90ZXN0Y291bnQoMHgxKTsJLyogUExMQ0xLICovCi0JCQlpZiAodzEwMF9wd3Jfc3RhdGUudGYyMCA8PSAodzEwMF9wd3Jfc3RhdGUudGZnb2FsKSkKLQkJCQlyZXR1cm4gMTsgLy8gU3VjY2VzcworCQkJdGYyMCA9IHcxMDBfZ2V0X3Rlc3Rjb3VudChURVNUQ0xLX1NSQ19QTEwpOworCQkJaWYgKHRmMjAgPD0gKHBsbC0+dGZnb2FsKSkKKwkJCQlyZXR1cm4gMTsgIC8qIFN1Y2Nlc3MgKi8KIAogCQkJaWYgKCh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF92Y29mciA9PSAweDApICYmCi0JCQkgICAgKCh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wdmcgPT0gMHg3KSB8fAotCQkJICAgICAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCA9PSAweDApKSkgeworCQkJCSgodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHZnID09IDB4NykgfHwKKwkJCQkodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCA9PSAweDApKSkgewogCQkJCS8qIHNsb3cgVkNPIGNvbmZpZyAqLwogCQkJCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3Zjb2ZyID0gMHgxOwogCQkJCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B2ZyA9IDB4MDsKIAkJCQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9pb2Zmc2V0ID0gMHgwOwotCQkJCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwudmFsKSwKLQkJCQkJcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CiAJCWlmICgodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCkgPCAweDMpIHsKIAkJCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2lvZmZzZXQgKz0gMHgxOwotCQkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B2ZykgPCAweDcpIHsKKwkJfSBlbHNlIGlmICgodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHZnKSA8IDB4NykgewogCQkJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfaW9mZnNldCA9IDB4MDsKIAkJCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B2ZyArPSAweDE7Ci0JCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKLQkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7ICAvKiBFcnJvciAqLwogCQl9Ci0JCXJldHVybiAwOyAvLyBlcnJvcgogCX0gd2hpbGUoMSk7CiB9CiAKIAogLyoKICAqIHcxMDBfcGxsX2NhbGlicmF0aW9uCi0gKiAgICAgICAgICAgICAgICBmcmVxID0gdGFyZ2V0IGZyZXF1ZW5jeSBvZiB0aGUgUExMCi0gKiAgICAgICAgICAgICAgICAobm90ZTogY3J5c3RhbCA9IDE0LjNNSHopCiAgKi8KLXN0YXRpYyB1OCB3MTAwX3BsbF9jYWxpYnJhdGlvbih1MzIgZnJlcSkKK3N0YXRpYyBpbnQgdzEwMF9wbGxfY2FsaWJyYXRpb24oc3RydWN0IHcxMDBfcGxsX2luZm8gKnBsbCkKIHsKLQl1OCBzdGF0dXM7CisJaW50IHN0YXR1czsKIAotCS8qIGluaXRpYWwgc2V0dGluZyAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3B3ZG4gPSAweDA7CQkvKiBwb3dlciBkb3duICovCi0JdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcmVzZXQgPSAweDA7CQkvKiBub3QgcmVzZXQgKi8KLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF90Y3BvZmYgPSAweDE7CS8qIEhpLVogKi8KLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wdmcgPSAweDA7CQkvKiBWQ08gZ2FpbiA9IDAgKi8KLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF92Y29mciA9IDB4MDsJCS8qIFZDTyBmcmVxdWVuY3kgcmFuZ2UgY29udHJvbCA9IG9mZiAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2lvZmZzZXQgPSAweDA7CS8qIGN1cnJlbnQgb2Zmc2V0IGluc2lkZSBWQ08gPSAwICovCi0JdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcmluZ19vZmYgPSAweDA7Ci0Jd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7CisJc3RhdHVzID0gdzEwMF9wbGxfYWRqdXN0KHBsbCk7CiAKLQkvKiBjaGVjayBmb3IgKHRmODAgPj0gdGZnb2FsKSAmJiAodGYyMCA9PCB0ZmdvYWwpICovCi0JaWYgKCh3MTAwX3B3cl9zdGF0ZS50ZjgwIDwgdzEwMF9wd3Jfc3RhdGUudGZnb2FsKSB8fCAodzEwMF9wd3Jfc3RhdGUudGYyMCA+IHcxMDBfcHdyX3N0YXRlLnRmZ29hbCkpIHsKLQkJc3RhdHVzPXcxMDBfcGxsX2FkanVzdCgpOwotCX0KIAkvKiBQTEwgUmVzZXQgQW5kIExvY2sgKi8KLQogCS8qIHNldCBWQ08gaW5wdXQgPSAwLjUgKiBWREQgKi8KIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9kYWN0YWwgPSAweGE7CiAJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7CiAKLQkvKiByZXNldCB0aW1lICovCi0JdWRlbGF5KDEpOworCXVkZWxheSgxKTsgIC8qIHJlc2V0IHRpbWUgKi8KIAogCS8qIGVuYWJsZSBjaGFyZ2UgcHVtcCAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3RjcG9mZiA9IDB4MDsJLyogbm9ybWFsICovCisJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfdGNwb2ZmID0gMHgwOyAgLyogbm9ybWFsICovCiAJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QTExfQ05UTCk7CiAKLQkvKiBzZXQgVkNPIGlucHV0ID0gSGktWiAqLwotCS8qIGRpc2FibGUgREFDICovCisJLyogc2V0IFZDTyBpbnB1dCA9IEhpLVosIGRpc2FibGUgREFDICovCiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfZGFjdGFsID0gMHgwOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGxsX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwogCi0JLyogbG9jayB0aW1lICovCi0JdWRlbGF5KDQwMCk7CS8qIGRlbGF5IDQwMCB1cyAqLworCXVkZWxheSg0MDApOyAgLyogbG9jayB0aW1lICovCiAKIAkvKiBQTEwgbG9ja2VkICovCiAKLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3NyY19zZWwgPSAweDE7CS8qIFBMTCBjbG9jayAqLwotCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVNDTEtfQ05UTCk7Ci0KLQl3MTAwX3B3cl9zdGF0ZS50ZjEwMCA9IHcxMDBfcGxsX2dldF90ZXN0Y291bnQoMHgxKTsJLyogUExMQ0xLICovCi0KIAlyZXR1cm4gc3RhdHVzOwogfQogCiAKLXN0YXRpYyB1OCB3MTAwX3BsbF9zZXRfY2xrKHZvaWQpCitzdGF0aWMgaW50IHcxMDBfcGxsX3NldF9jbGsoc3RydWN0IHcxMDBfcGxsX2luZm8gKnBsbCkKIHsKLQl1OCBzdGF0dXM7CisJaW50IHN0YXR1czsKIAotCWlmICh3MTAwX3B3cl9zdGF0ZS5hdXRvX21vZGUgPT0gMSkJLyogYXV0byBtb2RlICovCisJaWYgKHcxMDBfcHdyX3N0YXRlLmF1dG9fbW9kZSA9PSAxKSAgLyogYXV0byBtb2RlICovCiAJewotCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9mYXN0X25vbWxfaHdfZW4gPSAweDA7CS8qIGRpc2FibGUgZmFzdCB0byBub3JtYWwgKi8KLQkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbm9tbF9mYXN0X2h3X2VuID0gMHgwOwkvKiBkaXNhYmxlIG5vcm1hbCB0byBmYXN0ICovCisJCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2Zhc3Rfbm9tbF9od19lbiA9IDB4MDsgIC8qIGRpc2FibGUgZmFzdCB0byBub3JtYWwgKi8KKwkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbm9tbF9mYXN0X2h3X2VuID0gMHgwOyAgLyogZGlzYWJsZSBub3JtYWwgdG8gZmFzdCAqLwogCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBXUk1HVF9DTlRMKTsKIAl9CiAKLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3NyY19zZWwgPSAweDA7CS8qIGNyeXN0YWwgY2xvY2sgKi8KKwkvKiBTZXQgc3lzdGVtIGNsb2NrIHNvdXJjZSB0byBYVEFMIHdoaWxzdCBhZGp1c3RpbmcgdGhlIFBMTCEgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3NyY19zZWwgPSBDTEtfU1JDX1hUQUw7CiAJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tU0NMS19DTlRMKTsKIAotCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX3JlZl9kaXYgPSB3MTAwX3B3cl9zdGF0ZS5NOwotCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9pbnQgPSB3MTAwX3B3cl9zdGF0ZS5OX2ludDsKLQl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9mYl9kaXZfZnJhYyA9IHcxMDBfcHdyX3N0YXRlLk5fZmFjOwotCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2xvY2tfdGltZSA9IHcxMDBfcHdyX3N0YXRlLmxvY2tfdGltZTsKKwl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9yZWZfZGl2ID0gcGxsLT5NOworCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9pbnQgPSBwbGwtPk5faW50OworCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9mcmFjID0gcGxsLT5OX2ZhYzsKKwl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9sb2NrX3RpbWUgPSBwbGwtPmxvY2tfdGltZTsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9SRUZfRkJfRElWKTsKIAogCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX21vZGVfcmVxID0gMDsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBXUk1HVF9DTlRMKTsKIAotCXN0YXR1cyA9IHcxMDBfcGxsX2NhbGlicmF0aW9uICh3MTAwX3B3cl9zdGF0ZS5mcmVxKTsKKwlzdGF0dXMgPSB3MTAwX3BsbF9jYWxpYnJhdGlvbihwbGwpOwogCi0JaWYgKHcxMDBfcHdyX3N0YXRlLmF1dG9fbW9kZSA9PSAxKQkvKiBhdXRvIG1vZGUgKi8KKwlpZiAodzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID09IDEpICAvKiBhdXRvIG1vZGUgKi8KIAl7Ci0JCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2Zhc3Rfbm9tbF9od19lbiA9IDB4MTsJLyogcmVlbmFibGUgZmFzdCB0byBub3JtYWwgKi8KLQkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbm9tbF9mYXN0X2h3X2VuID0gMHgxOwkvKiByZWVuYWJsZSBub3JtYWwgdG8gZmFzdCAgKi8KKwkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fZmFzdF9ub21sX2h3X2VuID0gMHgxOyAgLyogcmVlbmFibGUgZmFzdCB0byBub3JtYWwgKi8KKwkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbm9tbF9mYXN0X2h3X2VuID0gMHgxOyAgLyogcmVlbmFibGUgbm9ybWFsIHRvIGZhc3QgICovCiAJCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tUFdSTUdUX0NOVEwpOwogCX0KIAlyZXR1cm4gc3RhdHVzOwogfQogCi0KLS8qIGFzc3VtZSByZWZlcmVuY2UgY3J5c3RhbCBjbGsgaXMgMTIuNU1IeiwKLSAqIGFuZCB0aGF0IGRvdWJsaW5nIGlzIG5vdCBlbmFibGVkLgotICoKLSAqIEZyZXEgPSAxMiA9PSAxMi41TUh6LgotICovCi1zdGF0aWMgdTE2IHcxMDBfc2V0X3Nsb3dzeXNjbGsodTE2IGZyZXEpCisvKiBmcmVxID0gdGFyZ2V0IGZyZXF1ZW5jeSBvZiB0aGUgUExMICovCitzdGF0aWMgaW50IHcxMDBfc2V0X3BsbF9mcmVxKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIsIHVuc2lnbmVkIGludCBmcmVxKQogewotCWlmICh3MTAwX3B3cl9zdGF0ZS5ub3JtX3NjbGsgPT0gZnJlcSkKLQkJcmV0dXJuIGZyZXE7CisJc3RydWN0IHcxMDBfcGxsX2luZm8gKnBsbCA9IHBhci0+cGxsX3RhYmxlOwogCi0JaWYgKHcxMDBfcHdyX3N0YXRlLmF1dG9fbW9kZSA9PSAxKQkvKiBhdXRvIG1vZGUgKi8KLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZnJlcSA9PSAxMikgewotCQl3MTAwX3B3cl9zdGF0ZS5ub3JtX3NjbGsgPSBmcmVxOwotCQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X3Nsb3cgPSAweDA7CS8qIFBzbG93ID0gMSAqLwotCQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3NyY19zZWwgPSAweDA7CS8qIGNyeXN0YWwgc3JjICovCi0KLQkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tU0NMS19DTlRMKTsKLQotCQl3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwuZi54dGFsaW5fcG1fZW4gPSAweDE7Ci0JCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19QSU5fQ05UTCk7Ci0KLQkJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fZW5hYmxlID0gMHgxOwotCQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9tb2RlX3JlcSA9IDB4MTsKLQkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QV1JNR1RfQ05UTCk7Ci0JCXcxMDBfcHdyX3N0YXRlLnB3bV9tb2RlID0gMTsJLyogbm9ybWFsIG1vZGUgKi8KLQkJcmV0dXJuIGZyZXE7Ci0JfSBlbHNlCi0JCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB1MTYgdzEwMF9zZXRfZmFzdHN5c2Nsayh1MTYgZnJlcSkKLXsKLQl1MTYgcGxsX2ZyZXE7Ci0JaW50IGk7Ci0KLQl3aGlsZSgxKSB7Ci0JCXBsbF9mcmVxID0gKHUxNikgKGZyZXEgKiAodzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9mYXN0ICsgMSkpOwotCQlpID0gMDsKLQkJZG8gewotCQkJaWYgKHBsbF9mcmVxID09IGdQTExUYWJsZVtpXS5mcmVxKSB7Ci0JCQkJdzEwMF9wd3Jfc3RhdGUuZnJlcSA9IGdQTExUYWJsZVtpXS5mcmVxICogMTAwMDAwMDsKLQkJCQl3MTAwX3B3cl9zdGF0ZS5NID0gZ1BMTFRhYmxlW2ldLk07Ci0JCQkJdzEwMF9wd3Jfc3RhdGUuTl9pbnQgPSBnUExMVGFibGVbaV0uTl9pbnQ7Ci0JCQkJdzEwMF9wd3Jfc3RhdGUuTl9mYWMgPSBnUExMVGFibGVbaV0uTl9mYWM7Ci0JCQkJdzEwMF9wd3Jfc3RhdGUudGZnb2FsID0gZ1BMTFRhYmxlW2ldLnRmZ29hbDsKLQkJCQl3MTAwX3B3cl9zdGF0ZS5sb2NrX3RpbWUgPSBnUExMVGFibGVbaV0ubG9ja190aW1lOwotCQkJCXcxMDBfcHdyX3N0YXRlLnRmMjAgPSAweGZmOwkvKiBzZXQgaGlnaGVzdCAqLwotCQkJCXcxMDBfcHdyX3N0YXRlLnRmODAgPSAweDAwOwkvKiBzZXQgbG93ZXN0ICovCi0KLQkJCQl3MTAwX3BsbF9zZXRfY2xrKCk7Ci0JCQkJdzEwMF9wd3Jfc3RhdGUucHdtX21vZGUgPSAwOwkvKiBmYXN0IG1vZGUgKi8KLQkJCQl3MTAwX3B3cl9zdGF0ZS5mYXN0X3NjbGsgPSBmcmVxOwotCQkJCXJldHVybiBmcmVxOwotCQkJfQotCQkJaSsrOwotCQl9IHdoaWxlKGdQTExUYWJsZVtpXS5mcmVxKTsKLQotCQlpZiAodzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID09IDEpCi0JCQlicmVhazsKLQotCQlpZiAodzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9mYXN0ID09IDApCi0JCQlicmVhazsKLQotCQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X2Zhc3QgLT0gMTsKLQkJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tU0NMS19DTlRMKTsKLQl9CisJZG8geworCQlpZiAoZnJlcSA9PSBwbGwtPmZyZXEpIHsKKwkJCXJldHVybiB3MTAwX3BsbF9zZXRfY2xrKHBsbCk7CisJCX0KKwkJcGxsKys7CisJfSB3aGlsZShwbGwtPmZyZXEpOwogCXJldHVybiAwOwogfQogCi0KIC8qIFNldCB1cCBhbiBpbml0aWFsIHN0YXRlLiAgU29tZSB2YWx1ZXMvZmllbGRzIHNldAogICAgaGVyZSB3aWxsIGJlIG92ZXJ3cml0dGVuLiAqLwotc3RhdGljIHZvaWQgdzEwMF9wd21fc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIHcxMDBfcHdtX3NldHVwKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCiB7CiAJdzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLmYub3NjX2VuID0gMHgxOwogCXcxMDBfcHdyX3N0YXRlLmNsa19waW5fY250bC5mLm9zY19nYWluID0gMHgxZjsKIAl3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwuZi5kb250X3VzZV94dGFsaW4gPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLmYueHRhbGluX3BtX2VuID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLmNsa19waW5fY250bC5mLnh0YWxpbl9kYmxfZW4gPSAweDA7CS8qIG5vIGZyZXEgZG91YmxpbmcgKi8KKwl3MTAwX3B3cl9zdGF0ZS5jbGtfcGluX2NudGwuZi54dGFsaW5fZGJsX2VuID0gcGFyLT5tYWNoLT54dGFsX2RibCA/IDEgOiAwOwogCXcxMDBfcHdyX3N0YXRlLmNsa19waW5fY250bC5mLmNnX2RlYnVnID0gMHgwOwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Bpbl9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbUNMS19QSU5fQ05UTCk7CiAKLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3NyY19zZWwgPSAweDA7CS8qIENyeXN0YWwgQ2xrICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9mYXN0ID0gMHgwOwkvKiBQZmFzdCA9IDEgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3NyY19zZWwgPSBDTEtfU1JDX1hUQUw7CisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9mYXN0ID0gMHgwOyAgLyogUGZhc3QgPSAxICovCiAJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19jbGtvbl9oeXMgPSAweDM7Ci0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9zbG93ID0gMHgwOwkvKiBQc2xvdyA9IDEgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX3Bvc3RfZGl2X3Nsb3cgPSAweDA7ICAvKiBQc2xvdyA9IDEgKi8KIAl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5kaXNwX2NnX29rMnN3aXRjaF9lbiA9IDB4MDsKLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX3JlZyA9IDB4MDsJLyogRHluYW1pYyAqLwotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfZGlzcCA9IDB4MDsJLyogRHluYW1pYyAqLwotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfbWMgPSAweDA7CS8qIER5bmFtaWMgKi8KLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2V4dG1jID0gMHgwOwkvKiBEeW5hbWljICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9jcCA9IDB4MDsJLyogRHluYW1pYyAqLwotCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfZTIgPSAweDA7CS8qIER5bmFtaWMgKi8KLQl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2UzID0gMHgwOwkvKiBEeW5hbWljICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9pZGN0ID0gMHgwOwkvKiBEeW5hbWljICovCi0JdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9iaXN0ID0gMHgwOwkvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9yZWcgPSAweDA7ICAgIC8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2Rpc3AgPSAweDA7ICAgLyogRHluYW1pYyAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfbWMgPSAweDA7ICAgICAvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9leHRtYyA9IDB4MDsgIC8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2NwID0gMHgwOyAgICAgLyogRHluYW1pYyAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfZTIgPSAweDA7ICAgICAvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19mb3JjZV9lMyA9IDB4MDsgICAgIC8qIER5bmFtaWMgKi8KKwl3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwuZi5zY2xrX2ZvcmNlX2lkY3QgPSAweDA7ICAgLyogRHluYW1pYyAqLworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfZm9yY2VfYmlzdCA9IDB4MDsgICAvKiBEeW5hbWljICovCiAJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuYnVzeV9leHRlbmRfY3AgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuYnVzeV9leHRlbmRfZTIgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuYnVzeV9leHRlbmRfZTMgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuYnVzeV9leHRlbmRfaWRjdCA9IDB4MDsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1TQ0xLX0NOVEwpOwogCi0JdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19zcmNfc2VsID0gMHgwOwkvKiBDcnlzdGFsIENsayAqLwotCXcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC5mLnBjbGtfcG9zdF9kaXYgPSAweDE7CS8qIFAgPSAyICovCi0JdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19mb3JjZV9kaXNwID0gMHgwOwkvKiBEeW5hbWljICovCisJdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19zcmNfc2VsID0gQ0xLX1NSQ19YVEFMOworCXcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC5mLnBjbGtfcG9zdF9kaXYgPSAweDE7ICAgIC8qIFAgPSAyICovCisJdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19mb3JjZV9kaXNwID0gMHgwOyAgLyogRHluYW1pYyAqLwogCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBDTEtfQ05UTCk7CiAKLQl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9yZWZfZGl2ID0gMHgwOwkvKiBNID0gMSAqLwotCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9pbnQgPSAweDA7CS8qIE4gPSAxLjAgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9yZWZfZGl2ID0gMHgwOyAgICAgLyogTSA9IDEgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfcmVmX2ZiX2Rpdi5mLnBsbF9mYl9kaXZfaW50ID0gMHgwOyAgLyogTiA9IDEuMCAqLwogCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX2ZiX2Rpdl9mcmFjID0gMHgwOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9yZWZfZmJfZGl2LmYucGxsX3Jlc2V0X3RpbWUgPSAweDU7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX3JlZl9mYl9kaXYuZi5wbGxfbG9ja190aW1lID0gMHhmZjsKQEAgLTExNTQsNyArMTA4OSw3IEBACiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcHdkbiA9IDB4MTsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9yZXNldCA9IDB4MTsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9wbV9lbiA9IDB4MDsKLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9tb2RlID0gMHgwOwkvKiB1c2VzIFZDTyBjbG9jayAqLworCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX21vZGUgPSAweDA7ICAvKiB1c2VzIFZDTyBjbG9jayAqLwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3JlZmNsa19zZWwgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfZmJjbGtfc2VsID0gMHgwOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3RjcG9mZiA9IDB4MDsKQEAgLTExNjQsMjIxICsxMDk5LDI3NiBAQAogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX2lvZmZzZXQgPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfcGVjY19tb2RlID0gMHgwOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX3BlY2Nfc2NvbiA9IDB4MDsKLQl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9kYWN0YWwgPSAweDA7CS8qIEhpLVogKi8KKwl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9kYWN0YWwgPSAweDA7ICAvKiBIaS1aICovCiAJdzEwMF9wd3Jfc3RhdGUucGxsX2NudGwuZi5wbGxfY3BfY2xpcCA9IDB4MzsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9jb25mID0gMHgyOwogCXcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLmYucGxsX21iY3RybCA9IDB4MjsKIAl3MTAwX3B3cl9zdGF0ZS5wbGxfY250bC5mLnBsbF9yaW5nX29mZiA9IDB4MDsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBsbF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKIAotCXcxMDBfcHdyX3N0YXRlLmNsa190ZXN0X2NudGwuZi50ZXN0Y2xrX3NlbCA9IDB4MTsJLyogUExMQ0xLIChmb3IgdGVzdGluZykgKi8KLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYuc3RhcnRfY2hlY2tfZnJlcSA9IDB4MDsKLQl3MTAwX3B3cl9zdGF0ZS5jbGtfdGVzdF9jbnRsLmYudHN0Y291bnRfcnN0ID0gMHgwOwotCXdyaXRlbCgodTMyKSAodzEwMF9wd3Jfc3RhdGUuY2xrX3Rlc3RfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfVEVTVF9DTlRMKTsKLQogCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2VuYWJsZSA9IDB4MDsKLQl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9tb2RlX3JlcSA9IDB4MTsJLyogbm9ybWFsIG1vZGUgKDAsIDEsIDMpICovCisJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbW9kZV9yZXEgPSAweDE7ICAvKiBub3JtYWwgbW9kZSAoMCwgMSwgMykgKi8KIAl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV93YWtldXBfY29uZCA9IDB4MDsKIAl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9mYXN0X25vbWxfaHdfZW4gPSAweDA7CiAJdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbm9tbF9mYXN0X2h3X2VuID0gMHgwOwotCXcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLmYucHdtX2Zhc3Rfbm9tbF9jb25kID0gMHgxOwkvKiBQTTQsRU5HICovCi0JdzEwMF9wd3Jfc3RhdGUucHdybWd0X2NudGwuZi5wd21fbm9tbF9mYXN0X2NvbmQgPSAweDE7CS8qIFBNNCxFTkcgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9mYXN0X25vbWxfY29uZCA9IDB4MTsgIC8qIFBNNCxFTkcgKi8KKwl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9ub21sX2Zhc3RfY29uZCA9IDB4MTsgIC8qIFBNNCxFTkcgKi8KIAl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9pZGxlX3RpbWVyID0gMHhGRjsKIAl3MTAwX3B3cl9zdGF0ZS5wd3JtZ3RfY250bC5mLnB3bV9idXN5X3RpbWVyID0gMHhGRjsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnB3cm1ndF9jbnRsLnZhbCksIHJlbWFwcGVkX3JlZ3MgKyBtbVBXUk1HVF9DTlRMKTsKIAotCXcxMDBfcHdyX3N0YXRlLmF1dG9fbW9kZSA9IDA7CS8qIG1hbnVhbCBtb2RlICovCi0JdzEwMF9wd3Jfc3RhdGUucHdtX21vZGUgPSAxOwkvKiBub3JtYWwgbW9kZSAoMCwgMSwgMikgKi8KLQl3MTAwX3B3cl9zdGF0ZS5mcmVxID0gNTAwMDAwMDA7CS8qIDUwIE1IeiAqLwotCXcxMDBfcHdyX3N0YXRlLk0gPSAzOwkvKiBNID0gNCAqLwotCXcxMDBfcHdyX3N0YXRlLk5faW50ID0gNjsJLyogTiA9IDcuMCAqLwotCXcxMDBfcHdyX3N0YXRlLk5fZmFjID0gMDsKLQl3MTAwX3B3cl9zdGF0ZS50ZmdvYWwgPSAweEUwOwotCXcxMDBfcHdyX3N0YXRlLmxvY2tfdGltZSA9IDU2OwotCXcxMDBfcHdyX3N0YXRlLnRmMjAgPSAweGZmOwkvKiBzZXQgaGlnaGVzdCAqLwotCXcxMDBfcHdyX3N0YXRlLnRmODAgPSAweDAwOwkvKiBzZXQgbG93ZXN0ICovCi0JdzEwMF9wd3Jfc3RhdGUudGYxMDAgPSAweDAwOwkvKiBzZXQgbG93ZXN0ICovCi0JdzEwMF9wd3Jfc3RhdGUuZmFzdF9zY2xrID0gNTA7CS8qIDUwLjAgTUh6ICovCi0JdzEwMF9wd3Jfc3RhdGUubm9ybV9zY2xrID0gMTI7CS8qIDEyLjUgTUh6ICovCisJdzEwMF9wd3Jfc3RhdGUuYXV0b19tb2RlID0gMDsgIC8qIG1hbnVhbCBtb2RlICovCiB9CiAKIAotc3RhdGljIHZvaWQgdzEwMF9pbml0X3NoYXJwX2xjZCh1MzIgbW9kZSkKKy8qCisgKiBTZXR1cCB0aGUgdzEwMCBjbG9ja3MgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZQorICovCitzdGF0aWMgdm9pZCB3MTAwX2luaXRfY2xvY2tzKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJc3RydWN0IHcxMDBfbW9kZSAqbW9kZSA9IHBhci0+bW9kZTsKKworCWlmIChtb2RlLT5waXhjbGtfc3JjID09IENMS19TUkNfUExMIHx8IG1vZGUtPnN5c2Nsa19zcmMgPT0gQ0xLX1NSQ19QTEwpCisJCXcxMDBfc2V0X3BsbF9mcmVxKHBhciwgKHBhci0+ZmFzdHBsbF9tb2RlICYmIG1vZGUtPmZhc3RfcGxsX2ZyZXEpID8gbW9kZS0+ZmFzdF9wbGxfZnJlcSA6IG1vZGUtPnBsbF9mcmVxKTsKKworCXcxMDBfcHdyX3N0YXRlLnNjbGtfY250bC5mLnNjbGtfc3JjX3NlbCA9IG1vZGUtPnN5c2Nsa19zcmM7CisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9mYXN0ID0gbW9kZS0+c3lzY2xrX2RpdmlkZXI7CisJdzEwMF9wd3Jfc3RhdGUuc2Nsa19jbnRsLmYuc2Nsa19wb3N0X2Rpdl9zbG93ID0gbW9kZS0+c3lzY2xrX2RpdmlkZXI7CisJd3JpdGVsKCh1MzIpICh3MTAwX3B3cl9zdGF0ZS5zY2xrX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tU0NMS19DTlRMKTsKK30KKworc3RhdGljIHZvaWQgdzEwMF9pbml0X2xjZChzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyKQogewogCXUzMiB0ZW1wMzI7Ci0JdW5pb24gZGlzcF9kYl9idWZfY250bF93cl91IGRpc3BfZGJfYnVmX3dyX2NudGw7CisJc3RydWN0IHcxMDBfbW9kZSAqbW9kZSA9IHBhci0+bW9kZTsKKwlzdHJ1Y3QgdzEwMF9nZW5fcmVncyAqcmVncyA9IHBhci0+bWFjaC0+cmVnczsKKwl1bmlvbiBhY3RpdmVfaF9kaXNwX3UgYWN0aXZlX2hfZGlzcDsKKwl1bmlvbiBhY3RpdmVfdl9kaXNwX3UgYWN0aXZlX3ZfZGlzcDsKKwl1bmlvbiBncmFwaGljX2hfZGlzcF91IGdyYXBoaWNfaF9kaXNwOworCXVuaW9uIGdyYXBoaWNfdl9kaXNwX3UgZ3JhcGhpY192X2Rpc3A7CisJdW5pb24gY3J0Y190b3RhbF91IGNydGNfdG90YWw7CiAKLQkvKiBQcmV2ZW50IGRpc3BsYXkgdXBkYXRlcyAqLwotCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5kYl9idWZfY250bCA9IDB4MWU7Ci0JZGlzcF9kYl9idWZfd3JfY250bC5mLnVwZGF0ZV9kYl9idWYgPSAwOwotCWRpc3BfZGJfYnVmX3dyX2NudGwuZi5lbl9kYl9idWYgPSAwOwotCXdyaXRlbCgodTMyKSAoZGlzcF9kYl9idWZfd3JfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RCX0JVRl9DTlRMKTsKKwkvKiB3MzIwMCBkb2VzbnQgbGlrZSB1bmRlZmluZWQgYml0cyBiZWluZyBzZXQgc28gemVybyByZWdpc3RlciB2YWx1ZXMgZmlyc3QgKi8KIAotCXN3aXRjaChtb2RlKSB7Ci0JY2FzZSBMQ0RfU0hBUlBfUVZHQToKLQkJdzEwMF9zZXRfc2xvd3N5c2NsaygxMik7CS8qIHVzZSBjcnlzdGFsIC0tIDEyLjVNSHogKi8KLQkJLyogbm90IHVzZSBQTEwgKi8KKwlhY3RpdmVfaF9kaXNwLnZhbCA9IDA7CisJYWN0aXZlX2hfZGlzcC5mLmFjdGl2ZV9oX3N0YXJ0PW1vZGUtPmxlZnRfbWFyZ2luOworCWFjdGl2ZV9oX2Rpc3AuZi5hY3RpdmVfaF9lbmQ9bW9kZS0+bGVmdF9tYXJnaW4gKyBtb2RlLT54cmVzOworCXdyaXRlbChhY3RpdmVfaF9kaXNwLnZhbCwgcmVtYXBwZWRfcmVncyArIG1tQUNUSVZFX0hfRElTUCk7CiAKLQkJd3JpdGVsKDB4N0ZGRjgwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX0VYVF9NRU1fTE9DQVRJT04pOwotCQl3cml0ZWwoMHg4NUZGODAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfRkJfTE9DQVRJT04pOwotCQl3cml0ZWwoMHgwMDAwMDAwMywgcmVtYXBwZWRfcmVncyArIG1tTENEX0ZPUk1BVCk7Ci0JCXdyaXRlbCgweDAwQ0YxQzA2LCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX0NUUkwpOwotCQl3cml0ZWwoMHgwMTQxMDE0NSwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19UT1RBTCk7Ci0JCXdyaXRlbCgweDAxMTcwMDI3LCByZW1hcHBlZF9yZWdzICsgbW1BQ1RJVkVfSF9ESVNQKTsKLQkJd3JpdGVsKDB4MDE0MTAwMDEsIHJlbWFwcGVkX3JlZ3MgKyBtbUFDVElWRV9WX0RJU1ApOwotCQl3cml0ZWwoMHgwMTE3MDAyNywgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19IX0RJU1ApOwotCQl3cml0ZWwoMHgwMTQxMDAwMSwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19WX0RJU1ApOwotCQl3cml0ZWwoMHg4MTE3MDAyNywgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19TUyk7Ci0JCXdyaXRlbCgweEEwMTQwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0xTKTsKLQkJd3JpdGVsKDB4MDA0MDAwMDgsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfUkVWKTsKLQkJd3JpdGVsKDB4QTAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfRENMSyk7Ci0JCXdyaXRlbCgweEMwMTQwMDE0LCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dTKTsKLQkJd3JpdGVsKDB4MDAwMTAxNDEsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfVlBPU19HUyk7Ci0JCXdyaXRlbCgweDgwMTUwMTBGLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dDTEspOwotCQl3cml0ZWwoMHg4MDEwMDExMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19HT0UpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19GUkFNRSk7Ci0JCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0ZSQU1FX1ZQT1MpOwotCQl3cml0ZWwoMHgwMUNDMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tTENERF9DTlRMMSk7Ci0JCXdyaXRlbCgweDAwMDNGRkZGLCByZW1hcHBlZF9yZWdzICsgbW1MQ0REX0NOVEwyKTsKLQkJd3JpdGVsKDB4MDBGRkZGMEQsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMSk7Ci0JCXdyaXRlbCgweDAwM0YzMDAzLCByZW1hcHBlZF9yZWdzICsgbW1HRU5MQ0RfQ05UTDIpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19ERUZBVUxUX0NPVU5UKTsKLQkJd3JpdGVsKDB4MDAwMEZGMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRF9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJd3JpdGVsKDB4MDAwMTAyYWEsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMyk7Ci0JCXdyaXRlbCgweDAwODAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX09GRlNFVCk7Ci0JCXdyaXRlbCgweDAwMDAwMWUwLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX1BJVENIKTsKLQkJd3JpdGVsKDB4MDAwMDAwYmYsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fREFUQSk7Ci0JCXdyaXRlbCgweDAzYzBmZWZmLCByZW1hcHBlZF9yZWdzICsgbW1HUElPX0NOVEwyKTsKLQkJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUdQSU9fQ05UTDEpOwotCQl3cml0ZWwoMHg0MTA2MDAxMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19QUzFfQUNUSVZFKTsKLQkJYnJlYWs7Ci0JY2FzZSBMQ0RfU0hBUlBfVkdBOgotCQl3MTAwX3NldF9zbG93c3lzY2xrKDEyKTsJLyogdXNlIGNyeXN0YWwgLS0gMTIuNU1IeiAqLwotCQl3MTAwX3NldF9mYXN0c3lzY2xrKGN1cnJlbnRfcGFyLT5mYXN0c3lzY2xrX21vZGUpOwkvKiB1c2UgUExMIC0tIDc1LjBNSHogKi8KLQkJdzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19zcmNfc2VsID0gMHgxOwotCQl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX3Bvc3RfZGl2ID0gMHgyOwotCQl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QQ0xLX0NOVEwpOwotCQl3cml0ZWwoMHgxNUZGMTAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfRkJfTE9DQVRJT04pOwotCQl3cml0ZWwoMHg5RkZGODAwMCwgcmVtYXBwZWRfcmVncyArIG1tTUNfRVhUX01FTV9MT0NBVElPTik7Ci0JCXdyaXRlbCgweDAwMDAwMDAzLCByZW1hcHBlZF9yZWdzICsgbW1MQ0RfRk9STUFUKTsKLQkJd3JpdGVsKDB4MDBERTFENjYsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfQ1RSTCk7CisJYWN0aXZlX3ZfZGlzcC52YWwgPSAwOworCWFjdGl2ZV92X2Rpc3AuZi5hY3RpdmVfdl9zdGFydD1tb2RlLT51cHBlcl9tYXJnaW47CisJYWN0aXZlX3ZfZGlzcC5mLmFjdGl2ZV92X2VuZD1tb2RlLT51cHBlcl9tYXJnaW4gKyBtb2RlLT55cmVzOworCXdyaXRlbChhY3RpdmVfdl9kaXNwLnZhbCwgcmVtYXBwZWRfcmVncyArIG1tQUNUSVZFX1ZfRElTUCk7CiAKLQkJd3JpdGVsKDB4MDI4MzAyOEIsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfVE9UQUwpOwotCQl3cml0ZWwoMHgwMjM2MDA1NiwgcmVtYXBwZWRfcmVncyArIG1tQUNUSVZFX0hfRElTUCk7Ci0JCXdyaXRlbCgweDAyODMwMDAzLCByZW1hcHBlZF9yZWdzICsgbW1BQ1RJVkVfVl9ESVNQKTsKLQkJd3JpdGVsKDB4MDIzNjAwNTYsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfSF9ESVNQKTsKLQkJd3JpdGVsKDB4MDI4MzAwMDMsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfVl9ESVNQKTsKLQkJd3JpdGVsKDB4ODIzNjAwNTYsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfU1MpOwotCQl3cml0ZWwoMHhBMDI4MDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19MUyk7Ci0JCXdyaXRlbCgweDAwNDAwMDA4LCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1JFVik7Ci0JCXdyaXRlbCgweEEwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0RDTEspOwotCQl3cml0ZWwoMHg4MDI4MDAyOCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19HUyk7Ci0JCXdyaXRlbCgweDAyODMwMDAyLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1ZQT1NfR1MpOwotCQl3cml0ZWwoMHg4MDE1MDEwRiwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19HQ0xLKTsKLQkJd3JpdGVsKDB4ODAxMDAxMTAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfR09FKTsKLQkJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfRlJBTUUpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19GUkFNRV9WUE9TKTsKLQkJd3JpdGVsKDB4MDFDQzAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRERfQ05UTDEpOwotCQl3cml0ZWwoMHgwMDAzRkZGRiwgcmVtYXBwZWRfcmVncyArIG1tTENERF9DTlRMMik7Ci0JCXdyaXRlbCgweDAwRkZGRjBELCByZW1hcHBlZF9yZWdzICsgbW1HRU5MQ0RfQ05UTDEpOwotCQl3cml0ZWwoMHgwMDNGMzAwMywgcmVtYXBwZWRfcmVncyArIG1tR0VOTENEX0NOVEwyKTsKLQkJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfREVGQVVMVF9DT1VOVCk7Ci0JCXdyaXRlbCgweDAwMDBGRjAwLCByZW1hcHBlZF9yZWdzICsgbW1MQ0RfQkFDS0dST1VORF9DT0xPUik7Ci0JCXdyaXRlbCgweDAwMDEwMmFhLCByZW1hcHBlZF9yZWdzICsgbW1HRU5MQ0RfQ05UTDMpOwotCQl3cml0ZWwoMHgwMDgwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19PRkZTRVQpOwotCQl3cml0ZWwoMHgwMDAwMDNDMCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19QSVRDSCk7Ci0JCXdyaXRlbCgweDAwMDAwMGJmLCByZW1hcHBlZF9yZWdzICsgbW1HUElPX0RBVEEpOwotCQl3cml0ZWwoMHgwM2MwZmVmZiwgcmVtYXBwZWRfcmVncyArIG1tR1BJT19DTlRMMik7Ci0JCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1HUElPX0NOVEwxKTsKLQkJd3JpdGVsKDB4NDEwNjAwMTAsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfUFMxX0FDVElWRSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwlncmFwaGljX2hfZGlzcC52YWwgPSAwOworCWdyYXBoaWNfaF9kaXNwLmYuZ3JhcGhpY19oX3N0YXJ0PW1vZGUtPmxlZnRfbWFyZ2luOworCWdyYXBoaWNfaF9kaXNwLmYuZ3JhcGhpY19oX2VuZD1tb2RlLT5sZWZ0X21hcmdpbiArIG1vZGUtPnhyZXM7CisJd3JpdGVsKGdyYXBoaWNfaF9kaXNwLnZhbCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19IX0RJU1ApOworCisJZ3JhcGhpY192X2Rpc3AudmFsID0gMDsKKwlncmFwaGljX3ZfZGlzcC5mLmdyYXBoaWNfdl9zdGFydD1tb2RlLT51cHBlcl9tYXJnaW47CisJZ3JhcGhpY192X2Rpc3AuZi5ncmFwaGljX3ZfZW5kPW1vZGUtPnVwcGVyX21hcmdpbiArIG1vZGUtPnlyZXM7CisJd3JpdGVsKGdyYXBoaWNfdl9kaXNwLnZhbCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19WX0RJU1ApOworCisJY3J0Y190b3RhbC52YWwgPSAwOworCWNydGNfdG90YWwuZi5jcnRjX2hfdG90YWw9bW9kZS0+bGVmdF9tYXJnaW4gICsgbW9kZS0+eHJlcyArIG1vZGUtPnJpZ2h0X21hcmdpbjsKKwljcnRjX3RvdGFsLmYuY3J0Y192X3RvdGFsPW1vZGUtPnVwcGVyX21hcmdpbiArIG1vZGUtPnlyZXMgKyBtb2RlLT5sb3dlcl9tYXJnaW47CisJd3JpdGVsKGNydGNfdG90YWwudmFsLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1RPVEFMKTsKKworCXdyaXRlbChtb2RlLT5jcnRjX3NzLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1NTKTsKKwl3cml0ZWwobW9kZS0+Y3J0Y19scywgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19MUyk7CisJd3JpdGVsKG1vZGUtPmNydGNfZ3MsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfR1MpOworCXdyaXRlbChtb2RlLT5jcnRjX3Zwb3NfZ3MsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfVlBPU19HUyk7CisJd3JpdGVsKG1vZGUtPmNydGNfcmV2LCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX1JFVik7CisJd3JpdGVsKG1vZGUtPmNydGNfZGNsaywgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19EQ0xLKTsKKwl3cml0ZWwobW9kZS0+Y3J0Y19nY2xrLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0dDTEspOworCXdyaXRlbChtb2RlLT5jcnRjX2dvZSwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19HT0UpOworCXdyaXRlbChtb2RlLT5jcnRjX3BzMV9hY3RpdmUsIHJlbWFwcGVkX3JlZ3MgKyBtbUNSVENfUFMxX0FDVElWRSk7CisKKwl3cml0ZWwocmVncy0+bGNkX2Zvcm1hdCwgcmVtYXBwZWRfcmVncyArIG1tTENEX0ZPUk1BVCk7CisJd3JpdGVsKHJlZ3MtPmxjZGRfY250bDEsIHJlbWFwcGVkX3JlZ3MgKyBtbUxDRERfQ05UTDEpOworCXdyaXRlbChyZWdzLT5sY2RkX2NudGwyLCByZW1hcHBlZF9yZWdzICsgbW1MQ0REX0NOVEwyKTsKKwl3cml0ZWwocmVncy0+Z2VubGNkX2NudGwxLCByZW1hcHBlZF9yZWdzICsgbW1HRU5MQ0RfQ05UTDEpOworCXdyaXRlbChyZWdzLT5nZW5sY2RfY250bDIsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTkxDRF9DTlRMMik7CisJd3JpdGVsKHJlZ3MtPmdlbmxjZF9jbnRsMywgcmVtYXBwZWRfcmVncyArIG1tR0VOTENEX0NOVEwzKTsKKworCXdyaXRlbCgweDAwMDAwMDAwLCByZW1hcHBlZF9yZWdzICsgbW1DUlRDX0ZSQU1FKTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19GUkFNRV9WUE9TKTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgcmVtYXBwZWRfcmVncyArIG1tQ1JUQ19ERUZBVUxUX0NPVU5UKTsKKwl3cml0ZWwoMHgwMDAwRkYwMCwgcmVtYXBwZWRfcmVncyArIG1tTENEX0JBQ0tHUk9VTkRfQ09MT1IpOwogCiAJLyogSGFjayBmb3Igb3ZlcmxheSBpbiBleHQgbWVtb3J5ICovCiAJdGVtcDMyID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tRElTUF9ERUJVRzIpOwogCXRlbXAzMiB8PSAweGMwMDAwMDAwOwogCXdyaXRlbCh0ZW1wMzIsIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREVCVUcyKTsKLQotCS8qIFJlLWVuYWJsZSBkaXNwbGF5IHVwZGF0ZXMgKi8KLQlkaXNwX2RiX2J1Zl93cl9jbnRsLmYuZGJfYnVmX2NudGwgPSAweDFlOwotCWRpc3BfZGJfYnVmX3dyX2NudGwuZi51cGRhdGVfZGJfYnVmID0gMTsKLQlkaXNwX2RiX2J1Zl93cl9jbnRsLmYuZW5fZGJfYnVmID0gMTsKLQl3cml0ZWwoKHUzMikgKGRpc3BfZGJfYnVmX3dyX2NudGwudmFsKSwgcmVtYXBwZWRfcmVncyArIG1tRElTUF9EQl9CVUZfQ05UTCk7CiB9CiAKIAotc3RhdGljIHZvaWQgdzEwMF9zZXRfdmdhX3JvdGF0aW9uX3JlZ3ModTE2IGRpdmlkZXIsIHVuc2lnbmVkIGxvbmcgY3RybCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgcGl0Y2gpCitzdGF0aWMgdm9pZCB3MTAwX3NldHVwX21lbW9yeShzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyKQogewotCXcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC5mLnBjbGtfc3JjX3NlbCA9IDB4MTsKKwl1bmlvbiBtY19leHRfbWVtX2xvY2F0aW9uX3UgZXh0bWVtX2xvY2F0aW9uOworCXVuaW9uIG1jX2ZiX2xvY2F0aW9uX3UgaW50bWVtX2xvY2F0aW9uOworCXN0cnVjdCB3MTAwX21lbV9pbmZvICptZW0gPSBwYXItPm1hY2gtPm1lbTsKKwlzdHJ1Y3QgdzEwMF9ibV9tZW1faW5mbyAqYm1fbWVtID0gcGFyLT5tYWNoLT5ibV9tZW07CisKKwlpZiAoIXBhci0+ZXh0bWVtX2FjdGl2ZSkgeworCQl3MTAwX3N1c3BlbmQoVzEwMF9TVVNQRU5EX0VYVE1FTSk7CisKKwkJLyogTWFwIEludGVybmFsIE1lbW9yeSBhdCBGQiBCYXNlICovCisJCWludG1lbV9sb2NhdGlvbi5mLm1jX2ZiX3N0YXJ0ID0gVzEwMF9GQl9CQVNFID4+IDg7CisJCWludG1lbV9sb2NhdGlvbi5mLm1jX2ZiX3RvcCA9IChXMTAwX0ZCX0JBU0UrTUVNX0lOVF9TSVpFKSA+PiA4OworCQl3cml0ZWwoKHUzMikgKGludG1lbV9sb2NhdGlvbi52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1NQ19GQl9MT0NBVElPTik7CisKKwkJLyogVW5tYXAgRXh0ZXJuYWwgTWVtb3J5IC0gdmFsdWUgaXMgKnByb2JhYmx5KiBpcnJlbGV2YW50IGJ1dCBtYXkgaGF2ZSBtZWFuaW5nCisJCSAgIHRvIGFjY2VsZXJhdGlvbiBsaWJyYXJpZXMgKi8KKwkJZXh0bWVtX2xvY2F0aW9uLmYubWNfZXh0X21lbV9zdGFydCA9IE1FTV9FWFRfQkFTRV9WQUxVRSA+PiA4OworCQlleHRtZW1fbG9jYXRpb24uZi5tY19leHRfbWVtX3RvcCA9IChNRU1fRVhUX0JBU0VfVkFMVUUtMSkgPj4gODsKKwkJd3JpdGVsKCh1MzIpIChleHRtZW1fbG9jYXRpb24udmFsKSwgcmVtYXBwZWRfcmVncyArIG1tTUNfRVhUX01FTV9MT0NBVElPTik7CisJfSBlbHNlIHsKKwkJLyogTWFwIEludGVybmFsIE1lbW9yeSB0byBpdHMgZGVmYXVsdCBsb2NhdGlvbiAqLworCQlpbnRtZW1fbG9jYXRpb24uZi5tY19mYl9zdGFydCA9IE1FTV9JTlRfQkFTRV9WQUxVRSA+PiA4OworCQlpbnRtZW1fbG9jYXRpb24uZi5tY19mYl90b3AgPSAoTUVNX0lOVF9CQVNFX1ZBTFVFK01FTV9JTlRfU0laRSkgPj4gODsKKwkJd3JpdGVsKCh1MzIpIChpbnRtZW1fbG9jYXRpb24udmFsKSwgcmVtYXBwZWRfcmVncyArIG1tTUNfRkJfTE9DQVRJT04pOworCisJCS8qIE1hcCBFeHRlcm5hbCBNZW1vcnkgYXQgRkIgQmFzZSAqLworCQlleHRtZW1fbG9jYXRpb24uZi5tY19leHRfbWVtX3N0YXJ0ID0gVzEwMF9GQl9CQVNFID4+IDg7CisJCWV4dG1lbV9sb2NhdGlvbi5mLm1jX2V4dF9tZW1fdG9wID0gKFcxMDBfRkJfQkFTRStwYXItPm1hY2gtPm1lbS0+c2l6ZSkgPj4gODsKKwkJd3JpdGVsKCh1MzIpIChleHRtZW1fbG9jYXRpb24udmFsKSwgcmVtYXBwZWRfcmVncyArIG1tTUNfRVhUX01FTV9MT0NBVElPTik7CisKKwkJd3JpdGVsKDB4MDAwMDc4MDAsIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX0JJU1RfQ1RSTCk7CisJCXdyaXRlbChtZW0tPmV4dF9jbnRsLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOworCQl3cml0ZWwoMHgwMDIwMDAyMSwgcmVtYXBwZWRfcmVncyArIG1tTUVNX1NEUkFNX01PREVfUkVHKTsKKwkJdWRlbGF5KDEwMCk7CisJCXdyaXRlbCgweDgwMjAwMDIxLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fU0RSQU1fTU9ERV9SRUcpOworCQl1ZGVsYXkoMTAwKTsKKwkJd3JpdGVsKG1lbS0+c2RyYW1fbW9kZV9yZWcsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9TRFJBTV9NT0RFX1JFRyk7CisJCXVkZWxheSgxMDApOworCQl3cml0ZWwobWVtLT5leHRfdGltaW5nX2NudGwsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9FWFRfVElNSU5HX0NOVEwpOworCQl3cml0ZWwobWVtLT5pb19jbnRsLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fSU9fQ05UTCk7CisJCWlmIChibV9tZW0pIHsKKwkJCXdyaXRlbChibV9tZW0tPmV4dF9tZW1fYncsIHJlbWFwcGVkX3JlZ3MgKyBtbUJNX0VYVF9NRU1fQkFORFdJRFRIKTsKKwkJCXdyaXRlbChibV9tZW0tPm9mZnNldCwgcmVtYXBwZWRfcmVncyArIG1tQk1fT0ZGU0VUKTsKKwkJCXdyaXRlbChibV9tZW0tPmV4dF90aW1pbmdfY3RsLCByZW1hcHBlZF9yZWdzICsgbW1CTV9NRU1fRVhUX1RJTUlOR19DTlRMKTsKKwkJCXdyaXRlbChibV9tZW0tPmV4dF9jbnRsLCByZW1hcHBlZF9yZWdzICsgbW1CTV9NRU1fRVhUX0NOVEwpOworCQkJd3JpdGVsKGJtX21lbS0+bW9kZV9yZWcsIHJlbWFwcGVkX3JlZ3MgKyBtbUJNX01FTV9NT0RFX1JFRyk7CisJCQl3cml0ZWwoYm1fbWVtLT5pb19jbnRsLCByZW1hcHBlZF9yZWdzICsgbW1CTV9NRU1fSU9fQ05UTCk7CisJCQl3cml0ZWwoYm1fbWVtLT5jb25maWcsIHJlbWFwcGVkX3JlZ3MgKyBtbUJNX0NPTkZJRyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHcxMDBfc2V0X2Rpc3ByZWdzKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJdW5zaWduZWQgbG9uZyByb3Q9MCwgZGl2aWRlciwgb2Zmc2V0PTA7CisJdW5pb24gZ3JhcGhpY19jdHJsX3UgZ3JhcGhpY19jdHJsOworCisJLyogU2VlIGlmIHRoZSBtb2RlIGhhcyBiZWVuIHJvdGF0ZWQgKi8KKwlpZiAocGFyLT54cmVzID09IHBhci0+bW9kZS0+eHJlcykgeworCQlpZiAocGFyLT5mbGlwKSB7CisJCQlyb3Q9MzsgLyogMTgwIGRlZ3JlZSAqLworCQkJb2Zmc2V0PShwYXItPnhyZXMgKiBwYXItPnlyZXMpIC0gMTsKKwkJfSAvKiBlbHNlIDAgZGVncmVlICovCisJCWRpdmlkZXIgPSBwYXItPm1vZGUtPnBpeGNsa19kaXZpZGVyOworCX0gZWxzZSB7CisJCWlmIChwYXItPmZsaXApIHsKKwkJCXJvdD0yOyAvKiAyNzAgZGVncmVlICovCisJCQlvZmZzZXQ9cGFyLT54cmVzIC0gMTsKKwkJfSBlbHNlIHsKKwkJCXJvdD0xOyAvKiA5MCBkZWdyZWUgKi8KKwkJCW9mZnNldD1wYXItPnhyZXMgKiAocGFyLT55cmVzIC0gMSk7CisJCX0KKwkJZGl2aWRlciA9IHBhci0+bW9kZS0+cGl4Y2xrX2RpdmlkZXJfcm90YXRlZDsKKwl9CisKKwlncmFwaGljX2N0cmwudmFsID0gMDsgLyogdzMyeHggZG9lc24ndCBsaWtlIHVuZGVmaW5lZCBiaXRzICovCisJc3dpdGNoIChwYXItPmNoaXBfaWQpIHsKKwkJY2FzZSBDSElQX0lEX1cxMDA6CisJCQlncmFwaGljX2N0cmwuZl93MTAwLmNvbG9yX2RlcHRoPTY7CisJCQlncmFwaGljX2N0cmwuZl93MTAwLmVuX2NydGM9MTsKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAuZW5fZ3JhcGhpY19yZXE9MTsKKwkJCWdyYXBoaWNfY3RybC5mX3cxMDAuZW5fZ3JhcGhpY19jcnRjPTE7CisJCQlncmFwaGljX2N0cmwuZl93MTAwLmxjZF9wY2xrX29uPTE7CisJCQlncmFwaGljX2N0cmwuZl93MTAwLmxjZF9zY2xrX29uPTE7CisJCQlncmFwaGljX2N0cmwuZl93MTAwLmxvd19wb3dlcl9vbj0wOworCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC5yZXFfZnJlcT0wOworCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC5wb3J0cmFpdF9tb2RlPXJvdDsKKworCQkJLyogWmF1cnVzIG5lZWRzIHRoaXMgKi8KKwkJCXN3aXRjaChwYXItPnhyZXMpIHsKKwkJCQljYXNlIDI0MDoKKwkJCQljYXNlIDMyMDoKKwkJCQlkZWZhdWx0OgorCQkJCQlncmFwaGljX2N0cmwuZl93MTAwLnRvdGFsX3JlcV9ncmFwaGljPTB4YTA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDgwOgorCQkJCWNhc2UgNjQwOgorCQkJCQlzd2l0Y2gocm90KSB7CisJCQkJCQljYXNlIDA6ICAvKiAwICovCisJCQkJCQljYXNlIDM6ICAvKiAxODAgKi8KKwkJCQkJCQlncmFwaGljX2N0cmwuZl93MTAwLmxvd19wb3dlcl9vbj0xOworCQkJCQkJCWdyYXBoaWNfY3RybC5mX3cxMDAucmVxX2ZyZXE9NTsKKwkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxOiAgLyogOTAgKi8KKwkJCQkJCWNhc2UgMjogIC8qIDI3MCAqLworCQkJCQkJCWdyYXBoaWNfY3RybC5mX3cxMDAucmVxX2ZyZXE9NDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZ3JhcGhpY19jdHJsLmZfdzEwMC50b3RhbF9yZXFfZ3JhcGhpYz0weGYwOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENISVBfSURfVzMyMDA6CisJCWNhc2UgQ0hJUF9JRF9XMzIyMDoKKwkJCWdyYXBoaWNfY3RybC5mX3czMnh4LmNvbG9yX2RlcHRoPTY7CisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5lbl9jcnRjPTE7CisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5lbl9ncmFwaGljX3JlcT0xOworCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHguZW5fZ3JhcGhpY19jcnRjPTE7CisJCQlncmFwaGljX2N0cmwuZl93MzJ4eC5sY2RfcGNsa19vbj0xOworCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHgubGNkX3NjbGtfb249MTsKKwkJCWdyYXBoaWNfY3RybC5mX3czMnh4Lmxvd19wb3dlcl9vbj0wOworCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHgucmVxX2ZyZXE9MDsKKwkJCWdyYXBoaWNfY3RybC5mX3czMnh4LnRvdGFsX3JlcV9ncmFwaGljPXBhci0+bW9kZS0+eHJlcyA+PiAxOyAvKiBwYW5lbCB4cmVzLCBub3QgbW9kZSAqLworCQkJZ3JhcGhpY19jdHJsLmZfdzMyeHgucG9ydHJhaXRfbW9kZT1yb3Q7CisJCQlicmVhazsKKwl9CisKKwkvKiBTZXQgdGhlIHBpeGVsIGNsb2NrIHNvdXJjZSBhbmQgZGl2aWRlciAqLworCXcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC5mLnBjbGtfc3JjX3NlbCA9IHBhci0+bW9kZS0+cGl4Y2xrX3NyYzsKIAl3MTAwX3B3cl9zdGF0ZS5wY2xrX2NudGwuZi5wY2xrX3Bvc3RfZGl2ID0gZGl2aWRlcjsKIAl3cml0ZWwoKHUzMikgKHcxMDBfcHdyX3N0YXRlLnBjbGtfY250bC52YWwpLCByZW1hcHBlZF9yZWdzICsgbW1QQ0xLX0NOVEwpOwogCi0Jd3JpdGVsKGN0cmwsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfQ1RSTCk7Ci0Jd3JpdGVsKG9mZnNldCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19PRkZTRVQpOwotCXdyaXRlbChwaXRjaCwgcmVtYXBwZWRfcmVncyArIG1tR1JBUEhJQ19QSVRDSCk7Ci0KLQkvKiBSZS1lbmFibGUgZGlzcGxheSB1cGRhdGVzICovCi0Jd3JpdGVsKDB4MDAwMDAwN2IsIHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREJfQlVGX0NOVEwpOworCXdyaXRlbChncmFwaGljX2N0cmwudmFsLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX0NUUkwpOworCXdyaXRlbChXMTAwX0ZCX0JBU0UgKyAoKG9mZnNldCAqIEJJVFNfUEVSX1BJWEVMLzgpJn4weDAzVUwpLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX09GRlNFVCk7CisJd3JpdGVsKChwYXItPnhyZXMqQklUU19QRVJfUElYRUwvOCksIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfUElUQ0gpOwogfQogCiAKLXN0YXRpYyB2b2lkIHcxMDBfaW5pdF92Z2Ffcm90YXRpb24odTE2IGRlZykKKy8qCisgKiBXb3JrIG91dCBob3cgbG9uZyB0aGUgc3luYyBwdWxzZSBsYXN0cworICogVmFsdWUgaXMgMS8odGltZSBpbiBzZWNvbmRzKQorICovCitzdGF0aWMgdm9pZCBjYWxjX2hzeW5jKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCiB7Ci0Jc3dpdGNoKGRlZykgewotCWNhc2UgMDoKLQkJdzEwMF9zZXRfdmdhX3JvdGF0aW9uX3JlZ3MoMHgwMiwgMHgwMERFMUQ2NiwgMHgwMDgwMDAwMCwgMHgwMDAwMDNjMCk7Ci0JCWJyZWFrOwotCWNhc2UgOTA6Ci0JCXcxMDBfc2V0X3ZnYV9yb3RhdGlvbl9yZWdzKDB4MDYsIDB4MDBERTFEMGUsIDB4MDA4OTViMDAsIDB4MDAwMDA1MDApOwotCQlicmVhazsKLQljYXNlIDE4MDoKLQkJdzEwMF9zZXRfdmdhX3JvdGF0aW9uX3JlZ3MoMHgwMiwgMHgwMERFMUQ3ZSwgMHgwMDg5NWZmYywgMHgwMDAwMDNjMCk7Ci0JCWJyZWFrOwotCWNhc2UgMjcwOgotCQl3MTAwX3NldF92Z2Ffcm90YXRpb25fcmVncygweDA2LCAweDAwREUxRDE2LCAweDAwODAwNGZjLCAweDAwMDAwNTAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogbm90LXN1cHBvcnQgKi8KLQkJYnJlYWs7Ci0JfQorCXVuc2lnbmVkIGxvbmcgaHN5bmM7CisJc3RydWN0IHcxMDBfbW9kZSAqbW9kZSA9IHBhci0+bW9kZTsKKwl1bmlvbiBjcnRjX3NzX3UgY3J0Y19zczsKKworCWlmIChtb2RlLT5waXhjbGtfc3JjID09IENMS19TUkNfWFRBTCkKKwkJaHN5bmM9cGFyLT5tYWNoLT54dGFsX2ZyZXE7CisJZWxzZQorCQloc3luYz0oKHBhci0+ZmFzdHBsbF9tb2RlICYmIG1vZGUtPmZhc3RfcGxsX2ZyZXEpID8gbW9kZS0+ZmFzdF9wbGxfZnJlcSA6IG1vZGUtPnBsbF9mcmVxKSoxMDAwMDA7CisKKwloc3luYyAvPSAodzEwMF9wd3Jfc3RhdGUucGNsa19jbnRsLmYucGNsa19wb3N0X2RpdiArIDEpOworCisJY3J0Y19zcy52YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1DUlRDX1NTKTsKKwlpZiAoY3J0Y19zcy52YWwpCisJCXBhci0+aHN5bmNfbGVuID0gaHN5bmMgLyAoY3J0Y19zcy5mLnNzX2VuZC1jcnRjX3NzLmYuc3Nfc3RhcnQpOworCWVsc2UKKwkJcGFyLT5oc3luY19sZW4gPSAwOwogfQogCi0KLXN0YXRpYyB2b2lkIHcxMDBfc2V0X3F2Z2Ffcm90YXRpb25fcmVncyh1bnNpZ25lZCBsb25nIGN0cmwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHBpdGNoKQotewotCXdyaXRlbChjdHJsLCByZW1hcHBlZF9yZWdzICsgbW1HUkFQSElDX0NUUkwpOwotCXdyaXRlbChvZmZzZXQsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfT0ZGU0VUKTsKLQl3cml0ZWwocGl0Y2gsIHJlbWFwcGVkX3JlZ3MgKyBtbUdSQVBISUNfUElUQ0gpOwotCi0JLyogUmUtZW5hYmxlIGRpc3BsYXkgdXBkYXRlcyAqLwotCXdyaXRlbCgweDAwMDAwMDdiLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RCX0JVRl9DTlRMKTsKLX0KLQotCi1zdGF0aWMgdm9pZCB3MTAwX2luaXRfcXZnYV9yb3RhdGlvbih1MTYgZGVnKQotewotCXN3aXRjaChkZWcpIHsKLQljYXNlIDA6Ci0JCXcxMDBfc2V0X3F2Z2Ffcm90YXRpb25fcmVncygweDAwZDQxYzA2LCAweDAwODAwMDAwLCAweDAwMDAwMWUwKTsKLQkJYnJlYWs7Ci0JY2FzZSA5MDoKLQkJdzEwMF9zZXRfcXZnYV9yb3RhdGlvbl9yZWdzKDB4MDBkNDFjMEUsIDB4MDA4MjU1ODAsIDB4MDAwMDAyODApOwotCQlicmVhazsKLQljYXNlIDE4MDoKLQkJdzEwMF9zZXRfcXZnYV9yb3RhdGlvbl9yZWdzKDB4MDBkNDFjMWUsIDB4MDA4MjU3ZmMsIDB4MDAwMDAxZTApOwotCQlicmVhazsKLQljYXNlIDI3MDoKLQkJdzEwMF9zZXRfcXZnYV9yb3RhdGlvbl9yZWdzKDB4MDBkNDFjMTYsIDB4MDA4MDAyN2MsIDB4MDAwMDAyODApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBub3Qtc3VwcG9ydCAqLwotCQlicmVhazsKLQl9Ci19Ci0KLQogc3RhdGljIHZvaWQgdzEwMF9zdXNwZW5kKHUzMiBtb2RlKQogewogCXUzMiB2YWw7CkBAIC0xMzg3LDMwICsxMzc3LDI4IEBACiAJd3JpdGVsKDB4MDBGRjAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX1BFUkZfTU9OX0NOVEwpOwogCiAJdmFsID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9USU1JTkdfQ05UTCk7Ci0JdmFsICY9IH4oMHgwMDEwMDAwMCk7CS8qIGJpdDIwPTAgKi8KLQl2YWwgfD0gMHhGRjAwMDAwMDsJLyogYml0MzE6MjQ9MHhmZiAqLworCXZhbCAmPSB+KDB4MDAxMDAwMDApOyAgLyogYml0MjA9MCAqLworCXZhbCB8PSAweEZGMDAwMDAwOyAgICAgLyogYml0MzE6MjQ9MHhmZiAqLwogCXdyaXRlbCh2YWwsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9FWFRfVElNSU5HX0NOVEwpOwogCiAJdmFsID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9DTlRMKTsKLQl2YWwgJj0gfigweDAwMDQwMDAwKTsJLyogYml0MTg9MCAqLwotCXZhbCB8PSAweDAwMDgwMDAwOwkvKiBiaXQxOT0xICovCisJdmFsICY9IH4oMHgwMDA0MDAwMCk7ICAvKiBiaXQxOD0wICovCisJdmFsIHw9IDB4MDAwODAwMDA7ICAgICAvKiBiaXQxOT0xICovCiAJd3JpdGVsKHZhbCwgcmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9DTlRMKTsKIAotCXVkZWxheSgxKTsJCS8qIHdhaXQgMXVzICovCisJdWRlbGF5KDEpOyAgLyogd2FpdCAxdXMgKi8KIAogCWlmIChtb2RlID09IFcxMDBfU1VTUEVORF9FWFRNRU0pIHsKLQogCQkvKiBDS0U6IFRyaS1TdGF0ZSAqLwogCQl2YWwgPSByZWFkbChyZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwotCQl2YWwgfD0gMHg0MDAwMDAwMDsJLyogYml0MzA9MSAqLworCQl2YWwgfD0gMHg0MDAwMDAwMDsgIC8qIGJpdDMwPTEgKi8KIAkJd3JpdGVsKHZhbCwgcmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9DTlRMKTsKIAogCQkvKiBDTEs6IFN0b3AgKi8KIAkJdmFsID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9DTlRMKTsKLQkJdmFsICY9IH4oMHgwMDAwMDAwMSk7CS8qIGJpdDA9MCAqLworCQl2YWwgJj0gfigweDAwMDAwMDAxKTsgIC8qIGJpdDA9MCAqLwogCQl3cml0ZWwodmFsLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwogCX0gZWxzZSB7Ci0KIAkJd3JpdGVsKDB4MDAwMDAwMDAsIHJlbWFwcGVkX3JlZ3MgKyBtbVNDTEtfQ05UTCk7CiAJCXdyaXRlbCgweDAwMDAwMEJGLCByZW1hcHBlZF9yZWdzICsgbW1DTEtfUElOX0NOVEwpOwogCQl3cml0ZWwoMHgwMDAwMDAxNSwgcmVtYXBwZWRfcmVncyArIG1tUFdSTUdUX0NOVEwpOwpAQCAtMTQxOCw0MyArMTQwNiwxNiBAQAogCQl1ZGVsYXkoNSk7CiAKIAkJdmFsID0gcmVhZGwocmVtYXBwZWRfcmVncyArIG1tUExMX0NOVEwpOwotCQl2YWwgfD0gMHgwMDAwMDAwNDsJLyogYml0Mj0xICovCisJCXZhbCB8PSAweDAwMDAwMDA0OyAgLyogYml0Mj0xICovCiAJCXdyaXRlbCh2YWwsIHJlbWFwcGVkX3JlZ3MgKyBtbVBMTF9DTlRMKTsKIAkJd3JpdGVsKDB4MDAwMDAwMWQsIHJlbWFwcGVkX3JlZ3MgKyBtbVBXUk1HVF9DTlRMKTsKIAl9CiB9CiAKLQotc3RhdGljIHZvaWQgdzEwMF9yZXN1bWUodm9pZCkKLXsKLQl1MzIgdGVtcDMyOwotCi0JdzEwMF9od19pbml0KCk7Ci0JdzEwMF9wd21fc2V0dXAoKTsKLQotCXRlbXAzMiA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbURJU1BfREVCVUcyKTsKLQl0ZW1wMzIgJj0gMHhmZjdmZmZmZjsKLQl0ZW1wMzIgfD0gMHgwMDgwMDAwMDsKLQl3cml0ZWwodGVtcDMyLCByZW1hcHBlZF9yZWdzICsgbW1ESVNQX0RFQlVHMik7Ci0KLQlpZiAoY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfNDgwIHx8IGN1cnJlbnRfcGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzY0MCkgewotCQl3MTAwX2luaXRfc2hhcnBfbGNkKExDRF9TSEFSUF9WR0EpOwotCQlpZiAoY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfNjQwKSB7Ci0JCQl3MTAwX2luaXRfdmdhX3JvdGF0aW9uKGN1cnJlbnRfcGFyLT5yb3RhdGlvbl9mbGFnID8gMjcwIDogOTApOwotCQl9Ci0JfSBlbHNlIHsKLQkJdzEwMF9pbml0X3NoYXJwX2xjZChMQ0RfU0hBUlBfUVZHQSk7Ci0JCWlmIChjdXJyZW50X3Bhci0+bGNkTW9kZSA9PSBMQ0RfTU9ERV8zMjApIHsKLQkJCXcxMDBfaW5pdF9xdmdhX3JvdGF0aW9uKGN1cnJlbnRfcGFyLT5yb3RhdGlvbl9mbGFnID8gMjcwIDogOTApOwotCQl9Ci0JfQotfQotCi0KIHN0YXRpYyB2b2lkIHcxMDBfdnN5bmModm9pZCkKIHsKIAl1MzIgdG1wOwotCWludCB0aW1lb3V0ID0gMzAwMDA7IC8qIFZTeW5jIHRpbWVvdXQgPSAzMFttc10gPiAxNi44W21zXSAqLworCWludCB0aW1lb3V0ID0gMzAwMDA7ICAvKiBWU3luYyB0aW1lb3V0ID0gMzBbbXNdID4gMTYuOFttc10gKi8KIAogCXRtcCA9IHJlYWRsKHJlbWFwcGVkX3JlZ3MgKyBtbUFDVElWRV9WX0RJU1ApOwogCkBAIC0xNDkwLDM2MyArMTQ1MSw2IEBACiAJd3JpdGVsKDB4MDAwMDAwMDIsIHJlbWFwcGVkX3JlZ3MgKyBtbUdFTl9JTlRfU1RBVFVTKTsKIH0KIAotCi1zdGF0aWMgdm9pZCB3MTAwX0luaXRFeHRNZW0odTMyIG1vZGUpCi17Ci0Jc3dpdGNoKG1vZGUpIHsKLQljYXNlIExDRF9TSEFSUF9RVkdBOgotCQkvKiBRVkdBIGRvZXNuJ3QgdXNlIGV4dGVybmFsIG1lbW9yeQotCQkgICBub3RoaW5nIHRvIGRvLCByZWFsbHkuICovCi0JCWJyZWFrOwotCWNhc2UgTENEX1NIQVJQX1ZHQToKLQkJd3JpdGVsKDB4MDAwMDc4MDAsIHJlbWFwcGVkX3JlZ3MgKyBtbU1DX0JJU1RfQ1RSTCk7Ci0JCXdyaXRlbCgweDAwMDQwMDAzLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fRVhUX0NOVEwpOwotCQl3cml0ZWwoMHgwMDIwMDAyMSwgcmVtYXBwZWRfcmVncyArIG1tTUVNX1NEUkFNX01PREVfUkVHKTsKLQkJdWRlbGF5KDEwMCk7Ci0JCXdyaXRlbCgweDgwMjAwMDIxLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fU0RSQU1fTU9ERV9SRUcpOwotCQl1ZGVsYXkoMTAwKTsKLQkJd3JpdGVsKDB4MDA2NTAwMjEsIHJlbWFwcGVkX3JlZ3MgKyBtbU1FTV9TRFJBTV9NT0RFX1JFRyk7Ci0JCXVkZWxheSgxMDApOwotCQl3cml0ZWwoMHgxMDAwMmE0YSwgcmVtYXBwZWRfcmVncyArIG1tTUVNX0VYVF9USU1JTkdfQ05UTCk7Ci0JCXdyaXRlbCgweDdmZjg3MDEyLCByZW1hcHBlZF9yZWdzICsgbW1NRU1fSU9fQ05UTCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotCi0jZGVmaW5lIFJFU0NUTF9BRFJTICAgICAweDAwCi0jZGVmaW5lIFBIQUNUUkxfQURSUwkweDAxCi0jZGVmaW5lIERVVFlDVFJMX0FEUlMJMHgwMgotI2RlZmluZSBQT1dFUlJFRzBfQURSUwkweDAzCi0jZGVmaW5lIFBPV0VSUkVHMV9BRFJTCTB4MDQKLSNkZWZpbmUgR1BPUjNfQURSUwkJMHgwNQotI2RlZmluZSBQSUNUUkxfQURSUyAgICAgMHgwNgotI2RlZmluZSBQT0xDVFJMX0FEUlMgICAgMHgwNwotCi0jZGVmaW5lIFJFU0NUTF9RVkdBICAgICAweDAxCi0jZGVmaW5lIFJFU0NUTF9WR0EgICAgICAweDAwCi0KLSNkZWZpbmUgUE9XRVIxX1ZXX09OCTB4MDEJLyogVlcgU3VwcGx5IEZFVCBPTiAqLwotI2RlZmluZSBQT1dFUjFfR1ZTU19PTgkweDAyCS8qIEdWU1MoLThWKSBQb3dlciBTdXBwbHkgT04gKi8KLSNkZWZpbmUgUE9XRVIxX1ZERF9PTgkweDA0CS8qIFZERCg4ViksU1ZTUygtNFYpIFBvd2VyIFN1cHBseSBPTiAqLwotCi0jZGVmaW5lIFBPV0VSMV9WV19PRkYJMHgwMAkvKiBWVyBTdXBwbHkgRkVUIE9GRiAqLwotI2RlZmluZSBQT1dFUjFfR1ZTU19PRkYJMHgwMAkvKiBHVlNTKC04VikgUG93ZXIgU3VwcGx5IE9GRiAqLwotI2RlZmluZSBQT1dFUjFfVkREX09GRgkweDAwCS8qIFZERCg4ViksU1ZTUygtNFYpIFBvd2VyIFN1cHBseSBPRkYgKi8KLQotI2RlZmluZSBQT1dFUjBfQ09NX0RDTEsJMHgwMQkvKiBDT00gVm9sdGFnZSBEQyBCaWFzIERBQyBTZXJpYWwgRGF0YSBDbG9jayAqLwotI2RlZmluZSBQT1dFUjBfQ09NX0RPVVQJMHgwMgkvKiBDT00gVm9sdGFnZSBEQyBCaWFzIERBQyBTZXJpYWwgRGF0YSBPdXQgKi8KLSNkZWZpbmUgUE9XRVIwX0RBQ19PTgkweDA0CS8qIERBQyBQb3dlciBTdXBwbHkgT04gKi8KLSNkZWZpbmUgUE9XRVIwX0NPTV9PTgkweDA4CS8qIENPTSBQb3dld3IgU3VwcGx5IE9OICovCi0jZGVmaW5lIFBPV0VSMF9WQ0M1X09OCTB4MTAJLyogVkNDNSBQb3dlciBTdXBwbHkgT04gKi8KLQotI2RlZmluZSBQT1dFUjBfREFDX09GRgkweDAwCS8qIERBQyBQb3dlciBTdXBwbHkgT0ZGICovCi0jZGVmaW5lIFBPV0VSMF9DT01fT0ZGCTB4MDAJLyogQ09NIFBvd2V3ciBTdXBwbHkgT0ZGICovCi0jZGVmaW5lIFBPV0VSMF9WQ0M1X09GRgkweDAwCS8qIFZDQzUgUG93ZXIgU3VwcGx5IE9GRiAqLwotCi0jZGVmaW5lIFBJQ1RSTF9JTklUX1NUQVRFCTB4MDEKLSNkZWZpbmUgUElDVFJMX0lOSU9GRgkJMHgwMgotI2RlZmluZSBQSUNUUkxfUE9XRVJfRE9XTgkweDA0Ci0jZGVmaW5lIFBJQ1RSTF9DT01fU0lHTkFMX09GRgkweDA4Ci0jZGVmaW5lIFBJQ1RSTF9EQUNfU0lHTkFMX09GRgkweDEwCi0KLSNkZWZpbmUgUElDVFJMX1BPV0VSX0FDVElWRQkoMCkKLQotI2RlZmluZSBQT0xDVFJMX1NZTkNfUE9MX0ZBTEwJMHgwMQotI2RlZmluZSBQT0xDVFJMX0VOX1BPTF9GQUxMCTB4MDIKLSNkZWZpbmUgUE9MQ1RSTF9EQVRBX1BPTF9GQUxMCTB4MDQKLSNkZWZpbmUgUE9MQ1RSTF9TWU5DX0FDVF9ICTB4MDgKLSNkZWZpbmUgUE9MQ1RSTF9FTl9BQ1RfTAkweDEwCi0KLSNkZWZpbmUgUE9MQ1RSTF9TWU5DX1BPTF9SSVNFCTB4MDAKLSNkZWZpbmUgUE9MQ1RSTF9FTl9QT0xfUklTRQkweDAwCi0jZGVmaW5lIFBPTENUUkxfREFUQV9QT0xfUklTRQkweDAwCi0jZGVmaW5lIFBPTENUUkxfU1lOQ19BQ1RfTAkweDAwCi0jZGVmaW5lIFBPTENUUkxfRU5fQUNUX0gJMHgwMAotCi0jZGVmaW5lIFBIQUNUUkxfUEhBU0VfTUFOVUFMCTB4MDEKLQotI2RlZmluZSBQSEFEX1FWR0FfREVGQVVMVF9WQUwgKDkpCi0jZGVmaW5lIENPTUFESl9ERUZBVUxUICAgICAgICAoMTI1KQotCi1zdGF0aWMgdm9pZCBsY2R0Z19zc3Bfc2VuZCh1OCBhZHJzLCB1OCBkYXRhKQotewotCXcxMDBmYl9zc3Bfc2VuZChhZHJzLGRhdGEpOwotfQotCi0vKgotICogVGhpcyBpcyBvbmx5IGEgcHN1ZWRvIEkyQyBpbnRlcmZhY2UuIFdlIGNhbid0IHVzZSB0aGUgc3RhbmRhcmQga2VybmVsCi0gKiByb3V0aW5lcyBhcyB0aGUgaW50ZXJmYWNlIGlzIHdyaXRlIG9ubHkuIFdlIGp1c3QgYXNzdW1lIHRoZSBkYXRhIGlzIGFja2VkLi4uCi0gKi8KLXN0YXRpYyB2b2lkIGxjZHRnX3NzcF9pMmNfc2VuZCh1OCBkYXRhKQotewotCWxjZHRnX3NzcF9zZW5kKFBPV0VSUkVHMF9BRFJTLCBkYXRhKTsKLQl1ZGVsYXkoMTApOwotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9iaXQodTggZGF0YSkKLXsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoZGF0YSk7Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGRhdGEgfCBQT1dFUjBfQ09NX0RDTEspOwotCWxjZHRnX3NzcF9pMmNfc2VuZChkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfaTJjX3NlbmRfc3RhcnQodTggYmFzZSkKLXsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCk7Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UgfCBQT1dFUjBfQ09NX0RDTEspOwotCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfaTJjX3NlbmRfc3RvcCh1OCBiYXNlKQotewotCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlKTsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSB8IFBPV0VSMF9DT01fRENMSyk7Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UgfCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQpOwotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9ieXRlKHU4IGJhc2UsIHU4IGRhdGEpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoZGF0YSAmIDB4ODApCi0JCQlsY2R0Z19pMmNfc2VuZF9iaXQoYmFzZSB8IFBPV0VSMF9DT01fRE9VVCk7Ci0JCWVsc2UKLQkJCWxjZHRnX2kyY19zZW5kX2JpdChiYXNlKTsKLQkJZGF0YSA8PD0gMTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2kyY193YWl0X2Fjayh1OCBiYXNlKQotewotCWxjZHRnX2kyY19zZW5kX2JpdChiYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKHU4IGJhc2VfZGF0YSwgdTggZGF0YSkKLXsKLQkvKiBTZXQgQ29tbW9uIFZvbHRhZ2UgdG8gTTYyMzMyRlAgdmlhIEkyQyAqLwotCWxjZHRnX2kyY19zZW5kX3N0YXJ0KGJhc2VfZGF0YSk7Ci0JbGNkdGdfaTJjX3NlbmRfYnl0ZShiYXNlX2RhdGEsIDB4OWMpOwotCWxjZHRnX2kyY193YWl0X2FjayhiYXNlX2RhdGEpOwotCWxjZHRnX2kyY19zZW5kX2J5dGUoYmFzZV9kYXRhLCAweDAwKTsKLQlsY2R0Z19pMmNfd2FpdF9hY2soYmFzZV9kYXRhKTsKLQlsY2R0Z19pMmNfc2VuZF9ieXRlKGJhc2VfZGF0YSwgZGF0YSk7Ci0JbGNkdGdfaTJjX3dhaXRfYWNrKGJhc2VfZGF0YSk7Ci0JbGNkdGdfaTJjX3NlbmRfc3RvcChiYXNlX2RhdGEpOwotfQotCi1zdGF0aWMgc3RydWN0IGxjZHRnX3JlZ2lzdGVyX3NldHRpbmcgewotCXU4IGFkcnM7Ci0JdTggZGF0YTsKLQl1MzIgd2FpdDsKLX0gbGNkdGdfcG93ZXJfb25fdGFibGVbXSA9IHsKLQotICAgIC8qIEluaXRpYWxpemUgSW50ZXJuYWwgTG9naWMgJiBQb3J0ICovCi0gICAgeyBQSUNUUkxfQURSUywKLSAgICAgIFBJQ1RSTF9QT1dFUl9ET1dOIHwgUElDVFJMX0lOSU9GRiB8IFBJQ1RSTF9JTklUX1NUQVRFIHwKLSAgICAgIFBJQ1RSTF9DT01fU0lHTkFMX09GRiB8IFBJQ1RSTF9EQUNfU0lHTkFMX09GRiwKLSAgICAgIDAgfSwKLQotICAgIHsgUE9XRVJSRUcwX0FEUlMsCi0gICAgICBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09GRiB8IFBPV0VSMF9DT01fT0ZGIHwKLSAgICAgIFBPV0VSMF9WQ0M1X09GRiwKLSAgICAgIDAgfSwKLQotICAgIHsgUE9XRVJSRUcxX0FEUlMsCi0gICAgICBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PRkYsCi0gICAgICAwIH0sCi0KLSAgICAvKiBWREQoKzhWKSxTVlNTKC00VikgT04gKi8KLSAgICB7IFBPV0VSUkVHMV9BRFJTLAotICAgICAgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT04gLyogVkREIE9OICovLAotICAgICAgMzAwMCB9LAotCi0gICAgLyogREFDIE9OICovCi0gICAgeyBQT1dFUlJFRzBfQURSUywKLSAgICAgIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT04gLyogREFDIE9OICovIHwKLSAgICAgIFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGLAotICAgICAgMCB9LAotCi0gICAgLyogSU5JQiA9IEgsIElOSSA9IEwgICovCi0gICAgeyBQSUNUUkxfQURSUywKLSAgICAgIC8qIFBJQ1RMWzBdID0gSCAsIFBJQ1RMWzFdID0gUElDVExbMl0gPSBQSUNUTFs0XSA9IEwgKi8KLSAgICAgIFBJQ1RSTF9JTklUX1NUQVRFIHwgUElDVFJMX0NPTV9TSUdOQUxfT0ZGLAotICAgICAgMCB9LAotCi0gICAgLyogU2V0IENvbW1vbiBWb2x0YWdlICovCi0gICAgeyAweGZlLCAwLCAwIH0sCi0KLSAgICAvKiBWQ0M1IE9OICovCi0gICAgeyBQT1dFUlJFRzBfQURSUywKLSAgICAgIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT04gLyogREFDIE9OICovIHwKLSAgICAgIFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT04gLyogVkNDNSBPTiAqLywKLSAgICAgIDAgfSwKLQotICAgIC8qIEdWU1MoLThWKSBPTiAqLwotICAgIHsgUE9XRVJSRUcxX0FEUlMsCi0gICAgICBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT04gLyogR1ZTUyBPTiAqLyB8Ci0gICAgICBQT1dFUjFfVkREX09OIC8qIFZERCBPTiAqLywKLSAgICAgIDIwMDAgfSwKLQotICAgIC8qIENPTSBTSUdOQUwgT04gKFBJQ1RMWzNdID0gTCkgKi8KLSAgICB7IFBJQ1RSTF9BRFJTLAotICAgICAgUElDVFJMX0lOSVRfU1RBVEUsCi0gICAgICAwIH0sCi0KLSAgICAvKiBDT00gT04gKi8KLSAgICB7IFBPV0VSUkVHMF9BRFJTLAotICAgICAgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTiAvKiBEQUMgT04gKi8gfAotICAgICAgUE9XRVIwX0NPTV9PTiAvKiBDT00gT04gKi8gfCBQT1dFUjBfVkNDNV9PTiAvKiBWQ0M1X09OICovLAotICAgICAgMCB9LAotCi0gICAgLyogVlcgT04gKi8KLSAgICB7IFBPV0VSUkVHMV9BRFJTLAotICAgICAgUE9XRVIxX1ZXX09OIC8qIFZXIE9OICovIHwgUE9XRVIxX0dWU1NfT04gLyogR1ZTUyBPTiAqLyB8Ci0gICAgICBQT1dFUjFfVkREX09OIC8qIFZERCBPTiAqLywKLSAgICAgIDAgLyogV2FpdCAxMDBtcyAqLyB9LAotCi0gICAgLyogU2lnbmFscyBvdXRwdXQgZW5hYmxlICovCi0gICAgeyBQSUNUUkxfQURSUywKLSAgICAgIDAgLyogU2lnbmFscyBvdXRwdXQgZW5hYmxlICovLAotICAgICAgMCB9LAotCi0gICAgeyBQSEFDVFJMX0FEUlMsCi0gICAgICBQSEFDVFJMX1BIQVNFX01BTlVBTCwKLSAgICAgIDAgfSwKLQotICAgIC8qIEluaXRpYWxpemUgZm9yIElucHV0IFNpZ25hbHMgZnJvbSBBVEkgKi8KLSAgICB7IFBPTENUUkxfQURSUywKLSAgICAgIFBPTENUUkxfU1lOQ19QT0xfUklTRSB8IFBPTENUUkxfRU5fUE9MX1JJU0UgfCBQT0xDVFJMX0RBVEFfUE9MX1JJU0UgfAotICAgICAgUE9MQ1RSTF9TWU5DX0FDVF9MIHwgUE9MQ1RSTF9FTl9BQ1RfSCwKLSAgICAgIDEwMDAgLyoxMDAwMDAqLyAvKiBXYWl0IDEwMG1zICovIH0sCi0KLSAgICAvKiBlbmQgbWFyayAqLwotICAgIHsgMHhmZiwgMCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZCBsY2R0Z19yZXN1bWUodm9pZCkKLXsKLQlpZiAoY3VycmVudF9wYXItPmxjZE1vZGUgPT0gTENEX01PREVfNDgwIHx8IGN1cnJlbnRfcGFyLT5sY2RNb2RlID09IExDRF9NT0RFXzY0MCkgewotCQlsY2R0Z19od19pbml0KExDRF9TSEFSUF9WR0EpOwotCX0gZWxzZSB7Ci0JCWxjZHRnX2h3X2luaXQoTENEX1NIQVJQX1FWR0EpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfc3VzcGVuZCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IChjdXJyZW50X3Bhci0+eHJlcyAqIGN1cnJlbnRfcGFyLT55cmVzKTsgaSsrKSB7Ci0JCXdyaXRldygweGZmZmYsIHJlbWFwcGVkX2ZidWYgKyAoMippKSk7Ci0JfQotCi0JLyogNjBIeiB4IDIgZnJhbWUgPSAxNi43bXNlYyB4IDIgPSAzMy40IG1zZWMgKi8KLQltZGVsYXkoMzQpOwotCi0JLyogKDEpVlcgT0ZGICovCi0JbGNkdGdfc3NwX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOwotCi0JLyogKDIpQ09NIE9GRiAqLwotCWxjZHRnX3NzcF9zZW5kKFBJQ1RSTF9BRFJTLCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOwotCWxjZHRnX3NzcF9zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7Ci0KLQkvKiAoMylTZXQgQ29tbW9uIFZvbHRhZ2UgQmlhcyAwViAqLwotCWxjZHRnX3NldF9jb21tb25fdm9sdGFnZShQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTiwgMCk7Ci0KLQkvKiAoNClHVlNTIE9GRiAqLwotCWxjZHRnX3NzcF9zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTik7Ci0KLQkvKiAoNSlWQ0M1IE9GRiAqLwotCWxjZHRnX3NzcF9zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpOwotCi0JLyogKDYpU2V0IFBEV04sIElOSU9GRiwgREFDT0ZGICovCi0JbGNkdGdfc3NwX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9JTklPRkYgfCBQSUNUUkxfREFDX1NJR05BTF9PRkYgfAotCQkJUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOwotCi0JLyogKDcpREFDIE9GRiAqLwotCWxjZHRnX3NzcF9zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09GRiB8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKLQotCS8qICg4KVZERCBPRkYgKi8KLQlsY2R0Z19zc3Bfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKLQotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19zZXRfcGhhZGFkaih1MzIgbW9kZSkKLXsKLQlpbnQgYWRqOwotCi0JaWYgKG1vZGUgPT0gTENEX1NIQVJQX1ZHQSkgewotCQkvKiBTZXR0aW5nIGZvciBWR0EgKi8KLQkJYWRqID0gY3VycmVudF9wYXItPnBoYWRhZGo7Ci0JCWlmIChhZGogPCAwKSB7Ci0JCQlhZGogPSBQSEFDVFJMX1BIQVNFX01BTlVBTDsKLQkJfSBlbHNlIHsKLQkJCWFkaiA9ICgoYWRqICYgMHgwZikgPDwgMSkgfCBQSEFDVFJMX1BIQVNFX01BTlVBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFNldHRpbmcgZm9yIFFWR0EgKi8KLQkJYWRqID0gKFBIQURfUVZHQV9ERUZBVUxUX1ZBTCA8PCAxKSB8IFBIQUNUUkxfUEhBU0VfTUFOVUFMOwotCX0KLQlsY2R0Z19zc3Bfc2VuZChQSEFDVFJMX0FEUlMsIGFkaik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2h3X2luaXQodTMyIG1vZGUpCi17Ci0JaW50IGk7Ci0JaW50IGNvbWFkajsKLQotCWkgPSAwOwotCXdoaWxlKGxjZHRnX3Bvd2VyX29uX3RhYmxlW2ldLmFkcnMgIT0gMHhmZikgewotCQlpZiAobGNkdGdfcG93ZXJfb25fdGFibGVbaV0uYWRycyA9PSAweGZlKSB7Ci0JCQkvKiBTZXQgQ29tbW9uIFZvbHRhZ2UgKi8KLQkJCWNvbWFkaiA9IGN1cnJlbnRfcGFyLT5jb21hZGo7Ci0JCQlpZiAoY29tYWRqIDwgMCkgewotCQkJCWNvbWFkaiA9IENPTUFESl9ERUZBVUxUOwotCQkJfQotCQkJbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKChQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpLCBjb21hZGopOwotCQl9IGVsc2UgaWYgKGxjZHRnX3Bvd2VyX29uX3RhYmxlW2ldLmFkcnMgPT0gUEhBQ1RSTF9BRFJTKSB7Ci0JCQkvKiBTZXQgUGhhc2UgQWRqdWN0ICovCi0JCQlsY2R0Z19zZXRfcGhhZGFkaihtb2RlKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE90aGVyICovCi0JCQlsY2R0Z19zc3Bfc2VuZChsY2R0Z19wb3dlcl9vbl90YWJsZVtpXS5hZHJzLCBsY2R0Z19wb3dlcl9vbl90YWJsZVtpXS5kYXRhKTsKLQkJfQotCQlpZiAobGNkdGdfcG93ZXJfb25fdGFibGVbaV0ud2FpdCAhPSAwKQotCQkJdWRlbGF5KGxjZHRnX3Bvd2VyX29uX3RhYmxlW2ldLndhaXQpOwotCQlpKys7Ci0JfQotCi0Jc3dpdGNoKG1vZGUpIHsKLQljYXNlIExDRF9TSEFSUF9RVkdBOgotCQkvKiBTZXQgTGNkIFJlc29sdXRpb24gKFFWR0EpICovCi0JCWxjZHRnX3NzcF9zZW5kKFJFU0NUTF9BRFJTLCBSRVNDVExfUVZHQSk7Ci0JCWJyZWFrOwotCWNhc2UgTENEX1NIQVJQX1ZHQToKLQkJLyogU2V0IExjZCBSZXNvbHV0aW9uIChWR0EpICovCi0JCWxjZHRnX3NzcF9zZW5kKFJFU0NUTF9BRFJTLCBSRVNDVExfVkdBKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19sY2RfY2hhbmdlKHUzMiBtb2RlKQotewotCS8qIFNldCBQaGFzZSBBZGp1Y3QgKi8KLQlsY2R0Z19zZXRfcGhhZGFkaihtb2RlKTsKLQotCWlmIChtb2RlID09IExDRF9TSEFSUF9WR0EpCi0JCS8qIFNldCBMY2QgUmVzb2x1dGlvbiAoVkdBKSAqLwotCQlsY2R0Z19zc3Bfc2VuZChSRVNDVExfQURSUywgUkVTQ1RMX1ZHQSk7Ci0JZWxzZSBpZiAobW9kZSA9PSBMQ0RfU0hBUlBfUVZHQSkKLQkJLyogU2V0IExjZCBSZXNvbHV0aW9uIChRVkdBKSAqLwotCQlsY2R0Z19zc3Bfc2VuZChSRVNDVExfQURSUywgUkVTQ1RMX1FWR0EpOwotfQotCi0KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB3MTAwZmJfZHJpdmVyID0gewogCS5uYW1lCQk9ICJ3MTAwZmIiLAogCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLApAQCAtMTg3MCw0ICsxNDc0LDQgQEAKIG1vZHVsZV9leGl0KHcxMDBmYl9jbGVhbnVwKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBVEkgSW1hZ2VvbiB3MTAwIGZyYW1lYnVmZmVyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTHYyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5oIGIvZHJpdmVycy92aWRlby93MTAwZmIuaAppbmRleCA0MTYyNGY5Li43YTU4YTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmgKQEAgLTUsOSArNSwxMiBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiwgQVRJIENvcnAuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZQorICogQ29weXJpZ2h0IChjKSAyMDA1IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CiAgKgogICogTW9kaWZpZWQgdG8gd29yayB3aXRoIDIuNiBieSBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+CiAgKgorICogdzMyeHggc3VwcG9ydCBieSBJYW4gTW9sdG9uCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTE5LDcgKzIyLDcgQEAKIAogLyogQmxvY2sgQ0lGIFN0YXJ0OiAqLwogI2RlZmluZSBtbUNISVBfSUQgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBtbVJFVklTSU9OX0lECQkweDAwMDQKKyNkZWZpbmUgbW1SRVZJU0lPTl9JRCAgICAgICAweDAwMDQKICNkZWZpbmUgbW1XUkFQX0JVRl9BICAgICAgICAweDAwMDgKICNkZWZpbmUgbW1XUkFQX0JVRl9CICAgICAgICAweDAwMEMKICNkZWZpbmUgbW1XUkFQX1RPUF9ESVIgICAgICAweDAwMTAKQEAgLTg4LDcgKzkxLDcgQEAKICNkZWZpbmUgbW1ESVNQX0RFQlVHICAgICAgICAweDA0RDQKICNkZWZpbmUgbW1ESVNQX0RCX0JVRl9DTlRMICAweDA0RDgKICNkZWZpbmUgbW1ESVNQX0NSQ19TSUcgICAgICAweDA0REMKLSNkZWZpbmUgbW1DUlRDX0RFRkFVTFRfQ09VTlQgCTB4MDRFMAorI2RlZmluZSBtbUNSVENfREVGQVVMVF9DT1VOVCAgICAweDA0RTAKICNkZWZpbmUgbW1MQ0RfQkFDS0dST1VORF9DT0xPUiAgMHgwNEU0CiAjZGVmaW5lIG1tQ1JUQ19QUzIgICAgICAgICAgMHgwNEU4CiAjZGVmaW5lIG1tQ1JUQ19QUzJfVlBPUyAgICAgMHgwNEVDCkBAIC0xMTksMTcgKzEyMiwxNyBAQAogLyogQmxvY2sgRElTUExBWSBFbmQ6ICovCiAKIC8qIEJsb2NrIEdGWCBTdGFydDogKi8KLSNkZWZpbmUgbW1CUlVTSF9PRkZTRVQgICAgICAweDEwOEMKLSNkZWZpbmUgbW1CUlVTSF9ZX1ggICAgICAgICAweDEwNzQKLSNkZWZpbmUgbW1ERUZBVUxUX1BJVENIX09GRlNFVAkJMHgxMEEwCi0jZGVmaW5lIG1tREVGQVVMVF9TQ19CT1RUT01fUklHSFQJMHgxMEE4Ci0jZGVmaW5lIG1tREVGQVVMVDJfU0NfQk9UVE9NX1JJR0hUCTB4MTBBQwotI2RlZmluZSBtbUdMT0JBTF9BTFBIQSAgICAgIDB4MTIxMAotI2RlZmluZSBtbUZJTFRFUl9DT0VGICAgICAgIDB4MTIxNAotI2RlZmluZSBtbU1WQ19DTlRMX1NUQVJUICAgIDB4MTFFMAotI2RlZmluZSBtbUUyX0FSSVRITUVUSUNfQ05UTAkweDEyMjAKLSNkZWZpbmUgbW1FTkdfQ05UTCAgICAgICAgICAweDEzRTgKLSNkZWZpbmUgbW1FTkdfUEVSRl9DTlQgICAgICAweDEzRjAKKyNkZWZpbmUgbW1CUlVTSF9PRkZTRVQgICAgICAgIDB4MTA4QworI2RlZmluZSBtbUJSVVNIX1lfWCAgICAgICAgICAgMHgxMDc0CisjZGVmaW5lIG1tREVGQVVMVF9QSVRDSF9PRkZTRVQgICAgICAweDEwQTAKKyNkZWZpbmUgbW1ERUZBVUxUX1NDX0JPVFRPTV9SSUdIVCAgIDB4MTBBOAorI2RlZmluZSBtbURFRkFVTFQyX1NDX0JPVFRPTV9SSUdIVCAgMHgxMEFDCisjZGVmaW5lIG1tR0xPQkFMX0FMUEhBICAgICAgICAweDEyMTAKKyNkZWZpbmUgbW1GSUxURVJfQ09FRiAgICAgICAgIDB4MTIxNAorI2RlZmluZSBtbU1WQ19DTlRMX1NUQVJUICAgICAgMHgxMUUwCisjZGVmaW5lIG1tRTJfQVJJVEhNRVRJQ19DTlRMICAweDEyMjAKKyNkZWZpbmUgbW1FTkdfQ05UTCAgICAgICAgICAgIDB4MTNFOAorI2RlZmluZSBtbUVOR19QRVJGX0NOVCAgICAgICAgMHgxM0YwCiAvKiBCbG9jayBHRlggRW5kOiAqLwogCiAvKiBCbG9jayBJRENUIFN0YXJ0OiAqLwpAQCAtMTQxLDIyICsxNDQsMzggQEAKIC8qIEJsb2NrIElEQ1QgRW5kOiAqLwogCiAvKiBCbG9jayBNQyBTdGFydDogKi8KLSNkZWZpbmUgbW1NRU1fQ05UTCAgICAgICAgICAweDAxODAKLSNkZWZpbmUgbW1NRU1fQVJCICAgICAgICAgICAweDAxODQKLSNkZWZpbmUgbW1NQ19GQl9MT0NBVElPTiAgICAweDAxODgKLSNkZWZpbmUgbW1NRU1fRVhUX0NOVEwgICAgICAweDAxOEMKLSNkZWZpbmUgbW1NQ19FWFRfTUVNX0xPQ0FUSU9OICAgMHgwMTkwCi0jZGVmaW5lIG1tTUVNX0VYVF9USU1JTkdfQ05UTCAgIDB4MDE5NAotI2RlZmluZSBtbU1FTV9TRFJBTV9NT0RFX1JFRwkweDAxOTgKLSNkZWZpbmUgbW1NRU1fSU9fQ05UTCAgICAgICAweDAxOUMKLSNkZWZpbmUgbW1NQ19ERUJVRyAgICAgICAgICAweDAxQTAKLSNkZWZpbmUgbW1NQ19CSVNUX0NUUkwgICAgICAweDAxQTQKLSNkZWZpbmUgbW1NQ19CSVNUX0NPTExBUl9SRUFEICAJMHgwMUE4Ci0jZGVmaW5lIG1tVENfTUlTTUFUQ0ggICAgICAgMHgwMUFDCi0jZGVmaW5lIG1tTUNfUEVSRl9NT05fQ05UTCAgMHgwMUIwCi0jZGVmaW5lIG1tTUNfUEVSRl9DT1VOVEVSUyAgMHgwMUI0CisjZGVmaW5lIG1tTUVNX0NOVEwgICAgICAgICAgICAgMHgwMTgwCisjZGVmaW5lIG1tTUVNX0FSQiAgICAgICAgICAgICAgMHgwMTg0CisjZGVmaW5lIG1tTUNfRkJfTE9DQVRJT04gICAgICAgMHgwMTg4CisjZGVmaW5lIG1tTUVNX0VYVF9DTlRMICAgICAgICAgMHgwMThDCisjZGVmaW5lIG1tTUNfRVhUX01FTV9MT0NBVElPTiAgMHgwMTkwCisjZGVmaW5lIG1tTUVNX0VYVF9USU1JTkdfQ05UTCAgMHgwMTk0CisjZGVmaW5lIG1tTUVNX1NEUkFNX01PREVfUkVHICAgMHgwMTk4CisjZGVmaW5lIG1tTUVNX0lPX0NOVEwgICAgICAgICAgMHgwMTlDCisjZGVmaW5lIG1tTUNfREVCVUcgICAgICAgICAgICAgMHgwMUEwCisjZGVmaW5lIG1tTUNfQklTVF9DVFJMICAgICAgICAgMHgwMUE0CisjZGVmaW5lIG1tTUNfQklTVF9DT0xMQVJfUkVBRCAgMHgwMUE4CisjZGVmaW5lIG1tVENfTUlTTUFUQ0ggICAgICAgICAgMHgwMUFDCisjZGVmaW5lIG1tTUNfUEVSRl9NT05fQ05UTCAgICAgMHgwMUIwCisjZGVmaW5lIG1tTUNfUEVSRl9DT1VOVEVSUyAgICAgMHgwMUI0CiAvKiBCbG9jayBNQyBFbmQ6ICovCiAKKy8qIEJsb2NrIEJNIFN0YXJ0OiAqLworI2RlZmluZSBtbUJNX0VYVF9NRU1fQkFORFdJRFRIICAgIDB4MEEwMAorI2RlZmluZSBtbUJNX09GRlNFVCAgICAgICAgICAgICAgIDB4MEEwNAorI2RlZmluZSBtbUJNX01FTV9FWFRfVElNSU5HX0NOVEwgIDB4MEEwOAorI2RlZmluZSBtbUJNX01FTV9FWFRfQ05UTCAgICAgICAgIDB4MEEwQworI2RlZmluZSBtbUJNX01FTV9NT0RFX1JFRyAgICAgICAgIDB4MEExMAorI2RlZmluZSBtbUJNX01FTV9JT19DTlRMICAgICAgICAgIDB4MEExOAorI2RlZmluZSBtbUJNX0NPTkZJRyAgICAgICAgICAgICAgIDB4MEExQworI2RlZmluZSBtbUJNX1NUQVRVUyAgICAgICAgICAgICAgIDB4MEEyMAorI2RlZmluZSBtbUJNX0RFQlVHICAgICAgICAgICAgICAgIDB4MEEyNAorI2RlZmluZSBtbUJNX1BFUkZfTU9OX0NOVEwgICAgICAgIDB4MEEyOAorI2RlZmluZSBtbUJNX1BFUkZfQ09VTlRFUlMgICAgICAgIDB4MEEyQworI2RlZmluZSBtbUJNX1BFUkYyX01PTl9DTlRMICAgICAgIDB4MEEzMAorI2RlZmluZSBtbUJNX1BFUkYyX0NPVU5URVJTICAgICAgIDB4MEEzNAorLyogQmxvY2sgQk0gRW5kOiAqLworCiAvKiBCbG9jayBSQkJNIFN0YXJ0OiAqLwogI2RlZmluZSBtbVdBSVRfVU5USUwgICAgICAgIDB4MTQwMAogI2RlZmluZSBtbUlTWU5DX0NOVEwgICAgICAgIDB4MTQwNApAQCAtMTc2LDQzOSArMTk1LDU3NSBAQAogLyogQmxvY2sgQ0cgRW5kOiAqLwogCiAvKiBkZWZhdWx0IHZhbHVlIGRlZmluaXRpb25zICovCi0jZGVmaW5lIGRlZldSQVBfVE9QX0RJUiAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBkZWZXUkFQX1NUQVJUX0RJUgkweDAwMDAwMDAwCi0jZGVmaW5lIGRlZkNGR1JFR19CQVNFICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBkZWZDSUZfSU8gICAgICAgICAgIDB4MDAwQzA5MDIKLSNkZWZpbmUgZGVmSU5URl9DTlRMICAgICAgICAweDAwMDAwMDExCi0jZGVmaW5lIGRlZkNQVV9ERUZBVUxUUyAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBkZWZIV19JTlQgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgZGVmTUNfRVhUX01FTV9MT0NBVElPTiAgICAgICAgICAgIDB4MDdmZjAwMDAKLSNkZWZpbmUgZGVmVENfTUlTTUFUQ0ggICAgICAweDAwMDAwMDAwCisjZGVmaW5lIGRlZldSQVBfVE9QX0RJUiAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBkZWZXUkFQX1NUQVJUX0RJUiAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgZGVmQ0ZHUkVHX0JBU0UgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIGRlZkNJRl9JTyAgICAgICAgICAgICAgMHgwMDBDMDkwMgorI2RlZmluZSBkZWZJTlRGX0NOVEwgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgZGVmQ1BVX0RFRkFVTFRTICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIGRlZkhXX0lOVCAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBkZWZNQ19FWFRfTUVNX0xPQ0FUSU9OIDB4MDdmZjAwMDAKKyNkZWZpbmUgZGVmVENfTUlTTUFUQ0ggICAgICAgICAweDAwMDAwMDAwCiAKICNkZWZpbmUgVzEwMF9DRkdfQkFTRSAgICAgICAgICAweDAKICNkZWZpbmUgVzEwMF9DRkdfTEVOICAgICAgICAgICAweDEwCiAjZGVmaW5lIFcxMDBfUkVHX0JBU0UgICAgICAgICAgMHgxMDAwMAogI2RlZmluZSBXMTAwX1JFR19MRU4gICAgICAgICAgIDB4MjAwMAogI2RlZmluZSBNRU1fSU5UX0JBU0VfVkFMVUUgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE1FTV9JTlRfVE9QX1ZBTFVFX1cxMDAgMHgxNWZmZmYKICNkZWZpbmUgTUVNX0VYVF9CQVNFX1ZBTFVFICAgICAweDgwMDAwMAotI2RlZmluZSBNRU1fRVhUX1RPUF9WQUxVRSAgICAgIDB4OWZmZmZmCisjZGVmaW5lIE1FTV9JTlRfU0laRSAgICAgICAgICAgMHgwNWZmZmYKKyNkZWZpbmUgTUVNX1dJTkRPV19CQVNFICAgICAgICAweDEwMDAwMAorI2RlZmluZSBNRU1fV0lORE9XX1NJWkUgICAgICAgIDB4ZjAwMDAwCisKICNkZWZpbmUgV1JBUF9CVUZfQkFTRV9WQUxVRSAgICAweDgwMDAwCiAjZGVmaW5lIFdSQVBfQlVGX1RPUF9WQUxVRSAgICAgMHhiZmZmZgogCisjZGVmaW5lIENISVBfSURfVzEwMCAgICAgICAgICAgMHg1NzQxMTAwMgorI2RlZmluZSBDSElQX0lEX1czMjAwICAgICAgICAgIDB4NTY0NDEwMDIKKyNkZWZpbmUgQ0hJUF9JRF9XMzIyMCAgICAgICAgICAweDU3NDQxMDAyCiAKLS8qIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zICovCisvKiBSZWdpc3RlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgKi8KIAogc3RydWN0IHdyYXBfdG9wX2Rpcl90IHsKLSAgICAgdW5zaWduZWQgbG9uZyB0b3BfYWRkciAgICAgICAgIDogMjM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogOTsKKwl1bnNpZ25lZCBsb25nIHRvcF9hZGRyICA6IDIzOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIDogOTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIHdyYXBfdG9wX2Rpcl91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHdyYXBfdG9wX2Rpcl90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3Qgd3JhcF90b3BfZGlyX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB3cmFwX3N0YXJ0X2Rpcl90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyICAgICAgIDogMjM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogOTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIgOiAyMzsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgOiA5OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gd3JhcF9zdGFydF9kaXJfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCB3cmFwX3N0YXJ0X2Rpcl90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3Qgd3JhcF9zdGFydF9kaXJfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGNpZl9jbnRsX3QgewotICAgICB1bnNpZ25lZCBsb25nIHN3YXBfcmVnICAgICAgICAgCQk6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3dhcF9mYnVmXzEgICAgICAJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBzd2FwX2ZidWZfMiAgICAgIAkJOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHN3YXBfZmJ1Zl8zICAgICAgCQk6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcG1pX2ludF9kaXNhYmxlICAJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBwbWlfc2NobWVuX2Rpc2FibGUgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGludGJfb2UgICAgICAgICAgCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fd2FpdF90b19jb21wZW5zYXRlX2RxX3Byb3BfZGx5IDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBjb21wZW5zYXRlX3dhaXRfcmRfc2l6ZSAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHdhaXRfYXNzZXJ0ZWRfdGltZW91dF92YWwgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2FpdF9tYXNrZWRfdmFsICAJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl93YWl0X3RpbWVvdXQgIAkJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX29uZV9jbGtfc2V0dXBfYmVmb3JlX3dhaXQgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50ZXJydXB0X2FjdGl2ZV9oaWdoICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9vdmVyd3JpdGVfc3RyYXBzICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHN0cmFwX3dhaXRfYWN0aXZlX2hpICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGF0X2J1c3lfY291bnQgICAJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBsYXRfcmRfcG00X3NjbGtfYnVzeSAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19zeXN0ZW1fYml0cyAgCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX21yICAgICAgICAgICAJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBjaWZfc3BhcmVfMSAgICAgIAkJOiA0OworCXVuc2lnbmVkIGxvbmcgc3dhcF9yZWcgICAgICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHN3YXBfZmJ1Zl8xICAgICAgICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBzd2FwX2ZidWZfMiAgICAgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgc3dhcF9mYnVmXzMgICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHBtaV9pbnRfZGlzYWJsZSAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbWlfc2NobWVuX2Rpc2FibGUgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgaW50Yl9vZSAgICAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX3dhaXRfdG9fY29tcGVuc2F0ZV9kcV9wcm9wX2RseSAgOiAxOworCXVuc2lnbmVkIGxvbmcgY29tcGVuc2F0ZV93YWl0X3JkX3NpemUgIDogMjsKKwl1bnNpZ25lZCBsb25nIHdhaXRfYXNzZXJ0ZWRfdGltZW91dF92YWwgIDogMjsKKwl1bnNpZ25lZCBsb25nIHdhaXRfbWFza2VkX3ZhbCAgICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBlbl93YWl0X3RpbWVvdXQgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fb25lX2Nsa19zZXR1cF9iZWZvcmVfd2FpdCAgOiAxOworCXVuc2lnbmVkIGxvbmcgaW50ZXJydXB0X2FjdGl2ZV9oaWdoICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVuX292ZXJ3cml0ZV9zdHJhcHMgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBzdHJhcF93YWl0X2FjdGl2ZV9oaSAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgbGF0X2J1c3lfY291bnQgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIGxhdF9yZF9wbTRfc2Nsa19idXN5ICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfc3lzdGVtX2JpdHMgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX21yICAgICAgICAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGNpZl9zcGFyZV8xICAgICAgICAgICAgICA6IDQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjaWZfY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGNpZl9jbnRsX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBjaWZfY250bF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgY2ZncmVnX2Jhc2VfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY2ZncmVnX2Jhc2UgICAgICA6IDI0OwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDg7CisJdW5zaWduZWQgbG9uZyBjZmdyZWdfYmFzZSAgOiAyNDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICA6IDg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjZmdyZWdfYmFzZV91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGNmZ3JlZ19iYXNlX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBjZmdyZWdfYmFzZV90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgY2lmX2lvX3QgewotICAgICB1bnNpZ25lZCBsb25nIGRxX3NycCAgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRxX3NybiAgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRxX3NwICAgICAgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIGRxX3NuICAgICAgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHdhaXRiX3NycCAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHdhaXRiX3NybiAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHdhaXRiX3NwICAgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHdhaXRiX3NuICAgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIGludGJfc3JwICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGludGJfc3JuICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGludGJfc3AgICAgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIGludGJfc24gICAgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDI7CisJdW5zaWduZWQgbG9uZyBkcV9zcnAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRxX3NybiAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZHFfc3AgICAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBkcV9zbiAgICAgIDogNDsKKwl1bnNpZ25lZCBsb25nIHdhaXRiX3NycCAgOiAxOworCXVuc2lnbmVkIGxvbmcgd2FpdGJfc3JuICA6IDE7CisJdW5zaWduZWQgbG9uZyB3YWl0Yl9zcCAgIDogNDsKKwl1bnNpZ25lZCBsb25nIHdhaXRiX3NuICAgOiA0OworCXVuc2lnbmVkIGxvbmcgaW50Yl9zcnAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBpbnRiX3NybiAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGludGJfc3AgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgaW50Yl9zbiAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgIDogMjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGNpZl9pb191IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGNpZl9pb190IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgY2lmX2lvX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBjaWZfcmVhZF9kYmdfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdW5wYWNrZXJfcHJlX2ZldGNoX3RyaWdfZ2VuICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGx5X3NlY29uZF9yZF9mZXRjaF90cmlnICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcnN0X3JkX2J1cnN0X2lkICAJCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3JkX2J1cnN0X2lkICAJCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fYmxvY2tfcmRfd2hlbl9wYWNrZXJfaXNfbm90X2VtcCA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3ByZV9mZXRjaF9jbnRsX3NtICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcmJibV9jaHJuY3lfZGlzICAJCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcmJibV9yZF9hZnRlcl93cl9sYXQgICAgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX2JlX2R1cmluZ19yZCAJCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb25lX2Nsa19pbnZhbGlkYXRlX3B1bHNlICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX2NobmxfcHJpb3JpdHkJCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcnN0X3JlYWRfcGF0aF9hX3BscyAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcnN0X3JlYWRfcGF0aF9iX3BscyAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3JlZ19yZF9mZXRjaF90cmlnICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3JkX2ZldGNoX3RyaWdfZnJvbV9pbmRfYWRkciA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3JkX3NhbWVfYnl0ZV90b190cmlnX2ZldGNoIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfZGlyX3dyYXAgICAgIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcmluZ19idWZfdG9fZm9yY2VfZGVjICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfYWRkcl9jb21wX2luXzE2Yml0ICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBjbHJfdyAgICAgICAgICAgIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlcnJfcmRfdGFnX2lzXzMgIAkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlcnJfbG9hZF93aGVuX2Z1bF9hICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlcnJfbG9hZF93aGVuX2Z1bF9iICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJCQkJOiA3OworCXVuc2lnbmVkIGxvbmcgdW5wYWNrZXJfcHJlX2ZldGNoX3RyaWdfZ2VuICA6IDI7CisJdW5zaWduZWQgbG9uZyBkbHlfc2Vjb25kX3JkX2ZldGNoX3RyaWcgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHJzdF9yZF9idXJzdF9pZCAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3JkX2J1cnN0X2lkICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9ibG9ja19yZF93aGVuX3BhY2tlcl9pc19ub3RfZW1wIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19wcmVfZmV0Y2hfY250bF9zbSAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcmJibV9jaHJuY3lfZGlzICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyByYmJtX3JkX2FmdGVyX3dyX2xhdCAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIGRpc19iZV9kdXJpbmdfcmQgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgb25lX2Nsa19pbnZhbGlkYXRlX3B1bHNlICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfY2hubF9wcmlvcml0eSAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHJzdF9yZWFkX3BhdGhfYV9wbHMgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcnN0X3JlYWRfcGF0aF9iX3BscyAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfcmVnX3JkX2ZldGNoX3RyaWcgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19yZF9mZXRjaF90cmlnX2Zyb21faW5kX2FkZHIgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3JkX3NhbWVfYnl0ZV90b190cmlnX2ZldGNoIDogMTsKKwl1bnNpZ25lZCBsb25nIGRpc19kaXJfd3JhcCAgICAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3JpbmdfYnVmX3RvX2ZvcmNlX2RlYyAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfYWRkcl9jb21wX2luXzE2Yml0ICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGNscl93ICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZXJyX3JkX3RhZ19pc18zICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlcnJfbG9hZF93aGVuX2Z1bF9hICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGVycl9sb2FkX3doZW5fZnVsX2IgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDc7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjaWZfcmVhZF9kYmdfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBjaWZfcmVhZF9kYmdfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNpZl9yZWFkX2RiZ190IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgY2lmX3dyaXRlX2RiZ190IHsKLSAgICAgdW5zaWduZWQgbG9uZyBwYWNrZXJfdGltZW91dF9jb3VudCAgICAgICAgICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIGVuX3VwcGVyX2xvYWRfY29uZCAgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fY2hubF9jaGFuZ2VfY29uZCAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfYWRkcl9jb21wX2NvbmQgICAgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19sb2FkX3NhbWVfYnl0ZV9hZGRyX2NvbmQgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX3RpbWVvdXRfY29uZCAJCQkgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfdGltZW91dF9kdXJpbmdfcmJibSAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19wYWNrZXJfZnVsX2R1cmluZ19yYmJtX3RpbWVvdXQgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX2R3b3JkX3NwbGl0X3RvX3JiYm0gICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fZHVtbXlfdmFsICAgICAJCQkgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkdW1teV92YWxfc2VsICAgIAkJCSAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIG1hc2tfcG00X3dycHRyX2RlYyAgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX21jX2NsZWFuX2NvbmQJCQkgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlcnJfdHdvX3JlcWlfZHVyaW5nX2Z1bCAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVycl9yZXFpX2R1cmluZ19pZGxlX2NsayAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZXJyX2dsb2JhbCAgICAgICAJCQkgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl93cl9idWZfZGJnX2xvYWQgICAgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX3dyX2J1Zl9kYmdfcGF0aCAgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2VsX3dyX2J1Zl9ieXRlICAJCQkgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBkaXNfcmRfZmx1c2hfd3IgIAkJCSAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGRpc19wYWNrZXJfZnVsX2NvbmQgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX2ludmFsaWRhdGVfYnlfb3BzX2NobmwgICAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbl9oYWx0X3doZW5fcmVxaV9lcnIgICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGNpZl9zcGFyZV8yICAgICAgCQkJICA6IDU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCQkJCSAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGFja2VyX3RpbWVvdXRfY291bnQgICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgZW5fdXBwZXJfbG9hZF9jb25kICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fY2hubF9jaGFuZ2VfY29uZCAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX2FkZHJfY29tcF9jb25kICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX2xvYWRfc2FtZV9ieXRlX2FkZHJfY29uZCAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3RpbWVvdXRfY29uZCAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3RpbWVvdXRfZHVyaW5nX3JiYm0gICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZGlzX3BhY2tlcl9mdWxfZHVyaW5nX3JiYm1fdGltZW91dCA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9kd29yZF9zcGxpdF90b19yYmJtICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9kdW1teV92YWwgICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkdW1teV92YWxfc2VsICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBtYXNrX3BtNF93cnB0cl9kZWMgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfbWNfY2xlYW5fY29uZCAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlcnJfdHdvX3JlcWlfZHVyaW5nX2Z1bCAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlcnJfcmVxaV9kdXJpbmdfaWRsZV9jbGsgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlcnJfZ2xvYmFsICAgICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl93cl9idWZfZGJnX2xvYWQgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl93cl9idWZfZGJnX3BhdGggICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBzZWxfd3JfYnVmX2J5dGUgICAgICAgICAgICAgICA6IDM7CisJdW5zaWduZWQgbG9uZyBkaXNfcmRfZmx1c2hfd3IgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfcGFja2VyX2Z1bF9jb25kICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBkaXNfaW52YWxpZGF0ZV9ieV9vcHNfY2hubCAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9oYWx0X3doZW5fcmVxaV9lcnIgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBjaWZfc3BhcmVfMiAgICAgICAgICAgICAgICAgICA6IDU7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjaWZfd3JpdGVfZGJnX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgY2lmX3dyaXRlX2RiZ190IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgY2lmX3dyaXRlX2RiZ190IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAKIHN0cnVjdCBpbnRmX2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGNoYXIgYWRfaW5jX2EgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgcmluZ19idWZfYSAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgcmRfZmV0Y2hfdHJpZ2dlcl9hICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgcmRfZGF0YV9yZHlfYSAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgYWRfaW5jX2IgICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgcmluZ19idWZfYiAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgcmRfZmV0Y2hfdHJpZ2dlcl9iICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgcmRfZGF0YV9yZHlfYiAgICAgICA6IDE7CisJdW5zaWduZWQgY2hhciBhZF9pbmNfYSAgICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIHJpbmdfYnVmX2EgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGNoYXIgcmRfZmV0Y2hfdHJpZ2dlcl9hICA6IDE7CisJdW5zaWduZWQgY2hhciByZF9kYXRhX3JkeV9hICAgICAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIGFkX2luY19iICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGNoYXIgcmluZ19idWZfYiAgICAgICAgICA6IDE7CisJdW5zaWduZWQgY2hhciByZF9mZXRjaF90cmlnZ2VyX2IgIDogMTsKKwl1bnNpZ25lZCBjaGFyIHJkX2RhdGFfcmR5X2IgICAgICAgOiAxOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gaW50Zl9jbnRsX3UgewotICAgICB1bnNpZ25lZCBjaGFyIHZhbCA6IDg7Ci0gICAgIHN0cnVjdCBpbnRmX2NudGxfdCBmOworCXVuc2lnbmVkIGNoYXIgdmFsIDogODsKKwlzdHJ1Y3QgaW50Zl9jbnRsX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBjcHVfZGVmYXVsdHNfdCB7Ci0gICAgIHVuc2lnbmVkIGNoYXIgdW5wYWNrX3JkX2RhdGEgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgYWNjZXNzX2luZF9hZGRyX2E6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgYWNjZXNzX2luZF9hZGRyX2I6IDE7Ci0gICAgIHVuc2lnbmVkIGNoYXIgYWNjZXNzX3NjcmF0Y2hfcmVnICAgICAgICAgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciBwYWNrX3dyX2RhdGEgICAgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciB0cmFuc2l0aW9uX3NpemUgIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciBlbl9yZWFkX2J1Zl9tb2RlIDogMTsKLSAgICAgdW5zaWduZWQgY2hhciByZF9mZXRjaF9zY3JhdGNoIDogMTsKKwl1bnNpZ25lZCBjaGFyIHVucGFja19yZF9kYXRhICAgICA6IDE7CisJdW5zaWduZWQgY2hhciBhY2Nlc3NfaW5kX2FkZHJfYSAgOiAxOworCXVuc2lnbmVkIGNoYXIgYWNjZXNzX2luZF9hZGRyX2IgIDogMTsKKwl1bnNpZ25lZCBjaGFyIGFjY2Vzc19zY3JhdGNoX3JlZyA6IDE7CisJdW5zaWduZWQgY2hhciBwYWNrX3dyX2RhdGEgICAgICAgOiAxOworCXVuc2lnbmVkIGNoYXIgdHJhbnNpdGlvbl9zaXplICAgIDogMTsKKwl1bnNpZ25lZCBjaGFyIGVuX3JlYWRfYnVmX21vZGUgICA6IDE7CisJdW5zaWduZWQgY2hhciByZF9mZXRjaF9zY3JhdGNoICAgOiAxOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gY3B1X2RlZmF1bHRzX3UgewotICAgICB1bnNpZ25lZCBjaGFyIHZhbCA6IDg7Ci0gICAgIHN0cnVjdCBjcHVfZGVmYXVsdHNfdCBmOworCXVuc2lnbmVkIGNoYXIgdmFsIDogODsKKwlzdHJ1Y3QgY3B1X2RlZmF1bHRzX3QgZjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjcnRjX3RvdGFsX3QgeworCXVuc2lnbmVkIGxvbmcgY3J0Y19oX3RvdGFsIDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgOiA2OworCXVuc2lnbmVkIGxvbmcgY3J0Y192X3RvdGFsIDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgOiA2OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gY3J0Y190b3RhbF91IHsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBjcnRjX3RvdGFsX3QgZjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjcnRjX3NzX3QgeworCXVuc2lnbmVkIGxvbmcgc3Nfc3RhcnQgICAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgIDogNjsKKwl1bnNpZ25lZCBsb25nIHNzX2VuZCAgICAgIDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBzc19hbGlnbiAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBzc19wb2wgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBzc19ydW5fbW9kZSA6IDE7CisJdW5zaWduZWQgbG9uZyBzc19lbiAgICAgICA6IDE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBjcnRjX3NzX3UgeworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNydGNfc3NfdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGFjdGl2ZV9oX2Rpc3BfdCB7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfaF9zdGFydCAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfaF9lbmQgICAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBhY3RpdmVfaF9kaXNwX3UgeworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGFjdGl2ZV9oX2Rpc3BfdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGFjdGl2ZV92X2Rpc3BfdCB7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfdl9zdGFydCAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfdl9lbmQgICAgOiAxMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICA6IDY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBhY3RpdmVfdl9kaXNwX3UgeworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGFjdGl2ZV92X2Rpc3BfdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGdyYXBoaWNfaF9kaXNwX3QgeworCXVuc2lnbmVkIGxvbmcgZ3JhcGhpY19oX3N0YXJ0IDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgOiA2OworCXVuc2lnbmVkIGxvbmcgZ3JhcGhpY19oX2VuZCAgIDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgOiA2OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gZ3JhcGhpY19oX2Rpc3BfdSB7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgZ3JhcGhpY19oX2Rpc3BfdCBmOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGdyYXBoaWNfdl9kaXNwX3QgeworCXVuc2lnbmVkIGxvbmcgZ3JhcGhpY192X3N0YXJ0IDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgOiA2OworCXVuc2lnbmVkIGxvbmcgZ3JhcGhpY192X2VuZCAgIDogMTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgOiA2OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gZ3JhcGhpY192X2Rpc3BfdXsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBncmFwaGljX3ZfZGlzcF90IGY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3JhcGhpY19jdHJsX3RfdzEwMCB7CisJdW5zaWduZWQgbG9uZyBjb2xvcl9kZXB0aCAgICAgICA6IDM7CisJdW5zaWduZWQgbG9uZyBwb3J0cmFpdF9tb2RlICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBsb3dfcG93ZXJfb24gICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyByZXFfZnJlcSAgICAgICAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBlbl9jcnRjICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9ncmFwaGljX3JlcSAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9ncmFwaGljX2NydGMgICA6IDE7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9yZXFfZ3JhcGhpYyA6IDk7CisJdW5zaWduZWQgbG9uZyBsY2RfcGNsa19vbiAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBsY2Rfc2Nsa19vbiAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwY2xrX3J1bm5pbmcgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBzY2xrX3J1bm5pbmcgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICA6IDY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3JhcGhpY19jdHJsX3RfdzMyeHggeworCXVuc2lnbmVkIGxvbmcgY29sb3JfZGVwdGggICAgICAgOiAzOworCXVuc2lnbmVkIGxvbmcgcG9ydHJhaXRfbW9kZSAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgbG93X3Bvd2VyX29uICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcmVxX2ZyZXEgICAgICAgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgZW5fY3J0YyAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fZ3JhcGhpY19yZXEgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fZ3JhcGhpY19jcnRjICAgOiAxOworCXVuc2lnbmVkIGxvbmcgdG90YWxfcmVxX2dyYXBoaWMgOiAxMDsKKwl1bnNpZ25lZCBsb25nIGxjZF9wY2xrX29uICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGxjZF9zY2xrX29uICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBjbGtfcnVubmluZyAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfcnVubmluZyAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIDogNTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIGdyYXBoaWNfY3RybF91IHsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBncmFwaGljX2N0cmxfdF93MTAwIGZfdzEwMDsKKwlzdHJ1Y3QgZ3JhcGhpY19jdHJsX3RfdzMyeHggZl93MzJ4eDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB2aWRlb19jdHJsX3QgewotICAgICB1bnNpZ25lZCBsb25nIHZpZGVvX21vZGUgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGtleWVyX2VuICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX3ZpZGVvX3JlcSAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGVuX2dyYXBoaWNfcmVxX3ZpZGVvICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fdmlkZW9fY3J0YyAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9faG9yX2V4cCAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fdmVyX2V4cCAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdXZfY29tYmluZSAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfcmVxX3ZpZGVvICA6IDk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fY2hfc2VsICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fcG9ydHJhaXQgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgeXV2MnJnYl9lbiAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgeXV2MnJnYl9vcHRpb24gICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9faW52X2hvciAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9faW52X3ZlciAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ2FtbWFfc2VsICAgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzX2xpbWl0ICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fdXZfaGJsZW5kICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcmdiX2dhbW1hX3NlbCAgICA6IDI7CisJdW5zaWduZWQgbG9uZyB2aWRlb19tb2RlICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGtleWVyX2VuICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fdmlkZW9fcmVxICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl9ncmFwaGljX3JlcV92aWRlbyAgOiAxOworCXVuc2lnbmVkIGxvbmcgZW5fdmlkZW9fY3J0YyAgICA6IDE7CisJdW5zaWduZWQgbG9uZyB2aWRlb19ob3JfZXhwICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHZpZGVvX3Zlcl9leHAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgdXZfY29tYmluZSAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9yZXFfdmlkZW8gIDogOTsKKwl1bnNpZ25lZCBsb25nIHZpZGVvX2NoX3NlbCAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgdmlkZW9fcG9ydHJhaXQgICA6IDI7CisJdW5zaWduZWQgbG9uZyB5dXYycmdiX2VuICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHl1djJyZ2Jfb3B0aW9uICAgOiAxOworCXVuc2lnbmVkIGxvbmcgdmlkZW9faW52X2hvciAgICA6IDE7CisJdW5zaWduZWQgbG9uZyB2aWRlb19pbnZfdmVyICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGdhbW1hX3NlbCAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgZGlzX2xpbWl0ICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBlbl91dl9oYmxlbmQgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHJnYl9nYW1tYV9zZWwgICAgOiAyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gdmlkZW9fY3RybF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHZpZGVvX2N0cmxfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IHZpZGVvX2N0cmxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGRpc3BfZGJfYnVmX2NudGxfcmRfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fZGJfYnVmICAgICAgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHVwZGF0ZV9kYl9idWZfZG9uZSAgIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBkYl9idWZfY250bCAgICAgIAk6IDY7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCQk6IDI0OworCXVuc2lnbmVkIGxvbmcgZW5fZGJfYnVmICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyB1cGRhdGVfZGJfYnVmX2RvbmUgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRiX2J1Zl9jbnRsICAgICAgICAgOiA2OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICA6IDI0OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gZGlzcF9kYl9idWZfY250bF9yZF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGRpc3BfZGJfYnVmX2NudGxfcmRfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGRpc3BfZGJfYnVmX2NudGxfcmRfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGRpc3BfZGJfYnVmX2NudGxfd3JfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5fZGJfYnVmICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdXBkYXRlX2RiX2J1ZiAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGJfYnVmX2NudGwgICAgICA6IDY7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgOiAyNDsKKwl1bnNpZ25lZCBsb25nIGVuX2RiX2J1ZiAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHVwZGF0ZV9kYl9idWYgIDogMTsKKwl1bnNpZ25lZCBsb25nIGRiX2J1Zl9jbnRsICAgIDogNjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIDogMjQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBkaXNwX2RiX2J1Zl9jbnRsX3dyX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgZGlzcF9kYl9idWZfY250bF93cl90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgZGlzcF9kYl9idWZfY250bF93cl90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgZ2FtbWFfdmFsdWUxX3QgewotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hMSAgICAgICAgICAgOiA4OwotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hMiAgICAgICAgICAgOiA4OwotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hMyAgICAgICAgICAgOiA4OwotICAgICB1bnNpZ25lZCBsb25nIGdhbW1hNCAgICAgICAgICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWExICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWEyICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWEzICAgOiA4OworCXVuc2lnbmVkIGxvbmcgZ2FtbWE0ICAgOiA4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gZ2FtbWFfdmFsdWUxX3UgewotICAgICB1bnNpZ25lZCBsb25nIHZhbCA6IDMyOwotICAgICBzdHJ1Y3QgZ2FtbWFfdmFsdWUxX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBnYW1tYV92YWx1ZTFfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGdhbW1hX3ZhbHVlMl90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBnYW1tYTUgICAgICAgICAgIDogODsKLSAgICAgdW5zaWduZWQgbG9uZyBnYW1tYTYgICAgICAgICAgIDogODsKLSAgICAgdW5zaWduZWQgbG9uZyBnYW1tYTcgICAgICAgICAgIDogODsKLSAgICAgdW5zaWduZWQgbG9uZyBnYW1tYTggICAgICAgICAgIDogODsKKwl1bnNpZ25lZCBsb25nIGdhbW1hNSAgIDogODsKKwl1bnNpZ25lZCBsb25nIGdhbW1hNiAgIDogODsKKwl1bnNpZ25lZCBsb25nIGdhbW1hNyAgIDogODsKKwl1bnNpZ25lZCBsb25nIGdhbW1hOCAgIDogODsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIGdhbW1hX3ZhbHVlMl91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGdhbW1hX3ZhbHVlMl90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgZ2FtbWFfdmFsdWUyX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBnYW1tYV9zbG9wZV90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTEgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTIgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTMgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTQgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTUgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTYgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTcgICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzbG9wZTggICAgICAgICAgIDogMzsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiA4OworCXVuc2lnbmVkIGxvbmcgc2xvcGUxICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGUyICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGUzICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGU0ICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGU1ICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGU2ICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGU3ICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc2xvcGU4ICAgOiAzOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgOiA4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gZ2FtbWFfc2xvcGVfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBnYW1tYV9zbG9wZV90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgZ2FtbWFfc2xvcGVfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IG1jX2V4dF9tZW1fbG9jYXRpb25fdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWNfZXh0X21lbV9zdGFydCA6IDE2OwotICAgICB1bnNpZ25lZCBsb25nIG1jX2V4dF9tZW1fdG9wICAgOiAxNjsKKwl1bnNpZ25lZCBsb25nIG1jX2V4dF9tZW1fc3RhcnQgOiAxNjsKKwl1bnNpZ25lZCBsb25nIG1jX2V4dF9tZW1fdG9wICAgOiAxNjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIG1jX2V4dF9tZW1fbG9jYXRpb25fdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBtY19leHRfbWVtX2xvY2F0aW9uX3QgZjsKKwl1bnNpZ25lZCBsb25nIHZhbCA6IDMyOworCXN0cnVjdCBtY19leHRfbWVtX2xvY2F0aW9uX3QgZjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBtY19mYl9sb2NhdGlvbl90IHsKKwl1bnNpZ25lZCBsb25nIG1jX2ZiX3N0YXJ0ICAgICAgOiAxNjsKKwl1bnNpZ25lZCBsb25nIG1jX2ZiX3RvcCAgICAgICAgOiAxNjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIG1jX2ZiX2xvY2F0aW9uX3UgeworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IG1jX2ZiX2xvY2F0aW9uX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBjbGtfcGluX2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb3NjX2VuICAgICAgICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb3NjX2dhaW4gICAgICAgICA6IDU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZG9udF91c2VfeHRhbGluICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgeHRhbGluX3BtX2VuICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgeHRhbGluX2RibF9lbiAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogNzsKLSAgICAgdW5zaWduZWQgbG9uZyBjZ19kZWJ1ZyAgICAgICAgIDogMTY7CisJdW5zaWduZWQgbG9uZyBvc2NfZW4gICAgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIG9zY19nYWluICAgICAgICAgOiA1OworCXVuc2lnbmVkIGxvbmcgZG9udF91c2VfeHRhbGluICA6IDE7CisJdW5zaWduZWQgbG9uZyB4dGFsaW5fcG1fZW4gICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHh0YWxpbl9kYmxfZW4gICAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDc7CisJdW5zaWduZWQgbG9uZyBjZ19kZWJ1ZyAgICAgICAgIDogMTY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBjbGtfcGluX2NudGxfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBjbGtfcGluX2NudGxfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNsa19waW5fY250bF90IGY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcGxsX3JlZl9mYl9kaXZfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3JlZl9kaXYgICAgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogNDsKLSAgICAgdW5zaWduZWQgbG9uZyBwbGxfZmJfZGl2X2ludCAgIDogNjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9mYl9kaXZfZnJhYyAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX3Jlc2V0X3RpbWUgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGxsX2xvY2tfdGltZSAgICA6IDg7CisJdW5zaWduZWQgbG9uZyBwbGxfcmVmX2RpdiAgICAgIDogNDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgcGxsX2ZiX2Rpdl9pbnQgICA6IDY7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHBsbF9mYl9kaXZfZnJhYyAgOiAzOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbGxfcmVzZXRfdGltZSAgIDogNDsKKwl1bnNpZ25lZCBsb25nIHBsbF9sb2NrX3RpbWUgICAgOiA4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gcGxsX3JlZl9mYl9kaXZfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBwbGxfcmVmX2ZiX2Rpdl90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgcGxsX3JlZl9mYl9kaXZfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHBsbF9jbnRsX3QgewotICAgICB1bnNpZ25lZCBsb25nIHBsbF9wd2RuICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9yZXNldCAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9wbV9lbiAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9tb2RlICAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9yZWZjbGtfc2VsICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9mYmNsa19zZWwgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF90Y3BvZmYgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9wY3AgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9wdmcgICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF92Y29mciAgICAgICAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9pb2Zmc2V0ICAgICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9wZWNjX21vZGUgICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9wZWNjX3Njb24gICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9kYWN0YWwgICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9jcF9jbGlwICAgICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9jb25mICAgICAgICAgOiAzOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9tYmN0cmwgICAgICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHBsbF9yaW5nX29mZiAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX3B3ZG4gICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9yZXNldCAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbGxfcG1fZW4gICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX21vZGUgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9yZWZjbGtfc2VsICA6IDE7CisJdW5zaWduZWQgbG9uZyBwbGxfZmJjbGtfc2VsICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcGxsX3RjcG9mZiAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9wY3AgICAgICAgICA6IDM7CisJdW5zaWduZWQgbG9uZyBwbGxfcHZnICAgICAgICAgOiAzOworCXVuc2lnbmVkIGxvbmcgcGxsX3Zjb2ZyICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHBsbF9pb2Zmc2V0ICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBwbGxfcGVjY19tb2RlICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcGxsX3BlY2Nfc2NvbiAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHBsbF9kYWN0YWwgICAgICA6IDQ7CisJdW5zaWduZWQgbG9uZyBwbGxfY3BfY2xpcCAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcGxsX2NvbmYgICAgICAgIDogMzsKKwl1bnNpZ25lZCBsb25nIHBsbF9tYmN0cmwgICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyBwbGxfcmluZ19vZmYgICAgOiAxOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gcGxsX2NudGxfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBwbGxfY250bF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgcGxsX2NudGxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHNjbGtfY250bF90IHsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX3NyY19zZWwgICAgIAk6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCQk6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19wb3N0X2Rpdl9mYXN0ICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfY2xrb25faHlzICAgCTogMzsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX3Bvc3RfZGl2X3Nsb3cgICA6IDQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZGlzcF9jZ19vazJzd2l0Y2hfZW4gOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfcmVnICAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX2ZvcmNlX2Rpc3AgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9tYyAgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZXh0bWMgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX2ZvcmNlX2NwICAgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9lMiAgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZTMgICAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBzY2xrX2ZvcmNlX2lkY3QgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2Nsa19mb3JjZV9iaXN0ICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2NwICAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBidXN5X2V4dGVuZF9lMiAgIAk6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgYnVzeV9leHRlbmRfZTMgICAJOiAxOwotICAgICB1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2lkY3QgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJCTogMzsKKwl1bnNpZ25lZCBsb25nIHNjbGtfc3JjX3NlbCAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHNjbGtfcG9zdF9kaXZfZmFzdCAgIDogNDsKKwl1bnNpZ25lZCBsb25nIHNjbGtfY2xrb25faHlzICAgICAgIDogMzsKKwl1bnNpZ25lZCBsb25nIHNjbGtfcG9zdF9kaXZfc2xvdyAgIDogNDsKKwl1bnNpZ25lZCBsb25nIGRpc3BfY2dfb2syc3dpdGNoX2VuIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfcmVnICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZGlzcCAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfbWMgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZXh0bWMgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfY3AgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZTIgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfZTMgICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfaWRjdCAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZm9yY2VfYmlzdCAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2NwICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2UyICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2UzICAgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nIGJ1c3lfZXh0ZW5kX2lkY3QgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgIDogMzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIHNjbGtfY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHNjbGtfY250bF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3Qgc2Nsa19jbnRsX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBwY2xrX2NudGxfdCB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcGNsa19zcmNfc2VsICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogMjsKLSAgICAgdW5zaWduZWQgbG9uZyBwY2xrX3Bvc3RfZGl2ICAgIDogNDsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJOiA4OwotICAgICB1bnNpZ25lZCBsb25nIHBjbGtfZm9yY2VfZGlzcCAgOiAxOwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDE1OworCXVuc2lnbmVkIGxvbmcgcGNsa19zcmNfc2VsICAgICA6IDI7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgIDogMjsKKwl1bnNpZ25lZCBsb25nIHBjbGtfcG9zdF9kaXYgICAgOiA0OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICA6IDg7CisJdW5zaWduZWQgbG9uZyBwY2xrX2ZvcmNlX2Rpc3AgIDogMTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgOiAxNTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIHBjbGtfY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IHBjbGtfY250bF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgcGNsa19jbnRsX3QgZjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKKworI2RlZmluZSBURVNUQ0xLX1NSQ19QTEwgICAweDAxCisjZGVmaW5lIFRFU1RDTEtfU1JDX1NDTEsgIDB4MDIKKyNkZWZpbmUgVEVTVENMS19TUkNfUENMSyAgMHgwMworLyogNCBhbmQgNSBzZWVtIHRvIGJ5IFhUQUwvTSAqLworI2RlZmluZSBURVNUQ0xLX1NSQ19YVEFMICAweDA2CisKIHN0cnVjdCBjbGtfdGVzdF9jbnRsX3QgewotICAgICB1bnNpZ25lZCBsb25nIHRlc3RjbGtfc2VsICAgICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nICAgIAkJCQk6IDM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfY2hlY2tfZnJlcSA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdHN0Y291bnRfcnN0ICAgICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgCQkJCTogMTU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdGVzdF9jb3VudCAgICAgICA6IDg7CisJdW5zaWduZWQgbG9uZyB0ZXN0Y2xrX3NlbCAgICAgIDogNDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgOiAzOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfY2hlY2tfZnJlcSA6IDE7CisJdW5zaWduZWQgbG9uZyB0c3Rjb3VudF9yc3QgICAgIDogMTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgOiAxNTsKKwl1bnNpZ25lZCBsb25nIHRlc3RfY291bnQgICAgICAgOiA4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gY2xrX3Rlc3RfY250bF91IHsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKLSAgICAgc3RydWN0IGNsa190ZXN0X2NudGxfdCBmOworCXVuc2lnbmVkIGxvbmcgdmFsIDogMzI7CisJc3RydWN0IGNsa190ZXN0X2NudGxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHB3cm1ndF9jbnRsX3QgewotICAgICB1bnNpZ25lZCBsb25nIHB3bV9lbmFibGUgICAgICAgCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAJCQkJCTogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBwd21fbW9kZV9yZXEgICAgICAgICA6IDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcHdtX3dha2V1cF9jb25kICAgICAgOiAyOwotICAgICB1bnNpZ25lZCBsb25nIHB3bV9mYXN0X25vbWxfaHdfZW4gIDogMTsKLSAgICAgdW5zaWduZWQgbG9uZyBwd21fbm9tbF9mYXN0X2h3X2VuICA6IDE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcHdtX2Zhc3Rfbm9tbF9jb25kICAgOiA0OwotICAgICB1bnNpZ25lZCBsb25nIHB3bV9ub21sX2Zhc3RfY29uZCAgIDogNDsKLSAgICAgdW5zaWduZWQgbG9uZyBwd21faWRsZV90aW1lciAgIAk6IDg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcHdtX2J1c3lfdGltZXIgICAJOiA4OworCXVuc2lnbmVkIGxvbmcgcHdtX2VuYWJsZSAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICAgOiAxOworCXVuc2lnbmVkIGxvbmcgcHdtX21vZGVfcmVxICAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcHdtX3dha2V1cF9jb25kICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgcHdtX2Zhc3Rfbm9tbF9od19lbiAgOiAxOworCXVuc2lnbmVkIGxvbmcgcHdtX25vbWxfZmFzdF9od19lbiAgOiAxOworCXVuc2lnbmVkIGxvbmcgcHdtX2Zhc3Rfbm9tbF9jb25kICAgOiA0OworCXVuc2lnbmVkIGxvbmcgcHdtX25vbWxfZmFzdF9jb25kICAgOiA0OworCXVuc2lnbmVkIGxvbmcgcHdtX2lkbGVfdGltZXIgICAgICAgOiA4OworCXVuc2lnbmVkIGxvbmcgcHdtX2J1c3lfdGltZXIgICAgICAgOiA4OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gcHdybWd0X2NudGxfdSB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsIDogMzI7Ci0gICAgIHN0cnVjdCBwd3JtZ3RfY250bF90IGY7CisJdW5zaWduZWQgbG9uZyB2YWwgOiAzMjsKKwlzdHJ1Y3QgcHdybWd0X2NudGxfdCBmOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL0tjb25maWcgYi9kcml2ZXJzL3cxL0tjb25maWcKaW5kZXggNzExYjkwOS4uOWExZTAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvS2NvbmZpZwpAQCAtNTQsNCArNTQsMjAgQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCAxLXdpcmUKIAkgIHNpbXBsZSA2NGJpdCBtZW1vcnkgcm9tKGRzMjQwMS9kczI0MTEvZHMxOTkwKikgdG8geW91IHdpcmUuCiAKK2NvbmZpZyBXMV9EUzI0MzMKKwl0cmlzdGF0ZSAiNGtiIEVFUFJPTSBmYW1pbHkgc3VwcG9ydCAoRFMyNDMzKSIKKwlkZXBlbmRzIG9uIFcxCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSAxLXdpcmUKKwkgIDRrYiBFRVBST00gZmFtaWx5IGRldmljZSAoRFMyNDMzKS4KKworY29uZmlnIFcxX0RTMjQzM19DUkMKKwlib29sICJQcm90ZWN0IERTMjQzMyBkYXRhIHdpdGggYSBDUkMxNiIKKwlkZXBlbmRzIG9uIFcxX0RTMjQzMworCXNlbGVjdCBDUkMxNgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gcHJvdGVjdCBEUzI0MzMgZGF0YSB3aXRoIGEgQ1JDMTYuCisJICBFYWNoIGJsb2NrIGhhcyAzMCBieXRlcyBvZiBkYXRhIGFuZCBhIHR3byBieXRlIENSQzE2LgorCSAgRnVsbCBibG9jayB3cml0ZXMgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUgQ1JDIGlzIHZhbGlkLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL01ha2VmaWxlIGIvZHJpdmVycy93MS9NYWtlZmlsZQppbmRleCA4MDcyNWMzLi4wMWZiNTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdzEvTWFrZWZpbGUKQEAgLTYsNiArNiwxMCBAQAogRVhUUkFfQ0ZMQUdTCSs9IC1ETkVUTElOS19ESVNBQkxFRAogZW5kaWYKIAoraWZlcSAoJChDT05GSUdfVzFfRFMyNDMzX0NSQyksIHkpCitFWFRSQV9DRkxBR1MJKz0gLURDT05GSUdfVzFfRjIzX0NSQworZW5kaWYKKwogb2JqLSQoQ09ORklHX1cxKQkrPSB3aXJlLm8KIHdpcmUtb2JqcwkJOj0gdzEubyB3MV9pbnQubyB3MV9mYW1pbHkubyB3MV9uZXRsaW5rLm8gdzFfaW8ubwogCkBAIC0xMyw4ICsxNyw5IEBACiBvYmotJChDT05GSUdfVzFfVEhFUk0pCQkrPSB3MV90aGVybS5vCiBvYmotJChDT05GSUdfVzFfU01FTSkJCSs9IHcxX3NtZW0ubwogCi1vYmotJChDT05GSUdfVzFfRFM5NDkwKQkJKz0gZHM5NDkwci5vIAorb2JqLSQoQ09ORklHX1cxX0RTOTQ5MCkJCSs9IGRzOTQ5MHIubwogZHM5NDkwci1vYmpzICAgIDo9IGRzY29yZS5vCiAKIG9iai0kKENPTkZJR19XMV9EUzk0OTBfQlJJREdFKQkrPSBkc193MV9icmlkZ2UubwogCitvYmotJChDT05GSUdfVzFfRFMyNDMzKQkJKz0gdzFfZHMyNDMzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvZHNfdzFfYnJpZGdlLmMgYi9kcml2ZXJzL3cxL2RzX3cxX2JyaWRnZS5jCmluZGV4IDdiZGRkOGEuLmE3OWQxNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvZHNfdzFfYnJpZGdlLmMKKysrIGIvZHJpdmVycy93MS9kc193MV9icmlkZ2UuYwpAQCAtMSw4ICsxLDggQEAKIC8qCi0gKiAJZHNfdzFfYnJpZGdlLmMKKyAqCWRzX3cxX2JyaWRnZS5jCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Ci0gKiAKKyAqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSAiLi4vdzEvdzEuaCIKICNpbmNsdWRlICIuLi93MS93MV9pbnQuaCIKICNpbmNsdWRlICJkc2NvcmUuaCIKLQkKKwogc3RhdGljIHN0cnVjdCBkc19kZXZpY2UgKmRzX2RldjsKIHN0YXRpYyBzdHJ1Y3QgdzFfYnVzX21hc3RlciAqZHNfYnVzX21hc3RlcjsKIApAQCAtMTIwLDcgKzEyMCw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBkc193MV9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKLQkKKwogCWRzX2J1c19tYXN0ZXIgPSBrbWFsbG9jKHNpemVvZigqZHNfYnVzX21hc3RlciksIEdGUF9LRVJORUwpOwogCWlmICghZHNfYnVzX21hc3RlcikgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBEUzk0OTBSIFVTQjwtPlcxIGJ1c19tYXN0ZXIgc3RydWN0dXJlLlxuIik7CkBAIC0xMzYsMTQgKzEzNiwxNCBAQAogCiAJbWVtc2V0KGRzX2J1c19tYXN0ZXIsIDAsIHNpemVvZigqZHNfYnVzX21hc3RlcikpOwogCi0JZHNfYnVzX21hc3Rlci0+ZGF0YSAJCT0gKHVuc2lnbmVkIGxvbmcpZHNfZGV2OwotCWRzX2J1c19tYXN0ZXItPnRvdWNoX2JpdCAJPSAmZHM5NDkwcl90b3VjaF9iaXQ7Ci0JZHNfYnVzX21hc3Rlci0+cmVhZF9iaXQgCT0gJmRzOTQ5MHJfcmVhZF9iaXQ7Ci0JZHNfYnVzX21hc3Rlci0+d3JpdGVfYml0IAk9ICZkczk0OTByX3dyaXRlX2JpdDsKLQlkc19idXNfbWFzdGVyLT5yZWFkX2J5dGUgCT0gJmRzOTQ5MHJfcmVhZF9ieXRlOwotCWRzX2J1c19tYXN0ZXItPndyaXRlX2J5dGUgCT0gJmRzOTQ5MHJfd3JpdGVfYnl0ZTsKLQlkc19idXNfbWFzdGVyLT5yZWFkX2Jsb2NrIAk9ICZkczk0OTByX3JlYWRfYmxvY2s7Ci0JZHNfYnVzX21hc3Rlci0+d3JpdGVfYmxvY2sgCT0gJmRzOTQ5MHJfd3JpdGVfYmxvY2s7CisJZHNfYnVzX21hc3Rlci0+ZGF0YQkJPSAodW5zaWduZWQgbG9uZylkc19kZXY7CisJZHNfYnVzX21hc3Rlci0+dG91Y2hfYml0CT0gJmRzOTQ5MHJfdG91Y2hfYml0OworCWRzX2J1c19tYXN0ZXItPnJlYWRfYml0CQk9ICZkczk0OTByX3JlYWRfYml0OworCWRzX2J1c19tYXN0ZXItPndyaXRlX2JpdAk9ICZkczk0OTByX3dyaXRlX2JpdDsKKwlkc19idXNfbWFzdGVyLT5yZWFkX2J5dGUJPSAmZHM5NDkwcl9yZWFkX2J5dGU7CisJZHNfYnVzX21hc3Rlci0+d3JpdGVfYnl0ZQk9ICZkczk0OTByX3dyaXRlX2J5dGU7CisJZHNfYnVzX21hc3Rlci0+cmVhZF9ibG9jawk9ICZkczk0OTByX3JlYWRfYmxvY2s7CisJZHNfYnVzX21hc3Rlci0+d3JpdGVfYmxvY2sJPSAmZHM5NDkwcl93cml0ZV9ibG9jazsKIAlkc19idXNfbWFzdGVyLT5yZXNldF9idXMJPSAmZHM5NDkwcl9yZXNldDsKIAogCWVyciA9IHcxX2FkZF9tYXN0ZXJfZGV2aWNlKGRzX2J1c19tYXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9kc2NvcmUuYyBiL2RyaXZlcnMvdzEvZHNjb3JlLmMKaW5kZXggZWVlNjY0NC4uMTVmYjI1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9kc2NvcmUuYworKysgYi9kcml2ZXJzL3cxL2RzY29yZS5jCkBAIC0xLDggKzEsOCBAQAogLyoKLSAqIAlkc2NvcmUuYworICoJZHNjb3JlLmMKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KLSAqIAorICoKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTMyLDE5ICszMiwxNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkc19pZF90YWJsZSk7CiAKLWludCBkc19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKLXZvaWQgZHNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKK3N0YXRpYyBpbnQgZHNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBkc19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwogCiBpbnQgZHNfdG91Y2hfYml0KHN0cnVjdCBkc19kZXZpY2UgKiwgdTgsIHU4ICopOwogaW50IGRzX3JlYWRfYnl0ZShzdHJ1Y3QgZHNfZGV2aWNlICosIHU4ICopOwogaW50IGRzX3JlYWRfYml0KHN0cnVjdCBkc19kZXZpY2UgKiwgdTggKik7CiBpbnQgZHNfd3JpdGVfYnl0ZShzdHJ1Y3QgZHNfZGV2aWNlICosIHU4KTsKIGludCBkc193cml0ZV9iaXQoc3RydWN0IGRzX2RldmljZSAqLCB1OCk7Ci1pbnQgZHNfc3RhcnRfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqLCBpbnQpOwotaW50IGRzX3NldF9zcGVlZChzdHJ1Y3QgZHNfZGV2aWNlICosIGludCk7CitzdGF0aWMgaW50IGRzX3N0YXJ0X3B1bHNlKHN0cnVjdCBkc19kZXZpY2UgKiwgaW50KTsKIGludCBkc19yZXNldChzdHJ1Y3QgZHNfZGV2aWNlICosIHN0cnVjdCBkc19zdGF0dXMgKik7Ci1pbnQgZHNfZGV0ZWN0KHN0cnVjdCBkc19kZXZpY2UgKiwgc3RydWN0IGRzX3N0YXR1cyAqKTsKLWludCBkc19zdG9wX3B1bHNlKHN0cnVjdCBkc19kZXZpY2UgKiwgaW50KTsKIHN0cnVjdCBkc19kZXZpY2UgKiBkc19nZXRfZGV2aWNlKHZvaWQpOwogdm9pZCBkc19wdXRfZGV2aWNlKHN0cnVjdCBkc19kZXZpY2UgKik7CiAKQEAgLTc5LDExICs3NiwxMSBAQAogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2xfY21kKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCiB7CiAJaW50IGVycjsKLQkKLQllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwgCisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0NPTlRST0xdKSwKIAkJCUNPTlRST0xfQ01ELCAweDQwLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29tbWFuZCBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsIAorCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIGNvbW1hbmQgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLAogCQkJCXZhbHVlLCBpbmRleCwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC05NCwxMSArOTEsMTEgQEAKIHN0YXRpYyBpbnQgZHNfc2VuZF9jb250cm9sX21vZGUoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKIHsKIAlpbnQgZXJyOwotCQotCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLCAKKworCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAogCQkJTU9ERV9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2VuZCBtb2RlIGNvbnRyb2wgbWVzc2FnZSAleC4leDogZXJyPSVkLlxuIiwgCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgbW9kZSBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEwOSwxMSArMTA2LDExIEBACiBzdGF0aWMgaW50IGRzX3NlbmRfY29udHJvbChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQogewogCWludCBlcnI7Ci0JCi0JZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9DT05UUk9MXSksIAorCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9DT05UUk9MXSksCiAJCQlDT01NX0NNRCwgMHg0MCwgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIGNvbnRyb2wgbWVzc2FnZSAleC4leDogZXJyPSVkLlxuIiwgCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLAogCQkJCXZhbHVlLCBpbmRleCwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0xMjYsMTkgKzEyMywyMCBAQAogCXByaW50aygiJTQ1czogJTh4XG4iLCBzdHIsIGJ1ZltvZmZdKTsKIH0KIAotaW50IGRzX3JlY3Zfc3RhdHVzX25vZHVtcChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQorc3RhdGljIGludCBkc19yZWN2X3N0YXR1c19ub2R1bXAoc3RydWN0IGRzX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNfc3RhdHVzICpzdCwKKwkJCQkgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSkKIHsKIAlpbnQgY291bnQsIGVycjsKLQkJCisKIAltZW1zZXQoc3QsIDAsIHNpemVvZihzdCkpOwotCQorCiAJY291bnQgPSAwOwogCWVyciA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfU1RBVFVTXSksIGJ1Ziwgc2l6ZSwgJmNvdW50LCAxMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlYWQgMS13aXJlIGRhdGEgZnJvbSAweCV4OiBlcnI9JWQuXG4iLCBkZXYtPmVwW0VQX1NUQVRVU10sIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQotCQorCiAJaWYgKGNvdW50ID49IHNpemVvZigqc3QpKQogCQltZW1jcHkoc3QsIGJ1Ziwgc2l6ZW9mKCpzdCkpOwogCkBAIC0xNDksMTMgKzE0NywxMyBAQAogewogCXVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKIAlpbnQgY291bnQsIGVyciA9IDAsIGk7Ci0JCisKIAltZW1jcHkoc3QsIGJ1Ziwgc2l6ZW9mKCpzdCkpOwotCQkKKwogCWNvdW50ID0gZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgc3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCWlmIChjb3VudCA8IDApCiAJCXJldHVybiBlcnI7Ci0JCisKIAlwcmludGsoIjB4JXg6IGNvdW50PSVkLCBzdGF0dXM6ICIsIGRldi0+ZXBbRVBfU1RBVFVTXSwgY291bnQpOwogCWZvciAoaT0wOyBpPGNvdW50OyArK2kpCiAJCXByaW50aygiJTAyeCAiLCBidWZbaV0pOwpAQCAtMTk5LDcgKzE5Nyw3IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KICNlbmRpZgotCQorCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjA3LDkgKzIwNSw5IEBACiB7CiAJaW50IGNvdW50LCBlcnI7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKLQkKKwogCWNvdW50ID0gMDsKLQllcnIgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0RBVEFfSU5dKSwgCisJZXJyID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9EQVRBX0lOXSksCiAJCQkJYnVmLCBzaXplLCAmY291bnQsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkNsZWFyaW5nIGVwMHgleC5cbiIsIGRldi0+ZXBbRVBfREFUQV9JTl0pOwpAQCAtMjM0LDcgKzIzMiw3IEBACiBzdGF0aWMgaW50IGRzX3NlbmRfZGF0YShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlpbnQgY291bnQsIGVycjsKLQkKKwogCWNvdW50ID0gMDsKIAllcnIgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0RBVEFfT1VUXSksIGJ1ZiwgbGVuLCAmY291bnQsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CkBAIC0yNDUsMTIgKzI0MywxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKKyNpZiAwCisKIGludCBkc19zdG9wX3B1bHNlKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgaW50IGxpbWl0KQogewogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CiAJaW50IGNvdW50ID0gMCwgZXJyID0gMDsKIAl1OCBidWZbMHgyMF07Ci0JCisKIAlkbyB7CiAJCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENUTF9IQUxUX0VYRV9JRExFLCAwKTsKIAkJaWYgKGVycikKQEAgLTI3NSw3ICsyNzUsNyBAQAogaW50IGRzX2RldGVjdChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQogewogCWludCBlcnI7Ci0JCisKIAllcnIgPSBkc19zZW5kX2NvbnRyb2xfY21kKGRldiwgQ1RMX1JFU0VUX0RFVklDRSwgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTI4MywxMSArMjgzLDExIEBACiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9TRVRfRFVSQVRJT04gfCBDT01NX0lNLCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9TRVRfRFVSQVRJT04gfCBDT01NX0lNIHwgQ09NTV9UWVBFLCAweDQwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sX21vZGUoZGV2LCBNT0RfUFVMU0VfRU4sIFBVTFNFX1BST0cpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0yOTcsNyArMjk3LDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgZHNfd2FpdF9zdGF0dXMoc3RydWN0IGRzX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNfc3RhdHVzICpzdCkKKyNlbmRpZiAgLyogIDAgICovCisKK3N0YXRpYyBpbnQgZHNfd2FpdF9zdGF0dXMoc3RydWN0IGRzX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNfc3RhdHVzICpzdCkKIHsKIAl1OCBidWZbMHgyMF07CiAJaW50IGVyciwgY291bnQgPSAwOwpAQCAtMzA1LDcgKzMwNyw3IEBACiAJZG8gewogCQllcnIgPSBkc19yZWN2X3N0YXR1c19ub2R1bXAoZGV2LCBzdCwgYnVmLCBzaXplb2YoYnVmKSk7CiAjaWYgMAotCQlpZiAoZXJyID49IDApIHsJCisJCWlmIChlcnIgPj0gMCkgewogCQkJaW50IGk7CiAJCQlwcmludGsoIjB4JXg6IGNvdW50PSVkLCBzdGF0dXM6ICIsIGRldi0+ZXBbRVBfU1RBVFVTXSwgZXJyKTsKIAkJCWZvciAoaT0wOyBpPGVycjsgKytpKQpAQCAtMzE5LDEwICszMjEsOCBAQAogCWlmICgoKGVyciA+IDE2KSAmJiAoYnVmWzB4MTBdICYgMHgwMSkpIHx8IGNvdW50ID49IDEwMCB8fCBlcnIgPCAwKSB7CiAJCWRzX3JlY3Zfc3RhdHVzKGRldiwgc3QpOwogCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgeworCX0gZWxzZQogCQlyZXR1cm4gMDsKLQl9CiB9CiAKIGludCBkc19yZXNldChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQpAQCAtMzQ1LDYgKzM0NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAwCiBpbnQgZHNfc2V0X3NwZWVkKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgaW50IHNwZWVkKQogewogCWludCBlcnI7CkBAIC0zNTYsMjAgKzM1NywyMSBAQAogCQlzcGVlZCA9IFNQRUVEX0ZMRVhJQkxFOwogCiAJc3BlZWQgJj0gMHhmZjsKLQkKKwogCWVyciA9IGRzX3NlbmRfY29udHJvbF9tb2RlKGRldiwgTU9EXzFXSVJFX1NQRUVELCBzcGVlZCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCXJldHVybiBlcnI7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCi1pbnQgZHNfc3RhcnRfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqZGV2LCBpbnQgZGVsYXkpCitzdGF0aWMgaW50IGRzX3N0YXJ0X3B1bHNlKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgaW50IGRlbGF5KQogewogCWludCBlcnI7CiAJdTggZGVsID0gMSArICh1OCkoZGVsYXkgPj4gNCk7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKLQkKKwogI2lmIDAKIAllcnIgPSBkc19zdG9wX3B1bHNlKGRldiwgMTApOwogCWlmIChlcnIpCkBAIC0zOTAsNyArMzkyLDcgQEAKIAltZGVsYXkoZGVsYXkpOwogCiAJZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwotCQorCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDAwLDcgKzQwMiw3IEBACiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKIAl1MTYgdmFsdWUgPSAoQ09NTV9CSVRfSU8gfCBDT01NX0lNKSB8ICgoYml0KSA/IENPTU1fRCA6IDApOwogCXUxNiBjbWQ7Ci0JCisKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCB2YWx1ZSwgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTQzMCw3ICs0MzIsNyBAQAogewogCWludCBlcnI7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKLQkKKwogCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fQklUX0lPIHwgQ09NTV9JTSB8IChiaXQpID8gQ09NTV9EIDogMCwgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTQ0NSw3ICs0NDcsNyBAQAogCWludCBlcnI7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKIAl1OCByYnl0ZTsKLQkKKwogCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fQllURV9JTyB8IENPTU1fSU0gfCBDT01NX1NQVSwgYnl0ZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTQ1MywxMSArNDU1LDExIEBACiAJZXJyID0gZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JCQorCiAJZXJyID0gZHNfcmVjdl9kYXRhKGRldiwgJnJieXRlLCBzaXplb2YocmJ5dGUpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQkKKwogCWRzX3N0YXJ0X3B1bHNlKGRldiwgUFVMTFVQX1BVTFNFX0RVUkFUSU9OKTsKIAogCXJldHVybiAhKGJ5dGUgPT0gcmJ5dGUpOwpAQCAtNDcwLDExICs0NzIsMTEgQEAKIAllcnIgPSBkc19zZW5kX2NvbnRyb2xfbW9kZShkZXYsIE1PRF9QVUxTRV9FTiwgUFVMU0VfU1BVRSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQkKKwogCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fQklUX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVIHwgQ09NTV9ELCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZXJyID0gZHNfcmVjdl9kYXRhKGRldiwgYml0LCBzaXplb2YoKmJpdCkpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNDkyLDcgKzQ5NCw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7Ci0JCisKIAllcnIgPSBkc19yZWN2X2RhdGEoZGV2LCBieXRlLCBzaXplb2YoKmJ5dGUpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTUwOSwxNyArNTExLDE3IEBACiAJCXJldHVybiAtRTJCSUc7CiAKIAltZW1zZXQoYnVmLCAweEZGLCBsZW4pOwotCQorCiAJZXJyID0gZHNfc2VuZF9kYXRhKGRldiwgYnVmLCBsZW4pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CTE9DS19JTyB8IENPTU1fSU0gfCBDT01NX1NQVSwgbGVuKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwotCQorCiAJbWVtc2V0KGJ1ZiwgMHgwMCwgbGVuKTsKIAllcnIgPSBkc19yZWN2X2RhdGEoZGV2LCBidWYsIGxlbik7CiAKQEAgLTUzMCwxMSArNTMyLDExIEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwotCQorCiAJZXJyID0gZHNfc2VuZF9kYXRhKGRldiwgYnVmLCBsZW4pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwogCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CTE9DS19JTyB8IENPTU1fSU0gfCBDT01NX1NQVSwgbGVuKTsKQEAgLTU0OCwxMCArNTUwLDEyIEBACiAJCXJldHVybiBlcnI7CiAKIAlkc19zdGFydF9wdWxzZShkZXYsIFBVTExVUF9QVUxTRV9EVVJBVElPTik7Ci0JCisKIAlyZXR1cm4gIShlcnIgPT0gbGVuKTsKIH0KIAorI2lmIDAKKwogaW50IGRzX3NlYXJjaChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU2NCBpbml0LCB1NjQgKmJ1ZiwgdTggaWRfbnVtYmVyLCBpbnQgY29uZGl0aW9uYWxfc2VhcmNoKQogewogCWludCBlcnI7CkBAIC01NTksMTEgKzU2MywxMSBAQAogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CiAKIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JCisKIAllcnIgPSBkc19zZW5kX2RhdGEoZHNfZGV2LCAodW5zaWduZWQgY2hhciAqKSZpbml0LCA4KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZHNfd2FpdF9zdGF0dXMoZHNfZGV2LCAmc3QpOwogCiAJdmFsdWUgPSBDT01NX1NFQVJDSF9BQ0NFU1MgfCBDT01NX0lNIHwgQ09NTV9TTSB8IENPTU1fRiB8IENPTU1fUlRTOwpAQCAtNTg5LDcgKzU5Myw3IEBACiAJZXJyID0gZHNfc2VuZF9kYXRhKGRldiwgKHVuc2lnbmVkIGNoYXIgKikmaW5pdCwgc2l6ZW9mKGluaXQpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCQorCiAJZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwogCiAJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9NQVRDSF9BQ0NFU1MgfCBDT01NX0lNIHwgQ09NTV9SU1QsIDB4MDA1NSk7CkBAIC02MDksMTEgKzYxMywxMSBAQAogCiAJbWVtY3B5KGJ1ZiwgJmluaXQsIDgpOwogCWJ1Zls4XSA9IEJSQU5DSF9NQUlOOwotCQorCiAJZXJyID0gZHNfc2VuZF9kYXRhKGRldiwgYnVmLCBzaXplb2YoYnVmKSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQkKKwogCWRzX3dhaXRfc3RhdHVzKGRldiwgJnN0KTsKIAogCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fU0VUX1BBVEggfCBDT01NX0lNIHwgQ09NTV9SU1QsIDApOwpAQCAtNjI1LDcgKzYyOSwxMCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICp1ZGV2X2lkKQorI2VuZGlmICAvKiAgMCAgKi8KKworc3RhdGljIGludCBkc19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICp1ZGV2X2lkKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwpAQCAtNjUzLDcgKzY2MCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlc2V0IGNvbmZpZ3VyYXRpb246IGVycj0lZC5cbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQotCQorCiAJaWZhY2VfZGVzYyA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOwogCWlmIChpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gTlVNX0VQLTEpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiTnVtIGVuZHBvaW50cz0lZC4gSXQgaXMgbm90IERTOTQ5MFIuXG4iLCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpOwpAQCAtNjYyLDM3ICs2NjksMzcgQEAKIAogCWF0b21pY19zZXQoJmRzX2Rldi0+cmVmY250LCAwKTsKIAltZW1zZXQoZHNfZGV2LT5lcCwgMCwgc2l6ZW9mKGRzX2Rldi0+ZXApKTsKLQkKKwogCS8qCi0JICogVGhpcyBsb29wIGRvZXNuJ2Qgc2hvdyBjb250cm9sIDAgZW5kcG9pbnQsIAorCSAqIFRoaXMgbG9vcCBkb2VzbidkIHNob3cgY29udHJvbCAwIGVuZHBvaW50LAogCSAqIHNvIHdlIHdpbGwgZmlsbCBvbmx5IDEtMyBlbmRwb2ludHMgZW50cnkuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CiAJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJZHNfZGV2LT5lcFtpKzFdID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQorCiAJCXByaW50aygiJWQ6IGFkZHI9JXgsIHNpemU9JWQsIGRpcj0lcywgdHlwZT0leFxuIiwKIAkJCWksIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpLAogCQkJKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTik/IklOIjoiT1VUIiwKIAkJCWVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSyk7CiAJfQotCQorCiAjaWYgMAogCXsKIAkJaW50IGVyciwgaTsKIAkJdTY0IGJ1ZlszXTsKIAkJdTY0IGluaXQ9MHhiMzAwMDAwMDIwNzhlZTgxdWxsOwogCQlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwotCQkKKwogCQlkc19yZXNldChkc19kZXYsICZzdCk7CiAJCWVyciA9IGRzX3NlYXJjaChkc19kZXYsIGluaXQsIGJ1ZiwgMywgMCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJZm9yIChpPTA7IGk8ZXJyOyArK2kpCiAJCQlwcmludGsoIiVkOiAlbGx4XG4iLCBpLCBidWZbaV0pOwotCQkKLQkJcHJpbnRrKCJSZXNldHRpbmcuLi5cbiIpOwkKKworCQlwcmludGsoIlJlc2V0dGluZy4uLlxuIik7CiAJCWRzX3Jlc2V0KGRzX2RldiwgJnN0KTsKIAkJcHJpbnRrKCJTZXR0aW5nIHBhdGggZm9yICVsbHguXG4iLCBpbml0KTsKIAkJZXJyID0gZHNfc2V0X3BhdGgoZHNfZGV2LCBpbml0KTsKQEAgLTcwNywxMiArNzE0LDEyIEBACiAJCWVyciA9IGRzX3NlYXJjaChkc19kZXYsIGluaXQsIGJ1ZiwgMywgMCk7CiAKIAkJcHJpbnRrKCJkc19zZWFyY2goKSByZXR1cm5lZCAlZFxuIiwgZXJyKTsKLQkJCisKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlmb3IgKGk9MDsgaTxlcnI7ICsraSkKIAkJCXByaW50aygiJWQ6ICVsbHhcbiIsIGksIGJ1ZltpXSk7Ci0JCQorCiAJCXJldHVybiAwOwogCX0KICNlbmRpZgpAQCAtNzIwLDEwICs3MjcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkc19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgZHNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgZHNfZGV2aWNlICpkZXY7Ci0JCisKIAlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAKQEAgLTc0MCw3ICs3NDcsNyBAQAogCWRzX2RldiA9IE5VTEw7CiB9CiAKLWludCBkc19pbml0KHZvaWQpCitzdGF0aWMgaW50IGRzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCkBAIC03NTMsNyArNzYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkc19maW5pKHZvaWQpCitzdGF0aWMgdm9pZCBkc19maW5pKHZvaWQpCiB7CiAJdXNiX2RlcmVnaXN0ZXIoJmRzX2RyaXZlcik7CiB9CkBAIC03NzYsOCArNzgzLDggQEAKIEVYUE9SVF9TWU1CT0woZHNfcHV0X2RldmljZSk7CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBmb3IgRUVQUk9NIHByb2dyYW1taW5nLCAKLSAqIHdoZW4gZHJpdmVyIHdpbGwgYmUgaW5jbHVkZWQgaW50byBtYWlubGluZSB0aGlzIHdpbGwgCisgKiBUaGlzIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBmb3IgRUVQUk9NIHByb2dyYW1taW5nLAorICogd2hlbiBkcml2ZXIgd2lsbCBiZSBpbmNsdWRlZCBpbnRvIG1haW5saW5lIHRoaXMgd2lsbAogICogcmVxdWlyZSB1bmNvbW1lbnRpbmcuCiAgKi8KICNpZiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL2RzY29yZS5oIGIvZHJpdmVycy93MS9kc2NvcmUuaAppbmRleCA5Yzc2N2VmLi42Y2Y1NjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL2RzY29yZS5oCisrKyBiL2RyaXZlcnMvdzEvZHNjb3JlLmgKQEAgLTEsOCArMSw4IEBACiAvKgotICogCWRzY29yZS5oCisgKglkc2NvcmUuaAogICoKICAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgotICogCisgKgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIHN0cnVjdCBkc19kZXZpY2UKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZSAJKnVkZXY7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CiAKIAlpbnQJCQllcFtOVU1fRVBdOwpAQCAtMTU2LDExICsxNTYsNyBAQAogaW50IGRzX3JlYWRfYml0KHN0cnVjdCBkc19kZXZpY2UgKiwgdTggKik7CiBpbnQgZHNfd3JpdGVfYnl0ZShzdHJ1Y3QgZHNfZGV2aWNlICosIHU4KTsKIGludCBkc193cml0ZV9iaXQoc3RydWN0IGRzX2RldmljZSAqLCB1OCk7Ci1pbnQgZHNfc3RhcnRfcHVsc2Uoc3RydWN0IGRzX2RldmljZSAqLCBpbnQpOwotaW50IGRzX3NldF9zcGVlZChzdHJ1Y3QgZHNfZGV2aWNlICosIGludCk7CiBpbnQgZHNfcmVzZXQoc3RydWN0IGRzX2RldmljZSAqLCBzdHJ1Y3QgZHNfc3RhdHVzICopOwotaW50IGRzX2RldGVjdChzdHJ1Y3QgZHNfZGV2aWNlICosIHN0cnVjdCBkc19zdGF0dXMgKik7Ci1pbnQgZHNfc3RvcF9wdWxzZShzdHJ1Y3QgZHNfZGV2aWNlICosIGludCk7CiBzdHJ1Y3QgZHNfZGV2aWNlICogZHNfZ2V0X2RldmljZSh2b2lkKTsKIHZvaWQgZHNfcHV0X2RldmljZShzdHJ1Y3QgZHNfZGV2aWNlICopOwogaW50IGRzX3dyaXRlX2Jsb2NrKHN0cnVjdCBkc19kZXZpY2UgKiwgdTggKiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCAwYmJmMDI5Li4xYjZiNzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC00NSwxMCArNDUsMTIgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciAxLXdpcmUgRGFsbGFzIG5ldHdvcmsgcHJvdG9jb2wuIik7CiAKIHN0YXRpYyBpbnQgdzFfdGltZW91dCA9IDEwOworc3RhdGljIGludCB3MV9jb250cm9sX3RpbWVvdXQgPSAxOwogaW50IHcxX21heF9zbGF2ZV9jb3VudCA9IDEwOwogaW50IHcxX21heF9zbGF2ZV90dGwgPSAxMDsKIAogbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVvdXQsIHcxX3RpbWVvdXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoY29udHJvbF90aW1lb3V0LCB3MV9jb250cm9sX3RpbWVvdXQsIGludCwgMCk7CiBtb2R1bGVfcGFyYW1fbmFtZWQobWF4X3NsYXZlX2NvdW50LCB3MV9tYXhfc2xhdmVfY291bnQsIGludCwgMCk7CiBtb2R1bGVfcGFyYW1fbmFtZWQoc2xhdmVfdHRsLCB3MV9tYXhfc2xhdmVfdHRsLCBpbnQsIDApOwogCkBAIC01OSwxOSArNjEsNiBAQAogc3RhdGljIGludCBjb250cm9sX25lZWRzX2V4aXQ7CiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHcxX2NvbnRyb2xfY29tcGxldGUpOwogCi0vKiBzdHVmZiBmb3IgdGhlIGRlZmF1bHQgZmFtaWx5ICovCi1zdGF0aWMgc3NpemVfdCB3MV9mYW1kZWZhdWx0X3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKLQlyZXR1cm4oc3ByaW50ZihidWYsICIlc1xuIiwgc2wtPm5hbWUpKTsKLX0KLXN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5X29wcyB3MV9kZWZhdWx0X2ZvcHMgPSB7Ci0JLnJuYW1lID0gJncxX2ZhbWRlZmF1bHRfcmVhZF9uYW1lLAotfTsKLXN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5IHcxX2RlZmF1bHRfZmFtaWx5ID0gewotCS5mb3BzID0gJncxX2RlZmF1bHRfZm9wcywKLX07Ci0KIHN0YXRpYyBpbnQgdzFfbWFzdGVyX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAlyZXR1cm4gMTsKQEAgLTgyLDczICs3MSwxMTYgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCB3MV9tYXN0ZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgdzFfbWFzdGVyX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAotCWNvbXBsZXRlKCZtZC0+ZGV2X3JlbGVhc2VkKTsKKwlkZXZfZGJnKGRldiwgIiVzOiBSZWxlYXNpbmcgJXMuXG4iLCBfX2Z1bmNfXywgbWQtPm5hbWUpOworCisJaWYgKG1kLT5ubHMgJiYgbWQtPm5scy0+c2tfc29ja2V0KQorCQlzb2NrX3JlbGVhc2UobWQtPm5scy0+c2tfc29ja2V0KTsKKwltZW1zZXQobWQsIDAsIHNpemVvZihzdHJ1Y3QgdzFfbWFzdGVyKSArIHNpemVvZihzdHJ1Y3QgdzFfYnVzX21hc3RlcikpOworCWtmcmVlKG1kKTsKIH0KIAogc3RhdGljIHZvaWQgdzFfc2xhdmVfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gZGV2X3RvX3cxX3NsYXZlKGRldik7CiAKLQljb21wbGV0ZSgmc2wtPmRldl9yZWxlYXNlZCk7CisJZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lKTsKKworCXdoaWxlIChhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpIHsKKwkJZGV2X2RiZyhkZXYsICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKKwkJCQlzbC0+bmFtZSwgYXRvbWljX3JlYWQoJnNsLT5yZWZjbnQpKTsKKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKQorCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwl9CisKKwl3MV9mYW1pbHlfcHV0KHNsLT5mYW1pbHkpOworCXNsLT5tYXN0ZXItPnNsYXZlX2NvdW50LS07CisKKwljb21wbGV0ZSgmc2wtPnJlbGVhc2VkKTsKIH0KIAotc3RhdGljIHNzaXplX3QgdzFfZGVmYXVsdF9yZWFkX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdzFfc2xhdmVfcmVhZF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICJObyBmYW1pbHkgcmVnaXN0ZXJlZC5cbiIpOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBkZXZfdG9fdzFfc2xhdmUoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzbC0+bmFtZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHcxX2RlZmF1bHRfcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwKLQkJICAgICBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCB3MV9zbGF2ZV9yZWFkX2lkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICJObyBmYW1pbHkgcmVnaXN0ZXJlZC5cbiIpOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBrb2JqX3RvX3cxX3NsYXZlKGtvYmopOworCisJYXRvbWljX2luYygmc2wtPnJlZmNudCk7CisJaWYgKG9mZiA+IDgpIHsKKwkJY291bnQgPSAwOworCX0gZWxzZSB7CisJCWlmIChvZmYgKyBjb3VudCA+IDgpCisJCQljb3VudCA9IDggLSBvZmY7CisKKwkJbWVtY3B5KGJ1ZiwgKHU4ICopJnNsLT5yZWdfbnVtLCBjb3VudCk7CisJfQorCWF0b21pY19kZWMoJnNsLT5yZWZjbnQpOworCisJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdzFfc2xhdmVfYXR0cmlidXRlID0KLQlfX0FUVFIobmFtZSwgU19JUlVHTywgdzFfZGVmYXVsdF9yZWFkX25hbWUsIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHcxX3NsYXZlX2F0dHJfbmFtZSA9CisJX19BVFRSKG5hbWUsIFNfSVJVR08sIHcxX3NsYXZlX3JlYWRfbmFtZSwgTlVMTCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSB3MV9zbGF2ZV9iaW5fYXR0cmlidXRlID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJ3MV9zbGF2ZSIsCi0JCS5tb2RlID0gU19JUlVHTywKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkuc2l6ZSA9IFcxX1NMQVZFX0RBVEFfU0laRSwKLQkucmVhZCA9ICZ3MV9kZWZhdWx0X3JlYWRfYmluLAorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX3NsYXZlX2F0dHJfYmluX2lkID0geworICAgICAgLmF0dHIgPSB7CisgICAgICAgICAgICAgIC5uYW1lID0gImlkIiwKKyAgICAgICAgICAgICAgLm1vZGUgPSBTX0lSVUdPLAorICAgICAgICAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKyAgICAgIH0sCisgICAgICAuc2l6ZSA9IDgsCisgICAgICAucmVhZCA9IHcxX3NsYXZlX3JlYWRfaWQsCiB9OwogCisvKiBEZWZhdWx0IGZhbWlseSAqLworc3RhdGljIHN0cnVjdCB3MV9mYW1pbHkgdzFfZGVmYXVsdF9mYW1pbHk7CisKK3N0YXRpYyBpbnQgdzFfaG90cGx1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKIAogc3RhdGljIHN0cnVjdCBidXNfdHlwZSB3MV9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJ3MSIsCiAJLm1hdGNoID0gdzFfbWFzdGVyX21hdGNoLAorCS5ob3RwbHVnID0gdzFfaG90cGx1ZywKIH07CiAKLXN0cnVjdCBkZXZpY2VfZHJpdmVyIHcxX2RyaXZlciA9IHsKLQkubmFtZSA9ICJ3MV9kcml2ZXIiLAorc3RydWN0IGRldmljZV9kcml2ZXIgdzFfbWFzdGVyX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ3MV9tYXN0ZXJfZHJpdmVyIiwKIAkuYnVzID0gJncxX2J1c190eXBlLAogCS5wcm9iZSA9IHcxX21hc3Rlcl9wcm9iZSwKLQkucmVtb3ZlID0gdzFfbWFzdGVyX3JlbW92ZSwKIH07CiAKLXN0cnVjdCBkZXZpY2UgdzFfZGV2aWNlID0geworc3RydWN0IGRldmljZSB3MV9tYXN0ZXJfZGV2aWNlID0gewogCS5wYXJlbnQgPSBOVUxMLAogCS5idXMgPSAmdzFfYnVzX3R5cGUsCiAJLmJ1c19pZCA9ICJ3MSBidXMgbWFzdGVyIiwKLQkuZHJpdmVyID0gJncxX2RyaXZlciwKKwkuZHJpdmVyID0gJncxX21hc3Rlcl9kcml2ZXIsCiAJLnJlbGVhc2UgPSAmdzFfbWFzdGVyX3JlbGVhc2UKIH07CiAKK3N0cnVjdCBkZXZpY2VfZHJpdmVyIHcxX3NsYXZlX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ3MV9zbGF2ZV9kcml2ZXIiLAorCS5idXMgPSAmdzFfYnVzX3R5cGUsCit9OworCitzdHJ1Y3QgZGV2aWNlIHcxX3NsYXZlX2RldmljZSA9IHsKKwkucGFyZW50ID0gTlVMTCwKKwkuYnVzID0gJncxX2J1c190eXBlLAorCS5idXNfaWQgPSAidzEgYnVzIHNsYXZlIiwKKwkuZHJpdmVyID0gJncxX3NsYXZlX2RyaXZlciwKKwkucmVsZWFzZSA9ICZ3MV9zbGF2ZV9yZWxlYXNlCit9OworCiBzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHcxX21hc3RlciAqbWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCXNzaXplX3QgY291bnQ7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbWQtPm11dGV4KSkKQEAgLTE2NSw3ICsxOTcsNyBAQAogCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCQljb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHcxX21hc3RlciAqbWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJm1kLT5tdXRleCkpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0xODEsNyArMjEzLDcgQEAKIAkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICAgICAgY2hhciAqYnVmKQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlzc2l6ZV90IGNvdW50OwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJm1kLT5tdXRleCkpCkBAIC0xOTYsNyArMjI4LDcgQEAKIAogc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X3BvaW50ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlzc2l6ZV90IGNvdW50OwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbWQtPm11dGV4KSkKQEAgLTIxNyw3ICsyNDksNyBAQAogCiBzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfbWF4X3NsYXZlX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCkBAIC0yMzEsNyArMjYzLDcgQEAKIAogc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X2F0dGVtcHRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCkBAIC0yNDUsNyArMjc3LDcgQEAKIAogc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X3NsYXZlX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCkBAIC0yNTksNyArMjkxLDcgQEAKIAogc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X3NsYXZlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHcxX21hc3RlciAqbWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCWludCBjID0gUEFHRV9TSVpFOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbWQtPm11dGV4KSkKQEAgLTMyOSwxMiArMzYxLDU1IEBACiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtYXN0ZXItPmRldi5rb2JqLCAmdzFfbWFzdGVyX2RlZmF0dHJfZ3JvdXApOwogfQogCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKK3N0YXRpYyBpbnQgdzFfaG90cGx1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gTlVMTDsKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gTlVMTDsKKwljaGFyICpldmVudF9vd25lciwgKm5hbWU7CisJaW50IGVyciwgY3VyX2luZGV4PTAsIGN1cl9sZW49MDsKKworCWlmIChkZXYtPmRyaXZlciA9PSAmdzFfbWFzdGVyX2RyaXZlcikgeworCQltZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9tYXN0ZXIsIGRldik7CisJCWV2ZW50X293bmVyID0gIm1hc3RlciI7CisJCW5hbWUgPSBtZC0+bmFtZTsKKwl9IGVsc2UgaWYgKGRldi0+ZHJpdmVyID09ICZ3MV9zbGF2ZV9kcml2ZXIpIHsKKwkJc2wgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfc2xhdmUsIGRldik7CisJCWV2ZW50X293bmVyID0gInNsYXZlIjsKKwkJbmFtZSA9IHNsLT5uYW1lOworCX0gZWxzZSB7CisJCWRldl9kYmcoZGV2LCAiVW5rbm93biBob3RwbHVnIGV2ZW50LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoZGV2LCAiSG90cGx1ZyBldmVudCBmb3IgJXMgJXMsIGJ1c19pZD0lcy5cbiIsIGV2ZW50X293bmVyLCBuYW1lLCBkZXYtPmJ1c19pZCk7CisKKwlpZiAoZGV2LT5kcml2ZXIgIT0gJncxX3NsYXZlX2RyaXZlciB8fCAhc2wpCisJCXJldHVybiAwOworCisJZXJyID0gYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmN1cl9pbmRleCwgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmN1cl9sZW4sICJXMV9GSUQ9JTAyWCIsIHNsLT5yZWdfbnVtLmZhbWlseSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGFkZF9ob3RwbHVnX2Vudl92YXIoZW52cCwgbnVtX2VudnAsICZjdXJfaW5kZXgsIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZjdXJfbGVuLCAiVzFfU0xBVkVfSUQ9JTAyNExYIiwgKHU2NClzbC0+cmVnX251bS5pZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfTsKKyNlbHNlCitzdGF0aWMgaW50IHcxX2hvdHBsdWcoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IF9fdzFfYXR0YWNoX3NsYXZlX2RldmljZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewogCWludCBlcnI7CiAKIAlzbC0+ZGV2LnBhcmVudCA9ICZzbC0+bWFzdGVyLT5kZXY7Ci0Jc2wtPmRldi5kcml2ZXIgPSBzbC0+bWFzdGVyLT5kcml2ZXI7CisJc2wtPmRldi5kcml2ZXIgPSAmdzFfc2xhdmVfZHJpdmVyOwogCXNsLT5kZXYuYnVzID0gJncxX2J1c190eXBlOwogCXNsLT5kZXYucmVsZWFzZSA9ICZ3MV9zbGF2ZV9yZWxlYXNlOwogCkBAIC0zNDcsOCArNDIyLDcgQEAKIAkJICh1bnNpZ25lZCBpbnQpIHNsLT5yZWdfbnVtLmZhbWlseSwKIAkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHNsLT5yZWdfbnVtLmlkKTsKIAotCWRldl9kYmcoJnNsLT5kZXYsICIlczogcmVnaXN0ZXJpbmcgJXMuXG4iLCBfX2Z1bmNfXywKLQkJJnNsLT5kZXYuYnVzX2lkWzBdKTsKKwlkZXZfZGJnKCZzbC0+ZGV2LCAiJXM6IHJlZ2lzdGVyaW5nICVzIGFzICVwLlxuIiwgX19mdW5jX18sICZzbC0+ZGV2LmJ1c19pZFswXSk7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnNsLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7CkBAIC0zNTgsMzYgKzQzMiw0NCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCW1lbWNweSgmc2wtPmF0dHJfYmluLCAmdzFfc2xhdmVfYmluX2F0dHJpYnV0ZSwgc2l6ZW9mKHNsLT5hdHRyX2JpbikpOwotCW1lbWNweSgmc2wtPmF0dHJfbmFtZSwgJncxX3NsYXZlX2F0dHJpYnV0ZSwgc2l6ZW9mKHNsLT5hdHRyX25hbWUpKTsKLQotCXNsLT5hdHRyX2Jpbi5yZWFkID0gc2wtPmZhbWlseS0+Zm9wcy0+cmJpbjsKLQlzbC0+YXR0cl9uYW1lLnNob3cgPSBzbC0+ZmFtaWx5LT5mb3BzLT5ybmFtZTsKLQotCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2wtPmRldiwgJnNsLT5hdHRyX25hbWUpOworCS8qIENyZWF0ZSAibmFtZSIgZW50cnkgKi8KKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNsLT5kZXYsICZ3MV9zbGF2ZV9hdHRyX25hbWUpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKIAkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOwotCQlkZXZpY2VfdW5yZWdpc3Rlcigmc2wtPmRldik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0X3VucmVnOwogCX0KIAotCWlmICggc2wtPmF0dHJfYmluLnJlYWQgKSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmc2wtPmF0dHJfYmluKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWRldl9lcnIoJnNsLT5kZXYsCi0JCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQkJc2wtPmRldi5idXNfaWQsIGVycik7Ci0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNsLT5kZXYsICZzbC0+YXR0cl9uYW1lKTsKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZzbC0+ZGV2KTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkvKiBDcmVhdGUgImlkIiBlbnRyeSAqLworCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfc2xhdmVfYXR0cl9iaW5faWQpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJnNsLT5kZXYsCisJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKKwkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOworCQlnb3RvIG91dF9yZW0xOworCX0KKworCS8qIGlmIHRoZSBmYW1pbHkgZHJpdmVyIG5lZWRzIHRvIGluaXRpYWxpemUgc29tZXRoaW5nLi4uICovCisJaWYgKHNsLT5mYW1pbHktPmZvcHMgJiYgc2wtPmZhbWlseS0+Zm9wcy0+YWRkX3NsYXZlICYmCisJICAgICgoZXJyID0gc2wtPmZhbWlseS0+Zm9wcy0+YWRkX3NsYXZlKHNsKSkgPCAwKSkgeworCQlkZXZfZXJyKCZzbC0+ZGV2LAorCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCisJCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJZ290byBvdXRfcmVtMjsKIAl9CiAKIAlsaXN0X2FkZF90YWlsKCZzbC0+dzFfc2xhdmVfZW50cnksICZzbC0+bWFzdGVyLT5zbGlzdCk7CiAKIAlyZXR1cm4gMDsKKworb3V0X3JlbTI6CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9zbGF2ZV9hdHRyX2Jpbl9pZCk7CitvdXRfcmVtMToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNsLT5kZXYsICZ3MV9zbGF2ZV9hdHRyX25hbWUpOworb3V0X3VucmVnOgorCWRldmljZV91bnJlZ2lzdGVyKCZzbC0+ZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHcxX2F0dGFjaF9zbGF2ZV9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfcmVnX251bSAqcm4pCkBAIC00MTMsNyArNDk1LDcgQEAKIAogCW1lbWNweSgmc2wtPnJlZ19udW0sIHJuLCBzaXplb2Yoc2wtPnJlZ19udW0pKTsKIAlhdG9taWNfc2V0KCZzbC0+cmVmY250LCAwKTsKLQlpbml0X2NvbXBsZXRpb24oJnNsLT5kZXZfcmVsZWFzZWQpOworCWluaXRfY29tcGxldGlvbigmc2wtPnJlbGVhc2VkKTsKIAogCXNwaW5fbG9jaygmdzFfZmxvY2spOwogCWYgPSB3MV9mYW1pbHlfcmVnaXN0ZXJlZChybi0+ZmFtaWx5KTsKQEAgLTQ1MiwyOCArNTM0LDIzIEBACiB7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnIG1zZzsKIAotCWRldl9pbmZvKCZzbC0+ZGV2LCAiJXM6IGRldGFjaGluZyAlcy5cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSk7CisJZGV2X2RiZygmc2wtPmRldiwgIiVzOiBkZXRhY2hpbmcgJXMgWyVwXS5cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSwgc2wpOwogCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZzbC0+cmVmY250KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKLQkJCQlzbC0+bmFtZSwgYXRvbWljX3JlYWQoJnNsLT5yZWZjbnQpKTsKKwlsaXN0X2RlbCgmc2wtPncxX3NsYXZlX2VudHJ5KTsKIAotCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpCi0JCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCX0KLQotCWlmICggc2wtPmF0dHJfYmluLnJlYWQgKSB7Ci0JCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSAoJnNsLT5kZXYua29iaiwgJnNsLT5hdHRyX2Jpbik7Ci0JfQotCWRldmljZV9yZW1vdmVfZmlsZSgmc2wtPmRldiwgJnNsLT5hdHRyX25hbWUpOwotCWRldmljZV91bnJlZ2lzdGVyKCZzbC0+ZGV2KTsKLQl3MV9mYW1pbHlfcHV0KHNsLT5mYW1pbHkpOwotCi0Jc2wtPm1hc3Rlci0+c2xhdmVfY291bnQtLTsKKwlpZiAoc2wtPmZhbWlseS0+Zm9wcyAmJiBzbC0+ZmFtaWx5LT5mb3BzLT5yZW1vdmVfc2xhdmUpCisJCXNsLT5mYW1pbHktPmZvcHMtPnJlbW92ZV9zbGF2ZShzbCk7CiAKIAltZW1jcHkoJm1zZy5pZC5pZCwgJnNsLT5yZWdfbnVtLCBzaXplb2YobXNnLmlkLmlkKSk7CiAJbXNnLnR5cGUgPSBXMV9TTEFWRV9SRU1PVkU7CiAJdzFfbmV0bGlua19zZW5kKHNsLT5tYXN0ZXIsICZtc2cpOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9zbGF2ZV9hdHRyX2Jpbl9pZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZzbC0+ZGV2LCAmdzFfc2xhdmVfYXR0cl9uYW1lKTsKKwlkZXZpY2VfdW5yZWdpc3Rlcigmc2wtPmRldik7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzbC0+cmVsZWFzZWQpOworCWtmcmVlKHNsKTsKIH0KIAogc3RhdGljIHN0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXIodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtNTAwLDE0ICs1NzcsMTMgQEAKIAogCXNwaW5fbG9ja19iaCgmdzFfbWxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gJXMgaW50byBuZXcgZmFtaWx5ICUwMnguXG4iLAorCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gJXMgaW50byBuZXcgZmFtaWx5ICUwMnguXG4iLAogCQkJCWRldi0+bmFtZSwgZi0+ZmlkKTsKIAkJc2V0X2JpdChXMV9NQVNURVJfTkVFRF9SRUNPTk5FQ1QsICZkZXYtPmZsYWdzKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJncxX21sb2NrKTsKIH0KIAotCiBzdGF0aWMgdm9pZCB3MV9zbGF2ZV9mb3VuZCh1bnNpZ25lZCBsb25nIGRhdGEsIHU2NCBybikKIHsKIAlpbnQgc2xhdmVfY291bnQ7CkBAIC02NDYsNyArNzIyLDcgQEAKIAkJaGF2ZV90b193YWl0ID0gMDsKIAogCQl0cnlfdG9fZnJlZXplKCk7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHcxX3RpbWVvdXQgKiAxMDAwKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUodzFfY29udHJvbF90aW1lb3V0ICogMTAwMCk7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKQEAgLTY3OSwzMyArNzU1LDMwIEBACiAJCQkJbGlzdF9kZWwoJmRldi0+dzFfbWFzdGVyX2VudHJ5KTsKIAkJCQlzcGluX3VubG9ja19iaCgmdzFfbWxvY2spOwogCisJCQkJZG93bigmZGV2LT5tdXRleCk7CiAJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsLCBzbG4sICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewotCQkJCQlsaXN0X2RlbCgmc2wtPncxX3NsYXZlX2VudHJ5KTsKLQogCQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwotCQkJCQlrZnJlZShzbCk7CiAJCQkJfQogCQkJCXcxX2Rlc3Ryb3lfbWFzdGVyX2F0dHJpYnV0ZXMoZGV2KTsKKwkJCQl1cCgmZGV2LT5tdXRleCk7CiAJCQkJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlpZiAodGVzdF9iaXQoVzFfTUFTVEVSX05FRURfUkVDT05ORUNULCAmZGV2LT5mbGFncykpIHsKLQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluIGRldmljZSAlcy5cbiIsIGRldi0+bmFtZSk7CisJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluIGRldmljZSAlcy5cbiIsIGRldi0+bmFtZSk7CiAJCQkJZG93bigmZGV2LT5tdXRleCk7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzbCwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsLCBzbG4sICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewogCQkJCQlpZiAoc2wtPmZhbWlseS0+ZmlkID09IFcxX0ZBTUlMWV9ERUZBVUxUKSB7CiAJCQkJCQlzdHJ1Y3QgdzFfcmVnX251bSBybjsKLQkJCQkJCWxpc3RfZGVsKCZzbC0+dzFfc2xhdmVfZW50cnkpOwotCQkJCQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKIAogCQkJCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKLQotCQkJCQkJa2ZyZWUoc2wpOworCQkJCQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKIAogCQkJCQkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsICZybik7CiAJCQkJCX0KIAkJCQl9CisJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluIGRldmljZSAlcyBoYXMgYmVlbiBmaW5pc2hlZC5cbiIsIGRldi0+bmFtZSk7CiAJCQkJY2xlYXJfYml0KFcxX01BU1RFUl9ORUVEX1JFQ09OTkVDVCwgJmRldi0+ZmxhZ3MpOwogCQkJCXVwKCZkZXYtPm11dGV4KTsKIAkJCX0KQEAgLTc0OSwxMCArODIyLDcgQEAKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CiAJCQlpZiAoIXRlc3RfYml0KFcxX1NMQVZFX0FDVElWRSwgKHVuc2lnbmVkIGxvbmcgKikmc2wtPmZsYWdzKSAmJiAhLS1zbC0+dHRsKSB7Ci0JCQkJbGlzdF9kZWwgKCZzbC0+dzFfc2xhdmVfZW50cnkpOwotCi0JCQkJdzFfc2xhdmVfZGV0YWNoIChzbCk7Ci0JCQkJa2ZyZWUgKHNsKTsKKwkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwogCiAJCQkJZGV2LT5zbGF2ZV9jb3VudC0tOwogCQkJfSBlbHNlIGlmICh0ZXN0X2JpdChXMV9TTEFWRV9BQ1RJVkUsICh1bnNpZ25lZCBsb25nICopJnNsLT5mbGFncykpCkBAIC03ODMsNyArODUzLDcgQEAKIAkJZ290byBlcnJfb3V0X2V4aXRfaW5pdDsKIAl9CiAKLQlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJncxX2RyaXZlcik7CisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZ3MV9tYXN0ZXJfZHJpdmVyKTsKIAlpZiAocmV0dmFsKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkJIkZhaWxlZCB0byByZWdpc3RlciBtYXN0ZXIgZHJpdmVyLiBlcnI9JWQuXG4iLApAQCAtNzkxLDE4ICs4NjEsMjkgQEAKIAkJZ290byBlcnJfb3V0X2J1c191bnJlZ2lzdGVyOwogCX0KIAorCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmdzFfc2xhdmVfZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIkZhaWxlZCB0byByZWdpc3RlciBtYXN0ZXIgZHJpdmVyLiBlcnI9JWQuXG4iLAorCQkJcmV0dmFsKTsKKwkJZ290byBlcnJfb3V0X21hc3Rlcl91bnJlZ2lzdGVyOworCX0KKwogCWNvbnRyb2xfdGhyZWFkID0ga2VybmVsX3RocmVhZCgmdzFfY29udHJvbCwgTlVMTCwgMCk7CiAJaWYgKGNvbnRyb2xfdGhyZWFkIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUgY29udHJvbCB0aHJlYWQuIGVycj0lZFxuIiwKIAkJCWNvbnRyb2xfdGhyZWFkKTsKIAkJcmV0dmFsID0gY29udHJvbF90aHJlYWQ7Ci0JCWdvdG8gZXJyX291dF9kcml2ZXJfdW5yZWdpc3RlcjsKKwkJZ290byBlcnJfb3V0X3NsYXZlX3VucmVnaXN0ZXI7CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycl9vdXRfZHJpdmVyX3VucmVnaXN0ZXI6Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJncxX2RyaXZlcik7CitlcnJfb3V0X3NsYXZlX3VucmVnaXN0ZXI6CisJZHJpdmVyX3VucmVnaXN0ZXIoJncxX3NsYXZlX2RyaXZlcik7CisKK2Vycl9vdXRfbWFzdGVyX3VucmVnaXN0ZXI6CisJZHJpdmVyX3VucmVnaXN0ZXIoJncxX21hc3Rlcl9kcml2ZXIpOwogCiBlcnJfb3V0X2J1c191bnJlZ2lzdGVyOgogCWJ1c191bnJlZ2lzdGVyKCZ3MV9idXNfdHlwZSk7CkBAIC04MjEsNyArOTAyLDggQEAKIAljb250cm9sX25lZWRzX2V4aXQgPSAxOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJncxX2NvbnRyb2xfY29tcGxldGUpOwogCi0JZHJpdmVyX3VucmVnaXN0ZXIoJncxX2RyaXZlcik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJncxX3NsYXZlX2RyaXZlcik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJncxX21hc3Rlcl9kcml2ZXIpOwogCWJ1c191bnJlZ2lzdGVyKCZ3MV9idXNfdHlwZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuaCBiL2RyaXZlcnMvdzEvdzEuaAppbmRleCA0ZjBhOTg2Li5kODkwMDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmgKKysrIGIvZHJpdmVycy93MS93MS5oCkBAIC03NSwxMSArNzUsOSBAQAogCiAJc3RydWN0IHcxX21hc3RlcgkqbWFzdGVyOwogCXN0cnVjdCB3MV9mYW1pbHkJKmZhbWlseTsKKwl2b2lkCQkJKmZhbWlseV9kYXRhOwogCXN0cnVjdCBkZXZpY2UJCWRldjsKLQlzdHJ1Y3QgY29tcGxldGlvbglkZXZfcmVsZWFzZWQ7Ci0KLQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZQlhdHRyX2JpbjsKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQlhdHRyX25hbWU7CisJc3RydWN0IGNvbXBsZXRpb24JcmVsZWFzZWQ7CiB9OwogCiB0eXBlZGVmIHZvaWQgKCogdzFfc2xhdmVfZm91bmRfY2FsbGJhY2spKHVuc2lnbmVkIGxvbmcsIHU2NCk7CkBAIC0xNzksNyArMTc3LDYgQEAKIAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyCSpkcml2ZXI7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXN0cnVjdCBjb21wbGV0aW9uCWRldl9yZWxlYXNlZDsKIAlzdHJ1Y3QgY29tcGxldGlvbglkZXZfZXhpdGVkOwogCiAJc3RydWN0IHcxX2J1c19tYXN0ZXIJKmJ1c19tYXN0ZXI7CkBAIC0xOTEsNiArMTg4LDIxIEBACiBpbnQgdzFfY3JlYXRlX21hc3Rlcl9hdHRyaWJ1dGVzKHN0cnVjdCB3MV9tYXN0ZXIgKik7CiB2b2lkIHcxX3NlYXJjaChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdzFfc2xhdmUqIGRldl90b193MV9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdzFfc2xhdmUqIGtvYmpfdG9fdzFfc2xhdmUoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJcmV0dXJuIGRldl90b193MV9zbGF2ZShjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB3MV9tYXN0ZXIqIGRldl90b193MV9tYXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdzFfbWFzdGVyLCBkZXYpOworfQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19XMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2RzMjQzMy5jIGIvZHJpdmVycy93MS93MV9kczI0MzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2MyNGIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93MS93MV9kczI0MzMuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqCXcxX2RzMjQzMy5jIC0gdzEgZmFtaWx5IDIzIChEUzI0MzMpIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBCZW4gR2FyZG5lciA8YmdhcmRuZXJAd2FidGVjLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKKyNpbmNsdWRlIDxsaW51eC9jcmMxNi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ3MS5oIgorI2luY2x1ZGUgIncxX2lvLmgiCisjaW5jbHVkZSAidzFfaW50LmgiCisjaW5jbHVkZSAidzFfZmFtaWx5LmgiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ3MSBmYW1pbHkgMjMgZHJpdmVyIGZvciBEUzI0MzMsIDRrYiBFRVBST00iKTsKKworI2RlZmluZSBXMV9FRVBST01fU0laRQkJNTEyCisjZGVmaW5lIFcxX1BBR0VfQ09VTlQJCTE2CisjZGVmaW5lIFcxX1BBR0VfU0laRQkJMzIKKyNkZWZpbmUgVzFfUEFHRV9CSVRTCQk1CisjZGVmaW5lIFcxX1BBR0VfTUFTSwkJMHgxRgorCisjZGVmaW5lIFcxX0YyM19USU1FCQkzMDAKKworI2RlZmluZSBXMV9GMjNfUkVBRF9FRVBST00JMHhGMAorI2RlZmluZSBXMV9GMjNfV1JJVEVfU0NSQVRDSAkweDBGCisjZGVmaW5lIFcxX0YyM19SRUFEX1NDUkFUQ0gJMHhBQQorI2RlZmluZSBXMV9GMjNfQ09QWV9TQ1JBVENICTB4NTUKKworc3RydWN0IHcxX2YyM19kYXRhIHsKKwl1OAltZW1vcnlbVzFfRUVQUk9NX1NJWkVdOworCXUzMgl2YWxpZGNyYzsKK307CisKKy8qKgorICogQ2hlY2sgdGhlIGZpbGUgc2l6ZSBib3VuZHMgYW5kIGFkanVzdHMgY291bnQgYXMgbmVlZGVkLgorICogVGhpcyB3b3VsZCBub3QgYmUgbmVlZGVkIGlmIHRoZSBmaWxlIHNpemUgZGlkbid0IHJlc2V0IHRvIDAgYWZ0ZXIgYSB3cml0ZS4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgdzFfZjIzX2ZpeF9jb3VudChsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIHNpemVfdCBzaXplKQoreworCWlmIChvZmYgPiBzaXplKQorCQlyZXR1cm4gMDsKKworCWlmICgob2ZmICsgY291bnQpID4gc2l6ZSkKKwkJcmV0dXJuIChzaXplIC0gb2ZmKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCitzdGF0aWMgaW50IHcxX2YyM19yZWZyZXNoX2Jsb2NrKHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCB3MV9mMjNfZGF0YSAqZGF0YSwKKwkJCQlpbnQgYmxvY2spCit7CisJdTgJd3JidWZbM107CisJaW50CW9mZiA9IGJsb2NrICogVzFfUEFHRV9TSVpFOworCisJaWYgKGRhdGEtPnZhbGlkY3JjICYgKDEgPDwgYmxvY2spKQorCQlyZXR1cm4gMDsKKworCWlmICh3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CisJCWRhdGEtPnZhbGlkY3JjID0gMDsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJd3JidWZbMF0gPSBXMV9GMjNfUkVBRF9FRVBST007CisJd3JidWZbMV0gPSBvZmYgJiAweGZmOworCXdyYnVmWzJdID0gb2ZmID4+IDg7CisJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3Rlciwgd3JidWYsIDMpOworCXcxX3JlYWRfYmxvY2soc2wtPm1hc3RlciwgJmRhdGEtPm1lbW9yeVtvZmZdLCBXMV9QQUdFX1NJWkUpOworCisJLyogY2FjaGUgdGhlIGJsb2NrIGlmIHRoZSBDUkMgaXMgdmFsaWQgKi8KKwlpZiAoY3JjMTYoQ1JDMTZfSU5JVCwgJmRhdGEtPm1lbW9yeVtvZmZdLCBXMV9QQUdFX1NJWkUpID09IENSQzE2X1ZBTElEKQorCQlkYXRhLT52YWxpZGNyYyB8PSAoMSA8PCBibG9jayk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworCitzdGF0aWMgc3NpemVfdCB3MV9mMjNfcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IGtvYmpfdG9fdzFfc2xhdmUoa29iaik7CisjaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKKwlzdHJ1Y3QgdzFfZjIzX2RhdGEgKmRhdGEgPSBzbC0+ZmFtaWx5X2RhdGE7CisJaW50IGksIG1pbl9wYWdlLCBtYXhfcGFnZTsKKyNlbHNlCisJdTggd3JidWZbM107CisjZW5kaWYKKworCWlmICgoY291bnQgPSB3MV9mMjNfZml4X2NvdW50KG9mZiwgY291bnQsIFcxX0VFUFJPTV9TSVpFKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhdG9taWNfaW5jKCZzbC0+cmVmY250KTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbC0+bWFzdGVyLT5tdXRleCkpIHsKKwkJY291bnQgPSAwOworCQlnb3RvIG91dF9kZWM7CisJfQorCisjaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKKworCW1pbl9wYWdlID0gKG9mZiA+PiBXMV9QQUdFX0JJVFMpOworCW1heF9wYWdlID0gKG9mZiArIGNvdW50IC0gMSkgPj4gVzFfUEFHRV9CSVRTOworCWZvciAoaSA9IG1pbl9wYWdlOyBpIDw9IG1heF9wYWdlOyBpKyspIHsKKwkJaWYgKHcxX2YyM19yZWZyZXNoX2Jsb2NrKHNsLCBkYXRhLCBpKSkgeworCQkJY291bnQgPSAtRUlPOworCQkJZ290byBvdXRfdXA7CisJCX0KKwl9CisJbWVtY3B5KGJ1ZiwgJmRhdGEtPm1lbW9yeVtvZmZdLCBjb3VudCk7CisKKyNlbHNlIAkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworCisJLyogcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBFRVBST00gKi8KKwlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgeworCQljb3VudCA9IC1FSU87CisJCWdvdG8gb3V0X3VwOworCX0KKworCXdyYnVmWzBdID0gVzFfRjIzX1JFQURfRUVQUk9NOworCXdyYnVmWzFdID0gb2ZmICYgMHhmZjsKKwl3cmJ1ZlsyXSA9IG9mZiA+PiA4OworCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIHdyYnVmLCAzKTsKKwl3MV9yZWFkX2Jsb2NrKHNsLT5tYXN0ZXIsIGJ1ZiwgY291bnQpOworCisjZW5kaWYJLyogQ09ORklHX1cxX0YyM19DUkMgKi8KKworb3V0X3VwOgorCXVwKCZzbC0+bWFzdGVyLT5tdXRleCk7CitvdXRfZGVjOgorCWF0b21pY19kZWMoJnNsLT5yZWZjbnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIFdyaXRlcyB0byB0aGUgc2NyYXRjaHBhZCBhbmQgcmVhZHMgaXQgYmFjayBmb3IgdmVyaWZpY2F0aW9uLgorICogVGhlbiBjb3BpZXMgdGhlIHNjcmF0Y2hwYWQgdG8gRUVQUk9NLgorICogVGhlIGRhdGEgbXVzdCBiZSBvbiBvbmUgcGFnZS4KKyAqIFRoZSBtYXN0ZXIgbXVzdCBiZSBsb2NrZWQuCisgKgorICogQHBhcmFtIHNsCVRoZSBzbGF2ZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBhZGRyCUFkZHJlc3MgZm9yIHRoZSB3cml0ZQorICogQHBhcmFtIGxlbiAgIGxlbmd0aCBtdXN0IGJlIDw9IChXMV9QQUdFX1NJWkUgLSAoYWRkciAmIFcxX1BBR0VfTUFTSykpCisgKiBAcGFyYW0gZGF0YQlUaGUgZGF0YSB0byB3cml0ZQorICogQHJldHVybgkwPVN1Y2Nlc3MgLTE9ZmFpbHVyZQorICovCitzdGF0aWMgaW50IHcxX2YyM193cml0ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsLCBpbnQgYWRkciwgaW50IGxlbiwgY29uc3QgdTggKmRhdGEpCit7CisJdTggd3JidWZbNF07CisJdTggcmRidWZbVzFfUEFHRV9TSVpFICsgM107CisJdTggZXMgPSAoYWRkciArIGxlbiAtIDEpICYgMHgxZjsKKworCS8qIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBzY3JhdGNocGFkICovCisJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCXJldHVybiAtMTsKKworCXdyYnVmWzBdID0gVzFfRjIzX1dSSVRFX1NDUkFUQ0g7CisJd3JidWZbMV0gPSBhZGRyICYgMHhmZjsKKwl3cmJ1ZlsyXSA9IGFkZHIgPj4gODsKKworCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIHdyYnVmLCAzKTsKKwl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBkYXRhLCBsZW4pOworCisJLyogUmVhZCB0aGUgc2NyYXRjaHBhZCBhbmQgdmVyaWZ5ICovCisJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCXJldHVybiAtMTsKKworCXcxX3dyaXRlXzgoc2wtPm1hc3RlciwgVzFfRjIzX1JFQURfU0NSQVRDSCk7CisJdzFfcmVhZF9ibG9jayhzbC0+bWFzdGVyLCByZGJ1ZiwgbGVuICsgMyk7CisKKwkvKiBDb21wYXJlIHdoYXQgd2FzIHJlYWQgYWdhaW5zdCB0aGUgZGF0YSB3cml0dGVuICovCisJaWYgKChyZGJ1ZlswXSAhPSB3cmJ1ZlsxXSkgfHwgKHJkYnVmWzFdICE9IHdyYnVmWzJdKSB8fAorCSAgICAocmRidWZbMl0gIT0gZXMpIHx8IChtZW1jbXAoZGF0YSwgJnJkYnVmWzNdLCBsZW4pICE9IDApKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDb3B5IHRoZSBzY3JhdGNocGFkIHRvIEVFUFJPTSAqLworCWlmICh3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKQorCQlyZXR1cm4gLTE7CisKKwl3cmJ1ZlswXSA9IFcxX0YyM19DT1BZX1NDUkFUQ0g7CisJd3JidWZbM10gPSBlczsKKwl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCB3cmJ1ZiwgNCk7CisKKwkvKiBTbGVlcCBmb3IgNSBtcyB0byB3YWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUgKi8KKwltc2xlZXAoNSk7CisKKwkvKiBSZXNldCB0aGUgYnVzIHRvIHdha2UgdXAgdGhlIEVFUFJPTSAodGhpcyBtYXkgbm90IGJlIG5lZWRlZCkgKi8KKwl3MV9yZXNldF9idXMoc2wtPm1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgdzFfZjIzX3dyaXRlX2JpbihzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0ga29ial90b193MV9zbGF2ZShrb2JqKTsKKwlpbnQgYWRkciwgbGVuLCBpZHg7CisKKwlpZiAoKGNvdW50ID0gdzFfZjIzX2ZpeF9jb3VudChvZmYsIGNvdW50LCBXMV9FRVBST01fU0laRSkpID09IDApCisJCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKKwkvKiBjYW4gb25seSB3cml0ZSBmdWxsIGJsb2NrcyBpbiBjYWNoZWQgbW9kZSAqLworCWlmICgob2ZmICYgVzFfUEFHRV9NQVNLKSB8fCAoY291bnQgJiBXMV9QQUdFX01BU0spKSB7CisJCWRldl9lcnIoJnNsLT5kZXYsICJpbnZhbGlkIG9mZnNldC9jb3VudCBvZmY9JWQgY250PSVkXG4iLAorCQkJKGludClvZmYsIGNvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbWFrZSBzdXJlIHRoZSBibG9jayBDUkNzIGFyZSB2YWxpZCAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCArPSBXMV9QQUdFX1NJWkUpIHsKKwkJaWYgKGNyYzE2KENSQzE2X0lOSVQsICZidWZbaWR4XSwgVzFfUEFHRV9TSVpFKSAhPSBDUkMxNl9WQUxJRCkgeworCQkJZGV2X2Vycigmc2wtPmRldiwgImJhZCBDUkMgYXQgb2Zmc2V0ICVkXG4iLCAoaW50KW9mZik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKyNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworCisJYXRvbWljX2luYygmc2wtPnJlZmNudCk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2wtPm1hc3Rlci0+bXV0ZXgpKSB7CisJCWNvdW50ID0gMDsKKwkJZ290byBvdXRfZGVjOworCX0KKworCS8qIENhbiBvbmx5IHdyaXRlIGRhdGEgdG8gb25lIHBhZ2UgYXQgYSB0aW1lICovCisJaWR4ID0gMDsKKwl3aGlsZSAoaWR4IDwgY291bnQpIHsKKwkJYWRkciA9IG9mZiArIGlkeDsKKwkJbGVuID0gVzFfUEFHRV9TSVpFIC0gKGFkZHIgJiBXMV9QQUdFX01BU0spOworCQlpZiAobGVuID4gKGNvdW50IC0gaWR4KSkKKwkJCWxlbiA9IGNvdW50IC0gaWR4OworCisJCWlmICh3MV9mMjNfd3JpdGUoc2wsIGFkZHIsIGxlbiwgJmJ1ZltpZHhdKSA8IDApIHsKKwkJCWNvdW50ID0gLUVJTzsKKwkJCWdvdG8gb3V0X3VwOworCQl9CisJCWlkeCArPSBsZW47CisJfQorCitvdXRfdXA6CisJdXAoJnNsLT5tYXN0ZXItPm11dGV4KTsKK291dF9kZWM6CisJYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSB3MV9mMjNfYmluX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gImVlcHJvbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSBXMV9FRVBST01fU0laRSwKKwkucmVhZCA9IHcxX2YyM19yZWFkX2JpbiwKKwkud3JpdGUgPSB3MV9mMjNfd3JpdGVfYmluLAorfTsKKworc3RhdGljIGludCB3MV9mMjNfYWRkX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJaW50IGVycjsKKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworCXN0cnVjdCB3MV9mMjNfZGF0YSAqZGF0YTsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdzFfZjIzX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHcxX2YyM19kYXRhKSk7CisJc2wtPmZhbWlseV9kYXRhID0gZGF0YTsKKworI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisKKwllcnIgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX2YyM19iaW5fYXR0cik7CisKKyNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworCWlmIChlcnIpCisJCWtmcmVlKGRhdGEpOworI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB3MV9mMjNfcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisjaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKKwlpZiAoc2wtPmZhbWlseV9kYXRhKSB7CisJCWtmcmVlKHNsLT5mYW1pbHlfZGF0YSk7CisJCXNsLT5mYW1pbHlfZGF0YSA9IE5VTEw7CisJfQorI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9mMjNfYmluX2F0dHIpOworfQorCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseV9vcHMgdzFfZjIzX2ZvcHMgPSB7CisJLmFkZF9zbGF2ZSAgICAgID0gdzFfZjIzX2FkZF9zbGF2ZSwKKwkucmVtb3ZlX3NsYXZlICAgPSB3MV9mMjNfcmVtb3ZlX3NsYXZlLAorfTsKKworc3RhdGljIHN0cnVjdCB3MV9mYW1pbHkgdzFfZmFtaWx5XzIzID0geworCS5maWQgPSBXMV9FRVBST01fRFMyNDMzLAorCS5mb3BzID0gJncxX2YyM19mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdzFfZjIzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdzFfcmVnaXN0ZXJfZmFtaWx5KCZ3MV9mYW1pbHlfMjMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdzFfZjIzX2Zpbmkodm9pZCkKK3sKKwl3MV91bnJlZ2lzdGVyX2ZhbWlseSgmdzFfZmFtaWx5XzIzKTsKK30KKworbW9kdWxlX2luaXQodzFfZjIzX2luaXQpOworbW9kdWxlX2V4aXQodzFfZjIzX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9mYW1pbHkuYyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmMKaW5kZXggMDJlZWU1Ny4uODhjNTE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuYworKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCkBAIC0yOSwyMyArMjksMTIgQEAKIHN0YXRpYyBMSVNUX0hFQUQodzFfZmFtaWxpZXMpOwogZXh0ZXJuIHZvaWQgdzFfcmVjb25uZWN0X3NsYXZlcyhzdHJ1Y3QgdzFfZmFtaWx5ICpmKTsKIAotc3RhdGljIGludCB3MV9jaGVja19mYW1pbHkoc3RydWN0IHcxX2ZhbWlseSAqZikKLXsKLQlpZiAoIWYtPmZvcHMtPnJuYW1lIHx8ICFmLT5mb3BzLT5yYmluKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCiBpbnQgdzFfcmVnaXN0ZXJfZmFtaWx5KHN0cnVjdCB3MV9mYW1pbHkgKm5ld2YpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50LCAqbjsKIAlzdHJ1Y3QgdzFfZmFtaWx5ICpmOwogCWludCByZXQgPSAwOwogCi0JaWYgKHcxX2NoZWNrX2ZhbWlseShuZXdmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlzcGluX2xvY2soJncxX2Zsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50LCBuLCAmdzFfZmFtaWxpZXMpIHsKIAkJZiA9IGxpc3RfZW50cnkoZW50LCBzdHJ1Y3QgdzFfZmFtaWx5LCBmYW1pbHlfZW50cnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9mYW1pbHkuaCBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKaW5kZXggYjI2ZGEwMS4uMmNhMDQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuaAorKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCkBAIC0zMSwxNCArMzEsMTcgQEAKICNkZWZpbmUgVzFfRkFNSUxZX1NNRU1fODEJMHg4MQogI2RlZmluZSBXMV9USEVSTV9EUzE4UzIwIAkweDEwCiAjZGVmaW5lIFcxX1RIRVJNX0RTMTgyMiAgCTB4MjIKKyNkZWZpbmUgVzFfRUVQUk9NX0RTMjQzMyAgCTB4MjMKICNkZWZpbmUgVzFfVEhFUk1fRFMxOEIyMCAJMHgyOAogCiAjZGVmaW5lIE1BWE5BTUVMRU4JCTMyCiAKK3N0cnVjdCB3MV9zbGF2ZTsKKwogc3RydWN0IHcxX2ZhbWlseV9vcHMKIHsKLQlzc2l6ZV90ICgqIHJuYW1lKShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosIGNoYXIgKik7Ci0Jc3NpemVfdCAoKiByYmluKShzdHJ1Y3Qga29iamVjdCAqLCBjaGFyICosIGxvZmZfdCwgc2l6ZV90KTsKKwlpbnQgICgqIGFkZF9zbGF2ZSkoc3RydWN0IHcxX3NsYXZlICopOworCXZvaWQgKCogcmVtb3ZlX3NsYXZlKShzdHJ1Y3QgdzFfc2xhdmUgKik7CiB9OwogCiBzdHJ1Y3QgdzFfZmFtaWx5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCA0OThhZDUwNS4uYzNmNjdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pbnQuYworKysgYi9kcml2ZXJzL3cxL3cxX2ludC5jCkBAIC0yOSw5ICsyOSw5IEBACiAKIHN0YXRpYyB1MzIgdzFfaWRzID0gMTsKIAotZXh0ZXJuIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHcxX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB3MV9tYXN0ZXJfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSB3MV9idXNfdHlwZTsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlIHcxX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlIHcxX21hc3Rlcl9kZXZpY2U7CiBleHRlcm4gaW50IHcxX21heF9zbGF2ZV9jb3VudDsKIGV4dGVybiBpbnQgdzFfbWF4X3NsYXZlX3R0bDsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHcxX21hc3RlcnM7CkBAIC03Niw3ICs3Niw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+c2xpc3QpOwogCWluaXRfTVVURVgoJmRldi0+bXV0ZXgpOwogCi0JaW5pdF9jb21wbGV0aW9uKCZkZXYtPmRldl9yZWxlYXNlZCk7CiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmRldl9leGl0ZWQpOwogCiAJbWVtY3B5KCZkZXYtPmRldiwgZGV2aWNlLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwpAQCAtODgsMTcgKzg3LDE0IEBACiAKIAlkZXYtPmdyb3VwcyA9IDE7CiAJZGV2LT5zZXEgPSAxOwotCWRldi0+bmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVzEsIDEsIE5VTEwsIFRISVNfTU9EVUxFKTsKLQlpZiAoIWRldi0+bmxzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgbmV0bGluayBzb2NrZXQoJXUpIGZvciB3MSBtYXN0ZXIgJXMuXG4iLAotCQkJTkVUTElOS19ORkxPRywgZGV2LT5kZXYuYnVzX2lkKTsKLQl9CisJZGV2X2luaXRfbmV0bGluayhkZXYpOwogCiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBtYXN0ZXIgZGV2aWNlLiBlcnI9JWRcbiIsIGVycik7Ci0JCWlmIChkZXYtPm5scyAmJiBkZXYtPm5scy0+c2tfc29ja2V0KQotCQkJc29ja19yZWxlYXNlKGRldi0+bmxzLT5za19zb2NrZXQpOworCisJCWRldl9maW5pX25ldGxpbmsoZGV2KTsKKwogCQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHcxX21hc3RlcikpOwogCQlrZnJlZShkZXYpOwogCQlkZXYgPSBOVUxMOwpAQCAtMTA3LDEzICsxMDMsOSBAQAogCXJldHVybiBkZXY7CiB9CiAKLXN0YXRpYyB2b2lkIHcxX2ZyZWVfZGV2KHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3ZvaWQgdzFfZnJlZV9kZXYoc3RydWN0IHcxX21hc3RlciAqZGV2KQogewogCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldik7Ci0JaWYgKGRldi0+bmxzICYmIGRldi0+bmxzLT5za19zb2NrZXQpCi0JCXNvY2tfcmVsZWFzZShkZXYtPm5scy0+c2tfc29ja2V0KTsKLQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHcxX21hc3RlcikgKyBzaXplb2Yoc3RydWN0IHcxX2J1c19tYXN0ZXIpKTsKLQlrZnJlZShkZXYpOwogfQogCiBpbnQgdzFfYWRkX21hc3Rlcl9kZXZpY2Uoc3RydWN0IHcxX2J1c19tYXN0ZXIgKm1hc3RlcikKQEAgLTEyOSw3ICsxMjEsNyBAQAogCQlyZXR1cm4oLUVJTlZBTCk7CiAgICAgICAgIH0KIAotCWRldiA9IHcxX2FsbG9jX2Rldih3MV9pZHMrKywgdzFfbWF4X3NsYXZlX2NvdW50LCB3MV9tYXhfc2xhdmVfdHRsLCAmdzFfZHJpdmVyLCAmdzFfZGV2aWNlKTsKKwlkZXYgPSB3MV9hbGxvY19kZXYodzFfaWRzKyssIHcxX21heF9zbGF2ZV9jb3VudCwgdzFfbWF4X3NsYXZlX3R0bCwgJncxX21hc3Rlcl9kcml2ZXIsICZ3MV9tYXN0ZXJfZGV2aWNlKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE4OCw3ICsxODAsNyBAQAogCQkJIF9fZnVuY19fLCBkZXYtPmtwaWQpOwogCiAJd2hpbGUgKGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGluZyBmb3IgJXMgdG8gYmVjb21lIGZyZWU6IHJlZmNudD0lZC5cbiIsCisJCWRldl9kYmcoJmRldi0+ZGV2LCAiV2FpdGluZyBmb3IgJXMgdG8gYmVjb21lIGZyZWU6IHJlZmNudD0lZC5cbiIsCiAJCQkJZGV2LT5uYW1lLCBhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpKTsKIAogCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2lvLmMgYi9kcml2ZXJzL3cxL3cxX2lvLmMKaW5kZXggMDBmMDMyMi4uZTJhMDQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pby5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW8uYwpAQCAtMjc3LDYgKzI3NywyOSBAQAogCQl3MV9zZWFyY2goZGV2LCBjYik7CiB9CiAKKy8qKgorICogUmVzZXRzIHRoZSBidXMgYW5kIHRoZW4gc2VsZWN0cyB0aGUgc2xhdmUgYnkgc2VuZGluZyBlaXRoZXIgYSBza2lwIHJvbQorICogb3IgYSByb20gbWF0Y2guCisgKiBUaGUgdzEgbWFzdGVyIGxvY2sgbXVzdCBiZSBoZWxkLgorICoKKyAqIEBwYXJhbSBzbAl0aGUgc2xhdmUgdG8gc2VsZWN0CisgKiBAcmV0dXJuIAkwPXN1Y2Nlc3MsIGFueXRoaW5nIGVsc2U9ZXJyb3IKKyAqLworaW50IHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQoreworCWlmICh3MV9yZXNldF9idXMoc2wtPm1hc3RlcikpCisJCXJldHVybiAtMTsKKworCWlmIChzbC0+bWFzdGVyLT5zbGF2ZV9jb3VudCA9PSAxKQorCQl3MV93cml0ZV84KHNsLT5tYXN0ZXIsIFcxX1NLSVBfUk9NKTsKKwllbHNlIHsKKwkJdTggbWF0Y2hbOV0gPSB7VzFfTUFUQ0hfUk9NLCB9OworCQltZW1jcHkoJm1hdGNoWzFdLCAodTggKikmc2wtPnJlZ19udW0sIDgpOworCQl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBtYXRjaCwgOSk7CisJfQorCXJldHVybiAwOworfQorCiBFWFBPUlRfU1lNQk9MKHcxX3RvdWNoX2JpdCk7CiBFWFBPUlRfU1lNQk9MKHcxX3dyaXRlXzgpOwogRVhQT1JUX1NZTUJPTCh3MV9yZWFkXzgpOwpAQCAtMjg2LDMgKzMwOSw0IEBACiBFWFBPUlRfU1lNQk9MKHcxX3JlYWRfYmxvY2spOwogRVhQT1JUX1NZTUJPTCh3MV93cml0ZV9ibG9jayk7CiBFWFBPUlRfU1lNQk9MKHcxX3NlYXJjaF9kZXZpY2VzKTsKK0VYUE9SVF9TWU1CT0wodzFfcmVzZXRfc2VsZWN0X3NsYXZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uaCBiL2RyaXZlcnMvdzEvdzFfaW8uaAppbmRleCBhZjU4Mjk3Li4yMzI4NjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmgKKysrIGIvZHJpdmVycy93MS93MV9pby5oCkBAIC0zNCw1ICszNCw2IEBACiB2b2lkIHcxX3dyaXRlX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKiwgY29uc3QgdTggKiwgaW50KTsKIHU4IHcxX3JlYWRfYmxvY2soc3RydWN0IHcxX21hc3RlciAqLCB1OCAqLCBpbnQpOwogdm9pZCB3MV9zZWFyY2hfZGV2aWNlcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKK2ludCB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCk7CiAKICNlbmRpZiAvKiBfX1cxX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmMKaW5kZXggZTdiNzc0NC4uMzI4NjQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMKKysrIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmMKQEAgLTU3LDEwICs1NywzNiBAQAogbmxtc2dfZmFpbHVyZToKIAlyZXR1cm47CiB9CisKK2ludCBkZXZfaW5pdF9uZXRsaW5rKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3sKKwlkZXYtPm5scyA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1cxLCAxLCBOVUxMLCBUSElTX01PRFVMRSk7CisJaWYgKCFkZXYtPm5scykgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUgbmV3IG5ldGxpbmsgc29ja2V0KCV1KSBmb3IgdzEgbWFzdGVyICVzLlxuIiwKKwkJCU5FVExJTktfVzEsIGRldi0+ZGV2LmJ1c19pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGV2X2ZpbmlfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCit7CisJaWYgKGRldi0+bmxzICYmIGRldi0+bmxzLT5za19zb2NrZXQpCisJCXNvY2tfcmVsZWFzZShkZXYtPm5scy0+c2tfc29ja2V0KTsKK30KICNlbHNlCiAjd2FybmluZyBOZXRsaW5rIHN1cHBvcnQgaXMgZGlzYWJsZWQuIFBsZWFzZSBjb21waWxlIHdpdGggTkVUIHN1cHBvcnQgZW5hYmxlZC4KIAogdm9pZCB3MV9uZXRsaW5rX3NlbmQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1zZykKIHsKIH0KKworaW50IGRldl9pbml0X25ldGxpbmsoc3RydWN0IHcxX21hc3RlciAqZGV2KQoreworCXJldHVybiAwOworfQorCit2b2lkIGRldl9maW5pX25ldGxpbmsoc3RydWN0IHcxX21hc3RlciAqZGV2KQoreworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaCBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCmluZGV4IDg2MTU3NTYuLmViMGM4YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCkBAIC01Miw2ICs1Miw4IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiB2b2lkIHcxX25ldGxpbmtfc2VuZChzdHJ1Y3QgdzFfbWFzdGVyICosIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKTsKK2ludCBkZXZfaW5pdF9uZXRsaW5rKHN0cnVjdCB3MV9tYXN0ZXIgKmRldik7Cit2b2lkIGRldl9maW5pX25ldGxpbmsoc3RydWN0IHcxX21hc3RlciAqZGV2KTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX1cxX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9zbWVtLmMgYi9kcml2ZXJzL3cxL3cxX3NtZW0uYwppbmRleCA3MGQyZDQ2Li5lMzIwOWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX3NtZW0uYworKysgYi9kcml2ZXJzL3cxL3cxX3NtZW0uYwpAQCAtMzYsNjEgKzM2LDEyIEBACiBNT0RVTEVfQVVUSE9SKCJFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIDEtd2lyZSBEYWxsYXMgbmV0d29yayBwcm90b2NvbCwgNjRiaXQgbWVtb3J5IGZhbWlseS4iKTsKIAotc3RhdGljIHNzaXplX3QgdzFfc21lbV9yZWFkX25hbWUoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqKTsKLXN0YXRpYyBzc2l6ZV90IHcxX3NtZW1fcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKiwgY2hhciAqLCBsb2ZmX3QsIHNpemVfdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5X29wcyB3MV9zbWVtX2ZvcHMgPSB7Ci0JLnJuYW1lID0gJncxX3NtZW1fcmVhZF9uYW1lLAotCS5yYmluID0gJncxX3NtZW1fcmVhZF9iaW4sCi19OwotCi1zdGF0aWMgc3NpemVfdCB3MV9zbWVtX3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzbC0+bmFtZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHcxX3NtZW1fcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBjb250YWluZXJfb2YoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLAotCQkJCQkgICBzdHJ1Y3QgdzFfc2xhdmUsIGRldik7Ci0JaW50IGk7Ci0KLQlhdG9taWNfaW5jKCZzbC0+cmVmY250KTsKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbC0+bWFzdGVyLT5tdXRleCkpIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dF9kZWM7Ci0JfQotCi0JaWYgKG9mZiA+IFcxX1NMQVZFX0RBVEFfU0laRSkgewotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAob2ZmICsgY291bnQgPiBXMV9TTEFWRV9EQVRBX1NJWkUpIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiUwMnggIiwgKCh1OCAqKSZzbC0+cmVnX251bSlbaV0pOwotCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICJcbiIpOwotCi1vdXQ6Ci0JdXAoJnNsLT5tYXN0ZXItPm11dGV4KTsKLW91dF9kZWM6Ci0JYXRvbWljX2RlYygmc2wtPnJlZmNudCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5IHcxX3NtZW1fZmFtaWx5XzAxID0gewogCS5maWQgPSBXMV9GQU1JTFlfU01FTV8wMSwKLQkuZm9wcyA9ICZ3MV9zbWVtX2ZvcHMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV9zbWVtX2ZhbWlseV84MSA9IHsKIAkuZmlkID0gVzFfRkFNSUxZX1NNRU1fODEsCi0JLmZvcHMgPSAmdzFfc21lbV9mb3BzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdzFfc21lbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX3RoZXJtLmMgYi9kcml2ZXJzL3cxL3cxX3RoZXJtLmMKaW5kZXggMTY1NTI2Yy4uNDU3N2RmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvdzFfdGhlcm0uYwpAQCAtNDIsMTIgKzQyLDMxIEBACiAJCQkJe30KIAkJCX07CiAKLXN0YXRpYyBzc2l6ZV90IHcxX3RoZXJtX3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICopOwogc3RhdGljIHNzaXplX3QgdzFfdGhlcm1fcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKiwgY2hhciAqLCBsb2ZmX3QsIHNpemVfdCk7CiAKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSB3MV90aGVybV9iaW5fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAidzFfc2xhdmUiLAorCQkubW9kZSA9IFNfSVJVR08sCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSBXMV9TTEFWRV9EQVRBX1NJWkUsCisJLnJlYWQgPSB3MV90aGVybV9yZWFkX2JpbiwKK307CisKK3N0YXRpYyBpbnQgdzFfdGhlcm1fYWRkX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfdGhlcm1fYmluX2F0dHIpOworfQorCitzdGF0aWMgdm9pZCB3MV90aGVybV9yZW1vdmVfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX3RoZXJtX2Jpbl9hdHRyKTsKK30KKwogc3RhdGljIHN0cnVjdCB3MV9mYW1pbHlfb3BzIHcxX3RoZXJtX2ZvcHMgPSB7Ci0JLnJuYW1lID0gJncxX3RoZXJtX3JlYWRfbmFtZSwKLQkucmJpbiA9ICZ3MV90aGVybV9yZWFkX2JpbiwKKwkuYWRkX3NsYXZlCT0gdzFfdGhlcm1fYWRkX3NsYXZlLAorCS5yZW1vdmVfc2xhdmUJPSB3MV90aGVybV9yZW1vdmVfc2xhdmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV90aGVybV9mYW1pbHlfRFMxOFMyMCA9IHsKQEAgLTU5LDYgKzc4LDcgQEAKIAkuZmlkID0gVzFfVEhFUk1fRFMxOEIyMCwKIAkuZm9wcyA9ICZ3MV90aGVybV9mb3BzLAogfTsKKwogc3RhdGljIHN0cnVjdCB3MV9mYW1pbHkgdzFfdGhlcm1fZmFtaWx5X0RTMTgyMiA9IHsKIAkuZmlkID0gVzFfVEhFUk1fRFMxODIyLAogCS5mb3BzID0gJncxX3RoZXJtX2ZvcHMsCkBAIC05MCwxMyArMTEwLDYgQEAKIAl9LAogfTsKIAotc3RhdGljIHNzaXplX3QgdzFfdGhlcm1fcmVhZF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNsLT5uYW1lKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgdzFfRFMxOEIyMF9jb252ZXJ0X3RlbXAodTggcm9tWzldKQogewogCWludCB0ID0gKHJvbVsxXSA8PCA4KSB8IHJvbVswXTsKQEAgLTE0OCw4ICsxNjEsNyBAQAogCiBzdGF0aWMgc3NpemVfdCB3MV90aGVybV9yZWFkX2JpbihzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiksCi0JCQkJCSAgIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0ga29ial90b193MV9zbGF2ZShrb2JqKTsKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXYgPSBzbC0+bWFzdGVyOwogCXU4IHJvbVs5XSwgY3JjLCB2ZXJkaWN0OwogCWludCBpLCBtYXhfdHJ5aW5nID0gMTA7CkBAIC0xNzgsMTUgKzE5MCwxMCBAQAogCWNyYyA9IDA7CiAKIAl3aGlsZSAobWF4X3RyeWluZy0tKSB7Ci0JCWlmICghdzFfcmVzZXRfYnVzIChkZXYpKSB7CisJCWlmICghdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgewogCQkJaW50IGNvdW50ID0gMDsKLQkJCXU4IG1hdGNoWzldID0ge1cxX01BVENIX1JPTSwgfTsKIAkJCXVuc2lnbmVkIGludCB0bSA9IDc1MDsKIAotCQkJbWVtY3B5KCZtYXRjaFsxXSwgKHU2NCAqKSAmIHNsLT5yZWdfbnVtLCA4KTsKLQotCQkJdzFfd3JpdGVfYmxvY2soZGV2LCBtYXRjaCwgOSk7Ci0KIAkJCXcxX3dyaXRlXzgoZGV2LCBXMV9DT05WRVJUX1RFTVApOwogCiAJCQl3aGlsZSAodG0pIHsKQEAgLTE5NSw4ICsyMDIsNyBAQAogCQkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCQkJfQogCi0JCQlpZiAoIXcxX3Jlc2V0X2J1cyAoZGV2KSkgewotCQkJCXcxX3dyaXRlX2Jsb2NrKGRldiwgbWF0Y2gsIDkpOworCQkJaWYgKCF3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CiAKIAkJCQl3MV93cml0ZV84KGRldiwgVzFfUkVBRF9TQ1JBVENIUEFEKTsKIAkJCQlpZiAoKGNvdW50ID0gdzFfcmVhZF9ibG9jayhkZXYsIHJvbSwgOSkpICE9IDkpIHsKQEAgLTIwNyw3ICsyMTMsNiBAQAogCiAJCQkJaWYgKHJvbVs4XSA9PSBjcmMgJiYgcm9tWzBdKQogCQkJCQl2ZXJkaWN0ID0gMTsKLQogCQkJfQogCQl9CiAKZGlmZiAtLWdpdCBhL2ZzLzlwLzlwLmMgYi9mcy85cC85cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDdmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC85cC5jCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogIGxpbnV4L2ZzLzlwLzlwLmMKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyA5UDIwMDAgZnVuY3Rpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJtdXguaCIKKworLyoqCisgKiB2OWZzX3RfdmVyc2lvbiAtIG5lZ290aWF0ZSBwcm90b2NvbCBwYXJhbWV0ZXJzIHdpdGggc2V2ZXIKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBtc2l6ZTogcmVxdWVzdGVkIG1heCBzaXplIHBhY2tldAorICogQHZlcnNpb246IHJlcXVlc3RlZCB2ZXJzaW9uLmV4dGVuc2lvbiBzdHJpbmcKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbCBwb2ludGVyCisgKgorICovCisKK2ludAordjlmc190X3ZlcnNpb24oc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIG1zaXplLAorCSAgICAgICBjaGFyICp2ZXJzaW9uLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKworCWRwcmludGsoREVCVUdfOVAsICJtc2l6ZTogJWQgdmVyc2lvbjogJXNcbiIsIG1zaXplLCB2ZXJzaW9uKTsKKwltc2cuaWQgPSBUVkVSU0lPTjsKKwltc2cucGFyYW1zLnR2ZXJzaW9uLm1zaXplID0gbXNpemU7CisJbXNnLnBhcmFtcy50dmVyc2lvbi52ZXJzaW9uID0gdmVyc2lvbjsKKworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3RfYXR0YWNoIC0gbW91bnQgdGhlIHNlcnZlcgorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQHVuYW1lOiB1c2VyIG5hbWUgZG9pbmcgdGhlIGF0dGFjaAorICogQGFuYW1lOiByZW1vdGUgbmFtZSBiZWluZyBhdHRhY2hlZCB0bworICogQGZpZDogbW91bnQgZmlkIHRvIGF0dGF0Y2ggdG8gcm9vdCBub2RlCisgKiBAYWZpZDogYXV0aGVudGljYXRpb24gZmlkIChpbiB0aGlzIGNhc2UgcmVzdWx0IGtleSkKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbCBwb2ludGVyCisgKgorICovCisKK2ludAordjlmc190X2F0dGFjaChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjaGFyICp1bmFtZSwgY2hhciAqYW5hbWUsCisJICAgICAgdTMyIGZpZCwgdTMyIGFmaWQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCisJZHByaW50ayhERUJVR185UCwgInVuYW1lICclcycgYW5hbWUgJyVzJyBmaWQgJWQgYWZpZCAlZFxuIiwgdW5hbWUsCisJCWFuYW1lLCBmaWQsIGFmaWQpOworCW1zZy5pZCA9IFRBVFRBQ0g7CisJbXNnLnBhcmFtcy50YXR0YWNoLmZpZCA9IGZpZDsKKwltc2cucGFyYW1zLnRhdHRhY2guYWZpZCA9IGFmaWQ7CisJbXNnLnBhcmFtcy50YXR0YWNoLnVuYW1lID0gdW5hbWU7CisJbXNnLnBhcmFtcy50YXR0YWNoLmFuYW1lID0gYW5hbWU7CisKKwlyZXR1cm4gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7Cit9CisKKy8qKgorICogdjlmc190X2NsdW5rIC0gcmVsZWFzZSBhIGZpZCAoZmluaXNoIGEgdHJhbnNhY3Rpb24pCisgKiBAdjlzZXM6IDlQMjAwMCBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZmlkOiBmaWQgdG8gcmVsZWFzZQorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsIHBvaW50ZXIKKyAqCisgKi8KKworaW50Cit2OWZzX3RfY2x1bmsoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwKKwkgICAgIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCisJZHByaW50ayhERUJVR185UCwgImZpZCAlZFxuIiwgZmlkKTsKKwltc2cuaWQgPSBUQ0xVTks7CisJbXNnLnBhcmFtcy50Y2x1bmsuZmlkID0gZmlkOworCisJcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworfQorCisvKioKKyAqIHY5ZnNfdjlmc190X2ZsdXNoIC0gZmx1c2ggYSBwZW5kaW5nIHRyYW5zYWN0aW9uCisgKiBAdjlzZXM6IDlQMjAwMCBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAdGFnOiB0aWQgdG8gcmVsZWFzZQorICoKKyAqLworCitpbnQgdjlmc190X2ZsdXNoKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUxNiB0YWcpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCisJZHByaW50ayhERUJVR185UCwgIm9sZHRhZyAlZFxuIiwgdGFnKTsKKwltc2cuaWQgPSBURkxVU0g7CisJbXNnLnBhcmFtcy50Zmx1c2gub2xkdGFnID0gdGFnOworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIE5VTEwpOworfQorCisvKioKKyAqIHY5ZnNfdF9zdGF0IC0gcmVhZCBhIGZpbGUncyBtZXRhLWRhdGEKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCBwb2ludGluZyB0byBmaWxlIG9yIGRpcmVjdG9yeSB0byBnZXQgaW5mbyBhYm91dAorICogQGZjYWxsOiBwb2ludGVyIHRvIHJlc3BvbnNlIGZjYWxsCisgKgorICovCisKK2ludAordjlmc190X3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkXG4iLCBmaWQpOworCWlmIChmY2FsbCkKKwkJKmZjYWxsID0gTlVMTDsKKworCW1zZy5pZCA9IFRTVEFUOworCW1zZy5wYXJhbXMudHN0YXQuZmlkID0gZmlkOworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3Rfd3N0YXQgLSB3cml0ZSBhIGZpbGUncyBtZXRhLWRhdGEKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCBwb2ludGluZyB0byBmaWxlIG9yIGRpcmVjdG9yeSB0byB3cml0ZSBpbmZvIGFib3V0CisgKiBAc3RhdDogbWV0YWRhdGEKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbAorICoKKyAqLworCitpbnQKK3Y5ZnNfdF93c3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCSAgICAgc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIGxlbmd0aCAlZFxuIiwgZmlkLCAoaW50KXN0YXQtPmxlbmd0aCk7CisJbXNnLmlkID0gVFdTVEFUOworCW1zZy5wYXJhbXMudHdzdGF0LmZpZCA9IGZpZDsKKwltc2cucGFyYW1zLnR3c3RhdC5zdGF0ID0gc3RhdDsKKworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3Rfd2FsayAtIHdhbGsgYSBmaWQgdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnkKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byB3YWxrCisgKiBAbmV3ZmlkOiBuZXcgZmlkIChmb3IgY2xvbmUgb3BlcmF0aW9ucykKKyAqIEBuYW1lOiBwYXRoIHRvIHdhbGsgZmlkIHRvCisgKiBAZmNhbGw6IHBvaW50ZXIgdG8gcmVzcG9uc2UgZmNhbGwKKyAqCisgKi8KKworLyogVE9ETzogc3VwcG9ydCBtdWx0aXBsZSB3YWxrICovCisKK2ludAordjlmc190X3dhbGsoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgdTMyIG5ld2ZpZCwKKwkgICAgY2hhciAqbmFtZSwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIG5ld2ZpZCAlZCB3bmFtZSAnJXMnXG4iLCBmaWQsIG5ld2ZpZCwgbmFtZSk7CisJbXNnLmlkID0gVFdBTEs7CisJbXNnLnBhcmFtcy50d2Fsay5maWQgPSBmaWQ7CisJbXNnLnBhcmFtcy50d2Fsay5uZXdmaWQgPSBuZXdmaWQ7CisKKwlpZiAobmFtZSkgeworCQltc2cucGFyYW1zLnR3YWxrLm53bmFtZSA9IDE7CisJCW1zZy5wYXJhbXMudHdhbGsud25hbWVzID0gJm5hbWU7CisJfSBlbHNlIHsKKwkJbXNnLnBhcmFtcy50d2Fsay5ud25hbWUgPSAwOworCX0KKworCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKK30KKworLyoqCisgKiB2OWZzX3Rfb3BlbiAtIG9wZW4gYSBmaWxlCisgKgorICogQHY5c2VzIC0gOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQgLSBmaWQgdG8gb3BlbgorICogQG1vZGUgLSBtb2RlIHRvIG9wZW4gZmlsZSAoUiwgUlcsIGV0YykKKyAqIEBmY2FsbCAtIHBvaW50ZXIgdG8gcmVzcG9uc2UgZmNhbGwKKyAqCisgKi8KKworaW50Cit2OWZzX3Rfb3BlbihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCB1OCBtb2RlLAorCSAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKwlsb25nIGVycm9ybm8gPSAtMTsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgbW9kZSAlZFxuIiwgZmlkLCBtb2RlKTsKKwltc2cuaWQgPSBUT1BFTjsKKwltc2cucGFyYW1zLnRvcGVuLmZpZCA9IGZpZDsKKwltc2cucGFyYW1zLnRvcGVuLm1vZGUgPSBtb2RlOworCisJZXJyb3JubyA9IHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworCisJcmV0dXJuIGVycm9ybm87Cit9CisKKy8qKgorICogdjlmc190X3JlbW92ZSAtIHJlbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5CisgKiBAdjlzZXM6IDlQMjAwMCBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZmlkOiBmaWQgdG8gcmVtb3ZlCisgKiBAZmNhbGw6IHBvaW50ZXIgdG8gcmVzcG9uc2UgZmNhbGwKKyAqCisgKi8KKworaW50Cit2OWZzX3RfcmVtb3ZlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJICAgICAgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkXG4iLCBmaWQpOworCW1zZy5pZCA9IFRSRU1PVkU7CisJbXNnLnBhcmFtcy50cmVtb3ZlLmZpZCA9IGZpZDsKKwlyZXR1cm4gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7Cit9CisKKy8qKgorICogdjlmc190X2NyZWF0ZSAtIGNyZWF0ZSBhIGZpbGUgb3IgZGlyZWN0b3J5CisgKiBAdjlzZXM6IDlQMjAwMCBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZmlkOiBmaWQgdG8gY3JlYXRlCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gY3JlYXRlCisgKiBAcGVybTogcGVybWlzc2lvbnMgdG8gY3JlYXRlIHdpdGgKKyAqIEBtb2RlOiBtb2RlIHRvIG9wZW4gZmlsZSAoUiwgUlcsIGV0YykKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbAorICoKKyAqLworCitpbnQKK3Y5ZnNfdF9jcmVhdGUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgY2hhciAqbmFtZSwKKwkgICAgICB1MzIgcGVybSwgdTggbW9kZSwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIG5hbWUgJyVzJyBwZXJtICV4IG1vZGUgJWRcbiIsCisJCWZpZCwgbmFtZSwgcGVybSwgbW9kZSk7CisKKwltc2cuaWQgPSBUQ1JFQVRFOworCW1zZy5wYXJhbXMudGNyZWF0ZS5maWQgPSBmaWQ7CisJbXNnLnBhcmFtcy50Y3JlYXRlLm5hbWUgPSBuYW1lOworCW1zZy5wYXJhbXMudGNyZWF0ZS5wZXJtID0gcGVybTsKKwltc2cucGFyYW1zLnRjcmVhdGUubW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7Cit9CisKKy8qKgorICogdjlmc190X3JlYWQgLSByZWFkIGRhdGEKKyAqIEB2OXNlczogOVAyMDAwIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byByZWFkIGZyb20KKyAqIEBvZmZzZXQ6IG9mZnNldCB0byBzdGFydCByZWFkIGF0CisgKiBAY291bnQ6IGhvdyBtYW55IGJ5dGVzIHRvIHJlYWQKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbCAod2l0aCBkYXRhKQorICoKKyAqLworCitpbnQKK3Y5ZnNfdF9yZWFkKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHU2NCBvZmZzZXQsCisJICAgIHUzMiBjb3VudCwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjID0gTlVMTDsKKwlsb25nIGVycm9ybm8gPSAtMTsKKworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgb2Zmc2V0IDB4JWx4IGNvdW50IDB4JXhcbiIsIGZpZCwKKwkJKGxvbmcgdW5zaWduZWQgaW50KW9mZnNldCwgY291bnQpOworCW1zZy5pZCA9IFRSRUFEOworCW1zZy5wYXJhbXMudHJlYWQuZmlkID0gZmlkOworCW1zZy5wYXJhbXMudHJlYWQub2Zmc2V0ID0gb2Zmc2V0OworCW1zZy5wYXJhbXMudHJlYWQuY291bnQgPSBjb3VudDsKKwllcnJvcm5vID0gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCAmcmMpOworCisJaWYgKCFlcnJvcm5vKSB7CisJCWVycm9ybm8gPSByYy0+cGFyYW1zLnJyZWFkLmNvdW50OworCQlkdW1wX2RhdGEocmMtPnBhcmFtcy5ycmVhZC5kYXRhLCByYy0+cGFyYW1zLnJyZWFkLmNvdW50KTsKKwl9CisKKwlpZiAoZmNhbGwpCisJCSpmY2FsbCA9IHJjOworCWVsc2UKKwkJa2ZyZWUocmMpOworCisJcmV0dXJuIGVycm9ybm87Cit9CisKKy8qKgorICogdjlmc190X3dyaXRlIC0gd3JpdGUgZGF0YQorICogQHY5c2VzOiA5UDIwMDAgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZDogZmlkIHRvIHdyaXRlIHRvCisgKiBAb2Zmc2V0OiBvZmZzZXQgdG8gc3RhcnQgd3JpdGUgYXQKKyAqIEBjb3VudDogaG93IG1hbnkgYnl0ZXMgdG8gd3JpdGUKKyAqIEBmY2FsbDogcG9pbnRlciB0byByZXNwb25zZSBmY2FsbAorICoKKyAqLworCitpbnQKK3Y5ZnNfdF93cml0ZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCSAgICAgdTY0IG9mZnNldCwgdTMyIGNvdW50LCB2b2lkICpkYXRhLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmMgPSBOVUxMOworCWxvbmcgZXJyb3JubyA9IC0xOworCisJZHByaW50ayhERUJVR185UCwgImZpZCAlZCBvZmZzZXQgMHglbGx4IGNvdW50IDB4JXhcbiIsIGZpZCwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsIGNvdW50KTsKKwlkdW1wX2RhdGEoZGF0YSwgY291bnQpOworCisJbXNnLmlkID0gVFdSSVRFOworCW1zZy5wYXJhbXMudHdyaXRlLmZpZCA9IGZpZDsKKwltc2cucGFyYW1zLnR3cml0ZS5vZmZzZXQgPSBvZmZzZXQ7CisJbXNnLnBhcmFtcy50d3JpdGUuY291bnQgPSBjb3VudDsKKwltc2cucGFyYW1zLnR3cml0ZS5kYXRhID0gZGF0YTsKKworCWVycm9ybm8gPSB2OWZzX211eF9ycGModjlzZXMsICZtc2csICZyYyk7CisKKwlpZiAoIWVycm9ybm8pCisJCWVycm9ybm8gPSByYy0+cGFyYW1zLnJ3cml0ZS5jb3VudDsKKworCWlmIChmY2FsbCkKKwkJKmZjYWxsID0gcmM7CisJZWxzZQorCQlrZnJlZShyYyk7CisKKwlyZXR1cm4gZXJyb3JubzsKK30KZGlmZiAtLWdpdCBhL2ZzLzlwLzlwLmggYi9mcy85cC85cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTQyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC85cC5oCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogbGludXgvZnMvOXAvOXAuaAorICoKKyAqIDlQIHByb3RvY29sIGRlZmluaXRpb25zLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworLyogTWVzc2FnZSBUeXBlcyAqLworZW51bSB7CisJVFZFUlNJT04gPSAxMDAsCisJUlZFUlNJT04sCisJVEFVVEggPSAxMDIsCisJUkFVVEgsCisJVEFUVEFDSCA9IDEwNCwKKwlSQVRUQUNILAorCVRFUlJPUiA9IDEwNiwKKwlSRVJST1IsCisJVEZMVVNIID0gMTA4LAorCVJGTFVTSCwKKwlUV0FMSyA9IDExMCwKKwlSV0FMSywKKwlUT1BFTiA9IDExMiwKKwlST1BFTiwKKwlUQ1JFQVRFID0gMTE0LAorCVJDUkVBVEUsCisJVFJFQUQgPSAxMTYsCisJUlJFQUQsCisJVFdSSVRFID0gMTE4LAorCVJXUklURSwKKwlUQ0xVTksgPSAxMjAsCisJUkNMVU5LLAorCVRSRU1PVkUgPSAxMjIsCisJUlJFTU9WRSwKKwlUU1RBVCA9IDEyNCwKKwlSU1RBVCwKKwlUV1NUQVQgPSAxMjYsCisJUldTVEFULAorfTsKKworLyogbW9kZXMgKi8KK2VudW0geworCVY5RlNfT1JFQUQgPSAweDAwLAorCVY5RlNfT1dSSVRFID0gMHgwMSwKKwlWOUZTX09SRFdSID0gMHgwMiwKKwlWOUZTX09FWEVDID0gMHgwMywKKwlWOUZTX09FWENMID0gMHgwNCwKKwlWOUZTX09UUlVOQyA9IDB4MTAsCisJVjlGU19PUkVYRUMgPSAweDIwLAorCVY5RlNfT1JDTE9TRSA9IDB4NDAsCisJVjlGU19PQVBQRU5EID0gMHg4MCwKK307CisKKy8qIHBlcm1pc3Npb25zICovCitlbnVtIHsKKwlWOUZTX0RNRElSID0gMHg4MDAwMDAwMCwKKwlWOUZTX0RNQVBQRU5EID0gMHg0MDAwMDAwMCwKKwlWOUZTX0RNRVhDTCA9IDB4MjAwMDAwMDAsCisJVjlGU19ETU1PVU5UID0gMHgxMDAwMDAwMCwKKwlWOUZTX0RNQVVUSCA9IDB4MDgwMDAwMDAsCisJVjlGU19ETVRNUCA9IDB4MDQwMDAwMDAsCisJVjlGU19ETVNZTUxJTksgPSAweDAyMDAwMDAwLAorCVY5RlNfRE1MSU5LID0gMHgwMTAwMDAwMCwKKwkvKiA5UDIwMDAudSBleHRlbnNpb25zICovCisJVjlGU19ETURFVklDRSA9IDB4MDA4MDAwMDAsCisJVjlGU19ETU5BTUVEUElQRSA9IDB4MDAyMDAwMDAsCisJVjlGU19ETVNPQ0tFVCA9IDB4MDAxMDAwMDAsCisJVjlGU19ETVNFVFVJRCA9IDB4MDAwODAwMDAsCisJVjlGU19ETVNFVEdJRCA9IDB4MDAwNDAwMDAsCit9OworCisvKiBxaWQudHlwZXMgKi8KK2VudW0geworCVY5RlNfUVRESVIgPSAweDgwLAorCVY5RlNfUVRBUFBFTkQgPSAweDQwLAorCVY5RlNfUVRFWENMID0gMHgyMCwKKwlWOUZTX1FUTU9VTlQgPSAweDEwLAorCVY5RlNfUVRBVVRIID0gMHgwOCwKKwlWOUZTX1FUVE1QID0gMHgwNCwKKwlWOUZTX1FUU1lNTElOSyA9IDB4MDIsCisJVjlGU19RVExJTksgPSAweDAxLAorCVY5RlNfUVRGSUxFID0gMHgwMCwKK307CisKKy8qIGFtcGxlIHJvb20gZm9yIFR3cml0ZS9ScmVhZCBoZWFkZXIgKGlvdW5pdCkgKi8KKyNkZWZpbmUgVjlGU19JT0hEUlNaCTI0CisKKy8qIHFpZHMgYXJlIHRoZSB1bmlxdWUgSUQgZm9yIGEgZmlsZSAobGlrZSBhbiBpbm9kZSAqLworc3RydWN0IHY5ZnNfcWlkIHsKKwl1OCB0eXBlOworCXUzMiB2ZXJzaW9uOworCXU2NCBwYXRoOworfTsKKworLyogUGxhbiA5IGZpbGUgbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZSAqLworc3RydWN0IHY5ZnNfc3RhdCB7CisJdTE2IHNpemU7CisJdTE2IHR5cGU7CisJdTMyIGRldjsKKwlzdHJ1Y3Qgdjlmc19xaWQgcWlkOworCXUzMiBtb2RlOworCXUzMiBhdGltZTsKKwl1MzIgbXRpbWU7CisJdTY0IGxlbmd0aDsKKwljaGFyICpuYW1lOworCWNoYXIgKnVpZDsKKwljaGFyICpnaWQ7CisJY2hhciAqbXVpZDsKKwljaGFyICpleHRlbnNpb247CS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KKwl1MzIgbl91aWQ7CQkvKiA5cDIwMDAudSBleHRlbnNpb25zICovCisJdTMyIG5fZ2lkOwkJLyogOXAyMDAwLnUgZXh0ZW5zaW9ucyAqLworCXUzMiBuX211aWQ7CQkvKiA5cDIwMDAudSBleHRlbnNpb25zICovCisJY2hhciBkYXRhWzBdOworfTsKKworLyogU3RydWN0dXJlcyBmb3IgUHJvdG9jb2wgT3BlcmF0aW9ucyAqLworCitzdHJ1Y3QgVHZlcnNpb24geworCXUzMiBtc2l6ZTsKKwljaGFyICp2ZXJzaW9uOworfTsKKworc3RydWN0IFJ2ZXJzaW9uIHsKKwl1MzIgbXNpemU7CisJY2hhciAqdmVyc2lvbjsKK307CisKK3N0cnVjdCBUYXV0aCB7CisJdTMyIGFmaWQ7CisJY2hhciAqdW5hbWU7CisJY2hhciAqYW5hbWU7Cit9OworCitzdHJ1Y3QgUmF1dGggeworCXN0cnVjdCB2OWZzX3FpZCBxaWQ7Cit9OworCitzdHJ1Y3QgUmVycm9yIHsKKwljaGFyICplcnJvcjsKKwl1MzIgZXJybm87CQkvKiA5cDIwMDAudSBleHRlbnNpb24gKi8KK307CisKK3N0cnVjdCBUZmx1c2ggeworCXUzMiBvbGR0YWc7Cit9OworCitzdHJ1Y3QgUmZsdXNoIHsKK307CisKK3N0cnVjdCBUYXR0YWNoIHsKKwl1MzIgZmlkOworCXUzMiBhZmlkOworCWNoYXIgKnVuYW1lOworCWNoYXIgKmFuYW1lOworfTsKKworc3RydWN0IFJhdHRhY2ggeworCXN0cnVjdCB2OWZzX3FpZCBxaWQ7Cit9OworCitzdHJ1Y3QgVHdhbGsgeworCXUzMiBmaWQ7CisJdTMyIG5ld2ZpZDsKKwl1MzIgbnduYW1lOworCWNoYXIgKip3bmFtZXM7Cit9OworCitzdHJ1Y3QgUndhbGsgeworCXUzMiBud3FpZDsKKwlzdHJ1Y3Qgdjlmc19xaWQgKndxaWRzOworfTsKKworc3RydWN0IFRvcGVuIHsKKwl1MzIgZmlkOworCXU4IG1vZGU7Cit9OworCitzdHJ1Y3QgUm9wZW4geworCXN0cnVjdCB2OWZzX3FpZCBxaWQ7CisJdTMyIGlvdW5pdDsKK307CisKK3N0cnVjdCBUY3JlYXRlIHsKKwl1MzIgZmlkOworCWNoYXIgKm5hbWU7CisJdTMyIHBlcm07CisJdTggbW9kZTsKK307CisKK3N0cnVjdCBSY3JlYXRlIHsKKwlzdHJ1Y3Qgdjlmc19xaWQgcWlkOworCXUzMiBpb3VuaXQ7Cit9OworCitzdHJ1Y3QgVHJlYWQgeworCXUzMiBmaWQ7CisJdTY0IG9mZnNldDsKKwl1MzIgY291bnQ7Cit9OworCitzdHJ1Y3QgUnJlYWQgeworCXUzMiBjb3VudDsKKwl1OCAqZGF0YTsKK307CisKK3N0cnVjdCBUd3JpdGUgeworCXUzMiBmaWQ7CisJdTY0IG9mZnNldDsKKwl1MzIgY291bnQ7CisJdTggKmRhdGE7Cit9OworCitzdHJ1Y3QgUndyaXRlIHsKKwl1MzIgY291bnQ7Cit9OworCitzdHJ1Y3QgVGNsdW5rIHsKKwl1MzIgZmlkOworfTsKKworc3RydWN0IFJjbHVuayB7Cit9OworCitzdHJ1Y3QgVHJlbW92ZSB7CisJdTMyIGZpZDsKK307CisKK3N0cnVjdCBScmVtb3ZlIHsKK307CisKK3N0cnVjdCBUc3RhdCB7CisJdTMyIGZpZDsKK307CisKK3N0cnVjdCBSc3RhdCB7CisJc3RydWN0IHY5ZnNfc3RhdCAqc3RhdDsKK307CisKK3N0cnVjdCBUd3N0YXQgeworCXUzMiBmaWQ7CisJc3RydWN0IHY5ZnNfc3RhdCAqc3RhdDsKK307CisKK3N0cnVjdCBSd3N0YXQgeworfTsKKworLyoKKyAgKiBmY2FsbCBpcyB0aGUgcHJpbWFyeSBwYWNrZXQgc3RydWN0dXJlCisgICoKKyAgKi8KKworc3RydWN0IHY5ZnNfZmNhbGwgeworCXUzMiBzaXplOworCXU4IGlkOworCXUxNiB0YWc7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBUdmVyc2lvbiB0dmVyc2lvbjsKKwkJc3RydWN0IFJ2ZXJzaW9uIHJ2ZXJzaW9uOworCQlzdHJ1Y3QgVGF1dGggdGF1dGg7CisJCXN0cnVjdCBSYXV0aCByYXV0aDsKKwkJc3RydWN0IFJlcnJvciByZXJyb3I7CisJCXN0cnVjdCBUZmx1c2ggdGZsdXNoOworCQlzdHJ1Y3QgUmZsdXNoIHJmbHVzaDsKKwkJc3RydWN0IFRhdHRhY2ggdGF0dGFjaDsKKwkJc3RydWN0IFJhdHRhY2ggcmF0dGFjaDsKKwkJc3RydWN0IFR3YWxrIHR3YWxrOworCQlzdHJ1Y3QgUndhbGsgcndhbGs7CisJCXN0cnVjdCBUb3BlbiB0b3BlbjsKKwkJc3RydWN0IFJvcGVuIHJvcGVuOworCQlzdHJ1Y3QgVGNyZWF0ZSB0Y3JlYXRlOworCQlzdHJ1Y3QgUmNyZWF0ZSByY3JlYXRlOworCQlzdHJ1Y3QgVHJlYWQgdHJlYWQ7CisJCXN0cnVjdCBScmVhZCBycmVhZDsKKwkJc3RydWN0IFR3cml0ZSB0d3JpdGU7CisJCXN0cnVjdCBSd3JpdGUgcndyaXRlOworCQlzdHJ1Y3QgVGNsdW5rIHRjbHVuazsKKwkJc3RydWN0IFJjbHVuayByY2x1bms7CisJCXN0cnVjdCBUcmVtb3ZlIHRyZW1vdmU7CisJCXN0cnVjdCBScmVtb3ZlIHJyZW1vdmU7CisJCXN0cnVjdCBUc3RhdCB0c3RhdDsKKwkJc3RydWN0IFJzdGF0IHJzdGF0OworCQlzdHJ1Y3QgVHdzdGF0IHR3c3RhdDsKKwkJc3RydWN0IFJ3c3RhdCByd3N0YXQ7CisJfSBwYXJhbXM7Cit9OworCisjZGVmaW5lIEZDQUxMX0VSUk9SKGZjYWxsKSAoZmNhbGwgPyBmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJvciA6ICIiKQorCitpbnQgdjlmc190X3ZlcnNpb24oc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIG1zaXplLAorCQkgICBjaGFyICp2ZXJzaW9uLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF9hdHRhY2goc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgY2hhciAqdW5hbWUsIGNoYXIgKmFuYW1lLAorCQkgIHUzMiBmaWQsIHUzMiBhZmlkLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF9jbHVuayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCQkgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CisKK2ludCB2OWZzX3RfZmx1c2goc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTE2IG9sZHRhZyk7CisKK2ludCB2OWZzX3Rfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCQlzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF93c3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCQkgc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CisKK2ludCB2OWZzX3Rfd2FsayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCB1MzIgbmV3ZmlkLAorCQljaGFyICpuYW1lLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF9vcGVuKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHU4IG1vZGUsCisJCXN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X3JlbW92ZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLAorCQkgIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCitpbnQgdjlmc190X2NyZWF0ZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCBjaGFyICpuYW1lLAorCQkgIHUzMiBwZXJtLCB1OCBtb2RlLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKworaW50IHY5ZnNfdF9yZWFkKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCisJCXU2NCBvZmZzZXQsIHUzMiBjb3VudCwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CisKK2ludCB2OWZzX3Rfd3JpdGUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgdTY0IG9mZnNldCwKKwkJIHUzMiBjb3VudCwgdm9pZCAqZGF0YSwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CmRpZmYgLS1naXQgYS9mcy85cC9NYWtlZmlsZSBiL2ZzLzlwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTRmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACitvYmotJChDT05GSUdfOVBfRlMpIDo9IDlwMjAwMC5vCisKKzlwMjAwMC1vYmpzIDo9IFwKKwl2ZnNfc3VwZXIubyBcCisJdmZzX2lub2RlLm8gXAorCXZmc19maWxlLm8gXAorCXZmc19kaXIubyBcCisJdmZzX2RlbnRyeS5vIFwKKwllcnJvci5vIFwKKwltdXgubyBcCisJdHJhbnNfZmQubyBcCisJdHJhbnNfc29jay5vIFwKKwk5cC5vIFwKKwljb252Lm8gXAorCXY5ZnMubyBcCisJZmlkLm8KKwpkaWZmIC0tZ2l0IGEvZnMvOXAvY29udi5jIGIvZnMvOXAvY29udi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTQ3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9jb252LmMKQEAgLTAsMCArMSw2OTMgQEAKKy8qCisgKiBsaW51eC9mcy85cC9jb252LmMKKyAqCisgKiA5UCBwcm90b2NvbCBjb252ZXJzaW9uIGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgIjlwLmgiCisjaW5jbHVkZSAiY29udi5oIgorCisvKgorICogQnVmZmVyIHRvIGhlbHAgd2l0aCBzdHJpbmcgcGFyc2luZworICovCitzdHJ1Y3QgY2J1ZiB7CisJdW5zaWduZWQgY2hhciAqc3A7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyICplcDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfaW5pdChzdHJ1Y3QgY2J1ZiAqYnVmLCB2b2lkICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKwlidWYtPnNwID0gYnVmLT5wID0gZGF0YTsKKwlidWYtPmVwID0gZGF0YSArIGRhdGFsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ1Zl9jaGVja19vdmVyZmxvdyhzdHJ1Y3QgY2J1ZiAqYnVmKQoreworCXJldHVybiBidWYtPnAgPiBidWYtPmVwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmX2NoZWNrX3NpemUoc3RydWN0IGNidWYgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZiAoYnVmLT5wK2xlbiA+IGJ1Zi0+ZXApIHsKKwkJaWYgKGJ1Zi0+cCA8IGJ1Zi0+ZXApIHsKKwkJCWVwcmludGsoS0VSTl9FUlIsICJidWZmZXIgb3ZlcmZsb3dcbiIpOworCQkJYnVmLT5wID0gYnVmLT5lcCArIDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYnVmX2FsbG9jKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCit7CisJdm9pZCAqcmV0ID0gTlVMTDsKKworCWJ1Zl9jaGVja19zaXplKGJ1ZiwgbGVuKTsKKwlyZXQgPSBidWYtPnA7CisJYnVmLT5wICs9IGxlbjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDgoc3RydWN0IGNidWYgKmJ1ZiwgdTggdmFsKQoreworCWJ1Zl9jaGVja19zaXplKGJ1ZiwgMSk7CisKKwlidWYtPnBbMF0gPSB2YWw7CisJYnVmLT5wKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDE2KHN0cnVjdCBjYnVmICpidWYsIHUxNiB2YWwpCit7CisJYnVmX2NoZWNrX3NpemUoYnVmLCAyKTsKKworCSooX19sZTE2ICopIGJ1Zi0+cCA9IGNwdV90b19sZTE2KHZhbCk7CisJYnVmLT5wICs9IDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDMyKHN0cnVjdCBjYnVmICpidWYsIHUzMiB2YWwpCit7CisJYnVmX2NoZWNrX3NpemUoYnVmLCA0KTsKKworCSooX19sZTMyICopYnVmLT5wID0gY3B1X3RvX2xlMzIodmFsKTsKKwlidWYtPnAgKz0gNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfaW50NjQoc3RydWN0IGNidWYgKmJ1ZiwgdTY0IHZhbCkKK3sKKwlidWZfY2hlY2tfc2l6ZShidWYsIDgpOworCisJKihfX2xlNjQgKilidWYtPnAgPSBjcHVfdG9fbGU2NCh2YWwpOworCWJ1Zi0+cCArPSA4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9zdHJpbmduKHN0cnVjdCBjYnVmICpidWYsIGNvbnN0IGNoYXIgKnMsIHUxNiBzbGVuKQoreworCWJ1Zl9jaGVja19zaXplKGJ1Ziwgc2xlbiArIDIpOworCisJYnVmX3B1dF9pbnQxNihidWYsIHNsZW4pOworCW1lbWNweShidWYtPnAsIHMsIHNsZW4pOworCWJ1Zi0+cCArPSBzbGVuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9zdHJpbmcoc3RydWN0IGNidWYgKmJ1ZiwgY29uc3QgY2hhciAqcykKK3sKKwlidWZfcHV0X3N0cmluZ24oYnVmLCBzLCBzdHJsZW4ocykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9kYXRhKHN0cnVjdCBjYnVmICpidWYsIHZvaWQgKmRhdGEsIHUzMiBkYXRhbGVuKQoreworCWJ1Zl9jaGVja19zaXplKGJ1ZiwgZGF0YWxlbik7CisKKwltZW1jcHkoYnVmLT5wLCBkYXRhLCBkYXRhbGVuKTsKKwlidWYtPnAgKz0gZGF0YWxlbjsKK30KKworc3RhdGljIGlubGluZSB1OCBidWZfZ2V0X2ludDgoc3RydWN0IGNidWYgKmJ1ZikKK3sKKwl1OCByZXQgPSAwOworCisJYnVmX2NoZWNrX3NpemUoYnVmLCAxKTsKKwlyZXQgPSBidWYtPnBbMF07CisKKwlidWYtPnArKzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGJ1Zl9nZXRfaW50MTYoc3RydWN0IGNidWYgKmJ1ZikKK3sKKwl1MTYgcmV0ID0gMDsKKworCWJ1Zl9jaGVja19zaXplKGJ1ZiwgMik7CisJcmV0ID0gbGUxNl90b19jcHUoKihfX2xlMTYgKilidWYtPnApOworCisJYnVmLT5wICs9IDI7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBidWZfZ2V0X2ludDMyKHN0cnVjdCBjYnVmICpidWYpCit7CisJdTMyIHJldCA9IDA7CisKKwlidWZfY2hlY2tfc2l6ZShidWYsIDQpOworCXJldCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopYnVmLT5wKTsKKworCWJ1Zi0+cCArPSA0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1NjQgYnVmX2dldF9pbnQ2NChzdHJ1Y3QgY2J1ZiAqYnVmKQoreworCXU2NCByZXQgPSAwOworCisJYnVmX2NoZWNrX3NpemUoYnVmLCA4KTsKKwlyZXQgPSBsZTY0X3RvX2NwdSgqKF9fbGU2NCAqKWJ1Zi0+cCk7CisKKwlidWYtPnAgKz0gODsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitidWZfZ2V0X3N0cmluZyhzdHJ1Y3QgY2J1ZiAqYnVmLCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKworCXUxNiBsZW4gPSBidWZfZ2V0X2ludDE2KGJ1Zik7CisJYnVmX2NoZWNrX3NpemUoYnVmLCBsZW4pOworCWlmIChsZW4gKyAxID4gZGF0YWxlbikKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoZGF0YSwgYnVmLT5wLCBsZW4pOworCWRhdGFbbGVuXSA9IDA7CisJYnVmLT5wICs9IGxlbjsKKworCXJldHVybiBsZW4gKyAxOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmJ1Zl9nZXRfc3RyaW5nYihzdHJ1Y3QgY2J1ZiAqYnVmLCBzdHJ1Y3QgY2J1ZiAqc2J1ZikKK3sKKwljaGFyICpyZXQgPSBOVUxMOworCWludCBuID0gYnVmX2dldF9zdHJpbmcoYnVmLCBzYnVmLT5wLCBzYnVmLT5lcCAtIHNidWYtPnApOworCisJaWYgKG4gPiAwKSB7CisJCXJldCA9IHNidWYtPnA7CisJCXNidWYtPnAgKz0gbjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBidWZfZ2V0X2RhdGEoc3RydWN0IGNidWYgKmJ1Ziwgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4pCit7CisJYnVmX2NoZWNrX3NpemUoYnVmLCBkYXRhbGVuKTsKKworCW1lbWNweShkYXRhLCBidWYtPnAsIGRhdGFsZW4pOworCWJ1Zi0+cCArPSBkYXRhbGVuOworCisJcmV0dXJuIGRhdGFsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYnVmX2dldF9kYXRhYihzdHJ1Y3QgY2J1ZiAqYnVmLCBzdHJ1Y3QgY2J1ZiAqZGJ1ZiwKKwkJCQkgIGludCBkYXRhbGVuKQoreworCWNoYXIgKnJldCA9IE5VTEw7CisJaW50IG4gPSAwOworCisJYnVmX2NoZWNrX3NpemUoZGJ1ZiwgZGF0YWxlbik7CisKKwluID0gYnVmX2dldF9kYXRhKGJ1ZiwgZGJ1Zi0+cCwgZGF0YWxlbik7CisKKwlpZiAobiA+IDApIHsKKwkJcmV0ID0gZGJ1Zi0+cDsKKwkJZGJ1Zi0+cCArPSBuOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19zaXplX3N0YXQgLSBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSB2YXJpYWJsZSBsZW5ndGggc3RhdCBzdHJ1Y3QKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQHN0YXQ6IG1ldGFkYXRhIChzdGF0KSBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3NpemVfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLAorCQkJICBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0KQoreworCWludCBzaXplID0gMDsKKworCWlmIChzdGF0ID09IE5VTEwpIHsKKwkJZXByaW50ayhLRVJOX0VSUiwgInY5ZnNfc2l6ZV9zdGF0OiBnb3QgYSBOVUxMIHN0YXQgcG9pbnRlclxuIik7CisJCXJldHVybiAwOworCX0KKworCXNpemUgPQkJCS8qIDIgKyAqLy8qIHNpemVbMl0gKi8KKwkgICAgMiArCQkJLyogdHlwZVsyXSAqLworCSAgICA0ICsJCQkvKiBkZXZbNF0gKi8KKwkgICAgMSArCQkJLyogcWlkLnR5cGVbMV0gKi8KKwkgICAgNCArCQkJLyogcWlkLnZlcnNbNF0gKi8KKwkgICAgOCArCQkJLyogcWlkLnBhdGhbOF0gKi8KKwkgICAgNCArCQkJLyogbW9kZVs0XSAqLworCSAgICA0ICsJCQkvKiBhdGltZVs0XSAqLworCSAgICA0ICsJCQkvKiBtdGltZVs0XSAqLworCSAgICA4ICsJCQkvKiBsZW5ndGhbOF0gKi8KKwkgICAgODsJCQkvKiBtaW5pbXVtIHN1bSBvZiBzdHJpbmcgbGVuZ3RocyAqLworCisJaWYgKHN0YXQtPm5hbWUpCisJCXNpemUgKz0gc3RybGVuKHN0YXQtPm5hbWUpOworCWlmIChzdGF0LT51aWQpCisJCXNpemUgKz0gc3RybGVuKHN0YXQtPnVpZCk7CisJaWYgKHN0YXQtPmdpZCkKKwkJc2l6ZSArPSBzdHJsZW4oc3RhdC0+Z2lkKTsKKwlpZiAoc3RhdC0+bXVpZCkKKwkJc2l6ZSArPSBzdHJsZW4oc3RhdC0+bXVpZCk7CisKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCXNpemUgKz0gNCArCS8qIG5fdWlkWzRdICovCisJCSAgICA0ICsJCS8qIG5fZ2lkWzRdICovCisJCSAgICA0ICsJCS8qIG5fbXVpZFs0XSAqLworCQkgICAgMjsJCS8qIHN0cmluZyBsZW5ndGggb2YgZXh0ZW5zaW9uWzRdICovCisJCWlmIChzdGF0LT5leHRlbnNpb24pCisJCQlzaXplICs9IHN0cmxlbihzdGF0LT5leHRlbnNpb24pOworCX0KKworCXJldHVybiBzaXplOworfQorCisvKioKKyAqIHNlcmlhbGl6ZV9zdGF0IC0gc2FmZWx5IGZvcm1hdCBhIHN0YXQgc3RydWN0dXJlIGZvciB0cmFuc21pc3Npb24KKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvCisgKiBAc3RhdDogbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZQorICogQGJ1ZnA6IGJ1ZmZlciB0byBzZXJpYWxpemUgc3RydWN0dXJlIGludG8KKyAqCisgKi8KKworc3RhdGljIGludAorc2VyaWFsaXplX3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCwKKwkgICAgICAgc3RydWN0IGNidWYgKmJ1ZnApCit7CisJYnVmX3B1dF9pbnQxNihidWZwLCBzdGF0LT5zaXplKTsKKwlidWZfcHV0X2ludDE2KGJ1ZnAsIHN0YXQtPnR5cGUpOworCWJ1Zl9wdXRfaW50MzIoYnVmcCwgc3RhdC0+ZGV2KTsKKwlidWZfcHV0X2ludDgoYnVmcCwgc3RhdC0+cWlkLnR5cGUpOworCWJ1Zl9wdXRfaW50MzIoYnVmcCwgc3RhdC0+cWlkLnZlcnNpb24pOworCWJ1Zl9wdXRfaW50NjQoYnVmcCwgc3RhdC0+cWlkLnBhdGgpOworCWJ1Zl9wdXRfaW50MzIoYnVmcCwgc3RhdC0+bW9kZSk7CisJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5hdGltZSk7CisJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5tdGltZSk7CisJYnVmX3B1dF9pbnQ2NChidWZwLCBzdGF0LT5sZW5ndGgpOworCisJYnVmX3B1dF9zdHJpbmcoYnVmcCwgc3RhdC0+bmFtZSk7CisJYnVmX3B1dF9zdHJpbmcoYnVmcCwgc3RhdC0+dWlkKTsKKwlidWZfcHV0X3N0cmluZyhidWZwLCBzdGF0LT5naWQpOworCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIHN0YXQtPm11aWQpOworCisJaWYgKHY5c2VzLT5leHRlbmRlZCkgeworCQlidWZfcHV0X3N0cmluZyhidWZwLCBzdGF0LT5leHRlbnNpb24pOworCQlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPm5fdWlkKTsKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5uX2dpZCk7CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgc3RhdC0+bl9tdWlkKTsKKwl9CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzdGF0LT5zaXplOworfQorCisvKioKKyAqIGRlc2VyaWFsaXplX3N0YXQgLSBzYWZlbHkgZGVjb2RlIGEgcmVjaWV2ZWQgbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZQorICogQHY5c2VzOiBzZXNzaW9uIGluZm8KKyAqIEBidWZwOiBidWZmZXIgdG8gZGVzZXJpYWxpemUKKyAqIEBzdGF0OiBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlCisgKiBAZGJ1ZnA6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZSB2YXJpYWJsZSBzdHJpbmdzIGludG8KKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQKK2Rlc2VyaWFsaXplX3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IGNidWYgKmJ1ZnAsCisJCSBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3QgY2J1ZiAqZGJ1ZnApCit7CisKKwlzdGF0LT5zaXplID0gYnVmX2dldF9pbnQxNihidWZwKTsKKwlzdGF0LT50eXBlID0gYnVmX2dldF9pbnQxNihidWZwKTsKKwlzdGF0LT5kZXYgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCXN0YXQtPnFpZC50eXBlID0gYnVmX2dldF9pbnQ4KGJ1ZnApOworCXN0YXQtPnFpZC52ZXJzaW9uID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwlzdGF0LT5xaWQucGF0aCA9IGJ1Zl9nZXRfaW50NjQoYnVmcCk7CisJc3RhdC0+bW9kZSA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJc3RhdC0+YXRpbWUgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCXN0YXQtPm10aW1lID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwlzdGF0LT5sZW5ndGggPSBidWZfZ2V0X2ludDY0KGJ1ZnApOworCXN0YXQtPm5hbWUgPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCXN0YXQtPnVpZCA9IGJ1Zl9nZXRfc3RyaW5nYihidWZwLCBkYnVmcCk7CisJc3RhdC0+Z2lkID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKKwlzdGF0LT5tdWlkID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKKworCWlmICh2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJc3RhdC0+ZXh0ZW5zaW9uID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKKwkJc3RhdC0+bl91aWQgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCQlzdGF0LT5uX2dpZCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCXN0YXQtPm5fbXVpZCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJfQorCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSB8fCBidWZfY2hlY2tfb3ZlcmZsb3coZGJ1ZnApKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzdGF0LT5zaXplICsgMjsKK30KKworLyoqCisgKiBkZXNlcmlhbGl6ZV9zdGF0YiAtIHdyYXBwZXIgZm9yIGRlY29kaW5nIGEgcmVjZWl2ZWQgbWV0YWRhdGEgc3RydWN0dXJlCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mbworICogQGJ1ZnA6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZQorICogQGRidWZwOiBidWZmZXIgdG8gZGVzZXJpYWxpemUgdmFyaWFibGUgc3RyaW5ncyBpbnRvCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHY5ZnNfc3RhdCAqZGVzZXJpYWxpemVfc3RhdGIoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvCisJCQkJCQkgICp2OXNlcywgc3RydWN0IGNidWYgKmJ1ZnAsCisJCQkJCQkgIHN0cnVjdCBjYnVmICpkYnVmcCkKK3sKKwlzdHJ1Y3Qgdjlmc19zdGF0ICpyZXQgPSBidWZfYWxsb2MoZGJ1ZnAsIHNpemVvZihzdHJ1Y3Qgdjlmc19zdGF0KSk7CisKKwlpZiAocmV0KSB7CisJCWludCBuID0gZGVzZXJpYWxpemVfc3RhdCh2OXNlcywgYnVmcCwgcmV0LCBkYnVmcCk7CisJCWlmIChuIDw9IDApCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHY5ZnNfZGVzZXJpYWxpemVfc3RhdCAtIGRlY29kZSBhIHJlY2VpdmVkIG1ldGFkYXRhIHN0cnVjdHVyZQorICogQHY5c2VzOiBzZXNzaW9uIGluZm8KKyAqIEBidWY6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZQorICogQGJ1ZmxlbjogbGVuZ3RoIG9mIHJlY2VpdmVkIGJ1ZmZlcgorICogQHN0YXQ6IG1ldGFkYXRhIHN0cnVjdHVyZSB0byBkZWNvZGUgaW50bworICogQHN0YXRsZW46IGxlbmd0aCBvZiBkZXN0aW5hdGlvbiBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKi8KKworaW50Cit2OWZzX2Rlc2VyaWFsaXplX3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdm9pZCAqYnVmLAorCQkgICAgICB1MzIgYnVmbGVuLCBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCB1MzIgc3RhdGxlbikKK3sKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCXN0cnVjdCBjYnVmIGRidWZmZXI7CisJc3RydWN0IGNidWYgKmRidWZwID0gJmRidWZmZXI7CisKKwlidWZfaW5pdChidWZwLCBidWYsIGJ1Zmxlbik7CisJYnVmX2luaXQoZGJ1ZnAsIChjaGFyICopc3RhdCArIHNpemVvZihzdHJ1Y3Qgdjlmc19zdGF0KSwKKwkJIHN0YXRsZW4gLSBzaXplb2Yoc3RydWN0IHY5ZnNfc3RhdCkpOworCisJcmV0dXJuIGRlc2VyaWFsaXplX3N0YXQodjlzZXMsIGJ1ZnAsIHN0YXQsIGRidWZwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3Y5ZnNfc2l6ZV9mY2FsbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwpCit7CisJaW50IHNpemUgPSA0ICsgMSArIDI7CS8qIHNpemVbNF0gbXNnWzFdIHRhZ1syXSAqLworCWludCBpID0gMDsKKworCXN3aXRjaCAoZmNhbGwtPmlkKSB7CisJZGVmYXVsdDoKKwkJZXByaW50ayhLRVJOX0VSUiwgImJhZCBtc2cgdHlwZSAlZFxuIiwgZmNhbGwtPmlkKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBUVkVSU0lPTjoJCS8qIG1zaXplWzRdIHZlcnNpb25bc10gKi8KKwkJc2l6ZSArPSA0ICsgMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnR2ZXJzaW9uLnZlcnNpb24pOworCQlicmVhazsKKwljYXNlIFRBVVRIOgkJLyogYWZpZFs0XSB1bmFtZVtzXSBhbmFtZVtzXSAqLworCQlzaXplICs9IDQgKyAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudGF1dGgudW5hbWUpICsKKwkJICAgIDIgKyBzdHJsZW4oZmNhbGwtPnBhcmFtcy50YXV0aC5hbmFtZSk7CisJCWJyZWFrOworCWNhc2UgVEZMVVNIOgkJLyogb2xkdGFnWzJdICovCisJCXNpemUgKz0gMjsKKwkJYnJlYWs7CisJY2FzZSBUQVRUQUNIOgkJLyogZmlkWzRdIGFmaWRbNF0gdW5hbWVbc10gYW5hbWVbc10gKi8KKwkJc2l6ZSArPSA0ICsgNCArIDIgKyBzdHJsZW4oZmNhbGwtPnBhcmFtcy50YXR0YWNoLnVuYW1lKSArCisJCSAgICAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudGF0dGFjaC5hbmFtZSk7CisJCWJyZWFrOworCWNhc2UgVFdBTEs6CQkvKiBmaWRbNF0gbmV3ZmlkWzRdIG53bmFtZVsyXSBud25hbWUqKHduYW1lW3NdKSAqLworCQlzaXplICs9IDQgKyA0ICsgMjsKKwkJLyogbm93IGNvbXB1dGUgdG90YWwgZm9yIHRoZSBhcnJheSBvZiBuYW1lcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZmNhbGwtPnBhcmFtcy50d2Fsay5ud25hbWU7IGkrKykKKwkJCXNpemUgKz0gMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnR3YWxrLnduYW1lc1tpXSk7CisJCWJyZWFrOworCWNhc2UgVE9QRU46CQkvKiBmaWRbNF0gbW9kZVsxXSAqLworCQlzaXplICs9IDQgKyAxOworCQlicmVhazsKKwljYXNlIFRDUkVBVEU6CQkvKiBmaWRbNF0gbmFtZVtzXSBwZXJtWzRdIG1vZGVbMV0gKi8KKwkJc2l6ZSArPSA0ICsgMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnRjcmVhdGUubmFtZSkgKyA0ICsgMTsKKwkJYnJlYWs7CisJY2FzZSBUUkVBRDoJCS8qIGZpZFs0XSBvZmZzZXRbOF0gY291bnRbNF0gKi8KKwkJc2l6ZSArPSA0ICsgOCArIDQ7CisJCWJyZWFrOworCWNhc2UgVFdSSVRFOgkJLyogZmlkWzRdIG9mZnNldFs4XSBjb3VudFs0XSBkYXRhW2NvdW50XSAqLworCQlzaXplICs9IDQgKyA4ICsgNCArIGZjYWxsLT5wYXJhbXMudHdyaXRlLmNvdW50OworCQlicmVhazsKKwljYXNlIFRDTFVOSzoJCS8qIGZpZFs0XSAqLworCQlzaXplICs9IDQ7CisJCWJyZWFrOworCWNhc2UgVFJFTU9WRToJCS8qIGZpZFs0XSAqLworCQlzaXplICs9IDQ7CisJCWJyZWFrOworCWNhc2UgVFNUQVQ6CQkvKiBmaWRbNF0gKi8KKwkJc2l6ZSArPSA0OworCQlicmVhazsKKwljYXNlIFRXU1RBVDoJCS8qIGZpZFs0XSBzdGF0W25dICovCisJCWZjYWxsLT5wYXJhbXMudHdzdGF0LnN0YXQtPnNpemUgPQorCQkgICAgdjlmc19zaXplX3N0YXQodjlzZXMsIGZjYWxsLT5wYXJhbXMudHdzdGF0LnN0YXQpOworCQlzaXplICs9IDQgKyAyICsgMiArIGZjYWxsLT5wYXJhbXMudHdzdGF0LnN0YXQtPnNpemU7CisJfQorCXJldHVybiBzaXplOworfQorCisvKgorICogdjlmc19zZXJpYWxpemVfZmNhbGwgLSBtYXJzaGFsbCBmY2FsbCBzdHJ1Y3QgaW50byBhIHBhY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZmNhbGw6IHN0cnVjdHVyZSB0byBjb252ZXJ0CisgKiBAZGF0YTogYnVmZmVyIHRvIHNlcmlhbGl6ZSBmY2FsbCBpbnRvCisgKiBAZGF0YWxlbjogbGVuZ3RoIG9mIGJ1ZmZlciB0byBzZXJpYWxpemUgZmNhbGwgaW50bworICoKKyAqLworCitpbnQKK3Y5ZnNfc2VyaWFsaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCwKKwkJICAgICB2b2lkICpkYXRhLCB1MzIgZGF0YWxlbikKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCA9IE5VTEw7CisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKworCWJ1Zl9pbml0KGJ1ZnAsIGRhdGEsIGRhdGFsZW4pOworCisJaWYgKCFmY2FsbCkgeworCQllcHJpbnRrKEtFUk5fRVJSLCAibm8gZmNhbGxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmY2FsbC0+c2l6ZSA9IHY5ZnNfc2l6ZV9mY2FsbCh2OXNlcywgZmNhbGwpOworCisJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+c2l6ZSk7CisJYnVmX3B1dF9pbnQ4KGJ1ZnAsIGZjYWxsLT5pZCk7CisJYnVmX3B1dF9pbnQxNihidWZwLCBmY2FsbC0+dGFnKTsKKworCWRwcmludGsoREVCVUdfQ09OViwgInNpemUgJWQgaWQgJWQgdGFnICVkXG4iLCBmY2FsbC0+c2l6ZSwgZmNhbGwtPmlkLAorCQlmY2FsbC0+dGFnKTsKKworCS8qIG5vdyBlbmNvZGUgaXQgKi8KKwlzd2l0Y2ggKGZjYWxsLT5pZCkgeworCWRlZmF1bHQ6CisJCWVwcmludGsoS0VSTl9FUlIsICJiYWQgbXNnIHR5cGU6ICVkXG4iLCBmY2FsbC0+aWQpOworCQlyZXR1cm4gLUVQUk9UTzsKKwljYXNlIFRWRVJTSU9OOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHZlcnNpb24ubXNpemUpOworCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnR2ZXJzaW9uLnZlcnNpb24pOworCQlicmVhazsKKwljYXNlIFRBVVRIOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGF1dGguYWZpZCk7CisJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGF1dGgudW5hbWUpOworCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnRhdXRoLmFuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBURkxVU0g6CisJCWJ1Zl9wdXRfaW50MTYoYnVmcCwgZmNhbGwtPnBhcmFtcy50Zmx1c2gub2xkdGFnKTsKKwkJYnJlYWs7CisJY2FzZSBUQVRUQUNIOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGF0dGFjaC5maWQpOworCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGF0dGFjaC5hZmlkKTsKKwkJYnVmX3B1dF9zdHJpbmcoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXR0YWNoLnVuYW1lKTsKKwkJYnVmX3B1dF9zdHJpbmcoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXR0YWNoLmFuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBUV0FMSzoKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnR3YWxrLmZpZCk7CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50d2Fsay5uZXdmaWQpOworCQlidWZfcHV0X2ludDE2KGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdhbGsubnduYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IGZjYWxsLT5wYXJhbXMudHdhbGsubnduYW1lOyBpKyspCisJCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnR3YWxrLnduYW1lc1tpXSk7CisJCWJyZWFrOworCWNhc2UgVE9QRU46CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50b3Blbi5maWQpOworCQlidWZfcHV0X2ludDgoYnVmcCwgZmNhbGwtPnBhcmFtcy50b3Blbi5tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBUQ1JFQVRFOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGNyZWF0ZS5maWQpOworCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnRjcmVhdGUubmFtZSk7CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50Y3JlYXRlLnBlcm0pOworCQlidWZfcHV0X2ludDgoYnVmcCwgZmNhbGwtPnBhcmFtcy50Y3JlYXRlLm1vZGUpOworCQlicmVhazsKKwljYXNlIFRSRUFEOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHJlYWQuZmlkKTsKKwkJYnVmX3B1dF9pbnQ2NChidWZwLCBmY2FsbC0+cGFyYW1zLnRyZWFkLm9mZnNldCk7CisJCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50cmVhZC5jb3VudCk7CisJCWJyZWFrOworCWNhc2UgVFdSSVRFOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdyaXRlLmZpZCk7CisJCWJ1Zl9wdXRfaW50NjQoYnVmcCwgZmNhbGwtPnBhcmFtcy50d3JpdGUub2Zmc2V0KTsKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnR3cml0ZS5jb3VudCk7CisJCWJ1Zl9wdXRfZGF0YShidWZwLCBmY2FsbC0+cGFyYW1zLnR3cml0ZS5kYXRhLAorCQkJICAgICBmY2FsbC0+cGFyYW1zLnR3cml0ZS5jb3VudCk7CisJCWJyZWFrOworCWNhc2UgVENMVU5LOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGNsdW5rLmZpZCk7CisJCWJyZWFrOworCWNhc2UgVFJFTU9WRToKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRyZW1vdmUuZmlkKTsKKwkJYnJlYWs7CisJY2FzZSBUU1RBVDoKKwkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRzdGF0LmZpZCk7CisJCWJyZWFrOworCWNhc2UgVFdTVEFUOgorCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdzdGF0LmZpZCk7CisJCXN0YXQgPSBmY2FsbC0+cGFyYW1zLnR3c3RhdC5zdGF0OworCisJCWJ1Zl9wdXRfaW50MTYoYnVmcCwgc3RhdC0+c2l6ZSArIDIpOworCQlzZXJpYWxpemVfc3RhdCh2OXNlcywgc3RhdCwgYnVmcCk7CisJCWJyZWFrOworCX0KKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGZjYWxsLT5zaXplOworfQorCisvKioKKyAqIGRlc2VyaWFsaXplX2ZjYWxsIC0gdW5tYXJzaGFsIGEgcmVzcG9uc2UKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQG1zZ3NpemU6IHNpemUgb2YgcmNhbGwgbWVzc2FnZQorICogQGJ1ZjogcmVjaWV2ZWQgYnVmZmVyCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgcmVjZWl2ZWQgYnVmZmVyCisgKiBAcmNhbGw6IGZjYWxsIHN0cnVjdHVyZSB0byBwb3B1bGF0ZQorICogQHJjYWxsbGVuOiBsZW5ndGggb2YgZmNhbGwgc3RydWN0dXJlIHRvIHBvcHVsYXRlCisgKgorICovCisKK2ludAordjlmc19kZXNlcmlhbGl6ZV9mY2FsbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgbXNnc2l6ZSwKKwkJICAgICAgIHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbiwgc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsLAorCQkgICAgICAgaW50IHJjYWxsbGVuKQoreworCisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiBkYnVmZmVyOworCXN0cnVjdCBjYnVmICpkYnVmcCA9ICZkYnVmZmVyOworCWludCBpID0gMDsKKworCWJ1Zl9pbml0KGJ1ZnAsIGJ1ZiwgYnVmbGVuKTsKKwlidWZfaW5pdChkYnVmcCwgKGNoYXIgKilyY2FsbCArIHNpemVvZihzdHJ1Y3Qgdjlmc19mY2FsbCksCisJCSByY2FsbGxlbiAtIHNpemVvZihzdHJ1Y3Qgdjlmc19mY2FsbCkpOworCisJcmNhbGwtPnNpemUgPSBtc2dzaXplOworCXJjYWxsLT5pZCA9IGJ1Zl9nZXRfaW50OChidWZwKTsKKwlyY2FsbC0+dGFnID0gYnVmX2dldF9pbnQxNihidWZwKTsKKworCWRwcmludGsoREVCVUdfQ09OViwgInNpemUgJWQgaWQgJWQgdGFnICVkXG4iLCByY2FsbC0+c2l6ZSwgcmNhbGwtPmlkLAorCQlyY2FsbC0+dGFnKTsKKwlzd2l0Y2ggKHJjYWxsLT5pZCkgeworCWRlZmF1bHQ6CisJCWVwcmludGsoS0VSTl9FUlIsICJ1bmtub3duIG1lc3NhZ2UgdHlwZTogJWRcbiIsIHJjYWxsLT5pZCk7CisJCXJldHVybiAtRVBST1RPOworCWNhc2UgUlZFUlNJT046CisJCXJjYWxsLT5wYXJhbXMucnZlcnNpb24ubXNpemUgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJ2ZXJzaW9uLnZlcnNpb24gPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCQlicmVhazsKKwljYXNlIFJGTFVTSDoKKwkJYnJlYWs7CisJY2FzZSBSQVRUQUNIOgorCQlyY2FsbC0+cGFyYW1zLnJhdHRhY2gucWlkLnR5cGUgPSBidWZfZ2V0X2ludDgoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucmF0dGFjaC5xaWQudmVyc2lvbiA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucmF0dGFjaC5xaWQucGF0aCA9IGJ1Zl9nZXRfaW50NjQoYnVmcCk7CisJCWJyZWFrOworCWNhc2UgUldBTEs6CisJCXJjYWxsLT5wYXJhbXMucndhbGsubndxaWQgPSBidWZfZ2V0X2ludDE2KGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJ3YWxrLndxaWRzID0gYnVmX2FsbG9jKGJ1ZnAsCisJCSAgICAgIHJjYWxsLT5wYXJhbXMucndhbGsubndxaWQgKiBzaXplb2Yoc3RydWN0IHY5ZnNfcWlkKSk7CisJCWlmIChyY2FsbC0+cGFyYW1zLnJ3YWxrLndxaWRzKQorCQkJZm9yIChpID0gMDsgaSA8IHJjYWxsLT5wYXJhbXMucndhbGsubndxaWQ7IGkrKykgeworCQkJCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHNbaV0udHlwZSA9CisJCQkJICAgIGJ1Zl9nZXRfaW50OChidWZwKTsKKwkJCQlyY2FsbC0+cGFyYW1zLnJ3YWxrLndxaWRzW2ldLnZlcnNpb24gPQorCQkJCSAgICBidWZfZ2V0X2ludDE2KGJ1ZnApOworCQkJCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHNbaV0ucGF0aCA9CisJCQkJICAgIGJ1Zl9nZXRfaW50NjQoYnVmcCk7CisJCQl9CisJCWJyZWFrOworCWNhc2UgUk9QRU46CisJCXJjYWxsLT5wYXJhbXMucm9wZW4ucWlkLnR5cGUgPSBidWZfZ2V0X2ludDgoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucm9wZW4ucWlkLnZlcnNpb24gPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJvcGVuLnFpZC5wYXRoID0gYnVmX2dldF9pbnQ2NChidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yb3Blbi5pb3VuaXQgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCQlicmVhazsKKwljYXNlIFJDUkVBVEU6CisJCXJjYWxsLT5wYXJhbXMucmNyZWF0ZS5xaWQudHlwZSA9IGJ1Zl9nZXRfaW50OChidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yY3JlYXRlLnFpZC52ZXJzaW9uID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yY3JlYXRlLnFpZC5wYXRoID0gYnVmX2dldF9pbnQ2NChidWZwKTsKKwkJcmNhbGwtPnBhcmFtcy5yY3JlYXRlLmlvdW5pdCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCWJyZWFrOworCWNhc2UgUlJFQUQ6CisJCXJjYWxsLT5wYXJhbXMucnJlYWQuY291bnQgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOworCQlyY2FsbC0+cGFyYW1zLnJyZWFkLmRhdGEgPSBidWZfZ2V0X2RhdGFiKGJ1ZnAsIGRidWZwLAorCQkJcmNhbGwtPnBhcmFtcy5ycmVhZC5jb3VudCk7CisJCWJyZWFrOworCWNhc2UgUldSSVRFOgorCQlyY2FsbC0+cGFyYW1zLnJ3cml0ZS5jb3VudCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CisJCWJyZWFrOworCWNhc2UgUkNMVU5LOgorCQlicmVhazsKKwljYXNlIFJSRU1PVkU6CisJCWJyZWFrOworCWNhc2UgUlNUQVQ6CisJCWJ1Zl9nZXRfaW50MTYoYnVmcCk7CisJCXJjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCA9CisJCSAgICBkZXNlcmlhbGl6ZV9zdGF0Yih2OXNlcywgYnVmcCwgZGJ1ZnApOworCQlicmVhazsKKwljYXNlIFJXU1RBVDoKKwkJYnJlYWs7CisJY2FzZSBSRVJST1I6CisJCXJjYWxsLT5wYXJhbXMucmVycm9yLmVycm9yID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKKwkJaWYgKHY5c2VzLT5leHRlbmRlZCkKKwkJCXJjYWxsLT5wYXJhbXMucmVycm9yLmVycm5vID0gYnVmX2dldF9pbnQxNihidWZwKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSB8fCBidWZfY2hlY2tfb3ZlcmZsb3coZGJ1ZnApKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByY2FsbC0+c2l6ZTsKK30KZGlmZiAtLWdpdCBhL2ZzLzlwL2NvbnYuaCBiL2ZzLzlwL2NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg0OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvY29udi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBsaW51eC9mcy85cC9jb252LmgKKyAqCisgKiA5UCBwcm90b2NvbCBjb252ZXJzaW9uIGRlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCitpbnQgdjlmc19kZXNlcmlhbGl6ZV9zdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqLCB2b2lkICpidWYsCisJCQkgIHUzMiBidWZsZW4sIHN0cnVjdCB2OWZzX3N0YXQgKnN0YXQsIHUzMiBzdGF0bGVuKTsKK2ludCB2OWZzX3NlcmlhbGl6ZV9mY2FsbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgc3RydWN0IHY5ZnNfZmNhbGwgKnRjYWxsLAorCQkJIHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbik7CitpbnQgdjlmc19kZXNlcmlhbGl6ZV9mY2FsbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgdTMyIG1zZ2xlbiwKKwkJCSAgIHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbiwgc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsLAorCQkJICAgaW50IHJjYWxsbGVuKTsKKworLyogdGhpcyBvbmUgaXMgYWN0dWFsbHkgaW4gZXJyb3IuYyByaWdodCBub3cgKi8KK2ludCB2OWZzX2VycnN0cjJlcnJubyhjaGFyICplcnJzdHIpOwpkaWZmIC0tZ2l0IGEvZnMvOXAvZGVidWcuaCBiL2ZzLzlwL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0NWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2RlYnVnLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBsaW51eC9mcy85cC9kZWJ1Zy5oIC0gVjlGUyBEZWJ1ZyBEZWZpbml0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2RlZmluZSBERUJVR19FUlJPUgkJKDE8PDApCisjZGVmaW5lIERFQlVHX0NVUlJFTlQJCSgxPDwxKQorI2RlZmluZSBERUJVR185UAkgICAgICAgICgxPDwyKQorI2RlZmluZSBERUJVR19WRlMJICAgICAgICAoMTw8MykKKyNkZWZpbmUgREVCVUdfQ09OVgkJKDE8PDQpCisjZGVmaW5lIERFQlVHX01VWAkJKDE8PDUpCisjZGVmaW5lIERFQlVHX1RSQU5TCQkoMTw8NikKKyNkZWZpbmUgREVCVUdfU0xBQlMJICAgICAgCSgxPDw3KQorCisjZGVmaW5lIERFQlVHX0RVTVBfUEtUCQkwCisKK2V4dGVybiBpbnQgdjlmc19kZWJ1Z19sZXZlbDsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmb3JtYXQsIGFyZy4uLikgXAorZG8geyAgXAorCWlmKCh2OWZzX2RlYnVnX2xldmVsICYgbGV2ZWwpPT1sZXZlbCkgXAorCQlwcmludGsoS0VSTl9OT1RJQ0UgIi0tICVzICglZCk6ICIgXAorCQlmb3JtYXQgLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCAsICMjIGFyZyk7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBlcHJpbnRrKGxldmVsLCBmb3JtYXQsIGFyZy4uLikgXAorZG8geyBcCisJcHJpbnRrKGxldmVsICJ2OWZzOiAlcyAoJWQpOiAiIFwKKwkJZm9ybWF0ICwgX19GVU5DVElPTl9fLCBjdXJyZW50LT5waWQgLCAjIyBhcmcpOyBcCit9IHdoaWxlKDApCisKKyNpZiBERUJVR19EVU1QX1BLVAorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfZGF0YShjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlpbnQgaSwgajsKKwlpbnQgbGVuID0gZGF0YWxlbjsKKworCXByaW50ayhLRVJOX0RFQlVHICJkYXRhICIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkgeworCQlmb3IgKGogPSAwOyAoaiA8IDQpICYmIChpICsgaiA8IGxlbik7IGorKykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4IiwgZGF0YVtpICsgal0pOworCQlwcmludGsoS0VSTl9ERUJVRyAiICIpOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKK30KKyNlbHNlCQkJCS8qIERFQlVHX0RVTVBfUEtUICovCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9kYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCit9CisjZW5kaWYJCQkJLyogREVCVUdfRFVNUF9QS1QgKi8KZGlmZiAtLWdpdCBhL2ZzLzlwL2Vycm9yLmMgYi9mcy85cC9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTVkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9lcnJvci5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBsaW51eC9mcy85cC9lcnJvci5jCisgKgorICogRXJyb3Igc3RyaW5nIGhhbmRsaW5nCisgKgorICogUGxhbiA5IHVzZXMgZXJyb3Igc3RyaW5ncywgVW5peCB1c2VzIGVycm9yIG51bWJlcnMuICBUaGVzZSBmdW5jdGlvbnMKKyAqIHRyeSB0byBoZWxwIG1hbmFnZSB0aGF0IGFuZCBwcm92aWRlIGZvciBkeW5hbWljYWxseSBhZGRpbmcgZXJyb3IKKyAqIG1hcHBpbmdzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisKKy8qKgorICogdjlmc19lcnJvcl9pbml0IC0gcHJlbG9hZAorICogQGVycnN0cjogZXJyb3Igc3RyaW5nCisgKgorICovCisKK2ludCB2OWZzX2Vycm9yX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZXJyb3JtYXAgKmM7CisJaW50IGJ1Y2tldDsKKworCS8qIGluaXRpYWxpemUgaGFzaCB0YWJsZSAqLworCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgRVJSSEFTSFNaOyBidWNrZXQrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZoYXNoX2Vycm1hcFtidWNrZXRdKTsKKworCS8qIGxvYWQgaW5pdGlhbCBlcnJvciBtYXAgaW50byBoYXNoIHRhYmxlICovCisJZm9yIChjID0gZXJybWFwOyBjLT5uYW1lICE9IE5VTEw7IGMrKykgeworCQlidWNrZXQgPSBqaGFzaChjLT5uYW1lLCBzdHJsZW4oYy0+bmFtZSksIDApICUgRVJSSEFTSFNaOworCQlJTklUX0hMSVNUX05PREUoJmMtPmxpc3QpOworCQlobGlzdF9hZGRfaGVhZCgmYy0+bGlzdCwgJmhhc2hfZXJybWFwW2J1Y2tldF0pOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIGVycnN0cjJlcnJubyAtIGNvbnZlcnQgZXJyb3Igc3RyaW5nIHRvIGVycm9yIG51bWJlcgorICogQGVycnN0cjogZXJyb3Igc3RyaW5nCisgKgorICovCisKK2ludCB2OWZzX2VycnN0cjJlcnJubyhjaGFyICplcnJzdHIpCit7CisJaW50IGVycm5vID0gMDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcCA9IE5VTEw7CisJc3RydWN0IGVycm9ybWFwICpjID0gTlVMTDsKKwlpbnQgYnVja2V0ID0gamhhc2goZXJyc3RyLCBzdHJsZW4oZXJyc3RyKSwgMCkgJSBFUlJIQVNIU1o7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShjLCBwLCAmaGFzaF9lcnJtYXBbYnVja2V0XSwgbGlzdCkgeworCQlpZiAoIXN0cmNtcChjLT5uYW1lLCBlcnJzdHIpKSB7CisJCQllcnJubyA9IGMtPnZhbDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGVycm5vID09IDApIHsKKwkJLyogVE9ETzogaWYgZXJyb3IgaXNuJ3QgZm91bmQsIGFkZCBpdCBkeW5hbWljYWxseSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJzdHIgOiVzOiBub3QgZm91bmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGVycnN0cik7CisJCWVycm5vID0gMTsKKwl9CisKKwlyZXR1cm4gLWVycm5vOworfQpkaWZmIC0tZ2l0IGEvZnMvOXAvZXJyb3IuaCBiL2ZzLzlwL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmODlhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2Vycm9yLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBsaW51eC9mcy85cC9lcnJvci5oCisgKgorICogSHVnZSBOYXN0eSBFcnJvciBUYWJsZQorICoKKyAqIFBsYW4gOSB1c2VzIGVycm9yIHN0cmluZ3MsIFVuaXggdXNlcyBlcnJvciBudW1iZXJzLiAgVGhpcyB0YWJsZSB0cmllcyB0bworICogbWF0Y2ggVU5JWCBzdHJpbmdzIGFuZCBQbGFuIDkgc3RyaW5ncyB0byB1bml4IGVycm9yIG51bWJlcnMuICBJdCBpcyB1c2VkCisgKiB0byBwcmVsb2FkIHRoZSBkeW5hbWljIGVycm9yIHRhYmxlIHdoaWNoIGNhbiBhbHNvIHRyYWNrIHVzZXItc3BlY2lmaWMgZXJyb3IKKyAqIHN0cmluZ3MuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworc3RydWN0IGVycm9ybWFwIHsKKwljaGFyICpuYW1lOworCWludCB2YWw7CisKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OworfTsKKworI2RlZmluZSBFUlJIQVNIU1oJCTMyCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgaGFzaF9lcnJtYXBbRVJSSEFTSFNaXTsKKworLyogRml4TWUgLSByZWR1Y2UgdG8gYSByZWFzb25hYmxlIHNpemUgKi8KK3N0YXRpYyBzdHJ1Y3QgZXJyb3JtYXAgZXJybWFwW10gPSB7CisJeyJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIsIEVQRVJNfSwKKwl7IndzdGF0IHByb2hpYml0ZWQiLCBFUEVSTX0sCisJeyJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiwgRU5PRU5UfSwKKwl7ImRpcmVjdG9yeSBlbnRyeSBub3QgZm91bmQiLCBFTk9FTlR9LAorCXsiZmlsZSBub3QgZm91bmQiLCBFTk9FTlR9LAorCXsiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiLCBFSU5UUn0sCisJeyJJbnB1dC9vdXRwdXQgZXJyb3IiLCBFSU99LAorCXsiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyIsIEVOWElPfSwKKwl7IkFyZ3VtZW50IGxpc3QgdG9vIGxvbmciLCBFMkJJR30sCisJeyJCYWQgZmlsZSBkZXNjcmlwdG9yIiwgRUJBREZ9LAorCXsiUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUiLCBFQUdBSU59LAorCXsiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSIsIEVOT01FTX0sCisJeyJQZXJtaXNzaW9uIGRlbmllZCIsIEVBQ0NFU30sCisJeyJCYWQgYWRkcmVzcyIsIEVGQVVMVH0sCisJeyJCbG9jayBkZXZpY2UgcmVxdWlyZWQiLCBFTk9UQkxLfSwKKwl7IkRldmljZSBvciByZXNvdXJjZSBidXN5IiwgRUJVU1l9LAorCXsiRmlsZSBleGlzdHMiLCBFRVhJU1R9LAorCXsiSW52YWxpZCBjcm9zcy1kZXZpY2UgbGluayIsIEVYREVWfSwKKwl7Ik5vIHN1Y2ggZGV2aWNlIiwgRU5PREVWfSwKKwl7Ik5vdCBhIGRpcmVjdG9yeSIsIEVOT1RESVJ9LAorCXsiSXMgYSBkaXJlY3RvcnkiLCBFSVNESVJ9LAorCXsiSW52YWxpZCBhcmd1bWVudCIsIEVJTlZBTH0sCisJeyJUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbSIsIEVORklMRX0sCisJeyJUb28gbWFueSBvcGVuIGZpbGVzIiwgRU1GSUxFfSwKKwl7IlRleHQgZmlsZSBidXN5IiwgRVRYVEJTWX0sCisJeyJGaWxlIHRvbyBsYXJnZSIsIEVGQklHfSwKKwl7Ik5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIiwgRU5PU1BDfSwKKwl7IklsbGVnYWwgc2VlayIsIEVTUElQRX0sCisJeyJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iLCBFUk9GU30sCisJeyJUb28gbWFueSBsaW5rcyIsIEVNTElOS30sCisJeyJCcm9rZW4gcGlwZSIsIEVQSVBFfSwKKwl7Ik51bWVyaWNhbCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIiwgRURPTX0sCisJeyJOdW1lcmljYWwgcmVzdWx0IG91dCBvZiByYW5nZSIsIEVSQU5HRX0sCisJeyJSZXNvdXJjZSBkZWFkbG9jayBhdm9pZGVkIiwgRURFQURMS30sCisJeyJGaWxlIG5hbWUgdG9vIGxvbmciLCBFTkFNRVRPT0xPTkd9LAorCXsiTm8gbG9ja3MgYXZhaWxhYmxlIiwgRU5PTENLfSwKKwl7IkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCIsIEVOT1NZU30sCisJeyJEaXJlY3Rvcnkgbm90IGVtcHR5IiwgRU5PVEVNUFRZfSwKKwl7IlRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyIsIEVMT09QfSwKKwl7Ik5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlIiwgRU5PTVNHfSwKKwl7IklkZW50aWZpZXIgcmVtb3ZlZCIsIEVJRFJNfSwKKwl7Ik5vIGRhdGEgYXZhaWxhYmxlIiwgRU5PREFUQX0sCisJeyJNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayIsIEVOT05FVH0sCisJeyJQYWNrYWdlIG5vdCBpbnN0YWxsZWQiLCBFTk9QS0d9LAorCXsiT2JqZWN0IGlzIHJlbW90ZSIsIEVSRU1PVEV9LAorCXsiTGluayBoYXMgYmVlbiBzZXZlcmVkIiwgRU5PTElOS30sCisJeyJDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQiLCBFQ09NTX0sCisJeyJQcm90b2NvbCBlcnJvciIsIEVQUk9UT30sCisJeyJCYWQgbWVzc2FnZSIsIEVCQURNU0d9LAorCXsiRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSIsIEVCQURGRH0sCisJeyJTdHJlYW1zIHBpcGUgZXJyb3IiLCBFU1RSUElQRX0sCisJeyJUb28gbWFueSB1c2VycyIsIEVVU0VSU30sCisJeyJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiLCBFTk9UU09DS30sCisJeyJNZXNzYWdlIHRvbyBsb25nIiwgRU1TR1NJWkV9LAorCXsiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIsIEVOT1BST1RPT1BUfSwKKwl7IlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiLCBFUFJPVE9OT1NVUFBPUlR9LAorCXsiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCIsIEVTT0NLVE5PU1VQUE9SVH0sCisJeyJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCIsIEVPUE5PVFNVUFB9LAorCXsiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiLCBFUEZOT1NVUFBPUlR9LAorCXsiTmV0d29yayBpcyBkb3duIiwgRU5FVERPV059LAorCXsiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIsIEVORVRVTlJFQUNIfSwKKwl7Ik5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0IiwgRU5FVFJFU0VUfSwKKwl7IlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiwgRUNPTk5BQk9SVEVEfSwKKwl7IkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIsIEVDT05OUkVTRVR9LAorCXsiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIsIEVOT0JVRlN9LAorCXsiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIiwgRUlTQ09OTn0sCisJeyJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIsIEVOT1RDT05OfSwKKwl7IkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIsIEVTSFVURE9XTn0sCisJeyJDb25uZWN0aW9uIHRpbWVkIG91dCIsIEVUSU1FRE9VVH0sCisJeyJDb25uZWN0aW9uIHJlZnVzZWQiLCBFQ09OTlJFRlVTRUR9LAorCXsiSG9zdCBpcyBkb3duIiwgRUhPU1RET1dOfSwKKwl7Ik5vIHJvdXRlIHRvIGhvc3QiLCBFSE9TVFVOUkVBQ0h9LAorCXsiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiLCBFQUxSRUFEWX0sCisJeyJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIiwgRUlOUFJPR1JFU1N9LAorCXsiSXMgYSBuYW1lZCB0eXBlIGZpbGUiLCBFSVNOQU19LAorCXsiUmVtb3RlIEkvTyBlcnJvciIsIEVSRU1PVEVJT30sCisJeyJEaXNrIHF1b3RhIGV4Y2VlZGVkIiwgRURRVU9UfSwKKy8qIGVycm9ycyBmcm9tIGZvc3NpbCwgdmFjZnMsIGFuZCB1OWZzICovCisJeyJmaWQgdW5rbm93biBvciBvdXQgb2YgcmFuZ2UiLCBFQkFERn0sCisJeyJwZXJtaXNzaW9uIGRlbmllZCIsIEVBQ0NFU30sCisJeyJmaWxlIGRvZXMgbm90IGV4aXN0IiwgRU5PRU5UfSwKKwl7ImF1dGhlbnRpY2F0aW9uIGZhaWxlZCIsIEVDT05OUkVGVVNFRH0sCisJeyJiYWQgb2Zmc2V0IGluIGRpcmVjdG9yeSByZWFkIiwgRVNQSVBFfSwKKwl7ImJhZCB1c2Ugb2YgZmlkIiwgRUJBREZ9LAorCXsid3N0YXQgY2FuJ3QgY29udmVydCBiZXR3ZWVuIGZpbGVzIGFuZCBkaXJlY3RvcmllcyIsIEVQRVJNfSwKKwl7ImRpcmVjdG9yeSBpcyBub3QgZW1wdHkiLCBFTk9URU1QVFl9LAorCXsiZmlsZSBleGlzdHMiLCBFRVhJU1R9LAorCXsiZmlsZSBhbHJlYWR5IGV4aXN0cyIsIEVFWElTVH0sCisJeyJmaWxlIG9yIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIsIEVFWElTVH0sCisJeyJmaWQgYWxyZWFkeSBpbiB1c2UiLCBFQkFERn0sCisJeyJmaWxlIGluIHVzZSIsIEVUWFRCU1l9LAorCXsiaS9vIGVycm9yIiwgRUlPfSwKKwl7ImZpbGUgYWxyZWFkeSBvcGVuIGZvciBJL08iLCBFVFhUQlNZfSwKKwl7ImlsbGVnYWwgbW9kZSIsIEVJTlZBTH0sCisJeyJpbGxlZ2FsIG5hbWUiLCBFTkFNRVRPT0xPTkd9LAorCXsibm90IGEgZGlyZWN0b3J5IiwgRU5PVERJUn0sCisJeyJub3QgYSBtZW1iZXIgb2YgcHJvcG9zZWQgZ3JvdXAiLCBFUEVSTX0sCisJeyJub3Qgb3duZXIiLCBFQUNDRVN9LAorCXsib25seSBvd25lciBjYW4gY2hhbmdlIGdyb3VwIGluIHdzdGF0IiwgRUFDQ0VTfSwKKwl7InJlYWQgb25seSBmaWxlIHN5c3RlbSIsIEVST0ZTfSwKKwl7Im5vIGFjY2VzcyB0byBzcGVjaWFsIGZpbGUiLCBFUEVSTX0sCisJeyJpL28gY291bnQgdG9vIGxhcmdlIiwgRUlPfSwKKwl7InVua25vd24gZ3JvdXAiLCBFSU5WQUx9LAorCXsidW5rbm93biB1c2VyIiwgRUlOVkFMfSwKKwl7ImJvZ3VzIHdzdGF0IGJ1ZmZlciIsIEVQUk9UT30sCisJeyJleGNsdXNpdmUgdXNlIGZpbGUgYWxyZWFkeSBvcGVuIiwgRUFHQUlOfSwKKwl7ImNvcnJ1cHRlZCBkaXJlY3RvcnkgZW50cnkiLCBFSU99LAorCXsiY29ycnVwdGVkIGZpbGUgZW50cnkiLCBFSU99LAorCXsiY29ycnVwdGVkIGJsb2NrIGxhYmVsIiwgRUlPfSwKKwl7ImNvcnJ1cHRlZCBtZXRhIGRhdGEiLCBFSU99LAorCXsiaWxsZWdhbCBvZmZzZXQiLCBFSU5WQUx9LAorCXsiaWxsZWdhbCBwYXRoIGVsZW1lbnQiLCBFTk9FTlR9LAorCXsicm9vdCBvZiBmaWxlIHN5c3RlbSBpcyBjb3JydXB0ZWQiLCBFSU99LAorCXsiY29ycnVwdGVkIHN1cGVyIGJsb2NrIiwgRUlPfSwKKwl7InByb3RvY29sIGJvdGNoIiwgRVBST1RPfSwKKwl7ImZpbGUgc3lzdGVtIGlzIGZ1bGwiLCBFTk9TUEN9LAorCXsiZmlsZSBpcyBpbiB1c2UiLCBFQUdBSU59LAorCXsiZGlyZWN0b3J5IGVudHJ5IGlzIG5vdCBhbGxvY2F0ZWQiLCBFTk9FTlR9LAorCXsiZmlsZSBpcyByZWFkIG9ubHkiLCBFUk9GU30sCisJeyJmaWxlIGhhcyBiZWVuIHJlbW92ZWQiLCBFSURSTX0sCisJeyJvbmx5IHN1cHBvcnQgdHJ1bmNhdGlvbiB0byB6ZXJvIGxlbmd0aCIsIEVQRVJNfSwKKwl7ImNhbm5vdCByZW1vdmUgcm9vdCIsIEVQRVJNfSwKKwl7ImZpbGUgdG9vIGJpZyIsIEVGQklHfSwKKwl7InZlbnRpIGkvbyBlcnJvciIsIEVJT30sCisJLyogdGhlc2UgYXJlIG5vdCBlcnJvcnMgKi8KKwl7InU5ZnMgcmhvc3RzYXV0aDogbm8gYXV0aGVudGljYXRpb24gcmVxdWlyZWQiLCAwfSwKKwl7InU5ZnMgYXV0aG5vbmU6IG5vIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIiwgMH0sCisJe05VTEwsIC0xfQorfTsKKworZXh0ZXJuIGludCB2OWZzX2Vycm9yX2luaXQodm9pZCk7CitleHRlcm4gaW50IHY5ZnNfZXJyc3RyMmVycm5vKGNoYXIgKmVycnN0cik7CmRpZmYgLS1naXQgYS9mcy85cC9maWQuYyBiL2ZzLzlwL2ZpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMWM5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9maWQuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIFY5RlMgRklEIE1hbmFnZW1lbnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgIm11eC5oIgorI2luY2x1ZGUgImNvbnYuaCIKKyNpbmNsdWRlICJmaWQuaCIKKworLyoqCisgKiB2OWZzX2ZpZF9pbnNlcnQgLSBhZGQgYSBmaWQgdG8gYSBkZW50cnkKKyAqIEBmaWQ6IGZpZCB0byBhZGQKKyAqIEBkZW50cnk6IGRlbnRyeSB0aGF0IGl0IGlzIGJlaW5nIGFkZGVkIHRvCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19maWRfaW5zZXJ0KHN0cnVjdCB2OWZzX2ZpZCAqZmlkLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZmlkX2xpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRlbnRyeS0+ZF9mc2RhdGE7CisJZHByaW50ayhERUJVR185UCwgImZpZCAlZCAoJXApIGRlbnRyeSAlcyAoJXApXG4iLCBmaWQtPmZpZCwgZmlkLAorCQlkZW50cnktPmRfaW5hbWUsIGRlbnRyeSk7CisJaWYgKGRlbnRyeS0+ZF9mc2RhdGEgPT0gTlVMTCkgeworCQlkZW50cnktPmRfZnNkYXRhID0KKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRlbnRyeS0+ZF9mc2RhdGEgPT0gTlVMTCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZmlkX2xpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRlbnRyeS0+ZF9mc2RhdGE7CisJCUlOSVRfTElTVF9IRUFEKGZpZF9saXN0KTsJLyogSW5pdGlhbGl6ZSBsaXN0IGhlYWQgKi8KKwl9CisKKwlmaWQtPnVpZCA9IGN1cnJlbnQtPnVpZDsKKwlmaWQtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwlsaXN0X2FkZCgmZmlkLT5saXN0LCBmaWRfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19maWRfY3JlYXRlIC0gYWxsb2NhdGUgYSBGSUQgc3RydWN0dXJlCisgKiBAZGVudHJ5IC0gZGVudHJ5IHRvIGxpbmsgbmV3bHkgY3JlYXRlZCBmaWQgdG8KKyAqCisgKi8KKworc3RydWN0IHY5ZnNfZmlkICp2OWZzX2ZpZF9jcmVhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCB2OWZzX2ZpZCAqbmV3OworCisJbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY5ZnNfZmlkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ldyA9PSBOVUxMKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJPdXQgb2YgTWVtb3J5XG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJbmV3LT5maWQgPSAtMTsKKwluZXctPmZpZG9wZW4gPSAwOworCW5ldy0+ZmlkY3JlYXRlID0gMDsKKwluZXctPmZpZGNsdW5rZWQgPSAwOworCW5ldy0+aW91bml0ID0gMDsKKworCWlmICh2OWZzX2ZpZF9pbnNlcnQobmV3LCBkZW50cnkpID09IDApCisJCXJldHVybiBuZXc7CisJZWxzZSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJQcm9ibGVtcyBpbnNlcnRpbmcgdG8gZGVudHJ5XG4iKTsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKioKKyAqIHY5ZnNfZmlkX2Rlc3Ryb3kgLSBkZWFsbG9jYXRlIGEgRklEIHN0cnVjdHVyZQorICogQGZpZDogZmlkIHRvIGRlc3Ryb3kKKyAqCisgKi8KKwordm9pZCB2OWZzX2ZpZF9kZXN0cm95KHN0cnVjdCB2OWZzX2ZpZCAqZmlkKQoreworCWxpc3RfZGVsKCZmaWQtPmxpc3QpOworCWtmcmVlKGZpZCk7Cit9CisKKy8qKgorICogdjlmc19maWRfbG9va3VwIC0gcmV0cmlldmUgdGhlIHJpZ2h0IGZpZCBmcm9tIGEgIHBhcnRpY3VsYXIgZGVudHJ5CisgKiBAZGVudHJ5OiBkZW50cnkgdG8gbG9vayBmb3IgZmlkIGluCisgKiBAdHlwZTogaW50ZW50IG9mIGxvb2t1cCAob3BlcmF0aW9uIG9yIHRyYXZlcnNhbCkKKyAqCisgKiBzZWFyY2ggbGlzdCBvZiBmaWRzIGFzc29jaWF0ZWQgd2l0aCBhIGRlbnRyeSBmb3IgYSBmaWQgd2l0aCBhIG1hdGNoaW5nCisgKiB0aHJlYWQgaWQgb3IgdWlkLiAgSWYgdGhhdCBmYWlscywgbG9vayB1cCB0aGUgZGVudHJ5J3MgcGFyZW50cyB0byBzZWUgaWYgeW91CisgKiBjYW4gZmluZCBhIG1hdGNoaW5nIGZpZC4KKyAqCisgKi8KKworc3RydWN0IHY5ZnNfZmlkICp2OWZzX2ZpZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpmaWRfbGlzdCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGVudHJ5LT5kX2ZzZGF0YTsKKwlzdHJ1Y3Qgdjlmc19maWQgKmN1cnJlbnRfZmlkID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19maWQgKnRlbXAgPSBOVUxMOworCXN0cnVjdCB2OWZzX2ZpZCAqcmV0dXJuX2ZpZCA9IE5VTEw7CisJaW50IGZvdW5kX3BhcmVudCA9IDA7CisJaW50IGZvdW5kX3VzZXIgPSAwOworCisJZHByaW50ayhERUJVR185UCwgIiBkZW50cnk6ICVzICglcCkgdHlwZSAlZFxuIiwgZGVudHJ5LT5kX2luYW1lLCBkZW50cnksCisJCXR5cGUpOworCisJaWYgKGZpZF9saXN0ICYmICFsaXN0X2VtcHR5KGZpZF9saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3VycmVudF9maWQsIHRlbXAsIGZpZF9saXN0LCBsaXN0KSB7CisJCQlpZiAoY3VycmVudF9maWQtPnVpZCA9PSBjdXJyZW50LT51aWQpIHsKKwkJCQlpZiAocmV0dXJuX2ZpZCA9PSBOVUxMKSB7CisJCQkJCWlmICgodHlwZSA9PSBGSURfT1ApCisJCQkJCSAgICB8fCAoIWN1cnJlbnRfZmlkLT5maWRvcGVuKSkgeworCQkJCQkJcmV0dXJuX2ZpZCA9IGN1cnJlbnRfZmlkOworCQkJCQkJZm91bmRfdXNlciA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoY3VycmVudF9maWQtPnBpZCA9PSBjdXJyZW50LT5yZWFsX3BhcmVudC0+cGlkKSB7CisJCQkJaWYgKChyZXR1cm5fZmlkID09IE5VTEwpIHx8IChmb3VuZF9wYXJlbnQpCisJCQkJICAgIHx8IChmb3VuZF91c2VyKSkgeworCQkJCQlpZiAoKHR5cGUgPT0gRklEX09QKQorCQkJCQkgICAgfHwgKCFjdXJyZW50X2ZpZC0+Zmlkb3BlbikpIHsKKwkJCQkJCXJldHVybl9maWQgPSBjdXJyZW50X2ZpZDsKKwkJCQkJCWZvdW5kX3BhcmVudCA9IDE7CisJCQkJCQlmb3VuZF91c2VyID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChjdXJyZW50X2ZpZC0+cGlkID09IGN1cnJlbnQtPnBpZCkgeworCQkJCWlmICgodHlwZSA9PSBGSURfT1ApIHx8CisJCQkJICAgICghY3VycmVudF9maWQtPmZpZG9wZW4pKSB7CisJCQkJCXJldHVybl9maWQgPSBjdXJyZW50X2ZpZDsKKwkJCQkJZm91bmRfcGFyZW50ID0gMDsKKwkJCQkJZm91bmRfdXNlciA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogd2UgYXJlIGF0IHRoZSByb290IGJ1dCBkaWRuJ3QgbWF0Y2ggKi8KKwlpZiAoKCFyZXR1cm5fZmlkKSAmJiAoZGVudHJ5LT5kX3BhcmVudCA9PSBkZW50cnkpKSB7CisJCS8qIFRPRE86IGNsb25lIGF0dGFjaCB3aXRoIG5ldyB1aWQgKi8KKwkJcmV0dXJuX2ZpZCA9IGN1cnJlbnRfZmlkOworCX0KKworCWlmICghcmV0dXJuX2ZpZCkgeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXIgPSBjdXJyZW50LT5mcy0+cHdkLT5kX3BhcmVudDsKKwkJaW50IGNvdW50ID0gMTsKKwkJd2hpbGUgKHBhciAhPSBOVUxMKSB7CisJCQlpZiAocGFyID09IGRlbnRyeSkKKwkJCQlicmVhazsKKwkJCWNvdW50Kys7CisJCQlpZiAocGFyID09IHBhci0+ZF9wYXJlbnQpIHsKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkiZ290IHRvIHJvb3Qgd2l0aG91dCBmaW5kaW5nIGRlbnRyeVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwYXIgPSBwYXItPmRfcGFyZW50OworCQl9CisKKy8qIFhYWCAtIHRoZXJlIG1heSBiZSBzb21lIGR1cGxpY2F0aW9uIHdlIGNhbiBnZXQgcmlkIG9mICovCisJCWlmIChwYXIgPT0gZGVudHJ5KSB7CisJCQkvKiB3ZSBuZWVkIHRvIGZpZF9sb29rdXAgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisJCQlpbnQgZmlkbnVtID0gLTE7CisJCQlpbnQgb2xkZmlkID0gLTE7CisJCQlpbnQgcmVzdWx0ID0gLTE7CisJCQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0KKwkJCSAgICB2OWZzX2lub2RlMnY5c2VzKGN1cnJlbnQtPmZzLT5wd2QtPmRfaW5vZGUpOworCisJCQljdXJyZW50X2ZpZCA9CisJCQkgICAgdjlmc19maWRfbG9va3VwKGN1cnJlbnQtPmZzLT5wd2QsIEZJRF9XQUxLKTsKKwkJCWlmIChjdXJyZW50X2ZpZCA9PSBOVUxMKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJInByb2Nlc3MgY3dkIGRvZXNuJ3QgaGF2ZSBhIGZpZFxuIik7CisJCQkJcmV0dXJuIHJldHVybl9maWQ7CisJCQl9CisJCQlvbGRmaWQgPSBjdXJyZW50X2ZpZC0+ZmlkOworCQkJcGFyID0gY3VycmVudC0+ZnMtPnB3ZDsKKwkJCS8qIFRPRE86IHRha2UgYWR2YW50YWdlIG9mIG11bHRpd2FsayAqLworCisJCQlmaWRudW0gPSB2OWZzX2dldF9pZHBvb2woJnY5c2VzLT5maWRwb29sKTsKKwkJCWlmIChmaWRudW0gPCAwKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJImNvdWxkIG5vdCBnZXQgYSBuZXcgZmlkIG51bVxuIik7CisJCQkJcmV0dXJuIHJldHVybl9maWQ7CisJCQl9CisKKwkJCXdoaWxlIChwYXIgIT0gZGVudHJ5KSB7CisJCQkJcmVzdWx0ID0KKwkJCQkgICAgdjlmc190X3dhbGsodjlzZXMsIG9sZGZpZCwgZmlkbnVtLCAiLi4iLAorCQkJCQkJTlVMTCk7CisJCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJCSJwcm9ibGVtIHdhbGtpbmcgdG8gcGFyZW50XG4iKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb2xkZmlkID0gZmlkbnVtOworCQkJCWlmIChwYXIgPT0gcGFyLT5kX3BhcmVudCkgeworCQkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkJImNhbid0IGZpbmQgZGVudHJ5XG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBhciA9IHBhci0+ZF9wYXJlbnQ7CisJCQl9CisJCQlpZiAocGFyID09IGRlbnRyeSkgeworCQkJCXJldHVybl9maWQgPSB2OWZzX2ZpZF9jcmVhdGUoZGVudHJ5KTsKKwkJCQlyZXR1cm5fZmlkLT5maWQgPSBmaWRudW07CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dXJuX2ZpZDsKK30KZGlmZiAtLWdpdCBhL2ZzLzlwL2ZpZC5oIGIvZnMvOXAvZmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiNDc4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2ZpZC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBWOUZTIEZJRCBNYW5hZ2VtZW50CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZSBGSURfT1AgICAwCisjZGVmaW5lIEZJRF9XQUxLIDEKKworc3RydWN0IHY5ZnNfZmlkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CSAvKiBsaXN0IG9mIGZpZHMgYXNzb2NpYXRlZCB3aXRoIGEgZGVudHJ5ICovCisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmU7IC8qIFhYWCAtIGRlYnVnICovCisKKwl1MzIgZmlkOworCXVuc2lnbmVkIGNoYXIgZmlkb3BlbjsJICAvKiBzZXQgd2hlbiBmaWQgaXMgb3BlbmVkICovCisJdW5zaWduZWQgY2hhciBmaWRjcmVhdGU7ICAvKiBzZXQgd2hlbiBmaWQgd2FzIGp1c3QgY3JlYXRlZCAqLworCXVuc2lnbmVkIGNoYXIgZmlkY2x1bmtlZDsgLyogc2V0IHdoZW4gZmlkIGhhcyBhbHJlYWR5IGJlZW4gY2x1bmtlZCAqLworCisJc3RydWN0IHY5ZnNfcWlkIHFpZDsKKwl1MzIgaW91bml0OworCisJLyogcmVhZGRpciBzdHVmZiAqLworCWludCByZGlyX2Zwb3M7CisJbG9mZl90IHJkaXJfcG9zOworCXN0cnVjdCB2OWZzX2ZjYWxsICpyZGlyX2ZjYWxsOworCisJLyogbWFuYWdlbWVudCBzdHVmZiAqLworCXBpZF90IHBpZDsJCS8qIHRocmVhZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWQgKi8KKwl1aWRfdCB1aWQ7CQkvKiB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZCAqLworCisJLyogcHJpdmF0ZSBkYXRhICovCisJc3RydWN0IGZpbGUgKmZpbHA7CS8qIGJhY2twb2ludGVyIHRvIEZpbGUgc3RydWN0IGZvciBvcGVuIGZpbGVzICovCisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsJLyogc2Vzc2lvbiBpbmZvIGZvciB0aGlzIEZJRCAqLworfTsKKworc3RydWN0IHY5ZnNfZmlkICp2OWZzX2ZpZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgdHlwZSk7Cit2b2lkIHY5ZnNfZmlkX2Rlc3Ryb3koc3RydWN0IHY5ZnNfZmlkICpmaWQpOworc3RydWN0IHY5ZnNfZmlkICp2OWZzX2ZpZF9jcmVhdGUoc3RydWN0IGRlbnRyeSAqKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL211eC5jIGIvZnMvOXAvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzNWI1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL211eC5jCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogbGludXgvZnMvOXAvbXV4LmMKKyAqCisgKiBQcm90b2NvbCBNdWx0aXBsZXhlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgTGF0Y2hlc2FyIElvbmtvdiA8bHVjaG9AaW9ua292Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJjb252LmgiCisjaW5jbHVkZSAibXV4LmgiCisKKy8qKgorICogZHByaW50Y29uZCAtIHByaW50IGNvbmRpdGlvbiBvZiBzZXNzaW9uIGluZm8KKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQHJlcTogUlBDIHJlcXVlc3Qgc3RydWN0dXJlCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitkcHJpbnRjb25kKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX3JwY3JlcSAqcmVxKQoreworCWRwcmludGsoREVCVUdfTVVYLCAiY29uZGl0aW9uOiAlZCwgJXBcbiIsIHY5c2VzLT50cmFuc3BvcnQtPnN0YXR1cywKKwkJcmVxLT5yY2FsbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeHJlYWQgLSBmb3JjZSByZWFkIG9mIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQHB0cjogcG9pbnRlciB0byBidWZmZXIKKyAqIEBzejogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisgKiBDaHVjayBDcmFub3IgQ1MtNTMzIHByb2plY3QxCisgKi8KKworc3RhdGljIGludCB4cmVhZChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJaW50IHJkID0gMDsKKwlpbnQgcmV0ID0gMDsKKwl3aGlsZSAocmQgPCBzeikgeworCQlyZXQgPSB2OXNlcy0+dHJhbnNwb3J0LT5yZWFkKHY5c2VzLT50cmFuc3BvcnQsIHB0ciwgc3ogLSByZCk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgInhyZWFkIGVycm5vICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZCArPSByZXQ7CisJCXB0ciArPSByZXQ7CisJfQorCXJldHVybiAocmQpOworfQorCisvKioKKyAqIHJlYWRfbWVzc2FnZSAtIHJlYWQgYSBmdWxsIDlQMjAwMCBmY2FsbCBwYWNrZXQKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQHJjYWxsOiBmY2FsbCBzdHJ1Y3R1cmUgdG8gcmVhZCBpbnRvCisgKiBAcmNhbGxsZW46IHNpemUgb2YgZmNhbGwgYnVmZmVyCisgKgorICovCisKK3N0YXRpYyBpbnQKK3JlYWRfbWVzc2FnZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLAorCSAgICAgc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsLCBpbnQgcmNhbGxsZW4pCit7CisJdW5zaWduZWQgY2hhciBidWZbNF07CisJdm9pZCAqZGF0YTsKKwlpbnQgc2l6ZSA9IDA7CisJaW50IHJlcyA9IDA7CisKKwlyZXMgPSB4cmVhZCh2OXNlcywgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHJlcyA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCSJSZWFkaW5nIG9mIGNvdW50IGZpZWxkIGZhaWxlZCByZXR1cm5lZDogJWRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCisJaWYgKHJlcyA8IDQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCSJSZWFkaW5nIG9mIGNvdW50IGZpZWxkIGZhaWxlZCByZXR1cm5lZDogJWRcbiIsIHJlcyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXNpemUgPSBidWZbMF0gfCAoYnVmWzFdIDw8IDgpIHwgKGJ1ZlsyXSA8PCAxNikgfCAoYnVmWzNdIDw8IDI0KTsKKwlkcHJpbnRrKERFQlVHX01VWCwgImdvdCBhIHBhY2tldCBjb3VudDogJWRcbiIsIHNpemUpOworCisJLyogYWRqdXN0IGZvciB0aGUgZm91ciBieXRlcyBvZiBzaXplICovCisJc2l6ZSAtPSA0OworCisJaWYgKHNpemUgPiB2OXNlcy0+bWF4ZGF0YSkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicGFja2V0IHRvbyBiaWc6ICVkXG4iLCBzaXplKTsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwlkYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVzID0geHJlYWQodjlzZXMsIGRhdGEsIHNpemUpOworCWlmIChyZXMgPCBzaXplKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJSZWFkaW5nIG9mIGZjYWxsIGZhaWxlZCByZXR1cm5lZDogJWRcbiIsCisJCQlyZXMpOworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiB3ZSBub3cgaGF2ZSBhbiBpbi1tZW1vcnkgc3RyaW5nIHRoYXQgaXMgdGhlIHJlcGx5LgorCSAqIGRlc2VyaWFsaXplIGl0LiBUaGVyZSBpcyB2ZXJ5IGxpdHRsZSB0byBnbyB3cm9uZyBhdCB0aGlzIHBvaW50CisJICogc2F2ZSBmb3Igdjlmc19hbGxvYyBlcnJvcnMuCisJICovCisJcmVzID0gdjlmc19kZXNlcmlhbGl6ZV9mY2FsbCh2OXNlcywgc2l6ZSwgZGF0YSwgdjlzZXMtPm1heGRhdGEsCisJCQkJICAgICByY2FsbCwgcmNhbGxsZW4pOworCisJa2ZyZWUoZGF0YSk7CisKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHY5ZnNfcmVjdiAtIHJlY2VpdmUgYW4gUlBDIHJlc3BvbnNlIGZvciBhIHBhcnRpY3VsYXIgdGFnCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKKyAqIEByZXE6IFJQQyByZXF1ZXN0IHN0cnVjdHVyZQorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfcmVjdihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJlcSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoREVCVUdfTVVYLCAid2FpdGluZyBmb3IgcmVzcG9uc2U6ICVkXG4iLCByZXEtPnRjYWxsLT50YWcpOworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh2OXNlcy0+cmVhZF93YWl0LAorCQkgICAgICAgKCh2OXNlcy0+dHJhbnNwb3J0LT5zdGF0dXMgIT0gQ29ubmVjdGVkKSB8fAorCQkJKHJlcS0+cmNhbGwgIT0gMCkgfHwgKHJlcS0+ZXJyIDwgMCkgfHwKKwkJCWRwcmludGNvbmQodjlzZXMsIHJlcSkpKTsKKworCWRwcmludGsoREVCVUdfTVVYLCAiZ290IGl0OiByY2FsbCAlcFxuIiwgcmVxLT5yY2FsbCk7CisKKwlzcGluX2xvY2soJnY5c2VzLT5tdXhsb2NrKTsKKwlsaXN0X2RlbCgmcmVxLT5uZXh0KTsKKwlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOworCisJaWYgKHJlcS0+ZXJyIDwgMCkKKwkJcmV0dXJuIHJlcS0+ZXJyOworCisJaWYgKHY5c2VzLT50cmFuc3BvcnQtPnN0YXR1cyA9PSBEaXNjb25uZWN0ZWQpCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19zZW5kIC0gc2VuZCBhIDlQIHJlcXVlc3QKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQHJlcTogUlBDIHJlcXVlc3QgdG8gc2VuZAorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfc2VuZChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJlcSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnRjYWxsID0gcmVxLT50Y2FsbDsKKworCWRhdGEgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhICsgVjlGU19JT0hEUlNaLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJdGNhbGwtPnNpemUgPSAwOwkvKiBlbmZvcmNlIHNpemUgcmVjYWxjdWxhdGlvbiAqLworCXJldCA9CisJICAgIHY5ZnNfc2VyaWFsaXplX2ZjYWxsKHY5c2VzLCB0Y2FsbCwgZGF0YSwKKwkJCQkgdjlzZXMtPm1heGRhdGEgKyBWOUZTX0lPSERSU1opOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZyZWVfZGF0YTsKKworCXNwaW5fbG9jaygmdjlzZXMtPm11eGxvY2spOworCWxpc3RfYWRkKCZyZXEtPm5leHQsICZ2OXNlcy0+bXV4X2ZjYWxscyk7CisJc3Bpbl91bmxvY2soJnY5c2VzLT5tdXhsb2NrKTsKKworCWRwcmludGsoREVCVUdfTVVYLCAic2VuZGluZyBtZXNzYWdlOiB0YWcgJWQgc2l6ZSAlZFxuIiwgdGNhbGwtPnRhZywKKwkJdGNhbGwtPnNpemUpOworCXJldCA9IHY5c2VzLT50cmFuc3BvcnQtPndyaXRlKHY5c2VzLT50cmFuc3BvcnQsIGRhdGEsIHRjYWxsLT5zaXplKTsKKworCWlmIChyZXQgIT0gdGNhbGwtPnNpemUpIHsKKwkJc3Bpbl9sb2NrKCZ2OXNlcy0+bXV4bG9jayk7CisJCWxpc3RfZGVsKCZyZXEtPm5leHQpOworCQlrZnJlZShyZXEtPnJjYWxsKTsKKworCQlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRVJFTU9URUlPOworCX0gZWxzZQorCQlyZXQgPSAwOworCisgICAgICBmcmVlX2RhdGE6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2OWZzX211eF9ycGMgLSBzZW5kIGEgcmVxdWVzdCwgcmVjZWl2ZSBhIHJlc3BvbnNlCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKKyAqIEB0Y2FsbDogZmNhbGwgdG8gc2VuZAorICogQHJjYWxsOiBidWZmZXIgdG8gcGxhY2UgcmVzcG9uc2UgaW50bworICoKKyAqLworCitsb25nCit2OWZzX211eF9ycGMoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfZmNhbGwgKnRjYWxsLAorCSAgICAgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCkKK3sKKwlpbnQgdGlkID0gLTE7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19ycGNyZXEgcmVxOworCWludCByZXQgPSAtMTsKKworCWlmICghdjlzZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF2OXNlcy0+dHJhbnNwb3J0IHx8IHY5c2VzLT50cmFuc3BvcnQtPnN0YXR1cyAhPSBDb25uZWN0ZWQpCisJCXJldHVybiAtRUlPOworCisJaWYgKHJjYWxsKQorCQkqcmNhbGwgPSBOVUxMOworCisJaWYgKHRjYWxsLT5pZCAhPSBUVkVSU0lPTikgeworCQl0aWQgPSB2OWZzX2dldF9pZHBvb2woJnY5c2VzLT50aWRwb29sKTsKKwkJaWYgKHRpZCA8IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0Y2FsbC0+dGFnID0gdGlkOworCisJcmVxLnRjYWxsID0gdGNhbGw7CisJcmVxLmVyciA9IDA7CisJcmVxLnJjYWxsID0gTlVMTDsKKworCXJldCA9IHY5ZnNfc2VuZCh2OXNlcywgJnJlcSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlpZiAodGNhbGwtPmlkICE9IFRWRVJTSU9OKQorCQkJdjlmc19wdXRfaWRwb29sKHRpZCwgJnY5c2VzLT50aWRwb29sKTsKKwkJZHByaW50ayhERUJVR19NVVgsICJlcnJvciAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB2OWZzX3JlY3YodjlzZXMsICZyZXEpOworCisJZmNhbGwgPSByZXEucmNhbGw7CisKKwlkcHJpbnRrKERFQlVHX01VWCwgInJlY2VpdmVkOiB0YWc9JXgsIHJldD0lZFxuIiwgdGNhbGwtPnRhZywgcmV0KTsKKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykgeworCQlpZiAodjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzICE9IERpc2Nvbm5lY3RlZAorCQkgICAgJiYgdGNhbGwtPmlkICE9IFRGTFVTSCkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJZHByaW50ayhERUJVR19NVVgsICJmbHVzaGluZyB0aGUgdGFnOiAlZFxuIiwKKwkJCQl0Y2FsbC0+dGFnKTsKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKKwkJCXY5ZnNfdF9mbHVzaCh2OXNlcywgdGNhbGwtPnRhZyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssCisJCQkJCSAgICAgICBmbGFncyk7CisJCQlkcHJpbnRrKERFQlVHX01VWCwgImZsdXNoaW5nIGRvbmVcbiIpOworCQl9CisKKwkJZ290byByZWxlYXNlX3JlcTsKKwl9IGVsc2UgaWYgKHJldCA8IDApCisJCWdvdG8gcmVsZWFzZV9yZXE7CisKKwlpZiAoIWZjYWxsKQorCQlyZXQgPSAtRUlPOworCWVsc2UgeworCQlpZiAoZmNhbGwtPmlkID09IFJFUlJPUikgeworCQkJcmV0ID0gdjlmc19lcnJzdHIyZXJybm8oZmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJyb3IpOworCQkJaWYgKHJldCA9PSAwKSB7CS8qIHN0cmluZyBtYXRjaCBmYWlsZWQgKi8KKwkJCQlpZiAoZmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJybm8pCisJCQkJCXJldCA9IC0oZmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJybm8pOworCQkJCWVsc2UKKwkJCQkJcmV0ID0gLUVTRVJWRVJGQVVMVDsKKwkJCX0KKwkJfSBlbHNlIGlmIChmY2FsbC0+aWQgIT0gdGNhbGwtPmlkICsgMSkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkiZmNhbGwgbWlzbWF0Y2g6IGV4cGVjdGVkICVkLCBnb3QgJWRcbiIsCisJCQkJdGNhbGwtPmlkICsgMSwgZmNhbGwtPmlkKTsKKwkJCXJldCA9IC1FSU87CisJCX0KKwl9CisKKyAgICAgIHJlbGVhc2VfcmVxOgorCWlmICh0Y2FsbC0+aWQgIT0gVFZFUlNJT04pCisJCXY5ZnNfcHV0X2lkcG9vbCh0aWQsICZ2OXNlcy0+dGlkcG9vbCk7CisJaWYgKHJjYWxsKQorCQkqcmNhbGwgPSBmY2FsbDsKKwllbHNlCisJCWtmcmVlKGZjYWxsKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19tdXhfY2FuY2VsX3JlcXVlc3RzIC0gY2FuY2VscyBhbGwgcGVuZGluZyByZXF1ZXN0cworICoKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQorICogQGVycjogZXJyb3IgY29kZSB0byByZXR1cm4gdG8gdGhlIHJlcXVlc3RzCisgKi8KK3ZvaWQgdjlmc19tdXhfY2FuY2VsX3JlcXVlc3RzKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGludCBlcnIpCit7CisJc3RydWN0IHY5ZnNfcnBjcmVxICpycHRyOworCXN0cnVjdCB2OWZzX3JwY3JlcSAqcnJlcTsKKworCWRwcmludGsoREVCVUdfTVVYLCAiICVkXG4iLCBlcnIpOworCXNwaW5fbG9jaygmdjlzZXMtPm11eGxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycmVxLCBycHRyLCAmdjlzZXMtPm11eF9mY2FsbHMsIG5leHQpIHsKKwkJcnJlcS0+ZXJyID0gZXJyOworCX0KKwlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOworCXdha2VfdXBfYWxsKCZ2OXNlcy0+cmVhZF93YWl0KTsKK30KKworLyoqCisgKiB2OWZzX3JlY3Zwcm9jIC0ga3Byb2MgdG8gaGFuZGxlIGRlbXVsdGlwbGV4aW5nIHJlc3BvbnNlcworICogQGRhdGE6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3JlY3Zwcm9jKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKilkYXRhOworCXN0cnVjdCB2OWZzX2ZjYWxsICpyY2FsbCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfcnBjcmVxICpycHRyOworCXN0cnVjdCB2OWZzX3JwY3JlcSAqcmVxOworCXN0cnVjdCB2OWZzX3JwY3JlcSAqcnJlcTsKKwlpbnQgZXJyID0gMDsKKworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWNvbXBsZXRlKCZ2OXNlcy0+cHJvY2NtcGwpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGVyciA+PSAwKSB7CisJCXJlcSA9IHJwdHIgPSBycmVxID0gTlVMTDsKKworCQlyY2FsbCA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEgKyBWOUZTX0lPSERSU1osIEdGUF9LRVJORUwpOworCQlpZiAoIXJjYWxsKSB7CisJCQllcHJpbnRrKEtFUk5fRVJSLCAibm8gbWVtb3J5IGZvciBidWZmZXJzXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gcmVhZF9tZXNzYWdlKHY5c2VzLCByY2FsbCwgdjlzZXMtPm1heGRhdGEgKyBWOUZTX0lPSERSU1opOworCQlzcGluX2xvY2soJnY5c2VzLT5tdXhsb2NrKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycmVxLCBycHRyLCAmdjlzZXMtPm11eF9mY2FsbHMsIG5leHQpIHsKKwkJCQlycmVxLT5lcnIgPSBlcnI7CisJCQl9CisJCQlpZihlcnIgIT0gLUVSRVNUQVJUU1lTKQorCQkJCWVwcmludGsoS0VSTl9FUlIsCisJCQkJCSJUcmFuc3BvcnQgZXJyb3Igd2hpbGUgcmVhZGluZyBtZXNzYWdlICVkXG4iLCBlcnIpOworCQl9IGVsc2UgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJyZXEsIHJwdHIsICZ2OXNlcy0+bXV4X2ZjYWxscywgbmV4dCkgeworCQkJCWlmIChycmVxLT50Y2FsbC0+dGFnID09IHJjYWxsLT50YWcpIHsKKwkJCQkJcmVxID0gcnJlcTsKKwkJCQkJcmVxLT5yY2FsbCA9IHJjYWxsOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocmVxICYmIChyZXEtPnRjYWxsLT5pZCA9PSBURkxVU0gpKSB7CisJCQlzdHJ1Y3Qgdjlmc19ycGNyZXEgKnRyZXEgPSBOVUxMOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyZXEsIHJwdHIsICZ2OXNlcy0+bXV4X2ZjYWxscywgbmV4dCkgeworCQkJCWlmICh0cmVxLT50Y2FsbC0+dGFnID09CisJCQkJICAgIHJlcS0+dGNhbGwtPnBhcmFtcy50Zmx1c2gub2xkdGFnKSB7CisJCQkJCWxpc3RfZGVsKCZycHRyLT5uZXh0KTsKKwkJCQkJa2ZyZWUodHJlcS0+cmNhbGwpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOworCisJCWlmICghcmVxKSB7CisJCQlpZiAoZXJyID49IDApCisJCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkJInVuZXhwZWN0ZWQgcmVzcG9uc2U6IGlkICVkIHRhZyAlZFxuIiwKKwkJCQkJcmNhbGwtPmlkLCByY2FsbC0+dGFnKTsKKworCQkJa2ZyZWUocmNhbGwpOworCQl9CisKKwkJd2FrZV91cF9hbGwoJnY5c2VzLT5yZWFkX3dhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCXY5c2VzLT50cmFuc3BvcnQtPmNsb3NlKHY5c2VzLT50cmFuc3BvcnQpOworCisJLyogSW5mb3JtIGFsbCBwZW5kaW5nIHByb2Nlc3NlcyBhYm91dCB0aGUgZmFpbHVyZSAqLworCXdha2VfdXBfYWxsKCZ2OXNlcy0+cmVhZF93YWl0KTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJY29tcGxldGUoJnY5c2VzLT5wcm9jY21wbCk7CisKKwlkcHJpbnRrKERFQlVHX01VWCwgInJlY3Zwcm9jOiBlbmRcbiIpOworCXY5c2VzLT5yZWN2cHJvYyA9IE5VTEw7CisKKwlyZXR1cm4gZXJyID49IDA7Cit9CisKKy8qKgorICogdjlmc19tdXhfaW5pdCAtIGluaXRpYWxpemUgbXVsdGlwbGV4ZXIgKHNwYXduIGtwcm9jKQorICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCisgKiBAZGV2X25hbWU6IG1vdW50IGRldmljZSBpbmZvcm1hdGlvbiAodG8gY3JlYXRlIHVuaXF1ZSBrcHJvYykKKyAqCisgKi8KKworaW50IHY5ZnNfbXV4X2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgY29uc3QgY2hhciAqZGV2X25hbWUpCit7CisJY2hhciBwcm9jbmFtZVs2MF07CisKKwlzdHJuY3B5KHByb2NuYW1lLCBkZXZfbmFtZSwgc2l6ZW9mKHByb2NuYW1lKSk7CisJcHJvY25hbWVbc2l6ZW9mKHByb2NuYW1lKSAtIDFdID0gMDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnY5c2VzLT5yZWFkX3dhaXQpOworCWluaXRfY29tcGxldGlvbigmdjlzZXMtPmZjcmVhZCk7CisJaW5pdF9jb21wbGV0aW9uKCZ2OXNlcy0+cHJvY2NtcGwpOworCXNwaW5fbG9ja19pbml0KCZ2OXNlcy0+bXV4bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnY5c2VzLT5tdXhfZmNhbGxzKTsKKwl2OXNlcy0+cmVjdnByb2MgPSBOVUxMOworCXY5c2VzLT5jdXJmY2FsbCA9IE5VTEw7CisKKwl2OXNlcy0+cmVjdnByb2MgPSBrdGhyZWFkX2NyZWF0ZSh2OWZzX3JlY3Zwcm9jLCB2OXNlcywKKwkJCQkJICJ2OWZzX3JlY3Zwcm9jICVzIiwgcHJvY25hbWUpOworCisJaWYgKElTX0VSUih2OXNlcy0+cmVjdnByb2MpKSB7CisJCWVwcmludGsoS0VSTl9FUlIsICJjYW5ub3QgY3JlYXRlIHJlY2VpdmluZyB0aHJlYWRcbiIpOworCQl2OWZzX3Nlc3Npb25fY2xvc2UodjlzZXMpOworCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKwl9CisKKwl3YWtlX3VwX3Byb2Nlc3ModjlzZXMtPnJlY3Zwcm9jKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ2OXNlcy0+cHJvY2NtcGwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy85cC9tdXguaCBiL2ZzLzlwL211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTRjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9tdXguaApAQCAtMCwwICsxLDQxIEBACisvKgorICogbGludXgvZnMvOXAvbXV4LmgKKyAqCisgKiBNdWx0aXBsZXhlciBEZWZpbml0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKy8qIHN0cnVjdHVyZSB0byBtYW5hZ2UgZWFjaCBSUEMgdHJhbnNhY3Rpb24gKi8KKworc3RydWN0IHY5ZnNfcnBjcmVxIHsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGw7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsOworCWludCBlcnI7CS8qIGVycm9yIGNvZGUgaWYgcmVzcG9uc2UgZmFpbGVkICovCisKKwkvKiBYWFggLSBjb3VsZCB3ZSBwdXQgc2NhdHRlci9nYXRoZXIgYnVmZmVycyBoZXJlPyAqLworCisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OworfTsKKworaW50IHY5ZnNfbXV4X2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgY29uc3QgY2hhciAqZGV2X25hbWUpOworbG9uZyB2OWZzX211eF9ycGMoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywKKwkJICBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGwsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOwordm9pZCB2OWZzX211eF9jYW5jZWxfcmVxdWVzdHMoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgaW50IGVycik7CmRpZmYgLS1naXQgYS9mcy85cC90cmFuc19mZC5jIGIvZnMvOXAvdHJhbnNfZmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2I1OGNlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvdHJhbnNfZmQuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL3RyYW5zX2ZkLmMKKyAqCisgKiBGaWxlIERlc2NyaXB0b3IgVHJhbnNwb3J0IExheWVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisKK3N0cnVjdCB2OWZzX3RyYW5zX2ZkIHsKKwlzdHJ1Y3QgZmlsZSAqaW5fZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqb3V0X2ZpbGU7Cit9OworCisvKioKKyAqIHY5ZnNfZmRfcmVjdiAtIHJlY2VpdmUgZnJvbSBhIHNvY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAdjogYnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBpbnRvCisgKiBAbGVuOiBzaXplIG9mIHJlY2VpdmUgYnVmZmVyCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19mZF9yZWN2KHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMsIHZvaWQgKnYsIGludCBsZW4pCit7CisJc3RydWN0IHY5ZnNfdHJhbnNfZmQgKnRzID0gdHJhbnMgPyB0cmFucy0+cHJpdiA6IE5VTEw7CisKKwlpZiAoIXRyYW5zIHx8IHRyYW5zLT5zdGF0dXMgIT0gQ29ubmVjdGVkIHx8ICF0cykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4ga2VybmVsX3JlYWQodHMtPmluX2ZpbGUsIHRzLT5pbl9maWxlLT5mX3BvcywgdiwgbGVuKTsKK30KKworLyoqCisgKiB2OWZzX2ZkX3NlbmQgLSBzZW5kIHRvIGEgc29ja2V0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEB2OiBidWZmZXIgdG8gc2VuZCBkYXRhIGZyb20KKyAqIEBsZW46IHNpemUgb2Ygc2VuZCBidWZmZXIKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX2ZkX3NlbmQoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFucywgdm9pZCAqdiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgdjlmc190cmFuc19mZCAqdHMgPSB0cmFucyA/IHRyYW5zLT5wcml2IDogTlVMTDsKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdHJhbnMgfHwgdHJhbnMtPnN0YXR1cyAhPSBDb25uZWN0ZWQgfHwgIXRzKQorCQlyZXR1cm4gLUVJTzsKKworCXNldF9mcyhnZXRfZHMoKSk7CisJLyogVGhlIGNhc3QgdG8gYSB1c2VyIHBvaW50ZXIgaXMgdmFsaWQgZHVlIHRvIHRoZSBzZXRfZnMoKSAqLworCXJldCA9IHZmc193cml0ZSh0cy0+b3V0X2ZpbGUsICh2b2lkIF9fdXNlciAqKXYsIGxlbiwgJnRzLT5vdXRfZmlsZS0+Zl9wb3MpOworCXNldF9mcyhvbGRmcyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHY5ZnNfZmRfaW5pdCAtIGluaXRpYWxpemUgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAYWRkcjogYWRkcmVzcyBvZiBzZXJ2ZXIgdG8gbW91bnQKKyAqIEBkYXRhOiBtb3VudCBvcHRpb25zCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfZmRfaW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjb25zdCBjaGFyICphZGRyLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCB2OWZzX3RyYW5zX2ZkICp0cyA9IE5VTEw7CisJc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFucyA9IHY5c2VzLT50cmFuc3BvcnQ7CisKKwlpZigodjlzZXMtPndmZG5vID09IH4wKSB8fCAodjlzZXMtPnJmZG5vID09IH4wKSkgeworCQlwcmludGsoS0VSTl9FUlIgInY5ZnM6IEluc3VmZmljaWVudCBvcHRpb25zIGZvciBwcm90bz1mZFxuIik7CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJc2VtYV9pbml0KCZ0cmFucy0+d3JpdGVsb2NrLCAxKTsKKwlzZW1hX2luaXQoJnRyYW5zLT5yZWFkbG9jaywgMSk7CisKKwl0cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2OWZzX3RyYW5zX2ZkKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRzLT5pbl9maWxlID0gZmdldCggdjlzZXMtPnJmZG5vICk7CisJdHMtPm91dF9maWxlID0gZmdldCggdjlzZXMtPndmZG5vICk7CisKKwlpZiAoIXRzLT5pbl9maWxlIHx8ICF0cy0+b3V0X2ZpbGUpIHsKKwkJaWYgKHRzLT5pbl9maWxlKQorCQkJZnB1dCh0cy0+aW5fZmlsZSk7CisKKwkJaWYgKHRzLT5vdXRfZmlsZSkKKwkJCWZwdXQodHMtPm91dF9maWxlKTsKKworCQlrZnJlZSh0cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXRyYW5zLT5wcml2ID0gdHM7CisJdHJhbnMtPnN0YXR1cyA9IENvbm5lY3RlZDsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogdjlmc19mZF9jbG9zZSAtIHNodXRkb3duIGZpbGUgZGVzY3JpcHRvcgorICogQHRyYW5zOiBwcml2YXRlIHNvY2tldCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgdjlmc19mZF9jbG9zZShzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zKQoreworCXN0cnVjdCB2OWZzX3RyYW5zX2ZkICp0czsKKworCWlmICghdHJhbnMpCisJCXJldHVybjsKKworCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CisJdHMgPSB0cmFucy0+cHJpdjsKKworCWlmICghdHMpCisJCXJldHVybjsKKworCWlmICh0cy0+aW5fZmlsZSkKKwkJZnB1dCh0cy0+aW5fZmlsZSk7CisKKwlpZiAodHMtPm91dF9maWxlKQorCQlmcHV0KHRzLT5vdXRfZmlsZSk7CisKKwlrZnJlZSh0cyk7Cit9CisKK3N0cnVjdCB2OWZzX3RyYW5zcG9ydCB2OWZzX3RyYW5zX2ZkID0geworCS5pbml0ID0gdjlmc19mZF9pbml0LAorCS53cml0ZSA9IHY5ZnNfZmRfc2VuZCwKKwkucmVhZCA9IHY5ZnNfZmRfcmVjdiwKKwkuY2xvc2UgPSB2OWZzX2ZkX2Nsb3NlLAorfTsKKwpkaWZmIC0tZ2l0IGEvZnMvOXAvdHJhbnNfc29jay5jIGIvZnMvOXAvdHJhbnNfc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTI2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC90cmFuc19zb2NrLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBsaW51eC9mcy85cC90cmFuc19zb2NrZXQuYworICoKKyAqIFNvY2tldCBUcmFuc3BvcnQgTGF5ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQHNhcm5vZmYuY29tPgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91bi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisKKyNkZWZpbmUgVjlGU19QT1JUIDU2NAorCitzdHJ1Y3Qgdjlmc190cmFuc19zb2NrIHsKKwlzdHJ1Y3Qgc29ja2V0ICpzOworfTsKKworLyoqCisgKiB2OWZzX3NvY2tfcmVjdiAtIHJlY2VpdmUgZnJvbSBhIHNvY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAdjogYnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBpbnRvCisgKiBAbGVuOiBzaXplIG9mIHJlY2VpdmUgYnVmZmVyCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19zb2NrX3JlY3Yoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFucywgdm9pZCAqdiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJaW50IHJlc3VsdDsKKwltbV9zZWdtZW50X3Qgb2xkZnM7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHMgPSB0cmFucyA/IHRyYW5zLT5wcml2IDogTlVMTDsKKworCWlmICh0cmFucy0+c3RhdHVzID09IERpc2Nvbm5lY3RlZCkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlyZXN1bHQgPSAtRUlOVkFMOworCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCisJaW92Lmlvdl9iYXNlID0gdjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX25hbWVsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7CisKKwlyZXN1bHQgPSBrZXJuZWxfcmVjdm1zZyh0cy0+cywgJm1zZywgJmlvdiwgMSwgbGVuLCAwKTsKKworCWRwcmludGsoREVCVUdfVFJBTlMsICJzb2NrZXQgc3RhdGUgJWRcbiIsIHRzLT5zLT5zdGF0ZSk7CisJc2V0X2ZzKG9sZGZzKTsKKworCWlmIChyZXN1bHQgPD0gMCkgeworCQlpZiAocmVzdWx0ICE9IC1FUkVTVEFSVFNZUykKKwkJCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiB2OWZzX3NvY2tfc2VuZCAtIHNlbmQgdG8gYSBzb2NrZXQKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQHY6IGJ1ZmZlciB0byBzZW5kIGRhdGEgZnJvbQorICogQGxlbjogc2l6ZSBvZiBzZW5kIGJ1ZmZlcgorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfc29ja19zZW5kKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMsIHZvaWQgKnYsIGludCBsZW4pCit7CisJc3RydWN0IGt2ZWMgaW92OworCXN0cnVjdCBtc2doZHIgbXNnOworCWludCByZXN1bHQgPSAtMTsKKwltbV9zZWdtZW50X3Qgb2xkZnM7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHMgPSB0cmFucyA/IHRyYW5zLT5wcml2IDogTlVMTDsKKworCWRwcmludGsoREVCVUdfVFJBTlMsICJTZW5kaW5nIHBhY2tldCBzaXplICVkICgleClcbiIsIGxlbiwgbGVuKTsKKwlkdW1wX2RhdGEodiwgbGVuKTsKKworCWRvd24oJnRyYW5zLT53cml0ZWxvY2spOworCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWlvdi5pb3ZfYmFzZSA9IHY7CisJaW92Lmlvdl9sZW4gPSBsZW47CisJbXNnLm1zZ19uYW1lID0gTlVMTDsKKwltc2cubXNnX25hbWVsZW4gPSAwOworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwltc2cubXNnX2ZsYWdzID0gTVNHX05PU0lHTkFMOworCXJlc3VsdCA9IGtlcm5lbF9zZW5kbXNnKHRzLT5zLCAmbXNnLCAmaW92LCAxLCBsZW4pOworCXNldF9mcyhvbGRmcyk7CisKKwlpZiAocmVzdWx0IDwgMCkgeworCQlpZiAocmVzdWx0ICE9IC1FUkVTVEFSVFNZUykKKwkJCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CisJfQorCisJdXAoJnRyYW5zLT53cml0ZWxvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogdjlmc190Y3BfaW5pdCAtIGluaXRpYWxpemUgVENQIHNvY2tldAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAYWRkcjogYWRkcmVzcyBvZiBzZXJ2ZXIgdG8gbW91bnQKKyAqIEBkYXRhOiBtb3VudCBvcHRpb25zCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdGNwX2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgY29uc3QgY2hhciAqYWRkciwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpjc29ja2V0ID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX3NlcnZlcjsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCB2OWZzX3RyYW5zX3NvY2sgKnRzID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zID0gdjlzZXMtPnRyYW5zcG9ydDsKKworCXNlbWFfaW5pdCgmdHJhbnMtPndyaXRlbG9jaywgMSk7CisJc2VtYV9pbml0KCZ0cmFucy0+cmVhZGxvY2ssIDEpOworCisJdHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdjlmc190cmFuc19zb2NrKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyYW5zLT5wcml2ID0gdHM7CisJdHMtPnMgPSBOVUxMOworCisJaWYgKCFhZGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoREVCVUdfVFJBTlMsICJDb25uZWN0aW5nIHRvICVzXG4iLCBhZGRyKTsKKworCXNpbl9zZXJ2ZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luX3NlcnZlci5zaW5fYWRkci5zX2FkZHIgPSBpbl9hdG9uKGFkZHIpOworCXNpbl9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyh2OXNlcy0+cG9ydCk7CisJc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsICZjc29ja2V0KTsKKwlyYyA9IGNzb2NrZXQtPm9wcy0+Y29ubmVjdChjc29ja2V0LAorCQkJCSAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luX3NlcnZlciwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwgMCk7CisJaWYgKHJjIDwgMCkgeworCQllcHJpbnRrKEtFUk5fRVJSLAorCQkJInY5ZnNfdHJhbnNfdGNwOiBwcm9ibGVtIGNvbm5lY3Rpbmcgc29ja2V0IHRvICVzXG4iLAorCQkJYWRkcik7CisJCXJldHVybiByYzsKKwl9CisJY3NvY2tldC0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9JTzsKKwl0cy0+cyA9IGNzb2NrZXQ7CisJdHJhbnMtPnN0YXR1cyA9IENvbm5lY3RlZDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHY5ZnNfdW5peF9pbml0IC0gaW5pdGlhbGl6ZSBVTklYIGRvbWFpbiBzb2NrZXQKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGRldl9uYW1lOiBwYXRoIHRvIG5hbWVkIHBpcGUKKyAqIEBkYXRhOiBtb3VudCBvcHRpb25zCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdW5peF9pbml0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCSAgICAgICBjaGFyICpkYXRhKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc29ja2V0ICpjc29ja2V0OworCXN0cnVjdCBzb2NrYWRkcl91biBzdW5fc2VydmVyOworCXN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnM7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHM7CisKKwlyYyA9IDA7CisJY3NvY2tldCA9IE5VTEw7CisJdHJhbnMgPSB2OXNlcy0+dHJhbnNwb3J0OworCisJaWYgKHN0cmxlbihkZXZfbmFtZSkgPiBVTklYX1BBVEhfTUFYKSB7CisJCWVwcmludGsoS0VSTl9FUlIsICJ2OWZzX3RyYW5zX3VuaXg6IGFkZHJlc3MgdG9vIGxvbmc6ICVzXG4iLAorCQkJZGV2X25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2OWZzX3RyYW5zX3NvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyYW5zLT5wcml2ID0gdHM7CisJdHMtPnMgPSBOVUxMOworCisJc2VtYV9pbml0KCZ0cmFucy0+d3JpdGVsb2NrLCAxKTsKKwlzZW1hX2luaXQoJnRyYW5zLT5yZWFkbG9jaywgMSk7CisKKwlzdW5fc2VydmVyLnN1bl9mYW1pbHkgPSBQRl9VTklYOworCXN0cmNweShzdW5fc2VydmVyLnN1bl9wYXRoLCBkZXZfbmFtZSk7CisJc29ja19jcmVhdGVfa2VybihQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgJmNzb2NrZXQpOworCXJjID0gY3NvY2tldC0+b3BzLT5jb25uZWN0KGNzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3VuX3NlcnZlciwKKwkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikgLSAxLCAwKTsJLyogLTEgKmlzKiBpbXBvcnRhbnQgKi8KKwlpZiAocmMgPCAwKSB7CisJCWVwcmludGsoS0VSTl9FUlIsCisJCQkidjlmc190cmFuc191bml4OiBwcm9ibGVtIGNvbm5lY3Rpbmcgc29ja2V0OiAlczogJWRcbiIsCisJCQlkZXZfbmFtZSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCWNzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PSU87CisJdHMtPnMgPSBjc29ja2V0OworCXRyYW5zLT5zdGF0dXMgPSBDb25uZWN0ZWQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2OWZzX3NvY2tfY2xvc2UgLSBzaHV0ZG93biBzb2NrZXQKKyAqIEB0cmFuczogcHJpdmF0ZSBzb2NrZXQgc3RydWN0dXJlCisgKgorICovCisKK3N0YXRpYyB2b2lkIHY5ZnNfc29ja19jbG9zZShzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zKQoreworCXN0cnVjdCB2OWZzX3RyYW5zX3NvY2sgKnRzOworCisJaWYgKCF0cmFucykKKwkJcmV0dXJuOworCisJdHMgPSB0cmFucy0+cHJpdjsKKworCWlmICgodHMpICYmICh0cy0+cykpIHsKKwkJZHByaW50ayhERUJVR19UUkFOUywgImNsb3NpbmcgdGhlIHNvY2tldCAlcFxuIiwgdHMtPnMpOworCQlzb2NrX3JlbGVhc2UodHMtPnMpOworCQl0cy0+cyA9IE5VTEw7CisJCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CisJCWRwcmludGsoREVCVUdfVFJBTlMsICJzb2NrZXQgY2xvc2VkXG4iKTsKKwl9CisKKwlpZiAodHMpCisJCWtmcmVlKHRzKTsKKworCXRyYW5zLT5wcml2ID0gTlVMTDsKK30KKworc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfdGNwID0geworCS5pbml0ID0gdjlmc190Y3BfaW5pdCwKKwkud3JpdGUgPSB2OWZzX3NvY2tfc2VuZCwKKwkucmVhZCA9IHY5ZnNfc29ja19yZWN2LAorCS5jbG9zZSA9IHY5ZnNfc29ja19jbG9zZSwKK307CisKK3N0cnVjdCB2OWZzX3RyYW5zcG9ydCB2OWZzX3RyYW5zX3VuaXggPSB7CisJLmluaXQgPSB2OWZzX3VuaXhfaW5pdCwKKwkud3JpdGUgPSB2OWZzX3NvY2tfc2VuZCwKKwkucmVhZCA9IHY5ZnNfc29ja19yZWN2LAorCS5jbG9zZSA9IHY5ZnNfc29ja19jbG9zZSwKK307CmRpZmYgLS1naXQgYS9mcy85cC90cmFuc3BvcnQuaCBiL2ZzLzlwL3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC90cmFuc3BvcnQuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogbGludXgvZnMvOXAvdHJhbnNwb3J0LmgKKyAqCisgKiBUcmFuc3BvcnQgRGVmaW5pdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKK2VudW0gdjlmc190cmFuc3BvcnRfc3RhdHVzIHsKKwlDb25uZWN0ZWQsCisJRGlzY29ubmVjdGVkLAorCUh1bmcsCit9OworCitzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgeworCWVudW0gdjlmc190cmFuc3BvcnRfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHdyaXRlbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJlYWRsb2NrOworCXZvaWQgKnByaXY7CisKKwlpbnQgKCppbml0KSAoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKKwlpbnQgKCp3cml0ZSkgKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqLCB2b2lkICosIGludCk7CisJaW50ICgqcmVhZCkgKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqLCB2b2lkICosIGludCk7CisJdm9pZCAoKmNsb3NlKSAoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICopOworfTsKKworZXh0ZXJuIHN0cnVjdCB2OWZzX3RyYW5zcG9ydCB2OWZzX3RyYW5zX3RjcDsKK2V4dGVybiBzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgdjlmc190cmFuc191bml4OworZXh0ZXJuIHN0cnVjdCB2OWZzX3RyYW5zcG9ydCB2OWZzX3RyYW5zX2ZkOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5jIGIvZnMvOXAvdjlmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmRiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92OWZzLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiAgbGludXgvZnMvOXAvdjlmcy5jCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgYXNzaXN0aW5nIGluIG1hcHBpbmcgVkZTIHRvIDlQMjAwMAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgIjlwLmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJtdXguaCIKKyNpbmNsdWRlICJjb252LmgiCisKKy8qIFRPRE86IHN5c2ZzIG9yIGRlYnVnZnMgaW50ZXJmYWNlICovCitpbnQgdjlmc19kZWJ1Z19sZXZlbCA9IDA7CS8qIGZlYXR1cmUtcmlmaWMgZ2xvYmFsIGRlYnVnIGxldmVsICAqLworCisvKgorICAqIE9wdGlvbiBQYXJzaW5nIChjb2RlIGluc3BpcmVkIGJ5IE5GUyBjb2RlKQorICAqCisgICovCisKK2VudW0geworCS8qIE9wdGlvbnMgdGhhdCB0YWtlIGludGVnZXIgYXJndW1lbnRzICovCisJT3B0X3BvcnQsIE9wdF9tc2l6ZSwgT3B0X3VpZCwgT3B0X2dpZCwgT3B0X2FmaWQsIE9wdF9kZWJ1ZywKKwlPcHRfcmZkbm8sIE9wdF93ZmRubywKKwkvKiBTdHJpbmcgb3B0aW9ucyAqLworCU9wdF9uYW1lLCBPcHRfcmVtb3RlbmFtZSwKKwkvKiBPcHRpb25zIHRoYXQgdGFrZSBubyBhcmd1bWVudHMgKi8KKwlPcHRfbGVnYWN5LCBPcHRfbm9kZXZtYXAsIE9wdF91bml4LCBPcHRfdGNwLCBPcHRfZmQsCisJLyogRXJyb3IgdG9rZW4gKi8KKwlPcHRfZXJyCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9wb3J0LCAicG9ydD0ldSJ9LAorCXtPcHRfbXNpemUsICJtc2l6ZT0ldSJ9LAorCXtPcHRfdWlkLCAidWlkPSV1In0sCisJe09wdF9naWQsICJnaWQ9JXUifSwKKwl7T3B0X2FmaWQsICJhZmlkPSV1In0sCisJe09wdF9yZmRubywgInJmZG5vPSV1In0sCisJe09wdF93ZmRubywgIndmZG5vPSV1In0sCisJe09wdF9kZWJ1ZywgImRlYnVnPSV1In0sCisJe09wdF9uYW1lLCAibmFtZT0lcyJ9LAorCXtPcHRfcmVtb3RlbmFtZSwgImFuYW1lPSVzIn0sCisJe09wdF91bml4LCAicHJvdG89dW5peCJ9LAorCXtPcHRfdGNwLCAicHJvdG89dGNwIn0sCisJe09wdF9mZCwgInByb3RvPWZkIn0sCisJe09wdF90Y3AsICJ0Y3AifSwKKwl7T3B0X3VuaXgsICJ1bml4In0sCisJe09wdF9mZCwgImZkIn0sCisJe09wdF9sZWdhY3ksICJub2V4dGVuZCJ9LAorCXtPcHRfbm9kZXZtYXAsICJub2Rldm1hcCJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworLyoKKyAqICBQYXJzZSBvcHRpb24gc3RyaW5nLgorICovCisKKy8qKgorICogdjlmc19wYXJzZV9vcHRpb25zIC0gcGFyc2UgbW91bnQgb3B0aW9ucyBpbnRvIHNlc3Npb24gc3RydWN0dXJlCisgKiBAb3B0aW9uczogb3B0aW9ucyBzdHJpbmcgcGFzc2VkIGZyb20gbW91bnQKKyAqIEB2OXNlczogZXhpc3RpbmcgdjlmcyBzZXNzaW9uIGluZm9ybWF0aW9uCisgKgorICovCisKK3N0YXRpYyB2b2lkIHY5ZnNfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBvcHRpb247CisJaW50IHJldDsKKworCS8qIHNldHVwIGRlZmF1bHRzICovCisJdjlzZXMtPnBvcnQgPSBWOUZTX1BPUlQ7CisJdjlzZXMtPm1heGRhdGEgPSA5MDAwOworCXY5c2VzLT5wcm90byA9IFBST1RPX1RDUDsKKwl2OXNlcy0+ZXh0ZW5kZWQgPSAxOworCXY5c2VzLT5hZmlkID0gfjA7CisJdjlzZXMtPmRlYnVnID0gMDsKKwl2OXNlcy0+cmZkbm8gPSB+MDsKKwl2OXNlcy0+d2Zkbm8gPSB+MDsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCWlmICh0b2tlbiA8IE9wdF9uYW1lKSB7CisJCQlpZiAoKHJldCA9IG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpIDwgMCkgeworCQkJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkJCSJpbnRlZ2VyIGZpZWxkLCBidXQgbm8gaW50ZWdlcj9cbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCX0KKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9wb3J0OgorCQkJdjlzZXMtPnBvcnQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbXNpemU6CisJCQl2OXNlcy0+bWF4ZGF0YSA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91aWQ6CisJCQl2OXNlcy0+dWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCXY5c2VzLT5naWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYWZpZDoKKwkJCXY5c2VzLT5hZmlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3JmZG5vOgorCQkJdjlzZXMtPnJmZG5vID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3dmZG5vOgorCQkJdjlzZXMtPndmZG5vID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RlYnVnOgorCQkJdjlzZXMtPmRlYnVnID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3RjcDoKKwkJCXY5c2VzLT5wcm90byA9IFBST1RPX1RDUDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91bml4OgorCQkJdjlzZXMtPnByb3RvID0gUFJPVE9fVU5JWDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9mZDoKKwkJCXY5c2VzLT5wcm90byA9IFBST1RPX0ZEOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25hbWU6CisJCQltYXRjaF9zdHJjcHkodjlzZXMtPm5hbWUsICZhcmdzWzBdKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZW1vdGVuYW1lOgorCQkJbWF0Y2hfc3RyY3B5KHY5c2VzLT5yZW1vdGVuYW1lLCAmYXJnc1swXSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbGVnYWN5OgorCQkJdjlzZXMtPmV4dGVuZGVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2Rldm1hcDoKKwkJCXY5c2VzLT5ub2RldiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJfQorfQorCisvKioKKyAqIHY5ZnNfaW5vZGUydjlzZXMgLSBzYWZlbHkgZXh0cmFjdCB2OWZzIHNlc3Npb24gaW5mbyBmcm9tIHN1cGVyIGJsb2NrCisgKiBAaW5vZGU6IGlub2RlIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbQorICoKKyAqIFBhcmFub2lkIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdjlzZXMgaW5mb3JtYXRpb24gZnJvbSBzdXBlcmJsb2NrLAorICogaWYgYW55dGhpbmcgaXMgbWlzc2luZyBpdCB3aWxsIHJlcG9ydCBhbiBlcnJvci4KKyAqCisgKi8KKworc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OWZzX2lub2RlMnY5c2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zYi0+c19mc19pbmZvKTsKK30KKworLyoqCisgKiB2OWZzX2dldF9pZHBvb2wgLSBhbGxvY2F0ZSBudW1lcmljIGlkIGZyb20gcG9vbAorICogQHAgLSBwb29sIHRvIGFsbG9jYXRlIGZyb20KKyAqCisgKiBYWFggLSBUaGlzIHNlZW1zIHRvIGJlIGFuIGF3ZnVsIGdlbmVyaWMgZnVuY3Rpb24sIHNob3VsZCBpdCBiZSBpbiBpZHIuYyB3aXRoCisgKiAgICAgICAgICAgIHRoZSBsb2NrIGluY2x1ZGVkIGluIHN0cnVjdCBpZHI/CisgKi8KKworaW50IHY5ZnNfZ2V0X2lkcG9vbChzdHJ1Y3Qgdjlmc19pZHBvb2wgKnApCit7CisJaW50IGkgPSAwOworCWludCBlcnJvcjsKKworcmV0cnk6CisJaWYgKGlkcl9wcmVfZ2V0KCZwLT5wb29sLCBHRlBfS0VSTkVMKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnAtPmxvY2spID09IC1FSU5UUikgeworCQllcHJpbnRrKEtFUk5fV0FSTklORywgIkludGVycnVwdGVkIHdoaWxlIGxvY2tpbmdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZXJyb3IgPSBpZHJfZ2V0X25ldygmcC0+cG9vbCwgTlVMTCwgJmkpOworCXVwKCZwLT5sb2NrKTsKKworCWlmIChlcnJvciA9PSAtRUFHQUlOKQorCQlnb3RvIHJldHJ5OworCWVsc2UgaWYgKGVycm9yKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiB2OWZzX3B1dF9pZHBvb2wgLSByZWxlYXNlIG51bWVyaWMgaWQgZnJvbSBwb29sCisgKiBAcCAtIHBvb2wgdG8gYWxsb2NhdGUgZnJvbQorICoKKyAqIFhYWCAtIFRoaXMgc2VlbXMgdG8gYmUgYW4gYXdmdWwgZ2VuZXJpYyBmdW5jdGlvbiwgc2hvdWxkIGl0IGJlIGluIGlkci5jIHdpdGgKKyAqICAgICAgICAgICAgdGhlIGxvY2sgaW5jbHVkZWQgaW4gc3RydWN0IGlkcj8KKyAqLworCit2b2lkIHY5ZnNfcHV0X2lkcG9vbChpbnQgaWQsIHN0cnVjdCB2OWZzX2lkcG9vbCAqcCkKK3sKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwLT5sb2NrKSA9PSAtRUlOVFIpIHsKKwkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJJbnRlcnJ1cHRlZCB3aGlsZSBsb2NraW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZHJfcmVtb3ZlKCZwLT5wb29sLCBpZCk7CisJdXAoJnAtPmxvY2spOworfQorCisvKioKKyAqIHY5ZnNfc2Vzc2lvbl9pbml0IC0gaW5pdGlhbGl6ZSBzZXNzaW9uCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiBAZGV2X25hbWU6IGRldmljZSBiZWluZyBtb3VudGVkCisgKiBAZGF0YTogb3B0aW9ucworICoKKyAqLworCitpbnQKK3Y5ZnNfc2Vzc2lvbl9pbml0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCisJCSAgY29uc3QgY2hhciAqZGV2X25hbWUsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zX3Byb3RvOworCWludCBuID0gMDsKKwlpbnQgbmV3ZmlkID0gLTE7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisKKwl2OXNlcy0+bmFtZSA9IF9fZ2V0bmFtZSgpOworCWlmICghdjlzZXMtPm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJdjlzZXMtPnJlbW90ZW5hbWUgPSBfX2dldG5hbWUoKTsKKwlpZiAoIXY5c2VzLT5yZW1vdGVuYW1lKSB7CisJCXB1dG5hbWUodjlzZXMtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdHJjcHkodjlzZXMtPm5hbWUsIFY5RlNfREVGVVNFUik7CisJc3RyY3B5KHY5c2VzLT5yZW1vdGVuYW1lLCBWOUZTX0RFRkFOQU1FKTsKKworCXY5ZnNfcGFyc2Vfb3B0aW9ucyhkYXRhLCB2OXNlcyk7CisKKwkvKiBzZXQgZ2xvYmFsIGRlYnVnIGxldmVsICovCisJdjlmc19kZWJ1Z19sZXZlbCA9IHY5c2VzLT5kZWJ1ZzsKKworCS8qIGlkIHBvb2xzIHRoYXQgYXJlIHNlc3Npb24tZGVwZW5kZW50OiBGSURzIGFuZCBUSURzICovCisJaWRyX2luaXQoJnY5c2VzLT5maWRwb29sLnBvb2wpOworCWluaXRfTVVURVgoJnY5c2VzLT5maWRwb29sLmxvY2spOworCWlkcl9pbml0KCZ2OXNlcy0+dGlkcG9vbC5wb29sKTsKKwlpbml0X01VVEVYKCZ2OXNlcy0+dGlkcG9vbC5sb2NrKTsKKworCisJc3dpdGNoICh2OXNlcy0+cHJvdG8pIHsKKwljYXNlIFBST1RPX1RDUDoKKwkJdHJhbnNfcHJvdG8gPSAmdjlmc190cmFuc190Y3A7CisJCWJyZWFrOworCWNhc2UgUFJPVE9fVU5JWDoKKwkJdHJhbnNfcHJvdG8gPSAmdjlmc190cmFuc191bml4OworCQkqdjlzZXMtPnJlbW90ZW5hbWUgPSAwOworCQlicmVhazsKKwljYXNlIFBST1RPX0ZEOgorCQl0cmFuc19wcm90byA9ICZ2OWZzX3RyYW5zX2ZkOworCQkqdjlzZXMtPnJlbW90ZW5hbWUgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgInY5ZnM6IEJhZCBtb3VudCBwcm90b2NvbCAlZFxuIiwgdjlzZXMtPnByb3RvKTsKKwkJcmV0dmFsID0gLUVOT1BST1RPT1BUOworCQlnb3RvIFNlc3NDbGVhblVwOworCX07CisKKwl2OXNlcy0+dHJhbnNwb3J0ID0gdHJhbnNfcHJvdG87CisKKwlpZiAoKHJldHZhbCA9IHY5c2VzLT50cmFuc3BvcnQtPmluaXQodjlzZXMsIGRldl9uYW1lLCBkYXRhKSkgPCAwKSB7CisJCWVwcmludGsoS0VSTl9FUlIsICJwcm9ibGVtIGluaXRpYWxpemluZyB0cmFuc3BvcnRcbiIpOworCQlnb3RvIFNlc3NDbGVhblVwOworCX0KKworCXY5c2VzLT5pbnByb2dyZXNzID0gMDsKKwl2OXNlcy0+c2h1dGRvd24gPSAwOworCXY5c2VzLT5zZXNzaW9uX2h1bmcgPSAwOworCisJaWYgKChyZXR2YWwgPSB2OWZzX211eF9pbml0KHY5c2VzLCBkZXZfbmFtZSkpIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicHJvYmxlbSBpbml0aWFsaXppbmcgbXV4XG4iKTsKKwkJZ290byBTZXNzQ2xlYW5VcDsKKwl9CisKKwlpZiAodjlzZXMtPmFmaWQgPT0gfjApIHsKKwkJaWYgKHY5c2VzLT5leHRlbmRlZCkKKwkJCXJldHZhbCA9CisJCQkgICAgdjlmc190X3ZlcnNpb24odjlzZXMsIHY5c2VzLT5tYXhkYXRhLCAiOVAyMDAwLnUiLAorCQkJCQkgICAmZmNhbGwpOworCQllbHNlCisJCQlyZXR2YWwgPSB2OWZzX3RfdmVyc2lvbih2OXNlcywgdjlzZXMtPm1heGRhdGEsICI5UDIwMDAiLAorCQkJCQkJJmZjYWxsKTsKKworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgInY5ZnNfdF92ZXJzaW9uIGZhaWxlZFxuIik7CisJCQlnb3RvIEZyZWVGY2FsbDsKKwkJfQorCisJCS8qIFJlYWxseSBzaG91bGQgY2hlY2sgZm9yIDlQMSBhbmQgcmVwb3J0IGVycm9yICovCisJCWlmICghc3RyY21wKGZjYWxsLT5wYXJhbXMucnZlcnNpb24udmVyc2lvbiwgIjlQMjAwMC51IikpIHsKKwkJCWRwcmludGsoREVCVUdfOVAsICI5UDIwMDAgVU5JWCBleHRlbnNpb25zIGVuYWJsZWRcbiIpOworCQkJdjlzZXMtPmV4dGVuZGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoREVCVUdfOVAsICI5UDIwMDAgbGVnYWN5IG1vZGUgZW5hYmxlZFxuIik7CisJCQl2OXNlcy0+ZXh0ZW5kZWQgPSAwOworCQl9CisKKwkJbiA9IGZjYWxsLT5wYXJhbXMucnZlcnNpb24ubXNpemU7CisJCWtmcmVlKGZjYWxsKTsKKworCQlpZiAobiA8IHY5c2VzLT5tYXhkYXRhKQorCQkJdjlzZXMtPm1heGRhdGEgPSBuOworCX0KKworCW5ld2ZpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPmZpZHBvb2wpOworCWlmIChuZXdmaWQgPCAwKSB7CisJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAiY291bGRuJ3QgYWxsb2NhdGUgRklEXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBTZXNzQ2xlYW5VcDsKKwl9CisJLyogaXQgaXMgYSBsaXR0bGUgYml0IHVnbHksIGJ1dCB3ZSBoYXZlIHRvIHByZXZlbnQgbmV3ZmlkICovCisJLyogYmVpbmcgdGhlIHNhbWUgYXMgYWZpZCwgc28gaWYgaXQgaXMsIGdldCBhIG5ldyBmaWQgICAgICovCisJaWYgKHY5c2VzLT5hZmlkICE9IH4wICYmIG5ld2ZpZCA9PSB2OXNlcy0+YWZpZCkgeworCQluZXdmaWQgPSB2OWZzX2dldF9pZHBvb2woJnY5c2VzLT5maWRwb29sKTsKKwkJaWYgKG5ld2ZpZCA8IDApIHsKKwkJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAiY291bGRuJ3QgYWxsb2NhdGUgRklEXG4iKTsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIFNlc3NDbGVhblVwOworCQl9CisJfQorCisJaWYgKChyZXR2YWwgPQorCSAgICAgdjlmc190X2F0dGFjaCh2OXNlcywgdjlzZXMtPm5hbWUsIHY5c2VzLT5yZW1vdGVuYW1lLCBuZXdmaWQsCisJCQkgICB2OXNlcy0+YWZpZCwgTlVMTCkpCisJICAgIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2Fubm90IGF0dGFjaFxuIik7CisJCWdvdG8gU2Vzc0NsZWFuVXA7CisJfQorCisJaWYgKHY5c2VzLT5hZmlkICE9IH4wKSB7CisJCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIHY5c2VzLT5hZmlkLCBOVUxMKSkKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmYWlsZWRcbiIpOworCX0KKworCXJldHVybiBuZXdmaWQ7CisKKyAgICAgIEZyZWVGY2FsbDoKKwlrZnJlZShmY2FsbCk7CisKKyAgICAgIFNlc3NDbGVhblVwOgorCXY5ZnNfc2Vzc2lvbl9jbG9zZSh2OXNlcyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB2OWZzX3Nlc3Npb25fY2xvc2UgLSBzaHV0ZG93biBhIHNlc3Npb24KKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKi8KKwordm9pZCB2OWZzX3Nlc3Npb25fY2xvc2Uoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcykKK3sKKwlpZiAodjlzZXMtPnJlY3Zwcm9jKSB7CisJCXNlbmRfc2lnKFNJR0tJTEwsIHY5c2VzLT5yZWN2cHJvYywgMSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnY5c2VzLT5wcm9jY21wbCk7CisJfQorCisJaWYgKHY5c2VzLT50cmFuc3BvcnQpCisJCXY5c2VzLT50cmFuc3BvcnQtPmNsb3NlKHY5c2VzLT50cmFuc3BvcnQpOworCisJcHV0bmFtZSh2OXNlcy0+bmFtZSk7CisJcHV0bmFtZSh2OXNlcy0+cmVtb3RlbmFtZSk7Cit9CisKKy8qKgorICogdjlmc19zZXNzaW9uX2NhbmNlbCAtIG1hcmsgdHJhbnNwb3J0IGFzIGRpc2Nvbm5lY3RlZAorICogCWFuZCBjYW5jZWwgYWxsIHBlbmRpbmcgcmVxdWVzdHMuCisgKi8KK3ZvaWQgdjlmc19zZXNzaW9uX2NhbmNlbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKSB7CisJdjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzID0gRGlzY29ubmVjdGVkOworCXY5ZnNfbXV4X2NhbmNlbF9yZXF1ZXN0cyh2OXNlcywgLUVJTyk7Cit9CisKK2V4dGVybiBpbnQgdjlmc19lcnJvcl9pbml0KHZvaWQpOworCisvKioKKyAqIHY5ZnNfaW5pdCAtIEluaXRpYWxpemUgbW9kdWxlCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdjlmcyh2b2lkKQoreworCXY5ZnNfZXJyb3JfaW5pdCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdGFsbGluZyB2OWZzIDlQMjAwMCBmaWxlIHN5c3RlbSBzdXBwb3J0XG4iKTsKKworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZ2OWZzX2ZzX3R5cGUpOworfQorCisvKioKKyAqIHY5ZnNfaW5pdCAtIHNodXRkb3duIG1vZHVsZQorICoKKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF92OWZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ2OWZzX2ZzX3R5cGUpOworfQorCittb2R1bGVfaW5pdChpbml0X3Y5ZnMpCittb2R1bGVfZXhpdChleGl0X3Y5ZnMpCisKK01PRFVMRV9BVVRIT1IoIkVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy85cC92OWZzLmggYi9mcy85cC92OWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkY2VmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Y5ZnMuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIFY5RlMgZGVmaW5pdGlvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisvKgorICAqIElkcG9vbCBzdHJ1Y3R1cmUgcHJvdmlkZXMgbG9jayBhbmQgaWQgbWFuYWdlbWVudAorICAqCisgICovCisKK3N0cnVjdCB2OWZzX2lkcG9vbCB7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCXN0cnVjdCBpZHIgcG9vbDsKK307CisKKy8qCisgICogU2Vzc2lvbiBzdHJ1Y3R1cmUgcHJvdmlkZXMgaW5mb3JtYXRpb24gZm9yIGFuIG9wZW5lZCBzZXNzaW9uCisgICoKKyAgKi8KKworc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvIHsKKwkvKiBvcHRpb25zICovCisJdW5zaWduZWQgaW50IG1heGRhdGE7CisJdW5zaWduZWQgY2hhciBleHRlbmRlZDsJLyogc2V0IHRvIDEgaWYgd2UgYXJlIHVzaW5nIFVOSVggZXh0ZW5zaW9ucyAqLworCXVuc2lnbmVkIGNoYXIgbm9kZXY7CS8qIHNldCB0byAxIGlmIG5vIGRpc2FibGUgZGV2aWNlIG1hcHBpbmcgKi8KKwl1bnNpZ25lZCBzaG9ydCBwb3J0OwkvKiBwb3J0IHRvIGNvbm5lY3QgdG8gKi8KKwl1bnNpZ25lZCBzaG9ydCBkZWJ1ZzsJLyogZGVidWcgbGV2ZWwgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm90bzsJLyogcHJvdG9jb2wgdG8gdXNlICovCisJdW5zaWduZWQgaW50IGFmaWQ7CS8qIGF1dGhlbnRpY2F0aW9uIGZpZCAqLworCXVuc2lnbmVkIGludCByZmRubzsJLyogcmVhZCBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHdmZG5vOwkvKiB3cml0ZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyICovCisKKworCWNoYXIgKm5hbWU7CQkvKiB1c2VyIG5hbWUgdG8gbW91bnQgYXMgKi8KKwljaGFyICpyZW1vdGVuYW1lOwkvKiBuYW1lIG9mIHJlbW90ZSBoaWVyYXJjaHkgYmVpbmcgbW91bnRlZCAqLworCXVuc2lnbmVkIGludCB1aWQ7CS8qIGRlZmF1bHQgdWlkL211aWQgZm9yIGxlZ2FjeSBzdXBwb3J0ICovCisJdW5zaWduZWQgaW50IGdpZDsJLyogZGVmYXVsdCBnaWQgZm9yIGxlZ2FjeSBzdXBwb3J0ICovCisKKwkvKiBib29rIGtlZXBpbmcgKi8KKwlzdHJ1Y3Qgdjlmc19pZHBvb2wgZmlkcG9vbDsJLyogVGhlIEZJRCBwb29sIGZvciBmaWxlIGRlc2NyaXB0b3JzICovCisJc3RydWN0IHY5ZnNfaWRwb29sIHRpZHBvb2w7CS8qIFRoZSBUSUQgcG9vbCBmb3IgdHJhbnNhY3Rpb25zIGlkcyAqLworCisJLyogdHJhbnNwb3J0IGluZm9ybWF0aW9uICovCisJc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisKKwlpbnQgaW5wcm9ncmVzczsJCS8qIHNlc3Npb24gaW4gcHJvZ3Jlc3MgPT4gdHJ1ZSAqLworCWludCBzaHV0ZG93bjsJCS8qIHNlc3Npb24gc2h1dHRpbmcgZG93bi4gbm8gbW9yZSBhdHRhY2hlcy4gKi8KKwl1bnNpZ25lZCBjaGFyIHNlc3Npb25faHVuZzsKKworCS8qIG11eCBwcml2YXRlIGRhdGEgKi8KKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqY3VyZmNhbGw7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OworCXN0cnVjdCBjb21wbGV0aW9uIGZjcmVhZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBwcm9jY21wbDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlY3Zwcm9jOworCisJc3BpbmxvY2tfdCBtdXhsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgbXV4X2ZjYWxsczsKK307CisKKy8qIHBvc3NpYmxlIHZhbHVlcyBvZiAtPnByb3RvICovCitlbnVtIHsKKwlQUk9UT19UQ1AsCisJUFJPVE9fVU5JWCwKKwlQUk9UT19GRCwKK307CisKK2ludCB2OWZzX3Nlc3Npb25faW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgY29uc3QgY2hhciAqLCBjaGFyICopOworc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OWZzX2lub2RlMnY5c2VzKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgdjlmc19zZXNzaW9uX2Nsb3NlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOworaW50IHY5ZnNfZ2V0X2lkcG9vbChzdHJ1Y3Qgdjlmc19pZHBvb2wgKnApOwordm9pZCB2OWZzX3B1dF9pZHBvb2woaW50IGlkLCBzdHJ1Y3Qgdjlmc19pZHBvb2wgKnApOwordm9pZCB2OWZzX3Nlc3Npb25fY2FuY2VsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOworCisjZGVmaW5lIFY5RlNfTUFHSUMgMHgwMTAyMTk5NworCisvKiBvdGhlciBkZWZhdWx0IGdsb2JhbHMgKi8KKyNkZWZpbmUgVjlGU19QT1JUCQk1NjQKKyNkZWZpbmUgVjlGU19ERUZVU0VSCSJub2JvZHkiCisjZGVmaW5lIFY5RlNfREVGQU5BTUUJIiIKKworLyogaW5pdGFsIHBvb2wgc2l6ZXMgZm9yIGZpZHMgYW5kIHRhZ3MgKi8KKyNkZWZpbmUgVjlGU19TVEFSVF9GSURTIDgxOTIKKyNkZWZpbmUgVjlGU19TVEFSVF9USURTIDI1NgpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmc192ZnMuaCBiL2ZzLzlwL3Y5ZnNfdmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyY2VhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Y5ZnNfdmZzLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFY5RlMgVkZTIGV4dGVuc2lvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisvKiBwbGFuOSBzZW1hbnRpY3MgYXJlIHRoYXQgY3JlYXRlZCBmaWxlcyBhcmUgaW1wbGljaXRseSBvcGVuZWQuCisgKiBCdXQgbGludXggc2VtYW50aWNzIGFyZSB0aGF0IHlvdSBjYWxsIGNyZWF0ZSwgdGhlbiBvcGVuLgorICogdGhlIHBsYW45IGFwcHJvYWNoIGlzIHN1cGVyaW9yIGFzIGl0IHByb3ZpZGVzIGFuIGF0b21pYworICogb3Blbi4KKyAqIHdlIHRyYWNrIHRoZSBjcmVhdGUgZmlkIGhlcmUuIFdoZW4gdGhlIGZpbGUgaXMgb3BlbmVkLCBpZiBmaWRvcGVuIGlzCisgKiBub24temVybywgd2UgdXNlIHRoZSBmaWQgYW5kIGNhbiBza2lwIHNvbWUgc3RlcHMuCisgKiB0aGVyZSBtYXkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCBJIGRvbid0IGtub3cgaXQuCisgKiBvbmUgQkFEIHdheSBpcyB0byBjbHVuayB0aGUgZmlkIG9uIGNyZWF0ZSwgdGhlbiBvcGVuIGl0IGFnYWluOgorICogeW91IGxvc2UgdGhlIGF0b21pY2l0eSBvZiBmaWxlIG9wZW4KKyAqLworCisvKiBzcGVjaWFsIGNhc2U6CisgKiB1bmxpbmsgY2FsbHMgcmVtb3ZlLCB3aGljaCBpcyBhbiBpbXBsaWNpdCBjbHVuay4gU28gd2UgaGF2ZSB0byB0cmFjaworICogdGhhdCBraW5kIG9mIHRoaW5nIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIGNsdW5rIGEgZGVhZCBmaWQuCisgKi8KKworZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHY5ZnNfZnNfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgdjlmc19kZW50cnlfb3BlcmF0aW9uczsKKworc3RydWN0IGlub2RlICp2OWZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSk7Citpbm9fdCB2OWZzX3FpZDJpbm8oc3RydWN0IHY5ZnNfcWlkICpxaWQpOwordm9pZCB2OWZzX21pc3RhdDJpbm9kZShzdHJ1Y3Qgdjlmc19zdGF0ICosIHN0cnVjdCBpbm9kZSAqLAorCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICopOworaW50IHY5ZnNfZGlyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworaW50IHY5ZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3ZvaWQgdjlmc19pbm9kZTJtaXN0YXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0KTsKK3ZvaWQgdjlmc19kZW50cnlfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICopOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2RlbnRyeS5jIGIvZnMvOXAvdmZzX2RlbnRyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmM5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92ZnNfZGVudHJ5LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAgbGludXgvZnMvOXAvdmZzX2RlbnRyeS5jCisgKgorICogVGhpcyBmaWxlIGNvbnRpYW5zIHZmcyBkZW50cnkgb3BzIGZvciB0aGUgOVAyMDAwIHByb3RvY29sLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgImNvbnYuaCIKKyNpbmNsdWRlICJmaWQuaCIKKworLyoqCisgKiB2OWZzX2RlbnRyeV92YWxpZGF0ZSAtIFZGUyBkY2FjaGUgaG9vayB0byB2YWxpZGF0ZSBjYWNoZQorICogQGRlbnRyeTogIGRlbnRyeSB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZAorICogQG5kOiBwYXRoIGRhdGEKKyAqCisgKiBkY2FjaGUgcmVhbGx5IHNob3VsZG4ndCBiZSB1c2VkIGZvciA5UDIwMDAgYXMgYXQgYWxsIGR1ZSB0bworICogcG90ZW50aWFsIGF0dGFjaGVkIHNlbWFudGljcyB0byBkaXJlY3RvcnkgdHJhdmVyc2FsICh3YWxrKS4KKyAqCisgKiBGVVRVUkU6IGxvb2sgaW50byBob3cgdG8gdXNlIGRjYWNoZSB0byBhbGxvdyBtdWx0aS1zdGFnZQorICogd2Fsa3MgaW4gUGxhbiA5ICYgcG90ZW50aWFsIGZvciBiZXR0ZXIgZGNhY2hlIG9wZXJhdGlvbiB3aGljaAorICogd291bGQgcmVtYWluIHZhbGlkIGZvciBQbGFuIDkgc2VtYW50aWNzLiAgT2xkZXIgdmVyc2lvbnMKKyAqIGhhZCB2YWxpZGF0aW9uIHZpYSBzdGF0IGZvciB0aG9zZSBpbnRlcmVzdGVkLiAgSG93ZXZlciwgc2luY2UKKyAqIHN0YXQgaGFzIHRoZSBzYW1lIGFwcHJveGltYXRlIG92ZXJoZWFkIGFzIHdhbGsgdGhlcmUgcmVhbGx5CisgKiBpcyBubyBkaWZmZXJlbmNlLiAgVGhlIG9ubHkgaW1wcm92ZW1lbnQgd291bGQgYmUgZnJvbSBhCisgKiB0aW1lLWRlY2F5IGNhY2hlIGxpa2UgTkZTIGhhcyBhbmQgdGhhdCB1bmRlcm1pbmVzIHRoZQorICogc3luY2hyb25vdXMgbmF0dXJlIG9mIDlQMjAwMC4KKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX2RlbnRyeV92YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBkZW50cnkgKmRjID0gY3VycmVudC0+ZnMtPnB3ZDsKKworCWRwcmludGsoREVCVUdfVkZTLCAiZGVudHJ5OiAlcyAoJXApXG4iLCBkZW50cnktPmRfaW5hbWUsIGRlbnRyeSk7CisJaWYgKHY5ZnNfZmlkX2xvb2t1cChkZW50cnksIEZJRF9PUCkpIHsKKwkJZHByaW50ayhERUJVR19WRlMsICJWQUxJRFxuIik7CisJCXJldHVybiAxOworCX0KKworCXdoaWxlIChkYyAhPSBOVUxMKSB7CisJCWlmIChkYyA9PSBkZW50cnkpIHsKKwkJCWRwcmludGsoREVCVUdfVkZTLCAiVkFMSURcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRjID09IGRjLT5kX3BhcmVudCkKKwkJCWJyZWFrOworCisJCWRjID0gZGMtPmRfcGFyZW50OworCX0KKworCWRwcmludGsoREVCVUdfVkZTLCAiSU5WQUxJRFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19kZW50cnlfcmVsZWFzZSAtIGNhbGxlZCB3aGVuIGRlbnRyeSBpcyBnb2luZyB0byBiZSBmcmVlZAorICogQGRlbnRyeTogIGRlbnRyeSB0aGF0IGlzIGJlaW5nIHJlbGVhc2UKKyAqCisgKi8KKwordm9pZCB2OWZzX2RlbnRyeV9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiBkZW50cnk6ICVzICglcClcbiIsIGRlbnRyeS0+ZF9pbmFtZSwgZGVudHJ5KTsKKworCWlmIChkZW50cnktPmRfZnNkYXRhICE9IE5VTEwpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZmlkX2xpc3QgPSBkZW50cnktPmRfZnNkYXRhOworCQlzdHJ1Y3Qgdjlmc19maWQgKnRlbXAgPSBOVUxMOworCQlzdHJ1Y3Qgdjlmc19maWQgKmN1cnJlbnRfZmlkID0gTlVMTDsKKwkJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3VycmVudF9maWQsIHRlbXAsIGZpZF9saXN0LCBsaXN0KSB7CisJCQlpZiAodjlmc190X2NsdW5rCisJCQkgICAgKGN1cnJlbnRfZmlkLT52OXNlcywgY3VycmVudF9maWQtPmZpZCwgJmZjYWxsKSkKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2x1bmsgZmFpbGVkOiAlc1xuIiwKKwkJCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKworCQkJdjlmc19wdXRfaWRwb29sKGN1cnJlbnRfZmlkLT5maWQsCisJCQkJCSZjdXJyZW50X2ZpZC0+djlzZXMtPmZpZHBvb2wpOworCisJCQlrZnJlZShmY2FsbCk7CisJCQl2OWZzX2ZpZF9kZXN0cm95KGN1cnJlbnRfZmlkKTsKKwkJfQorCisJCWtmcmVlKGRlbnRyeS0+ZF9mc2RhdGEpOwkvKiBmcmVlIHRoZSBsaXN0X2hlYWQgKi8KKwl9Cit9CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB2OWZzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX3JldmFsaWRhdGUgPSB2OWZzX2RlbnRyeV92YWxpZGF0ZSwKKwkuZF9yZWxlYXNlID0gdjlmc19kZW50cnlfcmVsZWFzZSwKK307CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZGlyLmMgYi9mcy85cC92ZnNfZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3OGE3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Zmc19kaXIuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIGxpbnV4L2ZzLzlwL3Zmc19kaXIuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2ZnMgZGlyZWN0b3J5IG9wcyBmb3IgdGhlIDlQMjAwMCBwcm90b2NvbC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgIjlwLmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJjb252LmgiCisjaW5jbHVkZSAiZmlkLmgiCisKKy8qKgorICogZHRfdHlwZSAtIHJldHVybiBmaWxlIHR5cGUKKyAqIEBtaXN0YXQ6IG1pc3RhdCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZHRfdHlwZShzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQpCit7CisJdW5zaWduZWQgbG9uZyBwZXJtID0gbWlzdGF0LT5tb2RlOworCWludCByZXR0eXBlID0gRFRfUkVHOworCisJaWYgKHBlcm0gJiBWOUZTX0RNRElSKQorCQlyZXR0eXBlID0gRFRfRElSOworCWlmIChwZXJtICYgVjlGU19ETVNZTUxJTkspCisJCXJldHR5cGUgPSBEVF9MTks7CisKKwlyZXR1cm4gcmV0dHlwZTsKK30KKworLyoqCisgKiB2OWZzX2Rpcl9yZWFkZGlyIC0gcmVhZCBhIGRpcmVjdG9yeQorICogQGZpbGVwOiBvcGVuZWQgZmlsZSBzdHJ1Y3R1cmUKKyAqIEBkaXJlbnQ6IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgPz8/CisgKiBAZmlsbGRpcjogZnVuY3Rpb24gdG8gcG9wdWxhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSA/Pz8KKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX2Rpcl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGlub2RlKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGksIG47CisJaW50IGZpZCA9IC0xOworCWludCByZXQgPSAwOworCXN0cnVjdCB2OWZzX3N0YXQgKm1pID0gTlVMTDsKKwlpbnQgb3ZlciA9IDA7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIm5hbWUgJXNcbiIsIGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlmaWQgPSBmaWxlLT5maWQ7CisKKwltaSA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEsIEdGUF9LRVJORUwpOworCWlmICghbWkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGZpbGUtPnJkaXJfZmNhbGwgJiYgKGZpbHAtPmZfcG9zICE9IGZpbGUtPnJkaXJfcG9zKSkgeworCQlrZnJlZShmaWxlLT5yZGlyX2ZjYWxsKTsKKwkJZmlsZS0+cmRpcl9mY2FsbCA9IE5VTEw7CisJfQorCisJaWYgKGZpbGUtPnJkaXJfZmNhbGwpIHsKKwkJbiA9IGZpbGUtPnJkaXJfZmNhbGwtPnBhcmFtcy5ycmVhZC5jb3VudDsKKwkJaSA9IGZpbGUtPnJkaXJfZnBvczsKKwkJd2hpbGUgKGkgPCBuKSB7CisJCQlpbnQgcyA9IHY5ZnNfZGVzZXJpYWxpemVfc3RhdCh2OXNlcywKKwkJCQkgIGZpbGUtPnJkaXJfZmNhbGwtPnBhcmFtcy5ycmVhZC5kYXRhICsgaSwKKwkJCSAgICAgICAgICBuIC0gaSwgbWksIHY5c2VzLT5tYXhkYXRhKTsKKworCQkJaWYgKHMgPT0gMCkgeworCQkJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkJCSJlcnJvciB3aGlsZSBkZXNlcmlhbGl6aW5nIG1pc3RhdFxuIik7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlnb3RvIEZyZWVTdHJ1Y3RzOworCQkJfQorCisJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIG1pLT5uYW1lLCBzdHJsZW4obWktPm5hbWUpLAorCQkJCSAgICBmaWxwLT5mX3Bvcywgdjlmc19xaWQyaW5vKCZtaS0+cWlkKSwKKwkJCQkgICAgZHRfdHlwZShtaSkpOworCisJCQlpZiAob3ZlcikgeworCQkJCWZpbGUtPnJkaXJfZnBvcyA9IGk7CisJCQkJZmlsZS0+cmRpcl9wb3MgPSBmaWxwLT5mX3BvczsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaSArPSBzOworCQkJZmlscC0+Zl9wb3MgKz0gczsKKwkJfQorCisJCWlmICghb3ZlcikgeworCQkJa2ZyZWUoZmlsZS0+cmRpcl9mY2FsbCk7CisJCQlmaWxlLT5yZGlyX2ZjYWxsID0gTlVMTDsKKwkJfQorCX0KKworCXdoaWxlICghb3ZlcikgeworCQlyZXQgPSB2OWZzX3RfcmVhZCh2OXNlcywgZmlkLCBmaWxwLT5mX3BvcywKKwkJCQkJICAgIHY5c2VzLT5tYXhkYXRhLVY5RlNfSU9IRFJTWiwgJmZjYWxsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJlcnJvciB3aGlsZSByZWFkaW5nOiAlZDogJXBcbiIsCisJCQkJcmV0LCBmY2FsbCk7CisJCQlnb3RvIEZyZWVTdHJ1Y3RzOworCQl9IGVsc2UgaWYgKHJldCA9PSAwKQorCQkJYnJlYWs7CisKKwkJbiA9IHJldDsKKwkJaSA9IDA7CisJCXdoaWxlIChpIDwgbikgeworCQkJaW50IHMgPSB2OWZzX2Rlc2VyaWFsaXplX3N0YXQodjlzZXMsCisJCQkgICAgICAgICAgZmNhbGwtPnBhcmFtcy5ycmVhZC5kYXRhICsgaSwgbiAtIGksIG1pLAorCQkJICAgICAgICAgIHY5c2VzLT5tYXhkYXRhKTsKKworCQkJaWYgKHMgPT0gMCkgeworCQkJCWRwcmludGsoREVCVUdfRVJST1IsCisJCQkJCSJlcnJvciB3aGlsZSBkZXNlcmlhbGl6aW5nIG1pc3RhdFxuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisKKwkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgbWktPm5hbWUsIHN0cmxlbihtaS0+bmFtZSksCisJCQkJICAgIGZpbHAtPmZfcG9zLCB2OWZzX3FpZDJpbm8oJm1pLT5xaWQpLAorCQkJCSAgICBkdF90eXBlKG1pKSk7CisKKwkJCWlmIChvdmVyKSB7CisJCQkJZmlsZS0+cmRpcl9mY2FsbCA9IGZjYWxsOworCQkJCWZpbGUtPnJkaXJfZnBvcyA9IGk7CisJCQkJZmlsZS0+cmRpcl9wb3MgPSBmaWxwLT5mX3BvczsKKwkJCQlmY2FsbCA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWkgKz0gczsKKwkJCWZpbHAtPmZfcG9zICs9IHM7CisJCX0KKworCQlrZnJlZShmY2FsbCk7CisJfQorCisgICAgICBGcmVlU3RydWN0czoKKwlrZnJlZShmY2FsbCk7CisJa2ZyZWUobWkpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19kaXJfcmVsZWFzZSAtIGNsb3NlIGEgZGlyZWN0b3J5CisgKiBAaW5vZGU6IGlub2RlIG9mIHRoZSBkaXJlY3RvcnkKKyAqIEBmaWxwOiBmaWxlIHBvaW50ZXIgdG8gYSBkaXJlY3RvcnkKKyAqCisgKi8KKworaW50IHY5ZnNfZGlyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCBmaWRudW0gPSAtMTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiaW5vZGU6ICVwIGZpbHA6ICVwIGZpZDogJWRcbiIsIGlub2RlLCBmaWxwLAorCQlmaWQtPmZpZCk7CisJZmlkbnVtID0gZmlkLT5maWQ7CisKKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisKKwlpZiAoZmlkbnVtID49IDApIHsKKwkJZmlkLT5maWRvcGVuLS07CisJCWRwcmludGsoREVCVUdfVkZTLCAiZmlkb3BlbjogJWQgdjlmLT5maWQ6ICVkXG4iLCBmaWQtPmZpZG9wZW4sCisJCQlmaWQtPmZpZCk7CisKKwkJaWYgKGZpZC0+Zmlkb3BlbiA9PSAwKSB7CisJCQlpZiAodjlmc190X2NsdW5rKHY5c2VzLCBmaWRudW0sIE5VTEwpKQorCQkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmYWlsZWRcbiIpOworCisJCQl2OWZzX3B1dF9pZHBvb2woZmlkLT5maWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisJCX0KKworCQlrZnJlZShmaWQtPnJkaXJfZmNhbGwpOworCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCXY5ZnNfZmlkX2Rlc3Ryb3koZmlkKTsKKwl9CisKKwlkX2Ryb3AoZmlscC0+Zl9kZW50cnkpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQgPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyID0gdjlmc19kaXJfcmVhZGRpciwKKwkub3BlbiA9IHY5ZnNfZmlsZV9vcGVuLAorCS5yZWxlYXNlID0gdjlmc19kaXJfcmVsZWFzZSwKK307CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZmlsZS5jIGIvZnMvOXAvdmZzX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhhZTdkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvdmZzX2ZpbGUuYwpAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqICBsaW51eC9mcy85cC92ZnNfZmlsZS5jCisgKgorICogVGhpcyBmaWxlIGNvbnRpYW5zIHZmcyBmaWxlIG9wcyBmb3IgOVAyMDAwLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgIjlwLmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJmaWQuaCIKKworLyoqCisgKiB2OWZzX2ZpbGVfb3BlbiAtIG9wZW4gYSBmaWxlIChvciBkaXJlY3RvcnkpCisgKiBAaW5vZGU6IGlub2RlIHRvIGJlIG9wZW5lZAorICogQGZpbGU6IGZpbGUgYmVpbmcgb3BlbmVkCisgKgorICovCisKK2ludCB2OWZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICp2OWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChmaWxlLT5mX2RlbnRyeSwgRklEX1dBTEspOworCXN0cnVjdCB2OWZzX2ZpZCAqdjluZXdmaWQgPSBOVUxMOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJaW50IG9wZW5fbW9kZSA9IDA7CisJdW5zaWduZWQgaW50IGlvdW5pdCA9IDA7CisJaW50IG5ld2ZpZCA9IC0xOworCWxvbmcgcmVzdWx0ID0gLTE7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgImlub2RlOiAlcCBmaWxlOiAlcCB2OWZpZD0gJXBcbiIsIGlub2RlLCBmaWxlLAorCQl2OWZpZCk7CisKKwlpZiAoIXY5ZmlkKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiQ291bGRuJ3QgcmVzb2x2ZSBmaWQgZnJvbSBkZW50cnlcbiIpOworCisJCS8qIFhYWCAtIHNvbWUgZHVwbGljYXRpb24gZnJvbSBsb29rdXAsIGdlbmVyYWxpemUgbGF0ZXIgKi8KKwkJLyogYmFzaWNhbGx5IHZmc19sb29rdXAgaXMgdG9vIGhlYXZ5IHdlaWdodCAqLworCQl2OWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChmaWxlLT5mX2RlbnRyeSwgRklEX09QKTsKKwkJaWYgKCF2OWZpZCkKKwkJCXJldHVybiAtRUJBREY7CisKKwkJdjlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCwgRklEX1dBTEspOworCQlpZiAoIXY5ZmlkKQorCQkJcmV0dXJuIC1FQkFERjsKKworCQluZXdmaWQgPSB2OWZzX2dldF9pZHBvb2woJnY5c2VzLT5maWRwb29sKTsKKwkJaWYgKG5ld2ZpZCA8IDApIHsKKwkJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAibmV3ZmlkIGZhaWxzIVxuIik7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCisJCXJlc3VsdCA9CisJCSAgICB2OWZzX3Rfd2Fsayh2OXNlcywgdjlmaWQtPmZpZCwgbmV3ZmlkLAorCQkJCShjaGFyICopZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLCBOVUxMKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicmV3YWxrIGRpZG4ndCB3b3JrXG4iKTsKKwkJCXJldHVybiAtRUJBREY7CisJCX0KKworCQl2OWZpZCA9IHY5ZnNfZmlkX2NyZWF0ZShkZW50cnkpOworCQlpZiAodjlmaWQgPT0gTlVMTCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNvdWxkbid0IGluc2VydFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl2OWZpZC0+ZmlkID0gbmV3ZmlkOworCX0KKworCWlmICh2OWZpZC0+ZmlkY3JlYXRlKSB7CisJCS8qIGNyZWF0ZSBjYXNlICovCisJCW5ld2ZpZCA9IHY5ZmlkLT5maWQ7CisJCWlvdW5pdCA9IHY5ZmlkLT5pb3VuaXQ7CisJCXY5ZmlkLT5maWRjcmVhdGUgPSAwOworCX0gZWxzZSB7CisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCW5ld2ZpZCA9IHY5ZmlkLT5maWQ7CisJCWVsc2UgeworCQkJbmV3ZmlkID0gdjlmc19nZXRfaWRwb29sKCZ2OXNlcy0+ZmlkcG9vbCk7CisJCQlpZiAobmV3ZmlkIDwgMCkgeworCQkJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtRU5PU1BDOworCQkJfQorCQkJLyogVGhpcyB3b3VsZCBiZSBhIHNvbWV3aGF0IGNyaXRpY2FsIGNsb25lICovCisJCQlyZXN1bHQgPQorCQkJICAgIHY5ZnNfdF93YWxrKHY5c2VzLCB2OWZpZC0+ZmlkLCBuZXdmaWQsIE5VTEwsCisJCQkJCSZmY2FsbCk7CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbG9uZSBlcnJvcjogJXNcbiIsCisJCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCQkJa2ZyZWUoZmNhbGwpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXY5bmV3ZmlkID0gdjlmc19maWRfY3JlYXRlKGZpbGUtPmZfZGVudHJ5KTsKKwkJCXY5bmV3ZmlkLT5maWQgPSBuZXdmaWQ7CisJCQl2OW5ld2ZpZC0+cWlkID0gdjlmaWQtPnFpZDsKKwkJCXY5bmV3ZmlkLT5pb3VuaXQgPSB2OWZpZC0+aW91bml0OworCQkJdjluZXdmaWQtPmZpZG9wZW4gPSAwOworCQkJdjluZXdmaWQtPmZpZGNsdW5rZWQgPSAwOworCQkJdjluZXdmaWQtPnY5c2VzID0gdjlzZXM7CisJCQl2OWZpZCA9IHY5bmV3ZmlkOworCQkJa2ZyZWUoZmNhbGwpOworCQl9CisKKwkJLyogVE9ETzogZG8gc3BlY2lhbCB0aGluZ3MgZm9yIE9fRVhDTCwgT19OT0ZPTExPVywgT19TWU5DICovCisJCS8qIHRyYW5zbGF0ZSBvcGVuIG1vZGUgYXBwcm9wcmlhdGVseSAqLworCQlvcGVuX21vZGUgPSBmaWxlLT5mX2ZsYWdzICYgMHgzOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19FWENMKQorCQkJb3Blbl9tb2RlIHw9IFY5RlNfT0VYQ0w7CisKKwkJaWYgKHY5c2VzLT5leHRlbmRlZCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX1RSVU5DKQorCQkJCW9wZW5fbW9kZSB8PSBWOUZTX09UUlVOQzsKKworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkKKwkJCQlvcGVuX21vZGUgfD0gVjlGU19PQVBQRU5EOworCQl9CisKKwkJcmVzdWx0ID0gdjlmc190X29wZW4odjlzZXMsIG5ld2ZpZCwgb3Blbl9tb2RlLCAmZmNhbGwpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkib3BlbiBmYWlsZWQsIG9wZW5fbW9kZSAweCV4OiAlc1xuIiwgb3Blbl9tb2RlLAorCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCQlrZnJlZShmY2FsbCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJaW91bml0ID0gZmNhbGwtPnBhcmFtcy5yb3Blbi5pb3VuaXQ7CisJCWtmcmVlKGZjYWxsKTsKKwl9CisKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHY5ZmlkOworCisJdjlmaWQtPnJkaXJfcG9zID0gMDsKKwl2OWZpZC0+cmRpcl9mY2FsbCA9IE5VTEw7CisJdjlmaWQtPmZpZG9wZW4gPSAxOworCXY5ZmlkLT5maWxwID0gZmlsZTsKKwl2OWZpZC0+aW91bml0ID0gaW91bml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19maWxlX2xvY2sgLSBsb2NrIGEgZmlsZSAob3IgZGlyZWN0b3J5KQorICogQGlub2RlOiBpbm9kZSB0byBiZSBvcGVuZWQKKyAqIEBmaWxlOiBmaWxlIGJlaW5nIG9wZW5lZAorICoKKyAqIFhYWCAtIHRoaXMgbG9va3MgbGlrZSBhIGxvY2FsIG9ubHkgbG9jaywgd2Ugc2hvdWxkIGV4dGVuZCBpbnRvIDlQCisgKiAgICAgICBieSB1c2luZyBvcGVuIGV4Y2x1c2l2ZQorICovCisKK3N0YXRpYyBpbnQgdjlmc19maWxlX2xvY2soc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWludCByZXMgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiZmlscDogJXAgbG9jazogJXBcbiIsIGZpbHAsIGZsKTsKKworCS8qIE5vIG1hbmRhdG9yeSBsb2NrcyAqLworCWlmICgoaW5vZGUtPmlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQpCisJCXJldHVybiAtRU5PTENLOworCisJaWYgKChJU19TRVRMSyhjbWQpIHx8IElTX1NFVExLVyhjbWQpKSAmJiBmbC0+ZmxfdHlwZSAhPSBGX1VOTENLKSB7CisJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdjlmc19yZWFkIC0gcmVhZCBmcm9tIGEgZmlsZSAoaW50ZXJuYWwpCisgKiBAZmlsZXA6IGZpbGUgcG9pbnRlciB0byByZWFkCisgKiBAZGF0YTogZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGludG8KKyAqIEBjb3VudDogc2l6ZSBvZiBidWZmZXIKKyAqIEBvZmZzZXQ6IG9mZnNldCBhdCB3aGljaCB0byByZWFkIGRhdGEKKyAqCisgKi8KKworc3RhdGljIHNzaXplX3QKK3Y5ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZnNldCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqdjlmID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJaW50IGZpZCA9IHY5Zi0+ZmlkOworCWludCByc2l6ZSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHRvdGFsID0gMDsKKworCWRwcmludGsoREVCVUdfVkZTLCAiXG4iKTsKKworCXJzaXplID0gdjlzZXMtPm1heGRhdGEgLSBWOUZTX0lPSERSU1o7CisJaWYgKHY5Zi0+aW91bml0ICE9IDAgJiYgcnNpemUgPiB2OWYtPmlvdW5pdCkKKwkJcnNpemUgPSB2OWYtPmlvdW5pdDsKKworCWRvIHsKKwkJaWYgKGNvdW50IDwgcnNpemUpCisJCQlyc2l6ZSA9IGNvdW50OworCisJCXJlc3VsdCA9IHY5ZnNfdF9yZWFkKHY5c2VzLCBmaWQsICpvZmZzZXQsIHJzaXplLCAmZmNhbGwpOworCisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjlQMjAwMDogdjlmc190X3JlYWQgcmV0dXJuZWQgJWRcbiIsCisJCQkgICAgICAgcmVzdWx0KTsKKworCQkJa2ZyZWUoZmNhbGwpOworCQkJcmV0dXJuIHRvdGFsOworCQl9IGVsc2UKKwkJCSpvZmZzZXQgKz0gcmVzdWx0OworCisJCS8qIFhYWCAtIGV4dHJhIGNvcHkgKi8KKwkJbWVtY3B5KGJ1ZmZlciwgZmNhbGwtPnBhcmFtcy5ycmVhZC5kYXRhLCByZXN1bHQpOworCQljb3VudCAtPSByZXN1bHQ7CisJCWJ1ZmZlciArPSByZXN1bHQ7CisJCXRvdGFsICs9IHJlc3VsdDsKKworCQlrZnJlZShmY2FsbCk7CisKKwkJaWYgKHJlc3VsdCA8IHJzaXplKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoY291bnQpOworCisJcmV0dXJuIHRvdGFsOworfQorCisvKioKKyAqIHY5ZnNfZmlsZV9yZWFkIC0gcmVhZCBmcm9tIGEgZmlsZQorICogQGZpbGVwOiBmaWxlIHBvaW50ZXIgdG8gcmVhZAorICogQGRhdGE6IGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBpbnRvCisgKiBAY291bnQ6IHNpemUgb2YgYnVmZmVyCisgKiBAb2Zmc2V0OiBvZmZzZXQgYXQgd2hpY2ggdG8gcmVhZCBkYXRhCisgKgorICovCisKK3N0YXRpYyBzc2l6ZV90Cit2OWZzX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCisJICAgICAgIGxvZmZfdCAqIG9mZnNldCkKK3sKKwlpbnQgcmV0dmFsID0gLTE7CisJaW50IHJldCA9IDA7CisJY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dmFsID0gdjlmc19yZWFkKGZpbHAsIGJ1ZmZlciwgY291bnQsIG9mZnNldCk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJaWYgKChyZXQgPSBjb3B5X3RvX3VzZXIoZGF0YSwgYnVmZmVyLCByZXR2YWwpKSAhPSAwKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiUHJvYmxlbSBjb3B5aW5nIHRvIHVzZXIgJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHZhbCA9IHJldDsKKwkJfQorCX0KKworCWtmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHY5ZnNfd3JpdGUgLSB3cml0ZSB0byBhIGZpbGUKKyAqIEBmaWxlcDogZmlsZSBwb2ludGVyIHRvIHdyaXRlCisgKiBAZGF0YTogZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAY291bnQ6IHNpemUgb2YgYnVmZmVyCisgKiBAb2Zmc2V0OiBvZmZzZXQgYXQgd2hpY2ggdG8gd3JpdGUgZGF0YQorICoKKyAqLworCitzdGF0aWMgc3NpemVfdAordjlmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZnNldCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqdjlmaWQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsOworCWludCBmaWQgPSB2OWZpZC0+ZmlkOworCWludCByZXN1bHQgPSAtRUlPOworCWludCByc2l6ZSA9IDA7CisJaW50IHRvdGFsID0gMDsKKworCWRwcmludGsoREVCVUdfVkZTLCAiZGF0YSAlcCBjb3VudCAlZCBvZmZzZXQgJXhcbiIsIGJ1ZmZlciwgKGludCljb3VudCwKKwkJKGludCkqb2Zmc2V0KTsKKwlyc2l6ZSA9IHY5c2VzLT5tYXhkYXRhIC0gVjlGU19JT0hEUlNaOworCWlmICh2OWZpZC0+aW91bml0ICE9IDAgJiYgcnNpemUgPiB2OWZpZC0+aW91bml0KQorCQlyc2l6ZSA9IHY5ZmlkLT5pb3VuaXQ7CisKKwlkdW1wX2RhdGEoYnVmZmVyLCBjb3VudCk7CisKKwlkbyB7CisJCWlmIChjb3VudCA8IHJzaXplKQorCQkJcnNpemUgPSBjb3VudDsKKworCQlyZXN1bHQgPQorCQkgICAgdjlmc190X3dyaXRlKHY5c2VzLCBmaWQsICpvZmZzZXQsIHJzaXplLCBidWZmZXIsICZmY2FsbCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQllcHJpbnRrKEtFUk5fRVJSLCAiZXJyb3Igd2hpbGUgd3JpdGluZzogJXMoJWQpXG4iLAorCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSwgcmVzdWx0KTsKKwkJCWtmcmVlKGZjYWxsKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZQorCQkJKm9mZnNldCArPSByZXN1bHQ7CisKKwkJa2ZyZWUoZmNhbGwpOworCisJCWlmIChyZXN1bHQgIT0gcnNpemUpIHsKKwkJCWVwcmludGsoS0VSTl9FUlIsCisJCQkJInNob3J0IHdyaXRlOiB2OWZzX3Rfd3JpdGUgcmV0dXJuZWQgJWRcbiIsCisJCQkJcmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJY291bnQgLT0gcmVzdWx0OworCQlidWZmZXIgKz0gcmVzdWx0OworCQl0b3RhbCArPSByZXN1bHQ7CisJfSB3aGlsZSAoY291bnQpOworCisJcmV0dXJuIHRvdGFsOworfQorCisvKioKKyAqIHY5ZnNfZmlsZV93cml0ZSAtIHdyaXRlIHRvIGEgZmlsZQorICogQGZpbGVwOiBmaWxlIHBvaW50ZXIgdG8gd3JpdGUKKyAqIEBkYXRhOiBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIGZyb20KKyAqIEBjb3VudDogc2l6ZSBvZiBidWZmZXIKKyAqIEBvZmZzZXQ6IG9mZnNldCBhdCB3aGljaCB0byB3cml0ZSBkYXRhCisgKgorICovCisKK3N0YXRpYyBzc2l6ZV90Cit2OWZzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICogZGF0YSwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBvZmZzZXQpCit7CisJaW50IHJldCA9IC0xOworCWNoYXIgKmJ1ZmZlcjsKKworCWJ1ZmZlciA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcihidWZmZXIsIGRhdGEsIGNvdW50KTsKKwlpZiAocmV0KSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJQcm9ibGVtIGNvcHlpbmcgZnJvbSB1c2VyXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlyZXQgPSB2OWZzX3dyaXRlKGZpbHAsIGJ1ZmZlciwgY291bnQsIG9mZnNldCk7CisJfQorCisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQgPSB2OWZzX2ZpbGVfcmVhZCwKKwkud3JpdGUgPSB2OWZzX2ZpbGVfd3JpdGUsCisJLm9wZW4gPSB2OWZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZSA9IHY5ZnNfZGlyX3JlbGVhc2UsCisJLmxvY2sgPSB2OWZzX2ZpbGVfbG9jaywKK307CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGUuYyBiL2ZzLzlwL3Zmc19pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTNmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtMCwwICsxLDEzMzggQEAKKy8qCisgKiAgbGludXgvZnMvOXAvdmZzX2lub2RlLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdmZzIGlub2RlIG9wcyBmb3IgdGhlIDlQMjAwMCBwcm90b2NvbC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgIjlwLmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJjb252LmgiCisjaW5jbHVkZSAiZmlkLmgiCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZXh0Oworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCisvKioKKyAqIHVuaXhtb2RlMnA5bW9kZSAtIGNvbnZlcnQgdW5peCBtb2RlIGJpdHMgdG8gcGxhbiA5CisgKiBAdjlzZXM6IHY5ZnMgc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQG1vZGU6IG1vZGUgdG8gY29udmVydAorICoKKyAqLworCitzdGF0aWMgaW50IHVuaXhtb2RlMnA5bW9kZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmVzOworCXJlcyA9IG1vZGUgJiAwNzc3OworCWlmIChTX0lTRElSKG1vZGUpKQorCQlyZXMgfD0gVjlGU19ETURJUjsKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCWlmIChTX0lTTE5LKG1vZGUpKQorCQkJcmVzIHw9IFY5RlNfRE1TWU1MSU5LOworCQlpZiAodjlzZXMtPm5vZGV2ID09IDApIHsKKwkJCWlmIChTX0lTU09DSyhtb2RlKSkKKwkJCQlyZXMgfD0gVjlGU19ETVNPQ0tFVDsKKwkJCWlmIChTX0lTRklGTyhtb2RlKSkKKwkJCQlyZXMgfD0gVjlGU19ETU5BTUVEUElQRTsKKwkJCWlmIChTX0lTQkxLKG1vZGUpKQorCQkJCXJlcyB8PSBWOUZTX0RNREVWSUNFOworCQkJaWYgKFNfSVNDSFIobW9kZSkpCisJCQkJcmVzIHw9IFY5RlNfRE1ERVZJQ0U7CisJCX0KKworCQlpZiAoKG1vZGUgJiBTX0lTVUlEKSA9PSBTX0lTVUlEKQorCQkJcmVzIHw9IFY5RlNfRE1TRVRVSUQ7CisJCWlmICgobW9kZSAmIFNfSVNHSUQpID09IFNfSVNHSUQpCisJCQlyZXMgfD0gVjlGU19ETVNFVEdJRDsKKwkJaWYgKChtb2RlICYgVjlGU19ETUxJTkspKQorCQkJcmVzIHw9IFY5RlNfRE1MSU5LOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogcDltb2RlMnVuaXhtb2RlLSBjb252ZXJ0IHBsYW45IG1vZGUgYml0cyB0byB1bml4IG1vZGUgYml0cworICogQHY5c2VzOiB2OWZzIHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBtb2RlOiBtb2RlIHRvIGNvbnZlcnQKKyAqCisgKi8KKworc3RhdGljIGludCBwOW1vZGUydW5peG1vZGUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgaW50IG1vZGUpCit7CisJaW50IHJlczsKKworCXJlcyA9IG1vZGUgJiAwNzc3OworCisJaWYgKChtb2RlICYgVjlGU19ETURJUikgPT0gVjlGU19ETURJUikKKwkJcmVzIHw9IFNfSUZESVI7CisJZWxzZSBpZiAoKG1vZGUgJiBWOUZTX0RNU1lNTElOSykgJiYgKHY5c2VzLT5leHRlbmRlZCkpCisJCXJlcyB8PSBTX0lGTE5LOworCWVsc2UgaWYgKChtb2RlICYgVjlGU19ETVNPQ0tFVCkgJiYgKHY5c2VzLT5leHRlbmRlZCkKKwkJICYmICh2OXNlcy0+bm9kZXYgPT0gMCkpCisJCXJlcyB8PSBTX0lGU09DSzsKKwllbHNlIGlmICgobW9kZSAmIFY5RlNfRE1OQU1FRFBJUEUpICYmICh2OXNlcy0+ZXh0ZW5kZWQpCisJCSAmJiAodjlzZXMtPm5vZGV2ID09IDApKQorCQlyZXMgfD0gU19JRklGTzsKKwllbHNlIGlmICgobW9kZSAmIFY5RlNfRE1ERVZJQ0UpICYmICh2OXNlcy0+ZXh0ZW5kZWQpCisJCSAmJiAodjlzZXMtPm5vZGV2ID09IDApKQorCQlyZXMgfD0gU19JRkJMSzsKKwllbHNlCisJCXJlcyB8PSBTX0lGUkVHOworCisJaWYgKHY5c2VzLT5leHRlbmRlZCkgeworCQlpZiAoKG1vZGUgJiBWOUZTX0RNU0VUVUlEKSA9PSBWOUZTX0RNU0VUVUlEKQorCQkJcmVzIHw9IFNfSVNVSUQ7CisKKwkJaWYgKChtb2RlICYgVjlGU19ETVNFVEdJRCkgPT0gVjlGU19ETVNFVEdJRCkKKwkJCXJlcyB8PSBTX0lTR0lEOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdjlmc19ibGFua19taXN0YXQgLSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0dXAgYSA5UCBzdGF0IHN0cnVjdHVyZQorICogQHY5c2VzOiA5UCBzZXNzaW9uIGluZm8gKGZvciBkZXRlcm1pbmluZyBleHRlbmRlZCBtb2RlKQorICogQG1pc3RhdDogc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKi8KKworc3RhdGljIHZvaWQKK3Y5ZnNfYmxhbmtfbWlzdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCkKK3sKKwltaXN0YXQtPnR5cGUgPSB+MDsKKwltaXN0YXQtPmRldiA9IH4wOworCW1pc3RhdC0+cWlkLnR5cGUgPSB+MDsKKwltaXN0YXQtPnFpZC52ZXJzaW9uID0gfjA7CisJKigobG9uZyBsb25nICopJm1pc3RhdC0+cWlkLnBhdGgpID0gfjA7CisJbWlzdGF0LT5tb2RlID0gfjA7CisJbWlzdGF0LT5hdGltZSA9IH4wOworCW1pc3RhdC0+bXRpbWUgPSB+MDsKKwltaXN0YXQtPmxlbmd0aCA9IH4wOworCW1pc3RhdC0+bmFtZSA9IG1pc3RhdC0+ZGF0YTsKKwltaXN0YXQtPnVpZCA9IG1pc3RhdC0+ZGF0YTsKKwltaXN0YXQtPmdpZCA9IG1pc3RhdC0+ZGF0YTsKKwltaXN0YXQtPm11aWQgPSBtaXN0YXQtPmRhdGE7CisJaWYgKHY5c2VzLT5leHRlbmRlZCkgeworCQltaXN0YXQtPm5fdWlkID0gfjA7CisJCW1pc3RhdC0+bl9naWQgPSB+MDsKKwkJbWlzdGF0LT5uX211aWQgPSB+MDsKKwkJbWlzdGF0LT5leHRlbnNpb24gPSBtaXN0YXQtPmRhdGE7CisJfQorCSptaXN0YXQtPmRhdGEgPSAwOworfQorCisvKioKKyAqIHY5ZnNfbWlzdGF0MnVuaXggLSBjb252ZXJ0IG1pc3RhdCB0byB1bml4IHN0YXQKKyAqIEBtaXN0YXQ6IFBsYW4gOSBtZXRhZGF0YSAobWlzdGF0KSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHVuaXggbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZSB0byBwb3B1bGF0ZQorICogQHNiOiBzdXBlcmJsb2NrCisgKgorICovCisKK3N0YXRpYyB2b2lkCit2OWZzX21pc3RhdDJ1bml4KHN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCwgc3RydWN0IHN0YXQgKmJ1ZiwKKwkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHNiID8gc2ItPnNfZnNfaW5mbyA6IE5VTEw7CisKKwlidWYtPnN0X25saW5rID0gMTsKKworCWJ1Zi0+c3RfYXRpbWUgPSBtaXN0YXQtPmF0aW1lOworCWJ1Zi0+c3RfbXRpbWUgPSBtaXN0YXQtPm10aW1lOworCWJ1Zi0+c3RfY3RpbWUgPSBtaXN0YXQtPm10aW1lOworCisJYnVmLT5zdF91aWQgPSAodW5zaWduZWQgc2hvcnQpLTE7CisJYnVmLT5zdF9naWQgPSAodW5zaWduZWQgc2hvcnQpLTE7CisKKwlpZiAodjlzZXMgJiYgdjlzZXMtPmV4dGVuZGVkKSB7CisJCS8qIFRPRE86IHN0cmluZyB0byB1aWQgbWFwcGluZyB2aWEgdXNlci1zcGFjZSBkYWVtb24gKi8KKwkJaWYgKG1pc3RhdC0+bl91aWQgIT0gLTEpCisJCQlzc2NhbmYobWlzdGF0LT51aWQsICIleCIsICh1bnNpZ25lZCBpbnQgKikmYnVmLT5zdF91aWQpOworCisJCWlmIChtaXN0YXQtPm5fZ2lkICE9IC0xKQorCQkJc3NjYW5mKG1pc3RhdC0+Z2lkLCAiJXgiLCAodW5zaWduZWQgaW50ICopJmJ1Zi0+c3RfZ2lkKTsKKwl9CisKKwlpZiAoYnVmLT5zdF91aWQgPT0gKHVuc2lnbmVkIHNob3J0KS0xKQorCQlidWYtPnN0X3VpZCA9IHY5c2VzLT51aWQ7CisJaWYgKGJ1Zi0+c3RfZ2lkID09ICh1bnNpZ25lZCBzaG9ydCktMSkKKwkJYnVmLT5zdF9naWQgPSB2OXNlcy0+Z2lkOworCisJYnVmLT5zdF9tb2RlID0gcDltb2RlMnVuaXhtb2RlKHY5c2VzLCBtaXN0YXQtPm1vZGUpOworCWlmICgoU19JU0JMSyhidWYtPnN0X21vZGUpKSB8fCAoU19JU0NIUihidWYtPnN0X21vZGUpKSkgeworCQljaGFyIHR5cGUgPSAwOworCQlpbnQgbWFqb3IgPSAtMTsKKwkJaW50IG1pbm9yID0gLTE7CisJCXNzY2FuZihtaXN0YXQtPmV4dGVuc2lvbiwgIiVjICV1ICV1IiwgJnR5cGUsICZtYWpvciwgJm1pbm9yKTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgJ2MnOgorCQkJYnVmLT5zdF9tb2RlICY9IH5TX0lGQkxLOworCQkJYnVmLT5zdF9tb2RlIHw9IFNfSUZDSFI7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJVbmtub3duIHNwZWNpYWwgdHlwZSAlYyAoJXMpXG4iLAorCQkJCXR5cGUsIG1pc3RhdC0+ZXh0ZW5zaW9uKTsKKwkJfTsKKwkJYnVmLT5zdF9yZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKKwl9IGVsc2UKKwkJYnVmLT5zdF9yZGV2ID0gMDsKKworCWJ1Zi0+c3Rfc2l6ZSA9IG1pc3RhdC0+bGVuZ3RoOworCisJYnVmLT5zdF9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+c3RfYmxvY2tzID0KKwkgICAgKGJ1Zi0+c3Rfc2l6ZSArIGJ1Zi0+c3RfYmxrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworfQorCisvKioKKyAqIHY5ZnNfZ2V0X2lub2RlIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHNldHVwIGFuIGlub2RlCisgKiBAc2I6IHN1cGVyYmxvY2sKKyAqIEBtb2RlOiBtb2RlIHRvIHNldHVwIGlub2RlIHdpdGgKKyAqCisgKi8KKworc3RydWN0IGlub2RlICp2OWZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKKworCWRwcmludGsoREVCVUdfVkZTLCAic3VwZXIgYmxvY2s6ICVwIG1vZGU6ICVvXG4iLCBzYiwgbW9kZSk7CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCWlub2RlLT5pX2Jsa3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlub2RlLT5pX3JkZXYgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJCWNhc2UgU19JRklGTzoKKwkJY2FzZSBTX0lGQkxLOgorCQljYXNlIFNfSUZDSFI6CisJCWNhc2UgU19JRlNPQ0s6CisJCQlpZighdjlzZXMtPmV4dGVuZGVkKSB7CisJCQkJZHByaW50ayhERUJVR19FUlJPUiwgInNwZWNpYWwgZmlsZXMgd2l0aG91dCBleHRlbmRlZCBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJCX0KKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkJICAgaW5vZGUtPmlfcmRldik7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGUkVHOgorCQkJaW5vZGUtPmlfb3AgPSAmdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmdjlmc19maWxlX29wZXJhdGlvbnM7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGTE5LOgorCQkJaWYoIXY5c2VzLT5leHRlbmRlZCkgeworCQkJCWRwcmludGsoREVCVUdfRVJST1IsICJleHRlbmRlZCBtb2RlcyB1c2VkIHcvbyA5UDIwMDAudVxuIik7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCQl9CisJCQlpbm9kZS0+aV9vcCA9ICZ2OWZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpbm9kZS0+aV9ubGluaysrOworCQkJaWYodjlzZXMtPmV4dGVuZGVkKQorCQkJCWlub2RlLT5pX29wID0gJnY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZXh0OworCQkJZWxzZQorCQkJCWlub2RlLT5pX29wID0gJnY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmdjlmc19kaXJfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50ayhERUJVR19FUlJPUiwgIkJBRCBtb2RlIDB4JXggU19JRk1UIDB4JXhcbiIsCisJCQkJbW9kZSwgbW9kZSAmIFNfSUZNVCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAiUHJvYmxlbSBhbGxvY2F0aW5nIGlub2RlXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBpbm9kZTsKK30KKworLyoqCisgKiB2OWZzX2NyZWF0ZSAtIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgZmlsZSBpcyBiZWluZyBjcmVhdGVkIGluCisgKiBAZmlsZV9kZW50cnk6IGRlbnRyeSBmaWxlIGlzIGJlaW5nIGNyZWF0ZWQgaW4KKyAqIEBwZXJtOiBwZXJtaXNzaW9ucyBmaWxlIGlzIGJlaW5nIGNyZWF0ZWQgd2l0aAorICogQG9wZW5fbW9kZTogcmVzdWx0aW5nIG9wZW4gbW9kZSBmb3IgZmlsZQorICoKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwKKwkgICAgc3RydWN0IGRlbnRyeSAqZmlsZV9kZW50cnksCisJICAgIHVuc2lnbmVkIGludCBwZXJtLCB1bnNpZ25lZCBpbnQgb3Blbl9tb2RlKQoreworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3Qgdjlmc19maWQgKmRpcmZpZCA9CisJICAgIHY5ZnNfZmlkX2xvb2t1cChmaWxlX2RlbnRyeS0+ZF9wYXJlbnQsIEZJRF9XQUxLKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKmZpZCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpmaWxlX2lub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCB2OWZzX3FpZCBxaWQ7CisJc3RydWN0IHN0YXQgbmV3c3RhdDsKKwlpbnQgZGlyZmlkbnVtID0gLTE7CisJbG9uZyBuZXdmaWQgPSAtMTsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgaW91bml0ID0gMDsKKworCXBlcm0gPSB1bml4bW9kZTJwOW1vZGUodjlzZXMsIHBlcm0pOworCisJZHByaW50ayhERUJVR19WRlMsICJkaXI6ICVwIGRlbnRyeTogJXAgcGVybTogJW8gbW9kZTogJW9cbiIsIGRpciwKKwkJZmlsZV9kZW50cnksIHBlcm0sIG9wZW5fbW9kZSk7CisKKwlpZiAoIWRpcmZpZCkKKwkJcmV0dXJuIC1FQkFERjsKKworCWRpcmZpZG51bSA9IGRpcmZpZC0+ZmlkOworCWlmIChkaXJmaWRudW0gPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJObyBmaWQgZm9yIHRoZSBkaXJlY3RvcnkgIyVsdVxuIiwKKwkJCWRpci0+aV9pbm8pOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWlmIChmaWxlX2RlbnRyeS0+ZF9pbm9kZSkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJIk9kZC4gVGhlcmUgaXMgYW4gaW5vZGUgZm9yIGRpciAlbHUsIG5hbWUgOiVzOlxuIiwKKwkJCWRpci0+aV9pbm8sIGZpbGVfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCW5ld2ZpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPmZpZHBvb2wpOworCWlmIChuZXdmaWQgPCAwKSB7CisJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAibm8gZnJlZSBmaWRzIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXJlc3VsdCA9IHY5ZnNfdF93YWxrKHY5c2VzLCBkaXJmaWRudW0sIG5ld2ZpZCwgTlVMTCwgJmZjYWxsKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2xvbmUgZXJyb3I6ICVzXG4iLCBGQ0FMTF9FUlJPUihmY2FsbCkpOworCQl2OWZzX3B1dF9pZHBvb2wobmV3ZmlkLCAmdjlzZXMtPmZpZHBvb2wpOworCQluZXdmaWQgPSAwOworCQlnb3RvIENsZWFuVXBGaWQ7CisJfQorCisJa2ZyZWUoZmNhbGwpOworCisJcmVzdWx0ID0gdjlmc190X2NyZWF0ZSh2OXNlcywgbmV3ZmlkLCAoY2hhciAqKWZpbGVfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBwZXJtLCBvcGVuX21vZGUsICZmY2FsbCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNyZWF0ZSBmYWlsczogJXMoJWQpXG4iLAorCQkJRkNBTExfRVJST1IoZmNhbGwpLCByZXN1bHQpOworCisJCWdvdG8gQ2xlYW5VcEZpZDsKKwl9CisKKwlpb3VuaXQgPSBmY2FsbC0+cGFyYW1zLnJjcmVhdGUuaW91bml0OworCXFpZCA9IGZjYWxsLT5wYXJhbXMucmNyZWF0ZS5xaWQ7CisJa2ZyZWUoZmNhbGwpOworCisJZmlkID0gdjlmc19maWRfY3JlYXRlKGZpbGVfZGVudHJ5KTsKKwlpZiAoIWZpZCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIENsZWFuVXBGaWQ7CisJfQorCisJZmlkLT5maWQgPSBuZXdmaWQ7CisJZmlkLT5maWRvcGVuID0gMDsKKwlmaWQtPmZpZGNyZWF0ZSA9IDE7CisJZmlkLT5xaWQgPSBxaWQ7CisJZmlkLT5pb3VuaXQgPSBpb3VuaXQ7CisJZmlkLT5yZGlyX3BvcyA9IDA7CisJZmlkLT5yZGlyX2ZjYWxsID0gTlVMTDsKKwlmaWQtPnY5c2VzID0gdjlzZXM7CisKKwlpZiAoKHBlcm0gJiBWOUZTX0RNU1lNTElOSykgfHwgKHBlcm0gJiBWOUZTX0RNTElOSykgfHwKKwkgICAgKHBlcm0gJiBWOUZTX0RNTkFNRURQSVBFKSB8fCAocGVybSAmIFY5RlNfRE1TT0NLRVQpIHx8CisJICAgIChwZXJtICYgVjlGU19ETURFVklDRSkpCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gdjlmc190X3N0YXQodjlzZXMsIG5ld2ZpZCwgJmZjYWxsKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAic3RhdCBlcnJvcjogJXMoJWQpXG4iLCBGQ0FMTF9FUlJPUihmY2FsbCksCisJCQlyZXN1bHQpOworCQlnb3RvIENsZWFuVXBGaWQ7CisJfQorCisJdjlmc19taXN0YXQydW5peChmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsICZuZXdzdGF0LCBzYik7CisKKwlmaWxlX2lub2RlID0gdjlmc19nZXRfaW5vZGUoc2IsIG5ld3N0YXQuc3RfbW9kZSk7CisJaWYgKCghZmlsZV9pbm9kZSkgfHwgSVNfRVJSKGZpbGVfaW5vZGUpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjcmVhdGUgaW5vZGUgZmFpbGVkXG4iKTsKKwkJcmVzdWx0ID0gLUVCQURGOworCQlnb3RvIENsZWFuVXBGaWQ7CisJfQorCisJdjlmc19taXN0YXQyaW5vZGUoZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LCBmaWxlX2lub2RlLCBzYik7CisJa2ZyZWUoZmNhbGwpOworCWRfaW5zdGFudGlhdGUoZmlsZV9kZW50cnksIGZpbGVfaW5vZGUpOworCisJaWYgKHBlcm0gJiBWOUZTX0RNRElSKSB7CisJCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZCwgJmZjYWxsKSkKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmb3IgbWtkaXIgZmFpbGVkOiAlc1xuIiwKKwkJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCisJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisJCWtmcmVlKGZjYWxsKTsKKwkJZmlkLT5maWRvcGVuID0gMDsKKwkJZmlkLT5maWRjcmVhdGUgPSAwOworCQlkX2Ryb3AoZmlsZV9kZW50cnkpOworCX0KKworCXJldHVybiAwOworCisgICAgICBDbGVhblVwRmlkOgorCWtmcmVlKGZjYWxsKTsKKworCWlmIChuZXdmaWQpIHsKKwkJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkLCAmZmNhbGwpKQorCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZDogJXNcbiIsCisJCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKworCQl2OWZzX3B1dF9pZHBvb2wobmV3ZmlkLCAmdjlzZXMtPmZpZHBvb2wpOworCQlrZnJlZShmY2FsbCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogdjlmc19yZW1vdmUgLSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworICogQGRpcjogZGlyZWN0b3J5IGlub2RlIHRoYXQgaXMgYmVpbmcgZGVsZXRlZAorICogQGZpbGU6ICBkZW50cnkgdGhhdCBpcyBiZWluZyBkZWxldGVkCisgKiBAcm1kaXI6IHJlbW92aW5nIGEgZGlyZWN0b3J5CisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19yZW1vdmUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmZpbGUsIGludCBybWRpcikKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSBOVUxMOworCXN0cnVjdCB2OWZzX2ZpZCAqdjlmaWQgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqZmlsZV9pbm9kZSA9IE5VTEw7CisJaW50IGZpZCA9IC0xOworCWludCByZXN1bHQgPSAwOworCisJZHByaW50ayhERUJVR19WRlMsICJpbm9kZTogJXAgZGVudHJ5OiAlcCBybWRpcjogJWRcbiIsIGRpciwgZmlsZSwKKwkJcm1kaXIpOworCisJZmlsZV9pbm9kZSA9IGZpbGUtPmRfaW5vZGU7CisJc2IgPSBmaWxlX2lub2RlLT5pX3NiOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhmaWxlX2lub2RlKTsKKwl2OWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChmaWxlLCBGSURfT1ApOworCisJaWYgKCF2OWZpZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJIm5vIHY5ZnNfZmlkXG4iKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwlmaWQgPSB2OWZpZC0+ZmlkOworCWlmIChmaWQgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJpbm9kZSAjJWx1LCBubyBmaWQhXG4iLAorCQkJZmlsZV9pbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCXJlc3VsdCA9IHY5ZnNfdF9yZW1vdmUodjlzZXMsIGZpZCwgJmZjYWxsKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZHByaW50ayhERUJVR19FUlJPUiwgInJlbW92ZSBvZiBmaWxlIGZhaWxzOiAlcyglZClcbiIsCisJCQlGQ0FMTF9FUlJPUihmY2FsbCksIHJlc3VsdCk7CisJZWxzZSB7CisJCXY5ZnNfcHV0X2lkcG9vbChmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisJCXY5ZnNfZmlkX2Rlc3Ryb3kodjlmaWQpOworCX0KKworCWtmcmVlKGZjYWxsKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHY5ZnNfdmZzX2NyZWF0ZSAtIFZGUyBob29rIHRvIGNyZWF0ZSBmaWxlcworICogQGlub2RlOiBkaXJlY3RvcnkgaW5vZGUgdGhhdCBpcyBiZWluZyBkZWxldGVkCisgKiBAZGVudHJ5OiAgZGVudHJ5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZAorICogQHBlcm06IGNyZWF0ZSBwZXJtaXNzaW9ucworICogQG5kOiBwYXRoIGluZm9ybWF0aW9uCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBwZXJtLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gdjlmc19jcmVhdGUoaW5vZGUsIGRlbnRyeSwgcGVybSwgT19SRFdSKTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19ta2RpciAtIFZGUyBta2RpciBob29rIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeQorICogQGlub2RlOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICogQGRlbnRyeTogZGVudHJ5IHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKKyAqIEBtb2RlOiBtb2RlIGZvciBuZXcgZGlyZWN0b3J5CisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc192ZnNfbWtkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlyZXR1cm4gdjlmc19jcmVhdGUoaW5vZGUsIGRlbnRyeSwgbW9kZSB8IFNfSUZESVIsIE9fUkRPTkxZKTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19sb29rdXAgLSBWRlMgbG9va3VwIGhvb2sgdG8gIndhbGsiIHRvIGEgbmV3IGlub2RlCisgKiBAZGlyOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB3YWxrZWQgZnJvbQorICogQGRlbnRyeTogZGVudHJ5IHRoYXQgaXMgYmVpbmcgd2Fsa2VkIHRvPworICogQG5hbWVpZGF0YTogcGF0aCBkYXRhCisgKgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2OWZzX3Zmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuYW1laWRhdGEpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCB2OWZzX2ZpZCAqZGlyZmlkOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBuZXdzdGF0OworCWludCBkaXJmaWRudW0gPSAtMTsKKwlpbnQgbmV3ZmlkID0gLTE7CisJaW50IHJlc3VsdCA9IDA7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgImRpcjogJXAgZGVudHJ5OiAoJXMpICVwIG5hbWVpZGF0YTogJXBcbiIsCisJCWRpciwgZGVudHJ5LT5kX2luYW1lLCBkZW50cnksIG5hbWVpZGF0YSk7CisKKwlzYiA9IGRpci0+aV9zYjsKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKKwlkaXJmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCwgRklEX1dBTEspOworCisJaWYgKCFkaXJmaWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vIGRpcmZpZFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCWRpcmZpZG51bSA9IGRpcmZpZC0+ZmlkOworCisJaWYgKGRpcmZpZG51bSA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vIGRpcmZpZCBmb3IgaW5vZGUgJXAsICMlbHVcbiIsCisJCQlkaXIsIGRpci0+aV9pbm8pOworCQlyZXR1cm4gRVJSX1BUUigtRUJBREYpOworCX0KKworCW5ld2ZpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPmZpZHBvb2wpOworCWlmIChuZXdmaWQgPCAwKSB7CisJCWVwcmludGsoS0VSTl9XQVJOSU5HLCAibmV3ZmlkIGZhaWxzIVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCX0KKworCXJlc3VsdCA9CisJICAgIHY5ZnNfdF93YWxrKHY5c2VzLCBkaXJmaWRudW0sIG5ld2ZpZCwgKGNoYXIgKilkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJdjlmc19wdXRfaWRwb29sKG5ld2ZpZCwgJnY5c2VzLT5maWRwb29sKTsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PRU5UKSB7CisJCQlkX2FkZChkZW50cnksIE5VTEwpOworCQkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCQkiUmV0dXJuIG5lZ2F0aXZlIGRlbnRyeSAlcCBjb3VudCAlZFxuIiwKKwkJCQlkZW50cnksIGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWRwcmludGsoREVCVUdfRVJST1IsICJ3YWxrIGVycm9yOiVkXG4iLCByZXN1bHQpOworCQlnb3RvIEZyZWVGY2FsbDsKKwl9CisKKwlyZXN1bHQgPSB2OWZzX3Rfc3RhdCh2OXNlcywgbmV3ZmlkLCAmZmNhbGwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJzdGF0IGVycm9yXG4iKTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJdjlmc19taXN0YXQydW5peChmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsICZuZXdzdGF0LCBzYik7CisJaW5vZGUgPSB2OWZzX2dldF9pbm9kZShzYiwgbmV3c3RhdC5zdF9tb2RlKTsKKworCWlmIChJU19FUlIoaW5vZGUpICYmIChQVFJfRVJSKGlub2RlKSA9PSAtRU5PU1BDKSkgeworCQllcHJpbnRrKEtFUk5fV0FSTklORywgImlub2RlIGFsbG9jIGZhaWxlcywgcmV0dXJucyAlbGRcbiIsCisJCQlQVFJfRVJSKGlub2RlKSk7CisKKwkJcmVzdWx0ID0gLUVOT1NQQzsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJaW5vZGUtPmlfaW5vID0gdjlmc19xaWQyaW5vKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPnFpZCk7CisKKwlmaWQgPSB2OWZzX2ZpZF9jcmVhdGUoZGVudHJ5KTsKKwlpZiAoZmlkID09IE5VTEwpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNvdWxkbid0IGluc2VydFxuIik7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCWZpZC0+ZmlkID0gbmV3ZmlkOworCWZpZC0+Zmlkb3BlbiA9IDA7CisJZmlkLT52OXNlcyA9IHY5c2VzOworCWZpZC0+cWlkID0gZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5xaWQ7CisKKwlkZW50cnktPmRfb3AgPSAmdjlmc19kZW50cnlfb3BlcmF0aW9uczsKKwl2OWZzX21pc3RhdDJpbm9kZShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIGlub2RlLCBpbm9kZS0+aV9zYik7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlrZnJlZShmY2FsbCk7CisKKwlyZXR1cm4gTlVMTDsKKworICAgICAgRnJlZUZjYWxsOgorCWtmcmVlKGZjYWxsKTsKKwlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworfQorCisvKioKKyAqIHY5ZnNfdmZzX3VubGluayAtIFZGUyB1bmxpbmsgaG9vayB0byBkZWxldGUgYW4gaW5vZGUKKyAqIEBpOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICogQGQ6IGRlbnRyeSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc192ZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCkKK3sKKwlyZXR1cm4gdjlmc19yZW1vdmUoaSwgZCwgMCk7Cit9CisKKy8qKgorICogdjlmc192ZnNfcm1kaXIgLSBWRlMgdW5saW5rIGhvb2sgdG8gZGVsZXRlIGEgZGlyZWN0b3J5CisgKiBAaTogIGlub2RlIHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKKyAqIEBkOiBkZW50cnkgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCkKK3sKKwlyZXR1cm4gdjlmc19yZW1vdmUoaSwgZCwgMSk7Cit9CisKKy8qKgorICogdjlmc192ZnNfcmVuYW1lIC0gVkZTIGhvb2sgdG8gcmVuYW1lIGFuIGlub2RlCisgKiBAb2xkX2RpcjogIG9sZCBkaXIgaW5vZGUKKyAqIEBvbGRfZGVudHJ5OiBvbGQgZGVudHJ5CisgKiBAbmV3X2RpcjogbmV3IGRpciBpbm9kZQorICogQG5ld19kZW50cnk6IG5ldyBkZW50cnkKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhvbGRfaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqb2xkZmlkID0gdjlmc19maWRfbG9va3VwKG9sZF9kZW50cnksIEZJRF9XQUxLKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKm9sZGRpcmZpZCA9CisJICAgIHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5LT5kX3BhcmVudCwgRklEX1dBTEspOworCXN0cnVjdCB2OWZzX2ZpZCAqbmV3ZGlyZmlkID0KKwkgICAgdjlmc19maWRfbG9va3VwKG5ld19kZW50cnktPmRfcGFyZW50LCBGSURfV0FMSyk7CisJc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0ID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlpbnQgZmlkID0gLTE7CisJaW50IG9sZGRpcmZpZG51bSA9IC0xOworCWludCBuZXdkaXJmaWRudW0gPSAtMTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRwcmludGsoREVCVUdfVkZTLCAiXG4iKTsKKworCWlmICghbWlzdGF0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoIW9sZGZpZCkgfHwgKCFvbGRkaXJmaWQpIHx8ICghbmV3ZGlyZmlkKSkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicHJvYmxlbSB3aXRoIGFyZ3VtZW50c1xuIik7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJLyogOVAgY2FuIG9ubHkgaGFuZGxlIGZpbGUgcmVuYW1lIGluIHRoZSBzYW1lIGRpcmVjdG9yeSAqLworCWlmIChtZW1jbXAoJm9sZGRpcmZpZC0+cWlkLCAmbmV3ZGlyZmlkLT5xaWQsIHNpemVvZihuZXdkaXJmaWQtPnFpZCkpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJvbGQgZGlyIGFuZCBuZXcgZGlyIGFyZSBkaWZmZXJlbnRcbiIpOworCQlyZXR2YWwgPSAtRVBFUk07CisJCWdvdG8gRnJlZUZjYWxsbkJhaWw7CisJfQorCisJZmlkID0gb2xkZmlkLT5maWQ7CisJb2xkZGlyZmlkbnVtID0gb2xkZGlyZmlkLT5maWQ7CisJbmV3ZGlyZmlkbnVtID0gbmV3ZGlyZmlkLT5maWQ7CisKKwlpZiAoZmlkIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm8gZmlkIGZvciBvbGQgZmlsZSAjJWx1XG4iLAorCQkJb2xkX2lub2RlLT5pX2lubyk7CisJCXJldHZhbCA9IC1FQkFERjsKKwkJZ290byBGcmVlRmNhbGxuQmFpbDsKKwl9CisKKwl2OWZzX2JsYW5rX21pc3RhdCh2OXNlcywgbWlzdGF0KTsKKworCXN0cmNweShtaXN0YXQtPmRhdGEgKyAxLCB2OXNlcy0+bmFtZSk7CisJbWlzdGF0LT5uYW1lID0gbWlzdGF0LT5kYXRhICsgMSArIHN0cmxlbih2OXNlcy0+bmFtZSk7CisKKwlpZiAobmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiA+CisJICAgICh2OXNlcy0+bWF4ZGF0YSAtIHN0cmxlbih2OXNlcy0+bmFtZSkgLSBzaXplb2Yoc3RydWN0IHY5ZnNfc3RhdCkpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJuZXcgbmFtZSB0b28gbG9uZ1xuIik7CisJCWdvdG8gRnJlZUZjYWxsbkJhaWw7CisJfQorCisJc3RyY3B5KG1pc3RhdC0+bmFtZSwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXJldHZhbCA9IHY5ZnNfdF93c3RhdCh2OXNlcywgZmlkLCBtaXN0YXQsICZmY2FsbCk7CisKKyAgICAgIEZyZWVGY2FsbG5CYWlsOgorCWtmcmVlKG1pc3RhdCk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJZHByaW50ayhERUJVR19FUlJPUiwgInY5ZnNfdF93c3RhdCBlcnJvcjogJXNcbiIsCisJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCisJa2ZyZWUoZmNhbGwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdjlmc192ZnNfZ2V0YXR0ciAtIHJldHJlaXZlIGZpbGUgbWV0YWRhdGEKKyAqIEBtbnQgLSBtb3VudCBpbmZvcm1hdGlvbgorICogQGRlbnRyeSAtIGZpbGUgdG8gZ2V0IGF0dHJpYnV0ZXMgb24KKyAqIEBzdGF0IC0gbWV0YWRhdGEgc3RydWN0dXJlIHRvIHBvcHVsYXRlCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHY5ZnNfZmlkICpmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LCBGSURfT1ApOworCWludCBlcnIgPSAtRVBFUk07CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgImRlbnRyeTogJXBcbiIsIGRlbnRyeSk7CisJaWYgKCFmaWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCSJjb3VsZG4ndCBmaW5kIGZpZCBhc3NvY2lhdGVkIHdpdGggZGVudHJ5XG4iKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwllcnIgPSB2OWZzX3Rfc3RhdCh2OXNlcywgZmlkLT5maWQsICZmY2FsbCk7CisKKwlpZiAoZXJyIDwgMCkKKwkJZHByaW50ayhERUJVR19FUlJPUiwgInN0YXQgZXJyb3JcbiIpOworCWVsc2UgeworCQl2OWZzX21pc3RhdDJpbm9kZShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIGRlbnRyeS0+ZF9pbm9kZSwKKwkJCQkgIGRlbnRyeS0+ZF9pbm9kZS0+aV9zYik7CisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwl9CisKKwlrZnJlZShmY2FsbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2OWZzX3Zmc19zZXRhdHRyIC0gc2V0IGZpbGUgbWV0YWRhdGEKKyAqIEBkZW50cnk6IGZpbGUgd2hvc2UgbWV0YWRhdGEgdG8gc2V0CisgKiBAaWF0dHI6IG1ldGFkYXRhIGFzc2lnbm1lbnQgc3RydWN0dXJlCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc192ZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKmZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnksIEZJRF9PUCk7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhLCBHRlBfS0VSTkVMKTsKKwlpbnQgcmVzID0gLUVQRVJNOworCisJZHByaW50ayhERUJVR19WRlMsICJcbiIpOworCisJaWYgKCFtaXN0YXQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFmaWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwKKwkJCSJDb3VsZG4ndCBmaW5kIGZpZCBhc3NvY2lhdGVkIHdpdGggZGVudHJ5XG4iKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwl2OWZzX2JsYW5rX21pc3RhdCh2OXNlcywgbWlzdGF0KTsKKwlpZiAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKQorCQltaXN0YXQtPm1vZGUgPSB1bml4bW9kZTJwOW1vZGUodjlzZXMsIGlhdHRyLT5pYV9tb2RlKTsKKworCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKQorCQltaXN0YXQtPm10aW1lID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKworCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKQorCQltaXN0YXQtPmF0aW1lID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKKworCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCW1pc3RhdC0+bGVuZ3RoID0gaWF0dHItPmlhX3NpemU7CisKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCWNoYXIgKnB0ciA9IG1pc3RhdC0+ZGF0YSsxOworCisJCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQkJbWlzdGF0LT51aWQgPSBwdHI7CisJCQlwdHIgKz0gMStzcHJpbnRmKHB0ciwgIiUwOHgiLCBpYXR0ci0+aWFfdWlkKTsKKwkJCW1pc3RhdC0+bl91aWQgPSBpYXR0ci0+aWFfdWlkOworCQl9CisKKwkJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCQltaXN0YXQtPmdpZCA9IHB0cjsKKwkJCXB0ciArPSAxK3NwcmludGYocHRyLCAiJTA4eCIsIGlhdHRyLT5pYV9naWQpOworCQkJbWlzdGF0LT5uX2dpZCA9IGlhdHRyLT5pYV9naWQ7CisJCX0KKwl9CisKKwlyZXMgPSB2OWZzX3Rfd3N0YXQodjlzZXMsIGZpZC0+ZmlkLCBtaXN0YXQsICZmY2FsbCk7CisKKwlpZiAocmVzIDwgMCkKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIndzdGF0IGVycm9yOiAlc1xuIiwgRkNBTExfRVJST1IoZmNhbGwpKTsKKworCWtmcmVlKG1pc3RhdCk7CisJa2ZyZWUoZmNhbGwpOworCisJaWYgKHJlcyA+PSAwKQorCQlyZXMgPSBpbm9kZV9zZXRhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHIpOworCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB2OWZzX21pc3RhdDJpbm9kZSAtIHBvcHVsYXRlIGFuIGlub2RlIHN0cnVjdHVyZSB3aXRoIG1pc3RhdCBpbmZvCisgKiBAbWlzdGF0OiBQbGFuIDkgbWV0YWRhdGEgKG1pc3RhdCkgc3RydWN0dXJlCisgKiBAaW5vZGU6IGlub2RlIHRvIHBvcHVsYXRlCisgKiBAc2I6IHN1cGVyYmxvY2sgb2YgZmlsZXN5c3RlbQorICoKKyAqLworCit2b2lkCit2OWZzX21pc3RhdDJpbm9kZShzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKKworCWlub2RlLT5pX25saW5rID0gMTsKKworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IG1pc3RhdC0+YXRpbWU7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gbWlzdGF0LT5tdGltZTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBtaXN0YXQtPm10aW1lOworCisJaW5vZGUtPmlfdWlkID0gLTE7CisJaW5vZGUtPmlfZ2lkID0gLTE7CisKKwlpZiAodjlzZXMtPmV4dGVuZGVkKSB7CisJCS8qIFRPRE86IHN0cmluZyB0byB1aWQgbWFwcGluZyB2aWEgdXNlci1zcGFjZSBkYWVtb24gKi8KKwkJaW5vZGUtPmlfdWlkID0gbWlzdGF0LT5uX3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gbWlzdGF0LT5uX2dpZDsKKworCQlpZiAobWlzdGF0LT5uX3VpZCA9PSAtMSkKKwkJCXNzY2FuZihtaXN0YXQtPnVpZCwgIiV4IiwgJmlub2RlLT5pX3VpZCk7CisKKwkJaWYgKG1pc3RhdC0+bl9naWQgPT0gLTEpCisJCQlzc2NhbmYobWlzdGF0LT5naWQsICIleCIsICZpbm9kZS0+aV9naWQpOworCX0KKworCWlmIChpbm9kZS0+aV91aWQgPT0gLTEpCisJCWlub2RlLT5pX3VpZCA9IHY5c2VzLT51aWQ7CisJaWYgKGlub2RlLT5pX2dpZCA9PSAtMSkKKwkJaW5vZGUtPmlfZ2lkID0gdjlzZXMtPmdpZDsKKworCWlub2RlLT5pX21vZGUgPSBwOW1vZGUydW5peG1vZGUodjlzZXMsIG1pc3RhdC0+bW9kZSk7CisJaWYgKChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB8fCAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkpIHsKKwkJY2hhciB0eXBlID0gMDsKKwkJaW50IG1ham9yID0gLTE7CisJCWludCBtaW5vciA9IC0xOworCQlzc2NhbmYobWlzdGF0LT5leHRlbnNpb24sICIlYyAldSAldSIsICZ0eXBlLCAmbWFqb3IsICZtaW5vcik7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlICdjJzoKKwkJCWlub2RlLT5pX21vZGUgJj0gflNfSUZCTEs7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZDSFI7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJVbmtub3duIHNwZWNpYWwgdHlwZSAlYyAoJXMpXG4iLAorCQkJCXR5cGUsIG1pc3RhdC0+ZXh0ZW5zaW9uKTsKKwkJfTsKKwkJaW5vZGUtPmlfcmRldiA9IE1LREVWKG1ham9yLCBtaW5vcik7CisJfSBlbHNlCisJCWlub2RlLT5pX3JkZXYgPSAwOworCisJaW5vZGUtPmlfc2l6ZSA9IG1pc3RhdC0+bGVuZ3RoOworCisJaW5vZGUtPmlfYmxrc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlpbm9kZS0+aV9ibG9ja3MgPQorCSAgICAoaW5vZGUtPmlfc2l6ZSArIGlub2RlLT5pX2Jsa3NpemUgLSAxKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKK30KKworLyoqCisgKiB2OWZzX3FpZDJpbm8gLSBjb252ZXJ0IHFpZCBpbnRvIGlub2RlIG51bWJlcgorICogQHFpZDogcWlkIHRvIGhhc2gKKyAqCisgKiBCVUc6IHBvdGVudGlhbCBmb3IgaW5vZGUgbnVtYmVyIGNvbGxpc2lvbnM/CisgKi8KKworaW5vX3Qgdjlmc19xaWQyaW5vKHN0cnVjdCB2OWZzX3FpZCAqcWlkKQoreworCXU2NCBwYXRoID0gcWlkLT5wYXRoICsgMjsKKwlpbm9fdCBpID0gMDsKKworCWlmIChzaXplb2YoaW5vX3QpID09IHNpemVvZihwYXRoKSkKKwkJbWVtY3B5KCZpLCAmcGF0aCwgc2l6ZW9mKGlub190KSk7CisJZWxzZQorCQlpID0gKGlub190KSAocGF0aCBeIChwYXRoID4+IDMyKSk7CisKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19zeW1saW5rIC0gaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzeW1saW5rcworICogQGRpcjogZGlyZWN0b3J5IGlub2RlIGNvbnRhaW5pbmcgc3ltbGluaworICogQGRlbnRyeTogZGVudHJ5IGZvciBzeW1saW5rCisgKiBAc3ltbmFtZTogc3ltbGluayBkYXRhCisgKgorICogU2VlIDlQMjAwMC51IFJGQyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX3Zmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJaW50IHJldHZhbCA9IC1FUEVSTTsKKwlzdHJ1Y3Qgdjlmc19maWQgKm5ld2ZpZDsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0ID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiAlbHUsJXMsJXNcbiIsIGRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCXN5bW5hbWUpOworCisJaWYgKCFtaXN0YXQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCF2OXNlcy0+ZXh0ZW5kZWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vdCBleHRlbmRlZFxuIik7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCS8qIGlzc3VlIGEgY3JlYXRlICovCisJcmV0dmFsID0gdjlmc19jcmVhdGUoZGlyLCBkZW50cnksIFNfSUZMTkssIDApOworCWlmIChyZXR2YWwgIT0gMCkKKwkJZ290byBGcmVlRmNhbGw7CisKKwluZXdmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LCBGSURfT1ApOworCisJLyogaXNzdWUgYSB0d3N0YXQgKi8KKwl2OWZzX2JsYW5rX21pc3RhdCh2OXNlcywgbWlzdGF0KTsKKwlzdHJjcHkobWlzdGF0LT5kYXRhICsgMSwgc3ltbmFtZSk7CisJbWlzdGF0LT5leHRlbnNpb24gPSBtaXN0YXQtPmRhdGEgKyAxOworCXJldHZhbCA9IHY5ZnNfdF93c3RhdCh2OXNlcywgbmV3ZmlkLT5maWQsIG1pc3RhdCwgJmZjYWxsKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAidjlmc190X3dzdGF0IGVycm9yOiAlc1xuIiwKKwkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCWtmcmVlKGZjYWxsKTsKKworCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZC0+ZmlkLCAmZmNhbGwpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmb3Igc3ltbGluayBmYWlsZWQ6ICVzXG4iLAorCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJZ290byBGcmVlRmNhbGw7CisJfQorCisJZF9kcm9wKGRlbnRyeSk7CQkvKiBGSUQgLSB3aWxsIHRoaXMgYWxzbyBjbHVuaz8gKi8KKworICAgICAgRnJlZUZjYWxsOgorCWtmcmVlKG1pc3RhdCk7CisJa2ZyZWUoZmNhbGwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB2OWZzX3JlYWRsaW5rIC0gcmVhZCBhIHN5bWxpbmsncyBsb2NhdGlvbiAoaW50ZXJuYWwgdmVyc2lvbikKKyAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluaworICogQGJ1ZmZlcjogYnVmZmVyIHRvIGxvYWQgc3ltbGluayBsb2NhdGlvbiBpbnRvCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgYnVmZmVyCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgcmV0dmFsID0gLUVQRVJNOworCisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSwgRklEX09QKTsKKworCWlmICghZmlkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjb3VsZCBub3QgcmVzb2x2ZSBmaWQgZnJvbSBkZW50cnlcbiIpOworCQlyZXR2YWwgPSAtRUJBREY7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCWlmICghdjlzZXMtPmV4dGVuZGVkKSB7CisJCXJldHZhbCA9IC1FQkFERjsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vdCBleHRlbmRlZFxuIik7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCWRwcmludGsoREVCVUdfVkZTLCAiICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlyZXR2YWwgPSB2OWZzX3Rfc3RhdCh2OXNlcywgZmlkLT5maWQsICZmY2FsbCk7CisKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAic3RhdCBlcnJvclxuIik7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCWlmICghZmNhbGwpCisJCXJldHVybiAtRUlPOworCisJaWYgKCEoZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5tb2RlICYgVjlGU19ETVNZTUxJTkspKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gRnJlZUZjYWxsOworCX0KKworCS8qIGNvcHkgZXh0ZW5zaW9uIGJ1ZmZlciBpbnRvIGJ1ZmZlciAqLworCWlmIChzdHJsZW4oZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5leHRlbnNpb24pIDwgYnVmbGVuKQorCQlidWZsZW4gPSBzdHJsZW4oZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5leHRlbnNpb24pOworCisJbWVtY3B5KGJ1ZmZlciwgZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5leHRlbnNpb24sIGJ1ZmxlbiArIDEpOworCisJcmV0dmFsID0gYnVmbGVuOworCisgICAgICBGcmVlRmNhbGw6CisJa2ZyZWUoZmNhbGwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB2OWZzX3Zmc19yZWFkbGluayAtIHJlYWQgYSBzeW1saW5rJ3MgbG9jYXRpb24KKyAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluaworICogQGJ1ZjogYnVmZmVyIHRvIGxvYWQgc3ltbGluayBsb2NhdGlvbiBpbnRvCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgYnVmZmVyCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc192ZnNfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgICAgaW50IGJ1ZmxlbikKK3sKKwlpbnQgcmV0dmFsOworCWludCByZXQ7CisJY2hhciAqbGluayA9IF9fZ2V0bmFtZSgpOworCisJaWYgKHN0cmxlbihsaW5rKSA8IGJ1ZmxlbikKKwkJYnVmbGVuID0gc3RybGVuKGxpbmspOworCisJZHByaW50ayhERUJVR19WRlMsICIgZGVudHJ5OiAlcyAoJXApXG4iLCBkZW50cnktPmRfaW5hbWUsIGRlbnRyeSk7CisKKwlyZXR2YWwgPSB2OWZzX3JlYWRsaW5rKGRlbnRyeSwgbGluaywgYnVmbGVuKTsKKworCWlmIChyZXR2YWwgPiAwKSB7CisJCWlmICgocmV0ID0gY29weV90b191c2VyKGJ1ZmZlciwgbGluaywgcmV0dmFsKSkgIT0gMCkgeworCQkJZHByaW50ayhERUJVR19FUlJPUiwgInByb2JsZW0gY29weWluZyB0byB1c2VyOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dmFsID0gcmV0OworCQl9CisJfQorCisJcHV0bmFtZShsaW5rKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHY5ZnNfdmZzX2ZvbGxvd19saW5rIC0gZm9sbG93IGEgc3ltbGluayBwYXRoCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKKyAqIEBuZDogbmFtZWlkYXRhCisgKgorICovCisKK3N0YXRpYyB2b2lkICp2OWZzX3Zmc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBsZW4gPSAwOworCWNoYXIgKmxpbmsgPSBfX2dldG5hbWUoKTsKKworCWRwcmludGsoREVCVUdfVkZTLCAiJXMgbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKCFsaW5rKQorCQlsaW5rID0gRVJSX1BUUigtRU5PTUVNKTsKKwllbHNlIHsKKwkJbGVuID0gdjlmc19yZWFkbGluayhkZW50cnksIGxpbmssIHN0cmxlbihsaW5rKSk7CisKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXB1dG5hbWUobGluayk7CisJCQlsaW5rID0gRVJSX1BUUihsZW4pOworCQl9IGVsc2UKKwkJCWxpbmtbbGVuXSA9IDA7CisJfQorCW5kX3NldF9saW5rKG5kLCBsaW5rKTsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHY5ZnNfdmZzX3B1dF9saW5rIC0gcmVsZWFzZSBhIHN5bWxpbmsgcGF0aAorICogQGRlbnRyeTogZGVudHJ5IGZvciBzeW1saW5rCisgKiBAbmQ6IG5hbWVpZGF0YQorICoKKyAqLworCitzdGF0aWMgdm9pZCB2OWZzX3Zmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kLCB2b2lkICpwKQoreworCWNoYXIgKnMgPSBuZF9nZXRfbGluayhuZCk7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiAlcyAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgcyk7CisJaWYgKCFJU19FUlIocykpCisJCXB1dG5hbWUocyk7Cit9CisKKy8qKgorICogdjlmc192ZnNfbGluayAtIGNyZWF0ZSBhIGhhcmRsaW5rCisgKiBAb2xkX2RlbnRyeTogZGVudHJ5IGZvciBmaWxlIHRvIGxpbmsgdG8KKyAqIEBkaXI6IGlub2RlIGRlc3RpbmF0aW9uIGZvciBuZXcgbGluaworICogQGRlbnRyeTogZGVudHJ5IGZvciBsaW5rCisgKgorICovCisKKy8qIFhYWCAtIGxvdHMgb2YgY29kZSBkdXAnZCBmcm9tIHN5bWxpbmsgYW5kIGNyZWF0ZXMsCisgKiBmaWd1cmUgb3V0IGEgYmV0dGVyIHJldXNlIHN0cmF0ZWd5CisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbCA9IC1FUEVSTTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0ID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHY5ZnNfZmlkICpvbGRmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSwgRklEX09QKTsKKwlzdHJ1Y3Qgdjlmc19maWQgKm5ld2ZpZCA9IE5VTEw7CisJY2hhciAqc3ltbmFtZSA9IF9fZ2V0bmFtZSgpOworCisJZHByaW50ayhERUJVR19WRlMsICIgJWx1LCVzLCVzXG4iLCBkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQlvbGRfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIXY5c2VzLT5leHRlbmRlZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm90IGV4dGVuZGVkXG4iKTsKKwkJZ290byBGcmVlTWVtOworCX0KKworCS8qIGdldCBmaWQgb2Ygb2xkX2RlbnRyeSAqLworCXNwcmludGYoc3ltbmFtZSwgImhhcmRsaW5rKCVkKVxuIiwgb2xkZmlkLT5maWQpOworCisJLyogaXNzdWUgYSBjcmVhdGUgKi8KKwlyZXR2YWwgPSB2OWZzX2NyZWF0ZShkaXIsIGRlbnRyeSwgVjlGU19ETUxJTkssIDApOworCWlmIChyZXR2YWwgIT0gMCkKKwkJZ290byBGcmVlTWVtOworCisJbmV3ZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSwgRklEX09QKTsKKwlpZiAoIW5ld2ZpZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY291bGRuJ3QgcmVzb2x2ZSBmaWQgZnJvbSBkZW50cnlcbiIpOworCQlnb3RvIEZyZWVNZW07CisJfQorCisJLyogaXNzdWUgYSB0d3N0YXQgKi8KKwl2OWZzX2JsYW5rX21pc3RhdCh2OXNlcywgbWlzdGF0KTsKKwlzdHJjcHkobWlzdGF0LT5kYXRhICsgMSwgc3ltbmFtZSk7CisJbWlzdGF0LT5leHRlbnNpb24gPSBtaXN0YXQtPmRhdGEgKyAxOworCXJldHZhbCA9IHY5ZnNfdF93c3RhdCh2OXNlcywgbmV3ZmlkLT5maWQsIG1pc3RhdCwgJmZjYWxsKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAidjlmc190X3dzdGF0IGVycm9yOiAlc1xuIiwKKwkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCWdvdG8gRnJlZU1lbTsKKwl9CisKKwlrZnJlZShmY2FsbCk7CisKKwlpZiAodjlmc190X2NsdW5rKHY5c2VzLCBuZXdmaWQtPmZpZCwgJmZjYWxsKSkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2x1bmsgZm9yIHN5bWxpbmsgZmFpbGVkOiAlc1xuIiwKKwkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCWdvdG8gRnJlZU1lbTsKKwl9CisKKwlkX2Ryb3AoZGVudHJ5KTsJCS8qIEZJRCAtIHdpbGwgdGhpcyBhbHNvIGNsdW5rPyAqLworCisJa2ZyZWUoZmNhbGwpOworCWZjYWxsID0gTlVMTDsKKworICAgICAgRnJlZU1lbToKKwlrZnJlZShtaXN0YXQpOworCWtmcmVlKGZjYWxsKTsKKwlwdXRuYW1lKHN5bW5hbWUpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdjlmc192ZnNfbWtub2QgLSBjcmVhdGUgYSBzcGVjaWFsIGZpbGUKKyAqIEBkaXI6IGlub2RlIGRlc3RpbmF0aW9uIGZvciBuZXcgbGluaworICogQGRlbnRyeTogZGVudHJ5IGZvciBmaWxlCisgKiBAbW9kZTogbW9kZSBmb3IgY3JlYXRpb24KKyAqIEBkZXZfdDogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWFsIGZpbGUKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJaW50IHJldHZhbCA9IC1FUEVSTTsKKwlzdHJ1Y3Qgdjlmc19maWQgKm5ld2ZpZDsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0ID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7CisJY2hhciAqc3ltbmFtZSA9IF9fZ2V0bmFtZSgpOworCisJZHByaW50ayhERUJVR19WRlMsICIgJWx1LCVzIG1vZGU6ICV4IE1BSk9SOiAldSBNSU5PUjogJXVcbiIsIGRpci0+aV9pbm8sCisJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CisKKwlpZiAoIW1pc3RhdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIW5ld192YWxpZF9kZXYocmRldikpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBGcmVlTWVtOworCX0KKworCWlmICghdjlzZXMtPmV4dGVuZGVkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJub3QgZXh0ZW5kZWRcbiIpOworCQlnb3RvIEZyZWVNZW07CisJfQorCisJLyogaXNzdWUgYSBjcmVhdGUgKi8KKwlyZXR2YWwgPSB2OWZzX2NyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSwgMCk7CisKKwlpZiAocmV0dmFsICE9IDApCisJCWdvdG8gRnJlZU1lbTsKKworCW5ld2ZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnksIEZJRF9PUCk7CisJaWYgKCFuZXdmaWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNvdWRuJ3QgcmVzb3ZlIGZpZCBmcm9tIGRlbnRyeVxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gRnJlZU1lbTsKKwl9CisKKwkvKiBidWlsZCBleHRlbnNpb24gKi8KKwlpZiAoU19JU0JMSyhtb2RlKSkKKwkJc3ByaW50ZihzeW1uYW1lLCAiYiAldSAldSIsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CisJZWxzZSBpZiAoU19JU0NIUihtb2RlKSkKKwkJc3ByaW50ZihzeW1uYW1lLCAiYyAldSAldSIsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CisJZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpCisJCTsJLyogRE8gTk9USElORyAqLworCWVsc2UgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIEZyZWVNZW07CisJfQorCisJaWYgKCFTX0lTRklGTyhtb2RlKSkgeworCQkvKiBpc3N1ZSBhIHR3c3RhdCAqLworCQl2OWZzX2JsYW5rX21pc3RhdCh2OXNlcywgbWlzdGF0KTsKKwkJc3RyY3B5KG1pc3RhdC0+ZGF0YSArIDEsIHN5bW5hbWUpOworCQltaXN0YXQtPmV4dGVuc2lvbiA9IG1pc3RhdC0+ZGF0YSArIDE7CisJCXJldHZhbCA9IHY5ZnNfdF93c3RhdCh2OXNlcywgbmV3ZmlkLT5maWQsIG1pc3RhdCwgJmZjYWxsKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICJ2OWZzX3Rfd3N0YXQgZXJyb3I6ICVzXG4iLAorCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCQlnb3RvIEZyZWVNZW07CisJCX0KKwl9CisKKwkvKiBuZWVkIHRvIHVwZGF0ZSBkY2FjaGUgc28gd2Ugc2hvdyB1cCAqLworCWtmcmVlKGZjYWxsKTsKKworCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZC0+ZmlkLCAmZmNhbGwpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmb3Igc3ltbGluayBmYWlsZWQ6ICVzXG4iLAorCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJZ290byBGcmVlTWVtOworCX0KKworCWRfZHJvcChkZW50cnkpOwkJLyogRklEIC0gd2lsbCB0aGlzIGFsc28gY2x1bms/ICovCisKKyAgICAgIEZyZWVNZW06CisJa2ZyZWUobWlzdGF0KTsKKwlrZnJlZShmY2FsbCk7CisJcHV0bmFtZShzeW1uYW1lKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2V4dCA9IHsKKwkuY3JlYXRlID0gdjlmc192ZnNfY3JlYXRlLAorCS5sb29rdXAgPSB2OWZzX3Zmc19sb29rdXAsCisJLnN5bWxpbmsgPSB2OWZzX3Zmc19zeW1saW5rLAorCS5saW5rID0gdjlmc192ZnNfbGluaywKKwkudW5saW5rID0gdjlmc192ZnNfdW5saW5rLAorCS5ta2RpciA9IHY5ZnNfdmZzX21rZGlyLAorCS5ybWRpciA9IHY5ZnNfdmZzX3JtZGlyLAorCS5ta25vZCA9IHY5ZnNfdmZzX21rbm9kLAorCS5yZW5hbWUgPSB2OWZzX3Zmc19yZW5hbWUsCisJLnJlYWRsaW5rID0gdjlmc192ZnNfcmVhZGxpbmssCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyLAorCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUgPSB2OWZzX3Zmc19jcmVhdGUsCisJLmxvb2t1cCA9IHY5ZnNfdmZzX2xvb2t1cCwKKwkudW5saW5rID0gdjlmc192ZnNfdW5saW5rLAorCS5ta2RpciA9IHY5ZnNfdmZzX21rZGlyLAorCS5ybWRpciA9IHY5ZnNfdmZzX3JtZGlyLAorCS5ta25vZCA9IHY5ZnNfdmZzX21rbm9kLAorCS5yZW5hbWUgPSB2OWZzX3Zmc19yZW5hbWUsCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyLAorCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHIsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluayA9IHY5ZnNfdmZzX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluayA9IHY5ZnNfdmZzX2ZvbGxvd19saW5rLAorCS5wdXRfbGluayA9IHY5ZnNfdmZzX3B1dF9saW5rLAorCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0ciwKKwkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCit9OwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX3N1cGVyLmMgYi9mcy85cC92ZnNfc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjhmMzUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAvdmZzX3N1cGVyLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiAgbGludXgvZnMvOXAvdmZzX3N1cGVyLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGlhbnMgc3VwZXJibG9jayBvcHMgZm9yIDlQMjAwMC4gSXQgaXMgaW50ZW5kZWQgdGhhdAorICogeW91IG1vdW50IHRoaXMgZmlsZSBzeXN0ZW0gb24gZGlyZWN0b3JpZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgIjlwLmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJjb252LmgiCisjaW5jbHVkZSAiZmlkLmgiCisKK3N0YXRpYyB2b2lkIHY5ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHY5ZnNfc3VwZXJfb3BzOworCisvKioKKyAqIHY5ZnNfY2xlYXJfaW5vZGUgLSByZWxlYXNlIGFuIGlub2RlCisgKiBAaW5vZGU6IGlub2RlIHRvIHJlbGVhc2UKKyAqCisgKi8KKworc3RhdGljIHZvaWQgdjlmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKK30KKworLyoqCisgKiB2OWZzX3NldF9zdXBlciAtIHNldCB0aGUgc3VwZXJibG9jaworICogQHM6IHN1cGVyIGJsb2NrCisgKiBAZGF0YTogZmlsZSBzeXN0ZW0gc3BlY2lmaWMgZGF0YQorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK3sKKwlzLT5zX2ZzX2luZm8gPSBkYXRhOworCXJldHVybiBzZXRfYW5vbl9zdXBlcihzLCBkYXRhKTsKK30KKworLyoqCisgKiB2OWZzX2ZpbGxfc3VwZXIgLSBwb3B1bGF0ZSBzdXBlcmJsb2NrIHdpdGggaW5mbworICogQHNiOiBzdXBlcmJsb2NrCisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqCisgKi8KKworc3RhdGljIHZvaWQKK3Y5ZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLAorCQlpbnQgZmxhZ3MpCit7CisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gZmxzKHY5c2VzLT5tYXhkYXRhIC0gMSk7CisJc2ItPnNfYmxvY2tzaXplID0gMSA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKKwlzYi0+c19tYWdpYyA9IFY5RlNfTUFHSUM7CisJc2ItPnNfb3AgPSAmdjlmc19zdXBlcl9vcHM7CisKKwlzYi0+c19mbGFncyA9IGZsYWdzIHwgTVNfQUNUSVZFIHwgTVNfU1lOQ0hST05PVVMgfCBNU19ESVJTWU5DIHwKKwkgICAgTVNfTk9ESVJBVElNRSB8IE1TX05PQVRJTUU7Cit9CisKKy8qKgorICogdjlmc19nZXRfc2IgLSBtb3VudCBhIHN1cGVyYmxvY2sKKyAqIEBmc190eXBlOiBmaWxlIHN5c3RlbSB0eXBlCisgKiBAZmxhZ3M6IG1vdW50IGZsYWdzCisgKiBAZGV2X25hbWU6IGRldmljZSBuYW1lIHRoYXQgd2FzIG1vdW50ZWQKKyAqIEBkYXRhOiBtb3VudCBvcHRpb25zCisgKgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnY5ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlCisJCQkJICAgICAgICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqcm9vdCA9IE5VTEw7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IE5VTEw7CisJc3RydWN0IHY5ZnNfZmlkICpyb290X2ZpZCA9IE5VTEw7CisJaW50IG1vZGUgPSBTX0lSV1hVR08gfCBTX0lTVlRYOworCXVpZF90IHVpZCA9IGN1cnJlbnQtPmZzdWlkOworCWdpZF90IGdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCWludCBzdGF0X3Jlc3VsdCA9IDA7CisJaW50IG5ld2ZpZCA9IDA7CisJaW50IHJldHZhbCA9IDA7CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiBcbiIpOworCisJdjlzZXMgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXY5c2VzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICgobmV3ZmlkID0gdjlmc19zZXNzaW9uX2luaXQodjlzZXMsIGRldl9uYW1lLCBkYXRhKSkgPCAwKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJwcm9ibGVtIGluaXRpYXRpbmcgc2Vzc2lvblxuIik7CisJCXJldHZhbCA9IG5ld2ZpZDsKKwkJZ290byBmcmVlX3Nlc3Npb247CisJfQorCisJc2IgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHY5ZnNfc2V0X3N1cGVyLCB2OXNlcyk7CisKKwl2OWZzX2ZpbGxfc3VwZXIoc2IsIHY5c2VzLCBmbGFncyk7CisKKwlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBTX0lGRElSIHwgbW9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gcHV0X2JhY2tfc2I7CisJfQorCisJaW5vZGUtPmlfdWlkID0gdWlkOworCWlub2RlLT5pX2dpZCA9IGdpZDsKKworCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCisJaWYgKCFyb290KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gcmVsZWFzZV9pbm9kZTsKKwl9CisKKwlzYi0+c19yb290ID0gcm9vdDsKKworCS8qIFNldHVwIHRoZSBSb290IElub2RlICovCisJcm9vdF9maWQgPSB2OWZzX2ZpZF9jcmVhdGUocm9vdCk7CisJaWYgKHJvb3RfZmlkID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX2RlbnRyeTsKKwl9CisKKwlyb290X2ZpZC0+Zmlkb3BlbiA9IDA7CisJcm9vdF9maWQtPnY5c2VzID0gdjlzZXM7CisKKwlzdGF0X3Jlc3VsdCA9IHY5ZnNfdF9zdGF0KHY5c2VzLCBuZXdmaWQsICZmY2FsbCk7CisJaWYgKHN0YXRfcmVzdWx0IDwgMCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAic3RhdCBlcnJvclxuIik7CisJCXY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkLCBOVUxMKTsKKwkJdjlmc19wdXRfaWRwb29sKG5ld2ZpZCwgJnY5c2VzLT5maWRwb29sKTsKKwl9IGVsc2UgeworCQlyb290X2ZpZC0+ZmlkID0gbmV3ZmlkOworCQlyb290X2ZpZC0+cWlkID0gZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5xaWQ7CisJCXJvb3QtPmRfaW5vZGUtPmlfaW5vID0KKwkJICAgIHY5ZnNfcWlkMmlubygmZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5xaWQpOworCQl2OWZzX21pc3RhdDJpbm9kZShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIHJvb3QtPmRfaW5vZGUsIHNiKTsKKwl9CisKKwlrZnJlZShmY2FsbCk7CisKKwlpZiAoc3RhdF9yZXN1bHQgPCAwKSB7CisJCXJldHZhbCA9IHN0YXRfcmVzdWx0OworCQlnb3RvIHJlbGVhc2VfZGVudHJ5OworCX0KKworCXJldHVybiBzYjsKKworICAgICAgcmVsZWFzZV9kZW50cnk6CisJZHB1dChzYi0+c19yb290KTsKKworICAgICAgcmVsZWFzZV9pbm9kZToKKwlpcHV0KGlub2RlKTsKKworICAgICAgcHV0X2JhY2tfc2I6CisJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJZGVhY3RpdmF0ZV9zdXBlcihzYik7CisJdjlmc19zZXNzaW9uX2Nsb3NlKHY5c2VzKTsKKworICAgICAgZnJlZV9zZXNzaW9uOgorCWtmcmVlKHY5c2VzKTsKKworCXJldHVybiBFUlJfUFRSKHJldHZhbCk7Cit9CisKKy8qKgorICogdjlmc19raWxsX3N1cGVyIC0gS2lsbCBTdXBlcmJsb2NrCisgKiBAczogc3VwZXJibG9jaworICoKKyAqLworCitzdGF0aWMgdm9pZCB2OWZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSBzLT5zX2ZzX2luZm87CisKKwlkcHJpbnRrKERFQlVHX1ZGUywgIiAlcFxuIiwgcyk7CisKKwl2OWZzX2RlbnRyeV9yZWxlYXNlKHMtPnNfcm9vdCk7CS8qIGNsdW5rIHJvb3QgKi8KKworCWtpbGxfYW5vbl9zdXBlcihzKTsKKworCXY5ZnNfc2Vzc2lvbl9jbG9zZSh2OXNlcyk7CisJa2ZyZWUodjlzZXMpOworCWRwcmludGsoREVCVUdfVkZTLCAiZXhpdGluZyBraWxsX3N1cGVyXG4iKTsKK30KKworLyoqCisgKiB2OWZzX3Nob3dfb3B0aW9ucyAtIFNob3cgbW91bnQgb3B0aW9ucyBpbiAvcHJvYy9tb3VudHMKKyAqIEBtOiBzZXFfZmlsZSB0byB3cml0ZSB0bworICogQG1udDogbW91bnQgZGVzY3JpcHRvcgorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IG1udC0+bW50X3NiLT5zX2ZzX2luZm87CisKKwlpZiAodjlzZXMtPmRlYnVnICE9IDApCisJCXNlcV9wcmludGYobSwgIixkZWJ1Zz0ldSIsIHY5c2VzLT5kZWJ1Zyk7CisJaWYgKHY5c2VzLT5wb3J0ICE9IFY5RlNfUE9SVCkKKwkJc2VxX3ByaW50ZihtLCAiLHBvcnQ9JXUiLCB2OXNlcy0+cG9ydCk7CisJaWYgKHY5c2VzLT5tYXhkYXRhICE9IDkwMDApCisJCXNlcV9wcmludGYobSwgIixtc2l6ZT0ldSIsIHY5c2VzLT5tYXhkYXRhKTsKKwlpZiAodjlzZXMtPmFmaWQgIT0gfjApCisJCXNlcV9wcmludGYobSwgIixhZmlkPSV1IiwgdjlzZXMtPmFmaWQpOworCWlmICh2OXNlcy0+cHJvdG8gPT0gUFJPVE9fVU5JWCkKKwkJc2VxX3B1dHMobSwgIixwcm90bz11bml4Iik7CisJaWYgKHY5c2VzLT5leHRlbmRlZCA9PSAwKQorCQlzZXFfcHV0cyhtLCAiLG5vZXh0ZW5kIik7CisJaWYgKHY5c2VzLT5ub2RldiA9PSAxKQorCQlzZXFfcHV0cyhtLCAiLG5vZGV2bWFwIik7CisJc2VxX3ByaW50ZihtLCAiLG5hbWU9JXMiLCB2OXNlcy0+bmFtZSk7CisJc2VxX3ByaW50ZihtLCAiLGFuYW1lPSVzIiwgdjlzZXMtPnJlbW90ZW5hbWUpOworCXNlcV9wcmludGYobSwgIix1aWQ9JXUiLCB2OXNlcy0+dWlkKTsKKwlzZXFfcHJpbnRmKG0sICIsZ2lkPSV1IiwgdjlzZXMtPmdpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2OWZzX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSBzYi0+c19mc19pbmZvOworCisJdjlmc19zZXNzaW9uX2NhbmNlbCh2OXNlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB2OWZzX3N1cGVyX29wcyA9IHsKKwkuc3RhdGZzID0gc2ltcGxlX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUgPSB2OWZzX2NsZWFyX2lub2RlLAorCS5zaG93X29wdGlvbnMgPSB2OWZzX3Nob3dfb3B0aW9ucywKKwkudW1vdW50X2JlZ2luID0gdjlmc191bW91bnRfYmVnaW4sCit9OworCitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2OWZzX2ZzX3R5cGUgPSB7CisJLm5hbWUgPSAiOVAiLAorCS5nZXRfc2IgPSB2OWZzX2dldF9zYiwKKwkua2lsbF9zYiA9IHY5ZnNfa2lsbF9zdXBlciwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBlZDc4ZDI0Li4wNjhjY2VhIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTM4MiwxMCArMzgyLDggQEAKIAkgIHVzYWdlIChhbHNvIGNhbGxlZCBkaXNrIHF1b3RhcykuIEN1cnJlbnRseSwgaXQgd29ya3MgZm9yIHRoZQogCSAgZXh0MiwgZXh0MywgYW5kIHJlaXNlcmZzIGZpbGUgc3lzdGVtLiBleHQzIGFsc28gc3VwcG9ydHMgam91cm5hbGxlZAogCSAgcXVvdGFzIGZvciB3aGljaCB5b3UgZG9uJ3QgbmVlZCB0byBydW4gcXVvdGFjaGVjayg4KSBhZnRlciBhbiB1bmNsZWFuCi0JICBzaHV0ZG93bi4gWW91IG5lZWQgYWRkaXRpb25hbCBzb2Z0d2FyZSBpbiBvcmRlciB0byB1c2UgcXVvdGEgc3VwcG9ydAotCSAgKHlvdSBjYW4gZG93bmxvYWQgc291cmNlcyBmcm9tCi0JICA8aHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGludXhxdW90YS8+KS4gRm9yIGZ1cnRoZXIgZGV0YWlscywgcmVhZAotCSAgdGhlIFF1b3RhIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICBzaHV0ZG93bi4KKwkgIEZvciBmdXJ0aGVyIGRldGFpbHMsIHJlYWQgdGhlIFF1b3RhIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCiAJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBvciB0aGUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZAogCSAgd2l0aCB0aGUgcXVvdGEgdG9vbHMuIFByb2JhYmx5IHRoZSBxdW90YSBzdXBwb3J0IGlzIG9ubHkgdXNlZnVsIGZvcgogCSAgbXVsdGkgdXNlciBzeXN0ZW1zLiBJZiB1bnN1cmUsIHNheSBOLgpAQCAtNDAzLDggKzQwMSw3IEBACiAJZGVwZW5kcyBvbiBRVU9UQQogCWhlbHAKIAkgIFRoaXMgcXVvdGEgZm9ybWF0IGFsbG93cyB1c2luZyBxdW90YXMgd2l0aCAzMi1iaXQgVUlEcy9HSURzLiBJZiB5b3UKLQkgIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5IHNheSBZIGhlcmUuIE5vdGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHJlY2VudAotCSAgcXVvdGEgdXRpbGl0aWVzICg+PSAzLjAxKSBmb3IgbmV3IHF1b3RhIGZvcm1hdCB3aXRoIHRoaXMga2VybmVsLgorCSAgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2F5IFkgaGVyZS4KIAogY29uZmlnIFFVT1RBQ1RMCiAJYm9vbApAQCAtNDY1LDYgKzQ2MiwxOSBAQAogCSAgbG9jYWwgbmV0d29yaywgeW91IHByb2JhYmx5IGRvIG5vdCBuZWVkIGFuIGF1dG9tb3VudGVyLCBhbmQgY2FuIHNheQogCSAgTiBoZXJlLgogCitjb25maWcgRlVTRV9GUworCXRyaXN0YXRlICJGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSBzdXBwb3J0IgorCWhlbHAKKwkgIFdpdGggRlVTRSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBmdWxseSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0KKwkgIGluIGEgdXNlcnNwYWNlIHByb2dyYW0uCisKKwkgIFRoZXJlJ3MgYWxzbyBjb21wYW5pb24gbGlicmFyeTogbGliZnVzZS4gIFRoaXMgbGlicmFyeSBhbG9uZyB3aXRoCisJICB1dGlsaXRpZXMgaXMgYXZhaWxhYmxlIGZyb20gdGhlIEZVU0UgaG9tZXBhZ2U6CisJICA8aHR0cDovL2Z1c2Uuc291cmNlZm9yZ2UubmV0Lz4KKworCSAgSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBhIHVzZXJzcGFjZSBGUywgb3IgaWYgeW91IHdhbnQgdG8gdXNlCisJICBhIGZpbGVzeXN0ZW0gYmFzZWQgb24gRlVTRSwgYW5zd2VyIFkgb3IgTS4KKwogbWVudSAiQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcyIKIAogY29uZmlnIElTTzk2NjBfRlMKQEAgLTgxNiw2ICs4MjYsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAogCSAgcmFtZnMuCiAKK2NvbmZpZyBSRUxBWUZTX0ZTCisJdHJpc3RhdGUgIlJlbGF5ZnMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBSZWxheWZzIGlzIGEgaGlnaC1zcGVlZCBkYXRhIHJlbGF5IGZpbGVzeXN0ZW0gZGVzaWduZWQgdG8gcHJvdmlkZQorCSAgYW4gZWZmaWNpZW50IG1lY2hhbmlzbSBmb3IgdG9vbHMgYW5kIGZhY2lsaXRpZXMgdG8gcmVsYXkgbGFyZ2UKKwkgIGFtb3VudHMgb2YgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgcmVsYXlmcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogZW5kbWVudQogCiBtZW51ICJNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zIgpAQCAtMTY5NCw2ICsxNzE2LDE3IEBACiBjb25maWcgUlhSUEMKIAl0cmlzdGF0ZQogCitjb25maWcgOVBfRlMKKwl0cmlzdGF0ZSAiUGxhbiA5IFJlc291cmNlIFNoYXJpbmcgU3VwcG9ydCAoOVAyMDAwKSAoRXhwZXJpbWVudGFsKSIKKwlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGdldCBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IKKwkgIFBsYW4gOSByZXNvdXJjZSBzaGFyaW5nIHZpYSB0aGUgOVAyMDAwIHByb3RvY29sLgorCisJICBTZWUgPGh0dHA6Ly92OWZzLnNmLm5ldD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZG1lbnUKIAogbWVudSAiUGFydGl0aW9uIFR5cGVzIgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCBjZjk1ZWI4Li4xOTcyZGExIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtODksMTAgKzg5LDEzIEBACiBvYmotJChDT05GSUdfQVVUT0ZTX0ZTKQkJKz0gYXV0b2ZzLwogb2JqLSQoQ09ORklHX0FVVE9GUzRfRlMpCSs9IGF1dG9mczQvCiBvYmotJChDT05GSUdfQURGU19GUykJCSs9IGFkZnMvCitvYmotJChDT05GSUdfRlVTRV9GUykJCSs9IGZ1c2UvCiBvYmotJChDT05GSUdfVURGX0ZTKQkJKz0gdWRmLworb2JqLSQoQ09ORklHX1JFTEFZRlNfRlMpCSs9IHJlbGF5ZnMvCiBvYmotJChDT05GSUdfU1VOX09QRU5QUk9NRlMpCSs9IG9wZW5wcm9tZnMvCiBvYmotJChDT05GSUdfSkZTX0ZTKQkJKz0gamZzLwogb2JqLSQoQ09ORklHX1hGU19GUykJCSs9IHhmcy8KK29iai0kKENPTkZJR185UF9GUykJCSs9IDlwLwogb2JqLSQoQ09ORklHX0FGU19GUykJCSs9IGFmcy8KIG9iai0kKENPTkZJR19CRUZTX0ZTKQkJKz0gYmVmcy8KIG9iai0kKENPTkZJR19IT1NURlMpCQkrPSBob3N0ZnMvCmRpZmYgLS1naXQgYS9mcy9hZmZzL2lub2RlLmMgYi9mcy9hZmZzL2lub2RlLmMKaW5kZXggN2FhNmYyMC4uOWViZTg4MSAxMDA2NDQKLS0tIGEvZnMvYWZmcy9pbm9kZS5jCisrKyBiL2ZzL2FmZnMvaW5vZGUuYwpAQCAtMjU1LDYgKzI1NSw3IEBACiBhZmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXByX2RlYnVnKCJBRkZTOiBkZWxldGVfaW5vZGUoaW5vPSVsdSwgbmxpbms9JXUpXG4iLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX25saW5rKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCWFmZnNfdHJ1bmNhdGUoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCA0ZjY0MWFiLi4zOGY2MjY4IDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXJlZi5oPgogCiAjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDk5LDcgKzUwMCw3IEBACiAJLyogTXVzdCBiZSBkb25lIHVuZGVyIHRoZSBsb2NrIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IGNhbmNlbGxhdGlvbi4KIAkgKiBDYWxsIHRoaXMgYWlvX2ZwdXQgYXMgaXQgZHVwbGljYXRlcyBmcHV0IHZpYSB0aGUgZnB1dF93b3JrLgogCSAqLwotCWlmICh1bmxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPmtpX2ZpbHAtPmZfY291bnQpKSkgeworCWlmICh1bmxpa2VseShyY3VyZWZfZGVjX2FuZF90ZXN0KCZyZXEtPmtpX2ZpbHAtPmZfY291bnQpKSkgewogCQlnZXRfaW9jdHgoY3R4KTsKIAkJc3Bpbl9sb2NrKCZmcHV0X2xvY2spOwogCQlsaXN0X2FkZCgmcmVxLT5raV9saXN0LCAmZnB1dF9oZWFkKTsKQEAgLTU0Niw2ICs1NDcsMjQgQEAKIAlyZXR1cm4gaW9jdHg7CiB9CiAKK3N0YXRpYyBpbnQgbG9ja19raW9jYl9hY3Rpb24odm9pZCAqcGFyYW0pCit7CisJc2NoZWR1bGUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvY2tfa2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCXdhaXRfb25fYml0X2xvY2soJmlvY2ItPmtpX2ZsYWdzLCBLSUZfTE9DS0VELCBsb2NrX2tpb2NiX2FjdGlvbiwKKwkJCSBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfa2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCWtpb2NiQ2xlYXJMb2NrZWQoaW9jYik7CisJd2FrZV91cF9iaXQoJmlvY2ItPmtpX2ZsYWdzLCBLSUZfTE9DS0VEKTsKK30KKwogLyoKICAqIHVzZV9tbQogICoJTWFrZXMgdGhlIGNhbGxpbmcga2VybmVsIHRocmVhZCB0YWtlIG9uIHRoZSBzcGVjaWZpZWQKQEAgLTc4Niw3ICs4MDUsOSBAQAogCQkgKiBIb2xkIGFuIGV4dHJhIHJlZmVyZW5jZSB3aGlsZSByZXRyeWluZyBpL28uCiAJCSAqLwogCQlpb2NiLT5raV91c2VycysrOyAgICAgICAvKiBncmFiIGV4dHJhIHJlZmVyZW5jZSAqLworCQlsb2NrX2tpb2NiKGlvY2IpOwogCQlhaW9fcnVuX2lvY2IoaW9jYik7CisJCXVubG9ja19raW9jYihpb2NiKTsKIAkJaWYgKF9fYWlvX3B1dF9yZXEoY3R4LCBpb2NiKSkgIC8qIGRyb3AgZXh0cmEgcmVmICovCiAJCQlwdXRfaW9jdHgoY3R4KTsKICAJfQpAQCAtMTUyNywxMCArMTU0OCw5IEBACiAJCWdvdG8gb3V0X3B1dF9yZXE7CiAKIAlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKLQlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmN0eC0+cnVuX2xpc3QpKSkgewotCQlhaW9fcnVuX2lvY2IocmVxKTsKLQl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZyZXEtPmtpX3J1bl9saXN0LCAmY3R4LT5ydW5fbGlzdCk7CisJYWlvX3J1bl9pb2NiKHJlcSk7CisJdW5sb2NrX2tpb2NiKHJlcSk7CisJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJ1bl9saXN0KSkgewogCQkvKiBkcmFpbiB0aGUgcnVuIGxpc3QgKi8KIAkJd2hpbGUgKF9fYWlvX3J1bl9pb2NicyhjdHgpKQogCQkJOwpAQCAtMTY2MSw2ICsxNjgxLDcgQEAKIAlpZiAoTlVMTCAhPSBjYW5jZWwpIHsKIAkJc3RydWN0IGlvX2V2ZW50IHRtcDsKIAkJcHJfZGVidWcoImNhbGxpbmcgY2FuY2VsXG4iKTsKKwkJbG9ja19raW9jYihraW9jYik7CiAJCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CiAJCXRtcC5vYmogPSAodTY0KSh1bnNpZ25lZCBsb25nKWtpb2NiLT5raV9vYmoudXNlcjsKIAkJdG1wLmRhdGEgPSBraW9jYi0+a2lfdXNlcl9kYXRhOwpAQCAtMTY3Miw4ICsxNjkzLDkgQEAKIAkJCWlmIChjb3B5X3RvX3VzZXIocmVzdWx0LCAmdG1wLCBzaXplb2YodG1wKSkpCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJfQorCQl1bmxvY2tfa2lvY2Ioa2lvY2IpOwogCX0gZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiaW9jYiBoYXMgbm8gY2FuY2VsIG9wZXJhdGlvblxuIik7CisJCXJldCA9IC1FSU5WQUw7CiAKIAlwdXRfaW9jdHgoY3R4KTsKIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2F1dG9mc19pLmggYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaAppbmRleCA2MTcxNDMxLi45OTBjMjhkIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaApAQCAtMTA1LDYgKzEwNSw3IEBACiAJc3RydWN0IGZpbGUgKnBpcGU7CiAJcGlkX3Qgb3pfcGdycDsKIAlpbnQgY2F0YXRvbmljOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJdW5zaWduZWQgbG9uZyBleHBfdGltZW91dDsKIAlpbm9fdCBuZXh0X2Rpcl9pbm87CiAJc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICpxdWV1ZXM7IC8qIFdhaXQgcXVldWUgcG9pbnRlciAqLwpAQCAtMTM0LDcgKzEzNSw3IEBACiB2b2lkIGF1dG9mc19oYXNoX2RlbGV0ZShzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7CiBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19oYXNoX2VudW0oY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICosb2ZmX3QgKixzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7CiB2b2lkIGF1dG9mc19oYXNoX2RwdXRhbGwoc3RydWN0IGF1dG9mc19kaXJoYXNoICopOwotdm9pZCBhdXRvZnNfaGFzaF9udWtlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqKTsKK3ZvaWQgYXV0b2ZzX2hhc2hfbnVrZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKik7CiAKIC8qIEV4cGlyYXRpb24taGFuZGxpbmcgZnVuY3Rpb25zICovCiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMgYi9mcy9hdXRvZnMvZGlyaGFzaC5jCmluZGV4IDQ0ODE0M2YuLjVjY2ZjZjIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMKKysrIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMjMyLDEzICsyMzIsMTMgQEAKIAogLyogRGVsZXRlIGV2ZXJ5dGhpbmcuICBUaGlzIGlzIHVzZWQgb24gZmlsZXN5c3RlbSBkZXN0cnVjdGlvbiwgc28gd2UKICAgIG1ha2Ugbm8gYXR0ZW1wdCB0byBrZWVwIHRoZSBwb2ludGVycyB2YWxpZCAqLwotdm9pZCBhdXRvZnNfaGFzaF9udWtlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgpCit2b2lkIGF1dG9mc19oYXNoX251a2Uoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpCiB7CiAJaW50IGk7CiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQsICpuZW50OwogCiAJZm9yICggaSA9IDAgOyBpIDwgQVVUT0ZTX0hBU0hfU0laRSA7IGkrKyApIHsKLQkJZm9yICggZW50ID0gZGgtPmhbaV0gOyBlbnQgOyBlbnQgPSBuZW50ICkgeworCQlmb3IgKCBlbnQgPSBzYmktPmRpcmhhc2guaFtpXSA7IGVudCA7IGVudCA9IG5lbnQgKSB7CiAJCQluZW50ID0gZW50LT5uZXh0OwogCQkJaWYgKCBlbnQtPmRlbnRyeSApCiAJCQkJZHB1dChlbnQtPmRlbnRyeSk7CkBAIC0yNDYsNCArMjQ2LDUgQEAKIAkJCWtmcmVlKGVudCk7CiAJCX0KIAl9CisJc2hyaW5rX2RjYWNoZV9zYihzYmktPnNiKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbm9kZS5jIGIvZnMvYXV0b2ZzL2lub2RlLmMKaW5kZXggNDg4OGMxZi4uNjVlNWVkNCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzL2lub2RlLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlpZiAoICFzYmktPmNhdGF0b25pYyApCiAJCWF1dG9mc19jYXRhdG9uaWNfbW9kZShzYmkpOyAvKiBGcmVlIHdhaXQgcXVldWVzLCBjbG9zZSBwaXBlICovCiAKLQlhdXRvZnNfaGFzaF9udWtlKCZzYmktPmRpcmhhc2gpOworCWF1dG9mc19oYXNoX251a2Uoc2JpKTsKIAlmb3IgKCBuID0gMCA7IG4gPCBBVVRPRlNfTUFYX1NZTUxJTktTIDsgbisrICkgewogCQlpZiAoIHRlc3RfYml0KG4sIHNiaS0+c3ltbGlua19iaXRtYXApICkKIAkJCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKQEAgLTE0OCw2ICsxNDgsNyBAQAogCXMtPnNfbWFnaWMgPSBBVVRPRlNfU1VQRVJfTUFHSUM7CiAJcy0+c19vcCA9ICZhdXRvZnNfc29wczsKIAlzLT5zX3RpbWVfZ3JhbiA9IDE7CisJc2JpLT5zYiA9IHM7CiAKIAlyb290X2lub2RlID0gaWdldChzLCBBVVRPRlNfUk9PVF9JTk8pOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9iZnMvYmZzLmggYi9mcy9iZnMvYmZzLmgKaW5kZXggMTAyMGRiYy4uMWZiYzUzZiAxMDA2NDQKLS0tIGEvZnMvYmZzL2Jmcy5oCisrKyBiL2ZzL2Jmcy9iZnMuaApAQCAtMjAsNyArMjAsNiBAQAogCXVuc2lnbmVkIGxvbmcgc2lfbGFzdGk7CiAJdW5zaWduZWQgbG9uZyAqIHNpX2ltYXA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogc2lfc2JoOwkJLyogYnVmZmVyIGhlYWRlciB3L3N1cGVyYmxvY2sgKi8KLQlzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrICogc2lfYmZzX3NiOwkvKiBzdXBlcmJsb2NrIGluIHNpX3NiaC0+Yl9kYXRhICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCmluZGV4IDVhMWU1Y2UuLmUyNDBjMzMgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9kaXIuYworKysgYi9mcy9iZnMvZGlyLmMKQEAgLTIsNiArMiw3IEBACiAgKglmcy9iZnMvZGlyLmMKICAqCUJGUyBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4KICAqCUNvcHlyaWdodCAoQykgMTk5OSwyMDAwICBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqICAgICAgTWFkZSBlbmRpYW5uZXNzLWNsZWFuIGJ5IEFuZHJldyBTdHJpYmJsZWhpbGwgPGFkc0B3b21wb20ub3JnPiAyMDA1CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KQEAgLTIwLDkgKzIxLDkgQEAKICNkZWZpbmUgZHByaW50Zih4Li4uKQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgYmZzX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGlubyk7CitzdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCB1bnNpZ25lZCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pOwogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqIGRpciwgCi0JY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBiZnNfZGlyZW50ICoqIHJlc19kaXIpOwogCiBzdGF0aWMgaW50IGJmc19yZWFkZGlyKHN0cnVjdCBmaWxlICogZiwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CkBAIC01Myw3ICs1NCw3IEBACiAJCQlkZSA9IChzdHJ1Y3QgYmZzX2RpcmVudCAqKShiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKIAkJCWlmIChkZS0+aW5vKSB7CiAJCQkJaW50IHNpemUgPSBzdHJubGVuKGRlLT5uYW1lLCBCRlNfTkFNRUxFTik7Ci0JCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkZS0+bmFtZSwgc2l6ZSwgZi0+Zl9wb3MsIGRlLT5pbm8sIERUX1VOS05PV04pIDwgMCkgeworCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsIHNpemUsIGYtPmZfcG9zLCBsZTE2X3RvX2NwdShkZS0+aW5vKSwgRFRfVU5LTk9XTikgPCAwKSB7CiAJCQkJCWJyZWxzZShiaCk7CiAJCQkJCXVubG9ja19rZXJuZWwoKTsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xMDcsNyArMTA4LDcgQEAKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZiZnNfYW9wczsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV9pbm8gPSBpbm87Ci0JQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBpbm87CisJQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBjcHVfdG9fbGUxNihpbm8pOwogCUJGU19JKGlub2RlKS0+aV9zYmxvY2sgPSAwOwogCUJGU19JKGlub2RlKS0+aV9lYmxvY2sgPSAwOwogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKQEAgLTEzOSw3ICsxNDAsNyBAQAogCWxvY2tfa2VybmVsKCk7CiAJYmggPSBiZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJmRlKTsKIAlpZiAoYmgpIHsKLQkJdW5zaWduZWQgbG9uZyBpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vKTsKKwkJdW5zaWduZWQgbG9uZyBpbm8gPSAodW5zaWduZWQgbG9uZylsZTE2X3RvX2NwdShkZS0+aW5vKTsKIAkJYnJlbHNlKGJoKTsKIAkJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKTsKIAkJaWYgKCFpbm9kZSkgewpAQCAtMTgzLDcgKzE4NCw3IEBACiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJbG9ja19rZXJuZWwoKTsKIAliaCA9IGJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmZGUpOwotCWlmICghYmggfHwgZGUtPmlubyAhPSBpbm9kZS0+aV9pbm8pIAorCWlmICghYmggfHwgbGUxNl90b19jcHUoZGUtPmlubykgIT0gaW5vZGUtPmlfaW5vKQogCQlnb3RvIG91dF9icmVsc2U7CiAKIAlpZiAoIWlub2RlLT5pX25saW5rKSB7CkBAIC0yMjQsNyArMjI1LDcgQEAKIAkJCQlvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgCiAJCQkJb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgJm9sZF9kZSk7CiAKLQlpZiAoIW9sZF9iaCB8fCBvbGRfZGUtPmlubyAhPSBvbGRfaW5vZGUtPmlfaW5vKQorCWlmICghb2xkX2JoIHx8IGxlMTZfdG9fY3B1KG9sZF9kZS0+aW5vKSAhPSBvbGRfaW5vZGUtPmlfaW5vKQogCQlnb3RvIGVuZF9yZW5hbWU7CiAKIAllcnJvciA9IC1FUEVSTTsKQEAgLTI3MCw3ICsyNzEsNyBAQAogCS5yZW5hbWUJCQk9IGJmc19yZW5hbWUsCiB9OwogCi1zdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pCitzdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCB1bnNpZ25lZCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJc3RydWN0IGJmc19kaXJlbnQgKiBkZTsKQEAgLTMwNCw3ICszMDUsNyBAQAogCQkJCX0KIAkJCQlkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCQkJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKLQkJCQlkZS0+aW5vID0gaW5vOworCQkJCWRlLT5pbm8gPSBjcHVfdG9fbGUxNigodTE2KWlubyk7CiAJCQkJZm9yIChpPTA7IGk8QkZTX05BTUVMRU47IGkrKykKIAkJCQkJZGUtPm5hbWVbaV0gPSAoaSA8IG5hbWVsZW4pID8gbmFtZVtpXSA6IDA7CiAJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwpAQCAtMzE3LDcgKzMxOCw3IEBACiAJcmV0dXJuIC1FTk9TUEM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGJmc19uYW1lY21wKGludCBsZW4sIGNvbnN0IGNoYXIgKiBuYW1lLCBjb25zdCBjaGFyICogYnVmZmVyKQorc3RhdGljIGlubGluZSBpbnQgYmZzX25hbWVjbXAoaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqIG5hbWUsIGNvbnN0IGNoYXIgKiBidWZmZXIpCiB7CiAJaWYgKGxlbiA8IEJGU19OQU1FTEVOICYmIGJ1ZmZlcltsZW5dKQogCQlyZXR1cm4gMDsKQEAgLTMyNSw3ICszMjYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCAKLQljb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBiZnNfZGlyZW50ICoqIHJlc19kaXIpCisJY29uc3QgdW5zaWduZWQgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKQogewogCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKQEAgLTM0Niw3ICszNDcsNyBAQAogCQl9CiAJCWRlID0gKHN0cnVjdCBiZnNfZGlyZW50ICopKGJoLT5iX2RhdGEgKyBvZmZzZXQpOwogCQlvZmZzZXQgKz0gQkZTX0RJUkVOVF9TSVpFOwotCQlpZiAoZGUtPmlubyAmJiBiZnNfbmFtZWNtcChuYW1lbGVuLCBuYW1lLCBkZS0+bmFtZSkpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KGRlLT5pbm8pICYmIGJmc19uYW1lY21wKG5hbWVsZW4sIG5hbWUsIGRlLT5uYW1lKSkgewogCQkJKnJlc19kaXIgPSBkZTsKIAkJCXJldHVybiBiaDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvYmZzL2ZpbGUuYyBiL2ZzL2Jmcy9maWxlLmMKaW5kZXggNzQ3ZmQxZS4uODA3NzIzYiAxMDA2NDQKLS0tIGEvZnMvYmZzL2ZpbGUuYworKysgYi9mcy9iZnMvZmlsZS5jCkBAIC00MCw4ICs0MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmZzX21vdmVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCAKLQkJCQl1bnNpZ25lZCBsb25nIHdoZXJlKQorc3RhdGljIGludCBiZnNfbW92ZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHdoZXJlKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtNTcsMjAgKzU3LDIxIEBACiBzdGF0aWMgaW50IGJmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JbG9uZyBwaHlzOworCXVuc2lnbmVkIGxvbmcgcGh5czsKIAlpbnQgZXJyOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKmluZm8gPSBCRlNfU0Ioc2IpOwogCXN0cnVjdCBiZnNfaW5vZGVfaW5mbyAqYmkgPSBCRlNfSShpbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpzYmggPSBpbmZvLT5zaV9zYmg7CiAKLQlpZiAoYmxvY2sgPCAwIHx8IGJsb2NrID4gaW5mby0+c2lfYmxvY2tzKQorCWlmIChibG9jayA+IGluZm8tPnNpX2Jsb2NrcykKIAkJcmV0dXJuIC1FSU87CiAKIAlwaHlzID0gYmktPmlfc2Jsb2NrICsgYmxvY2s7CiAJaWYgKCFjcmVhdGUpIHsKIAkJaWYgKHBoeXMgPD0gYmktPmlfZWJsb2NrKSB7Ci0JCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChncmFudGVkKVxuIiwgY3JlYXRlLCBibG9jaywgcGh5cyk7CisJCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOWx4IChncmFudGVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlLCAodW5zaWduZWQgbG9uZylibG9jaywgcGh5cyk7CiAJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CiAJCX0KIAkJcmV0dXJuIDA7CkBAIC04MCw3ICs4MSw3IEBACiAJICAgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgdGhpcyBmaWxlLCB3ZSBjYW4gZ3JhbnQgaXQgKi8KIAlpZiAoaW5vZGUtPmlfc2l6ZSAmJiBwaHlzIDw9IGJpLT5pX2VibG9jaykgewogCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChpbnRlcmltIGJsb2NrIGdyYW50ZWQpXG4iLCAKLQkJCQljcmVhdGUsIGJsb2NrLCBwaHlzKTsKKwkJCQljcmVhdGUsICh1bnNpZ25lZCBsb25nKWJsb2NrLCBwaHlzKTsKIAkJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC04OCwxMSArODksMTIgQEAKIAkvKiB0aGUgcmVzdCBoYXMgdG8gYmUgcHJvdGVjdGVkIGFnYWluc3QgaXRzZWxmICovCiAJbG9ja19rZXJuZWwoKTsKIAotCS8qIGlmIHRoZSBsYXN0IGRhdGEgYmxvY2sgZm9yIHRoaXMgZmlsZSBpcyB0aGUgbGFzdCBhbGxvY2F0ZWQgYmxvY2ssIHdlIGNhbgotCSAgIGV4dGVuZCB0aGUgZmlsZSB0cml2aWFsbHksIHdpdGhvdXQgbW92aW5nIGl0IGFueXdoZXJlICovCisJLyogaWYgdGhlIGxhc3QgZGF0YSBibG9jayBmb3IgdGhpcyBmaWxlIGlzIHRoZSBsYXN0IGFsbG9jYXRlZAorCSAgIGJsb2NrLCB3ZSBjYW4gZXh0ZW5kIHRoZSBmaWxlIHRyaXZpYWxseSwgd2l0aG91dCBtb3ZpbmcgaXQKKwkgICBhbnl3aGVyZSAqLwogCWlmIChiaS0+aV9lYmxvY2sgPT0gaW5mby0+c2lfbGZfZWJsaykgewogCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChzaW1wbGUgZXh0ZW5zaW9uKVxuIiwgCi0JCQkJY3JlYXRlLCBibG9jaywgcGh5cyk7CisJCQkJY3JlYXRlLCAodW5zaWduZWQgbG9uZylibG9jaywgcGh5cyk7CiAJCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKIAkJaW5mby0+c2lfZnJlZWIgLT0gcGh5cyAtIGJpLT5pX2VibG9jazsKIAkJaW5mby0+c2lfbGZfZWJsayA9IGJpLT5pX2VibG9jayA9IHBoeXM7CkBAIC0xMTQsNyArMTE2LDggQEAKIAl9IGVsc2UKIAkJZXJyID0gMDsKIAotCWRwcmludGYoImM9JWQsIGI9JTA4bHgsIHBoeXM9JTA4bHggKG1vdmVkKVxuIiwgY3JlYXRlLCBibG9jaywgcGh5cyk7CisJZHByaW50ZigiYz0lZCwgYj0lMDhseCwgcGh5cz0lMDhseCAobW92ZWQpXG4iLAorICAgICAgICAgICAgICAgIGNyZWF0ZSwgKHVuc2lnbmVkIGxvbmcpYmxvY2ssIHBoeXMpOwogCWJpLT5pX3NibG9jayA9IHBoeXM7CiAJcGh5cyArPSBibG9jazsKIAlpbmZvLT5zaV9sZl9lYmxrID0gYmktPmlfZWJsb2NrID0gcGh5czsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggNjRlMGZiMy4uYzdiMzlhYTIgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9pbm9kZS5jCisrKyBiL2ZzL2Jmcy9pbm9kZS5jCkBAIC0zLDYgKzMsOCBAQAogICoJQkZTIHN1cGVyYmxvY2sgYW5kIGlub2RlIG9wZXJhdGlvbnMuCiAgKglDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KICAqCUZyb20gZnMvbWluaXgsIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcy4KKyAqCisgKiAgICAgIE1hZGUgZW5kaWFubmVzcy1jbGVhbiBieSBBbmRyZXcgU3RyaWJibGVoaWxsIDxhZHNAd29tcG9tLm9yZz4sIDIwMDUuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTQsNDYgKzU2LDUwIEBACiAJb2ZmID0gKGlubyAtIEJGU19ST09UX0lOTykgJSBCRlNfSU5PREVTX1BFUl9CTE9DSzsKIAlkaSA9IChzdHJ1Y3QgYmZzX2lub2RlICopYmgtPmJfZGF0YSArIG9mZjsKIAotCWlub2RlLT5pX21vZGUgPSAweDAwMDBGRkZGICYgZGktPmlfbW9kZTsKLQlpZiAoZGktPmlfdnR5cGUgPT0gQkZTX1ZESVIpIHsKKwlpbm9kZS0+aV9tb2RlID0gMHgwMDAwRkZGRiAmICBsZTMyX3RvX2NwdShkaS0+aV9tb2RlKTsKKwlpZiAobGUzMl90b19jcHUoZGktPmlfdnR5cGUpID09IEJGU19WRElSKSB7CiAJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKIAkJaW5vZGUtPmlfb3AgPSAmYmZzX2Rpcl9pbm9wczsKIAkJaW5vZGUtPmlfZm9wID0gJmJmc19kaXJfb3BlcmF0aW9uczsKLQl9IGVsc2UgaWYgKGRpLT5pX3Z0eXBlID09IEJGU19WUkVHKSB7CisJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShkaS0+aV92dHlwZSkgPT0gQkZTX1ZSRUcpIHsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOwogCQlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKIAkJaW5vZGUtPmlfZm9wID0gJmJmc19maWxlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJmc19hb3BzOwogCX0KIAotCWlub2RlLT5pX3VpZCA9IGRpLT5pX3VpZDsKLQlpbm9kZS0+aV9naWQgPSBkaS0+aV9naWQ7Ci0JaW5vZGUtPmlfbmxpbmsgPSBkaS0+aV9ubGluazsKKwlCRlNfSShpbm9kZSktPmlfc2Jsb2NrID0gIGxlMzJfdG9fY3B1KGRpLT5pX3NibG9jayk7CisJQkZTX0koaW5vZGUpLT5pX2VibG9jayA9ICBsZTMyX3RvX2NwdShkaS0+aV9lYmxvY2spOworCWlub2RlLT5pX3VpZCA9ICBsZTMyX3RvX2NwdShkaS0+aV91aWQpOworCWlub2RlLT5pX2dpZCA9ICBsZTMyX3RvX2NwdShkaS0+aV9naWQpOworCWlub2RlLT5pX25saW5rID0gIGxlMzJfdG9fY3B1KGRpLT5pX25saW5rKTsKIAlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CisgICAgICAgIGlmIChpbm9kZS0+aV9zaXplIHx8IGlub2RlLT5pX2Jsb2NrcykgZHByaW50ZigiUmVnaXN0ZXJlZCBpbm9kZSB3aXRoICVsbGQgc2l6ZSwgJWxkIGJsb2Nrc1xuIiwgaW5vZGUtPmlfc2l6ZSwgaW5vZGUtPmlfYmxvY2tzKTsKIAlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwotCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGRpLT5pX2F0aW1lOwotCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGRpLT5pX210aW1lOwotCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGRpLT5pX2N0aW1lOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9ICBsZTMyX3RvX2NwdShkaS0+aV9hdGltZSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gIGxlMzJfdG9fY3B1KGRpLT5pX210aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAgbGUzMl90b19jcHUoZGktPmlfY3RpbWUpOwogCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOwogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCUJGU19JKGlub2RlKS0+aV9kc2tfaW5vID0gZGktPmlfaW5vOyAvKiBjYW4gYmUgMCBzbyB3ZSBzdG9yZSBhIGNvcHkgKi8KLQlCRlNfSShpbm9kZSktPmlfc2Jsb2NrID0gZGktPmlfc2Jsb2NrOwotCUJGU19JKGlub2RlKS0+aV9lYmxvY2sgPSBkaS0+aV9lYmxvY2s7CisJQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBsZTE2X3RvX2NwdShkaS0+aV9pbm8pOyAvKiBjYW4gYmUgMCBzbyB3ZSBzdG9yZSBhIGNvcHkgKi8KIAogCWJyZWxzZShiaCk7CiB9CiAKIHN0YXRpYyBpbnQgYmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdW51c2VkKQogewotCXVuc2lnbmVkIGxvbmcgaW5vID0gaW5vZGUtPmlfaW5vOworCXVuc2lnbmVkIGludCBpbm8gPSAodTE2KWlub2RlLT5pX2lubzsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpX3NibG9jazsKIAlzdHJ1Y3QgYmZzX2lub2RlICogZGk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJaW50IGJsb2NrLCBvZmY7CiAKKyAgICAgICAgZHByaW50ZigiaW5vPSUwOHhcbiIsIGlubyk7CisKIAlpZiAoaW5vIDwgQkZTX1JPT1RfSU5PIHx8IGlubyA+IEJGU19TQihpbm9kZS0+aV9zYiktPnNpX2xhc3RpKSB7Ci0JCXByaW50ZigiQmFkIGlub2RlIG51bWJlciAlczolMDhseFxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlubyk7CisJCXByaW50ZigiQmFkIGlub2RlIG51bWJlciAlczolMDh4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xMDEsNyArMTA3LDcgQEAKIAlibG9jayA9IChpbm8gLSBCRlNfUk9PVF9JTk8pL0JGU19JTk9ERVNfUEVSX0JMT0NLICsgMTsKIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CiAJaWYgKCFiaCkgewotCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJcHJpbnRmKCJVbmFibGUgdG8gcmVhZCBpbm9kZSAlczolMDh4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMDksMjQgKzExNSwyNiBAQAogCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOwogCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOwogCi0JaWYgKGlub2RlLT5pX2lubyA9PSBCRlNfUk9PVF9JTk8pCi0JCWRpLT5pX3Z0eXBlID0gQkZTX1ZESVI7CisJaWYgKGlubyA9PSBCRlNfUk9PVF9JTk8pCisJCWRpLT5pX3Z0eXBlID0gY3B1X3RvX2xlMzIoQkZTX1ZESVIpOwogCWVsc2UKLQkJZGktPmlfdnR5cGUgPSBCRlNfVlJFRzsKKwkJZGktPmlfdnR5cGUgPSBjcHVfdG9fbGUzMihCRlNfVlJFRyk7CiAKLQlkaS0+aV9pbm8gPSBpbm9kZS0+aV9pbm87Ci0JZGktPmlfbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JZGktPmlfdWlkID0gaW5vZGUtPmlfdWlkOwotCWRpLT5pX2dpZCA9IGlub2RlLT5pX2dpZDsKLQlkaS0+aV9ubGluayA9IGlub2RlLT5pX25saW5rOwotCWRpLT5pX2F0aW1lID0gaW5vZGUtPmlfYXRpbWUudHZfc2VjOwotCWRpLT5pX210aW1lID0gaW5vZGUtPmlfbXRpbWUudHZfc2VjOwotCWRpLT5pX2N0aW1lID0gaW5vZGUtPmlfY3RpbWUudHZfc2VjOwotCWRpLT5pX3NibG9jayA9IEJGU19JKGlub2RlKS0+aV9zYmxvY2s7Ci0JZGktPmlfZWJsb2NrID0gQkZTX0koaW5vZGUpLT5pX2VibG9jazsKLQlkaS0+aV9lb2Zmc2V0ID0gZGktPmlfc2Jsb2NrICogQkZTX0JTSVpFICsgaW5vZGUtPmlfc2l6ZSAtIDE7CisJZGktPmlfaW5vID0gY3B1X3RvX2xlMTYoaW5vKTsKKwlkaS0+aV9tb2RlID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbW9kZSk7CisJZGktPmlfdWlkID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfdWlkKTsKKwlkaS0+aV9naWQgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9naWQpOworCWRpLT5pX25saW5rID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbmxpbmspOworCWRpLT5pX2F0aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKKwlkaS0+aV9tdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X3NlYyk7CisJZGktPmlfY3RpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9jdGltZS50dl9zZWMpOworICAgICAgICBpX3NibG9jayA9IEJGU19JKGlub2RlKS0+aV9zYmxvY2s7CisJZGktPmlfc2Jsb2NrID0gY3B1X3RvX2xlMzIoaV9zYmxvY2spOworCWRpLT5pX2VibG9jayA9IGNwdV90b19sZTMyKEJGU19JKGlub2RlKS0+aV9lYmxvY2spOworCWRpLT5pX2VvZmZzZXQgPSBjcHVfdG9fbGUzMihpX3NibG9jayAqIEJGU19CU0laRSArIGlub2RlLT5pX3NpemUgLSAxKTsKIAogCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKyAgICAgICAgZHByaW50ZigiV3JpdHRlbiBpbm89JWQgaW50byAlZDolZFxuIixsZTE2X3RvX2NwdShkaS0+aV9pbm8pLGJsb2NrLG9mZik7CiAJYnJlbHNlKGJoKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CkBAIC0xNDAsMTEgKzE0OCwxNCBAQAogCWludCBibG9jaywgb2ZmOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKiBpbmZvID0gQkZTX1NCKHMpOworCXN0cnVjdCBiZnNfaW5vZGVfaW5mbyAqIGJpID0gQkZTX0koaW5vZGUpOwogCi0JZHByaW50ZigiaW5vPSUwOGx4XG4iLCBpbm9kZS0+aV9pbm8pOworCWRwcmludGYoImlubz0lMDhseFxuIiwgaW5vKTsKIAotCWlmIChpbm9kZS0+aV9pbm8gPCBCRlNfUk9PVF9JTk8gfHwgaW5vZGUtPmlfaW5vID4gaW5mby0+c2lfbGFzdGkpIHsKLQkJcHJpbnRmKCJpbnZhbGlkIGlubz0lMDhseFxuIiwgaW5vZGUtPmlfaW5vKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKKwlpZiAoaW5vIDwgQkZTX1JPT1RfSU5PIHx8IGlubyA+IGluZm8tPnNpX2xhc3RpKSB7CisJCXByaW50ZigiaW52YWxpZCBpbm89JTA4bHhcbiIsIGlubyk7CiAJCXJldHVybjsKIAl9CiAJCkBAIC0xNjAsMTMgKzE3MSwxMyBAQAogCQlyZXR1cm47CiAJfQogCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOwotCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOwotCWlmIChkaS0+aV9pbm8pIHsKLQkJaW5mby0+c2lfZnJlZWIgKz0gQkZTX0ZJTEVCTE9DS1MoZGkpOworCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKikgYmgtPmJfZGF0YSArIG9mZjsKKyAgICAgICAgaWYgKGJpLT5pX2Rza19pbm8pIHsKKwkJaW5mby0+c2lfZnJlZWIgKz0gMSArIGJpLT5pX2VibG9jayAtIGJpLT5pX3NibG9jazsKIAkJaW5mby0+c2lfZnJlZWkrKzsKLQkJY2xlYXJfYml0KGRpLT5pX2lubywgaW5mby0+c2lfaW1hcCk7CisJCWNsZWFyX2JpdChpbm8sIGluZm8tPnNpX2ltYXApOwogCQlkdW1wX2ltYXAoImRlbGV0ZV9pbm9kZSIsIHMpOwotCX0KKyAgICAgICAgfQogCWRpLT5pX2lubyA9IDA7CiAJZGktPmlfc2Jsb2NrID0gMDsKIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CkBAIC0yNzIsMTQgKzI4MywxNCBAQAogCiB2b2lkIGR1bXBfaW1hcChjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCiB7Ci0jaWYgMAorI2lmZGVmIERFQlVHCiAJaW50IGk7CiAJY2hhciAqdG1wYnVmID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXRtcGJ1ZikKIAkJcmV0dXJuOwogCWZvciAoaT1CRlNfU0IocyktPnNpX2xhc3RpOyBpPj0wOyBpLS0pIHsKLQkJaWYgKGk+UEFHRV9TSVpFLTEwMCkgYnJlYWs7CisJCWlmIChpID4gUEFHRV9TSVpFLTEwMCkgYnJlYWs7CiAJCWlmICh0ZXN0X2JpdChpLCBCRlNfU0IocyktPnNpX2ltYXApKQogCQkJc3RyY2F0KHRtcGJ1ZiwgIjEiKTsKIAkJZWxzZQpAQCAtMjk1LDcgKzMwNiw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJc3RydWN0IGJmc19zdXBlcl9ibG9jayAqIGJmc19zYjsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLQlpbnQgaSwgaW1hcF9sZW47CisJdW5zaWduZWQgaSwgaW1hcF9sZW47CiAJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbzsKIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMzEwLDE5ICszMjEsMTggQEAKIAlpZighYmgpCiAJCWdvdG8gb3V0OwogCWJmc19zYiA9IChzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKLQlpZiAoYmZzX3NiLT5zX21hZ2ljICE9IEJGU19NQUdJQykgeworCWlmIChsZTMyX3RvX2NwdShiZnNfc2ItPnNfbWFnaWMpICE9IEJGU19NQUdJQykgewogCQlpZiAoIXNpbGVudCkKIAkJCXByaW50ZigiTm8gQkZTIGZpbGVzeXN0ZW0gb24gJXMgKG1hZ2ljPSUwOHgpXG4iLCAKLQkJCQlzLT5zX2lkLCBiZnNfc2ItPnNfbWFnaWMpOworCQkJCXMtPnNfaWQsICBsZTMyX3RvX2NwdShiZnNfc2ItPnNfbWFnaWMpKTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChCRlNfVU5DTEVBTihiZnNfc2IsIHMpICYmICFzaWxlbnQpCiAJCXByaW50ZigiJXMgaXMgdW5jbGVhbiwgY29udGludWluZ1xuIiwgcy0+c19pZCk7CiAKIAlzLT5zX21hZ2ljID0gQkZTX01BR0lDOwotCWluZm8tPnNpX2Jmc19zYiA9IGJmc19zYjsKIAlpbmZvLT5zaV9zYmggPSBiaDsKLQlpbmZvLT5zaV9sYXN0aSA9IChiZnNfc2ItPnNfc3RhcnQgLSBCRlNfQlNJWkUpL3NpemVvZihzdHJ1Y3QgYmZzX2lub2RlKSAKKwlpbmZvLT5zaV9sYXN0aSA9IChsZTMyX3RvX2NwdShiZnNfc2ItPnNfc3RhcnQpIC0gQkZTX0JTSVpFKS9zaXplb2Yoc3RydWN0IGJmc19pbm9kZSkKIAkJCSsgQkZTX1JPT1RfSU5PIC0gMTsKIAogCWltYXBfbGVuID0gaW5mby0+c2lfbGFzdGkvOCArIDE7CkBAIC0zNDYsOCArMzU2LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaW5mby0+c2lfYmxvY2tzID0gKGJmc19zYi0+c19lbmQgKyAxKT4+QkZTX0JTSVpFX0JJVFM7IC8qIGZvciBzdGF0ZnMoMikgKi8KLQlpbmZvLT5zaV9mcmVlYiA9IChiZnNfc2ItPnNfZW5kICsgMSAtIGJmc19zYi0+c19zdGFydCk+PkJGU19CU0laRV9CSVRTOworCWluZm8tPnNpX2Jsb2NrcyA9IChsZTMyX3RvX2NwdShiZnNfc2ItPnNfZW5kKSArIDEpPj5CRlNfQlNJWkVfQklUUzsgLyogZm9yIHN0YXRmcygyKSAqLworCWluZm8tPnNpX2ZyZWViID0gKGxlMzJfdG9fY3B1KGJmc19zYi0+c19lbmQpICsgMSAtICBjcHVfdG9fbGUzMihiZnNfc2ItPnNfc3RhcnQpKT4+QkZTX0JTSVpFX0JJVFM7CiAJaW5mby0+c2lfZnJlZWkgPSAwOwogCWluZm8tPnNpX2xmX2VibGsgPSAwOwogCWluZm8tPnNpX2xmX3NibGsgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCAxZjJkNDY0Li44M2EzNDk1IDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzY3NpL3NnLmg+CQkvKiBmb3Igc3RydWN0IHNnX2lvdmVjICovCiAKICNkZWZpbmUgQklPX1BPT0xfU0laRSAyNTYKIApAQCAtMTA0LDE4ICsxMDUsMjIgQEAKIAlyZXR1cm4gYnZsOwogfQogCi0vKgotICogZGVmYXVsdCBkZXN0cnVjdG9yIGZvciBhIGJpbyBhbGxvY2F0ZWQgd2l0aCBiaW9fYWxsb2NfYmlvc2V0KCkKLSAqLwotc3RhdGljIHZvaWQgYmlvX2Rlc3RydWN0b3Ioc3RydWN0IGJpbyAqYmlvKQordm9pZCBiaW9fZnJlZShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW9fc2V0ICpiaW9fc2V0KQogewogCWNvbnN0IGludCBwb29sX2lkeCA9IEJJT19QT09MX0lEWChiaW8pOwotCXN0cnVjdCBiaW9fc2V0ICpicyA9IGJpby0+Ymlfc2V0OwogCiAJQklPX0JVR19PTihwb29sX2lkeCA+PSBCSU9WRUNfTlJfUE9PTFMpOwogCi0JbWVtcG9vbF9mcmVlKGJpby0+YmlfaW9fdmVjLCBicy0+YnZlY19wb29sc1twb29sX2lkeF0pOwotCW1lbXBvb2xfZnJlZShiaW8sIGJzLT5iaW9fcG9vbCk7CisJbWVtcG9vbF9mcmVlKGJpby0+YmlfaW9fdmVjLCBiaW9fc2V0LT5idmVjX3Bvb2xzW3Bvb2xfaWR4XSk7CisJbWVtcG9vbF9mcmVlKGJpbywgYmlvX3NldC0+YmlvX3Bvb2wpOworfQorCisvKgorICogZGVmYXVsdCBkZXN0cnVjdG9yIGZvciBhIGJpbyBhbGxvY2F0ZWQgd2l0aCBiaW9fYWxsb2NfYmlvc2V0KCkKKyAqLworc3RhdGljIHZvaWQgYmlvX2ZzX2Rlc3RydWN0b3Ioc3RydWN0IGJpbyAqYmlvKQoreworCWJpb19mcmVlKGJpbywgZnNfYmlvX3NldCk7CiB9CiAKIGlubGluZSB2b2lkIGJpb19pbml0KHN0cnVjdCBiaW8gKmJpbykKQEAgLTE3MSw4ICsxNzYsNiBAQAogCQkJYmlvLT5iaV9tYXhfdmVjcyA9IGJ2ZWNfc2xhYnNbaWR4XS5ucl92ZWNzOwogCQl9CiAJCWJpby0+YmlfaW9fdmVjID0gYnZsOwotCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBiaW9fZGVzdHJ1Y3RvcjsKLQkJYmlvLT5iaV9zZXQgPSBiczsKIAl9CiBvdXQ6CiAJcmV0dXJuIGJpbzsKQEAgLTE4MCw3ICsxODMsMTIgQEAKIAogc3RydWN0IGJpbyAqYmlvX2FsbG9jKHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaywgaW50IG5yX2lvdmVjcykKIHsKLQlyZXR1cm4gYmlvX2FsbG9jX2Jpb3NldChnZnBfbWFzaywgbnJfaW92ZWNzLCBmc19iaW9fc2V0KTsKKwlzdHJ1Y3QgYmlvICpiaW8gPSBiaW9fYWxsb2NfYmlvc2V0KGdmcF9tYXNrLCBucl9pb3ZlY3MsIGZzX2Jpb19zZXQpOworCisJaWYgKGJpbykKKwkJYmlvLT5iaV9kZXN0cnVjdG9yID0gYmlvX2ZzX2Rlc3RydWN0b3I7CisKKwlyZXR1cm4gYmlvOwogfQogCiB2b2lkIHplcm9fZmlsbF9iaW8oc3RydWN0IGJpbyAqYmlvKQpAQCAtMjczLDggKzI4MSwxMCBAQAogewogCXN0cnVjdCBiaW8gKmIgPSBiaW9fYWxsb2NfYmlvc2V0KGdmcF9tYXNrLCBiaW8tPmJpX21heF92ZWNzLCBmc19iaW9fc2V0KTsKIAotCWlmIChiKQorCWlmIChiKSB7CisJCWItPmJpX2Rlc3RydWN0b3IgPSBiaW9fZnNfZGVzdHJ1Y3RvcjsKIAkJX19iaW9fY2xvbmUoYiwgYmlvKTsKKwl9CiAKIAlyZXR1cm4gYjsKIH0KQEAgLTU0NiwyMiArNTU2LDM0IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAotc3RhdGljIHN0cnVjdCBiaW8gKl9fYmlvX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJICBpbnQgd3JpdGVfdG9fdm0pCitzdGF0aWMgc3RydWN0IGJpbyAqX19iaW9fbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqcSwKKwkJCQkgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCSAgICAgIHN0cnVjdCBzZ19pb3ZlYyAqaW92LCBpbnQgaW92X2NvdW50LAorCQkJCSAgICAgIGludCB3cml0ZV90b192bSkKIHsKLQl1bnNpZ25lZCBsb25nIGVuZCA9ICh1YWRkciArIGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7Ci0JY29uc3QgaW50IG5yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7Ci0JaW50IHJldCwgb2Zmc2V0LCBpOworCWludCBpLCBqOworCWludCBucl9wYWdlcyA9IDA7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAlzdHJ1Y3QgYmlvICpiaW87CisJaW50IGN1cl9wYWdlID0gMDsKKwlpbnQgcmV0LCBvZmZzZXQ7CiAKLQkvKgotCSAqIHRyYW5zZmVyIGFuZCBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIHRvIGF0IGxlYXN0IGhhcmRzZWN0b3IKLQkgKiBzaXplIGZvciBub3csIGluIHRoZSBmdXR1cmUgd2UgY2FuIHJlbGF4IHRoaXMgcmVzdHJpY3Rpb24KLQkgKi8KLQlpZiAoKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkgfHwgKGxlbiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpKQorCWZvciAoaSA9IDA7IGkgPCBpb3ZfY291bnQ7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHVhZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92W2ldLmlvdl9iYXNlOworCQl1bnNpZ25lZCBsb25nIGxlbiA9IGlvdltpXS5pb3ZfbGVuOworCQl1bnNpZ25lZCBsb25nIGVuZCA9ICh1YWRkciArIGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB1YWRkciA+PiBQQUdFX1NISUZUOworCisJCW5yX3BhZ2VzICs9IGVuZCAtIHN0YXJ0OworCQkvKgorCQkgKiB0cmFuc2ZlciBhbmQgYnVmZmVyIG11c3QgYmUgYWxpZ25lZCB0byBhdCBsZWFzdCBoYXJkc2VjdG9yCisJCSAqIHNpemUgZm9yIG5vdywgaW4gdGhlIGZ1dHVyZSB3ZSBjYW4gcmVsYXggdGhpcyByZXN0cmljdGlvbgorCQkgKi8KKwkJaWYgKCh1YWRkciAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpIHx8IChsZW4gJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCWlmICghbnJfcGFnZXMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG5yX3BhZ2VzKTsKQEAgLTU3Myw0MiArNTk1LDU0IEBACiAJaWYgKCFwYWdlcykKIAkJZ290byBvdXQ7CiAKLQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIHVhZGRyLCBucl9wYWdlcywKLQkJCQkJCXdyaXRlX3RvX3ZtLCAwLCBwYWdlcywgTlVMTCk7Ci0JdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwltZW1zZXQocGFnZXMsIDAsIG5yX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKIAotCWlmIChyZXQgPCBucl9wYWdlcykKLQkJZ290byBvdXQ7CisJZm9yIChpID0gMDsgaSA8IGlvdl9jb3VudDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgdWFkZHIgPSAodW5zaWduZWQgbG9uZylpb3ZbaV0uaW92X2Jhc2U7CisJCXVuc2lnbmVkIGxvbmcgbGVuID0gaW92W2ldLmlvdl9sZW47CisJCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7CisJCWNvbnN0IGludCBsb2NhbF9ucl9wYWdlcyA9IGVuZCAtIHN0YXJ0OworCQljb25zdCBpbnQgcGFnZV9saW1pdCA9IGN1cl9wYWdlICsgbG9jYWxfbnJfcGFnZXM7CisJCQorCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1YWRkciwKKwkJCQkgICAgIGxvY2FsX25yX3BhZ2VzLAorCQkJCSAgICAgd3JpdGVfdG9fdm0sIDAsICZwYWdlc1tjdXJfcGFnZV0sIE5VTEwpOworCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCi0JYmlvLT5iaV9iZGV2ID0gYmRldjsKKwkJaWYgKHJldCA8IGxvY2FsX25yX3BhZ2VzKQorCQkJZ290byBvdXRfdW5tYXA7CiAKLQlvZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7Ci0JZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFIC0gb2Zmc2V0OwogCi0JCWlmIChsZW4gPD0gMCkKLQkJCWJyZWFrOworCQlvZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7CisJCWZvciAoaiA9IGN1cl9wYWdlOyBqIDwgcGFnZV9saW1pdDsgaisrKSB7CisJCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CiAKLQkJaWYgKGJ5dGVzID4gbGVuKQotCQkJYnl0ZXMgPSBsZW47CisJCQlpZiAobGVuIDw9IDApCisJCQkJYnJlYWs7CisJCQkKKwkJCWlmIChieXRlcyA+IGxlbikKKwkJCQlieXRlcyA9IGxlbjsKIAorCQkJLyoKKwkJCSAqIHNvcnJ5Li4uCisJCQkgKi8KKwkJCWlmIChfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2VzW2pdLCBieXRlcywgb2Zmc2V0KSA8IGJ5dGVzKQorCQkJCWJyZWFrOworCisJCQlsZW4gLT0gYnl0ZXM7CisJCQlvZmZzZXQgPSAwOworCQl9CisKKwkJY3VyX3BhZ2UgPSBqOwogCQkvKgotCQkgKiBzb3JyeS4uLgorCQkgKiByZWxlYXNlIHRoZSBwYWdlcyB3ZSBkaWRuJ3QgbWFwIGludG8gdGhlIGJpbywgaWYgYW55CiAJCSAqLwotCQlpZiAoX19iaW9fYWRkX3BhZ2UocSwgYmlvLCBwYWdlc1tpXSwgYnl0ZXMsIG9mZnNldCkgPCBieXRlcykKLQkJCWJyZWFrOwotCi0JCWxlbiAtPSBieXRlczsKLQkJb2Zmc2V0ID0gMDsKKwkJd2hpbGUgKGogPCBwYWdlX2xpbWl0KQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2orK10pOwogCX0KIAotCS8qCi0JICogcmVsZWFzZSB0aGUgcGFnZXMgd2UgZGlkbid0IG1hcCBpbnRvIHRoZSBiaW8sIGlmIGFueQotCSAqLwotCXdoaWxlIChpIDwgbnJfcGFnZXMpCi0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpKytdKTsKLQogCWtmcmVlKHBhZ2VzKTsKIAogCS8qCkBAIC02MTcsOSArNjUxLDE3IEBACiAJaWYgKCF3cml0ZV90b192bSkKIAkJYmlvLT5iaV9ydyB8PSAoMSA8PCBCSU9fUlcpOwogCisJYmlvLT5iaV9iZGV2ID0gYmRldjsKIAliaW8tPmJpX2ZsYWdzIHw9ICgxIDw8IEJJT19VU0VSX01BUFBFRCk7CiAJcmV0dXJuIGJpbzsKLW91dDoKKworIG91dF91bm1hcDoKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlpZighcGFnZXNbaV0pCisJCQlicmVhazsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKKwl9Cisgb3V0OgogCWtmcmVlKHBhZ2VzKTsKIAliaW9fcHV0KGJpbyk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKQEAgLTYzOSw5ICs2ODEsMzMgQEAKIHN0cnVjdCBiaW8gKmJpb19tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkgdW5zaWduZWQgbG9uZyB1YWRkciwgdW5zaWduZWQgaW50IGxlbiwgaW50IHdyaXRlX3RvX3ZtKQogewotCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3Qgc2dfaW92ZWMgaW92OwogCi0JYmlvID0gX19iaW9fbWFwX3VzZXIocSwgYmRldiwgdWFkZHIsIGxlbiwgd3JpdGVfdG9fdm0pOworCWlvdi5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKXVhZGRyOworCWlvdi5pb3ZfbGVuID0gbGVuOworCisJcmV0dXJuIGJpb19tYXBfdXNlcl9pb3YocSwgYmRldiwgJmlvdiwgMSwgd3JpdGVfdG9fdm0pOworfQorCisvKioKKyAqCWJpb19tYXBfdXNlcl9pb3YgLSBtYXAgdXNlciBzZ19pb3ZlYyB0YWJsZSBpbnRvIGJpbworICoJQHE6IHRoZSByZXF1ZXN0X3F1ZXVlX3QgZm9yIHRoZSBiaW8KKyAqCUBiZGV2OiBkZXN0aW5hdGlvbiBibG9jayBkZXZpY2UKKyAqCUBpb3Y6CXRoZSBpb3ZlYy4KKyAqCUBpb3ZfY291bnQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW92ZWMKKyAqCUB3cml0ZV90b192bTogYm9vbCBpbmRpY2F0aW5nIHdyaXRpbmcgdG8gcGFnZXMgb3Igbm90CisgKgorICoJTWFwIHRoZSB1c2VyIHNwYWNlIGFkZHJlc3MgaW50byBhIGJpbyBzdWl0YWJsZSBmb3IgaW8gdG8gYSBibG9jaworICoJZGV2aWNlLiBSZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworc3RydWN0IGJpbyAqYmlvX21hcF91c2VyX2lvdihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkgICAgIHN0cnVjdCBzZ19pb3ZlYyAqaW92LCBpbnQgaW92X2NvdW50LAorCQkJICAgICBpbnQgd3JpdGVfdG9fdm0pCit7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBsZW4gPSAwLCBpOworCisJYmlvID0gX19iaW9fbWFwX3VzZXJfaW92KHEsIGJkZXYsIGlvdiwgaW92X2NvdW50LCB3cml0ZV90b192bSk7CiAKIAlpZiAoSVNfRVJSKGJpbykpCiAJCXJldHVybiBiaW87CkBAIC02NTQsNiArNzIwLDkgQEAKIAkgKi8KIAliaW9fZ2V0KGJpbyk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgaW92X2NvdW50OyBpKyspCisJCWxlbiArPSBpb3ZbaV0uaW92X2xlbjsKKwogCWlmIChiaW8tPmJpX3NpemUgPT0gbGVuKQogCQlyZXR1cm4gYmlvOwogCkBAIC02OTgsNiArNzY3LDgyIEBACiAJYmlvX3B1dChiaW8pOwogfQogCitzdGF0aWMgaW50IGJpb19tYXBfa2Vybl9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyKQoreworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOworCisJYmlvX3B1dChiaW8pOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYmlvICpfX2Jpb19tYXBfa2VybihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHZvaWQgKmRhdGEsCisJCQkJICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJdW5zaWduZWQgbG9uZyBrYWRkciA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdW5zaWduZWQgbG9uZyBlbmQgPSAoa2FkZHIgKyBsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBrYWRkciA+PiBQQUdFX1NISUZUOworCWNvbnN0IGludCBucl9wYWdlcyA9IGVuZCAtIHN0YXJ0OworCWludCBvZmZzZXQsIGk7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gYmlvX2FsbG9jKGdmcF9tYXNrLCBucl9wYWdlcyk7CisJaWYgKCFiaW8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uoa2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDsKKworCQlpZiAobGVuIDw9IDApCisJCQlicmVhazsKKworCQlpZiAoYnl0ZXMgPiBsZW4pCisJCQlieXRlcyA9IGxlbjsKKworCQlpZiAoX19iaW9fYWRkX3BhZ2UocSwgYmlvLCB2aXJ0X3RvX3BhZ2UoZGF0YSksIGJ5dGVzLAorCQkJCSAgIG9mZnNldCkgPCBieXRlcykKKwkJCWJyZWFrOworCisJCWRhdGEgKz0gYnl0ZXM7CisJCWxlbiAtPSBieXRlczsKKwkJb2Zmc2V0ID0gMDsKKwl9CisKKwliaW8tPmJpX2VuZF9pbyA9IGJpb19tYXBfa2Vybl9lbmRpbzsKKwlyZXR1cm4gYmlvOworfQorCisvKioKKyAqCWJpb19tYXBfa2VybgktCW1hcCBrZXJuZWwgYWRkcmVzcyBpbnRvIGJpbworICoJQHE6IHRoZSByZXF1ZXN0X3F1ZXVlX3QgZm9yIHRoZSBiaW8KKyAqCUBkYXRhOiBwb2ludGVyIHRvIGJ1ZmZlciB0byBtYXAKKyAqCUBsZW46IGxlbmd0aCBpbiBieXRlcworICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIGZsYWdzIGZvciBiaW8gYWxsb2NhdGlvbgorICoKKyAqCU1hcCB0aGUga2VybmVsIGFkZHJlc3MgaW50byBhIGJpbyBzdWl0YWJsZSBmb3IgaW8gdG8gYSBibG9jaworICoJZGV2aWNlLiBSZXR1cm5zIGFuIGVycm9yIHBvaW50ZXIgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworc3RydWN0IGJpbyAqYmlvX21hcF9rZXJuKHJlcXVlc3RfcXVldWVfdCAqcSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKKwkJCSB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gX19iaW9fbWFwX2tlcm4ocSwgZGF0YSwgbGVuLCBnZnBfbWFzayk7CisJaWYgKElTX0VSUihiaW8pKQorCQlyZXR1cm4gYmlvOworCisJaWYgKGJpby0+Ymlfc2l6ZSA9PSBsZW4pCisJCXJldHVybiBiaW87CisKKwkvKgorCSAqIERvbid0IHN1cHBvcnQgcGFydGlhbCBtYXBwaW5ncy4KKwkgKi8KKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKIC8qCiAgKiBiaW9fc2V0X3BhZ2VzX2RpcnR5KCkgYW5kIGJpb19jaGVja19wYWdlc19kaXJ0eSgpIGFyZSBzdXBwb3J0IGZ1bmN0aW9ucwogICogZm9yIHBlcmZvcm1pbmcgZGlyZWN0LUlPIGluIEJJT3MuCkBAIC0xMDc1LDYgKzEyMjAsNyBAQAogCiBFWFBPUlRfU1lNQk9MKGJpb19hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKGJpb19wdXQpOworRVhQT1JUX1NZTUJPTChiaW9fZnJlZSk7CiBFWFBPUlRfU1lNQk9MKGJpb19lbmRpbyk7CiBFWFBPUlRfU1lNQk9MKGJpb19pbml0KTsKIEVYUE9SVF9TWU1CT0woX19iaW9fY2xvbmUpOwpAQCAtMTA4NSw2ICsxMjMxLDcgQEAKIEVYUE9SVF9TWU1CT0woYmlvX2dldF9ucl92ZWNzKTsKIEVYUE9SVF9TWU1CT0woYmlvX21hcF91c2VyKTsKIEVYUE9SVF9TWU1CT0woYmlvX3VubWFwX3VzZXIpOworRVhQT1JUX1NZTUJPTChiaW9fbWFwX2tlcm4pOwogRVhQT1JUX1NZTUJPTChiaW9fcGFpcl9yZWxlYXNlKTsKIEVYUE9SVF9TWU1CT0woYmlvX3NwbGl0KTsKIEVYUE9SVF9TWU1CT0woYmlvX3NwbGl0X3Bvb2wpOwpkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCA2YTI1ZDdkLi42Y2JmY2VhIDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CiAKIHN0YXRpYyBpbnQgZnN5bmNfYnVmZmVyc19saXN0KHNwaW5sb2NrX3QgKmxvY2ssIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9iaF9scnVzKHZvaWQpOwpAQCAtOTE3LDggKzkxOCw3IEBACiAJCQkJICogY29udGVudHMgLSBpdCBpcyBhIG5vb3AgaWYgSS9PIGlzIHN0aWxsIGluCiAJCQkJICogZmxpZ2h0IG9uIHBvdGVudGlhbGx5IG9sZGVyIGNvbnRlbnRzLgogCQkJCSAqLwotCQkJCXdhaXRfb25fYnVmZmVyKGJoKTsKLQkJCQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwkJCQlsbF9yd19ibG9jayhTV1JJVEUsIDEsICZiaCk7CiAJCQkJYnJlbHNlKGJoKTsKIAkJCQlzcGluX2xvY2sobG9jayk7CiAJCQl9CkBAIC0yNzkzLDIxICsyNzkzLDIyIEBACiAKIC8qKgogICogbGxfcndfYmxvY2s6IGxvdy1sZXZlbCBhY2Nlc3MgdG8gYmxvY2sgZGV2aWNlcyAoREVQUkVDQVRFRCkKLSAqIEBydzogd2hldGhlciB0byAlUkVBRCBvciAlV1JJVEUgb3IgbWF5YmUgJVJFQURBIChyZWFkYWhlYWQpCisgKiBAcnc6IHdoZXRoZXIgdG8gJVJFQUQgb3IgJVdSSVRFIG9yICVTV1JJVEUgb3IgbWF5YmUgJVJFQURBIChyZWFkYWhlYWQpCiAgKiBAbnI6IG51bWJlciBvZiAmc3RydWN0IGJ1ZmZlcl9oZWFkcyBpbiB0aGUgYXJyYXkKICAqIEBiaHM6IGFycmF5IG9mIHBvaW50ZXJzIHRvICZzdHJ1Y3QgYnVmZmVyX2hlYWQKICAqCi0gKiBsbF9yd19ibG9jaygpIHRha2VzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvICZzdHJ1Y3QgYnVmZmVyX2hlYWRzLAotICogYW5kIHJlcXVlc3RzIGFuIEkvTyBvcGVyYXRpb24gb24gdGhlbSwgZWl0aGVyIGEgJVJFQUQgb3IgYSAlV1JJVEUuCi0gKiBUaGUgdGhpcmQgJVJFQURBIG9wdGlvbiBpcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCi0gKiBnZW5lcmljX21ha2VfcmVxdWVzdCgpIHdoaWNoIGxsX3J3X2Jsb2NrKCkgY2FsbHMuCisgKiBsbF9yd19ibG9jaygpIHRha2VzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvICZzdHJ1Y3QgYnVmZmVyX2hlYWRzLCBhbmQKKyAqIHJlcXVlc3RzIGFuIEkvTyBvcGVyYXRpb24gb24gdGhlbSwgZWl0aGVyIGEgJVJFQUQgb3IgYSAlV1JJVEUuICBUaGUgdGhpcmQKKyAqICVTV1JJVEUgaXMgbGlrZSAlV1JJVEUgb25seSB3ZSBtYWtlIHN1cmUgdGhhdCB0aGUgKmN1cnJlbnQqIGRhdGEgaW4gYnVmZmVycworICogYXJlIHNlbnQgdG8gZGlzay4gVGhlIGZvdXJ0aCAlUkVBREEgb3B0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogZm9yIGdlbmVyaWNfbWFrZV9yZXF1ZXN0KCkgd2hpY2ggbGxfcndfYmxvY2soKSBjYWxscy4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGRyb3BzIGFueSBidWZmZXIgdGhhdCBpdCBjYW5ub3QgZ2V0IGEgbG9jayBvbiAod2l0aCB0aGUKLSAqIEJIX0xvY2sgc3RhdGUgYml0KSwgYW55IGJ1ZmZlciB0aGF0IGFwcGVhcnMgdG8gYmUgY2xlYW4gd2hlbiBkb2luZyBhCi0gKiB3cml0ZSByZXF1ZXN0LCBhbmQgYW55IGJ1ZmZlciB0aGF0IGFwcGVhcnMgdG8gYmUgdXAtdG8tZGF0ZSB3aGVuIGRvaW5nCi0gKiByZWFkIHJlcXVlc3QuICBGdXJ0aGVyIGl0IG1hcmtzIGFzIGNsZWFuIGJ1ZmZlcnMgdGhhdCBhcmUgcHJvY2Vzc2VkIGZvcgotICogd3JpdGluZyAodGhlIGJ1ZmZlciBjYWNoZSB3b24ndCBhc3N1bWUgdGhhdCB0aGV5IGFyZSBhY3R1YWxseSBjbGVhbiB1bnRpbAotICogdGhlIGJ1ZmZlciBnZXRzIHVubG9ja2VkKS4KKyAqIEJIX0xvY2sgc3RhdGUgYml0KSB1bmxlc3MgU1dSSVRFIGlzIHJlcXVpcmVkLCBhbnkgYnVmZmVyIHRoYXQgYXBwZWFycyB0byBiZQorICogY2xlYW4gd2hlbiBkb2luZyBhIHdyaXRlIHJlcXVlc3QsIGFuZCBhbnkgYnVmZmVyIHRoYXQgYXBwZWFycyB0byBiZQorICogdXAtdG8tZGF0ZSB3aGVuIGRvaW5nIHJlYWQgcmVxdWVzdC4gIEZ1cnRoZXIgaXQgbWFya3MgYXMgY2xlYW4gYnVmZmVycyB0aGF0CisgKiBhcmUgcHJvY2Vzc2VkIGZvciB3cml0aW5nICh0aGUgYnVmZmVyIGNhY2hlIHdvbid0IGFzc3VtZSB0aGF0IHRoZXkgYXJlCisgKiBhY3R1YWxseSBjbGVhbiB1bnRpbCB0aGUgYnVmZmVyIGdldHMgdW5sb2NrZWQpLgogICoKICAqIGxsX3J3X2Jsb2NrIHNldHMgYl9lbmRfaW8gdG8gc2ltcGxlIGNvbXBsZXRpb24gaGFuZGxlciB0aGF0IG1hcmtzCiAgKiB0aGUgYnVmZmVyIHVwLXRvLWRhdGUgKGlmIGFwcHJvcmlhdGUpLCB1bmxvY2tzIHRoZSBidWZmZXIgYW5kIHdha2VzCkBAIC0yODIzLDExICsyODI0LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJoc1tpXTsKIAotCQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpCisJCWlmIChydyA9PSBTV1JJVEUpCisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCWVsc2UgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKQogCQkJY29udGludWU7CiAKIAkJZ2V0X2JoKGJoKTsKLQkJaWYgKHJ3ID09IFdSSVRFKSB7CisJCWlmIChydyA9PSBXUklURSB8fCBydyA9PSBTV1JJVEUpIHsKIAkJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKIAkJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CiAJCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CkBAIC0zMDQ2LDEwICszMDQ5LDkgQEAKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJldCA9IGttZW1fY2FjaGVfYWxsb2MoYmhfY2FjaGVwLCBnZnBfZmxhZ3MpOwogCWlmIChyZXQpIHsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCV9fZ2V0X2NwdV92YXIoYmhfYWNjb3VudGluZykubnIrKzsKKwkJZ2V0X2NwdV92YXIoYmhfYWNjb3VudGluZykubnIrKzsKIAkJcmVjYWxjX2JoX3N0YXRlKCk7Ci0JCXByZWVtcHRfZW5hYmxlKCk7CisJCXB1dF9jcHVfdmFyKGJoX2FjY291bnRpbmcpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMzA1OSwxMCArMzA2MSw5IEBACiB7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSk7CiAJa21lbV9jYWNoZV9mcmVlKGJoX2NhY2hlcCwgYmgpOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCV9fZ2V0X2NwdV92YXIoYmhfYWNjb3VudGluZykubnItLTsKKwlnZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5uci0tOwogCXJlY2FsY19iaF9zdGF0ZSgpOwotCXByZWVtcHRfZW5hYmxlKCk7CisJcHV0X2NwdV92YXIoYmhfYWNjb3VudGluZyk7CiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfYnVmZmVyX2hlYWQpOwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGU1NjhjYzQuLjIzMzVmMTQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC04MzYsNyArODM2LDcgQEAKIAkJCQkvKiBnbyBmcm9tIHZhbHVlIHRvIHZhbHVlICsgdGVtcF9sZW4gY29uZGVuc2luZyAKIAkJCQlkb3VibGUgY29tbWFzIHRvIHNpbmdsZXMuIE5vdGUgdGhhdCB0aGlzIGVuZHMgdXAKIAkJCQlhbGxvY2F0aW5nIGEgZmV3IGJ5dGVzIHRvbyBtYW55LCB3aGljaCBpcyBvayAqLwotCQkJCXZvbC0+cGFzc3dvcmQgPSBrY2FsbG9jKDEsIHRlbXBfbGVuLCBHRlBfS0VSTkVMKTsKKwkJCQl2b2wtPnBhc3N3b3JkID0ga3phbGxvYyh0ZW1wX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYodm9sLT5wYXNzd29yZCA9PSBOVUxMKSB7CiAJCQkJCXByaW50aygiQ0lGUzogbm8gbWVtb3J5IGZvciBwYXNzXG4iKTsKIAkJCQkJcmV0dXJuIDE7CkBAIC04NTEsNyArODUxLDcgQEAKIAkJCQl9CiAJCQkJdm9sLT5wYXNzd29yZFtqXSA9IDA7CiAJCQl9IGVsc2UgewotCQkJCXZvbC0+cGFzc3dvcmQgPSBrY2FsbG9jKDEsIHRlbXBfbGVuKzEsIEdGUF9LRVJORUwpOworCQkJCXZvbC0+cGFzc3dvcmQgPSBremFsbG9jKHRlbXBfbGVuKzEsIEdGUF9LRVJORUwpOwogCQkJCWlmKHZvbC0+cGFzc3dvcmQgPT0gTlVMTCkgewogCQkJCQlwcmludGsoIkNJRlM6IG5vIG1lbW9yeSBmb3IgcGFzc1xuIik7CiAJCQkJCXJldHVybiAxOwpAQCAtMTMxNyw3ICsxMzE3LDcgQEAKIAkJc2Vzc2luaXQgaXMgc2VudCBidXQgbm8gc2Vjb25kIG5lZ3Byb3QgKi8KIAkJc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgKiBzZXNfaW5pdF9idWY7CiAJCXN0cnVjdCBzbWJfaGRyICogc21iX2J1ZjsKLQkJc2VzX2luaXRfYnVmID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKKwkJc2VzX2luaXRfYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKIAkJaWYoc2VzX2luaXRfYnVmKSB7CiAJCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX2xlbiA9IDMyOwogCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCkBAIC0xOTY0LDcgKzE5NjQsNyBAQAogLyogV2UgbG9vayBmb3Igb2J2aW91cyBtZXNzZWQgdXAgYmNjIG9yIHN0cmluZ3MgaW4gcmVzcG9uc2Ugc28gd2UgZG8gbm90IGdvIG9mZgogICAgdGhlIGVuZCBzaW5jZSAoYXQgbGVhc3QpIFdJTjJLIGFuZCBXaW5kb3dzIFhQIGhhdmUgYSBtYWpvciBidWcgaW4gbm90IG51bGwKICAgIHRlcm1pbmF0aW5nIGxhc3QgVW5pY29kZSBzdHJpbmcgaW4gcmVzcG9uc2UgICovCi0JCQkJc2VzLT5zZXJ2ZXJPUyA9IGtjYWxsb2MoMSwgMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJc2VzLT5zZXJ2ZXJPUyA9IGt6YWxsb2MoMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYoc2VzLT5zZXJ2ZXJPUyA9PSBOVUxMKQogCQkJCQlnb3RvIHNlc3NzZXR1cF9ub21lbTsKIAkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJPUywKQEAgLTE5NzYsNyArMTk3Niw3IEBACiAJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKIAkJCQkJbGVuID0gVW5pU3Rybmxlbigod2NoYXJfdCAqKWJjY19wdHIsCiAJCQkJCQkJIHJlbWFpbmluZ193b3Jkcy0xKTsKLQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBrY2FsbG9jKDEsIDIgKiAobGVuICsgMSksR0ZQX0tFUk5FTCk7CisJCQkJCXNlcy0+c2VydmVyTk9TID0ga3phbGxvYygyICogKGxlbiArIDEpLEdGUF9LRVJORUwpOwogCQkJCQlpZihzZXMtPnNlcnZlck5PUyA9PSBOVUxMKQogCQkJCQkJZ290byBzZXNzc2V0dXBfbm9tZW07CiAJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck5PUywKQEAgLTE5OTQsNyArMTk5NCw3IEBACiAJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIHJlbWFpbmluZ193b3Jkcyk7CiAgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KIAkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJCSAgICBrY2FsbG9jKDEsIDIqKGxlbisxKSxHRlBfS0VSTkVMKTsKKwkJCQkJCSAgICBremFsbG9jKDIqKGxlbisxKSxHRlBfS0VSTkVMKTsKIAkJCQkJCWlmKHNlcy0+c2VydmVyRG9tYWluID09IE5VTEwpCiAJCQkJCQkJZ290byBzZXNzc2V0dXBfbm9tZW07CiAJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJEb21haW4sCkBAIC0yMDA1LDIyICsyMDA1LDIyIEBACiAJCQkJCX0gLyogZWxzZSBubyBtb3JlIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBzdHJpbmcgKi8KIAkJCQkJZWxzZQogCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSAKLQkJCQkJCQlrY2FsbG9jKDEsIDIsIEdGUF9LRVJORUwpOworCQkJCQkJCWt6YWxsb2MoMiwgR0ZQX0tFUk5FTCk7CiAJCQkJfSBlbHNlIHsJLyogbm8gcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIGFuZCBOT1Mgc3RyaW5nICovCiAJCQkJCS8qIGlmIHRoZXNlIGtjYWxsb2NzIGZhaWwgbm90IG11Y2ggd2UKIAkJCQkJICAgY2FuIGRvLCBidXQgYmV0dGVyIHRvIG5vdCBmYWlsIHRoZQogCQkJCQkgICBzZXNzc2V0dXAgaXRzZWxmICovCiAJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJICAgIGtjYWxsb2MoMSwgMiwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBremFsbG9jKDIsIEdGUF9LRVJORUwpOwogCQkJCQlzZXMtPnNlcnZlck5PUyA9Ci0JCQkJCSAgICBrY2FsbG9jKDEsIDIsIEdGUF9LRVJORUwpOworCQkJCQkgICAga3phbGxvYygyLCBHRlBfS0VSTkVMKTsKIAkJCQl9CiAJCQl9IGVsc2UgewkvKiBBU0NJSSAqLwogCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CiAJCQkJaWYgKCgobG9uZykgYmNjX3B0ciArIGxlbikgLSAobG9uZykKIAkJCQkgICAgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpCiAJCQkJCSAgICA8PSBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkpIHsKLQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGtjYWxsb2MoMSwgbGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGt6YWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKIAkJCQkJaWYoc2VzLT5zZXJ2ZXJPUyA9PSBOVUxMKQogCQkJCQkJZ290byBzZXNzc2V0dXBfbm9tZW07CiAJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJPUyxiY2NfcHRyLCBsZW4pOwpAQCAtMjAzMCw3ICsyMDMwLDcgQEAKIAkJCQkJYmNjX3B0cisrOwogCiAJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7Ci0JCQkJCXNlcy0+c2VydmVyTk9TID0ga2NhbGxvYygxLCBsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9IGt6YWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKIAkJCQkJaWYoc2VzLT5zZXJ2ZXJOT1MgPT0gTlVMTCkKIAkJCQkJCWdvdG8gc2Vzc3NldHVwX25vbWVtOwogCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyTk9TLCBiY2NfcHRyLCBsZW4pOwpAQCAtMjAzOSw3ICsyMDM5LDcgQEAKIAkJCQkJYmNjX3B0cisrOwogCiAJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7Ci0JCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga2NhbGxvYygxLCBsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGt6YWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKIAkJCQkJaWYoc2VzLT5zZXJ2ZXJEb21haW4gPT0gTlVMTCkKIAkJCQkJCWdvdG8gc2Vzc3NldHVwX25vbWVtOwogCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOwpAQCAtMjI0MCw3ICsyMjQwLDcgQEAKICAgIHRoZSBlbmQgc2luY2UgKGF0IGxlYXN0KSBXSU4ySyBhbmQgV2luZG93cyBYUCBoYXZlIGEgbWFqb3IgYnVnIGluIG5vdCBudWxsCiAgICB0ZXJtaW5hdGluZyBsYXN0IFVuaWNvZGUgc3RyaW5nIGluIHJlc3BvbnNlICAqLwogCQkJCQlzZXMtPnNlcnZlck9TID0KLQkJCQkJICAgIGtjYWxsb2MoMSwgMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBremFsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOwogCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJPUywKIAkJCQkJCQkgICAod2NoYXJfdCAqKQogCQkJCQkJCSAgIGJjY19wdHIsIGxlbiwKQEAgLTIyNTQsNyArMjI1NCw3IEBACiAJCQkJCQkJCSByZW1haW5pbmdfd29yZHMKIAkJCQkJCQkJIC0gMSk7CiAJCQkJCQlzZXMtPnNlcnZlck5PUyA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCAyICogKGxlbiArIDEpLAorCQkJCQkJICAgIGt6YWxsb2MoMiAqIChsZW4gKyAxKSwKIAkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJOT1MsCiAJCQkJCQkJCSAgICh3Y2hhcl90ICopYmNjX3B0ciwKQEAgLTIyNjcsNyArMjI2Nyw3IEBACiAJCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgewogCQkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KLQkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGtjYWxsb2MoMSwgMioobGVuKzEpLEdGUF9LRVJORUwpOworCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga3phbGxvYygyKihsZW4rMSksR0ZQX0tFUk5FTCk7CiAJCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyRG9tYWluLAogCQkJCQkJCSAgICAgKHdjaGFyX3QgKiliY2NfcHRyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKQEAgLTIyNzgsMTAgKzIyNzgsMTAgQEAKIAkJCQkJCX0gLyogZWxzZSBubyBtb3JlIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBzdHJpbmcgKi8KIAkJCQkJCWVsc2UKIAkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9Ci0JCQkJCQkJICAgIGtjYWxsb2MoMSwgMixHRlBfS0VSTkVMKTsKKwkJCQkJCQkgICAga3phbGxvYygyLEdGUF9LRVJORUwpOwogCQkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KLQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKLQkJCQkJCXNlcy0+c2VydmVyTk9TID0ga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga3phbGxvYygyLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0ga3phbGxvYygyLCBHRlBfS0VSTkVMKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CS8qIEFTQ0lJICovCiAKQEAgLTIyODksNyArMjI4OSw3IEBACiAJCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gKGxvbmcpCiAJCQkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkKIAkJCQkJICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgewotCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGtjYWxsb2MoMSwgbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck9TID0ga3phbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJPUywgYmNjX3B0ciwgbGVuKTsKIAogCQkJCQkJYmNjX3B0ciArPSBsZW47CkBAIC0yMjk3LDE0ICsyMjk3LDE0IEBACiAJCQkJCQliY2NfcHRyKys7CiAKIAkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7Ci0JCQkJCQlzZXMtPnNlcnZlck5PUyA9IGtjYWxsb2MoMSwgbGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0ga3phbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsKIAkJCQkJCWJjY19wdHIgKz0gbGVuOwogCQkJCQkJYmNjX3B0clswXSA9IDA7CiAJCQkJCQliY2NfcHRyKys7CiAKIAkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7Ci0JCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGtjYWxsb2MoMSwgbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGt6YWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOwogCQkJCQkJYmNjX3B0ciArPSBsZW47CiAJCQkJCQliY2NfcHRyWzBdID0gMDsKQEAgLTI1NTQsNyArMjU1NCw3IEBACiAgICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAogICAgdGVybWluYXRpbmcgbGFzdCBVbmljb2RlIHN0cmluZyBpbiByZXNwb25zZSAgKi8KIAkJCQkJc2VzLT5zZXJ2ZXJPUyA9Ci0JCQkJCSAgICBrY2FsbG9jKDEsIDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOworCQkJCQkgICAga3phbGxvYygyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKIAkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyT1MsCiAJCQkJCQkJICAgKHdjaGFyX3QgKikKIAkJCQkJCQkgICBiY2NfcHRyLCBsZW4sCkBAIC0yNTY5LDcgKzI1NjksNyBAQAogCQkJCQkJCQkgcmVtYWluaW5nX3dvcmRzCiAJCQkJCQkJCSAtIDEpOwogCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPQotCQkJCQkJICAgIGtjYWxsb2MoMSwgMiAqIChsZW4gKyAxKSwKKwkJCQkJCSAgICBremFsbG9jKDIgKiAobGVuICsgMSksCiAJCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+CiAJCQkJCQkJCSAgIHNlcnZlck5PUywKQEAgLTI1ODYsNyArMjU4Niw3IEBACiAJCQkJCQkJbGVuID0gVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLCByZW1haW5pbmdfd29yZHMpOwkKICAgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KIAkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9Ci0JCQkJCQkJICAgIGtjYWxsb2MoMSwgMiAqCisJCQkJCQkJICAgIGt6YWxsb2MoMiAqCiAJCQkJCQkJCSAgICAobGVuICsKIAkJCQkJCQkJICAgICAxKSwKIAkJCQkJCQkJICAgIEdGUF9LRVJORUwpOwpAQCAtMjYxMiwxMyArMjYxMiwxMyBAQAogCQkJCQkJfSAvKiBlbHNlIG5vIG1vcmUgcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIHN0cmluZyAqLwogCQkJCQkJZWxzZQogCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJCQkgICAga2NhbGxvYygxLCAyLAorCQkJCQkJCSAgICBremFsbG9jKDIsCiAJCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJCQkJfSBlbHNlIHsJLyogbm8gcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIGFuZCBOT1Mgc3RyaW5nICovCiAJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCAyLCBHRlBfS0VSTkVMKTsKKwkJCQkJCSAgICBremFsbG9jKDIsIEdGUF9LRVJORUwpOwogCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPQotCQkJCQkJICAgIGtjYWxsb2MoMSwgMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQkgICAga3phbGxvYygyLCBHRlBfS0VSTkVMKTsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CS8qIEFTQ0lJICovCiAJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CkBAIC0yNjI2LDcgKzI2MjYsNyBAQAogCQkJCQkgICAgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpCiAJCQkJCSAgICA8PSBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkpIHsKIAkJCQkJCXNlcy0+c2VydmVyT1MgPQotCQkJCQkJICAgIGtjYWxsb2MoMSwgbGVuICsgMSwKKwkJCQkJCSAgICBremFsbG9jKGxlbiArIDEsCiAJCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLAogCQkJCQkJCWJjY19wdHIsIGxlbik7CkBAIC0yNjM3LDcgKzI2MzcsNyBAQAogCiAJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOwogCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPQotCQkJCQkJICAgIGtjYWxsb2MoMSwgbGVuICsgMSwKKwkJCQkJCSAgICBremFsbG9jKGxlbiArIDEsCiAJCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsKIAkJCQkJCWJjY19wdHIgKz0gbGVuOwpAQCAtMjY0Niw3ICsyNjQ2LDcgQEAKIAogCQkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKIAkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KLQkJCQkJCSAgICBrY2FsbG9jKDEsIGxlbiArIDEsCisJCQkJCQkgICAga3phbGxvYyhsZW4gKyAxLAogCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJEb21haW4sIGJjY19wdHIsIGxlbik7CQogCQkJCQkJYmNjX3B0ciArPSBsZW47CkBAIC0yOTQ4LDcgKzI5NDgsNyBAQAogICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAogICB0ZXJtaW5hdGluZyBsYXN0IFVuaWNvZGUgc3RyaW5nIGluIHJlc3BvbnNlICAqLwogCQkJCQlzZXMtPnNlcnZlck9TID0KLQkJCQkJICAgIGtjYWxsb2MoMSwgMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICBremFsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOwogCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJPUywKIAkJCQkJCQkgICAod2NoYXJfdCAqKQogCQkJCQkJCSAgIGJjY19wdHIsIGxlbiwKQEAgLTI5NjMsNyArMjk2Myw3IEBACiAJCQkJCQkJCSByZW1haW5pbmdfd29yZHMKIAkJCQkJCQkJIC0gMSk7CiAJCQkJCQlzZXMtPnNlcnZlck5PUyA9Ci0JCQkJCQkgICAga2NhbGxvYygxLCAyICogKGxlbiArIDEpLAorCQkJCQkJICAgIGt6YWxsb2MoMiAqIChsZW4gKyAxKSwKIAkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT4KIAkJCQkJCQkJICAgc2VydmVyTk9TLApAQCAtMjk3OSw3ICsyOTc5LDcgQEAKIAkJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIHJlbWFpbmluZ193b3Jkcyk7CQogICAgICAvKiBsYXN0IHN0cmluZyBub3QgYWx3YXlzIG51bGwgdGVybWluYXRlZCAoZS5nLiBmb3IgV2luZG93cyBYUCAmIDIwMDApICovCiAJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQotCQkJCQkJCSAgICBrY2FsbG9jKDEsIDIgKgorCQkJCQkJCSAgICBremFsbG9jKDIgKgogCQkJCQkJCQkgICAgKGxlbiArCiAJCQkJCQkJCSAgICAgMSksCiAJCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKQEAgLTMwMDQsMTcgKzMwMDQsMTcgQEAKIAkJCQkJCQkgICAgPSAwOwogCQkJCQkJfSAvKiBlbHNlIG5vIG1vcmUgcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIHN0cmluZyAqLwogCQkJCQkJZWxzZQotCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga2NhbGxvYygxLCAyLEdGUF9LRVJORUwpOworCQkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0ga3phbGxvYygyLEdGUF9LRVJORUwpOwogCQkJCQl9IGVsc2UgeyAgLyogbm8gcm9vbSBzbyBjcmVhdGUgZHVtbXkgZG9tYWluIGFuZCBOT1Mgc3RyaW5nICovCi0JCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGtjYWxsb2MoMSwgMiwgR0ZQX0tFUk5FTCk7Ci0JCQkJCQlzZXMtPnNlcnZlck5PUyA9IGtjYWxsb2MoMSwgMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGt6YWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9IGt6YWxsb2MoMiwgR0ZQX0tFUk5FTCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewkvKiBBU0NJSSAqLwogCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOwogCQkJCQlpZiAoKChsb25nKSBiY2NfcHRyICsgbGVuKSAtIAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkpIHsKLQkJCQkJCXNlcy0+c2VydmVyT1MgPSBrY2FsbG9jKDEsIGxlbiArIDEsR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck9TID0ga3phbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLGJjY19wdHIsIGxlbik7CiAKIAkJCQkJCWJjY19wdHIgKz0gbGVuOwpAQCAtMzAyMiwxNCArMzAyMiwxNCBAQAogCQkJCQkJYmNjX3B0cisrOwogCiAJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOwotCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBrY2FsbG9jKDEsIGxlbisxLEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBremFsbG9jKGxlbisxLEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsJCiAJCQkJCQliY2NfcHRyICs9IGxlbjsKIAkJCQkJCWJjY19wdHJbMF0gPSAwOwogCQkJCQkJYmNjX3B0cisrOwogCiAJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOwotCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBrY2FsbG9jKDEsIGxlbisxLEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBremFsbG9jKGxlbisxLEdGUF9LRVJORUwpOwogCQkJCQkJc3RybmNweShzZXMtPnNlcnZlckRvbWFpbiwgYmNjX3B0ciwgbGVuKTsKIAkJCQkJCWJjY19wdHIgKz0gbGVuOwogCQkJCQkJYmNjX3B0clswXSA9IDA7CkBAIC0zMTQxLDcgKzMxNDEsNyBAQAogCQkJCWlmKHRjb24tPm5hdGl2ZUZpbGVTeXN0ZW0pCiAJCQkJCWtmcmVlKHRjb24tPm5hdGl2ZUZpbGVTeXN0ZW0pOwogCQkJCXRjb24tPm5hdGl2ZUZpbGVTeXN0ZW0gPQotCQkJCSAgICBrY2FsbG9jKDEsIGxlbmd0aCArIDIsIEdGUF9LRVJORUwpOworCQkJCSAgICBremFsbG9jKGxlbmd0aCArIDIsIEdGUF9LRVJORUwpOwogCQkJCWNpZnNfc3RyZnJvbVVDU19sZSh0Y29uLT5uYXRpdmVGaWxlU3lzdGVtLAogCQkJCQkJICAgKHdjaGFyX3QgKikgYmNjX3B0ciwKIAkJCQkJCSAgIGxlbmd0aCwgbmxzX2NvZGVwYWdlKTsKQEAgLTMxNTksNyArMzE1OSw3IEBACiAJCQkJaWYodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSkKIAkJCQkJa2ZyZWUodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSk7CiAJCQkJdGNvbi0+bmF0aXZlRmlsZVN5c3RlbSA9Ci0JCQkJICAgIGtjYWxsb2MoMSwgbGVuZ3RoICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJICAgIGt6YWxsb2MobGVuZ3RoICsgMSwgR0ZQX0tFUk5FTCk7CiAJCQkJc3RybmNweSh0Y29uLT5uYXRpdmVGaWxlU3lzdGVtLCBiY2NfcHRyLAogCQkJCQlsZW5ndGgpOwogCQkJfQpAQCAtMzIxNSwxMCArMzIxNSw4IEBACiAJfQogCQogCWNpZnNfc2ItPnRjb24gPSBOVUxMOwotCWlmIChzZXMpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDIpOwotCX0KKwlpZiAoc2VzKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyg1MDApKTsKIAlpZiAoc2VzKQogCQlzZXNJbmZvRnJlZShzZXMpOwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwppbmRleCAzZjM1MzhkLi5kMzM1MjY5IDEwMDY0NAotLS0gYS9mcy9jaWZzL2Rpci5jCisrKyBiL2ZzL2NpZnMvZGlyLmMKQEAgLTE0NSwyNCArMTQ1LDIzIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWlmKG5kKSB7Ci0JCWlmICgobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKLQkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7Ci0JCWVsc2UgaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKSB7Ci0JCQlkZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURTsKLQkJCXdyaXRlX29ubHkgPSBUUlVFOwotCQl9IGVsc2UgaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikgewotCQkJLyogR0VORVJJQ19BTEwgaXMgdG9vIG11Y2ggcGVybWlzc2lvbiB0byByZXF1ZXN0ICovCi0JCQkvKiBjYW4gY2F1c2UgdW5uZWNlc3NhcnkgYWNjZXNzIGRlbmllZCBvbiBjcmVhdGUgKi8KLQkJCS8qIGRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX0FMTDsgKi8KLQkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworCWlmKG5kICYmIChuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikpIHsKKwkJaW50IG9mbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFnczsKKworCQlkZXNpcmVkQWNjZXNzID0gMDsKKwkJaWYgKG9mbGFncyAmIEZNT0RFX1JFQUQpCisJCQlkZXNpcmVkQWNjZXNzIHw9IEdFTkVSSUNfUkVBRDsKKwkJaWYgKG9mbGFncyAmIEZNT0RFX1dSSVRFKSB7CisJCQlkZXNpcmVkQWNjZXNzIHw9IEdFTkVSSUNfV1JJVEU7CisJCQlpZiAoIShvZmxhZ3MgJiBGTU9ERV9SRUFEKSkKKwkJCQl3cml0ZV9vbmx5ID0gVFJVRTsKIAkJfQogCi0JCWlmKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiAoT19DUkVBVCB8IE9fRVhDTCkpID09IChPX0NSRUFUIHwgT19FWENMKSkKKwkJaWYoKG9mbGFncyAmIChPX0NSRUFUIHwgT19FWENMKSkgPT0gKE9fQ1JFQVQgfCBPX0VYQ0wpKQogCQkJZGlzcG9zaXRpb24gPSBGSUxFX0NSRUFURTsKLQkJZWxzZSBpZigobmQtPmludGVudC5vcGVuLmZsYWdzICYgKE9fQ1JFQVQgfCBPX1RSVU5DKSkgPT0gKE9fQ1JFQVQgfCBPX1RSVU5DKSkKKwkJZWxzZSBpZigob2ZsYWdzICYgKE9fQ1JFQVQgfCBPX1RSVU5DKSkgPT0gKE9fQ1JFQVQgfCBPX1RSVU5DKSkKIAkJCWRpc3Bvc2l0aW9uID0gRklMRV9PVkVSV1JJVEVfSUY7Ci0JCWVsc2UgaWYoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQ1JFQVQpID09IE9fQ1JFQVQpCisJCWVsc2UgaWYoKG9mbGFncyAmIE9fQ1JFQVQpID09IE9fQ1JFQVQpCiAJCQlkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTl9JRjsKIAkJZWxzZSB7CiAJCQljRllJKDEsKCJDcmVhdGUgZmxhZyBub3Qgc2V0IGluIGNyZWF0ZSBmdW5jdGlvbiIpKTsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNmIwNmI2Yi4uYWMzZmI5ZSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTMxMCw5NiArMzEwLDYgQEAKIAogX19pbml0Y2FsbChpbml0X3N5czMyX2lvY3RsKTsKIAotaW50IHJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbih1bnNpZ25lZCBpbnQgY21kLAotCQkJCWlvY3RsX3RyYW5zX2hhbmRsZXJfdCBoYW5kbGVyKQotewotCXN0cnVjdCBpb2N0bF90cmFucyAqdDsKLQlzdHJ1Y3QgaW9jdGxfdHJhbnMgKm5ld190OwotCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGlvY3RsMzJfaGFzaChjbWQpOwotCi0JbmV3X3QgPSBrbWFsbG9jKHNpemVvZigqbmV3X3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld190KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRvd25fd3JpdGUoJmlvY3RsMzJfc2VtKTsKLQlmb3IgKHQgPSBpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF07IHQ7IHQgPSB0LT5uZXh0KSB7Ci0JCWlmICh0LT5jbWQgPT0gY21kKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byByZWdpc3RlciBkdXBsaWNhdGVkIGlvY3RsMzIgIgotCQkJCQkiaGFuZGxlciAleFxuIiwgY21kKTsKLQkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7Ci0JCQlrZnJlZShuZXdfdCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsgCi0JCX0KLQl9Ci0JbmV3X3QtPm5leHQgPSBOVUxMOwotCW5ld190LT5jbWQgPSBjbWQ7Ci0JbmV3X3QtPmhhbmRsZXIgPSBoYW5kbGVyOwotCWlvY3RsMzJfaW5zZXJ0X3RyYW5zbGF0aW9uKG5ld190KTsKLQotCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbik7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJ1aWx0aW5faW9jdGwoc3RydWN0IGlvY3RsX3RyYW5zICp0KQoteyAKLQlyZXR1cm4gdCA+PSBpb2N0bF9zdGFydCAmJiB0IDwgKGlvY3RsX3N0YXJ0ICsgaW9jdGxfdGFibGVfc2l6ZSk7Ci19IAotCi0vKiBQcm9ibGVtOiAKLSAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IHVucmVnaXN0ZXIgZHVwbGljYXRlIGlvY3RscywgYmVjYXVzZSB0aGV5IGFyZSBub3QKLSAgIHVuaXF1ZS4KLSAgIFdoZW4gdGhleSBoYXBwZW4gd2UgbmVlZCB0byBleHRlbmQgdGhlIHByb3RvdHlwZSB0byBwYXNzIHRoZSBoYW5kbGVyIHRvby4gKi8KLQotaW50IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQpCi17Ci0JdW5zaWduZWQgbG9uZyBoYXNoID0gaW9jdGwzMl9oYXNoKGNtZCk7Ci0Jc3RydWN0IGlvY3RsX3RyYW5zICp0LCAqdDE7Ci0KLQlkb3duX3dyaXRlKCZpb2N0bDMyX3NlbSk7Ci0KLQl0ID0gaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdOwotCWlmICghdCkgeyAKLQkJdXBfd3JpdGUoJmlvY3RsMzJfc2VtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSAKLQotCWlmICh0LT5jbWQgPT0gY21kKSB7IAotCQlpZiAoYnVpbHRpbl9pb2N0bCh0KSkgewotCQkJcHJpbnRrKCIlcCB0cmllZCB0byB1bnJlZ2lzdGVyIGJ1aWx0aW4gaW9jdGwgJXhcbiIsCi0JCQkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBjbWQpOwotCQl9IGVsc2UgeyAKLQkJCWlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXSA9IHQtPm5leHQ7Ci0JCQl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOwotCQkJa2ZyZWUodCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gCi0Jd2hpbGUgKHQtPm5leHQpIHsKLQkJdDEgPSB0LT5uZXh0OwotCQlpZiAodDEtPmNtZCA9PSBjbWQpIHsgCi0JCQlpZiAoYnVpbHRpbl9pb2N0bCh0MSkpIHsKLQkJCQlwcmludGsoIiVwIHRyaWVkIHRvIHVucmVnaXN0ZXIgYnVpbHRpbiAiCi0JCQkJCSJpb2N0bCAleFxuIiwKLQkJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBjbWQpOwotCQkJCWdvdG8gb3V0OwotCQkJfSBlbHNlIHsgCi0JCQkJdC0+bmV4dCA9IHQxLT5uZXh0OwotCQkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7Ci0JCQkJa2ZyZWUodDEpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCXQgPSB0MTsKLQl9Ci0JcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gZnJlZSB1bmtub3duIDMyYml0IGlvY3RsIGhhbmRsZXIgJXhcbiIsCi0JCQkJY21kKTsKLW91dDoKLQl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOwotCXJldHVybiAtRUlOVkFMOwotfQotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbik7IAotCiBzdGF0aWMgdm9pZCBjb21wYXRfaW9jdGxfZXJyb3Ioc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwKIAkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC03MjAsMTQgKzYzMCwxNCBAQAogc3RydWN0IGNvbXBhdF9uY3BfbW91bnRfZGF0YSB7CiAJY29tcGF0X2ludF90IHZlcnNpb247CiAJY29tcGF0X3VpbnRfdCBuY3BfZmQ7Ci0JY29tcGF0X3VpZF90IG1vdW50ZWRfdWlkOworCV9fY29tcGF0X3VpZF90IG1vdW50ZWRfdWlkOwogCWNvbXBhdF9waWRfdCB3ZG9nX3BpZDsKIAl1bnNpZ25lZCBjaGFyIG1vdW50ZWRfdm9sW05DUF9WT0xOQU1FX0xFTiArIDFdOwogCWNvbXBhdF91aW50X3QgdGltZV9vdXQ7CiAJY29tcGF0X3VpbnRfdCByZXRyeV9jb3VudDsKIAljb21wYXRfdWludF90IGZsYWdzOwotCWNvbXBhdF91aWRfdCB1aWQ7Ci0JY29tcGF0X2dpZF90IGdpZDsKKwlfX2NvbXBhdF91aWRfdCB1aWQ7CisJX19jb21wYXRfZ2lkX3QgZ2lkOwogCWNvbXBhdF9tb2RlX3QgZmlsZV9tb2RlOwogCWNvbXBhdF9tb2RlX3QgZGlyX21vZGU7CiB9OwpAQCAtNzg0LDkgKzY5NCw5IEBACiAKIHN0cnVjdCBjb21wYXRfc21iX21vdW50X2RhdGEgewogCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOwotCWNvbXBhdF91aWRfdCBtb3VudGVkX3VpZDsKLQljb21wYXRfdWlkX3QgdWlkOwotCWNvbXBhdF9naWRfdCBnaWQ7CisJX19jb21wYXRfdWlkX3QgbW91bnRlZF91aWQ7CisJX19jb21wYXRfdWlkX3QgdWlkOworCV9fY29tcGF0X2dpZF90IGdpZDsKIAljb21wYXRfbW9kZV90IGZpbGVfbW9kZTsKIAljb21wYXRfbW9kZV90IGRpcl9tb2RlOwogfTsKQEAgLTEzNjUsNiArMTI3NSwxNiBAQAogfQogCiAvKgorICogRXhhY3RseSBsaWtlIGZzL29wZW4uYzpzeXNfb3BlbigpLCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHNldCB0aGUKKyAqIE9fTEFSR0VGSUxFIGZsYWcuCisgKi8KK2FzbWxpbmthZ2UgbG9uZworY29tcGF0X3N5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKwlyZXR1cm4gZG9fc3lzX29wZW4oZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKK30KKworLyoKICAqIGNvbXBhdF9jb3VudCgpIGNvdW50cyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy9lbnZlbG9wZXMuIEl0IGlzIGJhc2ljYWxseQogICogYSBjb3B5IG9mIGNvdW50KCkgZnJvbSBmcy9leGVjLmMsIGV4Y2VwdCB0aGF0IGl0IHdvcmtzIHdpdGggMzIgYml0IGFyZ3YKICAqIGFuZCBlbnZwIHBvaW50ZXJzLgpAQCAtMTY5OSw2ICsxNjE5LDcgQEAKIAljaGFyICpiaXRzOwogCWxvbmcgdGltZW91dDsKIAlpbnQgc2l6ZSwgbWF4X2Zkc2V0LCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJaWYgKHR2cCkgewpAQCAtMTcyNCw3ICsxNjQ1LDEwIEBACiAJCWdvdG8gb3V0X25vZmRzOwogCiAJLyogbWF4X2Zkc2V0IGNhbiBpbmNyZWFzZSwgc28gZ3JhYiBpdCBvbmNlIHRvIGF2b2lkIHJhY2UgKi8KLQltYXhfZmRzZXQgPSBjdXJyZW50LT5maWxlcy0+bWF4X2Zkc2V0OworCXJjdV9yZWFkX2xvY2soKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwltYXhfZmRzZXQgPSBmZHQtPm1heF9mZHNldDsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAobiA+IG1heF9mZHNldCkKIAkJbiA9IG1heF9mZHNldDsKIApAQCAtMTgwOCw4ICsxNzMyLDggQEAKIAljb21wYXRfZGV2X3QJZXgzMl9kZXY7CiAJY29tcGF0X2lub190CWV4MzJfaW5vOwogCWNvbXBhdF9pbnRfdAlleDMyX2ZsYWdzOwotCWNvbXBhdF91aWRfdAlleDMyX2Fub25fdWlkOwotCWNvbXBhdF9naWRfdAlleDMyX2Fub25fZ2lkOworCV9fY29tcGF0X3VpZF90CWV4MzJfYW5vbl91aWQ7CisJX19jb21wYXRfZ2lkX3QJZXgzMl9hbm9uX2dpZDsKIH07CiAKIHN0cnVjdCBjb21wYXRfbmZzY3RsX2ZkcGFybSB7CmRpZmYgLS1naXQgYS9mcy9jb21wYXRfaW9jdGwuYyBiL2ZzL2NvbXBhdF9pb2N0bC5jCmluZGV4IDE1NWU2MTIuLmUyOGE3NDIgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdF9pb2N0bC5jCisrKyBiL2ZzL2NvbXBhdF9pb2N0bC5jCkBAIC03OTgsMTMgKzc5OCwxNiBAQAogCQlyID0gKHZvaWQgKikgJnI0OwogCX0KIAotCWlmIChyZXQpCi0JCXJldHVybiAtRUZBVUxUOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQogCiAJc2V0X2ZzIChLRVJORUxfRFMpOwogCXJldCA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHIpOwogCXNldF9mcyAob2xkX2ZzKTsKIAorb3V0OgogCWlmIChteXNvY2spCiAJCXNvY2tmZF9wdXQobXlzb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2lub2RlLmMgYi9mcy9jcmFtZnMvaW5vZGUuYwppbmRleCA2YzI4NWVmYS4uN2ZlODU0MTUgMTAwNjQ0Ci0tLSBhL2ZzL2NyYW1mcy9pbm9kZS5jCisrKyBiL2ZzL2NyYW1mcy9pbm9kZS5jCkBAIC0zOSwxMiArMzksNDcgQEAKICNkZWZpbmUgQ1JBTUlOTyh4KQkoKHgpLT5vZmZzZXQ/KHgpLT5vZmZzZXQ8PDI6MSkKICNkZWZpbmUgT0ZGU0VUKHgpCSgoeCktPmlfaW5vKQogCi1zdGF0aWMgc3RydWN0IGlub2RlICpnZXRfY3JhbWZzX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjcmFtZnNfaW5vZGUgKiBjcmFtZnNfaW5vZGUpCisKK3N0YXRpYyBpbnQgY3JhbWZzX2lnZXQ1X3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlzdHJ1Y3QgY3JhbWZzX2lub2RlICpjcmFtZnNfaW5vZGUgPSBvcGFxdWU7CisKKwlpZiAoaW5vZGUtPmlfaW5vICE9IENSQU1JTk8oY3JhbWZzX2lub2RlKSkKKwkJcmV0dXJuIDA7IC8qIGRvZXMgbm90IG1hdGNoICovCisKKwlpZiAoaW5vZGUtPmlfaW5vICE9IDEpCisJCXJldHVybiAxOworCisJLyogYWxsIGVtcHR5IGRpcmVjdG9yaWVzLCBjaGFyLCBibG9jaywgcGlwZSwgYW5kIHNvY2ssIHNoYXJlIGlub2RlICMxICovCisKKwlpZiAoKGlub2RlLT5pX21vZGUgIT0gY3JhbWZzX2lub2RlLT5tb2RlKSB8fAorCSAgICAoaW5vZGUtPmlfZ2lkICE9IGNyYW1mc19pbm9kZS0+Z2lkKSB8fAorCSAgICAoaW5vZGUtPmlfdWlkICE9IGNyYW1mc19pbm9kZS0+dWlkKSkKKwkJcmV0dXJuIDA7IC8qIGRvZXMgbm90IG1hdGNoICovCisKKwlpZiAoKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgJiYKKwkgICAgKGlub2RlLT5pX3JkZXYgIT0gb2xkX2RlY29kZV9kZXYoY3JhbWZzX2lub2RlLT5zaXplKSkpCisJCXJldHVybiAwOyAvKiBkb2VzIG5vdCBtYXRjaCAqLworCisJcmV0dXJuIDE7IC8qIG1hdGNoZXMgKi8KK30KKworc3RhdGljIGludCBjcmFtZnNfaWdldDVfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgY3JhbWZzX2lub2RlICpjcmFtZnNfaW5vZGUgPSBvcGFxdWU7CisJaW5vZGUtPmlfaW5vID0gQ1JBTUlOTyhjcmFtZnNfaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpnZXRfY3JhbWZzX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGNyYW1mc19pbm9kZSAqIGNyYW1mc19pbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaWdldDVfbG9ja2VkKHNiLCBDUkFNSU5PKGNyYW1mc19pbm9kZSksCisJCQkJCSAgICBjcmFtZnNfaWdldDVfdGVzdCwgY3JhbWZzX2lnZXQ1X3NldCwKKwkJCQkJICAgIGNyYW1mc19pbm9kZSk7CiAJc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB6ZXJvdGltZTsKIAotCWlmIChpbm9kZSkgeworCWlmIChpbm9kZSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKIAkJaW5vZGUtPmlfbW9kZSA9IGNyYW1mc19pbm9kZS0+bW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3JhbWZzX2lub2RlLT51aWQ7CiAJCWlub2RlLT5pX3NpemUgPSBjcmFtZnNfaW5vZGUtPnNpemU7CkBAIC01OCw3ICs5Myw2IEBACiAJCSAgIGJ1dCBpdCdzIHRoZSBiZXN0IHdlIGNhbiBkbyB3aXRob3V0IHJlYWRpbmcgdGhlIGRpcmVjdG9yeQogCSAgICAgICAgICAgY29udGVudHMuICAxIHlpZWxkcyB0aGUgcmlnaHQgcmVzdWx0IGluIEdOVSBmaW5kLCBldmVuCiAJCSAgIHdpdGhvdXQgLW5vbGVhZiBvcHRpb24uICovCi0JCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKIAkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCWlub2RlLT5pX2ZvcCA9ICZnZW5lcmljX3JvX2ZvcHM7CiAJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNyYW1mc19hb3BzOwpAQCAtNzQsNiArMTA4LDcgQEAKIAkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKIAkJCQlvbGRfZGVjb2RlX2RldihjcmFtZnNfaW5vZGUtPnNpemUpKTsKIAkJfQorCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAl9CiAJcmV0dXJuIGlub2RlOwogfQpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL3VuY29tcHJlc3MuYyBiL2ZzL2NyYW1mcy91bmNvbXByZXNzLmMKaW5kZXggNTAzNDM2NS4uOGRlZjg5ZiAxMDA2NDQKLS0tIGEvZnMvY3JhbWZzL3VuY29tcHJlc3MuYworKysgYi9mcy9jcmFtZnMvdW5jb21wcmVzcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvemxpYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYW1mc19mcy5oPgogCiBzdGF0aWMgel9zdHJlYW0gc3RyZWFtOwogc3RhdGljIGludCBpbml0aWFsaXplZDsKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggYTE1YTJlMS4uNzM3NmI2MTIgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0zMzcsMTIgKzMzNywxMCBAQAogICovCiB2b2lkIGRfcHJ1bmVfYWxpYXNlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKmhlYWQgPSAmaW5vZGUtPmlfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIHJlc3RhcnQ6CiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JdG1wID0gaGVhZDsKLQl3aGlsZSAoKHRtcCA9IHRtcC0+bmV4dCkgIT0gaGVhZCkgewotCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZW50cnksICZpbm9kZS0+aV9kZW50cnksIGRfYWxpYXMpIHsKIAkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJCWlmICghYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpIHsKIAkJCV9fZGdldF9sb2NrZWQoZGVudHJ5KTsKQEAgLTQ2MywxMCArNDYxLDcgQEAKIAkgKiBzdXBlcmJsb2NrIHRvIHRoZSBtb3N0IHJlY2VudCBlbmQgb2YgdGhlIHVudXNlZCBsaXN0LgogCSAqLwogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwotCW5leHQgPSBkZW50cnlfdW51c2VkLm5leHQ7Ci0Jd2hpbGUgKG5leHQgIT0gJmRlbnRyeV91bnVzZWQpIHsKLQkJdG1wID0gbmV4dDsKLQkJbmV4dCA9IHRtcC0+bmV4dDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBuZXh0LCAmZGVudHJ5X3VudXNlZCkgewogCQlkZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF9scnUpOwogCQlpZiAoZGVudHJ5LT5kX3NiICE9IHNiKQogCQkJY29udGludWU7CkBAIC00NzgsMTAgKzQ3Myw3IEBACiAJICogUGFzcyB0d28gLi4uIGZyZWUgdGhlIGRlbnRyaWVzIGZvciB0aGlzIHN1cGVyYmxvY2suCiAJICovCiByZXBlYXQ6Ci0JbmV4dCA9IGRlbnRyeV91bnVzZWQubmV4dDsKLQl3aGlsZSAobmV4dCAhPSAmZGVudHJ5X3VudXNlZCkgewotCQl0bXAgPSBuZXh0OwotCQluZXh0ID0gdG1wLT5uZXh0OworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIG5leHQsICZkZW50cnlfdW51c2VkKSB7CiAJCWRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2xydSk7CiAJCWlmIChkZW50cnktPmRfc2IgIT0gc2IpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCAyMjJhYjFjLi4xNGRkMDM5IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC03OTgsNiArNzk4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9vbGRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKQogewogCWxvbmcgaiA9IC0xOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCWZvciAoOzspIHsKQEAgLTgwNSwxMiArODA2LDEzIEBACiAKIAkJaisrOwogCQlpID0gaiAqIF9fTkZEQklUUzsKLQkJaWYgKGkgPj0gZmlsZXMtPm1heF9mZHMgfHwgaSA+PSBmaWxlcy0+bWF4X2Zkc2V0KQorCQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwkJaWYgKGkgPj0gZmR0LT5tYXhfZmRzIHx8IGkgPj0gZmR0LT5tYXhfZmRzZXQpCiAJCQlicmVhazsKLQkJc2V0ID0gZmlsZXMtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW2pdOworCQlzZXQgPSBmZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW2pdOwogCQlpZiAoIXNldCkKIAkJCWNvbnRpbnVlOwotCQlmaWxlcy0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbal0gPSAwOworCQlmZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW2pdID0gMDsKIAkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCQlmb3IgKCA7IHNldCA7IGkrKyxzZXQgPj49IDEpIHsKIAkJCWlmIChzZXQgJiAxKSB7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCAxNjFmMTU2Li5jOGQwNzAzIDEwMDY0NAotLS0gYS9mcy9leHQyL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDIvaWFsbG9jLmMKQEAgLTYxNSw2ICs2MTUsMTEgQEAKIAkJRFFVT1RfRFJPUChpbm9kZSk7CiAJCWdvdG8gZmFpbDI7CiAJfQorCWVyciA9IGV4dDJfaW5pdF9zZWN1cml0eShpbm9kZSxkaXIpOworCWlmIChlcnIpIHsKKwkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisJCWdvdG8gZmFpbDI7CisJfQogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCWV4dDJfZGVidWcoImFsbG9jYXRpbmcgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCWV4dDJfcHJlcmVhZF9pbm9kZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggNTNkY2ViMC4uZmRiYTRkMSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtNzEsNiArNzEsOCBAQAogICovCiB2b2lkIGV4dDJfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKIHsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKIAlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJZ290byBub19kZWxldGU7CiAJRVhUMl9JKGlub2RlKS0+aV9kdGltZQk9IGdldF9zZWNvbmRzKCk7CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggZGNmZTMzMS4uM2MwYzdjNiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTI3LDYgKzI4LDggQEAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiZXh0Mi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCkBAIC0yMDEsNiArMjA0LDI2IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIGludCBleHQyX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICp2ZnMpCit7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQih2ZnMtPm1udF9zYik7CisKKwlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfR1JQSUQpCisJCXNlcV9wdXRzKHNlcSwgIixncnBpZCIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLG5vZ3JwaWQiKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1FVT1RBKQorCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9VU1JRVU9UQSkKKwkJc2VxX3B1dHMoc2VxLCAiLHVzcnF1b3RhIik7CisKKwlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfR1JQUVVPVEEpCisJCXNlcV9wdXRzKHNlcSwgIixncnBxdW90YSIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19RVU9UQQogc3RhdGljIHNzaXplX3QgZXh0Ml9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKIHN0YXRpYyBzc2l6ZV90IGV4dDJfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpOwpAQCAtMjE4LDYgKzI0MSw3IEBACiAJLnN0YXRmcwkJPSBleHQyX3N0YXRmcywKIAkucmVtb3VudF9mcwk9IGV4dDJfcmVtb3VudCwKIAkuY2xlYXJfaW5vZGUJPSBleHQyX2NsZWFyX2lub2RlLAorCS5zaG93X29wdGlvbnMJPSBleHQyX3Nob3dfb3B0aW9ucywKICNpZmRlZiBDT05GSUdfUVVPVEEKIAkucXVvdGFfcmVhZAk9IGV4dDJfcXVvdGFfcmVhZCwKIAkucXVvdGFfd3JpdGUJPSBleHQyX3F1b3RhX3dyaXRlLApAQCAtMjU2LDEwICsyODAsMTEgQEAKIAogZW51bSB7CiAJT3B0X2JzZF9kZiwgT3B0X21pbml4X2RmLCBPcHRfZ3JwaWQsIE9wdF9ub2dycGlkLAotCU9wdF9yZXNnaWQsIE9wdF9yZXN1aWQsIE9wdF9zYiwgT3B0X2Vycl9jb250LCBPcHRfZXJyX3BhbmljLCBPcHRfZXJyX3JvLAotCU9wdF9ub3VpZDMyLCBPcHRfY2hlY2ssIE9wdF9ub2NoZWNrLCBPcHRfZGVidWcsIE9wdF9vbGRhbGxvYywgT3B0X29ybG92LCBPcHRfbm9iaCwKLQlPcHRfdXNlcl94YXR0ciwgT3B0X25vdXNlcl94YXR0ciwgT3B0X2FjbCwgT3B0X25vYWNsLCBPcHRfeGlwLAotCU9wdF9pZ25vcmUsIE9wdF9lcnIsCisJT3B0X3Jlc2dpZCwgT3B0X3Jlc3VpZCwgT3B0X3NiLCBPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsCisJT3B0X2Vycl9ybywgT3B0X25vdWlkMzIsIE9wdF9jaGVjaywgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywKKwlPcHRfb2xkYWxsb2MsIE9wdF9vcmxvdiwgT3B0X25vYmgsIE9wdF91c2VyX3hhdHRyLCBPcHRfbm91c2VyX3hhdHRyLAorCU9wdF9hY2wsIE9wdF9ub2FjbCwgT3B0X3hpcCwgT3B0X2lnbm9yZSwgT3B0X2VyciwgT3B0X3F1b3RhLAorCU9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC0yODgsMTAgKzMxMywxMCBAQAogCXtPcHRfYWNsLCAiYWNsIn0sCiAJe09wdF9ub2FjbCwgIm5vYWNsIn0sCiAJe09wdF94aXAsICJ4aXAifSwKLQl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCisJe09wdF9ncnBxdW90YSwgImdycHF1b3RhIn0sCiAJe09wdF9pZ25vcmUsICJub3F1b3RhIn0sCi0Je09wdF9pZ25vcmUsICJxdW90YSJ9LAotCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X3F1b3RhLCAicXVvdGEifSwKKwl7T3B0X3VzcnF1b3RhLCAidXNycXVvdGEifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTQwNiw2ICs0MzEsMjYgQEAKIAkJCXByaW50aygiRVhUMiB4aXAgb3B0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOwogI2VuZGlmCiAJCQlicmVhazsKKworI2lmIGRlZmluZWQoQ09ORklHX1FVT1RBKQorCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFVTUlFVT1RBKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X3F1b3RhOgorCQljYXNlIE9wdF91c3JxdW90YToKKwkJY2FzZSBPcHRfZ3JwcXVvdGE6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiRVhUMi1mczogcXVvdGEgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydGVkLlxuIik7CisKKwkJCWJyZWFrOworI2VuZGlmCisKIAkJY2FzZSBPcHRfaWdub3JlOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyLmggYi9mcy9leHQyL3hhdHRyLmgKaW5kZXggNWYzYmZkZS4uNjdjZmViNiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi94YXR0ci5oCisrKyBiL2ZzL2V4dDIveGF0dHIuaApAQCAtMTE2LDMgKzExNiwxMSBAQAogCiAjIGVuZGlmICAvKiBDT05GSUdfRVhUMl9GU19YQVRUUiAqLwogCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkKK2V4dGVybiBpbnQgZXh0Ml9pbml0X3NlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBleHQyX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL2V4dDIveGF0dHJfc2VjdXJpdHkuYwppbmRleCA2YTZjNTlmLi5hMjY2MTI3IDEwMDY0NAotLS0gYS9mcy9leHQyL3hhdHRyX3NlY3VyaXR5LmMKKysrIGIvZnMvZXh0Mi94YXR0cl9zZWN1cml0eS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlICJ4YXR0ci5oIgogCiBzdGF0aWMgc2l6ZV90CkBAIC00NSw2ICs0NiwyNyBAQAogCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKIH0KIAoraW50CitleHQyX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW50IGVycjsKKwlzaXplX3QgbGVuOworCXZvaWQgKnZhbHVlOworCWNoYXIgKm5hbWU7CisKKwllcnIgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsICZuYW1lLCAmdmFsdWUsICZsZW4pOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwKKwkJCSAgICAgbmFtZSwgdmFsdWUsIGxlbiwgMCk7CisJa2ZyZWUobmFtZSk7CisJa2ZyZWUodmFsdWUpOworCXJldHVybiBlcnI7Cit9CisKIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDJfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4CT0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5saXN0CT0gZXh0Ml94YXR0cl9zZWN1cml0eV9saXN0LApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pYWxsb2MuYyBiL2ZzL2V4dDMvaWFsbG9jLmMKaW5kZXggNjk4MWJkMC4uOTY1NTI3NiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pYWxsb2MuYworKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC02MDcsNiArNjA3LDExIEBACiAJCURRVU9UX0RST1AoaW5vZGUpOwogCQlnb3RvIGZhaWwyOwogICAJfQorCWVyciA9IGV4dDNfaW5pdF9zZWN1cml0eShoYW5kbGUsaW5vZGUsIGRpcik7CisJaWYgKGVycikgeworCQlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwkJZ290byBmYWlsMjsKKwl9CiAJZXJyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCWlmIChlcnIpIHsKIAkJZXh0M19zdGRfZXJyb3Ioc2IsIGVycik7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggOTk4OWZkYy4uYjUxNzdjOSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMTg3LDYgKzE4Nyw4IEBACiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAorCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwogCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQogCQlnb3RvIG5vX2RlbGV0ZTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDNjM2M2ZTMuLmE5M2MzNjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAieGF0dHIuaCIKICNpbmNsdWRlICJhY2wuaCIKQEAgLTUwOSw4ICs1MTAsNDEgQEAKIAlrZnJlZShyc3YpOwogfQogCi0jaWZkZWYgQ09ORklHX1FVT1RBCitzdGF0aWMgaW50IGV4dDNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmZzbW91bnQgKnZmcykKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHZmcy0+bW50X3NiKTsKIAorCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9KT1VSTkFMX0RBVEEpCisJCXNlcV9wdXRzKHNlcSwgIixkYXRhPWpvdXJuYWwiKTsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEpCisJCXNlcV9wdXRzKHNlcSwgIixkYXRhPW9yZGVyZWQiKTsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQSkKKwkJc2VxX3B1dHMoc2VxLCAiLGRhdGE9d3JpdGViYWNrIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKKwlpZiAoc2JpLT5zX2pxdW90YV9mbXQpCisJCXNlcV9wcmludGYoc2VxLCAiLGpxZm10PSVzIiwKKwkJKHNiaS0+c19qcXVvdGFfZm10ID09IFFGTVRfVkZTX09MRCkgPyAidmZzb2xkIjogInZmc3YwIik7CisKKwlpZiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSkKKwkJc2VxX3ByaW50ZihzZXEsICIsdXNyanF1b3RhPSVzIiwgc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSk7CisKKwlpZiAoc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkKKwkJc2VxX3ByaW50ZihzZXEsICIsZ3JwanF1b3RhPSVzIiwgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSk7CisKKwlpZiAoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfVVNSUVVPVEEpCisJCXNlcV9wdXRzKHNlcSwgIix1c3JxdW90YSIpOworCisJaWYgKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0dSUFFVT1RBKQorCQlzZXFfcHV0cyhzZXEsICIsZ3JwcXVvdGEiKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKICNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpPT1VU1JRVU9UQT8idXNlciI6Imdyb3VwIikKICNkZWZpbmUgUVRZUEUyTU9QVChvbiwgdCkgKCh0KT09VVNSUVVPVEE/KChvbikjI1VTUkpRVU9UQSk6KChvbikjI0dSUEpRVU9UQSkpCiAKQEAgLTU2OSw2ICs2MDMsNyBAQAogCS5zdGF0ZnMJCT0gZXh0M19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBleHQzX3JlbW91bnQsCiAJLmNsZWFyX2lub2RlCT0gZXh0M19jbGVhcl9pbm9kZSwKKwkuc2hvd19vcHRpb25zCT0gZXh0M19zaG93X29wdGlvbnMsCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJLnF1b3RhX3JlYWQJPSBleHQzX3F1b3RhX3JlYWQsCiAJLnF1b3RhX3dyaXRlCT0gZXh0M19xdW90YV93cml0ZSwKQEAgLTU5MCw3ICs2MjUsOCBAQAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF91c3JqcXVvdGEsIE9wdF9ncnBqcXVvdGEsIE9wdF9vZmZ1c3JqcXVvdGEsIE9wdF9vZmZncnBqcXVvdGEsCiAJT3B0X2pxZm10X3Zmc29sZCwgT3B0X2pxZm10X3Zmc3YwLCBPcHRfcXVvdGEsIE9wdF9ub3F1b3RhLAotCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLAorCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLCBPcHRfdXNycXVvdGEsCisJT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC02MzQsMTAgKzY3MCwxMCBAQAogCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCiAJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKIAl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKLQl7T3B0X3F1b3RhLCAiZ3JwcXVvdGEifSwKKwl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCiAJe09wdF9xdW90YSwgInF1b3RhIn0sCi0Je09wdF9xdW90YSwgInVzcnF1b3RhIn0sCisJe09wdF91c3JxdW90YSwgInVzcnF1b3RhIn0sCiAJe09wdF9iYXJyaWVyLCAiYmFycmllcj0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIAl7T3B0X3Jlc2l6ZSwgInJlc2l6ZSJ9LApAQCAtOTAzLDcgKzkzOSwxMyBAQAogCQkJc2JpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19WMDsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBRVU9UQSk7CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3F1b3RhOgogCQkJaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSkgewpAQCAtOTEyLDggKzk1NCwxMyBAQAogCQkJCXJldHVybiAwOwogCQkJfQogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBVU1JRVU9UQSk7CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQUVVPVEEpOwogCQkJYnJlYWs7CiAjZWxzZQorCQljYXNlIE9wdF9xdW90YToKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCWNhc2UgT3B0X2dycHF1b3RhOgogCQljYXNlIE9wdF91c3JqcXVvdGE6CiAJCWNhc2UgT3B0X2dycGpxdW90YToKIAkJY2FzZSBPcHRfb2ZmdXNyanF1b3RhOgpAQCAtOTI0LDcgKzk3MSw2IEBACiAJCQkJIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyBub3QgIgogCQkJCSJzdXBwb3J0ZWQuXG4iKTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9xdW90YToKIAkJY2FzZSBPcHRfbm9xdW90YToKIAkJCWJyZWFrOwogI2VuZGlmCkBAIC05NjIsMTQgKzEwMDgsMzggQEAKIAkJfQogCX0KICNpZmRlZiBDT05GSUdfUVVPVEEKLQlpZiAoIXNiaS0+c19qcXVvdGFfZm10ICYmIChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8Ci0JICAgIHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0IG5vdCBzcGVjaWZpZWQuXG4iKTsKLQkJcmV0dXJuIDA7CisJaWYgKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1VTUlFVT1RBKSAmJgorCQkgICAgIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCisJCWlmICgoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfR1JQUVVPVEEpICYmCisJCSAgICAgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisKKwkJaWYgKChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCisJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0dSUFFVT1RBKSkgfHwKKwkJICAgIChzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdICYmCisJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1VTUlFVT1RBKSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogb2xkIGFuZCBuZXcgcXVvdGEgIgorCQkJCQkiZm9ybWF0IG1peGluZy5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIXNiaS0+c19qcXVvdGFfZm10KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0ICIKKwkJCQkJIm5vdCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNiaS0+c19qcXVvdGFfZm10KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0ICIKKwkJCQkJInNwZWNpZmllZCB3aXRoIG5vIGpvdXJuYWxsaW5nICIKKwkJCQkJImVuYWJsZWQuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogI2VuZGlmCi0KIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5oIGIvZnMvZXh0My94YXR0ci5oCmluZGV4IGViMzFhNjkuLjJjZWFlMzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMveGF0dHIuaAorKysgYi9mcy9leHQzL3hhdHRyLmgKQEAgLTEzMywzICsxMzMsMTQgQEAKICNkZWZpbmUgZXh0M194YXR0cl9oYW5kbGVycwlOVUxMCiAKICMgZW5kaWYgIC8qIENPTkZJR19FWFQzX0ZTX1hBVFRSICovCisKKyNpZmRlZiBDT05GSUdfRVhUM19GU19TRUNVUklUWQorZXh0ZXJuIGludCBleHQzX2luaXRfc2VjdXJpdHkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmRpcik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZXh0M19pbml0X3NlY3VyaXR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYwppbmRleCBkZGMxYzQxLi5iOWM0MGMxIDEwMDY0NAotLS0gYS9mcy9leHQzL3hhdHRyX3NlY3VyaXR5LmMKKysrIGIvZnMvZXh0My94YXR0cl9zZWN1cml0eS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KICNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlICJ4YXR0ci5oIgogCiBzdGF0aWMgc2l6ZV90CkBAIC00Nyw2ICs0OCwyNyBAQAogCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKIH0KIAoraW50CitleHQzX2luaXRfc2VjdXJpdHkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJaW50IGVycjsKKwlzaXplX3QgbGVuOworCXZvaWQgKnZhbHVlOworCWNoYXIgKm5hbWU7CisKKwllcnIgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsICZuYW1lLCAmdmFsdWUsICZsZW4pOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBleHQzX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlLCBpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9TRUNVUklUWSwKKwkJCQkgICAgbmFtZSwgdmFsdWUsIGxlbiwgMCk7CisJa2ZyZWUobmFtZSk7CisJa2ZyZWUodmFsdWUpOworCXJldHVybiBlcnI7Cit9CisKIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4CT0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5saXN0CT0gZXh0M194YXR0cl9zZWN1cml0eV9saXN0LApkaWZmIC0tZ2l0IGEvZnMvZmF0L2Rpci5jIGIvZnMvZmF0L2Rpci5jCmluZGV4IGU1YWUxYjcuLjg5NTA0OWIgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9kaXIuYworKysgYi9mcy9mYXQvZGlyLmMKQEAgLTMwLDYgKzMwLDI5IEBACiAJCXwgKGRlIC0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKiliaC0+Yl9kYXRhKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGZhdF9kaXJfcmVhZGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkJICAgICBzZWN0b3JfdCBwaHlzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBzZWM7CisKKwkvKiBUaGlzIGlzIG5vdCBhIGZpcnN0IHNlY3RvciBvZiBjbHVzdGVyLCBvciBzZWNfcGVyX2NsdXMgPT0gMSAqLworCWlmICgoaWJsb2NrICYgKHNiaS0+c2VjX3Blcl9jbHVzIC0gMSkpIHx8IHNiaS0+c2VjX3Blcl9jbHVzID09IDEpCisJCXJldHVybjsKKwkvKiByb290IGRpciBvZiBGQVQxMi9GQVQxNiAqLworCWlmICgoc2JpLT5mYXRfYml0cyAhPSAzMikgJiYgKGRpci0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pKQorCQlyZXR1cm47CisKKwliaCA9IHNiX2dldGJsayhzYiwgcGh5cyk7CisJaWYgKGJoICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCWZvciAoc2VjID0gMDsgc2VjIDwgc2JpLT5zZWNfcGVyX2NsdXM7IHNlYysrKQorCQkJc2JfYnJlYWRhaGVhZChzYiwgcGh5cyArIHNlYyk7CisJfQorCWJyZWxzZShiaCk7Cit9CisKIC8qIFJldHVybnMgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGF0IG9mZnNldCBwb3MuIElmIGJoIGlzCiAgICBub24tTlVMTCwgaXQgaXMgYnJlbHNlJ2QgYmVmb3JlLiBQb3MgaXMgaW5jcmVtZW50ZWQuIFRoZSBidWZmZXIgaGVhZGVyIGlzCiAgICByZXR1cm5lZCBpbiBiaC4KQEAgLTU4LDYgKzgxLDggQEAKIAlpZiAoZXJyIHx8ICFwaHlzKQogCQlyZXR1cm4gLTE7CS8qIGJleW9uZCBFT0Ygb3IgZXJyb3IgKi8KIAorCWZhdF9kaXJfcmVhZGFoZWFkKGRpciwgaWJsb2NrLCBwaHlzKTsKKwogCSpiaCA9IHNiX2JyZWFkKHNiLCBwaHlzKTsKIAlpZiAoKmJoID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IERpcmVjdG9yeSBicmVhZChibG9jayAlbGx1KSBmYWlsZWRcbiIsCkBAIC02MzUsOCArNjYwLDcgQEAKIEVPRGlyOgogCWZpbHAtPmZfcG9zID0gY3BvczsKIEZpbGxGYWlsZWQ6Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAJaWYgKHVuaWNvZGUpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl1bmljb2RlKTsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggOTZhZTg1Yi4uYTdjYmU2OCAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTMzNSw2ICszMzUsOCBAQAogCiBzdGF0aWMgdm9pZCBmYXRfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCiAJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpKSB7CiAJCWlub2RlLT5pX3NpemUgPSAwOwogCQlmYXRfdHJ1bmNhdGUoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZmNudGwuYyBiL2ZzL2ZjbnRsLmMKaW5kZXggNmZiYzlkOC4uODYzYjQ2ZSAxMDA2NDQKLS0tIGEvZnMvZmNudGwuYworKysgYi9mcy9mY250bC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BvbGwuaD4KICNpbmNsdWRlIDxhc20vc2lnaW5mby5oPgpAQCAtMjQsMjEgKzI1LDI1IEBACiB2b2lkIGZhc3RjYWxsIHNldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgaW50IGZsYWcpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJaWYgKGZsYWcpCi0JCUZEX1NFVChmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJZWxzZQotCQlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwogCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAlpbnQgcmVzOwotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JcmVzID0gRkRfSVNTRVQoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCXJlcyA9IEZEX0lTU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTU0LDI0ICs1OSwyNiBAQAogCXVuc2lnbmVkIGludCBuZXdmZDsKIAl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJaW50IGVycm9yOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAllcnJvciA9IC1FSU5WQUw7CiAJaWYgKG9yaWdfc3RhcnQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQogCQlnb3RvIG91dDsKIAogcmVwZWF0OgorCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwogCS8qCiAJICogU29tZW9uZSBtaWdodCBoYXZlIGNsb3NlZCBmZCdzIGluIHRoZSByYW5nZQotCSAqIG9yaWdfc3RhcnQuLmZpbGVzLT5uZXh0X2ZkCisJICogb3JpZ19zdGFydC4uZmR0LT5uZXh0X2ZkCiAJICovCiAJc3RhcnQgPSBvcmlnX3N0YXJ0OwotCWlmIChzdGFydCA8IGZpbGVzLT5uZXh0X2ZkKQotCQlzdGFydCA9IGZpbGVzLT5uZXh0X2ZkOworCWlmIChzdGFydCA8IGZkdC0+bmV4dF9mZCkKKwkJc3RhcnQgPSBmZHQtPm5leHRfZmQ7CiAKIAluZXdmZCA9IHN0YXJ0OwotCWlmIChzdGFydCA8IGZpbGVzLT5tYXhfZmRzZXQpIHsKLQkJbmV3ZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0cywKLQkJCWZpbGVzLT5tYXhfZmRzZXQsIHN0YXJ0KTsKKwlpZiAoc3RhcnQgPCBmZHQtPm1heF9mZHNldCkgeworCQluZXdmZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChmZHQtPm9wZW5fZmRzLT5mZHNfYml0cywKKwkJCWZkdC0+bWF4X2Zkc2V0LCBzdGFydCk7CiAJfQogCQogCWVycm9yID0gLUVNRklMRTsKQEAgLTg5LDkgKzk2LDE1IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIHJlcGVhdDsKIAotCWlmIChzdGFydCA8PSBmaWxlcy0+bmV4dF9mZCkKLQkJZmlsZXMtPm5leHRfZmQgPSBuZXdmZCArIDE7Ci0JCisJLyoKKwkgKiBXZSByZWFjcXVpcmVkIGZpbGVzX2xvY2ssIHNvIHdlIGFyZSBzYWZlIGFzIGxvbmcgYXMKKwkgKiB3ZSByZWFjcXVpcmUgdGhlIGZkdGFibGUgcG9pbnRlciBhbmQgdXNlIGl0IHdoaWxlIGhvbGRpbmcKKwkgKiB0aGUgbG9jaywgbm8gb25lIGNhbiBmcmVlIGl0IGR1cmluZyB0aGF0IHRpbWUuCisJICovCisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJaWYgKHN0YXJ0IDw9IGZkdC0+bmV4dF9mZCkKKwkJZmR0LT5uZXh0X2ZkID0gbmV3ZmQgKyAxOworCiAJZXJyb3IgPSBuZXdmZDsKIAkKIG91dDoKQEAgLTEwMSwxMyArMTE0LDE2IEBACiBzdGF0aWMgaW50IGR1cGZkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAlpbnQgZmQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCWZkID0gbG9jYXRlX2ZkKGZpbGVzLCBmaWxlLCBzdGFydCk7CiAJaWYgKGZkID49IDApIHsKLQkJRkRfU0VUKGZkLCBmaWxlcy0+b3Blbl9mZHMpOwotCQlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwkJLyogbG9jYXRlX2ZkKCkgbWF5IGhhdmUgZXhwYW5kZWQgZmR0YWJsZSwgbG9hZCB0aGUgcHRyICovCisJCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCQlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOworCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKIAkJZmRfaW5zdGFsbChmZCwgZmlsZSk7CiAJfSBlbHNlIHsKQEAgLTEyMyw2ICsxMzksNyBAQAogCWludCBlcnIgPSAtRUJBREY7CiAJc3RydWN0IGZpbGUgKiBmaWxlLCAqdG9mcmVlOwogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCWlmICghKGZpbGUgPSBmY2hlY2sob2xkZmQpKSkKQEAgLTE0OCwxMyArMTY1LDE0IEBACiAKIAkvKiBZZXMuIEl0J3MgYSByYWNlLiBJbiB1c2VyIHNwYWNlLiBOb3RoaW5nIHNhbmUgdG8gZG8gKi8KIAllcnIgPSAtRUJVU1k7Ci0JdG9mcmVlID0gZmlsZXMtPmZkW25ld2ZkXTsKLQlpZiAoIXRvZnJlZSAmJiBGRF9JU1NFVChuZXdmZCwgZmlsZXMtPm9wZW5fZmRzKSkKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwl0b2ZyZWUgPSBmZHQtPmZkW25ld2ZkXTsKKwlpZiAoIXRvZnJlZSAmJiBGRF9JU1NFVChuZXdmZCwgZmR0LT5vcGVuX2ZkcykpCiAJCWdvdG8gb3V0X2ZwdXQ7CiAKLQlmaWxlcy0+ZmRbbmV3ZmRdID0gZmlsZTsKLQlGRF9TRVQobmV3ZmQsIGZpbGVzLT5vcGVuX2Zkcyk7Ci0JRkRfQ0xSKG5ld2ZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbbmV3ZmRdLCBmaWxlKTsKKwlGRF9TRVQobmV3ZmQsIGZkdC0+b3Blbl9mZHMpOworCUZEX0NMUihuZXdmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAKIAlpZiAodG9mcmVlKQpkaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jCmluZGV4IDkyYjVmMjUuLjIxMjdhN2IgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGUuYworKysgYi9mcy9maWxlLmMKQEAgLTEzLDYgKzEzLDI1IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0cnVjdCBmZHRhYmxlX2RlZmVyIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHdxOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBmZHRhYmxlICpuZXh0OworfTsKKworLyoKKyAqIFdlIHVzZSB0aGlzIGxpc3QgdG8gZGVmZXIgZnJlZSBmZHRhYmxlcyB0aGF0IGhhdmUgdm1hbGxvY2VkCisgKiBzZXRzL2FycmF5cy4gQnkga2VlcGluZyBhIHBlci1jcHUgbGlzdCwgd2UgYXZvaWQgaGF2aW5nIHRvIGVtYmVkCisgKiB0aGUgd29ya19zdHJ1Y3QgaW4gZmR0YWJsZSBpdHNlbGYgd2hpY2ggYXZvaWRzIGEgNjQgYnl0ZSAoaTM4NikgaW5jcmVhc2UgaW4KKyAqIHRoaXMgcGVyLXRhc2sgc3RydWN0dXJlLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGZkdGFibGVfZGVmZXIsIGZkdGFibGVfZGVmZXJfbGlzdCk7CiAKIAogLyoKQEAgLTQ4LDgyICs2NywxNDMgQEAKIAkJdmZyZWUoYXJyYXkpOwogfQogCi0vKgotICogRXhwYW5kIHRoZSBmZCBhcnJheSBpbiB0aGUgZmlsZXNfc3RydWN0LiAgQ2FsbGVkIHdpdGggdGhlIGZpbGVzCi0gKiBzcGlubG9jayBoZWxkIGZvciB3cml0ZS4KLSAqLwotCi1zdGF0aWMgaW50IGV4cGFuZF9mZF9hcnJheShzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgaW50IG5yKQotCV9fcmVsZWFzZXMoZmlsZXMtPmZpbGVfbG9jaykKLQlfX2FjcXVpcmVzKGZpbGVzLT5maWxlX2xvY2spCitzdGF0aWMgdm9pZCBfX2ZyZWVfZmR0YWJsZShzdHJ1Y3QgZmR0YWJsZSAqZmR0KQogewotCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKLQlpbnQgZXJyb3IsIG5mZHM7CisJaW50IGZkc2V0X3NpemUsIGZkYXJyYXlfc2l6ZTsKIAotCQotCWVycm9yID0gLUVNRklMRTsKLQlpZiAoZmlsZXMtPm1heF9mZHMgPj0gTlJfT1BFTiB8fCBuciA+PSBOUl9PUEVOKQotCQlnb3RvIG91dDsKKwlmZHNldF9zaXplID0gZmR0LT5tYXhfZmRzZXQgLyA4OworCWZkYXJyYXlfc2l6ZSA9IGZkdC0+bWF4X2ZkcyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKTsKKwlmcmVlX2Zkc2V0KGZkdC0+b3Blbl9mZHMsIGZkc2V0X3NpemUpOworCWZyZWVfZmRzZXQoZmR0LT5jbG9zZV9vbl9leGVjLCBmZHNldF9zaXplKTsKKwlmcmVlX2ZkX2FycmF5KGZkdC0+ZmQsIGZkYXJyYXlfc2l6ZSk7CisJa2ZyZWUoZmR0KTsKK30KIAotCW5mZHMgPSBmaWxlcy0+bWF4X2ZkczsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CitzdGF0aWMgdm9pZCBmZHRhYmxlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZmR0YWJsZV9kZWZlciAqZmRkZWYgPSAoc3RydWN0IGZkdGFibGVfZGVmZXIgKilkYXRhOwogCi0JLyogCi0JICogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcywgYW5kIGtlZXAgZXhwYW5kaW5nIGl0IHVudGlsCi0JICogd2UgaGF2ZSBlbm91Z2ggZm9yIHRoZSByZXF1ZXN0ZWQgZmQgYXJyYXkgc2l6ZS4gCisJc3Bpbl9sb2NrKCZmZGRlZi0+bG9jayk7CisJLyoKKwkgKiBJZiBzb21lb25lIGFscmVhZHkgZW1wdGllZCB0aGUgcXVldWUgcmV0dXJuLgogCSAqLwotCi0JZG8gewotI2lmIE5SX09QRU5fREVGQVVMVCA8IDI1NgotCQlpZiAobmZkcyA8IDI1NikKLQkJCW5mZHMgPSAyNTY7Ci0JCWVsc2UgCi0jZW5kaWYKLQkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKSkKLQkJCW5mZHMgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKik7Ci0JCWVsc2UgewotCQkJbmZkcyA9IG5mZHMgKiAyOwotCQkJaWYgKG5mZHMgPiBOUl9PUEVOKQotCQkJCW5mZHMgPSBOUl9PUEVOOwotCQl9Ci0JfSB3aGlsZSAobmZkcyA8PSBucik7Ci0KLQllcnJvciA9IC1FTk9NRU07Ci0JbmV3X2ZkcyA9IGFsbG9jX2ZkX2FycmF5KG5mZHMpOwotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JaWYgKCFuZXdfZmRzKQorCWlmICghZmRkZWYtPm5leHQpCiAJCWdvdG8gb3V0OwotCi0JLyogQ29weSB0aGUgZXhpc3RpbmcgYXJyYXkgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVyICovCi0KLQlpZiAobmZkcyA+IGZpbGVzLT5tYXhfZmRzKSB7Ci0JCXN0cnVjdCBmaWxlICoqb2xkX2ZkczsKLQkJaW50IGk7Ci0JCQotCQlvbGRfZmRzID0geGNoZygmZmlsZXMtPmZkLCBuZXdfZmRzKTsKLQkJaSA9IHhjaGcoJmZpbGVzLT5tYXhfZmRzLCBuZmRzKTsKLQotCQkvKiBEb24ndCBjb3B5L2NsZWFyIHRoZSBhcnJheSBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcKLQkJICAgZmQgYXJyYXkgZm9yIGZvcmsoKSAqLwotCQlpZiAoaSkgewotCQkJbWVtY3B5KG5ld19mZHMsIG9sZF9mZHMsIGkgKiBzaXplb2Yoc3RydWN0IGZpbGUgKikpOwotCQkJLyogY2xlYXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJyYXkgKi8KLQkJCW1lbXNldCgmbmV3X2Zkc1tpXSwgMCwKLQkJCSAgICAgICAobmZkcy1pKSAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7IAotCi0JCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JCQlmcmVlX2ZkX2FycmF5KG9sZF9mZHMsIGkpOwotCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFNvbWVib2R5IGV4cGFuZGVkIHRoZSBhcnJheSB3aGlsZSB3ZSBzbGVwdCAuLi4gKi8KLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCQlmcmVlX2ZkX2FycmF5KG5ld19mZHMsIG5mZHMpOwotCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCX0KLQllcnJvciA9IDA7CisJaWYgKCFzY2hlZHVsZV93b3JrKCZmZGRlZi0+d3EpKQorCQltb2RfdGltZXIoJmZkZGVmLT50aW1lciwgNSk7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXNwaW5fdW5sb2NrKCZmZGRlZi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmR0YWJsZV93b3JrKHN0cnVjdCBmZHRhYmxlX2RlZmVyICpmKQoreworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKKwlzcGluX2xvY2tfYmgoJmYtPmxvY2spOworCWZkdCA9IGYtPm5leHQ7CisJZi0+bmV4dCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJmYtPmxvY2spOworCXdoaWxlKGZkdCkgeworCQlzdHJ1Y3QgZmR0YWJsZSAqbmV4dCA9IGZkdC0+bmV4dDsKKwkJX19mcmVlX2ZkdGFibGUoZmR0KTsKKwkJZmR0ID0gbmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmR0YWJsZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGZkdGFibGUgKmZkdCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBmZHRhYmxlLCByY3UpOworCWludCBmZHNldF9zaXplLCBmZGFycmF5X3NpemU7CisJc3RydWN0IGZkdGFibGVfZGVmZXIgKmZkZGVmOworCisJQlVHX09OKCFmZHQpOworCWZkc2V0X3NpemUgPSBmZHQtPm1heF9mZHNldCAvIDg7CisJZmRhcnJheV9zaXplID0gZmR0LT5tYXhfZmRzICogc2l6ZW9mKHN0cnVjdCBmaWxlICopOworCisJaWYgKGZkdC0+ZnJlZV9maWxlcykgeworCQkvKgorCQkgKiBUaGUgdGhpcyBmZHRhYmxlIHdhcyBlbWJlZGRlZCBpbiB0aGUgZmlsZXMgc3RydWN0dXJlCisJCSAqIGFuZCB0aGUgZmlsZXMgc3RydWN0dXJlIGl0c2VsZiB3YXMgZ2V0dGluZyBkZXN0cm95ZWQuCisJCSAqIEl0IGlzIG5vdyBzYWZlIHRvIGZyZWUgdGhlIGZpbGVzIHN0cnVjdHVyZS4KKwkJICovCisJCWttZW1fY2FjaGVfZnJlZShmaWxlc19jYWNoZXAsIGZkdC0+ZnJlZV9maWxlcyk7CisJCXJldHVybjsKKwl9CisJaWYgKGZkdC0+bWF4X2Zkc2V0IDw9IF9fRkRfU0VUU0laRSAmJiBmZHQtPm1heF9mZHMgPD0gTlJfT1BFTl9ERUZBVUxUKSB7CisJCS8qCisJCSAqIFRoZSBmZHRhYmxlIHdhcyBlbWJlZGRlZAorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoZmRzZXRfc2l6ZSA8PSBQQUdFX1NJWkUgJiYgZmRhcnJheV9zaXplIDw9IFBBR0VfU0laRSkgeworCQlrZnJlZShmZHQtPm9wZW5fZmRzKTsKKwkJa2ZyZWUoZmR0LT5jbG9zZV9vbl9leGVjKTsKKwkJa2ZyZWUoZmR0LT5mZCk7CisJCWtmcmVlKGZkdCk7CisJfSBlbHNlIHsKKwkJZmRkZWYgPSAmZ2V0X2NwdV92YXIoZmR0YWJsZV9kZWZlcl9saXN0KTsKKwkJc3Bpbl9sb2NrKCZmZGRlZi0+bG9jayk7CisJCWZkdC0+bmV4dCA9IGZkZGVmLT5uZXh0OworCQlmZGRlZi0+bmV4dCA9IGZkdDsKKwkJLyoKKwkJICogdm1hbGxvY3MgYXJlIGhhbmRsZWQgZnJvbSB0aGUgd29ya3F1ZXVlIGNvbnRleHQuCisJCSAqIElmIHRoZSBwZXItY3B1IHdvcmtxdWV1ZSBpcyBydW5uaW5nLCB0aGVuIHdlCisJCSAqIGRlZmVyIHdvcmsgc2NoZWR1bGluZyB0aHJvdWdoIGEgdGltZXIuCisJCSAqLworCQlpZiAoIXNjaGVkdWxlX3dvcmsoJmZkZGVmLT53cSkpCisJCQltb2RfdGltZXIoJmZkZGVmLT50aW1lciwgNSk7CisJCXNwaW5fdW5sb2NrKCZmZGRlZi0+bG9jayk7CisJCXB1dF9jcHVfdmFyKGZkdGFibGVfZGVmZXJfbGlzdCk7CisJfQorfQorCit2b2lkIGZyZWVfZmR0YWJsZShzdHJ1Y3QgZmR0YWJsZSAqZmR0KQoreworCWlmIChmZHQtPmZyZWVfZmlsZXMgfHwgZmR0LT5tYXhfZmRzZXQgPiBfX0ZEX1NFVFNJWkUgfHwKKwkJCQkJZmR0LT5tYXhfZmRzID4gTlJfT1BFTl9ERUZBVUxUKQorCQljYWxsX3JjdSgmZmR0LT5yY3UsIGZyZWVfZmR0YWJsZV9yY3UpOworfQorCisvKgorICogRXhwYW5kIHRoZSBmZHNldCBpbiB0aGUgZmlsZXNfc3RydWN0LiAgQ2FsbGVkIHdpdGggdGhlIGZpbGVzIHNwaW5sb2NrCisgKiBoZWxkIGZvciB3cml0ZS4KKyAqLworc3RhdGljIHZvaWQgY29weV9mZHRhYmxlKHN0cnVjdCBmZHRhYmxlICpuZmR0LCBzdHJ1Y3QgZmR0YWJsZSAqZmR0KQoreworCWludCBpOworCWludCBjb3VudDsKKworCUJVR19PTihuZmR0LT5tYXhfZmRzZXQgPCBmZHQtPm1heF9mZHNldCk7CisJQlVHX09OKG5mZHQtPm1heF9mZHMgPCBmZHQtPm1heF9mZHMpOworCS8qIENvcHkgdGhlIGV4aXN0aW5nIHRhYmxlcyBhbmQgaW5zdGFsbCB0aGUgbmV3IHBvaW50ZXJzICovCisKKwlpID0gZmR0LT5tYXhfZmRzZXQgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCk7CisJY291bnQgPSAobmZkdC0+bWF4X2Zkc2V0IC0gZmR0LT5tYXhfZmRzZXQpIC8gODsKKworCS8qCisJICogRG9uJ3QgY29weSB0aGUgZW50aXJlIGFycmF5IGlmIHRoZSBjdXJyZW50IGZkc2V0IGlzCisJICogbm90IHlldCBpbml0aWFsaXNlZC4KKwkgKi8KKwlpZiAoaSkgeworCQltZW1jcHkgKG5mZHQtPm9wZW5fZmRzLCBmZHQtPm9wZW5fZmRzLAorCQkJCQkJZmR0LT5tYXhfZmRzZXQvOCk7CisJCW1lbWNweSAobmZkdC0+Y2xvc2Vfb25fZXhlYywgZmR0LT5jbG9zZV9vbl9leGVjLAorCQkJCQkJZmR0LT5tYXhfZmRzZXQvOCk7CisJCW1lbXNldCAoJm5mZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tpXSwgMCwgY291bnQpOworCQltZW1zZXQgKCZuZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tpXSwgMCwgY291bnQpOworCX0KKworCS8qIERvbid0IGNvcHkvY2xlYXIgdGhlIGFycmF5IGlmIHdlIGFyZSBjcmVhdGluZyBhIG5ldworCSAgIGZkIGFycmF5IGZvciBmb3JrKCkgKi8KKwlpZiAoZmR0LT5tYXhfZmRzKSB7CisJCW1lbWNweShuZmR0LT5mZCwgZmR0LT5mZCwKKwkJCWZkdC0+bWF4X2ZkcyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7CisJCS8qIGNsZWFyIHRoZSByZW1haW5kZXIgb2YgdGhlIGFycmF5ICovCisJCW1lbXNldCgmbmZkdC0+ZmRbZmR0LT5tYXhfZmRzXSwgMCwKKwkJICAgICAgIChuZmR0LT5tYXhfZmRzIC0gZmR0LT5tYXhfZmRzKSAqCisJCQkJCXNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7CisJfQorCW5mZHQtPm5leHRfZmQgPSBmZHQtPm5leHRfZmQ7CiB9CiAKIC8qCkBAIC0xNTQsMjYgKzIzNCwyMSBAQAogCQl2ZnJlZShhcnJheSk7CiB9CiAKLS8qCi0gKiBFeHBhbmQgdGhlIGZkc2V0IGluIHRoZSBmaWxlc19zdHJ1Y3QuICBDYWxsZWQgd2l0aCB0aGUgZmlsZXMgc3BpbmxvY2sKLSAqIGhlbGQgZm9yIHdyaXRlLgotICovCi1zdGF0aWMgaW50IGV4cGFuZF9mZHNldChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgaW50IG5yKQotCV9fcmVsZWFzZXMoZmlsZS0+ZmlsZV9sb2NrKQotCV9fYWNxdWlyZXMoZmlsZS0+ZmlsZV9sb2NrKQorc3RhdGljIHN0cnVjdCBmZHRhYmxlICphbGxvY19mZHRhYmxlKGludCBucikKIHsKLQlmZF9zZXQgKm5ld19vcGVuc2V0ID0gTlVMTCwgKm5ld19leGVjc2V0ID0gTlVMTDsKLQlpbnQgZXJyb3IsIG5mZHMgPSAwOworCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBOVUxMOworCWludCBuZmRzID0gMDsKKyAgCWZkX3NldCAqbmV3X29wZW5zZXQgPSBOVUxMLCAqbmV3X2V4ZWNzZXQgPSBOVUxMOworCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKIAotCWVycm9yID0gLUVNRklMRTsKLQlpZiAoZmlsZXMtPm1heF9mZHNldCA+PSBOUl9PUEVOIHx8IG5yID49IE5SX09QRU4pCi0JCWdvdG8gb3V0OworCWZkdCA9IGttYWxsb2Moc2l6ZW9mKCpmZHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZkdCkKKyAgCQlnb3RvIG91dDsKKwltZW1zZXQoZmR0LCAwLCBzaXplb2YoKmZkdCkpOwogCi0JbmZkcyA9IGZpbGVzLT5tYXhfZmRzZXQ7Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCi0JLyogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcyAqLwotCWRvIHsKKwluZmRzID0gX19GRF9TRVRTSVpFOworICAJLyogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcyAqLworICAJZG8gewogCQlpZiAobmZkcyA8IChQQUdFX1NJWkUgKiA4KSkKIAkJCW5mZHMgPSBQQUdFX1NJWkUgKiA4OwogCQllbHNlIHsKQEAgLTE4Myw0OSArMjU4LDg4IEBACiAJCX0KIAl9IHdoaWxlIChuZmRzIDw9IG5yKTsKIAotCWVycm9yID0gLUVOT01FTTsKLQluZXdfb3BlbnNldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOwotCW5ld19leGVjc2V0ID0gYWxsb2NfZmRzZXQobmZkcyk7Ci0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlpZiAoIW5ld19vcGVuc2V0IHx8ICFuZXdfZXhlY3NldCkKKyAgCW5ld19vcGVuc2V0ID0gYWxsb2NfZmRzZXQobmZkcyk7CisgIAluZXdfZXhlY3NldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOworICAJaWYgKCFuZXdfb3BlbnNldCB8fCAhbmV3X2V4ZWNzZXQpCisgIAkJZ290byBvdXQ7CisJZmR0LT5vcGVuX2ZkcyA9IG5ld19vcGVuc2V0OworCWZkdC0+Y2xvc2Vfb25fZXhlYyA9IG5ld19leGVjc2V0OworCWZkdC0+bWF4X2Zkc2V0ID0gbmZkczsKKworCW5mZHMgPSBOUl9PUEVOX0RFRkFVTFQ7CisJLyoKKwkgKiBFeHBhbmQgdG8gdGhlIG1heCBpbiBlYXN5IHN0ZXBzLCBhbmQga2VlcCBleHBhbmRpbmcgaXQgdW50aWwKKwkgKiB3ZSBoYXZlIGVub3VnaCBmb3IgdGhlIHJlcXVlc3RlZCBmZCBhcnJheSBzaXplLgorCSAqLworCWRvIHsKKyNpZiBOUl9PUEVOX0RFRkFVTFQgPCAyNTYKKwkJaWYgKG5mZHMgPCAyNTYpCisJCQluZmRzID0gMjU2OworCQllbHNlCisjZW5kaWYKKwkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKSkKKwkJCW5mZHMgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisJCWVsc2UgeworCQkJbmZkcyA9IG5mZHMgKiAyOworCQkJaWYgKG5mZHMgPiBOUl9PUEVOKQorCQkJCW5mZHMgPSBOUl9PUEVOOworICAJCX0KKwl9IHdoaWxlIChuZmRzIDw9IG5yKTsKKwluZXdfZmRzID0gYWxsb2NfZmRfYXJyYXkobmZkcyk7CisJaWYgKCFuZXdfZmRzKQogCQlnb3RvIG91dDsKLQotCWVycm9yID0gMDsKLQkKLQkvKiBDb3B5IHRoZSBleGlzdGluZyB0YWJsZXMgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVycyAqLwotCWlmIChuZmRzID4gZmlsZXMtPm1heF9mZHNldCkgewotCQlpbnQgaSA9IGZpbGVzLT5tYXhfZmRzZXQgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCk7Ci0JCWludCBjb3VudCA9IChuZmRzIC0gZmlsZXMtPm1heF9mZHNldCkgLyA4OwotCQkKLQkJLyogCi0JCSAqIERvbid0IGNvcHkgdGhlIGVudGlyZSBhcnJheSBpZiB0aGUgY3VycmVudCBmZHNldCBpcwotCQkgKiBub3QgeWV0IGluaXRpYWxpc2VkLiAgCi0JCSAqLwotCQlpZiAoaSkgewotCQkJbWVtY3B5IChuZXdfb3BlbnNldCwgZmlsZXMtPm9wZW5fZmRzLCBmaWxlcy0+bWF4X2Zkc2V0LzgpOwotCQkJbWVtY3B5IChuZXdfZXhlY3NldCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMsIGZpbGVzLT5tYXhfZmRzZXQvOCk7Ci0JCQltZW1zZXQgKCZuZXdfb3BlbnNldC0+ZmRzX2JpdHNbaV0sIDAsIGNvdW50KTsKLQkJCW1lbXNldCAoJm5ld19leGVjc2V0LT5mZHNfYml0c1tpXSwgMCwgY291bnQpOwotCQl9Ci0JCQotCQluZmRzID0geGNoZygmZmlsZXMtPm1heF9mZHNldCwgbmZkcyk7Ci0JCW5ld19vcGVuc2V0ID0geGNoZygmZmlsZXMtPm9wZW5fZmRzLCBuZXdfb3BlbnNldCk7Ci0JCW5ld19leGVjc2V0ID0geGNoZygmZmlsZXMtPmNsb3NlX29uX2V4ZWMsIG5ld19leGVjc2V0KTsKLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCQlmcmVlX2Zkc2V0IChuZXdfb3BlbnNldCwgbmZkcyk7Ci0JCWZyZWVfZmRzZXQgKG5ld19leGVjc2V0LCBuZmRzKTsKLQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfSAKLQkvKiBTb21lYm9keSBleHBhbmRlZCB0aGUgYXJyYXkgd2hpbGUgd2Ugc2xlcHQgLi4uICovCi0KKwlmZHQtPmZkID0gbmV3X2ZkczsKKwlmZHQtPm1heF9mZHMgPSBuZmRzOworCWZkdC0+ZnJlZV9maWxlcyA9IE5VTEw7CisJcmV0dXJuIGZkdDsKIG91dDoKKyAgCWlmIChuZXdfb3BlbnNldCkKKyAgCQlmcmVlX2Zkc2V0KG5ld19vcGVuc2V0LCBuZmRzKTsKKyAgCWlmIChuZXdfZXhlY3NldCkKKyAgCQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKwlrZnJlZShmZHQpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogRXhwYW5kcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIC0gaXQgd2lsbCBhbGxvY2F0ZSBhIG5ldyBmZHRhYmxlIGFuZAorICogYm90aCBmZCBhcnJheSBhbmQgZmRzZXQuIEl0IGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZQorICogZmlsZXNfbG9jayBoZWxkLgorICovCitzdGF0aWMgaW50IGV4cGFuZF9mZHRhYmxlKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCBpbnQgbnIpCisJX19yZWxlYXNlcyhmaWxlcy0+ZmlsZV9sb2NrKQorCV9fYWNxdWlyZXMoZmlsZXMtPmZpbGVfbG9jaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJc3RydWN0IGZkdGFibGUgKm5mZHQgPSBOVUxMOworCiAJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCWlmIChuZXdfb3BlbnNldCkKLQkJZnJlZV9mZHNldChuZXdfb3BlbnNldCwgbmZkcyk7Ci0JaWYgKG5ld19leGVjc2V0KQotCQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKwluZmR0ID0gYWxsb2NfZmR0YWJsZShucik7CisJaWYgKCFuZmR0KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCiAJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwkvKgorCSAqIENoZWNrIGFnYWluIHNpbmNlIGFub3RoZXIgdGFzayBtYXkgaGF2ZSBleHBhbmRlZCB0aGUKKwkgKiBmZCB0YWJsZSB3aGlsZSB3ZSBkcm9wcGVkIHRoZSBsb2NrCisJICovCisJaWYgKG5yID49IGZkdC0+bWF4X2ZkcyB8fCBuciA+PSBmZHQtPm1heF9mZHNldCkgeworCQljb3B5X2ZkdGFibGUobmZkdCwgZmR0KTsKKwl9IGVsc2UgeworCQkvKiBTb21lYm9keSBleHBhbmRlZCB3aGlsZSB3ZSBkcm9wcGVkIGZpbGVfbG9jayAqLworCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCV9fZnJlZV9mZHRhYmxlKG5mZHQpOworCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlnb3RvIG91dDsKKwl9CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZpbGVzLT5mZHQsIG5mZHQpOworCWZyZWVfZmR0YWJsZShmZHQpOworb3V0OgogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjM3LDE4ICszNTEsMzkgQEAKIGludCBleHBhbmRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBucikKIHsKIAlpbnQgZXJyLCBleHBhbmQgPSAwOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKLQlpZiAobnIgPj0gZmlsZXMtPm1heF9mZHNldCkgewotCQlleHBhbmQgPSAxOwotCQlpZiAoKGVyciA9IGV4cGFuZF9mZHNldChmaWxlcywgbnIpKSkKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlpZiAobnIgPj0gZmR0LT5tYXhfZmRzZXQgfHwgbnIgPj0gZmR0LT5tYXhfZmRzKSB7CisJCWlmIChmZHQtPm1heF9mZHNldCA+PSBOUl9PUEVOIHx8CisJCQlmZHQtPm1heF9mZHMgPj0gTlJfT1BFTiB8fCBuciA+PSBOUl9PUEVOKSB7CisJCQllcnIgPSAtRU1GSUxFOwogCQkJZ290byBvdXQ7Ci0JfQotCWlmIChuciA+PSBmaWxlcy0+bWF4X2ZkcykgeworCQl9CiAJCWV4cGFuZCA9IDE7Ci0JCWlmICgoZXJyID0gZXhwYW5kX2ZkX2FycmF5KGZpbGVzLCBucikpKQorCQlpZiAoKGVyciA9IGV4cGFuZF9mZHRhYmxlKGZpbGVzLCBucikpKQogCQkJZ290byBvdXQ7CiAJfQogCWVyciA9IGV4cGFuZDsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmR0YWJsZV9kZWZlcl9saXN0X2luaXQoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZmR0YWJsZV9kZWZlciAqZmRkZWYgPSAmcGVyX2NwdShmZHRhYmxlX2RlZmVyX2xpc3QsIGNwdSk7CisJc3Bpbl9sb2NrX2luaXQoJmZkZGVmLT5sb2NrKTsKKwlJTklUX1dPUksoJmZkZGVmLT53cSwgKHZvaWQgKCopKHZvaWQgKikpZnJlZV9mZHRhYmxlX3dvcmssIGZkZGVmKTsKKwlpbml0X3RpbWVyKCZmZGRlZi0+dGltZXIpOworCWZkZGVmLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmRkZWY7CisJZmRkZWYtPnRpbWVyLmZ1bmN0aW9uID0gZmR0YWJsZV90aW1lcjsKKwlmZGRlZi0+bmV4dCA9IE5VTEw7Cit9CisKK3ZvaWQgX19pbml0IGZpbGVzX2RlZmVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiBSZWFsbHkgZWFybHkgLSBjYW4ndCB1c2UgZm9yX2VhY2hfY3B1ICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJZmR0YWJsZV9kZWZlcl9saXN0X2luaXQoaSk7Cit9CmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmMKaW5kZXggMWQzZGU3OC4uODZlYzhhZSAxMDA2NDQKLS0tIGEvZnMvZmlsZV90YWJsZS5jCisrKyBiL2ZzL2ZpbGVfdGFibGUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CkBAIC01Myw5ICs1NCwxNSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbHBfY291bnRfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsZV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGZpbGUgKmYgPSAgY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBmaWxlLCBmX3JjdWhlYWQpOworCWttZW1fY2FjaGVfZnJlZShmaWxwX2NhY2hlcCwgZik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxlX2ZyZWUoc3RydWN0IGZpbGUgKmYpCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKGZpbHBfY2FjaGVwLCBmKTsKKwljYWxsX3JjdSgmZi0+Zl9yY3VoZWFkLCBmaWxlX2ZyZWVfcmN1KTsKIH0KIAogLyogRmluZCBhbiB1bnVzZWQgZmlsZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCkBAIC04OSw3ICs5Niw2IEBACiAJcndsb2NrX2luaXQoJmYtPmZfb3duZXIubG9jayk7CiAJLyogZi0+Zl92ZXJzaW9uOiAwICovCiAJSU5JVF9MSVNUX0hFQUQoJmYtPmZfbGlzdCk7Ci0JZi0+Zl9tYXhjb3VudCA9IElOVF9NQVg7CiAJcmV0dXJuIGY7CiAKIG92ZXI6CkBAIC0xMTEsNyArMTE3LDcgQEAKIAogdm9pZCBmYXN0Y2FsbCBmcHV0KHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmaWxlLT5mX2NvdW50KSkKKwlpZiAocmN1cmVmX2RlY19hbmRfdGVzdCgmZmlsZS0+Zl9jb3VudCkpCiAJCV9fZnB1dChmaWxlKTsKIH0KIApAQCAtMTU3LDExICsxNjMsMTcgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCi0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOwotCWlmIChmaWxlKQotCQlnZXRfZmlsZShmaWxlKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJaWYgKGZpbGUpIHsKKwkJaWYgKCFyY3VyZWZfaW5jX2xmKCZmaWxlLT5mX2NvdW50KSkgeworCQkJLyogRmlsZSBvYmplY3QgcmVmIGNvdWxkbid0IGJlIHRha2VuICovCisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCiAJcmV0dXJuIGZpbGU7CiB9CiAKQEAgLTE4MywyMSArMTk1LDI1IEBACiAJaWYgKGxpa2VseSgoYXRvbWljX3JlYWQoJmZpbGVzLT5jb3VudCkgPT0gMSkpKSB7CiAJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKIAl9IGVsc2UgewotCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKIAkJaWYgKGZpbGUpIHsKLQkJCWdldF9maWxlKGZpbGUpOwotCQkJKmZwdXRfbmVlZGVkID0gMTsKKwkJCWlmIChyY3VyZWZfaW5jX2xmKCZmaWxlLT5mX2NvdW50KSkKKwkJCQkqZnB1dF9uZWVkZWQgPSAxOworCQkJZWxzZQorCQkJCS8qIERpZG4ndCBnZXQgdGhlIHJlZmVyZW5jZSwgc29tZW9uZSdzIGZyZWVkICovCisJCQkJZmlsZSA9IE5VTEw7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CisKIAlyZXR1cm4gZmlsZTsKIH0KIAogCiB2b2lkIHB1dF9maWxwKHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmaWxlLT5mX2NvdW50KSkgeworCWlmIChyY3VyZWZfZGVjX2FuZF90ZXN0KCZmaWxlLT5mX2NvdW50KSkgewogCQlzZWN1cml0eV9maWxlX2ZyZWUoZmlsZSk7CiAJCWZpbGVfa2lsbChmaWxlKTsKIAkJZmlsZV9mcmVlKGZpbGUpOwpAQCAtMjU4LDQgKzI3NCw1IEBACiAJZmlsZXNfc3RhdC5tYXhfZmlsZXMgPSBuOyAKIAlpZiAoZmlsZXNfc3RhdC5tYXhfZmlsZXMgPCBOUl9GSUxFKQogCQlmaWxlc19zdGF0Lm1heF9maWxlcyA9IE5SX0ZJTEU7CisJZmlsZXNfZGVmZXJfaW5pdCgpOwogfSAKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwppbmRleCAyN2Y2NmQzLi42YWE2ZmJlIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogCXNicC0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAKLQlpbmZwID0ga2NhbGxvYygxLCBzaXplb2YoKmluZnApLCBHRlBfS0VSTkVMKTsKKwlpbmZwID0ga3phbGxvYyhzaXplb2YoKmluZnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZnApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAidnhmczogdW5hYmxlIHRvIGFsbG9jYXRlIGluY29yZSBzdXBlcmJsb2NrXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9mcy9mdXNlL01ha2VmaWxlIGIvZnMvZnVzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UxZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBGVVNFIGZpbGVzeXN0ZW0uCisjCisKK29iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm8KKworZnVzZS1vYmpzIDo9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGM4NjljCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMCwwICsxLDg3NyBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworTU9EVUxFX0FMSUFTX01JU0NERVYoRlVTRV9NSU5PUik7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmZ1c2VfcmVxX2NhY2hlcDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2dldF9jb25uKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlmYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoZmMgJiYgIWZjLT5tb3VudGVkKQorCQlmYyA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJcmV0dXJuIGZjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnVzZV9yZXF1ZXN0X2luaXQoc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZXEtPndhaXRxKTsKKwlhdG9taWNfc2V0KCZyZXEtPmNvdW50LCAxKTsKK30KKworc3RydWN0IGZ1c2VfcmVxICpmdXNlX3JlcXVlc3RfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9yZXFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKHJlcSkKKwkJZnVzZV9yZXF1ZXN0X2luaXQocmVxKTsKKwlyZXR1cm4gcmVxOworfQorCit2b2lkIGZ1c2VfcmVxdWVzdF9mcmVlKHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWttZW1fY2FjaGVfZnJlZShmdXNlX3JlcV9jYWNoZXAsIHJlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibG9ja19zaWdzKHNpZ3NldF90ICpvbGRzZXQpCit7CisJc2lnc2V0X3QgbWFzazsKKworCXNpZ2luaXRzZXRpbnYoJm1hc2ssIHNpZ21hc2soU0lHS0lMTCkpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2ssIG9sZHNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3NpZ3Moc2lnc2V0X3QgKm9sZHNldCkKK3sKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb2xkc2V0LCBOVUxMKTsKK30KKwordm9pZCBmdXNlX3Jlc2V0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJaW50IHByZWFsbG9jYXRlZCA9IHJlcS0+cHJlYWxsb2NhdGVkOworCUJVR19PTihhdG9taWNfcmVhZCgmcmVxLT5jb3VudCkgIT0gMSk7CisJZnVzZV9yZXF1ZXN0X2luaXQocmVxKTsKKwlyZXEtPnByZWFsbG9jYXRlZCA9IHByZWFsbG9jYXRlZDsKK30KKworc3RhdGljIHZvaWQgX19mdXNlX2dldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWF0b21pY19pbmMoJnJlcS0+Y291bnQpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoID4gMSByZWZjb3VudCAqLworc3RhdGljIHZvaWQgX19mdXNlX3B1dF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCUJVR19PTihhdG9taWNfcmVhZCgmcmVxLT5jb3VudCkgPCAyKTsKKwlhdG9taWNfZGVjKCZyZXEtPmNvdW50KTsKK30KKworc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqZG9fZ2V0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJQlVHX09OKGxpc3RfZW1wdHkoJmZjLT51bnVzZWRfbGlzdCkpOworCXJlcSA9IGxpc3RfZW50cnkoZmMtPnVudXNlZF9saXN0Lm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlmdXNlX3JlcXVlc3RfaW5pdChyZXEpOworCXJlcS0+cHJlYWxsb2NhdGVkID0gMTsKKwlyZXEtPmluLmgudWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVxLT5pbi5oLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlcS0+aW4uaC5waWQgPSBjdXJyZW50LT5waWQ7CisJcmV0dXJuIHJlcTsKK30KKworLyogVGhpcyBjYW4gcmV0dXJuIE5VTEwsIGJ1dCBvbmx5IGluIGNhc2UgaXQncyBpbnRlcnJ1cHRlZCBieSBhIFNJR0tJTEwgKi8KK3N0cnVjdCBmdXNlX3JlcSAqZnVzZV9nZXRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlpbnQgaW50cjsKKwlzaWdzZXRfdCBvbGRzZXQ7CisKKwlibG9ja19zaWdzKCZvbGRzZXQpOworCWludHIgPSBkb3duX2ludGVycnVwdGlibGUoJmZjLT5vdXRzdGFuZGluZ19zZW0pOworCXJlc3RvcmVfc2lncygmb2xkc2V0KTsKKwlyZXR1cm4gaW50ciA/IE5VTEwgOiBkb19nZXRfcmVxdWVzdChmYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfcHV0YmFja19yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKHJlcS0+cHJlYWxsb2NhdGVkKQorCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZmMtPnVudXNlZF9saXN0KTsKKwllbHNlCisJCWZ1c2VfcmVxdWVzdF9mcmVlKHJlcSk7CisKKwkvKiBJZiB3ZSBhcmUgaW4gZGVidCBkZWNyZWFzZSB0aGF0IGZpcnN0ICovCisJaWYgKGZjLT5vdXRzdGFuZGluZ19kZWJ0KQorCQlmYy0+b3V0c3RhbmRpbmdfZGVidC0tOworCWVsc2UKKwkJdXAoJmZjLT5vdXRzdGFuZGluZ19zZW0pOworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworfQorCit2b2lkIGZ1c2VfcHV0X3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPmNvdW50KSkKKwkJZnVzZV9wdXRiYWNrX3JlcXVlc3QoZmMsIHJlcSk7Cit9CisKK3ZvaWQgZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJaXB1dChyZXEtPmlub2RlKTsKKwlpcHV0KHJlcS0+aW5vZGUyKTsKKwlpZiAocmVxLT5maWxlKQorCQlmcHV0KHJlcS0+ZmlsZSk7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWxpc3RfZGVsKCZyZXEtPmJnX2VudHJ5KTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IGlzIGZpbmlzaGVkLiAgRWl0aGVyIGEgcmVwbHkKKyAqIGhhcyBhcnJpdmVkIG9yIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYW5kIG5vdCB5ZXQgc2VudCkgb3Igc29tZSBlcnJvcgorICogb2NjdXJlZCBkdXJpbmcgY29tbXVuaWNhdGlvbiB3aXRoIHVzZXJzcGFjZSwgb3IgdGhlIGRldmljZSBmaWxlIHdhcworICogY2xvc2VkLiAgSXQgZGVjcmVhc2VzIHRoZSByZWZlcmVjZSBjb3VudCBmb3IgdGhlIHJlcXVlc3QuICBJbiBjYXNlCisgKiBvZiBhIGJhY2tncm91bmQgcmVxdWVzdCB0aGUgcmVmZXJlY2UgdG8gdGhlIHN0b3JlZCBvYmplY3RzIGFyZQorICogcmVsZWFzZWQuICBUaGUgcmVxdWVzdGVyIHRocmVhZCBpcyB3b2tlbiB1cCAoaWYgc3RpbGwgd2FpdGluZyksIGFuZAorICogZmluYWxseSB0aGUgcmVxdWVzdCBpcyBlaXRoZXIgZnJlZWQgb3IgcHV0IG9uIHRoZSB1bnVzZWRfbGlzdAorICoKKyAqIENhbGxlZCB3aXRoIGZ1c2VfbG9jaywgdW5sb2NrcyBpdAorICovCitzdGF0aWMgdm9pZCByZXF1ZXN0X2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJaW50IHB1dGJhY2s7CisJcmVxLT5maW5pc2hlZCA9IDE7CisJcHV0YmFjayA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+Y291bnQpOworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCWlmIChyZXEtPmJhY2tncm91bmQpIHsKKwkJZG93bl9yZWFkKCZmYy0+c2JwdXRfc2VtKTsKKwkJaWYgKGZjLT5tb3VudGVkKQorCQkJZnVzZV9yZWxlYXNlX2JhY2tncm91bmQocmVxKTsKKwkJdXBfcmVhZCgmZmMtPnNicHV0X3NlbSk7CisJfQorCXdha2VfdXAoJnJlcS0+d2FpdHEpOworCWlmIChyZXEtPmluLmgub3Bjb2RlID09IEZVU0VfSU5JVCkgeworCQlpbnQgaTsKKworCQlpZiAocmVxLT5taXNjLmluaXRfaW5fb3V0Lm1ham9yICE9IEZVU0VfS0VSTkVMX1ZFUlNJT04pCisJCQlmYy0+Y29ubl9lcnJvciA9IDE7CisKKwkJLyogQWZ0ZXIgSU5JVCByZXBseSBpcyByZWNlaXZlZCBvdGhlciByZXF1ZXN0cyBjYW4gZ28KKwkJICAgb3V0LiAgU28gZG8gKEZVU0VfTUFYX09VVFNUQU5ESU5HIC0gMSkgbnVtYmVyIG9mCisJCSAgIHVwKClzIG9uIG91dHN0YW5kaW5nX3NlbS4gIFRoZSBsYXN0IHVwKCkgaXMgZG9uZSBpbgorCQkgICBmdXNlX3B1dGJhY2tfcmVxdWVzdCgpICovCisJCWZvciAoaSA9IDE7IGkgPCBGVVNFX01BWF9PVVRTVEFORElORzsgaSsrKQorCQkJdXAoJmZjLT5vdXRzdGFuZGluZ19zZW0pOworCX0KKwlpZiAocHV0YmFjaykKKwkJZnVzZV9wdXRiYWNrX3JlcXVlc3QoZmMsIHJlcSk7Cit9CisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5IHJlcXVlc3QgaW50ZXJydXB0aW9uIG5vdCBqdXN0IHNvbHZlcyB0aGUgZGVhZGxvY2sKKyAqIHByb2JsZW0sIGl0IGNhdXNlcyBwcm9ibGVtcyB0b28uICBUaGVzZSBzdGVtIGZyb20gdGhlIGZhY3QsIHRoYXQgYW4KKyAqIGludGVycnVwdGVkIHJlcXVlc3QgaXMgY29udGludWVkIHRvIGJlIHByb2Nlc3NlZCBpbiB1c2Vyc3BhY2UsCisgKiB3aGlsZSBhbGwgdGhlIGxvY2tzIGFuZCBvYmplY3QgcmVmZXJlbmNlcyAoaW5vZGUgYW5kIGZpbGUpIGhlbGQKKyAqIGR1cmluZyB0aGUgb3BlcmF0aW9uIGFyZSByZWxlYXNlZC4KKyAqCisgKiBUbyByZWxlYXNlIHRoZSBsb2NrcyBpcyBleGFjdGx5IHdoeSB0aGVyZSdzIGEgbmVlZCB0byBpbnRlcnJ1cHQgdGhlCisgKiByZXF1ZXN0LCBzbyB0aGVyZSdzIG5vdCBhIGxvdCB0aGF0IGNhbiBiZSBkb25lIGFib3V0IHRoaXMsIGV4Y2VwdAorICogaW50cm9kdWNlIGFkZGl0aW9uYWwgbG9ja2luZyBpbiB1c2Vyc3BhY2UuCisgKgorICogTW9yZSBpbXBvcnRhbnQgaXMgdG8ga2VlcCBpbm9kZSBhbmQgZmlsZSByZWZlcmVuY2VzIHVudGlsIHVzZXJzcGFjZQorICogaGFzIHJlcGxpZWQsIG90aGVyd2lzZSBGT1JHRVQgYW5kIFJFTEVBU0UgY291bGQgYmUgc2VudCB3aGlsZSB0aGUKKyAqIGlub2RlL2ZpbGUgaXMgc3RpbGwgdXNlZCBieSB0aGUgZmlsZXN5c3RlbS4KKyAqCisgKiBGb3IgdGhpcyByZWFzb24gdGhlIGNvbmNlcHQgb2YgImJhY2tncm91bmQiIHJlcXVlc3QgaXMgaW50cm9kdWNlZC4KKyAqIEFuIGludGVycnVwdGVkIHJlcXVlc3QgaXMgYmFja2dyb3VuZGVkIGlmIGl0IGhhcyBiZWVuIGFscmVhZHkgc2VudAorICogdG8gdXNlcnNwYWNlLiAgQmFja2dyb3VuZGluZyBpbnZvbHZlcyBnZXR0aW5nIGFuIGV4dHJhIHJlZmVyZW5jZSB0bworICogaW5vZGUocykgb3IgZmlsZSB1c2VkIGluIHRoZSByZXF1ZXN0LCBhbmQgYWRkaW5nIHRoZSByZXF1ZXN0IHRvCisgKiBmYy0+YmFja2dyb3VuZCBsaXN0LiAgV2hlbiBhIHJlcGx5IGlzIHJlY2VpdmVkIGZvciBhIGJhY2tncm91bmQKKyAqIHJlcXVlc3QsIHRoZSBvYmplY3QgcmVmZXJlbmNlcyBhcmUgcmVsZWFzZWQsIGFuZCB0aGUgcmVxdWVzdCBpcworICogcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiAgSWYgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIHdoaWxlIHRoZXJlCisgKiBhcmUgc3RpbGwgYmFja2dyb3VuZCByZXF1ZXN0cywgdGhlIGxpc3QgaXMgd2Fsa2VkIGFuZCByZWZlcmVuY2VzCisgKiBhcmUgcmVsZWFzZWQgYXMgaWYgYSByZXBseSB3YXMgcmVjZWl2ZWQuCisgKgorICogVGhlcmUncyBvbmUgbW9yZSB1c2UgZm9yIGEgYmFja2dyb3VuZCByZXF1ZXN0LiAgVGhlIFJFTEVBU0UgbWVzc2FnZSBpcworICogYWx3YXlzIHNlbnQgYXMgYmFja2dyb3VuZCwgc2luY2UgaXQgZG9lc24ndCByZXR1cm4gYW4gZXJyb3Igb3IKKyAqIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGJhY2tncm91bmRfcmVxdWVzdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJcmVxLT5iYWNrZ3JvdW5kID0gMTsKKwlsaXN0X2FkZCgmcmVxLT5iZ19lbnRyeSwgJmZjLT5iYWNrZ3JvdW5kKTsKKwlpZiAocmVxLT5pbm9kZSkKKwkJcmVxLT5pbm9kZSA9IGlncmFiKHJlcS0+aW5vZGUpOworCWlmIChyZXEtPmlub2RlMikKKwkJcmVxLT5pbm9kZTIgPSBpZ3JhYihyZXEtPmlub2RlMik7CisJaWYgKHJlcS0+ZmlsZSkKKwkJZ2V0X2ZpbGUocmVxLT5maWxlKTsKK30KKworLyogQ2FsbGVkIHdpdGggZnVzZV9sb2NrIGhlbGQuICBSZWxlYXNlcywgYW5kIHRoZW4gcmVhY3F1aXJlcyBpdC4gKi8KK3N0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXNpZ3NldF90IG9sZHNldDsKKworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCWJsb2NrX3NpZ3MoJm9sZHNldCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJlcS0+d2FpdHEsIHJlcS0+ZmluaXNoZWQpOworCXJlc3RvcmVfc2lncygmb2xkc2V0KTsKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKHJlcS0+ZmluaXNoZWQpCisJCXJldHVybjsKKworCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlOVFI7CisJcmVxLT5pbnRlcnJ1cHRlZCA9IDE7CisJaWYgKHJlcS0+bG9ja2VkKSB7CisJCS8qIFRoaXMgaXMgdW5pbnRlcnJ1cHRpYmxlIHNsZWVwLCBiZWNhdXNlIGRhdGEgaXMKKwkJICAgYmVpbmcgY29waWVkIHRvL2Zyb20gdGhlIGJ1ZmZlcnMgb2YgcmVxLiAgRHVyaW5nCisJCSAgIGxvY2tlZCBzdGF0ZSwgdGhlcmUgbXVzdG4ndCBiZSBhbnkgZmlsZXN5c3RlbQorCQkgICBvcGVyYXRpb24gKGUuZy4gcGFnZSBmYXVsdCksIHNpbmNlIHRoYXQgY291bGQgbGVhZAorCQkgICB0byBkZWFkbG9jayAqLworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwkJd2FpdF9ldmVudChyZXEtPndhaXRxLCAhcmVxLT5sb2NrZWQpOworCQlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJfQorCWlmICghcmVxLT5zZW50ICYmICFsaXN0X2VtcHR5KCZyZXEtPmxpc3QpKSB7CisJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCQlfX2Z1c2VfcHV0X3JlcXVlc3QocmVxKTsKKwl9IGVsc2UgaWYgKCFyZXEtPmZpbmlzaGVkICYmIHJlcS0+c2VudCkKKwkJYmFja2dyb3VuZF9yZXF1ZXN0KGZjLCByZXEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbGVuX2FyZ3ModW5zaWduZWQgbnVtYXJncywgc3RydWN0IGZ1c2VfYXJnICphcmdzKQoreworCXVuc2lnbmVkIG5ieXRlcyA9IDA7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1hcmdzOyBpKyspCisJCW5ieXRlcyArPSBhcmdzW2ldLnNpemU7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlmYy0+cmVxY3RyKys7CisJLyogemVybyBpcyBzcGVjaWFsICovCisJaWYgKGZjLT5yZXFjdHIgPT0gMCkKKwkJZmMtPnJlcWN0ciA9IDE7CisJcmVxLT5pbi5oLnVuaXF1ZSA9IGZjLT5yZXFjdHI7CisJcmVxLT5pbi5oLmxlbiA9IHNpemVvZihzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIpICsKKwkJbGVuX2FyZ3MocmVxLT5pbi5udW1hcmdzLCAoc3RydWN0IGZ1c2VfYXJnICopIHJlcS0+aW4uYXJncyk7CisJaWYgKCFyZXEtPnByZWFsbG9jYXRlZCkgeworCQkvKiBJZiByZXF1ZXN0IGlzIG5vdCBwcmVhbGxvY2F0ZWQgKGVpdGhlciBGT1JHRVQgb3IKKwkJICAgUkVMRUFTRSksIHRoZW4gc3RpbGwgZGVjcmVhc2Ugb3V0c3RhbmRpbmdfc2VtLCBzbworCQkgICB1c2VyIGNhbid0IG9wZW4gaW5maW5pdGUgbnVtYmVyIG9mIGZpbGVzIHdoaWxlIG5vdAorCQkgICBwcm9jZXNzaW5nIHRoZSBSRUxFQVNFIHJlcXVlc3RzLiAgSG93ZXZlciBmb3IKKwkJICAgZWZmaWNpZW5jeSBkbyBpdCB3aXRob3V0IGJsb2NraW5nLCBzbyBpZiBkb3duKCkKKwkJICAgd291bGQgYmxvY2ssIGp1c3QgaW5jcmVhc2UgdGhlIGRlYnQgaW5zdGVhZCAqLworCQlpZiAoZG93bl90cnlsb2NrKCZmYy0+b3V0c3RhbmRpbmdfc2VtKSkKKwkJCWZjLT5vdXRzdGFuZGluZ19kZWJ0Kys7CisJfQorCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmZjLT5wZW5kaW5nKTsKKwl3YWtlX3VwKCZmYy0+d2FpdHEpOworfQorCisvKgorICogVGhpcyBjYW4gb25seSBiZSBpbnRlcnJ1cHRlZCBieSBhIFNJR0tJTEwKKyAqLwordm9pZCByZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXJlcS0+aXNyZXBseSA9IDE7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWlmICghZmMtPmNvbm5lY3RlZCkKKwkJcmVxLT5vdXQuaC5lcnJvciA9IC1FTk9UQ09OTjsKKwllbHNlIGlmIChmYy0+Y29ubl9lcnJvcikKKwkJcmVxLT5vdXQuaC5lcnJvciA9IC1FQ09OTlJFRlVTRUQ7CisJZWxzZSB7CisJCXF1ZXVlX3JlcXVlc3QoZmMsIHJlcSk7CisJCS8qIGFjcXVpcmUgZXh0cmEgcmVmZXJlbmNlLCBzaW5jZSByZXF1ZXN0IGlzIHN0aWxsIG5lZWRlZAorCQkgICBhZnRlciByZXF1ZXN0X2VuZCgpICovCisJCV9fZnVzZV9nZXRfcmVxdWVzdChyZXEpOworCisJCXJlcXVlc3Rfd2FpdF9hbnN3ZXIoZmMsIHJlcSk7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X3NlbmRfbm93YWl0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKGZjLT5jb25uZWN0ZWQpIHsKKwkJcXVldWVfcmVxdWVzdChmYywgcmVxKTsKKwkJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJfSBlbHNlIHsKKwkJcmVxLT5vdXQuaC5lcnJvciA9IC1FTk9UQ09OTjsKKwkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CisJfQorfQorCit2b2lkIHJlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlyZXEtPmlzcmVwbHkgPSAwOworCXJlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7Cit9CisKK3ZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXJlcS0+aXNyZXBseSA9IDE7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWJhY2tncm91bmRfcmVxdWVzdChmYywgcmVxKTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlyZXF1ZXN0X3NlbmRfbm93YWl0KGZjLCByZXEpOworfQorCit2b2lkIGZ1c2Vfc2VuZF9pbml0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCS8qIFRoaXMgaXMgY2FsbGVkIGZyb20gZnVzZV9yZWFkX3N1cGVyKCkgc28gdGhlcmUncyBndWFyYW50ZWVkCisJICAgdG8gYmUgYSByZXF1ZXN0IGF2YWlsYWJsZSAqLworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZG9fZ2V0X3JlcXVlc3QoZmMpOworCXN0cnVjdCBmdXNlX2luaXRfaW5fb3V0ICphcmcgPSAmcmVxLT5taXNjLmluaXRfaW5fb3V0OworCWFyZy0+bWFqb3IgPSBGVVNFX0tFUk5FTF9WRVJTSU9OOworCWFyZy0+bWlub3IgPSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lOSVQ7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZigqYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBhcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKCphcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBhcmc7CisJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7Cit9CisKKy8qCisgKiBMb2NrIHRoZSByZXF1ZXN0LiAgVXAgdG8gdGhlIG5leHQgdW5sb2NrX3JlcXVlc3QoKSB0aGVyZSBtdXN0bid0IGJlCisgKiBhbnl0aGluZyB0aGF0IGNvdWxkIGNhdXNlIGEgcGFnZS1mYXVsdC4gIElmIHRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5CisgKiBpbnRlcnJ1cHRlZCBiYWlsIG91dC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbG9ja19yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWludCBlcnIgPSAwOworCWlmIChyZXEpIHsKKwkJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCQlpZiAocmVxLT5pbnRlcnJ1cHRlZCkKKwkJCWVyciA9IC1FTk9FTlQ7CisJCWVsc2UKKwkJCXJlcS0+bG9ja2VkID0gMTsKKwkJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBVbmxvY2sgcmVxdWVzdC4gIElmIGl0IHdhcyBpbnRlcnJ1cHRlZCBkdXJpbmcgYmVpbmcgbG9ja2VkLCB0aGUKKyAqIHJlcXVlc3RlciB0aHJlYWQgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIGl0IHRvIGJlIHVubG9ja2VkLCBzbworICogd2FrZSBpdCB1cC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCWlmIChyZXEpIHsKKwkJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCQlyZXEtPmxvY2tlZCA9IDA7CisJCWlmIChyZXEtPmludGVycnVwdGVkKQorCQkJd2FrZV91cCgmcmVxLT53YWl0cSk7CisJCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCX0KK30KKworc3RydWN0IGZ1c2VfY29weV9zdGF0ZSB7CisJaW50IHdyaXRlOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92OworCXVuc2lnbmVkIGxvbmcgbnJfc2VnczsKKwl1bnNpZ25lZCBsb25nIHNlZ2xlbjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IHBhZ2UgKnBnOworCXZvaWQgKm1hcGFkZHI7CisJdm9pZCAqYnVmOworCXVuc2lnbmVkIGxlbjsKK307CisKK3N0YXRpYyB2b2lkIGZ1c2VfY29weV9pbml0KHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCBpbnQgd3JpdGUsCisJCQkgICBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJbWVtc2V0KGNzLCAwLCBzaXplb2YoKmNzKSk7CisJY3MtPndyaXRlID0gd3JpdGU7CisJY3MtPnJlcSA9IHJlcTsKKwljcy0+aW92ID0gaW92OworCWNzLT5ucl9zZWdzID0gbnJfc2VnczsKK30KKworLyogVW5tYXAgYW5kIHB1dCBwcmV2aW91cyBwYWdlIG9mIHVzZXJzcGFjZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmdXNlX2NvcHlfZmluaXNoKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzKQoreworCWlmIChjcy0+bWFwYWRkcikgeworCQlrdW5tYXBfYXRvbWljKGNzLT5tYXBhZGRyLCBLTV9VU0VSMCk7CisJCWlmIChjcy0+d3JpdGUpIHsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKGNzLT5wZyk7CisJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKGNzLT5wZyk7CisJCX0KKwkJcHV0X3BhZ2UoY3MtPnBnKTsKKwkJY3MtPm1hcGFkZHIgPSBOVUxMOworCX0KK30KKworLyoKKyAqIEdldCBhbm90aGVyIHBhZ2VmdWxsIG9mIHVzZXJzcGFjZSBidWZmZXIsIGFuZCBtYXAgaXQgdG8ga2VybmVsCisgKiBhZGRyZXNzIHNwYWNlLCBhbmQgbG9jayByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgZnVzZV9jb3B5X2ZpbGwoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IGVycjsKKworCXVubG9ja19yZXF1ZXN0KGNzLT5yZXEpOworCWZ1c2VfY29weV9maW5pc2goY3MpOworCWlmICghY3MtPnNlZ2xlbikgeworCQlCVUdfT04oIWNzLT5ucl9zZWdzKTsKKwkJY3MtPnNlZ2xlbiA9IGNzLT5pb3ZbMF0uaW92X2xlbjsKKwkJY3MtPmFkZHIgPSAodW5zaWduZWQgbG9uZykgY3MtPmlvdlswXS5pb3ZfYmFzZTsKKwkJY3MtPmlvdiArKzsKKwkJY3MtPm5yX3NlZ3MgLS07CisJfQorCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnIgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgY3MtPmFkZHIsIDEsIGNzLT53cml0ZSwgMCwKKwkJCSAgICAgJmNzLT5wZywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlCVUdfT04oZXJyICE9IDEpOworCW9mZnNldCA9IGNzLT5hZGRyICUgUEFHRV9TSVpFOworCWNzLT5tYXBhZGRyID0ga21hcF9hdG9taWMoY3MtPnBnLCBLTV9VU0VSMCk7CisJY3MtPmJ1ZiA9IGNzLT5tYXBhZGRyICsgb2Zmc2V0OworCWNzLT5sZW4gPSBtaW4oUEFHRV9TSVpFIC0gb2Zmc2V0LCBjcy0+c2VnbGVuKTsKKwljcy0+c2VnbGVuIC09IGNzLT5sZW47CisJY3MtPmFkZHIgKz0gY3MtPmxlbjsKKworCXJldHVybiBsb2NrX3JlcXVlc3QoY3MtPnJlcSk7Cit9CisKKy8qIERvIGFzIG11Y2ggY29weSB0by9mcm9tIHVzZXJzcGFjZSBidWZmZXIgYXMgd2UgY2FuICovCitzdGF0aWMgaW5saW5lIGludCBmdXNlX2NvcHlfZG8oc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHZvaWQgKip2YWwsCisJCQkgICAgICAgdW5zaWduZWQgKnNpemUpCit7CisJdW5zaWduZWQgbmNweSA9IG1pbigqc2l6ZSwgY3MtPmxlbik7CisJaWYgKHZhbCkgeworCQlpZiAoY3MtPndyaXRlKQorCQkJbWVtY3B5KGNzLT5idWYsICp2YWwsIG5jcHkpOworCQllbHNlCisJCQltZW1jcHkoKnZhbCwgY3MtPmJ1ZiwgbmNweSk7CisJCSp2YWwgKz0gbmNweTsKKwl9CisJKnNpemUgLT0gbmNweTsKKwljcy0+bGVuIC09IG5jcHk7CisJY3MtPmJ1ZiArPSBuY3B5OworCXJldHVybiBuY3B5OworfQorCisvKgorICogQ29weSBhIHBhZ2UgaW4gdGhlIHJlcXVlc3QgdG8vZnJvbSB0aGUgdXNlcnNwYWNlIGJ1ZmZlci4gIE11c3QgYmUKKyAqIGRvbmUgYXRvbWljYWxseQorICovCitzdGF0aWMgaW5saW5lIGludCBmdXNlX2NvcHlfcGFnZShzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgY291bnQsIGludCB6ZXJvaW5nKQoreworCWlmIChwYWdlICYmIHplcm9pbmcgJiYgY291bnQgPCBQQUdFX1NJWkUpIHsKKwkJdm9pZCAqbWFwYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwkJbWVtc2V0KG1hcGFkZHIsIDAsIFBBR0VfU0laRSk7CisJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOworCX0KKwl3aGlsZSAoY291bnQpIHsKKwkJaW50IGVycjsKKwkJaWYgKCFjcy0+bGVuICYmIChlcnIgPSBmdXNlX2NvcHlfZmlsbChjcykpKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKHBhZ2UpIHsKKwkJCXZvaWQgKm1hcGFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJCQl2b2lkICpidWYgPSBtYXBhZGRyICsgb2Zmc2V0OworCQkJb2Zmc2V0ICs9IGZ1c2VfY29weV9kbyhjcywgJmJ1ZiwgJmNvdW50KTsKKwkJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOworCQl9IGVsc2UKKwkJCW9mZnNldCArPSBmdXNlX2NvcHlfZG8oY3MsIE5VTEwsICZjb3VudCk7CisJfQorCWlmIChwYWdlICYmICFjcy0+d3JpdGUpCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKiBDb3B5IHBhZ2VzIGluIHRoZSByZXF1ZXN0IHRvL2Zyb20gdXNlcnNwYWNlIGJ1ZmZlciAqLworc3RhdGljIGludCBmdXNlX2NvcHlfcGFnZXMoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHVuc2lnbmVkIG5ieXRlcywKKwkJCSAgIGludCB6ZXJvaW5nKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBjcy0+cmVxOworCXVuc2lnbmVkIG9mZnNldCA9IHJlcS0+cGFnZV9vZmZzZXQ7CisJdW5zaWduZWQgY291bnQgPSBtaW4obmJ5dGVzLCAodW5zaWduZWQpIFBBR0VfU0laRSAtIG9mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVxLT5udW1fcGFnZXMgJiYgKG5ieXRlcyB8fCB6ZXJvaW5nKTsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKKwkJaW50IGVyciA9IGZ1c2VfY29weV9wYWdlKGNzLCBwYWdlLCBvZmZzZXQsIGNvdW50LCB6ZXJvaW5nKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJbmJ5dGVzIC09IGNvdW50OworCQljb3VudCA9IG1pbihuYnl0ZXMsICh1bnNpZ25lZCkgUEFHRV9TSVpFKTsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgYSBzaW5nbGUgYXJndW1lbnQgaW4gdGhlIHJlcXVlc3QgdG8vZnJvbSB1c2Vyc3BhY2UgYnVmZmVyICovCitzdGF0aWMgaW50IGZ1c2VfY29weV9vbmUoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHZvaWQgKnZhbCwgdW5zaWduZWQgc2l6ZSkKK3sKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgZXJyOworCQlpZiAoIWNzLT5sZW4gJiYgKGVyciA9IGZ1c2VfY29weV9maWxsKGNzKSkpCisJCQlyZXR1cm4gZXJyOworCQlmdXNlX2NvcHlfZG8oY3MsICZ2YWwsICZzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgcmVxdWVzdCBhcmd1bWVudHMgdG8vZnJvbSB1c2Vyc3BhY2UgYnVmZmVyICovCitzdGF0aWMgaW50IGZ1c2VfY29weV9hcmdzKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCB1bnNpZ25lZCBudW1hcmdzLAorCQkJICB1bnNpZ25lZCBhcmdwYWdlcywgc3RydWN0IGZ1c2VfYXJnICphcmdzLAorCQkJICBpbnQgemVyb2luZykKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgIWVyciAmJiBpIDwgbnVtYXJnczsgaSsrKSAgeworCQlzdHJ1Y3QgZnVzZV9hcmcgKmFyZyA9ICZhcmdzW2ldOworCQlpZiAoaSA9PSBudW1hcmdzIC0gMSAmJiBhcmdwYWdlcykKKwkJCWVyciA9IGZ1c2VfY29weV9wYWdlcyhjcywgYXJnLT5zaXplLCB6ZXJvaW5nKTsKKwkJZWxzZQorCQkJZXJyID0gZnVzZV9jb3B5X29uZShjcywgYXJnLT52YWx1ZSwgYXJnLT5zaXplKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KK3N0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmZmMtPndhaXRxLCAmd2FpdCk7CisJd2hpbGUgKGZjLT5tb3VudGVkICYmIGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZmYy0+d2FpdHEsICZ3YWl0KTsKK30KKworLyoKKyAqIFJlYWQgYSBzaW5nbGUgcmVxdWVzdCBpbnRvIHRoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSdzIGJ1ZmZlci4gIFRoaXMKKyAqIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUsIHRoZW4gcmVtb3ZlcyBpdCBmcm9tCisgKiB0aGUgcGVuZGluZyBsaXN0IGFuZCBjb3BpZXMgcmVxdWVzdCBkYXRhIHRvIHVzZXJzcGFjZSBidWZmZXIuICBJZgorICogbm8gcmVwbHkgaXMgbmVlZGVkIChGT1JHRVQpIG9yIHJlcXVlc3QgaGFzIGJlZW4gaW50ZXJydXB0ZWQgb3IKKyAqIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgdGhlIGNvcHlpbmcgdGhlbiBpdCdzIGZpbmlzaGVkIGJ5IGNhbGxpbmcKKyAqIHJlcXVlc3RfZW5kKCkuICBPdGhlcndpc2UgYWRkIGl0IHRvIHRoZSBwcm9jZXNzaW5nIGxpc3QsIGFuZCBzZXQKKyAqIHRoZSAnc2VudCcgZmxhZy4KKyAqLworc3RhdGljIHNzaXplX3QgZnVzZV9kZXZfcmVhZHYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2luICppbjsKKwlzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlIGNzOworCXVuc2lnbmVkIHJlcXNpemU7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJZmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJZXJyID0gLUVQRVJNOworCWlmICghZmMpCisJCWdvdG8gZXJyX3VubG9jazsKKwlyZXF1ZXN0X3dhaXQoZmMpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFmYy0+bW91bnRlZCkKKwkJZ290byBlcnJfdW5sb2NrOworCWVyciA9IC1FUkVTVEFSVFNZUzsKKwlpZiAobGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpKQorCQlnb3RvIGVycl91bmxvY2s7CisKKwlyZXEgPSBsaXN0X2VudHJ5KGZjLT5wZW5kaW5nLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKworCWluID0gJnJlcS0+aW47CisJcmVxc2l6ZSA9IHJlcS0+aW4uaC5sZW47CisJZnVzZV9jb3B5X2luaXQoJmNzLCAxLCByZXEsIGlvdiwgbnJfc2Vncyk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpID49IHJlcXNpemUpIHsKKwkJZXJyID0gZnVzZV9jb3B5X29uZSgmY3MsICZpbi0+aCwgc2l6ZW9mKGluLT5oKSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gZnVzZV9jb3B5X2FyZ3MoJmNzLCBpbi0+bnVtYXJncywgaW4tPmFyZ3BhZ2VzLAorCQkJCQkgICAgIChzdHJ1Y3QgZnVzZV9hcmcgKikgaW4tPmFyZ3MsIDApOworCX0KKwlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJcmVxLT5sb2NrZWQgPSAwOworCWlmICghZXJyICYmIHJlcS0+aW50ZXJydXB0ZWQpCisJCWVyciA9IC1FTk9FTlQ7CisJaWYgKGVycikgeworCQlpZiAoIXJlcS0+aW50ZXJydXB0ZWQpCisJCQlyZXEtPm91dC5oLmVycm9yID0gLUVJTzsKKwkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICghcmVxLT5pc3JlcGx5KQorCQlyZXF1ZXN0X2VuZChmYywgcmVxKTsKKwllbHNlIHsKKwkJcmVxLT5zZW50ID0gMTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZmMtPnByb2Nlc3NpbmcpOworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwl9CisJcmV0dXJuIHJlcXNpemU7CisKKyBlcnJfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJaW92Lmlvdl9sZW4gPSBuYnl0ZXM7CisJaW92Lmlvdl9iYXNlID0gYnVmOworCXJldHVybiBmdXNlX2Rldl9yZWFkdihmaWxlLCAmaW92LCAxLCBvZmYpOworfQorCisvKiBMb29rIHVwIHJlcXVlc3Qgb24gcHJvY2Vzc2luZyBsaXN0IGJ5IHVuaXF1ZSBJRCAqLworc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqcmVxdWVzdF9maW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1NjQgdW5pcXVlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmZjLT5wcm9jZXNzaW5nKSB7CisJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCQlyZXEgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOworCQlpZiAocmVxLT5pbi5oLnVuaXF1ZSA9PSB1bmlxdWUpCisJCQlyZXR1cm4gcmVxOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjb3B5X291dF9hcmdzKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCBzdHJ1Y3QgZnVzZV9vdXQgKm91dCwKKwkJCSB1bnNpZ25lZCBuYnl0ZXMpCit7CisJdW5zaWduZWQgcmVxc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyKTsKKworCWlmIChvdXQtPmguZXJyb3IpCisJCXJldHVybiBuYnl0ZXMgIT0gcmVxc2l6ZSA/IC1FSU5WQUwgOiAwOworCisJcmVxc2l6ZSArPSBsZW5fYXJncyhvdXQtPm51bWFyZ3MsIG91dC0+YXJncyk7CisKKwlpZiAocmVxc2l6ZSA8IG5ieXRlcyB8fCAocmVxc2l6ZSA+IG5ieXRlcyAmJiAhb3V0LT5hcmd2YXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChyZXFzaXplID4gbmJ5dGVzKSB7CisJCXN0cnVjdCBmdXNlX2FyZyAqbGFzdGFyZyA9ICZvdXQtPmFyZ3Nbb3V0LT5udW1hcmdzLTFdOworCQl1bnNpZ25lZCBkaWZmc2l6ZSA9IHJlcXNpemUgLSBuYnl0ZXM7CisJCWlmIChkaWZmc2l6ZSA+IGxhc3RhcmctPnNpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbGFzdGFyZy0+c2l6ZSAtPSBkaWZmc2l6ZTsKKwl9CisJcmV0dXJuIGZ1c2VfY29weV9hcmdzKGNzLCBvdXQtPm51bWFyZ3MsIG91dC0+YXJncGFnZXMsIG91dC0+YXJncywKKwkJCSAgICAgIG91dC0+cGFnZV96ZXJvaW5nKTsKK30KKworLyoKKyAqIFdyaXRlIGEgc2luZ2xlIHJlcGx5IHRvIGEgcmVxdWVzdC4gIEZpcnN0IHRoZSBoZWFkZXIgaXMgY29waWVkIGZyb20KKyAqIHRoZSB3cml0ZSBidWZmZXIuICBUaGUgcmVxdWVzdCBpcyB0aGVuIHNlYXJjaGVkIG9uIHRoZSBwcm9jZXNzaW5nCisgKiBsaXN0IGJ5IHRoZSB1bmlxdWUgSUQgZm91bmQgaW4gdGhlIGhlYWRlci4gIElmIGZvdW5kLCB0aGVuIHJlbW92ZQorICogaXQgZnJvbSB0aGUgbGlzdCBhbmQgY29weSB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIHRvIHRoZSByZXF1ZXN0LgorICogVGhlIHJlcXVlc3QgaXMgZmluaXNoZWQgYnkgY2FsbGluZyByZXF1ZXN0X2VuZCgpCisgKi8KK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIG5ieXRlcyA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyIG9oOworCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBmdXNlX2dldF9jb25uKGZpbGUpOworCWlmICghZmMpCisJCXJldHVybiAtRU5PREVWOworCisJZnVzZV9jb3B5X2luaXQoJmNzLCAwLCBOVUxMLCBpb3YsIG5yX3NlZ3MpOworCWlmIChuYnl0ZXMgPCBzaXplb2Yoc3RydWN0IGZ1c2Vfb3V0X2hlYWRlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gZnVzZV9jb3B5X29uZSgmY3MsICZvaCwgc2l6ZW9mKG9oKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZmluaXNoOworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFvaC51bmlxdWUgfHwgb2guZXJyb3IgPD0gLTEwMDAgfHwgb2guZXJyb3IgPiAwIHx8CisJICAgIG9oLmxlbiAhPSBuYnl0ZXMpCisJCWdvdG8gZXJyX2ZpbmlzaDsKKworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlyZXEgPSByZXF1ZXN0X2ZpbmQoZmMsIG9oLnVuaXF1ZSk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIXJlcSkKKwkJZ290byBlcnJfdW5sb2NrOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlpZiAocmVxLT5pbnRlcnJ1cHRlZCkgeworCQlyZXF1ZXN0X2VuZChmYywgcmVxKTsKKwkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcmVxLT5vdXQuaCA9IG9oOworCXJlcS0+bG9ja2VkID0gMTsKKwljcy5yZXEgPSByZXE7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisKKwllcnIgPSBjb3B5X291dF9hcmdzKCZjcywgJnJlcS0+b3V0LCBuYnl0ZXMpOworCWZ1c2VfY29weV9maW5pc2goJmNzKTsKKworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlyZXEtPmxvY2tlZCA9IDA7CisJaWYgKCFlcnIpIHsKKwkJaWYgKHJlcS0+aW50ZXJydXB0ZWQpCisJCQllcnIgPSAtRU5PRU5UOworCX0gZWxzZSBpZiAoIXJlcS0+aW50ZXJydXB0ZWQpCisJCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlPOworCXJlcXVlc3RfZW5kKGZjLCByZXEpOworCisJcmV0dXJuIGVyciA/IGVyciA6IG5ieXRlczsKKworIGVycl91bmxvY2s6CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisgZXJyX2ZpbmlzaDoKKwlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgZnVzZV9kZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWlvdi5pb3ZfbGVuID0gbmJ5dGVzOworCWlvdi5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKSBidWY7CisJcmV0dXJuIGZ1c2VfZGV2X3dyaXRldihmaWxlLCAmaW92LCAxLCBvZmYpOworfQorCitzdGF0aWMgdW5zaWduZWQgZnVzZV9kZXZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfZ2V0X2Nvbm4oZmlsZSk7CisJdW5zaWduZWQgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJaWYgKCFmYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmZjLT53YWl0cSwgd2FpdCk7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykpCisgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qIEFib3J0IGFsbCByZXF1ZXN0cyBvbiB0aGUgZ2l2ZW4gbGlzdCAocGVuZGluZyBvciBwcm9jZXNzaW5nKSAqLworc3RhdGljIHZvaWQgZW5kX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwkJcmVxID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOworCQlyZXEtPm91dC5oLmVycm9yID0gLUVDT05OQUJPUlRFRDsKKwkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CisJCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKKworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlmYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoZmMpIHsKKwkJZmMtPmNvbm5lY3RlZCA9IDA7CisJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wZW5kaW5nKTsKKwkJZW5kX3JlcXVlc3RzKGZjLCAmZmMtPnByb2Nlc3NpbmcpOworCQlmdXNlX3JlbGVhc2VfY29ubihmYyk7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGV2X29wZXJhdGlvbnMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGZ1c2VfZGV2X3JlYWQsCisJLnJlYWR2CQk9IGZ1c2VfZGV2X3JlYWR2LAorCS53cml0ZQkJPSBmdXNlX2Rldl93cml0ZSwKKwkud3JpdGV2CQk9IGZ1c2VfZGV2X3dyaXRldiwKKwkucG9sbAkJPSBmdXNlX2Rldl9wb2xsLAorCS5yZWxlYXNlCT0gZnVzZV9kZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmdXNlX21pc2NkZXZpY2UgPSB7CisJLm1pbm9yID0gRlVTRV9NSU5PUiwKKwkubmFtZSAgPSAiZnVzZSIsCisJLmZvcHMgPSAmZnVzZV9kZXZfb3BlcmF0aW9ucywKK307CisKK2ludCBfX2luaXQgZnVzZV9kZXZfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSAtRU5PTUVNOworCWZ1c2VfcmVxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmdXNlX3JlcXVlc3QiLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBmdXNlX3JlcSksCisJCQkJCSAgICAwLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWZ1c2VfcmVxX2NhY2hlcCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZmdXNlX21pc2NkZXZpY2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2NhY2hlX2NsZWFuOworCisJcmV0dXJuIDA7CisKKyBvdXRfY2FjaGVfY2xlYW46CisJa21lbV9jYWNoZV9kZXN0cm95KGZ1c2VfcmVxX2NhY2hlcCk7Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgZnVzZV9kZXZfY2xlYW51cCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmZnVzZV9taXNjZGV2aWNlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZnVzZV9yZXFfY2FjaGVwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0wLDAgKzEsOTgyIEBACisvKgorICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorCisgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKyNpbmNsdWRlICJmdXNlX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGltZV90b19qaWZmaWVzKHVuc2lnbmVkIGxvbmcgc2VjLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBuc2VjKQoreworCXN0cnVjdCB0aW1lc3BlYyB0cyA9IHtzZWMsIG5zZWN9OworCXJldHVybiBqaWZmaWVzICsgdGltZXNwZWNfdG9famlmZmllcygmdHMpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2xvb2t1cF9pbml0KHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgICAgc3RydWN0IGRlbnRyeSAqZW50cnksCisJCQkgICAgIHN0cnVjdCBmdXNlX2VudHJ5X291dCAqb3V0YXJnKQoreworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0xPT0tVUDsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKKwlyZXEtPmlub2RlID0gZGlyOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBvdXRhcmc7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKCFlbnRyeS0+ZF9pbm9kZSB8fCBpc19iYWRfaW5vZGUoZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5kX3RpbWUpKSB7CisJCWludCBlcnI7CisJCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCQlpZiAoIXJlcSkKKwkJCXJldHVybiAwOworCisJCWZ1c2VfbG9va3VwX2luaXQocmVxLCBlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUsIGVudHJ5LCAmb3V0YXJnKTsKKwkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQllcnIgPSByZXEtPm91dC5oLmVycm9yOworCQlpZiAoIWVycikgeworCQkJaWYgKG91dGFyZy5ub2RlaWQgIT0gZ2V0X25vZGVfaWQoaW5vZGUpKSB7CisJCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWZpLT5ubG9va3VwICsrOworCQl9CisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJCWlmIChlcnIgfHwgKG91dGFyZy5hdHRyLm1vZGUgXiBpbm9kZS0+aV9tb2RlKSAmIFNfSUZNVCkKKwkJCXJldHVybiAwOworCisJCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsICZvdXRhcmcuYXR0cik7CisJCWVudHJ5LT5kX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmVudHJ5X3ZhbGlkLAorCQkJCQkJb3V0YXJnLmVudHJ5X3ZhbGlkX25zZWMpOworCQlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAorCQkJCQkgICAgIG91dGFyZy5hdHRyX3ZhbGlkX25zZWMpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBmdXNlX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX3JldmFsaWRhdGUJPSBmdXNlX2RlbnRyeV9yZXZhbGlkYXRlLAorfTsKKworc3RhdGljIGludCBmdXNlX2xvb2t1cF9pZ2V0KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCSAgICBzdHJ1Y3QgaW5vZGUgKippbm9kZXApCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0YXJnOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCisJaWYgKGVudHJ5LT5kX25hbWUubGVuID4gRlVTRV9OQU1FX01BWCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCWZ1c2VfbG9va3VwX2luaXQocmVxLCBkaXIsIGVudHJ5LCAmb3V0YXJnKTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlpZiAoIWVycikgeworCQlpbm9kZSA9IGZ1c2VfaWdldChkaXItPmlfc2IsIG91dGFyZy5ub2RlaWQsIG91dGFyZy5nZW5lcmF0aW9uLAorCQkJCSAgJm91dGFyZy5hdHRyKTsKKwkJaWYgKCFpbm9kZSkgeworCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChpbm9kZSkgeworCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CisJCWVudHJ5LT5kX3RpbWUgPQl0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmVudHJ5X3ZhbGlkLAorCQkJCQkJb3V0YXJnLmVudHJ5X3ZhbGlkX25zZWMpOworCQlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAorCQkJCQkgICAgIG91dGFyZy5hdHRyX3ZhbGlkX25zZWMpOworCX0KKworCWVudHJ5LT5kX29wID0gJmZ1c2VfZGVudHJ5X29wZXJhdGlvbnM7CisJKmlub2RlcCA9IGlub2RlOworCXJldHVybiAwOworfQorCit2b2lkIGZ1c2VfaW52YWxpZGF0ZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpLT5pX3RpbWUgPSBqaWZmaWVzIC0gMTsKK30KKworc3RhdGljIHZvaWQgZnVzZV9pbnZhbGlkYXRlX2VudHJ5KHN0cnVjdCBkZW50cnkgKmVudHJ5KQoreworCWRfaW52YWxpZGF0ZShlbnRyeSk7CisJZW50cnktPmRfdGltZSA9IGppZmZpZXMgLSAxOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9uZXdfZW50cnkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAorCQkJICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCSAgICBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0YXJnOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZ1c2VfaW5vZGUgKmZpOworCWludCBlcnI7CisKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoZGlyKTsKKwlyZXEtPmlub2RlID0gZGlyOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWlmIChlcnIpIHsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaW5vZGUgPSBmdXNlX2lnZXQoZGlyLT5pX3NiLCBvdXRhcmcubm9kZWlkLCBvdXRhcmcuZ2VuZXJhdGlvbiwKKwkJCSAgJm91dGFyZy5hdHRyKTsKKwlpZiAoIWlub2RlKSB7CisJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCisJLyogRG9uJ3QgYWxsb3cgdXNlcnNwYWNlIHRvIGRvIHJlYWxseSBzdHVwaWQgdGhpbmdzLi4uICovCisJaWYgKChpbm9kZS0+aV9tb2RlIF4gbW9kZSkgJiBTX0lGTVQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWVudHJ5LT5kX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMob3V0YXJnLmVudHJ5X3ZhbGlkLAorCQkJCQlvdXRhcmcuZW50cnlfdmFsaWRfbnNlYyk7CisKKwlmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAorCQkJCSAgICAgb3V0YXJnLmF0dHJfdmFsaWRfbnNlYyk7CisKKwlkX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgaW50IG1vZGUsCisJCSAgICAgIGRldl90IHJkZXYpCit7CisJc3RydWN0IGZ1c2VfbWtub2RfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLm1vZGUgPSBtb2RlOworCWluYXJnLnJkZXYgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9NS05PRDsKKwlyZXEtPmluLm51bWFyZ3MgPSAyOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CisJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOworCXJldHVybiBjcmVhdGVfbmV3X2VudHJ5KGZjLCByZXEsIGRpciwgZW50cnksIG1vZGUpOworfQorCitzdGF0aWMgaW50IGZ1c2VfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgaW50IG1vZGUsCisJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZnVzZV9ta25vZChkaXIsIGVudHJ5LCBtb2RlLCAwKTsKK30KKworc3RhdGljIGludCBmdXNlX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGZ1c2VfbWtkaXJfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLm1vZGUgPSBtb2RlOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX01LRElSOworCXJlcS0+aW4ubnVtYXJncyA9IDI7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKKwlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7CisJcmV0dXJuIGNyZWF0ZV9uZXdfZW50cnkoZmMsIHJlcSwgZGlyLCBlbnRyeSwgU19JRkRJUik7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCWNvbnN0IGNoYXIgKmxpbmspCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGRpcik7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKGxpbmspICsgMTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKworCWlmIChsZW4gPiBGVVNFX1NZTUxJTktfTUFYKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfU1lNTElOSzsKKwlyZXEtPmluLm51bWFyZ3MgPSAyOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGxlbjsKKwlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBsaW5rOworCXJldHVybiBjcmVhdGVfbmV3X2VudHJ5KGZjLCByZXEsIGRpciwgZW50cnksIFNfSUZMTkspOworfQorCitzdGF0aWMgaW50IGZ1c2VfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9VTkxJTks7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7CisJcmVxLT5pbm9kZSA9IGRpcjsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKworCQkvKiBTZXQgbmxpbmsgdG8gemVybyBzbyB0aGUgaW5vZGUgY2FuIGJlIGNsZWFyZWQsIGlmCisgICAgICAgICAgICAgICAgICAgdGhlIGlub2RlIGRvZXMgaGF2ZSBtb3JlIGxpbmtzIHRoaXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyZWQgYXQgdGhlIG5leHQgbG9va3VwL2dldGF0dHIgKi8KKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CisJfSBlbHNlIGlmIChlcnIgPT0gLUVJTlRSKQorCQlmdXNlX2ludmFsaWRhdGVfZW50cnkoZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZW50cnkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oZGlyKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfUk1ESVI7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7CisJcmVxLT5pbm9kZSA9IGRpcjsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCWVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gMDsKKwkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoZGlyKTsKKwl9IGVsc2UgaWYgKGVyciA9PSAtRUlOVFIpCisJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeShlbnRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmdXNlX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZGRpciwgc3RydWN0IGRlbnRyeSAqb2xkZW50LAorCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdkaXIsIHN0cnVjdCBkZW50cnkgKm5ld2VudCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX3JlbmFtZV9pbiBpbmFyZzsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4ob2xkZGlyKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcubmV3ZGlyID0gZ2V0X25vZGVfaWQobmV3ZGlyKTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRU5BTUU7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKG9sZGRpcik7CisJcmVxLT5pbm9kZSA9IG9sZGRpcjsKKwlyZXEtPmlub2RlMiA9IG5ld2RpcjsKKwlyZXEtPmluLm51bWFyZ3MgPSAzOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBvbGRlbnQtPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1sxXS52YWx1ZSA9IG9sZGVudC0+ZF9uYW1lLm5hbWU7CisJcmVxLT5pbi5hcmdzWzJdLnNpemUgPSBuZXdlbnQtPmRfbmFtZS5sZW4gKyAxOworCXJlcS0+aW4uYXJnc1syXS52YWx1ZSA9IG5ld2VudC0+ZF9uYW1lLm5hbWU7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoIWVycikgeworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihvbGRkaXIpOworCQlpZiAob2xkZGlyICE9IG5ld2RpcikKKwkJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKG5ld2Rpcik7CisJfSBlbHNlIGlmIChlcnIgPT0gLUVJTlRSKSB7CisJCS8qIElmIHJlcXVlc3Qgd2FzIGludGVycnVwdGVkLCBERUlUWSBvbmx5IGtub3dzIGlmIHRoZQorCQkgICByZW5hbWUgYWN0dWFsbHkgdG9vayBwbGFjZS4gIElmIHRoZSBpbnZhbGlkYXRpb24KKwkJICAgZmFpbHMgKGUuZy4gc29tZSBwcm9jZXNzIGhhcyBDV0QgdW5kZXIgdGhlIHJlbmFtZWQKKwkJICAgZGlyZWN0b3J5KSwgdGhlbiB0aGVyZSBjYW4gYmUgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuCisJCSAgIHRoZSBkY2FjaGUgYW5kIHRoZSByZWFsIGZpbGVzeXN0ZW0uICBUb3VnaCBsdWNrLiAqLworCQlmdXNlX2ludmFsaWRhdGVfZW50cnkob2xkZW50KTsKKwkJaWYgKG5ld2VudC0+ZF9pbm9kZSkKKwkJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeShuZXdlbnQpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9saW5rKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaW5vZGUgKm5ld2RpciwKKwkJICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdlbnQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9saW5rX2luIGluYXJnOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5vbGRub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfTElOSzsKKwlyZXEtPmlub2RlMiA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDI7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IG5ld2VudC0+ZF9uYW1lLmxlbiArIDE7CisJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmV3ZW50LT5kX25hbWUubmFtZTsKKwllcnIgPSBjcmVhdGVfbmV3X2VudHJ5KGZjLCByZXEsIG5ld2RpciwgbmV3ZW50LCBpbm9kZS0+aV9tb2RlKTsKKwkvKiBDb250cmFyeSB0byAibm9ybWFsIiBmaWxlc3lzdGVtcyBpdCBjYW4gaGFwcGVuIHRoYXQgbGluaworCSAgIG1ha2VzIHR3byAibG9naWNhbCIgaW5vZGVzIHBvaW50IHRvIHRoZSBzYW1lICJwaHlzaWNhbCIKKwkgICBpbm9kZS4gIFdlIGludmFsaWRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG9sZCBvbmUsIHNvIGl0CisJICAgd2lsbCByZWZsZWN0IGNoYW5nZXMgaW4gdGhlIGJhY2tpbmcgaW5vZGUgKGxpbmsgY291bnQsCisJICAgZXRjLikKKwkqLworCWlmICghZXJyIHx8IGVyciA9PSAtRUlOVFIpCisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZnVzZV9kb19nZXRhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9hdHRyX291dCBhcmc7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfR0VUQVRUUjsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2YoYXJnKTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJmFyZzsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCWlmICgoaW5vZGUtPmlfbW9kZSBeIGFyZy5hdHRyLm1vZGUpICYgU19JRk1UKSB7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQllcnIgPSAtRUlPOworCQl9IGVsc2UgeworCQkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCQkJZnVzZV9jaGFuZ2VfYXR0cmlidXRlcyhpbm9kZSwgJmFyZy5hdHRyKTsKKwkJCWZpLT5pX3RpbWUgPSB0aW1lX3RvX2ppZmZpZXMoYXJnLmF0dHJfdmFsaWQsCisJCQkJCQkgICAgIGFyZy5hdHRyX3ZhbGlkX25zZWMpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsaW5nIGludG8gYSB1c2VyLWNvbnRyb2xsZWQgZmlsZXN5c3RlbSBnaXZlcyB0aGUgZmlsZXN5c3RlbQorICogZGFlbW9uIHB0cmFjZS1saWtlIGNhcGFiaWxpdGllcyBvdmVyIHRoZSByZXF1ZXN0ZXIgcHJvY2Vzcy4gIFRoaXMKKyAqIG1lYW5zLCB0aGF0IHRoZSBmaWxlc3lzdGVtIGRhZW1vbiBpcyBhYmxlIHRvIHJlY29yZCB0aGUgZXhhY3QKKyAqIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBwZXJmb3JtZWQsIGFuZCBjYW4gYWxzbyBjb250cm9sIHRoZSBiZWhhdmlvcgorICogb2YgdGhlIHJlcXVlc3RlciBwcm9jZXNzIGluIG90aGVyd2lzZSBpbXBvc3NpYmxlIHdheXMuICBGb3IgZXhhbXBsZQorICogaXQgY2FuIGRlbGF5IHRoZSBvcGVyYXRpb24gZm9yIGFyYml0cmFyeSBsZW5ndGggb2YgdGltZSBhbGxvd2luZworICogRG9TIGFnYWluc3QgdGhlIHJlcXVlc3Rlci4KKyAqCisgKiBGb3IgdGhpcyByZWFzb24gb25seSB0aG9zZSBwcm9jZXNzZXMgY2FuIGNhbGwgaW50byB0aGUgZmlsZXN5c3RlbSwKKyAqIGZvciB3aGljaCB0aGUgb3duZXIgb2YgdGhlIG1vdW50IGhhcyBwdHJhY2UgcHJpdmlsZWdlLiAgVGhpcworICogZXhjbHVkZXMgcHJvY2Vzc2VzIHN0YXJ0ZWQgYnkgb3RoZXIgdXNlcnMsIHN1aWQgb3Igc2dpZCBwcm9jZXNzZXMuCisgKi8KK3N0YXRpYyBpbnQgZnVzZV9hbGxvd190YXNrKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaWYgKGZjLT5mbGFncyAmIEZVU0VfQUxMT1dfT1RIRVIpCisJCXJldHVybiAxOworCisJaWYgKHRhc2stPmV1aWQgPT0gZmMtPnVzZXJfaWQgJiYKKwkgICAgdGFzay0+c3VpZCA9PSBmYy0+dXNlcl9pZCAmJgorCSAgICB0YXNrLT51aWQgPT0gZmMtPnVzZXJfaWQgJiYKKwkgICAgdGFzay0+ZWdpZCA9PSBmYy0+Z3JvdXBfaWQgJiYKKwkgICAgdGFzay0+c2dpZCA9PSBmYy0+Z3JvdXBfaWQgJiYKKwkgICAgdGFzay0+Z2lkID09IGZjLT5ncm91cF9pZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCisJaWYgKCFmdXNlX2FsbG93X3Rhc2soZmMsIGN1cnJlbnQpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAoZ2V0X25vZGVfaWQoaW5vZGUpICE9IEZVU0VfUk9PVF9JRCAmJgorCSAgICB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBmaS0+aV90aW1lKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZnVzZV9kb19nZXRhdHRyKGlub2RlKTsKK30KKworc3RhdGljIGludCBmdXNlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisKKwlpZiAoIWZ1c2VfYWxsb3dfdGFzayhmYywgY3VycmVudCkpCisJCXJldHVybiAtRUFDQ0VTOworCWVsc2UgaWYgKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykgeworCQlpbnQgZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKKworCQkvKiBJZiBwZXJtaXNzaW9uIGlzIGRlbmllZCwgdHJ5IHRvIHJlZnJlc2ggZmlsZQorCQkgICBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBhbHNvIG5lZWRlZCwgYmVjYXVzZSB0aGUgcm9vdAorCQkgICBub2RlIHdpbGwgYXQgZmlyc3QgaGF2ZSBubyBwZXJtaXNzaW9ucyAqLworCQlpZiAoZXJyID09IC1FQUNDRVMpIHsKKwkJIAllcnIgPSBmdXNlX2RvX2dldGF0dHIoaW5vZGUpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKKwkJfQorCisJCS8qIEZJWE1FOiBOZWVkIHNvbWUgbWVjaGFuaXNtIHRvIHJldm9rZSBwZXJtaXNzaW9uczoKKwkJICAgY3VycmVudGx5IGlmIHRoZSBmaWxlc3lzdGVtIHN1ZGRlbmx5IGNoYW5nZXMgdGhlCisJCSAgIGZpbGUgbW9kZSwgd2Ugd2lsbCBub3QgYmUgaW5mb3JtZWQgYWJvdXQgaXQsIGFuZAorCQkgICBjb250aW51ZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGZpbGUvZGlyZWN0b3J5LgorCisJCSAgIFRoaXMgaXMgYWN0dWFsbHkgbm90IHNvIGdyYXZlLCBzaW5jZSB0aGUgdXNlciBjYW4KKwkJICAgc2ltcGx5IGtlZXAgYWNjZXNzIHRvIHRoZSBmaWxlL2RpcmVjdG9yeSBhbnl3YXkgYnkKKwkJICAga2VlcGluZyBpdCBvcGVuLi4uICovCisKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlpbnQgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCWlmICgobWFzayAmIE1BWV9XUklURSkgJiYgSVNfUkRPTkxZKGlub2RlKSAmJgorICAgICAgICAgICAgICAgICAgICAoU19JU1JFRyhtb2RlKSB8fCBTX0lTRElSKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUk9GUzsKKwkJaWYgKChtYXNrICYgTUFZX0VYRUMpICYmICFTX0lTRElSKG1vZGUpICYmICEobW9kZSAmIFNfSVhVR08pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBwYXJzZV9kaXJmaWxlKGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdm9pZCAqZHN0YnVmLCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl3aGlsZSAobmJ5dGVzID49IEZVU0VfTkFNRV9PRkZTRVQpIHsKKwkJc3RydWN0IGZ1c2VfZGlyZW50ICpkaXJlbnQgPSAoc3RydWN0IGZ1c2VfZGlyZW50ICopIGJ1ZjsKKwkJc2l6ZV90IHJlY2xlbiA9IEZVU0VfRElSRU5UX1NJWkUoZGlyZW50KTsKKwkJaW50IG92ZXI7CisJCWlmICghZGlyZW50LT5uYW1lbGVuIHx8IGRpcmVudC0+bmFtZWxlbiA+IEZVU0VfTkFNRV9NQVgpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKHJlY2xlbiA+IG5ieXRlcykKKwkJCWJyZWFrOworCisJCW92ZXIgPSBmaWxsZGlyKGRzdGJ1ZiwgZGlyZW50LT5uYW1lLCBkaXJlbnQtPm5hbWVsZW4sCisJCQkgICAgICAgZmlsZS0+Zl9wb3MsIGRpcmVudC0+aW5vLCBkaXJlbnQtPnR5cGUpOworCQlpZiAob3ZlcikKKwkJCWJyZWFrOworCisJCWJ1ZiArPSByZWNsZW47CisJCW5ieXRlcyAtPSByZWNsZW47CisJCWZpbGUtPmZfcG9zID0gZGlyZW50LT5vZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkZGlyKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywKKwkJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBmdXNlX3NlbmRfcmVhZF9jb21tb24ocmVxLCBmaWxlLCBpbm9kZSwgcG9zLCBjb3VudCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkc3RidWYsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCBlcnI7CisJc2l6ZV90IG5ieXRlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKSB7CisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXEtPm51bV9wYWdlcyA9IDE7CisJcmVxLT5wYWdlc1swXSA9IHBhZ2U7CisJbmJ5dGVzID0gZnVzZV9zZW5kX3JlYWRkaXIocmVxLCBmaWxlLCBpbm9kZSwgZmlsZS0+Zl9wb3MsIFBBR0VfU0laRSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKQorCQllcnIgPSBwYXJzZV9kaXJmaWxlKHBhZ2VfYWRkcmVzcyhwYWdlKSwgbmJ5dGVzLCBmaWxlLCBkc3RidWYsCisJCQkJICAgIGZpbGxkaXIpOworCisJX19mcmVlX3BhZ2UocGFnZSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOyAvKiBhdGltZSBjaGFuZ2VkICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNoYXIgKnJlYWRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJY2hhciAqbGluazsKKworCWlmICghcmVxKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOworCisJbGluayA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspIHsKKwkJbGluayA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRUFETElOSzsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPm91dC5hcmd2YXIgPSAxOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IFBBR0VfU0laRSAtIDE7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9IGxpbms7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWlmIChyZXEtPm91dC5oLmVycm9yKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgbGluayk7CisJCWxpbmsgPSBFUlJfUFRSKHJlcS0+b3V0LmguZXJyb3IpOworCX0gZWxzZQorCQlsaW5rW3JlcS0+b3V0LmFyZ3NbMF0uc2l6ZV0gPSAnXDAnOworIG91dDoKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsgLyogYXRpbWUgY2hhbmdlZCAqLworCXJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2xpbmsoY2hhciAqbGluaykKK3sKKwlpZiAoIUlTX0VSUihsaW5rKSkKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBsaW5rKTsKK30KKworc3RhdGljIHZvaWQgKmZ1c2VfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwluZF9zZXRfbGluayhuZCwgcmVhZF9saW5rKGRlbnRyeSkpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmdXNlX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKmMpCit7CisJZnJlZV9saW5rKG5kX2dldF9saW5rKG5kKSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZnVzZV9vcGVuX2NvbW1vbihpbm9kZSwgZmlsZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZnVzZV9yZWxlYXNlX2NvbW1vbihpbm9kZSwgZmlsZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgZGF0YXN5bmMpCit7CisJLyogbmZzZCBjYW4gY2FsbCB0aGlzIHdpdGggbm8gZmlsZSAqLworCXJldHVybiBmaWxlID8gZnVzZV9mc3luY19jb21tb24oZmlsZSwgZGUsIGRhdGFzeW5jLCAxKSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpYXR0cl90b19mYXR0cihzdHJ1Y3QgaWF0dHIgKmlhdHRyLCBzdHJ1Y3QgZnVzZV9hdHRyICpmYXR0cikKK3sKKwl1bnNpZ25lZCBpdmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7CisJdW5zaWduZWQgZnZhbGlkID0gMDsKKworCW1lbXNldChmYXR0ciwgMCwgc2l6ZW9mKCpmYXR0cikpOworCisJaWYgKGl2YWxpZCAmIEFUVFJfTU9ERSkKKwkJZnZhbGlkIHw9IEZBVFRSX01PREUsICAgZmF0dHItPm1vZGUgPSBpYXR0ci0+aWFfbW9kZTsKKwlpZiAoaXZhbGlkICYgQVRUUl9VSUQpCisJCWZ2YWxpZCB8PSBGQVRUUl9VSUQsICAgIGZhdHRyLT51aWQgPSBpYXR0ci0+aWFfdWlkOworCWlmIChpdmFsaWQgJiBBVFRSX0dJRCkKKwkJZnZhbGlkIHw9IEZBVFRSX0dJRCwgICAgZmF0dHItPmdpZCA9IGlhdHRyLT5pYV9naWQ7CisJaWYgKGl2YWxpZCAmIEFUVFJfU0laRSkKKwkJZnZhbGlkIHw9IEZBVFRSX1NJWkUsICAgZmF0dHItPnNpemUgPSBpYXR0ci0+aWFfc2l6ZTsKKwkvKiBZb3UgY2FuIG9ubHkgX3NldF8gdGhlc2UgdG9nZXRoZXIgKHRoZXkgbWF5IGNoYW5nZSBieSB0aGVtc2VsdmVzKSAqLworCWlmICgoaXZhbGlkICYgKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FKSkgPT0gKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FKSkgeworCQlmdmFsaWQgfD0gRkFUVFJfQVRJTUUgfCBGQVRUUl9NVElNRTsKKwkJZmF0dHItPmF0aW1lID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKKwkJZmF0dHItPm10aW1lID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKwl9CisKKwlyZXR1cm4gZnZhbGlkOworfQorCitzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9zZXRhdHRyX2luIGluYXJnOworCXN0cnVjdCBmdXNlX2F0dHJfb3V0IG91dGFyZzsKKwlpbnQgZXJyOworCWludCBpc190cnVuY2F0ZSA9IDA7CisKKwlpZiAoZmMtPmZsYWdzICYgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TKSB7CisJCWVyciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIGxpbWl0OworCQlpc190cnVuY2F0ZSA9IDE7CisJCWxpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9GU0laRV0ucmxpbV9jdXI7CisJCWlmIChsaW1pdCAhPSBSTElNX0lORklOSVRZICYmIGF0dHItPmlhX3NpemUgPiAobG9mZl90KSBsaW1pdCkgeworCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gLUVGQklHOworCQl9CisJfQorCisJcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy52YWxpZCA9IGlhdHRyX3RvX2ZhdHRyKGF0dHIsICZpbmFyZy5hdHRyKTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9TRVRBVFRSOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKSB7CisJCWlmICgoaW5vZGUtPmlfbW9kZSBeIG91dGFyZy5hdHRyLm1vZGUpICYgU19JRk1UKSB7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQllcnIgPSAtRUlPOworCQl9IGVsc2UgeworCQkJaWYgKGlzX3RydW5jYXRlKSB7CisJCQkJbG9mZl90IG9yaWdzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgb3V0YXJnLmF0dHIuc2l6ZSk7CisJCQkJaWYgKG9yaWdzaXplID4gb3V0YXJnLmF0dHIuc2l6ZSkKKwkJCQkJdm10cnVuY2F0ZShpbm9kZSwgb3V0YXJnLmF0dHIuc2l6ZSk7CisJCQl9CisJCQlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCAmb3V0YXJnLmF0dHIpOworCQkJZmktPmlfdGltZSA9IHRpbWVfdG9famlmZmllcyhvdXRhcmcuYXR0cl92YWxpZCwKKwkJCQkJCSAgICAgb3V0YXJnLmF0dHJfdmFsaWRfbnNlYyk7CisJCX0KKwl9IGVsc2UgaWYgKGVyciA9PSAtRUlOVFIpCisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCXN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPmRfaW5vZGU7CisJaW50IGVyciA9IGZ1c2VfcmV2YWxpZGF0ZShlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmZ1c2VfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKKwkJCQkgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVyciA9IGZ1c2VfbG9va3VwX2lnZXQoZGlyLCBlbnRyeSwgJmlub2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCS8qIERvbid0IGFsbG93IGNyZWF0aW5nIGFuIGFsaWFzIHRvIGEgZGlyZWN0b3J5ICAqLworCQlzdHJ1Y3QgZGVudHJ5ICphbGlhcyA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJCWlmIChhbGlhcyAmJiAhKGFsaWFzLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCWRwdXQoYWxpYXMpOworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJfQorCX0KKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGVudHJ5KTsKK30KKworc3RhdGljIGludCBmdXNlX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX3NldHhhdHRyX2luIGluYXJnOworCWludCBlcnI7CisKKwlpZiAoc2l6ZSA+IEZVU0VfWEFUVFJfU0laRV9NQVgpCisJCXJldHVybiAtRTJCSUc7CisKKwlpZiAoZmMtPm5vX3NldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLnNpemUgPSBzaXplOworCWluYXJnLmZsYWdzID0gZmxhZ3M7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfU0VUWEFUVFI7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5pbi5udW1hcmdzID0gMzsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcS0+aW4uYXJnc1sxXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKKwlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBuYW1lOworCXJlcS0+aW4uYXJnc1syXS5zaXplID0gc2l6ZTsKKwlyZXEtPmluLmFyZ3NbMl0udmFsdWUgPSB2YWx1ZTsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmIChlcnIgPT0gLUVOT1NZUykgeworCQlmYy0+bm9fc2V0eGF0dHIgPSAxOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgZnVzZV9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX2luIGluYXJnOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX291dCBvdXRhcmc7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoZmMtPm5vX2dldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLnNpemUgPSBzaXplOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0dFVFhBVFRSOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDI7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CisJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKKwkvKiBUaGlzIGlzIHJlYWxseSB0d28gZGlmZmVyZW50IG9wZXJhdGlvbnMgcm9sbGVkIGludG8gb25lICovCisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJaWYgKHNpemUpIHsKKwkJcmVxLT5vdXQuYXJndmFyID0gMTsKKwkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZTsKKwkJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9IHZhbHVlOworCX0gZWxzZSB7CisJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwl9CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CisJaWYgKCFyZXQpCisJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKKwllbHNlIHsKKwkJaWYgKHJldCA9PSAtRU5PU1lTKSB7CisJCQlmYy0+bm9fZ2V0eGF0dHIgPSAxOworCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCX0KKwl9CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBmdXNlX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2VfZ2V0eGF0dHJfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfZ2V0eGF0dHJfb3V0IG91dGFyZzsKKwlzc2l6ZV90IHJldDsKKworCWlmIChmYy0+bm9fbGlzdHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLnNpemUgPSBzaXplOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0xJU1RYQVRUUjsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJLyogVGhpcyBpcyByZWFsbHkgdHdvIGRpZmZlcmVudCBvcGVyYXRpb25zIHJvbGxlZCBpbnRvIG9uZSAqLworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCWlmIChzaXplKSB7CisJCXJlcS0+b3V0LmFyZ3ZhciA9IDE7CisJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemU7CisJCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBsaXN0OworCX0gZWxzZSB7CisJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwl9CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CisJaWYgKCFyZXQpCisJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKKwllbHNlIHsKKwkJaWYgKHJldCA9PSAtRU5PU1lTKSB7CisJCQlmYy0+bm9fbGlzdHhhdHRyID0gMTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQl9CisJfQorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdXNlX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3JlbW92ZXhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1JFTU9WRVhBVFRSOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IG5hbWU7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3JlbW92ZXhhdHRyID0gMTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBmdXNlX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gZnVzZV9sb29rdXAsCisJLm1rZGlyCQk9IGZ1c2VfbWtkaXIsCisJLnN5bWxpbmsJPSBmdXNlX3N5bWxpbmssCisJLnVubGluawkJPSBmdXNlX3VubGluaywKKwkucm1kaXIJCT0gZnVzZV9ybWRpciwKKwkucmVuYW1lCQk9IGZ1c2VfcmVuYW1lLAorCS5saW5rCQk9IGZ1c2VfbGluaywKKwkuc2V0YXR0cgk9IGZ1c2Vfc2V0YXR0ciwKKwkuY3JlYXRlCQk9IGZ1c2VfY3JlYXRlLAorCS5ta25vZAkJPSBmdXNlX21rbm9kLAorCS5wZXJtaXNzaW9uCT0gZnVzZV9wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gZnVzZV9nZXRhdHRyLAorCS5zZXR4YXR0cgk9IGZ1c2Vfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZnVzZV9nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZnVzZV9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZnVzZV9yZW1vdmV4YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBmdXNlX3JlYWRkaXIsCisJLm9wZW4JCT0gZnVzZV9kaXJfb3BlbiwKKwkucmVsZWFzZQk9IGZ1c2VfZGlyX3JlbGVhc2UsCisJLmZzeW5jCQk9IGZ1c2VfZGlyX2ZzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZ1c2VfY29tbW9uX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnNldGF0dHIJPSBmdXNlX3NldGF0dHIsCisJLnBlcm1pc3Npb24JPSBmdXNlX3Blcm1pc3Npb24sCisJLmdldGF0dHIJPSBmdXNlX2dldGF0dHIsCisJLnNldHhhdHRyCT0gZnVzZV9zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBmdXNlX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBmdXNlX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBmdXNlX3JlbW92ZXhhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZ1c2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5zZXRhdHRyCT0gZnVzZV9zZXRhdHRyLAorCS5mb2xsb3dfbGluawk9IGZ1c2VfZm9sbG93X2xpbmssCisJLnB1dF9saW5rCT0gZnVzZV9wdXRfbGluaywKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5nZXRhdHRyCT0gZnVzZV9nZXRhdHRyLAorCS5zZXR4YXR0cgk9IGZ1c2Vfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZnVzZV9nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZnVzZV9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZnVzZV9yZW1vdmV4YXR0ciwKK307CisKK3ZvaWQgZnVzZV9pbml0X2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX29wID0gJmZ1c2VfY29tbW9uX2lub2RlX29wZXJhdGlvbnM7Cit9CisKK3ZvaWQgZnVzZV9pbml0X2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX29wID0gJmZ1c2VfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJmZ1c2VfZGlyX29wZXJhdGlvbnM7Cit9CisKK3ZvaWQgZnVzZV9pbml0X3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9vcCA9ICZmdXNlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK30KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1NDAyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorCisgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKyNpbmNsdWRlICJmdXNlX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9uczsKKworaW50IGZ1c2Vfb3Blbl9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2RpcikKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX29wZW5faW4gaW5hcmc7CisJc3RydWN0IGZ1c2Vfb3Blbl9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmOworCWludCBlcnI7CisKKwllcnIgPSBnZW5lcmljX2ZpbGVfb3Blbihpbm9kZSwgZmlsZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIG9wZW5pbmcgdGhlIHJvb3Qgbm9kZSwgbm8gbG9va3VwIGhhcyBiZWVuIHBlcmZvcm1lZCBvbgorCSAgIGl0LCBzbyB0aGUgYXR0cmlidXRlcyBtdXN0IGJlIHJlZnJlc2hlZCAqLworCWlmIChnZXRfbm9kZV9pZChpbm9kZSkgPT0gRlVTRV9ST09UX0lEKSB7CisJCWludCBlcnIgPSBmdXNlX2RvX2dldGF0dHIoaW5vZGUpOworCQlpZiAoZXJyKQorCQkgCXJldHVybiBlcnI7CisJfQorCisJcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwllcnIgPSAtRU5PTUVNOworCWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZmlsZSksIEdGUF9LRVJORUwpOworCWlmICghZmYpCisJCWdvdG8gb3V0X3B1dF9yZXF1ZXN0OworCisJZmYtPnJlbGVhc2VfcmVxID0gZnVzZV9yZXF1ZXN0X2FsbG9jKCk7CisJaWYgKCFmZi0+cmVsZWFzZV9yZXEpIHsKKwkJa2ZyZWUoZmYpOworCQlnb3RvIG91dF9wdXRfcmVxdWVzdDsKKwl9CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5mbGFncyA9IGZpbGUtPmZfZmxhZ3MgJiB+KE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PQ1RUWSB8IE9fVFJVTkMpOworCXJlcS0+aW4uaC5vcGNvZGUgPSBpc2RpciA/IEZVU0VfT1BFTkRJUiA6IEZVU0VfT1BFTjsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW5vZGUgPSBpbm9kZTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJaWYgKGVycikgeworCQlmdXNlX3JlcXVlc3RfZnJlZShmZi0+cmVsZWFzZV9yZXEpOworCQlrZnJlZShmZik7CisJfSBlbHNlIHsKKwkJaWYgKCFpc2RpciAmJiAob3V0YXJnLm9wZW5fZmxhZ3MgJiBGT1BFTl9ESVJFQ1RfSU8pKQorCQkJZmlsZS0+Zl9vcCA9ICZmdXNlX2RpcmVjdF9pb19maWxlX29wZXJhdGlvbnM7CisJCWlmICghKG91dGFyZy5vcGVuX2ZsYWdzICYgRk9QRU5fS0VFUF9DQUNIRSkpCisJCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcpOworCQlmZi0+ZmggPSBvdXRhcmcuZmg7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZmOworCX0KKworIG91dF9wdXRfcmVxdWVzdDoKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBmdXNlX3JlbGVhc2VfY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZmLT5yZWxlYXNlX3JlcTsKKwlzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luICppbmFyZyA9ICZyZXEtPm1pc2MucmVsZWFzZV9pbjsKKworCWluYXJnLT5maCA9IGZmLT5maDsKKwlpbmFyZy0+ZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzICYgfk9fRVhDTDsKKwlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX1JFTEVBU0VESVIgOiBGVVNFX1JFTEVBU0U7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKKwlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKKwlrZnJlZShmZik7CisKKwkvKiBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZCBieSBWRlMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGZ1c2Vfb3Blbl9jb21tb24oaW5vZGUsIGZpbGUsIDApOworfQorCitzdGF0aWMgaW50IGZ1c2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gZnVzZV9yZWxlYXNlX2NvbW1vbihpbm9kZSwgZmlsZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9mbHVzaF9pbiBpbmFyZzsKKwlpbnQgZXJyOworCisJaWYgKGZjLT5ub19mbHVzaCkKKwkJcmV0dXJuIDA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOworCWluYXJnLmZoID0gZmYtPmZoOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0ZMVVNIOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+ZmlsZSA9IGZpbGU7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciA9PSAtRU5PU1lTKSB7CisJCWZjLT5ub19mbHVzaCA9IDE7CisJCWVyciA9IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK2ludCBmdXNlX2ZzeW5jX2NvbW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGUsIGludCBkYXRhc3luYywKKwkJICAgICAgaW50IGlzZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2ZzeW5jX2luIGluYXJnOworCWludCBlcnI7CisKKwlpZiAoKCFpc2RpciAmJiBmYy0+bm9fZnN5bmMpIHx8IChpc2RpciAmJiBmYy0+bm9fZnN5bmNkaXIpKQorCQlyZXR1cm4gMDsKKworCXJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcuZmggPSBmZi0+Zmg7CisJaW5hcmcuZnN5bmNfZmxhZ3MgPSBkYXRhc3luYyA/IDEgOiAwOworCXJlcS0+aW4uaC5vcGNvZGUgPSBpc2RpciA/IEZVU0VfRlNZTkNESVIgOiBGVVNFX0ZTWU5DOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbm9kZSA9IGlub2RlOworCXJlcS0+ZmlsZSA9IGZpbGU7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciA9PSAtRU5PU1lTKSB7CisJCWlmIChpc2RpcikKKwkJCWZjLT5ub19mc3luY2RpciA9IDE7CisJCWVsc2UKKwkJCWZjLT5ub19mc3luYyA9IDE7CisJCWVyciA9IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGUsIGludCBkYXRhc3luYykKK3sKKwlyZXR1cm4gZnVzZV9mc3luY19jb21tb24oZmlsZSwgZGUsIGRhdGFzeW5jLCAwKTsKK30KKworc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgaW50IGlzZGlyKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZ1c2VfcmVhZF9pbiBpbmFyZzsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV9yZWFkX2luKSk7CisJaW5hcmcuZmggPSBmZi0+Zmg7CisJaW5hcmcub2Zmc2V0ID0gcG9zOworCWluYXJnLnNpemUgPSBjb3VudDsKKwlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX1JFQURESVIgOiBGVVNFX1JFQUQ7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5maWxlID0gZmlsZTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX3JlYWRfaW4pOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPm91dC5hcmdwYWdlcyA9IDE7CisJcmVxLT5vdXQuYXJndmFyID0gMTsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBjb3VudDsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJcmV0dXJuIHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgZnVzZV9zZW5kX3JlYWQoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLAorCQkJCSAgICBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihyZXEsIGZpbGUsIGlub2RlLCBwb3MsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGludCBmdXNlX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWxvZmZfdCBwb3MgPSAobG9mZl90KSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaW50IGVyciA9IC1FSU5UUjsKKwlpZiAoIXJlcSkKKwkJZ290byBvdXQ7CisKKwlyZXEtPm91dC5wYWdlX3plcm9pbmcgPSAxOworCXJlcS0+bnVtX3BhZ2VzID0gMTsKKwlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKKwlmdXNlX3NlbmRfcmVhZChyZXEsIGZpbGUsIGlub2RlLCBwb3MsIFBBR0VfQ0FDSEVfU0laRSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOyAvKiBhdGltZSBjaGFuZ2VkICovCisgb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9zZW5kX3JlYWRwYWdlcyhzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlsb2ZmX3QgcG9zID0gKGxvZmZfdCkgcmVxLT5wYWdlc1swXS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlzaXplX3QgY291bnQgPSByZXEtPm51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGk7CisJcmVxLT5vdXQucGFnZV96ZXJvaW5nID0gMTsKKwlmdXNlX3NlbmRfcmVhZChyZXEsIGZpbGUsIGlub2RlLCBwb3MsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVxLT5udW1fcGFnZXM7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+cGFnZXNbaV07CisJCWlmICghcmVxLT5vdXQuaC5lcnJvcikKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXJldHVybiByZXEtPm91dC5oLmVycm9yOworfQorCitzdHJ1Y3QgZnVzZV9yZWFkcGFnZXNfZGF0YSB7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKK307CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkcGFnZXNfZmlsbCh2b2lkICpfZGF0YSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGZ1c2VfcmVhZHBhZ2VzX2RhdGEgKmRhdGEgPSBfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGRhdGEtPnJlcTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YS0+aW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKworCWlmIChyZXEtPm51bV9wYWdlcyAmJgorCSAgICAocmVxLT5udW1fcGFnZXMgPT0gRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSB8fAorCSAgICAgKHJlcS0+bnVtX3BhZ2VzICsgMSkgKiBQQUdFX0NBQ0hFX1NJWkUgPiBmYy0+bWF4X3JlYWQgfHwKKwkgICAgIHJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXMgLSAxXS0+aW5kZXggKyAxICE9IHBhZ2UtPmluZGV4KSkgeworCQlpbnQgZXJyID0gZnVzZV9zZW5kX3JlYWRwYWdlcyhyZXEsIGRhdGEtPmZpbGUsIGlub2RlKTsKKwkJaWYgKGVycikgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWZ1c2VfcmVzZXRfcmVxdWVzdChyZXEpOworCX0KKwlyZXEtPnBhZ2VzW3JlcS0+bnVtX3BhZ2VzXSA9IHBhZ2U7CisJcmVxLT5udW1fcGFnZXMgKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZWFkcGFnZXNfZGF0YSBkYXRhOworCWludCBlcnI7CisJZGF0YS5maWxlID0gZmlsZTsKKwlkYXRhLmlub2RlID0gaW5vZGU7CisJZGF0YS5yZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIWRhdGEucmVxKQorCQlyZXR1cm4gLUVJTlRSOworCisJZXJyID0gcmVhZF9jYWNoZV9wYWdlcyhtYXBwaW5nLCBwYWdlcywgZnVzZV9yZWFkcGFnZXNfZmlsbCwgJmRhdGEpOworCWlmICghZXJyICYmIGRhdGEucmVxLT5udW1fcGFnZXMpCisJCWVyciA9IGZ1c2Vfc2VuZF9yZWFkcGFnZXMoZGF0YS5yZXEsIGZpbGUsIGlub2RlKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBkYXRhLnJlcSk7CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOyAvKiBhdGltZSBjaGFuZ2VkICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNpemVfdCBmdXNlX3NlbmRfd3JpdGUoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZ1c2Vfd3JpdGVfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2Vfd3JpdGVfb3V0IG91dGFyZzsKKworCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV93cml0ZV9pbikpOworCWluYXJnLmZoID0gZmYtPmZoOworCWluYXJnLm9mZnNldCA9IHBvczsKKwlpbmFyZy5zaXplID0gY291bnQ7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfV1JJVEU7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmlub2RlID0gaW5vZGU7CisJcmVxLT5maWxlID0gZmlsZTsKKwlyZXEtPmluLmFyZ3BhZ2VzID0gMTsKKwlyZXEtPmluLm51bWFyZ3MgPSAyOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX3dyaXRlX2luKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBjb3VudDsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2Vfd3JpdGVfb3V0KTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJcmV0dXJuIG91dGFyZy5zaXplOworfQorCitzdGF0aWMgaW50IGZ1c2VfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCS8qIE5vIG9wICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCWludCBlcnI7CisJc2l6ZV90IG5yZXM7CisJdW5zaWduZWQgY291bnQgPSB0byAtIG9mZnNldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWxvZmZfdCBwb3MgPSAoKGxvZmZfdCkgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZmZzZXQ7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJlcS0+bnVtX3BhZ2VzID0gMTsKKwlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKKwlyZXEtPnBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OworCW5yZXMgPSBmdXNlX3NlbmRfd3JpdGUocmVxLCBmaWxlLCBpbm9kZSwgcG9zLCBjb3VudCk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWlmICghZXJyICYmIG5yZXMgIT0gY291bnQpCisJCWVyciA9IC1FSU87CisJaWYgKCFlcnIpIHsKKwkJcG9zICs9IGNvdW50OworCQlpZiAocG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCisJCWlmIChvZmZzZXQgPT0gMCAmJiB0byA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0KKwl9CisJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfcmVsZWFzZV91c2VyX3BhZ2VzKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBpbnQgd3JpdGUpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByZXEtPm51bV9wYWdlczsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKKwkJaWYgKHdyaXRlKQorCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJfQorfQorCitzdGF0aWMgaW50IGZ1c2VfZ2V0X3VzZXJfcGFnZXMoc3RydWN0IGZ1c2VfcmVxICpyZXEsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgdW5zaWduZWQgbmJ5dGVzLCBpbnQgd3JpdGUpCit7CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYnVmOworCXVuc2lnbmVkIG9mZnNldCA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7CisJaW50IG5wYWdlczsKKworCS8qIFRoaXMgZG9lc24ndCB3b3JrIHdpdGggbmZzZCAqLworCWlmICghY3VycmVudC0+bW0pCisJCXJldHVybiAtRVBFUk07CisKKwluYnl0ZXMgPSBtaW4obmJ5dGVzLCAodW5zaWduZWQpIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEgPDwgUEFHRV9TSElGVCk7CisJbnBhZ2VzID0gKG5ieXRlcyArIG9mZnNldCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJbnBhZ2VzID0gbWluKG5wYWdlcywgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSk7CisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCW5wYWdlcyA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1c2VyX2FkZHIsIG5wYWdlcywgd3JpdGUsCisJCQkJMCwgcmVxLT5wYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAobnBhZ2VzIDwgMCkKKwkJcmV0dXJuIG5wYWdlczsKKworCXJlcS0+bnVtX3BhZ2VzID0gbnBhZ2VzOworCXJlcS0+cGFnZV9vZmZzZXQgPSBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGlyZWN0X2lvKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsIGludCB3cml0ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzaXplX3Qgbm1heCA9IHdyaXRlID8gZmMtPm1heF93cml0ZSA6IGZjLT5tYXhfcmVhZDsKKwlsb2ZmX3QgcG9zID0gKnBwb3M7CisJc3NpemVfdCByZXMgPSAwOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZnVzZV9nZXRfcmVxdWVzdChmYyk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRUlOVFI7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJc2l6ZV90IHRtcDsKKwkJc2l6ZV90IG5yZXM7CisJCXNpemVfdCBuYnl0ZXMgPSBtaW4oY291bnQsIG5tYXgpOworCQlpbnQgZXJyID0gZnVzZV9nZXRfdXNlcl9wYWdlcyhyZXEsIGJ1ZiwgbmJ5dGVzLCAhd3JpdGUpOworCQlpZiAoZXJyKSB7CisJCQlyZXMgPSBlcnI7CisJCQlicmVhazsKKwkJfQorCQl0bXAgPSAocmVxLT5udW1fcGFnZXMgPDwgUEFHRV9TSElGVCkgLSByZXEtPnBhZ2Vfb2Zmc2V0OworCQluYnl0ZXMgPSBtaW4obmJ5dGVzLCB0bXApOworCQlpZiAod3JpdGUpCisJCQlucmVzID0gZnVzZV9zZW5kX3dyaXRlKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgbmJ5dGVzKTsKKwkJZWxzZQorCQkJbnJlcyA9IGZ1c2Vfc2VuZF9yZWFkKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgbmJ5dGVzKTsKKwkJZnVzZV9yZWxlYXNlX3VzZXJfcGFnZXMocmVxLCAhd3JpdGUpOworCQlpZiAocmVxLT5vdXQuaC5lcnJvcikgeworCQkJaWYgKCFyZXMpCisJCQkJcmVzID0gcmVxLT5vdXQuaC5lcnJvcjsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG5yZXMgPiBuYnl0ZXMpIHsKKwkJCXJlcyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQljb3VudCAtPSBucmVzOworCQlyZXMgKz0gbnJlczsKKwkJcG9zICs9IG5yZXM7CisJCWJ1ZiArPSBucmVzOworCQlpZiAobnJlcyAhPSBuYnl0ZXMpCisJCQlicmVhazsKKwkJaWYgKGNvdW50KQorCQkJZnVzZV9yZXNldF9yZXF1ZXN0KHJlcSk7CisJfQorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKHJlcyA+IDApIHsKKwkJaWYgKHdyaXRlICYmIHBvcyA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwkJKnBwb3MgPSBwb3M7CisJfQorCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGlyZWN0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gZnVzZV9kaXJlY3RfaW8oZmlsZSwgYnVmLCBjb3VudCwgcHBvcywgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGlyZWN0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3NpemVfdCByZXM7CisJLyogRG9uJ3QgYWxsb3cgcGFyYWxsZWwgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgKi8KKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXJlcyA9IGZ1c2VfZGlyZWN0X2lvKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MsIDEpOworCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpIHsKKwkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWVsc2UKKwkJCXZtYS0+dm1fZmxhZ3MgJj0gflZNX01BWVdSSVRFOworCX0KKwlyZXR1cm4gZ2VuZXJpY19maWxlX21tYXAoZmlsZSwgdm1hKTsKK30KKworc3RhdGljIGludCBmdXNlX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXByaW50aygiZnVzZV9zZXRfcGFnZV9kaXJ0eTogc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworCWR1bXBfc3RhY2soKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZnVzZV9maWxlX21tYXAsCisJLm9wZW4JCT0gZnVzZV9vcGVuLAorCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLAorCS5yZWxlYXNlCT0gZnVzZV9yZWxlYXNlLAorCS5mc3luYwkJPSBmdXNlX2ZzeW5jLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZnVzZV9kaXJlY3RfcmVhZCwKKwkud3JpdGUJCT0gZnVzZV9kaXJlY3Rfd3JpdGUsCisJLm9wZW4JCT0gZnVzZV9vcGVuLAorCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLAorCS5yZWxlYXNlCT0gZnVzZV9yZWxlYXNlLAorCS5mc3luYwkJPSBmdXNlX2ZzeW5jLAorCS8qIG5vIG1tYXAgYW5kIHNlbmRmaWxlICovCit9OworCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBmdXNlX2ZpbGVfYW9wcyAgPSB7CisJLnJlYWRwYWdlCT0gZnVzZV9yZWFkcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGZ1c2VfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZnVzZV9jb21taXRfd3JpdGUsCisJLnJlYWRwYWdlcwk9IGZ1c2VfcmVhZHBhZ2VzLAorCS5zZXRfcGFnZV9kaXJ0eQk9IGZ1c2Vfc2V0X3BhZ2VfZGlydHksCit9OworCit2b2lkIGZ1c2VfaW5pdF9maWxlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfZm9wID0gJmZ1c2VfZmlsZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmZnVzZV9maWxlX2FvcHM7Cit9CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQ3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSA8bGludXgvZnVzZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qKiBNYXggbnVtYmVyIG9mIHBhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW5nbGUgcmVhZCByZXF1ZXN0ICovCisjZGVmaW5lIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEgMzIKKworLyoqIElmIG1vcmUgcmVxdWVzdHMgYXJlIG91dHN0YW5kaW5nLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBibG9jayAqLworI2RlZmluZSBGVVNFX01BWF9PVVRTVEFORElORyAxMAorCisvKiogSWYgdGhlIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUyBmbGFnIGlzIGdpdmVuLCB0aGUgZmlsZXN5c3RlbQorICAgIG1vZHVsZSB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSBmaWxlIG1vZGUuICBPdGhlcndpc2Ugbm8KKyAgICBwZXJtaXNzaW9uIGNoZWNraW5nIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCAqLworI2RlZmluZSBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMgKDEgPDwgMCkKKworLyoqIElmIHRoZSBGVVNFX0FMTE9XX09USEVSIGZsYWcgaXMgZ2l2ZW4sIHRoZW4gbm90IG9ubHkgdGhlIHVzZXIKKyAgICBkb2luZyB0aGUgbW91bnQgd2lsbCBiZSBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZmlsZXN5c3RlbSAqLworI2RlZmluZSBGVVNFX0FMTE9XX09USEVSICAgICAgICAgKDEgPDwgMSkKKworCisvKiogRlVTRSBpbm9kZSAqLworc3RydWN0IGZ1c2VfaW5vZGUgeworCS8qKiBJbm9kZSBkYXRhICovCisJc3RydWN0IGlub2RlIGlub2RlOworCisJLyoqIFVuaXF1ZSBJRCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgaW5vZGUgYmV0d2VlbiB1c2Vyc3BhY2UKKwkgKiBhbmQga2VybmVsICovCisJdTY0IG5vZGVpZDsKKworCS8qKiBOdW1iZXIgb2YgbG9va3VwcyBvbiB0aGlzIGlub2RlICovCisJdTY0IG5sb29rdXA7CisKKwkvKiogVGhlIHJlcXVlc3QgdXNlZCBmb3Igc2VuZGluZyB0aGUgRk9SR0VUIG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisKKwkvKiogVGltZSBpbiBqaWZmaWVzIHVudGlsIHRoZSBmaWxlIGF0dHJpYnV0ZXMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBpX3RpbWU7Cit9OworCisvKiogRlVTRSBzcGVjaWZpYyBmaWxlIGRhdGEgKi8KK3N0cnVjdCBmdXNlX2ZpbGUgeworCS8qKiBSZXF1ZXN0IHJlc2VydmVkIGZvciBmbHVzaCBhbmQgcmVsZWFzZSAqLworCXN0cnVjdCBmdXNlX3JlcSAqcmVsZWFzZV9yZXE7CisKKwkvKiogRmlsZSBoYW5kbGUgdXNlZCBieSB1c2Vyc3BhY2UgKi8KKwl1NjQgZmg7Cit9OworCisvKiogT25lIGlucHV0IGFyZ3VtZW50IG9mIGEgcmVxdWVzdCAqLworc3RydWN0IGZ1c2VfaW5fYXJnIHsKKwl1bnNpZ25lZCBzaXplOworCWNvbnN0IHZvaWQgKnZhbHVlOworfTsKKworLyoqIFRoZSByZXF1ZXN0IGlucHV0ICovCitzdHJ1Y3QgZnVzZV9pbiB7CisJLyoqIFRoZSByZXF1ZXN0IGhlYWRlciAqLworCXN0cnVjdCBmdXNlX2luX2hlYWRlciBoOworCisJLyoqIFRydWUgaWYgdGhlIGRhdGEgZm9yIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGluIHJlcS0+cGFnZXMgKi8KKwl1bnNpZ25lZCBhcmdwYWdlczoxOworCisJLyoqIE51bWJlciBvZiBhcmd1bWVudHMgKi8KKwl1bnNpZ25lZCBudW1hcmdzOworCisJLyoqIEFycmF5IG9mIGFyZ3VtZW50cyAqLworCXN0cnVjdCBmdXNlX2luX2FyZyBhcmdzWzNdOworfTsKKworLyoqIE9uZSBvdXRwdXQgYXJndW1lbnQgb2YgYSByZXF1ZXN0ICovCitzdHJ1Y3QgZnVzZV9hcmcgeworCXVuc2lnbmVkIHNpemU7CisJdm9pZCAqdmFsdWU7Cit9OworCisvKiogVGhlIHJlcXVlc3Qgb3V0cHV0ICovCitzdHJ1Y3QgZnVzZV9vdXQgeworCS8qKiBIZWFkZXIgcmV0dXJuZWQgZnJvbSB1c2Vyc3BhY2UgKi8KKwlzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyIGg7CisKKwkvKiogTGFzdCBhcmd1bWVudCBpcyB2YXJpYWJsZSBsZW5ndGggKGNhbiBiZSBzaG9ydGVyIHRoYW4KKwkgICAgYXJnLT5zaXplKSAqLworCXVuc2lnbmVkIGFyZ3ZhcjoxOworCisJLyoqIExhc3QgYXJndW1lbnQgaXMgYSBsaXN0IG9mIHBhZ2VzIHRvIGNvcHkgZGF0YSB0byAqLworCXVuc2lnbmVkIGFyZ3BhZ2VzOjE7CisKKwkvKiogWmVybyBwYXJ0aWFsbHkgb3Igbm90IGNvcGllZCBwYWdlcyAqLworCXVuc2lnbmVkIHBhZ2VfemVyb2luZzoxOworCisJLyoqIE51bWJlciBvciBhcmd1bWVudHMgKi8KKwl1bnNpZ25lZCBudW1hcmdzOworCisJLyoqIEFycmF5IG9mIGFyZ3VtZW50cyAqLworCXN0cnVjdCBmdXNlX2FyZyBhcmdzWzNdOworfTsKKworc3RydWN0IGZ1c2VfcmVxOworc3RydWN0IGZ1c2VfY29ubjsKKworLyoqCisgKiBBIHJlcXVlc3QgdG8gdGhlIGNsaWVudAorICovCitzdHJ1Y3QgZnVzZV9yZXEgeworCS8qKiBUaGlzIGNhbiBiZSBvbiBlaXRoZXIgdW51c2VkX2xpc3QsIHBlbmRpbmcgb3IgcHJvY2Vzc2luZworCSAgICBsaXN0cyBpbiBmdXNlX2Nvbm4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiogRW50cnkgb24gdGhlIGJhY2tncm91bmQgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYmdfZW50cnk7CisKKwkvKiogcmVmY291bnQgKi8KKwlhdG9taWNfdCBjb3VudDsKKworCS8qKiBUcnVlIGlmIHRoZSByZXF1ZXN0IGhhcyByZXBseSAqLworCXVuc2lnbmVkIGlzcmVwbHk6MTsKKworCS8qKiBUaGUgcmVxdWVzdCBpcyBwcmVhbGxvY2F0ZWQgKi8KKwl1bnNpZ25lZCBwcmVhbGxvY2F0ZWQ6MTsKKworCS8qKiBUaGUgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgKi8KKwl1bnNpZ25lZCBpbnRlcnJ1cHRlZDoxOworCisJLyoqIFJlcXVlc3QgaXMgc2VudCBpbiB0aGUgYmFja2dyb3VuZCAqLworCXVuc2lnbmVkIGJhY2tncm91bmQ6MTsKKworCS8qKiBEYXRhIGlzIGJlaW5nIGNvcGllZCB0by9mcm9tIHRoZSByZXF1ZXN0ICovCisJdW5zaWduZWQgbG9ja2VkOjE7CisKKwkvKiogUmVxdWVzdCBoYXMgYmVlbiBzZW50IHRvIHVzZXJzcGFjZSAqLworCXVuc2lnbmVkIHNlbnQ6MTsKKworCS8qKiBUaGUgcmVxdWVzdCBpcyBmaW5pc2hlZCAqLworCXVuc2lnbmVkIGZpbmlzaGVkOjE7CisKKwkvKiogVGhlIHJlcXVlc3QgaW5wdXQgKi8KKwlzdHJ1Y3QgZnVzZV9pbiBpbjsKKworCS8qKiBUaGUgcmVxdWVzdCBvdXRwdXQgKi8KKwlzdHJ1Y3QgZnVzZV9vdXQgb3V0OworCisJLyoqIFVzZWQgdG8gd2FrZSB1cCB0aGUgdGFzayB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIHJlcXVlc3QqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCisJLyoqIERhdGEgZm9yIGFzeW5jaHJvbm91cyByZXF1ZXN0cyAqLworCXVuaW9uIHsKKwkJc3RydWN0IGZ1c2VfZm9yZ2V0X2luIGZvcmdldF9pbjsKKwkJc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiByZWxlYXNlX2luOworCQlzdHJ1Y3QgZnVzZV9pbml0X2luX291dCBpbml0X2luX291dDsKKwl9IG1pc2M7CisKKwkvKiogcGFnZSB2ZWN0b3IgKi8KKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbRlVTRV9NQVhfUEFHRVNfUEVSX1JFUV07CisKKwkvKiogbnVtYmVyIG9mIHBhZ2VzIGluIHZlY3RvciAqLworCXVuc2lnbmVkIG51bV9wYWdlczsKKworCS8qKiBvZmZzZXQgb2YgZGF0YSBvbiBmaXJzdCBwYWdlICovCisJdW5zaWduZWQgcGFnZV9vZmZzZXQ7CisKKwkvKiogSW5vZGUgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkvKiogU2Vjb25kIGlub2RlIHVzZWQgaW4gdGhlIHJlcXVlc3QgKG9yIE5VTEwpICovCisJc3RydWN0IGlub2RlICppbm9kZTI7CisKKwkvKiogRmlsZSB1c2VkIGluIHRoZSByZXF1ZXN0IChvciBOVUxMKSAqLworCXN0cnVjdCBmaWxlICpmaWxlOworfTsKKworLyoqCisgKiBBIEZ1c2UgY29ubmVjdGlvbi4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBjcmVhdGVkLCB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQsIGFuZCBpcworICogZGVzdHJveWVkLCB3aGVuIHRoZSBjbGllbnQgZGV2aWNlIGlzIGNsb3NlZCBhbmQgdGhlIGZpbGVzeXN0ZW0gaXMKKyAqIHVubW91bnRlZC4KKyAqLworc3RydWN0IGZ1c2VfY29ubiB7CisJLyoqIFJlZmVyZW5jZSBjb3VudCAqLworCWludCBjb3VudDsKKworCS8qKiBUaGUgdXNlciBpZCBmb3IgdGhpcyBtb3VudCAqLworCXVpZF90IHVzZXJfaWQ7CisKKwkvKiogVGhlIGdyb3VwIGlkIGZvciB0aGlzIG1vdW50ICovCisJZ2lkX3QgZ3JvdXBfaWQ7CisKKwkvKiogVGhlIGZ1c2UgbW91bnQgZmxhZ3MgZm9yIHRoaXMgbW91bnQgKi8KKwl1bnNpZ25lZCBmbGFnczsKKworCS8qKiBNYXhpbXVtIHJlYWQgc2l6ZSAqLworCXVuc2lnbmVkIG1heF9yZWFkOworCisJLyoqIE1heGltdW0gd3JpdGUgc2l6ZSAqLworCXVuc2lnbmVkIG1heF93cml0ZTsKKworCS8qKiBSZWFkZXJzIG9mIHRoZSBjb25uZWN0aW9uIGFyZSB3YWl0aW5nIG9uIHRoaXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKworCS8qKiBUaGUgbGlzdCBvZiBwZW5kaW5nIHJlcXVlc3RzICovCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOworCisJLyoqIFRoZSBsaXN0IG9mIHJlcXVlc3RzIGJlaW5nIHByb2Nlc3NlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgcHJvY2Vzc2luZzsKKworCS8qKiBSZXF1ZXN0cyBwdXQgaW4gdGhlIGJhY2tncm91bmQgKFJFTEVBU0Ugb3IgYW55IG90aGVyCisJICAgIGludGVycnVwdGVkIHJlcXVlc3QpICovCisJc3RydWN0IGxpc3RfaGVhZCBiYWNrZ3JvdW5kOworCisJLyoqIENvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLworCXN0cnVjdCBzZW1hcGhvcmUgb3V0c3RhbmRpbmdfc2VtOworCisJLyoqIFRoaXMgY291bnRzIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgaWYKKwkgICAgb3V0c3RhbmRpbmdfc2VtIHdvdWxkIGdvIG5lZ2F0aXZlICovCisJdW5zaWduZWQgb3V0c3RhbmRpbmdfZGVidDsKKworCS8qKiBSVyBzZW1hcGhvcmUgZm9yIGV4Y2x1c2lvbiB3aXRoIGZ1c2VfcHV0X3N1cGVyKCkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHNicHV0X3NlbTsKKworCS8qKiBUaGUgbGlzdCBvZiB1bnVzZWQgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHVudXNlZF9saXN0OworCisJLyoqIFRoZSBuZXh0IHVuaXF1ZSByZXF1ZXN0IGlkICovCisJdTY0IHJlcWN0cjsKKworCS8qKiBNb3VudCBpcyBhY3RpdmUgKi8KKwl1bnNpZ25lZCBtb3VudGVkIDogMTsKKworCS8qKiBDb25uZWN0aW9uIGVzdGFibGlzaGVkICovCisJdW5zaWduZWQgY29ubmVjdGVkIDogMTsKKworCS8qKiBDb25uZWN0aW9uIGZhaWxlZCAodmVyc2lvbiBtaXNtYXRjaCkgKi8KKwl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKKworCS8qKiBJcyBmc3luYyBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fZnN5bmMgOiAxOworCisJLyoqIElzIGZzeW5jZGlyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19mc3luY2RpciA6IDE7CisKKwkvKiogSXMgZmx1c2ggbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLworCXVuc2lnbmVkIG5vX2ZsdXNoIDogMTsKKworCS8qKiBJcyBzZXR4YXR0ciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fc2V0eGF0dHIgOiAxOworCisJLyoqIElzIGdldHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19nZXR4YXR0ciA6IDE7CisKKwkvKiogSXMgbGlzdHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19saXN0eGF0dHIgOiAxOworCisJLyoqIElzIHJlbW92ZXhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19yZW1vdmV4YXR0ciA6IDE7CisKKwkvKiogQmFja2luZyBkZXYgaW5mbyAqLworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIGJkaTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqKmdldF9mdXNlX2Nvbm5fc3VwZXJfcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAoc3RydWN0IGZ1c2VfY29ubiAqKikgJnNiLT5zX2ZzX2luZm87Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAqZ2V0X2Z1c2VfY29ubl9zdXBlcl9wKHNiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpnZXRfZnVzZV9jb25uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGdldF9mdXNlX2Nvbm5fc3VwZXIoaW5vZGUtPmlfc2IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2lub2RlICpnZXRfZnVzZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBmdXNlX2lub2RlLCBpbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9ub2RlX2lkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGdldF9mdXNlX2lub2RlKGlub2RlKS0+bm9kZWlkOworfQorCisvKiogRGV2aWNlIG9wZXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGV2X29wZXJhdGlvbnM7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc2luZ2xlIGdsb2JhbCBzcGlubG9jayB3aGljaCBwcm90ZWN0cyBGVVNFJ3Mgc3RydWN0dXJlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZGF0YSBpcyBwcm90ZWN0ZWQgYnkgdGhpcyBsb2NrOgorICoKKyAqICAtIHRoZSBwcml2YXRlX2RhdGEgZmllbGQgb2YgdGhlIGRldmljZSBmaWxlCisgKiAgLSB0aGUgc19mc19pbmZvIGZpZWxkIG9mIHRoZSBzdXBlciBibG9jaworICogIC0gdW51c2VkX2xpc3QsIHBlbmRpbmcsIHByb2Nlc3NpbmcgbGlzdHMgaW4gZnVzZV9jb25uCisgKiAgLSBiYWNrZ3JvdW5kIGxpc3QgaW4gZnVzZV9jb25uCisgKiAgLSB0aGUgdW5pcXVlIHJlcXVlc3QgSUQgY291bnRlciByZXFjdHIgaW4gZnVzZV9jb25uCisgKiAgLSB0aGUgc2IgKHN1cGVyX2Jsb2NrKSBmaWVsZCBpbiBmdXNlX2Nvbm4KKyAqICAtIHRoZSBmaWxlIChkZXZpY2UgZmlsZSkgZmllbGQgaW4gZnVzZV9jb25uCisgKi8KK2V4dGVybiBzcGlubG9ja190IGZ1c2VfbG9jazsKKworLyoqCisgKiBHZXQgYSBmaWxsZWQgaW4gaW5vZGUKKyAqLworc3RydWN0IGlub2RlICpmdXNlX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBub2RlaWQsCisJCQlpbnQgZ2VuZXJhdGlvbiwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cik7CisKKy8qKgorICogU2VuZCBGT1JHRVQgY29tbWFuZAorICovCit2b2lkIGZ1c2Vfc2VuZF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAorCQkgICAgICB1bnNpZ25lZCBsb25nIG5vZGVpZCwgdTY0IG5sb29rdXApOworCisvKioKKyAqIFNlbmQgUkVBRCBvciBSRUFERElSIHJlcXVlc3QKKyAqLworc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgaW50IGlzZGlyKTsKKworLyoqCisgKiBTZW5kIE9QRU4gb3IgT1BFTkRJUiByZXF1ZXN0CisgKi8KK2ludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpOworCisvKioKKyAqIFNlbmQgUkVMRUFTRSBvciBSRUxFQVNFRElSIHJlcXVlc3QKKyAqLworaW50IGZ1c2VfcmVsZWFzZV9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2Rpcik7CisKKy8qKgorICogU2VuZCBGU1lOQyBvciBGU1lOQ0RJUiByZXF1ZXN0CisgKi8KK2ludCBmdXNlX2ZzeW5jX2NvbW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGUsIGludCBkYXRhc3luYywKKwkJICAgICAgaW50IGlzZGlyKTsKKworLyoqCisgKiBJbml0aWFsaXNlIGZpbGUgb3BlcmF0aW9ucyBvbiBhIHJlZ3VsYXIgZmlsZQorICovCit2b2lkIGZ1c2VfaW5pdF9maWxlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKioKKyAqIEluaXRpYWxpc2UgaW5vZGUgb3BlcmF0aW9ucyBvbiByZWd1bGFyIGZpbGVzIGFuZCBzcGVjaWFsIGZpbGVzCisgKi8KK3ZvaWQgZnVzZV9pbml0X2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBJbml0aWFsaXNlIGlub2RlIGFuZCBmaWxlIG9wZXJhdGlvbnMgb24gYSBkaXJlY3RvcnkKKyAqLwordm9pZCBmdXNlX2luaXRfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKioKKyAqIEluaXRpYWxpc2UgaW5vZGUgb3BlcmF0aW9ucyBvbiBhIHN5bWxpbmsKKyAqLwordm9pZCBmdXNlX2luaXRfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBDaGFuZ2UgYXR0cmlidXRlcyBvZiBhbiBpbm9kZQorICovCit2b2lkIGZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cik7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gY2FuIGJlIHJlbGVhc2VkLCBhbmQgaWYgeWVzLCB0aGVuIGZyZWUgdGhlCisgKiBjb25uZWN0aW9uIHN0cnVjdHVyZQorICovCit2b2lkIGZ1c2VfcmVsZWFzZV9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBjbGllbnQgZGV2aWNlCisgKi8KK2ludCBmdXNlX2Rldl9pbml0KHZvaWQpOworCisvKioKKyAqIENsZWFudXAgdGhlIGNsaWVudCBkZXZpY2UKKyAqLwordm9pZCBmdXNlX2Rldl9jbGVhbnVwKHZvaWQpOworCisvKioKKyAqIEFsbG9jYXRlIGEgcmVxdWVzdAorICovCitzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfcmVxdWVzdF9hbGxvYyh2b2lkKTsKKworLyoqCisgKiBGcmVlIGEgcmVxdWVzdAorICovCit2b2lkIGZ1c2VfcmVxdWVzdF9mcmVlKHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKKworLyoqCisgKiBSZWluaXRpYWxpemUgYSByZXF1ZXN0LCB0aGUgcHJlYWxsb2NhdGVkIGZsYWcgaXMgbGVmdCB1bm1vZGlmaWVkCisgKi8KK3ZvaWQgZnVzZV9yZXNldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKKworLyoqCisgKiBSZXNlcnZlIGEgcHJlYWxsb2NhdGVkIHJlcXVlc3QKKyAqLworc3RydWN0IGZ1c2VfcmVxICpmdXNlX2dldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKKworLyoqCisgKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIGEgcmVxdWVzdC4gIElmIGNvdW50IGdvZXMgdG8gemVybyBwdXQKKyAqIG9uIHVudXNlZCBsaXN0IChwcmVhbGxvY2F0ZWQpIG9yIGZyZWUgcmVxZXN0IChub3QgcHJlYWxsb2NhdGVkKS4KKyAqLwordm9pZCBmdXNlX3B1dF9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CisKKy8qKgorICogU2VuZCBhIHJlcXVlc3QgKHN5bmNocm9ub3VzKQorICovCit2b2lkIHJlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOworCisvKioKKyAqIFNlbmQgYSByZXF1ZXN0IHdpdGggbm8gcmVwbHkKKyAqLwordm9pZCByZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOworCisvKioKKyAqIFNlbmQgYSByZXF1ZXN0IGluIHRoZSBiYWNrZ3JvdW5kCisgKi8KK3ZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKKworLyoqCisgKiBSZWxlYXNlIGlub2RlcyBhbmQgZmlsZSBhc3NpY2lhdGVkIHdpdGggYmFja2dyb3VuZCByZXF1ZXN0CisgKi8KK3ZvaWQgZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfcmVxICpyZXEpOworCisvKioKKyAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhIGZpbGUKKyAqLworaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBJbnZhbGlkYXRlIGlub2RlIGF0dHJpYnV0ZXMKKyAqLwordm9pZCBmdXNlX2ludmFsaWRhdGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoqCisgKiBTZW5kIHRoZSBJTklUIG1lc3NhZ2UKKyAqLwordm9pZCBmdXNlX3NlbmRfaW5pdChzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5YTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKworICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorCitNT0RVTEVfQVVUSE9SKCJNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3NwaW5sb2NrX3QgZnVzZV9sb2NrOworc3RhdGljIGttZW1fY2FjaGVfdCAqZnVzZV9pbm9kZV9jYWNoZXA7CisKKyNkZWZpbmUgRlVTRV9TVVBFUl9NQUdJQyAweDY1NzM1NTQ2CisKK3N0cnVjdCBmdXNlX21vdW50X2RhdGEgeworCWludCBmZDsKKwl1bnNpZ25lZCByb290bW9kZTsKKwl1bnNpZ25lZCB1c2VyX2lkOworCXVuc2lnbmVkIGdyb3VwX2lkOworCXVuc2lnbmVkIGZkX3ByZXNlbnQgOiAxOworCXVuc2lnbmVkIHJvb3Rtb2RlX3ByZXNlbnQgOiAxOworCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudCA6IDE7CisJdW5zaWduZWQgZ3JvdXBfaWRfcHJlc2VudCA6IDE7CisJdW5zaWduZWQgZmxhZ3M7CisJdW5zaWduZWQgbWF4X3JlYWQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlub2RlICpmdXNlX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmk7CisKKwlpbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOworCWZpLT5pX3RpbWUgPSBqaWZmaWVzIC0gMTsKKwlmaS0+bm9kZWlkID0gMDsKKwlmaS0+bmxvb2t1cCA9IDA7CisJZmktPmZvcmdldF9yZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKKwlpZiAoIWZpLT5mb3JnZXRfcmVxKSB7CisJCWttZW1fY2FjaGVfZnJlZShmdXNlX2lub2RlX2NhY2hlcCwgaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlpZiAoZmktPmZvcmdldF9yZXEpCisJCWZ1c2VfcmVxdWVzdF9mcmVlKGZpLT5mb3JnZXRfcmVxKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZnVzZV9pbm9kZV9jYWNoZXAsIGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgZnVzZV9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogTm8gb3AgKi8KK30KKwordm9pZCBmdXNlX3NlbmRfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBub2RlaWQsIHU2NCBubG9va3VwKQoreworCXN0cnVjdCBmdXNlX2ZvcmdldF9pbiAqaW5hcmcgPSAmcmVxLT5taXNjLmZvcmdldF9pbjsKKwlpbmFyZy0+bmxvb2t1cCA9IG5sb29rdXA7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfRk9SR0VUOworCXJlcS0+aW4uaC5ub2RlaWQgPSBub2RlaWQ7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4pOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOworCXJlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7CisJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwkJZnVzZV9zZW5kX2ZvcmdldChmYywgZmktPmZvcmdldF9yZXEsIGZpLT5ub2RlaWQsIGZpLT5ubG9va3VwKTsKKwkJZmktPmZvcmdldF9yZXEgPSBOVUxMOworCX0KK30KKwordm9pZCBmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIpCit7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgaV9zaXplX3JlYWQoaW5vZGUpICE9IGF0dHItPnNpemUpCisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZyk7CisKKwlpbm9kZS0+aV9pbm8gICAgID0gYXR0ci0+aW5vOworCWlub2RlLT5pX21vZGUgICAgPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgKyAoYXR0ci0+bW9kZSAmIDA3Nzc3KTsKKwlpbm9kZS0+aV9ubGluayAgID0gYXR0ci0+bmxpbms7CisJaW5vZGUtPmlfdWlkICAgICA9IGF0dHItPnVpZDsKKwlpbm9kZS0+aV9naWQgICAgID0gYXR0ci0+Z2lkOworCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci0+c2l6ZSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgID0gYXR0ci0+YmxvY2tzOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyAgID0gYXR0ci0+YXRpbWU7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyAgPSBhdHRyLT5hdGltZW5zZWM7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjICAgPSBhdHRyLT5tdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjICA9IGF0dHItPm10aW1lbnNlYzsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgICA9IGF0dHItPmN0aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgID0gYXR0ci0+Y3RpbWVuc2VjOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2luaXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cikKK3sKKwlpbm9kZS0+aV9tb2RlID0gYXR0ci0+bW9kZSAmIFNfSUZNVDsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIGF0dHItPnNpemUpOworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWZ1c2VfaW5pdF9jb21tb24oaW5vZGUpOworCQlmdXNlX2luaXRfZmlsZV9pbm9kZShpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlmdXNlX2luaXRfZGlyKGlub2RlKTsKKwllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlmdXNlX2luaXRfc3ltbGluayhpbm9kZSk7CisJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpIHx8CisJCSBTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgeworCQlmdXNlX2luaXRfY29tbW9uKGlub2RlKTsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCSAgIG5ld19kZWNvZGVfZGV2KGF0dHItPnJkZXYpKTsKKwl9IGVsc2UgeworCQkvKiBEb24ndCBsZXQgdXNlciBjcmVhdGUgd2VpcmQgZmlsZXMgKi8KKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUc7CisJCWZ1c2VfaW5pdF9jb21tb24oaW5vZGUpOworCQlmdXNlX2luaXRfZmlsZV9pbm9kZShpbm9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IGZ1c2VfaW5vZGVfZXEoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqX25vZGVpZHApCit7CisJdW5zaWduZWQgbG9uZyBub2RlaWQgPSAqKHVuc2lnbmVkIGxvbmcgKikgX25vZGVpZHA7CisJaWYgKGdldF9ub2RlX2lkKGlub2RlKSA9PSBub2RlaWQpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9pbm9kZV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqX25vZGVpZHApCit7CisJdW5zaWduZWQgbG9uZyBub2RlaWQgPSAqKHVuc2lnbmVkIGxvbmcgKikgX25vZGVpZHA7CisJZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpLT5ub2RlaWQgPSBub2RlaWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZSAqZnVzZV9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgbm9kZWlkLAorCQkJaW50IGdlbmVyYXRpb24sIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmk7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKHNiKTsKKwlpbnQgcmV0cmllZCA9IDA7CisKKyByZXRyeToKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgbm9kZWlkLCBmdXNlX2lub2RlX2VxLCBmdXNlX2lub2RlX3NldCwgJm5vZGVpZCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7CisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRXxTX05PQ01USU1FOworCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKwkJaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJmZjLT5iZGk7CisJCWZ1c2VfaW5pdF9pbm9kZShpbm9kZSwgYXR0cik7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0gZWxzZSBpZiAoKGlub2RlLT5pX21vZGUgXiBhdHRyLT5tb2RlKSAmIFNfSUZNVCkgeworCQlCVUdfT04ocmV0cmllZCk7CisJCS8qIElub2RlIGhhcyBjaGFuZ2VkIHR5cGUsIGFueSBJL08gb24gdGhlIG9sZCBzaG91bGQgZmFpbCAqLworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXRyaWVkID0gMTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlmaS0+bmxvb2t1cCArKzsKKwlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCBhdHRyKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKHNiKTsKKworCWRvd25fd3JpdGUoJmZjLT5zYnB1dF9zZW0pOworCXdoaWxlICghbGlzdF9lbXB0eSgmZmMtPmJhY2tncm91bmQpKQorCQlmdXNlX3JlbGVhc2VfYmFja2dyb3VuZChsaXN0X2VudHJ5KGZjLT5iYWNrZ3JvdW5kLm5leHQsCisJCQkJCQkgICBzdHJ1Y3QgZnVzZV9yZXEsIGJnX2VudHJ5KSk7CisKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJZmMtPm1vdW50ZWQgPSAwOworCWZjLT51c2VyX2lkID0gMDsKKwlmYy0+Z3JvdXBfaWQgPSAwOworCWZjLT5mbGFncyA9IDA7CisJLyogRmx1c2ggYWxsIHJlYWRlcnMgb24gdGhpcyBmcyAqLworCXdha2VfdXBfYWxsKCZmYy0+d2FpdHEpOworCXVwX3dyaXRlKCZmYy0+c2JwdXRfc2VtKTsKKwlmdXNlX3JlbGVhc2VfY29ubihmYyk7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfZnVzZV9zdGF0ZnMoc3RydWN0IGtzdGF0ZnMgKnN0YnVmLCBzdHJ1Y3QgZnVzZV9rc3RhdGZzICphdHRyKQoreworCXN0YnVmLT5mX3R5cGUgICAgPSBGVVNFX1NVUEVSX01BR0lDOworCXN0YnVmLT5mX2JzaXplICAgPSBhdHRyLT5ic2l6ZTsKKwlzdGJ1Zi0+Zl9ibG9ja3MgID0gYXR0ci0+YmxvY2tzOworCXN0YnVmLT5mX2JmcmVlICAgPSBhdHRyLT5iZnJlZTsKKwlzdGJ1Zi0+Zl9iYXZhaWwgID0gYXR0ci0+YmF2YWlsOworCXN0YnVmLT5mX2ZpbGVzICAgPSBhdHRyLT5maWxlczsKKwlzdGJ1Zi0+Zl9mZnJlZSAgID0gYXR0ci0+ZmZyZWU7CisJc3RidWYtPmZfbmFtZWxlbiA9IGF0dHItPm5hbWVsZW47CisJLyogZnNpZCBpcyBsZWZ0IHplcm8gKi8KK30KKworc3RhdGljIGludCBmdXNlX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubl9zdXBlcihzYik7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2Vfc3RhdGZzX291dCBvdXRhcmc7CisJaW50IGVycjsKKworICAgICAgICByZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJlcS0+aW4ubnVtYXJncyA9IDA7CisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfU1RBVEZTOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWlmICghZXJyKQorCQljb252ZXJ0X2Z1c2Vfc3RhdGZzKGJ1ZiwgJm91dGFyZy5zdCk7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlyZXR1cm4gZXJyOworfQorCitlbnVtIHsKKwlPUFRfRkQsCisJT1BUX1JPT1RNT0RFLAorCU9QVF9VU0VSX0lELAorCU9QVF9HUk9VUF9JRCwKKwlPUFRfREVGQVVMVF9QRVJNSVNTSU9OUywKKwlPUFRfQUxMT1dfT1RIRVIsCisJT1BUX01BWF9SRUFELAorCU9QVF9FUlIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T1BUX0ZELAkJCSJmZD0ldSJ9LAorCXtPUFRfUk9PVE1PREUsCQkJInJvb3Rtb2RlPSVvIn0sCisJe09QVF9VU0VSX0lELAkJCSJ1c2VyX2lkPSV1In0sCisJe09QVF9HUk9VUF9JRCwJCQkiZ3JvdXBfaWQ9JXUifSwKKwl7T1BUX0RFRkFVTFRfUEVSTUlTU0lPTlMsCSJkZWZhdWx0X3Blcm1pc3Npb25zIn0sCisJe09QVF9BTExPV19PVEhFUiwJCSJhbGxvd19vdGhlciJ9LAorCXtPUFRfTUFYX1JFQUQsCQkJIm1heF9yZWFkPSV1In0sCisJe09QVF9FUlIsCQkJTlVMTH0KK307CisKK3N0YXRpYyBpbnQgcGFyc2VfZnVzZV9vcHQoY2hhciAqb3B0LCBzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhICpkKQoreworCWNoYXIgKnA7CisJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhKSk7CisJZC0+bWF4X3JlYWQgPSB+MDsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0LCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsKKwkJaW50IHZhbHVlOworCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPUFRfRkQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdmFsdWUpKQorCQkJCXJldHVybiAwOworCQkJZC0+ZmQgPSB2YWx1ZTsKKwkJCWQtPmZkX3ByZXNlbnQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUFRfUk9PVE1PREU6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ2YWx1ZSkpCisJCQkJcmV0dXJuIDA7CisJCQlkLT5yb290bW9kZSA9IHZhbHVlOworCQkJZC0+cm9vdG1vZGVfcHJlc2VudCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE9QVF9VU0VSX0lEOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnZhbHVlKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWQtPnVzZXJfaWQgPSB2YWx1ZTsKKwkJCWQtPnVzZXJfaWRfcHJlc2VudCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE9QVF9HUk9VUF9JRDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZ2YWx1ZSkpCisJCQkJcmV0dXJuIDA7CisJCQlkLT5ncm91cF9pZCA9IHZhbHVlOworCQkJZC0+Z3JvdXBfaWRfcHJlc2VudCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE9QVF9ERUZBVUxUX1BFUk1JU1NJT05TOgorCQkJZC0+ZmxhZ3MgfD0gRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUFRfQUxMT1dfT1RIRVI6CisJCQlkLT5mbGFncyB8PSBGVVNFX0FMTE9XX09USEVSOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUFRfTUFYX1JFQUQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdmFsdWUpKQorCQkJCXJldHVybiAwOworCQkJZC0+bWF4X3JlYWQgPSB2YWx1ZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghZC0+ZmRfcHJlc2VudCB8fCAhZC0+cm9vdG1vZGVfcHJlc2VudCB8fAorCSAgICAhZC0+dXNlcl9pZF9wcmVzZW50IHx8ICFkLT5ncm91cF9pZF9wcmVzZW50KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZ1c2Vfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKG1udC0+bW50X3NiKTsKKworCXNlcV9wcmludGYobSwgIix1c2VyX2lkPSV1IiwgZmMtPnVzZXJfaWQpOworCXNlcV9wcmludGYobSwgIixncm91cF9pZD0ldSIsIGZjLT5ncm91cF9pZCk7CisJaWYgKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykKKwkJc2VxX3B1dHMobSwgIixkZWZhdWx0X3Blcm1pc3Npb25zIik7CisJaWYgKGZjLT5mbGFncyAmIEZVU0VfQUxMT1dfT1RIRVIpCisJCXNlcV9wdXRzKG0sICIsYWxsb3dfb3RoZXIiKTsKKwlpZiAoZmMtPm1heF9yZWFkICE9IH4wKQorCQlzZXFfcHJpbnRmKG0sICIsbWF4X3JlYWQ9JXUiLCBmYy0+bWF4X3JlYWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmYy0+dW51c2VkX2xpc3QpKSB7CisJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCQlyZXEgPSBsaXN0X2VudHJ5KGZjLT51bnVzZWRfbGlzdC5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJZnVzZV9yZXF1ZXN0X2ZyZWUocmVxKTsKKwl9CisJa2ZyZWUoZmMpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBmdXNlIGxvY2sgaGVsZCAqLwordm9pZCBmdXNlX3JlbGVhc2VfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlmYy0+Y291bnQtLTsKKwlpZiAoIWZjLT5jb3VudCkKKwkJZnJlZV9jb25uKGZjKTsKK30KKworc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm4gKm5ld19jb25uKHZvaWQpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmM7CisKKwlmYyA9IGttYWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOworCWlmIChmYyAhPSBOVUxMKSB7CisJCWludCBpOworCQltZW1zZXQoZmMsIDAsIHNpemVvZigqZmMpKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPndhaXRxKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wZW5kaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wcm9jZXNzaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT51bnVzZWRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZmYy0+YmFja2dyb3VuZCk7CisJCXNlbWFfaW5pdCgmZmMtPm91dHN0YW5kaW5nX3NlbSwgMCk7CisJCWluaXRfcndzZW0oJmZjLT5zYnB1dF9zZW0pOworCQlmb3IgKGkgPSAwOyBpIDwgRlVTRV9NQVhfT1VUU1RBTkRJTkc7IGkrKykgeworCQkJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKKwkJCWlmICghcmVxKSB7CisJCQkJZnJlZV9jb25uKGZjKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZmYy0+dW51c2VkX2xpc3QpOworCQl9CisJCWZjLT5iZGkucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOworCQlmYy0+YmRpLnVucGx1Z19pb19mbiA9IGRlZmF1bHRfdW5wbHVnX2lvX2ZuOworCQlmYy0+cmVxY3RyID0gMDsKKwl9CisJcmV0dXJuIGZjOworfQorCitzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Nvbm4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmM7CisKKwlpZiAoZmlsZS0+Zl9vcCAhPSAmZnVzZV9kZXZfb3BlcmF0aW9ucykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJZmMgPSBuZXdfY29ubigpOworCWlmIChmYyA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkgeworCQlmcmVlX2Nvbm4oZmMpOworCQlmYyA9IEVSUl9QVFIoLUVJTlZBTCk7CisJfSBlbHNlIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmM7CisJCSpnZXRfZnVzZV9jb25uX3N1cGVyX3Aoc2IpID0gZmM7CisJCWZjLT5tb3VudGVkID0gMTsKKwkJZmMtPmNvbm5lY3RlZCA9IDE7CisJCWZjLT5jb3VudCA9IDI7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworCXJldHVybiBmYzsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKK3sKKwlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7CisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOworCisJYXR0ci5tb2RlID0gbW9kZTsKKwlhdHRyLmlubyA9IEZVU0VfUk9PVF9JRDsKKwlyZXR1cm4gZnVzZV9pZ2V0KHNiLCAxLCAwLCAmYXR0cik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBmdXNlX3N1cGVyX29wZXJhdGlvbnMgPSB7CisJLmFsbG9jX2lub2RlICAgID0gZnVzZV9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSAgPSBmdXNlX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBmdXNlX3JlYWRfaW5vZGUsCisJLmNsZWFyX2lub2RlCT0gZnVzZV9jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZnVzZV9wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBmdXNlX3N0YXRmcywKKwkuc2hvd19vcHRpb25zCT0gZnVzZV9zaG93X29wdGlvbnMsCit9OworCitzdGF0aWMgaW50IGZ1c2VfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKwlzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhIGQ7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGVycjsKKworCWlmICghcGFyc2VfZnVzZV9vcHQoKGNoYXIgKikgZGF0YSwgJmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2ItPnNfbWFnaWMgPSBGVVNFX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJmZ1c2Vfc3VwZXJfb3BlcmF0aW9uczsKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisKKwlmaWxlID0gZmdldChkLmZkKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZmMgPSBnZXRfY29ubihmaWxlLCBzYik7CisJZnB1dChmaWxlKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmMpOworCisJZmMtPmZsYWdzID0gZC5mbGFnczsKKwlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKKwlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOworCWZjLT5tYXhfcmVhZCA9IGQubWF4X3JlYWQ7CisJaWYgKGZjLT5tYXhfcmVhZCAvIFBBR0VfQ0FDSEVfU0laRSA8IGZjLT5iZGkucmFfcGFnZXMpCisJCWZjLT5iZGkucmFfcGFnZXMgPSBmYy0+bWF4X3JlYWQgLyBQQUdFX0NBQ0hFX1NJWkU7CisJZmMtPm1heF93cml0ZSA9IEZVU0VfTUFYX0lOIC8gMjsKKworCWVyciA9IC1FTk9NRU07CisJcm9vdCA9IGdldF9yb290X2lub2RlKHNiLCBkLnJvb3Rtb2RlKTsKKwlpZiAocm9vdCA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCWdvdG8gZXJyOworCX0KKwlmdXNlX3NlbmRfaW5pdChmYyk7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWZ1c2VfcmVsZWFzZV9jb25uKGZjKTsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpmdXNlX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQkgICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgICAgICAgdm9pZCAqcmF3X2RhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgcmF3X2RhdGEsIGZ1c2VfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBmdXNlX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJmdXNlIiwKKwkuZ2V0X3NiCQk9IGZ1c2VfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZ1c2VfZnNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXNlX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCXByaW50aygiZnVzZTogZmFpbGVkIHRvIHJlZ2lzdGVyIGZpbGVzeXN0ZW1cbiIpOworCWVsc2UgeworCQlmdXNlX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmdXNlX2lub2RlIiwKKwkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZnVzZV9pbm9kZSksCisJCQkJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQkgICAgICBmdXNlX2lub2RlX2luaXRfb25jZSwgTlVMTCk7CisJCWlmICghZnVzZV9pbm9kZV9jYWNoZXApIHsKKwkJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9mc190eXBlKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2ZzX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGZ1c2VfaW5vZGVfY2FjaGVwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZnVzZV9pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCXByaW50aygiZnVzZSBpbml0IChBUEkgdmVyc2lvbiAlaS4laSlcbiIsCisJICAgICAgIEZVU0VfS0VSTkVMX1ZFUlNJT04sIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04pOworCisJc3Bpbl9sb2NrX2luaXQoJmZ1c2VfbG9jayk7CisJcmVzID0gZnVzZV9mc19pbml0KCk7CisJaWYgKHJlcykKKwkJZ290byBlcnI7CisKKwlyZXMgPSBmdXNlX2Rldl9pbml0KCk7CisJaWYgKHJlcykKKwkJZ290byBlcnJfZnNfY2xlYW51cDsKKworCXJldHVybiAwOworCisgZXJyX2ZzX2NsZWFudXA6CisJZnVzZV9mc19jbGVhbnVwKCk7CisgZXJyOgorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmdXNlX2V4aXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiZnVzZSBleGl0XG4iKTsKKworCWZ1c2VfZnNfY2xlYW51cCgpOworCWZ1c2VfZGV2X2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoZnVzZV9pbml0KTsKK21vZHVsZV9leGl0KGZ1c2VfZXhpdCk7CmRpZmYgLS1naXQgYS9mcy9oZnMvYm5vZGUuYyBiL2ZzL2hmcy9ibm9kZS5jCmluZGV4IGEwOTZjNWEuLjNkNWNkYzYgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9ibm9kZS5jCisrKyBiL2ZzL2hmcy9ibm9kZS5jCkBAIC0xMyw4ICsxMyw2IEBACiAKICNpbmNsdWRlICJidHJlZS5oIgogCi0jZGVmaW5lIFJFRl9QQUdFUwkwCi0KIHZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLAogCQlpbnQgb2ZmLCBpbnQgbGVuKQogewpAQCAtMjg5LDkgKzI4Nyw3IEBACiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KLSNpZiAhUkVGX1BBR0VTCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLSNlbmRpZgogCQlub2RlLT5wYWdlW2ldID0gcGFnZTsKIAl9CiAKQEAgLTQ0OSwxMyArNDQ1LDYgQEAKIHsKIAlpZiAobm9kZSkgewogCQlhdG9taWNfaW5jKCZub2RlLT5yZWZjbnQpOwotI2lmIFJFRl9QQUdFUwotCQl7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+dHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspCi0JCQlnZXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLQkJfQotI2VuZGlmCiAJCWRwcmludChEQkdfQk5PREVfUkVGUywgImdldF9ub2RlKCVkOiVkKTogJWRcbiIsCiAJCSAgICAgICBub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CiAJfQpAQCAtNDcyLDIwICs0NjEsMTIgQEAKIAkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKIAkJCUJVRygpOwotCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpIHsKLSNpZiBSRUZfUEFHRVMKLQkJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKLQkJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgorCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpCiAJCQlyZXR1cm47Ci0JCX0KIAkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CiAJCQlpZiAoIW5vZGUtPnBhZ2VbaV0pCiAJCQkJY29udGludWU7CiAJCQltYXJrX3BhZ2VfYWNjZXNzZWQobm9kZS0+cGFnZVtpXSk7Ci0jaWYgUkVGX1BBR0VTCi0JCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgogCQl9CiAKIAkJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpKSB7CmRpZmYgLS1naXQgYS9mcy9oZnMvY2F0YWxvZy5jIGIvZnMvaGZzL2NhdGFsb2cuYwppbmRleCA2NWRlZGVmLi4yZmNkNjc5IDEwMDY0NAotLS0gYS9mcy9oZnMvY2F0YWxvZy5jCisrKyBiL2ZzL2hmcy9jYXRhbG9nLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogICoKICAqIEdpdmVuIHRoZSBJRCBvZiB0aGUgcGFyZW50IGFuZCB0aGUgbmFtZSBidWlsZCBhIHNlYXJjaCBrZXkuCiAgKi8KLXZvaWQgaGZzX2NhdF9idWlsZF9rZXkoYnRyZWVfa2V5ICprZXksIHUzMiBwYXJlbnQsIHN0cnVjdCBxc3RyICpuYW1lKQordm9pZCBoZnNfY2F0X2J1aWxkX2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBidHJlZV9rZXkgKmtleSwgdTMyIHBhcmVudCwgc3RydWN0IHFzdHIgKm5hbWUpCiB7CiAJa2V5LT5jYXQucmVzZXJ2ZWQgPSAwOwogCWtleS0+Y2F0LlBhcklEID0gY3B1X3RvX2JlMzIocGFyZW50KTsKIAlpZiAobmFtZSkgewotCQloZnNfdHJpdjJtYWMoJmtleS0+Y2F0LkNOYW1lLCBuYW1lKTsKKwkJaGZzX2FzYzJtYWMoc2IsICZrZXktPmNhdC5DTmFtZSwgbmFtZSk7CiAJCWtleS0+a2V5X2xlbiA9IDYgKyBrZXktPmNhdC5DTmFtZS5sZW47CiAJfSBlbHNlIHsKIAkJbWVtc2V0KCZrZXktPmNhdC5DTmFtZSwgMCwgc2l6ZW9mKHN0cnVjdCBoZnNfbmFtZSkpOwpAQCAtNjIsMTMgKzYyLDE0IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGhmc19jYXRfYnVpbGRfdGhyZWFkKGhmc19jYXRfcmVjICpyZWMsIGludCB0eXBlLAorc3RhdGljIGludCBoZnNfY2F0X2J1aWxkX3RocmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCWhmc19jYXRfcmVjICpyZWMsIGludCB0eXBlLAogCQkJCXUzMiBwYXJlbnRpZCwgc3RydWN0IHFzdHIgKm5hbWUpCiB7CiAJcmVjLT50eXBlID0gdHlwZTsKIAltZW1zZXQocmVjLT50aHJlYWQucmVzZXJ2ZWQsIDAsIHNpemVvZihyZWMtPnRocmVhZC5yZXNlcnZlZCkpOwogCXJlYy0+dGhyZWFkLlBhcklEID0gY3B1X3RvX2JlMzIocGFyZW50aWQpOwotCWhmc190cml2Mm1hYygmcmVjLT50aHJlYWQuQ05hbWUsIG5hbWUpOworCWhmc19hc2MybWFjKHNiLCAmcmVjLT50aHJlYWQuQ05hbWUsIG5hbWUpOwogCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfdGhyZWFkKTsKIH0KIApAQCAtOTMsOCArOTQsOCBAQAogCXNiID0gZGlyLT5pX3NiOwogCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CiAKLQloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKLQllbnRyeV9zaXplID0gaGZzX2NhdF9idWlsZF90aHJlYWQoJmVudHJ5LCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8KKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJZW50cnlfc2l6ZSA9IGhmc19jYXRfYnVpbGRfdGhyZWFkKHNiLCAmZW50cnksIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPwogCQkJSEZTX0NEUl9USEQgOiBIRlNfQ0RSX0ZUSCwKIAkJCWRpci0+aV9pbm8sIHN0cik7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwpAQCAtMTA3LDcgKzEwOCw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnIyOwogCi0JaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKIAllbnRyeV9zaXplID0gaGZzX2NhdF9idWlsZF9yZWNvcmQoJmVudHJ5LCBjbmlkLCBpbm9kZSk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwogCWlmIChlcnIgIT0gLUVOT0VOVCkgewpAQCAtMTI3LDcgKzEyOCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycjE6Ci0JaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOwogCWlmICghaGZzX2JyZWNfZmluZCgmZmQpKQogCQloZnNfYnJlY19yZW1vdmUoJmZkKTsKIGVycjI6CkBAIC0xNzYsNyArMTc3LDcgQEAKIAloZnNfY2F0X3JlYyByZWM7CiAJaW50IHJlcywgbGVuLCB0eXBlOwogCi0JaGZzX2NhdF9idWlsZF9rZXkoZmQtPnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWhmc19jYXRfYnVpbGRfa2V5KHNiLCBmZC0+c2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CiAJcmVzID0gaGZzX2JyZWNfcmVhZChmZCwgJnJlYywgc2l6ZW9mKHJlYykpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CkBAIC0yMTEsNyArMjEyLDcgQEAKIAlzYiA9IGRpci0+aV9zYjsKIAloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmZmQpOwogCi0JaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKIAlyZXMgPSBoZnNfYnJlY19maW5kKCZmZCk7CiAJaWYgKHJlcykKIAkJZ290byBvdXQ7CkBAIC0yMzksNyArMjQwLDcgQEAKIAlpZiAocmVzKQogCQlnb3RvIG91dDsKIAotCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWhmc19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKIAlyZXMgPSBoZnNfYnJlY19maW5kKCZmZCk7CiAJaWYgKCFyZXMpIHsKIAkJcmVzID0gaGZzX2JyZWNfcmVtb3ZlKCZmZCk7CkBAIC0yODAsNyArMjgxLDcgQEAKIAlkc3RfZmQgPSBzcmNfZmQ7CiAKIAkvKiBmaW5kIHRoZSBvbGQgZGlyIGVudHJ5IGFuZCByZWFkIHRoZSBkYXRhICovCi0JaGZzX2NhdF9idWlsZF9rZXkoc3JjX2ZkLnNlYXJjaF9rZXksIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZSk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOwogCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yODksNyArMjkwLDcgQEAKIAkJCSAgICBzcmNfZmQuZW50cnlsZW5ndGgpOwogCiAJLyogY3JlYXRlIG5ldyBkaXIgZW50cnkgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgZW50cnkgKi8KLQloZnNfY2F0X2J1aWxkX2tleShkc3RfZmQuc2VhcmNoX2tleSwgZHN0X2Rpci0+aV9pbm8sIGRzdF9uYW1lKTsKKwloZnNfY2F0X2J1aWxkX2tleShzYiwgZHN0X2ZkLnNlYXJjaF9rZXksIGRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKIAlpZiAoZXJyICE9IC1FTk9FTlQpIHsKIAkJaWYgKCFlcnIpCkBAIC0zMDUsNyArMzA2LDcgQEAKIAltYXJrX2lub2RlX2RpcnR5KGRzdF9kaXIpOwogCiAJLyogZmluYWxseSByZW1vdmUgdGhlIG9sZCBlbnRyeSAqLwotCWhmc19jYXRfYnVpbGRfa2V5KHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOworCWhmc19jYXRfYnVpbGRfa2V5KHNiLCBzcmNfZmQuc2VhcmNoX2tleSwgc3JjX2Rpci0+aV9pbm8sIHNyY19uYW1lKTsKIAllcnIgPSBoZnNfYnJlY19maW5kKCZzcmNfZmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMzIxLDcgKzMyMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogcmVtb3ZlIG9sZCB0aHJlYWQgZW50cnkgKi8KLQloZnNfY2F0X2J1aWxkX2tleShzcmNfZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIHNyY19mZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKIAllcnIgPSBoZnNfYnJlY19maW5kKCZzcmNfZmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMzMwLDggKzMzMSw4IEBACiAJCWdvdG8gb3V0OwogCiAJLyogY3JlYXRlIG5ldyB0aHJlYWQgZW50cnkgKi8KLQloZnNfY2F0X2J1aWxkX2tleShkc3RfZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7Ci0JZW50cnlfc2l6ZSA9IGhmc19jYXRfYnVpbGRfdGhyZWFkKCZlbnRyeSwgdHlwZSA9PSBIRlNfQ0RSX0ZJTCA/IEhGU19DRFJfRlRIIDogSEZTX0NEUl9USEQsCisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIGRzdF9mZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwllbnRyeV9zaXplID0gaGZzX2NhdF9idWlsZF90aHJlYWQoc2IsICZlbnRyeSwgdHlwZSA9PSBIRlNfQ0RSX0ZJTCA/IEhGU19DRFJfRlRIIDogSEZTX0NEUl9USEQsCiAJCQkJCWRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKIAlpZiAoZXJyICE9IC1FTk9FTlQpIHsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9kaXIuYyBiL2ZzL2hmcy9kaXIuYwppbmRleCBjNTU5OTgyLi5lMWYyNGJlIDEwMDY0NAotLS0gYS9mcy9oZnMvZGlyLmMKKysrIGIvZnMvaGZzL2Rpci5jCkBAIC0yOCw3ICsyOCw3IEBACiAJZGVudHJ5LT5kX29wID0gJmhmc19kZW50cnlfb3BlcmF0aW9uczsKIAogCWhmc19maW5kX2luaXQoSEZTX1NCKGRpci0+aV9zYiktPmNhdF90cmVlLCAmZmQpOwotCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CisJaGZzX2NhdF9idWlsZF9rZXkoZGlyLT5pX3NiLCBmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCAmZGVudHJ5LT5kX25hbWUpOwogCXJlcyA9IGhmc19icmVjX3JlYWQoJmZkLCAmcmVjLCBzaXplb2YocmVjKSk7CiAJaWYgKHJlcykgewogCQloZnNfZmluZF9leGl0KCZmZCk7CkBAIC01Niw3ICs1Niw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlpbnQgbGVuLCBlcnI7Ci0JY2hhciBzdHJidWZbSEZTX05BTUVMRU4gKyAxXTsKKwljaGFyIHN0cmJ1ZltIRlNfTUFYX05BTUVMRU5dOwogCXVuaW9uIGhmc19jYXRfcmVjIGVudHJ5OwogCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOwogCXN0cnVjdCBoZnNfcmVhZGRpcl9kYXRhICpyZDsKQEAgLTY2LDcgKzY2LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmZmQpOwotCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgTlVMTCk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgTlVMTCk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMTExLDcgKzExMSw3IEBACiAJCX0KIAkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsIGZkLmVudHJ5bGVuZ3RoKTsKIAkJdHlwZSA9IGVudHJ5LnR5cGU7Ci0JCWxlbiA9IGhmc19tYWMydHJpdihzdHJidWYsICZmZC5rZXktPmNhdC5DTmFtZSk7CisJCWxlbiA9IGhmc19tYWMyYXNjKHNiLCBzdHJidWYsICZmZC5rZXktPmNhdC5DTmFtZSk7CiAJCWlmICh0eXBlID09IEhGU19DRFJfRElSKSB7CiAJCQlpZiAoZmQuZW50cnlsZW5ndGggPCBzaXplb2Yoc3RydWN0IGhmc19jYXRfZGlyKSkgewogCQkJCXByaW50aygiSEZTOiBzbWFsbCBkaXIgZW50cnlcbiIpOwpAQCAtMzA3LDcgKzMwNyw4IEBACiAJCQkgICBvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLAogCQkJICAgbmV3X2RpciwgJm5ld19kZW50cnktPmRfbmFtZSk7CiAJaWYgKCFyZXMpCi0JCWhmc19jYXRfYnVpbGRfa2V5KChidHJlZV9rZXkgKikmSEZTX0kob2xkX2RlbnRyeS0+ZF9pbm9kZSktPmNhdF9rZXksCisJCWhmc19jYXRfYnVpbGRfa2V5KG9sZF9kaXItPmlfc2IsCisJCQkJICAoYnRyZWVfa2V5ICopJkhGU19JKG9sZF9kZW50cnktPmRfaW5vZGUpLT5jYXRfa2V5LAogCQkJCSAgbmV3X2Rpci0+aV9pbm8sICZuZXdfZGVudHJ5LT5kX25hbWUpOwogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9mcy9oZnMvaGZzLmggYi9mcy9oZnMvaGZzLmgKaW5kZXggZGY2YjMzYS4uODgwOTlhYiAxMDA2NDQKLS0tIGEvZnMvaGZzL2hmcy5oCisrKyBiL2ZzL2hmcy9oZnMuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBIRlNfU0VDVE9SX1NJWkUJCTUxMiAgICAvKiBzaXplIG9mIGFuIEhGUyBzZWN0b3IgKi8KICNkZWZpbmUgSEZTX1NFQ1RPUl9TSVpFX0JJVFMJOSAgICAgIC8qIGxvZ18yKEhGU19TRUNUT1JfU0laRSkgKi8KICNkZWZpbmUgSEZTX05BTUVMRU4JCTMxICAgICAvKiBtYXhpbXVtIGxlbmd0aCBvZiBhbiBIRlMgZmlsZW5hbWUgKi8KKyNkZWZpbmUgSEZTX01BWF9OQU1FTEVOCQkxMjgKICNkZWZpbmUgSEZTX01BWF9WQUxFTkNFCQkzMjc2N1UKIAogLyogTWVhbmluZ3Mgb2YgdGhlIGRyQXRyYiBmaWVsZCBvZiB0aGUgTURCLApkaWZmIC0tZ2l0IGEvZnMvaGZzL2hmc19mcy5oIGIvZnMvaGZzL2hmc19mcy5oCmluZGV4IDBkYzhlZjguLmFhZTAxOWEgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9oZnNfZnMuaAorKysgYi9mcy9oZnMvaGZzX2ZzLmgKQEAgLTE0MSw2ICsxNDEsOCBAQAogCiAJaW50IHNlc3Npb24sIHBhcnQ7CiAKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfaW8sICpubHNfZGlzazsKKwogCXN0cnVjdCBzZW1hcGhvcmUgYml0bWFwX2xvY2s7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTY4LDcgKzE3MCw3IEBACiBleHRlcm4gaW50IGhmc19jYXRfZGVsZXRlKHUzMiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICopOwogZXh0ZXJuIGludCBoZnNfY2F0X21vdmUodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKiwKIAkJCXN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqKTsKLWV4dGVybiB2b2lkIGhmc19jYXRfYnVpbGRfa2V5KGJ0cmVlX2tleSAqLCB1MzIsIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIHZvaWQgaGZzX2NhdF9idWlsZF9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGJ0cmVlX2tleSAqLCB1MzIsIHN0cnVjdCBxc3RyICopOwogCiAvKiBkaXIuYyAqLwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2Rpcl9vcGVyYXRpb25zOwpAQCAtMjIyLDggKzIyNCw4IEBACiBleHRlcm4gaW50IGhmc19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOwogCiAvKiB0cmFucy5jICovCi1leHRlcm4gdm9pZCBoZnNfdHJpdjJtYWMoc3RydWN0IGhmc19uYW1lICosIHN0cnVjdCBxc3RyICopOwotZXh0ZXJuIGludCBoZnNfbWFjMnRyaXYoY2hhciAqLCBjb25zdCBzdHJ1Y3QgaGZzX25hbWUgKik7CitleHRlcm4gdm9pZCBoZnNfYXNjMm1hYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGhmc19uYW1lICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIGludCBoZnNfbWFjMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY2hhciAqLCBjb25zdCBzdHJ1Y3QgaGZzX25hbWUgKik7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwogCmRpZmYgLS1naXQgYS9mcy9oZnMvaW5vZGUuYyBiL2ZzL2hmcy9pbm9kZS5jCmluZGV4IDc1MTkxMjMuLmYxNTcwYjkgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9pbm9kZS5jCisrKyBiL2ZzL2hmcy9pbm9kZS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCWluaXRfTVVURVgoJkhGU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmSEZTX0koaW5vZGUpLT5vcGVuX2Rpcl9saXN0KTsKLQloZnNfY2F0X2J1aWxkX2tleSgoYnRyZWVfa2V5ICopJkhGU19JKGlub2RlKS0+Y2F0X2tleSwgZGlyLT5pX2lubywgbmFtZSk7CisJaGZzX2NhdF9idWlsZF9rZXkoc2IsIChidHJlZV9rZXkgKikmSEZTX0koaW5vZGUpLT5jYXRfa2V5LCBkaXItPmlfaW5vLCBuYW1lKTsKIAlpbm9kZS0+aV9pbm8gPSBIRlNfU0Ioc2IpLT5uZXh0X2lkKys7CiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CmRpZmYgLS1naXQgYS9mcy9oZnMvbWRiLmMgYi9mcy9oZnMvbWRiLmMKaW5kZXggMjE3ZTMyZi4uMGE0NzNmNyAxMDA2NDQKLS0tIGEvZnMvaGZzL21kYi5jCisrKyBiL2ZzL2hmcy9tZGIuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgogCiAjaW5jbHVkZSAiaGZzX2ZzLmgiCiAjaW5jbHVkZSAiYnRyZWUuaCIKQEAgLTM0Myw2ICszNDQsMTEgQEAKIAlicmVsc2UoSEZTX1NCKHNiKS0+bWRiX2JoKTsKIAlicmVsc2UoSEZTX1NCKHNiKS0+YWx0X21kYl9iaCk7CiAKKwlpZiAoSEZTX1NCKHNiKS0+bmxzX2lvKQorCQl1bmxvYWRfbmxzKEhGU19TQihzYiktPm5sc19pbyk7CisJaWYgKEhGU19TQihzYiktPm5sc19kaXNrKQorCQl1bmxvYWRfbmxzKEhGU19TQihzYiktPm5sc19kaXNrKTsKKwogCWtmcmVlKEhGU19TQihzYikpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL3N1cGVyLmMgYi9mcy9oZnMvc3VwZXIuYwppbmRleCBhYjc4M2Y2Li5jNTA3NGFlIDEwMDY0NAotLS0gYS9mcy9oZnMvc3VwZXIuYworKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMTUsOCArMTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogCiAjaW5jbHVkZSAiaGZzX2ZzLmgiCkBAIC0xMTEsNiArMTE0LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaGZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IGhmc19zYl9pbmZvICpzYmkgPSBIRlNfU0IobW50LT5tbnRfc2IpOworCisJaWYgKHNiaS0+c19jcmVhdG9yICE9IGNwdV90b19iZTMyKDB4M2YzZjNmM2YpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixjcmVhdG9yPSUuNHMiLCAoY2hhciAqKSZzYmktPnNfY3JlYXRvcik7CisJaWYgKHNiaS0+c190eXBlICE9IGNwdV90b19iZTMyKDB4M2YzZjNmM2YpKQorCQlzZXFfcHJpbnRmKHNlcSwgIix0eXBlPSUuNHMiLCAoY2hhciAqKSZzYmktPnNfdHlwZSk7CisJc2VxX3ByaW50ZihzZXEsICIsdWlkPSV1LGdpZD0ldSIsIHNiaS0+c191aWQsIHNiaS0+c19naWQpOworCWlmIChzYmktPnNfZmlsZV91bWFzayAhPSAwMTMzKQorCQlzZXFfcHJpbnRmKHNlcSwgIixmaWxlX3VtYXNrPSVvIiwgc2JpLT5zX2ZpbGVfdW1hc2spOworCWlmIChzYmktPnNfZGlyX3VtYXNrICE9IDAwMjIpCisJCXNlcV9wcmludGYoc2VxLCAiLGRpcl91bWFzaz0lbyIsIHNiaS0+c19kaXJfdW1hc2spOworCWlmIChzYmktPnBhcnQgPj0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIscGFydD0ldSIsIHNiaS0+cGFydCk7CisJaWYgKHNiaS0+c2Vzc2lvbiA+PSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIixzZXNzaW9uPSV1Iiwgc2JpLT5zZXNzaW9uKTsKKwlpZiAoc2JpLT5ubHNfZGlzaykKKwkJc2VxX3ByaW50ZihzZXEsICIsY29kZXBhZ2U9JXMiLCBzYmktPm5sc19kaXNrLT5jaGFyc2V0KTsKKwlpZiAoc2JpLT5ubHNfaW8pCisJCXNlcV9wcmludGYoc2VxLCAiLGlvY2hhcnNldD0lcyIsIHNiaS0+bmxzX2lvLT5jaGFyc2V0KTsKKwlpZiAoc2JpLT5zX3F1aWV0KQorCQlzZXFfcHJpbnRmKHNlcSwgIixxdWlldCIpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlub2RlICpoZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgaGZzX2lub2RlX2luZm8gKmk7CkBAIC0xMzMsMTEgKzE2MiwxMyBAQAogCS53cml0ZV9zdXBlcgk9IGhmc193cml0ZV9zdXBlciwKIAkuc3RhdGZzCQk9IGhmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMgICAgID0gaGZzX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucwk9IGhmc19zaG93X29wdGlvbnMsCiB9OwogCiBlbnVtIHsKIAlvcHRfdWlkLCBvcHRfZ2lkLCBvcHRfdW1hc2ssIG9wdF9maWxlX3VtYXNrLCBvcHRfZGlyX3VtYXNrLAogCW9wdF9wYXJ0LCBvcHRfc2Vzc2lvbiwgb3B0X3R5cGUsIG9wdF9jcmVhdG9yLCBvcHRfcXVpZXQsCisJb3B0X2NvZGVwYWdlLCBvcHRfaW9jaGFyc2V0LAogCW9wdF9lcnIKIH07CiAKQEAgLTE1Miw2ICsxODMsOCBAQAogCXsgb3B0X3R5cGUsICJ0eXBlPSVzIiB9LAogCXsgb3B0X2NyZWF0b3IsICJjcmVhdG9yPSVzIiB9LAogCXsgb3B0X3F1aWV0LCAicXVpZXQiIH0sCisJeyBvcHRfY29kZXBhZ2UsICJjb2RlcGFnZT0lcyIgfSwKKwl7IG9wdF9pb2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMiIH0sCiAJeyBvcHRfZXJyLCBOVUxMIH0KIH07CiAKQEAgLTI1NywxMSArMjkwLDQ2IEBACiAJCWNhc2Ugb3B0X3F1aWV0OgogCQkJaHNiLT5zX3F1aWV0ID0gMTsKIAkJCWJyZWFrOworCQljYXNlIG9wdF9jb2RlcGFnZToKKwkJCWlmIChoc2ItPm5sc19kaXNrKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gY2hhbmdlIGNvZGVwYWdlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXAgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaHNiLT5ubHNfZGlzayA9IGxvYWRfbmxzKHApOworCQkJaWYgKCFoc2ItPm5sc19kaXNrKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gbG9hZCBjb2RlcGFnZSBcIiVzXCJcbiIsIHApOworCQkJCWtmcmVlKHApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJa2ZyZWUocCk7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfaW9jaGFyc2V0OgorCQkJaWYgKGhzYi0+bmxzX2lvKSB7CisJCQkJcHJpbnRrKCJIRlM6IHVuYWJsZSB0byBjaGFuZ2UgaW9jaGFyc2V0XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXAgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaHNiLT5ubHNfaW8gPSBsb2FkX25scyhwKTsKKwkJCWlmICghaHNiLT5ubHNfaW8pIHsKKwkJCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGxvYWQgaW9jaGFyc2V0IFwiJXNcIlxuIiwgcCk7CisJCQkJa2ZyZWUocCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlrZnJlZShwKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKKwlpZiAoaHNiLT5ubHNfZGlzayAmJiAhaHNiLT5ubHNfaW8pIHsKKwkJaHNiLT5ubHNfaW8gPSBsb2FkX25sc19kZWZhdWx0KCk7CisJCWlmICghaHNiLT5ubHNfaW8pIHsKKwkJCXByaW50aygiSEZTOiB1bmFibGUgdG8gbG9hZCBkZWZhdWx0IGlvY2hhcnNldFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KIAloc2ItPnNfZGlyX3VtYXNrICY9IDA3Nzc7CiAJaHNiLT5zX2ZpbGVfdW1hc2sgJj0gMDU3NzsKIApkaWZmIC0tZ2l0IGEvZnMvaGZzL3RyYW5zLmMgYi9mcy9oZnMvdHJhbnMuYwppbmRleCBmYjk3MjBhLi5lNjczYTg4IDEwMDY0NAotLS0gYS9mcy9oZnMvdHJhbnMuYworKysgYi9mcy9oZnMvdHJhbnMuYwpAQCAtOSwxMiArOSwxNSBAQAogICogd2l0aCAnOicgdnMuICcvJyBhcyB0aGUgcGF0aC1lbGVtZW50IHNlcGFyYXRvci4KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKwogI2luY2x1ZGUgImhmc19mcy5oIgogCiAvKj09PT09PT09PT09PT09PT0gR2xvYmFsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09Ki8KIAogLyoKLSAqIGhmc19tYWMydHJpdigpCisgKiBoZnNfbWFjMmFzYygpCiAgKgogICogR2l2ZW4gYSAnUGFzY2FsIFN0cmluZycgKGEgc3RyaW5nIHByZWNlZGVkIGJ5IGEgbGVuZ3RoIGJ5dGUpIGluCiAgKiB0aGUgTWFjaW50b3NoIGNoYXJhY3RlciBzZXQgcHJvZHVjZSB0aGUgY29ycmVzcG9uZGluZyBmaWxlbmFtZSB1c2luZwpAQCAtMjcsMjMgKzMwLDU4IEBACiAgKiBieSAnOicgd2hpY2ggbmV2ZXIgYXBwZWFycyBpbiBIRlMgZmlsZW5hbWVzLgkgQWxsIG90aGVyIGNoYXJhY3RlcnMKICAqIGFyZSBwYXNzZWQgdW5jaGFuZ2VkIGZyb20gaW5wdXQgdG8gb3V0cHV0LgogICovCi1pbnQgaGZzX21hYzJ0cml2KGNoYXIgKm91dCwgY29uc3Qgc3RydWN0IGhmc19uYW1lICppbikKK2ludCBoZnNfbWFjMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvdXQsIGNvbnN0IHN0cnVjdCBoZnNfbmFtZSAqaW4pCiB7Ci0JY29uc3QgY2hhciAqcDsKLQljaGFyIGM7Ci0JaW50IGksIGxlbjsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfZGlzayA9IEhGU19TQihzYiktPm5sc19kaXNrOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19pbyA9IEhGU19TQihzYiktPm5sc19pbzsKKwljb25zdCBjaGFyICpzcmM7CisJY2hhciAqZHN0OworCWludCBzcmNsZW4sIGRzdGxlbiwgc2l6ZTsKIAotCWxlbiA9IGluLT5sZW47Ci0JcCA9IGluLT5uYW1lOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQljID0gKnArKzsKLQkJKm91dCsrID0gYyA9PSAnLycgPyAnOicgOiBjOworCXNyYyA9IGluLT5uYW1lOworCXNyY2xlbiA9IGluLT5sZW47CisJZHN0ID0gb3V0OworCWRzdGxlbiA9IEhGU19NQVhfTkFNRUxFTjsKKwlpZiAobmxzX2lvKSB7CisJCXdjaGFyX3QgY2g7CisKKwkJd2hpbGUgKHNyY2xlbiA+IDApIHsKKwkJCWlmIChubHNfZGlzaykgeworCQkJCXNpemUgPSBubHNfZGlzay0+Y2hhcjJ1bmkoc3JjLCBzcmNsZW4sICZjaCk7CisJCQkJaWYgKHNpemUgPD0gMCkgeworCQkJCQljaCA9ICc/JzsKKwkJCQkJc2l6ZSA9IDE7CisJCQkJfQorCQkJCXNyYyArPSBzaXplOworCQkJCXNyY2xlbiAtPSBzaXplOworCQkJfSBlbHNlIHsKKwkJCQljaCA9ICpzcmMrKzsKKwkJCQlzcmNsZW4tLTsKKwkJCX0KKwkJCWlmIChjaCA9PSAnLycpCisJCQkJY2ggPSAnOic7CisJCQlzaXplID0gbmxzX2lvLT51bmkyY2hhcihjaCwgZHN0LCBkc3RsZW4pOworCQkJaWYgKHNpemUgPCAwKSB7CisJCQkJaWYgKHNpemUgPT0gLUVOQU1FVE9PTE9ORykKKwkJCQkJZ290byBvdXQ7CisJCQkJKmRzdCA9ICc/JzsKKwkJCQlzaXplID0gMTsKKwkJCX0KKwkJCWRzdCArPSBzaXplOworCQkJZHN0bGVuIC09IHNpemU7CisJCX0KKwl9IGVsc2UgeworCQljaGFyIGNoOworCisJCXdoaWxlICgtLXNyY2xlbiA+PSAwKQorCQkJKmRzdCsrID0gKGNoID0gKnNyYysrKSA9PSAnLycgPyAnOicgOiBjaDsKIAl9Ci0JcmV0dXJuIGk7CitvdXQ6CisJcmV0dXJuIGRzdCAtIG91dDsKIH0KIAogLyoKLSAqIGhmc190cml2Mm1hYygpCisgKiBoZnNfYXNjMm1hYygpCiAgKgogICogR2l2ZW4gYW4gQVNDSUkgc3RyaW5nIChub3QgbnVsbC10ZXJtaW5hdGVkKSBhbmQgaXRzIGxlbmd0aCwKICAqIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVuYW1lIGluIHRoZSBNYWNpbnRvc2ggY2hhcmFjdGVyIHNldApAQCAtNTQsMTkgKzkyLDU3IEBACiAgKiBUaGlzIHJvdXRpbmUgaXMgYSBpbnZlcnNlIHRvIGhmc19tYWMydHJpdigpLgogICogQSAnOicgaXMgcmVwbGFjZWQgYnkgYSAnLycuCiAgKi8KLXZvaWQgaGZzX3RyaXYybWFjKHN0cnVjdCBoZnNfbmFtZSAqb3V0LCBzdHJ1Y3QgcXN0ciAqaW4pCit2b2lkIGhmc19hc2MybWFjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBoZnNfbmFtZSAqb3V0LCBzdHJ1Y3QgcXN0ciAqaW4pCiB7CisJc3RydWN0IG5sc190YWJsZSAqbmxzX2Rpc2sgPSBIRlNfU0Ioc2IpLT5ubHNfZGlzazsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfaW8gPSBIRlNfU0Ioc2IpLT5ubHNfaW87CiAJY29uc3QgY2hhciAqc3JjOwotCWNoYXIgKmRzdCwgYzsKLQlpbnQgaSwgbGVuOworCWNoYXIgKmRzdDsKKwlpbnQgc3JjbGVuLCBkc3RsZW4sIHNpemU7CiAKLQlvdXQtPmxlbiA9IGxlbiA9IG1pbigodW5zaWduZWQgaW50KUhGU19OQU1FTEVOLCBpbi0+bGVuKTsKIAlzcmMgPSBpbi0+bmFtZTsKKwlzcmNsZW4gPSBpbi0+bGVuOwogCWRzdCA9IG91dC0+bmFtZTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJYyA9ICpzcmMrKzsKLQkJKmRzdCsrID0gYyA9PSAnOicgPyAnLycgOiBjOworCWRzdGxlbiA9IEhGU19OQU1FTEVOOworCWlmIChubHNfaW8pIHsKKwkJd2NoYXJfdCBjaDsKKworCQl3aGlsZSAoc3JjbGVuID4gMCkgeworCQkJc2l6ZSA9IG5sc19pby0+Y2hhcjJ1bmkoc3JjLCBzcmNsZW4sICZjaCk7CisJCQlpZiAoc2l6ZSA8IDApIHsKKwkJCQljaCA9ICc/JzsKKwkJCQlzaXplID0gMTsKKwkJCX0KKwkJCXNyYyArPSBzaXplOworCQkJc3JjbGVuIC09IHNpemU7CisJCQlpZiAoY2ggPT0gJzonKQorCQkJCWNoID0gJy8nOworCQkJaWYgKG5sc19kaXNrKSB7CisJCQkJc2l6ZSA9IG5sc19kaXNrLT51bmkyY2hhcihjaCwgZHN0LCBkc3RsZW4pOworCQkJCWlmIChzaXplIDwgMCkgeworCQkJCQlpZiAoc2l6ZSA9PSAtRU5BTUVUT09MT05HKQorCQkJCQkJZ290byBvdXQ7CisJCQkJCSpkc3QgPSAnPyc7CisJCQkJCXNpemUgPSAxOworCQkJCX0KKwkJCQlkc3QgKz0gc2l6ZTsKKwkJCQlkc3RsZW4gLT0gc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJKmRzdCsrID0gY2ggPiAweGZmID8gJz8nIDogY2g7CisJCQkJZHN0bGVuLS07CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQljaGFyIGNoOworCisJCWlmIChkc3RsZW4gPiBzcmNsZW4pCisJCQlkc3RsZW4gPSBzcmNsZW47CisJCXdoaWxlICgtLWRzdGxlbiA+PSAwKQorCQkJKmRzdCsrID0gKGNoID0gKnNyYysrKSA9PSAnOicgPyAnLycgOiBjaDsKIAl9Ci0JZm9yICg7IGkgPCBIRlNfTkFNRUxFTjsgaSsrKQorb3V0OgorCW91dC0+bGVuID0gZHN0IC0gKGNoYXIgKilvdXQtPm5hbWU7CisJZHN0bGVuID0gSEZTX05BTUVMRU4gLSBvdXQtPmxlbjsKKwl3aGlsZSAoLS1kc3RsZW4gPj0gMCkKIAkJKmRzdCsrID0gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYm5vZGUuYyBiL2ZzL2hmc3BsdXMvYm5vZGUuYwppbmRleCA4ODY4ZDNiLi5iODVhYmM2IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2Jub2RlLmMKKysrIGIvZnMvaGZzcGx1cy9ibm9kZS5jCkBAIC0xOCw4ICsxOCw2IEBACiAjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgogI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCiAKLSNkZWZpbmUgUkVGX1BBR0VTCTAKLQogLyogQ29weSBhIHNwZWNpZmllZCByYW5nZSBvZiBieXRlcyBmcm9tIHRoZSByYXcgZGF0YSBvZiBhIG5vZGUgKi8KIHZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogewpAQCAtNDUwLDkgKzQ0OCw3IEBACiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KLSNpZiAhUkVGX1BBR0VTCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLSNlbmRpZgogCQlub2RlLT5wYWdlW2ldID0gcGFnZTsKIAl9CiAKQEAgLTYxMiwxMyArNjA4LDYgQEAKIHsKIAlpZiAobm9kZSkgewogCQlhdG9taWNfaW5jKCZub2RlLT5yZWZjbnQpOwotI2lmIFJFRl9QQUdFUwotCQl7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+dHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspCi0JCQlnZXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLQkJfQotI2VuZGlmCiAJCWRwcmludChEQkdfQk5PREVfUkVGUywgImdldF9ub2RlKCVkOiVkKTogJWRcbiIsCiAJCSAgICAgICBub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CiAJfQpAQCAtNjM1LDIwICs2MjQsMTIgQEAKIAkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKIAkJCUJVRygpOwotCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpIHsKLSNpZiBSRUZfUEFHRVMKLQkJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKLQkJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgorCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpCiAJCQlyZXR1cm47Ci0JCX0KIAkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CiAJCQlpZiAoIW5vZGUtPnBhZ2VbaV0pCiAJCQkJY29udGludWU7CiAJCQltYXJrX3BhZ2VfYWNjZXNzZWQobm9kZS0+cGFnZVtpXSk7Ci0jaWYgUkVGX1BBR0VTCi0JCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKLSNlbmRpZgogCQl9CiAKIAkJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpKSB7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaCBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCmluZGV4IDUzMzA5NGE1Li4yYmMwY2RkIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaAorKysgYi9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaApAQCAtMzQzLDggKzM0Myw5IEBACiBzc2l6ZV90IGhmc3BsdXNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKIC8qIG9wdGlvbnMuYyAqLwotaW50IHBhcnNlX29wdGlvbnMoY2hhciAqLCBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICopOwotdm9pZCBmaWxsX2RlZmF1bHRzKHN0cnVjdCBoZnNwbHVzX3NiX2luZm8gKik7CitpbnQgaGZzcGx1c19wYXJzZV9vcHRpb25zKGNoYXIgKiwgc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKTsKK3ZvaWQgaGZzcGx1c19maWxsX2RlZmF1bHRzKHN0cnVjdCBoZnNwbHVzX3NiX2luZm8gKik7CitpbnQgaGZzcGx1c19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAogLyogdGFibGVzLmMgKi8KIGV4dGVybiB1MTYgaGZzcGx1c19jYXNlX2ZvbGRfdGFibGVbXTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvb3B0aW9ucy5jIGIvZnMvaGZzcGx1cy9vcHRpb25zLmMKaW5kZXggMWNjYTAxMC4uY2NhMDgxOCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9vcHRpb25zLmMKKysrIGIvZnMvaGZzcGx1cy9vcHRpb25zLmMKQEAgLTEzLDYgKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCiAKIGVudW0gewpAQCAtMzgsNyArNDAsNyBAQAogfTsKIAogLyogSW5pdGlhbGl6ZSBhbiBvcHRpb25zIG9iamVjdCB0byByZWFzb25hYmxlIGRlZmF1bHRzICovCi12b2lkIGZpbGxfZGVmYXVsdHMoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqb3B0cykKK3ZvaWQgaGZzcGx1c19maWxsX2RlZmF1bHRzKHN0cnVjdCBoZnNwbHVzX3NiX2luZm8gKm9wdHMpCiB7CiAJaWYgKCFvcHRzKQogCQlyZXR1cm47CkBAIC02Myw3ICs2NSw3IEBACiAKIC8qIFBhcnNlIG9wdGlvbnMgZnJvbSBtb3VudC4gUmV0dXJucyAwIG9uIGZhaWx1cmUgKi8KIC8qIGlucHV0IGlzIHRoZSBvcHRpb25zIHBhc3NlZCB0byBtb3VudCgpIGFzIGEgc3RyaW5nICovCi1pbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICppbnB1dCwgc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqc2JpKQoraW50IGhmc3BsdXNfcGFyc2Vfb3B0aW9ucyhjaGFyICppbnB1dCwgc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqc2JpKQogewogCWNoYXIgKnA7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwpAQCAtMTYwLDMgKzE2MiwyMyBAQAogCiAJcmV0dXJuIDE7CiB9CisKK2ludCBoZnNwbHVzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqc2JpID0gJkhGU1BMVVNfU0IobW50LT5tbnRfc2IpOworCisJaWYgKHNiaS0+Y3JlYXRvciAhPSBIRlNQTFVTX0RFRl9DUl9UWVBFKQorCQlzZXFfcHJpbnRmKHNlcSwgIixjcmVhdG9yPSUuNHMiLCAoY2hhciAqKSZzYmktPmNyZWF0b3IpOworCWlmIChzYmktPnR5cGUgIT0gSEZTUExVU19ERUZfQ1JfVFlQRSkKKwkJc2VxX3ByaW50ZihzZXEsICIsdHlwZT0lLjRzIiwgKGNoYXIgKikmc2JpLT50eXBlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIix1bWFzaz0lbyx1aWQ9JXUsZ2lkPSV1Iiwgc2JpLT51bWFzaywgc2JpLT51aWQsIHNiaS0+Z2lkKTsKKwlpZiAoc2JpLT5wYXJ0ID49IDApCisJCXNlcV9wcmludGYoc2VxLCAiLHBhcnQ9JXUiLCBzYmktPnBhcnQpOworCWlmIChzYmktPnNlc3Npb24gPj0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIsc2Vzc2lvbj0ldSIsIHNiaS0+c2Vzc2lvbik7CisJaWYgKHNiaS0+bmxzKQorCQlzZXFfcHJpbnRmKHNlcSwgIixubHM9JXMiLCBzYmktPm5scy0+Y2hhcnNldCk7CisJaWYgKHNiaS0+ZmxhZ3MgJiBIRlNQTFVTX1NCX05PREVDT01QT1NFKQorCQlzZXFfcHJpbnRmKHNlcSwgIixub2RlY29tcG9zZSIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9zdXBlci5jIGIvZnMvaGZzcGx1cy9zdXBlci5jCmluZGV4IGQ1NWFkNjcuLmZkMGYwZjAgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvc3VwZXIuYworKysgYi9mcy9oZnNwbHVzL3N1cGVyLmMKQEAgLTIxNyw4ICsyMTcsNyBAQAogCQl2aGRyLT5hdHRyaWJ1dGVzIHw9IGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX1VOTU5UKTsKIAkJdmhkci0+YXR0cmlidXRlcyAmPSBjcHVfdG9fYmUzMih+SEZTUExVU19WT0xfSU5DTlNUTlQpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eShIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOwotCQlsbF9yd19ibG9jayhXUklURSwgMSwgJkhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7Ci0JCXdhaXRfb25fYnVmZmVyKEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CiAJfQogCiAJaGZzX2J0cmVlX2Nsb3NlKEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlKTsKQEAgLTI3Nyw2ICsyNzYsNyBAQAogCS53cml0ZV9zdXBlcgk9IGhmc3BsdXNfd3JpdGVfc3VwZXIsCiAJLnN0YXRmcwkJPSBoZnNwbHVzX3N0YXRmcywKIAkucmVtb3VudF9mcwk9IGhmc3BsdXNfcmVtb3VudCwKKwkuc2hvd19vcHRpb25zCT0gaGZzcGx1c19zaG93X29wdGlvbnMsCiB9OwogCiBzdGF0aWMgaW50IGhmc3BsdXNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQpAQCAtMjk3LDggKzI5Nyw4IEBACiAJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKEhGU1BMVVNfU0Ioc2IpKSk7CiAJc2ItPnNfZnNfaW5mbyA9IHNiaTsKIAlJTklUX0hMSVNUX0hFQUQoJnNiaS0+cnNyY19pbm9kZXMpOwotCWZpbGxfZGVmYXVsdHMoc2JpKTsKLQlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2JpKSkgeworCWhmc3BsdXNfZmlsbF9kZWZhdWx0cyhzYmkpOworCWlmICghaGZzcGx1c19wYXJzZV9vcHRpb25zKGRhdGEsIHNiaSkpIHsKIAkJaWYgKCFzaWxlbnQpCiAJCQlwcmludGsoIkhGUystZnM6IHVuYWJsZSB0byBwYXJzZSBtb3VudCBvcHRpb25zXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTQxNSw4ICs0MTUsNyBAQAogCXZoZHItPmF0dHJpYnV0ZXMgJj0gY3B1X3RvX2JlMzIofkhGU1BMVVNfVk9MX1VOTU5UKTsKIAl2aGRyLT5hdHRyaWJ1dGVzIHw9IGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX0lOQ05TVE5UKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOwotCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmSEZTUExVU19TQihzYikuc192aGJoKTsKLQl3YWl0X29uX2J1ZmZlcihIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCXN5bmNfZGlydHlfYnVmZmVyKEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CiAKIAlpZiAoIUhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIpIHsKIAkJcHJpbnRrKCJIRlMrOiBjcmVhdGUgaGlkZGVuIGRpci4uLlxuIik7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzLmggYi9mcy9ob3N0ZnMvaG9zdGZzLmgKaW5kZXggNjdiY2EwZC4uY2NhM2ZiNiAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmcy5oCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnMuaApAQCAtNDksNyArNDksNiBAQAogCXN0cnVjdCB0aW1lc3BlYwlpYV9hdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMJaWFfbXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCWlhX2N0aW1lOwotCXVuc2lnbmVkIGludAlpYV9hdHRyX2ZsYWdzOwogfTsKIAogZXh0ZXJuIGludCBzdGF0X2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBsb25nICppbm9kZV9vdXQsCmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCmluZGV4IGIyZDE4MjAuLjU5YzUwNjIgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCkBAIC0yODQsNiArMjg0LDcgQEAKIAogc3RhdGljIHZvaWQgaG9zdGZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAlpZihIT1NURlNfSShpbm9kZSktPmZkICE9IC0xKSB7CiAJCWNsb3NlX2ZpbGUoJkhPU1RGU19JKGlub2RlKS0+ZmQpOwogCQlIT1NURlNfSShpbm9kZSktPmZkID0gLTE7CmRpZmYgLS1naXQgYS9mcy9ocGZzL2lub2RlLmMgYi9mcy9ocGZzL2lub2RlLmMKaW5kZXggMzhiMTc0MS4uZTNkMTdlOSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9pbm9kZS5jCisrKyBiL2ZzL2hwZnMvaW5vZGUuYwpAQCAtMjg0LDYgKzI4NCw3IEBACiAKIHZvaWQgaHBmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJbG9ja19rZXJuZWwoKTsKIAlocGZzX3JlbW92ZV9mbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vKTsKIAl1bmxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCBlNTdmMTcyLi5mODBhNzlmIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTEwMzQsMTkgKzEwMzQsMjEgQEAKIAlpbm9kZXNfc3RhdC5ucl9pbm9kZXMtLTsKIAlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiAKLQlpZiAoaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKQotCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7Ci0KIAlzZWN1cml0eV9pbm9kZV9kZWxldGUoaW5vZGUpOwogCiAJaWYgKG9wLT5kZWxldGVfaW5vZGUpIHsKIAkJdm9pZCAoKmRlbGV0ZSkoc3RydWN0IGlub2RlICopID0gb3AtPmRlbGV0ZV9pbm9kZTsKIAkJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpKQogCQkJRFFVT1RfSU5JVChpbm9kZSk7Ci0JCS8qIHNfb3AtPmRlbGV0ZV9pbm9kZSBpbnRlcm5hbGx5IHJlY2FsbHMgY2xlYXJfaW5vZGUoKSAqLworCQkvKiBGaWxlc3lzdGVtcyBpbXBsZW1lbnRpbmcgdGhlaXIgb3duCisJCSAqIHNfb3AtPmRlbGV0ZV9pbm9kZSBhcmUgcmVxdWlyZWQgdG8gY2FsbAorCQkgKiB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBhbmQgY2xlYXJfaW5vZGUoKQorCQkgKiBpbnRlcm5hbGx5ICovCiAJCWRlbGV0ZShpbm9kZSk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCQljbGVhcl9pbm9kZShpbm9kZSk7CisJfQogCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CiAJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKQEAgLTExOTUsOSArMTE5Nyw2IEBACiAJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZub3cpKSB7CiAJCWlub2RlLT5pX2F0aW1lID0gbm93OwogCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOwotCX0gZWxzZSB7Ci0JCWlmICghdGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX2F0aW1lLCAmbm93KSkKLQkJCWlub2RlLT5pX2F0aW1lID0gbm93OwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvaW5vdGlmeS5jIGIvZnMvaW5vdGlmeS5jCmluZGV4IDJlNGUyYTUuLmEzN2U5ZmIgMTAwNjQ0Ci0tLSBhL2ZzL2lub3RpZnkuYworKysgYi9mcy9pbm90aWZ5LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAKIHN0YXRpYyBhdG9taWNfdCBpbm90aWZ5X2Nvb2tpZTsKK3N0YXRpYyBhdG9taWNfdCBpbm90aWZ5X3dhdGNoZXM7CiAKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKndhdGNoX2NhY2hlcDsKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKmV2ZW50X2NhY2hlcDsKQEAgLTQyMiw2ICs0MjMsNyBAQAogCWdldF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKIAogCWF0b21pY19pbmMoJmRldi0+dXNlci0+aW5vdGlmeV93YXRjaGVzKTsKKwlhdG9taWNfaW5jKCZpbm90aWZ5X3dhdGNoZXMpOwogCiAJcmV0dXJuIHdhdGNoOwogfQpAQCAtNDU0LDYgKzQ1Niw3IEBACiAJbGlzdF9kZWwoJndhdGNoLT5kX2xpc3QpOwogCiAJYXRvbWljX2RlYygmZGV2LT51c2VyLT5pbm90aWZ5X3dhdGNoZXMpOworCWF0b21pY19kZWMoJmlub3RpZnlfd2F0Y2hlcyk7CiAJaWRyX3JlbW92ZSgmZGV2LT5pZHIsIHdhdGNoLT53ZCk7CiAJcHV0X2lub3RpZnlfd2F0Y2god2F0Y2gpOwogfQpAQCAtNTMyLDYgKzUzNSw5IEBACiAJc3RydWN0IGRlbnRyeSAqcGFyZW50OwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKKwlpZiAoIWF0b21pY19yZWFkICgmaW5vdGlmeV93YXRjaGVzKSkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKIAlpbm9kZSA9IHBhcmVudC0+ZF9pbm9kZTsKQEAgLTkyNSw2ICs5MzEsNyBAQAogCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJaW50IHJldCwgZnB1dF9uZWVkZWQ7CisJaW50IG1hc2tfYWRkID0gMDsKIAogCWZpbHAgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOwogCWlmICh1bmxpa2VseSghZmlscCkpCkBAIC05NDcsNiArOTU0LDkgQEAKIAlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOwogCWRvd24oJmRldi0+c2VtKTsKIAorCWlmIChtYXNrICYgSU5fTUFTS19BREQpCisJCW1hc2tfYWRkID0gMTsKKwogCS8qIGRvbid0IGxldCB1c2VyLXNwYWNlIHNldCBpbnZhbGlkIGJpdHM6IHdlIGRvbid0IHdhbnQgZmxhZ3Mgc2V0ICovCiAJbWFzayAmPSBJTl9BTExfRVZFTlRTOwogCWlmICh1bmxpa2VseSghbWFzaykpIHsKQEAgLTk2MCw3ICs5NzAsMTAgQEAKIAkgKi8KIAlvbGQgPSBpbm9kZV9maW5kX2Rldihpbm9kZSwgZGV2KTsKIAlpZiAodW5saWtlbHkob2xkKSkgewotCQlvbGQtPm1hc2sgPSBtYXNrOworCQlpZiAobWFza19hZGQpCisJCQlvbGQtPm1hc2sgfD0gbWFzazsKKwkJZWxzZQorCQkJb2xkLT5tYXNrID0gbWFzazsKIAkJcmV0ID0gb2xkLT53ZDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA0Myw2ICsxMDU2LDcgQEAKIAlpbm90aWZ5X21heF91c2VyX3dhdGNoZXMgPSA4MTkyOwogCiAJYXRvbWljX3NldCgmaW5vdGlmeV9jb29raWUsIDApOworCWF0b21pY19zZXQoJmlub3RpZnlfd2F0Y2hlcywgMCk7CiAKIAl3YXRjaF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW5vdGlmeV93YXRjaF9jYWNoZSIsCiAJCQkJCSBzaXplb2Yoc3RydWN0IGlub3RpZnlfd2F0Y2gpLApkaWZmIC0tZ2l0IGEvZnMvamJkL2NoZWNrcG9pbnQuYyBiL2ZzL2piZC9jaGVja3BvaW50LmMKaW5kZXggNWE5N2UzNC4uMDE0YTUxZiAxMDA2NDQKLS0tIGEvZnMvamJkL2NoZWNrcG9pbnQuYworKysgYi9mcy9qYmQvY2hlY2twb2ludC5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlpbnQgaTsKIAogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7Ci0JbGxfcndfYmxvY2soV1JJVEUsICpiYXRjaF9jb3VudCwgYmhzKTsKKwlsbF9yd19ibG9jayhTV1JJVEUsICpiYXRjaF9jb3VudCwgYmhzKTsKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgKmJhdGNoX2NvdW50OyBpKyspIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJoc1tpXTsKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCBkYWM3MjBjLi4yYTNlMzEwIDEwMDY0NAotLS0gYS9mcy9qYmQvY29tbWl0LmMKKysrIGIvZnMvamJkL2NvbW1pdC5jCkBAIC0zNTgsNyArMzU4LDcgQEAKIAkJCQkJamJkX2RlYnVnKDIsICJzdWJtaXQgJWQgd3JpdGVzXG4iLAogCQkJCQkJCWJ1ZnMpOwogCQkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCQkJCQlsbF9yd19ibG9jayhXUklURSwgYnVmcywgd2J1Zik7CisJCQkJCWxsX3J3X2Jsb2NrKFNXUklURSwgYnVmcywgd2J1Zik7CiAJCQkJCWpvdXJuYWxfYnJlbHNlX2FycmF5KHdidWYsIGJ1ZnMpOwogCQkJCQlidWZzID0gMDsKIAkJCQkJZ290byB3cml0ZV9vdXRfZGF0YTsKQEAgLTM4MSw3ICszODEsNyBAQAogCiAJaWYgKGJ1ZnMpIHsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQkJbGxfcndfYmxvY2soV1JJVEUsIGJ1ZnMsIHdidWYpOworCQlsbF9yd19ibG9jayhTV1JJVEUsIGJ1ZnMsIHdidWYpOwogCQlqb3VybmFsX2JyZWxzZV9hcnJheSh3YnVmLCBidWZzKTsKIAkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJfQpAQCAtNzIwLDExICs3MjAsMTcgQEAKIAlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfbG9nX2xpc3QgPT0gTlVMTCk7CiAKIHJlc3RhcnRfbG9vcDoKKwkvKgorCSAqIEFzIHRoZXJlIGFyZSBvdGhlciBwbGFjZXMgKGpvdXJuYWxfdW5tYXBfYnVmZmVyKCkpIGFkZGluZyBidWZmZXJzCisJICogdG8gdGhpcyBsaXN0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhbmQgaG9sZCB0aGUgal9saXN0X2xvY2suCisJICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQpIHsKIAkJdHJhbnNhY3Rpb25fdCAqY3BfdHJhbnNhY3Rpb247CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQliaCA9IGpoMmJoKGpoKTsKIAkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOwogCQlKX0FTU0VSVF9KSChqaCwJamgtPmJfdHJhbnNhY3Rpb24gPT0gY29tbWl0X3RyYW5zYWN0aW9uIHx8CkBAIC03OTIsOSArNzk4LDI1IEBACiAJCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOyAgLyogbmVlZHMgYSBicmVsc2UgKi8KIAkJCXJlbGVhc2VfYnVmZmVyX3BhZ2UoYmgpOwogCQl9CisJCWNvbmRfcmVzY2hlZF9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IHNsZWF6eS4gIFdlIGJvcnJvdyBqX2xpc3RfbG9jayB0byBwcm90ZWN0CisJICogam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uIGluIF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludC4KKwkgKiBSZWFsbHksIF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludCBzaG91bGQgYmUgdXNpbmcgal9zdGF0ZV9sb2NrIGJ1dAorCSAqIGl0J3MgYSBiaXQgaGFzc2xlIHRvIGhvbGQgdGhhdCBhY3Jvc3MgX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50CisJICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCS8qCisJICogTm93IHJlY2hlY2sgaWYgc29tZSBidWZmZXJzIGRpZCBub3QgZ2V0IGF0dGFjaGVkIHRvIHRoZSB0cmFuc2FjdGlvbgorCSAqIHdoaWxlIHRoZSBsb2NrIHdhcyBkcm9wcGVkLi4uCisJICovCisJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQpIHsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQkJaWYgKGNvbmRfcmVzY2hlZCgpKQotCQkJZ290byByZXN0YXJ0X2xvb3A7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlnb3RvIHJlc3RhcnRfbG9vcDsKIAl9CiAKIAkvKiBEb25lIHdpdGggdGhpcyB0cmFuc2FjdGlvbiEgKi8KQEAgLTgwMywxNCArODI1LDYgQEAKIAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9PSBUX0NPTU1JVCk7CiAKLQkvKgotCSAqIFRoaXMgaXMgYSBiaXQgc2xlYXp5LiAgV2UgYm9ycm93IGpfbGlzdF9sb2NrIHRvIHByb3RlY3QKLQkgKiBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gaW4gX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50LgotCSAqIFJlYWxseSwgX19qb3JuYWxfcmVtb3ZlX2NoZWNrcG9pbnQgc2hvdWxkIGJlIHVzaW5nIGpfc3RhdGVfbG9jayBidXQKLQkgKiBpdCdzIGEgYml0IGhhc3NsZSB0byBob2xkIHRoYXQgYWNyb3NzIF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludAotCSAqLwotCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKLQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0ZJTklTSEVEOwogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOwogCWpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZDsKZGlmZiAtLWdpdCBhL2ZzL2piZC9qb3VybmFsLmMgYi9mcy9qYmQvam91cm5hbC5jCmluZGV4IDVlN2I0MzkuLjdhZTJjNGYgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9qb3VybmFsLmMKKysrIGIvZnMvamJkL2pvdXJuYWwuYwpAQCAtNjUsNyArNjUsNiBAQAogRVhQT1JUX1NZTUJPTChqb3VybmFsX2NyZWF0ZSk7CiBFWFBPUlRfU1lNQk9MKGpvdXJuYWxfbG9hZCk7CiBFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZGVzdHJveSk7Ci1FWFBPUlRfU1lNQk9MKGpvdXJuYWxfcmVjb3Zlcik7CiBFWFBPUlRfU1lNQk9MKGpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2spOwogRVhQT1JUX1NZTUJPTChqb3VybmFsX2Fib3J0KTsKIEVYUE9SVF9TWU1CT0woam91cm5hbF9lcnJubyk7CkBAIC04MSw2ICs4MCw3IEBACiBFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZm9yY2VfY29tbWl0KTsKIAogc3RhdGljIGludCBqb3VybmFsX2NvbnZlcnRfc3VwZXJibG9ja192MShqb3VybmFsX3QgKiwgam91cm5hbF9zdXBlcmJsb2NrX3QgKik7CitzdGF0aWMgdm9pZCBfX2pvdXJuYWxfYWJvcnRfc29mdCAoam91cm5hbF90ICpqb3VybmFsLCBpbnQgZXJybm8pOwogCiAvKgogICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gbWFuYWdlIGNvbW1pdCB0aW1lb3V0cwpAQCAtOTMsMTYgKzkzLDYgQEAKIAl3YWtlX3VwX3Byb2Nlc3MocCk7CiB9CiAKLS8qIFN0YXRpYyBjaGVjayBmb3IgZGF0YSBzdHJ1Y3R1cmUgY29uc2lzdGVuY3kuICBUaGVyZSdzIG5vIGNvZGUKLSAqIGludm9rZWQgLS0tIHdlJ2xsIGp1c3QgZ2V0IGEgbGlua2VyIGZhaWx1cmUgaWYgdGhpbmdzIGFyZW4ndCByaWdodC4KLSAqLwotdm9pZCBfX2pvdXJuYWxfaW50ZXJuYWxfY2hlY2sodm9pZCkKLXsKLQlleHRlcm4gdm9pZCBqb3VybmFsX2JhZF9zdXBlcmJsb2NrX3NpemUodm9pZCk7Ci0JaWYgKHNpemVvZihzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MpICE9IDEwMjQpCi0JCWpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSgpOwotfQotCiAvKgogICoga2pvdXJuYWxkOiBUaGUgbWFpbiB0aHJlYWQgZnVuY3Rpb24gdXNlZCB0byBtYW5hZ2UgYSBsb2dnaW5nIGRldmljZQogICogam91cm5hbC4KQEAgLTExOSwxNiArMTA5LDEyIEBACiAgKiAgICBrbm93biBhcyBjaGVja3BvaW50aW5nLCBhbmQgdGhpcyB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHRoYXQgam9iLgogICovCiAKLWpvdXJuYWxfdCAqY3VycmVudF9qb3VybmFsOwkJLy8gQUtQTTogZGVidWcKLQotaW50IGtqb3VybmFsZCh2b2lkICphcmcpCitzdGF0aWMgaW50IGtqb3VybmFsZCh2b2lkICphcmcpCiB7CiAJam91cm5hbF90ICpqb3VybmFsID0gKGpvdXJuYWxfdCAqKSBhcmc7CiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKLQljdXJyZW50X2pvdXJuYWwgPSBqb3VybmFsOwotCiAJZGFlbW9uaXplKCJram91cm5hbGQiKTsKIAogCS8qIFNldCB1cCBhbiBpbnRlcnZhbCB0aW1lciB3aGljaCBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIGEKQEAgLTE5Myw2ICsxNzksOCBAQAogCQlpZiAodHJhbnNhY3Rpb24gJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLAogCQkJCQkJdHJhbnNhY3Rpb24tPnRfZXhwaXJlcykpCiAJCQlzaG91bGRfc2xlZXAgPSAwOworCQlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19VTk1PVU5UKQorIAkJCXNob3VsZF9zbGVlcCA9IDA7CiAJCWlmIChzaG91bGRfc2xlZXApIHsKIAkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCQkJc2NoZWR1bGUoKTsKQEAgLTk2OSw3ICs5NTcsNyBAQAogCWlmICh3YWl0KQogCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJZWxzZQotCQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwkJbGxfcndfYmxvY2soU1dSSVRFLCAxLCAmYmgpOwogCiBvdXQ6CiAJLyogSWYgd2UgaGF2ZSBqdXN0IGZsdXNoZWQgdGhlIGxvZyAoYnkgbWFya2luZyBzX3N0YXJ0PT0wKSwgdGhlbgpAQCAtMTQzOSw3ICsxNDI3LDcgQEAKICAqIGRldmljZSB0aGlzIGpvdXJuYWwgaXMgcHJlc2VudC4KICAqLwogCi1jb25zdCBjaGFyICpqb3VybmFsX2Rldl9uYW1lKGpvdXJuYWxfdCAqam91cm5hbCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGNvbnN0IGNoYXIgKmpvdXJuYWxfZGV2X25hbWUoam91cm5hbF90ICpqb3VybmFsLCBjaGFyICpidWZmZXIpCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIApAQCAtMTQ4NSw3ICsxNDczLDcgQEAKIAogLyogU29mdCBhYm9ydDogcmVjb3JkIHRoZSBhYm9ydCBlcnJvciBzdGF0dXMgaW4gdGhlIGpvdXJuYWwgc3VwZXJibG9jaywKICAqIGJ1dCBkb24ndCBkbyBhbnkgb3RoZXIgSU8uICovCi12b2lkIF9fam91cm5hbF9hYm9ydF9zb2Z0IChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBlcnJubykKK3N0YXRpYyB2b2lkIF9fam91cm5hbF9hYm9ydF9zb2Z0IChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBlcnJubykKIHsKIAlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkKIAkJcmV0dXJuOwpAQCAtMTg4MCw3ICsxODY4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19qYmRfZGVidWc7CiAKLWludCByZWFkX2piZF9kZWJ1ZyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKK3N0YXRpYyBpbnQgcmVhZF9qYmRfZGVidWcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJaW50IHJldDsKQEAgLTE4OTAsNyArMTg3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdyaXRlX2piZF9kZWJ1ZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKK3N0YXRpYyBpbnQgd3JpdGVfamJkX2RlYnVnKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKIAljaGFyIGJ1ZlszMl07CkBAIC0xOTc5LDYgKzE5NjcsMTQgQEAKIHsKIAlpbnQgcmV0OwogCisvKiBTdGF0aWMgY2hlY2sgZm9yIGRhdGEgc3RydWN0dXJlIGNvbnNpc3RlbmN5LiAgVGhlcmUncyBubyBjb2RlCisgKiBpbnZva2VkIC0tLSB3ZSdsbCBqdXN0IGdldCBhIGxpbmtlciBmYWlsdXJlIGlmIHRoaW5ncyBhcmVuJ3QgcmlnaHQuCisgKi8KKwlleHRlcm4gdm9pZCBqb3VybmFsX2JhZF9zdXBlcmJsb2NrX3NpemUodm9pZCk7CisJaWYgKHNpemVvZihzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MpICE9IDEwMjQpCisJCWpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSgpOworCisKIAlyZXQgPSBqb3VybmFsX2luaXRfY2FjaGVzKCk7CiAJaWYgKHJldCAhPSAwKQogCQlqb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7CmRpZmYgLS1naXQgYS9mcy9qYmQvcmV2b2tlLmMgYi9mcy9qYmQvcmV2b2tlLmMKaW5kZXggZDMyN2E1OS4uYTU2MTQ0MSAxMDA2NDQKLS0tIGEvZnMvamJkL3Jldm9rZS5jCisrKyBiL2ZzL2piZC9yZXZva2UuYwpAQCAtMTE2LDcgKzExNiw4IEBACiAJCShibG9jayA8PCAoaGFzaF9zaGlmdCAtIDEyKSkpICYgKHRhYmxlLT5oYXNoX3NpemUgLSAxKTsKIH0KIAotaW50IGluc2VydF9yZXZva2VfaGFzaChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwgdGlkX3Qgc2VxKQorc3RhdGljIGludCBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGJsb2NrbnIsCisJCQkgICAgICB0aWRfdCBzZXEpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9saXN0OwogCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CkBAIC02MTMsNyArNjE0LDcgQEAKIAlzZXRfYnVmZmVyX2p3cml0ZShiaCk7CiAJQlVGRkVSX1RSQUNFKGJoLCAid3JpdGUiKTsKIAlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKLQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwlsbF9yd19ibG9jayhTV1JJVEUsIDEsICZiaCk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMvamJkL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwppbmRleCA3N2I3NjYyLi40OWJiYzJiIDEwMDY0NAotLS0gYS9mcy9qYmQvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwpAQCAtNDkwLDIzICs0OTAsMjEgQEAKICAqLwogc3RhdGljIHZvaWQgamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQogewotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CiAJaW50IGpsaXN0OwogCi0JaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKLQkJLyogSWYgdGhpcyBidWZmZXIgaXMgb25lIHdoaWNoIG1pZ2h0IHJlYXNvbmFibHkgYmUgZGlydHkKLQkJICogLS0tIGllLiBkYXRhLCBvciBub3QgcGFydCBvZiB0aGlzIGpvdXJuYWwgLS0tIHRoZW4KLQkJICogd2UncmUgT0sgdG8gbGVhdmUgaXQgYWxvbmUsIGJ1dCBvdGhlcndpc2Ugd2UgbmVlZCB0bwotCQkgKiBtb3ZlIHRoZSBkaXJ0eSBiaXQgdG8gdGhlIGpvdXJuYWwncyBvd24gaW50ZXJuYWwKLQkJICogSkJERGlydHkgYml0LiAqLwotCQlqbGlzdCA9IGpoLT5iX2psaXN0OworCS8qIElmIHRoaXMgYnVmZmVyIGlzIG9uZSB3aGljaCBtaWdodCByZWFzb25hYmx5IGJlIGRpcnR5CisJICogLS0tIGllLiBkYXRhLCBvciBub3QgcGFydCBvZiB0aGlzIGpvdXJuYWwgLS0tIHRoZW4KKwkgKiB3ZSdyZSBPSyB0byBsZWF2ZSBpdCBhbG9uZSwgYnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvCisJICogbW92ZSB0aGUgZGlydHkgYml0IHRvIHRoZSBqb3VybmFsJ3Mgb3duIGludGVybmFsCisJICogSkJERGlydHkgYml0LiAqLworCWpsaXN0ID0gamgtPmJfamxpc3Q7CiAKLQkJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8IAotCQkgICAgamxpc3QgPT0gQkpfU2hhZG93IHx8IGpsaXN0ID09IEJKX0ZvcmdldCkgewotCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSkpIHsKLQkJCQlzZXRfYml0KEJIX0pCRERpcnR5LCAmamgyYmgoamgpLT5iX3N0YXRlKTsKLQkJCX0KLQkJfQorCWlmIChqbGlzdCA9PSBCSl9NZXRhZGF0YSB8fCBqbGlzdCA9PSBCSl9SZXNlcnZlZCB8fAorCSAgICBqbGlzdCA9PSBCSl9TaGFkb3cgfHwgamxpc3QgPT0gQkpfRm9yZ2V0KSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkKKwkJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOwogCX0KIH0KIApAQCAtNTc0LDkgKzU3MiwxNCBAQAogCQkJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24pCiAJCQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0KIAkJCQkJCQl0cmFuc2FjdGlvbik7Ci0JCQlKQlVGRkVSX1RSQUNFKGpoLCAiVW5leHBlY3RlZCBkaXJ0eSBidWZmZXIiKTsKLQkJCWpiZF91bmV4cGVjdGVkX2RpcnR5X2J1ZmZlcihqaCk7Ci0gCQl9CisJCX0KKwkJLyoKKwkJICogSW4gYW55IGNhc2Ugd2UgbmVlZCB0byBjbGVhbiB0aGUgZGlydHkgZmxhZyBhbmQgd2UgbXVzdAorCQkgKiBkbyBpdCB1bmRlciB0aGUgYnVmZmVyIGxvY2sgdG8gYmUgc3VyZSB3ZSBkb24ndCByYWNlCisJCSAqIHdpdGggcnVubmluZyB3cml0ZS1vdXQuCisJCSAqLworCQlKQlVGRkVSX1RSQUNFKGpoLCAiVW5leHBlY3RlZCBkaXJ0eSBidWZmZXIiKTsKKwkJamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKGpoKTsKICAJfQogCiAJdW5sb2NrX2J1ZmZlcihiaCk7CkBAIC0xMzM3LDggKzEzNDAsNyBAQAogCWlmIChoYW5kbGUtPmhfc3luYykgewogCQlkbyB7CiAJCQlvbGRfaGFuZGxlX2NvdW50ID0gdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2NvdW50OwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9qZmZzL2lub2RlLXYyMy5jIGIvZnMvamZmcy9pbm9kZS12MjMuYwppbmRleCBiZmJlYjRjLi4zZGNjNmQyIDEwMDY0NAotLS0gYS9mcy9qZmZzL2lub2RlLXYyMy5jCisrKyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKQEAgLTE2MjksOSArMTYyOSw2IEBACiB9CiAKIAotZXh0ZXJuIGludCBnZW5lcmljX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKikgX19hdHRyaWJ1dGVfXygod2VhaykpOwotZXh0ZXJuIGxvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmZnNfZmlsZV9vcGVyYXRpb25zID0KIHsKIAkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKQEAgLTE3NDcsNiArMTc0NCw3IEBACiAJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9pbm9kZSgpOiBpbm9kZS0+aV9pbm8gPT0gJWx1XG4iLAogCQkgIGlub2RlLT5pX2lubykpOwogCisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWxvY2tfa2VybmVsKCk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJaW5vZGUtPmlfYmxvY2tzID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMvaW50cmVwLmMgYi9mcy9qZmZzL2ludHJlcC5jCmluZGV4IDQ1NmQ3ZTYuLjI3ZjE5OWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvaW50cmVwLmMKKysrIGIvZnMvamZmcy9pbnRyZXAuYwpAQCAtMTcwMSwxMiArMTcwMSwxMCBAQAogewogCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CiAJaW50IGkgPSBpbm8gJSBjLT5oYXNoX2xlbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlEMyhwcmludGsoImpmZnNfZmluZF9maWxlKCk6IGlubzogJXVcbiIsIGlubykpOwogCi0JZm9yICh0bXAgPSBjLT5oYXNoW2ldLm5leHQ7IHRtcCAhPSAmYy0+aGFzaFtpXTsgdG1wID0gdG1wLT5uZXh0KSB7Ci0JCWYgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGpmZnNfZmlsZSwgaGFzaCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmYy0+aGFzaFtpXSwgaGFzaCkgewogCQlpZiAoaW5vICE9IGYtPmlubykKIAkJCWNvbnRpbnVlOwogCQlEMyhwcmludGsoImpmZnNfZmluZF9maWxlKCk6IEZvdW5kIGZpbGUgd2l0aCBpbm8gIgpAQCAtMjEwMiwxMyArMjEwMCwxMiBAQAogCWludCByZXN1bHQgPSAwOwogCiAJZm9yIChwb3MgPSAwOyBwb3MgPCBjLT5oYXNoX2xlbjsgcG9zKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm5leHQ7Ci0JCWZvciAocCA9IGMtPmhhc2hbcG9zXS5uZXh0OyBwICE9ICZjLT5oYXNoW3Bvc107IHAgPSBuZXh0KSB7Ci0JCQkvKiBXZSBuZWVkIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGZpbGUgaW4gdGhlCi0JCQkgICBsaXN0IGJlY2F1c2UgYGZ1bmMnIG1pZ2h0IHJlbW92ZSB0aGUgY3VycmVudAotCQkJICAgZmlsZSBgZicuICAqLwotCQkJbmV4dCA9IHAtPm5leHQ7Ci0JCQlyID0gZnVuYyhsaXN0X2VudHJ5KHAsIHN0cnVjdCBqZmZzX2ZpbGUsIGhhc2gpKTsKKwkJc3RydWN0IGpmZnNfZmlsZSAqZiwgKm5leHQ7CisKKwkJLyogV2UgbXVzdCBkbyBfc2FmZSwgYmVjYXVzZSAnZnVuYycgbWlnaHQgcmVtb3ZlIHRoZQorCQkgICBjdXJyZW50IGZpbGUgJ2YnIGZyb20gdGhlIGxpc3QuICAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZiwgbmV4dCwgJmMtPmhhc2hbcG9zXSwgaGFzaCkgeworCQkJciA9IGZ1bmMoZik7CiAJCQlpZiAociA8IDApCiAJCQkJcmV0dXJuIHI7CiAJCQlyZXN1bHQgKz0gcjsKQEAgLTI2MTMsOSArMjYxMCw4IEBACiAKIAlwcmludGsoIkpGRlM6IER1bXBpbmcgdGhlIGZpbGUgc3lzdGVtJ3MgaGFzaCB0YWJsZS4uLlxuIik7CiAJZm9yIChpID0gMDsgaSA8IGMtPmhhc2hfbGVuOyBpKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcDsKLQkJZm9yIChwID0gYy0+aGFzaFtpXS5uZXh0OyBwICE9ICZjLT5oYXNoW2ldOyBwID0gcC0+bmV4dCkgewotCQkJc3RydWN0IGpmZnNfZmlsZSAqZj1saXN0X2VudHJ5KHAsc3RydWN0IGpmZnNfZmlsZSxoYXNoKTsKKwkJc3RydWN0IGpmZnNfZmlsZSAqZjsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmYy0+aGFzaFtpXSwgaGFzaCkgewogCQkJcHJpbnRrKCIqKiogYy0+aGFzaFsldV06IFwiJXNcIiAiCiAJCQkgICAgICAgIihpbm86ICV1LCBwaW5vOiAldSlcbiIsCiAJCQkgICAgICAgaSwgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLApkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCmluZGV4IGJkOWVkOWIuLjgyNzliZjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZpbGUuYworKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTIxLDkgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAKLWV4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopIF9fYXR0cmlidXRlX18oKHdlYWspKTsKLWV4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikgX19hdHRyaWJ1dGVfXygod2VhaykpOwotCiBzdGF0aWMgaW50IGpmZnMyX2NvbW1pdF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKIAkJCSAgICAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKIHN0YXRpYyBpbnQgamZmczJfcHJlcGFyZV93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKZGlmZiAtLWdpdCBhL2ZzL2pmcy9hY2wuYyBiL2ZzL2pmcy9hY2wuYwppbmRleCBlODkyZGFiLi40NjFlNDkzIDEwMDY0NAotLS0gYS9mcy9qZnMvYWNsLmMKKysrIGIvZnMvamZzL2FjbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KICNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3R4bm1nci5oIgogI2luY2x1ZGUgImpmc194YXR0ci5oIgogI2luY2x1ZGUgImpmc19hY2wuaCIKIApAQCAtNzUsNyArNzYsOCBAQAogCXJldHVybiBhY2w7CiB9CiAKLXN0YXRpYyBpbnQgamZzX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3N0YXRpYyBpbnQgamZzX3NldF9hY2wodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwKKwkJICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKIHsKIAljaGFyICplYV9uYW1lOwogCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOwpAQCAtMTEwLDcgKzExMiw3IEBACiAJCWlmIChyYyA8IDApCiAJCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBfX2pmc19zZXR4YXR0cihpbm9kZSwgZWFfbmFtZSwgdmFsdWUsIHNpemUsIDApOworCXJjID0gX19qZnNfc2V0eGF0dHIodGlkLCBpbm9kZSwgZWFfbmFtZSwgdmFsdWUsIHNpemUsIDApOwogb3V0OgogCWtmcmVlKHZhbHVlKTsKIApAQCAtMTQzLDcgKzE0NSw3IEBACiAJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgamZzX2NoZWNrX2FjbCk7CiB9CiAKLWludCBqZnNfaW5pdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCitpbnQgamZzX2luaXRfYWNsKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKIAlzdHJ1Y3QgcG9zaXhfYWNsICpjbG9uZTsKQEAgLTE1OSw3ICsxNjEsNyBAQAogCiAJaWYgKGFjbCkgewogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKKwkJCXJjID0gamZzX3NldF9hY2wodGlkLCBpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTE3Myw3ICsxNzUsOCBAQAogCQlpZiAocmMgPj0gMCkgewogCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCQlpZiAocmMgPiAwKQotCQkJCXJjID0gamZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCQkJCXJjID0gamZzX3NldF9hY2wodGlkLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLAorCQkJCQkJIGNsb25lKTsKIAkJfQogCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiBjbGVhbnVwOgpAQCAtMjAyLDggKzIwNSwxNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJjID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOwotCWlmICghcmMpCi0JCXJjID0gamZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCWlmICghcmMpIHsKKwkJdGlkX3QgdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgMCk7CisJCWRvd24oJkpGU19JUChpbm9kZSktPmNvbW1pdF9zZW0pOworCQlyYyA9IGpmc19zZXRfYWNsKHRpZCwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCQlpZiAoIXJjKQorCQkJcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpbm9kZSwgMCk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaW5vZGUpLT5jb21taXRfc2VtKTsKKwl9CiAKIAlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2lub2RlLmMgYi9mcy9qZnMvaW5vZGUuYwppbmRleCA3NjdjN2VjLi4wZWM2MmQ1IDEwMDY0NAotLS0gYS9mcy9qZnMvaW5vZGUuYworKysgYi9mcy9qZnMvaW5vZGUuYwpAQCAtMTI4LDIxICsxMjgsMjMgQEAKIHsKIAlqZnNfaW5mbygiSW4gamZzX2RlbGV0ZV9pbm9kZSwgaW5vZGUgPSAweCVwIiwgaW5vZGUpOwogCi0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKLQkgICAgKEpGU19JUChpbm9kZSktPmZpbGVzZXQgIT0gY3B1X3RvX2xlMzIoRklMRVNZU1RFTV9JKSkpCi0JCQlyZXR1cm47CisJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpICYmCisJICAgIChKRlNfSVAoaW5vZGUpLT5maWxlc2V0ID09IGNwdV90b19sZTMyKEZJTEVTWVNURU1fSSkpKSB7CiAKLQlpZiAodGVzdF9jZmxhZyhDT01NSVRfRnJlZXdtYXAsIGlub2RlKSkKLQkJamZzX2ZyZWVfemVyb19saW5rKGlub2RlKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCi0JZGlGcmVlKGlub2RlKTsKKwkJaWYgKHRlc3RfY2ZsYWcoQ09NTUlUX0ZyZWV3bWFwLCBpbm9kZSkpCisJCQlqZnNfZnJlZV96ZXJvX2xpbmsoaW5vZGUpOwogCi0JLyoKLQkgKiBGcmVlIHRoZSBpbm9kZSBmcm9tIHRoZSBxdW90YSBhbGxvY2F0aW9uLgotCSAqLwotCURRVU9UX0lOSVQoaW5vZGUpOwotCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOwotCURRVU9UX0RST1AoaW5vZGUpOworCQlkaUZyZWUoaW5vZGUpOworCisJCS8qCisJCSAqIEZyZWUgdGhlIGlub2RlIGZyb20gdGhlIHF1b3RhIGFsbG9jYXRpb24uCisJCSAqLworCQlEUVVPVF9JTklUKGlub2RlKTsKKwkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisJCURRVU9UX0RST1AoaW5vZGUpOworCX0KIAogCWNsZWFyX2lub2RlKGlub2RlKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfYWNsLmggYi9mcy9qZnMvamZzX2FjbC5oCmluZGV4IGEzYWNkM2UuLmE3NjI5Mzc2IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2FjbC5oCisrKyBiL2ZzL2pmcy9qZnNfYWNsLmgKQEAgLTIxLDggKzIxLDE2IEBACiAjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKIAogaW50IGpmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7Ci1pbnQgamZzX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitpbnQgamZzX2luaXRfYWNsKHRpZF90LCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOwogaW50IGpmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogCi0jZW5kaWYJCS8qIENPTkZJR19KRlNfUE9TSVhfQUNMICovCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBqZnNfaW5pdF9hY2wodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKICNlbmRpZgkJLyogX0hfSkZTX0FDTCAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19maWxzeXMuaCBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKaW5kZXggODZjY2FjOC4uNzJhNTU4OCAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19maWxzeXMuaAorKysgYi9mcy9qZnMvamZzX2ZpbHN5cy5oCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIEpGU19FUlJfQ09OVElOVUUgICAweDAwMDAwMDA0ICAgLyogY29udGludWUgKi8KICNkZWZpbmUgSkZTX0VSUl9QQU5JQyAgICAgIDB4MDAwMDAwMDggICAvKiBwYW5pYyAqLwogCisjZGVmaW5lCUpGU19VU1JRVU9UQQkweDAwMDAwMDEwCisjZGVmaW5lCUpGU19HUlBRVU9UQQkweDAwMDAwMDIwCisKIC8qIHBsYXRmb3JtIG9wdGlvbiAoY29uZGl0aW9uYWwgY29tcGlsYXRpb24pICovCiAjZGVmaW5lIEpGU19BSVgJCTB4ODAwMDAwMDAJLyogQUlYIHN1cHBvcnQgKi8KIC8qCVBPU0lYIG5hbWUvZGlyZWN0b3J5ICBzdXBwb3J0ICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3hhdHRyLmggYi9mcy9qZnMvamZzX3hhdHRyLmgKaW5kZXggYTEwNTJmM2YwLi4yNWU5OTkwIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3hhdHRyLmgKKysrIGIvZnMvamZzL2pmc194YXR0ci5oCkBAIC01Miw4ICs1Miw4IEBACiAjZGVmaW5lCUVORF9FQUxJU1QoZWFsaXN0KSBcCiAJKChzdHJ1Y3QgamZzX2VhICopICgoKGNoYXIgKikgKGVhbGlzdCkpICsgRUFMSVNUX1NJWkUoZWFsaXN0KSkpCiAKLWV4dGVybiBpbnQgX19qZnNfc2V0eGF0dHIoc3RydWN0IGlub2RlICosIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsCi0JCQkgIGludCk7CitleHRlcm4gaW50IF9famZzX3NldHhhdHRyKHRpZF90LCBzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosCisJCQkgIHNpemVfdCwgaW50KTsKIGV4dGVybiBpbnQgamZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwKIAkJCWludCk7CiBleHRlcm4gc3NpemVfdCBfX2pmc19nZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CkBAIC02MSw0ICs2MSwxNCBAQAogZXh0ZXJuIHNzaXplX3QgamZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIGV4dGVybiBpbnQgamZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKIAorI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKK2V4dGVybiBpbnQgamZzX2luaXRfc2VjdXJpdHkodGlkX3QsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgamZzX2luaXRfc2VjdXJpdHkodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAjZW5kaWYJLyogSF9KRlNfWEFUVFIgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKaW5kZXggNDljY2RlMy4uMWFiZTczNCAxMDA2NDQKLS0tIGEvZnMvamZzL25hbWVpLmMKKysrIGIvZnMvamZzL25hbWVpLmMKQEAgLTM5LDYgKzM5LDI0IEBACiBzdGF0aWMgczY0IGNvbW1pdFplcm9MaW5rKHRpZF90LCBzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qCisgKiBOQU1FOglmcmVlX2VhX3dtYXAoaW5vZGUpCisgKgorICogRlVOQ1RJT046CWZyZWUgdW5jb21taXR0ZWQgZXh0ZW5kZWQgYXR0cmlidXRlcyBmcm9tIHdvcmtpbmcgbWFwIAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZWFfd21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWR4ZF90ICplYSA9ICZKRlNfSVAoaW5vZGUpLT5lYTsKKworCWlmIChlYS0+ZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJLyogZnJlZSBFQSBwYWdlcyBmcm9tIGNhY2hlICovCisJCWludmFsaWRhdGVfZHhkX21ldGFwYWdlcyhpbm9kZSwgKmVhKTsKKwkJZGJGcmVlKGlub2RlLCBhZGRyZXNzRFhEKGVhKSwgbGVuZ3RoRFhEKGVhKSk7CisJfQorCWVhLT5mbGFnID0gMDsKK30KKworLyoKICAqIE5BTUU6CWpmc19jcmVhdGUoZGlwLCBkZW50cnksIG1vZGUpCiAgKgogICogRlVOQ1RJT046CWNyZWF0ZSBhIHJlZ3VsYXIgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSA8ZGlwPgpAQCAtODksOCArMTA3LDE5IEBACiAJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOwogCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCisJcmMgPSBqZnNfaW5pdF9hY2wodGlkLCBpcCwgZGlwKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0MzsKKworCXJjID0gamZzX2luaXRfc2VjdXJpdHkodGlkLCBpcCwgZGlwKTsKKwlpZiAocmMpIHsKKwkJdHhBYm9ydCh0aWQsIDApOworCQlnb3RvIG91dDM7CisJfQorCiAJaWYgKChyYyA9IGR0U2VhcmNoKGRpcCwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0NSRUFURSkpKSB7CiAJCWpmc19lcnIoImpmc19jcmVhdGU6IGR0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQl0eEFib3J0KHRpZCwgMCk7CiAJCWdvdG8gb3V0MzsKIAl9CiAKQEAgLTEzOSw2ICsxNjgsNyBAQAogCXVwKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CiAJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCWlmIChyYykgeworCQlmcmVlX2VhX3dtYXAoaXApOwogCQlpcC0+aV9ubGluayA9IDA7CiAJCWlwdXQoaXApOwogCX0gZWxzZQpAQCAtMTQ3LDExICsxNzcsNiBAQAogICAgICAgb3V0MjoKIAlmcmVlX1VDU25hbWUoJmRuYW1lKTsKIAotI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCi0JaWYgKHJjID09IDApCi0JCWpmc19pbml0X2FjbChpcCwgZGlwKTsKLSNlbmRpZgotCiAgICAgICBvdXQxOgogCiAJamZzX2luZm8oImpmc19jcmVhdGU6IHJjOiVkIiwgcmMpOwpAQCAtMjE2LDggKzI0MSwxOSBAQAogCWRvd24oJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKIAlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKIAorCXJjID0gamZzX2luaXRfYWNsKHRpZCwgaXAsIGRpcCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDM7CisKKwlyYyA9IGpmc19pbml0X3NlY3VyaXR5KHRpZCwgaXAsIGRpcCk7CisJaWYgKHJjKSB7CisJCXR4QWJvcnQodGlkLCAwKTsKKwkJZ290byBvdXQzOworCX0KKwogCWlmICgocmMgPSBkdFNlYXJjaChkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2ssIEpGU19DUkVBVEUpKSkgewogCQlqZnNfZXJyKCJqZnNfbWtkaXI6IGR0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQl0eEFib3J0KHRpZCwgMCk7CiAJCWdvdG8gb3V0MzsKIAl9CiAKQEAgLTI2Nyw2ICszMDMsNyBAQAogCXVwKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CiAJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCWlmIChyYykgeworCQlmcmVlX2VhX3dtYXAoaXApOwogCQlpcC0+aV9ubGluayA9IDA7CiAJCWlwdXQoaXApOwogCX0gZWxzZQpAQCAtMjc1LDEwICszMTIsNiBAQAogICAgICAgb3V0MjoKIAlmcmVlX1VDU25hbWUoJmRuYW1lKTsKIAotI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCi0JaWYgKHJjID09IDApCi0JCWpmc19pbml0X2FjbChpcCwgZGlwKTsKLSNlbmRpZgogCiAgICAgICBvdXQxOgogCkBAIC04ODUsNiArOTE4LDEwIEBACiAJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOwogCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCisJcmMgPSBqZnNfaW5pdF9zZWN1cml0eSh0aWQsIGlwLCBkaXApOworCWlmIChyYykKKwkJZ290byBvdXQzOworCiAJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKIAl0YmxrLT54ZmxhZyB8PSBDT01NSVRfQ1JFQVRFOwogCXRibGstPmlubyA9IGlwLT5pX2lubzsKQEAgLTEwMDAsNiArMTAzNyw3IEBACiAJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKIAl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CiAJaWYgKHJjKSB7CisJCWZyZWVfZWFfd21hcChpcCk7CiAJCWlwLT5pX25saW5rID0gMDsKIAkJaXB1dChpcCk7CiAJfSBlbHNlCkBAIC0xMDA4LDExICsxMDQ2LDYgQEAKICAgICAgIG91dDI6CiAJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CiAKLSNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAotCWlmIChyYyA9PSAwKQotCQlqZnNfaW5pdF9hY2woaXAsIGRpcCk7Ci0jZW5kaWYKLQogICAgICAgb3V0MToKIAlqZnNfaW5mbygiamZzX3N5bWxpbms6IHJjOiVkIiwgcmMpOwogCXJldHVybiByYzsKQEAgLTEzMjgsMTcgKzEzNjEsMzEgQEAKIAlkb3duKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CiAJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CiAKLQlpZiAoKHJjID0gZHRTZWFyY2goZGlyLCAmZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfQ1JFQVRFKSkpCisJcmMgPSBqZnNfaW5pdF9hY2wodGlkLCBpcCwgZGlyKTsKKwlpZiAocmMpCiAJCWdvdG8gb3V0MzsKIAorCXJjID0gamZzX2luaXRfc2VjdXJpdHkodGlkLCBpcCwgZGlyKTsKKwlpZiAocmMpIHsKKwkJdHhBYm9ydCh0aWQsIDApOworCQlnb3RvIG91dDM7CisJfQorCisJaWYgKChyYyA9IGR0U2VhcmNoKGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0NSRUFURSkpKSB7CisJCXR4QWJvcnQodGlkLCAwKTsKKwkJZ290byBvdXQzOworCX0KKwogCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CiAJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0NSRUFURTsKIAl0YmxrLT5pbm8gPSBpcC0+aV9pbm87CiAJdGJsay0+dS5peHB4ZCA9IEpGU19JUChpcCktPml4cHhkOwogCiAJaW5vID0gaXAtPmlfaW5vOwotCWlmICgocmMgPSBkdEluc2VydCh0aWQsIGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaykpKQorCWlmICgocmMgPSBkdEluc2VydCh0aWQsIGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaykpKSB7CisJCXR4QWJvcnQodGlkLCAwKTsKIAkJZ290byBvdXQzOworCX0KIAogCWlwLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJamZzX2lwLT5kZXYgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsKQEAgLTEzNjAsNiArMTQwNyw3IEBACiAJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOwogCXVwKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CiAJaWYgKHJjKSB7CisJCWZyZWVfZWFfd21hcChpcCk7CiAJCWlwLT5pX25saW5rID0gMDsKIAkJaXB1dChpcCk7CiAJfSBlbHNlCkBAIC0xMzY4LDExICsxNDE2LDYgQEAKICAgICAgIG91dDE6CiAJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CiAKLSNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAotCWlmIChyYyA9PSAwKQotCQlqZnNfaW5pdF9hY2woaXAsIGRpcik7Ci0jZW5kaWYKLQogICAgICAgb3V0OgogCWpmc19pbmZvKCJqZnNfbWtub2Q6IHJldHVybmluZyAlZCIsIHJjKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDlmZjg5NzIuLjcxYmMzNGIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0yMyw5ICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSAiamZzX2luY29yZS5oIgogI2luY2x1ZGUgImpmc19maWxzeXMuaCIKQEAgLTE5Miw3ICsxOTQsOCBAQAogCiBlbnVtIHsKIAlPcHRfaW50ZWdyaXR5LCBPcHRfbm9pbnRlZ3JpdHksIE9wdF9pb2NoYXJzZXQsIE9wdF9yZXNpemUsCi0JT3B0X3Jlc2l6ZV9ub3NpemUsIE9wdF9lcnJvcnMsIE9wdF9pZ25vcmUsIE9wdF9lcnIsCisJT3B0X3Jlc2l6ZV9ub3NpemUsIE9wdF9lcnJvcnMsIE9wdF9pZ25vcmUsIE9wdF9lcnIsIE9wdF9xdW90YSwKKwlPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YQogfTsKIAogc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewpAQCAtMjA0LDggKzIwNyw4IEBACiAJe09wdF9lcnJvcnMsICJlcnJvcnM9JXMifSwKIAl7T3B0X2lnbm9yZSwgIm5vcXVvdGEifSwKIAl7T3B0X2lnbm9yZSwgInF1b3RhIn0sCi0Je09wdF9pZ25vcmUsICJ1c3JxdW90YSJ9LAotCXtPcHRfaWdub3JlLCAiZ3JwcXVvdGEifSwKKwl7T3B0X3VzcnF1b3RhLCAidXNycXVvdGEifSwKKwl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTI5Myw2ICsyOTYsMjQgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKKwkJY2FzZSBPcHRfcXVvdGE6CisJCWNhc2UgT3B0X3VzcnF1b3RhOgorCQkJKmZsYWcgfD0gSkZTX1VTUlFVT1RBOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJKmZsYWcgfD0gSkZTX0dSUFFVT1RBOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIE9wdF91c3JxdW90YToKKwkJY2FzZSBPcHRfZ3JwcXVvdGE6CisJCWNhc2UgT3B0X3F1b3RhOgorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkpGUzogcXVvdGEgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWJyZWFrOworI2VuZGlmCisKIAkJZGVmYXVsdDoKIAkJCXByaW50aygiamZzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCiAJCQkJCSIgb3IgbWlzc2luZyB2YWx1ZVxuIiwgcCk7CkBAIC01MzksNiArNTYwLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgamZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICp2ZnMpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHZmcy0+bW50X3NiKTsKKworCWlmIChzYmktPmZsYWcgJiBKRlNfTk9JTlRFR1JJVFkpCisJCXNlcV9wdXRzKHNlcSwgIixub2ludGVncml0eSIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLGludGVncml0eSIpOworCisjaWYgZGVmaW5lZChDT05GSUdfUVVPVEEpCisJaWYgKHNiaS0+ZmxhZyAmIEpGU19VU1JRVU9UQSkKKwkJc2VxX3B1dHMoc2VxLCAiLHVzcnF1b3RhIik7CisKKwlpZiAoc2JpLT5mbGFnICYgSkZTX0dSUFFVT1RBKQorCQlzZXFfcHV0cyhzZXEsICIsZ3JwcXVvdGEiKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBqZnNfc3VwZXJfb3BlcmF0aW9ucyA9IHsKIAkuYWxsb2NfaW5vZGUJPSBqZnNfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBqZnNfZGVzdHJveV9pbm9kZSwKQEAgLTU1Miw2ICs1OTMsNyBAQAogCS51bmxvY2tmcyAgICAgICA9IGpmc191bmxvY2tmcywKIAkuc3RhdGZzCQk9IGpmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBqZnNfcmVtb3VudCwKKwkuc2hvd19vcHRpb25zCT0gamZzX3Nob3dfb3B0aW9ucwogfTsKIAogc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBqZnNfZXhwb3J0X29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCmluZGV4IDU1NGVjNzMuLjIzYWE1MDYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy94YXR0ci5jCisrKyBiL2ZzL2pmcy94YXR0ci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSAiamZzX2luY29yZS5oIgogI2luY2x1ZGUgImpmc19zdXBlcmJsb2NrLmgiCiAjaW5jbHVkZSAiamZzX2RtYXAuaCIKQEAgLTYzMywxMiArNjM0LDEyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGVhX3B1dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZWFfYnVmZmVyICplYV9idWYsIGludCBuZXdfc2l6ZSkKK3N0YXRpYyBpbnQgZWFfcHV0KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmLAorCQkgIGludCBuZXdfc2l6ZSkKIHsKIAlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmppID0gSkZTX0lQKGlub2RlKTsKIAl1bnNpZ25lZCBsb25nIG9sZF9ibG9ja3MsIG5ld19ibG9ja3M7CiAJaW50IHJjID0gMDsKLQl0aWRfdCB0aWQ7CiAKIAlpZiAobmV3X3NpemUgPT0gMCkgewogCQllYV9yZWxlYXNlKGlub2RlLCBlYV9idWYpOwpAQCAtNjY0LDkgKzY2NSw2IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQl0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKLQlkb3duKCZqaS0+Y29tbWl0X3NlbSk7Ci0KIAlvbGRfYmxvY2tzID0gbmV3X2Jsb2NrcyA9IDA7CiAKIAlpZiAoamktPmVhLmZsYWcgJiBEWERfRVhURU5UKSB7CkBAIC02OTUsMTEgKzY5Myw4IEBACiAJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIG9sZF9ibG9ja3MpOwogCiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpbm9kZSwgMCk7Ci0JdHhFbmQodGlkKTsKLQl1cCgmamktPmNvbW1pdF9zZW0pOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtODEwLDggKzgwNSw4IEBACiAJcmV0dXJuIHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CiB9CiAKLWludCBfX2pmc19zZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKLQkJICAgc2l6ZV90IHZhbHVlX2xlbiwgaW50IGZsYWdzKQoraW50IF9famZzX3NldHhhdHRyKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgamZzX2VhX2xpc3QgKmVhbGlzdDsKIAlzdHJ1Y3QgamZzX2VhICplYSwgKm9sZF9lYSA9IE5VTEwsICpuZXh0X2VhID0gTlVMTDsKQEAgLTgyNSw5ICs4MjAsNiBAQAogCWludCByYzsKIAlpbnQgbGVuZ3RoOwogCi0JaWYgKChyYyA9IGNhbl9zZXRfeGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4pKSkKLQkJcmV0dXJuIHJjOwotCiAJaWYgKHN0cm5jbXAobmFtZSwgWEFUVFJfT1MyX1BSRUZJWCwgWEFUVFJfT1MyX1BSRUZJWF9MRU4pID09IDApIHsKIAkJb3MybmFtZSA9IGttYWxsb2MobmFtZWxlbiAtIFhBVFRSX09TMl9QUkVGSVhfTEVOICsgMSwKIAkJCQkgIEdGUF9LRVJORUwpOwpAQCAtOTM5LDcgKzkzMSw3IEBACiAKIAllYWxpc3QtPnNpemUgPSBjcHVfdG9fbGUzMihuZXdfc2l6ZSk7CiAKLQlyYyA9IGVhX3B1dChpbm9kZSwgJmVhX2J1ZiwgbmV3X3NpemUpOworCXJjID0gZWFfcHV0KHRpZCwgaW5vZGUsICZlYV9idWYsIG5ld19zaXplKTsKIAogCWdvdG8gb3V0OwogICAgICAgcmVsZWFzZToKQEAgLTk1NSwxMiArOTQ3LDI5IEBACiBpbnQgamZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCiAJCSBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmppID0gSkZTX0lQKGlub2RlKTsKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCisJaWYgKChyYyA9IGNhbl9zZXRfeGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4pKSkKKwkJcmV0dXJuIHJjOworCiAJaWYgKHZhbHVlID09IE5VTEwpIHsJLyogZW1wdHkgRUEsIGRvIG5vdCByZW1vdmUgKi8KIAkJdmFsdWUgPSAiIjsKIAkJdmFsdWVfbGVuID0gMDsKIAl9CiAKLQlyZXR1cm4gX19qZnNfc2V0eGF0dHIoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuLCBmbGFncyk7CisJdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgMCk7CisJZG93bigmamktPmNvbW1pdF9zZW0pOworCXJjID0gX19qZnNfc2V0eGF0dHIodGlkLCBkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4sCisJCQkgICAgZmxhZ3MpOworCWlmICghcmMpCisJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaW5vZGUsIDApOworCXR4RW5kKHRpZCk7CisJdXAoJmppLT5jb21taXRfc2VtKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjYW5fZ2V0X3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCkBAIC0xMTIyLDUgKzExMzEsNTYgQEAKIAogaW50IGpmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIF9famZzX3NldHhhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgTlVMTCwgMCwgWEFUVFJfUkVQTEFDRSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmppID0gSkZTX0lQKGlub2RlKTsKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCisJaWYgKChyYyA9IGNhbl9zZXRfeGF0dHIoaW5vZGUsIG5hbWUsIE5VTEwsIDApKSkKKwkJcmV0dXJuIHJjOworCisJdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgMCk7CisJZG93bigmamktPmNvbW1pdF9zZW0pOworCXJjID0gX19qZnNfc2V0eGF0dHIodGlkLCBkZW50cnktPmRfaW5vZGUsIG5hbWUsIE5VTEwsIDAsIFhBVFRSX1JFUExBQ0UpOworCWlmICghcmMpCisJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaW5vZGUsIDApOworCXR4RW5kKHRpZCk7CisJdXAoJmppLT5jb21taXRfc2VtKTsKKworCXJldHVybiByYzsKIH0KKworI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKK2ludCBqZnNfaW5pdF9zZWN1cml0eSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCWludCByYzsKKwlzaXplX3QgbGVuOworCXZvaWQgKnZhbHVlOworCWNoYXIgKnN1ZmZpeDsKKwljaGFyICpuYW1lOworCisJcmMgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsICZzdWZmaXgsICZ2YWx1ZSwgJmxlbik7CisJaWYgKHJjKSB7CisJCWlmIChyYyA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcmM7CisJfQorCW5hbWUgPSBrbWFsbG9jKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4gKyAxICsgc3RybGVuKHN1ZmZpeCksCisJCSAgICAgICBHRlBfTk9GUyk7CisJaWYgKCFuYW1lKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBrbWFsbG9jX2ZhaWxlZDsKKwl9CisJc3RyY3B5KG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCk7CisJc3RyY3B5KG5hbWUgKyBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOLCBzdWZmaXgpOworCisJcmMgPSBfX2pmc19zZXR4YXR0cih0aWQsIGlub2RlLCBuYW1lLCB2YWx1ZSwgbGVuLCAwKTsKKworCWtmcmVlKG5hbWUpOwora21hbGxvY19mYWlsZWQ6CisJa2ZyZWUoc3VmZml4KTsKKwlrZnJlZSh2YWx1ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMgYi9mcy9sb2NrZC9jbG50cHJvYy5jCmluZGV4IDE0YjNjZTguLjg3MzMyZjMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMKKysrIGIvZnMvbG9ja2QvY2xudHByb2MuYwpAQCAtMjk5LDggKzI5OSw3IEBACiAJCQlyZXR1cm4gY2FsbDsKIAkJfQogCQlwcmludGsoIm5sbWNsbnRfYWxsb2NfY2FsbDogZmFpbGVkLCB3YWl0aW5nIGZvciBtZW1vcnlcbiIpOwotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dCg1KkhaKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDUqSFopOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IDExOTU2YjYuLmMyYzA5YjQgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtMjE5OCwyMSArMjE5OCwyMyBAQAogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CiAJaW50IGksIGo7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCWlmIChmcm9tID09IGZpbGVzKQogCQlyZXR1cm47CiAKIAlsb2NrX2tlcm5lbCgpOwogCWogPSAwOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyBzZXQ7CiAJCWkgPSBqICogX19ORkRCSVRTOwotCQlpZiAoaSA+PSBmaWxlcy0+bWF4X2Zkc2V0IHx8IGkgPj0gZmlsZXMtPm1heF9mZHMpCisJCWlmIChpID49IGZkdC0+bWF4X2Zkc2V0IHx8IGkgPj0gZmR0LT5tYXhfZmRzKQogCQkJYnJlYWs7Ci0JCXNldCA9IGZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHNbaisrXTsKKwkJc2V0ID0gZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbaisrXTsKIAkJd2hpbGUgKHNldCkgewogCQkJaWYgKHNldCAmIDEpIHsKLQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVzLT5mZFtpXTsKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZkdC0+ZmRbaV07CiAJCQkJaWYgKGZpbGUpCiAJCQkJCV9fc3RlYWxfbG9ja3MoZmlsZSwgZnJvbSk7CiAJCQl9CmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwppbmRleCAzZjE4YzIxLi43OTBjYzBkIDEwMDY0NAotLS0gYS9mcy9taW5peC9pbm9kZS5jCisrKyBiL2ZzL21pbml4L2lub2RlLmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogc3RhdGljIHZvaWQgbWluaXhfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWlub2RlLT5pX3NpemUgPSAwOwogCW1pbml4X3RydW5jYXRlKGlub2RlKTsKIAltaW5peF9mcmVlX2lub2RlKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDZlYzFmMGYuLjIxZDg1ZjEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtNTI1LDYgKzUyNSwyMiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGRwdXRfcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJZHB1dChwYXRoLT5kZW50cnkpOworCWlmIChwYXRoLT5tbnQgIT0gbmQtPm1udCkKKwkJbW50cHV0KHBhdGgtPm1udCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXRoX3RvX25hbWVpZGF0YShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJZHB1dChuZC0+ZGVudHJ5KTsKKwlpZiAobmQtPm1udCAhPSBwYXRoLT5tbnQpCisJCW1udHB1dChuZC0+bW50KTsKKwluZC0+bW50ID0gcGF0aC0+bW50OworCW5kLT5kZW50cnkgPSBwYXRoLT5kZW50cnk7Cit9CisKIC8qCiAgKiBUaGlzIGxpbWl0cyByZWN1cnNpdmUgc3ltbGluayBmb2xsb3dzIHRvIDgsIHdoaWxlCiAgKiBsaW1pdGluZyBjb25zZWN1dGl2ZSBzeW1saW5rcyB0byA0MC4KQEAgLTU1Miw5ICs1NjgsNyBAQAogCW5kLT5kZXB0aC0tOwogCXJldHVybiBlcnI7CiBsb29wOgotCWRwdXQocGF0aC0+ZGVudHJ5KTsKLQlpZiAocGF0aC0+bW50ICE9IG5kLT5tbnQpCi0JCW1udHB1dChwYXRoLT5tbnQpOworCWRwdXRfcGF0aChwYXRoLCBuZCk7CiAJcGF0aF9yZWxlYXNlKG5kKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtODEzLDEzICs4MjcsOCBAQAogCQkJZXJyID0gLUVOT1RESVI7IAogCQkJaWYgKCFpbm9kZS0+aV9vcCkKIAkJCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWRwdXQobmQtPmRlbnRyeSk7Ci0JCQlpZiAobmQtPm1udCAhPSBuZXh0Lm1udCkKLQkJCQltbnRwdXQobmQtPm1udCk7Ci0JCQluZC0+bW50ID0gbmV4dC5tbnQ7Ci0JCQluZC0+ZGVudHJ5ID0gbmV4dC5kZW50cnk7Ci0JCX0KKwkJfSBlbHNlCisJCQlwYXRoX3RvX25hbWVpZGF0YSgmbmV4dCwgbmQpOwogCQllcnIgPSAtRU5PVERJUjsgCiAJCWlmICghaW5vZGUtPmlfb3AtPmxvb2t1cCkKIAkJCWJyZWFrOwpAQCAtODU5LDEzICs4NjgsOCBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIHJldHVybl9lcnI7CiAJCQlpbm9kZSA9IG5kLT5kZW50cnktPmRfaW5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQlkcHV0KG5kLT5kZW50cnkpOwotCQkJaWYgKG5kLT5tbnQgIT0gbmV4dC5tbnQpCi0JCQkJbW50cHV0KG5kLT5tbnQpOwotCQkJbmQtPm1udCA9IG5leHQubW50OwotCQkJbmQtPmRlbnRyeSA9IG5leHQuZGVudHJ5OwotCQl9CisJCX0gZWxzZQorCQkJcGF0aF90b19uYW1laWRhdGEoJm5leHQsIG5kKTsKIAkJZXJyID0gLUVOT0VOVDsKIAkJaWYgKCFpbm9kZSkKIAkJCWJyZWFrOwpAQCAtOTAxLDkgKzkwNSw3IEBACiByZXR1cm5fYmFzZToKIAkJcmV0dXJuIDA7CiBvdXRfZHB1dDoKLQkJZHB1dChuZXh0LmRlbnRyeSk7Ci0JCWlmIChuZC0+bW50ICE9IG5leHQubW50KQotCQkJbW50cHV0KG5leHQubW50KTsKKwkJZHB1dF9wYXRoKCZuZXh0LCBuZCk7CiAJCWJyZWFrOwogCX0KIAlwYXRoX3JlbGVhc2UobmQpOwpAQCAtMTMxNCwxMCArMTMxNiw4IEBACiAJCXJldHVybiBlcnJvcjsKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPmNyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSwgbmQpOwotCWlmICghZXJyb3IpIHsKKwlpZiAoIWVycm9yKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9jcmVhdGUoZGlyLCBkZW50cnksIG1vZGUpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE1MDcsMTEgKzE1MDcsNyBAQAogCWlmIChwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9vcCAmJiBwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspCiAJCWdvdG8gZG9fbGluazsKIAotCWRwdXQobmQtPmRlbnRyeSk7Ci0JbmQtPmRlbnRyeSA9IHBhdGguZGVudHJ5OwotCWlmIChuZC0+bW50ICE9IHBhdGgubW50KQotCQltbnRwdXQobmQtPm1udCk7Ci0JbmQtPm1udCA9IHBhdGgubW50OworCXBhdGhfdG9fbmFtZWlkYXRhKCZwYXRoLCBuZCk7CiAJZXJyb3IgPSAtRUlTRElSOwogCWlmIChwYXRoLmRlbnRyeS0+ZF9pbm9kZSAmJiBTX0lTRElSKHBhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQlnb3RvIGV4aXQ7CkBAIC0xNTIyLDkgKzE1MTgsNyBAQAogCXJldHVybiAwOwogCiBleGl0X2RwdXQ6Ci0JZHB1dChwYXRoLmRlbnRyeSk7Ci0JaWYgKG5kLT5tbnQgIT0gcGF0aC5tbnQpCi0JCW1udHB1dChwYXRoLm1udCk7CisJZHB1dF9wYXRoKCZwYXRoLCBuZCk7CiBleGl0OgogCXBhdGhfcmVsZWFzZShuZCk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTYzOSwxMCArMTYzMyw4IEBACiAKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPm1rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwotCWlmICghZXJyb3IpIHsKKwlpZiAoIWVycm9yKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsKLQl9CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNzEyLDEwICsxNzA0LDggQEAKIAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+bWtkaXIoZGlyLCBkZW50cnksIG1vZGUpOwotCWlmICghZXJyb3IpIHsKKwlpZiAoIWVycm9yKQogCQlmc25vdGlmeV9ta2RpcihkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rZGlyKGRpcixkZW50cnksIG1vZGUpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE5NTEsMTAgKzE5NDEsOCBAQAogCiAJRFFVT1RfSU5JVChkaXIpOwogCWVycm9yID0gZGlyLT5pX29wLT5zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKLQlpZiAoIWVycm9yKSB7CisJaWYgKCFlcnJvcikKIAkJZnNub3RpZnlfY3JlYXRlKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JCXNlY3VyaXR5X2lub2RlX3Bvc3Rfc3ltbGluayhkaXIsIGRlbnRyeSwgb2xkbmFtZSk7Ci0JfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjAyNCwxMCArMjAxMiw4IEBACiAJRFFVT1RfSU5JVChkaXIpOwogCWVycm9yID0gZGlyLT5pX29wLT5saW5rKG9sZF9kZW50cnksIGRpciwgbmV3X2RlbnRyeSk7CiAJdXAoJm9sZF9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKLQlpZiAoIWVycm9yKSB7CisJaWYgKCFlcnJvcikKIAkJZnNub3RpZnlfY3JlYXRlKGRpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQlzZWN1cml0eV9pbm9kZV9wb3N0X2xpbmsob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKLQl9CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0yMTQ2LDExICsyMTMyLDggQEAKIAkJCWRfcmVoYXNoKG5ld19kZW50cnkpOwogCQlkcHV0KG5ld19kZW50cnkpOwogCX0KLQlpZiAoIWVycm9yKSB7CisJaWYgKCFlcnJvcikKIAkJZF9tb3ZlKG9sZF9kZW50cnksbmV3X2RlbnRyeSk7Ci0JCXNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksCi0JCQkJCSAgIG5ld19kaXIsIG5ld19kZW50cnkpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTIxNzYsNyArMjE1OSw2IEBACiAJCS8qIFRoZSBmb2xsb3dpbmcgZF9tb3ZlKCkgc2hvdWxkIGJlY29tZSB1bmNvbmRpdGlvbmFsICovCiAJCWlmICghKG9sZF9kaXItPmlfc2ItPnNfdHlwZS0+ZnNfZmxhZ3MgJiBGU19PRERfUkVOQU1FKSkKIAkJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKLQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9yZW5hbWUob2xkX2Rpciwgb2xkX2RlbnRyeSwgbmV3X2RpciwgbmV3X2RlbnRyeSk7CiAJfQogCWlmICh0YXJnZXQpCiAJCXVwKCZ0YXJnZXQtPmlfc2VtKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggNzliZDhhNC4uMmZhOWZkZiAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTQwLDcgKzQwLDcgQEAKICBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sodmZzbW91bnRfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudF9oYXNodGFibGU7Ci1zdGF0aWMgaW50IGhhc2hfbWFzaywgaGFzaF9iaXRzOworc3RhdGljIGludCBoYXNoX21hc2sgX19yZWFkX21vc3RseSwgaGFzaF9iaXRzIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMga21lbV9jYWNoZV90ICptbnRfY2FjaGU7IAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGFzaChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQpAQCAtNTM3LDcgKzUzNyw2IEBACiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpjb3B5X3RyZWUoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKnJlcywgKnAsICpxLCAqciwgKnM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaDsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwogCiAJcmVzID0gcSA9IGNsb25lX21udChtbnQsIGRlbnRyeSk7CkBAIC01NDYsOCArNTQ1LDcgQEAKIAlxLT5tbnRfbW91bnRwb2ludCA9IG1udC0+bW50X21vdW50cG9pbnQ7CiAKIAlwID0gbW50OwotCWZvciAoaCA9IG1udC0+bW50X21vdW50cy5uZXh0OyBoICE9ICZtbnQtPm1udF9tb3VudHM7IGggPSBoLT5uZXh0KSB7Ci0JCXIgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2NoaWxkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZtbnQtPm1udF9tb3VudHMsIG1udF9jaGlsZCkgewogCQlpZiAoIWxpdmVzX2JlbG93X2luX3NhbWVfZnMoci0+bW50X21vdW50cG9pbnQsIGRlbnRyeSkpCiAJCQljb250aW51ZTsKIApAQCAtMTMzNCw4ICsxMzMyLDEyIEBACiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmICh1c2VyX25kLm1udC0+bW50X3Jvb3QgIT0gdXNlcl9uZC5kZW50cnkpCiAJCWdvdG8gb3V0MjsgLyogbm90IGEgbW91bnRwb2ludCAqLworCWlmICh1c2VyX25kLm1udC0+bW50X3BhcmVudCA9PSB1c2VyX25kLm1udCkKKwkJZ290byBvdXQyOyAvKiBub3QgYXR0YWNoZWQgKi8KIAlpZiAobmV3X25kLm1udC0+bW50X3Jvb3QgIT0gbmV3X25kLmRlbnRyeSkKIAkJZ290byBvdXQyOyAvKiBub3QgYSBtb3VudHBvaW50ICovCisJaWYgKG5ld19uZC5tbnQtPm1udF9wYXJlbnQgPT0gbmV3X25kLm1udCkKKwkJZ290byBvdXQyOyAvKiBub3QgYXR0YWNoZWQgKi8KIAl0bXAgPSBvbGRfbmQubW50OyAvKiBtYWtlIHN1cmUgd2UgY2FuIHJlYWNoIHB1dF9vbGQgZnJvbSBuZXdfcm9vdCAqLwogCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CiAJaWYgKHRtcCAhPSBuZXdfbmQubW50KSB7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pbm9kZS5jIGIvZnMvbmNwZnMvaW5vZGUuYwppbmRleCA0NDc5NWQyLi44Yzg4MzkyIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pbm9kZS5jCisrKyBiL2ZzL25jcGZzL2lub2RlLmMKQEAgLTI4Niw2ICsyODYsOCBAQAogc3RhdGljIHZvaWQKIG5jcF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQlERFBSSU5USygibmNwX2RlbGV0ZV9pbm9kZTogcHV0IGRpcmVjdG9yeSAlbGRcbiIsIGlub2RlLT5pX2lubyk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYwppbmRleCA1NDFiNDE4Li42OTIyNDY5ZCAxMDA2NDQKLS0tIGEvZnMvbmZzL2lub2RlLmMKKysrIGIvZnMvbmZzL2lub2RlLmMKQEAgLTE0Niw2ICsxNDYsOCBAQAogewogCWRwcmludGsoIk5GUzogZGVsZXRlX2lub2RlKCVzLyVsZClcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwogCisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCiAJbmZzX3diX2FsbChpbm9kZSk7CiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzcHJvYy5jIGIvZnMvbmZzL25mczNwcm9jLmMKaW5kZXggMjY4MTQ4NS4uZWRjOTU1MSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNwcm9jLmMKKysrIGIvZnMvbmZzL25mczNwcm9jLmMKQEAgLTM0LDggKzM0LDcgQEAKIAkJcmVzID0gcnBjX2NhbGxfc3luYyhjbG50LCBtc2csIGZsYWdzKTsKIAkJaWYgKHJlcyAhPSAtRUpVS0VCT1gpCiAJCQlicmVhazsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChORlNfSlVLRUJPWF9SRVRSWV9USU1FKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKE5GU19KVUtFQk9YX1JFVFJZX1RJTUUpOwogCQlyZXMgPSAtRVJFU1RBUlRTWVM7CiAJfSB3aGlsZSAoIXNpZ25hbGxlZCgpKTsKIAlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHByb2MuYyBiL2ZzL25mcy9uZnM0cHJvYy5jCmluZGV4IDBjNWEzMDguLjk3MDFjYTggMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0cHJvYy5jCisrKyBiL2ZzL25mcy9uZnM0cHJvYy5jCkBAIC0yNDE4LDE0ICsyNDE4LDExIEBACiAJCSp0aW1lb3V0ID0gTkZTNF9QT0xMX1JFVFJZX01BWDsKIAlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOwogCWlmIChjbG50LT5jbF9pbnRyKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvdXQpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKnRpbWVvdXQpOwogCQlpZiAoc2lnbmFsbGVkKCkpCiAJCQlyZXMgPSAtRVJFU1RBUlRTWVM7Ci0JfSBlbHNlIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KCp0aW1lb3V0KTsKLQl9CisJfSBlbHNlCisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKCp0aW1lb3V0KTsKIAlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CiAJKnRpbWVvdXQgPDw9IDE7CiAJcmV0dXJuIHJlczsKQEAgLTI1NzgsOCArMjU3NSw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZwogbmZzNF9zZXRfbG9ja190YXNrX3JldHJ5KHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAl0aW1lb3V0IDw8PSAxOwogCWlmICh0aW1lb3V0ID4gTkZTNF9MT0NLX01BWFRJTUVPVVQpCiAJCXJldHVybiBORlM0X0xPQ0tfTUFYVElNRU9VVDsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvZXhwb3J0LmMgYi9mcy9uZnNkL2V4cG9ydC5jCmluZGV4IDlhMTFhYTMuLjA1N2FmZjcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvZXhwb3J0LmMKKysrIGIvZnMvbmZzZC9leHBvcnQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CkBAIC0yMjEsNiArMjIyLDcgQEAKIH0KIAkKIHN0cnVjdCBjYWNoZV9kZXRhaWwgc3ZjX2V4cGtleV9jYWNoZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmhhc2hfc2l6ZQk9IEVYUEtFWV9IQVNITUFYLAogCS5oYXNoX3RhYmxlCT0gZXhwa2V5X3RhYmxlLAogCS5uYW1lCQk9ICJuZnNkLmZoIiwKQEAgLTQ1Niw2ICs0NTgsNyBAQAogCXJldHVybiAwOwogfQogc3RydWN0IGNhY2hlX2RldGFpbCBzdmNfZXhwb3J0X2NhY2hlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaGFzaF9zaXplCT0gRVhQT1JUX0hBU0hNQVgsCiAJLmhhc2hfdGFibGUJPSBleHBvcnRfdGFibGUsCiAJLm5hbWUJCT0gIm5mc2QuZXhwb3J0IiwKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGlkbWFwLmMgYi9mcy9uZnNkL25mczRpZG1hcC5jCmluZGV4IDU2MDVhMjYuLjEzMzY5NjUgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGlkbWFwLmMKKysrIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwpAQCAtMTg3LDYgKzE4Nyw3IEBACiBzdGF0aWMgc3RydWN0IGVudCAqaWR0b25hbWVfbG9va3VwKHN0cnVjdCBlbnQgKiwgaW50KTsKIAogc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgaWR0b25hbWVfY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBFTlRfSEFTSE1BWCwKIAkuaGFzaF90YWJsZQk9IGlkdG9uYW1lX3RhYmxlLAogCS5uYW1lCQk9ICJuZnM0LmlkdG9uYW1lIiwKQEAgLTMyMCw2ICszMjEsNyBAQAogc3RhdGljIGludCAgICAgICAgIG5hbWV0b2lkX3BhcnNlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKiwgY2hhciAqLCBpbnQpOwogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCBuYW1ldG9pZF9jYWNoZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmhhc2hfc2l6ZQk9IEVOVF9IQVNITUFYLAogCS5oYXNoX3RhYmxlCT0gbmFtZXRvaWRfdGFibGUsCiAJLm5hbWUJCT0gIm5mczQubmFtZXRvaWQiLApAQCAtNDA0LDggKzQwNiwxMCBAQAogdm9pZAogbmZzZF9pZG1hcF9zaHV0ZG93bih2b2lkKQogewotCWNhY2hlX3VucmVnaXN0ZXIoJmlkdG9uYW1lX2NhY2hlKTsKLQljYWNoZV91bnJlZ2lzdGVyKCZuYW1ldG9pZF9jYWNoZSk7CisJaWYgKGNhY2hlX3VucmVnaXN0ZXIoJmlkdG9uYW1lX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJuZnNkOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBpZHRvbmFtZSBjYWNoZVxuIik7CisJaWYgKGNhY2hlX3VucmVnaXN0ZXIoJm5hbWV0b2lkX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJuZnNkOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBuYW1ldG9pZCBjYWNoZVxuIik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9udGZzL0NoYW5nZUxvZyBiL2ZzL250ZnMvQ2hhbmdlTG9nCmluZGV4IDllZWNjOTkuLmU0ZmQ2MTMgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvQ2hhbmdlTG9nCisrKyBiL2ZzL250ZnMvQ2hhbmdlTG9nCkBAIC0yMiw2ICsyMiw3NiBAQAogCS0gRW5hYmxlIHRoZSBjb2RlIGZvciBzZXR0aW5nIHRoZSBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIHdoZW4gd2Ugc3RhcnQKIAkgIG1ha2luZyBOVEZTIDEuMiBzcGVjaWZpYyBtb2RpZmljYXRpb25zLgogCisyLjEuMjQgLSBMb3RzIG9mIGJ1ZyBmaXhlcyBhbmQgc3VwcG9ydCBtb3JlIGNsZWFuIGpvdXJuYWwgc3RhdGVzLgorCisJLSBTdXBwb3J0IGpvdXJuYWxzICgkTG9nRmlsZSkgd2hpY2ggaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGNoa2Rzay4gIFRoaXMKKwkgIG1lYW5zIHVzZXJzIGNhbiBib290IGludG8gV2luZG93cyBhZnRlciB3ZSBtYXJrZWQgdGhlIHZvbHVtZSBkaXJ0eS4KKwkgIFRoZSBXaW5kb3dzIGJvb3Qgd2lsbCBydW4gY2hrZHNrIGFuZCB0aGVuIHJlYm9vdC4gIFRoZSB1c2VyIGNhbiB0aGVuCisJICBpbW1lZGlhdGVseSBib290IGludG8gTGludXggcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGRvIGEgZnVsbCBXaW5kb3dzCisJICBib290IGZpcnN0IGJlZm9yZSByZWJvb3RpbmcgaW50byBMaW51eCBhbmQgd2Ugd2lsbCByZWNvZ25pemUgc3VjaCBhCisJICBqb3VybmFsIGFuZCBlbXB0eSBpdCBhcyBpdCBpcyBjbGVhbiBieSBkZWZpbml0aW9uLgorCS0gU3VwcG9ydCBqb3VybmFscyAoJExvZ0ZpbGUpIHdpdGggb25seSBvbmUgcmVzdGFydCBwYWdlIGFzIHdlbGwgYXMKKwkgIGpvdXJuYWxzIHdpdGggdHdvIGRpZmZlcmVudCByZXN0YXJ0IHBhZ2VzLiAgV2Ugc2FuaXR5IGNoZWNrIGJvdGggYW5kCisJICBlaXRoZXIgdXNlIHRoZSBvbmx5IHNhbmUgb25lIG9yIHRoZSBtb3JlIHJlY2VudCBvbmUgb2YgdGhlIHR3byBpbiB0aGUKKwkgIGNhc2UgdGhhdCBib3RoIGFyZSB2YWxpZC4KKwktIE1vZGlmeSBmcy9udGZzL21hbGxvYy5oOjpudGZzX21hbGxvY19ub2ZzKCkgdG8gZG8gdGhlIGttYWxsb2MoKSBiYXNlZAorCSAgYWxsb2NhdGlvbnMgd2l0aCBfX0dGUF9ISUdITUVNLCBhbmFsb2dvdXMgdG8gaG93IHRoZSB2bWFsbG9jKCkgYmFzZWQKKwkgIGFsbG9jYXRpb25zIGFyZSBkb25lLgorCS0gQWRkIGZzL250ZnMvbWFsbG9jLmg6Om50ZnNfbWFsbG9jX25vZnNfbm9mYWlsKCkgd2hpY2ggaXMgYW5hbG9nb3VzIHRvCisJICBudGZzX21hbGxvY19ub2ZzKCkgYnV0IGl0IHBlcmZvcm1zIGFsbG9jYXRpb25zIHdpdGggX19HRlBfTk9GQUlMIGFuZAorCSAgaGVuY2UgY2Fubm90IGZhaWwuCisJLSBVc2UgbnRmc19tYWxsb2Nfbm9mc19ub2ZhaWwoKSBpbiB0aGUgdHdvIGNyaXRpY2FsIHJlZ2lvbnMgaW4KKwkgIGZzL250ZnMvcnVubGlzdC5jOjpudGZzX3J1bmxpc3RzX21lcmdlKCkuICBUaGlzIG1lYW5zIHdlIG5vIGxvbmdlcgorCSAgbmVlZCB0byBwYW5pYygpIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzIGFzIGl0IG5vdyBjYW5ub3QgZmFpbC4KKwktIEZpeCB0d28gbmFzdHkgcnVubGlzdCBtZXJnaW5nIGJ1Z3MgdGhhdCBoYWQgZ29uZSB1bm5vdGljZWQgc28gZmFyLgorCSAgVGhhbmtzIHRvIFN0ZWZhbm8gUGljZXJubyBmb3IgdGhlIGJ1ZyByZXBvcnQuCisJLSBSZW1vdmUgdHdvIGJvZ3VzIEJVR19PTigpcyBmcm9tIGZzL250ZnMvbWZ0LmMuCisJLSBGaXggaGFuZGxpbmcgb2YgdmFsaWQgYnV0IGVtcHR5IG1hcHBpbmcgcGFpcnMgYXJyYXkgaW4KKwkgIGZzL250ZnMvcnVubGlzdC5jOjpudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcygpLgorCS0gUmVwb3J0IHVucmVwcmVzZW50YWJsZSBpbm9kZXMgZHVyaW5nIG50ZnNfcmVhZGRpcigpIGFzIEtFUk5fV0FSTklORworCSAgbWVzc2FnZXMgYW5kIGluY2x1ZGUgdGhlIGlub2RlIG51bWJlci4gIFRoYW5rcyB0byBZdXJhIFBha2h1Y2hpeSBmb3IKKwkgIHBvaW50aW5nIHRoaXMgb3V0LgorCS0gQ2hhbmdlIG50ZnNfcmxfdHJ1bmNhdGVfbm9sb2NrKCkgdG8gdGhyb3cgYXdheSB0aGUgcnVubGlzdCBpZiB0aGUgbmV3CisJICBsZW5ndGggaXMgemVyby4KKwktIEFkZCBydW5saXN0LltoY106Om50ZnNfcmxfcHVuY2hfbm9sb2NrKCkgd2hpY2ggcHVuY2hlcyBhIGNhbGxlcgorCSAgc3BlY2lmaWVkIGhvbGUgaW50byBhIHJ1bmxpc3QuCisJLSBGaXggYSBidWcgaW4gZnMvbnRmcy9pbmRleC5jOjpudGZzX2luZGV4X2xvb2t1cCgpLiAgV2hlbiB0aGUgcmV0dXJuZWQKKwkgIGluZGV4IGVudHJ5IGlzIGluIHRoZSBpbmRleCByb290LCB3ZSBmb3Jnb3QgdG8gc2V0IHRoZSBAaXIgcG9pbnRlciBpbgorCSAgdGhlIGluZGV4IGNvbnRleHQuICBUaGFua3MgdG8gWXVyYSBQYWtodWNoaXkgZm9yIGZpbmRpbmcgdGhpcyBidWcuCisJLSBSZW1vdmUgYm9ndXMgc2V0dGluZyBvZiBQYWdlRXJyb3IgaW4gbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2soKS4KKwktIEFkZCBmcy9udGZzL2F0dHJpYi5baGNdOjpudGZzX3Jlc2lkZW50X2F0dHJfdmFsdWVfcmVzaXplKCkuCisJLSBGaXggYSBidWcgaW4gbnRmc19tYXBfcnVubGlzdF9ub2xvY2soKSB3aGVyZSB3ZSBmb3Jnb3QgdG8gcHJvdGVjdAorCSAgYWNjZXNzIHRvIHRoZSBhbGxvY2F0ZWQgc2l6ZSBpbiB0aGUgbnRmcyBpbm9kZSB3aXRoIHRoZSBzaXplIGxvY2suCisJLSBGaXggbnRmc19hdHRyX3Zjbl90b19sY25fbm9sb2NrKCkgYW5kIG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2soKSB0bworCSAgcmV0dXJuIExDTl9FTk9FTlQgd2hlbiB0aGVyZSBpcyBubyBydW5saXN0IGFuZCB0aGUgYWxsb2NhdGVkIHNpemUgaXMKKwkgIHplcm8uCisJLSBGaXggbG9hZF9hdHRyaWJ1dGVfbGlzdCgpIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBhIE5VTEwgcnVubGlzdC4KKwktIEZpeCBoYW5kbGluZyBvZiBzcGFyc2UgYXR0cmlidXRlcyBpbiBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQoKS4KKwktIEFkZCBCVUcoKSBjaGVja3MgdG8gbnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50KCkgYW5kIG50ZnNfYXR0cl9zZXQoKQorCSAgdG8gZW5zdXJlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBuZXZlciBjYWxsZWQgZm9yIGNvbXByZXNzZWQgb3IKKwkgIGVuY3J5cHRlZCBhdHRyaWJ1dGVzLgorCS0gRml4IGNsdXN0ZXIgKGRlKWFsbG9jYXRvcnMgdG8gd29yayB3aGVuIHRoZSBydW5saXN0IGlzIE5VTEwgYW5kIG1vcmUKKwkgIGltcG9ydGFudGx5IHRvIHRha2UgYSBsb2NrZWQgcnVubGlzdCByYXRoZXIgdGhhbiB0aGVtIGxvY2tpbmcgaXQKKwkgIHdoaWNoIGxlYWRzIHRvIGxvY2sgcmV2ZXJzYWwuCisJLSBUcnVuY2F0ZSB7YSxjLG19dGltZSB0byB0aGUgbnRmcyBzdXBwb3J0ZWQgdGltZSBncmFudWxhcml0eSB3aGVuCisJICB1cGRhdGluZyB0aGUgdGltZXMgaW4gdGhlIGlub2RlIGluIG50ZnNfc2V0YXR0cigpLgorCS0gRml4dXAgaGFuZGxpbmcgb2Ygc3BhcnNlLCBjb21wcmVzc2VkLCBhbmQgZW5jcnlwdGVkIGF0dHJpYnV0ZXMgaW4KKwkgIGZzL250ZnMvaW5vZGUuYzo6bnRmc19yZWFkX2xvY2tlZF97LGF0dHJfLGluZGV4X31pbm9kZSgpLAorCSAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3JlYWQsd3JpdGV9cGFnZSgpLgorCS0gTWFrZSBudGZzX3dyaXRlX2Jsb2NrKCkgbm90IGluc3RhbnRpYXRlIHNwYXJzZSBibG9ja3MgaWYgdGhleSBjb250YWluCisJICBvbmx5IHplcm9lcy4KKwktIE9wdGltaXplIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlX2Jsb2NrKCkgYnkgZXh0ZW5kaW5nIHRoZSBwYWdlCisJICBsb2NrIHByb3RlY3Rpb24gb3ZlciB0aGUgYnVmZmVyIHN1Ym1pc3Npb24gZm9yIGkvbyB3aGljaCBhbGxvd3MgdGhlCisJICByZW1vdmFsIG9mIHRoZSBnZXRfYmgoKS9wdXRfYmgoKSBwYWlycyBmb3IgZWFjaCBidWZmZXIuCisJLSBGaXggZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3JlYWQsd3JpdGV9X2Jsb2NrKCkgdG8gaGFuZGxlIHRoZSBjYXNlCisJICB3aGVyZSBhIGNvbmN1cnJlbnQgdHJ1bmNhdGUgaGFzIHRydW5jYXRlZCB0aGUgcnVubGlzdCB1bmRlciBvdXIgZmVldC4KKwktIEZpeCBwYWdlX2hhc19idWZmZXJzKCkvcGFnZV9idWZmZXJzKCkgaGFuZGxpbmcgaW4gZnMvbnRmcy9hb3BzLmMuCisJLSBJbiBmcy9udGZzL2FvcHMuYzo6bnRmc19lbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSwgdXNlIGEgYml0IHNwaW4gbG9jaworCSAgaW4gdGhlIGZpcnN0IGJ1ZmZlciBoZWFkIGluc3RlYWQgb2YgYSBkcml2ZXIgZ2xvYmFsIHNwaW4gbG9jayB0bworCSAgaW1wcm92ZSBzY2FsYWJpbGl0eS4KKwktIE1pbm9yIGZpeCB0byBlcnJvciBoYW5kbGluZyBhbmQgZXJyb3IgbWVzc2FnZSBkaXNwbGF5IGluCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19wcmVwYXJlX25vbnJlc2lkZW50X3dyaXRlKCkuIAorCiAyLjEuMjMgLSBJbXBsZW1lbnQgZXh0ZW5zaW9uIG9mIHJlc2lkZW50IGZpbGVzIGFuZCBtYWtlIHdyaXRpbmcgc2FmZSBhcyB3ZWxsIGFzCiAJIG1hbnkgYnVnIGZpeGVzLCBjbGVhbnVwcywgYW5kIGVuaGFuY2VtZW50cy4uLgogCmRpZmYgLS1naXQgYS9mcy9udGZzL01ha2VmaWxlIGIvZnMvbnRmcy9NYWtlZmlsZQppbmRleCBmMDgzZjI3Li44OTRiMmI4IDEwMDY0NAotLS0gYS9mcy9udGZzL01ha2VmaWxlCisrKyBiL2ZzL250ZnMvTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiAJICAgICBpbmRleC5vIGlub2RlLm8gbWZ0Lm8gbXN0Lm8gbmFtZWkubyBydW5saXN0Lm8gc3VwZXIubyBzeXNjdGwubyBcCiAJICAgICB1bmlzdHIubyB1cGNhc2UubwogCi1FWFRSQV9DRkxBR1MgPSAtRE5URlNfVkVSU0lPTj1cIjIuMS4yM1wiCitFWFRSQV9DRkxBR1MgPSAtRE5URlNfVkVSU0lPTj1cIjIuMS4yNFwiCiAKIGlmZXEgKCQoQ09ORklHX05URlNfREVCVUcpLHkpCiBFWFRSQV9DRkxBR1MgKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hb3BzLmMgYi9mcy9udGZzL2FvcHMuYwppbmRleCA3OGFkYWQ3Li5iNmNjOGNmIDEwMDY0NAotLS0gYS9mcy9udGZzL2FvcHMuYworKysgYi9mcy9udGZzL2FvcHMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdF9zcGlubG9jay5oPgogCiAjaW5jbHVkZSAiYW9wcy5oIgogI2luY2x1ZGUgImF0dHJpYi5oIgpAQCAtNTUsOSArNTYsOCBAQAogICovCiBzdGF0aWMgdm9pZCBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCiB7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhwYWdlX3VwdG9kYXRlX2xvY2spOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdCwgKnRtcDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAludGZzX2lub2RlICpuaTsKIAlpbnQgcGFnZV91cHRvZGF0ZSA9IDE7CkBAIC04OSwxMSArODksMTMgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkJ1ZmZlciBJL08gZXJyb3IsIGxvZ2ljYWwgYmxvY2sgJWxsdS4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7Ci0JCVNldFBhZ2VFcnJvcihwYWdlKTsKIAl9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWZpcnN0ID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwliaXRfc3Bpbl9sb2NrKEJIX1VwdG9kYXRlX0xvY2ssICZmaXJzdC0+Yl9zdGF0ZSk7CiAJY2xlYXJfYnVmZmVyX2FzeW5jX3JlYWQoYmgpOwogCXVubG9ja19idWZmZXIoYmgpOwogCXRtcCA9IGJoOwpAQCAtMTA4LDcgKzExMCw4IEBACiAJCX0KIAkJdG1wID0gdG1wLT5iX3RoaXNfcGFnZTsKIAl9IHdoaWxlICh0bXAgIT0gYmgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWJpdF9zcGluX3VubG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkvKgogCSAqIElmIG5vbmUgb2YgdGhlIGJ1ZmZlcnMgaGFkIGVycm9ycyB0aGVuIHdlIGNhbiBzZXQgdGhlIHBhZ2UgdXB0b2RhdGUsCiAJICogYnV0IHdlIGZpcnN0IGhhdmUgdG8gcGVyZm9ybSB0aGUgcG9zdCByZWFkIG1zdCBmaXh1cHMsIGlmIHRoZQpAQCAtMTQxLDcgKzE0NCw4IEBACiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuOwogc3RpbGxfYnVzeToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuOwogfQogCkBAIC0xODUsMTMgKzE4OSwxNSBAQAogCWJsb2Nrc2l6ZV9iaXRzID0gVkZTX0kobmkpLT5pX2Jsa2JpdHM7CiAJYmxvY2tzaXplID0gMSA8PCBibG9ja3NpemVfYml0czsKIAotCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKIAkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKLQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ci0JaWYgKHVubGlrZWx5KCFiaCkpIHsKLQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlpZiAodW5saWtlbHkoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJfQorCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlCVUdfT04oIWJoKTsKIAogCWlibG9jayA9IChzNjQpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibG9ja3NpemVfYml0cyk7CiAJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKQEAgLTIwNCw2ICsyMTAsNyBAQAogCW5yID0gaSA9IDA7CiAJZG8gewogCQl1OCAqa2FkZHI7CisJCWludCBlcnI7CiAKIAkJaWYgKHVubGlrZWx5KGJ1ZmZlcl91cHRvZGF0ZShiaCkpKQogCQkJY29udGludWU7CkBAIC0yMTEsNiArMjE4LDcgQEAKIAkJCWFycltucisrXSA9IGJoOwogCQkJY29udGludWU7CiAJCX0KKwkJZXJyID0gMDsKIAkJYmgtPmJfYmRldiA9IHZvbC0+c2ItPnNfYmRldjsKIAkJLyogSXMgdGhlIGJsb2NrIHdpdGhpbiB0aGUgYWxsb3dlZCBsaW1pdHM/ICovCiAJCWlmIChpYmxvY2sgPCBsYmxvY2spIHsKQEAgLTI1Miw3ICsyNjAsNiBAQAogCQkJCWdvdG8gaGFuZGxlX2hvbGU7CiAJCQkvKiBJZiBmaXJzdCB0cnkgYW5kIHJ1bmxpc3QgdW5tYXBwZWQsIG1hcCBhbmQgcmV0cnkuICovCiAJCQlpZiAoIWlzX3JldHJ5ICYmIGxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkgewotCQkJCWludCBlcnI7CiAJCQkJaXNfcmV0cnkgPSBUUlVFOwogCQkJCS8qCiAJCQkJICogQXR0ZW1wdCB0byBtYXAgcnVubGlzdCwgZHJvcHBpbmcgbG9jayBmb3IKQEAgLTI2MywyMCArMjcwLDMwIEBACiAJCQkJaWYgKGxpa2VseSghZXJyKSkKIAkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOwogCQkJCXJsID0gTlVMTDsKLQkJCQlsY24gPSBlcnI7CiAJCQl9IGVsc2UgaWYgKCFybCkKIAkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCS8qCisJCQkgKiBJZiBidWZmZXIgaXMgb3V0c2lkZSB0aGUgcnVubGlzdCwgdHJlYXQgaXQgYXMgYQorCQkJICogaG9sZS4gIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29uY3VycmVudCB0cnVuY2F0ZQorCQkJICogZm9yIGV4YW1wbGUuCisJCQkgKi8KKwkJCWlmIChlcnIgPT0gLUVOT0VOVCB8fCBsY24gPT0gTENOX0VOT0VOVCkgeworCQkJCWVyciA9IDA7CisJCQkJZ290byBoYW5kbGVfaG9sZTsKKwkJCX0KIAkJCS8qIEhhcmQgZXJyb3IsIHplcm8gb3V0IHJlZ2lvbi4gKi8KKwkJCWlmICghZXJyKQorCQkJCWVyciA9IC1FSU87CiAJCQliaC0+Yl9ibG9ja25yID0gLTE7CiAJCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmcm9tIGlub2RlIDB4JWx4LCAiCiAJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCB2Y24gMHglbGx4LCAiCiAJCQkJCSJvZmZzZXQgMHgleCBiZWNhdXNlIGl0cyBsb2NhdGlvbiBvbiAiCiAJCQkJCSJkaXNrIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkJXMgIgotCQkJCQkiKGVycm9yIGNvZGUgJWxsaSkuIiwgbmktPm1mdF9ubywKKwkJCQkJIihlcnJvciBjb2RlICVpKS4iLCBuaS0+bWZ0X25vLAogCQkJCQluaS0+dHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCiAJCQkJCXZjbl9vZnMsIGlzX3JldHJ5ID8gIiBldmVuIGFmdGVyICIKLQkJCQkJInJldHJ5aW5nIiA6ICIiLCAobG9uZyBsb25nKWxjbik7CisJCQkJCSJyZXRyeWluZyIgOiAiIiwgZXJyKTsKIAkJfQogCQkvKgogCQkgKiBFaXRoZXIgaWJsb2NrIHdhcyBvdXRzaWRlIGxibG9jayBsaW1pdHMgb3IKQEAgLTI4OSw5ICszMDYsMTAgQEAKIGhhbmRsZV96YmxvY2s6CiAJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCQltZW1zZXQoa2FkZHIgKyBpICogYmxvY2tzaXplLCAwLCBibG9ja3NpemUpOwotCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWlmIChsaWtlbHkoIWVycikpCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAl9IHdoaWxlIChpKyssIGlibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwogCiAJLyogUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSB0b29rIGl0LiAqLwpAQCAtMzY3LDMxICszODUsMzggQEAKIAkJcmV0dXJuIDA7CiAJfQogCW5pID0gTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOwotCisJLyoKKwkgKiBPbmx5ICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGVuY3J5cHRlZCBhbmQgb25seSB1bm5hbWVkICREQVRBCisJICogYXR0cmlidXRlcyBjYW4gYmUgY29tcHJlc3NlZC4gIEluZGV4IHJvb3QgY2FuIGhhdmUgdGhlIGZsYWdzIHNldCBidXQKKwkgKiB0aGlzIG1lYW5zIHRvIGNyZWF0ZSBjb21wcmVzc2VkL2VuY3J5cHRlZCBmaWxlcywgbm90IHRoYXQgdGhlCisJICogYXR0cmlidXRlIGlzIGNvbXByZXNzZWQvZW5jcnlwdGVkLgorCSAqLworCWlmIChuaS0+dHlwZSAhPSBBVF9JTkRFWF9ST09UKSB7CisJCS8qIElmIGF0dHJpYnV0ZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKKwkJCUJVR19PTihuaS0+dHlwZSAhPSBBVF9EQVRBKTsKKwkJCWVyciA9IC1FQUNDRVM7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkgJiYgTklub0NvbXByZXNzZWQobmkpKSB7CisJCQlCVUdfT04obmktPnR5cGUgIT0gQVRfREFUQSk7CisJCQlCVUdfT04obmktPm5hbWVfbGVuKTsKKwkJCXJldHVybiBudGZzX3JlYWRfY29tcHJlc3NlZF9ibG9jayhwYWdlKTsKKwkJfQorCX0KIAkvKiBOSW5vTm9uUmVzaWRlbnQoKSA9PSBOSW5vSW5kZXhBbGxvY1ByZXNlbnQoKSAqLwogCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpKSB7Ci0JCS8qCi0JCSAqIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkIG9yCi0JCSAqIGVuY3J5cHRlZC4KLQkJICovCi0JCWlmIChuaS0+dHlwZSA9PSBBVF9EQVRBICYmICFuaS0+bmFtZV9sZW4pIHsKLQkJCS8qIElmIGZpbGUgaXMgZW5jcnlwdGVkLCBkZW55IGFjY2VzcywganVzdCBsaWtlIE5UNC4gKi8KLQkJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgewotCQkJCWVyciA9IC1FQUNDRVM7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KLQkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpCi0JCQkJcmV0dXJuIG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOwotCQl9Ci0JCS8qIE5vcm1hbCBkYXRhIHN0cmVhbS4gKi8KKwkJLyogTm9ybWFsLCBub24tcmVzaWRlbnQgZGF0YSBzdHJlYW0uICovCiAJCXJldHVybiBudGZzX3JlYWRfYmxvY2socGFnZSk7CiAJfQogCS8qCiAJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCBvciBlbmNyeXB0ZWQuCiAJICogVGhpcyBhbHNvIG1lYW5zIHRoZSBhdHRyaWJ1dGUgaXMgc21hbGxlciB0aGFuIGFuIG1mdCByZWNvcmQgYW5kCiAJICogaGVuY2Ugc21hbGxlciB0aGFuIGEgcGFnZSwgc28gY2FuIHNpbXBseSB6ZXJvIG91dCBhbnkgcGFnZXMgd2l0aAotCSAqIGluZGV4IGFib3ZlIDAuCisJICogaW5kZXggYWJvdmUgMC4gIE5vdGUgdGhlIGF0dHJpYnV0ZSBjYW4gYWN0dWFsbHkgYmUgbWFya2VkIGNvbXByZXNzZWQKKwkgKiBidXQgaWYgaXQgaXMgcmVzaWRlbnQgdGhlIGFjdHVhbCBkYXRhIGlzIG5vdCBjb21wcmVzc2VkIHNvIHdlIGFyZQorCSAqIG9rIHRvIGlnbm9yZSB0aGUgY29tcHJlc3NlZCBmbGFnIGhlcmUuCiAJICovCiAJaWYgKHVubGlrZWx5KHBhZ2UtPmluZGV4ID4gMCkpIHsKIAkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CkBAIC01MTEsMTkgKzUzNiwyMSBAQAogCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIGJsb2Nrc2l6ZSwKIAkJCQkoMSA8PCBCSF9VcHRvZGF0ZSkgfCAoMSA8PCBCSF9EaXJ0eSkpOworCQlpZiAodW5saWtlbHkoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpKSB7CisJCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIkVycm9yIGFsbG9jYXRpbmcgcGFnZSAiCisJCQkJCSJidWZmZXJzLiAgUmVkaXJ0eWluZyBwYWdlIHNvIHdlIHRyeSAiCisJCQkJCSJhZ2FpbiBsYXRlci4iKTsKKwkJCS8qCisJCQkgKiBQdXQgdGhlIHBhZ2UgYmFjayBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0IGxlYXZlCisJCQkgKiBpdHMgYnVmZmVycycgZGlydHkgc3RhdGUgYXMtaXMuCisJCQkgKi8KKwkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKLQlpZiAodW5saWtlbHkoIWJoKSkgewotCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIkVycm9yIGFsbG9jYXRpbmcgcGFnZSBidWZmZXJzLiAiCi0JCQkJIlJlZGlydHlpbmcgcGFnZSBzbyB3ZSB0cnkgYWdhaW4gbGF0ZXIuIik7Ci0JCS8qCi0JCSAqIFB1dCB0aGUgcGFnZSBiYWNrIG9uIG1hcHBpbmctPmRpcnR5X3BhZ2VzLCBidXQgbGVhdmUgaXRzCi0JCSAqIGJ1ZmZlcidzIGRpcnR5IHN0YXRlIGFzLWlzLgotCQkgKi8KLQkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKLQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCXJldHVybiAwOwotCX0KKwlCVUdfT04oIWJoKTsKIAogCS8qIE5PVEU6IERpZmZlcmVudCBuYW1pbmcgc2NoZW1lIHRvIG50ZnNfcmVhZF9ibG9jaygpISAqLwogCkBAIC02NzAsNiArNjk3LDI3IEBACiAJCX0KIAkJLyogSXQgaXMgYSBob2xlLCBuZWVkIHRvIGluc3RhbnRpYXRlIGl0LiAqLwogCQlpZiAobGNuID09IExDTl9IT0xFKSB7CisJCQl1OCAqa2FkZHI7CisJCQl1bnNpZ25lZCBsb25nICpicG9zLCAqYmVuZDsKKworCQkJLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBpcyB6ZXJvLiAqLworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQlicG9zID0gKHVuc2lnbmVkIGxvbmcgKikoa2FkZHIgKyBiaF9vZmZzZXQoYmgpKTsKKwkJCWJlbmQgPSAodW5zaWduZWQgbG9uZyAqKSgodTgqKWJwb3MgKyBibG9ja3NpemUpOworCQkJZG8geworCQkJCWlmICh1bmxpa2VseSgqYnBvcykpCisJCQkJCWJyZWFrOworCQkJfSB3aGlsZSAobGlrZWx5KCsrYnBvcyA8IGJlbmQpKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWlmIChicG9zID09IGJlbmQpIHsKKwkJCQkvKgorCQkJCSAqIEJ1ZmZlciBpcyB6ZXJvIGFuZCBzcGFyc2UsIG5vIG5lZWQgdG8gd3JpdGUKKwkJCQkgKiBpdC4KKwkJCQkgKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCS8vIFRPRE86IEluc3RhbnRpYXRlIHRoZSBob2xlLgogCQkJLy8gY2xlYXJfYnVmZmVyX25ldyhiaCk7CiAJCQkvLyB1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsIGJoLT5iX2Jsb2NrbnIpOwpAQCAtNjkwLDIwICs3MzgsMzcgQEAKIAkJCWlmIChsaWtlbHkoIWVycikpCiAJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOwogCQkJcmwgPSBOVUxMOwotCQkJbGNuID0gZXJyOwogCQl9IGVsc2UgaWYgKCFybCkKIAkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkvKgorCQkgKiBJZiBidWZmZXIgaXMgb3V0c2lkZSB0aGUgcnVubGlzdCwgdHJ1bmNhdGUgaGFzIGN1dCBpdCBvdXQKKwkJICogb2YgdGhlIHJ1bmxpc3QuICBKdXN0IGNsZWFuIGFuZCBjbGVhciB0aGUgYnVmZmVyIGFuZCBzZXQgaXQKKwkJICogdXB0b2RhdGUgc28gaXQgY2FuIGdldCBkaXNjYXJkZWQgYnkgdGhlIFZNLgorCQkgKi8KKwkJaWYgKGVyciA9PSAtRU5PRU5UIHx8IGxjbiA9PSBMQ05fRU5PRU5UKSB7CisJCQl1OCAqa2FkZHI7CisKKwkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciArIGJoX29mZnNldChiaCksIDAsIGJsb2Nrc2l6ZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJZXJyID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CiAJCS8qIEZhaWxlZCB0byBtYXAgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlciByZXRyeWluZy4gKi8KKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUlPOwogCQliaC0+Yl9ibG9ja25yID0gLTE7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSB0byBpbm9kZSAweCVseCwgIgogCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCB2Y24gMHglbGx4LCBvZmZzZXQgMHgleCAiCiAJCQkJImJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uIGRpc2sgY291bGQgbm90IGJlICIKLQkJCQkiZGV0ZXJtaW5lZCVzIChlcnJvciBjb2RlICVsbGkpLiIsIG5pLT5tZnRfbm8sCisJCQkJImRldGVybWluZWQlcyAoZXJyb3IgY29kZSAlaSkuIiwgbmktPm1mdF9ubywKIAkJCQluaS0+dHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCiAJCQkJdmNuX29mcywgaXNfcmV0cnkgPyAiIGV2ZW4gYWZ0ZXIgIgotCQkJCSJyZXRyeWluZyIgOiAiIiwgKGxvbmcgbG9uZylsY24pOwotCQlpZiAoIWVycikKLQkJCWVyciA9IC1FSU87CisJCQkJInJldHJ5aW5nIiA6ICIiLCBlcnIpOwogCQlicmVhazsKIAl9IHdoaWxlIChibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwogCkBAIC03MTQsNyArNzc5LDcgQEAKIAkvKiBGb3IgdGhlIGVycm9yIGNhc2UsIG5lZWQgdG8gcmVzZXQgYmggdG8gdGhlIGJlZ2lubmluZy4gKi8KIAliaCA9IGhlYWQ7CiAKLQkvKiBKdXN0IGFuIG9wdGltaXphdGlvbiwgc28gLT5yZWFkcGFnZSgpIGlzbid0IGNhbGxlZCBsYXRlci4gKi8KKwkvKiBKdXN0IGFuIG9wdGltaXphdGlvbiwgc28gLT5yZWFkcGFnZSgpIGlzIG5vdCBjYWxsZWQgbGF0ZXIuICovCiAJaWYgKHVubGlrZWx5KCFQYWdlVXB0b2RhdGUocGFnZSkpKSB7CiAJCWludCB1cHRvZGF0ZSA9IDE7CiAJCWRvIHsKQEAgLTczMCw3ICs3OTUsNiBAQAogCiAJLyogU2V0dXAgYWxsIG1hcHBlZCwgZGlydHkgYnVmZmVycyBmb3IgYXN5bmMgd3JpdGUgaS9vLiAqLwogCWRvIHsKLQkJZ2V0X2JoKGJoKTsKIAkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJ1ZmZlcl9kaXJ0eShiaCkpIHsKIAkJCWxvY2tfYnVmZmVyKGJoKTsKIAkJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKQEAgLTc2OCwxNCArODMyLDggQEAKIAogCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKIAlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CS8qIEtlZXBzIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBhd2F5LiAqLwotCXVubG9ja19wYWdlKHBhZ2UpOwogCi0JLyoKLQkgKiBTdWJtaXQgdGhlIHByZXBhcmVkIGJ1ZmZlcnMgZm9yIGkvby4gTm90ZSB0aGUgcGFnZSBpcyB1bmxvY2tlZCwKLQkgKiBhbmQgdGhlIGFzeW5jIHdyaXRlIGkvbyBjb21wbGV0aW9uIGhhbmRsZXIgY2FuIGVuZF9wYWdlX3dyaXRlYmFjaygpCi0JICogYXQgYW55IHRpbWUgYWZ0ZXIgdGhlICpmaXJzdCogc3VibWl0X2JoKCkuIFNvIHRoZSBidWZmZXJzIGNhbiB0aGVuCi0JICogZGlzYXBwZWFyLi4uCi0JICovCisJLyogU3VibWl0IHRoZSBwcmVwYXJlZCBidWZmZXJzIGZvciBpL28uICovCiAJbmVlZF9lbmRfd3JpdGViYWNrID0gVFJVRTsKIAlkbyB7CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKQEAgLTc4Myw5ICs4NDEsOSBAQAogCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CiAJCQluZWVkX2VuZF93cml0ZWJhY2sgPSBGQUxTRTsKIAkJfQotCQlwdXRfYmgoYmgpOwogCQliaCA9IG5leHQ7CiAJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CiAKIAkvKiBJZiBubyBpL28gd2FzIHN0YXJ0ZWQsIG5lZWQgdG8gZW5kX3BhZ2Vfd3JpdGViYWNrKCkuICovCiAJaWYgKHVubGlrZWx5KG5lZWRfZW5kX3dyaXRlYmFjaykpCkBAIC04NjAsNyArOTE4LDYgQEAKIAlzeW5jID0gKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIG1hcHBlZCBidWZmZXJzLiAqLwotCUJVR19PTighcGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCUJVR19PTighYmgpOwogCkBAIC0xMjgwLDM4ICsxMzM3LDQyIEBACiAJCW50ZnNfZGVidWcoIldyaXRlIG91dHNpZGUgaV9zaXplIC0gdHJ1bmNhdGVkPyIpOwogCQlyZXR1cm4gMDsKIAl9CisJLyoKKwkgKiBPbmx5ICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGVuY3J5cHRlZCBhbmQgb25seSB1bm5hbWVkICREQVRBCisJICogYXR0cmlidXRlcyBjYW4gYmUgY29tcHJlc3NlZC4gIEluZGV4IHJvb3QgY2FuIGhhdmUgdGhlIGZsYWdzIHNldCBidXQKKwkgKiB0aGlzIG1lYW5zIHRvIGNyZWF0ZSBjb21wcmVzc2VkL2VuY3J5cHRlZCBmaWxlcywgbm90IHRoYXQgdGhlCisJICogYXR0cmlidXRlIGlzIGNvbXByZXNzZWQvZW5jcnlwdGVkLgorCSAqLworCWlmIChuaS0+dHlwZSAhPSBBVF9JTkRFWF9ST09UKSB7CisJCS8qIElmIGZpbGUgaXMgZW5jcnlwdGVkLCBkZW55IGFjY2VzcywganVzdCBsaWtlIE5UNC4gKi8KKwkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCUJVR19PTihuaS0+dHlwZSAhPSBBVF9EQVRBKTsKKwkJCW50ZnNfZGVidWcoIkRlbnlpbmcgd3JpdGUgYWNjZXNzIHRvIGVuY3J5cHRlZCAiCisJCQkJCSJmaWxlLiIpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkgJiYgTklub0NvbXByZXNzZWQobmkpKSB7CisJCQlCVUdfT04obmktPnR5cGUgIT0gQVRfREFUQSk7CisJCQlCVUdfT04obmktPm5hbWVfbGVuKTsKKwkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVwbGFjZSB0aGlzIHdpdGgKKwkJCS8vIHJldHVybiBudGZzX3dyaXRlX2NvbXByZXNzZWRfYmxvY2socGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIGNvbXByZXNzZWQgZmlsZXMgaXMgIgorCQkJCQkibm90IHN1cHBvcnRlZCB5ZXQuICBTb3JyeS4iKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQkvLyBUT0RPOiBJbXBsZW1lbnQgYW5kIHJlbW92ZSB0aGlzIGNoZWNrLgorCQlpZiAoTklub05vblJlc2lkZW50KG5pKSAmJiBOSW5vU3BhcnNlKG5pKSkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBzcGFyc2UgZmlsZXMgaXMgbm90ICIKKwkJCQkJInN1cHBvcnRlZCB5ZXQuICBTb3JyeS4iKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0KIAkvKiBOSW5vTm9uUmVzaWRlbnQoKSA9PSBOSW5vSW5kZXhBbGxvY1ByZXNlbnQoKSAqLwogCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpKSB7Ci0JCS8qCi0JCSAqIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkLCBlbmNyeXB0ZWQsCi0JCSAqIGFuZC9vciBzcGFyc2UuCi0JCSAqLwotCQlpZiAobmktPnR5cGUgPT0gQVRfREFUQSAmJiAhbmktPm5hbWVfbGVuKSB7Ci0JCQkvKiBJZiBmaWxlIGlzIGVuY3J5cHRlZCwgZGVueSBhY2Nlc3MsIGp1c3QgbGlrZSBOVDQuICovCi0JCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQludGZzX2RlYnVnKCJEZW55aW5nIHdyaXRlIGFjY2VzcyB0byBlbmNyeXB0ZWQgIgotCQkJCQkJImZpbGUuIik7Ci0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQl9Ci0JCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLwotCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgewotCQkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVwbGFjZSB0aGlzIGNoZWNrIHdpdGgKLQkJCQkvLyByZXR1cm4gbnRmc193cml0ZV9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOwotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIGNvbXByZXNzZWQgIgotCQkJCQkJImZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAiCi0JCQkJCQkiU29ycnkuIik7Ci0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJfQotCQkJLy8gVE9ETzogSW1wbGVtZW50IGFuZCByZW1vdmUgdGhpcyBjaGVjay4KLQkJCWlmIChOSW5vU3BhcnNlKG5pKSkgewotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIHNwYXJzZSBmaWxlcyAiCi0JCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOwotCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJCX0KLQkJfQogCQkvKiBXZSBoYXZlIHRvIHplcm8gZXZlcnkgdGltZSBkdWUgdG8gbW1hcC1hdC1lbmQtb2YtZmlsZS4gKi8KIAkJaWYgKHBhZ2UtPmluZGV4ID49IChpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkpIHsKIAkJCS8qIFRoZSBwYWdlIHN0cmFkZGxlcyBpX3NpemUuICovCkBAIC0xMzI0LDE0ICsxMzg1LDE2IEBACiAJCS8qIEhhbmRsZSBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZXMuICovCiAJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkKIAkJCXJldHVybiBudGZzX3dyaXRlX21zdF9ibG9jayhwYWdlLCB3YmMpOwotCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCS8qIE5vcm1hbCwgbm9uLXJlc2lkZW50IGRhdGEgc3RyZWFtLiAqLwogCQlyZXR1cm4gbnRmc193cml0ZV9ibG9jayhwYWdlLCB3YmMpOwogCX0KIAkvKgotCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQsIGVuY3J5cHRlZCwKLQkgKiBzcGFyc2UsIG9yIG1zdCBwcm90ZWN0ZWQuICBUaGlzIGFsc28gbWVhbnMgdGhlIGF0dHJpYnV0ZSBpcyBzbWFsbGVyCi0JICogdGhhbiBhbiBtZnQgcmVjb3JkIGFuZCBoZW5jZSBzbWFsbGVyIHRoYW4gYSBwYWdlLCBzbyBjYW4gc2ltcGx5Ci0JICogcmV0dXJuIGVycm9yIG9uIGFueSBwYWdlcyB3aXRoIGluZGV4IGFib3ZlIDAuCisJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCwgZW5jcnlwdGVkLCBvcgorCSAqIG1zdCBwcm90ZWN0ZWQuICBUaGlzIGFsc28gbWVhbnMgdGhlIGF0dHJpYnV0ZSBpcyBzbWFsbGVyIHRoYW4gYW4gbWZ0CisJICogcmVjb3JkIGFuZCBoZW5jZSBzbWFsbGVyIHRoYW4gYSBwYWdlLCBzbyBjYW4gc2ltcGx5IHJldHVybiBlcnJvciBvbgorCSAqIGFueSBwYWdlcyB3aXRoIGluZGV4IGFib3ZlIDAuICBOb3RlIHRoZSBhdHRyaWJ1dGUgY2FuIGFjdHVhbGx5IGJlCisJICogbWFya2VkIGNvbXByZXNzZWQgYnV0IGlmIGl0IGlzIHJlc2lkZW50IHRoZSBhY3R1YWwgZGF0YSBpcyBub3QKKwkgKiBjb21wcmVzc2VkIHNvIHdlIGFyZSBvayB0byBpZ25vcmUgdGhlIGNvbXByZXNzZWQgZmxhZyBoZXJlLgogCSAqLwogCUJVR19PTihwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKIAlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CkBAIC0xMzgwLDMwICsxNDQzLDE0IEBACiAJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwogCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKLQogCS8qCi0JICogSGVyZSwgd2UgZG9uJ3QgbmVlZCB0byB6ZXJvIHRoZSBvdXQgb2YgYm91bmRzIGFyZWEgZXZlcnl0aW1lIGJlY2F1c2UKLQkgKiB0aGUgYmVsb3cgbWVtY3B5KCkgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHRoZSBtbWFwLWF0LWVuZC1vZi1maWxlCi0JICogcmVxdWlyZW1lbnRzLiBJZiB0aGUgZmlsZSBpcyBjb252ZXJ0ZWQgdG8gYSBub24tcmVzaWRlbnQgb25lLCB0aGVuCi0JICogdGhlIGNvZGUgcGF0aCB1c2UgaXMgc3dpdGNoZWQgdG8gdGhlIG5vbi1yZXNpZGVudCBvbmUgd2hlcmUgdGhlCi0JICogemVyb2luZyBoYXBwZW5zIG9uIGVhY2ggbnRmc193cml0ZXBhZ2UoKSBpbnZvY2F0aW9uLgotCSAqCi0JICogVGhlIGFib3ZlIGFsc28gYXBwbGllcyBuaWNlbHkgd2hlbiBpX3NpemUgaXMgZGVjcmVhc2VkLgotCSAqCi0JICogV2hlbiBpX3NpemUgaXMgaW5jcmVhc2VkLCB0aGUgbWVtb3J5IGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGlfc2l6ZQotCSAqIF9tdXN0XyBiZSB6ZXJvZWQgKG9yIG92ZXJ3cml0dGVuIHdpdGggbmV3IGRhdGEpLiBPdGhlcndpc2Ugd2Ugd2lsbAotCSAqIGV4cG9zZSBkYXRhIHRvIHVzZXJzcGFjZS9kaXNrIHdoaWNoIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZXhwb3NlZC4KLQkgKgotCSAqIEZJWE1FOiBFbnN1cmUgdGhhdCBpX3NpemUgaW5jcmVhc2VzIGRvIHRoZSB6ZXJvaW5nL292ZXJ3cml0aW5nIGFuZAotCSAqIGlmIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCwgdGhlbiBlbmFibGUgdGhlIHplcm9pbmcgYmVsb3cuICBJZiB0aGUKLQkgKiB6ZXJvaW5nIGJlbG93IGlzIGVuYWJsZWQsIHdlIE1VU1QgbW92ZSB0aGUgdW5sb2NrX3BhZ2UoKSBmcm9tIGFib3ZlCi0JICogdG8gYWZ0ZXIgdGhlIGt1bm1hcF9hdG9taWMoKSwgaS5lLiBqdXN0IGJlZm9yZSB0aGUKLQkgKiBlbmRfcGFnZV93cml0ZWJhY2soKS4KLQkgKiBVUERBVEU6IG50ZnNfcHJlcGFyZS9jb21taXRfd3JpdGUoKSBkbyB0aGUgemVyb2luZyBvbiBpX3NpemUKLQkgKiBpbmNyZWFzZXMgZm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMgc28gdGhvc2UgYXJlIG9rLgotCSAqIFRPRE86IG50ZnNfdHJ1bmNhdGUoKSwgb3RoZXJzPworCSAqIEhlcmUsIHdlIGRvIG5vdCBuZWVkIHRvIHplcm8gdGhlIG91dCBvZiBib3VuZHMgYXJlYSBldmVyeXRpbWUKKwkgKiBiZWNhdXNlIHRoZSBiZWxvdyBtZW1jcHkoKSBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdGhlCisJICogbW1hcC1hdC1lbmQtb2YtZmlsZSByZXF1aXJlbWVudHMuICBJZiB0aGUgZmlsZSBpcyBjb252ZXJ0ZWQgdG8gYQorCSAqIG5vbi1yZXNpZGVudCBvbmUsIHRoZW4gdGhlIGNvZGUgcGF0aCB1c2UgaXMgc3dpdGNoZWQgdG8gdGhlCisJICogbm9uLXJlc2lkZW50IG9uZSB3aGVyZSB0aGUgemVyb2luZyBoYXBwZW5zIG9uIGVhY2ggbnRmc193cml0ZXBhZ2UoKQorCSAqIGludm9jYXRpb24uCiAJICovCi0KIAlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOwogCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKHZpKTsKIAlpZiAodW5saWtlbHkoYXR0cl9sZW4gPiBpX3NpemUpKSB7CkBAIC0xNjgxLDI3ICsxNzI4LDI1IEBACiAJCQkJCWlmIChsaWtlbHkoIWVycikpCiAJCQkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CiAJCQkJCXJsID0gTlVMTDsKLQkJCQkJbGNuID0gZXJyOwogCQkJCX0gZWxzZSBpZiAoIXJsKQogCQkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIAkJCQkvKgogCQkJCSAqIEZhaWxlZCB0byBtYXAgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlcgogCQkJCSAqIHJldHJ5aW5nLgogCQkJCSAqLworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSAtRUlPOwogCQkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKIAkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gd3JpdGUgdG8gaW5vZGUgIgogCQkJCQkJIjB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCAiCiAJCQkJCQkidmNuIDB4JWxseCwgb2Zmc2V0IDB4JXggIgogCQkJCQkJImJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uIGRpc2sgIgogCQkJCQkJImNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkJXMgIgotCQkJCQkJIihlcnJvciBjb2RlICVsbGkpLiIsCisJCQkJCQkiKGVycm9yIGNvZGUgJWkpLiIsCiAJCQkJCQluaS0+bWZ0X25vLCBuaS0+dHlwZSwKIAkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAogCQkJCQkJdmNuX29mcywgaXNfcmV0cnkgPyAiIGV2ZW4gIgotCQkJCQkJImFmdGVyIHJldHJ5aW5nIiA6ICIiLAotCQkJCQkJKGxvbmcgbG9uZylsY24pOwotCQkJCWlmICghZXJyKQotCQkJCQllcnIgPSAtRUlPOworCQkJCQkJImFmdGVyIHJldHJ5aW5nIiA6ICIiLCBlcnIpOwogCQkJCWdvdG8gZXJyX291dDsKIAkJCX0KIAkJCS8qIFdlIG5vdyBoYXZlIGEgc3VjY2Vzc2Z1bCByZW1hcCwgaS5lLiBsY24gPj0gMC4gKi8KQEAgLTIzNTcsNiArMjQwMiw3IEBACiAJCQlidWZmZXJzX3RvX2ZyZWUgPSBiaDsKIAl9CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCUJVR19PTighYmgpOwogCWRvIHsKIAkJYmhfb2ZzID0gYmhfb2Zmc2V0KGJoKTsKIAkJaWYgKGJoX29mcyArIGJoX3NpemUgPD0gb2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hdHRyaWIuYyBiL2ZzL250ZnMvYXR0cmliLmMKaW5kZXggY2QwZjllNy4uM2Y5YTRmZiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hdHRyaWIuYworKysgYi9mcy9udGZzL2F0dHJpYi5jCkBAIC00Myw2ICs0Myw5IEBACiAgKiB3aGljaCBpcyBub3QgYW4gZXJyb3IgYXMgc3VjaC4gIFRoaXMgaXMgLUVOT0VOVC4gIEl0IG1lYW5zIHRoYXQgQHZjbiBpcyBvdXQKICAqIG9mIGJvdW5kcyBvZiB0aGUgcnVubGlzdC4KICAqCisgKiBOb3RlIHRoZSBydW5saXN0IGNhbiBiZSBOVUxMIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBpZiBAdmNuIGlzIHplcm8gYW5kCisgKiB0aGUgYXR0cmlidXRlIGhhcyB6ZXJvIGFsbG9jYXRlZCBzaXplLCBpLmUuIHRoZXJlIHNpbXBseSBpcyBubyBydW5saXN0LgorICoKICAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSBsb2NrZWQgZm9yIHdyaXRpbmcuCiAgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBydW5saXN0LgogICovCkBAIC01NCw2ICs1Nyw3IEBACiAJQVRUUl9SRUNPUkQgKmE7CiAJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKIAlydW5saXN0X2VsZW1lbnQgKnJsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IDA7CiAKIAludGZzX2RlYnVnKCJNYXBwaW5nIHJ1bmxpc3QgcGFydCBjb250YWluaW5nIHZjbiAweCVsbHguIiwKQEAgLTg1LDggKzg5LDExIEBACiAJICogbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSBmYWlscy4KIAkgKi8KIAllbmRfdmNuID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKSArIDE7Ci0JaWYgKHVubGlrZWx5KCFhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuICYmIGVuZF92Y24gPD0gMSkpCisJaWYgKHVubGlrZWx5KCFhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuICYmIGVuZF92Y24gPD0gMSkpIHsKKwkJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJZW5kX3ZjbiA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiBuaS0+dm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCX0KIAlpZiAodW5saWtlbHkodmNuID49IGVuZF92Y24pKSB7CiAJCWVyciA9IC1FTk9FTlQ7CiAJCWdvdG8gZXJyX291dDsKQEAgLTE2NSw2ICsxNzIsNyBAQAogCQljb25zdCBCT09MIHdyaXRlX2xvY2tlZCkKIHsKIAlMQ04gbGNuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJQk9PTCBpc19yZXRyeSA9IEZBTFNFOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCB2Y24gMHglbGx4LCAlc19sb2NrZWQuIiwKQEAgLTE3Myw2ICsxODEsMTQgQEAKIAlCVUdfT04oIW5pKTsKIAlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOwogCUJVR19PTih2Y24gPCAwKTsKKwlpZiAoIW5pLT5ydW5saXN0LnJsKSB7CisJCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJCWlmICghbmktPmFsbG9jYXRlZF9zaXplKSB7CisJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gTENOX0VOT0VOVDsKKwkJfQorCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJfQogcmV0cnlfcmVtYXA6CiAJLyogQ29udmVydCB2Y24gdG8gbGNuLiAgSWYgdGhhdCBmYWlscyBtYXAgdGhlIHJ1bmxpc3QgYW5kIHJldHJ5IG9uY2UuICovCiAJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKG5pLT5ydW5saXN0LnJsLCB2Y24pOwpAQCAtMjU1LDYgKzI3MSw3IEBACiBydW5saXN0X2VsZW1lbnQgKm50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobnRmc19pbm9kZSAqbmksIGNvbnN0IFZDTiB2Y24sCiAJCWNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJcnVubGlzdF9lbGVtZW50ICpybDsKIAlpbnQgZXJyID0gMDsKIAlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CkBAIC0yNjUsNiArMjgyLDE0IEBACiAJQlVHX09OKCFuaSk7CiAJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKIAlCVUdfT04odmNuIDwgMCk7CisJaWYgKCFuaS0+cnVubGlzdC5ybCkgeworCQlyZWFkX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCQlpZiAoIW5pLT5hbGxvY2F0ZWRfc2l6ZSkgeworCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCX0KIHJldHJ5X3JlbWFwOgogCXJsID0gbmktPnJ1bmxpc3Qucmw7CiAJaWYgKGxpa2VseShybCAmJiB2Y24gPj0gcmxbMF0udmNuKSkgewpAQCAtNTI4LDYgKzU1MywxMSBAQAogCWJsb2NrX3NpemVfYml0cyA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCWRvd25fcmVhZCgmcnVubGlzdC0+bG9jayk7CiAJcmwgPSBydW5saXN0LT5ybDsKKwlpZiAoIXJsKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJDYW5ub3QgcmVhZCBhdHRyaWJ1dGUgbGlzdCBzaW5jZSBydW5saXN0IGlzICIKKwkJCQkibWlzc2luZy4iKTsKKwkJZ290byBlcnJfb3V0OwkKKwl9CiAJLyogUmVhZCBhbGwgY2x1c3RlcnMgc3BlY2lmaWVkIGJ5IHRoZSBydW5saXN0IG9uZSBydW4gYXQgYSB0aW1lLiAqLwogCXdoaWxlIChybC0+bGVuZ3RoKSB7CiAJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgcmwtPnZjbik7CkBAIC0xMjQ3LDYgKzEyNzcsNDYgQEAKIH0KIAogLyoqCisgKiBudGZzX3Jlc2lkZW50X2F0dHJfdmFsdWVfcmVzaXplIC0gcmVzaXplIHRoZSB2YWx1ZSBvZiBhIHJlc2lkZW50IGF0dHJpYnV0ZQorICogQG06CQltZnQgcmVjb3JkIGNvbnRhaW5pbmcgYXR0cmlidXRlIHJlY29yZAorICogQGE6CQlhdHRyaWJ1dGUgcmVjb3JkIHdob3NlIHZhbHVlIHRvIHJlc2l6ZQorICogQG5ld19zaXplOgluZXcgc2l6ZSBpbiBieXRlcyB0byB3aGljaCB0byByZXNpemUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBAYQorICoKKyAqIFJlc2l6ZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBAYSBpbiB0aGUgbWZ0IHJlY29yZCBAbSB0byBAbmV3X3NpemUgYnl0ZXMuCisgKiBJZiB0aGUgdmFsdWUgaXMgbWFkZSBiaWdnZXIsIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3BhY2UgaXMgY2xlYXJlZC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZQorICogZGVmaW5lZDoKKyAqCS1FTk9TUEMJLSBOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkIEBtIHRvIHBlcmZvcm0gdGhlIHJlc2l6ZS4KKyAqCisgKiBOb3RlOiBPbiBlcnJvciwgbm8gbW9kaWZpY2F0aW9ucyBoYXZlIGJlZW4gcGVyZm9ybWVkIHdoYXRzb2V2ZXIuCisgKgorICogV2FybmluZzogSWYgeW91IG1ha2UgYSByZWNvcmQgc21hbGxlciB3aXRob3V0IGhhdmluZyBjb3BpZWQgYWxsIHRoZSBkYXRhIHlvdQorICoJICAgIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkYXRhIG1heSBiZSBvdmVyd3JpdHRlbi4KKyAqLworaW50IG50ZnNfcmVzaWRlbnRfYXR0cl92YWx1ZV9yZXNpemUoTUZUX1JFQ09SRCAqbSwgQVRUUl9SRUNPUkQgKmEsCisJCWNvbnN0IHUzMiBuZXdfc2l6ZSkKK3sKKwl1MzIgb2xkX3NpemU7CisKKwkvKiBSZXNpemUgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJaWYgKG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKG0sIGEsCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKyBuZXdfc2l6ZSkpCisJCXJldHVybiAtRU5PU1BDOworCS8qCisJICogVGhlIHJlc2l6ZSBzdWNjZWVkZWQhICBJZiB3ZSBtYWRlIHRoZSBhdHRyaWJ1dGUgdmFsdWUgYmlnZ2VyLCBjbGVhcgorCSAqIHRoZSBhcmVhIGJldHdlZW4gdGhlIG9sZCBzaXplIGFuZCBAbmV3X3NpemUuCisJICovCisJb2xkX3NpemUgPSBsZTMyX3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJaWYgKG5ld19zaXplID4gb2xkX3NpemUpCisJCW1lbXNldCgodTgqKWEgKyBsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJCW9sZF9zaXplLCAwLCBuZXdfc2l6ZSAtIG9sZF9zaXplKTsKKwkvKiBGaW5hbGx5IHVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuICovCisJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGggPSBjcHVfdG9fbGUzMihuZXdfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogbnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50IC0gY29udmVydCBhIHJlc2lkZW50IHRvIGEgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZQogICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGUgdG8gY29udmVydAogICoKQEAgLTEzMDIsNiArMTM3MiwxMiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAkvKgorCSAqIEZJWE1FOiBDb21wcmVzc2VkIGFuZCBlbmNyeXB0ZWQgYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZCB3aGVuCisJICogd3JpdGluZyBhbmQgd2Ugc2hvdWxkIG5ldmVyIGhhdmUgZ290dGVuIGhlcmUgZm9yIHRoZW0uCisJICovCisJQlVHX09OKE5Jbm9Db21wcmVzc2VkKG5pKSk7CisJQlVHX09OKE5Jbm9FbmNyeXB0ZWQobmkpKTsKKwkvKgogCSAqIFRoZSBzaXplIG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gYSBjbHVzdGVyIGJvdW5kYXJ5IGZvciBhbGxvY2F0aW9uCiAJICogcHVycG9zZXMuCiAJICovCkBAIC0xMzc3LDEwICsxNDUzLDE1IEBACiAJQlVHX09OKGEtPm5vbl9yZXNpZGVudCk7CiAJLyoKIAkgKiBDYWxjdWxhdGUgbmV3IG9mZnNldHMgZm9yIHRoZSBuYW1lIGFuZCB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4KLQkgKiBXZSBhc3N1bWUgdGhlIGF0dHJpYnV0ZSBpcyBub3QgY29tcHJlc3NlZCBvciBzcGFyc2UuCiAJICovCi0JbmFtZV9vZnMgPSAob2Zmc2V0b2YoQVRUUl9SRUMsCi0JCQlkYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2VkX3NpemUpICsgNykgJiB+NzsKKwlpZiAoTklub1NwYXJzZShuaSkgfHwgTklub0NvbXByZXNzZWQobmkpKQorCQluYW1lX29mcyA9IChvZmZzZXRvZihBVFRSX1JFQywKKwkJCQlkYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2VkX3NpemUpICsKKwkJCQlzaXplb2YoYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3NlZF9zaXplKSArCisJCQkJNykgJiB+NzsKKwllbHNlCisJCW5hbWVfb2ZzID0gKG9mZnNldG9mKEFUVFJfUkVDLAorCQkJCWRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzZWRfc2l6ZSkgKyA3KSAmIH43OwogCW1wX29mcyA9IChuYW1lX29mcyArIGEtPm5hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSArIDcpICYgfjc7CiAJLyoKIAkgKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlIG5vdyBub24tcmVzaWRlbnQKQEAgLTE0MTksMjQgKzE1MDAsMjMgQEAKIAkJbWVtbW92ZSgodTgqKWEgKyBuYW1lX29mcywgKHU4KilhICsgbGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpLAogCQkJCWEtPm5hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSk7CiAJYS0+bmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihuYW1lX29mcyk7Ci0JLyoKLQkgKiBGSVhNRTogRm9yIG5vdyBqdXN0IGNsZWFyIGFsbCBvZiB0aGVzZSBhcyB3ZSBkbyBub3Qgc3VwcG9ydCB0aGVtCi0JICogd2hlbiB3cml0aW5nLgotCSAqLwotCWEtPmZsYWdzICY9IGNwdV90b19sZTE2KDB4ZmZmZiAmIH5sZTE2X3RvX2NwdShBVFRSX0lTX1NQQVJTRSB8Ci0JCQlBVFRSX0lTX0VOQ1JZUFRFRCB8IEFUVFJfQ09NUFJFU1NJT05fTUFTSykpOwogCS8qIFNldHVwIHRoZSBmaWVsZHMgc3BlY2lmaWMgdG8gbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMuICovCiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbiA9IDA7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24gPSBjcHVfdG9fc2xlNjQoKG5ld19zaXplIC0gMSkgPj4KIAkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpOwogCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0ID0gY3B1X3RvX2xlMTYobXBfb2ZzKTsKLQlhLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ID0gMDsKIAltZW1zZXQoJmEtPmRhdGEubm9uX3Jlc2lkZW50LnJlc2VydmVkLCAwLAogCQkJc2l6ZW9mKGEtPmRhdGEubm9uX3Jlc2lkZW50LnJlc2VydmVkKSk7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUgPSBjcHVfdG9fc2xlNjQobmV3X3NpemUpOwogCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSA9CiAJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplID0KIAkJCWNwdV90b19zbGU2NChhdHRyX3NpemUpOworCWlmIChOSW5vU3BhcnNlKG5pKSB8fCBOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCA9IDQ7CisJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzZWRfc2l6ZSA9CisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemU7CisJfSBlbHNlCisJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgPSAwOwogCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGludG8gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCiAJZXJyID0gbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKHZvbCwgKHU4KilhICsgbXBfb2ZzLAogCQkJYXJlY19zaXplIC0gbXBfb2ZzLCBybCwgMCwgLTEsIE5VTEwpOwpAQCAtMTQ0NiwxNiArMTUyNiwxOSBAQAogCQlnb3RvIHVuZG9fZXJyX291dDsKIAl9CiAJLyogU2V0dXAgdGhlIGluLW1lbW9yeSBhdHRyaWJ1dGUgc3RydWN0dXJlIHRvIGJlIG5vbi1yZXNpZGVudC4gKi8KLQkvKgotCSAqIEZJWE1FOiBGb3Igbm93IGp1c3QgY2xlYXIgYWxsIG9mIHRoZXNlIGFzIHdlIGRvIG5vdCBzdXBwb3J0IHRoZW0KLQkgKiB3aGVuIHdyaXRpbmcuCi0JICovCi0JTklub0NsZWFyU3BhcnNlKG5pKTsKLQlOSW5vQ2xlYXJFbmNyeXB0ZWQobmkpOwotCU5Jbm9DbGVhckNvbXByZXNzZWQobmkpOwogCW5pLT5ydW5saXN0LnJsID0gcmw7CiAJd3JpdGVfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbmktPmFsbG9jYXRlZF9zaXplID0gbmV3X3NpemU7CisJaWYgKE5Jbm9TcGFyc2UobmkpIHx8IE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQluaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID0gbmktPmFsbG9jYXRlZF9zaXplOworCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplID0gMVUgPDwKKwkJCQkoYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCArCisJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CisJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemVfYml0cyA9CisJCQkJZmZzKG5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUpIC0gMTsKKwkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfY2x1c3RlcnMgPSAxVSA8PAorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQ7CisJfQogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJLyoKIAkgKiBUaGlzIG5lZWRzIHRvIGJlIGxhc3Qgc2luY2UgdGhlIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyAtPnJlYWRwYWdlCkBAIC0xNjAzLDYgKzE2ODYsMTIgQEAKIAlCVUdfT04oY250IDwgMCk7CiAJaWYgKCFjbnQpCiAJCWdvdG8gZG9uZTsKKwkvKgorCSAqIEZJWE1FOiBDb21wcmVzc2VkIGFuZCBlbmNyeXB0ZWQgYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZCB3aGVuCisJICogd3JpdGluZyBhbmQgd2Ugc2hvdWxkIG5ldmVyIGhhdmUgZ290dGVuIGhlcmUgZm9yIHRoZW0uCisJICovCisJQlVHX09OKE5Jbm9Db21wcmVzc2VkKG5pKSk7CisJQlVHX09OKE5Jbm9FbmNyeXB0ZWQobmkpKTsKIAltYXBwaW5nID0gVkZTX0kobmkpLT5pX21hcHBpbmc7CiAJLyogV29yayBvdXQgdGhlIHN0YXJ0aW5nIGluZGV4IGFuZCBwYWdlIG9mZnNldC4gKi8KIAlpZHggPSBvZnMgPj4gUEFHRV9DQUNIRV9TSElGVDsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmggYi9mcy9udGZzL2F0dHJpYi5oCmluZGV4IDBlNGFjNmQuLjA2MThlZDYgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvYXR0cmliLmgKKysrIGIvZnMvbnRmcy9hdHRyaWIuaApAQCAtOTksNiArOTksOCBAQAogCQljb25zdCBBVFRSX1RZUEUgdHlwZSk7CiAKIGV4dGVybiBpbnQgbnRmc19hdHRyX3JlY29yZF9yZXNpemUoTUZUX1JFQ09SRCAqbSwgQVRUUl9SRUNPUkQgKmEsIHUzMiBuZXdfc2l6ZSk7CitleHRlcm4gaW50IG50ZnNfcmVzaWRlbnRfYXR0cl92YWx1ZV9yZXNpemUoTUZUX1JFQ09SRCAqbSwgQVRUUl9SRUNPUkQgKmEsCisJCWNvbnN0IHUzMiBuZXdfc2l6ZSk7CiAKIGV4dGVybiBpbnQgbnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50KG50ZnNfaW5vZGUgKm5pKTsKIApkaWZmIC0tZ2l0IGEvZnMvbnRmcy9jb21wcmVzcy5jIGIvZnMvbnRmcy9jb21wcmVzcy5jCmluZGV4IDZkMjY1Y2YuLjI1ZDI0MTAgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvY29tcHJlc3MuYworKysgYi9mcy9udGZzL2NvbXByZXNzLmMKQEAgLTUzOSw3ICs1MzksNiBAQAogCWlmICh1bmxpa2VseSghcGFnZXMgfHwgIWJocykpIHsKIAkJa2ZyZWUoYmhzKTsKIAkJa2ZyZWUocGFnZXMpOwotCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVycy4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC04NzEsOSArODcwLDYgQEAKIAkJCWZvciAoOyBwcmV2X2N1cl9wYWdlIDwgY3VyX3BhZ2U7IHByZXZfY3VyX3BhZ2UrKykgewogCQkJCXBhZ2UgPSBwYWdlc1twcmV2X2N1cl9wYWdlXTsKIAkJCQlpZiAocGFnZSkgewotCQkJCQlpZiAocHJldl9jdXJfcGFnZSA9PSB4cGFnZSAmJgotCQkJCQkJCSF4cGFnZV9kb25lKQotCQkJCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAkJCQkJa3VubWFwKHBhZ2UpOwogCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTkwNCw4ICs5MDAsNiBAQAogCQkJCQkiVGVybWluYXRpbmcgdGhlbSB3aXRoIGV4dHJlbWUgIgogCQkJCQkicHJlanVkaWNlLiAgSW5vZGUgMHglbHgsIHBhZ2UgaW5kZXggIgogCQkJCQkiMHglbHguIiwgbmktPm1mdF9ubywgcGFnZS0+aW5kZXgpOwotCQkJaWYgKGN1cl9wYWdlID09IHhwYWdlICYmICF4cGFnZV9kb25lKQotCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQkJa3VubWFwKHBhZ2UpOwogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CkBAIC05NTMsOCArOTQ3LDYgQEAKIAlmb3IgKGkgPSBjdXJfcGFnZTsgaSA8IG1heF9wYWdlOyBpKyspIHsKIAkJcGFnZSA9IHBhZ2VzW2ldOwogCQlpZiAocGFnZSkgewotCQkJaWYgKGkgPT0geHBhZ2UgJiYgIXhwYWdlX2RvbmUpCi0JCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCQlrdW5tYXAocGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGlyLmMgYi9mcy9udGZzL2Rpci5jCmluZGV4IDQ2Nzc5NDcuLjc5NWMzZDEgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZGlyLmMKKysrIGIvZnMvbnRmcy9kaXIuYwpAQCAtMTA1MSw3ICsxMDUxLDggQEAKIAkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsICZuYW1lLAogCQkJTlRGU19NQVhfTkFNRV9MRU4gKiBOTFNfTUFYX0NIQVJTRVRfU0laRSArIDEpOwogCWlmIChuYW1lX2xlbiA8PSAwKSB7Ci0JCW50ZnNfZGVidWcoIlNraXBwaW5nIHVucmVwcmVzZW50YWJsZSBmaWxlLiIpOworCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlNraXBwaW5nIHVucmVwcmVzZW50YWJsZSBpbm9kZSAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKU1SRUZfTEUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSkpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfYXR0cmlidXRlcyAmCmRpZmYgLS1naXQgYS9mcy9udGZzL2ZpbGUuYyBiL2ZzL250ZnMvZmlsZS5jCmluZGV4IGUwZjUzMGMuLmJlOWZkMWQgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZmlsZS5jCisrKyBiL2ZzL250ZnMvZmlsZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIGZpbGUuYyAtIE5URlMga2VybmVsIGZpbGUgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICogZmlsZS5jIC0gTlRGUyBrZXJuZWwgZmlsZSBvcGVyYXRpb25zLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtOTQsNiArOTQsMTEgQEAKIAlpZiAoIWRhdGFzeW5jIHx8ICFOSW5vTm9uUmVzaWRlbnQoTlRGU19JKHZpKSkpCiAJCXJldCA9IG50ZnNfd3JpdGVfaW5vZGUodmksIDEpOwogCXdyaXRlX2lub2RlX25vdyh2aSwgIWRhdGFzeW5jKTsKKwkvKgorCSAqIE5PVEU6IElmIHdlIHdlcmUgdG8gdXNlIG1hcHBpbmctPnByaXZhdGVfbGlzdCAoc2VlIGV4dDIgYW5kCisJICogZnMvYnVmZmVyLmMpIGZvciBkaXJ0eSBibG9ja3MgdGhlbiB3ZSBjb3VsZCBvcHRpbWl6ZSB0aGUgYmVsb3cgdG8gYmUKKwkgKiBzeW5jX21hcHBpbmdfYnVmZmVycyh2aS0+aV9tYXBwaW5nKS4KKwkgKi8KIAllcnIgPSBzeW5jX2Jsb2NrZGV2KHZpLT5pX3NiLT5zX2JkZXYpOwogCWlmICh1bmxpa2VseShlcnIgJiYgIXJldCkpCiAJCXJldCA9IGVycjsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5kZXguYyBiL2ZzL250ZnMvaW5kZXguYwppbmRleCAxMWZkNTMwLi44ZjJkNTcyIDEwMDY0NAotLS0gYS9mcy9udGZzL2luZGV4LmMKKysrIGIvZnMvbnRmcy9pbmRleC5jCkBAIC0yMDUsNiArMjA1LDcgQEAKIAkJCQkmaWUtPmtleSwga2V5X2xlbikpIHsKIGlyX2RvbmU6CiAJCQlpY3R4LT5pc19pbl9yb290ID0gVFJVRTsKKwkJCWljdHgtPmlyID0gaXI7CiAJCQlpY3R4LT5hY3R4ID0gYWN0eDsKIAkJCWljdHgtPmJhc2VfbmkgPSBiYXNlX25pOwogCQkJaWN0eC0+aWEgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5jIGIvZnMvbnRmcy9pbm9kZS5jCmluZGV4IDg4NjIxNGEuLmRjNGJiZTMgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5vZGUuYworKysgYi9mcy9udGZzL2lub2RlLmMKQEAgLTEwMTMsNDEgKzEwMTMsNTAgQEAKIAkJfQogCQlhID0gY3R4LT5hdHRyOwogCQkvKiBTZXR1cCB0aGUgc3RhdGUuICovCi0JCWlmIChhLT5ub25fcmVzaWRlbnQpIHsKLQkJCU5Jbm9TZXROb25SZXNpZGVudChuaSk7Ci0JCQlpZiAoYS0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwKLQkJCQkJQVRUUl9JU19TUEFSU0UpKSB7Ci0JCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7Ci0JCQkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKLQkJCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgewotCQkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKKwkJaWYgKGEtPmZsYWdzICYgKEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8IEFUVFJfSVNfU1BBUlNFKSkgeworCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQkJTklub1NldENvbXByZXNzZWQobmkpOworCQkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKIAkJCQkJCQkiY29tcHJlc3NlZCBkYXRhIGJ1dCAiCiAJCQkJCQkJImNvbXByZXNzaW9uIGlzICIKIAkJCQkJCQkiZGlzYWJsZWQgZHVlIHRvICIKIAkJCQkJCQkiY2x1c3RlciBzaXplICglaSkgPiAiCiAJCQkJCQkJIjRraUIuIiwKIAkJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSk7Ci0JCQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJCQl9Ci0JCQkJCWlmICgoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCi0JCQkJCQkJIT0gQVRUUl9JU19DT01QUkVTU0VEKSB7Ci0JCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgotCQkJCQkJCSJ1bmtub3duIGNvbXByZXNzaW9uICIKLQkJCQkJCQkibWV0aG9kIG9yIGNvcnJ1cHQgIgotCQkJCQkJCSJmaWxlLiIpOwotCQkJCQkJZ290byB1bm1fZXJyX291dDsKLQkJCQkJfQorCQkJCQlnb3RvIHVubV9lcnJfb3V0OwogCQkJCX0KLQkJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkKLQkJCQkJTklub1NldFNwYXJzZShuaSk7CisJCQkJaWYgKChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgdW5rbm93biAiCisJCQkJCQkJImNvbXByZXNzaW9uIG1ldGhvZCAiCisJCQkJCQkJIm9yIGNvcnJ1cHQgZmlsZS4iKTsKKwkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQl9CisJCQl9CisJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkKKwkJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJfQorCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgYW5kICIKKwkJCQkJCSJjb21wcmVzc2VkIGRhdGEuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQl9CisJCWlmIChhLT5ub25fcmVzaWRlbnQpIHsKKwkJCU5Jbm9TZXROb25SZXNpZGVudChuaSk7CisJCQlpZiAoTklub0NvbXByZXNzZWQobmkpIHx8IE5Jbm9TcGFyc2UobmkpKSB7CiAJCQkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgIT0KIAkJCQkJCTQpIHsKIAkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKLQkJCQkJCSJub25zdGFuZGFyZCBjb21wcmVzc2lvbiB1bml0ICIKLQkJCQkJCSIoJXUgaW5zdGVhZCBvZiA0KS4gIENhbm5vdCAiCi0JCQkJCQkiaGFuZGxlIHRoaXMuIiwKLQkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCQkJY29tcHJlc3Npb25fdW5pdCk7CisJCQkJCQkJIm5vbnN0YW5kYXJkICIKKwkJCQkJCQkiY29tcHJlc3Npb24gdW5pdCAoJXUgIgorCQkJCQkJCSJpbnN0ZWFkIG9mIDQpLiAgIgorCQkJCQkJCSJDYW5ub3QgaGFuZGxlIHRoaXMuIiwKKwkJCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCQljb21wcmVzc2lvbl91bml0KTsKIAkJCQkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQkJfQpAQCAtMTA2NSwxNCArMTA3NCw2IEBACiAJCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC4KIAkJCQkJCWNvbXByZXNzZWRfc2l6ZSk7CiAJCQl9Ci0JCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgewotCQkJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgewotCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkICIKLQkJCQkJCQkiYW5kIGNvbXByZXNzZWQgZGF0YS4iKTsKLQkJCQkJZ290byB1bm1fZXJyX291dDsKLQkJCQl9Ci0JCQkJTklub1NldEVuY3J5cHRlZChuaSk7Ci0JCQl9CiAJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgJERBVEEgIgogCQkJCQkJImF0dHJpYnV0ZSBoYXMgbm9uIHplcm8gIgpAQCAtMTIxMiw2ICsxMjEzLDc1IEBACiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJYSA9IGN0eC0+YXR0cjsKKwlpZiAoYS0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19TUEFSU0UpKSB7CisJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJTklub1NldENvbXByZXNzZWQobmkpOworCQkJaWYgKChuaS0+dHlwZSAhPSBBVF9EQVRBKSB8fCAobmktPnR5cGUgPT0gQVRfREFUQSAmJgorCQkJCQluaS0+bmFtZV9sZW4pKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQgIgorCQkJCQkJIm5vbi1kYXRhIG9yIG5hbWVkIGRhdGEgIgorCQkJCQkJImF0dHJpYnV0ZS4gIFBsZWFzZSByZXBvcnQgIgorCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkiYXR0cmlidXRlIGJ1dCBjb21wcmVzc2lvbiBpcyAiCisJCQkJCQkiZGlzYWJsZWQgZHVlIHRvIGNsdXN0ZXIgc2l6ZSAiCisJCQkJCQkiKCVpKSA+IDRraUIuIiwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJaWYgKChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgIT0KKwkJCQkJQVRUUl9JU19DT01QUkVTU0VEKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIHVua25vd24gIgorCQkJCQkJImNvbXByZXNzaW9uIG1ldGhvZC4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQl9CisJCS8qCisJCSAqIFRoZSBlbmNyeXB0aW9uIGZsYWcgc2V0IGluIGFuIGluZGV4IHJvb3QganVzdCBtZWFucyB0bworCQkgKiBjb21wcmVzcyBhbGwgZmlsZXMuCisJCSAqLworCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkgJiYgbmktPnR5cGUgIT0gQVRfSU5ERVhfUk9PVCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlICIKKwkJCQkJImJ1dCB0aGUgYXR0cmlidXRlIGlzICVzLiAgUGxlYXNlICIKKwkJCQkJInJlcG9ydCB5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiLAorCQkJCQlOSW5vQ29tcHJlc3NlZChuaSkgPyAiY29tcHJlc3NlZCIgOgorCQkJCQkic3BhcnNlIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQorCQkJTklub1NldFNwYXJzZShuaSk7CisJfQorCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgYW5kIGNvbXByZXNzZWQgIgorCQkJCQkiZGF0YS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogVGhlIGVuY3J5cHRpb24gZmxhZyBzZXQgaW4gYW4gaW5kZXggcm9vdCBqdXN0IG1lYW5zIHRvCisJCSAqIGVuY3J5cHQgYWxsIGZpbGVzLgorCQkgKi8KKwkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpICYmIG5pLT50eXBlICE9IEFUX0lOREVYX1JPT1QpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZSAiCisJCQkJCSJidXQgdGhlIGF0dHJpYnV0ZSBpcyBlbmNyeXB0ZWQuICAiCisJCQkJCSJQbGVhc2UgcmVwb3J0IHlvdSBzYXcgdGhpcyBtZXNzYWdlICIKKwkJCQkJInRvIGxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLiIKKwkJCQkJIm5ldCIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAobmktPnR5cGUgIT0gQVRfREFUQSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCBub24tZGF0YSAiCisJCQkJCSJhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCX0KIAlpZiAoIWEtPm5vbl9yZXNpZGVudCkgewogCQkvKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIHZhbHVlLiAqLwogCQlpZiAodW5saWtlbHkoYS0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSA+PQpAQCAtMTIyMCwxMSArMTI5MCwxMCBAQAogCQkJCQkidGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpIHx8IGEtPmZsYWdzKSB7CisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlICIKLQkJCQkJIm9yIGF0dHJpYnV0ZSB3aXRoIG5vbi16ZXJvIGZsYWdzIGJ1dCAiCi0JCQkJCSJ0aGUgYXR0cmlidXRlIGlzIHJlc2lkZW50LiAgUGxlYXNlICIKLQkJCQkJInJlcG9ydCB5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCSJidXQgdGhlIGF0dHJpYnV0ZSBpcyByZXNpZGVudC4gICIKKwkJCQkJIlBsZWFzZSByZXBvcnQgeW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgogCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0Iik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9CkBAIC0xMjUwLDUwICsxMzE5LDggQEAKIAkJCQkJInRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoYS0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19TUEFSU0UpKSB7Ci0JCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKLQkJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7Ci0JCQkJaWYgKChuaS0+dHlwZSAhPSBBVF9EQVRBKSB8fCAobmktPnR5cGUgPT0KLQkJCQkJCUFUX0RBVEEgJiYgbmktPm5hbWVfbGVuKSkgewotCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCi0JCQkJCQkJIm5vbi1kYXRhIG9yIG5hbWVkICIKLQkJCQkJCQkiZGF0YSBhdHRyaWJ1dGUuICAiCi0JCQkJCQkJIlBsZWFzZSByZXBvcnQgeW91ICIKLQkJCQkJCQkic2F3IHRoaXMgbWVzc2FnZSB0byAiCi0JCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKLQkJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7Ci0JCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQkJfQotCQkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKLQkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQgIgotCQkJCQkJCSJhdHRyaWJ1dGUgYnV0ICIKLQkJCQkJCQkiY29tcHJlc3Npb24gaXMgIgotCQkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gIgotCQkJCQkJCSJjbHVzdGVyIHNpemUgKCVpKSA+ICIKLQkJCQkJCQkiNGtpQi4iLAotCQkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKLQkJCQkJZ290byB1bm1fZXJyX291dDsKLQkJCQl9Ci0JCQkJaWYgKChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgIT0KLQkJCQkJCUFUVFJfSVNfQ09NUFJFU1NFRCkgewotCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgdW5rbm93biAiCi0JCQkJCQkJImNvbXByZXNzaW9uIG1ldGhvZC4iKTsKLQkJCQkJZ290byB1bm1fZXJyX291dDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKLQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCAiCi0JCQkJCQkiYXR0cmlidXRlIGJ1dCB0aGUgYXR0cmlidXRlICIKLQkJCQkJCSJpcyAlcy4gIFBsZWFzZSByZXBvcnQgeW91ICIKLQkJCQkJCSJzYXcgdGhpcyBtZXNzYWdlIHRvICIKLQkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCi0JCQkJCQkic291cmNlZm9yZ2UubmV0IiwKLQkJCQkJCU5Jbm9Db21wcmVzc2VkKG5pKSA/Ci0JCQkJCQkiY29tcHJlc3NlZCIgOiAic3BhcnNlIik7Ci0JCQkJZ290byB1bm1fZXJyX291dDsKLQkJCX0KLQkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQotCQkJCU5Jbm9TZXRTcGFyc2UobmkpOworCQlpZiAoKE5Jbm9Db21wcmVzc2VkKG5pKSB8fCBOSW5vU3BhcnNlKG5pKSkgJiYKKwkJCQluaS0+dHlwZSAhPSBBVF9JTkRFWF9ST09UKSB7CiAJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCAhPSA0KSB7CiAJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG5vbnN0YW5kYXJkICIKIAkJCQkJCSJjb21wcmVzc2lvbiB1bml0ICgldSBpbnN0ZWFkICIKQEAgLTEzMTMsMjMgKzEzNDAsNiBAQAogCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKIAkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3NlZF9zaXplKTsKIAkJfQotCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgewotCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCBhbmQgIgotCQkJCQkJImNvbXByZXNzZWQgZGF0YS4iKTsKLQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJfQotCQkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKSB7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgIgotCQkJCQkJImF0dHJpYnV0ZSBidXQgdGhlIGF0dHJpYnV0ZSAiCi0JCQkJCQkiaXMgZW5jcnlwdGVkLiAgUGxlYXNlIHJlcG9ydCAiCi0JCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgotCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKLQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKLQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJfQotCQkJTklub1NldEVuY3J5cHRlZChuaSk7Ci0JCX0KIAkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgYXR0cmlidXRlIGhhcyAiCiAJCQkJCSJub24temVybyBsb3dlc3RfdmNuLiIpOwpAQCAtMTM0OCwxMiArMTM1OCwxMiBAQAogCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOwogCWVsc2UKIAkJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19hb3BzOwotCWlmIChOSW5vQ29tcHJlc3NlZChuaSkgfHwgTklub1NwYXJzZShuaSkpCisJaWYgKChOSW5vQ29tcHJlc3NlZChuaSkgfHwgTklub1NwYXJzZShuaSkpICYmIG5pLT50eXBlICE9IEFUX0lOREVYX1JPT1QpCiAJCXZpLT5pX2Jsb2NrcyA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPj4gOTsKIAllbHNlCiAJCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OwogCS8qCi0JICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXNuJ3QgZ28gYXdheSBhbmQgYXR0YWNoIGl0IHRvIHRoZQorCSAqIE1ha2Ugc3VyZSB0aGUgYmFzZSBpbm9kZSBkb2VzIG5vdCBnbyBhd2F5IGFuZCBhdHRhY2ggaXQgdG8gdGhlCiAJICogYXR0cmlidXRlIGlub2RlLgogCSAqLwogCWlncmFiKGJhc2VfdmkpOwpAQCAtMTQ4MCw3ICsxNDkwLDEwIEBACiAJCQkJImFmdGVyIHRoZSBhdHRyaWJ1dGUgdmFsdWUuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCS8qIENvbXByZXNzZWQvZW5jcnlwdGVkL3NwYXJzZSBpbmRleCByb290IGlzIG5vdCBhbGxvd2VkLiAqLworCS8qCisJICogQ29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4IHJvb3QgaXMgbm90IGFsbG93ZWQsIGV4Y2VwdCBmb3IKKwkgKiBkaXJlY3RvcmllcyBvZiBjb3Vyc2UgYnV0IHRob3NlIGFyZSBub3QgZGVhbHQgd2l0aCBoZXJlLgorCSAqLwogCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfCBBVFRSX0lTX0VOQ1JZUFRFRCB8CiAJCQlBVFRSX0lTX1NQQVJTRSkpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQvZW5jcnlwdGVkL3NwYXJzZSBpbmRleCAiCkBAIC0yNDMwLDE2ICsyNDQzLDE4IEBACiAJCQkgKiBXZSBza2lwcGVkIHRoZSB0cnVuY2F0ZSBidXQgbXVzdCBzdGlsbCB1cGRhdGUKIAkJCSAqIHRpbWVzdGFtcHMuCiAJCQkgKi8KLQkJCWlhX3ZhbGlkIHw9IEFUVFJfTVRJTUV8QVRUUl9DVElNRTsKKwkJCWlhX3ZhbGlkIHw9IEFUVFJfTVRJTUUgfCBBVFRSX0NUSU1FOwogCQl9CiAJfQotCiAJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKLQkJdmktPmlfYXRpbWUgPSBhdHRyLT5pYV9hdGltZTsKKwkJdmktPmlfYXRpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9hdGltZSwKKwkJCQl2aS0+aV9zYi0+c190aW1lX2dyYW4pOwogCWlmIChpYV92YWxpZCAmIEFUVFJfTVRJTUUpCi0JCXZpLT5pX210aW1lID0gYXR0ci0+aWFfbXRpbWU7CisJCXZpLT5pX210aW1lID0gdGltZXNwZWNfdHJ1bmMoYXR0ci0+aWFfbXRpbWUsCisJCQkJdmktPmlfc2ItPnNfdGltZV9ncmFuKTsKIAlpZiAoaWFfdmFsaWQgJiBBVFRSX0NUSU1FKQotCQl2aS0+aV9jdGltZSA9IGF0dHItPmlhX2N0aW1lOworCQl2aS0+aV9jdGltZSA9IHRpbWVzcGVjX3RydW5jKGF0dHItPmlhX2N0aW1lLAorCQkJCXZpLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CiAJbWFya19pbm9kZV9kaXJ0eSh2aSk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGNuYWxsb2MuYyBiL2ZzL250ZnMvbGNuYWxsb2MuYwppbmRleCBhNGJjMDc2Li43YjU5MzQyIDEwMDY0NAotLS0gYS9mcy9udGZzL2xjbmFsbG9jLmMKKysrIGIvZnMvbnRmcy9sY25hbGxvYy5jCkBAIC01NCw2ICs1NCw4IEBACiAJaW50IHJldCA9IDA7CiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAoIXJsKQorCQlyZXR1cm4gMDsKIAlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgewogCQlpbnQgZXJyOwogCkBAIC0xNjMsMTcgKzE2NSw5IEBACiAJQlVHX09OKHpvbmUgPCBGSVJTVF9aT05FKTsKIAlCVUdfT04oem9uZSA+IExBU1RfWk9ORSk7CiAKLQkvKiBSZXR1cm4gZW1wdHkgcnVubGlzdCBpZiBAY291bnQgPT0gMCAqLwotCS8vIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGp1c3QgcmV0dXJuIE5VTEwgaW5zdGVhZD8gKEFJQSkKLQlpZiAoIWNvdW50KSB7Ci0JCXJsID0gbnRmc19tYWxsb2Nfbm9mcyhQQUdFX1NJWkUpOwotCQlpZiAoIXJsKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JCXJsWzBdLnZjbiA9IHN0YXJ0X3ZjbjsKLQkJcmxbMF0ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7Ci0JCXJsWzBdLmxlbmd0aCA9IDA7Ci0JCXJldHVybiBybDsKLQl9CisJLyogUmV0dXJuIE5VTEwgaWYgQGNvdW50IGlzIHplcm8uICovCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIE5VTEw7CiAJLyogVGFrZSB0aGUgbGNuYm1wIGxvY2sgZm9yIHdyaXRpbmcuICovCiAJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CiAJLyoKQEAgLTc4OCw3ICs3ODIsOCBAQAogICogQHZpOgkJdmZzIGlub2RlIHdob3NlIHJ1bmxpc3QgZGVzY3JpYmVzIHRoZSBjbHVzdGVycyB0byBmcmVlCiAgKiBAc3RhcnRfdmNuOgl2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgQHZpIGF0IHdoaWNoIHRvIHN0YXJ0IGZyZWVpbmcgY2x1c3RlcnMKICAqIEBjb3VudDoJbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIGZyZWUgb3IgLTEgZm9yIGFsbCBjbHVzdGVycwotICogQGlzX3JvbGxiYWNrOglpZiBUUlVFIHRoaXMgaXMgYSByb2xsYmFjayBvcGVyYXRpb24KKyAqIEB3cml0ZV9sb2NrZWQ6CXRydWUgaWYgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciB3cml0aW5nCisgKiBAaXNfcm9sbGJhY2s6CXRydWUgaWYgdGhpcyBpcyBhIHJvbGxiYWNrIG9wZXJhdGlvbgogICoKICAqIEZyZWUgQGNvdW50IGNsdXN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBjbHVzdGVyIEBzdGFydF92Y24gaW4gdGhlIHJ1bmxpc3QKICAqIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KQEAgLTgwNiwxNyArODAxLDE3IEBACiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWFsbG9jYXRlZCBjbHVzdGVycyAobm90IGNvdW50aW5nIHNwYXJzZSBvbmVzKSBvbgogICogc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgogICoKLSAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IEB2aSBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcwotICoJICAgICAgdW5sb2NrZWQgb24gcmV0dXJuLgotICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcnVubGlzdCBsb2NrIG9mIEB2aSBmb3IgcmVhZGluZyBhbmQKLSAqCSAgICAgIHNvbWV0aW1lcyBmb3Igd3JpdGluZyBhbmQgc29tZXRpbWVzIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBkZXNjcmliZWQgYnkgQHZpIG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5IGFuZCBpcworICoJICAgICAgbG9ja2VkIG9uIHJldHVybi4gIE5vdGUgaWYgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciByZWFkaW5nIHRoZQorICoJICAgICAgbG9jayBtYXkgYmUgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZC4gIE5vdGUgdGhlIHJ1bmxpc3QgbWF5IGJlCisgKgkgICAgICBtb2RpZmllZCB3aGVuIG5lZWRlZCBydW5saXN0IGZyYWdtZW50cyBuZWVkIHRvIGJlIG1hcHBlZC4KICAqCSAgICAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZAogICoJICAgICAgb24gcmV0dXJuLgogICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKICAqCSAgICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCiAgKi8KIHM2NCBfX250ZnNfY2x1c3Rlcl9mcmVlKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IFZDTiBzdGFydF92Y24sIHM2NCBjb3VudCwKLQkJY29uc3QgQk9PTCBpc19yb2xsYmFjaykKKwkJY29uc3QgQk9PTCB3cml0ZV9sb2NrZWQsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spCiB7CiAJczY0IGRlbHRhLCB0b19mcmVlLCB0b3RhbF9mcmVlZCwgcmVhbF9mcmVlZDsKIAludGZzX2lub2RlICpuaTsKQEAgLTg0OCw4ICs4NDMsNyBAQAogCiAJdG90YWxfZnJlZWQgPSByZWFsX2ZyZWVkID0gMDsKIAotCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7Ci0JcmwgPSBudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG5pLCBzdGFydF92Y24sIEZBTFNFKTsKKwlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobmksIHN0YXJ0X3Zjbiwgd3JpdGVfbG9ja2VkKTsKIAlpZiAoSVNfRVJSKHJsKSkgewogCQlpZiAoIWlzX3JvbGxiYWNrKQogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgcnVubGlzdCAiCkBAIC05MDMsNyArODk3LDcgQEAKIAogCQkJLyogQXR0ZW1wdCB0byBtYXAgcnVubGlzdC4gKi8KIAkJCXZjbiA9IHJsLT52Y247Ci0JCQlybCA9IG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sobmksIHZjbiwgRkFMU0UpOworCQkJcmwgPSBudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG5pLCB2Y24sIHdyaXRlX2xvY2tlZCk7CiAJCQlpZiAoSVNfRVJSKHJsKSkgewogCQkJCWVyciA9IFBUUl9FUlIocmwpOwogCQkJCWlmICghaXNfcm9sbGJhY2spCkBAIC05NTAsNyArOTQ0LDYgQEAKIAkJLyogVXBkYXRlIHRoZSB0b3RhbCBkb25lIGNsdXN0ZXJzLiAqLwogCQl0b3RhbF9mcmVlZCArPSB0b19mcmVlOwogCX0KLQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIAlpZiAobGlrZWx5KCFpc19yb2xsYmFjaykpCiAJCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKIApAQCAtOTYwLDcgKzk1Myw2IEBACiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAlyZXR1cm4gcmVhbF9mcmVlZDsKIGVycl9vdXQ6Ci0JdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CiAJaWYgKGlzX3JvbGxiYWNrKQogCQlyZXR1cm4gZXJyOwogCS8qIElmIG5vIHJlYWwgY2x1c3RlcnMgd2VyZSBmcmVlZCwgbm8gbmVlZCB0byByb2xsYmFjay4gKi8KQEAgLTk3Myw3ICs5NjUsOCBAQAogCSAqIElmIHJvbGxiYWNrIGZhaWxzLCBzZXQgdGhlIHZvbHVtZSBlcnJvcnMgZmxhZywgZW1pdCBhbiBlcnJvcgogCSAqIG1lc3NhZ2UsIGFuZCByZXR1cm4gdGhlIGVycm9yIGNvZGUuCiAJICovCi0JZGVsdGEgPSBfX250ZnNfY2x1c3Rlcl9mcmVlKHZpLCBzdGFydF92Y24sIHRvdGFsX2ZyZWVkLCBUUlVFKTsKKwlkZWx0YSA9IF9fbnRmc19jbHVzdGVyX2ZyZWUodmksIHN0YXJ0X3ZjbiwgdG90YWxfZnJlZWQsIHdyaXRlX2xvY2tlZCwKKwkJCVRSVUUpOwogCWlmIChkZWx0YSA8IDApIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJvbGxiYWNrIChlcnJvciAlaSkuICBMZWF2aW5nICIKIAkJCQkiaW5jb25zaXN0ZW50IG1ldGFkYXRhISAgVW5tb3VudCBhbmQgcnVuICIKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGNuYWxsb2MuaCBiL2ZzL250ZnMvbGNuYWxsb2MuaAppbmRleCA0Y2FjMWMwLi5lNGQ3ZmI5IDEwMDY0NAotLS0gYS9mcy9udGZzL2xjbmFsbG9jLmgKKysrIGIvZnMvbnRmcy9sY25hbGxvYy5oCkBAIC00MywxMyArNDMsMTQgQEAKIAkJY29uc3QgTlRGU19DTFVTVEVSX0FMTE9DQVRJT05fWk9ORVMgem9uZSk7CiAKIGV4dGVybiBzNjQgX19udGZzX2NsdXN0ZXJfZnJlZShzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBWQ04gc3RhcnRfdmNuLAotCQlzNjQgY291bnQsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spOworCQlzNjQgY291bnQsIGNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkLCBjb25zdCBCT09MIGlzX3JvbGxiYWNrKTsKIAogLyoqCiAgKiBudGZzX2NsdXN0ZXJfZnJlZSAtIGZyZWUgY2x1c3RlcnMgb24gYW4gbnRmcyB2b2x1bWUKICAqIEB2aToJCXZmcyBpbm9kZSB3aG9zZSBydW5saXN0IGRlc2NyaWJlcyB0aGUgY2x1c3RlcnMgdG8gZnJlZQogICogQHN0YXJ0X3ZjbjoJdmNuIGluIHRoZSBydW5saXN0IG9mIEB2aSBhdCB3aGljaCB0byBzdGFydCBmcmVlaW5nIGNsdXN0ZXJzCiAgKiBAY291bnQ6CW51bWJlciBvZiBjbHVzdGVycyB0byBmcmVlIG9yIC0xIGZvciBhbGwgY2x1c3RlcnMKKyAqIEB3cml0ZV9sb2NrZWQ6CXRydWUgaWYgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciB3cml0aW5nCiAgKgogICogRnJlZSBAY291bnQgY2x1c3RlcnMgc3RhcnRpbmcgYXQgdGhlIGNsdXN0ZXIgQHN0YXJ0X3ZjbiBpbiB0aGUgcnVubGlzdAogICogZGVzY3JpYmVkIGJ5IHRoZSB2ZnMgaW5vZGUgQHZpLgpAQCAtNjQsMTkgKzY1LDE5IEBACiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWFsbG9jYXRlZCBjbHVzdGVycyAobm90IGNvdW50aW5nIHNwYXJzZSBvbmVzKSBvbgogICogc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgogICoKLSAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IEB2aSBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcwotICoJICAgICAgdW5sb2NrZWQgb24gcmV0dXJuLgotICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcnVubGlzdCBsb2NrIG9mIEB2aSBmb3IgcmVhZGluZyBhbmQKLSAqCSAgICAgIHNvbWV0aW1lcyBmb3Igd3JpdGluZyBhbmQgc29tZXRpbWVzIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBkZXNjcmliZWQgYnkgQHZpIG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5IGFuZCBpcworICoJICAgICAgbG9ja2VkIG9uIHJldHVybi4gIE5vdGUgaWYgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciByZWFkaW5nIHRoZQorICoJICAgICAgbG9jayBtYXkgYmUgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZC4gIE5vdGUgdGhlIHJ1bmxpc3QgbWF5IGJlCisgKgkgICAgICBtb2RpZmllZCB3aGVuIG5lZWRlZCBydW5saXN0IGZyYWdtZW50cyBuZWVkIHRvIGJlIG1hcHBlZC4KICAqCSAgICAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZAogICoJICAgICAgb24gcmV0dXJuLgogICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKICAqCSAgICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgczY0IG50ZnNfY2x1c3Rlcl9mcmVlKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IFZDTiBzdGFydF92Y24sCi0JCXM2NCBjb3VudCkKKwkJczY0IGNvdW50LCBjb25zdCBCT09MIHdyaXRlX2xvY2tlZCkKIHsKLQlyZXR1cm4gX19udGZzX2NsdXN0ZXJfZnJlZSh2aSwgc3RhcnRfdmNuLCBjb3VudCwgRkFMU0UpOworCXJldHVybiBfX250ZnNfY2x1c3Rlcl9mcmVlKHZpLCBzdGFydF92Y24sIGNvdW50LCB3cml0ZV9sb2NrZWQsIEZBTFNFKTsKIH0KIAogZXh0ZXJuIGludCBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sLApAQCAtOTMsOCArOTQsMTAgQEAKICAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCiAgKgotICogTG9ja2luZzogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKLSAqCSAgICBtb2RpZmllcyB0aGUgYml0bWFwIGNvbnRlbnRzLgorICogTG9ja2luZzogLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAorICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KKyAqCSAgICAtIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGxvY2tlZCB0aGUgcnVubGlzdCBAcmwgZm9yIHJlYWRpbmcgb3IKKyAqCSAgICAgIHdyaXRpbmcuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmwobnRmc192b2x1bWUgKnZvbCwKIAkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCkKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbG9nZmlsZS5jIGIvZnMvbnRmcy9sb2dmaWxlLmMKaW5kZXggOGVkYjhlMi4uMDE3M2U5NSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9sb2dmaWxlLmMKKysrIGIvZnMvbnRmcy9sb2dmaWxlLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCSAqLwogCWlmICghbnRmc19pc19jaGtkX3JlY29yZChycC0+bWFnaWMpICYmIHNsZTY0X3RvX2NwdShycC0+Y2hrZHNrX2xzbikpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBpcyBub3QgbW9kaWZpZWQgIgotCQkJCSJjaGtkc2sgYnV0IGEgY2hrZHNrIExTTiBpcyBzcGVjaWZpZWQuIik7CisJCQkJImJ5IGNoa2RzayBidXQgYSBjaGtkc2sgTFNOIGlzIHNwZWNpZmllZC4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAludGZzX2RlYnVnKCJEb25lLiIpOwpAQCAtMzEyLDEwICszMTIsMTIgQEAKICAqIEB2aToJCSRMb2dGaWxlIGlub2RlIHRvIHdoaWNoIHRoZSByZXN0YXJ0IHBhZ2UgYmVsb25ncwogICogQHJwOgkJcmVzdGFydCBwYWdlIHRvIGNoZWNrCiAgKiBAcG9zOglwb3NpdGlvbiBpbiBAdmkgYXQgd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSByZXNpZGVzCi0gKiBAd3JwOgljb3B5IG9mIHRoZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0ZWQgcmVzdGFydCBwYWdlCisgKiBAd3JwOglbT1VUXSBjb3B5IG9mIHRoZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0ZWQgcmVzdGFydCBwYWdlCisgKiBAbHNuOglbT1VUXSBzZXQgdG8gdGhlIGN1cnJlbnQgbG9nZmlsZSBsc24gb24gc3VjY2VzcwogICoKLSAqIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgQHJwIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaXMKLSAqIGNvbnNpc3RlbnQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgQHJwIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIDAgaWYgaXQgaXMgY29uc2lzdGVudAorICogYW5kIC1lcnJubyBvdGhlcndpc2UuICBUaGUgcmVzdGFydCBwYWdlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgY2hrZHNrIGluCisgKiB3aGljaCBjYXNlIGl0cyBtYWdpYyBpcyBDSEtEIGluc3RlYWQgb2YgUlNUUi4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgTlRGU19CTE9DS19TSVpFIGJ5dGVzIGluIEBycCwgaS5lLiBpdCBkb2VzIG5vdAogICogcmVxdWlyZSB0aGUgZnVsbCByZXN0YXJ0IHBhZ2UuCkBAIC0zMjMsMjUgKzMyNSwzMyBAQAogICogSWYgQHdycCBpcyBub3QgTlVMTCwgb24gc3VjY2VzcywgKkB3cnAgd2lsbCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEKICAqIGNvcHkgb2YgdGhlIGNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCBwYWdlLiAgT24gZmFpbHVyZSwKICAqICpAd3JwIGlzIHVuZGVmaW5lZC4KKyAqCisgKiBTaW1pbGxhcmx5LCBpZiBAbHNuIGlzIG5vdCBOVUxMLCBvbiBzdWNjZXMgKkBsc24gd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQKKyAqIGxvZ2ZpbGUgbHNuIGFjY29yZGluZyB0byB0aGlzIHJlc3RhcnQgcGFnZS4gIE9uIGZhaWx1cmUsICpAbHNuIGlzIHVuZGVmaW5lZC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVJTlZBTAktIFRoZSByZXN0YXJ0IHBhZ2UgaXMgaW5jb25zaXN0ZW50LgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWQgdGhlIHJlc3RhcnQgcGFnZS4KKyAqCS1FSU8JLSBGYWlsZWQgdG8gcmVhZGluZyBmcm9tICRMb2dGaWxlLgogICovCi1zdGF0aWMgQk9PTCBudGZzX2NoZWNrX2FuZF9sb2FkX3Jlc3RhcnRfcGFnZShzdHJ1Y3QgaW5vZGUgKnZpLAotCQlSRVNUQVJUX1BBR0VfSEVBREVSICpycCwgczY0IHBvcywgUkVTVEFSVF9QQUdFX0hFQURFUiAqKndycCkKK3N0YXRpYyBpbnQgbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2Uoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnAsIHM2NCBwb3MsIFJFU1RBUlRfUEFHRV9IRUFERVIgKip3cnAsCisJCUxTTiAqbHNuKQogewogCVJFU1RBUlRfQVJFQSAqcmE7CiAJUkVTVEFSVF9QQUdFX0hFQURFUiAqdHJwOwotCWludCBzaXplOwotCUJPT0wgcmV0OworCWludCBzaXplLCBlcnI7CiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKIAkvKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBmb3IgY29uc2lzdGVuY3kuICovCiAJaWYgKCFudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIodmksIHJwLCBwb3MpKSB7CiAJCS8qIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gKi8KLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogQ2hlY2sgdGhlIHJlc3RhcnQgYXJlYSBmb3IgY29uc2lzdGVuY3kuICovCiAJaWYgKCFudGZzX2NoZWNrX3Jlc3RhcnRfYXJlYSh2aSwgcnApKSB7CiAJCS8qIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gKi8KLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmEgPSAoUkVTVEFSVF9BUkVBKikoKHU4KilycCArIGxlMTZfdG9fY3B1KHJwLT5yZXN0YXJ0X2FyZWFfb2Zmc2V0KSk7CiAJLyoKQEAgLTM1Miw3ICszNjIsNyBAQAogCWlmICghdHJwKSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAkTG9nRmlsZSAiCiAJCQkJInJlc3RhcnQgcGFnZSBidWZmZXIuIik7Ci0JCXJldHVybiBGQUxTRTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCS8qCiAJICogUmVhZCB0aGUgd2hvbGUgb2YgdGhlIHJlc3RhcnQgcGFnZSBpbnRvIHRoZSBidWZmZXIuICBJZiBpdCBmaXRzCkBAIC0zNzksNiArMzg5LDkgQEAKIAkJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSAiCiAJCQkJCQkicGFnZSAoaW5kZXggJWx1KS4iLCBpZHgpOworCQkJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCQkJaWYgKGVyciAhPSAtRUlPICYmIGVyciAhPSAtRU5PTUVNKQorCQkJCQllcnIgPSAtRUlPOwogCQkJCWdvdG8gZXJyX291dDsKIAkJCX0KIAkJCXNpemUgPSBtaW5fdChpbnQsIHRvX3JlYWQsIFBBR0VfQ0FDSEVfU0laRSk7CkBAIC0zOTIsMjkgKzQwNSw1NyBAQAogCS8qIFBlcmZvcm0gdGhlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3Rpb24gb24gdGhlIGJ1ZmZlci4gKi8KIAlpZiAocG9zdF9yZWFkX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKXRycCwKIAkJCWxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSkpIHsKLQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIk11bHRpIHNlY3RvciB0cmFuc2ZlciBlcnJvciBkZXRlY3RlZCBpbiAiCi0JCQkJIiRMb2dGaWxlIHJlc3RhcnQgcGFnZS4iKTsKLQkJZ290byBlcnJfb3V0OworCQkvKgorCQkgKiBBIG11bHRpIHNlY3RvciB0cmFuZmVyIGVycm9yIHdhcyBkZXRlY3RlZC4gIFdlIG9ubHkgbmVlZCB0bworCQkgKiBhYm9ydCBpZiB0aGUgcmVzdGFydCBwYWdlIGNvbnRlbnRzIGV4Y2VlZCB0aGUgbXVsdGkgc2VjdG9yCisJCSAqIHRyYW5zZmVyIGZpeHVwIG9mIHRoZSBmaXJzdCBzZWN0b3IuCisJCSAqLworCQlpZiAobGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpICsKKwkJCQlsZTE2X3RvX2NwdShyYS0+cmVzdGFydF9hcmVhX2xlbmd0aCkgPgorCQkJCU5URlNfQkxPQ0tfU0laRSAtIHNpemVvZih1MTYpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTXVsdGkgc2VjdG9yIHRyYW5zZmVyIGVycm9yICIKKwkJCQkJImRldGVjdGVkIGluICRMb2dGaWxlIHJlc3RhcnQgcGFnZS4iKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KIAl9Ci0JLyogQ2hlY2sgdGhlIGxvZyBjbGllbnQgcmVjb3JkcyBmb3IgY29uc2lzdGVuY3kuICovCi0JcmV0ID0gbnRmc19jaGVja19sb2dfY2xpZW50X2FycmF5KHZpLCB0cnApOwotCWlmIChyZXQgJiYgd3JwKQotCQkqd3JwID0gdHJwOwotCWVsc2UKLQkJbnRmc19mcmVlKHRycCk7CisJLyoKKwkgKiBJZiB0aGUgcmVzdGFydCBwYWdlIGlzIG1vZGlmaWVkIGJ5IGNoa2RzayBvciB0aGVyZSBhcmUgbm8gYWN0aXZlCisJICogbG9nZmlsZSBjbGllbnRzLCB0aGUgbG9nZmlsZSBpcyBjb25zaXN0ZW50LiAgT3RoZXJ3aXNlLCBuZWVkIHRvCisJICogY2hlY2sgdGhlIGxvZyBjbGllbnQgcmVjb3JkcyBmb3IgY29uc2lzdGVuY3ksIHRvby4KKwkgKi8KKwllcnIgPSAwOworCWlmIChudGZzX2lzX3JzdHJfcmVjb3JkKHJwLT5tYWdpYykgJiYKKwkJCXJhLT5jbGllbnRfaW5fdXNlX2xpc3QgIT0gTE9HRklMRV9OT19DTElFTlQpIHsKKwkJaWYgKCFudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkodmksIHRycCkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisJaWYgKGxzbikgeworCQlpZiAobnRmc19pc19yc3RyX3JlY29yZChycC0+bWFnaWMpKQorCQkJKmxzbiA9IHNsZTY0X3RvX2NwdShyYS0+Y3VycmVudF9sc24pOworCQllbHNlIC8qIGlmIChudGZzX2lzX2Noa2RfcmVjb3JkKHJwLT5tYWdpYykpICovCisJCQkqbHNuID0gc2xlNjRfdG9fY3B1KHJwLT5jaGtkc2tfbHNuKTsKKwl9CiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKLQlyZXR1cm4gcmV0OworCWlmICh3cnApCisJCSp3cnAgPSB0cnA7CisJZWxzZSB7CiBlcnJfb3V0OgotCW50ZnNfZnJlZSh0cnApOwotCXJldHVybiBGQUxTRTsKKwkJbnRmc19mcmVlKHRycCk7CisJfQorCXJldHVybiBlcnI7CiB9CiAKIC8qKgogICogbnRmc19jaGVja19sb2dmaWxlIC0gY2hlY2sgdGhlIGpvdXJuYWwgZm9yIGNvbnNpc3RlbmN5CiAgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gY2hlY2sKKyAqIEBycDoJCVtPVVRdIG9uIHN1Y2Nlc3MgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgcmVzdGFydCBwYWdlCiAgKgogICogQ2hlY2sgdGhlICRMb2dGaWxlIGpvdXJuYWwgZm9yIGNvbnNpc3RlbmN5IGFuZCByZXR1cm4gVFJVRSBpZiBpdCBpcwotICogY29uc2lzdGVudCBhbmQgRkFMU0UgaWYgbm90LgorICogY29uc2lzdGVudCBhbmQgRkFMU0UgaWYgbm90LiAgT24gc3VjY2VzcywgdGhlIGN1cnJlbnQgcmVzdGFydCBwYWdlIGlzCisgKiByZXR1cm5lZCBpbiAqQHJwLiAgQ2FsbGVyIG11c3QgY2FsbCBudGZzX2ZyZWUoKkBycCkgd2hlbiBmaW5pc2hlZCB3aXRoIGl0LgogICoKICAqIEF0IHByZXNlbnQgd2Ugb25seSBjaGVjayB0aGUgdHdvIHJlc3RhcnQgcGFnZXMgYW5kIGlnbm9yZSB0aGUgbG9nIHJlY29yZAogICogcGFnZXMuCkBAIC00MjQsMTkgKzQ2NSwxOCBAQAogICogaWYgdGhlICRMb2dGaWxlIHdhcyBjcmVhdGVkIG9uIGEgc3lzdGVtIHdpdGggYSBkaWZmZXJlbnQgcGFnZSBzaXplIHRvIG91cnMKICAqIHlldCBhbmQgbXN0IGRlcHJvdGVjdGlvbiB3b3VsZCBmYWlsIGlmIG91ciBwYWdlIHNpemUgaXMgc21hbGxlci4KICAqLwotQk9PTCBudGZzX2NoZWNrX2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpCitCT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSwgUkVTVEFSVF9QQUdFX0hFQURFUiAqKnJwKQogewotCXM2NCBzaXplLCBwb3MsIHJzdHIxX3BvcywgcnN0cjJfcG9zOworCXM2NCBzaXplLCBwb3M7CisJTFNOIHJzdHIxX2xzbiwgcnN0cjJfbHNuOwogCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGxvZ192aS0+aV9zYik7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBsb2dfdmktPmlfbWFwcGluZzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJdTggKmthZGRyID0gTlVMTDsKIAlSRVNUQVJUX1BBR0VfSEVBREVSICpyc3RyMV9waCA9IE5VTEw7CiAJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnN0cjJfcGggPSBOVUxMOwotCWludCBsb2dfcGFnZV9zaXplLCBsb2dfcGFnZV9tYXNrLCBvZnM7CisJaW50IGxvZ19wYWdlX3NpemUsIGxvZ19wYWdlX21hc2ssIGVycjsKIAlCT09MIGxvZ2ZpbGVfaXNfZW1wdHkgPSBUUlVFOwotCUJPT0wgcnN0cjFfZm91bmQgPSBGQUxTRTsKLQlCT09MIHJzdHIyX2ZvdW5kID0gRkFMU0U7CiAJdTggbG9nX3BhZ2VfYml0czsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwpAQCAtNDkxLDcgKzUzMSw3IEBACiAJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSAiCiAJCQkJCQkicGFnZSAoaW5kZXggJWx1KS4iLCBpZHgpOwotCQkJCXJldHVybiBGQUxTRTsKKwkJCQlnb3RvIGVycl9vdXQ7CiAJCQl9CiAJCX0KIAkJa2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIChwb3MgJiB+UEFHRV9DQUNIRV9NQVNLKTsKQEAgLTUxMCw5OSArNTUwLDk1IEBACiAJCSAqLwogCQlpZiAobnRmc19pc19yY3JkX3JlY29yZHAoKGxlMzIqKWthZGRyKSkKIAkJCWJyZWFrOwotCQkvKgotCQkgKiBBIG1vZGlmaWVkIGJ5IGNoa2RzayByZXN0YXJ0IHBhZ2UgbWVhbnMgd2UgY2Fubm90IGhhbmRsZQotCQkgKiB0aGlzIGxvZyBmaWxlLgotCQkgKi8KLQkJaWYgKG50ZnNfaXNfY2hrZF9yZWNvcmRwKChsZTMyKilrYWRkcikpIHsKLQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRMb2dGaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGJ5ICIKLQkJCQkJImNoa2Rzay4gIE1vdW50IHRoaXMgdm9sdW1lIGluICIKLQkJCQkJIldpbmRvd3MuIik7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQkJLyogSWYgbm90IGEgcmVzdGFydCBwYWdlLCBjb250aW51ZS4gKi8KLQkJaWYgKCFudGZzX2lzX3JzdHJfcmVjb3JkcCgobGUzMiopa2FkZHIpKSB7Ci0JCQkvKiBTa2lwIHRvIHRoZSBtaW5pbXVtIHBhZ2Ugc2l6ZSBmb3IgdGhlIG5leHQgb25lLiAqLworCQkvKiBJZiBub3QgYSAobW9kaWZpZWQgYnkgY2hrZHNrKSByZXN0YXJ0IHBhZ2UsIGNvbnRpbnVlLiAqLworCQlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmRwKChsZTMyKilrYWRkcikgJiYKKwkJCQkhbnRmc19pc19jaGtkX3JlY29yZHAoKGxlMzIqKWthZGRyKSkgewogCQkJaWYgKCFwb3MpCiAJCQkJcG9zID0gTlRGU19CTE9DS19TSVpFID4+IDE7CiAJCQljb250aW51ZTsKIAkJfQotCQkvKiBXZSBub3cga25vdyB3ZSBoYXZlIGEgcmVzdGFydCBwYWdlLiAqLwotCQlpZiAoIXBvcykgewotCQkJcnN0cjFfZm91bmQgPSBUUlVFOwotCQkJcnN0cjFfcG9zID0gcG9zOwotCQl9IGVsc2UgewotCQkJaWYgKHJzdHIyX2ZvdW5kKSB7Ci0JCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRm91bmQgbW9yZSB0aGFuIHR3byAiCi0JCQkJCQkicmVzdGFydCBwYWdlcyBpbiAkTG9nRmlsZS4iKTsKLQkJCQlnb3RvIGVycl9vdXQ7CisJCS8qCisJCSAqIENoZWNrIHRoZSAobW9kaWZpZWQgYnkgY2hrZHNrKSByZXN0YXJ0IHBhZ2UgZm9yIGNvbnNpc3RlbmN5CisJCSAqIGFuZCBnZXQgYSBjb3B5IG9mIHRoZSBjb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIKKwkJICogZGVwcm90ZWN0ZWQgcmVzdGFydCBwYWdlLgorCQkgKi8KKwkJZXJyID0gbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2UobG9nX3ZpLAorCQkJCShSRVNUQVJUX1BBR0VfSEVBREVSKilrYWRkciwgcG9zLAorCQkJCSFyc3RyMV9waCA/ICZyc3RyMV9waCA6ICZyc3RyMl9waCwKKwkJCQkhcnN0cjFfcGggPyAmcnN0cjFfbHNuIDogJnJzdHIyX2xzbik7CisJCWlmICghZXJyKSB7CisJCQkvKgorCQkJICogSWYgd2UgaGF2ZSBub3cgZm91bmQgdGhlIGZpcnN0IChtb2RpZmllZCBieSBjaGtkc2spCisJCQkgKiByZXN0YXJ0IHBhZ2UsIGNvbnRpbnVlIGxvb2tpbmcgZm9yIHRoZSBzZWNvbmQgb25lLgorCQkJICovCisJCQlpZiAoIXBvcykgeworCQkJCXBvcyA9IE5URlNfQkxPQ0tfU0laRSA+PiAxOworCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcnN0cjJfZm91bmQgPSBUUlVFOwotCQkJcnN0cjJfcG9zID0gcG9zOworCQkJLyoKKwkJCSAqIFdlIGhhdmUgbm93IGZvdW5kIHRoZSBzZWNvbmQgKG1vZGlmaWVkIGJ5IGNoa2RzaykKKwkJCSAqIHJlc3RhcnQgcGFnZSwgc28gd2UgY2FuIHN0b3AgbG9va2luZy4KKwkJCSAqLworCQkJYnJlYWs7CiAJCX0KIAkJLyoKLQkJICogQ2hlY2sgdGhlIHJlc3RhcnQgcGFnZSBmb3IgY29uc2lzdGVuY3kgYW5kIGdldCBhIGNvcHkgb2YgdGhlCi0JCSAqIGNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCByZXN0YXJ0IHBhZ2UuCisJCSAqIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gIE5vdGUsIHdlIGRvCisJCSAqIG5vdCBhYm9ydCBpZiB0aGUgcmVzdGFydCBwYWdlIHdhcyBpbnZhbGlkIGFzIHdlIG1pZ2h0IHN0aWxsCisJCSAqIGZpbmQgYSB2YWxpZCBvbmUgZnVydGhlciBpbiB0aGUgZmlsZS4KIAkJICovCi0JCWlmICghbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2UobG9nX3ZpLAotCQkJCShSRVNUQVJUX1BBR0VfSEVBREVSKilrYWRkciwgcG9zLAotCQkJCSFwb3MgPyAmcnN0cjFfcGggOiAmcnN0cjJfcGgpKSB7Ci0JCQkvKiBFcnJvciBvdXRwdXQgYWxyZWFkeSBkb25lIGluc2lkZSB0aGUgZnVuY3Rpb24uICovCisJCWlmIChlcnIgIT0gLUVJTlZBTCkgeworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOwogCQkJZ290byBlcnJfb3V0OwogCQl9Ci0JCS8qCi0JCSAqIFdlIGhhdmUgYSB2YWxpZCByZXN0YXJ0IHBhZ2UuICBUaGUgbmV4dCBvbmUgbXVzdCBiZSBhZnRlcgotCQkgKiBhIHdob2xlIHN5c3RlbSBwYWdlIHNpemUgYXMgc3BlY2lmaWVkIGJ5IHRoZSB2YWxpZCByZXN0YXJ0Ci0JCSAqIHBhZ2UuCi0JCSAqLworCQkvKiBDb250aW51ZSBsb29raW5nLiAqLwogCQlpZiAoIXBvcykKLQkJCXBvcyA9IGxlMzJfdG9fY3B1KHJzdHIxX3BoLT5zeXN0ZW1fcGFnZV9zaXplKSA+PiAxOworCQkJcG9zID0gTlRGU19CTE9DS19TSVpFID4+IDE7CiAJfQotCWlmIChwYWdlKSB7CisJaWYgKHBhZ2UpCiAJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKLQkJcGFnZSA9IE5VTEw7Ci0JfQogCWlmIChsb2dmaWxlX2lzX2VtcHR5KSB7CiAJCU5Wb2xTZXRMb2dGaWxlRW1wdHkodm9sKTsKIGlzX2VtcHR5OgogCQludGZzX2RlYnVnKCJEb25lLiAgKCRMb2dGaWxlIGlzIGVtcHR5LikiKTsKIAkJcmV0dXJuIFRSVUU7CiAJfQotCWlmICghcnN0cjFfZm91bmQgfHwgIXJzdHIyX2ZvdW5kKSB7Ci0JCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkRpZCBub3QgZmluZCB0d28gcmVzdGFydCBwYWdlcyBpbiAiCi0JCQkJIiRMb2dGaWxlLiIpOwotCQlnb3RvIGVycl9vdXQ7CisJaWYgKCFyc3RyMV9waCkgeworCQlCVUdfT04ocnN0cjJfcGgpOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJEaWQgbm90IGZpbmQgYW55IHJlc3RhcnQgcGFnZXMgaW4gIgorCQkJCSIkTG9nRmlsZSBhbmQgaXQgd2FzIG5vdCBlbXB0eS4iKTsKKwkJcmV0dXJuIEZBTFNFOwogCX0KLQkvKgotCSAqIFRoZSB0d28gcmVzdGFydCBhcmVhcyBtdXN0IGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSB1cGRhdGUKLQkgKiBzZXF1ZW5jZSBudW1iZXIuCi0JICovCi0Jb2ZzID0gbGUxNl90b19jcHUocnN0cjFfcGgtPnVzYV9vZnMpOwotCWlmIChtZW1jbXAocnN0cjFfcGgsIHJzdHIyX3BoLCBvZnMpIHx8IChvZnMgKz0gc2l6ZW9mKHUxNiksCi0JCQltZW1jbXAoKHU4Kilyc3RyMV9waCArIG9mcywgKHU4Kilyc3RyMl9waCArIG9mcywKLQkJCWxlMzJfdG9fY3B1KHJzdHIxX3BoLT5zeXN0ZW1fcGFnZV9zaXplKSAtIG9mcykpKSB7Ci0JCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRoZSB0d28gcmVzdGFydCBwYWdlcyBpbiAkTG9nRmlsZSBkbyBub3QgIgotCQkJCSJtYXRjaC4iKTsKLQkJZ290byBlcnJfb3V0OworCS8qIElmIGJvdGggcmVzdGFydCBwYWdlcyB3ZXJlIGZvdW5kLCB1c2UgdGhlIG1vcmUgcmVjZW50IG9uZS4gKi8KKwlpZiAocnN0cjJfcGgpIHsKKwkJLyoKKwkJICogSWYgdGhlIHNlY29uZCByZXN0YXJ0IGFyZWEgaXMgbW9yZSByZWNlbnQsIHN3aXRjaCB0byBpdC4KKwkJICogT3RoZXJ3aXNlIGp1c3QgdGhyb3cgaXQgYXdheS4KKwkJICovCisJCWlmIChyc3RyMl9sc24gPiByc3RyMV9sc24pIHsKKwkJCW50ZnNfZnJlZShyc3RyMV9waCk7CisJCQlyc3RyMV9waCA9IHJzdHIyX3BoOworCQkJLyogcnN0cjFfbHNuID0gcnN0cjJfbHNuOyAqLworCQl9IGVsc2UKKwkJCW50ZnNfZnJlZShyc3RyMl9waCk7CisJCXJzdHIyX3BoID0gTlVMTDsKIAl9Ci0JbnRmc19mcmVlKHJzdHIxX3BoKTsKLQludGZzX2ZyZWUocnN0cjJfcGgpOwogCS8qIEFsbCBjb25zaXN0ZW5jeSBjaGVja3MgcGFzc2VkLiAqLworCWlmIChycCkKKwkJKnJwID0gcnN0cjFfcGg7CisJZWxzZQorCQludGZzX2ZyZWUocnN0cjFfcGgpOwogCW50ZnNfZGVidWcoIkRvbmUuIik7CiAJcmV0dXJuIFRSVUU7CiBlcnJfb3V0OgotCWlmIChwYWdlKQotCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CiAJaWYgKHJzdHIxX3BoKQogCQludGZzX2ZyZWUocnN0cjFfcGgpOwotCWlmIChyc3RyMl9waCkKLQkJbnRmc19mcmVlKHJzdHIyX3BoKTsKIAlyZXR1cm4gRkFMU0U7CiB9CiAKIC8qKgogICogbnRmc19pc19sb2dmaWxlX2NsZWFuIC0gY2hlY2sgaW4gdGhlIGpvdXJuYWwgaWYgdGhlIHZvbHVtZSBpcyBjbGVhbgogICogQGxvZ192aToJc3RydWN0IGlub2RlIG9mIGxvYWRlZCBqb3VybmFsICRMb2dGaWxlIHRvIGNoZWNrCisgKiBAcnA6CQljb3B5IG9mIHRoZSBjdXJyZW50IHJlc3RhcnQgcGFnZQogICoKICAqIEFuYWx5emUgdGhlICRMb2dGaWxlIGpvdXJuYWwgYW5kIHJldHVybiBUUlVFIGlmIGl0IGluZGljYXRlcyB0aGUgdm9sdW1lIHdhcwogICogc2h1dGRvd24gY2xlYW5seSBhbmQgRkFMU0UgaWYgbm90LgpAQCAtNjE5LDExICs2NTUsOSBAQAogICogaXMgZW1wdHkgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IE5Wb2xMb2dGaWxlRW1wdHkoKSBpcyB0cnVlIG90aGVyd2lzZSBhbgogICogZW1wdHkgdm9sdW1lIHdpbGwgYmUgcmVwb3J0ZWQgYXMgZGlydHkuCiAgKi8KLUJPT0wgbnRmc19pc19sb2dmaWxlX2NsZWFuKHN0cnVjdCBpbm9kZSAqbG9nX3ZpKQorQk9PTCBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4oc3RydWN0IGlub2RlICpsb2dfdmksIGNvbnN0IFJFU1RBUlRfUEFHRV9IRUFERVIgKnJwKQogewogCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGxvZ192aS0+aV9zYik7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JUkVTVEFSVF9QQUdFX0hFQURFUiAqcnA7CiAJUkVTVEFSVF9BUkVBICpyYTsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwpAQCAtNjMyLDI0ICs2NjYsMTUgQEAKIAkJbnRmc19kZWJ1ZygiRG9uZS4gICgkTG9nRmlsZSBpcyBlbXB0eS4pIik7CiAJCXJldHVybiBUUlVFOwogCX0KLQkvKgotCSAqIFJlYWQgdGhlIGZpcnN0IHJlc3RhcnQgcGFnZS4gIEl0IHdpbGwgYmUgcG9zc2libHkgaW5jb21wbGV0ZSBhbmQKLQkgKiB3aWxsIG5vdCBiZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0ZWQgYnV0IHdlIG9ubHkgbmVlZCB0aGUKLQkgKiBmaXJzdCBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMgc28gaXQgZG9lcyBub3QgbWF0dGVyLgotCSAqLwotCXBhZ2UgPSBudGZzX21hcF9wYWdlKGxvZ192aS0+aV9tYXBwaW5nLCAwKTsKLQlpZiAoSVNfRVJSKHBhZ2UpKSB7Ci0JCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkVycm9yIG1hcHBpbmcgJExvZ0ZpbGUgcGFnZSAoaW5kZXggMCkuIik7CisJQlVHX09OKCFycCk7CisJaWYgKCFudGZzX2lzX3JzdHJfcmVjb3JkKHJwLT5tYWdpYykgJiYKKwkJCSFudGZzX2lzX2Noa2RfcmVjb3JkKHJwLT5tYWdpYykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiUmVzdGFydCBwYWdlIGJ1ZmZlciBpcyBpbnZhbGlkLiAgVGhpcyBpcyAiCisJCQkJInByb2JhYmx5IGEgYnVnIGluIHRoYXQgdGhlICRMb2dGaWxlIHNob3VsZCAiCisJCQkJImhhdmUgYmVlbiBjb25zaXN0ZW5jeSBjaGVja2VkIGJlZm9yZSBjYWxsaW5nICIKKwkJCQkidGhpcyBmdW5jdGlvbi4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KLQlycCA9IChSRVNUQVJUX1BBR0VfSEVBREVSKilwYWdlX2FkZHJlc3MocGFnZSk7Ci0JaWYgKCFudGZzX2lzX3JzdHJfcmVjb3JkKHJwLT5tYWdpYykpIHsKLQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm8gcmVzdGFydCBwYWdlIGZvdW5kIGF0IG9mZnNldCB6ZXJvIGluICIKLQkJCQkiJExvZ0ZpbGUuICBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoYXQgIgotCQkJCSJ0aGUgJExvZ0ZpbGUgc2hvdWxkIGhhdmUgYmVlbiBjb25zaXN0ZW5jeSAiCi0JCQkJImNoZWNrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTsKLQkJZ290byBlcnJfb3V0OwotCX0KIAlyYSA9IChSRVNUQVJUX0FSRUEqKSgodTgqKXJwICsgbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpKTsKIAkvKgogCSAqIElmIHRoZSAkTG9nRmlsZSBoYXMgYWN0aXZlIGNsaWVudHMsIGkuZS4gaXQgaXMgb3BlbiwgYW5kIHdlIGRvIG5vdApAQCAtNjU5LDE1ICs2ODQsMTEgQEAKIAlpZiAocmEtPmNsaWVudF9pbl91c2VfbGlzdCAhPSBMT0dGSUxFX05PX0NMSUVOVCAmJgogCQkJIShyYS0+ZmxhZ3MgJiBSRVNUQVJUX1ZPTFVNRV9JU19DTEVBTikpIHsKIAkJbnRmc19kZWJ1ZygiRG9uZS4gICRMb2dGaWxlIGluZGljYXRlcyBhIGRpcnR5IHNodXRkb3duLiIpOwotCQlnb3RvIGVycl9vdXQ7CisJCXJldHVybiBGQUxTRTsKIAl9Ci0JbnRmc191bm1hcF9wYWdlKHBhZ2UpOwogCS8qICRMb2dGaWxlIGluZGljYXRlcyBhIGNsZWFuIHNodXRkb3duLiAqLwogCW50ZnNfZGVidWcoIkRvbmUuICAkTG9nRmlsZSBpbmRpY2F0ZXMgYSBjbGVhbiBzaHV0ZG93bi4iKTsKIAlyZXR1cm4gVFJVRTsKLWVycl9vdXQ6Ci0JbnRmc191bm1hcF9wYWdlKHBhZ2UpOwotCXJldHVybiBGQUxTRTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9udGZzL2xvZ2ZpbGUuaCBiL2ZzL250ZnMvbG9nZmlsZS5oCmluZGV4IDRlZTQzNzguLjQyMzg4ZjkgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbG9nZmlsZS5oCisrKyBiL2ZzL250ZnMvbG9nZmlsZS5oCkBAIC0yLDcgKzIsNyBAQAogICogbG9nZmlsZS5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgam91cm5hbCAoJExvZ0ZpbGUpIGhhbmRsaW5nLiAgUGFydCBvZgogICoJICAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCkBAIC0yOTYsOSArMjk2LDExIEBACiAvKiBzaXplb2YoKSA9IDE2MCAoMHhhMCkgYnl0ZXMgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBMT0dfQ0xJRU5UX1JFQ09SRDsKIAotZXh0ZXJuIEJPT0wgbnRmc19jaGVja19sb2dmaWxlKHN0cnVjdCBpbm9kZSAqbG9nX3ZpKTsKK2V4dGVybiBCT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqKnJwKTsKIAotZXh0ZXJuIEJPT0wgbnRmc19pc19sb2dmaWxlX2NsZWFuKHN0cnVjdCBpbm9kZSAqbG9nX3ZpKTsKK2V4dGVybiBCT09MIG50ZnNfaXNfbG9nZmlsZV9jbGVhbihzdHJ1Y3QgaW5vZGUgKmxvZ192aSwKKwkJY29uc3QgUkVTVEFSVF9QQUdFX0hFQURFUiAqcnApOwogCiBleHRlcm4gQk9PTCBudGZzX2VtcHR5X2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpOwogCmRpZmYgLS1naXQgYS9mcy9udGZzL21hbGxvYy5oIGIvZnMvbnRmcy9tYWxsb2MuaAppbmRleCBmYWM1OTQ0Li45OTk0ZTAxIDEwMDY0NAotLS0gYS9mcy9udGZzL21hbGxvYy5oCisrKyBiL2ZzL250ZnMvbWFsbG9jLmgKQEAgLTI3LDggKzI3LDM1IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCiAvKioKKyAqIF9fbnRmc19tYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgaW4gbXVsdGlwbGVzIG9mIHBhZ2VzCisgKiBAc2l6ZToJbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiBAZ2ZwX21hc2s6CWV4dHJhIGZsYWdzIGZvciB0aGUgYWxsb2NhdG9yCisgKgorICogSW50ZXJuYWwgZnVuY3Rpb24uICBZb3UgcHJvYmFibHkgd2FudCBudGZzX21hbGxvY19ub2ZzKCkuLi4KKyAqCisgKiBBbGxvY2F0ZXMgQHNpemUgYnl0ZXMgb2YgbWVtb3J5LCByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiBQQUdFX1NJWkUgYW5kCisgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBJZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCwgcmV0dXJuIE5VTEwuCisgKiBEZXBlbmRpbmcgb24gQGdmcF9tYXNrIHRoZSBhbGxvY2F0aW9uIG1heSBiZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19udGZzX21hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsCisJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKK3sKKwlpZiAobGlrZWx5KHNpemUgPD0gUEFHRV9TSVpFKSkgeworCQlCVUdfT04oIXNpemUpOworCQkvKiBrbWFsbG9jKCkgaGFzIHBlci1DUFUgY2FjaGVzIHNvIGlzIGZhc3RlciBmb3Igbm93LiAqLworCQlyZXR1cm4ga21hbGxvYyhQQUdFX1NJWkUsIGdmcF9tYXNrKTsKKwkJLyogcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlKGdmcF9tYXNrKTsgKi8KKwl9CisJaWYgKGxpa2VseShzaXplID4+IFBBR0VfU0hJRlQgPCBudW1fcGh5c3BhZ2VzKSkKKwkJcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBnZnBfbWFzaywgUEFHRV9LRVJORUwpOworCXJldHVybiBOVUxMOworfQorCisvKioKICAqIG50ZnNfbWFsbG9jX25vZnMgLSBhbGxvY2F0ZSBtZW1vcnkgaW4gbXVsdGlwbGVzIG9mIHBhZ2VzCi0gKiBAc2l6ZQludW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIEBzaXplOgludW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKICAqCiAgKiBBbGxvY2F0ZXMgQHNpemUgYnl0ZXMgb2YgbWVtb3J5LCByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiBQQUdFX1NJWkUgYW5kCiAgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KQEAgLTM3LDE1ICs2NCwyNCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKm50ZnNfbWFsbG9jX25vZnModW5zaWduZWQgbG9uZyBzaXplKQogewotCWlmIChsaWtlbHkoc2l6ZSA8PSBQQUdFX1NJWkUpKSB7Ci0JCUJVR19PTighc2l6ZSk7Ci0JCS8qIGttYWxsb2MoKSBoYXMgcGVyLUNQVSBjYWNoZXMgc28gaXMgZmFzdGVyIGZvciBub3cuICovCi0JCXJldHVybiBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX05PRlMpOwotCQkvKiByZXR1cm4gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX05PRlMgfCBfX0dGUF9ISUdITUVNKTsgKi8KLQl9Ci0JaWYgKGxpa2VseShzaXplID4+IFBBR0VfU0hJRlQgPCBudW1fcGh5c3BhZ2VzKSkKLQkJcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gX19udGZzX21hbGxvYyhzaXplLCBHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0pOworfQorCisvKioKKyAqIG50ZnNfbWFsbG9jX25vZnNfbm9mYWlsIC0gYWxsb2NhdGUgbWVtb3J5IGluIG11bHRpcGxlcyBvZiBwYWdlcworICogQHNpemU6CW51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICoKKyAqIEFsbG9jYXRlcyBAc2l6ZSBieXRlcyBvZiBtZW1vcnksIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGVzIG9mIFBBR0VfU0laRSBhbmQKKyAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBhbGxvY2F0aW9uIHdpbGwgc3VjY2VlZC4gIEl0IHdpbGwgc2xlZXAKKyAqIGZvciBhcyBsb25nIGFzIGl0IHRha2VzIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uLgorICoKKyAqIElmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LCByZXR1cm4gTlVMTC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpudGZzX21hbGxvY19ub2ZzX25vZmFpbCh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIF9fbnRmc19tYWxsb2Moc2l6ZSwgR0ZQX05PRlMgfCBfX0dGUF9ISUdITUVNIHwgX19HRlBfTk9GQUlMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG50ZnNfZnJlZSh2b2lkICphZGRyKQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tZnQuYyBiL2ZzL250ZnMvbWZ0LmMKaW5kZXggMzE3ZjdjNi4uMmMzMmI4NCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9tZnQuYworKysgYi9mcy9udGZzL21mdC5jCkBAIC01MTEsNyArNTExLDYgQEAKIAkJfSB3aGlsZSAoYmgpOwogCQl0YWlsLT5iX3RoaXNfcGFnZSA9IGhlYWQ7CiAJCWF0dGFjaF9wYWdlX2J1ZmZlcnMocGFnZSwgaGVhZCk7Ci0JCUJVR19PTighcGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CiAJfQogCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAlCVUdfT04oIWJoKTsKQEAgLTY5Miw3ICs2OTEsNiBAQAogCSAqLwogCWlmICghTklub1Rlc3RDbGVhckRpcnR5KG5pKSkKIAkJZ290byBkb25lOwotCUJVR19PTighcGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCUJVR19PTighYmgpOwogCXJsID0gTlVMTDsKQEAgLTE5NTUsNyArMTk1Myw3IEBACiAJYSA9IGN0eC0+YXR0cjsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3ZjbiA9IGNwdV90b19zbGU2NChvbGRfbGFzdF92Y24gLSAxKTsKIHVuZG9fYWxsb2M6Ci0JaWYgKG50ZnNfY2x1c3Rlcl9mcmVlKHZvbC0+bWZ0X2lubywgb2xkX2xhc3RfdmNuLCAtMSkgPCAwKSB7CisJaWYgKG50ZnNfY2x1c3Rlcl9mcmVlKHZvbC0+bWZ0X2lubywgb2xkX2xhc3RfdmNuLCAtMSwgVFJVRSkgPCAwKSB7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmcmVlIGNsdXN0ZXJzIGZyb20gbWZ0IGRhdGEgIgogCQkJCSJhdHRyaWJ1dGUuJXMiLCBlcyk7CiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvcnVubGlzdC5jIGIvZnMvbnRmcy9ydW5saXN0LmMKaW5kZXggNzU4ODU1Yi4uZjViMmFjOSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9ydW5saXN0LmMKKysrIGIvZnMvbnRmcy9ydW5saXN0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAkJaW50IHNpemUpCiB7CiAJaWYgKGxpa2VseSgoZHN0ICE9IHNyYykgJiYgKHNpemUgPiAwKSkpCi0JCW1lbW1vdmUoYmFzZSArIGRzdCwgYmFzZSArIHNyYywgc2l6ZSAqIHNpemVvZiAoKmJhc2UpKTsKKwkJbWVtbW92ZShiYXNlICsgZHN0LCBiYXNlICsgc3JjLCBzaXplICogc2l6ZW9mKCpiYXNlKSk7CiB9CiAKIC8qKgpAQCAtOTUsNiArOTUsNTEgQEAKIH0KIAogLyoqCisgKiBudGZzX3JsX3JlYWxsb2Nfbm9mYWlsIC0gUmVhbGxvY2F0ZSBtZW1vcnkgZm9yIHJ1bmxpc3RzCisgKiBAcmw6CQlvcmlnaW5hbCBydW5saXN0CisgKiBAb2xkX3NpemU6CW51bWJlciBvZiBydW5saXN0IGVsZW1lbnRzIGluIHRoZSBvcmlnaW5hbCBydW5saXN0IEBybAorICogQG5ld19zaXplOgludW1iZXIgb2YgcnVubGlzdCBlbGVtZW50cyB3ZSBuZWVkIHNwYWNlIGZvcgorICoKKyAqIEFzIHRoZSBydW5saXN0cyBncm93LCBtb3JlIG1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkLiAgVG8gcHJldmVudCB0aGUKKyAqIGtlcm5lbCBoYXZpbmcgdG8gYWxsb2NhdGUgYW5kIHJlYWxsb2NhdGUgbGFyZ2UgbnVtYmVycyBvZiBzbWFsbCBiaXRzIG9mCisgKiBtZW1vcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlbnRpcmUgcGFnZSBvZiBtZW1vcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIGFsbG9jYXRpb24gd2lsbCBzdWNjZWVkLiAgSXQgd2lsbCBzbGVlcAorICogZm9yIGFzIGxvbmcgYXMgaXQgdGFrZXMgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24uCisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0IEBybC4KKyAqCisgKiBOLkIuICBJZiB0aGUgbmV3IGFsbG9jYXRpb24gZG9lc24ndCByZXF1aXJlIGEgZGlmZmVyZW50IG51bWJlciBvZiBwYWdlcyBpbgorICogICAgICAgbWVtb3J5LCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHBvaW50ZXIuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkLCBvciByZWN5Y2xlZCwgbWVtb3J5LgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnVubGlzdCBhcnJheS4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgcnVubGlzdF9lbGVtZW50ICpudGZzX3JsX3JlYWxsb2Nfbm9mYWlsKHJ1bmxpc3RfZWxlbWVudCAqcmwsCisJCWludCBvbGRfc2l6ZSwgaW50IG5ld19zaXplKQoreworCXJ1bmxpc3RfZWxlbWVudCAqbmV3X3JsOworCisJb2xkX3NpemUgPSBQQUdFX0FMSUdOKG9sZF9zaXplICogc2l6ZW9mKCpybCkpOworCW5ld19zaXplID0gUEFHRV9BTElHTihuZXdfc2l6ZSAqIHNpemVvZigqcmwpKTsKKwlpZiAob2xkX3NpemUgPT0gbmV3X3NpemUpCisJCXJldHVybiBybDsKKworCW5ld19ybCA9IG50ZnNfbWFsbG9jX25vZnNfbm9mYWlsKG5ld19zaXplKTsKKwlCVUdfT04oIW5ld19ybCk7CisKKwlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCWlmICh1bmxpa2VseShvbGRfc2l6ZSA+IG5ld19zaXplKSkKKwkJCW9sZF9zaXplID0gbmV3X3NpemU7CisJCW1lbWNweShuZXdfcmwsIHJsLCBvbGRfc2l6ZSk7CisJCW50ZnNfZnJlZShybCk7CisJfQorCXJldHVybiBuZXdfcmw7Cit9CisKKy8qKgogICogbnRmc19hcmVfcmxfbWVyZ2VhYmxlIC0gdGVzdCBpZiB0d28gcnVubGlzdHMgY2FuIGJlIGpvaW5lZCB0b2dldGhlcgogICogQGRzdDoJb3JpZ2luYWwgcnVubGlzdAogICogQHNyYzoJbmV3IHJ1bmxpc3QgdG8gdGVzdCBmb3IgbWVyZ2VhYmlsaXR5IHdpdGggQGRzdApAQCAtNDk3LDYgKzU0Miw3IEBACiAJCQkvKiBTY2FuIHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBydW5saXN0LiAqLwogCQkJZm9yIChkZW5kID0gMDsgbGlrZWx5KGRybFtkZW5kXS5sZW5ndGgpOyBkZW5kKyspCiAJCQkJOworCQkJZGVuZCsrOwogCQkJZHJsID0gbnRmc19ybF9yZWFsbG9jKGRybCwgZGVuZCwgZGVuZCArIDEpOwogCQkJaWYgKElTX0VSUihkcmwpKQogCQkJCXJldHVybiBkcmw7CkBAIC01NjYsOCArNjEyLDggQEAKIAkJICgoZHJsW2RpbnNdLnZjbiArIGRybFtkaW5zXS5sZW5ndGgpIDw9ICAgICAgLyogRW5kIG9mIGhvbGUgICAqLwogCQkgIChzcmxbc2VuZCAtIDFdLnZjbiArIHNybFtzZW5kIC0gMV0ubGVuZ3RoKSkpOwogCi0JLyogT3Igd2UnbGwgbG9zZSBhbiBlbmQgbWFya2VyICovCi0JaWYgKHN0YXJ0ICYmIGZpbmlzaCAmJiAoZHJsW2RpbnNdLmxlbmd0aCA9PSAwKSkKKwkvKiBPciB3ZSB3aWxsIGxvc2UgYW4gZW5kIG1hcmtlci4gKi8KKwlpZiAoZmluaXNoICYmICFkcmxbZGluc10ubGVuZ3RoKQogCQlzcysrOwogCWlmIChtYXJrZXIgJiYgKGRybFtkaW5zXS52Y24gKyBkcmxbZGluc10ubGVuZ3RoID4gc3JsW3NlbmQgLSAxXS52Y24pKQogCQlmaW5pc2ggPSBGQUxTRTsKQEAgLTYyMSwxMSArNjY3LDggQEAKIAkJCWlmIChkcmxbZHNdLmxjbiAhPSBMQ05fUkxfTk9UX01BUFBFRCkgewogCQkJCS8qIEFkZCBhbiB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQuICovCiAJCQkJaWYgKCFzbG90cykgewotCQkJCQkvKiBGSVhNRS9UT0RPOiBXZSBuZWVkIHRvIGhhdmUgdGhlCi0JCQkJCSAqIGV4dHJhIG1lbW9yeSBhbHJlYWR5ISAoQUlBKSAqLwotCQkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2MoZHJsLCBkcywgZHMgKyAyKTsKLQkJCQkJaWYgKCFkcmwpCi0JCQkJCQlnb3RvIGNyaXRpY2FsX2Vycm9yOworCQkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2Nfbm9mYWlsKGRybCwgZHMsCisJCQkJCQkJZHMgKyAyKTsKIAkJCQkJc2xvdHMgPSAyOwogCQkJCX0KIAkJCQlkcysrOwpAQCAtNjQwLDEzICs2ODMsOCBAQAogCQkJZHJsW2RzXS5sZW5ndGggPSBtYXJrZXJfdmNuIC0gZHJsW2RzXS52Y247CiAJCQkvKiBGaW5hbGx5IGFkZCB0aGUgRU5PRU5UIHRlcm1pbmF0b3IuICovCiAJCQlkcysrOwotCQkJaWYgKCFzbG90cykgewotCQkJCS8qIEZJWE1FL1RPRE86IFdlIG5lZWQgdG8gaGF2ZSB0aGUgZXh0cmEKLQkJCQkgKiBtZW1vcnkgYWxyZWFkeSEgKEFJQSkgKi8KLQkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2MoZHJsLCBkcywgZHMgKyAxKTsKLQkJCQlpZiAoIWRybCkKLQkJCQkJZ290byBjcml0aWNhbF9lcnJvcjsKLQkJCX0KKwkJCWlmICghc2xvdHMpCisJCQkJZHJsID0gbnRmc19ybF9yZWFsbG9jX25vZmFpbChkcmwsIGRzLCBkcyArIDEpOwogCQkJZHJsW2RzXS52Y24gPSBtYXJrZXJfdmNuOwogCQkJZHJsW2RzXS5sY24gPSBMQ05fRU5PRU5UOwogCQkJZHJsW2RzXS5sZW5ndGggPSAoczY0KTA7CkBAIC02NTksMTEgKzY5Nyw2IEBACiAJbnRmc19kZWJ1ZygiTWVyZ2VkIHJ1bmxpc3Q6Iik7CiAJbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QoZHJsKTsKIAlyZXR1cm4gZHJsOwotCi1jcml0aWNhbF9lcnJvcjoKLQkvKiBDcml0aWNhbCBlcnJvciEgV2UgY2Fubm90IGFmZm9yZCB0byBmYWlsIGhlcmUuICovCi0JbnRmc19lcnJvcihOVUxMLCAiQ3JpdGljYWwgZXJyb3IhIE5vdCBlbm91Z2ggbWVtb3J5LiIpOwotCXBhbmljKCJOVEZTOiBDYW5ub3QgY29udGludWUuIik7CiB9CiAKIC8qKgpAQCAtNzI3LDYgKzc2MCw5IEBACiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CisJLyogSWYgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgaXMgdmFsaWQgYnV0IGVtcHR5LCBub3RoaW5nIHRvIGRvLiAqLworCWlmICghdmNuICYmICEqYnVmKQorCQlyZXR1cm4gb2xkX3JsOwogCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gcnVubGlzdCBhcnJheS4gKi8KIAlybHBvcyA9IDA7CiAJLyogQWxsb2NhdGUgZmlyc3QgcGFnZSBhbmQgc2V0IGN1cnJlbnQgcnVubGlzdCBzaXplIHRvIG9uZSBwYWdlLiAqLwpAQCAtMTQxOSw2ICsxNDU1LDcgQEAKIAogLyoqCiAgKiBudGZzX3JsX3RydW5jYXRlX25vbG9jayAtIHRydW5jYXRlIGEgcnVubGlzdCBzdGFydGluZyBhdCBhIHNwZWNpZmllZCB2Y24KKyAqIEB2b2w6CW50ZnMgdm9sdW1lIChuZWVkZWQgZm9yIGVycm9yIG91dHB1dCkKICAqIEBydW5saXN0OglydW5saXN0IHRvIHRydW5jYXRlCiAgKiBAbmV3X2xlbmd0aDoJdGhlIG5ldyBsZW5ndGggb2YgdGhlIHJ1bmxpc3QgaW4gVkNOcwogICoKQEAgLTE0MjYsMTIgKzE0NjMsMTYgQEAKICAqIGhvbGRpbmcgdGhlIHJ1bmxpc3QgZWxlbWVudHMgdG8gYSBsZW5ndGggb2YgQG5ld19sZW5ndGggVkNOcy4KICAqCiAgKiBJZiBAbmV3X2xlbmd0aCBsaWVzIHdpdGhpbiB0aGUgcnVubGlzdCwgdGhlIHJ1bmxpc3QgZWxlbWVudHMgd2l0aCBWQ05zIG9mCi0gKiBAbmV3X2xlbmd0aCBhbmQgYWJvdmUgYXJlIGRpc2NhcmRlZC4KKyAqIEBuZXdfbGVuZ3RoIGFuZCBhYm92ZSBhcmUgZGlzY2FyZGVkLiAgQXMgYSBzcGVjaWFsIGNhc2UgaWYgQG5ld19sZW5ndGggaXMKKyAqIHplcm8sIHRoZSBydW5saXN0IGlzIGRpc2NhcmRlZCBhbmQgc2V0IHRvIE5VTEwuCiAgKgogICogSWYgQG5ld19sZW5ndGggbGllcyBiZXlvbmQgdGhlIHJ1bmxpc3QsIGEgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudCBpcyBhZGRlZCB0bwogICogdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBAcnVubGlzdCBvciBpZiB0aGUgbGFzdCBydW5saXN0IGVsZW1lbnQgaXMgYSBzcGFyc2UKICAqIG9uZSBhbHJlYWR5LCB0aGlzIGlzIGV4dGVuZGVkLgogICoKKyAqIE5vdGUsIG5vIGNoZWNraW5nIGlzIGRvbmUgZm9yIHVubWFwcGVkIHJ1bmxpc3QgZWxlbWVudHMuICBJdCBpcyBhc3N1bWVkIHRoYXQKKyAqIHRoZSBjYWxsZXIgaGFzIG1hcHBlZCBhbnkgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGJlIG1hcHBlZCBhbHJlYWR5LgorICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KICAqCiAgKiBMb2NraW5nOiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAcnVubGlzdC0+bG9jayBmb3Igd3JpdGluZy4KQEAgLTE0NDYsNiArMTQ4NywxMyBAQAogCUJVR19PTighcnVubGlzdCk7CiAJQlVHX09OKG5ld19sZW5ndGggPCAwKTsKIAlybCA9IHJ1bmxpc3QtPnJsOworCWlmICghbmV3X2xlbmd0aCkgeworCQludGZzX2RlYnVnKCJGcmVlaW5nIHJ1bmxpc3QuIik7CisJCXJ1bmxpc3QtPnJsID0gTlVMTDsKKwkJaWYgKHJsKQorCQkJbnRmc19mcmVlKHJsKTsKKwkJcmV0dXJuIDA7CisJfQogCWlmICh1bmxpa2VseSghcmwpKSB7CiAJCS8qCiAJCSAqIENyZWF0ZSBhIHJ1bmxpc3QgY29uc2lzdGluZyBvZiBhIHNwYXJzZSBydW5saXN0IGVsZW1lbnQgb2YKQEAgLTE1NTMsNCArMTYwMSwyODggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBudGZzX3JsX3B1bmNoX25vbG9jayAtIHB1bmNoIGEgaG9sZSBpbnRvIGEgcnVubGlzdAorICogQHZvbDoJbnRmcyB2b2x1bWUgKG5lZWRlZCBmb3IgZXJyb3Igb3V0cHV0KQorICogQHJ1bmxpc3Q6CXJ1bmxpc3QgdG8gcHVuY2ggYSBob2xlIGludG8KKyAqIEBzdGFydDoJc3RhcnRpbmcgVkNOIG9mIHRoZSBob2xlIHRvIGJlIGNyZWF0ZWQKKyAqIEBsZW5ndGg6CXNpemUgb2YgdGhlIGhvbGUgdG8gYmUgY3JlYXRlZCBpbiB1bml0cyBvZiBjbHVzdGVycworICoKKyAqIFB1bmNoIGEgaG9sZSBpbnRvIHRoZSBydW5saXN0IEBydW5saXN0IHN0YXJ0aW5nIGF0IFZDTiBAc3RhcnQgYW5kIG9mIHNpemUKKyAqIEBsZW5ndGggY2x1c3RlcnMuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLCBpbiB3aGljaCBjYXNlIEBydW5saXN0IGhhcyBub3QgYmVlbgorICogbW9kaWZpZWQuCisgKgorICogSWYgQHN0YXJ0IGFuZC9vciBAc3RhcnQgKyBAbGVuZ3RoIGFyZSBvdXRzaWRlIHRoZSBydW5saXN0IHJldHVybiBlcnJvciBjb2RlCisgKiAtRU5PRU5ULgorICoKKyAqIElmIHRoZSBydW5saXN0IGNvbnRhaW5zIHVubWFwcGVkIG9yIGVycm9yIGVsZW1lbnRzIGJldHdlZW4gQHN0YXJ0IGFuZCBAc3RhcnQKKyAqICsgQGxlbmd0aCByZXR1cm4gZXJyb3IgY29kZSAtRUlOVkFMLgorICoKKyAqIExvY2tpbmc6IFRoZSBjYWxsZXIgbXVzdCBob2xkIEBydW5saXN0LT5sb2NrIGZvciB3cml0aW5nLgorICovCitpbnQgbnRmc19ybF9wdW5jaF9ub2xvY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwgcnVubGlzdCAqY29uc3QgcnVubGlzdCwKKwkJY29uc3QgVkNOIHN0YXJ0LCBjb25zdCBzNjQgbGVuZ3RoKQoreworCWNvbnN0IFZDTiBlbmQgPSBzdGFydCArIGxlbmd0aDsKKwlzNjQgZGVsdGE7CisJcnVubGlzdF9lbGVtZW50ICpybCwgKnJsX2VuZCwgKnJsX3JlYWxfZW5kLCAqdHJsOworCWludCBvbGRfc2l6ZTsKKwlCT09MIGxjbl9maXh1cCA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIHN0YXJ0IDB4JWxseCwgbGVuZ3RoIDB4JWxseC4iLAorCQkJKGxvbmcgbG9uZylzdGFydCwgKGxvbmcgbG9uZylsZW5ndGgpOworCUJVR19PTighcnVubGlzdCk7CisJQlVHX09OKHN0YXJ0IDwgMCk7CisJQlVHX09OKGxlbmd0aCA8IDApOworCUJVR19PTihlbmQgPCAwKTsKKwlybCA9IHJ1bmxpc3QtPnJsOworCWlmICh1bmxpa2VseSghcmwpKSB7CisJCWlmIChsaWtlbHkoIXN0YXJ0ICYmICFsZW5ndGgpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwkvKiBGaW5kIEBzdGFydCBpbiB0aGUgcnVubGlzdC4gKi8KKwl3aGlsZSAobGlrZWx5KHJsLT5sZW5ndGggJiYgc3RhcnQgPj0gcmxbMV0udmNuKSkKKwkJcmwrKzsKKwlybF9lbmQgPSBybDsKKwkvKiBGaW5kIEBlbmQgaW4gdGhlIHJ1bmxpc3QuICovCisJd2hpbGUgKGxpa2VseShybF9lbmQtPmxlbmd0aCAmJiBlbmQgPj0gcmxfZW5kWzFdLnZjbikpIHsKKwkJLyogVmVyaWZ5IHRoZXJlIGFyZSBubyB1bm1hcHBlZCBvciBlcnJvciBlbGVtZW50cy4gKi8KKwkJaWYgKHVubGlrZWx5KHJsX2VuZC0+bGNuIDwgTENOX0hPTEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJsX2VuZCsrOworCX0KKwkvKiBDaGVjayB0aGUgbGFzdCBlbGVtZW50LiAqLworCWlmICh1bmxpa2VseShybF9lbmQtPmxlbmd0aCAmJiBybF9lbmQtPmxjbiA8IExDTl9IT0xFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogVGhpcyBjb3ZlcnMgQHN0YXJ0IGJlaW5nIG91dCBvZiBib3VuZHMsIHRvby4gKi8KKwlpZiAoIXJsX2VuZC0+bGVuZ3RoICYmIGVuZCA+IHJsX2VuZC0+dmNuKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAoIWxlbmd0aCkKKwkJcmV0dXJuIDA7CisJaWYgKCFybC0+bGVuZ3RoKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlybF9yZWFsX2VuZCA9IHJsX2VuZDsKKwkvKiBEZXRlcm1pbmUgdGhlIHJ1bmxpc3Qgc2l6ZS4gKi8KKwl3aGlsZSAobGlrZWx5KHJsX3JlYWxfZW5kLT5sZW5ndGgpKQorCQlybF9yZWFsX2VuZCsrOworCW9sZF9zaXplID0gcmxfcmVhbF9lbmQgLSBydW5saXN0LT5ybCArIDE7CisJLyogSWYgQHN0YXJ0IGlzIGluIGEgaG9sZSBzaW1wbHkgZXh0ZW5kIHRoZSBob2xlLiAqLworCWlmIChybC0+bGNuID09IExDTl9IT0xFKSB7CisJCS8qCisJCSAqIElmIGJvdGggQHN0YXJ0IGFuZCBAZW5kIGFyZSBpbiB0aGUgc2FtZSBzcGFyc2UgcnVuLCB3ZSBhcmUKKwkJICogZG9uZS4KKwkJICovCisJCWlmIChlbmQgPD0gcmxbMV0udmNuKSB7CisJCQludGZzX2RlYnVnKCJEb25lIChyZXF1ZXN0ZWQgaG9sZSBpcyBhbHJlYWR5IHNwYXJzZSkuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorZXh0ZW5kX2hvbGU6CisJCS8qIEV4dGVuZCB0aGUgaG9sZS4gKi8KKwkJcmwtPmxlbmd0aCA9IGVuZCAtIHJsLT52Y247CisJCS8qIElmIEBlbmQgaXMgaW4gYSBob2xlLCBtZXJnZSBpdCB3aXRoIHRoZSBjdXJyZW50IG9uZS4gKi8KKwkJaWYgKHJsX2VuZC0+bGNuID09IExDTl9IT0xFKSB7CisJCQlybF9lbmQrKzsKKwkJCXJsLT5sZW5ndGggPSBybF9lbmQtPnZjbiAtIHJsLT52Y247CisJCX0KKwkJLyogV2UgaGF2ZSBkb25lIHRoZSBob2xlLiAgTm93IGRlYWwgd2l0aCB0aGUgcmVtYWluaW5nIHRhaWwuICovCisJCXJsKys7CisJCS8qIEN1dCBvdXQgYWxsIHJ1bmxpc3QgZWxlbWVudHMgdXAgdG8gQGVuZC4gKi8KKwkJaWYgKHJsIDwgcmxfZW5kKQorCQkJbWVtbW92ZShybCwgcmxfZW5kLCAocmxfcmVhbF9lbmQgLSBybF9lbmQgKyAxKSAqCisJCQkJCXNpemVvZigqcmwpKTsKKwkJLyogQWRqdXN0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhaWwgaWYgbmVjZXNzYXJ5LiAqLworCQlpZiAoZW5kID4gcmwtPnZjbikgeworCQkJczY0IGRlbHRhID0gZW5kIC0gcmwtPnZjbjsKKwkJCXJsLT52Y24gPSBlbmQ7CisJCQlybC0+bGVuZ3RoIC09IGRlbHRhOworCQkJLyogT25seSBhZGp1c3QgdGhlIGxjbiBpZiBpdCBpcyByZWFsLiAqLworCQkJaWYgKHJsLT5sY24gPj0gMCkKKwkJCQlybC0+bGNuICs9IGRlbHRhOworCQl9CitzaHJpbmtfYWxsb2NhdGlvbjoKKwkJLyogUmVhbGxvY2F0ZSBtZW1vcnkgaWYgdGhlIGFsbG9jYXRpb24gY2hhbmdlZC4gKi8KKwkJaWYgKHJsIDwgcmxfZW5kKSB7CisJCQlybCA9IG50ZnNfcmxfcmVhbGxvYyhydW5saXN0LT5ybCwgb2xkX3NpemUsCisJCQkJCW9sZF9zaXplIC0gKHJsX2VuZCAtIHJsKSk7CisJCQlpZiAoSVNfRVJSKHJsKSkKKwkJCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIkZhaWxlZCB0byBzaHJpbmsgIgorCQkJCQkJInJ1bmxpc3QgYnVmZmVyLiAgVGhpcyBqdXN0ICIKKwkJCQkJCSJ3YXN0ZXMgYSBiaXQgb2YgbWVtb3J5ICIKKwkJCQkJCSJ0ZW1wb3JhcmlseSBzbyB3ZSBpZ25vcmUgaXQgIgorCQkJCQkJImFuZCByZXR1cm4gc3VjY2Vzcy4iKTsKKwkJCWVsc2UKKwkJCQlydW5saXN0LT5ybCA9IHJsOworCQl9CisJCW50ZnNfZGVidWcoIkRvbmUgKGV4dGVuZCBob2xlKS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgQHN0YXJ0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBydW4gdGhpbmdzIGFyZSBlYXNpZXIgYXMgdGhlcmUgaXMKKwkgKiBubyBuZWVkIHRvIHNwbGl0IHRoZSBmaXJzdCBydW4uCisJICovCisJaWYgKHN0YXJ0ID09IHJsLT52Y24pIHsKKwkJLyoKKwkJICogQHN0YXJ0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBydW4uCisJCSAqCisJCSAqIElmIHRoZSBwcmV2aW91cyBydW4gaXMgc3BhcnNlLCBleHRlbmQgaXRzIGhvbGUuCisJCSAqCisJCSAqIElmIEBlbmQgaXMgbm90IGluIHRoZSBzYW1lIHJ1biwgc3dpdGNoIHRoZSBydW4gdG8gYmUgc3BhcnNlCisJCSAqIGFuZCBleHRlbmQgdGhlIG5ld2x5IGNyZWF0ZWQgaG9sZS4KKwkJICoKKwkJICogVGh1cyBib3RoIG9mIHRoZXNlIGNhc2VzIHJlZHVjZSB0aGUgcHJvYmxlbSB0byB0aGUgYWJvdmUKKwkJICogY2FzZSBvZiAiQHN0YXJ0IGlzIGluIGEgaG9sZSIuCisJCSAqLworCQlpZiAocmwgPiBydW5saXN0LT5ybCAmJiAocmwgLSAxKS0+bGNuID09IExDTl9IT0xFKSB7CisJCQlybC0tOworCQkJZ290byBleHRlbmRfaG9sZTsKKwkJfQorCQlpZiAoZW5kID49IHJsWzFdLnZjbikgeworCQkJcmwtPmxjbiA9IExDTl9IT0xFOworCQkJZ290byBleHRlbmRfaG9sZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgZmluYWwgY2FzZSBpcyB3aGVuIEBlbmQgaXMgaW4gdGhlIHNhbWUgcnVuIGFzIEBzdGFydC4KKwkJICogRm9yIHRoaXMgbmVlZCB0byBzcGxpdCB0aGUgcnVuIGludG8gdHdvLiAgT25lIHJ1biBmb3IgdGhlCisJCSAqIHNwYXJzZSByZWdpb24gYmV0d2VlbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbGQgcnVuLCBpLmUuCisJCSAqIEBzdGFydCwgYW5kIEBlbmQgYW5kIG9uZSBmb3IgdGhlIHJlbWFpbmluZyBub24tc3BhcnNlCisJCSAqIHJlZ2lvbiwgaS5lLiBiZXR3ZWVuIEBlbmQgYW5kIHRoZSBlbmQgb2YgdGhlIG9sZCBydW4uCisJCSAqLworCQl0cmwgPSBudGZzX3JsX3JlYWxsb2MocnVubGlzdC0+cmwsIG9sZF9zaXplLCBvbGRfc2l6ZSArIDEpOworCQlpZiAoSVNfRVJSKHRybCkpCisJCQlnb3RvIGVub21lbV9vdXQ7CisJCW9sZF9zaXplKys7CisJCWlmIChydW5saXN0LT5ybCAhPSB0cmwpIHsKKwkJCXJsID0gdHJsICsgKHJsIC0gcnVubGlzdC0+cmwpOworCQkJcmxfZW5kID0gdHJsICsgKHJsX2VuZCAtIHJ1bmxpc3QtPnJsKTsKKwkJCXJsX3JlYWxfZW5kID0gdHJsICsgKHJsX3JlYWxfZW5kIC0gcnVubGlzdC0+cmwpOworCQkJcnVubGlzdC0+cmwgPSB0cmw7CisJCX0KK3NwbGl0X2VuZDoKKwkJLyogU2hpZnQgYWxsIHRoZSBydW5zIHVwIGJ5IG9uZS4gKi8KKwkJbWVtbW92ZShybCArIDEsIHJsLCAocmxfcmVhbF9lbmQgLSBybCArIDEpICogc2l6ZW9mKCpybCkpOworCQkvKiBGaW5hbGx5LCBzZXR1cCB0aGUgdHdvIHNwbGl0IHJ1bnMuICovCisJCXJsLT5sY24gPSBMQ05fSE9MRTsKKwkJcmwtPmxlbmd0aCA9IGxlbmd0aDsKKwkJcmwrKzsKKwkJcmwtPnZjbiArPSBsZW5ndGg7CisJCS8qIE9ubHkgYWRqdXN0IHRoZSBsY24gaWYgaXQgaXMgcmVhbC4gKi8KKwkJaWYgKHJsLT5sY24gPj0gMCB8fCBsY25fZml4dXApCisJCQlybC0+bGNuICs9IGxlbmd0aDsKKwkJcmwtPmxlbmd0aCAtPSBsZW5ndGg7CisJCW50ZnNfZGVidWcoIkRvbmUgKHNwbGl0IG9uZSkuIik7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEBzdGFydCBpcyBuZWl0aGVyIGluIGEgaG9sZSBub3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJ1bi4KKwkgKgorCSAqIElmIEBlbmQgaXMgaW4gYSBob2xlLCB0aGluZ3MgYXJlIGVhc2llciBhcyBzaW1wbHkgdHJ1bmNhdGluZyB0aGUgcnVuCisJICogQHN0YXJ0IGlzIGluIHRvIGVuZCBhdCBAc3RhcnQgLSAxLCBkZWxldGluZyBhbGwgcnVucyBhZnRlciB0aGF0IHVwCisJICogdG8gQGVuZCwgYW5kIGZpbmFsbHkgZXh0ZW5kaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biBAZW5kIGlzIGluCisJICogdG8gYmUgQHN0YXJ0IGlzIGFsbCB0aGF0IGlzIG5lZWRlZC4KKwkgKi8KKwlpZiAocmxfZW5kLT5sY24gPT0gTENOX0hPTEUpIHsKKwkJLyogVHJ1bmNhdGUgdGhlIHJ1biBjb250YWluaW5nIEBzdGFydC4gKi8KKwkJcmwtPmxlbmd0aCA9IHN0YXJ0IC0gcmwtPnZjbjsKKwkJcmwrKzsKKwkJLyogQ3V0IG91dCBhbGwgcnVubGlzdCBlbGVtZW50cyB1cCB0byBAZW5kLiAqLworCQlpZiAocmwgPCBybF9lbmQpCisJCQltZW1tb3ZlKHJsLCBybF9lbmQsIChybF9yZWFsX2VuZCAtIHJsX2VuZCArIDEpICoKKwkJCQkJc2l6ZW9mKCpybCkpOworCQkvKiBFeHRlbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVuIEBlbmQgaXMgaW4gdG8gYmUgQHN0YXJ0LiAqLworCQlybC0+dmNuID0gc3RhcnQ7CisJCXJsLT5sZW5ndGggPSBybFsxXS52Y24gLSBzdGFydDsKKwkJZ290byBzaHJpbmtfYWxsb2NhdGlvbjsKKwl9CisJLyogCisJICogSWYgQGVuZCBpcyBub3QgaW4gYSBob2xlIHRoZXJlIGFyZSBzdGlsbCB0d28gY2FzZXMgdG8gZGlzdGluZ3Vpc2guCisJICogRWl0aGVyIEBlbmQgaXMgb3IgaXMgbm90IGluIHRoZSBzYW1lIHJ1biBhcyBAc3RhcnQuCisJICoKKwkgKiBUaGUgc2Vjb25kIGNhc2UgaXMgZWFzaWVyIGFzIGl0IGNhbiBiZSByZWR1Y2VkIHRvIGFuIGFscmVhZHkgc29sdmVkCisJICogcHJvYmxlbSBieSB0cnVuY2F0aW5nIHRoZSBydW4gQHN0YXJ0IGlzIGluIHRvIGVuZCBhdCBAc3RhcnQgLSAxLgorCSAqIFRoZW4sIGlmIEBlbmQgaXMgaW4gdGhlIG5leHQgcnVuIG5lZWQgdG8gc3BsaXQgdGhlIHJ1biBpbnRvIGEgc3BhcnNlCisJICogcnVuIGZvbGxvd2VkIGJ5IGEgbm9uLXNwYXJzZSBydW4gKGFscmVhZHkgY292ZXJlZCBhYm92ZSkgYW5kIGlmIEBlbmQKKwkgKiBpcyBub3QgaW4gdGhlIG5leHQgcnVuIHN3aXRjaGluZyBpdCB0byBiZSBzcGFyc2UsIGFnYWluIHJlZHVjZXMgdGhlCisJICogcHJvYmxlbSB0byB0aGUgYWxyZWFkeSBjb3ZlcmVkIGNhc2Ugb2YgIkBzdGFydCBpcyBpbiBhIGhvbGUiLgorCSAqLworCWlmIChlbmQgPj0gcmxbMV0udmNuKSB7CisJCS8qCisJCSAqIElmIEBlbmQgaXMgbm90IGluIHRoZSBuZXh0IHJ1biwgcmVkdWNlIHRoZSBwcm9ibGVtIHRvIHRoZQorCQkgKiBjYXNlIG9mICJAc3RhcnQgaXMgaW4gYSBob2xlIi4KKwkJICovCisJCWlmIChybFsxXS5sZW5ndGggJiYgZW5kID49IHJsWzJdLnZjbikgeworCQkJLyogVHJ1bmNhdGUgdGhlIHJ1biBjb250YWluaW5nIEBzdGFydC4gKi8KKwkJCXJsLT5sZW5ndGggPSBzdGFydCAtIHJsLT52Y247CisJCQlybCsrOworCQkJcmwtPnZjbiA9IHN0YXJ0OworCQkJcmwtPmxjbiA9IExDTl9IT0xFOworCQkJZ290byBleHRlbmRfaG9sZTsKKwkJfQorCQl0cmwgPSBudGZzX3JsX3JlYWxsb2MocnVubGlzdC0+cmwsIG9sZF9zaXplLCBvbGRfc2l6ZSArIDEpOworCQlpZiAoSVNfRVJSKHRybCkpCisJCQlnb3RvIGVub21lbV9vdXQ7CisJCW9sZF9zaXplKys7CisJCWlmIChydW5saXN0LT5ybCAhPSB0cmwpIHsKKwkJCXJsID0gdHJsICsgKHJsIC0gcnVubGlzdC0+cmwpOworCQkJcmxfZW5kID0gdHJsICsgKHJsX2VuZCAtIHJ1bmxpc3QtPnJsKTsKKwkJCXJsX3JlYWxfZW5kID0gdHJsICsgKHJsX3JlYWxfZW5kIC0gcnVubGlzdC0+cmwpOworCQkJcnVubGlzdC0+cmwgPSB0cmw7CisJCX0KKwkJLyogVHJ1bmNhdGUgdGhlIHJ1biBjb250YWluaW5nIEBzdGFydC4gKi8KKwkJcmwtPmxlbmd0aCA9IHN0YXJ0IC0gcmwtPnZjbjsKKwkJcmwrKzsKKwkJLyoKKwkJICogQGVuZCBpcyBpbiB0aGUgbmV4dCBydW4sIHJlZHVjZSB0aGUgcHJvYmxlbSB0byB0aGUgY2FzZQorCQkgKiB3aGVyZSAiQHN0YXJ0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBydW4gYW5kIEBlbmQgaXMgaW4KKwkJICogdGhlIHNhbWUgcnVuIGFzIEBzdGFydCIuCisJCSAqLworCQlkZWx0YSA9IHJsLT52Y24gLSBzdGFydDsKKwkJcmwtPnZjbiA9IHN0YXJ0OworCQlpZiAocmwtPmxjbiA+PSAwKSB7CisJCQlybC0+bGNuIC09IGRlbHRhOworCQkJLyogTmVlZCB0aGlzIGluIGNhc2UgdGhlIGxjbiBqdXN0IGJlY2FtZSBuZWdhdGl2ZS4gKi8KKwkJCWxjbl9maXh1cCA9IFRSVUU7CisJCX0KKwkJcmwtPmxlbmd0aCArPSBkZWx0YTsKKwkJZ290byBzcGxpdF9lbmQ7CisJfQorCS8qCisJICogVGhlIGZpcnN0IGNhc2UgZnJvbSBhYm92ZSwgaS5lLiBAZW5kIGlzIGluIHRoZSBzYW1lIHJ1biBhcyBAc3RhcnQuCisJICogV2UgbmVlZCB0byBzcGxpdCB0aGUgcnVuIGludG8gdGhyZWUuICBPbmUgcnVuIGZvciB0aGUgbm9uLXNwYXJzZQorCSAqIHJlZ2lvbiBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9sZCBydW4gYW5kIEBzdGFydCwgb25lIGZvciB0aGUKKwkgKiBzcGFyc2UgcmVnaW9uIGJldHdlZW4gQHN0YXJ0IGFuZCBAZW5kLCBhbmQgb25lIGZvciB0aGUgcmVtYWluaW5nCisJICogbm9uLXNwYXJzZSByZWdpb24sIGkuZS4gYmV0d2VlbiBAZW5kIGFuZCB0aGUgZW5kIG9mIHRoZSBvbGQgcnVuLgorCSAqLworCXRybCA9IG50ZnNfcmxfcmVhbGxvYyhydW5saXN0LT5ybCwgb2xkX3NpemUsIG9sZF9zaXplICsgMik7CisJaWYgKElTX0VSUih0cmwpKQorCQlnb3RvIGVub21lbV9vdXQ7CisJb2xkX3NpemUgKz0gMjsKKwlpZiAocnVubGlzdC0+cmwgIT0gdHJsKSB7CisJCXJsID0gdHJsICsgKHJsIC0gcnVubGlzdC0+cmwpOworCQlybF9lbmQgPSB0cmwgKyAocmxfZW5kIC0gcnVubGlzdC0+cmwpOworCQlybF9yZWFsX2VuZCA9IHRybCArIChybF9yZWFsX2VuZCAtIHJ1bmxpc3QtPnJsKTsKKwkJcnVubGlzdC0+cmwgPSB0cmw7CisJfQorCS8qIFNoaWZ0IGFsbCB0aGUgcnVucyB1cCBieSB0d28uICovCisJbWVtbW92ZShybCArIDIsIHJsLCAocmxfcmVhbF9lbmQgLSBybCArIDEpICogc2l6ZW9mKCpybCkpOworCS8qIEZpbmFsbHksIHNldHVwIHRoZSB0aHJlZSBzcGxpdCBydW5zLiAqLworCXJsLT5sZW5ndGggPSBzdGFydCAtIHJsLT52Y247CisJcmwrKzsKKwlybC0+dmNuID0gc3RhcnQ7CisJcmwtPmxjbiA9IExDTl9IT0xFOworCXJsLT5sZW5ndGggPSBsZW5ndGg7CisJcmwrKzsKKwlkZWx0YSA9IGVuZCAtIHJsLT52Y247CisJcmwtPnZjbiA9IGVuZDsKKwlybC0+bGNuICs9IGRlbHRhOworCXJsLT5sZW5ndGggLT0gZGVsdGE7CisJbnRmc19kZWJ1ZygiRG9uZSAoc3BsaXQgYm90aCkuIik7CisJcmV0dXJuIDA7Citlbm9tZW1fb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGV4dGVuZCBydW5saXN0IGJ1ZmZlci4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvcnVubGlzdC5oIGIvZnMvbnRmcy9ydW5saXN0LmgKaW5kZXggYWEwZWU2NS4uNDc3MjhmYiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9ydW5saXN0LmgKKysrIGIvZnMvbnRmcy9ydW5saXN0LmgKQEAgLTk0LDYgKzk0LDkgQEAKIGV4dGVybiBpbnQgbnRmc19ybF90cnVuY2F0ZV9ub2xvY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwKIAkJcnVubGlzdCAqY29uc3QgcnVubGlzdCwgY29uc3QgczY0IG5ld19sZW5ndGgpOwogCitpbnQgbnRmc19ybF9wdW5jaF9ub2xvY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwgcnVubGlzdCAqY29uc3QgcnVubGlzdCwKKwkJY29uc3QgVkNOIHN0YXJ0LCBjb25zdCBzNjQgbGVuZ3RoKTsKKwogI2VuZGlmIC8qIE5URlNfUlcgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1JVTkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zdXBlci5jIGIvZnMvbnRmcy9zdXBlci5jCmluZGV4IDQxYWE4ZWIuLmIyYjM5MjkgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvc3VwZXIuYworKysgYi9mcy9udGZzL3N1cGVyLmMKQEAgLTExMzMsNyArMTEzMyw4IEBACiAgKgogICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBlcnJvci4KICAqLwotc3RhdGljIEJPT0wgbG9hZF9hbmRfY2hlY2tfbG9nZmlsZShudGZzX3ZvbHVtZSAqdm9sKQorc3RhdGljIEJPT0wgbG9hZF9hbmRfY2hlY2tfbG9nZmlsZShudGZzX3ZvbHVtZSAqdm9sLAorCQlSRVNUQVJUX1BBR0VfSEVBREVSICoqcnApCiB7CiAJc3RydWN0IGlub2RlICp0bXBfaW5vOwogCkBAIC0xMTQ1LDcgKzExNDYsNyBAQAogCQkvKiBDYWxsZXIgd2lsbCBkaXNwbGF5IGVycm9yIG1lc3NhZ2UuICovCiAJCXJldHVybiBGQUxTRTsKIAl9Ci0JaWYgKCFudGZzX2NoZWNrX2xvZ2ZpbGUodG1wX2lubykpIHsKKwlpZiAoIW50ZnNfY2hlY2tfbG9nZmlsZSh0bXBfaW5vLCBycCkpIHsKIAkJaXB1dCh0bXBfaW5vKTsKIAkJLyogbnRmc19jaGVja19sb2dmaWxlKCkgd2lsbCBoYXZlIGRpc3BsYXllZCBlcnJvciBvdXRwdXQuICovCiAJCXJldHVybiBGQUxTRTsKQEAgLTE2ODksNiArMTY5MCw3IEBACiAJVk9MVU1FX0lORk9STUFUSU9OICp2aTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwogI2lmZGVmIE5URlNfUlcKKwlSRVNUQVJUX1BBR0VfSEVBREVSICpycDsKIAlpbnQgZXJyOwogI2VuZGlmIC8qIE5URlNfUlcgKi8KIApAQCAtMTg0MSw4ICsxODQzLDkgQEAKIAkgKiBHZXQgdGhlIGlub2RlIGZvciB0aGUgbG9nZmlsZSwgY2hlY2sgaXQgYW5kIGRldGVybWluZSBpZiB0aGUgdm9sdW1lCiAJICogd2FzIHNodXRkb3duIGNsZWFubHkuCiAJICovCi0JaWYgKCFsb2FkX2FuZF9jaGVja19sb2dmaWxlKHZvbCkgfHwKLQkJCSFudGZzX2lzX2xvZ2ZpbGVfY2xlYW4odm9sLT5sb2dmaWxlX2lubykpIHsKKwlycCA9IE5VTEw7CisJaWYgKCFsb2FkX2FuZF9jaGVja19sb2dmaWxlKHZvbCwgJnJwKSB8fAorCQkJIW50ZnNfaXNfbG9nZmlsZV9jbGVhbih2b2wtPmxvZ2ZpbGVfaW5vLCBycCkpIHsKIAkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWEgPSAiRmFpbGVkIHRvIGxvYWQgJExvZ0ZpbGUiOwogCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYiA9ICIkTG9nRmlsZSBpcyBub3QgY2xlYW4iOwogCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIE1vdW50IGluIFdpbmRvd3MuIjsKQEAgLTE4NTcsNiArMTg2MCwxMCBAQAogCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgogCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKIAkJCQkJCWVzMSwgZXMyKTsKKwkJCQlpZiAodm9sLT5sb2dmaWxlX2lubykgeworCQkJCQlCVUdfT04oIXJwKTsKKwkJCQkJbnRmc19mcmVlKHJwKTsKKwkJCQl9CiAJCQkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKIAkJCX0KIAkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOwpAQCAtMTg2Nyw2ICsxODc0LDcgQEAKIAkJLyogVGhpcyB3aWxsIHByZXZlbnQgYSByZWFkLXdyaXRlIHJlbW91bnQuICovCiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKIAl9CisJbnRmc19mcmVlKHJwKTsKICNlbmRpZiAvKiBOVEZTX1JXICovCiAJLyogR2V0IHRoZSByb290IGRpcmVjdG9yeSBpbm9kZSBzbyB3ZSBjYW4gZG8gcGF0aCBsb29rdXBzLiAqLwogCXZvbC0+cm9vdF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9udGZzL3VuaXN0ci5jIGIvZnMvbnRmcy91bmlzdHIuYwppbmRleCAxOWM0MmUyLi5hMzg5YTVhIDEwMDY0NAotLS0gYS9mcy9udGZzL3VuaXN0ci5jCisrKyBiL2ZzL250ZnMvdW5pc3RyLmMKQEAgLTM3Miw3ICszNzIsOCBAQAogCXJldHVybiAtRUlOVkFMOwogY29udmVyc2lvbl9lcnI6CiAJbnRmc19lcnJvcih2b2wtPnNiLCAiVW5pY29kZSBuYW1lIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYmUgIgotCQkJImNvbnZlcnRlZCB0byBjaGFyYWN0ZXIgc2V0ICVzLiIsIG5scy0+Y2hhcnNldCk7CisJCQkiY29udmVydGVkIHRvIGNoYXJhY3RlciBzZXQgJXMuICBZb3UgbWlnaHQgd2FudCB0byAiCisJCQkidHJ5IHRvIHVzZSB0aGUgbW91bnQgb3B0aW9uIG5scz11dGY4LiIsIG5scy0+Y2hhcnNldCk7CiAJaWYgKG5zICE9ICpvdXRzKQogCQlrZnJlZShucyk7CiAJaWYgKHdjICE9IC1FTkFNRVRPT0xPTkcpCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggMzJiZjA1ZS4uMmZhYzU4YyAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIApAQCAtODQyLDE0ICs4NDMsMTYgQEAKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMgPSBjdXJyZW50LT5maWxlczsKIAlpbnQgZmQsIGVycm9yOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKICAgCWVycm9yID0gLUVNRklMRTsKIAlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwogCiByZXBlYXQ6Ci0gCWZkID0gZmluZF9uZXh0X3plcm9fYml0KGZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIAotCQkJCWZpbGVzLT5tYXhfZmRzZXQsIAotCQkJCWZpbGVzLT5uZXh0X2ZkKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKyAJZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsCisJCQkJZmR0LT5tYXhfZmRzZXQsCisJCQkJZmR0LT5uZXh0X2ZkKTsKIAogCS8qCiAJICogTi5CLiBGb3IgY2xvbmUgdGFza3Mgc2hhcmluZyBhIGZpbGVzIHN0cnVjdHVyZSwgdGhpcyB0ZXN0CkBAIC04NzIsMTQgKzg3NSwxNCBAQAogCQlnb3RvIHJlcGVhdDsKIAl9CiAKLQlGRF9TRVQoZmQsIGZpbGVzLT5vcGVuX2Zkcyk7Ci0JRkRfQ0xSKGZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7Ci0JZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7CisJRkRfU0VUKGZkLCBmZHQtPm9wZW5fZmRzKTsKKwlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZmR0LT5uZXh0X2ZkID0gZmQgKyAxOwogI2lmIDEKIAkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAoZmlsZXMtPmZkW2ZkXSAhPSBOVUxMKSB7CisJaWYgKGZkdC0+ZmRbZmRdICE9IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ2V0X3VudXNlZF9mZDogc2xvdCAlZCBub3QgTlVMTCFcbiIsIGZkKTsKLQkJZmlsZXMtPmZkW2ZkXSA9IE5VTEw7CisJCWZkdC0+ZmRbZmRdID0gTlVMTDsKIAl9CiAjZW5kaWYKIAllcnJvciA9IGZkOwpAQCAtODkzLDkgKzg5NiwxMCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW51c2VkX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCiB7Ci0JX19GRF9DTFIoZmQsIGZpbGVzLT5vcGVuX2Zkcyk7Ci0JaWYgKGZkIDwgZmlsZXMtPm5leHRfZmQpCi0JCWZpbGVzLT5uZXh0X2ZkID0gZmQ7CisJc3RydWN0IGZkdGFibGUgKmZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCV9fRkRfQ0xSKGZkLCBmZHQtPm9wZW5fZmRzKTsKKwlpZiAoZmQgPCBmZHQtPm5leHRfZmQpCisJCWZkdC0+bmV4dF9mZCA9IGZkOwogfQogCiB2b2lkIGZhc3RjYWxsIHB1dF91bnVzZWRfZmQodW5zaWduZWQgaW50IGZkKQpAQCAtOTI0LDI1ICs5MjgsMjEgQEAKIHZvaWQgZmFzdGNhbGwgZmRfaW5zdGFsbCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlsZSkKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlpZiAodW5saWtlbHkoZmlsZXMtPmZkW2ZkXSAhPSBOVUxMKSkKLQkJQlVHKCk7Ci0JZmlsZXMtPmZkW2ZkXSA9IGZpbGU7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJQlVHX09OKGZkdC0+ZmRbZmRdICE9IE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgZmlsZSk7CiAJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwogfQogCiBFWFBPUlRfU1lNQk9MKGZkX2luc3RhbGwpOwogCi1hc21saW5rYWdlIGxvbmcgc3lzX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK2xvbmcgZG9fc3lzX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQogewotCWNoYXIgKiB0bXA7Ci0JaW50IGZkOworCWNoYXIgKnRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOworCWludCBmZCA9IFBUUl9FUlIodG1wKTsKIAotCWlmIChmb3JjZV9vX2xhcmdlZmlsZSgpKQotCQlmbGFncyB8PSBPX0xBUkdFRklMRTsKLQotCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOwotCWZkID0gUFRSX0VSUih0bXApOwogCWlmICghSVNfRVJSKHRtcCkpIHsKIAkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7CiAJCWlmIChmZCA+PSAwKSB7CkBAIC05NTksNiArOTU5LDE0IEBACiAJfQogCXJldHVybiBmZDsKIH0KKworYXNtbGlua2FnZSBsb25nIHN5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKwlpZiAoZm9yY2Vfb19sYXJnZWZpbGUoKSkKKwkJZmxhZ3MgfD0gT19MQVJHRUZJTEU7CisKKwlyZXR1cm4gZG9fc3lzX29wZW4oZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHN5c19vcGVuKTsKIAogI2lmbmRlZiBfX2FscGhhX18KQEAgLTEwMDcsMTUgKzEwMTUsMTcgQEAKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbHA7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlpZiAoZmQgPj0gZmlsZXMtPm1heF9mZHMpCisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJaWYgKGZkID49IGZkdC0+bWF4X2ZkcykKIAkJZ290byBvdXRfdW5sb2NrOwotCWZpbHAgPSBmaWxlcy0+ZmRbZmRdOworCWZpbHAgPSBmZHQtPmZkW2ZkXTsKIAlpZiAoIWZpbHApCiAJCWdvdG8gb3V0X3VubG9jazsKLQlmaWxlcy0+ZmRbZmRdID0gTlVMTDsKLQlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZmR0LT5mZFtmZF0sIE5VTEwpOworCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKIAlfX3B1dF91bnVzZWRfZmQoZmlsZXMsIGZkKTsKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAJcmV0dXJuIGZpbHBfY2xvc2UoZmlscCwgZmlsZXMpOwpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IDI1YWEwOWYuLjY2YWEwYjkgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTM5LDcgKzM5LDExIEBACiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKLQlwcmVwYXJlX3RvX3dhaXQoUElQRV9XQUlUKCppbm9kZSksICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCS8qCisJICogUGlwZXMgYXJlIHN5c3RlbS1sb2NhbCByZXNvdXJjZXMsIHNvIHNsZWVwaW5nIG9uIHRoZW0KKwkgKiBpcyBjb25zaWRlcmVkIGEgbm9uaW50ZXJhY3RpdmUgd2FpdDoKKwkgKi8KKwlwcmVwYXJlX3RvX3dhaXQoUElQRV9XQUlUKCppbm9kZSksICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEV8VEFTS19OT05JTlRFUkFDVElWRSk7CiAJdXAoUElQRV9TRU0oKmlub2RlKSk7CiAJc2NoZWR1bGUoKTsKIAlmaW5pc2hfd2FpdChQSVBFX1dBSVQoKmlub2RlKSwgJndhaXQpOwpAQCAtNDE1LDYgKzQxOSwxMCBAQAogCiAJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CiAJCW1hc2sgfD0gKG5yYnVmcyA8IFBJUEVfQlVGRkVSUykgPyBQT0xMT1VUIHwgUE9MTFdSTk9STSA6IDA7CisJCS8qCisJCSAqIE1vc3QgVW5pY2VzIGRvIG5vdCBzZXQgUE9MTEVSUiBmb3IgRklGT3MgYnV0IG9uIExpbnV4IHRoZXkKKwkJICogYmVoYXZlIGV4YWN0bHkgbGlrZSBwaXBlcyBmb3IgcG9sbCgpLgorCQkgKi8KIAkJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSkKIAkJCW1hc2sgfD0gUE9MTEVSUjsKIAl9CkBAIC00MjIsOSArNDMwLDYgQEAKIAlyZXR1cm4gbWFzazsKIH0KIAotLyogRklYTUU6IG1vc3QgVW5pY2VzIGRvIG5vdCBzZXQgUE9MTEVSUiBmb3IgZmlmb3MgKi8KLSNkZWZpbmUgZmlmb19wb2xsIHBpcGVfcG9sbAotCiBzdGF0aWMgaW50CiBwaXBlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlY3IsIGludCBkZWN3KQogewpAQCAtNTY4LDcgKzU3Myw3IEBACiAJLnJlYWQJCT0gcGlwZV9yZWFkLAogCS5yZWFkdgkJPSBwaXBlX3JlYWR2LAogCS53cml0ZQkJPSBiYWRfcGlwZV93LAotCS5wb2xsCQk9IGZpZm9fcG9sbCwKKwkucG9sbAkJPSBwaXBlX3BvbGwsCiAJLmlvY3RsCQk9IHBpcGVfaW9jdGwsCiAJLm9wZW4JCT0gcGlwZV9yZWFkX29wZW4sCiAJLnJlbGVhc2UJPSBwaXBlX3JlYWRfcmVsZWFzZSwKQEAgLTU4MCw3ICs1ODUsNyBAQAogCS5yZWFkCQk9IGJhZF9waXBlX3IsCiAJLndyaXRlCQk9IHBpcGVfd3JpdGUsCiAJLndyaXRldgkJPSBwaXBlX3dyaXRldiwKLQkucG9sbAkJPSBmaWZvX3BvbGwsCisJLnBvbGwJCT0gcGlwZV9wb2xsLAogCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAogCS5vcGVuCQk9IHBpcGVfd3JpdGVfb3BlbiwKIAkucmVsZWFzZQk9IHBpcGVfd3JpdGVfcmVsZWFzZSwKQEAgLTU5Myw3ICs1OTgsNyBAQAogCS5yZWFkdgkJPSBwaXBlX3JlYWR2LAogCS53cml0ZQkJPSBwaXBlX3dyaXRlLAogCS53cml0ZXYJCT0gcGlwZV93cml0ZXYsCi0JLnBvbGwJCT0gZmlmb19wb2xsLAorCS5wb2xsCQk9IHBpcGVfcG9sbCwKIAkuaW9jdGwJCT0gcGlwZV9pb2N0bCwKIAkub3BlbgkJPSBwaXBlX3Jkd3Jfb3BlbiwKIAkucmVsZWFzZQk9IHBpcGVfcmR3cl9yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCmluZGV4IDM3NjY4ZmUuLmQ4OGQ1MTggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYXJyYXkuYworKysgYi9mcy9wcm9jL2FycmF5LmMKQEAgLTE1OSw2ICsxNTksNyBAQAogewogCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOwogCWludCBnOworCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBOVUxMOwogCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsCkBAIC0xNzksMTAgKzE4MCwxMiBAQAogCQlwLT5naWQsIHAtPmVnaWQsIHAtPnNnaWQsIHAtPmZzZ2lkKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJdGFza19sb2NrKHApOworCWlmIChwLT5maWxlcykKKwkJZmR0ID0gZmlsZXNfZmR0YWJsZShwLT5maWxlcyk7CiAJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLAogCQkiRkRTaXplOlx0JWRcbiIKIAkJIkdyb3VwczpcdCIsCi0JCXAtPmZpbGVzID8gcC0+ZmlsZXMtPm1heF9mZHMgOiAwKTsKKwkJZmR0ID8gZmR0LT5tYXhfZmRzIDogMCk7CiAKIAlncm91cF9pbmZvID0gcC0+Z3JvdXBfaW5mbzsKIAlnZXRfZ3JvdXBfaW5mbyhncm91cF9pbmZvKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNTIwOTc4ZS4uMjNkYjQ1MiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTYyLDYgKzYyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KQEAgLTExOSw3ICsxMjAsNiBAQAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIAlQUk9DX1RHSURfTE9HSU5VSUQsCiAjZW5kaWYKLQlQUk9DX1RHSURfRkRfRElSLAogCVBST0NfVEdJRF9PT01fU0NPUkUsCiAJUFJPQ19UR0lEX09PTV9BREpVU1QsCiAJUFJPQ19USURfSU5PLApAQCAtMTU4LDkgKzE1OCwxMSBAQAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIAlQUk9DX1RJRF9MT0dJTlVJRCwKICNlbmRpZgotCVBST0NfVElEX0ZEX0RJUiA9IDB4ODAwMCwJLyogMHg4MDAwLTB4ZmZmZiAqLwogCVBST0NfVElEX09PTV9TQ09SRSwKIAlQUk9DX1RJRF9PT01fQURKVVNULAorCisJLyogQWRkIG5ldyBlbnRyaWVzIGJlZm9yZSB0aGlzICovCisJUFJPQ19USURfRkRfRElSID0gMHg4MDAwLAkvKiAweDgwMDAtMHhmZmZmICovCiB9OwogCiBzdHJ1Y3QgcGlkX2VudHJ5IHsKQEAgLTI4MiwzMCArMjg0LDM2IEBACiAKIAlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodGFzayk7CiAJaWYgKGZpbGVzKSB7Ci0JCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXJjdV9yZWFkX2xvY2soKTsKIAkJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOwogCQlpZiAoZmlsZSkgewogCQkJKm1udCA9IG1udGdldChmaWxlLT5mX3Zmc21udCk7CiAJCQkqZGVudHJ5ID0gZGdldChmaWxlLT5mX2RlbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJfQogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQorc3RhdGljIHN0cnVjdCBmc19zdHJ1Y3QgKmdldF9mc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCBmc19zdHJ1Y3QgKmZzOwotCWludCByZXN1bHQgPSAtRU5PRU5UOwotCXRhc2tfbG9jayhwcm9jX3Rhc2soaW5vZGUpKTsKLQlmcyA9IHByb2NfdGFzayhpbm9kZSktPmZzOworCXRhc2tfbG9jayh0YXNrKTsKKwlmcyA9IHRhc2stPmZzOwogCWlmKGZzKQogCQlhdG9taWNfaW5jKCZmcy0+Y291bnQpOwotCXRhc2tfdW5sb2NrKHByb2NfdGFzayhpbm9kZSkpOworCXRhc2tfdW5sb2NrKHRhc2spOworCXJldHVybiBmczsKK30KKworc3RhdGljIGludCBwcm9jX2N3ZF9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKK3sKKwlzdHJ1Y3QgZnNfc3RydWN0ICpmcyA9IGdldF9mc19zdHJ1Y3QocHJvY190YXNrKGlub2RlKSk7CisJaW50IHJlc3VsdCA9IC1FTk9FTlQ7CiAJaWYgKGZzKSB7CiAJCXJlYWRfbG9jaygmZnMtPmxvY2spOwogCQkqbW50ID0gbW50Z2V0KGZzLT5wd2RtbnQpOwpAQCAtMzE5LDEzICszMjcsOCBAQAogCiBzdGF0aWMgaW50IHByb2Nfcm9vdF9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKIHsKLQlzdHJ1Y3QgZnNfc3RydWN0ICpmczsKKwlzdHJ1Y3QgZnNfc3RydWN0ICpmcyA9IGdldF9mc19zdHJ1Y3QocHJvY190YXNrKGlub2RlKSk7CiAJaW50IHJlc3VsdCA9IC1FTk9FTlQ7Ci0JdGFza19sb2NrKHByb2NfdGFzayhpbm9kZSkpOwotCWZzID0gcHJvY190YXNrKGlub2RlKS0+ZnM7Ci0JaWYoZnMpCi0JCWF0b21pY19pbmMoJmZzLT5jb3VudCk7Ci0JdGFza191bmxvY2socHJvY190YXNrKGlub2RlKSk7CiAJaWYgKGZzKSB7CiAJCXJlYWRfbG9jaygmZnMtPmxvY2spOwogCQkqbW50ID0gbW50Z2V0KGZzLT5yb290bW50KTsKQEAgLTM0NCwzMyArMzQ3LDYgQEAKIAkgKHRhc2stPnN0YXRlID09IFRBU0tfU1RPUFBFRCB8fCB0YXNrLT5zdGF0ZSA9PSBUQVNLX1RSQUNFRCkgJiYgXAogCSBzZWN1cml0eV9wdHJhY2UoY3VycmVudCx0YXNrKSA9PSAwKSkKIAotc3RhdGljIGludCBtYXlfcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQl0YXNrX2xvY2sodGFzayk7Ci0KLQlpZiAoIXRhc2stPm1tKQotCQlnb3RvIG91dDsKLQlpZiAoKChjdXJyZW50LT51aWQgIT0gdGFzay0+ZXVpZCkgfHwKLQkgICAgIChjdXJyZW50LT51aWQgIT0gdGFzay0+c3VpZCkgfHwKLQkgICAgIChjdXJyZW50LT51aWQgIT0gdGFzay0+dWlkKSB8fAotCSAgICAgKGN1cnJlbnQtPmdpZCAhPSB0YXNrLT5lZ2lkKSB8fAotCSAgICAgKGN1cnJlbnQtPmdpZCAhPSB0YXNrLT5zZ2lkKSB8fAotCSAgICAgKGN1cnJlbnQtPmdpZCAhPSB0YXNrLT5naWQpKSAmJiAhY2FwYWJsZShDQVBfU1lTX1BUUkFDRSkpCi0JCWdvdG8gb3V0OwotCXJtYigpOwotCWlmICh0YXNrLT5tbS0+ZHVtcGFibGUgIT0gMSAmJiAhY2FwYWJsZShDQVBfU1lTX1BUUkFDRSkpCi0JCWdvdG8gb3V0OwotCWlmIChzZWN1cml0eV9wdHJhY2UoY3VycmVudCwgdGFzaykpCi0JCWdvdG8gb3V0OwotCi0JcmV0dmFsID0gMTsKLW91dDoKLQl0YXNrX3VubG9jayh0YXNrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCiBzdGF0aWMgaW50IHByb2NfcGlkX2Vudmlyb24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQogewogCWludCByZXMgPSAwOwpAQCAtMzgwLDcgKzM1Niw3IEBACiAJCWlmIChsZW4gPiBQQUdFX1NJWkUpCiAJCQlsZW4gPSBQQUdFX1NJWkU7CiAJCXJlcyA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIG1tLT5lbnZfc3RhcnQsIGJ1ZmZlciwgbGVuLCAwKTsKLQkJaWYgKCFtYXlfcHRyYWNlX2F0dGFjaCh0YXNrKSkKKwkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKIAkJCXJlcyA9IC1FU1JDSDsKIAkJbW1wdXQobW0pOwogCX0KQEAgLTY4Myw3ICs2NTksNyBAQAogCWludCByZXQgPSAtRVNSQ0g7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAKLQlpZiAoIU1BWV9QVFJBQ0UodGFzaykgfHwgIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKQorCWlmICghTUFZX1BUUkFDRSh0YXNrKSB8fCAhcHRyYWNlX21heV9hdHRhY2godGFzaykpCiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gLUVOT01FTTsKQEAgLTcwOSw3ICs2ODUsNyBAQAogCiAJCXRoaXNfbGVuID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OwogCQlyZXR2YWwgPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBzcmMsIHBhZ2UsIHRoaXNfbGVuLCAwKTsKLQkJaWYgKCFyZXR2YWwgfHwgIU1BWV9QVFJBQ0UodGFzaykgfHwgIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKSB7CisJCWlmICghcmV0dmFsIHx8ICFNQVlfUFRSQUNFKHRhc2spIHx8ICFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkgewogCQkJaWYgKCFyZXQpCiAJCQkJcmV0ID0gLUVJTzsKIAkJCWJyZWFrOwpAQCAtNzQ3LDcgKzcyMyw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKIAl1bnNpZ25lZCBsb25nIGRzdCA9ICpwcG9zOwogCi0JaWYgKCFNQVlfUFRSQUNFKHRhc2spIHx8ICFtYXlfcHRyYWNlX2F0dGFjaCh0YXNrKSkKKwlpZiAoIU1BWV9QVFJBQ0UodGFzaykgfHwgIXB0cmFjZV9tYXlfYXR0YWNoKHRhc2spKQogCQlyZXR1cm4gLUVTUkNIOwogCiAJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKQEAgLTEwNjQsNiArMTA0MCw3IEBACiAJaW50IHJldHZhbDsKIAljaGFyIGJ1ZltOVU1CVUZdOwogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJcmV0dmFsID0gLUVOT0VOVDsKIAlpZiAoIXBpZF9hbGl2ZShwKSkKQEAgLTEwODYsMTUgKzEwNjMsMTYgQEAKIAkJCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdChwKTsKIAkJCWlmICghZmlsZXMpCiAJCQkJZ290byBvdXQ7Ci0JCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJcmN1X3JlYWRfbG9jaygpOworCQkJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJCQlmb3IgKGZkID0gZmlscC0+Zl9wb3MtMjsKLQkJCSAgICAgZmQgPCBmaWxlcy0+bWF4X2ZkczsKKwkJCSAgICAgZmQgPCBmZHQtPm1heF9mZHM7CiAJCQkgICAgIGZkKyssIGZpbHAtPmZfcG9zKyspIHsKIAkJCQl1bnNpZ25lZCBpbnQgaSxqOwogCiAJCQkJaWYgKCFmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKSkKIAkJCQkJY29udGludWU7Ci0JCQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJCQkJaiA9IE5VTUJVRjsKIAkJCQlpID0gZmQ7CkBAIC0xMTA2LDEyICsxMDg0LDEyIEBACiAKIAkJCQlpbm8gPSBmYWtlX2lubyh0aWQsIFBST0NfVElEX0ZEX0RJUiArIGZkKTsKIAkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZitqLCBOVU1CVUYtaiwgZmQrMiwgaW5vLCBEVF9MTkspIDwgMCkgewotCQkJCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJfQogb3V0OgpAQCAtMTI4Niw5ICsxMjY0LDkgQEAKIAogCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKIAlpZiAoZmlsZXMpIHsKLQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJcmN1X3JlYWRfbG9jaygpOwogCQlpZiAoZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCkpIHsKLQkJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJCQlpZiAodGFza19kdW1wYWJsZSh0YXNrKSkgewogCQkJCWlub2RlLT5pX3VpZCA9IHRhc2stPmV1aWQ7CkBAIC0xMzAwLDcgKzEyNzgsNyBAQAogCQkJc2VjdXJpdHlfdGFza190b19pbm9kZSh0YXNrLCBpbm9kZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKIAl9CiAJZF9kcm9wKGRlbnRyeSk7CkBAIC0xMzkyLDcgKzEzNzAsNyBAQAogCWlmICghZmlsZXMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkxOSzsKLQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dF91bmxvY2syOwpAQCAtMTQwMCw3ICsxMzc4LDcgQEAKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lSVVNSIHwgU19JWFVTUjsKIAlpZiAoZmlsZS0+Zl9tb2RlICYgMikKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lXVVNSIHwgU19JWFVTUjsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAJaW5vZGUtPmlfb3AgPSAmcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX3NpemUgPSA2NDsKQEAgLTE0MTAsNyArMTM4OCw3IEBACiAJcmV0dXJuIE5VTEw7CiAKIG91dF91bmxvY2syOgotCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKIG91dF91bmxvY2s6CiAJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IGFiZTg5MjAuLjhhOGMzNDQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC0yNDksNiArMjQ5LDE4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IHByb2NfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFBST0NfSShpbm9kZSktPnBkZTsKKwlpZiAoZGUgJiYgZGUtPm5saW5rKQorCQlpbm9kZS0+aV9ubGluayA9IGRlLT5ubGluazsKKworCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnNldGF0dHIJPSBwcm9jX25vdGlmeV9jaGFuZ2UsCiB9OwpAQCAtNDc1LDYgKzQ4Nyw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewogCS5sb29rdXAJCT0gcHJvY19sb29rdXAsCisJLmdldGF0dHIJPSBwcm9jX2dldGF0dHIsCiAJLnNldGF0dHIJPSBwcm9jX25vdGlmeV9jaGFuZ2UsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9wcm9jL2lub2RlLmMgYi9mcy9wcm9jL2lub2RlLmMKaW5kZXggMTMzYzI4Ni4uZWZmYTZjMCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9pbm9kZS5jCisrKyBiL2ZzL3Byb2MvaW5vZGUuYwpAQCAtNjAsNiArNjAsOCBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKIAkvKiBMZXQgZ28gb2YgYW55IGFzc29jaWF0ZWQgcHJvY2VzcyAqLwogCXRzayA9IFBST0NfSShpbm9kZSktPnRhc2s7CiAJaWYgKHRzaykKZGlmZiAtLWdpdCBhL2ZzL3FueDQvaW5vZGUuYyBiL2ZzL3FueDQvaW5vZGUuYwppbmRleCBiNzkxNjJhLi44MGYzMjkxIDEwMDY0NAotLS0gYS9mcy9xbng0L2lub2RlLmMKKysrIGIvZnMvcW54NC9pbm9kZS5jCkBAIC02Myw2ICs2Myw3IEBACiBzdGF0aWMgdm9pZCBxbng0X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCVFOWDRERUJVRygoInFueDQ6IGRlbGV0aW5nIGlub2RlIFslbHVdXG4iLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfaW5vKSk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCWlub2RlLT5pX3NpemUgPSAwOwogCXFueDRfdHJ1bmNhdGUoaW5vZGUpOwogCWxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggNTYzYWJkMC4uYjYwMzI0YSAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlsb2ZmX3QgcG9zOwogCi0JaWYgKHVubGlrZWx5KGNvdW50ID4gZmlsZS0+Zl9tYXhjb3VudCkpCisJaWYgKHVubGlrZWx5KGNvdW50ID4gSU5UX01BWCkpCiAJCWdvdG8gRWludmFsOwogCXBvcyA9ICpwcG9zOwogCWlmICh1bmxpa2VseSgocG9zIDwgMCkgfHwgKGxvZmZfdCkgKHBvcyArIGNvdW50KSA8IDApKQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW5vZGUuYyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKaW5kZXggZmYyOTFjOS4uMWE4YTFiZiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC0zMyw2ICszMyw4IEBACiAJICAgIDIgKiBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYik7CiAJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKIAorCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwogCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCiAJLyogVGhlID0gMCBoYXBwZW5zIHdoZW4gd2UgYWJvcnQgY3JlYXRpbmcgYSBuZXcgaW5vZGUgZm9yIHNvbWUgcmVhc29uIGxpa2UgbGFjayBvZiBzcGFjZS4uICovCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKaW5kZXggY2E3OTg5Yi4uNGIxNTc2MSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvam91cm5hbC5jCisrKyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7CiAJCXRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pOwogCQlpZiAoYnVmZmVyX2RpcnR5KHRiaCkpCS8qIHJlZHVuZGFudCwgbGxfcndfYmxvY2soKSBjaGVja3MgKi8KLQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKTsKKwkJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgJnRiaCk7CiAJCXB1dF9iaCh0YmgpOwogCX0KIAlhdG9taWNfZGVjKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKQEAgLTIxNzIsNyArMjE3Miw3IEBACiAJLyogZmx1c2ggb3V0IHRoZSByZWFsIGJsb2NrcyAqLwogCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgewogCQlzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKTsKLQkJbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSk7CisJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgcmVhbF9ibG9ja3MgKyBpKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKTsgaSsrKSB7CiAJCXdhaXRfb25fYnVmZmVyKHJlYWxfYmxvY2tzW2ldKTsKQEAgLTI4NjgsOCArMjg2OCw3IEBACiAJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKIAl1bnNpZ25lZCBsb25nIGJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OwogCXdoaWxlICgxKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCWpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOwogCQl3aGlsZSAoKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwIHx8CiAJCQlhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpICYmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCA2OTUxYzM1Li40NGIwMmZjIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTE5MzQsOCArMTkzNCw3IEBACiAJCQlpZiAoU0JfQVBfQklUTUFQKHMpKQogCQkJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbal0uYmgpOwogCQl9Ci0JCWlmIChTQl9BUF9CSVRNQVAocykpCi0JCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOworCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOwogCX0KIAlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocykpCiAJCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CmRpZmYgLS1naXQgYS9mcy9yZWxheWZzL01ha2VmaWxlIGIvZnMvcmVsYXlmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzZlMTgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVsYXlmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai0kKENPTkZJR19SRUxBWUZTX0ZTKSArPSByZWxheWZzLm8KKworcmVsYXlmcy15IDo9IHJlbGF5Lm8gaW5vZGUubyBidWZmZXJzLm8KKwpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9idWZmZXJzLmMgYi9mcy9yZWxheWZzL2J1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE4ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVsYXlmcy9idWZmZXJzLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBSZWxheUZTIGJ1ZmZlciBtYW5hZ2VtZW50IGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgLSBUb20gWmFudXNzaSAoemFudXNzaUB1cy5pYm0uY29tKSwgSUJNIENvcnAKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IC0gS2FyaW0gWWFnaG1vdXIgKGthcmltQG9wZXJzeXMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWxheWZzX2ZzLmg+CisjaW5jbHVkZSAicmVsYXkuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisKKy8qCisgKiBjbG9zZSgpIHZtX29wIGltcGxlbWVudGF0aW9uIGZvciByZWxheWZzIGZpbGUgbWFwcGluZy4KKyAqLworc3RhdGljIHZvaWQgcmVsYXlfZmlsZV9tbWFwX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWJ1Zi0+Y2hhbi0+Y2ItPmJ1Zl91bm1hcHBlZChidWYsIHZtYS0+dm1fZmlsZSk7Cit9CisKKy8qCisgKiBub3BhZ2UoKSB2bV9vcCBpbXBsZW1lbnRhdGlvbiBmb3IgcmVsYXlmcyBmaWxlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqcmVsYXlfYnVmX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgIGludCAqdHlwZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0OworCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkKKwkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCWlmICghYnVmKQorCQlyZXR1cm4gTk9QQUdFX09PTTsKKworCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoYnVmLT5zdGFydCArIG9mZnNldCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTk9QQUdFX09PTTsKKwlnZXRfcGFnZShwYWdlKTsKKworCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiB2bV9vcHMgZm9yIHJlbGF5IGZpbGUgbWFwcGluZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcmVsYXlfZmlsZV9tbWFwX29wcyA9IHsKKwkubm9wYWdlID0gcmVsYXlfYnVmX25vcGFnZSwKKwkuY2xvc2UgPSByZWxheV9maWxlX21tYXBfY2xvc2UsCit9OworCisvKioKKyAqCXJlbGF5X21tYXBfYnVmOiAtIG1tYXAgY2hhbm5lbCBidWZmZXIgdG8gcHJvY2VzcyBhZGRyZXNzIHNwYWNlCisgKglAYnVmOiByZWxheSBjaGFubmVsIGJ1ZmZlcgorICoJQHZtYTogdm1fYXJlYV9zdHJ1Y3QgZGVzY3JpYmluZyBtZW1vcnkgdG8gYmUgbWFwcGVkCisgKgorICoJUmV0dXJucyAwIGlmIG9rLCBuZWdhdGl2ZSBvbiBlcnJvcgorICoKKyAqCUNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGdyYWJiZWQgbW1hcF9zZW0uCisgKi8KK2ludCByZWxheV9tbWFwX2J1ZihzdHJ1Y3QgcmNoYW5fYnVmICpidWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCXN0cnVjdCBmaWxlICpmaWxwID0gdm1hLT52bV9maWxlOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUJBREY7CisKKwlpZiAobGVuZ3RoICE9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+Y2hhbi0+YWxsb2Nfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2bWEtPnZtX29wcyA9ICZyZWxheV9maWxlX21tYXBfb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gYnVmOworCWJ1Zi0+Y2hhbi0+Y2ItPmJ1Zl9tYXBwZWQoYnVmLCBmaWxwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXJlbGF5X2FsbG9jX2J1ZiAtIGFsbG9jYXRlIGEgY2hhbm5lbCBidWZmZXIKKyAqCUBidWY6IHRoZSBidWZmZXIgc3RydWN0CisgKglAc2l6ZTogdG90YWwgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBidWZmZXIsIE5VTEwgaWYgdW5zdWNjZXNzZnVsCisgKi8KK3N0YXRpYyB2b2lkICpyZWxheV9hbGxvY19idWYoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGludCBpLCBqLCBuX3BhZ2VzOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKworCWJ1Zi0+cGFnZV9hcnJheSA9IGtjYWxsb2Mobl9wYWdlcywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+cGFnZV9hcnJheSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9wYWdlczsgaSsrKSB7CisJCWJ1Zi0+cGFnZV9hcnJheVtpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseSghYnVmLT5wYWdlX2FycmF5W2ldKSkKKwkJCWdvdG8gZGVwb3B1bGF0ZTsKKwl9CisJbWVtID0gdm1hcChidWYtPnBhZ2VfYXJyYXksIG5fcGFnZXMsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMKTsKKwlpZiAoIW1lbSkKKwkJZ290byBkZXBvcHVsYXRlOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7CisJYnVmLT5wYWdlX2NvdW50ID0gbl9wYWdlczsKKwlyZXR1cm4gbWVtOworCitkZXBvcHVsYXRlOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCV9fZnJlZV9wYWdlKGJ1Zi0+cGFnZV9hcnJheVtqXSk7CisJa2ZyZWUoYnVmLT5wYWdlX2FycmF5KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyZWxheV9jcmVhdGVfYnVmIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjaGFubmVsIGJ1ZmZlcgorICoJQGFsbG9jX3NpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZQorICoJQG5fc3ViYnVmczogbnVtYmVyIG9mIHN1Yi1idWZmZXJzIGluIHRoZSBjaGFubmVsCisgKgorICoJUmV0dXJucyBjaGFubmVsIGJ1ZmZlciBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQorICovCitzdHJ1Y3QgcmNoYW5fYnVmICpyZWxheV9jcmVhdGVfYnVmKHN0cnVjdCByY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmNoYW5fYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJYnVmLT5wYWRkaW5nID0ga21hbGxvYyhjaGFuLT5uX3N1YmJ1ZnMgKiBzaXplb2Yoc2l6ZV90ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+cGFkZGluZykKKwkJZ290byBmcmVlX2J1ZjsKKworCWJ1Zi0+c3RhcnQgPSByZWxheV9hbGxvY19idWYoYnVmLCBjaGFuLT5hbGxvY19zaXplKTsKKwlpZiAoIWJ1Zi0+c3RhcnQpCisJCWdvdG8gZnJlZV9idWY7CisKKwlidWYtPmNoYW4gPSBjaGFuOworCWtyZWZfZ2V0KCZidWYtPmNoYW4tPmtyZWYpOworCXJldHVybiBidWY7CisKK2ZyZWVfYnVmOgorCWtmcmVlKGJ1Zi0+cGFkZGluZyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyZWxheV9kZXN0cm95X2J1ZiAtIGRlc3Ryb3kgYW4gcmNoYW5fYnVmIHN0cnVjdCBhbmQgYXNzb2NpYXRlZCBidWZmZXIKKyAqCUBidWY6IHRoZSBidWZmZXIgc3RydWN0CisgKi8KK3ZvaWQgcmVsYXlfZGVzdHJveV9idWYoc3RydWN0IHJjaGFuX2J1ZiAqYnVmKQoreworCXN0cnVjdCByY2hhbiAqY2hhbiA9IGJ1Zi0+Y2hhbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChsaWtlbHkoYnVmLT5zdGFydCkpIHsKKwkJdnVubWFwKGJ1Zi0+c3RhcnQpOworCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5wYWdlX2NvdW50OyBpKyspCisJCQlfX2ZyZWVfcGFnZShidWYtPnBhZ2VfYXJyYXlbaV0pOworCQlrZnJlZShidWYtPnBhZ2VfYXJyYXkpOworCX0KKwlrZnJlZShidWYtPnBhZGRpbmcpOworCWtmcmVlKGJ1Zik7CisJa3JlZl9wdXQoJmNoYW4tPmtyZWYsIHJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCk7Cit9CisKKy8qKgorICoJcmVsYXlfcmVtb3ZlX2J1ZiAtIHJlbW92ZSBhIGNoYW5uZWwgYnVmZmVyCisgKgorICoJUmVtb3ZlcyB0aGUgZmlsZSBmcm9tIHRoZSByZWxheWZzIGZpbGV5c3RlbSwgd2hpY2ggYWxzbyBmcmVlcyB0aGUKKyAqCXJjaGFuX2J1Zl9zdHJ1Y3QgYW5kIHRoZSBjaGFubmVsIGJ1ZmZlci4gIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tCisgKglrcmVmX3B1dCgpLgorICovCit2b2lkIHJlbGF5X3JlbW92ZV9idWYoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCByY2hhbl9idWYsIGtyZWYpOworCXJlbGF5ZnNfcmVtb3ZlKGJ1Zi0+ZGVudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlbGF5ZnMvYnVmZmVycy5oIGIvZnMvcmVsYXlmcy9idWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMTI0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlbGF5ZnMvYnVmZmVycy5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0JVRkZFUlNfSAorI2RlZmluZSBfQlVGRkVSU19ICisKKy8qIFRoaXMgaW5zcGlyZWQgYnkgcnRhaS9zaG1lbSAqLworI2RlZmluZSBGSVhfU0laRSh4KSAoKCh4KSAtIDEpICYgUEFHRV9NQVNLKSArIFBBR0VfU0laRQorCitleHRlcm4gaW50IHJlbGF5X21tYXBfYnVmKHN0cnVjdCByY2hhbl9idWYgKmJ1Ziwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHN0cnVjdCByY2hhbl9idWYgKnJlbGF5X2NyZWF0ZV9idWYoc3RydWN0IHJjaGFuICpjaGFuKTsKK2V4dGVybiB2b2lkIHJlbGF5X2Rlc3Ryb3lfYnVmKHN0cnVjdCByY2hhbl9idWYgKmJ1Zik7CitleHRlcm4gdm9pZCByZWxheV9yZW1vdmVfYnVmKHN0cnVjdCBrcmVmICprcmVmKTsKKworI2VuZGlmLyogX0JVRkZFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9pbm9kZS5jIGIvZnMvcmVsYXlmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2Y4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWxheWZzL2lub2RlLmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBWRlMtcmVsYXRlZCBjb2RlIGZvciBSZWxheUZTLCBhIGhpZ2gtc3BlZWQgZGF0YSByZWxheSBmaWxlc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IC0gVG9tIFphbnVzc2kgPHphbnVzc2lAdXMuaWJtLmNvbT4sIElCTSBDb3JwCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAtIEthcmltIFlhZ2htb3VyIDxrYXJpbUBvcGVyc3lzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiByYW1mcywgQ29weXJpZ2h0IChDKSAyMDAyIC0gTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWxheWZzX2ZzLmg+CisjaW5jbHVkZSAicmVsYXkuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisKKyNkZWZpbmUgUkVMQVlGU19NQUdJQwkJCTB4RjBCNEE5ODEKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqCQlyZWxheWZzX21vdW50Oworc3RhdGljIGludAkJCQlyZWxheWZzX21vdW50X2NvdW50Oworc3RhdGljIGttZW1fY2FjaGVfdCAqCQkJcmVsYXlmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbwkJcmVsYXlmc19iYWNraW5nX2Rldl9pbmZvID0geworCS5yYV9wYWdlcwk9IDAsCS8qIE5vIHJlYWRhaGVhZCAqLworCS5jYXBhYmlsaXRpZXMJPSBCRElfQ0FQX05PX0FDQ1RfRElSVFkgfCBCRElfQ0FQX05PX1dSSVRFQkFDSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnJlbGF5ZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgcmNoYW4gKmNoYW4pCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKFNfSVNSRUcobW9kZSkpIHsKKwkJQlVHX09OKCFjaGFuKTsKKwkJYnVmID0gcmVsYXlfY3JlYXRlX2J1ZihjaGFuKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFpbm9kZSkgeworCQlyZWxheV9kZXN0cm95X2J1ZihidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV91aWQgPSAwOworCWlub2RlLT5pX2dpZCA9IDA7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcmVsYXlmc19iYWNraW5nX2Rldl9pbmZvOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWlub2RlLT5pX2ZvcCA9ICZyZWxheWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJUkVMQVlGU19JKGlub2RlKS0+YnVmID0gYnVmOworCQlicmVhazsKKwljYXNlIFNfSUZESVI6CisJCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKworCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJaW5vZGUtPmlfbmxpbmsrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGlub2RlOworfQorCisvKioKKyAqCXJlbGF5ZnNfY3JlYXRlX2VudHJ5IC0gY3JlYXRlIGEgcmVsYXlmcyBkaXJlY3Rvcnkgb3IgZmlsZQorICoJQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZQorICoJQHBhcmVudDogcGFyZW50IGRpcmVjdG9yeQorICoJQG1vZGU6IG1vZGUKKyAqCUBjaGFuOiByZWxheSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorICoKKyAqCVJldHVybnMgdGhlIG5ldyBkZW50cnksIE5VTEwgb24gZmFpbHVyZQorICoKKyAqCUNyZWF0ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZlZCBwZXJtaXNzaW9ucy4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJICAgaW50IG1vZGUsCisJCQkJCSAgIHN0cnVjdCByY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yID0gMDsKKworCUJVR19PTighbmFtZSB8fCAhKFNfSVNSRUcobW9kZSkgfHwgU19JU0RJUihtb2RlKSkpOworCisJZXJyb3IgPSBzaW1wbGVfcGluX2ZzKCJyZWxheWZzIiwgJnJlbGF5ZnNfbW91bnQsICZyZWxheWZzX21vdW50X2NvdW50KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBtb3VudCByZWxheWZzOiBlcnJjb2RlICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghcGFyZW50ICYmIHJlbGF5ZnNfbW91bnQgJiYgcmVsYXlmc19tb3VudC0+bW50X3NiKQorCQlwYXJlbnQgPSByZWxheWZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKworCWlmICghcGFyZW50KSB7CisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZyZWxheWZzX21vdW50LCAmcmVsYXlmc19tb3VudF9jb3VudCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBhcmVudCA9IGRnZXQocGFyZW50KTsKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlkID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBzdHJsZW4obmFtZSkpOworCWlmIChJU19FUlIoZCkpIHsKKwkJZCA9IE5VTEw7CisJCWdvdG8gcmVsZWFzZV9tb3VudDsKKwl9CisKKwlpZiAoZC0+ZF9pbm9kZSkgeworCQlkID0gTlVMTDsKKwkJZ290byByZWxlYXNlX21vdW50OworCX0KKworCWlub2RlID0gcmVsYXlmc19nZXRfaW5vZGUocGFyZW50LT5kX2lub2RlLT5pX3NiLCBtb2RlLCBjaGFuKTsKKwlpZiAoIWlub2RlKSB7CisJCWQgPSBOVUxMOworCQlnb3RvIHJlbGVhc2VfbW91bnQ7CisJfQorCisJZF9pbnN0YW50aWF0ZShkLCBpbm9kZSk7CisJZGdldChkKTsJLyogRXh0cmEgY291bnQgLSBwaW4gdGhlIGRlbnRyeSBpbiBjb3JlICovCisKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcGFyZW50LT5kX2lub2RlLT5pX25saW5rKys7CisKKwlnb3RvIGV4aXQ7CisKK3JlbGVhc2VfbW91bnQ6CisJc2ltcGxlX3JlbGVhc2VfZnMoJnJlbGF5ZnNfbW91bnQsICZyZWxheWZzX21vdW50X2NvdW50KTsKKworZXhpdDoKKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJZHB1dChwYXJlbnQpOworCXJldHVybiBkOworfQorCisvKioKKyAqCXJlbGF5ZnNfY3JlYXRlX2ZpbGUgLSBjcmVhdGUgYSBmaWxlIGluIHRoZSByZWxheSBmaWxlc3lzdGVtCisgKglAbmFtZTogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlCisgKglAcGFyZW50OiBwYXJlbnQgZGlyZWN0b3J5CisgKglAbW9kZTogbW9kZSwgaWYgbm90IHNwZWNpZWQgdGhlIGRlZmF1bHQgcGVybXMgYXJlIHVzZWQKKyAqCUBjaGFuOiBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorICoKKyAqCVJldHVybnMgZmlsZSBkZW50cnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCisgKgorICoJVGhlIGZpbGUgd2lsbCBiZSBjcmVhdGVkIHVzZXIgciBvbiBiZWhhbGYgb2YgY3VycmVudCB1c2VyLgorICovCitzdHJ1Y3QgZGVudHJ5ICpyZWxheWZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkgICBpbnQgbW9kZSwgc3RydWN0IHJjaGFuICpjaGFuKQoreworCWlmICghbW9kZSkKKwkJbW9kZSA9IFNfSVJVU1I7CisJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CisKKwlyZXR1cm4gcmVsYXlmc19jcmVhdGVfZW50cnkobmFtZSwgcGFyZW50LCBtb2RlLCBjaGFuKTsKK30KKworLyoqCisgKglyZWxheWZzX2NyZWF0ZV9kaXIgLSBjcmVhdGUgYSBkaXJlY3RvcnkgaW4gdGhlIHJlbGF5IGZpbGVzeXN0ZW0KKyAqCUBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZQorICoJQHBhcmVudDogcGFyZW50IGRpcmVjdG9yeSwgTlVMTCBpZiBwYXJlbnQgc2hvdWxkIGJlIGZzIHJvb3QKKyAqCisgKglSZXR1cm5zIGRpcmVjdG9yeSBkZW50cnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCisgKgorICoJVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgd29ybGQgcnd4IG9uIGJlaGFsZiBvZiBjdXJyZW50IHVzZXIuCisgKi8KK3N0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJaW50IG1vZGUgPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPOworCXJldHVybiByZWxheWZzX2NyZWF0ZV9lbnRyeShuYW1lLCBwYXJlbnQsIG1vZGUsIE5VTEwpOworfQorCisvKioKKyAqCXJlbGF5ZnNfcmVtb3ZlIC0gcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgaW4gdGhlIHJlbGF5IGZpbGVzeXN0ZW0KKyAqCUBkZW50cnk6IGZpbGUgb3IgZGlyZWN0b3J5IGRlbnRyeQorICoKKyAqCVJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKi8KK2ludCByZWxheWZzX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIWRlbnRyeSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJlbnQgPSBkZ2V0KHBhcmVudCk7CisJZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQllcnJvciA9IHNpbXBsZV9ybWRpcihwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCWVsc2UKKwkJCWVycm9yID0gc2ltcGxlX3VubGluayhwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCWlmICghZXJyb3IpCisJCQlkX2RlbGV0ZShkZW50cnkpOworCX0KKwlpZiAoIWVycm9yKQorCQlkcHV0KGRlbnRyeSk7CisJdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCWRwdXQocGFyZW50KTsKKworCWlmICghZXJyb3IpCisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZyZWxheWZzX21vdW50LCAmcmVsYXlmc19tb3VudF9jb3VudCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZW1vdmVfZGlyIC0gcmVtb3ZlIGEgZGlyZWN0b3J5IGluIHRoZSByZWxheSBmaWxlc3lzdGVtCisgKglAZGVudHJ5OiBkaXJlY3RvcnkgZGVudHJ5CisgKgorICoJUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworaW50IHJlbGF5ZnNfcmVtb3ZlX2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIHJlbGF5ZnNfcmVtb3ZlKGRlbnRyeSk7Cit9CisKKy8qKgorICoJcmVsYXlmc19vcGVuIC0gb3BlbiBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglAaW5vZGU6IHRoZSBpbm9kZQorICoJQGZpbHA6IHRoZSBmaWxlCisgKgorICoJSW5jcmVtZW50cyB0aGUgY2hhbm5lbCBidWZmZXIgcmVmY291bnQuCisgKi8KK3N0YXRpYyBpbnQgcmVsYXlmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IFJFTEFZRlNfSShpbm9kZSktPmJ1ZjsKKwlrcmVmX2dldCgmYnVmLT5rcmVmKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXJlbGF5ZnNfbW1hcCAtIG1tYXAgZmlsZSBvcCBmb3IgcmVsYXlmcyBmaWxlcworICoJQGZpbHA6IHRoZSBmaWxlCisgKglAdm1hOiB0aGUgdm1hIGRlc2NyaWJpbmcgd2hhdCB0byBtYXAKKyAqCisgKglDYWxscyB1cG9uIHJlbGF5X21tYXBfYnVmIHRvIG1hcCB0aGUgZmlsZSBpbnRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgcmVsYXlmc19tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJcmV0dXJuIHJlbGF5X21tYXBfYnVmKFJFTEFZRlNfSShpbm9kZSktPmJ1Ziwgdm1hKTsKK30KKworLyoqCisgKglyZWxheWZzX3BvbGwgLSBwb2xsIGZpbGUgb3AgZm9yIHJlbGF5ZnMgZmlsZXMKKyAqCUBmaWxwOiB0aGUgZmlsZQorICoJQHdhaXQ6IHBvbGwgdGFibGUKKyAqCisgKglQb2xsIGltcGxlbWVudGlvbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZWxheWZzX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBSRUxBWUZTX0koaW5vZGUpLT5idWY7CisKKwlpZiAoYnVmLT5maW5hbGl6ZWQpCisJCXJldHVybiBQT0xMRVJSOworCisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcG9sbF93YWl0KGZpbHAsICZidWYtPnJlYWRfd2FpdCwgd2FpdCk7CisJCWlmICghcmVsYXlfYnVmX2VtcHR5KGJ1ZikpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZWxlYXNlIC0gcmVsZWFzZSBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglAaW5vZGU6IHRoZSBpbm9kZQorICoJQGZpbHA6IHRoZSBmaWxlCisgKgorICoJRGVjcmVtZW50cyB0aGUgY2hhbm5lbCByZWZjb3VudCwgYXMgdGhlIGZpbGVzeXN0ZW0gaXMKKyAqCW5vIGxvbmdlciB1c2luZyBpdC4KKyAqLworc3RhdGljIGludCByZWxheWZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCWtyZWZfcHV0KCZidWYtPmtyZWYsIHJlbGF5X3JlbW92ZV9idWYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZWFkX2NvbnN1bWUgLSB1cGRhdGUgdGhlIGNvbnN1bWVkIGNvdW50IGZvciB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIHJlbGF5ZnNfcmVhZF9jb25zdW1lKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkgc2l6ZV90IHJlYWRfcG9zLAorCQkJCSBzaXplX3QgYnl0ZXNfY29uc3VtZWQpCit7CisJc2l6ZV90IHN1YmJ1Zl9zaXplID0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZTsKKwlzaXplX3Qgbl9zdWJidWZzID0gYnVmLT5jaGFuLT5uX3N1YmJ1ZnM7CisJc2l6ZV90IHJlYWRfc3ViYnVmOworCisJaWYgKGJ1Zi0+Ynl0ZXNfY29uc3VtZWQgKyBieXRlc19jb25zdW1lZCA+IHN1YmJ1Zl9zaXplKSB7CisJCXJlbGF5X3N1YmJ1ZnNfY29uc3VtZWQoYnVmLT5jaGFuLCBidWYtPmNwdSwgMSk7CisJCWJ1Zi0+Ynl0ZXNfY29uc3VtZWQgPSAwOworCX0KKworCWJ1Zi0+Ynl0ZXNfY29uc3VtZWQgKz0gYnl0ZXNfY29uc3VtZWQ7CisJcmVhZF9zdWJidWYgPSByZWFkX3BvcyAvIGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CisJaWYgKGJ1Zi0+Ynl0ZXNfY29uc3VtZWQgKyBidWYtPnBhZGRpbmdbcmVhZF9zdWJidWZdID09IHN1YmJ1Zl9zaXplKSB7CisJCWlmICgocmVhZF9zdWJidWYgPT0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkICUgbl9zdWJidWZzKSAmJgorCQkgICAgKGJ1Zi0+b2Zmc2V0ID09IHN1YmJ1Zl9zaXplKSkKKwkJCXJldHVybjsKKwkJcmVsYXlfc3ViYnVmc19jb25zdW1lZChidWYtPmNoYW4sIGJ1Zi0+Y3B1LCAxKTsKKwkJYnVmLT5ieXRlc19jb25zdW1lZCA9IDA7CisJfQorfQorCisvKioKKyAqCXJlbGF5ZnNfcmVhZF9hdmFpbCAtIGJvb2xlYW4sIGFyZSB0aGVyZSB1bmNvbnN1bWVkIGJ5dGVzIGF2YWlsYWJsZT8KKyAqLworc3RhdGljIGludCByZWxheWZzX3JlYWRfYXZhaWwoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLCBzaXplX3QgcmVhZF9wb3MpCit7CisJc2l6ZV90IGJ5dGVzX3Byb2R1Y2VkLCBieXRlc19jb25zdW1lZCwgd3JpdGVfb2Zmc2V0OworCXNpemVfdCBzdWJidWZfc2l6ZSA9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CisJc2l6ZV90IG5fc3ViYnVmcyA9IGJ1Zi0+Y2hhbi0+bl9zdWJidWZzOworCXNpemVfdCBwcm9kdWNlZCA9IGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCAlIG5fc3ViYnVmczsKKwlzaXplX3QgY29uc3VtZWQgPSBidWYtPnN1YmJ1ZnNfY29uc3VtZWQgJSBuX3N1YmJ1ZnM7CisKKwl3cml0ZV9vZmZzZXQgPSBidWYtPm9mZnNldCA+IHN1YmJ1Zl9zaXplID8gc3ViYnVmX3NpemUgOiBidWYtPm9mZnNldDsKKworCWlmIChjb25zdW1lZCA+IHByb2R1Y2VkKSB7CisJCWlmICgocHJvZHVjZWQgPiBuX3N1YmJ1ZnMpICYmCisJCSAgICAocHJvZHVjZWQgKyBuX3N1YmJ1ZnMgLSBjb25zdW1lZCA8PSBuX3N1YmJ1ZnMpKQorCQkJcHJvZHVjZWQgKz0gbl9zdWJidWZzOworCX0gZWxzZSBpZiAoY29uc3VtZWQgPT0gcHJvZHVjZWQpIHsKKwkJaWYgKGJ1Zi0+b2Zmc2V0ID4gc3ViYnVmX3NpemUpIHsKKwkJCXByb2R1Y2VkICs9IG5fc3ViYnVmczsKKwkJCWlmIChidWYtPnN1YmJ1ZnNfcHJvZHVjZWQgPT0gYnVmLT5zdWJidWZzX2NvbnN1bWVkKQorCQkJCWNvbnN1bWVkICs9IG5fc3ViYnVmczsKKwkJfQorCX0KKworCWlmIChidWYtPm9mZnNldCA+IHN1YmJ1Zl9zaXplKQorCQlieXRlc19wcm9kdWNlZCA9IChwcm9kdWNlZCAtIDEpICogc3ViYnVmX3NpemUgKyB3cml0ZV9vZmZzZXQ7CisJZWxzZQorCQlieXRlc19wcm9kdWNlZCA9IHByb2R1Y2VkICogc3ViYnVmX3NpemUgKyB3cml0ZV9vZmZzZXQ7CisJYnl0ZXNfY29uc3VtZWQgPSBjb25zdW1lZCAqIHN1YmJ1Zl9zaXplICsgYnVmLT5ieXRlc19jb25zdW1lZDsKKworCWlmIChieXRlc19wcm9kdWNlZCA9PSBieXRlc19jb25zdW1lZCkKKwkJcmV0dXJuIDA7CisKKwlyZWxheWZzX3JlYWRfY29uc3VtZShidWYsIHJlYWRfcG9zLCAwKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXJlbGF5ZnNfcmVhZF9zdWJidWZfYXZhaWwgLSByZXR1cm4gYnl0ZXMgYXZhaWxhYmxlIGluIHN1Yi1idWZmZXIKKyAqLworc3RhdGljIHNpemVfdCByZWxheWZzX3JlYWRfc3ViYnVmX2F2YWlsKHNpemVfdCByZWFkX3BvcywKKwkJCQkJc3RydWN0IHJjaGFuX2J1ZiAqYnVmKQoreworCXNpemVfdCBwYWRkaW5nLCBhdmFpbCA9IDA7CisJc2l6ZV90IHJlYWRfc3ViYnVmLCByZWFkX29mZnNldCwgd3JpdGVfc3ViYnVmLCB3cml0ZV9vZmZzZXQ7CisJc2l6ZV90IHN1YmJ1Zl9zaXplID0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZTsKKworCXdyaXRlX3N1YmJ1ZiA9IChidWYtPmRhdGEgLSBidWYtPnN0YXJ0KSAvIHN1YmJ1Zl9zaXplOworCXdyaXRlX29mZnNldCA9IGJ1Zi0+b2Zmc2V0ID4gc3ViYnVmX3NpemUgPyBzdWJidWZfc2l6ZSA6IGJ1Zi0+b2Zmc2V0OworCXJlYWRfc3ViYnVmID0gcmVhZF9wb3MgLyBzdWJidWZfc2l6ZTsKKwlyZWFkX29mZnNldCA9IHJlYWRfcG9zICUgc3ViYnVmX3NpemU7CisJcGFkZGluZyA9IGJ1Zi0+cGFkZGluZ1tyZWFkX3N1YmJ1Zl07CisKKwlpZiAocmVhZF9zdWJidWYgPT0gd3JpdGVfc3ViYnVmKSB7CisJCWlmIChyZWFkX29mZnNldCArIHBhZGRpbmcgPCB3cml0ZV9vZmZzZXQpCisJCQlhdmFpbCA9IHdyaXRlX29mZnNldCAtIChyZWFkX29mZnNldCArIHBhZGRpbmcpOworCX0gZWxzZQorCQlhdmFpbCA9IChzdWJidWZfc2l6ZSAtIHBhZGRpbmcpIC0gcmVhZF9vZmZzZXQ7CisKKwlyZXR1cm4gYXZhaWw7Cit9CisKKy8qKgorICoJcmVsYXlmc19yZWFkX3N0YXJ0X3BvcyAtIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBieXRlIHRvIHJlYWQKKyAqCisgKglJZiB0aGUgcmVhZF9wb3MgaXMgaW4gdGhlIG1pZGRsZSBvZiBwYWRkaW5nLCByZXR1cm4gdGhlCisgKglwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYWN0dWFsbHkgYXZhaWxhYmxlIGJ5dGUsIG90aGVyd2lzZQorICoJcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAqLworc3RhdGljIHNpemVfdCByZWxheWZzX3JlYWRfc3RhcnRfcG9zKHNpemVfdCByZWFkX3BvcywKKwkJCQkgICAgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3sKKwlzaXplX3QgcmVhZF9zdWJidWYsIHBhZGRpbmcsIHBhZGRpbmdfc3RhcnQsIHBhZGRpbmdfZW5kOworCXNpemVfdCBzdWJidWZfc2l6ZSA9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CisJc2l6ZV90IG5fc3ViYnVmcyA9IGJ1Zi0+Y2hhbi0+bl9zdWJidWZzOworCisJcmVhZF9zdWJidWYgPSByZWFkX3BvcyAvIHN1YmJ1Zl9zaXplOworCXBhZGRpbmcgPSBidWYtPnBhZGRpbmdbcmVhZF9zdWJidWZdOworCXBhZGRpbmdfc3RhcnQgPSAocmVhZF9zdWJidWYgKyAxKSAqIHN1YmJ1Zl9zaXplIC0gcGFkZGluZzsKKwlwYWRkaW5nX2VuZCA9IChyZWFkX3N1YmJ1ZiArIDEpICogc3ViYnVmX3NpemU7CisJaWYgKHJlYWRfcG9zID49IHBhZGRpbmdfc3RhcnQgJiYgcmVhZF9wb3MgPCBwYWRkaW5nX2VuZCkgeworCQlyZWFkX3N1YmJ1ZiA9IChyZWFkX3N1YmJ1ZiArIDEpICUgbl9zdWJidWZzOworCQlyZWFkX3BvcyA9IHJlYWRfc3ViYnVmICogc3ViYnVmX3NpemU7CisJfQorCisJcmV0dXJuIHJlYWRfcG9zOworfQorCisvKioKKyAqCXJlbGF5ZnNfcmVhZF9lbmRfcG9zIC0gcmV0dXJuIHRoZSBuZXcgcmVhZCBwb3NpdGlvbgorICovCitzdGF0aWMgc2l6ZV90IHJlbGF5ZnNfcmVhZF9lbmRfcG9zKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkgICBzaXplX3QgcmVhZF9wb3MsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCByZWFkX3N1YmJ1ZiwgcGFkZGluZywgZW5kX3BvczsKKwlzaXplX3Qgc3ViYnVmX3NpemUgPSBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplOworCXNpemVfdCBuX3N1YmJ1ZnMgPSBidWYtPmNoYW4tPm5fc3ViYnVmczsKKworCXJlYWRfc3ViYnVmID0gcmVhZF9wb3MgLyBzdWJidWZfc2l6ZTsKKwlwYWRkaW5nID0gYnVmLT5wYWRkaW5nW3JlYWRfc3ViYnVmXTsKKwlpZiAocmVhZF9wb3MgJSBzdWJidWZfc2l6ZSArIGNvdW50ICsgcGFkZGluZyA9PSBzdWJidWZfc2l6ZSkKKwkJZW5kX3BvcyA9IChyZWFkX3N1YmJ1ZiArIDEpICogc3ViYnVmX3NpemU7CisJZWxzZQorCQllbmRfcG9zID0gcmVhZF9wb3MgKyBjb3VudDsKKwlpZiAoZW5kX3BvcyA+PSBzdWJidWZfc2l6ZSAqIG5fc3ViYnVmcykKKwkJZW5kX3BvcyA9IDA7CisKKwlyZXR1cm4gZW5kX3BvczsKK30KKworLyoqCisgKglyZWxheWZzX3JlYWQgLSByZWFkIGZpbGUgb3AgZm9yIHJlbGF5ZnMgZmlsZXMKKyAqCUBmaWxwOiB0aGUgZmlsZQorICoJQGJ1ZmZlcjogdGhlIHVzZXJzcGFjZSBidWZmZXIKKyAqCUBjb3VudDogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCUBwcG9zOiBwb3NpdGlvbiB0byByZWFkIGZyb20KKyAqCisgKglSZWFkcyBjb3VudCBieXRlcyBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUKKyAqCWN1cnJlbnQgc3ViLWJ1ZmZlciBiZWluZyByZWFkLCB3aGljaGV2ZXIgaXMgc21hbGxlci4KKyAqLworc3RhdGljIHNzaXplX3QgcmVsYXlmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgc2l6ZV90IGNvdW50LAorCQkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCXNpemVfdCByZWFkX3N0YXJ0LCBhdmFpbDsKKwlzc2l6ZV90IHJldCA9IDA7CisJdm9pZCAqZnJvbTsKKworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJaWYoIXJlbGF5ZnNfcmVhZF9hdmFpbChidWYsICpwcG9zKSkKKwkJZ290byBvdXQ7CisKKwlyZWFkX3N0YXJ0ID0gcmVsYXlmc19yZWFkX3N0YXJ0X3BvcygqcHBvcywgYnVmKTsKKwlhdmFpbCA9IHJlbGF5ZnNfcmVhZF9zdWJidWZfYXZhaWwocmVhZF9zdGFydCwgYnVmKTsKKwlpZiAoIWF2YWlsKQorCQlnb3RvIG91dDsKKworCWZyb20gPSBidWYtPnN0YXJ0ICsgcmVhZF9zdGFydDsKKwlyZXQgPSBjb3VudCA9IG1pbihjb3VudCwgYXZhaWwpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBmcm9tLCBjb3VudCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCXJlbGF5ZnNfcmVhZF9jb25zdW1lKGJ1ZiwgcmVhZF9zdGFydCwgY291bnQpOworCSpwcG9zID0gcmVsYXlmc19yZWFkX2VuZF9wb3MoYnVmLCByZWFkX3N0YXJ0LCBjb3VudCk7CitvdXQ6CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglyZWxheWZzIGFsbG9jX2lub2RlKCkgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqcmVsYXlmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWxheWZzX2lub2RlX2luZm8gKnAgPSBrbWVtX2NhY2hlX2FsbG9jKHJlbGF5ZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKwlwLT5idWYgPSBOVUxMOworCisJcmV0dXJuICZwLT52ZnNfaW5vZGU7Cit9CisKKy8qKgorICoJcmVsYXlmcyBkZXN0cm95X2lub2RlKCkgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmVsYXlmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKFJFTEFZRlNfSShpbm9kZSktPmJ1ZikKKwkJcmVsYXlfZGVzdHJveV9idWYoUkVMQVlGU19JKGlub2RlKS0+YnVmKTsKKworCWttZW1fY2FjaGVfZnJlZShyZWxheWZzX2lub2RlX2NhY2hlcCwgUkVMQVlGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvICppID0gcDsKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRlkgfCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PSBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmaS0+dmZzX2lub2RlKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWxheWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSByZWxheWZzX29wZW4sCisJLnBvbGwJCT0gcmVsYXlmc19wb2xsLAorCS5tbWFwCQk9IHJlbGF5ZnNfbW1hcCwKKwkucmVhZAkJPSByZWxheWZzX3JlYWQsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlbGVhc2UJPSByZWxheWZzX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcmVsYXlmc19vcHMgPSB7CisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLmFsbG9jX2lub2RlCT0gcmVsYXlmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHJlbGF5ZnNfZGVzdHJveV9pbm9kZSwKK307CisKK3N0YXRpYyBpbnQgcmVsYXlmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJaW50IG1vZGUgPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPOworCisJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKKwlzYi0+c19tYWdpYyA9IFJFTEFZRlNfTUFHSUM7CisJc2ItPnNfb3AgPSAmcmVsYXlmc19vcHM7CisJaW5vZGUgPSByZWxheWZzX2dldF9pbm9kZShzYiwgbW9kZSwgTlVMTCk7CisKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCWlmICghcm9vdCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNiLT5zX3Jvb3QgPSByb290OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiByZWxheWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQkJICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgcmVsYXlmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJlbGF5ZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInJlbGF5ZnMiLAorCS5nZXRfc2IJCT0gcmVsYXlmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmVsYXlmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwlyZWxheWZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJyZWxheWZzX2lub2RlX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbyksIDAsCisJCQkJMCwgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoIXJlbGF5ZnNfaW5vZGVfY2FjaGVwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJlbGF5ZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJa21lbV9jYWNoZV9kZXN0cm95KHJlbGF5ZnNfaW5vZGVfY2FjaGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JlbGF5ZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJlbGF5ZnNfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHJlbGF5ZnNfaW5vZGVfY2FjaGVwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9yZWxheWZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9yZWxheWZzX2ZzKQorCitFWFBPUlRfU1lNQk9MX0dQTChyZWxheWZzX2ZpbGVfb3BlcmF0aW9ucyk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheWZzX2NyZWF0ZV9kaXIpOworRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlmc19yZW1vdmVfZGlyKTsKKworTU9EVUxFX0FVVEhPUigiVG9tIFphbnVzc2kgPHphbnVzc2lAdXMuaWJtLmNvbT4gYW5kIEthcmltIFlhZ2htb3VyIDxrYXJpbUBvcGVyc3lzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVsYXkgRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9mcy9yZWxheWZzL3JlbGF5LmMgYi9mcy9yZWxheWZzL3JlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0NDZhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlbGF5ZnMvcmVsYXkuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIFB1YmxpYyBBUEkgYW5kIGNvbW1vbiBjb2RlIGZvciBSZWxheUZTLgorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JlbGF5ZnMudHh0IGZvciBhbiBvdmVydmlldyBvZiByZWxheWZzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IC0gVG9tIFphbnVzc2kgKHphbnVzc2lAdXMuaWJtLmNvbSksIElCTSBDb3JwCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSAtIEthcmltIFlhZ2htb3VyIChrYXJpbUBvcGVyc3lzLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcmVsYXlmc19mcy5oPgorI2luY2x1ZGUgInJlbGF5LmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorCisvKioKKyAqCXJlbGF5X2J1Zl9lbXB0eSAtIGJvb2xlYW4sIGlzIHRoZSBjaGFubmVsIGJ1ZmZlciBlbXB0eT8KKyAqCUBidWY6IGNoYW5uZWwgYnVmZmVyCisgKgorICoJUmV0dXJucyAxIGlmIHRoZSBidWZmZXIgaXMgZW1wdHksIDAgb3RoZXJ3aXNlLgorICovCitpbnQgcmVsYXlfYnVmX2VtcHR5KHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3sKKwlyZXR1cm4gKGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCAtIGJ1Zi0+c3ViYnVmc19jb25zdW1lZCkgPyAwIDogMTsKK30KKworLyoqCisgKglyZWxheV9idWZfZnVsbCAtIGJvb2xlYW4sIGlzIHRoZSBjaGFubmVsIGJ1ZmZlciBmdWxsPworICoJQGJ1ZjogY2hhbm5lbCBidWZmZXIKKyAqCisgKglSZXR1cm5zIDEgaWYgdGhlIGJ1ZmZlciBpcyBmdWxsLCAwIG90aGVyd2lzZS4KKyAqLworaW50IHJlbGF5X2J1Zl9mdWxsKHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3sKKwlzaXplX3QgcmVhZHkgPSBidWYtPnN1YmJ1ZnNfcHJvZHVjZWQgLSBidWYtPnN1YmJ1ZnNfY29uc3VtZWQ7CisJcmV0dXJuIChyZWFkeSA+PSBidWYtPmNoYW4tPm5fc3ViYnVmcykgPyAxIDogMDsKK30KKworLyoKKyAqIEhpZ2gtbGV2ZWwgcmVsYXlmcyBrZXJuZWwgQVBJIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogcmNoYW5fY2FsbGJhY2sgaW1wbGVtZW50YXRpb25zIGRlZmluaW5nIGRlZmF1bHQgY2hhbm5lbCBiZWhhdmlvci4gIFVzZWQKKyAqIGluIHBsYWNlIG9mIGNvcnJlc3BvbmRpbmcgTlVMTCB2YWx1ZXMgaW4gY2xpZW50IGNhbGxiYWNrIHN0cnVjdC4KKyAqLworCisvKgorICogc3ViYnVmX3N0YXJ0KCkgZGVmYXVsdCBjYWxsYmFjay4gIERvZXMgbm90aGluZy4KKyAqLworc3RhdGljIGludCBzdWJidWZfc3RhcnRfZGVmYXVsdF9jYWxsYmFjayAoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJCQkgIHZvaWQgKnN1YmJ1ZiwKKwkJCQkJICB2b2lkICpwcmV2X3N1YmJ1ZiwKKwkJCQkJICBzaXplX3QgcHJldl9wYWRkaW5nKQoreworCWlmIChyZWxheV9idWZfZnVsbChidWYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogYnVmX21hcHBlZCgpIGRlZmF1bHQgY2FsbGJhY2suICBEb2VzIG5vdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGJ1Zl9tYXBwZWRfZGVmYXVsdF9jYWxsYmFjayhzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxwKQoreworfQorCisvKgorICogYnVmX3VubWFwcGVkKCkgZGVmYXVsdCBjYWxsYmFjay4gIERvZXMgbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQgYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2soc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxwKQoreworfQorCisvKiByZWxheSBjaGFubmVsIGRlZmF1bHQgY2FsbGJhY2tzICovCitzdGF0aWMgc3RydWN0IHJjaGFuX2NhbGxiYWNrcyBkZWZhdWx0X2NoYW5uZWxfY2FsbGJhY2tzID0geworCS5zdWJidWZfc3RhcnQgPSBzdWJidWZfc3RhcnRfZGVmYXVsdF9jYWxsYmFjaywKKwkuYnVmX21hcHBlZCA9IGJ1Zl9tYXBwZWRfZGVmYXVsdF9jYWxsYmFjaywKKwkuYnVmX3VubWFwcGVkID0gYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2ssCit9OworCisvKioKKyAqCXdha2V1cF9yZWFkZXJzIC0gd2FrZSB1cCByZWFkZXJzIHdhaXRpbmcgb24gYSBjaGFubmVsCisgKglAcHJpdmF0ZTogdGhlIGNoYW5uZWwgYnVmZmVyCisgKgorICoJVGhpcyBpcyB0aGUgd29yayBmdW5jdGlvbiB1c2VkIHRvIGRlZmVyIHJlYWRlciB3YWtpbmcuICBUaGUKKyAqCXJlYXNvbiB3YWtpbmcgaXMgZGVmZXJyZWQgaXMgdGhhdCBjYWxsaW5nIGRpcmVjdGx5IGZyb20gd3JpdGUKKyAqCWNhdXNlcyBwcm9ibGVtcyBpZiB5b3UncmUgd3JpdGluZyBmcm9tIHNheSB0aGUgc2NoZWR1bGVyLgorICovCitzdGF0aWMgdm9pZCB3YWtldXBfcmVhZGVycyh2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IHByaXZhdGU7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZidWYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJX19yZWxheV9yZXNldCAtIHJlc2V0IGEgY2hhbm5lbCBidWZmZXIKKyAqCUBidWY6IHRoZSBjaGFubmVsIGJ1ZmZlcgorICoJQGluaXQ6IDEgaWYgdGhpcyBpcyBhIGZpcnN0LXRpbWUgaW5pdGlhbGl6YXRpb24KKyAqCisgKglTZWUgcmVsYXlfcmVzZXQgZm9yIGRlc2NyaXB0aW9uIG9mIGVmZmVjdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fcmVsYXlfcmVzZXQoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgaW5pdCkKK3sKKwlzaXplX3QgaTsKKworCWlmIChpbml0KSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ1Zi0+cmVhZF93YWl0KTsKKwkJa3JlZl9pbml0KCZidWYtPmtyZWYpOworCQlJTklUX1dPUksoJmJ1Zi0+d2FrZV9yZWFkZXJzLCBOVUxMLCBOVUxMKTsKKwl9IGVsc2UgeworCQljYW5jZWxfZGVsYXllZF93b3JrKCZidWYtPndha2VfcmVhZGVycyk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorCisJYnVmLT5zdWJidWZzX3Byb2R1Y2VkID0gMDsKKwlidWYtPnN1YmJ1ZnNfY29uc3VtZWQgPSAwOworCWJ1Zi0+Ynl0ZXNfY29uc3VtZWQgPSAwOworCWJ1Zi0+ZmluYWxpemVkID0gMDsKKwlidWYtPmRhdGEgPSBidWYtPnN0YXJ0OworCWJ1Zi0+b2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBidWYtPmNoYW4tPm5fc3ViYnVmczsgaSsrKQorCQlidWYtPnBhZGRpbmdbaV0gPSAwOworCisJYnVmLT5jaGFuLT5jYi0+c3ViYnVmX3N0YXJ0KGJ1ZiwgYnVmLT5kYXRhLCBOVUxMLCAwKTsKK30KKworLyoqCisgKglyZWxheV9yZXNldCAtIHJlc2V0IHRoZSBjaGFubmVsCisgKglAY2hhbjogdGhlIGNoYW5uZWwKKyAqCisgKglUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGVyYXNpbmcgYWxsIGRhdGEgZnJvbSBhbGwgY2hhbm5lbCBidWZmZXJzCisgKglhbmQgcmVzdGFydGluZyB0aGUgY2hhbm5lbCBpbiBpdHMgaW5pdGlhbCBzdGF0ZS4gIFRoZSBidWZmZXJzCisgKglhcmUgbm90IGZyZWVkLCBzbyBhbnkgbWFwcGluZ3MgYXJlIHN0aWxsIGluIGVmZmVjdC4KKyAqCisgKglOT1RFOiBDYXJlIHNob3VsZCBiZSB0YWtlbiB0aGF0IHRoZSBjaGFubmVsIGlzbid0IGFjdHVhbGx5CisgKgliZWluZyB1c2VkIGJ5IGFueXRoaW5nIHdoZW4gdGhpcyBjYWxsIGlzIG1hZGUuCisgKi8KK3ZvaWQgcmVsYXlfcmVzZXQoc3RydWN0IHJjaGFuICpjaGFuKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFjaGFuKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY2hhbi0+YnVmW2ldKQorCQkJY29udGludWU7CisJCV9fcmVsYXlfcmVzZXQoY2hhbi0+YnVmW2ldLCAwKTsKKwl9Cit9CisKKy8qKgorICoJcmVsYXlfb3Blbl9idWYgLSBjcmVhdGUgYSBuZXcgY2hhbm5lbCBidWZmZXIgaW4gcmVsYXlmcworICoKKyAqCUludGVybmFsIC0gdXNlZCBieSByZWxheV9vcGVuKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmNoYW5fYnVmICpyZWxheV9vcGVuX2J1ZihzdHJ1Y3QgcmNoYW4gKmNoYW4sCisJCQkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCS8qIENyZWF0ZSBmaWxlIGluIGZzICovCisJZGVudHJ5ID0gcmVsYXlmc19jcmVhdGVfZmlsZShmaWxlbmFtZSwgcGFyZW50LCBTX0lSVVNSLCBjaGFuKTsKKwlpZiAoIWRlbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlidWYgPSBSRUxBWUZTX0koZGVudHJ5LT5kX2lub2RlKS0+YnVmOworCWJ1Zi0+ZGVudHJ5ID0gZGVudHJ5OworCV9fcmVsYXlfcmVzZXQoYnVmLCAxKTsKKworCXJldHVybiBidWY7Cit9CisKKy8qKgorICoJcmVsYXlfY2xvc2VfYnVmIC0gY2xvc2UgYSBjaGFubmVsIGJ1ZmZlcgorICoJQGJ1ZjogY2hhbm5lbCBidWZmZXIKKyAqCisgKglNYXJrcyB0aGUgYnVmZmVyIGZpbmFsaXplZCBhbmQgcmVzdG9yZXMgdGhlIGRlZmF1bHQgY2FsbGJhY2tzLgorICoJVGhlIGNoYW5uZWwgYnVmZmVyIGFuZCBjaGFubmVsIGJ1ZmZlciBkYXRhIHN0cnVjdHVyZSBhcmUgdGhlbiBmcmVlZAorICoJYXV0b21hdGljYWxseSB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBnaXZlbiB1cC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlbGF5X2Nsb3NlX2J1ZihzdHJ1Y3QgcmNoYW5fYnVmICpidWYpCit7CisJYnVmLT5maW5hbGl6ZWQgPSAxOworCWJ1Zi0+Y2hhbi0+Y2IgPSAmZGVmYXVsdF9jaGFubmVsX2NhbGxiYWNrczsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZidWYtPndha2VfcmVhZGVycyk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlrcmVmX3B1dCgmYnVmLT5rcmVmLCByZWxheV9yZW1vdmVfYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2NhbGxiYWNrcyhzdHJ1Y3QgcmNoYW4gKmNoYW4sCisJCQkJICAgc3RydWN0IHJjaGFuX2NhbGxiYWNrcyAqY2IpCit7CisJaWYgKCFjYikgeworCQljaGFuLT5jYiA9ICZkZWZhdWx0X2NoYW5uZWxfY2FsbGJhY2tzOworCQlyZXR1cm47CisJfQorCisJaWYgKCFjYi0+c3ViYnVmX3N0YXJ0KQorCQljYi0+c3ViYnVmX3N0YXJ0ID0gc3ViYnVmX3N0YXJ0X2RlZmF1bHRfY2FsbGJhY2s7CisJaWYgKCFjYi0+YnVmX21hcHBlZCkKKwkJY2ItPmJ1Zl9tYXBwZWQgPSBidWZfbWFwcGVkX2RlZmF1bHRfY2FsbGJhY2s7CisJaWYgKCFjYi0+YnVmX3VubWFwcGVkKQorCQljYi0+YnVmX3VubWFwcGVkID0gYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2s7CisJY2hhbi0+Y2IgPSBjYjsKK30KKworLyoqCisgKglyZWxheV9vcGVuIC0gY3JlYXRlIGEgbmV3IHJlbGF5ZnMgY2hhbm5lbAorICoJQGJhc2VfZmlsZW5hbWU6IGJhc2UgbmFtZSBvZiBmaWxlcyB0byBjcmVhdGUKKyAqCUBwYXJlbnQ6IGRlbnRyeSBvZiBwYXJlbnQgZGlyZWN0b3J5LCBOVUxMIGZvciByb290IGRpcmVjdG9yeQorICoJQHN1YmJ1Zl9zaXplOiBzaXplIG9mIHN1Yi1idWZmZXJzCisgKglAbl9zdWJidWZzOiBudW1iZXIgb2Ygc3ViLWJ1ZmZlcnMKKyAqCUBjYjogY2xpZW50IGNhbGxiYWNrIGZ1bmN0aW9ucworICoKKyAqCVJldHVybnMgY2hhbm5lbCBwb2ludGVyIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgorICoKKyAqCUNyZWF0ZXMgYSBjaGFubmVsIGJ1ZmZlciBmb3IgZWFjaCBjcHUgdXNpbmcgdGhlIHNpemVzIGFuZAorICoJYXR0cmlidXRlcyBzcGVjaWZpZWQuICBUaGUgY3JlYXRlZCBjaGFubmVsIGJ1ZmZlciBmaWxlcworICoJd2lsbCBiZSBuYW1lZCBiYXNlX2ZpbGVuYW1lMC4uLmJhc2VfZmlsZW5hbWVOLTEuICBGaWxlCisgKglwZXJtaXNzaW9ucyB3aWxsIGJlIFNfSVJVU1IuCisgKi8KK3N0cnVjdCByY2hhbiAqcmVsYXlfb3Blbihjb25zdCBjaGFyICpiYXNlX2ZpbGVuYW1lLAorCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCSBzaXplX3Qgc3ViYnVmX3NpemUsCisJCQkgc2l6ZV90IG5fc3ViYnVmcywKKwkJCSBzdHJ1Y3QgcmNoYW5fY2FsbGJhY2tzICpjYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcmNoYW4gKmNoYW47CisJY2hhciAqdG1wbmFtZTsKKworCWlmICghYmFzZV9maWxlbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShzdWJidWZfc2l6ZSAmJiBuX3N1YmJ1ZnMpKQorCQlyZXR1cm4gTlVMTDsKKworCWNoYW4gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmNoYW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBOVUxMOworCisJY2hhbi0+dmVyc2lvbiA9IFJFTEFZRlNfQ0hBTk5FTF9WRVJTSU9OOworCWNoYW4tPm5fc3ViYnVmcyA9IG5fc3ViYnVmczsKKwljaGFuLT5zdWJidWZfc2l6ZSA9IHN1YmJ1Zl9zaXplOworCWNoYW4tPmFsbG9jX3NpemUgPSBGSVhfU0laRShzdWJidWZfc2l6ZSAqIG5fc3ViYnVmcyk7CisJc2V0dXBfY2FsbGJhY2tzKGNoYW4sIGNiKTsKKwlrcmVmX2luaXQoJmNoYW4tPmtyZWYpOworCisJdG1wbmFtZSA9IGttYWxsb2MoTkFNRV9NQVggKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcG5hbWUpCisJCWdvdG8gZnJlZV9jaGFuOworCisJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCXNwcmludGYodG1wbmFtZSwgIiVzJWQiLCBiYXNlX2ZpbGVuYW1lLCBpKTsKKwkJY2hhbi0+YnVmW2ldID0gcmVsYXlfb3Blbl9idWYoY2hhbiwgdG1wbmFtZSwgcGFyZW50KTsKKwkJY2hhbi0+YnVmW2ldLT5jcHUgPSBpOworCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJCWdvdG8gZnJlZV9idWZzOworCX0KKworCWtmcmVlKHRtcG5hbWUpOworCXJldHVybiBjaGFuOworCitmcmVlX2J1ZnM6CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJCWJyZWFrOworCQlyZWxheV9jbG9zZV9idWYoY2hhbi0+YnVmW2ldKTsKKwl9CisJa2ZyZWUodG1wbmFtZSk7CisKK2ZyZWVfY2hhbjoKKwlrcmVmX3B1dCgmY2hhbi0+a3JlZiwgcmVsYXlfZGVzdHJveV9jaGFubmVsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyZWxheV9zd2l0Y2hfc3ViYnVmIC0gc3dpdGNoIHRvIGEgbmV3IHN1Yi1idWZmZXIKKyAqCUBidWY6IGNoYW5uZWwgYnVmZmVyCisgKglAbGVuZ3RoOiBzaXplIG9mIGN1cnJlbnQgZXZlbnQKKyAqCisgKglSZXR1cm5zIGVpdGhlciB0aGUgbGVuZ3RoIHBhc3NlZCBpbiBvciAwIGlmIGZ1bGwuCisKKyAqCVBlcmZvcm1zIHN1Yi1idWZmZXItc3dpdGNoIHRhc2tzIHN1Y2ggYXMgaW52b2tpbmcgY2FsbGJhY2tzLAorICoJdXBkYXRpbmcgcGFkZGluZyBjb3VudHMsIHdha2luZyB1cCByZWFkZXJzLCBldGMuCisgKi8KK3NpemVfdCByZWxheV9zd2l0Y2hfc3ViYnVmKHN0cnVjdCByY2hhbl9idWYgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKK3sKKwl2b2lkICpvbGQsICpuZXc7CisJc2l6ZV90IG9sZF9zdWJidWYsIG5ld19zdWJidWY7CisKKwlpZiAodW5saWtlbHkobGVuZ3RoID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpCisJCWdvdG8gdG9vYmlnOworCisJaWYgKGJ1Zi0+b2Zmc2V0ICE9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUgKyAxKSB7CisJCWJ1Zi0+cHJldl9wYWRkaW5nID0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSAtIGJ1Zi0+b2Zmc2V0OworCQlvbGRfc3ViYnVmID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkICUgYnVmLT5jaGFuLT5uX3N1YmJ1ZnM7CisJCWJ1Zi0+cGFkZGluZ1tvbGRfc3ViYnVmXSA9IGJ1Zi0+cHJldl9wYWRkaW5nOworCQlidWYtPnN1YmJ1ZnNfcHJvZHVjZWQrKzsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJ1Zi0+cmVhZF93YWl0KSkgeworCQkJUFJFUEFSRV9XT1JLKCZidWYtPndha2VfcmVhZGVycywgd2FrZXVwX3JlYWRlcnMsIGJ1Zik7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJ1Zi0+d2FrZV9yZWFkZXJzLCAxKTsKKwkJfQorCX0KKworCW9sZCA9IGJ1Zi0+ZGF0YTsKKwluZXdfc3ViYnVmID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkICUgYnVmLT5jaGFuLT5uX3N1YmJ1ZnM7CisJbmV3ID0gYnVmLT5zdGFydCArIG5ld19zdWJidWYgKiBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplOworCWJ1Zi0+b2Zmc2V0ID0gMDsKKwlpZiAoIWJ1Zi0+Y2hhbi0+Y2ItPnN1YmJ1Zl9zdGFydChidWYsIG5ldywgb2xkLCBidWYtPnByZXZfcGFkZGluZykpIHsKKwkJYnVmLT5vZmZzZXQgPSBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCWJ1Zi0+ZGF0YSA9IG5ldzsKKwlidWYtPnBhZGRpbmdbbmV3X3N1YmJ1Zl0gPSAwOworCisJaWYgKHVubGlrZWx5KGxlbmd0aCArIGJ1Zi0+b2Zmc2V0ID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpCisJCWdvdG8gdG9vYmlnOworCisJcmV0dXJuIGxlbmd0aDsKKwordG9vYmlnOgorCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGF5ZnM6IGV2ZW50IHRvbyBsYXJnZSAoJVpkKVxuIiwgbGVuZ3RoKTsKKwlXQVJOX09OKDEpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXJlbGF5X3N1YmJ1ZnNfY29uc3VtZWQgLSB1cGRhdGUgdGhlIGJ1ZmZlcidzIHN1Yi1idWZmZXJzLWNvbnN1bWVkIGNvdW50CisgKglAY2hhbjogdGhlIGNoYW5uZWwKKyAqCUBjcHU6IHRoZSBjcHUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFubmVsIGJ1ZmZlciB0byB1cGRhdGUKKyAqCUBzdWJidWZzX2NvbnN1bWVkOiBudW1iZXIgb2Ygc3ViLWJ1ZmZlcnMgdG8gYWRkIHRvIGN1cnJlbnQgYnVmJ3MgY291bnQKKyAqCisgKglBZGRzIHRvIHRoZSBjaGFubmVsIGJ1ZmZlcidzIGNvbnN1bWVkIHN1Yi1idWZmZXIgY291bnQuCisgKglzdWJidWZzX2NvbnN1bWVkIHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIHN1Yi1idWZmZXJzIG5ld2x5IGNvbnN1bWVkLAorICoJbm90IHRoZSB0b3RhbCBjb25zdW1lZC4KKyAqCisgKglOT1RFOiBrZXJuZWwgY2xpZW50cyBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGUgY2hhbm5lbAorICoJbW9kZSBpcyAnb3ZlcndyaXRlJy4KKyAqLwordm9pZCByZWxheV9zdWJidWZzX2NvbnN1bWVkKHN0cnVjdCByY2hhbiAqY2hhbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY3B1LAorCQkJICAgIHNpemVfdCBzdWJidWZzX2NvbnN1bWVkKQoreworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKKworCWlmICghY2hhbikKKwkJcmV0dXJuOworCisJaWYgKGNwdSA+PSBOUl9DUFVTIHx8ICFjaGFuLT5idWZbY3B1XSkKKwkJcmV0dXJuOworCisJYnVmID0gY2hhbi0+YnVmW2NwdV07CisJYnVmLT5zdWJidWZzX2NvbnN1bWVkICs9IHN1YmJ1ZnNfY29uc3VtZWQ7CisJaWYgKGJ1Zi0+c3ViYnVmc19jb25zdW1lZCA+IGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCkKKwkJYnVmLT5zdWJidWZzX2NvbnN1bWVkID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkOworfQorCisvKioKKyAqCXJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCAtIGZyZWUgdGhlIGNoYW5uZWwgc3RydWN0CisgKgorICoJU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20ga3JlZl9wdXQoKS4KKyAqLwordm9pZCByZWxheV9kZXN0cm95X2NoYW5uZWwoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHJjaGFuICpjaGFuID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCByY2hhbiwga3JlZik7CisJa2ZyZWUoY2hhbik7Cit9CisKKy8qKgorICoJcmVsYXlfY2xvc2UgLSBjbG9zZSB0aGUgY2hhbm5lbAorICoJQGNoYW46IHRoZSBjaGFubmVsCisgKgorICoJQ2xvc2VzIGFsbCBjaGFubmVsIGJ1ZmZlcnMgYW5kIGZyZWVzIHRoZSBjaGFubmVsLgorICovCit2b2lkIHJlbGF5X2Nsb3NlKHN0cnVjdCByY2hhbiAqY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghY2hhbikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJCWNvbnRpbnVlOworCQlyZWxheV9jbG9zZV9idWYoY2hhbi0+YnVmW2ldKTsKKwl9CisKKwlrcmVmX3B1dCgmY2hhbi0+a3JlZiwgcmVsYXlfZGVzdHJveV9jaGFubmVsKTsKK30KKworLyoqCisgKglyZWxheV9mbHVzaCAtIGNsb3NlIHRoZSBjaGFubmVsCisgKglAY2hhbjogdGhlIGNoYW5uZWwKKyAqCisgKglGbHVzaGVzIGFsbCBjaGFubmVsIGJ1ZmZlcnMgaS5lLiBmb3JjZXMgYnVmZmVyIHN3aXRjaC4KKyAqLwordm9pZCByZWxheV9mbHVzaChzdHJ1Y3QgcmNoYW4gKmNoYW4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWNoYW4pCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjaGFuLT5idWZbaV0pCisJCQljb250aW51ZTsKKwkJcmVsYXlfc3dpdGNoX3N1YmJ1ZihjaGFuLT5idWZbaV0sIDApOworCX0KK30KKworRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlfb3Blbik7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9jbG9zZSk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9mbHVzaCk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9yZXNldCk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9zdWJidWZzX2NvbnN1bWVkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJlbGF5X3N3aXRjaF9zdWJidWYpOworRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlfYnVmX2Z1bGwpOwpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9yZWxheS5oIGIvZnMvcmVsYXlmcy9yZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzUwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWxheWZzL3JlbGF5LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfUkVMQVlfSAorI2RlZmluZSBfUkVMQVlfSAorCitzdHJ1Y3QgZGVudHJ5ICpyZWxheWZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSAgIGludCBtb2RlLAorCQkJCSAgIHN0cnVjdCByY2hhbiAqY2hhbik7CitleHRlcm4gaW50IHJlbGF5ZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IHJlbGF5X2J1Zl9lbXB0eShzdHJ1Y3QgcmNoYW5fYnVmICpidWYpOworZXh0ZXJuIHZvaWQgcmVsYXlfZGVzdHJveV9jaGFubmVsKHN0cnVjdCBrcmVmICprcmVmKTsKKworI2VuZGlmIC8qIF9SRUxBWV9IICovCmRpZmYgLS1naXQgYS9mcy9zZWxlY3QuYyBiL2ZzL3NlbGVjdC5jCmluZGV4IGI4MGU3ZWIuLmYxMGExMDMgMTAwNjQ0Ci0tLSBhL2ZzL3NlbGVjdC5jCisrKyBiL2ZzL3NlbGVjdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4gLyogZm9yIFNUSUNLWV9USU1FT1VUUyAqLwogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0xMzIsMTEgKzEzMywxMyBAQAogCXVuc2lnbmVkIGxvbmcgKm9wZW5fZmRzOwogCXVuc2lnbmVkIGxvbmcgc2V0OwogCWludCBtYXg7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKIAogCS8qIGhhbmRsZSBsYXN0IGluLWNvbXBsZXRlIGxvbmctd29yZCBmaXJzdCAqLwogCXNldCA9IH4ofjBVTCA8PCAobiAmIChfX05GREJJVFMtMSkpKTsKIAluIC89IF9fTkZEQklUUzsKLQlvcGVuX2ZkcyA9IGN1cnJlbnQtPmZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMrbjsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKKwlvcGVuX2ZkcyA9IGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzK247CiAJbWF4ID0gMDsKIAlpZiAoc2V0KSB7CiAJCXNldCAmPSBCSVRTKGZkcywgbik7CkBAIC0xODMsOSArMTg2LDkgQEAKIAlpbnQgcmV0dmFsLCBpOwogCWxvbmcgX190aW1lb3V0ID0gKnRpbWVvdXQ7CiAKLSAJc3Bpbl9sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJcmV0dmFsID0gbWF4X3NlbGVjdF9mZChuLCBmZHMpOwotCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMjk5LDYgKzMwMiw3IEBACiAJY2hhciAqYml0czsKIAlsb25nIHRpbWVvdXQ7CiAJaW50IHJldCwgc2l6ZSwgbWF4X2Zkc2V0OworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKIAl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJaWYgKHR2cCkgewpAQCAtMzI2LDcgKzMzMCwxMCBAQAogCQlnb3RvIG91dF9ub2ZkczsKIAogCS8qIG1heF9mZHNldCBjYW4gaW5jcmVhc2UsIHNvIGdyYWIgaXQgb25jZSB0byBhdm9pZCByYWNlICovCi0JbWF4X2Zkc2V0ID0gY3VycmVudC0+ZmlsZXMtPm1heF9mZHNldDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJbWF4X2Zkc2V0ID0gZmR0LT5tYXhfZmRzZXQ7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKG4gPiBtYXhfZmRzZXQpCiAJCW4gPSBtYXhfZmRzZXQ7CiAKQEAgLTQ2NCw5ICs0NzEsMTUgQEAKICAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHBvbGxfbGlzdCAqaGVhZDsKICAJc3RydWN0IHBvbGxfbGlzdCAqd2FsazsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCWludCBtYXhfZmRzZXQ7CiAKIAkvKiBEbyBhIHNhbml0eSBjaGVjayBvbiBuZmRzIC4uLiAqLwotCWlmIChuZmRzID4gY3VycmVudC0+ZmlsZXMtPm1heF9mZHNldCAmJiBuZmRzID4gT1BFTl9NQVgpCisJcmN1X3JlYWRfbG9jaygpOworCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOworCW1heF9mZHNldCA9IGZkdC0+bWF4X2Zkc2V0OworCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChuZmRzID4gbWF4X2Zkc2V0ICYmIG5mZHMgPiBPUEVOX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodGltZW91dCkgewpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW5vZGUuYyBiL2ZzL3NtYmZzL2lub2RlLmMKaW5kZXggNDc2NWFhYS4uMTBiOTk0NCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvaW5vZGUuYworKysgYi9mcy9zbWJmcy9pbm9kZS5jCkBAIC0zMzEsNiArMzMxLDcgQEAKIHNtYl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCiB7CiAJREVCVUcxKCJpbm89JWxkXG4iLCBpbm8tPmlfaW5vKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vLT5pX2RhdGEsIDApOwogCWxvY2tfa2VybmVsKCk7CiAJaWYgKHNtYl9jbG9zZShpbm8pKQogCQlQQVJBTk9JQSgiY291bGQgbm90IGNsb3NlIGlub2RlICVsZFxuIiwgaW5vLT5pX2lubyk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm9jLmMgYi9mcy9zbWJmcy9wcm9jLmMKaW5kZXggMjIwYmFiZS4uMzhhYjU1OCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcHJvYy5jCisrKyBiL2ZzL3NtYmZzL3Byb2MuYwpAQCAtMjM5Nyw4ICsyMzk3LDcgQEAKIAkJaWYgKHJlcS0+cnFfcmNscyA9PSBFUlJTUlYgJiYgcmVxLT5ycV9lcnIgPT0gRVJSZXJyb3IpIHsKIAkJCS8qIGEgZGFtbiBXaW45NSBidWcgLSBzb21ldGltZXMgaXQgY2xhZ3MgaWYgeW91IAogCQkJICAgYXNrIGl0IHRvbyBmYXN0ICovCi0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoSFovNSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygyMDApKTsKIAkJCWNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZnMvc3lzdi9pbm9kZS5jIGIvZnMvc3lzdi9pbm9kZS5jCmluZGV4IDA1MzAwNzcuLmZhMzNlY2UgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3YvaW5vZGUuYworKysgYi9mcy9zeXN2L2lub2RlLmMKQEAgLTI5Miw2ICsyOTIsNyBAQAogCiBzdGF0aWMgdm9pZCBzeXN2X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAlpbm9kZS0+aV9zaXplID0gMDsKIAlzeXN2X3RydW5jYXRlKGlub2RlKTsKIAlsb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwppbmRleCAzZDY4ZGUzLi5iODM4OTBiIDEwMDY0NAotLS0gYS9mcy91ZGYvaW5vZGUuYworKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtODcsNiArODcsOCBAQAogICovCiB2b2lkIHVkZl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCiB7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCWdvdG8gbm9fZGVsZXRlOwogCmRpZmYgLS1naXQgYS9mcy91ZnMvYmFsbG9jLmMgYi9mcy91ZnMvYmFsbG9jLmMKaW5kZXggOTk3NjQwYy4uZmFmMTUxMiAxMDA2NDQKLS0tIGEvZnMvdWZzL2JhbGxvYy5jCisrKyBiL2ZzL3Vmcy9iYWxsb2MuYwpAQCAtMTE0LDggKzExNCw3IEBACiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CiAJfQogCXNiLT5zX2RpcnQgPSAxOwpAQCAtMjAwLDggKzE5OSw3IEBACiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CiAJfQogCkBAIC00NTksOCArNDU3LDcgQEAKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKLQkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CkBAIC01ODUsOCArNTgyLDcgQEAKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKLQkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggNjFhNmIxNS4uMDkzODk0NSAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtMTI0LDggKzEyNCw3IEBACiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CiAJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7CisJCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikgJnVjcGkpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKIAl9CiAJCkBAIC0yNDksOCArMjQ4LDcgQEAKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKIAl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKLQkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopICZ1Y3BpKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7CiAJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOwogCX0KIAlzYi0+c19kaXJ0ID0gMTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pbm9kZS5jIGIvZnMvdWZzL2lub2RlLmMKaW5kZXggNzE4NjI3Yy4uNTVmNGFhMSAxMDA2NDQKLS0tIGEvZnMvdWZzL2lub2RlLmMKKysrIGIvZnMvdWZzL2lub2RlLmMKQEAgLTgwNCw2ICs4MDQsNyBAQAogCiB2b2lkIHVmc19kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQogeworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAkvKlVGU19JKGlub2RlKS0+aV9kdGltZSA9IENVUlJFTlRfVElNRTsqLwogCWxvY2tfa2VybmVsKCk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy91ZnMvdHJ1bmNhdGUuYyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCmluZGV4IGUzMTJiZjguLjYxZDJlMzUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy90cnVuY2F0ZS5jCisrKyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCkBAIC0yODUsOCArMjg1LDcgQEAKIAkJfQogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgaW5kX3ViaCAmJiB1YmhfYnVmZmVyX2RpcnR5KGluZF91YmgpKSB7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoaW5kX3ViaCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZpbmRfdWJoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZpbmRfdWJoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChpbmRfdWJoKTsKIAl9CiAJdWJoX2JyZWxzZSAoaW5kX3ViaCk7CkBAIC0zNTMsOCArMzUyLDcgQEAKIAkJfQogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgZGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KGRpbmRfYmgpKSB7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoZGluZF9iaCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZkaW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZkaW5kX2JoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChkaW5kX2JoKTsKIAl9CiAJdWJoX2JyZWxzZSAoZGluZF9iaCk7CkBAIC00MTgsOCArNDE2LDcgQEAKIAkJfQogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgdGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KHRpbmRfYmgpKSB7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAodGluZF9iaCk7Ci0JCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZ0aW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZ0aW5kX2JoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyICh0aW5kX2JoKTsKIAl9CiAJdWJoX2JyZWxzZSAodGluZF9iaCk7CmRpZmYgLS1naXQgYS9mcy91bXNkb3Mvbm90ZXMgYi9mcy91bXNkb3Mvbm90ZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDdkMWYuLjAwMDAwMDAKLS0tIGEvZnMvdW1zZG9zL25vdGVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotVGhpcyBmaWxlIGNvbnRhaW4gaWRlYSBhbmQgdGhpbmdzIEkgZG9uJ3Qgd2FudCB0byBmb3JnZXQKLQotUG9zc2libGUgYnVnIGluIGZzL3JlYWRfd3JpdGUuYwotRnVuY3Rpb24gc3lzX3JlYWRkaXIoKQotCi0JVGhlcmUgaXMgYSBjYWxsIHRoZSB2ZXJpZnlfYXJlYSB0aGF0IGRvZXMgbm90IHRha2UgaW4gYWNjb3VudAotCXRoZSBjb3VudCBwYXJhbWV0ZXIuIEkgZ3Vlc3MgaXQgc2hvdWxkIHJlYWQKLQotCWVycm9yID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLCBkaXJlbnQsIGNvdW50KnNpemVvZiAoKmRpcmVudCkpOwotCi0JaW5zdGVhZCBvZgotCi0JZXJyb3IgPSB2ZXJpZnlfYXJlYShWRVJJRllfV1JJVEUsIGRpcmVudCwgc2l6ZW9mICgqZGlyZW50KSk7Ci0KLQlPZiBjb3Vyc2UsIG5vdyAsIGNvdW50IGlzIGFsd2F5cyAxCi0KLQpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggZGM4YmM3Ni4uM2Y5YzY0YiAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0zMjUsNiArMzI1LDggQEAKIAkJZG93bigmZC0+ZF9pbm9kZS0+aV9zZW0pOwogCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKGQsIGtuYW1lKTsKIAkJdXAoJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwkJaWYgKCFlcnJvcikKKwkJCWZzbm90aWZ5X3hhdHRyKGQpOwogCX0KIG91dDoKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMvS2NvbmZpZyBiL2ZzL3hmcy9LY29uZmlnCmluZGV4IGM5MjMwNmYuLjhlOGYzMmQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9LY29uZmlnCisrKyBiL2ZzL3hmcy9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotbWVudSAiWEZTIHN1cHBvcnQiCi0KIGNvbmZpZyBYRlNfRlMKIAl0cmlzdGF0ZSAiWEZTIGZpbGVzeXN0ZW0gc3VwcG9ydCIKIAlzZWxlY3QgRVhQT1JURlMgaWYgTkZTRCE9bgpAQCAtMjIsMjcgKzIwLDExIEBACiAKIGNvbmZpZyBYRlNfRVhQT1JUCiAJYm9vbAotCWRlZmF1bHQgeSBpZiBYRlNfRlMgJiYgRVhQT1JURlMKLQotY29uZmlnIFhGU19SVAotCWJvb2wgIlJlYWx0aW1lIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBYRlNfRlMgJiYgRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgYmUgYWJsZSB0byBtb3VudCBhbmQgdXNlIFhGUyBmaWxlc3lzdGVtcwotCSAgd2hpY2ggY29udGFpbiBhIHJlYWx0aW1lIHN1YnZvbHVtZS4gVGhlIHJlYWx0aW1lIHN1YnZvbHVtZSBpcyBhCi0JICBzZXBhcmF0ZSBhcmVhIG9mIGRpc2sgc3BhY2Ugd2hlcmUgb25seSBmaWxlIGRhdGEgaXMgc3RvcmVkLiBUaGUKLQkgIHJlYWx0aW1lIHN1YnZvbHVtZSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIHZlcnkgZGV0ZXJtaW5pc3RpYwotCSAgZGF0YSByYXRlcyBzdWl0YWJsZSBmb3IgbWVkaWEgc3RyZWFtaW5nIGFwcGxpY2F0aW9ucy4KLQotCSAgU2VlIHRoZSB4ZnMgbWFuIHBhZ2UgaW4gc2VjdGlvbiA1IGZvciBhIGJpdCBtb3JlIGluZm9ybWF0aW9uLgotCi0JICBUaGlzIGZlYXR1cmUgaXMgdW5zdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLCBpcyBub3QgeWV0IGZ1bGx5Ci0JICBmdW5jdGlvbmFsLCBhbmQgbWF5IGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCisJZGVwZW5kcyBvbiBYRlNfRlMgJiYgRVhQT1JURlMKKwlkZWZhdWx0IHkKIAogY29uZmlnIFhGU19RVU9UQQotCWJvb2wgIlF1b3RhIHN1cHBvcnQiCisJdHJpc3RhdGUgIlhGUyBRdW90YSBzdXBwb3J0IgogCWRlcGVuZHMgb24gWEZTX0ZTCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc2V0IGxpbWl0cyBmb3IgZGlzayB1c2FnZSBvbgpAQCAtNTksNyArNDEsNyBAQAogCSAgdGhleSBhcmUgY29tcGxldGVseSBpbmRlcGVuZGVudCBzdWJzeXN0ZW1zLgogCiBjb25maWcgWEZTX1NFQ1VSSVRZCi0JYm9vbCAiU2VjdXJpdHkgTGFiZWwgc3VwcG9ydCIKKwlib29sICJYRlMgU2VjdXJpdHkgTGFiZWwgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFhGU19GUwogCWhlbHAKIAkgIFNlY3VyaXR5IGxhYmVscyBzdXBwb3J0IGFsdGVybmF0aXZlIGFjY2VzcyBjb250cm9sIG1vZGVscwpAQCAtNzEsNyArNTMsNyBAQAogCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgaW5vZGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KIAogY29uZmlnIFhGU19QT1NJWF9BQ0wKLQlib29sICJQT1NJWCBBQ0wgc3VwcG9ydCIKKwlib29sICJYRlMgUE9TSVggQUNMIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBYRlNfRlMKIAloZWxwCiAJICBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCkBAIC04Miw0ICs2NCwxOSBAQAogCiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4uCiAKLWVuZG1lbnUKK2NvbmZpZyBYRlNfUlQKKwlib29sICJYRlMgUmVhbHRpbWUgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFhGU19GUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1vdW50IGFuZCB1c2UgWEZTIGZpbGVzeXN0ZW1zCisJICB3aGljaCBjb250YWluIGEgcmVhbHRpbWUgc3Vidm9sdW1lLiBUaGUgcmVhbHRpbWUgc3Vidm9sdW1lIGlzIGEKKwkgIHNlcGFyYXRlIGFyZWEgb2YgZGlzayBzcGFjZSB3aGVyZSBvbmx5IGZpbGUgZGF0YSBpcyBzdG9yZWQuIFRoZQorCSAgcmVhbHRpbWUgc3Vidm9sdW1lIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgdmVyeSBkZXRlcm1pbmlzdGljCisJICBkYXRhIHJhdGVzIHN1aXRhYmxlIGZvciBtZWRpYSBzdHJlYW1pbmcgYXBwbGljYXRpb25zLgorCisJICBTZWUgdGhlIHhmcyBtYW4gcGFnZSBpbiBzZWN0aW9uIDUgZm9yIGEgYml0IG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIFRoaXMgZmVhdHVyZSBpcyB1bnN1cHBvcnRlZCBhdCB0aGlzIHRpbWUsIGlzIG5vdCB5ZXQgZnVsbHkKKwkgIGZ1bmN0aW9uYWwsIGFuZCBtYXkgY2F1c2Ugc2VyaW91cyBwcm9ibGVtcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy9NYWtlZmlsZSBiL2ZzL3hmcy9NYWtlZmlsZQppbmRleCBkM2ZmNzgzLi40OWUzZTdlIDEwMDY0NAotLS0gYS9mcy94ZnMvTWFrZWZpbGUKKysrIGIvZnMveGZzL01ha2VmaWxlCkBAIC0xLDE1MCArMSBAQAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0jCi0jIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotIyBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSMgb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgotIyBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0jIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSMgb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0jIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0jIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKLSMgTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKLSMKLSMgaHR0cDovL3d3dy5zZ2kuY29tCi0jCi0jIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgotIwotIyBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCi0jCi0KLUVYVFJBX0NGTEFHUyArPQkgLUlmcy94ZnMgLUlmcy94ZnMvbGludXgtMi42IC1mdW5zaWduZWQtY2hhcgotCi1pZmVxICgkKENPTkZJR19YRlNfREVCVUcpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1nIC1EU1RBVElDPSIiIC1EREVCVUcKLQlFWFRSQV9DRkxBR1MgKz0gLURQQUdFQlVGX0xPQ0tfVFJBQ0tJTkcKLWVuZGlmCi1pZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FMTE9DX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FUVFJfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQkxJX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQVBfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQk1CVF9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19ESVJfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRElSMl9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19EUVVPVF9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19JTE9DS19UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19MT0dfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfUldfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURQQUdFQlVGX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1ZOT0RFX1RSQUNFCi1lbmRpZgotCi1vYmotJChDT05GSUdfWEZTX0ZTKQkJKz0geGZzLm8KLQoteGZzLSQoQ09ORklHX1hGU19RVU9UQSkJCSs9ICQoYWRkcHJlZml4IHF1b3RhLywgXAotCQkJCSAgIHhmc19kcXVvdC5vIFwKLQkJCQkgICB4ZnNfZHF1b3RfaXRlbS5vIFwKLQkJCQkgICB4ZnNfdHJhbnNfZHF1b3QubyBcCi0JCQkJICAgeGZzX3FtX3N5c2NhbGxzLm8gXAotCQkJCSAgIHhmc19xbV9iaHYubyBcCi0JCQkJICAgeGZzX3FtLm8pCi1pZmVxICgkKENPTkZJR19YRlNfUVVPVEEpLHkpCi14ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IHF1b3RhL3hmc19xbV9zdGF0cy5vCi1lbmRpZgotCi14ZnMtJChDT05GSUdfWEZTX1JUKQkJKz0geGZzX3J0YWxsb2MubwoteGZzLSQoQ09ORklHX1hGU19QT1NJWF9BQ0wpCSs9IHhmc19hY2wubwoteGZzLSQoQ09ORklHX1BST0NfRlMpCQkrPSBsaW51eC0yLjYveGZzX3N0YXRzLm8KLXhmcy0kKENPTkZJR19TWVNDVEwpCQkrPSBsaW51eC0yLjYveGZzX3N5c2N0bC5vCi14ZnMtJChDT05GSUdfQ09NUEFUKQkJKz0gbGludXgtMi42L3hmc19pb2N0bDMyLm8KLXhmcy0kKENPTkZJR19YRlNfRVhQT1JUKQkrPSBsaW51eC0yLjYveGZzX2V4cG9ydC5vCi0KLQoteGZzLXkJCQkJKz0geGZzX2FsbG9jLm8gXAotCQkJCSAgIHhmc19hbGxvY19idHJlZS5vIFwKLQkJCQkgICB4ZnNfYXR0ci5vIFwKLQkJCQkgICB4ZnNfYXR0cl9sZWFmLm8gXAotCQkJCSAgIHhmc19iZWhhdmlvci5vIFwKLQkJCQkgICB4ZnNfYml0Lm8gXAotCQkJCSAgIHhmc19ibWFwLm8gXAotCQkJCSAgIHhmc19ibWFwX2J0cmVlLm8gXAotCQkJCSAgIHhmc19idHJlZS5vIFwKLQkJCQkgICB4ZnNfYnVmX2l0ZW0ubyBcCi0JCQkJICAgeGZzX2RhX2J0cmVlLm8gXAotCQkJCSAgIHhmc19kaXIubyBcCi0JCQkJICAgeGZzX2RpcjIubyBcCi0JCQkJICAgeGZzX2RpcjJfYmxvY2subyBcCi0JCQkJICAgeGZzX2RpcjJfZGF0YS5vIFwKLQkJCQkgICB4ZnNfZGlyMl9sZWFmLm8gXAotCQkJCSAgIHhmc19kaXIyX25vZGUubyBcCi0JCQkJICAgeGZzX2RpcjJfc2YubyBcCi0JCQkJICAgeGZzX2Rpcl9sZWFmLm8gXAotCQkJCSAgIHhmc19lcnJvci5vIFwKLQkJCQkgICB4ZnNfZXh0ZnJlZV9pdGVtLm8gXAotCQkJCSAgIHhmc19mc29wcy5vIFwKLQkJCQkgICB4ZnNfaWFsbG9jLm8gXAotCQkJCSAgIHhmc19pYWxsb2NfYnRyZWUubyBcCi0JCQkJICAgeGZzX2lnZXQubyBcCi0JCQkJICAgeGZzX2lub2RlLm8gXAotCQkJCSAgIHhmc19pbm9kZV9pdGVtLm8gXAotCQkJCSAgIHhmc19pb2NvcmUubyBcCi0JCQkJICAgeGZzX2lvbWFwLm8gXAotCQkJCSAgIHhmc19pdGFibGUubyBcCi0JCQkJICAgeGZzX2RmcmFnLm8gXAotCQkJCSAgIHhmc19sb2cubyBcCi0JCQkJICAgeGZzX2xvZ19yZWNvdmVyLm8gXAotCQkJCSAgIHhmc19tYWNyb3MubyBcCi0JCQkJICAgeGZzX21vdW50Lm8gXAotCQkJCSAgIHhmc19yZW5hbWUubyBcCi0JCQkJICAgeGZzX3RyYW5zLm8gXAotCQkJCSAgIHhmc190cmFuc19haWwubyBcCi0JCQkJICAgeGZzX3RyYW5zX2J1Zi5vIFwKLQkJCQkgICB4ZnNfdHJhbnNfZXh0ZnJlZS5vIFwKLQkJCQkgICB4ZnNfdHJhbnNfaW5vZGUubyBcCi0JCQkJICAgeGZzX3RyYW5zX2l0ZW0ubyBcCi0JCQkJICAgeGZzX3V0aWxzLm8gXAotCQkJCSAgIHhmc192ZnNvcHMubyBcCi0JCQkJICAgeGZzX3Zub2Rlb3BzLm8gXAotCQkJCSAgIHhmc19ydy5vIFwKLQkJCQkgICB4ZnNfZG1vcHMubyBcCi0JCQkJICAgeGZzX3Ftb3BzLm8KLQoteGZzLSQoQ09ORklHX1hGU19UUkFDRSkJCSs9IHhmc19kaXIyX3RyYWNlLm8KLQotIyBPYmplY3RzIGluIGxpbnV4LTIuNi8KLXhmcy15CQkJCSs9ICQoYWRkcHJlZml4IGxpbnV4LTIuNi8sIFwKLQkJCQkgICBrbWVtLm8gXAotCQkJCSAgIHhmc19hb3BzLm8gXAotCQkJCSAgIHhmc19idWYubyBcCi0JCQkJICAgeGZzX2ZpbGUubyBcCi0JCQkJICAgeGZzX2ZzX3N1YnIubyBcCi0JCQkJICAgeGZzX2dsb2JhbHMubyBcCi0JCQkJICAgeGZzX2lvY3RsLm8gXAotCQkJCSAgIHhmc19pb3BzLm8gXAotCQkJCSAgIHhmc19scncubyBcCi0JCQkJICAgeGZzX3N1cGVyLm8gXAotCQkJCSAgIHhmc192ZnMubyBcCi0JCQkJICAgeGZzX3Zub2RlLm8pCi0KLSMgT2JqZWN0cyBpbiBzdXBwb3J0LwoteGZzLXkJCQkJKz0gJChhZGRwcmVmaXggc3VwcG9ydC8sIFwKLQkJCQkgICBkZWJ1Zy5vIFwKLQkJCQkgICBtb3ZlLm8gXAotCQkJCSAgIHFzb3J0Lm8gXAotCQkJCSAgIHV1aWQubykKLQoteGZzLSQoQ09ORklHX1hGU19UUkFDRSkJCSs9IHN1cHBvcnQva3RyYWNlLm8KLQoraW5jbHVkZSAkKFRPUERJUikvZnMveGZzL01ha2VmaWxlLWxpbnV4LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKQpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjODdmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYKQEAgLTAsMCArMSwxNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIworIyBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyMgZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisjIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyMgb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorIyBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisjIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorIyBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisjIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisjCisjIGh0dHA6Ly93d3cuc2dpLmNvbQorIworIyBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyMKKyMgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworIworCitFWFRSQV9DRkxBR1MgKz0JIC1JZnMveGZzIC1JZnMveGZzL2xpbnV4LTIuNiAtZnVuc2lnbmVkLWNoYXIKKworWEZTX0xJTlVYIDo9IGxpbnV4LTIuNgorCitpZmVxICgkKENPTkZJR19YRlNfREVCVUcpLHkpCisJRVhUUkFfQ0ZMQUdTICs9IC1nIC1EU1RBVElDPSIiIC1EREVCVUcKKwlFWFRSQV9DRkxBR1MgKz0gLURQQUdFQlVGX0xPQ0tfVFJBQ0tJTkcKK2VuZGlmCitpZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FMTE9DX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FUVFJfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQkxJX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQVBfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQk1CVF9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19ESVJfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRElSMl9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19EUVVPVF9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19JTE9DS19UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19MT0dfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfUldfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURQQUdFQlVGX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1ZOT0RFX1RSQUNFCitlbmRpZgorCitvYmotJChDT05GSUdfWEZTX0ZTKQkJKz0geGZzLm8KKworeGZzLSQoQ09ORklHX1hGU19RVU9UQSkJCSs9ICQoYWRkcHJlZml4IHF1b3RhLywgXAorCQkJCSAgIHhmc19kcXVvdC5vIFwKKwkJCQkgICB4ZnNfZHF1b3RfaXRlbS5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfZHF1b3QubyBcCisJCQkJICAgeGZzX3FtX3N5c2NhbGxzLm8gXAorCQkJCSAgIHhmc19xbV9iaHYubyBcCisJCQkJICAgeGZzX3FtLm8pCisKK2lmZXEgKCQoQ09ORklHX1hGU19RVU9UQSkseSkKK3hmcy0kKENPTkZJR19QUk9DX0ZTKQkJKz0gcXVvdGEveGZzX3FtX3N0YXRzLm8KK2VuZGlmCisKK3hmcy0kKENPTkZJR19YRlNfUlQpCQkrPSB4ZnNfcnRhbGxvYy5vCit4ZnMtJChDT05GSUdfWEZTX1BPU0lYX0FDTCkJKz0geGZzX2FjbC5vCit4ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9ICQoWEZTX0xJTlVYKS94ZnNfc3RhdHMubworeGZzLSQoQ09ORklHX1NZU0NUTCkJCSs9ICQoWEZTX0xJTlVYKS94ZnNfc3lzY3RsLm8KK3hmcy0kKENPTkZJR19DT01QQVQpCQkrPSAkKFhGU19MSU5VWCkveGZzX2lvY3RsMzIubworeGZzLSQoQ09ORklHX1hGU19FWFBPUlQpCSs9ICQoWEZTX0xJTlVYKS94ZnNfZXhwb3J0Lm8KKworCit4ZnMteQkJCQkrPSB4ZnNfYWxsb2MubyBcCisJCQkJICAgeGZzX2FsbG9jX2J0cmVlLm8gXAorCQkJCSAgIHhmc19hdHRyLm8gXAorCQkJCSAgIHhmc19hdHRyX2xlYWYubyBcCisJCQkJICAgeGZzX2JlaGF2aW9yLm8gXAorCQkJCSAgIHhmc19iaXQubyBcCisJCQkJICAgeGZzX2JtYXAubyBcCisJCQkJICAgeGZzX2JtYXBfYnRyZWUubyBcCisJCQkJICAgeGZzX2J0cmVlLm8gXAorCQkJCSAgIHhmc19idWZfaXRlbS5vIFwKKwkJCQkgICB4ZnNfZGFfYnRyZWUubyBcCisJCQkJICAgeGZzX2Rpci5vIFwKKwkJCQkgICB4ZnNfZGlyMi5vIFwKKwkJCQkgICB4ZnNfZGlyMl9ibG9jay5vIFwKKwkJCQkgICB4ZnNfZGlyMl9kYXRhLm8gXAorCQkJCSAgIHhmc19kaXIyX2xlYWYubyBcCisJCQkJICAgeGZzX2RpcjJfbm9kZS5vIFwKKwkJCQkgICB4ZnNfZGlyMl9zZi5vIFwKKwkJCQkgICB4ZnNfZGlyX2xlYWYubyBcCisJCQkJICAgeGZzX2Vycm9yLm8gXAorCQkJCSAgIHhmc19leHRmcmVlX2l0ZW0ubyBcCisJCQkJICAgeGZzX2Zzb3BzLm8gXAorCQkJCSAgIHhmc19pYWxsb2MubyBcCisJCQkJICAgeGZzX2lhbGxvY19idHJlZS5vIFwKKwkJCQkgICB4ZnNfaWdldC5vIFwKKwkJCQkgICB4ZnNfaW5vZGUubyBcCisJCQkJICAgeGZzX2lub2RlX2l0ZW0ubyBcCisJCQkJICAgeGZzX2lvY29yZS5vIFwKKwkJCQkgICB4ZnNfaW9tYXAubyBcCisJCQkJICAgeGZzX2l0YWJsZS5vIFwKKwkJCQkgICB4ZnNfZGZyYWcubyBcCisJCQkJICAgeGZzX2xvZy5vIFwKKwkJCQkgICB4ZnNfbG9nX3JlY292ZXIubyBcCisJCQkJICAgeGZzX21hY3Jvcy5vIFwKKwkJCQkgICB4ZnNfbW91bnQubyBcCisJCQkJICAgeGZzX3JlbmFtZS5vIFwKKwkJCQkgICB4ZnNfdHJhbnMubyBcCisJCQkJICAgeGZzX3RyYW5zX2FpbC5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfYnVmLm8gXAorCQkJCSAgIHhmc190cmFuc19leHRmcmVlLm8gXAorCQkJCSAgIHhmc190cmFuc19pbm9kZS5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfaXRlbS5vIFwKKwkJCQkgICB4ZnNfdXRpbHMubyBcCisJCQkJICAgeGZzX3Zmc29wcy5vIFwKKwkJCQkgICB4ZnNfdm5vZGVvcHMubyBcCisJCQkJICAgeGZzX3J3Lm8gXAorCQkJCSAgIHhmc19kbW9wcy5vIFwKKwkJCQkgICB4ZnNfcW1vcHMubworCit4ZnMtJChDT05GSUdfWEZTX1RSQUNFKQkJKz0geGZzX2RpcjJfdHJhY2UubworCisjIE9iamVjdHMgaW4gbGludXgvCit4ZnMteQkJCQkrPSAkKGFkZHByZWZpeCAkKFhGU19MSU5VWCkvLCBcCisJCQkJICAga21lbS5vIFwKKwkJCQkgICB4ZnNfYW9wcy5vIFwKKwkJCQkgICB4ZnNfYnVmLm8gXAorCQkJCSAgIHhmc19maWxlLm8gXAorCQkJCSAgIHhmc19mc19zdWJyLm8gXAorCQkJCSAgIHhmc19nbG9iYWxzLm8gXAorCQkJCSAgIHhmc19pb2N0bC5vIFwKKwkJCQkgICB4ZnNfaW9wcy5vIFwKKwkJCQkgICB4ZnNfbHJ3Lm8gXAorCQkJCSAgIHhmc19zdXBlci5vIFwKKwkJCQkgICB4ZnNfdmZzLm8gXAorCQkJCSAgIHhmc192bm9kZS5vKQorCisjIE9iamVjdHMgaW4gc3VwcG9ydC8KK3hmcy15CQkJCSs9ICQoYWRkcHJlZml4IHN1cHBvcnQvLCBcCisJCQkJICAgZGVidWcubyBcCisJCQkJICAgbW92ZS5vIFwKKwkJCQkgICB1dWlkLm8pCisKK3hmcy0kKENPTkZJR19YRlNfVFJBQ0UpCQkrPSBzdXBwb3J0L2t0cmFjZS5vCisKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYva21lbS5jIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMKaW5kZXggMzY0ZWE4Yy4uNGIxODQ1NSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMKQEAgLTQ1LDExICs0NSwxMSBAQAogCiAKIHZvaWQgKgota21lbV9hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQora21lbV9hbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQogewotCWludAlyZXRyaWVzID0gMDsKLQlpbnQJbGZsYWdzID0ga21lbV9mbGFnc19jb252ZXJ0KGZsYWdzKTsKLQl2b2lkCSpwdHI7CisJaW50CQlyZXRyaWVzID0gMDsKKwl1bnNpZ25lZCBpbnQJbGZsYWdzID0ga21lbV9mbGFnc19jb252ZXJ0KGZsYWdzKTsKKwl2b2lkCQkqcHRyOwogCiAJZG8gewogCQlpZiAoc2l6ZSA8IE1BWF9TTEFCX1NJWkUgfHwgcmV0cmllcyA+IE1BWF9WTUFMTE9DUykKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogdm9pZCAqCi1rbWVtX3phbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQora21lbV96YWxsb2Moc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKIAl2b2lkCSpwdHI7CiAKQEAgLTg5LDcgKzg5LDggQEAKIH0KIAogdm9pZCAqCi1rbWVtX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3QgbmV3c2l6ZSwgc2l6ZV90IG9sZHNpemUsIGludCBmbGFncykKK2ttZW1fcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdzaXplLCBzaXplX3Qgb2xkc2l6ZSwKKwkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKIAl2b2lkCSpuZXc7CiAKQEAgLTEwNCwxMSArMTA1LDExIEBACiB9CiAKIHZvaWQgKgota21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICp6b25lLCBpbnQgZmxhZ3MpCitrbWVtX3pvbmVfYWxsb2Moa21lbV96b25lX3QgKnpvbmUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKIHsKLQlpbnQJcmV0cmllcyA9IDA7Ci0JaW50CWxmbGFncyA9IGttZW1fZmxhZ3NfY29udmVydChmbGFncyk7Ci0Jdm9pZAkqcHRyOworCWludAkJcmV0cmllcyA9IDA7CisJdW5zaWduZWQgaW50CWxmbGFncyA9IGttZW1fZmxhZ3NfY29udmVydChmbGFncyk7CisJdm9pZAkJKnB0cjsKIAogCWRvIHsKIAkJcHRyID0ga21lbV9jYWNoZV9hbGxvYyh6b25lLCBsZmxhZ3MpOwpAQCAtMTIzLDcgKzEyNCw3IEBACiB9CiAKIHZvaWQgKgota21lbV96b25lX3phbGxvYyhrbWVtX3pvbmVfdCAqem9uZSwgaW50IGZsYWdzKQora21lbV96b25lX3phbGxvYyhrbWVtX3pvbmVfdCAqem9uZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQogewogCXZvaWQJKnB0cjsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmggYi9mcy94ZnMvbGludXgtMi42L2ttZW0uaAppbmRleCAxMzk3YjY2Li4xMDlmY2YyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L2ttZW0uaAorKysgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uaApAQCAtMzksMTAgKzM5LDEwIEBACiAvKgogICogbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMKICAqLwotI2RlZmluZSBLTV9TTEVFUAkweDAwMDEKLSNkZWZpbmUgS01fTk9TTEVFUAkweDAwMDIKLSNkZWZpbmUgS01fTk9GUwkJMHgwMDA0Ci0jZGVmaW5lIEtNX01BWUZBSUwJMHgwMDA4CisjZGVmaW5lIEtNX1NMRUVQCTB4MDAwMXUKKyNkZWZpbmUgS01fTk9TTEVFUAkweDAwMDJ1CisjZGVmaW5lIEtNX05PRlMJCTB4MDAwNHUKKyNkZWZpbmUgS01fTUFZRkFJTAkweDAwMDh1CiAKICNkZWZpbmUJa21lbV96b25lCWttZW1fY2FjaGVfcwogI2RlZmluZSBrbWVtX3pvbmVfdAlrbWVtX2NhY2hlX3QKQEAgLTgxLDkgKzgxLDkgQEAKIAkqKE5TVEFURVApID0gKihPU1RBVEVQKTsJXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludCBrbWVtX2ZsYWdzX2NvbnZlcnQoaW50IGZsYWdzKQorc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludCBrbWVtX2ZsYWdzX2NvbnZlcnQodW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQogewotCWludAlsZmxhZ3MgPSBfX0dGUF9OT1dBUk47CS8qIHdlJ2xsIHJlcG9ydCBwcm9ibGVtcywgaWYgbmVlZCBiZSAqLworCXVuc2lnbmVkIGludAlsZmxhZ3MgPSBfX0dGUF9OT1dBUk47CS8qIHdlJ2xsIHJlcG9ydCBwcm9ibGVtcywgaWYgbmVlZCBiZSAqLwogCiAjaWZkZWYgREVCVUcKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEtNX1NMRUVQfEtNX05PU0xFRVB8S01fTk9GU3xLTV9NQVlGQUlMKSkpIHsKQEAgLTEyNSwxMiArMTI1LDEzIEBACiAJCUJVRygpOwogfQogCi1leHRlcm4gdm9pZAkgICAgKmttZW1fem9uZV96YWxsb2Moa21lbV96b25lX3QgKiwgaW50KTsKLWV4dGVybiB2b2lkCSAgICAqa21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICosIGludCk7CitleHRlcm4gdm9pZAkgICAgKmttZW1fem9uZV96YWxsb2Moa21lbV96b25lX3QgKiwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKK2V4dGVybiB2b2lkCSAgICAqa21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICosIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CiAKLWV4dGVybiB2b2lkCSAgICAqa21lbV9hbGxvYyhzaXplX3QsIGludCk7Ci1leHRlcm4gdm9pZAkgICAgKmttZW1fcmVhbGxvYyh2b2lkICosIHNpemVfdCwgc2l6ZV90LCBpbnQpOwotZXh0ZXJuIHZvaWQJICAgICprbWVtX3phbGxvYyhzaXplX3QsIGludCk7CitleHRlcm4gdm9pZAkgICAgKmttZW1fYWxsb2Moc2l6ZV90LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOworZXh0ZXJuIHZvaWQJICAgICprbWVtX3JlYWxsb2Modm9pZCAqLCBzaXplX3QsIHNpemVfdCwKKwkJCQkgIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CitleHRlcm4gdm9pZAkgICAgKmttZW1femFsbG9jKHNpemVfdCwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIGV4dGVybiB2b2lkICAgICAgICAga21lbV9mcmVlKHZvaWQgKiwgc2l6ZV90KTsKIAogdHlwZWRlZiBzdHJ1Y3Qgc2hyaW5rZXIgKmttZW1fc2hha2VyX3Q7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3NwaW4uaCBiL2ZzL3hmcy9saW51eC0yLjYvc3Bpbi5oCmluZGV4IGJjZjYwYTAuLjAwMzk1MDQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYvc3Bpbi5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvc3Bpbi5oCkBAIC00NSw2ICs0NSw5IEBACiB0eXBlZGVmIHNwaW5sb2NrX3QgbG9ja190OwogCiAjZGVmaW5lIFNQTERFQ0wocykJCQl1bnNpZ25lZCBsb25nIHMKKyNpZm5kZWYgREVGSU5FX1NQSU5MT0NLCisjZGVmaW5lIERFRklORV9TUElOTE9DSyhzKQkJc3BpbmxvY2tfdCBzID0gU1BJTl9MT0NLX1VOTE9DS0VECisjZW5kaWYKIAogI2RlZmluZSBzcGlubG9ja19pbml0KGxvY2ssIG5hbWUpCXNwaW5fbG9ja19pbml0KGxvY2spCiAjZGVmaW5lCXNwaW5sb2NrX2Rlc3Ryb3kobG9jaykKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvdGltZS5oIGIvZnMveGZzL2xpbnV4LTIuNi90aW1lLmgKaW5kZXggNmM2ZmQwZi4uYjBkMjg3MyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi90aW1lLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi90aW1lLmgKQEAgLTM5LDggKzM5LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KGxvbmcgdGlja3MpCiB7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQodGlja3MpOworCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHRpY2tzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG5hbm90aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHZwKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IGEzYTRiNWEuLmM2YzA3NzkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTEwNCw2NiArMTA0LDExNCBAQAogI2RlZmluZSB4ZnNfcGFnZV90cmFjZSh0YWcsIGlub2RlLCBwYWdlLCBtYXNrKQogI2VuZGlmCiAKKy8qCisgKiBTY2hlZHVsZSBJTyBjb21wbGV0aW9uIGhhbmRsaW5nIG9uIGEgeGZzZGF0YWQgaWYgdGhpcyB3YXMKKyAqIHRoZSBmaW5hbCBob2xkIG9uIHRoaXMgaW9lbmQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZmluaXNoX2lvZW5kKAorCXhmc19pb2VuZF90CQkqaW9lbmQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvZW5kLT5pb19yZW1haW5pbmcpKQorCQlxdWV1ZV93b3JrKHhmc2RhdGFkX3dvcmtxdWV1ZSwgJmlvZW5kLT5pb193b3JrKTsKK30KKworU1RBVElDIHZvaWQKK3hmc19kZXN0cm95X2lvZW5kKAorCXhmc19pb2VuZF90CQkqaW9lbmQpCit7CisJdm5faW93YWtlKGlvZW5kLT5pb192bm9kZSk7CisJbWVtcG9vbF9mcmVlKGlvZW5kLCB4ZnNfaW9lbmRfcG9vbCk7Cit9CisKKy8qCisgKiBJc3N1ZSB0cmFuc2FjdGlvbnMgdG8gY29udmVydCBhIGJ1ZmZlciByYW5nZSBmcm9tIHVud3JpdHRlbgorICogdG8gd3JpdHRlbiBleHRlbnRzLgorICovCitTVEFUSUMgdm9pZAoreGZzX2VuZF9iaW9fdW53cml0dGVuKAorCXZvaWQJCQkqZGF0YSkKK3sKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gZGF0YTsKKwl2bm9kZV90CQkJKnZwID0gaW9lbmQtPmlvX3Zub2RlOworCXhmc19vZmZfdAkJb2Zmc2V0ID0gaW9lbmQtPmlvX29mZnNldDsKKwlzaXplX3QJCQlzaXplID0gaW9lbmQtPmlvX3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKm5leHQ7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoaW9lbmQtPmlvX3VwdG9kYXRlKQorCQlWT1BfQk1BUCh2cCwgb2Zmc2V0LCBzaXplLCBCTUFQSV9VTldSSVRURU4sIE5VTEwsIE5VTEwsIGVycm9yKTsKKworCS8qIGlvZW5kLT5pb19idWZmZXJfaGVhZCBpcyBvbmx5IG5vbi1OVUxMIGZvciBidWZmZXJlZCBJL08gKi8KKwlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBuZXh0KSB7CisJCW5leHQgPSBiaC0+Yl9wcml2YXRlOworCisJCWJoLT5iX2VuZF9pbyA9IE5VTEw7CisJCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOworCQllbmRfYnVmZmVyX2FzeW5jX3dyaXRlKGJoLCBpb2VuZC0+aW9fdXB0b2RhdGUpOworCX0KKworCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGFuIElPIGNvbXBsZXRpb24gc3RydWN0dXJlLgorICogV2UgbmVlZCB0byB0cmFjayB1bndyaXR0ZW4gZXh0ZW50IHdyaXRlIGNvbXBsZXRpb24gaGVyZSBpbml0aWFsbHkuCisgKiBXZSdsbCBuZWVkIHRvIGV4dGVuZCB0aGlzIGZvciB1cGRhdGluZyB0aGUgb25kaXNrIGlub2RlIHNpemUgbGF0ZXIKKyAqICh2cy4gaW5jb3JlIHNpemUpLgorICovCitTVEFUSUMgeGZzX2lvZW5kX3QgKgoreGZzX2FsbG9jX2lvZW5kKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlKQoreworCXhmc19pb2VuZF90CQkqaW9lbmQ7CisKKwlpb2VuZCA9IG1lbXBvb2xfYWxsb2MoeGZzX2lvZW5kX3Bvb2wsIEdGUF9OT0ZTKTsKKworCS8qCisJICogU2V0IHRoZSBjb3VudCB0byAxIGluaXRpYWxseSwgd2hpY2ggd2lsbCBwcmV2ZW50IGFuIEkvTworCSAqIGNvbXBsZXRpb24gY2FsbGJhY2sgZnJvbSBoYXBwZW5pbmcgYmVmb3JlIHdlIGhhdmUgc3RhcnRlZAorCSAqIGFsbCB0aGUgSS9PIGZyb20gY2FsbGluZyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHRvbyBlYXJseS4KKwkgKi8KKwlhdG9taWNfc2V0KCZpb2VuZC0+aW9fcmVtYWluaW5nLCAxKTsKKwlpb2VuZC0+aW9fdXB0b2RhdGUgPSAxOyAvKiBjbGVhcmVkIGlmIGFueSBJL08gZmFpbHMgKi8KKwlpb2VuZC0+aW9fdm5vZGUgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpb2VuZC0+aW9fYnVmZmVyX2hlYWQgPSBOVUxMOworCWF0b21pY19pbmMoJmlvZW5kLT5pb192bm9kZS0+dl9pb2NvdW50KTsKKwlpb2VuZC0+aW9fb2Zmc2V0ID0gMDsKKwlpb2VuZC0+aW9fc2l6ZSA9IDA7CisKKwlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2Jpb191bndyaXR0ZW4sIGlvZW5kKTsKKworCXJldHVybiBpb2VuZDsKK30KKwogdm9pZAogbGludmZzX3Vud3JpdHRlbl9kb25lKAogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsCiAJaW50CQkJdXB0b2RhdGUpCiB7Ci0JeGZzX2J1Zl90CQkqcGIgPSAoeGZzX2J1Zl90ICopYmgtPmJfcHJpdmF0ZTsKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gYmgtPmJfcHJpdmF0ZTsKKwlzdGF0aWMgc3BpbmxvY2tfdAl1bndyaXR0ZW5fZG9uZV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCiAJQVNTRVJUKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKTsKIAliaC0+Yl9lbmRfaW8gPSBOVUxMOwotCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOworCiAJaWYgKCF1cHRvZGF0ZSkKLQkJcGFnZWJ1Zl9pb2Vycm9yKHBiLCBFSU8pOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYi0+cGJfaW9fcmVtYWluaW5nKSA9PSAxKSB7Ci0JCXBhZ2VidWZfaW9kb25lKHBiLCAxLCAxKTsKLQl9Ci0JZW5kX2J1ZmZlcl9hc3luY193cml0ZShiaCwgdXB0b2RhdGUpOwotfQorCQlpb2VuZC0+aW9fdXB0b2RhdGUgPSAwOwogCi0vKgotICogSXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYSBidWZmZXIgcmFuZ2UgZnJvbSB1bndyaXR0ZW4KLSAqIHRvIHdyaXR0ZW4gZXh0ZW50cyAoYnVmZmVyZWQgSU8pLgotICovCi1TVEFUSUMgdm9pZAotbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0KAotCXhmc19idWZfdAkqYnApCi17Ci0Jdm5vZGVfdAkJKnZwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZub2RlX3QgKik7Ci0JaW50CQllcnJvcjsKKwkvKgorCSAqIERlZXAgbWFnaWMgaGVyZS4gIFdlIHJldXNlIGJfcHJpdmF0ZSBpbiB0aGUgYnVmZmVyX2hlYWRzIHRvIGJ1aWxkCisJICogYSBjaGFpbiBmb3IgY29tcGxldGluZyB0aGUgSS9PIGZyb20gdXNlciBjb250ZXh0IGFmdGVyIHdlJ3ZlIGlzc3VlZAorCSAqIGEgdHJhbnNhY3Rpb24gdG8gY29udmVydCB0aGUgdW53cml0dGVuIGV4dGVudC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW53cml0dGVuX2RvbmVfbG9jaywgZmxhZ3MpOworCWJoLT5iX3ByaXZhdGUgPSBpb2VuZC0+aW9fYnVmZmVyX2hlYWQ7CisJaW9lbmQtPmlvX2J1ZmZlcl9oZWFkID0gYmg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW53cml0dGVuX2RvbmVfbG9jaywgZmxhZ3MpOwogCi0JQlVHX09OKGF0b21pY19yZWFkKCZicC0+cGJfaG9sZCkgPCAxKTsKLQlWT1BfQk1BUCh2cCwgWEZTX0JVRl9PRkZTRVQoYnApLCBYRlNfQlVGX1NJWkUoYnApLAotCQkJQk1BUElfVU5XUklUVEVOLCBOVUxMLCBOVUxMLCBlcnJvcik7Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKLQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7Ci0JWEZTX0JVRl9VTkRBVEFJTyhicCk7Ci0JaXB1dChMSU5WRlNfR0VUX0lQKHZwKSk7Ci0JcGFnZWJ1Zl9pb2RvbmUoYnAsIDAsIDApOwotfQotCi0vKgotICogSXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYSBidWZmZXIgcmFuZ2UgZnJvbSB1bndyaXR0ZW4KLSAqIHRvIHdyaXR0ZW4gZXh0ZW50cyAoZGlyZWN0IElPKS4KLSAqLwotU1RBVElDIHZvaWQKLWxpbnZmc191bndyaXR0ZW5fY29udmVydF9kaXJlY3QoCi0Jc3RydWN0IGtpb2NiCSppb2NiLAotCWxvZmZfdAkJb2Zmc2V0LAotCXNzaXplX3QJCXNpemUsCi0Jdm9pZAkJKnByaXZhdGUpCi17Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotCUFTU0VSVCghcHJpdmF0ZSB8fCBpbm9kZSA9PSAoc3RydWN0IGlub2RlICopcHJpdmF0ZSk7Ci0KLQkvKiBwcml2YXRlIGluZGljYXRlcyBhbiB1bndyaXR0ZW4gZXh0ZW50IGxheSBiZW5lYXRoIHRoaXMgSU8gKi8KLQlpZiAocHJpdmF0ZSAmJiBzaXplID4gMCkgewotCQl2bm9kZV90CSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOwotCQlpbnQJZXJyb3I7Ci0KLQkJVk9QX0JNQVAodnAsIG9mZnNldCwgc2l6ZSwgQk1BUElfVU5XUklUVEVOLCBOVUxMLCBOVUxMLCBlcnJvcik7Ci0JfQorCXhmc19maW5pc2hfaW9lbmQoaW9lbmQpOwogfQogCiBTVEFUSUMgaW50CkBAIC0yNTUsNyArMzAzLDcgQEAKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZywKIAlwZ29mZl90CQkJaW5kZXgsCiAJeGZzX2lvbWFwX3QJCSppb21hcHAsCi0JeGZzX2J1Zl90CQkqcGIsCisJeGZzX2lvZW5kX3QJCSppb2VuZCwKIAl1bnNpZ25lZCBsb25nCQltYXhfb2Zmc2V0LAogCXVuc2lnbmVkIGxvbmcJCSpmc2JzLAogCXVuc2lnbmVkIGludCAgICAgICAgICAgIGJiaXRzKQpAQCAtMjgzLDcgKzMzMSw3IEBACiAJCQkJYnJlYWs7CiAJCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsIGJiaXRzLCBpb21hcHApOwogCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOwotCQkJYmgtPmJfcHJpdmF0ZSA9IHBiOworCQkJYmgtPmJfcHJpdmF0ZSA9IGlvZW5kOwogCQkJcF9vZmZzZXQgKz0gYmgtPmJfc2l6ZTsKIAkJCSgqZnNicykrKzsKIAkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKQEAgLTQzNCwzNCArNDgyLDE1IEBACiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCA9IGN1cnI7CiAJeGZzX2lvbWFwX3QJCSp0bXA7Ci0JeGZzX2J1Zl90CQkqcGI7Ci0JbG9mZl90CQkJb2Zmc2V0LCBzaXplOworCXhmc19pb2VuZF90CQkqaW9lbmQ7CisJbG9mZl90CQkJb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcJCW5ibG9ja3MgPSAwOwogCiAJb2Zmc2V0ID0gc3RhcnRfcGFnZS0+aW5kZXg7CiAJb2Zmc2V0IDw8PSBQQUdFX0NBQ0hFX1NISUZUOwogCW9mZnNldCArPSBwX29mZnNldDsKIAotCS8qIGdldCBhbiAiZW1wdHkiIHBhZ2VidWYgdG8gbWFuYWdlIElPIGNvbXBsZXRpb24KLQkgKiBQcm9wZXIgdmFsdWVzIHdpbGwgYmUgc2V0IGJlZm9yZSByZXR1cm5pbmcgKi8KLQlwYiA9IHBhZ2VidWZfbG9va3VwKGlvbWFwcC0+aW9tYXBfdGFyZ2V0LCAwLCAwLCAwKTsKLQlpZiAoIXBiKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCS8qIFRha2UgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHRvIHByZXZlbnQgaXQgZnJvbQotCSAqIGJlaW5nIHJlY2xhaW1lZCB3aGlsZSB3ZSBoYXZlIG91dHN0YW5kaW5nIHVud3JpdHRlbgotCSAqIGV4dGVudCBJTyBvbiBpdC4KLQkgKi8KLQlpZiAoKGlncmFiKGlub2RlKSkgIT0gaW5vZGUpIHsKLQkJcGFnZWJ1Zl9mcmVlKHBiKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JLyogU2V0IHRoZSBjb3VudCB0byAxIGluaXRpYWxseSwgdGhpcyB3aWxsIHN0b3AgYW4gSS9PCi0JICogY29tcGxldGlvbiBjYWxsb3V0IHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgc3RhcnRlZAotCSAqIGFsbCB0aGUgSS9PIGZyb20gY2FsbGluZyBwYWdlYnVmX2lvZG9uZSB0b28gZWFybHkuCi0JICovCi0JYXRvbWljX3NldCgmcGItPnBiX2lvX3JlbWFpbmluZywgMSk7CisJaW9lbmQgPSB4ZnNfYWxsb2NfaW9lbmQoaW5vZGUpOwogCiAJLyogRmlyc3QgbWFwIGZvcndhcmRzIGluIHRoZSBwYWdlIGNvbnNlY3V0aXZlIGJ1ZmZlcnMKIAkgKiBjb3ZlcmluZyB0aGlzIHVud3JpdHRlbiBleHRlbnQKQEAgLTQ3NCwxMiArNTAzLDEyIEBACiAJCQlicmVhazsKIAkJeGZzX21hcF9hdF9vZmZzZXQoc3RhcnRfcGFnZSwgYmgsIHBfb2Zmc2V0LCBibG9ja19iaXRzLCBpb21hcHApOwogCQlzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhiaCk7Ci0JCWJoLT5iX3ByaXZhdGUgPSBwYjsKKwkJYmgtPmJfcHJpdmF0ZSA9IGlvZW5kOwogCQlwX29mZnNldCArPSBiaC0+Yl9zaXplOwogCQluYmxvY2tzKys7CiAJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKIAotCWF0b21pY19hZGQobmJsb2NrcywgJnBiLT5wYl9pb19yZW1haW5pbmcpOworCWF0b21pY19hZGQobmJsb2NrcywgJmlvZW5kLT5pb19yZW1haW5pbmcpOwogCiAJLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBwYWdlLCBtYXAgZm9yd2FyZHMgaW4gYW55CiAJICogZm9sbG93aW5nIHBhZ2VzIHdoaWNoIGFyZSBhbHNvIGNvdmVyZWQgYnkgdGhpcyBleHRlbnQuCkBAIC00OTYsMTMgKzUyNSwxMyBAQAogCQl0bG9mZiA9IG1pbih0bGFzdCwgdGxvZmYpOwogCQlmb3IgKHRpbmRleCA9IHN0YXJ0X3BhZ2UtPmluZGV4ICsgMTsgdGluZGV4IDwgdGxvZmY7IHRpbmRleCsrKSB7CiAJCQlwYWdlID0geGZzX3Byb2JlX3Vud3JpdHRlbl9wYWdlKG1hcHBpbmcsCi0JCQkJCQl0aW5kZXgsIGlvbWFwcCwgcGIsCisJCQkJCQl0aW5kZXgsIGlvbWFwcCwgaW9lbmQsCiAJCQkJCQlQQUdFX0NBQ0hFX1NJWkUsICZicywgYmJpdHMpOwogCQkJaWYgKCFwYWdlKQogCQkJCWJyZWFrOwogCQkJbmJsb2NrcyArPSBiczsKLQkJCWF0b21pY19hZGQoYnMsICZwYi0+cGJfaW9fcmVtYWluaW5nKTsKLQkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBwYiwKKwkJCWF0b21pY19hZGQoYnMsICZpb2VuZC0+aW9fcmVtYWluaW5nKTsKKwkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBpb2VuZCwKIAkJCQkJCQlzdGFydGlvLCBhbGxfYmgpOwogCQkJLyogc3RvcCBpZiBjb252ZXJ0aW5nIHRoZSBuZXh0IHBhZ2UgbWlnaHQgYWRkCiAJCQkgKiBlbm91Z2ggYmxvY2tzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZQpAQCAtNTE0LDEyICs1NDMsMTIgQEAKIAkJaWYgKHRpbmRleCA9PSB0bGFzdCAmJgogCQkgICAgKHBnX29mZnNldCA9IChpX3NpemVfcmVhZChpbm9kZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpKSkgewogCQkJcGFnZSA9IHhmc19wcm9iZV91bndyaXR0ZW5fcGFnZShtYXBwaW5nLAotCQkJCQkJCXRpbmRleCwgaW9tYXBwLCBwYiwKKwkJCQkJCQl0aW5kZXgsIGlvbWFwcCwgaW9lbmQsCiAJCQkJCQkJcGdfb2Zmc2V0LCAmYnMsIGJiaXRzKTsKIAkJCWlmIChwYWdlKSB7CiAJCQkJbmJsb2NrcyArPSBiczsKLQkJCQlhdG9taWNfYWRkKGJzLCAmcGItPnBiX2lvX3JlbWFpbmluZyk7Ci0JCQkJeGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcGFnZSwgaW9tYXBwLCB3YmMsIHBiLAorCQkJCWF0b21pY19hZGQoYnMsICZpb2VuZC0+aW9fcmVtYWluaW5nKTsKKwkJCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgaW9lbmQsCiAJCQkJCQkJc3RhcnRpbywgYWxsX2JoKTsKIAkJCQlpZiAobmJsb2NrcyA+PSAoKFVMT05HX01BWCAtIFBBR0VfU0laRSkgPj4gYmxvY2tfYml0cykpCiAJCQkJCWdvdG8gZW5vdWdoOwpAQCAtNTI4LDIxICs1NTcsOSBAQAogCX0KIAogZW5vdWdoOgotCXNpemUgPSBuYmxvY2tzOwkJLyogTkI6IHVzaW5nIDY0Yml0IG51bWJlciBoZXJlICovCi0Jc2l6ZSA8PD0gYmxvY2tfYml0czsJLyogY29udmVydCBmc2IncyB0byBieXRlIHJhbmdlICovCi0KLQlYRlNfQlVGX0RBVEFJTyhwYik7Ci0JWEZTX0JVRl9BU1lOQyhwYik7Ci0JWEZTX0JVRl9TRVRfU0laRShwYiwgc2l6ZSk7Ci0JWEZTX0JVRl9TRVRfQ09VTlQocGIsIHNpemUpOwotCVhGU19CVUZfU0VUX09GRlNFVChwYiwgb2Zmc2V0KTsKLQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUocGIsIExJTlZGU19HRVRfVlAoaW5vZGUpKTsKLQlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhwYiwgbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0KTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYi0+cGJfaW9fcmVtYWluaW5nKSA9PSAxKSB7Ci0JCXBhZ2VidWZfaW9kb25lKHBiLCAxLCAxKTsKLQl9Ci0KKwlpb2VuZC0+aW9fc2l6ZSA9ICh4ZnNfb2ZmX3QpbmJsb2NrcyA8PCBibG9ja19iaXRzOworCWlvZW5kLT5pb19vZmZzZXQgPSBvZmZzZXQ7CisJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc4Nyw3ICs4MDQsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFpb21wKSB7CiAJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgbGVuLCAmaW9tYXAsCi0JCQkJCQlCTUFQSV9SRUFEfEJNQVBJX0lHTlNUQVRFKTsKKwkJCQkJCUJNQVBJX1dSSVRFfEJNQVBJX0lHTlNUQVRFKTsKIAkJCQlpZiAoZXJyKSB7CiAJCQkJCWdvdG8gZXJyb3I7CiAJCQkJfQpAQCAtMTAyOCw2ICsxMDQ1LDQ0IEBACiAJCQkJCWNyZWF0ZSwgMSwgQk1BUElfV1JJVEV8Qk1BUElfRElSRUNUKTsKIH0KIAorU1RBVElDIHZvaWQKK2xpbnZmc19lbmRfaW9fZGlyZWN0KAorCXN0cnVjdCBraW9jYgkqaW9jYiwKKwlsb2ZmX3QJCW9mZnNldCwKKwlzc2l6ZV90CQlzaXplLAorCXZvaWQJCSpwcml2YXRlKQoreworCXhmc19pb2VuZF90CSppb2VuZCA9IGlvY2ItPnByaXZhdGU7CisKKwkvKgorCSAqIE5vbi1OVUxMIHByaXZhdGUgZGF0YSBtZWFucyB3ZSBuZWVkIHRvIGlzc3VlIGEgdHJhbnNhY3Rpb24gdG8KKwkgKiBjb252ZXJ0IGEgcmFuZ2UgZnJvbSB1bndyaXR0ZW4gdG8gd3JpdHRlbiBleHRlbnRzLiAgVGhpcyBuZWVkcworCSAqIHRvIGhhcHBlbiBmcm9tIHByb2Nlc3MgY29udGVjdCBidXQgYWlvK2RpbyBJL08gY29tcGxldGlvbgorCSAqIGhhcHBlbnMgZnJvbSBpcnEgY29udGV4dCBzbyB3ZSBuZWVkIHRvIGRlZmVyIGl0IHRvIGEgd29ya3F1ZXVlLgorCSAqIFRoaXMgaXMgbm90IG5lc3NlY2FyeSBmb3Igc3luY2hyb25vdXMgZGlyZWN0IEkvTywgYnV0IHdlIGRvCisJICogaXQgYW55d2F5IHRvIGtlZXAgdGhlIGNvZGUgdW5pZm9ybSBhbmQgc2ltcGxlci4KKwkgKgorCSAqIFRoZSBjb3JlIGRpcmVjdCBJL08gY29kZSBtaWdodCBiZSBjaGFuZ2VkIHRvIGFsd2F5cyBjYWxsIHRoZQorCSAqIGNvbXBsZXRpb24gaGFuZGxlciBpbiB0aGUgZnV0dXJlLCBpbiB3aGljaCBjYXNlIGFsbCB0aGlzIGNhbgorCSAqIGdvIGF3YXkuCisJICovCisJaWYgKHByaXZhdGUgJiYgc2l6ZSA+IDApIHsKKwkJaW9lbmQtPmlvX29mZnNldCA9IG9mZnNldDsKKwkJaW9lbmQtPmlvX3NpemUgPSBzaXplOworCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKKwl9IGVsc2UgeworCQlBU1NFUlQoc2l6ZSA+PSAwKTsKKwkJeGZzX2Rlc3Ryb3lfaW9lbmQoaW9lbmQpOworCX0KKworCS8qCisJICogYmxvY2tkZXZfZGlyZWN0X0lPIGNhbiByZXR1cm4gYW4gZXJyb3IgZXZlbiBhZmVyIHRoZSBJL08KKwkgKiBjb21wbGV0aW9uIGhhbmRsZXIgd2FzIGNhbGxlZC4gIFRodXMgd2UgbmVlZCB0byBwcm90ZWN0CisJICogYWdhaW5zdCBkb3VibGUtZnJlZWluZy4KKwkgKi8KKwlpb2NiLT5wcml2YXRlID0gTlVMTDsKK30KKwogU1RBVElDIHNzaXplX3QKIGxpbnZmc19kaXJlY3RfSU8oCiAJaW50CQkJcncsCkBAIC0xMDQyLDE2ICsxMDk3LDIzIEBACiAJeGZzX2lvbWFwX3QJaW9tYXA7CiAJaW50CQltYXBzID0gMTsKIAlpbnQJCWVycm9yOworCXNzaXplX3QJCXJldDsKIAogCVZPUF9CTUFQKHZwLCBvZmZzZXQsIDAsIEJNQVBJX0RFVklDRSwgJmlvbWFwLCAmbWFwcywgZXJyb3IpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIC1lcnJvcjsKIAotCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU9fb3duX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLAorCWlvY2ItPnByaXZhdGUgPSB4ZnNfYWxsb2NfaW9lbmQoaW5vZGUpOworCisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPX293bl9sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwKIAkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5wYnJfYmRldiwKIAkJaW92LCBvZmZzZXQsIG5yX3NlZ3MsCiAJCWxpbnZmc19nZXRfYmxvY2tzX2RpcmVjdCwKLQkJbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0X2RpcmVjdCk7CisJCWxpbnZmc19lbmRfaW9fZGlyZWN0KTsKKworCWlmICh1bmxpa2VseShyZXQgPD0gMCAmJiBpb2NiLT5wcml2YXRlKSkKKwkJeGZzX2Rlc3Ryb3lfaW9lbmQoaW9jYi0+cHJpdmF0ZSk7CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC0xMjAyLDYgKzEyNjQsMTYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK1NUQVRJQyBpbnQKK2xpbnZmc19pbnZhbGlkYXRlX3BhZ2UoCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCXVuc2lnbmVkIGxvbmcJCW9mZnNldCkKK3sKKwl4ZnNfcGFnZV90cmFjZShYRlNfSU5WQUxJRFBBR0VfRU5URVIsCisJCQlwYWdlLT5tYXBwaW5nLT5ob3N0LCBwYWdlLCBvZmZzZXQpOworCXJldHVybiBibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCBvZmZzZXQpOworfQorCiAvKgogICogQ2FsbGVkIHRvIG1vdmUgYSBwYWdlIGludG8gY2xlYW5hYmxlIHN0YXRlIC0gYW5kIGZyb20gdGhlcmUKICAqIHRvIGJlIHJlbGVhc2VkLiBQb3NzaWJseSB0aGUgcGFnZSBpcyBhbHJlYWR5IGNsZWFuLiBXZSBhbHdheXMKQEAgLTEyNzksNiArMTM1MSw3IEBACiAJLndyaXRlcGFnZQkJPSBsaW52ZnNfd3JpdGVwYWdlLAogCS5zeW5jX3BhZ2UJCT0gYmxvY2tfc3luY19wYWdlLAogCS5yZWxlYXNlcGFnZQkJPSBsaW52ZnNfcmVsZWFzZV9wYWdlLAorCS5pbnZhbGlkYXRlcGFnZQkJPSBsaW52ZnNfaW52YWxpZGF0ZV9wYWdlLAogCS5wcmVwYXJlX3dyaXRlCQk9IGxpbnZmc19wcmVwYXJlX3dyaXRlLAogCS5jb21taXRfd3JpdGUJCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCiAJLmJtYXAJCQk9IGxpbnZmc19ibWFwLApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FPUFNfSF9fCisjZGVmaW5lIF9fWEZTX0FPUFNfSF9fCisKK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOworZXh0ZXJuIG1lbXBvb2xfdCAqeGZzX2lvZW5kX3Bvb2w7CisKK3R5cGVkZWYgdm9pZCAoKnhmc19pb2VuZF9mdW5jX3QpKHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IHhmc19pb2VuZCB7CisJdW5zaWduZWQgaW50CQlpb191cHRvZGF0ZTsJLyogSS9PIHN0YXR1cyByZWdpc3RlciAqLworCWF0b21pY190CQlpb19yZW1haW5pbmc7CS8qIGhvbGQgY291bnQgKi8KKwlzdHJ1Y3Qgdm5vZGUJCSppb192bm9kZTsJLyogZmlsZSBiZWluZyB3cml0dGVuIHRvICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSppb19idWZmZXJfaGVhZDsvKiBidWZmZXIgbGlua2VkIGxpc3QgaGVhZCAqLworCXNpemVfdAkJCWlvX3NpemU7CS8qIHNpemUgb2YgdGhlIGV4dGVudCAqLworCXhmc19vZmZfdAkJaW9fb2Zmc2V0OwkvKiBvZmZzZXQgaW4gdGhlIGZpbGUgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJaW9fd29yazsJLyogeGZzZGF0YWQgd29yayBxdWV1ZSAqLworfSB4ZnNfaW9lbmRfdDsKKworI2VuZGlmIC8qIF9fWEZTX0lPUFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCmluZGV4IGRmMGNiYTIuLmU4MmNmNzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpbmNsdWRlICJ4ZnNfbGludXguaCIKIApAQCAtNjcsNyArNjgsNyBAQAogU1RBVElDIHZvaWQgcGFnZWJ1Zl9kZWx3cmlfcXVldWUoeGZzX2J1Zl90ICosIGludCk7CiAKIFNUQVRJQyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzbG9nZF93b3JrcXVldWU7Ci1TVEFUSUMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2RhdGFkX3dvcmtxdWV1ZTsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CiAKIC8qCiAgKiBQYWdlYnVmIGRlYnVnZ2luZwpAQCAtNTkwLDggKzU5MSwxMCBAQAogCQlQQl9TRVRfT1dORVIocGIpOwogCX0KIAotCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfU1RBTEUpCisJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9TVEFMRSkgeworCQlBU1NFUlQoKHBiLT5wYl9mbGFncyAmIF9QQkZfREVMV1JJX1EpID09IDApOwogCQlwYi0+cGJfZmxhZ3MgJj0gUEJGX01BUFBFRDsKKwl9CiAJUEJfVFJBQ0UocGIsICJnb3RfbG9jayIsIDApOwogCVhGU19TVEFUU19JTkMocGJfZ2V0X2xvY2tlZCk7CiAJcmV0dXJuIChwYik7CkBAIC03MDAsMjUgKzcwMyw2IEBACiB9CiAKIC8qCi0gKiBDcmVhdGUgYSBza2VsZXRhbCBwYWdlYnVmIChubyBwYWdlcyBhc3NvY2lhdGVkIHdpdGggaXQpLgotICovCi14ZnNfYnVmX3QgKgotcGFnZWJ1Zl9sb29rdXAoCi0JeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKLQlsb2ZmX3QJCQlpb2ZmLAotCXNpemVfdAkJCWlzaXplLAotCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCi17Ci0JeGZzX2J1Zl90CQkqcGI7Ci0KLQlwYiA9IHBhZ2VidWZfYWxsb2NhdGUoZmxhZ3MpOwotCWlmIChwYikgewotCQlfcGFnZWJ1Zl9pbml0aWFsaXplKHBiLCB0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7Ci0JfQotCXJldHVybiBwYjsKLX0KLQotLyoKICAqIElmIHdlIGFyZSBub3QgbG93IG9uIG1lbW9yeSB0aGVuIGRvIHRoZSByZWFkYWhlYWQgaW4gYSBkZWFkbG9jawogICogc2FmZSBtYW5uZXIuCiAgKi8KQEAgLTkxMywyMiArODk3LDIzIEBACiAJCQlkb19mcmVlID0gMDsKIAkJfQogCi0JCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKSB7Ci0JCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX0FTWU5DOwotCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOwotCQkJcGFnZWJ1Zl9kZWx3cmlfcXVldWUocGIsIDApOwotCQkJZG9fZnJlZSA9IDA7Ci0JCX0gZWxzZSBpZiAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpIHsKKwkJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9GU19NQU5BR0VEKSB7CiAJCQlkb19mcmVlID0gMDsKIAkJfQogCiAJCWlmIChkb19mcmVlKSB7CisJCQlBU1NFUlQoKHBiLT5wYl9mbGFncyAmIChQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpKSA9PSAwKTsKIAkJCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9oYXNoX2xpc3QpOwogCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOwogCQkJcGFnZWJ1Zl9mcmVlKHBiKTsKIAkJfSBlbHNlIHsKIAkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKIAkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIENhdGNoIHJlZmVyZW5jZSBjb3VudCBsZWFrcworCQkgKi8KKwkJQVNTRVJUKGF0b21pY19yZWFkKCZwYi0+cGJfaG9sZCkgPj0gMCk7CiAJfQogfQogCkBAIC0xMDA2LDEzICs5OTEsMjQgQEAKICAqCXBhZ2VidWZfdW5sb2NrCiAgKgogICoJcGFnZWJ1Zl91bmxvY2sgcmVsZWFzZXMgdGhlIGxvY2sgb24gdGhlIGJ1ZmZlciBvYmplY3QgY3JlYXRlZCBieQotICoJcGFnZWJ1Zl9sb2NrIG9yIHBhZ2VidWZfY29uZF9sb2NrIChub3QgYW55Ci0gKglwaW5uaW5nIG9mIHVuZGVybHlpbmcgcGFnZXMgY3JlYXRlZCBieSBwYWdlYnVmX3BpbikuCisgKglwYWdlYnVmX2xvY2sgb3IgcGFnZWJ1Zl9jb25kX2xvY2sgKG5vdCBhbnkgcGlubmluZyBvZiB1bmRlcmx5aW5nIHBhZ2VzCisgKgljcmVhdGVkIGJ5IHBhZ2VidWZfcGluKS4KKyAqCisgKglJZiB0aGUgYnVmZmVyIGlzIG1hcmtlZCBkZWx3cmkgYnV0IGlzIG5vdCBxdWV1ZWQsIGRvIHNvIGJlZm9yZSB3ZQorICoJdW5sb2NrIHRoZSBidWZmZXIgYXMgd2UgbmVlZCB0byBzZXQgZmxhZ3MgY29ycmVjdGx5LiBXZSBhbHNvIG5lZWQgdG8KKyAqCXRha2UgYSByZWZlcmVuY2UgZm9yIHRoZSBkZWx3cmkgcXVldWUgYmVjYXVzZSB0aGUgdW5sb2NrZXIgaXMgZ29pbmcgdG8KKyAqCWRyb3AgdGhlaXIncyBhbmQgdGhleSBkb24ndCBrbm93IHdlIGp1c3QgcXVldWVkIGl0LgogICovCiB2b2lkCiBwYWdlYnVmX3VubG9jaygJCQkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KIAl4ZnNfYnVmX3QJCSpwYikJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KIHsKKwlpZiAoKHBiLT5wYl9mbGFncyAmIChQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpKSA9PSBQQkZfREVMV1JJKSB7CisJCWF0b21pY19pbmMoJnBiLT5wYl9ob2xkKTsKKwkJcGItPnBiX2ZsYWdzIHw9IFBCRl9BU1lOQzsKKwkJcGFnZWJ1Zl9kZWx3cmlfcXVldWUocGIsIDApOworCX0KKwogCVBCX0NMRUFSX09XTkVSKHBiKTsKIAl1cCgmcGItPnBiX3NlbWEpOwogCVBCX1RSQUNFKHBiLCAidW5sb2NrIiwgMCk7CkBAIC0xMjQ5LDggKzEyNDUsOCBAQAogCWludAkJCWVycm9yKQogewogCXhmc19idWZfdAkJKnBiID0gKHhmc19idWZfdCAqKWJpby0+YmlfcHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQJCWksIGJsb2Nrc2l6ZSA9IHBiLT5wYl90YXJnZXQtPnBicl9ic2l6ZTsKLQlzdHJ1Y3QgYmlvX3ZlYwkJKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKwl1bnNpZ25lZCBpbnQJCWJsb2Nrc2l6ZSA9IHBiLT5wYl90YXJnZXQtPnBicl9ic2l6ZTsKKwlzdHJ1Y3QgYmlvX3ZlYwkJKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CiAKIAlpZiAoYmlvLT5iaV9zaXplKQogCQlyZXR1cm4gMTsKQEAgLTEyNTgsMTAgKzEyNTQsMTIgQEAKIAlpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpKQogCQlwYi0+cGJfZXJyb3IgPSBFSU87CiAKLQlmb3IgKGkgPSAwOyBpIDwgYmlvLT5iaV92Y250OyBpKyssIGJ2ZWMrKykgeworCWRvIHsKIAkJc3RydWN0IHBhZ2UJKnBhZ2UgPSBidmVjLT5idl9wYWdlOwogCi0JCWlmIChwYi0+cGJfZXJyb3IpIHsKKwkJaWYgKHVubGlrZWx5KHBiLT5wYl9lcnJvcikpIHsKKwkJCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkKKwkJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAkJfSBlbHNlIGlmIChibG9ja3NpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CiAJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC0xMjcwLDEwICsxMjY4LDEzIEBACiAJCQlzZXRfcGFnZV9yZWdpb24ocGFnZSwgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4pOwogCQl9CiAKKwkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKKwkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOworCiAJCWlmIChfcGFnZWJ1Zl9pb2xvY2tlZChwYikpIHsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9Ci0JfQorCX0gd2hpbGUgKGJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpOwogCiAJX3BhZ2VidWZfaW9kb25lKHBiLCAxKTsKIAliaW9fcHV0KGJpbyk7CkBAIC0xNTExLDYgKzE1MTIsMTEgQEAKIAkJCUFTU0VSVChidHAgPT0gYnAtPnBiX3RhcmdldCk7CiAJCQlpZiAoIShicC0+cGJfZmxhZ3MgJiBQQkZfRlNfTUFOQUdFRCkpIHsKIAkJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CisJCQkJLyoKKwkJCQkgKiBDYXRjaCBzdXBlcmJsb2NrIHJlZmVyZW5jZSBjb3VudCBsZWFrcworCQkJCSAqIGltbWVkaWF0ZWx5CisJCQkJICovCisJCQkJQlVHX09OKGJwLT5wYl9ibiA9PSAwKTsKIAkJCQlkZWxheSgxMDApOwogCQkJCWdvdG8gYWdhaW47CiAJCQl9CkBAIC0xNjg2LDE3ICsxNjkyLDIwIEBACiAJaW50CQkJdW5sb2NrKQogewogCVBCX1RSQUNFKHBiLCAiZGVsd3JpX3EiLCAobG9uZyl1bmxvY2spOwotCUFTU0VSVChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKTsKKwlBU1NFUlQoKHBiLT5wYl9mbGFncyAmIChQQkZfREVMV1JJfFBCRl9BU1lOQykpID09CisJCQkJCShQQkZfREVMV1JJfFBCRl9BU1lOQykpOwogCiAJc3Bpbl9sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CiAJLyogSWYgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGRlcXVldWUgYW5kIHBsYWNlIGF0IHRhaWwgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJnBiLT5wYl9saXN0KSkgeworCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgX1BCRl9ERUxXUklfUSk7CiAJCWlmICh1bmxvY2spIHsKIAkJCWF0b21pY19kZWMoJnBiLT5wYl9ob2xkKTsKIAkJfQogCQlsaXN0X2RlbCgmcGItPnBiX2xpc3QpOwogCX0KIAorCXBiLT5wYl9mbGFncyB8PSBfUEJGX0RFTFdSSV9ROwogCWxpc3RfYWRkX3RhaWwoJnBiLT5wYl9saXN0LCAmcGJkX2RlbHdyaXRlX3F1ZXVlKTsKIAlwYi0+cGJfcXVldWV0aW1lID0gamlmZmllczsKIAlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwpAQCAtMTcxMywxMCArMTcyMiwxMSBAQAogCiAJc3Bpbl9sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CiAJaWYgKChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKSAmJiAhbGlzdF9lbXB0eSgmcGItPnBiX2xpc3QpKSB7CisJCUFTU0VSVChwYi0+cGJfZmxhZ3MgJiBfUEJGX0RFTFdSSV9RKTsKIAkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2xpc3QpOwogCQlkZXF1ZXVlZCA9IDE7CiAJfQotCXBiLT5wYl9mbGFncyAmPSB+UEJGX0RFTFdSSTsKKwlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpOwogCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CiAKIAlpZiAoZGVxdWV1ZWQpCkBAIC0xNzMzLDkgKzE3NDMsNyBAQAogfQogCiAvKiBEZWZpbmVzIGZvciBwYWdlYnVmIGRhZW1vbiAqLwotU1RBVElDIERFQ0xBUkVfQ09NUExFVElPTih4ZnNidWZkX2RvbmUpOwogU1RBVElDIHN0cnVjdCB0YXNrX3N0cnVjdCAqeGZzYnVmZF90YXNrOwotU1RBVElDIGludCB4ZnNidWZkX2FjdGl2ZTsKIFNUQVRJQyBpbnQgeGZzYnVmZF9mb3JjZV9mbHVzaDsKIFNUQVRJQyBpbnQgeGZzYnVmZF9mb3JjZV9zbGVlcDsKIApAQCAtMTc2MSwxNCArMTc2OSw4IEBACiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldDsKIAl4ZnNfYnVmX3QJCSpwYiwgKm47CiAKLQkvKiAgU2V0IHVwIHRoZSB0aHJlYWQgICovCi0JZGFlbW9uaXplKCJ4ZnNidWZkIik7CiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CiAKLQl4ZnNidWZkX3Rhc2sgPSBjdXJyZW50OwotCXhmc2J1ZmRfYWN0aXZlID0gMTsKLQliYXJyaWVyKCk7Ci0KIAlJTklUX0xJU1RfSEVBRCgmdG1wKTsKIAlkbyB7CiAJCWlmICh1bmxpa2VseShmcmVlemluZyhjdXJyZW50KSkpIHsKQEAgLTE3NzgsMTAgKzE3ODAsMTAgQEAKIAkJCXhmc2J1ZmRfZm9yY2Vfc2xlZXAgPSAwOwogCQl9CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgoeGZzX2J1Zl90aW1lcl9jZW50aXNlY3MgKiBIWikgLyAxMDApOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUKKwkJCSh4ZnNfYnVmX3RpbWVyX2NlbnRpc2VjcyAqIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIAotCQlhZ2UgPSAoeGZzX2J1Zl9hZ2VfY2VudGlzZWNzICogSFopIC8gMTAwOworCQlhZ2UgPSB4ZnNfYnVmX2FnZV9jZW50aXNlY3MgKiBtc2Vjc190b19qaWZmaWVzKDEwKTsKIAkJc3Bpbl9sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYiwgbiwgJnBiZF9kZWx3cml0ZV9xdWV1ZSwgcGJfbGlzdCkgewogCQkJUEJfVFJBQ0UocGIsICJ3YWxrcTEiLCAobG9uZylwYWdlYnVmX2lzcGluKHBiKSk7CkBAIC0xNzk1LDcgKzE3OTcsNyBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9ERUxXUkk7CisJCQkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKTsKIAkJCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX1dSSVRFOwogCQkJCWxpc3RfbW92ZSgmcGItPnBiX2xpc3QsICZ0bXApOwogCQkJfQpAQCAtMTgxNiw5ICsxODE4LDkgQEAKIAkJCXB1cmdlX2FkZHJlc3NlcygpOwogCiAJCXhmc2J1ZmRfZm9yY2VfZmx1c2ggPSAwOwotCX0gd2hpbGUgKHhmc2J1ZmRfYWN0aXZlKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAotCWNvbXBsZXRlX2FuZF9leGl0KCZ4ZnNidWZkX2RvbmUsIDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTg0NSwxNSArMTg0NywxMyBAQAogCQlpZiAocGItPnBiX3RhcmdldCAhPSB0YXJnZXQpCiAJCQljb250aW51ZTsKIAotCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSk7CisJCUFTU0VSVChwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKSk7CiAJCVBCX1RSQUNFKHBiLCAid2Fsa3EyIiwgKGxvbmcpcGFnZWJ1Zl9pc3BpbihwYikpOwogCQlpZiAocGFnZWJ1Zl9pc3BpbihwYikpIHsKIAkJCXBpbmNvdW50Kys7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXBiLT5wYl9mbGFncyAmPSB+UEJGX0RFTFdSSTsKLQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKIAkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CiAJfQogCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CkBAIC0xODYyLDEyICsxODYyLDE0IEBACiAJICogRHJvcHBlZCB0aGUgZGVsYXllZCB3cml0ZSBsaXN0IGxvY2ssIG5vdyB3YWxrIHRoZSB0ZW1wb3JhcnkgbGlzdAogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYiwgbiwgJnRtcCwgcGJfbGlzdCkgeworCQlwYWdlYnVmX2xvY2socGIpOworCQlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpOworCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX1dSSVRFOwogCQlpZiAod2FpdCkKIAkJCXBiLT5wYl9mbGFncyAmPSB+UEJGX0FTWU5DOwogCQllbHNlCiAJCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7CiAKLQkJcGFnZWJ1Zl9sb2NrKHBiKTsKIAkJcGFnZWJ1Zl9pb3N0cmF0ZWd5KHBiKTsKIAl9CiAKQEAgLTE5MDEsOSArMTkwMywxMSBAQAogCWlmICgheGZzZGF0YWRfd29ya3F1ZXVlKQogCQlnb3RvIG91dF9kZXN0cm95X3hmc2xvZ2Rfd29ya3F1ZXVlOwogCi0JZXJyb3IgPSBrZXJuZWxfdGhyZWFkKHhmc2J1ZmQsIE5VTEwsIENMT05FX0ZTfENMT05FX0ZJTEVTKTsKLQlpZiAoZXJyb3IgPCAwKQorCXhmc2J1ZmRfdGFzayA9IGt0aHJlYWRfcnVuKHhmc2J1ZmQsIE5VTEwsICJ4ZnNidWZkIik7CisJaWYgKElTX0VSUih4ZnNidWZkX3Rhc2spKSB7CisJCWVycm9yID0gUFRSX0VSUih4ZnNidWZkX3Rhc2spOwogCQlnb3RvIG91dF9kZXN0cm95X3hmc2RhdGFkX3dvcmtxdWV1ZTsKKwl9CiAJcmV0dXJuIDA7CiAKICBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU6CkBAIC0xOTIwLDEwICsxOTI0LDcgQEAKIFNUQVRJQyB2b2lkCiB4ZnNfYnVmX2RhZW1vbnNfc3RvcCh2b2lkKQogewotCXhmc2J1ZmRfYWN0aXZlID0gMDsKLQliYXJyaWVyKCk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmeGZzYnVmZF9kb25lKTsKLQorCWt0aHJlYWRfc3RvcCh4ZnNidWZkX3Rhc2spOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNkYXRhZF93b3JrcXVldWUpOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAppbmRleCAzZjhmNjlhLi42N2MxOWY3IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaApAQCAtODksNiArODksNyBAQAogCV9QQkZfUEFHRV9DQUNIRSA9ICgxIDw8IDE3KSwvKiBiYWNrZWQgYnkgcGFnZWNhY2hlCQkgICAqLwogCV9QQkZfS01FTV9BTExPQyA9ICgxIDw8IDE4KSwvKiBiYWNrZWQgYnkga21lbV9hbGxvYygpCQkgICAqLwogCV9QQkZfUlVOX1FVRVVFUyA9ICgxIDw8IDE5KSwvKiBydW4gYmxvY2sgZGV2aWNlIHRhc2sgcXVldWUJICAgKi8KKwlfUEJGX0RFTFdSSV9RID0gKDEgPDwgMjEpLCAgIC8qIGJ1ZmZlciBvbiBkZWx3cmkgcXVldWUJCSAgICovCiB9IHBhZ2VfYnVmX2ZsYWdzX3Q7CiAKICNkZWZpbmUgUEJGX1VQREFURSAoUEJGX1JFQUQgfCBQQkZfV1JJVEUpCkBAIC0yMDYsMTMgKzIwNyw2IEBACiAjZGVmaW5lIHhmc19idWZfcmVhZCh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzKSBcCiAJeGZzX2J1Zl9yZWFkX2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgUEJGX0xPQ0sgfCBQQkZfTUFQUEVEKQogCi1leHRlcm4geGZzX2J1Zl90ICpwYWdlYnVmX2xvb2t1cCgKLQkJeGZzX2J1ZnRhcmdfdCAqLAotCQlsb2ZmX3QsCQkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UJCSovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBQQkZfUkVBRCwgUEJGX1dSSVRFLAkJKi8KLQkJCQkJLyogUEJGX0ZPUkNFSU8sIAkJKi8KLQogZXh0ZXJuIHhmc19idWZfdCAqcGFnZWJ1Zl9nZXRfZW1wdHkoCS8qIGFsbG9jYXRlIHBhZ2VidWYgc3RydWN0IHdpdGgJKi8KIAkJCQkJLyogIG5vIG1lbW9yeSBvciBkaXNrIGFkZHJlc3MJKi8KIAkJc2l6ZV90IGxlbiwKQEAgLTM0NCw4ICszMzgsNiBAQAogCiAKIAotCi0KIC8qIFRoZXNlIGFyZSBqdXN0IGZvciB4ZnNfc3luY3N1Yi4uLiBpdCBzZXRzIGFuIGludGVybmFsIHZhcmlhYmxlCiAgKiB0aGVuIHBhc3NlcyBpdCB0byBWT1BfRkxVU0hfUEFHRVMgb3IgYWRkcyB0aGUgZmxhZ3MgdG8gYSBuZXdseSBnb3R0ZW4gYnVmX3QKICAqLwpAQCAtNDUyLDcgKzQ0NCw3IEBACiAKICNkZWZpbmUgWEZTX0JVRl9QVFIoYnApCQkoeGZzX2NhZGRyX3QpKChicCktPnBiX2FkZHIpCiAKLWV4dGVybiBpbmxpbmUgeGZzX2NhZGRyX3QgeGZzX2J1Zl9vZmZzZXQoeGZzX2J1Zl90ICpicCwgc2l6ZV90IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgeGZzX2NhZGRyX3QgeGZzX2J1Zl9vZmZzZXQoeGZzX2J1Zl90ICpicCwgc2l6ZV90IG9mZnNldCkKIHsKIAlpZiAoYnAtPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkKIAkJcmV0dXJuIFhGU19CVUZfUFRSKGJwKSArIG9mZnNldDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCBmMWNlNDMyLi4zODgxNjIyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0zMTEsNiArMzExLDMxIEBACiAKICNkZWZpbmUgbmV4dGRwKGRwKSAgICAgICgoc3RydWN0IHhmc19kaXJlbnQgKikoKGNoYXIgKikoZHApICsgKGRwKS0+ZF9yZWNsZW4pKQogCisjaWZkZWYgQ09ORklHX1hGU19ETUFQSQorCitTVEFUSUMgc3RydWN0IHBhZ2UgKgorbGludmZzX2ZpbGVtYXBfbm9wYWdlKAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAkqYXJlYSwKKwl1bnNpZ25lZCBsb25nCQlhZGRyZXNzLAorCWludAkJCSp0eXBlKQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBhcmVhLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwl4ZnNfbW91bnRfdAkqbXAgPSBYRlNfVkZTVE9NKHZwLT52X3Zmc3ApOworCWludAkJZXJyb3I7CisKKwlBU1NFUlRfQUxXQVlTKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX0RNSSk7CisKKwllcnJvciA9IFhGU19TRU5EX01NQVAobXAsIGFyZWEsIDApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZmlsZW1hcF9ub3BhZ2UoYXJlYSwgYWRkcmVzcywgdHlwZSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfWEZTX0RNQVBJICovCisKKwogU1RBVElDIGludAogbGludmZzX3JlYWRkaXIoCiAJc3RydWN0IGZpbGUJKmZpbHAsCkBAIC0zOTAsMTQgKzQxNSw2IEBACiAJcmV0dXJuIC1lcnJvcjsKIH0KIAotI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKLVNUQVRJQyB2b2lkCi1saW52ZnNfbW1hcF9jbG9zZSgKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJKnZtYSkKLXsKLQl4ZnNfZG1fbW1fcHV0KHZtYSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1hGU19ETUFQSSAqLwogCiBTVEFUSUMgaW50CiBsaW52ZnNfZmlsZV9tbWFwKApAQCAtNDExLDE2ICs0MjgsMTEgQEAKIAogCXZtYS0+dm1fb3BzID0gJmxpbnZmc19maWxlX3ZtX29wczsKIAotCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpIHsKLQkJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKLQotCQllcnJvciA9IC1YRlNfU0VORF9NTUFQKG1wLCB2bWEsIDApOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7CiAjaWZkZWYgQ09ORklHX1hGU19ETUFQSQorCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpIHsKIAkJdm1hLT52bV9vcHMgPSAmbGludmZzX2RtYXBpX2ZpbGVfdm1fb3BzOwotI2VuZGlmCiAJfQorI2VuZGlmIC8qIENPTkZJR19YRlNfRE1BUEkgKi8KIAogCVZPUF9TRVRBVFRSKHZwLCAmdmEsIFhGU19BVF9VUERBVElNRSwgTlVMTCwgZXJyb3IpOwogCWlmICghZXJyb3IpCkBAIC00NzQsNiArNDg2LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKyNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCiAjaWZkZWYgSEFWRV9WTU9QX01QUk9URUNUCiBTVEFUSUMgaW50CiBsaW52ZnNfbXByb3RlY3QoCkBAIC00OTQsNiArNTA3LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAjZW5kaWYgLyogSEFWRV9WTU9QX01QUk9URUNUICovCisjZW5kaWYgLyogQ09ORklHX1hGU19ETUFQSSAqLwogCiAjaWZkZWYgSEFWRV9GT1BfT1BFTl9FWEVDCiAvKiBJZiB0aGUgdXNlciBpcyBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgYSBmaWxlIHRoYXQgaXMgb2ZmbGluZSB0aGVuCkBAIC01MjgsNDkgKzU0MiwxMCBAQAogfQogI2VuZGlmIC8qIEhBVkVfRk9QX09QRU5fRVhFQyAqLwogCi0vKgotICogVGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gdGhlIEFJTyBkaXJlY3QgSU8gd3JpdGUgcHJvYmxlbS4KLSAqIFRoaXMgY29kZSBjYW4gZ28gYW5kIHdlIGNhbiByZXZlcnQgdG8gZG9fc3luY193cml0ZSBvbmNlCi0gKiB0aGUgd3JpdGVwYWdlKHMpIHJld29yayBpcyBtZXJnZWQuCi0gKi8KLVNUQVRJQyBzc2l6ZV90Ci1saW52ZnNfd3JpdGUoCi0Jc3RydWN0IGZpbGUJKmZpbHAsCi0JY29uc3QgY2hhcglfX3VzZXIgKmJ1ZiwKLQlzaXplX3QJCWxlbiwKLQlsb2ZmX3QJCSpwcG9zKQotewotCXN0cnVjdCBraW9jYglraW9jYjsKLQlzc2l6ZV90CQlyZXQ7Ci0KLQlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxwKTsKLQlraW9jYi5raV9wb3MgPSAqcHBvczsKLQlyZXQgPSBfX2xpbnZmc193cml0ZSgma2lvY2IsIGJ1ZiwgMCwgbGVuLCBraW9jYi5raV9wb3MpOwotCSpwcG9zID0ga2lvY2Iua2lfcG9zOwotCXJldHVybiByZXQ7Ci19Ci1TVEFUSUMgc3NpemVfdAotbGludmZzX3dyaXRlX2ludmlzKAotCXN0cnVjdCBmaWxlCSpmaWxwLAotCWNvbnN0IGNoYXIJX191c2VyICpidWYsCi0Jc2l6ZV90CQlsZW4sCi0JbG9mZl90CQkqcHBvcykKLXsKLQlzdHJ1Y3Qga2lvY2IJa2lvY2I7Ci0Jc3NpemVfdAkJcmV0OwotCi0JaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlscCk7Ci0Ja2lvY2Iua2lfcG9zID0gKnBwb3M7Ci0JcmV0ID0gX19saW52ZnNfd3JpdGUoJmtpb2NiLCBidWYsIElPX0lOVklTLCBsZW4sIGtpb2NiLmtpX3Bvcyk7Ci0JKnBwb3MgPSBraW9jYi5raV9wb3M7Ci0JcmV0dXJuIHJldDsKLX0KLQotCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpbnZmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbGludmZzX3dyaXRlLAorCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAogCS5yZWFkdgkJPSBsaW52ZnNfcmVhZHYsCiAJLndyaXRldgkJPSBsaW52ZnNfd3JpdGV2LAogCS5haW9fcmVhZAk9IGxpbnZmc19haW9fcmVhZCwKQEAgLTU5Miw3ICs1NjcsNyBAQAogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBkb19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IGxpbnZmc193cml0ZV9pbnZpcywKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKIAkucmVhZHYJCT0gbGludmZzX3JlYWR2X2ludmlzLAogCS53cml0ZXYJCT0gbGludmZzX3dyaXRldl9pbnZpcywKIAkuYWlvX3JlYWQJPSBsaW52ZnNfYWlvX3JlYWRfaW52aXMsCkBAIC02MjYsOCArNjAxLDcgQEAKIAogI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKIHN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbGludmZzX2RtYXBpX2ZpbGVfdm1fb3BzID0gewotCS5jbG9zZQkJPSBsaW52ZnNfbW1hcF9jbG9zZSwKLQkubm9wYWdlCQk9IGZpbGVtYXBfbm9wYWdlLAorCS5ub3BhZ2UJCT0gbGludmZzX2ZpbGVtYXBfbm9wYWdlLAogCS5wb3B1bGF0ZQk9IGZpbGVtYXBfcG9wdWxhdGUsCiAjaWZkZWYgSEFWRV9WTU9QX01QUk9URUNUCiAJLm1wcm90ZWN0CT0gbGludmZzX21wcm90ZWN0LApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKaW5kZXggMDVhNDQ3ZS4uNmEzMzI2YiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCkBAIC0xNDEsMTMgKzE0MSwxOSBAQAogCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOwogCX0KIAotCS8qIHdlIG5lZWQgdGhlIHZub2RlICovCi0JdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKLQlpZiAodnAtPnZfdHlwZSAhPSBWUkVHICYmIHZwLT52X3R5cGUgIT0gVkRJUiAmJiB2cC0+dl90eXBlICE9IFZMTkspIHsKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJY2FzZSBTX0lGRElSOgorCWNhc2UgU19JRkxOSzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJaXB1dChpbm9kZSk7CiAJCXJldHVybiAtWEZTX0VSUk9SKEVCQURGKTsKIAl9CiAKKwkvKiB3ZSBuZWVkIHRoZSB2bm9kZSAqLworCXZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisKIAkvKiBub3cgd2UgY2FuIGdyYWIgdGhlIGZzaWQgKi8KIAltZW1jcHkoJmhhbmRsZS5oYV9mc2lkLCB2cC0+dl92ZnNwLT52ZnNfYWx0ZnNpZCwgc2l6ZW9mKHhmc19mc2lkX3QpKTsKIAloc2l6ZSA9IHNpemVvZih4ZnNfZnNpZF90KTsKQEAgLTM4Niw3ICszOTIsNyBAQAogCQlyZXR1cm4gLWVycm9yOwogCiAJLyogUmVzdHJpY3QgdGhpcyBoYW5kbGUgb3BlcmF0aW9uIHRvIHN5bWxpbmtzIG9ubHkuICovCi0JaWYgKHZwLT52X3R5cGUgIT0gVkxOSykgeworCWlmICghU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgewogCQlWTl9SRUxFKHZwKTsKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKIAl9CkBAIC05ODIsMTAgKzk4OCwxMCBAQAogCWlmICh2cC0+dl9pbm9kZS5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOwogCi0JaWYgKCEoZmlscC0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSkKKwlpZiAoIShmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVCQURGKTsKIAotCWlmICh2cC0+dl90eXBlICE9IFZSRUcpCisJaWYgKCFWTl9JU1JFRyh2cCkpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmJmLCBhcmcsIHNpemVvZihiZikpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCmluZGV4IDBmOGYxMzguLjQ2MzZiN2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKQEAgLTQ3LDggKzQ3LDUyIEBACiAjaW5jbHVkZSAieGZzX3Zub2RlLmgiCiAjaW5jbHVkZSAieGZzX2RmcmFnLmgiCiAKKyNkZWZpbmUgIF9OQVRJVkVfSU9DKGNtZCwgdHlwZSkgXAorCSAgX0lPQyhfSU9DX0RJUihjbWQpLCBfSU9DX1RZUEUoY21kKSwgX0lPQ19OUihjbWQpLCBzaXplb2YodHlwZSkpCisKICNpZiBkZWZpbmVkKENPTkZJR19JQTY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfNjQpCiAjZGVmaW5lIEJST0tFTl9YODZfQUxJR05NRU5UCisvKiBvbiBpYTMyIGxfc3RhcnQgaXMgb24gYSAzMi1iaXQgYm91bmRhcnkgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mbG9jazY0XzMyIHsKKwlfX3MxNgkJbF90eXBlOworCV9fczE2CQlsX3doZW5jZTsKKwlfX3M2NAkJbF9zdGFydAlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwkJCS8qIGxlbiA9PSAwIG1lYW5zIHVudGlsIGVuZCBvZiBmaWxlICovCisJX19zNjQJCWxfbGVuIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCV9fczMyCQlsX3N5c2lkOworCV9fdTMyCQlsX3BpZDsKKwlfX3MzMgkJbF9wYWRbNF07CS8qIHJlc2VydmUgYXJlYSAqLworfSB4ZnNfZmxvY2s2NF8zMl90OworCisjZGVmaW5lIFhGU19JT0NfQUxMT0NTUF8zMglfSU9XICgnWCcsIDEwLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCisjZGVmaW5lIFhGU19JT0NfRlJFRVNQXzMyCV9JT1cgKCdYJywgMTEsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKKyNkZWZpbmUgWEZTX0lPQ19BTExPQ1NQNjRfMzIJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IHhmc19mbG9jazY0XzMyKQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUDY0XzMyCV9JT1cgKCdYJywgMzcsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKKyNkZWZpbmUgWEZTX0lPQ19SRVNWU1BfMzIJX0lPVyAoJ1gnLCA0MCwgc3RydWN0IHhmc19mbG9jazY0XzMyKQorI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQXzMyCV9JT1cgKCdYJywgNDEsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKKyNkZWZpbmUgWEZTX0lPQ19SRVNWU1A2NF8zMglfSU9XICgnWCcsIDQyLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCisjZGVmaW5lIFhGU19JT0NfVU5SRVNWU1A2NF8zMglfSU9XICgnWCcsIDQzLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCisKKy8qIGp1c3QgYWNjb3VudCBmb3IgZGlmZmVyZW50IGFsaWdubWVudCAqLworU1RBVElDIHVuc2lnbmVkIGxvbmcKK3hmc19pb2N0bDMyX2Zsb2NrKAorCXVuc2lnbmVkIGxvbmcJCWFyZykKK3sKKwl4ZnNfZmxvY2s2NF8zMl90CV9fdXNlciAqcDMyID0gKHZvaWQgX191c2VyICopYXJnOworCXhmc19mbG9jazY0X3QJCV9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOworCisJaWYgKGNvcHlfaW5fdXNlcigmcC0+bF90eXBlLAkmcDMyLT5sX3R5cGUsCXNpemVvZihzMTYpKSB8fAorCSAgICBjb3B5X2luX3VzZXIoJnAtPmxfd2hlbmNlLAkmcDMyLT5sX3doZW5jZSwgc2l6ZW9mKHMxNikpIHx8CisJICAgIGNvcHlfaW5fdXNlcigmcC0+bF9zdGFydCwJJnAzMi0+bF9zdGFydCwJc2l6ZW9mKHM2NCkpIHx8CisJICAgIGNvcHlfaW5fdXNlcigmcC0+bF9sZW4sCSZwMzItPmxfbGVuLAlzaXplb2YoczY0KSkgfHwKKwkgICAgY29weV9pbl91c2VyKCZwLT5sX3N5c2lkLAkmcDMyLT5sX3N5c2lkLAlzaXplb2YoczMyKSkgfHwKKwkgICAgY29weV9pbl91c2VyKCZwLT5sX3BpZCwJJnAzMi0+bF9waWQsCXNpemVvZih1MzIpKSB8fAorCSAgICBjb3B5X2luX3VzZXIoJnAtPmxfcGFkLAkmcDMyLT5sX3BhZCwJNCpzaXplb2YodTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCQorCXJldHVybiAodW5zaWduZWQgbG9uZylwOworfQorCiAjZWxzZQogCiB0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxMzIgewpAQCAtMTAzLDcgKzE0Nyw2IEBACiAvKiBub3QgaGFuZGxlZAogCWNhc2UgWEZTX0lPQ19GRF9UT19IQU5ETEU6CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFOgotCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0hBTkRMRToKIAljYXNlIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRToKIAljYXNlIFhGU19JT0NfT1BFTl9CWV9IQU5ETEU6CiAJY2FzZSBYRlNfSU9DX0ZTU0VURE1fQllfSEFORExFOgpAQCAtMTI0LDggKzE2NywyMSBAQAogCWNhc2UgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTDoKIAkJYnJlYWs7CiAKLSNpZm5kZWYgQlJPS0VOX1g4Nl9BTElHTk1FTlQKLQkvKiB4ZnNfZmxvY2tfdCBhbmQgeGZzX2JzdGF0X3QgaGF2ZSB3cm9uZyB1MzIgdnMgdTY0IGFsaWdubWVudCAqLworI2lmZGVmIEJST0tFTl9YODZfQUxJR05NRU5UCisJLyogeGZzX2Zsb2NrX3QgaGFzIHdyb25nIHUzMiB2cyB1NjQgYWxpZ25tZW50ICovCisJY2FzZSBYRlNfSU9DX0FMTE9DU1BfMzI6CisJY2FzZSBYRlNfSU9DX0ZSRUVTUF8zMjoKKwljYXNlIFhGU19JT0NfQUxMT0NTUDY0XzMyOgorCWNhc2UgWEZTX0lPQ19GUkVFU1A2NF8zMjoKKwljYXNlIFhGU19JT0NfUkVTVlNQXzMyOgorCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUF8zMjoKKwljYXNlIFhGU19JT0NfUkVTVlNQNjRfMzI6CisJY2FzZSBYRlNfSU9DX1VOUkVTVlNQNjRfMzI6CisJCWFyZyA9IHhmc19pb2N0bDMyX2Zsb2NrKGFyZyk7CisJCWNtZCA9IF9OQVRJVkVfSU9DKGNtZCwgc3RydWN0IHhmc19mbG9jazY0KTsKKwkJYnJlYWs7CisKKyNlbHNlIC8qIFRoZXNlIGFyZSBoYW5kbGVkIGZpbmUgaWYgbm8gYWxpZ25tZW50IGlzc3VlcyAqLwogCWNhc2UgWEZTX0lPQ19BTExPQ1NQOgogCWNhc2UgWEZTX0lPQ19GUkVFU1A6CiAJY2FzZSBYRlNfSU9DX1JFU1ZTUDoKQEAgLTEzNCw2ICsxOTAsOSBAQAogCWNhc2UgWEZTX0lPQ19GUkVFU1A2NDoKIAljYXNlIFhGU19JT0NfUkVTVlNQNjQ6CiAJY2FzZSBYRlNfSU9DX1VOUkVTVlNQNjQ6CisJCWJyZWFrOworCisJLyogeGZzX2JzdGF0X3Qgc3RpbGwgaGFzIHdyb25nIHUzMiB2cyB1NjQgYWxpZ25tZW50ICovCiAJY2FzZSBYRlNfSU9DX1NXQVBFWFQ6CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggZjI1MjYwNS4uNzc3MDhhOCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtMTQwLDcgKzE0MCw2IEBACiAKIAltZW1zZXQoJnZhLCAwLCBzaXplb2YodmEpKTsKIAl2YS52YV9tYXNrID0gWEZTX0FUX1RZUEV8WEZTX0FUX01PREU7Ci0JdmEudmFfdHlwZSA9IElGVE9WVChtb2RlKTsKIAl2YS52YV9tb2RlID0gbW9kZTsKIAogCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewpAQCAtMzA4LDE0ICszMDcsMTMgQEAKIAljdnAgPSBOVUxMOwogCiAJbWVtc2V0KCZ2YSwgMCwgc2l6ZW9mKHZhKSk7Ci0JdmEudmFfdHlwZSA9IFZMTks7Ci0JdmEudmFfbW9kZSA9IGlyaXhfc3ltbGlua19tb2RlID8gMDc3NyAmIH5jdXJyZW50LT5mcy0+dW1hc2sgOiBTX0lSV1hVR087CisJdmEudmFfbW9kZSA9IFNfSUZMTksgfAorCQkoaXJpeF9zeW1saW5rX21vZGUgPyAwNzc3ICYgfmN1cnJlbnQtPmZzLT51bWFzayA6IFNfSVJXWFVHTyk7CiAJdmEudmFfbWFzayA9IFhGU19BVF9UWVBFfFhGU19BVF9NT0RFOwogCiAJZXJyb3IgPSAwOwogCVZPUF9TWU1MSU5LKGR2cCwgZGVudHJ5LCAmdmEsIChjaGFyICopc3ltbmFtZSwgJmN2cCwgTlVMTCwgZXJyb3IpOwogCWlmICghZXJyb3IgJiYgY3ZwKSB7Ci0JCUFTU0VSVChjdnAtPnZfdHlwZSA9PSBWTE5LKTsKIAkJaXAgPSBMSU5WRlNfR0VUX0lQKGN2cCk7CiAJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7CiAJCXZhbGlkYXRlX2ZpZWxkcyhkaXIpOwpAQCAtNDI1LDkgKzQyMywxNCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBsaW52ZnNfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgdm9pZCAqcCkKK1NUQVRJQyB2b2lkCitsaW52ZnNfcHV0X2xpbmsoCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCXN0cnVjdCBuYW1laWRhdGEgKm5kLAorCXZvaWQJCSpwKQogewotCWNoYXIgKnMgPSBuZF9nZXRfbGluayhuZCk7CisJY2hhcgkJKnMgPSBuZF9nZXRfbGluayhuZCk7CisKIAlpZiAoIUlTX0VSUihzKSkKIAkJa2ZyZWUocyk7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAppbmRleCA0MmRjNWU0Li42OGM1ZDg4IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKQEAgLTY0LDcgKzY0LDYgQEAKICNpbmNsdWRlIDxzZW1hLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCi0jaW5jbHVkZSA8c3VwcG9ydC9xc29ydC5oPgogI2luY2x1ZGUgPHN1cHBvcnQva3RyYWNlLmg+CiAjaW5jbHVkZSA8c3VwcG9ydC9kZWJ1Zy5oPgogI2luY2x1ZGUgPHN1cHBvcnQvbW92ZS5oPgpAQCAtMTA0LDYgKzEwMyw3IEBACiAjaW5jbHVkZSA8eGZzX3N0YXRzLmg+CiAjaW5jbHVkZSA8eGZzX3N5c2N0bC5oPgogI2luY2x1ZGUgPHhmc19pb3BzLmg+CisjaW5jbHVkZSA8eGZzX2FvcHMuaD4KICNpbmNsdWRlIDx4ZnNfc3VwZXIuaD4KICNpbmNsdWRlIDx4ZnNfZ2xvYmFscy5oPgogI2luY2x1ZGUgPHhmc19mc19zdWJyLmg+CkBAIC0yNTQsMTEgKzI1NCwxOCBAQAogI2RlZmluZSBNQVgoYSxiKQkobWF4KGEsYikpCiAjZGVmaW5lIGhvd21hbnkoeCwgeSkJKCgoeCkrKCh5KS0xKSkvKHkpKQogI2RlZmluZSByb3VuZHVwKHgsIHkpCSgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKyNkZWZpbmUgcXNvcnQoYSxuLHMsZm4pCXNvcnQoYSxuLHMsZm4sTlVMTCkKIAorLyoKKyAqIFZhcmlvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGNhbGxzIHRoYXQgZG9uJ3QgZml0IGFueXdoZXJlIGVsc2UKKyAqLwogI2RlZmluZSB4ZnNfc3RhY2tfdHJhY2UoKQlkdW1wX3N0YWNrKCkKLQogI2RlZmluZSB4ZnNfaXRydW5jYXRlX2RhdGEoaXAsIG9mZikJXAogCSgtdm10cnVuY2F0ZShMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSksIChvZmYpKSkKKyNkZWZpbmUgeGZzX3N0YXR2ZnNfZnNpZChzdGF0cCwgbXApCVwKKwkoeyB1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYoKG1wKS0+bV9kZXYpOwlcCisJICAgX19rZXJuZWxfZnNpZF90ICpmc2lkID0gJihzdGF0cCktPmZfZnNpZDsJXAorCShmc2lkLT52YWxbMF0gPSAodTMyKWlkLCBmc2lkLT52YWxbMV0gPSAodTMyKShpZCA+PiAzMikpOyB9KQogCiAKIC8qIE1vdmUgdGhlIGtlcm5lbCBkb19kaXYgZGVmaW5pdGlvbiBvZmYgdG8gb25lIHNpZGUgKi8KQEAgLTM3MSw2ICszNzgsNCBAQAogCXJldHVybih4ICogeSk7CiB9CiAKLSNkZWZpbmUgcXNvcnQoYSwgbiwgcywgY21wKSBzb3J0KGEsIG4sIHMsIGNtcCwgTlVMTCkKLQogI2VuZGlmIC8qIF9fWEZTX0xJTlVYX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKaW5kZXggYWNhYjU4Yy4uM2I1ZmFiZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKQEAgLTY2MCw5ICs2NjAsNiBAQAogCQkJKHhpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPwogCQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKIAotCQlpZiAoaW9mbGFncyAmIElPX0lTQUlPKQotCQkJcmV0dXJuIFhGU19FUlJPUigtRU5PU1lTKTsKLQogCQlpZiAoKHBvcyAmIHRhcmdldC0+cGJyX3NtYXNrKSB8fCAoY291bnQgJiB0YXJnZXQtPnBicl9zbWFzaykpCiAJCQlyZXR1cm4gWEZTX0VSUk9SKC1FSU5WQUwpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5oCmluZGV4IGYxOTdhNzIuLjYyOTRkY2RiIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuaApAQCAtNzAsOSArNzAsMTAgQEAKICNkZWZpbmUJWEZTX1NFTkRGSUxFX0VOVEVSCTIxCiAjZGVmaW5lCVhGU19XUklURVBBR0VfRU5URVIJMjIKICNkZWZpbmUJWEZTX1JFTEVBU0VQQUdFX0VOVEVSCTIzCi0jZGVmaW5lCVhGU19JT01BUF9BTExPQ19FTlRFUgkyNAotI2RlZmluZQlYRlNfSU9NQVBfQUxMT0NfTUFQCTI1Ci0jZGVmaW5lCVhGU19JT01BUF9VTldSSVRURU4JMjYKKyNkZWZpbmUJWEZTX0lOVkFMSURQQUdFX0VOVEVSCTI0CisjZGVmaW5lCVhGU19JT01BUF9BTExPQ19FTlRFUgkyNQorI2RlZmluZQlYRlNfSU9NQVBfQUxMT0NfTUFQCTI2CisjZGVmaW5lCVhGU19JT01BUF9VTldSSVRURU4JMjcKIGV4dGVybiB2b2lkIHhmc19yd19lbnRlcl90cmFjZShpbnQsIHN0cnVjdCB4ZnNfaW9jb3JlICosCiAJCQkJdm9pZCAqLCBzaXplX3QsIGxvZmZfdCwgaW50KTsKIGV4dGVybiB2b2lkIHhmc19pbnZhbF9jYWNoZWRfdHJhY2Uoc3RydWN0IHhmc19pb2NvcmUgKiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IGY2ZGQ3ZGUuLjIzMDI0NTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtNzAsMTEgKzcwLDE1IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiBTVEFUSUMgc3RydWN0IHF1b3RhY3RsX29wcyBsaW52ZnNfcW9wczsKIFNUQVRJQyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBsaW52ZnNfc29wczsKLVNUQVRJQyBrbWVtX3pvbmVfdCAqbGludmZzX2lub2RlX3pvbmU7CitTVEFUSUMga21lbV96b25lX3QgKnhmc192bm9kZV96b25lOworU1RBVElDIGttZW1fem9uZV90ICp4ZnNfaW9lbmRfem9uZTsKK21lbXBvb2xfdCAqeGZzX2lvZW5kX3Bvb2w7CiAKIFNUQVRJQyBzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKgogeGZzX2FyZ3NfYWxsb2NhdGUoCkBAIC0xMzgsMjQgKzE0MiwyNSBAQAogeGZzX3NldF9pbm9kZW9wcygKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSkKIHsKLQl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7Ci0KLQlpZiAodnAtPnZfdHlwZSA9PSBWTk9OKSB7Ci0JCXZuX21hcmtfYmFkKHZwKTsKLQl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CiAJCWlub2RlLT5pX29wID0gJmxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZsaW52ZnNfZmlsZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZsaW52ZnNfYW9wczsKLQl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJYnJlYWs7CisJY2FzZSBTX0lGRElSOgogCQlpbm9kZS0+aV9vcCA9ICZsaW52ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZsaW52ZnNfZGlyX29wZXJhdGlvbnM7Ci0JfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKIAkJaW5vZGUtPmlfb3AgPSAmbGludmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIAkJaWYgKGlub2RlLT5pX2Jsb2NrcykKIAkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmxpbnZmc19hb3BzOwotCX0gZWxzZSB7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWlub2RlLT5pX29wID0gJmxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtMTY3LDE2ICsxNzIsMjMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOwogCi0JaW5vZGUtPmlfbW9kZQk9IChpcC0+aV9kLmRpX21vZGUgJiBNT0RFTUFTSykgfCBWVFRPSUYodnAtPnZfdHlwZSk7CisJaW5vZGUtPmlfbW9kZQk9IGlwLT5pX2QuZGlfbW9kZTsKIAlpbm9kZS0+aV9ubGluawk9IGlwLT5pX2QuZGlfbmxpbms7CiAJaW5vZGUtPmlfdWlkCT0gaXAtPmlfZC5kaV91aWQ7CiAJaW5vZGUtPmlfZ2lkCT0gaXAtPmlfZC5kaV9naWQ7Ci0JaWYgKCgoMSA8PCB2cC0+dl90eXBlKSAmICgoMTw8VkJMSykgfCAoMTw8VkNIUikpKSA9PSAwKSB7CisKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCQlpbm9kZS0+aV9yZGV2ID0KKwkJCU1LREVWKHN5c3ZfbWFqb3IoaXAtPmlfZGYuaWZfdTIuaWZfcmRldikgJiAweDFmZiwKKwkJCSAgICAgIHN5c3ZfbWlub3IoaXAtPmlfZGYuaWZfdTIuaWZfcmRldikpOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlpbm9kZS0+aV9yZGV2ID0gMDsKLQl9IGVsc2UgewotCQl4ZnNfZGV2X3QgZGV2ID0gaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKLQkJaW5vZGUtPmlfcmRldiA9IE1LREVWKHN5c3ZfbWFqb3IoZGV2KSAmIDB4MWZmLCBzeXN2X21pbm9yKGRldikpOworCQlicmVhazsKIAl9CisKIAlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2dlbmVyYXRpb24gPSBpcC0+aV9kLmRpX2dlbjsKIAlpX3NpemVfd3JpdGUoaW5vZGUsIGlwLT5pX2QuZGlfc2l6ZSk7CkBAIC0yMzEsNyArMjQzLDYgQEAKIAkgKiBmaW5pc2ggb3VyIHdvcmsuCiAJICovCiAJaWYgKGlwLT5pX2QuZGlfbW9kZSAhPSAwICYmIHVubG9jayAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKLQkJdnAtPnZfdHlwZSA9IElGVE9WVChpcC0+aV9kLmRpX21vZGUpOwogCQl4ZnNfcmV2YWxpZGF0ZV9pbm9kZShYRlNfQkhWVE9NKGJkcCksIHZwLCBpcCk7CiAJCXhmc19zZXRfaW5vZGVvcHMoaW5vZGUpOwogCQpAQCAtMjc0LDggKzI4NSw3IEBACiB7CiAJdm5vZGVfdAkJCSp2cDsKIAotCXZwID0gKHZub2RlX3QgKilrbWVtX2NhY2hlX2FsbG9jKGxpbnZmc19pbm9kZV96b25lLCAKLSAgICAgICAgICAgICAgICBrbWVtX2ZsYWdzX2NvbnZlcnQoS01fU0xFRVApKTsKKwl2cCA9IGttZW1fY2FjaGVfYWxsb2MoeGZzX3Zub2RlX3pvbmUsIGttZW1fZmxhZ3NfY29udmVydChLTV9TTEVFUCkpOwogCWlmICghdnApCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBMSU5WRlNfR0VUX0lQKHZwKTsKQEAgLTI4NSwxMSArMjk1LDExIEBACiBsaW52ZnNfZGVzdHJveV9pbm9kZSgKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSkKIHsKLQlrbWVtX2NhY2hlX2ZyZWUobGludmZzX2lub2RlX3pvbmUsIExJTlZGU19HRVRfVlAoaW5vZGUpKTsKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfdm5vZGVfem9uZSwgTElOVkZTX0dFVF9WUChpbm9kZSkpOwogfQogCiBTVEFUSUMgdm9pZAotaW5pdF9vbmNlKAorbGludmZzX2lub2RlX2luaXRfb25jZSgKIAl2b2lkCQkJKmRhdGEsCiAJa21lbV9jYWNoZV90CQkqY2FjaGVwLAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzKQpAQCAtMzAyLDIxICszMTIsNDEgQEAKIH0KIAogU1RBVElDIGludAotaW5pdF9pbm9kZWNhY2hlKCB2b2lkICkKK2xpbnZmc19pbml0X3pvbmVzKHZvaWQpCiB7Ci0JbGludmZzX2lub2RlX3pvbmUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGludmZzX2ljYWNoZSIsCisJeGZzX3Zub2RlX3pvbmUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgieGZzX3Zub2RlIiwKIAkJCQlzaXplb2Yodm5vZGVfdCksIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAotCQkJCWluaXRfb25jZSwgTlVMTCk7Ci0JaWYgKGxpbnZmc19pbm9kZV96b25lID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQkJCWxpbnZmc19pbm9kZV9pbml0X29uY2UsIE5VTEwpOworCWlmICgheGZzX3Zub2RlX3pvbmUpCisJCWdvdG8gb3V0OworCisJeGZzX2lvZW5kX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2lvZW5kX3QpLCAieGZzX2lvZW5kIik7CisJaWYgKCF4ZnNfaW9lbmRfem9uZSkKKwkJZ290byBvdXRfZGVzdHJveV92bm9kZV96b25lOworCisJeGZzX2lvZW5kX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZSg0ICogTUFYX0JVRl9QRVJfUEFHRSwKKwkJCW1lbXBvb2xfYWxsb2Nfc2xhYiwgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQl4ZnNfaW9lbmRfem9uZSk7CisJaWYgKCF4ZnNfaW9lbmRfcG9vbCkKKwkJZ290byBvdXRfZnJlZV9pb2VuZF96b25lOworCiAJcmV0dXJuIDA7CisKKworIG91dF9mcmVlX2lvZW5kX3pvbmU6CisJa21lbV96b25lX2Rlc3Ryb3koeGZzX2lvZW5kX3pvbmUpOworIG91dF9kZXN0cm95X3Zub2RlX3pvbmU6CisJa21lbV96b25lX2Rlc3Ryb3koeGZzX3Zub2RlX3pvbmUpOworIG91dDoKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogU1RBVElDIHZvaWQKLWRlc3Ryb3lfaW5vZGVjYWNoZSggdm9pZCApCitsaW52ZnNfZGVzdHJveV96b25lcyh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobGludmZzX2lub2RlX3pvbmUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FjaGUgc3RpbGwgaW4gdXNlIVxuIiwgX19GVU5DVElPTl9fKTsKKwltZW1wb29sX2Rlc3Ryb3koeGZzX2lvZW5kX3Bvb2wpOworCWttZW1fem9uZV9kZXN0cm95KHhmc192bm9kZV96b25lKTsKKwlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfaW9lbmRfem9uZSk7CiB9CiAKIC8qCkBAIC0zNTQsMTcgKzM4NCwzOCBAQAogCXN0cnVjdCBpbm9kZQkJKmlub2RlKQogewogCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCQllcnJvciwgY2FjaGU7CiAKLQlpZiAodnApIHsKLQkJdm5fcmVsZSh2cCk7Ci0JCXZuX3RyYWNlX2VudHJ5KHZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQkJLyoKLQkJICogRG8gYWxsIG91ciBjbGVhbnVwLCBhbmQgcmVtb3ZlIHRoaXMgdm5vZGUuCi0JCSAqLwotCQl2bl9yZW1vdmUodnApOworCXZuX3RyYWNlX2VudHJ5KHZwLCAiY2xlYXJfaW5vZGUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlYRlNfU1RBVFNfSU5DKHZuX3JlbGUpOworCVhGU19TVEFUU19JTkModm5fcmVtb3ZlKTsKKwlYRlNfU1RBVFNfSU5DKHZuX3JlY2xhaW0pOworCVhGU19TVEFUU19ERUModm5fYWN0aXZlKTsKKworCS8qCisJICogVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2UgeGZzX2lnZXRfY29yZSBjYWxscyB4ZnNfaWRlc3Ryb3kgaWYgd2UKKwkgKiBmaW5kIGFuIGlub2RlIHdpdGggZGlfbW9kZSA9PSAwIGJ1dCB3aXRob3V0IElHRVRfQ1JFQVRFIHNldC4KKwkgKi8KKwlpZiAodnAtPnZfZmJodikKKwkJVk9QX0lOQUNUSVZFKHZwLCBOVUxMLCBjYWNoZSk7CisKKwlWTl9MT0NLKHZwKTsKKwl2cC0+dl9mbGFnICY9IH5WTU9ESUZJRUQ7CisJVk5fVU5MT0NLKHZwLCAwKTsKKworCWlmICh2cC0+dl9mYmh2KSB7CisJCVZPUF9SRUNMQUlNKHZwLCBlcnJvcik7CisJCWlmIChlcnJvcikKKwkJCXBhbmljKCJ2bl9wdXJnZTogY2Fubm90IHJlY2xhaW0iKTsKIAl9Ci19CiAKKwlBU1NFUlQodnAtPnZfZmJodiA9PSBOVUxMKTsKKworI2lmZGVmIFhGU19WTk9ERV9UUkFDRQorCWt0cmFjZV9mcmVlKHZwLT52X3RyYWNlKTsKKyNlbmRpZgorfQogCiAvKgogICogRW5xdWV1ZSBhIHdvcmsgaXRlbSB0byBiZSBwaWNrZWQgdXAgYnkgdGhlIHZmcyB4ZnNzeW5jZCB0aHJlYWQuCkBAIC00MTYsNyArNDY3LDcgQEAKIAogCWlncmFiKGlub2RlKTsKIAl4ZnNfc3luY2RfcXVldWVfd29yayh2ZnMsIGlub2RlLCB4ZnNfZmx1c2hfaW5vZGVfd29yayk7Ci0JZGVsYXkoSFovMik7CisJZGVsYXkobXNlY3NfdG9famlmZmllcyg1MDApKTsKIH0KIAogLyoKQEAgLTQ0MSw3ICs0OTIsNyBAQAogCiAJaWdyYWIoaW5vZGUpOwogCXhmc19zeW5jZF9xdWV1ZV93b3JrKHZmcywgaW5vZGUsIHhmc19mbHVzaF9kZXZpY2Vfd29yayk7Ci0JZGVsYXkoSFovMik7CisJZGVsYXkobXNlY3NfdG9famlmZmllcyg1MDApKTsKIAl4ZnNfbG9nX2ZvcmNlKGlwLT5pX21vdW50LCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0V8WEZTX0xPR19TWU5DKTsKIH0KIApAQCAtNDY2LDI1ICs1MTcsMTUgQEAKIHsKIAlsb25nCQkJdGltZWxlZnQ7CiAJdmZzX3QJCQkqdmZzcCA9ICh2ZnNfdCAqKSBhcmc7Ci0Jc3RydWN0IGxpc3RfaGVhZAl0bXA7CiAJc3RydWN0IHZmc19zeW5jX3dvcmsJKndvcmssICpuOworCUxJU1RfSEVBRAkJKHRtcCk7CiAKLQlkYWVtb25pemUoInhmc3N5bmNkIik7Ci0KLQl2ZnNwLT52ZnNfc3luY193b3JrLndfdmZzID0gdmZzcDsKLQl2ZnNwLT52ZnNfc3luY193b3JrLndfc3luY2VyID0gdmZzX3N5bmNfd29ya2VyOwotCXZmc3AtPnZmc19zeW5jX3Rhc2sgPSBjdXJyZW50OwotCXdtYigpOwotCXdha2VfdXAoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdG1wKTsKLQl0aW1lbGVmdCA9ICh4ZnNfc3luY2RfY2VudGlzZWNzICogSFopIC8gMTAwOworCXRpbWVsZWZ0ID0geGZzX3N5bmNkX2NlbnRpc2VjcyAqIG1zZWNzX3RvX2ppZmZpZXMoMTApOwogCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVsZWZ0KTsKKwkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZWxlZnQpOwogCQkvKiBzd3N1c3AgKi8KIAkJdHJ5X3RvX2ZyZWV6ZSgpOwotCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfVU1PVU5UKQorCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJYnJlYWs7CiAKIAkJc3Bpbl9sb2NrKCZ2ZnNwLT52ZnNfc3luY19sb2NrKTsKQEAgLTQ5NSw3ICs1MzYsOCBAQAogCQkgKi8KIAkJaWYgKCF0aW1lbGVmdCB8fCBsaXN0X2VtcHR5KCZ2ZnNwLT52ZnNfc3luY19saXN0KSkgewogCQkJaWYgKCF0aW1lbGVmdCkKLQkJCQl0aW1lbGVmdCA9ICh4ZnNfc3luY2RfY2VudGlzZWNzICogSFopIC8gMTAwOworCQkJCXRpbWVsZWZ0ID0geGZzX3N5bmNkX2NlbnRpc2VjcyAqCisJCQkJCQkJbXNlY3NfdG9famlmZmllcygxMCk7CiAJCQlJTklUX0xJU1RfSEVBRCgmdmZzcC0+dmZzX3N5bmNfd29yay53X2xpc3QpOwogCQkJbGlzdF9hZGRfdGFpbCgmdmZzcC0+dmZzX3N5bmNfd29yay53X2xpc3QsCiAJCQkJCSZ2ZnNwLT52ZnNfc3luY19saXN0KTsKQEAgLTUxMywxMCArNTU1LDYgQEAKIAkJfQogCX0KIAotCXZmc3AtPnZmc19zeW5jX3Rhc2sgPSBOVUxMOwotCXdtYigpOwotCXdha2VfdXAoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTI0LDEzICs1NjIsMTEgQEAKIGxpbnZmc19zdGFydF9zeW5jZCgKIAl2ZnNfdAkJCSp2ZnNwKQogewotCWludAkJCXBpZDsKLQotCXBpZCA9IGtlcm5lbF90aHJlYWQoeGZzc3luY2QsICh2b2lkICopIHZmc3AsCi0JCQlDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOwotCWlmIChwaWQgPCAwKQotCQlyZXR1cm4gLXBpZDsKLQl3YWl0X2V2ZW50KHZmc3AtPnZmc193YWl0X3N5bmNfdGFzaywgdmZzcC0+dmZzX3N5bmNfdGFzayk7CisJdmZzcC0+dmZzX3N5bmNfd29yay53X3N5bmNlciA9IHZmc19zeW5jX3dvcmtlcjsKKwl2ZnNwLT52ZnNfc3luY193b3JrLndfdmZzID0gdmZzcDsKKwl2ZnNwLT52ZnNfc3luY190YXNrID0ga3RocmVhZF9ydW4oeGZzc3luY2QsIHZmc3AsICJ4ZnNzeW5jZCIpOworCWlmIChJU19FUlIodmZzcC0+dmZzX3N5bmNfdGFzaykpCisJCXJldHVybiAtUFRSX0VSUih2ZnNwLT52ZnNfc3luY190YXNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTM4LDExICs1NzQsNyBAQAogbGludmZzX3N0b3Bfc3luY2QoCiAJdmZzX3QJCQkqdmZzcCkKIHsKLQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfVU1PVU5UOwotCXdtYigpOwotCi0Jd2FrZV91cF9wcm9jZXNzKHZmc3AtPnZmc19zeW5jX3Rhc2spOwotCXdhaXRfZXZlbnQodmZzcC0+dmZzX3dhaXRfc3luY190YXNrLCAhdmZzcC0+dmZzX3N5bmNfdGFzayk7CisJa3RocmVhZF9zdG9wKHZmc3AtPnZmc19zeW5jX3Rhc2spOwogfQogCiBTVEFUSUMgdm9pZApAQCAtODY2LDkgKzg5OCw5IEBACiAKIAlrdHJhY2VfaW5pdCg2NCk7CiAKLQllcnJvciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWVycm9yID0gbGludmZzX2luaXRfem9uZXMoKTsKIAlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIHVuZG9faW5vZGVjYWNoZTsKKwkJZ290byB1bmRvX3pvbmVzOwogCiAJZXJyb3IgPSBwYWdlYnVmX2luaXQoKTsKIAlpZiAoZXJyb3IgPCAwKQpAQCAtODg5LDkgKzkyMSw5IEBACiAJcGFnZWJ1Zl90ZXJtaW5hdGUoKTsKIAogdW5kb19wYWdlYnVmOgotCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWxpbnZmc19kZXN0cm95X3pvbmVzKCk7CiAKLXVuZG9faW5vZGVjYWNoZToKK3VuZG9fem9uZXM6CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC05MDMsNyArOTM1LDcgQEAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnhmc19mc190eXBlKTsKIAl4ZnNfY2xlYW51cCgpOwogCXBhZ2VidWZfdGVybWluYXRlKCk7Ci0JZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJbGludmZzX2Rlc3Ryb3lfem9uZXMoKTsKIAlrdHJhY2VfdW5pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKaW5kZXggNjY5YzYxNi4uMzRjYzkwMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKQEAgLTI1MSw3ICsyNTEsNiBAQAogCWJodl9oZWFkX2luaXQoVkZTX0JIVkhFQUQodmZzcCksICJ2ZnMiKTsKIAlJTklUX0xJU1RfSEVBRCgmdmZzcC0+dmZzX3N5bmNfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnZmc3AtPnZmc19zeW5jX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdmZzcC0+dmZzX3dhaXRfc2luZ2xlX3N5bmNfdGFzayk7CiAJcmV0dXJuIHZmc3A7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5oCmluZGV4IDdlZTFmNzEuLmYwYWI1NzRmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaApAQCAtNjUsNyArNjUsNiBAQAogCXNwaW5sb2NrX3QJCXZmc19zeW5jX2xvY2s7CS8qIHdvcmsgaXRlbSBsaXN0IGxvY2sgKi8KIAlpbnQgCQkJdmZzX3N5bmNfc2VxOwkvKiBzeW5jIHRocmVhZCBnZW5lcmF0aW9uIG5vLiAqLwogCXdhaXRfcXVldWVfaGVhZF90CXZmc193YWl0X3NpbmdsZV9zeW5jX3Rhc2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJdmZzX3dhaXRfc3luY190YXNrOwogfSB2ZnNfdDsKIAogI2RlZmluZSB2ZnNfZmJodgkJdmZzX2JoLmJoX2ZpcnN0CS8qIDFzdCBvbiB2ZnMgYmVoYXZpb3IgY2hhaW4gKi8KQEAgLTk2LDcgKzk1LDYgQEAKICNkZWZpbmUgVkZTX1JET05MWQkJMHgwMDAxCS8qIHJlYWQtb25seSB2ZnMgKi8KICNkZWZpbmUgVkZTX0dSUElECQkweDAwMDIJLyogZ3JvdXAtSUQgYXNzaWduZWQgZnJvbSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgVkZTX0RNSQkJCTB4MDAwNAkvKiBmaWxlc3lzdGVtIGhhcyB0aGUgRE1JIGVuYWJsZWQgKi8KLSNkZWZpbmUgVkZTX1VNT1VOVAkJMHgwMDA4CS8qIHVubW91bnQgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVkZTX0VORAkJCTB4MDAwOAkvKiBtYXggZmxhZyAqLwogCiAjZGVmaW5lIFNZTkNfQVRUUgkJMHgwMDAxCS8qIHN5bmMgYXR0cmlidXRlcyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKaW5kZXggMjUwY2FkNS4uMjY4ZjQ1YiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCkBAIC00Miw5MyArNDIsMzMgQEAKICAqLwogI2RlZmluZSBOVlNZTkMgICAgICAgICAgICAgICAgICAzNwogI2RlZmluZSB2cHRvc3luYyh2KSAgICAgICAgICAgICAoJnZzeW5jWygodW5zaWduZWQgbG9uZyl2KSAlIE5WU1lOQ10pCi1zdl90IHZzeW5jW05WU1lOQ107Ci0KLS8qCi0gKiBUcmFuc2xhdGUgc3RhdCgyKSBmaWxlIHR5cGVzIHRvIHZub2RlIHR5cGVzIGFuZCB2aWNlIHZlcnNhLgotICogQXdhcmUgb2YgbnVtZXJpYyBvcmRlciBvZiBTX0lGTVQgYW5kIHZub2RlIHR5cGUgdmFsdWVzLgotICovCi1lbnVtIHZ0eXBlIGlmdG92dF90YWJbXSA9IHsKLQlWTk9OLCBWRklGTywgVkNIUiwgVk5PTiwgVkRJUiwgVk5PTiwgVkJMSywgVk5PTiwKLQlWUkVHLCBWTk9OLCBWTE5LLCBWTk9OLCBWU09DSywgVk5PTiwgVk5PTiwgVk5PTgotfTsKLQotdV9zaG9ydCB2dHRvaWZfdGFiW10gPSB7Ci0JMCwgU19JRlJFRywgU19JRkRJUiwgU19JRkJMSywgU19JRkNIUiwgU19JRkxOSywgU19JRklGTywgMCwgU19JRlNPQ0sKLX07CitTVEFUSUMgd2FpdF9xdWV1ZV9oZWFkX3QgdnN5bmNbTlZTWU5DXTsKIAogCiB2b2lkCiB2bl9pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXIgc3ZfdCAqc3ZwOwotCXJlZ2lzdGVyIGludCBpOworCWludCBpOwogCi0JZm9yIChzdnAgPSB2c3luYywgaSA9IDA7IGkgPCBOVlNZTkM7IGkrKywgc3ZwKyspCi0JCWluaXRfc3Yoc3ZwLCBTVl9ERUZBVUxULCAidnN5IiwgaSk7CisJZm9yIChpID0gMDsgaSA8IE5WU1lOQzsgaSsrKQorCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2c3luY1tpXSk7CiB9CiAKLS8qCi0gKiBDbGVhbiBhIHZub2RlIG9mIGZpbGVzeXN0ZW0tc3BlY2lmaWMgZGF0YSBhbmQgcHJlcGFyZSBpdCBmb3IgcmV1c2UuCi0gKi8KLVNUQVRJQyBpbnQKLXZuX3JlY2xhaW0oCit2b2lkCit2bl9pb3dhaXQoCiAJc3RydWN0IHZub2RlCSp2cCkKIHsKLQlpbnQJCWVycm9yOworCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IHZwdG9zeW5jKHZwKTsKIAotCVhGU19TVEFUU19JTkModm5fcmVjbGFpbSk7Ci0Jdm5fdHJhY2VfZW50cnkodnAsICJ2bl9yZWNsYWltIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwotCi0JLyoKLQkgKiBPbmx5IG1ha2UgdGhlIFZPUF9SRUNMQUlNIGNhbGwgaWYgdGhlcmUgYXJlIGJlaGF2aW9ycwotCSAqIHRvIGNhbGwuCi0JICovCi0JaWYgKHZwLT52X2ZiaHYpIHsKLQkJVk9QX1JFQ0xBSU0odnAsIGVycm9yKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIC1lcnJvcjsKLQl9Ci0JQVNTRVJUKHZwLT52X2ZiaHYgPT0gTlVMTCk7Ci0KLQlWTl9MT0NLKHZwKTsKLQl2cC0+dl9mbGFnICY9IChWUkVDTE18VldBSVQpOwotCVZOX1VOTE9DSyh2cCwgMCk7Ci0KLQl2cC0+dl90eXBlID0gVk5PTjsKLQl2cC0+dl9mYmh2ID0gTlVMTDsKLQotI2lmZGVmIFhGU19WTk9ERV9UUkFDRQotCWt0cmFjZV9mcmVlKHZwLT52X3RyYWNlKTsKLQl2cC0+dl90cmFjZSA9IE5VTEw7Ci0jZW5kaWYKLQotCXJldHVybiAwOworCXdhaXRfZXZlbnQoKndxLCAoYXRvbWljX3JlYWQoJnZwLT52X2lvY291bnQpID09IDApKTsKIH0KIAotU1RBVElDIHZvaWQKLXZuX3dha2V1cCgKK3ZvaWQKK3ZuX2lvd2FrZSgKIAlzdHJ1Y3Qgdm5vZGUJKnZwKQogewotCVZOX0xPQ0sodnApOwotCWlmICh2cC0+dl9mbGFnICYgVldBSVQpCi0JCXN2X2Jyb2FkY2FzdCh2cHRvc3luYyh2cCkpOwotCXZwLT52X2ZsYWcgJj0gfihWUkVDTE18VldBSVR8Vk1PRElGSUVEKTsKLQlWTl9VTkxPQ0sodnAsIDApOwotfQotCi1pbnQKLXZuX3dhaXQoCi0Jc3RydWN0IHZub2RlCSp2cCkKLXsKLQlWTl9MT0NLKHZwKTsKLQlpZiAodnAtPnZfZmxhZyAmIChWSU5BQ1QgfCBWUkVDTE0pKSB7Ci0JCXZwLT52X2ZsYWcgfD0gVldBSVQ7Ci0JCXN2X3dhaXQodnB0b3N5bmModnApLCBQSU5PRCwgJnZwLT52X2xvY2ssIDApOwotCQlyZXR1cm4gMTsKLQl9Ci0JVk5fVU5MT0NLKHZwLCAwKTsKLQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdnAtPnZfaW9jb3VudCkpCisJCXdha2VfdXAodnB0b3N5bmModnApKTsKIH0KIAogc3RydWN0IHZub2RlICoKQEAgLTE1NCw2ICs5NCw4IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmVoYXZpb3IgYW5kIHRoZSBiZWhhdmlvciBjaGFpbiBoZWFkLiAqLwogCXZuX2Jodl9oZWFkX2luaXQoVk5fQkhWX0hFQUQodnApLCAidm5vZGUiKTsKIAorCWF0b21pY19zZXQoJnZwLT52X2lvY291bnQsIDApOworCiAjaWZkZWYJWEZTX1ZOT0RFX1RSQUNFCiAJdnAtPnZfdHJhY2UgPSBrdHJhY2VfYWxsb2MoVk5PREVfVFJBQ0VfU0laRSwgS01fU0xFRVApOwogI2VuZGlmCS8qIFhGU19WTk9ERV9UUkFDRSAqLwpAQCAtMTYzLDMwICsxMDUsNiBAQAogfQogCiAvKgotICogR2V0IGEgcmVmZXJlbmNlIG9uIGEgdm5vZGUuCi0gKi8KLXZub2RlX3QgKgotdm5fZ2V0KAotCXN0cnVjdCB2bm9kZQkqdnAsCi0Jdm1hcF90CQkqdm1hcCkKLXsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlOwotCi0JWEZTX1NUQVRTX0lOQyh2bl9nZXQpOwotCWlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7Ci0JaWYgKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKQotCQlyZXR1cm4gTlVMTDsKLQotCWlub2RlID0gaWxvb2t1cCh2bWFwLT52X3Zmc3AtPnZmc19zdXBlciwgdm1hcC0+dl9pbm8pOwotCWlmICghaW5vZGUpCS8qIElub2RlIG5vdCBwcmVzZW50ICovCi0JCXJldHVybiBOVUxMOwotCi0Jdm5fdHJhY2VfZXhpdCh2cCwgInZuX2dldCIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotCXJldHVybiB2cDsKLX0KLQotLyoKICAqIFJldmFsaWRhdGUgdGhlIExpbnV4IGlub2RlIGZyb20gdGhlIHZhdHRyLgogICogTm90ZTogaV9zaXplIF9ub3RfIHVwZGF0ZWQ7IHdlIG11c3QgaG9sZCB0aGUgaW5vZGUKICAqIHNlbWFwaG9yZSB3aGVuIGRvaW5nIHRoYXQgLSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5LgpAQCAtMTk4LDcgKzExNiw3IEBACiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOwogCi0JaW5vZGUtPmlfbW9kZQkgICAgPSBWVFRPSUYodmFwLT52YV90eXBlKSB8IHZhcC0+dmFfbW9kZTsKKwlpbm9kZS0+aV9tb2RlCSAgICA9IHZhcC0+dmFfbW9kZTsKIAlpbm9kZS0+aV9ubGluawkgICAgPSB2YXAtPnZhX25saW5rOwogCWlub2RlLT5pX3VpZAkgICAgPSB2YXAtPnZhX3VpZDsKIAlpbm9kZS0+aV9naWQJICAgID0gdmFwLT52YV9naWQ7CkBAIC0yNDcsNzEgKzE2NSw2IEBACiB9CiAKIC8qCi0gKiBwdXJnZSBhIHZub2RlIGZyb20gdGhlIGNhY2hlCi0gKiBBdCB0aGlzIHBvaW50IHRoZSB2bm9kZSBpcyBndWFyYW50ZWVkIHRvIGhhdmUgbm8gcmVmZXJlbmNlcyAodm5fY291bnQgPT0gMCkKLSAqIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyB3YXlzIHNvbWVvbmUgY291bGQKLSAqIGdldCBhIGhhbmRsZSAodmlhIHZuX2dldCkgb24gdGhlIHZub2RlICh1c3VhbGx5IGRvbmUgdmlhIGEgbW91bnQvdmZzIGxvY2spLgotICovCi12b2lkCi12bl9wdXJnZSgKLQlzdHJ1Y3Qgdm5vZGUJKnZwLAotCXZtYXBfdAkJKnZtYXApCi17Ci0Jdm5fdHJhY2VfZW50cnkodnAsICJ2bl9wdXJnZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotYWdhaW46Ci0JLyoKLQkgKiBDaGVjayB3aGV0aGVyIHZwIGhhcyBhbHJlYWR5IGJlZW4gcmVjbGFpbWVkIHNpbmNlIG91ciBjYWxsZXIKLQkgKiBzYW1wbGVkIGl0cyB2ZXJzaW9uIHdoaWxlIGhvbGRpbmcgYSBmaWxlc3lzdGVtIGNhY2hlIGxvY2sgdGhhdAotCSAqIGl0cyBWT1BfUkVDTEFJTSBmdW5jdGlvbiBhY3F1aXJlcy4KLQkgKi8KLQlWTl9MT0NLKHZwKTsKLQlpZiAodnAtPnZfbnVtYmVyICE9IHZtYXAtPnZfbnVtYmVyKSB7Ci0JCVZOX1VOTE9DSyh2cCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHZwIGlzIGJlaW5nIHJlY2xhaW1lZCBvciBpbmFjdGl2YXRlZCwgd2FpdCB1bnRpbCBpdCBpcyBpbmVydCwKLQkgKiB0aGVuIHByb2NlZWQuICBDYW4ndCBhc3N1bWUgdGhhdCB2bm9kZSBpcyBhY3R1YWxseSByZWNsYWltZWQKLQkgKiBqdXN0IGJlY2F1c2UgdGhlIHJlY2xhaW1lZCBmbGFnIGlzIGFzc2VydGVkIC0tIGEgdm5fYWxsb2MKLQkgKiByZWNsYWltIGNhbiBmYWlsLgotCSAqLwotCWlmICh2cC0+dl9mbGFnICYgKFZJTkFDVCB8IFZSRUNMTSkpIHsKLQkJQVNTRVJUKHZuX2NvdW50KHZwKSA9PSAwKTsKLQkJdnAtPnZfZmxhZyB8PSBWV0FJVDsKLQkJc3Zfd2FpdCh2cHRvc3luYyh2cCksIFBJTk9ELCAmdnAtPnZfbG9jaywgMCk7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JLyoKLQkgKiBBbm90aGVyIHByb2Nlc3MgY291bGQgaGF2ZSByYWNlZCBpbiBhbmQgZ290dGVuIHRoaXMgdm5vZGUuLi4KLQkgKi8KLQlpZiAodm5fY291bnQodnApID4gMCkgewotCQlWTl9VTkxPQ0sodnAsIDApOwotCQlyZXR1cm47Ci0JfQotCi0JWEZTX1NUQVRTX0RFQyh2bl9hY3RpdmUpOwotCXZwLT52X2ZsYWcgfD0gVlJFQ0xNOwotCVZOX1VOTE9DSyh2cCwgMCk7Ci0KLQkvKgotCSAqIENhbGwgVk9QX1JFQ0xBSU0gYW5kIGNsZWFuIHZwLiBUaGUgRlNZTkNfSU5WQUwgZmxhZyB0ZWxscwotCSAqIHZwJ3MgZmlsZXN5c3RlbSB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlc291cmNlcy4KLQkgKiBXaGVuIHZuX3JlY2xhaW0gcmV0dXJucywgdnAgc2hvdWxkIGhhdmUgbm8gcHJpdmF0ZSBkYXRhLAotCSAqIGVpdGhlciBpbiBhIHN5c3RlbSBjYWNoZSBvciBhdHRhY2hlZCB0byB2X2RhdGEuCi0JICovCi0JaWYgKHZuX3JlY2xhaW0odnApICE9IDApCi0JCXBhbmljKCJ2bl9wdXJnZTogY2Fubm90IHJlY2xhaW0iKTsKLQotCS8qCi0JICogV2FrZXVwIGFueW9uZSB3YWl0aW5nIGZvciB2cCB0byBiZSByZWNsYWltZWQuCi0JICovCi0Jdm5fd2FrZXVwKHZwKTsKLX0KLQotLyoKICAqIEFkZCBhIHJlZmVyZW5jZSB0byBhIHJlZmVyZW5jZWQgdm5vZGUuCiAgKi8KIHN0cnVjdCB2bm9kZSAqCkBAIC0zMzAsODAgKzE4Myw2IEBACiAJcmV0dXJuIHZwOwogfQogCi0vKgotICogIENhbGwgVk9QX0lOQUNUSVZFIG9uIGxhc3QgcmVmZXJlbmNlLgotICovCi12b2lkCi12bl9yZWxlKAotCXN0cnVjdCB2bm9kZQkqdnApCi17Ci0JaW50CQl2Y250OwotCWludAkJY2FjaGU7Ci0KLQlYRlNfU1RBVFNfSU5DKHZuX3JlbGUpOwotCi0JVk5fTE9DSyh2cCk7Ci0KLQl2bl90cmFjZV9lbnRyeSh2cCwgInZuX3JlbGUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0JdmNudCA9IHZuX2NvdW50KHZwKTsKLQotCS8qCi0JICogU2luY2Ugd2UgYWx3YXlzIGdldCBjYWxsZWQgZnJvbSBwdXRfaW5vZGUgd2Uga25vdwotCSAqIHRoYXQgaV9jb3VudCB3b24ndCBiZSBkZWNyZW1lbnRlZCBhZnRlciB3ZQotCSAqIHJldHVybi4KLQkgKi8KLQlpZiAoIXZjbnQpIHsKLQkJLyoKLQkJICogQXMgc29vbiBhcyB3ZSB0dXJuIHRoaXMgb24sIG5vb25lIGNhbiBmaW5kIHVzIGluIHZuX2dldAotCQkgKiB1bnRpbCB3ZSB0dXJuIG9mZiBWSU5BQ1Qgb3IgVlJFQ0xNCi0JCSAqLwotCQl2cC0+dl9mbGFnIHw9IFZJTkFDVDsKLQkJVk5fVU5MT0NLKHZwLCAwKTsKLQotCQkvKgotCQkgKiBEbyBub3QgbWFrZSB0aGUgVk9QX0lOQUNUSVZFIGNhbGwgaWYgdGhlcmUKLQkJICogYXJlIG5vIGJlaGF2aW9ycyBhdHRhY2hlZCB0byB0aGUgdm5vZGUgdG8gY2FsbC4KLQkJICovCi0JCWlmICh2cC0+dl9mYmh2KQotCQkJVk9QX0lOQUNUSVZFKHZwLCBOVUxMLCBjYWNoZSk7Ci0KLQkJVk5fTE9DSyh2cCk7Ci0JCWlmICh2cC0+dl9mbGFnICYgVldBSVQpCi0JCQlzdl9icm9hZGNhc3QodnB0b3N5bmModnApKTsKLQotCQl2cC0+dl9mbGFnICY9IH4oVklOQUNUfFZXQUlUfFZSRUNMTXxWTU9ESUZJRUQpOwotCX0KLQotCVZOX1VOTE9DSyh2cCwgMCk7Ci0KLQl2bl90cmFjZV9leGl0KHZwLCAidm5fcmVsZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLX0KLQotLyoKLSAqIEZpbmlzaCB0aGUgcmVtb3ZhbCBvZiBhIHZub2RlLgotICovCi12b2lkCi12bl9yZW1vdmUoCi0Jc3RydWN0IHZub2RlCSp2cCkKLXsKLQl2bWFwX3QJCXZtYXA7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZG8gdGhpcyB0byB0aGUgc2FtZSB2bm9kZSB0d2ljZSAqLwotCWlmICghKHZwLT52X2ZiaHYpKQotCQlyZXR1cm47Ci0KLQlYRlNfU1RBVFNfSU5DKHZuX3JlbW92ZSk7Ci0Jdm5fdHJhY2VfZXhpdCh2cCwgInZuX3JlbW92ZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotCS8qCi0JICogQWZ0ZXIgdGhlIGZvbGxvd2luZyBwdXJnZSB0aGUgdm5vZGUKLQkgKiB3aWxsIG5vIGxvbmdlciBleGlzdC4KLQkgKi8KLQlWTUFQKHZwLCB2bWFwKTsKLQl2bl9wdXJnZSh2cCwgJnZtYXApOwotfQotCi0KICNpZmRlZglYRlNfVk5PREVfVFJBQ0UKIAogI2RlZmluZSBLVFJBQ0VfRU5URVIodnAsIHZrLCBzLCBsaW5lLCByYSkJCQlcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAppbmRleCBhNmU1N2M2Li4zNWYzMDZjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC02NSwxMCArNjUsNiBAQAogc3RydWN0IHhmc19pb21hcDsKIHN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybjsKIAotLyoKLSAqIFZub2RlIHR5cGVzLiAgVk5PTiBtZWFucyBubyB0eXBlLgotICovCi1lbnVtIHZ0eXBlCXsgVk5PTiwgVlJFRywgVkRJUiwgVkJMSywgVkNIUiwgVkxOSywgVkZJRk8sIFZCQUQsIFZTT0NLIH07CiAKIHR5cGVkZWYgeGZzX2lub190IHZudW1iZXJfdDsKIHR5cGVkZWYgc3RydWN0IGRlbnRyeSB2bmFtZV90OwpAQCAtNzcsMTUgKzczLDE0IEBACiAvKgogICogTVAgbG9ja2luZyBwcm90b2NvbHM6CiAgKgl2X2ZsYWcsIHZfdmZzcAkJCQlWTl9MT0NLL1ZOX1VOTE9DSwotICoJdl90eXBlCQkJCQlyZWFkLW9ubHkgb3IgZnMtZGVwZW5kZW50CiAgKi8KIHR5cGVkZWYgc3RydWN0IHZub2RlIHsKIAlfX3UzMgkJdl9mbGFnOwkJCS8qIHZub2RlIGZsYWdzIChzZWUgYmVsb3cpICovCi0JZW51bSB2dHlwZQl2X3R5cGU7CQkJLyogdm5vZGUgdHlwZSAqLwogCXN0cnVjdCB2ZnMJKnZfdmZzcDsJCS8qIHB0ciB0byBjb250YWluaW5nIFZGUyAqLwogCXZudW1iZXJfdAl2X251bWJlcjsJCS8qIGluLWNvcmUgdm5vZGUgbnVtYmVyICovCiAJdm5fYmh2X2hlYWRfdAl2X2JoOwkJCS8qIGJlaGF2aW9yIGhlYWQgKi8KIAlzcGlubG9ja190CXZfbG9jazsJCQkvKiBWTl9MT0NLL1ZOX1VOTE9DSyAqLworCWF0b21pY190CXZfaW9jb3VudDsJCS8qIG91dHN0YW5kaW5nIEkvTyBjb3VudCAqLwogI2lmZGVmIFhGU19WTk9ERV9UUkFDRQogCXN0cnVjdCBrdHJhY2UJKnZfdHJhY2U7CQkvKiB0cmFjZSBoZWFkZXIgc3RydWN0dXJlICAgICovCiAjZW5kaWYKQEAgLTkzLDYgKzg4LDEyIEBACiAJLyogaW5vZGUgTVVTVCBiZSBsYXN0ICovCiB9IHZub2RlX3Q7CiAKKyNkZWZpbmUgVk5fSVNMTksodnApCVNfSVNMTksoKHZwKS0+dl9pbm9kZS5pX21vZGUpCisjZGVmaW5lIFZOX0lTUkVHKHZwKQlTX0lTUkVHKCh2cCktPnZfaW5vZGUuaV9tb2RlKQorI2RlZmluZSBWTl9JU0RJUih2cCkJU19JU0RJUigodnApLT52X2lub2RlLmlfbW9kZSkKKyNkZWZpbmUgVk5fSVNDSFIodnApCVNfSVNDSFIoKHZwKS0+dl9pbm9kZS5pX21vZGUpCisjZGVmaW5lIFZOX0lTQkxLKHZwKQlTX0lTQkxLKCh2cCktPnZfaW5vZGUuaV9tb2RlKQorCiAjZGVmaW5lIHZfZmJodgkJCXZfYmguYmhfZmlyc3QJICAgICAgIC8qIGZpcnN0IGJlaGF2aW9yICovCiAjZGVmaW5lIHZfZm9wcwkJCXZfYmguYmhfZmlyc3QtPmJkX29wcyAgLyogZmlyc3QgYmVoYXZpb3Igb3BzICovCiAKQEAgLTEzMywyMiArMTM0LDggQEAKICNkZWZpbmUgTElOVkZTX0dFVF9JUCh2cCkJKCYodnApLT52X2lub2RlKQogCiAvKgotICogQ29udmVydCBiZXR3ZWVuIHZub2RlIHR5cGVzIGFuZCBpbm9kZSBmb3JtYXRzIChzaW5jZSBQT1NJWC4xCi0gKiBkZWZpbmVzIG1vZGUgd29yZCBvZiBzdGF0IHN0cnVjdHVyZSBpbiB0ZXJtcyBvZiBpbm9kZSBmb3JtYXRzKS4KLSAqLwotZXh0ZXJuIGVudW0gdnR5cGUJaWZ0b3Z0X3RhYltdOwotZXh0ZXJuIHVfc2hvcnQJCXZ0dG9pZl90YWJbXTsKLSNkZWZpbmUgSUZUT1ZUKG1vZGUpCShpZnRvdnRfdGFiWygobW9kZSkgJiBTX0lGTVQpID4+IDEyXSkKLSNkZWZpbmUgVlRUT0lGKGluZHgpCSh2dHRvaWZfdGFiWyhpbnQpKGluZHgpXSkKLSNkZWZpbmUgTUFLRUlNT0RFKGluZHgsIG1vZGUpCShpbnQpKFZUVE9JRihpbmR4KSB8IChtb2RlKSkKLQotCi0vKgogICogVm5vZGUgZmxhZ3MuCiAgKi8KLSNkZWZpbmUgVklOQUNUCQkgICAgICAgMHgxCS8qIHZub2RlIGlzIGJlaW5nIGluYWN0aXZhdGVkCSovCi0jZGVmaW5lIFZSRUNMTQkJICAgICAgIDB4MgkvKiB2bm9kZSBpcyBiZWluZyByZWNsYWltZWQJKi8KLSNkZWZpbmUgVldBSVQJCSAgICAgICAweDQJLyogd2FpdGluZyBmb3IgVklOQUNUL1ZSRUNMTSB0byBlbmQgKi8KICNkZWZpbmUgVk1PRElGSUVECSAgICAgICAweDgJLyogWEZTIGlub2RlIHN0YXRlIHBvc3NpYmx5IGRpZmZlcnMgKi8KIAkJCQkJLyogdG8gdGhlIExpbnV4IGlub2RlIHN0YXRlLgkqLwogCkBAIC00MDgsNyArMzk1LDYgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgdmF0dHIgewogCWludAkJdmFfbWFzazsJLyogYml0LW1hc2sgb2YgYXR0cmlidXRlcyBwcmVzZW50ICovCi0JZW51bSB2dHlwZQl2YV90eXBlOwkvKiB2bm9kZSB0eXBlIChmb3IgY3JlYXRlKSAqLwogCW1vZGVfdAkJdmFfbW9kZTsJLyogZmlsZSBhY2Nlc3MgbW9kZSBhbmQgdHlwZSAqLwogCXhmc19ubGlua190CXZhX25saW5rOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBmaWxlICovCiAJdWlkX3QJCXZhX3VpZDsJCS8qIG93bmVyIHVzZXIgaWQgKi8KQEAgLTQ5OCwyNyArNDg0LDEyIEBACiAgKiBDaGVjayB3aGV0aGVyIG1hbmRhdG9yeSBmaWxlIGxvY2tpbmcgaXMgZW5hYmxlZC4KICAqLwogI2RlZmluZSBNQU5ETE9DSyh2cCwgbW9kZSkJXAotCSgodnApLT52X3R5cGUgPT0gVlJFRyAmJiAoKG1vZGUpICYgKFZTR0lEfChWRVhFQz4+MykpKSA9PSBWU0dJRCkKKwkoVk5fSVNSRUcodnApICYmICgobW9kZSkgJiAoVlNHSUR8KFZFWEVDPj4zKSkpID09IFZTR0lEKQogCiBleHRlcm4gdm9pZAl2bl9pbml0KHZvaWQpOwotZXh0ZXJuIGludAl2bl93YWl0KHN0cnVjdCB2bm9kZSAqKTsKIGV4dGVybiB2bm9kZV90CSp2bl9pbml0aWFsaXplKHN0cnVjdCBpbm9kZSAqKTsKIAogLyoKLSAqIEFjcXVpcmluZyBhbmQgaW52YWxpZGF0aW5nIHZub2RlczoKLSAqCi0gKglpZiAodm5fZ2V0KHZwLCB2ZXJzaW9uLCAwKSkKLSAqCQkuLi47Ci0gKgl2bl9wdXJnZSh2cCwgdmVyc2lvbik7Ci0gKgotICogdm5fZ2V0IGFuZCB2bl9wdXJnZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHZtYXBfdCBhcmd1bWVudHMsIHNhbXBsZWQKLSAqIHdoaWxlIGEgbG9jayB0aGF0IHRoZSB2bm9kZSdzIFZPUF9SRUNMQUlNIGZ1bmN0aW9uIGFjcXVpcmVzIGlzCi0gKiBoZWxkLCB0byBlbnN1cmUgdGhhdCB0aGUgdm5vZGUgc2FtcGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgaXNuJ3QKLSAqIHJlY3ljbGVkIChWT1BfUkVDTEFJTWVkKSBvciBkZWFsbG9jYXRlZCBiZXR3ZWVuIHRoZSByZWxlYXNlIG9mIHRoZSBsb2NrCi0gKiBhbmQgdGhlIHN1YnNlcXVlbnQgdm5fZ2V0IG9yIHZuX3B1cmdlLgotICovCi0KLS8qCiAgKiB2bm9kZV9tYXAgc3RydWN0dXJlcyBfbXVzdF8gbWF0Y2ggdm5fZXBvY2ggYW5kIHZub2RlIHN0cnVjdHVyZSBzaXplcy4KICAqLwogdHlwZWRlZiBzdHJ1Y3Qgdm5vZGVfbWFwIHsKQEAgLTUzMSwxMSArNTAyLDExIEBACiAJCQkgKHZtYXApLnZfbnVtYmVyID0gKHZwKS0+dl9udW1iZXIsCVwKIAkJCSAodm1hcCkudl9pbm8JID0gKHZwKS0+dl9pbm9kZS5pX2lubzsgfQogCi1leHRlcm4gdm9pZAl2bl9wdXJnZShzdHJ1Y3Qgdm5vZGUgKiwgdm1hcF90ICopOwotZXh0ZXJuIHZub2RlX3QJKnZuX2dldChzdHJ1Y3Qgdm5vZGUgKiwgdm1hcF90ICopOwogZXh0ZXJuIGludAl2bl9yZXZhbGlkYXRlKHN0cnVjdCB2bm9kZSAqKTsKIGV4dGVybiB2b2lkCXZuX3JldmFsaWRhdGVfY29yZShzdHJ1Y3Qgdm5vZGUgKiwgdmF0dHJfdCAqKTsKLWV4dGVybiB2b2lkCXZuX3JlbW92ZShzdHJ1Y3Qgdm5vZGUgKik7CisKK2V4dGVybiB2b2lkCXZuX2lvd2FpdChzdHJ1Y3Qgdm5vZGUgKnZwKTsKK2V4dGVybiB2b2lkCXZuX2lvd2FrZShzdHJ1Y3Qgdm5vZGUgKnZwKTsKIAogc3RhdGljIGlubGluZSBpbnQgdm5fY291bnQoc3RydWN0IHZub2RlICp2cCkKIHsKQEAgLTU0Niw3ICs1MTcsNiBAQAogICogVm5vZGUgcmVmZXJlbmNlIGNvdW50aW5nIGZ1bmN0aW9ucyAoYW5kIG1hY3JvcyBmb3IgY29tcGF0aWJpbGl0eSkuCiAgKi8KIGV4dGVybiB2bm9kZV90CSp2bl9ob2xkKHN0cnVjdCB2bm9kZSAqKTsKLWV4dGVybiB2b2lkCXZuX3JlbGUoc3RydWN0IHZub2RlICopOwogCiAjaWYgZGVmaW5lZChYRlNfVk5PREVfVFJBQ0UpCiAjZGVmaW5lIFZOX0hPTEQodnApCQlcCkBAIC01NjAsNiArNTMwLDEyIEBACiAjZGVmaW5lIFZOX1JFTEUodnApCQkoaXB1dChMSU5WRlNfR0VUX0lQKHZwKSkpCiAjZW5kaWYKIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm5vZGUgKnZuX2dyYWIoc3RydWN0IHZub2RlICp2cCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaWdyYWIoTElOVkZTX0dFVF9JUCh2cCkpOworCXJldHVybiBpbm9kZSA/IExJTlZGU19HRVRfVlAoaW5vZGUpIDogTlVMTDsKK30KKwogLyoKICAqIFZuYW1lIGhhbmRsaW5nIG1hY3Jvcy4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL01ha2VmaWxlIGIvZnMveGZzL3F1b3RhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNGY3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKFRPUERJUikvZnMveGZzL3F1b3RhL01ha2VmaWxlLWxpbnV4LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9xdW90YS9NYWtlZmlsZS1saW51eC0yLjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlNjBlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS9NYWtlZmlsZS1saW51eC0yLjYKQEAgLTAsMCArMSw1MyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjCisjIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworIyBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyMgb3IgdGhlIGxpa2UuCUFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisjIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyMgYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorIyBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyMgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorIyBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorIworIyBodHRwOi8vd3d3LnNnaS5jb20KKyMKKyMgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisjCisjIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyMKKworRVhUUkFfQ0ZMQUdTICs9IC1JICQoVE9QRElSKS9mcy94ZnMgLUkgJChUT1BESVIpL2ZzL3hmcy9saW51eC0yLjYKKworaWZlcSAoJChDT05GSUdfWEZTX0RFQlVHKSx5KQorCUVYVFJBX0NGTEFHUyArPSAtZyAtRERFQlVHCisJI0VYVFJBX0NGTEFHUyArPSAtRFFVT1RBREVCVUcKK2VuZGlmCitpZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RRVU9UX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1ZOT0RFX1RSQUNFCitlbmRpZgorCit4ZnMtJChDT05GSUdfWEZTX1FVT1RBKQkJKz0geGZzX2RxdW90Lm8gXAorCQkJCSAgIHhmc19kcXVvdF9pdGVtLm8gXAorCQkJCSAgIHhmc190cmFuc19kcXVvdC5vIFwKKwkJCQkgICB4ZnNfcW1fc3lzY2FsbHMubyBcCisJCQkJICAgeGZzX3FtX2Jodi5vIFwKKwkJCQkgICB4ZnNfcW0ubworCitpZmVxICgkKENPTkZJR19YRlNfUVVPVEEpLHkpCit4ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IHhmc19xbV9zdGF0cy5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCmluZGV4IDQ2Y2UxZTMuLmUyZThkMzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKQEAgLTQyMSw3ICs0MjEsNyBAQAogICovCiBTVEFUSUMgaW50CiB4ZnNfcW1fZHFhbGxvYygKLQl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX3RyYW5zX3QJKip0cHAsCiAJeGZzX21vdW50X3QJKm1wLAogCXhmc19kcXVvdF90CSpkcXAsCiAJeGZzX2lub2RlX3QJKnF1b3RpcCwKQEAgLTQzMyw2ICs0MzMsNyBAQAogCXhmc19ibWJ0X2lyZWNfdCBtYXA7CiAJaW50CQlubWFwcywgZXJyb3IsIGNvbW1pdHRlZDsKIAl4ZnNfYnVmX3QJKmJwOworCXhmc190cmFuc190CSp0cCA9ICp0cHA7CiAKIAlBU1NFUlQodHAgIT0gTlVMTCk7CiAJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFBTExPQyIpOwpAQCAtNDkyLDEwICs0OTMsMzIgQEAKIAl4ZnNfcW1faW5pdF9kcXVvdF9ibGsodHAsIG1wLCBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCksCiAJCQkgICAgICBkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX0FMTFRZUEVTLCBicCk7CiAKLQlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKSkpIHsKKwkvKgorCSAqIHhmc19ibWFwX2ZpbmlzaCgpIG1heSBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYW5kCisJICogc3RhcnQgYSBzZWNvbmQgdHJhbnNhY3Rpb24gaWYgdGhlIGZyZWVsaXN0IGlzIG5vdCBlbXB0eS4KKwkgKgorCSAqIFNpbmNlIHdlIHN0aWxsIHdhbnQgdG8gbW9kaWZ5IHRoaXMgYnVmZmVyLCB3ZSBuZWVkIHRvCisJICogZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBub3QgcmVsZWFzZWQgb24gY29tbWl0IG9mCisJICogdGhlIGZpcnN0IHRyYW5zYWN0aW9uIGFuZCBlbnN1cmUgdGhlIGJ1ZmZlciBpcyBhZGRlZCB0byB0aGUKKwkgKiBzZWNvbmQgdHJhbnNhY3Rpb24uCisJICoKKwkgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB0cmFuc2FjdGlvbiB0aGVuIGRvbid0IHN0b3AgdGhlIGJ1ZmZlcgorCSAqIGZyb20gYmVpbmcgcmVsZWFzZWQgd2hlbiBpdCBjb21taXRzIGxhdGVyIG9uLgorCSAqLworCisJeGZzX3RyYW5zX2Job2xkKHRwLCBicCk7CisKKwlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKHRwcCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKSkpIHsKIAkJZ290byBlcnJvcjE7CiAJfQogCisJaWYgKGNvbW1pdHRlZCkgeworCQl0cCA9ICp0cHA7CisJCXhmc190cmFuc19iam9pbih0cCwgYnApOworCX0gZWxzZSB7CisJCXhmc190cmFuc19iaG9sZF9yZWxlYXNlKHRwLCBicCk7CisJfQorCiAJKk9fYnBwID0gYnA7CiAJcmV0dXJuIDA7CiAKQEAgLTUxNCw3ICs1MzcsNyBAQAogICovCiBTVEFUSUMgaW50CiB4ZnNfcW1fZHF0b2JwKAotCXhmc190cmFuc190CQkqdHAsCisJeGZzX3RyYW5zX3QJCSoqdHBwLAogCXhmc19kcXVvdF90CQkqZHFwLAogCXhmc19kaXNrX2RxdW90X3QJKipPX2RkcHAsCiAJeGZzX2J1Zl90CQkqKk9fYnBwLApAQCAtNTI4LDYgKzU1MSw3IEBACiAJeGZzX2Rpc2tfZHF1b3RfdCAqZGRxOwogCXhmc19kcWlkX3QJaWQ7CiAJYm9vbGVhbl90CW5ld2RxdW90OworCXhmc190cmFuc190CSp0cCA9ICh0cHAgPyAqdHBwIDogTlVMTCk7CiAKIAltcCA9IGRxcC0+cV9tb3VudDsKIAlpZCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKTsKQEAgLTU3OSw5ICs2MDMsMTAgQEAKIAkJCQlyZXR1cm4gKEVOT0VOVCk7CiAKIAkJCUFTU0VSVCh0cCk7Ci0JCQlpZiAoKGVycm9yID0geGZzX3FtX2RxYWxsb2ModHAsIG1wLCBkcXAsIHF1b3RpcCwKKwkJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFhbGxvYyh0cHAsIG1wLCBkcXAsIHF1b3RpcCwKIAkJCQkJCWRxcC0+cV9maWxlb2Zmc2V0LCAmYnApKSkKIAkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCXRwID0gKnRwcDsKIAkJCW5ld2RxdW90ID0gQl9UUlVFOwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTY0NSw3ICs2NzAsNyBAQAogLyogQVJHU1VTRUQgKi8KIFNUQVRJQyBpbnQKIHhmc19xbV9kcXJlYWQoCi0JeGZzX3RyYW5zX3QJKnRwLAorCXhmc190cmFuc190CSoqdHBwLAogCXhmc19kcWlkX3QJaWQsCiAJeGZzX2RxdW90X3QJKmRxcCwJLyogZHF1b3QgdG8gZ2V0IGZpbGxlZCBpbiAqLwogCXVpbnQJCWZsYWdzKQpAQCAtNjUzLDE1ICs2NzgsMTkgQEAKIAl4ZnNfZGlza19kcXVvdF90ICpkZHFwOwogCXhmc19idWZfdAkgKmJwOwogCWludAkJIGVycm9yOworCXhmc190cmFuc190CSAqdHA7CisKKwlBU1NFUlQodHBwKTsKIAogCS8qCiAJICogZ2V0IGEgcG9pbnRlciB0byB0aGUgb24tZGlzayBkcXVvdCBhbmQgdGhlIGJ1ZmZlciBjb250YWluaW5nIGl0CiAJICogZHFwIGFscmVhZHkga25vd3MgaXRzIG93biB0eXBlIChHUk9VUC9VU0VSKS4KIAkgKi8KIAl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFQUQiKTsKLQlpZiAoKGVycm9yID0geGZzX3FtX2RxdG9icCh0cCwgZHFwLCAmZGRxcCwgJmJwLCBmbGFncykpKSB7CisJaWYgKChlcnJvciA9IHhmc19xbV9kcXRvYnAodHBwLCBkcXAsICZkZHFwLCAmYnAsIGZsYWdzKSkpIHsKIAkJcmV0dXJuIChlcnJvcik7CiAJfQorCXRwID0gKnRwcDsKIAogCS8qIGNvcHkgZXZlcnl0aGluZyBmcm9tIGRpc2sgZHF1b3QgdG8gdGhlIGluY29yZSBkcXVvdCAqLwogCW1lbWNweSgmZHFwLT5xX2NvcmUsIGRkcXAsIHNpemVvZih4ZnNfZGlza19kcXVvdF90KSk7CkBAIC03NDAsNyArNzY5LDcgQEAKIAkgKiBSZWFkIGl0IGZyb20gZGlzazsgeGZzX2RxcmVhZCgpIHRha2VzIGNhcmUgb2YKIAkgKiBhbGwgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbiBvZiBkcXVvdCdzIGZpZWxkcyAobG9ja3MsIGV0YykKIAkgKi8KLQlpZiAoKGVycm9yID0geGZzX3FtX2RxcmVhZCh0cCwgaWQsIGRxcCwgZmxhZ3MpKSkgeworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFyZWFkKCZ0cCwgaWQsIGRxcCwgZmxhZ3MpKSkgewogCQkvKgogCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgcXVvdGFzIGdvdCB0dXJuZWQgb2ZmIChFU1JDSCksCiAJCSAqIG9yIGlmIHRoZSBkcXVvdCBkaWRuJ3QgZXhpc3Qgb24gZGlzayBhbmQgd2UgYXNrIHRvCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmggYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKaW5kZXggMzkxNzUxMC4uOGViYzg3MSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTExMywyMCArMTEzLDYgQEAKIAogI2RlZmluZSBYRlNfRFFIT0xEKGRxcCkJCSgoZHFwKS0+cV9ucmVmcysrKQogCi0vKgotICogUXVvdGEgQWNjb3VudGluZy9FbmZvcmNlbWVudCBmbGFncwotICovCi0jZGVmaW5lIFhGU19BTExfUVVPVEFfQUNDVAlcCi0JCShYRlNfVVFVT1RBX0FDQ1QgfCBYRlNfR1FVT1RBX0FDQ1QgfCBYRlNfUFFVT1RBX0FDQ1QpCi0jZGVmaW5lIFhGU19BTExfUVVPVEFfRU5GRAkoWEZTX1VRVU9UQV9FTkZEIHwgWEZTX09RVU9UQV9FTkZEKQotI2RlZmluZSBYRlNfQUxMX1FVT1RBX0NIS0QJKFhGU19VUVVPVEFfQ0hLRCB8IFhGU19PUVVPVEFfQ0hLRCkKLQotI2RlZmluZSBYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUKQotI2RlZmluZSBYRlNfSVNfUVVPVEFfRU5GT1JDRUQobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfRU5GRCkKLSNkZWZpbmUgWEZTX0lTX1VRVU9UQV9SVU5OSU5HKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpCi0jZGVmaW5lIFhGU19JU19QUVVPVEFfUlVOTklORyhtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX1BRVU9UQV9BQ0NUKQotI2RlZmluZSBYRlNfSVNfR1FVT1RBX1JVTk5JTkcobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkKLQogI2lmZGVmIERFQlVHCiBzdGF0aWMgaW5saW5lIGludAogWEZTX0RRX0lTX0xPQ0tFRCh4ZnNfZHF1b3RfdCAqZHFwKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwppbmRleCBmNTI3MWI3Li5lNzRlYWE3IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwpAQCAtNTA5LDYgKzUwOSw3IEBACiAKIAlsb2dfdmVjdG9yLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJihxZi0+cXFsX2Zvcm1hdCk7CiAJbG9nX3ZlY3Rvci0+aV9sZW4gPSBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX1FVT1RBT0ZGKTsKIAlxZi0+cXFsX2Zvcm1hdC5xZl9zaXplID0gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbS5jIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCmluZGV4IGY2NjVjYThmLi5lZmRlMTZlIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMzY1LDE2ICszNjUsNiBAQAogCWludAkJZXJyb3IgPSAwOwogCXVpbnQJCXNiZjsKIAotCS8qCi0JICogSWYgYSBmaWxlIHN5c3RlbSBoYWQgcXVvdGFzIHJ1bm5pbmcgZWFybGllciwgYnV0IGRlY2lkZWQgdG8KLQkgKiBtb3VudCB3aXRob3V0IC1vIHVxdW90YS9wcXVvdGEvZ3F1b3RhIG9wdGlvbnMsIHJldm9rZSB0aGUKLQkgKiBxdW90YWNoZWNrZWQgbGljZW5zZSwgYW5kIGJhaWwgb3V0LgotCSAqLwotCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkgJiYKLQkgICAgKG1wLT5tX3NiLnNiX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkpIHsKLQkJbXAtPm1fcWZsYWdzID0gMDsKLQkJZ290byB3cml0ZV9jaGFuZ2VzOwotCX0KIAogCS8qCiAJICogSWYgcXVvdGFzIG9uIHJlYWx0aW1lIHZvbHVtZXMgaXMgbm90IHN1cHBvcnRlZCwgd2UgZGlzYWJsZQpAQCAtMzg4LDExICszNzgsOCBAQAogCQlnb3RvIHdyaXRlX2NoYW5nZXM7CiAJfQogCi0jaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChYRlNfTE9VRF9SRUNPVkVSWSkKLQljbW5fZXJyKENFX05PVEUsICJBdHRlbXB0aW5nIHRvIHR1cm4gb24gZGlzayBxdW90YXMuIik7Ci0jZW5kaWYKLQogCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpOworCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgcXVvdGFpbmZvIHN0cnVjdHVyZSBpbnNpZGUgdGhlIG1vdW50IHN0cnVjdCwgYW5kCiAJICogY3JlYXRlIHF1b3RhaW5vZGUocyksIGFuZCBjaGFuZ2UvcmV2IHN1cGVyYmxvY2sgaWYgbmVjZXNzYXJ5LgpAQCAtNDEwLDE5ICszOTcsMTQgQEAKIAkgKi8KIAlpZiAoWEZTX1FNX05FRURfUVVPVEFDSEVDSyhtcCkgJiYKIAkJIShtZnNpX2ZsYWdzICYgWEZTX01GU0lfTk9fUVVPVEFDSEVDSykpIHsKLSNpZmRlZiBERUJVRwotCQljbW5fZXJyKENFX05PVEUsICJEb2luZyBhIHF1b3RhY2hlY2suIFBsZWFzZSB3YWl0LiIpOwotI2VuZGlmCiAJCWlmICgoZXJyb3IgPSB4ZnNfcW1fcXVvdGFjaGVjayhtcCkpKSB7CiAJCQkvKiBRdW90YWNoZWNrIGhhcyBmYWlsZWQgYW5kIHF1b3RhcyBoYXZlCiAJCQkgKiBiZWVuIGRpc2FibGVkLgogCQkJICovCiAJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAkJfQotI2lmZGVmIERFQlVHCi0JCWNtbl9lcnIoQ0VfTk9URSwgIkRvbmUgcXVvdGFjaGVjay4iKTsKLSNlbmRpZgogCX0KKwogIHdyaXRlX2NoYW5nZXM6CiAJLyoKIAkgKiBXZSBhY3R1YWxseSBkb24ndCBoYXZlIHRvIGFjcXVpcmUgdGhlIFNCX0xPQ0sgYXQgYWxsLgpAQCAtMjAxMCw3ICsxOTkyLDcgQEAKIAkJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyAhPSBOVUxMKTsKIAkJQVNTRVJUKHhmc19HcW0gIT0gTlVMTCk7CiAJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyhtcCk7Ci0JCXhmc19tb3VudF9yZXNldF9zYnFmbGFncyhtcCk7CisJCSh2b2lkKXhmc19tb3VudF9yZXNldF9zYnFmbGFncyhtcCk7CiAJfSBlbHNlIHsKIAkJY21uX2VycihDRV9OT1RFLCAiWEZTIHF1b3RhY2hlY2sgJXM6IERvbmUuIiwgbXAtPm1fZnNuYW1lKTsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmggYi9mcy94ZnMvcXVvdGEveGZzX3FtLmgKaW5kZXggYjAzZWVjZi4uMGIwMGIzYyAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5oCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaApAQCAtMTg0LDggKzE4NCw2IEBACiAjZGVmaW5lIFhGU19RTV9IT0xEKHhxbSkJKCh4cW0pLT5xbV9ucmVmcysrKQogI2RlZmluZSBYRlNfUU1fUkVMRSh4cW0pCSgoeHFtKS0+cW1fbnJlZnMtLSkKIAotZXh0ZXJuIHZvaWQJCXhmc19tb3VudF9yZXNldF9zYnFmbGFncyh4ZnNfbW91bnRfdCAqKTsKLQogZXh0ZXJuIHZvaWQJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyh4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiBpbnQJCXhmc19xbV9tb3VudF9xdW90YXMoeGZzX21vdW50X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkCQl4ZnNfcW1fbW91bnRfcXVvdGFpbml0KHhmc19tb3VudF90ICosIHVpbnQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKaW5kZXggZGMzYzM3YS4uODg5MGExOCAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMjI5LDQ4ICsyMjksNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoKLSAqIENsZWFyIHRoZSBxdW90YWZsYWdzIGluIG1lbW9yeSBhbmQgaW4gdGhlIHN1cGVyYmxvY2suCi0gKi8KLXZvaWQKLXhmc19tb3VudF9yZXNldF9zYnFmbGFncygKLQl4ZnNfbW91bnRfdAkJKm1wKQotewotCXhmc190cmFuc190CQkqdHA7Ci0JdW5zaWduZWQgbG9uZwkJczsKLQotCW1wLT5tX3FmbGFncyA9IDA7Ci0JLyoKLQkgKiBJdCBpcyBPSyB0byBsb29rIGF0IHNiX3FmbGFncyBoZXJlIGluIG1vdW50IHBhdGgsCi0JICogd2l0aG91dCBTQl9MT0NLLgotCSAqLwotCWlmIChtcC0+bV9zYi5zYl9xZmxhZ3MgPT0gMCkKLQkJcmV0dXJuOwotCXMgPSBYRlNfU0JfTE9DSyhtcCk7Ci0JbXAtPm1fc2Iuc2JfcWZsYWdzID0gMDsKLQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKLQotCS8qCi0JICogaWYgdGhlIGZzIGlzIHJlYWRvbmx5LCBsZXQgdGhlIGluY29yZSBzdXBlcmJsb2NrIHJ1bgotCSAqIHdpdGggcXVvdGFzIG9mZiBidXQgZG9uJ3QgZmx1c2ggdGhlIHVwZGF0ZSBvdXQgdG8gZGlzawotCSAqLwotCWlmIChYRlNfTVRPVkZTKG1wKS0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQotCQlyZXR1cm47Ci0jaWZkZWYgUVVPVEFERUJVRwotCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLCAiV3JpdGluZyBzdXBlcmJsb2NrIHF1b3RhIGNoYW5nZXMiKTsKLSNlbmRpZgotCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUU1fU0JDSEFOR0UpOwotCWlmICh4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUgKyAxMjgsIDAsIDAsCi0JCQkJICAgICAgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKSkgewotCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAotCQkJInhmc19tb3VudF9yZXNldF9zYnFmbGFnczogU3VwZXJibG9jayB1cGRhdGUgZmFpbGVkISIpOwotCQlyZXR1cm47Ci0JfQotCXhmc19tb2Rfc2IodHAsIFhGU19TQl9RRkxBR1MpOwotCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOwotfQotCiBTVEFUSUMgaW50CiB4ZnNfcW1fbmV3bW91bnQoCiAJeGZzX21vdW50X3QJKm1wLApkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IDY4ZTk4OTYuLjE1ZTAyZTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTEwNTMsNyArMTA1Myw2IEBACiAJc3RydWN0IHhmc19tb3VudCAqbXAsCiAJdWludAkJIGZsYWdzKQogewotCXZtYXBfdAkJdm1hcDsKIAl4ZnNfaW5vZGVfdAkqaXAsICp0b3Bpbm87CiAJdWludAkJaXJlY2xhaW1zOwogCXZub2RlX3QJCSp2cDsKQEAgLTEwNjEsOCArMTA2MCw4IEBACiAKIAlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKIAotYWdhaW46CiAJWEZTX01PVU5UX0lMT0NLKG1wKTsKK2FnYWluOgogCWlwID0gbXAtPm1faW5vZGVzOwogCWlmIChpcCA9PSBOVUxMKSB7CiAJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKQEAgLTEwOTAsMTggKzEwODksMTQgQEAKIAkJfQogCQl2bm9kZV9yZWZkID0gQl9GQUxTRTsKIAkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSA9PSAwKSB7Ci0JCQkvKgotCQkJICogU2FtcGxlIHZwIG1hcHBpbmcgd2hpbGUgaG9sZGluZyB0aGUgbXBsb2NrLCBsZXN0Ci0JCQkgKiB3ZSBjb21lIGFjcm9zcyBhIG5vbi1leGlzdGVudCB2bm9kZS4KLQkJCSAqLwotCQkJVk1BUCh2cCwgdm1hcCk7CiAJCQlpcmVjbGFpbXMgPSBtcC0+bV9pcmVjbGFpbXM7CiAJCQl0b3Bpbm8gPSBtcC0+bV9pbm9kZXM7Ci0JCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Ci0KLQkJCS8qIFhYWCByZXN0YXJ0IGxpbWl0ID8gKi8KLQkJCWlmICggISAodnAgPSB2bl9nZXQodnAsICZ2bWFwKSkpCisJCQl2cCA9IHZuX2dyYWIodnApOworCQkJaWYgKCF2cCkKIAkJCQlnb3RvIGFnYWluOworCisJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCQkvKiBYWFggcmVzdGFydCBsaW1pdCA/ICovCiAJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAkJCXZub2RlX3JlZmQgPSBCX1RSVUU7CiAJCX0gZWxzZSB7CkBAIC0xMTM3LDcgKzExMzIsNiBAQAogCQkgKi8KIAkJaWYgKHRvcGlubyAhPSBtcC0+bV9pbm9kZXMgfHwgbXAtPm1faXJlY2xhaW1zICE9IGlyZWNsYWltcykgewogCQkJLyogWFhYIHVzZSBhIHNlbnRpbmVsICovCi0JCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CiAJCQlnb3RvIGFnYWluOwogCQl9CiAJCWlwID0gaXAtPmlfbW5leHQ7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCA0ZWQ3YjY5Li40ZTFhNWVjIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJzcGluLmgiCiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuYyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCmluZGV4IDNkYWUxNGMuLmZhODM5NGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAl2b2lkICAgICAgICAgICAgKnZhbDE0LAogCXZvaWQgICAgICAgICAgICAqdmFsMTUpCiB7Ci0Jc3RhdGljIGxvY2tfdCAgIHdyYXBfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdyYXBfbG9jayk7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQgICAgICAgICAgICAgaW5kZXg7CiAJa3RyYWNlX2VudHJ5X3QgICprdGVwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hY2wuYyBiL2ZzL3hmcy94ZnNfYWNsLmMKaW5kZXggOGQwMWRjZS4uOTJmZDFkNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hY2wuYworKysgYi9mcy94ZnMveGZzX2FjbC5jCkBAIC04NSw3ICs4NSw3IEBACiB7CiAJaW50CQllcnJvcjsKIAotCWlmICh2cC0+dl90eXBlICE9IFZESVIpCisJaWYgKCFWTl9JU0RJUih2cCkpCiAJCXJldHVybiAwOwogCXhmc19hY2xfZ2V0X2F0dHIodnAsIE5VTEwsIF9BQ0xfVFlQRV9ERUZBVUxULCBBVFRSX0tFUk5PVkFMLCAmZXJyb3IpOwogCXJldHVybiAoZXJyb3IgPT0gMCk7CkBAIC0zODksNyArMzg5LDcgQEAKIAogCWlmICh2cC0+dl9pbm9kZS5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkKIAkJcmV0dXJuIEVQRVJNOwotCWlmIChraW5kID09IF9BQ0xfVFlQRV9ERUZBVUxUICYmIHZwLT52X3R5cGUgIT0gVkRJUikKKwlpZiAoa2luZCA9PSBfQUNMX1RZUEVfREVGQVVMVCAmJiAhVk5fSVNESVIodnApKQogCQlyZXR1cm4gRU5PVERJUjsKIAlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQogCQlyZXR1cm4gRVJPRlM7CkBAIC03NTAsNyArNzUwLDcgQEAKIAkgKiBJZiB0aGUgbmV3IGZpbGUgaXMgYSBkaXJlY3RvcnksIGl0cyBkZWZhdWx0IEFDTCBpcyBhIGNvcHkgb2YKIAkgKiB0aGUgY29udGFpbmluZyBkaXJlY3RvcnkncyBkZWZhdWx0IEFDTC4KIAkgKi8KLQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKQorCWlmIChWTl9JU0RJUih2cCkpCiAJCXhmc19hY2xfc2V0X2F0dHIodnAsIHBkYWNscCwgX0FDTF9UWVBFX0RFRkFVTFQsICZlcnJvcik7CiAJaWYgKCFlcnJvciAmJiAhYmFzaWNwZXJtcykKIAkJeGZzX2FjbF9zZXRfYXR0cih2cCwgY2FjbCwgX0FDTF9UWVBFX0FDQ0VTUywgJmVycm9yKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXJjaC5oIGIvZnMveGZzL3hmc19hcmNoLmgKaW5kZXggYWUzNTE4OS4uNWFiMGRkOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hcmNoLmgKKysrIGIvZnMveGZzL3hmc19hcmNoLmgKQEAgLTQwLDIyICs0MCwyOCBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0jIGRlZmluZSBfX0JZVEVfT1JERVIJX19MSVRUTEVfRU5ESUFOCi0jZW5kaWYKICNpZmRlZiBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIF9fQllURV9PUkRFUglfX0JJR19FTkRJQU4KKyNkZWZpbmUJWEZTX05BVElWRV9IT1NUCTEKKyNlbHNlCisjdW5kZWYgWEZTX05BVElWRV9IT1NUCisjZW5kaWYKKworI2Vsc2UgLyogX19LRVJORUxfXyAqLworCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZQlYRlNfTkFUSVZFX0hPU1QJMQorI2Vsc2UKKyN1bmRlZiBYRlNfTkFUSVZFX0hPU1QKICNlbmRpZgogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAvKiBkbyB3ZSBuZWVkIGNvbnZlcnNpb24/ICovCi0KICNkZWZpbmUgQVJDSF9OT0NPTlZFUlQgMQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIEFSQ0hfQ09OVkVSVAkwCi0jZWxzZQorI2lmZGVmIFhGU19OQVRJVkVfSE9TVAogIyBkZWZpbmUgQVJDSF9DT05WRVJUCUFSQ0hfTk9DT05WRVJUCisjZWxzZQorIyBkZWZpbmUgQVJDSF9DT05WRVJUCTAKICNlbmRpZgogCiAvKiBnZW5lcmljIHN3YXBwaW5nIG1hY3JvcyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwppbmRleCA2ZjVkMjgzLi4zZTc2ZGVmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMveGZzX2JtYXAuYwpAQCAtNDc1NCwxMCArNDc1NCwyMCBAQAogCQkJCQllcnJvciA9IHhmc19tb2RfaW5jb3JlX3NiKG1wLAogCQkJCQkJCVhGU19TQlNfRkRCTE9DS1MsCiAJCQkJCQkJLShhbGVuKSwgcnN2ZCk7Ci0JCQkJaWYgKCFlcnJvcikKKwkJCQlpZiAoIWVycm9yKSB7CiAJCQkJCWVycm9yID0geGZzX21vZF9pbmNvcmVfc2IobXAsCiAJCQkJCQkJWEZTX1NCU19GREJMT0NLUywKIAkJCQkJCQktKGluZGxlbiksIHJzdmQpOworCQkJCQlpZiAoZXJyb3IgJiYgcnQpIHsKKwkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAorCQkJCQkJCWV4dHN6LCByc3ZkKTsKKwkJCQkJfSBlbHNlIGlmIChlcnJvcikgeworCQkJCQkJeGZzX21vZF9pbmNvcmVfc2IoaXAtPmlfbW91bnQsCisJCQkJCQkJWEZTX1NCU19GREJMT0NLUywKKwkJCQkJCQlhbGVuLCByc3ZkKTsKKwkJCQkJfQorCQkJCX0KIAogCQkJCWlmIChlcnJvcikgewogCQkJCQlpZiAoWEZTX0lTX1FVT1RBX09OKGlwLT5pX21vdW50KSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggMDljNDEzNS4uMDlhNzdiMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKQEAgLTIwMTcsNyArMjAxNyw3IEBACiAJCQkJZXh0X2ZsYWcpOwogfQogCi0jaWYgX19CWVRFX09SREVSICE9IF9fQklHX0VORElBTgorI2lmbmRlZiBYRlNfTkFUSVZFX0hPU1QKIC8qIEVuZGlhbiBmbGlwcGluZyB2ZXJzaW9ucyBvZiB0aGUgYm1idCBleHRyYWN0aW9uIGZ1bmN0aW9ucyAqLwogdm9pZAogeGZzX2JtYnRfZGlza19nZXRfYWxsKApAQCAtMjA4Nyw3ICsyMDg3LDcgQEAKIAlyZXR1cm4geGZzX2V4dGVudF9zdGF0ZSh4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KHIpLAogCQkJCWV4dF9mbGFnKTsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIFhGU19OQVRJVkVfSE9TVCAqLwogCiAKIC8qCkBAIC0yNTMxLDcgKzI1MzEsNyBAQAogI2VuZGlmCS8qIFhGU19CSUdfQkxLTk9TICovCiB9CiAKLSNpZiBfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOCisjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAogLyoKICAqIFNldCBhbGwgdGhlIGZpZWxkcyBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZCBmcm9tIHRoZSB1bmNvbXByZXNzZWQgZm9ybS4KICAqLwpAQCAtMjYxNyw3ICsyNjE3LDcgQEAKIAl9CiAjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KIH0KLSNlbmRpZgorI2VuZGlmIC8qIFhGU19OQVRJVkVfSE9TVCAqLwogCiAvKgogICogU2V0IHRoZSBibG9ja2NvdW50IGZpZWxkIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmggYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaAppbmRleCAwYTQwY2YxLi4yY2Y0ZmU0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaAorKysgYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaApAQCAtNjIsNyArNjIsNyBAQAogICogIGwxOjAtMjAgYXJlIGJsb2NrY291bnQuCiAgKi8KIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNpZm5kZWYgWEZTX05BVElWRV9IT1NUCiAKICNkZWZpbmUgQk1CVF9UT1RBTF9CSVRMRU4JMTI4CS8qIDEyOCBiaXRzLCAxNiBieXRlcyAqLwogI2RlZmluZSBCTUJUX0VYTlRGTEFHX0JJVE9GRgkwCkBAIC04Nyw3ICs4Nyw3IEBACiAjZGVmaW5lIEJNQlRfQkxPQ0tDT1VOVF9CSVRPRkYJNjQgLyogU3RhcnQgb2Ygc2Vjb25kIDY0IGJpdCBjb250YWluZXIgKi8KICNkZWZpbmUgQk1CVF9CTE9DS0NPVU5UX0JJVExFTgkyMQogCi0jZW5kaWYKKyNlbmRpZiAvKiBYRlNfTkFUSVZFX0hPU1QgKi8KIAogCiAjZGVmaW5lIEJNQlRfVVNFXzY0CTEKQEAgLTUwNSw3ICs1MDUsNyBAQAogeGZzX2JtYnRfZ2V0X3N0YXRlKAogCXhmc19ibWJ0X3JlY190CSpyKTsKIAotI2lmIF9fQllURV9PUkRFUiAhPSBfX0JJR19FTkRJQU4KKyNpZm5kZWYgWEZTX05BVElWRV9IT1NUCiB2b2lkCiB4ZnNfYm1idF9kaXNrX2dldF9hbGwoCiAJeGZzX2JtYnRfcmVjX3QJKnIsCkBAIC01MzgsNyArNTM4LDcgQEAKIAl4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChyKQogI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihyKSBcCiAJeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKHIpCi0jZW5kaWYKKyNlbmRpZiAvKiBYRlNfTkFUSVZFX0hPU1QgKi8KIAogaW50CiB4ZnNfYm1idF9pbmNyZW1lbnQoCkBAIC02MjMsNyArNjIzLDcgQEAKIAl4ZnNfYm1idF9yZWNfdAkqciwKIAl4ZnNfZXhudHN0X3QJdik7CiAKLSNpZiBfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOCisjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAogdm9pZAogeGZzX2JtYnRfZGlza19zZXRfYWxsKAogCXhmc19ibWJ0X3JlY190CSpyLApAQCAtNjQxLDcgKzY0MSw3IEBACiAJeGZzX2JtYnRfc2V0X2FsbChyLCBzKQogI2RlZmluZSB4ZnNfYm1idF9kaXNrX3NldF9hbGxmKHIsIG8sIGIsIGMsIHYpIFwKIAl4ZnNfYm1idF9zZXRfYWxsZihyLCBvLCBiLCBjLCB2KQotI2VuZGlmCisjZW5kaWYgLyogWEZTX05BVElWRV9IT1NUICovCiAKIHZvaWQKIHhmc19ibWJ0X3RvX2JtZHIoCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKaW5kZXggMzBiODI4NS4uYTI2NDY1NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWZfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwpAQCAtMjc0LDYgKzI3NCw3IEBACiAJCSAgICAgICAoKGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUgLSAxKSAqIHNpemVvZih1aW50KSkpOwogCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmYmlwLT5ibGlfZm9ybWF0OwogCXZlY3AtPmlfbGVuID0gYmFzZV9zaXplOworCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfQkZPUk1BVCk7CiAJdmVjcCsrOwogCW52ZWNzID0gMTsKIApAQCAtMzIwLDEyICszMjEsMTQgQEAKIAkJCWJ1ZmZlcl9vZmZzZXQgPSBmaXJzdF9iaXQgKiBYRlNfQkxJX0NIVU5LOwogCQkJdmVjcC0+aV9hZGRyID0geGZzX2J1Zl9vZmZzZXQoYnAsIGJ1ZmZlcl9vZmZzZXQpOwogCQkJdmVjcC0+aV9sZW4gPSBuYml0cyAqIFhGU19CTElfQ0hVTks7CisJCQlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0JDSFVOSyk7CiAJCQludmVjcysrOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAobmV4dF9iaXQgIT0gbGFzdF9iaXQgKyAxKSB7CiAJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKIAkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKIAkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9CQ0hVTkspOwogCQkJbnZlY3MrKzsKIAkJCXZlY3ArKzsKIAkJCWZpcnN0X2JpdCA9IG5leHRfYml0OwpAQCAtMzM3LDYgKzM0MCw3IEBACiAJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKIAkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKIAkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9CQ0hVTkspOwogLyogWW91IHdvdWxkIHRoaW5rIHdlIG5lZWQgdG8gYnVtcCB0aGUgbnZlY3MgaGVyZSB0b28sIGJ1dCB3ZSBkbyBub3QKICAqIHRoaXMgbnVtYmVyIGlzIHVzZWQgYnkgcmVjb3ZlcnksIGFuZCBpdCBnZXRzIGNvbmZ1c2VkIGJ5IHRoZSBib3VuZGFyeQogICogc3BsaXQgaGVyZQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfbGVhZi5oIGIvZnMveGZzL3hmc19kaXJfbGVhZi5oCmluZGV4IGRkNDIzY2UuLjQ4MGJmZmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaAorKysgYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmgKQEAgLTEyNywxMyArMTI3LDEzIEBACiAJICogV2F0Y2ggdGhlIG9yZGVyIGhlcmUgKGVuZGlhbi1uZXNzIGRlcGVuZGVudCkuCiAJICovCiAJc3RydWN0IHsKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjaWZuZGVmIFhGU19OQVRJVkVfSE9TVAogCQl4ZnNfZGFoYXNoX3QJaDsJLyogaGFzaCB2YWx1ZSAqLwogCQlfX3VpbnQzMl90CWJlOwkvKiBibG9jayBhbmQgZW50cnkgKi8KLSNlbHNlCS8qIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKi8KKyNlbHNlCiAJCV9fdWludDMyX3QJYmU7CS8qIGJsb2NrIGFuZCBlbnRyeSAqLwogCQl4ZnNfZGFoYXNoX3QJaDsJLyogaGFzaCB2YWx1ZSAqLwotI2VuZGlmCS8qIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKi8KKyNlbmRpZiAvKiBYRlNfTkFUSVZFX0hPU1QgKi8KIAl9IHM7CiB9IHhmc19kaXJjb29rX3Q7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1hcGkuaCBiL2ZzL3hmcy94ZnNfZG1hcGkuaAppbmRleCA1NWMxN2FkLi4xOWU4NzI4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RtYXBpLmgKKysrIGIvZnMveGZzL3hmc19kbWFwaS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKaW5kZXggZGI3Y2JkMS4uY2M3ZDE0OSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmaXAtPmVmaV9mb3JtYXQpOwogCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX0VGSV9GT1JNQVQpOwogCUFTU0VSVChzaXplID49IHNpemVvZih4ZnNfZWZpX2xvZ19mb3JtYXRfdCkpOwogfQogCkBAIC00MjYsNiArNDI3LDcgQEAKIAogCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmZHAtPmVmZF9mb3JtYXQpOwogCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX0VGRF9GT1JNQVQpOwogCUFTU0VSVChzaXplID49IHNpemVvZih4ZnNfZWZkX2xvZ19mb3JtYXRfdCkpOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IGQzZGEwMDAuLjBkOWFlOGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC0zMCw2ICszMCw4IEBACiAgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKICNpbmNsdWRlICJ4ZnMuaCIKIAogI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKQEAgLTUwNSwxNyArNTA3LDE1IEBACiAJdm5vZGVfdAkJKnZwID0gTlVMTDsKIAlpbnQJCWVycm9yOwogCi1yZXRyeToKIAlYRlNfU1RBVFNfSU5DKHhzX2lnX2F0dGVtcHRzKTsKIAorcmV0cnk6CiAJaWYgKChpbm9kZSA9IGlnZXRfbG9ja2VkKFhGU19NVE9WRlMobXApLT52ZnNfc3VwZXIsIGlubykpKSB7CiAJCWJodl9kZXNjX3QJKmJkcDsKIAkJeGZzX2lub2RlX3QJKmlwOwotCQlpbnQJCW5ld25vZGU7CiAKIAkJdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKIAkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKLWlub2RlX2FsbG9jYXRlOgogCQkJdm5faW5pdGlhbGl6ZShpbm9kZSk7CiAJCQllcnJvciA9IHhmc19pZ2V0X2NvcmUodnAsIG1wLCB0cCwgaW5vLCBmbGFncywKIAkJCQkJbG9ja19mbGFncywgaXBwLCBibm8pOwpAQCAtNTI2LDMyICs1MjYsMjUgQEAKIAkJCQlpcHV0KGlub2RlKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCS8qIFRoZXNlIGFyZSB0cnVlIGlmIHRoZSBpbm9kZSBpcyBpbiBpbmFjdGl2ZSBvcgotCQkJICogcmVjbGFpbS4gVGhlIGxpbnV4IGlub2RlIGlzIGFib3V0IHRvIGdvIGF3YXksCi0JCQkgKiB3YWl0IGZvciB0aGF0IHBhdGggdG8gZmluaXNoLCBhbmQgdHJ5IGFnYWluLgorCQkJLyoKKwkJCSAqIElmIHRoZSBpbm9kZSBpcyBub3QgZnVsbHkgY29uc3RydWN0ZWQgZHVlIHRvCisJCQkgKiBmaWxlaGFuZGxlIG1pc3RtYXRjaGVzIHdhaXQgZm9yIHRoZSBpbm9kZSB0byBnbworCQkJICogYXdheSBhbmQgdHJ5IGFnYWluLgorCQkJICoKKwkJCSAqIGlnZXRfbG9ja2VkIHdpbGwgY2FsbCBfX3dhaXRfb25fZnJlZWluZ19pbm9kZQorCQkJICogdG8gd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvIGF3YXkuCiAJCQkgKi8KLQkJCWlmICh2cC0+dl9mbGFnICYgKFZJTkFDVCB8IFZSRUNMTSkpIHsKLQkJCQl2bl93YWl0KHZwKTsKKwkJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8CisJCQkgICAgKChiZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwKKwkJCQkJCSAgJnhmc192bm9kZW9wcykpID09IE5VTEwpKSB7CiAJCQkJaXB1dChpbm9kZSk7CisJCQkJZGVsYXkoMSk7CiAJCQkJZ290byByZXRyeTsKIAkJCX0KIAotCQkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKLQkJCQlpcHV0KGlub2RlKTsKLQkJCQlyZXR1cm4gRUlPOwotCQkJfQotCi0JCQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7Ci0JCQlpZiAoYmRwID09IE5VTEwpIHsKLQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2R1cCk7Ci0JCQkJZ290byBpbm9kZV9hbGxvY2F0ZTsKLQkJCX0KIAkJCWlwID0gWEZTX0JIVlRPSShiZHApOwogCQkJaWYgKGxvY2tfZmxhZ3MgIT0gMCkKIAkJCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCQkJbmV3bm9kZSA9IChpcC0+aV9kLmRpX21vZGUgPT0gMCk7Ci0JCQlpZiAobmV3bm9kZSkKLQkJCQl4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChpcCk7CiAJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKIAkJCSppcHAgPSBpcDsKIAkJCWVycm9yID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwppbmRleCAzNGJkZjU5Li5kYjQzMzA4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0xMTI4LDcgKzExMjgsNiBAQAogCUFTU0VSVChpcCAhPSBOVUxMKTsKIAogCXZwID0gWEZTX0lUT1YoaXApOwotCXZwLT52X3R5cGUgPSBJRlRPVlQobW9kZSk7CiAJaXAtPmlfZC5kaV9tb2RlID0gKF9fdWludDE2X3QpbW9kZTsKIAlpcC0+aV9kLmRpX29ubGluayA9IDA7CiAJaXAtPmlfZC5kaV9ubGluayA9IG5saW5rOwpAQCAtMTI1MCw3ICsxMjQ5LDcgQEAKIAkgKi8KIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgZmxhZ3MpOwogCi0JLyogbm93IHRoYXQgd2UgaGF2ZSBhIHZfdHlwZSB3ZSBjYW4gc2V0IExpbnV4IGlub2RlIG9wcyAoJiB1bmxvY2spICovCisJLyogbm93IHRoYXQgd2UgaGF2ZSBhbiBpX21vZGUgIHdlIGNhbiBzZXQgTGludXggaW5vZGUgb3BzICgmIHVubG9jaykgKi8KIAlWRlNfSU5JVF9WTk9ERShYRlNfTVRPVkZTKHRwLT50X21vdW50cCksIHZwLCBYRlNfSVRPQkhWKGlwKSwgMSk7CiAKIAkqaXBwID0gaXA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCmluZGV4IDBlZWQzMGYuLjUwZTJjYWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCkBAIC0yNDgsNiArMjQ4LDcgQEAKIAogCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmaWlwLT5pbGlfZm9ybWF0OwogCXZlY3AtPmlfbGVuICA9IHNpemVvZih4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lGT1JNQVQpOwogCXZlY3ArKzsKIAludmVjcwkgICAgID0gMTsKIApAQCAtMjkyLDYgKzI5Myw3IEBACiAKIAl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CiAJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lDT1JFKTsKIAl2ZWNwKys7CiAJbnZlY3MrKzsKIAlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19DT1JFOwpAQCAtMzM5LDcgKzM0MSw3IEBACiAJCQlucmVjcyA9IGlwLT5pX2RmLmlmX2J5dGVzIC8KIAkJCQkodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwogCQkJQVNTRVJUKG5yZWNzID4gMCk7Ci0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2lmZGVmIFhGU19OQVRJVkVfSE9TVAogCQkJaWYgKG5yZWNzID09IGlwLT5pX2QuZGlfbmV4dGVudHMpIHsKIAkJCQkvKgogCQkJCSAqIFRoZXJlIGFyZSBubyBkZWxheWVkIGFsbG9jYXRpb24KQEAgLTM0OSw2ICszNTEsNyBAQAogCQkJCXZlY3AtPmlfYWRkciA9CiAJCQkJCShjaGFyICopKGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHMpOwogCQkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnl0ZXM7CisJCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9JRVhUKTsKIAkJCX0gZWxzZQogI2VuZGlmCiAJCQl7CkBAIC0zNjcsNiArMzcwLDcgQEAKIAkJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpZXh0X2J1ZmZlcjsKIAkJCQl2ZWNwLT5pX2xlbiA9IHhmc19pZXh0ZW50c19jb3B5KGlwLCBleHRfYnVmZmVyLAogCQkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9JRVhUKTsKIAkJCX0KIAkJCUFTU0VSVCh2ZWNwLT5pX2xlbiA8PSBpcC0+aV9kZi5pZl9ieXRlcyk7CiAJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2RzaXplID0gdmVjcC0+aV9sZW47CkBAIC0zODQsNiArMzg4LDcgQEAKIAkJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdCAhPSBOVUxMKTsKIAkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9kZi5pZl9icm9vdDsKIAkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXM7CisJCQlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lCUk9PVCk7CiAJCQl2ZWNwKys7CiAJCQludmVjcysrOwogCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9kc2l6ZSA9IGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzOwpAQCAtNDA5LDYgKzQxNCw3IEBACiAJCQlBU1NFUlQoKGlwLT5pX2RmLmlmX3JlYWxfYnl0ZXMgPT0gMCkgfHwKIAkJCSAgICAgICAoaXAtPmlfZGYuaWZfcmVhbF9ieXRlcyA9PSBkYXRhX2J5dGVzKSk7CiAJCQl2ZWNwLT5pX2xlbiA9IChpbnQpZGF0YV9ieXRlczsKKwkJCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfSUxPQ0FMKTsKIAkJCXZlY3ArKzsKIAkJCW52ZWNzKys7CiAJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2RzaXplID0gKHVuc2lnbmVkKWRhdGFfYnl0ZXM7CkBAIC00NjcsNyArNDczLDcgQEAKICNlbmRpZgogCQkJQVNTRVJUKG5yZWNzID4gMCk7CiAJCQlBU1NFUlQobnJlY3MgPT0gaXAtPmlfZC5kaV9hbmV4dGVudHMpOwotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNpZmRlZiBYRlNfTkFUSVZFX0hPU1QKIAkJCS8qCiAJCQkgKiBUaGVyZSBhcmUgbm90IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnRzCiAJCQkgKiBmb3IgYXR0cmlidXRlcywgc28ganVzdCBwb2ludCBhdCB0aGUgYXJyYXkuCkBAIC00ODYsNiArNDkyLDcgQEAKIAkJCXZlY3AtPmlfbGVuID0geGZzX2lleHRlbnRzX2NvcHkoaXAsIGV4dF9idWZmZXIsCiAJCQkJCVhGU19BVFRSX0ZPUkspOwogI2VuZGlmCisJCQlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lBVFRSX0VYVCk7CiAJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2FzaXplID0gdmVjcC0+aV9sZW47CiAJCQl2ZWNwKys7CiAJCQludmVjcysrOwpAQCAtNTAwLDYgKzUwNyw3IEBACiAJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9icm9vdCAhPSBOVUxMKTsKIAkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9hZnAtPmlmX2Jyb290OwogCQkJdmVjcC0+aV9sZW4gPSBpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzOworCQkJWExPR19WRUNfU0VUX1RZUEUodmVjcCwgWExPR19SRUdfVFlQRV9JQVRUUl9CUk9PVCk7CiAJCQl2ZWNwKys7CiAJCQludmVjcysrOwogCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9hc2l6ZSA9IGlwLT5pX2FmcC0+aWZfYnJvb3RfYnl0ZXM7CkBAIC01MjMsNiArNTMxLDcgQEAKIAkJCUFTU0VSVCgoaXAtPmlfYWZwLT5pZl9yZWFsX2J5dGVzID09IDApIHx8CiAJCQkgICAgICAgKGlwLT5pX2FmcC0+aWZfcmVhbF9ieXRlcyA9PSBkYXRhX2J5dGVzKSk7CiAJCQl2ZWNwLT5pX2xlbiA9IChpbnQpZGF0YV9ieXRlczsKKwkJCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfSUFUVFJfTE9DQUwpOwogCQkJdmVjcCsrOwogCQkJbnZlY3MrKzsKIAkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfYXNpemUgPSAodW5zaWduZWQpZGF0YV9ieXRlczsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9tYXAuYyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwppbmRleCAyZWRkNjc2Li5kMGY1YmU2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmMKKysrIGIvZnMveGZzL3hmc19pb21hcC5jCkBAIC0yMjYsMTMgKzIyNiwxMiBAQAogCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1JFQURfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKIAkJbG9ja21vZGUgPSBYRlNfTENLX01BUF9TSEFSRUQobXAsIGlvKTsKIAkJYm1hcGlfZmxhZ3MgPSBYRlNfQk1BUElfRU5USVJFOwotCQlpZiAoZmxhZ3MgJiBCTUFQSV9JR05TVEFURSkKLQkJCWJtYXBpX2ZsYWdzIHw9IFhGU19CTUFQSV9JR1NUQVRFOwogCQlicmVhazsKIAljYXNlIEJNQVBJX1dSSVRFOgogCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX0VOVEVSLCBpbywgb2Zmc2V0LCBjb3VudCk7CiAJCWxvY2ttb2RlID0gWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfV1I7Ci0JCWJtYXBpX2ZsYWdzID0gMDsKKwkJaWYgKGZsYWdzICYgQk1BUElfSUdOU1RBVEUpCisJCQlibWFwaV9mbGFncyB8PSBYRlNfQk1BUElfSUdTVEFURXxYRlNfQk1BUElfRU5USVJFOwogCQlYRlNfSUxPQ0sobXAsIGlvLCBsb2NrbW9kZSk7CiAJCWJyZWFrOwogCWNhc2UgQk1BUElfQUxMT0NBVEU6CkBAIC0zOTEsOSArMzkwLDkgQEAKIAl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdLCAqaW1hcHA7CiAJeGZzX2JtYXBfZnJlZV90IGZyZWVfbGlzdDsKIAlpbnQJCWFlb2Y7Ci0JeGZzX2ZpbGJsa3NfdAlkYXRhYmxvY2tzLCBxYmxvY2tzLCByZXNibGtzOworCXhmc19maWxibGtzX3QJcWJsb2NrcywgcmVzYmxrczsKIAlpbnQJCWNvbW1pdHRlZDsKLQlpbnQJCW51bXJ0ZXh0ZW50czsKKwlpbnQJCXJlc3J0ZXh0ZW50czsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBhcmUgdGhlcmUuIFRoaXMgZG9lc24ndCBob2xkCkBAIC00MzQsMTQgKzQzMywxNCBAQAogCiAJCWlmICghKGV4dHN6ID0gaXAtPmlfZC5kaV9leHRzaXplKSkKIAkJCWV4dHN6ID0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7Ci0JCW51bXJ0ZXh0ZW50cyA9IHFibG9ja3MgPSAoY291bnRfZnNiICsgZXh0c3ogLSAxKTsKLQkJZG9fZGl2KG51bXJ0ZXh0ZW50cywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCQlyZXNydGV4dGVudHMgPSBxYmxvY2tzID0gKGNvdW50X2ZzYiArIGV4dHN6IC0gMSk7CisJCWRvX2RpdihyZXNydGV4dGVudHMsIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKKwkJcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIDApOwogCQlxdW90YV9mbGFnID0gWEZTX1FNT1BUX1JFU19SVEJMS1M7Ci0JCWRhdGFibG9ja3MgPSAwOwogCX0gZWxzZSB7Ci0JCWRhdGFibG9ja3MgPSBxYmxvY2tzID0gY291bnRfZnNiOworCQlyZXNydGV4dGVudHMgPSAwOworCQlyZXNibGtzID0gcWJsb2NrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIGNvdW50X2ZzYik7CiAJCXF1b3RhX2ZsYWcgPSBYRlNfUU1PUFRfUkVTX1JFR0JMS1M7Ci0JCW51bXJ0ZXh0ZW50cyA9IDA7CiAJfQogCiAJLyoKQEAgLTQ0OSw5ICs0NDgsOCBAQAogCSAqLwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19ESU9TVFJBVCk7Ci0JcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIGRhdGFibG9ja3MpOwogCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsCi0JCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIG51bXJ0ZXh0ZW50cywKKwkJCVhGU19XUklURV9MT0dfUkVTKG1wKSwgcmVzcnRleHRlbnRzLAogCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKIAkJCVhGU19XUklURV9MT0dfQ09VTlQpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCAxY2QyYWMxLi41NGE2ZjExIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTE1OSwxMSArMTU5LDE1IEBACiB2b2lkCiB4bG9nX3RyYWNlX2xvZ2dyYW50KHhsb2dfdCAqbG9nLCB4bG9nX3RpY2tldF90ICp0aWMsIHhmc19jYWRkcl90IHN0cmluZykKIHsKLQlpZiAoISBsb2ctPmxfZ3JhbnRfdHJhY2UpIHsKLQkJbG9nLT5sX2dyYW50X3RyYWNlID0ga3RyYWNlX2FsbG9jKDEwMjQsIEtNX05PU0xFRVApOwotCQlpZiAoISBsb2ctPmxfZ3JhbnRfdHJhY2UpCisJdW5zaWduZWQgbG9uZyBjbnRzOworCisJaWYgKCFsb2ctPmxfZ3JhbnRfdHJhY2UpIHsKKwkJbG9nLT5sX2dyYW50X3RyYWNlID0ga3RyYWNlX2FsbG9jKDIwNDgsIEtNX05PU0xFRVApOworCQlpZiAoIWxvZy0+bF9ncmFudF90cmFjZSkKIAkJCXJldHVybjsKIAl9CisJLyogdGlja2V0IGNvdW50cyBhcmUgMSBieXRlIGVhY2ggKi8KKwljbnRzID0gKCh1bnNpZ25lZCBsb25nKXRpYy0+dF9vY250KSB8ICgodW5zaWduZWQgbG9uZyl0aWMtPnRfY250KSA8PCA4OwogCiAJa3RyYWNlX2VudGVyKGxvZy0+bF9ncmFudF90cmFjZSwKIAkJICAgICAodm9pZCAqKXRpYywKQEAgLTE3OCwxMCArMTgyLDEwIEBACiAJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpQ1lDTEVfTFNOKGxvZy0+bF90YWlsX2xzbikpLAogCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKUJMT0NLX0xTTihsb2ctPmxfdGFpbF9sc24pKSwKIAkJICAgICAodm9pZCAqKXN0cmluZywKLQkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykxMyksCi0JCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpMTQpLAotCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKTE1KSwKLQkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykxNikpOworCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXRpYy0+dF90cmFuc190eXBlKSwKKwkJICAgICAodm9pZCAqKWNudHMsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGljLT50X2N1cnJfcmVzKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0aWMtPnRfdW5pdF9yZXMpKTsKIH0KIAogdm9pZApAQCAtMjc0LDkgKzI3OCwxMSBAQAogCQkgKiBSZWxlYXNlIHRpY2tldCBpZiBub3QgcGVybWFuZW50IHJlc2VydmF0aW9uIG9yIGEgc3BlY2lmYwogCQkgKiByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gcmVsZWFzZSBhIHBlcm1hbmVudCByZXNlcnZhdGlvbi4KIAkJICovCisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4ZnNfbG9nX2RvbmU6IChub24tcGVybWFuZW50KSIpOwogCQl4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlKGxvZywgdGlja2V0KTsKIAkJeGxvZ19zdGF0ZV9wdXRfdGlja2V0KGxvZywgdGlja2V0KTsKIAl9IGVsc2UgeworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LCAieGZzX2xvZ19kb25lOiAocGVybWFuZW50KSIpOwogCQl4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UobG9nLCB0aWNrZXQpOwogCX0KIApAQCAtMzk5LDcgKzQwNSw4IEBACiAJCWludAkJIGNudCwKIAkJeGZzX2xvZ190aWNrZXRfdCAqdGlja2V0LAogCQlfX3VpbnQ4X3QJIGNsaWVudCwKLQkJdWludAkJIGZsYWdzKQorCQl1aW50CQkgZmxhZ3MsCisJCXVpbnQJCSB0X3R5cGUpCiB7CiAJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOwogCXhsb2dfdGlja2V0X3QJKmludGVybmFsX3RpY2tldDsKQEAgLTQyMSwxMyArNDI4LDE5IEBACiAJaWYgKCp0aWNrZXQgIT0gTlVMTCkgewogCQlBU1NFUlQoZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKTsKIAkJaW50ZXJuYWxfdGlja2V0ID0gKHhsb2dfdGlja2V0X3QgKikqdGlja2V0OworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgaW50ZXJuYWxfdGlja2V0LCAieGZzX2xvZ19yZXNlcnZlOiBleGlzdGluZyB0aWNrZXQgKHBlcm1hbmVudCB0cmFucykiKTsKIAkJeGxvZ19ncmFudF9wdXNoX2FpbChtcCwgaW50ZXJuYWxfdGlja2V0LT50X3VuaXRfcmVzKTsKIAkJcmV0dmFsID0geGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZShsb2csIGludGVybmFsX3RpY2tldCk7CiAJfSBlbHNlIHsKIAkJLyogbWF5IHNsZWVwIGlmIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSB0aWNrZXRzICovCiAJCWludGVybmFsX3RpY2tldCA9IHhsb2dfdGlja2V0X2dldChsb2csIHVuaXRfYnl0ZXMsIGNudCwKIAkJCQkJCSAgY2xpZW50LCBmbGFncyk7CisJCWludGVybmFsX3RpY2tldC0+dF90cmFuc190eXBlID0gdF90eXBlOwogCQkqdGlja2V0ID0gaW50ZXJuYWxfdGlja2V0OworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgaW50ZXJuYWxfdGlja2V0LCAKKwkJCShpbnRlcm5hbF90aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVikgPworCQkJInhmc19sb2dfcmVzZXJ2ZTogY3JlYXRlIG5ldyB0aWNrZXQgKHBlcm1hbmVudCB0cmFucykiIDoKKwkJCSJ4ZnNfbG9nX3Jlc2VydmU6IGNyZWF0ZSBuZXcgdGlja2V0Iik7CiAJCXhsb2dfZ3JhbnRfcHVzaF9haWwobXAsCiAJCQkJICAgIChpbnRlcm5hbF90aWNrZXQtPnRfdW5pdF9yZXMgKgogCQkJCSAgICAgaW50ZXJuYWxfdGlja2V0LT50X2NudCkpOwpAQCAtNjAxLDggKzYxNCw5IEBACiAJaWYgKCEgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpKSB7CiAJCXJlZ1swXS5pX2FkZHIgPSAodm9pZCopJm1hZ2ljOwogCQlyZWdbMF0uaV9sZW4gID0gc2l6ZW9mKG1hZ2ljKTsKKwkJWExPR19WRUNfU0VUX1RZUEUoJnJlZ1swXSwgWExPR19SRUdfVFlQRV9VTk1PVU5UKTsKIAotCQllcnJvciA9IHhmc19sb2dfcmVzZXJ2ZShtcCwgNjAwLCAxLCAmdGljLCBYRlNfTE9HLCAwKTsKKwkJZXJyb3IgPSB4ZnNfbG9nX3Jlc2VydmUobXAsIDYwMCwgMSwgJnRpYywgWEZTX0xPRywgMCwgMCk7CiAJCWlmICghZXJyb3IpIHsKIAkJCS8qIHJlbW92ZSBpbml0ZWQgZmxhZyAqLwogCQkJKCh4bG9nX3RpY2tldF90ICopdGljKS0+dF9mbGFncyA9IDA7CkBAIC0xMjcyLDYgKzEyODYsNyBAQAogCiAJcmVnWzBdLmlfYWRkciA9IE5VTEw7CiAJcmVnWzBdLmlfbGVuID0gMDsKKwlYTE9HX1ZFQ19TRVRfVFlQRSgmcmVnWzBdLCBYTE9HX1JFR19UWVBFX0NPTU1JVCk7CiAKIAlBU1NFUlRfQUxXQVlTKGljbG9nKTsKIAlpZiAoKGVycm9yID0geGxvZ193cml0ZShtcCwgcmVnLCAxLCB0aWNrZXQsIGNvbW1pdGxzbnAsCkBAIC0xNjA1LDYgKzE2MjAsMTE3IEBACiAKIAogLyoKKyAqIHByaW50IG91dCBpbmZvIHJlbGF0aW5nIHRvIHJlZ2lvbnMgd3JpdHRlbiB3aGljaCBjb25zdW1lCisgKiB0aGUgcmVzZXJ2YXRpb24KKyAqLworI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCitTVEFUSUMgdm9pZAoreGxvZ19wcmludF90aWNfcmVzKHhmc19tb3VudF90ICptcCwgeGxvZ190aWNrZXRfdCAqdGlja2V0KQoreworCXVpbnQgaTsKKwl1aW50IG9waGRyX3NwYyA9IHRpY2tldC0+dF9yZXNfbnVtX29waGRycyAqICh1aW50KXNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKworCS8qIG1hdGNoIHdpdGggWExPR19SRUdfVFlQRV8qIGluIHhmc19sb2cuaCAqLworCXN0YXRpYyBjaGFyICpyZXNfdHlwZV9zdHJbWExPR19SRUdfVFlQRV9NQVhdID0geworCSAgICAiYmZvcm1hdCIsCisJICAgICJiY2h1bmsiLAorCSAgICAiZWZpX2Zvcm1hdCIsCisJICAgICJlZmRfZm9ybWF0IiwKKwkgICAgImlmb3JtYXQiLAorCSAgICAiaWNvcmUiLAorCSAgICAiaWV4dCIsCisJICAgICJpYnJvb3QiLAorCSAgICAiaWxvY2FsIiwKKwkgICAgImlhdHRyX2V4dCIsCisJICAgICJpYXR0cl9icm9vdCIsCisJICAgICJpYXR0cl9sb2NhbCIsCisJICAgICJxZm9ybWF0IiwKKwkgICAgImRxdW90IiwKKwkgICAgInF1b3Rhb2ZmIiwKKwkgICAgIkxSIGhlYWRlciIsCisJICAgICJ1bm1vdW50IiwKKwkgICAgImNvbW1pdCIsCisJICAgICJ0cmFucyBoZWFkZXIiCisJfTsKKwlzdGF0aWMgY2hhciAqdHJhbnNfdHlwZV9zdHJbWEZTX1RSQU5TX1RZUEVfTUFYXSA9IHsKKwkgICAgIlNFVEFUVFJfTk9UX1NJWkUiLAorCSAgICAiU0VUQVRUUl9TSVpFIiwKKwkgICAgIklOQUNUSVZFIiwKKwkgICAgIkNSRUFURSIsCisJICAgICJDUkVBVEVfVFJVTkMiLAorCSAgICAiVFJVTkNBVEVfRklMRSIsCisJICAgICJSRU1PVkUiLAorCSAgICAiTElOSyIsCisJICAgICJSRU5BTUUiLAorCSAgICAiTUtESVIiLAorCSAgICAiUk1ESVIiLAorCSAgICAiU1lNTElOSyIsCisJICAgICJTRVRfRE1BVFRSUyIsCisJICAgICJHUk9XRlMiLAorCSAgICAiU1RSQVRfV1JJVEUiLAorCSAgICAiRElPU1RSQVQiLAorCSAgICAiV1JJVEVfU1lOQyIsCisJICAgICJXUklURUlEIiwKKwkgICAgIkFEREFGT1JLIiwKKwkgICAgIkFUVFJJTlZBTCIsCisJICAgICJBVFJVTkNBVEUiLAorCSAgICAiQVRUUl9TRVQiLAorCSAgICAiQVRUUl9STSIsCisJICAgICJBVFRSX0ZMQUciLAorCSAgICAiQ0xFQVJfQUdJX0JVQ0tFVCIsCisJICAgICJRTV9TQkNIQU5HRSIsCisJICAgICJEVU1NWTEiLAorCSAgICAiRFVNTVkyIiwKKwkgICAgIlFNX1FVT1RBT0ZGIiwKKwkgICAgIlFNX0RRQUxMT0MiLAorCSAgICAiUU1fU0VUUUxJTSIsCisJICAgICJRTV9EUUNMVVNURVIiLAorCSAgICAiUU1fUUlOT0NSRUFURSIsCisJICAgICJRTV9RVU9UQU9GRl9FTkQiLAorCSAgICAiU0JfVU5JVCIsCisJICAgICJGU1lOQ19UUyIsCisJICAgICJHUk9XRlNSVF9BTExPQyIsCisJICAgICJHUk9XRlNSVF9aRVJPIiwKKwkgICAgIkdST1dGU1JUX0ZSRUUiLAorCSAgICAiU1dBUEVYVCIKKwl9OworCisJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkieGZzX2xvZ193cml0ZTogcmVzZXJ2YXRpb24gc3VtbWFyeTpcbiIKKwkJCSIgIHRyYW5zIHR5cGUgID0gJXMgKCV1KVxuIgorCQkJIiAgdW5pdCByZXMgICAgPSAlZCBieXRlc1xuIgorCQkJIiAgY3VycmVudCByZXMgPSAlZCBieXRlc1xuIgorCQkJIiAgdG90YWwgcmVnICAgPSAldSBieXRlcyAoby9mbG93ID0gJXUgYnl0ZXMpXG4iCisJCQkiICBvcGhkcnMgICAgICA9ICV1IChvcGhkciBzcGFjZSA9ICV1IGJ5dGVzKVxuIgorCQkJIiAgb3BoZHIgKyByZWcgPSAldSBieXRlc1xuIgorCQkJIiAgbnVtIHJlZ2lvbnMgPSAldVxuIiwKKwkJCSgodGlja2V0LT50X3RyYW5zX3R5cGUgPD0gMCB8fAorCQkJICB0aWNrZXQtPnRfdHJhbnNfdHlwZSA+IFhGU19UUkFOU19UWVBFX01BWCkgPworCQkJICAiYmFkLXRyYW5zLXR5cGUiIDogdHJhbnNfdHlwZV9zdHJbdGlja2V0LT50X3RyYW5zX3R5cGUtMV0pLAorCQkJdGlja2V0LT50X3RyYW5zX3R5cGUsCisJCQl0aWNrZXQtPnRfdW5pdF9yZXMsCisJCQl0aWNrZXQtPnRfY3Vycl9yZXMsCisJCQl0aWNrZXQtPnRfcmVzX2Fycl9zdW0sIHRpY2tldC0+dF9yZXNfb19mbG93LAorCQkJdGlja2V0LT50X3Jlc19udW1fb3BoZHJzLCBvcGhkcl9zcGMsCisJCQl0aWNrZXQtPnRfcmVzX2Fycl9zdW0gKyAKKwkJCSAgdGlja2V0LT50X3Jlc19vX2Zsb3cgKyBvcGhkcl9zcGMsCisJCQl0aWNrZXQtPnRfcmVzX251bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGlja2V0LT50X3Jlc19udW07IGkrKykgeworCSAgIAl1aW50IHJfdHlwZSA9IHRpY2tldC0+dF9yZXNfYXJyW2ldLnJfdHlwZTsgCisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSAgICAicmVnaW9uWyV1XTogJXMgLSAldSBieXRlc1xuIiwKKwkJCSAgICBpLCAKKwkJCSAgICAoKHJfdHlwZSA8PSAwIHx8IHJfdHlwZSA+IFhMT0dfUkVHX1RZUEVfTUFYKSA/CisJCQkgICAgImJhZC1ydHlwZSIgOiByZXNfdHlwZV9zdHJbcl90eXBlLTFdKSwKKwkJCSAgICB0aWNrZXQtPnRfcmVzX2FycltpXS5yX2xlbik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgeGxvZ19wcmludF90aWNfcmVzKG1wLCB0aWNrZXQpCisjZW5kaWYKKworLyoKICAqIFdyaXRlIHNvbWUgcmVnaW9uIG91dCB0byBpbi1jb3JlIGxvZwogICoKICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB3cml0aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcmVnaW9ucyBvciB3aGVuCkBAIC0xNjc3LDE2ICsxODAzLDIxIEBACiAgICAgICogeGxvZ19vcF9oZWFkZXJfdCBhbmQgbWF5IG5lZWQgdG8gYmUgZG91YmxlIHdvcmQgYWxpZ25lZC4KICAgICAgKi8KICAgICBsZW4gPSAwOwotICAgIGlmICh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpICAgICAvKiBhY2N0IGZvciBzdGFydCByZWMgb2YgeGFjdCAqLworICAgIGlmICh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpIHsgICAgLyogYWNjdCBmb3Igc3RhcnQgcmVjIG9mIHhhY3QgKi8KIAlsZW4gKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOworCVhMT0dfVElDX0FERF9PUEhEUih0aWNrZXQpOworICAgIH0KIAogICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5lbnRyaWVzOyBpbmRleCsrKSB7CiAJbGVuICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsJICAgIC8qIGVhY2ggcmVnaW9uIGdldHMgPj0gMSAqLworCVhMT0dfVElDX0FERF9PUEhEUih0aWNrZXQpOwogCWxlbiArPSByZWdbaW5kZXhdLmlfbGVuOworCVhMT0dfVElDX0FERF9SRUdJT04odGlja2V0LCByZWdbaW5kZXhdLmlfbGVuLCByZWdbaW5kZXhdLmlfdHlwZSk7CiAgICAgfQogICAgIGNvbnR3ciA9ICpzdGFydF9sc24gPSAwOwogCiAgICAgaWYgKHRpY2tldC0+dF9jdXJyX3JlcyA8IGxlbikgeworCXhsb2dfcHJpbnRfdGljX3JlcyhtcCwgdGlja2V0KTsKICNpZmRlZiBERUJVRwogCXhsb2dfcGFuaWMoCiAJCSJ4ZnNfbG9nX3dyaXRlOiByZXNlcnZhdGlvbiByYW4gb3V0LiBOZWVkIHRvIHVwIHJlc2VydmF0aW9uIik7CkBAIC0xNzkwLDYgKzE5MjEsNyBAQAogCQlsZW4gKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOyAvKiBmcm9tIHNwbGl0dGluZyBvZiByZWdpb24gKi8KIAkJLyogYWNjb3VudCBmb3IgbmV3IGxvZyBvcCBoZWFkZXIgKi8KIAkJdGlja2V0LT50X2N1cnJfcmVzIC09IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwkJWExPR19USUNfQUREX09QSERSKHRpY2tldCk7CiAJICAgIH0KIAkgICAgeGxvZ192ZXJpZnlfZGVzdF9wdHIobG9nLCBwdHIpOwogCkBAIC0yMjgyLDYgKzI0MTQsOSBAQAogCSAqLwogCWlmIChsb2dfb2Zmc2V0ID09IDApIHsKIAkJdGlja2V0LT50X2N1cnJfcmVzIC09IGxvZy0+bF9pY2xvZ19oc2l6ZTsKKwkJWExPR19USUNfQUREX1JFR0lPTih0aWNrZXQsCisJCQkJICAgIGxvZy0+bF9pY2xvZ19oc2l6ZSwKKwkJCQkgICAgWExPR19SRUdfVFlQRV9MUkhFQURFUik7CiAJCUlOVF9TRVQoaGVhZC0+aF9jeWNsZSwgQVJDSF9DT05WRVJULCBsb2ctPmxfY3Vycl9jeWNsZSk7CiAJCUFTU0lHTl9MU04oaGVhZC0+aF9sc24sIGxvZyk7CiAJCUFTU0VSVChsb2ctPmxfY3Vycl9ibG9jayA+PSAwKTsKQEAgLTI0NjgsNiArMjYwMyw3IEBACiAjZW5kaWYKIAogCXRpYy0+dF9jdXJyX3JlcyA9IHRpYy0+dF91bml0X3JlczsKKwlYTE9HX1RJQ19SRVNFVF9SRVModGljKTsKIAogCWlmICh0aWMtPnRfY250ID4gMCkKIAkJcmV0dXJuICgwKTsKQEAgLTI2MDgsNiArMjc0NCw3IEBACiAJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMsICd3Jyk7CiAJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMsICdyJyk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOworCVhMT0dfVElDX1JFU0VUX1JFUyh0aWNrZXQpOwogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsCiAJCQkgICAgInhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZTogc3ViIGN1cnJlbnQgcmVzIik7CiAJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwpAQCAtMjYyNCw2ICsyNzYxLDcgQEAKIAl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMCk7CiAJR1JBTlRfVU5MT0NLKGxvZywgcyk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOworCVhMT0dfVElDX1JFU0VUX1JFUyh0aWNrZXQpOwogfQkvKiB4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UgKi8KIAogCkBAIC0zMTc5LDI5ICszMzE3LDU3IEBACiAJICogYW5kIHRoZWlyIHVuaXQgYW1vdW50IGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQuCiAJICoKIAkgKiBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIGNvZGUgYWNjb3VudCBmb3Igbm9uLXRyYW5zYWN0aW9uIGRhdGEKLQkgKiB3aGljaCBvY2N1cHkgc3BhY2UgaW4gdGhlIG9uLWRpc2sgbG9nLiAKKwkgKiB3aGljaCBvY2N1cHkgc3BhY2UgaW4gdGhlIG9uLWRpc2sgbG9nLgorCSAqCisJICogTm9ybWFsIGZvcm0gb2YgYSB0cmFuc2FjdGlvbiBpczoKKwkgKiA8b3BoPjx0cmFucy1oZHI+PHN0YXJ0LW9waD48cmVnMS1vcGg+PHJlZzE+PHJlZzItb3BoPi4uLjxjb21taXQtb3BoPgorCSAqIGFuZCB0aGVuIHRoZXJlIGFyZSBMUiBoZHJzLCBzcGxpdC1yZWNzIGFuZCByb3VuZG9mZiBhdCBlbmQgb2Ygc3luY3MuCisJICoKKwkgKiBXZSBuZWVkIHRvIGFjY291bnQgZm9yIGFsbCB0aGUgbGVhZHVwIGRhdGEgYW5kIHRyYWlsZXIgZGF0YQorCSAqIGFyb3VuZCB0aGUgdHJhbnNhY3Rpb24gZGF0YS4KKwkgKiBBbmQgdGhlbiB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSB3b3JzdCBjYXNlIGluIHRlcm1zIG9mIHVzaW5nCisJICogbW9yZSBzcGFjZS4KKwkgKiBUaGUgd29yc3QgY2FzZSB3aWxsIGhhcHBlbiBpZjoKKwkgKiAtIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHRyYW5zYWN0aW9uIGhhcHBlbnMgdG8gYmUgc3VjaCB0aGF0IHRoZQorCSAqICAgcm91bmRvZmYgaXMgYXQgaXRzIG1heGltdW0KKwkgKiAtIHRoZSB0cmFuc2FjdGlvbiBkYXRhIGlzIHN5bmNlZCBiZWZvcmUgdGhlIGNvbW1pdCByZWNvcmQgaXMgc3luY2VkCisJICogICBpLmUuIDx0cmFuc2FjdGlvbi1kYXRhPjxyb3VuZG9mZj4gfCA8Y29tbWl0LXJlYz48cm91bmRvZmY+CisJICogICBUaGVyZWZvcmUgdGhlIGNvbW1pdCByZWNvcmQgaXMgaW4gaXRzIG93biBMb2cgUmVjb3JkLgorCSAqICAgVGhpcyBjYW4gaGFwcGVuIGFzIHRoZSBjb21taXQgcmVjb3JkIGlzIGNhbGxlZCB3aXRoIGl0cworCSAqICAgb3duIHJlZ2lvbiB0byB4bG9nX3dyaXRlKCkuCisJICogICBUaGlzIHRoZW4gbWVhbnMgdGhhdCBpbiB0aGUgd29yc3QgY2FzZSwgcm91bmRvZmYgY2FuIGhhcHBlbiBmb3IKKwkgKiAgIHRoZSBjb21taXQtcmVjIGFzIHdlbGwuCisJICogICBUaGUgY29tbWl0LXJlYyBpcyBzbWFsbGVyIHRoYW4gcGFkZGluZyBpbiB0aGlzIHNjZW5hcmlvIGFuZCBzbyBpdCBpcworCSAqICAgbm90IGFkZGVkIHNlcGFyYXRlbHkuCiAJICovCiAKLQkvKiBmb3Igc3RhcnQtcmVjICovCi0JdW5pdF9ieXRlcyArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7IAotCi0JLyogZm9yIHBhZGRpbmcgKi8KLQlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgJiYKLQkJbG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0ID4gMSkgewotCQkvKiBsb2cgc3Ugcm91bmRvZmYgKi8KLQkJdW5pdF9ieXRlcyArPSBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7ICAKLQl9IGVsc2UgewotCQkvKiBCQiByb3VuZG9mZiAqLwotCQl1bml0X2J5dGVzICs9IEJCU0laRTsKLSAgICAgICAgfQotCi0JLyogZm9yIGNvbW1pdC1yZWMgKi8KKwkvKiBmb3IgdHJhbnMgaGVhZGVyICovCiAJdW5pdF9ieXRlcyArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7Ci0gCisJdW5pdF9ieXRlcyArPSBzaXplb2YoeGZzX3RyYW5zX2hlYWRlcl90KTsKKworCS8qIGZvciBzdGFydC1yZWMgKi8KKwl1bml0X2J5dGVzICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwogCS8qIGZvciBMUiBoZWFkZXJzICovCiAJbnVtX2hlYWRlcnMgPSAoKHVuaXRfYnl0ZXMgKyBsb2ctPmxfaWNsb2dfc2l6ZS0xKSA+PiBsb2ctPmxfaWNsb2dfc2l6ZV9sb2cpOwogCXVuaXRfYnl0ZXMgKz0gbG9nLT5sX2ljbG9nX2hzaXplICogbnVtX2hlYWRlcnM7CiAKKwkvKiBmb3IgY29tbWl0LXJlYyBMUiBoZWFkZXIgLSBub3RlOiBwYWRkaW5nIHdpbGwgc3Vic3VtZSB0aGUgb3BoZHIgKi8KKwl1bml0X2J5dGVzICs9IGxvZy0+bF9pY2xvZ19oc2l6ZTsKKworCS8qIGZvciBzcGxpdC1yZWNzIC0gb3BoZHJzIGFkZGVkIHdoZW4gZGF0YSBzcGxpdCBvdmVyIExScyAqLworCXVuaXRfYnl0ZXMgKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpICogbnVtX2hlYWRlcnM7CisKKwkvKiBmb3Igcm91bmRvZmYgcGFkZGluZyBmb3IgdHJhbnNhY3Rpb24gZGF0YSBhbmQgb25lIGZvciBjb21taXQgcmVjb3JkICovCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpICYmCisJICAgIGxvZy0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCA+IDEpIHsKKwkJLyogbG9nIHN1IHJvdW5kb2ZmICovCisJCXVuaXRfYnl0ZXMgKz0gMipsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7CisJfSBlbHNlIHsKKwkJLyogQkIgcm91bmRvZmYgKi8KKwkJdW5pdF9ieXRlcyArPSAyKkJCU0laRTsKKyAgICAgICAgfQorCiAJdGljLT50X3VuaXRfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2N1cnJfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2NudAkJPSBjbnQ7CkBAIC0zMjA5LDEwICszMzc1LDEzIEBACiAJdGljLT50X3RpZAkJPSAoeGxvZ190aWRfdCkoKF9fcHNpbnRfdCl0aWMgJiAweGZmZmZmZmZmKTsKIAl0aWMtPnRfY2xpZW50aWQJCT0gY2xpZW50OwogCXRpYy0+dF9mbGFncwkJPSBYTE9HX1RJQ19JTklURUQ7CisJdGljLT50X3RyYW5zX3R5cGUJPSAwOwogCWlmICh4ZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQogCQl0aWMtPnRfZmxhZ3MgfD0gWExPR19USUNfUEVSTV9SRVNFUlY7CiAJc3ZfaW5pdCgmKHRpYy0+dF9zZW1hKSwgU1ZfREVGQVVMVCwgImxvZ3RpY2siKTsKIAorCVhMT0dfVElDX1JFU0VUX1JFUyh0aWMpOworCiAJcmV0dXJuIHRpYzsKIH0JLyogeGxvZ190aWNrZXRfZ2V0ICovCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmggYi9mcy94ZnMveGZzX2xvZy5oCmluZGV4IDBkYjEyMmQuLjE4OTYxMTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmgKKysrIGIvZnMveGZzL3hmc19sb2cuaApAQCAtMTE0LDkgKzExNCw0NCBAQAogI2RlZmluZSBYRlNfVk9MVU1FCQkweDIKICNkZWZpbmUgWEZTX0xPRwkJCTB4YWEKIAorCisvKiBSZWdpb24gdHlwZXMgZm9yIGlvdmVjJ3MgaV90eXBlICovCisjaWYgZGVmaW5lZChYRlNfTE9HX1JFU19ERUJVRykKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9CRk9STUFUCQkxCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfQkNIVU5LCQkyCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfRUZJX0ZPUk1BVAkzCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfRUZEX0ZPUk1BVAk0CisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfSUZPUk1BVAkJNQorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lDT1JFCQk2CisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfSUVYVAkJNworI2RlZmluZSBYTE9HX1JFR19UWVBFX0lCUk9PVAkJOAorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lMT0NBTAkJOQorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lBVFRSX0VYVAkJMTAKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9JQVRUUl9CUk9PVAkxMQorI2RlZmluZSBYTE9HX1JFR19UWVBFX0lBVFRSX0xPQ0FMCTEyCisjZGVmaW5lIFhMT0dfUkVHX1RZUEVfUUZPUk1BVAkJMTMKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9EUVVPVAkJMTQKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9RVU9UQU9GRgkJMTUKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9MUkhFQURFUgkJMTYKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9VTk1PVU5UCQkxNworI2RlZmluZSBYTE9HX1JFR19UWVBFX0NPTU1JVAkJMTgKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9UUkFOU0hEUgkJMTkKKyNkZWZpbmUgWExPR19SRUdfVFlQRV9NQVgJCTE5CisjZW5kaWYKKworI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCisjZGVmaW5lIFhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIHQpICgodmVjcCktPmlfdHlwZSA9ICh0KSkKKyNlbHNlCisjZGVmaW5lIFhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIHQpCisjZW5kaWYKKworCiB0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2lvdmVjIHsKIAl4ZnNfY2FkZHJfdAkJaV9hZGRyOwkJLyogYmVnaW5uaW5nIGFkZHJlc3Mgb2YgcmVnaW9uICovCiAJaW50CQlpX2xlbjsJCS8qIGxlbmd0aCBpbiBieXRlcyBvZiByZWdpb24gKi8KKyNpZiBkZWZpbmVkKFhGU19MT0dfUkVTX0RFQlVHKQorIAl1aW50CQlpX3R5cGU7CQkvKiB0eXBlIG9mIHJlZ2lvbiAqLworI2VuZGlmCiB9IHhmc19sb2dfaW92ZWNfdDsKIAogdHlwZWRlZiB2b2lkKiB4ZnNfbG9nX3RpY2tldF90OwpAQCAtMTU5LDcgKzE5NCw4IEBACiAJCQkgIGludAkJICAgY291bnQsCiAJCQkgIHhmc19sb2dfdGlja2V0X3QgKnRpY2tldCwKIAkJCSAgX191aW50OF90CSAgIGNsaWVudGlkLAotCQkJICB1aW50CQkgICBmbGFncyk7CisJCQkgIHVpbnQJCSAgIGZsYWdzLAorCQkJICB1aW50CQkgICB0X3R5cGUpOwogaW50CSAgeGZzX2xvZ193cml0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwKIAkJCXhmc19sb2dfaW92ZWNfdCAgcmVnaW9uW10sCiAJCQlpbnQJCSBuZW50cmllcywKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaCBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAppbmRleCAxYTFkNDUyLi5hODg0Y2VhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19wcml2LmgKKysrIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqIHRoaXMgaGFzIGVuZGlhbiBpc3N1ZXMsIG9mIGNvdXJzZS4KICAqLwogCi0jaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2lmbmRlZiBYRlNfTkFUSVZFX0hPU1QKICNkZWZpbmUgR0VUX0NMSUVOVF9JRChpLGFyY2gpIFwKICAgICAoKGkpICYgMHhmZikKICNlbHNlCkBAIC0zMzUsMTggKzMzNSw2NiBAQAogCiAjZGVmaW5lIFhMT0dfQ09WRVJfT1BTCQk1CiAKKworLyogVGlja2V0IHJlc2VydmF0aW9uIHJlZ2lvbiBhY2NvdW50aW5nICovIAorI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCisjZGVmaW5lIFhMT0dfVElDX0xFTl9NQVgJMTUKKyNkZWZpbmUgWExPR19USUNfUkVTRVRfUkVTKHQpICgodCktPnRfcmVzX251bSA9IFwKKwkJCQkodCktPnRfcmVzX2Fycl9zdW0gPSAodCktPnRfcmVzX251bV9vcGhkcnMgPSAwKQorI2RlZmluZSBYTE9HX1RJQ19BRERfT1BIRFIodCkgKCh0KS0+dF9yZXNfbnVtX29waGRycysrKQorI2RlZmluZSBYTE9HX1RJQ19BRERfUkVHSU9OKHQsIGxlbiwgdHlwZSkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKCh0KS0+dF9yZXNfbnVtID09IFhMT0dfVElDX0xFTl9NQVgpIHsgCQlcCisJCQkvKiBhZGQgdG8gb3ZlcmZsb3cgYW5kIHN0YXJ0IGFnYWluICovCQlcCisJCQkodCktPnRfcmVzX29fZmxvdyArPSAodCktPnRfcmVzX2Fycl9zdW07CVwKKwkJCSh0KS0+dF9yZXNfbnVtID0gMDsJCQkJXAorCQkJKHQpLT50X3Jlc19hcnJfc3VtID0gMDsJCQkJXAorCQl9CQkJCQkJCVwKKwkJKHQpLT50X3Jlc19hcnJbKHQpLT50X3Jlc19udW1dLnJfbGVuID0gKGxlbik7CQlcCisJCSh0KS0+dF9yZXNfYXJyWyh0KS0+dF9yZXNfbnVtXS5yX3R5cGUgPSAodHlwZSk7CQlcCisJCSh0KS0+dF9yZXNfYXJyX3N1bSArPSAobGVuKTsJCQkJXAorCQkodCktPnRfcmVzX251bSsrOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBSZXNlcnZhdGlvbiByZWdpb24KKyAqIEFzIHdvdWxkIGJlIHN0b3JlZCBpbiB4ZnNfbG9nX2lvdmVjIGJ1dCB3aXRob3V0IHRoZSBpX2FkZHIgd2hpY2gKKyAqIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhsb2dfcmVzIHsKKwl1aW50CXJfbGVuOworCXVpbnQJcl90eXBlOworfSB4bG9nX3Jlc190OworI2Vsc2UKKyNkZWZpbmUgWExPR19USUNfUkVTRVRfUkVTKHQpCisjZGVmaW5lIFhMT0dfVElDX0FERF9PUEhEUih0KQorI2RlZmluZSBYTE9HX1RJQ19BRERfUkVHSU9OKHQsIGxlbiwgdHlwZSkKKyNlbmRpZgorCisKIHR5cGVkZWYgc3RydWN0IHhsb2dfdGlja2V0IHsKLQlzdl90CQkgICB0X3NlbWE7CSAvKiBzbGVlcCBvbiB0aGlzIHNlbWFwaG9yZQkgOjIwICovCi0Jc3RydWN0IHhsb2dfdGlja2V0ICp0X25leHQ7CSAvKgkJCSAgICAgICAgIDogNCAqLwotCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9wcmV2OwkgLyoJCQkJIDogNCAqLwotCXhsb2dfdGlkX3QJICAgdF90aWQ7CSAvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyCSA6IDQgKi8KLQlpbnQJCSAgIHRfY3Vycl9yZXM7CSAvKiBjdXJyZW50IHJlc2VydmF0aW9uIGluIGJ5dGVzIDogNCAqLwotCWludAkJICAgdF91bml0X3JlczsJIC8qIHVuaXQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgICAgOiA0ICovCi0JX191aW50OF90CSAgIHRfb2NudDsJIC8qIG9yaWdpbmFsIGNvdW50CQkgOiAxICovCi0JX191aW50OF90CSAgIHRfY250OwkgLyogY3VycmVudCBjb3VudAkJIDogMSAqLwotCV9fdWludDhfdAkgICB0X2NsaWVudGlkOwkgLyogd2hvIGRvZXMgdGhpcyBiZWxvbmcgdG87CSA6IDEgKi8KLQlfX3VpbnQ4X3QJICAgdF9mbGFnczsJIC8qIHByb3BlcnRpZXMgb2YgcmVzZXJ2YXRpb24JIDogMSAqLworCXN2X3QJCSAgIHRfc2VtYTsJIC8qIHNsZWVwIG9uIHRoaXMgc2VtYXBob3JlICAgICAgOiAyMCAqLworIAlzdHJ1Y3QgeGxvZ190aWNrZXQgKnRfbmV4dDsJIC8qCQkJICAgICAgICAgOjR8OCAqLworCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9wcmV2OwkgLyoJCQkJIDo0fDggKi8KKwl4bG9nX3RpZF90CSAgIHRfdGlkOwkgLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllcgkgOiA0ICAqLworCWludAkJICAgdF9jdXJyX3JlczsJIC8qIGN1cnJlbnQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgOiA0ICAqLworCWludAkJICAgdF91bml0X3JlczsJIC8qIHVuaXQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgICAgOiA0ICAqLworCWNoYXIJCSAgIHRfb2NudDsJIC8qIG9yaWdpbmFsIGNvdW50CQkgOiAxICAqLworCWNoYXIJCSAgIHRfY250OwkgLyogY3VycmVudCBjb3VudAkJIDogMSAgKi8KKwljaGFyCQkgICB0X2NsaWVudGlkOwkgLyogd2hvIGRvZXMgdGhpcyBiZWxvbmcgdG87CSA6IDEgICovCisJY2hhcgkJICAgdF9mbGFnczsJIC8qIHByb3BlcnRpZXMgb2YgcmVzZXJ2YXRpb24JIDogMSAgKi8KKwl1aW50CQkgICB0X3RyYW5zX3R5cGU7IC8qIHRyYW5zYWN0aW9uIHR5cGUgICAgICAgICAgICAgOiA0ICAqLworCisjaWYgZGVmaW5lZCAoWEZTX0xPR19SRVNfREVCVUcpCisgICAgICAgIC8qIHJlc2VydmF0aW9uIGFycmF5IGZpZWxkcyAqLworCXVpbnQJCSAgIHRfcmVzX251bTsgICAgICAgICAgICAgICAgICAgIC8qIG51bSBpbiBhcnJheSA6IDQgKi8KKwl4bG9nX3Jlc190CSAgIHRfcmVzX2FycltYTE9HX1RJQ19MRU5fTUFYXTsgIC8qIGFycmF5IG9mIHJlcyA6IFggKi8gCisJdWludAkJICAgdF9yZXNfbnVtX29waGRyczsJCSAvKiBudW0gb3AgaGRycyAgOiA0ICovCisJdWludAkJICAgdF9yZXNfYXJyX3N1bTsJCSAvKiBhcnJheSBzdW0gICAgOiA0ICovCisJdWludAkJICAgdF9yZXNfb19mbG93OwkJIC8qIHN1bSBvdmVyZmxvdyA6IDQgKi8KKyNlbmRpZgogfSB4bG9nX3RpY2tldF90OworCiAjZW5kaWYKIAogCkBAIC0zNjYsMTQgKzQxNCwxMCBAQAogI2RlZmluZSBYTE9HX0ZNVF9JUklYX0JFICAzCiAKIC8qIG91ciBmbXQgKi8KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIFhMT0dfRk1UIFhMT0dfRk1UX0xJTlVYX0xFCi0jZWxzZQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNpZmRlZiBYRlNfTkFUSVZFX0hPU1QKICNkZWZpbmUgWExPR19GTVQgWExPR19GTVRfTElOVVhfQkUKICNlbHNlCi0jZXJyb3IgdW5rbm93biBieXRlIG9yZGVyCi0jZW5kaWYKKyNkZWZpbmUgWExPR19GTVQgWExPR19GTVRfTElOVVhfTEUKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB4bG9nX3JlY19oZWFkZXIgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IDBhYWMyOGQuLjE0ZmFhYmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTEzODcsNyArMTM4Nyw3IEBACiAJb2xkX3B0ciA9IGl0ZW0tPnJpX2J1ZltpdGVtLT5yaV9jbnQtMV0uaV9hZGRyOwogCW9sZF9sZW4gPSBpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfbGVuOwogCi0JcHRyID0ga21lbV9yZWFsbG9jKG9sZF9wdHIsIGxlbitvbGRfbGVuLCBvbGRfbGVuLCAwKTsKKwlwdHIgPSBrbWVtX3JlYWxsb2Mob2xkX3B0ciwgbGVuK29sZF9sZW4sIG9sZF9sZW4sIDB1KTsKIAltZW1jcHkoJnB0cltvbGRfbGVuXSwgZHAsIGxlbik7IC8qIGQsIHMsIGwgKi8KIAlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfbGVuICs9IGxlbjsKIAlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfYWRkciA9IHB0cjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcW1vcHMuYyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwppbmRleCA0ZjQwYzkyLi5hNmNkNjMyNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19xbW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTQyLDcgKzQyLDggQEAKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgotCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAKIFNUQVRJQyBzdHJ1Y3QgeGZzX2RxdW90ICoKIHhmc19kcXZvcGNob3duX2RlZmF1bHQoCkBAIC01NCw4ICs1NSw3OSBAQAogCXJldHVybiBOVUxMOwogfQogCisvKgorICogQ2xlYXIgdGhlIHF1b3RhZmxhZ3MgaW4gbWVtb3J5IGFuZCBpbiB0aGUgc3VwZXJibG9jay4KKyAqLworaW50Cit4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3MoeGZzX21vdW50X3QgKm1wKQoreworCWludAkJCWVycm9yOworCXhmc190cmFuc190CQkqdHA7CisJdW5zaWduZWQgbG9uZwkJczsKKworCW1wLT5tX3FmbGFncyA9IDA7CisJLyoKKwkgKiBJdCBpcyBPSyB0byBsb29rIGF0IHNiX3FmbGFncyBoZXJlIGluIG1vdW50IHBhdGgsCisJICogd2l0aG91dCBTQl9MT0NLLgorCSAqLworCWlmIChtcC0+bV9zYi5zYl9xZmxhZ3MgPT0gMCkKKwkJcmV0dXJuIDA7CisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwltcC0+bV9zYi5zYl9xZmxhZ3MgPSAwOworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCisJLyoKKwkgKiBpZiB0aGUgZnMgaXMgcmVhZG9ubHksIGxldCB0aGUgaW5jb3JlIHN1cGVyYmxvY2sgcnVuCisJICogd2l0aCBxdW90YXMgb2ZmIGJ1dCBkb24ndCBmbHVzaCB0aGUgdXBkYXRlIG91dCB0byBkaXNrCisJICovCisJaWYgKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybiAwOworI2lmZGVmIFFVT1RBREVCVUcKKwl4ZnNfZnNfY21uX2VycihDRV9OT1RFLCBtcCwgIldyaXRpbmcgc3VwZXJibG9jayBxdW90YSBjaGFuZ2VzIik7CisjZW5kaWYKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1NCQ0hBTkdFKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplICsgMTI4LCAwLCAwLAorCQkJCSAgICAgIFhGU19ERUZBVUxUX0xPR19DT1VOVCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkieGZzX21vdW50X3Jlc2V0X3NicWZsYWdzOiBTdXBlcmJsb2NrIHVwZGF0ZSBmYWlsZWQhIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX21vZF9zYih0cCwgWEZTX1NCX1FGTEFHUyk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19ub3F1b3RhX2luaXQoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCSpuZWVkcXVvdGFtb3VudCwKKwl1aW50CQkqcXVvdGFmbGFncykKK3sKKwlpbnQJCWVycm9yID0gMDsKKworCSpxdW90YWZsYWdzID0gMDsKKwkqbmVlZHF1b3RhbW91bnQgPSBCX0ZBTFNFOworCisJQVNTRVJUKCFYRlNfSVNfUVVPVEFfT04obXApKTsKKworCS8qCisJICogSWYgYSBmaWxlIHN5c3RlbSBoYWQgcXVvdGFzIHJ1bm5pbmcgZWFybGllciwgYnV0IGRlY2lkZWQgdG8KKwkgKiBtb3VudCB3aXRob3V0IC1vIHVxdW90YS9wcXVvdGEvZ3F1b3RhIG9wdGlvbnMsIHJldm9rZSB0aGUKKwkgKiBxdW90YWNoZWNrZWQgbGljZW5zZS4KKwkgKi8KKwlpZiAobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUKSB7CisJCWNtbl9lcnIoQ0VfTk9URSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJYRlMgcmVzZXR0aW5nIHFmbGFncyBmb3IgZmlsZXN5c3RlbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtcC0+bV9mc25hbWUpOworCisJCWVycm9yID0geGZzX21vdW50X3Jlc2V0X3NicWZsYWdzKG1wKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCiB4ZnNfcW1vcHNfdAl4ZnNfcW1jb3JlX3N0dWIgPSB7Ci0JLnhmc19xbWluaXQJCT0gKHhmc19xbWluaXRfdCkgZnNfbm9lcnIsCisJLnhmc19xbWluaXQJCT0gKHhmc19xbWluaXRfdCkgeGZzX25vcXVvdGFfaW5pdCwKIAkueGZzX3FtZG9uZQkJPSAoeGZzX3FtZG9uZV90KSBmc19ub2VyciwKIAkueGZzX3FtbW91bnQJCT0gKHhmc19xbW1vdW50X3QpIGZzX25vZXJyLAogCS54ZnNfcW11bm1vdW50CQk9ICh4ZnNfcW11bm1vdW50X3QpIGZzX25vZXJyLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xdW90YS5oIGIvZnMveGZzL3hmc19xdW90YS5oCmluZGV4IDcxMzQ1NzYuLjMyY2I3OTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcXVvdGEuaAorKysgYi9mcy94ZnMveGZzX3F1b3RhLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0xNjAsNiArMTYwLDIwIEBACiAjZGVmaW5lIFhGU19HUVVPVEFfQUNDVAkweDAwNDAgIC8qIGdyb3VwIHF1b3RhIGFjY291bnRpbmcgT04gKi8KIAogLyoKKyAqIFF1b3RhIEFjY291bnRpbmcvRW5mb3JjZW1lbnQgZmxhZ3MKKyAqLworI2RlZmluZSBYRlNfQUxMX1FVT1RBX0FDQ1QJXAorCQkoWEZTX1VRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ0NUIHwgWEZTX1BRVU9UQV9BQ0NUKQorI2RlZmluZSBYRlNfQUxMX1FVT1RBX0VORkQJKFhGU19VUVVPVEFfRU5GRCB8IFhGU19PUVVPVEFfRU5GRCkKKyNkZWZpbmUgWEZTX0FMTF9RVU9UQV9DSEtECShYRlNfVVFVT1RBX0NIS0QgfCBYRlNfT1FVT1RBX0NIS0QpCisKKyNkZWZpbmUgWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0lTX1FVT1RBX0VORk9SQ0VEKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0VORkQpCisjZGVmaW5lIFhGU19JU19VUVVPVEFfUlVOTklORyhtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKQorI2RlZmluZSBYRlNfSVNfUFFVT1RBX1JVTk5JTkcobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19QUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0lTX0dRVU9UQV9SVU5OSU5HKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpCisKKy8qCiAgKiBJbmNvcmUgb25seSBmbGFncyBmb3IgcXVvdGFvZmYgLSB0aGVzZSBiaXRzIGdldCBjbGVhcmVkIHdoZW4gcXVvdGEocykKICAqIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHR1cm5lZCBvZmYuIFRoZXNlIGZsYWdzIGFyZSBpbiBtX3FmbGFncyBidXQKICAqIG5ldmVyIGluIHNiX3FmbGFncy4KQEAgLTM2Miw2ICszNzYsNyBAQAogCQkJCWYgfCBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpCiAKIGV4dGVybiBpbnQgeGZzX3FtX2RxY2hlY2soeGZzX2Rpc2tfZHF1b3RfdCAqLCB4ZnNfZHFpZF90LCB1aW50LCB1aW50LCBjaGFyICopOworZXh0ZXJuIGludCB4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3Moc3RydWN0IHhmc19tb3VudCAqKTsKIAogZXh0ZXJuIHN0cnVjdCBiaHZfdmZzb3BzIHhmc19xbW9wczsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDA2ZGZjYTUuLjkyZWZlMjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCiAJCWVycm9yID0geGZzX2xvZ19yZXNlcnZlKHRwLT50X21vdW50cCwgbG9nc3BhY2UsIGxvZ2NvdW50LAogCQkJCQkmdHAtPnRfdGlja2V0LAotCQkJCQlYRlNfVFJBTlNBQ1RJT04sIGxvZ19mbGFncyk7CisJCQkJCVhGU19UUkFOU0FDVElPTiwgbG9nX2ZsYWdzLCB0cC0+dF90eXBlKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlnb3RvIHVuZG9fYmxvY2tzOwogCQl9CkBAIC0xMDMyLDYgKzEwMzIsNyBAQAogCXRwLT50X2hlYWRlci50aF9udW1faXRlbXMgPSBuaXRlbXM7CiAJbG9nX3ZlY3Rvci0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZ0cC0+dF9oZWFkZXI7CiAJbG9nX3ZlY3Rvci0+aV9sZW4gPSBzaXplb2YoeGZzX3RyYW5zX2hlYWRlcl90KTsKKwlYTE9HX1ZFQ19TRVRfVFlQRShsb2dfdmVjdG9yLCBYTE9HX1JFR19UWVBFX1RSQU5TSERSKTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKaW5kZXggZWM1NDFkNi4uYTI2M2FlYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtMTEyLDYgKzExMiw3IEBACiAjZGVmaW5lCVhGU19UUkFOU19HUk9XRlNSVF9aRVJPCQkzOAogI2RlZmluZQlYRlNfVFJBTlNfR1JPV0ZTUlRfRlJFRQkJMzkKICNkZWZpbmUJWEZTX1RSQU5TX1NXQVBFWFQJCTQwCisjZGVmaW5lCVhGU19UUkFOU19UWVBFX01BWAkJNDAKIC8qIG5ldyB0cmFuc2FjdGlvbiB0eXBlcyBuZWVkIHRvIGJlIHJlZmxlY3RlZCBpbiB4ZnNfbG9ncHJpbnQoOCkgKi8KIAogCkBAIC05OTgsNiArOTk5LDcgQEAKIHZvaWQJCXhmc190cmFuc19icmVsc2UoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfYmpvaW4oeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfYmhvbGQoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfYmhvbGRfcmVsZWFzZSh4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKIHZvaWQJCXhmc190cmFuc19iaW52YWwoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCmluZGV4IDdiYzVlYWIuLjJhNzFiNGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19haWwuYwpAQCAtMzc5LDggKzM3OSw4IEBACiAJCWVsc2UgewogCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfQUlMREVMRVRFLCBDRV9BTEVSVCwgbXAsCiAJCQkJInhmc190cmFuc19kZWxldGVfYWlsOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGxvZyBpdGVtIHRoYXQgaXMgbm90IGluIHRoZSBBSUwiKTsKLQkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKIAkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19idWYuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKaW5kZXggMTQ0ZGE3YS4uZTczMzI5MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19idWYuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCkBAIC03MTQsNiArNzE0LDI5IEBACiB9CiAKIC8qCisgKiBDYW5jZWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBob2xkIHJlcXVlc3QgbWFkZSBvbiB0aGlzIGJ1ZmZlcgorICogZm9yIHRoaXMgdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc190cmFuc19iaG9sZF9yZWxlYXNlKHhmc190cmFuc190CSp0cCwKKwkJCXhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCUFTU0VSVChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSE9MRCk7CisJYmlwLT5ibGlfZmxhZ3MgJj0gflhGU19CTElfSE9MRDsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkJIT0xEIFJFTEVBU0UiLCBiaXApOworfQorCisvKgogICogVGhpcyBpcyBjYWxsZWQgdG8gbWFyayBieXRlcyBmaXJzdCB0aHJvdWdoIGxhc3QgaW5jbHVzaXZlIG9mIHRoZSBnaXZlbgogICogYnVmZmVyIGFzIG5lZWRpbmcgdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KICAqIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zmc29wcy5jIGIvZnMveGZzL3hmc192ZnNvcHMuYwppbmRleCA0MmJjYzAyLi5mMWE5MDRlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zmc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdmZzb3BzLmMKQEAgLTc5NSw3ICs3OTUsNiBAQAogCXhmc19tb3VudF90CSptcDsKIAl4ZnNfc2JfdAkqc2JwOwogCXVuc2lnbmVkIGxvbmcJczsKLQl1NjQgaWQ7CiAKIAltcCA9IFhGU19CSFZUT00oYmRwKTsKIAlzYnAgPSAmKG1wLT5tX3NiKTsKQEAgLTgyMyw5ICs4MjIsNyBAQAogCXN0YXRwLT5mX2ZmcmVlID0gc3RhdHAtPmZfZmlsZXMgLSAoc2JwLT5zYl9pY291bnQgLSBzYnAtPnNiX2lmcmVlKTsKIAlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKIAotCWlkID0gaHVnZV9lbmNvZGVfZGV2KG1wLT5tX2Rldik7Ci0Jc3RhdHAtPmZfZnNpZC52YWxbMF0gPSAodTMyKWlkOwotCXN0YXRwLT5mX2ZzaWQudmFsWzFdID0gKHUzMikoaWQgPj4gMzIpOworCXhmc19zdGF0dmZzX2ZzaWQoc3RhdHAsIG1wKTsKIAlzdGF0cC0+Zl9uYW1lbGVuID0gTUFYTkFNRUxFTiAtIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTkwNiw3ICs5MDMsNiBAQAogCXhmc19pbm9kZV90CSppcF9uZXh0OwogCXhmc19idWZfdAkqYnA7CiAJdm5vZGVfdAkJKnZwID0gTlVMTDsKLQl2bWFwX3QJCXZtYXA7CiAJaW50CQllcnJvcjsKIAlpbnQJCWxhc3RfZXJyb3I7CiAJdWludDY0X3QJZmZsYWc7CkBAIC0xMTAxLDQ4ICsxMDk3LDIxIEBACiAJCSAqIGxvY2sgaW4geGZzX2lyZWNsYWltKCkgYWZ0ZXIgdGhlIGlub2RlIGlzIHB1bGxlZCBmcm9tCiAJCSAqIHRoZSBtb3VudCBsaXN0IHdpbGwgc2xlZXAgdW50aWwgd2UgcmVsZWFzZSBpdCBoZXJlLgogCQkgKiBUaGlzIGtlZXBzIHRoZSB2bm9kZSBmcm9tIGJlaW5nIGZyZWVkIHdoaWxlIHdlIHJlZmVyZW5jZQotCQkgKiBpdC4gIEl0IGlzIGFsc28gY2hlYXBlciBhbmQgc2ltcGxlciB0aGFuIGFjdHVhbGx5IGRvaW5nCi0JCSAqIGEgdm5fZ2V0KCkgZm9yIGV2ZXJ5IGlub2RlIHdlIHRvdWNoIGhlcmUuCisJCSAqIGl0LgogCQkgKi8KIAkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIGxvY2tfZmxhZ3MpID09IDApIHsKLQogCQkJaWYgKChmbGFncyAmIFNZTkNfQkRGTFVTSCkgfHwgKHZwID09IE5VTEwpKSB7CiAJCQkJaXAgPSBpcC0+aV9tbmV4dDsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIFdlIG5lZWQgdG8gdW5sb2NrIHRoZSBpbm9kZSBsaXN0IGxvY2sgaW4gb3JkZXIKLQkJCSAqIHRvIGxvY2sgdGhlIGlub2RlLiBJbnNlcnQgYSBtYXJrZXIgcmVjb3JkIGludG8KLQkJCSAqIHRoZSBpbm9kZSBsaXN0IHRvIHJlbWVtYmVyIG91ciBwb3NpdGlvbiwgZHJvcHBpbmcKLQkJCSAqIHRoZSBsb2NrIGlzIG5vdyBkb25lIGluc2lkZSB0aGUgSVBPSU5URVJfSU5TRVJUCi0JCQkgKiBtYWNyby4KLQkJCSAqCi0JCQkgKiBXZSBhbHNvIHVzZSB0aGUgaW5vZGUgbGlzdCBsb2NrIHRvIHByb3RlY3QgdXMKLQkJCSAqIGluIHRha2luZyBhIHNuYXBzaG90IG9mIHRoZSB2bm9kZSB2ZXJzaW9uIG51bWJlcgotCQkJICogZm9yIHVzZSBpbiBjYWxsaW5nIHZuX2dldCgpLgotCQkJICovCi0JCQlWTUFQKHZwLCB2bWFwKTsKLQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOwotCi0JCQl2cCA9IHZuX2dldCh2cCwgJnZtYXApOworCQkJdnAgPSB2bl9ncmFiKHZwKTsKIAkJCWlmICh2cCA9PSBOVUxMKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgdm5vZGUgd2FzIHJlY2xhaW1lZCBvbmNlIHdlIGxldCBnbwotCQkJCSAqIG9mIHRoZSBpbm9kZSBsaXN0IGxvY2suICBTa2lwIHRvIHRoZQotCQkJCSAqIG5leHQgbGlzdCBlbnRyeS4gUmVtb3ZlIHRoZSBtYXJrZXIuCi0JCQkJICovCi0KLQkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCi0JCQkJbW91bnRfbG9ja2VkID0gQl9UUlVFOwotCQkJCXZub2RlX3JlZmVkICA9IEJfRkFMU0U7Ci0KLQkJCQlJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKTsKLQorCQkJCWlwID0gaXAtPmlfbW5leHQ7CiAJCQkJY29udGludWU7CiAJCQl9CiAKKwkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOwogCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKIAogCQkJQVNTRVJUKHZwID09IFhGU19JVE9WKGlwKSk7CkBAIC0xNTMzLDcgKzE1MDIsMTAgQEAKIAkgKiBldmVudHVhbGx5IGtpY2tlZCBvdXQgb2YgdGhlIGNhY2hlLgogCSAqLwogCWlmIChmbGFncyAmIFNZTkNfUkVGQ0FDSEUpIHsKLQkJeGZzX3JlZmNhY2hlX3B1cmdlX3NvbWUobXApOworCQlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpCisJCQl4ZnNfcmVmY2FjaGVfcHVyZ2VfbXAobXApOworCQllbHNlCisJCQl4ZnNfcmVmY2FjaGVfcHVyZ2Vfc29tZShtcCk7CiAJfQogCiAJLyoKQEAgLTE2NDksNiArMTYyMSwxMCBAQAogI2RlZmluZSBNTlRPUFRfU1dJRFRICSJzd2lkdGgiCS8qIGRhdGEgdm9sdW1lIHN0cmlwZSB3aWR0aCAqLwogI2RlZmluZSBNTlRPUFRfTk9VVUlECSJub3V1aWQiCS8qIGlnbm9yZSBmaWxlc3lzdGVtIFVVSUQgKi8KICNkZWZpbmUgTU5UT1BUX01UUFQJIm10cHQiCQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisjZGVmaW5lIE1OVE9QVF9HUlBJRAkiZ3JwaWQiCQkvKiBncm91cC1JRCBmcm9tIHBhcmVudCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgTU5UT1BUX05PR1JQSUQJIm5vZ3JwaWQiCS8qIGdyb3VwLUlEIGZyb20gY3VycmVudCBwcm9jZXNzICovCisjZGVmaW5lIE1OVE9QVF9CU0RHUk9VUFMgICAgImJzZGdyb3VwcyIgICAgLyogZ3JvdXAtSUQgZnJvbSBwYXJlbnQgZGlyZWN0b3J5ICovCisjZGVmaW5lIE1OVE9QVF9TWVNWR1JPVVBTICAgInN5c3Zncm91cHMiICAgLyogZ3JvdXAtSUQgZnJvbSBjdXJyZW50IHByb2Nlc3MgKi8KICNkZWZpbmUgTU5UT1BUX0FMTE9DU0laRSAgICAiYWxsb2NzaXplIiAgICAvKiBwcmVmZXJyZWQgYWxsb2NhdGlvbiBzaXplICovCiAjZGVmaW5lIE1OVE9QVF9JSEFTSFNJWkUgICAgImloYXNoc2l6ZSIgICAgLyogc2l6ZSBvZiBpbm9kZSBoYXNoIHRhYmxlICovCiAjZGVmaW5lIE1OVE9QVF9OT1JFQ09WRVJZICAgIm5vcmVjb3ZlcnkiICAgLyogZG9uJ3QgcnVuIFhGUyByZWNvdmVyeSAqLwpAQCAtMTc2OSw2ICsxNzQ1LDEyIEBACiAJCQl9CiAJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSUhBU0hTSVpFOwogCQkJYXJncy0+aWhhc2hzaXplID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0dSUElEKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CU0RHUk9VUFMpKSB7CisJCQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfR1JQSUQ7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0dSUElEKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TWVNWR1JPVVBTKSkgeworCQkJdmZzcC0+dmZzX2ZsYWcgJj0gflZGU19HUlBJRDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1dTWU5DKSkgewogCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1dTWU5DOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfT1NZTkNJU09TWU5DKSkgewpAQCAtMTg5MCw2ICsxODcyLDcgQEAKIAl9OwogCXN0cnVjdCBwcm9jX3hmc19pbmZvCSp4ZnNfaW5mb3A7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfQkhWVE9NKGJodik7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBYRlNfTVRPVkZTKG1wKTsKIAogCWZvciAoeGZzX2luZm9wID0geGZzX2luZm87IHhmc19pbmZvcC0+ZmxhZzsgeGZzX2luZm9wKyspIHsKIAkJaWYgKG1wLT5tX2ZsYWdzICYgeGZzX2luZm9wLT5mbGFnKQpAQCAtMTkyNiw3ICsxOTA5LDEwIEBACiAKIAlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT09QVCkpCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF82NEJJVElOT0RFKTsKLQkKKworCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19HUlBJRCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0dSUElEKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggMTM3N2M4Ni4uNThiZmU2MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJICogSWYgaXQncyBhIGRpcmVjdG9yeSB3aXRoIGFueSBibG9ja3MsIHJlYWQtYWhlYWQgYmxvY2sgMAogCSAqIGFzIHdlJ3JlIGFsbW9zdCBjZXJ0YWluIHRvIGhhdmUgdGhlIG5leHQgb3BlcmF0aW9uIGJlIGEgcmVhZCB0aGVyZS4KIAkgKi8KLQlpZiAodnAtPnZfdHlwZSA9PSBWRElSICYmIGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKSB7CisJaWYgKFZOX0lTRElSKHZwKSAmJiBpcC0+aV9kLmRpX25leHRlbnRzID4gMCkgewogCQltb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOwogCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApCiAJCQkodm9pZCl4ZnNfZGFfcmVhZGFfYnVmKE5VTEwsIGlwLCAwLCBYRlNfREFUQV9GT1JLKTsKQEAgLTE2MywxOCArMTYzLDIxIEBACiAJLyoKIAkgKiBDb3B5IGZyb20gaW4tY29yZSBpbm9kZS4KIAkgKi8KLQl2YXAtPnZhX3R5cGUgPSB2cC0+dl90eXBlOwotCXZhcC0+dmFfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZSAmIE1PREVNQVNLOworCXZhcC0+dmFfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZTsKIAl2YXAtPnZhX3VpZCA9IGlwLT5pX2QuZGlfdWlkOwogCXZhcC0+dmFfZ2lkID0gaXAtPmlfZC5kaV9naWQ7CiAJdmFwLT52YV9wcm9qaWQgPSBpcC0+aV9kLmRpX3Byb2ppZDsKIAogCS8qCiAJICogQ2hlY2sgdm5vZGUgdHlwZSBibG9jay9jaGFyIHZzLiBldmVyeXRoaW5nIGVsc2UuCi0JICogRG8gaXQgd2l0aCBiaXRtYXNrIGJlY2F1c2UgdGhhdCdzIGZhc3RlciB0aGFuIGxvb2tpbmcKLQkgKiBmb3IgbXVsdGlwbGUgdmFsdWVzIGluZGl2aWR1YWxseS4KIAkgKi8KLQlpZiAoKCgxIDw8IHZwLT52X3R5cGUpICYgKCgxPDxWQkxLKSB8ICgxPDxWQ0hSKSkpID09IDApIHsKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZDSFI6CisJCXZhcC0+dmFfcmRldiA9IGlwLT5pX2RmLmlmX3UyLmlmX3JkZXY7CisJCXZhcC0+dmFfYmxvY2tzaXplID0gQkxLREVWX0lPU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJdmFwLT52YV9yZGV2ID0gMDsKIAogCQlpZiAoIShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkpIHsKQEAgLTIyNCw5ICsyMjcsNyBAQAogCQkJCShpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpIDoKIAkJCQkobXAtPm1fc2Iuc2JfcmV4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpOwogCQl9Ci0JfSBlbHNlIHsKLQkJdmFwLT52YV9yZGV2ID0gaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKLQkJdmFwLT52YV9ibG9ja3NpemUgPSBCTEtERVZfSU9TSVpFOworCQlicmVhazsKIAl9CiAKIAl2YXAtPnZhX2F0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfYXRpbWUudF9zZWM7CkBAIC00NjgsNyArNDY5LDcgQEAKIAkJCQltIHw9IFNfSVNHSUQ7CiAjaWYgMAogCQkJLyogTGludXggYWxsb3dzIHRoaXMsIElyaXggZG9lc24ndC4gKi8KLQkJCWlmICgodmFwLT52YV9tb2RlICYgU19JU1ZUWCkgJiYgdnAtPnZfdHlwZSAhPSBWRElSKQorCQkJaWYgKCh2YXAtPnZhX21vZGUgJiBTX0lTVlRYKSAmJiAhVk5fSVNESVIodnApKQogCQkJCW0gfD0gU19JU1ZUWDsKICNlbmRpZgogCQkJaWYgKG0gJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCkBAIC01NDYsMTAgKzU0NywxMCBAQAogCQkJZ290byBlcnJvcl9yZXR1cm47CiAJCX0KIAotCQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKSB7CisJCWlmIChWTl9JU0RJUih2cCkpIHsKIAkJCWNvZGUgPSBYRlNfRVJST1IoRUlTRElSKTsKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQl9IGVsc2UgaWYgKHZwLT52X3R5cGUgIT0gVlJFRykgeworCQl9IGVsc2UgaWYgKCFWTl9JU1JFRyh2cCkpIHsKIAkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCQl9CkBAIC0xNTY3LDcgKzE1NjgsNyBAQAogCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CiAJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAKLQlpZiAoKHZwLT52X3R5cGUgIT0gVlJFRykgfHwgKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSkgeworCWlmICghVk5fSVNSRUcodnApIHx8IChpcC0+aV9kLmRpX21vZGUgPT0gMCkpIHsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xODk1LDcgKzE4OTYsNyBAQAogCWRwID0gWEZTX0JIVlRPSShkaXJfYmRwKTsKIAltcCA9IGRwLT5pX21vdW50OwogCi0JZG1fZGlfbW9kZSA9IHZhcC0+dmFfbW9kZXxWVFRPSUYodmFwLT52YV90eXBlKTsKKwlkbV9kaV9tb2RlID0gdmFwLT52YV9tb2RlOwogCW5hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOwogCiAJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9DUkVBVEUpKSB7CkBAIC0xOTczLDggKzE5NzQsNyBAQAogCSAgICAoZXJyb3IgPSBYRlNfRElSX0NBTkVOVEVSKG1wLCB0cCwgZHAsIG5hbWUsIG5hbWVsZW4pKSkKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJcmRldiA9ICh2YXAtPnZhX21hc2sgJiBYRlNfQVRfUkRFVikgPyB2YXAtPnZhX3JkZXYgOiAwOwotCWVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBkcCwKLQkJCU1BS0VJTU9ERSh2YXAtPnZhX3R5cGUsdmFwLT52YV9tb2RlKSwgMSwKKwllcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgZHAsIHZhcC0+dmFfbW9kZSwgMSwKIAkJCXJkZXYsIGNyZWRwLCBwcmlkLCByZXNibGtzID4gMCwKIAkJCSZpcCwgJmNvbW1pdHRlZCk7CiAJaWYgKGVycm9yKSB7CkBAIC0yNjIwLDcgKzI2MjAsNyBAQAogCXZuX3RyYWNlX2VudHJ5KHNyY192cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CiAKIAl0YXJnZXRfbmFtZWxlbiA9IFZOQU1FTEVOKGRlbnRyeSk7Ci0JaWYgKHNyY192cC0+dl90eXBlID09IFZESVIpCisJaWYgKFZOX0lTRElSKHNyY192cCkpCiAJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOwogCiAJc3JjX2JkcCA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQoc3JjX3ZwKSwgJnhmc192bm9kZW9wcyk7CkBAIC0yODA1LDcgKzI4MDUsNyBAQAogCiAJdHAgPSBOVUxMOwogCWRwX2pvaW5lZF90b190cmFucyA9IEJfRkFMU0U7Ci0JZG1fZGlfbW9kZSA9IHZhcC0+dmFfbW9kZXxWVFRPSUYodmFwLT52YV90eXBlKTsKKwlkbV9kaV9tb2RlID0gdmFwLT52YV9tb2RlOwogCiAJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9DUkVBVEUpKSB7CiAJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9DUkVBVEUsCkBAIC0yODc5LDggKzI4NzksNyBAQAogCS8qCiAJICogY3JlYXRlIHRoZSBkaXJlY3RvcnkgaW5vZGUuCiAJICovCi0JZXJyb3IgPSB4ZnNfZGlyX2lhbGxvYygmdHAsIGRwLAotCQkJTUFLRUlNT0RFKHZhcC0+dmFfdHlwZSx2YXAtPnZhX21vZGUpLCAyLAorCWVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBkcCwgdmFwLT52YV9tb2RlLCAyLAogCQkJMCwgY3JlZHAsIHByaWQsIHJlc2Jsa3MgPiAwLAogCQkmY2RwLCBOVUxMKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTM2NTAsNyArMzY0OSw3IEBACiAJdm5vZGVfdAkJKnZwOwogCiAJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKLQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKQorCWlmIChWTl9JU0RJUih2cCkpCiAJCXJldHVybiAxOwogCWlwID0gWEZTX0JIVlRPSShiZHApOwogCWlmIChsb2NrdHlwZSA9PSBWUldMT0NLX1dSSVRFKSB7CkBAIC0zNjgxLDcgKzM2ODAsNyBAQAogCXZub2RlX3QJCSp2cDsKIAogCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7Ci0JaWYgKHZwLT52X3R5cGUgPT0gVkRJUikKKwlpZiAoVk5fSVNESVIodnApKQogCQlyZXR1cm47CiAJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJaWYgKGxvY2t0eXBlID09IFZSV0xPQ0tfV1JJVEUpIHsKQEAgLTM4NDcsNTEgKzM4NDYsMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKLQkJaWYgKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHsKLQkJCS8qCi0JCQkgKiBGbHVzaCBhbmQgaW52YWxpZGF0ZSBhbnkgZGF0YSBsZWZ0IGFyb3VuZCB0aGF0IGlzCi0JCQkgKiBhIHBhcnQgb2YgdGhpcyBmaWxlLgotCQkJICoKLQkJCSAqIEdldCB0aGUgaW5vZGUncyBpL28gbG9jayBzbyB0aGF0IGJ1ZmZlcnMgYXJlIHB1c2hlZAotCQkJICogb3V0IHdoaWxlIGhvbGRpbmcgdGhlIHByb3BlciBsb2NrLiAgV2UgY2FuJ3QgaG9sZAotCQkJICogdGhlIGlub2RlIGxvY2sgaGVyZSBzaW5jZSBmbHVzaGluZyBvdXQgYnVmZmVycyBtYXkKLQkJCSAqIGNhdXNlIHVzIHRvIHRyeSB0byBnZXQgdGhlIGxvY2sgaW4geGZzX3N0cmF0ZWd5KCkuCi0JCQkgKgotCQkJICogV2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHJlbWFwZigpIGhlcmUsIGJlY2F1c2UgdGhlcmUKLQkJCSAqIGNhbm5vdCBiZSBhbnkgbWFwcGVkIGZpbGUgcmVmZXJlbmNlcyB0byB0aGlzIHZub2RlCi0JCQkgKiBzaW5jZSBpdCBpcyBiZWluZyByZWNsYWltZWQuCi0JCQkgKi8KLQkJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwl2bl9pb3dhaXQodnApOwogCi0JCQkvKgotCQkJICogSWYgd2UgaGl0IGFuIElPIGVycm9yLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotCQkJICogYnVmZmVyIGFuZCBwYWdlIGNhY2hlcyBvZiBmaWxlIGRhdGEgZm9yCi0JCQkgKiB0aGUgZmlsZSBhcmUgdG9zc2VkIGF3YXkuIFdlIGRvbid0IHdhbnQgdG8gdXNlCi0JCQkgKiBWT1BfRkxVU0hJTlZBTF9QQUdFUyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBkaXJ0eQotCQkJICogcGFnZXMgdG8gc3RheSBhdHRhY2hlZCB0byB0aGUgdm5vZGUsIGJ1dCBiZQotCQkJICogbWFya2VkIFBfQkFELiBwZGZsdXNoL3Zub2RlX3BhZ2ViYWQKLQkJCSAqIGhhdGVzIHRoYXQuCi0JCQkgKi8KLQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpIHsKLQkJCQlWT1BfRkxVU0hJTlZBTF9QQUdFUyh2cCwgMCwgLTEsIEZJX05PTkUpOwotCQkJfSBlbHNlIHsKLQkJCQlWT1BfVE9TU19QQUdFUyh2cCwgMCwgLTEsIEZJX05PTkUpOwotCQkJfQotCi0JCQlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKLQkJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSB8fAotCQkJICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKLQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCQl9IGVsc2UgaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSB7Ci0JCQkvKgotCQkJICogZGlfc2l6ZSBmaWVsZCBtYXkgbm90IGJlIHF1aXRlIGFjY3VyYXRlIGlmIHdlJ3JlCi0JCQkgKiBzaHV0dGluZyBkb3duLgotCQkJICovCi0JCQlWT1BfVE9TU19QQUdFUyh2cCwgMCwgLTEsIEZJX05PTkUpOwotCQkJQVNTRVJUKFZOX0NBQ0hFRCh2cCkgPT0gMCk7Ci0JCX0KLQl9CisJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKKwlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKIAogCS8qIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKIAkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBicmVhayB0aGUgbGluayBiZXR3ZWVuIHRoZSB4ZnMgaW5vZGUKQEAgLTQ1NjcsNyArNDUyNSw3IEBACiAJLyoKIAkgKiBtdXN0IGJlIGEgcmVndWxhciBmaWxlIGFuZCBoYXZlIHdyaXRlIHBlcm1pc3Npb24KIAkgKi8KLQlpZiAodnAtPnZfdHlwZSAhPSBWUkVHKQorCWlmICghVk5fSVNSRUcodnApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmggYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAppbmRleCAyZjZhYjE4Li40MjdjZmYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaApAQCAtNDQsNyArNDQsNiBAQAogI2lmbmRlZiBfQUNDT05GSUdfSAogI2RlZmluZSBfQUNDT05GSUdfSAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMKQEAgLTY0LDcgKzYzLDcgQEAKIAogLyogVmVyc2lvbiBzdHJpbmcgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNTA0MDgKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMDUwOTAyCiAKIC8qCiAgKiBPUyBuYW1lLCB1c2VkIGZvciB0aGUgX09TIG9iamVjdC4gIFRoZSBfT1Mgb2JqZWN0IGlzIGVzc2VudGlhbGx5IG9ic29sZXRlLApAQCAtNzgsMTEgKzc3LDEwIEBACiAKIC8qIE1heGltdW0gb2JqZWN0cyBpbiB0aGUgdmFyaW91cyBvYmplY3QgY2FjaGVzICovCiAKLSNkZWZpbmUgQUNQSV9NQVhfU1RBVEVfQ0FDSEVfREVQVEggICAgICA2NCAgICAgICAgICAvKiBTdGF0ZSBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRIICAgICAgOTYgICAgICAgICAgLyogUGFyc2UgdHJlZSBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX0VYVFBBUlNFX0NBQ0hFX0RFUFRIICAgNjQgICAgICAgICAgLyogUGFyc2UgdHJlZSBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSCAgICAgNjQgICAgICAgICAgLyogSW50ZXJwcmV0ZXIgb3BlcmFuZCBvYmplY3RzICovCi0jZGVmaW5lIEFDUElfTUFYX1dBTEtfQ0FDSEVfREVQVEggICAgICAgNCAgICAgICAgICAgLyogT2JqZWN0cyBmb3IgcGFyc2UgdHJlZSB3YWxrcyAqLworI2RlZmluZSBBQ1BJX01BWF9TVEFURV9DQUNIRV9ERVBUSCAgICAgIDk2CS8qIFN0YXRlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNQSV9NQVhfUEFSU0VfQ0FDSEVfREVQVEggICAgICA5NgkvKiBQYXJzZSB0cmVlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEggICA5NgkvKiBQYXJzZSB0cmVlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNQSV9NQVhfT0JKRUNUX0NBQ0hFX0RFUFRIICAgICA5NgkvKiBJbnRlcnByZXRlciBvcGVyYW5kIG9iamVjdHMgKi8KIAogLyoKICAqIFNob3VsZCB0aGUgc3VieXN0ZW0gYWJvcnQgdGhlIGxvYWRpbmcgb2YgYW4gQUNQSSB0YWJsZSBpZiB0aGUKQEAgLTkwLDcgKzg4LDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX0NIRUNLU1VNX0FCT1JUICAgICAgICAgICAgIEZBTFNFCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFN1YnN5c3RlbSBDb25zdGFudHMKQEAgLTEwNCw3ICsxMDEsNyBAQAogLyogU3RyaW5nIHNpemUgY29uc3RhbnRzICovCiAKICNkZWZpbmUgQUNQSV9NQVhfU1RSSU5HX0xFTkdUSCAgICAgICAgICA1MTIKLSNkZWZpbmUgQUNQSV9QQVRITkFNRV9NQVggICAgICAgICAgICAgICAyNTYgICAgICAgICAvKiBBIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lICovCisjZGVmaW5lIEFDUElfUEFUSE5BTUVfTUFYICAgICAgICAgICAgICAgMjU2CS8qIEEgZnVsbCBuYW1lc3BhY2UgcGF0aG5hbWUgKi8KIAogLyogTWF4aW11bSBjb3VudCBmb3IgYSBzZW1hcGhvcmUgb2JqZWN0ICovCiAKQEAgLTExOCw3ICsxMTUsNiBAQAogCiAjZGVmaW5lIEFDUElfU1lTTUVNX1JFR0lPTl9XSU5ET1dfU0laRSAgNDA5NgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBBQ1BJIFNwZWNpZmljYXRpb24gY29uc3RhbnRzIChEbyBub3QgY2hhbmdlIHVubGVzcyB0aGUgc3BlY2lmaWNhdGlvbiBjaGFuZ2VzKQpAQCAtMTU2LDE1ICsxNTIsMTUgQEAKIC8qIE5hbWVzIHdpdGhpbiB0aGUgbmFtZXNwYWNlIGFyZSA0IGJ5dGVzIGxvbmcgKi8KIAogI2RlZmluZSBBQ1BJX05BTUVfU0laRSAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIICAgICAgICA1ICAgICAgICAgICAvKiA0IGNoYXJzIGZvciBuYW1lICsgMSBjaGFyIGZvciBzZXBhcmF0b3IgKi8KKyNkZWZpbmUgQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIICAgICAgICA1CS8qIDQgY2hhcnMgZm9yIG5hbWUgKyAxIGNoYXIgZm9yIHNlcGFyYXRvciAqLwogI2RlZmluZSBBQ1BJX1BBVEhfU0VQQVJBVE9SICAgICAgICAgICAgICcuJwogCiAvKiBDb25zdGFudHMgdXNlZCBpbiBzZWFyY2hpbmcgZm9yIHRoZSBSU0RQIGluIGxvdyBtZW1vcnkgKi8KIAotI2RlZmluZSBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OICAgICAgICAgIDB4MDAwMDA0MEUgICAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiAgICAgICAgICAweDAwMDAwNDBFCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KICNkZWZpbmUgQUNQSV9FQkRBX1BUUl9MRU5HVEggICAgICAgICAgICAyCiAjZGVmaW5lIEFDUElfRUJEQV9XSU5ET1dfU0laRSAgICAgICAgICAgMTAyNAotI2RlZmluZSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgICAgICAgIDB4MDAwRTAwMDAgICAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICAgICAgICAweDAwMEUwMDAwCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KICNkZWZpbmUgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFICAgICAgICAweDAwMDIwMDAwCiAjZGVmaW5lIEFDUElfUlNEUF9TQ0FOX1NURVAgICAgICAgICAgICAgMTYKIApAQCAtMTk5LDE4ICsxOTUsMTUgQEAKIAogI2RlZmluZSBBQ1BJX05VTV9PU0lfU1RSSU5HUyAgICAgICAgICAgIDEwCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEFDUEkgQU1MIERlYnVnZ2VyCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFDUElfREVCVUdHRVJfTUFYX0FSR1MgICAgICAgICAgOCAgLyogTXVzdCBiZSBtYXggbWV0aG9kIGFyZ3MgKyAxICovCisjZGVmaW5lIEFDUElfREVCVUdHRVJfTUFYX0FSR1MgICAgICAgICAgOAkvKiBNdXN0IGJlIG1heCBtZXRob2QgYXJncyArIDEgKi8KIAogI2RlZmluZSBBQ1BJX0RFQlVHR0VSX0NPTU1BTkRfUFJPTVBUICAgICctJwogI2RlZmluZSBBQ1BJX0RFQlVHR0VSX0VYRUNVVEVfUFJPTVBUICAgICclJwogCi0KLSNlbmRpZiAvKiBfQUNDT05GSUdfSCAqLwotCisjZW5kaWYJCQkJLyogX0FDQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmggYi9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCmluZGV4IDhiYTM3MmIuLjcwY2UzYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZGVidWcuaApAQCAtNDQsMjIgKzQ0LDE3IEBACiAjaWZuZGVmIF9fQUNERUJVR19IX18KICNkZWZpbmUgX19BQ0RFQlVHX0hfXwogCi0KICNkZWZpbmUgQUNQSV9ERUJVR19CVUZGRVJfU0laRSAgNDE5NgogCi1zdHJ1Y3QgY29tbWFuZF9pbmZvCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsgICAgICAgICAgLyogQ29tbWFuZCBOYW1lICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYXJnczsgICAgICAgLyogTWluaW11bSBhcmd1bWVudHMgcmVxdWlyZWQgKi8KK3N0cnVjdCBjb21tYW5kX2luZm8geworCWNoYXIgKm5hbWU7CQkvKiBDb21tYW5kIE5hbWUgKi8KKwl1OCBtaW5fYXJnczsJCS8qIE1pbmltdW0gYXJndW1lbnRzIHJlcXVpcmVkICovCiB9OwogCi0KLXN0cnVjdCBhcmd1bWVudF9pbmZvCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsgICAgICAgICAgLyogQXJndW1lbnQgTmFtZSAqLworc3RydWN0IGFyZ3VtZW50X2luZm8geworCWNoYXIgKm5hbWU7CQkvKiBBcmd1bWVudCBOYW1lICovCiB9OwogCi0KICNkZWZpbmUgUEFSQU1fTElTVChwbCkgICAgICAgICAgICAgICAgICBwbAogI2RlZmluZSBEQlRFU1RfT1VUUFVUX0xFVkVMKGx2bCkgICAgICAgIGlmIChhY3BpX2dibF9kYl9vcHRfdmVyYm9zZSkKICNkZWZpbmUgVkVSQk9TRV9QUklOVChmcCkgICAgICAgICAgICAgICBEQlRFU1RfT1VUUFVUX0xFVkVMKGx2bCkge1wKQEAgLTY4LDI3NSArNjMsMTU1IEBACiAjZGVmaW5lIEVYX05PX1NJTkdMRV9TVEVQICAgICAgICAgICAgICAgMQogI2RlZmluZSBFWF9TSU5HTEVfU1RFUCAgICAgICAgICAgICAgICAgIDIKIAotCiAvKgogICogZGJ4ZmFjZSAtIGV4dGVybmFsIGRlYnVnZ2VyIGludGVyZmFjZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZGJfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX2RiX2luaXRpYWxpemUodm9pZCk7CiAKLXZvaWQKLWFjcGlfZGJfdGVybWluYXRlICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl90ZXJtaW5hdGUodm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RiX3NpbmdsZV9zdGVwICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfdHlwZSk7Ci0KK2FjcGlfZGJfc2luZ2xlX3N0ZXAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdTMyIG9wX3R5cGUpOwogCiAvKgogICogZGJjbWRzIC0gZGVidWcgY29tbWFuZHMgYW5kIG91dHB1dCByb3V0aW5lcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9kaXNhc3NlbWJsZV9tZXRob2QgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOworYWNwaV9zdGF0dXMgYWNwaV9kYl9kaXNhc3NlbWJsZV9tZXRob2QoY2hhciAqbmFtZSk7CisKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X3RhYmxlX2luZm8oY2hhciAqdGFibGVfYXJnKTsKKwordm9pZCBhY3BpX2RiX3VubG9hZF9hY3BpX3RhYmxlKGNoYXIgKnRhYmxlX2FyZywgY2hhciAqaW5zdGFuY2VfYXJnKTsKIAogdm9pZAotYWNwaV9kYl9kaXNwbGF5X3RhYmxlX2luZm8gKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhYmxlX2FyZyk7CithY3BpX2RiX3NldF9tZXRob2RfYnJlYWtwb2ludChjaGFyICpsb2NhdGlvbiwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RiX3VubG9hZF9hY3BpX3RhYmxlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YWJsZV9hcmcsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5zdGFuY2VfYXJnKTsKK3ZvaWQgYWNwaV9kYl9zZXRfbWV0aG9kX2NhbGxfYnJlYWtwb2ludCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RiX3NldF9tZXRob2RfYnJlYWtwb2ludCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jYXRpb24sCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfZGJfZ2V0X2J1c19pbmZvKHZvaWQpOwogCi12b2lkCi1hY3BpX2RiX3NldF9tZXRob2RfY2FsbF9icmVha3BvaW50ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfZGJfZGlzYXNzZW1ibGVfYW1sKGNoYXIgKnN0YXRlbWVudHMsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZGJfZGlzYXNzZW1ibGVfYW1sICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0ZW1lbnRzLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9kYl9kdW1wX25hbWVzcGFjZShjaGFyICpzdGFydF9hcmcsIGNoYXIgKmRlcHRoX2FyZyk7CiAKLXZvaWQKLWFjcGlfZGJfZHVtcF9uYW1lc3BhY2UgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0X2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXB0aF9hcmcpOwordm9pZCBhY3BpX2RiX2R1bXBfbmFtZXNwYWNlX2J5X293bmVyKGNoYXIgKm93bmVyX2FyZywgY2hhciAqZGVwdGhfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9kdW1wX25hbWVzcGFjZV9ieV9vd25lciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXJfYXJnLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlcHRoX2FyZyk7Cit2b2lkIGFjcGlfZGJfc2VuZF9ub3RpZnkoY2hhciAqbmFtZSwgdTMyIHZhbHVlKTsKIAotdm9pZAotYWNwaV9kYl9zZW5kX25vdGlmeSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQotdm9pZAotYWNwaV9kYl9zZXRfbWV0aG9kX2RhdGEgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR5cGVfYXJnLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZGV4X2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZV9hcmcpOwordm9pZCBhY3BpX2RiX3NldF9tZXRob2RfZGF0YShjaGFyICp0eXBlX2FyZywgY2hhciAqaW5kZXhfYXJnLCBjaGFyICp2YWx1ZV9hcmcpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kYl9kaXNwbGF5X29iamVjdHMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9ial90eXBlX2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkaXNwbGF5X2NvdW50X2FyZyk7CithY3BpX2RiX2Rpc3BsYXlfb2JqZWN0cyhjaGFyICpvYmpfdHlwZV9hcmcsIGNoYXIgKmRpc3BsYXlfY291bnRfYXJnKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfZmluZF9uYW1lX2luX25hbWVzcGFjZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9hcmcpOworYWNwaV9zdGF0dXMgYWNwaV9kYl9maW5kX25hbWVfaW5fbmFtZXNwYWNlKGNoYXIgKm5hbWVfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9zZXRfc2NvcGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwordm9pZCBhY3BpX2RiX3NldF9zY29wZShjaGFyICpuYW1lKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfc2xlZXAgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOworYWNwaV9zdGF0dXMgYWNwaV9kYl9zbGVlcChjaGFyICpvYmplY3RfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9maW5kX3JlZmVyZW5jZXMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOwordm9pZCBhY3BpX2RiX2ZpbmRfcmVmZXJlbmNlcyhjaGFyICpvYmplY3RfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2xvY2tzICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X2xvY2tzKHZvaWQpOwogCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfcmVzb3VyY2VzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfYXJnKTsKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X3Jlc291cmNlcyhjaGFyICpvYmplY3RfYXJnKTsKIAotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2dwZXMgKAotCXZvaWQpOwordm9pZCBhY3BpX2RiX2Rpc3BsYXlfZ3Blcyh2b2lkKTsKIAotdm9pZAotYWNwaV9kYl9jaGVja19pbnRlZ3JpdHkgKAotCXZvaWQpOwordm9pZCBhY3BpX2RiX2NoZWNrX2ludGVncml0eSh2b2lkKTsKIAotdm9pZAotYWNwaV9kYl9nZW5lcmF0ZV9ncGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmdwZV9hcmcsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYmxvY2tfYXJnKTsKLQordm9pZCBhY3BpX2RiX2dlbmVyYXRlX2dwZShjaGFyICpncGVfYXJnLCBjaGFyICpibG9ja19hcmcpOwogCiAvKgogICogZGJkaXNwbHkgLSBkZWJ1ZyBkaXNwbGF5IGNvbW1hbmRzCiAgKi8KLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9tZXRob2RfaW5mbyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX2RiX2Rpc3BsYXlfbWV0aG9kX2luZm8odW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKKwordm9pZCBhY3BpX2RiX2RlY29kZV9hbmRfZGlzcGxheV9vYmplY3QoY2hhciAqdGFyZ2V0LCBjaGFyICpvdXRwdXRfdHlwZSk7CiAKIHZvaWQKLWFjcGlfZGJfZGVjb2RlX2FuZF9kaXNwbGF5X29iamVjdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dF90eXBlKTsKK2FjcGlfZGJfZGlzcGxheV9yZXN1bHRfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZGJfZGlzcGxheV9hbGxfbWV0aG9kcyhjaGFyICpkaXNwbGF5X2NvdW50X2FyZyk7CisKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50cyh2b2lkKTsKKwordm9pZCBhY3BpX2RiX2Rpc3BsYXlfbG9jYWxzKHZvaWQpOworCit2b2lkIGFjcGlfZGJfZGlzcGxheV9yZXN1bHRzKHZvaWQpOworCit2b2lkIGFjcGlfZGJfZGlzcGxheV9jYWxsaW5nX3RyZWUodm9pZCk7CisKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X29iamVjdF90eXBlKGNoYXIgKm9iamVjdF9hcmcpOwogCiB2b2lkCi1hY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2Rpc3BsYXlfYWxsX21ldGhvZHMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRpc3BsYXlfY291bnRfYXJnKTsKLQotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50cyAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9sb2NhbHMgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfcmVzdWx0cyAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9jYWxsaW5nX3RyZWUgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfb2JqZWN0X3R5cGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOwotCi12b2lkCi1hY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRiZXhlYyAtIGRlYnVnZ2VyIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbgogICovCi12b2lkCi1hY3BpX2RiX2V4ZWN1dGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmFyZ3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Cit2b2lkIGFjcGlfZGJfZXhlY3V0ZShjaGFyICpuYW1lLCBjaGFyICoqYXJncywgdTMyIGZsYWdzKTsKIAogdm9pZAotYWNwaV9kYl9jcmVhdGVfZXhlY3V0aW9uX3RocmVhZHMgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm51bV90aHJlYWRzX2FyZywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpudW1fbG9vcHNfYXJnLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1ldGhvZF9uYW1lX2FyZyk7Ci0KK2FjcGlfZGJfY3JlYXRlX2V4ZWN1dGlvbl90aHJlYWRzKGNoYXIgKm51bV90aHJlYWRzX2FyZywKKwkJCQkgY2hhciAqbnVtX2xvb3BzX2FyZywgY2hhciAqbWV0aG9kX25hbWVfYXJnKTsKIAogLyoKICAqIGRiZmlsZWlvIC0gRGVidWdnZXIgZmlsZSBJL08gY29tbWFuZHMKICAqLwogYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kYl9tYXRjaF9hcmd1bWVudCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9hcmd1bWVudCwKLQlzdHJ1Y3QgYXJndW1lbnRfaW5mbyAgICAgICAgICAgICphcmd1bWVudHMpOworYWNwaV9kYl9tYXRjaF9hcmd1bWVudChjaGFyICp1c2VyX2FyZ3VtZW50LCBzdHJ1Y3QgYXJndW1lbnRfaW5mbyAqYXJndW1lbnRzKTsKIAotdm9pZAotYWNwaV9kYl9jbG9zZV9kZWJ1Z19maWxlICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl9jbG9zZV9kZWJ1Z19maWxlKHZvaWQpOwogCi12b2lkCi1hY3BpX2RiX29wZW5fZGVidWdfZmlsZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7Cit2b2lkIGFjcGlfZGJfb3Blbl9kZWJ1Z19maWxlKGNoYXIgKm5hbWUpOworCithY3BpX3N0YXR1cyBhY3BpX2RiX2xvYWRfYWNwaV90YWJsZShjaGFyICpmaWxlbmFtZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RiX2xvYWRfYWNwaV90YWJsZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWUpOworYWNwaV9kYl9nZXRfdGFibGVfZnJvbV9maWxlKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RiX2dldF90YWJsZV9mcm9tX2ZpbGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpbGVuYW1lLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3JlYWRfdGFibGVfZnJvbV9maWxlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGUpOwotCithY3BpX2RiX3JlYWRfdGFibGVfZnJvbV9maWxlKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZSk7CiAKIC8qCiAgKiBkYmhpc3RyeSAtIGRlYnVnZ2VyIEhJU1RPUlkgY29tbWFuZAogICovCi12b2lkCi1hY3BpX2RiX2FkZF90b19oaXN0b3J5ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb21tYW5kX2xpbmUpOwordm9pZCBhY3BpX2RiX2FkZF90b19oaXN0b3J5KGNoYXIgKmNvbW1hbmRfbGluZSk7CiAKLXZvaWQKLWFjcGlfZGJfZGlzcGxheV9oaXN0b3J5ICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV9kYl9kaXNwbGF5X2hpc3Rvcnkodm9pZCk7CiAKLWNoYXIgKgotYWNwaV9kYl9nZXRfZnJvbV9oaXN0b3J5ICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb21tYW5kX251bV9hcmcpOwotCitjaGFyICphY3BpX2RiX2dldF9mcm9tX2hpc3RvcnkoY2hhciAqY29tbWFuZF9udW1fYXJnKTsKIAogLyoKICAqIGRiaW5wdXQgLSB1c2VyIGZyb250LWVuZCB0byB0aGUgQU1MIGRlYnVnZ2VyCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RiX2NvbW1hbmRfZGlzcGF0Y2ggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlucHV0X2J1ZmZlciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK2FjcGlfZGJfY29tbWFuZF9kaXNwYXRjaChjaGFyICppbnB1dF9idWZmZXIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2RiX2V4ZWN1dGVfdGhyZWFkICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQordm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2RiX2V4ZWN1dGVfdGhyZWFkKHZvaWQgKmNvbnRleHQpOwogCiAvKgogICogZGJzdGF0cyAtIEdlbmVyYXRpb24gYW5kIGRpc3BsYXkgb2YgQUNQSSB0YWJsZSBzdGF0aXN0aWNzCiAgKi8KLXZvaWQKLWFjcGlfZGJfZ2VuZXJhdGVfc3RhdGlzdGljcyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21ldGhvZCk7Cit2b2lkIGFjcGlfZGJfZ2VuZXJhdGVfc3RhdGlzdGljcyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcm9vdCwgdTggaXNfbWV0aG9kKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfZGlzcGxheV9zdGF0aXN0aWNzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0eXBlX2FyZyk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZGJfZGlzcGxheV9zdGF0aXN0aWNzKGNoYXIgKnR5cGVfYXJnKTsKIAogLyoKICAqIGRidXRpbHMgLSBBTUwgZGVidWdnZXIgdXRpbGl0aWVzCiAgKi8KLXZvaWQKLWFjcGlfZGJfc2V0X291dHB1dF9kZXN0aW5hdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Cit2b2lkIGFjcGlfZGJfc2V0X291dHB1dF9kZXN0aW5hdGlvbih1MzIgd2hlcmUpOwogCi12b2lkCi1hY3BpX2RiX2R1bXBfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK3ZvaWQgYWNwaV9kYl9kdW1wX2V4dGVybmFsX29iamVjdCh1bmlvbiBhY3BpX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBsZXZlbCk7CiAKLXZvaWQKLWFjcGlfZGJfcHJlcF9uYW1lc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKK3ZvaWQgYWNwaV9kYl9wcmVwX25hbWVzdHJpbmcoY2hhciAqbmFtZSk7CiAKLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfZGJfbG9jYWxfbnNfbG9va3VwICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2RiX2xvY2FsX25zX2xvb2t1cChjaGFyICpuYW1lKTsKIAotI2VuZGlmICAvKiBfX0FDREVCVUdfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzYXNtLmggYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAppbmRleCBkYmZhODc3Li4zZDk2ZGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaApAQCAtNDYsMzI3ICs0NiwyMTkgQEAKIAogI2luY2x1ZGUgImFtbHJlc3JjLmgiCiAKLQogI2RlZmluZSBCTE9DS19OT05FICAgICAgICAgICAgICAwCiAjZGVmaW5lIEJMT0NLX1BBUkVOICAgICAgICAgICAgIDEKICNkZWZpbmUgQkxPQ0tfQlJBQ0UgICAgICAgICAgICAgMgogI2RlZmluZSBCTE9DS19DT01NQV9MSVNUICAgICAgICA0CiAKLXN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aDsKLQlzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICAgICAgICAgICAqbmV4dDsKK3N0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgeworCWNoYXIgKnBhdGg7CisJc3RydWN0IGFjcGlfZXh0ZXJuYWxfbGlzdCAqbmV4dDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICAgICAgICAqYWNwaV9nYmxfZXh0ZXJuYWxfbGlzdDsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF93b3JkX2RlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX21pbl9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX21heF9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX0RFQ2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfUk5HZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9NRU1kZWNvZGVbNF07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX1JXZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9pcnFfZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9IRWRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfTExkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX1NIUmRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfVFlQZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9CTWRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfU0laZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9UVFBkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX01UUGRlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfVFJTZGVjb2RlWzJdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgKmFjcGlfZ2JsX2V4dGVybmFsX2xpc3Q7CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3dvcmRfZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2NvbnN1bWVfZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9ERUNkZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfUk5HZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX01FTWRlY29kZVs0XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9SV2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pcnFfZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0hFZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0xMZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1NIUmRlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9UWVBkZWNvZGVbNF07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfQk1kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfU0laZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RUUGRlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9NVFBkZWNvZGVbNF07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfVFJTZGVjb2RlWzJdOwogCitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbG9ja19ydWxlW0FDUElfTlVNX0xPQ0tfUlVMRVNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2FjY2Vzc190eXBlc1tBQ1BJX05VTV9BQ0NFU1NfVFlQRVNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3VwZGF0ZV9ydWxlc1tBQ1BJX05VTV9VUERBVEVfUlVMRVNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21hdGNoX29wc1tBQ1BJX05VTV9NQVRDSF9PUFNdOwogCi1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX2xvY2tfcnVsZVtBQ1BJX05VTV9MT0NLX1JVTEVTXTsKLWV4dGVybiBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfYWNjZXNzX3R5cGVzW0FDUElfTlVNX0FDQ0VTU19UWVBFU107Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmFjcGlfZ2JsX3VwZGF0ZV9ydWxlc1tBQ1BJX05VTV9VUERBVEVfUlVMRVNdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9tYXRjaF9vcHNbQUNQSV9OVU1fTUFUQ0hfT1BTXTsKLQotCi1zdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8KLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X29mZnNldDsKK3N0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyB7CisJdTMyIGxldmVsOworCXUzMiBiaXRfb2Zmc2V0OworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiB9OwogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFzbF93YWxrX2NhbGxiYWNrKSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQorYWNwaV9zdGF0dXMoKmFzbF93YWxrX2NhbGxiYWNrKSAodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCwKKwkJCQkgdTMyIGxldmVsLCB2b2lkICpjb250ZXh0KTsKIAogLyoKICAqIGRtd2FsawogICovCiB2b2lkCi1hY3BpX2RtX2Rpc2Fzc2VtYmxlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vcGNvZGVzKTsKLQorYWNwaV9kbV9kaXNhc3NlbWJsZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9yaWdpbiwgdTMyIG51bV9vcGNvZGVzKTsKIAogLyoKICAqIGRtb3Bjb2RlCiAgKi8KIHZvaWQKLWFjcGlfZG1fZGlzYXNzZW1ibGVfb25lX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAgICAgICAgKmluZm8sCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworYWNwaV9kbV9kaXNhc3NlbWJsZV9vbmVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgIHN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fZGVjb2RlX2ludGVybmFsX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwordm9pZCBhY3BpX2RtX2RlY29kZV9pbnRlcm5hbF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCi11MzIKLWFjcGlfZG1fbGlzdF90eXBlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit1MzIgYWNwaV9kbV9saXN0X3R5cGUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9tZXRob2RfZmxhZ3MgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9kbV9tZXRob2RfZmxhZ3ModW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9maWVsZF9mbGFncyAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX2RtX2ZpZWxkX2ZsYWdzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fYWRkcmVzc19zcGFjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9pZCk7Cit2b2lkIGFjcGlfZG1fYWRkcmVzc19zcGFjZSh1OCBzcGFjZV9pZCk7CiAKLXZvaWQKLWFjcGlfZG1fcmVnaW9uX2ZsYWdzICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Cit2b2lkIGFjcGlfZG1fcmVnaW9uX2ZsYWdzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfZG1fbWF0Y2hfb3AgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9kbV9tYXRjaF9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi11OAotYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordTggYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RtX2NvbW1hX2lmX2ZpZWxkX21lbWJlciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCit2b2lkIGFjcGlfZG1fY29tbWFfaWZfZmllbGRfbWVtYmVyKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIC8qCiAgKiBkbW5hbWVzCiAgKi8KLXUzMgotYWNwaV9kbV9kdW1wX25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwordTMyIGFjcGlfZG1fZHVtcF9uYW1lKGNoYXIgKm5hbWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19kaXNwbGF5X29iamVjdF9wYXRobmFtZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX3BzX2Rpc3BsYXlfb2JqZWN0X3BhdGhuYW1lKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9uYW1lc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKLQordm9pZCBhY3BpX2RtX25hbWVzdHJpbmcoY2hhciAqbmFtZSk7CiAKIC8qCiAgKiBkbW9iamVjdAogICovCiB2b2lkCi1hY3BpX2RtX2Rpc3BsYXlfaW50ZXJuYWxfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZG1fZGlzcGxheV9pbnRlcm5hbF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK3ZvaWQgYWNwaV9kbV9kaXNwbGF5X2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKwordm9pZCBhY3BpX2RtX2Rpc3BsYXlfbG9jYWxzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiB2b2lkCi1hY3BpX2RtX2Rpc3BsYXlfYXJndW1lbnRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotdm9pZAotYWNwaV9kbV9kaXNwbGF5X2xvY2FscyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLXZvaWQKLWFjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyAoCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KK2FjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyhhY3BpX3N0YXR1cyBzdGF0dXMsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiAvKgogICogZG1idWZmZXIKICAqLwotdm9pZAotYWNwaV9kbV9kaXNhc21fYnl0ZV9saXN0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfZGF0YSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfY291bnQpOwordm9pZCBhY3BpX2RtX2Rpc2FzbV9ieXRlX2xpc3QodTMyIGxldmVsLCB1OCAqIGJ5dGVfZGF0YSwgdTMyIGJ5dGVfY291bnQpOwogCiB2b2lkCi1hY3BpX2RtX2J5dGVfbGlzdCAoCi0Jc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICAgICAgICAqaW5mbywKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX2RtX2J5dGVfbGlzdChzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gKmluZm8sIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQKLWFjcGlfaXNfZWlzYV9pZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX2RtX2lzX2Vpc2FfaWQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9laXNhX2lkICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfaWQpOwordm9pZCBhY3BpX2RtX2Vpc2FfaWQodTMyIGVuY29kZWRfaWQpOwogCi11OAotYWNwaV9kbV9pc191bmljb2RlX2J1ZmZlciAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordTggYWNwaV9kbV9pc191bmljb2RlX2J1ZmZlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi11OAotYWNwaV9kbV9pc19zdHJpbmdfYnVmZmVyICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KK3U4IGFjcGlfZG1faXNfc3RyaW5nX2J1ZmZlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiAvKgogICogZG1yZXNyYwogICovCiB2b2lkCi1hY3BpX2RtX3Jlc291cmNlX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAgICAgICAgKmluZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9kYXRhLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9jb3VudCk7CithY3BpX2RtX3Jlc291cmNlX2Rlc2NyaXB0b3Ioc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICppbmZvLAorCQkJICAgIHU4ICogYnl0ZV9kYXRhLCB1MzIgYnl0ZV9jb3VudCk7CiAKLXU4Ci1hY3BpX2RtX2lzX3Jlc291cmNlX2Rlc2NyaXB0b3IgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3U4IGFjcGlfZG1faXNfcmVzb3VyY2VfZGVzY3JpcHRvcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX2RtX2luZGVudCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Cit2b2lkIGFjcGlfZG1faW5kZW50KHUzMiBsZXZlbCk7CiAKLXZvaWQKLWFjcGlfZG1fYml0X2xpc3QgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayk7Cit2b2lkIGFjcGlfZG1fYml0X2xpc3QodTE2IG1hc2spOwogCi12b2lkCi1hY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKTsKLQordm9pZCBhY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUodTggYXR0cmlidXRlKTsKIAogLyoKICAqIGRtcmVzcmNsCiAgKi8KIHZvaWQKLWFjcGlfZG1fd29yZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX3dvcmRfYWRkcmVzc19kZXNjICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fd29yZF9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2MgKnJlc291cmNlLAorCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9kd29yZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2R3b3JkX2FkZHJlc3NfZGVzYyAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZHdvcmRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2R3b3JkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCisJCQkgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9leHRlbmRlZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZXh0ZW5kZWRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCisJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9xd29yZF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fcXdvcmRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCisJCQkgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9tZW1vcnkyNF9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjICAgICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fbWVtb3J5MjRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjICpyZXNvdXJjZSwKKwkJCSAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX21lbW9yeTMyX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgICAgICAgKnJlc291cmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworYWNwaV9kbV9tZW1vcnkzMl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgKnJlc291cmNlLAorCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fZml4ZWRfbWVtMzJfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CithY3BpX2RtX2ZpeGVkX21lbTMyX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyAqcmVzb3VyY2UsCisJCQkgICAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9nZW5lcmljX3JlZ2lzdGVyX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZ2VuZXJpY19yZWdpc3Rlcl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjICpyZXNvdXJjZSwKKwkJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9pbnRlcnJ1cHRfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1faW50ZXJydXB0X2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjICpyZXNvdXJjZSwKKwkJCSAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV92ZW5kb3JfbGFyZ2VfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYyAgICAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0KK2FjcGlfZG1fdmVuZG9yX2xhcmdlX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYyAqcmVzb3VyY2UsCisJCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogLyoKICAqIGRtcmVzcmNzCiAgKi8KIHZvaWQKLWFjcGlfZG1faXJxX2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfaXJxX2Zvcm1hdF9kZXNjICAgICAgKnJlc291cmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworYWNwaV9kbV9pcnFfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyAqcmVzb3VyY2UsCisJCSAgICAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX2RtYV9kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2RtYV9mb3JtYXRfZGVzYyAgICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1fZG1hX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9kbWFfZm9ybWF0X2Rlc2MgKnJlc291cmNlLAorCQkgICAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9pb19kZXNjcmlwdG9yICgKLQlzdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYyAgICAgICAgICpyZXNvdXJjZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKK2FjcGlfZG1faW9fZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2lvX3BvcnRfZGVzYyAqcmVzb3VyY2UsIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fZml4ZWRfaW9fZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgICAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CithY3BpX2RtX2ZpeGVkX2lvX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgKnJlc291cmNlLAorCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fc3RhcnRfZGVwZW5kZW50X2Rlc2NyaXB0b3IgKAotCXN0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X2Rlc2MgKnJlc291cmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworYWNwaV9kbV9zdGFydF9kZXBlbmRlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjICpyZXNvdXJjZSwKKwkJCQkgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX2VuZF9kZXBlbmRlbnRfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfZGVzYyAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CithY3BpX2RtX2VuZF9kZXBlbmRlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjICpyZXNvdXJjZSwKKwkJCQkgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV92ZW5kb3Jfc21hbGxfZGVzY3JpcHRvciAoCi0Jc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYyAgICAqcmVzb3VyY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0KK2FjcGlfZG1fdmVuZG9yX3NtYWxsX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYyAqcmVzb3VyY2UsCisJCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogLyoKICAqIGRtdXRpbHMKICAqLwotdm9pZAotYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCk7Cit2b2lkIGFjcGlfZG1fYWRkX3RvX2V4dGVybmFsX2xpc3QoY2hhciAqcGF0aCk7CiAKLSNlbmRpZiAgLyogX19BQ0RJU0FTTV9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDRElTQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmggYi9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaAppbmRleCA4ZjVmMmY3Li4wNjVmMjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaApAQCAtNDEsNDE5ICs0MSwzMDQgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpZm5kZWYgX0FDRElTUEFUX0hfCiAjZGVmaW5lIF9BQ0RJU1BBVF9IXwogCi0KICNkZWZpbmUgTkFNRU9GX0xPQ0FMX05URSAgICAiX19MMCIKICNkZWZpbmUgTkFNRU9GX0FSR19OVEUgICAgICAiX19BMCIKIAotCiAvKgogICogZHNvcGNvZGUgLSBzdXBwb3J0IGZvciBsYXRlIGV2YWx1YXRpb24KICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK2FjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjKTsKKworYWNwaV9zdGF0dXMgYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJnbl9kZXNjKTsKK2FjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOworYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK2FjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOwotCithY3BpX3N0YXR1cyBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUpOwogCiAvKgogICogZHNjdHJsIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgY29udHJvbCBzdGFjayByb3V0aW5lcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCithY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiAvKgogICogZHNleGVjIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbWV0aG9kIGV4ZWN1dGlvbiBjYWxsYmFja3MKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXN1bHRfb2JqKTsKK2FjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9vYmopOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjX2JlZ2luX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvdXRfb3ApOworYWNwaV9kc19leGVjX2JlZ2luX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3V0X29wKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXhlY19lbmRfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKnN0YXRlKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9kc19leGVjX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICpzdGF0ZSk7CiAKIC8qCiAgKiBkc2ZpZWxkIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSBmb3IgQU1MIGZpZWxkcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfZmllbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lvbl9ub2RlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19jcmVhdGVfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX2JhbmtfZmllbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lvbl9ub2RlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19jcmVhdGVfYmFua19maWVsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcmVnaW9uX25vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcmVnaW9uX25vZGUsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX2NyZWF0ZV9idWZmZXJfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCithY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRzbG9hZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIG5hbWVzcGFjZSBsb2FkIGNhbGxiYWNrcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMV9iZWdpbl9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKTsKK2FjcGlfZHNfbG9hZDFfYmVnaW5fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3V0X29wKTsKKworYWNwaV9zdGF0dXMgYWNwaV9kc19sb2FkMV9lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2xvYWQxX2VuZF9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX2xvYWQyX2JlZ2luX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm91dF9vcCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfbG9hZDJfZW5kX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMl9iZWdpbl9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3V0X29wKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbG9hZDJfZW5kX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9jYWxsYmFja3MgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlcik7Ci0KK2FjcGlfZHNfaW5pdF9jYWxsYmFja3Moc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwgdTMyIHBhc3NfbnVtYmVyKTsKIAogLyoKICAqIGRzbXRoZGF0IC0gbWV0aG9kIGRhdGEgKGxvY2Fscy9hcmdzKQogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc3JjX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbCh1MTYgb3Bjb2RlLAorCQkJICAgICAgdTMyIGluZGV4LAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc3JjX2Rlc2MsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X2VudHJ5ICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKipub2RlKTsKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X2VudHJ5KHUxNiBvcGNvZGUsCisJCQkgICAgICB1MzIgaW5kZXgsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKipub2RlKTsKIAotdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK3ZvaWQgYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi11OAotYWNwaV9kc19pc19tZXRob2RfdmFsdWUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK3U4IGFjcGlfZHNfaXNfbWV0aG9kX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYyk7CithY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZSh1MTYgb3Bjb2RlLAorCQkJICAgICAgdTMyIGluZGV4LAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0X2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipwYXJhbXMsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGFyYW1fY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1zLAorCQkJICAgICAgdTMyIG1heF9wYXJhbV9jb3VudCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipub2RlKTsKK2FjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUodTE2IG9wY29kZSwKKwkJCSAgICAgdTMyIGluZGV4LAorCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm5vZGUpOwogCi12b2lkCi1hY3BpX2RzX21ldGhvZF9kYXRhX2luaXQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCit2b2lkIGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRzbWV0aG9kIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIGNvbnRyb2wgbWV0aG9kIHBhcnNpbmcKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZHNfcGFyc2VfbWV0aG9kICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOworYWNwaV9zdGF0dXMgYWNwaV9kc19wYXJzZV9tZXRob2Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQsCisJCQkgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjKTsKK2FjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjKTsKKwordm9pZCBhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2FsbGluZ19tZXRob2Rfbm9kZSk7Ci0KK2FjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNhbGxpbmdfbWV0aG9kX25vZGUpOwogCiAvKgogICogZHNpbml0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzdGFydF9ub2RlKTsKLQorYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKIAogLyoKICAqIGRzb2JqZWN0IC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIG9iamVjdCBpbml0aWFsaXphdGlvbiBhbmQgY29udmVyc2lvbgogICovCiBhY3BpX3N0YXR1cwotYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2NfcHRyKTsKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdTMyIGJ1ZmZlcl9sZW5ndGgsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmogKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2xlbmd0aCwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2MpOworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCQkgICB1MzIgcGFja2FnZV9sZW5ndGgsCisJCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqX2Rlc2MpOworYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgIHUxNiBvcGNvZGUsIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9ub2RlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCithY3BpX2RzX2NyZWF0ZV9ub2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIC8qCiAgKiBkc3V0aWxzIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSB1dGlsaXR5IHJvdXRpbmVzCiAgKi8KLXZvaWQKLWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK3ZvaWQgYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIHU4Ci1hY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmV0dXJuX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9yZWZlcmVuY2UpOworYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgdTggYWRkX3JlZmVyZW5jZSk7CiAKIHU4Ci1hY3BpX2RzX2lzX3Jlc3VsdF91c2VkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfaXNfcmVzdWx0X3VzZWQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIHZvaWQKLWFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqLAorCQkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9vcGVyYW5kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NfcmVtYWluaW5nKTsKK2FjcGlfZHNfY3JlYXRlX29wZXJhbmQoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcsIHUzMiBhcmdzX3JlbWFpbmluZyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpmaXJzdF9hcmcpOworYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaXJzdF9hcmcpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotdm9pZAotYWNwaV9kc19jbGVhcl9vcGVyYW5kcyAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK3ZvaWQgYWNwaV9kc19jbGVhcl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGRzd3Njb3BlIC0gU2NvcGUgU3RhY2sgbWFuaXB1bGF0aW9uCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2ggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19zY29wZV9zdGFja19wdXNoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAorYWNwaV9zdGF0dXMgYWNwaV9kc19zY29wZV9zdGFja19wb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLXZvaWQKLWFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCit2b2lkIGFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBkc3dzdGF0ZSAtIHBhcnNlciBXQUxLX1NUQVRFIG1hbmFnZW1lbnQgcm91dGluZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfb2JqX3N0YWNrX3B1c2godm9pZCAqb2JqZWN0LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX29ial9zdGFja19wb3AodTMyIHBvcF9jb3VudCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgotYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSAoCi0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZCwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbXRoX2Rlc2MsCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoYWNwaV9vd25lcl9pZCBvd25lcl9pZCwKKwkJCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QKKwkJCQkJCSAgKm9yaWdpbiwKKwkJCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAqbXRoX2Rlc2MsCisJCQkJCQkgIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQorCQkJCQkJICAqdGhyZWFkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9hbWxfd2FsayAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICptZXRob2Rfbm9kZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8sCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlcik7CithY3BpX2RzX2luaXRfYW1sX3dhbGsoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCSAgICAgIHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwKKwkJICAgICAgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8sIHU4IHBhc3NfbnVtYmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKHUzMiBwb3BfY291bnQsCisJCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCit2b2lkIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfcG9wX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCisJCQkJCSAgICAgICAqdGhyZWFkKTsKIAogdm9pZAotYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwogCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICoKLWFjcGlfZHNfcG9wX3dhbGtfc3RhdGUgKAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCk7CithY3BpX3N0YXR1cyBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLXZvaWQKLWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCk7CithY3BpX3N0YXR1cyBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZHNfcmVzdWx0X3N0YWNrX2NsZWFyKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9zdGFja19jbGVhciAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKgotYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOworc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQorCQkJCQkJICAgICAgICp0aHJlYWQpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9yZW1vdmUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZHNfcmVzdWx0X3JlbW92ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqZWN0LAorCQkgICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogI2VuZGlmCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wb3AgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3Jlc3VsdF9wb3AodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKKwkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wdXNoICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2RzX3Jlc3VsdF9wdXNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9kc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmplY3QsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLSNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLXZvaWQKLWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGVfY2FjaGUgKAotCXZvaWQpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQUNESVNQQVRfSF8gKi8KKyNlbmRpZgkJCQkvKiBfQUNESVNQQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKaW5kZXggNjFhMjdjOC4uYmZhNTQ2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKQEAgLTQ0LDI1MCArNDQsMTY3IEBACiAjaWZuZGVmIF9fQUNFVkVOVFNfSF9fCiAjZGVmaW5lIF9fQUNFVkVOVFNfSF9fCiAKLQogLyoKICAqIGV2ZXZlbnQKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyh2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnModm9pZCk7CiAKLXUzMgotYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QgKAotCXZvaWQpOwotCit1MzIgYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3Qodm9pZCk7CiAKIC8qCiAgKiBldm1pc2MKICAqLwotdTgKLWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Cit1OCBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sodTE2IHRpbWVvdXQpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sodm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpOworCit1MzIgYWNwaV9ldl9nZXRfZ3BlX251bWJlcl9pbmRleCh1MzIgZ3BlX251bWJlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2soCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jaygKLQl2b2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyICgKLQl2b2lkKTsKLQotdTMyCi1hY3BpX2V2X2dldF9ncGVfbnVtYmVyX2luZGV4ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV92YWx1ZSk7Ci0KK2FjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgIHUzMiBub3RpZnlfdmFsdWUpOwogCiAvKgogICogZXZncGUgLSBHUEUgaGFuZGxpbmcgYW5kIGRpc3BhdGNoCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCisJCQkJdTggdHlwZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2VuYWJsZV9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfdG9faGFyZHdhcmUpOworYWNwaV9ldl9lbmFibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywKKwkJICAgdTggd3JpdGVfdG9faGFyZHdhcmUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kaXNhYmxlX2dwZSAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOworYWNwaV9zdGF0dXMgYWNwaV9ldl9kaXNhYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqCi1hY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlcik7Ci0KK3N0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICphY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJCQkJICAgICAgIHUzMiBncGVfbnVtYmVyKTsKIAogLyoKICAqIGV2Z3BlYmxrCiAgKi8KLXU4Ci1hY3BpX2V2X3ZhbGlkX2dwZV9ldmVudCAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOwordTggYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKKworYWNwaV9zdGF0dXMgYWNwaV9ldl93YWxrX2dwZV9saXN0KEFDUElfR1BFX0NBTExCQUNLIGdwZV93YWxrX2NhbGxiYWNrKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfd2Fsa19ncGVfbGlzdCAoCi0JQUNQSV9HUEVfQ0FMTEJBQ0sgICAgICAgZ3BlX3dhbGtfY2FsbGJhY2ssCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX2V2X2RlbGV0ZV9ncGVfaGFuZGxlcnMoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlLAorCQkJIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCQkgdTMyIHJlZ2lzdGVyX2NvdW50LAorCQkJIHU4IGdwZV9ibG9ja19iYXNlX251bWJlciwKKwkJCSB1MzIgaW50ZXJydXB0X251bWJlciwKKwkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqKnJldHVybl9ncGVfYmxvY2spOwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpncGVfZGV2aWNlLAotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgKmdwZV9ibG9ja19hZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfYmxvY2tfYmFzZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwsCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqKnJldHVybl9ncGVfYmxvY2spOwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9zdGF0dXMgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiB1MzIKLWFjcGlfZXZfZ3BlX2Rpc3BhdGNoICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIpOworYWNwaV9ldl9ncGVfZGlzcGF0Y2goc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkgICAgIHUzMiBncGVfbnVtYmVyKTsKIAotdTMyCi1hY3BpX2V2X2dwZV9kZXRlY3QgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9saXN0KTsKK3UzMiBhY3BpX2V2X2dwZV9kZXRlY3Qoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfc2V0X2dwZV90eXBlICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworYWNwaV9ldl9zZXRfZ3BlX3R5cGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCB0eXBlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKK2FjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZ3BlX2luaXRpYWxpemUgKAotCXZvaWQpOwotCithY3BpX3N0YXR1cyBhY3BpX2V2X2dwZV9pbml0aWFsaXplKHZvaWQpOwogCiAvKgogICogZXZyZWdpb24gLSBBZGRyZXNzIFNwYWNlIGhhbmRsaW5nCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnMgKAotCXZvaWQpOworYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCisJCQkgICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgICAgIHUzMiBiaXRfd2lkdGgsIHZvaWQgKnZhbHVlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICpyZWdpb25fb2JqLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfYXR0YWNoX3JlZ2lvbiAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbnNfaXNfbG9ja2VkKTsKK2FjcGlfZXZfYXR0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpOwogCiB2b2lkCi1hY3BpX2V2X2RldGFjaF9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAqcmVnaW9uX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbnNfaXNfbG9ja2VkKTsKK2FjcGlfZXZfZGV0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkgICAgICB1OCBhY3BpX25zX2lzX2xvY2tlZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlciAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKLQlhY3BpX2Fkcl9zcGFjZV90eXBlICAgICAgICAgICAgIHNwYWNlX2lkLAotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgaGFuZGxlciwKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCAgICAgICAgICAgIHNldHVwLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXAsIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfYWRyX3NwYWNlX3R5cGUgICAgICAgICAgICAgc3BhY2VfaWQpOworYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAqcmVnaW9uX29iaiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKTsKLQorYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwgdTMyIGZ1bmN0aW9uKTsKIAogLyoKICAqIGV2cmVnaW5pIC0gUmVnaW9uIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cAogICovCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCSAgIHUzMiBmdW5jdGlvbiwKKwkJCQkgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsCisJCQkJICAgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpOworYWNwaV9ldl9pb19zcGFjZV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCXUzMiBmdW5jdGlvbiwKKwkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVnaW9uX2NvbnRleHQpOworYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgIHUzMiBmdW5jdGlvbiwKKwkJCSAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dCk7CithY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZWdpb25fb2JqLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uc19sb2NrZWQpOwotCithY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCisJCQkgIHU4IGFjcGlfbnNfbG9ja2VkKTsKIAogLyoKICAqIGV2c2NpIC0gU0NJIChTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQpIGhhbmRsaW5nL2Rpc3BhdGNoCiAgKi8KLXUzMiBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlciAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Cit1MzIgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcih2b2lkICpjb250ZXh0KTsKIAotdTMyCi1hY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIgKAotCXZvaWQpOwordTMyIGFjcGlfZXZfaW5zdGFsbF9zY2lfaGFuZGxlcih2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyKHZvaWQpOwogCi11MzIKLWFjcGlfZXZfaW5pdGlhbGl6ZV9zQ0kgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9zQ0kpOwordTMyIGFjcGlfZXZfaW5pdGlhbGl6ZV9zQ0kodTMyIHByb2dyYW1fc0NJKTsKIAotdm9pZAotYWNwaV9ldl90ZXJtaW5hdGUgKAotCXZvaWQpOwordm9pZCBhY3BpX2V2X3Rlcm1pbmF0ZSh2b2lkKTsKIAotCi0jZW5kaWYgIC8qIF9fQUNFVkVOVFNfSF9fICAqLworI2VuZGlmCQkJCS8qIF9fQUNFVkVOVFNfSF9fICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaCBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKaW5kZXggNjBkNzM3Yi4uNGYwMDVlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCkBAIC00NCw3ICs0NCw2IEBACiAjaWZuZGVmIF9fQUNFWENFUF9IX18KICNkZWZpbmUgX19BQ0VYQ0VQX0hfXwogCi0KIC8qCiAgKiBFeGNlcHRpb25zIHJldHVybmVkIGJ5IGV4dGVybmFsIEFDUEkgaW50ZXJmYWNlcwogICovCkBAIC01NSwxMSArNTQsOSBAQAogI2RlZmluZSBBRV9DT0RFX0NPTlRST0wgICAgICAgICAgICAgICAgIDB4NDAwMAogI2RlZmluZSBBRV9DT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RjAwMAogCi0KICNkZWZpbmUgQUNQSV9TVUNDRVNTKGEpICAgICAgICAgICAgICAgICAoIShhKSkKICNkZWZpbmUgQUNQSV9GQUlMVVJFKGEpICAgICAgICAgICAgICAgICAoYSkKIAotCiAjZGVmaW5lIEFFX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjcGlfc3RhdHVzKSAweDAwMDAKIAogLyoKQEAgLTk1LDkgKzkyLDkgQEAKICNkZWZpbmUgQUVfQUJPUlRfTUVUSE9EICAgICAgICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUMgfCBBRV9DT0RFX0VOVklST05NRU5UQUwpCiAjZGVmaW5lIEFFX1NBTUVfSEFORExFUiAgICAgICAgICAgICAgICAgKGFjcGlfc3RhdHVzKSAoMHgwMDFEIHwgQUVfQ09ERV9FTlZJUk9OTUVOVEFMKQogI2RlZmluZSBBRV9XQUtFX09OTFlfR1BFICAgICAgICAgICAgICAgIChhY3BpX3N0YXR1cykgKDB4MDAxRSB8IEFFX0NPREVfRU5WSVJPTk1FTlRBTCkKKyNkZWZpbmUgQUVfT1dORVJfSURfTElNSVQgICAgICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUYgfCBBRV9DT0RFX0VOVklST05NRU5UQUwpCiAKLSNkZWZpbmUgQUVfQ09ERV9FTlZfTUFYICAgICAgICAgICAgICAgICAweDAwMUUKLQorI2RlZmluZSBBRV9DT0RFX0VOVl9NQVggICAgICAgICAgICAgICAgIDB4MDAxRgogCiAvKgogICogUHJvZ3JhbW1lciBleGNlcHRpb25zCkBAIC0xMTQsNyArMTExLDYgQEAKIAogI2RlZmluZSBBRV9DT0RFX1BHTV9NQVggICAgICAgICAgICAgICAgIDB4MDAwOQogCi0KIC8qCiAgKiBBY3BpIHRhYmxlIGV4Y2VwdGlvbnMKICAqLwpAQCAtMTI3LDcgKzEyMyw2IEBACiAKICNkZWZpbmUgQUVfQ09ERV9UQkxfTUFYICAgICAgICAgICAgICAgICAweDAwMDYKIAotCiAvKgogICogQU1MIGV4Y2VwdGlvbnMuICBUaGVzZSBhcmUgY2F1c2VkIGJ5IHByb2JsZW1zIHdpdGgKICAqIHRoZSBhY3R1YWwgQU1MIGJ5dGUgc3RyZWFtCkBAIC0xNjgsNyArMTYzLDYgQEAKIAogI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMQogCi0KIC8qCiAgKiBJbnRlcm5hbCBleGNlcHRpb25zIHVzZWQgZm9yIGNvbnRyb2wKICAqLwpAQCAtMTg2LDE2ICsxODAsMTMgQEAKIAogI2RlZmluZSBBRV9DT0RFX0NUUkxfTUFYICAgICAgICAgICAgICAgIDB4MDAwQgogCi0KICNpZmRlZiBERUZJTkVfQUNQSV9HTE9CQUxTCiAKLQogLyoKICAqIFN0cmluZyB2ZXJzaW9ucyBvZiB0aGUgZXhjZXB0aW9uIGNvZGVzIGFib3ZlCiAgKiBUaGVzZSBzdHJpbmdzIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5lcyBleGFjdGx5CiAgKi8KLWNoYXIgY29uc3QgICAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2VudltdID0KLXsKK2NoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbXSA9IHsKIAkiQUVfT0siLAogCSJBRV9FUlJPUiIsCiAJIkFFX05PX0FDUElfVEFCTEVTIiwKQEAgLTIyNiwxMSArMjE3LDExIEBACiAJIkFFX0xPR0lDQUxfQUREUkVTUyIsCiAJIkFFX0FCT1JUX01FVEhPRCIsCiAJIkFFX1NBTUVfSEFORExFUiIsCi0JIkFFX1dBS0VfT05MWV9HUEUiCisJIkFFX1dBS0VfT05MWV9HUEUiLAorCSJBRV9PV05FUl9JRF9MSU1JVCIKIH07CiAKLWNoYXIgY29uc3QgICAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbVtdID0KLXsKK2NoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19wZ21bXSA9IHsKIAkiQUVfQkFEX1BBUkFNRVRFUiIsCiAJIkFFX0JBRF9DSEFSQUNURVIiLAogCSJBRV9CQURfUEFUSE5BTUUiLApAQCAtMjQyLDggKzIzMyw3IEBACiAJIkFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UIgogfTsKIAotY2hhciBjb25zdCAgICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfdGJsW10gPQoteworY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3RibFtdID0gewogCSJBRV9CQURfU0lHTkFUVVJFIiwKIAkiQUVfQkFEX0hFQURFUiIsCiAJIkFFX0JBRF9DSEVDS1NVTSIsCkBAIC0yNTIsOCArMjQyLDcgQEAKIAkiQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgiCiB9OwogCi1jaGFyIGNvbnN0ICAgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19hbWxbXSA9Ci17CitjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sW10gPSB7CiAJIkFFX0FNTF9FUlJPUiIsCiAJIkFFX0FNTF9QQVJTRSIsCiAJIkFFX0FNTF9CQURfT1BDT0RFIiwKQEAgLTI4OSw4ICsyNzgsNyBAQAogCSJBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCIKIH07CiAKLWNoYXIgY29uc3QgICAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2N0cmxbXSA9Ci17CitjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybFtdID0gewogCSJBRV9DVFJMX1JFVFVSTl9WQUxVRSIsCiAJIkFFX0NUUkxfUEVORElORyIsCiAJIkFFX0NUUkxfVEVSTUlOQVRFIiwKQEAgLTMwNCw2ICsyOTIsNiBAQAogCSJBRV9DVFJMX1NLSVAiCiB9OwogCi0jZW5kaWYgLyogQUNQSSBHTE9CQUxTICovCisjZW5kaWYJCQkJLyogQUNQSSBHTE9CQUxTICovCiAKLSNlbmRpZiAvKiBfX0FDRVhDRVBfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0VYQ0VQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmggYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAppbmRleCA0OTQ2Njk2Li5lOWMyNzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaApAQCAtNDQsNyArNDQsNiBAQAogI2lmbmRlZiBfX0FDR0xPQkFMX0hfXwogI2RlZmluZSBfX0FDR0xPQkFMX0hfXwogCi0KIC8qCiAgKiBFbnN1cmUgdGhhdCB0aGUgZ2xvYmFscyBhcmUgYWN0dWFsbHkgZGVmaW5lZCBhbmQgaW5pdGlhbGl6ZWQgb25seSBvbmNlLgogICoKQEAgLTYzLDkgKzYyLDggQEAKICAqIEtlZXAgbG9jYWwgY29waWVzIG9mIHRoZXNlIEZBRFQtYmFzZWQgcmVnaXN0ZXJzLiAgTk9URTogVGhlc2UgZ2xvYmFscwogICogYXJlIGZpcnN0IGluIHRoaXMgZmlsZSBmb3IgYWxpZ25tZW50IHJlYXNvbnMgb24gNjQtYml0IHN5c3RlbXMuCiAgKi8KLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgICAgIGFjcGlfZ2JsX3hwbTFhX2VuYWJsZTsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgICAgIGFjcGlfZ2JsX3hwbTFiX2VuYWJsZTsKLQorQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFjcGlfZ2JsX3hwbTFhX2VuYWJsZTsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBhY3BpX2dibF94cG0xYl9lbmFibGU7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc1LDEzICs3MywxMiBAQAogCiAvKiBSdW50aW1lIGNvbmZpZ3VyYXRpb24gb2YgZGVidWcgcHJpbnQgbGV2ZWxzICovCiAKLWV4dGVybiAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZGJnX2xldmVsOwotZXh0ZXJuICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9kYmdfbGF5ZXI7CitleHRlcm4gdTMyIGFjcGlfZGJnX2xldmVsOworZXh0ZXJuIHUzMiBhY3BpX2RiZ19sYXllcjsKIAogLyogUHJvY2VkdXJlIG5lc3RpbmcgbGV2ZWwgZm9yIGRlYnVnIG91dHB1dCAqLwogCi1leHRlcm4gICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uZXN0aW5nX2xldmVsOwotCitleHRlcm4gdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTk4LDcgKzk1LDcgQEAKICAqIDMpIEFsbG93IGFjY2VzcyB0byB1bmluaXRpYWxpemVkIGxvY2Fscy9hcmdzIChhdXRvLWluaXQgdG8gaW50ZWdlciAwKQogICogNCkgQWxsb3cgQU5ZIG9iamVjdCB0eXBlIHRvIGJlIGEgc291cmNlIG9wZXJhbmQgZm9yIHRoZSBTdG9yZSgpIG9wZXJhdG9yCiAgKi8KLUFDUElfRVhURVJOIHU4ICAgICAgIEFDUElfSU5JVF9HTE9CQUwgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaywgRkFMU0UpOworQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2ssIEZBTFNFKTsKIAogLyoKICAqIEF1dG9tYXRpY2FsbHkgc2VyaWFsaXplIEFMTCBjb250cm9sIG1ldGhvZHM/IERlZmF1bHQgaXMgRkFMU0UsIG1lYW5pbmcKQEAgLTEwNiwyMiArMTAzLDIxIEBACiAgKiBPbmx5IGNoYW5nZSB0aGlzIGlmIHRoZSBBU0wgY29kZSBpcyBwb29ybHkgd3JpdHRlbiBhbmQgY2Fubm90IGhhbmRsZQogICogcmVlbnRyYW5jeSBldmVuIHRob3VnaCBtZXRob2RzIGFyZSBtYXJrZWQgIm5vdF9zZXJpYWxpemVkIi4KICAqLwotQUNQSV9FWFRFUk4gdTggICAgICAgQUNQSV9JTklUX0dMT0JBTCAoYWNwaV9nYmxfYWxsX21ldGhvZHNfc2VyaWFsaXplZCwgRkFMU0UpOworQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9hbGxfbWV0aG9kc19zZXJpYWxpemVkLCBGQUxTRSk7CiAKIC8qCiAgKiBDcmVhdGUgdGhlIHByZWRlZmluZWQgX09TSSBtZXRob2QgaW4gdGhlIG5hbWVzcGFjZT8gRGVmYXVsdCBpcyBUUlVFCiAgKiBiZWNhdXNlIEFDUEkgQ0EgaXMgZnVsbHkgY29tcGF0aWJsZSB3aXRoIG90aGVyIEFDUEkgaW1wbGVtZW50YXRpb25zLgogICogQ2hhbmdpbmcgdGhpcyB3aWxsIHJldmVydCBBQ1BJIENBIChhbmQgbWFjaGluZSBBU0wpIHRvIHByZS1PU0kgYmVoYXZpb3IuCiAgKi8KLUFDUElfRVhURVJOIHU4ICAgICAgIEFDUElfSU5JVF9HTE9CQUwgKGFjcGlfZ2JsX2NyZWF0ZV9vc2lfbWV0aG9kLCBUUlVFKTsKK0FDUElfRVhURVJOIHU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfY3JlYXRlX29zaV9tZXRob2QsIFRSVUUpOwogCiAvKgogICogRGlzYWJsZSB3YWtldXAgR1BFcyBkdXJpbmcgcnVudGltZT8gRGVmYXVsdCBpcyBUUlVFIGJlY2F1c2UgV0FLRSBhbmQKICAqIFJVTlRJTUUgR1BFcyBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkLCBhbmQgV0FLRSBHUEVzIHNob3VsZCB0eXBpY2FsbHkgb25seQogICogYmUgZW5hYmxlZCBqdXN0IGJlZm9yZSBnb2luZyB0byBzbGVlcC4KICAqLwotQUNQSV9FWFRFUk4gdTggICAgICAgQUNQSV9JTklUX0dMT0JBTCAoYWNwaV9nYmxfbGVhdmVfd2FrZV9ncGVzX2Rpc2FibGVkLCBUUlVFKTsKLQorQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9sZWF2ZV93YWtlX2dwZXNfZGlzYWJsZWQsIFRSVUUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMzcsNDIgKzEzMyw0NiBAQAogICogVGhlc2UgdGFibGVzIGFyZSBzaW5nbGUtdGFibGUgb25seTsgbWVhbmluZyB0aGF0IHRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZQogICogb2YgZWFjaCBpbiB0aGUgc3lzdGVtLiAgRWFjaCBnbG9iYWwgcG9pbnRzIHRvIHRoZSBhY3R1YWwgdGFibGUuCiAgKi8KLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3RhYmxlX2ZsYWdzOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsKLUFDUElfRVhURVJOIHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgICAgICAgICAgICAgKmFjcGlfZ2JsX1JTRFA7Ci1BQ1BJX0VYVEVSTiBYU0RUX0RFU0NSSVBUT1IgICAgICAgICAgICAqYWNwaV9nYmxfWFNEVDsKLUFDUElfRVhURVJOIEZBRFRfREVTQ1JJUFRPUiAgICAgICAgICAgICphY3BpX2dibF9GQURUOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAgICAqYWNwaV9nYmxfRFNEVDsKLUFDUElfRVhURVJOIEZBQ1NfREVTQ1JJUFRPUiAgICAgICAgICAgICphY3BpX2dibF9GQUNTOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgICAgICAgICAgICAgYWNwaV9nYmxfY29tbW9uX2ZBQ1M7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdGFibGVfZmxhZ3M7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsKK0FDUElfRVhURVJOIHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKmFjcGlfZ2JsX1JTRFA7CitBQ1BJX0VYVEVSTiBYU0RUX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX1hTRFQ7CitBQ1BJX0VYVEVSTiBGQURUX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX0ZBRFQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFjcGlfZ2JsX0RTRFQ7CitBQ1BJX0VYVEVSTiBGQUNTX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX0ZBQ1M7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9jb21tb25fZmFjcyBhY3BpX2dibF9jb21tb25fZkFDUzsKIC8qCiAgKiBTaW5jZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgU1NEVHMgYW5kIFBTRFRzLCBhIHNpbmdsZSBwb2ludGVyIGlzIG5vdAogICogc3VmZmljaWVudDsgVGhlcmVmb3JlLCB0aGVyZSBpc24ndCBvbmUhCiAgKi8KIAorLyogVGhlIHJvb3QgdGFibGUgY2FuIGJlIGVpdGhlciBhbiBSU0RUIG9yIGFuIFhTRFQgKi8KKworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlOworI2RlZmluZSAgICAgQUNQSV9UQUJMRV9UWVBFX1JTRFQgICAgICAgICdSJworI2RlZmluZSAgICAgQUNQSV9UQUJMRV9UWVBFX1hTRFQgICAgICAgICdYJwogCiAvKgogICogSGFuZGxlIGJvdGggQUNQSSAxLjAgYW5kIEFDUEkgMi4wIEludGVnZXIgd2lkdGhzOgogICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCB0aGF0IGV4aXN0cyBpbiBhIDMyLWJpdCBBQ1BJIHRhYmxlLAogICogdXNlIG9ubHkgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIChpbnRlcm5hbCkgNjQtYml0IEludGVnZXIuCiAgKi8KLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGg7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoOwogCiAvKgogICogQUNQSSBUYWJsZSBpbmZvIGFycmF5cwogICovCi1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9saXN0ICAgICAgICAgICAgICBhY3BpX2dibF90YWJsZV9saXN0c1tOVU1fQUNQSV9UQUJMRV9UWVBFU107Ci1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0ICAgICAgICAgICBhY3BpX2dibF90YWJsZV9kYXRhW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9saXN0IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbTlVNX0FDUElfVEFCTEVfVFlQRVNdOwogCiAvKgogICogUHJlZGVmaW5lZCBtdXRleCBvYmplY3RzLiAgVGhpcyBhcnJheSBjb250YWlucyB0aGUKICAqIGFjdHVhbCBPUyBtdXRleCBoYW5kbGVzLCBpbmRleGVkIGJ5IHRoZSBsb2NhbCBBQ1BJX01VVEVYX0hBTkRMRXMuCiAgKiAoVGhlIHRhYmxlIG1hcHMgbG9jYWwgaGFuZGxlcyB0byB0aGUgcmVhbCBPUyBoYW5kbGVzKQogICovCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvICAgICAgICAgICAgICBhY3BpX2dibF9tdXRleF9pbmZvW05VTV9NVVRFWF07Ci0KK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX211dGV4X2luZm8gYWNwaV9nYmxfbXV0ZXhfaW5mb1tOVU1fTVVURVhdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xODAsNDEgKzE4MCw1NiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKIAotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgICAgICAgICAgICAgYWNwaV9nYmxfbWVtb3J5X2xpc3RzW0FDUElfTlVNX01FTV9MSVNUU107Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgICBhY3BpX2dibF9kZXZpY2Vfbm90aWZ5OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyICAgYWNwaV9nYmxfc3lzdGVtX25vdGlmeTsKLUFDUElfRVhURVJOIGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgICAgICAgICAgICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyOwotQUNQSV9FWFRFUk4gYWNwaV9pbml0X2hhbmRsZXIgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW5pdF9oYW5kbGVyOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAqYWNwaV9nYmxfYnJlYWtwb2ludF93YWxrOwotQUNQSV9FWFRFUk4gYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlOworLyogTGlzdHMgZm9yIHRyYWNraW5nIG1lbW9yeSBhbGxvY2F0aW9ucyAqLwogCi1BQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQ7Ci1BQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9vcmlnaW5hbF9tb2RlOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcnNkcF9vcmlnaW5hbF9sb2NhdGlvbjsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudDsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3BzX2ZpbmRfY291bnQ7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9wbTFfZW5hYmxlX3JlZ2lzdGVyX3NhdmU7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uZXh0X3RhYmxlX293bmVyX2lkOwotQUNQSV9FWFRFUk4gdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbmV4dF9tZXRob2Rfb3duZXJfaWQ7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGU7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQ7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zdGVwX3RvX25leHRfY2FsbDsKLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2FjcGlfaGFyZHdhcmVfcHJlc2VudDsKLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQ7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQ7Ci1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmc7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfZ2xvYmFsX2xpc3Q7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfbnNfbm9kZV9saXN0OworI2VuZGlmCiAKLWV4dGVybiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3NodXRkb3duOwotZXh0ZXJuIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc3RhcnR1cF9mbGFnczsKLWV4dGVybiBjb25zdCB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbOF07Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXNbNF07Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAgICAgICAgICBhY3BpX2dibF9hbWxfb3BfaW5mb1tBTUxfTlVNX09QQ09ERVNdOwotZXh0ZXJuIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU107Ci1leHRlcm4gY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tBQ1BJX05VTV9PU0lfU1RSSU5HU107CisvKiBPYmplY3QgY2FjaGVzICovCiAKK0FDUElfRVhURVJOIGFjcGlfY2FjaGVfdCAqYWNwaV9nYmxfc3RhdGVfY2FjaGU7CitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfY2FjaGU7CitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlOworQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9vcGVyYW5kX2NhY2hlOworCisvKiBHbG9iYWwgaGFuZGxlcnMgKi8KKworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyIGFjcGlfZ2JsX2RldmljZV9ub3RpZnk7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgYWNwaV9nYmxfc3lzdGVtX25vdGlmeTsKK0FDUElfRVhURVJOIGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXI7CitBQ1BJX0VYVEVSTiBhY3BpX2luaXRfaGFuZGxlciBhY3BpX2dibF9pbml0X2hhbmRsZXI7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2dibF9icmVha3BvaW50X3dhbGs7CitBQ1BJX0VYVEVSTiBhY3BpX2hhbmRsZSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmU7CisKKy8qIE1pc2MgKi8KKworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudDsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9tb2RlOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3JzZHBfb3JpZ2luYWxfbG9jYXRpb247CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50OworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3BzX2ZpbmRfY291bnQ7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3duZXJfaWRfbWFzazsKK0FDUElfRVhURVJOIHUxNiBhY3BpX2dibF9wbTFfZW5hYmxlX3JlZ2lzdGVyX3NhdmU7CitBQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGVidWdnZXJfY29uZmlndXJhdGlvbjsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc3RlcF90b19uZXh0X2NhbGw7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9hY3BpX2hhcmR3YXJlX3ByZXNlbnQ7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50OworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nOworCitleHRlcm4gdTggYWNwaV9nYmxfc2h1dGRvd247CitleHRlcm4gdTMyIGFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3M7CitleHRlcm4gY29uc3QgdTggYWNwaV9nYmxfZGVjb2RlX3RvOGJpdFs4XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvIGFjcGlfZ2JsX2FtbF9vcF9pbmZvW0FNTF9OVU1fT1BDT0RFU107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbQUNQSV9OVU1fT1NJX1NUUklOR1NdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMzAsMzYgKzI0NSwzNCBAQAogI2RlZmluZSBOVU1fUFJFREVGSU5FRF9OQU1FUyAgICAgICAgICAgIDkKICNlbmRpZgogCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICBhY3BpX2dibF9yb290X25vZGVfc3RydWN0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAqYWNwaV9nYmxfcm9vdF9ub2RlOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAqYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdDsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2dibF9yb290X25vZGU7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOwogCi1leHRlcm4gY29uc3QgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW05VTV9OU19UWVBFU107Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAgICAgICBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lcyBbTlVNX1BSRURFRklORURfTkFNRVNdOworZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbTlVNX05TX1RZUEVTXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzCisgICAgYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXNbTlVNX1BSRURFRklORURfTkFNRVNdOwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudDsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9zaXplOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudDsKLUFDUElfRVhURVJOIGFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2VudHJ5X3N0YWNrX3BvaW50ZXI7Ci1BQ1BJX0VYVEVSTiBhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcjsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZzsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9jdXJyZW50X25vZGVfY291bnQ7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfY3VycmVudF9ub2RlX3NpemU7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudDsKK0FDUElfRVhURVJOIGFjcGlfc2l6ZSBhY3BpX2dibF9lbnRyeV9zdGFja19wb2ludGVyOworQUNQSV9FWFRFUk4gYWNwaV9zaXplIGFjcGlfZ2JsX2xvd2VzdF9zdGFja19wb2ludGVyOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZzsKICNlbmRpZgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVycHJldGVyIGdsb2JhbHMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICAgICphY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdDsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqYWNwaV9nYmxfY3VycmVudF93YWxrX2xpc3Q7CiAKIC8qIENvbnRyb2wgbWV0aG9kIHNpbmdsZSBzdGVwIGZsYWcgKi8KIAotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXA7Ci0KK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNjcsOCArMjgwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAqYWNwaV9nYmxfcGFyc2VkX25hbWVzcGFjZV9yb290OwotCitBQ1BJX0VYVEVSTiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9nYmxfcGFyc2VkX25hbWVzcGFjZV9yb290OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNzYsMTAgKzI4OCwxMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAgICAgICBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2xlZXBfdHlwZV9hOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2xlZXBfdHlwZV9iOwotCitleHRlcm4gc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8KKyAgICBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc2xlZXBfdHlwZV9hOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc2xlZXBfdHlwZV9iOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yODcsMTIgKzI5OSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gICAgICBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9pbmZvICAgICAgICBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU107Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9oYW5kbGVyICAgICBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAgICAqYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgICAgKmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1tBQ1BJX01BWF9HUEVfQkxPQ0tTXTsKLUFDUElfRVhURVJOIGFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2dwZV9sb2NrOwotCitleHRlcm4gc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbworICAgIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2hhbmRsZXIKKyAgICBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbworICAgICphY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbQUNQSV9NQVhfR1BFX0JMT0NLU107CitBQ1BJX0VYVEVSTiBhY3BpX2hhbmRsZSBhY3BpX2dibF9ncGVfbG9jazsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzAwLDU4ICszMTQsNTUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzOwogCiAjaWZkZWYgQUNQSV9ESVNBU1NFTUJMRVIKIAotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3B0X2Rpc2FzbTsKLUFDUElfRVhURVJOIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X2Rpc2FzbTsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlOwogI2VuZGlmCiAKLQogI2lmZGVmIEFDUElfREVCVUdHRVIKIAotZXh0ZXJuICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbWV0aG9kX2V4ZWN1dGluZzsKLWV4dGVybiAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2Fib3J0X21ldGhvZDsKLWV4dGVybiAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzOworZXh0ZXJuIHU4IGFjcGlfZ2JsX21ldGhvZF9leGVjdXRpbmc7CitleHRlcm4gdTggYWNwaV9nYmxfYWJvcnRfbWV0aG9kOworZXh0ZXJuIHU4IGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzOwogCi1BQ1BJX0VYVEVSTiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbmQ7Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvcHRhcmc7CitBQ1BJX0VYVEVSTiBpbnQgb3B0aW5kOworQUNQSV9FWFRFUk4gY2hhciAqb3B0YXJnOwogCi1BQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kYl9vcHRfdGFibGVzOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3B0X3N0YXRzOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3B0X2luaV9tZXRob2RzOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X3RhYmxlczsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9zdGF0czsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9pbmlfbWV0aG9kczsKIAotCi1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kYl9hcmdzW0FDUElfREVCVUdHRVJfTUFYX0FSR1NdOwotQUNQSV9FWFRFUk4gY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfbGluZV9idWZbODBdOwotQUNQSV9FWFRFUk4gY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfcGFyc2VkX2J1Zls4MF07Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9kYl9zY29wZV9idWZbNDBdOwotQUNQSV9FWFRFUk4gY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfZGVidWdfZmlsZW5hbWVbNDBdOwotQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGU7Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kYl9idWZmZXI7Ci1BQ1BJX0VYVEVSTiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kYl9maWxlbmFtZTsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RiX2RlYnVnX2xldmVsOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfY29uc29sZV9kZWJ1Z19sZXZlbDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgICAgKmFjcGlfZ2JsX2RiX3RhYmxlX3B0cjsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgKmFjcGlfZ2JsX2RiX3Njb3BlX25vZGU7CitBQ1BJX0VYVEVSTiBjaGFyICphY3BpX2dibF9kYl9hcmdzW0FDUElfREVCVUdHRVJfTUFYX0FSR1NdOworQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9saW5lX2J1Zls4MF07CitBQ1BJX0VYVEVSTiBjaGFyIGFjcGlfZ2JsX2RiX3BhcnNlZF9idWZbODBdOworQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9zY29wZV9idWZbNDBdOworQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9kZWJ1Z19maWxlbmFtZVs0MF07CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vdXRwdXRfdG9fZmlsZTsKK0FDUElfRVhURVJOIGNoYXIgKmFjcGlfZ2JsX2RiX2J1ZmZlcjsKK0FDUElfRVhURVJOIGNoYXIgKmFjcGlfZ2JsX2RiX2ZpbGVuYW1lOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2RiX2RlYnVnX2xldmVsOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2RiX2NvbnNvbGVfZGVidWdfbGV2ZWw7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFjcGlfZ2JsX2RiX3RhYmxlX3B0cjsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2dibF9kYl9zY29wZV9ub2RlOwogCiAvKgogICogU3RhdGlzdGljIGdsb2JhbHMKICAqLwotQUNQSV9FWFRFUk4gdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfb2JqX3R5cGVfY291bnRbQUNQSV9UWVBFX05TX05PREVfTUFYKzFdOwotQUNQSV9FWFRFUk4gdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfbm9kZV90eXBlX2NvdW50W0FDUElfVFlQRV9OU19OT0RFX01BWCsxXTsKLUFDUElfRVhURVJOIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX29ial90eXBlX2NvdW50X21pc2M7Ci1BQ1BJX0VYVEVSTiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9ub2RlX3R5cGVfY291bnRfbWlzYzsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX251bV9ub2RlczsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX251bV9vYmplY3RzOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX29ial90eXBlX2NvdW50W0FDUElfVFlQRV9OU19OT0RFX01BWCArIDFdOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX25vZGVfdHlwZV9jb3VudFtBQ1BJX1RZUEVfTlNfTk9ERV9NQVggKyAxXTsKK0FDUElfRVhURVJOIHUxNiBhY3BpX2dibF9vYmpfdHlwZV9jb3VudF9taXNjOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX25vZGVfdHlwZV9jb3VudF9taXNjOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX251bV9ub2RlczsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9udW1fb2JqZWN0czsKIAorQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3NpemVfb2ZfcGFyc2VfdHJlZTsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX21ldGhvZF90cmVlczsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX25vZGVfZW50cmllczsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX2FjcGlfb2JqZWN0czsKIAotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2l6ZV9vZl9wYXJzZV90cmVlOwotQUNQSV9FWFRFUk4gdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfc2l6ZV9vZl9tZXRob2RfdHJlZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9zaXplX29mX25vZGVfZW50cmllczsKLUFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3NpemVfb2ZfYWNwaV9vYmplY3RzOworI2VuZGlmCQkJCS8qIEFDUElfREVCVUdHRVIgKi8KIAotI2VuZGlmIC8qIEFDUElfREVCVUdHRVIgKi8KLQotI2VuZGlmIC8qIF9fQUNHTE9CQUxfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0dMT0JBTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmggYi9pbmNsdWRlL2FjcGkvYWNod2FyZS5oCmluZGV4IDlkNjM2NDEuLjM2NDRkNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaApAQCAtNDQsNyArNDQsNiBAQAogI2lmbmRlZiBfX0FDSFdBUkVfSF9fCiAjZGVmaW5lIF9fQUNIV0FSRV9IX18KIAotCiAvKiBQTSBUaW1lciB0aWNrcyBwZXIgc2Vjb25kIChIWikgKi8KIAogI2RlZmluZSBQTV9USU1FUl9GUkVRVUVOQ1kgIDM1Nzk1NDUKQEAgLTU3LDEyNiArNTYsNzggQEAKICNkZWZpbmUgQUNQSV9TU1RfU0xFRVBJTkcgICAgICAgMwogI2RlZmluZSBBQ1BJX1NTVF9TTEVFUF9DT05URVhUICA0CiAKLQogLyogUHJvdG90eXBlcyAqLwogCi0KIC8qCiAgKiBod2FjcGkgLSBoaWdoIGxldmVsIGZ1bmN0aW9ucwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9od19pbml0aWFsaXplICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfaHdfaW5pdGlhbGl6ZSh2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfaHdfc2V0X21vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CithY3BpX3N0YXR1cyBhY3BpX2h3X3NldF9tb2RlKHUzMiBtb2RlKTsKIAotdTMyCi1hY3BpX2h3X2dldF9tb2RlICgKLQl2b2lkKTsKLQordTMyIGFjcGlfaHdfZ2V0X21vZGUodm9pZCk7CiAKIC8qCiAgKiBod3JlZ3MgLSBBQ1BJIFJlZ2lzdGVyIEkvTwogICovCi1zdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqCi1hY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCk7CitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8odTMyIHJlZ2lzdGVyX2lkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfbG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldHVybl92YWx1ZSk7CithY3BpX2h3X3JlZ2lzdGVyX3JlYWQodTggdXNlX2xvY2ssIHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19yZWdpc3Rlcl93cml0ZSh1OCB1c2VfbG9jaywgdTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfbG9jaywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworYWNwaV9od19sb3dfbGV2ZWxfcmVhZCh1MzIgd2lkdGgsCisJCSAgICAgICB1MzIgKiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19sb3dfbGV2ZWxfcmVhZCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICpyZWcpOworYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUodTMyIHdpZHRoLCB1MzIgdmFsdWUsIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqcmVnKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfaHdfbG93X2xldmVsX3dyaXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqcmVnKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKHUzMiBmbGFncyk7CiAKIC8qCiAgKiBod2dwZSAtIEdQRSBzdXBwb3J0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnICgKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICpncGVfZXZlbnRfaW5mbyk7CithY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOworCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19jbGVhcl9ncGUgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOworYWNwaV9od19jbGVhcl9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7CiAKICNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMgKAotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAotCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgKmV2ZW50X3N0YXR1cyk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KK2FjcGlfaHdfZ2V0X2dwZV9zdGF0dXMoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkgICAgICAgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3Blcyh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwotCithY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIC8qCiAgKiBod3RpbWVyIC0gQUNQSSBUaW1lciBwcm90b3R5cGVzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXNvbHV0aW9uKTsKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24odTMyICogcmVzb2x1dGlvbik7CisKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyKHUzMiAqIHRpY2tzKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RpbWVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aWNrcyk7CithY3BpX2dldF90aW1lcl9kdXJhdGlvbih1MzIgc3RhcnRfdGlja3MsIHUzMiBlbmRfdGlja3MsIHUzMiAqIHRpbWVfZWxhcHNlZCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpY2tzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RpY2tzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWVfZWxhcHNlZCk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotCi0jZW5kaWYgLyogX19BQ0hXQVJFX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNIV0FSRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2ludGVycC5oIGIvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKaW5kZXggNWM3MTcyNC4uMmM5YzFhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKQEAgLTQ0LDI5ICs0NCwyMiBAQAogI2lmbmRlZiBfX0FDSU5URVJQX0hfXwogI2RlZmluZSBfX0FDSU5URVJQX0hfXwogCi0KICNkZWZpbmUgQUNQSV9XQUxLX09QRVJBTkRTICAgICAgICgmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSkKIAotCiAvKgogICogZXhjb252cnQgLSBvYmplY3QgY29udmVyc2lvbgogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2FjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJlc3VsdF9kZXNjLCB1MzIgZmxhZ3MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlciAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKTsKK2FjcGlfZXhfY29udmVydF90b19idWZmZXIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmVzdWx0X2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKK2FjcGlfZXhfY29udmVydF90b19zdHJpbmcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYywgdTMyIHR5cGUpOwogCiAvKiBUeXBlcyBmb3IgLT5TdHJpbmcgY29udmVyc2lvbiAqLwogCkBAIC03Niw1ODcgKzY5LDQxMiBAQAogI2RlZmluZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTCAgIDB4MDAwMDAwMDMKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29udmVydF90b190YXJnZXRfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXN1bHRfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgZGVzdGluYXRpb25fdHlwZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBleGZpZWxkIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgbWFuaXB1bGF0aW9uCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbW1vbl9idWZmZXJfc2V0dXAgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXR1bV9jb3VudCk7CithY3BpX2V4X2NvbW1vbl9idWZmZXJfc2V0dXAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgdTMyIGJ1ZmZlcl9sZW5ndGgsIHUzMiAqIGRhdHVtX2NvdW50KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtYXNrLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgZmllbGRfdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CithY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgICAgYWNwaV9pbnRlZ2VyIG1hc2ssCisJCQkgICAgICAgYWNwaV9pbnRlZ2VyIGZpZWxkX3ZhbHVlLAorCQkJICAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CiAKIHZvaWQKLWFjcGlfZXhfZ2V0X2J1ZmZlcl9kYXR1bSgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpkYXR1bSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9ncmFudWxhcml0eSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9vZmZzZXQpOworYWNwaV9leF9nZXRfYnVmZmVyX2RhdHVtKGFjcGlfaW50ZWdlciAqIGRhdHVtLAorCQkJIHZvaWQgKmJ1ZmZlciwKKwkJCSB1MzIgYnVmZmVyX2xlbmd0aCwKKwkJCSB1MzIgYnl0ZV9ncmFudWxhcml0eSwgdTMyIGJ1ZmZlcl9vZmZzZXQpOwogCiB2b2lkCi1hY3BpX2V4X3NldF9idWZmZXJfZGF0dW0gKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX2RhdHVtLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX2dyYW51bGFyaXR5LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX29mZnNldCk7CithY3BpX2V4X3NldF9idWZmZXJfZGF0dW0oYWNwaV9pbnRlZ2VyIG1lcmdlZF9kYXR1bSwKKwkJCSB2b2lkICpidWZmZXIsCisJCQkgdTMyIGJ1ZmZlcl9sZW5ndGgsCisJCQkgdTMyIGJ5dGVfZ3JhbnVsYXJpdHksIHUzMiBidWZmZXJfb2Zmc2V0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldF9idWZmZXJfZGVzYyk7CithY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0X2J1ZmZlcl9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjKTsKLQorYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYyk7CiAKIC8qCiAgKiBleGZsZGlvIC0gbG93IGxldmVsIGZpZWxkIEkvTwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOworYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICB2b2lkICpidWZmZXIsIHUzMiBidWZmZXJfbGVuZ3RoKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOworYWNwaV9leF9pbnNlcnRfaW50b19maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgdm9pZCAqYnVmZmVyLCB1MzIgYnVmZmVyX2xlbmd0aCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FjY2Vzc19yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKTsKLQorYWNwaV9leF9hY2Nlc3NfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgcmVhZF93cml0ZSk7CiAKIC8qCiAgKiBleG1pc2MgLSBtaXNjIHN1cHBvcnQgcm91dGluZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYywKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MyLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjMiwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fY29uY2F0ZW5hdGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjMiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqYWN0dWFsX3JldHVybl9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9kb19jb25jYXRlbmF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjMiwKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fbG9naWNhbF9udW1lcmljX29wICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIwLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjEsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9naWNhbF9yZXN1bHQpOworYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AodTE2IG9wY29kZSwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMCwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMSwgdTggKiBsb2dpY2FsX3Jlc3VsdCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2RvX2xvZ2ljYWxfb3AgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQwLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQxLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvZ2ljYWxfcmVzdWx0KTsKK2FjcGlfZXhfZG9fbG9naWNhbF9vcCh1MTYgb3Bjb2RlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMCwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDEsIHU4ICogbG9naWNhbF9yZXN1bHQpOwogCiBhY3BpX2ludGVnZXIKLWFjcGlfZXhfZG9fbWF0aF9vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBvcGVyYW5kMCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIG9wZXJhbmQxKTsKK2FjcGlfZXhfZG9fbWF0aF9vcCh1MTYgb3Bjb2RlLCBhY3BpX2ludGVnZXIgb3BlcmFuZDAsIGFjcGlfaW50ZWdlciBvcGVyYW5kMSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX211dGV4KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Ioc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfbXV0ZXggKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9jcmVhdGVfcmVnaW9uKHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwKKwkJICAgICAgdTggcmVnaW9uX3NwYWNlLCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9ldmVudChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfYWxpYXMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3IgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcG93ZXJfcmVzb3VyY2UgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfcmVnaW9uICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX3NwYWNlLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfdGFibGVfcmVnaW9uICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX2V2ZW50ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX2FsaWFzICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfY3JlYXRlX21ldGhvZCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9jcmVhdGVfbWV0aG9kKHU4ICogYW1sX3N0YXJ0LAorCQkgICAgICB1MzIgYW1sX2xlbmd0aCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBleGNvbmZpZyAtIGR5bmFtaWMgdGFibGUgbG9hZC91bmxvYWQKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfbG9hZF9vcCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9sb2FkX29wKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXQsCisJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX3RhYmxlX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYyk7CithY3BpX2V4X2xvYWRfdGFibGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfdW5sb2FkX3RhYmxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZGJfaGFuZGxlKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9leF91bmxvYWRfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZSk7CiAKIC8qCiAgKiBleG11dGV4IC0gbXV0ZXggc3VwcG9ydAogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9hY3F1aXJlX211dGV4ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aW1lX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X2FjcXVpcmVfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGltZV9kZXNjLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3JlbGVhc2VfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9yZWxlYXNlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotdm9pZAotYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzICgKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOwordm9pZCBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwogCi12b2lkCi1hY3BpX2V4X3VubGlua19tdXRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCit2b2lkIGFjcGlfZXhfdW5saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAogLyoKICAqIGV4cHJlcCAtIEFDUEkgQU1MIGV4ZWN1dGlvbiAtIHByZXAgdXRpbGl0aWVzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFncywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2F0dHJpYnV0ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGgpOworYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkJIHU4IGZpZWxkX2ZsYWdzLAorCQkJCSB1OCBmaWVsZF9hdHRyaWJ1dGUsCisJCQkJIHUzMiBmaWVsZF9iaXRfcG9zaXRpb24sIHUzMiBmaWVsZF9iaXRfbGVuZ3RoKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZSAoCi0Jc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICAqaW5mbyk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZShzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAqaW5mbyk7CiAKIC8qCiAgKiBleHN5c3RlbSAtIEludGVyZmFjZSB0byBPUyBzZXJ2aWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fbm90aWZ5X29wICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp2YWx1ZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CithY3BpX2V4X3N5c3RlbV9kb19ub3RpZnlfb3AodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdmFsdWUsCisJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdXNwZW5kKGFjcGlfaW50ZWdlciB0aW1lKTsKKworYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwodTMyIHRpbWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZCgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHRpbWUpOworYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aW1lLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOworCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CithY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRpbWUsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX2FjcXVpcmVfbXV0ZXgoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGltZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9yZWxlYXNlX211dGV4KAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudCgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRpbWUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fcmVzZXRfZXZlbnQoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfaGFuZGxlIHNlbWFwaG9yZSwgdTE2IHRpbWVvdXQpOwogCiAvKgogICogZXhvcGFyZzEgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDEgb3BlcmFuZAogICovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8wVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8xQV8xVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8xVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4b3BhcmcyIC0gQUNQSSBBTUwgZXhlY3V0aW9uLCAyIG9wZXJhbmRzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8yQV8wVF8wUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8yQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8yQV8yVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAvKgogICogZXhvcGFyZzMgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDMgb3BlcmFuZHMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4b3Bhcmc2IC0gQUNQSSBBTUwgZXhlY3V0aW9uLCA2IG9wZXJhbmRzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV82QV8wVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAvKgogICogZXhyZXNvbHYgLSBPYmplY3QgcmVzb2x1dGlvbiBhbmQgZ2V0IHZhbHVlIGZ1bmN0aW9ucwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICpyZXR1cm5fdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX2Rlc2MpOwotCithY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgKiByZXR1cm5fdHlwZSwKKwkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpOwogCiAvKgogICogZXhyZXNudGUgLSByZXNvbHZlIG5hbWVzcGFjZSBub2RlCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipzdGFja19wdHIsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4cmVzb3AgLSByZXNvbHZlIG9wZXJhbmQgdG8gdmFsdWUKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnN0YWNrX3B0ciwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHUxNiBvcGNvZGUsCisJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogLyoKICAqIGV4ZHVtcCAtIEludGVycHJldGVyIGRlYnVnIG91dHB1dCByb3V0aW5lcwogICovCi12b2lkCi1hY3BpX2V4X2R1bXBfb3BlcmFuZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCk7Cit2b2lkIGFjcGlfZXhfZHVtcF9vcGVyYW5kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLCB1MzIgZGVwdGgpOwogCiB2b2lkCi1hY3BpX2V4X2R1bXBfb3BlcmFuZHMgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kcywKLQlhY3BpX2ludGVycHJldGVyX21vZGUgICAgICAgICAgIGludGVycHJldGVyX21vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaWRlbnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbGV2ZWxzLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5vdGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlcik7CithY3BpX2V4X2R1bXBfb3BlcmFuZHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmRzLAorCQkgICAgICBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJICAgICAgY2hhciAqaWRlbnQsCisJCSAgICAgIHUzMiBudW1fbGV2ZWxzLAorCQkgICAgICBjaGFyICpub3RlLCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCi1hY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2FjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUzMiBmbGFncyk7CiAKLXZvaWQKLWFjcGlfZXhfZHVtcF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCi0KK3ZvaWQgYWNwaV9leF9kdW1wX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIHUzMiBmbGFncyk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogLyoKICAqIGV4bmFtZXMgLSBBTUwgbmFtZXN0cmluZyBzdXBwb3J0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2dldF9uYW1lX3N0cmluZyAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICBkYXRhX3R5cGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5fYW1sX2FkZHJlc3MsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dF9uYW1lX3N0cmluZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfbmFtZV9sZW5ndGgpOwotCithY3BpX2V4X2dldF9uYW1lX3N0cmluZyhhY3BpX29iamVjdF90eXBlIGRhdGFfdHlwZSwKKwkJCXU4ICogaW5fYW1sX2FkZHJlc3MsCisJCQljaGFyICoqb3V0X25hbWVfc3RyaW5nLCB1MzIgKiBvdXRfbmFtZV9sZW5ndGgpOwogCiAvKgogICogZXhzdG9yZSAtIE9iamVjdCBzdG9yZSBzdXBwb3J0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp2YWxfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X3N0b3JlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnZhbF9kZXNjLAorCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKKwkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2NvbnZlcnNpb24pOworYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgIHU4IGltcGxpY2l0X2NvbnZlcnNpb24pOwogCiAjZGVmaW5lIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTiAgICAgICAgVFJVRQogI2RlZmluZSBBQ1BJX05PX0lNUExJQ0lUX0NPTlZFUlNJT04gICAgIEZBTFNFCiAKLQogLyoKICAqIGV4c3RvcmVuIC0gcmVzb2x2ZS9zdG9yZSBvYmplY3QKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzb3VyY2VfZGVzY19wdHIsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnNvdXJjZV9kZXNjX3B0ciwKKwkJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdGFyZ2V0X3R5cGUsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipuZXdfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbmV3X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBleHN0b3JvYiAtIHN0b3JlIG9iamVjdCAtIGJ1ZmZlci9zdHJpbmcKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlciAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOworYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOwotCithY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0X2Rlc2MpOwogCiAvKgogICogZXhjb3B5IC0gb2JqZWN0IGNvcHkKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXhfY29weV9pbnRlZ2VyX3RvX2luZGV4X2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7CithY3BpX2V4X2NvcHlfaW50ZWdlcl90b19pbmRleF9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0X2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb3B5X2ludGVnZXJfdG9fYmFua19maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0X2Rlc2MpOworYWNwaV9leF9jb3B5X2ludGVnZXJfdG9fYmFua19maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvcHlfZGF0YV90b19uYW1lZF9maWVsZCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CithY3BpX2V4X2NvcHlfZGF0YV90b19uYW1lZF9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jb3B5X2ludGVnZXJfdG9fYnVmZmVyX2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7Ci0KK2FjcGlfZXhfY29weV9pbnRlZ2VyX3RvX2J1ZmZlcl9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKTsKIAogLyoKICAqIGV4dXRpbHMgLSBpbnRlcnByZXRlci9zY2FubmVyIHV0aWxpdGllcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKHZvaWQpOwogCi12b2lkCi1hY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKAotCXZvaWQpOwordm9pZCBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIodm9pZCk7CiAKLXZvaWQKLWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK3ZvaWQgYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKLXU4Ci1hY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZSk7Cit1OCBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sodTMyIHJ1bGUpOwogCi12b2lkCi1hY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkKTsKK3ZvaWQgYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKHU4IGxvY2tlZCk7CiAKLXZvaWQKLWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY19pZCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfc3RyaW5nKTsKK3ZvaWQgYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZyh1MzIgbnVtZXJpY19pZCwgY2hhciAqb3V0X3N0cmluZyk7CiAKLXZvaWQKLWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0X3N0cmluZyk7Ci0KK3ZvaWQgYWNwaV9leF91bnNpZ25lZF9pbnRlZ2VyX3RvX3N0cmluZyhhY3BpX2ludGVnZXIgdmFsdWUsIGNoYXIgKm91dF9zdHJpbmcpOwogCiAvKgogICogZXhyZWdpb24gLSBkZWZhdWx0IG9wX3JlZ2lvbiBoYW5kbGVycwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCSAgICB1MzIgYml0X3dpZHRoLAorCQkJCSAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LAorCQkJCSAgICB2b2lkICpyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpOworYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJdTMyIGJpdF93aWR0aCwKKwkJCQlhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aCwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW9uX2NvbnRleHQpOworYWNwaV9leF9wY2lfY29uZmlnX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJCSBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCQkgdTMyIGJpdF93aWR0aCwKKwkJCQkgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkJIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X2Ntb3Nfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgIHUzMiBiaXRfd2lkdGgsCisJCQkgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9wY2lfYmFyX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X3BjaV9iYXJfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgIHUzMiBiaXRfd2lkdGgsCisJCQkgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9lbWJlZGRlZF9jb250cm9sbGVyX3NwYWNlX2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3dpZHRoLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpb25fY29udGV4dCk7CithY3BpX2V4X2VtYmVkZGVkX2NvbnRyb2xsZXJfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJCSAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJCSAgdTMyIGJpdF93aWR0aCwKKwkJCQkJICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQkJICB2b2lkICpoYW5kbGVyX2NvbnRleHQsCisJCQkJCSAgdm9pZCAqcmVnaW9uX2NvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9zbV9idXNfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KTsKLQorYWNwaV9leF9zbV9idXNfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgICB1MzIgYml0X3dpZHRoLAorCQkJICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCSAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlcl9jb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJIHUzMiBiaXRfd2lkdGgsCisJCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KTsKIAotI2VuZGlmIC8qIF9fSU5URVJQX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fSU5URVJQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKaW5kZXggMDMwZTY0MS4uOWZiYTBmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCkBAIC00NCwxNyArNDQsMjAgQEAKICNpZm5kZWYgX19BQ0xPQ0FMX0hfXwogI2RlZmluZSBfX0FDTE9DQUxfSF9fCiAKKyNkZWZpbmUgQUNQSV9XQUlUX0ZPUkVWRVIgICAgICAgICAgICAgICAweEZGRkYJLyogdTE2LCBhcyBwZXIgQUNQSSBzcGVjICovCiAKLSNkZWZpbmUgQUNQSV9XQUlUX0ZPUkVWRVIgICAgICAgICAgICAgICAweEZGRkYgIC8qIHUxNiwgYXMgcGVyIEFDUEkgc3BlYyAqLwotCi10eXBlZGVmIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX211dGV4OwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9tdXRleF9oYW5kbGU7Ci0KK3R5cGVkZWYgdm9pZCAqYWNwaV9tdXRleDsKK3R5cGVkZWYgdTMyIGFjcGlfbXV0ZXhfaGFuZGxlOwogCiAvKiBUb3RhbCBudW1iZXIgb2YgYW1sIG9wY29kZXMgZGVmaW5lZCAqLwogCiAjZGVmaW5lIEFNTF9OVU1fT1BDT0RFUyAgICAgICAgICAgICAgICAgMHg3RgogCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlOworc3RydWN0IGFjcGlfb2JqX211dGV4OwordW5pb24gYWNwaV9wYXJzZV9vYmplY3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYyLDcgKzY1LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKgogICogUHJlZGVmaW5lZCBoYW5kbGVzIGZvciB0aGUgbXV0ZXggb2JqZWN0cyB1c2VkIHdpdGhpbiB0aGUgc3Vic3lzdGVtCiAgKiBBbGwgbXV0ZXggb2JqZWN0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZS4KQEAgLTg5LDE0ICs5MSwxMiBAQAogI2RlZmluZSBNQVhfTVVURVggICAgICAgICAgICAgICAgICAgICAgIDEyCiAjZGVmaW5lIE5VTV9NVVRFWCAgICAgICAgICAgICAgICAgICAgICAgTUFYX01VVEVYKzEKIAotCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogI2lmZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKIAogLyogTmFtZXMgZm9yIHRoZSBtdXRleGVzIHVzZWQgaW4gdGhlIHN1YnN5c3RlbSAqLwogCi1zdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfbXV0ZXhfbmFtZXNbXSA9Ci17CitzdGF0aWMgY2hhciAqYWNwaV9nYmxfbXV0ZXhfbmFtZXNbXSA9IHsKIAkiQUNQSV9NVFhfRXhlY3V0ZSIsCiAJIkFDUElfTVRYX0ludGVycHJldGVyIiwKIAkiQUNQSV9NVFhfUGFyc2VyIiwKQEAgLTExNSwzNCArMTE1LDI4IEBACiAjZW5kaWYKICNlbmRpZgogCisvKiBPd25lciBJRHMgYXJlIHVzZWQgdG8gdHJhY2sgbmFtZXNwYWNlIG5vZGVzIGZvciBzZWxlY3RpdmUgZGVsZXRpb24gKi8KKwordHlwZWRlZiB1OCBhY3BpX293bmVyX2lkOworI2RlZmluZSBBQ1BJX09XTkVSX0lEX01BWCAgICAgICAgICAgICAgIDB4RkYKKworLyogVGhpcyBUaHJlYWQgSUQgbWVhbnMgdGhhdCB0aGUgbXV0ZXggaXMgbm90IGluIHVzZSAodW5sb2NrZWQpICovCisKKyNkZWZpbmUgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQgICAgICAgICAodTMyKSAtMQogCiAvKiBUYWJsZSBmb3IgdGhlIGdsb2JhbCBtdXRleGVzICovCiAKLXN0cnVjdCBhY3BpX211dGV4X2luZm8KLXsKLQlhY3BpX211dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ7CitzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvIHsKKwlhY3BpX211dGV4IG11dGV4OworCXUzMiB1c2VfY291bnQ7CisJdTMyIHRocmVhZF9pZDsKIH07CiAKLS8qIFRoaXMgb3duZXIgSUQgbWVhbnMgdGhhdCB0aGUgbXV0ZXggaXMgbm90IGluIHVzZSAodW5sb2NrZWQpICovCi0KLSNkZWZpbmUgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQgICAgICAgICAodTMyKSAoLTEpCi0KLQogLyogTG9jayBmbGFnIHBhcmFtZXRlciBmb3IgdmFyaW91cyBpbnRlcmZhY2VzICovCiAKICNkZWZpbmUgQUNQSV9NVFhfRE9fTk9UX0xPQ0sgICAgICAgICAgICAwCiAjZGVmaW5lIEFDUElfTVRYX0xPQ0sgICAgICAgICAgICAgICAgICAgMQogCi0KLXR5cGVkZWYgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfb3duZXJfaWQ7Ci0jZGVmaW5lIEFDUElfT1dORVJfVFlQRV9UQUJMRSAgICAgICAgICAgMHgwCi0jZGVmaW5lIEFDUElfT1dORVJfVFlQRV9NRVRIT0QgICAgICAgICAgMHgxCi0jZGVmaW5lIEFDUElfRklSU1RfTUVUSE9EX0lEICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEFDUElfRklSU1RfVEFCTEVfSUQgICAgICAgICAgICAgMHhGMDAwCi0KLQogLyogRmllbGQgYWNjZXNzIGdyYW51bGFyaXRpZXMgKi8KIAogI2RlZmluZSBBQ1BJX0ZJRUxEX0JZVEVfR1JBTlVMQVJJVFkgICAgIDEKQEAgLTE1MCw3ICsxNDQsNiBAQAogI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKICNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTmFtZXNwYWNlIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCkBAIC0xNTksMTUgKzE1MiwxMiBAQAogCiAvKiBPcGVyYXRpb25hbCBtb2RlcyBvZiB0aGUgQU1MIGludGVycHJldGVyL3NjYW5uZXIgKi8KIAotdHlwZWRlZiBlbnVtCi17Ci0JQUNQSV9JTU9ERV9MT0FEX1BBU1MxICAgICAgICAgICAgICAgPSAweDAxLAotCUFDUElfSU1PREVfTE9BRF9QQVNTMiAgICAgICAgICAgICAgID0gMHgwMiwKLQlBQ1BJX0lNT0RFX0VYRUNVVEUgICAgICAgICAgICAgICAgICA9IDB4MEUKLQordHlwZWRlZiBlbnVtIHsKKwlBQ1BJX0lNT0RFX0xPQURfUEFTUzEgPSAweDAxLAorCUFDUElfSU1PREVfTE9BRF9QQVNTMiA9IDB4MDIsCisJQUNQSV9JTU9ERV9FWEVDVVRFID0gMHgwRQogfSBhY3BpX2ludGVycHJldGVyX21vZGU7CiAKLQogLyoKICAqIFRoZSBOb2RlIGRlc2NyaWJlcyBhIG5hbWVkIG9iamVjdCB0aGF0IGFwcGVhcnMgaW4gdGhlIEFNTAogICogQW4gYWNwaV9ub2RlIGlzIHVzZWQgdG8gc3RvcmUgTm9kZXMuCkBAIC0xNzUsMzQgKzE2NSwzNyBAQAogICogZGF0YV90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLCBhbmQgTVVTVAogICogYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhpcyBzdHJ1Y3R1cmUuCiAgKi8KLXVuaW9uIGFjcGlfbmFtZV91bmlvbgotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjaWlbNF07Cit1bmlvbiBhY3BpX25hbWVfdW5pb24geworCXUzMiBpbnRlZ2VyOworCWNoYXIgYXNjaWlbNF07CiB9OwogCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I7ICAgICAvKiBVc2VkIHRvIGRpZmZlcmVudGlhdGUgb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogVHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuYW1lICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ7Ci0JdW5pb24gYWNwaV9uYW1lX3VuaW9uICAgICAgICAgICAgICAgbmFtZTsgICAgICAgICAgIC8qIEFDUEkgTmFtZSwgYWx3YXlzIDQgY2hhcnMgcGVyIEFDUEkgc3BlYyAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvYmplY3Q7ICAgICAgICAvKiBQb2ludGVyIHRvIGF0dGFjaGVkIEFDUEkgb2JqZWN0IChvcHRpb25hbCkgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqY2hpbGQ7ICAgICAgICAgLyogRmlyc3QgY2hpbGQgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqcGVlcjsgICAgICAgICAgLyogTmV4dCBwZWVyKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfY291bnQ7IC8qIEN1cnJlbnQgY291bnQgb2YgcmVmZXJlbmNlcyBhbmQgY2hpbGRyZW4gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLX07CitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSB7CisJdTggZGVzY3JpcHRvcjsJCS8qIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLworCXU4IHR5cGU7CQkvKiBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUgKi8KKwl1MTYgcmVmZXJlbmNlX2NvdW50OwkvKiBDdXJyZW50IGNvdW50IG9mIHJlZmVyZW5jZXMgYW5kIGNoaWxkcmVuICovCisJdW5pb24gYWNwaV9uYW1lX3VuaW9uIG5hbWU7CS8qIEFDUEkgTmFtZSwgYWx3YXlzIDQgY2hhcnMgcGVyIEFDUEkgc3BlYyAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsJLyogUG9pbnRlciB0byBhdHRhY2hlZCBBQ1BJIG9iamVjdCAob3B0aW9uYWwpICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkOwkvKiBGaXJzdCBjaGlsZCAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwZWVyOwkvKiBOZXh0IHBlZXIgKi8KKwl1OCBvd25lcl9pZDsJCS8qIFdobyBjcmVhdGVkIHRoaXMgbm9kZSAqLworCXU4IGZsYWdzOwogCisJLyogRmllbGRzIHVzZWQgYnkgdGhlIEFTTCBjb21waWxlciBvbmx5ICovCisKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgorCXUzMiB2YWx1ZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisjZW5kaWYKK307CiAKICNkZWZpbmUgQUNQSV9FTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICBOVUxMCiAKLQogLyogTm9kZSBmbGFncyAqLwogCiAjZGVmaW5lIEFOT0JKX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQU5PQkpfREFUQV9XSURUSF8zMiAgICAgICAgICAgICAweDA0ICAgICAvKiBQYXJlbnQgdGFibGUgaXMgNjQtYml0cyAqLworI2RlZmluZSBBTk9CSl9EQVRBX1dJRFRIXzMyICAgICAgICAgICAgIDB4MDQJLyogUGFyZW50IHRhYmxlIGlzIDY0LWJpdHMgKi8KICNkZWZpbmUgQU5PQkpfTUVUSE9EX0FSRyAgICAgICAgICAgICAgICAweDA4CiAjZGVmaW5lIEFOT0JKX01FVEhPRF9MT0NBTCAgICAgICAgICAgICAgMHgxMAogI2RlZmluZSBBTk9CSl9NRVRIT0RfTk9fUkVUVkFMICAgICAgICAgIDB4MjAKQEAgLTIxMiw5MSArMjA1LDc3IEBACiAvKgogICogQUNQSSBUYWJsZSBEZXNjcmlwdG9yLiAgT25lIHBlciBBQ1BJIHRhYmxlCiAgKi8KLXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICpwcmV2OwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKm5leHQ7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqaW5zdGFsbGVkX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqcG9pbnRlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQ7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbF9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX293bmVyX2lkICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb247Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRfaW50b19uYW1lc3BhY2U7CitzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICpwcmV2OworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5leHQ7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqaW5zdGFsbGVkX2Rlc2M7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpwb2ludGVyOworCXU4ICphbWxfc3RhcnQ7CisJdTY0IHBoeXNpY2FsX2FkZHJlc3M7CisJdTMyIGFtbF9sZW5ndGg7CisJYWNwaV9zaXplIGxlbmd0aDsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOworCXU4IHR5cGU7CisJdTggYWxsb2NhdGlvbjsKKwl1OCBsb2FkZWRfaW50b19uYW1lc3BhY2U7CiB9OwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9saXN0Ci17Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqbmV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oworc3RydWN0IGFjcGlfdGFibGVfbGlzdCB7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqbmV4dDsKKwl1MzIgY291bnQ7CiB9OwogCi0KLXN0cnVjdCBhY3BpX2ZpbmRfY29udGV4dAotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlYXJjaF9mb3I7Ci0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqbGlzdDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb3VudDsKK3N0cnVjdCBhY3BpX2ZpbmRfY29udGV4dCB7CisJY2hhciAqc2VhcmNoX2ZvcjsKKwlhY3BpX2hhbmRsZSAqbGlzdDsKKwl1MzIgKmNvdW50OwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9uc19zZWFyY2hfZGF0YQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7CitzdHJ1Y3QgYWNwaV9uc19zZWFyY2hfZGF0YSB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiB9OwogCi0KIC8qCiAgKiBQcmVkZWZpbmVkIE5hbWVzcGFjZSBpdGVtcwogICovCi1zdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsOworc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyB7CisJY2hhciAqbmFtZTsKKwl1OCB0eXBlOworCWNoYXIgKnZhbDsKIH07CiAKLQogLyogT2JqZWN0IHR5cGVzIHVzZWQgZHVyaW5nIHBhY2thZ2UgY29waWVzICovCiAKLQogI2RlZmluZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEUgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSAgICAgICAgICAxCiAKIC8qIEluZm8gc3RydWN0dXJlIHVzZWQgdG8gY29udmVydCBleHRlcm5hbDwtPmludGVybmFsIG5hbWVzdHJpbmdzICovCiAKLXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbwotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX25hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmV4dF9leHRlcm5hbF9jaGFyOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VnbWVudHM7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2FyYXRzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlfcXVhbGlmaWVkOworc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvIHsKKwljaGFyICpleHRlcm5hbF9uYW1lOworCWNoYXIgKm5leHRfZXh0ZXJuYWxfY2hhcjsKKwljaGFyICppbnRlcm5hbF9uYW1lOworCXUzMiBsZW5ndGg7CisJdTMyIG51bV9zZWdtZW50czsKKwl1MzIgbnVtX2NhcmF0czsKKwl1OCBmdWxseV9xdWFsaWZpZWQ7CiB9OwogCi0KIC8qIEZpZWxkIGNyZWF0aW9uIGluZm8gKi8KIAotc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpyZWdpb25fbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpmaWVsZF9ub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnJlZ2lzdGVyX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGF0YV9yZWdpc3Rlcl9ub2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFua192YWx1ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU7CitzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpmaWVsZF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpc3Rlcl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkYXRhX3JlZ2lzdGVyX25vZGU7CisJdTMyIGJhbmtfdmFsdWU7CisJdTMyIGZpZWxkX2JpdF9wb3NpdGlvbjsKKwl1MzIgZmllbGRfYml0X2xlbmd0aDsKKwl1OCBmaWVsZF9mbGFnczsKKwl1OCBhdHRyaWJ1dGU7CisJdTggZmllbGRfdHlwZTsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRXZlbnQgdHlwZWRlZnMgYW5kIHN0cnVjdHMKQEAgLTMwNSwxMDggKzI4NCw5NSBAQAogCiAvKiBEaXNwYXRjaCBpbmZvIGZvciBlYWNoIEdQRSAtLSBlaXRoZXIgYSBtZXRob2Qgb3IgaGFuZGxlciwgY2Fubm90IGJlIGJvdGggKi8KIAotc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvCi17Ci0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAvKiBBZGRyZXNzIG9mIGhhbmRsZXIsIGlmIGFueSAqLwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dDsgICAgICAgLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbWV0aG9kX25vZGU7ICAgLyogTWV0aG9kIG5vZGUgZm9yIHRoaXMgR1BFIGxldmVsIChzYXZlZCkgKi8KK3N0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyB7CisJYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgaGFuZGxlciwgaWYgYW55ICovCisJdm9pZCAqY29udGV4dDsJCS8qIENvbnRleHQgdG8gYmUgcGFzc2VkIHRvIGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CS8qIE1ldGhvZCBub2RlIGZvciB0aGlzIEdQRSBsZXZlbCAoc2F2ZWQpICovCiB9OwogCi11bmlvbiBhY3BpX2dwZV9kaXNwYXRjaF9pbmZvCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgICAgICptZXRob2Rfbm9kZTsgICAvKiBNZXRob2Qgbm9kZSBmb3IgdGhpcyBHUEUgbGV2ZWwgKi8KLQlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gICAgICAgICAgICAgICAgKmhhbmRsZXI7Cit1bmlvbiBhY3BpX2dwZV9kaXNwYXRjaF9pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CS8qIE1ldGhvZCBub2RlIGZvciB0aGlzIEdQRSBsZXZlbCAqLworCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKIH07CiAKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSwgb25lIHBlciBlYWNoIEdQRSBpbiBhbiBhcnJheS4KICAqIE5PVEU6IEltcG9ydGFudCB0byBrZWVwIHRoaXMgc3RydWN0IGFzIHNtYWxsIGFzIHBvc3NpYmxlLgogICovCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbwotewotCXVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gICAgZGlzcGF0Y2g7ICAgICAgIC8qIEVpdGhlciBNZXRob2Qgb3IgSGFuZGxlciAqLwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICAgICAgICAgICAqcmVnaXN0ZXJfaW5mbzsgLyogQmFja3BvaW50ZXIgdG8gcmVnaXN0ZXIgaW5mbyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTWlzYyBpbmZvIGFib3V0IHRoaXMgR1BFICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdDsgICAvKiBUaGlzIEdQRSBiaXQgd2l0aGluIHRoZSByZWdpc3RlciAqLworc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8geworCXVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gZGlzcGF0Y2g7CS8qIEVpdGhlciBNZXRob2Qgb3IgSGFuZGxlciAqLworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpyZWdpc3Rlcl9pbmZvOwkvKiBCYWNrcG9pbnRlciB0byByZWdpc3RlciBpbmZvICovCisJdTggZmxhZ3M7CQkvKiBNaXNjIGluZm8gYWJvdXQgdGhpcyBHUEUgKi8KKwl1OCByZWdpc3Rlcl9iaXQ7CS8qIFRoaXMgR1BFIGJpdCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCiB9OwogCiAvKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBwYWlyLCBvbmUgcGVyIGVhY2ggc3RhdHVzL2VuYWJsZSBwYWlyIGluIGFuIGFycmF5ICovCiAKLXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvCi17Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAgICAgICAgIHN0YXR1c19hZGRyZXNzOyAvKiBBZGRyZXNzIG9mIHN0YXR1cyByZWcgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICAgICAgICAgZW5hYmxlX2FkZHJlc3M7IC8qIEFkZHJlc3Mgb2YgZW5hYmxlIHJlZyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZm9yX3dha2U7IC8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gc2xlZXBpbmcgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2Zvcl9ydW47IC8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gcnVubmluZyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2dwZV9udW1iZXI7IC8qIEJhc2UgR1BFIG51bWJlciBmb3IgdGhpcyByZWdpc3RlciAqLworc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8geworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzdGF0dXNfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBzdGF0dXMgcmVnICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGVuYWJsZV9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGVuYWJsZSByZWcgKi8KKwl1OCBlbmFibGVfZm9yX3dha2U7CS8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gc2xlZXBpbmcgKi8KKwl1OCBlbmFibGVfZm9yX3J1bjsJLyogR1BFcyB0byBrZWVwIGVuYWJsZWQgd2hlbiBydW5uaW5nICovCisJdTggYmFzZV9ncGVfbnVtYmVyOwkvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KIH07CiAKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBibG9jaywgb25lIHBlciBlYWNoIGluc3RhbGxlZCBibG9jayAtLQogICogR1BFMCwgR1BFMSwgYW5kIG9uZSBwZXIgZWFjaCBpbnN0YWxsZWQgR1BFIEJsb2NrIERldmljZS4KICAqLwotc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAgICAgICAgICpwcmV2aW91czsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICAgICAgICAgKm5leHQ7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAgICAgICAgICp4cnVwdF9ibG9jazsgICAvKiBCYWNrcG9pbnRlciB0byBpbnRlcnJ1cHQgYmxvY2sgKi8KLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAgICAgICAgICAgKnJlZ2lzdGVyX2luZm87IC8qIE9uZSBwZXIgR1BFIHJlZ2lzdGVyIHBhaXIgKi8KLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAgICAgICAgICAgICAgKmV2ZW50X2luZm87ICAgIC8qIE9uZSBmb3IgZWFjaCBHUEUgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgICAgICAgICAgYmxvY2tfYWRkcmVzczsgIC8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQ7IC8qIE51bWJlciBvZiByZWdpc3RlciBwYWlycyBpbiBibG9jayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19iYXNlX251bWJlcjsvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKi8KK3N0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqcHJldmlvdXM7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHQ7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKnhydXB0X2Jsb2NrOwkvKiBCYWNrcG9pbnRlciB0byBpbnRlcnJ1cHQgYmxvY2sgKi8KKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqcmVnaXN0ZXJfaW5mbzsJLyogT25lIHBlciBHUEUgcmVnaXN0ZXIgcGFpciAqLworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpldmVudF9pbmZvOwkvKiBPbmUgZm9yIGVhY2ggR1BFICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGJsb2NrX2FkZHJlc3M7CS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgKi8KKwl1MzIgcmVnaXN0ZXJfY291bnQ7CS8qIE51bWJlciBvZiByZWdpc3RlciBwYWlycyBpbiBibG9jayAqLworCXU4IGJsb2NrX2Jhc2VfbnVtYmVyOwkvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKi8KIH07CiAKIC8qIEluZm9ybWF0aW9uIGFib3V0IEdQRSBpbnRlcnJ1cHQgaGFuZGxlcnMsIG9uZSBwZXIgZWFjaCBpbnRlcnJ1cHQgbGV2ZWwgdXNlZCBmb3IgR1BFcyAqLwogCi1zdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbwotewotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgICAgICAgICAqcHJldmlvdXM7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAgICAgICAgICpuZXh0OwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgICAgICAgICAqZ3BlX2Jsb2NrX2xpc3RfaGVhZDsgLyogTGlzdCBvZiBHUEUgYmxvY2tzIGZvciB0aGlzIHhydXB0ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbDsgICAgLyogU3lzdGVtIGludGVycnVwdCBsZXZlbCAqLworc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8geworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpwcmV2aW91czsKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dDsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrX2xpc3RfaGVhZDsJLyogTGlzdCBvZiBHUEUgYmxvY2tzIGZvciB0aGlzIHhydXB0ICovCisJdTMyIGludGVycnVwdF9udW1iZXI7CS8qIFN5c3RlbSBpbnRlcnJ1cHQgbnVtYmVyICovCiB9OwogCi0KLXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8KLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKmdwZV9kZXZpY2U7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAgICAgICAgICpncGVfYmxvY2s7CitzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogfTsKIAotCi10eXBlZGVmIGFjcGlfc3RhdHVzICgqQUNQSV9HUEVfQ0FMTEJBQ0spICgKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwotCit0eXBlZGVmIGFjcGlfc3RhdHVzKCpBQ1BJX0dQRV9DQUxMQkFDSykgKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICoKKwkJCQkJIGdwZV94cnVwdF9pbmZvLAorCQkJCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKgorCQkJCQkgZ3BlX2Jsb2NrKTsKIAogLyogSW5mb3JtYXRpb24gYWJvdXQgZWFjaCBwYXJ0aWN1bGFyIGZpeGVkIGV2ZW50ICovCiAKLXN0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2hhbmRsZXIKLXsKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGhhbmRsZXI7ICAgICAgICAvKiBBZGRyZXNzIG9mIGhhbmRsZXIuICovCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dDsgICAgICAgLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLworc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaGFuZGxlciB7CisJYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXI7CS8qIEFkZHJlc3Mgb2YgaGFuZGxlci4gKi8KKwl2b2lkICpjb250ZXh0OwkJLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLwogfTsKIAotc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JlZ2lzdGVyX2lkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2JpdF9tYXNrOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2JpdF9tYXNrOworc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbyB7CisJdTggc3RhdHVzX3JlZ2lzdGVyX2lkOworCXU4IGVuYWJsZV9yZWdpc3Rlcl9pZDsKKwl1MTYgc3RhdHVzX2JpdF9tYXNrOworCXUxNiBlbmFibGVfYml0X21hc2s7CiB9OwogCiAvKiBJbmZvcm1hdGlvbiB1c2VkIGR1cmluZyBmaWVsZCBwcm9jZXNzaW5nICovCiAKLXN0cnVjdCBhY3BpX2ZpZWxkX2luZm8KLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFnOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnX2xlbmd0aDsKK3N0cnVjdCBhY3BpX2ZpZWxkX2luZm8geworCXU4IHNraXBfZmllbGQ7CisJdTggZmllbGRfZmxhZzsKKwl1MzIgcGtnX2xlbmd0aDsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogR2VuZXJpYyAic3RhdGUiIG9iamVjdCBmb3Igc3RhY2tzCkBAIC00MTksMTQgKzM4NSw2IEBACiAjZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRkFMU0UgICAgICAgICAweEMzCiAjZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfVFJVRSAgICAgICAgICAweEM0CiAKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgOwotc3RydWN0IGFjcGlfb2JqX211dGV4OwotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgIDsKLQotCiAjZGVmaW5lIEFDUElfU1RBVEVfQ09NTU9OICAgICAgICAgICAgICAgICAgLyogVHdvIDMyLWJpdCBmaWVsZHMgYW5kIGEgcG9pbnRlciAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7ICAgICAgICAgIC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgIFwKQEAgLTQzNSwxNDcgKzM5MywxMTIgQEAKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICBcCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQ7ICAgICAgXAogCi1zdHJ1Y3QgYWNwaV9jb21tb25fc3RhdGUKLXsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotfTsKLQorc3RydWN0IGFjcGlfY29tbW9uX3N0YXRlIHsKK0FDUElfU1RBVEVfQ09NTU9OfTsKIAogLyoKICAqIFVwZGF0ZSBzdGF0ZSAtIHVzZWQgdG8gdHJhdmVyc2UgY29tcGxleCBvYmplY3RzIHN1Y2ggYXMgcGFja2FnZXMKICAqLwotc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqb2JqZWN0Oworc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlIHsKKwlBQ1BJX1NUQVRFX0NPTU1PTiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiB9OwogCi0KIC8qCiAgKiBQa2cgc3RhdGUgLSB1c2VkIHRvIHRyYXZlcnNlIG5lc3RlZCBwYWNrYWdlIHN0cnVjdHVyZXMKICAqLwotc3RydWN0IGFjcGlfcGtnX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqc291cmNlX29iamVjdDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqZGVzdF9vYmplY3Q7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAgKndhbGtfc3RhdGU7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoaXNfdGFyZ2V0X29iajsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFja2FnZXM7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CitzdHJ1Y3QgYWNwaV9wa2dfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmplY3Q7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKKwl2b2lkICp0aGlzX3RhcmdldF9vYmo7CisJdTMyIG51bV9wYWNrYWdlczsKKwl1MTYgaW5kZXg7CiB9OwogCi0KIC8qCiAgKiBDb250cm9sIHN0YXRlIC0gb25lIHBlciBpZi9lbHNlIGFuZCB3aGlsZSBjb25zdHJ1Y3RzLgogICogQWxsb3dzIG5lc3Rpbmcgb2YgdGhlc2UgY29uc3RydWN0cwogICovCi1zdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqcHJlZGljYXRlX29wOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfcHJlZGljYXRlX3N0YXJ0OyAgIC8qIFN0YXJ0IG9mIGlmL3doaWxlIHByZWRpY2F0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYWNrYWdlX2VuZDsgICAgICAgICAgIC8qIEVuZCBvZiBpZi93aGlsZSBibG9jayAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKK3N0cnVjdCBhY3BpX2NvbnRyb2xfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmVkaWNhdGVfb3A7CisJdTggKmFtbF9wcmVkaWNhdGVfc3RhcnQ7CS8qIFN0YXJ0IG9mIGlmL3doaWxlIHByZWRpY2F0ZSAqLworCXU4ICpwYWNrYWdlX2VuZDsJLyogRW5kIG9mIGlmL3doaWxlIGJsb2NrICovCisJdTE2IG9wY29kZTsKIH07CiAKLQogLyoKICAqIFNjb3BlIHN0YXRlIC0gY3VycmVudCBzY29wZSBkdXJpbmcgbmFtZXNwYWNlIGxvb2t1cHMKICAqLwotc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUKLXsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICpub2RlOworc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUKLXsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpvcDsgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgb3AgYmVpbmcgcGFyc2VkICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ19lbmQ7ICAgICAgICAgICAgICAgLyogQ3VycmVudCBhcmd1bWVudCBlbmQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGtnX2VuZDsgICAgICAgICAgICAgICAvKiBDdXJyZW50IHBhY2thZ2UgZW5kICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3Q7ICAgICAgICAgICAgICAgLyogTmV4dCBhcmd1bWVudCB0byBwYXJzZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19jb3VudDsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMgKi8KK3N0cnVjdCBhY3BpX3BzY29wZV9zdGF0ZSB7CisJQUNQSV9TVEFURV9DT01NT04gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwkvKiBDdXJyZW50IG9wIGJlaW5nIHBhcnNlZCAqLworCXU4ICphcmdfZW5kOwkJLyogQ3VycmVudCBhcmd1bWVudCBlbmQgKi8KKwl1OCAqcGtnX2VuZDsJCS8qIEN1cnJlbnQgcGFja2FnZSBlbmQgKi8KKwl1MzIgYXJnX2xpc3Q7CQkvKiBOZXh0IGFyZ3VtZW50IHRvIHBhcnNlICovCisJdTMyIGFyZ19jb3VudDsJCS8qIE51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMgKi8KIH07CiAKLQogLyoKICAqIFRocmVhZCBzdGF0ZSAtIG9uZSBwZXIgdGhyZWFkIGFjcm9zcyBtdWx0aXBsZSB3YWxrIHN0YXRlcy4gIE11bHRpcGxlIHdhbGsKICAqIHN0YXRlcyBhcmUgY3JlYXRlZCB3aGVuIHRoZXJlIGFyZSBuZXN0ZWQgY29udHJvbCBtZXRob2RzIGV4ZWN1dGluZy4KICAqLwotc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICAgICAqd2Fsa19zdGF0ZV9saXN0OyAgICAgICAvKiBIZWFkIG9mIGxpc3Qgb2Ygd2Fsa19zdGF0ZXMgZm9yIHRoaXMgdGhyZWFkICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKmFjcXVpcmVkX211dGV4X2xpc3Q7ICAgLyogTGlzdCBvZiBhbGwgY3VycmVudGx5IGFjcXVpcmVkIG11dGV4ZXMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWQ7ICAgICAgICAgICAgICAvKiBSdW5uaW5nIHRocmVhZCBJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc3luY19sZXZlbDsgICAgIC8qIE11dGV4IFN5bmMgKG5lc3RlZCBhY3F1aXJlKSBsZXZlbCAqLworc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlIHsKKwlBQ1BJX1NUQVRFX0NPTU1PTiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlX2xpc3Q7CS8qIEhlYWQgb2YgbGlzdCBvZiB3YWxrX3N0YXRlcyBmb3IgdGhpcyB0aHJlYWQgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3F1aXJlZF9tdXRleF9saXN0OwkvKiBMaXN0IG9mIGFsbCBjdXJyZW50bHkgYWNxdWlyZWQgbXV0ZXhlcyAqLworCXUzMiB0aHJlYWRfaWQ7CQkvKiBSdW5uaW5nIHRocmVhZCBJRCAqLworCXU4IGN1cnJlbnRfc3luY19sZXZlbDsJLyogTXV0ZXggU3luYyAobmVzdGVkIGFjcXVpcmUpIGxldmVsICovCiB9OwogCi0KIC8qCiAgKiBSZXN1bHQgdmFsdWVzIC0gdXNlZCB0byBhY2N1bXVsYXRlIHRoZSByZXN1bHRzIG9mIG5lc3RlZAogICogQU1MIGFyZ3VtZW50cwogICovCi1zdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzCi17CitzdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzIHsKIAlBQ1BJX1NUQVRFX0NPTU1PTgotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvYmpfZGVzYyBbQUNQSV9PQkpfTlVNX09QRVJBTkRTXTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcmVzdWx0czsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2luc2VydDsKKwkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2NbQUNQSV9PQkpfTlVNX09QRVJBTkRTXTsKKwl1OCBudW1fcmVzdWx0czsKKwl1OCBsYXN0X2luc2VydDsKIH07CiAKLQogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX3BhcnNlX2Rvd253YXJkcykgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICoqb3V0X29wKTsKK2FjcGlfc3RhdHVzKCphY3BpX3BhcnNlX2Rvd253YXJkcykgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKiBvdXRfb3ApOwogCi10eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFjcGlfcGFyc2VfdXB3YXJkcykgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQordHlwZWRlZiBhY3BpX3N0YXR1cygqYWNwaV9wYXJzZV91cHdhcmRzKSAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpOwogCiAvKgogICogTm90aWZ5IGluZm8gLSB1c2VkIHRvIHBhc3MgaW5mbyB0byB0aGUgZGVmZXJyZWQgbm90aWZ5CiAgKiBoYW5kbGVyL2Rpc3BhdGNoZXIuCiAgKi8KLXN0cnVjdCBhY3BpX25vdGlmeV9pbmZvCi17Ci0JQUNQSV9TVEFURV9DT01NT04KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqaGFuZGxlcl9vYmo7CitzdHJ1Y3QgYWNwaV9ub3RpZnlfaW5mbyB7CisJQUNQSV9TVEFURV9DT01NT04gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CiB9OwogCi0KIC8qIEdlbmVyaWMgc3RhdGUgaXMgdW5pb24gb2Ygc3RydWN0cyBhYm92ZSAqLwogCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUKLXsKLQlzdHJ1Y3QgYWNwaV9jb21tb25fc3RhdGUgICAgICAgICAgICBjb21tb247Ci0Jc3RydWN0IGFjcGlfY29udHJvbF9zdGF0ZSAgICAgICAgICAgY29udHJvbDsKLQlzdHJ1Y3QgYWNwaV91cGRhdGVfc3RhdGUgICAgICAgICAgICB1cGRhdGU7Ci0Jc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUgICAgICAgICAgICAgc2NvcGU7Ci0Jc3RydWN0IGFjcGlfcHNjb3BlX3N0YXRlICAgICAgICAgICAgcGFyc2Vfc2NvcGU7Ci0Jc3RydWN0IGFjcGlfcGtnX3N0YXRlICAgICAgICAgICAgICAgcGtnOwotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgICAgIHRocmVhZDsKLQlzdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzICAgICAgICAgICByZXN1bHRzOwotCXN0cnVjdCBhY3BpX25vdGlmeV9pbmZvICAgICAgICAgICAgIG5vdGlmeTsKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSB7CisJc3RydWN0IGFjcGlfY29tbW9uX3N0YXRlIGNvbW1vbjsKKwlzdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlIGNvbnRyb2w7CisJc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlIHVwZGF0ZTsKKwlzdHJ1Y3QgYWNwaV9zY29wZV9zdGF0ZSBzY29wZTsKKwlzdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUgcGFyc2Vfc2NvcGU7CisJc3RydWN0IGFjcGlfcGtnX3N0YXRlIHBrZzsKKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgdGhyZWFkOworCXN0cnVjdCBhY3BpX3Jlc3VsdF92YWx1ZXMgcmVzdWx0czsKKwlzdHJ1Y3QgYWNwaV9ub3RpZnlfaW5mbyBub3RpZnk7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVycHJldGVyIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYKLWFjcGlfc3RhdHVzICgqQUNQSV9FWEVDVVRFX09QKSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAgICAgKndhbGtfc3RhdGUpOwotCit0eXBlZGVmIGFjcGlfc3RhdHVzKCpBQ1BJX0VYRUNVVEVfT1ApIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU4NiwyOCArNTA5LDI2IEBACiAvKgogICogQU1MIG9wY29kZSwgbmFtZSwgYW5kIGFyZ3VtZW50IGxheW91dAogICovCi1zdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbwoteworc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gewogI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWU7ICAgICAgICAgIC8qIE9wY29kZSBuYW1lIChkaXNhc3NlbWJsZXIvZGVidWcgb25seSkgKi8KKwljaGFyICpuYW1lOwkJLyogT3Bjb2RlIG5hbWUgKGRpc2Fzc2VtYmxlci9kZWJ1ZyBvbmx5KSAqLwogI2VuZGlmCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfYXJnczsgICAgIC8qIEdyYW1tYXIvUGFyc2UgdGltZSBhcmd1bWVudHMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lX2FyZ3M7ICAgLyogSW50ZXJwcmV0IHRpbWUgYXJndW1lbnRzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIE1pc2MgZmxhZ3MgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZTsgICAgLyogQ29ycmVzcG9uZGluZyBpbnRlcm5hbCBvYmplY3QgdHlwZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOyAgICAgICAgICAvKiBPcGNvZGUgY2xhc3MgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogT3Bjb2RlIHR5cGUgKi8KKwl1MzIgcGFyc2VfYXJnczsJCS8qIEdyYW1tYXIvUGFyc2UgdGltZSBhcmd1bWVudHMgKi8KKwl1MzIgcnVudGltZV9hcmdzOwkvKiBJbnRlcnByZXQgdGltZSBhcmd1bWVudHMgKi8KKwl1MzIgZmxhZ3M7CQkvKiBNaXNjIGZsYWdzICovCisJdTggb2JqZWN0X3R5cGU7CQkvKiBDb3JyZXNwb25kaW5nIGludGVybmFsIG9iamVjdCB0eXBlICovCisJdTggY2xhc3M7CQkvKiBPcGNvZGUgY2xhc3MgKi8KKwl1OCB0eXBlOwkJLyogT3Bjb2RlIHR5cGUgKi8KIH07CiAKLXVuaW9uIGFjcGlfcGFyc2VfdmFsdWUKLXsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOyAgICAgICAgLyogSW50ZWdlciBjb25zdGFudCAoVXAgdG8gNjQgYml0cykgKi8KLQlzdHJ1Y3QgdWludDY0X3N0cnVjdCAgICAgICAgICAgICAgICBpbnRlZ2VyNjQ7ICAgICAgLyogU3RydWN0dXJlIG92ZXJsYXkgZm9yIDIgMzItYml0IER3b3JkcyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgICAvKiBieXRlbGlzdCBvciBmaWVsZCBzaXplICovCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzsgICAgICAgIC8qIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOyAgICAgICAgLyogYnVmZmVyIG9yIHN0cmluZyAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lOyAgICAgICAgICAvKiBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nICovCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKmFyZzsgICAgICAgICAgIC8qIGFyZ3VtZW50cyBhbmQgY29udGFpbmVkIG9wcyAqLwordW5pb24gYWNwaV9wYXJzZV92YWx1ZSB7CisJYWNwaV9pbnRlZ2VyIGludGVnZXI7CS8qIEludGVnZXIgY29uc3RhbnQgKFVwIHRvIDY0IGJpdHMpICovCisJc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgaW50ZWdlcjY0OwkvKiBTdHJ1Y3R1cmUgb3ZlcmxheSBmb3IgMiAzMi1iaXQgRHdvcmRzICovCisJdTMyIHNpemU7CQkvKiBieXRlbGlzdCBvciBmaWVsZCBzaXplICovCisJY2hhciAqc3RyaW5nOwkJLyogTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyAqLworCXU4ICpidWZmZXI7CQkvKiBidWZmZXIgb3Igc3RyaW5nICovCisJY2hhciAqbmFtZTsJCS8qIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwkvKiBhcmd1bWVudHMgYW5kIGNvbnRhaW5lZCBvcHMgKi8KIH07CiAKICNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXApAQCAtNjM2LDg0ICs1NTcsNzIgQEAKIC8qCiAgKiBnZW5lcmljIG9wZXJhdGlvbiAoZm9yIGV4YW1wbGU6ICBJZiwgV2hpbGUsIFN0b3JlKQogICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uCi17Ci0JQUNQSV9QQVJTRV9DT01NT04KLX07Ci0KK3N0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24geworQUNQSV9QQVJTRV9DT01NT059OwogCiAvKgogICogRXh0ZW5kZWQgT3AgZm9yIG5hbWVkIG9wcyAoU2NvcGUsIE1ldGhvZCwgZXRjLiksIGRlZmVycmVkIG9wcyAoTWV0aG9kcyBhbmQgb3BfcmVnaW9ucyksCiAgKiBhbmQgYnl0ZWxpc3RzLgogICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQKLXsKLQlBQ1BJX1BBUlNFX0NPTU1PTgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhOyAgICAgICAgICAvKiBBTUwgYm9keSBvciBieXRlbGlzdCBkYXRhICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgICAgIC8qIEFNTCBsZW5ndGggKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOyAgICAgICAgICAgLyogNC1ieXRlIG5hbWUgb3IgemVybyBpZiBubyBuYW1lICovCitzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgeworCUFDUElfUEFSU0VfQ09NTU9OIHU4ICogcGF0aDsKKwl1OCAqZGF0YTsJCS8qIEFNTCBib2R5IG9yIGJ5dGVsaXN0IGRhdGEgKi8KKwl1MzIgbGVuZ3RoOwkJLyogQU1MIGxlbmd0aCAqLworCXUzMiBuYW1lOwkJLyogNC1ieXRlIG5hbWUgb3IgemVybyBpZiBubyBuYW1lICovCiB9OwogCi0KIC8qIFRoZSBwYXJzZSBub2RlIGlzIHRoZSBmdW5kYW1lbnRhbCBlbGVtZW50IG9mIHRoZSBwYXJzZSB0cmVlICovCiAKLXN0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wKLXsKLQlBQ1BJX1BBUlNFX0NPTU1PTgotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpjaGlsZDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqcGFyZW50X21ldGhvZDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsZW5hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX25hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVwYXRoOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc2VnWzRdOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3ZhbHVlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsX2xpbmVfbnVtYmVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxfYnl0ZV9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2xpbmU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2xvZ2ljYWxfbGluZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2J0eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX3N1YnRyZWVfbGVuZ3RoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2FtbF9sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfYW1sX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlX2ZsYWdzOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX29wY29kZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfcGtnX2xlbl9ieXRlczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYTsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9vcF9uYW1lWzEyXTsKK3N0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wgeworCUFDUElfUEFSU0VfQ09NTU9OIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpjaGlsZDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50X21ldGhvZDsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICpleHRlcm5hbF9uYW1lOworCWNoYXIgKm5hbWVwYXRoOworCWNoYXIgbmFtZV9zZWdbNF07CisJdTMyIGV4dHJhX3ZhbHVlOworCXUzMiBjb2x1bW47CisJdTMyIGxpbmVfbnVtYmVyOworCXUzMiBsb2dpY2FsX2xpbmVfbnVtYmVyOworCXUzMiBsb2dpY2FsX2J5dGVfb2Zmc2V0OworCXUzMiBlbmRfbGluZTsKKwl1MzIgZW5kX2xvZ2ljYWxfbGluZTsKKwl1MzIgYWNwaV9idHlwZTsKKwl1MzIgYW1sX2xlbmd0aDsKKwl1MzIgYW1sX3N1YnRyZWVfbGVuZ3RoOworCXUzMiBmaW5hbF9hbWxfbGVuZ3RoOworCXUzMiBmaW5hbF9hbWxfb2Zmc2V0OworCXUzMiBjb21waWxlX2ZsYWdzOworCXUxNiBwYXJzZV9vcGNvZGU7CisJdTggYW1sX29wY29kZV9sZW5ndGg7CisJdTggYW1sX3BrZ19sZW5fYnl0ZXM7CisJdTggZXh0cmE7CisJY2hhciBwYXJzZV9vcF9uYW1lWzEyXTsKIH07CiAKLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0Ci17Ci0Jc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiAgICAgICAgY29tbW9uOwotCXN0cnVjdCBhY3BpX3BhcnNlX29ial9uYW1lZCAgICAgICAgIG5hbWVkOwotCXN0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wgICAgICAgICAgIGFzbDsKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0IHsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgbmFtZWQ7CisJc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2FzbCBhc2w7CiB9OwogCi0KIC8qCiAgKiBQYXJzZSBzdGF0ZSAtIG9uZSBzdGF0ZSBwZXIgcGFyc2VyIGludm9jYXRpb24gYW5kIGVhY2ggY29udHJvbAogICogbWV0aG9kLgogICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9zaXplOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQ7ICAgICAvKiBGaXJzdCBBTUwgYnl0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWw7ICAgICAgICAgICAvKiBOZXh0IEFNTCBieXRlICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9lbmQ7ICAgICAgIC8qIChsYXN0ICsgMSkgQU1MIGJ5dGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGtnX3N0YXJ0OyAgICAgLyogQ3VycmVudCBwYWNrYWdlIGJlZ2luICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBrZ19lbmQ7ICAgICAgIC8qIEN1cnJlbnQgcGFja2FnZSBlbmQgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqc3RhcnRfb3A7ICAgICAgLyogUm9vdCBvZiBwYXJzZSB0cmVlICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgKnN0YXJ0X25vZGU7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgICAgKnNjb3BlOyAgICAgICAgIC8qIEN1cnJlbnQgc2NvcGUgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqc3RhcnRfc2NvcGU7CitzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSB7CisJdTMyIGFtbF9zaXplOworCXU4ICphbWxfc3RhcnQ7CQkvKiBGaXJzdCBBTUwgYnl0ZSAqLworCXU4ICphbWw7CQkvKiBOZXh0IEFNTCBieXRlICovCisJdTggKmFtbF9lbmQ7CQkvKiAobGFzdCArIDEpIEFNTCBieXRlICovCisJdTggKnBrZ19zdGFydDsJCS8qIEN1cnJlbnQgcGFja2FnZSBiZWdpbiAqLworCXU4ICpwa2dfZW5kOwkJLyogQ3VycmVudCBwYWNrYWdlIGVuZCAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9vcDsJLyogUm9vdCBvZiBwYXJzZSB0cmVlICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZTsJLyogQ3VycmVudCBzY29wZSAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9zY29wZTsKIH07CiAKLQogLyogUGFyc2Ugb2JqZWN0IGZsYWdzICovCiAKICNkZWZpbmUgQUNQSV9QQVJTRU9QX0dFTkVSSUMgICAgICAgICAgICAgICAgICAgIDB4MDEKQEAgLTcyOSw3ICs2MzgsNiBAQAogI2RlZmluZSBBQ1BJX1BBUlNFT1BfRU1QVFlfVEVSTUxJU1QgICAgICAgICAgICAgMHgwNAogI2RlZmluZSBBQ1BJX1BBUlNFT1BfU1BFQ0lBTCAgICAgICAgICAgICAgICAgICAgMHgxMAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEhhcmR3YXJlIChBQ1BJIHJlZ2lzdGVycykgYW5kIFBOUApAQCAtNzM3LDE1ICs2NDUsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIFBDSV9ST09UX0hJRF9TVFJJTkcgICAgICAgICAiUE5QMEEwMyIKKyNkZWZpbmUgUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HICJQTlAwQTA4IgogCi1zdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9yZWdpc3RlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfcG9zaXRpb247Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF9tYXNrOworc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8geworCXU4IHBhcmVudF9yZWdpc3RlcjsKKwl1OCBiaXRfcG9zaXRpb247CisJdTE2IGFjY2Vzc19iaXRfbWFzazsKIH07CiAKLQogLyoKICAqIFJlZ2lzdGVyIElEcwogICogVGhlc2UgYXJlIHRoZSBmdWxsIEFDUEkgcmVnaXN0ZXJzCkBAIC03NjAsNyArNjY3LDYgQEAKICNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QUk9DRVNTT1JfQkxPQ0sgICAgICAgICAgIDB4MDgKICNkZWZpbmUgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSyAgICAgICAgIDB4MDkKIAotCiAvKiBNYXNrcyB1c2VkIHRvIGFjY2VzcyB0aGUgYml0X3JlZ2lzdGVycyAqLwogCiAjZGVmaW5lIEFDUElfQklUTUFTS19USU1FUl9TVEFUVVMgICAgICAgICAgICAgICAweDAwMDEKQEAgLTc2OSw3ICs2NzUsNyBAQAogI2RlZmluZSBBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUyAgICAgICAgMHgwMTAwCiAjZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTICAgICAgICAweDAyMDAKICNkZWZpbmUgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVUyAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfU1RBVFVTICAgICAgICAgMHg0MDAwICAgIC8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVMgICAgICAgICAweDQwMDAJLyogQUNQSSAzLjAgKi8KICNkZWZpbmUgQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTICAgICAgICAgICAgICAgIDB4ODAwMAogCiAjZGVmaW5lIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTICAgICAgICAgICAoQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUyAgICAgICAgICB8IFwKQEAgLTc4NSw3ICs2OTEsNyBAQAogI2RlZmluZSBBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX0VOQUJMRSAgICAgICAgMHgwMTAwCiAjZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFICAgICAgICAweDAyMDAKICNkZWZpbmUgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRSAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfRElTQUJMRSAgICAgICAgMHg0MDAwICAgIC8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFICAgICAgICAweDQwMDAJLyogQUNQSSAzLjAgKi8KIAogI2RlZmluZSBBQ1BJX0JJVE1BU0tfU0NJX0VOQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIEFDUElfQklUTUFTS19CVVNfTUFTVEVSX1JMRCAgICAgICAgICAgICAweDAwMDIKQEAgLTc5NSw3ICs3MDEsNiBAQAogCiAjZGVmaW5lIEFDUElfQklUTUFTS19BUkJfRElTQUJMRSAgICAgICAgICAgICAgICAweDAwMDEKIAotCiAvKiBSYXcgYml0IHBvc2l0aW9uIG9mIGVhY2ggYml0X3JlZ2lzdGVyICovCiAKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9USU1FUl9TVEFUVVMgICAgICAgICAgIDB4MDAKQEAgLTgwNCw3ICs3MDksNyBAQAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9TVEFUVVMgICAgMHgwOAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9TVEFUVVMgICAgMHgwOQogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX1NUQVRVUyAgICAgICAgMHgwQQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUyAgICAgMHgwRSAgICAvKiBBQ1BJIDMuMCAqLworI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUyAgICAgMHgwRQkvKiBBQ1BJIDMuMCAqLwogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1dBS0VfU1RBVFVTICAgICAgICAgICAgMHgwRgogCiAjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fVElNRVJfRU5BQkxFICAgICAgICAgICAweDAwCkBAIC04MTIsNyArNzE3LDcgQEAKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fRU5BQkxFICAgIDB4MDgKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9CVVRUT05fRU5BQkxFICAgIDB4MDkKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9SVF9DTE9DS19FTkFCTEUgICAgICAgIDB4MEEKLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9ESVNBQkxFICAgIDB4MEUgICAgLyogQUNQSSAzLjAgKi8KKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9ESVNBQkxFICAgIDB4MEUJLyogQUNQSSAzLjAgKi8KIAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1NDSV9FTkFCTEUgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfUkxEICAgICAgICAgMHgwMQpAQCAtODIyLDcgKzcyNyw2IEBACiAKICNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9BUkJfRElTQUJMRSAgICAgICAgICAgIDB4MDAKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBSZXNvdXJjZSBkZXNjcmlwdG9ycwpAQCAtODQxLDggKzc0NSw3IEBACiAjZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9TTUFMTCAgICAgICAgICAgICAgICAgICAweDAwCiAKICNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgQUNQSV9SREVTQ19TTUFMTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4NzggLyogT25seSBiaXRzIDY6MyBjb250YWluIHRoZSB0eXBlICovCi0KKyNkZWZpbmUgQUNQSV9SREVTQ19TTUFMTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4NzgJLyogT25seSBiaXRzIDY6MyBjb250YWluIHRoZSB0eXBlICovCiAKIC8qCiAgKiBTbWFsbCByZXNvdXJjZSBkZXNjcmlwdG9yIHR5cGVzCkBAIC04NzEsNyArNzc0LDYgQEAKICNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX1FXT1JEX0FERFJFU1NfU1BBQ0UgICAgIDB4OEEKICNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX0FERFJFU1NfU1BBQ0UgIDB4OEIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBNaXNjZWxsYW5lb3VzCkBAIC04ODAsNDkgKzc4MiwzNiBAQAogCiAjZGVmaW5lIEFDUElfQVNDSUlfWkVSTyAgICAgICAgICAgICAgICAgICAgICAweDMwCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRGVidWdnZXIKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfZGJfbWV0aG9kX2luZm8KLXsKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9nYXRlOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWU7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmFyZ3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9sb29wczsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lWzEyOF07CitzdHJ1Y3QgYWNwaV9kYl9tZXRob2RfaW5mbyB7CisJYWNwaV9oYW5kbGUgdGhyZWFkX2dhdGU7CisJY2hhciAqbmFtZTsKKwljaGFyICoqYXJnczsKKwl1MzIgZmxhZ3M7CisJdTMyIG51bV9sb29wczsKKwljaGFyIHBhdGhuYW1lWzEyOF07CiB9OwogCi1zdHJ1Y3QgYWNwaV9pbnRlZ3JpdHlfaW5mbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBub2RlczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0czsKK3N0cnVjdCBhY3BpX2ludGVncml0eV9pbmZvIHsKKwl1MzIgbm9kZXM7CisJdTMyIG9iamVjdHM7CiB9OwogCi0KICNkZWZpbmUgQUNQSV9EQl9SRURJUkVDVEFCTEVfT1VUUFVUICAweDAxCiAjZGVmaW5lIEFDUElfREJfQ09OU09MRV9PVVRQVVQgICAgICAgMHgwMgogI2RlZmluZSBBQ1BJX0RCX0RVUExJQ0FURV9PVVRQVVQgICAgIDB4MDMKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBEZWJ1ZwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQ7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJvY19uYW1lOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lOwotfTsKLQotCiAvKiBFbnRyeSBmb3IgYSBtZW1vcnkgYWxsb2NhdGlvbiAoZGVidWcgb25seSkgKi8KIAogI2RlZmluZSBBQ1BJX01FTV9NQUxMT0MgICAgICAgICAgICAgICAgICAgICAgMApAQCAtOTM4LDUxICs4MjcsMzYgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVbQUNQSV9NQVhfTU9EVUxFX05BTUVdOyBcCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZTsKIAotc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlcgotewotCUFDUElfQ09NTU9OX0RFQlVHX01FTV9IRUFERVIKLX07CitzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyIHsKK0FDUElfQ09NTU9OX0RFQlVHX01FTV9IRUFERVJ9OwogCi1zdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sKLXsKLQlBQ1BJX0NPTU1PTl9ERUJVR19NRU1fSEVBREVSCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9zcGFjZTsKK3N0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayB7CisJQUNQSV9DT01NT05fREVCVUdfTUVNX0hFQURFUiB1NjQgdXNlcl9zcGFjZTsKIH07CiAKLQogI2RlZmluZSBBQ1BJX01FTV9MSVNUX0dMT0JBTCAgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9NRU1fTElTVF9OU05PREUgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfTUVNX0xJU1RfTUFYICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX05VTV9NRU1fTElTVFMgICAgICAgICAgICAgIDIKIAotI2RlZmluZSBBQ1BJX01FTV9MSVNUX0ZJUlNUX0NBQ0hFX0xJU1QgIDIKLSNkZWZpbmUgQUNQSV9NRU1fTElTVF9TVEFURSAgICAgICAgICAgICAyCi0jZGVmaW5lIEFDUElfTUVNX0xJU1RfUFNOT0RFICAgICAgICAgICAgMwotI2RlZmluZSBBQ1BJX01FTV9MSVNUX1BTTk9ERV9FWFQgICAgICAgIDQKLSNkZWZpbmUgQUNQSV9NRU1fTElTVF9PUEVSQU5EICAgICAgICAgICA1Ci0jZGVmaW5lIEFDUElfTUVNX0xJU1RfV0FMSyAgICAgICAgICAgICAgNgotI2RlZmluZSBBQ1BJX01FTV9MSVNUX01BWCAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQUNQSV9OVU1fTUVNX0xJU1RTICAgICAgICAgICAgICA3Ci0KLQotc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKLXsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGlzdF9oZWFkOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfb2Zmc2V0OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jYWNoZV9kZXB0aDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9kZXB0aDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc2l6ZTsKK3N0cnVjdCBhY3BpX21lbW9yeV9saXN0IHsKKwljaGFyICpsaXN0X25hbWU7CisJdm9pZCAqbGlzdF9oZWFkOworCXUxNiBvYmplY3Rfc2l6ZTsKKwl1MTYgbWF4X2RlcHRoOworCXUxNiBjdXJyZW50X2RlcHRoOworCXUxNiBsaW5rX29mZnNldDsKIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiAKIAkvKiBTdGF0aXN0aWNzIGZvciBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgb25seSAqLwogCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYWxsb2NhdGVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2ZyZWVkOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdG90YWxfc2l6ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9yZXF1ZXN0czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9oaXRzOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsaXN0X25hbWU7CisJdTMyIHRvdGFsX2FsbG9jYXRlZDsKKwl1MzIgdG90YWxfZnJlZWQ7CisJdTMyIGN1cnJlbnRfdG90YWxfc2l6ZTsKKwl1MzIgcmVxdWVzdHM7CisJdTMyIGhpdHM7CiAjZW5kaWYKIH07CiAKLQotI2VuZGlmIC8qIF9fQUNMT0NBTF9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDTE9DQUxfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaCBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCmluZGV4IDA5YmU5MzcuLjcwMmNjNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCkBAIC00NCw3ICs0NCw2IEBACiAjaWZuZGVmIF9fQUNNQUNST1NfSF9fCiAjZGVmaW5lIF9fQUNNQUNST1NfSF9fCiAKLQogLyoKICAqIERhdGEgbWFuaXB1bGF0aW9uIG1hY3JvcwogICovCkBAIC01Nyw3ICs1Niw2IEBACiAjZGVmaW5lIEFDUElfQ0xFQVJfQklUKHRhcmdldCxiaXQpICAgICAgKCh0YXJnZXQpICY9IH4oYml0KSkKICNkZWZpbmUgQUNQSV9NSU4oYSxiKSAgICAgICAgICAgICAgICAgICAoKChhKTwoYikpPyhhKTooYikpCiAKLQogI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgogCiAvKgpAQCAtMTY4LDcgKzE2Niw3IEBACiAKIC8qIDMyLWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCiAKICNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVszXTtcCiAJCQkJCQkJCQkgICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbMl07XApAQCAtMTgzLDkgKzE4MSw5IEBACiAKIC8qIDY0LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzMyKGQscykgICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAzMiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAKICNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzY0KGQscykgICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVs3XTtcCiAJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbNl07XApAQCAtMjE5LDE0ICsyMTcsMTQgQEAKIAogLyogMzItYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCisjZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KICNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgICAgICAqKHUzMiAqKSh2b2lkICopKGQpID0gKih1MzIgKikodm9pZCAqKShzKQogI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fNjQoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCiAKIC8qIDY0LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAvKiBUcnVuY2F0ZSB0byAxNiAqLwotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDMyICovCisjZGVmaW5lIEFDUElfTU9WRV82NF9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzMyKGQscykgICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKQkvKiBUcnVuY2F0ZSB0byAzMiAqLwogI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fNjQoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCiAKICNlbHNlCkBAIC0yMzgsMTQgKzIzNiwxNCBAQAogCiAvKiAzMi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwogCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykgICAgLyogVHJ1bmNhdGUgdG8gMTYgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLwogI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAgICAgICoodTMyICopKHZvaWQgKikoZCkgPSAqKHUzMiAqKSh2b2lkICopKHMpCiAjZGVmaW5lIEFDUElfTU9WRV8zMl9UT182NChkLHMpICAgICAgICAgKih1NjQgKikodm9pZCAqKShkKSA9ICoodTMyICopKHZvaWQgKikocykKIAogLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgLyogVHJ1bmNhdGUgdG8gMzIgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAjZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLHMpICAgICAgICAgKih1NjQgKikodm9pZCAqKShkKSA9ICoodTY0ICopKHZvaWQgKikocykKICNlbmRpZgogCkBAIC0yNjYsNyArMjY0LDcgQEAKIAogLyogMzItYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCisjZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KIAogI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAgICAgIHsoKCAgdTggKikodm9pZCAqKShkKSlbMF0gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO1wKIAkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzFdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCkBAIC0yNzcsOCArMjc1LDggQEAKIAogLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgIC8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykgICAgLyogVHJ1bmNhdGUgdG8gMzIgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAjZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLHMpICAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07XAogCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzFdO1wKIAkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzJdID0gKCh1OCAqKSh2b2lkICopKHMpKVsyXTtcCkBAIC0zMDUsNyArMzAzLDYgQEAKICNlcnJvciB1bmtub3duIEFDUElfTUFDSElORV9XSURUSAogI2VuZGlmCiAKLQogLyoKICAqIEZhc3QgcG93ZXItb2YtdHdvIG1hdGggbWFjcm9zIGZvciBub24tb3B0aW1pemVkIGNvbXBpbGVycwogICovCkBAIC0zMjksNyArMzI2LDYgQEAKICNkZWZpbmUgQUNQSV9NVUxfMTYoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NVUwoYSw0KQogI2RlZmluZSBBQ1BJX01PRF8xNihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX01PRChhLDE2KQogCi0KIC8qCiAgKiBSb3VuZGluZyBtYWNyb3MgKFBvd2VyIG9mIHR3byBib3VuZGFyaWVzIG9ubHkpCiAgKi8KQEAgLTM0NCw3ICszNDAsNiBAQAogI2RlZmluZSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMoYSkgICAgICAgICAgQUNQSV9ST1VORF9VUChhLDgpCiAjZGVmaW5lIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoYSkgICAgICBBQ1BJX1JPVU5EX1VQKGEsQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZKQogCi0KICNkZWZpbmUgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKGEpICAgICAgIEFDUElfRElWXzgoKGEpICsgNykKICNkZWZpbmUgQUNQSV9ST1VORF9CSVRTX0RPV05fVE9fQllURVMoYSkgICAgIEFDUElfRElWXzgoKGEpKQogCkBAIC0zNjUsNyArMzYwLDYgQEAKIAogI2RlZmluZSBBQ1BJX0lTX09DVEFMX0RJR0lUKGQpICAgICAgICAgICAgICAgKCgoY2hhcikoZCkgPj0gJzAnKSAmJiAoKGNoYXIpKGQpIDw9ICc3JykpCiAKLQogLyogQml0ZmllbGRzIHdpdGhpbiBBQ1BJIHJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIEFDUElfUkVHSVNURVJfUFJFUEFSRV9CSVRTKHZhbCwgcG9zLCBtYXNrKSAgICAgICgodmFsIDw8IHBvcykgJiBtYXNrKQpAQCAtMzgxLDcgKzM3NSw2IEBACiAjZGVmaW5lIEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShkKSAgICAgKCgodW5pb24gYWNwaV9kZXNjcmlwdG9yICopKHZvaWQgKikoZCkpLT5kZXNjcmlwdG9yX2lkKQogI2RlZmluZSBBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUoZCx0KSAgICgoKHVuaW9uIGFjcGlfZGVzY3JpcHRvciAqKSh2b2lkICopKGQpKS0+ZGVzY3JpcHRvcl9pZCA9IHQpCiAKLQogLyogTWFjcm8gdG8gdGVzdCB0aGUgb2JqZWN0IHR5cGUgKi8KIAogI2RlZmluZSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkKSAgICAgICAgICgoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikodm9pZCAqKShkKSktPmNvbW1vbi50eXBlKQpAQCAtNDMwLDI4ICs0MjMsMjggQEAKICNkZWZpbmUgR0VUX0NVUlJFTlRfQVJHX1RZUEUobGlzdCkgICAgICAobGlzdCAmICgodTMyKSAweDFGKSkKICNkZWZpbmUgSU5DUkVNRU5UX0FSR19MSVNUKGxpc3QpICAgICAgICAobGlzdCA+Pj0gKCh1MzIpIEFSR19UWVBFX1dJRFRIKSkKIAotCiAvKgogICogUmVwb3J0aW5nIG1hY3JvcyB0aGF0IGFyZSBuZXZlciBjb21waWxlZCBvdXQKICAqLwogI2RlZmluZSBBQ1BJX1BBUkFNX0xJU1QocGwpICAgICAgICAgICAgICAgICBwbAogCiAvKgotICogRXJyb3IgcmVwb3J0aW5nLiAgVGhlc2UgdmVyc2lvbnMgYWRkIGNhbGxlcnMgbW9kdWxlIGFuZCBsaW5lIy4gIFNpbmNlCi0gKiBfVEhJU19NT0RVTEUgZ2V0cyBjb21waWxlZCBvdXQgd2hlbiBBQ1BJX0RFQlVHX09VVFBVVCBpc24ndCBkZWZpbmVkLCBvbmx5Ci0gKiB1c2UgaXQgaW4gZGVidWcgbW9kZS4KKyAqIEVycm9yIHJlcG9ydGluZy4gIFRoZXNlIHZlcnNpb25zIGFkZCBjYWxsZXJzIG1vZHVsZSBhbmQgbGluZSMuCisgKgorICogU2luY2UgX2FjcGlfbW9kdWxlX25hbWUgZ2V0cyBjb21waWxlZCBvdXQgd2hlbiBBQ1BJX0RFQlVHX09VVFBVVAorICogaXNuJ3QgZGVmaW5lZCwgb25seSB1c2UgaXQgaW4gZGVidWcgbW9kZS4KICAqLwogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCiAKLSNkZWZpbmUgQUNQSV9SRVBPUlRfSU5GTyhmcCkgICAgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X2luZm8oX1RISVNfTU9EVUxFLF9fTElORV9fLF9DT01QT05FTlQpOyBcCisjZGVmaW5lIEFDUElfUkVQT1JUX0lORk8oZnApICAgICAgICAgICAgICAgIHthY3BpX3V0X3JlcG9ydF9pbmZvKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQpOyBcCiAJCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QoZnApO30KLSNkZWZpbmUgQUNQSV9SRVBPUlRfRVJST1IoZnApICAgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X2Vycm9yKF9USElTX01PRFVMRSxfX0xJTkVfXyxfQ09NUE9ORU5UKTsgXAorI2RlZmluZSBBQ1BJX1JFUE9SVF9FUlJPUihmcCkgICAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfZXJyb3IoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKIAkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9XQVJOSU5HKGZwKSAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfd2FybmluZyhfVEhJU19NT0RVTEUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKKyNkZWZpbmUgQUNQSV9SRVBPUlRfV0FSTklORyhmcCkgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKIAkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9OU0VSUk9SKHMsZSkgICAgICAgICAgICBhY3BpX25zX3JlcG9ydF9lcnJvcihfVEhJU19NT0RVTEUsX19MSU5FX18sX0NPTVBPTkVOVCwgcywgZSk7CisjZGVmaW5lIEFDUElfUkVQT1JUX05TRVJST1IocyxlKSAgICAgICAgICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQsIHMsIGUpOwogCi0jZGVmaW5lIEFDUElfUkVQT1JUX01FVEhPRF9FUlJPUihzLG4scCxlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihfVEhJU19NT0RVTEUsX19MSU5FX18sX0NPTVBPTkVOVCwgcywgbiwgcCwgZSk7CisjZGVmaW5lIEFDUElfUkVQT1JUX01FVEhPRF9FUlJPUihzLG4scCxlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXyxfQ09NUE9ORU5ULCBzLCBuLCBwLCBlKTsKIAogI2Vsc2UKIApAQCAtNDgwLDM2ICs0NzMsNTggQEAKICAqIERlYnVnIG1hY3JvcyB0aGF0IGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkCiAgKi8KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotCi0jZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkgICAgICAgICAgICAgICBzdGF0aWMgY2hhciBBQ1BJX1VOVVNFRF9WQVIgKl9USElTX01PRFVMRSA9IG5hbWU7CisjZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkgICAgICAgICAgc3RhdGljIGNoYXIgQUNQSV9VTlVTRURfVkFSICpfYWNwaV9tb2R1bGVfbmFtZSA9IG5hbWU7CiAKIC8qCi0gKiBGdW5jdGlvbiBlbnRyeSB0cmFjaW5nLgotICogVGhlIGZpcnN0IHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHByb2NlZHVyZSBuYW1lIGFzIGEgcXVvdGVkIHN0cmluZy4gIFRoaXMgaXMgZGVjbGFyZWQKLSAqIGFzIGEgbG9jYWwgc3RyaW5nICgiX3Byb2NfbmFtZSkgc28gdGhhdCBpdCBjYW4gYmUgYWxzbyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBleGl0IG1hY3JvcyBiZWxvdy4KKyAqIENvbW1vbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIGRlYnVnIG91dHB1dCBmdW5jdGlvbnM6CisgKiBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZSwgbW9kdWxlKGZpbGUpIG5hbWUsIGNvbXBvbmVudCBJRAogICovCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShhKSAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gX2RlYnVnX2luZm87IFwKLQkJCQkJCQkJCQkJCV9kZWJ1Z19pbmZvLmNvbXBvbmVudF9pZCA9IF9DT01QT05FTlQ7IFwKLQkJCQkJCQkJCQkJCV9kZWJ1Z19pbmZvLnByb2NfbmFtZSAgPSBhOyBcCi0JCQkJCQkJCQkJCQlfZGVidWdfaW5mby5tb2R1bGVfbmFtZSA9IF9USElTX01PRFVMRTsKKyNkZWZpbmUgQUNQSV9ERUJVR19QQVJBTUVURVJTICAgICAgICAgICBfX0xJTkVfXywgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSwgX2FjcGlfbW9kdWxlX25hbWUsIF9DT01QT05FTlQKIAotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFKGEpICAgICAgICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAotCQkJCQkJCQkJCQkJYWNwaV91dF90cmFjZShfX0xJTkVfXywmX2RlYnVnX2luZm8pCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGEsYikgICAgICAgIEFDUElfRlVOQ1RJT05fTkFNRShhKSBcCi0JCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlX3B0cihfX0xJTkVfXywmX2RlYnVnX2luZm8sKHZvaWQgKiliKQotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLGIpICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAotCQkJCQkJCQkJCQkJYWNwaV91dF90cmFjZV91MzIoX19MSU5FX18sJl9kZWJ1Z19pbmZvLCh1MzIpYikKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoYSxiKSAgICAgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJCQkJCQkJCWFjcGlfdXRfdHJhY2Vfc3RyKF9fTElORV9fLCZfZGVidWdfaW5mbywoY2hhciAqKWIpCisvKgorICogRnVuY3Rpb24gZW50cnkgdHJhY2luZworICovCiAKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpICAgICAgICAgICAgICAgYWNwaV91dF90cmFja19zdGFja19wdHIoKQorLyoKKyAqIElmIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBjb21waWxlci1kZXBlbmRlbnQgaGVhZGVyLAorICogZGVmaW5lIGl0IG5vdy4gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGVyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydAorICogYSBfX0ZVTkNUSU9OX18gbWFjcm8gb3IgZXF1aXZhbGVudC4gV2Ugc2F2ZSB0aGUgZnVuY3Rpb24gbmFtZSBvbiB0aGUKKyAqIGxvY2FsIHN0YWNrLgorICovCisjaWZuZGVmIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUKKyNkZWZpbmUgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSAgICAgICAgICBfYWNwaV9mdW5jdGlvbl9uYW1lCisvKgorICogVGhlIE5hbWUgcGFyYW1ldGVyIHNob3VsZCBiZSB0aGUgcHJvY2VkdXJlIG5hbWUgYXMgYSBxdW90ZWQgc3RyaW5nLgorICogVGhpcyBpcyBkZWNsYXJlZCBhcyBhIGxvY2FsIHN0cmluZyAoIm15X2Z1bmN0aW9uX25hbWUiKSBzbyB0aGF0IGl0IGNhbgorICogYmUgYWxzbyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBleGl0IG1hY3JvcyBiZWxvdy4KKyAqIE5vdGU6IChjb25zdCBjaGFyKSBpcyB1c2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVidWcgaW50ZXJmYWNlcworICogYW5kIG1hY3JvcyBzdWNoIGFzIF9fRlVOQ1RJT05fXy4KKyAqLworI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX05BTUUobmFtZSkgICAgICAgIGNvbnN0IGNoYXIgKl9hY3BpX2Z1bmN0aW9uX25hbWUgPSBuYW1lOworCisjZWxzZQorLyogQ29tcGlsZXIgc3VwcG9ydHMgX19GVU5DVElPTl9fIChvciBlcXVpdmFsZW50KSAtLSBJZ25vcmUgdGhpcyBtYWNybyAqLworCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShuYW1lKQorI2VuZGlmCisKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRShhKSAgICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlKEFDUElfREVCVUdfUEFSQU1FVEVSUykKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoYSxiKSAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlX3B0cihBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKHZvaWQgKiliKQorI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLGIpICAgIEFDUElfRlVOQ1RJT05fTkFNRShhKSBcCisJCQkJCQkJCQkJCWFjcGlfdXRfdHJhY2VfdTMyKEFDUElfREVCVUdfUEFSQU1FVEVSUywodTMyKWIpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGEsYikgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKKwkJCQkJCQkJCQkJYWNwaV91dF90cmFjZV9zdHIoQUNQSV9ERUJVR19QQVJBTUVURVJTLChjaGFyICopYikKKworI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX0VOVFJZKCkgICAgICAgICAgIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCkKIAogLyoKICAqIEZ1bmN0aW9uIGV4aXQgdHJhY2luZy4KICAqIFdBUk5JTkc6IFRoZXNlIG1hY3JvcyBpbmNsdWRlIGEgcmV0dXJuIHN0YXRlbWVudC4gIFRoaXMgaXMgdXN1YWxseSBjb25zaWRlcmVkCiAgKiBiYWQgZm9ybSwgYnV0IGhhdmluZyBhIHNlcGFyYXRlIGV4aXQgbWFjcm8gaXMgdmVyeSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4uCiAgKiBPbmUgb2YgdGhlIEZVTkNUSU9OX1RSQUNFIG1hY3JvcyBhYm92ZSBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVzZSBtYWNyb3MKLSAqIHNvIHRoYXQgIl9wcm9jX25hbWUiIGlzIGRlZmluZWQuCisgKiBzbyB0aGF0ICJfYWNwaV9mdW5jdGlvbl9uYW1lIiBpcyBkZWZpbmVkLgogICovCiAjaWZkZWYgQUNQSV9VU0VfRE9fV0hJTEVfMAogI2RlZmluZSBBQ1BJX0RPX1dISUxFMChhKSAgICAgICAgICAgICAgIGRvIGEgd2hpbGUoMCkKQEAgLTUxNywxMCArNTMyLDEwIEBACiAjZGVmaW5lIEFDUElfRE9fV0hJTEUwKGEpICAgICAgICAgICAgICAgYQogI2VuZGlmCiAKLSNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfZXhpdChfX0xJTkVfXywmX2RlYnVnX2luZm8pO3JldHVybjt9KQotI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF9zdGF0dXNfZXhpdChfX0xJTkVfXywmX2RlYnVnX2luZm8sKHMpKTtyZXR1cm4oKHMpKTt9KQotI2RlZmluZSByZXR1cm5fVkFMVUUocykgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF92YWx1ZV9leGl0KF9fTElORV9fLCZfZGVidWdfaW5mbywoYWNwaV9pbnRlZ2VyKShzKSk7cmV0dXJuKChzKSk7fSkKLSNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfcHRyX2V4aXQoX19MSU5FX18sJl9kZWJ1Z19pbmZvLCh1OCAqKShzKSk7cmV0dXJuKChzKSk7fSkKKyNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfZXhpdChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpO3JldHVybjt9KQorI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF9zdGF0dXNfZXhpdChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKHMpKTtyZXR1cm4oKHMpKTt9KQorI2RlZmluZSByZXR1cm5fVkFMVUUocykgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF92YWx1ZV9leGl0KEFDUElfREVCVUdfUEFSQU1FVEVSUywoYWNwaV9pbnRlZ2VyKShzKSk7cmV0dXJuKChzKSk7fSkKKyNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoe2FjcGlfdXRfcHRyX2V4aXQoQUNQSV9ERUJVR19QQVJBTUVURVJTLCh1OCAqKShzKSk7cmV0dXJuKChzKSk7fSkKIAogLyogQ29uZGl0aW9uYWwgZXhlY3V0aW9uICovCiAKQEAgLTUzMSwxMiArNTQ2LDEwIEBACiAjZGVmaW5lIEFDUElfREVCVUdfT05MWV9NRU1CRVJTKGEpICAgICAgYTsKICNkZWZpbmUgX1ZFUkJPU0VfU1RSVUNUVVJFUwogCi0KIC8qIFN0YWNrIGFuZCBidWZmZXIgZHVtcGluZyAqLwogCiAjZGVmaW5lIEFDUElfRFVNUF9TVEFDS19FTlRSWShhKSAgICAgICAgYWNwaV9leF9kdW1wX29wZXJhbmQoKGEpLDApCi0jZGVmaW5lIEFDUElfRFVNUF9PUEVSQU5EUyhhLGIsYyxkLGUpICAgYWNwaV9leF9kdW1wX29wZXJhbmRzKGEsYixjLGQsZSxfVEhJU19NT0RVTEUsX19MSU5FX18pCi0KKyNkZWZpbmUgQUNQSV9EVU1QX09QRVJBTkRTKGEsYixjLGQsZSkgICBhY3BpX2V4X2R1bXBfb3BlcmFuZHMoYSxiLGMsZCxlLF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fKQogCiAjZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLGIpICAgICAgICAgICAgYWNwaV9uc19kdW1wX2VudHJ5IChhLGIpCiAjZGVmaW5lIEFDUElfRFVNUF9QQVRITkFNRShhLGIsYyxkKSAgICAgYWNwaV9uc19kdW1wX3BhdGhuYW1lKGEsYixjLGQpCkBAIC01NDQsNyArNTU3LDYgQEAKICNkZWZpbmUgQUNQSV9EVU1QX0JVRkZFUihhLGIpICAgICAgICAgICBhY3BpX3V0X2R1bXBfYnVmZmVyKCh1OCAqKWEsYixEQl9CWVRFX0RJU1BMQVksX0NPTVBPTkVOVCkKICNkZWZpbmUgQUNQSV9CUkVBS19NU0coYSkgICAgICAgICAgICAgICBhY3BpX29zX3NpZ25hbCAoQUNQSV9TSUdOQUxfQlJFQUtQT0lOVCwoYSkpCiAKLQogLyoKICAqIEdlbmVyYXRlIElOVDMgb24gQUNQSV9FUlJPUiAoRGVidWcgb25seSEpCiAgKi8KQEAgLTU2NSwxNCArNTc3LDEzIEBACiAjZGVmaW5lIEFDUElfREVCVUdfUFJJTlQocGwpICAgICAgICAgICAgYWNwaV91dF9kZWJ1Z19wcmludCBBQ1BJX1BBUkFNX0xJU1QocGwpCiAjZGVmaW5lIEFDUElfREVCVUdfUFJJTlRfUkFXKHBsKSAgICAgICAgYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgQUNQSV9QQVJBTV9MSVNUKHBsKQogCi0KICNlbHNlCiAvKgogICogVGhpcyBpcyB0aGUgbm9uLWRlYnVnIGNhc2UgLS0gbWFrZSBldmVyeXRoaW5nIGdvIGF3YXksCiAgKiBsZWF2aW5nIG5vIGV4ZWN1dGFibGUgZGVidWcgY29kZSEKICAqLwogI2RlZmluZSBBQ1BJX01PRFVMRV9OQU1FKG5hbWUpCi0jZGVmaW5lIF9USElTX01PRFVMRSAiIgorI2RlZmluZSBfYWNwaV9tb2R1bGVfbmFtZSAiIgogCiAjZGVmaW5lIEFDUElfREVCVUdfRVhFQyhhKQogI2RlZmluZSBBQ1BJX05PUk1BTF9FWEVDKGEpICAgICAgICAgICAgIGE7CkBAIC02MTYsNyArNjI3LDYgQEAKICNkZWZpbmUgQUNQSV9ERUJVR0dFUl9FWEVDKGEpCiAjZW5kaWYKIAotCiAvKgogICogRm9yIDE2LWJpdCBjb2RlLCB3ZSB3YW50IHRvIHNocmluayBzb21lIHRoaW5ncyBldmVuIHRob3VnaAogICogd2UgYXJlIHVzaW5nIEFDUElfREVCVUdfT1VUUFVUIHRvIGdldCB0aGUgZGVidWcgb3V0cHV0CkBAIC02MjcsNyArNjM3LDYgQEAKICNkZWZpbmUgQUNQSV9ERUJVR19PTkxZX01FTUJFUlMoYSkKICNlbmRpZgogCi0KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogLyoKICAqIDEpIFNldCBuYW1lIHRvIGJsYW5rcwpAQCAtNjQwLDcgKzY0OSw2IEBACiAjZGVmaW5lIEFDUElfQUREX09CSkVDVF9OQU1FKGEsYikKICNlbmRpZgogCi0KIC8qCiAgKiBNZW1vcnkgYWxsb2NhdGlvbiB0cmFja2luZyAoREVCVUcgT05MWSkKICAqLwpAQCAtNjQ4LDIxICs2NTYsMjAgQEAKIAogLyogTWVtb3J5IGFsbG9jYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01FTV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfVEhJU19NT0RVTEUsX19MSU5FX18pCi0jZGVmaW5lIEFDUElfTUVNX0NBTExPQ0FURShhKSAgICAgICAgICAgYWNwaV91dF9jYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksIF9DT01QT05FTlQsX1RISVNfTU9EVUxFLF9fTElORV9fKQorI2RlZmluZSBBQ1BJX01FTV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKKyNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DQVRFKGEpICAgICAgICAgICBhY3BpX3V0X2NhbGxvY2F0ZSgoYWNwaV9zaXplKShhKSwgX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKICNkZWZpbmUgQUNQSV9NRU1fRlJFRShhKSAgICAgICAgICAgICAgICBhY3BpX29zX2ZyZWUoYSkKICNkZWZpbmUgQUNQSV9NRU1fVFJBQ0tJTkcoYSkKIAotCiAjZWxzZQogCiAvKiBNZW1vcnkgYWxsb2NhdGlvbiAqLwogCi0jZGVmaW5lIEFDUElfTUVNX0FMTE9DQVRFKGEpICAgICAgICAgICAgYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfVEhJU19NT0RVTEUsX19MSU5FX18pCi0jZGVmaW5lIEFDUElfTUVNX0NBTExPQ0FURShhKSAgICAgICAgICAgYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrKChhY3BpX3NpemUpKGEpLCBfQ09NUE9ORU5ULF9USElTX01PRFVMRSxfX0xJTkVfXykKLSNkZWZpbmUgQUNQSV9NRU1fRlJFRShhKSAgICAgICAgICAgICAgICBhY3BpX3V0X2ZyZWVfYW5kX3RyYWNrKGEsX0NPTVBPTkVOVCxfVEhJU19NT0RVTEUsX19MSU5FX18pCisjZGVmaW5lIEFDUElfTUVNX0FMTE9DQVRFKGEpICAgICAgICAgICAgYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKKyNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DQVRFKGEpICAgICAgICAgICBhY3BpX3V0X2NhbGxvY2F0ZV9hbmRfdHJhY2soKGFjcGlfc2l6ZSkoYSksIF9DT01QT05FTlQsX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18pCisjZGVmaW5lIEFDUElfTUVNX0ZSRUUoYSkgICAgICAgICAgICAgICAgYWNwaV91dF9mcmVlX2FuZF90cmFjayhhLF9DT01QT05FTlQsX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18pCiAjZGVmaW5lIEFDUElfTUVNX1RSQUNLSU5HKGEpICAgICAgICAgICAgYQogCi0jZW5kaWYgLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KKyNlbmRpZgkJCQkvKiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLwogCi0jZW5kaWYgLyogQUNNQUNST1NfSCAqLworI2VuZGlmCQkJCS8qIEFDTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY25hbWVzLmggYi9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oCmluZGV4IGRlYjdjYjAuLjRmOTA2M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaApAQCAtNzEsMTQgKzcxLDEzIEBACiAKIC8qIERlZmluaXRpb25zIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzcGFjZSBuYW1lcyAgKi8KIAotI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAodTMyKSAweDNGM0YzRjNGICAgICAvKiBVbmtub3duIG5hbWUgaXMgICI/Pz8/IiAqLwotI2RlZmluZSBBQ1BJX1JPT1RfTkFNRSAgICAgICAgICAodTMyKSAweDVGNUY1RjVDICAgICAvKiBSb290IG5hbWUgaXMgICAgICJcX19fIiAqLwotI2RlZmluZSBBQ1BJX1NZU19CVVNfTkFNRSAgICAgICAodTMyKSAweDVGNTM0MjVGICAgICAvKiBTeXMgYnVzIG5hbWUgaXMgICJfU0JfIiAqLworI2RlZmluZSBBQ1BJX1VOS05PV05fTkFNRSAgICAgICAodTMyKSAweDNGM0YzRjNGCS8qIFVua25vd24gbmFtZSBpcyAiPz8/PyIgKi8KKyNkZWZpbmUgQUNQSV9ST09UX05BTUUgICAgICAgICAgKHUzMikgMHg1RjVGNUY1QwkvKiBSb290IG5hbWUgaXMgICAgIlxfX18iICovCisKKyNkZWZpbmUgQUNQSV9QUkVGSVhfTUlYRUQgICAgICAgKHUzMikgMHg2OTcwNjM0MQkvKiAiQWNwaSIgKi8KKyNkZWZpbmUgQUNQSV9QUkVGSVhfTE9XRVIgICAgICAgKHUzMikgMHg2OTcwNjM2MQkvKiAiYWNwaSIgKi8KIAogI2RlZmluZSBBQ1BJX05TX1JPT1RfUEFUSCAgICAgICAiXFwiCiAjZGVmaW5lIEFDUElfTlNfU1lTVEVNX0JVUyAgICAgICJfU0JfIgogCi0KLSNlbmRpZiAgLyogX19BQ05BTUVTX0hfXyAgKi8KLQotCisjZW5kaWYJCQkJLyogX19BQ05BTUVTX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKaW5kZXggZDFiM2NlOC4uZGQzNTAxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpZm5kZWYgX19BQ05BTUVTUF9IX18KICNkZWZpbmUgX19BQ05BTUVTUF9IX18KIAotCiAvKiBUbyBzZWFyY2ggdGhlIGVudGlyZSBuYW1lIHNwYWNlLCBwYXNzIHRoaXMgYXMgc2VhcmNoX2Jhc2UgKi8KIAogI2RlZmluZSBBQ1BJX05TX0FMTCAgICAgICAgICAgICAgICAgKChhY3BpX2hhbmRsZSkwKQpAQCAtNTQsOCArNTMsOCBAQAogICogYW5kIHNob3VsZCBiZSBvbmUtdG8tb25lIHdpdGggdmFsdWVzIG9mIGFjcGlfb2JqZWN0X3R5cGUKICAqLwogI2RlZmluZSBBQ1BJX05TX05PUk1BTCAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX05TX05FV1NDT1BFICAgICAgICAgICAgMSAgIC8qIGEgZGVmaW5pdGlvbiBvZiB0aGlzIHR5cGUgb3BlbnMgYSBuYW1lIHNjb3BlICovCi0jZGVmaW5lIEFDUElfTlNfTE9DQUwgICAgICAgICAgICAgICAyICAgLyogc3VwcHJlc3Mgc2VhcmNoIG9mIGVuY2xvc2luZyBzY29wZXMgKi8KKyNkZWZpbmUgQUNQSV9OU19ORVdTQ09QRSAgICAgICAgICAgIDEJLyogYSBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZSBvcGVucyBhIG5hbWUgc2NvcGUgKi8KKyNkZWZpbmUgQUNQSV9OU19MT0NBTCAgICAgICAgICAgICAgIDIJLyogc3VwcHJlc3Mgc2VhcmNoIG9mIGVuY2xvc2luZyBzY29wZXMgKi8KIAogLyogRmxhZ3MgZm9yIGFjcGlfbnNfbG9va3VwLCBhY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKi8KIApAQCAtNjgsMzU3ICs2NywyMzcgQEAKICNkZWZpbmUgQUNQSV9OU19XQUxLX1VOTE9DSyAgICAgICAgIFRSVUUKICNkZWZpbmUgQUNQSV9OU19XQUxLX05PX1VOTE9DSyAgICAgIEZBTFNFCiAKLQogLyoKICAqIG5zaW5pdCAtIE5hbWVzcGFjZSBpbml0aWFsaXphdGlvbgogICovCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9uc19pbml0aWFsaXplX29iamVjdHModm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAoCi0Jdm9pZCk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfbnNfaW5pdGlhbGl6ZV9kZXZpY2VzKHZvaWQpOwogCiAvKgogICogbnNsb2FkIC0gIE5hbWVzcGFjZSBsb2FkaW5nCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfbmFtZXNwYWNlICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfbnNfbG9hZF9uYW1lc3BhY2Uodm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KK2FjcGlfbnNfbG9hZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLAorCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKIC8qCiAgKiBuc3dhbGsgLSB3YWxrIHRoZSBuYW1lc3BhY2UKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X29iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubG9ja19iZWZvcmVfY2FsbGJhY2ssCi0JYWNwaV93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX25zX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X29iamVjdCwKKwkJICAgICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICAgICB1OCB1bmxvY2tfYmVmb3JlX2NhbGxiYWNrLAorCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfbmV4dF9ub2RlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50LAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmNoaWxkKTsKLQorc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfbm9kZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpwYXJlbnQsCisJCQkJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpjaGlsZCk7CiAKIC8qCiAgKiBuc3BhcnNlIC0gdGFibGUgcGFyc2luZwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9uc19wYXJzZV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzY29wZSk7CithY3BpX25zX3BhcnNlX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MsCisJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc2NvcGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7Ci0KK2FjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKHU4IHBhc3NfbnVtYmVyLCBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKIAogLyoKICAqIG5zYWNjZXNzIC0gVG9wLWxldmVsIG5hbWVzcGFjZSBhY2Nlc3MKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfbnNfcm9vdF9pbml0aWFsaXplICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfbnNfcm9vdF9pbml0aWFsaXplKHZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19sb29rdXAgKAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnNjb3BlX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0X25vZGUpOwotCithY3BpX25zX2xvb2t1cCh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm8sCisJICAgICAgIGNoYXIgKm5hbWUsCisJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkgICAgICAgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCisJICAgICAgIHUzMiBmbGFncywKKwkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7CiAKIC8qCiAgKiBuc2FsbG9jIC0gTmFtZWQgb2JqZWN0IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCiAgKi8KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfY3JlYXRlX25vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19jcmVhdGVfbm9kZSh1MzIgbmFtZSk7CisKK3ZvaWQgYWNwaV9uc19kZWxldGVfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKIHZvaWQKLWFjcGlfbnNfZGVsZXRlX25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOworYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9oYW5kbGUpOwogCi12b2lkCi1hY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X2hhbmRsZSk7Cit2b2lkIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX293bmVyX2lkIG93bmVyX2lkKTsKIAotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2lkKTsKK3ZvaWQgYWNwaV9uc19kZXRhY2hfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAotdm9pZAotYWNwaV9uc19kZXRhY2hfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK3ZvaWQgYWNwaV9uc19kZWxldGVfY2hpbGRyZW4oc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudCk7CiAKLXZvaWQKLWFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnQpOwotCi1pbnQKLWFjcGlfbnNfY29tcGFyZV9uYW1lcyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTEsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTIpOwotCitpbnQgYWNwaV9uc19jb21wYXJlX25hbWVzKGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMik7CiAKIC8qCiAgKiBuc2R1bXAgLSBOYW1lc3BhY2UgZHVtcC9wcmludCB1dGlsaXRpZXMKICAqLwogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX25zX2R1bXBfdGFibGVzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF9iYXNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwordm9pZCBhY3BpX25zX2R1bXBfdGFibGVzKGFjcGlfaGFuZGxlIHNlYXJjaF9iYXNlLCB1MzIgbWF4X2RlcHRoKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworCit2b2lkIGFjcGlfbnNfZHVtcF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZWJ1Z19sZXZlbCk7CiAKIHZvaWQKLWFjcGlfbnNfZHVtcF9lbnRyeSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCk7CithY3BpX25zX2R1bXBfcGF0aG5hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICptc2csIHUzMiBsZXZlbCwgdTMyIGNvbXBvbmVudCk7CiAKLXZvaWQKLWFjcGlfbnNfZHVtcF9wYXRobmFtZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbXNnLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQpOwotCi12b2lkCi1hY3BpX25zX3ByaW50X3BhdGhuYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWdtZW50cywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSk7Cit2b2lkIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUodTMyIG51bV9zZWdtZW50cywgY2hhciAqcGF0aG5hbWUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX25zX2R1bXBfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCi1hY3BpX25zX2R1bXBfb2JqZWN0cyAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZGVyX2lkLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwotCithY3BpX25zX2R1bXBfb2JqZWN0cyhhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgdTggZGlzcGxheV90eXBlLAorCQkgICAgIHUzMiBtYXhfZGVwdGgsCisJCSAgICAgYWNwaV9vd25lcl9pZCBvd25lcl9pZCwgYWNwaV9oYW5kbGUgc3RhcnRfaGFuZGxlKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAvKgogICogbnNldmFsIC0gTmFtZXNwYWNlIGV2YWx1YXRpb24gZnVuY3Rpb25zCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CithY3BpX3N0YXR1cyBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX2J5X25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOworYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lKGNoYXIgKnBhdGhuYW1lLCBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQorYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShjaGFyICpwYXRobmFtZSwgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pOwogCiAvKgogICogbnNuYW1lcyAtIE5hbWUgYW5kIFNjb3BlIG1hbmlwdWxhdGlvbgogICovCi11MzIKLWFjcGlfbnNfb3BlbnNfc2NvcGUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSk7Cit1MzIgYWNwaV9uc19vcGVuc19zY29wZShhY3BpX29iamVjdF90eXBlIHR5cGUpOwogCi1jaGFyICoKLWFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK2NoYXIgKmFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAotY2hhciAqCi1hY3BpX25zX25hbWVfb2ZfY3VycmVudF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CitjaGFyICphY3BpX25zX25hbWVfb2ZfY3VycmVudF9zY29wZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqYnVmZmVyKTsKK2FjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGFjcGlfaGFuZGxlIHRhcmdldF9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlcik7CiAKIHU4Ci1hY3BpX25zX3BhdHRlcm5fbWF0Y2ggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm9ial9ub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlYXJjaF9mb3IpOworYWNwaV9uc19wYXR0ZXJuX21hdGNoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpvYmpfbm9kZSwgY2hhciAqc2VhcmNoX2Zvcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9ub2RlX2J5X3BhdGggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX3BhdGhuYW1lLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmluX3ByZWZpeF9ub2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKm91dF9ub2RlKTsKK2FjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChjaGFyICpleHRlcm5hbF9wYXRobmFtZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqaW5fcHJlZml4X25vZGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm91dF9ub2RlKTsKIAotYWNwaV9zaXplCi1hY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwotCithY3BpX3NpemUgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAogLyoKICAqIG5zb2JqZWN0IC0gT2JqZWN0IG1hbmFnZW1lbnQgZm9yIG5hbWVzcGFjZSBub2RlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpOworYWNwaV9uc19hdHRhY2hfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKgotYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChzdHJ1Y3QKKwkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICAgICAgKm5vZGUpOwogCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoKLWFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0CisJCQkJCQkJKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfYXR0YWNoX2RhdGEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworYWNwaV9uc19hdHRhY2hfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2RldGFjaF9kYXRhICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlcik7CithY3BpX25zX2RldGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipkYXRhKTsKLQorYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7CiAKIC8qCiAgKiBuc3NlYXJjaCAtIE5hbWVzcGFjZSBzZWFyY2hpbmcgYW5kIGVudHJ5CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbmFtZSwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9pbnRlcnByZXRlcl9tb2RlICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKipyZXRfbm9kZSk7CithY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIodTMyIGVudHJ5X25hbWUsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldF9ub2RlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX25vZGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbmFtZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICoqcmV0X25vZGUpOworYWNwaV9uc19zZWFyY2hfbm9kZSh1MzIgZW50cnlfbmFtZSwKKwkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7CiAKIHZvaWQKLWFjcGlfbnNfaW5zdGFsbF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKLQorYWNwaV9uc19pbnN0YWxsX25vZGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCisJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKIC8qCiAgKiBuc3V0aWxzIC0gVXRpbGl0eSBmdW5jdGlvbnMKICAqLwotdTgKLWFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKK3U4IGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoY2hhciBwcmVmaXgpOwogCi1hY3BpX29iamVjdF90eXBlCi1hY3BpX25zX2dldF90eXBlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK2FjcGlfb2JqZWN0X3R5cGUgYWNwaV9uc19nZXRfdHlwZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKLXUzMgotYWNwaV9uc19sb2NhbCAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKK3UzMiBhY3BpX25zX2xvY2FsKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKIHZvaWQKLWFjcGlfbnNfcmVwb3J0X2Vycm9yICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX25hbWUsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzKTsKK2FjcGlfbnNfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgICB1MzIgY29tcG9uZW50X2lkLAorCQkgICAgIGNoYXIgKmludGVybmFsX25hbWUsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpOwogCiB2b2lkCi1hY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVzc2FnZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzKTsKK2FjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihjaGFyICptb2R1bGVfbmFtZSwKKwkJCSAgICB1MzIgbGluZV9udW1iZXIsCisJCQkgICAgdTMyIGNvbXBvbmVudF9pZCwKKwkJCSAgICBjaGFyICptZXNzYWdlLAorCQkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGNoYXIgKnBhdGgsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpOwogCi12b2lkCi1hY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbXNnKTsKK3ZvaWQgYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCBjaGFyICptc2cpOworCithY3BpX3N0YXR1cyBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUoc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICppbmZvKTsKKwordm9pZCBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pOworCithY3BpX3N0YXR1cyBhY3BpX25zX2ludGVybmFsaXplX25hbWUoY2hhciAqZG90dGVkX25hbWUsIGNoYXIgKipjb252ZXJ0ZWRfbmFtZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUgKAotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAgICAgKmluZm8pOworYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lKHUzMiBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKKwkJCSBjaGFyICppbnRlcm5hbF9uYW1lLAorCQkJIHUzMiAqIGNvbnZlcnRlZF9uYW1lX2xlbmd0aCwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKTsKIAotdm9pZAotYWNwaV9uc19nZXRfaW50ZXJuYWxfbmFtZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAgICAgKmluZm8pOworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2ludGVybmFsaXplX25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRvdHRlZF9uYW1lLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipjb252ZXJ0ZWRfbmFtZSk7CithY3BpX2hhbmRsZSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXh0ZXJuYWxpemVfbmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnZlcnRlZF9uYW1lX2xlbmd0aCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqY29udmVydGVkX25hbWUpOwordm9pZCBhY3BpX25zX3Rlcm1pbmF0ZSh2b2lkKTsKIAotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9wYXJlbnRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJICAgICpub2RlKTsKIAotYWNwaV9oYW5kbGUKLWFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKHN0cnVjdAorCQkJCQkJCWFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkqbm9kZSk7CiAKLXZvaWQKLWFjcGlfbnNfdGVybWluYXRlICgKLQl2b2lkKTsKLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgotYWNwaV9uc19nZXRfcGFyZW50X25vZGUgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwotCi0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7Ci0KLSNlbmRpZiAvKiBfX0FDTkFNRVNQX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNOQU1FU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaCBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCmluZGV4IGUwNzliOTQuLjRhMzI2YmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oCkBAIC00NSw3ICs0NSw2IEBACiAjaWZuZGVmIF9BQ09CSkVDVF9ICiAjZGVmaW5lIF9BQ09CSkVDVF9ICiAKLQogLyoKICAqIFRoZSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgIGlzIHVzZWQgdG8gcGFzcyBBTUwgb3BlcmFuZHMgZnJvbSB0aGUgZGlzcGF0Y2hlcgogICogdG8gdGhlIGludGVycHJldGVyLCBhbmQgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmFyaW91cyBoYW5kbGVycyBzdWNoIGFzCkBAIC04MSw3ICs4MCw2IEBACiAjZGVmaW5lIEFPUE9CSl9TRVRVUF9DT01QTEVURSAgICAgICAweDEwCiAjZGVmaW5lIEFPUE9CSl9TSU5HTEVfREFUVU0gICAgICAgICAweDIwCiAKLQogLyoKICAqIENvbW1vbiBiaXRmaWVsZCBmb3IgdGhlIGZpZWxkIG9iamVjdHMKICAqICJGaWVsZCBEYXR1bSIgIC0tIGEgZGF0dW0gZnJvbSB0aGUgYWN0dWFsIGZpZWxkIG9iamVjdApAQCAtOTYsOCArOTQsNyBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0Oy8qIEJpdCBvZmZzZXQgd2l0aGluIGZpcnN0IGZpZWxkIGRhdHVtICgwLTYzKSAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF93aWR0aDsgICAvKiBSZWFkL1dyaXRlIHNpemUgaW4gYml0cyAoOC02NCkgKi9cCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAgICAgICAgICAgICAgLyogVmFsdWUgdG8gc3RvcmUgaW50byB0aGUgQmFuayBvciBJbmRleCByZWdpc3RlciAqL1wKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7ICAgICAgICAgICAgICAvKiBMaW5rIGJhY2sgdG8gcGFyZW50IG5vZGUgKi8KLQorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsJLyogTGluayBiYWNrIHRvIHBhcmVudCBub2RlICovCiAKIC8qCiAgKiBGaWVsZHMgY29tbW9uIHRvIGJvdGggU3RyaW5ncyBhbmQgQnVmZmVycwpAQCAtMTA1LDE1ICsxMDIsMTMgQEAKICNkZWZpbmUgQUNQSV9DT01NT05fQlVGRkVSX0lORk8gXAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CiAKLQogLyoKICAqIENvbW1vbiBmaWVsZHMgZm9yIG9iamVjdHMgdGhhdCBzdXBwb3J0IEFTTCBub3RpZmljYXRpb25zCiAgKi8KICNkZWZpbmUgQUNQSV9DT01NT05fTk9USUZZX0lORk8gXAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqc3lzdGVtX25vdGlmeTsgICAgIC8qIEhhbmRsZXIgZm9yIHN5c3RlbSBub3RpZmllcyAqL1wKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmRldmljZV9ub3RpZnk7ICAgICAvKiBIYW5kbGVyIGZvciBkcml2ZXIgbm90aWZpZXMgKi9cCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpoYW5kbGVyOyAgICAgICAgICAgLyogSGFuZGxlciBmb3IgQWRkcmVzcyBzcGFjZSAqLwotCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpoYW5kbGVyOwkvKiBIYW5kbGVyIGZvciBBZGRyZXNzIHNwYWNlICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMjEsMTYxICsxMTYsMTEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3RfY29tbW9uCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgorc3RydWN0IGFjcGlfb2JqZWN0X2NvbW1vbiB7CitBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSfTsKKworc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgYWNwaV9pbnRlZ2VyIHZhbHVlOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlcgotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7Ci19OwotCi0KIC8qCiAgKiBOb3RlOiBUaGUgU3RyaW5nIGFuZCBCdWZmZXIgb2JqZWN0IG11c3QgYmUgaWRlbnRpY2FsIHRocm91Z2ggdGhlIFBvaW50ZXIKICAqIGVsZW1lbnQuICBUaGVyZSBpcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICovCi1zdHJ1Y3QgYWNwaV9vYmplY3Rfc3RyaW5nICAgICAgICAgICAvKiBOdWxsIHRlcm1pbmF0ZWQsIEFTQ0lJIGNoYXJhY3RlcnMgb25seSAqLwotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9CVUZGRVJfSU5GTwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsgICAgICAgICAgIC8qIFN0cmluZyBpbiBBTUwgc3RyZWFtIG9yIGFsbG9jYXRlZCBzdHJpbmcgKi8KK3N0cnVjdCBhY3BpX29iamVjdF9zdHJpbmcgewkvKiBOdWxsIHRlcm1pbmF0ZWQsIEFTQ0lJIGNoYXJhY3RlcnMgb25seSAqLworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fQlVGRkVSX0lORk8gY2hhciAqcG9pbnRlcjsJLyogU3RyaW5nIGluIEFNTCBzdHJlYW0gb3IgYWxsb2NhdGVkIHN0cmluZyAqLwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX0JVRkZFUl9JTkZPCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOyAgICAgICAgICAgLyogQnVmZmVyIGluIEFNTCBzdHJlYW0gb3IgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIExpbmsgYmFjayB0byBwYXJlbnQgbm9kZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoOworc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlciB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9CVUZGRVJfSU5GTyB1OCAqIHBvaW50ZXI7CS8qIEJ1ZmZlciBpbiBBTUwgc3RyZWFtIG9yIGFsbG9jYXRlZCBidWZmZXIgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogTGluayBiYWNrIHRvIHBhcmVudCBub2RlICovCisJdTggKmFtbF9zdGFydDsKKwl1MzIgYW1sX2xlbmd0aDsKIH07CiAKLQotc3RydWN0IGFjcGlfb2JqZWN0X3BhY2thZ2UKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7ICAgICAgICAgICAgICAvKiAjIG9mIGVsZW1lbnRzIGluIHBhY2thZ2UgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7ICAgICAgICAgICAgICAvKiBMaW5rIGJhY2sgdG8gcGFyZW50IG5vZGUgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKiplbGVtZW50czsgICAgICAgICAvKiBBcnJheSBvZiBwb2ludGVycyB0byBhY3BpX29iamVjdHMgKi8KK3N0cnVjdCBhY3BpX29iamVjdF9wYWNrYWdlIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHUzMiBjb3VudDsJLyogIyBvZiBlbGVtZW50cyBpbiBwYWNrYWdlICovCisJdTMyIGFtbF9sZW5ndGg7CisJdTggKmFtbF9zdGFydDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogTGluayBiYWNrIHRvIHBhcmVudCBub2RlICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmVsZW1lbnRzOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBhY3BpX29iamVjdHMgKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIENvbXBsZXggZGF0YSB0eXBlcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X2V2ZW50Ci17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VtYXBob3JlOworc3RydWN0IGFjcGlfb2JqZWN0X2V2ZW50IHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHZvaWQgKnNlbWFwaG9yZTsKIH07CiAKLQogI2RlZmluZSBBQ1BJX0lORklOSVRFX0NPTkNVUlJFTkNZICAgMHhGRgogCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKkFDUElfSU5URVJOQUxfTUVUSE9EKSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX3N0YXR1cygqQUNQSV9JTlRFUk5BTF9NRVRIT0QpIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSk7CiAKLXN0cnVjdCBhY3BpX29iamVjdF9tZXRob2QKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9mbGFnczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGg7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZW1hcGhvcmU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbWxfc3RhcnQ7Ci0JQUNQSV9JTlRFUk5BTF9NRVRIT0QgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3k7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9jb3VudDsKLQlhY3BpX293bmVyX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duaW5nX2lkOworc3RydWN0IGFjcGlfb2JqZWN0X21ldGhvZCB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBtZXRob2RfZmxhZ3M7CisJdTggcGFyYW1fY291bnQ7CisJdTMyIGFtbF9sZW5ndGg7CisJdm9pZCAqc2VtYXBob3JlOworCXU4ICphbWxfc3RhcnQ7CisJQUNQSV9JTlRFUk5BTF9NRVRIT0QgaW1wbGVtZW50YXRpb247CisJdTggY29uY3VycmVuY3k7CisJdTggdGhyZWFkX2NvdW50OworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CiB9OwogCi0KLXN0cnVjdCBhY3BpX29iamVjdF9tdXRleAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19sZXZlbDsgICAgICAgICAvKiAwLTE1LCBzcGVjaWZpZWQgaW4gTXV0ZXgoKSBjYWxsICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpc2l0aW9uX2RlcHRoOyAgLyogQWxsb3cgbXVsdGlwbGUgQWNxdWlyZXMsIHNhbWUgdGhyZWFkICovCi0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAgICAgICAgICpvd25lcl90aHJlYWQ7ICAgICAgLyogQ3VycmVudCBvd25lciBvZiB0aGUgbXV0ZXggKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbWFwaG9yZTsgICAgICAgICAvKiBBY3R1YWwgT1Mgc3luY2hyb25pemF0aW9uIG9iamVjdCAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqcHJldjsgICAgICAgICAgICAgIC8qIExpbmsgZm9yIGxpc3Qgb2YgYWNxdWlyZWQgbXV0ZXhlcyAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqbmV4dDsgICAgICAgICAgICAgIC8qIExpbmsgZm9yIGxpc3Qgb2YgYWNxdWlyZWQgbXV0ZXhlcyAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIENvbnRhaW5pbmcgbmFtZXNwYWNlIG5vZGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfc3luY19sZXZlbDsgLyogT3duZXIncyBvcmlnaW5hbCBzeW5jIGxldmVsICgwLTE1KSAqLworc3RydWN0IGFjcGlfb2JqZWN0X211dGV4IHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHN5bmNfbGV2ZWw7CS8qIDAtMTUsIHNwZWNpZmllZCBpbiBNdXRleCgpIGNhbGwgKi8KKwl1MTYgYWNxdWlzaXRpb25fZGVwdGg7CS8qIEFsbG93IG11bHRpcGxlIEFjcXVpcmVzLCBzYW1lIHRocmVhZCAqLworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqb3duZXJfdGhyZWFkOwkvKiBDdXJyZW50IG93bmVyIG9mIHRoZSBtdXRleCAqLworCXZvaWQgKnNlbWFwaG9yZTsJLyogQWN0dWFsIE9TIHN5bmNocm9uaXphdGlvbiBvYmplY3QgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwcmV2OwkvKiBMaW5rIGZvciBsaXN0IG9mIGFjcXVpcmVkIG11dGV4ZXMgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0OwkvKiBMaW5rIGZvciBsaXN0IG9mIGFjcXVpcmVkIG11dGV4ZXMgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogQ29udGFpbmluZyBuYW1lc3BhY2Ugbm9kZSAqLworCXU4IG9yaWdpbmFsX3N5bmNfbGV2ZWw7CS8qIE93bmVyJ3Mgb3JpZ2luYWwgc3luYyBsZXZlbCAoMC0xNSkgKi8KIH07CiAKLQotc3RydWN0IGFjcGlfb2JqZWN0X3JlZ2lvbgotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9pZDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmhhbmRsZXI7ICAgICAgICAgICAvKiBIYW5kbGVyIGZvciByZWdpb24gYWNjZXNzICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgICAgICpub2RlOyAgICAgICAgICAgICAgLyogQ29udGFpbmluZyBuYW1lc3BhY2Ugbm9kZSAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqbmV4dDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgICAgICAgICBhZGRyZXNzOworc3RydWN0IGFjcGlfb2JqZWN0X3JlZ2lvbiB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBzcGFjZV9pZDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyOwkvKiBIYW5kbGVyIGZvciByZWdpb24gYWNjZXNzICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIENvbnRhaW5pbmcgbmFtZXNwYWNlIG5vZGUgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0OworCXUzMiBsZW5ndGg7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3M7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBPYmplY3RzIHRoYXQgY2FuIGJlIG5vdGlmaWVkLiAgQWxsIHNoYXJlIGEgY29tbW9uIG5vdGlmeV9pbmZvIGFyZWEuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2NvbW1vbiAgICAgICAgICAgIC8qIENPTU1PTiBOT1RJRlkgZm9yIFBPV0VSLCBQUk9DRVNTT1IsIERFVklDRSwgYW5kIFRIRVJNQUwgKi8KLXsKK3N0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uIHsJLyogQ09NTU9OIE5PVElGWSBmb3IgUE9XRVIsIFBST0NFU1NPUiwgREVWSUNFLCBhbmQgVEhFUk1BTCAqLworQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GT307CisKK3N0cnVjdCBhY3BpX29iamVjdF9kZXZpY2UgewogCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTworCSAgICBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTyBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfZGV2aWNlCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX05PVElGWV9JTkZPCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAgICAgICAgICpncGVfYmxvY2s7CitzdHJ1Y3QgYWNwaV9vYmplY3RfcG93ZXJfcmVzb3VyY2UgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fTk9USUZZX0lORk8gdTMyIHN5c3RlbV9sZXZlbDsKKwl1MzIgcmVzb3VyY2Vfb3JkZXI7CiB9OwogCi0KLXN0cnVjdCBhY3BpX29iamVjdF9wb3dlcl9yZXNvdXJjZQotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX29yZGVyOworc3RydWN0IGFjcGlfb2JqZWN0X3Byb2Nlc3NvciB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTyB1MzIgcHJvY19pZDsKKwl1MzIgbGVuZ3RoOworCWFjcGlfaW9fYWRkcmVzcyBhZGRyZXNzOwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfcHJvY2Vzc29yCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX05PVElGWV9JTkZPCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfaWQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsKLX07Ci0KLQotc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZQotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTwotfTsKLQorc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZSB7CitBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX05PVElGWV9JTkZPfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI4Myw5MCArMjI3LDYzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3RfZmllbGRfY29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTU1PTiBGSUVMRCAoZm9yIEJVRkZFUiwgUkVHSU9OLCBCQU5LLCBhbmQgSU5ERVggZmllbGRzKSAqLwotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpyZWdpb25fb2JqOyAgICAgICAgLyogQ29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uIG9iamVjdCAqLwotCQkJICAvKiAoUkVHSU9OL0JBTksgZmllbGRzIG9ubHkpICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfZmllbGRfY29tbW9uIHsJLyogQ09NTU9OIEZJRUxEIChmb3IgQlVGRkVSLCBSRUdJT04sIEJBTkssIGFuZCBJTkRFWCBmaWVsZHMpICovCisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CS8qIENvbnRhaW5pbmcgT3BlcmF0aW9uIFJlZ2lvbiBvYmplY3QgKi8KKwkvKiAoUkVHSU9OL0JBTksgZmllbGRzIG9ubHkpICovCiB9OwogCi0KLXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0JQUNQSV9DT01NT05fRklFTERfSU5GTwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqcmVnaW9uX29iajsgICAgICAgIC8qIENvbnRhaW5pbmcgb3BfcmVnaW9uIG9iamVjdCAqLworc3RydWN0IGFjcGlfb2JqZWN0X3JlZ2lvbl9maWVsZCB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CS8qIENvbnRhaW5pbmcgb3BfcmVnaW9uIG9iamVjdCAqLwogfTsKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfYmFua19maWVsZAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpyZWdpb25fb2JqOyAgICAgICAgLyogQ29udGFpbmluZyBvcF9yZWdpb24gb2JqZWN0ICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpiYW5rX29iajsgICAgICAgICAgLyogYmFua19zZWxlY3QgUmVnaXN0ZXIgb2JqZWN0ICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfYmFua19maWVsZCB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmo7CS8qIENvbnRhaW5pbmcgb3BfcmVnaW9uIG9iamVjdCAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJhbmtfb2JqOwkvKiBiYW5rX3NlbGVjdCBSZWdpc3RlciBvYmplY3QgKi8KIH07CiAKLQotc3RydWN0IGFjcGlfb2JqZWN0X2luZGV4X2ZpZWxkCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCUFDUElfQ09NTU9OX0ZJRUxEX0lORk8KLQotCS8qCi0JICogTm8gInJlZ2lvbl9vYmoiIHBvaW50ZXIgbmVlZGVkIHNpbmNlIHRoZSBJbmRleCBhbmQgRGF0YSByZWdpc3RlcnMKLQkgKiBhcmUgZWFjaCBmaWVsZCBkZWZpbml0aW9ucyB1bnRvIHRoZW1zZWx2ZXMuCi0JICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICppbmRleF9vYmo7ICAgICAgICAgLyogSW5kZXggcmVnaXN0ZXIgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmRhdGFfb2JqOyAgICAgICAgICAvKiBEYXRhIHJlZ2lzdGVyICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfaW5kZXhfZmllbGQgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fRklFTERfSU5GTworCSAgICAvKgorCSAgICAgKiBObyAicmVnaW9uX29iaiIgcG9pbnRlciBuZWVkZWQgc2luY2UgdGhlIEluZGV4IGFuZCBEYXRhIHJlZ2lzdGVycworCSAgICAgKiBhcmUgZWFjaCBmaWVsZCBkZWZpbml0aW9ucyB1bnRvIHRoZW1zZWx2ZXMuCisJICAgICAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmluZGV4X29iajsJLyogSW5kZXggcmVnaXN0ZXIgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkYXRhX29iajsJLyogRGF0YSByZWdpc3RlciAqLwogfTsKIAotCiAvKiBUaGUgYnVmZmVyX2ZpZWxkIGlzIGRpZmZlcmVudCBpbiB0aGF0IGl0IGlzIHBhcnQgb2YgYSBCdWZmZXIsIG5vdCBhbiBvcF9yZWdpb24gKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlcl9maWVsZAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQlBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpidWZmZXJfb2JqOyAgICAgICAgLyogQ29udGFpbmluZyBCdWZmZXIgb2JqZWN0ICovCitzdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyX2ZpZWxkIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX0ZJRUxEX0lORk8gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX29iajsJLyogQ29udGFpbmluZyBCdWZmZXIgb2JqZWN0ICovCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBPYmplY3RzIGZvciBoYW5kbGVycwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIFBhcmVudCBkZXZpY2UgKi8KLQlhY3BpX25vdGlmeV9oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQ7CitzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIFBhcmVudCBkZXZpY2UgKi8KKwlhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXI7CisJdm9pZCAqY29udGV4dDsKIH07CiAKLQogLyogRmxhZ3MgZm9yIGFkZHJlc3MgaGFuZGxlciAqLwogCiAjZGVmaW5lIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEICAweDEKIAotCi1zdHJ1Y3QgYWNwaV9vYmplY3RfYWRkcl9oYW5kbGVyCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV9pZDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGZsYWdzOwotCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgICAgICAgICAgICAgICAgICBoYW5kbGVyOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIFBhcmVudCBkZXZpY2UgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQ7Ci0JYWNwaV9hZHJfc3BhY2Vfc2V0dXAgICAgICAgICAgICAgICAgICAgIHNldHVwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqcmVnaW9uX2xpc3Q7ICAgICAgIC8qIHJlZ2lvbnMgdXNpbmcgdGhpcyBoYW5kbGVyICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpuZXh0Oworc3RydWN0IGFjcGlfb2JqZWN0X2FkZHJfaGFuZGxlciB7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBzcGFjZV9pZDsKKwl1MTYgaGZsYWdzOworCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcjsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogUGFyZW50IGRldmljZSAqLworCXZvaWQgKmNvbnRleHQ7CisJYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX2xpc3Q7CS8qIHJlZ2lvbnMgdXNpbmcgdGhpcyBoYW5kbGVyICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dDsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNwZWNpYWwgaW50ZXJuYWwgb2JqZWN0cwpAQCAtMzc3LDE4ICsyOTQsMTUgQEAKICAqIFRoZSBSZWZlcmVuY2Ugb2JqZWN0IHR5cGUgaXMgdXNlZCBmb3IgdGhlc2Ugb3Bjb2RlczoKICAqIEFyZ1swLTZdLCBMb2NhbFswLTddLCBpbmRleF9vcCwgbmFtZV9vcCwgemVyb19vcCwgb25lX29wLCBvbmVzX29wLCBkZWJ1Z19vcAogICovCi1zdHJ1Y3QgYWNwaV9vYmplY3RfcmVmZXJlbmNlCi17Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZTsgICAgICAgIC8qIFVzZWQgZm9yIGluZGV4X29wICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OyAgICAgICAgICAgICAvKiBVc2VkIGZvciBhcmdfb3AsIGxvY2FsX29wLCBhbmQgaW5kZXhfb3AgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdDsgICAgICAgICAgICAvKiBuYW1lX29wPT5IQU5ETEUgdG8gb2JqLCBpbmRleF9vcD0+dW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICoqd2hlcmU7CitzdHJ1Y3QgYWNwaV9vYmplY3RfcmVmZXJlbmNlIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHRhcmdldF90eXBlOwkvKiBVc2VkIGZvciBpbmRleF9vcCAqLworCXUxNiBvcGNvZGU7CisJdTMyIG9mZnNldDsJCS8qIFVzZWQgZm9yIGFyZ19vcCwgbG9jYWxfb3AsIGFuZCBpbmRleF9vcCAqLworCXZvaWQgKm9iamVjdDsJCS8qIG5hbWVfb3A9PkhBTkRMRSB0byBvYmosIGluZGV4X29wPT51bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKip3aGVyZTsKIH07CiAKLQogLyoKICAqIEV4dHJhIG9iamVjdCBpcyB1c2VkIGFzIGFkZGl0aW9uYWwgc3RvcmFnZSBmb3IgdHlwZXMgdGhhdAogICogaGF2ZSBBTUwgY29kZSBpbiB0aGVpciBkZWNsYXJhdGlvbnMgKHRlcm1fYXJncykgdGhhdCBtdXN0IGJlCkBAIC0zOTYsNzMgKzMxMCw2MiBAQAogICoKICAqIEN1cnJlbnRseTogUmVnaW9uIGFuZCBmaWVsZF91bml0IHR5cGVzCiAgKi8KLXN0cnVjdCBhY3BpX29iamVjdF9leHRyYQotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9maWxsMTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9maWxsMTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm1ldGhvZF9SRUc7ICAgICAgICAvKiBfUkVHIG1ldGhvZCBmb3IgdGhpcyByZWdpb24gKGlmIGFueSkgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0OyAgICAvKiBSZWdpb24tc3BlY2lmaWMgZGF0YSAqLworc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhIHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IGJ5dGVfZmlsbDE7CisJdTE2IHdvcmRfZmlsbDE7CisJdTMyIGFtbF9sZW5ndGg7CisJdTggKmFtbF9zdGFydDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX1JFRzsJLyogX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uIChpZiBhbnkpICovCisJdm9pZCAqcmVnaW9uX2NvbnRleHQ7CS8qIFJlZ2lvbi1zcGVjaWZpYyBkYXRhICovCiB9OwogCi0KIC8qIEFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBuYW1lc3BhY2Ugbm9kZXMgKi8KIAotc3RydWN0IGFjcGlfb2JqZWN0X2RhdGEKLXsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOworc3RydWN0IGFjcGlfb2JqZWN0X2RhdGEgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyOworCXZvaWQgKnBvaW50ZXI7CiB9OwogCi0KIC8qIFN0cnVjdHVyZSB1c2VkIHdoZW4gb2JqZWN0cyBhcmUgY2FjaGVkIGZvciByZXVzZSAqLwogCi1zdHJ1Y3QgYWNwaV9vYmplY3RfY2FjaGVfbGlzdAotewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKm5leHQ7ICAgICAgICAgICAgICAvKiBMaW5rIGZvciBvYmplY3QgY2FjaGUgYW5kIGludGVybmFsIGxpc3RzKi8KK3N0cnVjdCBhY3BpX29iamVjdF9jYWNoZV9saXN0IHsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQ7CS8qIExpbmsgZm9yIG9iamVjdCBjYWNoZSBhbmQgaW50ZXJuYWwgbGlzdHMgKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgRGVzY3JpcHRvciAtIGEgZ2lhbnQgdW5pb24gb2YgYWxsIG9mIHRoZSBhYm92ZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAotewotCXN0cnVjdCBhY3BpX29iamVjdF9jb21tb24gICAgICAgICAgICAgICBjb21tb247Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAgICAgICAgIGludGVnZXI7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X3N0cmluZyAgICAgICAgICAgICAgIHN0cmluZzsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyICAgICAgICAgICAgICAgYnVmZmVyOwotCXN0cnVjdCBhY3BpX29iamVjdF9wYWNrYWdlICAgICAgICAgICAgICBwYWNrYWdlOwotCXN0cnVjdCBhY3BpX29iamVjdF9ldmVudCAgICAgICAgICAgICAgICBldmVudDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbWV0aG9kICAgICAgICAgICAgICAgbWV0aG9kOwotCXN0cnVjdCBhY3BpX29iamVjdF9tdXRleCAgICAgICAgICAgICAgICBtdXRleDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfcmVnaW9uICAgICAgICAgICAgICAgcmVnaW9uOwotCXN0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uICAgICAgICBjb21tb25fbm90aWZ5OwotCXN0cnVjdCBhY3BpX29iamVjdF9kZXZpY2UgICAgICAgICAgICAgICBkZXZpY2U7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X3Bvd2VyX3Jlc291cmNlICAgICAgIHBvd2VyX3Jlc291cmNlOwotCXN0cnVjdCBhY3BpX29iamVjdF9wcm9jZXNzb3IgICAgICAgICAgICBwcm9jZXNzb3I7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZSAgICAgICAgIHRoZXJtYWxfem9uZTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfZmllbGRfY29tbW9uICAgICAgICAgY29tbW9uX2ZpZWxkOwotCXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQgICAgICAgICBmaWVsZDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfYnVmZmVyX2ZpZWxkICAgICAgICAgYnVmZmVyX2ZpZWxkOwotCXN0cnVjdCBhY3BpX29iamVjdF9iYW5rX2ZpZWxkICAgICAgICAgICBiYW5rX2ZpZWxkOwotCXN0cnVjdCBhY3BpX29iamVjdF9pbmRleF9maWVsZCAgICAgICAgICBpbmRleF9maWVsZDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgICAgICAgbm90aWZ5OwotCXN0cnVjdCBhY3BpX29iamVjdF9hZGRyX2hhbmRsZXIgICAgICAgICBhZGRyZXNzX3NwYWNlOwotCXN0cnVjdCBhY3BpX29iamVjdF9yZWZlcmVuY2UgICAgICAgICAgICByZWZlcmVuY2U7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhICAgICAgICAgICAgICAgIGV4dHJhOwotCXN0cnVjdCBhY3BpX29iamVjdF9kYXRhICAgICAgICAgICAgICAgICBkYXRhOwotCXN0cnVjdCBhY3BpX29iamVjdF9jYWNoZV9saXN0ICAgICAgICAgICBjYWNoZTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgeworCXN0cnVjdCBhY3BpX29iamVjdF9jb21tb24gY29tbW9uOworCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyIGludGVnZXI7CisJc3RydWN0IGFjcGlfb2JqZWN0X3N0cmluZyBzdHJpbmc7CisJc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjcGlfb2JqZWN0X3BhY2thZ2UgcGFja2FnZTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfZXZlbnQgZXZlbnQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X21ldGhvZCBtZXRob2Q7CisJc3RydWN0IGFjcGlfb2JqZWN0X211dGV4IG11dGV4OworCXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb24gcmVnaW9uOworCXN0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uIGNvbW1vbl9ub3RpZnk7CisJc3RydWN0IGFjcGlfb2JqZWN0X2RldmljZSBkZXZpY2U7CisJc3RydWN0IGFjcGlfb2JqZWN0X3Bvd2VyX3Jlc291cmNlIHBvd2VyX3Jlc291cmNlOworCXN0cnVjdCBhY3BpX29iamVjdF9wcm9jZXNzb3IgcHJvY2Vzc29yOworCXN0cnVjdCBhY3BpX29iamVjdF90aGVybWFsX3pvbmUgdGhlcm1hbF96b25lOworCXN0cnVjdCBhY3BpX29iamVjdF9maWVsZF9jb21tb24gY29tbW9uX2ZpZWxkOworCXN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQgZmllbGQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X2J1ZmZlcl9maWVsZCBidWZmZXJfZmllbGQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X2JhbmtfZmllbGQgYmFua19maWVsZDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfaW5kZXhfZmllbGQgaW5kZXhfZmllbGQ7CisJc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyIG5vdGlmeTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfYWRkcl9oYW5kbGVyIGFkZHJlc3Nfc3BhY2U7CisJc3RydWN0IGFjcGlfb2JqZWN0X3JlZmVyZW5jZSByZWZlcmVuY2U7CisJc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhIGV4dHJhOworCXN0cnVjdCBhY3BpX29iamVjdF9kYXRhIGRhdGE7CisJc3RydWN0IGFjcGlfb2JqZWN0X2NhY2hlX2xpc3QgY2FjaGU7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiB1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgLSBvYmplY3RzIHRoYXQgc2hhcmUgYSBjb21tb24gZGVzY3JpcHRvciBpZGVudGlmaWVyCkBAIC00NzEsNyArMzc0LDcgQEAKIAogLyogT2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KIAotI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9DQUNIRUQgICAgICAgICAgIDB4MDEgICAgICAgIC8qIFVzZWQgb25seSB3aGVuIG9iamVjdCBpcyBjYWNoZWQgKi8KKyNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEICAgICAgICAgICAweDAxCS8qIFVzZWQgb25seSB3aGVuIG9iamVjdCBpcyBjYWNoZWQgKi8KICNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfU1RBVEUgICAgICAgICAgICAweDAyCiAjZGVmaW5lIEFDUElfREVTQ19UWVBFX1NUQVRFX1VQREFURSAgICAgMHgwMwogI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QQUNLQUdFICAgIDB4MDQKQEAgLTQ4OCwxNCArMzkxLDExIEBACiAjZGVmaW5lIEFDUElfREVTQ19UWVBFX05BTUVEICAgICAgICAgICAgMHgwRgogI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9NQVggICAgICAgICAgICAgIDB4MEYKIAotCi11bmlvbiBhY3BpX2Rlc2NyaXB0b3IKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9pZDsgIC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICBvYmplY3Q7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgICAgIG5vZGU7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgICAgIG9wOwordW5pb24gYWNwaV9kZXNjcmlwdG9yIHsKKwl1OCBkZXNjcmlwdG9yX2lkOwkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2JqZWN0OworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIG5vZGU7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3Qgb3A7CiB9OwogCi0KLSNlbmRpZiAvKiBfQUNPQkpFQ1RfSCAqLworI2VuZGlmCQkJCS8qIF9BQ09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaCBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCmluZGV4IDExOGVjYmEuLjY0ZGE0MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCkBAIC02Miw3ICs2Miw2IEBACiAjZGVmaW5lIF9OQU0gICAgICAgICAgICAgICAgICAgICAgICAweDZDCiAjZGVmaW5lIF9QRlggICAgICAgICAgICAgICAgICAgICAgICAweDZECiAKLQogLyoKICAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHBhcnNlLXRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MCiAgKiBwYXJzZXIgIEVhY2ggbGlzdCBpcyBjb21wcmVzc2VkIGludG8gYSAzMi1iaXQgbnVtYmVyIGFuZCBzdG9yZWQgaW4gdGhlCkBAIC0xOTEsNyArMTkwLDYgQEAKICNkZWZpbmUgQVJHUF9XT1JEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1dPUkREQVRBKQogI2RlZmluZSBBUkdQX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCiAKLQogLyoKICAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHJ1bnRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MCiAgKiBpbnRlcnByZXRlciAgRWFjaCBsaXN0IGlzIGNvbXByZXNzZWQgaW50byBhIDMyLWJpdCBudW1iZXIgYW5kIHN0b3JlZApAQCAtMjQ2LDcgKzI0NCw3IEBACiAjZGVmaW5lIEFSR0lfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQogI2RlZmluZSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCiAjZGVmaW5lIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9GSVhFRF9UQVJHRVQpCiAjZGVmaW5lIEFSR0lfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQogI2RlZmluZSBBUkdJX0lOQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCiAjZGVmaW5lIEFSR0lfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQpAQCAtMzIyLDQgKzMyMCw0IEBACiAjZGVmaW5lIEFSR0lfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQogI2RlZmluZSBBUkdJX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCiAKLSNlbmRpZiAvKiBfX0FDT1BDT0RFX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNPUENPREVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IDJmYmUxODAuLjY4ZDdlZGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaApAQCAtNzMsMTIgKzczLDEwIEBACiAjZGVmaW5lIEFDUElfQUxMX0NPTVBPTkVOVFMgICAgICAgICAweDAwMDAzRkZGCiAjZGVmaW5lIEFDUElfQ09NUE9ORU5UX0RFRkFVTFQgICAgICAoQUNQSV9BTExfQ09NUE9ORU5UUykKIAotCiAvKiBDb21wb25lbnQgSURzIHJlc2VydmVkIGZvciBBQ1BJIGRyaXZlcnMgKi8KIAogI2RlZmluZSBBQ1BJX0FMTF9EUklWRVJTICAgICAgICAgICAgMHhGRkZGMDAwMAogCi0KIC8qCiAgKiBSYXcgZGVidWcgb3V0cHV0IGxldmVscywgZG8gbm90IHVzZSB0aGVzZSBpbiB0aGUgREVCVUdfUFJJTlQgbWFjcm9zCiAgKi8KQEAgLTEzMiwxMSArMTMwLDEwIEBACiAKICNkZWZpbmUgQUNQSV9MVl9WRVJCT1NFICAgICAgICAgICAgIDB4RjAwMDAwMDAKIAotCiAvKgogICogRGVidWcgbGV2ZWwgbWFjcm9zIHRoYXQgYXJlIHVzZWQgaW4gdGhlIERFQlVHX1BSSU5UIG1hY3JvcwogICovCi0jZGVmaW5lIEFDUElfREVCVUdfTEVWRUwoZGwpICAgICAgICAodTMyKSBkbCxfX0xJTkVfXywmX2RlYnVnX2luZm8KKyNkZWZpbmUgQUNQSV9ERUJVR19MRVZFTChkbCkgICAgICAgICh1MzIpIGRsLEFDUElfREVCVUdfUEFSQU1FVEVSUwogCiAvKiBFeGNlcHRpb24gbGV2ZWwgLS0gdXNlZCBpbiB0aGUgZ2xvYmFsICJkZWJ1Z19sZXZlbCIgKi8KIApAQCAtMTQ3LDcgKzE0NCw2IEBACiAjZGVmaW5lIEFDUElfREJfSU5GTyAgICAgICAgICAgICAgICBBQ1BJX0RFQlVHX0xFVkVMIChBQ1BJX0xWX0lORk8pCiAjZGVmaW5lIEFDUElfREJfQUxMX0VYQ0VQVElPTlMgICAgICBBQ1BJX0RFQlVHX0xFVkVMIChBQ1BJX0xWX0FMTF9FWENFUFRJT05TKQogCi0KIC8qIFRyYWNlIGxldmVsIC0tIGFsc28gdXNlZCBpbiB0aGUgZ2xvYmFsICJkZWJ1Z19sZXZlbCIgKi8KIAogI2RlZmluZSBBQ1BJX0RCX0lOSVRfTkFNRVMgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9JTklUX05BTUVTKQpAQCAtMTc0LDEyICsxNzAsMTAgQEAKIAogI2RlZmluZSBBQ1BJX0RCX0FMTCAgICAgICAgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9BTEwpCiAKLQogLyogRGVmYXVsdHMgZm9yIGRlYnVnX2xldmVsLCBkZWJ1ZyBhbmQgbm9ybWFsICovCiAKICNkZWZpbmUgQUNQSV9ERUJVR19ERUZBVUxUICAgICAgICAgIChBQ1BJX0xWX0lOSVQgfCBBQ1BJX0xWX1dBUk4gfCBBQ1BJX0xWX0VSUk9SIHwgQUNQSV9MVl9ERUJVR19PQkpFQ1QpCiAjZGVmaW5lIEFDUElfTk9STUFMX0RFRkFVTFQgICAgICAgICAoQUNQSV9MVl9JTklUIHwgQUNQSV9MVl9XQVJOIHwgQUNQSV9MVl9FUlJPUiB8IEFDUElfTFZfREVCVUdfT0JKRUNUKQogI2RlZmluZSBBQ1BJX0RFQlVHX0FMTCAgICAgICAgICAgICAgKEFDUElfTFZfQU1MX0RJU0FTU0VNQkxFIHwgQUNQSV9MVl9BTExfRVhDRVBUSU9OUyB8IEFDUElfTFZfQUxMKQogCi0KLSNlbmRpZiAvKiBfX0FDT1VUUFVUX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNPVVRQVVRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaCBiL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oCmluZGV4IDY5ODI3NjUuLmQzNTJkNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oCkBAIC00MSwxOCArNDEsMTUgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0KICNpZm5kZWYgX19BQ1BBUlNFUl9IX18KICNkZWZpbmUgX19BQ1BBUlNFUl9IX18KIAotCiAjZGVmaW5lIE9QX0hBU19SRVRVUk5fVkFMVUUgICAgICAgICAgICAgMQogCiAvKiB2YXJpYWJsZSAjIGFyZ3VtZW50cyAqLwogCiAjZGVmaW5lIEFDUElfVkFSX0FSR1MgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMzJfTUFYCiAKLQogI2RlZmluZSBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBBQ1BJX1BBUlNFX05PX1RSRUVfREVMRVRFICAgICAgIDB4MDAwMAogI2RlZmluZSBBQ1BJX1BBUlNFX1RSRUVfTUFTSyAgICAgICAgICAgIDB4MDAwMQpAQCAtNjMsNyArNjAsNyBAQAogI2RlZmluZSBBQ1BJX1BBUlNFX01PREVfTUFTSyAgICAgICAgICAgIDB4MDAzMAogCiAjZGVmaW5lIEFDUElfUEFSU0VfREVGRVJSRURfT1AgICAgICAgICAgMHgwMTAwCi0KKyNkZWZpbmUgQUNQSV9QQVJTRV9ESVNBU1NFTUJMRSAgICAgICAgICAweDAyMDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcxLDI1MSArNjgsMTY1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qCiAgKiBwc3hmYWNlIC0gUGFyc2VyIGV4dGVybmFsIGludGVyZmFjZXMKICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfcHN4X2xvYWRfdGFibGUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBjb2RlX2FkZHIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY29kZV9sZW5ndGgpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9wc3hfZXhlY3V0ZSAoCi0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2Qoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pOwogCiAvKgogICogcHNhcmdzIC0gUGFyc2UgQU1MIG9wY29kZSBhcmd1bWVudHMKICAqLwotdTggKgotYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZCAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKK3U4ICphY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpOwogCi1jaGFyICoKLWFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKK2NoYXIgKmFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyhzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKTsKIAogdm9pZAotYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpOworYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCQkgICAgdTMyIGFyZ190eXBlLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGggKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsKTsKK2FjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZywgdTggbWV0aG9kX2NhbGwpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9wc19nZXRfbmV4dF9hcmcgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3R5cGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKnJldHVybl9hcmcpOwotCithY3BpX3BzX2dldF9uZXh0X2FyZyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgIHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgICAgdTMyIGFyZ190eXBlLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKnJldHVybl9hcmcpOwogCiAvKgogICogcHNmaW5kCiAgKi8KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKLWFjcGlfcHNfZmluZF9uYW1lICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzY29wZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZmluZF9uYW1lKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzY29wZSwKKwkJCQkJICAgdTMyIG5hbWUsIHUzMiBvcGNvZGUpOwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCoKLWFjcGlfcHNfZ2V0X3BhcmVudCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfcGFyZW50KHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIC8qCiAgKiBwc29wY29kZSAtIEFNTCBPcGNvZGUgaW5mb3JtYXRpb24KICAqLwotY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKgotYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKK2NvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICphY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh1MTYgb3Bjb2RlKTsKIAotY2hhciAqCi1hY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwotCitjaGFyICphY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh1MTYgb3Bjb2RlKTsKIAogLyoKICAqIHBzcGFyc2UgLSB0b3AgbGV2ZWwgcGFyc2luZyByb3V0aW5lcwogICovCithY3BpX3N0YXR1cyBhY3BpX3BzX3BhcnNlX2FtbChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKwordTMyIGFjcGlfcHNfZ2V0X29wY29kZV9zaXplKHUzMiBvcGNvZGUpOworCit1MTYgYWNwaV9wc19wZWVrX29wY29kZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqc3RhdGUpOworCiBhY3BpX3N0YXR1cwotYWNwaV9wc19wYXJzZV9hbWwgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdTMyCi1hY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOworYWNwaV9zdGF0dXMKK2FjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSBhY3BpX3N0YXR1cyBjYWxsYmFja19zdGF0dXMpOwogCi11MTYKLWFjcGlfcHNfcGVla19vcGNvZGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnN0YXRlKTsKLQorLyoKKyAqIHBzbG9vcCAtIG1haW4gcGFyc2UgbG9vcAorICovCithY3BpX3N0YXR1cyBhY3BpX3BzX3BhcnNlX2xvb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CiAKIC8qCiAgKiBwc3Njb3BlIC0gU2NvcGUgc3RhY2sgbWFuYWdlbWVudCByb3V0aW5lcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9wc19pbml0X3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCk7CithY3BpX3BzX2luaXRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKKwkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnJvb3QpOwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnN0YXRlKTsKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUKKwkJCQkJCSAgKnN0YXRlKTsKIAotdTgKLWFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKK3U4IGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKTsKIAogdm9pZAotYWNwaV9wc19wb3Bfc2NvcGUgKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJnX2xpc3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJnX2NvdW50KTsKK2FjcGlfcHNfcG9wX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCwKKwkJICB1MzIgKiBhcmdfbGlzdCwgdTMyICogYXJnX2NvdW50KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcHNfcHVzaF9zY29wZSAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nX2FyZ3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfY291bnQpOworYWNwaV9wc19wdXNoX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJICAgdTMyIHJlbWFpbmluZ19hcmdzLCB1MzIgYXJnX2NvdW50KTsKIAotdm9pZAotYWNwaV9wc19jbGVhbnVwX3Njb3BlICgKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpzdGF0ZSk7Ci0KK3ZvaWQgYWNwaV9wc19jbGVhbnVwX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpzdGF0ZSk7CiAKIC8qCiAgKiBwc3RyZWUgLSBwYXJzZSB0cmVlIG1hbmlwdWxhdGlvbiByb3V0aW5lcwogICovCiB2b2lkCi1hY3BpX3BzX2FwcGVuZF9hcmcoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnKTsKK2FjcGlfcHNfYXBwZW5kX2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcpOwogCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCoKLWFjcGlfcHNfZmluZCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqc2NvcGUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSk7Cit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19maW5kKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzY29wZSwKKwkJCQkgICAgICBjaGFyICpwYXRoLCB1MTYgb3Bjb2RlLCB1MzIgY3JlYXRlKTsKIAotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfYXJnKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ24pOwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUzMiBhcmduKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9kZXB0aF9uZXh0ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCi0KK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9kZXB0aF9uZXh0KHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcmlnaW4sCisJCQkJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIC8qCiAgKiBwc3dhbGsgLSBwYXJzZSB0cmVlIHdhbGsgcm91dGluZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfcHNfd2Fsa19wYXJzZWRfYW1sICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzdGFydF9vcCwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICplbmRfb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbXRoX2Rlc2MsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc3RhcnRfbm9kZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcGFyYW1zLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipjYWxsZXJfcmV0dXJuX2Rlc2MsCi0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICBvd25lcl9pZCwKLQlhY3BpX3BhcnNlX2Rvd253YXJkcyAgICAgICAgICAgIGRlc2NlbmRpbmdfY2FsbGJhY2ssCi0JYWNwaV9wYXJzZV91cHdhcmRzICAgICAgICAgICAgICBhc2NlbmRpbmdfY2FsbGJhY2spOworYWNwaV9wc193YWxrX3BhcnNlZF9hbWwodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnN0YXJ0X29wLAorCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmVuZF9vcCwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm10aF9kZXNjLAorCQkJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1zLAorCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmNhbGxlcl9yZXR1cm5fZGVzYywKKwkJCWFjcGlfb3duZXJfaWQgb3duZXJfaWQsCisJCQlhY3BpX3BhcnNlX2Rvd253YXJkcyBkZXNjZW5kaW5nX2NhbGxiYWNrLAorCQkJYWNwaV9wYXJzZV91cHdhcmRzIGFzY2VuZGluZ19jYWxsYmFjayk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2dldF9uZXh0X3dhbGtfb3AgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JYWNwaV9wYXJzZV91cHdhcmRzICAgICAgICAgICAgICBhc2NlbmRpbmdfY2FsbGJhY2spOworYWNwaV9wc19nZXRfbmV4dF93YWxrX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJIGFjcGlfcGFyc2VfdXB3YXJkcyBhc2NlbmRpbmdfY2FsbGJhY2spOwogCi1hY3BpX3N0YXR1cwotYWNwaV9wc19kZWxldGVfY29tcGxldGVkX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfcHNfZGVsZXRlX2NvbXBsZXRlZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAotdm9pZAotYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCk7Ci0KK3ZvaWQgYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcm9vdCk7CiAKIC8qCiAgKiBwc3V0aWxzIC0gcGFyc2VyIHV0aWxpdGllcwogICovCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCAoCi0Jdm9pZCk7Cit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19jcmVhdGVfc2NvcGVfb3Aodm9pZCk7CiAKLXZvaWQKLWFjcGlfcHNfaW5pdF9vcCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwordm9pZCBhY3BpX3BzX2luaXRfb3AodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1MTYgb3Bjb2RlKTsKIAotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19hbGxvY19vcCAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfYWxsb2Nfb3AodTE2IG9wY29kZSk7CiAKLXZvaWQKLWFjcGlfcHNfZnJlZV9vcCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwordm9pZCBhY3BpX3BzX2ZyZWVfb3AodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAotdTgKLWFjcGlfcHNfaXNfbGVhZGluZ19jaGFyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOwordTggYWNwaV9wc19pc19sZWFkaW5nX2NoYXIodTMyIGMpOwogCi11OAotYWNwaV9wc19pc19wcmVmaXhfY2hhciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKK3U4IGFjcGlfcHNfaXNfcHJlZml4X2NoYXIodTMyIGMpOwogCiAjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKLXUzMgotYWNwaV9wc19nZXRfbmFtZSgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0jZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KK3UzMiBhY3BpX3BzX2dldF9uYW1lKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotdm9pZAotYWNwaV9wc19zZXRfbmFtZSgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi12b2lkCi1hY3BpX3BzX2RlbGV0ZV9wYXJzZV9jYWNoZSAoCi0Jdm9pZCk7Ci0jZW5kaWYKLQordm9pZCBhY3BpX3BzX3NldF9uYW1lKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgdTMyIG5hbWUpOwogCiAvKgogICogcHNkdW1wIC0gZGlzcGxheSBwYXJzZXIgdHJlZQogICovCiB1MzIKLWFjcGlfcHNfc3ByaW50X3BhdGggKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9zdGFydCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK2FjcGlfcHNfc3ByaW50X3BhdGgoY2hhciAqYnVmZmVyX3N0YXJ0LAorCQkgICAgdTMyIGJ1ZmZlcl9zaXplLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCiB1MzIKLWFjcGlfcHNfc3ByaW50X29wICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJfc3RhcnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CithY3BpX3BzX3NwcmludF9vcChjaGFyICpidWZmZXJfc3RhcnQsCisJCSAgdTMyIGJ1ZmZlcl9zaXplLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwogCi12b2lkCi1hY3BpX3BzX3Nob3cgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKK3ZvaWQgYWNwaV9wc19zaG93KHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLQotI2VuZGlmIC8qIF9fQUNQQVJTRVJfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ1BBUlNFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpLmggYi9pbmNsdWRlL2FjcGkvYWNwaS5oCmluZGV4IGE2OWQ3ODkuLmNjZjM0ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGkuaApAQCAtNDksMjIgKzQ5LDIxIEBACiAgKiBXZSBwdXQgdGhlbSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdXBsaWNhdGUgdGhlbQogICogaW4gdGhlIHJlc3Qgb2YgdGhlIHNvdXJjZSBjb2RlIGFnYWluIGFuZCBhZ2Fpbi4KICAqLwotI2luY2x1ZGUgImFjbmFtZXMuaCIgICAgICAgICAgICAvKiBHbG9iYWwgQUNQSSBuYW1lcyBhbmQgc3RyaW5ncyAqLwotI2luY2x1ZGUgImFjY29uZmlnLmgiICAgICAgICAgICAvKiBDb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLwotI2luY2x1ZGUgInBsYXRmb3JtL2FjZW52LmgiICAgICAvKiBUYXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaXRlbXMgKi8KLSNpbmNsdWRlICJhY3R5cGVzLmgiICAgICAgICAgICAgLyogRnVuZGFtZW50YWwgY29tbW9uIGRhdGEgdHlwZXMgKi8KLSNpbmNsdWRlICJhY2V4Y2VwLmgiICAgICAgICAgICAgLyogQUNQSSBleGNlcHRpb24gY29kZXMgKi8KLSNpbmNsdWRlICJhY21hY3Jvcy5oIiAgICAgICAgICAgLyogQyBtYWNyb3MgKi8KLSNpbmNsdWRlICJhY3RibC5oIiAgICAgICAgICAgICAgLyogQUNQSSB0YWJsZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImFjbG9jYWwuaCIgICAgICAgICAgICAvKiBJbnRlcm5hbCBkYXRhIHR5cGVzICovCi0jaW5jbHVkZSAiYWNvdXRwdXQuaCIgICAgICAgICAgIC8qIEVycm9yIG91dHB1dCBhbmQgRGVidWcgbWFjcm9zICovCi0jaW5jbHVkZSAiYWNwaW9zeGYuaCIgICAgICAgICAgIC8qIEludGVyZmFjZXMgdG8gdGhlIEFDUEktdG8tT1MgbGF5ZXIqLwotI2luY2x1ZGUgImFjcGl4Zi5oIiAgICAgICAgICAgICAvKiBBQ1BJIGNvcmUgc3Vic3lzdGVtIGV4dGVybmFsIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJhY29iamVjdC5oIiAgICAgICAgICAgLyogQUNQSSBpbnRlcm5hbCBvYmplY3QgKi8KLSNpbmNsdWRlICJhY3N0cnVjdC5oIiAgICAgICAgICAgLyogQ29tbW9uIHN0cnVjdHVyZXMgKi8KLSNpbmNsdWRlICJhY2dsb2JhbC5oIiAgICAgICAgICAgLyogQWxsIGdsb2JhbCB2YXJpYWJsZXMgKi8KLSNpbmNsdWRlICJhY2h3YXJlLmgiICAgICAgICAgICAgLyogSGFyZHdhcmUgZGVmaW5lcyBhbmQgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgImFjdXRpbHMuaCIgICAgICAgICAgICAvKiBVdGlsaXR5IGludGVyZmFjZXMgKi8KKyNpbmNsdWRlICJhY25hbWVzLmgiCQkvKiBHbG9iYWwgQUNQSSBuYW1lcyBhbmQgc3RyaW5ncyAqLworI2luY2x1ZGUgImFjY29uZmlnLmgiCQkvKiBDb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLworI2luY2x1ZGUgInBsYXRmb3JtL2FjZW52LmgiCS8qIFRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBpdGVtcyAqLworI2luY2x1ZGUgImFjdHlwZXMuaCIJCS8qIEZ1bmRhbWVudGFsIGNvbW1vbiBkYXRhIHR5cGVzICovCisjaW5jbHVkZSAiYWNleGNlcC5oIgkJLyogQUNQSSBleGNlcHRpb24gY29kZXMgKi8KKyNpbmNsdWRlICJhY21hY3Jvcy5oIgkJLyogQyBtYWNyb3MgKi8KKyNpbmNsdWRlICJhY3RibC5oIgkJLyogQUNQSSB0YWJsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImFjbG9jYWwuaCIJCS8qIEludGVybmFsIGRhdGEgdHlwZXMgKi8KKyNpbmNsdWRlICJhY291dHB1dC5oIgkJLyogRXJyb3Igb3V0cHV0IGFuZCBEZWJ1ZyBtYWNyb3MgKi8KKyNpbmNsdWRlICJhY3Bpb3N4Zi5oIgkJLyogSW50ZXJmYWNlcyB0byB0aGUgQUNQSS10by1PUyBsYXllciAqLworI2luY2x1ZGUgImFjcGl4Zi5oIgkJLyogQUNQSSBjb3JlIHN1YnN5c3RlbSBleHRlcm5hbCBpbnRlcmZhY2VzICovCisjaW5jbHVkZSAiYWNvYmplY3QuaCIJCS8qIEFDUEkgaW50ZXJuYWwgb2JqZWN0ICovCisjaW5jbHVkZSAiYWNzdHJ1Y3QuaCIJCS8qIENvbW1vbiBzdHJ1Y3R1cmVzICovCisjaW5jbHVkZSAiYWNnbG9iYWwuaCIJCS8qIEFsbCBnbG9iYWwgdmFyaWFibGVzICovCisjaW5jbHVkZSAiYWNod2FyZS5oIgkJLyogSGFyZHdhcmUgZGVmaW5lcyBhbmQgaW50ZXJmYWNlcyAqLworI2luY2x1ZGUgImFjdXRpbHMuaCIJCS8qIFV0aWxpdHkgaW50ZXJmYWNlcyAqLwogCi0KLSNlbmRpZiAvKiBfX0FDUElfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ1BJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAppbmRleCA4ZDBlMTI5Li4wYjU0ZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaApAQCAtMzUsNDggKzM1LDQxIEBACiAvKiBUQkQ6IE1ha2UgZHluYW1pYyAqLwogI2RlZmluZSBBQ1BJX01BWF9IQU5ETEVTCTEwCiBzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCB7Ci0JdTMyCQkJY291bnQ7Ci0JYWNwaV9oYW5kbGUJCWhhbmRsZXNbQUNQSV9NQVhfSEFORExFU107CisJdTMyIGNvdW50OworCWFjcGlfaGFuZGxlIGhhbmRsZXNbQUNQSV9NQVhfSEFORExFU107CiB9OwogCi0KIC8qIGFjcGlfdXRpbHMuaCAqLwogYWNwaV9zdGF0dXMKLWFjcGlfZXh0cmFjdF9wYWNrYWdlICgKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAqcGFja2FnZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAqZm9ybWF0LAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICpidWZmZXIpOworYWNwaV9leHRyYWN0X3BhY2thZ2UodW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UsCisJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpmb3JtYXQsIHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKTsKIGFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX2ludGVnZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgIGhhbmRsZSwKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICBwYXRobmFtZSwKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqYXJndW1lbnRzLAotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICpkYXRhKTsKK2FjcGlfZXZhbHVhdGVfaW50ZWdlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCSAgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgICBzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqYXJndW1lbnRzLCB1bnNpZ25lZCBsb25nICpkYXRhKTsKIGFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgaGFuZGxlLAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgIHBhdGhuYW1lLAotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICphcmd1bWVudHMsCi0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QpOworYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJYWNwaV9zdHJpbmcgcGF0aG5hbWUsCisJCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqYXJndW1lbnRzLAorCQkJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QpOwogCi0KLSNpZmRlZiBDT05GSUdfQUNQSV9CVVMKKyNpZmRlZiBDT05GSUdfQUNQSQogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCiAjZGVmaW5lIEFDUElfQlVTX0ZJTEVfUk9PVAkiYWNwaSIKLWV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmFjcGlfcm9vdF9kaXI7Ci1leHRlcm4gRkFEVF9ERVNDUklQVE9SCQlhY3BpX2ZhZHQ7CitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX3Jvb3RfZGlyOworZXh0ZXJuIEZBRFRfREVTQ1JJUFRPUiBhY3BpX2ZhZHQ7CiAKIGVudW0gYWNwaV9idXNfcmVtb3ZhbF90eXBlIHsKLQlBQ1BJX0JVU19SRU1PVkFMX05PUk1BTAk9IDAsCisJQUNQSV9CVVNfUkVNT1ZBTF9OT1JNQUwgPSAwLAogCUFDUElfQlVTX1JFTU9WQUxfRUpFQ1QsCiAJQUNQSV9CVVNfUkVNT1ZBTF9TVVBSSVNFLAogCUFDUElfQlVTX1JFTU9WQUxfVFlQRV9DT1VOVAogfTsKIAogZW51bSBhY3BpX2J1c19kZXZpY2VfdHlwZSB7Ci0JQUNQSV9CVVNfVFlQRV9ERVZJQ0UJPSAwLAorCUFDUElfQlVTX1RZUEVfREVWSUNFID0gMCwKIAlBQ1BJX0JVU19UWVBFX1BPV0VSLAogCUFDUElfQlVTX1RZUEVfUFJPQ0VTU09SLAogCUFDUElfQlVTX1RZUEVfVEhFUk1BTCwKQEAgLTg5LDYxICs4Miw2MCBAQAogc3RydWN0IGFjcGlfZHJpdmVyOwogc3RydWN0IGFjcGlfZGV2aWNlOwogCi0KIC8qCiAgKiBBQ1BJIERyaXZlcgogICogLS0tLS0tLS0tLS0KICAqLwogCi10eXBlZGVmIGludCAoKmFjcGlfb3BfYWRkKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotdHlwZWRlZiBpbnQgKCphY3BpX29wX3JlbW92ZSkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3BfbG9jaykJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3Bfc3RhcnQpCShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3Bfc3RvcCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3Bfc3VzcGVuZCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpOwotdHlwZWRlZiBpbnQgKCphY3BpX29wX3Jlc3VtZSkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpOwotdHlwZWRlZiBpbnQgKCphY3BpX29wX3NjYW4pCShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3BfYmluZCkJKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF91bmJpbmQpCShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3BfbWF0Y2gpCShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKLQkJCQkgc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOwordHlwZWRlZiBpbnQgKCphY3BpX29wX2FkZCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3BfcmVtb3ZlKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBpbnQgdHlwZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3BfbG9jaykgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgaW50IHR5cGUpOwordHlwZWRlZiBpbnQgKCphY3BpX29wX3N0YXJ0KSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9zdG9wKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBpbnQgdHlwZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3Bfc3VzcGVuZCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgaW50IHN0YXRlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9yZXN1bWUpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIGludCBzdGF0ZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3Bfc2NhbikgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3BfYmluZCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3BfdW5iaW5kKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9tYXRjaCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX2RyaXZlciAqIGRyaXZlcik7CiAKIHN0cnVjdCBhY3BpX2J1c19vcHMgewotCXUzMiAJCQlhY3BpX29wX2FkZDoxOwotCXUzMgkJCWFjcGlfb3BfcmVtb3ZlOjE7Ci0JdTMyCQkJYWNwaV9vcF9sb2NrOjE7Ci0JdTMyCQkJYWNwaV9vcF9zdGFydDoxOwotCXUzMgkJCWFjcGlfb3Bfc3RvcDoxOwotCXUzMgkJCWFjcGlfb3Bfc3VzcGVuZDoxOwotCXUzMgkJCWFjcGlfb3BfcmVzdW1lOjE7Ci0JdTMyCQkJYWNwaV9vcF9zY2FuOjE7Ci0JdTMyCQkJYWNwaV9vcF9iaW5kOjE7Ci0JdTMyCQkJYWNwaV9vcF91bmJpbmQ6MTsKLQl1MzIJCQlhY3BpX29wX21hdGNoOjE7Ci0JdTMyCQkJcmVzZXJ2ZWQ6MjE7CisJdTMyIGFjcGlfb3BfYWRkOjE7CisJdTMyIGFjcGlfb3BfcmVtb3ZlOjE7CisJdTMyIGFjcGlfb3BfbG9jazoxOworCXUzMiBhY3BpX29wX3N0YXJ0OjE7CisJdTMyIGFjcGlfb3Bfc3RvcDoxOworCXUzMiBhY3BpX29wX3N1c3BlbmQ6MTsKKwl1MzIgYWNwaV9vcF9yZXN1bWU6MTsKKwl1MzIgYWNwaV9vcF9zY2FuOjE7CisJdTMyIGFjcGlfb3BfYmluZDoxOworCXUzMiBhY3BpX29wX3VuYmluZDoxOworCXUzMiBhY3BpX29wX21hdGNoOjE7CisJdTMyIHJlc2VydmVkOjIxOwogfTsKIAogc3RydWN0IGFjcGlfZGV2aWNlX29wcyB7Ci0JYWNwaV9vcF9hZGQJCWFkZDsKLQlhY3BpX29wX3JlbW92ZQkJcmVtb3ZlOwotCWFjcGlfb3BfbG9jawkJbG9jazsKLQlhY3BpX29wX3N0YXJ0CQlzdGFydDsKLQlhY3BpX29wX3N0b3AJCXN0b3A7Ci0JYWNwaV9vcF9zdXNwZW5kCQlzdXNwZW5kOwotCWFjcGlfb3BfcmVzdW1lCQlyZXN1bWU7Ci0JYWNwaV9vcF9zY2FuCQlzY2FuOwotCWFjcGlfb3BfYmluZAkJYmluZDsKLQlhY3BpX29wX3VuYmluZAkJdW5iaW5kOwotCWFjcGlfb3BfbWF0Y2gJCW1hdGNoOworCWFjcGlfb3BfYWRkIGFkZDsKKwlhY3BpX29wX3JlbW92ZSByZW1vdmU7CisJYWNwaV9vcF9sb2NrIGxvY2s7CisJYWNwaV9vcF9zdGFydCBzdGFydDsKKwlhY3BpX29wX3N0b3Agc3RvcDsKKwlhY3BpX29wX3N1c3BlbmQgc3VzcGVuZDsKKwlhY3BpX29wX3Jlc3VtZSByZXN1bWU7CisJYWNwaV9vcF9zY2FuIHNjYW47CisJYWNwaV9vcF9iaW5kIGJpbmQ7CisJYWNwaV9vcF91bmJpbmQgdW5iaW5kOworCWFjcGlfb3BfbWF0Y2ggbWF0Y2g7CiB9OwogCiBzdHJ1Y3QgYWNwaV9kcml2ZXIgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQljaGFyCQkJbmFtZVs4MF07Ci0JY2hhcgkJCWNsYXNzWzgwXTsKLQlhdG9taWNfdAkJcmVmZXJlbmNlczsKLQljaGFyCQkJKmlkczsJCS8qIFN1cHBvcnRlZCBIYXJkd2FyZSBJRHMgKi8KLQlzdHJ1Y3QgYWNwaV9kZXZpY2Vfb3BzCW9wczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJY2hhciBuYW1lWzgwXTsKKwljaGFyIGNsYXNzWzgwXTsKKwlhdG9taWNfdCByZWZlcmVuY2VzOworCWNoYXIgKmlkczsJCS8qIFN1cHBvcnRlZCBIYXJkd2FyZSBJRHMgKi8KKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfb3BzIG9wczsKIH07CiAKIC8qCkBAIC0xNTQsNjAgKzE0Niw1NyBAQAogLyogU3RhdHVzIChfU1RBKSAqLwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2Vfc3RhdHVzIHsKLQl1MzIJCQlwcmVzZW50OjE7Ci0JdTMyCQkJZW5hYmxlZDoxOwotCXUzMgkJCXNob3dfaW5fdWk6MTsKLQl1MzIJCQlmdW5jdGlvbmFsOjE7Ci0JdTMyCQkJYmF0dGVyeV9wcmVzZW50OjE7Ci0JdTMyCQkJcmVzZXJ2ZWQ6Mjc7CisJdTMyIHByZXNlbnQ6MTsKKwl1MzIgZW5hYmxlZDoxOworCXUzMiBzaG93X2luX3VpOjE7CisJdTMyIGZ1bmN0aW9uYWw6MTsKKwl1MzIgYmF0dGVyeV9wcmVzZW50OjE7CisJdTMyIHJlc2VydmVkOjI3OwogfTsKIAotCiAvKiBGbGFncyAqLwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfZmxhZ3MgewotCXUzMgkJCWR5bmFtaWNfc3RhdHVzOjE7Ci0JdTMyCQkJaGFyZHdhcmVfaWQ6MTsKLQl1MzIJCQljb21wYXRpYmxlX2lkczoxOwotCXUzMgkJCWJ1c19hZGRyZXNzOjE7Ci0JdTMyCQkJdW5pcXVlX2lkOjE7Ci0JdTMyCQkJcmVtb3ZhYmxlOjE7Ci0JdTMyCQkJZWplY3RhYmxlOjE7Ci0JdTMyCQkJbG9ja2FibGU6MTsKLQl1MzIJCQlzdXByaXNlX3JlbW92YWxfb2s6MTsKLQl1MzIJCQlwb3dlcl9tYW5hZ2VhYmxlOjE7Ci0JdTMyCQkJcGVyZm9ybWFuY2VfbWFuYWdlYWJsZToxOwotCXUzMgkJCXdha2VfY2FwYWJsZToxOyAvKiBXYWtldXAoX1BSVykgc3VwcG9ydGVkPyAqLwotCXUzMgkJCXJlc2VydmVkOjIwOworCXUzMiBkeW5hbWljX3N0YXR1czoxOworCXUzMiBoYXJkd2FyZV9pZDoxOworCXUzMiBjb21wYXRpYmxlX2lkczoxOworCXUzMiBidXNfYWRkcmVzczoxOworCXUzMiB1bmlxdWVfaWQ6MTsKKwl1MzIgcmVtb3ZhYmxlOjE7CisJdTMyIGVqZWN0YWJsZToxOworCXUzMiBsb2NrYWJsZToxOworCXUzMiBzdXByaXNlX3JlbW92YWxfb2s6MTsKKwl1MzIgcG93ZXJfbWFuYWdlYWJsZToxOworCXUzMiBwZXJmb3JtYW5jZV9tYW5hZ2VhYmxlOjE7CisJdTMyIHdha2VfY2FwYWJsZToxOwkvKiBXYWtldXAoX1BSVykgc3VwcG9ydGVkPyAqLworCXUzMiByZXNlcnZlZDoyMDsKIH07CiAKLQogLyogRmlsZSBTeXN0ZW0gKi8KIAogc3RydWN0IGFjcGlfZGV2aWNlX2RpciB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSplbnRyeTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwogfTsKIAogI2RlZmluZSBhY3BpX2RldmljZV9kaXIoZCkJKChkKS0+ZGlyLmVudHJ5KQogCi0KIC8qIFBsdWcgYW5kIFBsYXkgKi8KIAotdHlwZWRlZiBjaGFyCQkJYWNwaV9idXNfaWRbNV07Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCWFjcGlfYnVzX2FkZHJlc3M7Ci10eXBlZGVmIGNoYXIJCQlhY3BpX2hhcmR3YXJlX2lkWzldOwotdHlwZWRlZiBjaGFyCQkJYWNwaV91bmlxdWVfaWRbOV07Ci10eXBlZGVmIGNoYXIJCQlhY3BpX2RldmljZV9uYW1lWzQwXTsKLXR5cGVkZWYgY2hhcgkJCWFjcGlfZGV2aWNlX2NsYXNzWzIwXTsKK3R5cGVkZWYgY2hhciBhY3BpX2J1c19pZFs1XTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBhY3BpX2J1c19hZGRyZXNzOwordHlwZWRlZiBjaGFyIGFjcGlfaGFyZHdhcmVfaWRbOV07Cit0eXBlZGVmIGNoYXIgYWNwaV91bmlxdWVfaWRbOV07Cit0eXBlZGVmIGNoYXIgYWNwaV9kZXZpY2VfbmFtZVs0MF07Cit0eXBlZGVmIGNoYXIgYWNwaV9kZXZpY2VfY2xhc3NbMjBdOwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfcG5wIHsKLQlhY3BpX2J1c19pZAkJYnVzX2lkOwkJICAgICAgICAgICAgICAgLyogT2JqZWN0IG5hbWUgKi8KLQlhY3BpX2J1c19hZGRyZXNzCWJ1c19hZGRyZXNzOwkgICAgICAgICAgICAgICAgICAgICAgLyogX0FEUiAqLwotCWFjcGlfaGFyZHdhcmVfaWQJaGFyZHdhcmVfaWQ7CSAgICAgICAgICAgICAgICAgICAgICAvKiBfSElEICovCi0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdDsJCSAgICAgLyogX0NJRHMgKi8KLQlhY3BpX3VuaXF1ZV9pZAkJdW5pcXVlX2lkOwkgICAgICAgICAgICAgICAgICAgICAgLyogX1VJRCAqLwotCWFjcGlfZGV2aWNlX25hbWUJZGV2aWNlX25hbWU7CSAgICAgICAgIC8qIERyaXZlci1kZXRlcm1pbmVkICovCi0JYWNwaV9kZXZpY2VfY2xhc3MJZGV2aWNlX2NsYXNzOwkgICAgICAgICAvKiAgICAgICAgIiAgICAgICAgICAqLworCWFjcGlfYnVzX2lkIGJ1c19pZDsJLyogT2JqZWN0IG5hbWUgKi8KKwlhY3BpX2J1c19hZGRyZXNzIGJ1c19hZGRyZXNzOwkvKiBfQURSICovCisJYWNwaV9oYXJkd2FyZV9pZCBoYXJkd2FyZV9pZDsJLyogX0hJRCAqLworCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3Q7CS8qIF9DSURzICovCisJYWNwaV91bmlxdWVfaWQgdW5pcXVlX2lkOwkvKiBfVUlEICovCisJYWNwaV9kZXZpY2VfbmFtZSBkZXZpY2VfbmFtZTsJLyogRHJpdmVyLWRldGVybWluZWQgKi8KKwlhY3BpX2RldmljZV9jbGFzcyBkZXZpY2VfY2xhc3M7CS8qICAgICAgICAiICAgICAgICAgICovCiB9OwogCiAjZGVmaW5lIGFjcGlfZGV2aWNlX2JpZChkKQkoKGQpLT5wbnAuYnVzX2lkKQpAQCAtMjE3LDExNCArMjA2LDExMSBAQAogI2RlZmluZSBhY3BpX2RldmljZV9uYW1lKGQpCSgoZCktPnBucC5kZXZpY2VfbmFtZSkKICNkZWZpbmUgYWNwaV9kZXZpY2VfY2xhc3MoZCkJKChkKS0+cG5wLmRldmljZV9jbGFzcykKIAotCiAvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAKIHN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9mbGFncyB7Ci0JdTMyCQkJZXhwbGljaXRfZ2V0OjE7CQkgICAgIC8qIF9QU0MgcHJlc2VudD8gKi8KLQl1MzIJCQlwb3dlcl9yZXNvdXJjZXM6MTsJICAgLyogUG93ZXIgcmVzb3VyY2VzICovCi0JdTMyCQkJaW5ydXNoX2N1cnJlbnQ6MTsJICAvKiBTZXJpYWxpemUgRHgtPkQwICovCi0JdTMyCQkJcG93ZXJfcmVtb3ZlZDoxOwkgICAvKiBPcHRpbWl6ZSBEeC0+RDAgKi8KLQl1MzIJCQlyZXNlcnZlZDoyODsKKwl1MzIgZXhwbGljaXRfZ2V0OjE7CS8qIF9QU0MgcHJlc2VudD8gKi8KKwl1MzIgcG93ZXJfcmVzb3VyY2VzOjE7CS8qIFBvd2VyIHJlc291cmNlcyAqLworCXUzMiBpbnJ1c2hfY3VycmVudDoxOwkvKiBTZXJpYWxpemUgRHgtPkQwICovCisJdTMyIHBvd2VyX3JlbW92ZWQ6MTsJLyogT3B0aW1pemUgRHgtPkQwICovCisJdTMyIHJlc2VydmVkOjI4OwogfTsKIAogc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX3N0YXRlIHsKIAlzdHJ1Y3QgewotCQl1OAkJCXZhbGlkOjE7CQotCQl1OAkJCWV4cGxpY2l0X3NldDoxOwkgICAgIC8qIF9QU3ggcHJlc2VudD8gKi8KLQkJdTgJCQlyZXNlcnZlZDo2OwotCX0JCQlmbGFnczsKLQlpbnQJCQlwb3dlcjsJCSAgLyogJSBQb3dlciAoY29tcGFyZWQgdG8gRDApICovCi0JaW50CQkJbGF0ZW5jeTsJLyogRHgtPkQwIHRpbWUgKG1pY3Jvc2Vjb25kcykgKi8KLQlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdAlyZXNvdXJjZXM7CS8qIFBvd2VyIHJlc291cmNlcyByZWZlcmVuY2VkICovCisJCXU4IHZhbGlkOjE7CisJCXU4IGV4cGxpY2l0X3NldDoxOwkvKiBfUFN4IHByZXNlbnQ/ICovCisJCXU4IHJlc2VydmVkOjY7CisJfSBmbGFnczsKKwlpbnQgcG93ZXI7CQkvKiAlIFBvd2VyIChjb21wYXJlZCB0byBEMCkgKi8KKwlpbnQgbGF0ZW5jeTsJCS8qIER4LT5EMCB0aW1lIChtaWNyb3NlY29uZHMpICovCisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgcmVzb3VyY2VzOwkvKiBQb3dlciByZXNvdXJjZXMgcmVmZXJlbmNlZCAqLwogfTsKIAogc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyIHsKLQlpbnQJCQlzdGF0ZTsJCSAgICAgICAgICAgICAvKiBDdXJyZW50IHN0YXRlICovCisJaW50IHN0YXRlOwkJLyogQ3VycmVudCBzdGF0ZSAqLwogCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9mbGFncyBmbGFnczsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfcG93ZXJfc3RhdGUgc3RhdGVzWzRdOyAgICAgLyogUG93ZXIgc3RhdGVzIChEMC1EMykgKi8KKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfcG93ZXJfc3RhdGUgc3RhdGVzWzRdOwkvKiBQb3dlciBzdGF0ZXMgKEQwLUQzKSAqLwogfTsKIAotCiAvKiBQZXJmb3JtYW5jZSBNYW5hZ2VtZW50ICovCiAKIHN0cnVjdCBhY3BpX2RldmljZV9wZXJmX2ZsYWdzIHsKLQl1OAkJCXJlc2VydmVkOjg7CisJdTggcmVzZXJ2ZWQ6ODsKIH07CiAKIHN0cnVjdCBhY3BpX2RldmljZV9wZXJmX3N0YXRlIHsKIAlzdHJ1Y3QgewotCQl1OAkJCXZhbGlkOjE7CQotCQl1OAkJCXJlc2VydmVkOjc7Ci0JfQkJCWZsYWdzOwotCXU4CQkJcG93ZXI7CQkgIC8qICUgUG93ZXIgKGNvbXBhcmVkIHRvIFAwKSAqLwotCXU4CQkJcGVyZm9ybWFuY2U7CSAgLyogJSBQZXJmb3JtYW5jZSAoICAgICIgICApICovCi0JaW50CQkJbGF0ZW5jeTsJLyogUHgtPlAwIHRpbWUgKG1pY3Jvc2Vjb25kcykgKi8KKwkJdTggdmFsaWQ6MTsKKwkJdTggcmVzZXJ2ZWQ6NzsKKwl9IGZsYWdzOworCXU4IHBvd2VyOwkJLyogJSBQb3dlciAoY29tcGFyZWQgdG8gUDApICovCisJdTggcGVyZm9ybWFuY2U7CQkvKiAlIFBlcmZvcm1hbmNlICggICAgIiAgICkgKi8KKwlpbnQgbGF0ZW5jeTsJCS8qIFB4LT5QMCB0aW1lIChtaWNyb3NlY29uZHMpICovCiB9OwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfcGVyZiB7Ci0JaW50CQkJc3RhdGU7CisJaW50IHN0YXRlOwogCXN0cnVjdCBhY3BpX2RldmljZV9wZXJmX2ZsYWdzIGZsYWdzOwotCWludAkJCXN0YXRlX2NvdW50OworCWludCBzdGF0ZV9jb3VudDsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2VfcGVyZl9zdGF0ZSAqc3RhdGVzOwogfTsKIAogLyogV2FrZXVwIE1hbmFnZW1lbnQgKi8KIHN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfZmxhZ3MgewotCXU4CXZhbGlkOjE7IC8qIENhbiBzdWNjZXNzZnVsbHkgZW5hYmxlIHdha2V1cD8gKi8KLQl1OAlydW5fd2FrZToxOyAvKiBSdW4tV2FrZSBHUEUgZGV2aWNlcyAqLworCXU4IHZhbGlkOjE7CQkvKiBDYW4gc3VjY2Vzc2Z1bGx5IGVuYWJsZSB3YWtldXA/ICovCisJdTggcnVuX3dha2U6MTsJCS8qIFJ1bi1XYWtlIEdQRSBkZXZpY2VzICovCiB9OwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwX3N0YXRlIHsKLQl1OAllbmFibGVkOjE7Ci0JdTgJYWN0aXZlOjE7CisJdTggZW5hYmxlZDoxOworCXU4IGFjdGl2ZToxOwogfTsKIAogc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cCB7Ci0JYWNwaV9oYW5kbGUJCWdwZV9kZXZpY2U7Ci0JYWNwaV9pbnRlZ2VyCQlncGVfbnVtYmVyOzsKLQlhY3BpX2ludGVnZXIJCXNsZWVwX3N0YXRlOwotCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0CXJlc291cmNlczsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwX3N0YXRlCXN0YXRlOwotCXN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfZmxhZ3MJZmxhZ3M7CisJYWNwaV9oYW5kbGUgZ3BlX2RldmljZTsKKwlhY3BpX2ludGVnZXIgZ3BlX251bWJlcjs7CisJYWNwaV9pbnRlZ2VyIHNsZWVwX3N0YXRlOworCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0IHJlc291cmNlczsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwX3N0YXRlIHN0YXRlOworCXN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfZmxhZ3MgZmxhZ3M7CiB9OwogCiAvKiBEZXZpY2UgKi8KIAogc3RydWN0IGFjcGlfZGV2aWNlIHsKLQlhY3BpX2hhbmRsZQkJaGFuZGxlOwotCXN0cnVjdCBhY3BpX2RldmljZQkqcGFyZW50OwotCXN0cnVjdCBsaXN0X2hlYWQJY2hpbGRyZW47Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQJd2FrZXVwX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAlnX2xpc3Q7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRyZW47CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgd2FrZXVwX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBnX2xpc3Q7CiAJc3RydWN0IGFjcGlfZGV2aWNlX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfZGV2aWNlX2ZsYWdzIGZsYWdzOwotCXN0cnVjdCBhY3BpX2RldmljZV9wbnAJcG5wOworCXN0cnVjdCBhY3BpX2RldmljZV9wbnAgcG5wOwogCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlciBwb3dlcjsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwIHdha2V1cDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfcGVyZglwZXJmb3JtYW5jZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfZGlyCWRpcjsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2Vfb3BzCW9wczsKLQlzdHJ1Y3QgYWNwaV9kcml2ZXIJKmRyaXZlcjsKLQl2b2lkCQkJKmRyaXZlcl9kYXRhOwotCXN0cnVjdCBrb2JqZWN0CQlrb2JqOworCXN0cnVjdCBhY3BpX2RldmljZV9wZXJmIHBlcmZvcm1hbmNlOworCXN0cnVjdCBhY3BpX2RldmljZV9kaXIgZGlyOworCXN0cnVjdCBhY3BpX2RldmljZV9vcHMgb3BzOworCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOworCXZvaWQgKmRyaXZlcl9kYXRhOworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiB9OwogCiAjZGVmaW5lIGFjcGlfZHJpdmVyX2RhdGEoZCkJKChkKS0+ZHJpdmVyX2RhdGEpCiAKLQogLyoKICAqIEV2ZW50cwogICogLS0tLS0tCiAgKi8KIAogc3RydWN0IGFjcGlfYnVzX2V2ZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0JYWNwaV9kZXZpY2VfY2xhc3MJZGV2aWNlX2NsYXNzOwotCWFjcGlfYnVzX2lkCQlidXNfaWQ7Ci0JdTMyCQkJdHlwZTsKLQl1MzIJCQlkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlhY3BpX2RldmljZV9jbGFzcyBkZXZpY2VfY2xhc3M7CisJYWNwaV9idXNfaWQgYnVzX2lkOworCXUzMiB0eXBlOworCXUzMiBkYXRhOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzdWJzeXN0ZW0gYWNwaV9zdWJzeXM7CkBAIC0zMzUsMzQgKzMyMSwzMiBAQAogCiBpbnQgYWNwaV9idXNfZ2V0X2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RldmljZSAqKmRldmljZSk7CiB2b2lkIGFjcGlfYnVzX2RhdGFfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmdW5jdGlvbiwgdm9pZCAqY29udGV4dCk7Ci1pbnQgYWNwaV9idXNfZ2V0X3N0YXR1cyAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotaW50IGFjcGlfYnVzX2dldF9wb3dlciAoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnN0YXRlKTsKLWludCBhY3BpX2J1c19zZXRfcG93ZXIgKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHN0YXRlKTsKLWludCBhY3BpX2J1c19nZW5lcmF0ZV9ldmVudCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHU4IHR5cGUsIGludCBkYXRhKTsKLWludCBhY3BpX2J1c19yZWNlaXZlX2V2ZW50IChzdHJ1Y3QgYWNwaV9idXNfZXZlbnQgKmV2ZW50KTsKLWludCBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKLWludCBhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlciAoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOwotaW50IGFjcGlfYnVzX2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICoqY2hpbGQsIHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LAotCQlhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKTsKLWludCBhY3BpX2J1c19zdGFydCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworaW50IGFjcGlfYnVzX2dldF9zdGF0dXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworaW50IGFjcGlfYnVzX2dldF9wb3dlcihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqc3RhdGUpOworaW50IGFjcGlfYnVzX3NldF9wb3dlcihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzdGF0ZSk7CitpbnQgYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHU4IHR5cGUsIGludCBkYXRhKTsKK2ludCBhY3BpX2J1c19yZWNlaXZlX2V2ZW50KHN0cnVjdCBhY3BpX2J1c19ldmVudCAqZXZlbnQpOworaW50IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7CitpbnQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOworaW50IGFjcGlfYnVzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCwgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsCisJCSBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKTsKK2ludCBhY3BpX2J1c19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKLQotaW50IGFjcGlfbWF0Y2hfaWRzIChzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwgY2hhcgkqaWRzKTsKK2ludCBhY3BpX21hdGNoX2lkcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgY2hhciAqaWRzKTsKIGludCBhY3BpX2NyZWF0ZV9kaXIoc3RydWN0IGFjcGlfZGV2aWNlICopOwogdm9pZCBhY3BpX3JlbW92ZV9kaXIoc3RydWN0IGFjcGlfZGV2aWNlICopOwogCi0KIC8qCiAgKiBCaW5kIHBoeXNpY2FsIGRldmljZXMgd2l0aCBBQ1BJIGRldmljZXMKICAqLwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogc3RydWN0IGFjcGlfYnVzX3R5cGUgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3QgYnVzX3R5cGUJCSpidXM7Ci0JLyogRm9yIGdlbmVyYWwgZGV2aWNlcyB1bmRlciB0aGUgYnVzKi8KLQlpbnQgKCpmaW5kX2RldmljZSkoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSopOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYnVzX3R5cGUgKmJ1czsKKwkvKiBGb3IgZ2VuZXJhbCBkZXZpY2VzIHVuZGVyIHRoZSBidXMgKi8KKwlpbnQgKCpmaW5kX2RldmljZSkgKHN0cnVjdCBkZXZpY2UgKiwgYWNwaV9oYW5kbGUgKik7CiAJLyogRm9yIGJyaWRnZXMsIHN1Y2ggYXMgUENJIHJvb3QgYnJpZGdlLCBJREUgY29udHJvbGxlciAqLwotCWludCAoKmZpbmRfYnJpZGdlKShzdHJ1Y3QgZGV2aWNlICosIGFjcGlfaGFuZGxlICopOworCWludCAoKmZpbmRfYnJpZGdlKSAoc3RydWN0IGRldmljZSAqLCBhY3BpX2hhbmRsZSAqKTsKIH07CiBpbnQgcmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqKTsKIGludCB1bnJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoc3RydWN0IGFjcGlfYnVzX3R5cGUgKik7CkBAIC0zNzIsNiArMzU2LDYgQEAKIGFjcGlfaGFuZGxlIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiAjZGVmaW5lIERFVklDRV9BQ1BJX0hBTkRMRShkZXYpICgoYWNwaV9oYW5kbGUpKChkZXYpLT5maXJtd2FyZV9kYXRhKSkKIAotI2VuZGlmIC8qQ09ORklHX0FDUElfQlVTKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCiAjZW5kaWYgLypfX0FDUElfQlVTX0hfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKaW5kZXggNTc5ZmUxOS4uYzFiNGUxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAKLQogI2RlZmluZSBBQ1BJX01BWF9TVFJJTkcJCQk4MAogCiAjZGVmaW5lIEFDUElfQlVTX0NPTVBPTkVOVAkJMHgwMDAxMDAwMApAQCAtNDQsNjAgKzQzLDU1IEBACiAjZGVmaW5lIEFDUElfQlVUVE9OX0hJRF9QT1dFUkYJCSJBQ1BJX0ZQQiIKICNkZWZpbmUgQUNQSV9CVVRUT05fSElEX1NMRUVQRgkJIkFDUElfRlNCIgogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKLQogI2RlZmluZSBBQ1BJX1BDSV9DT01QT05FTlQJCTB4MDA0MDAwMDAKIAogLyogQUNQSSBQQ0kgSW50ZXJydXB0IExpbmsgKHBjaV9saW5rLmMpICovCiAKLWludCBhY3BpX2lycV9wZW5hbHR5X2luaXQgKHZvaWQpOwotaW50IGFjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxIChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBpbmRleCwgaW50ICplZGdlX2xldmVsLAotCWludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbmFtZSk7CitpbnQgYWNwaV9pcnFfcGVuYWx0eV9pbml0KHZvaWQpOworaW50IGFjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGluZGV4LCBpbnQgKmVkZ2VfbGV2ZWwsCisJCQkgICAgICAgaW50ICphY3RpdmVfaGlnaF9sb3csIGNoYXIgKipuYW1lKTsKIGludCBhY3BpX3BjaV9saW5rX2ZyZWVfaXJxKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKIC8qIEFDUEkgUENJIEludGVycnVwdCBSb3V0aW5nIChwY2lfaXJxLmMpICovCiAKLWludCBhY3BpX3BjaV9pcnFfYWRkX3BydCAoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc2VnbWVudCwgaW50IGJ1cyk7Ci12b2lkIGFjcGlfcGNpX2lycV9kZWxfcHJ0IChpbnQgc2VnbWVudCwgaW50IGJ1cyk7CitpbnQgYWNwaV9wY2lfaXJxX2FkZF9wcnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc2VnbWVudCwgaW50IGJ1cyk7Cit2b2lkIGFjcGlfcGNpX2lycV9kZWxfcHJ0KGludCBzZWdtZW50LCBpbnQgYnVzKTsKIAogLyogQUNQSSBQQ0kgRGV2aWNlIEJpbmRpbmcgKHBjaV9iaW5kLmMpICovCiAKIHN0cnVjdCBwY2lfYnVzOwogCi1hY3BpX3N0YXR1cyBhY3BpX2dldF9wY2lfaWQgKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCk7Ci1pbnQgYWNwaV9wY2lfYmluZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotaW50IGFjcGlfcGNpX3VuYmluZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotaW50IGFjcGlfcGNpX2JpbmRfcm9vdCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX3BjaV9pZCAqaWQsIHN0cnVjdCBwY2lfYnVzICpidXMpOworYWNwaV9zdGF0dXMgYWNwaV9nZXRfcGNpX2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCk7CitpbnQgYWNwaV9wY2lfYmluZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitpbnQgYWNwaV9wY2lfdW5iaW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK2ludCBhY3BpX3BjaV9iaW5kX3Jvb3Qoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX3BjaV9pZCAqaWQsCisJCSAgICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogLyogQXJjaC1kZWZpbmVkIGZ1bmN0aW9uIHRvIGFkZCBhIGJ1cyB0byB0aGUgc3lzdGVtICovCiAKLXN0cnVjdCBwY2lfYnVzICpwY2lfYWNwaV9zY2FuX3Jvb3Qoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBkb21haW4sIGludCBidXMpOwotCi0jZW5kaWYgLypDT05GSUdfQUNQSV9QQ0kqLwotCitzdHJ1Y3QgcGNpX2J1cyAqcGNpX2FjcGlfc2Nhbl9yb290KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgZG9tYWluLAorCQkJCSAgIGludCBidXMpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyIFJlc291cmNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZkZWYgQ09ORklHX0FDUElfUE9XRVIKLWludCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldik7Ci1pbnQgYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KTsKLWludCBhY3BpX3Bvd2VyX2dldF9pbmZlcnJlZF9zdGF0ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotaW50IGFjcGlfcG93ZXJfdHJhbnNpdGlvbiAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7CitpbnQgYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wb3dlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldik7CitpbnQgYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYpOworaW50IGFjcGlfcG93ZXJfZ2V0X2luZmVycmVkX3N0YXRlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK2ludCBhY3BpX3Bvd2VyX3RyYW5zaXRpb24oc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7CiAjZW5kaWYKIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkIENvbnRyb2xsZXIKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAjaWZkZWYgQ09ORklHX0FDUElfRUMKLWludCBhY3BpX2VjX2VjZHRfcHJvYmUgKHZvaWQpOworaW50IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKTsKICNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmggYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAppbmRleCBlYTQ4OWYyLi45OGUwYjhjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTcsNyArNyw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTUxLDcgKzUwLDYgQEAKICNpbmNsdWRlICJwbGF0Zm9ybS9hY2Vudi5oIgogI2luY2x1ZGUgImFjdHlwZXMuaCIKIAotCiAvKiBQcmlvcml0aWVzIGZvciBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24gKi8KIAogI2RlZmluZSBPU0RfUFJJT1JJVFlfR1BFICAgICAgICAgICAgMQpAQCAtNjIsMjAwICs2MCwxMzYgQEAKICNkZWZpbmUgQUNQSV9OT19VTklUX0xJTUlUICAgICAgICAgICgodTMyKSAtMSkKICNkZWZpbmUgQUNQSV9NVVRFWF9TRU0gICAgICAgICAgICAgIDEKIAotCiAvKiBGdW5jdGlvbnMgZm9yIGFjcGlfb3Nfc2lnbmFsICovCiAKICNkZWZpbmUgQUNQSV9TSUdOQUxfRkFUQUwgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9TSUdOQUxfQlJFQUtQT0lOVCAgICAgIDEKIAotc3RydWN0IGFjcGlfc2lnbmFsX2ZhdGFsX2luZm8KLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQ7CitzdHJ1Y3QgYWNwaV9zaWduYWxfZmF0YWxfaW5mbyB7CisJdTMyIHR5cGU7CisJdTMyIGNvZGU7CisJdTMyIGFyZ3VtZW50OwogfTsKIAotCiAvKgogICogT1NMIEluaXRpYWxpemF0aW9uIGFuZCBzaHV0ZG93biBwcmltaXRpdmVzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX29zX2luaXRpYWxpemUgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV9vc19pbml0aWFsaXplKHZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc190ZXJtaW5hdGUgKAotCXZvaWQpOwotCithY3BpX3N0YXR1cyBhY3BpX29zX3Rlcm1pbmF0ZSh2b2lkKTsKIAogLyoKICAqIEFDUEkgVGFibGUgaW50ZXJmYWNlcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MpOworYWNwaV9zdGF0dXMgYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKHUzMiBmbGFncywgc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3ByZWRlZmluZWRfb3ZlcnJpZGUgKAotCWNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMgKmluaXRfdmFsLAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICpuZXdfdmFsKTsKK2FjcGlfb3NfcHJlZGVmaW5lZF9vdmVycmlkZShjb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICppbml0X3ZhbCwKKwkJCSAgICBhY3BpX3N0cmluZyAqIG5ld192YWwpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9vc190YWJsZV9vdmVycmlkZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqZXhpc3RpbmdfdGFibGUsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKm5ld190YWJsZSk7Ci0KK2FjcGlfb3NfdGFibGVfb3ZlcnJpZGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpleGlzdGluZ190YWJsZSwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKm5ld190YWJsZSk7CiAKIC8qCiAgKiBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF91bml0cywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdW5pdHMsCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAqb3V0X2hhbmRsZSk7CithY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUodTMyIG1heF91bml0cywKKwkJCSB1MzIgaW5pdGlhbF91bml0cywgYWNwaV9oYW5kbGUgKiBvdXRfaGFuZGxlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworYWNwaV9zdGF0dXMgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3dhaXRfc2VtYXBob3JlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7CithY3BpX3N0YXR1cyBhY3BpX29zX3dhaXRfc2VtYXBob3JlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHVuaXRzLCB1MTYgdGltZW91dCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOworYWNwaV9zdGF0dXMgYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHVuaXRzKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfb3NfY3JlYXRlX2xvY2sgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgKm91dF9oYW5kbGUpOworYWNwaV9zdGF0dXMgYWNwaV9vc19jcmVhdGVfbG9jayhhY3BpX2hhbmRsZSAqIG91dF9oYW5kbGUpOwogCi12b2lkCi1hY3BpX29zX2RlbGV0ZV9sb2NrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7Cit2b2lkIGFjcGlfb3NfZGVsZXRlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlKTsKIAotdm9pZAotYWNwaV9vc19hY3F1aXJlX2xvY2sgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwordW5zaWduZWQgbG9uZyBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUpOwogCi12b2lkCi1hY3BpX29zX3JlbGVhc2VfbG9jayAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0KK3ZvaWQgYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAogLyoKICAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBtYXBwaW5nCiAgKi8KLXZvaWQgKgotYWNwaV9vc19hbGxvY2F0ZSAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKK3ZvaWQgKmFjcGlfb3NfYWxsb2NhdGUoYWNwaV9zaXplIHNpemUpOwogCi12b2lkCi1hY3BpX29zX2ZyZWUgKAotCXZvaWQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KTsKK3ZvaWQgYWNwaV9vc19mcmVlKHZvaWQgKm1lbW9yeSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX21hcF9tZW1vcnkgKAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgcGh5c2ljYWxfYWRkcmVzcywKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0Jdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICAgKipsb2dpY2FsX2FkZHJlc3MpOworYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbF9hZGRyZXNzLAorCQkgICBhY3BpX3NpemUgc2l6ZSwgdm9pZCBfX2lvbWVtICoqIGxvZ2ljYWxfYWRkcmVzcyk7CiAKLXZvaWQKLWFjcGlfb3NfdW5tYXBfbWVtb3J5ICgKLQl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgICAqbG9naWNhbF9hZGRyZXNzLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Cit2b2lkIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqIGxvZ2ljYWxfYWRkcmVzcywgYWNwaV9zaXplIHNpemUpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX29zX2dldF9waHlzaWNhbF9hZGRyZXNzICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2dpY2FsX2FkZHJlc3MsCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICAqcGh5c2ljYWxfYWRkcmVzcyk7CithY3BpX29zX2dldF9waHlzaWNhbF9hZGRyZXNzKHZvaWQgKmxvZ2ljYWxfYWRkcmVzcywKKwkJCSAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5c2ljYWxfYWRkcmVzcyk7CiAjZW5kaWYKIAorLyoKKyAqIE1lbW9yeS9PYmplY3QgQ2FjaGUKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfb3NfY3JlYXRlX2NhY2hlKGNoYXIgKmNhY2hlX25hbWUsCisJCSAgICAgdTE2IG9iamVjdF9zaXplLAorCQkgICAgIHUxNiBtYXhfZGVwdGgsIGFjcGlfY2FjaGVfdCAqKiByZXR1cm5fY2FjaGUpOworCithY3BpX3N0YXR1cyBhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2NhY2hlX3QgKiBjYWNoZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9jYWNoZV90ICogY2FjaGUpOworCit2b2lkICphY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfY2FjaGVfdCAqIGNhY2hlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2NhY2hlX3QgKiBjYWNoZSwgdm9pZCAqb2JqZWN0KTsKIAogLyoKICAqIEludGVycnVwdCBoYW5kbGVycwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzaSwKLQlhY3BpX29zZF9oYW5kbGVyICAgICAgICAgICAgICAgIHNlcnZpY2Vfcm91dGluZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlcih1MzIgZ3NpLAorCQkJCSAgYWNwaV9vc2RfaGFuZGxlciBzZXJ2aWNlX3JvdXRpbmUsCisJCQkJICB2b2lkICpjb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzaSwKLQlhY3BpX29zZF9oYW5kbGVyICAgICAgICAgICAgICAgIHNlcnZpY2Vfcm91dGluZSk7Ci0KK2FjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyKHUzMiBnc2ksIGFjcGlfb3NkX2hhbmRsZXIgc2VydmljZV9yb3V0aW5lKTsKIAogLyoKICAqIFRocmVhZHMgYW5kIFNjaGVkdWxpbmcKICAqLwotdTMyCi1hY3BpX29zX2dldF90aHJlYWRfaWQgKAotCXZvaWQpOwordTMyIGFjcGlfb3NfZ2V0X3RocmVhZF9pZCh2b2lkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKLQlhY3BpX29zZF9leGVjX2NhbGxiYWNrICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKHUzMiBwcmlvcml0eSwKKwkJCSAgICBhY3BpX29zZF9leGVjX2NhbGxiYWNrIGZ1bmN0aW9uLCB2b2lkICpjb250ZXh0KTsKIAotdm9pZAotYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSgKLQl2b2lkICogY29udGV4dCk7Cit2b2lkIGFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUodm9pZCAqY29udGV4dCk7CiAKLXZvaWQKLWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwordm9pZCBhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKHZvaWQgKmNvbnRleHQpOwogCi12b2lkCi1hY3BpX29zX3NsZWVwICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyk7Cit2b2lkIGFjcGlfb3Nfc2xlZXAoYWNwaV9pbnRlZ2VyIG1pbGxpc2Vjb25kcyk7CiAKLXZvaWQKLWFjcGlfb3Nfc3RhbGwgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzKTsKLQordm9pZCBhY3BpX29zX3N0YWxsKHUzMiBtaWNyb3NlY29uZHMpOwogCiAvKgogICogUGxhdGZvcm0gYW5kIGhhcmR3YXJlLWluZGVwZW5kZW50IEkvTyBpbnRlcmZhY2VzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX29zX3JlYWRfcG9ydCAoCi0JYWNwaV9pb19hZGRyZXNzICAgICAgICAgICAgICAgICBhZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworYWNwaV9zdGF0dXMgYWNwaV9vc19yZWFkX3BvcnQoYWNwaV9pb19hZGRyZXNzIGFkZHJlc3MsIHUzMiAqIHZhbHVlLCB1MzIgd2lkdGgpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc193cml0ZV9wb3J0ICgKLQlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfaW9fYWRkcmVzcyBhZGRyZXNzLCB1MzIgdmFsdWUsIHUzMiB3aWR0aCk7CiAKIC8qCiAgKiBQbGF0Zm9ybSBhbmQgaGFyZHdhcmUtaW5kZXBlbmRlbnQgcGh5c2ljYWwgbWVtb3J5IGludGVyZmFjZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfb3NfcmVhZF9tZW1vcnkgKAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKK2FjcGlfb3NfcmVhZF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsIHUzMiAqIHZhbHVlLCB1MzIgd2lkdGgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9vc193cml0ZV9tZW1vcnkgKAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCithY3BpX29zX3dyaXRlX21lbW9yeShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywgdTMyIHZhbHVlLCB1MzIgd2lkdGgpOwogCiAvKgogICogUGxhdGZvcm0gYW5kIGhhcmR3YXJlLWluZGVwZW5kZW50IFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcwpAQCAtMjYzLDExMSArMTk3LDY5IEBACiAgKiBjZXJ0YWluIGNvbXBpbGVycyBjb21wbGFpbi4KICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbiAoCi0Jc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqcGNpX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uKHN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkLAorCQkJICAgICAgIHUzMiByZWcsIHZvaWQgKnZhbHVlLCB1MzIgd2lkdGgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbiAoCi0Jc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqcGNpX2lkLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CithY3BpX29zX3dyaXRlX3BjaV9jb25maWd1cmF0aW9uKHN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkLAorCQkJCXUzMiByZWcsIGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIHdpZHRoKTsKIAogLyoKICAqIEludGVyaW0gZnVuY3Rpb24gbmVlZGVkIGZvciBQQ0kgSVJRIHJvdXRpbmcKICAqLwogdm9pZAotYWNwaV9vc19kZXJpdmVfcGNpX2lkKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgcmhhbmRsZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGNoYW5kbGUsCi0Jc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqKnBjaV9pZCk7CithY3BpX29zX2Rlcml2ZV9wY2lfaWQoYWNwaV9oYW5kbGUgcmhhbmRsZSwKKwkJICAgICAgYWNwaV9oYW5kbGUgY2hhbmRsZSwgc3RydWN0IGFjcGlfcGNpX2lkICoqcGNpX2lkKTsKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMKICAqLwotdTgKLWFjcGlfb3NfcmVhZGFibGUgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvaW50ZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwordTggYWNwaV9vc19yZWFkYWJsZSh2b2lkICpwb2ludGVyLCBhY3BpX3NpemUgbGVuZ3RoKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi11OAotYWNwaV9vc193cml0YWJsZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Cit1OCBhY3BpX29zX3dyaXRhYmxlKHZvaWQgKnBvaW50ZXIsIGFjcGlfc2l6ZSBsZW5ndGgpOwogI2VuZGlmCiAKLXU2NAotYWNwaV9vc19nZXRfdGltZXIgKAotCXZvaWQpOwordTY0IGFjcGlfb3NfZ2V0X3RpbWVyKHZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19zaWduYWwgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbyk7CithY3BpX3N0YXR1cyBhY3BpX29zX3NpZ25hbCh1MzIgZnVuY3Rpb24sIHZvaWQgKmluZm8pOwogCiAvKgogICogRGVidWcgcHJpbnQgcm91dGluZXMKICAqLwotdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV9vc19wcmludGYgKAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKmZvcm1hdCwKLQkuLi4pOwordm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRSBhY3BpX29zX3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CiAKLXZvaWQKLWFjcGlfb3NfdnByaW50ZiAoCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCXZhX2xpc3QgICAgICAgICAgICAgICAgIGFyZ3MpOwordm9pZCBhY3BpX29zX3ZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwogCi12b2lkCi1hY3BpX29zX3JlZGlyZWN0X291dHB1dCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGluYXRpb24pOwotCit2b2lkIGFjcGlfb3NfcmVkaXJlY3Rfb3V0cHV0KHZvaWQgKmRlc3RpbmF0aW9uKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKgogICogRGVidWcgaW5wdXQKICAqLwotdTMyCi1hY3BpX29zX2dldF9saW5lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIpOwordTMyIGFjcGlfb3NfZ2V0X2xpbmUoY2hhciAqYnVmZmVyKTsKICNlbmRpZgogCi0KIC8qCiAgKiBEaXJlY3RvcnkgbWFuaXB1bGF0aW9uCiAgKi8KLXZvaWQgKgotYWNwaV9vc19vcGVuX2RpcmVjdG9yeSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqd2lsZGNhcmRfc3BlYywKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9maWxlX3R5cGUpOwordm9pZCAqYWNwaV9vc19vcGVuX2RpcmVjdG9yeShjaGFyICpwYXRobmFtZSwKKwkJCSAgICAgY2hhciAqd2lsZGNhcmRfc3BlYywgY2hhciByZXF1ZXN0ZWRfZmlsZV90eXBlKTsKIAogLyogcmVxdWVzdGVfZmlsZV90eXBlIHZhbHVlcyAqLwogCiAjZGVmaW5lIFJFUVVFU1RfRklMRV9PTkxZICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgUkVRVUVTVF9ESVJfT05MWSAgICAgICAgICAgICAgICAgICAgMQogCitjaGFyICphY3BpX29zX2dldF9uZXh0X2ZpbGVuYW1lKHZvaWQgKmRpcl9oYW5kbGUpOwogCi1jaGFyICoKLWFjcGlfb3NfZ2V0X25leHRfZmlsZW5hbWUgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRpcl9oYW5kbGUpOwotCi12b2lkCi1hY3BpX29zX2Nsb3NlX2RpcmVjdG9yeSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGlyX2hhbmRsZSk7Cit2b2lkIGFjcGlfb3NfY2xvc2VfZGlyZWN0b3J5KHZvaWQgKmRpcl9oYW5kbGUpOwogCiAvKgogICogRGVidWcKICAqLwogdm9pZAotYWNwaV9vc19kYmdfYXNzZXJ0KAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZhaWxlZF9hc3NlcnRpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmlsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CithY3BpX29zX2RiZ19hc3NlcnQodm9pZCAqZmFpbGVkX2Fzc2VydGlvbiwKKwkJICAgdm9pZCAqZmlsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIGNoYXIgKm1lc3NhZ2UpOwogCi0jZW5kaWYgLyogX19BQ1BJT1NYRl9IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDUElPU1hGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCmluZGV4IGY4ZjYxOWYuLjJhOWRiYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKQEAgLTQyLDQ0NyArNDIsMjgzIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotCiAjaWZuZGVmIF9fQUNYRkFDRV9IX18KICNkZWZpbmUgX19BQ1hGQUNFX0hfXwogCiAjaW5jbHVkZSAiYWN0eXBlcy5oIgogI2luY2x1ZGUgImFjdGJsLmgiCiAKLQogLyoKICAqIEdsb2JhbCBpbnRlcmZhY2VzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZV9zdWJzeXN0ZW0gKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2luaXRpYWxpemVfb2JqZWN0cyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CithY3BpX3N0YXR1cyBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV90ZXJtaW5hdGUgKAotCXZvaWQpOworYWNwaV9zdGF0dXMgYWNwaV90ZXJtaW5hdGUodm9pZCk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfc3Vic3lzdGVtX3N0YXR1cyAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX3N1YnN5c3RlbV9zdGF0dXModm9pZCk7CiAjZW5kaWYKIAotYWNwaV9zdGF0dXMKLWFjcGlfZW5hYmxlICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlKHZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kaXNhYmxlICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZSh2b2lkKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfc3lzdGVtX2luZm8gKAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOworYWNwaV9zdGF0dXMgYWNwaV9nZXRfc3lzdGVtX2luZm8oc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKICNlbmRpZgogCi1jb25zdCBjaGFyICoKLWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOworY29uc3QgY2hhciAqYWNwaV9mb3JtYXRfZXhjZXB0aW9uKGFjcGlfc3RhdHVzIGV4Y2VwdGlvbik7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHModm9pZCk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyICgKLQlhY3BpX2luaXRfaGFuZGxlciAgICAgICAgICAgICAgIGhhbmRsZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbik7CithY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcihhY3BpX2luaXRfaGFuZGxlciBoYW5kbGVyLCB1MzIgZnVuY3Rpb24pOwogI2VuZGlmCiAKIC8qCiAgKiBBQ1BJIE1lbW9yeSBtYW5hZ21lbnQKICAqLwotdm9pZCAqCi1hY3BpX2FsbG9jYXRlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwordm9pZCAqYWNwaV9hbGxvY2F0ZSh1MzIgc2l6ZSk7CiAKLXZvaWQgKgotYWNwaV9jYWxsb2NhdGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Cit2b2lkICphY3BpX2NhbGxvY2F0ZSh1MzIgc2l6ZSk7CiAKLXZvaWQKLWFjcGlfZnJlZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWRkcmVzcyk7Ci0KK3ZvaWQgYWNwaV9mcmVlKHZvaWQgKmFkZHJlc3MpOwogCiAvKgogICogQUNQSSB0YWJsZSBtYW5pcHVsYXRpb24gaW50ZXJmYWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9maW5kX3Jvb3RfcG9pbnRlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICpyc2RwX2FkZHJlc3MpOworYWNwaV9maW5kX3Jvb3RfcG9pbnRlcih1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3BvaW50ZXIgKnJzZHBfYWRkcmVzcyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2xvYWRfdGFibGVzICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfbG9hZF90YWJsZXModm9pZCk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfbG9hZF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfcHRyKTsKK2FjcGlfc3RhdHVzIGFjcGlfbG9hZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX3B0cik7CisKK2FjcGlfc3RhdHVzIGFjcGlfdW5sb2FkX3RhYmxlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdW5sb2FkX3RhYmxlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUpOworYWNwaV9nZXRfdGFibGVfaGVhZGVyKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAorCQkgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqb3V0X3RhYmxlX2hlYWRlcik7CisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfdGFibGVfaGVhZGVyICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpvdXRfdGFibGVfaGVhZGVyKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworYWNwaV9nZXRfdGFibGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCisJICAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RhYmxlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlICgKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKnRhYmxlX3BvaW50ZXIpOwotCithY3BpX2dldF9maXJtd2FyZV90YWJsZShhY3BpX3N0cmluZyBzaWduYXR1cmUsCisJCQl1MzIgaW5zdGFuY2UsCisJCQl1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKnRhYmxlX3BvaW50ZXIpOwogCiAvKgogICogTmFtZXNwYWNlIGFuZCBuYW1lIGludGVyZmFjZXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfd2Fsa19uYW1lc3BhY2UgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X29iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwKLQlhY3BpX3dhbGtfY2FsbGJhY2sgICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKK2FjcGlfd2Fsa19uYW1lc3BhY2UoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgYWNwaV9oYW5kbGUgc3RhcnRfb2JqZWN0LAorCQkgICAgdTMyIG1heF9kZXB0aCwKKwkJICAgIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9kZXZpY2VzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpISUQsCi0JYWNwaV93YWxrX2NhbGxiYWNrICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX2dldF9kZXZpY2VzKGNoYXIgKkhJRCwKKwkJIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9uYW1lICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfdHlwZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfcGF0aF9wdHIpOworYWNwaV9nZXRfbmFtZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJICAgICAgdTMyIG5hbWVfdHlwZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfcGF0aF9wdHIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfaGFuZGxlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKLQlhY3BpX3N0cmluZyAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgKnJldF9oYW5kbGUpOworYWNwaV9nZXRfaGFuZGxlKGFjcGlfaGFuZGxlIHBhcmVudCwKKwkJYWNwaV9zdHJpbmcgcGF0aG5hbWUsIGFjcGlfaGFuZGxlICogcmV0X2hhbmRsZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2F0dGFjaF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JYWNwaV9vYmplY3RfaGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworYWNwaV9hdHRhY2hfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZGV0YWNoX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQlhY3BpX29iamVjdF9oYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIpOworYWNwaV9kZXRhY2hfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCWFjcGlfb2JqZWN0X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqZGF0YSk7Ci0KK2FjcGlfZ2V0X2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7CiAKIC8qCiAgKiBPYmplY3QgbWFuaXB1bGF0aW9uIGFuZCBlbnVtZXJhdGlvbgogICovCiBhY3BpX3N0YXR1cwotYWNwaV9ldmFsdWF0ZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgICAgICAgICAqcGFyYW1ldGVyX29iamVjdHMsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0dXJuX29iamVjdF9idWZmZXIpOworYWNwaV9ldmFsdWF0ZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqZWN0LAorCQkgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwYXJhbWV0ZXJfb2JqZWN0cywKKwkJICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9vYmplY3RfYnVmZmVyKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgICAgICAgICAqZXh0ZXJuYWxfcGFyYW1zLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldHVybl9idWZmZXIsCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICByZXR1cm5fdHlwZSk7CithY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZChhY3BpX2hhbmRsZSBvYmplY3QsCisJCQkgICBhY3BpX3N0cmluZyBwYXRobmFtZSwKKwkJCSAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpleHRlcm5hbF9wYXJhbXMsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9idWZmZXIsCisJCQkgICBhY3BpX29iamVjdF90eXBlIHJldHVybl90eXBlKTsKICNlbmRpZgogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfb2JqZWN0X2luZm8gKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldHVybl9idWZmZXIpOworYWNwaV9nZXRfb2JqZWN0X2luZm8oYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfbmV4dF9vYmplY3QgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGNoaWxkLAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgKm91dF9oYW5kbGUpOworYWNwaV9nZXRfbmV4dF9vYmplY3QoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgIGFjcGlfaGFuZGxlIHBhcmVudCwKKwkJICAgICBhY3BpX2hhbmRsZSBjaGlsZCwgYWNwaV9oYW5kbGUgKiBvdXRfaGFuZGxlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3R5cGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgKm91dF90eXBlKTsKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3R5cGUoYWNwaV9oYW5kbGUgb2JqZWN0LCBhY3BpX29iamVjdF90eXBlICogb3V0X3R5cGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfcGFyZW50ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9iamVjdCwKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICpvdXRfaGFuZGxlKTsKLQorYWNwaV9zdGF0dXMgYWNwaV9nZXRfcGFyZW50KGFjcGlfaGFuZGxlIG9iamVjdCwgYWNwaV9oYW5kbGUgKiBvdXRfaGFuZGxlKTsKIAogLyoKICAqIEV2ZW50IGhhbmRsZXIgaW50ZXJmYWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9ldmVudCwKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGhhbmRsZXIsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CithY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcih1MzIgYWNwaV9ldmVudCwKKwkJCQkgYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2V2ZW50LAotCWFjcGlfZXZlbnRfaGFuZGxlciAgICAgICAgICAgICAgaGFuZGxlcik7CithY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBhY3BpX2V2ZW50LCBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl90eXBlLAotCWFjcGlfbm90aWZ5X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlciwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkgICAgdTMyIGhhbmRsZXJfdHlwZSwKKwkJCSAgICBhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl90eXBlLAotCWFjcGlfbm90aWZ5X2hhbmRsZXIgICAgICAgICAgICAgaGFuZGxlcik7CithY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkgICB1MzIgaGFuZGxlcl90eXBlLCBhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZCwKLQlhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyICAgICAgICAgIGhhbmRsZXIsCi0JYWNwaV9hZHJfc3BhY2Vfc2V0dXAgICAgICAgICAgICBzZXR1cCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK2FjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJCSAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQsCisJCQkJICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAorCQkJCSAgIGFjcGlfYWRyX3NwYWNlX3NldHVwIHNldHVwLCB2b2lkICpjb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0JYWNwaV9hZHJfc3BhY2VfdHlwZSAgICAgICAgICAgICBzcGFjZV9pZCwKLQlhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyICAgICAgICAgIGhhbmRsZXIpOworYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKKwkJCQkgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQsCisJCQkJICBhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLQlhY3BpX2V2ZW50X2hhbmRsZXIgICAgICAgICAgICAgIGFkZHJlc3MsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CithY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCSB1MzIgZ3BlX251bWJlciwKKwkJCSB1MzIgdHlwZSwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MsIHZvaWQgKmNvbnRleHQpOwogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIgKAotCWFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgICAgICAgICAgaGFuZGxlcik7CithY3BpX3N0YXR1cyBhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIoYWNwaV9leGNlcHRpb25faGFuZGxlciBoYW5kbGVyKTsKICNlbmRpZgogCi0KIC8qCiAgKiBFdmVudCBpbnRlcmZhY2VzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGUpOworYWNwaV9zdGF0dXMgYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKHUxNiB0aW1lb3V0LCB1MzIgKiBoYW5kbGUpOworCithY3BpX3N0YXR1cyBhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2sodTMyIGhhbmRsZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2sgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKK2FjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCQl1MzIgZ3BlX251bWJlciwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JYWNwaV9ldmVudF9oYW5kbGVyICAgICAgICAgICAgICBhZGRyZXNzKTsKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZW5hYmxlX2V2ZW50ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGlzYWJsZV9ldmVudCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2FjcGlfc3RhdHVzIGFjcGlfY2xlYXJfZXZlbnQodTMyIGV2ZW50KTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfY2xlYXJfZXZlbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCithY3BpX3N0YXR1cyBhY3BpX2dldF9ldmVudF9zdGF0dXModTMyIGV2ZW50LCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cyk7CisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworCithY3BpX3N0YXR1cyBhY3BpX3NldF9ncGVfdHlwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTggdHlwZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzKTsKKworYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzKTsKKworYWNwaV9zdGF0dXMgYWNwaV9jbGVhcl9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncyk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2V2ZW50X3N0YXR1cyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLQlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgICpldmVudF9zdGF0dXMpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCithY3BpX2dldF9ncGVfc3RhdHVzKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCSAgICB1MzIgZ3BlX251bWJlciwKKwkJICAgIHUzMiBmbGFncywgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpOworI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfc2V0X2dwZV90eXBlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CithY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdwZV9ibG9ja19hZGRyZXNzLAorCQkgICAgICAgdTMyIHJlZ2lzdGVyX2NvdW50LCB1MzIgaW50ZXJydXB0X251bWJlcik7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VuYWJsZV9ncGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2Rpc2FibGVfZ3BlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9jbGVhcl9ncGUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2dwZV9zdGF0dXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQlhY3BpX2V2ZW50X3N0YXR1cyAgICAgICAgICAgICAgICpldmVudF9zdGF0dXMpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZ3BlX2Jsb2NrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGdwZV9kZXZpY2UsCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqZ3BlX2Jsb2NrX2FkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9jb3VudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9sZXZlbCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9ncGVfYmxvY2sgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZ3BlX2RldmljZSk7Ci0KK2FjcGlfc3RhdHVzIGFjcGlfcmVtb3ZlX2dwZV9ibG9jayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlKTsKIAogLyoKICAqIFJlc291cmNlIGludGVyZmFjZXMKICAqLwogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCpBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0spICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpyZXNvdXJjZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQorYWNwaV9zdGF0dXMoKkFDUElfV0FMS19SRVNPVVJDRV9DQUxMQkFDSykgKHN0cnVjdCBhY3BpX3Jlc291cmNlICogcmVzb3VyY2UsCisJCQkJCSAgIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOworYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcygKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGRldmljZV9oYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogI2VuZGlmCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3dhbGtfcmVzb3VyY2VzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0JQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLICAgICB1c2VyX2Z1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CithY3BpX3dhbGtfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCisJCSAgICBjaGFyICpwYXRoLAorCQkgICAgQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLIHVzZXJfZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICppbl9idWZmZXIpOworYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqaW5fYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGJ1c19kZXZpY2VfaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOworYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoYWNwaV9oYW5kbGUgYnVzX2RldmljZV9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQgKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKnJlc291cmNlLAotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqb3V0KTsKK2FjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCSAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqb3V0KTsKIAogLyoKICAqIEhhcmR3YXJlIChBQ1BJIGRldmljZSkgaW50ZXJmYWNlcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfcmVnaXN0ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0dXJuX3ZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworYWNwaV9zdGF0dXMgYWNwaV9nZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgKiByZXR1cm5fdmFsdWUsIHUzMiBmbGFncyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfc2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyIHZhbHVlLCB1MzIgZmxhZ3MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9zZXRfcmVnaXN0ZXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IgKAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgcGh5c2ljYWxfYWRkcmVzcyk7CithY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbF9hZGRyZXNzKTsKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciAoCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICAqcGh5c2ljYWxfYWRkcmVzcyk7CithY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyAqIHBoeXNpY2FsX2FkZHJlc3MpOwogI2VuZGlmCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2dldF9zbGVlcF90eXBlX2RhdGEgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfc3RhdGUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2xwX3R5cF9hLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNscF90eXBfYik7CithY3BpX2dldF9zbGVlcF90eXBlX2RhdGEodTggc2xlZXBfc3RhdGUsIHU4ICogc2xwX3R5cF9hLCB1OCAqIHNscF90eXBfYik7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBfc3RhdGUpOworYWNwaV9zdGF0dXMgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKHU4IHNsZWVwX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMgYXNtbGlua2FnZQotYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9zdGF0ZSk7CithY3BpX3N0YXR1cyBhc21saW5rYWdlIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpOwogCi1hY3BpX3N0YXR1cyBhc21saW5rYWdlCi1hY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcyAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhc21saW5rYWdlIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKHZvaWQpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9zdGF0ZSk7CithY3BpX3N0YXR1cyBhY3BpX2xlYXZlX3NsZWVwX3N0YXRlKHU4IHNsZWVwX3N0YXRlKTsKIAotCi0jZW5kaWYgLyogX19BQ1hGQUNFX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNYRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmggYi9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCmluZGV4IGVkNjc5MjYuLjM4ZTc5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaApAQCAtNDQsMzAzICs0NCwyMTYgQEAKICNpZm5kZWYgX19BQ1JFU1JDX0hfXwogI2RlZmluZSBfX0FDUkVTUkNfSF9fCiAKLQogLyoKICAqICBGdW5jdGlvbiBwcm90b3R5cGVzIGNhbGxlZCBmcm9tIEFjcGkqIEFQSXMKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7Ci0KK2FjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOworYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX3JzX2dldF9tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQljaGFyICpwYXRoLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKK2FjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqb3V0cHV0X2J1ZmZlcik7CithY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX2J5dGVfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdF9idWZmZXIsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqb3V0cHV0X2J1ZmZlcik7CithY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3RfYnVmZmVyLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwYWNrYWdlX29iamVjdCwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKTsKLQorYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmplY3QsCisJCQkJIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcik7CiAKIC8qCiAgKiByc2R1bXAKICAqLwogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdCAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqcmVzb3VyY2UpOwordm9pZCBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UpOwogCi12b2lkCi1hY3BpX3JzX2R1bXBfaXJxX2xpc3QgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJvdXRlX3RhYmxlKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwotCit2b2lkIGFjcGlfcnNfZHVtcF9pcnFfbGlzdCh1OCAqIHJvdXRlX3RhYmxlKTsKKyNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAvKgogICogcnNjYWxjCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9zdGFydCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipieXRlX3N0cmVhbV9zdGFydCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplKTsKK2FjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX3N0YXJ0KHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgICAgdTggKiogYnl0ZV9zdHJlYW1fc3RhcnQsIHUzMiAqIHNpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfbGlzdF9sZW5ndGggKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZV9uZWVkZWQpOworYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQl1MzIgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZV9uZWVkZWQpOworYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkgICAgICAgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpwYWNrYWdlX29iamVjdCwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJfc2l6ZV9uZWVkZWQpOworYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhY2thZ2Vfb2JqZWN0LAorCQkJCSAgICAgYWNwaV9zaXplICogYnVmZmVyX3NpemVfbmVlZGVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKTsKK2FjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgICB1MzIgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwgdTggKiBvdXRwdXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbGlzdF90b19ieXRlX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBieXRlX3N0cmVhbV9zaXplX25lZWRlZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXRfYnVmZmVyKTsKK2FjcGlfcnNfbGlzdF90b19ieXRlX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgYWNwaV9zaXplIGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkLAorCQkJICAgIHU4ICogb3V0cHV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2lvX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19pb19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfZml4ZWRfaW9fcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2lvX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19pb19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfaW9fc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2ZpeGVkX2lvX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2lycV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfaXJxX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19pcnFfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19kbWFfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2RtYV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJICAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2RtYV9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfZG1hX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczE2X3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19hZGRyZXNzMTZfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYWRkcmVzczE2X3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19hZGRyZXNzMTZfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0gKAotCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKmxpbmtlZF9saXN0LAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNfYWRkcmVzczMyX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzNjRfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzNjRfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwKKwkJCQkgIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAorCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJCXU4ICoqIG91dHB1dF9idWZmZXIsCisJCQkJYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkyNF9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfbWVtb3J5MjRfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTI0X3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfbWVtb3J5MzJfcmFuZ2VfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCisJCQkJdTggKiogb3V0cHV0X2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLAorCQkJCWFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCisJCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19leHRlbmRlZF9pcnFfcmVzb3VyY2UgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSk7CithY3BpX3JzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSAgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAorCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19leHRlbmRlZF9pcnFfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAorCQkJICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9zdHJlYW1fYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVzX2NvbnN1bWVkLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipvdXRwdXRfYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKKwkJCSBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF90YWdfc3RyZWFtICgKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpsaW5rZWRfbGlzdCwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpieXRlc19jb25zdW1lZCk7CithY3BpX3JzX2VuZF90YWdfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJICAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfdmVuZG9yX3Jlc291cmNlICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX3N0cmVhbV9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0dXJlX3NpemUpOworYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCisJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKKwkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfdmVuZG9yX3N0cmVhbSAoCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqbGlua2VkX2xpc3QsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKm91dHB1dF9idWZmZXIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZXNfY29uc3VtZWQpOworYWNwaV9yc192ZW5kb3Jfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKKwkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpOwogCi11OAotYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9zdGFydF9ieXRlKTsKK3U4IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUodTggcmVzb3VyY2Vfc3RhcnRfYnl0ZSk7CiAKLSNlbmRpZiAgLyogX19BQ1JFU1JDX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNSRVNSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKaW5kZXggZTZiOWUzNi4uOTlkMjM1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKQEAgLTQ0LDE0ICs0NCwxMiBAQAogI2lmbmRlZiBfX0FDU1RSVUNUX0hfXwogI2RlZmluZSBfX0FDU1RSVUNUX0hfXwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFRyZWUgd2Fsa2luZyB0eXBlZGVmcyBhbmQgc3RydWN0cwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qCiAgKiBXYWxrIHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiBhIHBhcnNlIHRyZWUgd2Fsay4gIFVzZWQgZm9yIGJvdGggYSBsZWlzdXJlbHkgc3Ryb2xsIHRocm91Z2gKICAqIHRoZSB0cmVlIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgYW5kIGZvciBjb250cm9sIG1ldGhvZCBleGVjdXRpb24uCkBAIC02NSwxNTIgKzYzLDE0MiBAQAogI2RlZmluZSBBQ1BJX1dBTEtfQ09OU1RfUkVRVUlSRUQgICAgMwogI2RlZmluZSBBQ1BJX1dBTEtfQ09OU1RfT1BUSU9OQUwgICAgNAogCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgTVVTVCBCRSBGSVJTVCEqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrX3R5cGU7Ci0JYWNwaV9vd25lcl9pZCAgICAgICAgICAgICAgICAgICAgICAgb3duZXJfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3duZXIgb2Ygb2JqZWN0cyBjcmVhdGVkIGR1cmluZyB0aGUgd2FsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcHJlZGljYXRlOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3VsdCBvZiBsYXN0IHByZWRpY2F0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBhbGlnbm1lbnQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3Jlc3VsdDsgICAgICAgICAgICAgICAgICAgICAvKiAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfb3BfaW5mbzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZm8gYWJvdXQgbmV4dF9vcCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vcGVyYW5kczsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YWNrIHBvaW50ZXIgZm9yIE9wZXJhbmRzW10gYXJyYXkgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fdXNlZDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IEFNTCBvcGNvZGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZV9kZXB0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHVzaCBmb3IgZml4ZWQgb3IgdmFyIGFyZ3MgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfYnJlYWtwb2ludDsgICAgICAgICAgICAgICAgICAvKiBGb3Igc2luZ2xlIHN0ZXBwaW5nICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9icmVha3BvaW50OyAgICAgICAgICAgICAgICAgICAgLyogVXNlciBBTUwgYnJlYWtwb2ludCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2ZsYWdzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfYXJnX3R5cGVzOworc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSB7CisJdTggZGF0YV90eXBlOwkJLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgTVVTVCBCRSBGSVJTVCEgKi8KKwl1OCB3YWxrX3R5cGU7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsJLyogT3duZXIgb2Ygb2JqZWN0cyBjcmVhdGVkIGR1cmluZyB0aGUgd2FsayAqLworCXU4IGxhc3RfcHJlZGljYXRlOwkvKiBSZXN1bHQgb2YgbGFzdCBwcmVkaWNhdGUgKi8KKwl1OCBjdXJyZW50X3Jlc3VsdDsJLyogKi8KKwl1OCBuZXh0X29wX2luZm87CS8qIEluZm8gYWJvdXQgbmV4dF9vcCAqLworCXU4IG51bV9vcGVyYW5kczsJLyogU3RhY2sgcG9pbnRlciBmb3IgT3BlcmFuZHNbXSBhcnJheSAqLworCXU4IHJldHVybl91c2VkOworCXUxNiBvcGNvZGU7CQkvKiBDdXJyZW50IEFNTCBvcGNvZGUgKi8KKwl1OCBzY29wZV9kZXB0aDsKKwl1OCBwYXNzX251bWJlcjsJCS8qIFBhcnNlIHBhc3MgZHVyaW5nIHRhYmxlIGxvYWQgKi8KKwl1MzIgYXJnX2NvdW50OwkJLyogcHVzaCBmb3IgZml4ZWQgb3IgdmFyIGFyZ3MgKi8KKwl1MzIgYW1sX29mZnNldDsKKwl1MzIgYXJnX3R5cGVzOworCXUzMiBtZXRob2RfYnJlYWtwb2ludDsJLyogRm9yIHNpbmdsZSBzdGVwcGluZyAqLworCXUzMiB1c2VyX2JyZWFrcG9pbnQ7CS8qIFVzZXIgQU1MIGJyZWFrcG9pbnQgKi8KKwl1MzIgcGFyc2VfZmxhZ3M7CisJdTMyIHByZXZfYXJnX3R5cGVzOwogCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9sYXN0X3doaWxlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgIGFyZ3VtZW50c1tBQ1BJX01FVEhPRF9OVU1fQVJHU107ICAgIC8qIENvbnRyb2wgbWV0aG9kIGFyZ3VtZW50cyAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICoqY2FsbGVyX3JldHVybl9kZXNjOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgICAgICpjb250cm9sX3N0YXRlOyAgICAgICAgICAgICAgICAgICAgIC8qIExpc3Qgb2YgY29udHJvbCBzdGF0ZXMgKG5lc3RlZCBJRnMpICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgKmRlZmVycmVkX25vZGU7ICAgICAgICAgICAgICAgICAgICAgLyogVXNlZCB3aGVuIGV4ZWN1dGluZyBkZWZlcnJlZCBvcGNvZGVzICovCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAgICAgKmdwZV9ldmVudF9pbmZvOyAgICAgICAgICAgICAgICAgICAgLyogSW5mbyBmb3IgR1BFIChfTHh4L19FeHggbWV0aG9kcyBvbmx5ICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKmltcGxpY2l0X3JldHVybl9vYmo7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgbG9jYWxfdmFyaWFibGVzW0FDUElfTUVUSE9EX05VTV9MT0NBTFNdOyAgICAvKiBDb250cm9sIG1ldGhvZCBsb2NhbHMgKi8KLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAqbWV0aG9kX2NhbGxfbm9kZTsgICAgICAgICAgICAgICAgICAvKiBDYWxsZWQgbWV0aG9kIE5vZGUqLwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICptZXRob2RfY2FsbF9vcDsgICAgICAgICAgICAgICAgICAgIC8qIG1ldGhvZF9jYWxsIE9wIGlmIHJ1bm5pbmcgYSBtZXRob2QgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAqbWV0aG9kX2Rlc2M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBNZXRob2QgZGVzY3JpcHRvciBpZiBydW5uaW5nIGEgbWV0aG9kICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAgICAgKm1ldGhvZF9ub2RlOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWV0aG9kIG5vZGUgaWYgcnVubmluZyBhIG1ldGhvZC4gKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHBhcnNlciBvcCAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvcGVyYW5kc1tBQ1BJX09CSl9OVU1fT1BFUkFORFMrMV07IC8qIE9wZXJhbmRzIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgKCsxIGZvciBOVUxMIHRlcm1pbmF0b3IpICovCi0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAgICAgKm9wX2luZm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5mbyBvbiBjdXJyZW50IG9wY29kZSAqLwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpvcmlnaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHdhbGsgW09ic29sZXRlXSAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICoqcGFyYW1zOwotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgICAgIHBhcnNlcl9zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc3RhdGUgb2YgcGFyc2VyICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgKnJlc3VsdF9vYmo7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAgICAgKnJlc3VsdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhY2sgb2YgYWNjdW11bGF0ZWQgcmVzdWx0cyAqLwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpyZXR1cm5fZGVzYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBvYmplY3QsIGlmIGFueSAqLwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgICAgICpzY29wZV9pbmZvOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YWNrIG9mIG5lc3RlZCBzY29wZXMgKi8KKwl1OCAqYW1sX2xhc3Rfd2hpbGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgYXJndW1lbnRzW0FDUElfTUVUSE9EX05VTV9BUkdTXTsJLyogQ29udHJvbCBtZXRob2QgYXJndW1lbnRzICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmNhbGxlcl9yZXR1cm5fZGVzYzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmNvbnRyb2xfc3RhdGU7CS8qIExpc3Qgb2YgY29udHJvbCBzdGF0ZXMgKG5lc3RlZCBJRnMpICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRlZmVycmVkX25vZGU7CS8qIFVzZWQgd2hlbiBleGVjdXRpbmcgZGVmZXJyZWQgb3Bjb2RlcyAqLworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsJLyogSW5mbyBmb3IgR1BFIChfTHh4L19FeHggbWV0aG9kcyBvbmx5ICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW1wbGljaXRfcmV0dXJuX29iajsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBsb2NhbF92YXJpYWJsZXNbQUNQSV9NRVRIT0RfTlVNX0xPQ0FMU107CS8qIENvbnRyb2wgbWV0aG9kIGxvY2FscyAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2RfY2FsbF9ub2RlOwkvKiBDYWxsZWQgbWV0aG9kIE5vZGUgKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbWV0aG9kX2NhbGxfb3A7CS8qIG1ldGhvZF9jYWxsIE9wIGlmIHJ1bm5pbmcgYSBtZXRob2QgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptZXRob2RfZGVzYzsJLyogTWV0aG9kIGRlc2NyaXB0b3IgaWYgcnVubmluZyBhIG1ldGhvZCAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsJLyogTWV0aG9kIG5vZGUgaWYgcnVubmluZyBhIG1ldGhvZC4gKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CS8qIEN1cnJlbnQgcGFyc2VyIG9wICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZHNbQUNQSV9PQkpfTlVNX09QRVJBTkRTICsgMV07CS8qIE9wZXJhbmRzIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgKCsxIGZvciBOVUxMIHRlcm1pbmF0b3IpICovCisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CS8qIEluZm8gb24gY3VycmVudCBvcGNvZGUgKi8KKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3JpZ2luOwkvKiBTdGFydCBvZiB3YWxrIFtPYnNvbGV0ZV0gKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1zOworCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlIHBhcnNlcl9zdGF0ZTsJLyogQ3VycmVudCBzdGF0ZSBvZiBwYXJzZXIgKi8KKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqcmVzdWx0czsJLyogU3RhY2sgb2YgYWNjdW11bGF0ZWQgcmVzdWx0cyAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwkvKiBSZXR1cm4gb2JqZWN0LCBpZiBhbnkgKi8KKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CS8qIFN0YWNrIG9mIG5lc3RlZCBzY29wZXMgKi8KIAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpwcmV2X29wOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3Qgb3AgdGhhdCB3YXMgcHJvY2Vzc2VkICovCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAgICAgKm5leHRfb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBvcCB0byBiZSBwcm9jZXNzZWQgKi8KLQlhY3BpX3BhcnNlX2Rvd253YXJkcyAgICAgICAgICAgICAgICBkZXNjZW5kaW5nX2NhbGxiYWNrOwotCWFjcGlfcGFyc2VfdXB3YXJkcyAgICAgICAgICAgICAgICAgIGFzY2VuZGluZ19jYWxsYmFjazsKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICAgICAqdGhyZWFkOwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgICAgICpuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5leHQgd2Fsa19zdGF0ZSBpbiBsaXN0ICovCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXZfb3A7CS8qIExhc3Qgb3AgdGhhdCB3YXMgcHJvY2Vzc2VkICovCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHRfb3A7CS8qIG5leHQgb3AgdG8gYmUgcHJvY2Vzc2VkICovCisJYWNwaV9wYXJzZV9kb3dud2FyZHMgZGVzY2VuZGluZ19jYWxsYmFjazsKKwlhY3BpX3BhcnNlX3Vwd2FyZHMgYXNjZW5kaW5nX2NhbGxiYWNrOworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKm5leHQ7CS8qIE5leHQgd2Fsa19zdGF0ZSBpbiBsaXN0ICovCiB9OwogCi0KIC8qIEluZm8gdXNlZCBieSBhY3BpX3BzX2luaXRfb2JqZWN0cyAqLwogCi1zdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbwotewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcmVnaW9uX2NvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfY291bnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2NvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcmVnaW9uX2luaXQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pbml0OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2luaXQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2luaXQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfY291bnQ7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKK3N0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvIHsKKwl1MTYgbWV0aG9kX2NvdW50OworCXUxNiBkZXZpY2VfY291bnQ7CisJdTE2IG9wX3JlZ2lvbl9jb3VudDsKKwl1MTYgZmllbGRfY291bnQ7CisJdTE2IGJ1ZmZlcl9jb3VudDsKKwl1MTYgcGFja2FnZV9jb3VudDsKKwl1MTYgb3BfcmVnaW9uX2luaXQ7CisJdTE2IGZpZWxkX2luaXQ7CisJdTE2IGJ1ZmZlcl9pbml0OworCXUxNiBwYWNrYWdlX2luaXQ7CisJdTE2IG9iamVjdF9jb3VudDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogfTsKIAotCiAvKiBJbmZvIHVzZWQgYnkgYWNwaV9uc19pbml0aWFsaXplX2RldmljZXMgKi8KIAotc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbwotewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NvdW50OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX1NUQTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9JTkk7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYzsKK3N0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8geworCXUxNiBkZXZpY2VfY291bnQ7CisJdTE2IG51bV9TVEE7CisJdTE2IG51bV9JTkk7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIH07CiAKLQogLyogVEJEOiBbUmVzdHJ1Y3R1cmVdIE1lcmdlIHdpdGggc3RydWN0IGFib3ZlICovCiAKLXN0cnVjdCBhY3BpX3dhbGtfaW5mbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcl9pZDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdHlwZTsKK3N0cnVjdCBhY3BpX3dhbGtfaW5mbyB7CisJdTMyIGRlYnVnX2xldmVsOworCXUzMiBjb3VudDsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOworCXU4IGRpc3BsYXlfdHlwZTsKIH07CiAKIC8qIERpc3BsYXkgVHlwZXMgKi8KIAotI2RlZmluZSBBQ1BJX0RJU1BMQVlfU1VNTUFSWSAgICAwCi0jZGVmaW5lIEFDUElfRElTUExBWV9PQkpFQ1RTICAgIDEKKyNkZWZpbmUgQUNQSV9ESVNQTEFZX1NVTU1BUlkgICAgKHU4KSAwCisjZGVmaW5lIEFDUElfRElTUExBWV9PQkpFQ1RTICAgICh1OCkgMQorI2RlZmluZSBBQ1BJX0RJU1BMQVlfTUFTSyAgICAgICAodTgpIDEKIAotc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbwotewotCWFjcGlfd2Fsa19jYWxsYmFjayAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbjsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0OwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhpZDsKKyNkZWZpbmUgQUNQSV9ESVNQTEFZX1NIT1JUICAgICAgKHU4KSAyCisKK3N0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8geworCWFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uOworCXZvaWQgKmNvbnRleHQ7CisJY2hhciAqaGlkOwogfTsKIAordW5pb24gYWNwaV9hbWxfb3BlcmFuZHMgeworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmRzWzddOwogCi11bmlvbiBhY3BpX2FtbF9vcGVyYW5kcwotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICpvcGVyYW5kc1s3XTsKLQotCXN0cnVjdAotCXsKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAqdHlwZTsKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAqY29kZTsKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAqYXJndW1lbnQ7CisJc3RydWN0IHsKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgKnR5cGU7CisJCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyICpjb2RlOworCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAqYXJndW1lbnQ7CiAKIAl9IGZhdGFsOwogCi0Jc3RydWN0Ci0JewotCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2U7Ci0JCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyICAgICAgKmluZGV4OwotCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXQ7CisJc3RydWN0IHsKKwkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlOworCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAqaW5kZXg7CisJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldDsKIAogCX0gaW5kZXg7CiAKLQlzdHJ1Y3QKLQl7Ci0JCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZTsKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgICAgICAqaW5kZXg7Ci0JCXN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyICAgICAgKmxlbmd0aDsKLQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdGFyZ2V0OworCXN0cnVjdCB7CisJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZTsKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2ludGVnZXIgKmluZGV4OworCQlzdHJ1Y3QgYWNwaV9vYmplY3RfaW50ZWdlciAqbGVuZ3RoOworCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXQ7CiAKIAl9IG1pZDsKIH07CiAKLQogLyogSW50ZXJuYWwgbWV0aG9kIHBhcmFtZXRlciBsaXN0ICovCiAKLXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcGFyYW1ldGVyczsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fb2JqZWN0OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0X3R5cGU7CitzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnBhcmFtZXRlcnM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdDsKKwl1OCBwYXNzX251bWJlcjsKKwl1OCBwYXJhbWV0ZXJfdHlwZTsKKwl1OCByZXR1cm5fb2JqZWN0X3R5cGU7CiB9OwogCiAvKiBUeXBlcyBmb3IgcGFyYW1ldGVyX3R5cGUgYWJvdmUgKi8KQEAgLTIxOCw1ICsyMDYsNCBAQAogI2RlZmluZSBBQ1BJX1BBUkFNX0FSR1MgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9QQVJBTV9HUEUgICAgICAgICAgICAgICAgICAxCiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YWJsZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCmluZGV4IDM5ZGY5MmUuLmY5MmMxODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCkBAIC00NCwxNDYgKzQ0LDEwMSBAQAogI2lmbmRlZiBfX0FDVEFCTEVTX0hfXwogI2RlZmluZSBfX0FDVEFCTEVTX0hfXwogCi0KIC8qIFVzZWQgaW4gYWNwaV90Yl9tYXBfYWNwaV90YWJsZSBmb3Igc2l6ZSBwYXJhbWV0ZXIgaWYgdGFibGUgaGVhZGVyIGlzIHRvIGJlIHVzZWQgKi8KIAogI2RlZmluZSBTSVpFX0lOX0hFQURFUiAgICAgICAgICAwCiAKLQogLyoKICAqIHRiY29udnJ0IC0gVGFibGUgY29udmVyc2lvbiByb3V0aW5lcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworYWNwaV9zdGF0dXMgYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCh2b2lkKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOworYWNwaV9zdGF0dXMgYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKIAogdTMyCi1hY3BpX3RiX2dldF90YWJsZV9jb3VudCAoCi0Jc3RydWN0IHJzZHBfZGVzY3JpcHRvciAgICAgICAgICAqUlNEUCwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpSU0RUKTsKLQorYWNwaV90Yl9nZXRfdGFibGVfY291bnQoc3RydWN0IHJzZHBfZGVzY3JpcHRvciAqUlNEUCwKKwkJCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqUlNEVCk7CiAKIC8qCiAgKiB0YmdldCAtIFRhYmxlICJnZXQiIHJvdXRpbmVzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKK2FjcGlfdGJfZ2V0X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCSAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKAotCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqcmV0dXJuX2hlYWRlcik7CithY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKKwkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnJldHVybl9oZWFkZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfYm9keSAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CithY3BpX3RiX2dldF90YWJsZV9ib2R5KHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfcHRyICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICoqdGFibGVfcHRyX2xvYyk7CithY3BpX3RiX2dldF90YWJsZV9wdHIoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCisJCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcHRyX2xvYyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZlcmlmeV9yc2RwICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzKTsKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmVyaWZ5X3JzZHAoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcyk7CiAKLXZvaWQKLWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyAoCi0Jc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqb3V0X2FkZHJlc3MpOwordm9pZCBhY3BpX3RiX2dldF9yc2R0X2FkZHJlc3Moc3RydWN0IGFjcGlfcG9pbnRlciAqb3V0X2FkZHJlc3MpOwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl92YWxpZGF0ZV9yc2R0ICgKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9wdHIpOwotCithY3BpX3N0YXR1cyBhY3BpX3RiX3ZhbGlkYXRlX3JzZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9wdHIpOwogCiAvKgogICogdGJnZXRhbGwgLSBnZXQgbXVsdGlwbGUgcmVxdWlyZWQgdGFibGVzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMgKAotCXZvaWQpOwotCithY3BpX3N0YXR1cyBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXModm9pZCk7CiAKIC8qCiAgKiB0Ymluc3RhbGwgLSBUYWJsZSBpbnN0YWxsYXRpb24KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdGJfaW5zdGFsbF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CithY3BpX3N0YXR1cyBhY3BpX3RiX2luc3RhbGxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX3JlY29nbml6ZV90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKTsKK2FjcGlfdGJfcmVjb2duaXplX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8sIHU4IHNlYXJjaF90eXBlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7Ci0KK2FjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAorCQkJICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7CiAKIC8qCiAgKiB0YnJlbW92ZSAtIFRhYmxlIHJlbW92YWwgYW5kIGRlbGV0aW9uCiAgKi8KLXZvaWQKLWFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMgKAotCXZvaWQpOwordm9pZCBhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzKHZvaWQpOwogCi12b2lkCi1hY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSAoCi0JYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0eXBlKTsKK3ZvaWQgYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUoYWNwaV90YWJsZV90eXBlIHR5cGUpOwogCi12b2lkCi1hY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MpOwordm9pZCBhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYyk7CiAKLXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKgotYWNwaV90Yl91bmluc3RhbGxfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MpOwotCitzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICphY3BpX3RiX3VuaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjCisJCQkJCQkqdGFibGVfZGVzYyk7CiAKIC8qCiAgKiB0Ynhmcm9vdCAtIFJTRFAsIFJTRFQgdXRpbGl0aWVzCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2ZpbmRfdGFibGUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZW1faWQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2VtX3RhYmxlX2lkLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZV9wdHIpOworYWNwaV90Yl9maW5kX3RhYmxlKGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgY2hhciAqb2VtX2lkLAorCQkgICBjaGFyICpvZW1fdGFibGVfaWQsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKnRhYmxlX3B0cik7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9yc2R0ICgKLQl2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQodm9pZCk7CiAKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICpyc2RwKTsKIAogLyoKICAqIHRidXRpbHMgLSBjb21tb24gdGFibGUgdXRpbGl0aWVzCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyKTsKLQotdTgKLWFjcGlfdGJfY2hlY2tzdW0gKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CithY3BpX3N0YXR1cyBhY3BpX3RiX2lzX3RhYmxlX2luc3RhbGxlZChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICpuZXdfdGFibGVfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlciAoCi0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGVfaGVhZGVyKTsKK2FjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyKTsKIAotI2VuZGlmIC8qIF9fQUNUQUJMRVNfSF9fICovCit1OCBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHZvaWQgKmJ1ZmZlciwgdTMyIGxlbmd0aCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3RiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlcihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcik7CisKKyNlbmRpZgkJCQkvKiBfX0FDVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwuaAppbmRleCBiNWNkY2NhLi5hNDZmNDA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwuaApAQCAtNDQsMjcgKzQ0LDI0IEBACiAjaWZuZGVmIF9fQUNUQkxfSF9fCiAjZGVmaW5lIF9fQUNUQkxfSF9fCiAKLQogLyoKICAqICBWYWx1ZXMgZm9yIGRlc2NyaXB0aW9uIHRhYmxlIGhlYWRlciBzaWduYXR1cmVzCiAgKi8KICNkZWZpbmUgUlNEUF9OQU1FICAgICAgICAgICAgICAgIlJTRFAiCi0jZGVmaW5lIFJTRFBfU0lHICAgICAgICAgICAgICAgICJSU0QgUFRSICIgIC8qIFJTRFQgUG9pbnRlciBzaWduYXR1cmUgKi8KLSNkZWZpbmUgQVBJQ19TSUcgICAgICAgICAgICAgICAgIkFQSUMiICAgICAgLyogTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBEU0RUX1NJRyAgICAgICAgICAgICAgICAiRFNEVCIgICAgICAvKiBEaWZmZXJlbnRpYXRlZCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgRkFEVF9TSUcgICAgICAgICAgICAgICAgIkZBQ1AiICAgICAgLyogRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBGQUNTX1NJRyAgICAgICAgICAgICAgICAiRkFDUyIgICAgICAvKiBGaXJtd2FyZSBBQ1BJIENvbnRyb2wgU3RydWN0dXJlICovCi0jZGVmaW5lIFBTRFRfU0lHICAgICAgICAgICAgICAgICJQU0RUIiAgICAgIC8qIFBlcnNpc3RlbnQgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIFJTRFRfU0lHICAgICAgICAgICAgICAgICJSU0RUIiAgICAgIC8qIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIFhTRFRfU0lHICAgICAgICAgICAgICAgICJYU0RUIiAgICAgIC8qIEV4dGVuZGVkICBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgU1NEVF9TSUcgICAgICAgICAgICAgICAgIlNTRFQiICAgICAgLyogU2Vjb25kYXJ5IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBTQlNUX1NJRyAgICAgICAgICAgICAgICAiU0JTVCIgICAgICAvKiBTbWFydCBCYXR0ZXJ5IFNwZWNpZmljYXRpb24gVGFibGUgKi8KLSNkZWZpbmUgU1BJQ19TSUcgICAgICAgICAgICAgICAgIlNQSUMiICAgICAgLyogSU9TQVBJQyB0YWJsZSAqLwotI2RlZmluZSBCT09UX1NJRyAgICAgICAgICAgICAgICAiQk9PVCIgICAgICAvKiBCb290IHRhYmxlICovCisjZGVmaW5lIFJTRFBfU0lHICAgICAgICAgICAgICAgICJSU0QgUFRSICIJLyogUlNEVCBQb2ludGVyIHNpZ25hdHVyZSAqLworI2RlZmluZSBBUElDX1NJRyAgICAgICAgICAgICAgICAiQVBJQyIJLyogTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBEU0RUX1NJRyAgICAgICAgICAgICAgICAiRFNEVCIJLyogRGlmZmVyZW50aWF0ZWQgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIEZBRFRfU0lHICAgICAgICAgICAgICAgICJGQUNQIgkvKiBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIEZBQ1NfU0lHICAgICAgICAgICAgICAgICJGQUNTIgkvKiBGaXJtd2FyZSBBQ1BJIENvbnRyb2wgU3RydWN0dXJlICovCisjZGVmaW5lIFBTRFRfU0lHICAgICAgICAgICAgICAgICJQU0RUIgkvKiBQZXJzaXN0ZW50IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBSU0RUX1NJRyAgICAgICAgICAgICAgICAiUlNEVCIJLyogUm9vdCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KKyNkZWZpbmUgWFNEVF9TSUcgICAgICAgICAgICAgICAgIlhTRFQiCS8qIEV4dGVuZGVkICBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KKyNkZWZpbmUgU1NEVF9TSUcgICAgICAgICAgICAgICAgIlNTRFQiCS8qIFNlY29uZGFyeSBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KKyNkZWZpbmUgU0JTVF9TSUcgICAgICAgICAgICAgICAgIlNCU1QiCS8qIFNtYXJ0IEJhdHRlcnkgU3BlY2lmaWNhdGlvbiBUYWJsZSAqLworI2RlZmluZSBTUElDX1NJRyAgICAgICAgICAgICAgICAiU1BJQyIJLyogSU9TQVBJQyB0YWJsZSAqLworI2RlZmluZSBCT09UX1NJRyAgICAgICAgICAgICAgICAiQk9PVCIJLyogQm9vdCB0YWJsZSAqLwogCi0KLSNkZWZpbmUgR0xfT1dORUQgICAgICAgICAgICAgICAgMHgwMiAgICAgICAgLyogT3duZXJzaGlwIG9mIGdsb2JhbCBsb2NrIGlzIGJpdCAxICovCi0KKyNkZWZpbmUgR0xfT1dORUQgICAgICAgICAgICAgICAgMHgwMgkvKiBPd25lcnNoaXAgb2YgZ2xvYmFsIGxvY2sgaXMgYml0IDEgKi8KIAogLyoKICAqIENvbW1vbiB0YWJsZSB0eXBlcy4gIFRoZSBiYXNlIGNvZGUgY2FuIHJlbWFpbgpAQCAtNzUsNyArNzIsNiBAQAogI2RlZmluZSBGQUNTX0RFU0NSSVBUT1IgICAgICAgICBzdHJ1Y3QgZmFjc19kZXNjcmlwdG9yX3JldjIKICNkZWZpbmUgRkFEVF9ERVNDUklQVE9SICAgICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyCiAKLQogI3ByYWdtYSBwYWNrKDEpCiAKIC8qCkBAIC04NCw0NSArODAsMzcgQEAKICAqIE5PVEU6IFRoZSB0YWJsZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gQUNQSSB2ZXJzaW9ucyAoMS4wLCAyLjAsIGV0Yy4pCiAgKiBhcmUgaW4gc2VwYXJhdGUgZmlsZXMuCiAgKi8KLXN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgICAgICAgICAvKiBSb290IFN5c3RlbSBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSBbOF07ICAgICAgICAgIC8qIEFDUEkgc2lnbmF0dXJlLCBjb250YWlucyAiUlNEIFBUUiAiICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bTsgICAgICAgICAgICAgICAvKiBUbyBtYWtlIHN1bSBvZiBzdHJ1Y3QgPT0gMCAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2lkIFs2XTsgICAgICAgICAgICAgLyogT0VNIGlkZW50aWZpY2F0aW9uICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjsgICAgICAgICAgICAgICAvKiBNdXN0IGJlIDAgZm9yIDEuMCwgMiBmb3IgMi4wICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2R0X3BoeXNpY2FsX2FkZHJlc3M7ICAvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSU0RUICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKiBYU0RUIExlbmd0aCBpbiBieXRlcyBpbmNsdWRpbmcgaGRyICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2R0X3BoeXNpY2FsX2FkZHJlc3M7ICAvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBYU0RUICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9jaGVja3N1bTsgICAgICAvKiBDaGVja3N1bSBvZiBlbnRpcmUgdGFibGUgKi8KLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkIFszXTsgICAgICAgICAgIC8qIFJlc2VydmVkIGZpZWxkIG11c3QgYmUgMCAqLworc3RydWN0IHJzZHBfZGVzY3JpcHRvciB7CS8qIFJvb3QgU3lzdGVtIERlc2NyaXB0b3IgUG9pbnRlciAqLworCWNoYXIgc2lnbmF0dXJlWzhdOwkvKiBBQ1BJIHNpZ25hdHVyZSwgY29udGFpbnMgIlJTRCBQVFIgIiAqLworCXU4IGNoZWNrc3VtOwkJLyogQUNQSSAxLjAgY2hlY2tzdW0gKi8KKwljaGFyIG9lbV9pZFs2XTsJCS8qIE9FTSBpZGVudGlmaWNhdGlvbiAqLworCXU4IHJldmlzaW9uOwkJLyogTXVzdCBiZSAoMCkgZm9yIEFDUEkgMS4wIG9yICgyKSBmb3IgQUNQSSAyLjArICovCisJdTMyIHJzZHRfcGh5c2ljYWxfYWRkcmVzczsJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFJTRFQgKi8KKwl1MzIgbGVuZ3RoOwkJLyogWFNEVCBMZW5ndGggaW4gYnl0ZXMsIGluY2x1ZGluZyBoZWFkZXIgKi8KKwl1NjQgeHNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgWFNEVCAqLworCXU4IGV4dGVuZGVkX2NoZWNrc3VtOwkvKiBDaGVja3N1bSBvZiBlbnRpcmUgdGFibGUgKEFDUEkgMi4wKSAqLworCWNoYXIgcmVzZXJ2ZWRbM107CS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIH07CiAKLQotc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgICAgICAgICAgLyogQ29tbW9uIEZBQ1MgZm9yIGludGVybmFsIHVzZSAqLwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmdsb2JhbF9sb2NrOwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpcm13YXJlX3dha2luZ192ZWN0b3I7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Jfd2lkdGg7CitzdHJ1Y3QgYWNwaV9jb21tb25fZmFjcyB7CS8qIENvbW1vbiBGQUNTIGZvciBpbnRlcm5hbCB1c2UgKi8KKwl1MzIgKmdsb2JhbF9sb2NrOworCXU2NCAqZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKKwl1OCB2ZWN0b3Jfd2lkdGg7CiB9OwogCi0KICNkZWZpbmUgQUNQSV9UQUJMRV9IRUFERVJfREVGICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovIFwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSBbNF07ICAgICAgICAgIC8qIEFDUEkgc2lnbmF0dXJlICg0IEFTQ0lJIGNoYXJhY3RlcnMpICovXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRhYmxlLCBpbiBieXRlcywgaW5jbHVkaW5nIGhlYWRlciAqL1wKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVs0XTsgICAgICAgICAgIC8qIEFTQ0lJIHRhYmxlIHNpZ25hdHVyZSAqL1wKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0YWJsZSBpbiBieXRlcywgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb247ICAgICAgICAgICAgICAgLyogQUNQSSBTcGVjaWZpY2F0aW9uIG1pbm9yIHZlcnNpb24gIyAqL1wKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtOyAgICAgICAgICAgICAgIC8qIFRvIG1ha2Ugc3VtIG9mIGVudGlyZSB0YWJsZSA9PSAwICovXAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2lkIFs2XTsgICAgICAgICAgICAgLyogT0VNIGlkZW50aWZpY2F0aW9uICovXAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkIFs4XTsgICAgICAgLyogT0VNIHRhYmxlIGlkZW50aWZpY2F0aW9uICovXAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2lkWzZdOyAgICAgICAgICAgICAgLyogQVNDSUkgT0VNIGlkZW50aWZpY2F0aW9uICovXAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkWzhdOyAgICAgICAgLyogQVNDSUkgT0VNIHRhYmxlIGlkZW50aWZpY2F0aW9uICovXAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX3JldmlzaW9uOyAgICAgICAgICAgLyogT0VNIHJldmlzaW9uIG51bWJlciAqL1wKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbF9jb21waWxlcl9pZCBbNF07ICAgIC8qIEFTTCBjb21waWxlciB2ZW5kb3IgSUQgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xfY29tcGlsZXJfcmV2aXNpb247ICAvKiBBU0wgY29tcGlsZXIgcmV2aXNpb24gbnVtYmVyICovCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xfY29tcGlsZXJfaWQgWzRdOyAgICAvKiBBU0NJSSBBU0wgY29tcGlsZXIgdmVuZG9yIElEICovXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNsX2NvbXBpbGVyX3JldmlzaW9uOwkvKiBBU0wgY29tcGlsZXIgdmVyc2lvbiAqLwogCi0KLXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgIC8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRgotfTsKLQorc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIHsJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCitBQ1BJX1RBQkxFX0hFQURFUl9ERUZ9OwogCiAvKgogICogTUFEVCB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMKQEAgLTEzNSwxMiArMTIzLDE1IEBACiAKIC8qIE1hc3RlciBNQURUICovCiAKLXN0cnVjdCBtdWx0aXBsZV9hcGljX3RhYmxlCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9hcGljX2FkZHJlc3M7ICAgICAvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGxvY2FsIEFQSUMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDQVRjb21wYXQgICAgICA6IDE7ICAgIC8qIEEgb25lIGluZGljYXRlcyBzeXN0ZW0gYWxzbyBoYXMgZHVhbCA4MjU5cyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxICAgICAgIDogMzE7CitzdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLworCXUzMiBsb2NhbF9hcGljX2FkZHJlc3M7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgbG9jYWwgQVBJQyAqLworCisJLyogRmxhZ3MgKDMyIGJpdHMpICovCisKKwl1OCBQQ0FUY29tcGF0OjE7CS8qIDAwOiAgICBTeXN0ZW0gYWxzbyBoYXMgZHVhbCA4MjU5cyAqLworCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQxWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAogLyogVmFsdWVzIGZvciBUeXBlIGluIEFQSUNfSEVBREVSX0RFRiAqLwpAQCAtMTU0LDcgKzE0NSw3IEBACiAjZGVmaW5lIEFQSUNfSU9fU0FQSUMgICAgICAgICAgIDYKICNkZWZpbmUgQVBJQ19MT0NBTF9TQVBJQyAgICAgICAgNwogI2RlZmluZSBBUElDX1hSVVBUX1NPVVJDRSAgICAgICA4Ci0jZGVmaW5lIEFQSUNfUkVTRVJWRUQgICAgICAgICAgIDkgICAgICAgICAgIC8qIDkgYW5kIGdyZWF0ZXIgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIEFQSUNfUkVTRVJWRUQgICAgICAgICAgIDkJLyogOSBhbmQgZ3JlYXRlciBhcmUgcmVzZXJ2ZWQgKi8KIAogLyoKICAqIE1BRFQgc3ViLXN0cnVjdHVyZXMgKEZvbGxvdyBNVUxUSVBMRV9BUElDX0RFU0NSSVBUSU9OX1RBQkxFKQpAQCAtMTYzLDEwICsxNTQsOCBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwogCi1zdHJ1Y3QgYXBpY19oZWFkZXIKLXsKLQlBUElDX0hFQURFUl9ERUYKLX07CitzdHJ1Y3QgYXBpY19oZWFkZXIgeworQVBJQ19IRUFERVJfREVGfTsKIAogLyogVmFsdWVzIGZvciBNUFMgSU5USSBmbGFncyAqLwogCkBAIC0xODAsMTE3ICsxNjksOTAgQEAKICNkZWZpbmUgVFJJR0dFUl9SRVNFUlZFRCAgICAgICAgMgogI2RlZmluZSBUUklHR0VSX0xFVkVMICAgICAgICAgICAzCiAKLS8qIENvbW1vbiBmbGFnIGRlZmluaXRpb25zICovCisvKiBDb21tb24gZmxhZyBkZWZpbml0aW9ucyAoMTYgYml0cyBlYWNoKSAqLwogCiAjZGVmaW5lIE1QU19JTlRJX0ZMQUdTIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGFyaXR5ICAgICAgICA6IDI7ICAgIC8qIFBvbGFyaXR5IG9mIEFQSUMgSS9PIGlucHV0IHNpZ25hbHMgKi9cCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX21vZGUgICAgOiAyOyAgICAvKiBUcmlnZ2VyIG1vZGUgb2YgQVBJQyBpbnB1dCBzaWduYWxzICovXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxICAgICAgIDogMTI7ICAgLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgICAgICAgIDogMjsgICAgLyogMDAtMDE6IFBvbGFyaXR5IG9mIEFQSUMgSS9PIGlucHV0IHNpZ25hbHMgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX21vZGUgICAgOiAyOyAgICAvKiAwMi0wMzogVHJpZ2dlciBtb2RlIG9mIEFQSUMgaW5wdXQgc2lnbmFscyAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7ICAgIC8qIDA0LTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwkvKiAwOC0xNTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogCiAjZGVmaW5lIExPQ0FMX0FQSUNfRkxBR1MgXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2VuYWJsZWQ6IDE7ICAgLyogUHJvY2Vzc29yIGlzIHVzYWJsZSBpZiBzZXQgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDIgICAgICAgOiAzMTsgICAvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JfZW5hYmxlZDogMTsgICAvKiAwMDogICAgUHJvY2Vzc29yIGlzIHVzYWJsZSBpZiBzZXQgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA3OyAgICAvKiAwMS0wNzogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsJLyogMDgtMTU6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIAogLyogU3ViLXN0cnVjdHVyZXMgZm9yIE1BRFQgKi8KIAotc3RydWN0IG1hZHRfcHJvY2Vzc29yX2FwaWMKLXsKLQlBUElDX0hFQURFUl9ERUYKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl9pZDsgICAgICAgICAgIC8qIEFDUEkgcHJvY2Vzc29yIGlkICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9hcGljX2lkOyAgICAgICAgICAvKiBQcm9jZXNzb3IncyBsb2NhbCBBUElDIGlkICovCi0JTE9DQUxfQVBJQ19GTEFHUworc3RydWN0IG1hZHRfcHJvY2Vzc29yX2FwaWMgeworCUFQSUNfSEVBREVSX0RFRiB1OCBwcm9jZXNzb3JfaWQ7CS8qIEFDUEkgcHJvY2Vzc29yIGlkICovCisJdTggbG9jYWxfYXBpY19pZDsJLyogUHJvY2Vzc29yJ3MgbG9jYWwgQVBJQyBpZCAqLworIExPQ0FMX0FQSUNfRkxBR1N9OworCitzdHJ1Y3QgbWFkdF9pb19hcGljIHsKKwlBUElDX0hFQURFUl9ERUYgdTggaW9fYXBpY19pZDsJLyogSS9PIEFQSUMgSUQgKi8KKwl1OCByZXNlcnZlZDsJCS8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJdTMyIGFkZHJlc3M7CQkvKiBBUElDIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1MzIgaW50ZXJydXB0OwkJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgd2hlcmUgSU5USQorCQkJCSAqIGxpbmVzIHN0YXJ0ICovCiB9OwogCi1zdHJ1Y3QgbWFkdF9pb19hcGljCi17Ci0JQVBJQ19IRUFERVJfREVGCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19hcGljX2lkOyAgICAgICAgICAgICAvKiBJL08gQVBJQyBJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIEFQSUMgcGh5c2ljYWwgYWRkcmVzcyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0OyAgICAgICAgICAgICAgLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgd2hlcmUgSU5USQotCQkJICAqIGxpbmVzIHN0YXJ0ICovCitzdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgeworCUFQSUNfSEVBREVSX0RFRiB1OCBidXM7CS8qIDAgLSBJU0EgKi8KKwl1OCBzb3VyY2U7CQkvKiBJbnRlcnJ1cHQgc291cmNlIChJUlEpICovCisJdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCisgTVBTX0lOVElfRkxBR1N9OworCitzdHJ1Y3QgbWFkdF9ubWlfc291cmNlIHsKKwlBUElDX0hFQURFUl9ERUYgTVBTX0lOVElfRkxBR1MgdTMyIGludGVycnVwdDsJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KIH07CiAKLXN0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZQotewotCUFQSUNfSEVBREVSX0RFRgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzOyAgICAgICAgICAgICAgICAgICAgLyogMCAtIElTQSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOyAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IHNvdXJjZSAoSVJRKSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0OyAgICAgICAgICAgICAgLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KLQlNUFNfSU5USV9GTEFHUworc3RydWN0IG1hZHRfbG9jYWxfYXBpY19ubWkgeworCUFQSUNfSEVBREVSX0RFRiB1OCBwcm9jZXNzb3JfaWQ7CS8qIEFDUEkgcHJvY2Vzc29yIGlkICovCisJTVBTX0lOVElfRkxBR1MgdTggbGludDsJLyogTElOVG4gdG8gd2hpY2ggTk1JIGlzIGNvbm5lY3RlZCAqLwogfTsKIAotc3RydWN0IG1hZHRfbm1pX3NvdXJjZQotewotCUFQSUNfSEVBREVSX0RFRgotCU1QU19JTlRJX0ZMQUdTCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQ7ICAgICAgICAgICAgICAvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLworc3RydWN0IG1hZHRfYWRkcmVzc19vdmVycmlkZSB7CisJQVBJQ19IRUFERVJfREVGIHUxNiByZXNlcnZlZDsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU2NCBhZGRyZXNzOwkJLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCiB9OwogCi1zdHJ1Y3QgbWFkdF9sb2NhbF9hcGljX25taQotewotCUFQSUNfSEVBREVSX0RFRgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2lkOyAgICAgICAgICAgLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KLQlNUFNfSU5USV9GTEFHUwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludDsgICAgICAgICAgICAgICAgICAgLyogTElOVG4gdG8gd2hpY2ggTk1JIGlzIGNvbm5lY3RlZCAqLworc3RydWN0IG1hZHRfaW9fc2FwaWMgeworCUFQSUNfSEVBREVSX0RFRiB1OCBpb19zYXBpY19pZDsJLyogSS9PIFNBUElDIElEICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTMyIGludGVycnVwdF9iYXNlOwkvKiBHbG9jYWwgaW50ZXJydXB0IGZvciBTQVBJQyBzdGFydCAqLworCXU2NCBhZGRyZXNzOwkJLyogU0FQSUMgcGh5c2ljYWwgYWRkcmVzcyAqLwogfTsKIAotc3RydWN0IG1hZHRfYWRkcmVzc19vdmVycmlkZQotewotCUFQSUNfSEVBREVSX0RFRgotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIEFQSUMgcGh5c2ljYWwgYWRkcmVzcyAqLworc3RydWN0IG1hZHRfbG9jYWxfc2FwaWMgeworCUFQSUNfSEVBREVSX0RFRiB1OCBwcm9jZXNzb3JfaWQ7CS8qIEFDUEkgcHJvY2Vzc29yIGlkICovCisJdTggbG9jYWxfc2FwaWNfaWQ7CS8qIFNBUElDIElEICovCisJdTggbG9jYWxfc2FwaWNfZWlkOwkvKiBTQVBJQyBFSUQgKi8KKwl1OCByZXNlcnZlZFszXTsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwkgTE9DQUxfQVBJQ19GTEFHUyB1MzIgcHJvY2Vzc29yX3VJRDsJLyogTnVtZXJpYyBVSUQgLSBBQ1BJIDMuMCAqLworCWNoYXIgcHJvY2Vzc29yX3VJRHN0cmluZ1sxXTsJLyogU3RyaW5nIFVJRCAgLSBBQ1BJIDMuMCAqLwogfTsKIAotc3RydWN0IG1hZHRfaW9fc2FwaWMKLXsKLQlBUElDX0hFQURFUl9ERUYKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX3NhcGljX2lkOyAgICAgICAgICAgIC8qIEkvTyBTQVBJQyBJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9iYXNlOyAgICAgICAgIC8qIEdsb2NhbCBpbnRlcnJ1cHQgZm9yIFNBUElDIHN0YXJ0ICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOyAgICAgICAgICAgICAgICAvKiBTQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCitzdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfc291cmNlIHsKKwlBUElDX0hFQURFUl9ERUYgTVBTX0lOVElfRkxBR1MgdTggaW50ZXJydXB0X3R5cGU7CS8qIDE9UE1JLCAyPUlOSVQsIDM9Y29ycmVjdGVkICovCisJdTggcHJvY2Vzc29yX2lkOwkvKiBQcm9jZXNzb3IgSUQgKi8KKwl1OCBwcm9jZXNzb3JfZWlkOwkvKiBQcm9jZXNzb3IgRUlEICovCisJdTggaW9fc2FwaWNfdmVjdG9yOwkvKiBWZWN0b3IgdmFsdWUgZm9yIFBNSSBpbnRlcnJ1cHRzICovCisJdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCisJdTMyIGZsYWdzOwkJLyogSW50ZXJydXB0IFNvdXJjZSBGbGFncyAqLwogfTsKIAotc3RydWN0IG1hZHRfbG9jYWxfc2FwaWMKLXsKLQlBUElDX0hFQURFUl9ERUYKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl9pZDsgICAgICAgICAgIC8qIEFDUEkgcHJvY2Vzc29yIGlkICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9zYXBpY19pZDsgICAgICAgICAvKiBTQVBJQyBJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfc2FwaWNfZWlkOyAgICAgICAgLyogU0FQSUMgRUlEICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCBbM107ICAgICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCUxPQ0FMX0FQSUNfRkxBR1MKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl91SUQ7ICAgICAgICAgIC8qIE51bWVyaWMgVUlEIC0gQUNQSSAzLjAgKi8KLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl91SURzdHJpbmdbMV07IC8qIFN0cmluZyBVSUQgIC0gQUNQSSAzLjAgKi8KLX07Ci0KLXN0cnVjdCBtYWR0X2ludGVycnVwdF9zb3VyY2UKLXsKLQlBUElDX0hFQURFUl9ERUYKLQlNUFNfSU5USV9GTEFHUwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X3R5cGU7ICAgICAgICAgLyogMT1QTUksIDI9SU5JVCwgMz1jb3JyZWN0ZWQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl9pZDsgICAgICAgICAgIC8qIFByb2Nlc3NvciBJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2VpZDsgICAgICAgICAgLyogUHJvY2Vzc29yIEVJRCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fc2FwaWNfdmVjdG9yOyAgICAgICAgLyogVmVjdG9yIHZhbHVlIGZvciBQTUkgaW50ZXJydXB0cyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0OyAgICAgICAgICAgICAgLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBTb3VyY2UgRmxhZ3MgKi8KLX07Ci0KLQogLyoKICAqIFNtYXJ0IEJhdHRlcnkKICAqLwotc3RydWN0IHNtYXJ0X2JhdHRlcnlfdGFibGUKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0aWNhbF9sZXZlbDsKK3N0cnVjdCBzbWFydF9iYXR0ZXJ5X3RhYmxlIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTMyIHdhcm5pbmdfbGV2ZWw7CisJdTMyIGxvd19sZXZlbDsKKwl1MzIgY3JpdGljYWxfbGV2ZWw7CiB9OwogCi0KICNwcmFnbWEgcGFjaygpCiAKLQogLyoKICAqIEFDUEkgVGFibGUgaW5mb3JtYXRpb24uICBXZSBzYXZlIHRoZSB0YWJsZSBhZGRyZXNzLCBsZW5ndGgsCiAgKiBhbmQgdHlwZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiAobWFwcGVkIG9yIGFsbG9jYXRlZCkgZm9yIGVhY2gKQEAgLTMxNCwzOSArMjc2LDM1IEBACiAKIC8qIERhdGEgYWJvdXQgZWFjaCBrbm93biB0YWJsZSB0eXBlICovCiAKLXN0cnVjdCBhY3BpX3RhYmxlX3N1cHBvcnQKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lOwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqZ2xvYmFsX3B0cjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ19sZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKK3N0cnVjdCBhY3BpX3RhYmxlX3N1cHBvcnQgeworCWNoYXIgKm5hbWU7CisJY2hhciAqc2lnbmF0dXJlOworCXZvaWQgKipnbG9iYWxfcHRyOworCXU4IHNpZ19sZW5ndGg7CisJdTggZmxhZ3M7CiB9OwogCi0KIC8qCiAgKiBHZXQgdGhlIEFDUEkgdmVyc2lvbi1zcGVjaWZpYyB0YWJsZXMKICAqLwotI2luY2x1ZGUgImFjdGJsMS5oIiAgIC8qIEFjcGkgMS4wIHRhYmxlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiYWN0YmwyLmgiICAgLyogQWNwaSAyLjAgdGFibGUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJhY3RibDEuaCIJCS8qIEFjcGkgMS4wIHRhYmxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiYWN0YmwyLmgiCQkvKiBBY3BpIDIuMCB0YWJsZSBkZWZpbml0aW9ucyAqLwogCi1leHRlcm4gdTggYWNwaV9mYWR0X2lzX3YxOyAvKiBpcyBzZXQgdG8gMSBpZiBGQURUIGlzIHJldmlzaW9uIDEsCi0JCQkgICAgKiBuZWVkZWQgZm9yIGNlcnRhaW4gd29ya2Fyb3VuZHMgKi8KK2V4dGVybiB1OCBhY3BpX2ZhZHRfaXNfdjE7CS8qIGlzIHNldCB0byAxIGlmIEZBRFQgaXMgcmV2aXNpb24gMSwKKwkJCQkgKiBuZWVkZWQgZm9yIGNlcnRhaW4gd29ya2Fyb3VuZHMgKi8KIAogI3ByYWdtYSBwYWNrKDEpCiAvKgogICogSGlnaCBwZXJmb3JtYW5jZSB0aW1lcgogICovCi1zdHJ1Y3QgaHBldF90YWJsZQotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRgotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfaWQ7Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICBiYXNlX2FkZHJlc3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocGV0X251bWJlcjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrX3RpY2s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOworc3RydWN0IGhwZXRfdGFibGUgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgaGFyZHdhcmVfaWQ7CisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGJhc2VfYWRkcmVzczsKKwl1OCBocGV0X251bWJlcjsKKwl1MTYgY2xvY2tfdGljazsKKwl1OCBhdHRyaWJ1dGVzOwogfTsKIAogI3ByYWdtYSBwYWNrKCkKIAotI2VuZGlmIC8qIF9fQUNUQkxfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ1RCTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDEuaAppbmRleCAzM2RlNWY0Li42NzMxMmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCkBAIC00OSw4OCArNDksODcgQEAKIC8qCiAgKiBBQ1BJIDEuMCBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoUlNEVCkKICAqLwotc3RydWN0IHJzZHRfZGVzY3JpcHRvcl9yZXYxCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9vZmZzZXRfZW50cnkgWzFdOyAvKiBBcnJheSBvZiBwb2ludGVycyB0byBvdGhlciAqLwotCQkJIC8qIEFDUEkgdGFibGVzICovCitzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRgkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBBQ1BJIHRhYmxlcyAqLwogfTsKIAotCiAvKgogICogQUNQSSAxLjAgRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAoRkFDUykKICAqLwotc3RydWN0IGZhY3NfZGVzY3JpcHRvcl9yZXYxCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVbNF07ICAgICAgICAgICAvKiBBQ1BJIFNpZ25hdHVyZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSwgaW4gYnl0ZXMgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlX3NpZ25hdHVyZTsgICAgIC8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gc2lnbmF0dXJlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJtd2FyZV93YWtpbmdfdmVjdG9yOyAvKiBBQ1BJIE9TIHdha2luZyB2ZWN0b3IgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9sb2NrOyAgICAgICAgICAgIC8qIEdsb2JhbCBMb2NrICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNGJpb3NfZiAgICAgICAgOiAxOyAgICAvKiBJbmRpY2F0ZXMgaWYgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxICAgICAgIDogMzE7ICAgLyogTXVzdCBiZSAwICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN2ZXJ2ZWQzIFs0MF07ICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotfTsKK3N0cnVjdCBmYWNzX2Rlc2NyaXB0b3JfcmV2MSB7CisJY2hhciBzaWduYXR1cmVbNF07CS8qIEFTQ0lJIHRhYmxlIHNpZ25hdHVyZSAqLworCXUzMiBsZW5ndGg7CQkvKiBMZW5ndGggb2Ygc3RydWN0dXJlIGluIGJ5dGVzICovCisJdTMyIGhhcmR3YXJlX3NpZ25hdHVyZTsJLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KKwl1MzIgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogQUNQSSBPUyB3YWtpbmcgdmVjdG9yICovCisJdTMyIGdsb2JhbF9sb2NrOwkvKiBHbG9iYWwgTG9jayAqLwogCisJLyogRmxhZ3MgKDMyIGJpdHMpICovCisKKwl1OCBTNGJpb3NfZjoxOwkJLyogMDA6ICAgIFM0QklPUyBzdXBwb3J0IGlzIHByZXNlbnQgKi8KKwkgdTg6NzsJCQkvKiAwMS0wNzogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU4IHJlc2VydmVkMVszXTsJLyogMDgtMzE6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKworCXU4IHJlc2VydmVkMls0MF07CS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KK307CiAKIC8qCiAgKiBBQ1BJIDEuMCBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlIChGQURUKQogICovCi1zdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX2N0cmw7ICAgICAgICAgIC8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNkdDsgICAgICAgICAgICAgICAgICAgLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDsgICAgICAgICAgICAgICAgICAvKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2ludDsgICAgICAgICAgICAgICAgLyogU3lzdGVtIHZlY3RvciBvZiBTQ0kgaW50ZXJydXB0ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWlfY21kOyAgICAgICAgICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgU01JIGNvbW1hbmQgcG9ydCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9lbmFibGU7ICAgICAgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9kaXNhYmxlOyAgICAgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0Ymlvc19yZXE7ICAgICAgICAgICAgIC8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSSBDTUQgdG8gZW50ZXIgUzRCSU9TIHN0YXRlICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xYV9ldnRfYmxrOyAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMWJfZXZ0X2JsazsgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFhX2NudF9ibGs7ICAgICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xYl9jbnRfYmxrOyAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9jbnRfYmxrOyAgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtX3Rtcl9ibGs7ICAgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUwX2JsazsgICAgICAgICAgICAgICAvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUxX2JsazsgICAgICAgICAgICAgICAvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMSBSZWcgQmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFfZXZ0X2xlbjsgICAgICAgICAgICAvKiBCeXRlIGxlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9ldnRfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFfY250X2xlbjsgICAgICAgICAgICAvKiBCeXRlIGxlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9jbnRfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfY250X2xlbjsgICAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTJfY250X2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1fdG1fbGVuOyAgICAgICAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG1fdG1fYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUwX2Jsa19sZW47ICAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMV9ibGtfbGVuOyAgICAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmFzZTsgICAgICAgICAgICAgIC8qIE9mZnNldCBpbiBncGUgbW9kZWwgd2hlcmUgZ3BlMSBldmVudHMgc3RhcnQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsMl9sYXQ7ICAgICAgICAgICAgICAvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx2bDNfbGF0OyAgICAgICAgICAgICAgLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX3NpemU7ICAgICAgICAgICAgIC8qIFNpemUgb2YgYXJlYSByZWFkIHRvIGZsdXNoIGNhY2hlcyAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfc3RyaWRlOyAgICAgICAgICAgLyogU3RyaWRlIHVzZWQgaW4gZmx1c2hpbmcgY2FjaGVzICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXR5X29mZnNldDsgICAgICAgICAgICAvKiBCaXQgbG9jYXRpb24gb2YgZHV0eSBjeWNsZSBmaWVsZCBpbiBwX2NudCByZWcgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1dHlfd2lkdGg7ICAgICAgICAgICAgIC8qIEJpdCB3aWR0aCBvZiBkdXR5IGN5Y2xlIGZpZWxkIGluIHBfY250IHJlZyAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5X2Fscm07ICAgICAgICAgICAgICAgLyogSW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uX2Fscm07ICAgICAgICAgICAgICAgLyogSW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnR1cnk7ICAgICAgICAgICAgICAgIC8qIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDQ7ICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ0YTsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNGI7ICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yl9pbnZkICAgICAgICAgOiAxOyAgICAvKiBUaGUgd2JpbnZkIGluc3RydWN0aW9uIHdvcmtzIHByb3Blcmx5ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yl9pbnZkX2ZsdXNoICAgOiAxOyAgICAvKiBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYzEgICAgICAgICA6IDE7ICAgIC8qIEFsbCBwcm9jZXNzb3JzIHN1cHBvcnQgQzEgc3RhdGUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwyX3VwICAgICAgICA6IDE7ICAgIC8qIEMyIHN0YXRlIHdvcmtzIG9uIE1QIHN5c3RlbSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdyX2J1dHRvbiAgICAgIDogMTsgICAgLyogUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX2J1dHRvbiAgICA6IDE7ICAgIC8qIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfclRDICAgICAgIDogMTsgICAgLyogUlRDIHdha2V1cCBzdGF0IG5vdCBpbiBmaXhlZCByZWdpc3RlciBzcGFjZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRjczQgICAgICAgICAgIDogMTsgICAgLyogUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXJfdmFsX2V4dCAgICAgOiAxOyAgICAvKiBUaGUgdG1yX3ZhbCB3aWR0aCBpcyAzMiBiaXRzICgwID0gMjQgYml0cykgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNSAgICAgICA6IDIzOyAgIC8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCitzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRgkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgZmlybXdhcmVfY3RybDsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCisJdTMyIGRzZHQ7CQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KKwl1OCBtb2RlbDsJCS8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKi8KKwl1OCByZXNlcnZlZDE7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTE2IHNjaV9pbnQ7CQkvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KKwl1MzIgc21pX2NtZDsJCS8qIFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovCisJdTggYWNwaV9lbmFibGU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGVuYWJsZSBBQ1BJICovCisJdTggYWNwaV9kaXNhYmxlOwkvKiBWYWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGRpc2FibGUgQUNQSSAqLworCXU4IFM0Ymlvc19yZXE7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byBTTUkgQ01EIHRvIGVudGVyIFM0QklPUyBzdGF0ZSAqLworCXU4IHJlc2VydmVkMjsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MzIgcG0xYV9ldnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayAqLworCXUzMiBwbTFiX2V2dF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrICovCisJdTMyIHBtMWFfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgKi8KKwl1MzIgcG0xYl9jbnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbTJfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbV90bXJfYmxrOwkJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KKwl1MzIgZ3BlMF9ibGs7CQkvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovCisJdTMyIGdwZTFfYmxrOwkJLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayAqLworCXU4IHBtMV9ldnRfbGVuOwkJLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfZXZ0X2JsayAqLworCXU4IHBtMV9jbnRfbGVuOwkJLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfY250X2JsayAqLworCXU4IHBtMl9jbnRfbGVuOwkJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NudF9ibGsgKi8KKwl1OCBwbV90bV9sZW47CQkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8KKwl1OCBncGUwX2Jsa19sZW47CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxrICovCisJdTggZ3BlMV9ibGtfbGVuOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2JsayAqLworCXU4IGdwZTFfYmFzZTsJCS8qIE9mZnNldCBpbiBncGUgbW9kZWwgd2hlcmUgZ3BlMSBldmVudHMgc3RhcnQgKi8KKwl1OCByZXNlcnZlZDM7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTE2IHBsdmwyX2xhdDsJCS8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMyIHN0YXRlICovCisJdTE2IHBsdmwzX2xhdDsJCS8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMzIHN0YXRlICovCisJdTE2IGZsdXNoX3NpemU7CQkvKiBTaXplIG9mIGFyZWEgcmVhZCB0byBmbHVzaCBjYWNoZXMgKi8KKwl1MTYgZmx1c2hfc3RyaWRlOwkvKiBTdHJpZGUgdXNlZCBpbiBmbHVzaGluZyBjYWNoZXMgKi8KKwl1OCBkdXR5X29mZnNldDsJCS8qIEJpdCBsb2NhdGlvbiBvZiBkdXR5IGN5Y2xlIGZpZWxkIGluIHBfY250IHJlZyAqLworCXU4IGR1dHlfd2lkdGg7CQkvKiBCaXQgd2lkdGggb2YgZHV0eSBjeWNsZSBmaWVsZCBpbiBwX2NudCByZWcgKi8KKwl1OCBkYXlfYWxybTsJCS8qIEluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBtb25fYWxybTsJCS8qIEluZGV4IHRvIG1vbnRoLW9mLXllYXIgYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCisJdTggY2VudHVyeTsJCS8qIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCisJdTggcmVzZXJ2ZWQ0WzNdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IHdiX2ludmQ6MTsJCS8qIDAwOiAgICBUaGUgd2JpbnZkIGluc3RydWN0aW9uIHdvcmtzIHByb3Blcmx5ICovCisJdTggd2JfaW52ZF9mbHVzaDoxOwkvKiAwMTogICAgVGhlIHdiaW52ZCBmbHVzaGVzIGJ1dCBkb2VzIG5vdCBpbnZhbGlkYXRlICovCisJdTggcHJvY19jMToxOwkJLyogMDI6ICAgIEFsbCBwcm9jZXNzb3JzIHN1cHBvcnQgQzEgc3RhdGUgKi8KKwl1OCBwbHZsMl91cDoxOwkJLyogMDM6ICAgIEMyIHN0YXRlIHdvcmtzIG9uIE1QIHN5c3RlbSAqLworCXU4IHB3cl9idXR0b246MTsJLyogMDQ6ICAgIFBvd2VyIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlICovCisJdTggc2xlZXBfYnV0dG9uOjE7CS8qIDA1OiAgICBTbGVlcCBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSwgb3Igbm90IHByZXNlbnQgKi8KKwl1OCBmaXhlZF9yVEM6MTsJCS8qIDA2OiAgICBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCisJdTggcnRjczQ6MTsJCS8qIDA3OiAgICBSVEMgd2FrZXVwIHN0YXQgbm90IHBvc3NpYmxlIGZyb20gUzQgKi8KKwl1OCB0bXJfdmFsX2V4dDoxOwkvKiAwODogICAgdG1yX3ZhbCB3aWR0aCBpcyAzMiBiaXRzICgwID0gMjQgYml0cykgKi8KKwkgdTg6NzsJCQkvKiAwOS0xNTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU4IHJlc2VydmVkNVsyXTsJLyogMTYtMzE6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIH07CiAKICNwcmFnbWEgcGFjaygpCiAKLSNlbmRpZiAvKiBfX0FDVEJMMV9IX18gKi8KLQotCisjZW5kaWYJCQkJLyogX19BQ1RCTDFfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YmwyLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwyLmgKaW5kZXggZTE3MjljOS4uNTAzMDVjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsMi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RibDIuaApAQCAtNjQsNjIgKzY0LDU2IEBACiAjZGVmaW5lIEZBRFQyX1JFVklTSU9OX0lEICAgICAgICAgICAgICAgMwogI2RlZmluZSBGQURUMl9NSU5VU19SRVZJU0lPTl9JRCAgICAgICAgIDIKIAotCiAjcHJhZ21hIHBhY2soMSkKIAogLyoKICAqIEFDUEkgMi4wIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RUKQogICovCi1zdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjIKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX29mZnNldF9lbnRyeSBbMV07IC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvICAqLwotCQkJIC8qIEFDUEkgdGFibGUgaGVhZGVycyAqLworc3RydWN0IHJzZHRfZGVzY3JpcHRvcl9yZXYyIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCisJdTMyIHRhYmxlX29mZnNldF9lbnRyeVsxXTsJLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gQUNQSSB0YWJsZXMgKi8KIH07CiAKLQogLyoKICAqIEFDUEkgMi4wIEV4dGVuZGVkIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoWFNEVCkKICAqLwotc3RydWN0IHhzZHRfZGVzY3JpcHRvcl9yZXYyCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9vZmZzZXRfZW50cnkgWzFdOyAvKiBBcnJheSBvZiBwb2ludGVycyB0byAgKi8KLQkJCSAvKiBBQ1BJIHRhYmxlIGhlYWRlcnMgKi8KK3N0cnVjdCB4c2R0X2Rlc2NyaXB0b3JfcmV2MiB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLworCXU2NCB0YWJsZV9vZmZzZXRfZW50cnlbMV07CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIEFDUEkgdGFibGVzICovCiB9OwogCi0KIC8qCiAgKiBBQ1BJIDIuMCBGaXJtd2FyZSBBQ1BJIENvbnRyb2wgU3RydWN0dXJlIChGQUNTKQogICovCi1zdHJ1Y3QgZmFjc19kZXNjcmlwdG9yX3JldjIKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVs0XTsgICAgICAgICAgIC8qIEFDUEkgc2lnbmF0dXJlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2Ygc3RydWN0dXJlLCBpbiBieXRlcyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfc2lnbmF0dXJlOyAgICAgLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX3dha2luZ192ZWN0b3I7IC8qIDMyYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IuICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbG9jazsgICAgICAgICAgICAvKiBHbG9iYWwgTG9jayB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBzaGFyZWQgaGFyZHdhcmUgcmVzb3VyY2VzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNGJpb3NfZiAgICAgICAgOiAxOyAgICAvKiBTNEJpb3NfZiAtIEluZGljYXRlcyBpZiBTNEJJT1Mgc3VwcG9ydCBpcyBwcmVzZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDEgICAgICAgOiAzMTsgICAvKiBNdXN0IGJlIDAgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmaXJtd2FyZV93YWtpbmdfdmVjdG9yOyAvKiA2NGJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBGaXJtd2FyZSBXYWtpbmcgVmVjdG9yLiAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjsgICAgICAgICAgICAgICAgLyogVmVyc2lvbiBvZiB0aGlzIHRhYmxlICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDMgWzMxXTsgICAgICAgICAvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotfTsKK3N0cnVjdCBmYWNzX2Rlc2NyaXB0b3JfcmV2MiB7CisJY2hhciBzaWduYXR1cmVbNF07CS8qIEFTQ0lJIHRhYmxlIHNpZ25hdHVyZSAqLworCXUzMiBsZW5ndGg7CQkvKiBMZW5ndGggb2Ygc3RydWN0dXJlLCBpbiBieXRlcyAqLworCXUzMiBoYXJkd2FyZV9zaWduYXR1cmU7CS8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gc2lnbmF0dXJlICovCisJdTMyIGZpcm13YXJlX3dha2luZ192ZWN0b3I7CS8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBGaXJtd2FyZSBXYWtpbmcgVmVjdG9yLiAqLworCXUzMiBnbG9iYWxfbG9jazsJLyogR2xvYmFsIExvY2sgdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gc2hhcmVkIGhhcmR3YXJlIHJlc291cmNlcyAqLwogCisJLyogRmxhZ3MgKDMyIGJpdHMpICovCisKKwl1OCBTNGJpb3NfZjoxOwkJLyogMDA6ICAgIFM0QklPUyBzdXBwb3J0IGlzIHByZXNlbnQgKi8KKwkgdTg6NzsJCQkvKiAwMS0wNzogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU4IHJlc2VydmVkMVszXTsJLyogMDgtMzE6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKworCXU2NCB4ZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IuICovCisJdTggdmVyc2lvbjsJCS8qIFZlcnNpb24gb2YgdGhpcyB0YWJsZSAqLworCXU4IHJlc2VydmVkM1szMV07CS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KK307CiAKIC8qCiAgKiBBQ1BJIDIuMCsgR2VuZXJpYyBBZGRyZXNzIFN0cnVjdHVyZSAoR0FTKQogICovCi1zdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nfc3BhY2VfaWQ7ICAgICAgIC8qIEFkZHJlc3Mgc3BhY2Ugd2hlcmUgc3RydWN0IG9yIHJlZ2lzdGVyIGV4aXN0cy4gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdF93aWR0aDsgICAgIC8qIFNpemUgaW4gYml0cyBvZiBnaXZlbiByZWdpc3RlciAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYml0X29mZnNldDsgICAgLyogQml0IG9mZnNldCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nfd2lkdGg7ICAgICAgICAgICAvKiBNaW5pbXVtIEFjY2VzcyBzaXplIChBQ1BJIDMuMCkgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIDY0LWJpdCBhZGRyZXNzIG9mIHN0cnVjdCBvciByZWdpc3RlciAqLworc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHsKKwl1OCBhZGRyZXNzX3NwYWNlX2lkOwkvKiBBZGRyZXNzIHNwYWNlIHdoZXJlIHN0cnVjdCBvciByZWdpc3RlciBleGlzdHMuICovCisJdTggcmVnaXN0ZXJfYml0X3dpZHRoOwkvKiBTaXplIGluIGJpdHMgb2YgZ2l2ZW4gcmVnaXN0ZXIgKi8KKwl1OCByZWdpc3Rlcl9iaXRfb2Zmc2V0OwkvKiBCaXQgb2Zmc2V0IHdpdGhpbiB0aGUgcmVnaXN0ZXIgKi8KKwl1OCBhY2Nlc3Nfd2lkdGg7CS8qIE1pbmltdW0gQWNjZXNzIHNpemUgKEFDUEkgMy4wKSAqLworCXU2NCBhZGRyZXNzOwkJLyogNjQtYml0IGFkZHJlc3Mgb2Ygc3RydWN0IG9yIHJlZ2lzdGVyICovCiB9OwogCi0KICNkZWZpbmUgRkFEVF9SRVYyX0NPTU1PTiBcCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9maXJtd2FyZV9jdHJsOyAgIC8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8gXAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfZHNkdDsgICAgICAgICAgICAvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovIFwKQEAgLTE2MSwxMjkgKzE1NSwxMjMgQEAKIC8qCiAgKiBBQ1BJIDIuMCsgRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAoRkFEVCkKICAqLwotc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGICAgICAgICAgICAgICAgICAgICAgICAvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQlGQURUX1JFVjJfQ09NTU9OCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAgIC8qIFJlc2VydmVkICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yl9pbnZkICAgICA6IDE7ICAgIC8qIFRoZSB3YmludmQgaW5zdHJ1Y3Rpb24gd29ya3MgcHJvcGVybHkgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2ludmRfZmx1c2ggOiAxOyAgLyogVGhlIHdiaW52ZCBmbHVzaGVzIGJ1dCBkb2VzIG5vdCBpbnZhbGlkYXRlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2MxICAgICA6IDE7ICAgIC8qIEFsbCBwcm9jZXNzb3JzIHN1cHBvcnQgQzEgc3RhdGUgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwyX3VwICAgIDogMTsgICAgLyogQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd3JfYnV0dG9uICA6IDE7ICAgIC8qIFBvd2VyIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcF9idXR0b24gOiAxOyAgIC8qIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfclRDICAgOiAxOyAgICAvKiBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGNzNCAgICAgICA6IDE7ICAgIC8qIFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1yX3ZhbF9leHQgOiAxOyAgICAvKiBJbmRpY2F0ZXMgdG1yX3ZhbCBpcyAzMiBiaXRzIDA9MjQtYml0cyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9ja19jYXAgICAgOiAxOyAgICAvKiBTdXBwb3J0cyBEb2NraW5nICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldF9yZWdfc3VwIDogMTsgIC8qIEluZGljYXRlcyBzeXN0ZW0gc3VwcG9ydHMgc3lzdGVtIHJlc2V0IHZpYSB0aGUgRkFEVCBSRVNFVF9SRUcgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYWxlZF9jYXNlIDogMTsgICAgLyogSW5kaWNhdGVzIHN5c3RlbSBoYXMgbm8gaW50ZXJuYWwgZXhwYW5zaW9uIGNhcGFiaWxpdGllcyBhbmQgY2FzZSBpcyBzZWFsZWQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRsZXNzICAgIDogMTsgICAgLyogSW5kaWNhdGVzIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGxvY2FsIHZpZGVvIGNhcGFiaWxpdGllcyBvciBsb2NhbCBpbnB1dCBkZXZpY2VzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfc3dfc2xlZXAgOiAxOyAgIC8qIEluZGljYXRlcyB0byBPU1BNIHRoYXQgYSBwcm9jZXNzb3IgbmF0aXZlIGluc3RydWN0aW9uICovCi0JCQkgICAvKiBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIHdyaXRpbmcgdGhlIFNMUF9UWVB4IHJlZ2lzdGVyICovCi0JLyogQUNQSSAzLjAgZmxhZyBiaXRzICovCitzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRgkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KKwlGQURUX1JFVjJfQ09NTU9OIHU4IHJlc2VydmVkMjsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZXhwX3dhayAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7IC8qIFN5c3RlbSBzdXBwb3J0cyBQQ0lFWFBfV0FLRSAoU1RTL0VOKSBiaXRzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfcGxhdGZvcm1fY2xvY2sgICAgICAgICAgICAgICAgICA6IDE7IC8qIE9TUE0gc2hvdWxkIHVzZSBwbGF0Zm9ybS1wcm92aWRlZCB0aW1lciAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzRydGNfc3RzX3ZhbGlkICAgICAgICAgICAgICAgICAgICAgOiAxOyAvKiBDb250ZW50cyBvZiBSVENfU1RTIHZhbGlkIGFmdGVyIFM0IHdha2UgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9wb3dlcl9vbl9jYXBhYmxlICAgICAgICAgICAgIDogMTsgLyogU3lzdGVtIGlzIGNvbXBhdGlibGUgd2l0aCByZW1vdGUgcG93ZXIgb24gKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlX2FwaWNfY2x1c3Rlcl9tb2RlbCAgICAgICAgICAgIDogMTsgLyogQWxsIGxvY2FsIEFQSUNzIG11c3QgdXNlIGNsdXN0ZXIgbW9kZWwgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlX2FwaWNfcGh5c2ljYWxfZGVzdGluYXRpb25fbW9kZSA6IDE7IC8qIGFsbCBsb2NhbCB4X2FQSUNzIG11c3QgdXNlIHBoeXNpY2FsIGRlc3QgbW9kZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMjsvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCS8qIEZsYWdzICgzMiBiaXRzKSAqLwogCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICByZXNldF9yZWdpc3RlcjsgICAgIC8qIFJlc2V0IHJlZ2lzdGVyIGFkZHJlc3MgaW4gR0FTIGZvcm1hdCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfdmFsdWU7ICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDdbM107ICAgICAgIC8qIFRoZXNlIHRocmVlIGJ5dGVzIG11c3QgYmUgemVybyAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZpcm13YXJlX2N0cmw7ICAgICAvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYZHNkdDsgICAgICAgICAgICAgIC8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHhwbTFhX2V2dF9ibGs7ICAgICAgLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICB4cG0xYl9ldnRfYmxrOyAgICAgIC8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBhY3BpX2V2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgeHBtMWFfY250X2JsazsgICAgICAvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIHhwbTFiX2NudF9ibGs7ICAgICAgLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICB4cG0yX2NudF9ibGs7ICAgICAgIC8qIEV4dGVuZGVkIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICB4cG1fdG1yX2JsazsgICAgICAgIC8qIEV4dGVuZGVkIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgeGdwZTBfYmxrOyAgICAgICAgICAvKiBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAwIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgeGdwZTFfYmxrOyAgICAgICAgICAvKiBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAxIFJlZyBCbGsgYWRkcmVzcyAqLworCXU4IHdiX2ludmQ6MTsJCS8qIDAwOiAgICBUaGUgd2JpbnZkIGluc3RydWN0aW9uIHdvcmtzIHByb3Blcmx5ICovCisJdTggd2JfaW52ZF9mbHVzaDoxOwkvKiAwMTogICAgVGhlIHdiaW52ZCBmbHVzaGVzIGJ1dCBkb2VzIG5vdCBpbnZhbGlkYXRlICovCisJdTggcHJvY19jMToxOwkJLyogMDI6ICAgIEFsbCBwcm9jZXNzb3JzIHN1cHBvcnQgQzEgc3RhdGUgKi8KKwl1OCBwbHZsMl91cDoxOwkJLyogMDM6ICAgIEMyIHN0YXRlIHdvcmtzIG9uIE1QIHN5c3RlbSAqLworCXU4IHB3cl9idXR0b246MTsJLyogMDQ6ICAgIFBvd2VyIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlICovCisJdTggc2xlZXBfYnV0dG9uOjE7CS8qIDA1OiAgICBTbGVlcCBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSwgb3Igbm90IHByZXNlbnQgKi8KKwl1OCBmaXhlZF9yVEM6MTsJCS8qIDA2OiAgICBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCisJdTggcnRjczQ6MTsJCS8qIDA3OiAgICBSVEMgd2FrZXVwIHN0YXQgbm90IHBvc3NpYmxlIGZyb20gUzQgKi8KKwl1OCB0bXJfdmFsX2V4dDoxOwkvKiAwODogICAgdG1yX3ZhbCBpcyAzMiBiaXRzIDA9MjQtYml0cyAqLworCXU4IGRvY2tfY2FwOjE7CQkvKiAwOTogICAgRG9ja2luZyBzdXBwb3J0ZWQgKi8KKwl1OCByZXNldF9yZWdfc3VwOjE7CS8qIDEwOiAgICBTeXN0ZW0gcmVzZXQgdmlhIHRoZSBGQURUIFJFU0VUX1JFRyBzdXBwb3J0ZWQgKi8KKwl1OCBzZWFsZWRfY2FzZToxOwkvKiAxMTogICAgTm8gaW50ZXJuYWwgZXhwYW5zaW9uIGNhcGFiaWxpdGllcyBhbmQgY2FzZSBpcyBzZWFsZWQgKi8KKwl1OCBoZWFkbGVzczoxOwkJLyogMTI6ICAgIE5vIGxvY2FsIHZpZGVvIGNhcGFiaWxpdGllcyBvciBsb2NhbCBpbnB1dCBkZXZpY2VzICovCisJdTggY3B1X3N3X3NsZWVwOjE7CS8qIDEzOiAgICBNdXN0IGV4ZWN1dGUgbmF0aXZlIGluc3RydWN0aW9uIGFmdGVyIHdyaXRpbmcgU0xQX1RZUHggcmVnaXN0ZXIgKi8KKworCXU4IHBjaV9leHBfd2FrOjE7CS8qIDE0OiAgICBTeXN0ZW0gc3VwcG9ydHMgUENJRVhQX1dBS0UgKFNUUy9FTikgYml0cyAoQUNQSSAzLjApICovCisJdTggdXNlX3BsYXRmb3JtX2Nsb2NrOjE7CS8qIDE1OiAgICBPU1BNIHNob3VsZCB1c2UgcGxhdGZvcm0tcHJvdmlkZWQgdGltZXIgKEFDUEkgMy4wKSAqLworCXU4IFM0cnRjX3N0c192YWxpZDoxOwkvKiAxNjogICAgQ29udGVudHMgb2YgUlRDX1NUUyB2YWxpZCBhZnRlciBTNCB3YWtlIChBQ1BJIDMuMCkgKi8KKwl1OCByZW1vdGVfcG93ZXJfb25fY2FwYWJsZToxOwkvKiAxNzogICAgU3lzdGVtIGlzIGNvbXBhdGlibGUgd2l0aCByZW1vdGUgcG93ZXIgb24gKEFDUEkgMy4wKSAqLworCXU4IGZvcmNlX2FwaWNfY2x1c3Rlcl9tb2RlbDoxOwkvKiAxODogICAgQWxsIGxvY2FsIEFQSUNzIG11c3QgdXNlIGNsdXN0ZXIgbW9kZWwgKEFDUEkgMy4wKSAqLworCXU4IGZvcmNlX2FwaWNfcGh5c2ljYWxfZGVzdGluYXRpb25fbW9kZToxOwkvKiAxOTogICBhbGwgbG9jYWwgeF9hUElDcyBtdXN0IHVzZSBwaHlzaWNhbCBkZXN0IG1vZGUgKEFDUEkgMy4wKSAqLworCSB1ODo0OwkJCS8qIDIwLTIzOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQzOwkJLyogMjQtMzE6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCisJdTggcmVzZXRfdmFsdWU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtICovCisJdTggcmVzZXJ2ZWQ0WzNdOwkvKiBUaGVzZSB0aHJlZSBieXRlcyBtdXN0IGJlIHplcm8gKi8KKwl1NjQgeGZpcm13YXJlX2N0cmw7CS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KKwl1NjQgWGRzZHQ7CQkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFhX2V2dF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYl9ldnRfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2NudF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0yX2NudF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbV90bXJfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeGdwZTBfYmxrOwkvKiBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAwIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMV9ibGs7CS8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayBhZGRyZXNzICovCiB9OwogCi0KIC8qICJEb3duLXJldnZlZCIgQUNQSSAyLjAgRkFEVCBkZXNjcmlwdG9yICovCiAKLXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cwotewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiAgICAgICAgICAgICAgICAgICAgICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JRkFEVF9SRVYyX0NPTU1PTgotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOyAgICAgICAgICAvKiBSZXNlcnZlZCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICByZXNldF9yZWdpc3RlcjsgICAgIC8qIFJlc2V0IHJlZ2lzdGVyIGFkZHJlc3MgaW4gR0FTIGZvcm1hdCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfdmFsdWU7ICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtLiAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ3WzNdOyAgICAgICAvKiBUaGVzZSB0aHJlZSBieXRlcyBtdXN0IGJlIHplcm8gKi8KK3N0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cyB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLworCUZBRFRfUkVWMl9DT01NT04gdTggcmVzZXJ2ZWQyOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTMyIGZsYWdzOworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCisJdTggcmVzZXRfdmFsdWU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtLiAqLworCXU4IHJlc2VydmVkN1szXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAotCiAvKiBFQ0RUIC0gRW1iZWRkZWQgQ29udHJvbGxlciBCb290IFJlc291cmNlcyBUYWJsZSAqLwogCi1zdHJ1Y3QgZWNfYm9vdF9yZXNvdXJjZXMKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgICAgIGVjX2NvbnRyb2w7ICAgICAgICAgLyogQWRkcmVzcyBvZiBFQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAgICAgZWNfZGF0YTsgICAgICAgICAgICAvKiBBZGRyZXNzIG9mIEVDIGRhdGEgcmVnaXN0ZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZDsgICAgICAgICAgICAgICAgLyogVW5pcXVlIElEIC0gbXVzdCBiZSBzYW1lIGFzIHRoZSBFQyBfVUlEIG1ldGhvZCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX2JpdDsgICAgICAgICAgICAvKiBUaGUgR1BFIGZvciB0aGUgRUMgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX2lkWzFdOyAgICAgICAgICAgLyogRnVsbCBuYW1lcGF0aCBvZiB0aGUgRUMgaW4gdGhlIEFDUEkgbmFtZXNwYWNlICovCitzdHJ1Y3QgZWNfYm9vdF9yZXNvdXJjZXMgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZWNfY29udHJvbDsJLyogQWRkcmVzcyBvZiBFQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBlY19kYXRhOwkvKiBBZGRyZXNzIG9mIEVDIGRhdGEgcmVnaXN0ZXIgKi8KKwl1MzIgdWlkOwkJLyogVW5pcXVlIElEIC0gbXVzdCBiZSBzYW1lIGFzIHRoZSBFQyBfVUlEIG1ldGhvZCAqLworCXU4IGdwZV9iaXQ7CQkvKiBUaGUgR1BFIGZvciB0aGUgRUMgKi8KKwl1OCBlY19pZFsxXTsJCS8qIEZ1bGwgbmFtZXBhdGggb2YgdGhlIEVDIGluIHRoZSBBQ1BJIG5hbWVzcGFjZSAqLwogfTsKIAotCiAvKiBTUkFUIC0gU3lzdGVtIFJlc291cmNlIEFmZmluaXR5IFRhYmxlICovCiAKLXN0cnVjdCBzdGF0aWNfcmVzb3VyY2VfYWxsb2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94aW1pdHlfZG9tYWluX2xvOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY19pZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgICAgICAgICA6MTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMyAgICAgICA6MzE7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9zYXBpY19laWQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94aW1pdHlfZG9tYWluX2hpWzNdOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ0Oworc3RydWN0IHN0YXRpY19yZXNvdXJjZV9hbGxvYyB7CisJdTggdHlwZTsKKwl1OCBsZW5ndGg7CisJdTggcHJveGltaXR5X2RvbWFpbl9sbzsKKwl1OCBhcGljX2lkOworCisJLyogRmxhZ3MgKDMyIGJpdHMpICovCisKKwl1OCBlbmFibGVkOjE7CQkvKiAwMDogICAgVXNlIGFmZmluaXR5IHN0cnVjdHVyZSAqLworCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQzWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisJdTggbG9jYWxfc2FwaWNfZWlkOworCXU4IHByb3hpbWl0eV9kb21haW5faGlbM107CisJdTMyIHJlc2VydmVkNDsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIH07CiAKLXN0cnVjdCBtZW1vcnlfYWZmaW5pdHkKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94aW1pdHlfZG9tYWluOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9hZGRyZXNzOwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19sZW5ndGg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkICAgICAgICAgOjE7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3RfcGx1Z2dhYmxlICAgOjE7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fdm9sYXRpbGUgICAgOjE7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDUgICAgICAgOjI5OwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ2Oworc3RydWN0IG1lbW9yeV9hZmZpbml0eSB7CisJdTggdHlwZTsKKwl1OCBsZW5ndGg7CisJdTMyIHByb3hpbWl0eV9kb21haW47CisJdTE2IHJlc2VydmVkMzsKKwl1NjQgYmFzZV9hZGRyZXNzOworCXU2NCBhZGRyZXNzX2xlbmd0aDsKKwl1MzIgcmVzZXJ2ZWQ0OworCisJLyogRmxhZ3MgKDMyIGJpdHMpICovCisKKwl1OCBlbmFibGVkOjE7CQkvKiAwMDogICAgVXNlIGFmZmluaXR5IHN0cnVjdHVyZSAqLworCXU4IGhvdF9wbHVnZ2FibGU6MTsJLyogMDE6ICAgIE1lbW9yeSByZWdpb24gaXMgaG90IHBsdWdnYWJsZSAqLworCXU4IG5vbl92b2xhdGlsZToxOwkvKiAwMjogICAgTWVtb3J5IGlzIG5vbi12b2xhdGlsZSAqLworCSB1ODo1OwkJCS8qIDAzLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggcmVzZXJ2ZWQ1WzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisJdTY0IHJlc2VydmVkNjsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIH07CiAKLXN0cnVjdCBzeXN0ZW1fcmVzb3VyY2VfYWZmaW5pdHkKLXsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgICAgLyogTXVzdCBiZSB2YWx1ZSAnMScgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsKK3N0cnVjdCBzeXN0ZW1fcmVzb3VyY2VfYWZmaW5pdHkgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgcmVzZXJ2ZWQxOwkvKiBNdXN0IGJlIHZhbHVlICcxJyAqLworCXU2NCByZXNlcnZlZDI7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCi0KIC8qIFNMSVQgLSBTeXN0ZW0gTG9jYWxpdHkgRGlzdGFuY2UgSW5mb3JtYXRpb24gVGFibGUgKi8KIAotc3RydWN0IHN5c3RlbV9sb2NhbGl0eV9pbmZvCi17Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGl0eV9jb3VudDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5WzFdWzFdOworc3RydWN0IHN5c3RlbV9sb2NhbGl0eV9pbmZvIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTY0IGxvY2FsaXR5X2NvdW50OworCXU4IGVudHJ5WzFdWzFdOwogfTsKIAotCiAjcHJhZ21hIHBhY2soKQogCi0jZW5kaWYgLyogX19BQ1RCTDJfSF9fICovCi0KKyNlbmRpZgkJCQkvKiBfX0FDVEJMMl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDcxLmggYi9pbmNsdWRlL2FjcGkvYWN0Ymw3MS5oCmluZGV4IDdiNGZiNDQuLjEwYWMwNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDcxLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsNzEuaApAQCAtMjcsNyArMjcsNiBAQAogI2lmbmRlZiBfX0FDVEJMNzFfSF9fCiAjZGVmaW5lIF9fQUNUQkw3MV9IX18KIAotCiAvKiAwLjcxIEZBRFQgYWRkcmVzc19zcGFjZSBkYXRhIGl0ZW0gYml0bWFza3MgZGVmaW5lcyAqLwogLyogSWYgdGhlIGFzc29jaWF0ZWQgYml0IGlzIHplcm8gdGhlbiBpdCBpcyBpbiBtZW1vcnkgc3BhY2UgZWxzZSBpbiBpbyBzcGFjZSAqLwogCkBAIC00MCwxMDUgKzM5LDk2IEBACiAKIC8qIE9ubHkgZm9yIGNsYXJpdHkgaW4gZGVjbGFyYXRpb25zICovCiAKLXR5cGVkZWYgdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIElPX0FERFJFU1M7Ci0KK3R5cGVkZWYgdTY0IElPX0FERFJFU1M7CiAKICNwcmFnbWEgcGFjaygxKQotc3RydWN0ICAvKiBSb290IFN5c3RlbSBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KLXsKLQlOQVRJVkVfQ0hBUiAgICAgICAgICAgICBzaWduYXR1cmUgWzhdOyAgICAgICAgICAvKiBjb250YWlucyAiUlNEIFBUUiAiICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bTsgICAgICAgICAgICAgICAvKiB0byBtYWtlIHN1bSBvZiBzdHJ1Y3QgPT0gMCAqLwotCU5BVElWRV9DSEFSICAgICAgICAgICAgIG9lbV9pZCBbNl07ICAgICAgICAgICAgIC8qIE9FTSBpZGVudGlmaWNhdGlvbiAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyogTXVzdCBiZSAwIGZvciAxLjAsIDIgZm9yIDIuMCAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNkdF9waHlzaWNhbF9hZGRyZXNzOyAgLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgUlNEVCAqLworc3RydWN0IHsJCQkvKiBSb290IFN5c3RlbSBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KKwlOQVRJVkVfQ0hBUiBzaWduYXR1cmVbOF07CS8qIGNvbnRhaW5zICJSU0QgUFRSICIgKi8KKwl1OCBjaGVja3N1bTsJCS8qIHRvIG1ha2Ugc3VtIG9mIHN0cnVjdCA9PSAwICovCisJTkFUSVZFX0NIQVIgb2VtX2lkWzZdOwkvKiBPRU0gaWRlbnRpZmljYXRpb24gKi8KKwl1OCByZXNlcnZlZDsJCS8qIE11c3QgYmUgMCBmb3IgMS4wLCAyIGZvciAyLjAgKi8KKwl1NjQgcnNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSU0RUICovCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIElBNjQgRXh0ZW5zaW9ucyB0byBBQ1BJIFNwZWMgUmV2IDAuNzEgKi8KIC8qIGZvciB0aGUgUm9vdCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdAotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICBoZWFkZXI7ICAgICAgICAgICAgICAgICAvKiBUYWJsZSBoZWFkZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfcGFkOyAgICAgICAgICAgLyogSUE2NCBhbGlnbm1lbnQsIG11c3QgYmUgMCAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9vZmZzZXRfZW50cnkgWzFdOyAvKiBBcnJheSBvZiBwb2ludGVycyB0byBvdGhlciAqLwotCQkJICAgLyogdGFibGVzJyBoZWFkZXJzICovCitzdHJ1Y3QgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIFRhYmxlIGhlYWRlciAqLworCXUzMiByZXNlcnZlZF9wYWQ7CS8qIElBNjQgYWxpZ25tZW50LCBtdXN0IGJlIDAgKi8KKwl1NjQgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBvdGhlciAqLworCS8qIHRhYmxlcycgaGVhZGVycyAqLwogfTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIElBNjQgRXh0ZW5zaW9ucyB0byBBQ1BJIFNwZWMgUmV2IDAuNzEgICAqLwogLyogZm9yIHRoZSBGaXJtd2FyZSBBQ1BJIENvbnRyb2wgU3RydWN0dXJlICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdAotewotCU5BVElWRV9DSEFSICAgICAgICAgc2lnbmF0dXJlWzRdOyAgICAgICAgIC8qIHNpZ25hdHVyZSAiRkFDUyIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlX3NpZ25hdHVyZTsgICAvKiBoYXJkd2FyZSBjb25maWd1cmF0aW9uIHNpZ25hdHVyZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDQ7ICAgICAgICAgICAgLyogbXVzdCBiZSAwICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX3dha2luZ192ZWN0b3I7IC8qIEFDUEkgT1Mgd2FraW5nIHZlY3RvciAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbG9jazsgICAgICAgICAgLyogR2xvYmFsIExvY2sgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgUzRiaW9zX2YgICAgICA6IDE7ICAgIC8qIEluZGljYXRlcyBpZiBTNEJJT1Mgc3VwcG9ydCBpcyBwcmVzZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMSAgICAgOiAzMTsgICAvKiBtdXN0IGJlIDAgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzIFsyOF07ICAgICAgIC8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCitzdHJ1Y3QgeworCU5BVElWRV9DSEFSIHNpZ25hdHVyZVs0XTsJLyogc2lnbmF0dXJlICJGQUNTIiAqLworCXUzMiBsZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3RydWN0dXJlLCBpbiBieXRlcyAqLworCXUzMiBoYXJkd2FyZV9zaWduYXR1cmU7CS8qIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gc2lnbmF0dXJlICovCisJdTMyIHJlc2VydmVkNDsJCS8qIG11c3QgYmUgMCAqLworCXU2NCBmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwkvKiBBQ1BJIE9TIHdha2luZyB2ZWN0b3IgKi8KKwl1NjQgZ2xvYmFsX2xvY2s7CS8qIEdsb2JhbCBMb2NrICovCisJdTMyIFM0Ymlvc19mOjE7CQkvKiBJbmRpY2F0ZXMgaWYgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLworCXUzMiByZXNlcnZlZDE6MzE7CS8qIG11c3QgYmUgMCAqLworCXU4IHJlc2VydmVkM1syOF07CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBJQTY0IEV4dGVuc2lvbnMgdG8gQUNQSSBTcGVjIFJldiAwLjcxICAqLwogLyogZm9yIHRoZSBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgaGVhZGVyOyAgICAgICAgICAgICAvKiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfcGFkOyAgICAgICAvKiBJQTY0IGFsaWdubWVudCwgbXVzdCBiZSAwICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX2N0cmw7ICAgICAgLyogNjQtYml0IFBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBkc2R0OyAgICAgICAgICAgICAgIC8qIDY0LWJpdCBQaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw7ICAgICAgICAgICAgICAvKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nfc3BhY2U7ICAgICAgLyogQWRkcmVzcyBTcGFjZSBCaXRtYXNrICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9pbnQ7ICAgICAgICAgICAgLyogU3lzdGVtIHZlY3RvciBvZiBTQ0kgaW50ZXJydXB0ICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZW5hYmxlOyAgICAgICAgLyogdmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2Rpc2FibGU7ICAgICAgIC8qIHZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZGlzYWJsZSBBQ1BJICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIFM0Ymlvc19yZXE7ICAgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOyAgICAgICAgICAvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBzbWlfY21kOyAgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIHBtMWFfZXZ0X2JsazsgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgcG0xYl9ldnRfYmxrOyAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIGFjcGlfZXZlbnQgUmVnIEJsayAqLwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICBwbTFhX2NudF9ibGs7ICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIHBtMWJfY250X2JsazsgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX2NudF9ibGs7ICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIHBtX3Rtcl9ibGs7ICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMF9ibGs7ICAgICAgICAgICAvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmxrOyAgICAgICAgICAgLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFfZXZ0X2xlbjsgICAgICAgIC8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2V2dF9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xX2NudF9sZW47ICAgICAgICAvKiBCeXRlIGxlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9jbnRfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9jbnRfbGVuOyAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NudF9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgcG1fdG1fbGVuOyAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMF9ibGtfbGVuOyAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2JsayAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBncGUxX2Jsa19sZW47ICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTFfYmxrICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmFzZTsgICAgICAgICAgLyogb2Zmc2V0IGluIGdwZSBtb2RlbCB3aGVyZSBncGUxIGV2ZW50cyBzdGFydCAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDM7ICAgICAgICAgIC8qIHJlc2VydmVkICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwyX2xhdDsgICAgICAgICAgLyogd29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzIgc3RhdGUgKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgcGx2bDNfbGF0OyAgICAgICAgICAvKiB3b3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfYWxybTsgICAgICAgICAgIC8qIGluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uX2Fscm07ICAgICAgICAgICAvKiBpbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50dXJ5OyAgICAgICAgICAgIC8qIGluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkNDsgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfY2FzaCAgOiAxOyAgICAvKiBQQUxfRkxVU0hfQ0FDSEUgaXMgY29ycmVjdGx5IHN1cHBvcnRlZCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDUgICA6IDE7ICAgIC8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYzEgICAgIDogMTsgICAgLyogYWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsMl91cCAgICA6IDE7ICAgIC8qIEMyIHN0YXRlIHdvcmtzIG9uIE1QIHN5c3RlbSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBwd3JfYnV0dG9uICA6IDE7ICAgIC8qIFBvd2VyIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwX2J1dHRvbiA6IDE7ICAgLyogU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3JUQyAgIDogMTsgICAgLyogUlRDIHdha2V1cCBzdGF0IG5vdCBpbiBmaXhlZCByZWdpc3RlciBzcGFjZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBydGNzNCAgICAgICA6IDE7ICAgIC8qIFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICB0bXJfdmFsX2V4dCA6IDE7ICAgIC8qIHRtcl92YWwgaXMgMzIgYml0cyAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBkb2NrX2NhcCAgICA6IDE7ICAgIC8qIFN1cHBvcnRzIERvY2tpbmcgKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ2ICAgOiAyMjsgICAgLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KK3N0cnVjdCB7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogdGFibGUgaGVhZGVyICovCisJdTMyIHJlc2VydmVkX3BhZDsJLyogSUE2NCBhbGlnbm1lbnQsIG11c3QgYmUgMCAqLworCXU2NCBmaXJtd2FyZV9jdHJsOwkvKiA2NC1iaXQgUGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCisJdTY0IGRzZHQ7CQkvKiA2NC1iaXQgUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCisJdTggbW9kZWw7CQkvKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsICovCisJdTggYWRkcmVzc19zcGFjZTsJLyogQWRkcmVzcyBTcGFjZSBCaXRtYXNrICovCisJdTE2IHNjaV9pbnQ7CQkvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KKwl1OCBhY3BpX2VuYWJsZTsJCS8qIHZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZW5hYmxlIEFDUEkgKi8KKwl1OCBhY3BpX2Rpc2FibGU7CS8qIHZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZGlzYWJsZSBBQ1BJICovCisJdTggUzRiaW9zX3JlcTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSSBDTUQgdG8gZW50ZXIgUzRCSU9TIHN0YXRlICovCisJdTggcmVzZXJ2ZWQyOwkJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwl1NjQgc21pX2NtZDsJCS8qIFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovCisJdTY0IHBtMWFfZXZ0X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgKi8KKwl1NjQgcG0xYl9ldnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIGFjcGlfZXZlbnQgUmVnIEJsayAqLworCXU2NCBwbTFhX2NudF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCisJdTY0IHBtMWJfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8KKwl1NjQgcG0yX2NudF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgKi8KKwl1NjQgcG1fdG1yX2JsazsJCS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovCisJdTY0IGdwZTBfYmxrOwkJLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayAqLworCXU2NCBncGUxX2JsazsJCS8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAxIFJlZyBCbGsgKi8KKwl1OCBwbTFfZXZ0X2xlbjsJCS8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2V2dF9ibGsgKi8KKwl1OCBwbTFfY250X2xlbjsJCS8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2NudF9ibGsgKi8KKwl1OCBwbTJfY250X2xlbjsJCS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMl9jbnRfYmxrICovCisJdTggcG1fdG1fbGVuOwkJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG1fdG1fYmxrICovCisJdTggZ3BlMF9ibGtfbGVuOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2JsayAqLworCXU4IGdwZTFfYmxrX2xlbjsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibGsgKi8KKwl1OCBncGUxX2Jhc2U7CQkvKiBvZmZzZXQgaW4gZ3BlIG1vZGVsIHdoZXJlIGdwZTEgZXZlbnRzIHN0YXJ0ICovCisJdTggcmVzZXJ2ZWQzOwkJLyogcmVzZXJ2ZWQgKi8KKwl1MTYgcGx2bDJfbGF0OwkJLyogd29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzIgc3RhdGUgKi8KKwl1MTYgcGx2bDNfbGF0OwkJLyogd29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8KKwl1OCBkYXlfYWxybTsJCS8qIGluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBtb25fYWxybTsJCS8qIGluZGV4IHRvIG1vbnRoLW9mLXllYXIgYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCisJdTggY2VudHVyeTsJCS8qIGluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCisJdTggcmVzZXJ2ZWQ0OwkJLyogcmVzZXJ2ZWQgKi8KKwl1MzIgZmx1c2hfY2FzaDoxOwkvKiBQQUxfRkxVU0hfQ0FDSEUgaXMgY29ycmVjdGx5IHN1cHBvcnRlZCAqLworCXUzMiByZXNlcnZlZDU6MTsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwl1MzIgcHJvY19jMToxOwkJLyogYWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLworCXUzMiBwbHZsMl91cDoxOwkJLyogQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCisJdTMyIHB3cl9idXR0b246MTsJLyogUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KKwl1MzIgc2xlZXBfYnV0dG9uOjE7CS8qIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLworCXUzMiBmaXhlZF9yVEM6MTsJLyogUlRDIHdha2V1cCBzdGF0IG5vdCBpbiBmaXhlZCByZWdpc3RlciBzcGFjZSAqLworCXUzMiBydGNzNDoxOwkJLyogUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCisJdTMyIHRtcl92YWxfZXh0OjE7CS8qIHRtcl92YWwgaXMgMzIgYml0cyAqLworCXUzMiBkb2NrX2NhcDoxOwkJLyogU3VwcG9ydHMgRG9ja2luZyAqLworCXUzMiByZXNlcnZlZDY6MjI7CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCiB9OwogCiAjcHJhZ21hIHBhY2soKQogCi0jZW5kaWYgLyogX19BQ1RCTDcxX0hfXyAqLwotCisjZW5kaWYJCQkJLyogX19BQ1RCTDcxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggM2E0NTFkYy4uNjIxM2IyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC00NiwzNSArNDYsMzEgQEAKIAogLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlIHR5cGVkZWZzKSAqLwogCi0KLQogLyoKICAqIERhdGEgdHlwZSByYW5nZXMKICAqIE5vdGU6IFRoZXNlIG1hY3JvcyBhcmUgZGVzaWduZWQgdG8gYmUgY29tcGlsZXIgaW5kZXBlbmRlbnQgYXMgd2VsbCBhcwogICogd29ya2luZyBhcm91bmQgcHJvYmxlbXMgdGhhdCBzb21lIDMyLWJpdCBjb21waWxlcnMgaGF2ZSB3aXRoIDY0LWJpdAogICogY29uc3RhbnRzLgogICovCi0jZGVmaW5lIEFDUElfVUlOVDhfTUFYICAgICAgICAgICAgICAgICAgKFVJTlQ4KSAofigoVUlOVDgpICAwKSkgLyogMHhGRiAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFDUElfVUlOVDE2X01BWCAgICAgICAgICAgICAgICAgKFVJTlQxNikofigoVUlOVDE2KSAwKSkgLyogMHhGRkZGICAgICAgICAgICAgICovCi0jZGVmaW5lIEFDUElfVUlOVDMyX01BWCAgICAgICAgICAgICAgICAgKFVJTlQzMikofigoVUlOVDMyKSAwKSkgLyogMHhGRkZGRkZGRiAgICAgICAgICovCi0jZGVmaW5lIEFDUElfVUlOVDY0X01BWCAgICAgICAgICAgICAgICAgKFVJTlQ2NCkofigoVUlOVDY0KSAwKSkgLyogMHhGRkZGRkZGRkZGRkZGRkZGICovCisjZGVmaW5lIEFDUElfVUlOVDhfTUFYICAgICAgICAgICAgICAgICAgKFVJTlQ4KSAofigoVUlOVDgpICAwKSkJLyogMHhGRiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDUElfVUlOVDE2X01BWCAgICAgICAgICAgICAgICAgKFVJTlQxNikofigoVUlOVDE2KSAwKSkJLyogMHhGRkZGICAgICAgICAgICAgICovCisjZGVmaW5lIEFDUElfVUlOVDMyX01BWCAgICAgICAgICAgICAgICAgKFVJTlQzMikofigoVUlOVDMyKSAwKSkJLyogMHhGRkZGRkZGRiAgICAgICAgICovCisjZGVmaW5lIEFDUElfVUlOVDY0X01BWCAgICAgICAgICAgICAgICAgKFVJTlQ2NCkofigoVUlOVDY0KSAwKSkJLyogMHhGRkZGRkZGRkZGRkZGRkZGICovCiAjZGVmaW5lIEFDUElfQVNDSUlfTUFYICAgICAgICAgICAgICAgICAgMHg3RgogCi0KICNpZmRlZiBERUZJTkVfQUxURVJOQVRFX1RZUEVTCiAvKgogICogVHlwZXMgdXNlZCBvbmx5IGluIHRyYW5zbGF0ZWQgc291cmNlLCBkZWZpbmVkIGhlcmUgdG8gZW5hYmxlCiAgKiBjcm9zcy1wbGF0Zm9ybSBjb21waWxhdGlvbiBvbmx5LgogICovCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczMyOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIHU4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgIHUxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICB1MzI7Ci10eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgICAgICAgdTY0OwordHlwZWRlZiBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Cit0eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgdTY0OwogCiAjZW5kaWYKIAotCiAvKgogICogRGF0YSB0eXBlcyAtIEZpeGVkIGFjcm9zcyBhbGwgY29tcGlsYXRpb24gbW9kZWxzICgxNi8zMi82NCkKICAqCkBAIC0xMDIsMzAgKzk4LDI5IEBACiAvKgogICogNjQtYml0IHR5cGUgZGVmaW5pdGlvbnMKICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIFVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIEJPT0xFQU47Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgVUlOVDE2OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIFVJTlQzMjsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0ICAgICAgICBJTlQ2NDsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCAgICAgICBVSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwordHlwZWRlZiBpbnQgSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7Cit0eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCBJTlQ2NDsKK3R5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCBVSU5UNjQ7CiAKIC8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIAotdHlwZWRlZiBzNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uYXRpdmVfaW50OwotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uYXRpdmVfdWludDsKK3R5cGVkZWYgczY0IGFjcGlfbmF0aXZlX2ludDsKK3R5cGVkZWYgdTY0IGFjcGlfbmF0aXZlX3VpbnQ7CiAKLXR5cGVkZWYgdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfdGFibGVfcHRyOwotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9pb19hZGRyZXNzOwotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzOwotdHlwZWRlZiB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9zaXplOwordHlwZWRlZiB1NjQgYWNwaV90YWJsZV9wdHI7Cit0eXBlZGVmIHU2NCBhY3BpX2lvX2FkZHJlc3M7Cit0eXBlZGVmIHU2NCBhY3BpX3BoeXNpY2FsX2FkZHJlc3M7Cit0eXBlZGVmIHU2NCBhY3BpX3NpemU7CiAKLSNkZWZpbmUgQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZICAgICAgICAweDAwMDAwMDA4ICAgICAgLyogTm8gaGFyZHdhcmUgYWxpZ25tZW50IHN1cHBvcnQgaW4gSUE2NCAqLwotI2RlZmluZSBBQ1BJX1VTRV9OQVRJVkVfRElWSURFICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYXRpdmUgNjQtYml0IGludGVnZXIgc3VwcG9ydCAqLworI2RlZmluZSBBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkgICAgICAgIDB4MDAwMDAwMDgJLyogTm8gaGFyZHdhcmUgYWxpZ25tZW50IHN1cHBvcnQgaW4gSUE2NCAqLworI2RlZmluZSBBQ1BJX1VTRV9OQVRJVkVfRElWSURFCS8qIE5hdGl2ZSA2NC1iaXQgaW50ZWdlciBzdXBwb3J0ICovCiAjZGVmaW5lIEFDUElfTUFYX1BUUiAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UNjRfTUFYCiAjZGVmaW5lIEFDUElfU0laRV9NQVggICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UNjRfTUFYCiAKLQogI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDE2CiAKIC8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcykgKi8KQEAgLTEzMywzMiArMTI4LDMxIEBACiAvKgogICogMTYtYml0IHR5cGUgZGVmaW5pdGlvbnMKICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIFVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgIEJPT0xFQU47Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgVUlOVDE2OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyOwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIFVJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCT09MRUFOOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDE2OwordHlwZWRlZiBsb25nIElOVDMyOwordHlwZWRlZiBpbnQgSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUlOVDMyOwogCi1zdHJ1Y3QKLXsKLQlVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG87Ci0JVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpOworc3RydWN0IHsKKwlVSU5UMzIgTG87CisJVUlOVDMyIEhpOwogfTsKIAogLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwogCi10eXBlZGVmIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX25hdGl2ZV91aW50OwotdHlwZWRlZiBzMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uYXRpdmVfaW50OwordHlwZWRlZiB1MTYgYWNwaV9uYXRpdmVfdWludDsKK3R5cGVkZWYgczE2IGFjcGlfbmF0aXZlX2ludDsKIAotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV90YWJsZV9wdHI7Ci10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2lvX2FkZHJlc3M7Ci10eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNwaV9waHlzaWNhbF9hZGRyZXNzOwotdHlwZWRlZiB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9zaXplOwordHlwZWRlZiB1MzIgYWNwaV90YWJsZV9wdHI7Cit0eXBlZGVmIHUzMiBhY3BpX2lvX2FkZHJlc3M7Cit0eXBlZGVmIGNoYXIgKmFjcGlfcGh5c2ljYWxfYWRkcmVzczsKK3R5cGVkZWYgdTE2IGFjcGlfc2l6ZTsKIAogI2RlZmluZSBBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgQUNQSV9NSVNBTElHTkVEX1RSQU5TRkVSUwotI2RlZmluZSBBQ1BJX1VTRV9OQVRJVkVfRElWSURFICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyA2NC1iaXQgaW50ZWdlcnMsIG9rIHRvIHVzZSBuYXRpdmUgZGl2aWRlICovCisjZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUJLyogTm8gNjQtYml0IGludGVnZXJzLCBvayB0byB1c2UgbmF0aXZlIGRpdmlkZSAqLwogI2RlZmluZSBBQ1BJX01BWF9QVFIgICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDE2X01BWAogI2RlZmluZSBBQ1BJX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDE2X01BWAogCkBAIC0xNjgsNyArMTYyLDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX05PX0lOVEVHRVI2NF9TVVBQT1JUCiAKLQogI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDMyCiAKIC8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcykgKi8KQEAgLTE3NiwyMyArMTY5LDIzIEBACiAvKgogICogMzItYml0IHR5cGUgZGVmaW5pdGlvbnMgKGRlZmF1bHQpCiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICBVSU5UODsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICBCT09MRUFOOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgIFVJTlQxNjsKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBVSU5UMzI7Ci10eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCAgICAgICAgSU5UNjQ7Ci10eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgICAgICAgVUlOVDY0OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJPT0xFQU47Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQxNjsKK3R5cGVkZWYgaW50IElOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDMyOwordHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfSU5UNjQgSU5UNjQ7Cit0eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgVUlOVDY0OwogCiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiAKLXR5cGVkZWYgczMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbmF0aXZlX2ludDsKLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbmF0aXZlX3VpbnQ7Cit0eXBlZGVmIHMzMiBhY3BpX25hdGl2ZV9pbnQ7Cit0eXBlZGVmIHUzMiBhY3BpX25hdGl2ZV91aW50OwogCi10eXBlZGVmIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3RhYmxlX3B0cjsKLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaW9fYWRkcmVzczsKLXR5cGVkZWYgdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzczsKLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfc2l6ZTsKK3R5cGVkZWYgdTY0IGFjcGlfdGFibGVfcHRyOwordHlwZWRlZiB1MzIgYWNwaV9pb19hZGRyZXNzOwordHlwZWRlZiB1NjQgYWNwaV9waHlzaWNhbF9hZGRyZXNzOwordHlwZWRlZiB1MzIgYWNwaV9zaXplOwogCiAjZGVmaW5lIEFMSUdORURfQUREUkVTU19CT1VOREFSWSAgICAgICAgMHgwMDAwMDAwNAogI2RlZmluZSBBQ1BJX01JU0FMSUdORURfVFJBTlNGRVJTCkBAIC0yMDMsMjkgKzE5NiwyNyBAQAogI2Vycm9yIHVua25vd24gQUNQSV9NQUNISU5FX1dJRFRICiAjZW5kaWYKIAotCiAvKgotICogTWlzY2VsbGFuZW91cyBjb21tb24gdHlwZXMKKyAqIFRoaXMgdHlwZSBpcyB1c2VkIGZvciBiaXRmaWVsZHMgaW4gQUNQSSB0YWJsZXMuIFRoZSBvbmx5IHR5cGUgdGhhdCBpcworICogZXZlbiByZW1vdGVseSBwb3J0YWJsZSBpcyB1OC4gQW55dGhpbmcgZWxzZSBpcyBub3QgcG9ydGFibGUsIHNvCisgKiBkbyBub3QgYWRkIGFueSBtb3JlIGJpdGZpZWxkIHR5cGVzLgogICovCi10eXBlZGVmIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTZfQklUOwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyX0JJVDsKLXR5cGVkZWYgYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfUFRSRElGRjsKK3R5cGVkZWYgdTggVUlOVDhfQklUOwordHlwZWRlZiBhY3BpX25hdGl2ZV91aW50IEFDUElfUFRSRElGRjsKIAogLyoKICAqIFBvaW50ZXIgb3ZlcmxheXMgdG8gYXZvaWQgbG90cyBvZiB0eXBlY2FzdGluZyBmb3IKICAqIGNvZGUgdGhhdCBhY2NlcHRzIGJvdGggcGh5c2ljYWwgYW5kIGxvZ2ljYWwgcG9pbnRlcnMuCiAgKi8KLXVuaW9uIGFjcGlfcG9pbnRlcnMKLXsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgICAgICBwaHlzaWNhbDsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9naWNhbDsKLQlhY3BpX3RhYmxlX3B0ciAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKK3VuaW9uIGFjcGlfcG9pbnRlcnMgeworCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbDsKKwl2b2lkICpsb2dpY2FsOworCWFjcGlfdGFibGVfcHRyIHZhbHVlOwogfTsKIAotc3RydWN0IGFjcGlfcG9pbnRlcgotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfdHlwZTsKLQl1bmlvbiBhY3BpX3BvaW50ZXJzICAgICAgICAgICAgICAgICBwb2ludGVyOworc3RydWN0IGFjcGlfcG9pbnRlciB7CisJdTMyIHBvaW50ZXJfdHlwZTsKKwl1bmlvbiBhY3BpX3BvaW50ZXJzIHBvaW50ZXI7CiB9OwogCiAvKiBwb2ludGVyX3R5cGVzIGZvciBhYm92ZSAqLwpAQCAtMjQzLDYgKzIzNCwxNCBAQAogI2RlZmluZSBBQ1BJX0xPR01PREVfUEhZU1BUUiAgICAgICAgICAgIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HICB8IEFDUElfUEhZU0lDQUxfUE9JTlRFUgogI2RlZmluZSBBQ1BJX0xPR01PREVfTE9HUFRSICAgICAgICAgICAgIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HICB8IEFDUElfTE9HSUNBTF9QT0lOVEVSCiAKKy8qCisgKiBJZiBhY3BpX2NhY2hlX3Qgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBPUy1kZXBlbmRlbnQgaGVhZGVyLAorICogZGVmaW5lIGl0IG5vdy4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGxvY2FsIGNhY2hlCisgKiBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIGlzIHRvIGJlIHVzZWQgKEFDUElfVVNFX0xPQ0FMX0NBQ0hFKQorICovCisjaWZuZGVmIGFjcGlfY2FjaGVfdAorI2RlZmluZSBhY3BpX2NhY2hlX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKKyNlbmRpZgogCiAvKgogICogVXNlZnVsIGRlZmluZXMKQEAgLTI2MSwzNCArMjYwLDI5IEBACiAjZGVmaW5lIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMAogI2VuZGlmCiAKLQogLyoKICAqIExvY2FsIGRhdGF0eXBlcwogICovCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX3N0YXR1czsgICAgLyogQWxsIEFDUEkgRXhjZXB0aW9ucyAqLwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9uYW1lOyAgICAgIC8qIDQtYnl0ZSBBQ1BJIG5hbWUgKi8KLXR5cGVkZWYgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfc3RyaW5nOyAgICAvKiBOdWxsIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nICovCi10eXBlZGVmIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2hhbmRsZTsgICAgLyogQWN0dWFsbHkgYSBwdHIgdG8gYW4gTm9kZSAqLwordHlwZWRlZiB1MzIgYWNwaV9zdGF0dXM7CS8qIEFsbCBBQ1BJIEV4Y2VwdGlvbnMgKi8KK3R5cGVkZWYgdTMyIGFjcGlfbmFtZTsJCS8qIDQtYnl0ZSBBQ1BJIG5hbWUgKi8KK3R5cGVkZWYgY2hhciAqYWNwaV9zdHJpbmc7CS8qIE51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgKi8KK3R5cGVkZWYgdm9pZCAqYWNwaV9oYW5kbGU7CS8qIEFjdHVhbGx5IGEgcHRyIHRvIGFuIE5vZGUgKi8KIAotc3RydWN0IHVpbnQ2NF9zdHJ1Y3QKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaTsKK3N0cnVjdCB1aW50NjRfc3RydWN0IHsKKwl1MzIgbG87CisJdTMyIGhpOwogfTsKIAotdW5pb24gdWludDY0X292ZXJsYXkKLXsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsOwotCXN0cnVjdCB1aW50NjRfc3RydWN0ICAgICAgICAgICAgICAgIHBhcnQ7Cit1bmlvbiB1aW50NjRfb3ZlcmxheSB7CisJdTY0IGZ1bGw7CisJc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgcGFydDsKIH07CiAKLXN0cnVjdCB1aW50MzJfc3RydWN0Ci17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG87Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGk7CitzdHJ1Y3QgdWludDMyX3N0cnVjdCB7CisJdTMyIGxvOworCXUzMiBoaTsKIH07CiAKLQogLyoKICAqIEFjcGkgaW50ZWdlciB3aWR0aC4gSW4gQUNQSSB2ZXJzaW9uIDEsIGludGVnZXJzIGFyZQogICogMzIgYml0cy4gIEluIEFDUEkgdmVyc2lvbiAyLCBpbnRlZ2VycyBhcmUgNjQgYml0cy4KQEAgLTMwMCwyNiArMjk0LDI0IEBACiAKIC8qIDMyLWJpdCBpbnRlZ2VycyBvbmx5LCBubyA2NC1iaXQgc3VwcG9ydCAqLwogCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2ludGVnZXI7Cit0eXBlZGVmIHUzMiBhY3BpX2ludGVnZXI7CiAjZGVmaW5lIEFDUElfSU5URUdFUl9NQVggICAgICAgICAgICAgICAgQUNQSV9VSU5UMzJfTUFYCiAjZGVmaW5lIEFDUElfSU5URUdFUl9CSVRfU0laRSAgICAgICAgICAgMzIKLSNkZWZpbmUgQUNQSV9NQVhfREVDSU1BTF9ESUdJVFMgICAgICAgICAxMCAgLyogMl4zMiA9IDQsMjk0LDk2NywyOTYgKi8KKyNkZWZpbmUgQUNQSV9NQVhfREVDSU1BTF9ESUdJVFMgICAgICAgICAxMAkvKiAyXjMyID0gNCwyOTQsOTY3LDI5NiAqLwogCi0jZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUgICAgICAgICAgLyogVXNlIGNvbXBpbGVyIG5hdGl2ZSAzMi1iaXQgZGl2aWRlICovCi0KKyNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBVc2UgY29tcGlsZXIgbmF0aXZlIDMyLWJpdCBkaXZpZGUgKi8KIAogI2Vsc2UKIAogLyogNjQtYml0IGludGVnZXJzICovCiAKLXR5cGVkZWYgdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaW50ZWdlcjsKK3R5cGVkZWYgdTY0IGFjcGlfaW50ZWdlcjsKICNkZWZpbmUgQUNQSV9JTlRFR0VSX01BWCAgICAgICAgICAgICAgICBBQ1BJX1VJTlQ2NF9NQVgKICNkZWZpbmUgQUNQSV9JTlRFR0VSX0JJVF9TSVpFICAgICAgICAgICA2NAotI2RlZmluZSBBQ1BJX01BWF9ERUNJTUFMX0RJR0lUUyAgICAgICAgIDIwICAvKiAyXjY0ID0gMTgsNDQ2LDc0NCwwNzMsNzA5LDU1MSw2MTYgKi8KLQorI2RlZmluZSBBQ1BJX01BWF9ERUNJTUFMX0RJR0lUUyAgICAgICAgIDIwCS8qIDJeNjQgPSAxOCw0NDYsNzQ0LDA3Myw3MDksNTUxLDYxNiAqLwogCiAjaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0Ci0jZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUgICAgICAgICAgLyogVXNlIGNvbXBpbGVyIG5hdGl2ZSA2NC1iaXQgZGl2aWRlICovCisjZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUJLyogVXNlIGNvbXBpbGVyIG5hdGl2ZSA2NC1iaXQgZGl2aWRlICovCiAjZW5kaWYKICNlbmRpZgogCkBAIC0zMzMsNyArMzI1LDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX1JPT1RfT0JKRUNUICAgICAgICAgICAgICAgIChhY3BpX2hhbmRsZSkgQUNQSV9QVFJfQUREIChjaGFyLCBOVUxMLCBBQ1BJX01BWF9QVFIpCiAKLQogLyoKICAqIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlCiAgKi8KQEAgLTQwMCw3ICszOTEsNyBAQAogLyoKICAqICBUYWJsZSB0eXBlcy4gIFRoZXNlIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSB0YWJsZSByZWxhdGVkIEFQSXMKICAqLwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV90YWJsZV90eXBlOwordHlwZWRlZiB1MzIgYWNwaV90YWJsZV90eXBlOwogCiAjZGVmaW5lIEFDUElfVEFCTEVfUlNEUCAgICAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgMAogI2RlZmluZSBBQ1BJX1RBQkxFX0RTRFQgICAgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDEKQEAgLTQyMSwyMiArNDEyLDIyIEBACiAgKiBOT1RFOiBUeXBlcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBnbG9iYWwgYWNwaV9uc19wcm9wZXJ0aWVzCiAgKiBhbmQgYWNwaV9uc190eXBlX25hbWVzIGFycmF5cy4KICAqLwotdHlwZWRlZiB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9vYmplY3RfdHlwZTsKK3R5cGVkZWYgdTMyIGFjcGlfb2JqZWN0X3R5cGU7CiAKICNkZWZpbmUgQUNQSV9UWVBFX0FOWSAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIEFDUElfVFlQRV9JTlRFR0VSICAgICAgICAgICAgICAgMHgwMSAgLyogQnl0ZS9Xb3JkL0R3b3JkL1plcm8vT25lL09uZXMgKi8KKyNkZWZpbmUgQUNQSV9UWVBFX0lOVEVHRVIgICAgICAgICAgICAgICAweDAxCS8qIEJ5dGUvV29yZC9Ed29yZC9aZXJvL09uZS9PbmVzICovCiAjZGVmaW5lIEFDUElfVFlQRV9TVFJJTkcgICAgICAgICAgICAgICAgMHgwMgogI2RlZmluZSBBQ1BJX1RZUEVfQlVGRkVSICAgICAgICAgICAgICAgIDB4MDMKLSNkZWZpbmUgQUNQSV9UWVBFX1BBQ0tBR0UgICAgICAgICAgICAgICAweDA0ICAvKiBieXRlX2NvbnN0LCBtdWx0aXBsZSBkYXRhX3Rlcm0vQ29uc3RhbnQvc3VwZXJfbmFtZSAqLworI2RlZmluZSBBQ1BJX1RZUEVfUEFDS0FHRSAgICAgICAgICAgICAgIDB4MDQJLyogYnl0ZV9jb25zdCwgbXVsdGlwbGUgZGF0YV90ZXJtL0NvbnN0YW50L3N1cGVyX25hbWUgKi8KICNkZWZpbmUgQUNQSV9UWVBFX0ZJRUxEX1VOSVQgICAgICAgICAgICAweDA1Ci0jZGVmaW5lIEFDUElfVFlQRV9ERVZJQ0UgICAgICAgICAgICAgICAgMHgwNiAgLyogTmFtZSwgbXVsdGlwbGUgTm9kZSAqLworI2RlZmluZSBBQ1BJX1RZUEVfREVWSUNFICAgICAgICAgICAgICAgIDB4MDYJLyogTmFtZSwgbXVsdGlwbGUgTm9kZSAqLwogI2RlZmluZSBBQ1BJX1RZUEVfRVZFTlQgICAgICAgICAgICAgICAgIDB4MDcKLSNkZWZpbmUgQUNQSV9UWVBFX01FVEhPRCAgICAgICAgICAgICAgICAweDA4ICAvKiBOYW1lLCBieXRlX2NvbnN0LCBtdWx0aXBsZSBDb2RlICovCisjZGVmaW5lIEFDUElfVFlQRV9NRVRIT0QgICAgICAgICAgICAgICAgMHgwOAkvKiBOYW1lLCBieXRlX2NvbnN0LCBtdWx0aXBsZSBDb2RlICovCiAjZGVmaW5lIEFDUElfVFlQRV9NVVRFWCAgICAgICAgICAgICAgICAgMHgwOQogI2RlZmluZSBBQ1BJX1RZUEVfUkVHSU9OICAgICAgICAgICAgICAgIDB4MEEKLSNkZWZpbmUgQUNQSV9UWVBFX1BPV0VSICAgICAgICAgICAgICAgICAweDBCICAvKiBOYW1lLGJ5dGVfY29uc3Qsd29yZF9jb25zdCxtdWx0aSBOb2RlICovCi0jZGVmaW5lIEFDUElfVFlQRV9QUk9DRVNTT1IgICAgICAgICAgICAgMHgwQyAgLyogTmFtZSxieXRlX2NvbnN0LER3b3JkX2NvbnN0LGJ5dGVfY29uc3QsbXVsdGkgbm1fbyAqLwotI2RlZmluZSBBQ1BJX1RZUEVfVEhFUk1BTCAgICAgICAgICAgICAgIDB4MEQgIC8qIE5hbWUsIG11bHRpcGxlIE5vZGUgKi8KKyNkZWZpbmUgQUNQSV9UWVBFX1BPV0VSICAgICAgICAgICAgICAgICAweDBCCS8qIE5hbWUsYnl0ZV9jb25zdCx3b3JkX2NvbnN0LG11bHRpIE5vZGUgKi8KKyNkZWZpbmUgQUNQSV9UWVBFX1BST0NFU1NPUiAgICAgICAgICAgICAweDBDCS8qIE5hbWUsYnl0ZV9jb25zdCxEd29yZF9jb25zdCxieXRlX2NvbnN0LG11bHRpIG5tX28gKi8KKyNkZWZpbmUgQUNQSV9UWVBFX1RIRVJNQUwgICAgICAgICAgICAgICAweDBECS8qIE5hbWUsIG11bHRpcGxlIE5vZGUgKi8KICNkZWZpbmUgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCAgICAgICAgICAweDBFCiAjZGVmaW5lIEFDUElfVFlQRV9EREJfSEFORExFICAgICAgICAgICAgMHgwRgogI2RlZmluZSBBQ1BJX1RZUEVfREVCVUdfT0JKRUNUICAgICAgICAgIDB4MTAKQEAgLTQ1MywxNiArNDQ0LDE2IEBACiAjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQgICAgMHgxMQogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCAgICAgIDB4MTIKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEICAgICAweDEzCi0jZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UgICAgICAgMHgxNCAgLyogQXJnIywgTG9jYWwjLCBOYW1lLCBEZWJ1ZywgcmVmX29mLCBJbmRleCAqLworI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFICAgICAgIDB4MTQJLyogQXJnIywgTG9jYWwjLCBOYW1lLCBEZWJ1ZywgcmVmX29mLCBJbmRleCAqLwogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMgICAgICAgICAgIDB4MTUKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUyAgICAweDE2CiAjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9OT1RJRlkgICAgICAgICAgMHgxNwogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfQUREUkVTU19IQU5ETEVSIDB4MTgKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX1JFU09VUkNFICAgICAgICAweDE5CiAjZGVmaW5lIEFDUElfVFlQRV9MT0NBTF9SRVNPVVJDRV9GSUVMRCAgMHgxQQotI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUgICAgICAgICAgIDB4MUIgIC8qIDEgTmFtZSwgbXVsdGlwbGUgb2JqZWN0X2xpc3QgTm9kZXMgKi8KKyNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFICAgICAgICAgICAweDFCCS8qIDEgTmFtZSwgbXVsdGlwbGUgb2JqZWN0X2xpc3QgTm9kZXMgKi8KIAotI2RlZmluZSBBQ1BJX1RZUEVfTlNfTk9ERV9NQVggICAgICAgICAgIDB4MUIgIC8qIExhc3QgdHlwZWNvZGUgdXNlZCB3aXRoaW4gYSBOUyBOb2RlICovCisjZGVmaW5lIEFDUElfVFlQRV9OU19OT0RFX01BWCAgICAgICAgICAgMHgxQgkvKiBMYXN0IHR5cGVjb2RlIHVzZWQgd2l0aGluIGEgTlMgTm9kZSAqLwogCiAvKgogICogVGhlc2UgYXJlIHNwZWNpYWwgb2JqZWN0IHR5cGVzIHRoYXQgbmV2ZXIgYXBwZWFyIGluCkBAIC01MDYsNyArNDk3LDcgQEAKICNkZWZpbmUgQUNQSV9CVFlQRV9EQVRBICAgICAgICAgICAgICAgICAoQUNQSV9CVFlQRV9DT01QVVRFX0RBVEEgIHwgQUNQSV9CVFlQRV9QQUNLQUdFKQogI2RlZmluZSBBQ1BJX0JUWVBFX0RBVEFfUkVGRVJFTkNFICAgICAgIChBQ1BJX0JUWVBFX0RBVEEgfCBBQ1BJX0JUWVBFX1JFRkVSRU5DRSB8IEFDUElfQlRZUEVfRERCX0hBTkRMRSkKICNkZWZpbmUgQUNQSV9CVFlQRV9ERVZJQ0VfT0JKRUNUUyAgICAgICAoQUNQSV9CVFlQRV9ERVZJQ0UgfCBBQ1BJX0JUWVBFX1RIRVJNQUwgfCBBQ1BJX0JUWVBFX1BST0NFU1NPUikKLSNkZWZpbmUgQUNQSV9CVFlQRV9PQkpFQ1RTX0FORF9SRUZTICAgICAweDAwMDFGRkZGICAvKiBBUkcgb3IgTE9DQUwgKi8KKyNkZWZpbmUgQUNQSV9CVFlQRV9PQkpFQ1RTX0FORF9SRUZTICAgICAweDAwMDFGRkZGCS8qIEFSRyBvciBMT0NBTCAqLwogI2RlZmluZSBBQ1BJX0JUWVBFX0FMTF9PQkpFQ1RTICAgICAgICAgIDB4MDAwMEZGRkYKIAogLyoKQEAgLTUxOSw3ICs1MTAsNyBAQAogLyoKICAqIEV2ZW50IFR5cGVzOiBGaXhlZCAmIEdlbmVyYWwgUHVycG9zZQogICovCi10eXBlZGVmIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2V2ZW50X3R5cGU7Cit0eXBlZGVmIHUzMiBhY3BpX2V2ZW50X3R5cGU7CiAKIC8qCiAgKiBGaXhlZCBldmVudHMKQEAgLTU0Nyw3ICs1MzgsNyBAQAogICogICAgICAgICAgfCAgICAgKy0tLS0tIFNldD8KICAqICAgICAgICAgICstLS0tLS0tLS0tLSA8UmVzZXJ2ZWQ+CiAgKi8KLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZXZlbnRfc3RhdHVzOwordHlwZWRlZiB1MzIgYWNwaV9ldmVudF9zdGF0dXM7CiAKICNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX0RJU0FCTEVEICAgICAgICAoYWNwaV9ldmVudF9zdGF0dXMpIDB4MDAKICNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX0VOQUJMRUQgICAgICAgICAoYWNwaV9ldmVudF9zdGF0dXMpIDB4MDEKQEAgLTU2NCw3ICs1NTUsNiBAQAogI2RlZmluZSBBQ1BJX0dQRV9FTkFCTEUgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9HUEVfRElTQUJMRSAgICAgICAgICAgICAgICAxCiAKLQogLyoKICAqIEdQRSBpbmZvIGZsYWdzIC0gUGVyIEdQRQogICogKy0rLSstKy0tLSstLS0rLSsKQEAgLTU4NSwyMiArNTc1LDIyIEBACiAjZGVmaW5lIEFDUElfR1BFX1RZUEVfTUFTSyAgICAgICAgICAgICAgKHU4KSAweDA2CiAjZGVmaW5lIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4gICAgICAgICAgKHU4KSAweDA2CiAjZGVmaW5lIEFDUElfR1BFX1RZUEVfV0FLRSAgICAgICAgICAgICAgKHU4KSAweDAyCi0jZGVmaW5lIEFDUElfR1BFX1RZUEVfUlVOVElNRSAgICAgICAgICAgKHU4KSAweDA0ICAgIC8qIERlZmF1bHQgKi8KKyNkZWZpbmUgQUNQSV9HUEVfVFlQRV9SVU5USU1FICAgICAgICAgICAodTgpIDB4MDQJLyogRGVmYXVsdCAqLwogCiAjZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX01BU0sgICAgICAgICAgKHU4KSAweDE4CiAjZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIgICAgICAgKHU4KSAweDA4CiAjZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCAgICAgICAgKHU4KSAweDEwCi0jZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX05PVF9VU0VEICAgICAgKHU4KSAweDAwICAgIC8qIERlZmF1bHQgKi8KKyNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfTk9UX1VTRUQgICAgICAodTgpIDB4MDAJLyogRGVmYXVsdCAqLwogCiAjZGVmaW5lIEFDUElfR1BFX1JVTl9FTkFCTEVfTUFTSyAgICAgICAgKHU4KSAweDIwCiAjZGVmaW5lIEFDUElfR1BFX1JVTl9FTkFCTEVEICAgICAgICAgICAgKHU4KSAweDIwCi0jZGVmaW5lIEFDUElfR1BFX1JVTl9ESVNBQkxFRCAgICAgICAgICAgKHU4KSAweDAwICAgIC8qIERlZmF1bHQgKi8KKyNkZWZpbmUgQUNQSV9HUEVfUlVOX0RJU0FCTEVEICAgICAgICAgICAodTgpIDB4MDAJLyogRGVmYXVsdCAqLwogCiAjZGVmaW5lIEFDUElfR1BFX1dBS0VfRU5BQkxFX01BU0sgICAgICAgKHU4KSAweDQwCiAjZGVmaW5lIEFDUElfR1BFX1dBS0VfRU5BQkxFRCAgICAgICAgICAgKHU4KSAweDQwCi0jZGVmaW5lIEFDUElfR1BFX1dBS0VfRElTQUJMRUQgICAgICAgICAgKHU4KSAweDAwICAgIC8qIERlZmF1bHQgKi8KKyNkZWZpbmUgQUNQSV9HUEVfV0FLRV9ESVNBQkxFRCAgICAgICAgICAodTgpIDB4MDAJLyogRGVmYXVsdCAqLwogCi0jZGVmaW5lIEFDUElfR1BFX0VOQUJMRV9NQVNLICAgICAgICAgICAgKHU4KSAweDYwICAgIC8qIEJvdGggcnVuL3dha2UgKi8KKyNkZWZpbmUgQUNQSV9HUEVfRU5BQkxFX01BU0sgICAgICAgICAgICAodTgpIDB4NjAJLyogQm90aCBydW4vd2FrZSAqLwogCiAjZGVmaW5lIEFDUElfR1BFX1NZU1RFTV9NQVNLICAgICAgICAgICAgKHU4KSAweDgwCiAjZGVmaW5lIEFDUElfR1BFX1NZU1RFTV9SVU5OSU5HICAgICAgICAgKHU4KSAweDgwCkBAIC02MDksMTMgKzU5OSwxMiBAQAogLyoKICAqIEZsYWdzIGZvciBHUEUgYW5kIExvY2sgaW50ZXJmYWNlcwogICovCi0jZGVmaW5lIEFDUElfRVZFTlRfV0FLRV9FTkFCTEUgICAgICAgICAgMHgyICAgICAgICAgICAgIC8qIGFjcGlfZ3BlX2VuYWJsZSAqLwotI2RlZmluZSBBQ1BJX0VWRU5UX1dBS0VfRElTQUJMRSAgICAgICAgIDB4MiAgICAgICAgICAgICAvKiBhY3BpX2dwZV9kaXNhYmxlICovCisjZGVmaW5lIEFDUElfRVZFTlRfV0FLRV9FTkFCTEUgICAgICAgICAgMHgyCS8qIGFjcGlfZ3BlX2VuYWJsZSAqLworI2RlZmluZSBBQ1BJX0VWRU5UX1dBS0VfRElTQUJMRSAgICAgICAgIDB4MgkvKiBhY3BpX2dwZV9kaXNhYmxlICovCiAKICNkZWZpbmUgQUNQSV9OT1RfSVNSICAgICAgICAgICAgICAgICAgICAweDEKICNkZWZpbmUgQUNQSV9JU1IgICAgICAgICAgICAgICAgICAgICAgICAweDAKIAotCiAvKiBOb3RpZnkgdHlwZXMgKi8KIAogI2RlZmluZSBBQ1BJX1NZU1RFTV9OT1RJRlkgICAgICAgICAgICAgIDB4MQpAQCAtNjI1LDEwICs2MTQsOSBAQAogCiAjZGVmaW5lIEFDUElfTUFYX1NZU19OT1RJRlkgICAgICAgICAgICAgMHg3ZgogCi0KIC8qIEFkZHJlc3MgU3BhY2UgKE9wZXJhdGlvbiBSZWdpb24pIFR5cGVzICovCiAKLXR5cGVkZWYgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfYWRyX3NwYWNlX3R5cGU7Cit0eXBlZGVmIHU4IGFjcGlfYWRyX3NwYWNlX3R5cGU7CiAKICNkZWZpbmUgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSAgICAoYWNwaV9hZHJfc3BhY2VfdHlwZSkgMAogI2RlZmluZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8gICAgICAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKSAxCkBAIC02NDAsNyArNjI4LDYgQEAKICNkZWZpbmUgQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRSAgICAgICAoYWNwaV9hZHJfc3BhY2VfdHlwZSkgNwogI2RlZmluZSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKSAxMjcKIAotCiAvKgogICogYml0X3JlZ2lzdGVyIElEcwogICogVGhlc2UgYXJlIGJpdGZpZWxkcyBkZWZpbmVkIHdpdGhpbiB0aGUgZnVsbCBBQ1BJIHJlZ2lzdGVycwpAQCAtNjc0LDc0ICs2NjEsNjIgQEAKICNkZWZpbmUgQUNQSV9CSVRSRUdfTUFYICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUKICNkZWZpbmUgQUNQSV9OVU1fQklUUkVHICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfQklUUkVHX01BWCArIDEKIAotCiAvKgogICogRXh0ZXJuYWwgQUNQSSBvYmplY3QgZGVmaW5pdGlvbgogICovCi11bmlvbiBhY3BpX29iamVjdAotewotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgICAgIHR5cGU7ICAgLyogU2VlIGRlZmluaXRpb24gb2YgYWNwaV9uc190eXBlIGZvciB2YWx1ZXMgKi8KLQlzdHJ1Y3QKLQl7Ci0JCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0JCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAgICAgIC8qIFRoZSBhY3R1YWwgbnVtYmVyICovCit1bmlvbiBhY3BpX29iamVjdCB7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOwkvKiBTZWUgZGVmaW5pdGlvbiBvZiBhY3BpX25zX3R5cGUgZm9yIHZhbHVlcyAqLworCXN0cnVjdCB7CisJCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwkJYWNwaV9pbnRlZ2VyIHZhbHVlOwkvKiBUaGUgYWN0dWFsIG51bWJlciAqLwogCX0gaW50ZWdlcjsKIAotCXN0cnVjdAotCXsKLQkJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgLyogIyBvZiBieXRlcyBpbiBzdHJpbmcsIGV4Y2x1ZGluZyB0cmFpbGluZyBudWxsICovCi0JCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyOyAgIC8qIHBvaW50cyB0byB0aGUgc3RyaW5nIHZhbHVlICovCisJc3RydWN0IHsKKwkJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCQl1MzIgbGVuZ3RoOwkvKiAjIG9mIGJ5dGVzIGluIHN0cmluZywgZXhjbHVkaW5nIHRyYWlsaW5nIG51bGwgKi8KKwkJY2hhciAqcG9pbnRlcjsJLyogcG9pbnRzIHRvIHRoZSBzdHJpbmcgdmFsdWUgKi8KIAl9IHN0cmluZzsKIAotCXN0cnVjdAotCXsKLQkJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOyAgICAgLyogIyBvZiBieXRlcyBpbiBidWZmZXIgKi8KLQkJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvaW50ZXI7ICAgLyogcG9pbnRzIHRvIHRoZSBidWZmZXIgKi8KKwlzdHJ1Y3QgeworCQlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJCXUzMiBsZW5ndGg7CS8qICMgb2YgYnl0ZXMgaW4gYnVmZmVyICovCisJCXU4ICpwb2ludGVyOwkvKiBwb2ludHMgdG8gdGhlIGJ1ZmZlciAqLwogCX0gYnVmZmVyOwogCi0Jc3RydWN0Ci0JewotCQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsMTsKLQkJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOyAgICAgLyogb2JqZWN0IHJlZmVyZW5jZSAqLworCXN0cnVjdCB7CisJCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwkJdTMyIGZpbGwxOworCQlhY3BpX2hhbmRsZSBoYW5kbGU7CS8qIG9iamVjdCByZWZlcmVuY2UgKi8KIAl9IHJlZmVyZW5jZTsKIAotCXN0cnVjdAotCXsKLQkJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7ICAgICAgLyogIyBvZiBlbGVtZW50cyBpbiBwYWNrYWdlICovCi0JCXVuaW9uIGFjcGlfb2JqZWN0ICAgICAgICAgICAgICAgICAgICplbGVtZW50czsgIC8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgQUNQSV9PQkpFQ1RzICovCisJc3RydWN0IHsKKwkJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCQl1MzIgY291bnQ7CS8qICMgb2YgZWxlbWVudHMgaW4gcGFja2FnZSAqLworCQl1bmlvbiBhY3BpX29iamVjdCAqZWxlbWVudHM7CS8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgQUNQSV9PQkpFQ1RzICovCiAJfSBwYWNrYWdlOwogCi0Jc3RydWN0Ci0JewotCQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2lkOwotCQlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICBwYmxrX2FkZHJlc3M7Ci0JCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBibGtfbGVuZ3RoOworCXN0cnVjdCB7CisJCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwkJdTMyIHByb2NfaWQ7CisJCWFjcGlfaW9fYWRkcmVzcyBwYmxrX2FkZHJlc3M7CisJCXUzMiBwYmxrX2xlbmd0aDsKIAl9IHByb2Nlc3NvcjsKIAotCXN0cnVjdAotCXsKLQkJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQkJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2xldmVsOwotCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9vcmRlcjsKKwlzdHJ1Y3QgeworCQlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJCXUzMiBzeXN0ZW1fbGV2ZWw7CisJCXUzMiByZXNvdXJjZV9vcmRlcjsKIAl9IHBvd2VyX3Jlc291cmNlOwogfTsKIAotCiAvKgogICogTGlzdCBvZiBvYmplY3RzLCB1c2VkIGFzIGEgcGFyYW1ldGVyIGxpc3QgZm9yIGNvbnRyb2wgbWV0aG9kIGV2YWx1YXRpb24KICAqLwotc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsKK3N0cnVjdCBhY3BpX29iamVjdF9saXN0IHsKKwl1MzIgY291bnQ7CisJdW5pb24gYWNwaV9vYmplY3QgKnBvaW50ZXI7CiB9OwogCi0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbW1vbiBEYXRhIFN0cnVjdHVyZXMgdXNlZCBieSB0aGUgaW50ZXJmYWNlcwogICovCkBAIC03NDksMTMgKzcyNCwxMSBAQAogI2RlZmluZSBBQ1BJX0FMTE9DQVRFX0JVRkZFUiAgICAgICAgKGFjcGlfc2l6ZSkgKC0xKQogI2RlZmluZSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUiAgKGFjcGlfc2l6ZSkgKC0yKQogCi1zdHJ1Y3QgYWNwaV9idWZmZXIKLXsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgKi8KLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsgICAgICAgLyogcG9pbnRlciB0byBidWZmZXIgKi8KK3N0cnVjdCBhY3BpX2J1ZmZlciB7CisJYWNwaV9zaXplIGxlbmd0aDsJLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgKi8KKwl2b2lkICpwb2ludGVyOwkJLyogcG9pbnRlciB0byBidWZmZXIgKi8KIH07CiAKLQogLyoKICAqIG5hbWVfdHlwZSBmb3IgYWNwaV9nZXRfbmFtZQogICovCkBAIC03NjMsNyArNzM2LDYgQEAKICNkZWZpbmUgQUNQSV9TSU5HTEVfTkFNRSAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEFDUElfTkFNRV9UWVBFX01BWCAgICAgICAgICAgICAgMQogCi0KIC8qCiAgKiBTdHJ1Y3R1cmUgYW5kIGZsYWdzIGZvciBhY3BpX2dldF9zeXN0ZW1faW5mbwogICovCkBAIC03NzIsMTM5ICs3NDQsMTA2IEBACiAjZGVmaW5lIEFDUElfU1lTX01PREVfTEVHQUNZICAgICAgICAgICAgMHgwMDAyCiAjZGVmaW5lIEFDUElfU1lTX01PREVTX01BU0sgICAgICAgICAgICAgMHgwMDAzCiAKLQogLyoKICAqIEFDUEkgVGFibGUgSW5mby4gIE9uZSBwZXIgQUNQSSB0YWJsZSBfdHlwZV8KICAqLwotc3RydWN0IGFjcGlfdGFibGVfaW5mbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oworc3RydWN0IGFjcGlfdGFibGVfaW5mbyB7CisJdTMyIGNvdW50OwogfTsKIAotCiAvKgogICogU3lzdGVtIGluZm8gcmV0dXJuZWQgYnkgYWNwaV9nZXRfc3lzdGVtX2luZm8oKQogICovCi1zdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY2FfdmVyc2lvbjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9yZXNvbHV0aW9uOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGV2ZWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbGF5ZXI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RhYmxlX3R5cGVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2luZm8gICAgICAgICAgICAgIHRhYmxlX2luZm8gW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK3N0cnVjdCBhY3BpX3N5c3RlbV9pbmZvIHsKKwl1MzIgYWNwaV9jYV92ZXJzaW9uOworCXUzMiBmbGFnczsKKwl1MzIgdGltZXJfcmVzb2x1dGlvbjsKKwl1MzIgcmVzZXJ2ZWQxOworCXUzMiByZXNlcnZlZDI7CisJdTMyIGRlYnVnX2xldmVsOworCXUzMiBkZWJ1Z19sYXllcjsKKwl1MzIgbnVtX3RhYmxlX3R5cGVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2luZm8gdGFibGVfaW5mb1tOVU1fQUNQSV9UQUJMRV9UWVBFU107CiB9OwogCi0KIC8qCiAgKiBUeXBlcyBzcGVjaWZpYyB0byB0aGUgT1Mgc2VydmljZSBpbnRlcmZhY2VzCiAgKi8KLXR5cGVkZWYgdTMyCi0oQUNQSV9TWVNURU1fWEZBQ0UgKmFjcGlfb3NkX2hhbmRsZXIpICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK3R5cGVkZWYgdTMyKEFDUElfU1lTVEVNX1hGQUNFICogYWNwaV9vc2RfaGFuZGxlcikgKHZvaWQgKmNvbnRleHQpOwogCiB0eXBlZGVmIHZvaWQKLShBQ1BJX1NZU1RFTV9YRkFDRSAqYWNwaV9vc2RfZXhlY19jYWxsYmFjaykgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworIChBQ1BJX1NZU1RFTV9YRkFDRSAqIGFjcGlfb3NkX2V4ZWNfY2FsbGJhY2spICh2b2lkICpjb250ZXh0KTsKIAogLyoKICAqIFZhcmlvdXMgaGFuZGxlcnMgYW5kIGNhbGxiYWNrIHByb2NlZHVyZXMKICAqLwotdHlwZWRlZgotdTMyICgqYWNwaV9ldmVudF9oYW5kbGVyKSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwordHlwZWRlZiB1MzIoKmFjcGlfZXZlbnRfaGFuZGxlcikgKHZvaWQgKmNvbnRleHQpOwogCiB0eXBlZGVmCi12b2lkICgqYWNwaV9ub3RpZnlfaGFuZGxlcikgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Cit2b2lkICgqYWNwaV9ub3RpZnlfaGFuZGxlcikgKGFjcGlfaGFuZGxlIGRldmljZSwgdTMyIHZhbHVlLCB2b2lkICpjb250ZXh0KTsKIAogdHlwZWRlZgotdm9pZCAoKmFjcGlfb2JqZWN0X2hhbmRsZXIpICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwordm9pZCAoKmFjcGlfb2JqZWN0X2hhbmRsZXIpIChhY3BpX2hhbmRsZSBvYmplY3QsIHUzMiBmdW5jdGlvbiwgdm9pZCAqZGF0YSk7CiAKLXR5cGVkZWYKLWFjcGlfc3RhdHVzICgqYWNwaV9pbml0X2hhbmRsZXIpICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pOwordHlwZWRlZiBhY3BpX3N0YXR1cygqYWNwaV9pbml0X2hhbmRsZXIpIChhY3BpX2hhbmRsZSBvYmplY3QsIHUzMiBmdW5jdGlvbik7CiAKICNkZWZpbmUgQUNQSV9JTklUX0RFVklDRV9JTkkgICAgICAgIDEKIAogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX2V4Y2VwdGlvbl9oYW5kbGVyKSAoCi0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBhbWxfc3RhdHVzLAotCWFjcGlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vZmZzZXQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KK2FjcGlfc3RhdHVzKCphY3BpX2V4Y2VwdGlvbl9oYW5kbGVyKSAoYWNwaV9zdGF0dXMgYW1sX3N0YXR1cywKKwkJCQkgICAgICBhY3BpX25hbWUgbmFtZSwKKwkJCQkgICAgICB1MTYgb3Bjb2RlLAorCQkJCSAgICAgIHUzMiBhbWxfb2Zmc2V0LCB2b2lkICpjb250ZXh0KTsKIAogLyogQWRkcmVzcyBTcGFjZXMgKEZvciBPcGVyYXRpb24gUmVnaW9ucykgKi8KIAogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX2Fkcl9zcGFjZV9oYW5kbGVyKSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCi0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICAgICAgYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfd2lkdGgsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2lvbl9jb250ZXh0KTsKK2FjcGlfc3RhdHVzKCphY3BpX2Fkcl9zcGFjZV9oYW5kbGVyKSAodTMyIGZ1bmN0aW9uLAorCQkJCSAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJCSAgICAgIHUzMiBiaXRfd2lkdGgsCisJCQkJICAgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LAorCQkJCSAgICAgIHZvaWQgKnJlZ2lvbl9jb250ZXh0KTsKIAogI2RlZmluZSBBQ1BJX0RFRkFVTFRfSEFORExFUiAgICAgICAgTlVMTAogCi0KIHR5cGVkZWYKLWFjcGlfc3RhdHVzICgqYWNwaV9hZHJfc3BhY2Vfc2V0dXApICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25faGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX2NvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZWdpb25fY29udGV4dCk7CithY3BpX3N0YXR1cygqYWNwaV9hZHJfc3BhY2Vfc2V0dXApIChhY3BpX2hhbmRsZSByZWdpb25faGFuZGxlLAorCQkJCSAgICB1MzIgZnVuY3Rpb24sCisJCQkJICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwKKwkJCQkgICAgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKIAogI2RlZmluZSBBQ1BJX1JFR0lPTl9BQ1RJVkFURSAgICAwCiAjZGVmaW5lIEFDUElfUkVHSU9OX0RFQUNUSVZBVEUgIDEKIAogdHlwZWRlZgotYWNwaV9zdGF0dXMgKCphY3BpX3dhbGtfY2FsbGJhY2spICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCithY3BpX3N0YXR1cygqYWNwaV93YWxrX2NhbGxiYWNrKSAoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCQkgIHUzMiBuZXN0aW5nX2xldmVsLAorCQkJCSAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKIC8qIEludGVycnVwdCBoYW5kbGVyIHJldHVybiB2YWx1ZXMgKi8KIAogI2RlZmluZSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCAgICAgIDB4MDAKICNkZWZpbmUgQUNQSV9JTlRFUlJVUFRfSEFORExFRCAgICAgICAgICAweDAxCiAKLQogLyogQ29tbW9uIHN0cmluZyB2ZXJzaW9uIG9mIGRldmljZSBISURzIGFuZCBVSURzICovCiAKLXN0cnVjdCBhY3BpX2RldmljZV9pZAotewotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbQUNQSV9ERVZJQ0VfSURfTEVOR1RIXTsKK3N0cnVjdCBhY3BpX2RldmljZV9pZCB7CisJY2hhciB2YWx1ZVtBQ1BJX0RFVklDRV9JRF9MRU5HVEhdOwogfTsKIAogLyogQ29tbW9uIHN0cmluZyB2ZXJzaW9uIG9mIGRldmljZSBDSURzICovCiAKLXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW0FDUElfTUFYX0NJRF9MRU5HVEhdOworc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCB7CisJY2hhciB2YWx1ZVtBQ1BJX01BWF9DSURfTEVOR1RIXTsKIH07CiAKLXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdAotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOwotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgICAgICAgaWRbMV07CitzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgeworCXUzMiBjb3VudDsKKwl1MzIgc2l6ZTsKKwlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkIGlkWzFdOwogfTsKIAotCiAvKiBTdHJ1Y3R1cmUgYW5kIGZsYWdzIGZvciBhY3BpX2dldF9vYmplY3RfaW5mbyAqLwogCiAjZGVmaW5lIEFDUElfVkFMSURfU1RBICAgICAgICAgICAgICAgICAgMHgwMDAxCkBAIC05MTQsNTUgKzg1Myw0NSBAQAogI2RlZmluZSBBQ1BJX1ZBTElEX0NJRCAgICAgICAgICAgICAgICAgIDB4MDAxMAogI2RlZmluZSBBQ1BJX1ZBTElEX1NYRFMgICAgICAgICAgICAgICAgIDB4MDAyMAogCi0KICNkZWZpbmUgQUNQSV9DT01NT05fT0JKX0lORk8gXAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgICAgIHR5cGU7ICAgICAgICAgICAvKiBBQ1BJIG9iamVjdCB0eXBlICovIFwKLQlhY3BpX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgLyogQUNQSSBvYmplY3QgTmFtZSAqLworCWFjcGlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUJLyogQUNQSSBvYmplY3QgTmFtZSAqLwogCi0KLXN0cnVjdCBhY3BpX29ial9pbmZvX2hlYWRlcgoteworc3RydWN0IGFjcGlfb2JqX2luZm9faGVhZGVyIHsKIAlBQ1BJX0NPTU1PTl9PQkpfSU5GTzsKIH07CiAKLQogLyogU3RydWN0dXJlIHJldHVybmVkIGZyb20gR2V0IE9iamVjdCBJbmZvICovCiAKLXN0cnVjdCBhY3BpX2RldmljZV9pbmZvCi17CitzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyB7CiAJQUNQSV9DT01NT05fT0JKX0lORk87CiAKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZDsgICAgICAgICAgICAgIC8qIEluZGljYXRlcyB3aGljaCBmaWVsZHMgYmVsb3cgYXJlIHZhbGlkICovCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zdGF0dXM7ICAgICAvKiBfU1RBIHZhbHVlICovCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsgICAgICAgICAgICAvKiBfQURSIHZhbHVlIGlmIGFueSAqLwotCXN0cnVjdCBhY3BpX2RldmljZV9pZCAgICAgICAgICAgICAgIGhhcmR3YXJlX2lkOyAgICAgICAgLyogX0hJRCB2YWx1ZSBpZiBhbnkgKi8KLQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgICAgICAgICAgICAgICB1bmlxdWVfaWQ7ICAgICAgICAgIC8qIF9VSUQgdmFsdWUgaWYgYW55ICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdF9kc3RhdGVzWzRdOyAvKiBfc3hfZCB2YWx1ZXM6IDB4RkYgaW5kaWNhdGVzIG5vdCB2YWxpZCAqLwotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAgICAgIGNvbXBhdGliaWxpdHlfaWQ7ICAgLyogTGlzdCBvZiBfQ0lEcyBpZiBhbnkgKi8KKwl1MzIgdmFsaWQ7CQkvKiBJbmRpY2F0ZXMgd2hpY2ggZmllbGRzIGJlbG93IGFyZSB2YWxpZCAqLworCXUzMiBjdXJyZW50X3N0YXR1czsJLyogX1NUQSB2YWx1ZSAqLworCWFjcGlfaW50ZWdlciBhZGRyZXNzOwkvKiBfQURSIHZhbHVlIGlmIGFueSAqLworCXN0cnVjdCBhY3BpX2RldmljZV9pZCBoYXJkd2FyZV9pZDsJLyogX0hJRCB2YWx1ZSBpZiBhbnkgKi8KKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgdW5pcXVlX2lkOwkvKiBfVUlEIHZhbHVlIGlmIGFueSAqLworCXU4IGhpZ2hlc3RfZHN0YXRlc1s0XTsJLyogX3N4X2QgdmFsdWVzOiAweEZGIGluZGljYXRlcyBub3QgdmFsaWQgKi8KKwlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgY29tcGF0aWJpbGl0eV9pZDsJLyogTGlzdCBvZiBfQ0lEcyBpZiBhbnkgKi8KIH07CiAKLQogLyogQ29udGV4dCBzdHJ1Y3RzIGZvciBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzICovCiAKLXN0cnVjdCBhY3BpX3BjaV9pZAotewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjsKK3N0cnVjdCBhY3BpX3BjaV9pZCB7CisJdTE2IHNlZ21lbnQ7CisJdTE2IGJ1czsKKwl1MTYgZGV2aWNlOworCXUxNiBmdW5jdGlvbjsKIH07CiAKLQotc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICAgICAgYWRkcmVzczsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgICAgICAgICAgICAgICBtYXBwZWRfcGh5c2ljYWxfYWRkcmVzczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWFwcGVkX2xvZ2ljYWxfYWRkcmVzczsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfbGVuZ3RoOworc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgeworCXUzMiBsZW5ndGg7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3M7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIG1hcHBlZF9waHlzaWNhbF9hZGRyZXNzOworCXU4ICptYXBwZWRfbG9naWNhbF9hZGRyZXNzOworCWFjcGlfc2l6ZSBtYXBwZWRfbGVuZ3RoOwogfTsKIAotCiAvKgogICogRGVmaW5pdGlvbnMgZm9yIFJlc291cmNlIEF0dHJpYnV0ZXMKICAqLwpAQCAtOTkyLDggKzkyMSw4IEBACiAvKgogICogIElPIFBvcnQgRGVzY3JpcHRvciBEZWNvZGUKICAqLwotI2RlZmluZSBBQ1BJX0RFQ09ERV8xMCAgICAgICAgICAgICAgICAgICh1OCkgMHgwMCAgICAvKiAxMC1iaXQgSU8gYWRkcmVzcyBkZWNvZGUgKi8KLSNkZWZpbmUgQUNQSV9ERUNPREVfMTYgICAgICAgICAgICAgICAgICAodTgpIDB4MDEgICAgLyogMTYtYml0IElPIGFkZHJlc3MgZGVjb2RlICovCisjZGVmaW5lIEFDUElfREVDT0RFXzEwICAgICAgICAgICAgICAgICAgKHU4KSAweDAwCS8qIDEwLWJpdCBJTyBhZGRyZXNzIGRlY29kZSAqLworI2RlZmluZSBBQ1BJX0RFQ09ERV8xNiAgICAgICAgICAgICAgICAgICh1OCkgMHgwMQkvKiAxNi1iaXQgSU8gYWRkcmVzcyBkZWNvZGUgKi8KIAogLyoKICAqICBJUlEgQXR0cmlidXRlcwpAQCAtMTA0NSwzMiArOTc0LDI4IEBACiAjZGVmaW5lIEFDUElfUFJPRFVDRVIgICAgICAgICAgICAgICAgICAgKHU4KSAweDAwCiAjZGVmaW5lIEFDUElfQ09OU1VNRVIgICAgICAgICAgICAgICAgICAgKHU4KSAweDAxCiAKLQogLyoKICAqICBTdHJ1Y3R1cmVzIHVzZWQgdG8gZGVzY3JpYmUgZGV2aWNlIHJlc291cmNlcwogICovCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2xldmVsOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9oaWdoX2xvdzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZXhjbHVzaXZlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9pbnRlcnJ1cHRzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHNbMV07CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgeworCXUzMiBlZGdlX2xldmVsOworCXUzMiBhY3RpdmVfaGlnaF9sb3c7CisJdTMyIHNoYXJlZF9leGNsdXNpdmU7CisJdTMyIG51bWJlcl9vZl9pbnRlcnJ1cHRzOworCXUzMiBpbnRlcnJ1cHRzWzFdOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfbWFzdGVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaGFubmVsczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsc1sxXTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSB7CisJdTMyIHR5cGU7CisJdTMyIGJ1c19tYXN0ZXI7CisJdTMyIHRyYW5zZmVyOworCXUzMiBudW1iZXJfb2ZfY2hhbm5lbHM7CisJdTMyIGNoYW5uZWxzWzFdOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eV9wcmlvcml0eTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZV9yb2J1c3RuZXNzOworc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmIHsKKwl1MzIgY29tcGF0aWJpbGl0eV9wcmlvcml0eTsKKwl1MzIgcGVyZm9ybWFuY2Vfcm9idXN0bmVzczsKIH07CiAKIC8qCkBAIC0xMDc4LDE1MCArMTAwMywxMjggQEAKICAqIG5lZWRlZCBiZWNhdXNlIGl0IGhhcyBubyBmaWVsZHMKICAqLwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbwotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX2RlY29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iYXNlX2FkZHJlc3M7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2lvIHsKKwl1MzIgaW9fZGVjb2RlOworCXUzMiBtaW5fYmFzZV9hZGRyZXNzOworCXUzMiBtYXhfYmFzZV9hZGRyZXNzOworCXUzMiBhbGlnbm1lbnQ7CisJdTMyIHJhbmdlX2xlbmd0aDsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvIHsKKwl1MzIgYmFzZV9hZGRyZXNzOworCXUzMiByYW5nZV9sZW5ndGg7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbMV07CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgeworCXUzMiBsZW5ndGg7CisJdTggcmVzZXJ2ZWRbMV07CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9lbmRfdGFnCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW07CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9lbmRfdGFnIHsKKwl1OCBjaGVja3N1bTsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0Ci17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2Jhc2VfYWRkcmVzczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGg7CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCB7CisJdTMyIHJlYWRfd3JpdGVfYXR0cmlidXRlOworCXUzMiBtaW5fYmFzZV9hZGRyZXNzOworCXUzMiBtYXhfYmFzZV9hZGRyZXNzOworCXUzMiBhbGlnbm1lbnQ7CisJdTMyIHJhbmdlX2xlbmd0aDsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2Jhc2VfYWRkcmVzczsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGg7CitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiB7CisJdTMyIHJlYWRfd3JpdGVfYXR0cmlidXRlOworCXUzMiBtaW5fYmFzZV9hZGRyZXNzOworCXUzMiBtYXhfYmFzZV9hZGRyZXNzOworCXUzMiBhbGlnbm1lbnQ7CisJdTMyIHJhbmdlX2xlbmd0aDsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyIHsKKwl1MzIgcmVhZF93cml0ZV9hdHRyaWJ1dGU7CisJdTMyIHJhbmdlX2Jhc2VfYWRkcmVzczsKKwl1MzIgcmFuZ2VfbGVuZ3RoOwogfTsKIAotc3RydWN0IGFjcGlfbWVtb3J5X2F0dHJpYnV0ZQotewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX2F0dHJpYnV0ZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZTsKK3N0cnVjdCBhY3BpX21lbW9yeV9hdHRyaWJ1dGUgeworCXUxNiBjYWNoZV9hdHRyaWJ1dGU7CisJdTE2IHJlYWRfd3JpdGVfYXR0cmlidXRlOwogfTsKIAotc3RydWN0IGFjcGlfaW9fYXR0cmlidXRlCi17Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfYXR0cmlidXRlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uX2F0dHJpYnV0ZTsKK3N0cnVjdCBhY3BpX2lvX2F0dHJpYnV0ZSB7CisJdTE2IHJhbmdlX2F0dHJpYnV0ZTsKKwl1MTYgdHJhbnNsYXRpb25fYXR0cmlidXRlOwogfTsKIAotc3RydWN0IGFjcGlfYnVzX2F0dHJpYnV0ZQotewotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7CitzdHJ1Y3QgYWNwaV9idXNfYXR0cmlidXRlIHsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiByZXNlcnZlZDI7CiB9OwogCi11bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZQotewotCXN0cnVjdCBhY3BpX21lbW9yeV9hdHRyaWJ1dGUgICAgICAgIG1lbW9yeTsKLQlzdHJ1Y3QgYWNwaV9pb19hdHRyaWJ1dGUgICAgICAgICAgICBpbzsKLQlzdHJ1Y3QgYWNwaV9idXNfYXR0cmlidXRlICAgICAgICAgICBidXM7Cit1bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZSB7CisJc3RydWN0IGFjcGlfbWVtb3J5X2F0dHJpYnV0ZSBtZW1vcnk7CisJc3RydWN0IGFjcGlfaW9fYXR0cmlidXRlIGlvOworCXN0cnVjdCBhY3BpX2J1c19hdHRyaWJ1dGUgYnVzOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nX3B0cjsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSB7CisJdTMyIGluZGV4OworCXUzMiBzdHJpbmdfbGVuZ3RoOworCWNoYXIgKnN0cmluZ19wdHI7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2NvbnN1bWVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19maXhlZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19maXhlZDsKKy8qIEZpZWxkcyBjb21tb24gdG8gYWxsIGFkZHJlc3MgZGVzY3JpcHRvcnMsIDE2LzMyLzY0IGJpdCAqLworCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfQUREUkVTU19DT01NT04gXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7IFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9jb25zdW1lcjsgXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTsgXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZGRyZXNzX2ZpeGVkOyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfZml4ZWQ7IFwKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZSAgICAgICBhdHRyaWJ1dGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfcmFuZ2U7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfcmFuZ2U7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19sZW5ndGg7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICAgICAgICAgcmVzb3VyY2Vfc291cmNlOworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzIHsKK0FDUElfUkVTT1VSQ0VfQUREUkVTU19DT01NT059OworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgeworCUFDUElfUkVTT1VSQ0VfQUREUkVTU19DT01NT04gdTMyIGdyYW51bGFyaXR5OworCXUzMiBtaW5fYWRkcmVzc19yYW5nZTsKKwl1MzIgbWF4X2FkZHJlc3NfcmFuZ2U7CisJdTMyIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0OworCXUzMiBhZGRyZXNzX2xlbmd0aDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgcmVzb3VyY2Vfc291cmNlOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9jb25zdW1lcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfZml4ZWQ7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfZml4ZWQ7Ci0JdW5pb24gYWNwaV9yZXNvdXJjZV9hdHRyaWJ1dGUgICAgICAgYXR0cmlidXRlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZGRyZXNzX3JhbmdlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hZGRyZXNzX3JhbmdlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAgICAgICAgIHJlc291cmNlX3NvdXJjZTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MzIgZ3JhbnVsYXJpdHk7CisJdTMyIG1pbl9hZGRyZXNzX3JhbmdlOworCXUzMiBtYXhfYWRkcmVzc19yYW5nZTsKKwl1MzIgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTMyIGFkZHJlc3NfbGVuZ3RoOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSByZXNvdXJjZV9zb3VyY2U7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2NvbnN1bWVyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19maXhlZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19maXhlZDsKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZSAgICAgICBhdHRyaWJ1dGU7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfcmFuZ2U7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfcmFuZ2U7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19sZW5ndGg7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAgICAgICAgIHJlc291cmNlX3NvdXJjZTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1NjQgZ3JhbnVsYXJpdHk7CisJdTY0IG1pbl9hZGRyZXNzX3JhbmdlOworCXU2NCBtYXhfYWRkcmVzc19yYW5nZTsKKwl1NjQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTY0IGFkZHJlc3NfbGVuZ3RoOworCXU2NCB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9jb25zdW1lcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2xldmVsOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9oaWdoX2xvdzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZXhjbHVzaXZlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9pbnRlcnJ1cHRzOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAgICAgICAgIHJlc291cmNlX3NvdXJjZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzWzFdOworc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSB7CisJdTMyIHByb2R1Y2VyX2NvbnN1bWVyOworCXUzMiBlZGdlX2xldmVsOworCXUzMiBhY3RpdmVfaGlnaF9sb3c7CisJdTMyIHNoYXJlZF9leGNsdXNpdmU7CisJdTMyIG51bWJlcl9vZl9pbnRlcnJ1cHRzOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSByZXNvdXJjZV9zb3VyY2U7CisJdTMyIGludGVycnVwdHNbMV07CiB9OwogCi0KIC8qIEFDUElfUkVTT1VSQ0VfVFlQRXMgKi8KIAogI2RlZmluZSBBQ1BJX1JTVFlQRV9JUlEgICAgICAgICAgICAgICAgIDAKQEAgLTEyNDAsMzUgKzExNDMsMzQgQEAKICNkZWZpbmUgQUNQSV9SU1RZUEVfQUREUkVTUzY0ICAgICAgICAgICAxMwogI2RlZmluZSBBQ1BJX1JTVFlQRV9FWFRfSVJRICAgICAgICAgICAgIDE0CiAKLXR5cGVkZWYgdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfcmVzb3VyY2VfdHlwZTsKK3R5cGVkZWYgdTMyIGFjcGlfcmVzb3VyY2VfdHlwZTsKIAotdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICAgICAgICAgICAgaXJxOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSAgICAgICAgICAgIGRtYTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgICAgICBzdGFydF9kcGY7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8gICAgICAgICAgICAgaW87Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gICAgICAgZml4ZWRfaW87Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICAgICAgICAgdmVuZG9yX3NwZWNpZmljOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2VuZF90YWcgICAgICAgIGVuZF90YWc7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgICAgICAgICAgbWVtb3J5MjQ7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIgICAgICAgICAgbWVtb3J5MzI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgICAgZml4ZWRfbWVtb3J5MzI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICAgICAgYWRkcmVzczE2OwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAgICAgIGFkZHJlc3MzMjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgICAgICBhZGRyZXNzNjQ7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAgICAgICAgZXh0ZW5kZWRfaXJxOwordW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhIHsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgaXJxOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSBkbWE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmIHN0YXJ0X2RwZjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyBpbzsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyBmaXhlZF9pbzsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgdmVuZG9yX3NwZWNpZmljOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2VuZF90YWcgZW5kX3RhZzsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCBtZW1vcnkyNDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiBtZW1vcnkzMjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMiBmaXhlZF9tZW1vcnkzMjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzIGFkZHJlc3M7CS8qIENvbW1vbiAxNi8zMi82NCBhZGRyZXNzIGZpZWxkcyAqLworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiBhZGRyZXNzMTY7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyIGFkZHJlc3MzMjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcmVzczY0OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgZXh0ZW5kZWRfaXJxOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2UKLXsKLQlhY3BpX3Jlc291cmNlX3R5cGUgICAgICAgICAgICAgICAgICBpZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAgICAgZGF0YTsKK3N0cnVjdCBhY3BpX3Jlc291cmNlIHsKKwlhY3BpX3Jlc291cmNlX3R5cGUgaWQ7CisJdTMyIGxlbmd0aDsKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgZGF0YTsKIH07CiAKICNkZWZpbmUgQUNQSV9SRVNPVVJDRV9MRU5HVEggICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9MRU5HVEhfTk9fREFUQSAgICAgICAgOCAgICAgICAvKiBJZCArIExlbmd0aCBmaWVsZHMgKi8KKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9MRU5HVEhfTk9fREFUQSAgICAgICAgOAkvKiBJZCArIExlbmd0aCBmaWVsZHMgKi8KIAogI2RlZmluZSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSh0eXBlKSAgICAgICAgICAoQUNQSV9SRVNPVVJDRV9MRU5HVEhfTk9fREFUQSArIHNpemVvZiAodHlwZSkpCiAKQEAgLTEyODQsMTkgKzExODYsMTYgQEAKICAqIEVORDogb2YgZGVmaW5pdGlvbnMgZm9yIFJlc291cmNlIEF0dHJpYnV0ZXMKICAqLwogCi0KLXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlCi17Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbjsKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOyAgICAgICAgLyogaGVyZSBmb3IgNjQtYml0IGFsaWdubWVudCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9pbmRleDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VbNF07ICAgICAgLyogcGFkIHRvIDY0IGJpdHMgc28gc2l6ZW9mKCkgd29ya3MgaW4gYWxsIGNhc2VzICovCitzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSB7CisJdTMyIGxlbmd0aDsKKwl1MzIgcGluOworCWFjcGlfaW50ZWdlciBhZGRyZXNzOwkvKiBoZXJlIGZvciA2NC1iaXQgYWxpZ25tZW50ICovCisJdTMyIHNvdXJjZV9pbmRleDsKKwljaGFyIHNvdXJjZVs0XTsJCS8qIHBhZCB0byA2NCBiaXRzIHNvIHNpemVvZigpIHdvcmtzIGluIGFsbCBjYXNlcyAqLwogfTsKIAogLyoKICAqIEVORDogb2YgZGVmaW5pdGlvbnMgZm9yIFBDSSBSb3V0aW5nIHRhYmxlcwogICovCiAKLQotI2VuZGlmIC8qIF9fQUNUWVBFU19IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaAppbmRleCAxOTJkMGJlLi5jMTA4NjQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKQEAgLTQ0LDIwICs0NCwxNyBAQAogI2lmbmRlZiBfQUNVVElMU19ICiAjZGVmaW5lIF9BQ1VUSUxTX0gKIAotCiB0eXBlZGVmCi1hY3BpX3N0YXR1cyAoKmFjcGlfcGtnX2NhbGxiYWNrKSAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9zdGF0dXMoKmFjcGlfcGtnX2NhbGxiYWNrKSAodTggb2JqZWN0X3R5cGUsCisJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LAorCQkJCSB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKiBzdGF0ZSwKKwkJCQkgdm9pZCAqY29udGV4dCk7CiAKLXN0cnVjdCBhY3BpX3BrZ19pbmZvCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJlZV9zcGFjZTsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zcGFjZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYWNrYWdlczsKK3N0cnVjdCBhY3BpX3BrZ19pbmZvIHsKKwl1OCAqZnJlZV9zcGFjZTsKKwlhY3BpX3NpemUgbGVuZ3RoOworCXUzMiBvYmplY3Rfc3BhY2U7CisJdTMyIG51bV9wYWNrYWdlczsKIH07CiAKICNkZWZpbmUgUkVGX0lOQ1JFTUVOVCAgICAgICAodTE2KSAwCkBAIC03MSwxNjcgKzY4LDg5IEBACiAjZGVmaW5lIERCX0RXT1JEX0RJU1BMQVkgICAgNAogI2RlZmluZSBEQl9RV09SRF9ESVNQTEFZICAgIDgKIAotCiAvKgogICogdXRnbG9iYWwgLSBHbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwcm9jZWR1cmVzCiAgKi8KLXZvaWQKLWFjcGlfdXRfaW5pdF9nbG9iYWxzICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV91dF9pbml0X2dsb2JhbHModm9pZCk7CiAKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCiAKLWNoYXIgKgotYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleF9pZCk7CitjaGFyICphY3BpX3V0X2dldF9tdXRleF9uYW1lKHUzMiBtdXRleF9pZCk7CiAKICNlbmRpZgogCi1jaGFyICoKLWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKK2NoYXIgKmFjcGlfdXRfZ2V0X3R5cGVfbmFtZShhY3BpX29iamVjdF90eXBlIHR5cGUpOwogCi1jaGFyICoKLWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KTsKK2NoYXIgKmFjcGlfdXRfZ2V0X25vZGVfbmFtZSh2b2lkICpvYmplY3QpOwogCi1jaGFyICoKLWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KTsKK2NoYXIgKmFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSh2b2lkICpvYmplY3QpOwogCi1jaGFyICoKLWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKK2NoYXIgKmFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCi1jaGFyICoKLWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX2lkKTsKK2NoYXIgKmFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHU4IHNwYWNlX2lkKTsKIAotY2hhciAqCi1hY3BpX3V0X2dldF9ldmVudF9uYW1lICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkKTsKK2NoYXIgKmFjcGlfdXRfZ2V0X2V2ZW50X25hbWUodTMyIGV2ZW50X2lkKTsKIAotY2hhcgotYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhciAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOworY2hhciBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKGFjcGlfaW50ZWdlciBpbnRlZ2VyLCB1MzIgcG9zaXRpb24pOwogCi11OAotYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAoCi0JYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKLQotYWNwaV9vd25lcl9pZAotYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZF90eXBlKTsKLQordTggYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZShhY3BpX29iamVjdF90eXBlIHR5cGUpOwogCiAvKgogICogdXRpbml0IC0gbWlzY2VsbGFuZW91cyBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7CithY3BpX3N0YXR1cyBhY3BpX3V0X2hhcmR3YXJlX2luaXRpYWxpemUodm9pZCk7CiAKLXZvaWQKLWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKLQl2b2lkKTsKK3ZvaWQgYWNwaV91dF9zdWJzeXN0ZW1fc2h1dGRvd24odm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3ZhbGlkYXRlX2ZhZHQgKAotCXZvaWQpOwotCithY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX2ZhZHQodm9pZCk7CiAKIC8qCiAgKiB1dGNsaWIgLSBMb2NhbCBpbXBsZW1lbnRhdGlvbnMgb2YgQyBsaWJyYXJ5IGZ1bmN0aW9ucwogICovCiAjaWZuZGVmIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQogCi1hY3BpX3NpemUKLWFjcGlfdXRfc3RybGVuICgKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcpOworYWNwaV9zaXplIGFjcGlfdXRfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZyk7CiAKLWNoYXIgKgotYWNwaV91dF9zdHJjcHkgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRzdF9zdHJpbmcsCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqc3JjX3N0cmluZyk7CitjaGFyICphY3BpX3V0X3N0cmNweShjaGFyICpkc3Rfc3RyaW5nLCBjb25zdCBjaGFyICpzcmNfc3RyaW5nKTsKIAotY2hhciAqCi1hY3BpX3V0X3N0cm5jcHkgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRzdF9zdHJpbmcsCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqc3JjX3N0cmluZywKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKK2NoYXIgKmFjcGlfdXRfc3RybmNweShjaGFyICpkc3Rfc3RyaW5nLAorCQkgICAgICBjb25zdCBjaGFyICpzcmNfc3RyaW5nLCBhY3BpX3NpemUgY291bnQpOwogCi1pbnQKLWFjcGlfdXRfbWVtY21wICgKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIxLAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcjIsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CitpbnQgYWNwaV91dF9tZW1jbXAoY29uc3QgY2hhciAqYnVmZmVyMSwgY29uc3QgY2hhciAqYnVmZmVyMiwgYWNwaV9zaXplIGNvdW50KTsKIAotaW50Ci1hY3BpX3V0X3N0cm5jbXAgKAotCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzEsCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nMiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKK2ludCBhY3BpX3V0X3N0cm5jbXAoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMiwgYWNwaV9zaXplIGNvdW50KTsKIAotaW50Ci1hY3BpX3V0X3N0cmNtcCAoCi0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nMSwKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcyKTsKK2ludCBhY3BpX3V0X3N0cmNtcChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyKTsKIAotY2hhciAqCi1hY3BpX3V0X3N0cmNhdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHN0X3N0cmluZywKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKK2NoYXIgKmFjcGlfdXRfc3RyY2F0KGNoYXIgKmRzdF9zdHJpbmcsIGNvbnN0IGNoYXIgKnNyY19zdHJpbmcpOwogCi1jaGFyICoKLWFjcGlfdXRfc3RybmNhdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHN0X3N0cmluZywKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworY2hhciAqYWNwaV91dF9zdHJuY2F0KGNoYXIgKmRzdF9zdHJpbmcsCisJCSAgICAgIGNvbnN0IGNoYXIgKnNyY19zdHJpbmcsIGFjcGlfc2l6ZSBjb3VudCk7CiAKLXUzMgotYWNwaV91dF9zdHJ0b3VsICgKLQljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnRlcm1pbmF0b3IsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKTsKK3UzMiBhY3BpX3V0X3N0cnRvdWwoY29uc3QgY2hhciAqc3RyaW5nLCBjaGFyICoqdGVybWluYXRvciwgdTMyIGJhc2UpOwogCi1jaGFyICoKLWFjcGlfdXRfc3Ryc3RyICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcxLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZzIpOworY2hhciAqYWNwaV91dF9zdHJzdHIoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMik7CiAKLXZvaWQgKgotYWNwaV91dF9tZW1jcHkgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QsCi0JY29uc3Qgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqc3JjLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOwordm9pZCAqYWNwaV91dF9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBhY3BpX3NpemUgY291bnQpOwogCi12b2lkICoKLWFjcGlfdXRfbWVtc2V0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0LAotCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgdmFsdWUsCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Cit2b2lkICphY3BpX3V0X21lbXNldCh2b2lkICpkZXN0LCBhY3BpX25hdGl2ZV91aW50IHZhbHVlLCBhY3BpX3NpemUgY291bnQpOwogCi1pbnQKLWFjcGlfdXRfdG9fdXBwZXIgKAotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7CitpbnQgYWNwaV91dF90b191cHBlcihpbnQgYyk7CiAKLWludAotYWNwaV91dF90b19sb3dlciAoCi0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKK2ludCBhY3BpX3V0X3RvX2xvd2VyKGludCBjKTsKIAogZXh0ZXJuIGNvbnN0IHU4IF9hY3BpX2N0eXBlW107CiAKLSNkZWZpbmUgX0FDUElfWEEgICAgIDB4MDAgICAgLyogZXh0cmEgYWxwaGFiZXRpYyAtIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgX0FDUElfWFMgICAgIDB4NDAgICAgLyogZXh0cmEgc3BhY2UgKi8KLSNkZWZpbmUgX0FDUElfQkIgICAgIDB4MDAgICAgLyogQkVMLCBCUywgZXRjLiAtIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgX0FDUElfQ04gICAgIDB4MjAgICAgLyogQ1IsIEZGLCBIVCwgTkwsIFZUICovCi0jZGVmaW5lIF9BQ1BJX0RJICAgICAweDA0ICAgIC8qICcwJy0nOScgKi8KLSNkZWZpbmUgX0FDUElfTE8gICAgIDB4MDIgICAgLyogJ2EnLSd6JyAqLwotI2RlZmluZSBfQUNQSV9QVSAgICAgMHgxMCAgICAvKiBwdW5jdHVhdGlvbiAqLwotI2RlZmluZSBfQUNQSV9TUCAgICAgMHgwOCAgICAvKiBzcGFjZSAqLwotI2RlZmluZSBfQUNQSV9VUCAgICAgMHgwMSAgICAvKiAnQSctJ1onICovCi0jZGVmaW5lIF9BQ1BJX1hEICAgICAweDgwICAgIC8qICcwJy0nOScsICdBJy0nRicsICdhJy0nZicgKi8KKyNkZWZpbmUgX0FDUElfWEEgICAgIDB4MDAJLyogZXh0cmEgYWxwaGFiZXRpYyAtIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgX0FDUElfWFMgICAgIDB4NDAJLyogZXh0cmEgc3BhY2UgKi8KKyNkZWZpbmUgX0FDUElfQkIgICAgIDB4MDAJLyogQkVMLCBCUywgZXRjLiAtIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgX0FDUElfQ04gICAgIDB4MjAJLyogQ1IsIEZGLCBIVCwgTkwsIFZUICovCisjZGVmaW5lIF9BQ1BJX0RJICAgICAweDA0CS8qICcwJy0nOScgKi8KKyNkZWZpbmUgX0FDUElfTE8gICAgIDB4MDIJLyogJ2EnLSd6JyAqLworI2RlZmluZSBfQUNQSV9QVSAgICAgMHgxMAkvKiBwdW5jdHVhdGlvbiAqLworI2RlZmluZSBfQUNQSV9TUCAgICAgMHgwOAkvKiBzcGFjZSAqLworI2RlZmluZSBfQUNQSV9VUCAgICAgMHgwMQkvKiAnQSctJ1onICovCisjZGVmaW5lIF9BQ1BJX1hEICAgICAweDgwCS8qICcwJy0nOScsICdBJy0nRicsICdhJy0nZicgKi8KIAogI2RlZmluZSBBQ1BJX0lTX0RJR0lUKGMpICAoX2FjcGlfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKGMpXSAmIChfQUNQSV9ESSkpCiAjZGVmaW5lIEFDUElfSVNfU1BBQ0UoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX1NQKSkKQEAgLTI0Miw1MDIgKzE2MSwzMjMgQEAKICNkZWZpbmUgQUNQSV9JU19BTFBIQShjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfTE8gfCBfQUNQSV9VUCkpCiAjZGVmaW5lIEFDUElfSVNfQVNDSUkoYykgICgoYykgPCAweDgwKQogCi0jZW5kaWYgLyogQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZICovCi0KKyNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KIAogLyoKICAqIHV0Y29weSAtIE9iamVjdCBjb25zdHJ1Y3Rpb24gYW5kIGNvbnZlcnNpb24gaW50ZXJmYWNlcwogICovCiBhY3BpX3N0YXR1cwotYWNwaV91dF9idWlsZF9zaW1wbGVfb2JqZWN0KAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICp1c2VyX29iaiwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NwYWNlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcl9zcGFjZV91c2VkKTsKK2FjcGlfdXRfYnVpbGRfc2ltcGxlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmosCisJCQkgICAgdW5pb24gYWNwaV9vYmplY3QgKnVzZXJfb2JqLAorCQkJICAgIHU4ICogZGF0YV9zcGFjZSwgdTMyICogYnVmZmVyX3NwYWNlX3VzZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9idWlsZF9wYWNrYWdlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcGFjZV91c2VkKTsKK2FjcGlfdXRfYnVpbGRfcGFja2FnZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqLAorCQkJICAgICB1OCAqIGJ1ZmZlciwgdTMyICogc3BhY2VfdXNlZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqcmV0X2J1ZmZlcik7CithY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCQlzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCAoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqb2JqLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKippbnRlcm5hbF9vYmopOworYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29iamVjdCAqb2JqLAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmopOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9faXNpbXBsZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaik7CithY3BpX3V0X2NvcHlfaXNpbXBsZV90b19pc2ltcGxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmosCisJCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmopOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYywKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQorYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGVzdF9kZXNjLAorCQkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiAvKgogICogdXRjcmVhdGUgLSBPYmplY3QgY3JlYXRpb24KICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbik7Ci0KK2FjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MTYgYWN0aW9uKTsKIAogLyoKICAqIHV0ZGVidWcgLSBEZWJ1ZyBpbnRlcmZhY2VzCiAgKi8KLXZvaWQKLWFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UgKAotCXZvaWQpOwordm9pZCBhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlKHZvaWQpOworCit2b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpOwogCiB2b2lkCi1hY3BpX3V0X3RyYWNrX3N0YWNrX3B0ciAoCi0Jdm9pZCk7CithY3BpX3V0X3RyYWNlKHUzMiBsaW5lX251bWJlciwKKwkgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCk7CiAKIHZvaWQKLWFjcGlfdXRfdHJhY2UgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8pOworYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHZvaWQgKnBvaW50ZXIpOwogCiB2b2lkCi1hY3BpX3V0X3RyYWNlX3B0ciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2ludGVyKTsKK2FjcGlfdXRfdHJhY2VfdTMyKHUzMiBsaW5lX251bWJlciwKKwkJICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB1MzIgaW50ZWdlcik7CiAKIHZvaWQKLWFjcGlfdXRfdHJhY2VfdTMyICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlcik7CithY3BpX3V0X3RyYWNlX3N0cih1MzIgbGluZV9udW1iZXIsCisJCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqc3RyaW5nKTsKIAogdm9pZAotYWNwaV91dF90cmFjZV9zdHIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nKTsKK2FjcGlfdXRfZXhpdCh1MzIgbGluZV9udW1iZXIsCisJICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCk7CiAKIHZvaWQKLWFjcGlfdXRfZXhpdCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbyk7CithY3BpX3V0X3N0YXR1c19leGl0KHUzMiBsaW5lX251bWJlciwKKwkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgYWNwaV9zdGF0dXMgc3RhdHVzKTsKIAogdm9pZAotYWNwaV91dF9zdGF0dXNfZXhpdCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19wcmludF9pbmZvICAgICpkYmdfaW5mbywKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CithY3BpX3V0X3ZhbHVlX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgYWNwaV9pbnRlZ2VyIHZhbHVlKTsKIAogdm9pZAotYWNwaV91dF92YWx1ZV9leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworYWNwaV91dF9wdHJfZXhpdCh1MzIgbGluZV9udW1iZXIsCisJCSBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHU4ICogcHRyKTsKKwordm9pZCBhY3BpX3V0X3JlcG9ydF9pbmZvKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpOworCit2b2lkIGFjcGlfdXRfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpOwogCiB2b2lkCi1hY3BpX3V0X3B0cl9leGl0ICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXN0cnVjdCBhY3BpX2RlYnVnX3ByaW50X2luZm8gICAgKmRiZ19pbmZvLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cik7CithY3BpX3V0X3JlcG9ydF93YXJuaW5nKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpOwogCi12b2lkCi1hY3BpX3V0X3JlcG9ydF9pbmZvICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKTsKLQotdm9pZAotYWNwaV91dF9yZXBvcnRfZXJyb3IgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpOwotCi12b2lkCi1hY3BpX3V0X3JlcG9ydF93YXJuaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGVfbmFtZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKTsKLQotdm9pZAotYWNwaV91dF9kdW1wX2J1ZmZlciAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkKTsKK3ZvaWQgYWNwaV91dF9kdW1wX2J1ZmZlcih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSwgdTMyIGNvbXBvbmVudF9pZCk7CiAKIHZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfZGVidWdfcHJpbnQgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLikgQUNQSV9QUklOVEZfTElLRV9GVU5DOworYWNwaV91dF9kZWJ1Z19wcmludCh1MzIgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAorCQkgICAgdTMyIGxpbmVfbnVtYmVyLAorCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgIGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqZm9ybWF0LCAuLi4pIEFDUElfUFJJTlRGX0xJS0VfRlVOQzsKIAogdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0Jc3RydWN0IGFjcGlfZGVidWdfcHJpbnRfaW5mbyAgICAqZGJnX2luZm8sCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9ybWF0LAotCS4uLikgQUNQSV9QUklOVEZfTElLRV9GVU5DOwotCithY3BpX3V0X2RlYnVnX3ByaW50X3Jhdyh1MzIgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAorCQkJdTMyIGxpbmVfbnVtYmVyLAorCQkJY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJCWNoYXIgKm1vZHVsZV9uYW1lLAorCQkJdTMyIGNvbXBvbmVudF9pZCwKKwkJCWNoYXIgKmZvcm1hdCwgLi4uKSBBQ1BJX1BSSU5URl9MSUtFX0ZVTkM7CiAKIC8qCiAgKiB1dGRlbGV0ZSAtIE9iamVjdCBkZWxldGlvbiBhbmQgcmVmZXJlbmNlIGNvdW50cwogICovCi12b2lkCi1hY3BpX3V0X2FkZF9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7Cit2b2lkIGFjcGlfdXRfYWRkX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCi12b2lkCi1hY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7Cit2b2lkIGFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9wYWNrYWdlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKK3ZvaWQgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfcGFja2FnZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKIAotdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfc2ltcGxlX29iamVjdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKK3ZvaWQgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfc2ltcGxlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9saXN0KTsKLQordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2xpc3QpOwogCiAvKgogICogdXRldmFsIC0gb2JqZWN0IGV2YWx1YXRpb24KICAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKK2FjcGlfc3RhdHVzIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnByZWZpeF9ub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXR1cm5fYnR5cGVzLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipyZXR1cm5fZGVzYyk7CithY3BpX3V0X2V2YWx1YXRlX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCQljaGFyICpwYXRoLAorCQkJdTMyIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0X25hbWUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqYWRkcmVzcyk7CithY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KGNoYXIgKm9iamVjdF9uYW1lLAorCQkJCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJCQlhY3BpX2ludGVnZXIgKiBhZGRyZXNzKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXhlY3V0ZV9ISUQgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmRldmljZV9ub2RlLAotCXN0cnVjdCBhY3BpX2RldmljZV9pZCAgICAgICAgICAgKmhpZCk7CithY3BpX3V0X2V4ZWN1dGVfSElEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJICAgIHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaGlkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXhlY3V0ZV9DSUQgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmRldmljZV9ub2RlLAotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqKnJldHVybl9jaWRfbGlzdCk7CithY3BpX3V0X2V4ZWN1dGVfQ0lEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJICAgIHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqKnJldHVybl9jaWRfbGlzdCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfU1RBICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpkZXZpY2Vfbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0dXNfZmxhZ3MpOworYWNwaV91dF9leGVjdXRlX1NUQShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICB1MzIgKiBzdGF0dXNfZmxhZ3MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1VJRCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkICAgICAgICAgICAqdWlkKTsKK2FjcGlfdXRfZXhlY3V0ZV9VSUQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAorCQkgICAgc3RydWN0IGFjcGlfZGV2aWNlX2lkICp1aWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX3N4ZHMgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKmRldmljZV9ub2RlLAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhpZ2hlc3QpOwotCithY3BpX3V0X2V4ZWN1dGVfc3hkcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsIHU4ICogaGlnaGVzdCk7CiAKIC8qCiAgKiB1dG9iamVjdCAtIGludGVybmFsIG9iamVjdCBjcmVhdGUvZGVsZXRlL2NhY2hlIHJvdXRpbmVzCiAgKi8KLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgKgotYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlX25hbWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUpOwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyhjaGFyICptb2R1bGVfbmFtZSwKKwkJCQkJCQkgICAgICB1MzIgbGluZV9udW1iZXIsCisJCQkJCQkJICAgICAgdTMyIGNvbXBvbmVudF9pZCwKKwkJCQkJCQkgICAgICBhY3BpX29iamVjdF90eXBlCisJCQkJCQkJICAgICAgdHlwZSk7CiAKLXZvaWQgKgotYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfaWQpOwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcoY2hhciAqbW9kdWxlX25hbWUsCisJCQkJICAgICAgIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7CiAKLSNkZWZpbmUgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KHQpIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKF9USElTX01PRFVMRSxfX0xJTkVfXyxfQ09NUE9ORU5ULHQpCi0jZGVmaW5lIGFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2MoKSAgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKF9USElTX01PRFVMRSxfX0xJTkVfXyxfQ09NUE9ORU5UKQorI2RlZmluZSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QodCkgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyAoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCx0KQorI2RlZmluZSBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjKCkgIGFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnIChfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXyxfQ09NUE9ORU5UKQogCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKK3ZvaWQgYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2ModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKIAotdTgKLWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0ICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOwordTggYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qodm9pZCAqb2JqZWN0KTsKIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqCi1hY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0ICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplKTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoYWNwaV9zaXplIGJ1ZmZlcl9zaXplKTsKIAotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqCi1hY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0ICgKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19zaXplKTsKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoYWNwaV9zaXplIHN0cmluZ19zaXplKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X29iamVjdF9zaXplKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKTsKLQorYWNwaV91dF9nZXRfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqLCBhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKIAogLyoKICAqIHV0c3RhdGUgLSBHZW5lcmljIHN0YXRlIGNyZWF0aW9uL2NhY2hlIHJvdXRpbmVzCiAgKi8KIHZvaWQKLWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlICgKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICoqbGlzdF9oZWFkLAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlKTsKK2FjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKmxpc3RfaGVhZCwKKwkJCSAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUpOwogCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKgotYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSAoCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqKmxpc3RfaGVhZCk7Cit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlCisJCQkJCQkgICAgKipsaXN0X2hlYWQpOwogCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUodm9pZCk7CiAKLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlICgKLQl2b2lkKTsKK3N0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlKHZvaWQpOwogCi1zdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKgotYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlICgKLQl2b2lkKTsKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKKwkJCQkJCSAgICAgICpvYmplY3QsIHUxNiBhY3Rpb24pOwogCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKgotYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pOwotCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKgotYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnRlcm5hbF9vYmplY3QsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZXJuYWxfb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUodm9pZCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCQkJICAgdm9pZCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCQkJICAgdTE2IGluZGV4KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipzdGF0ZV9saXN0KTsKK2FjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsCisJCQkJICAgICB1MTYgYWN0aW9uLAorCQkJCSAgICAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCk7CiAKICNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZV9hbmRfcHVzaCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVybmFsX29iamVjdCwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipzdGF0ZV9saXN0KTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkgIHUxNiBpbmRleCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKnN0YXRlX2xpc3QpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlICgKLQl2b2lkKTsKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfY29udHJvbF9zdGF0ZSh2b2lkKTsKIAotdm9pZAotYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSAoCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUpOwotCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlX2NhY2hlICgKLQl2b2lkKTsKLQotdm9pZAotYWNwaV91dF9kZWxldGVfb2JqZWN0X2NhY2hlICgKLQl2b2lkKTsKLSNlbmRpZgotCit2b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSk7CiAKIC8qCiAgKiB1dG1hdGgKICAqLwogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZGl2aWRlICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluX2RpdmlkZW5kLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aXNvciwKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICpvdXRfcXVvdGllbnQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3JlbWFpbmRlcik7CithY3BpX3V0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCisJICAgICAgIGFjcGlfaW50ZWdlciBpbl9kaXZpc29yLAorCSAgICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIGFjcGlfaW50ZWdlciAqIG91dF9yZW1haW5kZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9zaG9ydF9kaXZpZGUgKAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aWRlbmQsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yLAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKm91dF9xdW90aWVudCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfcmVtYWluZGVyKTsKK2FjcGlfdXRfc2hvcnRfZGl2aWRlKGFjcGlfaW50ZWdlciBpbl9kaXZpZGVuZCwKKwkJICAgICB1MzIgZGl2aXNvciwKKwkJICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIHUzMiAqIG91dF9yZW1haW5kZXIpOwogCiAvKgogICogdXRtaXNjCiAgKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCi0JYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworYWNwaV9zdGF0dXMgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOwogCi1jaGFyICoKLWFjcGlfdXRfc3RydXByICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKLQotdm9pZAotYWNwaV91dF9wcmludF9zdHJpbmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOwotCi11OAotYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0KLXU4Ci1hY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcmFjdGVyICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlcik7Cit2b2lkIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9zdHJ0b3VsNjQgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqcmV0X2ludGVnZXIpOworYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAorCQkJICB2b2lkICp0YXJnZXRfb2JqZWN0LAorCQkJICBhY3BpX3BrZ19jYWxsYmFjayB3YWxrX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KTsKKwordm9pZCBhY3BpX3V0X3N0cnVwcihjaGFyICpzcmNfc3RyaW5nKTsKKwordm9pZCBhY3BpX3V0X3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIHU4IG1heF9sZW5ndGgpOworCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh1MzIgbmFtZSk7CisKK3U4IGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyYWN0ZXIoY2hhciBjaGFyYWN0ZXIpOworCithY3BpX3N0YXR1cworYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLCB1MzIgYmFzZSwgYWNwaV9pbnRlZ2VyICogcmV0X2ludGVnZXIpOwogCiAvKiBWYWx1ZXMgZm9yIEJhc2UgYWJvdmUgKDE2PUhleCwgMTA9RGVjaW1hbCkgKi8KIAogI2RlZmluZSBBQ1BJX0FOWV9CQVNFICAgICAgICAwCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X211dGV4X2luaXRpYWxpemUgKAotCXZvaWQpOwordTggKmFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCi12b2lkCi1hY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Cit1OCBhY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtKHU4ICogYnVmZmVyLCB1MzIgbGVuZ3RoKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdXRfYWNxdWlyZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Cit1MzIgYWNwaV91dF9kd29yZF9ieXRlX3N3YXAodTMyIHZhbHVlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfdXRfcmVsZWFzZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Ci0KLXU4ICoKLWFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKLQotdTgKLWFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0gKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0KLXUzMgotYWNwaV91dF9kd29yZF9ieXRlX3N3YXAgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCi12b2lkCi1hY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uKTsKK3ZvaWQgYWNwaV91dF9zZXRfaW50ZWdlcl93aWR0aCh1OCByZXZpc2lvbik7CiAKICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogdm9pZAotYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpvYmpfaGFuZGxlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGgpOworYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUodTggdHlwZSwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpvYmpfaGFuZGxlLAorCQkJICAgICAgY2hhciAqcGF0aCk7CiAKICNlbmRpZgogCisvKgorICogdXRtdXRleCAtIG11dGV4IHN1cHBvcnQKKyAqLworYWNwaV9zdGF0dXMgYWNwaV91dF9tdXRleF9pbml0aWFsaXplKHZvaWQpOworCit2b2lkIGFjcGlfdXRfbXV0ZXhfdGVybWluYXRlKHZvaWQpOworCithY3BpX3N0YXR1cyBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpOworCithY3BpX3N0YXR1cyBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpOwogCiAvKgogICogdXRhbGxvYyAtIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBvYmplY3QgY2FjaGluZwogICovCi12b2lkICoKLWFjcGlfdXRfYWNxdWlyZV9mcm9tX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQpOworYWNwaV9zdGF0dXMgYWNwaV91dF9jcmVhdGVfY2FjaGVzKHZvaWQpOwogCi12b2lkCi1hY3BpX3V0X3JlbGVhc2VfdG9fY2FjaGUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QpOworYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfY2FjaGVzKHZvaWQpOwogCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi12b2lkCi1hY3BpX3V0X2RlbGV0ZV9nZW5lcmljX2NhY2hlICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQpOwotI2VuZGlmCithY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlciAoCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqYnVmZmVyKTsKK2FjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIsCisJCQkgIGFjcGlfc2l6ZSByZXF1aXJlZF9sZW5ndGgpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAoCi0Jc3RydWN0IGFjcGlfYnVmZmVyICAgICAgICAgICAgICAqYnVmZmVyLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfbGVuZ3RoKTsKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGUoYWNwaV9zaXplIHNpemUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwogCi12b2lkICoKLWFjcGlfdXRfYWxsb2NhdGUgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKLQotdm9pZCAqCi1hY3BpX3V0X2NhbGxvY2F0ZSAoCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwordm9pZCAqYWNwaV91dF9jYWxsb2NhdGUoYWNwaV9zaXplIHNpemUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwogCiAjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKLXZvaWQgKgotYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2sgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGVfYW5kX3RyYWNrKGFjcGlfc2l6ZSBzaXplLAorCQkJCSB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKIAotdm9pZCAqCi1hY3BpX3V0X2NhbGxvY2F0ZV9hbmRfdHJhY2sgKAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKK3ZvaWQgKmFjcGlfdXRfY2FsbG9jYXRlX2FuZF90cmFjayhhY3BpX3NpemUgc2l6ZSwKKwkJCQkgIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwogCiB2b2lkCi1hY3BpX3V0X2ZyZWVfYW5kX3RyYWNrICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICphZGRyZXNzLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworYWNwaV91dF9mcmVlX2FuZF90cmFjayh2b2lkICphZGRyZXNzLCB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKIAogI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvICgKLQl2b2lkKTsKLSNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwordm9pZCBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvKHZvaWQpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKLXZvaWQKLWFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlKTsKK3ZvaWQgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zKHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSk7CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9BQ1VUSUxTX0ggKi8KKyNlbmRpZgkJCQkvKiBfQUNVVElMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAppbmRleCA1NWU5N2VkLi43ZmRmNTI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAorKysgYi9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCkBAIC01OSwxNyArNTksMTcgQEAKICNkZWZpbmUgQU1MX1dPUkRfT1AgICAgICAgICAgICAgICAgICh1MTYpIDB4MGIKICNkZWZpbmUgQU1MX0RXT1JEX09QICAgICAgICAgICAgICAgICh1MTYpIDB4MGMKICNkZWZpbmUgQU1MX1NUUklOR19PUCAgICAgICAgICAgICAgICh1MTYpIDB4MGQKLSNkZWZpbmUgQU1MX1FXT1JEX09QICAgICAgICAgICAgICAgICh1MTYpIDB4MGUgICAgIC8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9RV09SRF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDBlCS8qIEFDUEkgMi4wICovCiAjZGVmaW5lIEFNTF9TQ09QRV9PUCAgICAgICAgICAgICAgICAodTE2KSAweDEwCiAjZGVmaW5lIEFNTF9CVUZGRVJfT1AgICAgICAgICAgICAgICAodTE2KSAweDExCiAjZGVmaW5lIEFNTF9QQUNLQUdFX09QICAgICAgICAgICAgICAodTE2KSAweDEyCi0jZGVmaW5lIEFNTF9WQVJfUEFDS0FHRV9PUCAgICAgICAgICAodTE2KSAweDEzICAgICAvKiBBQ1BJIDIuMCAqLworI2RlZmluZSBBTUxfVkFSX1BBQ0tBR0VfT1AgICAgICAgICAgKHUxNikgMHgxMwkvKiBBQ1BJIDIuMCAqLwogI2RlZmluZSBBTUxfTUVUSE9EX09QICAgICAgICAgICAgICAgKHUxNikgMHgxNAogI2RlZmluZSBBTUxfRFVBTF9OQU1FX1BSRUZJWCAgICAgICAgKHUxNikgMHgyZQogI2RlZmluZSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1AgICAgKHUxNikgMHgyZgogI2RlZmluZSBBTUxfTkFNRV9DSEFSX1NVQlNFUSAgICAgICAgKHUxNikgMHgzMAogI2RlZmluZSBBTUxfTkFNRV9DSEFSX0ZJUlNUICAgICAgICAgKHUxNikgMHg0MQotI2RlZmluZSBBTUxfT1BfUFJFRklYICAgICAgICAgICAgICAgKHUxNikgMHg1YgorI2RlZmluZSBBTUxfRVhURU5ERURfT1BfUFJFRklYICAgICAgKHUxNikgMHg1YgogI2RlZmluZSBBTUxfUk9PVF9QUkVGSVggICAgICAgICAgICAgKHUxNikgMHg1YwogI2RlZmluZSBBTUxfUEFSRU5UX1BSRUZJWCAgICAgICAgICAgKHUxNikgMHg1ZQogI2RlZmluZSBBTUxfTE9DQUxfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg2MApAQCAtMTA5LDggKzEwOSw4IEBACiAjZGVmaW5lIEFNTF9GSU5EX1NFVF9MRUZUX0JJVF9PUCAgICAodTE2KSAweDgxCiAjZGVmaW5lIEFNTF9GSU5EX1NFVF9SSUdIVF9CSVRfT1AgICAodTE2KSAweDgyCiAjZGVmaW5lIEFNTF9ERVJFRl9PRl9PUCAgICAgICAgICAgICAodTE2KSAweDgzCi0jZGVmaW5lIEFNTF9DT05DQVRfUkVTX09QICAgICAgICAgICAodTE2KSAweDg0ICAgICAvKiBBQ1BJIDIuMCAqLwotI2RlZmluZSBBTUxfTU9EX09QICAgICAgICAgICAgICAgICAgKHUxNikgMHg4NSAgICAgLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX0NPTkNBVF9SRVNfT1AgICAgICAgICAgICh1MTYpIDB4ODQJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX01PRF9PUCAgICAgICAgICAgICAgICAgICh1MTYpIDB4ODUJLyogQUNQSSAyLjAgKi8KICNkZWZpbmUgQU1MX05PVElGWV9PUCAgICAgICAgICAgICAgICh1MTYpIDB4ODYKICNkZWZpbmUgQU1MX1NJWkVfT0ZfT1AgICAgICAgICAgICAgICh1MTYpIDB4ODcKICNkZWZpbmUgQU1MX0lOREVYX09QICAgICAgICAgICAgICAgICh1MTYpIDB4ODgKQEAgLTEyMCwyMSArMTIwLDIxIEBACiAjZGVmaW5lIEFNTF9DUkVBVEVfQllURV9GSUVMRF9PUCAgICAodTE2KSAweDhjCiAjZGVmaW5lIEFNTF9DUkVBVEVfQklUX0ZJRUxEX09QICAgICAodTE2KSAweDhkCiAjZGVmaW5lIEFNTF9UWVBFX09QICAgICAgICAgICAgICAgICAodTE2KSAweDhlCi0jZGVmaW5lIEFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAodTE2KSAweDhmICAgICAvKiBBQ1BJIDIuMCAqLworI2RlZmluZSBBTUxfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QICAgKHUxNikgMHg4ZgkvKiBBQ1BJIDIuMCAqLwogI2RlZmluZSBBTUxfTEFORF9PUCAgICAgICAgICAgICAgICAgKHUxNikgMHg5MAogI2RlZmluZSBBTUxfTE9SX09QICAgICAgICAgICAgICAgICAgKHUxNikgMHg5MQogI2RlZmluZSBBTUxfTE5PVF9PUCAgICAgICAgICAgICAgICAgKHUxNikgMHg5MgogI2RlZmluZSBBTUxfTEVRVUFMX09QICAgICAgICAgICAgICAgKHUxNikgMHg5MwogI2RlZmluZSBBTUxfTEdSRUFURVJfT1AgICAgICAgICAgICAgKHUxNikgMHg5NAogI2RlZmluZSBBTUxfTExFU1NfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg5NQotI2RlZmluZSBBTUxfVE9fQlVGRkVSX09QICAgICAgICAgICAgKHUxNikgMHg5NiAgICAgLyogQUNQSSAyLjAgKi8KLSNkZWZpbmUgQU1MX1RPX0RFQ1NUUklOR19PUCAgICAgICAgICh1MTYpIDB4OTcgICAgIC8qIEFDUEkgMi4wICovCi0jZGVmaW5lIEFNTF9UT19IRVhTVFJJTkdfT1AgICAgICAgICAodTE2KSAweDk4ICAgICAvKiBBQ1BJIDIuMCAqLwotI2RlZmluZSBBTUxfVE9fSU5URUdFUl9PUCAgICAgICAgICAgKHUxNikgMHg5OSAgICAgLyogQUNQSSAyLjAgKi8KLSNkZWZpbmUgQU1MX1RPX1NUUklOR19PUCAgICAgICAgICAgICh1MTYpIDB4OWMgICAgIC8qIEFDUEkgMi4wICovCi0jZGVmaW5lIEFNTF9DT1BZX09QICAgICAgICAgICAgICAgICAodTE2KSAweDlkICAgICAvKiBBQ1BJIDIuMCAqLwotI2RlZmluZSBBTUxfTUlEX09QICAgICAgICAgICAgICAgICAgKHUxNikgMHg5ZSAgICAgLyogQUNQSSAyLjAgKi8KLSNkZWZpbmUgQU1MX0NPTlRJTlVFX09QICAgICAgICAgICAgICh1MTYpIDB4OWYgICAgIC8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9UT19CVUZGRVJfT1AgICAgICAgICAgICAodTE2KSAweDk2CS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9UT19ERUNTVFJJTkdfT1AgICAgICAgICAodTE2KSAweDk3CS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9UT19IRVhTVFJJTkdfT1AgICAgICAgICAodTE2KSAweDk4CS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9UT19JTlRFR0VSX09QICAgICAgICAgICAodTE2KSAweDk5CS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9UT19TVFJJTkdfT1AgICAgICAgICAgICAodTE2KSAweDljCS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9DT1BZX09QICAgICAgICAgICAgICAgICAodTE2KSAweDlkCS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9NSURfT1AgICAgICAgICAgICAgICAgICAodTE2KSAweDllCS8qIEFDUEkgMi4wICovCisjZGVmaW5lIEFNTF9DT05USU5VRV9PUCAgICAgICAgICAgICAodTE2KSAweDlmCS8qIEFDUEkgMi4wICovCiAjZGVmaW5lIEFNTF9JRl9PUCAgICAgICAgICAgICAgICAgICAodTE2KSAweGEwCiAjZGVmaW5lIEFNTF9FTFNFX09QICAgICAgICAgICAgICAgICAodTE2KSAweGExCiAjZGVmaW5lIEFNTF9XSElMRV9PUCAgICAgICAgICAgICAgICAodTE2KSAweGEyCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogLyogcHJlZml4ZWQgb3Bjb2RlcyAqLwogCi0jZGVmaW5lIEFNTF9FWFRPUCAgICAgICAgICAgICAgICAgICAodTE2KSAweDAwNWIgICAgIC8qIHByZWZpeCBmb3IgMi1ieXRlIG9wY29kZXMgKi8KKyNkZWZpbmUgQU1MX0VYVEVOREVEX09QQ09ERSAgICAgICAgICh1MTYpIDB4NWIwMAkvKiBwcmVmaXggZm9yIDItYnl0ZSBvcGNvZGVzICovCiAKICNkZWZpbmUgQU1MX01VVEVYX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIwMQogI2RlZmluZSBBTUxfRVZFTlRfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjAyCkBAIC0xNTQsNyArMTU0LDcgQEAKICNkZWZpbmUgQU1MX1NISUZUX0xFRlRfQklUX09QICAgICAgICh1MTYpIDB4NWIxMQogI2RlZmluZSBBTUxfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgKHUxNikgMHg1YjEyCiAjZGVmaW5lIEFNTF9DUkVBVEVfRklFTERfT1AgICAgICAgICAodTE2KSAweDViMTMKLSNkZWZpbmUgQU1MX0xPQURfVEFCTEVfT1AgICAgICAgICAgICh1MTYpIDB4NWIxZiAgICAgLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQU1MX0xPQURfVEFCTEVfT1AgICAgICAgICAgICh1MTYpIDB4NWIxZgkvKiBBQ1BJIDIuMCAqLwogI2RlZmluZSBBTUxfTE9BRF9PUCAgICAgICAgICAgICAgICAgKHUxNikgMHg1YjIwCiAjZGVmaW5lIEFNTF9TVEFMTF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMjEKICNkZWZpbmUgQU1MX1NMRUVQX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIyMgpAQCAtMTY5LDcgKzE2OSw3IEBACiAjZGVmaW5lIEFNTF9SRVZJU0lPTl9PUCAgICAgICAgICAgICAodTE2KSAweDViMzAKICNkZWZpbmUgQU1MX0RFQlVHX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIzMQogI2RlZmluZSBBTUxfRkFUQUxfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjMyCi0jZGVmaW5lIEFNTF9USU1FUl9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMzMgICAgIC8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFNTF9USU1FUl9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMzMJLyogQUNQSSAzLjAgKi8KICNkZWZpbmUgQU1MX1JFR0lPTl9PUCAgICAgICAgICAgICAgICh1MTYpIDB4NWI4MAogI2RlZmluZSBBTUxfRklFTERfT1AgICAgICAgICAgICAgICAgKHUxNikgMHg1YjgxCiAjZGVmaW5lIEFNTF9ERVZJQ0VfT1AgICAgICAgICAgICAgICAodTE2KSAweDViODIKQEAgLTE3OCw4ICsxNzgsNyBAQAogI2RlZmluZSBBTUxfVEhFUk1BTF9aT05FX09QICAgICAgICAgKHUxNikgMHg1Yjg1CiAjZGVmaW5lIEFNTF9JTkRFWF9GSUVMRF9PUCAgICAgICAgICAodTE2KSAweDViODYKICNkZWZpbmUgQU1MX0JBTktfRklFTERfT1AgICAgICAgICAgICh1MTYpIDB4NWI4NwotI2RlZmluZSBBTUxfREFUQV9SRUdJT05fT1AgICAgICAgICAgKHUxNikgMHg1Yjg4ICAgICAvKiBBQ1BJIDIuMCAqLwotCisjZGVmaW5lIEFNTF9EQVRBX1JFR0lPTl9PUCAgICAgICAgICAodTE2KSAweDViODgJLyogQUNQSSAyLjAgKi8KIAogLyogQm9ndXMgb3Bjb2RlcyAodGhleSBhcmUgYWN0dWFsbHkgdHdvIHNlcGFyYXRlIG9wY29kZXMpICovCiAKQEAgLTE4Nyw3ICsxODYsNiBAQAogI2RlZmluZSBBTUxfTExFU1NFUVVBTF9PUCAgICAgICAgICAgKHUxNikgMHg5Mjk0CiAjZGVmaW5lIEFNTF9MTk9URVFVQUxfT1AgICAgICAgICAgICAodTE2KSAweDkyOTMKIAotCiAvKgogICogSW50ZXJuYWwgb3Bjb2RlcwogICogVXNlIG9ubHkgIlVua25vd24iIEFNTCBvcGNvZGVzLCBkb24ndCBhdHRlbXB0IHRvIHVzZQpAQCAtMjAzLDcgKzIwMSw2IEBACiAjZGVmaW5lIEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QICAgICAodTE2KSAweDAwMzYKICNkZWZpbmUgQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1AgICAgICh1MTYpIDB4MDAzNwogCi0KICNkZWZpbmUgQVJHX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MAogCiAvKgpAQCAtMjQ1LDcgKzI0Miw3IEBACiAKIC8qIFNpbmdsZSwgc2ltcGxlIHR5cGVzICovCiAKLSNkZWZpbmUgQVJHSV9BTllUWVBFICAgICAgICAgICAgICAgIDB4MDEgICAgLyogRG9uJ3QgY2FyZSAqLworI2RlZmluZSBBUkdJX0FOWVRZUEUgICAgICAgICAgICAgICAgMHgwMQkvKiBEb24ndCBjYXJlICovCiAjZGVmaW5lIEFSR0lfUEFDS0FHRSAgICAgICAgICAgICAgICAweDAyCiAjZGVmaW5lIEFSR0lfRVZFTlQgICAgICAgICAgICAgICAgICAweDAzCiAjZGVmaW5lIEFSR0lfTVVURVggICAgICAgICAgICAgICAgICAweDA0CkBAIC0yNTYsOCArMjUzLDggQEAKICNkZWZpbmUgQVJHSV9JTlRFR0VSICAgICAgICAgICAgICAgIDB4MDYKICNkZWZpbmUgQVJHSV9TVFJJTkcgICAgICAgICAgICAgICAgIDB4MDcKICNkZWZpbmUgQVJHSV9CVUZGRVIgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgQVJHSV9CVUZGRVJfT1JfU1RSSU5HICAgICAgIDB4MDkgICAgLyogVXNlZCBieSBNSUQgb3Agb25seSAqLwotI2RlZmluZSBBUkdJX0NPTVBVVEVEQVRBICAgICAgICAgICAgMHgwQSAgICAvKiBCdWZmZXIsIFN0cmluZywgb3IgSW50ZWdlciAqLworI2RlZmluZSBBUkdJX0JVRkZFUl9PUl9TVFJJTkcgICAgICAgMHgwOQkvKiBVc2VkIGJ5IE1JRCBvcCBvbmx5ICovCisjZGVmaW5lIEFSR0lfQ09NUFVURURBVEEgICAgICAgICAgICAweDBBCS8qIEJ1ZmZlciwgU3RyaW5nLCBvciBJbnRlZ2VyICovCiAKIC8qIFJlZmVyZW5jZSBvYmplY3RzICovCiAKQEAgLTI2NSwzMCArMjYyLDI4IEBACiAjZGVmaW5lIEFSR0lfT0JKRUNUX1JFRiAgICAgICAgICAgICAweDBDCiAjZGVmaW5lIEFSR0lfREVWSUNFX1JFRiAgICAgICAgICAgICAweDBECiAjZGVmaW5lIEFSR0lfUkVGRVJFTkNFICAgICAgICAgICAgICAweDBFCi0jZGVmaW5lIEFSR0lfVEFSR0VUUkVGICAgICAgICAgICAgICAweDBGICAgIC8qIFRhcmdldCwgc3ViamVjdCB0byBpbXBsaWNpdCBjb252ZXJzaW9uICovCi0jZGVmaW5lIEFSR0lfRklYRURfVEFSR0VUICAgICAgICAgICAweDEwICAgIC8qIFRhcmdldCwgbm8gaW1wbGljaXQgY29udmVyc2lvbiAqLwotI2RlZmluZSBBUkdJX1NJTVBMRV9UQVJHRVQgICAgICAgICAgMHgxMSAgICAvKiBOYW1lLCBMb2NhbCwgQXJnIC0tIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQVJHSV9UQVJHRVRSRUYgICAgICAgICAgICAgIDB4MEYJLyogVGFyZ2V0LCBzdWJqZWN0IHRvIGltcGxpY2l0IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQVJHSV9GSVhFRF9UQVJHRVQgICAgICAgICAgIDB4MTAJLyogVGFyZ2V0LCBubyBpbXBsaWNpdCBjb252ZXJzaW9uICovCisjZGVmaW5lIEFSR0lfU0lNUExFX1RBUkdFVCAgICAgICAgICAweDExCS8qIE5hbWUsIExvY2FsLCBBcmcgLS0gbm8gaW1wbGljaXQgY29udmVyc2lvbiAqLwogCiAvKiBNdWx0aXBsZS9jb21wbGV4IHR5cGVzICovCiAKLSNkZWZpbmUgQVJHSV9EQVRBT0JKRUNUICAgICAgICAgICAgIDB4MTIgICAgLyogQnVmZmVyLCBTdHJpbmcsIHBhY2thZ2Ugb3IgcmVmZXJlbmNlIHRvIGEgTm9kZSAtIFVzZWQgb25seSBieSBzaXplX29mIG9wZXJhdG9yKi8KLSNkZWZpbmUgQVJHSV9DT01QTEVYT0JKICAgICAgICAgICAgIDB4MTMgICAgLyogQnVmZmVyLCBTdHJpbmcsIG9yIHBhY2thZ2UgKFVzZWQgYnkgSU5ERVggb3Agb25seSkgKi8KLSNkZWZpbmUgQVJHSV9SRUZfT1JfU1RSSU5HICAgICAgICAgIDB4MTQgICAgLyogUmVmZXJlbmNlIG9yIFN0cmluZyAoVXNlZCBieSBERVJFRk9GIG9wIG9ubHkpICovCi0jZGVmaW5lIEFSR0lfUkVHSU9OX09SX0ZJRUxEICAgICAgICAweDE1ICAgIC8qIFVzZWQgYnkgTE9BRCBvcCBvbmx5ICovCisjZGVmaW5lIEFSR0lfREFUQU9CSkVDVCAgICAgICAgICAgICAweDEyCS8qIEJ1ZmZlciwgU3RyaW5nLCBwYWNrYWdlIG9yIHJlZmVyZW5jZSB0byBhIE5vZGUgLSBVc2VkIG9ubHkgYnkgc2l6ZV9vZiBvcGVyYXRvciAqLworI2RlZmluZSBBUkdJX0NPTVBMRVhPQkogICAgICAgICAgICAgMHgxMwkvKiBCdWZmZXIsIFN0cmluZywgb3IgcGFja2FnZSAoVXNlZCBieSBJTkRFWCBvcCBvbmx5KSAqLworI2RlZmluZSBBUkdJX1JFRl9PUl9TVFJJTkcgICAgICAgICAgMHgxNAkvKiBSZWZlcmVuY2Ugb3IgU3RyaW5nIChVc2VkIGJ5IERFUkVGT0Ygb3Agb25seSkgKi8KKyNkZWZpbmUgQVJHSV9SRUdJT05fT1JfRklFTEQgICAgICAgIDB4MTUJLyogVXNlZCBieSBMT0FEIG9wIG9ubHkgKi8KICNkZWZpbmUgQVJHSV9EQVRBUkVGT0JKICAgICAgICAgICAgIDB4MTYKIAogLyogTm90ZTogdHlwZXMgYWJvdmUgY2FuIGV4cGFuZCB0byAweDFGIG1heGltdW0gKi8KIAogI2RlZmluZSBBUkdJX0lOVkFMSURfT1BDT0RFICAgICAgICAgMHhGRkZGRkZGRgogCi0KIC8qCiAgKiBoYXNoIG9mZnNldHMKICAqLwogI2RlZmluZSBBTUxfRVhUT1BfSEFTSF9PRkZTRVQgICAgICAgMjIKICNkZWZpbmUgQU1MX0xOT1RfSEFTSF9PRkZTRVQgICAgICAgIDE5CiAKLQogLyoKICAqIG9wY29kZSBncm91cHMgYW5kIHR5cGVzCiAgKi8KQEAgLTI5Niw3ICsyOTEsNiBAQAogI2RlZmluZSBPUEdSUF9GSUVMRCAgICAgICAgICAgICAgICAgMHgwMgogI2RlZmluZSBPUEdSUF9CWVRFTElTVCAgICAgICAgICAgICAgMHgwNAogCi0KIC8qCiAgKiBPcGNvZGUgaW5mb3JtYXRpb24KICAqLwpAQCAtMzIyLDMxICszMTYsMzAgQEAKIC8qIENvbnZlbmllbnQgZmxhZyBncm91cGluZ3MgKi8KIAogI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18wQV8wVF8xUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUxfSEFTX1JFVFZBTAotI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiAgICAgQU1MX0hBU19BUkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25hZGljMSAgKi8KLSNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIgICAgIEFNTF9IQVNfQVJHUyB8ICAgICAgICAgICAgICAgICAgQU1MX0hBU19SRVRWQUwgLyogTW9uYWRpYzIgICovCisjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSICAgICBBTUxfSEFTX0FSR1MJLyogTW9uYWRpYzEgICovCisjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSICAgICBBTUxfSEFTX0FSR1MgfCAgICAgICAgICAgICAgICAgIEFNTF9IQVNfUkVUVkFMCS8qIE1vbmFkaWMyICAqLwogI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8wUiAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19UQVJHRVQKLSNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9IQVNfVEFSR0VUIHwgQU1MX0hBU19SRVRWQUwgLyogbW9uYWRpYzJfciAqLwotI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8wUiAgICAgQU1MX0hBU19BUkdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEeWFkaWMxICAgKi8KLSNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgICAgIEFNTF9IQVNfQVJHUyB8ICAgICAgICAgICAgICAgICAgQU1MX0hBU19SRVRWQUwgLyogRHlhZGljMiAgICovCi0jZGVmaW5lIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfSEFTX1RBUkdFVCB8IEFNTF9IQVNfUkVUVkFMIC8qIGR5YWRpYzJfciAgKi8KKyNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9IQVNfVEFSR0VUIHwgQU1MX0hBU19SRVRWQUwJLyogbW9uYWRpYzJfciAqLworI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8wUiAgICAgQU1MX0hBU19BUkdTCS8qIER5YWRpYzEgICAqLworI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgICAgICAgICAgICAgICAgICBBTUxfSEFTX1JFVFZBTAkvKiBEeWFkaWMyICAgKi8KKyNkZWZpbmUgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgICAgIEFNTF9IQVNfQVJHUyB8IEFNTF9IQVNfVEFSR0VUIHwgQU1MX0hBU19SRVRWQUwJLyogZHlhZGljMl9yICAqLwogI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18yQV8yVF8xUiAgICAgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19UQVJHRVQgfCBBTUxfSEFTX1JFVFZBTAogI2RlZmluZSBBTUxfRkxBR1NfRVhFQ18zQV8wVF8wUiAgICAgQU1MX0hBU19BUkdTCiAjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzNBXzFUXzFSICAgICBBTUxfSEFTX0FSR1MgfCBBTUxfSEFTX1RBUkdFVCB8IEFNTF9IQVNfUkVUVkFMCiAjZGVmaW5lIEFNTF9GTEFHU19FWEVDXzZBXzBUXzFSICAgICBBTUxfSEFTX0FSR1MgfCAgICAgICAgICAgICAgICAgIEFNTF9IQVNfUkVUVkFMCiAKLQogLyoKICAqIFRoZSBvcGNvZGUgVHlwZSBpcyB1c2VkIGluIGEgZGlzcGF0Y2ggdGFibGUsIGRvIG5vdCBjaGFuZ2UKICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHRhYmxlLgogICovCiAjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMEFfMFRfMVIgICAgICAweDAwCi0jZGVmaW5lIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIgICAgICAweDAxIC8qIE1vbmFkaWMxICAqLwotI2RlZmluZSBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSICAgICAgMHgwMiAvKiBNb25hZGljMiAgKi8KKyNkZWZpbmUgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiAgICAgIDB4MDEJLyogTW9uYWRpYzEgICovCisjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIgICAgICAweDAyCS8qIE1vbmFkaWMyICAqLwogI2RlZmluZSBBTUxfVFlQRV9FWEVDXzFBXzFUXzBSICAgICAgMHgwMwotI2RlZmluZSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSICAgICAgMHgwNCAvKiBtb25hZGljMl9yICovCi0jZGVmaW5lIEFNTF9UWVBFX0VYRUNfMkFfMFRfMFIgICAgICAweDA1IC8qIER5YWRpYzEgICAqLwotI2RlZmluZSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSICAgICAgMHgwNiAvKiBEeWFkaWMyICAgKi8KLSNkZWZpbmUgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiAgICAgIDB4MDcgLyogZHlhZGljMl9yICAqLworI2RlZmluZSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSICAgICAgMHgwNAkvKiBtb25hZGljMl9yICovCisjZGVmaW5lIEFNTF9UWVBFX0VYRUNfMkFfMFRfMFIgICAgICAweDA1CS8qIER5YWRpYzEgICAqLworI2RlZmluZSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSICAgICAgMHgwNgkvKiBEeWFkaWMyICAgKi8KKyNkZWZpbmUgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiAgICAgIDB4MDcJLyogZHlhZGljMl9yICAqLwogI2RlZmluZSBBTUxfVFlQRV9FWEVDXzJBXzJUXzFSICAgICAgMHgwOAogI2RlZmluZSBBTUxfVFlQRV9FWEVDXzNBXzBUXzBSICAgICAgMHgwOQogI2RlZmluZSBBTUxfVFlQRV9FWEVDXzNBXzFUXzFSICAgICAgMHgwQQpAQCAtMzk5LDQwICszOTIsMzMgQEAKICNkZWZpbmUgQU1MX0NMQVNTX01FVEhPRF9DQUxMICAgICAgIDB4MDkKICNkZWZpbmUgQU1MX0NMQVNTX1VOS05PV04gICAgICAgICAgIDB4MEEKIAotCiAvKiBQcmVkZWZpbmVkIE9wZXJhdGlvbiBSZWdpb24gc3BhY2VfaURzICovCiAKLXR5cGVkZWYgZW51bQotewotCVJFR0lPTl9NRU1PUlkgICAgICAgICAgICAgICAgICAgPSAwLAordHlwZWRlZiBlbnVtIHsKKwlSRUdJT05fTUVNT1JZID0gMCwKIAlSRUdJT05fSU8sCiAJUkVHSU9OX1BDSV9DT05GSUcsCiAJUkVHSU9OX0VDLAogCVJFR0lPTl9TTUJVUywKIAlSRUdJT05fQ01PUywKIAlSRUdJT05fUENJX0JBUiwKLQlSRUdJT05fREFUQV9UQUJMRSwgICAgICAgICAgICAgIC8qIEludGVybmFsIHVzZSBvbmx5ICovCi0JUkVHSU9OX0ZJWEVEX0hXICAgICAgICAgICAgICAgICA9IDB4N0YKLQorCVJFR0lPTl9EQVRBX1RBQkxFLAkvKiBJbnRlcm5hbCB1c2Ugb25seSAqLworCVJFR0lPTl9GSVhFRF9IVyA9IDB4N0YKIH0gQU1MX1JFR0lPTl9UWVBFUzsKIAotCiAvKiBDb21wYXJpc29uIG9wZXJhdGlvbiBjb2RlcyBmb3IgbWF0Y2hfb3Agb3BlcmF0b3IgKi8KIAotdHlwZWRlZiBlbnVtCi17Ci0JTUFUQ0hfTVRSICAgICAgICAgICAgICAgICAgICAgICA9IDAsCi0JTUFUQ0hfTUVRICAgICAgICAgICAgICAgICAgICAgICA9IDEsCi0JTUFUQ0hfTUxFICAgICAgICAgICAgICAgICAgICAgICA9IDIsCi0JTUFUQ0hfTUxUICAgICAgICAgICAgICAgICAgICAgICA9IDMsCi0JTUFUQ0hfTUdFICAgICAgICAgICAgICAgICAgICAgICA9IDQsCi0JTUFUQ0hfTUdUICAgICAgICAgICAgICAgICAgICAgICA9IDUKLQordHlwZWRlZiBlbnVtIHsKKwlNQVRDSF9NVFIgPSAwLAorCU1BVENIX01FUSA9IDEsCisJTUFUQ0hfTUxFID0gMiwKKwlNQVRDSF9NTFQgPSAzLAorCU1BVENIX01HRSA9IDQsCisJTUFUQ0hfTUdUID0gNQogfSBBTUxfTUFUQ0hfT1BFUkFUT1I7CiAKICNkZWZpbmUgTUFYX01BVENIX09QRVJBVE9SICAgICAgICAgIDUKIAotCiAvKgogICogZmllbGRfZmxhZ3MKICAqCkBAIC00NTAsNjAgKzQzNiw0NyBAQAogI2RlZmluZSBBTUxfRklFTERfTE9DS19SVUxFX01BU0sgICAgMHgxMAogI2RlZmluZSBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSyAgMHg2MAogCi0KIC8qIDEpIEZpZWxkIEFjY2VzcyBUeXBlcyAqLwogCi10eXBlZGVmIGVudW0KLXsKLQlBTUxfRklFTERfQUNDRVNTX0FOWSAgICAgICAgICAgID0gMHgwMCwKLQlBTUxfRklFTERfQUNDRVNTX0JZVEUgICAgICAgICAgID0gMHgwMSwKLQlBTUxfRklFTERfQUNDRVNTX1dPUkQgICAgICAgICAgID0gMHgwMiwKLQlBTUxfRklFTERfQUNDRVNTX0RXT1JEICAgICAgICAgID0gMHgwMywKLQlBTUxfRklFTERfQUNDRVNTX1FXT1JEICAgICAgICAgID0gMHgwNCwgICAgLyogQUNQSSAyLjAgKi8KLQlBTUxfRklFTERfQUNDRVNTX0JVRkZFUiAgICAgICAgID0gMHgwNSAgICAgLyogQUNQSSAyLjAgKi8KLQordHlwZWRlZiBlbnVtIHsKKwlBTUxfRklFTERfQUNDRVNTX0FOWSA9IDB4MDAsCisJQU1MX0ZJRUxEX0FDQ0VTU19CWVRFID0gMHgwMSwKKwlBTUxfRklFTERfQUNDRVNTX1dPUkQgPSAweDAyLAorCUFNTF9GSUVMRF9BQ0NFU1NfRFdPUkQgPSAweDAzLAorCUFNTF9GSUVMRF9BQ0NFU1NfUVdPUkQgPSAweDA0LAkvKiBBQ1BJIDIuMCAqLworCUFNTF9GSUVMRF9BQ0NFU1NfQlVGRkVSID0gMHgwNQkvKiBBQ1BJIDIuMCAqLwogfSBBTUxfQUNDRVNTX1RZUEU7CiAKLQogLyogMikgRmllbGQgTG9jayBSdWxlcyAqLwogCi10eXBlZGVmIGVudW0KLXsKLQlBTUxfRklFTERfTE9DS19ORVZFUiAgICAgICAgICAgID0gMHgwMCwKLQlBTUxfRklFTERfTE9DS19BTFdBWVMgICAgICAgICAgID0gMHgxMAotCit0eXBlZGVmIGVudW0geworCUFNTF9GSUVMRF9MT0NLX05FVkVSID0gMHgwMCwKKwlBTUxfRklFTERfTE9DS19BTFdBWVMgPSAweDEwCiB9IEFNTF9MT0NLX1JVTEU7CiAKLQogLyogMykgRmllbGQgVXBkYXRlIFJ1bGVzICovCiAKLXR5cGVkZWYgZW51bQotewotCUFNTF9GSUVMRF9VUERBVEVfUFJFU0VSVkUgICAgICAgPSAweDAwLAotCUFNTF9GSUVMRF9VUERBVEVfV1JJVEVfQVNfT05FUyAgPSAweDIwLAordHlwZWRlZiBlbnVtIHsKKwlBTUxfRklFTERfVVBEQVRFX1BSRVNFUlZFID0gMHgwMCwKKwlBTUxfRklFTERfVVBEQVRFX1dSSVRFX0FTX09ORVMgPSAweDIwLAogCUFNTF9GSUVMRF9VUERBVEVfV1JJVEVfQVNfWkVST1MgPSAweDQwCi0KIH0gQU1MX1VQREFURV9SVUxFOwogCi0KIC8qCiAgKiBGaWVsZCBBY2Nlc3MgQXR0cmlidXRlcy4KICAqIFRoaXMgYnl0ZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgQU1MIHZpYSB0aGUKICAqIGFjY2Vzc19hcyBrZXl3b3JkCiAgKi8KLXR5cGVkZWYgZW51bQotewotCUFNTF9GSUVMRF9BVFRSSUJfU01CX1FVSUNLICAgICAgPSAweDAyLAotCUFNTF9GSUVMRF9BVFRSSUJfU01CX1NFTkRfUkNWICAgPSAweDA0LAotCUFNTF9GSUVMRF9BVFRSSUJfU01CX0JZVEUgICAgICAgPSAweDA2LAotCUFNTF9GSUVMRF9BVFRSSUJfU01CX1dPUkQgICAgICAgPSAweDA4LAotCUFNTF9GSUVMRF9BVFRSSUJfU01CX0JMT0NLICAgICAgPSAweDBBLAotCUFNTF9GSUVMRF9BVFRSSUJfU01CX1dPUkRfQ0FMTCAgPSAweDBDLAordHlwZWRlZiBlbnVtIHsKKwlBTUxfRklFTERfQVRUUklCX1NNQl9RVUlDSyA9IDB4MDIsCisJQU1MX0ZJRUxEX0FUVFJJQl9TTUJfU0VORF9SQ1YgPSAweDA0LAorCUFNTF9GSUVMRF9BVFRSSUJfU01CX0JZVEUgPSAweDA2LAorCUFNTF9GSUVMRF9BVFRSSUJfU01CX1dPUkQgPSAweDA4LAorCUFNTF9GSUVMRF9BVFRSSUJfU01CX0JMT0NLID0gMHgwQSwKKwlBTUxfRklFTERfQVRUUklCX1NNQl9XT1JEX0NBTEwgPSAweDBDLAogCUFNTF9GSUVMRF9BVFRSSUJfU01CX0JMT0NLX0NBTEwgPSAweDBECi0KIH0gQU1MX0FDQ0VTU19BVFRSSUJVVEU7CiAKLQogLyogQml0IGZpZWxkcyBpbiBtZXRob2RfZmxhZ3MgYnl0ZSAqLwogCiAjZGVmaW5lIEFNTF9NRVRIT0RfQVJHX0NPVU5UICAgICAgICAweDA3CkBAIC01MTYsNSArNDg5LDQgQEAKICNkZWZpbmUgQU1MX01FVEhPRF9SRVNFUlZFRDEgICAgICAgIDB4MDIKICNkZWZpbmUgQU1MX01FVEhPRF9SRVNFUlZFRDIgICAgICAgIDB4MDQKIAotCi0jZW5kaWYgLyogX19BTUxDT0RFX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQU1MQ09ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hbWxyZXNyYy5oIGIvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmgKaW5kZXggYjIwZWMzMC4uMDUxNzg2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmgKQEAgLTQyLDI5ICs0MiwyNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLQogI2lmbmRlZiBfX0FNTFJFU1JDX0gKICNkZWZpbmUgX19BTUxSRVNSQ19ICiAKLQogI2RlZmluZSBBU0xfUkVTTkFNRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIl9BRFIiCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAiX0FMTiIKICNkZWZpbmUgQVNMX1JFU05BTUVfQUREUkVTU1NQQUNFICAgICAgICAgICAgICAgICJfQVNJIgogI2RlZmluZSBBU0xfUkVTTkFNRV9BQ0NFU1NTSVpFICAgICAgICAgICAgICAgICAgIl9BU1oiCiAjZGVmaW5lIEFTTF9SRVNOQU1FX1RZUEVTUEVDSUZJQ0FUVFJJQlVURVMgICAgICAiX0FUVCIKICNkZWZpbmUgQVNMX1JFU05BTUVfQkFTRUFERFJFU1MgICAgICAgICAgICAgICAgICJfQkFTIgotI2RlZmluZSBBU0xfUkVTTkFNRV9CVVNNQVNURVIgICAgICAgICAgICAgICAgICAgIl9CTV8iICAvKiBNYXN0ZXIoMSksIFNsYXZlKDApICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX0JVU01BU1RFUiAgICAgICAgICAgICAgICAgICAiX0JNXyIJLyogTWFzdGVyKDEpLCBTbGF2ZSgwKSAqLwogI2RlZmluZSBBU0xfUkVTTkFNRV9ERUNPREUgICAgICAgICAgICAgICAgICAgICAgIl9ERUMiCiAjZGVmaW5lIEFTTF9SRVNOQU1FX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAiX0RNQSIKLSNkZWZpbmUgQVNMX1JFU05BTUVfRE1BVFlQRSAgICAgICAgICAgICAgICAgICAgICJfVFlQIiAgLyogQ29tcGF0aWJsZSgwKSwgQSgxKSwgQigyKSwgRigzKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9ETUFUWVBFICAgICAgICAgICAgICAgICAgICAgIl9UWVAiCS8qIENvbXBhdGlibGUoMCksIEEoMSksIEIoMiksIEYoMykgKi8KICNkZWZpbmUgQVNMX1JFU05BTUVfR1JBTlVMQVJJVFkgICAgICAgICAgICAgICAgICJfR1JBIgogI2RlZmluZSBBU0xfUkVTTkFNRV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgIl9JTlQiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX0lOVEVSUlVQVExFVkVMICAgICAgICAgICAgICAiX0xMXyIgIC8qIGFjdGl2ZV9sbygxKSwgYWN0aXZlX2hpKDApICovCi0jZGVmaW5lIEFTTF9SRVNOQU1FX0lOVEVSUlVQVFNIQVJFICAgICAgICAgICAgICAiX1NIUiIgIC8qIFNoYXJlYWJsZSgxKSwgbm9fc2hhcmUoMCkgKi8KLSNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUVFlQRSAgICAgICAgICAgICAgICJfSEVfIiAgLyogRWRnZSgxKSwgTGV2ZWwoMCkgKi8KKyNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUTEVWRUwgICAgICAgICAgICAgICJfTExfIgkvKiBhY3RpdmVfbG8oMSksIGFjdGl2ZV9oaSgwKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9JTlRFUlJVUFRTSEFSRSAgICAgICAgICAgICAgIl9TSFIiCS8qIFNoYXJlYWJsZSgxKSwgbm9fc2hhcmUoMCkgKi8KKyNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUVFlQRSAgICAgICAgICAgICAgICJfSEVfIgkvKiBFZGdlKDEpLCBMZXZlbCgwKSAqLwogI2RlZmluZSBBU0xfUkVTTkFNRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgIl9MRU4iCi0jZGVmaW5lIEFTTF9SRVNOQU1FX01FTUFUVFJJQlVURVMgICAgICAgICAgICAgICAiX01UUCIgIC8qIE1lbW9yeSgwKSwgUmVzZXJ2ZWQoMSksIEFDUEkoMiksIE5WUygzKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9NRU1UWVBFICAgICAgICAgICAgICAgICAgICAgIl9NRU0iICAvKiBub25fY2FjaGUoMCksIENhY2hlYWJsZSgxKSBDYWNoZStjb21iaW5lKDIpLCBDYWNoZStwcmVmZXRjaCgzKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9NRU1BVFRSSUJVVEVTICAgICAgICAgICAgICAgIl9NVFAiCS8qIE1lbW9yeSgwKSwgUmVzZXJ2ZWQoMSksIEFDUEkoMiksIE5WUygzKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9NRU1UWVBFICAgICAgICAgICAgICAgICAgICAgIl9NRU0iCS8qIG5vbl9jYWNoZSgwKSwgQ2FjaGVhYmxlKDEpIENhY2hlK2NvbWJpbmUoMiksIENhY2hlK3ByZWZldGNoKDMpICovCiAjZGVmaW5lIEFTTF9SRVNOQU1FX01BWEFERFIgICAgICAgICAgICAgICAgICAgICAiX01BWCIKICNkZWZpbmUgQVNMX1JFU05BTUVfTUlOQUREUiAgICAgICAgICAgICAgICAgICAgICJfTUlOIgogI2RlZmluZSBBU0xfUkVTTkFNRV9NQVhUWVBFICAgICAgICAgICAgICAgICAgICAgIl9NQUYiCkBAIC03MiwxMiArNzAsMTEgQEAKICNkZWZpbmUgQVNMX1JFU05BTUVfUkVHSVNURVJCSVRPRkZTRVQgICAgICAgICAgICJfUkJPIgogI2RlZmluZSBBU0xfUkVTTkFNRV9SRUdJU1RFUkJJVFdJRFRIICAgICAgICAgICAgIl9SQlciCiAjZGVmaW5lIEFTTF9SRVNOQU1FX1JBTkdFVFlQRSAgICAgICAgICAgICAgICAgICAiX1JORyIKLSNkZWZpbmUgQVNMX1JFU05BTUVfUkVBRFdSSVRFVFlQRSAgICAgICAgICAgICAgICJfUldfIiAgLyogcmVhZF9vbmx5KDApLCBXcml0ZWFibGUgKDEpICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX1JFQURXUklURVRZUEUgICAgICAgICAgICAgICAiX1JXXyIJLyogcmVhZF9vbmx5KDApLCBXcml0ZWFibGUgKDEpICovCiAjZGVmaW5lIEFTTF9SRVNOQU1FX1RSQU5TTEFUSU9OICAgICAgICAgICAgICAgICAiX1RSQSIKLSNkZWZpbmUgQVNMX1JFU05BTUVfVFJBTlNUWVBFICAgICAgICAgICAgICAgICAgICJfVFJTIiAgLyogU3BhcnNlKDEpLCBEZW5zZSgwKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIl9UVFAiICAvKiBUcmFuc2xhdGlvbigxKSwgU3RhdGljICgwKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9YRkVSVFlQRSAgICAgICAgICAgICAgICAgICAgIl9TSXoiICAvKiA4KDApLCA4X2FuZDE2KDEpLCAxNigyKSAqLwotCisjZGVmaW5lIEFTTF9SRVNOQU1FX1RSQU5TVFlQRSAgICAgICAgICAgICAgICAgICAiX1RSUyIJLyogU3BhcnNlKDEpLCBEZW5zZSgwKSAqLworI2RlZmluZSBBU0xfUkVTTkFNRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIl9UVFAiCS8qIFRyYW5zbGF0aW9uKDEpLCBTdGF0aWMgKDApICovCisjZGVmaW5lIEFTTF9SRVNOQU1FX1hGRVJUWVBFICAgICAgICAgICAgICAgICAgICAiX1NJeiIJLyogOCgwKSwgOF9hbmQxNigxKSwgMTYoMikgKi8KIAogLyogRGVmYXVsdCBzaXplcyBmb3IgInNtYWxsIiByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLwogCkBAIC04OSwxNSArODYsMTIgQEAKICNkZWZpbmUgQVNMX1JERVNDX0ZJWEVEX0lPX1NJWkUgICAgICAgICAgICAgICAgIDB4MDMKICNkZWZpbmUgQVNMX1JERVNDX0VORF9UQUdfU0laRSAgICAgICAgICAgICAgICAgIDB4MDEKIAotCi1zdHJ1Y3QgYXNsX3Jlc291cmNlX25vZGUKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXI7Ci0Jc3RydWN0IGFzbF9yZXNvdXJjZV9ub2RlICAgICAgICAgICAgKm5leHQ7CitzdHJ1Y3QgYXNsX3Jlc291cmNlX25vZGUgeworCXUzMiBidWZmZXJfbGVuZ3RoOworCXZvaWQgKmJ1ZmZlcjsKKwlzdHJ1Y3QgYXNsX3Jlc291cmNlX25vZGUgKm5leHQ7CiB9OwogCi0KIC8qCiAgKiBSZXNvdXJjZSBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCiAgKgpAQCAtMTA2LDIxNCArMTAwLDE3NSBAQAogICovCiAjcHJhZ21hIHBhY2soMSkKIAotc3RydWN0IGFzbF9pcnFfZm9ybWF0X2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX21hc2s7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CitzdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBpcnFfbWFzazsKKwl1OCBmbGFnczsKIH07CiAKLQotc3RydWN0IGFzbF9pcnFfbm9mbGFnc19kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycV9tYXNrOworc3RydWN0IGFzbF9pcnFfbm9mbGFnc19kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGlycV9tYXNrOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2RtYV9mb3JtYXRfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfY2hhbm5lbF9tYXNrOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworc3RydWN0IGFzbF9kbWFfZm9ybWF0X2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1OCBkbWFfY2hhbm5lbF9tYXNrOworCXU4IGZsYWdzOwogfTsKIAotCi1zdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXU4IGZsYWdzOwogfTsKIAotCi1zdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9ub3ByaW9fZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKK3N0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X25vcHJpb19kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CiB9OwogCi0KLXN0cnVjdCBhc2xfZW5kX2RlcGVuZGVudF9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOworc3RydWN0IGFzbF9lbmRfZGVwZW5kZW50X2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKIH07CiAKLQotc3RydWN0IGFzbF9pb19wb3J0X2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb247Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19taW47Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19tYXg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKK3N0cnVjdCBhc2xfaW9fcG9ydF9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTggaW5mb3JtYXRpb247CisJdTE2IGFkZHJlc3NfbWluOworCXUxNiBhZGRyZXNzX21heDsKKwl1OCBhbGlnbm1lbnQ7CisJdTggbGVuZ3RoOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2ZpeGVkX2lvX3BvcnRfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2FkZHJlc3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgYmFzZV9hZGRyZXNzOworCXU4IGxlbmd0aDsKIH07CiAKLQotc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JfZGVmaW5lZFs3XTsKK3N0cnVjdCBhc2xfc21hbGxfdmVuZG9yX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1OCB2ZW5kb3JfZGVmaW5lZFs3XTsKIH07CiAKLQotc3RydWN0IGFzbF9lbmRfdGFnX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW07CitzdHJ1Y3QgYXNsX2VuZF90YWdfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXU4IGNoZWNrc3VtOwogfTsKIAotCiAvKiBMQVJHRSBkZXNjcmlwdG9ycyAqLwogCi1zdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21pbjsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX21heDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFzbF9tZW1vcnlfMjRfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggaW5mb3JtYXRpb247CisJdTE2IGFkZHJlc3NfbWluOworCXUxNiBhZGRyZXNzX21heDsKKwl1MTYgYWxpZ25tZW50OworCXUxNiByYW5nZV9sZW5ndGg7CiB9OwogCi0KLXN0cnVjdCBhc2xfbGFyZ2VfdmVuZG9yX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcl9kZWZpbmVkWzFdOworc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggdmVuZG9yX2RlZmluZWRbMV07CiB9OwogCi0KLXN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWluOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWF4OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGg7CitzdHJ1Y3QgYXNsX21lbW9yeV8zMl9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCBpbmZvcm1hdGlvbjsKKwl1MzIgYWRkcmVzc19taW47CisJdTMyIGFkZHJlc3NfbWF4OworCXUzMiBhbGlnbm1lbnQ7CisJdTMyIHJhbmdlX2xlbmd0aDsKIH07CiAKLQotc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYwotewotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb247Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9hZGRyZXNzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aDsKK3N0cnVjdCBhc2xfZml4ZWRfbWVtb3J5XzMyX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgbGVuZ3RoOworCXU4IGluZm9ybWF0aW9uOworCXUzMiBiYXNlX2FkZHJlc3M7CisJdTMyIHJhbmdlX2xlbmd0aDsKIH07CiAKLQotc3RydWN0IGFzbF9leHRlbmRlZF9hZGRyZXNzX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNfZmxhZ3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25faUQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19taW47Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19tYXg7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25fb2Zmc2V0OwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoOwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlczsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9maWVsZHNbMl07IC8qIFVzZWQgZm9yIGxlbmd0aCBjYWxjdWxhdGlvbiBvbmx5ICovCitzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCBmbGFnczsKKwl1OCBzcGVjaWZpY19mbGFnczsKKwl1OCByZXZpc2lvbl9pRDsKKwl1OCByZXNlcnZlZDsKKwl1NjQgZ3JhbnVsYXJpdHk7CisJdTY0IGFkZHJlc3NfbWluOworCXU2NCBhZGRyZXNzX21heDsKKwl1NjQgdHJhbnNsYXRpb25fb2Zmc2V0OworCXU2NCBhZGRyZXNzX2xlbmd0aDsKKwl1NjQgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzOworCXU4IG9wdGlvbmFsX2ZpZWxkc1syXTsJLyogVXNlZCBmb3IgbGVuZ3RoIGNhbGN1bGF0aW9uIG9ubHkgKi8KIH07CiAKLSNkZWZpbmUgQVNMX0VYVEVOREVEX0FERFJFU1NfREVTQ19SRVZJU0lPTiAgICAgICAgICAxICAgICAgIC8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFTTF9FWFRFTkRFRF9BRERSRVNTX0RFU0NfUkVWSVNJT04gICAgICAgICAgMQkvKiBBQ1BJIDMuMCAqLwogCi0KLXN0cnVjdCBhc2xfcXdvcmRfYWRkcmVzc19kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljX2ZsYWdzOwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5OwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWluOwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWF4OwotCXU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uX29mZnNldDsKLQl1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9maWVsZHNbMl07CitzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCBmbGFnczsKKwl1OCBzcGVjaWZpY19mbGFnczsKKwl1NjQgZ3JhbnVsYXJpdHk7CisJdTY0IGFkZHJlc3NfbWluOworCXU2NCBhZGRyZXNzX21heDsKKwl1NjQgdHJhbnNsYXRpb25fb2Zmc2V0OworCXU2NCBhZGRyZXNzX2xlbmd0aDsKKwl1OCBvcHRpb25hbF9maWVsZHNbMl07CiB9OwogCi0KLXN0cnVjdCBhc2xfZHdvcmRfYWRkcmVzc19kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljX2ZsYWdzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWluOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbWF4OwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uX29mZnNldDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX2xlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9maWVsZHNbMl07CitzdHJ1Y3QgYXNsX2R3b3JkX2FkZHJlc3NfZGVzYyB7CisJdTggZGVzY3JpcHRvcl90eXBlOworCXUxNiBsZW5ndGg7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCBmbGFnczsKKwl1OCBzcGVjaWZpY19mbGFnczsKKwl1MzIgZ3JhbnVsYXJpdHk7CisJdTMyIGFkZHJlc3NfbWluOworCXUzMiBhZGRyZXNzX21heDsKKwl1MzIgdHJhbnNsYXRpb25fb2Zmc2V0OworCXUzMiBhZGRyZXNzX2xlbmd0aDsKKwl1OCBvcHRpb25hbF9maWVsZHNbMl07CiB9OwogCi0KLXN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNfZmxhZ3M7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19taW47Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19tYXg7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25fb2Zmc2V0OwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZpZWxkc1syXTsKK3N0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2MgeworCXU4IGRlc2NyaXB0b3JfdHlwZTsKKwl1MTYgbGVuZ3RoOworCXU4IHJlc291cmNlX3R5cGU7CisJdTggZmxhZ3M7CisJdTggc3BlY2lmaWNfZmxhZ3M7CisJdTE2IGdyYW51bGFyaXR5OworCXUxNiBhZGRyZXNzX21pbjsKKwl1MTYgYWRkcmVzc19tYXg7CisJdTE2IHRyYW5zbGF0aW9uX29mZnNldDsKKwl1MTYgYWRkcmVzc19sZW5ndGg7CisJdTggb3B0aW9uYWxfZmllbGRzWzJdOwogfTsKIAotCi1zdHJ1Y3QgYXNsX2V4dGVuZGVkX3hydXB0X2Rlc2MKLXsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2xlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbnVtYmVyWzFdOworc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCBmbGFnczsKKwl1OCB0YWJsZV9sZW5ndGg7CisJdTMyIGludGVycnVwdF9udW1iZXJbMV07CiAJLyogcmVzX3NvdXJjZV9pbmRleCwgcmVzX3NvdXJjZSBvcHRpb25hbCBmaWVsZHMgZm9sbG93ICovCiB9OwogCi0KLXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjCi17Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90eXBlOwotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3NwYWNlX2lkOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfb2Zmc2V0OwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc19zaXplOyAvKiBBQ1BJIDMuMCwgd2FzIFJlc2VydmVkICovCi0JdTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczsKK3N0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjIHsKKwl1OCBkZXNjcmlwdG9yX3R5cGU7CisJdTE2IGxlbmd0aDsKKwl1OCBhZGRyZXNzX3NwYWNlX2lkOworCXU4IGJpdF93aWR0aDsKKwl1OCBiaXRfb2Zmc2V0OworCXU4IGFjY2Vzc19zaXplOwkJLyogQUNQSSAzLjAsIHdhcyBSZXNlcnZlZCAqLworCXU2NCBhZGRyZXNzOwogfTsKIAogLyogcmVzdG9yZSBkZWZhdWx0IGFsaWdubWVudCAqLwpAQCAtMzIyLDMyICsyNzcsMjkgQEAKIAogLyogVW5pb24gb2YgYWxsIHJlc291cmNlIGRlc2NyaXB0b3JzLCBzbyB3ZSBjYW4gYWxsb2NhdGUgdGhlIHdvcnN0IGNhc2UgKi8KIAotdW5pb24gYXNsX3Jlc291cmNlX2Rlc2MKLXsKLQlzdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyAgICAgICAgICBpcnE7Ci0Jc3RydWN0IGFzbF9kbWFfZm9ybWF0X2Rlc2MgICAgICAgICAgZG1hOwotCXN0cnVjdCBhc2xfc3RhcnRfZGVwZW5kZW50X2Rlc2MgICAgIHN0ZDsKLQlzdHJ1Y3QgYXNsX2VuZF9kZXBlbmRlbnRfZGVzYyAgICAgICBlbmQ7Ci0Jc3RydWN0IGFzbF9pb19wb3J0X2Rlc2MgICAgICAgICAgICAgaW9wOwotCXN0cnVjdCBhc2xfZml4ZWRfaW9fcG9ydF9kZXNjICAgICAgIGZpbzsKLQlzdHJ1Y3QgYXNsX3NtYWxsX3ZlbmRvcl9kZXNjICAgICAgICBzbXY7Ci0Jc3RydWN0IGFzbF9lbmRfdGFnX2Rlc2MgICAgICAgICAgICAgZXQ7Cit1bmlvbiBhc2xfcmVzb3VyY2VfZGVzYyB7CisJc3RydWN0IGFzbF9pcnFfZm9ybWF0X2Rlc2MgaXJxOworCXN0cnVjdCBhc2xfZG1hX2Zvcm1hdF9kZXNjIGRtYTsKKwlzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjIHN0ZDsKKwlzdHJ1Y3QgYXNsX2VuZF9kZXBlbmRlbnRfZGVzYyBlbmQ7CisJc3RydWN0IGFzbF9pb19wb3J0X2Rlc2MgaW9wOworCXN0cnVjdCBhc2xfZml4ZWRfaW9fcG9ydF9kZXNjIGZpbzsKKwlzdHJ1Y3QgYXNsX3NtYWxsX3ZlbmRvcl9kZXNjIHNtdjsKKwlzdHJ1Y3QgYXNsX2VuZF90YWdfZGVzYyBldDsKIAotCXN0cnVjdCBhc2xfbWVtb3J5XzI0X2Rlc2MgICAgICAgICAgIE0yNDsKLQlzdHJ1Y3QgYXNsX2xhcmdlX3ZlbmRvcl9kZXNjICAgICAgICBsZ3Y7Ci0Jc3RydWN0IGFzbF9tZW1vcnlfMzJfZGVzYyAgICAgICAgICAgTTMyOwotCXN0cnVjdCBhc2xfZml4ZWRfbWVtb3J5XzMyX2Rlc2MgICAgIEYzMjsKLQlzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyAgICAgICBxYXM7Ci0Jc3RydWN0IGFzbF9kd29yZF9hZGRyZXNzX2Rlc2MgICAgICAgZGFzOwotCXN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2MgICAgICAgIHdhczsKLQlzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyAgICBlYXM7Ci0Jc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjICAgICAgZXh4OwotCXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjICAgIGdyZzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfaXRlbTsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfaXRlbTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVOGl0ZW07CisJc3RydWN0IGFzbF9tZW1vcnlfMjRfZGVzYyBNMjQ7CisJc3RydWN0IGFzbF9sYXJnZV92ZW5kb3JfZGVzYyBsZ3Y7CisJc3RydWN0IGFzbF9tZW1vcnlfMzJfZGVzYyBNMzI7CisJc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyBGMzI7CisJc3RydWN0IGFzbF9xd29yZF9hZGRyZXNzX2Rlc2MgcWFzOworCXN0cnVjdCBhc2xfZHdvcmRfYWRkcmVzc19kZXNjIGRhczsKKwlzdHJ1Y3QgYXNsX3dvcmRfYWRkcmVzc19kZXNjIHdhczsKKwlzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyBlYXM7CisJc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjIGV4eDsKKwlzdHJ1Y3QgYXNsX2dlbmVyYWxfcmVnaXN0ZXJfZGVzYyBncmc7CisJdTMyIHUzMl9pdGVtOworCXUxNiB1MTZfaXRlbTsKKwl1OCBVOGl0ZW07CiB9OwogCi0KICNlbmRpZgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvY29udGFpbmVyLmggYi9pbmNsdWRlL2FjcGkvY29udGFpbmVyLmgKaW5kZXggZDcxNmRmMC4uYTcwM2YxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2NvbnRhaW5lci5oCisrKyBiL2luY2x1ZGUvYWNwaS9jb250YWluZXIuaApAQCAtOSw1ICs5LDQgQEAKIAlpbnQgc3RhdGU7CiB9OwogCi0jZW5kaWYgLyogX19BQ1BJX0NPTlRBSU5FUl9IICovCi0KKyNlbmRpZgkJCQkvKiBfX0FDUElfQ09OVEFJTkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaCBiL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaAppbmRleCBmZDY3MzBlLi45MWY0YTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCkBAIC0xNCw3ICsxNCw2IEBACiAjZGVmaW5lIEFDUElfUERDX1NNUF9UX1NXQ09PUkQJCSgweDAwODApCiAjZGVmaW5lIEFDUElfUERDX0NfQzFfRkZICQkoMHgwMTAwKQogCi0KICNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QCShBQ1BJX1BEQ19TTVBfQzFQVCB8IFwKIAkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCkKIApAQCAtMjUsNSArMjQsNCBAQAogCQkJCQkgQUNQSV9QRENfU01QX0MxUFQgfCBcCiAJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQpCiAKLSNlbmRpZiAvKiBfX1BEQ19JTlRFTF9IX18gKi8KLQorI2VuZGlmCQkJCS8qIF9fUERDX0lOVEVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAppbmRleCBhZGY5NjllLi4xNjYwOWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaApAQCAtNDQsNDAgKzQ0LDQyIEBACiAjaWZuZGVmIF9fQUNFTlZfSF9fCiAjZGVmaW5lIF9fQUNFTlZfSF9fCiAKLQogLyoKICAqIENvbmZpZ3VyYXRpb24gZm9yIEFDUEkgdG9vbHMgYW5kIHV0aWxpdGllcwogICovCiAKLSNpZmRlZiBfQUNQSV9EVU1QX0FQUAorI2lmZGVmIEFDUElfTElCUkFSWQorI2RlZmluZSBBQ1BJX1VTRV9MT0NBTF9DQUNIRQorI2VuZGlmCisKKyNpZmRlZiBBQ1BJX0RVTVBfQVBQCiAjaWZuZGVmIE1TRE9TCiAjZGVmaW5lIEFDUElfREVCVUdfT1VUUFVUCiAjZW5kaWYKICNkZWZpbmUgQUNQSV9BUFBMSUNBVElPTgogI2RlZmluZSBBQ1BJX0RJU0FTU0VNQkxFUgogI2RlZmluZSBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLSNkZWZpbmUgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCi0jZGVmaW5lIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQogI2VuZGlmCiAKLSNpZmRlZiBfQUNQSV9FWEVDX0FQUAorI2lmZGVmIEFDUElfRVhFQ19BUFAKICN1bmRlZiBERUJVR0dFUl9USFJFQURJTkcKICNkZWZpbmUgREVCVUdHRVJfVEhSRUFESU5HICAgICAgREVCVUdHRVJfU0lOR0xFX1RIUkVBREVECiAjZGVmaW5lIEFDUElfREVCVUdfT1VUUFVUCiAjZGVmaW5lIEFDUElfQVBQTElDQVRJT04KICNkZWZpbmUgQUNQSV9ERUJVR0dFUgogI2RlZmluZSBBQ1BJX0RJU0FTU0VNQkxFUgotI2RlZmluZSBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkKLSNkZWZpbmUgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCiAjZW5kaWYKIAotI2lmZGVmIF9BQ1BJX0FTTF9DT01QSUxFUgorI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCiAjZGVmaW5lIEFDUElfREVCVUdfT1VUUFVUCiAjZGVmaW5lIEFDUElfQVBQTElDQVRJT04KICNkZWZpbmUgQUNQSV9ESVNBU1NFTUJMRVIKICNkZWZpbmUgQUNQSV9DT05TVEFOVF9FVkFMX09OTFkKKyNlbmRpZgorCisjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgogI2RlZmluZSBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkKLSNkZWZpbmUgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCisjZGVmaW5lIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCiAjZW5kaWYKIAogLyoKQEAgLTEzMSw3ICsxMzMsNyBAQAogI2VsaWYgZGVmaW5lZChXSU42NCkKICNpbmNsdWRlICJhY3dpbjY0LmgiCiAKLSNlbGlmIGRlZmluZWQoTVNET1MpICAgICAgICAvKiBNdXN0IGFwcGVhciBhZnRlciBXSU4zMiBhbmQgV0lONjQgY2hlY2sgKi8KKyNlbGlmIGRlZmluZWQoTVNET1MpCQkvKiBNdXN0IGFwcGVhciBhZnRlciBXSU4zMiBhbmQgV0lONjQgY2hlY2sgKi8KICNpbmNsdWRlICJhY2RvczE2LmgiCiAKICNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCkBAIC0xNzcsNyArMTc5LDYgQEAKIAogLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwogCi0KIC8qCiAgKiBEZWJ1Z2dlciB0aHJlYWRpbmcgbW9kZWwKICAqIFVzZSBzaW5nbGUgdGhyZWFkZWQgaWYgdGhlIGVudGlyZSBzdWJzeXN0ZW0gaXMgY29udGFpbmVkIGluIGFuIGFwcGxpY2F0aW9uCkBAIC0xOTYsOCArMTk3LDcgQEAKICNlbHNlCiAjZGVmaW5lIERFQlVHR0VSX1RIUkVBRElORyAgICAgICAgICBERUJVR0dFUl9NVUxUSV9USFJFQURFRAogI2VuZGlmCi0jZW5kaWYgLyogIURFQlVHR0VSX1RIUkVBRElORyAqLwotCisjZW5kaWYJCQkJLyogIURFQlVHR0VSX1RIUkVBRElORyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjE5LDcgKzIxOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAotI2VuZGlmIC8qIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgKi8KKyNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTICovCiAKIC8qCiAgKiBXZSB3aWxsIGJlIGxpbmtpbmcgdG8gdGhlIHN0YW5kYXJkIENsaWIgZnVuY3Rpb25zCkBAIC0yMzgsMTUgKzIzOCwxNSBAQAogI2RlZmluZSBBQ1BJX01FTUNQWShkLHMsbikgICAgICAodm9pZCkgbWVtY3B5KChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKICNkZWZpbmUgQUNQSV9NRU1TRVQoZCxzLG4pICAgICAgKHZvaWQpIG1lbXNldCgoZCksIChzKSwgKGFjcGlfc2l6ZSkobikpCiAKLSNkZWZpbmUgQUNQSV9UT1VQUEVSICAgICAgICAgICAgdG91cHBlcgotI2RlZmluZSBBQ1BJX1RPTE9XRVIgICAgICAgICAgICB0b2xvd2VyCi0jZGVmaW5lIEFDUElfSVNfWERJR0lUICAgICAgICAgIGlzeGRpZ2l0Ci0jZGVmaW5lIEFDUElfSVNfRElHSVQgICAgICAgICAgIGlzZGlnaXQKLSNkZWZpbmUgQUNQSV9JU19TUEFDRSAgICAgICAgICAgaXNzcGFjZQotI2RlZmluZSBBQ1BJX0lTX1VQUEVSICAgICAgICAgICBpc3VwcGVyCi0jZGVmaW5lIEFDUElfSVNfUFJJTlQgICAgICAgICAgIGlzcHJpbnQKLSNkZWZpbmUgQUNQSV9JU19BTFBIQSAgICAgICAgICAgaXNhbHBoYQotI2RlZmluZSBBQ1BJX0lTX0FTQ0lJICAgICAgICAgICBpc2FzY2lpCisjZGVmaW5lIEFDUElfVE9VUFBFUihpKSAgICAgICAgIHRvdXBwZXIoKGludCkgKGkpKQorI2RlZmluZSBBQ1BJX1RPTE9XRVIoaSkgICAgICAgICB0b2xvd2VyKChpbnQpIChpKSkKKyNkZWZpbmUgQUNQSV9JU19YRElHSVQoaSkgICAgICAgaXN4ZGlnaXQoKGludCkgKGkpKQorI2RlZmluZSBBQ1BJX0lTX0RJR0lUKGkpICAgICAgICBpc2RpZ2l0KChpbnQpIChpKSkKKyNkZWZpbmUgQUNQSV9JU19TUEFDRShpKSAgICAgICAgaXNzcGFjZSgoaW50KSAoaSkpCisjZGVmaW5lIEFDUElfSVNfVVBQRVIoaSkgICAgICAgIGlzdXBwZXIoKGludCkgKGkpKQorI2RlZmluZSBBQ1BJX0lTX1BSSU5UKGkpICAgICAgICBpc3ByaW50KChpbnQpIChpKSkKKyNkZWZpbmUgQUNQSV9JU19BTFBIQShpKSAgICAgICAgaXNhbHBoYSgoaW50KSAoaSkpCisjZGVmaW5lIEFDUElfSVNfQVNDSUkoaSkgICAgICAgIGlzYXNjaWkoKGludCkgKGkpKQogCiAjZWxzZQogCkBAIC0yNTcsMTggKzI1NywxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgLyoKLSAqIFVzZSBsb2NhbCBkZWZpbml0aW9ucyBvZiBDIGxpYnJhcnkgbWFjcm9zIGFuZCBmdW5jdGlvbnMKLSAqIE5PVEU6IFRoZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBiZSBhcyBlZmZpY2llbnQKLSAqIGFzIGFuIGlubGluZSBvciBhc3NlbWJseSBjb2RlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IGEKLSAqIG5hdGl2ZSBDIGxpYnJhcnkuCi0gKi8KKyAgKiBVc2UgbG9jYWwgZGVmaW5pdGlvbnMgb2YgQyBsaWJyYXJ5IG1hY3JvcyBhbmQgZnVuY3Rpb25zCisgICogTk9URTogVGhlIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IGJlIGFzIGVmZmljaWVudAorICAqIGFzIGFuIGlubGluZSBvciBhc3NlbWJseSBjb2RlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IGEKKyAgKiBuYXRpdmUgQyBsaWJyYXJ5LgorICAqLwogCiAjaWZuZGVmIHZhX2FyZwogCiAjaWZuZGVmIF9WQUxJU1QKICNkZWZpbmUgX1ZBTElTVAogdHlwZWRlZiBjaGFyICp2YV9saXN0OwotI2VuZGlmIC8qIF9WQUxJU1QgKi8KKyNlbmRpZgkJCQkvKiBfVkFMSVNUICovCiAKIC8qCiAgKiBTdG9yYWdlIGFsaWdubWVudCBwcm9wZXJ0aWVzCkBAIC0yODQsOCArMjg0LDcgQEAKICNkZWZpbmUgdmFfZW5kKGFwKSAgICAgICAgICAgICAgKHZvaWQpIDAKICNkZWZpbmUgdmFfc3RhcnQoYXAsIEEpICAgICAgICAgKHZvaWQpICgoYXApID0gKCgoY2hhciAqKSAmKEEpKSArIChfYm5kIChBLF9BVVBCTkQpKSkpCiAKLSNlbmRpZiAvKiB2YV9hcmcgKi8KLQorI2VuZGlmCQkJCS8qIHZhX2FyZyAqLwogCiAjZGVmaW5lIEFDUElfU1RSU1RSKHMxLHMyKSAgICAgIGFjcGlfdXRfc3Ryc3RyICgoczEpLCAoczIpKQogI2RlZmluZSBBQ1BJX1NUUkNIUihzMSxjKSAgICAgICBhY3BpX3V0X3N0cmNociAoKHMxKSwgKGMpKQpAQCAtMzAzLDggKzMwMiw3IEBACiAjZGVmaW5lIEFDUElfVE9VUFBFUiAgICAgICAgICAgIGFjcGlfdXRfdG9fdXBwZXIKICNkZWZpbmUgQUNQSV9UT0xPV0VSICAgICAgICAgICAgYWNwaV91dF90b19sb3dlcgogCi0jZW5kaWYgLyogQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZICovCi0KKyNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM0NSw4ICszNDMsNyBAQAogI2RlZmluZSBBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0soR2xwdHIsIGFjcSkKICNkZWZpbmUgQUNQSV9SRUxFQVNFX0dMT0JBTF9MT0NLKEdscHRyLCBhY3EpCiAKLSNlbmRpZiAvKiBBQ1BJX0FTTV9NQUNST1MgKi8KLQorI2VuZGlmCQkJCS8qIEFDUElfQVNNX01BQ1JPUyAqLwogCiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgogCkBAIC0zNTYsMTEgKzM1MywxMCBAQAogI2RlZmluZSBCUkVBS1BPSU5UMwogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIENvbXBpbGVyLXNwZWNpZmljIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgY29tcGlsZXItc3BlY2lmaWMKICAqIGhlYWRlcnMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIF9fQUNFTlZfSF9fICovCisjZW5kaWYJCQkJLyogX19BQ0VOVl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKaW5kZXggOTFmZGEzNi4uNGMwZTBiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKQEAgLTQ0LDE2ICs0NCwyMCBAQAogI2lmbmRlZiBfX0FDR0NDX0hfXwogI2RlZmluZSBfX0FDR0NDX0hfXwogCisvKiBGdW5jdGlvbiBuYW1lIGlzIHVzZWQgZm9yIGRlYnVnIG91dHB1dC4gTm9uLUFOU0ksIGNvbXBpbGVyLWRlcGVuZGVudCAqLworCisjZGVmaW5lIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgICAgICAgICAgX19GVU5DVElPTl9fCisKIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byB0YWcgZnVuY3Rpb25zIGFzICJwcmludGYtbGlrZSIgYmVjYXVzZQogICogc29tZSBjb21waWxlcnMgKGxpa2UgR0NDKSBjYW4gY2F0Y2ggcHJpbnRmIGZvcm1hdCBzdHJpbmcgcHJvYmxlbXMuCiAgKi8KLSNkZWZpbmUgQUNQSV9QUklOVEZfTElLRV9GVU5DIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA0LCA1KSkpCisjZGVmaW5lIEFDUElfUFJJTlRGX0xJS0VfRlVOQyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgNiwgNykpKQogCiAvKiBTb21lIGNvbXBpbGVycyBjb21wbGFpbiBhYm91dCB1bnVzZWQgdmFyaWFibGVzLiBTb21ldGltZXMgd2UgZG9uJ3Qgd2FudCB0bwotICogdXNlIGFsbCB0aGUgdmFyaWFibGVzIChtb3N0IHNwZWNpZmljYWxseSBmb3IgX1RISVNfTU9EVUxFKS4gVGhpcyBhbGxvdyB1cworICogdXNlIGFsbCB0aGUgdmFyaWFibGVzIChmb3IgZXhhbXBsZSwgX2FjcGlfbW9kdWxlX25hbWUpLiBUaGlzIGFsbG93cyB1cwogICogdG8gdG8gdGVsbCB0aGUgY29tcGlsZXIgd2FybmluZyBpbiBhIHBlci12YXJpYWJsZSBtYW5uZXIgdGhhdCBhIHZhcmlhYmxlCiAgKiBpcyB1bnVzZWQuCiAgKi8KICNkZWZpbmUgQUNQSV9VTlVTRURfVkFSIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQogCi0jZW5kaWYgLyogX19BQ0dDQ19IX18gKi8KKyNlbmRpZgkJCQkvKiBfX0FDR0NDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggYTNkZTBkYi4uYzkzZTY1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC02Miw3ICs2MiwxNiBAQAogCiAjZGVmaW5lIEFDUElfTUFDSElORV9XSURUSCAgQklUU19QRVJfTE9ORwogCi0jZWxzZSAvKiAhX19LRVJORUxfXyAqLworLyogVHlwZShzKSBmb3IgdGhlIE9TTCAqLworCisjaWZkZWYgQUNQSV9VU0VfTE9DQUxfQ0FDSEUKKyNkZWZpbmUgYWNwaV9jYWNoZV90CXN0cnVjdCBhY3BpX21lbW9yeV9saXN0CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNkZWZpbmUgYWNwaV9jYWNoZV90CWttZW1fY2FjaGVfdAorI2VuZGlmCisKKyNlbHNlCQkJCS8qICFfX0tFUk5FTF9fICovCiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTgzLDEwICs5MiwxMCBAQAogCiAjZGVmaW5lIF9fY2RlY2wKICNkZWZpbmUgQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCiAKIC8qIExpbnV4IHVzZXMgR0NDICovCiAKICNpbmNsdWRlICJhY2djYy5oIgogCi0jZW5kaWYgLyogX19BQ0xJTlVYX0hfXyAqLworI2VuZGlmCQkJCS8qIF9fQUNMSU5VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAppbmRleCA1MGNmZWE0Li43YTAwZDUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCkBAIC0yMyw0NSArMjMsNDQgQEAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeDsKIAogc3RydWN0IGFjcGlfcG93ZXJfcmVnaXN0ZXIgewotCXU4CQkJZGVzY3JpcHRvcjsKLQl1MTYJCQlsZW5ndGg7Ci0JdTgJCQlzcGFjZV9pZDsKLQl1OAkJCWJpdF93aWR0aDsKLQl1OAkJCWJpdF9vZmZzZXQ7Ci0JdTgJCQlyZXNlcnZlZDsKLQl1NjQJCQlhZGRyZXNzOworCXU4IGRlc2NyaXB0b3I7CisJdTE2IGxlbmd0aDsKKwl1OCBzcGFjZV9pZDsKKwl1OCBiaXRfd2lkdGg7CisJdTggYml0X29mZnNldDsKKwl1OCByZXNlcnZlZDsKKwl1NjQgYWRkcmVzczsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi0KIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeF9wb2xpY3kgewotCXUzMgkJCWNvdW50OworCXUzMiBjb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKnN0YXRlOwogCXN0cnVjdCB7Ci0JCXUzMgkJCXRpbWU7Ci0JCXUzMgkJCXRpY2tzOwotCQl1MzIJCQljb3VudDsKLQkJdTMyCQkJYm07Ci0JfQkJCXRocmVzaG9sZDsKKwkJdTMyIHRpbWU7CisJCXUzMiB0aWNrczsKKwkJdTMyIGNvdW50OworCQl1MzIgYm07CisJfSB0aHJlc2hvbGQ7CiB9OwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggewotCXU4CQkJdmFsaWQ7Ci0JdTgJCQl0eXBlOwotCXUzMgkJCWFkZHJlc3M7Ci0JdTMyCQkJbGF0ZW5jeTsKLQl1MzIJCQlsYXRlbmN5X3RpY2tzOwotCXUzMgkJCXBvd2VyOwotCXUzMgkJCXVzYWdlOworCXU4IHZhbGlkOworCXU4IHR5cGU7CisJdTMyIGFkZHJlc3M7CisJdTMyIGxhdGVuY3k7CisJdTMyIGxhdGVuY3lfdGlja3M7CisJdTMyIHBvd2VyOworCXUzMiB1c2FnZTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3hfcG9saWN5IHByb21vdGlvbjsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3hfcG9saWN5IGRlbW90aW9uOwogfTsKIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyIHsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKnN0YXRlOwotCXVuc2lnbmVkIGxvbmcJCWJtX2NoZWNrX3RpbWVzdGFtcDsKLQl1MzIJCQlkZWZhdWx0X3N0YXRlOwotCXUzMgkJCWJtX2FjdGl2aXR5OwotCWludAkJCWNvdW50OworCXVuc2lnbmVkIGxvbmcgYm1fY2hlY2tfdGltZXN0YW1wOworCXUzMiBkZWZhdWx0X3N0YXRlOworCXUzMiBibV9hY3Rpdml0eTsKKwlpbnQgY291bnQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4IHN0YXRlc1tBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVJdOwogCiAJLyogdGhlIF9QREMgb2JqZWN0cyBwYXNzZWQgYnkgdGhlIGRyaXZlciwgaWYgYW55ICovCkBAIC03MSw4NSArNzAsODIgQEAKIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KIAogc3RydWN0IGFjcGlfcGN0X3JlZ2lzdGVyIHsKLQl1OAkJCWRlc2NyaXB0b3I7Ci0JdTE2CQkJbGVuZ3RoOwotCXU4CQkJc3BhY2VfaWQ7Ci0JdTgJCQliaXRfd2lkdGg7Ci0JdTgJCQliaXRfb2Zmc2V0OwotCXU4CQkJcmVzZXJ2ZWQ7Ci0JdTY0CQkJYWRkcmVzczsKKwl1OCBkZXNjcmlwdG9yOworCXUxNiBsZW5ndGg7CisJdTggc3BhY2VfaWQ7CisJdTggYml0X3dpZHRoOworCXU4IGJpdF9vZmZzZXQ7CisJdTggcmVzZXJ2ZWQ7CisJdTY0IGFkZHJlc3M7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX3B4IHsKLQlhY3BpX2ludGVnZXIJCWNvcmVfZnJlcXVlbmN5OwkJLyogbWVnYWhlcnR6ICovCi0JYWNwaV9pbnRlZ2VyCQlwb3dlcjsJCQkvKiBtaWxsaVdhdHRzICovCi0JYWNwaV9pbnRlZ2VyCQl0cmFuc2l0aW9uX2xhdGVuY3k7CS8qIG1pY3Jvc2Vjb25kcyAqLwotCWFjcGlfaW50ZWdlcgkJYnVzX21hc3Rlcl9sYXRlbmN5OwkvKiBtaWNyb3NlY29uZHMgKi8KLQlhY3BpX2ludGVnZXIJCWNvbnRyb2w7CQkvKiBjb250cm9sIHZhbHVlICovCi0JYWNwaV9pbnRlZ2VyCQlzdGF0dXM7CQkJLyogc3VjY2VzcyBpbmRpY2F0b3IgKi8KKwlhY3BpX2ludGVnZXIgY29yZV9mcmVxdWVuY3k7CS8qIG1lZ2FoZXJ0eiAqLworCWFjcGlfaW50ZWdlciBwb3dlcjsJLyogbWlsbGlXYXR0cyAqLworCWFjcGlfaW50ZWdlciB0cmFuc2l0aW9uX2xhdGVuY3k7CS8qIG1pY3Jvc2Vjb25kcyAqLworCWFjcGlfaW50ZWdlciBidXNfbWFzdGVyX2xhdGVuY3k7CS8qIG1pY3Jvc2Vjb25kcyAqLworCWFjcGlfaW50ZWdlciBjb250cm9sOwkvKiBjb250cm9sIHZhbHVlICovCisJYWNwaV9pbnRlZ2VyIHN0YXR1czsJLyogc3VjY2VzcyBpbmRpY2F0b3IgKi8KIH07CiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSB7Ci0JdW5zaWduZWQgaW50CQkgc3RhdGU7Ci0JdW5zaWduZWQgaW50CQkgcGxhdGZvcm1fbGltaXQ7CisJdW5zaWduZWQgaW50IHN0YXRlOworCXVuc2lnbmVkIGludCBwbGF0Zm9ybV9saW1pdDsKIAlzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIgY29udHJvbF9yZWdpc3RlcjsKIAlzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIgc3RhdHVzX3JlZ2lzdGVyOwotCXVuc2lnbmVkIGludAkJIHN0YXRlX2NvdW50OworCXVuc2lnbmVkIGludCBzdGF0ZV9jb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcHggKnN0YXRlczsKIAogCS8qIHRoZSBfUERDIG9iamVjdHMgcGFzc2VkIGJ5IHRoZSBkcml2ZXIsIGlmIGFueSAqLwogCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGM7CiB9OwogCi0KLQogLyogVGhyb3R0bGluZyBDb250cm9sICovCiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl90eCB7Ci0JdTE2CQkJcG93ZXI7Ci0JdTE2CQkJcGVyZm9ybWFuY2U7CisJdTE2IHBvd2VyOworCXUxNiBwZXJmb3JtYW5jZTsKIH07CiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nIHsKLQlpbnQJCQlzdGF0ZTsKLQl1MzIJCQlhZGRyZXNzOwotCXU4CQkJZHV0eV9vZmZzZXQ7Ci0JdTgJCQlkdXR5X3dpZHRoOwotCWludAkJCXN0YXRlX2NvdW50OworCWludCBzdGF0ZTsKKwl1MzIgYWRkcmVzczsKKwl1OCBkdXR5X29mZnNldDsKKwl1OCBkdXR5X3dpZHRoOworCWludCBzdGF0ZV9jb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfdHggc3RhdGVzW0FDUElfUFJPQ0VTU09SX01BWF9USFJPVFRMSU5HXTsKIH07CiAKIC8qIExpbWl0IEludGVyZmFjZSAqLwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfbHggewotCWludAkJCXB4OwkJLyogcGVyZm9ybWFjZSBzdGF0ZSAqLwkKLQlpbnQJCQl0eDsJCS8qIHRocm90dGxlIGxldmVsICovCisJaW50IHB4OwkJCS8qIHBlcmZvcm1hY2Ugc3RhdGUgKi8KKwlpbnQgdHg7CQkJLyogdGhyb3R0bGUgbGV2ZWwgKi8KIH07CiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9saW1pdCB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2x4IHN0YXRlOwkJLyogY3VycmVudCBsaW1pdCAqLworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9seCBzdGF0ZTsJLyogY3VycmVudCBsaW1pdCAqLwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9seCB0aGVybWFsOwkvKiB0aGVybWFsIGxpbWl0ICovCi0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2x4IHVzZXI7CQkvKiB1c2VyIGxpbWl0ICovCisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2x4IHVzZXI7CS8qIHVzZXIgbGltaXQgKi8KIH07CiAKLQogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzIHsKLQl1OAkJCXBvd2VyOjE7Ci0JdTgJCQlwZXJmb3JtYW5jZToxOwotCXU4CQkJdGhyb3R0bGluZzoxOwotCXU4CQkJbGltaXQ6MTsKLQl1OAkJCWJtX2NvbnRyb2w6MTsKLQl1OAkJCWJtX2NoZWNrOjE7Ci0JdTgJCQloYXNfY3N0OjE7Ci0JdTgJCQlwb3dlcl9zZXR1cF9kb25lOjE7CisJdTggcG93ZXI6MTsKKwl1OCBwZXJmb3JtYW5jZToxOworCXU4IHRocm90dGxpbmc6MTsKKwl1OCBsaW1pdDoxOworCXU4IGJtX2NvbnRyb2w6MTsKKwl1OCBibV9jaGVjazoxOworCXU4IGhhc19jc3Q6MTsKKwl1OCBwb3dlcl9zZXR1cF9kb25lOjE7CiB9OwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JdTMyCQkJYWNwaV9pZDsKLQl1MzIJCQlpZDsKLQl1MzIJCQlwYmxrOwotCWludAkJCXBlcmZvcm1hbmNlX3BsYXRmb3JtX2xpbWl0OworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1MzIgYWNwaV9pZDsKKwl1MzIgaWQ7CisJdTMyIHBibGs7CisJaW50IHBlcmZvcm1hbmNlX3BsYXRmb3JtX2xpbWl0OwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyBmbGFnczsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgcG93ZXI7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmb3JtYW5jZTsKQEAgLTE1OCw1MCArMTU0LDQ5IEBACiB9OwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZXJyYXRhIHsKLQl1OAkJCXNtcDsKKwl1OCBzbXA7CiAJc3RydWN0IHsKLQkJdTgJCQl0aHJvdHRsZToxOwotCQl1OAkJCWZkbWE6MTsKLQkJdTgJCQlyZXNlcnZlZDo2OwotCQl1MzIJCQlibWlzeDsKLQl9CQkJcGlpeDQ7CisJCXU4IHRocm90dGxlOjE7CisJCXU4IGZkbWE6MTsKKwkJdTggcmVzZXJ2ZWQ6NjsKKwkJdTMyIGJtaXN4OworCX0gcGlpeDQ7CiB9OwogCi1leHRlcm4gaW50IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlICgKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKiBwZXJmb3JtYW5jZSwKLQl1bnNpZ25lZCBpbnQgY3B1KTsKLWV4dGVybiB2b2lkIGFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UgKAotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqIHBlcmZvcm1hbmNlLAotCXVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIGludCBhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UKKwkJCQkJICAgICAgICpwZXJmb3JtYW5jZSwgdW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKHN0cnVjdAorCQkJCQkJICBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQorCQkJCQkJICAqcGVyZm9ybWFuY2UsCisJCQkJCQkgIHVuc2lnbmVkIGludCBjcHUpOwogCiAvKiBub3RlOiB0aGlzIGxvY2tzIGJvdGggdGhlIGNhbGxpbmcgbW9kdWxlIGFuZCB0aGUgcHJvY2Vzc29yIG1vZHVsZQogICAgICAgICAgaWYgYSBfUFBDIG9iamVjdCBleGlzdHMsIHJtbW9kIGlzIGRpc2FsbG93ZWQgdGhlbiAqLwogaW50IGFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oc3RydWN0IG1vZHVsZSAqY2FsbGluZ19tb2R1bGUpOwogCi0KLQogLyogZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBtdWx0aXBsZSBwYXJ0cyBvZiB0aGUgcHJvY2Vzc29yIGtlcm5lbCBtb2R1bGUgKi8KLWV4dGVybiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IJKnByb2Nlc3NvcnNbTlJfQ1BVU107CitleHRlcm4gc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcm9jZXNzb3JzW05SX0NQVVNdOwogZXh0ZXJuIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9lcnJhdGEgZXJyYXRhOwogCiBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjX2luKTsKKwkJCSAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4pOwogCiAjaWZkZWYgQVJDSF9IQVNfUE9XRVJfUERDX0lOSVQKIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwb3csCi0JCXVuc2lnbmVkIGludCBjcHUpOworCQkJCSAgIHVuc2lnbmVkIGludCBjcHUpOwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyAqZmxhZ3MsCi0JCXVuc2lnbmVkIGludCBjcHUpOworCQkJCQl1bnNpZ25lZCBpbnQgY3B1KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoCi0JCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlciAqcG93LCB1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcgorCQkJCQkJICpwb3csIHVuc2lnbmVkIGludCBjcHUpCiB7CiAJcG93LT5wZGMgPSBOVUxMOwogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soCi0JCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9mbGFncyAqZmxhZ3MsIHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjayhzdHJ1Y3QKKwkJCQkJCSAgICAgIGFjcGlfcHJvY2Vzc29yX2ZsYWdzCisJCQkJCQkgICAgICAqZmxhZ3MsIHVuc2lnbmVkIGludCBjcHUpCiB7CiAJZmxhZ3MtPmJtX2NoZWNrID0gMTsKIAlyZXR1cm47CkBAIC0yMTUsNTEgKzIxMCw2MiBAQAogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfZXhpdCh2b2lkKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19pbml0KHZvaWQpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2V4aXQodm9pZCkgeyByZXR1cm47IH0KLXN0YXRpYyBpbmxpbmUgaW50IGFjcGlfcHJvY2Vzc29yX3BwY19oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKSB7CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQodm9pZCkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2V4aXQodm9pZCkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIGludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3sKIAlzdGF0aWMgdW5zaWduZWQgaW50IHByaW50b3V0ID0gMTsKIAlpZiAocHJpbnRvdXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogUHJvY2Vzc29yIFBsYXRmb3JtIExpbWl0IGV2ZW50IGRldGVjdGVkLCBidXQgbm90IGhhbmRsZWQuXG4iKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ29uc2lkZXIgY29tcGlsaW5nIENQVWZyZXEgc3VwcG9ydCBpbnRvIHlvdXIga2VybmVsLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJXYXJuaW5nOiBQcm9jZXNzb3IgUGxhdGZvcm0gTGltaXQgZXZlbnQgZGV0ZWN0ZWQsIGJ1dCBub3QgaGFuZGxlZC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiQ29uc2lkZXIgY29tcGlsaW5nIENQVWZyZXEgc3VwcG9ydCBpbnRvIHlvdXIga2VybmVsLlxuIik7CiAJCXByaW50b3V0ID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0NQVV9GUkVRICovCisjZW5kaWYJCQkJLyogQ09ORklHX0NQVV9GUkVRICovCiAKIC8qIGluIHByb2Nlc3Nvcl90aHJvdHRsaW5nLmMgKi8KLWludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19pbmZvIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKLWludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgaW50IHN0YXRlKTsKLXNzaXplX3QgYWNwaV9wcm9jZXNzb3Jfd3JpdGVfdGhyb3R0bGluZyAoCi0gICAgICAgIHN0cnVjdCBmaWxlCQkqZmlsZSwKLSAgICAgICAgY29uc3QgY2hhcgkJX191c2VyICpidWZmZXIsCi0gICAgICAgIHNpemVfdAkJCWNvdW50LAotICAgICAgICBsb2ZmX3QJCQkqZGF0YSk7CitpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKK2ludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpOworc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfZm9wczsKIAogLyogaW4gcHJvY2Vzc29yX2lkbGUuYyAqLwotaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotaW50IGFjcGlfcHJvY2Vzc29yX2NzdF9oYXNfY2hhbmdlZCAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7Ci1pbnQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfZXhpdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci0KK2ludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitpbnQgYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOworaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2V4aXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogLyogaW4gcHJvY2Vzc29yX3RoZXJtYWwuYyAqLwotaW50IGFjcGlfcHJvY2Vzc29yX2dldF9saW1pdF9pbmZvIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKLXNzaXplX3QgYWNwaV9wcm9jZXNzb3Jfd3JpdGVfbGltaXQgKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQljb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZmZlciwKLQlzaXplX3QJCQljb3VudCwKLQlsb2ZmX3QJCQkqZGF0YSk7CitpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X2xpbWl0X2luZm8oc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7Citzc2l6ZV90IGFjcGlfcHJvY2Vzc29yX3dyaXRlX2xpbWl0KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSk7CiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl9saW1pdF9mb3BzOwogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2luaXQodm9pZCk7CiB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2V4aXQodm9pZCk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2luaXQodm9pZCkgeyByZXR1cm47IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KHZvaWQpIHsgcmV0dXJuOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5pdCh2b2lkKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KHZvaWQpCit7CisJcmV0dXJuOworfQogI2VuZGlmCiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmZlODgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9hdXh2ZWMuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9fQVNNX0FMUEhBX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX0FMUEhBX0FVWFZFQ19ICisKKy8qIFJlc2VydmUgdGhlc2UgbnVtYmVycyBmb3IgYW55IGZ1dHVyZSB1c2Ugb2YgYSBWRFNPLiAgKi8KKyNpZiAwCisjZGVmaW5lIEFUX1NZU0lORk8JCTMyCisjZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkJMzMKKyNlbmRpZgorCisvKiBNb3JlIGNvbXBsZXRlIGNhY2hlIGRlc2NyaXB0aW9ucyB0aGFuIEFUX1tESVVdQ0FDSEVCU0laRS4gIElmIHRoZQorICAgdmFsdWUgaXMgLTEsIHRoZW4gdGhlIGNhY2hlIGRvZXNuJ3QgZXhpc3QuICBPdGhlcndpc2U6CisKKyAgICAgIGJpdCAwLTM6CSAgQ2FjaGUgc2V0LWFzc29jaWF0aXZpdHk7IDAgbWVhbnMgZnVsbHkgYXNzb2NpYXRpdmUuCisgICAgICBiaXQgNC03OgkgIExvZzIgb2YgY2FjaGVsaW5lIHNpemUuCisgICAgICBiaXQgOC0zMToJICBTaXplIG9mIHRoZSBlbnRpcmUgY2FjaGUgPj4gOC4KKyAgICAgIGJpdCAzMi02MzogIFJlc2VydmVkLgorKi8KKworI2RlZmluZSBBVF9MMUlfQ0FDSEVTSEFQRQkzNAorI2RlZmluZSBBVF9MMURfQ0FDSEVTSEFQRQkzNQorI2RlZmluZSBBVF9MMl9DQUNIRVNIQVBFCTM2CisjZGVmaW5lIEFUX0wzX0NBQ0hFU0hBUEUJMzcKKworI2VuZGlmIC8qIF9fQVNNX0FMUEhBX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9lbGYuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2VsZi5oCmluZGV4IGU5NGE5NDUuLjZjMmQ3OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2VsZi5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX0FTTV9BTFBIQV9FTEZfSAogI2RlZmluZSBfX0FTTV9BTFBIQV9FTEZfSAogCisjaW5jbHVkZSA8YXNtL2F1eHZlYy5oPgorCiAvKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwogCiAjZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCkBAIC0xNDIsMjYgKzE0NCw2IEBACiAJOiBhbWFzayAoQU1BU0tfQ0lYKSA/ICJldjYiIDogImV2NjciKTsJXAogfSkKIAotLyogUmVzZXJ2ZSB0aGVzZSBudW1iZXJzIGZvciBhbnkgZnV0dXJlIHVzZSBvZiBhIFZEU08uICAqLwotI2lmIDAKLSNkZWZpbmUgQVRfU1lTSU5GTwkJMzIKLSNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMwotI2VuZGlmCi0KLS8qIE1vcmUgY29tcGxldGUgY2FjaGUgZGVzY3JpcHRpb25zIHRoYW4gQVRfW0RJVV1DQUNIRUJTSVpFLiAgSWYgdGhlCi0gICB2YWx1ZSBpcyAtMSwgdGhlbiB0aGUgY2FjaGUgZG9lc24ndCBleGlzdC4gIE90aGVyd2lzZToKLQotICAgICAgYml0IDAtMzoJICBDYWNoZSBzZXQtYXNzb2NpYXRpdml0eTsgMCBtZWFucyBmdWxseSBhc3NvY2lhdGl2ZS4KLSAgICAgIGJpdCA0LTc6CSAgTG9nMiBvZiBjYWNoZWxpbmUgc2l6ZS4KLSAgICAgIGJpdCA4LTMxOgkgIFNpemUgb2YgdGhlIGVudGlyZSBjYWNoZSA+PiA4LgotICAgICAgYml0IDMyLTYzOiAgUmVzZXJ2ZWQuCi0qLwotCi0jZGVmaW5lIEFUX0wxSV9DQUNIRVNIQVBFCTM0Ci0jZGVmaW5lIEFUX0wxRF9DQUNIRVNIQVBFCTM1Ci0jZGVmaW5lIEFUX0wyX0NBQ0hFU0hBUEUJMzYKLSNkZWZpbmUgQVRfTDNfQ0FDSEVTSEFQRQkzNwotCiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShFWCwgSUJDUzIpCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9mY250bC5oCmluZGV4IDZiN2Q2YzEuLjg3ZjJjZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvZmNudGwuaApAQCAtMywxMCArMyw2IEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAwMAotI2RlZmluZSBPX1dST05MWQkgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgMDIKICNkZWZpbmUgT19DUkVBVAkJIDAxMDAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX1RSVU5DCQkgMDIwMDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fRVhDTAkJIDA0MDAwCS8qIG5vdCBmY250bCAqLwpAQCAtMTQsMjAgKzEwLDEzIEBACiAKICNkZWZpbmUgT19OT05CTE9DSwkgMDAwMDQKICNkZWZpbmUgT19BUFBFTkQJIDAwMDEwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKICNkZWZpbmUgT19TWU5DCQkwNDAwMDAKLSNkZWZpbmUgRkFTWU5DCQkwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkwMTAwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgT19OT0ZPTExPVwkwMjAwMDAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkwNDAwMDAwIC8qIHdpbGwgYmUgc2V0IGJ5IHRoZSBrZXJuZWwgb24gZXZlcnkgb3BlbiAqLwogI2RlZmluZSBPX0RJUkVDVAkwMjAwMDAwMCAvKiBkaXJlY3QgZGlzayBhY2Nlc3MgLSBzaG91bGQgY2hlY2sgd2l0aCBPU0YvMSAqLwogI2RlZmluZSBPX05PQVRJTUUJMDQwMDAwMDAKIAotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0ICAgICAgIC8qIHNldCBmaWxlLT5mX2ZsYWdzICovCiAjZGVmaW5lIEZfR0VUTEsJCTcKICNkZWZpbmUgRl9TRVRMSwkJOAogI2RlZmluZSBGX1NFVExLVwk5CkBAIC0zNyw5ICsyNiw2IEBACiAjZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwogCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KIC8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCiAjZGVmaW5lIEZfUkRMQ0sJCTEKICNkZWZpbmUgRl9XUkxDSwkJMgpAQCAtNTEsMjUgKzM3LDYgQEAKIAogI2RlZmluZSBGX0lOUFJPR1JFU1MJNjQKIAotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTUFORCAgICAgIDMyICAgICAgLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQgICAgICA2NCAgICAgIC8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURSAgICAgMTI4ICAgICAvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXICAgICAgICAxOTIgICAgIC8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0gCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlfX2tlcm5lbF9vZmZfdCBsX3N0YXJ0OwotCV9fa2VybmVsX29mZl90IGxfbGVuOwotCV9fa2VybmVsX3BpZF90IGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UgIDEwMjQKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1hbHBoYS9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2ZkMWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGNpLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaAppbmRleCBmNjgxZTY3Li40ZTExNWYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaApAQCAtMjU0LDYgKzI1NCwxOSBAQAogZXh0ZXJuIHZvaWQgcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCQkJICAgIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKgorcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IHJlc291cmNlICpyb290ID0gTlVMTDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKworCXJldHVybiByb290OworfQorCiAjZGVmaW5lIHBjaV9kb21haW5fbnIoYnVzKSAoKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKShidXMpLT5zeXNkYXRhKS0+aW5kZXgKIAogc3RhdGljIGlubGluZSBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tYWxwaGEvc3BpbmxvY2suaAppbmRleCA4MDc4MGRiYS4uODE5N2M2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9zcGlubG9jay5oCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAKLQogLyoKICAqIFNpbXBsZSBzcGluIGxvY2sgb3BlcmF0aW9ucy4gIFRoZXJlIGFyZSB0d28gdmFyaWFudHMsIG9uZSBjbGVhcnMgSVJRJ3MKICAqIG9uIHRoZSBsb2NhbCBwcm9jZXNzb3IsIG9uZSBkb2VzIG5vdC4KQEAgLTE0LDQzICsxMywxOCBAQAogICogV2UgbWFrZSBubyBmYWlybmVzcyBhc3N1bXB0aW9ucy4gVGhleSBoYXZlIGEgY29zdC4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JaW50IG9uX2NwdTsKLQlpbnQgbGluZV9ubzsKLQl2b2lkICpwcmV2aW91czsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrOwotCWNvbnN0IGNoYXIgKmJhc2VfZmlsZTsKLSNlbmRpZgotfSBzcGlubG9ja190OworI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQoeCkgXAorCQlkbyB7IGNwdV9yZWxheCgpOyB9IHdoaWxlICgoeCktPmxvY2spCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECShzcGlubG9ja190KXsgMCwgLTEsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfQotI2Vsc2UKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECShzcGlubG9ja190KXsgMCB9Ci0jZW5kaWYKLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkJKCh4KS0+bG9jayAhPSAwKQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KHgpCWRvIHsgYmFycmllcigpOyB9IHdoaWxlICgoeCktPmxvY2spCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLWV4dGVybiB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqIGxvY2spOwotZXh0ZXJuIHZvaWQgZGVidWdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKiBsb2NrLCBjb25zdCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IGRlYnVnX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICogbG9jaywgY29uc3QgY2hhciAqLCBpbnQpOwotI2RlZmluZSBfcmF3X3NwaW5fbG9jayhMT0NLKSBcCi0JZGVidWdfc3Bpbl9sb2NrKExPQ0ssIF9fQkFTRV9GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhMT0NLKSBcCi0JZGVidWdfc3Bpbl90cnlsb2NrKExPQ0ssIF9fQkFTRV9GSUxFX18sIF9fTElORV9fKQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICogbG9jaykKIHsKIAltYigpOwogCWxvY2stPmxvY2sgPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqIGxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICogbG9jaykKIHsKIAlsb25nIHRtcDsKIApAQCAtNzAsMzkgKzQ0LDQ0IEBACiAJOiAibSIobG9jay0+bG9jaykgOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJcmV0dXJuICF0ZXN0X2FuZF9zZXRfYml0KDAsICZsb2NrLT5sb2NrKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfU1BJTkxPQ0sgKi8KLQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQJKHJ3bG9ja190KXsgMCB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotc3RhdGljIGlubGluZSBpbnQgcmVhZF9jYW5fbG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfY2FuX2xvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCXJldHVybiAobG9jay0+bG9jayAmIDEpID09IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHdyaXRlX2Nhbl9sb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfY2FuX2xvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCXJldHVybiBsb2NrLT5sb2NrID09IDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUldMT0NLCi1leHRlcm4gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKiBsb2NrKTsKLWV4dGVybiB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICogbG9jayk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqIGxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKK3sKKwlsb25nIHJlZ3g7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGRsX2wJJTEsJTBcbiIKKwkiCWJsYnMJJTEsNmZcbiIKKwkiCXN1YmwJJTEsMiwlMVxuIgorCSIJc3RsX2MJJTEsJTBcbiIKKwkiCWJlcQklMSw2ZlxuIgorCSIJbWJcbiIKKwkiLnN1YnNlY3Rpb24gMlxuIgorCSI2OglsZGwJJTEsJTBcbiIKKwkiCWJsYnMJJTEsNmJcbiIKKwkiCWJyCTFiXG4iCisJIi5wcmV2aW91cyIKKwk6ICI9bSIgKCpsb2NrKSwgIj0mciIgKHJlZ3gpCisJOiAibSIgKCpsb2NrKSA6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCWxvbmcgcmVneDsKIApAQCAtMTIyLDI4ICsxMDEsNyBAQAogCTogIm0iICgqbG9jaykgOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqIGxvY2spCi17Ci0JbG9uZyByZWd4OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIjE6CWxkbF9sCSUxLCUwXG4iCi0JIglibGJzCSUxLDZmXG4iCi0JIglzdWJsCSUxLDIsJTFcbiIKLQkiCXN0bF9jCSUxLCUwXG4iCi0JIgliZXEJJTEsNmZcbiIKLQkiCW1iXG4iCi0JIi5zdWJzZWN0aW9uIDJcbiIKLQkiNjoJbGRsCSUxLCUwXG4iCi0JIglibGJzCSUxLDZiXG4iCi0JIglicgkxYlxuIgotCSIucHJldmlvdXMiCi0JOiAiPW0iICgqbG9jayksICI9JnIiIChyZWd4KQotCTogIm0iICgqbG9jaykgOiAibWVtb3J5Iik7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1JXTE9DSyAqLwotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqIGxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICogbG9jaykKIHsKIAlsb25nIHJlZ3g7CiAJaW50IHN1Y2Nlc3M7CkBAIC0xNjUsNyArMTIzLDcgQEAKIAlyZXR1cm4gc3VjY2VzczsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICogbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICogbG9jaykKIHsKIAlsb25nIHJlZ3g7CiAJaW50IHN1Y2Nlc3M7CkBAIC0xODcsMTMgKzE0NSw3IEBACiAJcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqIGxvY2spCi17Ci0JbWIoKTsKLQlsb2NrLT5sb2NrID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKiBsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqIGxvY2spCiB7CiAJbG9uZyByZWd4OwogCV9fYXNtX18gX192b2xhdGlsZV9fKApAQCAtMjA5LDQgKzE2MSwxMCBAQAogCTogIm0iICgqbG9jaykgOiAibWVtb3J5Iik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICogbG9jaykKK3sKKwltYigpOworCWxvY2stPmxvY2sgPSAwOworfQorCiAjZW5kaWYgLyogX0FMUEhBX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDFlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0FMUEhBX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX0FMUEhBX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3VhY2Nlc3MuaAppbmRleCA0YzM5ZWU3Li4yMmRlM2I0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvdWFjY2Vzcy5oCkBAIC00OCwxMiArNDgsNiBAQAogCV9fYWNjZXNzX29rKCgodW5zaWduZWQgbG9uZykoYWRkcikpLChzaXplKSxnZXRfZnMoKSk7CVwKIH0pCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotZXh0ZXJuIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogVGhlc2UgYXJlIHRoZSBtYWluIHNpbmdsZS12YWx1ZSB0cmFuc2ZlciByb3V0aW5lcy4gIFRoZXkgYXV0b21hdGljYWxseQogICogdXNlIHRoZSByaWdodCBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQgcG9pbnRlciB0eXBlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oNC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oNC5oCmluZGV4IDc5MTM4ZGNmLi5kNjRlZTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWg0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oNC5oCkBAIC0zMCw2ICszMCw5IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfT01BUF9INF9ICiAKIC8qIFBsYWNlaG9sZGVyIGZvciBINCBzcGVjaWZpYyBkZWZpbmVzICovCisvKiBHUE1DIENTMSAqLworI2RlZmluZSBPTUFQMjRYWF9FVEhSX1NUQVJUICAgICAgICAgICAgIDB4MDgwMDAzMDAKKyNkZWZpbmUgT01BUDI0WFhfRVRIUl9HUElPX0lSUQkJOTIKIAogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVBfSDRfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWlubm92YXRvci5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1pbm5vdmF0b3IuaAppbmRleCAwZjFhYmFlLi43OTU3NGUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWlubm92YXRvci5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmgKQEAgLTM2LDMxICszNiw2IEBACiAjZGVmaW5lIE9NQVAxNTEwUDFfRU1JRlNfUFJJX1ZBTFVFCQkweDAwCiAjZGVmaW5lIE9NQVAxNTEwUDFfRU1JRkZfUFJJX1ZBTFVFCQkweDAwCiAKLS8qCi0gKiBUaGVzZSBkZWZpbml0aW9ucyBkZWZpbmUgYW4gYXJlYSBvZiBGTEFTSCBzZXQgYXNpZGUKLSAqIGZvciB0aGUgdXNlIG9mIE1URC9KRkZTMi4gVGhpcyBpcyB0aGUgYXJlYSBvZiBmbGFzaAotICogdGhhdCBhIEpGRlMyIGZpbGVzeXN0ZW0gd2lsbCByZXNpZGUgd2hpY2ggaXMgbW91bnRlZAotICogYXQgYm9vdCB3aXRoIHRoZSAicm9vdD0vZGV2L210ZGJsb2NrLzAgcnciCi0gKiBjb21tYW5kIGxpbmUgb3B0aW9uLiBUaGUgZmxhc2ggYWRkcmVzcyB1c2VkIGhlcmUgbXVzdAotICogZmFsbCB3aXRoaW4gdGhlIGxlZ2FsIHJhbmdlIGRlZmluZWQgYnkgcnJsb2FkIGZvciBzdG9yaW5nCi0gKiB0aGUgZmlsZXN5c3RlbSBjb21wb25lbnQuIFRoaXMgYWRkcmVzcyB3aWxsIGJlIHN1ZmZpY2llbnRseQotICogZGVlcCBpbnRvIHRoZSBvdmVyYWxsIGZsYXNoIHJhbmdlIHRvIGF2b2lkIHRoZSBvdGhlcgotICogY29tcG9uZW50cyBhbHNvIHN0b3JlZCBpbiBmbGFzaCBzdWNoIGFzIHRoZSBib290bG9hZGVyLAotICogdGhlIGJvb3Rsb2FkZXIgcGFyYW1zLCBhbmQgdGhlIGtlcm5lbC4KLSAqIFRoZSBTVzIgc2V0dGluZ3MgZm9yIHRoZSBtYXAgYmVsb3cgYXJlOgotICogMSBvZmYsIDIgb2ZmLCAzIG9uLCA0IG9mZi4KLSAqLwotCi0vKiBJbnRlbCBmbGFzaF8wLCBwYXJ0aXRpb25lZCBhcyBleHBlY3RlZCBieSBycmxvYWQgKi8KLSNkZWZpbmUgT01BUF9GTEFTSF8wX0JBU0UJMHhEODAwMDAwMAotI2RlZmluZSBPTUFQX0ZMQVNIXzBfU1RBUlQJMHgwMDAwMDAwMAotI2RlZmluZSBPTUFQX0ZMQVNIXzBfU0laRQlTWl8xNk0KLQotLyogSW50ZWwgZmxhc2hfMSwgdXNlZCBmb3IgY3JhbWZzIG9yIG90aGVyIGZsYXNoIGZpbGUgc3lzdGVtcyAqLwotI2RlZmluZSBPTUFQX0ZMQVNIXzFfQkFTRQkweEQ5MDAwMDAwCi0jZGVmaW5lIE9NQVBfRkxBU0hfMV9TVEFSVAkweDAxMDAwMDAwCi0jZGVmaW5lIE9NQVBfRkxBU0hfMV9TSVpFCVNaXzE2TQotCiAjZGVmaW5lIE5SX0ZQR0FfSVJRUwkJMjQKICNkZWZpbmUgTlJfSVJRUyAgICAgICAgICAgICAgICAgSUhfQk9BUkRfQkFTRSArIE5SX0ZQR0FfSVJRUwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLXBlcnNldXMyLmgKaW5kZXggMGMyMjRjYy4uNjkxZTUyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtcGVyc2V1czIuaApAQCAtMzYsMjMgKzM2LDE0IEBACiAjZGVmaW5lIE9NQVBfU0RSQU1fREVWSUNFCQlEMjU2TV8xWDE2XzRCCiAjZW5kaWYKIAotLyoKLSAqIFRoZXNlIGRlZmluaXRpb25zIGRlZmluZSBhbiBhcmVhIG9mIEZMQVNIIHNldCBhc2lkZQotICogZm9yIHRoZSB1c2Ugb2YgTVREL0pGRlMyLiBUaGlzIGlzIHRoZSBhcmVhIG9mIGZsYXNoCi0gKiB0aGF0IGEgSkZGUzIgZmlsZXN5c3RlbSB3aWxsIHJlc2lkZSB3aGljaCBpcyBtb3VudGVkCi0gKiBhdCBib290IHdpdGggdGhlICJyb290PS9kZXYvbXRkYmxvY2svMCBydyIKLSAqIGNvbW1hbmQgbGluZSBvcHRpb24uCi0gKi8KLQotLyogSW50ZWwgZmxhc2hfMCwgcGFydGl0aW9uZWQgYXMgZXhwZWN0ZWQgYnkgcnJsb2FkICovCi0jZGVmaW5lIE9NQVBfRkxBU0hfMF9CQVNFCTB4RDgwMDAwMDAJLyogVkEgKi8KLSNkZWZpbmUgT01BUF9GTEFTSF8wX1NUQVJUCTB4MDAwMDAwMDAJLyogUEEgKi8KLSNkZWZpbmUgT01BUF9GTEFTSF8wX1NJWkUJU1pfMzJNCi0KICNkZWZpbmUgTUFYSVJRTlVNCQlJSF9CT0FSRF9CQVNFCiAjZGVmaW5lIE1BWEZJUU5VTQkJTUFYSVJRTlVNCiAjZGVmaW5lIE1BWFNXSU5VTQkJTUFYSVJRTlVNCiAKICNkZWZpbmUgTlJfSVJRUwkJCShNQVhJUlFOVU0gKyAxKQogCisvKiBTYW1zdW5nIE5BTkQgZmxhc2ggYXQgQ1MyQiBvciBDUzMoTkFORCBCb290KSAqLworI2RlZmluZSBPTUFQX05BTkRfRkxBU0hfU1RBUlQxCSAgIDB4MEEwMDAwMDAgLyogQ1MyQiAqLworI2RlZmluZSBPTUFQX05BTkRfRkxBU0hfU1RBUlQyCSAgIDB4MEMwMDAwMDAgLyogQ1MzICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmgKaW5kZXggMzM5NzdiOC4uZWQ2ZDM0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC12b2ljZWJsdWUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5oCkBAIC0xMSwxMSArMTEsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1ZPSUNFQkxVRV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfVk9JQ0VCTFVFX0gKIAotI2lmIChFWFRFUk5BTF9NQVhfTlJfUE9SVFMgPCA0KQotI3VuZGVmIEVYVEVSTkFMX01BWF9OUl9QT1JUUwotI2RlZmluZSBFWFRFUk5BTF9NQVhfTlJfUE9SVFMJNAotI2VuZGlmCi0KIGV4dGVybiB2b2lkIHZvaWNlYmx1ZV93ZHRfZW5hYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgdm9pY2VibHVlX3dkdF9kaXNhYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgdm9pY2VibHVlX3dkdF9waW5nKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oCmluZGV4IDk1YmQ2MjUuLmEwMDQwY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmgKQEAgLTMwLDEwICszMCwyMyBAQAogCXU4IHN5c3RlbV9jbG9ja190eXBlOwogfTsKIAorc3RydWN0IG9tYXBfbW1jX2NvbmYgeworCXVuc2lnbmVkIGVuYWJsZWQ6MTsKKwkvKiBub211eCBtZWFucyAic3RhbmRhcmQiIG11eGluZyBpcyB3cm9uZyBvbiB0aGlzIGJvYXJkLCBhbmQgdGhhdAorCSAqIGJvYXJkLXNwZWNpZmljIGNvZGUgaGFuZGxlZCBpdCBiZWZvcmUgY29tbW9uIGluaXQgbG9naWMuCisJICovCisJdW5zaWduZWQgbm9tdXg6MTsKKwkvKiBzd2l0Y2ggcGluIGNhbiBiZSBmb3IgY2FyZCBkZXRlY3QgKGRlZmF1bHQpIG9yIGNhcmQgY292ZXIgKi8KKwl1bnNpZ25lZCBjb3ZlcjoxOworCS8qIDQgd2lyZSBzaWduYWxpbmcgaXMgb3B0aW9uYWwsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFNEL1NESU8gKi8KKwl1bnNpZ25lZCB3aXJlNDoxOworCXMxNiBwb3dlcl9waW47CisJczE2IHN3aXRjaF9waW47CisJczE2IHdwX3BpbjsKK307CisKIHN0cnVjdCBvbWFwX21tY19jb25maWcgewotCXU4IG1tY19ibG9ja3M7Ci0JczE2IG1tYzFfcG93ZXJfcGluLCBtbWMyX3Bvd2VyX3BpbjsKLQlzMTYgbW1jMV9zd2l0Y2hfcGluLCBtbWMyX3N3aXRjaF9waW47CisJc3RydWN0IG9tYXBfbW1jX2NvbmYgbW1jWzJdOwogfTsKIAogc3RydWN0IG9tYXBfc2VyaWFsX2NvbnNvbGVfY29uZmlnIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY3B1LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2NwdS5oCmluZGV4IGU4Nzg2NzEuLjExMTllMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY3B1LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jcHUuaApAQCAtMzgsMTQ2ICszOCwxNzkgQEAKIC8qCiAgKiBUZXN0IGlmIG11bHRpY29yZSBPTUFQIHN1cHBvcnQgaXMgbmVlZGVkCiAgKi8KLSN1bmRlZiBNVUxUSV9PTUFQCisjdW5kZWYgTVVMVElfT01BUDEKKyN1bmRlZiBNVUxUSV9PTUFQMgogI3VuZGVmIE9NQVBfTkFNRQogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAogIyBpZmRlZiBPTUFQX05BTUUKLSMgIHVuZGVmICBNVUxUSV9PTUFQCi0jICBkZWZpbmUgTVVMVElfT01BUAorIyAgdW5kZWYgIE1VTFRJX09NQVAxCisjICBkZWZpbmUgTVVMVElfT01BUDEKICMgZWxzZQogIyAgZGVmaW5lIE9NQVBfTkFNRSBvbWFwNzMwCiAjIGVuZGlmCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAogIyBpZmRlZiBPTUFQX05BTUUKLSMgIHVuZGVmICBNVUxUSV9PTUFQCi0jICBkZWZpbmUgTVVMVElfT01BUAorIyAgdW5kZWYgIE1VTFRJX09NQVAxCisjICBkZWZpbmUgTVVMVElfT01BUDEKICMgZWxzZQogIyAgZGVmaW5lIE9NQVBfTkFNRSBvbWFwMTUxMAogIyBlbmRpZgogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKICMgaWZkZWYgT01BUF9OQU1FCi0jICB1bmRlZiAgTVVMVElfT01BUAotIyAgZGVmaW5lIE1VTFRJX09NQVAKKyMgIHVuZGVmICBNVUxUSV9PTUFQMQorIyAgZGVmaW5lIE1VTFRJX09NQVAxCiAjIGVsc2UKLSMgIGRlZmluZSBPTUFQX05BTUUgb21hcDE2MTAKKyMgIGRlZmluZSBPTUFQX05BTUUgb21hcDE2eHgKICMgZW5kaWYKICNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCi0jIGlmZGVmIE9NQVBfTkFNRQotIyAgdW5kZWYgIE1VTFRJX09NQVAKLSMgIGRlZmluZSBNVUxUSV9PTUFQCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKyMgaWYgKGRlZmluZWQoT01BUF9OQU1FKSB8fCBkZWZpbmVkKE1VTFRJX09NQVAxKSkKKyMgIGVycm9yICJPTUFQMSBhbmQgT01BUDIgY2FuJ3QgYmUgc2VsZWN0ZWQgYXQgdGhlIHNhbWUgdGltZSIKICMgZWxzZQotIyAgZGVmaW5lIE9NQVBfTkFNRSBvbWFwMTcxMAorIyAgdW5kZWYgIE1VTFRJX09NQVAyCisjICBkZWZpbmUgT01BUF9OQU1FIG9tYXAyNHh4CiAjIGVuZGlmCiAjZW5kaWYKIAogLyoKLSAqIEdlbmVyYXRlIHZhcmlvdXMgT01BUCBjcHUgc3BlY2lmaWMgbWFjcm9zLCBhbmQgY3B1IGNsYXNzCi0gKiBzcGVjaWZpYyBtYWNyb3MKKyAqIE1hY3JvcyB0byBncm91cCBPTUFQIGludG8gY3B1IGNsYXNzZXMuCisgKiBUaGVzZSBjYW4gYmUgdXNlZCBpbiBtb3N0IHBsYWNlcy4KKyAqIGNwdV9pc19vbWFwN3h4KCk6CVRydWUgZm9yIE9NQVA3MzAKKyAqIGNwdV9pc19vbWFwMTV4eCgpOglUcnVlIGZvciBPTUFQMTUxMCBhbmQgT01BUDU5MTAKKyAqIGNwdV9pc19vbWFwMTZ4eCgpOglUcnVlIGZvciBPTUFQMTYxMCwgT01BUDU5MTIgYW5kIE9NQVAxNzEwCisgKiBjcHVfaXNfb21hcDI0eHgoKToJVHJ1ZSBmb3IgT01BUDI0MjAKICAqLwotI2RlZmluZSBHRVRfT01BUF9UWVBFCSgoc3lzdGVtX3JldiA+PiAyNCkgJiAweGZmKQogI2RlZmluZSBHRVRfT01BUF9DTEFTUwkoc3lzdGVtX3JldiAmIDB4ZmYpCiAKLSNkZWZpbmUgSVNfT01BUF9UWVBFKHR5cGUsIGlkKQkJCQlcCi1zdGF0aWMgaW5saW5lIGludCBpc19vbWFwICMjdHlwZSAodm9pZCkJCQlcCi17CQkJCQkJCVwKLQlyZXR1cm4gKEdFVF9PTUFQX1RZUEUgPT0gKGlkKSkgPyAxIDogMDsJCVwKLX0KLQogI2RlZmluZSBJU19PTUFQX0NMQVNTKGNsYXNzLCBpZCkJCQlcCiBzdGF0aWMgaW5saW5lIGludCBpc19vbWFwICMjY2xhc3MgKHZvaWQpCQlcCiB7CQkJCQkJCVwKIAlyZXR1cm4gKEdFVF9PTUFQX0NMQVNTID09IChpZCkpID8gMSA6IDA7CVwKIH0KIAotSVNfT01BUF9UWVBFKDczMCwgMHgwNykKLUlTX09NQVBfVFlQRSgxNTEwLCAweDE1KQotSVNfT01BUF9UWVBFKDE2MTAsIDB4MTYpCi1JU19PTUFQX1RZUEUoNTkxMiwgMHgxNikKLUlTX09NQVBfVFlQRSgxNzEwLCAweDE3KQotSVNfT01BUF9UWVBFKDI0MjAsIDB4MjQpCi0KIElTX09NQVBfQ0xBU1MoN3h4LCAweDA3KQogSVNfT01BUF9DTEFTUygxNXh4LCAweDE1KQogSVNfT01BUF9DTEFTUygxNnh4LCAweDE2KQogSVNfT01BUF9DTEFTUygyNHh4LCAweDI0KQogCi0vKgotICogTWFjcm9zIHRvIGdyb3VwIE9NQVAgdHlwZXMgaW50byBjcHUgY2xhc3Nlcy4KLSAqIFRoZXNlIGNhbiBiZSB1c2VkIGluIG1vc3QgcGxhY2VzLgotICogY3B1X2lzX29tYXAxNXh4KCk6CVRydWUgZm9yIDE1MTAgYW5kIDU5MTAKLSAqIGNwdV9pc19vbWFwMTZ4eCgpOglUcnVlIGZvciAxNjEwLCA1OTEyIGFuZCAxNzEwCi0gKi8KLSNpZiBkZWZpbmVkKE1VTFRJX09NQVApCi0jIGRlZmluZSBjcHVfaXNfb21hcDd4eCgpCQlpc19vbWFwN3h4KCkKLSMgZGVmaW5lIGNwdV9pc19vbWFwMTV4eCgpCQlpc19vbWFwMTV4eCgpCi0jIGlmICEoZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTUxMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKSkKLSMgIGRlZmluZSBjcHVfaXNfb21hcDE2eHgoKQkJMQotIyBlbHNlCisjZGVmaW5lIGNwdV9pc19vbWFwN3h4KCkJCTAKKyNkZWZpbmUgY3B1X2lzX29tYXAxNXh4KCkJCTAKKyNkZWZpbmUgY3B1X2lzX29tYXAxNnh4KCkJCTAKKyNkZWZpbmUgY3B1X2lzX29tYXAyNHh4KCkJCTAKKworI2lmIGRlZmluZWQoTVVMVElfT01BUDEpCisjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDd4eAorIyAgZGVmaW5lIGNwdV9pc19vbWFwN3h4KCkJCWlzX29tYXA3eHgoKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNTEwKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwMTV4eAorIyAgZGVmaW5lIGNwdV9pc19vbWFwMTV4eCgpCQlpc19vbWFwMTV4eCgpCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisjICB1bmRlZiAgY3B1X2lzX29tYXAxNnh4CiAjICBkZWZpbmUgY3B1X2lzX29tYXAxNnh4KCkJCWlzX29tYXAxNnh4KCkKICMgZW5kaWYKICNlbHNlCiAjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDd4eAogIyAgZGVmaW5lIGNwdV9pc19vbWFwN3h4KCkJCTEKLSMgZWxzZQotIyAgZGVmaW5lIGNwdV9pc19vbWFwN3h4KCkJCTAKICMgZW5kaWYKICMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTUxMCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDE1eHgKICMgIGRlZmluZSBjcHVfaXNfb21hcDE1eHgoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXAxNXh4KCkJCTAKICMgZW5kaWYKICMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDE2eHgKICMgIGRlZmluZSBjcHVfaXNfb21hcDE2eHgoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXAxNnh4KCkJCTAKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDI0eHgKKyMgIGRlZmluZSBjcHVfaXNfb21hcDI0eHgoKQkJMQogIyBlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKE1VTFRJX09NQVApCi0jIGRlZmluZSBjcHVfaXNfb21hcDczMCgpCQlpc19vbWFwNzMwKCkKLSMgZGVmaW5lIGNwdV9pc19vbWFwMTUxMCgpCQlpc19vbWFwMTUxMCgpCi0jIGRlZmluZSBjcHVfaXNfb21hcDE2MTAoKQkJaXNfb21hcDE2MTAoKQotIyBkZWZpbmUgY3B1X2lzX29tYXA1OTEyKCkJCWlzX29tYXA1OTEyKCkKLSMgZGVmaW5lIGNwdV9pc19vbWFwMTcxMCgpCQlpc19vbWFwMTcxMCgpCi0jZWxzZQorLyoKKyAqIE1hY3JvcyB0byBkZXRlY3QgaW5kaXZpZHVhbCBjcHUgdHlwZXMuCisgKiBUaGVzZSBhcmUgb25seSByYXJlbHkgbmVlZGVkLgorICogY3B1X2lzX29tYXA3MzAoKToJVHJ1ZSBmb3IgT01BUDczMAorICogY3B1X2lzX29tYXAxNTEwKCk6CVRydWUgZm9yIE9NQVAxNTEwCisgKiBjcHVfaXNfb21hcDE2MTAoKToJVHJ1ZSBmb3IgT01BUDE2MTAKKyAqIGNwdV9pc19vbWFwMTYxMSgpOglUcnVlIGZvciBPTUFQMTYxMQorICogY3B1X2lzX29tYXA1OTEyKCk6CVRydWUgZm9yIE9NQVA1OTEyCisgKiBjcHVfaXNfb21hcDE2MjEoKToJVHJ1ZSBmb3IgT01BUDE2MjEKKyAqIGNwdV9pc19vbWFwMTcxMCgpOglUcnVlIGZvciBPTUFQMTcxMAorICogY3B1X2lzX29tYXAyNDIwKCk6CVRydWUgZm9yIE9NQVAyNDIwCisgKi8KKyNkZWZpbmUgR0VUX09NQVBfVFlQRQkoKHN5c3RlbV9yZXYgPj4gMTYpICYgMHhmZmZmKQorCisjZGVmaW5lIElTX09NQVBfVFlQRSh0eXBlLCBpZCkJCQkJXAorc3RhdGljIGlubGluZSBpbnQgaXNfb21hcCAjI3R5cGUgKHZvaWQpCQkJXAorewkJCQkJCQlcCisJcmV0dXJuIChHRVRfT01BUF9UWVBFID09IChpZCkpID8gMSA6IDA7CQlcCit9CisKK0lTX09NQVBfVFlQRSg3MzAsIDB4MDczMCkKK0lTX09NQVBfVFlQRSgxNTEwLCAweDE1MTApCitJU19PTUFQX1RZUEUoMTYxMCwgMHgxNjEwKQorSVNfT01BUF9UWVBFKDE2MTEsIDB4MTYxMSkKK0lTX09NQVBfVFlQRSg1OTEyLCAweDE2MTEpCitJU19PTUFQX1RZUEUoMTYyMSwgMHgxNjIxKQorSVNfT01BUF9UWVBFKDE3MTAsIDB4MTcxMCkKK0lTX09NQVBfVFlQRSgyNDIwLCAweDI0MjApCisKKyNkZWZpbmUgY3B1X2lzX29tYXA3MzAoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE1MTAoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE2MTAoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDU5MTIoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE2MTEoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE2MjEoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDE3MTAoKQkJMAorI2RlZmluZSBjcHVfaXNfb21hcDI0MjAoKQkJMAorCisjaWYgZGVmaW5lZChNVUxUSV9PTUFQMSkKICMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKQotIyAgZGVmaW5lIGNwdV9pc19vbWFwNzMwKCkJCTEKLSMgZWxzZQotIyAgZGVmaW5lIGNwdV9pc19vbWFwNzMwKCkJCTAKKyMgIHVuZGVmICBjcHVfaXNfb21hcDczMAorIyAgZGVmaW5lIGNwdV9pc19vbWFwNzMwKCkJCWlzX29tYXA3MzAoKQogIyBlbmRpZgogIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNTEwKQorIyAgdW5kZWYgIGNwdV9pc19vbWFwMTUxMAorIyAgZGVmaW5lIGNwdV9pc19vbWFwMTUxMCgpCQlpc19vbWFwMTUxMCgpCisjIGVuZGlmCisjZWxzZQorIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApCisjICB1bmRlZiAgY3B1X2lzX29tYXA3MzAKKyMgIGRlZmluZSBjcHVfaXNfb21hcDczMCgpCQkxCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1MTApCisjICB1bmRlZiAgY3B1X2lzX29tYXAxNTEwCiAjICBkZWZpbmUgY3B1X2lzX29tYXAxNTEwKCkJCTEKLSMgZWxzZQotIyAgZGVmaW5lIGNwdV9pc19vbWFwMTUxMCgpCQkwCiAjIGVuZGlmCi0jIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0jICBkZWZpbmUgY3B1X2lzX29tYXAxNjEwKCkJCTEKLSMgZWxzZQotIyAgZGVmaW5lIGNwdV9pc19vbWFwMTYxMCgpCQkwCi0jIGVuZGlmCi0jIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0jICBkZWZpbmUgY3B1X2lzX29tYXA1OTEyKCkJCTEKLSMgZWxzZQotIyAgZGVmaW5lIGNwdV9pc19vbWFwNTkxMigpCQkwCi0jIGVuZGlmCi0jIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisjZW5kaWYKKworLyoKKyAqIFdoZXRoZXIgd2UgaGF2ZSBNVUxUSV9PTUFQMSBvciBub3QsIHdlIHN0aWxsIG5lZWQgdG8gZGlzdGluZ3Vpc2gKKyAqIGJldHdlZW4gMTYxMUIvNTkxMiBhbmQgMTcxMC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisjIHVuZGVmICBjcHVfaXNfb21hcDE2MTAKKyMgdW5kZWYgIGNwdV9pc19vbWFwMTYxMQorIyB1bmRlZiAgY3B1X2lzX29tYXA1OTEyCisjIHVuZGVmICBjcHVfaXNfb21hcDE2MjEKKyMgdW5kZWYgIGNwdV9pc19vbWFwMTcxMAogIyBkZWZpbmUgY3B1X2lzX29tYXAxNjEwKCkJCWlzX29tYXAxNjEwKCkKKyMgZGVmaW5lIGNwdV9pc19vbWFwMTYxMSgpCQlpc19vbWFwMTYxMSgpCiAjIGRlZmluZSBjcHVfaXNfb21hcDU5MTIoKQkJaXNfb21hcDU5MTIoKQorIyBkZWZpbmUgY3B1X2lzX29tYXAxNjIxKCkJCWlzX29tYXAxNjIxKCkKICMgZGVmaW5lIGNwdV9pc19vbWFwMTcxMCgpCQlpc19vbWFwMTcxMCgpCi0jIGVsc2UKLSMgZGVmaW5lIGNwdV9pc19vbWFwMTYxMCgpCQkwCi0jIGRlZmluZSBjcHVfaXNfb21hcDU5MTIoKQkJMAotIyBkZWZpbmUgY3B1X2lzX29tYXAxNzEwKCkJCTAKLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKKyMgIHVuZGVmICBjcHVfaXNfb21hcDI0MjAKICMgIGRlZmluZSBjcHVfaXNfb21hcDI0MjAoKQkJMQotIyBlbHNlCi0jICBkZWZpbmUgY3B1X2lzX29tYXAyNDIwKCkJCTAKLSMgZW5kaWYKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZGVidWctbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZGVidWctbWFjcm8uUwppbmRleCA4M2JiNDU4Li5jYTRmNTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RlYnVnLW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCw2ICsxNCw3IEBACiAJCS5tYWNybwlhZGRydWFydCxyeAogCQltcmMJcDE1LCAwLCBccngsIGMxLCBjMAogCQl0c3QJXHJ4LCAjMQkJCUAgTU1VIGVuYWJsZWQ/CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKIAkJbW92ZXEJXHJ4LCAjMHhmZjAwMDAwMAlAIHBoeXNpY2FsIGJhc2UgYWRkcmVzcwogCQltb3ZuZQlccngsICMweGZlMDAwMDAwCUAgdmlydHVhbCBiYXNlCiAJCW9ycglccngsIFxyeCwgIzB4MDBmYjAwMDAKQEAgLTIzLDYgKzI0LDE4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMikgfHwgZGVmaW5lZChDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMykKIAkJb3JyCVxyeCwgXHJ4LCAjMHgwMDAwMDgwMAlAIFVBUlQgMiAmIDMKICNlbmRpZgorCisjZWxpZiAgQ09ORklHX0FSQ0hfT01BUDIKKwkJbW92ZXEJXHJ4LCAjMHg0ODAwMDAwMAlAIHBoeXNpY2FsIGJhc2UgYWRkcmVzcworCQltb3ZuZQlccngsICMweGQ4MDAwMDAwCUAgdmlydHVhbCBiYXNlCisJCW9ycglccngsIFxyeCwgIzB4MDAwNmEwMDAKKyNpZmRlZiBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMgorCQlhZGQJXHJ4LCBccngsICMweDAwMDAyMDAwCUAgVUFSVCAyCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMworCQlhZGQJXHJ4LCBccngsICMweDAwMDA0MDAwCUAgVUFSVCAzCisjZW5kaWYKKyNlbmRpZgogCQkuZW5kbQogCiAJCS5tYWNybwlzZW5kdWFydCxyZCxyeApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG1hLmgKaW5kZXggY2UxMTRjZS4uMDRlYmVmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oCkBAIC0yNDAsNiArMjQwLDcgQEAKIAogZXh0ZXJuIGRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCk7CiBleHRlcm4gZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKTsKK2V4dGVybiBpbnQgb21hcF9nZXRfZG1hX3NyY19hZGRyX2NvdW50ZXIoaW50IGxjaCk7CiBleHRlcm4gdm9pZCBvbWFwX2NsZWFyX2RtYShpbnQgbGNoKTsKIGV4dGVybiBpbnQgb21hcF9kbWFfcnVubmluZyh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbXRpbWVyLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc3MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbXRpbWVyLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcm0vYXJjaC1vbWFwL2RtdGltZXIuaAorICoKKyAqIE9NQVAgRHVhbC1Nb2RlIFRpbWVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBMYXVyaSBMZXVra3VuZW4gPGxhdXJpLmxldWtrdW5lbkBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9USU1FUl9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfVElNRVJfSAorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjZGVmaW5lIE9NQVBfVElNRVJfU1JDX0FSTVhPUgkJMHgwMAorI2RlZmluZSBPTUFQX1RJTUVSX1NSQ18zMl9LSFoJCTB4MDEKKyNkZWZpbmUgT01BUF9USU1FUl9TUkNfRVhUX0NMSwkJMHgwMgorCisvKiB0aW1lciBjb250cm9sIHJlZyBiaXRzICovCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9DQVBUTU9ERQkoMSA8PCAxMykKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1BUCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1RSR19PVkVSRkxPVwkoMHgxIDw8IDEwKQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfVFJHX09GQU5ETUFUQ0gJKDB4MiA8PCAxMCkKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1RDTV9MT1dUT0hJR0gJKDB4MSA8PCA4KQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfVENNX0hJR0hUT0xPVwkoMHgyIDw8IDgpCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9UQ01fQk9USEVER0VTCSgweDMgPDwgOCkKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1NDUFdNCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfQ0UJCSgxIDw8IDYpCS8qIGNvbXBhcmUgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9QUkUJCSgxIDw8IDUpCS8qIHByZXNjYWxlciBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1BUVl9TSElGVAkyCQkvKiBob3cgbXVjaCB0byBzaGlmdCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9BUgkJKDEgPDwgMSkJLyogYXV0by1yZWxvYWQgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfVElNRVJfQ1RSTF9TVAkJKDEgPDwgMCkJLyogc3RhcnQgdGltZXIgKi8KKworLyogdGltZXIgaW50ZXJydXB0IGVuYWJsZSBiaXRzICovCisjZGVmaW5lIE9NQVBfVElNRVJfSU5UX0NBUFRVUkUJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfVElNRVJfSU5UX09WRVJGTE9XCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQX1RJTUVSX0lOVF9NQVRDSAkJKDEgPDwgMCkKKworCitzdHJ1Y3Qgb21hcF9kbV90aW1lciB7CisJc3RydWN0IGxpc3RfaGVhZCB0aW1lcl9saXN0OworCisJdTMyIGJhc2U7CisJdW5zaWduZWQgaW50IGlycTsKK307CisKK3UzMiBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHJlZyk7Cit2b2lkIG9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHJlZywgdTMyIHZhbHVlKTsKKworc3RydWN0IG9tYXBfZG1fdGltZXIgKiBvbWFwX2RtX3RpbWVyX3JlcXVlc3Qodm9pZCk7Cit2b2lkIG9tYXBfZG1fdGltZXJfZnJlZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwordm9pZCBvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2Uoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgc291cmNlKTsKKwordm9pZCBvbWFwX2RtX3RpbWVyX3NldF9pbnRfZW5hYmxlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfdHJpZ2dlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7Cit2b2lkIG9tYXBfZG1fdGltZXJfZW5hYmxlX2NvbXBhcmUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9lbmFibGVfYXV0b3JlbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOworCit2b2lkIG9tYXBfZG1fdGltZXJfdHJpZ2dlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwordm9pZCBvbWFwX2RtX3RpbWVyX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7Cit2b2lkIG9tYXBfZG1fdGltZXJfc3RvcChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOworCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X2xvYWQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgbG9hZCk7Cit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X21hdGNoKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IG1hdGNoKTsKKwordW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK3ZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworCit1bnNpZ25lZCBpbnQgb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK3ZvaWQgb21hcF9kbV90aW1lcl9yZXNldF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CisKK2ludCBvbWFwX2RtX3RpbWVyc19hY3RpdmUodm9pZCk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZHNwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YmY0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RzcC5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kc3AuaAorICoKKyAqIEhlYWRlciBmb3IgT01BUCBEU1AgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFRvc2hpaGlybyBLb2JheWFzaGkgPHRvc2hpaGlyby5rb2JheWFzaGlAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAyMDA1LzA2LzAxOiAgRFNQIEdhdGV3YXkgdmVyc2lvbiAzLjMKKyAqLworCisjaWZuZGVmIEFTTV9BUkNIX0RTUF9ICisjZGVmaW5lIEFTTV9BUkNIX0RTUF9ICisKKworLyoKKyAqIGZvciAvZGV2L2RzcGN0bC9jdGwKKyAqLworI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SRVNFVAkJCTEKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfUlVOCQkJMgorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9TRVRSU1RWRUNUCQkzCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX0NQVV9JRExFCQkJNAorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9NUFVJX1dPUkRTV0FQX09OCQk1CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX01QVUlfV09SRFNXQVBfT0ZGCTYKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfTVBVSV9CWVRFU1dBUF9PTgkJNworI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9NUFVJX0JZVEVTV0FQX09GRgk4CisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX0dCTF9JRExFCQkJOQorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9EU1BDRkcJCQkxMAorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9EU1BVTkNGRwkJCTExCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1RBU0tDTlQJCQkxMgorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9QT0xMCQkJMTMKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfUkVHTUVNUgkJCTQwCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1JFR01FTVcJCQk0MQorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SRUdJT1IJCQk0MgorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SRUdJT1cJCQk0MworI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9HRVRWQVIJCQk0NAorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9TRVRWQVIJCQk0NQorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SVU5MRVZFTAkJCTUwCisjZGVmaW5lIE9NQVBfRFNQX0lPQ1RMX1NVU1BFTkQJCQk1MQorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9SRVNVTUUJCQk1MgorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9GQkVOCQkJNTMKKyNkZWZpbmUgT01BUF9EU1BfSU9DVExfRkJESVMJCQk1NAorI2RlZmluZSBPTUFQX0RTUF9JT0NUTF9NQlNFTkQJCQk5OQorCisvKgorICogZm9yIHRhc2tkZXYKKyAqIChpb2N0bHMgYmVsb3cgc2hvdWxkIGJlID49IDB4MTAwMDApCisgKi8KKyNkZWZpbmUgT01BUF9EU1BfVEFTS19JT0NUTF9CRkxTSAkweDEwMDAwCisjZGVmaW5lIE9NQVBfRFNQX1RBU0tfSU9DVExfU0VUQlNaCTB4MTAwMDEKKyNkZWZpbmUgT01BUF9EU1BfVEFTS19JT0NUTF9MT0NLCTB4MTAwMDIKKyNkZWZpbmUgT01BUF9EU1BfVEFTS19JT0NUTF9VTkxPQ0sJMHgxMDAwMworI2RlZmluZSBPTUFQX0RTUF9UQVNLX0lPQ1RMX0dFVE5BTUUJMHgxMDAwNAorCisvKgorICogZm9yIC9kZXYvZHNwY3RsL21lbQorICovCisjZGVmaW5lIE9NQVBfRFNQX01FTV9JT0NUTF9FWE1BUAkxCisjZGVmaW5lIE9NQVBfRFNQX01FTV9JT0NUTF9FWFVOTUFQCTIKKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX0VYTUFQX0ZMVVNICTMKKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX0ZCRVhQT1JUCTUKKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX01NVUlUQUNLCTcKKyNkZWZpbmUgT01BUF9EU1BfTUVNX0lPQ1RMX01NVUlOSVQJOQorI2RlZmluZSBPTUFQX0RTUF9NRU1fSU9DVExfS01FTV9SRVNFUlZFCTExCisjZGVmaW5lIE9NQVBfRFNQX01FTV9JT0NUTF9LTUVNX1JFTEVBU0UJMTIKKworc3RydWN0IG9tYXBfZHNwX21hcGluZm8geworCXVuc2lnbmVkIGxvbmcgZHNwYWRyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK307CisKKy8qCisgKiBmb3IgL2Rldi9kc3BjdGwvdHdjaAorICovCisjZGVmaW5lIE9NQVBfRFNQX1RXQ0hfSU9DVExfTUtERVYJMQorI2RlZmluZSBPTUFQX0RTUF9UV0NIX0lPQ1RMX1JNREVWCTIKKyNkZWZpbmUgT01BUF9EU1BfVFdDSF9JT0NUTF9UQURECTExCisjZGVmaW5lIE9NQVBfRFNQX1RXQ0hfSU9DVExfVERFTAkxMgorI2RlZmluZSBPTUFQX0RTUF9UV0NIX0lPQ1RMX1RLSUxMCTEzCisKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfTk9UQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfQVRUQUNIRUQJMHgwMDAwMDAwMgorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9HQVJCQUdFCTB4MDAwMDAwMDQKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfSU5WQUxJRAkweDAwMDAwMDA4CisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0FERFJFUQkweDAwMDAwMTAwCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0RFTFJFUQkweDAwMDAwMjAwCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX0FEREZBSUwJMHgwMDAwMTAwMAorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9BRERJTkcJMHgwMDAxMDAwMAorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9ERUxJTkcJMHgwMDAyMDAwMAorI2RlZmluZSBPTUFQX0RTUF9ERVZTVEFURV9LSUxMSU5HCTB4MDAwNDAwMDAKKyNkZWZpbmUgT01BUF9EU1BfREVWU1RBVEVfU1RBVEVfTUFTSwkweDdmZmZmZmZmCisjZGVmaW5lIE9NQVBfRFNQX0RFVlNUQVRFX1NUQUxFCQkweDgwMDAwMDAwCisKK3N0cnVjdCBvbWFwX2RzcF90YWRkaW5mbyB7CisJdW5zaWduZWQgY2hhciBtaW5vcjsKKwl1bnNpZ25lZCBsb25nIHRhc2thZHI7Cit9OworI2RlZmluZSBPTUFQX0RTUF9UQUREX0FCT1JUQURSCTB4ZmZmZmZmZmYKKworCisvKgorICogZXJyb3IgY2F1c2UgZGVmaW5pdGlvbiAoZm9yIGVycm9yIGRldGVjdGlvbiBkZXZpY2UpCisgKi8KKyNkZWZpbmUgT01BUF9EU1BfRVJSRFRfV0RUCTB4MDAwMDAwMDEKKyNkZWZpbmUgT01BUF9EU1BfRVJSRFRfTU1VCTB4MDAwMDAwMDIKKworCisvKgorICogbWFpbGJveCBwcm90b2NvbCBkZWZpbml0aW9ucworICovCisKK3N0cnVjdCBvbWFwX2RzcF9tYWlsYm94X2NtZCB7CisJdW5zaWduZWQgc2hvcnQgY21kOworCXVuc2lnbmVkIHNob3J0IGRhdGE7Cit9OworCitzdHJ1Y3Qgb21hcF9kc3BfcmVnaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgYWRyOworCXVuc2lnbmVkIHNob3J0IHZhbDsKK307CisKK3N0cnVjdCBvbWFwX2RzcF92YXJpbmZvIHsKKwl1bnNpZ25lZCBjaGFyIHZhcmlkOworCXVuc2lnbmVkIHNob3J0IHZhbFswXTsKK307CisKKyNkZWZpbmUgT01BUF9EU1BfTUJQUk9UX1JFVklTSU9OCTB4MDAxOQorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1dEU05ECTB4MTAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfV0RSRVEJMHgxMQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9CS1NORAkweDIwCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0JLUkVRCTB4MjEKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfQktZTEQJMHgyMworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9CS1NORFAJMHgyNAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9CS1JFUVAJMHgyNQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UQ1RMCTB4MzAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVENUTERBVEEJMHgzMQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9QT0xMCTB4MzIKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfV0RUCTB4NTAJLyogdjMuMzogb2Jzb2xldGUgKi8KKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUlVOTEVWRUwJMHg1MQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9QTQkweDUyCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1NVU1BFTkQJMHg1MworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9LRlVOQwkweDU0CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RDRkcJMHg2MAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UQURECTB4NjIKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVERFTAkweDYzCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RTVE9QCTB4NjUKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfRFNQQ0ZHCTB4NzAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUkVHUlcJMHg3MgorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9HRVRWQVIJMHg3NAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9TRVRWQVIJMHg3NQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9FUlIJMHg3OAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9EQkcJMHg3OQorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RDVExfVElOSVQJMHgwMDAwCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RDVExfVEVOCQkweDAwMDEKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVENUTF9URElTCTB4MDAwMgorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9UQ1RMX1RDTFIJMHgwMDAzCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RDVExfVENMUl9GT1JDRQkweDAwMDQKKworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SVU5MRVZFTF9VU0VSCQkweDAxCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JVTkxFVkVMX1NVUEVSCQkweDBlCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JVTkxFVkVMX1JFQ09WRVJZCTB4MTAKKworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9QTV9ESVNBQkxFCTB4MDAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUE1fRU5BQkxFCTB4MDEKKworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9LRlVOQ19GQkNUTAkweDAwCisKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfRkJDVExfRU5BQkxFCTB4MDAwMgorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9GQkNUTF9ESVNBQkxFCTB4MDAwMworCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1RERUxfU0FGRQkweDAwMDAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVERFTF9LSUxMCTB4MDAwMQorCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0RTUENGR19SRVEJMHgwMAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9EU1BDRkdfU1lTQURSSAkweDI4CisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX0RTUENGR19TWVNBRFJMCTB4MjkKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfRFNQQ0ZHX1BST1RSRVYJMHg3MAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9EU1BDRkdfQUJPUlQJMHg3OAorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9EU1BDRkdfTEFTVAkweDgwCisKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfUkVHUldfTUVNUgkweDAwCisjZGVmaW5lIE9NQVBfRFNQX01CQ01EX1JFR1JXX01FTVcJMHgwMQorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SRUdSV19JT1IJMHgwMgorI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SRUdSV19JT1cJMHgwMworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9SRUdSV19EQVRBCTB4MDQKKworI2RlZmluZSBPTUFQX0RTUF9NQkNNRF9WQVJJRF9JQ1JNQVNLCTB4MDAKKyNkZWZpbmUgT01BUF9EU1BfTUJDTURfVkFSSURfTE9BRElORk8JMHgwMQorCisjZGVmaW5lIE9NQVBfRFNQX1RUWVBfQVJDVgkweDAwMDEKKyNkZWZpbmUgT01BUF9EU1BfVFRZUF9BU05ECTB4MDAwMgorI2RlZmluZSBPTUFQX0RTUF9UVFlQX0JLTUQJMHgwMDA0CisjZGVmaW5lIE9NQVBfRFNQX1RUWVBfQktETQkweDAwMDgKKyNkZWZpbmUgT01BUF9EU1BfVFRZUF9QVk1ECTB4MDAxMAorI2RlZmluZSBPTUFQX0RTUF9UVFlQX1BWRE0JMHgwMDIwCisKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRFRJRAkweDEwCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9CQURUQ04JMHgxMQorI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEQklECTB4MjAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRENOVAkweDIxCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9OT1RMT0NLRUQJMHgyMgorI2RlZmluZSBPTUFQX0RTUF9FSURfU1RWQlVGCTB4MjMKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBREFEUgkweDI0CisjZGVmaW5lIE9NQVBfRFNQX0VJRF9CQURUQ1RMCTB4MzAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRFBBUkFNCTB4NTAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0ZBVEFMCTB4NTgKKyNkZWZpbmUgT01BUF9EU1BfRUlEX05PTUVNCTB4YzAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX05PUkVTCTB4YzEKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0lQQkZVTEwJMHhjMgorI2RlZmluZSBPTUFQX0RTUF9FSURfV0RUCTB4ZDAKKyNkZWZpbmUgT01BUF9EU1BfRUlEX1RBU0tOT1RSRFkJMHhlMAorI2RlZmluZSBPTUFQX0RTUF9FSURfVEFTS0JTWQkweGUxCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9UQVNLRVJSCTB4ZWYKKyNkZWZpbmUgT01BUF9EU1BfRUlEX0JBRENGR1RZUAkweGYwCisjZGVmaW5lIE9NQVBfRFNQX0VJRF9ERUJVRwkweGY4CisjZGVmaW5lIE9NQVBfRFNQX0VJRF9CQURTRVEJMHhmZQorI2RlZmluZSBPTUFQX0RTUF9FSURfQkFEQ01ECTB4ZmYKKworI2RlZmluZSBPTUFQX0RTUF9UTk1fTEVOCTE2CisKKyNkZWZpbmUgT01BUF9EU1BfVElEX0ZSRUUJMHhmZgorI2RlZmluZSBPTUFQX0RTUF9USURfQU5PTgkweGZlCisKKyNkZWZpbmUgT01BUF9EU1BfQklEX05VTEwJMHhmZmZmCisjZGVmaW5lIE9NQVBfRFNQX0JJRF9QVlQJMHhmZmZlCisKKyNlbmRpZiAvKiBBU01fQVJDSF9EU1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kc3BfY29tbW9uLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RzcF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmNjZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kc3BfY29tbW9uLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZHNwX2NvbW1vbi5oCisgKgorICogSGVhZGVyIGZvciBPTUFQIERTUCBzdWJzeXN0ZW0gY29udHJvbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogV3JpdHRlbiBieSBUb3NoaWhpcm8gS29iYXlhc2hpIDx0b3NoaWhpcm8ua29iYXlhc2hpQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogMjAwNS8wNi8wMzogIERTUCBHYXRld2F5IHZlcnNpb24gMy4zCisgKi8KKworI2lmbmRlZiBBU01fQVJDSF9EU1BfQ09NTU9OX0gKKyNkZWZpbmUgQVNNX0FSQ0hfRFNQX0NPTU1PTl9ICisKK3ZvaWQgb21hcF9kc3BfcG1fc3VzcGVuZCh2b2lkKTsKK3ZvaWQgb21hcF9kc3BfcG1fcmVzdW1lKHZvaWQpOwordm9pZCBvbWFwX2RzcF9yZXF1ZXN0X21wdWkodm9pZCk7Cit2b2lkIG9tYXBfZHNwX3JlbGVhc2VfbXB1aSh2b2lkKTsKK2ludCBvbWFwX2RzcF9yZXF1ZXN0X21lbSh2b2lkKTsKK2ludCBvbWFwX2RzcF9yZWxlYXNlX21lbSh2b2lkKTsKKworI2VuZGlmIC8qIEFTTV9BUkNIX0RTUF9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9lbnRyeS1tYWNyby5TCmluZGV4IDU3YjEyNjguLjBkMjliOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZW50cnktbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2VudHJ5LW1hY3JvLlMKQEAgLTgsNiArOCw4IEBACiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDEpCisKICAJCS5tYWNybwlkaXNhYmxlX2ZpcQogCQkuZW5kbQogCkBAIC0zMCwzICszMiwyOSBAQAogMTUxMDoKIAkJLmVuZG0KIAorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkKKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNHh4Lmg+CisKKwkJLm1hY3JvCWRpc2FibGVfZmlxCisJCS5lbmRtCisKKwkJLm1hY3JvCWdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAorCQlsZHIJXGJhc2UsID1WQV9JQ19CQVNFCisJCWxkcglcaXJxbnIsIFtcYmFzZSwgIzB4OThdIC8qIElSUSBwZW5kaW5nIHJlZyAxICovCisJCWNtcAlcaXJxbnIsICMweDAKKwkJYm5lCTIyMjJmCisJCWxkcglcaXJxbnIsIFtcYmFzZSwgIzB4YjhdIC8qIElSUSBwZW5kaW5nIHJlZyAyICovCisJCWNtcAlcaXJxbnIsICMweDAKKwkJYm5lCTIyMjJmCisJCWxkcglcaXJxbnIsIFtcYmFzZSwgIzB4ZDhdIC8qIElSUSBwZW5kaW5nIHJlZyAzICovCisJCWNtcAlcaXJxbnIsICMweDAKKzIyMjI6CisJCWxkcm5lCVxpcnFuciwgW1xiYXNlLCAjSVJRX1NJUl9JUlFdCisKKwkJLmVuZG0KKworCQkubWFjcm8JaXJxX3ByaW9fdGFibGUKKwkJLmVuZG0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2dwaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZ3Bpby5oCmluZGV4IGZhZDJmYzkuLjc0Y2IyYjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZ3Bpby5oCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIE9NQVAgR1BJTyBoYW5kbGluZyBkZWZpbmVzIGFuZCBmdW5jdGlvbnMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogV3JpdHRlbiBieSBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgogICoKQEAgLTMwLDcgKzMwLDIzIEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jZGVmaW5lIE9NQVBfTVBVSU9fQkFTRQkJCTB4ZmZmYjUwMDAKKyNkZWZpbmUgT01BUF9NUFVJT19CQVNFCQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYjUwMDAKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKyNkZWZpbmUgT01BUF9NUFVJT19JTlBVVF9MQVRDSAkJMHgwMAorI2RlZmluZSBPTUFQX01QVUlPX09VVFBVVAkJMHgwMgorI2RlZmluZSBPTUFQX01QVUlPX0lPX0NOVEwJCTB4MDQKKyNkZWZpbmUgT01BUF9NUFVJT19LQlJfTEFUQ0gJCTB4MDgKKyNkZWZpbmUgT01BUF9NUFVJT19LQkMJCQkweDBhCisjZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19FVkVOVF9NT0RFCTB4MGMKKyNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVF9FREdFCTB4MGUKKyNkZWZpbmUgT01BUF9NUFVJT19LQkRfSU5UCQkweDEwCisjZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19JTlQJCTB4MTIKKyNkZWZpbmUgT01BUF9NUFVJT19LQkRfTUFTS0lUCQkweDE0CisjZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19NQVNLSVQJCTB4MTYKKyNkZWZpbmUgT01BUF9NUFVJT19HUElPX0RFQk9VTkNJTkcJMHgxOAorI2RlZmluZSBPTUFQX01QVUlPX0xBVENICQkweDFhCisjZWxzZQogI2RlZmluZSBPTUFQX01QVUlPX0lOUFVUX0xBVENICQkweDAwCiAjZGVmaW5lIE9NQVBfTVBVSU9fT1VUUFVUCQkweDA0CiAjZGVmaW5lIE9NQVBfTVBVSU9fSU9fQ05UTAkJMHgwOApAQCAtNDQsNiArNjAsNyBAQAogI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUCQkweDJjCiAjZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19ERUJPVU5DSU5HCTB4MzAKICNkZWZpbmUgT01BUF9NUFVJT19MQVRDSAkJMHgzNAorI2VuZGlmCiAKICNkZWZpbmUgT01BUF9NUFVJTyhucikJCShPTUFQX01BWF9HUElPX0xJTkVTICsgKG5yKSkKICNkZWZpbmUgT01BUF9HUElPX0lTX01QVUlPKG5yKQkoKG5yKSA+PSBPTUFQX01BWF9HUElPX0xJTkVTKQpAQCAtNTIsMTggKzY5LDExIEBACiAJCQkJIElIX01QVUlPX0JBU0UgKyAoKG5yKSAmIDB4MGYpIDogXAogCQkJCSBJSF9HUElPX0JBU0UgKyAoKG5yKSAmIDB4M2YpKQogCi0vKiBGb3IgRURHRUNUUkwgKi8KLSNkZWZpbmUgT01BUF9HUElPX05PX0VER0UJICAweDAwCi0jZGVmaW5lIE9NQVBfR1BJT19GQUxMSU5HX0VER0UJICAweDAxCi0jZGVmaW5lIE9NQVBfR1BJT19SSVNJTkdfRURHRQkgIDB4MDIKLSNkZWZpbmUgT01BUF9HUElPX0JPVEhfRURHRVMJICAweDAzCi0KIGV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CS8qIENhbGwgZnJvbSBib2FyZCBpbml0IG9ubHkgKi8KIGV4dGVybiBpbnQgb21hcF9yZXF1ZXN0X2dwaW8oaW50IGdwaW8pOwogZXh0ZXJuIHZvaWQgb21hcF9mcmVlX2dwaW8oaW50IGdwaW8pOwogZXh0ZXJuIHZvaWQgb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oaW50IGdwaW8sIGludCBpc19pbnB1dCk7CiBleHRlcm4gdm9pZCBvbWFwX3NldF9ncGlvX2RhdGFvdXQoaW50IGdwaW8sIGludCBlbmFibGUpOwogZXh0ZXJuIGludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBvbWFwX3NldF9ncGlvX2VkZ2VfY3RybChpbnQgZ3BpbywgaW50IGVkZ2UpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaGFyZHdhcmUuaAppbmRleCA0ODI1OGM3Li42MDIwMWUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CiAjZW5kaWYKICNpbmNsdWRlIDxhc20vYXJjaC9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3NlcmlhbC5oPgogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04OSwxMSArOTAsMTIgQEAKIC8qIERQTEwgY29udHJvbCByZWdpc3RlcnMgKi8KICNkZWZpbmUgRFBMTF9DVEwJCSgweGZmZmVjZjAwKQogCi0vKiBEU1AgY2xvY2sgY29udHJvbCAqLworLyogRFNQIGNsb2NrIGNvbnRyb2wuIE11c3QgdXNlIF9fcmF3X3JlYWR3KCkgYW5kIF9fcmF3X3dyaXRldygpIHdpdGggdGhlc2UgKi8KICNkZWZpbmUgRFNQX0NPTkZJR19SRUdfQkFTRSAgICAgKDB4ZTEwMDgwMDApCiAjZGVmaW5lIERTUF9DS0NUTAkJKERTUF9DT05GSUdfUkVHX0JBU0UgKyAweDApCiAjZGVmaW5lIERTUF9JRExFQ1QxCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4NCkKICNkZWZpbmUgRFNQX0lETEVDVDIJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHg4KQorI2RlZmluZSBEU1BfUlNUQ1QyCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4MTQpCiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0Miw2ICsxNDQsMTMgQEAKICAqIEludGVycnVwdHMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKworLyoKKyAqIFhYWDogVGhlc2UgcHJvYmFibHkgd2FudCB0byBiZSBtb3ZlZCB0byBhcmNoL2FybS9tYWNoLW9tYXAvb21hcDEvaXJxLmMKKyAqIG9yIHNvbWV0aGluZyBzaW1pbGFyLi4gLS0gUEZNLgorICovCisKICNkZWZpbmUgT01BUF9JSDFfQkFTRQkJMHhmZmZlY2IwMAogI2RlZmluZSBPTUFQX0lIMl9CQVNFCQkweGZmZmUwMDAwCiAKQEAgLTE3MCw2ICsxNzksOCBAQAogI2RlZmluZSBJUlFfSUxSMF9SRUdfT0ZGU0VUCTB4MWMKICNkZWZpbmUgSVJRX0dNUl9SRUdfT0ZGU0VUCTB4YTAKIAorI2VuZGlmCisKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBTeXN0ZW0gY29udHJvbCByZWdpc3RlcnMKQEAgLTI2MCwzMiArMjcxLDE3IEBACiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFNlcmlhbCBwb3J0cwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNkZWZpbmUgT01BUF9VQVJUMV9CQVNFCQkodW5zaWduZWQgY2hhciAqKTB4ZmZmYjAwMDAKLSNkZWZpbmUgT01BUF9VQVJUMl9CQVNFCQkodW5zaWduZWQgY2hhciAqKTB4ZmZmYjA4MDAKLSNkZWZpbmUgT01BUF9VQVJUM19CQVNFCQkodW5zaWduZWQgY2hhciAqKTB4ZmZmYjk4MDAKLSNkZWZpbmUgT01BUF9NQVhfTlJfUE9SVFMJMwotI2RlZmluZSBPTUFQMTUxMF9CQVNFX0JBVUQJKDEyMDAwMDAwLzE2KQotI2RlZmluZSBPTUFQMTZYWF9CQVNFX0JBVUQJKDQ4MDAwMDAwLzE2KQotCi0jZGVmaW5lIGlzX29tYXBfcG9ydChwKQkoe2ludCBfX3JldCA9IDA7CQkJXAotCQkJaWYgKHAgPT0gSU9fQUREUkVTUyhPTUFQX1VBUlQxX0JBU0UpIHx8CVwKLQkJCSAgICBwID09IElPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSB8fAlcCi0JCQkgICAgcCA9PSBJT19BRERSRVNTKE9NQVBfVUFSVDNfQkFTRSkpCVwKLQkJCQlfX3JldCA9IDE7CQkJXAotCQkJX19yZXQ7CQkJCQlcCi0JCQl9KQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQcm9jZXNzb3Igc3BlY2lmaWMgZGVmaW5lcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAogI2luY2x1ZGUgIm9tYXA3MzAuaCIKICNpbmNsdWRlICJvbWFwMTUxMC5oIgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKyNpbmNsdWRlICJvbWFwMjR4eC5oIgorI2VuZGlmCisKICNpbmNsdWRlICJvbWFwMTZ4eC5oIgogCiAvKgpAQCAtMzEyLDcgKzMwOCw2IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9PTUFQX0g0CiAjaW5jbHVkZSAiYm9hcmQtaDQuaCIKLSNlcnJvciAiU3VwcG9ydCBmb3IgSDQgYm9hcmQgbm90IHlldCBpbXBsZW1lbnRlZC4iCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NQUNIX09NQVBfT1NLCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lvLmgKaW5kZXggMWM4YzlmYy4uMTFmYmY2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaW8uaApAQCAtNDksMTYgKzQ5LDI0IEBACiAgKiBJL08gbWFwcGluZwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jZGVmaW5lIElPX1BIWVMJCQkweEZGRkIwMDAwCi0jZGVmaW5lIElPX09GRlNFVAkJMHgwMTAwMDAwMAkvKiBWaXJ0dWFsIElPID0gMHhmZWZiMDAwMCAqLwotI2RlZmluZSBJT19WSVJUCQkJKElPX1BIWVMgLSBJT19PRkZTRVQpCi0jZGVmaW5lIElPX1NJWkUJCQkweDQwMDAwCi0jZGVmaW5lIElPX0FERFJFU1MoeCkJCSgoeCkgLSBJT19PRkZTRVQpCiAKLSNkZWZpbmUgUENJT19CQVNFCQkwCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKKyNkZWZpbmUgSU9fUEhZUwkJMHhGRkZCMDAwMAorI2RlZmluZSBJT19PRkZTRVQgICAgICAtMHgwMTAwMDAwMAkvKiBWaXJ0dWFsIElPID0gMHhmZWZiMDAwMCAqLworI2RlZmluZSBJT19TSVpFCQkweDQwMDAwCiAKLSNkZWZpbmUgaW9fcDJ2KHgpICAgICAgICAgICAgICAgKCh4KSAtIElPX09GRlNFVCkKLSNkZWZpbmUgaW9fdjJwKHgpICAgICAgICAgICAgICAgKCh4KSArIElPX09GRlNFVCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpCisjZGVmaW5lIElPX1BIWVMJCTB4NDgwMDAwMDAJLyogTDQgcGVyaXBoZXJhbHM7IG90aGVyIHN0dWZmIGhhcyB0byBiZSBtYXBwZWQgKgorCQkJCQkgKiBtYW51YWxseS4gKi8KKyNkZWZpbmUgSU9fT0ZGU0VUCTB4OTAwMDAwMDAJLyogVmlydHVhbCBJTyA9IDB4ZDgwMDAwMDAgKi8KKyNkZWZpbmUgSU9fU0laRQkJMHgwODAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgSU9fVklSVAkJKElPX1BIWVMgKyBJT19PRkZTRVQpCisjZGVmaW5lIElPX0FERFJFU1MoeCkJKCh4KSArIElPX09GRlNFVCkKKyNkZWZpbmUgUENJT19CQVNFCTAKKyNkZWZpbmUgaW9fcDJ2KHgpCSgoeCkgKyBJT19PRkZTRVQpCisjZGVmaW5lIGlvX3YycCh4KQkoKHgpIC0gSU9fT0ZGU0VUKQogCiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KIApAQCAtOTYsNiArMTA0LDggQEAKIAkJCQkJLT5vZmZzZXRbKCh2YWRkcikmNDA5NSk+PjJdCiAjZGVmaW5lIF9fUkVHMzIocGFkZHIpCQlfX1JFR1YzMihpb19wMnYocGFkZHIpKQogCitleHRlcm4gdm9pZCBvbWFwX21hcF9jb21tb25faW8odm9pZCk7CisKICNlbHNlCiAKICNkZWZpbmUgX19SRUc4KHBhZGRyKQkJaW9fcDJ2KHBhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lycXMuaAppbmRleCAwZDA1YTdjLi43NGUxMDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lycXMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lycXMuaApAQCAtMTM1LDcgKzEzNSw2IEBACiAvKgogICogT01BUC0xNTEwIHNwZWNpZmljIElSUSBudW1iZXJzIGZvciBpbnRlcnJ1cHQgaGFuZGxlciAyCiAgKi8KLSNkZWZpbmUgSU5UXzE1MTBfT1NfMzJrSHpfVElNRVIgKDIyICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF8xNTEwX0NPTV9TUElfUk8JKDMxICsgSUgyX0JBU0UpCiAKIC8qCkBAIC0yMzIsNiArMjMxLDExIEBACiAjZGVmaW5lIElOVF83MzBfRE1BX0NIMTUJKDYyICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF83MzBfTkFORAkJKDYzICsgSUgyX0JBU0UpCiAKKyNkZWZpbmUgSU5UXzI0WFhfR1BJT19CQU5LMQkyOQorI2RlZmluZSBJTlRfMjRYWF9HUElPX0JBTksyCTMwCisjZGVmaW5lIElOVF8yNFhYX0dQSU9fQkFOSzMJMzEKKyNkZWZpbmUgSU5UXzI0WFhfR1BJT19CQU5LNAkzMgorCiAvKiBNYXguIDEyOCBsZXZlbCAyIElSUXMgKE9NQVAxNjEwKSwgMTkyIEdQSU9zIChPTUFQNzMwKSBhbmQKICAqIDE2IE1QVUlPIGxpbmVzICovCiAjZGVmaW5lIE9NQVBfTUFYX0dQSU9fTElORVMJMTkyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL21lbW9yeS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tZW1vcnkuaAppbmRleCBmNmI1N2RkLi44NGY4MWUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL21lbW9yeS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbWVtb3J5LmgKQEAgLTM2LDEyICszNiwxMSBAQAogLyoKICAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgogICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKICNkZWZpbmUgUEhZU19PRkZTRVQJCSgweDEwMDAwMDAwVUwpCi0KLS8qCi0gKiBPTUFQLTE1MTAgTG9jYWwgQnVzIGFkZHJlc3Mgb2Zmc2V0Ci0gKi8KLSNkZWZpbmUgT01BUDE1MTBfTEJfT0ZGU0VUCSgweDMwMDAwMDAwVUwpCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKQorI2RlZmluZSBQSFlTX09GRlNFVAkJKDB4ODAwMDAwMDBVTCkKKyNlbmRpZgogCiAvKgogICogQ29udmVyc2lvbiBiZXR3ZWVuIFNEUkFNIGFuZCBmYWtlIFBDSSBidXMsIHVzZWQgYnkgVVNCCkBAIC02NCw2ICs2MywxMSBAQAogICovCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKIAorLyoKKyAqIE9NQVAtMTUxMCBMb2NhbCBCdXMgYWRkcmVzcyBvZmZzZXQKKyAqLworI2RlZmluZSBPTUFQMTUxMF9MQl9PRkZTRVQJKDB4MzAwMDAwMDBVTCkKKwogI2RlZmluZSB2aXJ0X3RvX2xidXMoeCkJCSgoeCkgLSBQQUdFX09GRlNFVCArIE9NQVAxNTEwX0xCX09GRlNFVCkKICNkZWZpbmUgbGJ1c190b192aXJ0KHgpCQkoKHgpIC0gT01BUDE1MTBfTEJfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCiAjZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTUxMCgpICYmIGRldiAmJiAoc3RybmNtcChkZXYtPmJ1c19pZCwgIm9oY2kiLCA0KSA9PSAwKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXRkLXhpcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdGQteGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczYTI4NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXRkLXhpcC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBNVEQgcHJpbWl0aXZlcyBmb3IgWElQIHN1cHBvcnQuIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMuCisgKgorICogRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJdCdzIGluY2x1ZGVkIGZyb20gbGludXgvbXRkL3hpcC5oCisgKgorICogQXV0aG9yOiBWbGFkaW1pciBCYXJpbm92IDx2YmFyaW5vdkBydS5tdmlzdGEuY29tPgorICoKKyAqIChjKSAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvcgorICogaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9PTUFQX01URF9YSVBfSF9fCisjZGVmaW5lIF9fQVJDSF9PTUFQX01URF9YSVBfSF9fCisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNkZWZpbmUgT01BUF9NUFVfVElNRVJfQkFTRQkoMHhmZmZlYzUwMCkKKyNkZWZpbmUgT01BUF9NUFVfVElNRVJfT0ZGU0VUCTB4MTAwCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgY250bDsJCQkvKiBDTlRMX1RJTUVSLCBSL1cgKi8KKwl1MzIgbG9hZF90aW07CQkJLyogTE9BRF9USU0sICAgVyAqLworCXUzMiByZWFkX3RpbTsJCQkvKiBSRUFEX1RJTSwgICBSICovCit9IHhpcF9vbWFwX21wdV90aW1lcl9yZWdzX3Q7CisKKyNkZWZpbmUgeGlwX29tYXBfbXB1X3RpbWVyX2Jhc2UobikJCQkJCVwKKygodm9sYXRpbGUgeGlwX29tYXBfbXB1X3RpbWVyX3JlZ3NfdCopSU9fQUREUkVTUyhPTUFQX01QVV9USU1FUl9CQVNFICsJXAorCShuKSpPTUFQX01QVV9USU1FUl9PRkZTRVQpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgeGlwX29tYXBfbXB1X3RpbWVyX3JlYWQoaW50IG5yKQoreworCXZvbGF0aWxlIHhpcF9vbWFwX21wdV90aW1lcl9yZWdzX3QqIHRpbWVyID0geGlwX29tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOworCXJldHVybiB0aW1lci0+cmVhZF90aW07Cit9CisKKyNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKQlcCisJKG9tYXBfcmVhZGwoT01BUF9JSDFfSVRSKSAmIH5vbWFwX3JlYWRsKE9NQVBfSUgxX01JUikpCisjZGVmaW5lIHhpcF9jdXJydGltZSgpCQkofnhpcF9vbWFwX21wdV90aW1lcl9yZWFkKDApKQorCisvKgorICogSXQncyBwZXJtaXR0ZWQgdG8gZG8gYXBwcm94bWF0aW9uIGZvciB4aXBfZWxhcHNlZF9zaW5jZSBtYWNybworICogKHNlZSBsaW51eC9tdGQveGlwLmgpCisgKi8KKworI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIKKyNkZWZpbmUgeGlwX2VsYXBzZWRfc2luY2UoeCkJKHNpZ25lZCkoKH54aXBfb21hcF9tcHVfdGltZXJfcmVhZCgwKSAtICh4KSkgLyA3KQorI2Vsc2UKKyNkZWZpbmUgeGlwX2VsYXBzZWRfc2luY2UoeCkJKHNpZ25lZCkoKH54aXBfb21hcF9tcHVfdGltZXJfcmVhZCgwKSAtICh4KSkgLyA2KQorI2VuZGlmCisKKy8qCisgKiB4aXBfY3B1X2lkbGUoKSBpcyB1c2VkIHdoZW4gd2FpdGluZyBmb3IgYSBkZWxheSBlcXVhbCBvciBsYXJnZXIgdGhhbgorICogdGhlIHN5c3RlbSB0aW1lciB0aWNrIHBlcmlvZC4gIFRoaXMgc2hvdWxkIHB1dCB0aGUgQ1BVIGludG8gaWRsZSBtb2RlCisgKiB0byBzYXZlIHBvd2VyIGFuZCB0byBiZSB3b2tlbiB1cCBvbmx5IHdoZW4gc29tZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLgorICogQXMgYWJvdmUsIHRoaXMgc2hvdWxkIG5vdCByZWx5IHVwb24gc3RhbmRhcmQga2VybmVsIGNvZGUuCisgKi8KKworI2RlZmluZSB4aXBfY3B1X2lkbGUoKSAgYXNtIHZvbGF0aWxlICgibWNyIHAxNSwgMCwgJTAsIGM3LCBjMCwgNCIgOjogInIiICgxKSkKKworI2VuZGlmIC8qIF9fQVJDSF9PTUFQX01URF9YSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdXguaAppbmRleCA1YmQzZjAwLi4xYjFhZDQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXV4LmgKQEAgLTE4NSw2ICsxODUsNyBAQAogCiAJLyogTVBVSU8gKi8KIAlNUFVJTzIsCisJTjE1XzE2MTBfTVBVSU8yLAogCU1QVUlPNCwKIAlNUFVJTzUsCiAJVDIwXzE2MTBfTVBVSU81LApAQCAtMjEwLDYgKzIxMSw3IEBACiAKIAkvKiBNaXNjIGJhbGxvdXRzICovCiAJQkFMTE9VVF9WOF9BUk1JTzMsCisJTjIwX0hEUSwKIAogCS8qIE9NQVAtMTYxMCBNTUMyICovCiAJVzhfMTYxMF9NTUMyX0RBVDAsCkBAIC0yMzUsNiArMjM3LDcgQEAKIAlQMjBfMTYxMF9HUElPNCwKIAlWOV8xNjEwX0dQSU83LAogCVc4XzE2MTBfR1BJTzksCisJTjIwXzE2MTBfR1BJTzExLAogCU4xOV8xNjEwX0dQSU8xMywKIAlQMTBfMTYxMF9HUElPMjIsCiAJVjVfMTYxMF9HUElPMjQsCkBAIC0yNTAsNyArMjUzLDcgQEAKIAlVMThfMTYxMF9VV0lSRV9TREksCiAJVzIxXzE2MTBfVVdJUkVfU0RPLAogCU4xNF8xNjEwX1VXSVJFX0NTMCwKLQlQMTVfMTYxMF9VV0lSRV9DUzAsCisJUDE1XzE2MTBfVVdJUkVfQ1MzLAogCU4xNV8xNjEwX1VXSVJFX0NTMSwKIAogCS8qIE9NQVAtMTYxMCBGbGFzaCAqLwpAQCAtNDExLDcgKzQxNCw4IEBACiBNVVhfQ0ZHKCJXMTVfMTcxMF9HUElPNDAiLCAgICAgICA5LCAgIDI3LCAgICA3LCAgIDIsICAgNSwgICAxLCAgICAyLCAgICAgMSwgIDEpCiAKIC8qIE1QVUlPICovCi1NVVhfQ0ZHKCJNUFVJTzIiLAkJIDcsICAgMTgsICAgIDAsCSAgMSwgICAxLCAgIDEsCSBOQSwJIDAsICAxKQorTVVYX0NGRygiTVBVSU8yIiwJCSA3LCAgIDE4LCAgICAwLAkgIDEsICAxNCwgICAxLAkgTkEsCSAwLCAgMSkKK01VWF9DRkcoIk4xNV8xNjEwX01QVUlPMiIsCSA3LCAgIDE4LCAgICAwLAkgIDEsICAxNCwgICAxLAkgIDEsCSAwLCAgMSkKIE1VWF9DRkcoIk1QVUlPNCIsCQkgNywgICAxNSwgICAgMCwJICAxLCAgMTMsICAgMSwJIE5BLAkgMCwgIDEpCiBNVVhfQ0ZHKCJNUFVJTzUiLAkJIDcsICAgMTIsICAgIDAsCSAgMSwgIDEyLCAgIDEsCSBOQSwJIDAsICAxKQogCkBAIC00MzgsNiArNDQyLDcgQEAKIAogLyogTWlzYyBiYWxsb3V0cyAqLwogTVVYX0NGRygiQkFMTE9VVF9WOF9BUk1JTzMiLAkgQiwgICAxOCwgICAgMCwJICAyLCAgMjUsICAgMSwJIE5BLAkgMCwgIDEpCitNVVhfQ0ZHKCJOMjBfSERRIiwJICAgICAgIDYsICAgMTgsICAgIDEsICAgMSwgICA0LCAgIDAsICAgIDEsICAgICA0LCAgMCkKIAogLyogT01BUC0xNjEwIE1NQzIgKi8KIE1VWF9DRkcoIlc4XzE2MTBfTU1DMl9EQVQwIiwJIEIsICAgMjEsICAgIDYsCSAgMiwgIDIzLCAgIDEsCSAgMiwJIDEsICAxKQpAQCAtNDYzLDYgKzQ2OCw3IEBACiBNVVhfQ0ZHKCJQMjBfMTYxMF9HUElPNCIsCSA2LCAgIDI3LCAgICAwLAkgIDEsICAgNywgICAwLAkgIDEsCSAxLCAgMSkKIE1VWF9DRkcoIlY5XzE2MTBfR1BJTzciLAkgQiwgICAxMiwgICAgMSwJICAyLCAgMjAsICAgMCwJICAyLAkgMSwgIDEpCiBNVVhfQ0ZHKCJXOF8xNjEwX0dQSU85IiwJIEIsICAgMjEsICAgIDAsCSAgMiwgIDIzLCAgIDAsCSAgMiwJIDEsICAxKQorTVVYX0NGRygiTjIwXzE2MTBfR1BJTzExIiwgICAgICAgNiwgICAxOCwgICAgMCwgICAxLCAgIDQsICAgMCwgICAgMSwgICAgIDEsICAxKQogTVVYX0NGRygiTjE5XzE2MTBfR1BJTzEzIiwJIDYsICAgMTIsICAgIDAsCSAgMSwgICAyLCAgIDAsCSAgMSwJIDEsICAxKQogTVVYX0NGRygiUDEwXzE2MTBfR1BJTzIyIiwJIEMsICAgIDAsICAgIDcsCSAgMiwgIDI2LCAgIDAsCSAgMiwJIDEsICAxKQogTVVYX0NGRygiVjVfMTYxMF9HUElPMjQiLAkgQiwgICAxNSwgICAgNywJICAyLCAgMjEsICAgMCwJICAyLAkgMSwgIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNTEwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNTEwLmgKaW5kZXggZjQ5MWE0OC4uZjA4NmEzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTUxMC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE1MTAuaApAQCAtMzYsMTAgKzM2LDYgQEAKIAogLyogU3ludGF4OiBYWF9CQVNFID0gVmlydHVhbCBiYXNlIGFkZHJlc3MsIFhYX1NUQVJUID0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCiAKLSNkZWZpbmUgT01BUDE1MTBfU1JBTV9CQVNFCTB4RDAwMDAwMDAKLSNkZWZpbmUgT01BUDE1MTBfU1JBTV9TSVpFCShTWl8xMjhLICsgU1pfNjRLKQotI2RlZmluZSBPTUFQMTUxMF9TUkFNX1NUQVJUCTB4MjAwMDAwMDAKLQogI2RlZmluZSBPTUFQMTUxMF9EU1BfQkFTRQkweEUwMDAwMDAwCiAjZGVmaW5lIE9NQVAxNTEwX0RTUF9TSVpFCTB4MjgwMDAKICNkZWZpbmUgT01BUDE1MTBfRFNQX1NUQVJUCTB4RTAwMDAwMDAKQEAgLTQ4LDE0ICs0NCw1IEBACiAjZGVmaW5lIE9NQVAxNTEwX0RTUFJFR19TSVpFCVNaXzEyOEsKICNkZWZpbmUgT01BUDE1MTBfRFNQUkVHX1NUQVJUCTB4RTEwMDAwMDAKIAotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE1lbW9yeSB1c2VkIGJ5IHBvd2VyIG1hbmFnZW1lbnQKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jZGVmaW5lIE9NQVAxNTEwX1NSQU1fSURMRV9TVVNQRU5ECShPTUFQMTUxMF9TUkFNX0JBU0UgKyBPTUFQMTUxMF9TUkFNX1NJWkUgLSAweDIwMCkKLSNkZWZpbmUgT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORAkoT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQgKyAweDEwMCkKLQogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVAxNTEwX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oCmluZGV4IDM4YTliOTUuLmYwYzdmMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE2eHguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNnh4LmgKQEAgLTM2LDExICszNiw2IEBACiAKIC8qIFN5bnRheDogWFhfQkFTRSA9IFZpcnR1YWwgYmFzZSBhZGRyZXNzLCBYWF9TVEFSVCA9IFBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLwogCi0jZGVmaW5lIE9NQVAxNlhYX1NSQU1fQkFTRQkweEQwMDAwMDAwCi0jZGVmaW5lIE9NQVAxNjEwX1NSQU1fU0laRQkoU1pfMTZLKQotI2RlZmluZSBPTUFQNTkxMl9TUkFNX1NJWkUJMHgzRTgwMAotI2RlZmluZSBPTUFQMTZYWF9TUkFNX1NUQVJUCTB4MjAwMDAwMDAKLQogI2RlZmluZSBPTUFQMTZYWF9EU1BfQkFTRQkweEUwMDAwMDAwCiAjZGVmaW5lIE9NQVAxNlhYX0RTUF9TSVpFCTB4MjgwMDAKICNkZWZpbmUgT01BUDE2WFhfRFNQX1NUQVJUCTB4RTAwMDAwMDAKQEAgLTUwLDE3ICs0NSw2IEBACiAjZGVmaW5lIE9NQVAxNlhYX0RTUFJFR19TVEFSVAkweEUxMDAwMDAwCiAKIC8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBNZW1vcnkgdXNlZCBieSBwb3dlciBtYW5hZ2VtZW50Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2RlZmluZSBPTUFQMTYxMF9TUkFNX0lETEVfU1VTUEVORAkoT01BUDE2WFhfU1JBTV9CQVNFICsgT01BUDE2MTBfU1JBTV9TSVpFIC0gMHgyMDApCi0jZGVmaW5lIE9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQJKE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5EICsgMHgxMDApCi0jZGVmaW5lIE9NQVA1OTEyX1NSQU1fSURMRV9TVVNQRU5ECShPTUFQMTZYWF9TUkFNX0JBU0UgKyBPTUFQNTkxMl9TUkFNX1NJWkUgLSAweDIwMCkKLSNkZWZpbmUgT01BUDU5MTJfU1JBTV9BUElfU1VTUEVORAkoT01BUDU5MTJfU1JBTV9JRExFX1NVU1BFTkQgKyAweDEwMCkKLQotLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSW50ZXJydXB0cwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAyNHh4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAyNHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMDU0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDI0eHguaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfT01BUDI0WFhfSAorI2RlZmluZSBfX0FTTV9BUkNIX09NQVAyNFhYX0gKKworI2RlZmluZSBPTUFQMjRYWF9MNF9JT19CQVNFCTB4NDgwMDAwMDAKKworLyogaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgT01BUDI0WFhfSUNfQkFTRQkoT01BUDI0WFhfTDRfSU9fQkFTRSArIDB4ZmUwMDApCisjZGVmaW5lIFZBX0lDX0JBU0UJCUlPX0FERFJFU1MoT01BUDI0WFhfSUNfQkFTRSkKKworI2RlZmluZSBPTUFQMjRYWF9JVkFfSU5UQ19CQVNFCTB4NDAwMDAwMDAKKworI2RlZmluZSBJUlFfU0lSX0lSUQkJMHgwMDQwCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX09NQVAyNFhYX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwNzMwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXA3MzAuaAppbmRleCA1OTlhYjAwLi43NTViNjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXA3MzAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXA3MzAuaApAQCAtMzYsMTAgKzM2LDYgQEAKIAogLyogU3ludGF4OiBYWF9CQVNFID0gVmlydHVhbCBiYXNlIGFkZHJlc3MsIFhYX1NUQVJUID0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCiAKLSNkZWZpbmUgT01BUDczMF9TUkFNX0JBU0UJMHhEMDAwMDAwMAotI2RlZmluZSBPTUFQNzMwX1NSQU1fU0laRQkoU1pfMTI4SyArIFNaXzY0SyArIFNaXzhLKQotI2RlZmluZSBPTUFQNzMwX1NSQU1fU1RBUlQJMHgyMDAwMDAwMAotCiAjZGVmaW5lIE9NQVA3MzBfRFNQX0JBU0UJMHhFMDAwMDAwMAogI2RlZmluZSBPTUFQNzMwX0RTUF9TSVpFCTB4NTAwMDAKICNkZWZpbmUgT01BUDczMF9EU1BfU1RBUlQJMHhFMDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9wbS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9wbS5oCmluZGV4IGYyMDlmYzAuLmZiZDc0MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvcG0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3BtLmgKQEAgLTYxLDcgKzYxLDEwIEBACiAjZGVmaW5lIFBFUl9FTgkJCQkweDEKIAogI2RlZmluZSBDUFVfU1VTUEVORF9TSVpFCQkyMDAKLSNkZWZpbmUgVUxQRF9MT1dfUE9XRVJfRU4JCTB4MDAwMQorI2RlZmluZSBVTFBEX0xPV19QV1JfRU4JCQkweDAwMDEKKyNkZWZpbmUgVUxQRF9ERUVQX1NMRUVQX1RSQU5TSVRJT05fRU4JMHgwMDEwCisjZGVmaW5lIFVMUERfU0VUVVBfQU5BTE9HX0NFTExfM19WQUwJMAorI2RlZmluZSBVTFBEX1BPV0VSX0NUUkxfUkVHX1ZBTAkJMHgwMjE5CiAKICNkZWZpbmUgRFNQX0lETEVfREVMQVkJCQkxMAogI2RlZmluZSBEU1BfSURMRQkJCTB4MDA0MApAQCAtODYsNDYgKzg5LDM1IEBACiAjZGVmaW5lIE9NQVAxNTEwX0JJR19TTEVFUF9SRVFVRVNUCTB4MGNjNQogI2RlZmluZSBPTUFQMTUxMF9JRExFX0xPT1BfUkVRVUVTVAkweDBjMDAKICNkZWZpbmUgT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TCTB4MgotI2RlZmluZSBPTUFQMTUxMF9VTFBEX0xPV19QT1dFUl9SRVEJMHgwMDAxCiAKLSNkZWZpbmUgT01BUDE2MTBfREVFUF9TTEVFUF9SRVFVRVNUCTB4MTdjNwotI2RlZmluZSBPTUFQMTYxMF9CSUdfU0xFRVBfUkVRVUVTVAlUQkQKKy8qIEJvdGggYmlnIHNsZWVwIGFuZCBkZWVwIHNsZWVwIHVzZSBzYW1lIHZhbHVlcy4gRGlmZmVyZW5jZSBpcyBpbiBVTFBELiAqLworI2RlZmluZSBPTUFQMTYxMF9JRExFQ1QxX1NMRUVQX1ZBTAkweDEzYzcKKyNkZWZpbmUgT01BUDE2MTBfSURMRUNUMl9TTEVFUF9WQUwJMHgwOWM3CisjZGVmaW5lIE9NQVAxNjEwX0lETEVDVDNfVkFMCQkweDNmCisjZGVmaW5lIE9NQVAxNjEwX0lETEVDVDNfU0xFRVBfT1JNQVNLCTB4MmMKKyNkZWZpbmUgT01BUDE2MTBfSURMRUNUMwkJMHhmZmZlY2UyNAogI2RlZmluZSBPTUFQMTYxMF9JRExFX0xPT1BfUkVRVUVTVAkweDA0MDAKLSNkZWZpbmUgT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TCTB4MDljNwotI2RlZmluZSBPTUFQMTYxMF9VTFBEX0xPV19QT1dFUl9SRVEJMHgzCi0KLSNpZm5kZWYgT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQKLSNkZWZpbmUgT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQgMAotI2VuZGlmCi0jaWZuZGVmIE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5ECi0jZGVmaW5lIE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5EIDAKLSNlbmRpZgotI2lmbmRlZiBPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORAotI2RlZmluZSBPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCAwCi0jZW5kaWYKLQotI2lmbmRlZiBPTUFQMTUxMF9TUkFNX0FQSV9TVVNQRU5ECi0jZGVmaW5lIE9NQVAxNTEwX1NSQU1fQVBJX1NVU1BFTkQgMAotI2VuZGlmCi0jaWZuZGVmIE9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQKLSNkZWZpbmUgT01BUDE2MTBfU1JBTV9BUElfU1VTUEVORCAwCi0jZW5kaWYKLSNpZm5kZWYgT01BUDU5MTJfU1JBTV9BUElfU1VTUEVORAotI2RlZmluZSBPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5EIDAKLSNlbmRpZgogCiAjaWYgICAgICFkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNTEwKSAmJiBcCi0JIWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJIWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpICYmIFwKKwkhZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkKICNlcnJvciAiUG93ZXIgbWFuYWdlbWVudCBmb3IgdGhpcyBwcm9jZXNzb3Igbm90IGltcGxlbWVudGVkIHlldCIKICNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KIGV4dGVybiB2b2lkIG9tYXBfcG1faWRsZSh2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXBfcG1fc3VzcGVuZCh2b2lkKTsKLWV4dGVybiBpbnQgb21hcDE1MTBfY3B1X3N1c3BlbmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKLWV4dGVybiBpbnQgb21hcDE2MTBfY3B1X3N1c3BlbmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKLWV4dGVybiBpbnQgb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQodm9pZCk7Ci1leHRlcm4gaW50IG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcDE1MTBfY3B1X3N1c3BlbmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkIG9tYXAxNjEwX2NwdV9zdXNwZW5kKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7CitleHRlcm4gdm9pZCBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCh2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kKHZvaWQpOworCisjaWZkZWYgQ09ORklHX09NQVBfU0VSSUFMX1dBS0UKK2V4dGVybiB2b2lkIG9tYXBfc2VyaWFsX3dha2VfdHJpZ2dlcihpbnQgZW5hYmxlKTsKKyNlbHNlCisjZGVmaW5lIG9tYXBfc2VyaWFsX3dha2VfdHJpZ2dlcih4KQl7fQorI2VuZGlmCS8qIENPTkZJR19PTUFQX1NFUklBTF9XQUtFICovCisKIGV4dGVybiB1bnNpZ25lZCBpbnQgb21hcDE1MTBfY3B1X3N1c3BlbmRfc3o7CiBleHRlcm4gdW5zaWduZWQgaW50IG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6OwogZXh0ZXJuIHVuc2lnbmVkIGludCBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zejsKQEAgLTE2MSw2ICsxNTMsNyBAQAogCUFSTV9TTEVFUF9TQVZFX0FSTV9DS0NUTCwKIAlBUk1fU0xFRVBfU0FWRV9BUk1fSURMRUNUMSwKIAlBUk1fU0xFRVBfU0FWRV9BUk1fSURMRUNUMiwKKwlBUk1fU0xFRVBfU0FWRV9BUk1fSURMRUNUMywKIAlBUk1fU0xFRVBfU0FWRV9BUk1fRVdVUENULAogCUFSTV9TTEVFUF9TQVZFX0FSTV9SU1RDVDEsCiAJQVJNX1NMRUVQX1NBVkVfQVJNX1JTVENUMiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTUyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3NlcmlhbC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9zZXJpYWwuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfU0VSSUFMX0gKKyNkZWZpbmUgX19BU01fQVJDSF9TRVJJQUxfSAorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKKy8qIE9NQVAxIHNlcmlhbCBwb3J0cyAqLworI2RlZmluZSBPTUFQX1VBUlQxX0JBU0UJCTB4ZmZmYjAwMDAKKyNkZWZpbmUgT01BUF9VQVJUMl9CQVNFCQkweGZmZmIwODAwCisjZGVmaW5lIE9NQVBfVUFSVDNfQkFTRQkJMHhmZmZiOTgwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikKKy8qIE9NQVAyIHNlcmlhbCBwb3J0cyAqLworI2RlZmluZSBPTUFQX1VBUlQxX0JBU0UJCTB4NDgwNmEwMDAKKyNkZWZpbmUgT01BUF9VQVJUMl9CQVNFCQkweDQ4MDZjMDAwCisjZGVmaW5lIE9NQVBfVUFSVDNfQkFTRQkJMHg0ODA2ZTAwMAorI2VuZGlmCisKKyNkZWZpbmUgT01BUF9NQVhfTlJfUE9SVFMJMworI2RlZmluZSBPTUFQMTUxMF9CQVNFX0JBVUQJKDEyMDAwMDAwLzE2KQorI2RlZmluZSBPTUFQMTZYWF9CQVNFX0JBVUQJKDQ4MDAwMDAwLzE2KQorCisjZGVmaW5lIGlzX29tYXBfcG9ydChwKQkoe2ludCBfX3JldCA9IDA7CQkJXAorCQkJaWYgKHAgPT0gSU9fQUREUkVTUyhPTUFQX1VBUlQxX0JBU0UpIHx8CVwKKwkJCSAgICBwID09IElPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSB8fAlcCisJCQkgICAgcCA9PSBJT19BRERSRVNTKE9NQVBfVUFSVDNfQkFTRSkpCVwKKwkJCQlfX3JldCA9IDE7CQkJXAorCQkJX19yZXQ7CQkJCQlcCisJCQl9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvdW5jb21wcmVzcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91bmNvbXByZXNzLmgKaW5kZXggM2U2NDBhYi4uMzU0NWM4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91bmNvbXByZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91bmNvbXByZXNzLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3NlcmlhbC5oPgogCiB1bnNpZ25lZCBpbnQgc3lzdGVtX3JldjsKIApAQCAtMzQsOCArMzQsOSBAQAogcHV0c3RyKGNvbnN0IGNoYXIgKnMpCiB7CiAJdm9sYXRpbGUgdTggKiB1YXJ0ID0gMDsKLQlpbnQgc2hpZnQ7CisJaW50IHNoaWZ0ID0gMjsKIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAKICNpZmRlZglDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMwogCXVhcnQgPSAodm9sYXRpbGUgdTggKikoT01BUF9VQVJUM19CQVNFKTsKICNlbGlmCUNPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyCkBAIC00NCw2ICs0NSw3IEBACiAJdWFydCA9ICh2b2xhdGlsZSB1OCAqKShPTUFQX1VBUlQxX0JBU0UpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQogCS8qIERldGVybWluZSB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KIAlkbyB7CiAJCS8qIE1NVSBpcyBub3Qgb24sIHNvIGNwdV9pc19vbWFwWFhYWCgpIHdvbid0IHdvcmsgaGVyZSAqLwpAQCAtNTEsMTQgKzUzLDE0IEBACiAKIAkJaWYgKG9tYXBfaWQgPT0gT01BUF9JRF83MzApCiAJCQlzaGlmdCA9IDA7Ci0JCWVsc2UKLQkJCXNoaWZ0ID0gMjsKIAogCQlpZiAoY2hlY2tfcG9ydCh1YXJ0LCBzaGlmdCkpCiAJCQlicmVhazsKIAkJLyogU2lsZW50IGJvb3QgaWYgbm8gc2VyaWFsIHBvcnRzIGFyZSBlbmFibGVkLiAqLwogCQlyZXR1cm47CiAJfSB3aGlsZSAoMCk7CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDEgKi8KKyNlbmRpZgogCiAJLyoKIAkgKiBOb3csIHhtaXQgZWFjaCBjaGFyYWN0ZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9jb3JnaS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2NvcmdpLmgKaW5kZXggMzI0ZGIwNi4uNGI3YWEwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2NvcmdpLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2NvcmdpLmgKQEAgLTEwMywxOCArMTAzLDIwIEBACiAgKiBTaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzCiAgKi8KIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpc2Nvb3BfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lzc3BfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lmYl9kZXZpY2U7CiAKIC8qCiAgKiBFeHRlcm5hbCBGdW5jdGlvbnMKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29yZ2lfc3NwX2Fkczc4NDZfcHV0Z2V0KHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29yZ2lfc3NwX2Fkczc4NDZfZ2V0KHZvaWQpOwotZXh0ZXJuIHZvaWQgY29yZ2lfc3NwX2Fkczc4NDZfcHV0KHVsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgY29yZ2lfc3NwX2Fkczc4NDZfcHV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gdm9pZCBjb3JnaV9zc3BfYWRzNzg0Nl9sb2NrKHZvaWQpOwogZXh0ZXJuIHZvaWQgY29yZ2lfc3NwX2Fkczc4NDZfdW5sb2NrKHZvaWQpOwotZXh0ZXJuIHZvaWQgY29yZ2lfc3NwX2xjZHRnX3NlbmQgKHU4IGFkcnMsIHU4IGRhdGEpOworZXh0ZXJuIHZvaWQgY29yZ2lfc3NwX2xjZHRnX3NlbmQgKHVuc2lnbmVkIGNoYXIgYWRycywgdW5zaWduZWQgY2hhciBkYXRhKTsKIGV4dGVybiB2b2lkIGNvcmdpX3NzcF9ibGR1dHlfc2V0KGludCBkdXR5KTsKLWV4dGVybiBpbnQgY29yZ2lfc3NwX21heDExMTFfZ2V0KHVsb25nIGRhdGEpOworZXh0ZXJuIGludCBjb3JnaV9zc3BfbWF4MTExMV9nZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQ09SR0lfSCAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaGFyZHdhcmUuaAppbmRleCA3MmIwNGQ4Li5jZjM1NzIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaGFyZHdhcmUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaGFyZHdhcmUuaApAQCAtNDQsMjQgKzQ0LDEyIEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpZiAwCi0jIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdTMyICopaW9fcDJ2KHgpKSkKLSNlbHNlCi0vKgotICogVGhpcyBfX1JFRygpIHZlcnNpb24gZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgb25lIGFib3ZlLCAgZXhjZXB0Ci0gKiB0aGF0IHdlIGFyZSBmb29saW5nIGdjYyBzb21laG93IHNvIGl0IGdlbmVyYXRlcyBmYXIgYmV0dGVyIGFuZCBzbWFsbGVyCi0gKiBhc3NlbWJseSBjb2RlIGZvciBhY2Nlc3MgdG8gY29udGlnb3VzIHJlZ2lzdGVycy4gIEl0J3MgYSBzaGFtZSB0aGF0IGdjYwotICogZG9lc24ndCBndWVzcyB0aGlzIGJ5IGl0c2VsZi4KLSAqLwotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSB1MzIgb2Zmc2V0WzQwOTZdOyB9IF9fcmVnYmFzZTsKLSMgZGVmaW5lIF9fUkVHUCh4KQkoKF9fcmVnYmFzZSAqKSgoeCkmfjQwOTUpKS0+b2Zmc2V0WygoeCkmNDA5NSk+PjJdCi0jIGRlZmluZSBfX1JFRyh4KQlfX1JFR1AoaW9fcDJ2KHgpKQotI2VuZGlmCisjIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWlvX3Aydih4KSkpCiAKIC8qIFdpdGggaW5kZXhlZCByZWdzIHdlIGRvbid0IHdhbnQgdG8gZmVlZCB0aGUgaW5kZXggdGhyb3VnaCBpb19wMnYoKQogICAgZXNwZWNpYWxseSBpZiBpdCBpcyBhIHZhcmlhYmxlLCBvdGhlcndpc2UgaG9ycmlibGUgY29kZSB3aWxsIHJlc3VsdC4gKi8KLSMgZGVmaW5lIF9fUkVHMih4LHkpICAgICAoKih2b2xhdGlsZSB1MzIgKikoKHUzMikmX19SRUcoeCkgKyAoeSkpKQorIyBkZWZpbmUgX19SRUcyKHgseSkJXAorCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpJl9fUkVHKHgpICsgKHkpKSkKIAogIyBkZWZpbmUgX19QUkVHKHgpCShpb192MnAoKHUzMikmKHgpKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2kyYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWMyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaTJjLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBpMmNfcHhhLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludHJpbnN5YyBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpZm5kZWYgX0kyQ19QWEFfSF8KKyNkZWZpbmUgX0kyQ19QWEFfSF8KKworI2lmIDAKKyNkZWZpbmUgREVGX1RJTUVPVVQgICAgICAgICAgICAgMworI2Vsc2UKKy8qIG5lZWQgYSBsb25nZXIgdGltZW91dCBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIGZhY3Qgd2UgbWF5IHdlbGwgYmUKKyAqIGxvb2tpbmcgYXQgYSBtdWx0aS1tYXN0ZXIgZW52aXJvbm1lbnQKKyovCisjZGVmaW5lIERFRl9USU1FT1VUICAgICAgICAgICAgIDMyCisjZW5kaWYKKworI2RlZmluZSBCVVNfRVJST1IgICAgICAgICAgICAgICAoLUVSRU1PVEVJTykKKyNkZWZpbmUgWEZFUl9OQUtFRCAgICAgICAgICAgICAgKC1FQ09OTlJFRlVTRUQpCisjZGVmaW5lIEkyQ19SRVRSWSAgICAgICAgICAgICAgICgtMjAwMCkgLyogYW4gZXJyb3IgaGFzIG9jY3VycmVkIHJldHJ5IHRyYW5zbWl0ICovCisKKy8qIElDUiBpbml0aWFsaXplIGJpdCB2YWx1ZXMKKyoKKyogIDE1LiBGTSAgICAgICAwICgxMDAgS2h6IG9wZXJhdGlvbikKKyogIDE0LiBVUiAgICAgICAwIChObyB1bml0IHJlc2V0KQorKiAgMTMuIFNBRElFICAgIDAgKERpc2FibGVzIHRoZSB1bml0IGZyb20gaW50ZXJydXB0aW5nIG9uIHNsYXZlIGFkZHJlc3NlcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nIGl0cyBzbGF2ZSBhZGRyZXNzKQorKiAgMTIuIEFMRElFICAgIDAgKERpc2FibGVzIHRoZSB1bml0IGZyb20gaW50ZXJydXB0IHdoZW4gaXQgbG9zZXMgYXJiaXRyYXRpb24KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtYXN0ZXIgbW9kZSkKKyogIDExLiBTU0RJRSAgICAwIChEaXNhYmxlcyBpbnRlcnJ1cHRzIGZyb20gYSBzbGF2ZSBzdG9wIGRldGVjdGVkLCBpbiBzbGF2ZSBtb2RlKQorKiAgMTAuIEJFSUUgICAgIDEgKEVuYWJsZSBpbnRlcnJ1cHRzIGZyb20gZGV0ZWN0ZWQgYnVzIGVycm9ycywgbm8gQUNLIHNlbnQpCisqICA5LiAgSVJGSUUgICAgMSAoRW5hYmxlIGludGVycnVwdHMgZnJvbSBmdWxsIGJ1ZmZlciByZWNlaXZlZCkKKyogIDguICBJVEVJRSAgICAxIChFbmFibGVzIHRoZSBJMkMgdW5pdCB0byBpbnRlcnJ1cHQgd2hlbiB0cmFuc21pdCBidWZmZXIgZW1wdHkpCisqICA3LiAgR0NEICAgICAgMSAoRGlzYWJsZXMgaTJjIHVuaXQgcmVzcG9uc2UgdG8gZ2VuZXJhbCBjYWxsIG1lc3NhZ2VzIGFzIGEgc2xhdmUpCisqICA2LiAgSVVFICAgICAgMCAoRGlzYWJsZSB1bml0IHVudGlsIHdlIGNoYW5nZSBzZXR0aW5ncykKKyogIDUuICBTQ0xFICAgICAxIChFbmFibGVzIHRoZSBpMmMgY2xvY2sgb3V0cHV0IGZvciBtYXN0ZXIgbW9kZSAoZHJpdmVzIFNDTCkKKyogIDQuICBNQSAgICAgICAwIChPbmx5IHNlbmQgc3RvcCB3aXRoIHRoZSBJQ1Igc3RvcCBiaXQpCisqICAzLiAgVEIgICAgICAgMCAoV2UgYXJlIG5vdCB0cmFuc21pdHRpbmcgYSBieXRlIGluaXRpYWxseSkKKyogIDIuICBBQ0tOQUsgICAwIChTZW5kIGFuIEFDSyBhZnRlciB0aGUgdW5pdCByZWNlaXZlcyBhIGJ5dGUpCisqICAxLiAgU1RPUCAgICAgMCAoRG8gbm90IHNlbmQgYSBTVE9QKQorKiAgMC4gIFNUQVJUICAgIDAgKERvIG5vdCBzZW5kIGEgU1RBUlQpCisqCisqLworI2RlZmluZSBJMkNfSUNSX0lOSVQJKElDUl9CRUlFIHwgSUNSX0lSRklFIHwgSUNSX0lURUlFIHwgSUNSX0dDRCB8IElDUl9TQ0xFKQorCisvKiBJMkMgc3RhdHVzIHJlZ2lzdGVyIGluaXQgdmFsdWVzCisgKgorICogMTAuIEJFRCAgICAgIDEgKENsZWFyIGJ1cyBlcnJvciBkZXRlY3RlZCkKKyAqIDkuICBTQUQgICAgICAxIChDbGVhciBzbGF2ZSBhZGRyZXNzIGRldGVjdGVkKQorICogNy4gIElSRiAgICAgIDEgKENsZWFyIElEQlIgUmVjZWl2ZSBGdWxsKQorICogNi4gIElURSAgICAgIDEgKENsZWFyIElEQlIgVHJhbnNtaXQgRW1wdHkpCisgKiA1LiAgQUxEICAgICAgMSAoQ2xlYXIgQXJiaXRyYXRpb24gTG9zcyBEZXRlY3RlZCkKKyAqIDQuICBTU0QgICAgICAxIChDbGVhciBTbGF2ZSBTdG9wIERldGVjdGVkKQorICovCisjZGVmaW5lIEkyQ19JU1JfSU5JVAkweDdGRiAgLyogc3RhdHVzIHJlZ2lzdGVyIGluaXQgKi8KKworc3RydWN0IGkyY19zbGF2ZV9jbGllbnQ7CisKK3N0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludAkJc2xhdmVfYWRkcjsKKwlzdHJ1Y3QgaTJjX3NsYXZlX2NsaWVudAkqc2xhdmU7Cit9OworCitleHRlcm4gdm9pZCBweGFfc2V0X2kyY19pbmZvKHN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgKmluZm8pOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvbW1jLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvbW1jLmgKaW5kZXggNzQ5MmVhNy4uODhjMTdkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL21tYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tbWMuaApAQCAtOSw3ICs5LDkgQEAKIAogc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHsKIAl1bnNpZ25lZCBpbnQgb2NyX21hc2s7CQkJLyogYXZhaWxhYmxlIHZvbHRhZ2VzICovCisJdW5zaWduZWQgbG9uZyBkZXRlY3RfZGVsYXk7CQkvKiBkZWxheSBpbiBqaWZmaWVzIGJlZm9yZSBkZXRlY3RpbmcgY2FyZHMgYWZ0ZXIgaW50ZXJydXB0ICovCiAJaW50ICgqaW5pdCkoc3RydWN0IGRldmljZSAqLCBpcnFyZXR1cm5fdCAoKikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB2b2lkICopOworCWludCAoKmdldF9ybykoc3RydWN0IGRldmljZSAqKTsKIAl2b2lkICgqc2V0cG93ZXIpKHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKIAl2b2lkICgqZXhpdCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGFmYi5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YWZiLmgKaW5kZXggMjdkNzFlOS4uMjFjMGUxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YWZiLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YWZiLmgKQEAgLTY2LDMgKzY2LDQgQEAKIAogfTsKIHZvaWQgc2V0X3B4YV9mYl9pbmZvKHN0cnVjdCBweGFmYl9tYWNoX2luZm8gKmhhcmRfcHhhX2ZiX2luZm8pOwordW5zaWduZWQgbG9uZyBweGFmYl9nZXRfaHN5bmNfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtY3BsZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtY3BsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzViMTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2FudWJpcy1jcGxkLmgKQEAgLTAsMCArMSwyNCBAQAorLyogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtY3BsZC5oCisgKgorICogKGMpIDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBBTlVCSVMgLSBDUExEIGNvbnRyb2wgY29uc3RhbnRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDaGFuZ2Vsb2c6CisgKgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0FOVUJJU0NQTERfSAorI2RlZmluZSBfX0FTTV9BUkNIX0FOVUJJU0NQTERfSAorCisvKiBDVFJMMiAtIE5BTkQgV1AgY29udHJvbCwgSURFIFJlc2V0IGFzc2VydC9jaGVjayAqLworCisjZGVmaW5lIEFOVUJJU19DVFJMMV9OQU5EU0VMCQkoMHgzKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9BTlVCSVNDUExEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLWlycS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmMTVkYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLWlycS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLWlycS5oCisgKgorICogKGMpIDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiAgQU5VQklTIC0gSVJRIE51bWJlciBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ2hhbmdlbG9nOgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9BTlVCSVNJUlFfSAorI2RlZmluZSBfX0FTTV9BUkNIX0FOVUJJU0lSUV9ICisKKyNkZWZpbmUgSVJRX0lERTAgICAgICAgSVJRX0VJTlQyCisjZGVmaW5lIElSUV9JREUxICAgICAgIElSUV9FSU5UMworI2RlZmluZSBJUlFfQVNJWCAgICAgICBJUlFfRUlOVDEKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQU5VQklTSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLW1hcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hbnViaXMtbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3NDFkNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLW1hcC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYW51YmlzLW1hcC5oCisgKgorICogKGMpIDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBBTlVCSVMgLSBNZW1vcnkgbWFwIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDaGFuZ2Vsb2c6CisqLworCisvKiBuZWVkcyBhcmNoL21hcC5oIGluY2x1ZGluZyB3aXRoIHRoaXMgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0FOVUJJU01BUF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfQU5VQklTTUFQX0gKKworLyogc3RhcnQgcGVyaXBoZXJhbHMgb2ZmIGFmdGVyIHRoZSBTM0MyNDEwICovCisKKyNkZWZpbmUgQU5VQklTX0lPQUREUih4KQkoUzNDMjQxMF9BRERSKCh4KSArIDB4MDIwMDAwMDApKQorCisjZGVmaW5lIEFOVUJJU19QQV9DUExECQkoUzNDMjQxMF9DUzEgfCAoMTw8MjYpKQorCisvKiB3ZSBwdXQgdGhlIENQTEQgcmVnaXN0ZXJzIG5leHQsIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5ICovCisKKyNkZWZpbmUgQU5VQklTX1ZBX0NUUkwxCSAgICBBTlVCSVNfSU9BRERSKDB4MDAwMDAwMDApCSAvKiAweDAxMzAwMDAwICovCisjZGVmaW5lIEFOVUJJU19QQV9DVFJMMQkgICAgKEFOVUJJU19QQV9DUExEKQorCisjZGVmaW5lIEFOVUJJU19WQV9DVFJMMgkgICAgQU5VQklTX0lPQUREUigweDAwMTAwMDAwKQkgLyogMHgwMTQwMDAwMCAqLworI2RlZmluZSBBTlVCSVNfUEFfQ1RSTDIJICAgIChBTlVCSVNfUEFfQ1BMRCkKKworI2RlZmluZSBBTlVCSVNfVkFfQ1RSTDMJICAgIEFOVUJJU19JT0FERFIoMHgwMDIwMDAwMCkJIC8qIDB4MDE1MDAwMDAgKi8KKyNkZWZpbmUgQU5VQklTX1BBX0NUUkwzCSAgICAoQU5VQklTX1BBX0NQTEQpCisKKyNkZWZpbmUgQU5VQklTX1ZBX0NUUkw0CSAgICBBTlVCSVNfSU9BRERSKDB4MDAzMDAwMDApCSAvKiAweDAxNjAwMDAwICovCisjZGVmaW5lIEFOVUJJU19QQV9DVFJMNAkgICAgKEFOVUJJU19QQV9DUExEKQorCisjZGVmaW5lIEFOVUJJU19JREVQUkkJICAgIEFOVUJJU19JT0FERFIoMHgwMTAwMDAwMCkKKyNkZWZpbmUgQU5VQklTX0lERVBSSUFVWCAgICBBTlVCSVNfSU9BRERSKDB4MDExMDAwMDApCisjZGVmaW5lIEFOVUJJU19JREVTRUMJICAgIEFOVUJJU19JT0FERFIoMHgwMTIwMDAwMCkKKyNkZWZpbmUgQU5VQklTX0lERVNFQ0FVWCAgICBBTlVCSVNfSU9BRERSKDB4MDEzMDAwMDApCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0FOVUJJU01BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2ZiLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1N2JjOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZmIuaApAQCAtMCwwICsxLDY5IEBACisvKiBsaW51eC9pbmNsdWRlL2FzbS9hcmNoLXMzYzI0MTAvZmIuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICoKKyAqIEluc3BpcmVkIGJ5IHB4YWZiLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiAgQ2hhbmdlbG9nOgorICoJMDctU2VwLTIwMDQJUlRQCUNyZWF0ZWQgZmlsZQorICoJMDMtTm92LTIwMDQJQkpECVVwZGF0ZWQgYW5kIG1pbm9yIGNsZWFudXBzCisgKgkwMy1BdWctMjAwNSAgICAgUlRQICAgICBSZW5hbWVkIHRvIGZiLmgKKyovCisKKyNpZm5kZWYgX19BU01fQVJNX0ZCX0gKKyNkZWZpbmUgX19BU01fQVJNX0ZCX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtbGNkLmg+CisKK3N0cnVjdCBzM2MyNDEwZmJfdmFsIHsKKwl1bnNpZ25lZCBpbnQJZGVmdmFsOworCXVuc2lnbmVkIGludAltaW47CisJdW5zaWduZWQgaW50CW1heDsKK307CisKK3N0cnVjdCBzM2MyNDEwZmJfaHcgeworCXVuc2lnbmVkIGxvbmcJbGNkY29uMTsKKwl1bnNpZ25lZCBsb25nCWxjZGNvbjI7CisJdW5zaWduZWQgbG9uZwlsY2Rjb24zOworCXVuc2lnbmVkIGxvbmcJbGNkY29uNDsKKwl1bnNpZ25lZCBsb25nCWxjZGNvbjU7Cit9OworCitzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyB7CisJdW5zaWduZWQgY2hhcglmaXhlZF9zeW5jczsJLyogZG8gbm90IHVwZGF0ZSBzeW5jL2JvcmRlciAqLworCisJLyogU2NyZWVuIHNpemUgKi8KKwlpbnQJCXdpZHRoOworCWludAkJaGVpZ2h0OworCisJLyogU2NyZWVuIGluZm8gKi8KKwlzdHJ1Y3QgczNjMjQxMGZiX3ZhbCB4cmVzOworCXN0cnVjdCBzM2MyNDEwZmJfdmFsIHlyZXM7CisJc3RydWN0IHMzYzI0MTBmYl92YWwgYnBwOworCisJLyogbGNkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJc3RydWN0IHMzYzI0MTBmYl9odyAgcmVnczsKKworCS8qIEdQSU9zICovCisKKwl1bnNpZ25lZCBsb25nCWdwY3VwOworCXVuc2lnbmVkIGxvbmcJZ3BjdXBfbWFzazsKKwl1bnNpZ25lZCBsb25nCWdwY2NvbjsKKwl1bnNpZ25lZCBsb25nCWdwY2Nvbl9tYXNrOworCXVuc2lnbmVkIGxvbmcJZ3BkdXA7CisJdW5zaWduZWQgbG9uZwlncGR1cF9tYXNrOworCXVuc2lnbmVkIGxvbmcJZ3BkY29uOworCXVuc2lnbmVkIGxvbmcJZ3BkY29uX21hc2s7CisKKwkvKiBscGMzNjAwIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBsb25nCWxwY3NlbDsKK307CisKK3ZvaWQgX19pbml0IHNldF9zM2MyNDEwZmJfaW5mbyhzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyAqaGFyZF9zM2MyNDEwZmJfaW5mbyk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUk1fRkJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWxjZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWxjZC5oCmluZGV4IDdmODgyZWEuLmI2YjFiNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1sY2QuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtbGNkLmgKQEAgLTUxLDIxICs1MSwzMiBAQAogCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09OMV9FTlZJRAkgICAoMSkKIAorI2RlZmluZSBTM0MyNDEwX0xDRENPTjFfTU9ERU1BU0sgICAgMHgxRQorCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09OMl9WQlBEKHgpCSAgICAoKHgpIDw8IDI0KQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjJfTElORVZBTCh4KSAgKCh4KSA8PCAxNCkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04yX1ZGUEQoeCkJICAgICgoeCkgPDwgNikKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04yX1ZTUFcoeCkJICAgICgoeCkgPDwgMCkKIAorI2RlZmluZSBTM0MyNDEwX0xDRENPTjJfR0VUX1ZCUEQoeCkgKCAoKHgpID4+IDI0KSAmIDB4RkYpCisjZGVmaW5lIFMzQzI0MTBfTENEQ09OMl9HRVRfVkZQRCh4KSAoICgoeCkgPj4gIDYpICYgMHhGRikKKyNkZWZpbmUgUzNDMjQxMF9MQ0RDT04yX0dFVF9WU1BXKHgpICggKCh4KSA+PiAgMCkgJiAweDNGKQorCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09OM19IQlBEKHgpCSAgICAoKHgpIDw8IDE5KQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjNfV0RMWSh4KQkgICAgKCh4KSA8PCAxOSkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04zX0hPWlZBTCh4KSAgICgoeCkgPDwgOCkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04zX0hGUEQoeCkJICAgICgoeCkgPDwgMCkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT04zX0xJTkVCTEFOSyh4KSgoeCkgPDwgMCkKIAorI2RlZmluZSBTM0MyNDEwX0xDRENPTjNfR0VUX0hCUEQoeCkgKCAoKHgpID4+IDE5KSAmIDB4N0YpCisjZGVmaW5lIFMzQzI0MTBfTENEQ09OM19HRVRfSEZQRCh4KSAoICgoeCkgPj4gIDApICYgMHhGRikKKwogI2RlZmluZSBTM0MyNDEwX0xDRENPTjRfTVZBTCh4KQkgICAgKCh4KSA8PCA4KQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjRfSFNQVyh4KQkgICAgKCh4KSA8PCAwKQogI2RlZmluZSBTM0MyNDEwX0xDRENPTjRfV0xIKHgpCSAgICAoKHgpIDw8IDApCiAKKyNkZWZpbmUgUzNDMjQxMF9MQ0RDT040X0dFVF9IU1BXKHgpICggKCh4KSA+PiAgMCkgJiAweEZGKQorCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09ONV9CUFAyNEJMCSAgICAoMTw8MTIpCiAjZGVmaW5lIFMzQzI0MTBfTENEQ09ONV9GUk01NjUJICAgICgxPDwxMSkKICNkZWZpbmUgUzNDMjQxMF9MQ0RDT041X0lOVlZDTEsJICAgICgxPDwxMCkKQEAgLTEwMCwxMCArMTExLDE2IEBACiAjZGVmaW5lIFMzQzI0MTBfRElUSE1PREUgICBTM0MyNDEwX0xDRFJFRygweDRDKQogI2RlZmluZSBTM0MyNDEwX1RQQUwJICAgUzNDMjQxMF9MQ0RSRUcoMHg1MCkKIAorI2RlZmluZSBTM0MyNDEwX1RQQUxfRU4JCSgxPDwyNCkKKwogLyogaW50ZXJydXB0IGluZm8gKi8KICNkZWZpbmUgUzNDMjQxMF9MQ0RJTlRQTkQgIFMzQzI0MTBfTENEUkVHKDB4NTQpCiAjZGVmaW5lIFMzQzI0MTBfTENEU1JDUE5EICBTM0MyNDEwX0xDRFJFRygweDU4KQogI2RlZmluZSBTM0MyNDEwX0xDRElOVE1TSyAgUzNDMjQxMF9MQ0RSRUcoMHg1QykKKyNkZWZpbmUgUzNDMjQxMF9MQ0RJTlRfRklXU0VMCSgxPDwyKQorI2RlZmluZQlTM0MyNDEwX0xDRElOVF9GUlNZTkMJKDE8PDEpCisjZGVmaW5lIFMzQzI0MTBfTENESU5UX0ZJQ05UCSgxPDwwKQorCiAjZGVmaW5lIFMzQzI0MTBfTFBDU0VMCSAgIFMzQzI0MTBfTENEUkVHKDB4NjApCiAKICNkZWZpbmUgUzNDMjQxMF9URlRQQUwoeCkgIFMzQzI0MTBfTENEUkVHKCgweDQwMCArICh4KSo0KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2hhcmR3YXJlLmgKaW5kZXggMTBjNjJkYi4uMTljM2IxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2hhcmR3YXJlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2hhcmR3YXJlLmgKQEAgLTQ5LDIzICs0OSw5IEBACiAgICAoICgoKHgpJjB4MDBmZmZmZmYpIHwgKCgoeCkmKDB4MzAwMDAwMDA+PlZJT19TSElGVCkpPDxWSU9fU0hJRlQpKSArIFBJT19TVEFSVCApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKLSNpZiAwCi0jIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdTMyICopaW9fcDJ2KHgpKSkKLSNlbHNlCi0vKgotICogVGhpcyBfX1JFRygpIHZlcnNpb24gZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgb25lIGFib3ZlLCAgZXhjZXB0Ci0gKiB0aGF0IHdlIGFyZSBmb29saW5nIGdjYyBzb21laG93IHNvIGl0IGdlbmVyYXRlcyBmYXIgYmV0dGVyIGFuZCBzbWFsbGVyCi0gKiBhc3NlbWJseSBjb2RlIGZvciBhY2Nlc3MgdG8gY29udGlnb3VzIHJlZ2lzdGVycy4gIEl0J3MgYSBzaGFtZSB0aGF0IGdjYwotICogZG9lc24ndCBndWVzcyB0aGlzIGJ5IGl0c2VsZi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSB1MzIgb2Zmc2V0WzQwOTZdOyB9IF9fcmVnYmFzZTsKLSMgZGVmaW5lIF9fUkVHUCh4KQkoKF9fcmVnYmFzZSAqKSgoeCkmfjQwOTUpKS0+b2Zmc2V0WygoeCkmNDA5NSk+PjJdCi0jIGRlZmluZSBfX1JFRyh4KQlfX1JFR1AoaW9fcDJ2KHgpKQotI2VuZGlmCi0KLSMgZGVmaW5lIF9fUFJFRyh4KQkoaW9fdjJwKCh1MzIpJih4KSkpCisjIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWlvX3Aydih4KSkpCisjIGRlZmluZSBfX1BSRUcoeCkJKGlvX3YycCgodW5zaWduZWQgbG9uZykmKHgpKSkKIAogI2Vsc2UKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tYXJtL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTM2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNQVJNX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNQVJNX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLWFybS9jYWNoZWZsdXNoLmgKaW5kZXggMDM1Y2RjZi4uZTgxYmFmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vY2FjaGVmbHVzaC5oCkBAIC0yNTYsNyArMjU2LDcgQEAKICAqIENvbnZlcnQgY2FsbHMgdG8gb3VyIGNhbGxpbmcgY29udmVudGlvbi4KICAqLwogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJX19jcHVjX2ZsdXNoX2tlcm5fYWxsKCkKLQorI2lmbmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW0tPmNwdV92bV9tYXNrKSkKQEAgLTI3OSw2ICsyNzksMTEgQEAKIAkJX19jcHVjX2ZsdXNoX3VzZXJfcmFuZ2UoYWRkciwgYWRkciArIFBBR0VfU0laRSwgdm1hLT52bV9mbGFncyk7CiAJfQogfQorI2Vsc2UKK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwgdW5zaWduZWQgbG9uZyBwZm4pOworI2VuZGlmCiAKIC8qCiAgKiBmbHVzaF9jYWNoZV91c2VyX3JhbmdlIGlzIHVzZWQgd2hlbiB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1hcm0vZmNudGwuaAppbmRleCA0ODViNmJkLi5hODBiNjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZmNudGwuaApAQCAtMSw4NyArMSwxMSBAQAogI2lmbmRlZiBfQVJNX0ZDTlRMX0gKICNkZWZpbmUgX0FSTV9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19ESVJFQ1RPUlkJIDA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KICNkZWZpbmUgT19ESVJFQ1QJMDIwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAKLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAKLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKLSNkZWZpbmUgRl9TRVRPV04JOAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUT1dOCTkJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oIGIvaW5jbHVkZS9hc20tYXJtL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1hcm0vaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BjaS5oIGIvaW5jbHVkZS9hc20tYXJtL3BjaS5oCmluZGV4IDM4ZWE1ODkuLmVhZDNjZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcGNpLmgKQEAgLTY0LDYgKzY0LDE5IEBACiBwY2liaW9zX2J1c190b19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKIAkJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKgorcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IHJlc291cmNlICpyb290ID0gTlVMTDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKworCXJldHVybiByb290OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2suaAppbmRleCAxZjkwNmQwLi5jYjQ5MDZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2suaApAQCAtMTYsMjEgKzE2LDE0IEBACiAgKiBVbmxvY2tlZCB2YWx1ZTogMAogICogTG9ja2VkIHZhbHVlOiAxCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7CiAKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VECShzcGlubG9ja190KSB7IDAgfQorI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkJKCh4KS0+bG9jayAhPSAwKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxvY2spIFwKKwlkbyB7IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUgKHNwaW5faXNfbG9ja2VkKHgpKQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCkBAIC00Nyw3ICs0MCw3IEBACiAJc21wX21iKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTY3LDcgKzYwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJc21wX21iKCk7CiAKQEAgLTgwLDIzICs3MywxNCBAQAogCiAvKgogICogUldMT0NLUwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLQotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VECShyd2xvY2tfdCkgeyAwIH0KLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHJ3bG9ja19pc19sb2NrZWQoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSh4KSkgIT0gMCkKLQotLyoKKyAqCisgKgogICogV3JpdGUgbG9ja3MgYXJlIGVhc3kgLSB3ZSBqdXN0IHNldCBiaXQgMzEuICBXaGVuIHVubG9ja2luZywgd2UgY2FuCiAgKiBqdXN0IHdyaXRlIHplcm8gc2luY2UgdGhlIGxvY2sgaXMgZXhjbHVzaXZlbHkgaGVsZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCisjZGVmaW5lIHJ3bG9ja19pc19sb2NrZWQoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSh4KSkgIT0gMCkKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCkBAIC0xMTMsNyArOTcsNyBAQAogCXNtcF9tYigpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTEzMyw3ICsxMTcsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlzbXBfbWIoKTsKIApAQCAtMTU2LDcgKzE0MCw3IEBACiAgKiBjdXJyZW50bHkgYWN0aXZlLiAgSG93ZXZlciwgd2Uga25vdyB3ZSB3b24ndCBoYXZlIGFueSB3cml0ZQogICogbG9ja3MuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAsIHRtcDI7CiAKQEAgLTE3Myw3ICsxNTcsNyBAQAogCXNtcF9tYigpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGxvbmcgdG1wLCB0bXAyOwogCkBAIC0xOTAsNiArMTc0LDYgQEAKIAk6ICJjYyIpOwogfQogCi0jZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQogCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1hcm0vc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2U4M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1hcm0vdWFjY2Vzcy5oCmluZGV4IGE3YzAxOGIuLmEyZmRhZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3VhY2Nlc3MuaApAQCAtNzcsMTIgKzc3LDYgQEAKIAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpCShfX3JhbmdlX29rKGFkZHIsc2l6ZSkgPT0gMCkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogU2luZ2xlLXZhbHVlIHRyYW5zZmVyIHJvdXRpbmVzLiAgVGhleSBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgcmlnaHQKICAqIHNpemUgaWYgd2UganVzdCBoYXZlIHRoZSByaWdodCBwb2ludGVyIHR5cGUuICBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tYXJtL3VuaXN0ZC5oCmluZGV4IDI3OGRlNjEuLmM0OWRmNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmgKQEAgLTM1NSw2ICszNTUsOSBAQAogI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMxNikKICNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMxNykKICNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCQkoX19OUl9TWVNDQUxMX0JBU0UrMzE4KQorI2RlZmluZSBfX05SX21iaW5kCQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMxOSkKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CQkoX19OUl9TWVNDQUxMX0JBU0UrMzIwKQorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJCShfX05SX1NZU0NBTExfQkFTRSszMjEpCiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIFNXSXMgYXJlIEFSTSBwcml2YXRlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUzNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNQVJNX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNQVJNX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2ZjbnRsLmgKaW5kZXggNDg1YjZiZC4uZDg1OTk1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9mY250bC5oCkBAIC0zLDg1ICszLDExIEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19ESVJFQ1RPUlkJIDA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KICNkZWZpbmUgT19ESVJFQ1QJMDIwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAKLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAKLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CiAKLSNkZWZpbmUgRl9TRVRPV04JOAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUT1dOCTkJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1hcm0yNi9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvaGFyZGlycS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvaGFyZGlycS5oCmluZGV4IDc5MWVlMWQuLmRjMjhkYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2hhcmRpcnEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9oYXJkaXJxLmgKQEAgLTIyLDggKzIyLDYgQEAKICMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCiAjZW5kaWYKIAotI2RlZmluZSBpcnFfZW50ZXIoKQkJKHByZWVtcHRfY291bnQoKSArPSBIQVJESVJRX09GRlNFVCkKLQogI2lmbmRlZiBDT05GSUdfU01QCiAKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgX19kb19zb2Z0aXJxKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2ZkMWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdWFjY2Vzcy5oCmluZGV4IGFiOWNlMzguLjNmMmRkMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi91YWNjZXNzLmgKQEAgLTQwLDEyICs0MCw2IEBACiAKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKQkoX19yYW5nZV9vayhhZGRyLHNpemUpID09IDApCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQogLyoKICAqIFNpbmdsZS12YWx1ZSB0cmFuc2ZlciByb3V0aW5lcy4gIFRoZXkgYXV0b21hdGljYWxseSB1c2UgdGhlIHJpZ2h0CiAgKiBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQgcG9pbnRlciB0eXBlLiAgTm90ZSB0aGF0IHRoZSBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1jcmlzL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzBiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTUNSSVNfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01DUklTX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9mY250bC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9mY250bC5oCmluZGV4IDYxYzU2MzIuLjQ2YWIxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2ZjbnRsLmgKQEAgLTEsOTAgKzEgQEAKLSNpZm5kZWYgX0NSSVNfRkNOVExfSAotI2RlZmluZSBfQ1JJU19GQ05UTF9ICi0KLS8qIHZlcmJhdGltIGNvcHkgb2YgaTM4NiB2ZXJzaW9uICovCi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgZl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldCBmX2ZsYWdzICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogbW9yZSBmbGFncyAoY2xvZXhlYykgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0ICAgICAgMTIgICAgICAvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQgICAgICAxMwotI2RlZmluZSBGX1NFVExLVzY0ICAgICAxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MgICAxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQgICAgICAzMiAgICAgIC8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFEICAgICAgNjQgICAgICAvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUgICAgIDEyOCAgICAgLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVyAgICAgICAgMTkyICAgICAvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi1zdHJ1Y3QgZmxvY2sgewotCXNob3J0IGxfdHlwZTsKLQlzaG9ydCBsX3doZW5jZTsKLQlvZmZfdCBsX3N0YXJ0OwotCW9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRSAgMTAyNAotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9mdXRleC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2lycS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9pcnEuaAppbmRleCA4ZTc4N2ZkLi40ZmFiNWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvaXJxLmgKQEAgLTEsNiArMSwxMSBAQAogI2lmbmRlZiBfQVNNX0lSUV9ICiAjZGVmaW5lIF9BU01fSVJRX0gKIAorLyoKKyAqIElSUSBsaW5lIHN0YXR1cyBtYWNybyBJUlFfUEVSX0NQVSBpcyB1c2VkCisgKi8KKyNkZWZpbmUgQVJDSF9IQVNfSVJRX1BFUl9DUFUKKwogI2luY2x1ZGUgPGFzbS9hcmNoL2lycS5oPgogCiBleHRlcm4gX19pbmxpbmVfXyBpbnQgaXJxX2Nhbm9uaWNhbGl6ZShpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1jcmlzL3VhY2Nlc3MuaAppbmRleCA2ZGIxNzIyLi43ZDUwMDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3VhY2Nlc3MuaApAQCAtOTEsMTMgKzkxLDYgQEAKICNkZWZpbmUgX19hY2Nlc3Nfb2soYWRkcixzaXplKSAoX19rZXJuZWxfb2sgfHwgX191c2VyX29rKChhZGRyKSwoc2l6ZSkpKQogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKShhZGRyKSwoc2l6ZSkpCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotZXh0ZXJuIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCi0KICNpbmNsdWRlIDxhc20vYXJjaC91YWNjZXNzLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1mcnYvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MTA3NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19GUlZfQVVYVkVDX0gKKyNkZWZpbmUgX19GUlZfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWZydi9mY250bC5oCmluZGV4IGQ2MWI5OTkuLjQ2YWIxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9mY250bC5oCkBAIC0xLDg4ICsxIEBACi0jaWZuZGVmIF9BU01fRkNOVExfSAotI2RlZmluZSBfQVNNX0ZDTlRMX0gKLQotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJIDAxMDAwMAotI2RlZmluZSBGQVNZTkMJCSAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBPX0RJUkVDVAkgMDQwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAotI2VuZGlmIC8qIF9BU01fRkNOVExfSCAqLwotCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9mdXRleC5oIGIvaW5jbHVkZS9hc20tZnJ2L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmgKaW5kZXggMzJkYzUyZTguLjk5MWI1MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3VhY2Nlc3MuaApAQCAtNjcsMTIgKzY3LDYgQEAKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSAoX19yYW5nZV9vaygoYWRkciksIChzaXplKSkgPT0gMCkKICNkZWZpbmUgX19hY2Nlc3Nfb2soYWRkcixzaXplKSAoX19yYW5nZV9vaygoYWRkciksIChzaXplKSkgPT0gMCkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSAvIF9fcmFuZ2Vfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIF9fcmFuZ2Vfb2soYWRkciwgc2l6ZSk7Ci19Ci0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MzUyMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaApAQCAtMCwwICsxLDE0OSBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfRkNOVExfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfRkNOVExfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcworICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCisjZGVmaW5lIE9fQUNDTU9ERQkwMDAwMDAwMworI2RlZmluZSBPX1JET05MWQkwMDAwMDAwMAorI2RlZmluZSBPX1dST05MWQkwMDAwMDAwMQorI2RlZmluZSBPX1JEV1IJCTAwMDAwMDAyCisjaWZuZGVmIE9fQ1JFQVQKKyNkZWZpbmUgT19DUkVBVAkJMDAwMDAxMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19FWENMCisjZGVmaW5lIE9fRVhDTAkJMDAwMDAyMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19OT0NUVFkKKyNkZWZpbmUgT19OT0NUVFkJMDAwMDA0MDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19UUlVOQworI2RlZmluZSBPX1RSVU5DCQkwMDAwMTAwMAkvKiBub3QgZmNudGwgKi8KKyNlbmRpZgorI2lmbmRlZiBPX0FQUEVORAorI2RlZmluZSBPX0FQUEVORAkwMDAwMjAwMAorI2VuZGlmCisjaWZuZGVmIE9fTk9OQkxPQ0sKKyNkZWZpbmUgT19OT05CTE9DSwkwMDAwNDAwMAorI2VuZGlmCisjaWZuZGVmIE9fU1lOQworI2RlZmluZSBPX1NZTkMJCTAwMDEwMDAwCisjZW5kaWYKKyNpZm5kZWYgRkFTWU5DCisjZGVmaW5lIEZBU1lOQwkJMDAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLworI2VuZGlmCisjaWZuZGVmIE9fRElSRUNUCisjZGVmaW5lIE9fRElSRUNUCTAwMDQwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCisjZW5kaWYKKyNpZm5kZWYgT19MQVJHRUZJTEUKKyNkZWZpbmUgT19MQVJHRUZJTEUJMDAxMDAwMDAKKyNlbmRpZgorI2lmbmRlZiBPX0RJUkVDVE9SWQorI2RlZmluZSBPX0RJUkVDVE9SWQkwMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCisjZW5kaWYKKyNpZm5kZWYgT19OT0ZPTExPVworI2RlZmluZSBPX05PRk9MTE9XCTAwNDAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9BVElNRQorI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKKyNlbmRpZgorI2lmbmRlZiBPX05ERUxBWQorI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCisjZW5kaWYKKworI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLworI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCisjZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KKyNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLworI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCisjaWZuZGVmIEZfR0VUTEsKKyNkZWZpbmUgRl9HRVRMSwkJNQorI2RlZmluZSBGX1NFVExLCQk2CisjZGVmaW5lIEZfU0VUTEtXCTcKKyNlbmRpZgorI2lmbmRlZiBGX1NFVE9XTgorI2RlZmluZSBGX1NFVE9XTgk4CS8qIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX0dFVE9XTgk5CS8qIGZvciBzb2NrZXRzLiAqLworI2VuZGlmCisjaWZuZGVmIEZfU0VUU0lHCisjZGVmaW5lIEZfU0VUU0lHCTEwCS8qIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX0dFVFNJRwkxMQkvKiBmb3Igc29ja2V0cy4gKi8KKyNlbmRpZgorCisvKiBmb3IgRl9bR0VUfFNFVF1GTCAqLworI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCisKKy8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCisjaWZuZGVmIEZfUkRMQ0sKKyNkZWZpbmUgRl9SRExDSwkJMAorI2RlZmluZSBGX1dSTENLCQkxCisjZGVmaW5lIEZfVU5MQ0sJCTIKKyNlbmRpZgorCisvKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLworI2lmbmRlZiBGX0VYTENLCisjZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLworI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KKyNlbmRpZgorCisvKiBmb3IgbGVhc2VzICovCisjaWZuZGVmIEZfSU5QUk9HUkVTUworI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKKyNlbmRpZgorCisvKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KKyNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLworI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCisjZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAorCQkJCSAgIGJsb2NraW5nICovCisjZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KKworI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAuLi4gKi8KKyNkZWZpbmUgTE9DS19SRUFECTY0CS8qIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiB3aGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCisjZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCisKKyNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKKworI2lmbmRlZiBIQVZFX0FSQ0hfU1RSVUNUX0ZMT0NLCisjaWZuZGVmIF9fQVJDSF9GTE9DS19QQUQKKyNkZWZpbmUgX19BUkNIX0ZMT0NLX1BBRAorI2VuZGlmCisKK3N0cnVjdCBmbG9jayB7CisJc2hvcnQJbF90eXBlOworCXNob3J0CWxfd2hlbmNlOworCW9mZl90CWxfc3RhcnQ7CisJb2ZmX3QJbF9sZW47CisJcGlkX3QJbF9waWQ7CisJX19BUkNIX0ZMT0NLX1BBRAorfTsKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR182NEJJVAorCisjaWZuZGVmIEZfR0VUTEs2NAorI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KKyNkZWZpbmUgRl9TRVRMSzY0CTEzCisjZGVmaW5lIEZfU0VUTEtXNjQJMTQKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQVJDSF9TVFJVQ1RfRkxPQ0s2NAorI2lmbmRlZiBfX0FSQ0hfRkxPQ0s2NF9QQUQKKyNkZWZpbmUgX19BUkNIX0ZMT0NLNjRfUEFECisjZW5kaWYKKworc3RydWN0IGZsb2NrNjQgeworCXNob3J0ICBsX3R5cGU7CisJc2hvcnQgIGxfd2hlbmNlOworCWxvZmZfdCBsX3N0YXJ0OworCWxvZmZfdCBsX2xlbjsKKwlwaWRfdCAgbF9waWQ7CisJX19BUkNIX0ZMT0NLNjRfUEFECit9OworI2VuZGlmCisjZW5kaWYgLyogIUNPTkZJR182NEJJVCAqLworCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MWZiYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSN3YXJuaW5nIDxhc20vaGRyZWcuaD4gaXMgb2Jzb2xldGUsIHBsZWFzZSBkbyBub3QgdXNlIGl0Ci0KLSNpZm5kZWYgX19BU01fR0VORVJJQ19IRFJFR19ICi0jZGVmaW5lIF9fQVNNX0dFTkVSSUNfSERSRUdfSAotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaWRlX2lvcmVnX3Q7Ci0KLSNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0hEUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGNpLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BjaS5oCmluZGV4IGVlMWQ4YjUuLmMzNmE3N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wY2kuaApAQCAtMzAsNiArMzAsMTkgQEAKIAlyZXMtPmVuZCA9IHJlZ2lvbi0+ZW5kOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqCitwY2liaW9zX3NlbGVjdF9yb290KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QgPSBOVUxMOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyb290ID0gJmlvcG9ydF9yZXNvdXJjZTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOworCisJcmV0dXJuIHJvb3Q7Cit9CisKICNkZWZpbmUgcGNpYmlvc19zY2FuX2FsbF9mbnMoYSwgYikJMAogCiAjaWZuZGVmIEhBVkVfQVJDSF9QQ0lfR0VUX0xFR0FDWV9JREVfSVJRCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3NlY3Rpb25zLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NlY3Rpb25zLmgKaW5kZXggNDUwZWFlMi4uODg2ZGJkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZWN0aW9ucy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2VjdGlvbnMuaApAQCAtMTIsNSArMTIsNiBAQAogZXh0ZXJuIGNoYXIgX2VleHRyYXRleHRbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiBleHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfX3Blcl9jcHVfc3RhcnRbXSwgX19wZXJfY3B1X2VuZFtdOworZXh0ZXJuIGNoYXIgX19rcHJvYmVzX3RleHRfc3RhcnRbXSwgX19rcHJvYmVzX3RleHRfZW5kW107CiAKICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfU0VDVElPTlNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCmluZGV4IDZjOTBmMGYuLjRkYzhkZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaApAQCAtMTYsOSArMTYsOSBAQAogICogVGhlIG1haW4gc2luZ2xlLXZhbHVlIHVuYWxpZ25lZCB0cmFuc2ZlciByb3V0aW5lcy4KICAqLwogI2RlZmluZSBnZXRfdW5hbGlnbmVkKHB0cikgXAotCSgoX190eXBlb2ZfXygqKHB0cikpKV9fZ2V0X3VuYWxpZ25lZCgocHRyKSwgc2l6ZW9mKCoocHRyKSkpKQorCV9fZ2V0X3VuYWxpZ25lZCgocHRyKSwgc2l6ZW9mKCoocHRyKSkpCiAjZGVmaW5lIHB1dF91bmFsaWduZWQoeCxwdHIpIFwKLQlfX3B1dF91bmFsaWduZWQoKHVuc2lnbmVkIGxvbmcpKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpCisJX19wdXRfdW5hbGlnbmVkKChfX3U2NCkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBhY3R1YWxseSBleGlzdC4gIFRoZSBpZGVhIGlzIHRoYXQgd2hlbgpAQCAtMzYsMTkgKzM2LDE5IEBACiAgKiBFbGVtZW50YWwgdW5hbGlnbmVkIGxvYWRzIAogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VsZHEoY29uc3QgX191NjQgKmFkZHIpCitzdGF0aWMgaW5saW5lIF9fdTY0IF9fdWxkcShjb25zdCBfX3U2NCAqYWRkcikKIHsKIAljb25zdCBzdHJ1Y3QgX191bmFfdTY0ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqKSBhZGRyOwogCXJldHVybiBwdHItPng7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VsZGwoY29uc3QgX191MzIgKmFkZHIpCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fdWxkbChjb25zdCBfX3UzMiAqYWRkcikKIHsKIAljb25zdCBzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqKSBhZGRyOwogCXJldHVybiBwdHItPng7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VsZHcoY29uc3QgX191MTYgKmFkZHIpCitzdGF0aWMgaW5saW5lIF9fdTE2IF9fdWxkdyhjb25zdCBfX3UxNiAqYWRkcikKIHsKIAljb25zdCBzdHJ1Y3QgX191bmFfdTE2ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqKSBhZGRyOwogCXJldHVybiBwdHItPng7CkBAIC03OCw3ICs3OCw3IEBACiAKICNkZWZpbmUgX19nZXRfdW5hbGlnbmVkKHB0ciwgc2l6ZSkgKHsJCVwKIAljb25zdCB2b2lkICpfX2d1X3AgPSBwdHI7CQlcCi0JdW5zaWduZWQgbG9uZyB2YWw7CQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSB2YWw7CQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQlcCiAJY2FzZSAxOgkJCQkJXAogCQl2YWwgPSAqKGNvbnN0IF9fdTggKilfX2d1X3A7CVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAppbmRleCAzZmE5NDI4Li5hOWM1NTQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCkBAIC05NywzICs5Nyw0NyBAQAogCQlWTUxJTlVYX1NZTUJPTChfX2xvY2tfdGV4dF9zdGFydCkgPSAuOwkJCVwKIAkJKiguc3BpbmxvY2sudGV4dCkJCQkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19sb2NrX3RleHRfZW5kKSA9IC47CisKKyNkZWZpbmUgS1BST0JFU19URVhUCQkJCQkJCVwKKwkJQUxJR05fRlVOQ1RJT04oKTsJCQkJCVwKKwkJVk1MSU5VWF9TWU1CT0woX19rcHJvYmVzX3RleHRfc3RhcnQpID0gLjsJCVwKKwkJKigua3Byb2Jlcy50ZXh0KQkJCQkJXAorCQlWTUxJTlVYX1NZTUJPTChfX2twcm9iZXNfdGV4dF9lbmQpID0gLjsKKworCQkvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKwkJU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0bworCQl0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisjZGVmaW5lIERXQVJGX0RFQlVHCQkJCQkJCVwKKwkJLyogRFdBUkYgMSAqLwkJCQkJCVwKKwkJLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CQkJXAorCQkubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQkJCVwKKwkJLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwkJCQlcCisJCS5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CQlcCisJCS5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CQlcCisJCS8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwkJCQlcCisJCS5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CQlcCisJCS5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQkJXAorCQkvKiBEV0FSRiAyICovCQkJCQkJXAorCQkuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbwkJCVwKKwkJCQkuZ251LmxpbmtvbmNlLndpLiopIH0JCQlcCisJCS5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0JCVwKKwkJLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0JCQlcCisJCS5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQkJCVwKKwkJLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQkJCVwKKwkJLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQkJCVwKKwkJLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0JCVwKKwkJLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCQkJXAorCQkuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQkJXAorCQkuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQkJXAorCQkuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQkJXAorCQkuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CQlcCisKKwkJLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyNkZWZpbmUgU1RBQlNfREVCVUcJCQkJCQkJXAorCQkuc3RhYiAwIDogeyAqKC5zdGFiKSB9CQkJCQlcCisJCS5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0JCQkJXAorCQkuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQkJCVwKKwkJLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0JCQlcCisJCS5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0JCQlcCisJCS5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0JCVwKKwkJLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1oODMwMC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDM2ZmUzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTUg4MzAwX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNSDgzMDBfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9mY250bC5oIGIvaW5jbHVkZS9hc20taDgzMDAvZmNudGwuaAppbmRleCAzNTUzNTBhLi4xOTUyY2IyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9mY250bC5oCkBAIC0xLDg3ICsxLDExIEBACiAjaWZuZGVmIF9IODMwMF9GQ05UTF9ICiAjZGVmaW5lIF9IODMwMF9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAwMAotI2RlZmluZSBPX1dST05MWQkgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCSAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgMDEwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fQVBQRU5ECSAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJMDEwMDAwCi0jZGVmaW5lIEZBU1lOQwkJMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19ESVJFQ1RPUlkJMDQwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgT19OT0ZPTExPVwkwMTAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX0RJUkVDVAkwMjAwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMDQwMDAwMAotI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKIAotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfR0VUTEsJCTUKLSNkZWZpbmUgRl9TRVRMSwkJNgotI2RlZmluZSBGX1NFVExLVwk3CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KIAotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLwotI2RlZmluZSBGX1NFVExLNjQJMTMKLSNkZWZpbmUgRl9TRVRMS1c2NAkxNAotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKICNlbmRpZiAvKiBfSDgzMDBfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9oZHJlZy5oIGIvaW5jbHVkZS9hc20taDgzMDAvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMGMwNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1oODMwMC9oZHJlZy5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvcnMKLSAqLwotCi0jd2FybmluZyB0aGlzIGZpbGUgaXMgb2Jzb2xldGUsIHBsZWFzZSBkbyBub3QgdXNlIGl0Ci0KLSNpZm5kZWYgX0g4MzAwX0hEUkVHX0gKLSNkZWZpbmUgX0g4MzAwX0hEUkVHX0gKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBxNDBpZGVfaW9yZWdfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqIGlkZV9pb3JlZ190OwotCi0jZW5kaWYgLyogX0g4MzAwX0hEUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3VhY2Nlc3MuaAppbmRleCAxNDgwZjMwLi5lYmU1OGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdWFjY2Vzcy5oCkBAIC0yNCwxMiArMjQsNiBAQAogCXJldHVybihSQU5HRV9DSEVDS19PSyhhZGRyLCBzaXplLCAwTCwgKHVuc2lnbmVkIGxvbmcpJl9yYW1lbmQpKTsKIH0KIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKT8wOi1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaCBiL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCmluZGV4IGNmODI4YWMuLmRmNGVkMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAgOiI9ciIobl9oaSksICI9ciIobl9sbykgICAgIFwKICAgICAgICAgOiIwIihuX2hpKSwgIjEiKG5fbG8pKQogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVCAKKyNpZmRlZiBDT05GSUdfQUNQSSAKIGV4dGVybiBpbnQgYWNwaV9sYXBpYzsKIGV4dGVybiBpbnQgYWNwaV9pb2FwaWM7CiBleHRlcm4gaW50IGFjcGlfbm9pcnE7CkBAIC0xNDYsMTMgKzE0Niw2IEBACiAKICNlbmRpZgogCi0jZWxzZQkvKiBDT05GSUdfQUNQSV9CT09UICovCi0jICBkZWZpbmUgYWNwaV9sYXBpYyAwCi0jICBkZWZpbmUgYWNwaV9pb2FwaWMgMAotCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbm9pcnFfc2V0KHZvaWQpIHsgYWNwaV9ub2lycSA9IDE7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIAogewpAQCAtMTYwLDExICsxNTMsMTYgQEAKIAlhY3BpX25vaXJxX3NldCgpOwogfQogZXh0ZXJuIGludCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpOwotI2Vsc2UKKworI2Vsc2UJLyogIUNPTkZJR19BQ1BJICovCisKKyNkZWZpbmUgYWNwaV9sYXBpYyAwCisjZGVmaW5lIGFjcGlfaW9hcGljIDAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9pcnFfYmFsYW5jZV9zZXQoY2hhciAqc3RyKSB7IHJldHVybiAwOyB9Ci0jZW5kaWYKKworI2VuZGlmCS8qICFDT05GSUdfQUNQSSAqLworCiAKICNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2F1eHZlYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVlMTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hdXh2ZWMuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fQVNNaTM4Nl9BVVhWRUNfSAorI2RlZmluZSBfX0FTTWkzODZfQVVYVkVDX0gKKworLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgaW4gMC0xNywgbGVhdmUgc29tZSByb29tCisgKiBmb3IgbW9yZSBvZiB0aGVtLCBzdGFydCB0aGUgeDg2LXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GTwkJMzIKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZGl2NjQuaCBiL2luY2x1ZGUvYXNtLWkzODYvZGl2NjQuaAppbmRleCAyOGVkOGIyLi43NWM2N2M3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9kaXY2NC5oCkBAIC0zNSw3ICszNSw3IEBACiAgKi8KICNkZWZpbmUgZGl2X2xvbmdfbG9uZ19yZW0oYSxiLGMpIGRpdl9sbF9YX2xfcmVtKGEsYixjKQogCi1leHRlcm4gaW5saW5lIGxvbmcKK3N0YXRpYyBpbmxpbmUgbG9uZwogZGl2X2xsX1hfbF9yZW0obG9uZyBsb25nIGRpdnMsIGxvbmcgZGl2LCBsb25nICpyZW0pCiB7CiAJbG9uZyBkdW0yOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9lbGYuaCBiL2luY2x1ZGUvYXNtLWkzODYvZWxmLmgKaW5kZXggMTMwYmRjOC4uZmExMTExNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2VsZi5oCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGFzbS91c2VyLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JCS8qIGZvciBzYXZlc2VnbWVudCAqLworI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIApAQCAtMTA5LDEzICsxMTAsNiBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKHN5c3RlbV91dHNuYW1lLm1hY2hpbmUpCiAKLS8qCi0gKiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBBVF8gdmFsdWVzIGluIDAtMTcsIGxlYXZlIHNvbWUgcm9vbQotICogZm9yIG1vcmUgb2YgdGhlbSwgc3RhcnQgdGhlIHg4Ni1zcGVjaWZpYyBvbmVzIGF0IDMyLgotICovCi0jZGVmaW5lIEFUX1NZU0lORk8JCTMyCi0jZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkJMzMKLQogI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgZG8geyB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1pMzg2L2ZjbnRsLmgKaW5kZXggNTExY2RlOS4uNDZhYjEyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZmNudGwuaApAQCAtMSw4OCArMSBAQAotI2lmbmRlZiBfSTM4Nl9GQ05UTF9ICi0jZGVmaW5lIF9JMzg2X0ZDTlRMX0gKLQotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJIDAxMDAwMAotI2RlZmluZSBGQVNZTkMJCSAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBPX0RJUkVDVAkgMDQwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKaW5kZXggYzk0Y2FjOS4uY2ZiMWM2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCkBAIC03Niw3ICs3Niw3IEBACiAJRklYX0tNQVBfQkVHSU4sCS8qIHJlc2VydmVkIHB0ZSdzIGZvciB0ZW1wb3Jhcnkga2VybmVsIG1hcHBpbmdzICovCiAJRklYX0tNQVBfRU5EID0gRklYX0tNQVBfQkVHSU4rKEtNX1RZUEVfTlIqTlJfQ1BVUyktMSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCUZJWF9BQ1BJX0JFR0lOLAogCUZJWF9BQ1BJX0VORCA9IEZJWF9BQ1BJX0JFR0lOICsgRklYX0FDUElfUEFHRVMgLSAxLAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1pMzg2L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiOWRiOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZnV0ZXguaApAQCAtMCwwICsxLDEwOCBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcDEoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKAkJCQkJCVwKKyIxOgkiIGluc24gIlxuIgkJCQkJCVwKKyIyOgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG5cCiszOgltb3YJJTMsICUxXG5cCisJam1wCTJiXG5cCisJLnByZXZpb3VzXG5cCisJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuXAorCS5hbGlnbgk4XG5cCisJLmxvbmcJMWIsM2JcblwKKwkucHJldmlvdXMiCQkJCQkJXAorCTogIj1yIiAob2xkdmFsKSwgIj1yIiAocmV0KSwgIj1tIiAoKnVhZGRyKQkJXAorCTogImkiICgtRUZBVUxUKSwgIm0iICgqdWFkZHIpLCAiMCIgKG9wYXJnKSwgIjEiICgwKSkKKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcDIoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKAkJCQkJCVwKKyIxOgltb3ZsCSUyLCAlMFxuXAorCW1vdmwJJTAsICUzXG4iCQkJCQlcCisJaW5zbiAiXG4iCQkJCQkJXAorIjI6CSIgTE9DS19QUkVGSVggImNtcHhjaGdsICUzLCAlMlxuXAorCWpuegkxYlxuXAorMzoJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuXAorNDoJbW92CSU1LCAlMVxuXAorCWptcAkzYlxuXAorCS5wcmV2aW91c1xuXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcblwKKwkuYWxpZ24JOFxuXAorCS5sb25nCTFiLDRiLDJiLDRiXG5cCisJLnByZXZpb3VzIgkJCQkJCVwKKwk6ICI9JmEiIChvbGR2YWwpLCAiPSZyIiAocmV0KSwgIj1tIiAoKnVhZGRyKSwJCVwKKwkgICI9JnIiICh0ZW0pCQkJCQkJXAorCTogInIiIChvcGFyZyksICJpIiAoLUVGQVVMVCksICJtIiAoKnVhZGRyKSwgIjEiICgwKSkKKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAob3AgPT0gRlVURVhfT1BfU0VUKQorCQlfX2Z1dGV4X2F0b21pY19vcDEoInhjaGdsICUwLCAlMiIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCWVsc2UgeworI2lmbmRlZiBDT05GSUdfWDg2X0JTV0FQCisJCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAzKQorCQkJcmV0ID0gLUVOT1NZUzsKKwkJZWxzZQorI2VuZGlmCisJCXN3aXRjaCAob3ApIHsKKwkJY2FzZSBGVVRFWF9PUF9BREQ6CisJCQlfX2Z1dGV4X2F0b21pY19vcDEoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMiIsIHJldCwKKwkJCQkJICAgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfT1I6CisJCQlfX2Z1dGV4X2F0b21pY19vcDIoIm9ybCAlNCwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsCisJCQkJCSAgIG9wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0FORE46CisJCQlfX2Z1dGV4X2F0b21pY19vcDIoImFuZGwgJTQsICUzIiwgcmV0LCBvbGR2YWwsIHVhZGRyLAorCQkJCQkgICB+b3BhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfWE9SOgorCQkJX19mdXRleF9hdG9taWNfb3AyKCJ4b3JsICU0LCAlMyIsIHJldCwgb2xkdmFsLCB1YWRkciwKKwkJCQkJICAgb3BhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU5PU1lTOworCQl9CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2hkcmVnLmggYi9pbmNsdWRlL2FzbS1pMzg2L2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODliYmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI3dhcm5pbmcgdGhpcyBmaWxlIGlzIG9ic29sZXRlLCBwbGVhc2UgZG8gbm90IHVzZSBpdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pb19hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaAppbmRleCAwMDJjMjAzLi41MWM0ZTVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaApAQCAtMTk1LDEyICsxOTUsMTIgQEAKICAqLwogI2RlZmluZSBpb19hcGljX2Fzc2lnbl9wY2lfaXJxcyAobXBfaXJxX2VudHJpZXMgJiYgIXNraXBfaW9hcGljX3NldHVwICYmIGlvX2FwaWNfaXJxcykKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIGludCBpb19hcGljX2dldF91bmlxdWVfaWQgKGludCBpb2FwaWMsIGludCBhcGljX2lkKTsKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfdmVyc2lvbiAoaW50IGlvYXBpYyk7CiBleHRlcm4gaW50IGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMgKGludCBpb2FwaWMpOwogZXh0ZXJuIGludCBpb19hcGljX3NldF9wY2lfcm91dGluZyAoaW50IGlvYXBpYywgaW50IHBpbiwgaW50IGlycSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpOwotI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAogZXh0ZXJuIGludCAoKmlvYXBpY19yZW51bWJlcl9pcnEpKGludCBpb2FwaWMsIGludCBpcnEpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX3JlYm9vdC5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9yZWJvb3QuaAppbmRleCA1MjFlMjI3Li4wNmFlNGQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX3JlYm9vdC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L21hY2hfcmVib290LmgKQEAgLTIyLDcgKzIyLDE1IEBACiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCWtiX3dhaXQoKTsKIAkJdWRlbGF5KDUwKTsKLQkJb3V0YigweGZlLCAweDY0KTsgICAgICAgICAvKiBwdWxzZSByZXNldCBsb3cgKi8KKwkJb3V0YigweDYwLCAweDY0KTsJLyogd3JpdGUgQ29udHJvbGxlciBDb21tYW5kIEJ5dGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJa2Jfd2FpdCgpOworCQl1ZGVsYXkoNTApOworCQlvdXRiKDB4MTQsIDB4NjApOwkvKiBzZXQgIlN5c3RlbSBmbGFnIiAqLworCQl1ZGVsYXkoNTApOworCQlrYl93YWl0KCk7CisJCXVkZWxheSg1MCk7CisJCW91dGIoMHhmZSwgMHg2NCk7CS8qIHB1bHNlIHJlc2V0IGxvdyAqLwogCQl1ZGVsYXkoNTApOwogCX0KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmggYi9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oCmluZGV4IDUxNjQyMTMuLjM0OGZlM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaApAQCAtMjksNyArMjksNyBAQAogI2lmZGVmIENPTkZJR19YODZfTlVNQVEKIAlpZiAoZ2V0X21lbWNmZ19udW1hcSgpKQogCQlyZXR1cm47Ci0jZWxpZiBDT05GSUdfQUNQSV9TUkFUCisjZWxpZiBkZWZpbmVkKENPTkZJR19BQ1BJX1NSQVQpCiAJaWYgKGdldF9tZW1jZmdfZnJvbV9zcmF0KCkpCiAJCXJldHVybjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tcHNwZWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmgKaW5kZXggZDg0YTljMy4uNjRhMGI4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tcHNwZWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21wc3BlYy5oCkBAIC0yNywxNCArMjcsMTQgQEAKIGV4dGVybiBpbnQgcGljX21vZGU7CiBleHRlcm4gaW50IHVzaW5nX2FwaWNfdGltZXI7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisjaWZkZWYgQ09ORklHX0FDUEkKIGV4dGVybiB2b2lkIG1wX3JlZ2lzdGVyX2xhcGljICh1OCBpZCwgdTggZW5hYmxlZCk7CiBleHRlcm4gdm9pZCBtcF9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzICh1NjQgYWRkcmVzcyk7CiBleHRlcm4gdm9pZCBtcF9yZWdpc3Rlcl9pb2FwaWMgKHU4IGlkLCB1MzIgYWRkcmVzcywgdTMyIGdzaV9iYXNlKTsKIGV4dGVybiB2b2lkIG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKHU4IGJ1c19pcnEsIHU4IHBvbGFyaXR5LCB1OCB0cmlnZ2VyLCB1MzIgZ3NpKTsKIGV4dGVybiB2b2lkIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzICh2b2lkKTsKIGV4dGVybiBpbnQgbXBfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7Ci0jZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCiAjZGVmaW5lIFBIWVNJRF9BUlJBWV9TSVpFCUJJVFNfVE9fTE9OR1MoTUFYX0FQSUNTKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAppbmRleCAzN2JlZjhlLi4wYTRlYzc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKQEAgLTY3OSw3ICs2NzksNyBAQAogICAgSG93ZXZlciB3ZSBkb24ndCBkbyBwcmVmZXRjaGVzIGZvciBwcmUgWFAgQXRobG9ucyBjdXJyZW50bHkKICAgIFRoYXQgc2hvdWxkIGJlIGZpeGVkLiAqLwogI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSAotZXh0ZXJuIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKngpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3Qgdm9pZCAqeCkKIHsKIAlhbHRlcm5hdGl2ZV9pbnB1dChBU01fTk9QNCwKIAkJCSAgInByZWZldGNobnRhICglMSkiLApAQCAtNjkzLDcgKzY5Myw3IEBACiAKIC8qIDNkbm93ISBwcmVmZXRjaCB0byBnZXQgYW4gZXhjbHVzaXZlIGNhY2hlIGxpbmUuIFVzZWZ1bCBmb3IgCiAgICBzcGlubG9ja3MgdG8gYXZvaWQgb25lIHN0YXRlIHRyYW5zaXRpb24gaW4gdGhlIGNhY2hlIGNvaGVyZW5jeSBwcm90b2NvbC4gKi8KLWV4dGVybiBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqeCkKIHsKIAlhbHRlcm5hdGl2ZV9pbnB1dChBU01fTk9QNCwKIAkJCSAgInByZWZldGNodyAoJTEpIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2suaAppbmRleCBmOWZmMzFmLi4yMzYwNDM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9jay5oCkBAIC03LDQ2ICs3LDIxIEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAotYXNtbGlua2FnZSBpbnQgcHJpbnRrKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci0KIC8qCiAgKiBZb3VyIGJhc2ljIFNNUCBzcGlubG9ja3MsIGFsbG93aW5nIG9ubHkgYSBzaW5nbGUgQ1BVIGFueXdoZXJlCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzbG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQl1bnNpZ25lZCBtYWdpYzsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKLQotI2RlZmluZSBTUElOTE9DS19NQUdJQwkweGRlYWQ0ZWFkCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUNfSU5JVAksIFNQSU5MT0NLX01BR0lDCi0jZWxzZQotI2RlZmluZSBTUElOTE9DS19NQUdJQ19JTklUCS8qICovCi0jZW5kaWYKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgMSBTUElOTE9DS19NQUdJQ19JTklUIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotLyoKKyAqCiAgKiBTaW1wbGUgc3BpbiBsb2NrIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzLCBvbmUgY2xlYXJzIElSUSdzCiAgKiBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yLCBvbmUgZG9lcyBub3QuCiAgKgogICogV2UgbWFrZSBubyBmYWlybmVzcyBhc3N1bXB0aW9ucy4gVGhleSBoYXZlIGEgY29zdC4KKyAqCisgKiAodGhlIHR5cGUgZGVmaW5pdGlvbnMgYXJlIGluIGFzbS9zcGlubG9ja190eXBlcy5oKQogICovCiAKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUoc3Bpbl9pc19sb2NrZWQoeCkpCisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpIFwKKwkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDApCiAKLSNkZWZpbmUgc3Bpbl9sb2NrX3N0cmluZyBcCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19zdHJpbmcgXAogCSJcbjE6XHQiIFwKIAkibG9jayA7IGRlY2IgJTBcblx0IiBcCiAJImpucyAzZlxuIiBcCkBAIC01Nyw3ICszMiw3IEBACiAJImptcCAxYlxuIiBcCiAJIjM6XG5cdCIKIAotI2RlZmluZSBzcGluX2xvY2tfc3RyaW5nX2ZsYWdzIFwKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX3N0cmluZ19mbGFncyBcCiAJIlxuMTpcdCIgXAogCSJsb2NrIDsgZGVjYiAlMFxuXHQiIFwKIAkiam5zIDRmXG5cdCIgXApAQCAtNzMsNTIgKzQ4LDIxIEBACiAJImptcCAxYlxuIiBcCiAJIjQ6XG5cdCIKIAotLyoKLSAqIFRoaXMgd29ya3MuIERlc3BpdGUgYWxsIHRoZSBjb25mdXNpb24uCi0gKiAoZXhjZXB0IG9uIFBQcm8gU01QIG9yIGlmIHdlIGFyZSB1c2luZyBPT1NUT1JFKQotICogKFBQcm8gZXJyYXRhIDY2LCA5MikKLSAqLwotCi0jaWYgIWRlZmluZWQoQ09ORklHX1g4Nl9PT1NUT1JFKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2X1BQUk9fRkVOQ0UpCi0KLSNkZWZpbmUgc3Bpbl91bmxvY2tfc3RyaW5nIFwKLQkibW92YiAkMSwlMCIgXAotCQk6Ij1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5IgotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQyk7Ci0JQlVHX09OKCFzcGluX2lzX2xvY2tlZChsb2NrKSk7Ci0jZW5kaWYKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJc3Bpbl91bmxvY2tfc3RyaW5nCi0JKTsKKwkJX19yYXdfc3Bpbl9sb2NrX3N0cmluZworCQk6Ij1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5Iik7CiB9CiAKLSNlbHNlCi0KLSNkZWZpbmUgc3Bpbl91bmxvY2tfc3RyaW5nIFwKLQkieGNoZ2IgJWIwLCAlMSIgXAotCQk6Ij1xIiAob2xkdmFsKSwgIj1tIiAobG9jay0+c2xvY2spIFwKLQkJOiIwIiAob2xkdmFsKSA6ICJtZW1vcnkiCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKHJhd19zcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCWNoYXIgb2xkdmFsID0gMTsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04obG9jay0+bWFnaWMgIT0gU1BJTkxPQ0tfTUFHSUMpOwotCUJVR19PTighc3Bpbl9pc19sb2NrZWQobG9jaykpOwotI2VuZGlmCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCXNwaW5fdW5sb2NrX3N0cmluZwotCSk7CisJCV9fcmF3X3NwaW5fbG9ja19zdHJpbmdfZmxhZ3MKKwkJOiI9bSIgKGxvY2stPnNsb2NrKSA6ICJyIiAoZmxhZ3MpIDogIm1lbW9yeSIpOwogfQogCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAljaGFyIG9sZHZhbDsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTEyOCwzMiArNzIsNDggQEAKIAlyZXR1cm4gb2xkdmFsID4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCisvKgorICogX19yYXdfc3Bpbl91bmxvY2sgYmFzZWQgb24gd3JpdGluZyAkMSB0byB0aGUgbG93IGJ5dGUuCisgKiBUaGlzIG1ldGhvZCB3b3Jrcy4gRGVzcGl0ZSBhbGwgdGhlIGNvbmZ1c2lvbi4KKyAqIChleGNlcHQgb24gUFBybyBTTVAgb3IgaWYgd2UgYXJlIHVzaW5nIE9PU1RPUkUsIHNvIHdlIHVzZSB4Y2hnYiB0aGVyZSkKKyAqIChQUHJvIGVycmF0YSA2NiwgOTIpCisgKi8KKworI2lmICFkZWZpbmVkKENPTkZJR19YODZfT09TVE9SRSkgJiYgIWRlZmluZWQoQ09ORklHX1g4Nl9QUFJPX0ZFTkNFKQorCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZyBcCisJIm1vdmIgJDEsJTAiIFwKKwkJOiI9bSIgKGxvY2stPnNsb2NrKSA6IDogIm1lbW9yeSIKKworCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JaWYgKHVubGlrZWx5KGxvY2stPm1hZ2ljICE9IFNQSU5MT0NLX01BR0lDKSkgewotCQlwcmludGsoImVpcDogJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JCUJVRygpOwotCX0KLSNlbmRpZgogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlzcGluX2xvY2tfc3RyaW5nCi0JCToiPW0iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiKTsKKwkJX19yYXdfc3Bpbl91bmxvY2tfc3RyaW5nCisJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzIChzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorI2Vsc2UKKworI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja19zdHJpbmcgXAorCSJ4Y2hnYiAlYjAsICUxIiBcCisJCToiPXEiIChvbGR2YWwpLCAiPW0iIChsb2NrLT5zbG9jaykgXAorCQk6IjAiIChvbGR2YWwpIDogIm1lbW9yeSIKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCWlmICh1bmxpa2VseShsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQykpIHsKLQkJcHJpbnRrKCJlaXA6ICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlCVUcoKTsKLQl9Ci0jZW5kaWYKKwljaGFyIG9sZHZhbCA9IDE7CisKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJc3Bpbl9sb2NrX3N0cmluZ19mbGFncwotCQk6Ij1tIiAobG9jay0+c2xvY2spIDogInIiIChmbGFncykgOiAibWVtb3J5Iik7CisJCV9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZworCSk7CiB9CiAKKyNlbmRpZgorCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCWRvIHsgd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spKSBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoMCkKKwogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCiAgKiBidXQgb25seSBvbmUgd3JpdGVyLgpAQCAtMTYzLDQyICsxMjMsNyBAQAogICogY2FuICJtaXgiIGlycS1zYWZlIGxvY2tzIC0gYW55IHdyaXRlciBuZWVkcyB0byBnZXQgYQogICogaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQogICogcmVhZC1sb2Nrcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCXVuc2lnbmVkIG1hZ2ljOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLQotI2RlZmluZSBSV0xPQ0tfTUFHSUMJMHhkZWFmMWVlZAotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0jZGVmaW5lIFJXTE9DS19NQUdJQ19JTklUCSwgUldMT0NLX01BR0lDCi0jZWxzZQotI2RlZmluZSBSV0xPQ0tfTUFHSUNfSU5JVAkvKiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgUldfTE9DS19CSUFTIFJXTE9DS19NQUdJQ19JTklUIH0KLQotI2RlZmluZSByd2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLS8qKgotICogcmVhZF9jYW5fbG9jayAtIHdvdWxkIHJlYWRfdHJ5bG9jaygpIHN1Y2NlZWQ/Ci0gKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KLSAqLwotI2RlZmluZSByZWFkX2Nhbl9sb2NrKHgpICgoaW50KSh4KS0+bG9jayA+IDApCi0KLS8qKgotICogd3JpdGVfY2FuX2xvY2sgLSB3b3VsZCB3cml0ZV90cnlsb2NrKCkgc3VjY2VlZD8KLSAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgotICovCi0jZGVmaW5lIHdyaXRlX2Nhbl9sb2NrKHgpICgoeCktPmxvY2sgPT0gUldfTE9DS19CSUFTKQotCi0vKgorICoKICAqIE9uIHg4Niwgd2UgaW1wbGVtZW50IHJlYWQtd3JpdGUgbG9ja3MgYXMgYSAzMi1iaXQgY291bnRlcgogICogd2l0aCB0aGUgaGlnaCBiaXQgKHNpZ24pIGJlaW5nIHRoZSAiY29udGVuZGVkIiBiaXQuCiAgKgpAQCAtMjA2LDI5ICsxMzEsMzMgQEAKICAqCiAgKiBDaGFuZ2VkIHRvIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWUgYXMgcncgc2VtYXBob3Jlcy4gIFNlZQogICogc2VtYXBob3JlLmggZm9yIGRldGFpbHMuICAtYmVuCisgKgorICogdGhlIGhlbHBlcnMgYXJlIGluIGFyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKICAqLwotLyogdGhlIHNwaW5sb2NrIGhlbHBlcnMgYXJlIGluIGFyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKKy8qKgorICogcmVhZF9jYW5fbG9jayAtIHdvdWxkIHJlYWRfdHJ5bG9jaygpIHN1Y2NlZWQ/CisgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KKyAqLworI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHgpCQkoKGludCkoeCktPmxvY2sgPiAwKQorCisvKioKKyAqIHdyaXRlX2Nhbl9sb2NrIC0gd291bGQgd3JpdGVfdHJ5bG9jaygpIHN1Y2NlZWQ/CisgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KKyAqLworI2RlZmluZSBfX3Jhd193cml0ZV9jYW5fbG9jayh4KQkJKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04ocnctPm1hZ2ljICE9IFJXTE9DS19NQUdJQyk7Ci0jZW5kaWYKIAlfX2J1aWxkX3JlYWRfbG9jayhydywgIl9fcmVhZF9sb2NrX2ZhaWxlZCIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JQlVHX09OKHJ3LT5tYWdpYyAhPSBSV0xPQ0tfTUFHSUMpOwotI2VuZGlmCiAJX19idWlsZF93cml0ZV9sb2NrKHJ3LCAiX193cml0ZV9sb2NrX2ZhaWxlZCIpOwogfQogCi0jZGVmaW5lIF9yYXdfcmVhZF91bmxvY2socncpCQlhc20gdm9sYXRpbGUoImxvY2sgOyBpbmNsICUwIiA6Ij1tIiAoKHJ3KS0+bG9jaykgOiA6ICJtZW1vcnkiKQotI2RlZmluZSBfcmF3X3dyaXRlX3VubG9jayhydykJYXNtIHZvbGF0aWxlKCJsb2NrIDsgYWRkbCAkIiBSV19MT0NLX0JJQVNfU1RSICIsJTAiOiI9bSIgKChydyktPmxvY2spIDogOiAibWVtb3J5IikKLQotc3RhdGljIGlubGluZSBpbnQgX3Jhd19yZWFkX3RyeWxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCWF0b21pY190ICpjb3VudCA9IChhdG9taWNfdCAqKWxvY2s7CiAJYXRvbWljX2RlYyhjb3VudCk7CkBAIC0yMzgsNyArMTY3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJYXRvbWljX3QgKmNvdW50ID0gKGF0b21pY190ICopbG9jazsKIAlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdChSV19MT0NLX0JJQVMsIGNvdW50KSkKQEAgLTI0Nyw0ICsxNzYsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJYXNtIHZvbGF0aWxlKCJsb2NrIDsgaW5jbCAlMCIgOiI9bSIgKHJ3LT5sb2NrKSA6IDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJYXNtIHZvbGF0aWxlKCJsb2NrIDsgYWRkbCAkIiBSV19MT0NLX0JJQVNfU1RSICIsICUwIgorCQkJCSA6ICI9bSIgKHJ3LT5sb2NrKSA6IDogIm1lbW9yeSIpOworfQorCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZWZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAxIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAppbmRleCBlMmNiOWZhLi44ZmJmNzkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCkBAIC00OCw3ICs0OCw3IEBACiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAppbmRleCA4ODY4NjdhLi44OWFiN2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaApAQCAtODMsMzAgKzgzLDYgQEAKICAqLwogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIChsaWtlbHkoX19yYW5nZV9vayhhZGRyLHNpemUpID09IDApKQogCi0vKioKLSAqIHZlcmlmeV9hcmVhOiAtIE9ic29sZXRlL2RlcHJlY2F0ZWQgYW5kIHdpbGwgZ28gYXdheSBzb29uLAotICogdXNlIGFjY2Vzc19vaygpIGluc3RlYWQuCi0gKiBAdHlwZTogVHlwZSBvZiBhY2Nlc3M6ICVWRVJJRllfUkVBRCBvciAlVkVSSUZZX1dSSVRFCi0gKiBAYWRkcjogVXNlciBzcGFjZSBwb2ludGVyIHRvIHN0YXJ0IG9mIGJsb2NrIHRvIGNoZWNrCi0gKiBAc2l6ZTogU2l6ZSBvZiBibG9jayB0byBjaGVjawotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBhY2Nlc3Nfb2soKS4KLSAqCi0gKiBDaGVja3MgaWYgYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UgaXMgdmFsaWQuCi0gKgotICogUmV0dXJucyB6ZXJvIGlmIHRoZSBtZW1vcnkgYmxvY2sgbWF5IGJlIHZhbGlkLCAtRUZBVUxUCi0gKiBpZiBpdCBpcyBkZWZpbml0ZWx5IGludmFsaWQuCi0gKgotICogU2VlIGFjY2Vzc19vaygpIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLWV4dC5oIGIvaW5jbHVkZS9hc20taWE2NC9hY3BpLWV4dC5oCmluZGV4IDkyNzFkNzQuLjU2ZDJkZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvYWNwaS1leHQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGktZXh0LmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgX0FTTV9JQTY0X0FDUElfRVhUX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKIGV4dGVybiBhY3BpX3N0YXR1cyBocF9hY3BpX2Nzcl9zcGFjZSAoYWNwaV9oYW5kbGUsIHU2NCAqYmFzZSwgdTY0ICpsZW5ndGgpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2F1eHZlYy5oIGIvaW5jbHVkZS9hc20taWE2NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NlYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9hdXh2ZWMuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9BU01fSUE2NF9BVVhWRUNfSAorI2RlZmluZSBfQVNNX0lBNjRfQVVYVkVDX0gKKworLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAwLTE3LiAgTGVhdmUgc29tZSByb29tIGZvciBtb3JlIG9mCisgKiB0aGVtLCBzdGFydCB0aGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GTwkzMgorI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJMzMKKworI2VuZGlmIC8qIF9BU01fSUE2NF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKaW5kZXggMGMwNWU1Yi4uYWFmMTFmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCkBAIC0xMywxMCArMTMsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfY2xvY2tfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfa2V5X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MTYJCWNvbXBhdF91aWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfZ2lkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X3VpZDMyX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZDMyX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9tb2RlX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2lub190OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9kZXZfdDsKQEAgLTUwLDggKzUwLDggQEAKIAljb21wYXRfaW5vX3QJc3RfaW5vOwogCWNvbXBhdF9tb2RlX3QJc3RfbW9kZTsKIAljb21wYXRfbmxpbmtfdAlzdF9ubGluazsKLQljb21wYXRfdWlkX3QJc3RfdWlkOwotCWNvbXBhdF9naWRfdAlzdF9naWQ7CisJX19jb21wYXRfdWlkX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZF90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAl1MTYJCV9fcGFkMjsKIAl1MzIJCXN0X3NpemU7CkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gewogCWNvbXBhdF9rZXlfdCBrZXk7Ci0JY29tcGF0X3VpZDMyX3QgdWlkOwotCWNvbXBhdF9naWQzMl90IGdpZDsKLQljb21wYXRfdWlkMzJfdCBjdWlkOwotCWNvbXBhdF9naWQzMl90IGNnaWQ7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKIAl1bnNpZ25lZCBzaG9ydCBtb2RlOwogCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKIAl1bnNpZ25lZCBzaG9ydCBzZXE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2VsZi5oIGIvaW5jbHVkZS9hc20taWE2NC9lbGYuaAppbmRleCA3ZDRjY2M0Li40NDZmY2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvZWxmLmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9mcHUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCkBAIC0xNzcsMTMgKzE3OCw2IEBACiAgICByZWxldmFudCB1bnRpbCB3ZSBoYXZlIHJlYWwgaGFyZHdhcmUgdG8gcGxheSB3aXRoLi4uICovCiAjZGVmaW5lIEVMRl9QTEFURk9STQlOVUxMCiAKLS8qCi0gKiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBBVF8gdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgMC0xNy4gIExlYXZlIHNvbWUgcm9vbSBmb3IgbW9yZSBvZgotICogdGhlbSwgc3RhcnQgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvbmVzIGF0IDMyLgotICovCi0jZGVmaW5lIEFUX1NZU0lORk8JMzIKLSNkZWZpbmUgQVRfU1lTSU5GT19FSERSCTMzCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAjZGVmaW5lIGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhleCwgZXhlY3V0YWJsZV9zdGFjaykJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvZmNudGwuaAppbmRleCBjZWUxNmVhLi4xZGQyNzVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mY250bC5oCkBAIC0xLDg3ICsxLDEzIEBACiAjaWZuZGVmIF9BU01fSUE2NF9GQ05UTF9ICiAjZGVmaW5lIF9BU01fSUE2NF9GQ05UTF9ICiAvKgotICogQmFzZWQgb24gPGFzbS1pMzg2L2ZjbnRsLmg+LgotICoKICAqIE1vZGlmaWVkIDE5OTgtMjAwMAogICoJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPiwgSGV3bGV0dC1QYWNrYXJkIENvLgogICovCiAKLS8qCi0gKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uCi0gKiBmaWxlcyBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KLSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLQogI2RlZmluZSBmb3JjZV9vX2xhcmdlZmlsZSgpCVwKIAkJKHBlcnNvbmFsaXR5KGN1cnJlbnQtPnBlcnNvbmFsaXR5KSAhPSBQRVJfTElOVVgzMikKIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CisKICNlbmRpZiAvKiBfQVNNX0lBNjRfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oIGIvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2hkcmVnLmggYi9pbmNsdWRlL2FzbS1pYTY0L2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjUxNjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1pYTY0L2hkcmVnLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycwotICovCi0KLSN3YXJuaW5nIHRoaXMgZmlsZSBpcyBvYnNvbGV0ZSwgcGxlYXNlIGRvIG5vdCB1c2UgaXQKLQotI2lmbmRlZiBfX0FTTV9JQTY0X0hEUkVHX0gKLSNkZWZpbmUgX19BU01fSUE2NF9IRFJFR19ICi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaWRlX2lvcmVnX3Q7Ci0KLSNlbmRpZiAvKiBfX0FTTV9JQTY0X0hEUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oCmluZGV4IDA0MWFiOGMuLjBjZjExOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9od19pcnEuaApAQCAtMTE2LDEzICsxMTYsNiBAQAogICogYW5kIHRvIG9idGFpbiB0aGUgaXJxIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gaXJxIG51bWJlci4KICAqLwogCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBpcnEgZGVzY3JpcHRvciBmb3IgSVJRLiAgKi8KLXN0YXRpYyBpbmxpbmUgaXJxX2Rlc2NfdCAqCi1pcnFfZGVzY3AgKGludCBpcnEpCi17Ci0JcmV0dXJuIGlycV9kZXNjICsgaXJxOwotfQotCiAvKiBFeHRyYWN0IHRoZSBJQS02NCB2ZWN0b3IgdGhhdCBjb3JyZXNwb25kcyB0byBJUlEuICAqLwogc3RhdGljIGlubGluZSBpYTY0X3ZlY3RvcgogaXJxX3RvX3ZlY3RvciAoaW50IGlycSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9zYXBpYy5oIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKaW5kZXggYTQyOWZlMi4uMjBmOThmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKQEAgLTgwLDEyICs4MCw5IEBACiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUcgKi8KIGV4dGVybiBpbnQgZ3NpX3RvX3ZlY3RvciAodW5zaWduZWQgaW50IGdzaSk7CiBleHRlcm4gaW50IGdzaV90b19pcnEgKHVuc2lnbmVkIGludCBnc2kpOwotZXh0ZXJuIHZvaWQgaW9zYXBpY19lbmFibGVfaW50ciAodW5zaWduZWQgaW50IHZlY3Rvcik7CiBleHRlcm4gaW50IGlvc2FwaWNfcmVnaXN0ZXJfaW50ciAodW5zaWduZWQgaW50IGdzaSwgdW5zaWduZWQgbG9uZyBwb2xhcml0eSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgdHJpZ2dlcik7Ci0jaWZkZWYgQ09ORklHX0FDUElfREVBTExPQ0FURV9JUlEKIGV4dGVybiB2b2lkIGlvc2FwaWNfdW5yZWdpc3Rlcl9pbnRyICh1bnNpZ25lZCBpbnQgaXJxKTsKLSNlbmRpZgogZXh0ZXJuIHZvaWQgX19pbml0IGlvc2FwaWNfb3ZlcnJpZGVfaXNhX2lycSAodW5zaWduZWQgaW50IGlzYV9pcnEsIHVuc2lnbmVkIGludCBnc2ksCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwb2xhcml0eSwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRyaWdnZXIpOwpAQCAtOTcsNyArOTQsNiBAQAogCQkJCQkgICB1bnNpZ25lZCBsb25nIHRyaWdnZXIpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpb3NhcGljX3ZlcnNpb24gKGNoYXIgX19pb21lbSAqYWRkcik7CiAKLWV4dGVybiB2b2lkIGlvc2FwaWNfcGNpX2ZpeHVwIChpbnQpOwogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gdm9pZCBfX2RldmluaXQgbWFwX2lvc2FwaWNfdG9fbm9kZSAodW5zaWduZWQgaW50LCBpbnQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9pcnEuaAppbmRleCBiZDA3ZDExLi5kYmU4NmMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaXJxLmgKQEAgLTE0LDYgKzE0LDExIEBACiAjZGVmaW5lIE5SX0lSUVMJCTI1NgogI2RlZmluZSBOUl9JUlFfVkVDVE9SUwlOUl9JUlFTCiAKKy8qCisgKiBJUlEgbGluZSBzdGF0dXMgbWFjcm8gSVJRX1BFUl9DUFUgaXMgdXNlZAorICovCisjZGVmaW5lIEFSQ0hfSEFTX0lSUV9QRVJfQ1BVCisKIHN0YXRpYyBfX2lubGluZV9fIGludAogaXJxX2Nhbm9uaWNhbGl6ZSAoaW50IGlycSkKIHsKQEAgLTMwLDE0ICszNSw0IEBACiBleHRlcm4gdm9pZCBlbmFibGVfaXJxICh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgc2V0X2lycV9hZmZpbml0eV9pbmZvICh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZGVzdCwgaW50IHJlZGlyKTsKIAotI2lmZGVmIENPTkZJR19TTVAKLWV4dGVybiB2b2lkIG1vdmVfaXJxKGludCBpcnEpOwotI2Vsc2UKLSNkZWZpbmUgbW92ZV9pcnEoaXJxKQotI2VuZGlmCi0KLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2VuZGlmIC8qIF9BU01fSUE2NF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaAppbmRleCBiZjM2YTMyLi41NzNhMzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaApAQCAtOTIsNiArOTIsNyBAQAogCWtwcm9iZV9vcGNvZGVfdCBpbnNuOwogICNkZWZpbmUgSU5TVF9GTEFHX0ZJWF9SRUxBVElWRV9JUF9BRERSCQkxCiAgI2RlZmluZSBJTlNUX0ZMQUdfRklYX0JSQU5DSF9SRUcJCTIKKyAjZGVmaW5lIElOU1RfRkxBR19CUkVBS19JTlNUCQkJNAogIAl1bnNpZ25lZCBsb25nIGluc3RfZmxhZzsKICAJdW5zaWduZWQgc2hvcnQgdGFyZ2V0X2JyX3JlZzsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oIGIvaW5jbHVkZS9hc20taWE2NC9wY2kuaAppbmRleCBkYmE5ZjIyLi5lZjYxNmZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKQEAgLTE1Niw2ICsxNTYsMTkgQEAKIGV4dGVybiB2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCXN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICoKK3BjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7CisKKwlyZXR1cm4gcm9vdDsKK30KKwogI2RlZmluZSBwY2liaW9zX3NjYW5fYWxsX2ZucyhhLCBiKQkwCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCmluZGV4IDkxYmJkMWYuLjk0ZTA3ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wcm9jZXNzb3IuaApAQCAtMjAsOSArMjAsNiBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdXN0YWNrLmg+CiAKLS8qIE91ciBhcmNoIHNwZWNpZmljIGFyY2hfaW5pdF9zY2hlZF9kb21haW4gaXMgaW4gYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYyAqLwotI2RlZmluZSBBUkNIX0hBU19TQ0hFRF9ET01BSU4KLQogI2RlZmluZSBJQTY0X05VTV9EQkdfUkVHUwk4CiAvKgogICogTGltaXRzIGZvciBQTUMgYW5kIFBNRCBhcmUgc2V0IHRvIGxlc3MgdGhhbiBtYXhpbXVtIGFyY2hpdGVjdGVkIHZhbHVlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmgKaW5kZXggMGJlZjE5NS4uYzg3NjZkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3B0cmFjZS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKICNpbmNsdWRlIDxhc20vZnB1Lmg+Ci0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyoKICAqIEJhc2UtMiBsb2dhcml0aG0gb2YgbnVtYmVyIG9mIHBhZ2VzIHRvIGFsbG9jYXRlIHBlciB0YXNrIHN0cnVjdHVyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20taWE2NC9zcGlubG9jay5oCmluZGV4IGQyNDMwYWEuLjViNzg2MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NwaW5sb2NrLmgKQEAgLTE3LDI4ICsxNywyMCBAQAogI2luY2x1ZGUgPGFzbS9pbnRyaW5zaWNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkJCShzcGlubG9ja190KSB7IDAgfQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQkJCSgoeCktPmxvY2sgPSAwKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfaW5pdCh4KQkJCSgoeCktPmxvY2sgPSAwKQogCiAjaWZkZWYgQVNNX1NVUFBPUlRFRAogLyoKICAqIFRyeSB0byBnZXQgdGhlIGxvY2suICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgbG9jaywgbWFrZSBhIG5vbi1zdGFuZGFyZCBjYWxsIHRvCiAgKiBpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb24oKS4gIFdlIGRvIG5vdCB1c2UgYSBub3JtYWwgY2FsbCBiZWNhdXNlIHRoYXQgd291bGQgZm9yY2UgYWxsCi0gKiBjYWxsZXJzIG9mIHNwaW5fbG9jaygpIHRvIGJlIG5vbi1sZWFmIHJvdXRpbmVzLiAgSW5zdGVhZCwgaWE2NF9zcGlubG9ja19jb250ZW50aW9uKCkgaXMKLSAqIGNhcmVmdWxseSBjb2RlZCB0byB0b3VjaCBvbmx5IHRob3NlIHJlZ2lzdGVycyB0aGF0IHNwaW5fbG9jaygpIG1hcmtzICJjbG9iYmVyZWQiLgorICogY2FsbGVycyBvZiBfX3Jhd19zcGluX2xvY2soKSB0byBiZSBub24tbGVhZiByb3V0aW5lcy4gIEluc3RlYWQsIGlhNjRfc3BpbmxvY2tfY29udGVudGlvbigpIGlzCisgKiBjYXJlZnVsbHkgY29kZWQgdG8gdG91Y2ggb25seSB0aG9zZSByZWdpc3RlcnMgdGhhdCBfX3Jhd19zcGluX2xvY2soKSBtYXJrcyAiY2xvYmJlcmVkIi4KICAqLwogCiAjZGVmaW5lIElBNjRfU1BJTkxPQ0tfQ0xPQkJFUlMgImFyLmNjdiIsICJhci5wZnMiLCAicDE0IiwgInAxNSIsICJyMjciLCAicjI4IiwgInIyOSIsICJyMzAiLCAiYjYiLCAibWVtb3J5IgogCiBzdGF0aWMgaW5saW5lIHZvaWQKLV9yYXdfc3Bpbl9sb2NrX2ZsYWdzIChzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorX19yYXdfc3Bpbl9sb2NrX2ZsYWdzIChyYXdfc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnB0ciBhc20gKCJyMzEiKSA9ICZsb2NrLT5sb2NrOwogCkBAIC05NCwxNyArODYsMTcgQEAKICNlbmRpZgogfQogCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrKGxvY2spIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIDApCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9jayhsb2NrKSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgMCkKIAogLyogVW5sb2NrIGJ5IGRvaW5nIGFuIG9yZGVyZWQgc3RvcmUgYW5kIHJlbGVhc2luZyB0aGUgY2FjaGVsaW5lIHdpdGggbnRhICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICp4KSB7CitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKngpIHsKIAliYXJyaWVyKCk7CiAJYXNtIHZvbGF0aWxlICgic3Q0LnJlbC5udGEgWyUwXSA9IHIwXG5cdCIgOjogInIiKHgpKTsKIH0KIAogI2Vsc2UgLyogIUFTTV9TVVBQT1JURUQgKi8KLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCi0jIGRlZmluZSBfcmF3X3NwaW5fbG9jayh4KQkJCQkJCQkJXAorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorIyBkZWZpbmUgX19yYXdfc3Bpbl9sb2NrKHgpCQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJCQlcCiAJX191MzIgKmlhNjRfc3BpbmxvY2tfcHRyID0gKF9fdTMyICopICh4KTsJCQkJCVwKIAlfX3U2NCBpYTY0X3NwaW5sb2NrX3ZhbDsJCQkJCQkJXApAQCAtMTE3LDI5ICsxMDksMjAgQEAKIAkJfSB3aGlsZSAoaWE2NF9zcGlubG9ja192YWwpOwkJCQkJCVwKIAl9CQkJCQkJCQkJCVwKIH0gd2hpbGUgKDApCi0jZGVmaW5lIF9yYXdfc3Bpbl91bmxvY2soeCkJZG8geyBiYXJyaWVyKCk7ICgoc3BpbmxvY2tfdCAqKSB4KS0+bG9jayA9IDA7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrKHgpCWRvIHsgYmFycmllcigpOyAoKHJhd19zcGlubG9ja190ICopIHgpLT5sb2NrID0gMDsgfSB3aGlsZSAoMCkKICNlbmRpZiAvKiAhQVNNX1NVUFBPUlRFRCAqLwogCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2soeCkJKGNtcHhjaGdfYWNxKCYoeCktPmxvY2ssIDAsIDEpID09IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUgKCh4KS0+bG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJCSgoeCktPmxvY2sgIT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl90cnlsb2NrKHgpCQkoY21weGNoZ19hY3EoJih4KS0+bG9jaywgMCwgMSkgPT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IHJlYWRfY291bnRlcgk6IDI0OwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3cml0ZV9sb2NrCTogIDg7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgMCwgMCB9CisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2socncpCQkoKih2b2xhdGlsZSBpbnQgKikocncpID49IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoKih2b2xhdGlsZSBpbnQgKikocncpID09IDApCiAKLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLSNkZWZpbmUgcmVhZF9jYW5fbG9jayhydykJKCoodm9sYXRpbGUgaW50ICopKHJ3KSA+PSAwKQotI2RlZmluZSB3cml0ZV9jYW5fbG9jayhydykJKCoodm9sYXRpbGUgaW50ICopKHJ3KSA9PSAwKQotCi0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKHJ3KQkJCQkJCQkJXAorI2RlZmluZSBfX3Jhd19yZWFkX2xvY2socncpCQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJCQlcCi0Jcndsb2NrX3QgKl9fcmVhZF9sb2NrX3B0ciA9IChydyk7CQkJCQkJXAorCXJhd19yd2xvY2tfdCAqX19yZWFkX2xvY2tfcHRyID0gKHJ3KTsJCQkJCQlcCiAJCQkJCQkJCQkJCVwKIAl3aGlsZSAodW5saWtlbHkoaWE2NF9mZXRjaGFkZCgxLCAoaW50ICopIF9fcmVhZF9sb2NrX3B0ciwgYWNxKSA8IDApKSB7CQlcCiAJCWlhNjRfZmV0Y2hhZGQoLTEsIChpbnQgKikgX19yZWFkX2xvY2tfcHRyLCByZWwpOwkJCVwKQEAgLTE0OCwxNCArMTMxLDE0IEBACiAJfQkJCQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9yYXdfcmVhZF91bmxvY2socncpCQkJCQlcCisjZGVmaW5lIF9fcmF3X3JlYWRfdW5sb2NrKHJ3KQkJCQkJXAogZG8gewkJCQkJCQkJXAotCXJ3bG9ja190ICpfX3JlYWRfbG9ja19wdHIgPSAocncpOwkJCVwKKwlyYXdfcndsb2NrX3QgKl9fcmVhZF9sb2NrX3B0ciA9IChydyk7CQkJXAogCWlhNjRfZmV0Y2hhZGQoLTEsIChpbnQgKikgX19yZWFkX2xvY2tfcHRyLCByZWwpOwlcCiB9IHdoaWxlICgwKQogCiAjaWZkZWYgQVNNX1NVUFBPUlRFRAotI2RlZmluZSBfcmF3X3dyaXRlX2xvY2socncpCQkJCQkJCVwKKyNkZWZpbmUgX19yYXdfd3JpdGVfbG9jayhydykJCQkJCQkJXAogZG8gewkJCQkJCQkJCQlcCiAgCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQkJXAogCQkibW92IGFyLmNjdiA9IHIwXG4iCQkJCQkJXApAQCAtMTcwLDcgKzE1Myw3IEBACiAJCTo6ICJyIihydykgOiAiYXIuY2N2IiwgInA3IiwgInIyIiwgInIyOSIsICJtZW1vcnkiKTsJCVwKIH0gd2hpbGUoMCkKIAotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socncpCQkJCQkJCVwKKyNkZWZpbmUgX19yYXdfd3JpdGVfdHJ5bG9jayhydykJCQkJCQkJXAogKHsJCQkJCQkJCQkJXAogCXJlZ2lzdGVyIGxvbmcgcmVzdWx0OwkJCQkJCQlcCiAJCQkJCQkJCQkJXApAQCAtMTgyLDcgKzE2NSw3IEBACiAJKHJlc3VsdCA9PSAwKTsJCQkJCQkJCVwKIH0pCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICp4KQogewogCXU4ICp5ID0gKHU4ICopeDsKIAliYXJyaWVyKCk7CkBAIC0xOTEsNyArMTc0LDcgQEAKIAogI2Vsc2UgLyogIUFTTV9TVVBQT1JURUQgKi8KIAotI2RlZmluZSBfcmF3X3dyaXRlX2xvY2sobCkJCQkJCQkJCVwKKyNkZWZpbmUgX19yYXdfd3JpdGVfbG9jayhsKQkJCQkJCQkJXAogKHsJCQkJCQkJCQkJCVwKIAlfX3U2NCBpYTY0X3ZhbCwgaWE2NF9zZXRfdmFsID0gaWE2NF9kZXBfbWkoLTEsIDAsIDMxLCAxKTsJCQlcCiAJX191MzIgKmlhNjRfd3JpdGVfbG9ja19wdHIgPSAoX191MzIgKikgKGwpOwkJCQkJXApAQCAtMjAyLDcgKzE4NSw3IEBACiAJfSB3aGlsZSAoaWE2NF92YWwpOwkJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socncpCQkJCQkJXAorI2RlZmluZSBfX3Jhd193cml0ZV90cnlsb2NrKHJ3KQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCV9fdTY0IGlhNjRfdmFsOwkJCQkJCQlcCiAJX191NjQgaWE2NF9zZXRfdmFsID0gaWE2NF9kZXBfbWkoLTEsIDAsIDMxLDEpOwkJCVwKQEAgLTIxMCw3ICsxOTMsNyBAQAogCShpYTY0X3ZhbCA9PSAwKTsJCQkJCQlcCiB9KQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKngpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqeCkKIHsKIAliYXJyaWVyKCk7CiAJeC0+d3JpdGVfbG9jayA9IDA7CkBAIC0yMTgsNiArMjAxLDYgQEAKIAogI2VuZGlmIC8qICFBU01fU1VQUE9SVEVEICovCiAKLSNkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCiAKICNlbmRpZiAvKiAgX0FTTV9JQTY0X1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRlNDZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9JQTY0X1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9JQTY0X1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJlYWRfY291bnRlcgk6IDMxOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB3cml0ZV9sb2NrCTogIDE7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAsIDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oCmluZGV4IDMzMjU2ZGIuLjYzNTIzNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zeXN0ZW0uaApAQCAtMjc1LDYgKzI3NSw3IEBACiAgKi8KICNkZWZpbmUgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKIAorI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSF9TV0lUQ0hfU1RBQ0sKICNkZWZpbmUgaWE2NF9wbGF0Zm9ybV9pcyh4KSAoc3RyY21wKHgsIHBsYXRmb3JtX25hbWUpID09IDApCiAKIHZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaAppbmRleCA3ZGM4OTUxLi5iMmM3OWYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCkBAIC01LDcgKzUsNyBAQAogI2lmbmRlZiBfQVNNX0lBNjRfVEhSRUFEX0lORk9fSAogI2RlZmluZSBfQVNNX0lBNjRfVEhSRUFEX0lORk9fSAogCi0jaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKaW5kZXggMzk5YmMyOS4uYTlmNzM4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaApAQCAtOTgsMjkgKzk4LDYgQEAKIAkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKIH0KIAotLyogc2NoZWRfZG9tYWlucyBTRF9BTExOT0RFU19JTklUIGZvciBJQTY0IE5VTUEgbWFjaGluZXMgKi8KLSNkZWZpbmUgU0RfQUxMTk9ERVNfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewlcCi0JLnNwYW4JCQk9IENQVV9NQVNLX05PTkUsCVwKLQkucGFyZW50CQkJPSBOVUxMLAkJCVwKLQkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKLQkubWluX2ludGVydmFsCQk9IDY0LAkJCVwKLQkubWF4X2ludGVydmFsCQk9IDY0Km51bV9vbmxpbmVfY3B1cygpLAlcCi0JLmJ1c3lfZmFjdG9yCQk9IDEyOCwJCQlcCi0JLmltYmFsYW5jZV9wY3QJCT0gMTMzLAkJCVwKLQkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDAwMDApLAkJXAotCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCi0JLmJ1c3lfaWR4CQk9IDMsCQkJXAotCS5pZGxlX2lkeAkJPSAzLAkJCVwKLQkubmV3aWRsZV9pZHgJCT0gMCwgLyogdW51c2VkICovCVwKLQkud2FrZV9pZHgJCT0gMCwgLyogdW51c2VkICovCVwKLQkuZm9ya2V4ZWNfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCi0JLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAotCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFLAlcCi0JLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAotCS5iYWxhbmNlX2ludGVydmFsCT0gNjQsCQkJXAotCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXAotfQotCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdWFjY2Vzcy5oCmluZGV4IDhlZGQ5YTkuLjNhNzgyOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdWFjY2Vzcy5oCkBAIC03MiwxMyArNzIsNiBAQAogfSkKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpCV9fYWNjZXNzX29rKChhZGRyKSwgKHNpemUpLCBnZXRfZnMoKSkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQKLXZlcmlmeV9hcmVhIChpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBUaGVzZSBhcmUgdGhlIG1haW4gc2luZ2xlLXZhbHVlIHRyYW5zZmVyIHJvdXRpbmVzLiAgVGhleSBhdXRvbWF0aWNhbGx5CiAgKiB1c2UgdGhlIHJpZ2h0IHNpemUgaWYgd2UganVzdCBoYXZlIHRoZSByaWdodCBwb2ludGVyIHR5cGUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tbTMyci9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZkY2M4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTMyci9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX0FTTV9NMzJSX19BVVhWRUNfSAorI2RlZmluZSBfQVNNX00zMlJfX0FVWFZFQ19ICisKKyNlbmRpZiAgLyogX0FTTV9NMzJSX19BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9mY250bC5oIGIvaW5jbHVkZS9hc20tbTMyci9mY250bC5oCmluZGV4IDNlMzA4OTUuLjQ2YWIxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2ZjbnRsLmgKQEAgLTEsOTIgKzEgQEAKLSNpZm5kZWYgX0FTTV9NMzJSX0ZDTlRMX0gKLSNkZWZpbmUgX0FTTV9NMzJSX0ZDTlRMX0gKLQotLyogJElkJCAqLwotCi0vKiBvcmlnIDogaTM4NiAyLjQuMTggKi8KLQotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJIDAxMDAwMAotI2RlZmluZSBGQVNZTkMJCSAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBPX0RJUkVDVAkgMDQwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAotCi0jZW5kaWYgIC8qIF9BU01fTTMyUl9GQ05UTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLW0zMnIvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTMyci9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9oZHJlZy5oIGIvaW5jbHVkZS9hc20tbTMyci9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmZDFhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tbTMyci9zcGlubG9jay5oCmluZGV4IDY2MDhkODMuLjdkZTdkZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3NwaW5sb2NrLmgKQEAgLTE0LDU3ICsxNCwzMCBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi1leHRlcm4gaW50IHByaW50ayhjb25zdCBjaGFyICogZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwotCi0jZGVmaW5lIFJXX0xPQ0tfQklBUwkJIDB4MDEwMDAwMDAKLSNkZWZpbmUgUldfTE9DS19CSUFTX1NUUgkiMHgwMTAwMDAwMCIKLQogLyoKICAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgaW50IHNsb2NrOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCXVuc2lnbmVkIG1hZ2ljOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDCTB4ZGVhZDRlYWQKLQotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotI2RlZmluZSBTUElOTE9DS19NQUdJQ19JTklUCSwgU1BJTkxPQ0tfTUFHSUMKLSNlbHNlCi0jZGVmaW5lIFNQSU5MT0NLX01BR0lDX0lOSVQJLyogKi8KLSNlbmRpZgotCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAoc3BpbmxvY2tfdCkgeyAxIFNQSU5MT0NLX01BR0lDX0lOSVQgfQotCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0vKgorICoKKyAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3NwaW5sb2NrX3R5cGVzLmgpCisgKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIHR3byB2YXJpYW50cywgb25lIGNsZWFycyBJUlEncwogICogb24gdGhlIGxvY2FsIHByb2Nlc3Nvciwgb25lIGRvZXMgbm90LgogICoKICAqIFdlIG1ha2Ugbm8gZmFpcm5lc3MgYXNzdW1wdGlvbnMuIFRoZXkgaGF2ZSBhIGNvc3QuCiAgKi8KIAotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkoKih2b2xhdGlsZSBpbnQgKikoJih4KS0+c2xvY2spIDw9IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUoc3Bpbl9pc19sb2NrZWQoeCkpCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkJKCoodm9sYXRpbGUgaW50ICopKCYoeCktPnNsb2NrKSA8PSAwKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKKwkJZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkpCiAKIC8qKgotICogX3Jhd19zcGluX3RyeWxvY2sgLSBUcnkgc3BpbiBsb2NrIGFuZCByZXR1cm4gYSByZXN1bHQKKyAqIF9fcmF3X3NwaW5fdHJ5bG9jayAtIFRyeSBzcGluIGxvY2sgYW5kIHJldHVybiBhIHJlc3VsdAogICogQGxvY2s6IFBvaW50ZXIgdG8gdGhlIGxvY2sgdmFyaWFibGUKICAqCi0gKiBfcmF3X3NwaW5fdHJ5bG9jaygpIHRyaWVzIHRvIGdldCB0aGUgbG9jayBhbmQgcmV0dXJucyBhIHJlc3VsdC4KKyAqIF9fcmF3X3NwaW5fdHJ5bG9jaygpIHRyaWVzIHRvIGdldCB0aGUgbG9jayBhbmQgcmV0dXJucyBhIHJlc3VsdC4KICAqIE9uIHRoZSBtMzJyLCB0aGUgcmVzdWx0IHZhbHVlIGlzIDEgKD0gU3VjY2Vzcykgb3IgMCAoPSBGYWlsdXJlKS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlpbnQgb2xkdmFsOwogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKQEAgLTc4LDcgKzUxLDcgQEAKIAkgKiB9CiAJICovCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiIyBzcGluX3RyeWxvY2sJCQlcblx0IgorCQkiIyBfX3Jhd19zcGluX3RyeWxvY2sJCVxuXHQiCiAJCSJsZGkJJTEsICMwOwkJCVxuXHQiCiAJCSJtdmZjCSUyLCBwc3c7CQlcblx0IgogCQkiY2xycHN3CSMweDQwIC0+IG5vcDsJCVxuXHQiCkBAIC05NywxNiArNzAsMTAgQEAKIAlyZXR1cm4gKG9sZHZhbCA+IDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAwLCB0bXAxOwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JaWYgKHVubGlrZWx5KGxvY2stPm1hZ2ljICE9IFNQSU5MT0NLX01BR0lDKSkgewotCQlwcmludGsoInBjOiAlcFxuIiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQkJQlVHKCk7Ci0JfQotI2VuZGlmCiAJLyoKIAkgKiBsb2NrLT5zbG9jayA6ICA9MSA6IHVubG9jawogCSAqICAgICAgICAgICAgIDogPD0wIDogbG9jawpAQCAtMTE4LDcgKzg1LDcgQEAKIAkgKiB9CiAJICovCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiIyBzcGluX2xvY2sJCQlcblx0IgorCQkiIyBfX3Jhd19zcGluX2xvY2sJCVxuXHQiCiAJCSIuZmlsbGluc24JCQlcbiIKIAkJIjE6CQkJCVxuXHQiCiAJCSJtdmZjCSUxLCBwc3c7CQlcblx0IgpAQCAtMTQ1LDEyICsxMTIsOCBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JQlVHX09OKGxvY2stPm1hZ2ljICE9IFNQSU5MT0NLX01BR0lDKTsKLQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKGxvY2spKTsKLSNlbmRpZgogCW1iKCk7CiAJbG9jay0+c2xvY2sgPSAxOwogfQpAQCAtMTY0LDQyICsxMjcsNyBAQAogICogY2FuICJtaXgiIGlycS1zYWZlIGxvY2tzIC0gYW55IHdyaXRlciBuZWVkcyB0byBnZXQgYQogICogaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQogICogcmVhZC1sb2Nrcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCXVuc2lnbmVkIG1hZ2ljOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLQotI2RlZmluZSBSV0xPQ0tfTUFHSUMJMHhkZWFmMWVlZAotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0jZGVmaW5lIFJXTE9DS19NQUdJQ19JTklUCSwgUldMT0NLX01BR0lDCi0jZWxzZQotI2RlZmluZSBSV0xPQ0tfTUFHSUNfSU5JVAkvKiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgUldfTE9DS19CSUFTIFJXTE9DS19NQUdJQ19JTklUIH0KLQotI2RlZmluZSByd2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0KLS8qKgotICogcmVhZF9jYW5fbG9jayAtIHdvdWxkIHJlYWRfdHJ5bG9jaygpIHN1Y2NlZWQ/Ci0gKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KLSAqLwotI2RlZmluZSByZWFkX2Nhbl9sb2NrKHgpICgoaW50KSh4KS0+bG9jayA+IDApCi0KLS8qKgotICogd3JpdGVfY2FuX2xvY2sgLSB3b3VsZCB3cml0ZV90cnlsb2NrKCkgc3VjY2VlZD8KLSAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgotICovCi0jZGVmaW5lIHdyaXRlX2Nhbl9sb2NrKHgpICgoeCktPmxvY2sgPT0gUldfTE9DS19CSUFTKQotCi0vKgorICoKICAqIE9uIHg4Niwgd2UgaW1wbGVtZW50IHJlYWQtd3JpdGUgbG9ja3MgYXMgYSAzMi1iaXQgY291bnRlcgogICogd2l0aCB0aGUgaGlnaCBiaXQgKHNpZ24pIGJlaW5nIHRoZSAiY29udGVuZGVkIiBiaXQuCiAgKgpAQCAtMjA4LDE1ICsxMzYsMjMgQEAKICAqIENoYW5nZWQgdG8gdXNlIHRoZSBzYW1lIHRlY2huaXF1ZSBhcyBydyBzZW1hcGhvcmVzLiAgU2VlCiAgKiBzZW1hcGhvcmUuaCBmb3IgZGV0YWlscy4gIC1iZW4KICAqLwotLyogdGhlIHNwaW5sb2NrIGhlbHBlcnMgYXJlIGluIGFyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKKy8qKgorICogcmVhZF9jYW5fbG9jayAtIHdvdWxkIHJlYWRfdHJ5bG9jaygpIHN1Y2NlZWQ/CisgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KKyAqLworI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHgpICgoaW50KSh4KS0+bG9jayA+IDApCisKKy8qKgorICogd3JpdGVfY2FuX2xvY2sgLSB3b3VsZCB3cml0ZV90cnlsb2NrKCkgc3VjY2VlZD8KKyAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgorICovCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHgpICgoeCktPmxvY2sgPT0gUldfTE9DS19CSUFTKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAwLCB0bXAxOwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JQlVHX09OKHJ3LT5tYWdpYyAhPSBSV0xPQ0tfTUFHSUMpOwotI2VuZGlmCiAJLyoKIAkgKiBydy0+bG9jayA6ICA+MCA6IHVubG9jawogCSAqICAgICAgICAgIDogPD0wIDogbG9jawpAQCAtMjY0LDEzICsyMDAsMTAgQEAKIAkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAwLCB0bXAxLCB0bXAyOwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JQlVHX09OKHJ3LT5tYWdpYyAhPSBSV0xPQ0tfTUFHSUMpOwotI2VuZGlmCiAJLyoKIAkgKiBydy0+bG9jayA6ICA9UldfTE9DS19CSUFTX1NUUiA6IHVubG9jawogCSAqICAgICAgICAgIDogIT1SV19MT0NLX0JJQVNfU1RSIDogbG9jawpAQCAtMzIwLDcgKzI1Myw3IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAwLCB0bXAxOwogCkBAIC0zNDIsNyArMjc1LDcgQEAKIAkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGxvbmcgdG1wMCwgdG1wMSwgdG1wMjsKIApAQCAtMzY2LDkgKzI5OSw5IEBACiAJKTsKIH0KIAotI2RlZmluZSBfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJYXRvbWljX3QgKmNvdW50ID0gKGF0b21pY190ICopbG9jazsKIAlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdChSV19MT0NLX0JJQVMsIGNvdW50KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk5NDFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTMyci9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX0FTTV9NMzJSX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9NMzJSX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgaW50IHNsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAxIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgUldfTE9DS19CSUFTCQkJMHgwMTAwMDAwMAorI2RlZmluZSBSV19MT0NLX0JJQVNfU1RSCQkiMHgwMTAwMDAwMCIKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IFJXX0xPQ0tfQklBUyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1tMzJyL3VhY2Nlc3MuaAppbmRleCBiYmI4YWM0Li45M2Q4NjNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3VhY2Nlc3MuaApAQCAtMTIwLDMxICsxMjAsNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAotLyoqCi0gKiB2ZXJpZnlfYXJlYTogLSBPYnNvbGV0ZS9kZXByZWNhdGVkIGFuZCB3aWxsIGdvIGF3YXkgc29vbiwKLSAqIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkLgotICogQHR5cGU6IFR5cGUgb2YgYWNjZXNzOiAlVkVSSUZZX1JFQUQgb3IgJVZFUklGWV9XUklURQotICogQGFkZHI6IFVzZXIgc3BhY2UgcG9pbnRlciB0byBzdGFydCBvZiBibG9jayB0byBjaGVjawotICogQHNpemU6IFNpemUgb2YgYmxvY2sgdG8gY2hlY2sKLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gcmVwbGFjZWQgYnkgYWNjZXNzX29rKCkuCi0gKgotICogQ2hlY2tzIGlmIGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlIGlzIHZhbGlkLgotICoKLSAqIFJldHVybnMgemVybyBpZiB0aGUgbWVtb3J5IGJsb2NrIG1heSBiZSB2YWxpZCwgLUVGQVVMVAotICogaWYgaXQgaXMgZGVmaW5pdGVseSBpbnZhbGlkLgotICoKLSAqIFNlZSBhY2Nlc3Nfb2soKSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICphZGRyLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0ZDZkNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNbTY4a19BVVhWRUNfSAorI2RlZmluZSBfX0FTTW02OGtfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1tNjhrL2ZjbnRsLmgKaW5kZXggMGQ0MjEyOS4uMWMzNjliMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZmNudGwuaApAQCAtMSw4NyArMSwxMSBAQAogI2lmbmRlZiBfTTY4S19GQ05UTF9ICiAjZGVmaW5lIF9NNjhLX0ZDTlRMX0gKIAotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgIDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAwMgotI2RlZmluZSBPX0NSRUFUCQkgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgIDA0MDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCSAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJIDA0MDAwCi0jZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKLSNkZWZpbmUgT19TWU5DCQkwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkwNDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogI2RlZmluZSBPX05PRk9MTE9XCTAxMDAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fRElSRUNUCTAyMDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkwNDAwMDAwCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAogI2VuZGlmIC8qIF9NNjhLX0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLW02OGsvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9oZHJlZy5oIGIvaW5jbHVkZS9hc20tbTY4ay9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW02OGsvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSN3YXJuaW5nIHRoaXMgZmlsZSBpcyBvYnNvbGV0ZSwgcGxlYXNlIGRvIG5vdCB1c2UgaXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKaW5kZXggNjA1ZTZjYi4uZjVjZWRmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKQEAgLTE0LDEyICsxNCw2IEBACiAvKiBXZSBsZXQgdGhlIE1NVSBkbyBhbGwgY2hlY2tpbmcgKi8KICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSAxCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQogLyoKICAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCiAgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDRkNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTW02OGtfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01tNjhrX0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2NvbGRmaXJlLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY29sZGZpcmUuaAppbmRleCAxNmYzMmNjLi4xZGYzZjY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY29sZGZpcmUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY29sZGZpcmUuaApAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZQlNQ0ZfTUJBUjIJMHg4MDAwMDAwMAogI2RlZmluZQlNQ0ZfSVBTQkFSCTB4NDAwMDAwMDAKIAotI2lmIGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KQogI3VuZGVmIE1DRl9NQkFSCiAjZGVmaW5lCU1DRl9NQkFSCU1DRl9JUFNCQVIKICNlbmRpZgpAQCAtNTQsNiArNTQsOCBAQAogI2RlZmluZQlNQ0ZfQ0xLCQk1NDAwMDAwMAogI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNjBNSHopCiAjZGVmaW5lCU1DRl9DTEsJCTYwMDAwMDAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS182Ml81TUh6KQorI2RlZmluZSBNQ0ZfQ0xLCQk2MjUwMDAwMAogI2VsaWYgZGVmaW5lZChDT05GSUdfQ0xPQ0tfNjRNSHopCiAjZGVmaW5lCU1DRl9DTEsJCTY0MDAwMDAwCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DTE9DS182Nk1IeikKQEAgLTc2LDcgKzc4LDcgQEAKICAqCU9uZSBzb21lIENvbGRGaXJlIGZhbWlseSBtZW1iZXJzIHRoZSBidXMgY2xvY2sgKHVzZWQgYnkgaW50ZXJuYWwKICAqCXBlcmlwaGVyYWxzKSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIENQVSBjbG9jay4KICAqLwotI2lmIGRlZmluZWQoQ09ORklHX001MjQ5KSB8fCBkZWZpbmVkKENPTkZJR19NNTI3eCkKKyNpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyNDkpIHx8IGRlZmluZWQoQ09ORklHX001Mjd4KQogI2RlZmluZQlNQ0ZfQlVTQ0xLCShNQ0ZfQ0xLIC8gMikKICNlbHNlCiAjZGVmaW5lCU1DRl9CVVNDTEsJTUNGX0NMSwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkOWIwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1tNjhrL2hkcmVnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUyM3hzaW0uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tNTIzeHNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmNmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbTUyM3hzaW0uaApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCW01MjN4c2ltLmggLS0gQ29sZEZpcmUgNTIzeCBTeXN0ZW0gSW50ZWdyYXRpb24gTW9kdWxlIHN1cHBvcnQuCisgKgorICoJKEMpIENvcHlyaWdodCAyMDAzLTIwMDUsIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCW01MjN4c2ltX2gKKyNkZWZpbmUJbTUyM3hzaW1faAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqCURlZmluZSB0aGUgNTIzeCBTSU0gcmVnaXN0ZXIgc2V0IGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZQlNQ0ZJQ01fSU5UQzAJCTB4MGMwMAkJLyogQmFzZSBmb3IgSW50ZXJydXB0IEN0cmwgMCAqLworI2RlZmluZQlNQ0ZJQ01fSU5UQzEJCTB4MGQwMAkJLyogQmFzZSBmb3IgSW50ZXJydXB0IEN0cmwgMCAqLworI2RlZmluZQlNQ0ZJTlRDX0lQUkgJCTB4MDAJCS8qIEludGVycnVwdCBwZW5kaW5nIDMyLTYzICovCisjZGVmaW5lCU1DRklOVENfSVBSTAkJMHgwNAkJLyogSW50ZXJydXB0IHBlbmRpbmcgMS0zMSAqLworI2RlZmluZQlNQ0ZJTlRDX0lNUkgJCTB4MDgJCS8qIEludGVycnVwdCBtYXNrIDMyLTYzICovCisjZGVmaW5lCU1DRklOVENfSU1STAkJMHgwYwkJLyogSW50ZXJydXB0IG1hc2sgMS0zMSAqLworI2RlZmluZQlNQ0ZJTlRDX0lOVEZSQ0gJCTB4MTAJCS8qIEludGVycnVwdCBmb3JjZSAzMi02MyAqLworI2RlZmluZQlNQ0ZJTlRDX0lOVEZSQ0wJCTB4MTQJCS8qIEludGVycnVwdCBmb3JjZSAxLTMxICovCisjZGVmaW5lCU1DRklOVENfSVJMUgkJMHgxOAkJLyogKi8KKyNkZWZpbmUJTUNGSU5UQ19JQUNLTAkJMHgxOQkJLyogKi8KKyNkZWZpbmUJTUNGSU5UQ19JQ1IwCQkweDQwCQkvKiBCYXNlIElDUiByZWdpc3RlciAqLworCisjZGVmaW5lCU1DRklOVF9WRUNCQVNFCQk2NAkJLyogVmVjdG9yIGJhc2UgbnVtYmVyICovCisjZGVmaW5lCU1DRklOVF9VQVJUMAkJMTMJCS8qIEludGVycnVwdCBudW1iZXIgZm9yIFVBUlQwICovCisjZGVmaW5lCU1DRklOVF9QSVQxCQkzNgkJLyogSW50ZXJydXB0IG51bWJlciBmb3IgUElUMSAqLworI2RlZmluZSBNQ0ZJTlRfUVNQSQkJMTgJCS8qIEludGVycnVwdCBudW1iZXIgZm9yIFFTUEkgKi8KKworLyoKKyAqCVNEUkFNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICovCisjZGVmaW5lCU1DRlNJTV9EQ1IJCTB4NDQJCS8qIFNEUkFNIGNvbnRyb2wgKi8KKyNkZWZpbmUJTUNGU0lNX0RBQ1IwCQkweDQ4CQkvKiBTRFJBTSBiYXNlIGFkZHJlc3MgMCAqLworI2RlZmluZQlNQ0ZTSU1fRE1SMAkJMHg0YwkJLyogU0RSQU0gYWRkcmVzcyBtYXNrIDAgKi8KKyNkZWZpbmUJTUNGU0lNX0RBQ1IxCQkweDUwCQkvKiBTRFJBTSBiYXNlIGFkZHJlc3MgMSAqLworI2RlZmluZQlNQ0ZTSU1fRE1SMQkJMHg1NAkJLyogU0RSQU0gYWRkcmVzcyBtYXNrIDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYJLyogbTUyM3hzaW1faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnNpbS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnNpbS5oCmluZGV4IDUyMmU1MTMuLmIwYzc3MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZzaW0uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmc2ltLmgKQEAgLTE1LDEzICsxNSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCiAvKgotICoJSW5jbHVkZSA1MjA0LCA1MjA2L2UsIDUyNDksIDUyNzAvNTI3MSwgNTI3MiwgNTI4MC81MjgyLCA1MzA3IG9yCi0gKgk1NDA3IHNwZWNpZmljIGFkZHJlc3Nlcy4KKyAqCUluY2x1ZGUgNTIwNCwgNTIwNi9lLCA1MjM1LCA1MjQ5LCA1MjcwLzUyNzEsIDUyNzIsIDUyODAvNTI4MiwKKyAqCTUzMDcgb3IgNTQwNyBzcGVjaWZpYyBhZGRyZXNzZXMuCiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19NNTIwNCkKICNpbmNsdWRlIDxhc20vbTUyMDRzaW0uaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX001MjA2KSB8fCBkZWZpbmVkKENPTkZJR19NNTIwNmUpCiAjaW5jbHVkZSA8YXNtL201MjA2c2ltLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkKKyNpbmNsdWRlIDxhc20vbTUyM3hzaW0uaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX001MjQ5KQogI2luY2x1ZGUgPGFzbS9tNTI0OXNpbS5oPgogI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyN3gpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmdWFydC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZnVhcnQuaAppbmRleCA1NGQ0YTg1Li45YzEyMTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmdWFydC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2Z1YXJ0LmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUJTUNGVUFSVF9CQVNFMQkJMHgxNDAJCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMSAqLwogI2RlZmluZQlNQ0ZVQVJUX0JBU0UyCQkweDE4MAkJLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQyICovCiAjZW5kaWYKLSNlbGlmIGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX001MjN4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI3eCkgfHwgZGVmaW5lZChDT05GSUdfTTUyOHgpCiAjZGVmaW5lIE1DRlVBUlRfQkFTRTEJCTB4MjAwICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDEgKi8KICNkZWZpbmUgTUNGVUFSVF9CQVNFMgkJMHgyNDAgICAgICAgICAgIC8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMiAqLwogI2RlZmluZSBNQ0ZVQVJUX0JBU0UzCQkweDI4MCAgICAgICAgICAgLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3VhY2Nlc3MuaAppbmRleCBmMGJlNzRiLi4wNWJlOTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS91YWNjZXNzLmgKQEAgLTIzLDEyICsyMyw2IEBACiAJCShpc19pbl9yb20oYWRkcikgJiYgaXNfaW5fcm9tKGFkZHIrc2l6ZSkpKTsKIH0KIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSk/MDotRUZBVUxUOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby0zMi5oIGIvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby0zMi5oCmluZGV4IGFjODgyM2QuLjExZGFmNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8tMzIuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTMyLmgKQEAgLTcsNyArNyw3IEBACiAjaWZuZGVmIF9BU01fQVNNTUFDUk9fMzJfSAogI2RlZmluZSBfQVNNX0FTTU1BQ1JPXzMyX0gKIAotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTY0LmggYi9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTY0LmgKaW5kZXggYmJlZDM1NS4uNTU5YzM1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby02NC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8tNjQuaApAQCAtOCw3ICs4LDcgQEAKICNpZm5kZWYgX0FTTV9BU01NQUNST182NF9ICiAjZGVmaW5lIF9BU01fQVNNTUFDUk9fNjRfSAogCi0jaW5jbHVkZSA8YXNtL29mZnNldC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1taXBzL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjdmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfQVNNX0FVWFZFQ19ICisjZGVmaW5lIF9BU01fQVVYVkVDX0gKKworI2VuZGlmIC8qIF9BU01fQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCmluZGV4IGQ3ODAwMmEuLjJjMDg0Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaApAQCAtMTUsOCArMTUsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfc3VzZWNvbmRzX3Q7CiAKIHR5cGVkZWYgczMyCQljb21wYXRfcGlkX3Q7Ci10eXBlZGVmIHMzMgkJY29tcGF0X3VpZF90OwotdHlwZWRlZiBzMzIJCWNvbXBhdF9naWRfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF91aWRfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWRfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF91aWQzMl90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X2dpZDMyX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X21vZGVfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfaW5vX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2Rldl90OwpAQCAtNTIsOCArNTQsOCBAQAogCWNvbXBhdF9pbm9fdAlzdF9pbm87CiAJY29tcGF0X21vZGVfdAlzdF9tb2RlOwogCWNvbXBhdF9ubGlua190CXN0X25saW5rOwotCWNvbXBhdF91aWRfdAlzdF91aWQ7Ci0JY29tcGF0X2dpZF90CXN0X2dpZDsKKwlfX2NvbXBhdF91aWQzMl90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWQzMl90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAlzMzIJCXN0X3BhZDJbMl07CiAJY29tcGF0X29mZl90CXN0X3NpemU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmgKaW5kZXggMjQzNjM5Mi4uMDZjNWQxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZmNudGwuaApAQCAtOCwzMyArOCwxNiBAQAogI2lmbmRlZiBfQVNNX0ZDTlRMX0gKICNkZWZpbmUgX0FTTV9GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJMHgwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCTB4MDAwMAotI2RlZmluZSBPX1dST05MWQkweDAwMDEKLSNkZWZpbmUgT19SRFdSCQkweDAwMDIKICNkZWZpbmUgT19BUFBFTkQJMHgwMDA4CiAjZGVmaW5lIE9fU1lOQwkJMHgwMDEwCiAjZGVmaW5lIE9fTk9OQkxPQ0sJMHgwMDgwCiAjZGVmaW5lIE9fQ1JFQVQgICAgICAgICAweDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCTB4MDIwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19FWENMCQkweDA0MDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fTk9DVFRZCTB4MDgwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgRkFTWU5DCQkweDEwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkweDIwMDAJLyogYWxsb3cgbGFyZ2UgZmlsZSBvcGVucyAqLwogI2RlZmluZSBPX0RJUkVDVAkweDgwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KLSNkZWZpbmUgT19ESVJFQ1RPUlkJMHgxMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMHgyMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTB4NDAwMDAKIAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwogI2RlZmluZSBGX0dFVExLCQkxNAogI2RlZmluZSBGX1NFVExLCQk2CiAjZGVmaW5lIEZfU0VUTEtXCTcKQEAgLTUwLDMzICszMyw2IEBACiAjZGVmaW5lIEZfU0VUTEtXNjQJMzUKICNlbmRpZgogCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KIC8qCiAgKiBUaGUgZmxhdm91cnMgb2Ygc3RydWN0IGZsb2NrLiAgInN0cnVjdCBmbG9jayIgaXMgdGhlIEFCSSBjb21wbGlhbnQKICAqIHZhcmlhbnQuICBGaW5hbGx5IHN0cnVjdCBmbG9jazY0IGlzIHRoZSBMRlMgdmFyaWFudCBvZiBzdHJ1Y3QgZmxvY2suICBBcwpAQCAtODYsNyArNDIsNyBAQAogCiAjaWZuZGVmIF9fbWlwczY0CiAKLXR5cGVkZWYgc3RydWN0IGZsb2NrIHsKK3N0cnVjdCBmbG9jayB7CiAJc2hvcnQJbF90eXBlOwogCXNob3J0CWxfd2hlbmNlOwogCV9fa2VybmVsX29mZl90IGxfc3RhcnQ7CkBAIC05NCwzMiArNTAsMTcgQEAKIAlsb25nCWxfc3lzaWQ7CiAJX19rZXJuZWxfcGlkX3QgbF9waWQ7CiAJbG9uZwlwYWRbNF07Ci19IGZsb2NrX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydAlsX3R5cGU7Ci0Jc2hvcnQJbF93aGVuY2U7Ci0JbG9mZl90CWxfc3RhcnQ7Ci0JbG9mZl90CWxfbGVuOwotCXBpZF90CWxfcGlkOwotfSBmbG9jazY0X3Q7Ci0KLSNlbHNlIC8qIDY0LWJpdCBkZWZpbml0aW9ucyAqLwotCi10eXBlZGVmIHN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQJbF90eXBlOwotCXNob3J0CWxfd2hlbmNlOwotCV9fa2VybmVsX29mZl90IGxfc3RhcnQ7Ci0JX19rZXJuZWxfb2ZmX3QgbF9sZW47Ci0JX19rZXJuZWxfcGlkX3QgbF9waWQ7Ci19IGZsb2NrX3Q7Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIGZsb2NrNjQJCWZsb2NrCi0jZW5kaWYKKyNkZWZpbmUgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSwogCiAjZW5kaWYKIAotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CisKK3R5cGVkZWYgc3RydWN0IGZsb2NrIGZsb2NrX3Q7CisjaWZuZGVmIF9fbWlwczY0Cit0eXBlZGVmIHN0cnVjdCBmbG9jazY0IGZsb2NrNjRfdDsKKyNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9GQ05UTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1taXBzL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZmY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0OworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9oZHJlZy5oIGIvaW5jbHVkZS9hc20tbWlwcy9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSN3YXJuaW5nIHRoaXMgZmlsZSBpcyBvYnNvbGV0ZSwgcGxlYXNlIGRvIG5vdCB1c2UgaXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmggYi9pbmNsdWRlL2FzbS1taXBzL2lycS5oCmluZGV4IGI5MGIxMWQuLjNmMjQ3MGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9pcnEuaApAQCAtNDksNyArNDksNCBAQAogCiBleHRlcm4gdm9pZCBhcmNoX2luaXRfaXJxKHZvaWQpOwogCi1zdHJ1Y3QgaXJxYWN0aW9uOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOwotCiAjZW5kaWYgLyogX0FTTV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2ltLmgKaW5kZXggM2NjZmUwOS4uOWMyYWYxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpbS5oCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2luY2x1ZGUgPGFzbS9vZmZzZXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2RlZmluZSBfX3N0cjIoeCkgI3gKICNkZWZpbmUgX19zdHIoeCkgX19zdHIyKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmgKaW5kZXggMTE0ZDNlYi4uNGQwMTM1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaApAQCAtMTYsMjAgKzE2LDEwIEBACiAgKiBZb3VyIGJhc2ljIFNNUCBzcGlubG9ja3MsIGFsbG93aW5nIG9ubHkgYSBzaW5nbGUgQ1BVIGFueXdoZXJlCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgMCB9Ci0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkJZG8geyAoeCktPmxvY2sgPSAwOyB9IHdoaWxlKDApCi0KLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkJKCh4KS0+bG9jayAhPSAwKQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KHgpCWRvIHsgYmFycmllcigpOyB9IHdoaWxlICgoeCktPmxvY2spCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX19yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQoeCkgXAorCQlkbyB7IGNwdV9yZWxheCgpOyB9IHdoaWxlICgoeCktPmxvY2spCiAKIC8qCiAgKiBTaW1wbGUgc3BpbiBsb2NrIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzLCBvbmUgY2xlYXJzIElSUSdzCkBAIC0zOCwxMyArMjgsMTMgQEAKICAqIFdlIG1ha2Ugbm8gZmFpcm5lc3MgYXNzdW1wdGlvbnMuICBUaGV5IGhhdmUgYSBjb3N0LgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCiAJaWYgKFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfc3Bpbl9sb2NrCVxuIgorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfc3Bpbl9sb2NrCVxuIgogCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKIAkJIglibmV6CSUxLCAxYgkJCQkJXG4iCiAJCSIJIGxpCSUxLCAxCQkJCQlcbiIKQEAgLTU4LDcgKzQ4LDcgQEAKIAkJOiAibWVtb3J5Iik7CiAJfSBlbHNlIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3NwaW5fbG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3NwaW5fbG9jawlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCiAJCSIJYm5legklMSwgMWIJCQkJCVxuIgogCQkiCSBsaQklMSwgMQkJCQkJXG4iCkBAIC03MiwxMCArNjIsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfc3Bpbl91bmxvY2sJXG4iCisJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3NwaW5fdW5sb2NrCVxuIgogCSIJc3luYwkJCQkJCVxuIgogCSIJc3cJJDAsICUwCQkJCQlcbiIKIAkiCS5zZXRcdHJlb3JkZXIJCQkJCVxuIgpAQCAtODQsMTMgKzc0LDEzIEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgaW50IHRlbXAsIHJlczsKIAogCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3NwaW5fdHJ5bG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3NwaW5fdHJ5bG9jawlcbiIKIAkJIjE6CWxsCSUwLCAlMwkJCQkJXG4iCiAJCSIJb3JpCSUyLCAlMCwgMQkJCQlcbiIKIAkJIglzYwklMiwgJTEJCQkJCVxuIgpAQCAtMTA0LDcgKzk0LDcgQEAKIAkJOiAibWVtb3J5Iik7CiAJfSBlbHNlIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfcmF3X3NwaW5fdHJ5bG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3NwaW5fdHJ5bG9jawlcbiIKIAkJIjE6CWxsCSUwLCAlMwkJCQkJXG4iCiAJCSIJb3JpCSUyLCAlMCwgMQkJCQlcbiIKIAkJIglzYwklMiwgJTEJCQkJCVxuIgpAQCAtMTI5LDI0ICsxMTksMTMgQEAKICAqIHJlYWQtbG9ja3MuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7Ci0KLSNkZWZpbmUgUldfTE9DS19VTkxPQ0tFRCAocndsb2NrX3QpIHsgMCB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQoeCkgIGRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCiAJaWYgKFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfcmVhZF9sb2NrCVxuIgorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfcmVhZF9sb2NrCVxuIgogCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKIAkJIglibHR6CSUxLCAxYgkJCQkJXG4iCiAJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgpAQCAtMTYwLDcgKzEzOSw3IEBACiAJCTogIm1lbW9yeSIpOwogCX0gZWxzZSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd19yZWFkX2xvY2sJXG4iCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX2xvY2sJXG4iCiAJCSIxOglsbAklMSwgJTIJCQkJCVxuIgogCQkiCWJsdHoJJTEsIDFiCQkJCQlcbiIKIAkJIgkgYWRkdQklMSwgMQkJCQkJXG4iCkBAIC0xNzcsMTMgKzE1NiwxMyBAQAogLyogTm90ZSB0aGUgdXNlIG9mIHN1Yiwgbm90IHN1YnUgd2hpY2ggd2lsbCBtYWtlIHRoZSBrZXJuZWwgZGllIHdpdGggYW4KICAgIG92ZXJmbG93IGV4Y2VwdGlvbiBpZiB3ZSBldmVyIHRyeSB0byB1bmxvY2sgYW4gcndsb2NrIHRoYXQgaXMgYWxyZWFkeQogICAgdW5sb2NrZWQgb3IgaXMgYmVpbmcgaGVsZCBieSBhIHdyaXRlci4gICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCiAJaWYgKFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIjE6CWxsCSUxLCAlMgkJIyBfcmF3X3JlYWRfdW5sb2NrCVxuIgorCQkiMToJbGwJJTEsICUyCQkjIF9fcmF3X3JlYWRfdW5sb2NrCVxuIgogCQkiCXN1YgklMSwgMQkJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgpAQCAtMTkzLDcgKzE3Miw3IEBACiAJCTogIm1lbW9yeSIpOwogCX0gZWxzZSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd19yZWFkX3VubG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3JlYWRfdW5sb2NrCVxuIgogCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKIAkJIglzdWIJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCkBAIC0yMDYsMTMgKzE4NSwxMyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKIAlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd193cml0ZV9sb2NrCVxuIgorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfd3JpdGVfbG9jawlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCiAJCSIJYm5legklMSwgMWIJCQkJCVxuIgogCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKQEAgLTIyNiw3ICsyMDUsNyBAQAogCQk6ICJtZW1vcnkiKTsKIAl9IGVsc2UgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfd3JpdGVfbG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3dyaXRlX2xvY2sJXG4iCiAJCSIxOglsbAklMSwgJTIJCQkJCVxuIgogCQkiCWJuZXoJJTEsIDFiCQkJCQlcbiIKIAkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCkBAIC0yNDEsMjYgKzIyMCwyNiBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiCXN5bmMJCQkjIF9yYXdfd3JpdGVfdW5sb2NrCVxuIgorCSIJc3luYwkJCSMgX19yYXdfd3JpdGVfdW5sb2NrCVxuIgogCSIJc3cJJDAsICUwCQkJCQlcbiIKIAk6ICI9bSIgKHJ3LT5sb2NrKQogCTogIm0iIChydy0+bG9jaykKIAk6ICJtZW1vcnkiKTsKIH0KIAotI2RlZmluZSBfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykKIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCWludCByZXQ7CiAKIAlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX3Jhd193cml0ZV90cnlsb2NrCVxuIgorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfd3JpdGVfdHJ5bG9jawlcbiIKIAkJIglsaQklMiwgMAkJCQkJXG4iCiAJCSIxOglsbAklMSwgJTMJCQkJCVxuIgogCQkiCWJuZXoJJTEsIDJmCQkJCQlcbiIKQEAgLTI3Nyw3ICsyNTYsNyBAQAogCQk6ICJtZW1vcnkiKTsKIAl9IGVsc2UgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9yYXdfd3JpdGVfdHJ5bG9jawlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3dyaXRlX3RyeWxvY2sJXG4iCiAJCSIJbGkJJTIsIDAJCQkJCVxuIgogCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKIAkJIglibmV6CSUxLCAyZgkJCQkJXG4iCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNmM1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9BU01fU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc3RhY2tmcmFtZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zdGFja2ZyYW1lLmgKaW5kZXggZmI0MmY5OS4uN2I1ZTY0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zdGFja2ZyYW1lLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zdGFja2ZyYW1lLmgKQEAgLTE1LDcgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9hc20uaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vb2Zmc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkJLm1hY3JvCVNBVkVfQVQKIAkJLnNldAlwdXNoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdWFjY2Vzcy5oCmluZGV4IGE1NDNlYWQuLjVjMmM5ODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdWFjY2Vzcy5oCkBAIC0xMTIsMjkgKzExMiw2IEBACiAJbGlrZWx5KF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKShhZGRyKSwgKHNpemUpLF9fYWNjZXNzX21hc2spKQogCiAvKgotICogdmVyaWZ5X2FyZWE6IC0gT2Jzb2xldGUvZGVwcmVjYXRlZCBhbmQgd2lsbCBnbyBhd2F5IHNvb24sCi0gKiB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZC4KLSAqIEB0eXBlOiBUeXBlIG9mIGFjY2VzczogJVZFUklGWV9SRUFEIG9yICVWRVJJRllfV1JJVEUKLSAqIEBhZGRyOiBVc2VyIHNwYWNlIHBvaW50ZXIgdG8gc3RhcnQgb2YgYmxvY2sgdG8gY2hlY2sKLSAqIEBzaXplOiBTaXplIG9mIGJsb2NrIHRvIGNoZWNrCi0gKgotICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpLgotICoKLSAqIENoZWNrcyBpZiBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZSBpcyB2YWxpZC4KLSAqCi0gKiBSZXR1cm5zIHplcm8gaWYgdGhlIG1lbW9yeSBibG9jayBtYXkgYmUgdmFsaWQsIC1FRkFVTFQKLSAqIGlmIGl0IGlzIGRlZmluaXRlbHkgaW52YWxpZC4KLSAqCi0gKiBTZWUgYWNjZXNzX29rKCkgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotLyoKICAqIHB1dF91c2VyOiAtIFdyaXRlIGEgc2ltcGxlIHZhbHVlIGludG8gdXNlciBzcGFjZS4KICAqIEB4OiAgIFZhbHVlIHRvIGNvcHkgdG8gdXNlciBzcGFjZS4KICAqIEBwdHI6IERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC90YjAyODcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDI4Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTgzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC90YjAyODcuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogIHRiMDI4Ny5oLCBJbmNsdWRlIGZpbGUgZm9yIFRBTkJBQyBUQjAyODcgbWluaS1JVFggYm9hcmQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgTWVkaWEgTGFiIEluYy4gPGl0b0BtbGIuY28uanA+CisgKgorICogIFRoaXMgY29kZSBpcyBsYXJnZWx5IGJhc2VkIG9uIHRiMDIxOS5oLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fVEFOQkFDX1RCMDI4N19ICisjZGVmaW5lIF9fVEFOQkFDX1RCMDI4N19ICisKKyNpbmNsdWRlIDxhc20vdnI0MXh4L3ZyNDF4eC5oPgorCisvKgorICogR2VuZXJhbC1QdXJwb3NlIEkvTyBQaW4gTnVtYmVyCisgKi8KKyNkZWZpbmUgVEIwMjg3X1BDSV9TTE9UX1BJTgkJMgorI2RlZmluZSBUQjAyODdfU001MDFfUElOCQkzCisjZGVmaW5lIFRCMDI4N19TSUw2ODBBX1BJTgkJOAorI2RlZmluZSBUQjAyODdfUlRMODExMF9QSU4JCTEzCisKKy8qCisgKiBJbnRlcnJ1cHQgTnVtYmVyCisgKi8KKyNkZWZpbmUgVEIwMjg3X1BDSV9TTE9UX0lSUQkJR0lVX0lSUShUQjAyODdfUENJX1NMT1RfUElOKQorI2RlZmluZSBUQjAyODdfU001MDFfSVJRCQlHSVVfSVJRKFRCMDI4N19TTTUwMV9QSU4pCisjZGVmaW5lIFRCMDI4N19TSUw2ODBBX0lSUQkJR0lVX0lSUShUQjAyODdfU0lMNjgwQV9QSU4pCisjZGVmaW5lIFRCMDI4N19SVEw4MTEwX0lSUQkJR0lVX0lSUShUQjAyODdfUlRMODExMF9QSU4pCisKKyNlbmRpZiAvKiBfX1RBTkJBQ19UQjAyODdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2Fzc2VtYmx5LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvYXNzZW1ibHkuaAppbmRleCBjYmMyODZmLi4zMGIwMjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvYXNzZW1ibHkuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvYXNzZW1ibHkuaApAQCAtNjMsNyArNjMsNyBAQAogCS5sZXZlbCAyLjB3CiAjZW5kaWYKIAotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2luY2x1ZGUgPGFzbS9hc21yZWdzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvYXRvbWljLmgKaW5kZXggZTI0Zjc1Ny4uMDQ4YTJjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9hdG9taWMuaApAQCAtMjQsMTkgKzI0LDE5IEBACiAjICBkZWZpbmUgQVRPTUlDX0hBU0hfU0laRSA0CiAjICBkZWZpbmUgQVRPTUlDX0hBU0goYSkgKCYoX19hdG9taWNfaGFzaFsgKCgodW5zaWduZWQgbG9uZykgYSkvTDFfQ0FDSEVfQllURVMpICYgKEFUT01JQ19IQVNIX1NJWkUtMSkgXSkpCiAKLWV4dGVybiBzcGlubG9ja190IF9fYXRvbWljX2hhc2hbQVRPTUlDX0hBU0hfU0laRV0gX19sb2NrX2FsaWduZWQ7CitleHRlcm4gcmF3X3NwaW5sb2NrX3QgX19hdG9taWNfaGFzaFtBVE9NSUNfSEFTSF9TSVpFXSBfX2xvY2tfYWxpZ25lZDsKIAotLyogQ2FuJ3QgdXNlIF9yYXdfc3Bpbl9sb2NrX2lycSBiZWNhdXNlIG9mICNpbmNsdWRlIHByb2JsZW1zLCBzbworLyogQ2FuJ3QgdXNlIHJhd19zcGluX2xvY2tfaXJxIGJlY2F1c2Ugb2YgI2luY2x1ZGUgcHJvYmxlbXMsIHNvCiAgKiB0aGlzIGlzIHRoZSBzdWJzdGl0dXRlICovCiAjZGVmaW5lIF9hdG9taWNfc3Bpbl9sb2NrX2lycXNhdmUobCxmKSBkbyB7CVwKLQlzcGlubG9ja190ICpzID0gQVRPTUlDX0hBU0gobCk7CQlcCisJcmF3X3NwaW5sb2NrX3QgKnMgPSBBVE9NSUNfSEFTSChsKTsJCVwKIAlsb2NhbF9pcnFfc2F2ZShmKTsJCQlcCi0JX3Jhd19zcGluX2xvY2socyk7CQkJXAorCV9fcmF3X3NwaW5fbG9jayhzKTsJCQlcCiB9IHdoaWxlKDApCiAKICNkZWZpbmUgX2F0b21pY19zcGluX3VubG9ja19pcnFyZXN0b3JlKGwsZikgZG8gewlcCi0Jc3BpbmxvY2tfdCAqcyA9IEFUT01JQ19IQVNIKGwpOwkJCVwKLQlfcmF3X3NwaW5fdW5sb2NrKHMpOwkJCQlcCisJcmF3X3NwaW5sb2NrX3QgKnMgPSBBVE9NSUNfSEFTSChsKTsJCQlcCisJX19yYXdfc3Bpbl91bmxvY2socyk7CQkJCVwKIAlsb2NhbF9pcnFfcmVzdG9yZShmKTsJCQkJXAogfSB3aGlsZSgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzYWM0YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01QQVJJU0NfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01QQVJJU0NfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvYml0b3BzLmgKaW5kZXggOTI4ZTVlZi4uYWY3ZGI2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9iaXRvcHMuaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX1BBUklTQ19CSVRPUFNfSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jYWNoZWZsdXNoLmgKaW5kZXggMDY3MzI3MS4uYWE1OTJkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvY2FjaGVmbHVzaC5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4JLyogZm9yIGZsdXNoX3VzZXJfZGNhY2hlX3JhbmdlX2FzbSgpIHByb3RvICovCiAKIC8qIFRoZSB1c3VhbCBjb21tZW50IGlzICJDYWNoZXMgYXJlbid0IGJyYWluLWRlYWQgb24gdGhlIDxhcmNoaXRlY3R1cmU+Ii4KICAqIFVuZm9ydHVuYXRlbHksIHRoYXQgZG9lc24ndCBhcHBseSB0byBQQS1SSVNDLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCmluZGV4IDc2MzBkMWEuLjM4YjkxOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKQEAgLTEzLDggKzEzLDEwIEBACiB0eXBlZGVmIHMzMgljb21wYXRfdGltZV90OwogdHlwZWRlZiBzMzIJY29tcGF0X2Nsb2NrX3Q7CiB0eXBlZGVmIHMzMgljb21wYXRfcGlkX3Q7Ci10eXBlZGVmIHUzMgljb21wYXRfdWlkX3Q7Ci10eXBlZGVmIHUzMgljb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMglfX2NvbXBhdF91aWRfdDsKK3R5cGVkZWYgdTMyCV9fY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCV9fY29tcGF0X2dpZDMyX3Q7CiB0eXBlZGVmIHUxNgljb21wYXRfbW9kZV90OwogdHlwZWRlZiB1MzIJY29tcGF0X2lub190OwogdHlwZWRlZiB1MzIJY29tcGF0X2Rldl90OwpAQCAtNjcsOCArNjksOCBAQAogCWNvbXBhdF9kZXZfdAkJc3RfcmVhbGRldjsKIAl1MTYJCQlzdF9iYXNlbW9kZTsKIAl1MTYJCQlzdF9zcGFyZXNob3J0OwotCWNvbXBhdF91aWRfdAkJc3RfdWlkOwotCWNvbXBhdF9naWRfdAkJc3RfZ2lkOworCV9fY29tcGF0X3VpZDMyX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZDMyX3QJc3RfZ2lkOwogCXUzMgkJCXN0X3NwYXJlNFszXTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKaW5kZXggZGVmMzUyMy4uMzE3ODUxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKQEAgLTMsMzggKzMsMjIgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkwMDAwMDAwMwotI2RlZmluZSBPX1JET05MWQkwMDAwMDAwMAotI2RlZmluZSBPX1dST05MWQkwMDAwMDAwMQotI2RlZmluZSBPX1JEV1IJCTAwMDAwMDAyCiAjZGVmaW5lIE9fQVBQRU5ECTAwMDAwMDEwCiAjZGVmaW5lIE9fQkxLU0VFSwkwMDAwMDEwMCAvKiBIUFVYIG9ubHkgKi8KICNkZWZpbmUgT19DUkVBVAkJMDAwMDA0MDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fVFJVTkMJCTAwMDAxMDAwIC8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0VYQ0wJCTAwMDAyMDAwIC8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0xBUkdFRklMRQkwMDAwNDAwMAogI2RlZmluZSBPX1NZTkMJCTAwMTAwMDAwCiAjZGVmaW5lIE9fTk9OQkxPQ0sJMDAyMDAwMDQgLyogSFBVWCBoYXMgc2VwYXJhdGUgTkRFTEFZICYgTk9OQkxPQ0sgKi8KLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwogI2RlZmluZSBPX05PQ1RUWQkwMDQwMDAwMCAvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19EU1lOQwkJMDEwMDAwMDAgLyogSFBVWCBvbmx5ICovCiAjZGVmaW5lIE9fUlNZTkMJCTAyMDAwMDAwIC8qIEhQVVggb25seSAqLwogI2RlZmluZSBPX05PQVRJTUUJMDQwMDAwMDAKIAotI2RlZmluZSBGQVNZTkMJCTAwMDIwMDAwIC8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJMDAwNDAwMDAgLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCAqLwogI2RlZmluZSBPX0RJUkVDVE9SWQkwMDAxMDAwMCAvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cJMDAwMDAyMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fSU5WSVNJQkxFCTA0MDAwMDAwIC8qIGludmlzaWJsZSBJL08sIGZvciBETUFQSS9YRFNNICovCiAKLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgZl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldCBmX2ZsYWdzICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogbW9yZSBmbGFncyAoY2xvZXhlYykgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwogI2RlZmluZSBGX0dFVExLNjQJOAogI2RlZmluZSBGX1NFVExLNjQJOQogI2RlZmluZSBGX1NFVExLVzY0CTEwCkBAIC00NCw0OSArMjgsMTEgQEAKICNkZWZpbmUgRl9TRVRTSUcJMTMJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVFNJRwkxNAkvKiAgZm9yIHNvY2tldHMuICovCiAKLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQogLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KICNkZWZpbmUgRl9SRExDSwkJMDEKICNkZWZpbmUgRl9XUkxDSwkJMDIKICNkZWZpbmUgRl9VTkxDSwkJMDMKIAotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UgIDEwMjQKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZmQxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oZHJlZy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2lycS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2lycS5oCmluZGV4IDc1NjU0YmEuLmY4NzZiZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvaXJxLmgKQEAgLTI2LDYgKzI2LDExIEBACiAKICNkZWZpbmUgTlJfSVJRUwkJKENQVV9JUlFfTUFYICsgMSkKIAorLyoKKyAqIElSUSBsaW5lIHN0YXR1cyBtYWNybyBJUlFfUEVSX0NQVSBpcyB1c2VkCisgKi8KKyNkZWZpbmUgQVJDSF9IQVNfSVJRX1BFUl9DUFUKKwogc3RhdGljIF9faW5saW5lX18gaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKIHsKIAlyZXR1cm4gKGlycSA9PSAyKSA/IDkgOiBpcnE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKaW5kZXggOThkNzlhMy4uZDBiNzYxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaApAQCAtMjU3LDYgKzI1NywxOSBAQAogcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICoKK3BjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7CisKKwlyZXR1cm4gcm9vdDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfYWRkX3BsYXRmb3JtX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wcm9jZXNzb3IuaAppbmRleCAwYjYxZjUxLi5hOWRmYWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3Byb2Nlc3Nvci5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NwaW5sb2NrLmgKaW5kZXggNjc5ZWExYy4uNDNlYWE2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NwaW5sb2NrLmgKQEAgLTIsMzAgKzIsMjUgQEAKICNkZWZpbmUgX19BU01fU1BJTkxPQ0tfSAogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc3BpbmxvY2tfdHlwZXMuaD4KIAogLyogTm90ZSB0aGF0IFBBLVJJU0MgaGFzIHRvIHVzZSBgMScgdG8gbWVhbiB1bmxvY2tlZCBhbmQgYDAnIHRvIG1lYW4gbG9ja2VkCiAgKiBzaW5jZSBpdCBvbmx5IGhhcyBsb2FkLWFuZC16ZXJvLiBNb3Jlb3ZlciwgYXQgbGVhc3Qgb24gc29tZSBQQSBwcm9jZXNzb3JzLAogICogdGhlIHNlbWFwaG9yZSBhZGRyZXNzIGhhcyB0byBiZSAxNi1ieXRlIGFsaWduZWQuCiAgKi8KIAotI2lmbmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQotI2RlZmluZSBfX1NQSU5fTE9DS19VTkxPQ0tFRAl7IHsgMSwgMSwgMSwgMSB9IH0KLSN1bmRlZiBTUElOX0xPQ0tfVU5MT0NLRUQKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSBfX1NQSU5fTE9DS19VTkxPQ0tFRAotCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi1zdGF0aWMgaW5saW5lIGludCBzcGluX2lzX2xvY2tlZChzcGlubG9ja190ICp4KQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl9pc19sb2NrZWQocmF3X3NwaW5sb2NrX3QgKngpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gX19sZGN3X2FsaWduKHgpOwogCXJldHVybiAqYSA9PSAwOwogfQogCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUoc3Bpbl9pc19sb2NrZWQoeCkpCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKKwkJZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICp4KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqeCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmE7CiAKQEAgLTM2LDcgKzMxLDcgQEAKIAltYigpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICp4KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICp4KQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYTsKIAltYigpOwpAQCAtNDUsNyArNDAsNyBAQAogCW1iKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKngpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKngpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphOwogCWludCByZXQ7CkBAIC01NywxMzEgKzUyLDM4IEBACiAKIAlyZXR1cm4gcmV0OwogfQotCQotI2RlZmluZSBzcGluX2xvY2tfb3duKExPQ0ssIExPQ0FUSU9OKQkoKHZvaWQpMCkKLQotI2Vsc2UgLyogIShDT05GSUdfREVCVUdfU1BJTkxPQ0spICovCi0KLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUMJMHgxRDI0NEIzQwotCi0jZGVmaW5lIF9fU1BJTl9MT0NLX1VOTE9DS0VECXsgeyAxLCAxLCAxLCAxIH0sIFNQSU5MT0NLX01BR0lDLCAxMCwgX19GSUxFX18gLCBOVUxMLCAwLCAtMSwgTlVMTCwgTlVMTCB9Ci0jdW5kZWYgU1BJTl9MT0NLX1VOTE9DS0VECi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAoc3BpbmxvY2tfdCkgX19TUElOX0xPQ0tfVU5MT0NLRUQKLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotI2RlZmluZSBDSEVDS19MT0NLKHgpCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JIAlpZiAodW5saWtlbHkoKHgpLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQykpIHsJCQlcCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBzcGluX2lzX2xvY2tlZCIJCVwKLQkJCSIgb24gdW5pbml0aWFsaXplZCBzcGlubG9jayAlcC5cbiIsCQlcCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCAoeCkpOyAJCVwKLQkJfSAJCQkJCQkJXAotCX0gd2hpbGUoMCkKLQotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCSAJQ0hFQ0tfTE9DSyh4KTsJCQkJCQlcCi0JCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9IF9fbGRjd19hbGlnbih4KTsJCVwKLQkJaWYgKHVubGlrZWx5KCgqYSA9PSAwKSAmJiAoeCktPmJhYmJsZSkpIHsJCQkJXAotCQkJKHgpLT5iYWJibGUtLTsJCQkJCVwKLQkJCXByaW50aygiS0VSTl9XQVJOSU5HCQkJCVwKLQkJCQklczolZDogc3Bpbl9pc19sb2NrZWQoJXMvJXApIGFscmVhZHkiCVwKLQkJCQkiIGxvY2tlZCBieSAlczolZCBpbiAlcyBhdCAlcCglZClcbiIsCVwKLQkJCQlfX0ZJTEVfXyxfX0xJTkVfXywgKHgpLT5tb2R1bGUsCSh4KSwJXAotCQkJCSh4KS0+YmZpbGUsICh4KS0+YmxpbmUsICh4KS0+dGFzay0+Y29tbSxcCi0JCQkJKHgpLT5wcmV2aW91cywgKHgpLT5vbmNwdSk7CQlcCi0JCX0JCQkJCQkJXAotCQkqYSA9PSAwOwkJCQkJCVwKLQl9KQotCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCSAJQ0hFQ0tfTE9DSyh4KTsJCQkJCQlcCi0JCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9IF9fbGRjd19hbGlnbih4KTsJCVwKLQkJaWYgKHVubGlrZWx5KCgqYSA9PSAwKSAmJiAoeCktPmJhYmJsZSkpIHsJCQkJXAotCQkJKHgpLT5iYWJibGUtLTsJCQkJCVwKLQkJCXByaW50aygiS0VSTl9XQVJOSU5HCQkJCVwKLQkJCQklczolZDogc3Bpbl91bmxvY2tfd2FpdCglcy8lcCkiCQlcCi0JCQkJIiBvd25lZCBieSAlczolZCBpbiAlcyBhdCAlcCglZClcbiIsCVwKLQkJCQlfX0ZJTEVfXyxfX0xJTkVfXywgKHgpLT5tb2R1bGUsICh4KSwJXAotCQkJCSh4KS0+YmZpbGUsICh4KS0+YmxpbmUsICh4KS0+dGFzay0+Y29tbSxcCi0JCQkJKHgpLT5wcmV2aW91cywgKHgpLT5vbmNwdSk7CQlcCi0JCX0JCQkJCQkJXAotCQliYXJyaWVyKCk7CQkJCQkJXAotCX0gd2hpbGUgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoX19sZGN3X2FsaWduKHgpKSkgPT0gMCkKLQotZXh0ZXJuIHZvaWQgX2RiZ19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqYmFzZV9maWxlLCBpbnQgbGluZV9ubyk7Ci1leHRlcm4gdm9pZCBfZGJnX3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQgX2RiZ19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqIGxvY2ssIGNvbnN0IGNoYXIgKiwgaW50KTsKLQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKLQotI2RlZmluZSBfcmF3X3NwaW5fdW5sb2NrKGxvY2spCV9kYmdfc3Bpbl91bmxvY2sobG9jaywgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBfcmF3X3NwaW5fbG9jayhsb2NrKSBfZGJnX3NwaW5fbG9jayhsb2NrLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIF9yYXdfc3Bpbl90cnlsb2NrKGxvY2spIF9kYmdfc3Bpbl90cnlsb2NrKGxvY2ssIF9fRklMRV9fLCBfX0xJTkVfXykKLQotLyoganVzdCBpbiBjYXNlIHdlIG5lZWQgaXQgKi8KLSNkZWZpbmUgc3Bpbl9sb2NrX293bihMT0NLLCBMT0NBVElPTikJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gX19sZGN3X2FsaWduKExPQ0spOwkJCVwKLQlpZiAoISgoKmEgPT0gMCkgJiYgKChMT0NLKS0+b25jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkpCVwKLQkJcHJpbnRrKCJLRVJOX1dBUk5JTkcJCQkJCVwKLQkJCSVzOiBjYWxsZWQgb24gJWQgZnJvbSAlcCBidXQgbG9jayAlcyBvbiAlZFxuIiwJXAotCQkJTE9DQVRJT04sIHNtcF9wcm9jZXNzb3JfaWQoKSwJCQlcCi0JCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksCQkJXAotCQkJKCphID09IDApID8gInRha2VuIiA6ICJmcmVlZCIsIChMT0NLKS0+b25fY3B1KTsJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qICEoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSAqLwogCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKICAqIGJ1dCBvbmx5IG9uZSB3cml0ZXIuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlzcGlubG9ja190IGxvY2s7Ci0Jdm9sYXRpbGUgaW50IGNvdW50ZXI7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKIAotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyBfX1NQSU5fTE9DS19VTkxPQ0tFRCwgMCB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQobHApCWRvIHsgKihscCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQogCiAvKiByZWFkX2xvY2ssIHJlYWRfdW5sb2NrIGFyZSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiAgT2YgY291cnNlIGl0IHNvbWVob3cKICAqIHN1Y2tzIHdlIGVuZCB1cCBzYXZpbmcvcmVzdG9yaW5nIGZsYWdzIHR3aWNlIGZvciByZWFkX2xvY2tfaXJxc2F2ZSBhc28uICovCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUldMT0NLCi1leHRlcm4gdm9pZCBfZGJnX3JlYWRfbG9jayhyd2xvY2tfdCAqIHJ3LCBjb25zdCBjaGFyICpiZmlsZSwgaW50IGJsaW5lKTsKLSNkZWZpbmUgX3Jhd19yZWFkX2xvY2socncpIF9kYmdfcmVhZF9sb2NrKHJ3LCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZWxzZQotc3RhdGljICBfX2lubGluZV9fIHZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljICBfX2lubGluZV9fIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsgCisJX19yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CiAKIAlydy0+Y291bnRlcisrOwogCi0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQotI2VuZGlmCS8qIENPTkZJR19ERUJVR19SV0xPQ0sgKi8KIAotc3RhdGljICBfX2lubGluZV9fIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgIF9faW5saW5lX18gdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7IAorCV9fcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwogCiAJcnctPmNvdW50ZXItLTsKIAotCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKKwlfX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIApAQCAtMTk0LDIwICs5NiwxNyBAQAogICogd3JpdGVycykgaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvbWVvbmUgZnVja2VkIHVwIGFuZCB3ZSdkIGRlYWQtbG9jawogICogc29vbmVyIG9yIGxhdGVyIGFueXdheS4gICBwcnVtcGYgKi8KIAotI2lmZGVmIENPTkZJR19ERUJVR19SV0xPQ0sKLWV4dGVybiB2b2lkIF9kYmdfd3JpdGVfbG9jayhyd2xvY2tfdCAqIHJ3LCBjb25zdCBjaGFyICpiZmlsZSwgaW50IGJsaW5lKTsKLSNkZWZpbmUgX3Jhd193cml0ZV9sb2NrKHJ3KSBfZGJnX3dyaXRlX2xvY2socncsIF9fRklMRV9fLCBfX0xJTkVfXykKLSNlbHNlCi1zdGF0aWMgIF9faW5saW5lX18gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljICBfX2lubGluZV9fIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogcmV0cnk6Ci0JX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKKwlfX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKIAogCWlmKHJ3LT5jb3VudGVyICE9IDApIHsKIAkJLyogdGhpcyBiYXNpY2FsbHkgbmV2ZXIgaGFwcGVucyAqLwotCQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CisJCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiAKLQkJd2hpbGUocnctPmNvdW50ZXIgIT0gMCk7CisJCXdoaWxlIChydy0+Y291bnRlciAhPSAwKQorCQkJY3B1X3JlbGF4KCk7CiAKIAkJZ290byByZXRyeTsKIAl9CkBAIC0yMTUsMjYgKzExNCwyMSBAQAogCS8qIGdvdCBpdC4gIG5vdyBsZWF2ZSB3aXRob3V0IHVubG9ja2luZyAqLwogCXJ3LT5jb3VudGVyID0gLTE7IC8qIHJlbWVtYmVyIHdlIGFyZSBsb2NrZWQgKi8KIH0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfUldMT0NLICovCiAKIC8qIHdyaXRlX3VubG9jayBpcyBhYnNvbHV0ZWx5IHRyaXZpYWwgLSB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGFueXRoaW5nICovCiAKLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXJ3LT5jb3VudGVyID0gMDsKLQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKIH0KIAotI2lmZGVmIENPTkZJR19ERUJVR19SV0xPQ0sKLWV4dGVybiBpbnQgX2RiZ193cml0ZV90cnlsb2NrKHJ3bG9ja190ICogcncsIGNvbnN0IGNoYXIgKmJmaWxlLCBpbnQgYmxpbmUpOwotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2socncpIF9kYmdfd3JpdGVfdHJ5bG9jayhydywgX19GSUxFX18sIF9fTElORV9fKQotI2Vsc2UKLXN0YXRpYyAgX19pbmxpbmVfXyBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyAgX19pbmxpbmVfXyBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7CiAJaWYgKHJ3LT5jb3VudGVyICE9IDApIHsKIAkJLyogdGhpcyBiYXNpY2FsbHkgbmV2ZXIgaGFwcGVucyAqLwotCQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CisJCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiAKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjQzLDE0ICsxMzcsMTMgQEAKIAlydy0+Y291bnRlciA9IC0xOyAvKiByZW1lbWJlciB3ZSBhcmUgbG9ja2VkICovCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1JXTE9DSyAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaXNfcmVhZF9sb2NrZWQocndsb2NrX3QgKnJ3KQorc3RhdGljIF9faW5saW5lX18gaW50IF9fcmF3X2lzX3JlYWRfbG9ja2VkKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJcmV0dXJuIHJ3LT5jb3VudGVyID4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGlzX3dyaXRlX2xvY2tlZChyd2xvY2tfdCAqcncpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19yYXdfaXNfd3JpdGVfbG9ja2VkKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJcmV0dXJuIHJ3LT5jb3VudGVyIDwgMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1YmJhOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfX0FTTV9TUElOTE9DS19UWVBFU19ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrWzRdOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyB7IDEsIDEsIDEsIDEgfSB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwlyYXdfc3BpbmxvY2tfdCBsb2NrOworCXZvbGF0aWxlIGludCBjb3VudGVyOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQsIDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zeXN0ZW0uaAppbmRleCA4MWM1NDMzLi4yNmZmODQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3N5c3RlbS5oCkBAIC0xNjAsMjkgKzE2MCw3IEBACiB9KQogCiAjaWZkZWYgQ09ORklHX1NNUAotLyoKLSAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2tbNF07Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0JdW5zaWduZWQgbG9uZyBtYWdpYzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYmFiYmxlOwotCWNvbnN0IGNoYXIgKm1vZHVsZTsKLQljaGFyICpiZmlsZTsKLQlpbnQgYmxpbmU7Ci0JaW50IG9uY3B1OwotCXZvaWQgKnByZXZpb3VzOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHRhc2s7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7Ci0KLSNkZWZpbmUgX19sb2NrX2FsaWduZWQgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmxvY2tfYWxpZ25lZCIpKSkKLQorIyBkZWZpbmUgX19sb2NrX2FsaWduZWQgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmxvY2tfYWxpZ25lZCIpKSkKICNlbmRpZgogCiAjZGVmaW5lIEtFUk5FTF9TVEFSVCAoMHgxMDEwMDAwMCAtIDB4MTAwMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvdWFjY2Vzcy5oCmluZGV4IGMxYjViZGUuLmY2YzQxN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3VhY2Nlc3MuaApAQCAtNDAsMTAgKzQwLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotI2RlZmluZSB2ZXJpZnlfYXJlYSh0eXBlLGFkZHIsc2l6ZSkgKDApCS8qIEZJWE1FOiBhbGwgdXNlcnMgc2hvdWxkIGdvIGF3YXkgc29vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgdXNlIGFjY2Vzc19vayBpbnN0ZWFkLCB0aGVuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaG91bGQgYmUgcmVtb3ZlZC4gKi8KLQogI2RlZmluZSBwdXRfdXNlciBfX3B1dF91c2VyCiAjZGVmaW5lIGdldF91c2VyIF9fZ2V0X3VzZXIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy84MjUzcGl0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjLzgyNTNwaXQuaAppbmRleCA4NjI3MDhhLi5iNzBkNmU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjLzgyNTNwaXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjLzgyNTNwaXQuaApAQCAtMSwxMCArMSwxMCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfODI1M1BJVF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ184MjUzUElUX0gKKwogLyoKICAqIDgyNTMvODI1NCBQcm9ncmFtbWFibGUgSW50ZXJ2YWwgVGltZXIKICAqLwogCi0jaWZuZGVmIF84MjUzUElUX0gKLSNkZWZpbmUgXzgyNTNQSVRfSAotCiAjZGVmaW5lIFBJVF9USUNLX1JBVEUJMTE5MzE4MlVMCiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ184MjUzUElUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYWdwLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2FncC5oCmluZGV4IGNhOWU0MjMuLjg4NWI0NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYWdwLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hZ3AuaApAQCAtMSwxMCArMSw4IEBACi0jaWZuZGVmIEFHUF9ICi0jZGVmaW5lIEFHUF9IIDEKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0FHUF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19BR1BfSAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLS8qIG5vdGhpbmcgbXVjaCBuZWVkZWQgaGVyZSAqLwotCiAjZGVmaW5lIG1hcF9wYWdlX2ludG9fYWdwKHBhZ2UpCiAjZGVmaW5lIHVubWFwX3BhZ2VfZnJvbV9hZ3AocGFnZSkKICNkZWZpbmUgZmx1c2hfYWdwX21hcHBpbmdzKCkKQEAgLTIwLDQgKzE4LDQgQEAKICNkZWZpbmUgZnJlZV9nYXR0X3BhZ2VzKHRhYmxlLCBvcmRlcikJXAogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpKHRhYmxlKSwgKG9yZGVyKSkKIAotI2VuZGlmCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX0FHUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Z3MuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYnVncy5oCmluZGV4IDMxMDE4N2QuLjQyZmRiNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYnVncy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYnVncy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUE9XRVJQQ19CVUdTX0gKLSNkZWZpbmUgX1BPV0VSUENfQlVHU19ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19CVUdTX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0JVR1NfSAogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTMsNiArMTMsNiBAQAogICogYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBidWdzLgogICovCiAKLWV4dGVybiB2b2lkIGNoZWNrX2J1Z3Modm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfYnVncyh2b2lkKSB7IH0KIAotI2VuZGlmIC8qIF9QT1dFUlBDX0JVR1NfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19CVUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZXJybm8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZXJybm8uaAppbmRleCAxOWYyMGJkLi44YzE0NWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Vycm5vLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lcnJuby5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUFBDX0VSUk5PX0gKLSNkZWZpbmUgX1BQQ19FUlJOT19ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19FUlJOT19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19FUlJOT19ICiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgogCkBAIC04LDQgKzgsNCBAQAogCiAjZGVmaW5lIF9MQVNUX0VSUk5PCTUxNgogCi0jZW5kaWYKKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfRVJSTk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mY250bC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWM0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZjbnRsLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfQVNNX0ZDTlRMX0gKKyNkZWZpbmUgX0FTTV9GQ05UTF9ICisKKyNkZWZpbmUgT19ESVJFQ1RPUlkgICAgICAwNDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBPX05PRk9MTE9XICAgICAgMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KKyNkZWZpbmUgT19MQVJHRUZJTEUgICAgIDAyMDAwMDAKKyNkZWZpbmUgT19ESVJFQ1QJMDQwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KKworI2VuZGlmIC8qIF9BU01fRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb2N0bC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pb2N0bC5oCmluZGV4IDkzYzZhY2YuLjhlYjk5ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvY3RsLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9QUENfSU9DVExfSAotI2RlZmluZSBfUFBDX0lPQ1RMX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0lPQ1RMX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0lPQ1RMX0gKIAogCiAvKgpAQCAtNjYsNCArNjYsNCBAQAogI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCiAjZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQogCi0jZW5kaWYKKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfSU9DVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9jdGxzLmgKaW5kZXggZjViN2YyYi4uNWI5NGZmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvY3Rscy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1BQQ19JT0NUTFNfSAotI2RlZmluZSBfQVNNX1BQQ19JT0NUTFNfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfSU9DVExTX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0lPQ1RMU19ICiAKICNpbmNsdWRlIDxhc20vaW9jdGwuaD4KIApAQCAtMTA0LDQgKzEwNCw0IEBACiAjZGVmaW5lIFRJT0NNSVdBSVQJMHg1NDVDCS8qIHdhaXQgZm9yIGEgY2hhbmdlIG9uIHNlcmlhbCBpbnB1dCBsaW5lKHMpICovCiAjZGVmaW5lIFRJT0NHSUNPVU5UCTB4NTQ1RAkvKiByZWFkIHNlcmlhbCBwb3J0IGlubGluZSBpbnRlcnJ1cHQgY291bnRzICovCiAKLSNlbmRpZiAvKiBfQVNNX1BQQ19JT0NUTFNfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19JT0NUTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9saW5rYWdlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xpbmthZ2UuaAppbmRleCAyOTFjMmQwLi5lMWM0YWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2xpbmthZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xpbmthZ2UuaApAQCAtMSw2ICsxLDYgQEAKLSNpZm5kZWYgX19BU01fTElOS0FHRV9ICi0jZGVmaW5lIF9fQVNNX0xJTktBR0VfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTElOS0FHRV9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19MSU5LQUdFX0gKIAogLyogTm90aGluZyB0byBzZWUgaGVyZS4uLiAqLwogCi0jZW5kaWYKKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfTElOS0FHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21jMTQ2ODE4cnRjLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21jMTQ2ODE4cnRjLmgKaW5kZXggYTU2MTlhMi4uZjI3NDFjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYzE0NjgxOHJ0Yy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWMxNDY4MThydGMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfTUMxNDY4MThSVENfSAotI2RlZmluZSBfUE9XRVJQQ19NQzE0NjgxOFJUQ19ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19NQzE0NjgxOFJUQ19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19NQzE0NjgxOFJUQ19ICiAKIC8qCiAgKiBNYWNoaW5lIGRlcGVuZGVudCBhY2Nlc3MgZnVuY3Rpb25zIGZvciBSVEMgcmVnaXN0ZXJzLgpAQCAtMzMsNCArMzMsNCBAQAogfSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZgkvKiBfUE9XRVJQQ19NQzE0NjgxOFJUQ19IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX01DMTQ2ODE4UlRDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW1hbi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbWFuLmgKaW5kZXggZjJkNTU5OC4uZjVlNTM0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbWFuLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbWFuLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9QT1dFUlBDX01NQU5fSAotI2RlZmluZSBfUE9XRVJQQ19NTUFOX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX01NQU5fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTU1BTl9ICiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC00OSw0ICs0OSw0IEBACiAjZGVmaW5lIE1BUF9BTk9OCU1BUF9BTk9OWU1PVVMKICNkZWZpbmUgTUFQX0ZJTEUJMAogCi0jZW5kaWYgLyogX1BPV0VSUENfTU1BTl9IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW9kdWxlLmgKaW5kZXggNDQzOGY0Zi4uN2VjZDA1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21vZHVsZS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUE9XRVJQQ19NT0RVTEVfSAotI2RlZmluZSBfUE9XRVJQQ19NT0RVTEVfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU9EVUxFX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX01PRFVMRV9ICiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC03NCw0ICs3NCw0IEBACiB2b2lkIHNvcnRfZXhfdGFibGUoc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqc3RhcnQsCiAJCSAgIHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpbmlzaCk7CiAKLSNlbmRpZiAvKiBfUE9XRVJQQ19NT0RVTEVfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21zZ2J1Zi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tc2didWYuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGMvbXNnYnVmLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXBvd2VycGMvbXNnYnVmLmgKaW5kZXggMTA1MzQ1Mi4uZGQ3Njc0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21zZ2J1Zi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXNnYnVmLmgKQEAgLTEsMTcgKzEsMjUgQEAKLSNpZm5kZWYgX1BQQ19NU0dCVUZfSAotI2RlZmluZSBfUFBDX01TR0JVRl9ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19NU0dCVUZfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTVNHQlVGX0gKIAogLyoKLSAqIFRoZSBtc3FpZDY0X2RzIHN0cnVjdHVyZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCisgKiBUaGUgbXNxaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCiAgKi8KIAogc3RydWN0IG1zcWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtIG1zZ19wZXJtOworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCiAJdW5zaWduZWQgaW50CV9fdW51c2VkMTsKKyNlbmRpZgogCV9fa2VybmVsX3RpbWVfdCBtc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KKyNpZm5kZWYgX19wb3dlcnBjNjRfXwogCXVuc2lnbmVkIGludAlfX3VudXNlZDI7CisjZW5kaWYKIAlfX2tlcm5lbF90aW1lX3QgbXNnX3J0aW1lOwkvKiBsYXN0IG1zZ3JjdiB0aW1lICovCisjaWZuZGVmIF9fcG93ZXJwYzY0X18KIAl1bnNpZ25lZCBpbnQJX191bnVzZWQzOworI2VuZGlmCiAJX19rZXJuZWxfdGltZV90IG1zZ19jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLwogCXVuc2lnbmVkIGxvbmcgIG1zZ19jYnl0ZXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCiAJdW5zaWduZWQgbG9uZyAgbXNnX3FudW07CS8qIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZSAqLwpAQCAtMjIsNCArMzAsNCBAQAogCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKIH07CiAKLSNlbmRpZiAvKiBfUFBDX01TR0JVRl9IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX01TR0JVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL25hbWVpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL25hbWVpLmgKaW5kZXggMjljOWVjOC4uNjU3NDQzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9uYW1laS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbmFtZWkuaApAQCAtMSwxNCArMSwxNCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTkFNRUlfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfTkFNRUlfSAorCisjaWZkZWYgX19LRVJORUxfXworCiAvKgotICogaW5jbHVkZS9hc20tcHBjL25hbWVpLmgKICAqIEFkYXB0ZWQgZnJvbSBpbmNsdWRlL2FzbS1hbHBoYS9uYW1laS5oCiAgKgogICogSW5jbHVkZWQgZnJvbSBmcy9uYW1laS5jCiAgKi8KIAotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19QUENfTkFNRUlfSAotI2RlZmluZSBfX1BQQ19OQU1FSV9ICi0KIC8qIFRoaXMgZHVtbXkgcm91dGluZSBtYXliZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyB1c2VmdWwKICAqIGZvciAvdXNyL2duZW11bC8gZW11bGF0aW9uIHN0dWZmLgogICogTG9vayBhdCBhc20tc3BhcmMvbmFtZWkuaCBmb3IgZGV0YWlscy4KQEAgLTE2LDUgKzE2LDUgQEAKIAogI2RlZmluZSBfX2VtdWxfcHJlZml4KCkgTlVMTAogCi0jZW5kaWYgLyogX19QUENfTkFNRUlfSCAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX05BTUVJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wYXJhbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJhbS5oCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXBwYy9wYXJhbS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1wb3dlcnBjL3BhcmFtLmgKaW5kZXggNjE5OGIxNi4uYmRjNzI0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJhbS5oCkBAIC0xLDEwICsxLDEwIEBACi0jaWZuZGVmIF9BU01fUFBDX1BBUkFNX0gKLSNkZWZpbmUgX0FTTV9QUENfUEFSQU1fSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfUEFSQU1fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfUEFSQU1fSAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5ICovCisjZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogaW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLwogI2RlZmluZSBVU0VSX0haCQkxMDAJCS8qIGZvciB1c2VyIGludGVyZmFjZXMgaW4gInRpY2tzIiAqLwogI2RlZmluZSBDTE9DS1NfUEVSX1NFQwkoVVNFUl9IWikJLyogZnJlcXVlbmN5IGF0IHdoaWNoIHRpbWVzKCkgY291bnRzICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpAQCAtMjEsNCArMjEsNCBAQAogCiAjZGVmaW5lIE1BWEhPU1ROQU1FTEVOCTY0CS8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgKi8KIAotI2VuZGlmCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcG9sbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wb2xsLmgKaW5kZXggYmU1MDI0OS4uZWRkMjA1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wb2xsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wb2xsLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fUFBDX1BPTExfSAotI2RlZmluZSBfX1BQQ19QT0xMX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1BPTExfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfUE9MTF9ICiAKICNkZWZpbmUgUE9MTElOCQkweDAwMDEKICNkZWZpbmUgUE9MTFBSSQkJMHgwMDAyCkBAIC0yMCw0ICsyMCw0IEBACiAJc2hvcnQgcmV2ZW50czsKIH07CiAKLSNlbmRpZgorI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VtYnVmLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NlbWJ1Zi5oCmluZGV4IGM5OGZjMTguLjk5YTQxOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VtYnVmLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZW1idWYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfU0VNQlVGX0gKLSNkZWZpbmUgX1BPV0VSUENfU0VNQlVGX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NFTUJVRl9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TRU1CVUZfSAogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMzMsNCArMzMsNCBAQAogCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OwogfTsKIAotI2VuZGlmIC8qIF9QT1dFUlBDX1NFTUJVRl9IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NFTUJVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NldHVwLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NldHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5NzQwYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2V0dXAuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NFVFVQX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1NFVFVQX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRQk1MTIKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1idWYuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2htYnVmLmgKaW5kZXggMjk2MzJkYi4uOGVmYTM5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1idWYuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NobWJ1Zi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUE9XRVJQQ19TSE1CVUZfSAotI2RlZmluZSBfUE9XRVJQQ19TSE1CVUZfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfU0hNQlVGX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1NITUJVRl9ICiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yMSwxOSArMjEsMTkgQEAKIAogc3RydWN0IHNobWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtCXNobV9wZXJtOwkvKiBvcGVyYXRpb24gcGVybXMgKi8KLSNpZm5kZWYgX19wb3dlcjY0X18KKyNpZm5kZWYgX19wb3dlcnBjNjRfXwogCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKICNlbmRpZgogCV9fa2VybmVsX3RpbWVfdAkJc2htX2F0aW1lOwkvKiBsYXN0IGF0dGFjaCB0aW1lICovCi0jaWZuZGVmIF9fcG93ZXI2NF9fCisjaWZuZGVmIF9fcG93ZXJwYzY0X18KIAl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7CiAjZW5kaWYKIAlfX2tlcm5lbF90aW1lX3QJCXNobV9kdGltZTsJLyogbGFzdCBkZXRhY2ggdGltZSAqLwotI2lmbmRlZiBfX3Bvd2VyNjRfXworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCiAJdW5zaWduZWQgbG9uZwkJX191bnVzZWQzOwogI2VuZGlmCiAJX19rZXJuZWxfdGltZV90CQlzaG1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KLSNpZm5kZWYgX19wb3dlcjY0X18KKyNpZm5kZWYgX19wb3dlcnBjNjRfXwogCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNDsKICNlbmRpZgogCXNpemVfdAkJCXNobV9zZWdzejsJLyogc2l6ZSBvZiBzZWdtZW50IChieXRlcykgKi8KQEAgLTU2LDQgKzU2LDQgQEAKIAl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKIH07CiAKLSNlbmRpZiAvKiBfUE9XRVJQQ19TSE1CVUZfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TSE1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1wYXJhbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zaG1wYXJhbS5oCmluZGV4IGQ2MjUwNjAuLjVjZGE0MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2htcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NobXBhcmFtLmgKQEAgLTEsNiArMSw2IEBACi0jaWZuZGVmIF9QUENfU0hNUEFSQU1fSAotI2RlZmluZSBfUFBDX1NITVBBUkFNX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NITVBBUkFNX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1NITVBBUkFNX0gKIAogI2RlZmluZQlTSE1MQkEgUEFHRV9TSVpFCQkgLyogYXR0YWNoIGFkZHIgYSBtdWx0aXBsZSBvZiB0aGlzICovCiAKLSNlbmRpZiAvKiBfUFBDX1NITVBBUkFNX0ggKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU0hNUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaWdpbmZvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NpZ2luZm8uaAppbmRleCBhZTcwYjgwLi41MzhlYThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NpZ2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NpZ2luZm8uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfU0lHSU5GT19ICi0jZGVmaW5lIF9QT1dFUlBDX1NJR0lORk9fSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfU0lHSU5GT19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TSUdJTkZPX0gKIAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE1LDQgKzE1LDQgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KIAotI2VuZGlmIC8qIF9QT1dFUlBDX1NJR0lORk9fSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TSUdJTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tldC5oCmluZGV4IDUxYTBjZjUuLmU0YjgxNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NrZXQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfU09DS0VUX0gKLSNkZWZpbmUgX1BPV0VSUENfU09DS0VUX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NPQ0tFVF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TT0NLRVRfSAogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNTYsNCArNTYsNCBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAKLSNlbmRpZiAvKiBfUE9XRVJQQ19TT0NLRVRfSCAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tpb3MuaAppbmRleCBlZjdmZjY2Li41OTAwNzhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tpb3MuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfU09DS0lPU19ICi0jZGVmaW5lIF9QT1dFUlBDX1NPQ0tJT1NfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfU09DS0lPU19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TT0NLSU9TX0gKIAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE2LDQgKzE2LDQgQEAKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKICNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLwogCi0jZW5kaWYgLyogX1BPV0VSUENfU09DS0lPU19IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zdHJpbmcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3RyaW5nLmgKaW5kZXggMjI1NTc1OS4uODYwNmE2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N0cmluZy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUFBDX1NUUklOR19IXwotI2RlZmluZSBfUFBDX1NUUklOR19IXworI2lmbmRlZiBfQVNNX1BPV0VSUENfU1RSSU5HX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1NUUklOR19ICiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTI5LDQgKzI5LDQgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKaW5kZXggMmM1YmY4NS4uZWJmNjA1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfVEVSTUJJVFNfSAotI2RlZmluZSBfUE9XRVJQQ19URVJNQklUU19ICisjaWZuZGVmIF9BU01fUE9XRVJQQ19URVJNQklUU19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19URVJNQklUU19ICiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xODgsNCArMTg4LDQgQEAKICNkZWZpbmUJVENTQURSQUlOCTEKICNkZWZpbmUJVENTQUZMVVNICTIKIAotI2VuZGlmIC8qIF9QT1dFUlBDX1RFUk1CSVRTX0ggKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfVEVSTUJJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1pb3MuaAppbmRleCAyMzc1MzNiLi5jNWI4ZTUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1pb3MuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX1BPV0VSUENfVEVSTUlPU19ICi0jZGVmaW5lIF9QT1dFUlBDX1RFUk1JT1NfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfVEVSTUlPU19ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19URVJNSU9TX0gKIAogLyoKICAqIExpYmVyYWxseSBhZGFwdGVkIGZyb20gYWxwaGEvdGVybWlvcy5oLiAgSW4gcGFydGljdWxhciwgdGhlIGNfY2NbXQpAQCAtMjMzLDQgKzIzMyw0IEBACiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKLSNlbmRpZgkvKiBfUE9XRVJQQ19URVJNSU9TX0ggKi8KKyNlbmRpZgkvKiBfQVNNX1BPV0VSUENfVEVSTUlPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWV4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNWIzMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZXguaApAQCAtMCwwICsxLDQ5IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19USU1FWF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19USU1FWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBQb3dlclBDIGFyY2hpdGVjdHVyZSB0aW1leCBzcGVjaWZpY2F0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKworI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MCAvKiBVbmRlcmx5aW5nIEhaICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBjeWNsZXNfdDsKKworc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzKHZvaWQpCit7CisJY3ljbGVzX3QgcmV0OworCisjaWZkZWYgX19wb3dlcnBjNjRfXworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mdGIgJTAiIDogIj1yIiAocmV0KSA6ICk7CisKKyNlbHNlCisJLyoKKwkgKiBGb3IgdGhlICJjeWNsZSIgY291bnRlciB3ZSB1c2UgdGhlIHRpbWViYXNlIGxvd2VyIGhhbGYuCisJICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCisJICovCisKKwlyZXQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSI5ODoJbWZ0YiAlMFxuIgorCQkiOTk6XG4iCisJCSIuc2VjdGlvbiBfX2Z0cl9maXh1cCxcImFcIlxuIgorCQkiCS5sb25nICUxXG4iCisJCSIJLmxvbmcgMFxuIgorCQkiCS5sb25nIDk4YlxuIgorCQkiCS5sb25nIDk5YlxuIgorCQkiLnByZXZpb3VzIgorCQk6ICI9ciIgKHJldCkgOiAiaSIgKENQVV9GVFJfNjAxKSk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tcHBjNjQvdG9wb2xvZ3kuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCmluZGV4IDFlOWIxOTAuLjI1MTJlMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCkBAIC0xLDExICsxLDEyIEBACi0jaWZuZGVmIF9BU01fUFBDNjRfVE9QT0xPR1lfSAotI2RlZmluZSBfQVNNX1BQQzY0X1RPUE9MT0dZX0gKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1RPUE9MT0dZX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1RPUE9MT0dZX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KIAogI2lmZGVmIENPTkZJR19OVU1BCiAKKyNpbmNsdWRlIDxhc20vbW16b25lLmg+CisKIHN0YXRpYyBpbmxpbmUgaW50IGNwdV90b19ub2RlKGludCBjcHUpCiB7CiAJaW50IG5vZGU7CkBAIC02Niw0ICs2Nyw0IEBACiAKICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCi0jZW5kaWYgLyogX0FTTV9QUEM2NF9UT1BPTE9HWV9IICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuYWxpZ25lZC5oCmluZGV4IDQ1NTIwZDkuLjZjOTVkZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5hbGlnbmVkLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy91bmFsaWduZWQuaApAQCAtMSw2ICsxLDcgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1VOQUxJR05FRF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19VTkFMSUdORURfSAorCiAjaWZkZWYgX19LRVJORUxfXwotI2lmbmRlZiBfX1BQQ19VTkFMSUdORURfSAotI2RlZmluZSBfX1BQQ19VTkFMSUdORURfSAogCiAvKgogICogVGhlIFBvd2VyUEMgY2FuIGRvIHVuYWxpZ25lZCBhY2Nlc3NlcyBpdHNlbGYgaW4gYmlnIGVuZGlhbiBtb2RlLgpAQCAtMTQsNSArMTUsNSBAQAogCiAjZGVmaW5lIHB1dF91bmFsaWduZWQodmFsLCBwdHIpICgodm9pZCkoICoocHRyKSA9ICh2YWwpICkpCiAKLSNlbmRpZgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1VOQUxJR05FRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvdXNlci5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy91c2VyLmgKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tcHBjL3VzZXIuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tcG93ZXJwYy91c2VyLmgKaW5kZXggZDY2MmIyMS4uZTU5YWRlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VzZXIuaApAQCAtMSwxMyArMSwxNCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfVVNFUl9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19VU0VSX0gKKwogI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX1BQQ19VU0VSX0gKLSNkZWZpbmUgX1BQQ19VU0VSX0gKIAotLyogQWRhcHRlZCBmcm9tIDxhc20tYWxwaGEvdXNlci5oPiAqLwotCi0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qCisgKiBBZGFwdGVkIGZyb20gPGFzbS1hbHBoYS91c2VyLmg+CisgKgogICogQ29yZSBmaWxlIGZvcm1hdDogVGhlIGNvcmUgZmlsZSBpcyB3cml0dGVuIGluIHN1Y2ggYSB3YXkgdGhhdCBnZGIKICAqIGNhbiB1bmRlcnN0YW5kIGl0IGFuZCBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciAodW5kZXIKICAqIGxpbnV4IHdlIHVzZSB0aGUgYHRyYWQtY29yZScgYmZkLCBOT1QgdGhlIG9zZi1jb3JlKS4gIFRoZSBmaWxlIGNvbnRlbnRzCkBAIC01MCw1ICs1MSw1IEBACiAjZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSCSh1LnN0YXJ0X2RhdGEpCiAjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIJKHUuc3RhcnRfc3RhY2sgKyB1LnVfc3NpemUgKiBOQlBHKQogCi0jZW5kaWYgLyogX1BQQ19VU0VSX0ggKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXBwYy9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzIzNThkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjL2F1eHZlYy5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX19QUENfQVVYVkVDX0gKKyNkZWZpbmUgX19QUENfQVVYVkVDX0gKKworLyoKKyAqIFdlIG5lZWQgdG8gcHV0IGluIHNvbWUgZXh0cmEgYXV4IHRhYmxlIGVudHJpZXMgdG8gdGVsbCBnbGliYyB3aGF0CisgKiB0aGUgY2FjaGUgYmxvY2sgc2l6ZSBpcywgc28gaXQgY2FuIHVzZSB0aGUgZGNieiBpbnN0cnVjdGlvbiBzYWZlbHkuCisgKi8KKyNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJCTE5CisjZGVmaW5lIEFUX0lDQUNIRUJTSVpFCQkyMAorI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkJMjEKKy8qIEEgc3BlY2lhbCBpZ25vcmVkIHR5cGUgdmFsdWUgZm9yIFBQQywgZm9yIGdsaWJjIGNvbXBhdGliaWxpdHkuICAqLworI2RlZmluZSBBVF9JR05PUkVQUEMJCTIyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2VsZi5oIGIvaW5jbHVkZS9hc20tcHBjL2VsZi5oCmluZGV4IDJjMDU2OTYuLmMyNWNjMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZWxmLmgKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KIAogLyogUG93ZXJQQyByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCiAjZGVmaW5lIFJfUFBDX05PTkUJCTAKQEAgLTEyMiwxNiArMTIzLDYgQEAKIAogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCiAKLS8qCi0gKiBXZSBuZWVkIHRvIHB1dCBpbiBzb21lIGV4dHJhIGF1eCB0YWJsZSBlbnRyaWVzIHRvIHRlbGwgZ2xpYmMgd2hhdAotICogdGhlIGNhY2hlIGJsb2NrIHNpemUgaXMsIHNvIGl0IGNhbiB1c2UgdGhlIGRjYnogaW5zdHJ1Y3Rpb24gc2FmZWx5LgotICovCi0jZGVmaW5lIEFUX0RDQUNIRUJTSVpFCQkxOQotI2RlZmluZSBBVF9JQ0FDSEVCU0laRQkJMjAKLSNkZWZpbmUgQVRfVUNBQ0hFQlNJWkUJCTIxCi0vKiBBIHNwZWNpYWwgaWdub3JlZCB0eXBlIHZhbHVlIGZvciBQUEMsIGZvciBnbGliYyBjb21wYXRpYmlsaXR5LiAgKi8KLSNkZWZpbmUgQVRfSUdOT1JFUFBDCQkyMgotCiBleHRlcm4gaW50IGRjYWNoZV9ic2l6ZTsKIGV4dGVybiBpbnQgaWNhY2hlX2JzaXplOwogZXh0ZXJuIGludCB1Y2FjaGVfYnNpemU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXBwYy9mY250bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI4ZTQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYy9mY250bC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotI2lmbmRlZiBfUFBDX0ZDTlRMX0gKLSNkZWZpbmUgX1BQQ19GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1RPUlkgICAgICAwNDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XICAgICAgMDEwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19MQVJHRUZJTEUgICAgIDAyMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1QJMDQwMDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKLQotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfR0VUTEsJCTUKLSNkZWZpbmUgRl9TRVRMSwkJNgotI2RlZmluZSBGX1NFVExLVwk3Ci0KLSNkZWZpbmUgRl9TRVRPV04JOAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUT1dOCTkJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwotCi0vKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwotI2RlZmluZSBGX1JETENLCQkwCi0jZGVmaW5lIEZfV1JMQ0sJCTEKLSNkZWZpbmUgRl9VTkxDSwkJMgotCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCi0KLS8qIGZvciBsZWFzZXMgKi8KLSNkZWZpbmUgRl9JTlBST0dSRVNTCTE2Ci0KLS8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50Ci0JCQkJICAgYmxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLwotCi0jZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrICovCi0jZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0jZGVmaW5lIExPQ0tfUlcJCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wcyAqLwotCi0jaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBGX1BPU0lYCQkxCi0jZGVmaW5lIEZfRkxPQ0sJCTIKLSNkZWZpbmUgRl9CUk9LRU4JNAkvKiBicm9rZW4gZmxvY2soKSBlbXVsYXRpb24gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi1zdHJ1Y3QgZmxvY2s2NCB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90ICBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1wcGMvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaWJtX29jcC5oIGIvaW5jbHVkZS9hc20tcHBjL2libV9vY3AuaAppbmRleCBiZDc2NTZmLi42ZjEwYTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaWJtX29jcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pYm1fb2NwLmgKQEAgLTg0LDYgKzg0LDcgQEAKIE9DUF9TWVNGU19BRERUTChzdHJ1Y3Qgb2NwX2Z1bmNfZW1hY19kYXRhLCAiJWRcbiIsIGVtYWMsIHRhaF9pZHgpCVwKIE9DUF9TWVNGU19BRERUTChzdHJ1Y3Qgb2NwX2Z1bmNfZW1hY19kYXRhLCAiJWRcbiIsIGVtYWMsIHBoeV9tb2RlKQlcCiBPQ1BfU1lTRlNfQUREVEwoc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSwgIjB4JTA4eFxuIiwgZW1hYywgcGh5X21hcCkJXAorT0NQX1NZU0ZTX0FERFRMKHN0cnVjdCBvY3BfZnVuY19lbWFjX2RhdGEsICIweCUwOHhcbiIsIGVtYWMsIHBoeV9mZWF0X2V4YylcCiAJCQkJCQkJCQlcCiB2b2lkIG9jcF9zaG93X2VtYWNfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCQkJCVwKIHsJCQkJCQkJCQlcCkBAIC05OSw2ICsxMDAsNyBAQAogCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lbWFjX3RhaF9pZHgpOwkJXAogCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lbWFjX3BoeV9tb2RlKTsJCVwKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZW1hY19waHlfbWFwKTsJCVwKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZW1hY19waHlfZmVhdF9leGMpOwkJXAogfQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2lycS5oIGIvaW5jbHVkZS9hc20tcHBjL2lycS5oCmluZGV4IGEyNDRkOTMuLjU1NzUyNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvaXJxLmgKQEAgLTE5LDYgKzE5LDExIEBACiAjZGVmaW5lIElSUV9QT0xBUklUWV9QT1NJVElWRQkweDIJLyogaGlnaCBsZXZlbCBvciBsb3ctPmhpZ2ggZWRnZSAqLwogI2RlZmluZSBJUlFfUE9MQVJJVFlfTkVHQVRJVkUJMHgwCS8qIGxvdyBsZXZlbCBvciBoaWdoLT5sb3cgZWRnZSAqLwogCisvKgorICogSVJRIGxpbmUgc3RhdHVzIG1hY3JvIElSUV9QRVJfQ1BVIGlzIHVzZWQKKyAqLworI2RlZmluZSBBUkNIX0hBU19JUlFfUEVSX0NQVQorCiAjaWYgZGVmaW5lZChDT05GSUdfNDB4KQogI2luY2x1ZGUgPGFzbS9pYm00eHguaD4KIApAQCAtMzk5LDkgKzQwNCw1IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBwcGNfbG9zdF9pbnRlcnJ1cHRzW05SX01BU0tfV09SRFNdOwogZXh0ZXJuIGF0b21pY190IHBwY19uX2xvc3RfaW50ZXJydXB0czsKIAotc3RydWN0IGlycWFjdGlvbjsKLXN0cnVjdCBwdF9yZWdzOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOwotCiAjZW5kaWYgLyogX0FTTV9JUlFfSCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBwYy9wY2kuaAppbmRleCBhODExZTQ0Li45ZGQwNmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3BjaS5oCkBAIC0xMDksNiArMTA5LDE5IEBACiBwY2liaW9zX2J1c190b19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKIAkJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKgorcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IHJlc291cmNlICpyb290ID0gTlVMTDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKworCXJldHVybiByb290OworfQorCiBleHRlcm4gdm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCiBzdHJ1Y3QgZmlsZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9yZWcuaCBiL2luY2x1ZGUvYXNtLXBwYy9yZWcuaAppbmRleCA4OGI0MjIyLi43M2MzM2UzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvcmVnLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3JlZy5oCkBAIC0zNjYsMTIgKzM2Niw2IEBACiAjZGVmaW5lIFBWUl9TVEIwM1hYWAkweDQwMzEwMDAwCiAjZGVmaW5lIFBWUl9OUDQwNUgJMHg0MTQxMDAwMAogI2RlZmluZSBQVlJfTlA0MDVMCTB4NDE2MTAwMDAKLSNkZWZpbmUgUFZSXzQ0MEdQX1JCCTB4NDAxMjA0NDAKLSNkZWZpbmUgUFZSXzQ0MEdQX1JDMQkweDQwMTIwNDgxCi0jZGVmaW5lIFBWUl80NDBHUF9SQzIJMHg0MDIwMDQ4MQotI2RlZmluZSBQVlJfNDQwR1hfUkEJMHg1MWIyMTg1MAotI2RlZmluZSBQVlJfNDQwR1hfUkIJMHg1MWIyMTg1MQotI2RlZmluZSBQVlJfNDQwR1hfUkMJMHg1MWIyMTg5MgogI2RlZmluZSBQVlJfNjAxCQkweDAwMDEwMDAwCiAjZGVmaW5lIFBWUl82MDIJCTB4MDAwNTAwMDAKICNkZWZpbmUgUFZSXzYwMwkJMHgwMDAzMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3NldHVwLmggYi9pbmNsdWRlL2FzbS1wcGMvc2V0dXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkMTllZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvc2V0dXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9QUENfU0VUVVBfSAotI2RlZmluZSBfUFBDX1NFVFVQX0gKLQotI2RlZmluZSBtNjhrX251bV9tZW1vcnkgbnVtX21lbW9yeQotI2RlZmluZSBtNjhrX21lbW9yeSBtZW1vcnkKLQotI2luY2x1ZGUgPGFzbS1tNjhrL3NldHVwLmg+Ci0vKiBXZSBoYXZlIGEgYmlnZ2VyIGNvbW1hbmQgbGluZSBidWZmZXIuICovCi0jdW5kZWYgQ09NTUFORF9MSU5FX1NJWkUKLSNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUJNTEyCi0KLSNlbmRpZiAvKiBfUFBDX1NFVFVQX0ggKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc21wLmggYi9pbmNsdWRlL2FzbS1wcGMvc21wLmgKaW5kZXggMTc1MzBjMi4uODI5NDgxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9zbXAuaApAQCAtNDEsNiArNDEsMTAgQEAKIHN0cnVjdCBwdF9yZWdzOwogZXh0ZXJuIHZvaWQgc21wX21lc3NhZ2VfcmVjdihpbnQsIHN0cnVjdCBwdF9yZWdzICopOwogCitleHRlcm4gaW50IF9fY3B1X2Rpc2FibGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBjcHVfZGllKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKICNkZWZpbmUgTk9fUFJPQ19JRAkJMHhGRiAgICAgICAgICAgIC8qIE5vIHByb2Nlc3NvciBtYWdpYyBtYXJrZXIgKi8KICNkZWZpbmUgUFJPQ19DSEFOR0VfUEVOQUxUWQkyMAogCkBAIC02NCw2ICs2OCw4IEBACiAKICNlbHNlIC8qICEoQ09ORklHX1NNUCkgKi8KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdV9kaWUodm9pZCkgeyB9CisKICNlbmRpZiAvKiAhKENPTkZJR19TTVApICovCiAKICNlbmRpZiAvKiAhKF9QUENfU01QX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXBwYy9zcGlubG9jay5oCmluZGV4IDkwOTE5OWEuLjIwZWRjZjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2suaApAQCAtNSw0MSArNSwyMSBAQAogCiAvKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLgorICoKKyAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3Jhd19zcGlubG9ja190eXBlcy5oKQogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvd25lcl9wYzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG93bmVyX2NwdTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJCSgoeCktPmxvY2sgIT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogCi0jaWZkZWYgX19LRVJORUxfXwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotI2RlZmluZSBTUElOTE9DS19ERUJVR19JTklUICAgICAsIDAsIDAKLSNlbHNlCi0jZGVmaW5lIFNQSU5MT0NLX0RFQlVHX0lOSVQgICAgIC8qICovCi0jZW5kaWYKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHsgMCBTUElOTE9DS19ERUJVR19JTklUIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KSAJZG8geyAqKHgpID0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZShzcGluX2lzX2xvY2tlZCh4KSkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCi0KLSNpZm5kZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJiCTFmCQkjIHNwaW5fbG9ja1xuXAorCSJiCTFmCQkjIF9fcmF3X3NwaW5fbG9ja1xuXAogMjoJbHd6eAklMCwwLCUxXG5cCiAJY21wd2kJMCwlMCwwXG5cCiAJYm5lKwkyYlxuXApAQCAtNTUsMjEgKzM1LDEzIEBACiAJOiAiY3IwIiwgIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJlaWVpbwkJIyBzcGluX3VubG9jayI6IDogOiJtZW1vcnkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZWllaW8JIyBfX3Jhd19zcGluX3VubG9jayI6IDogOiJtZW1vcnkiKTsKIAlsb2NrLT5sb2NrID0gMDsKIH0KIAotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhsKSAoIXRlc3RfYW5kX3NldF9iaXQoMCwmKGwpLT5sb2NrKSkKLQotI2Vsc2UKLQotZXh0ZXJuIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKLQotI2VuZGlmCisjZGVmaW5lIF9fcmF3X3NwaW5fdHJ5bG9jayhsKSAoIXRlc3RfYW5kX3NldF9iaXQoMCwmKGwpLT5sb2NrKSkKIAogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCkBAIC04MSwyMiArNTMsMTEgQEAKICAqIGlycS1zYWZlIHdyaXRlLWxvY2ssIGJ1dCByZWFkZXJzIGNhbiBnZXQgbm9uLWlycXNhZmUKICAqIHJlYWQtbG9ja3MuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSBzaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKIAotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyAwIH0KLSNkZWZpbmUgcndsb2NrX2luaXQobHApIGRvIHsgKihscCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2socncpCSgocncpLT5sb2NrID49IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCiAKLSNkZWZpbmUgcmVhZF9jYW5fbG9jayhydykJKChydyktPmxvY2sgPj0gMCkKLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2socncpCSghKHJ3KS0+bG9jaykKLQotI2lmbmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQotc3RhdGljIF9faW5saW5lX18gaW50IF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlzaWduZWQgaW50IHRtcDsKIApAQCAtMTE2LDcgKzc3LDcgQEAKIAlyZXR1cm4gdG1wID4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXNpZ25lZCBpbnQgdG1wOwogCkBAIC0xMzcsNyArOTgsNyBAQAogCTogImNyMCIsICJtZW1vcnkiKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlzaWduZWQgaW50IHRtcDsKIApAQCAtMTUzLDcgKzExNCw3IEBACiAJOiAiY3IwIiwgIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJc2lnbmVkIGludCB0bXA7CiAKQEAgLTE3Myw3ICsxMzQsNyBAQAogCXJldHVybiB0bXAgPT0gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJc2lnbmVkIGludCB0bXA7CiAKQEAgLTE5NCwyMiArMTU1LDEwIEBACiAJOiAiY3IwIiwgIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImVpZWlvCQkjIHdyaXRlX3VubG9jayI6IDogOiJtZW1vcnkiKTsKIAlydy0+bG9jayA9IDA7CiB9CiAKLSNlbHNlCi0KLWV4dGVybiB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gdm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KTsKLWV4dGVybiB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gaW50IF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpydyk7Ci1leHRlcm4gaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpOwotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNNX1NQSU5MT0NLX0ggKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBwYy9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTljY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmgKaW5kZXggNTEzYTMzNC4uZDc1NGFiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9zeXN0ZW0uaApAQCAtODgsNiArODgsNyBAQAogZXh0ZXJuIGludCBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgYmFkX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZXh0ZXJuIHZvaWQgX2V4Y2VwdGlvbihpbnQsIHN0cnVjdCBwdF9yZWdzICosIGludCwgdW5zaWduZWQgbG9uZyk7CiAjaWZkZWYgQ09ORklHX0JPT0tFX1dEVAogZXh0ZXJuIHUzMiBib29rZV93ZHRfZW5hYmxlZDsKIGV4dGVybiB1MzIgYm9va2Vfd2R0X3BlcmlvZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy90aW1leC5oIGIvaW5jbHVkZS9hc20tcHBjL3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmM4NzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3RpbWV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tcHBjL3RpbWV4LmgKLSAqCi0gKiBwcGMgYXJjaGl0ZWN0dXJlIHRpbWV4IHNwZWNpZmljYXRpb25zCi0gKi8KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9BU01wcGNfVElNRVhfSAotI2RlZmluZSBfQVNNcHBjX1RJTUVYX0gKLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkxMTkzMTgwIC8qIFVuZGVybHlpbmcgSFogKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGN5Y2xlc190OwotCi0vKgotICogRm9yIHRoZSAiY3ljbGUiIGNvdW50ZXIgd2UgdXNlIHRoZSB0aW1lYmFzZSBsb3dlciBoYWxmLgotICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCi0gKi8KLQotc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzKHZvaWQpCi17Ci0JY3ljbGVzX3QgcmV0ID0gMDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiOTg6CW1mdGIgJTBcbiIKLQkJIjk5OlxuIgotCQkiLnNlY3Rpb24gX19mdHJfZml4dXAsXCJhXCJcbiIKLQkJIgkubG9uZyAlMVxuIgotCQkiCS5sb25nIDBcbiIKLQkJIgkubG9uZyA5OGJcbiIKLQkJIgkubG9uZyA5OWJcbiIKLQkJIi5wcmV2aW91cyIKLQkJOiAiPXIiIChyZXQpIDogImkiIChDUFVfRlRSXzYwMSkpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tcHBjL3RvcG9sb2d5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDI5YmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3RvcG9sb2d5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QUENfVE9QT0xPR1lfSAotI2RlZmluZSBfQVNNX1BQQ19UT1BPTE9HWV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgotCi0jZW5kaWYgLyogX0FTTV9QUENfVE9QT0xPR1lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXBwYy91YWNjZXNzLmgKaW5kZXggYjA0NGFlMC4uNjNmNTYyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvdWFjY2Vzcy5oCkBAIC0zNywxMyArMzcsNiBAQAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgXAogCShfX2Noa191c2VyX3B0cihhZGRyKSxfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksKHNpemUpKSkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzYzODFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvYXV4dmVjLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX1BQQzY0X0FVWFZFQ19ICisjZGVmaW5lIF9fUFBDNjRfQVVYVkVDX0gKKworLyoKKyAqIFdlIG5lZWQgdG8gcHV0IGluIHNvbWUgZXh0cmEgYXV4IHRhYmxlIGVudHJpZXMgdG8gdGVsbCBnbGliYyB3aGF0CisgKiB0aGUgY2FjaGUgYmxvY2sgc2l6ZSBpcywgc28gaXQgY2FuIHVzZSB0aGUgZGNieiBpbnN0cnVjdGlvbiBzYWZlbHkuCisgKi8KKyNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJCTE5CisjZGVmaW5lIEFUX0lDQUNIRUJTSVpFCQkyMAorI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkJMjEKKy8qIEEgc3BlY2lhbCBpZ25vcmVkIHR5cGUgdmFsdWUgZm9yIFBQQywgZm9yIGdsaWJjIGNvbXBhdGliaWxpdHkuICAqLworI2RlZmluZSBBVF9JR05PUkVQUEMJCTIyCisKKy8qIFRoZSB2RFNPIGxvY2F0aW9uLiBXZSBoYXZlIHRvIHVzZSB0aGUgc2FtZSB2YWx1ZSBhcyB4ODYgZm9yIGdsaWJjJ3MKKyAqIHNha2UgOi0pCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworCisjZW5kaWYgLyogX19QUEM2NF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wcGM2NC9jb21wYXQuaAppbmRleCAxMjQxNGY1Li42ZWM2MmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9jb21wYXQuaApAQCAtMTMsOCArMTMsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfdGltZV90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9jbG9ja190OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9waWRfdDsKLXR5cGVkZWYgdTMyCQljb21wYXRfdWlkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X3VpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X3VpZDMyX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfZ2lkMzJfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfbW9kZV90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF9pbm9fdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfZGV2X3Q7CkBAIC00OCw4ICs1MCw4IEBACiAJY29tcGF0X2lub190CXN0X2lubzsKIAljb21wYXRfbW9kZV90CXN0X21vZGU7CiAJY29tcGF0X25saW5rX3QJc3Rfbmxpbms7CQotCWNvbXBhdF91aWRfdAlzdF91aWQ7Ci0JY29tcGF0X2dpZF90CXN0X2dpZDsKKwlfX2NvbXBhdF91aWQzMl90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWQzMl90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAljb21wYXRfb2ZmX3QJc3Rfc2l6ZTsKIAljb21wYXRfb2ZmX3QJc3RfYmxrc2l6ZTsKQEAgLTE0NCwxMCArMTQ2LDEwIEBACiAgKi8KIHN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSB7CiAJY29tcGF0X2tleV90IGtleTsKLQljb21wYXRfdWlkX3QgdWlkOwotCWNvbXBhdF9naWRfdCBnaWQ7Ci0JY29tcGF0X3VpZF90IGN1aWQ7Ci0JY29tcGF0X2dpZF90IGNnaWQ7CisJX19jb21wYXRfdWlkX3QgdWlkOworCV9fY29tcGF0X2dpZF90IGdpZDsKKwlfX2NvbXBhdF91aWRfdCBjdWlkOworCV9fY29tcGF0X2dpZF90IGNnaWQ7CiAJY29tcGF0X21vZGVfdCBtb2RlOwogCXVuc2lnbmVkIGludCBzZXE7CiAJdW5zaWduZWQgaW50IF9fcGFkMjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L2VlaC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvZWVoLmgKaW5kZXggOTQyOThiMS4uNDBjOGViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvZWVoLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvZWVoLmgKQEAgLTIxOSwyMyArMjE5LDI0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZWVoX21lbXNldF9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBjLAogCQkJCSB1bnNpZ25lZCBsb25nIG4pCiB7CisJdm9pZCAqcCA9ICh2b2lkIF9fZm9yY2UgKilhZGRyOwogCXUzMiBsYyA9IGM7CiAJbGMgfD0gbGMgPDwgODsKIAlsYyB8PSBsYyA8PCAxNjsKIAotCXdoaWxlKG4gJiYgIUVFSF9DSEVDS19BTElHTihhZGRyLCA0KSkgewotCQkqKCh2b2xhdGlsZSB1OCAqKWFkZHIpID0gYzsKLQkJYWRkciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgKyAxKTsKKwl3aGlsZShuICYmICFFRUhfQ0hFQ0tfQUxJR04ocCwgNCkpIHsKKwkJKigodm9sYXRpbGUgdTggKilwKSA9IGM7CisJCXArKzsKIAkJbi0tOwogCX0KIAl3aGlsZShuID49IDQpIHsKLQkJKigodm9sYXRpbGUgdTMyICopYWRkcikgPSBsYzsKLQkJYWRkciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWFkZHIgKyA0KTsKKwkJKigodm9sYXRpbGUgdTMyICopcCkgPSBsYzsKKwkJcCArPSA0OwogCQluIC09IDQ7CiAJfQogCXdoaWxlKG4pIHsKLQkJKigodm9sYXRpbGUgdTggKilhZGRyKSA9IGM7Ci0JCWFkZHIgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylhZGRyICsgMSk7CisJCSooKHZvbGF0aWxlIHU4ICopcCkgPSBjOworCQlwKys7CiAJCW4tLTsKIAl9CiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CkBAIC0yNTAsMjIgKzI1MSwyMiBAQAogCXdoaWxlKG4gJiYgKCFFRUhfQ0hFQ0tfQUxJR04odnNyYywgNCkgfHwgIUVFSF9DSEVDS19BTElHTihkZXN0LCA0KSkpIHsKIAkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKLQkJdnNyYyA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZzcmMgKyAxKTsKLQkJZGVzdCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWRlc3QgKyAxKTsJCQkKKwkJdnNyYysrOworCQlkZXN0Kys7CiAJCW4tLTsKIAl9CiAJd2hpbGUobiA+IDQpIHsKIAkJKigodTMyICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1MzIgKil2c3JjKTsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOwotCQl2c3JjID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdnNyYyArIDQpOwotCQlkZXN0ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZGVzdCArIDQpOwkJCQorCQl2c3JjICs9IDQ7CisJCWRlc3QgKz0gNDsKIAkJbiAtPSA0OwogCX0KIAl3aGlsZShuKSB7CiAJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOwogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7Ci0JCXZzcmMgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl2c3JjICsgMSk7Ci0JCWRlc3QgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylkZXN0ICsgMSk7CQkJCisJCXZzcmMrKzsKKwkJZGVzdCsrOwogCQluLS07CiAJfQogCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwpAQCAtMjg2LDIwICsyODcsMjAgQEAKIAogCXdoaWxlKG4gJiYgKCFFRUhfQ0hFQ0tfQUxJR04odmRlc3QsIDQpIHx8ICFFRUhfQ0hFQ0tfQUxJR04oc3JjLCA0KSkpIHsKIAkJKigodm9sYXRpbGUgdTggKil2ZGVzdCkgPSAqKCh1OCAqKXNyYyk7Ci0JCXNyYyA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXNyYyArIDEpOwotCQl2ZGVzdCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZkZXN0ICsgMSk7CQkJCisJCXNyYysrOworCQl2ZGVzdCsrOwogCQluLS07CiAJfQogCXdoaWxlKG4gPiA0KSB7CiAJCSooKHZvbGF0aWxlIHUzMiAqKXZkZXN0KSA9ICooKHZvbGF0aWxlIHUzMiAqKXNyYyk7Ci0JCXNyYyA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXNyYyArIDQpOwotCQl2ZGVzdCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZkZXN0ICsgNCk7CQkJCisJCXNyYyArPSA0OworCQl2ZGVzdCArPSA0OwogCQluLT00OwogCX0KIAl3aGlsZShuKSB7CiAJCSooKHZvbGF0aWxlIHU4ICopdmRlc3QpID0gKigodTggKilzcmMpOwotCQlzcmMgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylzcmMgKyAxKTsKLQkJdmRlc3QgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl2ZGVzdCArIDEpOwkJCQorCQlzcmMrKzsKKwkJdmRlc3QrKzsKIAkJbi0tOwogCX0KIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L2VsZi5oIGIvaW5jbHVkZS9hc20tcHBjNjQvZWxmLmgKaW5kZXggMDg1ZWVkYi4uYzkxOWE4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvZWxmLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KIAogLyogUG93ZXJQQyByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCiAjZGVmaW5lIFJfUFBDX05PTkUJCTAKQEAgLTIzNywyMSArMjM4LDYgQEAKIAogI2VuZGlmCiAKLS8qCi0gKiBXZSBuZWVkIHRvIHB1dCBpbiBzb21lIGV4dHJhIGF1eCB0YWJsZSBlbnRyaWVzIHRvIHRlbGwgZ2xpYmMgd2hhdAotICogdGhlIGNhY2hlIGJsb2NrIHNpemUgaXMsIHNvIGl0IGNhbiB1c2UgdGhlIGRjYnogaW5zdHJ1Y3Rpb24gc2FmZWx5LgotICovCi0jZGVmaW5lIEFUX0RDQUNIRUJTSVpFCQkxOQotI2RlZmluZSBBVF9JQ0FDSEVCU0laRQkJMjAKLSNkZWZpbmUgQVRfVUNBQ0hFQlNJWkUJCTIxCi0vKiBBIHNwZWNpYWwgaWdub3JlZCB0eXBlIHZhbHVlIGZvciBQUEMsIGZvciBnbGliYyBjb21wYXRpYmlsaXR5LiAgKi8KLSNkZWZpbmUgQVRfSUdOT1JFUFBDCQkyMgotCi0vKiBUaGUgdkRTTyBsb2NhdGlvbi4gV2UgaGF2ZSB0byB1c2UgdGhlIHNhbWUgdmFsdWUgYXMgeDg2IGZvciBnbGliYydzCi0gKiBzYWtlIDotKQotICovCi0jZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkJMzMKLQogZXh0ZXJuIGludCBkY2FjaGVfYnNpemU7CiBleHRlcm4gaW50IGljYWNoZV9ic2l6ZTsKIGV4dGVybiBpbnQgdWNhY2hlX2JzaXplOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2ZjbnRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MjU2MGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvZmNudGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSNpZm5kZWYgX1BQQzY0X0ZDTlRMX0gKLSNkZWZpbmUgX1BQQzY0X0ZDTlRMX0gKLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkgICAwMDAzCi0jZGVmaW5lIE9fUkRPTkxZCSAgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgICAwMQotI2RlZmluZSBPX1JEV1IJCSAgICAgMDIKLSNkZWZpbmUgT19DUkVBVAkJICAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgICAwMjAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX05PQ1RUWQkgICAwNDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX1RSVU5DCQkgIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgIDAyMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJICAwNDAwMAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0jZGVmaW5lIE9fU1lOQwkJIDAxMDAwMAotI2RlZmluZSBGQVNZTkMJCSAwMjAwMDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBPX0RJUkVDVE9SWSAgICAgIDA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cgICAgICAwMTAwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwotI2RlZmluZSBPX0xBUkdFRklMRSAgICAgMDIwMDAwMAotI2RlZmluZSBPX0RJUkVDVAkwNDAwMDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIEZfUE9TSVgJCTEKLSNkZWZpbmUgRl9GTE9DSwkJMgotI2RlZmluZSBGX0JST0tFTgk0CS8qIGJyb2tlbiBmbG9jaygpIGVtdWxhdGlvbiAqLwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKLQotI2VuZGlmIC8qIF9QUEM2NF9GQ05UTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9mdXRleC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI2NDBiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvZnV0ZXguaApAQCAtMCwwICsxLDgzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgX19mdXRleF9hdG9taWNfb3AoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKFNZTkNfT05fU01QCQkJCVwKKyIxOglsd2FyeAklMCwwLCUyXG4iCQkJCQlcCisJaW5zbgkJCQkJCQlcCisiMjoJc3R3Y3guCSUxLDAsJTJcblwKKwlibmUtCTFiXG5cCisJbGkJJTEsMFxuXAorMzoJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuXAorNDoJbGkJJTEsJTNcblwKKwliCTNiXG5cCisJLnByZXZpb3VzXG5cCisJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuXAorCS5hbGlnbiAzXG5cCisJLmxsb25nCTFiLDRiLDJiLDRiXG5cCisJLnByZXZpb3VzIgkJCQkJCVwKKwk6ICI9JnIiIChvbGR2YWwpLCAiPSZyIiAocmV0KQkJCQlcCisJOiAiYiIgKHVhZGRyKSwgImkiICgtRUZBVUxUKSwgIjEiIChvcGFyZykJCVwKKwk6ICJjcjAiLCAibWVtb3J5IikKKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQ7CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiYWRkICUxLCUwLCUxXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9PUjoKKwkJX19mdXRleF9hdG9taWNfb3AoIm9yICUxLCUwLCUxXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiYW5kYyAlMSwlMCwlMVxuIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlfX2Z1dGV4X2F0b21pY19vcCgieG9yICUxLCUwLCUxXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L2lvLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9pby5oCmluZGV4IGFiYTFkZmEuLjU5Yzk1OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvaW8uaApAQCAtMjAsMTAgKzIwLDEwIEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb21hcC5oPgogCi0jZGVmaW5lIF9faWRlX21tX2luc3cocCwgYSwgYykgX2luc3dfbnMoKHZvbGF0aWxlIHUxNiAqKShwKSwgKGEpLCAoYykpCi0jZGVmaW5lIF9faWRlX21tX2luc2wocCwgYSwgYykgX2luc2xfbnMoKHZvbGF0aWxlIHUzMiAqKShwKSwgKGEpLCAoYykpCi0jZGVmaW5lIF9faWRlX21tX291dHN3KHAsIGEsIGMpIF9vdXRzd19ucygodm9sYXRpbGUgdTE2ICopKHApLCAoYSksIChjKSkKLSNkZWZpbmUgX19pZGVfbW1fb3V0c2wocCwgYSwgYykgX291dHNsX25zKCh2b2xhdGlsZSB1MzIgKikocCksIChhKSwgKGMpKQorI2RlZmluZSBfX2lkZV9tbV9pbnN3KHAsIGEsIGMpIF9pbnN3X25zKCh2b2xhdGlsZSB1MTYgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCisjZGVmaW5lIF9faWRlX21tX2luc2wocCwgYSwgYykgX2luc2xfbnMoKHZvbGF0aWxlIHUzMiBfX2lvbWVtICopKHApLCAoYSksIChjKSkKKyNkZWZpbmUgX19pZGVfbW1fb3V0c3cocCwgYSwgYykgX291dHN3X25zKCh2b2xhdGlsZSB1MTYgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCisjZGVmaW5lIF9faWRlX21tX291dHNsKHAsIGEsIGMpIF9vdXRzbF9ucygodm9sYXRpbGUgdTMyIF9faW9tZW0gKikocCksIChhKSwgKGMpKQogCiAKICNkZWZpbmUgU0lPX0NPTkZJR19SQQkweDM5OApAQCAtNzEsOCArNzEsOCBAQAogICogTmVpdGhlciBkbyB0aGUgc3RhbmRhcmQgdmVyc2lvbnMgbm93LCB0aGVzZSBhcmUganVzdCBoZXJlCiAgKiBmb3Igb2xkZXIgY29kZS4KICAqLwotI2RlZmluZSBpbnN3X25zKHBvcnQsIGJ1ZiwgbnMpCV9pbnN3X25zKCh1MTYgKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChucykpCi0jZGVmaW5lIGluc2xfbnMocG9ydCwgYnVmLCBubCkJX2luc2xfbnMoKHUzMiAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5sKSkKKyNkZWZpbmUgaW5zd19ucyhwb3J0LCBidWYsIG5zKQlfaW5zd19ucygodTE2IF9faW9tZW0gKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChucykpCisjZGVmaW5lIGluc2xfbnMocG9ydCwgYnVmLCBubCkJX2luc2xfbnMoKHUzMiBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobmwpKQogI2Vsc2UKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9fcmF3X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKQEAgLTEzNiw5ICsxMzYsOSBAQAogI2RlZmluZSBpbnN3X25zKHBvcnQsIGJ1ZiwgbnMpCWVlaF9pbnN3X25zKChwb3J0KSwgKGJ1ZiksIChucykpCiAjZGVmaW5lIGluc2xfbnMocG9ydCwgYnVmLCBubCkJZWVoX2luc2xfbnMoKHBvcnQpLCAoYnVmKSwgKG5sKSkKIAotI2RlZmluZSBvdXRzYihwb3J0LCBidWYsIG5zKSAgX291dHNiKCh1OCAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKLSNkZWZpbmUgb3V0c3cocG9ydCwgYnVmLCBucykgIF9vdXRzd19ucygodTE2ICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQotI2RlZmluZSBvdXRzbChwb3J0LCBidWYsIG5sKSAgX291dHNsX25zKCh1MzIgKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChubCkpCisjZGVmaW5lIG91dHNiKHBvcnQsIGJ1ZiwgbnMpICBfb3V0c2IoKHU4IF9faW9tZW0gKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChucykpCisjZGVmaW5lIG91dHN3KHBvcnQsIGJ1ZiwgbnMpICBfb3V0c3dfbnMoKHUxNiBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQorI2RlZmluZSBvdXRzbChwb3J0LCBidWYsIG5sKSAgX291dHNsX25zKCh1MzIgX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5sKSkKIAogI2VuZGlmCiAKQEAgLTE0NywxNiArMTQ3LDE2IEBACiAjZGVmaW5lIHJlYWRsX3JlbGF4ZWQoYWRkcikgcmVhZGwoYWRkcikKICNkZWZpbmUgcmVhZHFfcmVsYXhlZChhZGRyKSByZWFkcShhZGRyKQogCi1leHRlcm4gdm9pZCBfaW5zYih2b2xhdGlsZSB1OCAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbnMpOwotZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4ICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBucyk7Ci1leHRlcm4gdm9pZCBfaW5zdyh2b2xhdGlsZSB1MTYgKnBvcnQsIHZvaWQgKmJ1ZiwgaW50IG5zKTsKLWV4dGVybiB2b2lkIF9vdXRzdyh2b2xhdGlsZSB1MTYgKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5zKTsKLWV4dGVybiB2b2lkIF9pbnNsKHZvbGF0aWxlIHUzMiAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbmwpOwotZXh0ZXJuIHZvaWQgX291dHNsKHZvbGF0aWxlIHUzMiAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbmwpOwotZXh0ZXJuIHZvaWQgX2luc3dfbnModm9sYXRpbGUgdTE2ICpwb3J0LCB2b2lkICpidWYsIGludCBucyk7Ci1leHRlcm4gdm9pZCBfb3V0c3dfbnModm9sYXRpbGUgdTE2ICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBucyk7Ci1leHRlcm4gdm9pZCBfaW5zbF9ucyh2b2xhdGlsZSB1MzIgKnBvcnQsIHZvaWQgKmJ1ZiwgaW50IG5sKTsKLWV4dGVybiB2b2lkIF9vdXRzbF9ucyh2b2xhdGlsZSB1MzIgKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5sKTsKK2V4dGVybiB2b2lkIF9pbnNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKnBvcnQsIHZvaWQgKmJ1ZiwgaW50IG5zKTsKK2V4dGVybiB2b2lkIF9vdXRzYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBucyk7CitleHRlcm4gdm9pZCBfaW5zdyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbnMpOworZXh0ZXJuIHZvaWQgX291dHN3KHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBucyk7CitleHRlcm4gdm9pZCBfaW5zbCh2b2xhdGlsZSB1MzIgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbmwpOworZXh0ZXJuIHZvaWQgX291dHNsKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBubCk7CitleHRlcm4gdm9pZCBfaW5zd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbnMpOworZXh0ZXJuIHZvaWQgX291dHN3X25zKHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBucyk7CitleHRlcm4gdm9pZCBfaW5zbF9ucyh2b2xhdGlsZSB1MzIgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBpbnQgbmwpOworZXh0ZXJuIHZvaWQgX291dHNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGludCBubCk7CiAKICNkZWZpbmUgbW1pb3diKCkKIApAQCAtMTc2LDggKzE3Niw4IEBACiAgKiBOZWl0aGVyIGRvIHRoZSBzdGFuZGFyZCB2ZXJzaW9ucyBub3csIHRoZXNlIGFyZSBqdXN0IGhlcmUKICAqIGZvciBvbGRlciBjb2RlLgogICovCi0jZGVmaW5lIG91dHN3X25zKHBvcnQsIGJ1ZiwgbnMpCV9vdXRzd19ucygodTE2ICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQotI2RlZmluZSBvdXRzbF9ucyhwb3J0LCBidWYsIG5sKQlfb3V0c2xfbnMoKHUzMiAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5sKSkKKyNkZWZpbmUgb3V0c3dfbnMocG9ydCwgYnVmLCBucykJX291dHN3X25zKCh1MTYgX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKKyNkZWZpbmUgb3V0c2xfbnMocG9ydCwgYnVmLCBubCkJX291dHNsX25zKCh1MzIgX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5sKSkKIAogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIH4oMFVMKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvaXJxLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9pcnEuaAppbmRleCA1NzA2NzhiLi45OTc4MmFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9pcnEuaApAQCAtMzMsNiArMzMsMTEgQEAKICNkZWZpbmUgSVJRX1BPTEFSSVRZX1BPU0lUSVZFCTB4MgkvKiBoaWdoIGxldmVsIG9yIGxvdy0+aGlnaCBlZGdlICovCiAjZGVmaW5lIElSUV9QT0xBUklUWV9ORUdBVElWRQkweDAJLyogbG93IGxldmVsIG9yIGhpZ2gtPmxvdyBlZGdlICovCiAKKy8qCisgKiBJUlEgbGluZSBzdGF0dXMgbWFjcm8gSVJRX1BFUl9DUFUgaXMgdXNlZAorICovCisjZGVmaW5lIEFSQ0hfSEFTX0lSUV9QRVJfQ1BVCisKICNkZWZpbmUgZ2V0X2lycV9kZXNjKGlycSkgKCZpcnFfZGVzY1soaXJxKV0pCiAKIC8qIERlZmluZSBhIHdheSB0byBpdGVyYXRlIGFjcm9zcyBpcnFzLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oCmluZGV4IDA4MDI5MTkuLmQ5MTI5ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9rcHJvYmVzLmgKQEAgLTQyLDYgKzQyLDkgQEAKIAogI2RlZmluZSBKUFJPQkVfRU5UUlkocGVudHJ5KQkoa3Byb2JlX29wY29kZV90ICopKChmdW5jX2Rlc2NyX3QgKilwZW50cnkpCiAKKyNkZWZpbmUgaXNfdHJhcChpbnN0cikJKElTX1RXKGluc3RyKSB8fCBJU19URChpbnN0cikgfHwgXAorCQkJSVNfVFdJKGluc3RyKSB8fCBJU19UREkoaW5zdHIpKQorCiAjZGVmaW5lIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUwogdm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1wcGM2NC9tZW1vcnkuaAppbmRleCA1NmUwOWZhLi5hZjUzZmZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9tZW1vcnkuaApAQCAtMTgsOSArMTgsMTEgQEAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIEVJRUlPX09OX1NNUAkiZWllaW9cbiIKICNkZWZpbmUgSVNZTkNfT05fU01QCSJcblx0aXN5bmMiCisjZGVmaW5lIFNZTkNfT05fU01QCSJsd3N5bmNcblx0IgogI2Vsc2UKICNkZWZpbmUgRUlFSU9fT05fU01QCiAjZGVmaW5lIElTWU5DX09OX1NNUAorI2RlZmluZSBTWU5DX09OX1NNUAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlaWVpbyh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvbXNnYnVmLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9tc2didWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjMWNiZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9tc2didWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSNpZm5kZWYgX1BQQzY0X01TR0JVRl9ICi0jZGVmaW5lIF9QUEM2NF9NU0dCVUZfSAotCi0vKiAKLSAqIFRoZSBtc3FpZDY0X2RzIHN0cnVjdHVyZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi1zdHJ1Y3QgbXNxaWQ2NF9kcyB7Ci0Jc3RydWN0IGlwYzY0X3Blcm0gbXNnX3Blcm07Ci0JX19rZXJuZWxfdGltZV90IG1zZ19zdGltZTsJLyogbGFzdCBtc2dzbmQgdGltZSAqLwotCV9fa2VybmVsX3RpbWVfdCBtc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KLQlfX2tlcm5lbF90aW1lX3QgbXNnX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCi0JdW5zaWduZWQgbG9uZyAgbXNnX2NieXRlczsJLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KLQl1bnNpZ25lZCBsb25nICBtc2dfcW51bTsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHF1ZXVlICovCi0JdW5zaWduZWQgbG9uZyAgbXNnX3FieXRlczsJLyogbWF4IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLwotCV9fa2VybmVsX3BpZF90IG1zZ19sc3BpZDsJLyogcGlkIG9mIGxhc3QgbXNnc25kICovCi0JX19rZXJuZWxfcGlkX3QgbXNnX2xycGlkOwkvKiBsYXN0IHJlY2VpdmUgcGlkICovCi0JdW5zaWduZWQgbG9uZyAgX191bnVzZWQxOwotCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMjsKLX07Ci0KLSNlbmRpZiAvKiBfUFBDNjRfTVNHQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3BhcmFtLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9wYXJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmMyMTJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3BhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaWZuZGVmIF9BU01fUFBDNjRfUEFSQU1fSAotI2RlZmluZSBfQVNNX1BQQzY0X1BBUkFNX0gKLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZkZWYgX19LRVJORUxfXwotIyBkZWZpbmUgSFoJCUNPTkZJR19IWgkvKiBJbnRlcm5hbCBrZXJuZWwgdGltZXIgZnJlcXVlbmN5ICovCi0jIGRlZmluZSBVU0VSX0haCTEwMAkJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluICJ0aWNrcyIgKi8KLSMgZGVmaW5lIENMT0NLU19QRVJfU0VDCShVU0VSX0haKQkvKiBsaWtlIHRpbWVzKCkgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEhaCi0jZGVmaW5lIEhaIDEwMAotI2VuZGlmCi0KLSNkZWZpbmUgRVhFQ19QQUdFU0laRQk0MDk2Ci0KLSNpZm5kZWYgTk9HUk9VUAotI2RlZmluZSBOT0dST1VQCQkoLTEpCi0jZW5kaWYKLQotI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAkvKiBtYXggbGVuZ3RoIG9mIGhvc3RuYW1lICovCi0KLSNlbmRpZiAvKiBfQVNNX1BQQzY0X1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS1icmlkZ2UuaAppbmRleCBjNGY5MDIzLi42YjRhNWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wY2ktYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvcGNpLWJyaWRnZS5oCkBAIC00OCwxOSArNDgsNTIgQEAKIAl1bnNpZ25lZCBsb25nIGRtYV93aW5kb3dfc2l6ZTsKIH07CiAKKy8qCisgKiBQQ0kgc3R1ZmYsIGZvciBub2RlcyByZXByZXNlbnRpbmcgUENJIGRldmljZXMsIHBvaW50ZWQgdG8KKyAqIGJ5IGRldmljZV9ub2RlLT5kYXRhLgorICovCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CitzdHJ1Y3QgaW9tbXVfdGFibGU7CisKK3N0cnVjdCBwY2lfZG4geworCWludAlidXNubzsJCQkvKiBmb3IgcGNpIGRldmljZXMgKi8KKwlpbnQJYnVzc3Vibm87CQkvKiBmb3IgcGNpIGRldmljZXMgKi8KKwlpbnQJZGV2Zm47CQkJLyogZm9yIHBjaSBkZXZpY2VzICovCisJaW50CWVlaF9tb2RlOwkJLyogU2VlIGVlaC5oIGZvciBwb3NzaWJsZSBFRUhfTU9ERXMgKi8KKwlpbnQJZWVoX2NvbmZpZ19hZGRyOworCWludAllZWhfY2FwYWJsZTsJCS8qIGZyb20gZmlybXdhcmUgKi8KKwlpbnQgCWVlaF9jaGVja19jb3VudDsJLyogIyB0aW1lcyBkcml2ZXIgaWdub3JlZCBlcnJvciAqLworCWludCAJZWVoX2ZyZWV6ZV9jb3VudDsJLyogIyB0aW1lcyB0aGlzIGRldmljZSBmcm96ZSB1cC4gKi8KKwlpbnQJZWVoX2lzX2JyaWRnZTsJCS8qIGRldmljZSBpcyBwY2ktdG8tcGNpIGJyaWRnZSAqLworCisJaW50CXBjaV9leHRfY29uZmlnX3NwYWNlOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KKwlzdHJ1Y3QgIHBjaV9jb250cm9sbGVyICpwaGI7CS8qIGZvciBwY2kgZGV2aWNlcyAqLworCXN0cnVjdAlpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7CS8qIGZvciBwaGIncyBvciBicmlkZ2VzICovCisJc3RydWN0CXBjaV9kZXYgKnBjaWRldjsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBwY2kgZGV2aWNlICovCisJc3RydWN0CWRldmljZV9ub2RlICpub2RlOwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGRldmljZV9ub2RlICovCisJdTMyCWNvbmZpZ19zcGFjZVsxNl07CS8qIHNhdmVkIFBDSSBjb25maWcgc3BhY2UgKi8KK307CisKKy8qIEdldCB0aGUgcG9pbnRlciB0byBhIGRldmljZV9ub2RlJ3MgcGNpX2RuICovCisjZGVmaW5lIFBDSV9ETihkbikJKChzdHJ1Y3QgcGNpX2RuICopIChkbiktPmRhdGEpCisKIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmV0Y2hfZGV2X2RuKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCi0vKiBHZXQgYSBkZXZpY2Vfbm9kZSBmcm9tIGEgcGNpX2Rldi4gIFRoaXMgY29kZSBtdXN0IGJlIGZhc3QgZXhjZXB0IGluIHRoZSBjYXNlCi0gKiB3aGVyZSB0aGUgc3lzZGF0YSBpcyBpbmNvcnJlY3QgYW5kIG5lZWRzIHRvIGJlIGZpeGVkIHVwIChob3BlZnVsbHkganVzdCBvbmNlKQorLyogR2V0IGEgZGV2aWNlX25vZGUgZnJvbSBhIHBjaV9kZXYuICBUaGlzIGNvZGUgbXVzdCBiZSBmYXN0IGV4Y2VwdAorICogaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN5c2RhdGEgaXMgaW5jb3JyZWN0IGFuZCBuZWVkcyB0byBiZSBmaXhlZAorICogdXAgKHRoaXMgd2lsbCBvbmx5IGhhcHBlbiBvbmNlKS4KKyAqIEluIHRoaXMgY2FzZSB0aGUgc3lzZGF0YSB3aWxsIGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSBhIFBDSSBob3N0CisgKiBicmlkZ2Ugb3IgYSBQQ0ktUENJIGJyaWRnZSBmdXJ0aGVyIHVwIHRoZSB0cmVlLCBzbyBpdCB3aWxsIHBvaW50CisgKiB0byBhIHZhbGlkIHN0cnVjdCBwY2lfZG4sIGp1c3Qgbm90IHRoZSBvbmUgd2Ugd2FudC4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaV9kZXZpY2VfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBkZXYtPnN5c2RhdGE7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gZG4tPmRhdGE7CiAKLQlpZiAoZG4tPmRldmZuID09IGRldi0+ZGV2Zm4gJiYgZG4tPmJ1c25vID09IGRldi0+YnVzLT5udW1iZXIpCisJaWYgKHBkbiAmJiBwZG4tPmRldmZuID09IGRldi0+ZGV2Zm4gJiYgcGRuLT5idXNubyA9PSBkZXYtPmJ1cy0+bnVtYmVyKQogCQlyZXR1cm4gZG47CS8qIGZhc3QgcGF0aC4gIHN5c2RhdGEgaXMgZ29vZCAqLwotCWVsc2UKLQkJcmV0dXJuIGZldGNoX2Rldl9kbihkZXYpOworCXJldHVybiBmZXRjaF9kZXZfZG4oZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaV9idXNfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtODMsNyArMTE2LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c2RuID0gYnVzLT5zeXNkYXRhOwogCiAJQlVHX09OKGJ1c2RuID09IE5VTEwpOwotCXJldHVybiBidXNkbi0+cGhiOworCXJldHVybiBQQ0lfRE4oYnVzZG4pLT5waGI7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaAppbmRleCA0ZDA1NzQ1Li5hODhiYmZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wY2kuaApAQCAtMTM4LDYgKzEzOCwxOSBAQAogcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICoKK3BjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7CisKKwlyZXR1cm4gcm9vdDsKK30KKwogZXh0ZXJuIGludAogdW5tYXBfYnVzX3JhbmdlKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oCmluZGV4IDdiZDQ3OTYuLjhiZDdhYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3Byb2Nlc3Nvci5oCkBAIC0zMTEsNiArMzExLDIwIEBACiAJLnR5cGUgR0xVRSguLG5hbWUpLEBmdW5jdGlvbjsgXAogR0xVRSguLG5hbWUpOgogCisjZGVmaW5lIF9LUFJPQkUobmFtZSkgXAorCS5zZWN0aW9uICIua3Byb2Jlcy50ZXh0IiwiYSI7IFwKKwkuYWxpZ24gMiA7IFwKKwkuZ2xvYmwgbmFtZTsgXAorCS5nbG9ibCBHTFVFKC4sbmFtZSk7IFwKKwkuc2VjdGlvbiAiLm9wZCIsImF3IjsgXAorbmFtZTogXAorCS5xdWFkIEdMVUUoLixuYW1lKTsgXAorCS5xdWFkIC5UT0MuQHRvY2Jhc2U7IFwKKwkucXVhZCAwOyBcCisJLnByZXZpb3VzOyBcCisJLnR5cGUgR0xVRSguLG5hbWUpLEBmdW5jdGlvbjsgXAorR0xVRSguLG5hbWUpOgorCiAjZGVmaW5lIF9TVEFUSUMobmFtZSkgXAogCS5zZWN0aW9uICIudGV4dCI7IFwKIAkuYWxpZ24gMiA7IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3Byb20uaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3Byb20uaAppbmRleCBkYzUzMzBiLi5jMDJlYzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvcHJvbS5oCkBAIC0xMTYsMTQgKzExNiw2IEBACiAJc3RydWN0IHByb3BlcnR5ICpuZXh0OwogfTsKIAotLyogTk9URTogdGhlIGRldmljZV9ub2RlIGNvbnRhaW5zIFBDSSBzcGVjaWZpYyBpbmZvIGZvciBwY2kgZGV2aWNlcy4KLSAqIFRoaXMgcGVyaGFwcyBjb3VsZCBiZSBodW5nIG9mZiB0aGUgZGV2aWNlX25vZGUgd2l0aCBhbm90aGVyIHN0cnVjdCwKLSAqIGJ1dCBmb3Igbm93IGl0IGlzIGRpcmVjdGx5IGluIHRoZSBub2RlLiAgVGhlIHBoYiBwdHIgaXMgYSBnb29kCi0gKiBpbmRpY2F0aW9uIG9mIGEgcmVhbCBQQ0kgbm9kZS4gIE90aGVyIG5vZGVzIGxlYXZlIHRoZXNlIGZpZWxkcyB6ZXJvZWQuCi0gKi8KLXN0cnVjdCBwY2lfY29udHJvbGxlcjsKLXN0cnVjdCBpb21tdV90YWJsZTsKLQogc3RydWN0IGRldmljZV9ub2RlIHsKIAljaGFyCSpuYW1lOwogCWNoYXIJKnR5cGU7CkBAIC0xMzUsMTYgKzEyNyw2IEBACiAJc3RydWN0CWludGVycnVwdF9pbmZvICppbnRyczsKIAljaGFyCSpmdWxsX25hbWU7CiAKLQkvKiBQQ0kgc3R1ZmYgcHJvYmFibHkgZG9lc24ndCBiZWxvbmcgaGVyZSAqLwotCWludAlidXNubzsJCQkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlpbnQJYnVzc3Vibm87CQkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlpbnQJZGV2Zm47CQkJLyogZm9yIHBjaSBkZXZpY2VzICovCi0JaW50CWVlaF9tb2RlOwkJLyogU2VlIGVlaC5oIGZvciBwb3NzaWJsZSBFRUhfTU9ERXMgKi8KLQlpbnQJZWVoX2NvbmZpZ19hZGRyOwotCWludAlwY2lfZXh0X2NvbmZpZ19zcGFjZTsJLyogZm9yIHBjaSBkZXZpY2VzICovCi0Jc3RydWN0ICBwY2lfY29udHJvbGxlciAqcGhiOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlzdHJ1Y3QJaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOwkvKiBmb3IgcGhiJ3Mgb3IgYnJpZGdlcyAqLwotCiAJc3RydWN0CXByb3BlcnR5ICpwcm9wZXJ0aWVzOwogCXN0cnVjdAlkZXZpY2Vfbm9kZSAqcGFyZW50OwogCXN0cnVjdAlkZXZpY2Vfbm9kZSAqY2hpbGQ7CkBAIC0xNTQsNiArMTM2LDcgQEAKIAlzdHJ1Y3QgIHByb2NfZGlyX2VudHJ5ICpwZGU7CS8qIHRoaXMgbm9kZSdzIHByb2MgZGlyZWN0b3J5ICovCiAJc3RydWN0ICBrcmVmIGtyZWY7CiAJdW5zaWduZWQgbG9uZyBfZmxhZ3M7CisJdm9pZAkqZGF0YTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2Nob3NlbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3NlZ21lbnQuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3NlZ21lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwZmI2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9zZWdtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19QUEM2NF9TRUdNRU5UX0gKLSNkZWZpbmUgX19QUEM2NF9TRUdNRU5UX0gKLQotLyogT25seSBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSBzb21lIG9sZCBoZWFkZXIgZmlsZXMgdGhhdCBleHBlY3QgaXQuLiAqLwotCi0jZW5kaWYgLyogX19QUEM2NF9TRUdNRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3NldHVwLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9zZXR1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU3YjgzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3NldHVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX1BQQ19TRVRVUF9ICi0jZGVmaW5lIF9QUENfU0VUVVBfSAotCi0jZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDUxMgotCi0jZW5kaWYgLyogX1BQQ19TRVRVUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tcHBjNjQvc3BpbmxvY2suaAppbmRleCBhY2QxMTU2Li4xNGNiODk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3NwaW5sb2NrLmgKQEAgLTE1LDM2ICsxNSw0MiBAQAogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAodGhlIHR5cGUgZGVmaW5pdGlvbnMgYXJlIGluIGFzbS9zcGlubG9ja190eXBlcy5oKQogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZDYWxsLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHNwaW5sb2NrX3Q7CisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpCQkoKHgpLT5zbG9jayAhPSAwKQogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgc2lnbmVkIGludCBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCkgeyAwIH0KLQotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCi0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKKy8qCisgKiBUaGlzIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBpbiB0aGUgbG9jaywgc28gd2Ugc3VjY2VlZGVkCisgKiBpbiBnZXR0aW5nIHRoZSBsb2NrIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgMC4KKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBfX3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibHdzeW5jCSMgc3Bpbl91bmxvY2siOiA6IDoibWVtb3J5Iik7Ci0JbG9jay0+bG9jayA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXAsIHRtcDI7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIJbHd6CQklMSwlMygxMykJCSMgX19zcGluX3RyeWxvY2tcblwKKzE6CWx3YXJ4CQklMCwwLCUyXG5cCisJY21wd2kJCTAsJTAsMFxuXAorCWJuZS0JCTJmXG5cCisJc3R3Y3guCQklMSwwLCUyXG5cCisJYm5lLQkJMWJcblwKKwlpc3luY1xuXAorMjoiCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKQorCTogInIiICgmbG9jay0+c2xvY2spLCAiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgbG9ja190b2tlbikpCisJOiAiY3IwIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGludCBfX2lubGluZV9fIF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlyZXR1cm4gX19zcGluX3RyeWxvY2sobG9jaykgPT0gMDsKIH0KIAogLyoKQEAgLTY0LDQ0ICs3MCwxNSBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19TUExQQVIpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKQogLyogV2Ugb25seSB5aWVsZCB0byB0aGUgaHlwZXJ2aXNvciBpZiB3ZSBhcmUgaW4gc2hhcmVkIHByb2Nlc3NvciBtb2RlICovCiAjZGVmaW5lIFNIQVJFRF9QUk9DRVNTT1IgKGdldF9wYWNhKCktPmxwcGFjYS5zaGFyZWRfcHJvYykKLWV4dGVybiB2b2lkIF9fc3Bpbl95aWVsZChzcGlubG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIF9fcndfeWllbGQocndsb2NrX3QgKmxvY2spOworZXh0ZXJuIHZvaWQgX19zcGluX3lpZWxkKHJhd19zcGlubG9ja190ICpsb2NrKTsKK2V4dGVybiB2b2lkIF9fcndfeWllbGQocmF3X3J3bG9ja190ICpsb2NrKTsKICNlbHNlIC8qIFNQTFBBUiB8fCBJU0VSSUVTICovCiAjZGVmaW5lIF9fc3Bpbl95aWVsZCh4KQliYXJyaWVyKCkKICNkZWZpbmUgX19yd195aWVsZCh4KQliYXJyaWVyKCkKICNkZWZpbmUgU0hBUkVEX1BST0NFU1NPUgkwCiAjZW5kaWYKLWV4dGVybiB2b2lkIHNwaW5fdW5sb2NrX3dhaXQoc3BpbmxvY2tfdCAqbG9jayk7CiAKLS8qCi0gKiBUaGlzIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBpbiB0aGUgbG9jaywgc28gd2Ugc3VjY2VlZGVkCi0gKiBpbiBnZXR0aW5nIHRoZSBsb2NrIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgMC4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBfX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQotewotCXVuc2lnbmVkIGxvbmcgdG1wLCB0bXAyOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCWx3egkJJTEsJTMoMTMpCQkjIF9fc3Bpbl90cnlsb2NrXG5cCi0xOglsd2FyeAkJJTAsMCwlMlxuXAotCWNtcHdpCQkwLCUwLDBcblwKLQlibmUtCQkyZlxuXAotCXN0d2N4LgkJJTEsMCwlMlxuXAotCWJuZS0JCTFiXG5cCi0JaXN5bmNcblwKLTI6Igk6ICI9JnIiICh0bXApLCAiPSZyIiAodG1wMikKLQk6ICJyIiAoJmxvY2stPmxvY2spLCAiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgbG9ja190b2tlbikpCi0JOiAiY3IwIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIHRtcDsKLX0KLQotc3RhdGljIGludCBfX2lubGluZV9fIF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCi17Ci0JcmV0dXJuIF9fc3Bpbl90cnlsb2NrKGxvY2spID09IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5saW5lX18gX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXdoaWxlICgxKSB7CiAJCWlmIChsaWtlbHkoX19zcGluX3RyeWxvY2sobG9jaykgPT0gMCkpCkBAIC0xMTAsMTIgKzg3LDEyIEBACiAJCQlITVRfbG93KCk7CiAJCQlpZiAoU0hBUkVEX1BST0NFU1NPUikKIAkJCQlfX3NwaW5feWllbGQobG9jayk7Ci0JCX0gd2hpbGUgKHVubGlrZWx5KGxvY2stPmxvY2sgIT0gMCkpOworCQl9IHdoaWxlICh1bmxpa2VseShsb2NrLT5zbG9jayAhPSAwKSk7CiAJCUhNVF9tZWRpdW0oKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5saW5lX18gX3Jhd19zcGluX2xvY2tfZmxhZ3Moc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKHJhd19zcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3NfZGlzOwogCkBAIC0xMjgsMTIgKzEwNSwyMCBAQAogCQkJSE1UX2xvdygpOwogCQkJaWYgKFNIQVJFRF9QUk9DRVNTT1IpCiAJCQkJX19zcGluX3lpZWxkKGxvY2spOwotCQl9IHdoaWxlICh1bmxpa2VseShsb2NrLT5sb2NrICE9IDApKTsKKwkJfSB3aGlsZSAodW5saWtlbHkobG9jay0+c2xvY2sgIT0gMCkpOwogCQlITVRfbWVkaXVtKCk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzX2Rpcyk7CiAJfQogfQogCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsd3N5bmMJIyBfX3Jhd19zcGluX3VubG9jayI6IDogOiJtZW1vcnkiKTsKKwlsb2NrLT5zbG9jayA9IDA7Cit9CisKK2V4dGVybiB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQocmF3X3NwaW5sb2NrX3QgKmxvY2spOworCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKICAqIGJ1dCBvbmx5IG9uZSB3cml0ZXIuCkBAIC0xNDQsMjQgKzEyOSwxNSBAQAogICogaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQogICogcmVhZC1sb2Nrcy4KICAqLwotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyAwIH0KIAotI2RlZmluZSByd2xvY2tfaW5pdCh4KQkJZG8geyAqKHgpID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2socncpCSgocncpLT5sb2NrID49IDApCi0jZGVmaW5lIHdyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKnJ3KQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsd3N5bmMJCSMgd3JpdGVfdW5sb2NrIjogOiA6Im1lbW9yeSIpOwotCXJ3LT5sb2NrID0gMDsKLX0KKyNkZWZpbmUgX19yYXdfcmVhZF9jYW5fbG9jayhydykJCSgocncpLT5sb2NrID49IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCiAKIC8qCiAgKiBUaGlzIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBpbiB0aGUgbG9jayArIDEsCiAgKiBzbyB3ZSBnb3QgYSByZWFkIGxvY2sgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyA+IDAuCiAgKi8KLXN0YXRpYyBsb25nIF9faW5saW5lX18gX19yZWFkX3RyeWxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGxvbmcgX19pbmxpbmVfXyBfX3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCWxvbmcgdG1wOwogCkBAIC0xODAsNDUgKzE1NiwxMSBAQAogCXJldHVybiB0bXA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbmxpbmVfXyBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqcncpCi17Ci0JcmV0dXJuIF9fcmVhZF90cnlsb2NrKHJ3KSA+IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5saW5lX18gX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKnJ3KQotewotCXdoaWxlICgxKSB7Ci0JCWlmIChsaWtlbHkoX19yZWFkX3RyeWxvY2socncpID4gMCkpCi0JCQlicmVhazsKLQkJZG8gewotCQkJSE1UX2xvdygpOwotCQkJaWYgKFNIQVJFRF9QUk9DRVNTT1IpCi0JCQkJX19yd195aWVsZChydyk7Ci0JCX0gd2hpbGUgKHVubGlrZWx5KHJ3LT5sb2NrIDwgMCkpOwotCQlITVRfbWVkaXVtKCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2lubGluZV9fIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQotewotCWxvbmcgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JImVpZWlvCQkJCSMgcmVhZF91bmxvY2tcblwKLTE6CWx3YXJ4CQklMCwwLCUxXG5cCi0JYWRkaWMJCSUwLCUwLC0xXG5cCi0Jc3R3Y3guCQklMCwwLCUxXG5cCi0JYm5lLQkJMWIiCi0JOiAiPSZyIih0bXApCi0JOiAiciIoJnJ3LT5sb2NrKQotCTogImNyMCIsICJtZW1vcnkiKTsKLX0KLQogLyoKICAqIFRoaXMgcmV0dXJucyB0aGUgb2xkIHZhbHVlIGluIHRoZSBsb2NrLAogICogc28gd2UgZ290IHRoZSB3cml0ZSBsb2NrIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgMC4KICAqLwotc3RhdGljIF9faW5saW5lX18gbG9uZyBfX3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIF9faW5saW5lX18gbG9uZyBfX3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKIAlsb25nIHRtcCwgdG1wMjsKIApAQCAtMjM3LDEyICsxNzksMjEgQEAKIAlyZXR1cm4gdG1wOwogfQogCi1zdGF0aWMgaW50IF9faW5saW5lX18gX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7Ci0JcmV0dXJuIF9fd3JpdGVfdHJ5bG9jayhydykgPT0gMDsKKwl3aGlsZSAoMSkgeworCQlpZiAobGlrZWx5KF9fcmVhZF90cnlsb2NrKHJ3KSA+IDApKQorCQkJYnJlYWs7CisJCWRvIHsKKwkJCUhNVF9sb3coKTsKKwkJCWlmIChTSEFSRURfUFJPQ0VTU09SKQorCQkJCV9fcndfeWllbGQocncpOworCQl9IHdoaWxlICh1bmxpa2VseShydy0+bG9jayA8IDApKTsKKwkJSE1UX21lZGl1bSgpOworCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIHZvaWQgX19pbmxpbmVfXyBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJd2hpbGUgKDEpIHsKIAkJaWYgKGxpa2VseShfX3dyaXRlX3RyeWxvY2socncpID09IDApKQpAQCAtMjU2LDUgKzIwNywzNSBAQAogCX0KIH0KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KK3N0YXRpYyBpbnQgX19pbmxpbmVfXyBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlyZXR1cm4gX19yZWFkX3RyeWxvY2socncpID4gMDsKK30KKworc3RhdGljIGludCBfX2lubGluZV9fIF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlyZXR1cm4gX193cml0ZV90cnlsb2NrKHJ3KSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJbG9uZyB0bXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiZWllaW8JCQkJIyByZWFkX3VubG9ja1xuXAorMToJbHdhcngJCSUwLDAsJTFcblwKKwlhZGRpYwkJJTAsJTAsLTFcblwKKwlzdHdjeC4JCSUwLDAsJTFcblwKKwlibmUtCQkxYiIKKwk6ICI9JnIiKHRtcCkKKwk6ICJyIigmcnctPmxvY2spCisJOiAiY3IwIiwgIm1lbW9yeSIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsd3N5bmMJIyB3cml0ZV91bmxvY2siOiA6IDoibWVtb3J5Iik7CisJcnctPmxvY2sgPSAwOworfQorCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3YzhlYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHNpZ25lZCBpbnQgbG9jazsKK30gcmF3X3J3bG9ja190OworCisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgMCB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvdGltZXguaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjRkYTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvdGltZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS1wcGMvdGltZXguaAotICoKLSAqIFBQQzY0IGFyY2hpdGVjdHVyZSB0aW1leCBzcGVjaWZpY2F0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpZm5kZWYgX0FTTVBQQzY0X1RJTUVYX0gKLSNkZWZpbmUgX0FTTVBQQzY0X1RJTUVYX0gKLQotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MCAvKiBVbmRlcmx5aW5nIEhaICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBjeWNsZXNfdDsKLQotc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzKHZvaWQpCi17Ci0JY3ljbGVzX3QgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mdGIgJTAiIDogIj1yIiAocmV0KSA6ICk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1wcGM2NC91YWNjZXNzLmgKaW5kZXggMDViNTk0My4uYzE4MWE2MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC91YWNjZXNzLmgKQEAgLTU2LDEzICs1Niw2IEBACiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgXAogCV9fYWNjZXNzX29rKCgoX19mb3JjZSB1bnNpZ25lZCBsb25nKShhZGRyKSksKHNpemUpLGdldF9mcygpKQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCi0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC91c2VyLmggYi9pbmNsdWRlL2FzbS1wcGM2NC91c2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDY1NTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBfUFBDX1VTRVJfSAotI2RlZmluZSBfUFBDX1VTRVJfSAotCi0vKiBBZGFwdGVkIGZyb20gPGFzbS1hbHBoYS91c2VyLmg+IAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0vKgotICogQ29yZSBmaWxlIGZvcm1hdDogVGhlIGNvcmUgZmlsZSBpcyB3cml0dGVuIGluIHN1Y2ggYSB3YXkgdGhhdCBnZGIKLSAqIGNhbiB1bmRlcnN0YW5kIGl0IGFuZCBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciAodW5kZXIKLSAqIGxpbnV4IHdlIHVzZSB0aGUgYHRyYWQtY29yZScgYmZkLCBOT1QgdGhlIG9zZi1jb3JlKS4gIFRoZSBmaWxlIGNvbnRlbnRzCi0gKiBhcmUgYXMgZm9sbG93czoKLSAqCi0gKiAgdXBhZ2U6IDEgcGFnZSBjb25zaXN0aW5nIG9mIGEgdXNlciBzdHJ1Y3QgdGhhdCB0ZWxscyBnZGIKLSAqCXdoYXQgaXMgcHJlc2VudCBpbiB0aGUgZmlsZS4gIERpcmVjdGx5IGFmdGVyIHRoaXMgaXMgYQotICoJY29weSBvZiB0aGUgdGFza19zdHJ1Y3QsIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgdXNlZCBieSBnZGIsCi0gKglidXQgaXQgbWF5IGNvbWUgaW4gaGFuZHkgYXQgc29tZSBwb2ludC4gIEFsbCBvZiB0aGUgcmVnaXN0ZXJzCi0gKglhcmUgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIHVwYWdlLiAgVGhlIHVwYWdlIHNob3VsZCBhbHdheXMgYmUKLSAqCW9ubHkgb25lIHBhZ2UgbG9uZy4KLSAqICBkYXRhOiBUaGUgZGF0YSBzZWdtZW50IGZvbGxvd3MgbmV4dC4gIFdlIHVzZSBjdXJyZW50LT5lbmRfdGV4dCB0bwotICoJY3VycmVudC0+YnJrIHRvIHBpY2sgdXAgYWxsIG9mIHRoZSB1c2VyIHZhcmlhYmxlcywgcGx1cyBhbnkgbWVtb3J5Ci0gKgl0aGF0IG1heSBoYXZlIGJlZW4gc2JyaydlZC4gIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZXRlcm1pbmUgaWYgYQotICoJcGFnZSBpcyBkZW1hbmQtemVybyBvciBpZiBhIHBhZ2UgaXMgdG90YWxseSB1bnVzZWQsIHdlIGp1c3QgY292ZXIKLSAqCXRoZSBlbnRpcmUgcmFuZ2UuICBBbGwgb2YgdGhlIGFkZHJlc3NlcyBhcmUgcm91bmRlZCBpbiBzdWNoIGEgd2F5Ci0gKgl0aGF0IGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcyBpcyB3cml0dGVuLgotICogIHN0YWNrOiBXZSBuZWVkIHRoZSBzdGFjayBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBnZXQgYSBtZWFuaW5nZnVsCi0gKgliYWNrdHJhY2UuICBXZSBuZWVkIHRvIHdyaXRlIHRoZSBkYXRhIGZyb20gdXNwIHRvCi0gKgljdXJyZW50LT5zdGFydF9zdGFjaywgc28gd2Ugcm91bmQgZWFjaCBvZiB0aGVzZSBpbiBvcmRlciB0byBiZSBhYmxlCi0gKgl0byB3cml0ZSBhbiBpbnRlZ2VyIG51bWJlciBvZiBwYWdlcy4KLSAqLwotc3RydWN0IHVzZXIgewotCXN0cnVjdCBwdF9yZWdzCXJlZ3M7CQkJLyogZW50aXJlIG1hY2hpbmUgc3RhdGUgKi8KLQlzaXplX3QJCXVfdHNpemU7CQkvKiB0ZXh0IHNpemUgKHBhZ2VzKSAqLwotCXNpemVfdAkJdV9kc2l6ZTsJCS8qIGRhdGEgc2l6ZSAocGFnZXMpICovCi0Jc2l6ZV90CQl1X3NzaXplOwkJLyogc3RhY2sgc2l6ZSAocGFnZXMpICovCi0JdW5zaWduZWQgbG9uZwlzdGFydF9jb2RlOwkJLyogdGV4dCBzdGFydGluZyBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZwlzdGFydF9kYXRhOwkJLyogZGF0YSBzdGFydGluZyBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZwlzdGFydF9zdGFjazsJCS8qIHN0YWNrIHN0YXJ0aW5nIGFkZHJlc3MgKi8KLQlsb25nIGludAlzaWduYWw7CQkJLyogc2lnbmFsIGNhdXNpbmcgY29yZSBkdW1wICovCi0Jc3RydWN0IHJlZ3MgKgl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGxvbmcJbWFnaWM7CQkJLyogaWRlbnRpZmllcyBhIGNvcmUgZmlsZSAqLwotCWNoYXIJCXVfY29tbVszMl07CQkvKiB1c2VyIGNvbW1hbmQgbmFtZSAqLwotfTsKLQotI2RlZmluZSBOQlBHCQkJUEFHRV9TSVpFCi0jZGVmaW5lIFVQQUdFUwkJCTEKLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIJKHUuc3RhcnRfY29kZSkKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIJKHUuc3RhcnRfZGF0YSkKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUgkodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCi0KLSNlbmRpZiAvKiBfUFBDX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXMzOTAvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzNDA3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvYXV4dmVjLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQVNNUzM5MF9BVVhWRUNfSAorI2RlZmluZSBfX0FTTVMzOTBfQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaAppbmRleCA3ZjhmNTQ0Li5hMDA3NzE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmgKQEAgLTEzLDEwICsxMywxMCBAQAogdHlwZWRlZiBzMzIJCWNvbXBhdF90aW1lX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2Nsb2NrX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MTYJCWNvbXBhdF91aWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfZ2lkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X3VpZDMyX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZDMyX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9tb2RlX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2lub190OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9kZXZfdDsKQEAgLTUxLDggKzUxLDggQEAKIAljb21wYXRfaW5vX3QJc3RfaW5vOwogCWNvbXBhdF9tb2RlX3QJc3RfbW9kZTsKIAljb21wYXRfbmxpbmtfdAlzdF9ubGluazsKLQljb21wYXRfdWlkX3QJc3RfdWlkOwotCWNvbXBhdF9naWRfdAlzdF9naWQ7CisJX19jb21wYXRfdWlkX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZF90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAl1MTYJCV9fcGFkMjsKIAl1MzIJCXN0X3NpemU7CkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gewogCWNvbXBhdF9rZXlfdCBrZXk7Ci0JY29tcGF0X3VpZDMyX3QgdWlkOwotCWNvbXBhdF9naWQzMl90IGdpZDsKLQljb21wYXRfdWlkMzJfdCBjdWlkOwotCWNvbXBhdF9naWQzMl90IGNnaWQ7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKIAljb21wYXRfbW9kZV90IG1vZGU7CiAJdW5zaWduZWQgc2hvcnQgX19wYWQxOwogCXVuc2lnbmVkIHNob3J0IHNlcTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZmNudGwuaAppbmRleCA0OGY2OTJiLi40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9mY250bC5oCkBAIC0xLDk3ICsxIEBACi0vKgotICogIGluY2x1ZGUvYXNtLXMzOTAvZmNudGwuaAotICoKLSAqICBTMzkwIHZlcnNpb24KLSAqCi0gKiAgRGVyaXZlZCBmcm9tICJpbmNsdWRlL2FzbS1pMzg2L2ZjbnRsLmgiCi0gKi8KLSNpZm5kZWYgX1MzOTBfRkNOVExfSAotI2RlZmluZSBfUzM5MF9GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0jaWZuZGVmIF9fczM5MHhfXwotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLSNlbmRpZiAvKiAhIF9fczM5MHhfXyAqLwotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgbF90eXBlOwotCXNob3J0IGxfd2hlbmNlOwotCW9mZl90IGxfc3RhcnQ7Ci0Jb2ZmX3QgbF9sZW47Ci0JcGlkX3QgbF9waWQ7Ci19OwotCi0jaWZuZGVmIF9fczM5MHhfXwotc3RydWN0IGZsb2NrNjQgewotCXNob3J0ICBsX3R5cGU7Ci0Jc2hvcnQgIGxfd2hlbmNlOwotCWxvZmZfdCBsX3N0YXJ0OwotCWxvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotI2VuZGlmCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0Ci0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9mdXRleC5oIGIvaW5jbHVkZS9hc20tczM5MC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1zMzkwL3NwaW5sb2NrLmgKaW5kZXggMzIxYjIzYi4uMjczZGJlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc3BpbmxvY2suaApAQCAtMjcsMjUgKzI3LDE5IEBACiAgKiBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yLCBvbmUgZG9lcyBub3QuCiAgKgogICogV2UgbWFrZSBubyBmYWlybmVzcyBhc3N1bXB0aW9ucy4gVGhleSBoYXZlIGEgY29zdC4KKyAqCisgKiAodGhlIHR5cGUgZGVmaW5pdGlvbnMgYXJlIGluIGFzbS9zcGlubG9ja190eXBlcy5oKQogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpIHNwaW5sb2NrX3Q7CisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpICgoeCktPmxvY2sgIT0gMCkKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCkgeyAwIH0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQobHApCWRvIHsgKGxwKS0+bG9jayA9IDA7IH0gd2hpbGUoMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdChscCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUoKCh2b2xhdGlsZSBzcGlubG9ja190ICopKGxwKSktPmxvY2spCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCitleHRlcm4gdm9pZCBfcmF3X3NwaW5fbG9ja193YWl0KHJhd19zcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKTsKK2V4dGVybiBpbnQgX3Jhd19zcGluX3RyeWxvY2tfcmV0cnkocmF3X3NwaW5sb2NrX3QgKmxwLCB1bnNpZ25lZCBpbnQgcGMpOwogCi1leHRlcm4gdm9pZCBfcmF3X3NwaW5fbG9ja193YWl0KHNwaW5sb2NrX3QgKmxwLCB1bnNpZ25lZCBpbnQgcGMpOwotZXh0ZXJuIGludCBfcmF3X3NwaW5fdHJ5bG9ja19yZXRyeShzcGlubG9ja190ICpscCwgdW5zaWduZWQgaW50IHBjKTsKLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxwKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbHApCiB7CiAJdW5zaWduZWQgbG9uZyBwYyA9IDEgfCAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwogCkBAIC01Myw3ICs0Nyw3IEBACiAJCV9yYXdfc3Bpbl9sb2NrX3dhaXQobHAsIHBjKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbHApCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxwKQogewogCXVuc2lnbmVkIGxvbmcgcGMgPSAxIHwgKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKIApAQCAtNjIsNyArNTYsNyBAQAogCXJldHVybiBfcmF3X3NwaW5fdHJ5bG9ja19yZXRyeShscCwgcGMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpscCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbHApCiB7CiAJX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZscC0+bG9jaywgbHAtPmxvY2ssIDApOwogfQpAQCAtNzcsMzYgKzcxLDI1IEBACiAgKiBpcnEtc2FmZSB3cml0ZS1sb2NrLCBidXQgcmVhZGVycyBjYW4gZ2V0IG5vbi1pcnFzYWZlCiAgKiByZWFkLWxvY2tzLgogICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvd25lcl9wYzsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IDAsIDAgfQotCi0jZGVmaW5lIHJ3bG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKIAogLyoqCiAgKiByZWFkX2Nhbl9sb2NrIC0gd291bGQgcmVhZF90cnlsb2NrKCkgc3VjY2VlZD8KICAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgogICovCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2soeCkgKChpbnQpKHgpLT5sb2NrID49IDApCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2soeCkgKChpbnQpKHgpLT5sb2NrID49IDApCiAKIC8qKgogICogd3JpdGVfY2FuX2xvY2sgLSB3b3VsZCB3cml0ZV90cnlsb2NrKCkgc3VjY2VlZD8KICAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgogICovCi0jZGVmaW5lIHdyaXRlX2Nhbl9sb2NrKHgpICgoeCktPmxvY2sgPT0gMCkKKyNkZWZpbmUgX19yYXdfd3JpdGVfY2FuX2xvY2soeCkgKCh4KS0+bG9jayA9PSAwKQogCi1leHRlcm4gdm9pZCBfcmF3X3JlYWRfbG9ja193YWl0KHJ3bG9ja190ICpscCk7Ci1leHRlcm4gaW50IF9yYXdfcmVhZF90cnlsb2NrX3JldHJ5KHJ3bG9ja190ICpscCk7Ci1leHRlcm4gdm9pZCBfcmF3X3dyaXRlX2xvY2tfd2FpdChyd2xvY2tfdCAqbHApOwotZXh0ZXJuIGludCBfcmF3X3dyaXRlX3RyeWxvY2tfcmV0cnkocndsb2NrX3QgKmxwKTsKK2V4dGVybiB2b2lkIF9yYXdfcmVhZF9sb2NrX3dhaXQocmF3X3J3bG9ja190ICpscCk7CitleHRlcm4gaW50IF9yYXdfcmVhZF90cnlsb2NrX3JldHJ5KHJhd19yd2xvY2tfdCAqbHApOworZXh0ZXJuIHZvaWQgX3Jhd193cml0ZV9sb2NrX3dhaXQocmF3X3J3bG9ja190ICpscCk7CitleHRlcm4gaW50IF9yYXdfd3JpdGVfdHJ5bG9ja19yZXRyeShyYXdfcndsb2NrX3QgKmxwKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKIAl1bnNpZ25lZCBpbnQgb2xkOwogCW9sZCA9IHJ3LT5sb2NrICYgMHg3ZmZmZmZmZlU7CkBAIC0xMTQsNyArOTcsNyBAQAogCQlfcmF3X3JlYWRfbG9ja193YWl0KHJ3KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgY21wOwogCkBAIC0xMjUsMTggKzEwOCwxOCBAQAogCX0gd2hpbGUgKGNtcCAhPSBvbGQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJaWYgKHVubGlrZWx5KF9yYXdfY29tcGFyZV9hbmRfc3dhcCgmcnctPmxvY2ssIDAsIDB4ODAwMDAwMDApICE9IDApKQogCQlfcmF3X3dyaXRlX2xvY2tfd2FpdChydyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZydy0+bG9jaywgMHg4MDAwMDAwMCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCXVuc2lnbmVkIGludCBvbGQ7CiAJb2xkID0gcnctPmxvY2sgJiAweDdmZmZmZmZmVTsKQEAgLTE0NSw3ICsxMjgsNyBAQAogCXJldHVybiBfcmF3X3JlYWRfdHJ5bG9ja19yZXRyeShydyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJaWYgKGxpa2VseShfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJnJ3LT5sb2NrLCAwLCAweDgwMDAwMDAwKSA9PSAwKSkKIAkJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zMzkwL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5YTIyMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSkgcmF3X3NwaW5sb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VECXsgMCB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgb3duZXJfcGM7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAsIDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmgKaW5kZXggM2UzYmZlNi4uMzhhNWNmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmgKQEAgLTY1LDEzICs2NSw2IEBACiAKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSBfX2FjY2Vzc19vayhhZGRyLHNpemUpCiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotZXh0ZXJuIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqYWRkciwKLQkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXNoL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjFlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9hdXh2ZWMuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19BU01fU0hfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01fU0hfQVVYVkVDX0gKKworI2VuZGlmIC8qIF9fQVNNX1NIX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mY250bC5oIGIvaW5jbHVkZS9hc20tc2gvZmNudGwuaAppbmRleCAwYjNhZTUyLi40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2ZjbnRsLmgKQEAgLTEsODggKzEgQEAKLSNpZm5kZWYgX19BU01fU0hfRkNOVExfSAotI2RlZmluZSBfX0FTTV9TSF9GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAtIGN1cnJlbnRseSBpZ25vcmVkICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAxMDAwMDAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDIwMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDQwMDAwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX0dFVExLCQk1Ci0jZGVmaW5lIEZfU0VUTEsJCTYKLSNkZWZpbmUgRl9TRVRMS1cJNwotCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAotI2VuZGlmIC8qIF9fQVNNX1NIX0ZDTlRMX0ggKi8KLQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mdXRleC5oIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1zaC9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmZDFhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycS5oIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKaW5kZXggODMxZTUyZS4uNjE0YThjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKQEAgLTU4NywxMCArNTg3LDYgQEAKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpcnEpCShpcnEpCiAjZGVmaW5lIGlycV9kZW11eChpcnEpCQlfX2lycV9kZW11eChzaF9tdi5tdl9pcnFfZGVtdXgoaXJxKSkKIAotc3RydWN0IGlycWFjdGlvbjsKLXN0cnVjdCBwdF9yZWdzOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOwotCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkKICNpbmNsdWRlIDxhc20vaXJxLXNoNzMxODAuaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXNoL3NwaW5sb2NrLmgKaW5kZXggZTc3MGI1NS4uODQ2MzIyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zcGlubG9jay5oCkBAIC0xNSwyMCArMTUsMTEgQEAKIC8qCiAgKiBZb3VyIGJhc2ljIFNNUCBzcGlubG9ja3MsIGFsbG93aW5nIG9ubHkgYSBzaW5nbGUgQ1BVIGFueXdoZXJlCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwogCi0jZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRAkoc3BpbmxvY2tfdCkgeyAwIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KQkoKHgpLT5sb2NrICE9IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUgKHNwaW5faXNfbG9ja2VkKHgpKQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkJKCh4KS0+bG9jayAhPSAwKQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKKwlkbyB7IGNwdV9yZWxheCgpOyB9IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZCh4KSkKIAogLyoKICAqIFNpbXBsZSBzcGluIGxvY2sgb3BlcmF0aW9ucy4gIFRoZXJlIGFyZSB0d28gdmFyaWFudHMsIG9uZSBjbGVhcnMgSVJRJ3MKQEAgLTM2LDcgKzI3LDcgQEAKICAqCiAgKiBXZSBtYWtlIG5vIGZhaXJuZXNzIGFzc3VtcHRpb25zLiAgVGhleSBoYXZlIGEgY29zdC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgKIAkJIjE6XG5cdCIKQEAgLTQ5LDE0ICs0MCwxNCBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spOwogCiAJbG9jay0+bG9jayA9IDA7CiB9CiAKLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2soeCkgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICYoeCktPmxvY2spKQorI2RlZmluZSBfX3Jhd19zcGluX3RyeWxvY2soeCkgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICYoeCktPmxvY2spKQogCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMgYnV0IG9ubHkgb25lIHdyaXRlci4KQEAgLTY2LDUxICs1Nyw0MCBAQAogICogbmVlZHMgdG8gZ2V0IGEgaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQogICogcmVhZC1sb2Nrcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXNwaW5sb2NrX3QgbG9jazsKLQlhdG9taWNfdCBjb3VudGVyOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7CiAKLSNkZWZpbmUgUldfTE9DS19CSUFTCQkweDAxMDAwMDAwCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQJKHJ3bG9ja190KSB7IHsgMCB9LCB7IFJXX0xPQ0tfQklBUyB9IH0KLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJCWRvIHsgKih4KSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7Ci0JX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKKwlfX3Jhd19zcGluX2xvY2soJnJ3LT5sb2NrKTsKIAogCWF0b21pY19pbmMoJnJ3LT5jb3VudGVyKTsKIAotCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKKwlfX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwogCiAJYXRvbWljX2RlYygmcnctPmNvdW50ZXIpOwogCi0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOworCV9fcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwogCWF0b21pY19zZXQoJnJ3LT5jb3VudGVyLCAtMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7CiAJYXRvbWljX3NldCgmcnctPmNvdW50ZXIsIDApOwotCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKKwlfX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwogfQogCi0jZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewogCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KFJXX0xPQ0tfQklBUywgJnJ3LT5jb3VudGVyKSkKIAkJcmV0dXJuIDE7CkBAIC0xMjEsNCArMTAxLDMgQEAKIH0KIAogI2VuZGlmIC8qIF9fQVNNX1NIX1NQSU5MT0NLX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc3BpbmxvY2tfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXNoL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0MWI2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX0FTTV9TSF9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NIX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1NQSU5fTE9DS19VTkxPQ0tFRAkJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXJhd19zcGlubG9ja190IGxvY2s7CisJYXRvbWljX3QgY291bnRlcjsKK30gcmF3X3J3bG9ja190OworCisjZGVmaW5lIFJXX0xPQ0tfQklBUwkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyB7IDAgfSwgeyBSV19MT0NLX0JJQVMgfSB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oCmluZGV4IGZiOWUzMzQuLjJjYjAxODYxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaApAQCAtMTQ2LDEyICsxNDYsNiBAQAogCXJldHVybiBfX2FjY2Vzc19vayhhZGRyLCBzaXplKTsKIH0KIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBVaCwgdGhlc2Ugc2hvdWxkIGJlY29tZSB0aGUgbWFpbiBzaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMgLi4uCiAgKiBUaGV5IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSByaWdodCBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1zaDY0L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDVhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTV9TSDY0X0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX1NINjRfQVVYVkVDX0gKKworI2VuZGlmIC8qIF9fQVNNX1NINjRfQVVYVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXNoNjQvZmNudGwuaAppbmRleCBmZmNjMzZjLi43NDRkZDc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9mY250bC5oCkBAIC0xLDcgKzEgQEAKLSNpZm5kZWYgX19BU01fU0g2NF9GQ05UTF9ICi0jZGVmaW5lIF9fQVNNX1NINjRfRkNOVExfSAotCiAjaW5jbHVkZSA8YXNtLXNoL2ZjbnRsLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSDY0X0ZDTlRMX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9mdXRleC5oIGIvaW5jbHVkZS9hc20tc2g2NC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2hkcmVnLmggYi9pbmNsdWRlL2FzbS1zaDY0L2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDk4MzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NINjRfSERSRUdfSAotI2RlZmluZSBfX0FTTV9TSDY0X0hEUkVHX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hkcmVnLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSDY0X0hEUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKaW5kZXggYTMzNjU0ZC4uNTZhYTNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKQEAgLTYwLDEyICs2MCw2IEBACiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgKF9fcmFuZ2Vfb2soYWRkcixzaXplKSA9PSAwKQogI2RlZmluZSBfX2FjY2Vzc19vayhhZGRyLHNpemUpIChfX3JhbmdlX29rKGFkZHIsc2l6ZSkgPT0gMCkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qCiAgKiBVaCwgdGhlc2Ugc2hvdWxkIGJlY29tZSB0aGUgbWFpbiBzaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMgLi4uCiAgKiBUaGV5IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSByaWdodCBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ZjM2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTVNQQVJDX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNU1BBUkNfQVVYVkVDX0gKKworI2VuZGlmIC8qICEoX19BU01TUEFSQ19BVVhWRUNfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9mY250bC5oCmluZGV4IGRmOWM3NWQuLjVkYjYwYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZmNudGwuaApAQCAtNCwxMCArNCw2IEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX1JET05MWQkweDAwMDAKLSNkZWZpbmUgT19XUk9OTFkJMHgwMDAxCi0jZGVmaW5lIE9fUkRXUgkJMHgwMDAyCi0jZGVmaW5lIE9fQUNDTU9ERQkweDAwMDMKICNkZWZpbmUgT19BUFBFTkQJMHgwMDA4CiAjZGVmaW5lIEZBU1lOQwkJMHgwMDQwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19DUkVBVAkJMHgwMjAwCS8qIG5vdCBmY250bCAqLwpAQCAtMTcsNzMgKzEzLDI0IEBACiAjZGVmaW5lIE9fTk9OQkxPQ0sJMHg0MDAwCiAjZGVmaW5lIE9fTkRFTEFZCSgweDAwMDQgfCBPX05PTkJMT0NLKQogI2RlZmluZSBPX05PQ1RUWQkweDgwMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRElSRUNUT1JZCTB4MTAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTB4MjAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTB4NDAwMDAKICNkZWZpbmUgT19ESVJFQ1QgICAgICAgIDB4MTAwMDAwIC8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50ICovCiAjZGVmaW5lIE9fTk9BVElNRQkweDIwMDAwMAogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KICNkZWZpbmUgRl9HRVRPV04JNQkvKiAgZm9yIHNvY2tldHMuICovCiAjZGVmaW5lIEZfU0VUT1dOCTYJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVExLCQk3CiAjZGVmaW5lIEZfU0VUTEsJCTgKICNkZWZpbmUgRl9TRVRMS1cJOQotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KLQotI2RlZmluZSBGX0dFVExLNjQJMTIJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KLSNkZWZpbmUgRl9TRVRMSzY0CTEzCi0jZGVmaW5lIEZfU0VUTEtXNjQJMTQKLQotLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KLSNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwogCiAvKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLwogI2RlZmluZSBGX1JETENLCQkxCiAjZGVmaW5lIEZfV1JMQ0sJCTIKICNkZWZpbmUgRl9VTkxDSwkJMwogCi0vKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLwotI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KLSNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisjZGVmaW5lIF9fQVJDSF9GTE9DS19QQUQJc2hvcnQgX191bnVzZWQ7CisjZGVmaW5lIF9fQVJDSF9GTE9DSzY0X1BBRAlzaG9ydCBfX3VudXNlZDsKIAotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLQlzaG9ydCBfX3VudXNlZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0JbG9mZl90IGxfc3RhcnQ7Ci0JbG9mZl90IGxfbGVuOwotCXBpZF90IGxfcGlkOwotCXNob3J0IF9fdW51c2VkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tc3BhcmMvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2hkcmVnLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmZDFhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcHRyYWNlLmgKaW5kZXggZGQ5ZDk0ZC4uYThlY2IyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcHRyYWNlLmgKQEAgLTczLDExICs3MywxMSBAQAogI2VuZGlmCiAKIC8qCi0gKiBUaGUgYXNtX29mZnNldHMuaCBpcyBhIGdlbmVyYXRlZCBmaWxlLCBzbyB3ZSBjYW5ub3QgaW5jbHVkZSBpdC4KKyAqIFRoZSBhc20tb2Zmc2V0cy5oIGlzIGEgZ2VuZXJhdGVkIGZpbGUsIHNvIHdlIGNhbm5vdCBpbmNsdWRlIGl0LgogICogSXQgbWF5IGJlIE9LIGZvciBnbGliYyBoZWFkZXJzLCBidXQgaXQncyB1dHRlcmx5IHBvaW50bGVzcyBmb3IgQyBjb2RlLgogICogVGhlIGFzc2VtYmx5IGNvZGUgdXNpbmcgdGhvc2Ugb2Zmc2V0cyBoYXMgdG8gaW5jbHVkZSBpdCBleHBsaWNpdGx5LgogICovCi0vKiAjaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+ICovCisvKiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+ICovCiAKIC8qIFRoZXNlIGFyZSBmb3IgcHRfcmVncy4gKi8KICNkZWZpbmUgUFRfUFNSICAgIDB4MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3NwaW5sb2NrLmgKaW5kZXggMGNiZDg3YS4uMTExNzI3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9zcGlubG9jay5oCkBAIC0xMiw5NiArMTIsMTIgQEAKIAogI2luY2x1ZGUgPGFzbS9wc3IuaD4KIAotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotc3RydWN0IF9zcGlubG9ja19kZWJ1ZyB7Ci0JdW5zaWduZWQgY2hhciBsb2NrOwotCXVuc2lnbmVkIGxvbmcgb3duZXJfcGM7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfTsKLXR5cGVkZWYgc3RydWN0IF9zcGlubG9ja19kZWJ1ZyBzcGlubG9ja190OworI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSAoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShsb2NrKSkgIT0gMCkKIAotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHsgMCwgMCB9Ci0jZGVmaW5lIHNwaW5fbG9ja19pbml0KGxwKQlkbyB7ICoobHApPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQobHApICAoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgmKChscCktPmxvY2spKSkgIT0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdChscCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKCYobHApLT5sb2NrKSkKKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQogCi1leHRlcm4gdm9pZCBfZG9fc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IF9zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBfZG9fc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jayk7Ci0KLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2sobHApCV9zcGluX3RyeWxvY2sobHApCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrKGxvY2spCV9kb19zcGluX2xvY2sobG9jaywgInNwaW5fbG9jayIpCi0jZGVmaW5lIF9yYXdfc3Bpbl91bmxvY2sobG9jaykJX2RvX3NwaW5fdW5sb2NrKGxvY2spCi0KLXN0cnVjdCBfcndsb2NrX2RlYnVnIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLQl1bnNpZ25lZCBsb25nIG93bmVyX3BjOwotCXVuc2lnbmVkIGxvbmcgcmVhZGVyX3BjW05SX0NQVVNdOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX07Ci10eXBlZGVmIHN0cnVjdCBfcndsb2NrX2RlYnVnIHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IDAsIDAsIHswfSB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQobHApCWRvIHsgKihscCk9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgX2RvX3JlYWRfbG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCBfZG9fcmVhZF91bmxvY2socndsb2NrX3QgKnJ3LCBjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgX2RvX3dyaXRlX2xvY2socndsb2NrX3QgKnJ3LCBjaGFyICpzdHIpOwotZXh0ZXJuIHZvaWQgX2RvX3dyaXRlX3VubG9jayhyd2xvY2tfdCAqcncpOwotCi0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKGxvY2spCVwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb19yZWFkX2xvY2sobG9jaywgInJlYWRfbG9jayIpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgX3Jhd19yZWFkX3VubG9jayhsb2NrKSBcCi1kbyB7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLQlfZG9fcmVhZF91bmxvY2sobG9jaywgInJlYWRfdW5sb2NrIik7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfcmF3X3dyaXRlX2xvY2sobG9jaykgXAotZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX2RvX3dyaXRlX2xvY2sobG9jaywgIndyaXRlX2xvY2siKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yYXdfd3JpdGVfdW5sb2NrKGxvY2spIFwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb193cml0ZV91bmxvY2sobG9jayk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLX0gd2hpbGUoMCkKLQotI2Vsc2UgLyogIUNPTkZJR19ERUJVR19TUElOTE9DSyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBsb2NrOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHsgMCB9Ci0KLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQobG9jaykgICAoKigodW5zaWduZWQgY2hhciAqKShsb2NrKSkgPSAwKQotI2RlZmluZSBzcGluX2lzX2xvY2tlZChsb2NrKSAgICAoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShsb2NrKSkgIT0gMCkKLQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KGxvY2spIFwKLWRvIHsgXAotCWJhcnJpZXIoKTsgXAotfSB3aGlsZSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopbG9jaykpCi0KLWV4dGVybiBfX2lubGluZV9fIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSJcbjE6XG5cdCIKQEAgLTEyMSw3ICszNyw3IEBACiAJOiAiZzIiLCAibWVtb3J5IiwgImNjIik7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorZXh0ZXJuIF9faW5saW5lX18gaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0OwogCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHN0dWIgWyUxXSwgJTAiCkBAIC0xMzEsNyArNDcsNyBAQAogCXJldHVybiAocmVzdWx0ID09IDApOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YiAlJWcwLCBbJTBdIiA6IDogInIiIChsb2NrKSA6ICJtZW1vcnkiKTsKIH0KQEAgLTE0NywyMyArNjMsMTEgQEAKICAqCiAgKiBYWFggVGhpcyBtaWdodCBjcmVhdGUgc29tZSBwcm9ibGVtcyB3aXRoIG15IGR1YWwgc3BpbmxvY2sKICAqIFhYWCBzY2hlbWUsIGRlYWRsb2NrcyBldGMuIC1EYXZlTQotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSByd2xvY2tfdDsKLQotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyAwIH0KLQotI2RlZmluZSByd2xvY2tfaW5pdChscCkJZG8geyAqKGxwKT0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0KLS8qIFNvcnQgb2YgbGlrZSBhdG9taWNfdCdzIG9uIFNwYXJjLCBidXQgZXZlbiBtb3JlIGNsZXZlci4KKyAqCisgKiBTb3J0IG9mIGxpa2UgYXRvbWljX3QncyBvbiBTcGFyYywgYnV0IGV2ZW4gbW9yZSBjbGV2ZXIuCiAgKgogICoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgl8IDI0LWJpdCBjb3VudGVyICAgICAgICAgICB8IHdsb2NrIHwgIHJ3bG9ja190CisgKgl8IDI0LWJpdCBjb3VudGVyICAgICAgICAgICB8IHdsb2NrIHwgIHJhd19yd2xvY2tfdAogICoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgkgMzEgICAgICAgICAgICAgICAgICAgICAgIDggNyAgICAgMAogICoKQEAgLTE3NCw5ICs3OCw5IEBACiAgKgogICogVW5mb3J0dW5hdGVseSB0aGlzIHNjaGVtZSBsaW1pdHMgdXMgdG8gfjE2LDAwMCwwMDAgY3B1cy4KICAqLwotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgX19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlyZWdpc3RlciByd2xvY2tfdCAqbHAgYXNtKCJnMSIpOworCXJlZ2lzdGVyIHJhd19yd2xvY2tfdCAqbHAgYXNtKCJnMSIpOwogCWxwID0gcnc7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIm1vdgklJW83LCAlJWc0XG5cdCIKQEAgLTE4NywxNiArOTEsMTYgQEAKIAk6ICJnMiIsICJnNCIsICJtZW1vcnkiLCAiY2MiKTsKIH0KIAotI2RlZmluZSBfcmF3X3JlYWRfbG9jayhsb2NrKSBcCisjZGVmaW5lIF9fcmF3X3JlYWRfbG9jayhsb2NrKSBcCiBkbyB7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLQlfcmVhZF9sb2NrKGxvY2spOyBcCisJX19yYXdfcmVhZF9sb2NrKGxvY2spOyBcCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCiB9IHdoaWxlKDApCiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgX3JlYWRfdW5sb2NrKHJ3bG9ja190ICpydykKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgX19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCXJlZ2lzdGVyIHJ3bG9ja190ICpscCBhc20oImcxIik7CisJcmVnaXN0ZXIgcmF3X3J3bG9ja190ICpscCBhc20oImcxIik7CiAJbHAgPSBydzsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkibW92CSUlbzcsICUlZzRcblx0IgpAQCAtMjA3LDE2ICsxMTEsMTYgQEAKIAk6ICJnMiIsICJnNCIsICJtZW1vcnkiLCAiY2MiKTsKIH0KIAotI2RlZmluZSBfcmF3X3JlYWRfdW5sb2NrKGxvY2spIFwKKyNkZWZpbmUgX19yYXdfcmVhZF91bmxvY2sobG9jaykgXAogZG8gewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JX3JlYWRfdW5sb2NrKGxvY2spOyBcCisJX19yYXdfcmVhZF91bmxvY2sobG9jayk7IFwKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKIH0gd2hpbGUoMCkKIAotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7Ci0JcmVnaXN0ZXIgcndsb2NrX3QgKmxwIGFzbSgiZzEiKTsKKwlyZWdpc3RlciByYXdfcndsb2NrX3QgKmxwIGFzbSgiZzEiKTsKIAlscCA9IHJ3OwogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSJtb3YJJSVvNywgJSVnNFxuXHQiCkBAIC0yMjcsMTEgKzEzMSw5IEBACiAJOiAiZzIiLCAiZzQiLCAibWVtb3J5IiwgImNjIik7CiB9CiAKLSNkZWZpbmUgX3Jhd193cml0ZV91bmxvY2socncpCWRvIHsgKHJ3KS0+bG9jayA9IDA7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX19yYXdfd3JpdGVfdW5sb2NrKHJ3KQlkbyB7IChydyktPmxvY2sgPSAwOyB9IHdoaWxlKDApCiAKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfU1BJTkxPQ0sgKi8KLQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKIAogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBmYjExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fU1BBUkNfU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfX1NQQVJDX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zcGFyYy91YWNjZXNzLmgKaW5kZXggMGE3ODBlOC4uZjhmMWVjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3VhY2Nlc3MuaApAQCAtNDcsMTIgKzQ3LDYgQEAKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpCQkJCQlcCiAJKHsgKHZvaWQpKHR5cGUpOyBfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksIHNpemUpOyB9KQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLGFkZHIsc2l6ZSkgPyAwIDogLUVGQVVMVDsKLX0KLQogLyoKICAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCiAgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmEyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTV9TUEFSQzY0X0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX1NQQVJDNjRfQVVYVkVDX0gKKworI2VuZGlmIC8qICEoX19BU01fU1BBUkM2NF9BVVhWRUNfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCmluZGV4IGI1OTEyMmQuLmM3MzkzNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaApAQCAtMTIsOCArMTIsMTAgQEAKIHR5cGVkZWYgczMyCQljb21wYXRfdGltZV90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9jbG9ja190OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9waWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfdWlkX3Q7Ci10eXBlZGVmIHUxNgkJY29tcGF0X2dpZF90OwordHlwZWRlZiB1MTYJCV9fY29tcGF0X3VpZF90OwordHlwZWRlZiB1MTYJCV9fY29tcGF0X2dpZF90OwordHlwZWRlZiB1MzIJCV9fY29tcGF0X3VpZDMyX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfZ2lkMzJfdDsKIHR5cGVkZWYgdTE2CQljb21wYXRfbW9kZV90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF9pbm9fdDsKIHR5cGVkZWYgdTE2CQljb21wYXRfZGV2X3Q7CkBAIC00Nyw4ICs0OSw4IEBACiAJY29tcGF0X2lub190CXN0X2lubzsKIAljb21wYXRfbW9kZV90CXN0X21vZGU7CiAJY29tcGF0X25saW5rX3QJc3Rfbmxpbms7Ci0JY29tcGF0X3VpZF90CXN0X3VpZDsKLQljb21wYXRfZ2lkX3QJc3RfZ2lkOworCV9fY29tcGF0X3VpZF90CXN0X3VpZDsKKwlfX2NvbXBhdF9naWRfdAlzdF9naWQ7CiAJY29tcGF0X2Rldl90CXN0X3JkZXY7CiAJY29tcGF0X29mZl90CXN0X3NpemU7CiAJY29tcGF0X3RpbWVfdAlzdF9hdGltZTsKQEAgLTE3NywxMCArMTc5LDEwIEBACiAKIHN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSB7CiAJY29tcGF0X2tleV90IGtleTsKLQlfX2tlcm5lbF91aWRfdCB1aWQ7Ci0JX19rZXJuZWxfZ2lkX3QgZ2lkOwotCV9fa2VybmVsX3VpZF90IGN1aWQ7Ci0JX19rZXJuZWxfZ2lkX3QgY2dpZDsKKwlfX2NvbXBhdF91aWQzMl90IHVpZDsKKwlfX2NvbXBhdF9naWQzMl90IGdpZDsKKwlfX2NvbXBhdF91aWQzMl90IGN1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBjZ2lkOwogCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKIAljb21wYXRfbW9kZV90IG1vZGU7CiAJdW5zaWduZWQgc2hvcnQgX19wYWQyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mY250bC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mY250bC5oCmluZGV4IGUzNmRlZjAuLmIyYWVjZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZjbnRsLmgKQEAgLTQsMTAgKzQsNiBAQAogCiAvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCiAgICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19SRE9OTFkJMHgwMDAwCi0jZGVmaW5lIE9fV1JPTkxZCTB4MDAwMQotI2RlZmluZSBPX1JEV1IJCTB4MDAwMgotI2RlZmluZSBPX0FDQ01PREUJMHgwMDAzCiAjZGVmaW5lIE9fTkRFTEFZCTB4MDAwNAogI2RlZmluZSBPX0FQUEVORAkweDAwMDgKICNkZWZpbmUgRkFTWU5DCQkweDAwNDAJLyogZmNudGwsIGZvciBCU0QgY29tcGF0aWJpbGl0eSAqLwpAQCAtMTcsNjIgKzEzLDI0IEBACiAjZGVmaW5lIE9fU1lOQwkJMHgyMDAwCiAjZGVmaW5lIE9fTk9OQkxPQ0sJMHg0MDAwCiAjZGVmaW5lIE9fTk9DVFRZCTB4ODAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19ESVJFQ1RPUlkJMHgxMDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMHgyMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMHg0MDAwMAogI2RlZmluZSBPX0RJUkVDVCAgICAgICAgMHgxMDAwMDAgLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KICNkZWZpbmUgT19OT0FUSU1FCTB4MjAwMDAwCiAKIAotI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLwotI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLwotI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCiAjZGVmaW5lIEZfR0VUT1dOCTUJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX1NFVE9XTgk2CS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9HRVRMSwkJNwogI2RlZmluZSBGX1NFVExLCQk4CiAjZGVmaW5lIEZfU0VUTEtXCTkKLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KIAogLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KICNkZWZpbmUgRl9SRExDSwkJMQogI2RlZmluZSBGX1dSTENLCQkyCiAjZGVmaW5lIEZfVU5MQ0sJCTMKIAotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLworI2RlZmluZSBfX0FSQ0hfRkxPQ0tfUEFECXNob3J0IF9fdW51c2VkOwogCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLQlzaG9ydCBfX3VudXNlZDsKLX07Ci0KLSNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCiAjZW5kaWYgLyogIShfU1BBUkM2NF9GQ05UTF9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mdXRleC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWM1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0LCB0ZW07CisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCWNhc2UgRlVURVhfT1BfQUREOgorCWNhc2UgRlVURVhfT1BfT1I6CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCWNhc2UgRlVURVhfT1BfWE9SOgorCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2hkcmVnLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2hkcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2ZkMWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hkcmVnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAppbmRleCBhNGFiMGVjLi44OWJkNzFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKQEAgLTI2OSw2ICsyNjksOCBAQAogcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCiAJCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CiAKK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgKnBjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHJlc291cmNlICopOworCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9jay5oCmluZGV4IGEwMmM0MzcuLmVjODVkMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrLmgKQEAgLTI5LDI0ICsyOSwxMyBAQAogICogbXVzdCBiZSBwcmUtVjkgYnJhbmNoZXMuCiAgKi8KIAotI2lmbmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKKyNkZWZpbmUgX19yYXdfc3Bpbl9pc19sb2NrZWQobHApCSgobHApLT5sb2NrICE9IDApCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGxvY2s7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJKHNwaW5sb2NrX3QpIHswLH0KKyNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChscCkJXAorCWRvIHsJcm1iKCk7CQkJXAorCX0gd2hpbGUoKGxwKS0+bG9jaykKIAotI2RlZmluZSBzcGluX2xvY2tfaW5pdChscCkJZG8geyAqKGxwKT0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKGxwKSAgKChscCktPmxvY2sgIT0gMCkKLQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KGxwKQlcCi1kbyB7CXJtYigpOwkJCVwKLX0gd2hpbGUoKGxwKS0+bG9jaykKLQotc3RhdGljIGlubGluZSB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCkBAIC02Nyw3ICs1Niw3IEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAKQEAgLTgxLDcgKzcwLDcgQEAKIAlyZXR1cm4gKHJlc3VsdCA9PSAwVUwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogIgltZW1iYXIJCSNTdG9yZVN0b3JlIHwgI0xvYWRTdG9yZVxuIgpAQCAtOTEsNyArODAsNyBAQAogCTogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2tfZmxhZ3Moc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2tfZmxhZ3MocmF3X3NwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwogCkBAIC0xMTUsNTEgKzEwNCw5IEBACiAJOiAibWVtb3J5Iik7CiB9CiAKLSNlbHNlIC8qICEoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBsb2NrOwotCXVuc2lnbmVkIGludCBvd25lcl9wYywgb3duZXJfY3B1OwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSB7IDAsIDAsIDB4ZmYgfQotI2RlZmluZSBzcGluX2xvY2tfaW5pdChscCkJZG8geyAqKGxwKT0gU1BJTl9MT0NLX1VOTE9DS0VEOyB9IHdoaWxlKDApCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKF9fbG9jaykJKChfX2xvY2spLT5sb2NrICE9IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoX19sb2NrKQlcCi1kbyB7IFwKLQlybWIoKTsgXAotfSB3aGlsZSgoX19sb2NrKS0+bG9jaykKLQotZXh0ZXJuIHZvaWQgX2RvX3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrLCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgY2FsbGVyKTsKLWV4dGVybiB2b2lkIF9kb19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKTsKLWV4dGVybiBpbnQgX2RvX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGNhbGxlcik7Ci0KLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2sobHApCVwKLQlfZG9fc3Bpbl90cnlsb2NrKGxwLCAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKQotI2RlZmluZSBfcmF3X3NwaW5fbG9jayhsb2NrKQlcCi0JX2RvX3NwaW5fbG9jayhsb2NrLCAic3Bpbl9sb2NrIiwgXAotCQkgICAgICAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKQotI2RlZmluZSBfcmF3X3NwaW5fdW5sb2NrKGxvY2spCV9kb19zcGluX3VubG9jayhsb2NrKQotI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKLQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19TUElOTE9DSyAqLwotCiAvKiBNdWx0aS1yZWFkZXIgbG9ja3MsIHRoZXNlIGFyZSBtdWNoIHNhbmVyIHRoYW4gdGhlIDMyLWJpdCBTcGFyYyBvbmVzLi4uICovCiAKLSNpZm5kZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotI2RlZmluZSBSV19MT0NLX1VOTE9DS0VECShyd2xvY2tfdCkgezAsfQotI2RlZmluZSByd2xvY2tfaW5pdChscCkgZG8geyAqKGxwKSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotc3RhdGljIHZvaWQgaW5saW5lIF9fcmVhZF9sb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIHZvaWQgaW5saW5lIF9fcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CiAKQEAgLTE4NCw3ICsxMzEsNyBAQAogCTogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgdm9pZCBpbmxpbmUgX19yZWFkX3VubG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyB2b2lkIGlubGluZSBfX3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CiAKQEAgLTIwMSw3ICsxNDgsNyBAQAogCTogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgdm9pZCBpbmxpbmUgX193cml0ZV9sb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIHZvaWQgaW5saW5lIF9fd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrLCB0bXAxLCB0bXAyOwogCkBAIC0yMjgsNyArMTc1LDcgQEAKIAk6ICJtZW1vcnkiKTsKIH0KIAotc3RhdGljIHZvaWQgaW5saW5lIF9fd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpsb2NrKQorc3RhdGljIHZvaWQgaW5saW5lIF9fd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKICIJbWVtYmFyCQkjTG9hZFN0b3JlIHwgI1N0b3JlU3RvcmVcbiIKQEAgLTIzOCw3ICsxODUsNyBAQAogCTogIm1lbW9yeSIpOwogfQogCi1zdGF0aWMgaW50IGlubGluZSBfX3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW50IGlubGluZSBfX3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCXVuc2lnbmVkIGxvbmcgbWFzaywgdG1wMSwgdG1wMiwgcmVzdWx0OwogCkBAIC0yNjMsNzggKzIxMCwxNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX2xvY2socCkJX19yZWFkX2xvY2socCkKLSNkZWZpbmUgX3Jhd19yZWFkX3VubG9jayhwKQlfX3JlYWRfdW5sb2NrKHApCi0jZGVmaW5lIF9yYXdfd3JpdGVfbG9jayhwKQlfX3dyaXRlX2xvY2socCkKLSNkZWZpbmUgX3Jhd193cml0ZV91bmxvY2socCkJX193cml0ZV91bmxvY2socCkKLSNkZWZpbmUgX3Jhd193cml0ZV90cnlsb2NrKHApCV9fd3JpdGVfdHJ5bG9jayhwKQorI2RlZmluZSBfX3Jhd19yZWFkX2xvY2socCkJX19yZWFkX2xvY2socCkKKyNkZWZpbmUgX19yYXdfcmVhZF91bmxvY2socCkJX19yZWFkX3VubG9jayhwKQorI2RlZmluZSBfX3Jhd193cml0ZV9sb2NrKHApCV9fd3JpdGVfbG9jayhwKQorI2RlZmluZSBfX3Jhd193cml0ZV91bmxvY2socCkJX193cml0ZV91bmxvY2socCkKKyNkZWZpbmUgX19yYXdfd3JpdGVfdHJ5bG9jayhwKQlfX3dyaXRlX3RyeWxvY2socCkKIAotI2Vsc2UgLyogIShDT05GSUdfREVCVUdfU1BJTkxPQ0spICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2s7Ci0JdW5zaWduZWQgaW50IHdyaXRlcl9wYywgd3JpdGVyX2NwdTsKLQl1bnNpZ25lZCBpbnQgcmVhZGVyX3BjW05SX0NQVVNdOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7Ci0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQJKHJ3bG9ja190KSB7IDAsIDAsIDB4ZmYsIHsgfSB9Ci0jZGVmaW5lIHJ3bG9ja19pbml0KGxwKSBkbyB7ICoobHApID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi1leHRlcm4gdm9pZCBfZG9fcmVhZF9sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcik7Ci1leHRlcm4gdm9pZCBfZG9fcmVhZF91bmxvY2socndsb2NrX3QgKnJ3LCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgY2FsbGVyKTsKLWV4dGVybiB2b2lkIF9kb193cml0ZV9sb2NrKHJ3bG9ja190ICpydywgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGNhbGxlcik7Ci1leHRlcm4gdm9pZCBfZG9fd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydywgdW5zaWduZWQgbG9uZyBjYWxsZXIpOwotZXh0ZXJuIGludCBfZG9fd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncsIGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBjYWxsZXIpOwotCi0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKGxvY2spIFwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb19yZWFkX2xvY2sobG9jaywgInJlYWRfbG9jayIsIFwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBfcmF3X3JlYWRfdW5sb2NrKGxvY2spIFwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb19yZWFkX3VubG9jayhsb2NrLCAicmVhZF91bmxvY2siLCBcCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgX3Jhd193cml0ZV9sb2NrKGxvY2spIFwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb193cml0ZV9sb2NrKGxvY2ssICJ3cml0ZV9sb2NrIiwgXAotCQkgICAgICAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yYXdfd3JpdGVfdW5sb2NrKGxvY2spIFwKLWRvIHsJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCV9kb193cml0ZV91bmxvY2sobG9jaywgXAotCQkgICAgICAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yYXdfd3JpdGVfdHJ5bG9jayhsb2NrKSBcCi0oewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JaW50IHZhbDsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAotCXZhbCA9IF9kb193cml0ZV90cnlsb2NrKGxvY2ssICJ3cml0ZV90cnlsb2NrIiwgXAotCQkJCSh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi0JdmFsOyBcCi19KQotCi0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1NQSU5MT0NLICovCi0KLSNkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2sobG9jaykgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKGxvY2spCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2socncpCSghKChydyktPmxvY2sgJiAweDgwMDAwMDAwVUwpKQotI2RlZmluZSB3cml0ZV9jYW5fbG9jayhydykJKCEocncpLT5sb2NrKQorI2RlZmluZSBfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykJZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJ3KQkJKCEoKHJ3KS0+bG9jayAmIDB4ODAwMDAwMDBVTCkpCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCiAKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjgxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX1NQQVJDNjRfU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfX1NQQVJDNjRfU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCmluZGV4IDVlOTRjMDUuLmI1NDE3NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaApAQCAtMjgsMTMgKzI4LDQ4IEBACiAjZGVmaW5lIEFSQ0hfU1VONENfU1VONCAwCiAjZGVmaW5lIEFSQ0hfU1VONCAwCiAKLWV4dGVybiB2b2lkIG1iKHZvaWQpOwotZXh0ZXJuIHZvaWQgcm1iKHZvaWQpOwotZXh0ZXJuIHZvaWQgd21iKHZvaWQpOwotZXh0ZXJuIHZvaWQgbWVtYmFyX3N0b3JlbG9hZCh2b2lkKTsKLWV4dGVybiB2b2lkIG1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSh2b2lkKTsKLWV4dGVybiB2b2lkIG1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQodm9pZCk7Ci1leHRlcm4gdm9pZCBtZW1iYXJfc3RvcmVzdG9yZV9sb2Fkc3RvcmUodm9pZCk7CisvKiBUaGVzZSBhcmUgaGVyZSBpbiBhbiBlZmZvcnQgdG8gbW9yZSBmdWxseSB3b3JrIGFyb3VuZCBTcGl0ZmlyZSBFcnJhdGEKKyAqICM1MS4gIEVzc2VudGlhbGx5LCBpZiBhIG1lbW9yeSBiYXJyaWVyIG9jY3VycyBzb29uIGFmdGVyIGEgbWlzcHJlZGljdGVkCisgKiBicmFuY2gsIHRoZSBjaGlwIGNhbiBzdG9wIGV4ZWN1dGluZyBpbnN0cnVjdGlvbnMgdW50aWwgYSB0cmFwIG9jY3Vycy4KKyAqIFRoZXJlZm9yZSwgaWYgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZSBjaGlwIGNhbiBoYW5nIGZvcmV2ZXIuCisgKgorICogSXQgdXNlZCB0byBiZSBiZWxpZXZlZCB0aGF0IHRoZSBtZW1vcnkgYmFycmllciBoYWQgdG8gYmUgcmlnaHQgaW4gdGhlCisgKiBkZWxheSBzbG90LCBidXQgYSBjYXNlIGhhcyBiZWVuIHRyYWNlZCByZWNlbnRseSB3aGVyZWluIHRoZSBtZW1vcnkgYmFycmllcgorICogd2FzIG9uZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgYnJhbmNoIGRlbGF5IHNsb3QgYW5kIHRoZSBjaGlwIHN0aWxsIGh1bmcuCisgKiBUaGUgb2ZmZW5kaW5nIHNlcXVlbmNlIHdhcyB0aGUgZm9sbG93aW5nIGluIHN5bV93YWtldXBfZG9uZSgpIG9mIHRoZQorICogc3ltNTNjOHh4XzIgZHJpdmVyOgorICoKKyAqCWNhbGwJc3ltX2NjYl9mcm9tX2RzYSwgMAorICoJIG1vdmdlCSVpY2MsIDAsICVsMAorICoJYnJ6LHBuCSVvMCwgLkxMMTMwMworICoJIG1vdgklbzAsICVsMgorICoJbWVtYmFyCSNMb2FkTG9hZAorICoKKyAqIFRoZSBicmFuY2ggaGFzIHRvIGJlIG1pc3ByZWRpY3RlZCBmb3IgdGhlIGJ1ZyB0byBvY2N1ci4gIFRoZXJlZm9yZSwgd2UgcHV0CisgKiB0aGUgbWVtb3J5IGJhcnJpZXIgZXhwbGljaXRseSBpbnRvIGEgImJyYW5jaCBhbHdheXMsIHByZWRpY3RlZCB0YWtlbiIKKyAqIGRlbGF5IHNsb3QgdG8gYXZvaWQgdGhlIHByb2JsZW0gY2FzZS4KKyAqLworI2RlZmluZSBtZW1iYXJfc2FmZSh0eXBlKSBcCitkbyB7CV9fYXNtX18gX192b2xhdGlsZV9fKCJiYSxwdAklJXhjYywgMWZcblx0IiBcCisJCQkgICAgICIgbWVtYmFyCSIgdHlwZSAiXG4iIFwKKwkJCSAgICAgIjE6XG4iIFwKKwkJCSAgICAgOiA6IDogIm1lbW9yeSIpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG1iKCkJXAorCW1lbWJhcl9zYWZlKCIjTG9hZExvYWQgfCAjTG9hZFN0b3JlIHwgI1N0b3JlU3RvcmUgfCAjU3RvcmVMb2FkIikKKyNkZWZpbmUgcm1iKCkJXAorCW1lbWJhcl9zYWZlKCIjTG9hZExvYWQiKQorI2RlZmluZSB3bWIoKQlcCisJbWVtYmFyX3NhZmUoIiNTdG9yZVN0b3JlIikKKyNkZWZpbmUgbWVtYmFyX3N0b3JlbG9hZCgpIFwKKwltZW1iYXJfc2FmZSgiI1N0b3JlTG9hZCIpCisjZGVmaW5lIG1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSgpIFwKKwltZW1iYXJfc2FmZSgiI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIikKKyNkZWZpbmUgbWVtYmFyX3N0b3JlbG9hZF9sb2FkbG9hZCgpIFwKKwltZW1iYXJfc2FmZSgiI1N0b3JlTG9hZCB8ICNMb2FkTG9hZCIpCisjZGVmaW5lIG1lbWJhcl9zdG9yZXN0b3JlX2xvYWRzdG9yZSgpIFwKKwltZW1iYXJfc2FmZSgiI1N0b3JlU3RvcmUgfCAjTG9hZFN0b3JlIikKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC91YWNjZXNzLmgKaW5kZXggNTY5MDE0Mi4uODBhNjVkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC91YWNjZXNzLmgKQEAgLTU5LDEyICs1OSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qIHRoaXMgZnVuY3Rpb24gd2lsbCBnbyBhd2F5IHNvb24gLSB1c2UgYWNjZXNzX29rKCkgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkIF9fdXNlciAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCiAgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2F1eHZlYy5oIGIvaW5jbHVkZS9hc20tdW0vYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1ZTFjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXVtL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX1VNX0FVWFZFQ19ICisjZGVmaW5lIF9fVU1fQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9mdXRleC5oIGIvaW5jbHVkZS9hc20tdW0vZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdW0vZnV0ZXguaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9BU01fRlVURVhfSAorI2RlZmluZSBfQVNNX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2hkcmVnLmggYi9pbmNsdWRlL2FzbS11bS9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYzNjNhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXVtL2hkcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19VTV9IRFJFR19ICi0jZGVmaW5lIF9fVU1fSERSRUdfSAotCi0jaW5jbHVkZSAiYXNtL2FyY2gvaGRyZWcuaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wYWdlLmggYi9pbmNsdWRlL2FzbS11bS9wYWdlLmgKaW5kZXggYmQ4NTBhMi4uMmMxOTJhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3BhZ2UuaApAQCAtOTYsOCArOTYsNyBAQAogCiAjZGVmaW5lIF9fdmFfc3BhY2UgKDgqMTAyNCoxMDI0KQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyB0b19waHlzKHZvaWQgKnZpcnQpOwotZXh0ZXJuIHZvaWQgKnRvX3ZpcnQodW5zaWduZWQgbG9uZyBwaHlzKTsKKyNpbmNsdWRlICJtZW0uaCIKIAogLyogQ2FzdCB0byB1bnNpZ25lZCBsb25nIGJlZm9yZSBjYXN0aW5nIHRvIHZvaWQgKiB0byBhdm9pZCBhIHdhcm5pbmcgZnJvbQogICogbW1hcF9rbWVtIGFib3V0IGN1dHRpbmcgYSBsb25nIGxvbmcgZG93biB0byBhIHZvaWQgKi4gIE5vdCBzdXJlIHRoYXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaAppbmRleCBiNDhlMDk2Li5lZDA2MTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oCkBAIC0zMjYsMTQgKzMyNiwyMiBAQAogfQogI2RlZmluZSBzZXRfcHRlX2F0KG1tLGFkZHIscHRlcCxwdGV2YWwpIHNldF9wdGUocHRlcCxwdGV2YWwpCiAKLWV4dGVybiBwaHlzX3QgcGFnZV90b19waHlzKHN0cnVjdCBwYWdlICpwYWdlKTsKLQogLyoKICAqIENvbnZlcnNpb24gZnVuY3Rpb25zOiBjb252ZXJ0IGEgcGFnZSBhbmQgcHJvdGVjdGlvbiB0byBhIHBhZ2UgZW50cnksCiAgKiBhbmQgYSBwYWdlIGVudHJ5IGFuZCBwYWdlIGRpcmVjdG9yeSB0byB0aGUgcGFnZSB0aGV5IHJlZmVyIHRvLgogICovCiAKLWV4dGVybiBwdGVfdCBta19wdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHBncHJvdF90IHBncHJvdCk7CisjZGVmaW5lIHBoeXNfdG9fcGFnZShwaHlzKSBwZm5fdG9fcGFnZShwaHlzX3RvX3BmbihwaHlzKSkKKyNkZWZpbmUgX192aXJ0X3RvX3BhZ2UodmlydCkgcGh5c190b19wYWdlKF9fcGEodmlydCkpCisjZGVmaW5lIHBhZ2VfdG9fcGh5cyhwYWdlKSBwZm5fdG9fcGh5cyhwYWdlX3RvX3BmbihwYWdlKSkKKworI2RlZmluZSBta19wdGUocGFnZSwgcGdwcm90KSBcCisJKHsgcHRlX3QgcHRlOwkJCQkJXAorCQkJCQkJCVwKKwlwdGVfc2V0X3ZhbChwdGUsIHBhZ2VfdG9fcGh5cyhwYWdlKSwgKHBncHJvdCkpOwlcCisJaWYgKHB0ZV9wcmVzZW50KHB0ZSkpCQkJCVwKKwkJcHRlX21rbmV3cHJvdChwdGVfbWtuZXdwYWdlKHB0ZSkpOwlcCisJcHRlO30pCiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21vZGlmeShwdGVfdCBwdGUsIHBncHJvdF90IG5ld3Byb3QpCiB7CkBAIC00MTAsOCArNDE4LDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLWV4dGVybiBzdHJ1Y3QgcGFnZSAqcGh5c190b19wYWdlKGNvbnN0IHVuc2lnbmVkIGxvbmcgcGh5cyk7Ci1leHRlcm4gc3RydWN0IHBhZ2UgKl9fdmlydF90b19wYWdlKGNvbnN0IHVuc2lnbmVkIGxvbmcgdmlydCk7CiAjZGVmaW5lIHZpcnRfdG9fcGFnZShhZGRyKSBfX3ZpcnRfdG9fcGFnZSgoY29uc3QgdW5zaWduZWQgbG9uZykgYWRkcikKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS11bS9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTk0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS11bS9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX1VNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19VTV9TUElOTE9DS19UWVBFU19ICisKKyNpbmNsdWRlICJhc20vYXJjaC9zcGlubG9ja190eXBlcy5oIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS12ODUwL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTMyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX1Y4NTBfQVVYVkVDX0hfXworI2RlZmluZSBfX1Y4NTBfQVVYVkVDX0hfXworCisjZW5kaWYgLyogX19WODUwX0FVWFZFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXY4NTAvZmNudGwuaAppbmRleCAzMWQ0YjU5Li4zYWY0ZDU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9mY250bC5oCkBAIC0xLDg3ICsxLDExIEBACiAjaWZuZGVmIF9fVjg1MF9GQ05UTF9IX18KICNkZWZpbmUgX19WODUwX0ZDTlRMX0hfXwogCi0vKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCi0gICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BQ0NNT0RFCSAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgMDAKLSNkZWZpbmUgT19XUk9OTFkJICAgIDAxCi0jZGVmaW5lIE9fUkRXUgkJICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgMDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkgIDAyMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTk9DVFRZCSAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJIDAxMDAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0FQUEVORAkgMDIwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCTAxMDAwMAotI2RlZmluZSBGQVNZTkMJCTAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIE9fRElSRUNUT1JZCTA0MDAwMAkvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCiAjZGVmaW5lIE9fTk9GT0xMT1cgICAgIDAxMDAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fRElSRUNUICAgICAgIDAyMDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCAqLwogI2RlZmluZSBPX0xBUkdFRklMRSAgICAwNDAwMDAwCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAogCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgogCi0jZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLSNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCi0jZGVmaW5lIEZfU0VUTEs2NAkxMwotI2RlZmluZSBGX1NFVExLVzY0CTE0Ci0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLwotI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLwotI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KLQotc3RydWN0IGZsb2NrIHsKLQlzaG9ydCBsX3R5cGU7Ci0Jc2hvcnQgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCBsX3BpZDsKLX07Ci0KLXN0cnVjdCBmbG9jazY0IHsKLQlzaG9ydCAgbF90eXBlOwotCXNob3J0ICBsX3doZW5jZTsKLQlsb2ZmX3QgbF9zdGFydDsKLQlsb2ZmX3QgbF9sZW47Ci0JcGlkX3QgIGxfcGlkOwotfTsKLQotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAogI2VuZGlmIC8qIF9fVjg1MF9GQ05UTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLXY4NTAvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjNWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9mdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldCwgdGVtOworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwljYXNlIEZVVEVYX09QX0FERDoKKwljYXNlIEZVVEVYX09QX09SOgorCWNhc2UgRlVURVhfT1BfQU5ETjoKKwljYXNlIEZVVEVYX09QX1hPUjoKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCWRlY19wcmVlbXB0X2NvdW50KCk7CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGNtcCkgeworCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS12ODUwL3VhY2Nlc3MuaAppbmRleCA0Mzg2Y2ZjLi4xODhiMjg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3VhY2Nlc3MuaApAQCAtMjcsMTIgKzI3LDYgQEAKIAlyZXR1cm4gdmFsID49ICgweDgwICsgTlVNX0NQVV9JUlFTKjE2KSAmJiB2YWwgPCAweEZGRkZGMDAwOwogfQogCi0vKiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ28gYXdheSBzb29uIC0gdXNlIGFjY2Vzc19vaygpIGluc3RlYWQgKi8KLWV4dGVybiBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZCB2ZXJpZnlfYXJlYSAoaW50IHR5cGUsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rICh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKICAqIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBhbGxvd2VkIHRvIGZhdWx0LCBhbmQgdGhlIHNlY29uZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggZGM4Yzk4MS4uYWExYzdiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgICAgOiI9ciIobl9oaSksICI9ciIobl9sbykgICAgIFwKICAgICAgICAgOiIwIihuX2hpKSwgIjEiKG5fbG8pKQogCi0jaWZkZWYgQ09ORklHX0FDUElfQk9PVAorI2lmZGVmIENPTkZJR19BQ1BJCiBleHRlcm4gaW50IGFjcGlfbGFwaWM7CiBleHRlcm4gaW50IGFjcGlfaW9hcGljOwogZXh0ZXJuIGludCBhY3BpX25vaXJxOwpAQCAtMTIxLDE3ICsxMjEsNiBAQAogI2RlZmluZSBGSVhfQUNQSV9QQUdFUyA0CiAKIGV4dGVybiBpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKTsKLQotI2Vsc2UJLyogIUNPTkZJR19BQ1BJX0JPT1QgKi8KLSNkZWZpbmUgYWNwaV9sYXBpYyAwCi0jZGVmaW5lIGFjcGlfaW9hcGljIDAKLSNlbmRpZiAvKiAhQ09ORklHX0FDUElfQk9PVCAqLwotCi1leHRlcm4gaW50IGFjcGlfbnVtYTsKLWV4dGVybiBpbnQgYWNwaV9zY2FuX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKLSNkZWZpbmUgTlJfTk9ERV9NRU1CTEtTIChNQVhfTlVNTk9ERVMqMikKLQotI2lmZGVmIENPTkZJR19BQ1BJX1BDSQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbm9pcnFfc2V0KHZvaWQpIHsgYWNwaV9ub2lycSA9IDE7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIAogewpAQCAtMTM5LDExICsxMjgsMTkgQEAKIAlhY3BpX25vaXJxX3NldCgpOwogfQogZXh0ZXJuIGludCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpOwotI2Vsc2UKKworI2Vsc2UJLyogIUNPTkZJR19BQ1BJICovCisKKyNkZWZpbmUgYWNwaV9sYXBpYyAwCisjZGVmaW5lIGFjcGlfaW9hcGljIDAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9pcnFfYmFsYW5jZV9zZXQoY2hhciAqc3RyKSB7IHJldHVybiAwOyB9Ci0jZW5kaWYKKworI2VuZGlmIC8qICFDT05GSUdfQUNQSSAqLworCitleHRlcm4gaW50IGFjcGlfbnVtYTsKK2V4dGVybiBpbnQgYWNwaV9zY2FuX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKyNkZWZpbmUgTlJfTk9ERV9NRU1CTEtTIChNQVhfTlVNTk9ERVMqMikKIAogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDAzYzRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX0FTTV9YODZfNjRfQVVYVkVDX0gKKyNkZWZpbmUgX19BU01fWDg2XzY0X0FVWFZFQ19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCmluZGV4IGQwZjQ1M2MuLmYwMTU1YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKQEAgLTE0LDEwICsxNCwxMCBAQAogdHlwZWRlZiBzMzIJCWNvbXBhdF90aW1lX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2Nsb2NrX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3BpZF90OwotdHlwZWRlZiB1MTYJCWNvbXBhdF91aWRfdDsKLXR5cGVkZWYgdTE2CQljb21wYXRfZ2lkX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X3VpZDMyX3Q7Ci10eXBlZGVmIHUzMgkJY29tcGF0X2dpZDMyX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfdWlkX3Q7Cit0eXBlZGVmIHUxNgkJX19jb21wYXRfZ2lkX3Q7Cit0eXBlZGVmIHUzMgkJX19jb21wYXRfdWlkMzJfdDsKK3R5cGVkZWYgdTMyCQlfX2NvbXBhdF9naWQzMl90OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9tb2RlX3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X2lub190OwogdHlwZWRlZiB1MTYJCWNvbXBhdF9kZXZfdDsKQEAgLTUyLDggKzUyLDggQEAKIAljb21wYXRfaW5vX3QJc3RfaW5vOwogCWNvbXBhdF9tb2RlX3QJc3RfbW9kZTsKIAljb21wYXRfbmxpbmtfdAlzdF9ubGluazsKLQljb21wYXRfdWlkX3QJc3RfdWlkOwotCWNvbXBhdF9naWRfdAlzdF9naWQ7CisJX19jb21wYXRfdWlkX3QJc3RfdWlkOworCV9fY29tcGF0X2dpZF90CXN0X2dpZDsKIAljb21wYXRfZGV2X3QJc3RfcmRldjsKIAl1MTYJCV9fcGFkMjsKIAl1MzIJCXN0X3NpemU7CkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gewogCWNvbXBhdF9rZXlfdCBrZXk7Ci0JY29tcGF0X3VpZDMyX3QgdWlkOwotCWNvbXBhdF9naWQzMl90IGdpZDsKLQljb21wYXRfdWlkMzJfdCBjdWlkOwotCWNvbXBhdF9naWQzMl90IGNnaWQ7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKIAl1bnNpZ25lZCBzaG9ydCBtb2RlOwogCXVuc2lnbmVkIHNob3J0IF9fcGFkMTsKIAl1bnNpZ25lZCBzaG9ydCBzZXE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY3VycmVudC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2N1cnJlbnQuaAppbmRleCA3ZGI1NjBlLi5iYzhhZGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY3VycmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jdXJyZW50LmgKQEAgLTE3LDcgKzE3LDcgQEAKICNlbHNlCiAKICNpZm5kZWYgQVNNX09GRlNFVF9ICi0jaW5jbHVkZSA8YXNtL29mZnNldC5oPiAKKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4gCiAjZW5kaWYKIAogI2RlZmluZSBHRVRfQ1VSUkVOVChyZWcpIG1vdnEgJWdzOihwZGFfcGN1cnJlbnQpLHJlZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ZjbnRsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZmNudGwuaAppbmRleCA0NDExZjIyLi40NmFiMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZmNudGwuaApAQCAtMSw3NiArMSBAQAotI2lmbmRlZiBfWDg2XzY0X0ZDTlRMX0gKLSNkZWZpbmUgX1g4Nl82NF9GQ05UTF9ICi0KLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMwotI2RlZmluZSBPX1JET05MWQkgICAgIDAwCi0jZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKLSNkZWZpbmUgT19SRFdSCQkgICAgIDAyCi0jZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAotI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKLSNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwotI2RlZmluZSBPX1NZTkMJCSAwMTAwMDAKLSNkZWZpbmUgRkFTWU5DCQkgMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAotCi0jZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCi0jZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KLSNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCi0jZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9HRVRMSwkJNQotI2RlZmluZSBGX1NFVExLCQk2Ci0jZGVmaW5lIEZfU0VUTEtXCTcKLQotI2RlZmluZSBGX1NFVE9XTgk4CS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRPV04JOQkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfU0VUU0lHCTEwCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9HRVRTSUcJMTEJLyogIGZvciBzb2NrZXRzLiAqLwotCi0vKiBmb3IgRl9bR0VUfFNFVF1GTCAqLwotI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCi0KLS8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCi0jZGVmaW5lIEZfUkRMQ0sJCTAKLSNkZWZpbmUgRl9XUkxDSwkJMQotI2RlZmluZSBGX1VOTENLCQkyCi0KLS8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCi0jZGVmaW5lIEZfRVhMQ0sJCTQJLyogb3IgMyAqLwotI2RlZmluZSBGX1NITENLCQk4CS8qIG9yIDQgKi8KLQotLyogZm9yIGxlYXNlcyAqLwotI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKLQotLyogb3BlcmF0aW9ucyBmb3IgYnNkIGZsb2NrKCksIGFsc28gdXNlZCBieSB0aGUga2VybmVsIGltcGxlbWVudGF0aW9uICovCi0jZGVmaW5lIExPQ0tfU0gJCTEJLyogc2hhcmVkIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19FWAkJMgkvKiBleGNsdXNpdmUgbG9jayAqLwotI2RlZmluZSBMT0NLX05CCQk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKLQkJCQkgICBibG9ja2luZyAqLwotI2RlZmluZSBMT0NLX1VOCQk4CS8qIHJlbW92ZSBsb2NrICovCi0KLSNkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2sgKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCi0KLXN0cnVjdCBmbG9jayB7Ci0Jc2hvcnQgIGxfdHlwZTsKLQlzaG9ydCAgbF93aGVuY2U7Ci0Jb2ZmX3QgbF9zdGFydDsKLQlvZmZfdCBsX2xlbjsKLQlwaWRfdCAgbF9waWQ7Ci19OwotCi0jZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0Ci0KLSNlbmRpZiAvKiAhX1g4Nl82NF9GQ05UTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9mdXRleC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMmMwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9mdXRleC5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgX0FTTV9GVVRFWF9ICisjZGVmaW5lIF9BU01fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcDEoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKAkJCQkJCVwKKyIxOgkiIGluc24gIlxuIgkJCQkJCVwKKyIyOgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG5cCiszOgltb3YJJTMsICUxXG5cCisJam1wCTJiXG5cCisJLnByZXZpb3VzXG5cCisJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuXAorCS5hbGlnbgk4XG5cCisJLnF1YWQJMWIsM2JcblwKKwkucHJldmlvdXMiCQkJCQkJXAorCTogIj1yIiAob2xkdmFsKSwgIj1yIiAocmV0KSwgIj1tIiAoKnVhZGRyKQkJXAorCTogImkiICgtRUZBVUxUKSwgIm0iICgqdWFkZHIpLCAiMCIgKG9wYXJnKSwgIjEiICgwKSkKKworI2RlZmluZSBfX2Z1dGV4X2F0b21pY19vcDIoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorICBfX2FzbV9fIF9fdm9sYXRpbGUgKAkJCQkJCVwKKyIxOgltb3ZsCSUyLCAlMFxuXAorCW1vdmwJJTAsICUzXG4iCQkJCQlcCisJaW5zbiAiXG4iCQkJCQkJXAorIjI6CSIgTE9DS19QUkVGSVggImNtcHhjaGdsICUzLCAlMlxuXAorCWpuegkxYlxuXAorMzoJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuXAorNDoJbW92CSU1LCAlMVxuXAorCWptcAkzYlxuXAorCS5wcmV2aW91c1xuXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcblwKKwkuYWxpZ24JOFxuXAorCS5xdWFkCTFiLDRiLDJiLDRiXG5cCisJLnByZXZpb3VzIgkJCQkJCVwKKwk6ICI9JmEiIChvbGR2YWwpLCAiPSZyIiAocmV0KSwgIj1tIiAoKnVhZGRyKSwJCVwKKwkgICI9JnIiICh0ZW0pCQkJCQkJXAorCTogInIiIChvcGFyZyksICJpIiAoLUVGQVVMVCksICJtIiAoKnVhZGRyKSwgIjEiICgwKSkKKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKK3sKKwlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OworCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKKwlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKKwlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOworCWludCBvbGR2YWwgPSAwLCByZXQsIHRlbTsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCV9fZnV0ZXhfYXRvbWljX29wMSgieGNoZ2wgJTAsICUyIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlfX2Z1dGV4X2F0b21pY19vcDEoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMiIsIHJldCwgb2xkdmFsLAorCQkJCSAgIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfT1I6CisJCV9fZnV0ZXhfYXRvbWljX29wMigib3JsICU0LCAlMyIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX0FORE46CisJCV9fZnV0ZXhfYXRvbWljX29wMigiYW5kbCAlNCwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsIH5vcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlfX2Z1dGV4X2F0b21pY19vcDIoInhvcmwgJTQsICUzIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaGRyZWcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9oZHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg5YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9oZHJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI3dhcm5pbmcgdGhpcyBmaWxlIGlzIG9ic29sZXRlLCBwbGVhc2UgZG8gbm90IHVzZSBpdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKaW5kZXggYThiYWJkMi4uZWUxYmM2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCkBAIC0yMDEsNyArMjAxLDcgQEAKICAqLwogI2RlZmluZSBpb19hcGljX2Fzc2lnbl9wY2lfaXJxcyAobXBfaXJxX2VudHJpZXMgJiYgIXNraXBfaW9hcGljX3NldHVwICYmIGlvX2FwaWNfaXJxcykKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIGludCBpb19hcGljX2dldF92ZXJzaW9uIChpbnQgaW9hcGljKTsKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfcmVkaXJfZW50cmllcyAoaW50IGlvYXBpYyk7CiBleHRlcm4gaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nIChpbnQgaW9hcGljLCBpbnQgcGluLCBpbnQgaXJxLCBpbnQsIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmgKaW5kZXggNDQ4MjY1Ny4uZmI3MjRiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pcnEuaApAQCAtNDgsMTAgKzQ4LDYgQEAKICNkZWZpbmUgQVJDSF9IQVNfTk1JX1dBVENIRE9HCQkvKiBTZWUgaW5jbHVkZS9saW51eC9ubWkuaCAqLwogI2VuZGlmCiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIGV4dGVybiB2b2lkIGZpeHVwX2lycXMoY3B1bWFza190IG1hcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmgKaW5kZXggMzMxZjZhMy4uZjI2N2UxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L21wc3BlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tcHNwZWMuaApAQCAtMTc5LDcgKzE3OSw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBtcF9sYXBpY19hZGRyOwogZXh0ZXJuIGludCBwaWNfbW9kZTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIHZvaWQgbXBfcmVnaXN0ZXJfbGFwaWMgKHU4IGlkLCB1OCBlbmFibGVkKTsKIGV4dGVybiB2b2lkIG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MgKHU2NCBhZGRyZXNzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCmluZGV4IDE5NDE2MGYuLmE4MzIxOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKQEAgLTM5OCw3ICszOTgsNyBAQAogI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSFcgMQogc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNodyh2b2lkICp4KSAKIHsgCi0JYWx0ZXJuYXRpdmVfaW5wdXQoQVNNX05PUDUsCisJYWx0ZXJuYXRpdmVfaW5wdXQoInByZWZldGNodDAgKCUxKSIsCiAJCQkgICJwcmVmZXRjaHcgKCUxKSIsCiAJCQkgIFg4Nl9GRUFUVVJFXzNETk9XLAogCQkJICAiciIgKHgpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKaW5kZXggNmM4MTNlYi4uZjc1NzQxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKQEAgLTgsNyArOCw2IEBACiBzdHJ1Y3QgY3B1aW5mb194ODY7IAogc3RydWN0IHB0X3JlZ3M7CiAKLWV4dGVybiB2b2lkIGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiopOwogZXh0ZXJuIHZvaWQgc3RhcnRfa2VybmVsKHZvaWQpOwogZXh0ZXJuIHZvaWQgcGRhX2luaXQoaW50KTsgCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKaW5kZXggNWFlYjU3YS4uNjk2MzY4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKQEAgLTYsNDcgKzYsMjEgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi1leHRlcm4gaW50IHByaW50ayhjb25zdCBjaGFyICogZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwotCiAvKgogICogWW91ciBiYXNpYyBTTVAgc3BpbmxvY2tzLCBhbGxvd2luZyBvbmx5IGEgc2luZ2xlIENQVSBhbnl3aGVyZQotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQl1bnNpZ25lZCBtYWdpYzsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gc3BpbmxvY2tfdDsKLQotI2RlZmluZSBTUElOTE9DS19NQUdJQwkweGRlYWQ0ZWFkCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUNfSU5JVAksIFNQSU5MT0NLX01BR0lDCi0jZWxzZQotI2RlZmluZSBTUElOTE9DS19NQUdJQ19JTklUCS8qICovCi0jZW5kaWYKLQotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgMSBTUElOTE9DS19NQUdJQ19JTklUIH0KLQotI2RlZmluZSBzcGluX2xvY2tfaW5pdCh4KQlkbyB7ICooeCkgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUoMCkKLQotLyoKKyAqCiAgKiBTaW1wbGUgc3BpbiBsb2NrIG9wZXJhdGlvbnMuICBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzLCBvbmUgY2xlYXJzIElSUSdzCiAgKiBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yLCBvbmUgZG9lcyBub3QuCiAgKgogICogV2UgbWFrZSBubyBmYWlybmVzcyBhc3N1bXB0aW9ucy4gVGhleSBoYXZlIGEgY29zdC4KKyAqCisgKiAodGhlIHR5cGUgZGVmaW5pdGlvbnMgYXJlIGluIGFzbS9zcGlubG9ja190eXBlcy5oKQogICovCiAKLSNkZWZpbmUgc3Bpbl9pc19sb2NrZWQoeCkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+bG9jaykgPD0gMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlkbyB7IGJhcnJpZXIoKTsgfSB3aGlsZShzcGluX2lzX2xvY2tlZCh4KSkKLSNkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9yYXdfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpIFwKKwkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDApCiAKLSNkZWZpbmUgc3Bpbl9sb2NrX3N0cmluZyBcCisjZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19zdHJpbmcgXAogCSJcbjE6XHQiIFwKIAkibG9jayA7IGRlY2IgJTBcblx0IiBcCiAJImpzIDJmXG4iIFwKQEAgLTU4LDc0ICszMiw0MCBAQAogCSJqbXAgMWJcbiIgXAogCUxPQ0tfU0VDVElPTl9FTkQKIAotLyoKLSAqIFRoaXMgd29ya3MuIERlc3BpdGUgYWxsIHRoZSBjb25mdXNpb24uCi0gKiAoZXhjZXB0IG9uIFBQcm8gU01QIG9yIGlmIHdlIGFyZSB1c2luZyBPT1NUT1JFKQotICogKFBQcm8gZXJyYXRhIDY2LCA5MikKLSAqLwotIAotI2lmICFkZWZpbmVkKENPTkZJR19YODZfT09TVE9SRSkgJiYgIWRlZmluZWQoQ09ORklHX1g4Nl9QUFJPX0ZFTkNFKQotCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3N0cmluZyBcCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZyBcCiAJIm1vdmIgJDEsJTAiIFwKLQkJOiI9bSIgKGxvY2stPmxvY2spIDogOiAibWVtb3J5IgorCQk6Ij1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5IgogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQyk7Ci0JYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spOwotI2VuZGlmCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCXNwaW5fdW5sb2NrX3N0cmluZwotCSk7CisJCV9fcmF3X3NwaW5fbG9ja19zdHJpbmcKKwkJOiI9bSIgKGxvY2stPnNsb2NrKSA6IDogIm1lbW9yeSIpOwogfQogCi0jZWxzZQorI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3N0cmluZyBcCi0JInhjaGdiICViMCwgJTEiIFwKLQkJOiI9cSIgKG9sZHZhbCksICI9bSIgKGxvY2stPmxvY2spIFwKLQkJOiIwIiAob2xkdmFsKSA6ICJtZW1vcnkiCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCi17Ci0JY2hhciBvbGR2YWwgPSAxOwotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQyk7Ci0JYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spOwotI2VuZGlmCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCXNwaW5fdW5sb2NrX3N0cmluZwotCSk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWNoYXIgb2xkdmFsOworCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJ4Y2hnYiAlYjAsJTEiCi0JCToiPXEiIChvbGR2YWwpLCAiPW0iIChsb2NrLT5sb2NrKQorCQk6Ij1xIiAob2xkdmFsKSwgIj1tIiAobG9jay0+c2xvY2spCiAJCToiMCIgKDApIDogIm1lbW9yeSIpOworCiAJcmV0dXJuIG9sZHZhbCA+IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCWlmIChsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQykgewotCQlwcmludGsoImVpcDogJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JCUJVRygpOwotCX0KLSNlbmRpZgogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlzcGluX2xvY2tfc3RyaW5nCi0JCToiPW0iIChsb2NrLT5sb2NrKSA6IDogIm1lbW9yeSIpOworCQlfX3Jhd19zcGluX3VubG9ja19zdHJpbmcKKwkpOwogfQogCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCWRvIHsgd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spKSBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoMCkKIAogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCkBAIC0xMzYsMzMgKzc2LDcgQEAKICAqIGNhbiAibWl4IiBpcnEtc2FmZSBsb2NrcyAtIGFueSB3cml0ZXIgbmVlZHMgdG8gZ2V0IGEKICAqIGlycS1zYWZlIHdyaXRlLWxvY2ssIGJ1dCByZWFkZXJzIGNhbiBnZXQgbm9uLWlycXNhZmUKICAqIHJlYWQtbG9ja3MuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQl1bnNpZ25lZCBtYWdpYzsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JdW5zaWduZWQgaW50IGJyZWFrX2xvY2s7Ci0jZW5kaWYKLX0gcndsb2NrX3Q7Ci0KLSNkZWZpbmUgUldMT0NLX01BR0lDCTB4ZGVhZjFlZWQKLQotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotI2RlZmluZSBSV0xPQ0tfTUFHSUNfSU5JVAksIFJXTE9DS19NQUdJQwotI2Vsc2UKLSNkZWZpbmUgUldMT0NLX01BR0lDX0lOSVQJLyogKi8KLSNlbmRpZgotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IFJXX0xPQ0tfQklBUyBSV0xPQ0tfTUFHSUNfSU5JVCB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQoeCkJZG8geyAqKHgpID0gUldfTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2soeCkJKChpbnQpKHgpLT5sb2NrID4gMCkKLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2soeCkJKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCi0KLS8qCisgKgogICogT24geDg2LCB3ZSBpbXBsZW1lbnQgcmVhZC13cml0ZSBsb2NrcyBhcyBhIDMyLWJpdCBjb3VudGVyCiAgKiB3aXRoIHRoZSBoaWdoIGJpdCAoc2lnbikgYmVpbmcgdGhlICJjb250ZW5kZWQiIGJpdC4KICAqCkBAIC0xNzAsMjkgKzg0LDI0IEBACiAgKgogICogQ2hhbmdlZCB0byB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHJ3IHNlbWFwaG9yZXMuICBTZWUKICAqIHNlbWFwaG9yZS5oIGZvciBkZXRhaWxzLiAgLWJlbgorICoKKyAqIHRoZSBoZWxwZXJzIGFyZSBpbiBhcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jCiAgKi8KLS8qIHRoZSBzcGlubG9jayBoZWxwZXJzIGFyZSBpbiBhcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqcncpCisjZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2soeCkJCSgoaW50KSh4KS0+bG9jayA+IDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHgpCQkoKHgpLT5sb2NrID09IFJXX0xPQ0tfQklBUykKKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSwotCUJVR19PTihydy0+bWFnaWMgIT0gUldMT0NLX01BR0lDKTsKLSNlbmRpZgogCV9fYnVpbGRfcmVhZF9sb2NrKHJ3LCAiX19yZWFkX2xvY2tfZmFpbGVkIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3dyaXRlX2xvY2socndsb2NrX3QgKnJ3KQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQlCVUdfT04ocnctPm1hZ2ljICE9IFJXTE9DS19NQUdJQyk7Ci0jZW5kaWYKIAlfX2J1aWxkX3dyaXRlX2xvY2socncsICJfX3dyaXRlX2xvY2tfZmFpbGVkIik7CiB9CiAKLSNkZWZpbmUgX3Jhd19yZWFkX3VubG9jayhydykJCWFzbSB2b2xhdGlsZSgibG9jayA7IGluY2wgJTAiIDoiPW0iICgocncpLT5sb2NrKSA6IDogIm1lbW9yeSIpCi0jZGVmaW5lIF9yYXdfd3JpdGVfdW5sb2NrKHJ3KQlhc20gdm9sYXRpbGUoImxvY2sgOyBhZGRsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwlMCI6Ij1tIiAoKHJ3KS0+bG9jaykgOiA6ICJtZW1vcnkiKQotCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7CiAJYXRvbWljX3QgKmNvdW50ID0gKGF0b21pY190ICopbG9jazsKIAlhdG9taWNfZGVjKGNvdW50KTsKQEAgLTIwMiw3ICsxMTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfcmF3X3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKIAlhdG9taWNfdCAqY291bnQgPSAoYXRvbWljX3QgKilsb2NrOwogCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KFJXX0xPQ0tfQklBUywgY291bnQpKQpAQCAtMjExLDQgKzEyMCwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlhc20gdm9sYXRpbGUoImxvY2sgOyBpbmNsICUwIiA6Ij1tIiAocnctPmxvY2spIDogOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlhc20gdm9sYXRpbGUoImxvY2sgOyBhZGRsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwlMCIKKwkJCQk6ICI9bSIgKHJ3LT5sb2NrKSA6IDogIm1lbW9yeSIpOworfQorCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWVmZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHNsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAxIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCmluZGV4IDQ4ZjI5MjcuLjFiYjhiOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaApAQCAtNDksMTMgKzQ5LDYgQEAKIAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgKF9fcmFuZ2Vfbm90X29rKGFkZHIsc2l6ZSkgPT0gMCkKIAotLyogdGhpcyBmdW5jdGlvbiB3aWxsIGdvIGF3YXkgc29vbiAtIHVzZSBhY2Nlc3Nfb2soKSBpbnN0ZWFkICovCi1leHRlcm4gaW5saW5lIGludCBfX2RlcHJlY2F0ZWQgdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KLQogLyoKICAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCiAgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdXh2ZWMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdkZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfX1hURU5TQV9BVVhWRUNfSAorI2RlZmluZSBfX1hURU5TQV9BVVhWRUNfSAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2ZjbnRsLmgKaW5kZXggNDg4NzZiYjcuLmVjMDY2YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCkBAIC0xNCwzMSArMTQsMTcgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQUNDTU9ERQkweDAwMDMKLSNkZWZpbmUgT19SRE9OTFkJMHgwMDAwCi0jZGVmaW5lIE9fV1JPTkxZCTB4MDAwMQotI2RlZmluZSBPX1JEV1IJCTB4MDAwMgogI2RlZmluZSBPX0FQUEVORAkweDAwMDgKICNkZWZpbmUgT19TWU5DCQkweDAwMTAKICNkZWZpbmUgT19OT05CTE9DSwkweDAwODAKICNkZWZpbmUgT19DUkVBVCAgICAgICAgIDB4MDEwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19UUlVOQwkJMHgwMjAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0VYQ0wJCTB4MDQwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19OT0NUVFkJMHgwODAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBGQVNZTkMJCTB4MTAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTB4MjAwMAkvKiBhbGxvdyBsYXJnZSBmaWxlIG9wZW5zIC0gY3VycmVudGx5IGlnbm9yZWQgKi8KICNkZWZpbmUgT19ESVJFQ1QJMHg4MDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQqLwotI2RlZmluZSBPX0RJUkVDVE9SWQkweDEwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgT19OT0ZPTExPVwkweDIwMDAwCS8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwogI2RlZmluZSBPX05PQVRJTUUJMHgxMDAwMDAKIAotI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCi0KLSNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KLSNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLwotI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCi0jZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KLSNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLwogI2RlZmluZSBGX0dFVExLCQkxNAogI2RlZmluZSBGX0dFVExLNjQgICAgICAgMTUKICNkZWZpbmUgRl9TRVRMSwkJNgpAQCAtNDgsMzUgKzM0LDYgQEAKIAogI2RlZmluZSBGX1NFVE9XTgkyNAkvKiAgZm9yIHNvY2tldHMuICovCiAjZGVmaW5lIEZfR0VUT1dOCTIzCS8qICBmb3Igc29ja2V0cy4gKi8KLSNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCi0KLS8qIGZvciBGX1tHRVR8U0VUXUZMICovCi0jZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KLQotLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KLSNkZWZpbmUgRl9SRExDSwkJMAotI2RlZmluZSBGX1dSTENLCQkxCi0jZGVmaW5lIEZfVU5MQ0sJCTIKLQotLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KLSNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCi0jZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLwotCi0vKiBmb3IgbGVhc2VzICovCi0jZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgotCi0vKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAotCQkJCSAgIGJsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KLQotI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAuLi4gKi8KLSNkZWZpbmUgTE9DS19SRUFECTY0CS8qICB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19XUklURQkxMjgJLyogIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgTE9DS19SVwkJMTkyCS8qICB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BzICovCiAKIHR5cGVkZWYgc3RydWN0IGZsb2NrIHsKIAlzaG9ydCBsX3R5cGU7CkBAIC05Niw2ICs1Myw5IEBACiAJcGlkX3QgIGxfcGlkOwogfTsKIAotI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorI2RlZmluZSBIQVZFX0FSQ0hfU1RSVUNUX0ZMT0NLCisjZGVmaW5lIEhBVkVfQVJDSF9TVFJVQ1RfRkxPQ0s2NAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZmNudGwuaD4KIAogI2VuZGlmIC8qIF9YVEVOU0FfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2hkcmVnLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaGRyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiODA2MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvaGRyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvaGRyZWcuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKLSAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvcnMKLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfSERSRUdfSAotI2RlZmluZSBfWFRFTlNBX0hEUkVHX0gKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgaWRlX2lvcmVnX3Q7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCmluZGV4IDI4NDhhNWYuLmFhNGZkN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKQEAgLTEyNyw3ICsxMjcsNyBAQAogI2Vsc2UJLyogX19BU1NFTUJMWV9fICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjIGluY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2RlZmluZSBQVF9SRUdTX09GRlNFVAkgIChLRVJORUxfU1RBQ0tfU0laRSAtIFBUX1VTRVJfU0laRSkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaAppbmRleCBmYzI2OGFjLi4wNmEyMmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2RlZmluZSBfQVNNTEFOR1VBR0UKICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCBiNDZhNTIwLi4wMjZjM2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CiAKIAotI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKyNpZmRlZiBDT05GSUdfQUNQSQogCiBlbnVtIGFjcGlfaXJxX21vZGVsX2lkIHsKIAlBQ1BJX0lSUV9NT0RFTF9QSUMgPSAwLApAQCAtNDI5LDIzICs0MjksMTMgQEAKIAogZXh0ZXJuIGludCBzYmZfcG9ydCA7CiAKLSNlbHNlCS8qIUNPTkZJR19BQ1BJX0JPT1QqLworI2Vsc2UJLyogIUNPTkZJR19BQ1BJICovCiAKICNkZWZpbmUgYWNwaV9tcF9jb25maWcJMAogCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQorI2VuZGlmIAkvKiAhQ09ORklHX0FDUEkgKi8KIAotc3RhdGljIGlubGluZSBpbnQgYWNwaV9ib290X3RhYmxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIAkvKiFDT05GSUdfQUNQSV9CT09UKi8KLQotdW5zaWduZWQgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CitpbnQgYWNwaV9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KTsKIGludCBhY3BpX2dzaV90b19pcnEgKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKTsKIAogLyoKQEAgLTQ1NSw3ICs0NDUsNyBAQAogICovCiB2b2lkIGFjcGlfdW5yZWdpc3Rlcl9nc2kgKHUzMiBnc2kpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfUENJCisjaWZkZWYgQ09ORklHX0FDUEkKIAogc3RydWN0IGFjcGlfcHJ0X2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CkBAIC00ODksNyArNDc5LDcgQEAKIGludCBhY3BpX3BjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfcGNpX2RyaXZlciAqZHJpdmVyKTsKIHZvaWQgYWNwaV9wY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfcGNpX2RyaXZlciAqZHJpdmVyKTsKIAotI2VuZGlmIC8qQ09ORklHX0FDUElfUENJKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCiAjaWZkZWYgQ09ORklHX0FDUElfRUMKIApAQCAtNDk4LDIwICs0ODgsOSBAQAogCiAjZW5kaWYgLypDT05GSUdfQUNQSV9FQyovCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9JTlRFUlBSRVRFUgotCiBleHRlcm4gaW50IGFjcGlfYmxhY2tsaXN0ZWQodm9pZCk7CiBleHRlcm4gdm9pZCBhY3BpX2Jpb3NfeWVhcihjaGFyICpzKTsKIAotI2Vsc2UgLyohQ09ORklHX0FDUElfSU5URVJQUkVURVIqLwotCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX2JsYWNrbGlzdGVkKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiFDT05GSUdfQUNQSV9JTlRFUlBSRVRFUiovCi0KICNkZWZpbmUJQUNQSV9DU1RBVEVfTElNSVRfREVGSU5FRAkvKiBmb3IgZHJpdmVyIGJ1aWxkcyAqLwogI2lmZGVmCUNPTkZJR19BQ1BJCiAKQEAgLTU0OSw1ICs1MjgsMTcgQEAKIAogZXh0ZXJuIGludCBwbnBhY3BpX2Rpc2FibGVkOwogCisjZWxzZQkvKiBDT05GSUdfQUNQSSAqLworCitzdGF0aWMgaW5saW5lIGludCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhY3BpX2Jvb3RfdGFibGVfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYJLyogQ09ORklHX0FDUEkgKi8KICNlbmRpZgkvKl9MSU5VWF9BQ1BJX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmggYi9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaAppbmRleCBhZjEwMTBiLi45M2JmYjBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaApAQCAtMTEsMTAgKzExLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciB7CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQJY29udGFpbmVyczsKKwlzdHJ1Y3Qga2xpc3QJCWNvbnRhaW5lcnM7CiAJc3RydWN0IGNsYXNzCQkqY2xhc3M7CiAJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKiphdHRyczsKIAlpbnQgKCptYXRjaCkoc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKiwgc3RydWN0IGRldmljZSAqKTsKQEAgLTYyLDEyICs2NCw4IEBACiAJCQkJCQkgc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NkZXYpOwogdm9pZCBhdHRyaWJ1dGVfY29udGFpbmVyX3JlbW92ZV9hdHRycyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc2Rldik7CiB2b2lkIGF0dHJpYnV0ZV9jb250YWluZXJfY2xhc3NfZGV2aWNlX2RlbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc2Rldik7Ci0KLQotCi0KLQotCitzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqYXR0cmlidXRlX2NvbnRhaW5lcl9jbGFzc2Rldl90b19jb250YWluZXIoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKK3N0cnVjdCBjbGFzc19kZXZpY2UgKmF0dHJpYnV0ZV9jb250YWluZXJfZmluZF9jbGFzc19kZXZpY2Uoc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKiwgc3RydWN0IGRldmljZSAqKTsKIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICoqYXR0cmlidXRlX2NvbnRhaW5lcl9jbGFzc2Rldl90b19hdHRycyhjb25zdCBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc2Rldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaCBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3YjM3NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfTElOVVhfQVVYVkVDX0gKKyNkZWZpbmUgX0xJTlVYX0FVWFZFQ19ICisKKyNpbmNsdWRlIDxhc20vYXV4dmVjLmg+CisKKy8qIFN5bWJvbGljIHZhbHVlcyBmb3IgdGhlIGVudHJpZXMgaW4gdGhlIGF1eGlsaWFyeSB0YWJsZQorICAgcHV0IG9uIHRoZSBpbml0aWFsIHN0YWNrICovCisjZGVmaW5lIEFUX05VTEwgICAwCS8qIGVuZCBvZiB2ZWN0b3IgKi8KKyNkZWZpbmUgQVRfSUdOT1JFIDEJLyogZW50cnkgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVRfRVhFQ0ZEIDIJLyogZmlsZSBkZXNjcmlwdG9yIG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhEUiAgIDMJLyogcHJvZ3JhbSBoZWFkZXJzIGZvciBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRU5UICA0CS8qIHNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgKi8KKyNkZWZpbmUgQVRfUEhOVU0gIDUJLyogbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyAqLworI2RlZmluZSBBVF9QQUdFU1ogNgkvKiBzeXN0ZW0gcGFnZSBzaXplICovCisjZGVmaW5lIEFUX0JBU0UgICA3CS8qIGJhc2UgYWRkcmVzcyBvZiBpbnRlcnByZXRlciAqLworI2RlZmluZSBBVF9GTEFHUyAgOAkvKiBmbGFncyAqLworI2RlZmluZSBBVF9FTlRSWSAgOQkvKiBlbnRyeSBwb2ludCBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX05PVEVMRiAxMAkvKiBwcm9ncmFtIGlzIG5vdCBFTEYgKi8KKyNkZWZpbmUgQVRfVUlEICAgIDExCS8qIHJlYWwgdWlkICovCisjZGVmaW5lIEFUX0VVSUQgICAxMgkvKiBlZmZlY3RpdmUgdWlkICovCisjZGVmaW5lIEFUX0dJRCAgICAxMwkvKiByZWFsIGdpZCAqLworI2RlZmluZSBBVF9FR0lEICAgMTQJLyogZWZmZWN0aXZlIGdpZCAqLworI2RlZmluZSBBVF9QTEFURk9STSAxNSAgLyogc3RyaW5nIGlkZW50aWZ5aW5nIENQVSBmb3Igb3B0aW1pemF0aW9ucyAqLworI2RlZmluZSBBVF9IV0NBUCAgMTYgICAgLyogYXJjaCBkZXBlbmRlbnQgaGludHMgYXQgQ1BVIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBBVF9DTEtUQ0sgMTcJLyogZnJlcXVlbmN5IGF0IHdoaWNoIHRpbWVzKCkgaW5jcmVtZW50cyAqLworCisjZGVmaW5lIEFUX1NFQ1VSRSAyMyAgIC8qIHNlY3VyZSBtb2RlIGJvb2xlYW4gKi8KKworI2RlZmluZSBBVF9WRUNUT1JfU0laRSAgNDIgLyogU2l6ZSBvZiBhdXhpbGlhcnkgdGFibGUuICAqLworCisjZW5kaWYgLyogX0xJTlVYX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jmc19mcy5oIGIvaW5jbHVkZS9saW51eC9iZnNfZnMuaAppbmRleCBmN2YwOTEzLi5jMTIzN2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmZzX2ZzLmgKQEAgLTE0LDggKzE0LDkgQEAKICNkZWZpbmUgQkZTX0lOT0RFU19QRVJfQkxPQ0sJOAogCiAvKiBTVlI0IHZub2RlIHR5cGUgdmFsdWVzIChiZnNfaW5vZGUtPmlfdnR5cGUpICovCi0jZGVmaW5lIEJGU19WRElSCQkyCi0jZGVmaW5lIEJGU19WUkVHCQkxCisjZGVmaW5lIEJGU19WRElSIDJMCisjZGVmaW5lIEJGU19WUkVHIDFMCisKIAogLyogQkZTIGlub2RlIGxheW91dCBvbiBkaXNrICovCiBzdHJ1Y3QgYmZzX2lub2RlIHsKQEAgLTU4LDIyICs1OSwyMiBAQAogCV9fdTMyIHNfcGFkZGluZ1sxMThdOwogfTsKIAotI2RlZmluZSBCRlNfTlpGSUxFU0laRShpcCkgXAotICAgICAgICAoKChpcCktPmlfZW9mZnNldCArIDEpIC0gKGlwKS0+aV9zYmxvY2sgKiBCRlNfQlNJWkUpCi0KLSNkZWZpbmUgQkZTX0ZJTEVTSVpFKGlwKSBcCi0gICAgICAgICgoaXApLT5pX3NibG9jayA9PSAwID8gMCA6IEJGU19OWkZJTEVTSVpFKGlwKSkKLQotI2RlZmluZSBCRlNfRklMRUJMT0NLUyhpcCkgXAotICAgICAgICAoKGlwKS0+aV9zYmxvY2sgPT0gMCA/IDAgOiAoKGlwKS0+aV9lYmxvY2sgKyAxKSAtIChpcCktPmlfc2Jsb2NrKQogCiAjZGVmaW5lIEJGU19PRkYySU5PKG9mZnNldCkgXAogICAgICAgICAoKCgob2Zmc2V0KSAtIEJGU19CU0laRSkgLyBzaXplb2Yoc3RydWN0IGJmc19pbm9kZSkpICsgQkZTX1JPT1RfSU5PKQogCiAjZGVmaW5lIEJGU19JTk8yT0ZGKGlubykgXAogCSgoX191MzIpKCgoaW5vKSAtIEJGU19ST09UX0lOTykgKiBzaXplb2Yoc3RydWN0IGJmc19pbm9kZSkpICsgQkZTX0JTSVpFKQorI2RlZmluZSBCRlNfTlpGSUxFU0laRShpcCkgXAorICAgICAgICAoKGNwdV90b19sZTMyKChpcCktPmlfZW9mZnNldCkgKyAxKSAtICBjcHVfdG9fbGUzMigoaXApLT5pX3NibG9jaykgKiBCRlNfQlNJWkUpCiAKKyNkZWZpbmUgQkZTX0ZJTEVTSVpFKGlwKSBcCisgICAgICAgICgoaXApLT5pX3NibG9jayA9PSAwID8gMCA6IEJGU19OWkZJTEVTSVpFKGlwKSkKKworI2RlZmluZSBCRlNfRklMRUJMT0NLUyhpcCkgXAorICAgICAgICAoKGlwKS0+aV9zYmxvY2sgPT0gMCA/IDAgOiAoY3B1X3RvX2xlMzIoKGlwKS0+aV9lYmxvY2spICsgMSkgLSAgY3B1X3RvX2xlMzIoKGlwKS0+aV9zYmxvY2spKQogI2RlZmluZSBCRlNfVU5DTEVBTihiZnNfc2IsIHNiKQlcCi0JKChiZnNfc2ItPnNfZnJvbSAhPSAtMSkgJiYgKGJmc19zYi0+c190byAhPSAtMSkgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJKChjcHVfdG9fbGUzMihiZnNfc2ItPnNfZnJvbSkgIT0gLTEpICYmIChjcHVfdG9fbGUzMihiZnNfc2ItPnNfdG8pICE9IC0xKSAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwogCiAjZW5kaWYJLyogX0xJTlVYX0JGU19GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCAzNmVmMjlmLi42ZTFjNzljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTExMSw3ICsxMTEsNiBAQAogCXZvaWQJCQkqYmlfcHJpdmF0ZTsKIAogCWJpb19kZXN0cnVjdG9yX3QJKmJpX2Rlc3RydWN0b3I7CS8qIGRlc3RydWN0b3IgKi8KLQlzdHJ1Y3QgYmlvX3NldAkJKmJpX3NldDsJLyogbWVtb3J5IHBvb2xzIHNldCAqLwogfTsKIAogLyoKQEAgLTI4MCw2ICsyNzksNyBAQAogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19hbGxvYyh1bnNpZ25lZCBpbnQgX19ub2Nhc3QsIGludCk7CiBleHRlcm4gc3RydWN0IGJpbyAqYmlvX2FsbG9jX2Jpb3NldCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QsIGludCwgc3RydWN0IGJpb19zZXQgKik7CiBleHRlcm4gdm9pZCBiaW9fcHV0KHN0cnVjdCBiaW8gKik7CitleHRlcm4gdm9pZCBiaW9fZnJlZShzdHJ1Y3QgYmlvICosIHN0cnVjdCBiaW9fc2V0ICopOwogCiBleHRlcm4gdm9pZCBiaW9fZW5kaW8oc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBpbnQsIGludCk7CiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZTsKQEAgLTI5NSw3ICsyOTUsMTMgQEAKIGV4dGVybiBpbnQgYmlvX2dldF9ucl92ZWNzKHN0cnVjdCBibG9ja19kZXZpY2UgKik7CiBleHRlcm4gc3RydWN0IGJpbyAqYmlvX21hcF91c2VyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKIAkJCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQsIGludCk7CitzdHJ1Y3Qgc2dfaW92ZWM7CitleHRlcm4gc3RydWN0IGJpbyAqYmlvX21hcF91c2VyX2lvdihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLAorCQkJCSAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCQkJICAgIHN0cnVjdCBzZ19pb3ZlYyAqLCBpbnQsIGludCk7CiBleHRlcm4gdm9pZCBiaW9fdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICopOworZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19tYXBfa2VybihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB2b2lkICosIHVuc2lnbmVkIGludCwKKwkJCQl1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgYmlvX3NldF9wYWdlc19kaXJ0eShzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIHZvaWQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KHN0cnVjdCBiaW8gKmJpbyk7CiBleHRlcm4gc3RydWN0IGJpbyAqYmlvX2NvcHlfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQsIGludCk7CkBAIC0zMDgsOSArMzE0LDggQEAKICAqIGJ2ZWNfa21hcF9pcnEgYW5kIGJ2ZWNfa3VubWFwX2lycSEhCiAgKgogICogVGhpcyBmdW5jdGlvbiBNVVNUIGJlIGlubGluZWQgLSBpdCBwbGF5cyB3aXRoIHRoZSBDUFUgaW50ZXJydXB0IGZsYWdzLgotICogSGVuY2UgdGhlIGBleHRlcm4gaW5saW5lJy4KICAqLwotZXh0ZXJuIGlubGluZSBjaGFyICpidmVjX2ttYXBfaXJxKHN0cnVjdCBiaW9fdmVjICpidmVjLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3N0YXRpYyBpbmxpbmUgY2hhciAqYnZlY19rbWFwX2lycShzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCkBAIC0zMjYsNyArMzMxLDcgQEAKIAlyZXR1cm4gKGNoYXIgKikgYWRkciArIGJ2ZWMtPmJ2X29mZnNldDsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGJ2ZWNfa3VubWFwX2lycShjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorc3RhdGljIGlubGluZSB2b2lkIGJ2ZWNfa3VubWFwX2lycShjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgcHRyID0gKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlciAmIFBBR0VfTUFTSzsKIApAQCAtMzM5LDcgKzM0NCw3IEBACiAjZGVmaW5lIGJ2ZWNfa3VubWFwX2lycShidWYsIGZsYWdzKQlkbyB7ICooZmxhZ3MpID0gMDsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1leHRlcm4gaW5saW5lIGNoYXIgKl9fYmlvX2ttYXBfaXJxKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgc2hvcnQgaWR4LAorc3RhdGljIGlubGluZSBjaGFyICpfX2Jpb19rbWFwX2lycShzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIHNob3J0IGlkeCwKIAkJCQkgICB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAlyZXR1cm4gYnZlY19rbWFwX2lycShiaW9faW92ZWNfaWR4KGJpbywgaWR4KSwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRfc3BpbmxvY2suaCBiL2luY2x1ZGUvbGludXgvYml0X3NwaW5sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMGFmMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYml0X3NwaW5sb2NrLmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfX0xJTlVYX0JJVF9TUElOTE9DS19ICisjZGVmaW5lIF9fTElOVVhfQklUX1NQSU5MT0NLX0gKKworLyoKKyAqICBiaXQtYmFzZWQgc3Bpbl9sb2NrKCkKKyAqCisgKiBEb24ndCB1c2UgdGhpcyB1bmxlc3MgeW91IHJlYWxseSBuZWVkIHRvOiBzcGluX2xvY2soKSBhbmQgc3Bpbl91bmxvY2soKQorICogYXJlIHNpZ25pZmljYW50bHkgZmFzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYml0X3NwaW5fbG9jayhpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCS8qCisJICogQXNzdW1pbmcgdGhlIGxvY2sgaXMgdW5jb250ZW5kZWQsIHRoaXMgbmV2ZXIgZW50ZXJzCisJICogdGhlIGJvZHkgb2YgdGhlIG91dGVyIGxvb3AuIElmIGl0IGlzIGNvbnRlbmRlZCwgdGhlbgorCSAqIHdpdGhpbiB0aGUgaW5uZXIgbG9vcCBhIG5vbi1hdG9taWMgdGVzdCBpcyB1c2VkIHRvCisJICogYnVzeXdhaXQgd2l0aCBsZXNzIGJ1cyBjb250ZW50aW9uIGZvciBhIGdvb2QgdGltZSB0bworCSAqIGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgbG9jayBiaXQuCisJICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChiaXRudW0sIGFkZHIpKSB7CisJCXdoaWxlICh0ZXN0X2JpdChiaXRudW0sIGFkZHIpKSB7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJY3B1X3JlbGF4KCk7CisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJfQorCX0KKyNlbmRpZgorCV9fYWNxdWlyZShiaXRsb2NrKTsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIGl0IHdhcyBhY3F1aXJlZAorICovCitzdGF0aWMgaW5saW5lIGludCBiaXRfc3Bpbl90cnlsb2NrKGludCBiaXRudW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChiaXRudW0sIGFkZHIpKSB7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCV9fYWNxdWlyZShiaXRsb2NrKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqICBiaXQtYmFzZWQgc3Bpbl91bmxvY2soKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYml0X3NwaW5fdW5sb2NrKGludCBiaXRudW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKKwlCVUdfT04oIXRlc3RfYml0KGJpdG51bSwgYWRkcikpOworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChiaXRudW0sIGFkZHIpOworI2VuZGlmCisJcHJlZW1wdF9lbmFibGUoKTsKKwlfX3JlbGVhc2UoYml0bG9jayk7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbG9jayBpcyBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIGludCBiaXRfc3Bpbl9pc19sb2NrZWQoaW50IGJpdG51bSwgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQorCXJldHVybiB0ZXN0X2JpdChiaXRudW0sIGFkZHIpOworI2VsaWYgZGVmaW5lZCBDT05GSUdfUFJFRU1QVAorCXJldHVybiBwcmVlbXB0X2NvdW50KCk7CisjZWxzZQorCXJldHVybiAxOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBfX0xJTlVYX0JJVF9TUElOTE9DS19IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDE5YmQ4ZTcuLmVmZGM5YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtNTYzLDEwICs1NjMsMTIgQEAKIGV4dGVybiB2b2lkIF9fYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKIGV4dGVybiB2b2lkIGJsa19ydW5fcXVldWUocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2FjdGl2aXR5X2ZuKHJlcXVlc3RfcXVldWVfdCAqLCBhY3Rpdml0eV9mbiAqLCB2b2lkICopOwotZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICpibGtfcnFfbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICosIGludCwgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiBpbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBibGtfZXhlY3V0ZV9ycShyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci0KK2V4dGVybiBpbnQgYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkIF9fdXNlciAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGJsa19ycV9tYXBfa2VybihyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzZ19pb3ZlYyAqLCBpbnQpOworZXh0ZXJuIGludCBibGtfZXhlY3V0ZV9ycShyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwKKwkJCSAgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKIHN0YXRpYyBpbmxpbmUgcmVxdWVzdF9xdWV1ZV90ICpiZGV2X2dldF9xdWV1ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewogCXJldHVybiBiZGV2LT5iZF9kaXNrLT5xdWV1ZTsKQEAgLTcyNiw3ICs3MjgsNyBAQAogCXJldHVybiBiaXRzOwogfQogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGludCBibG9ja19zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBibG9ja19zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJcmV0dXJuIGJkZXYtPmJkX2Jsb2NrX3NpemU7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NoaW8uaCBiL2luY2x1ZGUvbGludXgvY2hpby5oCmluZGV4IDYzMDM1YWUuLmE0MDRjMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2hpby5oCisrKyBiL2luY2x1ZGUvbGludXgvY2hpby5oCkBAIC05Niw3ICs5Niw3IEBACiAgKi8KIHN0cnVjdCBjaGFuZ2VyX2VsZW1lbnRfc3RhdHVzIHsKIAlpbnQgICAgICAgICAgICAgY2VzX3R5cGU7Ci0JdW5zaWduZWQgY2hhciAgICpjZXNfZGF0YTsKKwl1bnNpZ25lZCBjaGFyICAgX191c2VyICpjZXNfZGF0YTsKIH07CiAjZGVmaW5lIENFU1RBVFVTX0ZVTEwgICAgIDB4MDEgLyogZnVsbCAqLwogI2RlZmluZSBDRVNUQVRVU19JTVBFWFAgICAweDAyCS8qIG1lZGlhIHdhcyBpbXBvcnRlZCAoaW5zZXJ0ZWQgYnkgc3lzb3ApICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaAppbmRleCBiNThiN2Q2Li5mOWNhNTM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKQEAgLTE4LDYgKzE4LDkgQEAKICNkZWZpbmUgY29tcGF0X2ppZmZpZXNfdG9fY2xvY2tfdCh4KQlcCiAJCSgoKHVuc2lnbmVkIGxvbmcpKHgpICogQ09NUEFUX1VTRVJfSFopIC8gSFopCiAKK3R5cGVkZWYgX19jb21wYXRfdWlkMzJfdAljb21wYXRfdWlkX3Q7Cit0eXBlZGVmIF9fY29tcGF0X2dpZDMyX3QJY29tcGF0X2dpZF90OworCiBzdHJ1Y3QgcnVzYWdlOwogCiBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgeyAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmggYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCmluZGV4IDM0MzgyMzMuLjI0MDYyYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaApAQCAtMjMsNyArMjMsOCBAQAogdm9pZCBjcHVzZXRfdXBkYXRlX2N1cnJlbnRfbWVtc19hbGxvd2VkKHZvaWQpOwogdm9pZCBjcHVzZXRfcmVzdHJpY3RfdG9fbWVtc19hbGxvd2VkKHVuc2lnbmVkIGxvbmcgKm5vZGVzKTsKIGludCBjcHVzZXRfem9uZWxpc3RfdmFsaWRfbWVtc19hbGxvd2VkKHN0cnVjdCB6b25lbGlzdCAqemwpOwotaW50IGNwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnopOworZXh0ZXJuIGludCBjcHVzZXRfem9uZV9hbGxvd2VkKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spOworZXh0ZXJuIGludCBjcHVzZXRfZXhjbF9ub2Rlc19vdmVybGFwKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NwdXNldF9vcGVyYXRpb25zOwogZXh0ZXJuIGNoYXIgKmNwdXNldF90YXNrX3N0YXR1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKTsKIApAQCAtNDgsNyArNDksMTMgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeikKK3N0YXRpYyBpbmxpbmUgaW50IGNwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnosCisJCQkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyYzE2LmggYi9pbmNsdWRlL2xpbnV4L2NyYzE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZGY4MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3JjMTYuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICoJY3JjMTYuaCAtIENSQy0xNiByb3V0aW5lCisgKgorICogSW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgQ1JDLTE2LCBhcyB1c2VkIHdpdGggMS13aXJlIGRldmljZXM6CisgKiAgIFdpZHRoIDE2CisgKiAgIFBvbHkgIDB4ODAwNSAoeF4xNiArIHheMTUgKyB4XjIgKyAxKQorICogICBJbml0ICAwCisgKgorICogRm9yIDEtd2lyZSBkZXZpY2VzLCB0aGUgQ1JDIGlzIHN0b3JlZCBpbnZlcnRlZCwgTFNCLWZpcnN0CisgKgorICogRXhhbXBsZSBidWZmZXIgd2l0aCB0aGUgQ1JDIGF0dGFjaGVkOgorICogICAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSBDMiA0NAorICoKKyAqIFRoZSBDUkMgb3ZlciBhIGJ1ZmZlciB3aXRoIHRoZSBDUkMgYXR0YWNoZWQgaXMgMHhCMDAxLgorICogU28sIGlmIChjcmMxNigwLCBidWYsIHNpemUpID09IDB4QjAwMSkgdGhlbiB0aGUgYnVmZmVyIGlzIHZhbGlkLgorICoKKyAqIFJlZmVyIHRvICJBcHBsaWNhdGlvbiBOb3RlIDkzNzogQm9vayBvZiBpQnV0dG9uIFN0YW5kYXJkcyIgZm9yIGRldGFpbHMuCisgKiBodHRwOi8vd3d3Lm1heGltLWljLmNvbS9hcHBub3Rlcy5jZm0vYXBwbm90ZV9udW1iZXIvOTM3CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DUkMxNl9ICisjZGVmaW5lIF9fQ1JDMTZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBDUkMxNl9JTklUCQkwCisjZGVmaW5lIENSQzE2X1ZBTElECQkweGIwMDEKKworZXh0ZXJuIHUxNiBjb25zdCBjcmMxNl90YWJsZVsyNTZdOworCitleHRlcm4gdTE2IGNyYzE2KHUxNiBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pOworCitzdGF0aWMgaW5saW5lIHUxNiBjcmMxNl9ieXRlKHUxNiBjcmMsIGNvbnN0IHU4IGRhdGEpCit7CisJcmV0dXJuIChjcmMgPj4gOCkgXiBjcmMxNl90YWJsZVsoY3JjIF4gZGF0YSkgJiAweGZmXTsKK30KKworI2VuZGlmIC8qIF9fQ1JDMTZfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA1MGJlMjkwLi5hYjA0YjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTg4LDggKzg4LDkgQEAKIAkJCQkJICogbmVnYXRpdmUgKi8KIAkvKgogCSAqIFRoZSBuZXh0IHRocmVlIGZpZWxkcyBhcmUgdG91Y2hlZCBieSBfX2RfbG9va3VwLiAgUGxhY2UgdGhlbSBoZXJlCi0JICogc28gdGhleSBhbGwgZml0IGluIGEgMTYtYnl0ZSByYW5nZSwgd2l0aCAxNi1ieXRlIGFsaWdubWVudC4KKwkgKiBzbyB0aGV5IGFsbCBmaXQgaW4gYSBjYWNoZSBsaW5lLgogCSAqLworCXN0cnVjdCBobGlzdF9ub2RlIGRfaGFzaDsJLyogbG9va3VwIGhhc2ggbGlzdCAqLwogCXN0cnVjdCBkZW50cnkgKmRfcGFyZW50OwkvKiBwYXJlbnQgZGlyZWN0b3J5ICovCiAJc3RydWN0IHFzdHIgZF9uYW1lOwogCkBAIC0xMDMsNyArMTA0LDYgQEAKIAl2b2lkICpkX2ZzZGF0YTsJCQkvKiBmcy1zcGVjaWZpYyBkYXRhICovCiAgCXN0cnVjdCByY3VfaGVhZCBkX3JjdTsKIAlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKmRfY29va2llOyAvKiBjb29raWUsIGlmIGFueSAqLwotCXN0cnVjdCBobGlzdF9ub2RlIGRfaGFzaDsJLyogbG9va3VwIGhhc2ggbGlzdCAqLwkKIAlpbnQgZF9tb3VudGVkOwogCXVuc2lnbmVkIGNoYXIgZF9pbmFtZVtETkFNRV9JTkxJTkVfTEVOX01JTl07CS8qIHNtYWxsIG5hbWVzICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kY2NwLmggYi9pbmNsdWRlL2xpbnV4L2RjY3AuaAppbmRleCAwMDdjMjkwLi44YmY0YmFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjY3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RjY3AuaApAQCAtNDMyLDcgKzQzMiwxMCBAQAogCXN0cnVjdCBjY2lkCQkJKmRjY3BzX2hjX3J4X2NjaWQ7CiAJc3RydWN0IGNjaWQJCQkqZGNjcHNfaGNfdHhfY2NpZDsKIAlzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkCWRjY3BzX29wdGlvbnNfcmVjZWl2ZWQ7CisJc3RydWN0IHRpbWV2YWwJCQlkY2Nwc19lcG9jaDsKIAllbnVtIGRjY3Bfcm9sZQkJCWRjY3BzX3JvbGU6MjsKKwlfX3U4CQkJCWRjY3BzX2hjX3J4X2luc2VydF9vcHRpb25zOjE7CisJX191OAkJCQlkY2Nwc19oY190eF9pbnNlcnRfb3B0aW9uczoxOwogfTsKICAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3Bfc29jayAqZGNjcF9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYXBvb2wuaCBiL2luY2x1ZGUvbGludXgvZG1hcG9vbC5oCmluZGV4IGU2MGJmZGEuLjQ5MzJlZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hcG9vbC5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hcG9vbC5oCkBAIC0xOSw3ICsxOSw4IEBACiAKIHZvaWQgZG1hX3Bvb2xfZGVzdHJveShzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wpOwogCi12b2lkICpkbWFfcG9vbF9hbGxvYyhzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsIGludCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmhhbmRsZSk7Cit2b2lkICpkbWFfcG9vbF9hbGxvYyhzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGludCBfX25vY2FzdCBtZW1fZmxhZ3MsCisJCSAgICAgZG1hX2FkZHJfdCAqaGFuZGxlKTsKIAogdm9pZCBkbWFfcG9vbF9mcmVlKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYWRkcik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1pLmggYi9pbmNsdWRlL2xpbnV4L2RtaS5oCmluZGV4IDVlOTNlNmQuLmMzMDE3NWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1pLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWkuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19ETUlfSF9fCiAjZGVmaW5lIF9fRE1JX0hfXwogCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCiBlbnVtIGRtaV9maWVsZCB7CiAJRE1JX05PTkUsCiAJRE1JX0JJT1NfVkVORE9SLApAQCAtMTYsNiArMTgsMjQgQEAKIAlETUlfU1RSSU5HX01BWCwKIH07CiAKK2VudW0gZG1pX2RldmljZV90eXBlIHsKKwlETUlfREVWX1RZUEVfQU5ZID0gMCwKKwlETUlfREVWX1RZUEVfT1RIRVIsCisJRE1JX0RFVl9UWVBFX1VOS05PV04sCisJRE1JX0RFVl9UWVBFX1ZJREVPLAorCURNSV9ERVZfVFlQRV9TQ1NJLAorCURNSV9ERVZfVFlQRV9FVEhFUk5FVCwKKwlETUlfREVWX1RZUEVfVE9LRU5SSU5HLAorCURNSV9ERVZfVFlQRV9TT1VORCwKKwlETUlfREVWX1RZUEVfSVBNSSA9IC0xCit9OworCitzdHJ1Y3QgZG1pX2hlYWRlciB7CisJdTggdHlwZTsKKwl1OCBsZW5ndGg7CisJdTE2IGhhbmRsZTsKK307CisKIC8qCiAgKglETUkgY2FsbGJhY2tzIGZvciBwcm9ibGVtIGJvYXJkcwogICovCkBAIC0yNiwyMiArNDYsMzIgQEAKIAogc3RydWN0IGRtaV9zeXN0ZW1faWQgewogCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqKTsKLQljaGFyICppZGVudDsKKwljb25zdCBjaGFyICppZGVudDsKIAlzdHJ1Y3QgZG1pX3N0cm1hdGNoIG1hdGNoZXNbNF07CiAJdm9pZCAqZHJpdmVyX2RhdGE7CiB9OwogCi0jZGVmaW5lIERNSV9NQVRDSChhLGIpCXsgYSwgYiB9CisjZGVmaW5lIERNSV9NQVRDSChhLCBiKQl7IGEsIGIgfQorCitzdHJ1Y3QgZG1pX2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqZGV2aWNlX2RhdGE7CS8qIFR5cGUgc3BlY2lmaWMgZGF0YSAqLworfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4NikgJiYgIWRlZmluZWQoQ09ORklHX1g4Nl82NCkKIAogZXh0ZXJuIGludCBkbWlfY2hlY2tfc3lzdGVtKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpsaXN0KTsKIGV4dGVybiBjaGFyICogZG1pX2dldF9zeXN0ZW1faW5mbyhpbnQgZmllbGQpOwotCitleHRlcm4gc3RydWN0IGRtaV9kZXZpY2UgKiBkbWlfZmluZF9kZXZpY2UoaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJc3RydWN0IGRtaV9kZXZpY2UgKmZyb20pOwogI2Vsc2UKIAogc3RhdGljIGlubGluZSBpbnQgZG1pX2NoZWNrX3N5c3RlbShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbGlzdCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBjaGFyICogZG1pX2dldF9zeXN0ZW1faW5mbyhpbnQgZmllbGQpIHsgcmV0dXJuIE5VTEw7IH0KK3N0YXRpYyBzdHJ1Y3QgZG1pX2RldmljZSAqIGRtaV9maW5kX2RldmljZShpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwlzdHJ1Y3QgZG1pX2RldmljZSAqZnJvbSkgeyByZXR1cm4gTlVMTDsgfQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGYuaCBiL2luY2x1ZGUvbGludXgvZWxmLmgKaW5kZXggZjViM2JhNS4uZmY5NTVkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfRUxGX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYXV4dmVjLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogCiAjaWZuZGVmIGVsZl9yZWFkX2ltcGxpZXNfZXhlYwpAQCAtMTU4LDI5ICsxNTksNiBAQAogI2RlZmluZSBFTEY2NF9TVF9CSU5EKHgpCUVMRl9TVF9CSU5EKHgpCiAjZGVmaW5lIEVMRjY0X1NUX1RZUEUoeCkJRUxGX1NUX1RZUEUoeCkKIAotLyogU3ltYm9saWMgdmFsdWVzIGZvciB0aGUgZW50cmllcyBpbiB0aGUgYXV4aWxpYXJ5IHRhYmxlCi0gICBwdXQgb24gdGhlIGluaXRpYWwgc3RhY2sgKi8KLSNkZWZpbmUgQVRfTlVMTCAgIDAJLyogZW5kIG9mIHZlY3RvciAqLwotI2RlZmluZSBBVF9JR05PUkUgMQkvKiBlbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLwotI2RlZmluZSBBVF9FWEVDRkQgMgkvKiBmaWxlIGRlc2NyaXB0b3Igb2YgcHJvZ3JhbSAqLwotI2RlZmluZSBBVF9QSERSICAgMwkvKiBwcm9ncmFtIGhlYWRlcnMgZm9yIHByb2dyYW0gKi8KLSNkZWZpbmUgQVRfUEhFTlQgIDQJLyogc2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAqLwotI2RlZmluZSBBVF9QSE5VTSAgNQkvKiBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzICovCi0jZGVmaW5lIEFUX1BBR0VTWiA2CS8qIHN5c3RlbSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgQVRfQkFTRSAgIDcJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycHJldGVyICovCi0jZGVmaW5lIEFUX0ZMQUdTICA4CS8qIGZsYWdzICovCi0jZGVmaW5lIEFUX0VOVFJZICA5CS8qIGVudHJ5IHBvaW50IG9mIHByb2dyYW0gKi8KLSNkZWZpbmUgQVRfTk9URUxGIDEwCS8qIHByb2dyYW0gaXMgbm90IEVMRiAqLwotI2RlZmluZSBBVF9VSUQgICAgMTEJLyogcmVhbCB1aWQgKi8KLSNkZWZpbmUgQVRfRVVJRCAgIDEyCS8qIGVmZmVjdGl2ZSB1aWQgKi8KLSNkZWZpbmUgQVRfR0lEICAgIDEzCS8qIHJlYWwgZ2lkICovCi0jZGVmaW5lIEFUX0VHSUQgICAxNAkvKiBlZmZlY3RpdmUgZ2lkICovCi0jZGVmaW5lIEFUX1BMQVRGT1JNIDE1ICAvKiBzdHJpbmcgaWRlbnRpZnlpbmcgQ1BVIGZvciBvcHRpbWl6YXRpb25zICovCi0jZGVmaW5lIEFUX0hXQ0FQICAxNiAgICAvKiBhcmNoIGRlcGVuZGVudCBoaW50cyBhdCBDUFUgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEFUX0NMS1RDSyAxNwkvKiBmcmVxdWVuY3kgYXQgd2hpY2ggdGltZXMoKSBpbmNyZW1lbnRzICovCi0KLSNkZWZpbmUgQVRfU0VDVVJFIDIzICAgLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLwotCiB0eXBlZGVmIHN0cnVjdCBkeW5hbWljewogICBFbGYzMl9Td29yZCBkX3RhZzsKICAgdW5pb257CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCmluZGV4IGE2NTcxMzBiLi5mN2JkMWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaApAQCAtMzEzLDYgKzMxMyw5IEBACiAjZGVmaW5lIEVYVDJfTU9VTlRfWEFUVFJfVVNFUgkJMHgwMDQwMDAgIC8qIEV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcyAqLwogI2RlZmluZSBFWFQyX01PVU5UX1BPU0lYX0FDTAkJMHgwMDgwMDAgIC8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCiAjZGVmaW5lIEVYVDJfTU9VTlRfWElQCQkJMHgwMTAwMDAgIC8qIEV4ZWN1dGUgaW4gcGxhY2UgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9VU1JRVU9UQQkJMHgwMjAwMDAgLyogdXNlciBxdW90YSAqLworI2RlZmluZSBFWFQyX01PVU5UX0dSUFFVT1RBCQkweDA0MDAwMCAvKiBncm91cCBxdW90YSAqLworCiAKICNkZWZpbmUgY2xlYXJfb3B0KG8sIG9wdCkJCW8gJj0gfkVYVDJfTU9VTlRfIyNvcHQKICNkZWZpbmUgc2V0X29wdChvLCBvcHQpCQkJbyB8PSBFWFQyX01PVU5UXyMjb3B0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCmluZGV4IGMxNjY2MjguLmMwMjcyZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCkBAIC0zNzMsNiArMzczLDggQEAKICNkZWZpbmUgRVhUM19NT1VOVF9CQVJSSUVSCQkweDIwMDAwIC8qIFVzZSBibG9jayBiYXJyaWVycyAqLwogI2RlZmluZSBFWFQzX01PVU5UX05PQkgJCQkweDQwMDAwIC8qIE5vIGJ1ZmZlcmhlYWRzICovCiAjZGVmaW5lIEVYVDNfTU9VTlRfUVVPVEEJCTB4ODAwMDAgLyogU29tZSBxdW90YSBvcHRpb24gc2V0ICovCisjZGVmaW5lIEVYVDNfTU9VTlRfVVNSUVVPVEEJCTB4MTAwMDAwIC8qICJvbGQiIHVzZXIgcXVvdGEgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9HUlBRVU9UQQkJMHgyMDAwMDAgLyogIm9sZCIgZ3JvdXAgcXVvdGEgKi8KIAogLyogQ29tcGF0aWJpbGl0eSwgZm9yIGhhdmluZyBib3RoIGV4dDJfZnMuaCBhbmQgZXh0M19mcy5oIGluY2x1ZGVkIGF0IG9uY2UgKi8KICNpZm5kZWYgX0xJTlVYX0VYVDJfRlNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IGJjMjRiZWUuLjgyZTM5Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTEwNyw2ICsxMDcsOCBAQAogI2RlZmluZSBGQl9BQ0NFTF9OVl8yMCAgICAgICAgICA0NCAgICAgIC8qIG5WaWRpYSBBcmNoIDIwICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTlZfMzAgICAgICAgICAgNDUgICAgICAvKiBuVmlkaWEgQXJjaCAzMCAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05WXzQwICAgICAgICAgIDQ2ICAgICAgLyogblZpZGlhIEFyY2ggNDAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1YJNDcJLyogWEdJIFZvbGFyaSBWM1hULCBWNSwgVjggICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1oJNDgJLyogWEdJIFZvbGFyaSBaNyAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9ORU9NQUdJQ19OTTIwNzAgOTAJLyogTmVvTWFnaWMgTk0yMDcwICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9ORU9NQUdJQ19OTTIwOTAgOTEJLyogTmVvTWFnaWMgTk0yMDkwICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9ORU9NQUdJQ19OTTIwOTMgOTIJLyogTmVvTWFnaWMgTk0yMDkzICAgICAgICAgICAgICAqLwpAQCAtNDk1LDYgKzQ5Nyw5IEBACiAjZGVmaW5lIEZCX0VWRU5UX0JMQU5LICAgICAgICAgICAgICAgICAgMHgwOAogLyogICAgICBQcml2YXRlIG1vZGVsaXN0IGlzIHRvIGJlIHJlcGxhY2VkICovCiAjZGVmaW5lIEZCX0VWRU5UX05FV19NT0RFTElTVCAgICAgICAgICAgMHgwOQorLyoJVGhlIHJlc29sdXRpb24gb2YgdGhlIHBhc3NlZCBpbiBmYl9pbmZvIGFib3V0IHRvIGNoYW5nZSBhbmQKKyAgICAgICAgYWxsIHZjJ3Mgc2hvdWxkIGJlIGNoYW5nZWQgICAgICAgICAqLworI2RlZmluZSBGQl9FVkVOVF9NT0RFX0NIQU5HRV9BTEwJMHgwQQogCiBzdHJ1Y3QgZmJfZXZlbnQgewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpAQCAtODIwLDEzICs4MjUsMjkgQEAKIAkJCQl1MzIgaGVpZ2h0LCB1MzIgc2hpZnRfaGlnaCwgdTMyIHNoaWZ0X2xvdywgdTMyIG1vZCk7CiBleHRlcm4gdm9pZCBmYl9wYWRfYWxpZ25lZF9idWZmZXIodTggKmRzdCwgdTMyIGRfcGl0Y2gsIHU4ICpzcmMsIHUzMiBzX3BpdGNoLCB1MzIgaGVpZ2h0KTsKIGV4dGVybiB2b2lkIGZiX3NldF9zdXNwZW5kKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgc3RhdGUpOwotZXh0ZXJuIGludCBmYl9nZXRfY29sb3JfZGVwdGgoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOworZXh0ZXJuIGludCBmYl9nZXRfY29sb3JfZGVwdGgoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCk7CiBleHRlcm4gaW50IGZiX2dldF9vcHRpb25zKGNoYXIgKm5hbWUsIGNoYXIgKipvcHRpb24pOwogZXh0ZXJuIGludCBmYl9uZXdfbW9kZWxpc3Qoc3RydWN0IGZiX2luZm8gKmluZm8pOwogCiBleHRlcm4gc3RydWN0IGZiX2luZm8gKnJlZ2lzdGVyZWRfZmJbRkJfTUFYXTsKIGV4dGVybiBpbnQgbnVtX3JlZ2lzdGVyZWRfZmI7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ZiX3BhZF9hbGlnbmVkX2J1ZmZlcih1OCAqZHN0LCB1MzIgZF9waXRjaCwKKwkJCQkJICAgdTggKnNyYywgdTMyIHNfcGl0Y2gsIHUzMiBoZWlnaHQpCit7CisJaW50IGksIGo7CisKKwlkX3BpdGNoIC09IHNfcGl0Y2g7CisKKwlmb3IgKGkgPSBoZWlnaHQ7IGktLTsgKSB7CisJCS8qIHNfcGl0Y2ggaXMgYSBmZXcgYnl0ZXMgYXQgdGhlIG1vc3QsIG1lbWNweSBpcyBzdWJvcHRpbWFsICovCisJCWZvciAoaiA9IDA7IGogPCBzX3BpdGNoOyBqKyspCisJCQkqZHN0KysgPSAqc3JjKys7CisJCWRzdCArPSBkX3BpdGNoOworCX0KK30KKwogLyogZHJpdmVycy92aWRlby9mYnN5c2ZzLmMgKi8KIGV4dGVybiBzdHJ1Y3QgZmJfaW5mbyAqZnJhbWVidWZmZXJfYWxsb2Moc2l6ZV90IHNpemUsIHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBmcmFtZWJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKQEAgLTg1Niw4ICs4NzcsMTEgQEAKIGV4dGVybiBpbnQgZmJfdmFsaWRhdGVfbW9kZShjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBleHRlcm4gaW50IGZiX3BhcnNlX2VkaWQodW5zaWduZWQgY2hhciAqZWRpZCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOwotZXh0ZXJuIHZvaWQgZmJfZWRpZF90b19tb25zcGVjcyh1bnNpZ25lZCBjaGFyICplZGlkLCBzdHJ1Y3QgZmJfbW9uc3BlY3MgKnNwZWNzKTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyICpmYl9maXJtd2FyZV9lZGlkKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBmYl9lZGlkX3RvX21vbnNwZWNzKHVuc2lnbmVkIGNoYXIgKmVkaWQsCisJCQkJc3RydWN0IGZiX21vbnNwZWNzICpzcGVjcyk7CiBleHRlcm4gdm9pZCBmYl9kZXN0cm95X21vZGVkYihzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlZGIpOworZXh0ZXJuIGludCBmYl9maW5kX21vZGVfY3Z0KHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUsIGludCBtYXJnaW5zLCBpbnQgcmIpOwogCiAvKiBkcml2ZXJzL3ZpZGVvL21vZGVkYi5jICovCiAjZGVmaW5lIFZFU0FfTU9ERURCX1NJWkUgMzQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlsZS5oIGIvaW5jbHVkZS9saW51eC9maWxlLmgKaW5kZXggNTIwNmJlYi4uZjViYmQ0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maWxlLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogLyoKICAqIFRoZSBkZWZhdWx0IGZkIGFycmF5IG5lZWRzIHRvIGJlIGF0IGxlYXN0IEJJVFNfUEVSX0xPTkcsCkBAIC0xNiwyMyArMTcsMzMgQEAKICAqLwogI2RlZmluZSBOUl9PUEVOX0RFRkFVTFQgQklUU19QRVJfTE9ORwogCitzdHJ1Y3QgZmR0YWJsZSB7CisJdW5zaWduZWQgaW50IG1heF9mZHM7CisJaW50IG1heF9mZHNldDsKKwlpbnQgbmV4dF9mZDsKKwlzdHJ1Y3QgZmlsZSAqKiBmZDsgICAgICAvKiBjdXJyZW50IGZkIGFycmF5ICovCisJZmRfc2V0ICpjbG9zZV9vbl9leGVjOworCWZkX3NldCAqb3Blbl9mZHM7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcmVlX2ZpbGVzOworCXN0cnVjdCBmZHRhYmxlICpuZXh0OworfTsKKwogLyoKICAqIE9wZW4gZmlsZSB0YWJsZSBzdHJ1Y3R1cmUKICAqLwogc3RydWN0IGZpbGVzX3N0cnVjdCB7CiAgICAgICAgIGF0b21pY190IGNvdW50OwogICAgICAgICBzcGlubG9ja190IGZpbGVfbG9jazsgICAgIC8qIFByb3RlY3RzIGFsbCB0aGUgYmVsb3cgbWVtYmVycy4gIE5lc3RzIGluc2lkZSB0c2stPmFsbG9jX2xvY2sgKi8KLSAgICAgICAgaW50IG1heF9mZHM7Ci0gICAgICAgIGludCBtYXhfZmRzZXQ7Ci0gICAgICAgIGludCBuZXh0X2ZkOwotICAgICAgICBzdHJ1Y3QgZmlsZSAqKiBmZDsgICAgICAvKiBjdXJyZW50IGZkIGFycmF5ICovCi0gICAgICAgIGZkX3NldCAqY2xvc2Vfb25fZXhlYzsKLSAgICAgICAgZmRfc2V0ICpvcGVuX2ZkczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCXN0cnVjdCBmZHRhYmxlIGZkdGFiOwogICAgICAgICBmZF9zZXQgY2xvc2Vfb25fZXhlY19pbml0OwogICAgICAgICBmZF9zZXQgb3Blbl9mZHNfaW5pdDsKICAgICAgICAgc3RydWN0IGZpbGUgKiBmZF9hcnJheVtOUl9PUEVOX0RFRkFVTFRdOwogfTsKIAorI2RlZmluZSBmaWxlc19mZHRhYmxlKGZpbGVzKSAocmN1X2RlcmVmZXJlbmNlKChmaWxlcyktPmZkdCkpCisKIGV4dGVybiB2b2lkIEZBU1RDQUxMKF9fZnB1dChzdHJ1Y3QgZmlsZSAqKSk7CiBleHRlcm4gdm9pZCBGQVNUQ0FMTChmcHV0KHN0cnVjdCBmaWxlICopKTsKIApAQCAtNTksMTMgKzcwLDE2IEBACiBleHRlcm4gdm9pZCBmcmVlX2Zkc2V0KGZkX3NldCAqLCBpbnQpOwogCiBleHRlcm4gaW50IGV4cGFuZF9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIGludCBucik7CitleHRlcm4gdm9pZCBmcmVlX2ZkdGFibGUoc3RydWN0IGZkdGFibGUgKmZkdCk7CitleHRlcm4gdm9pZCBfX2luaXQgZmlsZXNfZGVmZXJfaW5pdCh2b2lkKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZmlsZSAqIGZjaGVja19maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgdW5zaWduZWQgaW50IGZkKQogewogCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CisJc3RydWN0IGZkdGFibGUgKmZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwogCi0JaWYgKGZkIDwgZmlsZXMtPm1heF9mZHMpCi0JCWZpbGUgPSBmaWxlcy0+ZmRbZmRdOworCWlmIChmZCA8IGZkdC0+bWF4X2ZkcykKKwkJZmlsZSA9IHJjdV9kZXJlZmVyZW5jZShmZHQtPmZkW2ZkXSk7CiAJcmV0dXJuIGZpbGU7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaCBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaAppbmRleCA4ODYyNTViLi4yMDYzYzA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oCkBAIC0zLDYgKzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjZGVmaW5lIEZJUk1XQVJFX05BTUVfTUFYIDMwIAorI2RlZmluZSBGV19BQ1RJT05fTk9IT1RQTFVHIDAKKyNkZWZpbmUgRldfQUNUSU9OX0hPVFBMVUcgMQorCiBzdHJ1Y3QgZmlybXdhcmUgewogCXNpemVfdCBzaXplOwogCXU4ICpkYXRhOwpAQCAtMTEsNyArMTQsNyBAQAogaW50IHJlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlKTsKIGludCByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCgKLQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCisJc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgaG90cGx1ZywKIAljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHZvaWQgKmNvbnRleHQsCiAJdm9pZCAoKmNvbnQpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDY3ZTY3MzIuLmUwYjc3YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VyZWYuaD4KIAogLyoKICAqIEl0J3Mgc2lsbHkgdG8gaGF2ZSBOUl9PUEVOIGJpZ2dlciB0aGFuIE5SX0ZJTEUsIGJ1dCB5b3UgY2FuIGNoYW5nZQpAQCAtNjksNiArNzAsNyBAQAogI2RlZmluZSBSRUFEIDAKICNkZWZpbmUgV1JJVEUgMQogI2RlZmluZSBSRUFEQSAyCQkvKiByZWFkLWFoZWFkICAtIGRvbid0IGJsb2NrIGlmIG5vIHJlc291cmNlcyAqLworI2RlZmluZSBTV1JJVEUgMwkvKiBmb3IgbGxfcndfYmxvY2soKSAtIHdhaXQgZm9yIGJ1ZmZlciBsb2NrICovCiAjZGVmaW5lIFNQRUNJQUwgNAkvKiBGb3Igbm9uLWJsb2NrZGV2aWNlIHJlcXVlc3RzIGluIHJlcXVlc3QgcXVldWUgKi8KICNkZWZpbmUgUkVBRF9TWU5DCShSRUFEIHwgKDEgPDwgQklPX1JXX1NZTkMpKQogI2RlZmluZSBXUklURV9TWU5DCShXUklURSB8ICgxIDw8IEJJT19SV19TWU5DKSkKQEAgLTI4MSwxOSArMjgzLDkgQEAKIAlzdHJ1Y3QgdGltZXNwZWMJaWFfYXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCWlhX210aW1lOwogCXN0cnVjdCB0aW1lc3BlYwlpYV9jdGltZTsKLQl1bnNpZ25lZCBpbnQJaWFfYXR0cl9mbGFnczsKIH07CiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBpbm9kZSBhdHRyaWJ1dGVzIGZsYWcgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBBVFRSX0ZMQUdfU1lOQ1JPTk9VUwkxIAkvKiBTeW5jcm9ub3VzIHdyaXRlICovCi0jZGVmaW5lIEFUVFJfRkxBR19OT0FUSU1FCTIgCS8qIERvbid0IHVwZGF0ZSBhdGltZSAqLwotI2RlZmluZSBBVFRSX0ZMQUdfQVBQRU5ECTQgCS8qIEFwcGVuZC1vbmx5IGZpbGUgKi8KLSNkZWZpbmUgQVRUUl9GTEFHX0lNTVVUQUJMRQk4IAkvKiBJbW11dGFibGUgZmlsZSAqLwotI2RlZmluZSBBVFRSX0ZMQUdfTk9ESVJBVElNRQkxNiAJLyogRG9uJ3QgdXBkYXRlIGF0aW1lIGZvciBkaXJlY3RvcnkgKi8KLQotLyoKICAqIEluY2x1ZGVzIGZvciBkaXNrcXVvdGFzLgogICovCiAjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KQEAgLTU5NCw3ICs1ODYsNiBAQAogCXVuc2lnbmVkIGludAkJZl91aWQsIGZfZ2lkOwogCXN0cnVjdCBmaWxlX3JhX3N0YXRlCWZfcmE7CiAKLQlzaXplX3QJCQlmX21heGNvdW50OwogCXVuc2lnbmVkIGxvbmcJCWZfdmVyc2lvbjsKIAl2b2lkCQkJKmZfc2VjdXJpdHk7CiAKQEAgLTYwNywxMiArNTk4LDEzIEBACiAJc3BpbmxvY2tfdAkJZl9lcF9sb2NrOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfRVBPTEwgKi8KIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqZl9tYXBwaW5nOworCXN0cnVjdCByY3VfaGVhZCAJZl9yY3VoZWFkOwogfTsKIGV4dGVybiBzcGlubG9ja190IGZpbGVzX2xvY2s7CiAjZGVmaW5lIGZpbGVfbGlzdF9sb2NrKCkgc3Bpbl9sb2NrKCZmaWxlc19sb2NrKTsKICNkZWZpbmUgZmlsZV9saXN0X3VubG9jaygpIHNwaW5fdW5sb2NrKCZmaWxlc19sb2NrKTsKIAotI2RlZmluZSBnZXRfZmlsZSh4KQlhdG9taWNfaW5jKCYoeCktPmZfY291bnQpCisjZGVmaW5lIGdldF9maWxlKHgpCXJjdXJlZl9pbmMoJih4KS0+Zl9jb3VudCkKICNkZWZpbmUgZmlsZV9jb3VudCh4KQlhdG9taWNfcmVhZCgmKHgpLT5mX2NvdW50KQogCiAjZGVmaW5lCU1BWF9OT05fTEZTCSgoMVVMPDwzMSkgLSAxKQpAQCAtMTI5MSw2ICsxMjgzLDcgQEAKIC8qIGZzL29wZW4uYyAqLwogCiBleHRlcm4gaW50IGRvX3RydW5jYXRlKHN0cnVjdCBkZW50cnkgKiwgbG9mZl90IHN0YXJ0KTsKK2V4dGVybiBsb25nIGRvX3N5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSk7CiBleHRlcm4gc3RydWN0IGZpbGUgKmZpbHBfb3Blbihjb25zdCBjaGFyICosIGludCwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIGRlbnRyeV9vcGVuKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHZmc21vdW50ICosIGludCk7CiBleHRlcm4gaW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKiwgZmxfb3duZXJfdCBpZCk7CkBAIC0xNTE2LDggKzE1MDksNiBAQAogCQkJCSAgICBsb2ZmX3QgKiwgcmVhZF9kZXNjcmlwdG9yX3QgKiwgcmVhZF9hY3Rvcl90KTsKIGV4dGVybiB2b2lkCiBmaWxlX3JhX3N0YXRlX2luaXQoc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyk7Ci1leHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAotCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOwogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19maWxlX3JlYWR2KHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgCiAJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKnBwb3MpOwogc3NpemVfdCBnZW5lcmljX2ZpbGVfd3JpdGV2KHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaCBiL2luY2x1ZGUvbGludXgvZnVzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmViOTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAgICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA1ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisKKyAgICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBrZXJuZWwgaW50ZXJmYWNlIG9mIEZVU0UgKi8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CisKKy8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLworI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDIKKworLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCisjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCisKKy8qKiBUaGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KKyNkZWZpbmUgRlVTRV9NQUpPUiAxMAorCisvKiogVGhlIG1pbm9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCisjZGVmaW5lIEZVU0VfTUlOT1IgMjI5CisKKy8qIE1ha2Ugc3VyZSBhbGwgc3RydWN0dXJlcyBhcmUgcGFkZGVkIHRvIDY0Yml0IGJvdW5kYXJ5LCBzbyAzMmJpdAorICAgdXNlcnNwYWNlIHdvcmtzIHVuZGVyIDY0Yml0IGtlcm5lbHMgKi8KKworc3RydWN0IGZ1c2VfYXR0ciB7CisJX191NjQJaW5vOworCV9fdTY0CXNpemU7CisJX191NjQJYmxvY2tzOworCV9fdTY0CWF0aW1lOworCV9fdTY0CW10aW1lOworCV9fdTY0CWN0aW1lOworCV9fdTMyCWF0aW1lbnNlYzsKKwlfX3UzMgltdGltZW5zZWM7CisJX191MzIJY3RpbWVuc2VjOworCV9fdTMyCW1vZGU7CisJX191MzIJbmxpbms7CisJX191MzIJdWlkOworCV9fdTMyCWdpZDsKKwlfX3UzMglyZGV2OworfTsKKworc3RydWN0IGZ1c2Vfa3N0YXRmcyB7CisJX191NjQJYmxvY2tzOworCV9fdTY0CWJmcmVlOworCV9fdTY0CWJhdmFpbDsKKwlfX3U2NAlmaWxlczsKKwlfX3U2NAlmZnJlZTsKKwlfX3UzMglic2l6ZTsKKwlfX3UzMgluYW1lbGVuOworfTsKKworI2RlZmluZSBGQVRUUl9NT0RFCSgxIDw8IDApCisjZGVmaW5lIEZBVFRSX1VJRAkoMSA8PCAxKQorI2RlZmluZSBGQVRUUl9HSUQJKDEgPDwgMikKKyNkZWZpbmUgRkFUVFJfU0laRQkoMSA8PCAzKQorI2RlZmluZSBGQVRUUl9BVElNRQkoMSA8PCA0KQorI2RlZmluZSBGQVRUUl9NVElNRQkoMSA8PCA1KQorI2RlZmluZSBGQVRUUl9DVElNRQkoMSA8PCA2KQorCisvKioKKyAqIEZsYWdzIHJldHVybmVkIGJ5IHRoZSBPUEVOIHJlcXVlc3QKKyAqCisgKiBGT1BFTl9ESVJFQ1RfSU86IGJ5cGFzcyBwYWdlIGNhY2hlIGZvciB0aGlzIG9wZW4gZmlsZQorICogRk9QRU5fS0VFUF9DQUNIRTogZG9uJ3QgaW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSBvbiBvcGVuCisgKi8KKyNkZWZpbmUgRk9QRU5fRElSRUNUX0lPCQkoMSA8PCAwKQorI2RlZmluZSBGT1BFTl9LRUVQX0NBQ0hFCSgxIDw8IDEpCisKK2VudW0gZnVzZV9vcGNvZGUgeworCUZVU0VfTE9PS1VQCSAgID0gMSwKKwlGVVNFX0ZPUkdFVAkgICA9IDIsICAvKiBubyByZXBseSAqLworCUZVU0VfR0VUQVRUUgkgICA9IDMsCisJRlVTRV9TRVRBVFRSCSAgID0gNCwKKwlGVVNFX1JFQURMSU5LCSAgID0gNSwKKwlGVVNFX1NZTUxJTksJICAgPSA2LAorCUZVU0VfTUtOT0QJICAgPSA4LAorCUZVU0VfTUtESVIJICAgPSA5LAorCUZVU0VfVU5MSU5LCSAgID0gMTAsCisJRlVTRV9STURJUgkgICA9IDExLAorCUZVU0VfUkVOQU1FCSAgID0gMTIsCisJRlVTRV9MSU5LCSAgID0gMTMsCisJRlVTRV9PUEVOCSAgID0gMTQsCisJRlVTRV9SRUFECSAgID0gMTUsCisJRlVTRV9XUklURQkgICA9IDE2LAorCUZVU0VfU1RBVEZTCSAgID0gMTcsCisJRlVTRV9SRUxFQVNFICAgICAgID0gMTgsCisJRlVTRV9GU1lOQyAgICAgICAgID0gMjAsCisJRlVTRV9TRVRYQVRUUiAgICAgID0gMjEsCisJRlVTRV9HRVRYQVRUUiAgICAgID0gMjIsCisJRlVTRV9MSVNUWEFUVFIgICAgID0gMjMsCisJRlVTRV9SRU1PVkVYQVRUUiAgID0gMjQsCisJRlVTRV9GTFVTSCAgICAgICAgID0gMjUsCisJRlVTRV9JTklUICAgICAgICAgID0gMjYsCisJRlVTRV9PUEVORElSICAgICAgID0gMjcsCisJRlVTRV9SRUFERElSICAgICAgID0gMjgsCisJRlVTRV9SRUxFQVNFRElSICAgID0gMjksCisJRlVTRV9GU1lOQ0RJUiAgICAgID0gMzAKK307CisKKy8qIENvbnNlcnZhdGl2ZSBidWZmZXIgc2l6ZSBmb3IgdGhlIGNsaWVudCAqLworI2RlZmluZSBGVVNFX01BWF9JTiA4MTkyCisKKyNkZWZpbmUgRlVTRV9OQU1FX01BWCAxMDI0CisjZGVmaW5lIEZVU0VfU1lNTElOS19NQVggNDA5NgorI2RlZmluZSBGVVNFX1hBVFRSX1NJWkVfTUFYIDQwOTYKKworc3RydWN0IGZ1c2VfZW50cnlfb3V0IHsKKwlfX3U2NAlub2RlaWQ7CQkvKiBJbm9kZSBJRCAqLworCV9fdTY0CWdlbmVyYXRpb247CS8qIElub2RlIGdlbmVyYXRpb246IG5vZGVpZDpnZW4gbXVzdAorCQkJCSAgIGJlIHVuaXF1ZSBmb3IgdGhlIGZzJ3MgbGlmZXRpbWUgKi8KKwlfX3U2NAllbnRyeV92YWxpZDsJLyogQ2FjaGUgdGltZW91dCBmb3IgdGhlIG5hbWUgKi8KKwlfX3U2NAlhdHRyX3ZhbGlkOwkvKiBDYWNoZSB0aW1lb3V0IGZvciB0aGUgYXR0cmlidXRlcyAqLworCV9fdTMyCWVudHJ5X3ZhbGlkX25zZWM7CisJX191MzIJYXR0cl92YWxpZF9uc2VjOworCXN0cnVjdCBmdXNlX2F0dHIgYXR0cjsKK307CisKK3N0cnVjdCBmdXNlX2ZvcmdldF9pbiB7CisJX191NjQJbmxvb2t1cDsKK307CisKK3N0cnVjdCBmdXNlX2F0dHJfb3V0IHsKKwlfX3U2NAlhdHRyX3ZhbGlkOwkvKiBDYWNoZSB0aW1lb3V0IGZvciB0aGUgYXR0cmlidXRlcyAqLworCV9fdTMyCWF0dHJfdmFsaWRfbnNlYzsKKwlfX3UzMglkdW1teTsKKwlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7Cit9OworCitzdHJ1Y3QgZnVzZV9ta25vZF9pbiB7CisJX191MzIJbW9kZTsKKwlfX3UzMglyZGV2OworfTsKKworc3RydWN0IGZ1c2VfbWtkaXJfaW4geworCV9fdTMyCW1vZGU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3JlbmFtZV9pbiB7CisJX191NjQJbmV3ZGlyOworfTsKKworc3RydWN0IGZ1c2VfbGlua19pbiB7CisJX191NjQJb2xkbm9kZWlkOworfTsKKworc3RydWN0IGZ1c2Vfc2V0YXR0cl9pbiB7CisJX191MzIJdmFsaWQ7CisJX191MzIJcGFkZGluZzsKKwlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7Cit9OworCitzdHJ1Y3QgZnVzZV9vcGVuX2luIHsKKwlfX3UzMglmbGFnczsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfb3Blbl9vdXQgeworCV9fdTY0CWZoOworCV9fdTMyCW9wZW5fZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3JlbGVhc2VfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9mbHVzaF9pbiB7CisJX191NjQJZmg7CisJX191MzIJZmx1c2hfZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3JlYWRfaW4geworCV9fdTY0CWZoOworCV9fdTY0CW9mZnNldDsKKwlfX3UzMglzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV93cml0ZV9pbiB7CisJX191NjQJZmg7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191MzIJd3JpdGVfZmxhZ3M7Cit9OworCitzdHJ1Y3QgZnVzZV93cml0ZV9vdXQgeworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3N0YXRmc19vdXQgeworCXN0cnVjdCBmdXNlX2tzdGF0ZnMgc3Q7Cit9OworCitzdHJ1Y3QgZnVzZV9mc3luY19pbiB7CisJX191NjQJZmg7CisJX191MzIJZnN5bmNfZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3NldHhhdHRyX2luIHsKKwlfX3UzMglzaXplOworCV9fdTMyCWZsYWdzOworfTsKKworc3RydWN0IGZ1c2VfZ2V0eGF0dHJfaW4geworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2dldHhhdHRyX291dCB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfaW5pdF9pbl9vdXQgeworCV9fdTMyCW1ham9yOworCV9fdTMyCW1pbm9yOworfTsKKworc3RydWN0IGZ1c2VfaW5faGVhZGVyIHsKKwlfX3UzMglsZW47CisJX191MzIJb3Bjb2RlOworCV9fdTY0CXVuaXF1ZTsKKwlfX3U2NAlub2RlaWQ7CisJX191MzIJdWlkOworCV9fdTMyCWdpZDsKKwlfX3UzMglwaWQ7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX291dF9oZWFkZXIgeworCV9fdTMyCWxlbjsKKwlfX3MzMgllcnJvcjsKKwlfX3U2NAl1bmlxdWU7Cit9OworCitzdHJ1Y3QgZnVzZV9kaXJlbnQgeworCV9fdTY0CWlubzsKKwlfX3U2NAlvZmY7CisJX191MzIJbmFtZWxlbjsKKwlfX3UzMgl0eXBlOworCWNoYXIgbmFtZVswXTsKK307CisKKyNkZWZpbmUgRlVTRV9OQU1FX09GRlNFVCAoKHVuc2lnbmVkKSAoKHN0cnVjdCBmdXNlX2RpcmVudCAqKSAwKS0+bmFtZSkKKyNkZWZpbmUgRlVTRV9ESVJFTlRfQUxJR04oeCkgKCgoeCkgKyBzaXplb2YoX191NjQpIC0gMSkgJiB+KHNpemVvZihfX3U2NCkgLSAxKSkKKyNkZWZpbmUgRlVTRV9ESVJFTlRfU0laRShkKSBcCisJRlVTRV9ESVJFTlRfQUxJR04oRlVTRV9OQU1FX09GRlNFVCArIChkKS0+bmFtZWxlbikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnV0ZXguaCBiL2luY2x1ZGUvbGludXgvZnV0ZXguaAppbmRleCA2NWQ2Y2ZkLi4xMGY5NmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCkBAIC00LDE0ICs0LDQwIEBACiAvKiBTZWNvbmQgYXJndW1lbnQgdG8gZnV0ZXggc3lzY2FsbCAqLwogCiAKLSNkZWZpbmUgRlVURVhfV0FJVCAoMCkKLSNkZWZpbmUgRlVURVhfV0FLRSAoMSkKLSNkZWZpbmUgRlVURVhfRkQgKDIpCi0jZGVmaW5lIEZVVEVYX1JFUVVFVUUgKDMpCi0jZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFICg0KQorI2RlZmluZSBGVVRFWF9XQUlUCQkwCisjZGVmaW5lIEZVVEVYX1dBS0UJCTEKKyNkZWZpbmUgRlVURVhfRkQJCTIKKyNkZWZpbmUgRlVURVhfUkVRVUVVRQkJMworI2RlZmluZSBGVVRFWF9DTVBfUkVRVUVVRQk0CisjZGVmaW5lIEZVVEVYX1dBS0VfT1AJCTUKIAogbG9uZyBkb19mdXRleCh1bnNpZ25lZCBsb25nIHVhZGRyLCBpbnQgb3AsIGludCB2YWwsCiAJCXVuc2lnbmVkIGxvbmcgdGltZW91dCwgdW5zaWduZWQgbG9uZyB1YWRkcjIsIGludCB2YWwyLAogCQlpbnQgdmFsMyk7CiAKKyNkZWZpbmUgRlVURVhfT1BfU0VUCQkwCS8qICooaW50ICopVUFERFIyID0gT1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX0FERAkJMQkvKiAqKGludCAqKVVBRERSMiArPSBPUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfT1IJCTIJLyogKihpbnQgKilVQUREUjIgfD0gT1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX0FORE4JCTMJLyogKihpbnQgKilVQUREUjIgJj0gfk9QQVJHOyAqLworI2RlZmluZSBGVVRFWF9PUF9YT1IJCTQJLyogKihpbnQgKilVQUREUjIgXj0gT1BBUkc7ICovCisKKyNkZWZpbmUgRlVURVhfT1BfT1BBUkdfU0hJRlQJOAkvKiBVc2UgKDEgPDwgT1BBUkcpIGluc3RlYWQgb2YgT1BBUkcuICAqLworCisjZGVmaW5lIEZVVEVYX09QX0NNUF9FUQkJMAkvKiBpZiAob2xkdmFsID09IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfTkUJCTEJLyogaWYgKG9sZHZhbCAhPSBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0xUCQkyCS8qIGlmIChvbGR2YWwgPCBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0xFCQkzCS8qIGlmIChvbGR2YWwgPD0gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9HVAkJNAkvKiBpZiAob2xkdmFsID4gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9HRQkJNQkvKiBpZiAob2xkdmFsID49IENNUEFSRykgd2FrZSAqLworCisvKiBGVVRFWF9XQUtFX09QIHdpbGwgcGVyZm9ybSBhdG9taWNhbGx5CisgICBpbnQgb2xkdmFsID0gKihpbnQgKilVQUREUjI7CisgICAqKGludCAqKVVBRERSMiA9IG9sZHZhbCBPUCBPUEFSRzsKKyAgIGlmIChvbGR2YWwgQ01QIENNUEFSRykKKyAgICAgd2FrZSBVQUREUjI7ICAqLworCisjZGVmaW5lIEZVVEVYX09QKG9wLCBvcGFyZywgY21wLCBjbXBhcmcpIFwKKyAgKCgob3AgJiAweGYpIDw8IDI4KSB8ICgoY21wICYgMHhmKSA8PCAyNCkJCVwKKyAgIHwgKChvcGFyZyAmIDB4ZmZmKSA8PCAxMikgfCAoY21wYXJnICYgMHhmZmYpKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IDdjNzQwMDEuLjRkYzk5MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtNDAsNiArNDAsNyBAQAogI2RlZmluZSBfX0dGUF9aRVJPCTB4ODAwMHUJLyogUmV0dXJuIHplcm9lZCBwYWdlIG9uIHN1Y2Nlc3MgKi8KICNkZWZpbmUgX19HRlBfTk9NRU1BTExPQyAweDEwMDAwdSAvKiBEb24ndCB1c2UgZW1lcmdlbmN5IHJlc2VydmVzICovCiAjZGVmaW5lIF9fR0ZQX05PUkVDTEFJTSAgMHgyMDAwMHUgLyogTm8gcmVhbHkgem9uZSByZWNsYWltIGR1cmluZyBhbGxvY2F0aW9uICovCisjZGVmaW5lIF9fR0ZQX0hBUkRXQUxMICAgMHg0MDAwMHUgLyogRW5mb3JjZSBoYXJkd2FsbCBjcHVzZXQgbWVtb3J5IGFsbG9jcyAqLwogCiAjZGVmaW5lIF9fR0ZQX0JJVFNfU0hJRlQgMjAJLyogUm9vbSBmb3IgMjAgX19HRlBfRk9PIGJpdHMgKi8KICNkZWZpbmUgX19HRlBfQklUU19NQVNLICgoMSA8PCBfX0dGUF9CSVRTX1NISUZUKSAtIDEpCkBAIC00OCwxNCArNDksMTUgQEAKICNkZWZpbmUgR0ZQX0xFVkVMX01BU0sgKF9fR0ZQX1dBSVR8X19HRlBfSElHSHxfX0dGUF9JT3xfX0dGUF9GU3wgXAogCQkJX19HRlBfQ09MRHxfX0dGUF9OT1dBUk58X19HRlBfUkVQRUFUfCBcCiAJCQlfX0dGUF9OT0ZBSUx8X19HRlBfTk9SRVRSWXxfX0dGUF9OT19HUk9XfF9fR0ZQX0NPTVB8IFwKLQkJCV9fR0ZQX05PTUVNQUxMT0N8X19HRlBfTk9SRUNMQUlNKQorCQkJX19HRlBfTk9NRU1BTExPQ3xfX0dGUF9OT1JFQ0xBSU18X19HRlBfSEFSRFdBTEwpCiAKICNkZWZpbmUgR0ZQX0FUT01JQwkoX19HRlBfSElHSCkKICNkZWZpbmUgR0ZQX05PSU8JKF9fR0ZQX1dBSVQpCiAjZGVmaW5lIEdGUF9OT0ZTCShfX0dGUF9XQUlUIHwgX19HRlBfSU8pCiAjZGVmaW5lIEdGUF9LRVJORUwJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTKQotI2RlZmluZSBHRlBfVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMpCi0jZGVmaW5lIEdGUF9ISUdIVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9ISUdITUVNKQorI2RlZmluZSBHRlBfVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9IQVJEV0FMTCkKKyNkZWZpbmUgR0ZQX0hJR0hVU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IF9fR0ZQX0hBUkRXQUxMIHwgXAorCQkJIF9fR0ZQX0hJR0hNRU0pCiAKIC8qIEZsYWcgLSBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIHdpbGwgYmUgc3VpdGFibGUgZm9yIERNQS4gIElnbm9yZWQgb24gc29tZQogICAgcGxhdGZvcm1zLCB1c2VkIGFzIGFwcHJvcHJpYXRlIG9uIG90aGVycyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtcHhhLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1weGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNlYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtcHhhLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfTElOVVhfSTJDX0FMR09fUFhBX0gKKyNkZWZpbmUgX0xJTlVYX0kyQ19BTEdPX1BYQV9ICisKK3N0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyIHsKKwl2b2lkICgqd3JpdGUpKHZvaWQgKiwgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgbmV3dmFsKTsKK307CisKK3N0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCXN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICpvcHM7CisJdm9pZCAqZGF0YTsKK307CisKKyNkZWZpbmUgSTJDX0VFUFJPTV9FTVVfU0laRSAoMjU2KQorCitzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBwdHI7CisJdW5zaWduZWQgaW50IHNlZW5fc3RhcnQ7CisJc3RydWN0IGxpc3RfaGVhZCB3YXRjaDsKKworCXVuc2lnbmVkIGNoYXIgYnl0ZXNbSTJDX0VFUFJPTV9FTVVfU0laRV07Cit9OworCit0eXBlZGVmIGVudW0gaTJjX3NsYXZlX2V2ZW50X2UgeworCUkyQ19TTEFWRV9FVkVOVF9TVEFSVF9SRUFELAorCUkyQ19TTEFWRV9FVkVOVF9TVEFSVF9XUklURSwKKwlJMkNfU0xBVkVfRVZFTlRfU1RPUAorfSBpMmNfc2xhdmVfZXZlbnRfdDsKKworc3RydWN0IGkyY19zbGF2ZV9jbGllbnQgeworCXZvaWQgKmRhdGE7CisJdm9pZCAoKmV2ZW50KSh2b2lkICpwdHIsIGkyY19zbGF2ZV9ldmVudF90IGV2ZW50KTsKKwlpbnQgICgqcmVhZCkgKHZvaWQgKnB0cik7CisJdm9pZCAoKndyaXRlKSh2b2lkICpwdHIsIHVuc2lnbmVkIGludCB2YWwpOworfTsKKworZXh0ZXJuIGludCBpMmNfZWVwcm9tX2VtdV9hZGR3YXRjaGVyKHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqLCB2b2lkICpkYXRhLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgc3RydWN0IGkyY19lZXByb21fZW11X3dhdGNoZXIgKik7CisKK2V4dGVybiB2b2lkIGkyY19lZXByb21fZW11X2RlbHdhdGNoZXIoc3RydWN0IGkyY19lZXByb21fZW11ICosIHZvaWQgKmRhdGEsIHN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICp3YXRjaGVyKTsKKworZXh0ZXJuIHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqaTJjX3B4YV9nZXRfZWVwcm9tKHZvaWQpOworCisjZW5kaWYgLyogX0xJTlVYX0kyQ19BTEdPX1BYQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luNi5oIGIvaW5jbHVkZS9saW51eC9pbjYuaAppbmRleCBkY2Y1NzIwLi4zMDRhYWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luNi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW42LmgKQEAgLTE0OCwxMyArMTQ4LDEzIEBACiAgKi8KIAogI2RlZmluZSBJUFY2X0FERFJGT1JNCQkxCi0jZGVmaW5lIElQVjZfUEtUSU5GTwkJMgotI2RlZmluZSBJUFY2X0hPUE9QVFMJCTMKLSNkZWZpbmUgSVBWNl9EU1RPUFRTCQk0Ci0jZGVmaW5lIElQVjZfUlRIRFIJCTUKLSNkZWZpbmUgSVBWNl9QS1RPUFRJT05TCQk2CisjZGVmaW5lIElQVjZfMjI5MlBLVElORk8JMgorI2RlZmluZSBJUFY2XzIyOTJIT1BPUFRTCTMKKyNkZWZpbmUgSVBWNl8yMjkyRFNUT1BUUwk0CisjZGVmaW5lIElQVjZfMjI5MlJUSERSCQk1CisjZGVmaW5lIElQVjZfMjI5MlBLVE9QVElPTlMJNgogI2RlZmluZSBJUFY2X0NIRUNLU1VNCQk3Ci0jZGVmaW5lIElQVjZfSE9QTElNSVQJCTgKKyNkZWZpbmUgSVBWNl8yMjkySE9QTElNSVQJOAogI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKICNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAkvKiBvYnNvbGV0ZSAqLwogI2RlZmluZSBJUFY2X0ZMT1dJTkZPCQkxMQpAQCAtMTk4LDQgKzE5OCw0NCBAQAogICogTUNBU1RfTVNGSUxURVIJCTQ4CiAgKi8KIAorLyoKKyAqIEFkdmFuY2VkIEFQSSAoUkZDMzU0MikgKDEpCisgKgorICogTm90ZTogSVBWNl9SRUNWUlRIRFJEU1RPUFRTIGRvZXMgbm90IGV4aXN0LiBzZWUgbmV0L2lwdjYvZGF0YWdyYW0uYy4KKyAqLworCisjZGVmaW5lIElQVjZfUkVDVlBLVElORk8JNDkKKyNkZWZpbmUgSVBWNl9QS1RJTkZPCQk1MAorI2RlZmluZSBJUFY2X1JFQ1ZIT1BMSU1JVAk1MQorI2RlZmluZSBJUFY2X0hPUExJTUlUCQk1MgorI2RlZmluZSBJUFY2X1JFQ1ZIT1BPUFRTCTUzCisjZGVmaW5lIElQVjZfSE9QT1BUUwkJNTQKKyNkZWZpbmUgSVBWNl9SVEhEUkRTVE9QVFMJNTUKKyNkZWZpbmUgSVBWNl9SRUNWUlRIRFIJCTU2CisjZGVmaW5lIElQVjZfUlRIRFIJCTU3CisjZGVmaW5lIElQVjZfUkVDVkRTVE9QVFMJNTgKKyNkZWZpbmUgSVBWNl9EU1RPUFRTCQk1OQorI2lmIDAJLyogbm90IHlldCAqLworI2RlZmluZSBJUFY2X1JFQ1ZQQVRITVRVCTYwCisjZGVmaW5lIElQVjZfUEFUSE1UVQkJNjEKKyNkZWZpbmUgSVBWNl9ET05URlJBRwkJNjIKKyNkZWZpbmUgSVBWNl9VU0VfTUlOX01UVQk2MworI2VuZGlmCisKKy8qCisgKiBOZXRmaWx0ZXIKKyAqCisgKiBGb2xsb3dpbmcgc29ja2V0IG9wdGlvbnMgYXJlIHVzZWQgaW4gaXA2X3RhYmxlczsKKyAqIHNlZSBpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaC4KKyAqCisgKiBJUDZUX1NPX1NFVF9SRVBMQUNFIC8gSVA2VF9TT19HRVRfSU5GTwkJNjQKKyAqIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUyAvIElQNlRfU09fR0VUX0VOVFJJRVMJNjUKKyAqLworCisvKgorICogQWR2YW5jZWQgQVBJIChSRkMzNTQyKSAoMikKKyAqLworI2RlZmluZSBJUFY2X1JFQ1ZUQ0xBU1MJCTY2CisjZGVmaW5lIElQVjZfVENMQVNTCQk2NworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IGM3MjdjMTk1Li42OGFiNWYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTIsMTcgKzIsMjcgQEAKICNkZWZpbmUgX0xJTlVYX19JTklUX1RBU0tfSAogCiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKLSNkZWZpbmUgSU5JVF9GSUxFUyBcCi17IAkJCQkJCQlcCi0JLmNvdW50CQk9IEFUT01JQ19JTklUKDEpLCAJCVwKLQkuZmlsZV9sb2NrCT0gU1BJTl9MT0NLX1VOTE9DS0VELCAJCVwKKyNkZWZpbmUgSU5JVF9GRFRBQkxFIFwKK3sJCQkJCQkJXAogCS5tYXhfZmRzCT0gTlJfT1BFTl9ERUZBVUxULCAJCVwKIAkubWF4X2Zkc2V0CT0gX19GRF9TRVRTSVpFLCAJCVwKIAkubmV4dF9mZAk9IDAsIAkJCQlcCiAJLmZkCQk9ICZpbml0X2ZpbGVzLmZkX2FycmF5WzBdLCAJXAogCS5jbG9zZV9vbl9leGVjCT0gJmluaXRfZmlsZXMuY2xvc2Vfb25fZXhlY19pbml0LCBcCiAJLm9wZW5fZmRzCT0gJmluaXRfZmlsZXMub3Blbl9mZHNfaW5pdCwgCVwKKwkucmN1CQk9IFJDVV9IRUFEX0lOSVQsIAkJXAorCS5mcmVlX2ZpbGVzCT0gTlVMTCwJCSAJCVwKKwkubmV4dAkJPSBOVUxMLAkJIAkJXAorfQorCisjZGVmaW5lIElOSVRfRklMRVMgXAoreyAJCQkJCQkJXAorCS5jb3VudAkJPSBBVE9NSUNfSU5JVCgxKSwgCQlcCisJLmZpbGVfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwgCQlcCisJLmZkdAkJPSAmaW5pdF9maWxlcy5mZHRhYiwgCQlcCisJLmZkdGFiCQk9IElOSVRfRkRUQUJMRSwJCQlcCiAJLmNsb3NlX29uX2V4ZWNfaW5pdCA9IHsgeyAwLCB9IH0sIAkJXAogCS5vcGVuX2Zkc19pbml0CT0geyB7IDAsIH0gfSwgCQkJXAogCS5mZF9hcnJheQk9IHsgTlVMTCwgfSAJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaCBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCmluZGV4IDkzYmIzYWYuLmVlNWIyMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjZGVmaW5lIElOX01PVkUJCQkoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKSAvKiBtb3ZlcyAqLwogCiAvKiBzcGVjaWFsIGZsYWdzICovCisjZGVmaW5lIElOX01BU0tfQURECQkweDIwMDAwMDAwCS8qIGFkZCB0byB0aGUgbWFzayBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIHdhdGNoICovCiAjZGVmaW5lIElOX0lTRElSCQkweDQwMDAwMDAwCS8qIGV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyICovCiAjZGVmaW5lIElOX09ORVNIT1QJCTB4ODAwMDAwMDAJLyogb25seSBzZW5kIGV2ZW50IG9uY2UgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCmluZGV4IGJkYzUzYzYuLmU4YzI5NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTY2LDYgKzY2LDcgQEAKICNkZWZpbmUgRVZJT0NHS0VZKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MTgsIGxlbikJCS8qIGdldCBnbG9iYWwga2V5c3RhdGUgKi8KICNkZWZpbmUgRVZJT0NHTEVEKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MTksIGxlbikJCS8qIGdldCBhbGwgTEVEcyAqLwogI2RlZmluZSBFVklPQ0dTTkQobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgxYSwgbGVuKQkJLyogZ2V0IGFsbCBzb3VuZHMgc3RhdHVzICovCisjZGVmaW5lIEVWSU9DR1NXKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MWIsIGxlbikJCS8qIGdldCBhbGwgc3dpdGNoIHN0YXRlcyAqLwogCiAjZGVmaW5lIEVWSU9DR0JJVChldixsZW4pCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MjAgKyBldiwgbGVuKQkvKiBnZXQgZXZlbnQgYml0cyAqLwogI2RlZmluZSBFVklPQ0dBQlMoYWJzKQkJX0lPUignRScsIDB4NDAgKyBhYnMsIHN0cnVjdCBpbnB1dF9hYnNpbmZvKQkJLyogZ2V0IGFicyB2YWx1ZS9saW1pdHMgKi8KQEAgLTg2LDYgKzg3LDcgQEAKICNkZWZpbmUgRVZfUkVMCQkJMHgwMgogI2RlZmluZSBFVl9BQlMJCQkweDAzCiAjZGVmaW5lIEVWX01TQwkJCTB4MDQKKyNkZWZpbmUgRVZfU1cJCQkweDA1CiAjZGVmaW5lIEVWX0xFRAkJCTB4MTEKICNkZWZpbmUgRVZfU05ECQkJMHgxMgogI2RlZmluZSBFVl9SRVAJCQkweDE0CkBAIC0yODcsNiArMjg5LDggQEAKICNkZWZpbmUgS0VZX1NDUk9MTERPV04JCTE3OAogI2RlZmluZSBLRVlfS1BMRUZUUEFSRU4JCTE3OQogI2RlZmluZSBLRVlfS1BSSUdIVFBBUkVOCTE4MAorI2RlZmluZSBLRVlfTkVXCQkJMTgxCisjZGVmaW5lIEtFWV9SRURPCQkxODIKIAogI2RlZmluZSBLRVlfRjEzCQkJMTgzCiAjZGVmaW5lIEtFWV9GMTQJCQkxODQKQEAgLTMzMyw2ICszMzcsMTIgQEAKICNkZWZpbmUgS0VZX0tCRElMTFVNRE9XTgkyMjkKICNkZWZpbmUgS0VZX0tCRElMTFVNVVAJCTIzMAogCisjZGVmaW5lIEtFWV9TRU5ECQkyMzEKKyNkZWZpbmUgS0VZX1JFUExZCQkyMzIKKyNkZWZpbmUgS0VZX0ZPUldBUkRNQUlMCQkyMzMKKyNkZWZpbmUgS0VZX1NBVkUJCTIzNAorI2RlZmluZSBLRVlfRE9DVU1FTlRTCQkyMzUKKwogI2RlZmluZSBLRVlfVU5LTk9XTgkJMjQwCiAKICNkZWZpbmUgQlROX01JU0MJCTB4MTAwCkBAIC01NTEsNiArNTYxLDIwIEBACiAjZGVmaW5lIEFCU19NQVgJCQkweDNmCiAKIC8qCisgKiBTd2l0Y2ggZXZlbnRzCisgKi8KKworI2RlZmluZSBTV18wCQkweDAwCisjZGVmaW5lIFNXXzEJCTB4MDEKKyNkZWZpbmUgU1dfMgkJMHgwMgorI2RlZmluZSBTV18zCQkweDAzCisjZGVmaW5lIFNXXzQJCTB4MDQKKyNkZWZpbmUgU1dfNQkJMHgwNQorI2RlZmluZSBTV182CQkweDA2CisjZGVmaW5lIFNXXzcJCTB4MDcKKyNkZWZpbmUgU1dfTUFYCQkweDBmCisKKy8qCiAgKiBNaXNjIGV2ZW50cwogICovCiAKQEAgLTgyNCw2ICs4NDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgbGVkYml0W05CSVRTKExFRF9NQVgpXTsKIAl1bnNpZ25lZCBsb25nIHNuZGJpdFtOQklUUyhTTkRfTUFYKV07CiAJdW5zaWduZWQgbG9uZyBmZmJpdFtOQklUUyhGRl9NQVgpXTsKKwl1bnNpZ25lZCBsb25nIHN3Yml0W05CSVRTKFNXX01BWCldOwogCWludCBmZl9lZmZlY3RzX21heDsKIAogCXVuc2lnbmVkIGludCBrZXljb2RlbWF4OwpAQCAtODQ0LDYgKzg2OSw3IEBACiAJdW5zaWduZWQgbG9uZyBrZXlbTkJJVFMoS0VZX01BWCldOwogCXVuc2lnbmVkIGxvbmcgbGVkW05CSVRTKExFRF9NQVgpXTsKIAl1bnNpZ25lZCBsb25nIHNuZFtOQklUUyhTTkRfTUFYKV07CisJdW5zaWduZWQgbG9uZyBzd1tOQklUUyhTV19NQVgpXTsKIAogCWludCBhYnNtYXhbQUJTX01BWCArIDFdOwogCWludCBhYnNtaW5bQUJTX01BWCArIDFdOwpAQCAtODg2LDYgKzkxMiw3IEBACiAjZGVmaW5lIElOUFVUX0RFVklDRV9JRF9NQVRDSF9MRURCSVQJMHgyMDAKICNkZWZpbmUgSU5QVVRfREVWSUNFX0lEX01BVENIX1NOREJJVAkweDQwMAogI2RlZmluZSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRkZCSVQJMHg4MDAKKyNkZWZpbmUgSU5QVVRfREVWSUNFX0lEX01BVENIX1NXQklUCTB4MTAwMAogCiAjZGVmaW5lIElOUFVUX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0VcCiAJKElOUFVUX0RFVklDRV9JRF9NQVRDSF9CVVMgfCBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfVkVORE9SIHwgSU5QVVRfREVWSUNFX0lEX01BVENIX1BST0RVQ1QpCkBAIC05MDYsNiArOTMzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGxlZGJpdFtOQklUUyhMRURfTUFYKV07CiAJdW5zaWduZWQgbG9uZyBzbmRiaXRbTkJJVFMoU05EX01BWCldOwogCXVuc2lnbmVkIGxvbmcgZmZiaXRbTkJJVFMoRkZfTUFYKV07CisJdW5zaWduZWQgbG9uZyBzd2JpdFtOQklUUyhTV19NQVgpXTsKIAogCXVuc2lnbmVkIGxvbmcgZHJpdmVyX2luZm87CiB9OwpAQCAtOTk4LDYgKzEwMjYsMTEgQEAKIAlpbnB1dF9ldmVudChkZXYsIEVWX0ZGX1NUQVRVUywgY29kZSwgdmFsdWUpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaW5wdXRfcmVwb3J0X3N3aXRjaChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisJaW5wdXRfZXZlbnQoZGV2LCBFVl9TVywgY29kZSwgISF2YWx1ZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnB1dF9yZWdzKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZGV2LT5yZWdzID0gcmVnczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9jdGwzMi5oIGIvaW5jbHVkZS9saW51eC9pb2N0bDMyLmgKaW5kZXggZThjNGFmMy4uOTQ4ODA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb2N0bDMyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pb2N0bDMyLmgKQEAgLTE0LDI2ICsxNCw0IEBACiAJc3RydWN0IGlvY3RsX3RyYW5zICpuZXh0OwogfTsKIAotLyogCi0gKiBSZWdpc3RlciBhbiAzMmJpdCBpb2N0bCB0cmFuc2xhdGlvbiBoYW5kbGVyIGZvciBpb2N0bCBjbWQuCi0gKgotICogaGFuZGxlciA9PSBOVUxMOiB1c2UgNjRiaXQgaW9jdGwgaGFuZGxlci4KLSAqIGFyZ3VtZW50cyB0byBoYW5kbGVyOiAgZmQ6IGZpbGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgICAgICAgICAgICBjbWQ6IGlvY3RsIGNvbW1hbmQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZzogaW9jdGwgYXJndW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZpbGU6IGZpbGUgZGVzY3JpcHRvciBwb2ludGVyLgotICovIAotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQsCi0JCQkJaW9jdGxfdHJhbnNfaGFuZGxlcl90IGhhbmRsZXIpOwotZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24odW5zaWduZWQgaW50IGNtZCk7Ci0KLSNlbHNlCi0KLSNkZWZpbmUgcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKGNtZCwgaGFuZGxlcikJKHsgMDsgfSkKLSNkZWZpbmUgdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY21kKQkJKHsgMDsgfSkKLQotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcG1pLmggYi9pbmNsdWRlL2xpbnV4L2lwbWkuaAppbmRleCA1OTZjYTYxLi45MzhkNTViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWkuaApAQCAtMzUsNiArMzUsNyBAQAogI2RlZmluZSBfX0xJTlVYX0lQTUlfSAogCiAjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogLyoKICAqIFRoaXMgZmlsZSBkZXNjcmliZXMgYW4gaW50ZXJmYWNlIHRvIGFuIElQTUkgZHJpdmVyLiAgWW91IGhhdmUgdG8KQEAgLTI0MSw3ICsyNDIsOCBAQAogCS8qIFRoZSB1c2VyX21zZ19kYXRhIGlzIHRoZSBkYXRhIHN1cHBsaWVkIHdoZW4gYSBtZXNzYWdlIHdhcwogCSAgIHNlbnQsIGlmIHRoaXMgaXMgYSByZXNwb25zZSB0byBhIHNlbnQgbWVzc2FnZS4gIElmIHRoaXMgaXMKIAkgICBub3QgYSByZXNwb25zZSB0byBhIHNlbnQgbWVzc2FnZSwgdGhlbiB1c2VyX21zZ19kYXRhIHdpbGwKLQkgICBiZSBOVUxMLiAqLworCSAgIGJlIE5VTEwuICBJZiB0aGUgdXNlciBhYm92ZSBpcyBOVUxMLCB0aGVuIHRoaXMgd2lsbCBiZSB0aGUKKwkgICBpbnRmLiAqLwogCXZvaWQgICAgICAgICAgICAgKnVzZXJfbXNnX2RhdGE7CiAKIAkvKiBDYWxsIHRoaXMgd2hlbiBkb25lIHdpdGggdGhlIG1lc3NhZ2UuICBJdCB3aWxsIHByZXN1bWFibHkgZnJlZQpAQCAtMjk4LDEzICszMDAsMTkgQEAKICAgIHRoaXMgdXNlciwgc28gaXQgd2lsbCBhZmZlY3QgYWxsIHVzZXJzIG9mIHRoaXMgaW50ZXJmYWNlLiAgVGhpcyBpcwogICAgc28gc29tZSBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBjb21lIGluIGFuZCBkbyB0aGUgT0VNLXNwZWNpZmljCiAgICB0aGluZ3MgaXQgdGFrZXMgdG8gZGV0ZXJtaW5lIHlvdXIgYWRkcmVzcyAoaWYgbm90IHRoZSBCTUMpIGFuZCBzZXQKLSAgIGl0IGZvciBldmVyeW9uZSBlbHNlLiAqLwotdm9pZCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKLQkJCSB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpOwotdW5zaWduZWQgY2hhciBpcG1pX2dldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90IHVzZXIpOwotdm9pZCBpcG1pX3NldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgTFVOKTsKLXVuc2lnbmVkIGNoYXIgaXBtaV9nZXRfbXlfTFVOKGlwbWlfdXNlcl90IHVzZXIpOworICAgaXQgZm9yIGV2ZXJ5b25lIGVsc2UuICBOb3RlIHRoYXQgZWFjaCBjaGFubmVsIGNhbiBoYXZlIGl0cyBvd24gYWRkcmVzcy4gKi8KK2ludCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKKwkJCXVuc2lnbmVkIGludCAgY2hhbm5lbCwKKwkJCXVuc2lnbmVkIGNoYXIgYWRkcmVzcyk7CitpbnQgaXBtaV9nZXRfbXlfYWRkcmVzcyhpcG1pX3VzZXJfdCAgIHVzZXIsCisJCQl1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCQl1bnNpZ25lZCBjaGFyICphZGRyZXNzKTsKK2ludCBpcG1pX3NldF9teV9MVU4oaXBtaV91c2VyX3QgICB1c2VyLAorCQkgICAgdW5zaWduZWQgaW50ICBjaGFubmVsLAorCQkgICAgdW5zaWduZWQgY2hhciBMVU4pOworaW50IGlwbWlfZ2V0X215X0xVTihpcG1pX3VzZXJfdCAgIHVzZXIsCisJCSAgICB1bnNpZ25lZCBpbnQgIGNoYW5uZWwsCisJCSAgICB1bnNpZ25lZCBjaGFyICpMVU4pOwogCiAvKgogICogTGlrZSBpcG1pX3JlcXVlc3QsIGJ1dCBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgcmV0cmllcyBhbmQKQEAgLTU4NSw2ICs1OTMsMTYgQEAKICAqIHRoaW5ncyBpdCB0YWtlcyB0byBkZXRlcm1pbmUgeW91ciBhZGRyZXNzIChpZiBub3QgdGhlIEJNQykgYW5kIHNldAogICogaXQgZm9yIGV2ZXJ5b25lIGVsc2UuICBZb3Ugc2hvdWxkIHByb2JhYmx5IGxlYXZlIHRoZSBMVU4gYWxvbmUuCiAgKi8KK3N0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0Cit7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyICB2YWx1ZTsKK307CisjZGVmaW5lIElQTUlDVExfU0VUX01ZX0NIQU5ORUxfQUREUkVTU19DTUQgX0lPUihJUE1JX0lPQ19NQUdJQywgMjQsIHN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0KQorI2RlZmluZSBJUE1JQ1RMX0dFVF9NWV9DSEFOTkVMX0FERFJFU1NfQ01EIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI1LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9TRVRfTVlfQ0hBTk5FTF9MVU5fQ01ECSAgIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI2LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9MVU5fQ01ECSAgIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI3LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKy8qIExlZ2FjeSBpbnRlcmZhY2VzLCB0aGVzZSBvbmx5IHNldCBJUE1CIDAuICovCiAjZGVmaW5lIElQTUlDVExfU0VUX01ZX0FERFJFU1NfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE3LCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIElQTUlDVExfR0VUX01ZX0FERFJFU1NfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE4LCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIElQTUlDVExfU0VUX01ZX0xVTl9DTUQJCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE5LCB1bnNpZ25lZCBpbnQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCmluZGV4IDNjN2RiYzYuLmJiNmY4OGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC02OCw3ICs2OCw3IEBACiAKIHN0cnVjdCBydDBfaGRyIHsKIAlzdHJ1Y3QgaXB2Nl9ydF9oZHIJcnRfaGRyOwotCV9fdTMyCQkJYml0bWFwOwkJLyogc3RyaWN0L2xvb3NlIGJpdCBtYXAgKi8KKwlfX3UzMgkJCXJlc2VydmVkOwogCXN0cnVjdCBpbjZfYWRkcgkJYWRkclswXTsKIAogI2RlZmluZSBydDBfdHlwZQkJcnRfaGRyLnR5cGUKQEAgLTE4OSw2ICsxODksNyBAQAogCV9fdTE2CQkJZHN0MDsKIAlfX3UxNgkJCXNyY3J0OwogCV9fdTE2CQkJZHN0MTsKKwlfX3UxNgkJCWxhc3RvcHQ7CiB9OwogCiAjZGVmaW5lIElQNkNCKHNrYikJKChzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0qKSgoc2tiKS0+Y2IpKQpAQCAtMjM0LDE0ICsyMzUsMjAgQEAKIAkvKiBwa3RvcHRpb24gZmxhZ3MgKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlfX3U4CXNyY3J0OjIsCisJCQlfX3UxNglzcmNydDoyLAorCQkJCW9zcmNydDoyLAogCQkJICAgICAgICByeGluZm86MSwKKwkJCSAgICAgICAgcnhvaW5mbzoxLAogCQkJCXJ4aGxpbToxLAorCQkJCXJ4b2hsaW06MSwKIAkJCQlob3BvcHRzOjEsCisJCQkJb2hvcG9wdHM6MSwKIAkJCQlkc3RvcHRzOjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4ZmxvdzoxOworCQkJCW9kc3RvcHRzOjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4ZmxvdzoxLAorCQkJCXJ4dGNsYXNzOjE7CiAJCX0gYml0czsKLQkJX191OAkJYWxsOworCQlfX3UxNgkJYWxsOwogCX0gcnhvcHQ7CiAKIAkvKiBzb2Nrb3B0IGZsYWdzICovCkBAIC0yNTAsNiArMjU3LDcgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICBzbmRmbG93OjEsCiAJCQkJcG10dWRpc2M6MiwKIAkJCQlpcHY2b25seToxOworCV9fdTgJCQl0Y2xhc3M7CiAKIAlfX3UzMgkJCWRzdF9jb29raWU7CiAKQEAgLTI2Myw2ICsyNzEsNyBAQAogCQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdDsKIAkJc3RydWN0IHJ0Nl9pbmZvCSpydDsKIAkJaW50IGhvcF9saW1pdDsKKwkJaW50IHRjbGFzczsKIAl9IGNvcms7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCAwNjlkM2I4Li42OTY4MWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTMyLDcgKzMyLDEyIEBACiAjZGVmaW5lIElSUV9XQUlUSU5HCTMyCS8qIElSUSBub3QgeWV0IHNlZW4gLSBmb3IgYXV0b2RldGVjdGlvbiAqLwogI2RlZmluZSBJUlFfTEVWRUwJNjQJLyogSVJRIGxldmVsIHRyaWdnZXJlZCAqLwogI2RlZmluZSBJUlFfTUFTS0VECTEyOAkvKiBJUlEgbWFza2VkIC0gc2hvdWxkbid0IGJlIHNlZW4gYWdhaW4gKi8KLSNkZWZpbmUgSVJRX1BFUl9DUFUJMjU2CS8qIElSUSBpcyBwZXIgQ1BVICovCisjaWYgZGVmaW5lZChBUkNIX0hBU19JUlFfUEVSX0NQVSkKKyMgZGVmaW5lIElSUV9QRVJfQ1BVCTI1NgkvKiBJUlEgaXMgcGVyIENQVSAqLworIyBkZWZpbmUgQ0hFQ0tfSVJRX1BFUl9DUFUodmFyKSAoKHZhcikgJiBJUlFfUEVSX0NQVSkKKyNlbHNlCisjIGRlZmluZSBDSEVDS19JUlFfUEVSX0NQVSh2YXIpIDAKKyNlbmRpZgogCiAvKgogICogSW50ZXJydXB0IGNvbnRyb2xsZXIgZGVzY3JpcHRvci4gVGhpcyBpcyBhbGwgd2UgbmVlZApAQCAtNzEsMTYgKzc2LDEzOSBAQAogCXVuc2lnbmVkIGludCBpcnFfY291bnQ7CQkvKiBGb3IgZGV0ZWN0aW5nIGJyb2tlbiBpbnRlcnJ1cHRzICovCiAJdW5zaWduZWQgaW50IGlycXNfdW5oYW5kbGVkOwogCXNwaW5sb2NrX3QgbG9jazsKKyNpZiBkZWZpbmVkIChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgfHwgZGVmaW5lZCAoQ09ORklHX0lSUUJBTEFOQ0UpCisJdW5zaWduZWQgaW50IG1vdmVfaXJxOwkJLyogRmxhZyBuZWVkIHRvIHJlLXRhcmdldCBpbnRyIGRlc3QqLworI2VuZGlmCiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfZGVzY190OwogCiBleHRlcm4gaXJxX2Rlc2NfdCBpcnFfZGVzYyBbTlJfSVJRU107CiAKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGlycSBkZXNjcmlwdG9yIGZvciBJUlEuICAqLworc3RhdGljIGlubGluZSBpcnFfZGVzY190ICoKK2lycV9kZXNjcCAoaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxX2Rlc2MgKyBpcnE7Cit9CisKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+IC8qIHRoZSBhcmNoIGRlcGVuZGVudCBzdHVmZiAqLwogCiBleHRlcm4gaW50IHNldHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICogbmV3KTsKIAogI2lmZGVmIENPTkZJR19HRU5FUklDX0hBUkRJUlFTCiBleHRlcm4gY3B1bWFza190IGlycV9hZmZpbml0eVtOUl9JUlFTXTsKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbmF0aXZlX2lycV9pbmZvKGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCWlycV9hZmZpbml0eVtpcnFdID0gbWFzazsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X25hdGl2ZV9pcnFfaW5mbyhpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorCisjaWYgZGVmaW5lZCAoQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEpIHx8IGRlZmluZWQgKENPTkZJR19JUlFCQUxBTkNFKQorZXh0ZXJuIGNwdW1hc2tfdCBwZW5kaW5nX2lycV9jcHVtYXNrW05SX0lSUVNdOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BlbmRpbmdfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlkZXNjLT5tb3ZlX2lycSA9IDE7CisJcGVuZGluZ19pcnFfY3B1bWFza1tpcnFdID0gbWFzazsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbW92ZV9uYXRpdmVfaXJxKGludCBpcnEpCit7CisJY3B1bWFza190IHRtcDsKKwlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2NwKGlycSk7CisKKwlpZiAobGlrZWx5ICghZGVzYy0+bW92ZV9pcnEpKQorCQlyZXR1cm47CisKKwlkZXNjLT5tb3ZlX2lycSA9IDA7CisKKwlpZiAobGlrZWx5KGNwdXNfZW1wdHkocGVuZGluZ19pcnFfY3B1bWFza1tpcnFdKSkpCisJCXJldHVybjsKKworCWlmICghZGVzYy0+aGFuZGxlci0+c2V0X2FmZmluaXR5KQorCQlyZXR1cm47CisKKwkvKiBub3RlIC0gd2UgaG9sZCB0aGUgZGVzYy0+bG9jayAqLworCWNwdXNfYW5kKHRtcCwgcGVuZGluZ19pcnFfY3B1bWFza1tpcnFdLCBjcHVfb25saW5lX21hcCk7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIHZhbGlkIG1hc2sgdG8gd29yayB3aXRoLCBwbGVhc2UKKwkgKiBkbyB0aGUgZGlzYWJsZSwgcmUtcHJvZ3JhbSwgZW5hYmxlIHNlcXVlbmNlLgorCSAqIFRoaXMgaXMgKm5vdCogcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgbGV2ZWwgdHJpZ2dlcmVkCisJICogYnV0IGluIGEgZWRnZSB0cmlnZ2VyIGNhc2UsIHdlIG1pZ2h0IGJlIHNldHRpbmcgcnRlCisJICogd2hlbiBhbiBhY3RpdmUgdHJpZ2dlciBpcyBjb21taW5nIGluLiBUaGlzIGNvdWxkCisJICogY2F1c2Ugc29tZSBpb2FwaWNzIHRvIG1hbC1mdW5jdGlvbi4KKwkgKiBCZWluZyBwYXJhbm9pZCBpIGd1ZXNzIQorCSAqLworCWlmICh1bmxpa2VseSghY3B1c19lbXB0eSh0bXApKSkgeworCQlkZXNjLT5oYW5kbGVyLT5kaXNhYmxlKGlycSk7CisJCWRlc2MtPmhhbmRsZXItPnNldF9hZmZpbml0eShpcnEsdG1wKTsKKwkJZGVzYy0+aGFuZGxlci0+ZW5hYmxlKGlycSk7CisJfQorCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfY3B1bWFza1tpcnFdKTsKK30KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisvKgorICogV29uZGVyIHdoeSB0aGVzZSBhcmUgZHVtbWllcz8KKyAqIEZvciBlLmcgdGhlIHNldF9pb2FwaWNfYWZmaW5pdHlfdmVjdG9yKCkgY2FsbHMgdGhlIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKCkKKyAqIGNvdW50ZXIgcGFydCBhZnRlciB0cmFuc2xhdGluZyB0aGUgdmVjdG9yIHRvIGlycSBpbmZvLiBXZSBuZWVkIHRvIHBlcmZvcm0KKyAqIHRoaXMgb3BlcmF0aW9uIG9uIHRoZSByZWFsIGlycSwgd2hlbiB3ZSBkb250IHVzZSB2ZWN0b3IsIGkuZSB3aGVuCisgKiBwY2lfdXNlX3ZlY3RvcigpIGlzIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9pcnEoaW50IGlycSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9pcnFfaW5mbyhpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKK30KKworI2Vsc2UgLy8gQ09ORklHX1BDSV9NU0kKKworc3RhdGljIGlubGluZSB2b2lkIG1vdmVfaXJxKGludCBpcnEpCit7CisJbW92ZV9uYXRpdmVfaXJxKGlycSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaXJxX2luZm8oaW50IGlycSwgY3B1bWFza190IG1hc2spCit7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIG1hc2spOworfQorI2VuZGlmIC8vIENPTkZJR19QQ0lfTVNJCisKKyNlbHNlCS8vIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRIHx8IENPTkZJR19JUlFCQUxBTkNFCisKKyNkZWZpbmUgbW92ZV9pcnEoeCkKKyNkZWZpbmUgbW92ZV9uYXRpdmVfaXJxKHgpCisjZGVmaW5lIHNldF9wZW5kaW5nX2lycSh4LHkpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2lycV9pbmZvKGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBtYXNrKTsKK30KKworI2VuZGlmIC8vIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCisKKyNlbHNlIC8vIENPTkZJR19TTVAKKworI2RlZmluZSBtb3ZlX2lycSh4KQorI2RlZmluZSBtb3ZlX25hdGl2ZV9pcnEoeCkKKworI2VuZGlmIC8vIENPTkZJR19TTVAKKwogZXh0ZXJuIGludCBub19pcnFfYWZmaW5pdHk7CiBleHRlcm4gaW50IG5vaXJxZGVidWdfc2V0dXAoY2hhciAqc3RyKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pc2RuLmggYi9pbmNsdWRlL2xpbnV4L2lzZG4uaAppbmRleCA4NjIwODNlLi41M2VhZWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lzZG4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lzZG4uaApAQCAtMTUwLDcgKzE1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkLmggYi9pbmNsdWRlL2xpbnV4L2piZC5oCmluZGV4IDU5MzQwN2UuLmRlMDk3MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvam91cm5hbC1oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2VuZGlmCiAKQEAgLTkxNCw3ICs5MTUsNiBAQAogZXh0ZXJuIGludAkgICBqb3VybmFsX3NraXBfcmVjb3ZlcnkJKGpvdXJuYWxfdCAqKTsKIGV4dGVybiB2b2lkCSAgIGpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2sJKGpvdXJuYWxfdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQJICAgX19qb3VybmFsX2Fib3J0X2hhcmQJKGpvdXJuYWxfdCAqKTsKLWV4dGVybiB2b2lkCSAgIF9fam91cm5hbF9hYm9ydF9zb2Z0CShqb3VybmFsX3QgKiwgaW50KTsKIGV4dGVybiB2b2lkCSAgIGpvdXJuYWxfYWJvcnQgICAgICAoam91cm5hbF90ICosIGludCk7CiBleHRlcm4gaW50CSAgIGpvdXJuYWxfZXJybm8gICAgICAoam91cm5hbF90ICopOwogZXh0ZXJuIHZvaWQJICAgam91cm5hbF9hY2tfZXJyICAgIChqb3VybmFsX3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCmluZGV4IGQ3YTI1NTUuLjZhY2ZkYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0yNTQsMjMgKzI1NCwyMyBAQAogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKIHsKLSNpZiBIWiA8PSAxMDAwICYmICEoMTAwMCAlIEhaKQotCXJldHVybiAoMTAwMCAvIEhaKSAqIGo7Ci0jZWxpZiBIWiA+IDEwMDAgJiYgIShIWiAlIDEwMDApCi0JcmV0dXJuIChqICsgKEhaIC8gMTAwMCkgLSAxKS8oSFogLyAxMDAwKTsKKyNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKE1TRUNfUEVSX1NFQyAvIEhaKSAqIGo7CisjZWxpZiBIWiA+IE1TRUNfUEVSX1NFQyAmJiAhKEhaICUgTVNFQ19QRVJfU0VDKQorCXJldHVybiAoaiArIChIWiAvIE1TRUNfUEVSX1NFQykgLSAxKS8oSFogLyBNU0VDX1BFUl9TRUMpOwogI2Vsc2UKLQlyZXR1cm4gKGogKiAxMDAwKSAvIEhaOworCXJldHVybiAoaiAqIE1TRUNfUEVSX1NFQykgLyBIWjsKICNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX3VzZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKIHsKLSNpZiBIWiA8PSAxMDAwMDAwICYmICEoMTAwMDAwMCAlIEhaKQotCXJldHVybiAoMTAwMDAwMCAvIEhaKSAqIGo7Ci0jZWxpZiBIWiA+IDEwMDAwMDAgJiYgIShIWiAlIDEwMDAwMDApCi0JcmV0dXJuIChqICsgKEhaIC8gMTAwMDAwMCkgLSAxKS8oSFogLyAxMDAwMDAwKTsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKFVTRUNfUEVSX1NFQyAvIEhaKSAqIGo7CisjZWxpZiBIWiA+IFVTRUNfUEVSX1NFQyAmJiAhKEhaICUgVVNFQ19QRVJfU0VDKQorCXJldHVybiAoaiArIChIWiAvIFVTRUNfUEVSX1NFQykgLSAxKS8oSFogLyBVU0VDX1BFUl9TRUMpOwogI2Vsc2UKLQlyZXR1cm4gKGogKiAxMDAwMDAwKSAvIEhaOworCXJldHVybiAoaiAqIFVTRUNfUEVSX1NFQykgLyBIWjsKICNlbmRpZgogfQogCkBAIC0yNzgsMTIgKzI3OCwxMiBAQAogewogCWlmIChtID4gamlmZmllc190b19tc2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKIAkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7Ci0jaWYgSFogPD0gMTAwMCAmJiAhKDEwMDAgJSBIWikKLQlyZXR1cm4gKG0gKyAoMTAwMCAvIEhaKSAtIDEpIC8gKDEwMDAgLyBIWik7Ci0jZWxpZiBIWiA+IDEwMDAgJiYgIShIWiAlIDEwMDApCi0JcmV0dXJuIG0gKiAoSFogLyAxMDAwKTsKKyNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKG0gKyAoTVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoTVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwlyZXR1cm4gbSAqIChIWiAvIE1TRUNfUEVSX1NFQyk7CiAjZWxzZQotCXJldHVybiAobSAqIEhaICsgOTk5KSAvIDEwMDA7CisJcmV0dXJuIChtICogSFogKyBNU0VDX1BFUl9TRUMgLSAxKSAvIE1TRUNfUEVSX1NFQzsKICNlbmRpZgogfQogCkBAIC0yOTEsMTIgKzI5MSwxMiBAQAogewogCWlmICh1ID4gamlmZmllc190b191c2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKIAkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7Ci0jaWYgSFogPD0gMTAwMDAwMCAmJiAhKDEwMDAwMDAgJSBIWikKLQlyZXR1cm4gKHUgKyAoMTAwMDAwMCAvIEhaKSAtIDEpIC8gKDEwMDAwMDAgLyBIWik7Ci0jZWxpZiBIWiA+IDEwMDAwMDAgJiYgIShIWiAlIDEwMDAwMDApCi0JcmV0dXJuIHUgKiAoSFogLyAxMDAwMDAwKTsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKHUgKyAoVVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoVVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gdSAqIChIWiAvIFVTRUNfUEVSX1NFQyk7CiAjZWxzZQotCXJldHVybiAodSAqIEhaICsgOTk5OTk5KSAvIDEwMDAwMDA7CisJcmV0dXJuICh1ICogSFogKyBVU0VDX1BFUl9TRUMgLSAxKSAvIFVTRUNfUEVSX1NFQzsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tsaXN0LmggYi9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKaW5kZXggYzRkMWZhZS4uNzQwNzEyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2xpc3QuaApAQCAtMTcsMTUgKzE3LDE3IEBACiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAotCitzdHJ1Y3Qga2xpc3Rfbm9kZTsKIHN0cnVjdCBrbGlzdCB7CiAJc3BpbmxvY2tfdAkJa19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJa19saXN0OworCXZvaWQJCQkoKmdldCkoc3RydWN0IGtsaXN0X25vZGUgKik7CisJdm9pZAkJCSgqcHV0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKTsKIH07CiAKIAotZXh0ZXJuIHZvaWQga2xpc3RfaW5pdChzdHJ1Y3Qga2xpc3QgKiBrKTsKLQorZXh0ZXJuIHZvaWQga2xpc3RfaW5pdChzdHJ1Y3Qga2xpc3QgKiBrLCB2b2lkICgqZ2V0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSwKKwkJICAgICAgIHZvaWQgKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopKTsKIAogc3RydWN0IGtsaXN0X25vZGUgewogCXN0cnVjdCBrbGlzdAkJKiBuX2tsaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmggYi9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaAppbmRleCBlMDUwZmMyLi5lMzBhZmRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaApAQCAtNDIsNiArNDIsOSBAQAogI2RlZmluZSBLUFJPQkVfUkVFTlRFUgkJMHgwMDAwMDAwNAogI2RlZmluZSBLUFJPQkVfSElUX1NTRE9ORQkweDAwMDAwMDA4CiAKKy8qIEF0dGFjaCB0byBpbnNlcnQgcHJvYmVzIG9uIGFueSBmdW5jdGlvbnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQqLworI2RlZmluZSBfX2twcm9iZXMJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5rcHJvYmVzLnRleHQiKSkpCisKIHN0cnVjdCBrcHJvYmU7CiBzdHJ1Y3QgcHRfcmVnczsKIHN0cnVjdCBrcmV0cHJvYmU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaCBiL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCmluZGV4IDMzOGY3NzkuLjE0N2ViMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlua2FnZS5oCkBAIC0zMyw2ICszMywxMyBAQAogICBBTElHTjsgXAogICBuYW1lOgogCisjZGVmaW5lIEtQUk9CRV9FTlRSWShuYW1lKSBcCisgIC5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCI7IFwKKyAgLmdsb2JsIG5hbWU7IFwKKyAgQUxJR047IFwKKyAgbmFtZToKKworCiAjZW5kaWYKIAogI2RlZmluZSBOT1JFVF9UWVBFICAgIC8qKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDk0YTQ2ZjMuLjU4Mzg1ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTU1LDYgKzE1NSw3IEBACiAKIGV4dGVybiB2b2lkIG51bWFfZGVmYXVsdF9wb2xpY3kodm9pZCk7CiBleHRlcm4gdm9pZCBudW1hX3BvbGljeV9pbml0KHZvaWQpOworZXh0ZXJuIHN0cnVjdCBtZW1wb2xpY3kgZGVmYXVsdF9wb2xpY3k7CiAKICNlbHNlCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCBhZWZlZGYwLi4xOGZjNzdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC0zMyw2ICszMywxMyBAQAogCXVuc2lnbmVkIGludAkJY2FwYWNpdHk7CiB9OwogCitzdHJ1Y3Qgc2Rfc2NyIHsKKwl1bnNpZ25lZCBjaGFyCQlzZGFfdnNuOworCXVuc2lnbmVkIGNoYXIJCWJ1c193aWR0aHM7CisjZGVmaW5lIFNEX1NDUl9CVVNfV0lEVEhfMQkoMTw8MCkKKyNkZWZpbmUgU0RfU0NSX0JVU19XSURUSF80CSgxPDwyKQorfTsKKwogc3RydWN0IG1tY19ob3N0OwogCiAvKgpAQCAtNDcsMTkgKzU0LDI3IEBACiAjZGVmaW5lIE1NQ19TVEFURV9QUkVTRU5UCSgxPDwwKQkJLyogcHJlc2VudCBpbiBzeXNmcyAqLwogI2RlZmluZSBNTUNfU1RBVEVfREVBRAkJKDE8PDEpCQkvKiBkZXZpY2Ugbm8gbG9uZ2VyIGluIHN0YWNrICovCiAjZGVmaW5lIE1NQ19TVEFURV9CQUQJCSgxPDwyKQkJLyogdW5yZWNvZ25pc2VkIGRldmljZSAqLworI2RlZmluZSBNTUNfU1RBVEVfU0RDQVJECSgxPDwzKQkJLyogaXMgYW4gU0QgY2FyZCAqLworI2RlZmluZSBNTUNfU1RBVEVfUkVBRE9OTFkJKDE8PDQpCQkvKiBjYXJkIGlzIHJlYWQtb25seSAqLwogCXUzMgkJCXJhd19jaWRbNF07CS8qIHJhdyBjYXJkIENJRCAqLwogCXUzMgkJCXJhd19jc2RbNF07CS8qIHJhdyBjYXJkIENTRCAqLworCXUzMgkJCXJhd19zY3JbMl07CS8qIHJhdyBjYXJkIFNDUiAqLwogCXN0cnVjdCBtbWNfY2lkCQljaWQ7CQkvKiBjYXJkIGlkZW50aWZpY2F0aW9uICovCiAJc3RydWN0IG1tY19jc2QJCWNzZDsJCS8qIGNhcmQgc3BlY2lmaWMgKi8KKwlzdHJ1Y3Qgc2Rfc2NyCQlzY3I7CQkvKiBleHRyYSBTRCBpbmZvcm1hdGlvbiAqLwogfTsKIAogI2RlZmluZSBtbWNfY2FyZF9wcmVzZW50KGMpCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX1BSRVNFTlQpCiAjZGVmaW5lIG1tY19jYXJkX2RlYWQoYykJKChjKS0+c3RhdGUgJiBNTUNfU1RBVEVfREVBRCkKICNkZWZpbmUgbW1jX2NhcmRfYmFkKGMpCQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9CQUQpCisjZGVmaW5lIG1tY19jYXJkX3NkKGMpCQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9TRENBUkQpCisjZGVmaW5lIG1tY19jYXJkX3JlYWRvbmx5KGMpCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX1JFQURPTkxZKQogCiAjZGVmaW5lIG1tY19jYXJkX3NldF9wcmVzZW50KGMpCSgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9QUkVTRU5UKQogI2RlZmluZSBtbWNfY2FyZF9zZXRfZGVhZChjKQkoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfREVBRCkKICNkZWZpbmUgbW1jX2NhcmRfc2V0X2JhZChjKQkoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfQkFEKQorI2RlZmluZSBtbWNfY2FyZF9zZXRfc2QoYykJKChjKS0+c3RhdGUgfD0gTU1DX1NUQVRFX1NEQ0FSRCkKKyNkZWZpbmUgbW1jX2NhcmRfc2V0X3JlYWRvbmx5KGMpICgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9SRUFET05MWSkKIAogI2RlZmluZSBtbWNfY2FyZF9uYW1lKGMpCSgoYyktPmNpZC5wcm9kX25hbWUpCiAjZGVmaW5lIG1tY19jYXJkX2lkKGMpCQkoKGMpLT5kZXYuYnVzX2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCmluZGV4IDMwZjY4YzAuLmMxZjAyMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKQEAgLTU3LDExICs1NywxNyBAQAogI2RlZmluZSBNTUNfUE9XRVJfT0ZGCQkwCiAjZGVmaW5lIE1NQ19QT1dFUl9VUAkJMQogI2RlZmluZSBNTUNfUE9XRVJfT04JCTIKKworCXVuc2lnbmVkIGNoYXIJYnVzX3dpZHRoOwkJLyogZGF0YSBidXMgd2lkdGggKi8KKworI2RlZmluZSBNTUNfQlVTX1dJRFRIXzEJCTAKKyNkZWZpbmUgTU1DX0JVU19XSURUSF80CQkyCiB9OwogCiBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHsKIAl2b2lkCSgqcmVxdWVzdCkoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcSk7CiAJdm9pZAkoKnNldF9pb3MpKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19pb3MgKmlvcyk7CisJaW50CSgqZ2V0X3JvKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogfTsKIAogc3RydWN0IG1tY19jYXJkOwpAQCAtNzYsNiArODIsMTAgQEAKIAl1bnNpZ25lZCBpbnQJCWZfbWF4OwogCXUzMgkJCW9jcl9hdmFpbDsKIAorCXVuc2lnbmVkIGxvbmcJCWNhcHM7CQkvKiBIb3N0IGNhcGFiaWxpdGllcyAqLworCisjZGVmaW5lIE1NQ19DQVBfNF9CSVRfREFUQQkoMSA8PCAwKQkvKiBDYW4gdGhlIGhvc3QgZG8gNCBiaXQgdHJhbnNmZXJzICovCisKIAkvKiBob3N0IHNwZWNpZmljIGJsb2NrIGRhdGEgKi8KIAl1bnNpZ25lZCBpbnQJCW1heF9zZWdfc2l6ZTsJLyogc2VlIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplICovCiAJdW5zaWduZWQgc2hvcnQJCW1heF9od19zZWdzOwkvKiBzZWUgYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyAqLwpAQCAtODcsNiArOTcsMTAgQEAKIAlzdHJ1Y3QgbW1jX2lvcwkJaW9zOwkJLyogY3VycmVudCBpbyBidXMgc2V0dGluZ3MgKi8KIAl1MzIJCQlvY3I7CQkvKiB0aGUgY3VycmVudCBPQ1Igc2V0dGluZyAqLwogCisJdW5zaWduZWQgaW50CQltb2RlOwkJLyogY3VycmVudCBjYXJkIG1vZGUgb2YgaG9zdCAqLworI2RlZmluZSBNTUNfTU9ERV9NTUMJCTAKKyNkZWZpbmUgTU1DX01PREVfU0QJCTEKKwogCXN0cnVjdCBsaXN0X2hlYWQJY2FyZHM7CQkvKiBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoaXMgaG9zdCAqLwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd3E7CkBAIC05NSw2ICsxMDksOCBAQAogCXN0cnVjdCBtbWNfY2FyZAkJKmNhcmRfc2VsZWN0ZWQ7CS8qIHRoZSBzZWxlY3RlZCBNTUMgY2FyZCAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0CWRldGVjdDsKKworCXVuc2lnbmVkIGxvbmcJCXByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBtbWNfaG9zdCAqbW1jX2FsbG9jX2hvc3QoaW50IGV4dHJhLCBzdHJ1Y3QgZGV2aWNlICopOwpAQCAtMTAyLDE0ICsxMTgsMTggQEAKIGV4dGVybiB2b2lkIG1tY19yZW1vdmVfaG9zdChzdHJ1Y3QgbW1jX2hvc3QgKik7CiBleHRlcm4gdm9pZCBtbWNfZnJlZV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqKTsKIAotI2RlZmluZSBtbWNfcHJpdih4KQkoKHZvaWQgKikoKHgpICsgMSkpCitzdGF0aWMgaW5saW5lIHZvaWQgKm1tY19wcml2KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKHZvaWQgKilob3N0LT5wcml2YXRlOworfQorCiAjZGVmaW5lIG1tY19kZXYoeCkJKCh4KS0+ZGV2KQogI2RlZmluZSBtbWNfaG9zdG5hbWUoeCkJKCh4KS0+Y2xhc3NfZGV2LmNsYXNzX2lkKQogCiBleHRlcm4gaW50IG1tY19zdXNwZW5kX2hvc3Qoc3RydWN0IG1tY19ob3N0ICosIHBtX21lc3NhZ2VfdCk7CiBleHRlcm4gaW50IG1tY19yZXN1bWVfaG9zdChzdHJ1Y3QgbW1jX2hvc3QgKik7CiAKLWV4dGVybiB2b2lkIG1tY19kZXRlY3RfY2hhbmdlKHN0cnVjdCBtbWNfaG9zdCAqKTsKK2V4dGVybiB2b2lkIG1tY19kZXRlY3RfY2hhbmdlKHN0cnVjdCBtbWNfaG9zdCAqLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKIGV4dGVybiB2b2lkIG1tY19yZXF1ZXN0X2RvbmUoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfcmVxdWVzdCAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCmluZGV4IDBkMzVkNGYuLjFhYjc4ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCkBAIC04OCw2ICs4OCw4IEBACiAKIGV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19yZXF1ZXN0ICopOwogZXh0ZXJuIGludCBtbWNfd2FpdF9mb3JfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKiwgaW50KTsKK2V4dGVybiBpbnQgbW1jX3dhaXRfZm9yX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICosIHVuc2lnbmVkIGludCwKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKiwgaW50KTsKIAogZXh0ZXJuIGludCBfX21tY19jbGFpbV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaCBiL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmgKaW5kZXggODk2MzQyOC4uZjgxOWNhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9wcm90b2NvbC5oCkBAIC0yMzYsNSArMjM2LDEyIEBACiAjZGVmaW5lIENTRF9TUEVDX1ZFUl8yICAgICAgMiAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAyLjAgLSAyLjIgKi8KICNkZWZpbmUgQ1NEX1NQRUNfVkVSXzMgICAgICAzICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDMuMSAqLwogCisKKy8qCisgKiBTRCBidXMgd2lkdGhzCisgKi8KKyNkZWZpbmUgU0RfQlVTX1dJRFRIXzEgICAgICAwCisjZGVmaW5lIFNEX0JVU19XSURUSF80ICAgICAgMgorCiAjZW5kaWYgIC8qIE1NQ19NTUNfUFJPVE9DT0xfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zZy5oIGIvaW5jbHVkZS9saW51eC9tc2cuaAppbmRleCAyYzRjNmFhLi45MDNlMGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zZy5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNnLmgKQEAgLTc3LDYgKzc3LDcgQEAKIC8qIG9uZSBtc3FfcXVldWUgc3RydWN0dXJlIGZvciBlYWNoIHByZXNlbnQgcXVldWUgb24gdGhlIHN5c3RlbSAqLwogc3RydWN0IG1zZ19xdWV1ZSB7CiAJc3RydWN0IGtlcm5faXBjX3Blcm0gcV9wZXJtOworCWludCBxX2lkOwogCXRpbWVfdCBxX3N0aW1lOwkJCS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KIAl0aW1lX3QgcV9ydGltZTsJCQkvKiBsYXN0IG1zZ3JjdiB0aW1lICovCiAJdGltZV90IHFfY3RpbWU7CQkJLyogbGFzdCBjaGFuZ2UgdGltZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKaW5kZXggMDg4NzQyYi4uN2UwMzNlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCkBAIC0yNjMsNiArMjYzLDkgQEAKIAkvKiBVbmlxdWUgSUQgKi8KIAl1bnNpZ25lZCBpbnQgaWQ7CiAKKwkvKiBGbGFncyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwogI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECiAJLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgcGVyLXByb3RvIHBhcnQsIHVzZWQgdG8gbWFwIHRoZQogCSAqIGV4cGVjdGVkIGNvbm5lY3Rpb24gdGhlIHdheSB0aGUgcmVjaXBpZW50IGV4cGVjdHMuICovCkBAIC0yNzIsNiArMjc1LDggQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UCTB4MQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF9jb25udHJhY2sgKgogdHVwbGVoYXNoX3RvX2N0cmFjayhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2gpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmgKaW5kZXggZGM0ZDJhMC4uOTA3ZDRmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaApAQCAtNTIsNyArNTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiB2b2lkIF9faXBfY3RfZXhwZWN0X3VubGlua19kZXN0cm95KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOworZXh0ZXJuIHZvaWQgaXBfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKIAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oCmluZGV4IGZlY2QyYTAuLjczYjk1NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmgKQEAgLTE5LDUgKzE5LDEwIEBACiBhbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAogCQkgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8sCiAJCSAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludAorYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisJCQkgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOwogI2VuZGlmCiAjZW5kaWYgLyogX0lQX05BVF9SVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IGJjNGM0MDAuLjczNDkwNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMTksNDM2ICsxOSwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKLS8qCi0gKiBVbmRlciBQQ0ksIGVhY2ggZGV2aWNlIGhhcyAyNTYgYnl0ZXMgb2YgY29uZmlndXJhdGlvbiBhZGRyZXNzIHNwYWNlLAotICogb2Ygd2hpY2ggdGhlIGZpcnN0IDY0IGJ5dGVzIGFyZSBzdGFuZGFyZGl6ZWQgYXMgZm9sbG93czoKLSAqLwotI2RlZmluZSBQQ0lfVkVORE9SX0lECQkweDAwCS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRAkJMHgwMgkvKiAxNiBiaXRzICovCi0jZGVmaW5lIFBDSV9DT01NQU5ECQkweDA0CS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX0lPCQkweDEJLyogRW5hYmxlIHJlc3BvbnNlIGluIEkvTyBzcGFjZSAqLwotI2RlZmluZSAgUENJX0NPTU1BTkRfTUVNT1JZCTB4MgkvKiBFbmFibGUgcmVzcG9uc2UgaW4gTWVtb3J5IHNwYWNlICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9NQVNURVIJMHg0CS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9TUEVDSUFMCTB4OAkvKiBFbmFibGUgcmVzcG9uc2UgdG8gc3BlY2lhbCBjeWNsZXMgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX0lOVkFMSURBVEUJMHgxMAkvKiBVc2UgbWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9WR0FfUEFMRVRURSAweDIwCS8qIEVuYWJsZSBwYWxldHRlIHNub29waW5nICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9QQVJJVFkJMHg0MAkvKiBFbmFibGUgcGFyaXR5IGNoZWNraW5nICovCi0jZGVmaW5lICBQQ0lfQ09NTUFORF9XQUlUIAkweDgwCS8qIEVuYWJsZSBhZGRyZXNzL2RhdGEgc3RlcHBpbmcgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX1NFUlIJMHgxMDAJLyogRW5hYmxlIFNFUlIgKi8KLSNkZWZpbmUgIFBDSV9DT01NQU5EX0ZBU1RfQkFDSwkweDIwMAkvKiBFbmFibGUgYmFjay10by1iYWNrIHdyaXRlcyAqLwotI2RlZmluZSAgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFIDB4NDAwIC8qIElOVHggRW11bGF0aW9uIERpc2FibGUgKi8KLQotI2RlZmluZSBQQ0lfU1RBVFVTCQkweDA2CS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfQ0FQX0xJU1QJMHgxMAkvKiBTdXBwb3J0IENhcGFiaWxpdHkgTGlzdCAqLwotI2RlZmluZSAgUENJX1NUQVRVU182Nk1IWgkweDIwCS8qIFN1cHBvcnQgNjYgTWh6IFBDSSAyLjEgYnVzICovCi0jZGVmaW5lICBQQ0lfU1RBVFVTX1VERgkJMHg0MAkvKiBTdXBwb3J0IFVzZXIgRGVmaW5hYmxlIEZlYXR1cmVzIFtvYnNvbGV0ZV0gKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfRkFTVF9CQUNLCTB4ODAJLyogQWNjZXB0IGZhc3QtYmFjayB0byBiYWNrICovCi0jZGVmaW5lICBQQ0lfU1RBVFVTX1BBUklUWQkweDEwMAkvKiBEZXRlY3RlZCBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX01BU0sJMHg2MDAJLyogREVWU0VMIHRpbWluZyAqLwotI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfRkFTVAkweDAwMAkKLSNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX01FRElVTSAweDIwMAotI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfU0xPVyAweDQwMAotI2RlZmluZSAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIDB4ODAwIC8qIFNldCBvbiB0YXJnZXQgYWJvcnQgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCAweDEwMDAgLyogTWFzdGVyIGFjayBvZiAiICovCi0jZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgMHgyMDAwIC8qIFNldCBvbiBtYXN0ZXIgYWJvcnQgKi8KLSNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiAweDQwMDAgLyogU2V0IHdoZW4gd2UgZHJpdmUgU0VSUiAqLwotI2RlZmluZSAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgMHg4MDAwIC8qIFNldCBvbiBwYXJpdHkgZXJyb3IgKi8KLQotI2RlZmluZSBQQ0lfQ0xBU1NfUkVWSVNJT04JMHgwOAkvKiBIaWdoIDI0IGJpdHMgYXJlIGNsYXNzLCBsb3cgOAotCQkJCQkgICByZXZpc2lvbiAqLwotI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQgICAgICAgICAweDA4ICAgIC8qIFJldmlzaW9uIElEICovCi0jZGVmaW5lIFBDSV9DTEFTU19QUk9HICAgICAgICAgIDB4MDkgICAgLyogUmVnLiBMZXZlbCBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgUENJX0NMQVNTX0RFVklDRSAgICAgICAgMHgwYSAgICAvKiBEZXZpY2UgY2xhc3MgKi8KLQotI2RlZmluZSBQQ0lfQ0FDSEVfTElORV9TSVpFCTB4MGMJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9MQVRFTkNZX1RJTUVSCTB4MGQJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9IRUFERVJfVFlQRQkJMHgwZQkvKiA4IGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9IRUFERVJfVFlQRV9OT1JNQUwJMAotI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRSAxCi0jZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUyAyCi0KLSNkZWZpbmUgUENJX0JJU1QJCTB4MGYJLyogOCBiaXRzICovCi0jZGVmaW5lICBQQ0lfQklTVF9DT0RFX01BU0sJMHgwZgkvKiBSZXR1cm4gcmVzdWx0ICovCi0jZGVmaW5lICBQQ0lfQklTVF9TVEFSVAkJMHg0MAkvKiAxIHRvIHN0YXJ0IEJJU1QsIDIgc2VjcyBvciBsZXNzICovCi0jZGVmaW5lICBQQ0lfQklTVF9DQVBBQkxFCTB4ODAJLyogMSBpZiBCSVNUIGNhcGFibGUgKi8KLQotLyoKLSAqIEJhc2UgYWRkcmVzc2VzIHNwZWNpZnkgbG9jYXRpb25zIGluIG1lbW9yeSBvciBJL08gc3BhY2UuCi0gKiBEZWNvZGVkIHNpemUgY2FuIGJlIGRldGVybWluZWQgYnkgd3JpdGluZyBhIHZhbHVlIG9mIAotICogMHhmZmZmZmZmZiB0byB0aGUgcmVnaXN0ZXIsIGFuZCByZWFkaW5nIGl0IGJhY2suICBPbmx5IAotICogMSBiaXRzIGFyZSBkZWNvZGVkLgotICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMAkweDEwCS8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18xCTB4MTQJLyogMzIgYml0cyBbaHR5cGUgMCwxIG9ubHldICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMgkweDE4CS8qIDMyIGJpdHMgW2h0eXBlIDAgb25seV0gKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18zCTB4MWMJLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzQJMHgyMAkvKiAzMiBiaXRzICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNQkweDI0CS8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UJMHgwMQkvKiAwID0gbWVtb3J5LCAxID0gSS9PICovCi0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPIDB4MDEKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZIDB4MDAKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSyAweDA2Ci0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyCTB4MDAJLyogMzIgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU0JMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCi0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0CTB4MDQJLyogNjQgYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENICTB4MDgJLyogcHJlZmV0Y2hhYmxlPyAqLwotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSwkofjB4MGZVTCkKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwkofjB4MDNVTCkKLS8qIGJpdCAxIGlzIHJlc2VydmVkIGlmIGFkZHJlc3Nfc3BhY2UgPSAxICovCi0KLS8qIEhlYWRlciB0eXBlIDAgKG5vcm1hbCBkZXZpY2VzKSAqLwotI2RlZmluZSBQQ0lfQ0FSREJVU19DSVMJCTB4MjgKLSNkZWZpbmUgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHgyYwotI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lECTB4MmUgIAotI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MJCTB4MzAJLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCi0jZGVmaW5lICBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFCTB4MDEKLSNkZWZpbmUgUENJX1JPTV9BRERSRVNTX01BU0sJKH4weDdmZlVMKQotCi0jZGVmaW5lIFBDSV9DQVBBQklMSVRZX0xJU1QJMHgzNAkvKiBPZmZzZXQgb2YgZmlyc3QgY2FwYWJpbGl0eSBsaXN0IGVudHJ5ICovCi0KLS8qIDB4MzUtMHgzYiBhcmUgcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgUENJX0lOVEVSUlVQVF9MSU5FCTB4M2MJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogOCBiaXRzICovCi0jZGVmaW5lIFBDSV9NSU5fR05UCQkweDNlCS8qIDggYml0cyAqLwotI2RlZmluZSBQQ0lfTUFYX0xBVAkJMHgzZgkvKiA4IGJpdHMgKi8KLQotLyogSGVhZGVyIHR5cGUgMSAoUENJLXRvLVBDSSBicmlkZ2VzKSAqLwotI2RlZmluZSBQQ0lfUFJJTUFSWV9CVVMJCTB4MTgJLyogUHJpbWFyeSBidXMgbnVtYmVyICovCi0jZGVmaW5lIFBDSV9TRUNPTkRBUllfQlVTCTB4MTkJLyogU2Vjb25kYXJ5IGJ1cyBudW1iZXIgKi8KLSNkZWZpbmUgUENJX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIEhpZ2hlc3QgYnVzIG51bWJlciBiZWhpbmQgdGhlIGJyaWRnZSAqLwotI2RlZmluZSBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBMYXRlbmN5IHRpbWVyIGZvciBzZWNvbmRhcnkgaW50ZXJmYWNlICovCi0jZGVmaW5lIFBDSV9JT19CQVNFCQkweDFjCS8qIEkvTyByYW5nZSBiZWhpbmQgdGhlIGJyaWRnZSAqLwotI2RlZmluZSBQQ0lfSU9fTElNSVQJCTB4MWQKLSNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFX01BU0sJMHgwZlVMCS8qIEkvTyBicmlkZ2luZyB0eXBlICovCi0jZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8xNgkweDAwCi0jZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8zMgkweDAxCi0jZGVmaW5lICBQQ0lfSU9fUkFOR0VfTUFTSwkofjB4MGZVTCkKLSNkZWZpbmUgUENJX1NFQ19TVEFUVVMJCTB4MWUJLyogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3Rlciwgb25seSBiaXQgMTQgdXNlZCAqLwotI2RlZmluZSBQQ0lfTUVNT1JZX0JBU0UJCTB4MjAJLyogTWVtb3J5IHJhbmdlIGJlaGluZCAqLwotI2RlZmluZSBQQ0lfTUVNT1JZX0xJTUlUCTB4MjIKLSNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAotI2RlZmluZSAgUENJX01FTU9SWV9SQU5HRV9NQVNLCSh+MHgwZlVMKQotI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfQkFTRQkweDI0CS8qIFByZWZldGNoYWJsZSBtZW1vcnkgcmFuZ2UgYmVoaW5kICovCi0jZGVmaW5lIFBDSV9QUkVGX01FTU9SWV9MSU1JVAkweDI2Ci0jZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0sgMHgwZlVMCi0jZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzMyCTB4MDAKLSNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQJMHgwMQotI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfTUFTSwkofjB4MGZVTCkKLSNkZWZpbmUgUENJX1BSRUZfQkFTRV9VUFBFUjMyCTB4MjgJLyogVXBwZXIgaGFsZiBvZiBwcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlICovCi0jZGVmaW5lIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIJMHgyYwotI2RlZmluZSBQQ0lfSU9fQkFTRV9VUFBFUjE2CTB4MzAJLyogVXBwZXIgaGFsZiBvZiBJL08gYWRkcmVzc2VzICovCi0jZGVmaW5lIFBDSV9JT19MSU1JVF9VUFBFUjE2CTB4MzIKLS8qIDB4MzQgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLwotLyogMHgzNS0weDNiIGlzIHJlc2VydmVkICovCi0jZGVmaW5lIFBDSV9ST01fQUREUkVTUzEJMHgzOAkvKiBTYW1lIGFzIFBDSV9ST01fQUREUkVTUywgYnV0IGZvciBodHlwZSAxICovCi0vKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KLSNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MCTB4M2UKLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIEVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1NFUlIJMHgwMgkvKiBUaGUgc2FtZSBmb3IgU0VSUiBmb3J3YXJkaW5nICovCi0jZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9OT19JU0EJMHgwNAkvKiBEaXNhYmxlIGJyaWRnaW5nIG9mIElTQSBwb3J0cyAqLwotI2RlZmluZSAgUENJX0JSSURHRV9DVExfVkdBCTB4MDgJLyogRm9yd2FyZCBWR0EgYWRkcmVzc2VzICovCi0jZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQgMHgyMCAgLyogUmVwb3J0IG1hc3RlciBhYm9ydHMgKi8KLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0JVU19SRVNFVCAweDQwCS8qIFNlY29uZGFyeSBidXMgcmVzZXQgKi8KLSNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0ZBU1RfQkFDSyAweDgwCS8qIEZhc3QgQmFjazJCYWNrIGVuYWJsZWQgb24gc2Vjb25kYXJ5IGludGVyZmFjZSAqLwotCi0vKiBIZWFkZXIgdHlwZSAyIChDYXJkQnVzIGJyaWRnZXMpICovCi0jZGVmaW5lIFBDSV9DQl9DQVBBQklMSVRZX0xJU1QJMHgxNAotLyogMHgxNSByZXNlcnZlZCAqLwotI2RlZmluZSBQQ0lfQ0JfU0VDX1NUQVRVUwkweDE2CS8qIFNlY29uZGFyeSBzdGF0dXMgKi8KLSNkZWZpbmUgUENJX0NCX1BSSU1BUllfQlVTCTB4MTgJLyogUENJIGJ1cyBudW1iZXIgKi8KLSNkZWZpbmUgUENJX0NCX0NBUkRfQlVTCQkweDE5CS8qIENhcmRCdXMgYnVzIG51bWJlciAqLwotI2RlZmluZSBQQ0lfQ0JfU1VCT1JESU5BVEVfQlVTCTB4MWEJLyogU3Vib3JkaW5hdGUgYnVzIG51bWJlciAqLwotI2RlZmluZSBQQ0lfQ0JfTEFURU5DWV9USU1FUgkweDFiCS8qIENhcmRCdXMgbGF0ZW5jeSB0aW1lciAqLwotI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0JBU0VfMAkweDFjCi0jZGVmaW5lIFBDSV9DQl9NRU1PUllfTElNSVRfMAkweDIwCi0jZGVmaW5lIFBDSV9DQl9NRU1PUllfQkFTRV8xCTB4MjQKLSNkZWZpbmUgUENJX0NCX01FTU9SWV9MSU1JVF8xCTB4MjgKLSNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMAkweDJjCi0jZGVmaW5lIFBDSV9DQl9JT19CQVNFXzBfSEkJMHgyZQotI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMAkweDMwCi0jZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8wX0hJCTB4MzIKLSNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMQkweDM0Ci0jZGVmaW5lIFBDSV9DQl9JT19CQVNFXzFfSEkJMHgzNgotI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMQkweDM4Ci0jZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8xX0hJCTB4M2EKLSNkZWZpbmUgIFBDSV9DQl9JT19SQU5HRV9NQVNLCSh+MHgwM1VMKQotLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCi0jZGVmaW5lIFBDSV9DQl9CUklER0VfQ09OVFJPTAkweDNlCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBTaW1pbGFyIHRvIHN0YW5kYXJkIGJyaWRnZSBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9TRVJSCQkweDAyCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9JU0EJCTB4MDQKLSNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1ZHQQkJMHgwOAotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUCTB4MjAKLSNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX0NCX1JFU0VUCTB4NDAJLyogQ2FyZEJ1cyByZXNldCAqLwotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfMTZCSVRfSU5UCTB4ODAJLyogRW5hYmxlIGludGVycnVwdCBmb3IgMTYtYml0IGNhcmRzICovCi0jZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QUkVGRVRDSF9NRU0wIDB4MTAwCS8qIFByZWZldGNoIGVuYWJsZSBmb3IgYm90aCBtZW1vcnkgcmVnaW9ucyAqLwotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUFJFRkVUQ0hfTUVNMSAweDIwMAotI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUE9TVF9XUklURVMJMHg0MDAKLSNkZWZpbmUgUENJX0NCX1NVQlNZU1RFTV9WRU5ET1JfSUQgMHg0MAotI2RlZmluZSBQQ0lfQ0JfU1VCU1lTVEVNX0lECTB4NDIKLSNkZWZpbmUgUENJX0NCX0xFR0FDWV9NT0RFX0JBU0UJMHg0NAkvKiAxNi1iaXQgUEMgQ2FyZCBsZWdhY3kgbW9kZSBiYXNlIGFkZHJlc3MgKEV4Q2EpICovCi0vKiAweDQ4LTB4N2YgcmVzZXJ2ZWQgKi8KLQotLyogQ2FwYWJpbGl0eSBsaXN0cyAqLwotCi0jZGVmaW5lIFBDSV9DQVBfTElTVF9JRAkJMAkvKiBDYXBhYmlsaXR5IElEICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX1BNCQkweDAxCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgIFBDSV9DQVBfSURfQUdQCQkweDAyCS8qIEFjY2VsZXJhdGVkIEdyYXBoaWNzIFBvcnQgKi8KLSNkZWZpbmUgIFBDSV9DQVBfSURfVlBECQkweDAzCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLwotI2RlZmluZSAgUENJX0NBUF9JRF9TTE9USUQJMHgwNAkvKiBTbG90IElkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX01TSQkJMHgwNQkvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX0NIU1dQCTB4MDYJLyogQ29tcGFjdFBDSSBIb3RTd2FwICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX1BDSVgJMHgwNwkvKiBQQ0ktWCAqLwotI2RlZmluZSAgUENJX0NBUF9JRF9TSFBDIAkweDBDCS8qIFBDSSBTdGFuZGFyZCBIb3QtUGx1ZyBDb250cm9sbGVyICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLwotI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KLSNkZWZpbmUgUENJX0NBUF9MSVNUX05FWFQJMQkvKiBOZXh0IGNhcGFiaWxpdHkgaW4gdGhlIGxpc3QgKi8KLSNkZWZpbmUgUENJX0NBUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXR5IGRlZmluZWQgZmxhZ3MgKDE2IGJpdHMpICovCi0jZGVmaW5lIFBDSV9DQVBfU0laRU9GCQk0Ci0KLS8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgUENJX1BNX1BNQyAgICAgICAgICAgICAgMiAgICAgICAvKiBQTSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfVkVSX01BU0sJMHgwMDA3CS8qIFZlcnNpb24gKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0NMT0NLCTB4MDAwOAkvKiBQTUUgY2xvY2sgcmVxdWlyZWQgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUkVTRVJWRUQgICAgMHgwMDEwICAvKiBSZXNlcnZlZCBmaWVsZCAqLwotI2RlZmluZSAgUENJX1BNX0NBUF9EU0kJCTB4MDAyMAkvKiBEZXZpY2Ugc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfQVVYX1BPV0VSCTB4MDFDMAkvKiBBdXhpbGxpYXJ5IHBvd2VyIHN1cHBvcnQgbWFzayAqLwotI2RlZmluZSAgUENJX1BNX0NBUF9EMQkJMHgwMjAwCS8qIEQxIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfRDIJCTB4MDQwMAkvKiBEMiBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCi0jZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRQkJMHgwODAwCS8qIFBNRSBwaW4gc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9NQVNLICAgIDB4RjgwMCAgLyogUE1FIE1hc2sgb2YgYWxsIHN1cHBvcnRlZCBzdGF0ZXMgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QwICAgICAgMHgwODAwICAvKiBQTUUjIGZyb20gRDAgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QxICAgICAgMHgxMDAwICAvKiBQTUUjIGZyb20gRDEgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QyICAgICAgMHgyMDAwICAvKiBQTUUjIGZyb20gRDIgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzICAgICAgMHg0MDAwICAvKiBQTUUjIGZyb20gRDMgKGhvdCkgKi8KLSNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzY29sZCAgMHg4MDAwICAvKiBQTUUjIGZyb20gRDMgKGNvbGQpICovCi0jZGVmaW5lIFBDSV9QTV9DVFJMCQk0CS8qIFBNIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSAgUENJX1BNX0NUUkxfU1RBVEVfTUFTSwkweDAwMDMJLyogQ3VycmVudCBwb3dlciBzdGF0ZSAoRDAgdG8gRDMpICovCi0jZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFCTB4MDEwMAkvKiBQTUUgcGluIGVuYWJsZSAqLwotI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TRUxfTUFTSwkweDFlMDAJLyogRGF0YSBzZWxlY3QgKD8/KSAqLwotI2RlZmluZSAgUENJX1BNX0NUUkxfREFUQV9TQ0FMRV9NQVNLCTB4NjAwMAkvKiBEYXRhIHNjYWxlICg/PykgKi8KLSNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9TVEFUVVMJMHg4MDAwCS8qIFBNRSBwaW4gc3RhdHVzICovCi0jZGVmaW5lIFBDSV9QTV9QUEJfRVhURU5TSU9OUwk2CS8qIFBQQiBzdXBwb3J0IGV4dGVuc2lvbnMgKD8/KSAqLwotI2RlZmluZSAgUENJX1BNX1BQQl9CMl9CMwkweDQwCS8qIFN0b3AgY2xvY2sgd2hlbiBpbiBEM2hvdCAoPz8pICovCi0jZGVmaW5lICBQQ0lfUE1fQlBDQ19FTkFCTEUJMHg4MAkvKiBCdXMgcG93ZXIvY2xvY2sgY29udHJvbCBlbmFibGUgKD8/KSAqLwotI2RlZmluZSBQQ0lfUE1fREFUQV9SRUdJU1RFUgk3CS8qICg/PykgKi8KLSNkZWZpbmUgUENJX1BNX1NJWkVPRgkJOAotCi0vKiBBR1AgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgUENJX0FHUF9WRVJTSU9OCQkyCS8qIEJDRCB2ZXJzaW9uIG51bWJlciAqLwotI2RlZmluZSBQQ0lfQUdQX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgUENJX0FHUF9TVEFUVVMJCTQJLyogU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SUV9NQVNLCTB4ZmYwMDAwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgLSAxICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU182NEJJVAkweDAwMjAJLyogNjQtYml0IGFkZHJlc3Npbmcgc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19GVwkweDAwMTAJLyogRlcgdHJhbnNmZXJzIHN1cHBvcnRlZCAqLwotI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTQJMHgwMDA0CS8qIDR4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMgkweDAwMDIJLyogMnggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUxCTB4MDAwMQkvKiAxeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLwotI2RlZmluZSBQQ0lfQUdQX0NPTU1BTkQJCTgJLyogQ29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JRX01BU0sgMHhmZjAwMDAwMCAgLyogTWFzdGVyOiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAqLwotI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBlbmFibGVkICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfQUdQCTB4MDEwMAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIEFHUCB0cmFuc2FjdGlvbnMgKi8KLSNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF82NEJJVAkweDAwMjAgCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgNjQtYml0IGFkZHJlc3NlcyAqLwotI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0ZXCTB4MDAxMCAJLyogRm9yY2UgRlcgdHJhbnNmZXJzICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTQJMHgwMDA0CS8qIFVzZSA0eCByYXRlICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTIJMHgwMDAyCS8qIFVzZSAyeCByYXRlICovCi0jZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUkFURTEJMHgwMDAxCS8qIFVzZSAxeCByYXRlICovCi0jZGVmaW5lIFBDSV9BR1BfU0laRU9GCQkxMgotCi0vKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KLQotI2RlZmluZSBQQ0lfVlBEX0FERFIJCTIJLyogQWRkcmVzcyB0byBhY2Nlc3MgKDE1IGJpdHMhKSAqLwotI2RlZmluZSAgUENJX1ZQRF9BRERSX01BU0sJMHg3ZmZmCS8qIEFkZHJlc3MgbWFzayAqLwotI2RlZmluZSAgUENJX1ZQRF9BRERSX0YJCTB4ODAwMAkvKiBXcml0ZSAwLCAxIGluZGljYXRlcyBjb21wbGV0aW9uICovCi0jZGVmaW5lIFBDSV9WUERfREFUQQkJNAkvKiAzMi1iaXRzIG9mIGRhdGEgcmV0dXJuZWQgaGVyZSAqLwotCi0vKiBTbG90IElkZW50aWZpY2F0aW9uICovCi0KLSNkZWZpbmUgUENJX1NJRF9FU1IJCTIJLyogRXhwYW5zaW9uIFNsb3QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgIFBDSV9TSURfRVNSX05TTE9UUwkweDFmCS8qIE51bWJlciBvZiBleHBhbnNpb24gc2xvdHMgYXZhaWxhYmxlICovCi0jZGVmaW5lICBQQ0lfU0lEX0VTUl9GSUMJMHgyMAkvKiBGaXJzdCBJbiBDaGFzc2lzIEZsYWcgKi8KLSNkZWZpbmUgUENJX1NJRF9DSEFTU0lTX05SCTMJLyogQ2hhc3NpcyBOdW1iZXIgKi8KLQotLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyByZWdpc3RlcnMgKi8KLQotI2RlZmluZSBQQ0lfTVNJX0ZMQUdTCQkyCS8qIFZhcmlvdXMgZmxhZ3MgKi8KLSNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfNjRCSVQJMHg4MAkvKiA2NC1iaXQgYWRkcmVzc2VzIGFsbG93ZWQgKi8KLSNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUVNJWkUJMHg3MAkvKiBNZXNzYWdlIHF1ZXVlIHNpemUgY29uZmlndXJlZCAqLwotI2RlZmluZSAgUENJX01TSV9GTEFHU19RTUFTSwkweDBlCS8qIE1heGltdW0gcXVldWUgc2l6ZSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfRU5BQkxFCTB4MDEJLyogTVNJIGZlYXR1cmUgZW5hYmxlZCAqLwotI2RlZmluZSAgUENJX01TSV9GTEFHU19NQVNLQklUCTB4MTAwCS8qIDY0LWJpdCBtYXNrIGJpdHMgYWxsb3dlZCAqLwotI2RlZmluZSBQQ0lfTVNJX1JGVQkJMwkvKiBSZXN0IG9mIGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgUENJX01TSV9BRERSRVNTX0xPCTQJLyogTG93ZXIgMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfSEkJOAkvKiBVcHBlciAzMiBiaXRzIChpZiBQQ0lfTVNJX0ZMQUdTXzY0QklUIHNldCkgKi8KLSNkZWZpbmUgUENJX01TSV9EQVRBXzMyCQk4CS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgMzItYml0IGRldmljZXMgKi8KLSNkZWZpbmUgUENJX01TSV9EQVRBXzY0CQkxMgkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDY0LWJpdCBkZXZpY2VzICovCi0jZGVmaW5lIFBDSV9NU0lfTUFTS19CSVQJMTYJLyogTWFzayBiaXRzIHJlZ2lzdGVyICovCi0KLS8qIENvbXBhY3RQQ0kgSG90c3dhcCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFBDSV9DSFNXUF9DU1IJCTIJLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfREhBCQkweDAxCS8qIERldmljZSBIaWRpbmcgQXJtICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfRUlNCQkweDAyCS8qIEVOVU0jIFNpZ25hbCBNYXNrICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfUElFCQkweDA0CS8qIFBlbmRpbmcgSW5zZXJ0IG9yIEV4dHJhY3QgKi8KLSNkZWZpbmUgIFBDSV9DSFNXUF9MT08JCTB4MDgJLyogTEVEIE9uIC8gT2ZmICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfUEkJCTB4MzAJLyogUHJvZ3JhbW1pbmcgSW50ZXJmYWNlICovCi0jZGVmaW5lICBQQ0lfQ0hTV1BfRVhUCQkweDQwCS8qIEVOVU0jIHN0YXR1cyAtIGV4dHJhY3Rpb24gKi8KLSNkZWZpbmUgIFBDSV9DSFNXUF9JTlMJCTB4ODAJLyogRU5VTSMgc3RhdHVzIC0gaW5zZXJ0aW9uICovCi0KLS8qIFBDSS1YIHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIFBDSV9YX0NNRAkJMgkvKiBNb2RlcyAmIEZlYXR1cmVzICovCi0jZGVmaW5lICBQQ0lfWF9DTURfRFBFUlJfRQkweDAwMDEJLyogRGF0YSBQYXJpdHkgRXJyb3IgUmVjb3ZlcnkgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfWF9DTURfRVJPCQkweDAwMDIJLyogRW5hYmxlIFJlbGF4ZWQgT3JkZXJpbmcgKi8KLSNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfUkVBRAkweDAwMGMJLyogTWF4IE1lbW9yeSBSZWFkIEJ5dGUgQ291bnQgKi8KLSNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfU1BMSVQJMHgwMDcwCS8qIE1heCBPdXRzdGFuZGluZyBTcGxpdCBUcmFuc2FjdGlvbnMgKi8KLSNkZWZpbmUgIFBDSV9YX0NNRF9WRVJTSU9OKHgpIAkoKCh4KSA+PiAxMikgJiAzKSAvKiBWZXJzaW9uICovCi0jZGVmaW5lIFBDSV9YX1NUQVRVUwkJNAkvKiBQQ0ktWCBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU19ERVZGTgkweDAwMDAwMGZmCS8qIEEgY29weSBvZiBkZXZmbiAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX0JVUwkweDAwMDBmZjAwCS8qIEEgY29weSBvZiBidXMgbnIgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU182NEJJVAkweDAwMDEwMDAwCS8qIDY0LWJpdCBkZXZpY2UgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU18xMzNNSFoJMHgwMDAyMDAwMAkvKiAxMzMgTUh6IGNhcGFibGUgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRElTQwkweDAwMDQwMDAwCS8qIFNwbGl0IENvbXBsZXRpb24gRGlzY2FyZGVkICovCi0jZGVmaW5lICBQQ0lfWF9TVEFUVVNfVU5YX1NQTAkweDAwMDgwMDAwCS8qIFVuZXhwZWN0ZWQgU3BsaXQgQ29tcGxldGlvbiAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX0NPTVBMRVgJMHgwMDEwMDAwMAkvKiBEZXZpY2UgQ29tcGxleGl0eSAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9SRUFECTB4MDA2MDAwMDAJLyogRGVzaWduZWQgTWF4IE1lbW9yeSBSZWFkIENvdW50ICovCi0jZGVmaW5lICBQQ0lfWF9TVEFUVVNfTUFYX1NQTElUCTB4MDM4MDAwMDAJLyogRGVzaWduZWQgTWF4IE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucyAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9DVU0JMHgxYzAwMDAwMAkvKiBEZXNpZ25lZCBNYXggQ3VtdWxhdGl2ZSBSZWFkIFNpemUgKi8KLSNkZWZpbmUgIFBDSV9YX1NUQVRVU19TUExfRVJSCTB4MjAwMDAwMDAJLyogUmN2ZCBTcGxpdCBDb21wbGV0aW9uIEVycm9yIE1zZyAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTXzI2Nk1IWgkweDQwMDAwMDAwCS8qIDI2NiBNSHogY2FwYWJsZSAqLwotI2RlZmluZSAgUENJX1hfU1RBVFVTXzUzM01IWgkweDgwMDAwMDAwCS8qIDUzMyBNSHogY2FwYWJsZSAqLwotCi0vKiBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5IHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0aWVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1NfVkVSUwkweDAwMGYJLyogQ2FwYWJpbGl0eSB2ZXJzaW9uICovCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1NfVFlQRQkweDAwZjAJLyogRGV2aWNlL1BvcnQgdHlwZSAqLwotI2RlZmluZSAgUENJX0VYUF9UWVBFX0VORFBPSU5UCTB4MAkvKiBFeHByZXNzIEVuZHBvaW50ICovCi0jZGVmaW5lICBQQ0lfRVhQX1RZUEVfTEVHX0VORAkweDEJLyogTGVnYWN5IEVuZHBvaW50ICovCi0jZGVmaW5lICBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUIDB4NAkvKiBSb290IFBvcnQgKi8KLSNkZWZpbmUgIFBDSV9FWFBfVFlQRV9VUFNUUkVBTQkweDUJLyogVXBzdHJlYW0gUG9ydCAqLwotI2RlZmluZSAgUENJX0VYUF9UWVBFX0RPV05TVFJFQU0gMHg2CS8qIERvd25zdHJlYW0gUG9ydCAqLwotI2RlZmluZSAgUENJX0VYUF9UWVBFX1BDSV9CUklER0UgMHg3CS8qIFBDSS9QQ0ktWCBCcmlkZ2UgKi8KLSNkZWZpbmUgUENJX0VYUF9GTEFHU19TTE9UCTB4MDEwMAkvKiBTbG90IGltcGxlbWVudGVkICovCi0jZGVmaW5lIFBDSV9FWFBfRkxBR1NfSVJRCTB4M2UwMAkvKiBJbnRlcnJ1cHQgbWVzc2FnZSBudW1iZXIgKi8KLSNkZWZpbmUgUENJX0VYUF9ERVZDQVAJCTQJLyogRGV2aWNlIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUEFZTE9BRAkweDA3CS8qIE1heF9QYXlsb2FkX1NpemUgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BIQU5UT00JMHgxOAkvKiBQaGFudG9tIGZ1bmN0aW9ucyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfRVhUX1RBRwkweDIwCS8qIEV4dGVuZGVkIHRhZ3MgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0wwUwkweDFjMAkvKiBMMHMgQWNjZXB0YWJsZSBMYXRlbmN5ICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9MMQkweGUwMAkvKiBMMSBBY2NlcHRhYmxlIExhdGVuY3kgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0FUTl9CVVQJMHgxMDAwCS8qIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfQVROX0lORAkweDIwMDAJLyogQXR0ZW50aW9uIEluZGljYXRvciBQcmVzZW50ICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfSU5ECTB4NDAwMAkvKiBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX1ZBTAkweDNmYzAwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBWYWx1ZSAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX1NDTAkweGMwMDAwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBTY2FsZSAqLwotI2RlZmluZSBQQ0lfRVhQX0RFVkNUTAkJOAkvKiBEZXZpY2UgQ29udHJvbCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQ0VSRQkweDAwMDEJLyogQ29ycmVjdGFibGUgRXJyb3IgUmVwb3J0aW5nIEVuLiAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfTkZFUkUJMHgwMDAyCS8qIE5vbi1GYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9GRVJFCTB4MDAwNAkvKiBGYXRhbCBFcnJvciBSZXBvcnRpbmcgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9VUlJFCTB4MDAwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IFJlcG9ydGluZyBFbi4gKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIDB4MDAxMCAvKiBFbmFibGUgcmVsYXhlZCBvcmRlcmluZyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEFZTE9BRAkweDAwZTAJLyogTWF4X1BheWxvYWRfU2l6ZSAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfRVhUX1RBRwkweDAxMDAJLyogRXh0ZW5kZWQgVGFnIEZpZWxkIEVuYWJsZSAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUEhBTlRPTQkweDAyMDAJLyogUGhhbnRvbSBGdW5jdGlvbnMgRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9BVVhfUE1FCTB4MDQwMAkvKiBBdXhpbGlhcnkgUG93ZXIgUE0gRW5hYmxlICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOIDB4MDgwMCAgLyogRW5hYmxlIE5vIFNub29wICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEJMHg3MDAwCS8qIE1heF9SZWFkX1JlcXVlc3RfU2l6ZSAqLwotI2RlZmluZSBQQ0lfRVhQX0RFVlNUQQkJMTAJLyogRGV2aWNlIFN0YXR1cyAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfQ0VECTB4MDEJLyogQ29ycmVjdGFibGUgRXJyb3IgRGV0ZWN0ZWQgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX05GRUQJMHgwMgkvKiBOb24tRmF0YWwgRXJyb3IgRGV0ZWN0ZWQgKi8KLSNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0ZFRAkweDA0CS8qIEZhdGFsIEVycm9yIERldGVjdGVkICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9VUkQJMHgwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IERldGVjdGVkICovCi0jZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9BVVhQRAkweDEwCS8qIEFVWCBQb3dlciBEZXRlY3RlZCAqLwotI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVFJQTkQJMHgyMAkvKiBUcmFuc2FjdGlvbnMgUGVuZGluZyAqLwotI2RlZmluZSBQQ0lfRVhQX0xOS0NBUAkJMTIJLyogTGluayBDYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgUENJX0VYUF9MTktDVEwJCTE2CS8qIExpbmsgQ29udHJvbCAqLwotI2RlZmluZSBQQ0lfRVhQX0xOS1NUQQkJMTgJLyogTGluayBTdGF0dXMgKi8KLSNkZWZpbmUgUENJX0VYUF9TTFRDQVAJCTIwCS8qIFNsb3QgQ2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIFBDSV9FWFBfU0xUQ1RMCQkyNAkvKiBTbG90IENvbnRyb2wgKi8KLSNkZWZpbmUgUENJX0VYUF9TTFRTVEEJCTI2CS8qIFNsb3QgU3RhdHVzICovCi0jZGVmaW5lIFBDSV9FWFBfUlRDVEwJCTI4CS8qIFJvb3QgQ29udHJvbCAqLwotI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRUNFRQkweDAxCS8qIFN5c3RlbSBFcnJvciBvbiBDb3JyZWN0YWJsZSBFcnJvciAqLwotI2RlZmluZSAgUENJX0VYUF9SVENUTF9TRU5GRUUJMHgwMgkvKiBTeXN0ZW0gRXJyb3Igb24gTm9uLUZhdGFsIEVycm9yICovCi0jZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFRkVFCTB4MDQJLyogU3lzdGVtIEVycm9yIG9uIEZhdGFsIEVycm9yICovCi0jZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1BNRUlFCTB4MDgJLyogUE1FIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgIFBDSV9FWFBfUlRDVExfQ1JTU1ZFCTB4MTAJLyogQ1JTIFNvZnR3YXJlIFZpc2liaWxpdHkgRW5hYmxlICovCi0jZGVmaW5lIFBDSV9FWFBfUlRDQVAJCTMwCS8qIFJvb3QgQ2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIFBDSV9FWFBfUlRTVEEJCTMyCS8qIFJvb3QgU3RhdHVzICovCi0KLS8qIEV4dGVuZGVkIENhcGFiaWxpdGllcyAoUENJLVggMi4wIGFuZCBFeHByZXNzKSAqLwotI2RlZmluZSBQQ0lfRVhUX0NBUF9JRChoZWFkZXIpCQkoaGVhZGVyICYgMHgwMDAwZmZmZikKLSNkZWZpbmUgUENJX0VYVF9DQVBfVkVSKGhlYWRlcikJCSgoaGVhZGVyID4+IDE2KSAmIDB4ZikKLSNkZWZpbmUgUENJX0VYVF9DQVBfTkVYVChoZWFkZXIpCSgoaGVhZGVyID4+IDIwKSAmIDB4ZmZjKQotCi0jZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0VSUgkxCi0jZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1ZDCTIKLSNkZWZpbmUgUENJX0VYVF9DQVBfSURfRFNOCTMKLSNkZWZpbmUgUENJX0VYVF9DQVBfSURfUFdSCTQKLQotLyogQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nICovCi0jZGVmaW5lIFBDSV9FUlJfVU5DT1JfU1RBVFVTCTQJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX1RSQUlOCTB4MDAwMDAwMDEJLyogVHJhaW5pbmcgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX0RMUAkweDAwMDAwMDEwCS8qIERhdGEgTGluayBQcm90b2NvbCAqLwotI2RlZmluZSAgUENJX0VSUl9VTkNfUE9JU09OX1RMUAkweDAwMDAxMDAwCS8qIFBvaXNvbmVkIFRMUCAqLwotI2RlZmluZSAgUENJX0VSUl9VTkNfRkNQCTB4MDAwMDIwMDAJLyogRmxvdyBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lICBQQ0lfRVJSX1VOQ19DT01QX1RJTUUJMHgwMDAwNDAwMAkvKiBDb21wbGV0aW9uIFRpbWVvdXQgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfQUJPUlQJMHgwMDAwODAwMAkvKiBDb21wbGV0ZXIgQWJvcnQgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOWF9DT01QCTB4MDAwMTAwMDAJLyogVW5leHBlY3RlZCBDb21wbGV0aW9uICovCi0jZGVmaW5lICBQQ0lfRVJSX1VOQ19SWF9PVkVSCTB4MDAwMjAwMDAJLyogUmVjZWl2ZXIgT3ZlcmZsb3cgKi8KLSNkZWZpbmUgIFBDSV9FUlJfVU5DX01BTEZfVExQCTB4MDAwNDAwMDAJLyogTWFsZm9ybWVkIFRMUCAqLwotI2RlZmluZSAgUENJX0VSUl9VTkNfRUNSQwkweDAwMDgwMDAwCS8qIEVDUkMgRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX1VOQ19VTlNVUAkweDAwMTAwMDAwCS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgKi8KLSNkZWZpbmUgUENJX0VSUl9VTkNPUl9NQVNLCTgJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCi0JLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCi0jZGVmaW5lIFBDSV9FUlJfVU5DT1JfU0VWRVIJMTIJLyogVW5jb3JyZWN0YWJsZSBFcnJvciBTZXZlcml0eSAqLwotCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLwotI2RlZmluZSBQQ0lfRVJSX0NPUl9TVEFUVVMJMTYJLyogQ29ycmVjdGFibGUgRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NPUl9SQ1ZSCTB4MDAwMDAwMDEJLyogUmVjZWl2ZXIgRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NPUl9CQURfVExQCTB4MDAwMDAwNDAJLyogQmFkIFRMUCBTdGF0dXMgKi8KLSNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9ETExQCTB4MDAwMDAwODAJLyogQmFkIERMTFAgU3RhdHVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NPUl9SRVBfUk9MTAkweDAwMDAwMTAwCS8qIFJFUExBWV9OVU0gUm9sbG92ZXIgKi8KLSNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9USU1FUgkweDAwMDAxMDAwCS8qIFJlcGxheSBUaW1lciBUaW1lb3V0ICovCi0jZGVmaW5lIFBDSV9FUlJfQ09SX01BU0sJMjAJLyogQ29ycmVjdGFibGUgRXJyb3IgTWFzayAqLwotCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLwotI2RlZmluZSBQQ0lfRVJSX0NBUAkJMjQJLyogQWR2YW5jZWQgRXJyb3IgQ2FwYWJpbGl0aWVzICovCi0jZGVmaW5lICBQQ0lfRVJSX0NBUF9GRVAoeCkJKCh4KSAmIDMxKQkvKiBGaXJzdCBFcnJvciBQb2ludGVyICovCi0jZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0dFTkMJMHgwMDAwMDAyMAkvKiBFQ1JDIEdlbmVyYXRpb24gQ2FwYWJsZSAqLwotI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19HRU5FCTB4MDAwMDAwNDAJLyogRUNSQyBHZW5lcmF0aW9uIEVuYWJsZSAqLwotI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19DSEtDCTB4MDAwMDAwODAJLyogRUNSQyBDaGVjayBDYXBhYmxlICovCi0jZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0NIS0UJMHgwMDAwMDEwMAkvKiBFQ1JDIENoZWNrIEVuYWJsZSAqLwotI2RlZmluZSBQQ0lfRVJSX0hFQURFUl9MT0cJMjgJLyogSGVhZGVyIExvZyBSZWdpc3RlciAoMTYgYnl0ZXMpICovCi0jZGVmaW5lIFBDSV9FUlJfUk9PVF9DT01NQU5ECTQ0CS8qIFJvb3QgRXJyb3IgQ29tbWFuZCAqLwotI2RlZmluZSBQQ0lfRVJSX1JPT1RfU1RBVFVTCTQ4Ci0jZGVmaW5lIFBDSV9FUlJfUk9PVF9DT1JfU1JDCTUyCi0jZGVmaW5lIFBDSV9FUlJfUk9PVF9TUkMJNTQKLQotLyogVmlydHVhbCBDaGFubmVsICovCi0jZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzEJNAotI2RlZmluZSBQQ0lfVkNfUE9SVF9SRUcyCTgKLSNkZWZpbmUgUENJX1ZDX1BPUlRfQ1RSTAkxMgotI2RlZmluZSBQQ0lfVkNfUE9SVF9TVEFUVVMJMTQKLSNkZWZpbmUgUENJX1ZDX1JFU19DQVAJCTE2Ci0jZGVmaW5lIFBDSV9WQ19SRVNfQ1RSTAkJMjAKLSNkZWZpbmUgUENJX1ZDX1JFU19TVEFUVVMJMjYKLQotLyogUG93ZXIgQnVkZ2V0aW5nICovCi0jZGVmaW5lIFBDSV9QV1JfRFNSCQk0CS8qIERhdGEgU2VsZWN0IFJlZ2lzdGVyICovCi0jZGVmaW5lIFBDSV9QV1JfREFUQQkJOAkvKiBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lICBQQ0lfUFdSX0RBVEFfQkFTRSh4KQkoKHgpICYgMHhmZikJICAgIC8qIEJhc2UgUG93ZXIgKi8KLSNkZWZpbmUgIFBDSV9QV1JfREFUQV9TQ0FMRSh4KQkoKCh4KSA+PiA4KSAmIDMpICAgIC8qIERhdGEgU2NhbGUgKi8KLSNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVUIoeCkJKCgoeCkgPj4gMTApICYgNykgICAvKiBQTSBTdWIgU3RhdGUgKi8KLSNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVEFURSh4KSAoKCh4KSA+PiAxMykgJiAzKSAvKiBQTSBTdGF0ZSAqLwotI2RlZmluZSAgUENJX1BXUl9EQVRBX1RZUEUoeCkJKCgoeCkgPj4gMTUpICYgNykgICAvKiBUeXBlICovCi0jZGVmaW5lICBQQ0lfUFdSX0RBVEFfUkFJTCh4KQkoKCh4KSA+PiAxOCkgJiA3KSAgIC8qIFBvd2VyIFJhaWwgKi8KLSNkZWZpbmUgUENJX1BXUl9DQVAJCTEyCS8qIENhcGFiaWxpdHkgKi8KLSNkZWZpbmUgIFBDSV9QV1JfQ0FQX0JVREdFVCh4KQkoKHgpICYgMSkJLyogSW5jbHVkZWQgaW4gc3lzdGVtIGJ1ZGdldCAqLworLyogSW5jbHVkZSB0aGUgcGNpIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2lfcmVncy5oPgogCiAvKiBJbmNsdWRlIHRoZSBJRCBsaXN0ICovCi0KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAKIC8qCkBAIC00OTYsMTEgKzcwLDEyIEBACiAKIHR5cGVkZWYgaW50IF9fYml0d2lzZSBwY2lfcG93ZXJfdDsKIAotI2RlZmluZSBQQ0lfRDAJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAwKQotI2RlZmluZSBQQ0lfRDEJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotI2RlZmluZSBQQ0lfRDIJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAyKQorI2RlZmluZSBQQ0lfRDAJCSgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMCkKKyNkZWZpbmUgUENJX0QxCQkoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDEpCisjZGVmaW5lIFBDSV9EMgkJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAyKQogI2RlZmluZSBQQ0lfRDNob3QJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAzKQogI2RlZmluZSBQQ0lfRDNjb2xkCSgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNCkKKyNkZWZpbmUgUENJX1VOS05PV04JKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA1KQogI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IJKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAtMSkKIAogLyoKQEAgLTU2MiwxMSArMTM3LDYgQEAKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcm9tX2F0dHI7IC8qIGF0dHJpYnV0ZSBkZXNjcmlwdG9yIGZvciBzeXNmcyBST00gZW50cnkgKi8KIAlpbnQgcm9tX2F0dHJfZW5hYmxlZDsJCS8qIGhhcyBkaXNwbGF5IG9mIHRoZSByb20gYXR0cmlidXRlIGJlZW4gZW5hYmxlZD8gKi8KIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcmVzX2F0dHJbREVWSUNFX0NPVU5UX1JFU09VUkNFXTsgLyogc3lzZnMgZmlsZSBmb3IgcmVzb3VyY2VzICovCi0jaWZkZWYgQ09ORklHX1BDSV9OQU1FUwotI2RlZmluZSBQQ0lfTkFNRV9TSVpFCTI1NQotI2RlZmluZSBQQ0lfTkFNRV9IQUxGCV9fc3RyaW5naWZ5KDQzKQkvKiBsZXNzIHRoYW4gaGFsZiB0byBoYW5kbGUgc2xvcCAqLwotCWNoYXIJCXByZXR0eV9uYW1lW1BDSV9OQU1FX1NJWkVdOwkvKiBwcmV0dHkgbmFtZSBmb3IgdXNlcnMgdG8gc2VlICovCi0jZW5kaWYKIH07CiAKICNkZWZpbmUgcGNpX2Rldl9nKG4pIGxpc3RfZW50cnkobiwgc3RydWN0IHBjaV9kZXYsIGdsb2JhbF9saXN0KQpAQCAtNTgyLDE1ICsxNTIsMTUgQEAKICAqCTctMTAJYnJpZGdlczogYWRkcmVzcyBzcGFjZSBhc3NpZ25lZCB0byBidXNlcyBiZWhpbmQgdGhlIGJyaWRnZQogICovCiAKLSNkZWZpbmUgUENJX1JPTV9SRVNPVVJDRSA2Ci0jZGVmaW5lIFBDSV9CUklER0VfUkVTT1VSQ0VTIDcKLSNkZWZpbmUgUENJX05VTV9SRVNPVVJDRVMgMTEKKyNkZWZpbmUgUENJX1JPTV9SRVNPVVJDRQk2CisjZGVmaW5lIFBDSV9CUklER0VfUkVTT1VSQ0VTCTcKKyNkZWZpbmUgUENJX05VTV9SRVNPVVJDRVMJMTEKIAogI2lmbmRlZiBQQ0lfQlVTX05VTV9SRVNPVVJDRVMKLSNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTIDgKKyNkZWZpbmUgUENJX0JVU19OVU1fUkVTT1VSQ0VTCTgKICNlbmRpZgotICAKLSNkZWZpbmUgUENJX1JFR0lPTl9GTEFHX01BU0sgMHgwZlUJLyogVGhlc2UgYml0cyBvZiByZXNvdXJjZSBmbGFncyB0ZWxsIHVzIHRoZSBQQ0kgcmVnaW9uIGZsYWdzICovCisKKyNkZWZpbmUgUENJX1JFR0lPTl9GTEFHX01BU0sJMHgwZlUJLyogVGhlc2UgYml0cyBvZiByZXNvdXJjZSBmbGFncyB0ZWxsIHVzIHRoZSBQQ0kgcmVnaW9uIGZsYWdzICovCiAKIHN0cnVjdCBwY2lfYnVzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CQkvKiBub2RlIGluIGxpc3Qgb2YgYnVzZXMgKi8KQEAgLTY5OSw3ICsyNjksNyBAQAogICogQGRldl9jbGFzc19tYXNrOiB0aGUgY2xhc3MgbWFzayBmb3IgdGhpcyBkZXZpY2UKICAqCiAgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGhhdCBtYXRjaGVzIGEKLSAqIHNwZWNpZmljIFBDSSBjbGFzcy4gIFRoZSB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yLCBhbmQgc3ViZGV2aWNlIAorICogc3BlY2lmaWMgUENJIGNsYXNzLiAgVGhlIHZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IsIGFuZCBzdWJkZXZpY2UKICAqIGZpZWxkcyB3aWxsIGJlIHNldCB0byBQQ0lfQU5ZX0lELgogICovCiAjZGVmaW5lIFBDSV9ERVZJQ0VfQ0xBU1MoZGV2X2NsYXNzLGRldl9jbGFzc19tYXNrKSBcCkBAIC03MDcsNyArMjc3LDcgQEAKIAkudmVuZG9yID0gUENJX0FOWV9JRCwgLmRldmljZSA9IFBDSV9BTllfSUQsIFwKIAkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKIAotLyogCisvKgogICogcGNpX21vZHVsZV9pbml0IGlzIG9ic29sZXRlLCB0aGlzIHN0YXlzIGhlcmUgdGlsbCB3ZSBmaXggdXAgYWxsIHVzYWdlcyBvZiBpdAogICogaW4gdGhlIHRyZWUuCiAgKi8KQEAgLTc0NSwxMiArMzE1LDEzIEBACiAJCXBjaV9idXNfYWRkX2RldmljZXMocm9vdF9idXMpOwogCXJldHVybiByb290X2J1czsKIH0KK3N0cnVjdCBwY2lfYnVzICpwY2lfY3JlYXRlX2J1cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpOworc3RydWN0IHBjaV9idXMgKiBwY2lfYWRkX25ld19idXMoc3RydWN0IHBjaV9idXMgKnBhcmVudCwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJ1c25yKTsKIGludCBwY2lfc2Nhbl9zbG90KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbik7CiBzdHJ1Y3QgcGNpX2RldiAqIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKTsKK3ZvaWQgcGNpX2RldmljZV9hZGQoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXMgKmJ1cyk7CiB1bnNpZ25lZCBpbnQgcGNpX3NjYW5fY2hpbGRfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogdm9pZCBwY2lfYnVzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7Ci12b2lkIHBjaV9uYW1lX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWNoYXIgKnBjaV9jbGFzc19uYW1lKHUzMiBjbGFzcyk7CiB2b2lkIHBjaV9yZWFkX2JyaWRnZV9iYXNlcyhzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQpOwogc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpOwogaW50IHBjaV9nZXRfaW50ZXJydXB0X3BpbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldiAqKmJyaWRnZSk7CkBAIC03NTgsNiArMzI5LDcgQEAKIGV4dGVybiB2b2lkIHBjaV9kZXZfcHV0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9idXMoc3RydWN0IHBjaV9idXMgKmIpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfc2V0dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogLyogR2VuZXJpYyBQQ0kgZnVuY3Rpb25zIGV4cG9ydGVkIHRvIGNhcmQgZHJpdmVycyAqLwogCkBAIC04MTUsMTMgKzM4NywxNiBAQAogI2RlZmluZSBIQVZFX1BDSV9TRVRfTVdJCiBpbnQgcGNpX3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9jbGVhcl9td2koc3RydWN0IHBjaV9kZXYgKmRldik7Cit2b2lkIHBjaV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBlbmFibGUpOwogaW50IHBjaV9zZXRfZG1hX21hc2soc3RydWN0IHBjaV9kZXYgKmRldiwgdTY0IG1hc2spOwogaW50IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgbWFzayk7Cit2b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNubyk7CiBpbnQgcGNpX2Fzc2lnbl9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaSk7Cit2b2lkIHBjaV9yZXN0b3JlX2JhcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKIC8qIFJPTSBjb250cm9sIHJlbGF0ZWQgcm91dGluZXMgKi8KLXZvaWQgX19pb21lbSAqcGNpX21hcF9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCAqc2l6ZSk7Ci12b2lkIF9faW9tZW0gKnBjaV9tYXBfcm9tX2NvcHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCAqc2l6ZSk7Cit2b2lkIF9faW9tZW0gX19tdXN0X2NoZWNrICpwY2lfbWFwX3JvbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90ICpzaXplKTsKK3ZvaWQgX19pb21lbSBfX211c3RfY2hlY2sgKnBjaV9tYXBfcm9tX2NvcHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCAqc2l6ZSk7CiB2b2lkIHBjaV91bm1hcF9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqcm9tKTsKIHZvaWQgcGNpX3JlbW92ZV9yb20oc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCkBAIC04NjUsNiArNDQwLDkgQEAKIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfbWF0Y2hfaWQoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX3NjYW5fYnJpZGdlKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCBwY2lfZGV2ICogZGV2LCBpbnQgbWF4LCBpbnQgcGFzcyk7CiAKK3ZvaWQgcGNpX3dhbGtfYnVzKHN0cnVjdCBwY2lfYnVzICp0b3AsIHZvaWQgKCpjYikoc3RydWN0IHBjaV9kZXYgKiwgdm9pZCAqKSwKKwkJICB2b2lkICp1c2VyZGF0YSk7CisKIC8qIGttZW1fY2FjaGUgc3R5bGUgd3JhcHBlciBhcm91bmQgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgpAQCAtOTEyLDE4ICs0OTAsMjYgQEAKIGV4dGVybiB2b2lkIG1zaV9yZW1vdmVfcGNpX2lycV92ZWN0b3JzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisvKgorICogUENJIGRvbWFpbiBzdXBwb3J0LiAgU29tZXRpbWVzIGNhbGxlZCBQQ0kgc2VnbWVudCAoZWcgYnkgQUNQSSksCisgKiBhIFBDSSBkb21haW4gaXMgZGVmaW5lZCB0byBiZSBhIHNldCBvZiBQQ0kgYnVzc2VzIHdoaWNoIHNoYXJlCisgKiBjb25maWd1cmF0aW9uIHNwYWNlLgorICovCisjaWZuZGVmIENPTkZJR19QQ0lfRE9NQUlOUworc3RhdGljIGlubGluZSBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCi0vKiBJbmNsdWRlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucyAqLwotCi0jaW5jbHVkZSA8YXNtL3BjaS5oPgorI2Vsc2UgLyogQ09ORklHX1BDSSBpcyBub3QgZW5hYmxlZCAqLwogCiAvKgogICogIElmIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBQQ0ksIGNsZWFybHkgdGhlc2UgcmV0dXJuIGVycm9ycy4gIERlZmluZQogICogIHRoZXNlIGFzIHNpbXBsZSBpbmxpbmUgZnVuY3Rpb25zIHRvIGF2b2lkIGhhaXIgaW4gZHJpdmVycy4KICAqLwogCi0jaWZuZGVmIENPTkZJR19QQ0kKICNkZWZpbmUgX1BDSV9OT1AobyxzLHQpIFwKIAlzdGF0aWMgaW5saW5lIGludCBwY2lfIyNvIyNfY29uZmlnXyMjcyAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB0IHZhbCkgXAogCQl7IHJldHVybiBQQ0lCSU9TX0ZVTkNfTk9UX1NVUFBPUlRFRDsgfQpAQCAtOTc0LDIxICs1NjAsMTEgQEAKIAogI2RlZmluZSBwY2lfZG1hX2J1cnN0X2FkdmljZShwZGV2LCBzdHJhdCwgc3RyYXRlZ3lfcGFyYW1ldGVyKSBkbyB7IH0gd2hpbGUgKDApCiAKLSNlbHNlCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCi0vKgotICogUENJIGRvbWFpbiBzdXBwb3J0LiAgU29tZXRpbWVzIGNhbGxlZCBQQ0kgc2VnbWVudCAoZWcgYnkgQUNQSSksCi0gKiBhIFBDSSBkb21haW4gaXMgZGVmaW5lZCB0byBiZSBhIHNldCBvZiBQQ0kgYnVzc2VzIHdoaWNoIHNoYXJlCi0gKiBjb25maWd1cmF0aW9uIHNwYWNlLgotICovCi0jaWZuZGVmIENPTkZJR19QQ0lfRE9NQUlOUwotc3RhdGljIGlubGluZSBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmIC8qICFDT05GSUdfUENJICovCisvKiBJbmNsdWRlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucyAqLworCisjaW5jbHVkZSA8YXNtL3BjaS5oPgogCiAvKiB0aGVzZSBoZWxwZXJzIHByb3ZpZGUgZnV0dXJlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICogZm9yIGFjY2Vzc2luZyBwb3B1bGFyIFBDSSBCQVIgaW5mbyAqLwpAQCAtMTAyNSwxMyArNjAxLDYgQEAKIAlyZXR1cm4gcGRldi0+ZGV2LmJ1c19pZDsKIH0KIAotLyogU29tZSBhcmNocyB3YW50IHRvIHNlZSB0aGUgcHJldHR5IHBjaSBuYW1lLCBzbyB1c2UgdGhpcyBtYWNybyAqLwotI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKLSNkZWZpbmUgcGNpX3ByZXR0eV9uYW1lKGRldikgKChkZXYpLT5wcmV0dHlfbmFtZSkKLSNlbHNlCi0jZGVmaW5lIHBjaV9wcmV0dHlfbmFtZShkZXYpICIiCi0jZW5kaWYKLQogCiAvKiBTb21lIGFyY2hzIGRvbid0IHdhbnQgdG8gZXhwb3NlIHN0cnVjdCByZXNvdXJjZSB0byB1c2VybGFuZCBhcy1pcwogICogaW4gc3lzZnMgYW5kIC9wcm9jCkBAIC0xMDY3LDcgKzYzNiw3IEBACiAKIC8qIEFub255bW91cyB2YXJpYWJsZXMgd291bGQgYmUgbmljZS4uLiAqLwogI2RlZmluZSBERUNMQVJFX1BDSV9GSVhVUF9TRUNUSU9OKHNlY3Rpb24sIG5hbWUsIHZlbmRvciwgZGV2aWNlLCBob29rKQlcCi0Jc3RhdGljIHN0cnVjdCBwY2lfZml4dXAgX19wY2lfZml4dXBfIyNuYW1lIF9fYXR0cmlidXRlX3VzZWRfXwlcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZml4dXAgX19wY2lfZml4dXBfIyNuYW1lIF9fYXR0cmlidXRlX3VzZWRfXyBcCiAJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oI3NlY3Rpb24pKSkgPSB7IHZlbmRvciwgZGV2aWNlLCBob29rIH07CiAjZGVmaW5lIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKHZlbmRvciwgZGV2aWNlLCBob29rKQkJCVwKIAlERUNMQVJFX1BDSV9GSVhVUF9TRUNUSU9OKC5wY2lfZml4dXBfZWFybHksCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCA5NWM5NDFmLi5lZTBhYjdhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE2MTIsNiArMTYxMiw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1Q0YJMHgwMDMwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UWDQ5MjcJMHgwMTgwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzg2QzAwMV9NSVNDCTB4MDEwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfU1BJREVSX05FVCAweDAxYjMKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JJQ09ICQkweDExODAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDY1CTB4MDQ2NQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTA4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKglwY2lfcmVncy5oCisgKgorICoJUENJIHN0YW5kYXJkIGRlZmluZXMKKyAqCUNvcHlyaWdodCAxOTk0LCBEcmV3IEVja2hhcmR0CisgKglDb3B5cmlnaHQgMTk5Ny0tMTk5OSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqCisgKglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBtYW51YWxzIChsb29rIGF0CisgKglodHRwOi8vd3d3LnBjaXNpZy5jb20vIGZvciBob3cgdG8gZ2V0IHRoZW0pOgorICoKKyAqCVBDSSBCSU9TIFNwZWNpZmljYXRpb24KKyAqCVBDSSBMb2NhbCBCdXMgU3BlY2lmaWNhdGlvbgorICoJUENJIHRvIFBDSSBCcmlkZ2UgU3BlY2lmaWNhdGlvbgorICoJUENJIFN5c3RlbSBEZXNpZ24gR3VpZGUKKyAqLworCisjaWZuZGVmIExJTlVYX1BDSV9SRUdTX0gKKyNkZWZpbmUgTElOVVhfUENJX1JFR1NfSAorCisvKgorICogVW5kZXIgUENJLCBlYWNoIGRldmljZSBoYXMgMjU2IGJ5dGVzIG9mIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyBzcGFjZSwKKyAqIG9mIHdoaWNoIHRoZSBmaXJzdCA2NCBieXRlcyBhcmUgc3RhbmRhcmRpemVkIGFzIGZvbGxvd3M6CisgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRAkJMHgwMAkvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSUQJCTB4MDIJLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfQ09NTUFORAkJMHgwNAkvKiAxNiBiaXRzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTwkJMHgxCS8qIEVuYWJsZSByZXNwb25zZSBpbiBJL08gc3BhY2UgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX01FTU9SWQkweDIJLyogRW5hYmxlIHJlc3BvbnNlIGluIE1lbW9yeSBzcGFjZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfTUFTVEVSCTB4NAkvKiBFbmFibGUgYnVzIG1hc3RlcmluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfU1BFQ0lBTAkweDgJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHNwZWNpYWwgY3ljbGVzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCTB4MTAJLyogVXNlIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfVkdBX1BBTEVUVEUgMHgyMAkvKiBFbmFibGUgcGFsZXR0ZSBzbm9vcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfUEFSSVRZCTB4NDAJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfV0FJVCAJMHg4MAkvKiBFbmFibGUgYWRkcmVzcy9kYXRhIHN0ZXBwaW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9TRVJSCTB4MTAwCS8qIEVuYWJsZSBTRVJSICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9GQVNUX0JBQ0sJMHgyMDAJLyogRW5hYmxlIGJhY2stdG8tYmFjayB3cml0ZXMgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSAweDQwMCAvKiBJTlR4IEVtdWxhdGlvbiBEaXNhYmxlICovCisKKyNkZWZpbmUgUENJX1NUQVRVUwkJMHgwNgkvKiAxNiBiaXRzICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0NBUF9MSVNUCTB4MTAJLyogU3VwcG9ydCBDYXBhYmlsaXR5IExpc3QgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfNjZNSFoJMHgyMAkvKiBTdXBwb3J0IDY2IE1oeiBQQ0kgMi4xIGJ1cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19VREYJCTB4NDAJLyogU3VwcG9ydCBVc2VyIERlZmluYWJsZSBGZWF0dXJlcyBbb2Jzb2xldGVdICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0ZBU1RfQkFDSwkweDgwCS8qIEFjY2VwdCBmYXN0LWJhY2sgdG8gYmFjayAqLworI2RlZmluZSAgUENJX1NUQVRVU19QQVJJVFkJMHgxMDAJLyogRGV0ZWN0ZWQgcGFyaXR5IGVycm9yICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9NQVNLCTB4NjAwCS8qIERFVlNFTCB0aW1pbmcgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX0ZBU1QJCTB4MDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9NRURJVU0JMHgyMDAKKyNkZWZpbmUgIFBDSV9TVEFUVVNfREVWU0VMX1NMT1cJCTB4NDAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQJMHg4MDAgLyogU2V0IG9uIHRhcmdldCBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUCTB4MTAwMCAvKiBNYXN0ZXIgYWNrIG9mICIgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVAkweDIwMDAgLyogU2V0IG9uIG1hc3RlciBhYm9ydCAqLworI2RlZmluZSAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SCTB4NDAwMCAvKiBTZXQgd2hlbiB3ZSBkcml2ZSBTRVJSICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWQkweDgwMDAgLyogU2V0IG9uIHBhcml0eSBlcnJvciAqLworCisjZGVmaW5lIFBDSV9DTEFTU19SRVZJU0lPTgkweDA4CS8qIEhpZ2ggMjQgYml0cyBhcmUgY2xhc3MsIGxvdyA4IHJldmlzaW9uICovCisjZGVmaW5lIFBDSV9SRVZJU0lPTl9JRAkJMHgwOAkvKiBSZXZpc2lvbiBJRCAqLworI2RlZmluZSBQQ0lfQ0xBU1NfUFJPRwkJMHgwOQkvKiBSZWcuIExldmVsIFByb2dyYW1taW5nIEludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfQ0xBU1NfREVWSUNFCTB4MGEJLyogRGV2aWNlIGNsYXNzICovCisKKyNkZWZpbmUgUENJX0NBQ0hFX0xJTkVfU0laRQkweDBjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTEFURU5DWV9USU1FUgkweDBkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUJCTB4MGUJLyogOCBiaXRzICovCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfTk9STUFMCQkwCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQlJJREdFCQkxCisjZGVmaW5lICBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUwkyCisKKyNkZWZpbmUgUENJX0JJU1QJCTB4MGYJLyogOCBiaXRzICovCisjZGVmaW5lICBQQ0lfQklTVF9DT0RFX01BU0sJMHgwZgkvKiBSZXR1cm4gcmVzdWx0ICovCisjZGVmaW5lICBQQ0lfQklTVF9TVEFSVAkJMHg0MAkvKiAxIHRvIHN0YXJ0IEJJU1QsIDIgc2VjcyBvciBsZXNzICovCisjZGVmaW5lICBQQ0lfQklTVF9DQVBBQkxFCTB4ODAJLyogMSBpZiBCSVNUIGNhcGFibGUgKi8KKworLyoKKyAqIEJhc2UgYWRkcmVzc2VzIHNwZWNpZnkgbG9jYXRpb25zIGluIG1lbW9yeSBvciBJL08gc3BhY2UuCisgKiBEZWNvZGVkIHNpemUgY2FuIGJlIGRldGVybWluZWQgYnkgd3JpdGluZyBhIHZhbHVlIG9mCisgKiAweGZmZmZmZmZmIHRvIHRoZSByZWdpc3RlciwgYW5kIHJlYWRpbmcgaXQgYmFjay4gIE9ubHkKKyAqIDEgYml0cyBhcmUgZGVjb2RlZC4KKyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzAJMHgxMAkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMQkweDE0CS8qIDMyIGJpdHMgW2h0eXBlIDAsMSBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzIJMHgxOAkvKiAzMiBiaXRzIFtodHlwZSAwIG9ubHldICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMwkweDFjCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU180CTB4MjAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzUJMHgyNAkvKiAzMiBiaXRzICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFCQkweDAxCS8qIDAgPSBtZW1vcnksIDEgPSBJL08gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8JMHgwMQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkJMHgwMAorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLCTB4MDYKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzIJMHgwMAkvKiAzMiBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8xTQkweDAyCS8qIEJlbG93IDFNIFtvYnNvbGV0ZV0gKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQJMHgwNAkvKiA2NCBiaXQgYWRkcmVzcyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gJMHgwOAkvKiBwcmVmZXRjaGFibGU/ICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLCSh+MHgwZlVMKQorI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19JT19NQVNLCSh+MHgwM1VMKQorLyogYml0IDEgaXMgcmVzZXJ2ZWQgaWYgYWRkcmVzc19zcGFjZSA9IDEgKi8KKworLyogSGVhZGVyIHR5cGUgMCAobm9ybWFsIGRldmljZXMpICovCisjZGVmaW5lIFBDSV9DQVJEQlVTX0NJUwkJMHgyOAorI2RlZmluZSBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRAkweDJjCisjZGVmaW5lIFBDSV9TVUJTWVNURU1fSUQJMHgyZQorI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MJCTB4MzAJLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCisjZGVmaW5lICBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFCTB4MDEKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTX01BU0sJKH4weDdmZlVMKQorCisjZGVmaW5lIFBDSV9DQVBBQklMSVRZX0xJU1QJMHgzNAkvKiBPZmZzZXQgb2YgZmlyc3QgY2FwYWJpbGl0eSBsaXN0IGVudHJ5ICovCisKKy8qIDB4MzUtMHgzYiBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0lOVEVSUlVQVF9MSU5FCTB4M2MJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOCTB4M2QJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9NSU5fR05UCQkweDNlCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTUFYX0xBVAkJMHgzZgkvKiA4IGJpdHMgKi8KKworLyogSGVhZGVyIHR5cGUgMSAoUENJLXRvLVBDSSBicmlkZ2VzKSAqLworI2RlZmluZSBQQ0lfUFJJTUFSWV9CVVMJCTB4MTgJLyogUHJpbWFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TRUNPTkRBUllfQlVTCTB4MTkJLyogU2Vjb25kYXJ5IGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX1NVQk9SRElOQVRFX0JVUwkweDFhCS8qIEhpZ2hlc3QgYnVzIG51bWJlciBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIJMHgxYgkvKiBMYXRlbmN5IHRpbWVyIGZvciBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lIFBDSV9JT19CQVNFCQkweDFjCS8qIEkvTyByYW5nZSBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfSU9fTElNSVQJCTB4MWQKKyNkZWZpbmUgIFBDSV9JT19SQU5HRV9UWVBFX01BU0sJMHgwZlVMCS8qIEkvTyBicmlkZ2luZyB0eXBlICovCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8xNgkweDAwCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV8zMgkweDAxCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1NFQ19TVEFUVVMJCTB4MWUJLyogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3Rlciwgb25seSBiaXQgMTQgdXNlZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0JBU0UJCTB4MjAJLyogTWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfTUVNT1JZX0xJTUlUCTB4MjIKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAorI2RlZmluZSAgUENJX01FTU9SWV9SQU5HRV9NQVNLCSh+MHgwZlVMKQorI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfQkFTRQkweDI0CS8qIFByZWZldGNoYWJsZSBtZW1vcnkgcmFuZ2UgYmVoaW5kICovCisjZGVmaW5lIFBDSV9QUkVGX01FTU9SWV9MSU1JVAkweDI2CisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0sgMHgwZlVMCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzMyCTB4MDAKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQJMHgwMQorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1BSRUZfQkFTRV9VUFBFUjMyCTB4MjgJLyogVXBwZXIgaGFsZiBvZiBwcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlICovCisjZGVmaW5lIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIJMHgyYworI2RlZmluZSBQQ0lfSU9fQkFTRV9VUFBFUjE2CTB4MzAJLyogVXBwZXIgaGFsZiBvZiBJL08gYWRkcmVzc2VzICovCisjZGVmaW5lIFBDSV9JT19MSU1JVF9VUFBFUjE2CTB4MzIKKy8qIDB4MzQgc2FtZSBhcyBmb3IgaHR5cGUgMCAqLworLyogMHgzNS0weDNiIGlzIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ST01fQUREUkVTUzEJMHgzOAkvKiBTYW1lIGFzIFBDSV9ST01fQUREUkVTUywgYnV0IGZvciBodHlwZSAxICovCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIEVuYWJsZSBwYXJpdHkgZGV0ZWN0aW9uIG9uIHNlY29uZGFyeSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX1NFUlIJMHgwMgkvKiBUaGUgc2FtZSBmb3IgU0VSUiBmb3J3YXJkaW5nICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9OT19JU0EJMHgwNAkvKiBEaXNhYmxlIGJyaWRnaW5nIG9mIElTQSBwb3J0cyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfVkdBCTB4MDgJLyogRm9yd2FyZCBWR0EgYWRkcmVzc2VzICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQJMHgyMCAgLyogUmVwb3J0IG1hc3RlciBhYm9ydHMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0JVU19SRVNFVAkweDQwCS8qIFNlY29uZGFyeSBidXMgcmVzZXQgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX0ZBU1RfQkFDSwkweDgwCS8qIEZhc3QgQmFjazJCYWNrIGVuYWJsZWQgb24gc2Vjb25kYXJ5IGludGVyZmFjZSAqLworCisvKiBIZWFkZXIgdHlwZSAyIChDYXJkQnVzIGJyaWRnZXMpICovCisjZGVmaW5lIFBDSV9DQl9DQVBBQklMSVRZX0xJU1QJMHgxNAorLyogMHgxNSByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfQ0JfU0VDX1NUQVRVUwkweDE2CS8qIFNlY29uZGFyeSBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX0NCX1BSSU1BUllfQlVTCTB4MTgJLyogUENJIGJ1cyBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0NCX0NBUkRfQlVTCQkweDE5CS8qIENhcmRCdXMgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfQ0JfU1VCT1JESU5BVEVfQlVTCTB4MWEJLyogU3Vib3JkaW5hdGUgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfQ0JfTEFURU5DWV9USU1FUgkweDFiCS8qIENhcmRCdXMgbGF0ZW5jeSB0aW1lciAqLworI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0JBU0VfMAkweDFjCisjZGVmaW5lIFBDSV9DQl9NRU1PUllfTElNSVRfMAkweDIwCisjZGVmaW5lIFBDSV9DQl9NRU1PUllfQkFTRV8xCTB4MjQKKyNkZWZpbmUgUENJX0NCX01FTU9SWV9MSU1JVF8xCTB4MjgKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMAkweDJjCisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzBfSEkJMHgyZQorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMAkweDMwCisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8wX0hJCTB4MzIKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMQkweDM0CisjZGVmaW5lIFBDSV9DQl9JT19CQVNFXzFfSEkJMHgzNgorI2RlZmluZSBQQ0lfQ0JfSU9fTElNSVRfMQkweDM4CisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8xX0hJCTB4M2EKKyNkZWZpbmUgIFBDSV9DQl9JT19SQU5HRV9NQVNLCSh+MHgwM1VMKQorLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCisjZGVmaW5lIFBDSV9DQl9CUklER0VfQ09OVFJPTAkweDNlCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBTaW1pbGFyIHRvIHN0YW5kYXJkIGJyaWRnZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9TRVJSCQkweDAyCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9JU0EJCTB4MDQKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1ZHQQkJMHgwOAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUCTB4MjAKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX0NCX1JFU0VUCTB4NDAJLyogQ2FyZEJ1cyByZXNldCAqLworI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfMTZCSVRfSU5UCTB4ODAJLyogRW5hYmxlIGludGVycnVwdCBmb3IgMTYtYml0IGNhcmRzICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QUkVGRVRDSF9NRU0wIDB4MTAwCS8qIFByZWZldGNoIGVuYWJsZSBmb3IgYm90aCBtZW1vcnkgcmVnaW9ucyAqLworI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUFJFRkVUQ0hfTUVNMSAweDIwMAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfUE9TVF9XUklURVMJMHg0MDAKKyNkZWZpbmUgUENJX0NCX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHg0MAorI2RlZmluZSBQQ0lfQ0JfU1VCU1lTVEVNX0lECQkweDQyCisjZGVmaW5lIFBDSV9DQl9MRUdBQ1lfTU9ERV9CQVNFCQkweDQ0CS8qIDE2LWJpdCBQQyBDYXJkIGxlZ2FjeSBtb2RlIGJhc2UgYWRkcmVzcyAoRXhDYSkgKi8KKy8qIDB4NDgtMHg3ZiByZXNlcnZlZCAqLworCisvKiBDYXBhYmlsaXR5IGxpc3RzICovCisKKyNkZWZpbmUgUENJX0NBUF9MSVNUX0lECQkwCS8qIENhcGFiaWxpdHkgSUQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfUE0JCTB4MDEJLyogUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9BR1AJCTB4MDIJLyogQWNjZWxlcmF0ZWQgR3JhcGhpY3MgUG9ydCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9WUEQJCTB4MDMJLyogVml0YWwgUHJvZHVjdCBEYXRhICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1NMT1RJRAkweDA0CS8qIFNsb3QgSWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfTVNJCQkweDA1CS8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQ0hTV1AJMHgwNgkvKiBDb21wYWN0UENJIEhvdFN3YXAgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfUENJWAkweDA3CS8qIFBDSS1YICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1NIUEMgCTB4MEMJLyogUENJIFN0YW5kYXJkIEhvdC1QbHVnIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfRVhQIAkweDEwCS8qIFBDSSBFeHByZXNzICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSVgJMHgxMQkvKiBNU0ktWCAqLworI2RlZmluZSBQQ0lfQ0FQX0xJU1RfTkVYVAkxCS8qIE5leHQgY2FwYWJpbGl0eSBpbiB0aGUgbGlzdCAqLworI2RlZmluZSBQQ0lfQ0FQX0ZMQUdTCQkyCS8qIENhcGFiaWxpdHkgZGVmaW5lZCBmbGFncyAoMTYgYml0cykgKi8KKyNkZWZpbmUgUENJX0NBUF9TSVpFT0YJCTQKKworLyogUG93ZXIgTWFuYWdlbWVudCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfUE1fUE1DCQkyCS8qIFBNIENhcGFiaWxpdGllcyBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX1BNX0NBUF9WRVJfTUFTSwkweDAwMDcJLyogVmVyc2lvbiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfQ0xPQ0sJMHgwMDA4CS8qIFBNRSBjbG9jayByZXF1aXJlZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9SRVNFUlZFRCAgICAweDAwMTAgIC8qIFJlc2VydmVkIGZpZWxkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0RTSQkJMHgwMDIwCS8qIERldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9BVVhfUE9XRVIJMHgwMUMwCS8qIEF1eGlsbGlhcnkgcG93ZXIgc3VwcG9ydCBtYXNrICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0QxCQkweDAyMDAJLyogRDEgcG93ZXIgc3RhdGUgc3VwcG9ydCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9EMgkJMHgwNDAwCS8qIEQyIHBvd2VyIHN0YXRlIHN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FCQkweDA4MDAJLyogUE1FIHBpbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX01BU0sJMHhGODAwCS8qIFBNRSBNYXNrIG9mIGFsbCBzdXBwb3J0ZWQgc3RhdGVzICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMAkweDA4MDAJLyogUE1FIyBmcm9tIEQwICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMQkweDEwMDAJLyogUE1FIyBmcm9tIEQxICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMgkweDIwMDAJLyogUE1FIyBmcm9tIEQyICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EMwkweDQwMDAJLyogUE1FIyBmcm9tIEQzIChob3QpICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9EM2NvbGQJMHg4MDAwCS8qIFBNRSMgZnJvbSBEMyAoY29sZCkgKi8KKyNkZWZpbmUgUENJX1BNX0NUUkwJCTQJLyogUE0gY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLCTB4MDAwMwkvKiBDdXJyZW50IHBvd2VyIHN0YXRlIChEMCB0byBEMykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX05PX1NPRlRfUkVTRVQJMHgwMDA0CS8qIE5vIHJlc2V0IGZvciBEM2hvdC0+RDAgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1BNRV9FTkFCTEUJMHgwMTAwCS8qIFBNRSBwaW4gZW5hYmxlICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9EQVRBX1NFTF9NQVNLCTB4MWUwMAkvKiBEYXRhIHNlbGVjdCAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9EQVRBX1NDQUxFX01BU0sJMHg2MDAwCS8qIERhdGEgc2NhbGUgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfUE1FX1NUQVRVUwkweDgwMDAJLyogUE1FIHBpbiBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX1BNX1BQQl9FWFRFTlNJT05TCTYJLyogUFBCIHN1cHBvcnQgZXh0ZW5zaW9ucyAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fUFBCX0IyX0IzCTB4NDAJLyogU3RvcCBjbG9jayB3aGVuIGluIEQzaG90ICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9CUENDX0VOQUJMRQkweDgwCS8qIEJ1cyBwb3dlci9jbG9jayBjb250cm9sIGVuYWJsZSAoPz8pICovCisjZGVmaW5lIFBDSV9QTV9EQVRBX1JFR0lTVEVSCTcJLyogKD8/KSAqLworI2RlZmluZSBQQ0lfUE1fU0laRU9GCQk4CisKKy8qIEFHUCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfQUdQX1ZFUlNJT04JCTIJLyogQkNEIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFBDSV9BR1BfUkZVCQkzCS8qIFJlc3Qgb2YgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBQQ0lfQUdQX1NUQVRVUwkJNAkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JRX01BU0sJMHhmZjAwMDAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyAtIDEgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1NCQQkweDAyMDAJLyogU2lkZWJhbmQgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTXzY0QklUCTB4MDAyMAkvKiA2NC1iaXQgYWRkcmVzc2luZyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX0ZXCTB4MDAxMAkvKiBGVyB0cmFuc2ZlcnMgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFNAkweDAwMDQJLyogNHggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEUyCTB4MDAwMgkvKiAyeCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTEJMHgwMDAxCS8qIDF4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lIFBDSV9BR1BfQ09NTUFORAkJOAkvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfUlFfTUFTSyAweGZmMDAwMDAwICAvKiBNYXN0ZXI6IE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfU0JBCTB4MDIwMAkvKiBTaWRlYmFuZCBhZGRyZXNzaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9BR1AJMHgwMTAwCS8qIEFsbG93IHByb2Nlc3Npbmcgb2YgQUdQIHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EXzY0QklUCTB4MDAyMCAJLyogQWxsb3cgcHJvY2Vzc2luZyBvZiA2NC1iaXQgYWRkcmVzc2VzICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfRlcJMHgwMDEwIAkvKiBGb3JjZSBGVyB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SQVRFNAkweDAwMDQJLyogVXNlIDR4IHJhdGUgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SQVRFMgkweDAwMDIJLyogVXNlIDJ4IHJhdGUgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SQVRFMQkweDAwMDEJLyogVXNlIDF4IHJhdGUgKi8KKyNkZWZpbmUgUENJX0FHUF9TSVpFT0YJCTEyCisKKy8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLworCisjZGVmaW5lIFBDSV9WUERfQUREUgkJMgkvKiBBZGRyZXNzIHRvIGFjY2VzcyAoMTUgYml0cyEpICovCisjZGVmaW5lICBQQ0lfVlBEX0FERFJfTUFTSwkweDdmZmYJLyogQWRkcmVzcyBtYXNrICovCisjZGVmaW5lICBQQ0lfVlBEX0FERFJfRgkJMHg4MDAwCS8qIFdyaXRlIDAsIDEgaW5kaWNhdGVzIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgUENJX1ZQRF9EQVRBCQk0CS8qIDMyLWJpdHMgb2YgZGF0YSByZXR1cm5lZCBoZXJlICovCisKKy8qIFNsb3QgSWRlbnRpZmljYXRpb24gKi8KKworI2RlZmluZSBQQ0lfU0lEX0VTUgkJMgkvKiBFeHBhbnNpb24gU2xvdCBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX1NJRF9FU1JfTlNMT1RTCTB4MWYJLyogTnVtYmVyIG9mIGV4cGFuc2lvbiBzbG90cyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgIFBDSV9TSURfRVNSX0ZJQwkweDIwCS8qIEZpcnN0IEluIENoYXNzaXMgRmxhZyAqLworI2RlZmluZSBQQ0lfU0lEX0NIQVNTSVNfTlIJMwkvKiBDaGFzc2lzIE51bWJlciAqLworCisvKiBNZXNzYWdlIFNpZ25hbGxlZCBJbnRlcnJ1cHRzIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9NU0lfRkxBR1MJCTIJLyogVmFyaW91cyBmbGFncyAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU182NEJJVAkweDgwCS8qIDY0LWJpdCBhZGRyZXNzZXMgYWxsb3dlZCAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19RU0laRQkweDcwCS8qIE1lc3NhZ2UgcXVldWUgc2l6ZSBjb25maWd1cmVkICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX1FNQVNLCTB4MGUJLyogTWF4aW11bSBxdWV1ZSBzaXplIGF2YWlsYWJsZSAqLworI2RlZmluZSAgUENJX01TSV9GTEFHU19FTkFCTEUJMHgwMQkvKiBNU0kgZmVhdHVyZSBlbmFibGVkICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX01BU0tCSVQJMHgxMDAJLyogNjQtYml0IG1hc2sgYml0cyBhbGxvd2VkICovCisjZGVmaW5lIFBDSV9NU0lfUkZVCQkzCS8qIFJlc3Qgb2YgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBQQ0lfTVNJX0FERFJFU1NfTE8JNAkvKiBMb3dlciAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9NU0lfQUREUkVTU19ISQk4CS8qIFVwcGVyIDMyIGJpdHMgKGlmIFBDSV9NU0lfRkxBR1NfNjRCSVQgc2V0KSAqLworI2RlZmluZSBQQ0lfTVNJX0RBVEFfMzIJCTgJLyogMTYgYml0cyBvZiBkYXRhIGZvciAzMi1iaXQgZGV2aWNlcyAqLworI2RlZmluZSBQQ0lfTVNJX0RBVEFfNjQJCTEyCS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgNjQtYml0IGRldmljZXMgKi8KKyNkZWZpbmUgUENJX01TSV9NQVNLX0JJVAkxNgkvKiBNYXNrIGJpdHMgcmVnaXN0ZXIgKi8KKworLyogQ29tcGFjdFBDSSBIb3Rzd2FwIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUENJX0NIU1dQX0NTUgkJMgkvKiBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9ESEEJCTB4MDEJLyogRGV2aWNlIEhpZGluZyBBcm0gKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9FSU0JCTB4MDIJLyogRU5VTSMgU2lnbmFsIE1hc2sgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9QSUUJCTB4MDQJLyogUGVuZGluZyBJbnNlcnQgb3IgRXh0cmFjdCAqLworI2RlZmluZSAgUENJX0NIU1dQX0xPTwkJMHgwOAkvKiBMRUQgT24gLyBPZmYgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9QSQkJMHgzMAkvKiBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9FWFQJCTB4NDAJLyogRU5VTSMgc3RhdHVzIC0gZXh0cmFjdGlvbiAqLworI2RlZmluZSAgUENJX0NIU1dQX0lOUwkJMHg4MAkvKiBFTlVNIyBzdGF0dXMgLSBpbnNlcnRpb24gKi8KKworLyogUENJLVggcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX1hfQ01ECQkyCS8qIE1vZGVzICYgRmVhdHVyZXMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9EUEVSUl9FCTB4MDAwMQkvKiBEYXRhIFBhcml0eSBFcnJvciBSZWNvdmVyeSBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9FUk8JCTB4MDAwMgkvKiBFbmFibGUgUmVsYXhlZCBPcmRlcmluZyAqLworI2RlZmluZSAgUENJX1hfQ01EX01BWF9SRUFECTB4MDAwYwkvKiBNYXggTWVtb3J5IFJlYWQgQnl0ZSBDb3VudCAqLworI2RlZmluZSAgUENJX1hfQ01EX01BWF9TUExJVAkweDAwNzAJLyogTWF4IE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgUENJX1hfQ01EX1ZFUlNJT04oeCkgCSgoKHgpID4+IDEyKSAmIDMpIC8qIFZlcnNpb24gKi8KKyNkZWZpbmUgUENJX1hfU1RBVFVTCQk0CS8qIFBDSS1YIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX0RFVkZOCTB4MDAwMDAwZmYJLyogQSBjb3B5IG9mIGRldmZuICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfQlVTCTB4MDAwMGZmMDAJLyogQSBjb3B5IG9mIGJ1cyBuciAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTXzY0QklUCTB4MDAwMTAwMDAJLyogNjQtYml0IGRldmljZSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTXzEzM01IWgkweDAwMDIwMDAwCS8qIDEzMyBNSHogY2FwYWJsZSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX1NQTF9ESVNDCTB4MDAwNDAwMDAJLyogU3BsaXQgQ29tcGxldGlvbiBEaXNjYXJkZWQgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19VTlhfU1BMCTB4MDAwODAwMDAJLyogVW5leHBlY3RlZCBTcGxpdCBDb21wbGV0aW9uICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfQ09NUExFWAkweDAwMTAwMDAwCS8qIERldmljZSBDb21wbGV4aXR5ICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfTUFYX1JFQUQJMHgwMDYwMDAwMAkvKiBEZXNpZ25lZCBNYXggTWVtb3J5IFJlYWQgQ291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19NQVhfU1BMSVQJMHgwMzgwMDAwMAkvKiBEZXNpZ25lZCBNYXggT3V0c3RhbmRpbmcgU3BsaXQgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfTUFYX0NVTQkweDFjMDAwMDAwCS8qIERlc2lnbmVkIE1heCBDdW11bGF0aXZlIFJlYWQgU2l6ZSAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX1NQTF9FUlIJMHgyMDAwMDAwMAkvKiBSY3ZkIFNwbGl0IENvbXBsZXRpb24gRXJyb3IgTXNnICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfMjY2TUhaCTB4NDAwMDAwMDAJLyogMjY2IE1IeiBjYXBhYmxlICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfNTMzTUhaCTB4ODAwMDAwMDAJLyogNTMzIE1IeiBjYXBhYmxlICovCisKKy8qIFBDSSBFeHByZXNzIGNhcGFiaWxpdHkgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX0VYUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXRpZXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0VYUF9GTEFHU19WRVJTCTB4MDAwZgkvKiBDYXBhYmlsaXR5IHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0VYUF9GTEFHU19UWVBFCTB4MDBmMAkvKiBEZXZpY2UvUG9ydCB0eXBlICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfRU5EUE9JTlQJMHgwCS8qIEV4cHJlc3MgRW5kcG9pbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9MRUdfRU5ECTB4MQkvKiBMZWdhY3kgRW5kcG9pbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgMHg0CS8qIFJvb3QgUG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX1VQU1RSRUFNCTB4NQkvKiBVcHN0cmVhbSBQb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSAweDYJLyogRG93bnN0cmVhbSBQb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfUENJX0JSSURHRSAweDcJLyogUENJL1BDSS1YIEJyaWRnZSAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX1NMT1QJMHgwMTAwCS8qIFNsb3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUENJX0VYUF9GTEFHU19JUlEJMHgzZTAwCS8qIEludGVycnVwdCBtZXNzYWdlIG51bWJlciAqLworI2RlZmluZSBQQ0lfRVhQX0RFVkNBUAkJNAkvKiBEZXZpY2UgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QQVlMT0FECTB4MDcJLyogTWF4X1BheWxvYWRfU2l6ZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUEhBTlRPTQkweDE4CS8qIFBoYW50b20gZnVuY3Rpb25zICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9FWFRfVEFHCTB4MjAJLyogRXh0ZW5kZWQgdGFncyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfTDBTCTB4MWMwCS8qIEwwcyBBY2NlcHRhYmxlIExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0wxCTB4ZTAwCS8qIEwxIEFjY2VwdGFibGUgTGF0ZW5jeSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfQVROX0JVVAkweDEwMDAJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9BVE5fSU5ECTB4MjAwMAkvKiBBdHRlbnRpb24gSW5kaWNhdG9yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BXUl9JTkQJMHg0MDAwCS8qIFBvd2VyIEluZGljYXRvciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfVkFMCTB4M2ZjMDAwMCAvKiBTbG90IFBvd2VyIExpbWl0IFZhbHVlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfU0NMCTB4YzAwMDAwMCAvKiBTbG90IFBvd2VyIExpbWl0IFNjYWxlICovCisjZGVmaW5lIFBDSV9FWFBfREVWQ1RMCQk4CS8qIERldmljZSBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9DRVJFCTB4MDAwMQkvKiBDb3JyZWN0YWJsZSBFcnJvciBSZXBvcnRpbmcgRW4uICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9ORkVSRQkweDAwMDIJLyogTm9uLUZhdGFsIEVycm9yIFJlcG9ydGluZyBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0ZFUkUJMHgwMDA0CS8qIEZhdGFsIEVycm9yIFJlcG9ydGluZyBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1VSUkUJMHgwMDA4CS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgUmVwb3J0aW5nIEVuLiAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUkVMQVhfRU4gMHgwMDEwIC8qIEVuYWJsZSByZWxheGVkIG9yZGVyaW5nICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9QQVlMT0FECTB4MDBlMAkvKiBNYXhfUGF5bG9hZF9TaXplICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9FWFRfVEFHCTB4MDEwMAkvKiBFeHRlbmRlZCBUYWcgRmllbGQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9QSEFOVE9NCTB4MDIwMAkvKiBQaGFudG9tIEZ1bmN0aW9ucyBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0FVWF9QTUUJMHgwNDAwCS8qIEF1eGlsaWFyeSBQb3dlciBQTSBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX05PU05PT1BfRU4gMHgwODAwICAvKiBFbmFibGUgTm8gU25vb3AgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1JFQURSUQkweDcwMDAJLyogTWF4X1JlYWRfUmVxdWVzdF9TaXplICovCisjZGVmaW5lIFBDSV9FWFBfREVWU1RBCQkxMAkvKiBEZXZpY2UgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9DRUQJMHgwMQkvKiBDb3JyZWN0YWJsZSBFcnJvciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfTkZFRAkweDAyCS8qIE5vbi1GYXRhbCBFcnJvciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfRkVECTB4MDQJLyogRmF0YWwgRXJyb3IgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX1VSRAkweDA4CS8qIFVuc3VwcG9ydGVkIFJlcXVlc3QgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0FVWFBECTB4MTAJLyogQVVYIFBvd2VyIERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9UUlBORAkweDIwCS8qIFRyYW5zYWN0aW9ucyBQZW5kaW5nICovCisjZGVmaW5lIFBDSV9FWFBfTE5LQ0FQCQkxMgkvKiBMaW5rIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBQQ0lfRVhQX0xOS0NUTAkJMTYJLyogTGluayBDb250cm9sICovCisjZGVmaW5lIFBDSV9FWFBfTE5LU1RBCQkxOAkvKiBMaW5rIFN0YXR1cyAqLworI2RlZmluZSBQQ0lfRVhQX1NMVENBUAkJMjAJLyogU2xvdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLworI2RlZmluZSBQQ0lfRVhQX1NMVFNUQQkJMjYJLyogU2xvdCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVENUTAkJMjgJLyogUm9vdCBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFQ0VFCTB4MDEJLyogU3lzdGVtIEVycm9yIG9uIENvcnJlY3RhYmxlIEVycm9yICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFTkZFRQkweDAyCS8qIFN5c3RlbSBFcnJvciBvbiBOb24tRmF0YWwgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VGRUUJMHgwNAkvKiBTeXN0ZW0gRXJyb3Igb24gRmF0YWwgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfUE1FSUUJMHgwOAkvKiBQTUUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9DUlNTVkUJMHgxMAkvKiBDUlMgU29mdHdhcmUgVmlzaWJpbGl0eSBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VYUF9SVENBUAkJMzAJLyogUm9vdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVFNUQQkJMzIJLyogUm9vdCBTdGF0dXMgKi8KKworLyogRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzIChQQ0ktWCAyLjAgYW5kIEV4cHJlc3MpICovCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEKGhlYWRlcikJCShoZWFkZXIgJiAweDAwMDBmZmZmKQorI2RlZmluZSBQQ0lfRVhUX0NBUF9WRVIoaGVhZGVyKQkJKChoZWFkZXIgPj4gMTYpICYgMHhmKQorI2RlZmluZSBQQ0lfRVhUX0NBUF9ORVhUKGhlYWRlcikJKChoZWFkZXIgPj4gMjApICYgMHhmZmMpCisKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfRVJSCTEKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfVkMJMgorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9EU04JMworI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9QV1IJNAorCisvKiBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9TVEFUVVMJNAkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVFJBSU4JMHgwMDAwMDAwMQkvKiBUcmFpbmluZyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRExQCTB4MDAwMDAwMTAJLyogRGF0YSBMaW5rIFByb3RvY29sICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19QT0lTT05fVExQCTB4MDAwMDEwMDAJLyogUG9pc29uZWQgVExQICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19GQ1AJMHgwMDAwMjAwMAkvKiBGbG93IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfVElNRQkweDAwMDA0MDAwCS8qIENvbXBsZXRpb24gVGltZW91dCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfQ09NUF9BQk9SVAkweDAwMDA4MDAwCS8qIENvbXBsZXRlciBBYm9ydCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVU5YX0NPTVAJMHgwMDAxMDAwMAkvKiBVbmV4cGVjdGVkIENvbXBsZXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1JYX09WRVIJMHgwMDAyMDAwMAkvKiBSZWNlaXZlciBPdmVyZmxvdyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfTUFMRl9UTFAJMHgwMDA0MDAwMAkvKiBNYWxmb3JtZWQgVExQICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19FQ1JDCTB4MDAwODAwMDAJLyogRUNSQyBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOU1VQCTB4MDAxMDAwMDAJLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCAqLworI2RlZmluZSBQQ0lfRVJSX1VOQ09SX01BU0sJOAkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIE1hc2sgKi8KKwkvKiBTYW1lIGJpdHMgYXMgYWJvdmUgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9TRVZFUgkxMgkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIFNldmVyaXR5ICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfQ09SX1NUQVRVUwkxNgkvKiBDb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JDVlIJMHgwMDAwMDAwMQkvKiBSZWNlaXZlciBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9UTFAJMHgwMDAwMDA0MAkvKiBCYWQgVExQIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfQkFEX0RMTFAJMHgwMDAwMDA4MAkvKiBCYWQgRExMUCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9ST0xMCTB4MDAwMDAxMDAJLyogUkVQTEFZX05VTSBSb2xsb3ZlciAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfUkVQX1RJTUVSCTB4MDAwMDEwMDAJLyogUmVwbGF5IFRpbWVyIFRpbWVvdXQgKi8KKyNkZWZpbmUgUENJX0VSUl9DT1JfTUFTSwkyMAkvKiBDb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfQ0FQCQkyNAkvKiBBZHZhbmNlZCBFcnJvciBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0ZFUCh4KQkoKHgpICYgMzEpCS8qIEZpcnN0IEVycm9yIFBvaW50ZXIgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0VDUkNfR0VOQwkweDAwMDAwMDIwCS8qIEVDUkMgR2VuZXJhdGlvbiBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0dFTkUJMHgwMDAwMDA0MAkvKiBFQ1JDIEdlbmVyYXRpb24gRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0NIS0MJMHgwMDAwMDA4MAkvKiBFQ1JDIENoZWNrIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0VDUkNfQ0hLRQkweDAwMDAwMTAwCS8qIEVDUkMgQ2hlY2sgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FUlJfSEVBREVSX0xPRwkyOAkvKiBIZWFkZXIgTG9nIFJlZ2lzdGVyICgxNiBieXRlcykgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0NPTU1BTkQJNDQJLyogUm9vdCBFcnJvciBDb21tYW5kICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9TVEFUVVMJNDgKKyNkZWZpbmUgUENJX0VSUl9ST09UX0NPUl9TUkMJNTIKKyNkZWZpbmUgUENJX0VSUl9ST09UX1NSQwk1NAorCisvKiBWaXJ0dWFsIENoYW5uZWwgKi8KKyNkZWZpbmUgUENJX1ZDX1BPUlRfUkVHMQk0CisjZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzIJOAorI2RlZmluZSBQQ0lfVkNfUE9SVF9DVFJMCTEyCisjZGVmaW5lIFBDSV9WQ19QT1JUX1NUQVRVUwkxNAorI2RlZmluZSBQQ0lfVkNfUkVTX0NBUAkJMTYKKyNkZWZpbmUgUENJX1ZDX1JFU19DVFJMCQkyMAorI2RlZmluZSBQQ0lfVkNfUkVTX1NUQVRVUwkyNgorCisvKiBQb3dlciBCdWRnZXRpbmcgKi8KKyNkZWZpbmUgUENJX1BXUl9EU1IJCTQJLyogRGF0YSBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BXUl9EQVRBCQk4CS8qIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9CQVNFKHgpCSgoeCkgJiAweGZmKQkgICAgLyogQmFzZSBQb3dlciAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1NDQUxFKHgpCSgoKHgpID4+IDgpICYgMykgICAgLyogRGF0YSBTY2FsZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1BNX1NVQih4KQkoKCh4KSA+PiAxMCkgJiA3KSAgIC8qIFBNIFN1YiBTdGF0ZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1BNX1NUQVRFKHgpICgoKHgpID4+IDEzKSAmIDMpIC8qIFBNIFN0YXRlICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfVFlQRSh4KQkoKCh4KSA+PiAxNSkgJiA3KSAgIC8qIFR5cGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9SQUlMKHgpCSgoKHgpID4+IDE4KSAmIDcpICAgLyogUG93ZXIgUmFpbCAqLworI2RlZmluZSBQQ0lfUFdSX0NBUAkJMTIJLyogQ2FwYWJpbGl0eSAqLworI2RlZmluZSAgUENJX1BXUl9DQVBfQlVER0VUKHgpCSgoeCkgJiAxKQkvKiBJbmNsdWRlZCBpbiBzeXN0ZW0gYnVkZ2V0ICovCisKKyNlbmRpZiAvKiBMSU5VWF9QQ0lfUkVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaAppbmRleCAzNjcyNWU3Li4xNzY3MDczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKQEAgLTM5LDkgKzM5LDYgQEAKIAogI2RlZmluZSBQSVBFX1NFTShpbm9kZSkJCSgmKGlub2RlKS5pX3NlbSkKICNkZWZpbmUgUElQRV9XQUlUKGlub2RlKQkoJihpbm9kZSkuaV9waXBlLT53YWl0KQotI2RlZmluZSBQSVBFX0JBU0UoaW5vZGUpCSgoaW5vZGUpLmlfcGlwZS0+YmFzZSkKLSNkZWZpbmUgUElQRV9TVEFSVChpbm9kZSkJKChpbm9kZSkuaV9waXBlLT5zdGFydCkKLSNkZWZpbmUgUElQRV9MRU4oaW5vZGUpCQkoKGlub2RlKS5pX3BpcGUtPmxlbikKICNkZWZpbmUgUElQRV9SRUFERVJTKGlub2RlKQkoKGlub2RlKS5pX3BpcGUtPnJlYWRlcnMpCiAjZGVmaW5lIFBJUEVfV1JJVEVSUyhpbm9kZSkJKChpbm9kZSkuaV9waXBlLT53cml0ZXJzKQogI2RlZmluZSBQSVBFX1dBSVRJTkdfV1JJVEVSUyhpbm9kZSkJKChpbm9kZSkuaV9waXBlLT53YWl0aW5nX3dyaXRlcnMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BucC5oIGIvaW5jbHVkZS9saW51eC9wbnAuaAppbmRleCA1ZWMyYmQwLi5hYWRiYWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BucC5oCisrKyBiL2luY2x1ZGUvbGludXgvcG5wLmgKQEAgLTQ0Myw3ICs0NDMsNyBAQAogI2RlZmluZSBwbnBfaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAicG5wOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQogI2RlZmluZSBwbnBfd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAicG5wOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQogCi0jaWZkZWYgREVCVUcKKyNpZmRlZiBDT05GSUdfUE5QX0RFQlVHCiAjZGVmaW5lIHBucF9kYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHICJwbnA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAjZWxzZQogI2RlZmluZSBwbnBfZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCmluZGV4IDJhZmRhZmIuLmRjNmYzNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaApAQCAtOTAsNiArOTAsNyBAQAogCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ld19wYXJlbnQpOwogZXh0ZXJuIHZvaWQgX19wdHJhY2VfdW5saW5rKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpOwogZXh0ZXJuIHZvaWQgcHRyYWNlX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCk7CitleHRlcm4gaW50IHB0cmFjZV9tYXlfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdHJhY2VfbGluayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAogCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3X3BhcmVudCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKaW5kZXggODA4MWEyOC4uOWM1MTkxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogc3RydWN0IHJhZGl4X3RyZWVfcm9vdCB7CiAJdW5zaWduZWQgaW50CQloZWlnaHQ7Ci0JaW50CQkJZ2ZwX21hc2s7CisJdW5zaWduZWQgaW50CQlnZnBfbWFzazsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlCSpybm9kZTsKIH07CiAKQEAgLTUwLDcgKzUwLDcgQEAKIHVuc2lnbmVkIGludAogcmFkaXhfdHJlZV9nYW5nX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqcmVzdWx0cywKIAkJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMpOwotaW50IHJhZGl4X3RyZWVfcHJlbG9hZChpbnQgZ2ZwX21hc2spOworaW50IHJhZGl4X3RyZWVfcHJlbG9hZCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spOwogdm9pZCByYWRpeF90cmVlX2luaXQodm9pZCk7CiB2b2lkICpyYWRpeF90cmVlX3RhZ19zZXQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKIAkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCB0YWcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IDRiZjE2NTkuLjlkZTk5MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTcsNyArNyw3IEBACiAjZGVmaW5lIEJJVE1BUF9IIDEKIAogI2RlZmluZSBCSVRNQVBfTUFKT1IgMwotI2RlZmluZSBCSVRNQVBfTUlOT1IgMzgKKyNkZWZpbmUgQklUTUFQX01JTk9SIDM5CiAKIC8qCiAgKiBpbi1tZW1vcnkgYml0bWFwOgpAQCAtMTQ3LDggKzE0Nyw5IEBACiAJX191MzIgc3RhdGU7ICAgICAgICAvKiA0OCAgYml0bWFwIHN0YXRlIGluZm9ybWF0aW9uICovCiAJX191MzIgY2h1bmtzaXplOyAgICAvKiA1MiAgdGhlIGJpdG1hcCBjaHVuayBzaXplIGluIGJ5dGVzICovCiAJX191MzIgZGFlbW9uX3NsZWVwOyAvKiA1NiAgc2Vjb25kcyBiZXR3ZWVuIGRpc2sgZmx1c2hlcyAqLworCV9fdTMyIHdyaXRlX2JlaGluZDsgLyogNjAgIG51bWJlciBvZiBvdXRzdGFuZGluZyB3cml0ZS1iZWhpbmQgd3JpdGVzICovCiAKLQlfX3U4ICBwYWRbMjU2IC0gNjBdOyAvKiBzZXQgdG8gemVybyAqLworCV9fdTggIHBhZFsyNTYgLSA2NF07IC8qIHNldCB0byB6ZXJvICovCiB9IGJpdG1hcF9zdXBlcl90OwogCiAvKiBub3RlczoKQEAgLTIyNiw2ICsyMjcsOSBAQAogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXVuc2lnbmVkIGxvbmcgbWF4X3dyaXRlX2JlaGluZDsgLyogd3JpdGUtYmVoaW5kIG1vZGUgKi8KKwlhdG9taWNfdCBiZWhpbmRfd3JpdGVzOworCiAJLyoKIAkgKiB0aGUgYml0bWFwIGRhZW1vbiAtIHBlcmlvZGljYWxseSB3YWtlcyB1cCBhbmQgc3dlZXBzIHRoZSBiaXRtYXAKIAkgKiBmaWxlLCBjbGVhbmluZyB1cCBiaXRzIGFuZCBmbHVzaGluZyBvdXQgcGFnZXMgdG8gZGlzayBhcyBuZWNlc3NhcnkKQEAgLTI2MCw5ICsyNjQsMTAgQEAKIHZvaWQgYml0bWFwX3dyaXRlX2FsbChzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogCiAvKiB0aGVzZSBhcmUgZXhwb3J0ZWQgKi8KLWludCBiaXRtYXBfc3RhcnR3cml0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzZWN0b3JzKTsKLXZvaWQgYml0bWFwX2VuZHdyaXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNlY3RvcnMsCi0JCSAgICAgaW50IHN1Y2Nlc3MpOworaW50IGJpdG1hcF9zdGFydHdyaXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LAorCQkJdW5zaWduZWQgbG9uZyBzZWN0b3JzLCBpbnQgYmVoaW5kKTsKK3ZvaWQgYml0bWFwX2VuZHdyaXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LAorCQkJdW5zaWduZWQgbG9uZyBzZWN0b3JzLCBpbnQgc3VjY2VzcywgaW50IGJlaGluZCk7CiBpbnQgYml0bWFwX3N0YXJ0X3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIGludCAqYmxvY2tzLCBpbnQgZGVncmFkZWQpOwogdm9pZCBiaXRtYXBfZW5kX3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIGludCAqYmxvY2tzLCBpbnQgYWJvcnRlZCk7CiB2b2lkIGJpdG1hcF9jbG9zZV9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbGluZWFyLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbGluZWFyLmgKaW5kZXggZTA0YzRmZS4uN2VhZjI5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL2xpbmVhci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9saW5lYXIuaApAQCAtMTQsOCArMTQsOCBAQAogc3RydWN0IGxpbmVhcl9wcml2YXRlX2RhdGEKIHsKIAlkZXZfaW5mb190CQkqKmhhc2hfdGFibGU7Ci0JZGV2X2luZm9fdAkJKnNtYWxsZXN0OwotCWludAkJCW5yX3pvbmVzOworCXNlY3Rvcl90CQloYXNoX3NwYWNpbmc7CisJaW50CQkJcHJlc2hpZnQ7IC8qIHNoaWZ0IGJlZm9yZSBkaXZpZGluZyBieSBoYXNoX3NwYWNpbmcgKi8KIAlkZXZfaW5mb190CQlkaXNrc1swXTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCmluZGV4IDhjMTRiYTUuLmViY2U5NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaApAQCAtODYsNzAgKzg2LDYgQEAKICNkZWZpbmUgTUFYX0NIVU5LX1NJWkUgKDQwOTYqMTAyNCkKIAogLyoKLSAqIGRlZmF1bHQgcmVhZGFoZWFkCi0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgZGlza19mYXVsdHkobWRwX2Rpc2tfdCAqIGQpCi17Ci0JcmV0dXJuIGQtPnN0YXRlICYgKDEgPDwgTURfRElTS19GQVVMVFkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkaXNrX2FjdGl2ZShtZHBfZGlza190ICogZCkKLXsKLQlyZXR1cm4gZC0+c3RhdGUgJiAoMSA8PCBNRF9ESVNLX0FDVElWRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRpc2tfc3luYyhtZHBfZGlza190ICogZCkKLXsKLQlyZXR1cm4gZC0+c3RhdGUgJiAoMSA8PCBNRF9ESVNLX1NZTkMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkaXNrX3NwYXJlKG1kcF9kaXNrX3QgKiBkKQotewotCXJldHVybiAhZGlza19zeW5jKGQpICYmICFkaXNrX2FjdGl2ZShkKSAmJiAhZGlza19mYXVsdHkoZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRpc2tfcmVtb3ZlZChtZHBfZGlza190ICogZCkKLXsKLQlyZXR1cm4gZC0+c3RhdGUgJiAoMSA8PCBNRF9ESVNLX1JFTU9WRUQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19kaXNrX2ZhdWx0eShtZHBfZGlza190ICogZCkKLXsKLQlkLT5zdGF0ZSB8PSAoMSA8PCBNRF9ESVNLX0ZBVUxUWSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2Rpc2tfYWN0aXZlKG1kcF9kaXNrX3QgKiBkKQotewotCWQtPnN0YXRlIHw9ICgxIDw8IE1EX0RJU0tfQUNUSVZFKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hcmtfZGlza19zeW5jKG1kcF9kaXNrX3QgKiBkKQotewotCWQtPnN0YXRlIHw9ICgxIDw8IE1EX0RJU0tfU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2Rpc2tfc3BhcmUobWRwX2Rpc2tfdCAqIGQpCi17Ci0JZC0+c3RhdGUgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19kaXNrX3JlbW92ZWQobWRwX2Rpc2tfdCAqIGQpCi17Ci0JZC0+c3RhdGUgPSAoMSA8PCBNRF9ESVNLX0ZBVUxUWSkgfCAoMSA8PCBNRF9ESVNLX1JFTU9WRUQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19kaXNrX2luYWN0aXZlKG1kcF9kaXNrX3QgKiBkKQotewotCWQtPnN0YXRlICY9IH4oMSA8PCBNRF9ESVNLX0FDVElWRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2Rpc2tfbm9uc3luYyhtZHBfZGlza190ICogZCkKLXsKLQlkLT5zdGF0ZSAmPSB+KDEgPDwgTURfRElTS19TWU5DKTsKLX0KLQotLyoKICAqIE1EJ3MgJ2V4dGVuZGVkJyBkZXZpY2UKICAqLwogc3RydWN0IG1ka19yZGV2X3MKQEAgLTE2Niw2ICsxMDIsNyBAQAogCWludAkJc2JfbG9hZGVkOwogCXNlY3Rvcl90CWRhdGFfb2Zmc2V0OwkvKiBzdGFydCBvZiBkYXRhIGluIGFycmF5ICovCiAJc2VjdG9yX3QJc2Jfb2Zmc2V0OworCWludAkJc2Jfc2l6ZTsJLyogYnl0ZXMgaW4gdGhlIHN1cGVyYmxvY2sgKi8KIAlpbnQJCXByZWZlcnJlZF9taW5vcjsJLyogYXV0b3J1biBzdXBwb3J0ICovCiAKIAkvKiBBIGRldmljZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlcyBiYXNlZCBvbiB0d28gZmxhZ3M6CkBAIC0xODEsNiArMTE4LDkgQEAKIAlpbnQgZmF1bHR5OwkJCS8qIGlmIGZhdWx0eSBkbyBub3QgaXNzdWUgSU8gcmVxdWVzdHMgKi8KIAlpbnQgaW5fc3luYzsJCQkvKiBkZXZpY2UgaXMgYSBmdWxsIG1lbWJlciBvZiB0aGUgYXJyYXkgKi8KIAorCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CQkvKiBTaG91bGQgaW5jbHVkZSBmYXVsdHkgYW5kIGluX3N5bmMgaGVyZS4gKi8KKyNkZWZpbmUJV3JpdGVNb3N0bHkJNAkJLyogQXZvaWQgcmVhZGluZyBpZiBhdCBhbGwgcG9zc2libGUgKi8KKwogCWludCBkZXNjX25yOwkJCS8qIGRlc2NyaXB0b3IgaW5kZXggaW4gdGhlIHN1cGVyYmxvY2sgKi8KIAlpbnQgcmFpZF9kaXNrOwkJCS8qIHJvbGUgb2YgZGV2aWNlIGluIGFycmF5ICovCiAJaW50IHNhdmVkX3JhaWRfZGlzazsJCS8qIHJvbGUgdGhhdCBkZXZpY2UgdXNlZCB0byBoYXZlIGluIHRoZQpAQCAtMjcyLDEyICsyMTIsMTkgQEAKIAlhdG9taWNfdAkJCXdyaXRlc19wZW5kaW5nOyAKIAlyZXF1ZXN0X3F1ZXVlX3QJCQkqcXVldWU7CS8qIGZvciBwbHVnZ2luZyAuLi4gKi8KIAorCWF0b21pY190ICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYmVoaW5kOyAvKiBvdXRzdGFuZGluZyBhc3luYyBJTyAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgbWF4X3dyaXRlX2JlaGluZDsgLyogMCA9IHN5bmMgKi8KKwogCXN0cnVjdCBiaXRtYXAgICAgICAgICAgICAgICAgICAgKmJpdG1hcDsgLyogdGhlIGJpdG1hcCBmb3IgdGhlIGRldmljZSAqLwogCXN0cnVjdCBmaWxlCQkJKmJpdG1hcF9maWxlOyAvKiB0aGUgYml0bWFwIGZpbGUgKi8KIAlsb25nCQkJCWJpdG1hcF9vZmZzZXQ7IC8qIG9mZnNldCBmcm9tIHN1cGVyYmxvY2sgb2YKIAkJCQkJCQkqIHN0YXJ0IG9mIGJpdG1hcC4gTWF5IGJlCiAJCQkJCQkJKiBuZWdhdGl2ZSwgYnV0IG5vdCAnMCcKIAkJCQkJCQkqLworCWxvbmcJCQkJZGVmYXVsdF9iaXRtYXBfb2Zmc2V0OyAvKiB0aGlzIGlzIHRoZSBvZmZzZXQgdG8gdXNlIHdoZW4KKwkJCQkJCQkJKiBob3QtYWRkaW5nIGEgYml0bWFwLiAgSXQgc2hvdWxkCisJCQkJCQkJCSogZXZlbnR1YWxseSBiZSBzZXR0YWJsZSBieSBzeXNmcy4KKwkJCQkJCQkJKi8KIAogCXN0cnVjdCBsaXN0X2hlYWQJCWFsbF9tZGRldnM7CiB9OwpAQCAtMzE0LDYgKzI2MSwxMiBAQAogCWludCAoKnJlc2l6ZSkgKG1kZGV2X3QgKm1kZGV2LCBzZWN0b3JfdCBzZWN0b3JzKTsKIAlpbnQgKCpyZXNoYXBlKSAobWRkZXZfdCAqbWRkZXYsIGludCByYWlkX2Rpc2tzKTsKIAlpbnQgKCpyZWNvbmZpZykgKG1kZGV2X3QgKm1kZGV2LCBpbnQgbGF5b3V0LCBpbnQgY2h1bmtfc2l6ZSk7CisJLyogcXVpZXNjZSBtb3ZlcyBiZXR3ZWVuIHF1aWVzY2VuY2Ugc3RhdGVzCisJICogMCAtIGZ1bGx5IGFjdGl2ZQorCSAqIDEgLSBubyBuZXcgcmVxdWVzdHMgYWxsb3dlZAorCSAqIG90aGVycyAtIHJlc2VydmVkCisJICovCisJdm9pZCAoKnF1aWVzY2UpIChtZGRldl90ICptZGRldiwgaW50IHN0YXRlKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKaW5kZXggZGM2NWNkNC4uYzEwMGZhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCkBAIC03OSw2ICs3OSwxMSBAQAogI2RlZmluZSBNRF9ESVNLX1NZTkMJCTIgLyogZGlzayBpcyBpbiBzeW5jIHdpdGggdGhlIHJhaWQgc2V0ICovCiAjZGVmaW5lIE1EX0RJU0tfUkVNT1ZFRAkJMyAvKiBkaXNrIGlzIGluIHN5bmMgd2l0aCB0aGUgcmFpZCBzZXQgKi8KIAorI2RlZmluZQlNRF9ESVNLX1dSSVRFTU9TVExZCTkgLyogZGlzayBpcyAid3JpdGUtbW9zdGx5IiBpcyBSQUlEMSBjb25maWcuCisJCQkJICAgKiByZWFkIHJlcXVlc3RzIHdpbGwgb25seSBiZSBzZW50IGhlcmUgaW4KKwkJCQkgICAqIGRpcmUgbmVlZAorCQkJCSAgICovCisKIHR5cGVkZWYgc3RydWN0IG1kcF9kZXZpY2VfZGVzY3JpcHRvcl9zIHsKIAlfX3UzMiBudW1iZXI7CQkvKiAwIERldmljZSBudW1iZXIgaW4gdGhlIGVudGlyZSBzZXQJICAgICAgKi8KIAlfX3UzMiBtYWpvcjsJCS8qIDEgRGV2aWNlIG1ham9yIG51bWJlcgkJICAgICAgKi8KQEAgLTE5Myw3ICsxOTgsNyBAQAogCiAJX191NjQJY3RpbWU7CQkvKiBsbyA0MCBiaXRzIGFyZSBzZWNvbmRzLCB0b3AgMjQgYXJlIG1pY3Jvc2Vjb25kcyBvciAwKi8KIAlfX3UzMglsZXZlbDsJCS8qIC00IChtdWx0aXBhdGgpLCAtMSAobGluZWFyKSwgMCwxLDQsNSAqLwotCV9fdTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGN1cnJlbnRseSAqLworCV9fdTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGFuZCByYWlkMTAgY3VycmVudGx5ICovCiAJX191NjQJc2l6ZTsJCS8qIHVzZWQgc2l6ZSBvZiBjb21wb25lbnQgZGV2aWNlcywgaW4gNTEyYnl0ZSBzZWN0b3JzICovCiAKIAlfX3UzMgljaHVua3NpemU7CS8qIGluIDUxMmJ5dGUgc2VjdG9ycyAqLwpAQCAtMjEyLDcgKzIxNyw5IEBACiAJX191MzIJZGV2X251bWJlcjsJLyogcGVybWFuZW50IGlkZW50aWZpZXIgb2YgdGhpcyAgZGV2aWNlIC0gbm90IHJvbGUgaW4gcmFpZCAqLwogCV9fdTMyCWNudF9jb3JyZWN0ZWRfcmVhZDsgLyogbnVtYmVyIG9mIHJlYWQgZXJyb3JzIHRoYXQgd2VyZSBjb3JyZWN0ZWQgYnkgcmUtd3JpdGluZyAqLwogCV9fdTgJZGV2aWNlX3V1aWRbMTZdOyAvKiB1c2VyLXNwYWNlIHNldGFibGUsIGlnbm9yZWQgYnkga2VybmVsICovCi0JX191OAlwYWQyWzY0LTU2XTsJLyogc2V0IHRvIDAgd2hlbiB3cml0aW5nICovCisJX191OAlkZXZmbGFnczsJLyogcGVyLWRldmljZSBmbGFncy4gIE9ubHkgb25lIGRlZmluZWQuLi4qLworI2RlZmluZQlXcml0ZU1vc3RseTEJMQkvKiBtYXNrIGZvciB3cml0ZW1vc3RseSBmbGFnIGluIGFib3ZlICovCisJX191OAlwYWQyWzY0LTU3XTsJLyogc2V0IHRvIDAgd2hlbiB3cml0aW5nICovCiAKIAkvKiBhcnJheSBzdGF0ZSBpbmZvcm1hdGlvbiAtIDY0IGJ5dGVzICovCiAJX191NjQJdXRpbWU7CQkvKiA0MCBiaXRzIHNlY29uZCwgMjQgYnRlcyBtaWNyb3NlY29uZHMgKi8KQEAgLTIzMSw1ICsyMzgsMTAgQEAKIAlfX3UxNglkZXZfcm9sZXNbMF07CS8qIHJvbGUgaW4gYXJyYXksIG9yIDB4ZmZmZiBmb3IgYSBzcGFyZSwgb3IgMHhmZmZlIGZvciBmYXVsdHkgKi8KIH07CiAKKy8qIGZlYXR1cmVfbWFwIGJpdHMgKi8KKyNkZWZpbmUgTURfRkVBVFVSRV9CSVRNQVBfT0ZGU0VUCTEKKworI2RlZmluZQlNRF9GRUFUVVJFX0FMTAkJCTEKKwogI2VuZGlmIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDEuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkMS5oCmluZGV4IDlkOTNjZjEuLjYwZTE5YjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkMS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkMS5oCkBAIC04MCw2ICs4MCw5IEBACiAJYXRvbWljX3QJCXJlbWFpbmluZzsgLyogJ2hhdmUgd2UgZmluaXNoZWQnIGNvdW50LAogCQkJCQkgICAgKiB1c2VkIGZyb20gSVJRIGhhbmRsZXJzCiAJCQkJCSAgICAqLworCWF0b21pY190CQliZWhpbmRfcmVtYWluaW5nOyAvKiBudW1iZXIgb2Ygd3JpdGUtYmVoaW5kIGlvcyByZW1haW5pbmcKKwkJCQkJCSAqIGluIHRoaXMgQmVoaW5kSU8gcmVxdWVzdAorCQkJCQkJICovCiAJc2VjdG9yX3QJCXNlY3RvcjsKIAlpbnQJCQlzZWN0b3JzOwogCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwpAQCAtMTA3LDQgKzExMCwxNCBAQAogI2RlZmluZQlSMUJJT19VcHRvZGF0ZQkwCiAjZGVmaW5lCVIxQklPX0lzU3luYwkxCiAjZGVmaW5lCVIxQklPX0RlZ3JhZGVkCTIKKyNkZWZpbmUJUjFCSU9fQmVoaW5kSU8gICAzCisvKiBGb3Igd3JpdGUtYmVoaW5kIHJlcXVlc3RzLCB3ZSBjYWxsIGJpX2VuZF9pbyB3aGVuCisgKiB0aGUgbGFzdCBub24td3JpdGUtYmVoaW5kIGRldmljZSBjb21wbGV0ZXMsIHByb3ZpZGluZworICogYW55IHdyaXRlIHdhcyBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlIHdlIGNhbGwgd2hlbgorICogYW55IHdyaXRlLWJlaGluZCB3cml0ZSBzdWNjZWVkcywgb3RoZXJ3aXNlIHdlIGNhbGwKKyAqIHdpdGggZmFpbHVyZSB3aGVuIGxhc3Qgd3JpdGUgY29tcGxldGVzIChhbmQgYWxsIGZhaWxlZCkuCisgKiBSZWNvcmQgdGhhdCBiaV9lbmRfaW8gd2FzIGNhbGxlZCB3aXRoIHRoaXMgZmxhZy4uLgorICovCisjZGVmaW5lCVIxQklPX1JldHVybmVkIDQKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oCmluZGV4IGQ2M2RkY2IuLjE3NmZjNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oCkBAIC0xMzQsNiArMTM0LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlzdGF0ZTsJCQkvKiBzdGF0ZSBmbGFncyAqLwogCWF0b21pY190CQljb3VudDsJCQkvKiBuciBvZiBhY3RpdmUgdGhyZWFkL3JlcXVlc3RzICovCiAJc3BpbmxvY2tfdAkJbG9jazsKKwlpbnQJCQlibV9zZXE7CS8qIHNlcXVlbmNlIG51bWJlciBmb3IgYml0bWFwIGZsdXNoZXMgKi8KIAlzdHJ1Y3QgcjVkZXYgewogCQlzdHJ1Y3QgYmlvCXJlcTsKIAkJc3RydWN0IGJpb192ZWMJdmVjOwpAQCAtMTY1LDEyICsxNjYsMTMgQEAKIC8qCiAgKiBTdHJpcGUgc3RhdGUKICAqLwotI2RlZmluZSBTVFJJUEVfRVJST1IJCTEKICNkZWZpbmUgU1RSSVBFX0hBTkRMRQkJMgogI2RlZmluZQlTVFJJUEVfU1lOQ0lORwkJMwogI2RlZmluZQlTVFJJUEVfSU5TWU5DCQk0CiAjZGVmaW5lCVNUUklQRV9QUkVSRUFEX0FDVElWRQk1CiAjZGVmaW5lCVNUUklQRV9ERUxBWUVECQk2CisjZGVmaW5lCVNUUklQRV9ERUdSQURFRAkJNworI2RlZmluZQlTVFJJUEVfQklUX0RFTEFZCTgKIAogLyoKICAqIFBsdWdnaW5nOgpAQCAtMjEwLDEwICsyMTIsMjAgQEAKIAogCXN0cnVjdCBsaXN0X2hlYWQJaGFuZGxlX2xpc3Q7IC8qIHN0cmlwZXMgbmVlZGluZyBoYW5kbGluZyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJZGVsYXllZF9saXN0OyAvKiBzdHJpcGVzIHRoYXQgaGF2ZSBwbHVnZ2VkIHJlcXVlc3RzICovCisJc3RydWN0IGxpc3RfaGVhZAliaXRtYXBfbGlzdDsgLyogc3RyaXBlcyBkZWxheWluZyBhd2FpdGluZyBiaXRtYXAgdXBkYXRlICovCiAJYXRvbWljX3QJCXByZXJlYWRfYWN0aXZlX3N0cmlwZXM7IC8qIHN0cmlwZXMgd2l0aCBzY2hlZHVsZWQgaW8gKi8KIAogCWNoYXIJCQljYWNoZV9uYW1lWzIwXTsKIAlrbWVtX2NhY2hlX3QJCSpzbGFiX2NhY2hlOyAvKiBmb3IgYWxsb2NhdGluZyBzdHJpcGVzICovCisKKwlpbnQJCQlzZXFfZmx1c2gsIHNlcV93cml0ZTsKKwlpbnQJCQlxdWllc2NlOworCisJaW50CQkJZnVsbHN5bmM7ICAvKiBzZXQgdG8gMSBpZiBhIGZ1bGwgc3luYyBpcyBuZWVkZWQsCisJCQkJCSAgICAqIChmcmVzaCBkZXZpY2UgYWRkZWQpLgorCQkJCQkgICAgKiBDbGVhcmVkIHdoZW4gYSBzeW5jIGNvbXBsZXRlcy4KKwkJCQkJICAgICovCisKIAkvKgogCSAqIEZyZWUgc3RyaXBlcyBwb29sCiAJICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWRfY2xhc3MuaCBiL2luY2x1ZGUvbGludXgvcmFpZF9jbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTEyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWRfY2xhc3MuaApAQCAtMCwwICsxLDU5IEBACisvKgorICovCisjaW5jbHVkZSA8bGludXgvdHJhbnNwb3J0X2NsYXNzLmg+CisKK3N0cnVjdCByYWlkX3RlbXBsYXRlIHsKKwlzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciByYWlkX2F0dHJzOworfTsKKworc3RydWN0IHJhaWRfZnVuY3Rpb25fdGVtcGxhdGUgeworCXZvaWQgKmNvb2tpZTsKKwlpbnQgKCppc19yYWlkKShzdHJ1Y3QgZGV2aWNlICopOworCXZvaWQgKCpnZXRfcmVzeW5jKShzdHJ1Y3QgZGV2aWNlICopOworCXZvaWQgKCpnZXRfc3RhdGUpKHN0cnVjdCBkZXZpY2UgKik7Cit9OworCitlbnVtIHJhaWRfc3RhdGUgeworCVJBSURfQUNUSVZFID0gMSwKKwlSQUlEX0RFR1JBREVELAorCVJBSURfUkVTWU5DSU5HLAorCVJBSURfT0ZGTElORSwKK307CisKK3N0cnVjdCByYWlkX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgY29tcG9uZW50X2xpc3Q7CisJaW50IGNvbXBvbmVudF9jb3VudDsKKwlpbnQgbGV2ZWw7CisJZW51bSByYWlkX3N0YXRlIHN0YXRlOworCWludCByZXN5bmM7Cit9OworCisjZGVmaW5lIERFRklORV9SQUlEX0FUVFJJQlVURSh0eXBlLCBhdHRyKQkJCQkgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQJCQkJCQkJICAgICAgXAorcmFpZF9zZXRfIyNhdHRyKHN0cnVjdCByYWlkX3RlbXBsYXRlICpyLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHR5cGUgdmFsdWUpIHsgICAgXAorCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPQkJCQkJICAgICAgXAorCQlhdHRyaWJ1dGVfY29udGFpbmVyX2ZpbmRfY2xhc3NfZGV2aWNlKCZyLT5yYWlkX2F0dHJzLmFjLCBkZXYpO1wKKwlzdHJ1Y3QgcmFpZF9kYXRhICpyZDsJCQkJCQkgICAgICBcCisJQlVHX09OKCFjZGV2KTsJCQkJCQkJICAgICAgXAorCXJkID0gY2xhc3NfZ2V0X2RldmRhdGEoY2Rldik7CQkJCQkgICAgICBcCisJcmQtPmF0dHIgPSB2YWx1ZTsJCQkJCQkgICAgICBcCit9CQkJCQkJCQkJICAgICAgXAorc3RhdGljIGlubGluZSB0eXBlCQkJCQkJCSAgICAgIFwKK3JhaWRfZ2V0XyMjYXR0cihzdHJ1Y3QgcmFpZF90ZW1wbGF0ZSAqciwgc3RydWN0IGRldmljZSAqZGV2KSB7CQkgICAgICBcCisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiA9CQkJCQkgICAgICBcCisJCWF0dHJpYnV0ZV9jb250YWluZXJfZmluZF9jbGFzc19kZXZpY2UoJnItPnJhaWRfYXR0cnMuYWMsIGRldik7XAorCXN0cnVjdCByYWlkX2RhdGEgKnJkOwkJCQkJCSAgICAgIFwKKwlCVUdfT04oIWNkZXYpOwkJCQkJCQkgICAgICBcCisJcmQgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsJCQkJCSAgICAgIFwKKwlyZXR1cm4gcmQtPmF0dHI7CQkJCQkJICAgICAgXAorfQorCitERUZJTkVfUkFJRF9BVFRSSUJVVEUoaW50LCBsZXZlbCkKK0RFRklORV9SQUlEX0FUVFJJQlVURShpbnQsIHJlc3luYykKK0RFRklORV9SQUlEX0FUVFJJQlVURShlbnVtIHJhaWRfc3RhdGUsIHN0YXRlKQorCQorc3RydWN0IHJhaWRfdGVtcGxhdGUgKnJhaWRfY2xhc3NfYXR0YWNoKHN0cnVjdCByYWlkX2Z1bmN0aW9uX3RlbXBsYXRlICopOwordm9pZCByYWlkX2NsYXNzX3JlbGVhc2Uoc3RydWN0IHJhaWRfdGVtcGxhdGUgKik7CisKK3ZvaWQgcmFpZF9jb21wb25lbnRfYWRkKHN0cnVjdCByYWlkX3RlbXBsYXRlICosIHN0cnVjdCBkZXZpY2UgKiwKKwkJCXN0cnVjdCBkZXZpY2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggZmQyNzZhZC4uNGU2NWViNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtNTIsOCArNTIsOCBAQAogCXZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpOwogfTsKIAotI2RlZmluZSBSQ1VfSEVBRF9JTklUKGhlYWQpIHsgLm5leHQgPSBOVUxMLCAuZnVuYyA9IE5VTEwgfQotI2RlZmluZSBSQ1VfSEVBRChoZWFkKSBzdHJ1Y3QgcmN1X2hlYWQgaGVhZCA9IFJDVV9IRUFEX0lOSVQoaGVhZCkKKyNkZWZpbmUgUkNVX0hFQURfSU5JVCAJeyAubmV4dCA9IE5VTEwsIC5mdW5jID0gTlVMTCB9CisjZGVmaW5lIFJDVV9IRUFEKGhlYWQpIHN0cnVjdCByY3VfaGVhZCBoZWFkID0gUkNVX0hFQURfSU5JVAogI2RlZmluZSBJTklUX1JDVV9IRUFEKHB0cikgZG8geyBcCiAgICAgICAgKHB0ciktPm5leHQgPSBOVUxMOyAocHRyKS0+ZnVuYyA9IE5VTEw7IFwKIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXJlZi5oIGIvaW5jbHVkZS9saW51eC9yY3VyZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFkYmJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9yY3VyZWYuaApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIHJjdXJlZi5oCisgKgorICogUmVmZXJlbmNlIGNvdW50aW5nIGZvciBlbGVtZW50cyBvZiBsaXN0cy9hcnJheXMgcHJvdGVjdGVkIGJ5CisgKiBSQ1UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNQorICoKKyAqIEF1dGhvcjogRGlwYW5rYXIgU2FybWEgPGRpcGFua2FyQGluLmlibS5jb20+CisgKgkgICBSYXZpa2lyYW4gVGhpcnVtYWxhaSA8a2lyYW5fdGhAZ21haWwuY29tPgorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0IGZvciBkZXRhaWxlZCB1c2VyIGd1aWRlLgorICoKKyAqLworCisjaWZuZGVmIF9SQ1VSRUZfSF8KKyNkZWZpbmUgX1JDVVJFRl9IXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworLyoKKyAqIFRoZXNlIEFQSXMgd29yayBvbiB0cmFkaXRpb25hbCBhdG9taWNfdCBjb3VudGVycyB1c2VkIGluIHRoZQorICoga2VybmVsIGZvciByZWZlcmVuY2UgY291bnRpbmcuIFVuZGVyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcworICogd2hlcmUgYSBsb2NrLWZyZWUgZ2V0KCkgb3BlcmF0aW9uIHJhY2VzIHdpdGggYSBwdXQoKSBvcGVyYXRpb24KKyAqIHRoZXNlIEFQSXMgY2FuIGJlIHVzZWQuIFNlZSBEb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0LgorICovCisKKyNpZmRlZiBfX0hBVkVfQVJDSF9DTVBYQ0hHCisKKy8qKgorICogcmN1cmVmX2luYyAtIGluY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKKyAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlCisgKiBpbiBhIGxvY2stZnJlZSByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1cmVmX2luYyhhdG9taWNfdCAqcmN1cmVmKQoreworCWF0b21pY19pbmMocmN1cmVmKTsKK30KKworLyoqCisgKiByY3VyZWZfZGVjIC0gZGVjcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QuCisgKiBAcmN1cmVmOiByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3Igb2JqZWN0cyB3aGVyZSB3ZSB1c2UgUkNVIGFuZAorICogdXNlIHRoZSByY3VyZWZfaW5jX2xmKCkgYXBpIHRvIGFjcXVpcmUgYSByZWZlcmVuY2UKKyAqIGluIGEgbG9jay1mcmVlIHJlYWRlci1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VyZWZfZGVjKGF0b21pY190ICpyY3VyZWYpCit7CisJYXRvbWljX2RlYyhyY3VyZWYpOworfQorCisvKioKKyAqIHJjdXJlZl9kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgcmVmY291bnQgZm9yIG9iamVjdCBhbmQgdGVzdAorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdC4KKyAqIEByZWxlYXNlOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgY2xlYW4gdXAgdGhlIG9iamVjdAorICoJICAgICB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkLgorICoJICAgICBUaGlzIHBvaW50ZXIgaXMgcmVxdWlyZWQuCisgKgorICogRGVjcmVtZW50IHRoZSByZWZjb3VudCwgYW5kIGlmIDAsIHJldHVybiAxLiBFbHNlIHJldHVybiAwLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3Igb2JqZWN0cyB3aGVyZSB3ZSB1c2UgUkNVIGFuZAorICogdXNlIHRoZSByY3VyZWZfaW5jX2xmKCkgYXBpIHRvIGFjcXVpcmUgYSByZWZlcmVuY2UKKyAqIGluIGEgbG9jay1mcmVlIHJlYWRlci1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJjdXJlZl9kZWNfYW5kX3Rlc3QoYXRvbWljX3QgKnJjdXJlZikKK3sKKwlyZXR1cm4gYXRvbWljX2RlY19hbmRfdGVzdChyY3VyZWYpOworfQorCisvKgorICogY21weGNoZyBpcyBuZWVkZWQgb24gVVAgdG9vLCBpZiBkZWxldGlvbnMgdG8gdGhlIGxpc3QvYXJyYXkgY2FuIGhhcHBlbgorICogaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KKworLyoqCisgKiByY3VyZWZfaW5jX2xmIC0gVGFrZSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGluIGEgcmVhZC1zaWRlCisgKiBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3RlZCBieSBSQ1UuCisgKiBAcmN1cmVmOiByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uLgorICoKKyAqIFRyeSBhbmQgaW5jcmVtZW50IHRoZSByZWZjb3VudCBieSAxLiAgVGhlIGluY3JlbWVudCBtaWdodCBmYWlsIGlmCisgKiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgaGFzIGJlZW4gdGhyb3VnaCBhIDEgdG8gMCB0cmFuc2l0aW9uIGFuZAorICogaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGxvY2stZnJlZSBsaXN0LgorICogUmV0dXJucyBub24temVybyBvbiBzdWNjZXNzZnVsIGluY3JlbWVudCBhbmQgemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJjdXJlZl9pbmNfbGYoYXRvbWljX3QgKnJjdXJlZikKK3sKKwlpbnQgYywgb2xkOworCWMgPSBhdG9taWNfcmVhZChyY3VyZWYpOworCXdoaWxlIChjICYmIChvbGQgPSBjbXB4Y2hnKCZyY3VyZWYtPmNvdW50ZXIsIGMsIGMgKyAxKSkgIT0gYykKKwkJYyA9IG9sZDsKKwlyZXR1cm4gYzsKK30KKworI2Vsc2UJCQkJLyogIV9fSEFWRV9BUkNIX0NNUFhDSEcgKi8KKworZXh0ZXJuIHNwaW5sb2NrX3QgX19yY3VyZWZfaGFzaFtdOworCisvKgorICogVXNlIGEgaGFzaCB0YWJsZSBvZiBsb2NrcyB0byBwcm90ZWN0IHRoZSByZWZlcmVuY2UgY291bnQKKyAqIHNpbmNlIGNtcHhjaGcgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGFyY2guCisgKi8KKyNpZmRlZglDT05GSUdfU01QCisjZGVmaW5lIFJDVVJFRl9IQVNIX1NJWkUJNAorI2RlZmluZSBSQ1VSRUZfSEFTSChrKSBcCisJKCZfX3JjdXJlZl9oYXNoWygoKHVuc2lnbmVkIGxvbmcpayk+PjgpICYgKFJDVVJFRl9IQVNIX1NJWkUtMSldKQorI2Vsc2UKKyNkZWZpbmUJUkNVUkVGX0hBU0hfU0laRQkxCisjZGVmaW5lIFJDVVJFRl9IQVNIKGspIAkmX19yY3VyZWZfaGFzaFswXQorI2VuZGlmCQkJCS8qIENPTkZJR19TTVAgKi8KKworLyoqCisgKiByY3VyZWZfaW5jIC0gaW5jcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QuCisgKiBAcmN1cmVmOiByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3Igb2JqZWN0cyB3aGVyZSB3ZSB1c2UgUkNVIGFuZAorICogdXNlIHRoZSByY3VyZWZfaW5jX2xmKCkgYXBpIHRvIGFjcXVpcmUgYSByZWZlcmVuY2UgaW4gYSBsb2NrLWZyZWUKKyAqIHJlYWRlci1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VyZWZfaW5jKGF0b21pY190ICpyY3VyZWYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7CisJcmN1cmVmLT5jb3VudGVyICs9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7Cit9CisKKy8qKgorICogcmN1cmVmX2RlYyAtIGRlY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKKyAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIGluIGEgbG9jay1mcmVlCisgKiByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1cmVmX2RlYyhhdG9taWNfdCAqcmN1cmVmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOworCXJjdXJlZi0+Y291bnRlciAtPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOworfQorCisvKioKKyAqIHJjdXJlZl9kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgcmVmY291bnQgZm9yIG9iamVjdCBhbmQgdGVzdAorICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdC4KKyAqIEByZWxlYXNlOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgY2xlYW4gdXAgdGhlIG9iamVjdAorICoJICAgICB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkLgorICoJICAgICBUaGlzIHBvaW50ZXIgaXMgcmVxdWlyZWQuCisgKgorICogRGVjcmVtZW50IHRoZSByZWZjb3VudCwgYW5kIGlmIDAsIHJldHVybiAxLiBFbHNlIHJldHVybiAwLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3Igb2JqZWN0cyB3aGVyZSB3ZSB1c2UgUkNVIGFuZAorICogdXNlIHRoZSByY3VyZWZfaW5jX2xmKCkgYXBpIHRvIGFjcXVpcmUgYSByZWZlcmVuY2UgaW4gYSBsb2NrLWZyZWUKKyAqIHJlYWRlci1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJjdXJlZl9kZWNfYW5kX3Rlc3QoYXRvbWljX3QgKnJjdXJlZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKKwlyY3VyZWYtPmNvdW50ZXItLTsKKwlpZiAoIXJjdXJlZi0+Y291bnRlcikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKiByY3VyZWZfaW5jX2xmIC0gVGFrZSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIGEgbG9jay1mcmVlIGNvbGxlY3Rpb24KKyAqIGJ5IHRyYXZlcnNpbmcgYSBsb2NrLWZyZWUgbGlzdC9hcnJheS4KKyAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24uCisgKgorICogVHJ5IGFuZCBpbmNyZW1lbnQgdGhlIHJlZmNvdW50IGJ5IDEuICBUaGUgaW5jcmVtZW50IG1pZ2h0IGZhaWwgaWYKKyAqIHRoZSByZWZlcmVuY2UgY291bnRlciBoYXMgYmVlbiB0aHJvdWdoIGEgMSB0byAwIHRyYW5zaXRpb24gYW5kCisgKiBvYmplY3QgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGxvY2stZnJlZSBsaXN0LgorICogUmV0dXJucyBub24temVybyBvbiBzdWNjZXNzZnVsIGluY3JlbWVudCBhbmQgemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJjdXJlZl9pbmNfbGYoYXRvbWljX3QgKnJjdXJlZikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOworCWlmIChyY3VyZWYtPmNvdW50ZXIpCisJCXJldCA9IHJjdXJlZi0+Y291bnRlcisrOworCWVsc2UKKwkJcmV0ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisKKyNlbmRpZiAvKiAhX19IQVZFX0FSQ0hfQ01QWENIRyAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9SQ1VSRUZfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAppbmRleCAxN2U0NThlLi5hZjAwYjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC0yMDk3LDcgKzIwOTcsNyBAQAogCQkJIGJfYmxvY2tucl90LCBpbnQgZm9yX3VuZm9ybWF0dGVkKTsKIGludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqLCBiX2Jsb2NrbnJfdCAqLCBpbnQsCiAJCQkgICAgICAgaW50KTsKLWV4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X2Zvcm1fYmxvY2tucnMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCiAJCQkJCSAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCiAJCQkJCSAgICAgaW50IGFtb3VudF9uZWVkZWQpCiB7CkBAIC0yMTEzLDcgKzIxMTMsNyBAQAogCQkJCQkgIDApOwogfQogCi1leHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZQogCQkJCQkgICAgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCiAJCQkJCSAgICBzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKQEAgLTIxMzAsNyArMjEzMCw3IEBACiB9CiAKICNpZmRlZiBSRUlTRVJGU19QUkVBTExPQ0FURQotZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZQorc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZQogCQkJCQkgICAgICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKIAkJCQkJICAgICBzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oIGIvaW5jbHVkZS9saW51eC9yZWxheWZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhZmMzZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9yZWxheWZzX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgLSBUb20gWmFudXNzaSAoemFudXNzaUB1cy5pYm0uY29tKSwgSUJNIENvcnAKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiAtIEthcmltIFlhZ2htb3VyIChrYXJpbUBvcGVyc3lzLmNvbSkKKyAqCisgKiBSZWxheUZTIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9SRUxBWUZTX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1JFTEFZRlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorCisvKgorICogVHJhY2tzIGNoYW5nZXMgdG8gcmNoYW5fYnVmIHN0cnVjdAorICovCisjZGVmaW5lIFJFTEFZRlNfQ0hBTk5FTF9WRVJTSU9OCQk1CisKKy8qCisgKiBQZXItY3B1IHJlbGF5IGNoYW5uZWwgYnVmZmVyCisgKi8KK3N0cnVjdCByY2hhbl9idWYKK3sKKwl2b2lkICpzdGFydDsJCQkvKiBzdGFydCBvZiBjaGFubmVsIGJ1ZmZlciAqLworCXZvaWQgKmRhdGE7CQkJLyogc3RhcnQgb2YgY3VycmVudCBzdWItYnVmZmVyICovCisJc2l6ZV90IG9mZnNldDsJCQkvKiBjdXJyZW50IG9mZnNldCBpbnRvIHN1Yi1idWZmZXIgKi8KKwlzaXplX3Qgc3ViYnVmc19wcm9kdWNlZDsJLyogY291bnQgb2Ygc3ViLWJ1ZmZlcnMgcHJvZHVjZWQgKi8KKwlzaXplX3Qgc3ViYnVmc19jb25zdW1lZDsJLyogY291bnQgb2Ygc3ViLWJ1ZmZlcnMgY29uc3VtZWQgKi8KKwlzdHJ1Y3QgcmNoYW4gKmNoYW47CQkvKiBhc3NvY2lhdGVkIGNoYW5uZWwgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CS8qIHJlYWRlciB3YWl0IHF1ZXVlICovCisJc3RydWN0IHdvcmtfc3RydWN0IHdha2VfcmVhZGVyczsgLyogcmVhZGVyIHdha2UtdXAgd29yayBzdHJ1Y3QgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CQkvKiBjaGFubmVsIGZpbGUgZGVudHJ5ICovCisJc3RydWN0IGtyZWYga3JlZjsJCS8qIGNoYW5uZWwgYnVmZmVyIHJlZmNvdW50ICovCisJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5OwkvKiBhcnJheSBvZiBjdXJyZW50IGJ1ZmZlciBwYWdlcyAqLworCXVuc2lnbmVkIGludCBwYWdlX2NvdW50OwkvKiBudW1iZXIgb2YgY3VycmVudCBidWZmZXIgcGFnZXMgKi8KKwl1bnNpZ25lZCBpbnQgZmluYWxpemVkOwkJLyogYnVmZmVyIGhhcyBiZWVuIGZpbmFsaXplZCAqLworCXNpemVfdCAqcGFkZGluZzsJCS8qIHBhZGRpbmcgY291bnRzIHBlciBzdWItYnVmZmVyICovCisJc2l6ZV90IHByZXZfcGFkZGluZzsJCS8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworCXNpemVfdCBieXRlc19jb25zdW1lZDsJCS8qIGJ5dGVzIGNvbnN1bWVkIGluIGN1ciByZWFkIHN1YmJ1ZiAqLworCXVuc2lnbmVkIGludCBjcHU7CQkvKiB0aGlzIGJ1ZidzIGNwdSAqLworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKKy8qCisgKiBSZWxheSBjaGFubmVsIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCByY2hhbgoreworCXUzMiB2ZXJzaW9uOwkJCS8qIHRoZSB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0ICovCisJc2l6ZV90IHN1YmJ1Zl9zaXplOwkJLyogc3ViLWJ1ZmZlciBzaXplICovCisJc2l6ZV90IG5fc3ViYnVmczsJCS8qIG51bWJlciBvZiBzdWItYnVmZmVycyBwZXIgYnVmZmVyICovCisJc2l6ZV90IGFsbG9jX3NpemU7CQkvKiB0b3RhbCBidWZmZXIgc2l6ZSBhbGxvY2F0ZWQgKi8KKwlzdHJ1Y3QgcmNoYW5fY2FsbGJhY2tzICpjYjsJLyogY2xpZW50IGNhbGxiYWNrcyAqLworCXN0cnVjdCBrcmVmIGtyZWY7CQkvKiBjaGFubmVsIHJlZmNvdW50ICovCisJdm9pZCAqcHJpdmF0ZV9kYXRhOwkJLyogZm9yIHVzZXItZGVmaW5lZCBkYXRhICovCisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmW05SX0NQVVNdOyAvKiBwZXItY3B1IGNoYW5uZWwgYnVmZmVycyAqLworfTsKKworLyoKKyAqIFJlbGF5ZnMgaW5vZGUKKyAqLworc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbworeworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvICpSRUxBWUZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOworfQorCisvKgorICogUmVsYXkgY2hhbm5lbCBjbGllbnQgY2FsbGJhY2tzCisgKi8KK3N0cnVjdCByY2hhbl9jYWxsYmFja3MKK3sKKwkvKgorCSAqIHN1YmJ1Zl9zdGFydCAtIGNhbGxlZCBvbiBidWZmZXItc3dpdGNoIHRvIGEgbmV3IHN1Yi1idWZmZXIKKwkgKiBAYnVmOiB0aGUgY2hhbm5lbCBidWZmZXIgY29udGFpbmluZyB0aGUgbmV3IHN1Yi1idWZmZXIKKwkgKiBAc3ViYnVmOiB0aGUgc3RhcnQgb2YgdGhlIG5ldyBzdWItYnVmZmVyCisJICogQHByZXZfc3ViYnVmOiB0aGUgc3RhcnQgb2YgdGhlIHByZXZpb3VzIHN1Yi1idWZmZXIKKwkgKiBAcHJldl9wYWRkaW5nOiB1bnVzZWQgc3BhY2UgYXQgdGhlIGVuZCBvZiBwcmV2aW91cyBzdWItYnVmZmVyCisJICoKKwkgKiBUaGUgY2xpZW50IHNob3VsZCByZXR1cm4gMSB0byBjb250aW51ZSBsb2dnaW5nLCAwIHRvIHN0b3AKKwkgKiBsb2dnaW5nLgorCSAqCisJICogTk9URTogc3ViYnVmX3N0YXJ0IHdpbGwgYWxzbyBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1ZmZlciBpcworCSAqICAgICAgIGNyZWF0ZWQsIHNvIHRoYXQgdGhlIGZpcnN0IHN1Yi1idWZmZXIgY2FuIGJlIGluaXRpYWxpemVkCisJICogICAgICAgaWYgbmVjZXNzYXJ5LiAgSW4gdGhpcyBjYXNlLCBwcmV2X3N1YmJ1ZiB3aWxsIGJlIE5VTEwuCisJICoKKwkgKiBOT1RFOiB0aGUgY2xpZW50IGNhbiByZXNlcnZlIGJ5dGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldworCSAqICAgICAgIHN1Yi1idWZmZXIgYnkgY2FsbGluZyBzdWJidWZfc3RhcnRfcmVzZXJ2ZSgpIGluIHRoaXMgY2FsbGJhY2suCisJICovCisJaW50ICgqc3ViYnVmX3N0YXJ0KSAoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJICAgICB2b2lkICpzdWJidWYsCisJCQkgICAgIHZvaWQgKnByZXZfc3ViYnVmLAorCQkJICAgICBzaXplX3QgcHJldl9wYWRkaW5nKTsKKworCS8qCisJICogYnVmX21hcHBlZCAtIHJlbGF5ZnMgYnVmZmVyIG1tYXAgbm90aWZpY2F0aW9uCisJICogQGJ1ZjogdGhlIGNoYW5uZWwgYnVmZmVyCisJICogQGZpbHA6IHJlbGF5ZnMgZmlsZSBwb2ludGVyCisJICoKKwkgKiBDYWxsZWQgd2hlbiBhIHJlbGF5ZnMgZmlsZSBpcyBzdWNjZXNzZnVsbHkgbW1hcHBlZAorCSAqLworICAgICAgICB2b2lkICgqYnVmX21hcHBlZCkoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJICAgc3RydWN0IGZpbGUgKmZpbHApOworCisJLyoKKwkgKiBidWZfdW5tYXBwZWQgLSByZWxheWZzIGJ1ZmZlciB1bm1hcCBub3RpZmljYXRpb24KKwkgKiBAYnVmOiB0aGUgY2hhbm5lbCBidWZmZXIKKwkgKiBAZmlscDogcmVsYXlmcyBmaWxlIHBvaW50ZXIKKwkgKgorCSAqIENhbGxlZCB3aGVuIGEgcmVsYXlmcyBmaWxlIGlzIHN1Y2Nlc3NmdWxseSB1bm1hcHBlZAorCSAqLworICAgICAgICB2b2lkICgqYnVmX3VubWFwcGVkKShzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKK307CisKKy8qCisgKiByZWxheWZzIGtlcm5lbCBBUEksIGZzL3JlbGF5ZnMvcmVsYXkuYworICovCisKK3N0cnVjdCByY2hhbiAqcmVsYXlfb3Blbihjb25zdCBjaGFyICpiYXNlX2ZpbGVuYW1lLAorCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCSBzaXplX3Qgc3ViYnVmX3NpemUsCisJCQkgc2l6ZV90IG5fc3ViYnVmcywKKwkJCSBzdHJ1Y3QgcmNoYW5fY2FsbGJhY2tzICpjYik7CitleHRlcm4gdm9pZCByZWxheV9jbG9zZShzdHJ1Y3QgcmNoYW4gKmNoYW4pOworZXh0ZXJuIHZvaWQgcmVsYXlfZmx1c2goc3RydWN0IHJjaGFuICpjaGFuKTsKK2V4dGVybiB2b2lkIHJlbGF5X3N1YmJ1ZnNfY29uc3VtZWQoc3RydWN0IHJjaGFuICpjaGFuLAorCQkJCSAgIHVuc2lnbmVkIGludCBjcHUsCisJCQkJICAgc2l6ZV90IGNvbnN1bWVkKTsKK2V4dGVybiB2b2lkIHJlbGF5X3Jlc2V0KHN0cnVjdCByY2hhbiAqY2hhbik7CitleHRlcm4gaW50IHJlbGF5X2J1Zl9mdWxsKHN0cnVjdCByY2hhbl9idWYgKmJ1Zik7CisKK2V4dGVybiBzaXplX3QgcmVsYXlfc3dpdGNoX3N1YmJ1ZihzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisJCQkJICBzaXplX3QgbGVuZ3RoKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpyZWxheWZzX2NyZWF0ZV9kaXIoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCk7CitleHRlcm4gaW50IHJlbGF5ZnNfcmVtb3ZlX2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCisvKioKKyAqCXJlbGF5X3dyaXRlIC0gd3JpdGUgZGF0YSBpbnRvIHRoZSBjaGFubmVsCisgKglAY2hhbjogcmVsYXkgY2hhbm5lbAorICoJQGRhdGE6IGRhdGEgdG8gYmUgd3JpdHRlbgorICoJQGxlbmd0aDogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKgorICoJV3JpdGVzIGRhdGEgaW50byB0aGUgY3VycmVudCBjcHUncyBjaGFubmVsIGJ1ZmZlci4KKyAqCisgKglQcm90ZWN0cyB0aGUgYnVmZmVyIGJ5IGRpc2FibGluZyBpbnRlcnJ1cHRzLiAgVXNlIHRoaXMKKyAqCWlmIHlvdSBtaWdodCBiZSBsb2dnaW5nIGZyb20gaW50ZXJydXB0IGNvbnRleHQuICBUcnkKKyAqCV9fcmVsYXlfd3JpdGUoKSBpZiB5b3Uga25vdyB5b3UJd29uJ3QgYmUgbG9nZ2luZyBmcm9tCisgKglpbnRlcnJ1cHQgY29udGV4dC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlbGF5X3dyaXRlKHN0cnVjdCByY2hhbiAqY2hhbiwKKwkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWY7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYnVmID0gY2hhbi0+YnVmW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gY2hhbi0+c3ViYnVmX3NpemUpKQorCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKKwltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5vZmZzZXQsIGRhdGEsIGxlbmd0aCk7CisJYnVmLT5vZmZzZXQgKz0gbGVuZ3RoOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKglfX3JlbGF5X3dyaXRlIC0gd3JpdGUgZGF0YSBpbnRvIHRoZSBjaGFubmVsCisgKglAY2hhbjogcmVsYXkgY2hhbm5lbAorICoJQGRhdGE6IGRhdGEgdG8gYmUgd3JpdHRlbgorICoJQGxlbmd0aDogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKgorICoJV3JpdGVzIGRhdGEgaW50byB0aGUgY3VycmVudCBjcHUncyBjaGFubmVsIGJ1ZmZlci4KKyAqCisgKglQcm90ZWN0cyB0aGUgYnVmZmVyIGJ5IGRpc2FibGluZyBwcmVlbXB0aW9uLiAgVXNlCisgKglyZWxheV93cml0ZSgpIGlmIHlvdSBtaWdodCBiZSBsb2dnaW5nIGZyb20gaW50ZXJydXB0CisgKgljb250ZXh0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19yZWxheV93cml0ZShzdHJ1Y3QgcmNoYW4gKmNoYW4sCisJCQkJIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOworCisJYnVmID0gY2hhbi0+YnVmW2dldF9jcHUoKV07CisJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpCisJCWxlbmd0aCA9IHJlbGF5X3N3aXRjaF9zdWJidWYoYnVmLCBsZW5ndGgpOworCW1lbWNweShidWYtPmRhdGEgKyBidWYtPm9mZnNldCwgZGF0YSwgbGVuZ3RoKTsKKwlidWYtPm9mZnNldCArPSBsZW5ndGg7CisJcHV0X2NwdSgpOworfQorCisvKioKKyAqCXJlbGF5X3Jlc2VydmUgLSByZXNlcnZlIHNsb3QgaW4gY2hhbm5lbCBidWZmZXIKKyAqCUBjaGFuOiByZWxheSBjaGFubmVsCisgKglAbGVuZ3RoOiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVzZXJ2ZQorICoKKyAqCVJldHVybnMgcG9pbnRlciB0byByZXNlcnZlZCBzbG90LCBOVUxMIGlmIGZ1bGwuCisgKgorICoJUmVzZXJ2ZXMgYSBzbG90IGluIHRoZSBjdXJyZW50IGNwdSdzIGNoYW5uZWwgYnVmZmVyLgorICoJRG9lcyBub3QgcHJvdGVjdCB0aGUgYnVmZmVyIGF0IGFsbCAtIGNhbGxlciBtdXN0IHByb3ZpZGUKKyAqCWFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpyZWxheV9yZXNlcnZlKHN0cnVjdCByY2hhbiAqY2hhbiwgc2l6ZV90IGxlbmd0aCkKK3sKKwl2b2lkICpyZXNlcnZlZDsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBjaGFuLT5idWZbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKworCWlmICh1bmxpa2VseShidWYtPm9mZnNldCArIGxlbmd0aCA+IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUpKSB7CisJCWxlbmd0aCA9IHJlbGF5X3N3aXRjaF9zdWJidWYoYnVmLCBsZW5ndGgpOworCQlpZiAoIWxlbmd0aCkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXNlcnZlZCA9IGJ1Zi0+ZGF0YSArIGJ1Zi0+b2Zmc2V0OworCWJ1Zi0+b2Zmc2V0ICs9IGxlbmd0aDsKKworCXJldHVybiByZXNlcnZlZDsKK30KKworLyoqCisgKglzdWJidWZfc3RhcnRfcmVzZXJ2ZSAtIHJlc2VydmUgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIGEgc3ViLWJ1ZmZlcgorICoJQGJ1ZjogcmVsYXkgY2hhbm5lbCBidWZmZXIKKyAqCUBsZW5ndGg6IG51bWJlciBvZiBieXRlcyB0byByZXNlcnZlCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gcmVzZXJ2ZSBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mCisgKglhIHN1Yi1idWZmZXIgaW4gdGhlIHN1YmJ1Zl9zdGFydCgpIGNhbGxiYWNrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3ViYnVmX3N0YXJ0X3Jlc2VydmUoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAorCQkJCQlzaXplX3QgbGVuZ3RoKQoreworCUJVR19PTihsZW5ndGggPj0gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSAtIDEpOworCWJ1Zi0+b2Zmc2V0ID0gbGVuZ3RoOworfQorCisvKgorICogZXhwb3J0ZWQgcmVsYXlmcyBmaWxlIG9wZXJhdGlvbnMsIGZzL3JlbGF5ZnMvaW5vZGUuYworICovCisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlbGF5ZnNfZmlsZV9vcGVyYXRpb25zOworCisjZW5kaWYgLyogX0xJTlVYX1JFTEFZRlNfRlNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggZGVjNTgyNy4uNGI4M2NiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMzUsNiArMzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogCisjaW5jbHVkZSA8bGludXgvYXV4dmVjLmg+CS8qIEZvciBBVF9WRUNUT1JfU0laRSAqLworCiBzdHJ1Y3QgZXhlY19kb21haW47CiAKIC8qCkBAIC0xMTIsNiArMTE0LDcgQEAKICNkZWZpbmUgVEFTS19UUkFDRUQJCTgKICNkZWZpbmUgRVhJVF9aT01CSUUJCTE2CiAjZGVmaW5lIEVYSVRfREVBRAkJMzIKKyNkZWZpbmUgVEFTS19OT05JTlRFUkFDVElWRQk2NAogCiAjZGVmaW5lIF9fc2V0X3Rhc2tfc3RhdGUodHNrLCBzdGF0ZV92YWx1ZSkJCVwKIAlkbyB7ICh0c2spLT5zdGF0ZSA9IChzdGF0ZV92YWx1ZSk7IH0gd2hpbGUgKDApCkBAIC0xNzYsNiArMTc5LDIzIEBACiBleHRlcm4gdm9pZCB1cGRhdGVfcHJvY2Vzc190aW1lcyhpbnQgdXNlcik7CiBleHRlcm4gdm9pZCBzY2hlZHVsZXJfdGljayh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUAorZXh0ZXJuIHZvaWQgc29mdGxvY2t1cF90aWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHNwYXduX3NvZnRsb2NrdXBfdGFzayh2b2lkKTsKK2V4dGVybiB2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNvZnRsb2NrdXBfdGljayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGF3bl9zb2Z0bG9ja3VwX3Rhc2sodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKHZvaWQpCit7Cit9CisjZW5kaWYKKworCiAvKiBBdHRhY2ggdG8gYW55IGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgYmUgaWdub3JlZCBpbiB3Y2hhbiBvdXRwdXQuICovCiAjZGVmaW5lIF9fc2NoZWQJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuc2NoZWQudGV4dCIpKSkKIC8qIElzIHRoaXMgYWRkcmVzcyBpbiB0aGUgX19zY2hlZCBmdW5jdGlvbnM/ICovCkBAIC0xODMsNiArMjAzLDggQEAKIAogI2RlZmluZQlNQVhfU0NIRURVTEVfVElNRU9VVAlMT05HX01BWAogZXh0ZXJuIHNpZ25lZCBsb25nIEZBU1RDQUxMKHNjaGVkdWxlX3RpbWVvdXQoc2lnbmVkIGxvbmcgdGltZW91dCkpOworZXh0ZXJuIHNpZ25lZCBsb25nIHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzaWduZWQgbG9uZyB0aW1lb3V0KTsKK2V4dGVybiBzaWduZWQgbG9uZyBzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShzaWduZWQgbG9uZyB0aW1lb3V0KTsKIGFzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZSh2b2lkKTsKIAogc3RydWN0IG5hbWVzcGFjZTsKQEAgLTI0NCw3ICsyNjYsNyBAQAogCW1tX2NvdW50ZXJfdCBfcnNzOwogCW1tX2NvdW50ZXJfdCBfYW5vbl9yc3M7CiAKLQl1bnNpZ25lZCBsb25nIHNhdmVkX2F1eHZbNDJdOyAvKiBmb3IgL3Byb2MvUElEL2F1eHYgKi8KKwl1bnNpZ25lZCBsb25nIHNhdmVkX2F1eHZbQVRfVkVDVE9SX1NJWkVdOyAvKiBmb3IgL3Byb2MvUElEL2F1eHYgKi8KIAogCXVuc2lnbmVkIGR1bXBhYmxlOjI7CiAJY3B1bWFza190IGNwdV92bV9tYXNrOwpAQCAtNTQ1LDEzICs1NjcsNiBAQAogCiBleHRlcm4gdm9pZCBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhjcHVtYXNrX3QgKnBhcnRpdGlvbjEsCiAJCQkJICAgIGNwdW1hc2tfdCAqcGFydGl0aW9uMik7Ci0jaWZkZWYgQVJDSF9IQVNfU0NIRURfRE9NQUlOCi0vKiBVc2VmdWwgaGVscGVycyB0aGF0IGFyY2ggc2V0dXAgY29kZSBtYXkgdXNlLiBEZWZpbmVkIGluIGtlcm5lbC9zY2hlZC5jICovCi1leHRlcm4gY3B1bWFza190IGNwdV9pc29sYXRlZF9tYXA7Ci1leHRlcm4gdm9pZCBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZ3JvdXAgZ3JvdXBzW10sCi0JICAgICAgICAgICAgICAgICAgICAgICAgY3B1bWFza190IHNwYW4sIGludCAoKmdyb3VwX2ZuKShpbnQgY3B1KSk7Ci1leHRlcm4gdm9pZCBjcHVfYXR0YWNoX2RvbWFpbihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSk7Ci0jZW5kaWYgLyogQVJDSF9IQVNfU0NIRURfRE9NQUlOICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAKQEAgLTU5Miw2ICs2MDcsMTEgQEAKICNkZWZpbmUgR1JPVVBfQVQoZ2ksIGkpIFwKICAgICAoKGdpKS0+YmxvY2tzWyhpKS9OR1JPVVBTX1BFUl9CTE9DS11bKGkpJU5HUk9VUFNfUEVSX0JMT0NLXSkKIAorI2lmZGVmIEFSQ0hfSEFTX1BSRUZFVENIX1NXSVRDSF9TVEFDSworZXh0ZXJuIHZvaWQgcHJlZmV0Y2hfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0Kik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkgeyB9CisjZW5kaWYKIAogc3RydWN0IGF1ZGl0X2NvbnRleHQ7CQkvKiBTZWUgYXVkaXQuYyAqLwogc3RydWN0IG1lbXBvbGljeTsKQEAgLTc2NSw2ICs3ODUsNyBAQAogCXNob3J0IGlsX25leHQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ1BVU0VUUworCXNob3J0IGNwdXNldF9zZW1fbmVzdF9kZXB0aDsKIAlzdHJ1Y3QgY3B1c2V0ICpjcHVzZXQ7CiAJbm9kZW1hc2tfdCBtZW1zX2FsbG93ZWQ7CiAJaW50IGNwdXNldF9tZW1zX2dlbmVyYXRpb247CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggN2FhYjZhYi4uNTViMDJlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMjUwLDI5ICsyNTAsMzcgQEAKICAqCUBpbm9kZSBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlLgogICoJRGVhbGxvY2F0ZSB0aGUgaW5vZGUgc2VjdXJpdHkgc3RydWN0dXJlIGFuZCBzZXQgQGlub2RlLT5pX3NlY3VyaXR5IHRvCiAgKglOVUxMLiAKKyAqIEBpbm9kZV9pbml0X3NlY3VyaXR5OgorICogCU9idGFpbiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlIG5hbWUgc3VmZml4IGFuZCB2YWx1ZSB0byBzZXQgb24gYSBuZXdseQorICoJY3JlYXRlZCBpbm9kZSBhbmQgc2V0IHVwIHRoZSBpbmNvcmUgc2VjdXJpdHkgZmllbGQgZm9yIHRoZSBuZXcgaW5vZGUuCisgKglUaGlzIGhvb2sgaXMgY2FsbGVkIGJ5IHRoZSBmcyBjb2RlIGFzIHBhcnQgb2YgdGhlIGlub2RlIGNyZWF0aW9uCisgKgl0cmFuc2FjdGlvbiBhbmQgcHJvdmlkZXMgZm9yIGF0b21pYyBsYWJlbGluZyBvZiB0aGUgaW5vZGUsIHVubGlrZQorICoJdGhlIHBvc3RfY3JlYXRlL21rZGlyLy4uLiBob29rcyBjYWxsZWQgYnkgdGhlIFZGUy4gIFRoZSBob29rIGZ1bmN0aW9uCisgKglpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSB0aGUgbmFtZSBhbmQgdmFsdWUgdmlhIGttYWxsb2MsIHdpdGggdGhlIGNhbGxlcgorICoJYmVpbmcgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcga2ZyZWUgYWZ0ZXIgdXNpbmcgdGhlbS4KKyAqCUlmIHRoZSBzZWN1cml0eSBtb2R1bGUgZG9lcyBub3QgdXNlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgb3IgZG9lcworICoJbm90IHdpc2ggdG8gcHV0IGEgc2VjdXJpdHkgYXR0cmlidXRlIG9uIHRoaXMgcGFydGljdWxhciBpbm9kZSwKKyAqCXRoZW4gaXQgc2hvdWxkIHJldHVybiAtRU9QTk9UU1VQUCB0byBza2lwIHRoaXMgcHJvY2Vzc2luZy4KKyAqCUBpbm9kZSBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBuZXdseSBjcmVhdGVkIGlub2RlLgorICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICoJQG5hbWUgd2lsbCBiZSBzZXQgdG8gdGhlIGFsbG9jYXRlZCBuYW1lIHN1ZmZpeCAoZS5nLiBzZWxpbnV4KS4KKyAqCUB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgYWxsb2NhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCUBsZW4gd2lsbCBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUuCisgKglSZXR1cm5zIDAgaWYgQG5hbWUgYW5kIEB2YWx1ZSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwKKyAqCQktRU9QTk9UU1VQUCBpZiBubyBzZWN1cml0eSBhdHRyaWJ1dGUgaXMgbmVlZGVkLCBvcgorICoJCS1FTk9NRU0gb24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KICAqIEBpbm9kZV9jcmVhdGU6CiAgKglDaGVjayBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJlZ3VsYXIgZmlsZS4KICAqCUBkaXIgY29udGFpbnMgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBmaWxlLgogICoJQGRlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZC4KICAqCUBtb2RlIGNvbnRhaW5zIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZC4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEBpbm9kZV9wb3N0X2NyZWF0ZToKLSAqCVNldCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvbiBhIG5ld2x5IGNyZWF0ZWQgcmVndWxhciBmaWxlLiAgVGhpcyBob29rCi0gKglpcyBjYWxsZWQgYWZ0ZXIgYSBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLgotICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBuZXcgZmlsZS4KLSAqCUBkZW50cnkgY29udGFpbnMgdGhlIHRoZSBkZW50cnkgc3RydWN0dXJlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBmaWxlLgotICoJQG1vZGUgY29udGFpbnMgdGhlIGZpbGUgbW9kZS4KICAqIEBpbm9kZV9saW5rOgogICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgaGFyZCBsaW5rIHRvIGEgZmlsZS4KICAqCUBvbGRfZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIGZvciBhbiBleGlzdGluZyBsaW5rIHRvIHRoZSBmaWxlLgogICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBuZXcgbGluay4KICAqCUBuZXdfZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIGZvciB0aGUgbmV3IGxpbmsuCiAgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCi0gKiBAaW5vZGVfcG9zdF9saW5rOgotICoJU2V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMgZm9yIGEgbmV3IGhhcmQgbGluayB0byBhIGZpbGUuCi0gKglAb2xkX2RlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBmb3IgdGhlIGV4aXN0aW5nIGxpbmsuCi0gKglAZGlyIGNvbnRhaW5zIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIG5ldyBmaWxlLgotICoJQG5ld19kZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgZmlsZSBsaW5rLgogICogQGlub2RlX3VubGluazoKICAqCUNoZWNrIHRoZSBwZXJtaXNzaW9uIHRvIHJlbW92ZSBhIGhhcmQgbGluayB0byBhIGZpbGUuIAogICoJQGRpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIG9mIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUuCkBAIC0yODQsMTMgKzI5Miw2IEBACiAgKglAZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIG9mIHRoZSBzeW1ib2xpYyBsaW5rLgogICoJQG9sZF9uYW1lIGNvbnRhaW5zIHRoZSBwYXRobmFtZSBvZiBmaWxlLgogICoJUmV0dXJuIDAgaWYgcGVybWlzc2lvbiBpcyBncmFudGVkLgotICogQGlub2RlX3Bvc3Rfc3ltbGluazoKLSAqCUBkaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgbmV3IGxpbmsuCi0gKglAZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIG9mIG5ldyBzeW1ib2xpYyBsaW5rLgotICoJQG9sZF9uYW1lIGNvbnRhaW5zIHRoZSBwYXRobmFtZSBvZiBmaWxlLgotICoJU2V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMgZm9yIGEgbmV3bHkgY3JlYXRlZCBzeW1ib2xpYyBsaW5rLiAgTm90ZSB0aGF0Ci0gKglAZGVudHJ5LT5kX2lub2RlIG1heSBiZSBOVUxMLCBzaW5jZSB0aGUgZmlsZXN5c3RlbSBtaWdodCBub3QKLSAqCWluc3RhbnRpYXRlIHRoZSBkZW50cnkgKGUuZy4gTkZTKS4KICAqIEBpbm9kZV9ta2RpcjoKICAqCUNoZWNrIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIGV4aXN0aW5nIGRpcmVjdG9yeQogICoJYXNzb2NpYXRlZCB3aXRoIGlub2RlIHN0cmN0dXJlIEBkaXIuIApAQCAtMjk4LDExICsyOTksNiBAQAogICoJQGRlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBvZiBuZXcgZGlyZWN0b3J5LgogICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgbmV3IGRpcmVjdG9yeS4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEBpbm9kZV9wb3N0X21rZGlyOgotICoJU2V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMgb24gYSBuZXdseSBjcmVhdGVkIGRpcmVjdG9yeS4KLSAqCUBkaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBvZiBwYXJlbnQgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSBjcmVhdGVkLgotICoJQGRlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBvZiBuZXcgZGlyZWN0b3J5LgotICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgbmV3IGRpcmVjdG9yeS4KICAqIEBpbm9kZV9ybWRpcjoKICAqCUNoZWNrIHRoZSBwZXJtaXNzaW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KICAqCUBkaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBvZiBwYXJlbnQgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkLgpAQCAtMzE4LDEzICszMTQsNiBAQAogICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgdGhlIG5ldyBmaWxlLgogICoJQGRldiBjb250YWlucyB0aGUgdGhlIGRldmljZSBudW1iZXIuCiAgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuCi0gKiBAaW5vZGVfcG9zdF9ta25vZDoKLSAqCVNldCBzZWN1cml0eSBhdHRyaWJ1dGVzIG9uIGEgbmV3bHkgY3JlYXRlZCBzcGVjaWFsIGZpbGUgKG9yIHNvY2tldCBvcgotICoJZmlmbyBmaWxlIGNyZWF0ZWQgdmlhIHRoZSBta25vZCBzeXN0ZW0gY2FsbCkuCi0gKglAZGlyIGNvbnRhaW5zIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgb2YgcGFyZW50IG9mIHRoZSBuZXcgbm9kZS4KLSAqCUBkZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgb2YgdGhlIG5ldyBub2RlLgotICoJQG1vZGUgY29udGFpbnMgdGhlIG1vZGUgb2YgdGhlIG5ldyBub2RlLgotICoJQGRldiBjb250YWlucyB0aGUgdGhlIGRldmljZSBudW1iZXIuCiAgKiBAaW5vZGVfcmVuYW1lOgogICoJQ2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gcmVuYW1lIGEgZmlsZSBvciBkaXJlY3RvcnkuCiAgKglAb2xkX2RpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIGZvciBwYXJlbnQgb2YgdGhlIG9sZCBsaW5rLgpAQCAtMzMyLDEyICszMjEsNiBAQAogICoJQG5ld19kaXIgY29udGFpbnMgdGhlIGlub2RlIHN0cnVjdHVyZSBmb3IgcGFyZW50IG9mIHRoZSBuZXcgbGluay4KICAqCUBuZXdfZGVudHJ5IGNvbnRhaW5zIHRoZSBkZW50cnkgc3RydWN0dXJlIG9mIHRoZSBuZXcgbGluay4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KLSAqIEBpbm9kZV9wb3N0X3JlbmFtZToKLSAqCVNldCBzZWN1cml0eSBhdHRyaWJ1dGVzIG9uIGEgcmVuYW1lZCBmaWxlIG9yIGRpcmVjdG9yeS4KLSAqCUBvbGRfZGlyIGNvbnRhaW5zIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgZm9yIHBhcmVudCBvZiB0aGUgb2xkIGxpbmsuCi0gKglAb2xkX2RlbnRyeSBjb250YWlucyB0aGUgZGVudHJ5IHN0cnVjdHVyZSBvZiB0aGUgb2xkIGxpbmsuCi0gKglAbmV3X2RpciBjb250YWlucyB0aGUgaW5vZGUgc3RydWN0dXJlIGZvciBwYXJlbnQgb2YgdGhlIG5ldyBsaW5rLgotICoJQG5ld19kZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgb2YgdGhlIG5ldyBsaW5rLgogICogQGlub2RlX3JlYWRsaW5rOgogICoJQ2hlY2sgdGhlIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3ltYm9saWMgbGluay4KICAqCUBkZW50cnkgY29udGFpbnMgdGhlIGRlbnRyeSBzdHJ1Y3R1cmUgZm9yIHRoZSBmaWxlIGxpbmsuCkBAIC0xMDgwLDM0ICsxMDYzLDIxIEBACiAKIAlpbnQgKCppbm9kZV9hbGxvY19zZWN1cml0eSkgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwkKIAl2b2lkICgqaW5vZGVfZnJlZV9zZWN1cml0eSkgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCWludCAoKmlub2RlX2luaXRfc2VjdXJpdHkpIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgICAgY2hhciAqKm5hbWUsIHZvaWQgKip2YWx1ZSwgc2l6ZV90ICpsZW4pOwogCWludCAoKmlub2RlX2NyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqZGlyLAogCSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOwotCXZvaWQgKCppbm9kZV9wb3N0X2NyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqZGlyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOwogCWludCAoKmlub2RlX2xpbmspIChzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAogCSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7Ci0Jdm9pZCAoKmlub2RlX3Bvc3RfbGluaykgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKIAlpbnQgKCppbm9kZV91bmxpbmspIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAlpbnQgKCppbm9kZV9zeW1saW5rKSAoc3RydWN0IGlub2RlICpkaXIsCiAJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqb2xkX25hbWUpOwotCXZvaWQgKCppbm9kZV9wb3N0X3N5bWxpbmspIChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvbGRfbmFtZSk7CiAJaW50ICgqaW5vZGVfbWtkaXIpIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSk7Ci0Jdm9pZCAoKmlub2RlX3Bvc3RfbWtkaXIpIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAKLQkJCSAgICBpbnQgbW9kZSk7CiAJaW50ICgqaW5vZGVfcm1kaXIpIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAlpbnQgKCppbm9kZV9ta25vZCkgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgZGV2X3QgZGV2KTsKLQl2b2lkICgqaW5vZGVfcG9zdF9ta25vZCkgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgZGV2X3QgZGV2KTsKIAlpbnQgKCppbm9kZV9yZW5hbWUpIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKLQl2b2lkICgqaW5vZGVfcG9zdF9yZW5hbWUpIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CiAJaW50ICgqaW5vZGVfcmVhZGxpbmspIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogCWludCAoKmlub2RlX2ZvbGxvd19saW5rKSAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiAJaW50ICgqaW5vZGVfcGVybWlzc2lvbikgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CkBAIC0xNDQyLDYgKzE0MTIsMTcgQEAKIAkJcmV0dXJuOwogCXNlY3VyaXR5X29wcy0+aW5vZGVfZnJlZV9zZWN1cml0eSAoaW5vZGUpOwogfQorCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5IChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGlub2RlICpkaXIsCisJCQkJCQljaGFyICoqbmFtZSwKKwkJCQkJCXZvaWQgKip2YWx1ZSwKKwkJCQkJCXNpemVfdCAqbGVuKQoreworCWlmICh1bmxpa2VseSAoSVNfUFJJVkFURSAoaW5vZGUpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX2luaXRfc2VjdXJpdHkgKGlub2RlLCBkaXIsIG5hbWUsIHZhbHVlLCBsZW4pOworfQogCQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKQEAgLTE0NTIsMTUgKzE0MzMsNiBAQAogCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX2NyZWF0ZSAoZGlyLCBkZW50cnksIG1vZGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkgICAgICAgaW50IG1vZGUpCi17Ci0JaWYgKGRlbnRyeS0+ZF9pbm9kZSAmJiB1bmxpa2VseSAoSVNfUFJJVkFURSAoZGVudHJ5LT5kX2lub2RlKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3RfY3JlYXRlIChkaXIsIGRlbnRyeSwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQpAQCAtMTQ3MCwxNSArMTQ0Miw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+aW5vZGVfbGluayAob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfbGluayAoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQotewotCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlICYmIHVubGlrZWx5IChJU19QUklWQVRFIChuZXdfZGVudHJ5LT5kX2lub2RlKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3RfbGluayAob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKQEAgLTE0OTYsMTUgKzE0NTksNiBAQAogCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX3N5bWxpbmsgKGRpciwgZGVudHJ5LCBvbGRfbmFtZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkJY29uc3QgY2hhciAqb2xkX25hbWUpCi17Ci0JaWYgKGRlbnRyeS0+ZF9pbm9kZSAmJiB1bmxpa2VseSAoSVNfUFJJVkFURSAoZGVudHJ5LT5kX2lub2RlKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3Rfc3ltbGluayAoZGlyLCBkZW50cnksIG9sZF9uYW1lKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfbWtkaXIgKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCWludCBtb2RlKQpAQCAtMTUxNCwxNSArMTQ2OCw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+aW5vZGVfbWtkaXIgKGRpciwgZGVudHJ5LCBtb2RlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJCSAgICAgIGludCBtb2RlKQotewotCWlmIChkZW50cnktPmRfaW5vZGUgJiYgdW5saWtlbHkgKElTX1BSSVZBVEUgKGRlbnRyeS0+ZF9pbm9kZSkpKQotCQlyZXR1cm47Ci0Jc2VjdXJpdHlfb3BzLT5pbm9kZV9wb3N0X21rZGlyIChkaXIsIGRlbnRyeSwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtMTU0MCwxNSArMTQ4NSw2IEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+aW5vZGVfbWtub2QgKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9ta25vZCAoc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkJICAgICAgaW50IG1vZGUsIGRldl90IGRldikKLXsKLQlpZiAoZGVudHJ5LT5kX2lub2RlICYmIHVubGlrZWx5IChJU19QUklWQVRFIChkZW50cnktPmRfaW5vZGUpKSkKLQkJcmV0dXJuOwotCXNlY3VyaXR5X29wcy0+aW5vZGVfcG9zdF9ta25vZCAoZGlyLCBkZW50cnksIG1vZGUsIGRldik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX3JlbmFtZSAoc3RydWN0IGlub2RlICpvbGRfZGlyLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKIAkJCQkJIHN0cnVjdCBpbm9kZSAqbmV3X2RpciwKQEAgLTE1NjEsMTggKzE0OTcsNiBAQAogCQkJCQkgICBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLAotCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsKLQlpZiAodW5saWtlbHkgKElTX1BSSVZBVEUgKG9sZF9kZW50cnktPmRfaW5vZGUpIHx8Ci0JICAgIChuZXdfZGVudHJ5LT5kX2lub2RlICYmIElTX1BSSVZBVEUgKG5ld19kZW50cnktPmRfaW5vZGUpKSkpCi0JCXJldHVybjsKLQlzZWN1cml0eV9vcHMtPmlub2RlX3Bvc3RfcmVuYW1lIChvbGRfZGlyLCBvbGRfZGVudHJ5LAotCQkJCQkJbmV3X2RpciwgbmV3X2RlbnRyeSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX3JlYWRsaW5rIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJaWYgKHVubGlrZWx5IChJU19QUklWQVRFIChkZW50cnktPmRfaW5vZGUpKSkKQEAgLTIxNzEsNiArMjA5NSwxNSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfZnJlZSAoc3RydWN0IGlub2RlICppbm9kZSkKIHsgfQorCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5IChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IGlub2RlICpkaXIsCisJCQkJCQljaGFyICoqbmFtZSwKKwkJCQkJCXZvaWQgKip2YWx1ZSwKKwkJCQkJCXNpemVfdCAqbGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KIAkKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2NyZWF0ZSAoc3RydWN0IGlub2RlICpkaXIsCiAJCQkJCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCkBAIC0yMTc5LDExICsyMTEyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkJICAgICAgIGludCBtb2RlKQoteyB9Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQpAQCAtMjE5MSwxMSArMjExOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0JCQkJCSAgICAgc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV91bmxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtMjIwOSwxMSArMjEzMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkJY29uc3QgY2hhciAqb2xkX25hbWUpCi17IH0KLQogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfbWtkaXIgKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCWludCBtb2RlKQpAQCAtMjIyMSwxMSArMjEzOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9pbm9kZV9wb3N0X21rZGlyIChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQkgICAgICBpbnQgbW9kZSkKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9ybWRpciAoc3RydWN0IGlub2RlICpkaXIsCiAJCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKQEAgLTIyMzksMTEgKzIxNTIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9ta25vZCAoc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkJICAgICAgaW50IG1vZGUsIGRldl90IGRldikKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqb2xkX2RpciwKIAkJCQkJIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkJCSBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsCkBAIC0yMjUyLDEyICsyMTYwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLAotCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsgfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9yZWFkbGluayAoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZW0uaCBiL2luY2x1ZGUvbGludXgvc2VtLmgKaW5kZXggMmQ4NTE2Yi4uMTA2Zjk3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlbS5oCkBAIC04OCw2ICs4OCw3IEBACiAvKiBPbmUgc2VtX2FycmF5IGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIHNldCBvZiBzZW1hcGhvcmVzIGluIHRoZSBzeXN0ZW0uICovCiBzdHJ1Y3Qgc2VtX2FycmF5IHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybQlzZW1fcGVybTsJLyogcGVybWlzc2lvbnMgLi4gc2VlIGlwYy5oICovCisJaW50CQkJc2VtX2lkOwogCXRpbWVfdAkJCXNlbV9vdGltZTsJLyogbGFzdCBzZW1vcCB0aW1lICovCiAJdGltZV90CQkJc2VtX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCiAJc3RydWN0IHNlbQkJKnNlbV9iYXNlOwkvKiBwdHIgdG8gZmlyc3Qgc2VtYXBob3JlIGluIGFycmF5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKaW5kZXggZDhhMDIzZC4uMzE3YTk3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaApAQCAtMzAsNiArMzAsMjEgQEAKIH07CiAKIC8qCisgKiBBbGxvY2F0ZSA4MjUwIHBsYXRmb3JtIGRldmljZSBJRHMuICBOb3RoaW5nIGlzIGltcGxpZWQgYnkKKyAqIHRoZSBudW1iZXJpbmcgaGVyZSwgZXhjZXB0IGZvciB0aGUgbGVnYWN5IGVudHJ5IGJlaW5nIC0xLgorICovCitlbnVtIHsKKwlQTEFUODI1MF9ERVZfTEVHQUNZID0gLTEsCisJUExBVDgyNTBfREVWX1BMQVRGT1JNLAorCVBMQVQ4MjUwX0RFVl9QTEFURk9STTEsCisJUExBVDgyNTBfREVWX0ZPVVJQT1JULAorCVBMQVQ4MjUwX0RFVl9BQ0NFTlQsCisJUExBVDgyNTBfREVWX0JPQ0EsCisJUExBVDgyNTBfREVWX0hVQjYsCisJUExBVDgyNTBfREVWX01DQSwKK307CisKKy8qCiAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGJ5IGRyaXZlcnMgd2hpY2ggd2FudCB0byByZWdpc3RlcgogICogdGhlaXIgb3duIDgyNTAgcG9ydHMgd2l0aG91dCByZWdpc3RlcmluZyB0aGVpciBvd24KICAqIHBsYXRmb3JtIGRldmljZS4gIFVzaW5nIHRoZXNlIHdpbGwgbWFrZSB5b3VyIGRyaXZlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IGNmMGY2NGUuLjI3ZGI4ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTM4NSwxMSArMzg1LDExIEBACiAvKgogICogVGhlIGZvbGxvd2luZyBhcmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGxvdyBsZXZlbCBkcml2ZXJzLgogICovCi0jaWZkZWYgU1VQUE9SVF9TWVNSUQogc3RhdGljIGlubGluZSBpbnQKIHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNoLAogCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisjaWZkZWYgU1VQUE9SVF9TWVNSUQogCWlmIChwb3J0LT5zeXNycSkgewogCQlpZiAoY2ggJiYgdGltZV9iZWZvcmUoamlmZmllcywgcG9ydC0+c3lzcnEpKSB7CiAJCQloYW5kbGVfc3lzcnEoY2gsIHJlZ3MsIE5VTEwpOwpAQCAtMzk4LDEwICszOTgsMTEgQEAKIAkJfQogCQlwb3J0LT5zeXNycSA9IDA7CiAJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQotI2RlZmluZSB1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsY2gscmVncykJKDApCisjaWZuZGVmIFNVUFBPUlRfU1lTUlEKKyNkZWZpbmUgdWFydF9oYW5kbGVfc3lzcnFfY2hhcihwb3J0LGNoLHJlZ3MpIHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgMCwgTlVMTCkKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNDJlZGNlNi4uMjc0MWMwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0xMTY3LDcgKzExNjcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwc2tiX3RyaW1fcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKIHsKLQlpZiAobGVuID49IHNrYi0+bGVuKQorCWlmIChsaWtlbHkobGVuID49IHNrYi0+bGVuKSkKIAkJcmV0dXJuIDA7CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CkBAIC0xMjUxLDcgKzEyNTEsNyBAQAogICoJVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgb2Zmc2V0IGJhY2sgdG8gYSBzdHJ1Y3QgdGltZXZhbCBhbmQgc3RvcmVzCiAgKglpdCBpbiBzdGFtcC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNrYl9nZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aW1ldmFsICpzdGFtcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfZ2V0X3RpbWVzdGFtcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGltZXZhbCAqc3RhbXApCiB7CiAJc3RhbXAtPnR2X3NlYyAgPSBza2ItPnRzdGFtcC5vZmZfc2VjOwogCXN0YW1wLT50dl91c2VjID0gc2tiLT50c3RhbXAub2ZmX3VzZWM7CkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogICoJVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cnVjdCB0aW1ldmFsIHRvIGFuIG9mZnNldCBhbmQgc3RvcmVzCiAgKglpdCBpbiB0aGUgc2tiLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpbWV2YWwgKnN0YW1wKQorc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpzdGFtcCkKIHsKIAlza2ItPnRzdGFtcC5vZmZfc2VjICA9IHN0YW1wLT50dl9zZWMgLSBza2JfdHZfYmFzZS50dl9zZWM7CiAJc2tiLT50c3RhbXAub2ZmX3VzZWMgPSBzdGFtcC0+dHZfdXNlYyAtIHNrYl90dl9iYXNlLnR2X3VzZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IDgwYjJkZmQuLjFmMzU2ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC05OSwxMiArOTksMjcgQEAKIAlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAotZXh0ZXJuIHZvaWQgKmtjYWxsb2Moc2l6ZV90LCBzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CitleHRlcm4gdm9pZCAqa3phbGxvYyhzaXplX3QsIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CisKKy8qKgorICoga2NhbGxvYyAtIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBAbjogbnVtYmVyIG9mIGVsZW1lbnRzLgorICogQHNpemU6IGVsZW1lbnQgc2l6ZS4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmtjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCit7CisJaWYgKG4gIT0gMCAmJiBzaXplID4gSU5UX01BWCAvIG4pCisJCXJldHVybiBOVUxMOworCXJldHVybiBremFsbG9jKG4gKiBzaXplLCBmbGFncyk7Cit9CisKIGV4dGVybiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKik7CiBleHRlcm4gdW5zaWduZWQgaW50IGtzaXplKGNvbnN0IHZvaWQgKik7CiAKICNpZmRlZiBDT05GSUdfTlVNQQotZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKiwgaW50IGZsYWdzLCBpbnQgbm9kZSk7CitleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqLAorCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzLCBpbnQgbm9kZSk7CiBleHRlcm4gdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MsIGludCBub2RlKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgaW50IGZsYWdzLCBpbnQgbm9kZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ueXBpLmggYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCmluZGV4IDc2OGNiYmEuLmY1NmQyNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ueXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zb255cGkuaApAQCAtOTksNiArOTksOCBAQAogI2RlZmluZSBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQJCTU3CiAjZGVmaW5lIFNPTllQSV9FVkVOVF9CQVRURVJZX1JFTU9WRQkJNTgKICNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VECQk1OQorI2RlZmluZSBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04JCTYwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PRkYJCTYxCiAKIC8qIGdldC9zZXQgYnJpZ2h0bmVzcyAqLwogI2RlZmluZSBTT05ZUElfSU9DR0JSVAkJX0lPUigndicsIDAsIF9fdTgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKaW5kZXggZDZiYTA2OC4uY2RjOTlhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaApAQCAtMiw3ICsyLDQ4IEBACiAjZGVmaW5lIF9fTElOVVhfU1BJTkxPQ0tfSAogCiAvKgotICogaW5jbHVkZS9saW51eC9zcGlubG9jay5oIC0gZ2VuZXJpYyBsb2NraW5nIGRlY2xhcmF0aW9ucworICogaW5jbHVkZS9saW51eC9zcGlubG9jay5oIC0gZ2VuZXJpYyBzcGlubG9jay9yd2xvY2sgZGVjbGFyYXRpb25zCisgKgorICogaGVyZSdzIHRoZSByb2xlIG9mIHRoZSB2YXJpb3VzIHNwaW5sb2NrL3J3bG9jayByZWxhdGVkIGluY2x1ZGUgZmlsZXM6CisgKgorICogb24gU01QIGJ1aWxkczoKKyAqCisgKiAgYXNtL3NwaW5sb2NrX3R5cGVzLmg6IGNvbnRhaW5zIHRoZSByYXdfc3BpbmxvY2tfdC9yYXdfcndsb2NrX3QgYW5kIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMKKyAqCisgKiAgbGludXgvc3BpbmxvY2tfdHlwZXMuaDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyB0aGUgZ2VuZXJpYyB0eXBlIGFuZCBpbml0aWFsaXplcnMKKyAqCisgKiAgYXNtL3NwaW5sb2NrLmg6ICAgICAgIGNvbnRhaW5zIHRoZSBfX3Jhd19zcGluXyooKS9ldGMuIGxvd2xldmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucywgbW9zdGx5IGlubGluZSBhc3NlbWJseSBjb2RlCisgKgorICogICAoYWxzbyBpbmNsdWRlZCBvbiBVUC1kZWJ1ZyBidWlsZHM6KQorICoKKyAqICBsaW51eC9zcGlubG9ja19hcGlfc21wLmg6CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBwcm90b3R5cGVzIGZvciB0aGUgX3NwaW5fKigpIEFQSXMuCisgKgorICogIGxpbnV4L3NwaW5sb2NrLmg6ICAgICBidWlsZHMgdGhlIGZpbmFsIHNwaW5fKigpIEFQSXMuCisgKgorICogb24gVVAgYnVpbGRzOgorICoKKyAqICBsaW51eC9zcGlubG9ja190eXBlX3VwLmg6CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBnZW5lcmljLCBzaW1wbGlmaWVkIFVQIHNwaW5sb2NrIHR5cGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaCBpcyBhbiBlbXB0eSBzdHJ1Y3R1cmUgb24gbm9uLWRlYnVnIGJ1aWxkcykKKyAqCisgKiAgbGludXgvc3BpbmxvY2tfdHlwZXMuaDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyB0aGUgZ2VuZXJpYyB0eXBlIGFuZCBpbml0aWFsaXplcnMKKyAqCisgKiAgbGludXgvc3BpbmxvY2tfdXAuaDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIF9fcmF3X3NwaW5fKigpL2V0Yy4gdmVyc2lvbiBvZiBVUAorICogICAgICAgICAgICAgICAgICAgICAgICBidWlsZHMuICh3aGljaCBhcmUgTk9QcyBvbiBub24tZGVidWcsIG5vbi1wcmVlbXB0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkcykKKyAqCisgKiAgIChpbmNsdWRlZCBvbiBVUC1ub24tZGVidWcgYnVpbGRzOikKKyAqCisgKiAgbGludXgvc3BpbmxvY2tfYXBpX3VwLmg6CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkcyB0aGUgX3NwaW5fKigpIEFQSXMuCisgKgorICogIGxpbnV4L3NwaW5sb2NrLmg6ICAgICBidWlsZHMgdGhlIGZpbmFsIHNwaW5fKigpIEFQSXMuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpAQCAtMTMsNyArNTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBmb3IgY3B1IHJlbGF4ICovCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKgpAQCAtMzUsNDIzICs3NSw4NCBAQAogI2RlZmluZSBfX2xvY2tmdW5jIGZhc3RjYWxsIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5zcGlubG9jay50ZXh0IikpKQogCiAvKgotICogSWYgQ09ORklHX1NNUCBpcyBzZXQsIHB1bGwgaW4gdGhlIF9yYXdfKiBkZWZpbml0aW9ucworICogUHVsbCB0aGUgcmF3X3NwaW5sb2NrX3QgYW5kIHJhd19yd2xvY2tfdCBkZWZpbml0aW9uczoKICAqLwotI2lmZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgogCi0jZGVmaW5lIGFzc2VydF9zcGluX2xvY2tlZCh4KQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKHgpKQotI2luY2x1ZGUgPGFzbS9zcGlubG9jay5oPgorZXh0ZXJuIGludCBfX2xvY2tmdW5jIGdlbmVyaWNfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpsb2NrKTsKIAotaW50IF9fbG9ja2Z1bmMgX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKTsKLWludCBfX2xvY2tmdW5jIF9yZWFkX3RyeWxvY2socndsb2NrX3QgKmxvY2spOwotaW50IF9fbG9ja2Z1bmMgX3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spOwotCi12b2lkIF9fbG9ja2Z1bmMgX3NwaW5fbG9jayhzcGlubG9ja190ICpsb2NrKQlfX2FjcXVpcmVzKHNwaW5sb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2socndsb2NrX3QgKmxvY2spCV9fYWNxdWlyZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF93cml0ZV9sb2NrKHJ3bG9ja190ICpsb2NrKQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKLQotdm9pZCBfX2xvY2tmdW5jIF9zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQlfX3JlbGVhc2VzKHNwaW5sb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9yZWFkX3VubG9jayhyd2xvY2tfdCAqbG9jaykJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9jayhyd2xvY2tfdCAqbG9jaykJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci0KLXVuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2lycXNhdmUoc3BpbmxvY2tfdCAqbG9jaykJX19hY3F1aXJlcyhzcGlubG9ja190KTsKLXVuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfcmVhZF9sb2NrX2lycXNhdmUocndsb2NrX3QgKmxvY2spCV9fYWNxdWlyZXMocndsb2NrX3QpOwotdW5zaWduZWQgbG9uZyBfX2xvY2tmdW5jIF93cml0ZV9sb2NrX2lycXNhdmUocndsb2NrX3QgKmxvY2spCV9fYWNxdWlyZXMocndsb2NrX3QpOwotCi12b2lkIF9fbG9ja2Z1bmMgX3NwaW5fbG9ja19pcnEoc3BpbmxvY2tfdCAqbG9jaykJX19hY3F1aXJlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2JoKHNwaW5sb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHNwaW5sb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2tfaXJxKHJ3bG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3JlYWRfbG9ja19iaChyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF93cml0ZV9sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF93cml0ZV9sb2NrX2JoKHJ3bG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhyd2xvY2tfdCk7Ci0KLXZvaWQgX19sb2NrZnVuYyBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQlfX3JlbGVhc2VzKHNwaW5sb2NrX3QpOwotdm9pZCBfX2xvY2tmdW5jIF9zcGluX3VubG9ja19pcnEoc3BpbmxvY2tfdCAqbG9jaykJCQkJX19yZWxlYXNlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfc3Bpbl91bmxvY2tfYmgoc3BpbmxvY2tfdCAqbG9jaykJCQkJX19yZWxlYXNlcyhzcGlubG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfcmVhZF91bmxvY2tfaXJxcmVzdG9yZShyd2xvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3JlYWRfdW5sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJCQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3JlYWRfdW5sb2NrX2JoKHJ3bG9ja190ICpsb2NrKQkJCQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9ja19pcnFyZXN0b3JlKHJ3bG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQlfX3JlbGVhc2VzKHJ3bG9ja190KTsKLXZvaWQgX19sb2NrZnVuYyBfd3JpdGVfdW5sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJCQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci12b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9ja19iaChyd2xvY2tfdCAqbG9jaykJCQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Ci0KLWludCBfX2xvY2tmdW5jIF9zcGluX3RyeWxvY2tfYmgoc3BpbmxvY2tfdCAqbG9jayk7Ci1pbnQgX19sb2NrZnVuYyBnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2socndsb2NrX3QgKmxvY2spOwotaW50IGluX2xvY2tfZnVuY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcik7Ci0KKy8qCisgKiBQdWxsIHRoZSBfX3JhdyooKSBmdW5jdGlvbnMvZGVjbGFyYXRpb25zIChVUC1ub25kZWJ1ZyBkb2VzbnQgbmVlZCB0aGVtKToKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKKyMgaW5jbHVkZSA8YXNtL3NwaW5sb2NrLmg+CiAjZWxzZQorIyBpbmNsdWRlIDxsaW51eC9zcGlubG9ja191cC5oPgorI2VuZGlmCiAKLSNkZWZpbmUgaW5fbG9ja19mdW5jdGlvbnMoQUREUikgMAorI2RlZmluZSBzcGluX2xvY2tfaW5pdChsb2NrKQlkbyB7ICoobG9jaykgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUgKDApCisjZGVmaW5lIHJ3bG9ja19pbml0KGxvY2spCWRvIHsgKihsb2NrKSA9IFJXX0xPQ0tfVU5MT0NLRUQ7IH0gd2hpbGUgKDApCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgJiYgIWRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQotIyBkZWZpbmUgX2F0b21pY19kZWNfYW5kX2xvY2soYXRvbWljLGxvY2spIGF0b21pY19kZWNfYW5kX3Rlc3QoYXRvbWljKQotIyBkZWZpbmUgQVRPTUlDX0RFQ19BTkRfTE9DSworI2RlZmluZSBzcGluX2lzX2xvY2tlZChsb2NrKQlfX3Jhd19zcGluX2lzX2xvY2tlZCgmKGxvY2spLT5yYXdfbG9jaykKKworLyoqCisgKiBzcGluX3VubG9ja193YWl0IC0gd2FpdCB1bnRpbCB0aGUgc3BpbmxvY2sgZ2V0cyB1bmxvY2tlZAorICogQGxvY2s6IHRoZSBzcGlubG9jayBpbiBxdWVzdGlvbi4KKyAqLworI2RlZmluZSBzcGluX3VubG9ja193YWl0KGxvY2spCV9fcmF3X3NwaW5fdW5sb2NrX3dhaXQoJihsb2NrKS0+cmF3X2xvY2spCisKKy8qCisgKiBQdWxsIHRoZSBfc3Bpbl8qKCkvX3JlYWRfKigpL193cml0ZV8qKCkgZnVuY3Rpb25zL2RlY2xhcmF0aW9uczoKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCisjIGluY2x1ZGUgPGxpbnV4L3NwaW5sb2NrX2FwaV9zbXAuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGxpbnV4L3NwaW5sb2NrX2FwaV91cC5oPgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLSAKLSNkZWZpbmUgU1BJTkxPQ0tfTUFHSUMJMHgxRDI0NEIzQwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgbWFnaWM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb2NrOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBiYWJibGU7Ci0JY29uc3QgY2hhciAqbW9kdWxlOwotCWNoYXIgKm93bmVyOwotCWludCBvbGluZTsKLX0gc3BpbmxvY2tfdDsKLSNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSB7IFNQSU5MT0NLX01BR0lDLCAwLCAxMCwgX19GSUxFX18gLCBOVUxMLCAwfQorIGV4dGVybiB2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spOworI2RlZmluZSBfcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX3Jhd19zcGluX2xvY2sobG9jaykKKyBleHRlcm4gaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spOworIGV4dGVybiB2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jayk7CiAKLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQoeCkgXAotCWRvIHsgXAotCQkoeCktPm1hZ2ljID0gU1BJTkxPQ0tfTUFHSUM7IFwKLQkJKHgpLT5sb2NrID0gMDsgXAotCQkoeCktPmJhYmJsZSA9IDU7IFwKLQkJKHgpLT5tb2R1bGUgPSBfX0ZJTEVfXzsgXAotCQkoeCktPm93bmVyID0gTlVMTDsgXAotCQkoeCktPm9saW5lID0gMDsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0hFQ0tfTE9DSyh4KSBcCi0JZG8geyBcCi0JIAlpZiAoKHgpLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQykgeyBcCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBzcGluX2lzX2xvY2tlZCBvbiB1bmluaXRpYWxpemVkIHNwaW5sb2NrICVwLlxuIiwgXAotCQkJCQlfX0ZJTEVfXywgX19MSU5FX18sICh4KSk7IFwKLQkJfSBcCi0JfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yYXdfc3Bpbl9sb2NrKHgpCQlcCi0JZG8geyBcCi0JIAlDSEVDS19MT0NLKHgpOyBcCi0JCWlmICgoeCktPmxvY2smJih4KS0+YmFiYmxlKSB7IFwKLQkJCSh4KS0+YmFiYmxlLS07IFwKLQkJCXByaW50aygiJXM6JWQ6IHNwaW5fbG9jayglczolcCkgYWxyZWFkeSBsb2NrZWQgYnkgJXMvJWRcbiIsIFwKLQkJCQkJX19GSUxFX18sX19MSU5FX18sICh4KS0+bW9kdWxlLCBcCi0JCQkJCSh4KSwgKHgpLT5vd25lciwgKHgpLT5vbGluZSk7IFwKLQkJfSBcCi0JCSh4KS0+bG9jayA9IDE7IFwKLQkJKHgpLT5vd25lciA9IF9fRklMRV9fOyBcCi0JCSh4KS0+b2xpbmUgPSBfX0xJTkVfXzsgXAotCX0gd2hpbGUgKDApCi0KLS8qIHdpdGhvdXQgZGVidWdnaW5nLCBzcGluX2lzX2xvY2tlZCBvbiBVUCBhbHdheXMgc2F5cwotICogRkFMU0UuIC0tPiBwcmludGsgaWYgYWxyZWFkeSBsb2NrZWQuICovCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpIFwKLQkoeyBcCi0JIAlDSEVDS19MT0NLKHgpOyBcCi0JCWlmICgoeCktPmxvY2smJih4KS0+YmFiYmxlKSB7IFwKLQkJCSh4KS0+YmFiYmxlLS07IFwKLQkJCXByaW50aygiJXM6JWQ6IHNwaW5faXNfbG9ja2VkKCVzOiVwKSBhbHJlYWR5IGxvY2tlZCBieSAlcy8lZFxuIiwgXAotCQkJCQlfX0ZJTEVfXyxfX0xJTkVfXywgKHgpLT5tb2R1bGUsIFwKLQkJCQkJKHgpLCAoeCktPm93bmVyLCAoeCktPm9saW5lKTsgXAotCQl9IFwKLQkJMDsgXAotCX0pCi0KLS8qIHdpdGggZGVidWdnaW5nLCBhc3NlcnRfc3Bpbl9sb2NrZWQoKSBvbiBVUCBkb2VzIGNoZWNrCi0gKiB0aGUgbG9jayB2YWx1ZSBwcm9wZXJseSAqLwotI2RlZmluZSBhc3NlcnRfc3Bpbl9sb2NrZWQoeCkgXAotCSh7IFwKLQkJQ0hFQ0tfTE9DSyh4KTsgXAotCQlCVUdfT04oISh4KS0+bG9jayk7IFwKLQl9KQotCi0vKiB3aXRob3V0IGRlYnVnZ2luZywgc3Bpbl90cnlsb2NrIG9uIFVQIGFsd2F5cyBzYXlzCi0gKiBUUlVFLiAtLT4gcHJpbnRrIGlmIGFscmVhZHkgbG9ja2VkLiAqLwotI2RlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayh4KSBcCi0JKHsgXAotCSAJQ0hFQ0tfTE9DSyh4KTsgXAotCQlpZiAoKHgpLT5sb2NrJiYoeCktPmJhYmJsZSkgeyBcCi0JCQkoeCktPmJhYmJsZS0tOyBcCi0JCQlwcmludGsoIiVzOiVkOiBzcGluX3RyeWxvY2soJXM6JXApIGFscmVhZHkgbG9ja2VkIGJ5ICVzLyVkXG4iLCBcCi0JCQkJCV9fRklMRV9fLF9fTElORV9fLCAoeCktPm1vZHVsZSwgXAotCQkJCQkoeCksICh4KS0+b3duZXIsICh4KS0+b2xpbmUpOyBcCi0JCX0gXAotCQkoeCktPmxvY2sgPSAxOyBcCi0JCSh4KS0+b3duZXIgPSBfX0ZJTEVfXzsgXAotCQkoeCktPm9saW5lID0gX19MSU5FX187IFwKLQkJMTsgXAotCX0pCi0KLSNkZWZpbmUgc3Bpbl91bmxvY2tfd2FpdCh4KQlcCi0JZG8geyBcCi0JIAlDSEVDS19MT0NLKHgpOyBcCi0JCWlmICgoeCktPmxvY2smJih4KS0+YmFiYmxlKSB7IFwKLQkJCSh4KS0+YmFiYmxlLS07IFwKLQkJCXByaW50aygiJXM6JWQ6IHNwaW5fdW5sb2NrX3dhaXQoJXM6JXApIG93bmVkIGJ5ICVzLyVkXG4iLCBcCi0JCQkJCV9fRklMRV9fLF9fTElORV9fLCAoeCktPm1vZHVsZSwgKHgpLCBcCi0JCQkJCSh4KS0+b3duZXIsICh4KS0+b2xpbmUpOyBcCi0JCX1cCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmF3X3NwaW5fdW5sb2NrKHgpIFwKLQlkbyB7IFwKLQkgCUNIRUNLX0xPQ0soeCk7IFwKLQkJaWYgKCEoeCktPmxvY2smJih4KS0+YmFiYmxlKSB7IFwKLQkJCSh4KS0+YmFiYmxlLS07IFwKLQkJCXByaW50aygiJXM6JWQ6IHNwaW5fdW5sb2NrKCVzOiVwKSBub3QgbG9ja2VkXG4iLCBcCi0JCQkJCV9fRklMRV9fLF9fTElORV9fLCAoeCktPm1vZHVsZSwgKHgpKTtcCi0JCX0gXAotCQkoeCktPmxvY2sgPSAwOyBcCi0JfSB3aGlsZSAoMCkKKyBleHRlcm4gdm9pZCBfcmF3X3JlYWRfbG9jayhyd2xvY2tfdCAqbG9jayk7CisgZXh0ZXJuIGludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqbG9jayk7CisgZXh0ZXJuIHZvaWQgX3Jhd19yZWFkX3VubG9jayhyd2xvY2tfdCAqbG9jayk7CisgZXh0ZXJuIHZvaWQgX3Jhd193cml0ZV9sb2NrKHJ3bG9ja190ICpsb2NrKTsKKyBleHRlcm4gaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqbG9jayk7CisgZXh0ZXJuIHZvaWQgX3Jhd193cml0ZV91bmxvY2socndsb2NrX3QgKmxvY2spOwogI2Vsc2UKLS8qCi0gKiBnY2MgdmVyc2lvbnMgYmVmb3JlIH4yLjk1IGhhdmUgYSBuYXN0eSBidWcgd2l0aCBlbXB0eSBpbml0aWFsaXplcnMuCi0gKi8KLSNpZiAoX19HTlVDX18gPiAyKQotICB0eXBlZGVmIHN0cnVjdCB7IH0gc3BpbmxvY2tfdDsKLSAgI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgfQotI2Vsc2UKLSAgdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgZ2NjX2lzX2J1Z2d5OyB9IHNwaW5sb2NrX3Q7Ci0gICNkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIChzcGlubG9ja190KSB7IDAgfQorIyBkZWZpbmUgX3Jhd19zcGluX3VubG9jayhsb2NrKQkJX19yYXdfc3Bpbl91bmxvY2soJihsb2NrKS0+cmF3X2xvY2spCisjIGRlZmluZSBfcmF3X3NwaW5fdHJ5bG9jayhsb2NrKQlfX3Jhd19zcGluX3RyeWxvY2soJihsb2NrKS0+cmF3X2xvY2spCisjIGRlZmluZSBfcmF3X3NwaW5fbG9jayhsb2NrKQkJX19yYXdfc3Bpbl9sb2NrKCYobG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIFwKKwkJX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKCYobG9jayktPnJhd19sb2NrLCAqKGZsYWdzKSkKKyMgZGVmaW5lIF9yYXdfcmVhZF9sb2NrKHJ3bG9jaykJCV9fcmF3X3JlYWRfbG9jaygmKHJ3bG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd193cml0ZV9sb2NrKHJ3bG9jaykJX19yYXdfd3JpdGVfbG9jaygmKHJ3bG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd19yZWFkX3VubG9jayhyd2xvY2spCV9fcmF3X3JlYWRfdW5sb2NrKCYocndsb2NrKS0+cmF3X2xvY2spCisjIGRlZmluZSBfcmF3X3dyaXRlX3VubG9jayhyd2xvY2spCV9fcmF3X3dyaXRlX3VubG9jaygmKHJ3bG9jayktPnJhd19sb2NrKQorIyBkZWZpbmUgX3Jhd19yZWFkX3RyeWxvY2socndsb2NrKQlfX3Jhd19yZWFkX3RyeWxvY2soJihyd2xvY2spLT5yYXdfbG9jaykKKyMgZGVmaW5lIF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2spCV9fcmF3X3dyaXRlX3RyeWxvY2soJihyd2xvY2spLT5yYXdfbG9jaykKICNlbmRpZgogCi0vKgotICogSWYgQ09ORklHX1NNUCBpcyB1bnNldCwgZGVjbGFyZSB0aGUgX3Jhd18qIGRlZmluaXRpb25zIGFzIG5vcHMKLSAqLwotI2RlZmluZSBzcGluX2xvY2tfaW5pdChsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2RlZmluZSBfcmF3X3NwaW5fbG9jayhsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSgwKQotI2RlZmluZSBzcGluX2lzX2xvY2tlZChsb2NrKQkoKHZvaWQpKGxvY2spLCAwKQotI2RlZmluZSBhc3NlcnRfc3Bpbl9sb2NrZWQobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX3Jhd19zcGluX3RyeWxvY2sobG9jaykJKCgodm9pZCkobG9jayksIDEpKQotI2RlZmluZSBzcGluX3VubG9ja193YWl0KGxvY2spCSh2b2lkKShsb2NrKQotI2RlZmluZSBfcmF3X3NwaW5fdW5sb2NrKGxvY2spIGRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZW5kaWYgLyogQ09ORklHX0RFQlVHX1NQSU5MT0NLICovCi0KLS8qIFJXIHNwaW5sb2NrczogTm8gZGVidWcgdmVyc2lvbiAqLwotCi0jaWYgKF9fR05VQ19fID4gMikKLSAgdHlwZWRlZiBzdHJ1Y3QgeyB9IHJ3bG9ja190OwotICAjZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IH0KLSNlbHNlCi0gIHR5cGVkZWYgc3RydWN0IHsgaW50IGdjY19pc19idWdneTsgfSByd2xvY2tfdDsKLSAgI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIChyd2xvY2tfdCkgeyAwIH0KLSNlbmRpZgotCi0jZGVmaW5lIHJ3bG9ja19pbml0KGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9yYXdfcmVhZF9sb2NrKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9yYXdfcmVhZF91bmxvY2sobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX3Jhd193cml0ZV9sb2NrKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9yYXdfd3JpdGVfdW5sb2NrKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlKDApCi0jZGVmaW5lIHJlYWRfY2FuX2xvY2sobG9jaykJKCgodm9pZCkobG9jayksIDEpKQotI2RlZmluZSB3cml0ZV9jYW5fbG9jayhsb2NrKQkoKCh2b2lkKShsb2NrKSwgMSkpCi0jZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spICh7ICh2b2lkKShsb2NrKTsgKDEpOyB9KQotI2RlZmluZSBfcmF3X3dyaXRlX3RyeWxvY2sobG9jaykgKHsgKHZvaWQpKGxvY2spOyAoMSk7IH0pCi0KLSNkZWZpbmUgX3NwaW5fdHJ5bG9jayhsb2NrKQkoe3ByZWVtcHRfZGlzYWJsZSgpOyBfcmF3X3NwaW5fdHJ5bG9jayhsb2NrKSA/IFwKLQkJCQkxIDogKHtwcmVlbXB0X2VuYWJsZSgpOyAwO30pO30pCi0KLSNkZWZpbmUgX3JlYWRfdHJ5bG9jayhsb2NrKQkoe3ByZWVtcHRfZGlzYWJsZSgpO19yYXdfcmVhZF90cnlsb2NrKGxvY2spID8gXAotCQkJCTEgOiAoe3ByZWVtcHRfZW5hYmxlKCk7IDA7fSk7fSkKLQotI2RlZmluZSBfd3JpdGVfdHJ5bG9jayhsb2NrKQkoe3ByZWVtcHRfZGlzYWJsZSgpOyBfcmF3X3dyaXRlX3RyeWxvY2sobG9jaykgPyBcCi0JCQkJMSA6ICh7cHJlZW1wdF9lbmFibGUoKTsgMDt9KTt9KQotCi0jZGVmaW5lIF9zcGluX3RyeWxvY2tfYmgobG9jaykJKHtwcmVlbXB0X2Rpc2FibGUoKTsgbG9jYWxfYmhfZGlzYWJsZSgpOyBcCi0JCQkJX3Jhd19zcGluX3RyeWxvY2sobG9jaykgPyBcCi0JCQkJMSA6ICh7cHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOyBsb2NhbF9iaF9lbmFibGUoKTsgMDt9KTt9KQotCi0jZGVmaW5lIF9zcGluX2xvY2sobG9jaykJXAotZG8geyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3NwaW5fbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF93cml0ZV9sb2NrKGxvY2spIFwKLWRvIHsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd193cml0ZV9sb2NrKGxvY2spOyBcCi0JX19hY3F1aXJlKGxvY2spOyBcCi19IHdoaWxlKDApCi0gCi0jZGVmaW5lIF9yZWFkX2xvY2sobG9jaykJXAotZG8geyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3JlYWRfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9zcGluX3VubG9jayhsb2NrKSBcCi1kbyB7IFwKLQlfcmF3X3NwaW5fdW5sb2NrKGxvY2spOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfd3JpdGVfdW5sb2NrKGxvY2spIFwKLWRvIHsgXAotCV9yYXdfd3JpdGVfdW5sb2NrKGxvY2spOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9yZWFkX3VubG9jayhsb2NrKSBcCi1kbyB7IFwKLQlfcmF3X3JlYWRfdW5sb2NrKGxvY2spOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykgXAotZG8gewlcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3NwaW5fbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3Bpbl9sb2NrX2lycShsb2NrKSBcCi1kbyB7IFwKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3NwaW5fbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3Bpbl9sb2NrX2JoKGxvY2spIFwKLWRvIHsgXAotCWxvY2FsX2JoX2Rpc2FibGUoKTsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd19zcGluX2xvY2sobG9jayk7IFwKLQlfX2FjcXVpcmUobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3JlYWRfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKSBcCi1kbyB7CVwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfcmVhZF9sb2NrKGxvY2spOyBcCi0JX19hY3F1aXJlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9yZWFkX2xvY2tfaXJxKGxvY2spIFwKLWRvIHsgXAotCWxvY2FsX2lycV9kaXNhYmxlKCk7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfcmVhZF9sb2NrKGxvY2spOyBcCi0JX19hY3F1aXJlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9yZWFkX2xvY2tfYmgobG9jaykgXAotZG8geyBcCi0JbG9jYWxfYmhfZGlzYWJsZSgpOyBcCi0JcHJlZW1wdF9kaXNhYmxlKCk7IFwKLQlfcmF3X3JlYWRfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfd3JpdGVfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKSBcCi1kbyB7CVwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCV9yYXdfd3JpdGVfbG9jayhsb2NrKTsgXAotCV9fYWNxdWlyZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfd3JpdGVfbG9ja19pcnEobG9jaykgXAotZG8geyBcCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd193cml0ZV9sb2NrKGxvY2spOyBcCi0JX19hY3F1aXJlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF93cml0ZV9sb2NrX2JoKGxvY2spIFwKLWRvIHsgXAotCWxvY2FsX2JoX2Rpc2FibGUoKTsgXAotCXByZWVtcHRfZGlzYWJsZSgpOyBcCi0JX3Jhd193cml0ZV9sb2NrKGxvY2spOyBcCi0JX19hY3F1aXJlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKSBcCi1kbyB7IFwKLQlfcmF3X3NwaW5fdW5sb2NrKGxvY2spOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3Bpbl91bmxvY2tfaXJxKGxvY2spIFwKLWRvIHsgXAotCV9yYXdfc3Bpbl91bmxvY2sobG9jayk7IFwKLQlsb2NhbF9pcnFfZW5hYmxlKCk7IFwKLQlwcmVlbXB0X2VuYWJsZSgpOyBcCi0JX19yZWxlYXNlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9zcGluX3VubG9ja19iaChsb2NrKSBcCi1kbyB7IFwKLQlfcmF3X3NwaW5fdW5sb2NrKGxvY2spOyBcCi0JcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOyBcCi0JbG9jYWxfYmhfZW5hYmxlKCk7IFwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3dyaXRlX3VubG9ja19iaChsb2NrKSBcCi1kbyB7IFwKLQlfcmF3X3dyaXRlX3VubG9jayhsb2NrKTsgXAotCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsgXAotCWxvY2FsX2JoX2VuYWJsZSgpOyBcCi0JX19yZWxlYXNlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9yZWFkX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKSBcCi1kbyB7IFwKLQlfcmF3X3JlYWRfdW5sb2NrKGxvY2spOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpIFwKLWRvIHsgXAotCV9yYXdfd3JpdGVfdW5sb2NrKGxvY2spOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi0JcHJlZW1wdF9lbmFibGUoKTsgXAotCV9fcmVsZWFzZShsb2NrKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfcmVhZF91bmxvY2tfaXJxKGxvY2spCVwKLWRvIHsgXAotCV9yYXdfcmVhZF91bmxvY2sobG9jayk7CVwKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CVwKLQlwcmVlbXB0X2VuYWJsZSgpOwlcCi0JX19yZWxlYXNlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9yZWFkX3VubG9ja19iaChsb2NrKQlcCi1kbyB7IFwKLQlfcmF3X3JlYWRfdW5sb2NrKGxvY2spOwlcCi0JcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwlcCi0JbG9jYWxfYmhfZW5hYmxlKCk7CVwKLQlfX3JlbGVhc2UobG9jayk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3dyaXRlX3VubG9ja19pcnEobG9jaykJXAotZG8geyBcCi0JX3Jhd193cml0ZV91bmxvY2sobG9jayk7CVwKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CVwKLQlwcmVlbXB0X2VuYWJsZSgpOwlcCi0JX19yZWxlYXNlKGxvY2spOyBcCi19IHdoaWxlICgwKQotCi0jZW5kaWYgLyogIVNNUCAqLworI2RlZmluZSByZWFkX2Nhbl9sb2NrKHJ3bG9jaykJCV9fcmF3X3JlYWRfY2FuX2xvY2soJihyd2xvY2spLT5yYXdfbG9jaykKKyNkZWZpbmUgd3JpdGVfY2FuX2xvY2socndsb2NrKQkJX19yYXdfd3JpdGVfY2FuX2xvY2soJihyd2xvY2spLT5yYXdfbG9jaykKIAogLyoKICAqIERlZmluZSB0aGUgdmFyaW91cyBzcGluX2xvY2sgYW5kIHJ3X2xvY2sgbWV0aG9kcy4gIE5vdGUgd2UgZGVmaW5lIHRoZXNlCiAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgQ09ORklHX1NNUCBvciBDT05GSUdfUFJFRU1QVCBhcmUgc2V0LiBUaGUgdmFyaW91cwogICogbWV0aG9kcyBhcmUgZGVmaW5lZCBhcyBub3BzIGluIHRoZSBjYXNlIHRoZXkgYXJlIG5vdCByZXF1aXJlZC4KICAqLwotI2RlZmluZSBzcGluX3RyeWxvY2sobG9jaykJX19jb25kX2xvY2soX3NwaW5fdHJ5bG9jayhsb2NrKSkKLSNkZWZpbmUgcmVhZF90cnlsb2NrKGxvY2spCV9fY29uZF9sb2NrKF9yZWFkX3RyeWxvY2sobG9jaykpCi0jZGVmaW5lIHdyaXRlX3RyeWxvY2sobG9jaykJX19jb25kX2xvY2soX3dyaXRlX3RyeWxvY2sobG9jaykpCisjZGVmaW5lIHNwaW5fdHJ5bG9jayhsb2NrKQkJX19jb25kX2xvY2soX3NwaW5fdHJ5bG9jayhsb2NrKSkKKyNkZWZpbmUgcmVhZF90cnlsb2NrKGxvY2spCQlfX2NvbmRfbG9jayhfcmVhZF90cnlsb2NrKGxvY2spKQorI2RlZmluZSB3cml0ZV90cnlsb2NrKGxvY2spCQlfX2NvbmRfbG9jayhfd3JpdGVfdHJ5bG9jayhsb2NrKSkKIAotI2RlZmluZSBzcGluX2xvY2sobG9jaykJCV9zcGluX2xvY2sobG9jaykKLSNkZWZpbmUgd3JpdGVfbG9jayhsb2NrKQlfd3JpdGVfbG9jayhsb2NrKQotI2RlZmluZSByZWFkX2xvY2sobG9jaykJCV9yZWFkX2xvY2sobG9jaykKKyNkZWZpbmUgc3Bpbl9sb2NrKGxvY2spCQkJX3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSB3cml0ZV9sb2NrKGxvY2spCQlfd3JpdGVfbG9jayhsb2NrKQorI2RlZmluZSByZWFkX2xvY2sobG9jaykJCQlfcmVhZF9sb2NrKGxvY2spCiAKLSNpZmRlZiBDT05GSUdfU01QCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKICNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCWZsYWdzID0gX3NwaW5fbG9ja19pcnFzYXZlKGxvY2spCiAjZGVmaW5lIHJlYWRfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQlmbGFncyA9IF9yZWFkX2xvY2tfaXJxc2F2ZShsb2NrKQogI2RlZmluZSB3cml0ZV9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCWZsYWdzID0gX3dyaXRlX2xvY2tfaXJxc2F2ZShsb2NrKQpAQCAtNDcwLDEzNyArMTcxLDU5IEBACiAjZGVmaW5lIHdyaXRlX2xvY2tfaXJxKGxvY2spCQlfd3JpdGVfbG9ja19pcnEobG9jaykKICNkZWZpbmUgd3JpdGVfbG9ja19iaChsb2NrKQkJX3dyaXRlX2xvY2tfYmgobG9jaykKIAotI2RlZmluZSBzcGluX3VubG9jayhsb2NrKQlfc3Bpbl91bmxvY2sobG9jaykKLSNkZWZpbmUgd3JpdGVfdW5sb2NrKGxvY2spCV93cml0ZV91bmxvY2sobG9jaykKLSNkZWZpbmUgcmVhZF91bmxvY2sobG9jaykJX3JlYWRfdW5sb2NrKGxvY2spCisjZGVmaW5lIHNwaW5fdW5sb2NrKGxvY2spCQlfc3Bpbl91bmxvY2sobG9jaykKKyNkZWZpbmUgd3JpdGVfdW5sb2NrKGxvY2spCQlfd3JpdGVfdW5sb2NrKGxvY2spCisjZGVmaW5lIHJlYWRfdW5sb2NrKGxvY2spCQlfcmVhZF91bmxvY2sobG9jaykKIAotI2RlZmluZSBzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykKKyNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykgXAorCQkJCQlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykKICNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxKGxvY2spCQlfc3Bpbl91bmxvY2tfaXJxKGxvY2spCiAjZGVmaW5lIHNwaW5fdW5sb2NrX2JoKGxvY2spCQlfc3Bpbl91bmxvY2tfYmgobG9jaykKIAotI2RlZmluZSByZWFkX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQlfcmVhZF91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykKLSNkZWZpbmUgcmVhZF91bmxvY2tfaXJxKGxvY2spCQkJX3JlYWRfdW5sb2NrX2lycShsb2NrKQotI2RlZmluZSByZWFkX3VubG9ja19iaChsb2NrKQkJCV9yZWFkX3VubG9ja19iaChsb2NrKQorI2RlZmluZSByZWFkX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKSBcCisJCQkJCV9yZWFkX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQorI2RlZmluZSByZWFkX3VubG9ja19pcnEobG9jaykJCV9yZWFkX3VubG9ja19pcnEobG9jaykKKyNkZWZpbmUgcmVhZF91bmxvY2tfYmgobG9jaykJCV9yZWFkX3VubG9ja19iaChsb2NrKQogCi0jZGVmaW5lIHdyaXRlX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQlfd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpCi0jZGVmaW5lIHdyaXRlX3VubG9ja19pcnEobG9jaykJCQlfd3JpdGVfdW5sb2NrX2lycShsb2NrKQotI2RlZmluZSB3cml0ZV91bmxvY2tfYmgobG9jaykJCQlfd3JpdGVfdW5sb2NrX2JoKGxvY2spCisjZGVmaW5lIHdyaXRlX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKSBcCisJCQkJCV93cml0ZV91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykKKyNkZWZpbmUgd3JpdGVfdW5sb2NrX2lycShsb2NrKQkJX3dyaXRlX3VubG9ja19pcnEobG9jaykKKyNkZWZpbmUgd3JpdGVfdW5sb2NrX2JoKGxvY2spCQlfd3JpdGVfdW5sb2NrX2JoKGxvY2spCiAKLSNkZWZpbmUgc3Bpbl90cnlsb2NrX2JoKGxvY2spCQkJX19jb25kX2xvY2soX3NwaW5fdHJ5bG9ja19iaChsb2NrKSkKKyNkZWZpbmUgc3Bpbl90cnlsb2NrX2JoKGxvY2spCQlfX2NvbmRfbG9jayhfc3Bpbl90cnlsb2NrX2JoKGxvY2spKQogCiAjZGVmaW5lIHNwaW5fdHJ5bG9ja19pcnEobG9jaykgXAogKHsgXAogCWxvY2FsX2lycV9kaXNhYmxlKCk7IFwKIAlfc3Bpbl90cnlsb2NrKGxvY2spID8gXAotCTEgOiAoe2xvY2FsX2lycV9lbmFibGUoKTsgMDsgfSk7IFwKKwkxIDogKHsgbG9jYWxfaXJxX2VuYWJsZSgpOyAwOyAgfSk7IFwKIH0pCiAKICNkZWZpbmUgc3Bpbl90cnlsb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpIFwKICh7IFwKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKIAlfc3Bpbl90cnlsb2NrKGxvY2spID8gXAotCTEgOiAoe2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgMDt9KTsgXAorCTEgOiAoeyBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IDA7IH0pOyBcCiB9KQogCi0jaWZkZWYgQ09ORklHX0xPQ0tNRVRFUgotZXh0ZXJuIHZvaWQgX21ldGVyZWRfc3Bpbl9sb2NrICAgKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgX21ldGVyZWRfc3Bpbl91bmxvY2sgKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIGludCAgX21ldGVyZWRfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgX21ldGVyZWRfcmVhZF9sb2NrICAgIChyd2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBfbWV0ZXJlZF9yZWFkX3VubG9jayAgKHJ3bG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIF9tZXRlcmVkX3dyaXRlX2xvY2sgICAocndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgX21ldGVyZWRfd3JpdGVfdW5sb2NrIChyd2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gaW50ICBfbWV0ZXJlZF9yZWFkX3RyeWxvY2sgKHJ3bG9ja190ICpsb2NrKTsKLWV4dGVybiBpbnQgIF9tZXRlcmVkX3dyaXRlX3RyeWxvY2socndsb2NrX3QgKmxvY2spOwotI2VuZGlmCi0KLS8qICJsb2NrIG9uIHJlZmVyZW5jZSBjb3VudCB6ZXJvIiAqLwotI2lmbmRlZiBBVE9NSUNfREVDX0FORF9MT0NLCisvKgorICogUHVsbCB0aGUgYXRvbWljX3QgZGVjbGFyYXRpb246CisgKiAoYXNtLW1pcHMvYXRvbWljLmggbmVlZHMgYWJvdmUgZGVmaW5pdGlvbnMpCisgKi8KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisvKioKKyAqIGF0b21pY19kZWNfYW5kX2xvY2sgLSBsb2NrIG9uIHJlYWNoaW5nIHJlZmVyZW5jZSBjb3VudCB6ZXJvCisgKiBAYXRvbWljOiB0aGUgYXRvbWljIGNvdW50ZXIKKyAqIEBsb2NrOiB0aGUgc3BpbmxvY2sgaW4gcXVlc3Rpb24KKyAqLwogZXh0ZXJuIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKTsKLSNlbmRpZgotCi0jZGVmaW5lIGF0b21pY19kZWNfYW5kX2xvY2soYXRvbWljLGxvY2spIF9fY29uZF9sb2NrKF9hdG9taWNfZGVjX2FuZF9sb2NrKGF0b21pYyxsb2NrKSkKLQotLyoKLSAqICBiaXQtYmFzZWQgc3Bpbl9sb2NrKCkKLSAqCi0gKiBEb24ndCB1c2UgdGhpcyB1bmxlc3MgeW91IHJlYWxseSBuZWVkIHRvOiBzcGluX2xvY2soKSBhbmQgc3Bpbl91bmxvY2soKQotICogYXJlIHNpZ25pZmljYW50bHkgZmFzdGVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYml0X3NwaW5fbG9jayhpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQotewotCS8qCi0JICogQXNzdW1pbmcgdGhlIGxvY2sgaXMgdW5jb250ZW5kZWQsIHRoaXMgbmV2ZXIgZW50ZXJzCi0JICogdGhlIGJvZHkgb2YgdGhlIG91dGVyIGxvb3AuIElmIGl0IGlzIGNvbnRlbmRlZCwgdGhlbgotCSAqIHdpdGhpbiB0aGUgaW5uZXIgbG9vcCBhIG5vbi1hdG9taWMgdGVzdCBpcyB1c2VkIHRvCi0JICogYnVzeXdhaXQgd2l0aCBsZXNzIGJ1cyBjb250ZW50aW9uIGZvciBhIGdvb2QgdGltZSB0bwotCSAqIGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgbG9jayBiaXQuCi0JICovCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKLQl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChiaXRudW0sIGFkZHIpKSB7Ci0JCXdoaWxlICh0ZXN0X2JpdChiaXRudW0sIGFkZHIpKSB7Ci0JCQlwcmVlbXB0X2VuYWJsZSgpOwotCQkJY3B1X3JlbGF4KCk7Ci0JCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJfQotCX0KLSNlbmRpZgotCV9fYWNxdWlyZShiaXRsb2NrKTsKLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIGl0IHdhcyBhY3F1aXJlZAotICovCi1zdGF0aWMgaW5saW5lIGludCBiaXRfc3Bpbl90cnlsb2NrKGludCBiaXRudW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIpCi17Ci0JcHJlZW1wdF9kaXNhYmxlKCk7CQotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoYml0bnVtLCBhZGRyKSkgewotCQlwcmVlbXB0X2VuYWJsZSgpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKLQlfX2FjcXVpcmUoYml0bG9jayk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiAgYml0LWJhc2VkIHNwaW5fdW5sb2NrKCkKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGJpdF9zcGluX3VubG9jayhpbnQgYml0bnVtLCB1bnNpZ25lZCBsb25nICphZGRyKQotewotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCi0JQlVHX09OKCF0ZXN0X2JpdChiaXRudW0sIGFkZHIpKTsKLQlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKLQljbGVhcl9iaXQoYml0bnVtLCBhZGRyKTsKLSNlbmRpZgotCXByZWVtcHRfZW5hYmxlKCk7Ci0JX19yZWxlYXNlKGJpdGxvY2spOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGxvY2sgaXMgaGVsZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgYml0X3NwaW5faXNfbG9ja2VkKGludCBiaXRudW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKLQlyZXR1cm4gdGVzdF9iaXQoYml0bnVtLCBhZGRyKTsKLSNlbGlmIGRlZmluZWQgQ09ORklHX1BSRUVNUFQKLQlyZXR1cm4gcHJlZW1wdF9jb3VudCgpOwotI2Vsc2UKLQlyZXR1cm4gMTsKLSNlbmRpZgotfQotCi0jZGVmaW5lIERFRklORV9TUElOTE9DSyh4KSBzcGlubG9ja190IHggPSBTUElOX0xPQ0tfVU5MT0NLRUQKLSNkZWZpbmUgREVGSU5FX1JXTE9DSyh4KSByd2xvY2tfdCB4ID0gUldfTE9DS19VTkxPQ0tFRAorI2RlZmluZSBhdG9taWNfZGVjX2FuZF9sb2NrKGF0b21pYywgbG9jaykgXAorCQlfX2NvbmRfbG9jayhfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWMsIGxvY2spKQogCiAvKioKICAqIHNwaW5fY2FuX2xvY2sgLSB3b3VsZCBzcGluX3RyeWxvY2soKSBzdWNjZWVkPwogICogQGxvY2s6IHRoZSBzcGlubG9jayBpbiBxdWVzdGlvbi4KICAqLwotI2RlZmluZSBzcGluX2Nhbl9sb2NrKGxvY2spCQkoIXNwaW5faXNfbG9ja2VkKGxvY2spKQorI2RlZmluZSBzcGluX2Nhbl9sb2NrKGxvY2spCSghc3Bpbl9pc19sb2NrZWQobG9jaykpCiAKICNlbmRpZiAvKiBfX0xJTlVYX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfc21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlNjk4OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oCkBAIC0wLDAgKzEsNTcgQEAKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19BUElfU01QX0gKKyNkZWZpbmUgX19MSU5VWF9TUElOTE9DS19BUElfU01QX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCisvKgorICogaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfc21wLmgKKyAqCisgKiBzcGlubG9jayBBUEkgZGVjbGFyYXRpb25zIG9uIFNNUCAoYW5kIGRlYnVnKQorICogKGltcGxlbWVudGVkIGluIGtlcm5lbC9zcGlubG9jay5jKQorICoKKyAqIHBvcnRpb25zIENvcHlyaWdodCAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKi8KKworaW50IGluX2xvY2tfZnVuY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKyNkZWZpbmUgYXNzZXJ0X3NwaW5fbG9ja2VkKHgpCUJVR19PTighc3Bpbl9pc19sb2NrZWQoeCkpCisKK3ZvaWQgX19sb2NrZnVuYyBfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHNwaW5sb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2socndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9jayhyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9zcGluX2xvY2tfYmgoc3BpbmxvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMoc3BpbmxvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3JlYWRfbG9ja19iaChyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF93cml0ZV9sb2NrX2JoKHJ3bG9ja190ICpsb2NrKQkJX19hY3F1aXJlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3NwaW5fbG9ja19pcnEoc3BpbmxvY2tfdCAqbG9jaykJX19hY3F1aXJlcyhzcGlubG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfcmVhZF9sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF93cml0ZV9sb2NrX2lycShyd2xvY2tfdCAqbG9jaykJCV9fYWNxdWlyZXMocndsb2NrX3QpOwordW5zaWduZWQgbG9uZyBfX2xvY2tmdW5jIF9zcGluX2xvY2tfaXJxc2F2ZShzcGlubG9ja190ICpsb2NrKQorCQkJCQkJCV9fYWNxdWlyZXMoc3BpbmxvY2tfdCk7Cit1bnNpZ25lZCBsb25nIF9fbG9ja2Z1bmMgX3JlYWRfbG9ja19pcnFzYXZlKHJ3bG9ja190ICpsb2NrKQorCQkJCQkJCV9fYWNxdWlyZXMocndsb2NrX3QpOwordW5zaWduZWQgbG9uZyBfX2xvY2tmdW5jIF93cml0ZV9sb2NrX2lycXNhdmUocndsb2NrX3QgKmxvY2spCisJCQkJCQkJX19hY3F1aXJlcyhyd2xvY2tfdCk7CitpbnQgX19sb2NrZnVuYyBfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spOworaW50IF9fbG9ja2Z1bmMgX3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqbG9jayk7CitpbnQgX19sb2NrZnVuYyBfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqbG9jayk7CitpbnQgX19sb2NrZnVuYyBfc3Bpbl90cnlsb2NrX2JoKHNwaW5sb2NrX3QgKmxvY2spOwordm9pZCBfX2xvY2tmdW5jIF9zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQkJX19yZWxlYXNlcyhzcGlubG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfcmVhZF91bmxvY2socndsb2NrX3QgKmxvY2spCQlfX3JlbGVhc2VzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpsb2NrKQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3NwaW5fdW5sb2NrX2JoKHNwaW5sb2NrX3QgKmxvY2spCV9fcmVsZWFzZXMoc3BpbmxvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3JlYWRfdW5sb2NrX2JoKHJ3bG9ja190ICpsb2NrKQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9ja19iaChyd2xvY2tfdCAqbG9jaykJX19yZWxlYXNlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3NwaW5fdW5sb2NrX2lycShzcGlubG9ja190ICpsb2NrKQlfX3JlbGVhc2VzKHNwaW5sb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF9yZWFkX3VubG9ja19pcnEocndsb2NrX3QgKmxvY2spCV9fcmVsZWFzZXMocndsb2NrX3QpOwordm9pZCBfX2xvY2tmdW5jIF93cml0ZV91bmxvY2tfaXJxKHJ3bG9ja190ICpsb2NrKQlfX3JlbGVhc2VzKHJ3bG9ja190KTsKK3ZvaWQgX19sb2NrZnVuYyBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQkJCQkJCV9fcmVsZWFzZXMoc3BpbmxvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3JlYWRfdW5sb2NrX2lycXJlc3RvcmUocndsb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCQkJCQkJX19yZWxlYXNlcyhyd2xvY2tfdCk7Cit2b2lkIF9fbG9ja2Z1bmMgX3dyaXRlX3VubG9ja19pcnFyZXN0b3JlKHJ3bG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQkJCQkJCV9fcmVsZWFzZXMocndsb2NrX3QpOworCisjZW5kaWYgLyogX19MSU5VWF9TUElOTE9DS19BUElfU01QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3VwLmggYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODFjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX2FwaV91cC5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19BUElfVVBfSAorI2RlZmluZSBfX0xJTlVYX1NQSU5MT0NLX0FQSV9VUF9ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKworLyoKKyAqIGluY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3VwLmgKKyAqCisgKiBzcGlubG9jayBBUEkgaW1wbGVtZW50YXRpb24gb24gVVAtbm9uZGVidWcgKGlubGluZWQgaW1wbGVtZW50YXRpb24pCisgKgorICogcG9ydGlvbnMgQ29weXJpZ2h0IDIwMDUsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKS4KKyAqLworCisjZGVmaW5lIGluX2xvY2tfZnVuY3Rpb25zKEFERFIpCQkwCisKKyNkZWZpbmUgYXNzZXJ0X3NwaW5fbG9ja2VkKGxvY2spCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorCisvKgorICogSW4gdGhlIFVQLW5vbmRlYnVnIGNhc2UgdGhlcmUncyBubyByZWFsIGxvY2tpbmcgZ29pbmcgb24sIHNvIHRoZQorICogb25seSB0aGluZyB3ZSBoYXZlIHRvIGRvIGlzIHRvIGtlZXAgdGhlIHByZWVtcHQgY291bnRzIGFuZCBpcnEKKyAqIGZsYWdzIHN0cmFpZ2h0LCB0byBzdXByZXNzIGNvbXBpbGVyIHdhcm5pbmdzIG9mIHVudXNlZCBsb2NrCisgKiB2YXJpYWJsZXMsIGFuZCB0byBhZGQgdGhlIHByb3BlciBjaGVja2VyIGFubm90YXRpb25zOgorICovCisjZGVmaW5lIF9fTE9DSyhsb2NrKSBcCisgIGRvIHsgcHJlZW1wdF9kaXNhYmxlKCk7IF9fYWNxdWlyZShsb2NrKTsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fTE9DS19CSChsb2NrKSBcCisgIGRvIHsgbG9jYWxfYmhfZGlzYWJsZSgpOyBfX0xPQ0sobG9jayk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19MT0NLX0lSUShsb2NrKSBcCisgIGRvIHsgbG9jYWxfaXJxX2Rpc2FibGUoKTsgX19MT0NLKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fTE9DS19JUlFTQVZFKGxvY2ssIGZsYWdzKSBcCisgIGRvIHsgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBfX0xPQ0sobG9jayk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19VTkxPQ0sobG9jaykgXAorICBkbyB7IHByZWVtcHRfZW5hYmxlKCk7IF9fcmVsZWFzZShsb2NrKTsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fVU5MT0NLX0JIKGxvY2spIFwKKyAgZG8geyBwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7IGxvY2FsX2JoX2VuYWJsZSgpOyBfX3JlbGVhc2UobG9jayk7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX1VOTE9DS19JUlEobG9jaykgXAorICBkbyB7IGxvY2FsX2lycV9lbmFibGUoKTsgX19VTkxPQ0sobG9jayk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19VTkxPQ0tfSVJRUkVTVE9SRShsb2NrLCBmbGFncykgXAorICBkbyB7IGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgX19VTkxPQ0sobG9jayk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX3NwaW5fbG9jayhsb2NrKQkJCV9fTE9DSyhsb2NrKQorI2RlZmluZSBfcmVhZF9sb2NrKGxvY2spCQkJX19MT0NLKGxvY2spCisjZGVmaW5lIF93cml0ZV9sb2NrKGxvY2spCQkJX19MT0NLKGxvY2spCisjZGVmaW5lIF9zcGluX2xvY2tfYmgobG9jaykJCQlfX0xPQ0tfQkgobG9jaykKKyNkZWZpbmUgX3JlYWRfbG9ja19iaChsb2NrKQkJCV9fTE9DS19CSChsb2NrKQorI2RlZmluZSBfd3JpdGVfbG9ja19iaChsb2NrKQkJCV9fTE9DS19CSChsb2NrKQorI2RlZmluZSBfc3Bpbl9sb2NrX2lycShsb2NrKQkJCV9fTE9DS19JUlEobG9jaykKKyNkZWZpbmUgX3JlYWRfbG9ja19pcnEobG9jaykJCQlfX0xPQ0tfSVJRKGxvY2spCisjZGVmaW5lIF93cml0ZV9sb2NrX2lycShsb2NrKQkJCV9fTE9DS19JUlEobG9jaykKKyNkZWZpbmUgX3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQkJX19MT0NLX0lSUVNBVkUobG9jaywgZmxhZ3MpCisjZGVmaW5lIF9yZWFkX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJCV9fTE9DS19JUlFTQVZFKGxvY2ssIGZsYWdzKQorI2RlZmluZSBfd3JpdGVfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQlfX0xPQ0tfSVJRU0FWRShsb2NrLCBmbGFncykKKyNkZWZpbmUgX3NwaW5fdHJ5bG9jayhsb2NrKQkJCSh7IF9fTE9DSyhsb2NrKTsgMTsgfSkKKyNkZWZpbmUgX3JlYWRfdHJ5bG9jayhsb2NrKQkJCSh7IF9fTE9DSyhsb2NrKTsgMTsgfSkKKyNkZWZpbmUgX3dyaXRlX3RyeWxvY2sobG9jaykJCQkoeyBfX0xPQ0sobG9jayk7IDE7IH0pCisjZGVmaW5lIF9zcGluX3RyeWxvY2tfYmgobG9jaykJCQkoeyBfX0xPQ0tfQkgobG9jayk7IDE7IH0pCisjZGVmaW5lIF9zcGluX3VubG9jayhsb2NrKQkJCV9fVU5MT0NLKGxvY2spCisjZGVmaW5lIF9yZWFkX3VubG9jayhsb2NrKQkJCV9fVU5MT0NLKGxvY2spCisjZGVmaW5lIF93cml0ZV91bmxvY2sobG9jaykJCQlfX1VOTE9DSyhsb2NrKQorI2RlZmluZSBfc3Bpbl91bmxvY2tfYmgobG9jaykJCQlfX1VOTE9DS19CSChsb2NrKQorI2RlZmluZSBfd3JpdGVfdW5sb2NrX2JoKGxvY2spCQkJX19VTkxPQ0tfQkgobG9jaykKKyNkZWZpbmUgX3JlYWRfdW5sb2NrX2JoKGxvY2spCQkJX19VTkxPQ0tfQkgobG9jaykKKyNkZWZpbmUgX3NwaW5fdW5sb2NrX2lycShsb2NrKQkJCV9fVU5MT0NLX0lSUShsb2NrKQorI2RlZmluZSBfcmVhZF91bmxvY2tfaXJxKGxvY2spCQkJX19VTkxPQ0tfSVJRKGxvY2spCisjZGVmaW5lIF93cml0ZV91bmxvY2tfaXJxKGxvY2spCQkJX19VTkxPQ0tfSVJRKGxvY2spCisjZGVmaW5lIF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQlfX1VOTE9DS19JUlFSRVNUT1JFKGxvY2ssIGZsYWdzKQorI2RlZmluZSBfcmVhZF91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncykJX19VTkxPQ0tfSVJRUkVTVE9SRShsb2NrLCBmbGFncykKKyNkZWZpbmUgX3dyaXRlX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQlfX1VOTE9DS19JUlFSRVNUT1JFKGxvY2ssIGZsYWdzKQorCisjZW5kaWYgLyogX19MSU5VWF9TUElOTE9DS19BUElfVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlcy5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjUxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3R5cGVzLmggLSBnZW5lcmljIHNwaW5sb2NrIHR5cGUgZGVmaW5pdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbml0aWFsaXplcnMKKyAqCisgKiBwb3J0aW9ucyBDb3B5cmlnaHQgMjAwNSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCisjIGluY2x1ZGUgPGFzbS9zcGlubG9ja190eXBlcy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXNfdXAuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJcmF3X3NwaW5sb2NrX3QgcmF3X2xvY2s7CisjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCXVuc2lnbmVkIGludCBicmVha19sb2NrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCisJdW5zaWduZWQgaW50IG1hZ2ljLCBvd25lcl9jcHU7CisJdm9pZCAqb3duZXI7CisjZW5kaWYKK30gc3BpbmxvY2tfdDsKKworI2RlZmluZSBTUElOTE9DS19NQUdJQwkJMHhkZWFkNGVhZAorCit0eXBlZGVmIHN0cnVjdCB7CisJcmF3X3J3bG9ja190IHJhd19sb2NrOworI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCXVuc2lnbmVkIGludCBtYWdpYywgb3duZXJfY3B1OworCXZvaWQgKm93bmVyOworI2VuZGlmCit9IHJ3bG9ja190OworCisjZGVmaW5lIFJXTE9DS19NQUdJQwkJMHhkZWFmMWVlZAorCisjZGVmaW5lIFNQSU5MT0NLX09XTkVSX0lOSVQJKCh2b2lkICopLTFMKQorCisjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCisjIGRlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQJCQkJCQlcCisJKHNwaW5sb2NrX3QpCXsJLnJhd19sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VELAlcCisJCQkJLm1hZ2ljID0gU1BJTkxPQ0tfTUFHSUMsCQlcCisJCQkJLm93bmVyID0gU1BJTkxPQ0tfT1dORVJfSU5JVCwJCVwKKwkJCQkub3duZXJfY3B1ID0gLTEgfQorI2RlZmluZSBSV19MT0NLX1VOTE9DS0VECQkJCQkJXAorCShyd2xvY2tfdCkJewkucmF3X2xvY2sgPSBfX1JBV19SV19MT0NLX1VOTE9DS0VELAlcCisJCQkJLm1hZ2ljID0gUldMT0NLX01BR0lDLAkJCVwKKwkJCQkub3duZXIgPSBTUElOTE9DS19PV05FUl9JTklULAkJXAorCQkJCS5vd25lcl9jcHUgPSAtMSB9CisjZWxzZQorIyBkZWZpbmUgU1BJTl9MT0NLX1VOTE9DS0VEIFwKKwkoc3BpbmxvY2tfdCkJewkucmF3X2xvY2sgPSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQgfQorI2RlZmluZSBSV19MT0NLX1VOTE9DS0VEIFwKKwkocndsb2NrX3QpCXsJLnJhd19sb2NrID0gX19SQVdfUldfTE9DS19VTkxPQ0tFRCB9CisjZW5kaWYKKworI2RlZmluZSBERUZJTkVfU1BJTkxPQ0soeCkJc3BpbmxvY2tfdCB4ID0gU1BJTl9MT0NLX1VOTE9DS0VECisjZGVmaW5lIERFRklORV9SV0xPQ0soeCkJcndsb2NrX3QgeCA9IFJXX0xPQ0tfVU5MT0NLRUQKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlc191cC5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlc191cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjJkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3R5cGVzX3VwLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX1VQX0gKKyNkZWZpbmUgX19MSU5VWF9TUElOTE9DS19UWVBFU19VUF9ICisKKyNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICisjIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCisjZW5kaWYKKworLyoKKyAqIGluY2x1ZGUvbGludXgvc3BpbmxvY2tfdHlwZXNfdXAuaCAtIHNwaW5sb2NrIHR5cGUgZGVmaW5pdGlvbnMgZm9yIFVQCisgKgorICogcG9ydGlvbnMgQ29weXJpZ2h0IDIwMDUsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKS4KKyAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2xvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRCB7IDEgfQorCisjZWxzZQorCisvKgorICogQWxsIGdjYyAyLjk1IHZlcnNpb25zIGFuZCBlYXJseSB2ZXJzaW9ucyBvZiAyLjk2IGhhdmUgYSBuYXN0eSBidWcKKyAqIHdpdGggZW1wdHkgaW5pdGlhbGl6ZXJzLgorICovCisjaWYgKF9fR05VQ19fID4gMikKK3R5cGVkZWYgc3RydWN0IHsgfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQgeyB9CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgZ2NjX2lzX2J1Z2d5OyB9IHJhd19zcGlubG9ja190OworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQgKHJhd19zcGlubG9ja190KSB7IDAgfQorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgKF9fR05VQ19fID4gMikKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBubyBkZWJ1ZyB2ZXJzaW9uIG9uIFVQICovCit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VEIHsgfQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsgaW50IGdjY19pc19idWdneTsgfSByYXdfcndsb2NrX3Q7CisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQgKHJhd19yd2xvY2tfdCkgeyAwIH0KKyNlbmRpZgorCisjZW5kaWYgLyogX19MSU5VWF9TUElOTE9DS19UWVBFU19VUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3VwLmggYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhY2NmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdXAuaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVVBfSAorI2RlZmluZSBfX0xJTlVYX1NQSU5MT0NLX1VQX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCisvKgorICogaW5jbHVkZS9saW51eC9zcGlubG9ja191cC5oIC0gVVAtZGVidWcgdmVyc2lvbiBvZiBzcGlubG9ja3MuCisgKgorICogcG9ydGlvbnMgQ29weXJpZ2h0IDIwMDUsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKS4KKyAqCisgKiBJbiB0aGUgZGVidWcgY2FzZSwgMSBtZWFucyB1bmxvY2tlZCwgMCBtZWFucyBsb2NrZWQuICh0aGUgdmFsdWVzCisgKiBhcmUgaW52ZXJ0ZWQsIHRvIGNhdGNoIGluaXRpYWxpemF0aW9uIGJ1Z3MpCisgKgorICogTm8gYXRvbWljaXR5IGFueXdoZXJlLCB3ZSBhcmUgb24gVVAuCisgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpCQkoKHgpLT5zbG9jayA9PSAwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCWxvY2stPnNsb2NrID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX3Jhd19zcGluX2xvY2tfZmxhZ3MocmF3X3NwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2stPnNsb2NrID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCWNoYXIgb2xkdmFsID0gbG9jay0+c2xvY2s7CisKKwlsb2NrLT5zbG9jayA9IDA7CisKKwlyZXR1cm4gb2xkdmFsID4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCWxvY2stPnNsb2NrID0gMTsKK30KKworLyoKKyAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLiBObyBkZWJ1ZyB2ZXJzaW9uLgorICovCisjZGVmaW5lIF9fcmF3X3JlYWRfbG9jayhsb2NrKQkJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fcmF3X3dyaXRlX2xvY2sobG9jaykJCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3Jhd19yZWFkX3RyeWxvY2sobG9jaykJKHsgKHZvaWQpKGxvY2spOyAxOyB9KQorI2RlZmluZSBfX3Jhd193cml0ZV90cnlsb2NrKGxvY2spCSh7ICh2b2lkKShsb2NrKTsgMTsgfSkKKyNkZWZpbmUgX19yYXdfcmVhZF91bmxvY2sobG9jaykJCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3Jhd193cml0ZV91bmxvY2sobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisKKyNlbHNlIC8qIERFQlVHX1NQSU5MT0NLICovCisjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spCSgodm9pZCkobG9jayksIDApCisvKiBmb3Igc2NoZWQuYyBhbmQga2VybmVsX2xvY2suYzogKi8KKyMgZGVmaW5lIF9fcmF3X3NwaW5fbG9jayhsb2NrKQkJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBfX3Jhd19zcGluX3VubG9jayhsb2NrKQlkbyB7ICh2b2lkKShsb2NrKTsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIF9fcmF3X3NwaW5fdHJ5bG9jayhsb2NrKQkoeyAodm9pZCkobG9jayk7IDE7IH0pCisjZW5kaWYgLyogREVCVUdfU1BJTkxPQ0sgKi8KKworI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKGxvY2spCSgoKHZvaWQpKGxvY2spLCAxKSkKKyNkZWZpbmUgX19yYXdfd3JpdGVfY2FuX2xvY2sobG9jaykJKCgodm9pZCkobG9jayksIDEpKQorCisjZGVmaW5lIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCQlkbyB7IGNwdV9yZWxheCgpOyB9IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJTkxPQ0tfVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmgKaW5kZXggNjg2NDA2My4uYzRlM2VhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jYWNoZS5oCkBAIC02MCw2ICs2MCw3IEBACiAjZGVmaW5lCUNBQ0hFX05FV19FWFBJUlkgMTIwCS8qIGtlZXAgbmV3IHRoaW5ncyBwZW5kaW5nIGNvbmZpcm1hdGlvbiBmb3IgMTIwIHNlY29uZHMgKi8KIAogc3RydWN0IGNhY2hlX2RldGFpbCB7CisJc3RydWN0IG1vZHVsZSAqCQlvd25lcjsKIAlpbnQJCQloYXNoX3NpemU7CiAJc3RydWN0IGNhY2hlX2hlYWQgKioJaGFzaF90YWJsZTsKIAlyd2xvY2tfdAkJaGFzaF9sb2NrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggZTgyYmU5Ni4uNTMyYTZjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC03MTEsNiArNzExLDcgQEAKIAlERVZfUkFJRD00LAogCURFVl9NQUNfSElEPTUsCiAJREVWX1NDU0k9NiwKKwlERVZfSVBNST03LAogfTsKIAogLyogL3Byb2Mvc3lzL2Rldi9jZHJvbSAqLwpAQCAtNzc2LDYgKzc3NywxMSBAQAogCURFVl9TQ1NJX0xPR0dJTkdfTEVWRUw9MSwKIH07CiAKKy8qIC9wcm9jL3N5cy9kZXYvaXBtaSAqLworZW51bSB7CisJREVWX0lQTUlfUE9XRVJPRkZfUE9XRVJDWUNMRT0xLAorfTsKKwogLyogL3Byb2Mvc3lzL2FiaSAqLwogZW51bQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCA1NjM0NDk3Li44ZTgzZjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMjgsMTcgKzI4LDEwIEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAvKiBQYXJhbWV0ZXJzIHVzZWQgdG8gY29udmVydCB0aGUgdGltZXNwZWMgdmFsdWVzICovCi0jaWZuZGVmIFVTRUNfUEVSX1NFQworI2RlZmluZSBNU0VDX1BFUl9TRUMgKDEwMDBMKQogI2RlZmluZSBVU0VDX1BFUl9TRUMgKDEwMDAwMDBMKQotI2VuZGlmCi0KLSNpZm5kZWYgTlNFQ19QRVJfU0VDCiAjZGVmaW5lIE5TRUNfUEVSX1NFQyAoMTAwMDAwMDAwMEwpCi0jZW5kaWYKLQotI2lmbmRlZiBOU0VDX1BFUl9VU0VDCiAjZGVmaW5lIE5TRUNfUEVSX1VTRUMgKDEwMDBMKQotI2VuZGlmCiAKIHN0YXRpYyBfX2lubGluZV9fIGludCB0aW1lc3BlY19lcXVhbChzdHJ1Y3QgdGltZXNwZWMgKmEsIHN0cnVjdCB0aW1lc3BlYyAqYikgCiB7IApAQCAtOTcsNyArOTAsNiBAQAogZXh0ZXJuIGludCBkb19zeXNfc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopOwogZXh0ZXJuIHZvaWQgY2xvY2tfd2FzX3NldCh2b2lkKTsgLy8gY2FsbCB3aGVuIGV2ZXIgdGhlIGNsb2NrIGlzIHNldAogZXh0ZXJuIGludCBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRwKTsKLWV4dGVybiBsb25nIGRvX25hbm9zbGVlcChzdHJ1Y3QgdGltZXNwZWMgKnQpOwogZXh0ZXJuIGxvbmcgZG9fdXRpbWVzKGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICogdGltZXMpOwogc3RydWN0IGl0aW1lcnZhbDsKIGV4dGVybiBpbnQgZG9fc2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUsIHN0cnVjdCBpdGltZXJ2YWwgKm92YWx1ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKaW5kZXggMjIxZjgxYS4uMzM0MGYzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXIuaApAQCAtMzIsNiArMzIsMTAgQEAKIAkJLm1hZ2ljID0gVElNRVJfTUFHSUMsCQkJCVwKIAl9CiAKKyNkZWZpbmUgREVGSU5FX1RJTUVSKF9uYW1lLCBfZnVuY3Rpb24sIF9leHBpcmVzLCBfZGF0YSkJCVwKKwlzdHJ1Y3QgdGltZXJfbGlzdCBfbmFtZSA9CQkJCVwKKwkJVElNRVJfSU5JVElBTElaRVIoX2Z1bmN0aW9uLCBfZXhwaXJlcywgX2RhdGEpCisKIHZvaWQgZmFzdGNhbGwgaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHRpbWVyKTsKIAogLyoqKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1leC5oIGIvaW5jbHVkZS9saW51eC90aW1leC5oCmluZGV4IDc0ZmRkMDcuLjdlMDUwYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKQEAgLTI2MCw2ICsyNjAsMjkgQEAKIGV4dGVybiBsb25nIHBwc19lcnJjbnQ7CQkvKiBjYWxpYnJhdGlvbiBlcnJvcnMgKi8KIGV4dGVybiBsb25nIHBwc19zdGJjbnQ7CQkvKiBzdGFiaWxpdHkgbGltaXQgZXhjZWVkZWQgKi8KIAorLyoqCisgKiBudHBfY2xlYXIgLSBDbGVhcnMgdGhlIE5UUCBzdGF0ZSB2YXJpYWJsZXMKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIGEgd3JpdGUgb24gdGhlIHh0aW1lX2xvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50cF9jbGVhcih2b2lkKQoreworCXRpbWVfYWRqdXN0ID0gMDsJCS8qIHN0b3AgYWN0aXZlIGFkanRpbWUoKSAqLworCXRpbWVfc3RhdHVzIHw9IFNUQV9VTlNZTkM7CisJdGltZV9tYXhlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl0aW1lX2VzdGVycm9yID0gTlRQX1BIQVNFX0xJTUlUOworfQorCisvKioKKyAqIG50cF9zeW5jZWQgLSBSZXR1cm5zIDEgaWYgdGhlIE5UUCBzdGF0dXMgaXMgbm90IFVOU1lOQworICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRwX3N5bmNlZCh2b2lkKQoreworCXJldHVybiAhKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQyk7Cit9CisKKwogI2lmZGVmIENPTkZJR19USU1FX0lOVEVSUE9MQVRJT04KIAogI2RlZmluZSBUSU1FX1NPVVJDRV9DUFUgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCmluZGV4IDAzMjAyMjUuLjNkZjFkNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKQEAgLTEzNSw2ICsxMzUsMjkgQEAKIH0KICNlbmRpZgogCisvKiBzY2hlZF9kb21haW5zIFNEX0FMTE5PREVTX0lOSVQgZm9yIE5VTUEgbWFjaGluZXMgKi8KKyNkZWZpbmUgU0RfQUxMTk9ERVNfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewlcCisJLnNwYW4JCQk9IENQVV9NQVNLX05PTkUsCVwKKwkucGFyZW50CQkJPSBOVUxMLAkJCVwKKwkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKKwkubWluX2ludGVydmFsCQk9IDY0LAkJCVwKKwkubWF4X2ludGVydmFsCQk9IDY0Km51bV9vbmxpbmVfY3B1cygpLAlcCisJLmJ1c3lfZmFjdG9yCQk9IDEyOCwJCQlcCisJLmltYmFsYW5jZV9wY3QJCT0gMTMzLAkJCVwKKwkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDAwMDApLAkJXAorCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCisJLmJ1c3lfaWR4CQk9IDMsCQkJXAorCS5pZGxlX2lkeAkJPSAzLAkJCVwKKwkubmV3aWRsZV9pZHgJCT0gMCwgLyogdW51c2VkICovCVwKKwkud2FrZV9pZHgJCT0gMCwgLyogdW51c2VkICovCVwKKwkuZm9ya2V4ZWNfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCisJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAorCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFLAlcCisJLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAorCS5iYWxhbmNlX2ludGVydmFsCT0gNjQsCQkJXAorCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXAorfQorCiAjaWZkZWYgQ09ORklHX05VTUEKICNpZm5kZWYgU0RfTk9ERV9JTklUCiAjZXJyb3IgUGxlYXNlIGRlZmluZSBhbiBhcHByb3ByaWF0ZSBTRF9OT0RFX0lOSVQgaW4gaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCEhIQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFuc3BvcnRfY2xhc3MuaCBiL2luY2x1ZGUvbGludXgvdHJhbnNwb3J0X2NsYXNzLmgKaW5kZXggODdkOThkMS4uMWQ2Y2MyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90cmFuc3BvcnRfY2xhc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYW5zcG9ydF9jbGFzcy5oCkBAIC0xMiwxMSArMTIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmg+CiAKK3N0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyOworCiBzdHJ1Y3QgdHJhbnNwb3J0X2NsYXNzIHsKIAlzdHJ1Y3QgY2xhc3MgY2xhc3M7Ci0JaW50ICgqc2V0dXApKHN0cnVjdCBkZXZpY2UgKik7Ci0JaW50ICgqY29uZmlndXJlKShzdHJ1Y3QgZGV2aWNlICopOwotCWludCAoKnJlbW92ZSkoc3RydWN0IGRldmljZSAqKTsKKwlpbnQgKCpzZXR1cCkoc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKiwgc3RydWN0IGRldmljZSAqLAorCQkgICAgIHN0cnVjdCBjbGFzc19kZXZpY2UgKik7CisJaW50ICgqY29uZmlndXJlKShzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqLCBzdHJ1Y3QgZGV2aWNlICosCisJCQkgc3RydWN0IGNsYXNzX2RldmljZSAqKTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICosIHN0cnVjdCBkZXZpY2UgKiwKKwkJICAgICAgc3RydWN0IGNsYXNzX2RldmljZSAqKTsKIH07CiAKICNkZWZpbmUgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1MoY2xzLCBubSwgc3UsIHJtLCBjZmcpCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggNTlmZjQyYy4uMTI2N2Y4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC03NCw3ICs3NCw4IEBACiAJdTE2IHZlc2FwbV9vZmY7CQkvKiAweDMwICovCiAJdTE2IHBhZ2VzOwkJLyogMHgzMiAqLwogCXUxNiB2ZXNhX2F0dHJpYnV0ZXM7CS8qIDB4MzQgKi8KLQkJCQkvKiAweDM2IC0tIDB4M2YgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwl1MzIgIGNhcGFiaWxpdGllczsgICAgICAvKiAweDM2ICovCisJCQkJLyogMHgzYSAtLSAweDNmIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCiB9OwogCiBleHRlcm4gc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggNzI0NjM3Ny4uNGRiZTU4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KIAogI2RlZmluZSBVU0JfTUFKT1IJCQkxODAKKyNkZWZpbmUgVVNCX0RFVklDRV9NQUpPUgkJMTg5CiAKIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTM0OSw2ICszNTAsNyBAQAogCWNoYXIgKm1hbnVmYWN0dXJlcjsKIAljaGFyICpzZXJpYWw7CQkJLyogc3RhdGljIHN0cmluZ3MgZnJvbSB0aGUgZGV2aWNlICovCiAJc3RydWN0IGxpc3RfaGVhZCBmaWxlbGlzdDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJc3RydWN0IGRlbnRyeSAqdXNiZnNfZGVudHJ5OwkvKiB1c2JmcyBkZW50cnkgZW50cnkgZm9yIHRoZSBkZXZpY2UgKi8KIAogCS8qCkBAIC02MTQsNyArNjE2LDYgQEAKICNkZWZpbmUgVVJCX0lTT19BU0FQCQkweDAwMDIJLyogaXNvLW9ubHksIHVyYi0+c3RhcnRfZnJhbWUgaWdub3JlZCAqLwogI2RlZmluZSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUAkweDAwMDQJLyogdXJiLT50cmFuc2Zlcl9kbWEgdmFsaWQgb24gc3VibWl0ICovCiAjZGVmaW5lIFVSQl9OT19TRVRVUF9ETUFfTUFQCTB4MDAwOAkvKiB1cmItPnNldHVwX2RtYSB2YWxpZCBvbiBzdWJtaXQgKi8KLSNkZWZpbmUgVVJCX0FTWU5DX1VOTElOSwkweDAwMTAJLyogdXNiX3VubGlua191cmIoKSByZXR1cm5zIGFzYXAgKi8KICNkZWZpbmUgVVJCX05PX0ZTQlIJCTB4MDAyMAkvKiBVSENJLXNwZWNpZmljICovCiAjZGVmaW5lIFVSQl9aRVJPX1BBQ0tFVAkJMHgwMDQwCS8qIEZpbmlzaCBidWxrIE9VVHMgd2l0aCBzaG9ydCBwYWNrZXQgKi8KICNkZWZpbmUgVVJCX05PX0lOVEVSUlVQVAkweDAwODAJLyogSElOVDogbm8gbm9uLWVycm9yIGludGVycnVwdCBuZWVkZWQgKi8KQEAgLTcyMiwxMyArNzIzLDcgQEAKICAqIEluaXRpYWxpemF0aW9uOgogICoKICAqIEFsbCBVUkJzIHN1Ym1pdHRlZCBtdXN0IGluaXRpYWxpemUgdGhlIGRldiwgcGlwZSwgdHJhbnNmZXJfZmxhZ3MgKG1heSBiZQotICogemVybyksIGFuZCBjb21wbGV0ZSBmaWVsZHMuCi0gKiBUaGUgVVJCX0FTWU5DX1VOTElOSyB0cmFuc2ZlciBmbGFnIGFmZmVjdHMgbGF0ZXIgaW52b2NhdGlvbnMgb2YKLSAqIHRoZSB1c2JfdW5saW5rX3VyYigpIHJvdXRpbmUuICBOb3RlOiBGYWlsdXJlIHRvIHNldCBVUkJfQVNZTkNfVU5MSU5LCi0gKiB3aXRoIHVzYl91bmxpbmtfdXJiKCkgaXMgZGVwcmVjYXRlZC4gIEZvciBzeW5jaHJvbm91cyB1bmxpbmtzIHVzZQotICogdXNiX2tpbGxfdXJiKCkgaW5zdGVhZC4KLSAqCi0gKiBBbGwgVVJCcyBtdXN0IGFsc28gaW5pdGlhbGl6ZSAKKyAqIHplcm8pLCBhbmQgY29tcGxldGUgZmllbGRzLiAgQWxsIFVSQnMgbXVzdCBhbHNvIGluaXRpYWxpemUKICAqIHRyYW5zZmVyX2J1ZmZlciBhbmQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aC4gIFRoZXkgbWF5IHByb3ZpZGUgdGhlCiAgKiBVUkJfU0hPUlRfTk9UX09LIHRyYW5zZmVyIGZsYWcsIGluZGljYXRpbmcgdGhhdCBzaG9ydCByZWFkcyBhcmUKICAqIHRvIGJlIHRyZWF0ZWQgYXMgZXJyb3JzOyB0aGF0IGZsYWcgaXMgaW52YWxpZCBmb3Igd3JpdGUgcmVxdWVzdHMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmggYi9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmgKaW5kZXggNWY1YTlkOS4uNDM2ZGQ4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfaXNwMTE2eC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX2lzcDExNnguaApAQCAtNywzNiArNywxOCBAQAogc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSB7CiAJLyogRW5hYmxlIGludGVybmFsIHJlc2lzdG9ycyBvbiBkb3duc3RyZWFtIHBvcnRzICovCiAJdW5zaWduZWQgc2VsMTVLcmVzOjE7Ci0JLyogQ2hpcCdzIGludGVybmFsIGNsb2NrIHdvbid0IGJlIHN0b3BwZWQgaW4gc3VzcGVuZGVkIHN0YXRlLgotCSAgIFNldHRpbmcvdW5zZXR0aW5nIHRoaXMgYml0IHRha2VzIGVmZmVjdCBvbmx5IGlmCi0JICAgJ3JlbW90ZV93YWtldXBfZW5hYmxlJyBiZWxvdyBpcyBub3Qgc2V0LiAqLwotCXVuc2lnbmVkIGNsa25vdHN0b3A6MTsKLQkvKiBPbi1jaGlwIG92ZXJjdXJyZW50IHByb3RlY3Rpb24gKi8KKwkvKiBPbi1jaGlwIG92ZXJjdXJyZW50IGRldGVjdGlvbiAqLwogCXVuc2lnbmVkIG9jX2VuYWJsZToxOwogCS8qIElOVCBvdXRwdXQgcG9sYXJpdHkgKi8KIAl1bnNpZ25lZCBpbnRfYWN0X2hpZ2g6MTsKIAkvKiBJTlQgZWRnZSBvciBsZXZlbCB0cmlnZ2VyZWQgKi8KIAl1bnNpZ25lZCBpbnRfZWRnZV90cmlnZ2VyZWQ6MTsKLQkvKiBXQUtFVVAgcGluIGNvbm5lY3RlZCAtIE5PVCBTVVBQT1JURUQgICovCi0JLyogdW5zaWduZWQgcmVtb3RlX3dha2V1cF9jb25uZWN0ZWQ6MTsgKi8KLQkvKiBXYWtldXAgYnkgZGV2aWNlcyBvbiB1c2IgYnVzIGVuYWJsZWQgKi8KKwkvKiBFbmFibGUgd2FrZXVwIGJ5IGRldmljZXMgb24gdXNiIGJ1cyAoZS5nLiB3YWtldXAKKwkgICBieSBhdHRhY2htZW50L2RldGFjaG1lbnQgb3IgYnkgZGV2aWNlIGFjdGl2aXR5CisJICAgc3VjaCBhcyBtb3ZpbmcgYSBtb3VzZSkuIFdoZW4gY2hvc2VuLCB0aGlzIG9wdGlvbgorCSAgIHByZXZlbnRzIHN0b3BwaW5nIGludGVybmFsIGNsb2NrLCBpbmNyZWFzaW5nCisJICAgdGhlcmVieSBwb3dlciBjb25zdW1wdGlvbiBpbiBzdXNwZW5kZWQgc3RhdGUuICovCiAJdW5zaWduZWQgcmVtb3RlX3dha2V1cF9lbmFibGU6MTsKLQkvKiBTd2l0Y2ggb3Igbm90IHRvIHN3aXRjaCAoa2VlcCBhbHdheXMgcG93ZXJlZCkgKi8KLQl1bnNpZ25lZCBub19wb3dlcl9zd2l0Y2hpbmc6MTsKLQkvKiBHYW5nZWQgcG9ydCBwb3dlciBzd2l0Y2hpbmcgKDApIG9yIGluZGl2aWR1YWwgcG9ydAotCSAgIHBvd2VyIHN3aXRjaGluZyAoMSkgKi8KLQl1bnNpZ25lZCBwb3dlcl9zd2l0Y2hpbmdfbW9kZToxOwotCS8qIEdpdmVuIHBvcnRfcG93ZXIsIG1zZWMvMiBhZnRlciBwb3dlciBvbiB0aWxsIHBvd2VyIGdvb2QgKi8KLQl1OCBwb3RwZzsKLQkvKiBIYXJkd2FyZSByZXNldCBzZXQvY2xlYXIuIElmIGltcGxlbWVudGVkLCB0aGlzIGZ1bmN0aW9uIG11c3Q6Ci0JICAgaWYgc2V0ID09IDAsICAgZGVhc3NlcnQgY2hpcCdzIEhXIHJlc2V0IHBpbgotCSAgIG90aGVyd2lzZSwgICAgIGFzc2VydCBjaGlwJ3MgSFcgcmVzZXQgcGluICAgICAgICovCi0Jdm9pZCAoKnJlc2V0KSAoc3RydWN0IGRldmljZSAqIGRldiwgaW50IHNldCk7Ci0JLyogSGFyZHdhcmUgY2xvY2sgc3RhcnQvc3RvcC4gSWYgaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24gbXVzdDoKLQkgICBpZiBzdGFydCA9PSAwLCAgICBzdG9wIHRoZSBleHRlcm5hbCBjbG9jawotCSAgIG90aGVyd2lzZSwgICAgICAgIHN0YXJ0IHRoZSBleHRlcm5hbCBjbG9jawotCSAqLwotCXZvaWQgKCpjbG9jaykgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIGludCBzdGFydCk7CiAJLyogSW50ZXItaW8gZGVsYXkgKG5zKS4gVGhlIGNoaXAgaXMgcGlja3kgYWJvdXQgYWNjZXNzIHRpbWluZ3M7IGl0CiAJICAgZXhwZWN0cyBhdCBsZWFzdDoKIAkgICAxNTBucyBkZWxheSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGFjY2Vzc2VzIHRvIERBVEFfUkVHLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oCmluZGV4IDlkNmZiZGUuLjFjYzhjMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2LmgKQEAgLTMsNyArMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjZGVmaW5lIEhBVkVfVjRMMiAxCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CkBAIC0yOSw3ICsyOCw2IEBACiAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CiAKIAotI2lmIDEgLyogdG8gYmUgcmVtb3ZlZCBpbiAyLjcueCAqLwogCS8qIG9ic29sZXRlIC0tIGZvcHMtPm93bmVyIGlzIHVzZWQgaW5zdGVhZCAqLwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCS8qIGRldi0+ZHJpdmVyX2RhdGEgd2lsbCBiZSB1c2VkIGluc3RlYWQgc29tZSBkYXkuCkBAIC0zNyw3ICszNSw2IEBACiAJICogc28gdGhlIHN3aXRjaCBvdmVyIHdpbGwgYmUgdHJhbnNwYXJlbnQgZm9yIHlvdS4KIAkgKiBPciB1c2Uge3BjaXx1c2J9X3tnZXR8c2V0fV9kcnZkYXRhKCkgZGlyZWN0bHkuICovCiAJdm9pZCAqcHJpdjsKLSNlbmRpZgogCiAJLyogZm9yIHZpZGVvZGV2LmMgaW50ZW5hbCB1c2FnZSAtLSBwbGVhc2UgZG9uJ3QgdG91Y2ggKi8KIAlpbnQgdXNlcnM7ICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW9fZXhjbHVzaXZlX3tvcGVufGNsb3NlfSAuLi4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IGFjYmZjNTIuLmY2MjNhMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtMjcwLDcgKzI3MCw2IEBACiAvKiBUaGUgYWJvdmUgaXMgYmFzZWQgb24gU01QVEUgdGltZWNvZGVzICovCiAKIAotI2lmIDEKIC8qCiAgKglNIFAgRSBHICAgQyBPIE0gUCBSIEUgUyBTIEkgTyBOICAgUCBBIFIgQSBNIEUgVCBFIFIgUwogICoKQEAgLTM1Nyw3ICszNTYsNiBAQAogCS8qIEkgZG9uJ3QgZXhwZWN0IHRoZSBhYm92ZSBiZWluZyBwZXJmZWN0IHlldCA7KSAqLwogCV9fdTMyCQkJCXJlc2VydmVkXzVbOF07CiB9OwotI2VuZGlmCiAKIHN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbgogewpAQCAtODcxLDEwICs4NjksOCBAQAogI2RlZmluZSBWSURJT0NfRU5VTV9GTVQgICAgICAgICBfSU9XUiAoJ1YnLCAgMiwgc3RydWN0IHY0bDJfZm10ZGVzYykKICNkZWZpbmUgVklESU9DX0dfRk1UCQlfSU9XUiAoJ1YnLCAgNCwgc3RydWN0IHY0bDJfZm9ybWF0KQogI2RlZmluZSBWSURJT0NfU19GTVQJCV9JT1dSICgnVicsICA1LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCi0jaWYgMSAvKiBleHBlcmltZW50YWwgKi8KICNkZWZpbmUgVklESU9DX0dfTVBFR0NPTVAgICAgICAgX0lPUiAgKCdWJywgIDYsIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24pCiAjZGVmaW5lIFZJRElPQ19TX01QRUdDT01QICAgICAJX0lPVyAgKCdWJywgIDcsIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24pCi0jZW5kaWYKICNkZWZpbmUgVklESU9DX1JFUUJVRlMJCV9JT1dSICgnVicsICA4LCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycykKICNkZWZpbmUgVklESU9DX1FVRVJZQlVGCQlfSU9XUiAoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyKQogI2RlZmluZSBWSURJT0NfR19GQlVGCQlfSU9SICAoJ1YnLCAxMCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmggYi9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKaW5kZXggYWU0ODVmOS4uYTU1NWEwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCisrKyBiL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lIGEgc2V0IG9mIHN0YW5kYXJkIHdpcmVsZXNzIGV4dGVuc2lvbnMKICAqCi0gKiBWZXJzaW9uIDoJMTgJMTIuMy4wNQorICogVmVyc2lvbiA6CTE5CTE4LjMuMDUKICAqCiAgKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkBAIC02OSw4ICs2OSw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogVG8gbWluaW1pc2UgcHJvYmxlbXMgaW4gdXNlciBzcGFjZSwgSSBtaWdodCByZW1vdmUgdGhvc2UgaGVhZGVycwotICogYXQgc29tZSBwb2ludC4gSmVhbiBJSSAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkvKiBmb3IgImNhZGRyX3QiIGV0IGFsCQkqLwogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgkJLyogZm9yICJzdHJ1Y3Qgc29ja2FkZHIiIGV0IGFsCSovCiAjaW5jbHVkZSA8bGludXgvaWYuaD4JCQkvKiBmb3IgSUZOQU1TSVogYW5kIGNvLi4uICovCkBAIC04Miw3ICs4MCw3IEBACiAgKiAodGhlcmUgaXMgc29tZSBzdHVmZiB0aGF0IHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4uLikKICAqIEkganVzdCBwbGFuIHRvIGluY3JlbWVudCB3aXRoIGVhY2ggbmV3IHZlcnNpb24uCiAgKi8KLSNkZWZpbmUgV0lSRUxFU1NfRVhUCTE4CisjZGVmaW5lIFdJUkVMRVNTX0VYVAkxOQogCiAvKgogICogQ2hhbmdlcyA6CkBAIC0xOTcsNiArMTk1LDE1IEBACiAgKgkgIHJlbGF0ZWQgcGFyYW1ldGVycyAoZXh0ZW5zaWJsZSB1cCB0byA0MDk2IHBhcmFtZXRlciB2YWx1ZXMpCiAgKgktIEFkZCB3aXJlbGVzcyBldmVudHM6IElXRVZHRU5JRSwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLAogICoJICBJV0VWQVNTT0NSRVFJRSwgSVdFVkFTU09DUkVTUElFLCBJV0VWUE1LSURDQU5ECisgKgorICogVjE4IHRvIFYxOQorICogLS0tLS0tLS0tLQorICoJLSBSZW1vdmUgKHN0cnVjdCBpd19wb2ludCAqKS0+cG9pbnRlciBmcm9tIGV2ZW50cyBhbmQgc3RyZWFtcworICoJLSBSZW1vdmUgaGVhZGVyIGluY2x1ZGVzIHRvIGhlbHAgdXNlciBzcGFjZQorICoJLSBJbmNyZWFzZSBJV19FTkNPRElOR19UT0tFTl9NQVggZnJvbSAzMiB0byA2NAorICoJLSBBZGQgSVdfUVVBTF9BTExfVVBEQVRFRCBhbmQgSVdfUVVBTF9BTExfSU5WQUxJRCBtYWNyb3MKKyAqCS0gQWRkIGV4cGxpY2l0IGZsYWcgdG8gdGVsbCBzdGF0cyBhcmUgaW4gZEJtIDogSVdfUVVBTF9EQk0KKyAqCS0gQWRkIElXX0lPQ1RMX0lEWCgpIGFuZCBJV19FVkVOVF9JRFgoKSBtYWNyb3MKICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMyMiw2ICszMjksNyBAQAogLyogVGhlIGZpcnN0IGFuZCB0aGUgbGFzdCAocmFuZ2UpICovCiAjZGVmaW5lIFNJT0NJV0ZJUlNUCTB4OEIwMAogI2RlZmluZSBTSU9DSVdMQVNUCVNJT0NJV0xBU1RQUklWCQkvKiAweDhCRkYgKi8KKyNkZWZpbmUgSVdfSU9DVExfSURYKGNtZCkJKChjbWQpIC0gU0lPQ0lXRklSU1QpCiAKIC8qIEV2ZW4gOiBnZXQgKHdvcmxkIGFjY2VzcyksIG9kZCA6IHNldCAocm9vdCBhY2Nlc3MpICovCiAjZGVmaW5lIElXX0lTX1NFVChjbWQpCSghKChjbWQpICYgMHgxKSkKQEAgLTM2Niw2ICszNzQsNyBAQAogCQkJCQkgKiAoc3RydWN0IGl3X3Bta2lkX2NhbmQpICovCiAKICNkZWZpbmUgSVdFVkZJUlNUCTB4OEMwMAorI2RlZmluZSBJV19FVkVOVF9JRFgoY21kKQkoKGNtZCkgLSBJV0VWRklSU1QpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJTkZPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCkBAIC00MjcsMTIgKzQzNiwxNSBAQAogI2RlZmluZSBJV19NT0RFX01PTklUT1IJNgkvKiBQYXNzaXZlIG1vbml0b3IgKGxpc3RlbiBvbmx5KSAqLwogCiAvKiBTdGF0aXN0aWNzIGZsYWdzIChiaXRtYXNrIGluIHVwZGF0ZWQpICovCi0jZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVECTB4MQkvKiBWYWx1ZSB3YXMgdXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KLSNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVECTB4MgotI2RlZmluZSBJV19RVUFMX05PSVNFX1VQREFURUQJMHg0CisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVECTB4MDEJLyogVmFsdWUgd2FzIHVwZGF0ZWQgc2luY2UgbGFzdCByZWFkICovCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRAkweDAyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRAkweDA0CisjZGVmaW5lIElXX1FVQUxfQUxMX1VQREFURUQJMHgwNworI2RlZmluZSBJV19RVUFMX0RCTQkJMHgwOAkvKiBMZXZlbCArIE5vaXNlIGFyZSBkQm0gKi8KICNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQJMHgxMAkvKiBEcml2ZXIgZG9lc24ndCBwcm92aWRlIHZhbHVlICovCiAjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRAkweDIwCiAjZGVmaW5lIElXX1FVQUxfTk9JU0VfSU5WQUxJRAkweDQwCisjZGVmaW5lIElXX1FVQUxfQUxMX0lOVkFMSUQJMHg3MAogCiAvKiBGcmVxdWVuY3kgZmxhZ3MgKi8KICNkZWZpbmUgSVdfRlJFUV9BVVRPCQkweDAwCS8qIExldCB0aGUgZHJpdmVyIGRlY2lkZXMgKi8KQEAgLTQ0Myw3ICs0NTUsNyBAQAogI2RlZmluZSBJV19NQVhfRU5DT0RJTkdfU0laRVMJOAogCiAvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGVuY29kaW5nIHRva2VuIGluIGJ5dGVzICovCi0jZGVmaW5lIElXX0VOQ09ESU5HX1RPS0VOX01BWAkzMgkvKiAyNTYgYml0cyAoZm9yIG5vdykgKi8KKyNkZWZpbmUgSVdfRU5DT0RJTkdfVE9LRU5fTUFYCTY0CS8qIDUxMiBiaXRzIChmb3Igbm93KSAqLwogCiAvKiBGbGFncyBmb3IgZW5jb2RpbmcgKGFsb25nIHdpdGggdGhlIHRva2VuKSAqLwogI2RlZmluZSBJV19FTkNPREVfSU5ERVgJCTB4MDBGRgkvKiBUb2tlbiBpbmRleCAoaWYgbmVlZGVkKSAqLwpAQCAtMTAzOSwxMiArMTA1MSwxNiBAQAogI2RlZmluZSBJV19FVl9DSEFSX0xFTgkoSVdfRVZfTENQX0xFTiArIElGTkFNU0laKQogI2RlZmluZSBJV19FVl9VSU5UX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihfX3UzMikpCiAjZGVmaW5lIElXX0VWX0ZSRVFfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19mcmVxKSkKLSNkZWZpbmUgSVdfRVZfUE9JTlRfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19wb2ludCkpCiAjZGVmaW5lIElXX0VWX1BBUkFNX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcGFyYW0pKQogI2RlZmluZSBJV19FVl9BRERSX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKQogI2RlZmluZSBJV19FVl9RVUFMX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpCiAKLS8qIE5vdGUgOiBpbiB0aGUgY2FzZSBvZiBpd19wb2ludCwgdGhlIGV4dHJhIGRhdGEgd2lsbCBjb21lIGF0IHRoZQotICogZW5kIG9mIHRoZSBldmVudCAqLworLyogaXdfcG9pbnQgZXZlbnRzIGFyZSBzcGVjaWFsLiBGaXJzdCwgdGhlIHBheWxvYWQgKGV4dHJhIGRhdGEpIGNvbWUgYXQKKyAqIHRoZSBlbmQgb2YgdGhlIGV2ZW50LCBzbyB0aGV5IGFyZSBiaWdnZXIgdGhhbiBJV19FVl9QT0lOVF9MRU4uIFNlY29uZCwKKyAqIHdlIG9taXQgdGhlIHBvaW50ZXIsIHNvIHN0YXJ0IGF0IGFuIG9mZnNldC4gKi8KKyNkZWZpbmUgSVdfRVZfUE9JTlRfT0ZGICgoKGNoYXIgKikgJigoKHN0cnVjdCBpd19wb2ludCAqKSBOVUxMKS0+bGVuZ3RoKSkgLSBcCisJCQkgIChjaGFyICopIE5VTEwpCisjZGVmaW5lIElXX0VWX1BPSU5UX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcG9pbnQpIC0gXAorCQkJIElXX0VWX1BPSU5UX09GRikKIAogI2VuZGlmCS8qIF9MSU5VWF9XSVJFTEVTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAppbmRleCA1NDJkYmFlLi4zNDNkODgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKQEAgLTEwOSw4ICsxMDksNiBAQAogaW50IGRvX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKIGludCBzeW5jX3BhZ2VfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQlsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpOwotaW50IHN5bmNfcGFnZV9yYW5nZV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UKLQkJKm1hcHBpbmcsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCk7CiAKIC8qIHBkZmx1c2guYyAqLwogZXh0ZXJuIGludCBucl9wZGZsdXNoX3RocmVhZHM7CS8qIEdsb2JhbCBzbyBpdCBjYW4gYmUgZXhwb3J0ZWQgdG8gc3lzY3RsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oIGIvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaAppbmRleCBjZDgzMTE2Li5hN2NlZWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBhdWRpb2NoaXAuaCx2IDEuNSAyMDA1LzA2LzE2IDIyOjU5OjE2IGhoYWNrbWFubiBFeHAgJAogICovCiAKICNpZm5kZWYgQVVESU9DSElQX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaWQuaCBiL2luY2x1ZGUvbWVkaWEvaWQuaAppbmRleCA4MDFkZGVmLi42ZDAyYzk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2lkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pZC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICRJZDogaWQuaCx2IDEuNCAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKICAqLwogCiAvKiBGSVhNRTogdGhpcyB0ZW1wb3JhcmVseSwgdW50aWwgdGhlc2UgYXJlIGluY2x1ZGVkIGluIGxpbnV4L2kyYy1pZC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaAppbmRleCA2OTg2NzA1Li4wMWI1NjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiBpci1jb21tb24uaCx2IDEuOSAyMDA1LzA1LzE1IDE5OjAxOjI2IG1jaGVoYWIgRXhwICQKICAqCiAgKiBzb21lIGNvbW1vbiBzdHJ1Y3RzIGFuZCBmdW5jdGlvbnMgdG8gaGFuZGxlIGluZnJhcmVkIHJlbW90ZXMgdmlhCiAgKiBpbnB1dCBsYXllciAuLi4KQEAgLTIxLDExICsyMCwxMSBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKIAogI2RlZmluZSBJUl9UWVBFX1JDNSAgICAgMQorI2RlZmluZSBJUl9UWVBFX1BEICAgICAgMiAvKiBQdWxzZSBkaXN0YW5jZSBlbmNvZGVkIElSICovCiAjZGVmaW5lIElSX1RZUEVfT1RIRVIgIDk5CiAKICNkZWZpbmUgSVJfS0VZVEFCX1RZUEUJdTMyCkBAIC02MCw2ICs1OSw3IEBACiB1MzIgIGlyX2V4dHJhY3RfYml0cyh1MzIgZGF0YSwgdTMyIG1hc2spOwogaW50ICBpcl9kdW1wX3NhbXBsZXModTMyICpzYW1wbGVzLCBpbnQgY291bnQpOwogaW50ICBpcl9kZWNvZGVfYmlwaGFzZSh1MzIgKnNhbXBsZXMsIGludCBjb3VudCwgaW50IGxvdywgaW50IGhpZ2gpOworaW50ICBpcl9kZWNvZGVfcHVsc2VkaXN0YW5jZSh1MzIgKnNhbXBsZXMsIGludCBjb3VudCwgaW50IGxvdywgaW50IGhpZ2gpOwogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmggYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAppbmRleCAzZGZiOGQ2Li4yYTg5N2MzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX19TQUE3MTQ2X18KICNkZWZpbmUgX19TQUE3MTQ2X18KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIHZlcnNpb24gbWFjcm9zICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIGZvciBtb2R1bGUtdmVyc2lvbiAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciBkZWxheS1zdHVmZiAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGZvciBrbWFsbG9jL2tmcmVlICovCkBAIC0xNSwxMiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4JLyogZm9yIHZtYWxsb2MoKSAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBmb3Igdm1hbGxvY190b19wYWdlKCkgKi8KIAotLyogdWdseSwgYnV0IG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgZHZiIHN0dWZmIHVuZGVyIDIuNC4gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNTEpCi0JI2luY2x1ZGUgImR2Yl9mdW5jdGlvbnMuaCIKLSNlbmRpZgotCi0jZGVmaW5lIFNBQTcxNDZfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsNSwwKQorI2RlZmluZSBTQUE3MTQ2X1ZFUlNJT05fQ09ERSAweDAwMDUwMCAgIC8qIDAuNS4wICovCiAKICNkZWZpbmUgc2FhNzE0Nl93cml0ZShzeHksYWRyLGRhdCkgICAgd3JpdGVsKChkYXQpLChzeHktPm1lbSsoYWRyKSkpCiAjZGVmaW5lIHNhYTcxNDZfcmVhZChzeHksYWRyKSAgICAgICAgIHJlYWRsKHN4eS0+bWVtKyhhZHIpKQpAQCAtMzMsMTMgKzI3LDggQEAKIAkjZGVmaW5lIERFQlVHX1ZBUklBQkxFIHNhYTcxNDZfZGVidWcKICNlbmRpZgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDUxKQotI2RlZmluZSBERUJVR19QUk9MT0cgcHJpbnRrKCIlczogJXMoKTogIixfX3N0cmluZ2lmeShLQlVJTERfQkFTRU5BTUUpLF9fRlVOQ1RJT05fXykKLSNkZWZpbmUgSU5GTyh4KSB7IHByaW50aygiJXM6ICIsX19zdHJpbmdpZnkoS0JVSUxEX0JBU0VOQU1FKSk7IHByaW50ayB4OyB9Ci0jZWxzZQogI2RlZmluZSBERUJVR19QUk9MT0cgcHJpbnRrKCIlczogJXMoKTogIixfX3N0cmluZ2lmeShLQlVJTERfTU9ETkFNRSksX19GVU5DVElPTl9fKQogI2RlZmluZSBJTkZPKHgpIHsgcHJpbnRrKCIlczogIixfX3N0cmluZ2lmeShLQlVJTERfTU9ETkFNRSkpOyBwcmludGsgeDsgfQotI2VuZGlmCiAKICNkZWZpbmUgRVJSKHgpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R1bmVyLmggYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKaW5kZXggZWVhYTE1ZC4uNGFkMDhlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dW5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaApAQCAtMSw2ICsxLDQgQEAKLQotLyogJElkOiB0dW5lci5oLHYgMS40NSAyMDA1LzA3LzI4IDE4OjQxOjIxIG1jaGVoYWIgRXhwICQKLSAqCisvKgogICAgIHR1bmVyLmggLSBkZWZpbml0aW9uIGZvciBkaWZmZXJlbnQgdHVuZXJzCiAKICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFya3VzIFNjaHJvZWRlciAoc2Nocm9lZG1AdW5pLWR1ZXNzZWxkb3JmLmRlKQpAQCAtMjgsODggKzI2LDkwIEBACiAKICNkZWZpbmUgQUREUl9VTlNFVCAoMjU1KQogCi0jZGVmaW5lIFRVTkVSX1RFTUlDX1BBTCAgICAgMCAgICAgICAgLyogNDAwMiBGSDUgKDNYIDc3NTYsIDk0ODMpICovCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfUEFMX0kgMQotI2RlZmluZSBUVU5FUl9QSElMSVBTX05UU0MgIDIKLSNkZWZpbmUgVFVORVJfUEhJTElQU19TRUNBTSAzCQkvKiB5b3UgbXVzdCBhY3RpdmVseSBzZWxlY3QgQi9HLCBMLCBMYCAqLworI2RlZmluZSBUVU5FUl9URU1JQ19QQUwJCQkwICAgICAgICAvKiA0MDAyIEZINSAoM1ggNzc1NiwgOTQ4MykgKi8KKyNkZWZpbmUgVFVORVJfUEhJTElQU19QQUxfSQkJMQorI2RlZmluZSBUVU5FUl9QSElMSVBTX05UU0MJCTIKKyNkZWZpbmUgVFVORVJfUEhJTElQU19TRUNBTQkJMwkvKiB5b3UgbXVzdCBhY3RpdmVseSBzZWxlY3QgQi9HLCBMLCBMYCAqLwogCi0jZGVmaW5lIFRVTkVSX0FCU0VOVCAgICAgICAgNAotI2RlZmluZSBUVU5FUl9QSElMSVBTX1BBTCAgIDUKLSNkZWZpbmUgVFVORVJfVEVNSUNfTlRTQyAgICA2ICAgICAgICAvKiA0MDMyIEZZNSAoM1ggNzAwNCwgOTQ5OCwgOTc4OSkgICovCi0jZGVmaW5lIFRVTkVSX1RFTUlDX1BBTF9JICAgNyAgICAgICAgLyogNDA2MiBGWTUgKDNYIDg1MDEsIDk5NTcpICAgICAgICAqLworI2RlZmluZSBUVU5FUl9BQlNFTlQJCQk0CisjZGVmaW5lIFRVTkVSX1BISUxJUFNfUEFMCQk1CisjZGVmaW5lIFRVTkVSX1RFTUlDX05UU0MJCTYJLyogNDAzMiBGWTUgKDNYIDcwMDQsIDk0OTgsIDk3ODkpICAqLworI2RlZmluZSBUVU5FUl9URU1JQ19QQUxfSQkJNwkvKiA0MDYyIEZZNSAoM1ggODUwMSwgOTk1NykgKi8KIAotI2RlZmluZSBUVU5FUl9URU1JQ180MDM2Rlk1X05UU0MgOCAgIC8qIDQwMzYgRlk1ICgzWCAxMjIzLCAxOTgxLCA3Njg2KSAgKi8KLSNkZWZpbmUgVFVORVJfQUxQU19UU0JIMV9OVFNDIAkgOQotI2RlZmluZSBUVU5FUl9BTFBTX1RTQkUxX1BBTCAJMTAKLSNkZWZpbmUgVFVORVJfQUxQU19UU0JCNV9QQUxfSSAJMTEKKyNkZWZpbmUgVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDCTgJLyogNDAzNiBGWTUgKDNYIDEyMjMsIDE5ODEsIDc2ODYpICovCisjZGVmaW5lIFRVTkVSX0FMUFNfVFNCSDFfTlRTQwkJOQorI2RlZmluZSBUVU5FUl9BTFBTX1RTQkUxX1BBTAkJMTAKKyNkZWZpbmUgVFVORVJfQUxQU19UU0JCNV9QQUxfSQkJMTEKIAotI2RlZmluZSBUVU5FUl9BTFBTX1RTQkU1X1BBTCAJMTIKLSNkZWZpbmUgVFVORVJfQUxQU19UU0JDNV9QQUwgCTEzCi0jZGVmaW5lIFRVTkVSX1RFTUlDXzQwMDZGSDVfUEFMCTE0ICAgLyogNDAwNiBGSDUgKDNYIDk1MDAsIDk1MDEsIDcyOTEpICAgICAqLwotI2RlZmluZSBUVU5FUl9BTFBTX1RTSEM2X05UU0MgCTE1CisjZGVmaW5lIFRVTkVSX0FMUFNfVFNCRTVfUEFMCQkxMgorI2RlZmluZSBUVU5FUl9BTFBTX1RTQkM1X1BBTAkJMTMKKyNkZWZpbmUgVFVORVJfVEVNSUNfNDAwNkZINV9QQUwJCTE0CS8qIDQwMDYgRkg1ICgzWCA5NTAwLCA5NTAxLCA3MjkxKSAqLworI2RlZmluZSBUVU5FUl9BTFBTX1RTSEM2X05UU0MJCTE1CiAKLSNkZWZpbmUgVFVORVJfVEVNSUNfUEFMX0RLCTE2ICAgLyogNDAxNiBGWTUgKDNYIDEzOTIsIDEzOTMpICAgICAqLwotI2RlZmluZSBUVU5FUl9QSElMSVBTX05UU0NfTQkxNwotI2RlZmluZSBUVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JICAgICAgIDE4ICAvKiA0MDY2IEZZNSAoM1ggNzAzMiwgNzAzNSkgKi8KLSNkZWZpbmUgVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwgICAxOSAgLyogQi9HLCBJIGFuZCBEL0sgYXV0b2RldGVjdGVkICgzWCA3NTk1LCA3NjA2LCA3NjU3KSovCisjZGVmaW5lIFRVTkVSX1RFTUlDX1BBTF9ESwkJMTYJLyogNDAxNiBGWTUgKDNYIDEzOTIsIDEzOTMpICovCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfTlRTQ19NCQkxNworI2RlZmluZSBUVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JCTE4CS8qIDQwNjYgRlk1ICgzWCA3MDMyLCA3MDM1KSAqLworI2RlZmluZSBUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTAkxOQkvKiBCL0csIEkgYW5kIEQvSyBhdXRvZGV0ZWN0ZWQgKDNYIDc1OTUsIDc2MDYsIDc2NTcpICovCiAKLSNkZWZpbmUgVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwgICAgICAgICAyMCAgLyogaW5jbC4gRk0gcmFkaW8gKDNYIDc2MDcsIDc0ODgsIDc3MTEpKi8KLSNkZWZpbmUgVFVORVJfVEVNSUNfNDAzOUZSNV9OVFNDICAgICAgICAyMSAgLyogaW5jbC4gRk0gcmFkaW8gKDNYIDcyNDYsIDc1NzgsIDc3MzIpKi8KLSNkZWZpbmUgVFVORVJfVEVNSUNfNDA0NkZNNSAgICAgICAgICAgICAyMiAgLyogeW91IG11c3QgYWN0aXZlbHkgc2VsZWN0IEIvRywgRC9LLCBJLCBMLCBMYCAhICAoM1ggNzgwNCwgNzgwNiwgODEwMywgODEwNCkqLworI2RlZmluZSBUVU5FUl9URU1JQ180MDA5RlI1X1BBTAkJMjAJLyogaW5jbC4gRk0gcmFkaW8gKDNYIDc2MDcsIDc0ODgsIDc3MTEpICovCisjZGVmaW5lIFRVTkVSX1RFTUlDXzQwMzlGUjVfTlRTQwkyMQkvKiBpbmNsLiBGTSByYWRpbyAoM1ggNzI0NiwgNzU3OCwgNzczMikgKi8KKyNkZWZpbmUgVFVORVJfVEVNSUNfNDA0NkZNNQkJMjIJLyogeW91IG11c3QgYWN0aXZlbHkgc2VsZWN0IEIvRywgRC9LLCBJLCBMLCBMYCAhICAoM1ggNzgwNCwgNzgwNiwgODEwMywgODEwNCkgKi8KICNkZWZpbmUgVFVORVJfUEhJTElQU19QQUxfREsJCTIzCiAKLSNkZWZpbmUgVFVORVJfUEhJTElQU19GUTEyMTZNRQkJMjQgIC8qIHlvdSBtdXN0IGFjdGl2ZWx5IHNlbGVjdCBCL0cvRC9LLCBJLCBMLCBMYCAqLwotI2RlZmluZSBUVU5FUl9MR19QQUxfSV9GTQkyNQotI2RlZmluZSBUVU5FUl9MR19QQUxfSQkJMjYKLSNkZWZpbmUgVFVORVJfTEdfTlRTQ19GTQkyNworI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIxNk1FCQkyNAkvKiB5b3UgbXVzdCBhY3RpdmVseSBzZWxlY3QgQi9HL0QvSywgSSwgTCwgTGAgKi8KKyNkZWZpbmUgVFVORVJfTEdfUEFMX0lfRk0JCTI1CisjZGVmaW5lIFRVTkVSX0xHX1BBTF9JCQkJMjYKKyNkZWZpbmUgVFVORVJfTEdfTlRTQ19GTQkJMjcKIAotI2RlZmluZSBUVU5FUl9MR19QQUxfRk0JCTI4Ci0jZGVmaW5lIFRVTkVSX0xHX1BBTAkJMjkKLSNkZWZpbmUgVFVORVJfVEVNSUNfNDAwOUZONV9NVUxUSV9QQUxfRk0JMzAgIC8qIEIvRywgSSBhbmQgRC9LIGF1dG9kZXRlY3RlZCAoM1ggODE1NSwgODE2MCwgODE2MykqLwotI2RlZmluZSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQyAgMzEKKyNkZWZpbmUgVFVORVJfTEdfUEFMX0ZNCQkJMjgKKyNkZWZpbmUgVFVORVJfTEdfUEFMCQkJMjkKKyNkZWZpbmUgVFVORVJfVEVNSUNfNDAwOUZONV9NVUxUSV9QQUxfRk0gMzAJLyogQi9HLCBJIGFuZCBEL0sgYXV0b2RldGVjdGVkICgzWCA4MTU1LCA4MTYwLCA4MTYzKSAqLworI2RlZmluZSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQwkzMQogCi0jZGVmaW5lIFRVTkVSX1NhbXN1bmdfUEFMX1RDUE05MDkxUEQyNyAzMgotI2RlZmluZSBUVU5FUl9NVDIwMzIgMzMKLSNkZWZpbmUgVFVORVJfVEVNSUNfNDEwNkZINSAJMzQJLyogNDEwNiBGSDUgKDNYIDc4MDgsIDc4NjUpKi8KLSNkZWZpbmUgVFVORVJfVEVNSUNfNDAxMkZZNQkzNQkvKiA0MDEyIEZZNSAoM1ggMDk3MSwgMTA5OSkqLworI2RlZmluZSBUVU5FUl9TYW1zdW5nX1BBTF9UQ1BNOTA5MVBEMjcJMzIKKyNkZWZpbmUgVFVORVJfTVQyMDMyCQkJMzMKKyNkZWZpbmUgVFVORVJfVEVNSUNfNDEwNkZINQkJMzQJLyogNDEwNiBGSDUgKDNYIDc4MDgsIDc4NjUpICovCisjZGVmaW5lIFRVTkVSX1RFTUlDXzQwMTJGWTUJCTM1CS8qIDQwMTIgRlk1ICgzWCAwOTcxLCAxMDk5KSAqLwogCi0jZGVmaW5lIFRVTkVSX1RFTUlDXzQxMzZGWTUJMzYJLyogNDEzNiBGWTUgKDNYIDc3MDgsIDc3NDYpKi8KLSNkZWZpbmUgVFVORVJfTEdfUEFMX05FV19UQVBDICAgMzcKLSNkZWZpbmUgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgIDM4Ci0jZGVmaW5lIFRVTkVSX0xHX05UU0NfTkVXX1RBUEMgICAzOQorI2RlZmluZSBUVU5FUl9URU1JQ180MTM2Rlk1CQkzNgkvKiA0MTM2IEZZNSAoM1ggNzcwOCwgNzc0NikgKi8KKyNkZWZpbmUgVFVORVJfTEdfUEFMX05FV19UQVBDCQkzNworI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMwkzOAorI2RlZmluZSBUVU5FUl9MR19OVFNDX05FV19UQVBDCQkzOQogCi0jZGVmaW5lIFRVTkVSX0hJVEFDSElfTlRTQyAgICAgICA0MAotI2RlZmluZSBUVU5FUl9QSElMSVBTX1BBTF9NSyAgICAgNDEKLSNkZWZpbmUgVFVORVJfUEhJTElQU19BVFNDICAgICAgIDQyCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMyA0MworI2RlZmluZSBUVU5FUl9ISVRBQ0hJX05UU0MJCTQwCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfUEFMX01LCQk0MQorI2RlZmluZSBUVU5FUl9QSElMSVBTX0FUU0MJCTQyCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMwk0MwogCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfNElOMSAgICAgICA0NAkvKiBBVEkgVFYgV29uZGVyIFBybyAtIENvbmV4YW50ICovCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfNElOMQkJNDQJLyogQVRJIFRWIFdvbmRlciBQcm8gLSBDb25leGFudCAqLwogLyogTWljcm90dW5lIG1lcmdlZ2VkIHdpdGggVGVtaWMgMTIvMzEvMTk5OSBwYXJ0aWFsbHkgZmluYW5jZWQgYnkgQWxwcyAtIHRoZXNlIG1heSBiZSBzaW1pbGFyIHRvIFRlbWljICovCi0jZGVmaW5lIFRVTkVSX01JQ1JPVFVORV80MDQ5Rk01ICA0NQotI2RlZmluZSBUVU5FUl9MR19OVFNDX1RBUEUgICAgICAgNDcKKyNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUgCTQ1CisjZGVmaW5lIFRVTkVSX01JQ1JPVFVORV80MDQyX0ZJNQk0NgorI2RlZmluZSBUVU5FUl9MR19OVFNDX1RBUEUJCTQ3CiAKLSNkZWZpbmUgVFVORVJfVE5GXzg4MzFCR0ZGICAgICAgIDQ4Ci0jZGVmaW5lIFRVTkVSX01JQ1JPVFVORV80MDQyRkk1ICA0OQkvKiBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1RIC0gNDA0MiBGSTUgKDNYIDgxNDcpICovCi0jZGVmaW5lIFRVTkVSX1RDTF8yMDAyTiAgICAgICAgICA1MAotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMgICA1MQorI2RlZmluZSBUVU5FUl9UTkZfODgzMUJHRkYJCTQ4CisjZGVmaW5lIFRVTkVSX01JQ1JPVFVORV80MDQyRkk1CQk0OQkvKiBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1RIC0gNDA0MiBGSTUgKDNYIDgxNDcpICovCisjZGVmaW5lIFRVTkVSX1RDTF8yMDAyTgkJCTUwCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMwk1MQogCi0jZGVmaW5lIFRVTkVSX1RIT01TT05fRFRUNzYxMCAgICA1MgotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTI4NiAgICAgNTMKLSNkZWZpbmUgVFVORVJfUEhJTElQU19UREE4MjkwICAgIDU0Ci0jZGVmaW5lIFRVTkVSX0xHX1BBTF9UQVBFICAgICAgICA1NSAgICAvKiBIYXVwcGF1Z2UgUFZSLTE1MCBQQUwgKi8KKyNkZWZpbmUgVFVORVJfVEhPTVNPTl9EVFQ3NjEwCQk1MgorI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTI4NgkJNTMKKyNkZWZpbmUgVFVORVJfUEhJTElQU19UREE4MjkwCQk1NAorI2RlZmluZSBUVU5FUl9MR19QQUxfVEFQRQkJNTUJLyogSGF1cHBhdWdlIFBWUi0xNTAgUEFMICovCiAKLSNkZWZpbmUgVFVORVJfUEhJTElQU19GUTEyMTZBTUVfTUs0IDU2IC8qIEhhdXBwYXVnZSBQVlItMTUwIFBBTCAqLwotI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0ICAgNTcgICAvKiBIYXVwcGF1Z2UgUFZSLTUwME1DRSBOVFNDICovCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjE2QU1FX01LNAk1NgkvKiBIYXVwcGF1Z2UgUFZSLTE1MCBQQUwgKi8KKyNkZWZpbmUgVFVORVJfUEhJTElQU19GUTEyMzZBX01LNAk1NwkvKiBIYXVwcGF1Z2UgUFZSLTUwME1DRSBOVFNDICovCisjZGVmaW5lIFRVTkVSX1lNRUNfVFZGXzg1MzFNRgkJNTgKKyNkZWZpbmUgVFVORVJfWU1FQ19UVkZfNTUzM01GCQk1OQkvKiBQaXhlbHZpZXcgUHJvIFVsdHJhIE5UU0MgKi8KIAotI2RlZmluZSBUVU5FUl9ZTUVDX1RWRl84NTMxTUYgNTgKLSNkZWZpbmUgVFVORVJfWU1FQ19UVkZfNTUzM01GIDU5CS8qIFBpeGVsdmlldyBQcm8gVWx0cmEgTlRTQyAqLwotI2RlZmluZSBUVU5FUl9USE9NU09OX0RUVDc2MTEgNjAJLyogRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtVCAqLwotI2RlZmluZSBUVU5FUl9URU5BXzk1MzNfREkgICAgNjEKKyNkZWZpbmUgVFVORVJfVEhPTVNPTl9EVFQ3NjExCQk2MAkvKiBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1UICovCisjZGVmaW5lIFRVTkVSX1RFTkFfOTUzM19ESQkJNjEKKyNkZWZpbmUgVFVORVJfVEVBNTc2NwkJCTYyCS8qIE9ubHkgRk0gUmFkaW8gVHVuZXIgKi8KKyNkZWZpbmUgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszCTYzCiAKLSNkZWZpbmUgVFVORVJfVEVBNTc2NyAgICAgICAgIDYyCS8qIE9ubHkgRk0gUmFkaW8gVHVuZXIgKi8KLSNkZWZpbmUgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszIDYzCi0jZGVmaW5lIFRVTkVSX0xHX1REVlNfSDA2MkYgICA2NAkvKiBEVmlDTyBGdXNpb25IRFRWIDUgKi8KLSNkZWZpbmUgVFVORVJfWU1FQ19UVkY2NlQ1X0JfREZGIDY1CS8qIEFjb3JwIFk4NzhGICovCisjZGVmaW5lIFRVTkVSX0xHX1REVlNfSDA2MkYJCTY0CS8qIERWaUNPIEZ1c2lvbkhEVFYgNSAqLworI2RlZmluZSBUVU5FUl9ZTUVDX1RWRjY2VDVfQl9ERkYJNjUJLyogQWNvcnAgWTg3OEYgKi8KKyNkZWZpbmUgVFVORVJfTEdfTlRTQ19UQUxOX01JTkkJCTY2CiAKICNkZWZpbmUgTk9UVU5FUiAwCiAjZGVmaW5lIFBBTCAgICAgMQkvKiBQQUxfQkcgKi8KQEAgLTExNyw3ICsxMTcsNyBAQAogI2RlZmluZSBOVFNDICAgIDMKICNkZWZpbmUgU0VDQU0gICA0CiAjZGVmaW5lIEFUU0MgICAgNQotI2RlZmluZSBSQURJTwk2CisjZGVmaW5lIFJBRElPICAgNgogCiAjZGVmaW5lIE5vVHVuZXIgMAogI2RlZmluZSBQaGlsaXBzIDEKQEAgLTEzNCw2ICsxMzQsNyBAQAogI2RlZmluZSBUSE9NU09OIDEyCiAKICNkZWZpbmUgVFVORVJfU0VUX1RZUEVfQUREUiAgICAgICAgICBfSU9XKCdUJywzLGludCkKKyNkZWZpbmUgVFVORVJfU0VUX1NUQU5EQlkgICAgICAgICAgICBfSU9XKCdUJyw0LGludCkKICNkZWZpbmUgVERBOTg4N19TRVRfQ09ORklHICAgICAgICAgICBfSU9XKCd0Jyw1LGludCkKIAogLyogdHYgY2FyZCBzcGVjaWZpYyAqLwpAQCAtMTUzLDkgKzE1NCw2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgSTJDX0FERFJfVERBODI5MCAgICAgICAgMHg0YgotI2RlZmluZSBJMkNfQUREUl9UREE4Mjc1ICAgICAgICAweDYxCi0KIGVudW0gdHVuZXJfbW9kZSB7CiAJVF9VTklOSVRJQUxJWkVEID0gMCwKIAlUX1JBRElPCQk9IDEgPDwgVjRMMl9UVU5FUl9SQURJTywKQEAgLTE2NSwyMSArMTYzLDIxIEBACiB9OwogCiBzdHJ1Y3QgdHVuZXJfc2V0dXAgewotCXVuc2lnbmVkIHNob3J0CQlhZGRyOwotCXVuc2lnbmVkIGludAkJdHlwZTsKLQl1bnNpZ25lZCBpbnQJCW1vZGVfbWFzazsKKwl1bnNpZ25lZCBzaG9ydAlhZGRyOworCXVuc2lnbmVkIGludAl0eXBlOworCXVuc2lnbmVkIGludAltb2RlX21hc2s7CiB9OwogCiBzdHJ1Y3QgdHVuZXIgewogCS8qIGRldmljZSAqLwogCXN0cnVjdCBpMmNfY2xpZW50IGkyYzsKIAotCXVuc2lnbmVkIGludCB0eXBlOyAgICAgICAgICAgIC8qIGNoaXAgdHlwZSAqLworCXVuc2lnbmVkIGludCB0eXBlOwkvKiBjaGlwIHR5cGUgKi8KIAotCXVuc2lnbmVkIGludCAgICAgICAgICBtb2RlOwotCXVuc2lnbmVkIGludCAgICAgICAgICBtb2RlX21hc2s7IC8qIENvbWJpbmF0aW9uIG9mIGFsbG93YWJsZSBtb2RlcyAqLworCXVuc2lnbmVkIGludCBtb2RlOworCXVuc2lnbmVkIGludCBtb2RlX21hc2s7CS8qIENvbWJpbmF0aW9uIG9mIGFsbG93YWJsZSBtb2RlcyAqLwogCi0JdW5zaWduZWQgaW50IGZyZXE7ICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworCXVuc2lnbmVkIGludCBmcmVxOwkvKiBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAJdW5zaWduZWQgaW50IGF1ZG1vZGU7CiAJdjRsMl9zdGRfaWQgIHN0ZDsKIApAQCAtMTk4LDYgKzE5Niw3IEBACiAJdm9pZCAoKnJhZGlvX2ZyZXEpKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSk7CiAJaW50ICAoKmhhc19zaWduYWwpKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKIAlpbnQgICgqaXNfc3RlcmVvKShzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CisJdm9pZCAoKnN0YW5kYnkpKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKIH07CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgdHVuZXJfZGVidWc7CkBAIC0yMDksMTYgKzIwOCwyMCBAQAogZXh0ZXJuIGludCBkZWZhdWx0X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpOwogCi0jZGVmaW5lIHR1bmVyX3dhcm4oZm10LCBhcmcuLi4pIFwKLQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORyAsICZ0LT5pMmMuZGV2ICwgZm10ICwgIyMgYXJnKQotI2RlZmluZSB0dW5lcl9pbmZvKGZtdCwgYXJnLi4uKSBcCi0JZGV2X3ByaW50ayhLRVJOX0lORk8gLCAmdC0+aTJjLmRldiAsIGZtdCAsICMjIGFyZykKLSNkZWZpbmUgdHVuZXJfZGJnKGZtdCwgYXJnLi4uKSBcCi0JaWYgKHR1bmVyX2RlYnVnKSBkZXZfcHJpbnRrKEtFUk5fREVCVUcgLCAmdC0+aTJjLmRldiAsIGZtdCAsICMjIGFyZykKKyNkZWZpbmUgdHVuZXJfd2FybihmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlZC0lMDR4OiAiIGZtdCwgdC0+aTJjLmRyaXZlci0+bmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+aTJjLmFkYXB0ZXItPm5yLCB0LT5pMmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHVuZXJfaW5mbyhmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9JTkZPICIlcyAlZC0lMDR4OiAiIGZtdCwgdC0+aTJjLmRyaXZlci0+bmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+aTJjLmFkYXB0ZXItPm5yLCB0LT5pMmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHVuZXJfZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAorCWlmICh0dW5lcl9kZWJ1ZykgXAorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlcyAlZC0lMDR4OiAiIGZtdCwgdC0+aTJjLmRyaXZlci0+bmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+aTJjLmFkYXB0ZXItPm5yLCB0LT5pMmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogX1RVTkVSX0ggKi8KIAogLyoKICAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oIGIvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oCmluZGV4IDg1NGEyYzIuLmUyMDM1YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHZlZXByb20uaAorKysgYi9pbmNsdWRlL21lZGlhL3R2ZWVwcm9tLmgKQEAgLTEsMTggKzEsMjEgQEAKIC8qCi0gKiAkSWQ6IHR2ZWVwcm9tLmgsdiAxLjIgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCiAgKi8KIAogc3RydWN0IHR2ZWVwcm9tIHsKIAl1MzIgaGFzX3JhZGlvOworCXUzMiBoYXNfaXI7ICAgICAvKiAwOiBubyBJUiwgMTogSVIgcHJlc2VudCwgMjogdW5rbm93biAqLwogCiAJdTMyIHR1bmVyX3R5cGU7CiAJdTMyIHR1bmVyX2Zvcm1hdHM7CiAKKwl1MzIgdHVuZXIyX3R5cGU7CisJdTMyIHR1bmVyMl9mb3JtYXRzOworCiAJdTMyIGRpZ2l0aXplcjsKIAl1MzIgZGlnaXRpemVyX2Zvcm1hdHM7CiAKIAl1MzIgYXVkaW9fcHJvY2Vzc29yOwotCS8qIGFfcF9mbXRzPyAqLworCXUzMiBkZWNvZGVyX3Byb2Nlc3NvcjsKIAogCXUzMiBtb2RlbDsKIAl1MzIgcmV2aXNpb247CkBAIC0yMCw3ICsyMyw3IEBACiAJY2hhciByZXZfc3RyWzVdOwogfTsKIAotdm9pZCB0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKHN0cnVjdCB0dmVlcHJvbSAqdHZlZSwKK3ZvaWQgdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZyhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHR2ZWVwcm9tICp0dmVlLAogCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVlcHJvbV9kYXRhKTsKIAogaW50IHR2ZWVwcm9tX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgKmVlZGF0YSwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi5oIGIvaW5jbHVkZS9tZWRpYS92aWRlby1idWYuaAppbmRleCBhZTZkYTZkLi5hZThkN2EwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogJElkOiB2aWRlby1idWYuaCx2IDEuOSAyMDA0LzExLzA3IDEzOjE3OjE1IGtyYXhlbCBFeHAgJAogICoKICAqIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdmlkZW80bGludXggY2FwdHVyZSBidWZmZXJzLCB0byBoYW5kbGUKICAqIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBQQ0kgRE1BLiAgUmlnaHQgbm93IGJ0dHYgKyBzYWE3MTM0IHVzZSBpdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2F4MjUuaCBiL2luY2x1ZGUvbmV0L2F4MjUuaAppbmRleCA5MjZlZWQ1Li4yMjdkMzM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9heDI1LmgKKysrIGIvaW5jbHVkZS9uZXQvYXgyNS5oCkBAIC0yNTcsOCArMjU3LDggQEAKIAogLyogYXgyNV9hZGRyLmMgKi8KIGV4dGVybiBheDI1X2FkZHJlc3MgbnVsbF9heDI1X2FkZHJlc3M7Ci1leHRlcm4gY2hhciAqYXgyYXNjKGF4MjVfYWRkcmVzcyAqKTsKLWV4dGVybiBheDI1X2FkZHJlc3MgKmFzYzJheChjaGFyICopOworZXh0ZXJuIGNoYXIgKmF4MmFzYyhjaGFyICpidWYsIGF4MjVfYWRkcmVzcyAqKTsKK2V4dGVybiB2b2lkIGFzYzJheChheDI1X2FkZHJlc3MgKmFkZHIsIGNoYXIgKmNhbGxzaWduKTsKIGV4dGVybiBpbnQgIGF4MjVjbXAoYXgyNV9hZGRyZXNzICosIGF4MjVfYWRkcmVzcyAqKTsKIGV4dGVybiBpbnQgIGF4MjVkaWdpY21wKGF4MjVfZGlnaSAqLCBheDI1X2RpZ2kgKik7CiBleHRlcm4gdW5zaWduZWQgY2hhciAqYXgyNV9hZGRyX3BhcnNlKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBheDI1X2FkZHJlc3MgKiwgYXgyNV9hZGRyZXNzICosIGF4MjVfZGlnaSAqLCBpbnQgKiwgaW50ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY29tcGF0LmggYi9pbmNsdWRlL25ldC9jb21wYXQuaAppbmRleCA5OTgzZmQ4Li4yOTBiYWI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jb21wYXQuaAorKysgYi9pbmNsdWRlL25ldC9jb21wYXQuaApAQCAtMzMsNyArMzMsOCBAQAogZXh0ZXJuIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Ztc2coaW50LHN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqLHVuc2lnbmVkKTsKIGV4dGVybiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNoYXIgX191c2VyICosIGludCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHB1dF9jbXNnX2NvbXBhdChzdHJ1Y3QgbXNnaGRyKiwgaW50LCBpbnQsIGludCwgdm9pZCAqKTsKLWV4dGVybiBpbnQgY21zZ2hkcl9mcm9tX3VzZXJfY29tcGF0X3RvX2tlcm4oc3RydWN0IG1zZ2hkciAqLCB1bnNpZ25lZCBjaGFyICosCi0JCWludCk7CisKK3N0cnVjdCBzb2NrOworZXh0ZXJuIGludCBjbXNnaGRyX2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybihzdHJ1Y3QgbXNnaGRyICosIHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIAogI2VuZGlmIC8qIE5FVF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB2Ni5oIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCmluZGV4IDMyMDNlYWYuLjY1ZWM4NjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwdjYuaAorKysgYi9pbmNsdWRlL25ldC9pcHY2LmgKQEAgLTIzMyw2ICsyMzMsMTAgQEAKIGV4dGVybiBpbnQJCQlpcHY2X3BhcnNlX2hvcG9wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50KTsKIAogZXh0ZXJuIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqICBpcHY2X2R1cF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQpOworZXh0ZXJuIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqCWlwdjZfcmVuZXdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LAorCQkJCQkJICAgaW50IG5ld3R5cGUsCisJCQkJCQkgICBzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9fdXNlciAqbmV3b3B0LAorCQkJCQkJICAgaW50IG5ld29wdGxlbik7CiAKIGV4dGVybiBpbnQgaXA2X2ZyYWdfbnF1ZXVlczsKIGV4dGVybiBhdG9taWNfdCBpcDZfZnJhZ19tZW07CkBAIC0zNzMsNiArMzc3LDcgQEAKIAkJCQkJCWludCBsZW5ndGgsCiAJCQkJCQlpbnQgdHJhbnNoZHJsZW4sCiAJCSAgICAgIAkJCQlpbnQgaGxpbWl0LAorCQkgICAgICAJCQkJaW50IHRjbGFzcywKIAkJCQkJCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LAogCQkJCQkJc3RydWN0IGZsb3dpICpmbCwKIAkJCQkJCXN0cnVjdCBydDZfaW5mbyAqcnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmggYi9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKaW5kZXggNDRlZGQ0OC4uZDY3YzgzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCisrKyBiL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaApAQCAtMSwxMCArMSwxMCBAQAogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmUgdGhlIG5ldyBkcml2ZXIgQVBJIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zCiAgKgotICogVmVyc2lvbiA6CTYJMjEuNi4wNAorICogVmVyc2lvbiA6CTcJMTguMy4wNQogICoKICAqIEF1dGhvcnMgOglKZWFuIFRvdXJyaWxoZXMgLSBIUEwgLSA8anRAaHBsLmhwLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqLwogCiAjaWZuZGVmIF9JV19IQU5ETEVSX0gKQEAgLTIwNyw3ICsyMDcsNyBAQAogICogd2lsbCBiZSBuZWVkZWQuLi4KICAqIEkganVzdCBwbGFuIHRvIGluY3JlbWVudCB3aXRoIGVhY2ggbmV3IHZlcnNpb24uCiAgKi8KLSNkZWZpbmUgSVdfSEFORExFUl9WRVJTSU9OCTYKKyNkZWZpbmUgSVdfSEFORExFUl9WRVJTSU9OCTcKIAogLyoKICAqIENoYW5nZXMgOgpAQCAtMjMyLDYgKzIzMiwxMyBAQAogICoJLSBSZW1vdmUgc3B5ICNpZmRlZiwgdGhleSBhcmUgYWx3YXlzIG9uIC0+IGNsZWFuZXIgY29kZQogICoJLSBBZGQgSVdfREVTQ1JfRkxBR19OT01BWCBmbGFnIGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzCiAgKgktIFN0YXJ0IG1pZ3JhdGluZyBnZXRfd2lyZWxlc3Nfc3RhdHMgdG8gc3RydWN0IGl3X2hhbmRsZXJfZGVmCisgKgorICogVjYgdG8gVjcKKyAqIC0tLS0tLS0tCisgKgktIEFkZCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSBwb2ludGVyIGluIHN0cnVjdCBpd19wdWJsaWNfZGF0YQorICoJLSBSZW1vdmUgKHN0cnVjdCBpd19wb2ludCAqKS0+cG9pbnRlciBmcm9tIGV2ZW50cyBhbmQgc3RyZWFtcworICoJLSBSZW1vdmUgc3B5X29mZnNldCBmcm9tIHN0cnVjdCBpd19oYW5kbGVyX2RlZgorICoJLSBBZGQgImNoZWNrIiB2ZXJzaW9uIG9mIGV2ZW50IG1hY3JvcyBmb3IgaWVlZTgwMi4xMSBzdGFjawogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzM0LDkgKzM0MSw2IEBACiAJICogV2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9ydCB0aGF0IHRvIHVzZXIgc3BhY2UuLi4gKi8KIAljb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzICoJcHJpdmF0ZV9hcmdzOwogCi0JLyogVGhpcyBmaWVsZCB3aWxsIGJlICpyZW1vdmVkKiBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIFdFICovCi0JbG9uZwkJCXNweV9vZmZzZXQ7CS8qIERPIE5PVCBVU0UgKi8KLQogCS8qIE5ldyBsb2NhdGlvbiBvZiBnZXRfd2lyZWxlc3Nfc3RhdHMsIHRvIGRlLWJsb2F0IHN0cnVjdCBuZXRfZGV2aWNlLgogCSAqIFRoZSBvbGQgcG9pbnRlciBpbiBzdHJ1Y3QgbmV0X2RldmljZSB3aWxsIGJlIGdyYWR1YWxseSBwaGFzZWQKIAkgKiBvdXQsIGFuZCBkcml2ZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIG9uZS4uLiAqLwpAQCAtNDAwLDE2ICs0MDQsMjEgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVZJQ0UgV0lSRUxFU1MgREFUQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCiAgKiBUaGlzIGlzIGFsbCB0aGUgd2lyZWxlc3MgZGF0YSBzcGVjaWZpYyB0byBhIGRldmljZSBpbnN0YW5jZSB0aGF0Ci0gKiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMuCisgKiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMgb3IgdGhlIDgwMi4xMSBsYXllci4KICAqIFdlIG9ubHkga2VlcCBwb2ludGVyIHRvIHRob3NlIHN0cnVjdHVyZXMsIHNvIHRoYXQgYSBkcml2ZXIgaXMgZnJlZQogICogdG8gc2hhcmUgdGhlbSBiZXR3ZWVuIGluc3RhbmNlcy4KICAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBpbml0aWFsaXNlZCBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIGRldmljZS4KICAqIEFjY2VzcyB0byB0aGlzIGRhdGEgZm9sbG93IHRoZSBzYW1lIHJ1bGVzIGFzIGFueSBvdGhlciBzdHJ1Y3QgbmV0X2RldmljZQogICogZGF0YSAoaS5lLiB2YWxpZCBhcyBsb25nIGFzIHN0cnVjdCBuZXRfZGV2aWNlIGV4aXN0LCBzYW1lIGxvY2tpbmcgcnVsZXMpLgogICovCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKy8qIFRoZSBzdHJ1Y3QgKi8KIHN0cnVjdCBpd19wdWJsaWNfZGF0YSB7CiAJLyogRHJpdmVyIGVuaGFuY2VkIHNweSBzdXBwb3J0ICovCi0Jc3RydWN0IGl3X3NweV9kYXRhICoJc3B5X2RhdGE7CisJc3RydWN0IGl3X3NweV9kYXRhICoJCXNweV9kYXRhOworCS8qIFN0cnVjdHVyZSBtYW5hZ2VkIGJ5IHRoZSBpbi1rZXJuZWwgSUVFRSA4MDIuMTEgbGF5ZXIgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqCWllZWU4MDIxMTsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQyNCw3ICs0MzMsNyBAQAogZXh0ZXJuIGludCBkZXZfZ2V0X3dpcmVsZXNzX2luZm8oY2hhciAqIGJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkJIGludCBsZW5ndGgpOwogCi0vKiBIYW5kbGUgSU9DVExzLCBjYWxsZWQgaW4gbmV0L2NvZGUvZGV2LmMgKi8KKy8qIEhhbmRsZSBJT0NUTHMsIGNhbGxlZCBpbiBuZXQvY29yZS9kZXYuYyAqLwogZXh0ZXJuIGludCB3aXJlbGVzc19wcm9jZXNzX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kKTsKIAogLyogU2Vjb25kIDogZnVuY3Rpb25zIHRoYXQgbWF5IGJlIGNhbGxlZCBieSBkcml2ZXIgbW9kdWxlcyAqLwpAQCAtNDc5LDcgKzQ4OCw3IEBACiAJCSAgICAgaW50CWV2ZW50X2xlbikJLyogUmVhbCBzaXplIG9mIHBheWxvYWQgKi8KIHsKIAkvKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlICovCi0JaWYoKHN0cmVhbSArIGV2ZW50X2xlbikgPCBlbmRzKSB7CisJaWYobGlrZWx5KChzdHJlYW0gKyBldmVudF9sZW4pIDwgZW5kcykpIHsKIAkJaXdlLT5sZW4gPSBldmVudF9sZW47CiAJCW1lbWNweShzdHJlYW0sIChjaGFyICopIGl3ZSwgZXZlbnRfbGVuKTsKIAkJc3RyZWFtICs9IGV2ZW50X2xlbjsKQEAgLTQ5NSwxNCArNTA0LDE3IEBACiBzdGF0aWMgaW5saW5lIGNoYXIgKgogaXdlX3N0cmVhbV9hZGRfcG9pbnQoY2hhciAqCXN0cmVhbSwJCS8qIFN0cmVhbSBvZiBldmVudHMgKi8KIAkJICAgICBjaGFyICoJZW5kcywJCS8qIEVuZCBvZiBzdHJlYW0gKi8KLQkJICAgICBzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwJLyogUGF5bG9hZCAqLwotCQkgICAgIGNoYXIgKglleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwJLyogUGF5bG9hZCBsZW5ndGggKyBmbGFncyAqLworCQkgICAgIGNoYXIgKglleHRyYSkJCS8qIE1vcmUgcGF5bG9hZCAqLwogewogCWludAlldmVudF9sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UtPnUuZGF0YS5sZW5ndGg7CiAJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLwotCWlmKChzdHJlYW0gKyBldmVudF9sZW4pIDwgZW5kcykgeworCWlmKGxpa2VseSgoc3RyZWFtICsgZXZlbnRfbGVuKSA8IGVuZHMpKSB7CiAJCWl3ZS0+bGVuID0gZXZlbnRfbGVuOwotCQltZW1jcHkoc3RyZWFtLCAoY2hhciAqKSBpd2UsIElXX0VWX1BPSU5UX0xFTik7CisJCW1lbWNweShzdHJlYW0sIChjaGFyICopIGl3ZSwgSVdfRVZfTENQX0xFTik7CisJCW1lbWNweShzdHJlYW0gKyBJV19FVl9MQ1BfTEVOLAorCQkgICAgICAgKChjaGFyICopIGl3ZSkgKyBJV19FVl9MQ1BfTEVOICsgSVdfRVZfUE9JTlRfT0ZGLAorCQkgICAgICAgSVdfRVZfUE9JTlRfTEVOIC0gSVdfRVZfTENQX0xFTik7CiAJCW1lbWNweShzdHJlYW0gKyBJV19FVl9QT0lOVF9MRU4sIGV4dHJhLCBpd2UtPnUuZGF0YS5sZW5ndGgpOwogCQlzdHJlYW0gKz0gZXZlbnRfbGVuOwogCX0KQEAgLTUyNiw3ICs1MzgsNyBAQAogCWV2ZW50X2xlbiAtPSBJV19FVl9MQ1BfTEVOOwogCiAJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLwotCWlmKCh2YWx1ZSArIGV2ZW50X2xlbikgPCBlbmRzKSB7CisJaWYobGlrZWx5KCh2YWx1ZSArIGV2ZW50X2xlbikgPCBlbmRzKSkgewogCQkvKiBBZGQgbmV3IHZhbHVlICovCiAJCW1lbWNweSh2YWx1ZSwgKGNoYXIgKikgaXdlICsgSVdfRVZfTENQX0xFTiwgZXZlbnRfbGVuKTsKIAkJdmFsdWUgKz0gZXZlbnRfbGVuOwpAQCAtNTM3LDQgKzU0OSw4NSBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyYXBwZXIgdG8gYWRkIGFuIFdpcmVsZXNzIEV2ZW50IHRvIGEgc3RyZWFtIG9mIGV2ZW50cy4KKyAqIFNhbWUgYXMgYWJvdmUsIHdpdGggZXhwbGljaXQgZXJyb3IgY2hlY2suLi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICoKK2l3ZV9zdHJlYW1fY2hlY2tfYWRkX2V2ZW50KGNoYXIgKglzdHJlYW0sCQkvKiBTdHJlYW0gb2YgZXZlbnRzICovCisJCQkgICBjaGFyICoJZW5kcywJCS8qIEVuZCBvZiBzdHJlYW0gKi8KKwkJCSAgIHN0cnVjdCBpd19ldmVudCAqaXdlLAkvKiBQYXlsb2FkICovCisJCQkgICBpbnQJCWV2ZW50X2xlbiwJLyogU2l6ZSBvZiBwYXlsb2FkICovCisJCQkgICBpbnQgKglwZXJyKQkJLyogRXJyb3IgcmVwb3J0ICovCit7CisJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSwgc2V0IGVycm9yIGlmIG5vdCAqLworCWlmKGxpa2VseSgoc3RyZWFtICsgZXZlbnRfbGVuKSA8IGVuZHMpKSB7CisJCWl3ZS0+bGVuID0gZXZlbnRfbGVuOworCQltZW1jcHkoc3RyZWFtLCAoY2hhciAqKSBpd2UsIGV2ZW50X2xlbik7CisJCXN0cmVhbSArPSBldmVudF9sZW47CisJfSBlbHNlCisJCSpwZXJyID0gLUUyQklHOworCXJldHVybiBzdHJlYW07Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcmFwcGVyIHRvIGFkZCBhbiBzaG9ydCBXaXJlbGVzcyBFdmVudCBjb250YWluaW5nIGEgcG9pbnRlciB0byBhCisgKiBzdHJlYW0gb2YgZXZlbnRzLgorICogU2FtZSBhcyBhYm92ZSwgd2l0aCBleHBsaWNpdCBlcnJvciBjaGVjay4uLgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgoraXdlX3N0cmVhbV9jaGVja19hZGRfcG9pbnQoY2hhciAqCXN0cmVhbSwJCS8qIFN0cmVhbSBvZiBldmVudHMgKi8KKwkJCSAgIGNoYXIgKgllbmRzLAkJLyogRW5kIG9mIHN0cmVhbSAqLworCQkJICAgc3RydWN0IGl3X2V2ZW50ICppd2UsCS8qIFBheWxvYWQgbGVuZ3RoICsgZmxhZ3MgKi8KKwkJCSAgIGNoYXIgKglleHRyYSwJCS8qIE1vcmUgcGF5bG9hZCAqLworCQkJICAgaW50ICoJcGVycikJCS8qIEVycm9yIHJlcG9ydCAqLworeworCWludAlldmVudF9sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UtPnUuZGF0YS5sZW5ndGg7CisJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLworCWlmKGxpa2VseSgoc3RyZWFtICsgZXZlbnRfbGVuKSA8IGVuZHMpKSB7CisJCWl3ZS0+bGVuID0gZXZlbnRfbGVuOworCQltZW1jcHkoc3RyZWFtLCAoY2hhciAqKSBpd2UsIElXX0VWX0xDUF9MRU4pOworCQltZW1jcHkoc3RyZWFtICsgSVdfRVZfTENQX0xFTiwKKwkJICAgICAgICgoY2hhciAqKSBpd2UpICsgSVdfRVZfTENQX0xFTiArIElXX0VWX1BPSU5UX09GRiwKKwkJICAgICAgIElXX0VWX1BPSU5UX0xFTiAtIElXX0VWX0xDUF9MRU4pOworCQltZW1jcHkoc3RyZWFtICsgSVdfRVZfUE9JTlRfTEVOLCBleHRyYSwgaXdlLT51LmRhdGEubGVuZ3RoKTsKKwkJc3RyZWFtICs9IGV2ZW50X2xlbjsKKwl9IGVsc2UKKwkJKnBlcnIgPSAtRTJCSUc7CisJcmV0dXJuIHN0cmVhbTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyYXBwZXIgdG8gYWRkIGEgdmFsdWUgdG8gYSBXaXJlbGVzcyBFdmVudCBpbiBhIHN0cmVhbSBvZiBldmVudHMuCisgKiBCZSBjYXJlZnVsLCB0aGlzIG9uZSBpcyB0cmlja3kgdG8gdXNlIHByb3Blcmx5IDoKKyAqIEF0IHRoZSBmaXJzdCBydW4sIHlvdSBuZWVkIHRvIGhhdmUgKHZhbHVlID0gZXZlbnQgKyBJV19FVl9MQ1BfTEVOKS4KKyAqIFNhbWUgYXMgYWJvdmUsIHdpdGggZXhwbGljaXQgZXJyb3IgY2hlY2suLi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICoKK2l3ZV9zdHJlYW1fY2hlY2tfYWRkX3ZhbHVlKGNoYXIgKglldmVudCwJCS8qIEV2ZW50IGluIHRoZSBzdHJlYW0gKi8KKwkJCSAgIGNoYXIgKgl2YWx1ZSwJCS8qIFZhbHVlIGluIGV2ZW50ICovCisJCQkgICBjaGFyICoJZW5kcywJCS8qIEVuZCBvZiBzdHJlYW0gKi8KKwkJCSAgIHN0cnVjdCBpd19ldmVudCAqaXdlLAkvKiBQYXlsb2FkICovCisJCQkgICBpbnQJCWV2ZW50X2xlbiwJLyogU2l6ZSBvZiBwYXlsb2FkICovCisJCQkgICBpbnQgKglwZXJyKQkJLyogRXJyb3IgcmVwb3J0ICovCit7CisJLyogRG9uJ3QgZHVwbGljYXRlIExDUCAqLworCWV2ZW50X2xlbiAtPSBJV19FVl9MQ1BfTEVOOworCisJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSAqLworCWlmKGxpa2VseSgodmFsdWUgKyBldmVudF9sZW4pIDwgZW5kcykpIHsKKwkJLyogQWRkIG5ldyB2YWx1ZSAqLworCQltZW1jcHkodmFsdWUsIChjaGFyICopIGl3ZSArIElXX0VWX0xDUF9MRU4sIGV2ZW50X2xlbik7CisJCXZhbHVlICs9IGV2ZW50X2xlbjsKKwkJLyogUGF0Y2ggTENQICovCisJCWl3ZS0+bGVuID0gdmFsdWUgLSBldmVudDsKKwkJbWVtY3B5KGV2ZW50LCAoY2hhciAqKSBpd2UsIElXX0VWX0xDUF9MRU4pOworCX0gZWxzZQorCQkqcGVyciA9IC1FMkJJRzsKKwlyZXR1cm4gdmFsdWU7Cit9CisKICNlbmRpZgkvKiBfSVdfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90cmFuc3BfdjYuaCBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCmluZGV4IDhiMDc1YWIuLjRlODZmMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCisrKyBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCkBAIC0zNyw3ICszNyw3IEBACiBleHRlcm4gaW50CQkJZGF0YWdyYW1fc2VuZF9jdGwoc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJCQkJICBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkJCQkJICBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwKLQkJCQkJCSAgaW50ICpobGltaXQpOworCQkJCQkJICBpbnQgKmhsaW1pdCwgaW50ICp0Y2xhc3MpOwogCiAjZGVmaW5lCQlMT09QQkFDSzRfSVBWNgkJX19jb25zdGFudF9odG9ubCgweDdmMDAwMDA2KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kcy5oIGIvaW5jbHVkZS9wY21jaWEvZHMuaAppbmRleCBiNzA3YTYwLi5jYjhiNmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9kcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2RzLmgKQEAgLTE1MSw2ICsxNTEsOCBAQAogCSAgIHVuaXF1ZWx5IGRlZmluZSBhIHBjbWNpYV9kZXZpY2UgKi8KIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldAkqc29ja2V0OwogCisJY2hhcgkJCSpkZXZuYW1lOworCiAJdTgJCQlkZXZpY2Vfbm87CiAKIAkvKiB0aGUgaGFyZHdhcmUgImZ1bmN0aW9uIiBkZXZpY2U7IGNlcnRhaW4gc3ViZGV2aWNlcyBjYW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaAppbmRleCA5OTU3ZjE2Li5iZWQ0YjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCkBAIC01MSwxMiArNTEsMTYgQEAKIAkgKiBwcmludGsncyB0byB1c2UgLT5waWQsIHNvIHRoYXQgd2UgY2FuIGtpbGwgdGhpcyBmaWVsZC4KIAkgKi8KIAl1bnNpZ25lZCBsb25nIHNlcmlhbF9udW1iZXI7CisJLyoKKwkgKiBUaGlzIGlzIHNldCB0byBqaWZmaWVzIGFzIGl0IHdhcyB3aGVuIHRoZSBjb21tYW5kIHdhcyBmaXJzdAorCSAqIGFsbG9jYXRlZC4gIEl0IGlzIHVzZWQgdG8gdGltZSBob3cgbG9uZyB0aGUgY29tbWFuZCBoYXMKKwkgKiBiZWVuIG91dHN0YW5kaW5nCisJICovCisJdW5zaWduZWQgbG9uZyBqaWZmaWVzX2F0X2FsbG9jOwogCiAJaW50IHJldHJpZXM7CiAJaW50IGFsbG93ZWQ7CiAJaW50IHRpbWVvdXRfcGVyX2NvbW1hbmQ7Ci0JaW50IHRpbWVvdXRfdG90YWw7Ci0JaW50IHRpbWVvdXQ7CiAKIAl1bnNpZ25lZCBjaGFyIGNtZF9sZW47CiAJdW5zaWduZWQgY2hhciBvbGRfY21kX2xlbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2RiZy5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGJnLmgKaW5kZXggMTJlOTA5My4uYjA5MGExMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfZGJnLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGJnLmgKQEAgLTMsOCArMywxMCBAQAogCiBzdHJ1Y3Qgc2NzaV9jbW5kOwogc3RydWN0IHNjc2lfcmVxdWVzdDsKK3N0cnVjdCBzY3NpX3NlbnNlX2hkcjsKIAogZXh0ZXJuIHZvaWQgc2NzaV9wcmludF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CitleHRlcm4gdm9pZCBzY3NpX3ByaW50X3NlbnNlX2hkcihjb25zdCBjaGFyICosIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqKTsKIGV4dGVybiB2b2lkIF9fc2NzaV9wcmludF9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKik7CiBleHRlcm4gdm9pZCBzY3NpX3ByaW50X3NlbnNlKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfcHJpbnRfcmVxX3NlbnNlKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmgKaW5kZXggODM1YWY4ZS4uZGE2MzcyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmgKQEAgLTgsOCArOCwxNyBAQAogCiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZTsKIHN0cnVjdCBzY3NpX2NtbmQ7Ci1zdHJ1Y3Qgc2NzaV9tb2RlX2RhdGE7CiBzdHJ1Y3Qgc2NzaV9sdW47CitzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHI7CisKK3N0cnVjdCBzY3NpX21vZGVfZGF0YSB7CisJX191MzIJbGVuZ3RoOworCV9fdTE2CWJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOworCV9fdTgJbWVkaXVtX3R5cGU7CisJX191OAlkZXZpY2Vfc3BlY2lmaWM7CisJX191OAloZWFkZXJfbGVuZ3RoOworCV9fdTgJbG9uZ2xiYToxOworfTsKIAogLyoKICAqIHNkZXYgc3RhdGU6IElmIHlvdSBhbHRlciB0aGlzLCB5b3UgYWxzbyBuZWVkIHRvIGFsdGVyIHNjc2lfc3lzZnMuYwpAQCAtMjI4LDcgKzIzNyw4IEBACiAKIGV4dGVybiBpbnQgc2NzaV9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRiZCwgaW50IG1vZGVwYWdlLAogCQkJICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQgdGltZW91dCwKLQkJCSAgIGludCByZXRyaWVzLCBzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEpOworCQkJICAgaW50IHJldHJpZXMsIHN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSwKKwkJCSAgIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqKTsKIGV4dGVybiBpbnQgc2NzaV90ZXN0X3VuaXRfcmVhZHkoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgdGltZW91dCwKIAkJCQlpbnQgcmV0cmllcyk7CiBleHRlcm4gaW50IHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCkBAIC0yNDcsNiArMjU3LDE0IEBACiBleHRlcm4gY29uc3QgY2hhciAqc2NzaV9kZXZpY2Vfc3RhdGVfbmFtZShlbnVtIHNjc2lfZGV2aWNlX3N0YXRlKTsKIGV4dGVybiBpbnQgc2NzaV9pc19zZGV2X2RldmljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICopOwogZXh0ZXJuIGludCBzY3NpX2lzX3RhcmdldF9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqKTsKK2V4dGVybiBpbnQgc2NzaV9leGVjdXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY29uc3QgdW5zaWduZWQgY2hhciAqY21kLAorCQkJaW50IGRhdGFfZGlyZWN0aW9uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCisJCQl1bnNpZ25lZCBjaGFyICpzZW5zZSwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLAorCQkJaW50IGZsYWcpOworZXh0ZXJuIGludCBzY3NpX2V4ZWN1dGVfcmVxKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY29uc3QgdW5zaWduZWQgY2hhciAqY21kLAorCQkJICAgIGludCBkYXRhX2RpcmVjdGlvbiwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuLAorCQkJICAgIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpOworCiBzdGF0aWMgaW5saW5lIGludCBzY3NpX2RldmljZV9vbmxpbmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXJldHVybiBzZGV2LT5zZGV2X3N0YXRlICE9IFNERVZfT0ZGTElORTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2VoLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9laC5oCmluZGV4IDgwNTU3ZjguLmZhYmQ4NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2VoLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfZWguaApAQCAtMjYsMTAgKzI2LDE1IEBACiAJdTggYWRkaXRpb25hbF9sZW5ndGg7CS8qIGFsd2F5cyAwIGZvciBmaXhlZCBzZW5zZSBmb3JtYXQgKi8KIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfc2Vuc2VfdmFsaWQoc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKK3sKKwlpZiAoIXNzaGRyKQorCQlyZXR1cm4gMDsKIAotZXh0ZXJuIHZvaWQgc2NzaV9hZGRfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqLCBpbnQsCi0JCXZvaWQgKCopKHN0cnVjdCBzY3NpX2NtbmQgKikpOwotZXh0ZXJuIGludCBzY3NpX2RlbGV0ZV90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICopOworCXJldHVybiAoc3NoZHItPnJlc3BvbnNlX2NvZGUgJiAweDcwKSA9PSAweDcwOworfQorCisKIGV4dGVybiB2b2lkIHNjc2lfcmVwb3J0X2J1c19yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICosIGludCk7CiBleHRlcm4gdm9pZCBzY3NpX3JlcG9ydF9kZXZpY2VfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqLCBpbnQsIGludCk7CiBleHRlcm4gaW50IHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKaW5kZXggODFkNTIzNC4uOTE2MTQ0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaApAQCAtNDI5LDEyICs0MjksMTUgQEAKIH07CiAKIC8qCi0gKiBzaG9zdCBzdGF0ZXMKKyAqIHNob3N0IHN0YXRlOiBJZiB5b3UgYWx0ZXIgdGhpcywgeW91IGFsc28gbmVlZCB0byBhbHRlciBzY3NpX3N5c2ZzLmMKKyAqIChmb3IgdGhlIGFzY2lpIGRlc2NyaXB0aW9ucykgYW5kIHRoZSBzdGF0ZSBtb2RlbCBlbmZvcmNlcjoKKyAqIHNjc2lfaG9zdF9zZXRfc3RhdGUoKQogICovCi1lbnVtIHsKLQlTSE9TVF9BREQsCi0JU0hPU1RfREVMLAorZW51bSBzY3NpX2hvc3Rfc3RhdGUgeworCVNIT1NUX0NSRUFURUQgPSAxLAorCVNIT1NUX1JVTk5JTkcsCiAJU0hPU1RfQ0FOQ0VMLAorCVNIT1NUX0RFTCwKIAlTSE9TVF9SRUNPVkVSWSwKIH07CiAKQEAgLTQ2NCwxMiArNDY3LDEwIEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICAgICogZWhhbmRsZXI7ICAvKiBFcnJvciByZWNvdmVyeSB0aHJlYWQuICovCiAJc3RydWN0IHNlbWFwaG9yZSAgICAgICogZWhfd2FpdDsgICAvKiBUaGUgZXJyb3IgcmVjb3ZlcnkgdGhyZWFkIHdhaXRzCiAJCQkJCSAgICAgIG9uIHRoaXMuICovCi0Jc3RydWN0IGNvbXBsZXRpb24gICAgICogZWhfbm90aWZ5OyAvKiB3YWl0IGZvciBlaCB0byBiZWdpbiBvciBlbmQgKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgKiBlaF9hY3Rpb247IC8qIFdhaXQgZm9yIHNwZWNpZmljIGFjdGlvbnMgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LiAqLwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIGVoX2FjdGl2ZToxOyAvKiBJbmRpY2F0ZXMgdGhlIGVoIHRocmVhZCBpcyBhd2FrZSBhbmQgYWN0aXZlIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRydWUuICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgZWhfa2lsbDoxOyAvKiBzZXQgd2hlbiBraWxsaW5nIHRoZSBlaCB0aHJlYWQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICBob3N0X3dhaXQ7CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqaG9zdHQ7CiAJc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICp0cmFuc3BvcnR0OwpAQCAtNTc1LDcgKzU3Niw3IEBACiAJdW5zaWduZWQgaW50ICBpcnE7CiAJCiAKLQl1bnNpZ25lZCBsb25nIHNob3N0X3N0YXRlOworCWVudW0gc2NzaV9ob3N0X3N0YXRlIHNob3N0X3N0YXRlOwogCiAJLyogbGRtIGJpdHMgKi8KIAlzdHJ1Y3QgZGV2aWNlCQlzaG9zdF9nZW5kZXY7CkBAIC02MzMsNiArNjM0LDcgQEAKIGV4dGVybiBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfZ2V0KHN0cnVjdCBTY3NpX0hvc3QgKik7CiBleHRlcm4gdm9pZCBzY3NpX2hvc3RfcHV0KHN0cnVjdCBTY3NpX0hvc3QgKnQpOwogZXh0ZXJuIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9sb29rdXAodW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnNjc2lfaG9zdF9zdGF0ZV9uYW1lKGVudW0gc2NzaV9ob3N0X3N0YXRlKTsKIAogZXh0ZXJuIHU2NCBzY3NpX2NhbGN1bGF0ZV9ib3VuY2VfbGltaXQoc3RydWN0IFNjc2lfSG9zdCAqKTsKIApAQCAtNjQ2LDYgKzY0OCwxNSBAQAogICAgICAgICByZXR1cm4gc2hvc3QtPnNob3N0X2dlbmRldi5wYXJlbnQ7CiB9CiAKKy8qKgorICogc2NzaV9ob3N0X3NjYW5fYWxsb3dlZCAtIElzIHNjYW5uaW5nIG9mIHRoaXMgaG9zdCBhbGxvd2VkCisgKiBAc2hvc3Q6CVBvaW50ZXIgdG8gU2NzaV9Ib3N0LgorICoqLworc3RhdGljIGlubGluZSBpbnQgc2NzaV9ob3N0X3NjYW5fYWxsb3dlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlyZXR1cm4gc2hvc3QtPnNob3N0X3N0YXRlID09IFNIT1NUX1JVTk5JTkc7Cit9CisKIGV4dGVybiB2b2lkIHNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwogZXh0ZXJuIHZvaWQgc2NzaV9ibG9ja19yZXF1ZXN0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwogCkBAIC02NjMsNSArNjc0LDYgQEAKIC8qIGxlZ2FjeSBpbnRlcmZhY2VzICovCiBleHRlcm4gc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9yZWdpc3RlcihzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICosIGludCk7CiBleHRlcm4gdm9pZCBzY3NpX3VucmVnaXN0ZXIoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBpbnQgc2NzaV9ob3N0X3NldF9zdGF0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGVudW0gc2NzaV9ob3N0X3N0YXRlKTsKIAogI2VuZGlmIC8qIF9TQ1NJX1NDU0lfSE9TVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9yZXF1ZXN0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV9yZXF1ZXN0LmgKaW5kZXggOTg3MTk0MC4uNmExNDAwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfcmVxdWVzdC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3JlcXVlc3QuaApAQCAtNTQsMjAgKzU0LDQgQEAKIAkJCXZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKIAkJCXZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSwKIAkJCWludCB0aW1lb3V0LCBpbnQgcmV0cmllcyk7Ci0KLXN0cnVjdCBzY3NpX21vZGVfZGF0YSB7Ci0JX191MzIJbGVuZ3RoOwotCV9fdTE2CWJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOwotCV9fdTgJbWVkaXVtX3R5cGU7Ci0JX191OAlkZXZpY2Vfc3BlY2lmaWM7Ci0JX191OAloZWFkZXJfbGVuZ3RoOwotCV9fdTgJbG9uZ2xiYToxOwotfTsKLQotZXh0ZXJuIGludCBfX3Njc2lfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgaW50IGRiZCwKLQkJCSAgICAgaW50IG1vZGVwYWdlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sCi0JCQkgICAgIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKLQkJCSAgICAgc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhKTsKLQotCiAjZW5kaWYgLyogX1NDU0lfU0NTSV9SRVFVRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaAppbmRleCBhMzBkNmNkLi42YmRjNGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oCkBAIC0zOSw2ICszOSw3IEBACiAJdW5zaWduZWQgaW50IHJkX3N0cm06MTsJLyogUmVhZCBzdHJlYW1pbmcgZW5hYmxlZCAqLwogCXVuc2lnbmVkIGludCBydGk6MTsJLyogUmV0YWluIFRyYWluaW5nIEluZm9ybWF0aW9uICovCiAJdW5zaWduZWQgaW50IHBjb21wX2VuOjE7LyogUHJlY29tcGVuc2F0aW9uIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBpbnQgaG9sZF9tY3M6MTsvKiBIb2xkIE1hcmdpbiBDb250cm9sIFNldHRpbmdzICovCiAJdW5zaWduZWQgaW50IGluaXRpYWxfZHY6MTsgLyogRFYgZG9uZSB0byB0aGlzIHRhcmdldCB5ZXQgICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZmxhZ3MgZmllbGQgZm9yIGRyaXZlcnMgdG8gdXNlICovCiAJLyogRGV2aWNlIFByb3BlcnRpZXMgZmllbGRzICovCkBAIC03OCw2ICs3OSw3IEBACiAjZGVmaW5lIHNwaV9yZF9zdHJtKHgpCSgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+cmRfc3RybSkKICNkZWZpbmUgc3BpX3J0aSh4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPnJ0aSkKICNkZWZpbmUgc3BpX3Bjb21wX2VuKHgpCSgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+cGNvbXBfZW4pCisjZGVmaW5lIHNwaV9ob2xkX21jcyh4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPmhvbGRfbWNzKQogI2RlZmluZSBzcGlfaW5pdGlhbF9kdih4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPmluaXRpYWxfZHYpCiAKICNkZWZpbmUgc3BpX3N1cHBvcnRfc3luYyh4KQkoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPnN1cHBvcnRfc3luYykKQEAgLTExNCw4ICsxMTYsMTEgQEAKIAl2b2lkCSgqc2V0X3J0aSkoc3RydWN0IHNjc2lfdGFyZ2V0ICosIGludCk7CiAJdm9pZAkoKmdldF9wY29tcF9lbikoc3RydWN0IHNjc2lfdGFyZ2V0ICopOwogCXZvaWQJKCpzZXRfcGNvbXBfZW4pKHN0cnVjdCBzY3NpX3RhcmdldCAqLCBpbnQpOworCXZvaWQJKCpnZXRfaG9sZF9tY3MpKHN0cnVjdCBzY3NpX3RhcmdldCAqKTsKKwl2b2lkCSgqc2V0X2hvbGRfbWNzKShzdHJ1Y3Qgc2NzaV90YXJnZXQgKiwgaW50KTsKIAl2b2lkCSgqZ2V0X3NpZ25hbGxpbmcpKHN0cnVjdCBTY3NpX0hvc3QgKik7CiAJdm9pZAkoKnNldF9zaWduYWxsaW5nKShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGVudW0gc3BpX3NpZ25hbF90eXBlKTsKKwlpbnQJKCpkZW55X2JpbmRpbmcpKHN0cnVjdCBzY3NpX3RhcmdldCAqKTsKIAkvKiBUaGUgZHJpdmVyIHNldHMgdGhlc2UgdG8gdGVsbCB0aGUgdHJhbnNwb3J0IGNsYXNzIGl0CiAJICogd2FudHMgdGhlIGF0dHJpYnV0ZXMgZGlzcGxheWVkIGluIHN5c2ZzLiAgSWYgdGhlIHNob3dfIGZsYWcKIAkgKiBpcyBub3Qgc2V0LCB0aGUgYXR0cmlidXRlIHdpbGwgYmUgcHJpdmF0ZSB0byB0aGUgdHJhbnNwb3J0CkBAIC0xMzAsNiArMTM1LDcgQEAKIAl1bnNpZ25lZCBsb25nCXNob3dfcmRfc3RybToxOwogCXVuc2lnbmVkIGxvbmcJc2hvd19ydGk6MTsKIAl1bnNpZ25lZCBsb25nCXNob3dfcGNvbXBfZW46MTsKKwl1bnNpZ25lZCBsb25nCXNob3dfaG9sZF9tY3M6MTsKIH07CiAKIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqc3BpX2F0dGFjaF90cmFuc3BvcnQoc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggZjcyYjNlZi4uM2RjNDFmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTI5MSwxMiArMjkxLDE0IEBACiBpbnQgc25kX21lbW9yeV9pbmZvX2luaXQodm9pZCk7CiBpbnQgc25kX21lbW9yeV9pbmZvX2RvbmUodm9pZCk7CiB2b2lkICpzbmRfaGlkZGVuX2ttYWxsb2Moc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncyk7Cit2b2lkICpzbmRfaGlkZGVuX2t6YWxsb2Moc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncyk7CiB2b2lkICpzbmRfaGlkZGVuX2tjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpOwogdm9pZCBzbmRfaGlkZGVuX2tmcmVlKGNvbnN0IHZvaWQgKm9iaik7CiB2b2lkICpzbmRfaGlkZGVuX3ZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKIHZvaWQgc25kX2hpZGRlbl92ZnJlZSh2b2lkICpvYmopOwogY2hhciAqc25kX2hpZGRlbl9rc3RyZHVwKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncyk7CiAjZGVmaW5lIGttYWxsb2Moc2l6ZSwgZmxhZ3MpIHNuZF9oaWRkZW5fa21hbGxvYyhzaXplLCBmbGFncykKKyNkZWZpbmUga3phbGxvYyhzaXplLCBmbGFncykgc25kX2hpZGRlbl9remFsbG9jKHNpemUsIGZsYWdzKQogI2RlZmluZSBrY2FsbG9jKG4sIHNpemUsIGZsYWdzKSBzbmRfaGlkZGVuX2tjYWxsb2Mobiwgc2l6ZSwgZmxhZ3MpCiAjZGVmaW5lIGtmcmVlKG9iaikgc25kX2hpZGRlbl9rZnJlZShvYmopCiAjZGVmaW5lIHZtYWxsb2Moc2l6ZSkgc25kX2hpZGRlbl92bWFsbG9jKHNpemUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3BjbS5oIGIvaW5jbHVkZS9zb3VuZC9wY20uaAppbmRleCBmYTIzZWJmLi5kNjM2MWRhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY20uaAorKysgYi9pbmNsdWRlL3NvdW5kL3BjbS5oCkBAIC05MDMsMTggKzkwMywxNyBAQAogaW50IHNuZF9wY21fZm9ybWF0X2xpbmVhcihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CiBpbnQgc25kX3BjbV9mb3JtYXRfbGl0dGxlX2VuZGlhbihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CiBpbnQgc25kX3BjbV9mb3JtYXRfYmlnX2VuZGlhbihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7Ci0vKioKKy8qCiAgKiBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFuIC0gQ2hlY2sgdGhlIFBDTSBmb3JtYXQgaXMgQ1BVLWVuZGlhbgogICogQGZvcm1hdDogdGhlIGZvcm1hdCB0byBjaGVjawogICoKICAqIFJldHVybnMgMSBpZiB0aGUgZ2l2ZW4gUENNIGZvcm1hdCBpcyBDUFUtZW5kaWFuLCAwIGlmCiAgKiBvcHBvc2l0ZSwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGVuZGlhbiBub3Qgc3BlY2lmaWVkLgogICovCi0vKiBpbnQgc25kX3BjbV9mb3JtYXRfY3B1X2VuZGlhbihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7ICovCiAjaWZkZWYgU05EUlZfTElUVExFX0VORElBTgotI2RlZmluZSBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFuCXNuZF9wY21fZm9ybWF0X2xpdHRsZV9lbmRpYW4KKyNkZWZpbmUgc25kX3BjbV9mb3JtYXRfY3B1X2VuZGlhbihmb3JtYXQpIHNuZF9wY21fZm9ybWF0X2xpdHRsZV9lbmRpYW4oZm9ybWF0KQogI2Vsc2UKLSNkZWZpbmUgc25kX3BjbV9mb3JtYXRfY3B1X2VuZGlhbglzbmRfcGNtX2Zvcm1hdF9iaWdfZW5kaWFuCisjZGVmaW5lIHNuZF9wY21fZm9ybWF0X2NwdV9lbmRpYW4oZm9ybWF0KSBzbmRfcGNtX2Zvcm1hdF9iaWdfZW5kaWFuKGZvcm1hdCkKICNlbmRpZgogaW50IHNuZF9wY21fZm9ybWF0X3dpZHRoKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsJCQkvKiBpbiBiaXRzICovCiBpbnQgc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwkJLyogaW4gYml0cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmggYi9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaAppbmRleCBhZDNjM2JlMy4uYjgyZTQwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKKysrIGIvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKQEAgLTM0LDkgKzM0LDcgQEAKIHN0cnVjdCBzbmRfdGVhNTc1eCB7CiAJc25kX2NhcmRfdCAqY2FyZDsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkOwkJLyogdmlkZW8gZGV2aWNlICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDUsIDApCiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOwotI2VuZGlmCiAJaW50IGRldl9ucjsJCQkvKiByZXF1ZXN0ZWQgZGV2aWNlIG51bWJlciArIDEgKi8KIAlpbnQgdmRfcmVnaXN0ZXJlZDsJCS8qIHZpZGVvIGRldmljZSBpcyByZWdpc3RlcmVkICovCiAJaW50IHRlYTU3NTk7CQkJLyogNTc1OSBjaGlwIGlzIHByZXNlbnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oIGIvaW5jbHVkZS92aWRlby9jeWJsYWZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NDgyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oCkBAIC0wLDAgKzEsMTcxIEBACisKKyNpZm5kZWYgQ1lCTEFGQl9ERUJVRworI2RlZmluZSBDWUJMQUZCX0RFQlVHIDAKKyNlbmRpZgorCisjaWYgQ1lCTEFGQl9ERUJVRworI2RlZmluZSBkZWJ1ZyhmLGEuLi4pCXByaW50aygiJXM6IiBmLCAgX19GVU5DVElPTl9fICwgIyMgYSk7CisjZWxzZQorI2RlZmluZSBkZWJ1ZyhmLGEuLi4pCisjZW5kaWYKKworI2RlZmluZSBvdXRwdXQoZiwgYS4uLikgcHJpbnRrKCJjeWJsYWZiOiAiIGYsICMjIGEpCisKKyNkZWZpbmUgS2IJKDEwMjQpCisjZGVmaW5lIE1iCShLYipLYikKKworLyogUENJIElEUyBvZiBzdXBwb3J0ZWQgY2FyZHMgdGVtcG9yYXJpbHkgaGVyZSAqLworCisjZGVmaW5lIENZQkVSQkxBREVpMQkweDg1MDAKKworLyogdGhlc2UgZGVmaW5lcyBhcmUgZm9yICdsY2QnIHZhcmlhYmxlICovCisjZGVmaW5lIExDRF9TVFJFVENICTAKKyNkZWZpbmUgTENEX0NFTlRFUgkxCisjZGVmaW5lIExDRF9CSU9TCTIKKworLyogZGlzcGxheSB0eXBlcyAqLworI2RlZmluZSBESVNQTEFZX0NSVAkwCisjZGVmaW5lIERJU1BMQVlfRlAJMQorCisjZGVmaW5lIFJPUF9TCTB4Q0MKKworI2RlZmluZSBwb2ludCh4LHkpICgoeSk8PDE2fCh4KSkKKworLy8KKy8vIEF0dHJpYnV0ZSBSZWdzLCBBUnh4LCAzYzAvM2MxCisvLworI2RlZmluZSBBUjAwCTB4MDAKKyNkZWZpbmUgQVIwMQkweDAxCisjZGVmaW5lIEFSMDIJMHgwMgorI2RlZmluZSBBUjAzCTB4MDMKKyNkZWZpbmUgQVIwNAkweDA0CisjZGVmaW5lIEFSMDUJMHgwNQorI2RlZmluZSBBUjA2CTB4MDYKKyNkZWZpbmUgQVIwNwkweDA3CisjZGVmaW5lIEFSMDgJMHgwOAorI2RlZmluZSBBUjA5CTB4MDkKKyNkZWZpbmUgQVIwQQkweDBBCisjZGVmaW5lIEFSMEIJMHgwQgorI2RlZmluZSBBUjBDCTB4MEMKKyNkZWZpbmUgQVIwRAkweDBECisjZGVmaW5lIEFSMEUJMHgwRQorI2RlZmluZSBBUjBGCTB4MEYKKyNkZWZpbmUgQVIxMAkweDEwCisjZGVmaW5lIEFSMTIJMHgxMgorI2RlZmluZSBBUjEzCTB4MTMKKworLy8KKy8vIFNlcXVlbmNlciBSZWdzLCBTUnh4LCAzYzQvM2M1CisvLworI2RlZmluZSBTUjAwCTB4MDAKKyNkZWZpbmUgU1IwMQkweDAxCisjZGVmaW5lIFNSMDIJMHgwMgorI2RlZmluZSBTUjAzCTB4MDMKKyNkZWZpbmUgU1IwNAkweDA0CisjZGVmaW5lIFNSMEQJMHgwRAorI2RlZmluZSBTUjBFCTB4MEUKKyNkZWZpbmUgU1IxMQkweDExCisjZGVmaW5lIFNSMTgJMHgxOAorI2RlZmluZSBTUjE5CTB4MTkKKworLy8KKy8vCisvLworI2RlZmluZSBDUjAwCTB4MDAKKyNkZWZpbmUgQ1IwMQkweDAxCisjZGVmaW5lIENSMDIJMHgwMgorI2RlZmluZSBDUjAzCTB4MDMKKyNkZWZpbmUgQ1IwNAkweDA0CisjZGVmaW5lIENSMDUJMHgwNQorI2RlZmluZSBDUjA2CTB4MDYKKyNkZWZpbmUgQ1IwNwkweDA3CisjZGVmaW5lIENSMDgJMHgwOAorI2RlZmluZSBDUjA5CTB4MDkKKyNkZWZpbmUgQ1IwQQkweDBBCisjZGVmaW5lIENSMEIJMHgwQgorI2RlZmluZSBDUjBDCTB4MEMKKyNkZWZpbmUgQ1IwRAkweDBECisjZGVmaW5lIENSMEUJMHgwRQorI2RlZmluZSBDUjBGCTB4MEYKKyNkZWZpbmUgQ1IxMAkweDEwCisjZGVmaW5lIENSMTEJMHgxMQorI2RlZmluZSBDUjEyCTB4MTIKKyNkZWZpbmUgQ1IxMwkweDEzCisjZGVmaW5lIENSMTQJMHgxNAorI2RlZmluZSBDUjE1CTB4MTUKKyNkZWZpbmUgQ1IxNgkweDE2CisjZGVmaW5lIENSMTcJMHgxNworI2RlZmluZSBDUjE4CTB4MTgKKyNkZWZpbmUgQ1IxOQkweDE5CisjZGVmaW5lIENSMUEJMHgxQQorI2RlZmluZSBDUjFCCTB4MUIKKyNkZWZpbmUgQ1IxQwkweDFDCisjZGVmaW5lIENSMUQJMHgxRAorI2RlZmluZSBDUjFFCTB4MUUKKyNkZWZpbmUgQ1IxRgkweDFGCisjZGVmaW5lIENSMjAJMHgyMAorI2RlZmluZSBDUjIxCTB4MjEKKyNkZWZpbmUgQ1IyNwkweDI3CisjZGVmaW5lIENSMjkJMHgyOQorI2RlZmluZSBDUjJBCTB4MkEKKyNkZWZpbmUgQ1IyQgkweDJCCisjZGVmaW5lIENSMkQJMHgyRAorI2RlZmluZSBDUjJGCTB4MkYKKyNkZWZpbmUgQ1IzNgkweDM2CisjZGVmaW5lIENSMzgJMHgzOAorI2RlZmluZSBDUjM5CTB4MzkKKyNkZWZpbmUgQ1IzQQkweDNBCisjZGVmaW5lIENSNTUJMHg1NQorI2RlZmluZSBDUjU2CTB4NTYKKyNkZWZpbmUgQ1I1NwkweDU3CisjZGVmaW5lIENSNTgJMHg1OAorCisvLworLy8KKy8vCisKKyNkZWZpbmUgR1IwMAkweDAxCisjZGVmaW5lIEdSMDEJMHgwMQorI2RlZmluZSBHUjAyCTB4MDIKKyNkZWZpbmUgR1IwMwkweDAzCisjZGVmaW5lIEdSMDQJMHgwNAorI2RlZmluZSBHUjA1CTB4MDUKKyNkZWZpbmUgR1IwNgkweDA2CisjZGVmaW5lIEdSMDcJMHgwNworI2RlZmluZSBHUjA4CTB4MDgKKyNkZWZpbmUgR1IwRgkweDBGCisjZGVmaW5lIEdSMjAJMHgyMAorI2RlZmluZSBHUjIzCTB4MjMKKyNkZWZpbmUgR1IyRgkweDJGCisjZGVmaW5lIEdSMzAJMHgzMAorI2RlZmluZSBHUjMxCTB4MzEKKyNkZWZpbmUgR1IzMwkweDMzCisjZGVmaW5lIEdSNTIJMHg1MgorI2RlZmluZSBHUjUzCTB4NTMKKyNkZWZpbmUgR1I1RAkweDVkCisKKworLy8KKy8vIEdyYXBoaWNzIEVuZ2luZQorLy8KKyNkZWZpbmUgR0VCYXNlCTB4MjEwMAkJLy8gY291bGQgYmUgbWFwcGVkIGVsc2V3aGVyZSBpZiB3ZSBsaWtlIGl0CisjZGVmaW5lIEdFMDAJKEdFQmFzZSsweDAwKQkvLyBzb3VyY2UgMSwgcCAxMTEKKyNkZWZpbmUgR0UwNAkoR0VCYXNlKzB4MDQpCS8vIHNvdXJjZSAyLCBwIDExMQorI2RlZmluZSBHRTA4CShHRUJhc2UrMHgwOCkJLy8gZGVzdGluYXRpb24gMSwgcCAxMTEKKyNkZWZpbmUgR0UwQwkoR0VCYXNlKzB4MEMpCS8vIGRlc3RpbmF0aW9uIDIsIHAgMTEyCisjZGVmaW5lIEdFMjAJKEdFQmFzZSsweDIwKQkvLyBlbmdpbmUgc3RhdHVzLCBwIDExMworI2RlZmluZSBHRTI0CShHRUJhc2UrMHgyNCkJLy8gcmVzZXQgYWxsIEdFIHBvaW50ZXJzCisjZGVmaW5lIEdFNDQJKEdFQmFzZSsweDQ0KQkvLyBjb21tYW5kIHJlZ2lzdGVyLCBwIDEyNgorI2RlZmluZSBHRTQ4CShHRUJhc2UrMHg0OCkJLy8gcmFzdGVyIG9wZXJhdGlvbiwgcCAxMjcKKyNkZWZpbmUgR0U2MAkoR0VCYXNlKzB4NjApCS8vIGZvcmVncm91bmQgY29sb3IsIHAgMTI4CisjZGVmaW5lIEdFNjQJKEdFQmFzZSsweDY0KQkvLyBiYWNrZ3JvdW5kIGNvbG9yLCBwIDEyOAorI2RlZmluZSBHRTZDCShHRUJhc2UrMHg2QykJLy8gUGF0dGVybiBhbmQgU3R5bGUsIHAgMTI5LCBvaworI2RlZmluZSBHRTlDCShHRUJhc2UrMHg5QykJLy8gcGl4ZWwgZW5naW5lIGRhdGEgcG9ydCwgcCAxMjUKKyNkZWZpbmUgR0VCOAkoR0VCYXNlKzB4QjgpCS8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDAsIHAgMTMzCisjZGVmaW5lIEdFQkMJKEdFQmFzZSsweEJDKQkvLyBEZXN0aW5hdGlvbiBTdHJpZGUgLyBCdWZmZXIgQmFzZSAxLCBwIDEzMworI2RlZmluZSBHRUMwCShHRUJhc2UrMHhDMCkJLy8gRGVzdGluYXRpb24gU3RyaWRlIC8gQnVmZmVyIEJhc2UgMiwgcCAxMzMKKyNkZWZpbmUgR0VDNAkoR0VCYXNlKzB4QzQpCS8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDMsIHAgMTMzCisjZGVmaW5lIEdFQzgJKEdFQmFzZSsweEM4KQkvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMCwgcCAxMzMKKyNkZWZpbmUgR0VDQwkoR0VCYXNlKzB4Q0MpCS8vIFNvdXJjZSBTdHJpZGUgLyBCdWZmZXIgQmFzZSAxLCBwIDEzMworI2RlZmluZSBHRUQwCShHRUJhc2UrMHhEMCkJLy8gU291cmNlIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDIsIHAgMTMzCisjZGVmaW5lIEdFRDQJKEdFQmFzZSsweEQ0KQkvLyBTb3VyY2UgU3RyaWRlIC8gQnVmZmVyIEJhc2UgMywgcCAxMzMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vc2lzZmIuaCBiL2luY2x1ZGUvdmlkZW8vc2lzZmIuaAppbmRleCAxMzZiZjc5Li5lNDAyZWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3Npc2ZiLmgKKysrIGIvaW5jbHVkZS92aWRlby9zaXNmYi5oCkBAIC0xLDUgKzEsNyBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYS4KKyAqIHNpc2ZiLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIFNpUyBmcmFtZWJ1ZmZlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBieSBUaG9tYXMgV2luaXNjaGhvZmVyLCBWaWVubmEsIEF1c3RyaWEuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNiw4ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKICAqLwogCi0jaWZuZGVmIF9MSU5VWF9TSVNGQgotI2RlZmluZSBfTElOVVhfU0lTRkIKKyNpZm5kZWYgX0xJTlVYX1NJU0ZCX0hfCisjZGVmaW5lIF9MSU5VWF9TSVNGQl9IXwogCiAjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CkBAIC0yNiw0NyArMjgsMzUgQEAKIC8qICAgICAgICAgICAgICAgICAgIFBVQkxJQyAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIHZiZmxhZ3MgKi8KLSNkZWZpbmUgQ1JUMl9ERUZBVUxUICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDUlQyX0xDRCAgICAgICAgICAgICAgICAweDAwMDAwMDAyICAvKiBUVzogTmV2ZXIgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgQ1JUMl9YWFggZW50cmllcyAqLwotI2RlZmluZSBDUlQyX1RWICAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvKiAgICAgKHNlZSBTSVNDeWNsZUNSVDJUeXBlKCkpICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDUlQyX1ZHQSAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFRWX05UU0MgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgVFZfUEFMICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBUVl9ISVZJU0lPTiAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFRWX1lQQlBSICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgVFZfQVZJREVPICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBUVl9TVklERU8gICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFRWX1NDQVJUICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgVkJfQ09ORVhBTlQJCTB4MDAwMDA4MDAJLyogNjYxIHNlcmllcyBvbmx5ICovCi0jZGVmaW5lIFZCX1RSVU1QSU9OCQlWQl9DT05FWEFOVAkvKiAzMDAgc2VyaWVzIG9ubHkgKi8KLSNkZWZpbmUgVFZfUEFMTSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBUVl9QQUxOICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisvKiB2YmZsYWdzLCBwdWJsaWMgKG90aGVycyBpbiBzaXMuaCkgKi8KKyNkZWZpbmUgQ1JUMl9ERUZBVUxUCQkweDAwMDAwMDAxCisjZGVmaW5lIENSVDJfTENECQkweDAwMDAwMDAyCisjZGVmaW5lIENSVDJfVFYJCQkweDAwMDAwMDA0CisjZGVmaW5lIENSVDJfVkdBCQkweDAwMDAwMDA4CisjZGVmaW5lIFRWX05UU0MJCQkweDAwMDAwMDEwCisjZGVmaW5lIFRWX1BBTAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFZfSElWSVNJT04JCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFZfWVBCUFIJCTB4MDAwMDAwODAKKyNkZWZpbmUgVFZfQVZJREVPCQkweDAwMDAwMTAwCisjZGVmaW5lIFRWX1NWSURFTwkJMHgwMDAwMDIwMAorI2RlZmluZSBUVl9TQ0FSVAkJMHgwMDAwMDQwMAorI2RlZmluZSBUVl9QQUxNCQkJMHgwMDAwMTAwMAorI2RlZmluZSBUVl9QQUxOCQkJMHgwMDAwMjAwMAogI2RlZmluZSBUVl9OVFNDSgkJMHgwMDAwMTAwMAotI2RlZmluZSBWQl8zMDJFTFYJCTB4MDAwMDQwMDAKLSNkZWZpbmUgVFZfQ0hTQ0FSVCAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBUVl9DSFlQQlBSNTI1SSAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFRWX0NIU0NBUlQJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVFZfQ0hZUEJQUjUyNUkJCTB4MDAwMTAwMDAKICNkZWZpbmUgQ1JUMV9WR0EJCTB4MDAwMDAwMDAKICNkZWZpbmUgQ1JUMV9MQ0RBCQkweDAwMDIwMDAwCiAjZGVmaW5lIFZHQTJfQ09OTkVDVEVEICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgVkJfRElTUFRZUEVfQ1JUMQkweDAwMDgwMDAwICAJLyogQ1JUMSBjb25uZWN0ZWQgYW5kIHVzZWQgKi8KLSNkZWZpbmUgVkJfMzAxICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAkvKiBWaWRlbyBicmlkZ2UgdHlwZSAqLwotI2RlZmluZSBWQl8zMDFCICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIFZCXzMwMkIgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgVkJfMzB4QkRICQkweDAwODAwMDAwICAgICAgLyogMzB4QiBESCB2ZXJzaW9uICh3L28gTENEIHN1cHBvcnQpICovCi0jZGVmaW5lIFZCX0xWRFMgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgVkJfQ0hST05URUwgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBWQl8zMDFMViAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIFZCXzMwMkxWICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgVkJfMzAxQwkJCTB4MTAwMDAwMDAKLSNkZWZpbmUgVkJfU0lOR0xFX01PREUgICAgICAgICAgMHgyMDAwMDAwMCAgIAkvKiBDUlQxIG9yIENSVDI7IGRldGVybWluZWQgYnkgRElTUFRZUEVfQ1JUeCAqLwotI2RlZmluZSBWQl9NSVJST1JfTU9ERQkJMHg0MDAwMDAwMCAgIAkvKiBDUlQxICsgQ1JUMiBpZGVudGljYWwgKG1pcnJvciBtb2RlKSAqLwotI2RlZmluZSBWQl9EVUFMVklFV19NT0RFCTB4ODAwMDAwMDAgICAJLyogQ1JUMSArIENSVDIgaW5kZXBlbmRlbnQgKGR1YWwgaGVhZCBtb2RlKSAqLworI2RlZmluZSBWQl9ESVNQVFlQRV9DUlQxCTB4MDAwODAwMDAJLyogQ1JUMSBjb25uZWN0ZWQgYW5kIHVzZWQgKi8KKyNkZWZpbmUgVkJfU0lOR0xFX01PREUJCTB4MjAwMDAwMDAJLyogQ1JUMSBvciBDUlQyOyBkZXRlcm1pbmVkIGJ5IERJU1BUWVBFX0NSVHggKi8KKyNkZWZpbmUgVkJfTUlSUk9SX01PREUJCTB4NDAwMDAwMDAJLyogQ1JUMSArIENSVDIgaWRlbnRpY2FsIChtaXJyb3IgbW9kZSkgKi8KKyNkZWZpbmUgVkJfRFVBTFZJRVdfTU9ERQkweDgwMDAwMDAwCS8qIENSVDEgKyBDUlQyIGluZGVwZW5kZW50IChkdWFsIGhlYWQgbW9kZSkgKi8KIAogLyogQWxpYXNlczogKi8KICNkZWZpbmUgQ1JUMl9FTkFCTEUJCShDUlQyX0xDRCB8IENSVDJfVFYgfCBDUlQyX1ZHQSkKLSNkZWZpbmUgVFZfU1RBTkRBUkQgICAgICAgICAgICAgKFRWX05UU0MgfCBUVl9QQUwgfCBUVl9QQUxNIHwgVFZfUEFMTiB8IFRWX05UU0NKKQotI2RlZmluZSBUVl9JTlRFUkZBQ0UgICAgICAgICAgICAoVFZfQVZJREVPfFRWX1NWSURFT3xUVl9TQ0FSVHxUVl9ISVZJU0lPTnxUVl9ZUEJQUnxUVl9DSFNDQVJUfFRWX0NIWVBCUFI1MjVJKQorI2RlZmluZSBUVl9TVEFOREFSRAkJKFRWX05UU0MgfCBUVl9QQUwgfCBUVl9QQUxNIHwgVFZfUEFMTiB8IFRWX05UU0NKKQorI2RlZmluZSBUVl9JTlRFUkZBQ0UJCShUVl9BVklERU98VFZfU1ZJREVPfFRWX1NDQVJUfFRWX0hJVklTSU9OfFRWX1lQQlBSfFRWX0NIU0NBUlR8VFZfQ0hZUEJQUjUyNUkpCiAKIC8qIE9ubHkgaWYgVFZfWVBCUFIgaXMgc2V0OiAqLwogI2RlZmluZSBUVl9ZUEJQUjUyNUkJCVRWX05UU0MKQEAgLTc1LDg5ICs2NSwxMTggQEAKICNkZWZpbmUgVFZfWVBCUFIxMDgwSQkJVFZfUEFMTgogI2RlZmluZSBUVl9ZUEJQUkFMTCAJCShUVl9ZUEJQUjUyNUkgfCBUVl9ZUEJQUjUyNVAgfCBUVl9ZUEJQUjc1MFAgfCBUVl9ZUEJQUjEwODBJKQogCi0jZGVmaW5lIFZCX1NJU0JSSURHRSAgICAgICAgICAgIChWQl8zMDF8VkJfMzAxQnxWQl8zMDFDfFZCXzMwMkJ8VkJfMzAxTFZ8VkJfMzAyTFZ8VkJfMzAyRUxWKQotI2RlZmluZSBWQl9TSVNUVkJSSURHRSAgICAgICAgICAoVkJfMzAxfFZCXzMwMUJ8VkJfMzAxQ3xWQl8zMDJCfFZCXzMwMUxWfFZCXzMwMkxWKQotI2RlZmluZSBWQl9WSURFT0JSSURHRQkJKFZCX1NJU0JSSURHRSB8IFZCX0xWRFMgfCBWQl9DSFJPTlRFTCB8IFZCX0NPTkVYQU5UKQotCiAjZGVmaW5lIFZCX0RJU1BUWVBFX0RJU1AyCUNSVDJfRU5BQkxFCiAjZGVmaW5lIFZCX0RJU1BUWVBFX0NSVDIJQ1JUMl9FTkFCTEUKICNkZWZpbmUgVkJfRElTUFRZUEVfRElTUDEJVkJfRElTUFRZUEVfQ1JUMQogI2RlZmluZSBWQl9ESVNQTU9ERV9TSU5HTEUJVkJfU0lOR0xFX01PREUKICNkZWZpbmUgVkJfRElTUE1PREVfTUlSUk9SCVZCX01JUlJPUl9NT0RFCiAjZGVmaW5lIFZCX0RJU1BNT0RFX0RVQUwJVkJfRFVBTFZJRVdfTU9ERQotI2RlZmluZSBWQl9ESVNQTEFZX01PREUgICAgICAgCShTSU5HTEVfTU9ERSB8IE1JUlJPUl9NT0RFIHwgRFVBTFZJRVdfTU9ERSkKKyNkZWZpbmUgVkJfRElTUExBWV9NT0RFCQkoU0lOR0xFX01PREUgfCBNSVJST1JfTU9ERSB8IERVQUxWSUVXX01PREUpCiAKIC8qIFN0cnVjdHVyZSBhcmd1bWVudCBmb3IgU0lTRkJfR0VUX0lORk8gaW9jdGwgICovCi10eXBlZGVmIHN0cnVjdCBfU0lTRkJfSU5GTyBzaXNmYl9pbmZvLCAqcHNpc2ZiX2luZm87Ci0KLXN0cnVjdCBfU0lTRkJfSU5GTyB7Ci0JX191MzIgICBzaXNmYl9pZDsgICAgICAgICAJLyogZm9yIGlkZW50aWZ5aW5nIHNpc2ZiICovCitzdHJ1Y3Qgc2lzZmJfaW5mbyB7CisJX191MzIJc2lzZmJfaWQ7CQkvKiBmb3IgaWRlbnRpZnlpbmcgc2lzZmIgKi8KICNpZm5kZWYgU0lTRkJfSUQKICNkZWZpbmUgU0lTRkJfSUQJICAweDUzNDk1MzQ2ICAgIC8qIElkZW50aWZ5IG15c2VsZiB3aXRoICdTSVNGJyAqLwogI2VuZGlmCi0gCV9fdTMyICAgY2hpcF9pZDsJCS8qIFBDSS1JRCBvZiBkZXRlY3RlZCBjaGlwICovCi0JX191MzIgICBtZW1vcnk7CQkJLyogdmlkZW8gbWVtb3J5IGluIEtCIHdoaWNoIHNpc2ZiIG1hbmFnZXMgKi8KLQlfX3UzMiAgIGhlYXBzdGFydDsgICAgICAgICAgICAJLyogaGVhcCBzdGFydCAoPSBzaXNmYiAibWVtIiBhcmd1bWVudCkgaW4gS0IgKi8KKwlfX3UzMiAgIGNoaXBfaWQ7CQkvKiBQQ0ktSUQgb2YgZGV0ZWN0ZWQgY2hpcCAqLworCV9fdTMyICAgbWVtb3J5OwkJCS8qIHRvdGFsIHZpZGVvIG1lbW9yeSBpbiBLQiAqLworCV9fdTMyICAgaGVhcHN0YXJ0OwkJLyogaGVhcCBzdGFydCBvZmZzZXQgaW4gS0IgKi8KIAlfX3U4ICAgIGZidmlkbW9kZTsJCS8qIGN1cnJlbnQgc2lzZmIgbW9kZSAqLwogCi0JX191OCAgICBzaXNmYl92ZXJzaW9uOwotCV9fdTggICAgc2lzZmJfcmV2aXNpb247Ci0JX191OCAJc2lzZmJfcGF0Y2hsZXZlbDsKKwlfX3U4CXNpc2ZiX3ZlcnNpb247CisJX191OAlzaXNmYl9yZXZpc2lvbjsKKwlfX3U4CXNpc2ZiX3BhdGNobGV2ZWw7CiAKLQlfX3U4IAlzaXNmYl9jYXBzOwkJLyogc2lzZmIgY2FwYWJpbGl0aWVzICovCisJX191OAlzaXNmYl9jYXBzOwkJLyogc2lzZmIgY2FwYWJpbGl0aWVzICovCiAKIAlfX3UzMglzaXNmYl90cWxlbjsJCS8qIHR1cmJvIHF1ZXVlIGxlbmd0aCAoaW4gS0IpICovCiAKLQlfX3UzMiAJc2lzZmJfcGNpYnVzOyAgICAgIAkvKiBUaGUgY2FyZCdzIFBDSSBJRCAqLwotCV9fdTMyIAlzaXNmYl9wY2lzbG90OwotCV9fdTMyIAlzaXNmYl9wY2lmdW5jOworCV9fdTMyCXNpc2ZiX3BjaWJ1czsJCS8qIFRoZSBjYXJkJ3MgUENJIElEICovCisJX191MzIJc2lzZmJfcGNpc2xvdDsKKwlfX3UzMglzaXNmYl9wY2lmdW5jOwogCi0JX191OCAJc2lzZmJfbGNkcGRjOwkJLyogUGFuZWxEZWxheUNvbXBlbnNhdGlvbiAqLworCV9fdTgJc2lzZmJfbGNkcGRjOwkJLyogUGFuZWxEZWxheUNvbXBlbnNhdGlvbiAqLwogCi0JX191OCAJc2lzZmJfbGNkYTsJCS8qIERldGVjdGVkIHN0YXR1cyBvZiBMQ0RBIGZvciBsb3cgcmVzL3RleHQgbW9kZXMgKi8KKwlfX3U4CXNpc2ZiX2xjZGE7CQkvKiBEZXRlY3RlZCBzdGF0dXMgb2YgTENEQSBmb3IgbG93IHJlcy90ZXh0IG1vZGVzICovCiAKLQlfX3UzMiAJc2lzZmJfdmJmbGFnczsKLQlfX3UzMiAJc2lzZmJfY3VycmVudHZiZmxhZ3M7CisJX191MzIJc2lzZmJfdmJmbGFnczsKKwlfX3UzMglzaXNmYl9jdXJyZW50dmJmbGFnczsKIAotCV9fdTMyIAlzaXNmYl9zY2FsZWxjZDsKLQlfX3UzMiAJc2lzZmJfc3BlY2lhbHRpbWluZzsKKwlfX3UzMglzaXNmYl9zY2FsZWxjZDsKKwlfX3UzMglzaXNmYl9zcGVjaWFsdGltaW5nOwogCi0JX191OCAJc2lzZmJfaGF2ZWVtaTsKLQlfX3U4IAlzaXNmYl9lbWkzMCxzaXNmYl9lbWkzMSxzaXNmYl9lbWkzMixzaXNmYl9lbWkzMzsKLQlfX3U4IAlzaXNmYl9oYXZlZW1pbGNkOworCV9fdTgJc2lzZmJfaGF2ZWVtaTsKKwlfX3U4CXNpc2ZiX2VtaTMwLHNpc2ZiX2VtaTMxLHNpc2ZiX2VtaTMyLHNpc2ZiX2VtaTMzOworCV9fdTgJc2lzZmJfaGF2ZWVtaWxjZDsKIAotCV9fdTggCXNpc2ZiX2xjZHBkY2E7CQkvKiBQYW5lbERlbGF5Q29tcGVuc2F0aW9uIGZvciBMQ0QtdmlhLUNSVDEgKi8KKwlfX3U4CXNpc2ZiX2xjZHBkY2E7CQkvKiBQYW5lbERlbGF5Q29tcGVuc2F0aW9uIGZvciBMQ0QtdmlhLUNSVDEgKi8KIAotCV9fdTE2CXNpc2ZiX3R2eHBvcywgc2lzZmJfdHZ5cG9zOyAgLyogV2FybmluZzogVmFsdWVzICsgMzIgISAqLworCV9fdTE2CXNpc2ZiX3R2eHBvcywgc2lzZmJfdHZ5cG9zOwkvKiBXYXJuaW5nOiBWYWx1ZXMgKyAzMiAhICovCiAKLQlfX3U4IAlyZXNlcnZlZFsyMDhdOyAJCS8qIGZvciBmdXR1cmUgdXNlICovCisJX191MzIJc2lzZmJfaGVhcHNpemU7CQkvKiBoZWFwIHNpemUgKGluIEtCKSAqLworCV9fdTMyCXNpc2ZiX3ZpZGVvb2Zmc2V0OwkvKiBPZmZzZXQgb2Ygdmlld3BvcnQgaW4gdmlkZW8gbWVtb3J5IChpbiBieXRlcykgKi8KKworCV9fdTMyCXNpc2ZiX2N1cmZzdG47CQkvKiBjdXJyZW50bHkgcnVubmluZyBGU1ROL0RTVE4gbW9kZSAqLworCV9fdTMyCXNpc2ZiX2N1cmRzdG47CisKKwlfX3UxNglzaXNmYl9wY2lfdmVuZG9yOwkvKiBQQ0kgdmVuZG9yIChTaVMgb3IgWEdJKSAqLworCisJX191MzIJc2lzZmJfdmJmbGFnczI7CQkvKiBpdmlkZW8tPnZiZmxhZ3MyICovCisKKwlfX3U4CXNpc2ZiX2Nhbl9wb3N0OwkJLyogc2lzZmIgY2FuIFBPU1QgdGhpcyBjYXJkICovCisJX191OAlzaXNmYl9jYXJkX3Bvc3RlZDsJLyogY2FyZCBpcyBQT1NURUQgKi8KKwlfX3U4CXNpc2ZiX3dhc19ib290X2RldmljZTsJLyogVGhpcyBjYXJkIHdhcyB0aGUgYm9vdCB2aWRlbyBkZXZpY2UgKGllIGlzIHByaW1hcnkpICovCisKKwlfX3U4CXJlc2VydmVkWzE4M107CQkvKiBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworI2RlZmluZSBTSVNGQl9DTURfR0VUVkJGTEFHUwkweDU1QUEwMDAxCS8qIG5vIGFyZzsgcmVzdWx0WzFdID0gdmJmbGFncyAqLworI2RlZmluZSBTSVNGQl9DTURfU1dJVENIQ1JUMQkweDU1QUEwMDEwCS8qIGFyZ1swXTogOTkgPSBxdWVyeSwgMCA9IG9mZiwgMSA9IG9uICovCisvKiBtb3JlIHRvIGNvbWUgKi8KKworI2RlZmluZSBTSVNGQl9DTURfRVJSX09LCTB4ODAwMDAwMDAJLyogY29tbWFuZCBzdWNjZWVkZWQgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9MT0NLRUQJMHg4MDAwMDAwMQkvKiBzaXNmYiBpcyBsb2NrZWQgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9FQVJMWQkweDgwMDAwMDAyCS8qIHJlcXVlc3QgYmVmb3JlIHNpc2ZiIHRvb2sgb3ZlciBnZnggc3lzdGVtICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfTk9WQgkweDgwMDAwMDAzCS8qIE5vIHZpZGVvIGJyaWRnZSAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX05PQ1JUMgkweDgwMDAwMDA0CS8qIGNhbid0IGNoYW5nZSBDUlQxIHN0YXR1cywgQ1JUMiBkaXNhYmxlZCAqLworLyogbW9yZSB0byBjb21lICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfVU5LTk9XTiAgIDB4ODAwMGZmZmYJLyogVW5rbm93biBjb21tYW5kICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfT1RIRVIJMHg4MDAxMDAwMAkvKiBPdGhlciBlcnJvciAqLworCisvKiBBcmd1bWVudCBmb3IgU0lTRkJfQ01EIGlvY3RsICovCitzdHJ1Y3Qgc2lzZmJfY21kIHsKKwlfX3UzMiAgc2lzZmJfY21kOworCV9fdTMyICBzaXNmYl9hcmdbMTZdOworCV9fdTMyICBzaXNmYl9yZXN1bHRbNF07CiB9OwogCiAvKiBBZGR0aW9uYWwgSU9DVExzIGZvciBjb21tdW5pY2F0aW9uIHNpc2ZiIDw+IFggZHJpdmVyICAgICAgICAgICAgICAgICovCiAvKiBJZiBjaGFuZ2luZyB0aGlzLCB2Z2F0eXBlcy5oIG11c3QgYWxzbyBiZSBjaGFuZ2VkIChmb3IgWCBkcml2ZXIpICAgICovCiAKIC8qIGlvY3RsIGZvciBpZGVudGlmeWluZyBhbmQgZ2l2aW5nIHNvbWUgaW5mbyAoZXNwLiBtZW1vcnkgaGVhcCBzdGFydCkgKi8KLSNkZWZpbmUgU0lTRkJfR0VUX0lORk9fU0laRSAgCV9JT1IoMHhGMywweDAwLF9fdTMyKQotI2RlZmluZSBTSVNGQl9HRVRfSU5GTwkgIAlfSU9SKDB4RjMsMHgwMSxzdHJ1Y3QgX1NJU0ZCX0lORk8pCisjZGVmaW5lIFNJU0ZCX0dFVF9JTkZPX1NJWkUJX0lPUigweEYzLDB4MDAsX191MzIpCisjZGVmaW5lIFNJU0ZCX0dFVF9JTkZPCQlfSU9SKDB4RjMsMHgwMSxzdHJ1Y3Qgc2lzZmJfaW5mbykKIAogLyogaW9jdHJsIHRvIGdldCBjdXJyZW50IHZlcnRpY2FsIHJldHJhY2Ugc3RhdHVzICovCi0jZGVmaW5lIFNJU0ZCX0dFVF9WQlJTVEFUVVMgIAlfSU9SKDB4RjMsMHgwMixfX3UzMikKKyNkZWZpbmUgU0lTRkJfR0VUX1ZCUlNUQVRVUwlfSU9SKDB4RjMsMHgwMixfX3UzMikKIAogLyogaW9jdGwgdG8gZW5hYmxlL2Rpc2FibGUgcGFubmluZyBhdXRvLW1heGltaXplIChsaWtlIG5vbWF4IHBhcmFtZXRlcikgKi8KLSNkZWZpbmUgU0lTRkJfR0VUX0FVVE9NQVhJTUlaRSAJX0lPUigweEYzLDB4MDMsX191MzIpCi0jZGVmaW5lIFNJU0ZCX1NFVF9BVVRPTUFYSU1JWkUgCV9JT1coMHhGMywweDAzLF9fdTMyKQorI2RlZmluZSBTSVNGQl9HRVRfQVVUT01BWElNSVpFCV9JT1IoMHhGMywweDAzLF9fdTMyKQorI2RlZmluZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFCV9JT1coMHhGMywweDAzLF9fdTMyKQogCiAvKiBpb2N0bHMgdG8gcmVsb2NhdGUgVFYgb3V0cHV0ICh4PURbMzE6MTZdLCB5PURbMTU6MF0sICsgMzIpKi8KLSNkZWZpbmUgU0lTRkJfR0VUX1RWUE9TT0ZGU0VUICAgX0lPUigweEYzLDB4MDQsX191MzIpCi0jZGVmaW5lIFNJU0ZCX1NFVF9UVlBPU09GRlNFVCAgIF9JT1coMHhGMywweDA0LF9fdTMyKQorI2RlZmluZSBTSVNGQl9HRVRfVFZQT1NPRkZTRVQJX0lPUigweEYzLDB4MDQsX191MzIpCisjZGVmaW5lIFNJU0ZCX1NFVF9UVlBPU09GRlNFVAlfSU9XKDB4RjMsMHgwNCxfX3UzMikKKworLyogaW9jdGwgZm9yIGludGVybmFsIHNpc2ZiIGNvbW1hbmRzIChzaXNmYmN0cmwpICovCisjZGVmaW5lIFNJU0ZCX0NPTU1BTkQJCV9JT1dSKDB4RjMsMHgwNSxzdHJ1Y3Qgc2lzZmJfY21kKQogCiAvKiBpb2N0bCBmb3IgbG9ja2luZyBzaXNmYiAobm8gcmVnaXN0ZXIgYWNjZXNzIGR1cmluZyBsb2NrKSAqLwogLyogQXMgb2Ygbm93LCBvbmx5IHVzZWQgdG8gYXZvaWQgcmVnaXN0ZXIgYWNjZXNzIGR1cmluZwogICogdGhlIGlvY3RscyBsaXN0ZWQgYWJvdmUuCiAgKi8KLSNkZWZpbmUgU0lTRkJfU0VUX0xPQ0sgIAlfSU9XKDB4RjMsMHgwNixfX3UzMikKLQotLyogbW9yZSB0byBjb21lIHNvb24gKi8KKyNkZWZpbmUgU0lTRkJfU0VUX0xPQ0sJCV9JT1coMHhGMywweDA2LF9fdTMyKQogCiAvKiBpb2N0bHMgMHhGMyB1cCB0byAweDNGIHJlc2VydmVkIGZvciBzaXNmYiAqLwogCkBAIC0xNjUsNyArMTg0LDcgQEAKIC8qIFRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhbnltb3JlOiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBpb2N0bCBmb3IgaWRlbnRpZnlpbmcgYW5kIGdpdmluZyBzb21lIGluZm8gKGVzcC4gbWVtb3J5IGhlYXAgc3RhcnQpICovCi0jZGVmaW5lIFNJU0ZCX0dFVF9JTkZPX09MRCAgCSAgIF9JT1IoJ24nLDB4RjgsX191MzIpCisjZGVmaW5lIFNJU0ZCX0dFVF9JTkZPX09MRAkgICBfSU9SKCduJywweEY4LF9fdTMyKQogLyogaW9jdHJsIHRvIGdldCBjdXJyZW50IHZlcnRpY2FsIHJldHJhY2Ugc3RhdHVzICovCiAjZGVmaW5lIFNJU0ZCX0dFVF9WQlJTVEFUVVNfT0xECSAgIF9JT1IoJ24nLDB4RjksX191MzIpCiAvKiBpb2N0bCB0byBlbmFibGUvZGlzYWJsZSBwYW5uaW5nIGF1dG8tbWF4aW1pemUgKGxpa2Ugbm9tYXggcGFyYW1ldGVyKSAqLwpAQCAtMTc3LDggKzE5Niw4IEBACiAKIC8qIEZvciBmYiBtZW1vcnkgbWFuYWdlciAoRkJJT19BTExPQywgRkJJT19GUkVFKSAqLwogc3RydWN0IHNpc19tZW1yZXEgewotCV9fdTMyIAlvZmZzZXQ7Ci0JX191MzIgCXNpemU7CisJX191MzIJb2Zmc2V0OworCV9fdTMyCXNpemU7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE4NywxMiArMjA2LDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCiAjZGVmaW5lCVVOS05PV05fVkdBICAwCiAjZGVmaW5lCVNJU18zMDBfVkdBICAxCiAjZGVmaW5lCVNJU18zMTVfVkdBICAyCiAKKyNkZWZpbmUgU0lTRkJfSEFWRV9NQUxMT0NfTkVXCiBleHRlcm4gdm9pZCBzaXNfbWFsbG9jKHN0cnVjdCBzaXNfbWVtcmVxICpyZXEpOworZXh0ZXJuIHZvaWQgc2lzX21hbGxvY19uZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzaXNfbWVtcmVxICpyZXEpOworCiBleHRlcm4gdm9pZCBzaXNfZnJlZSh1MzIgYmFzZSk7CitleHRlcm4gdm9pZCBzaXNfZnJlZV9uZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBiYXNlKTsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vdzEwMGZiLmggYi9pbmNsdWRlL3ZpZGVvL3cxMDBmYi5oCmluZGV4IGJkNTQ4YzIuLmU2ZGEyZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vdzEwMGZiLmgKKysrIGIvaW5jbHVkZS92aWRlby93MTAwZmIuaApAQCAtMSwyMSArMSwxNDkgQEAKIC8qCiAgKiAgU3VwcG9ydCBmb3IgdGhlIHcxMDAgZnJhbWUgYnVmZmVyLgogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDQgUmljaGFyZCBQdXJkaWUKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZQorICogIENvcHlyaWdodCAoYykgMjAwNSBJYW4gTW9sdG9uCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjZGVmaW5lIFcxMDBfR1BJT19QT1JUX0EJMAorI2RlZmluZSBXMTAwX0dQSU9fUE9SVF9CCTEKKworI2RlZmluZSBDTEtfU1JDX1hUQUwgIDAKKyNkZWZpbmUgQ0xLX1NSQ19QTEwgICAxCisKK3N0cnVjdCB3MTAwZmJfcGFyOworCit1bnNpZ25lZCBsb25nIHcxMDBmYl9ncGlvX3JlYWQoaW50IHBvcnQpOwordm9pZCB3MTAwZmJfZ3Bpb193cml0ZShpbnQgcG9ydCwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisKKy8qIExDRCBTcGVjaWZpYyBSb3V0aW5lcyBhbmQgQ29uZmlnICovCitzdHJ1Y3QgdzEwMF90Z19pbmZvIHsKKwl2b2lkICgqY2hhbmdlKShzdHJ1Y3QgdzEwMGZiX3BhciopOworCXZvaWQgKCpzdXNwZW5kKShzdHJ1Y3QgdzEwMGZiX3BhciopOworCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCB3MTAwZmJfcGFyKik7Cit9OworCisvKiBHZW5lcmFsIFBsYXRmb3JtIFNwZWNpZmljIHcxMDAgUmVnaXN0ZXIgVmFsdWVzICovCitzdHJ1Y3QgdzEwMF9nZW5fcmVncyB7CisJdW5zaWduZWQgbG9uZyBsY2RfZm9ybWF0OworCXVuc2lnbmVkIGxvbmcgbGNkZF9jbnRsMTsKKwl1bnNpZ25lZCBsb25nIGxjZGRfY250bDI7CisJdW5zaWduZWQgbG9uZyBnZW5sY2RfY250bDE7CisJdW5zaWduZWQgbG9uZyBnZW5sY2RfY250bDI7CisJdW5zaWduZWQgbG9uZyBnZW5sY2RfY250bDM7Cit9OworCitzdHJ1Y3QgdzEwMF9ncGlvX3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgaW5pdF9kYXRhMTsKKwl1bnNpZ25lZCBsb25nIGluaXRfZGF0YTI7CisJdW5zaWduZWQgbG9uZyBncGlvX2RpcjE7CisJdW5zaWduZWQgbG9uZyBncGlvX29lMTsKKwl1bnNpZ25lZCBsb25nIGdwaW9fZGlyMjsKKwl1bnNpZ25lZCBsb25nIGdwaW9fb2UyOworfTsKKworLyogT3B0aW9uYWwgRXh0ZXJuYWwgTWVtb3J5IENvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCB3MTAwX21lbV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGV4dF9jbnRsOworCXVuc2lnbmVkIGxvbmcgc2RyYW1fbW9kZV9yZWc7CisJdW5zaWduZWQgbG9uZyBleHRfdGltaW5nX2NudGw7CisJdW5zaWduZWQgbG9uZyBpb19jbnRsOworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworc3RydWN0IHcxMDBfYm1fbWVtX2luZm8geworCXVuc2lnbmVkIGxvbmcgZXh0X21lbV9idzsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGV4dF90aW1pbmdfY3RsOworCXVuc2lnbmVkIGxvbmcgZXh0X2NudGw7CisJdW5zaWduZWQgbG9uZyBtb2RlX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlvX2NudGw7CisJdW5zaWduZWQgbG9uZyBjb25maWc7Cit9OworCisvKiBMQ0QgTW9kZSBkZWZpbml0aW9uICovCitzdHJ1Y3QgdzEwMF9tb2RlIHsKKwl1bnNpZ25lZCBpbnQgeHJlczsKKwl1bnNpZ25lZCBpbnQgeXJlczsKKwl1bnNpZ25lZCBzaG9ydCBsZWZ0X21hcmdpbjsKKwl1bnNpZ25lZCBzaG9ydCByaWdodF9tYXJnaW47CisJdW5zaWduZWQgc2hvcnQgdXBwZXJfbWFyZ2luOworCXVuc2lnbmVkIHNob3J0IGxvd2VyX21hcmdpbjsKKwl1bnNpZ25lZCBsb25nIGNydGNfc3M7CisJdW5zaWduZWQgbG9uZyBjcnRjX2xzOworCXVuc2lnbmVkIGxvbmcgY3J0Y19nczsKKwl1bnNpZ25lZCBsb25nIGNydGNfdnBvc19nczsKKwl1bnNpZ25lZCBsb25nIGNydGNfcmV2OworCXVuc2lnbmVkIGxvbmcgY3J0Y19kY2xrOworCXVuc2lnbmVkIGxvbmcgY3J0Y19nY2xrOworCXVuc2lnbmVkIGxvbmcgY3J0Y19nb2U7CisJdW5zaWduZWQgbG9uZyBjcnRjX3BzMV9hY3RpdmU7CisJY2hhciBwbGxfZnJlcTsKKwljaGFyIGZhc3RfcGxsX2ZyZXE7CisJaW50IHN5c2Nsa19zcmM7CisJaW50IHN5c2Nsa19kaXZpZGVyOworCWludCBwaXhjbGtfc3JjOworCWludCBwaXhjbGtfZGl2aWRlcjsKKwlpbnQgcGl4Y2xrX2RpdmlkZXJfcm90YXRlZDsKK307CisKK3N0cnVjdCB3MTAwX3BsbF9pbmZvIHsKKwl1aW50MTZfdCBmcmVxOyAgLyogZGVzaXJlZCBGb3V0IGZvciBQTEwgKE1oeikgKi8KKwl1aW50OF90IE07ICAgICAgLyogaW5wdXQgZGl2aWRlciAqLworCXVpbnQ4X3QgTl9pbnQ7ICAvKiBWQ08gbXVsdGlwbGllciAqLworCXVpbnQ4X3QgTl9mYWM7ICAvKiBWQ08gbXVsdGlwbGllciBmcmFjdGlvbmFsIHBhcnQgKi8KKwl1aW50OF90IHRmZ29hbDsKKwl1aW50OF90IGxvY2tfdGltZTsKK307CisKKy8qIEluaXRpYWwgVmlkZW8gbW9kZSBvcmllbnRhdGlvbiBmbGFncyAqLworI2RlZmluZSBJTklUX01PREVfUk9UQVRFRCAgMHgxCisjZGVmaW5lIElOSVRfTU9ERV9GTElQUEVEICAweDIKKwogLyoKICAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgbWFjaGluZSB3aGljaCB3ZSBhcmUgcnVubmluZyBvbi4KICAqIEl0IGlzIHNldCBieSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgYW5kIHVzZWQgaW4gdGhlIHByb2JlIHJvdXRpbmUKICAqIG9mIGRyaXZlcnMvdmlkZW8vdzEwMGZiLmMKICAqLwotCiBzdHJ1Y3QgdzEwMGZiX21hY2hfaW5mbyB7Ci0Jdm9pZCAoKncxMDBmYl9zc3Bfc2VuZCkodTggYWRycywgdTggZGF0YSk7Ci0JaW50IGNvbWFkajsKLQlpbnQgcGhhZGFkajsKKwkvKiBHZW5lcmFsIFBsYXRmb3JtIFNwZWNpZmljIFJlZ2lzdGVycyAqLworCXN0cnVjdCB3MTAwX2dlbl9yZWdzICpyZWdzOworCS8qIFRhYmxlIG9mIG1vZGVzIHRoZSBMQ0QgaXMgY2FwYWJsZSBvZiAqLworCXN0cnVjdCB3MTAwX21vZGUgKm1vZGVsaXN0OworCXVuc2lnbmVkIGludCBudW1fbW9kZXM7CisJLyogSG9va3MgZm9yIGFueSBwbGF0Zm9ybSBzcGVjaWZpYyB0Zy9sY2QgY29kZSAob3B0aW9uYWwpICovCisJc3RydWN0IHcxMDBfdGdfaW5mbyAqdGc7CisJLyogRXh0ZXJuYWwgbWVtb3J5IGRlZmluaXRpb24gKGlmIHByZXNlbnQpICovCisJc3RydWN0IHcxMDBfbWVtX2luZm8gKm1lbTsKKwkvKiBBZGRpdGlvbmFsIEV4dGVybmFsIG1lbW9yeSBkZWZpbml0aW9uIChpZiBwcmVzZW50KSAqLworCXN0cnVjdCB3MTAwX2JtX21lbV9pbmZvICpibV9tZW07CisJLyogR1BJTyBkZWZpbml0aW9ucyAob3B0aW9uYWwpICovCisJc3RydWN0IHcxMDBfZ3Bpb19yZWdzICpncGlvOworCS8qIEluaXRpYWwgTW9kZSBmbGFncyAqLworCXVuc2lnbmVkIGludCBpbml0X21vZGU7CisJLyogWHRhbCBGcmVxdWVuY3kgKi8KKwl1bnNpZ25lZCBpbnQgeHRhbF9mcmVxOworCS8qIEVuYWJsZSBYdGFsIGlucHV0IGRvdWJsZXIgKDEgPT0gZW5hYmxlKSAqLworCXVuc2lnbmVkIGludCB4dGFsX2RibDsKK307CisKKy8qIEdlbmVyYWwgZnJhbWUgYnVmZmVyIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgdzEwMGZiX3BhciB7CisJdW5zaWduZWQgaW50IGNoaXBfaWQ7CisJdW5zaWduZWQgaW50IHhyZXM7CisJdW5zaWduZWQgaW50IHlyZXM7CisJdW5zaWduZWQgaW50IGV4dG1lbV9hY3RpdmU7CisJdW5zaWduZWQgaW50IGZsaXA7CisJdW5zaWduZWQgaW50IGJsYW5rZWQ7CisJdW5zaWduZWQgaW50IGZhc3RwbGxfbW9kZTsKKwl1bnNpZ25lZCBsb25nIGhzeW5jX2xlbjsKKwlzdHJ1Y3QgdzEwMF9tb2RlICptb2RlOworCXN0cnVjdCB3MTAwX3BsbF9pbmZvICpwbGxfdGFibGU7CisJc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gKm1hY2g7CisJdWludDMyX3QgKnNhdmVkX2ludG1lbTsKKwl1aW50MzJfdCAqc2F2ZWRfZXh0bWVtOwogfTsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggZmY0MTAwNi4uZjE0MmQ0MCAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTEyMyw2ICsxMjMsNyBAQAogY2hhciBzYXZlZF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCiBzdGF0aWMgY2hhciAqZXhlY3V0ZV9jb21tYW5kOworc3RhdGljIGNoYXIgKnJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kOwogCiAvKiBTZXR1cCBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIENQVXMgdG8gYWN0aXZhdGUgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2NwdXMgPSBOUl9DUFVTOwpAQCAtMjk3LDYgKzI5OCwxOCBAQAogfQogX19zZXR1cCgiaW5pdD0iLCBpbml0X3NldHVwKTsKIAorc3RhdGljIGludCBfX2luaXQgcmRpbml0X3NldHVwKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gc3RyOworCS8qIFNlZSAiYXV0byIgY29tbWVudCBpbiBpbml0X3NldHVwICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9JTklUX0FSR1M7IGkrKykKKwkJYXJndl9pbml0W2ldID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInJkaW5pdD0iLCByZGluaXRfc2V0dXApOworCiBleHRlcm4gdm9pZCBzZXR1cF9hcmNoKGNoYXIgKiopOwogCiAjaWZuZGVmIENPTkZJR19TTVAKQEAgLTYxNCw2ICs2MjcsNyBAQAogCW1pZ3JhdGlvbl9pbml0KCk7CiAjZW5kaWYKIAlzcGF3bl9rc29mdGlycWQoKTsKKwlzcGF3bl9zb2Z0bG9ja3VwX3Rhc2soKTsKIH0KIAogc3RhdGljIHZvaWQgcnVuX2luaXRfcHJvY2VzcyhjaGFyICppbml0X2ZpbGVuYW1lKQpAQCAtNjgwLDEwICs2OTQsMTQgQEAKIAkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbiBlYXJseSB1c2Vyc3BhY2UgaW5pdC4gIElmIHllcywgbGV0IGl0IGRvIGFsbAogCSAqIHRoZSB3b3JrCiAJICovCi0JaWYgKHN5c19hY2Nlc3MoKGNvbnN0IGNoYXIgX191c2VyICopICIvaW5pdCIsIDApID09IDApCi0JCWV4ZWN1dGVfY29tbWFuZCA9ICIvaW5pdCI7Ci0JZWxzZQorCisJaWYgKCFyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCkKKwkJcmFtZGlza19leGVjdXRlX2NvbW1hbmQgPSAiL2luaXQiOworCisJaWYgKHN5c19hY2Nlc3MoKGNvbnN0IGNoYXIgX191c2VyICopIHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kLCAwKSAhPSAwKSB7CisJCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gTlVMTDsKIAkJcHJlcGFyZV9uYW1lc3BhY2UoKTsKKwl9CiAKIAkvKgogCSAqIE9rLCB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBib290dXAsIGFuZApAQCAtNzAwLDE3ICs3MTgsMjQgQEAKIAogCSh2b2lkKSBzeXNfZHVwKDApOwogCSh2b2lkKSBzeXNfZHVwKDApOwotCQorCisJaWYgKHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKSB7CisJCXJ1bl9pbml0X3Byb2Nlc3MocmFtZGlza19leGVjdXRlX2NvbW1hbmQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gZXhlY3V0ZSAlc1xuIiwKKwkJCQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCk7CisJfQorCiAJLyoKIAkgKiBXZSB0cnkgZWFjaCBvZiB0aGVzZSB1bnRpbCBvbmUgc3VjY2VlZHMuCiAJICoKIAkgKiBUaGUgQm91cm5lIHNoZWxsIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgaW5pdCBpZiB3ZSBhcmUgCiAJICogdHJ5aW5nIHRvIHJlY292ZXIgYSByZWFsbHkgYnJva2VuIG1hY2hpbmUuCiAJICovCi0KLQlpZiAoZXhlY3V0ZV9jb21tYW5kKQorCWlmIChleGVjdXRlX2NvbW1hbmQpIHsKIAkJcnVuX2luaXRfcHJvY2VzcyhleGVjdXRlX2NvbW1hbmQpOwotCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBleGVjdXRlICVzLiAgQXR0ZW1wdGluZyAiCisJCQkJCSJkZWZhdWx0cy4uLlxuIiwgZXhlY3V0ZV9jb21tYW5kKTsKKwl9CiAJcnVuX2luaXRfcHJvY2VzcygiL3NiaW4vaW5pdCIpOwogCXJ1bl9pbml0X3Byb2Nlc3MoIi9ldGMvaW5pdCIpOwogCXJ1bl9pbml0X3Byb2Nlc3MoIi9iaW4vaW5pdCIpOwpkaWZmIC0tZ2l0IGEvaXBjL2NvbXBhdC5jIGIvaXBjL2NvbXBhdC5jCmluZGV4IDM4ODFkNTYuLjFmZTk1ZjYgMTAwNjQ0Ci0tLSBhL2lwYy9jb21wYXQuYworKysgYi9pcGMvY29tcGF0LmMKQEAgLTQyLDEwICs0MiwxMCBAQAogCiBzdHJ1Y3QgY29tcGF0X2lwY19wZXJtIHsKIAlrZXlfdCBrZXk7Ci0JY29tcGF0X3VpZF90IHVpZDsKLQljb21wYXRfZ2lkX3QgZ2lkOwotCWNvbXBhdF91aWRfdCBjdWlkOwotCWNvbXBhdF9naWRfdCBjZ2lkOworCV9fY29tcGF0X3VpZF90IHVpZDsKKwlfX2NvbXBhdF9naWRfdCBnaWQ7CisJX19jb21wYXRfdWlkX3QgY3VpZDsKKwlfX2NvbXBhdF9naWRfdCBjZ2lkOwogCWNvbXBhdF9tb2RlX3QgbW9kZTsKIAl1bnNpZ25lZCBzaG9ydCBzZXE7CiB9OwpAQCAtMTc0LDggKzE3NCw4IEBACiAJCQkJCXN0cnVjdCBjb21wYXRfaXBjX3Blcm0gX191c2VyICp1cCkKIHsKIAlpbnQgZXJyOwotCWNvbXBhdF91aWRfdCB1OwotCWNvbXBhdF9naWRfdCBnOworCV9fY29tcGF0X3VpZF90IHU7CisJX19jb21wYXRfZ2lkX3QgZzsKIAogCWVyciAgPSBfX3B1dF91c2VyKHAtPmtleSwgJnVwLT5rZXkpOwogCVNFVF9VSUQodSwgcC0+dWlkKTsKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCAwYWNmMjQ1Li4zYTkyNjAxIDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC02OSw3ICs2OSw3IEBACiAKIAlzdHJ1Y3Qgc2lnZXZlbnQgbm90aWZ5OwogCXBpZF90IG5vdGlmeV9vd25lcjsKLSAJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwkvKiB1c2VyIHdobyBjcmVhdGVkLCBmb3IgYWNjb3V0aW5nICovCisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwkvKiB1c2VyIHdobyBjcmVhdGVkLCBmb3IgYWNjb3VudGluZyAqLwogCXN0cnVjdCBzb2NrICpub3RpZnlfc29jazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbm90aWZ5X2Nvb2tpZTsKIApkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IDI3ZTUxNmYuLmQwMzViZDIgMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJ1dGlsLmgiCkBAIC03NCwxNiArNzUsMTYgQEAKIHN0YXRpYyB2b2lkIGZyZWVxdWUgKHN0cnVjdCBtc2dfcXVldWUgKm1zcSwgaW50IGlkKTsKIHN0YXRpYyBpbnQgbmV3cXVlIChrZXlfdCBrZXksIGludCBtc2dmbGcpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50IHN5c3ZpcGNfbXNnX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHN5c3ZpcGNfbXNnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCiB2b2lkIF9faW5pdCBtc2dfaW5pdCAodm9pZCkKIHsKIAlpcGNfaW5pdF9pZHMoJm1zZ19pZHMsbXNnX2N0bG1uaSk7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN5c3ZpcGMvbXNnIiwgMCwgTlVMTCwgc3lzdmlwY19tc2dfcmVhZF9wcm9jLCBOVUxMKTsKLSNlbmRpZgorCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL21zZyIsCisJCQkJIiAgICAgICBrZXkgICAgICBtc3FpZCBwZXJtcyAgICAgIGNieXRlcyAgICAgICBxbnVtIGxzcGlkIGxycGlkICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgc3RpbWUgICAgICBydGltZSAgICAgIGN0aW1lXG4iLAorCQkJCSZtc2dfaWRzLAorCQkJCXN5c3ZpcGNfbXNnX3Byb2Nfc2hvdyk7CiB9CiAKIHN0YXRpYyBpbnQgbmV3cXVlIChrZXlfdCBrZXksIGludCBtc2dmbGcpCkBAIC0xMTMsNiArMTE0LDcgQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCisJbXNxLT5xX2lkID0gbXNnX2J1aWxkaWQoaWQsbXNxLT5xX3Blcm0uc2VxKTsKIAltc3EtPnFfc3RpbWUgPSBtc3EtPnFfcnRpbWUgPSAwOwogCW1zcS0+cV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJbXNxLT5xX2NieXRlcyA9IG1zcS0+cV9xbnVtID0gMDsKQEAgLTEyMyw3ICsxMjUsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZtc3EtPnFfc2VuZGVycyk7CiAJbXNnX3VubG9jayhtc3EpOwogCi0JcmV0dXJuIG1zZ19idWlsZGlkKGlkLG1zcS0+cV9wZXJtLnNlcSk7CisJcmV0dXJuIG1zcS0+cV9pZDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNzX2FkZChzdHJ1Y3QgbXNnX3F1ZXVlKiBtc3EsIHN0cnVjdCBtc2dfc2VuZGVyKiBtc3MpCkBAIC04MDgsNTUgKzgxMCwyNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgc3lzdmlwY19tc2dfcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBzeXN2aXBjX21zZ19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlvZmZfdCBwb3MgPSAwOwotCW9mZl90IGJlZ2luID0gMDsKLQlpbnQgaSwgbGVuID0gMDsKKwlzdHJ1Y3QgbXNnX3F1ZXVlICptc3EgPSBpdDsKIAotCWRvd24oJm1zZ19pZHMuc2VtKTsKLQlsZW4gKz0gc3ByaW50ZihidWZmZXIsICIgICAgICAga2V5ICAgICAgbXNxaWQgcGVybXMgICAgICBjYnl0ZXMgICAgICAgcW51bSBsc3BpZCBscnBpZCAgIHVpZCAgIGdpZCAgY3VpZCAgY2dpZCAgICAgIHN0aW1lICAgICAgcnRpbWUgICAgICBjdGltZVxuIik7Ci0KLQlmb3IoaSA9IDA7IGkgPD0gbXNnX2lkcy5tYXhfaWQ7IGkrKykgewotCQlzdHJ1Y3QgbXNnX3F1ZXVlICogbXNxOwotCQltc3EgPSBtc2dfbG9jayhpKTsKLQkJaWYobXNxICE9IE5VTEwpIHsKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiUxMGQgJTEwZCAgJTRvICAlMTBsdSAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTV1ICU1dSAlMTBsdSAlMTBsdSAlMTBsdVxuIiwKLQkJCQltc3EtPnFfcGVybS5rZXksCi0JCQkJbXNnX2J1aWxkaWQoaSxtc3EtPnFfcGVybS5zZXEpLAotCQkJCW1zcS0+cV9wZXJtLm1vZGUsCi0JCQkJbXNxLT5xX2NieXRlcywKLQkJCQltc3EtPnFfcW51bSwKLQkJCQltc3EtPnFfbHNwaWQsCi0JCQkJbXNxLT5xX2xycGlkLAotCQkJCW1zcS0+cV9wZXJtLnVpZCwKLQkJCQltc3EtPnFfcGVybS5naWQsCi0JCQkJbXNxLT5xX3Blcm0uY3VpZCwKLQkJCQltc3EtPnFfcGVybS5jZ2lkLAotCQkJCW1zcS0+cV9zdGltZSwKLQkJCQltc3EtPnFfcnRpbWUsCi0JCQkJbXNxLT5xX2N0aW1lKTsKLQkJCW1zZ191bmxvY2sobXNxKTsKLQotCQkJcG9zICs9IGxlbjsKLQkJCWlmKHBvcyA8IG9mZnNldCkgewotCQkJCWxlbiA9IDA7Ci0JCQkJYmVnaW4gPSBwb3M7Ci0JCQl9Ci0JCQlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCi0JCQkJZ290byBkb25lOwotCQl9Ci0KLQl9Ci0JKmVvZiA9IDE7Ci1kb25lOgotCXVwKCZtc2dfaWRzLnNlbSk7Ci0JKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsKLQlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsKLQlpZihsZW4gPiBsZW5ndGgpCi0JCWxlbiA9IGxlbmd0aDsKLQlpZihsZW4gPCAwKQotCQlsZW4gPSAwOwotCXJldHVybiBsZW47CisJcmV0dXJuIHNlcV9wcmludGYocywKKwkJCSAgIiUxMGQgJTEwZCAgJTRvICAlMTBsdSAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTV1ICU1dSAlMTBsdSAlMTBsdSAlMTBsdVxuIiwKKwkJCSAgbXNxLT5xX3Blcm0ua2V5LAorCQkJICBtc3EtPnFfaWQsCisJCQkgIG1zcS0+cV9wZXJtLm1vZGUsCisJCQkgIG1zcS0+cV9jYnl0ZXMsCisJCQkgIG1zcS0+cV9xbnVtLAorCQkJICBtc3EtPnFfbHNwaWQsCisJCQkgIG1zcS0+cV9scnBpZCwKKwkJCSAgbXNxLT5xX3Blcm0udWlkLAorCQkJICBtc3EtPnFfcGVybS5naWQsCisJCQkgIG1zcS0+cV9wZXJtLmN1aWQsCisJCQkgIG1zcS0+cV9wZXJtLmNnaWQsCisJCQkgIG1zcS0+cV9zdGltZSwKKwkJCSAgbXNxLT5xX3J0aW1lLAorCQkJICBtc3EtPnFfY3RpbWUpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggNzA5NzVjZS4uMTlhZjAyOCAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAKQEAgLTg5LDcgKzkwLDcgQEAKIHN0YXRpYyBpbnQgbmV3YXJ5IChrZXlfdCwgaW50LCBpbnQpOwogc3RhdGljIHZvaWQgZnJlZWFyeSAoc3RydWN0IHNlbV9hcnJheSAqc21hLCBpbnQgaWQpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50IHN5c3ZpcGNfc2VtX3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHN5c3ZpcGNfc2VtX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCiAjZGVmaW5lIFNFTU1TTF9GQVNUCTI1NiAvKiA1MTIgYnl0ZXMgb24gc3RhY2sgKi8KQEAgLTExNiwxMCArMTE3LDEwIEBACiB7CiAJdXNlZF9zZW1zID0gMDsKIAlpcGNfaW5pdF9pZHMoJnNlbV9pZHMsc2Nfc2VtbW5pKTsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3lzdmlwYy9zZW0iLCAwLCBOVUxMLCBzeXN2aXBjX3NlbV9yZWFkX3Byb2MsIE5VTEwpOwotI2VuZGlmCisJaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoInN5c3ZpcGMvc2VtIiwKKwkJCQkiICAgICAgIGtleSAgICAgIHNlbWlkIHBlcm1zICAgICAgbnNlbXMgICB1aWQgICBnaWQgIGN1aWQgIGNnaWQgICAgICBvdGltZSAgICAgIGN0aW1lXG4iLAorCQkJCSZzZW1faWRzLAorCQkJCXN5c3ZpcGNfc2VtX3Byb2Nfc2hvdyk7CiB9CiAKIC8qCkBAIC0xOTMsNiArMTk0LDcgQEAKIAl9CiAJdXNlZF9zZW1zICs9IG5zZW1zOwogCisJc21hLT5zZW1faWQgPSBzZW1fYnVpbGRpZChpZCwgc21hLT5zZW1fcGVybS5zZXEpOwogCXNtYS0+c2VtX2Jhc2UgPSAoc3RydWN0IHNlbSAqKSAmc21hWzFdOwogCS8qIHNtYS0+c2VtX3BlbmRpbmcgPSBOVUxMOyAqLwogCXNtYS0+c2VtX3BlbmRpbmdfbGFzdCA9ICZzbWEtPnNlbV9wZW5kaW5nOwpAQCAtMjAxLDcgKzIwMyw3IEBACiAJc21hLT5zZW1fY3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCXNlbV91bmxvY2soc21hKTsKIAotCXJldHVybiBzZW1fYnVpbGRpZChpZCwgc21hLT5zZW1fcGVybS5zZXEpOworCXJldHVybiBzbWEtPnNlbV9pZDsKIH0KIAogYXNtbGlua2FnZSBsb25nIHN5c19zZW1nZXQgKGtleV90IGtleSwgaW50IG5zZW1zLCBpbnQgc2VtZmxnKQpAQCAtMTMyOCw1MCArMTMzMCwyMSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgc3lzdmlwY19zZW1fcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBzeXN2aXBjX3NlbV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlvZmZfdCBwb3MgPSAwOwotCW9mZl90IGJlZ2luID0gMDsKLQlpbnQgaSwgbGVuID0gMDsKKwlzdHJ1Y3Qgc2VtX2FycmF5ICpzbWEgPSBpdDsKIAotCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciwgIiAgICAgICBrZXkgICAgICBzZW1pZCBwZXJtcyAgICAgIG5zZW1zICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgb3RpbWUgICAgICBjdGltZVxuIik7Ci0JZG93bigmc2VtX2lkcy5zZW0pOwotCi0JZm9yKGkgPSAwOyBpIDw9IHNlbV9pZHMubWF4X2lkOyBpKyspIHsKLQkJc3RydWN0IHNlbV9hcnJheSAqc21hOwotCQlzbWEgPSBzZW1fbG9jayhpKTsKLQkJaWYoc21hKSB7Ci0JCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIlMTBkICUxMGQgICU0byAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHVcbiIsCi0JCQkJc21hLT5zZW1fcGVybS5rZXksCi0JCQkJc2VtX2J1aWxkaWQoaSxzbWEtPnNlbV9wZXJtLnNlcSksCi0JCQkJc21hLT5zZW1fcGVybS5tb2RlLAotCQkJCXNtYS0+c2VtX25zZW1zLAotCQkJCXNtYS0+c2VtX3Blcm0udWlkLAotCQkJCXNtYS0+c2VtX3Blcm0uZ2lkLAotCQkJCXNtYS0+c2VtX3Blcm0uY3VpZCwKLQkJCQlzbWEtPnNlbV9wZXJtLmNnaWQsCi0JCQkJc21hLT5zZW1fb3RpbWUsCi0JCQkJc21hLT5zZW1fY3RpbWUpOwotCQkJc2VtX3VubG9jayhzbWEpOwotCi0JCQlwb3MgKz0gbGVuOwotCQkJaWYocG9zIDwgb2Zmc2V0KSB7Ci0JCQkJbGVuID0gMDsKLQkgICAgCQkJYmVnaW4gPSBwb3M7Ci0JCQl9Ci0JCQlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCi0JCQkJZ290byBkb25lOwotCQl9Ci0JfQotCSplb2YgPSAxOwotZG9uZToKLQl1cCgmc2VtX2lkcy5zZW0pOwotCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7Ci0JbGVuIC09IChvZmZzZXQgLSBiZWdpbik7Ci0JaWYobGVuID4gbGVuZ3RoKQotCQlsZW4gPSBsZW5ndGg7Ci0JaWYobGVuIDwgMCkKLQkJbGVuID0gMDsKLQlyZXR1cm4gbGVuOworCXJldHVybiBzZXFfcHJpbnRmKHMsCisJCQkgICIlMTBkICUxMGQgICU0byAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHVcbiIsCisJCQkgIHNtYS0+c2VtX3Blcm0ua2V5LAorCQkJICBzbWEtPnNlbV9pZCwKKwkJCSAgc21hLT5zZW1fcGVybS5tb2RlLAorCQkJICBzbWEtPnNlbV9uc2VtcywKKwkJCSAgc21hLT5zZW1fcGVybS51aWQsCisJCQkgIHNtYS0+c2VtX3Blcm0uZ2lkLAorCQkJICBzbWEtPnNlbV9wZXJtLmN1aWQsCisJCQkgIHNtYS0+c2VtX3Blcm0uY2dpZCwKKwkJCSAgc21hLT5zZW1fb3RpbWUsCisJCQkgIHNtYS0+c2VtX2N0aW1lKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDFkNmNmMDguLmRjYTkwNDggMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTIzLDEyICsyMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgdm9pZCBzaG1fb3BlbiAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzaG1kKTsKIHN0YXRpYyB2b2lkIHNobV9jbG9zZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzaG1kKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludCBzeXN2aXBjX3NobV9yZWFkX3Byb2MoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBzeXN2aXBjX3NobV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCk7CiAjZW5kaWYKIAogc2l6ZV90CXNobV9jdGxtYXggPSBTSE1NQVg7CkBAIC02Myw5ICs2MywxMCBAQAogdm9pZCBfX2luaXQgc2htX2luaXQgKHZvaWQpCiB7CiAJaXBjX2luaXRfaWRzKCZzaG1faWRzLCAxKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN5c3ZpcGMvc2htIiwgMCwgTlVMTCwgc3lzdmlwY19zaG1fcmVhZF9wcm9jLCBOVUxMKTsKLSNlbmRpZgorCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL3NobSIsCisJCQkJIiAgICAgICBrZXkgICAgICBzaG1pZCBwZXJtcyAgICAgICBzaXplICBjcGlkICBscGlkIG5hdHRjaCAgIHVpZCAgIGdpZCAgY3VpZCAgY2dpZCAgICAgIGF0aW1lICAgICAgZHRpbWUgICAgICBjdGltZVxuIiwKKwkJCQkmc2htX2lkcywKKwkJCQlzeXN2aXBjX3NobV9wcm9jX3Nob3cpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzaG1fY2hlY2tpZChzdHJ1Y3Qgc2htaWRfa2VybmVsICpzLCBpbnQgaWQpCkBAIC04NjksNjMgKzg3MCwzMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgc3lzdmlwY19zaG1fcmVhZF9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBzeXN2aXBjX3NobV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlvZmZfdCBwb3MgPSAwOwotCW9mZl90IGJlZ2luID0gMDsKLQlpbnQgaSwgbGVuID0gMDsKKwlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAgPSBpdDsKKwljaGFyICpmb3JtYXQ7CiAKLQlkb3duKCZzaG1faWRzLnNlbSk7Ci0JbGVuICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgIGtleSAgICAgIHNobWlkIHBlcm1zICAgICAgIHNpemUgIGNwaWQgIGxwaWQgbmF0dGNoICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgYXRpbWUgICAgICBkdGltZSAgICAgIGN0aW1lXG4iKTsKLQotCWZvcihpID0gMDsgaSA8PSBzaG1faWRzLm1heF9pZDsgaSsrKSB7Ci0JCXN0cnVjdCBzaG1pZF9rZXJuZWwqIHNocDsKLQotCQlzaHAgPSBzaG1fbG9jayhpKTsKLQkJaWYoc2hwIT1OVUxMKSB7CiAjZGVmaW5lIFNNQUxMX1NUUklORyAiJTEwZCAlMTBkICAlNG8gJTEwdSAlNXUgJTV1ICAlNWQgJTV1ICU1dSAlNXUgJTV1ICUxMGx1ICUxMGx1ICUxMGx1XG4iCiAjZGVmaW5lIEJJR19TVFJJTkcgICAiJTEwZCAlMTBkICAlNG8gJTIxdSAlNXUgJTV1ICAlNWQgJTV1ICU1dSAlNXUgJTV1ICUxMGx1ICUxMGx1ICUxMGx1XG4iCi0JCQljaGFyICpmb3JtYXQ7CiAKLQkJCWlmIChzaXplb2Yoc2l6ZV90KSA8PSBzaXplb2YoaW50KSkKLQkJCQlmb3JtYXQgPSBTTUFMTF9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJZm9ybWF0ID0gQklHX1NUUklORzsKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgZm9ybWF0LAotCQkJCXNocC0+c2htX3Blcm0ua2V5LAotCQkJCXNobV9idWlsZGlkKGksIHNocC0+c2htX3Blcm0uc2VxKSwKLQkJCQlzaHAtPnNobV9mbGFncywKLQkJCQlzaHAtPnNobV9zZWdzeiwKLQkJCQlzaHAtPnNobV9jcHJpZCwKLQkJCQlzaHAtPnNobV9scHJpZCwKLQkJCQlpc19maWxlX2h1Z2VwYWdlcyhzaHAtPnNobV9maWxlKSA/IChmaWxlX2NvdW50KHNocC0+c2htX2ZpbGUpIC0gMSkgOiBzaHAtPnNobV9uYXR0Y2gsCi0JCQkJc2hwLT5zaG1fcGVybS51aWQsCi0JCQkJc2hwLT5zaG1fcGVybS5naWQsCi0JCQkJc2hwLT5zaG1fcGVybS5jdWlkLAotCQkJCXNocC0+c2htX3Blcm0uY2dpZCwKLQkJCQlzaHAtPnNobV9hdGltLAotCQkJCXNocC0+c2htX2R0aW0sCi0JCQkJc2hwLT5zaG1fY3RpbSk7Ci0JCQlzaG1fdW5sb2NrKHNocCk7Ci0KLQkJCXBvcyArPSBsZW47Ci0JCQlpZihwb3MgPCBvZmZzZXQpIHsKLQkJCQlsZW4gPSAwOwotCQkJCWJlZ2luID0gcG9zOwotCQkJfQotCQkJaWYocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQotCQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQkqZW9mID0gMTsKLWRvbmU6Ci0JdXAoJnNobV9pZHMuc2VtKTsKLQkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOwotCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOwotCWlmKGxlbiA+IGxlbmd0aCkKLQkJbGVuID0gbGVuZ3RoOwotCWlmKGxlbiA8IDApCi0JCWxlbiA9IDA7Ci0JcmV0dXJuIGxlbjsKKwlpZiAoc2l6ZW9mKHNpemVfdCkgPD0gc2l6ZW9mKGludCkpCisJCWZvcm1hdCA9IFNNQUxMX1NUUklORzsKKwllbHNlCisJCWZvcm1hdCA9IEJJR19TVFJJTkc7CisJcmV0dXJuIHNlcV9wcmludGYocywgZm9ybWF0LAorCQkJICBzaHAtPnNobV9wZXJtLmtleSwKKwkJCSAgc2hwLT5pZCwKKwkJCSAgc2hwLT5zaG1fZmxhZ3MsCisJCQkgIHNocC0+c2htX3NlZ3N6LAorCQkJICBzaHAtPnNobV9jcHJpZCwKKwkJCSAgc2hwLT5zaG1fbHByaWQsCisJCQkgIGlzX2ZpbGVfaHVnZXBhZ2VzKHNocC0+c2htX2ZpbGUpID8gKGZpbGVfY291bnQoc2hwLT5zaG1fZmlsZSkgLSAxKSA6IHNocC0+c2htX25hdHRjaCwKKwkJCSAgc2hwLT5zaG1fcGVybS51aWQsCisJCQkgIHNocC0+c2htX3Blcm0uZ2lkLAorCQkJICBzaHAtPnNobV9wZXJtLmN1aWQsCisJCQkgIHNocC0+c2htX3Blcm0uY2dpZCwKKwkJCSAgc2hwLT5zaG1fYXRpbSwKKwkJCSAgc2hwLT5zaG1fZHRpbSwKKwkJCSAgc2hwLT5zaG1fY3RpbSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2lwYy91dGlsLmMgYi9pcGMvdXRpbC5jCmluZGV4IGUwMGMzNWYuLjEwZTgzNmQgMTAwNjQ0Ci0tLSBhL2lwYy91dGlsLmMKKysrIGIvaXBjL3V0aWwuYwpAQCAtMjQsMTEgKzI0LDIwIEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAjaW5jbHVkZSAidXRpbC5oIgogCitzdHJ1Y3QgaXBjX3Byb2NfaWZhY2UgeworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgY2hhciAqaGVhZGVyOworCXN0cnVjdCBpcGNfaWRzICppZHM7CisJaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Cit9OworCiAvKioKICAqCWlwY19pbml0CS0JaW5pdGlhbGlzZSBJUEMgc3Vic3lzdGVtCiAgKgpAQCAtODYsNiArOTUsNDMgQEAKIAkJaWRzLT5lbnRyaWVzLT5wW2ldID0gTlVMTDsKIH0KIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXN2aXBjX3Byb2NfZm9wczsKKy8qKgorICoJaXBjX2luaXRfcHJvY19pbnRlcmZhY2UJLSAgQ3JlYXRlIGEgcHJvYyBpbnRlcmZhY2UgZm9yIHN5c2lwYyB0eXBlcworICoJCQkJICAgdXNpbmcgYSBzZXFfZmlsZSBpbnRlcmZhY2UuCisgKglAcGF0aDogUGF0aCBpbiBwcm9jZnMKKyAqCUBoZWFkZXI6IEJhbm5lciB0byBiZSBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKglAaWRzOiBpcGMgaWQgdGFibGUgdG8gaXRlcmF0ZS4KKyAqCUBzaG93OiBzaG93IHJvdXRpbmUuCisgKi8KK3ZvaWQgX19pbml0IGlwY19pbml0X3Byb2NfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmhlYWRlciwKKwkJCQkgICAgc3RydWN0IGlwY19pZHMgKmlkcywKKwkJCQkgICAgaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKikpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CisJc3RydWN0IGlwY19wcm9jX2lmYWNlICppZmFjZTsKKworCWlmYWNlID0ga21hbGxvYyhzaXplb2YoKmlmYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZmFjZSkKKwkJcmV0dXJuOworCWlmYWNlLT5wYXRoCT0gcGF0aDsKKwlpZmFjZS0+aGVhZGVyCT0gaGVhZGVyOworCWlmYWNlLT5pZHMJPSBpZHM7CisJaWZhY2UtPnNob3cJPSBzaG93OworCisJcGRlID0gY3JlYXRlX3Byb2NfZW50cnkocGF0aCwKKwkJCQlTX0lSVUdPLCAgICAgICAgLyogd29ybGQgcmVhZGFibGUgKi8KKwkJCQlOVUxMICAgICAgICAgICAgLyogcGFyZW50IGRpciAqLyk7CisJaWYgKHBkZSkgeworCQlwZGUtPmRhdGEgPSBpZmFjZTsKKwkJcGRlLT5wcm9jX2ZvcHMgPSAmc3lzdmlwY19wcm9jX2ZvcHM7CisJfSBlbHNlIHsKKwkJa2ZyZWUoaWZhY2UpOworCX0KK30KKyNlbmRpZgorCiAvKioKICAqCWlwY19maW5ka2V5CS0JZmluZCBhIGtleSBpbiBhbiBpcGMgaWRlbnRpZmllciBzZXQJCiAgKglAaWRzOiBJZGVudGlmaWVyIHNldApAQCAtNTc4LDMgKzYyNCwxMTMgQEAKIH0KIAogI2VuZGlmIC8qIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKnN5c3ZpcGNfcHJvY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcGNfcHJvY19pZmFjZSAqaWZhY2UgPSBzLT5wcml2YXRlOworCXN0cnVjdCBrZXJuX2lwY19wZXJtICppcGMgPSBpdDsKKwlsb2ZmX3QgcDsKKworCS8qIElmIHdlIGhhZCBhbiBpcGMgaWQgbG9ja2VkIGJlZm9yZSwgdW5sb2NrIGl0ICovCisJaWYgKGlwYyAmJiBpcGMgIT0gU0VRX1NUQVJUX1RPS0VOKQorCQlpcGNfdW5sb2NrKGlwYyk7CisKKwkvKgorCSAqIHAgPSAqcG9zIC0gMSAoYmVjYXVzZSBpZCAwIHN0YXJ0cyBhdCBwb3NpdGlvbiAxKQorCSAqICAgICAgICAgICsgMSAoYmVjYXVzZSB3ZSBpbmNyZW1lbnQgdGhlIHBvc2l0aW9uIGJ5IG9uZSkKKwkgKi8KKwlmb3IgKHAgPSAqcG9zOyBwIDw9IGlmYWNlLT5pZHMtPm1heF9pZDsgcCsrKSB7CisJCWlmICgoaXBjID0gaXBjX2xvY2soaWZhY2UtPmlkcywgcCkpICE9IE5VTEwpIHsKKwkJCSpwb3MgPSBwICsgMTsKKwkJCXJldHVybiBpcGM7CisJCX0KKwl9CisKKwkvKiBPdXQgb2YgcmFuZ2UgLSByZXR1cm4gTlVMTCB0byB0ZXJtaW5hdGUgaXRlcmF0aW9uICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGaWxlIHBvc2l0aW9uczogcG9zIDAgLT4gaGVhZGVyLCBwb3MgbiAtPiBpcGMgaWQgKyAxLgorICogU2VxRmlsZSBpdGVyYXRvcjogaXRlcmF0b3IgdmFsdWUgbG9ja2VkIHNocCBvciBTRVFfVE9LRU5fU1RBUlQuCisgKi8KK3N0YXRpYyB2b2lkICpzeXN2aXBjX3Byb2Nfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBjX3Byb2NfaWZhY2UgKmlmYWNlID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjOworCWxvZmZfdCBwOworCisJLyoKKwkgKiBUYWtlIHRoZSBsb2NrIC0gdGhpcyB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCisJICogY2FsbCB0byBzdG9wKCkuCisJICovCisJZG93bigmaWZhY2UtPmlkcy0+c2VtKTsKKworCS8qIHBvcyA8IDAgaXMgaW52YWxpZCAqLworCWlmICgqcG9zIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBwb3MgPT0gMCBtZWFucyBoZWFkZXIgKi8KKwlpZiAoKnBvcyA9PSAwKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCisJLyogRmluZCB0aGUgKHBvcy0xKXRoIGlwYyAqLworCWZvciAocCA9ICpwb3MgLSAxOyBwIDw9IGlmYWNlLT5pZHMtPm1heF9pZDsgcCsrKSB7CisJCWlmICgoaXBjID0gaXBjX2xvY2soaWZhY2UtPmlkcywgcCkpICE9IE5VTEwpIHsKKwkJCSpwb3MgPSBwICsgMTsKKwkJCXJldHVybiBpcGM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3ZpcGNfcHJvY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpCit7CisJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwYyA9IGl0OworCXN0cnVjdCBpcGNfcHJvY19pZmFjZSAqaWZhY2UgPSBzLT5wcml2YXRlOworCisJLyogSWYgd2UgaGFkIGEgbG9ja2VkIHNlZ21lbnQsIHJlbGVhc2UgaXQgKi8KKwlpZiAoaXBjICYmIGlwYyAhPSBTRVFfU1RBUlRfVE9LRU4pCisJCWlwY191bmxvY2soaXBjKTsKKworCS8qIFJlbGVhc2UgdGhlIGxvY2sgd2UgdG9vayBpbiBzdGFydCgpICovCisJdXAoJmlmYWNlLT5pZHMtPnNlbSk7Cit9CisKK3N0YXRpYyBpbnQgc3lzdmlwY19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKK3sKKwlzdHJ1Y3QgaXBjX3Byb2NfaWZhY2UgKmlmYWNlID0gcy0+cHJpdmF0ZTsKKworCWlmIChpdCA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBzZXFfcHV0cyhzLCBpZmFjZS0+aGVhZGVyKTsKKworCXJldHVybiBpZmFjZS0+c2hvdyhzLCBpdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc3lzdmlwY19wcm9jX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBzeXN2aXBjX3Byb2Nfc3RhcnQsCisJLnN0b3AgID0gc3lzdmlwY19wcm9jX3N0b3AsCisJLm5leHQgID0gc3lzdmlwY19wcm9jX25leHQsCisJLnNob3cgID0gc3lzdmlwY19wcm9jX3Nob3csCit9OworCitzdGF0aWMgaW50IHN5c3ZpcGNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKSB7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZzeXN2aXBjX3Byb2Nfc2Vxb3BzKTsKKwlpZiAoIXJldCkgeworCQlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXNlcS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c3ZpcGNfcHJvY19mb3BzID0geworCS5vcGVuICAgID0gc3lzdmlwY19wcm9jX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggNDQzNDhjYS4uZmM5YTI4YiAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC0zMCw3ICszMCwxNSBAQAogCXN0cnVjdCBpcGNfaWRfYXJ5KiBlbnRyaWVzOwogfTsKIAorc3RydWN0IHNlcV9maWxlOwogdm9pZCBfX2luaXQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzKiBpZHMsIGludCBzaXplKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBfX2luaXQgaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqaGVhZGVyLAorCQkJCSAgICBzdHJ1Y3QgaXBjX2lkcyAqaWRzLAorCQkJCSAgICBpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSk7CisjZWxzZQorI2RlZmluZSBpcGNfaW5pdF9wcm9jX2ludGVyZmFjZShwYXRoLCBoZWFkZXIsIGlkcywgc2hvdykgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKIAogLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBpZHMtPnNlbSBhY3F1aXJlZC4qLwogaW50IGlwY19maW5ka2V5KHN0cnVjdCBpcGNfaWRzKiBpZHMsIGtleV90IGtleSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2IwNWNkMC4uZmY0ZGMwMiAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBAQAogb2JqLSQoQ09ORklHX0ZVVEVYKSArPSBmdXRleC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19JU0FfRE1BKSArPSBkbWEubwogb2JqLSQoQ09ORklHX1NNUCkgKz0gY3B1Lm8gc3BpbmxvY2subworb2JqLSQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSArPSBzcGlubG9jay5vCiBvYmotJChDT05GSUdfVUlEMTYpICs9IHVpZDE2Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubwogb2JqLSQoQ09ORklHX0tBTExTWU1TKSArPSBrYWxsc3ltcy5vCkBAIC0yNyw2ICsyOCw3IEBACiBvYmotJChDT05GSUdfQVVESVRTWVNDQUxMKSArPSBhdWRpdHNjLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KIG9iai0kKENPTkZJR19TWVNGUykgKz0ga3N5c2ZzLm8KK29iai0kKENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCkgKz0gc29mdGxvY2t1cC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19IQVJESVJRUykgKz0gaXJxLwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApICs9IGNyYXNoX2R1bXAubwogb2JqLSQoQ09ORklHX1NFQ0NPTVApICs9IHNlY2NvbXAubwpkaWZmIC0tZ2l0IGEva2VybmVsL2FjY3QuYyBiL2tlcm5lbC9hY2N0LmMKaW5kZXggNDE2OGY2My4uYjc1NmY1MiAxMDA2NDQKLS0tIGEva2VybmVsL2FjY3QuYworKysgYi9rZXJuZWwvYWNjdC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIH0KIAogLyoKLSAqIENsb3NlIHRoZSBvbGQgYWNjb3V0aW5nIGZpbGUgKGlmIGN1cnJlbnRseSBvcGVuKSBhbmQgdGhlbiByZXBsYWNlCisgKiBDbG9zZSB0aGUgb2xkIGFjY291bnRpbmcgZmlsZSAoaWYgY3VycmVudGx5IG9wZW4pIGFuZCB0aGVuIHJlcGxhY2UKICAqIGl0IHdpdGggZmlsZSAoaWYgbm9uLU5VTEwpLgogICoKICAqIE5PVEU6IGFjY3RfZ2xvYmFscy5sb2NrIE1VU1QgYmUgaGVsZCBvbiBlbnRyeSBhbmQgZXhpdC4KQEAgLTE5OSwxMSArMTk5LDE2IEBACiAJfQogfQogCi0vKgotICogIHN5c19hY2N0KCkgaXMgdGhlIG9ubHkgc3lzdGVtIGNhbGwgbmVlZGVkIHRvIGltcGxlbWVudCBwcm9jZXNzCi0gKiAgYWNjb3VudGluZy4gSXQgdGFrZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgYWNjb3VudGluZyByZWNvcmRzCi0gKiAgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIHRoZSBmaWxlbmFtZSBpcyBOVUxMLCBhY2NvdW50aW5nIHdpbGwgYmUKLSAqICBzaHV0ZG93bi4KKy8qKgorICogc3lzX2FjY3QgLSBlbmFibGUvZGlzYWJsZSBwcm9jZXNzIGFjY291bnRpbmcKKyAqIEBuYW1lOiBmaWxlIG5hbWUgZm9yIGFjY291bnRpbmcgcmVjb3JkcyBvciBOVUxMIHRvIHNodXRkb3duIGFjY291bnRpbmcKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJybm8gdmFsdWVzIGZvciBmYWlsdXJlLgorICoKKyAqIHN5c19hY2N0KCkgaXMgdGhlIG9ubHkgc3lzdGVtIGNhbGwgbmVlZGVkIHRvIGltcGxlbWVudCBwcm9jZXNzCisgKiBhY2NvdW50aW5nLiBJdCB0YWtlcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSBhY2NvdW50aW5nIHJlY29yZHMKKyAqIHNob3VsZCBiZSB3cml0dGVuLiBJZiB0aGUgZmlsZW5hbWUgaXMgTlVMTCwgYWNjb3VudGluZyB3aWxsIGJlCisgKiBzaHV0ZG93bi4KICAqLwogYXNtbGlua2FnZSBsb25nIHN5c19hY2N0KGNvbnN0IGNoYXIgX191c2VyICpuYW1lKQogewpAQCAtMjIwLDcgKzIyNSw3IEBACiAJCQlyZXR1cm4gKFBUUl9FUlIodG1wKSk7CiAJCX0KIAkJLyogRGlmZmVyZW5jZSBmcm9tIEJTRCAtIHRoZXkgZG9uJ3QgZG8gT19BUFBFTkQgKi8KLQkJZmlsZSA9IGZpbHBfb3Blbih0bXAsIE9fV1JPTkxZfE9fQVBQRU5ELCAwKTsKKwkJZmlsZSA9IGZpbHBfb3Blbih0bXAsIE9fV1JPTkxZfE9fQVBQRU5EfE9fTEFSR0VGSUxFLCAwKTsKIAkJcHV0bmFtZSh0bXApOwogCQlpZiAoSVNfRVJSKGZpbGUpKSB7CiAJCQlyZXR1cm4gKFBUUl9FUlIoZmlsZSkpOwpAQCAtMjUwLDkgKzI1NSwxMiBAQAogCXJldHVybiAoMCk7CiB9CiAKLS8qCi0gKiBJZiB0aGUgYWNjb3V0aW5nIGlzIHR1cm5lZCBvbiBmb3IgYSBmaWxlIGluIHRoZSBmaWxlc3lzdGVtIHBvaW50ZWQKLSAqIHRvIGJ5IHNiLCB0dXJuIGFjY291dGluZyBvZmYuCisvKioKKyAqIGFjY3RfYXV0b19jbG9zZSAtIHR1cm4gb2ZmIGEgZmlsZXN5c3RlbSdzIGFjY291bnRpbmcgaWYgaXQgaXMgb24KKyAqIEBzYjogc3VwZXIgYmxvY2sgZm9yIHRoZSBmaWxlc3lzdGVtCisgKgorICogSWYgdGhlIGFjY291bnRpbmcgaXMgdHVybmVkIG9uIGZvciBhIGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0gcG9pbnRlZAorICogdG8gYnkgc2IsIHR1cm4gYWNjb3VudGluZyBvZmYuCiAgKi8KIHZvaWQgYWNjdF9hdXRvX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC01MDMsOCArNTExLDExIEBACiAJc2V0X2ZzKGZzKTsKIH0KIAotLyoKKy8qKgogICogYWNjdF9wcm9jZXNzIC0gbm93IGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBkb19hY2N0X3Byb2Nlc3MKKyAqIEBleGl0Y29kZTogdGFzayBleGl0IGNvZGUKKyAqCisgKiBoYW5kbGVzIHByb2Nlc3MgYWNjb3VudGluZyBmb3IgYW4gZXhpdGluZyB0YXNrCiAgKi8KIHZvaWQgYWNjdF9wcm9jZXNzKGxvbmcgZXhpdGNvZGUpCiB7CkBAIC01MzAsOSArNTQxLDkgQEAKIH0KIAogCi0vKgotICogYWNjdF91cGRhdGVfaW50ZWdyYWxzCi0gKiAgICAtICB1cGRhdGUgbW0gaW50ZWdyYWwgZmllbGRzIGluIHRhc2tfc3RydWN0CisvKioKKyAqIGFjY3RfdXBkYXRlX2ludGVncmFscyAtIHVwZGF0ZSBtbSBpbnRlZ3JhbCBmaWVsZHMgaW4gdGFza19zdHJ1Y3QKKyAqIEB0c2s6IHRhc2tfc3RydWN0IGZvciBhY2NvdW50aW5nCiAgKi8KIHZvaWQgYWNjdF91cGRhdGVfaW50ZWdyYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtNTQ3LDkgKzU1OCw5IEBACiAJfQogfQogCi0vKgotICogYWNjdF9jbGVhcl9pbnRlZ3JhbHMKLSAqICAgIC0gY2xlYXIgdGhlIG1tIGludGVncmFsIGZpZWxkcyBpbiB0YXNrX3N0cnVjdAorLyoqCisgKiBhY2N0X2NsZWFyX2ludGVncmFscyAtIGNsZWFyIHRoZSBtbSBpbnRlZ3JhbCBmaWVsZHMgaW4gdGFza19zdHJ1Y3QKKyAqIEB0c2s6IHRhc2tfc3RydWN0IHdob3NlIGFjY291bnRpbmcgZmllbGRzIGFyZSBjbGVhcmVkCiAgKi8KIHZvaWQgYWNjdF9jbGVhcl9pbnRlZ3JhbHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggZGRmY2FhYS4uMTAyMjk2ZSAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtNDgsOCArNDgsNyBAQAogCWlmICghdGltZV9hZnRlcihleHBpcmUsIG5vdykpCiAJCXJldHVybiAwOwogCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dChleHBpcmUgLSBub3cpOworCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUgLSBub3cpOwogCWlmIChleHBpcmUgPT0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTgyLDggKzgxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlleHBpcmUgPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0KSArICh0LnR2X3NlYyB8fCB0LnR2X25zZWMpOwotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXQoZXhwaXJlKTsKKwlleHBpcmUgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZXhwaXJlKTsKIAlpZiAoZXhwaXJlID09IDApCiAJCXJldHVybiAwOwogCkBAIC03OTUsOCArNzkzLDcgQEAKIAkJCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAogCQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCQlzaWcgPSBkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmcywgJmluZm8pOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDhhYjFiNGUuLjQwN2I1ZjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTE4Miw2ICsxODIsMzcgQEAKIHN0YXRpYyBERUNMQVJFX01VVEVYKGNwdXNldF9zZW0pOwogCiAvKgorICogVGhlIGdsb2JhbCBjcHVzZXQgc2VtYXBob3JlIGNwdXNldF9zZW0gY2FuIGJlIG5lZWRlZCBieSB0aGUKKyAqIG1lbW9yeSBhbGxvY2F0b3IgdG8gdXBkYXRlIGEgdGFza3MgbWVtc19hbGxvd2VkIChzZWUgdGhlIGNhbGxzCisgKiB0byBjcHVzZXRfdXBkYXRlX2N1cnJlbnRfbWVtc19hbGxvd2VkKCkpIG9yIHRvIHdhbGsgdXAgdGhlCisgKiBjcHVzZXQgaGllcmFyY2h5IHRvIGZpbmQgYSBtZW1fZXhjbHVzaXZlIGNwdXNldCBzZWUgdGhlIGNhbGxzCisgKiB0byBjcHVzZXRfZXhjbF9ub2Rlc19vdmVybGFwKCkpLgorICoKKyAqIEJ1dCBpZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaXMgYmVpbmcgZG9uZSBieSBjcHVzZXQuYyBjb2RlLCBpdAorICogdXN1YWxseSBhbHJlYWR5IGhvbGRzIGNwdXNldF9zZW0uICBEb3VibGUgdHJpcHBpbmcgb24gYSBrZXJuZWwKKyAqIHNlbWFwaG9yZSBkZWFkbG9ja3MgdGhlIGN1cnJlbnQgdGFzaywgYW5kIGFueSBvdGhlciB0YXNrIHRoYXQKKyAqIHN1YnNlcXVlbnRseSB0cmllcyB0byBvYnRhaW4gdGhlIGxvY2suCisgKgorICogUnVuIGFsbCB1cCdzIGFuZCBkb3duJ3Mgb24gY3B1c2V0X3NlbSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKyAqIHdyYXBwZXJzLCB3aGljaCB3aWxsIGRldGVjdCB0aGlzIG5lc3RlZCBsb2NraW5nLCBhbmQgYXZvaWQKKyAqIGRlYWRsb2NraW5nLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfZG93bihzdHJ1Y3Qgc2VtYXBob3JlICpwc2VtKQoreworCWlmIChjdXJyZW50LT5jcHVzZXRfc2VtX25lc3RfZGVwdGggPT0gMCkKKwkJZG93bihwc2VtKTsKKwljdXJyZW50LT5jcHVzZXRfc2VtX25lc3RfZGVwdGgrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF91cChzdHJ1Y3Qgc2VtYXBob3JlICpwc2VtKQoreworCWN1cnJlbnQtPmNwdXNldF9zZW1fbmVzdF9kZXB0aC0tOworCWlmIChjdXJyZW50LT5jcHVzZXRfc2VtX25lc3RfZGVwdGggPT0gMCkKKwkJdXAocHNlbSk7Cit9CisKKy8qCiAgKiBBIGNvdXBsZSBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucyByZXF1aXJlZCwgZHVlIHRvIGN5Y2xpYyByZWZlcmVuY2UgbG9vcDoKICAqICBjcHVzZXRfbWtkaXIgLT4gY3B1c2V0X2NyZWF0ZSAtPiBjcHVzZXRfcG9wdWxhdGVfZGlyIC0+IGNwdXNldF9hZGRfZmlsZQogICogIC0+IGNwdXNldF9jcmVhdGVfZmlsZSAtPiBjcHVzZXRfZGlyX2lub2RlX29wZXJhdGlvbnMgLT4gY3B1c2V0X21rZGlyLgpAQCAtNTIyLDE5ICs1NTMsMTAgQEAKICAqIFJlZnJlc2ggY3VycmVudCB0YXNrcyBtZW1zX2FsbG93ZWQgYW5kIG1lbXNfZ2VuZXJhdGlvbiBmcm9tCiAgKiBjdXJyZW50IHRhc2tzIGNwdXNldC4gIENhbGwgd2l0aCBjcHVzZXRfc2VtIGhlbGQuCiAgKgotICogQmUgc3VyZSB0byBjYWxsIHJlZnJlc2hfbWVtcygpIG9uIGFueSBjcHVzZXQgb3BlcmF0aW9uIHdoaWNoCi0gKiAoMSkgaG9sZHMgY3B1c2V0X3NlbSwgYW5kICgyKSBtaWdodCBwb3NzaWJseSBhbGxvYyBtZW1vcnkuCi0gKiBDYWxsIGFmdGVyIG9idGFpbmluZyBjcHVzZXRfc2VtIGxvY2ssIGJlZm9yZSBhbnkgcG9zc2libGUKLSAqIGFsbG9jYXRpb24uICBPdGhlcndpc2Ugb25lIHJpc2tzIHRyeWluZyB0byBhbGxvY2F0ZSBtZW1vcnkKLSAqIHdoaWxlIHRoZSB0YXNrIGNwdXNldF9tZW1zX2dlbmVyYXRpb24gaXMgbm90IHRoZSBzYW1lIGFzCi0gKiB0aGUgbWVtc19nZW5lcmF0aW9uIGluIGl0cyBjcHVzZXQsIHdoaWNoIHdvdWxkIGRlYWRsb2NrIG9uCi0gKiBjcHVzZXRfc2VtIGluIGNwdXNldF91cGRhdGVfY3VycmVudF9tZW1zX2FsbG93ZWQoKS4KLSAqCi0gKiBTaW5jZSB3ZSBob2xkIGNwdXNldF9zZW0sIG9uY2UgcmVmcmVzaF9tZW1zKCkgaXMgY2FsbGVkLCB0aGUKLSAqIHRlc3QgKGN1cnJlbnQtPmNwdXNldF9tZW1zX2dlbmVyYXRpb24gIT0gY3MtPm1lbXNfZ2VuZXJhdGlvbikKLSAqIGluIGNwdXNldF91cGRhdGVfY3VycmVudF9tZW1zX2FsbG93ZWQoKSB3aWxsIHJlbWFpbiBmYWxzZSwKLSAqIHVudGlsIHdlIGRyb3AgY3B1c2V0X3NlbS4gIEFueW9uZSBlbHNlIHdobyB3b3VsZCBjaGFuZ2Ugb3VyCi0gKiBjcHVzZXRzIG1lbXNfZ2VuZXJhdGlvbiBuZWVkcyB0byBsb2NrIGNwdXNldF9zZW0gZmlyc3QuCisgKiBUaGlzIHJvdXRpbmUgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgcGVyLXRhc2sgbWVtc19hbGxvd2VkCisgKiBkYXRhLCB3aXRoaW4gdGhlIHRhc2tzIGNvbnRleHQsIHdoZW4gaXQgaXMgdHJ5aW5nIHRvIGFsbG9jYXRlCisgKiBtZW1vcnkgKGluIHZhcmlvdXMgbW0vbWVtcG9saWN5LmMgcm91dGluZXMpIGFuZCBub3RpY2VzCisgKiB0aGF0IHNvbWUgb3RoZXIgdGFzayBoYXMgYmVlbiBtb2RpZnlpbmcgaXRzIGNwdXNldC4KICAqLwogCiBzdGF0aWMgdm9pZCByZWZyZXNoX21lbXModm9pZCkKQEAgLTYyOCwxMyArNjUwLDYgQEAKICAqIGxvY2tfY3B1X2hvdHBsdWcoKS91bmxvY2tfY3B1X2hvdHBsdWcoKSBwYWlyLgogICovCiAKLS8qCi0gKiBIYWNrIHRvIGF2b2lkIDIuNi4xMyBwYXJ0aWFsIG5vZGUgZHluYW1pYyBzY2hlZCBkb21haW4gYnVnLgotICogRGlzYWJsZSBsZXR0aW5nICdjcHVfZXhjbHVzaXZlJyBjcHVzZXRzIGRlZmluZSBkeW5hbWljIHNjaGVkCi0gKiBkb21haW5zLCB1bnRpbCB0aGUgc2NoZWQgZG9tYWluIGNhbiBoYW5kbGUgcGFydGlhbCBub2Rlcy4KLSAqIFJlbW92ZSB0aGlzICNpZiBoYWNrZXJ5IHdoZW4gc2NoZWQgZG9tYWlucyBmaXhlZC4KLSAqLwotI2lmIDAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVfZG9tYWlucyhzdHJ1Y3QgY3B1c2V0ICpjdXIpCiB7CiAJc3RydWN0IGNwdXNldCAqYywgKnBhciA9IGN1ci0+cGFyZW50OwpAQCAtNjc1LDExICs2OTAsNiBAQAogCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCZwc3BhbiwgJmNzcGFuKTsKIAl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0KLSNlbHNlCi1zdGF0aWMgdm9pZCB1cGRhdGVfY3B1X2RvbWFpbnMoc3RydWN0IGNwdXNldCAqY3VyKQotewotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdXBkYXRlX2NwdW1hc2soc3RydWN0IGNwdXNldCAqY3MsIGNoYXIgKmJ1ZikKIHsKQEAgLTg1Miw3ICs4NjIsNyBAQAogCX0KIAlidWZmZXJbbmJ5dGVzXSA9IDA7CS8qIG51bC10ZXJtaW5hdGUgKi8KIAotCWRvd24oJmNwdXNldF9zZW0pOworCWNwdXNldF9kb3duKCZjcHVzZXRfc2VtKTsKIAogCWlmIChpc19yZW1vdmVkKGNzKSkgewogCQlyZXR2YWwgPSAtRU5PREVWOwpAQCAtODg2LDcgKzg5Niw3IEBACiAJaWYgKHJldHZhbCA9PSAwKQogCQlyZXR2YWwgPSBuYnl0ZXM7CiBvdXQyOgotCXVwKCZjcHVzZXRfc2VtKTsKKwljcHVzZXRfdXAoJmNwdXNldF9zZW0pOwogCWNwdXNldF9yZWxlYXNlX2FnZW50KHBhdGhidWYpOwogb3V0MToKIAlrZnJlZShidWZmZXIpOwpAQCAtOTI2LDkgKzkzNiw5IEBACiB7CiAJY3B1bWFza190IG1hc2s7CiAKLQlkb3duKCZjcHVzZXRfc2VtKTsKKwljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJbWFzayA9IGNzLT5jcHVzX2FsbG93ZWQ7Ci0JdXAoJmNwdXNldF9zZW0pOworCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAKIAlyZXR1cm4gY3B1bGlzdF9zY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCBtYXNrKTsKIH0KQEAgLTkzNyw5ICs5NDcsOSBAQAogewogCW5vZGVtYXNrX3QgbWFzazsKIAotCWRvd24oJmNwdXNldF9zZW0pOworCWNwdXNldF9kb3duKCZjcHVzZXRfc2VtKTsKIAltYXNrID0gY3MtPm1lbXNfYWxsb3dlZDsKLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAogCXJldHVybiBub2RlbGlzdF9zY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCBtYXNrKTsKIH0KQEAgLTk4NCw2ICs5OTQsMTAgQEAKIAkqcysrID0gJ1xuJzsKIAkqcyA9ICdcMCc7CiAKKwkvKiBEbyBub3RoaW5nIGlmICpwcG9zIGlzIGF0IHRoZSBlb2Ygb3IgYmV5b25kIHRoZSBlb2YuICovCisJaWYgKHMgLSBwYWdlIDw9ICpwcG9zKQorCQlyZXR1cm4gMDsKKwogCXN0YXJ0ID0gcGFnZSArICpwcG9zOwogCW4gPSBzIC0gc3RhcnQ7CiAJcmV0dmFsID0gbiAtIGNvcHlfdG9fdXNlcihidWYsIHN0YXJ0LCBtaW4obiwgbmJ5dGVzKSk7CkBAIC0xMzQyLDggKzEzNTYsNyBAQAogCWlmICghY3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmY3B1c2V0X3NlbSk7Ci0JcmVmcmVzaF9tZW1zKCk7CisJY3B1c2V0X2Rvd24oJmNwdXNldF9zZW0pOwogCWNzLT5mbGFncyA9IDA7CiAJaWYgKG5vdGlmeV9vbl9yZWxlYXNlKHBhcmVudCkpCiAJCXNldF9iaXQoQ1NfTk9USUZZX09OX1JFTEVBU0UsICZjcy0+ZmxhZ3MpOwpAQCAtMTM2OCwxNCArMTM4MSwxNCBAQAogCSAqIHdpbGwgZG93bigpIHRoaXMgbmV3IGRpcmVjdG9yeSdzIGlfc2VtIGFuZCBpZiB3ZSByYWNlIHdpdGgKIAkgKiBhbm90aGVyIG1rZGlyLCB3ZSBtaWdodCBkZWFkbG9jay4KIAkgKi8KLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAogCWVyciA9IGNwdXNldF9wb3B1bGF0ZV9kaXIoY3MtPmRlbnRyeSk7CiAJLyogSWYgZXJyIDwgMCwgd2UgaGF2ZSBhIGhhbGYtZmlsbGVkIGRpcmVjdG9yeSAtIG9oIHdlbGwgOykgKi8KIAlyZXR1cm4gMDsKIGVycjoKIAlsaXN0X2RlbCgmY3MtPnNpYmxpbmcpOwotCXVwKCZjcHVzZXRfc2VtKTsKKwljcHVzZXRfdXAoJmNwdXNldF9zZW0pOwogCWtmcmVlKGNzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTM5NywxNCArMTQxMCwxMyBAQAogCiAJLyogdGhlIHZmcyBob2xkcyBib3RoIGlub2RlLT5pX3NlbSBhbHJlYWR5ICovCiAKLQlkb3duKCZjcHVzZXRfc2VtKTsKLQlyZWZyZXNoX21lbXMoKTsKKwljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJaWYgKGF0b21pY19yZWFkKCZjcy0+Y291bnQpID4gMCkgewotCQl1cCgmY3B1c2V0X3NlbSk7CisJCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWlmICghbGlzdF9lbXB0eSgmY3MtPmNoaWxkcmVuKSkgewotCQl1cCgmY3B1c2V0X3NlbSk7CisJCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXBhcmVudCA9IGNzLT5wYXJlbnQ7CkBAIC0xNDIwLDcgKzE0MzIsNyBAQAogCXNwaW5fdW5sb2NrKCZkLT5kX2xvY2spOwogCWNwdXNldF9kX3JlbW92ZV9kaXIoZCk7CiAJZHB1dChkKTsKLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAljcHVzZXRfcmVsZWFzZV9hZ2VudChwYXRoYnVmKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjMsMTAgKzE1MzUsMTAgQEAKIAlpZiAobm90aWZ5X29uX3JlbGVhc2UoY3MpKSB7CiAJCWNoYXIgKnBhdGhidWYgPSBOVUxMOwogCi0JCWRvd24oJmNwdXNldF9zZW0pOworCQljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjcy0+Y291bnQpKQogCQkJY2hlY2tfZm9yX3JlbGVhc2UoY3MsICZwYXRoYnVmKTsKLQkJdXAoJmNwdXNldF9zZW0pOworCQljcHVzZXRfdXAoJmNwdXNldF9zZW0pOwogCQljcHVzZXRfcmVsZWFzZV9hZ2VudChwYXRoYnVmKTsKIAl9IGVsc2UgewogCQlhdG9taWNfZGVjKCZjcy0+Y291bnQpOwpAQCAtMTU0NywxMSArMTU1OSwxMSBAQAogewogCWNwdW1hc2tfdCBtYXNrOwogCi0JZG93bigmY3B1c2V0X3NlbSk7CisJY3B1c2V0X2Rvd24oJmNwdXNldF9zZW0pOwogCXRhc2tfbG9jaygoc3RydWN0IHRhc2tfc3RydWN0ICopdHNrKTsKIAlndWFyYW50ZWVfb25saW5lX2NwdXModHNrLT5jcHVzZXQsICZtYXNrKTsKIAl0YXNrX3VubG9jaygoc3RydWN0IHRhc2tfc3RydWN0ICopdHNrKTsKLQl1cCgmY3B1c2V0X3NlbSk7CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKIAogCXJldHVybiBtYXNrOwogfQpAQCAtMTU3Niw5ICsxNTg4LDkgQEAKIAlpZiAoIWNzKQogCQlyZXR1cm47CQkvKiB0YXNrIGlzIGV4aXRpbmcgKi8KIAlpZiAoY3VycmVudC0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbiAhPSBjcy0+bWVtc19nZW5lcmF0aW9uKSB7Ci0JCWRvd24oJmNwdXNldF9zZW0pOworCQljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CiAJCXJlZnJlc2hfbWVtcygpOwotCQl1cCgmY3B1c2V0X3NlbSk7CisJCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJfQogfQogCkBAIC0xNjExLDE3ICsxNjIzLDExNCBAQAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIGNwdXNldF96b25lX2FsbG93ZWQgLSBpcyB6b25lIHogYWxsb3dlZCBpbiBjdXJyZW50LT5tZW1zX2FsbG93ZWQKLSAqIEB6OiB6b25lIGluIHF1ZXN0aW9uCi0gKgotICogSXMgem9uZSB6IGFsbG93ZWQgaW4gY3VycmVudC0+bWVtc19hbGxvd2VkLCBvciBpcwotICogdGhlIENQVSBpbiBpbnRlcnJ1cHQgY29udGV4dD8gKHpvbmUgaXMgYWx3YXlzIGFsbG93ZWQgaW4gdGhpcyBjYXNlKQorLyoKKyAqIG5lYXJlc3RfZXhjbHVzaXZlX2FuY2VzdG9yKCkgLSBSZXR1cm5zIHRoZSBuZWFyZXN0IG1lbV9leGNsdXNpdmUKKyAqIGFuY2VzdG9yIHRvIHRoZSBzcGVjaWZpZWQgY3B1c2V0LiAgQ2FsbCB3aGlsZSBob2xkaW5nIGNwdXNldF9zZW0uCisgKiBJZiBubyBhbmNlc3RvciBpcyBtZW1fZXhjbHVzaXZlIChhbiB1bnVzdWFsIGNvbmZpZ3VyYXRpb24pLCB0aGVuCisgKiByZXR1cm5zIHRoZSByb290IGNwdXNldC4KICAqLwotaW50IGNwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnopCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdXNldCAqbmVhcmVzdF9leGNsdXNpdmVfYW5jZXN0b3IoY29uc3Qgc3RydWN0IGNwdXNldCAqY3MpCiB7Ci0JcmV0dXJuIGluX2ludGVycnVwdCgpIHx8Ci0JCW5vZGVfaXNzZXQoei0+em9uZV9wZ2RhdC0+bm9kZV9pZCwgY3VycmVudC0+bWVtc19hbGxvd2VkKTsKKwl3aGlsZSAoIWlzX21lbV9leGNsdXNpdmUoY3MpICYmIGNzLT5wYXJlbnQpCisJCWNzID0gY3MtPnBhcmVudDsKKwlyZXR1cm4gY3M7Cit9CisKKy8qKgorICogY3B1c2V0X3pvbmVfYWxsb3dlZCAtIENhbiB3ZSBhbGxvY2F0ZSBtZW1vcnkgb24gem9uZSB6J3MgbWVtb3J5IG5vZGU/CisgKiBAejogaXMgdGhpcyB6b25lIG9uIGFuIGFsbG93ZWQgbm9kZT8KKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgKHdlIHVzZSBfX0dGUF9IQVJEV0FMTCkKKyAqCisgKiBJZiB3ZSdyZSBpbiBpbnRlcnJ1cHQsIHllcywgd2UgY2FuIGFsd2F5cyBhbGxvY2F0ZS4gIElmIHpvbmUKKyAqIHoncyBub2RlIGlzIGluIG91ciB0YXNrcyBtZW1zX2FsbG93ZWQsIHllcy4gIElmIGl0J3Mgbm90IGEKKyAqIF9fR0ZQX0hBUkRXQUxMIHJlcXVlc3QgYW5kIHRoaXMgem9uZSdzIG5vZGVzIGlzIGluIHRoZSBuZWFyZXN0CisgKiBtZW1fZXhjbHVzaXZlIGNwdXNldCBhbmNlc3RvciB0byB0aGlzIHRhc2tzIGNwdXNldCwgeWVzLgorICogT3RoZXJ3aXNlLCBuby4KKyAqCisgKiBHRlBfVVNFUiBhbGxvY2F0aW9ucyBhcmUgbWFya2VkIHdpdGggdGhlIF9fR0ZQX0hBUkRXQUxMIGJpdCwKKyAqIGFuZCBkbyBub3QgYWxsb3cgYWxsb2NhdGlvbnMgb3V0c2lkZSB0aGUgY3VycmVudCB0YXNrcyBjcHVzZXQuCisgKiBHRlBfS0VSTkVMIGFsbG9jYXRpb25zIGFyZSBub3Qgc28gbWFya2VkLCBzbyBjYW4gZXNjYXBlIHRvIHRoZQorICogbmVhcmVzdCBtZW1fZXhjbHVzaXZlIGFuY2VzdG9yIGNwdXNldC4KKyAqCisgKiBTY2FubmluZyB1cCBwYXJlbnQgY3B1c2V0cyByZXF1aXJlcyBjcHVzZXRfc2VtLiAgVGhlIF9fYWxsb2NfcGFnZXMoKQorICogcm91dGluZSBvbmx5IGNhbGxzIGhlcmUgd2l0aCBfX0dGUF9IQVJEV0FMTCBiaXQgX25vdF8gc2V0IGlmCisgKiBpdCdzIGEgR0ZQX0tFUk5FTCBhbGxvY2F0aW9uLCBhbmQgYWxsIG5vZGVzIGluIHRoZSBjdXJyZW50IHRhc2tzCisgKiBtZW1zX2FsbG93ZWQgY2FtZSB1cCBlbXB0eSBvbiB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSB6b25lbGlzdC4KKyAqIFNvIG9ubHkgR0ZQX0tFUk5FTCBhbGxvY2F0aW9ucywgaWYgYWxsIG5vZGVzIGluIHRoZSBjcHVzZXQgYXJlCisgKiBzaG9ydCBvZiBtZW1vcnksIG1pZ2h0IHJlcXVpcmUgdGFraW5nIHRoZSBjcHVzZXRfc2VtIHNlbWFwaG9yZS4KKyAqCisgKiBUaGUgZmlyc3QgbG9vcCBvdmVyIHRoZSB6b25lbGlzdCBpbiBtbS9wYWdlX2FsbG9jLmM6X19hbGxvY19wYWdlcygpCisgKiBjYWxscyBoZXJlIHdpdGggX19HRlBfSEFSRFdBTEwgYWx3YXlzIHNldCBpbiBnZnBfbWFzaywgZW5mb3JjaW5nCisgKiBoYXJkd2FsbCBjcHVzZXRzIC0gbm8gYWxsb2NhdGlvbiBvbiBhIG5vZGUgb3V0c2lkZSB0aGUgY3B1c2V0IGlzCisgKiBhbGxvd2VkICh1bmxlc3MgaW4gaW50ZXJydXB0LCBvZiBjb3Vyc2UpLgorICoKKyAqIFRoZSBzZWNvbmQgbG9vcCBkb2Vzbid0IGV2ZW4gY2FsbCBoZXJlIGZvciBHRlBfQVRPTUlDIHJlcXVlc3RzCisgKiAoaWYgdGhlIF9fYWxsb2NfcGFnZXMoKSBsb2NhbCB2YXJpYWJsZSAnd2FpdCcgaXMgc2V0KS4gIFRoYXQgY2hlY2sKKyAqIGFuZCB0aGUgY2hlY2tzIGJlbG93IGhhdmUgdGhlIGNvbWJpbmVkIGFmZmVjdCBpbiB0aGUgc2Vjb25kIGxvb3Agb2YKKyAqIHRoZSBfX2FsbG9jX3BhZ2VzKCkgcm91dGluZSB0aGF0OgorICoJaW5faW50ZXJydXB0IC0gYW55IG5vZGUgb2sgKGN1cnJlbnQgdGFzayBjb250ZXh0IGlycmVsZXZhbnQpCisgKglHRlBfQVRPTUlDICAgLSBhbnkgbm9kZSBvaworICoJR0ZQX0tFUk5FTCAgIC0gYW55IG5vZGUgaW4gZW5jbG9zaW5nIG1lbV9leGNsdXNpdmUgY3B1c2V0IG9rCisgKglHRlBfVVNFUiAgICAgLSBvbmx5IG5vZGVzIGluIGN1cnJlbnQgdGFza3MgbWVtcyBhbGxvd2VkIG9rLgorICoqLworCitpbnQgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQoreworCWludCBub2RlOwkJCS8qIG5vZGUgdGhhdCB6b25lIHogaXMgb24gKi8KKwljb25zdCBzdHJ1Y3QgY3B1c2V0ICpjczsJLyogY3VycmVudCBjcHVzZXQgYW5jZXN0b3JzICovCisJaW50IGFsbG93ZWQgPSAxOwkJLyogaXMgYWxsb2NhdGlvbiBpbiB6b25lIHogYWxsb3dlZD8gKi8KKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuIDE7CisJbm9kZSA9IHotPnpvbmVfcGdkYXQtPm5vZGVfaWQ7CisJaWYgKG5vZGVfaXNzZXQobm9kZSwgY3VycmVudC0+bWVtc19hbGxvd2VkKSkKKwkJcmV0dXJuIDE7CisJaWYgKGdmcF9tYXNrICYgX19HRlBfSEFSRFdBTEwpCS8qIElmIGhhcmR3YWxsIHJlcXVlc3QsIHN0b3AgaGVyZSAqLworCQlyZXR1cm4gMDsKKworCS8qIE5vdCBoYXJkd2FsbCBhbmQgbm9kZSBvdXRzaWRlIG1lbXNfYWxsb3dlZDogc2NhbiB1cCBjcHVzZXRzICovCisJY3B1c2V0X2Rvd24oJmNwdXNldF9zZW0pOworCWNzID0gY3VycmVudC0+Y3B1c2V0OworCWlmICghY3MpCisJCWdvdG8gZG9uZTsJCS8qIGN1cnJlbnQgdGFzayBleGl0aW5nICovCisJY3MgPSBuZWFyZXN0X2V4Y2x1c2l2ZV9hbmNlc3Rvcihjcyk7CisJYWxsb3dlZCA9IG5vZGVfaXNzZXQobm9kZSwgY3MtPm1lbXNfYWxsb3dlZCk7Citkb25lOgorCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CisJcmV0dXJuIGFsbG93ZWQ7Cit9CisKKy8qKgorICogY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcCAtIERvIHdlIG92ZXJsYXAgQHAncyBtZW1fZXhjbHVzaXZlIGFuY2VzdG9ycz8KKyAqIEBwOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IG9mIHNvbWUgb3RoZXIgdGFzay4KKyAqCisgKiBEZXNjcmlwdGlvbjogUmV0dXJuIHRydWUgaWYgdGhlIG5lYXJlc3QgbWVtX2V4Y2x1c2l2ZSBhbmNlc3RvcgorICogY3B1c2V0cyBvZiB0YXNrcyBAcCBhbmQgY3VycmVudCBvdmVybGFwLiAgVXNlZCBieSBvb20ga2lsbGVyIHRvCisgKiBkZXRlcm1pbmUgaWYgdGFzayBAcCdzIG1lbW9yeSB1c2FnZSBtaWdodCBpbXBhY3QgdGhlIG1lbW9yeQorICogYXZhaWxhYmxlIHRvIHRoZSBjdXJyZW50IHRhc2suCisgKgorICogQWNxdWlyZXMgY3B1c2V0X3NlbSAtIG5vdCBzdWl0YWJsZSBmb3IgY2FsbGluZyBmcm9tIGEgZmFzdCBwYXRoLgorICoqLworCitpbnQgY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJY29uc3Qgc3RydWN0IGNwdXNldCAqY3MxLCAqY3MyOwkvKiBteSBhbmQgcCdzIGNwdXNldCBhbmNlc3RvcnMgKi8KKwlpbnQgb3ZlcmxhcCA9IDA7CQkvKiBkbyBjcHVzZXRzIG92ZXJsYXA/ICovCisKKwljcHVzZXRfZG93bigmY3B1c2V0X3NlbSk7CisJY3MxID0gY3VycmVudC0+Y3B1c2V0OworCWlmICghY3MxKQorCQlnb3RvIGRvbmU7CQkvKiBjdXJyZW50IHRhc2sgZXhpdGluZyAqLworCWNzMiA9IHAtPmNwdXNldDsKKwlpZiAoIWNzMikKKwkJZ290byBkb25lOwkJLyogdGFzayBwIGlzIGV4aXRpbmcgKi8KKwljczEgPSBuZWFyZXN0X2V4Y2x1c2l2ZV9hbmNlc3RvcihjczEpOworCWNzMiA9IG5lYXJlc3RfZXhjbHVzaXZlX2FuY2VzdG9yKGNzMik7CisJb3ZlcmxhcCA9IG5vZGVzX2ludGVyc2VjdHMoY3MxLT5tZW1zX2FsbG93ZWQsIGNzMi0+bWVtc19hbGxvd2VkKTsKK2RvbmU6CisJY3B1c2V0X3VwKCZjcHVzZXRfc2VtKTsKKworCXJldHVybiBvdmVybGFwOwogfQogCiAvKgpAQCAtMTY0Miw3ICsxNzUxLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl0c2sgPSBtLT5wcml2YXRlOwotCWRvd24oJmNwdXNldF9zZW0pOworCWNwdXNldF9kb3duKCZjcHVzZXRfc2VtKTsKIAl0YXNrX2xvY2sodHNrKTsKIAljcyA9IHRzay0+Y3B1c2V0OwogCXRhc2tfdW5sb2NrKHRzayk7CkBAIC0xNjU3LDcgKzE3NjYsNyBAQAogCXNlcV9wdXRzKG0sIGJ1Zik7CiAJc2VxX3B1dGMobSwgJ1xuJyk7CiBvdXQ6Ci0JdXAoJmNwdXNldF9zZW0pOworCWNwdXNldF91cCgmY3B1c2V0X3NlbSk7CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggNWIwZmI5Zi4uNmQyMDg5YSAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0zNjgsMTcgKzM2OCwxOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIHsKIAlpbnQgaSwgajsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJaiA9IDA7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIHNldDsKIAkJaSA9IGogKiBfX05GREJJVFM7Ci0JCWlmIChpID49IGZpbGVzLT5tYXhfZmRzZXQgfHwgaSA+PSBmaWxlcy0+bWF4X2ZkcykKKwkJaWYgKGkgPj0gZmR0LT5tYXhfZmRzZXQgfHwgaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKLQkJc2V0ID0gZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0c1tqKytdOworCQlzZXQgPSBmZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tqKytdOwogCQl3aGlsZSAoc2V0KSB7CiAJCQlpZiAoc2V0ICYgMSkgewotCQkJCXN0cnVjdCBmaWxlICogZmlsZSA9IHhjaGcoJmZpbGVzLT5mZFtpXSwgTlVMTCk7CisJCQkJc3RydWN0IGZpbGUgKiBmaWxlID0geGNoZygmZmR0LT5mZFtpXSwgTlVMTCk7CiAJCQkJaWYgKGZpbGUpCiAJCQkJCWZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpOwogCQkJfQpAQCAtNDAzLDE4ICs0MDUsMjIgQEAKIAogdm9pZCBmYXN0Y2FsbCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKQogeworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZmlsZXMtPmNvdW50KSkgewogCQljbG9zZV9maWxlcyhmaWxlcyk7CiAJCS8qCiAJCSAqIEZyZWUgdGhlIGZkIGFuZCBmZHNldCBhcnJheXMgaWYgd2UgZXhwYW5kZWQgdGhlbS4KKwkJICogSWYgdGhlIGZkdGFibGUgd2FzIGVtYmVkZGVkLCBwYXNzIGZpbGVzIGZvciBmcmVlaW5nCisJCSAqIGF0IHRoZSBlbmQgb2YgdGhlIFJDVSBncmFjZSBwZXJpb2QuIE90aGVyd2lzZSwKKwkJICogeW91IGNhbiBmcmVlIGZpbGVzIGltbWVkaWF0ZWx5LgogCQkgKi8KLQkJaWYgKGZpbGVzLT5mZCAhPSAmZmlsZXMtPmZkX2FycmF5WzBdKQotCQkJZnJlZV9mZF9hcnJheShmaWxlcy0+ZmQsIGZpbGVzLT5tYXhfZmRzKTsKLQkJaWYgKGZpbGVzLT5tYXhfZmRzZXQgPiBfX0ZEX1NFVFNJWkUpIHsKLQkJCWZyZWVfZmRzZXQoZmlsZXMtPm9wZW5fZmRzLCBmaWxlcy0+bWF4X2Zkc2V0KTsKLQkJCWZyZWVfZmRzZXQoZmlsZXMtPmNsb3NlX29uX2V4ZWMsIGZpbGVzLT5tYXhfZmRzZXQpOwotCQl9Ci0JCWttZW1fY2FjaGVfZnJlZShmaWxlc19jYWNoZXAsIGZpbGVzKTsKKwkJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJCWlmIChmZHQgPT0gJmZpbGVzLT5mZHRhYikKKwkJCWZkdC0+ZnJlZV9maWxlcyA9IGZpbGVzOworCQllbHNlCisJCQlrbWVtX2NhY2hlX2ZyZWUoZmlsZXNfY2FjaGVwLCBmaWxlcyk7CisJCWZyZWVfZmR0YWJsZShmZHQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggN2UxZWFkOS4uODE0OWYzNiAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KQEAgLTE3Niw2ICsxNzcsNyBAQAogCiAJLyogT25lIGZvciB1cywgb25lIGZvciB3aG9ldmVyIGRvZXMgdGhlICJyZWxlYXNlX3Rhc2soKSIgKHVzdWFsbHkgcGFyZW50KSAqLwogCWF0b21pY19zZXQoJnRzay0+dXNhZ2UsMik7CisJYXRvbWljX3NldCgmdHNrLT5mc19leGNsLCAwKTsKIAlyZXR1cm4gdHNrOwogfQogCkBAIC01NjQsMjQgKzU2Niw1MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNvdW50X29wZW5fZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBzaXplKQorc3RhdGljIGludCBjb3VudF9vcGVuX2ZpbGVzKHN0cnVjdCBmZHRhYmxlICpmZHQpCiB7CisJaW50IHNpemUgPSBmZHQtPm1heF9mZHNldDsKIAlpbnQgaTsKIAogCS8qIEZpbmQgdGhlIGxhc3Qgb3BlbiBmZCAqLwogCWZvciAoaSA9IHNpemUvKDgqc2l6ZW9mKGxvbmcpKTsgaSA+IDA7ICkgewotCQlpZiAoZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0c1stLWldKQorCQlpZiAoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbLS1pXSkKIAkJCWJyZWFrOwogCX0KIAlpID0gKGkrMSkgKiA4ICogc2l6ZW9mKGxvbmcpOwogCXJldHVybiBpOwogfQogCitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXModm9pZCkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKKwluZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIW5ld2YpCisJCWdvdG8gb3V0OworCisJYXRvbWljX3NldCgmbmV3Zi0+Y291bnQsIDEpOworCisJc3Bpbl9sb2NrX2luaXQoJm5ld2YtPmZpbGVfbG9jayk7CisJZmR0ID0gJm5ld2YtPmZkdGFiOworCWZkdC0+bmV4dF9mZCA9IDA7CisJZmR0LT5tYXhfZmRzID0gTlJfT1BFTl9ERUZBVUxUOworCWZkdC0+bWF4X2Zkc2V0ID0gX19GRF9TRVRTSVpFOworCWZkdC0+Y2xvc2Vfb25fZXhlYyA9ICZuZXdmLT5jbG9zZV9vbl9leGVjX2luaXQ7CisJZmR0LT5vcGVuX2ZkcyA9ICZuZXdmLT5vcGVuX2Zkc19pbml0OworCWZkdC0+ZmQgPSAmbmV3Zi0+ZmRfYXJyYXlbMF07CisJSU5JVF9SQ1VfSEVBRCgmZmR0LT5yY3UpOworCWZkdC0+ZnJlZV9maWxlcyA9IE5VTEw7CisJZmR0LT5uZXh0ID0gTlVMTDsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmV3Zi0+ZmR0LCBmZHQpOworb3V0OgorCXJldHVybiBuZXdmOworfQorCiBzdGF0aWMgaW50IGNvcHlfZmlsZXModW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICogdHNrKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsICpuZXdmOwogCXN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzOwogCWludCBvcGVuX2ZpbGVzLCBzaXplLCBpLCBlcnJvciA9IDAsIGV4cGFuZDsKKwlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiAKIAkvKgogCSAqIEEgYmFja2dyb3VuZCBwcm9jZXNzIG1heSBub3QgaGF2ZSBhbnkgZmlsZXMgLi4uCkBAIC02MDIsMzUgKzYzMywyNyBAQAogCSAqLwogCXRzay0+ZmlsZXMgPSBOVUxMOwogCWVycm9yID0gLUVOT01FTTsKLQluZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIFNMQUJfS0VSTkVMKTsKLQlpZiAoIW5ld2YpIAorCW5ld2YgPSBhbGxvY19maWxlcygpOworCWlmICghbmV3ZikKIAkJZ290byBvdXQ7CiAKLQlhdG9taWNfc2V0KCZuZXdmLT5jb3VudCwgMSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmbmV3Zi0+ZmlsZV9sb2NrKTsKLQluZXdmLT5uZXh0X2ZkCSAgICA9IDA7Ci0JbmV3Zi0+bWF4X2ZkcwkgICAgPSBOUl9PUEVOX0RFRkFVTFQ7Ci0JbmV3Zi0+bWF4X2Zkc2V0CSAgICA9IF9fRkRfU0VUU0laRTsKLQluZXdmLT5jbG9zZV9vbl9leGVjID0gJm5ld2YtPmNsb3NlX29uX2V4ZWNfaW5pdDsKLQluZXdmLT5vcGVuX2ZkcwkgICAgPSAmbmV3Zi0+b3Blbl9mZHNfaW5pdDsKLQluZXdmLT5mZAkgICAgPSAmbmV3Zi0+ZmRfYXJyYXlbMF07Ci0KIAlzcGluX2xvY2soJm9sZGYtPmZpbGVfbG9jayk7Ci0KLQlvcGVuX2ZpbGVzID0gY291bnRfb3Blbl9maWxlcyhvbGRmLCBvbGRmLT5tYXhfZmRzZXQpOworCW9sZF9mZHQgPSBmaWxlc19mZHRhYmxlKG9sZGYpOworCW5ld19mZHQgPSBmaWxlc19mZHRhYmxlKG5ld2YpOworCXNpemUgPSBvbGRfZmR0LT5tYXhfZmRzZXQ7CisJb3Blbl9maWxlcyA9IGNvdW50X29wZW5fZmlsZXMob2xkX2ZkdCk7CiAJZXhwYW5kID0gMDsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIGZkIGFycmF5IG9yIGZkIHNldC4KIAkgKiBOb3RlOiB3ZSdyZSBub3QgYSBjbG9uZSB0YXNrLCBzbyB0aGUgb3BlbiBjb3VudCB3b24ndCAgY2hhbmdlLgogCSAqLwotCWlmIChvcGVuX2ZpbGVzID4gbmV3Zi0+bWF4X2Zkc2V0KSB7Ci0JCW5ld2YtPm1heF9mZHNldCA9IDA7CisJaWYgKG9wZW5fZmlsZXMgPiBuZXdfZmR0LT5tYXhfZmRzZXQpIHsKKwkJbmV3X2ZkdC0+bWF4X2Zkc2V0ID0gMDsKIAkJZXhwYW5kID0gMTsKIAl9Ci0JaWYgKG9wZW5fZmlsZXMgPiBuZXdmLT5tYXhfZmRzKSB7Ci0JCW5ld2YtPm1heF9mZHMgPSAwOworCWlmIChvcGVuX2ZpbGVzID4gbmV3X2ZkdC0+bWF4X2ZkcykgeworCQluZXdfZmR0LT5tYXhfZmRzID0gMDsKIAkJZXhwYW5kID0gMTsKIAl9CiAKQEAgLTY0MiwxNCArNjY1LDIxIEBACiAJCXNwaW5fdW5sb2NrKCZuZXdmLT5maWxlX2xvY2spOwogCQlpZiAoZXJyb3IgPCAwKQogCQkJZ290byBvdXRfcmVsZWFzZTsKKwkJbmV3X2ZkdCA9IGZpbGVzX2ZkdGFibGUobmV3Zik7CisJCS8qCisJCSAqIFJlYWNxdWlyZSB0aGUgb2xkZiBsb2NrIGFuZCBhIHBvaW50ZXIgdG8gaXRzIGZkIHRhYmxlCisJCSAqIHdobyBrbm93cyBpdCBtYXkgaGF2ZSBhIG5ldyBiaWdnZXIgZmQgdGFibGUuIFdlIG5lZWQKKwkJICogdGhlIGxhdGVzdCBwb2ludGVyLgorCQkgKi8KIAkJc3Bpbl9sb2NrKCZvbGRmLT5maWxlX2xvY2spOworCQlvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTsKIAl9CiAKLQlvbGRfZmRzID0gb2xkZi0+ZmQ7Ci0JbmV3X2ZkcyA9IG5ld2YtPmZkOworCW9sZF9mZHMgPSBvbGRfZmR0LT5mZDsKKwluZXdfZmRzID0gbmV3X2ZkdC0+ZmQ7CiAKLQltZW1jcHkobmV3Zi0+b3Blbl9mZHMtPmZkc19iaXRzLCBvbGRmLT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIG9wZW5fZmlsZXMvOCk7Ci0JbWVtY3B5KG5ld2YtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzLCBvbGRmLT5jbG9zZV9vbl9leGVjLT5mZHNfYml0cywgb3Blbl9maWxlcy84KTsKKwltZW1jcHkobmV3X2ZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBvbGRfZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIG9wZW5fZmlsZXMvOCk7CisJbWVtY3B5KG5ld19mZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzLCBvbGRfZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0cywgb3Blbl9maWxlcy84KTsKIAogCWZvciAoaSA9IG9wZW5fZmlsZXM7IGkgIT0gMDsgaS0tKSB7CiAJCXN0cnVjdCBmaWxlICpmID0gKm9sZF9mZHMrKzsKQEAgLTY2MiwyNCArNjkyLDI0IEBACiAJCQkgKiBpcyBwYXJ0d2F5IHRocm91Z2ggb3BlbigpLiAgU28gbWFrZSBzdXJlIHRoYXQgdGhpcwogCQkJICogZmQgaXMgYXZhaWxhYmxlIHRvIHRoZSBuZXcgcHJvY2Vzcy4KIAkJCSAqLwotCQkJRkRfQ0xSKG9wZW5fZmlsZXMgLSBpLCBuZXdmLT5vcGVuX2Zkcyk7CisJCQlGRF9DTFIob3Blbl9maWxlcyAtIGksIG5ld19mZHQtPm9wZW5fZmRzKTsKIAkJfQotCQkqbmV3X2ZkcysrID0gZjsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKCpuZXdfZmRzKyssIGYpOwogCX0KIAlzcGluX3VubG9jaygmb2xkZi0+ZmlsZV9sb2NrKTsKIAogCS8qIGNvbXB1dGUgdGhlIHJlbWFpbmRlciB0byBiZSBjbGVhcmVkICovCi0Jc2l6ZSA9IChuZXdmLT5tYXhfZmRzIC0gb3Blbl9maWxlcykgKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisJc2l6ZSA9IChuZXdfZmR0LT5tYXhfZmRzIC0gb3Blbl9maWxlcykgKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CiAKIAkvKiBUaGlzIGlzIGxvbmcgd29yZCBhbGlnbmVkIHRodXMgY291bGQgdXNlIGEgb3B0aW1pemVkIHZlcnNpb24gKi8gCiAJbWVtc2V0KG5ld19mZHMsIDAsIHNpemUpOyAKIAotCWlmIChuZXdmLT5tYXhfZmRzZXQgPiBvcGVuX2ZpbGVzKSB7Ci0JCWludCBsZWZ0ID0gKG5ld2YtPm1heF9mZHNldC1vcGVuX2ZpbGVzKS84OworCWlmIChuZXdfZmR0LT5tYXhfZmRzZXQgPiBvcGVuX2ZpbGVzKSB7CisJCWludCBsZWZ0ID0gKG5ld19mZHQtPm1heF9mZHNldC1vcGVuX2ZpbGVzKS84OwogCQlpbnQgc3RhcnQgPSBvcGVuX2ZpbGVzIC8gKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0JCW1lbXNldCgmbmV3Zi0+b3Blbl9mZHMtPmZkc19iaXRzW3N0YXJ0XSwgMCwgbGVmdCk7Ci0JCW1lbXNldCgmbmV3Zi0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbc3RhcnRdLCAwLCBsZWZ0KTsKKwkJbWVtc2V0KCZuZXdfZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbc3RhcnRdLCAwLCBsZWZ0KTsKKwkJbWVtc2V0KCZuZXdfZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tzdGFydF0sIDAsIGxlZnQpOwogCX0KIAogCXRzay0+ZmlsZXMgPSBuZXdmOwpAQCAtNjg4LDkgKzcxOCw5IEBACiAJcmV0dXJuIGVycm9yOwogCiBvdXRfcmVsZWFzZToKLQlmcmVlX2Zkc2V0IChuZXdmLT5jbG9zZV9vbl9leGVjLCBuZXdmLT5tYXhfZmRzZXQpOwotCWZyZWVfZmRzZXQgKG5ld2YtPm9wZW5fZmRzLCBuZXdmLT5tYXhfZmRzZXQpOwotCWZyZWVfZmRfYXJyYXkobmV3Zi0+ZmQsIG5ld2YtPm1heF9mZHMpOworCWZyZWVfZmRzZXQgKG5ld19mZHQtPmNsb3NlX29uX2V4ZWMsIG5ld19mZHQtPm1heF9mZHNldCk7CisJZnJlZV9mZHNldCAobmV3X2ZkdC0+b3Blbl9mZHMsIG5ld19mZHQtPm1heF9mZHNldCk7CisJZnJlZV9mZF9hcnJheShuZXdfZmR0LT5mZCwgbmV3X2ZkdC0+bWF4X2Zkcyk7CiAJa21lbV9jYWNoZV9mcmVlKGZpbGVzX2NhY2hlcCwgbmV3Zik7CiAJZ290byBvdXQ7CiB9CkBAIC0xMTE1LDYgKzExNDUsOSBAQAogCQkJX19nZXRfY3B1X3Zhcihwcm9jZXNzX2NvdW50cykrKzsKIAl9CiAKKwlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+dHR5ICYmIHAtPnNpZ25hbC0+dHR5KQorCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7CisKIAlucl90aHJlYWRzKys7CiAJdG90YWxfZm9ya3MrKzsKIAl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggYzcxMzBmOC4uY2EwNWZlNiAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxhc20vZnV0ZXguaD4KIAogI2RlZmluZSBGVVRFWF9IQVNIQklUUyAoQ09ORklHX0JBU0VfU01BTEwgPyA0IDogOCkKIApAQCAtMzI3LDYgKzMyOCwxMTggQEAKIH0KIAogLyoKKyAqIFdha2UgdXAgYWxsIHdhaXRlcnMgaGFzaGVkIG9uIHRoZSBwaHlzaWNhbCBwYWdlIHRoYXQgaXMgbWFwcGVkCisgKiB0byB0aGlzIHZpcnR1YWwgYWRkcmVzczoKKyAqLworc3RhdGljIGludCBmdXRleF93YWtlX29wKHVuc2lnbmVkIGxvbmcgdWFkZHIxLCB1bnNpZ25lZCBsb25nIHVhZGRyMiwgaW50IG5yX3dha2UsIGludCBucl93YWtlMiwgaW50IG9wKQoreworCXVuaW9uIGZ1dGV4X2tleSBrZXkxLCBrZXkyOworCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqYmgxLCAqYmgyOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IGZ1dGV4X3EgKnRoaXMsICpuZXh0OworCWludCByZXQsIG9wX3JldCwgYXR0ZW1wdCA9IDA7CisKK3JldHJ5ZnVsbDoKKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgJmtleTEpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0OworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCAma2V5Mik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXQ7CisKKwliaDEgPSBoYXNoX2Z1dGV4KCZrZXkxKTsKKwliaDIgPSBoYXNoX2Z1dGV4KCZrZXkyKTsKKworcmV0cnk6CisJaWYgKGJoMSA8IGJoMikKKwkJc3Bpbl9sb2NrKCZiaDEtPmxvY2spOworCXNwaW5fbG9jaygmYmgyLT5sb2NrKTsKKwlpZiAoYmgxID4gYmgyKQorCQlzcGluX2xvY2soJmJoMS0+bG9jayk7CisKKwlvcF9yZXQgPSBmdXRleF9hdG9taWNfb3BfaW51c2VyKG9wLCAoaW50IF9fdXNlciAqKXVhZGRyMik7CisJaWYgKHVubGlrZWx5KG9wX3JldCA8IDApKSB7CisJCWludCBkdW1teTsKKworCQlzcGluX3VubG9jaygmYmgxLT5sb2NrKTsKKwkJaWYgKGJoMSAhPSBiaDIpCisJCQlzcGluX3VubG9jaygmYmgyLT5sb2NrKTsKKworCQkvKiBmdXRleF9hdG9taWNfb3BfaW51c2VyIG5lZWRzIHRvIGJvdGggcmVhZCBhbmQgd3JpdGUKKwkJICogKihpbnQgX191c2VyICopdWFkZHIyLCBidXQgd2UgY2FuJ3QgbW9kaWZ5IGl0CisJCSAqIG5vbi1hdG9taWNhbGx5LiAgVGhlcmVmb3JlLCBpZiBnZXRfdXNlciBiZWxvdyBpcyBub3QKKwkJICogZW5vdWdoLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgZmF1bHQgb3Vyc2VsdmVzLCB3aGlsZQorCQkgKiBzdGlsbCBob2xkaW5nIHRoZSBtbWFwX3NlbS4gICovCisJCWlmIChhdHRlbXB0KyspIHsKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlpZiAoYXR0ZW1wdCA+PSAyIHx8CisJCQkgICAgISh2bWEgPSBmaW5kX3ZtYShtbSwgdWFkZHIyKSkgfHwKKwkJCSAgICB2bWEtPnZtX3N0YXJ0ID4gdWFkZHIyIHx8CisJCQkgICAgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQkJCWdvdG8gb3V0OworCisJCQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCB1YWRkcjIsIDEpKSB7CisJCQljYXNlIFZNX0ZBVUxUX01JTk9SOgorCQkJCWN1cnJlbnQtPm1pbl9mbHQrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVk1fRkFVTFRfTUFKT1I6CisJCQkJY3VycmVudC0+bWFqX2ZsdCsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQkvKiBJZiB3ZSB3b3VsZCBoYXZlIGZhdWx0ZWQsIHJlbGVhc2UgbW1hcF9zZW0sCisJCSAqIGZhdWx0IGl0IGluIGFuZCBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4gICovCisJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwkJcmV0ID0gZ2V0X3VzZXIoZHVtbXksIChpbnQgX191c2VyICopdWFkZHIyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZ290byByZXRyeWZ1bGw7CisJfQorCisJaGVhZCA9ICZiaDEtPmNoYWluOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIG5leHQsIGhlYWQsIGxpc3QpIHsKKwkJaWYgKG1hdGNoX2Z1dGV4ICgmdGhpcy0+a2V5LCAma2V5MSkpIHsKKwkJCXdha2VfZnV0ZXgodGhpcyk7CisJCQlpZiAoKytyZXQgPj0gbnJfd2FrZSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChvcF9yZXQgPiAwKSB7CisJCWhlYWQgPSAmYmgyLT5jaGFpbjsKKworCQlvcF9yZXQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGhpcywgbmV4dCwgaGVhZCwgbGlzdCkgeworCQkJaWYgKG1hdGNoX2Z1dGV4ICgmdGhpcy0+a2V5LCAma2V5MikpIHsKKwkJCQl3YWtlX2Z1dGV4KHRoaXMpOworCQkJCWlmICgrK29wX3JldCA+PSBucl93YWtlMikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0ICs9IG9wX3JldDsKKwl9CisKKwlzcGluX3VubG9jaygmYmgxLT5sb2NrKTsKKwlpZiAoYmgxICE9IGJoMikKKwkJc3Bpbl91bmxvY2soJmJoMi0+bG9jayk7CitvdXQ6CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogUmVxdWV1ZSBhbGwgd2FpdGVycyBoYXNoZWQgb24gb25lIHBoeXNpY2FsIHBhZ2UgdG8gYW5vdGhlcgogICogcGh5c2ljYWwgcGFnZS4KICAqLwpAQCAtNjczLDIzICs3ODYsMTcgQEAKIAlmaWxwLT5mX21hcHBpbmcgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCiAJaWYgKHNpZ25hbCkgewotCQlpbnQgZXJyOwogCQllcnIgPSBmX3NldG93bihmaWxwLCBjdXJyZW50LT5waWQsIDEpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJcHV0X3VudXNlZF9mZChyZXQpOwotCQkJcHV0X2ZpbHAoZmlscCk7Ci0JCQlyZXQgPSBlcnI7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJZmlscC0+Zl9vd25lci5zaWdudW0gPSBzaWduYWw7CiAJfQogCiAJcSA9IGttYWxsb2Moc2l6ZW9mKCpxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxKSB7Ci0JCXB1dF91bnVzZWRfZmQocmV0KTsKLQkJcHV0X2ZpbHAoZmlscCk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOwogCX0KIAogCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKQEAgLTY5NywxMCArODA0LDggQEAKIAogCWlmICh1bmxpa2VseShlcnIgIT0gMCkpIHsKIAkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJcHV0X3VudXNlZF9mZChyZXQpOwotCQlwdXRfZmlscChmaWxwKTsKIAkJa2ZyZWUocSk7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJLyoKQEAgLTcxNiw2ICs4MjEsMTEgQEAKIAlmZF9pbnN0YWxsKHJldCwgZmlscCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKK2Vycm9yOgorCXB1dF91bnVzZWRfZmQocmV0KTsKKwlwdXRfZmlscChmaWxwKTsKKwlyZXQgPSBlcnI7CisJZ290byBvdXQ7CiB9CiAKIGxvbmcgZG9fZnV0ZXgodW5zaWduZWQgbG9uZyB1YWRkciwgaW50IG9wLCBpbnQgdmFsLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCkBAIC03NDAsNiArODUwLDkgQEAKIAljYXNlIEZVVEVYX0NNUF9SRVFVRVVFOgogCQlyZXQgPSBmdXRleF9yZXF1ZXVlKHVhZGRyLCB1YWRkcjIsIHZhbCwgdmFsMiwgJnZhbDMpOwogCQlicmVhazsKKwljYXNlIEZVVEVYX1dBS0VfT1A6CisJCXJldCA9IGZ1dGV4X3dha2Vfb3AodWFkZHIsIHVhZGRyMiwgdmFsLCB2YWwyLCB2YWwzKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1NZUzsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvaW50ZXJtb2R1bGUuYyBiL2tlcm5lbC9pbnRlcm1vZHVsZS5jCmluZGV4IDM4ODk3N2YuLjBjYmU2MzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pbnRlcm1vZHVsZS5jCisrKyBiL2tlcm5lbC9pbnRlcm1vZHVsZS5jCkBAIC0zOSw3ICszOSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCXN0cnVjdCBpbnRlcl9tb2R1bGVfZW50cnkgKmltZSwgKmltZV9uZXc7CiAKLQlpZiAoIShpbWVfbmV3ID0ga21hbGxvYyhzaXplb2YoKmltZSksIEdGUF9LRVJORUwpKSkgeworCWlmICghKGltZV9uZXcgPSBremFsbG9jKHNpemVvZigqaW1lKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCS8qIE92ZXJsb2FkZWQga2VybmVsLCBub3QgZmF0YWwgKi8KIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiQWllZSwgaW50ZXJfbW9kdWxlX3JlZ2lzdGVyOiBjYW5ub3Qga21hbGxvYyBlbnRyeSBmb3IgJyVzJ1xuIiwKQEAgLTQ3LDcgKzQ3LDYgQEAKIAkJa21hbGxvY19mYWlsZWQgPSAxOwogCQlyZXR1cm47CiAJfQotCW1lbXNldChpbWVfbmV3LCAwLCBzaXplb2YoKmltZV9uZXcpKTsKIAlpbWVfbmV3LT5pbV9uYW1lID0gaW1fbmFtZTsKIAlpbWVfbmV3LT5vd25lciA9IG93bmVyOwogCWltZV9uZXctPnVzZXJkYXRhID0gdXNlcmRhdGE7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2hhbmRsZS5jIGIva2VybmVsL2lycS9oYW5kbGUuYwppbmRleCBjMjlmODNjLi4zZmY3YjkyIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2hhbmRsZS5jCisrKyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKIAlrc3RhdF90aGlzX2NwdS5pcnFzW2lycV0rKzsKLQlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX1BFUl9DUFUpIHsKKwlpZiAoQ0hFQ0tfSVJRX1BFUl9DUFUoZGVzYy0+c3RhdHVzKSkgewogCQlpcnFyZXR1cm5fdCBhY3Rpb25fcmV0OwogCiAJCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCBhYzY3MDA5Li4xY2ZkYjA4IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTE4LDYgKzE4LDEwIEBACiAKIGNwdW1hc2tfdCBpcnFfYWZmaW5pdHlbTlJfSVJRU10gPSB7IFswIC4uLiBOUl9JUlFTLTFdID0gQ1BVX01BU0tfQUxMIH07CiAKKyNpZiBkZWZpbmVkIChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgfHwgZGVmaW5lZCAoQ09ORklHX0lSUUJBTEFOQ0UpCitjcHVtYXNrX3QgX19jYWNoZWxpbmVfYWxpZ25lZCBwZW5kaW5nX2lycV9jcHVtYXNrW05SX0lSUVNdOworI2VuZGlmCisKIC8qKgogICoJc3luY2hyb25pemVfaXJxIC0gd2FpdCBmb3IgcGVuZGluZyBJUlEgaGFuZGxlcnMgKG9uIG90aGVyIENQVXMpCiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9wcm9jLmMgYi9rZXJuZWwvaXJxL3Byb2MuYwppbmRleCA4NWQwOGRhLi5mMjZlNTM0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3Byb2MuYworKysgYi9rZXJuZWwvaXJxL3Byb2MuYwpAQCAtMTksMTIgKzE5LDIyIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnNtcF9hZmZpbml0eV9lbnRyeVtOUl9JUlFTXTsKIAotdm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKLXByb2Nfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFza192YWwpCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKK3ZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKK3sKKwkvKgorCSAqIFNhdmUgdGhlc2UgYXdheSBmb3IgbGF0ZXIgdXNlLiBSZS1wcm9nYW0gd2hlbiB0aGUKKwkgKiBpbnRlcnJ1cHQgaXMgcGVuZGluZworCSAqLworCXNldF9wZW5kaW5nX2lycShpcnEsIG1hc2tfdmFsKTsKK30KKyNlbHNlCit2b2lkIHByb2Nfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFza192YWwpCiB7CiAJaXJxX2FmZmluaXR5W2lycV0gPSBtYXNrX3ZhbDsKIAlpcnFfZGVzY1tpcnFdLmhhbmRsZXItPnNldF9hZmZpbml0eShpcnEsIG1hc2tfdmFsKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGlycV9hZmZpbml0eV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggYjAyMzcxMi4uZjNlYTQ5MiAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CkBAIC03Miw3ICs3Myw3IEBACiAgKiBnZXRfaW5zbl9zbG90KCkgLSBGaW5kIGEgc2xvdCBvbiBhbiBleGVjdXRhYmxlIHBhZ2UgZm9yIGFuIGluc3RydWN0aW9uLgogICogV2UgYWxsb2NhdGUgYW4gZXhlY3V0YWJsZSBwYWdlIGlmIHRoZXJlJ3Mgbm8gcm9vbSBvbiBleGlzdGluZyBvbmVzLgogICovCi1rcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCkKK2twcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKmdldF9pbnNuX3Nsb3Qodm9pZCkKIHsKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CkBAIC0xMTcsNyArMTE4LDcgQEAKIAlyZXR1cm4ga2lwLT5pbnNuczsKIH0KIAotdm9pZCBmcmVlX2luc25fc2xvdChrcHJvYmVfb3Bjb2RlX3QgKnNsb3QpCit2b2lkIF9fa3Byb2JlcyBmcmVlX2luc25fc2xvdChrcHJvYmVfb3Bjb2RlX3QgKnNsb3QpCiB7CiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwpAQCAtMTUyLDIwICsxNTMsNDIgQEAKIH0KIAogLyogTG9ja3Mga3Byb2JlOiBpcnFzIG11c3QgYmUgZGlzYWJsZWQgKi8KLXZvaWQgbG9ja19rcHJvYmVzKHZvaWQpCit2b2lkIF9fa3Byb2JlcyBsb2NrX2twcm9iZXModm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCS8qIEF2b2lkaW5nIGxvY2FsIGludGVycnVwdHMgdG8gaGFwcGVuIHJpZ2h0IGFmdGVyIHdlIHRha2UgdGhlIGtwcm9iZV9sb2NrCisJICogYW5kIGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gdXBkYXRlIGtwcm9iZV9jcHUsIHRoaXMgdG8gcHJldmVudAorCSAqIGRlYWRsb2NrIHdoZW4gd2UgaGF2ZSBhIGtwcm9iZSBvbiBJU1Igcm91dGluZSBhbmQgYSBrcHJvYmUgb24gdGFzaworCSAqIHJvdXRpbmUKKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKIAlzcGluX2xvY2soJmtwcm9iZV9sb2NrKTsKIAlrcHJvYmVfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisgCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotdm9pZCB1bmxvY2tfa3Byb2Jlcyh2b2lkKQordm9pZCBfX2twcm9iZXMgdW5sb2NrX2twcm9iZXModm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCS8qIEF2b2lkaW5nIGxvY2FsIGludGVycnVwdHMgdG8gaGFwcGVuIHJpZ2h0IGFmdGVyIHdlIHVwZGF0ZQorCSAqIGtwcm9iZV9jcHUgYW5kIGJlZm9yZSB3ZSBnZXQgYSBhIGNoYW5jZSB0byByZWxlYXNlIGtwcm9iZV9sb2NrLAorCSAqIHRoaXMgdG8gcHJldmVudCBkZWFkbG9jayB3aGVuIHdlIGhhdmUgYSBrcHJvYmUgb24gSVNSIHJvdXRpbmUgYW5kCisJICogYSBrcHJvYmUgb24gdGFzayByb3V0aW5lCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCiAJa3Byb2JlX2NwdSA9IE5SX0NQVVM7CiAJc3Bpbl91bmxvY2soJmtwcm9iZV9sb2NrKTsKKworIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qIFlvdSBoYXZlIHRvIGJlIGhvbGRpbmcgdGhlIGtwcm9iZV9sb2NrICovCi1zdHJ1Y3Qga3Byb2JlICpnZXRfa3Byb2JlKHZvaWQgKmFkZHIpCitzdHJ1Y3Qga3Byb2JlIF9fa3Byb2JlcyAqZ2V0X2twcm9iZSh2b2lkICphZGRyKQogewogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwpAQCAtMTgzLDcgKzIwNiw3IEBACiAgKiBBZ2dyZWdhdGUgaGFuZGxlcnMgZm9yIG11bHRpcGxlIGtwcm9iZXMgc3VwcG9ydCAtIHRoZXNlIGhhbmRsZXJzCiAgKiB0YWtlIGNhcmUgb2YgaW52b2tpbmcgdGhlIGluZGl2aWR1YWwga3Byb2JlIGhhbmRsZXJzIG9uIHAtPmxpc3QKICAqLwotc3RhdGljIGludCBhZ2dyX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBfX2twcm9iZXMgYWdncl9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga3Byb2JlICprcDsKIApAQCAtMTk4LDggKzIyMSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFnZ3JfcG9zdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBhZ2dyX3Bvc3RfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qga3Byb2JlICprcDsKIApAQCAtMjEzLDggKzIzNiw4IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IGFnZ3JfZmF1bHRfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCSAgICAgIGludCB0cmFwbnIpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBhZ2dyX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCWludCB0cmFwbnIpCiB7CiAJLyoKIAkgKiBpZiB3ZSBmYXVsdGVkICJkdXJpbmciIHRoZSBleGVjdXRpb24gb2YgYSB1c2VyIHNwZWNpZmllZApAQCAtMjI3LDcgKzI1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWdncl9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBfX2twcm9iZXMgYWdncl9icmVha19oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcHJvYmUgKmtwID0gY3Vycl9rcHJvYmU7CiAJaWYgKGN1cnJfa3Byb2JlICYmIGtwLT5icmVha19oYW5kbGVyKSB7CkBAIC0yNDAsNyArMjYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqZ2V0X2ZyZWVfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlICpycCkKK3N0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgX19rcHJvYmVzICpnZXRfZnJlZV9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUgKnJwKQogewogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwpAQCAtMjQ5LDcgKzI3Miw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpnZXRfdXNlZF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUgKnJwKQorc3RhdGljIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgX19rcHJvYmVzICpnZXRfdXNlZF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmUKKwkJCQkJCQkgICAgICAqcnApCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CkBAIC0yNTgsNyArMjgyLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBhZGRfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSkKK3ZvaWQgX19rcHJvYmVzIGFkZF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpKQogewogCS8qCiAJICogUmVtb3ZlIHJwIGluc3Qgb2ZmIHRoZSBmcmVlIGxpc3QgLQpAQCAtMjc2LDcgKzMwMCw3IEBACiAJaGxpc3RfYWRkX2hlYWQoJnJpLT51Zmxpc3QsICZyaS0+cnAtPnVzZWRfaW5zdGFuY2VzKTsKIH0KIAotdm9pZCByZWN5Y2xlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkpCit2b2lkIF9fa3Byb2JlcyByZWN5Y2xlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmkpCiB7CiAJLyogcmVtb3ZlIHJwIGluc3Qgb2ZmIHRoZSBycHJvYmVfaW5zdF90YWJsZSAqLwogCWhsaXN0X2RlbCgmcmktPmhsaXN0KTsKQEAgLTI5MSw3ICszMTUsNyBAQAogCQlrZnJlZShyaSk7CiB9CiAKLXN0cnVjdCBobGlzdF9oZWFkICoga3JldHByb2JlX2luc3RfdGFibGVfaGVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0cnVjdCBobGlzdF9oZWFkIF9fa3Byb2JlcyAqa3JldHByb2JlX2luc3RfdGFibGVfaGVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlyZXR1cm4gJmtyZXRwcm9iZV9pbnN0X3RhYmxlW2hhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyldOwogfQpAQCAtMzAyLDcgKzMyNiw3IEBACiAgKiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFzay4gVGhlc2UgbGVmdCBvdmVyIGluc3RhbmNlcyByZXByZXNlbnQKICAqIHByb2JlZCBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gY2FsbGVkIGJ1dCB3aWxsIG5ldmVyIHJldHVybi4KICAqLwotdm9pZCBrcHJvYmVfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKQordm9pZCBfX2twcm9iZXMga3Byb2JlX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0aykKIHsKICAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CiAgICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtMzIyLDcgKzM0Niw4IEBACiAgKiBUaGlzIGtwcm9iZSBwcmVfaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggZXZlcnkga3JldHByb2JlLiBXaGVuIHByb2JlCiAgKiBoaXRzIGl0IHdpbGwgc2V0IHVwIHRoZSByZXR1cm4gcHJvYmUuCiAgKi8KLXN0YXRpYyBpbnQgcHJlX2hhbmRsZXJfa3JldHByb2JlKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBfX2twcm9iZXMgcHJlX2hhbmRsZXJfa3JldHByb2JlKHN0cnVjdCBrcHJvYmUgKnAsCisJCQkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrcmV0cHJvYmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBrcmV0cHJvYmUsIGtwKTsKIApAQCAtMzUzLDcgKzM3OCw3IEBACiAqIEFkZCB0aGUgbmV3IHByb2JlIHRvIG9sZF9wLT5saXN0LiBGYWlsIGlmIHRoaXMgaXMgdGhlCiAqIHNlY29uZCBqcHJvYmUgYXQgdGhlIGFkZHJlc3MgLSB0d28ganByb2JlcyBjYW4ndCBjb2V4aXN0CiAqLwotc3RhdGljIGludCBhZGRfbmV3X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpvbGRfcCwgc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGFkZF9uZXdfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKm9sZF9wLCBzdHJ1Y3Qga3Byb2JlICpwKQogewogICAgICAgICBzdHJ1Y3Qga3Byb2JlICprcDsKIApAQCAtMzk1LDcgKzQyMCw4IEBACiAgKiB0aGUgaW50cmljYWNpZXMKICAqIFRPRE86IE1vdmUga2NhbGxvYyBvdXRzaWRlIHRoZSBzcGlubG9jawogICovCi1zdGF0aWMgaW50IHJlZ2lzdGVyX2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKm9sZF9wLCBzdHJ1Y3Qga3Byb2JlICpwKQorc3RhdGljIGludCBfX2twcm9iZXMgcmVnaXN0ZXJfYWdncl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqb2xkX3AsCisJCQkJCSAgc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3Byb2JlICphcDsKQEAgLTQzNCwxNSArNDYwLDI1IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtwcm9iZV9sb2NrLCBmbGFncyk7CiB9CiAKLWludCByZWdpc3Rlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGluX2twcm9iZXNfZnVuY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpZiAoYWRkciA+PSAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9zdGFydAorCQkmJiBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpX19rcHJvYmVzX3RleHRfZW5kKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlzdHJ1Y3Qga3Byb2JlICpvbGRfcDsKIAotCWlmICgocmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShwKSkgIT0gMCkgeworCWlmICgocmV0ID0gaW5fa3Byb2Jlc19mdW5jdGlvbnMoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCWlmICgocmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShwKSkgIT0gMCkKIAkJZ290byBybV9rcHJvYmU7Ci0JfQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmtwcm9iZV9sb2NrLCBmbGFncyk7CiAJb2xkX3AgPSBnZXRfa3Byb2JlKHAtPmFkZHIpOwogCXAtPm5taXNzZWQgPSAwOwpAQCAtNDY2LDcgKzUwMiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB1bnJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQordm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBrcHJvYmUgKm9sZF9wOwpAQCAtNDg3LDcgKzUyMyw3IEBACiAJLnByaW9yaXR5ID0gMHg3ZmZmZmZmZiAvKiB3ZSBuZWVkIHRvIG5vdGlmaWVkIGZpcnN0ICovCiB9OwogCi1pbnQgcmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCiB7CiAJLyogVG9kbzogVmVyaWZ5IHByb2JlcG9pbnQgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCAqLwogCWpwLT5rcC5wcmVfaGFuZGxlciA9IHNldGptcF9wcmVfaGFuZGxlcjsKQEAgLTQ5NiwxNCArNTMyLDE0IEBACiAJcmV0dXJuIHJlZ2lzdGVyX2twcm9iZSgmanAtPmtwKTsKIH0KIAotdm9pZCB1bnJlZ2lzdGVyX2pwcm9iZShzdHJ1Y3QganByb2JlICpqcCkKK3ZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfanByb2JlKHN0cnVjdCBqcHJvYmUgKmpwKQogewogCXVucmVnaXN0ZXJfa3Byb2JlKCZqcC0+a3ApOwogfQogCiAjaWZkZWYgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCiAKLWludCByZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICppbnN0OwpAQCAtNTQwLDE0ICs1NzYsMTQgQEAKIAogI2Vsc2UgLyogQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTICovCiAKLWludCByZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAogI2VuZGlmIC8qIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUyAqLwogCi12b2lkIHVucmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQordm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBjMzI5OTVmLi40YjM5ZDM3IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC0xNTA5LDYgKzE1MDksNyBAQAogCWxvbmcgZXJyID0gMDsKIAl2b2lkICpwZXJjcHUgPSBOVUxMLCAqcHRyID0gTlVMTDsgLyogU3RvcHMgc3B1cmlvdXMgZ2NjIHdhcm5pbmcgKi8KIAlzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpleHRhYmxlOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKIAlERUJVR1AoImxvYWRfbW9kdWxlOiB1bW9kPSVwLCBsZW49JWx1LCB1YXJncz0lcFxuIiwKIAkgICAgICAgdW1vZCwgbGVuLCB1YXJncyk7CkBAIC0xNzc5LDYgKzE3ODAsMjQgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBjbGVhbnVwOwogCisJLyogZmx1c2ggdGhlIGljYWNoZSBpbiBjb3JyZWN0IGNvbnRleHQgKi8KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8qCisJICogRmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlLCBzaW5jZSB3ZSd2ZSBwbGF5ZWQgd2l0aCB0ZXh0LgorCSAqIERvIGl0IGJlZm9yZSBwcm9jZXNzaW5nIG9mIG1vZHVsZSBwYXJhbWV0ZXJzLCBzbyB0aGUgbW9kdWxlCisJICogY2FuIHByb3ZpZGUgcGFyYW1ldGVyIGFjY2Vzc29yIGZ1bmN0aW9ucyBvZiBpdHMgb3duLgorCSAqLworCWlmIChtb2QtPm1vZHVsZV9pbml0KQorCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfaW5pdCwKKwkJCQkgICAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0CisJCQkJICAgKyBtb2QtPmluaXRfc2l6ZSk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUsCisJCQkgICAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlICsgbW9kLT5jb3JlX3NpemUpOworCisJc2V0X2ZzKG9sZF9mcyk7CisKIAltb2QtPmFyZ3MgPSBhcmdzOwogCWlmIChvYnNwYXJtaW5kZXgpIHsKIAkJZXJyID0gb2Jzb2xldGVfcGFyYW1zKG1vZC0+bmFtZSwgbW9kLT5hcmdzLApAQCAtMTg2MCw3ICsxODc5LDYgQEAKIAkJY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZDsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJaW50IHJldCA9IDA7CiAKIAkvKiBNdXN0IGhhdmUgcGVybWlzc2lvbiAqLwpAQCAtMTg3OCwxOSArMTg5Niw2IEBACiAJCXJldHVybiBQVFJfRVJSKG1vZCk7CiAJfQogCi0JLyogZmx1c2ggdGhlIGljYWNoZSBpbiBjb3JyZWN0IGNvbnRleHQgKi8KLQlzZXRfZnMoS0VSTkVMX0RTKTsKLQotCS8qIEZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSwgc2luY2Ugd2UndmUgcGxheWVkIHdpdGggdGV4dCAqLwotCWlmIChtb2QtPm1vZHVsZV9pbml0KQotCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfaW5pdCwKLQkJCQkgICAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0Ci0JCQkJICAgKyBtb2QtPmluaXRfc2l6ZSk7Ci0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUsCi0JCQkgICAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlICsgbW9kLT5jb3JlX3NpemUpOwotCi0Jc2V0X2ZzKG9sZF9mcyk7Ci0KIAkvKiBOb3cgc2V3IGl0IGludG8gdGhlIGxpc3RzLiAgVGhleSB3b24ndCBhY2Nlc3MgdXMsIHNpbmNlCiAgICAgICAgICAgIHN0cm9uZ190cnlfbW9kdWxlX2dldCgpIHdpbGwgZmFpbC4gKi8KIAlzdG9wX21hY2hpbmVfcnVuKF9fbGlua19tb2R1bGUsIG1vZCwgTlJfQ1BVUyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFyYW1zLmMgYi9rZXJuZWwvcGFyYW1zLmMKaW5kZXggZDU4NmMzNWVmLi5mYmYxNzMyIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFyYW1zLmMKKysrIGIva2VybmVsL3BhcmFtcy5jCkBAIC01NDIsOCArNTQyLDggQEAKIHsKIAlzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKm1rOwogCi0JbWsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbW9kdWxlX2tvYmplY3QpLCBHRlBfS0VSTkVMKTsKLQltZW1zZXQobWssIDAsIHNpemVvZihzdHJ1Y3QgbW9kdWxlX2tvYmplY3QpKTsKKwltayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb2R1bGVfa29iamVjdCksIEdGUF9LRVJORUwpOworCUJVR19PTighbWspOwogCiAJbWstPm1vZCA9IFRISVNfTU9EVUxFOwogCWtvYmpfc2V0X2tzZXRfcyhtaywgbW9kdWxlX3N1YnN5cyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggMzg3OThhMi4uYjdiNTMyYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtNDI3LDIxICs0MjcsMjMgQEAKIAl0aW1yLT5zaWdxLT5pbmZvLnNpX2NvZGUgPSBTSV9USU1FUjsKIAl0aW1yLT5zaWdxLT5pbmZvLnNpX3RpZCA9IHRpbXItPml0X2lkOwogCXRpbXItPnNpZ3EtPmluZm8uc2lfdmFsdWUgPSB0aW1yLT5pdF9zaWdldl92YWx1ZTsKKwogCWlmICh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiBTSUdFVl9USFJFQURfSUQpIHsKLQkJaWYgKHVubGlrZWx5KHRpbXItPml0X3Byb2Nlc3MtPmZsYWdzICYgUEZfRVhJVElORykpIHsKLQkJCXRpbXItPml0X3NpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKLQkJCXB1dF90YXNrX3N0cnVjdCh0aW1yLT5pdF9wcm9jZXNzKTsKLQkJCXRpbXItPml0X3Byb2Nlc3MgPSB0aW1yLT5pdF9wcm9jZXNzLT5ncm91cF9sZWFkZXI7Ci0JCQlnb3RvIGdyb3VwOwotCQl9Ci0JCXJldHVybiBzZW5kX3NpZ3F1ZXVlKHRpbXItPml0X3NpZ2V2X3NpZ25vLCB0aW1yLT5zaWdxLAotCQkJdGltci0+aXRfcHJvY2Vzcyk7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyOworCQlpbnQgcmV0ID0gc2VuZF9zaWdxdWV1ZSh0aW1yLT5pdF9zaWdldl9zaWdubywgdGltci0+c2lncSwKKwkJCQkJdGltci0+aXRfcHJvY2Vzcyk7CisKKwkJaWYgKGxpa2VseShyZXQgPj0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCXRpbXItPml0X3NpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKKwkJbGVhZGVyID0gdGltci0+aXRfcHJvY2Vzcy0+Z3JvdXBfbGVhZGVyOworCQlwdXRfdGFza19zdHJ1Y3QodGltci0+aXRfcHJvY2Vzcyk7CisJCXRpbXItPml0X3Byb2Nlc3MgPSBsZWFkZXI7CiAJfQotCWVsc2UgewotCWdyb3VwOgotCQlyZXR1cm4gc2VuZF9ncm91cF9zaWdxdWV1ZSh0aW1yLT5pdF9zaWdldl9zaWdubywgdGltci0+c2lncSwKLQkJCXRpbXItPml0X3Byb2Nlc3MpOwotCX0KKworCXJldHVybiBzZW5kX2dyb3VwX3NpZ3F1ZXVlKHRpbXItPml0X3NpZ2V2X3NpZ25vLCB0aW1yLT5zaWdxLAorCQkJCSAgIHRpbXItPml0X3Byb2Nlc3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG9zaXhfdGltZXJfZXZlbnQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDkxNzA2NmEuLjM5NmM3ODcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFBNCiAJYm9vbCAiUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IgorCWRlcGVuZHMgb24gIUlBNjRfSFBfU0lNCiAJLS0taGVscC0tLQogCSAgIlBvd2VyIE1hbmFnZW1lbnQiIG1lYW5zIHRoYXQgcGFydHMgb2YgeW91ciBjb21wdXRlciBhcmUgc2h1dAogCSAgb2ZmIG9yIHB1dCBpbnRvIGEgcG93ZXIgY29uc2VydmluZyAic2xlZXAiIG1vZGUgaWYgdGhleSBhcmUgbm90CkBAIC0yOCw3ICsyOSw3IEBACiAKIGNvbmZpZyBTT0ZUV0FSRV9TVVNQRU5ECiAJYm9vbCAiU29mdHdhcmUgU3VzcGVuZCIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQTSAmJiBTV0FQICYmICgoWDg2ICYmIFNNUCkgfHwgKChGVlIgfHwgUFBDMzIgfHwgWDg2KSAmJiAhU01QKSkKKwlkZXBlbmRzIG9uIFBNICYmIFNXQVAgJiYgKFg4NiB8fCAoKEZWUiB8fCBQUEMzMikgJiYgIVNNUCkpCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBwb3NzaWJpbGl0eSBvZiBzdXNwZW5kaW5nIHRoZSBtYWNoaW5lLgogCSAgSXQgZG9lc24ndCBuZWVkIEFQTS4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wbS5jIGIva2VybmVsL3Bvd2VyL3BtLmMKaW5kZXggNjFkZWRhMC4uMTU5MTQ5MyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3BtLmMKKysrIGIva2VybmVsL3Bvd2VyL3BtLmMKQEAgLTYwLDkgKzYwLDggQEAKIAkJCSAgIHVuc2lnbmVkIGxvbmcgaWQsCiAJCQkgICBwbV9jYWxsYmFjayBjYWxsYmFjaykKIHsKLQlzdHJ1Y3QgcG1fZGV2ICpkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG1fZGV2KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHBtX2RldiAqZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBtX2RldiksIEdGUF9LRVJORUwpOwogCWlmIChkZXYpIHsKLQkJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKIAkJZGV2LT50eXBlID0gdHlwZTsKIAkJZGV2LT5pZCA9IGlkOwogCQlkZXYtPmNhbGxiYWNrID0gY2FsbGJhY2s7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKaW5kZXggZWFhY2Q1Yy4uZDk2N2U4NyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jCisrKyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwpAQCAtMTA1OSw2ICsxMDU5LDcgQEAKIAlCVUdfT04oIWVycm9yKTsKIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCXJlc3RvcmVfaGlnaG1lbSgpOworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAlkZXZpY2VfcG93ZXJfdXAoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IDUwOTIzOTcuLmE5Njc2MDUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTUxNCw2ICs1MTQsOSBAQAogCXJldHVybiByOwogfQogCisvKiBjcHUgY3VycmVudGx5IGhvbGRpbmcgbG9nYnVmX2xvY2sgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcHJpbnRrX2NwdSA9IFVJTlRfTUFYOworCiBhc21saW5rYWdlIGludCB2cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01MjIsMTEgKzUyNSwxNSBAQAogCXN0YXRpYyBjaGFyIHByaW50a19idWZbMTAyNF07CiAJc3RhdGljIGludCBsb2dfbGV2ZWxfdW5rbm93biA9IDE7CiAKLQlpZiAodW5saWtlbHkob29wc19pbl9wcm9ncmVzcykpCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKHVubGlrZWx5KG9vcHNfaW5fcHJvZ3Jlc3MpICYmIHByaW50a19jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQkvKiBJZiBhIGNyYXNoIGlzIG9jY3VycmluZyBkdXJpbmcgcHJpbnRrKCkgb24gdGhpcyBDUFUsCisJCSAqIG1ha2Ugc3VyZSB3ZSBjYW4ndCBkZWFkbG9jayAqLwogCQl6YXBfbG9ja3MoKTsKIAogCS8qIFRoaXMgc3RvcHMgdGhlIGhvbGRlciBvZiBjb25zb2xlX3NlbSBqdXN0IHdoZXJlIHdlIHdhbnQgaGltICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisJcHJpbnRrX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCS8qIEVtaXQgdGhlIG91dHB1dCBpbnRvIHRoZSB0ZW1wb3JhcnkgYnVmZmVyICovCiAJcHJpbnRlZF9sZW4gPSB2c2NucHJpbnRmKHByaW50a19idWYsIHNpemVvZihwcmludGtfYnVmKSwgZm10LCBhcmdzKTsKQEAgLTU5NSw2ICs2MDIsNyBAQAogCQkgKiBDUFUgdW50aWwgaXQgaXMgb2ZmaWNpYWxseSB1cC4gIFdlIHNob3VsZG4ndCBiZSBjYWxsaW5nIGludG8KIAkJICogcmFuZG9tIGNvbnNvbGUgZHJpdmVycyBvbiBhIENQVSB3aGljaCBkb2Vzbid0IGV4aXN0IHlldC4uCiAJCSAqLworCQlwcmludGtfY3B1ID0gVUlOVF9NQVg7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTYwNCw2ICs2MTIsNyBAQAogCQkgKiBXZSBvd24gdGhlIGRyaXZlcnMuICBXZSBjYW4gZHJvcCB0aGUgc3BpbmxvY2sgYW5kIGxldAogCQkgKiByZWxlYXNlX2NvbnNvbGVfc2VtKCkgcHJpbnQgdGhlIHRleHQKIAkJICovCisJCXByaW50a19jcHUgPSBVSU5UX01BWDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKIAkJY29uc29sZV9tYXlfc2NoZWR1bGUgPSAwOwogCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CkBAIC02MTMsOSArNjIyLDExIEBACiAJCSAqIGFsbG93cyB0aGUgc2VtYXBob3JlIGhvbGRlciB0byBwcm9jZWVkIGFuZCB0byBjYWxsIHRoZQogCQkgKiBjb25zb2xlIGRyaXZlcnMgd2l0aCB0aGUgb3V0cHV0IHdoaWNoIHdlIGp1c3QgcHJvZHVjZWQuCiAJCSAqLworCQlwcmludGtfY3B1ID0gVUlOVF9NQVg7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CiAJfQogb3V0OgorCXByZWVtcHRfZW5hYmxlKCk7CiAJcmV0dXJuIHByaW50ZWRfbGVuOwogfQogRVhQT1JUX1NZTUJPTChwcmludGspOwpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IDhkY2I4ZjYuLjAxOWUwNGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTExOCw2ICsxMTgsMzMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG1heV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWlmICghdGFzay0+bW0pCisJCXJldHVybiAtRVBFUk07CisJaWYgKCgoY3VycmVudC0+dWlkICE9IHRhc2stPmV1aWQpIHx8CisJICAgICAoY3VycmVudC0+dWlkICE9IHRhc2stPnN1aWQpIHx8CisJICAgICAoY3VycmVudC0+dWlkICE9IHRhc2stPnVpZCkgfHwKKwkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+ZWdpZCkgfHwKKwkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+c2dpZCkgfHwKKwkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+Z2lkKSkgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQorCQlyZXR1cm4gLUVQRVJNOworCXNtcF9ybWIoKTsKKwlpZiAoIXRhc2stPm1tLT5kdW1wYWJsZSAmJiAhY2FwYWJsZShDQVBfU1lTX1BUUkFDRSkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gc2VjdXJpdHlfcHRyYWNlKGN1cnJlbnQsIHRhc2spOworfQorCitpbnQgcHRyYWNlX21heV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWludCBlcnI7CisJdGFza19sb2NrKHRhc2spOworCWVyciA9IG1heV9hdHRhY2godGFzayk7CisJdGFza191bmxvY2sodGFzayk7CisJcmV0dXJuICFlcnI7Cit9CisKIGludCBwdHJhY2VfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlpbnQgcmV0dmFsOwpAQCAtMTI3LDIyICsxNTQsMTAgQEAKIAkJZ290byBiYWQ7CiAJaWYgKHRhc2sgPT0gY3VycmVudCkKIAkJZ290byBiYWQ7Ci0JaWYgKCF0YXNrLT5tbSkKLQkJZ290byBiYWQ7Ci0JaWYoKChjdXJyZW50LT51aWQgIT0gdGFzay0+ZXVpZCkgfHwKLQkgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5zdWlkKSB8fAotCSAgICAoY3VycmVudC0+dWlkICE9IHRhc2stPnVpZCkgfHwKLSAJICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+ZWdpZCkgfHwKLSAJICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+c2dpZCkgfHwKLSAJICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+Z2lkKSkgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQotCQlnb3RvIGJhZDsKLQlzbXBfcm1iKCk7Ci0JaWYgKCF0YXNrLT5tbS0+ZHVtcGFibGUgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQotCQlnb3RvIGJhZDsKIAkvKiB0aGUgc2FtZSBwcm9jZXNzIGNhbm5vdCBiZSBhdHRhY2hlZCBtYW55IHRpbWVzICovCiAJaWYgKHRhc2stPnB0cmFjZSAmIFBUX1BUUkFDRUQpCiAJCWdvdG8gYmFkOwotCXJldHZhbCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LCB0YXNrKTsKKwlyZXR2YWwgPSBtYXlfYXR0YWNoKHRhc2spOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gYmFkOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1cGRhdGUuYyBiL2tlcm5lbC9yY3VwZGF0ZS5jCmluZGV4IGY0MzY5OTMuLmJlZjNiNjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3VwZGF0ZS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXJlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAvKiBEZWZpbml0aW9uIGZvciByY3VwZGF0ZSBjb250cm9sIGJsb2NrLiAqLwpAQCAtNzIsNiArNzMsMTkgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QsIHJjdV90YXNrbGV0KSA9IHtOVUxMfTsKIHN0YXRpYyBpbnQgbWF4YmF0Y2ggPSAxMDsKIAorI2lmbmRlZiBfX0hBVkVfQVJDSF9DTVBYQ0hHCisvKgorICogV2UgdXNlIGFuIGFycmF5IG9mIHNwaW5sb2NrcyBmb3IgdGhlIHJjdXJlZnMgLS0gc2ltaWxhciB0byBvbmVzIGluIHNwYXJjCisgKiAzMiBiaXQgYXRvbWljX3QgaW1wbGVtZW50YXRpb25zLCBhbmQgYSBoYXNoIGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhhdAorICogZm9yIG91ciByZWZjb3VudGluZyBuZWVkcy4KKyAqIENhbid0IGhlbHAgbXVsdGlwcm9jZXNzb3JzIHdoaWNoIGRvbm90IGhhdmUgY21weGNoZyA6KAorICovCisKK3NwaW5sb2NrX3QgX19yY3VyZWZfaGFzaFtSQ1VSRUZfSEFTSF9TSVpFXSA9IHsKKwlbMCAuLi4gKFJDVVJFRl9IQVNIX1NJWkUtMSldID0gU1BJTl9MT0NLX1VOTE9DS0VECit9OworI2VuZGlmCisKIC8qKgogICogY2FsbF9yY3UgLSBRdWV1ZSBhbiBSQ1UgY2FsbGJhY2sgZm9yIGludm9jYXRpb24gYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCiAgKiBAaGVhZDogc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yIHF1ZXVlaW5nIHRoZSBSQ1UgdXBkYXRlcy4KZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNvdXJjZS5jIGIva2VybmVsL3Jlc291cmNlLmMKaW5kZXggMjY5NjdlMC4uOTIyODVkOCAxMDA2NDQKLS0tIGEva2VybmVsL3Jlc291cmNlLmMKKysrIGIva2VybmVsL3Jlc291cmNlLmMKQEAgLTQzMCwxMCArNDMwLDkgQEAKICAqLwogc3RydWN0IHJlc291cmNlICogX19yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBuLCBjb25zdCBjaGFyICpuYW1lKQogewotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0ga21hbGxvYyhzaXplb2YoKnJlcyksIEdGUF9LRVJORUwpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0ga3phbGxvYyhzaXplb2YoKnJlcyksIEdGUF9LRVJORUwpOwogCiAJaWYgKHJlcykgewotCQltZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOwogCQlyZXMtPm5hbWUgPSBuYW1lOwogCQlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJCXJlcy0+ZW5kID0gc3RhcnQgKyBuIC0gMTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggNWY4ODlkMC4uZGJkNDQ5MCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTg3NSw3ICs4NzUsNyBAQAogICogc21wX2NhbGxfZnVuY3Rpb24oKSBpZiBhbiBJUEkgaXMgc2VudCBieSB0aGUgc2FtZSBwcm9jZXNzIHdlIGFyZQogICogd2FpdGluZyB0byBiZWNvbWUgaW5hY3RpdmUuCiAgKi8KLXZvaWQgd2FpdF90YXNrX2luYWN0aXZlKHRhc2tfdCAqIHApCit2b2lkIHdhaXRfdGFza19pbmFjdGl2ZSh0YXNrX3QgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlydW5xdWV1ZV90ICpycTsKQEAgLTk2Niw4ICs5NjYsMTEgQEAKIAkJaW50IGxvY2FsX2dyb3VwOwogCQlpbnQgaTsKIAorCQkvKiBTa2lwIG92ZXIgdGhpcyBncm91cCBpZiBpdCBoYXMgbm8gQ1BVcyBhbGxvd2VkICovCisJCWlmICghY3B1c19pbnRlcnNlY3RzKGdyb3VwLT5jcHVtYXNrLCBwLT5jcHVzX2FsbG93ZWQpKQorCQkJZ290byBuZXh0Z3JvdXA7CisKIAkJbG9jYWxfZ3JvdXAgPSBjcHVfaXNzZXQodGhpc19jcHUsIGdyb3VwLT5jcHVtYXNrKTsKLQkJLyogWFhYOiBwdXQgYSBjcHVzIGFsbG93ZWQgY2hlY2sgKi8KIAogCQkvKiBUYWxseSB1cCB0aGUgbG9hZCBvZiBhbGwgQ1BVcyBpbiB0aGUgZ3JvdXAgKi8KIAkJYXZnX2xvYWQgPSAwOwpAQCAtOTkyLDYgKzk5NSw3IEBACiAJCQltaW5fbG9hZCA9IGF2Z19sb2FkOwogCQkJaWRsZXN0ID0gZ3JvdXA7CiAJCX0KK25leHRncm91cDoKIAkJZ3JvdXAgPSBncm91cC0+bmV4dDsKIAl9IHdoaWxlIChncm91cCAhPSBzZC0+Z3JvdXBzKTsKIApAQCAtMTAwMywxMyArMTAwNywxOCBAQAogLyoKICAqIGZpbmRfaWRsZXN0X3F1ZXVlIC0gZmluZCB0aGUgaWRsZXN0IHJ1bnF1ZXVlIGFtb25nIHRoZSBjcHVzIGluIGdyb3VwLgogICovCi1zdGF0aWMgaW50IGZpbmRfaWRsZXN0X2NwdShzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwLCBpbnQgdGhpc19jcHUpCitzdGF0aWMgaW50CitmaW5kX2lkbGVzdF9jcHUoc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgdGhpc19jcHUpCiB7CisJY3B1bWFza190IHRtcDsKIAl1bnNpZ25lZCBsb25nIGxvYWQsIG1pbl9sb2FkID0gVUxPTkdfTUFYOwogCWludCBpZGxlc3QgPSAtMTsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX2NwdV9tYXNrKGksIGdyb3VwLT5jcHVtYXNrKSB7CisJLyogVHJhdmVyc2Ugb25seSB0aGUgYWxsb3dlZCBDUFVzICovCisJY3B1c19hbmQodG1wLCBncm91cC0+Y3B1bWFzaywgcC0+Y3B1c19hbGxvd2VkKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGksIHRtcCkgewogCQlsb2FkID0gc291cmNlX2xvYWQoaSwgMCk7CiAKIAkJaWYgKGxvYWQgPCBtaW5fbG9hZCB8fCAobG9hZCA9PSBtaW5fbG9hZCAmJiBpID09IHRoaXNfY3B1KSkgewpAQCAtMTA1Miw3ICsxMDYxLDcgQEAKIAkJaWYgKCFncm91cCkKIAkJCWdvdG8gbmV4dGxldmVsOwogCi0JCW5ld19jcHUgPSBmaW5kX2lkbGVzdF9jcHUoZ3JvdXAsIGNwdSk7CisJCW5ld19jcHUgPSBmaW5kX2lkbGVzdF9jcHUoZ3JvdXAsIHQsIGNwdSk7CiAJCWlmIChuZXdfY3B1ID09IC0xIHx8IG5ld19jcHUgPT0gY3B1KQogCQkJZ290byBuZXh0bGV2ZWw7CiAKQEAgLTExMjcsNyArMTEzNiw3IEBACiAgKgogICogcmV0dXJucyBmYWlsdXJlIG9ubHkgaWYgdGhlIHRhc2sgaXMgYWxyZWFkeSBhY3RpdmUuCiAgKi8KLXN0YXRpYyBpbnQgdHJ5X3RvX3dha2VfdXAodGFza190ICogcCwgdW5zaWduZWQgaW50IHN0YXRlLCBpbnQgc3luYykKK3N0YXRpYyBpbnQgdHJ5X3RvX3dha2VfdXAodGFza190ICpwLCB1bnNpZ25lZCBpbnQgc3RhdGUsIGludCBzeW5jKQogewogCWludCBjcHUsIHRoaXNfY3B1LCBzdWNjZXNzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTI1Miw2ICsxMjYxLDE2IEBACiAJfQogCiAJLyoKKwkgKiBUYXNrcyB0aGF0IGhhdmUgbWFya2VkIHRoZWlyIHNsZWVwIGFzIG5vbmludGVyYWN0aXZlIGdldAorCSAqIHdva2VuIHVwIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgc2xlZXAgYXZlcmFnZS4gKGkuZS4gdGhlaXIKKwkgKiBzbGVlcCBpcyBoYW5kbGVkIGluIGEgcHJpb3JpdHktbmV1dHJhbCBtYW5uZXIsIG5vIHByaW9yaXR5CisJICogYm9vc3QgYW5kIG5vIHBlbmFsdHkuKQorCSAqLworCWlmIChvbGRfc3RhdGUgJiBUQVNLX05PTklOVEVSQUNUSVZFKQorCQlfX2FjdGl2YXRlX3Rhc2socCwgcnEpOworCWVsc2UKKwkJYWN0aXZhdGVfdGFzayhwLCBycSwgY3B1ID09IHRoaXNfY3B1KTsKKwkvKgogCSAqIFN5bmMgd2FrZXVwcyAoaS5lLiB0aG9zZSB0eXBlcyBvZiB3YWtldXBzIHdoZXJlIHRoZSB3YWtlcgogCSAqIGhhcyBpbmRpY2F0ZWQgdGhhdCBpdCB3aWxsIGxlYXZlIHRoZSBDUFUgaW4gc2hvcnQgb3JkZXIpCiAJICogZG9uJ3QgdHJpZ2dlciBhIHByZWVtcHRpb24sIGlmIHRoZSB3b2tlbiB1cCB0YXNrIHdpbGwgcnVuIG9uCkBAIC0xMjU5LDcgKzEyNzgsNiBAQAogCSAqIHRoZSB3YWtlciBndWFyYW50ZWVzIHRoYXQgdGhlIGZyZXNobHkgd29rZW4gdXAgdGFzayBpcyBnb2luZwogCSAqIHRvIGJlIGNvbnNpZGVyZWQgb24gdGhpcyBDUFUuKQogCSAqLwotCWFjdGl2YXRlX3Rhc2socCwgcnEsIGNwdSA9PSB0aGlzX2NwdSk7CiAJaWYgKCFzeW5jIHx8IGNwdSAhPSB0aGlzX2NwdSkgewogCQlpZiAoVEFTS19QUkVFTVBUU19DVVJSKHAsIHJxKSkKIAkJCXJlc2NoZWRfdGFzayhycS0+Y3Vycik7CkBAIC0xMjc0LDcgKzEyOTIsNyBAQAogCXJldHVybiBzdWNjZXNzOwogfQogCi1pbnQgZmFzdGNhbGwgd2FrZV91cF9wcm9jZXNzKHRhc2tfdCAqIHApCitpbnQgZmFzdGNhbGwgd2FrZV91cF9wcm9jZXNzKHRhc2tfdCAqcCkKIHsKIAlyZXR1cm4gdHJ5X3RvX3dha2VfdXAocCwgVEFTS19TVE9QUEVEIHwgVEFTS19UUkFDRUQgfAogCQkJCSBUQVNLX0lOVEVSUlVQVElCTEUgfCBUQVNLX1VOSU5URVJSVVBUSUJMRSwgMCk7CkBAIC0xMzUzLDcgKzEzNzEsNyBAQAogICogdGhhdCBtdXN0IGJlIGRvbmUgZm9yIGV2ZXJ5IG5ld2x5IGNyZWF0ZWQgY29udGV4dCwgdGhlbiBwdXRzIHRoZSB0YXNrCiAgKiBvbiB0aGUgcnVucXVldWUgYW5kIHdha2VzIGl0LgogICovCi12b2lkIGZhc3RjYWxsIHdha2VfdXBfbmV3X3Rhc2sodGFza190ICogcCwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncykKK3ZvaWQgZmFzdGNhbGwgd2FrZV91cF9uZXdfdGFzayh0YXNrX3QgKnAsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdGhpc19jcHUsIGNwdTsKQEAgLTE0MzYsNyArMTQ1NCw3IEBACiAgKiBhcnRpZmljaWFsbHksIGJlY2F1c2UgYW55IHRpbWVzbGljZSByZWNvdmVyZWQgaGVyZQogICogd2FzIGdpdmVuIGF3YXkgYnkgdGhlIHBhcmVudCBpbiB0aGUgZmlyc3QgcGxhY2UuKQogICovCi12b2lkIGZhc3RjYWxsIHNjaGVkX2V4aXQodGFza190ICogcCkKK3ZvaWQgZmFzdGNhbGwgc2NoZWRfZXhpdCh0YXNrX3QgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlydW5xdWV1ZV90ICpycTsKQEAgLTE0NzgsNiArMTQ5Niw3IEBACiAKIC8qKgogICogZmluaXNoX3Rhc2tfc3dpdGNoIC0gY2xlYW4gdXAgYWZ0ZXIgYSB0YXNrLXN3aXRjaAorICogQHJxOiBydW5xdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGFzay1zd2l0Y2gKICAqIEBwcmV2OiB0aGUgdGhyZWFkIHdlIGp1c3Qgc3dpdGNoZWQgYXdheSBmcm9tLgogICoKICAqIGZpbmlzaF90YXNrX3N3aXRjaCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgY29udGV4dCBzd2l0Y2gsIHBhaXJlZApAQCAtMTUxMCw2ICsxNTI5LDEwIEBACiAJICoJCU1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CiAJICovCiAJcHJldl90YXNrX2ZsYWdzID0gcHJldi0+ZmxhZ3M7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLCisJLyogdGhpcyBpcyBhIHZhbGlkIGNhc2Ugd2hlbiBhbm90aGVyIHRhc2sgcmVsZWFzZXMgdGhlIHNwaW5sb2NrICovCisJcnEtPmxvY2sub3duZXIgPSBjdXJyZW50OworI2VuZGlmCiAJZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpOwogCWZpbmlzaF9sb2NrX3N3aXRjaChycSwgcHJldik7CiAJaWYgKG1tKQpAQCAtMTc1Miw3ICsxNzc1LDggQEAKICAqLwogc3RhdGljIGlubGluZQogaW50IGNhbl9taWdyYXRlX3Rhc2sodGFza190ICpwLCBydW5xdWV1ZV90ICpycSwgaW50IHRoaXNfY3B1LAotCSAgICAgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGVudW0gaWRsZV90eXBlIGlkbGUsIGludCAqYWxsX3Bpbm5lZCkKKwkJICAgICBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgZW51bSBpZGxlX3R5cGUgaWRsZSwKKwkJICAgICBpbnQgKmFsbF9waW5uZWQpCiB7CiAJLyoKIAkgKiBXZSBkbyBub3QgbWlncmF0ZSB0YXNrcyB0aGF0IGFyZToKQEAgLTE4ODIsMTAgKzE5MDYsMTEgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCAqCiBmaW5kX2J1c2llc3RfZ3JvdXAoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCB0aGlzX2NwdSwKLQkJICAgdW5zaWduZWQgbG9uZyAqaW1iYWxhbmNlLCBlbnVtIGlkbGVfdHlwZSBpZGxlKQorCQkgICB1bnNpZ25lZCBsb25nICppbWJhbGFuY2UsIGVudW0gaWRsZV90eXBlIGlkbGUsIGludCAqc2RfaWRsZSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmJ1c2llc3QgPSBOVUxMLCAqdGhpcyA9IE5VTEwsICpncm91cCA9IHNkLT5ncm91cHM7CiAJdW5zaWduZWQgbG9uZyBtYXhfbG9hZCwgYXZnX2xvYWQsIHRvdGFsX2xvYWQsIHRoaXNfbG9hZCwgdG90YWxfcHdyOworCXVuc2lnbmVkIGxvbmcgbWF4X3B1bGw7CiAJaW50IGxvYWRfaWR4OwogCiAJbWF4X2xvYWQgPSB0aGlzX2xvYWQgPSB0b3RhbF9sb2FkID0gdG90YWxfcHdyID0gMDsKQEAgLTE5MDcsNiArMTkzMiw5IEBACiAJCWF2Z19sb2FkID0gMDsKIAogCQlmb3JfZWFjaF9jcHVfbWFzayhpLCBncm91cC0+Y3B1bWFzaykgeworCQkJaWYgKCpzZF9pZGxlICYmICFpZGxlX2NwdShpKSkKKwkJCQkqc2RfaWRsZSA9IDA7CisKIAkJCS8qIEJpYXMgYmFsYW5jaW5nIHRvd2FyZCBjcHVzIG9mIG91ciBkb21haW4gKi8KIAkJCWlmIChsb2NhbF9ncm91cCkKIAkJCQlsb2FkID0gdGFyZ2V0X2xvYWQoaSwgbG9hZF9pZHgpOwpAQCAtMTkzMiw3ICsxOTYwLDcgQEAKIAkJZ3JvdXAgPSBncm91cC0+bmV4dDsKIAl9IHdoaWxlIChncm91cCAhPSBzZC0+Z3JvdXBzKTsKIAotCWlmICghYnVzaWVzdCB8fCB0aGlzX2xvYWQgPj0gbWF4X2xvYWQpCisJaWYgKCFidXNpZXN0IHx8IHRoaXNfbG9hZCA+PSBtYXhfbG9hZCB8fCBtYXhfbG9hZCA8PSBTQ0hFRF9MT0FEX1NDQUxFKQogCQlnb3RvIG91dF9iYWxhbmNlZDsKIAogCWF2Z19sb2FkID0gKFNDSEVEX0xPQURfU0NBTEUgKiB0b3RhbF9sb2FkKSAvIHRvdGFsX3B3cjsKQEAgLTE5NTIsOCArMTk4MCwxMiBAQAogCSAqIGJ5IHB1bGxpbmcgdGFza3MgdG8gdXMuICBCZSBjYXJlZnVsIG9mIG5lZ2F0aXZlIG51bWJlcnMgYXMgdGhleSdsbAogCSAqIGFwcGVhciBhcyB2ZXJ5IGxhcmdlIHZhbHVlcyB3aXRoIHVuc2lnbmVkIGxvbmdzLgogCSAqLworCisJLyogRG9uJ3Qgd2FudCB0byBwdWxsIHNvIG1hbnkgdGFza3MgdGhhdCBhIGdyb3VwIHdvdWxkIGdvIGlkbGUgKi8KKwltYXhfcHVsbCA9IG1pbihtYXhfbG9hZCAtIGF2Z19sb2FkLCBtYXhfbG9hZCAtIFNDSEVEX0xPQURfU0NBTEUpOworCiAJLyogSG93IG11Y2ggbG9hZCB0byBhY3R1YWxseSBtb3ZlIHRvIGVxdWFsaXNlIHRoZSBpbWJhbGFuY2UgKi8KLQkqaW1iYWxhbmNlID0gbWluKChtYXhfbG9hZCAtIGF2Z19sb2FkKSAqIGJ1c2llc3QtPmNwdV9wb3dlciwKKwkqaW1iYWxhbmNlID0gbWluKG1heF9wdWxsICogYnVzaWVzdC0+Y3B1X3Bvd2VyLAogCQkJCShhdmdfbG9hZCAtIHRoaXNfbG9hZCkgKiB0aGlzLT5jcHVfcG93ZXIpCiAJCQkvIFNDSEVEX0xPQURfU0NBTEU7CiAKQEAgLTIwNTAsMTEgKzIwODIsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGltYmFsYW5jZTsKIAlpbnQgbnJfbW92ZWQsIGFsbF9waW5uZWQgPSAwOwogCWludCBhY3RpdmVfYmFsYW5jZSA9IDA7CisJaW50IHNkX2lkbGUgPSAwOwogCi0Jc3Bpbl9sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKKwlpZiAoaWRsZSAhPSBOT1RfSURMRSAmJiBzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikKKwkJc2RfaWRsZSA9IDE7CisKIAlzY2hlZHN0YXRfaW5jKHNkLCBsYl9jbnRbaWRsZV0pOwogCi0JZ3JvdXAgPSBmaW5kX2J1c2llc3RfZ3JvdXAoc2QsIHRoaXNfY3B1LCAmaW1iYWxhbmNlLCBpZGxlKTsKKwlncm91cCA9IGZpbmRfYnVzaWVzdF9ncm91cChzZCwgdGhpc19jcHUsICZpbWJhbGFuY2UsIGlkbGUsICZzZF9pZGxlKTsKIAlpZiAoIWdyb3VwKSB7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeWdbaWRsZV0pOwogCQlnb3RvIG91dF9iYWxhbmNlZDsKQEAgLTIwNzgsMTkgKzIxMTMsMTYgQEAKIAkJICogc3RpbGwgdW5iYWxhbmNlZC4gbnJfbW92ZWQgc2ltcGx5IHN0YXlzIHplcm8sIHNvIGl0IGlzCiAJCSAqIGNvcnJlY3RseSB0cmVhdGVkIGFzIGFuIGltYmFsYW5jZS4KIAkJICovCi0JCWRvdWJsZV9sb2NrX2JhbGFuY2UodGhpc19ycSwgYnVzaWVzdCk7CisJCWRvdWJsZV9ycV9sb2NrKHRoaXNfcnEsIGJ1c2llc3QpOwogCQlucl9tb3ZlZCA9IG1vdmVfdGFza3ModGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCi0JCQkJCQlpbWJhbGFuY2UsIHNkLCBpZGxlLAotCQkJCQkJJmFsbF9waW5uZWQpOwotCQlzcGluX3VubG9jaygmYnVzaWVzdC0+bG9jayk7CisJCQkJCWltYmFsYW5jZSwgc2QsIGlkbGUsICZhbGxfcGlubmVkKTsKKwkJZG91YmxlX3JxX3VubG9jayh0aGlzX3JxLCBidXNpZXN0KTsKIAogCQkvKiBBbGwgdGFza3Mgb24gdGhpcyBydW5xdWV1ZSB3ZXJlIHBpbm5lZCBieSBDUFUgYWZmaW5pdHkgKi8KIAkJaWYgKHVubGlrZWx5KGFsbF9waW5uZWQpKQogCQkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnRoaXNfcnEtPmxvY2spOwotCiAJaWYgKCFucl9tb3ZlZCkgewogCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9mYWlsZWRbaWRsZV0pOwogCQlzZC0+bnJfYmFsYW5jZV9mYWlsZWQrKzsKQEAgLTIwOTgsNiArMjEzMCwxNiBAQAogCQlpZiAodW5saWtlbHkoc2QtPm5yX2JhbGFuY2VfZmFpbGVkID4gc2QtPmNhY2hlX25pY2VfdHJpZXMrMikpIHsKIAogCQkJc3Bpbl9sb2NrKCZidXNpZXN0LT5sb2NrKTsKKworCQkJLyogZG9uJ3Qga2ljayB0aGUgbWlncmF0aW9uX3RocmVhZCwgaWYgdGhlIGN1cnIKKwkJCSAqIHRhc2sgb24gYnVzaWVzdCBjcHUgY2FuJ3QgYmUgbW92ZWQgdG8gdGhpc19jcHUKKwkJCSAqLworCQkJaWYgKCFjcHVfaXNzZXQodGhpc19jcHUsIGJ1c2llc3QtPmN1cnItPmNwdXNfYWxsb3dlZCkpIHsKKwkJCQlzcGluX3VubG9jaygmYnVzaWVzdC0+bG9jayk7CisJCQkJYWxsX3Bpbm5lZCA9IDE7CisJCQkJZ290byBvdXRfb25lX3Bpbm5lZDsKKwkJCX0KKwogCQkJaWYgKCFidXNpZXN0LT5hY3RpdmVfYmFsYW5jZSkgewogCQkJCWJ1c2llc3QtPmFjdGl2ZV9iYWxhbmNlID0gMTsKIAkJCQlidXNpZXN0LT5wdXNoX2NwdSA9IHRoaXNfY3B1OwpAQCAtMjEzMCwxOSArMjE3MiwyMyBAQAogCQkJc2QtPmJhbGFuY2VfaW50ZXJ2YWwgKj0gMjsKIAl9CiAKKwlpZiAoIW5yX21vdmVkICYmICFzZF9pZGxlICYmIHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKQorCQlyZXR1cm4gLTE7CiAJcmV0dXJuIG5yX21vdmVkOwogCiBvdXRfYmFsYW5jZWQ6Ci0Jc3Bpbl91bmxvY2soJnRoaXNfcnEtPmxvY2spOwotCiAJc2NoZWRzdGF0X2luYyhzZCwgbGJfYmFsYW5jZWRbaWRsZV0pOwogCiAJc2QtPm5yX2JhbGFuY2VfZmFpbGVkID0gMDsKKworb3V0X29uZV9waW5uZWQ6CiAJLyogdHVuZSB1cCB0aGUgYmFsYW5jaW5nIGludGVydmFsICovCiAJaWYgKChhbGxfcGlubmVkICYmIHNkLT5iYWxhbmNlX2ludGVydmFsIDwgTUFYX1BJTk5FRF9JTlRFUlZBTCkgfHwKIAkJCShzZC0+YmFsYW5jZV9pbnRlcnZhbCA8IHNkLT5tYXhfaW50ZXJ2YWwpKQogCQlzZC0+YmFsYW5jZV9pbnRlcnZhbCAqPSAyOwogCisJaWYgKCFzZF9pZGxlICYmIHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKQorCQlyZXR1cm4gLTE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNjAsOSArMjIwNiwxMyBAQAogCXJ1bnF1ZXVlX3QgKmJ1c2llc3QgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgaW1iYWxhbmNlOwogCWludCBucl9tb3ZlZCA9IDA7CisJaW50IHNkX2lkbGUgPSAwOworCisJaWYgKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKQorCQlzZF9pZGxlID0gMTsKIAogCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2NudFtORVdMWV9JRExFXSk7Ci0JZ3JvdXAgPSBmaW5kX2J1c2llc3RfZ3JvdXAoc2QsIHRoaXNfY3B1LCAmaW1iYWxhbmNlLCBORVdMWV9JRExFKTsKKwlncm91cCA9IGZpbmRfYnVzaWVzdF9ncm91cChzZCwgdGhpc19jcHUsICZpbWJhbGFuY2UsIE5FV0xZX0lETEUsICZzZF9pZGxlKTsKIAlpZiAoIWdyb3VwKSB7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeWdbTkVXTFlfSURMRV0pOwogCQlnb3RvIG91dF9iYWxhbmNlZDsKQEAgLTIxNzYsMjIgKzIyMjYsMzAgQEAKIAogCUJVR19PTihidXNpZXN0ID09IHRoaXNfcnEpOwogCi0JLyogQXR0ZW1wdCB0byBtb3ZlIHRhc2tzICovCi0JZG91YmxlX2xvY2tfYmFsYW5jZSh0aGlzX3JxLCBidXNpZXN0KTsKLQogCXNjaGVkc3RhdF9hZGQoc2QsIGxiX2ltYmFsYW5jZVtORVdMWV9JRExFXSwgaW1iYWxhbmNlKTsKLQlucl9tb3ZlZCA9IG1vdmVfdGFza3ModGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCisKKwlucl9tb3ZlZCA9IDA7CisJaWYgKGJ1c2llc3QtPm5yX3J1bm5pbmcgPiAxKSB7CisJCS8qIEF0dGVtcHQgdG8gbW92ZSB0YXNrcyAqLworCQlkb3VibGVfbG9ja19iYWxhbmNlKHRoaXNfcnEsIGJ1c2llc3QpOworCQlucl9tb3ZlZCA9IG1vdmVfdGFza3ModGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCiAJCQkJCWltYmFsYW5jZSwgc2QsIE5FV0xZX0lETEUsIE5VTEwpOwotCWlmICghbnJfbW92ZWQpCisJCXNwaW5fdW5sb2NrKCZidXNpZXN0LT5sb2NrKTsKKwl9CisKKwlpZiAoIW5yX21vdmVkKSB7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2ZhaWxlZFtORVdMWV9JRExFXSk7Ci0JZWxzZQorCQlpZiAoIXNkX2lkbGUgJiYgc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlCiAJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CiAKLQlzcGluX3VubG9jaygmYnVzaWVzdC0+bG9jayk7CiAJcmV0dXJuIG5yX21vdmVkOwogCiBvdXRfYmFsYW5jZWQ6CiAJc2NoZWRzdGF0X2luYyhzZCwgbGJfYmFsYW5jZWRbTkVXTFlfSURMRV0pOworCWlmICghc2RfaWRsZSAmJiBzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVQT1dFUikKKwkJcmV0dXJuIC0xOwogCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzE2LDcgKzIzNzQsMTEgQEAKIAogCQlpZiAoaiAtIHNkLT5sYXN0X2JhbGFuY2UgPj0gaW50ZXJ2YWwpIHsKIAkJCWlmIChsb2FkX2JhbGFuY2UodGhpc19jcHUsIHRoaXNfcnEsIHNkLCBpZGxlKSkgewotCQkJCS8qIFdlJ3ZlIHB1bGxlZCB0YXNrcyBvdmVyIHNvIG5vIGxvbmdlciBpZGxlICovCisJCQkJLyoKKwkJCQkgKiBXZSd2ZSBwdWxsZWQgdGFza3Mgb3ZlciBzbyBlaXRoZXIgd2UncmUgbm8KKwkJCQkgKiBsb25nZXIgaWRsZSwgb3Igb25lIG9mIG91ciBTTVQgc2libGluZ3MgaXMKKwkJCQkgKiBub3QgaWRsZS4KKwkJCQkgKi8KIAkJCQlpZGxlID0gTk9UX0lETEU7CiAJCQl9CiAJCQlzZC0+bGFzdF9iYWxhbmNlICs9IGludGVydmFsOwpAQCAtMjU3NSw2ICsyNjM3LDEzIEBACiB9CiAKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCitzdGF0aWMgaW5saW5lIHZvaWQgd2FrZXVwX2J1c3lfcnVucXVldWUocnVucXVldWVfdCAqcnEpCit7CisJLyogSWYgYW4gU01UIHJ1bnF1ZXVlIGlzIHNsZWVwaW5nIGR1ZSB0byBwcmlvcml0eSByZWFzb25zIHdha2UgaXQgdXAgKi8KKwlpZiAocnEtPmN1cnIgPT0gcnEtPmlkbGUgJiYgcnEtPm5yX3J1bm5pbmcpCisJCXJlc2NoZWRfdGFzayhycS0+aWRsZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWtlX3NsZWVwaW5nX2RlcGVuZGVudChpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqdG1wLCAqc2QgPSBOVUxMOwpAQCAtMjYwOCwxMiArMjY3Nyw3IEBACiAJZm9yX2VhY2hfY3B1X21hc2soaSwgc2libGluZ19tYXApIHsKIAkJcnVucXVldWVfdCAqc210X3JxID0gY3B1X3JxKGkpOwogCi0JCS8qCi0JCSAqIElmIGFuIFNNVCBzaWJsaW5nIHRhc2sgaXMgc2xlZXBpbmcgZHVlIHRvIHByaW9yaXR5Ci0JCSAqIHJlYXNvbnMgd2FrZSBpdCB1cCBub3cuCi0JCSAqLwotCQlpZiAoc210X3JxLT5jdXJyID09IHNtdF9ycS0+aWRsZSAmJiBzbXRfcnEtPm5yX3J1bm5pbmcpCi0JCQlyZXNjaGVkX3Rhc2soc210X3JxLT5pZGxlKTsKKwkJd2FrZXVwX2J1c3lfcnVucXVldWUoc210X3JxKTsKIAl9CiAKIAlmb3JfZWFjaF9jcHVfbWFzayhpLCBzaWJsaW5nX21hcCkKQEAgLTI2MjQsNiArMjY4OCwxNiBAQAogCSAqLwogfQogCisvKgorICogbnVtYmVyIG9mICdsb3N0JyB0aW1lc2xpY2VzIHRoaXMgdGFzayB3b250IGJlIGFibGUgdG8gZnVsbHkKKyAqIHV0aWxpemUsIGlmIGFub3RoZXIgdGFzayBydW5zIG9uIGEgc2libGluZy4gVGhpcyBtb2RlbHMgdGhlCisgKiBzbG93ZG93biBlZmZlY3Qgb2Ygb3RoZXIgdGFza3MgcnVubmluZyBvbiBzaWJsaW5nczoKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNtdF9zbGljZSh0YXNrX3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQoreworCXJldHVybiBwLT50aW1lX3NsaWNlICogKDEwMCAtIHNkLT5wZXJfY3B1X2dhaW4pIC8gMTAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBkZXBlbmRlbnRfc2xlZXBlcihpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqdG1wLCAqc2QgPSBOVUxMOwpAQCAtMjY2Nyw2ICsyNzQxLDEwIEBACiAJCXJ1bnF1ZXVlX3QgKnNtdF9ycSA9IGNwdV9ycShpKTsKIAkJdGFza190ICpzbXRfY3VyciA9IHNtdF9ycS0+Y3VycjsKIAorCQkvKiBLZXJuZWwgdGhyZWFkcyBkbyBub3QgcGFydGljaXBhdGUgaW4gZGVwZW5kZW50IHNsZWVwaW5nICovCisJCWlmICghcC0+bW0gfHwgIXNtdF9jdXJyLT5tbSB8fCBydF90YXNrKHApKQorCQkJZ290byBjaGVja19zbXRfdGFzazsKKwogCQkvKgogCQkgKiBJZiBhIHVzZXIgdGFzayB3aXRoIGxvd2VyIHN0YXRpYyBwcmlvcml0eSB0aGFuIHRoZQogCQkgKiBydW5uaW5nIHRhc2sgb24gdGhlIFNNVCBzaWJsaW5nIGlzIHRyeWluZyB0byBzY2hlZHVsZSwKQEAgLTI2NzUsMjEgKzI3NTMsNDUgQEAKIAkJICogdGFzayBmcm9tIHVzaW5nIGFuIHVuZmFpciBwcm9wb3J0aW9uIG9mIHRoZQogCQkgKiBwaHlzaWNhbCBjcHUncyByZXNvdXJjZXMuIC1jawogCQkgKi8KLQkJaWYgKCgoc210X2N1cnItPnRpbWVfc2xpY2UgKiAoMTAwIC0gc2QtPnBlcl9jcHVfZ2FpbikgLyAxMDApID4KLQkJCXRhc2tfdGltZXNsaWNlKHApIHx8IHJ0X3Rhc2soc210X2N1cnIpKSAmJgotCQkJcC0+bW0gJiYgc210X2N1cnItPm1tICYmICFydF90YXNrKHApKQotCQkJCXJldCA9IDE7CisJCWlmIChydF90YXNrKHNtdF9jdXJyKSkgeworCQkJLyoKKwkJCSAqIFdpdGggcmVhbCB0aW1lIHRhc2tzIHdlIHJ1biBub24tcnQgdGFza3Mgb25seQorCQkJICogcGVyX2NwdV9nYWluJSBvZiB0aGUgdGltZS4KKwkJCSAqLworCQkJaWYgKChqaWZmaWVzICUgREVGX1RJTUVTTElDRSkgPgorCQkJCShzZC0+cGVyX2NwdV9nYWluICogREVGX1RJTUVTTElDRSAvIDEwMCkpCisJCQkJCXJldCA9IDE7CisJCX0gZWxzZQorCQkJaWYgKHNtdF9jdXJyLT5zdGF0aWNfcHJpbyA8IHAtPnN0YXRpY19wcmlvICYmCisJCQkJIVRBU0tfUFJFRU1QVFNfQ1VSUihwLCBzbXRfcnEpICYmCisJCQkJc210X3NsaWNlKHNtdF9jdXJyLCBzZCkgPiB0YXNrX3RpbWVzbGljZShwKSkKKwkJCQkJcmV0ID0gMTsKKworY2hlY2tfc210X3Rhc2s6CisJCWlmICgoIXNtdF9jdXJyLT5tbSAmJiBzbXRfY3VyciAhPSBzbXRfcnEtPmlkbGUpIHx8CisJCQlydF90YXNrKHNtdF9jdXJyKSkKKwkJCQljb250aW51ZTsKKwkJaWYgKCFwLT5tbSkgeworCQkJd2FrZXVwX2J1c3lfcnVucXVldWUoc210X3JxKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyoKLQkJICogUmVzY2hlZHVsZSBhIGxvd2VyIHByaW9yaXR5IHRhc2sgb24gdGhlIFNNVCBzaWJsaW5nLAotCQkgKiBvciB3YWtlIGl0IHVwIGlmIGl0IGhhcyBiZWVuIHB1dCB0byBzbGVlcCBmb3IgcHJpb3JpdHkKLQkJICogcmVhc29ucy4KKwkJICogUmVzY2hlZHVsZSBhIGxvd2VyIHByaW9yaXR5IHRhc2sgb24gdGhlIFNNVCBzaWJsaW5nIGZvcgorCQkgKiBpdCB0byBiZSBwdXQgdG8gc2xlZXAsIG9yIHdha2UgaXQgdXAgaWYgaXQgaGFzIGJlZW4gcHV0IHRvCisJCSAqIHNsZWVwIGZvciBwcmlvcml0eSByZWFzb25zIHRvIHNlZSBpZiBpdCBzaG91bGQgcnVuIG5vdy4KIAkJICovCi0JCWlmICgoKChwLT50aW1lX3NsaWNlICogKDEwMCAtIHNkLT5wZXJfY3B1X2dhaW4pIC8gMTAwKSA+Ci0JCQl0YXNrX3RpbWVzbGljZShzbXRfY3VycikgfHwgcnRfdGFzayhwKSkgJiYKLQkJCXNtdF9jdXJyLT5tbSAmJiBwLT5tbSAmJiAhcnRfdGFzayhzbXRfY3VycikpIHx8Ci0JCQkoc210X2N1cnIgPT0gc210X3JxLT5pZGxlICYmIHNtdF9ycS0+bnJfcnVubmluZykpCi0JCQkJcmVzY2hlZF90YXNrKHNtdF9jdXJyKTsKKwkJaWYgKHJ0X3Rhc2socCkpIHsKKwkJCWlmICgoamlmZmllcyAlIERFRl9USU1FU0xJQ0UpID4KKwkJCQkoc2QtPnBlcl9jcHVfZ2FpbiAqIERFRl9USU1FU0xJQ0UgLyAxMDApKQorCQkJCQlyZXNjaGVkX3Rhc2soc210X2N1cnIpOworCQl9IGVsc2UgeworCQkJaWYgKFRBU0tfUFJFRU1QVFNfQ1VSUihwLCBzbXRfcnEpICYmCisJCQkJc210X3NsaWNlKHAsIHNkKSA+IHRhc2tfdGltZXNsaWNlKHNtdF9jdXJyKSkKKwkJCQkJcmVzY2hlZF90YXNrKHNtdF9jdXJyKTsKKwkJCWVsc2UKKwkJCQl3YWtldXBfYnVzeV9ydW5xdWV1ZShzbXRfcnEpOworCQl9CiAJfQogb3V0X3VubG9jazoKIAlmb3JfZWFjaF9jcHVfbWFzayhpLCBzaWJsaW5nX21hcCkKQEAgLTI4ODcsNiArMjk4OSw3IEBACiAJaWYgKG5leHQgPT0gcnEtPmlkbGUpCiAJCXNjaGVkc3RhdF9pbmMocnEsIHNjaGVkX2dvaWRsZSk7CiAJcHJlZmV0Y2gobmV4dCk7CisJcHJlZmV0Y2hfc3RhY2sobmV4dCk7CiAJY2xlYXJfdHNrX25lZWRfcmVzY2hlZChwcmV2KTsKIAlyY3VfcXNjdHJfaW5jKHRhc2tfY3B1KHByZXYpKTsKIApAQCAtMzAxNCw3ICszMTE3LDggQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUkVFTVBUICovCiAKLWludCBkZWZhdWx0X3dha2VfZnVuY3Rpb24od2FpdF9xdWV1ZV90ICpjdXJyLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQoraW50IGRlZmF1bHRfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKmN1cnIsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLAorCQkJICB2b2lkICprZXkpCiB7CiAJdGFza190ICpwID0gY3Vyci0+cHJpdmF0ZTsKIAlyZXR1cm4gdHJ5X3RvX3dha2VfdXAocCwgbW9kZSwgc3luYyk7CkBAIC0zMDU2LDcgKzMxNjAsNyBAQAogICogQGtleTogaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSB3YWtldXAgZnVuY3Rpb24KICAqLwogdm9pZCBmYXN0Y2FsbCBfX3dha2VfdXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLAotCQkJCWludCBucl9leGNsdXNpdmUsIHZvaWQgKmtleSkKKwkJCWludCBucl9leGNsdXNpdmUsIHZvaWQgKmtleSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMDg4LDcgKzMxOTIsOCBAQAogICoKICAqIE9uIFVQIGl0IGNhbiBwcmV2ZW50IGV4dHJhIHByZWVtcHRpb24uCiAgKi8KLXZvaWQgZmFzdGNhbGwgX193YWtlX3VwX3N5bmMod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBpbnQgbnJfZXhjbHVzaXZlKQordm9pZCBmYXN0Y2FsbAorX193YWtlX3VwX3N5bmMod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBpbnQgbnJfZXhjbHVzaXZlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN5bmMgPSAxOwpAQCAtMzI3OSw3ICszMzg0LDggQEAKIAogRVhQT1JUX1NZTUJPTChpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKTsKIAotbG9uZyBmYXN0Y2FsbCBfX3NjaGVkIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgbG9uZyB0aW1lb3V0KQorbG9uZyBmYXN0Y2FsbCBfX3NjaGVkCitpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIGxvbmcgdGltZW91dCkKIHsKIAlTTEVFUF9PTl9WQVIKIApAQCAtMzQ5OCw3ICszNjA0LDggQEAKICAqIEBwb2xpY3k6IG5ldyBwb2xpY3kuCiAgKiBAcGFyYW06IHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXcgUlQgcHJpb3JpdHkuCiAgKi8KLWludCBzY2hlZF9zZXRzY2hlZHVsZXIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQoraW50IHNjaGVkX3NldHNjaGVkdWxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwb2xpY3ksCisJCSAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQogewogCWludCByZXR2YWw7CiAJaW50IG9sZHByaW8sIG9sZHBvbGljeSA9IC0xOwpAQCAtMzUxOCw3ICszNjI1LDcgQEAKIAkgKiAxLi5NQVhfVVNFUl9SVF9QUklPLTEsIHZhbGlkIHByaW9yaXR5IGZvciBTQ0hFRF9OT1JNQUwgaXMgMC4KIAkgKi8KIAlpZiAocGFyYW0tPnNjaGVkX3ByaW9yaXR5IDwgMCB8fAotCSAgICAocC0+bW0gJiYgIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IE1BWF9VU0VSX1JUX1BSSU8tMSkgfHwKKwkgICAgKHAtPm1tICYmIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IE1BWF9VU0VSX1JUX1BSSU8tMSkgfHwKIAkgICAgKCFwLT5tbSAmJiBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBNQVhfUlRfUFJJTy0xKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKChwb2xpY3kgPT0gU0NIRURfTk9STUFMKSAhPSAocGFyYW0tPnNjaGVkX3ByaW9yaXR5ID09IDApKQpAQCAtMzU4MSw3ICszNjg4LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNjaGVkX3NldHNjaGVkdWxlcik7CiAKLXN0YXRpYyBpbnQgZG9fc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90IHBpZCwgaW50IHBvbGljeSwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqcGFyYW0pCitzdGF0aWMgaW50Citkb19zY2hlZF9zZXRzY2hlZHVsZXIocGlkX3QgcGlkLCBpbnQgcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICpwYXJhbSkKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBzY2hlZF9wYXJhbSBscGFyYW07CkBAIC0zODQ4LDcgKzM5NTYsNyBAQAogCWlmIChydF90YXNrKGN1cnJlbnQpKQogCQl0YXJnZXQgPSBycS0+YWN0aXZlOwogCi0JaWYgKGN1cnJlbnQtPmFycmF5LT5ucl9hY3RpdmUgPT0gMSkgeworCWlmIChhcnJheS0+bnJfYWN0aXZlID09IDEpIHsKIAkJc2NoZWRzdGF0X2luYyhycSwgeWxkX2FjdF9lbXB0eSk7CiAJCWlmICghcnEtPmV4cGlyZWQtPm5yX2FjdGl2ZSkKIAkJCXNjaGVkc3RhdF9pbmMocnEsIHlsZF9ib3RoX2VtcHR5KTsKQEAgLTM5MTIsNyArNDAyMCw3IEBACiAgKiBvcGVyYXRpb25zIGhlcmUgdG8gcHJldmVudCBzY2hlZHVsZSgpIGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlIChvbmNlIHZpYQogICogc3Bpbl91bmxvY2soKSwgb25jZSBieSBoYW5kKS4KICAqLwotaW50IGNvbmRfcmVzY2hlZF9sb2NrKHNwaW5sb2NrX3QgKiBsb2NrKQoraW50IGNvbmRfcmVzY2hlZF9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQwOTUsNyArNDIwMyw3IEBACiAJcmV0dXJuIGxpc3RfZW50cnkocC0+c2libGluZy5uZXh0LHN0cnVjdCB0YXNrX3N0cnVjdCxzaWJsaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgc2hvd190YXNrKHRhc2tfdCAqIHApCitzdGF0aWMgdm9pZCBzaG93X3Rhc2sodGFza190ICpwKQogewogCXRhc2tfdCAqcmVsYXRpdmU7CiAJdW5zaWduZWQgc3RhdGU7CkBAIC00MTIxLDcgKzQyMjksNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCiAJewotCQl1bnNpZ25lZCBsb25nICogbiA9ICh1bnNpZ25lZCBsb25nICopIChwLT50aHJlYWRfaW5mbysxKTsKKwkJdW5zaWduZWQgbG9uZyAqbiA9ICh1bnNpZ25lZCBsb25nICopIChwLT50aHJlYWRfaW5mbysxKTsKIAkJd2hpbGUgKCEqbikKIAkJCW4rKzsKIAkJZnJlZSA9ICh1bnNpZ25lZCBsb25nKSBuIC0gKHVuc2lnbmVkIGxvbmcpKHAtPnRocmVhZF9pbmZvKzEpOwpAQCAtNDMzMCw3ICs0NDM4LDcgQEAKICAqIHRocmVhZCBtaWdyYXRpb24gYnkgYnVtcGluZyB0aHJlYWQgb2ZmIENQVSB0aGVuICdwdXNoaW5nJyBvbnRvCiAgKiBhbm90aGVyIHJ1bnF1ZXVlLgogICovCi1zdGF0aWMgaW50IG1pZ3JhdGlvbl90aHJlYWQodm9pZCAqIGRhdGEpCitzdGF0aWMgaW50IG1pZ3JhdGlvbl90aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlydW5xdWV1ZV90ICpycTsKIAlpbnQgY3B1ID0gKGxvbmcpZGF0YTsKQEAgLTQ3NzksNyArNDg4Nyw3IEBACiAgKiBBdHRhY2ggdGhlIGRvbWFpbiAnc2QnIHRvICdjcHUnIGFzIGl0cyBiYXNlIGRvbWFpbi4gIENhbGxlcnMgbXVzdAogICogaG9sZCB0aGUgaG90cGx1ZyBsb2NrLgogICovCi12b2lkIGNwdV9hdHRhY2hfZG9tYWluKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgY3B1X2F0dGFjaF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCiB7CiAJcnVucXVldWVfdCAqcnEgPSBjcHVfcnEoY3B1KTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0bXA7CkBAIC00ODAyLDcgKzQ5MTAsNyBAQAogfQogCiAvKiBjcHVzIHdpdGggaXNvbGF0ZWQgZG9tYWlucyAqLwotY3B1bWFza190IF9fZGV2aW5pdGRhdGEgY3B1X2lzb2xhdGVkX21hcCA9IENQVV9NQVNLX05PTkU7CitzdGF0aWMgY3B1bWFza190IF9fZGV2aW5pdGRhdGEgY3B1X2lzb2xhdGVkX21hcCA9IENQVV9NQVNLX05PTkU7CiAKIC8qIFNldHVwIHRoZSBtYXNrIG9mIGNwdXMgY29uZmlndXJlZCBmb3IgaXNvbGF0ZWQgZG9tYWlucyAqLwogc3RhdGljIGludCBfX2luaXQgaXNvbGF0ZWRfY3B1X3NldHVwKGNoYXIgKnN0cikKQEAgLTQ4MzAsOCArNDkzOCw4IEBACiAgKiBjb3ZlcmVkIGJ5IHRoZSBnaXZlbiBzcGFuLCBhbmQgd2lsbCBzZXQgZWFjaCBncm91cCdzIC0+Y3B1bWFzayBjb3JyZWN0bHksCiAgKiBhbmQgLT5jcHVfcG93ZXIgdG8gMC4KICAqLwotdm9pZCBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZ3JvdXAgZ3JvdXBzW10sCi0JCQljcHVtYXNrX3Qgc3BhbiwgaW50ICgqZ3JvdXBfZm4pKGludCBjcHUpKQorc3RhdGljIHZvaWQgaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc3RydWN0IHNjaGVkX2dyb3VwIGdyb3Vwc1tdLCBjcHVtYXNrX3Qgc3BhbiwKKwkJCQkgICAgaW50ICgqZ3JvdXBfZm4pKGludCBjcHUpKQogewogCXN0cnVjdCBzY2hlZF9ncm91cCAqZmlyc3QgPSBOVUxMLCAqbGFzdCA9IE5VTEw7CiAJY3B1bWFza190IGNvdmVyZWQgPSBDUFVfTUFTS19OT05FOwpAQCAtNDg2NCwxMiArNDk3Miw4NSBAQAogCWxhc3QtPm5leHQgPSBmaXJzdDsKIH0KIAorI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2CiAKLSNpZmRlZiBBUkNIX0hBU19TQ0hFRF9ET01BSU4KLWV4dGVybiB2b2lkIGJ1aWxkX3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKTsKLWV4dGVybiB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCk7Ci1leHRlcm4gdm9pZCBhcmNoX2Rlc3Ryb3lfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApOwotI2Vsc2UKKyNpZmRlZiBDT05GSUdfTlVNQQorLyoqCisgKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRvIGluY2x1ZGUgaW4gYSBzY2hlZF9kb21haW4KKyAqIEBub2RlOiBub2RlIHdob3NlIHNjaGVkX2RvbWFpbiB3ZSdyZSBidWlsZGluZworICogQHVzZWRfbm9kZXM6IG5vZGVzIGFscmVhZHkgaW4gdGhlIHNjaGVkX2RvbWFpbgorICoKKyAqIEZpbmQgdGhlIG5leHQgbm9kZSB0byBpbmNsdWRlIGluIGEgZ2l2ZW4gc2NoZWR1bGluZyBkb21haW4uICBTaW1wbHkKKyAqIGZpbmRzIHRoZSBjbG9zZXN0IG5vZGUgbm90IGFscmVhZHkgaW4gdGhlIEB1c2VkX25vZGVzIG1hcC4KKyAqCisgKiBTaG91bGQgdXNlIG5vZGVtYXNrX3QuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqdXNlZF9ub2RlcykKK3sKKwlpbnQgaSwgbiwgdmFsLCBtaW5fdmFsLCBiZXN0X25vZGUgPSAwOworCisJbWluX3ZhbCA9IElOVF9NQVg7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwkJLyogU3RhcnQgYXQgQG5vZGUgKi8KKwkJbiA9IChub2RlICsgaSkgJSBNQVhfTlVNTk9ERVM7CisKKwkJaWYgKCFucl9jcHVzX25vZGUobikpCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIGFscmVhZHkgdXNlZCBub2RlcyAqLworCQlpZiAodGVzdF9iaXQobiwgdXNlZF9ub2RlcykpCisJCQljb250aW51ZTsKKworCQkvKiBTaW1wbGUgbWluIGRpc3RhbmNlIHNlYXJjaCAqLworCQl2YWwgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pOworCisJCWlmICh2YWwgPCBtaW5fdmFsKSB7CisJCQltaW5fdmFsID0gdmFsOworCQkJYmVzdF9ub2RlID0gbjsKKwkJfQorCX0KKworCXNldF9iaXQoYmVzdF9ub2RlLCB1c2VkX25vZGVzKTsKKwlyZXR1cm4gYmVzdF9ub2RlOworfQorCisvKioKKyAqIHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4gLSBnZXQgYSBjcHVtYXNrIGZvciBhIG5vZGUncyBzY2hlZF9kb21haW4KKyAqIEBub2RlOiBub2RlIHdob3NlIGNwdW1hc2sgd2UncmUgY29uc3RydWN0aW5nCisgKiBAc2l6ZTogbnVtYmVyIG9mIG5vZGVzIHRvIGluY2x1ZGUgaW4gdGhpcyBzcGFuCisgKgorICogR2l2ZW4gYSBub2RlLCBjb25zdHJ1Y3QgYSBnb29kIGNwdW1hc2sgZm9yIGl0cyBzY2hlZF9kb21haW4gdG8gc3Bhbi4gIEl0CisgKiBzaG91bGQgYmUgb25lIHRoYXQgcHJldmVudHMgdW5uZWNlc3NhcnkgYmFsYW5jaW5nLCBidXQgYWxzbyBzcHJlYWRzIHRhc2tzCisgKiBvdXQgb3B0aW1hbGx5LgorICovCitzdGF0aWMgY3B1bWFza190IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oaW50IG5vZGUpCit7CisJaW50IGk7CisJY3B1bWFza190IHNwYW4sIG5vZGVtYXNrOworCURFQ0xBUkVfQklUTUFQKHVzZWRfbm9kZXMsIE1BWF9OVU1OT0RFUyk7CisKKwljcHVzX2NsZWFyKHNwYW4pOworCWJpdG1hcF96ZXJvKHVzZWRfbm9kZXMsIE1BWF9OVU1OT0RFUyk7CisKKwlub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKKwljcHVzX29yKHNwYW4sIHNwYW4sIG5vZGVtYXNrKTsKKwlzZXRfYml0KG5vZGUsIHVzZWRfbm9kZXMpOworCisJZm9yIChpID0gMTsgaSA8IFNEX05PREVTX1BFUl9ET01BSU47IGkrKykgeworCQlpbnQgbmV4dF9ub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCB1c2VkX25vZGVzKTsKKwkJbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobmV4dF9ub2RlKTsKKwkJY3B1c19vcihzcGFuLCBzcGFuLCBub2RlbWFzayk7CisJfQorCisJcmV0dXJuIHNwYW47Cit9CisjZW5kaWYKKworLyoKKyAqIEF0IHRoZSBtb21lbnQsIENPTkZJR19TQ0hFRF9TTVQgaXMgbmV2ZXIgZGVmaW5lZCwgYnV0IGxlYXZlIGl0IGluIHNvIHdlCisgKiBjYW4gc3dpdGNoIGl0IG9uIGVhc2lseSBpZiBuZWVkZWQuCisgKi8KICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgY3B1X2RvbWFpbnMpOwogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9jcHVzW05SX0NQVVNdOwpAQCAtNDg5MSw0NiArNTA3Miw0NSBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKLQorLyoKKyAqIFRoZSBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyBjYW4ndCBoYW5kbGUgd2hhdCB3ZSB3YW50IHRvIGRvIHdpdGggbm9kZQorICogZ3JvdXBzLCBzbyByb2xsIG91ciBvd24uIE5vdyBlYWNoIG5vZGUgaGFzIGl0cyBvd24gbGlzdCBvZiBncm91cHMgd2hpY2gKKyAqIGdldHMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgorICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgbm9kZV9kb21haW5zKTsKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfbm9kZXNbTUFYX05VTU5PREVTXTsKLXN0YXRpYyBpbnQgY3B1X3RvX25vZGVfZ3JvdXAoaW50IGNwdSkKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtOUl9DUFVTXTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIGFsbG5vZGVzX2RvbWFpbnMpOworc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCAqc2NoZWRfZ3JvdXBfYWxsbm9kZXNfYnljcHVbTlJfQ1BVU107CisKK3N0YXRpYyBpbnQgY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdV90b19ub2RlKGNwdSk7CiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKLS8qCi0gKiBUaGUgZG9tYWlucyBzZXR1cCBjb2RlIHJlbGllcyBvbiBzaWJsaW5ncyBub3Qgc3Bhbm5pbmcKLSAqIG11bHRpcGxlIG5vZGVzLiBNYWtlIHN1cmUgdGhlIGFyY2hpdGVjdHVyZSBoYXMgYSBwcm9wZXIKLSAqIHNpYmxpbmdzIG1hcDoKLSAqLwotc3RhdGljIHZvaWQgY2hlY2tfc2libGluZ19tYXBzKHZvaWQpCi17Ci0JaW50IGksIGo7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJZm9yX2VhY2hfY3B1X21hc2soaiwgY3B1X3NpYmxpbmdfbWFwW2ldKSB7Ci0JCQlpZiAoY3B1X3RvX25vZGUoaSkgIT0gY3B1X3RvX25vZGUoaikpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJ3YXJuaW5nOiBDUFUgJWQgc2libGluZ3MgbWFwICIKLQkJCQkJInRvIGRpZmZlcmVudCBub2RlIC0gaXNvbGF0aW5nICIKLQkJCQkJInRoZW0uXG4iLCBpKTsKLQkJCQljcHVfc2libGluZ19tYXBbaV0gPSBjcHVtYXNrX29mX2NwdShpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLSNlbmRpZgotCiAvKgogICogQnVpbGQgc2NoZWQgZG9tYWlucyBmb3IgYSBnaXZlbiBzZXQgb2YgY3B1cyBhbmQgYXR0YWNoIHRoZSBzY2hlZCBkb21haW5zCiAgKiB0byB0aGUgaW5kaXZpZHVhbCBjcHVzCiAgKi8KLXN0YXRpYyB2b2lkIGJ1aWxkX3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQordm9pZCBidWlsZF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKIHsKIAlpbnQgaTsKKyNpZmRlZiBDT05GSUdfTlVNQQorCXN0cnVjdCBzY2hlZF9ncm91cCAqKnNjaGVkX2dyb3VwX25vZGVzID0gTlVMTDsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNjaGVkX2dyb3VwX2FsbG5vZGVzID0gTlVMTDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHBlci1ub2RlIGxpc3Qgb2Ygc2NoZWQgZ3JvdXBzCisJICovCisJc2NoZWRfZ3JvdXBfbm9kZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXAqKSpNQVhfTlVNTk9ERVMsCisJCQkJCSAgIEdGUF9BVE9NSUMpOworCWlmICghc2NoZWRfZ3JvdXBfbm9kZXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuIG5vdCBhbGxvYyBzY2hlZCBncm91cCBub2RlIGxpc3RcbiIpOworCQlyZXR1cm47CisJfQorCXNjaGVkX2dyb3VwX25vZGVzX2J5Y3B1W2ZpcnN0X2NwdSgqY3B1X21hcCldID0gc2NoZWRfZ3JvdXBfbm9kZXM7CisjZW5kaWYKIAogCS8qCiAJICogU2V0IHVwIGRvbWFpbnMgZm9yIGNwdXMgc3BlY2lmaWVkIGJ5IHRoZSBjcHVfbWFwLgpAQCAtNDk0MywxMSArNTEyMywzNSBAQAogCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCisJCWlmIChjcHVzX3dlaWdodCgqY3B1X21hcCkKKwkJCQk+IFNEX05PREVTX1BFUl9ET01BSU4qY3B1c193ZWlnaHQobm9kZW1hc2spKSB7CisJCQlpZiAoIXNjaGVkX2dyb3VwX2FsbG5vZGVzKSB7CisJCQkJc2NoZWRfZ3JvdXBfYWxsbm9kZXMKKwkJCQkJPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApCisJCQkJCQkJKiBNQVhfTlVNTk9ERVMsCisJCQkJCQkgIEdGUF9LRVJORUwpOworCQkJCWlmICghc2NoZWRfZ3JvdXBfYWxsbm9kZXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiQ2FuIG5vdCBhbGxvYyBhbGxub2RlcyBzY2hlZCBncm91cFxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzY2hlZF9ncm91cF9hbGxub2Rlc19ieWNwdVtpXQorCQkJCQkJPSBzY2hlZF9ncm91cF9hbGxub2RlczsKKwkJCX0KKwkJCXNkID0gJnBlcl9jcHUoYWxsbm9kZXNfZG9tYWlucywgaSk7CisJCQkqc2QgPSBTRF9BTExOT0RFU19JTklUOworCQkJc2QtPnNwYW4gPSAqY3B1X21hcDsKKwkJCWdyb3VwID0gY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGkpOworCQkJc2QtPmdyb3VwcyA9ICZzY2hlZF9ncm91cF9hbGxub2Rlc1tncm91cF07CisJCQlwID0gc2Q7CisJCX0gZWxzZQorCQkJcCA9IE5VTEw7CisKIAkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGkpOwotCQlncm91cCA9IGNwdV90b19ub2RlX2dyb3VwKGkpOwogCQkqc2QgPSBTRF9OT0RFX0lOSVQ7Ci0JCXNkLT5zcGFuID0gKmNwdV9tYXA7Ci0JCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfbm9kZXNbZ3JvdXBdOworCQlzZC0+c3BhbiA9IHNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oY3B1X3RvX25vZGUoaSkpOworCQlzZC0+cGFyZW50ID0gcDsKKwkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCAqY3B1X21hcCk7CiAjZW5kaWYKIAogCQlwID0gc2Q7CkBAIC00OTcyLDcgKzUxNzYsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAogCS8qIFNldCB1cCBDUFUgKHNpYmxpbmcpIGdyb3VwcyAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7CiAJCWNwdW1hc2tfdCB0aGlzX3NpYmxpbmdfbWFwID0gY3B1X3NpYmxpbmdfbWFwW2ldOwogCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCAqY3B1X21hcCk7CiAJCWlmIChpICE9IGZpcnN0X2NwdSh0aGlzX3NpYmxpbmdfbWFwKSkKQEAgLTQ5OTcsOCArNTIwMSw3NyBAQAogCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKiBTZXQgdXAgbm9kZSBncm91cHMgKi8KLQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9ub2RlcywgKmNwdV9tYXAsCi0JCQkJCSZjcHVfdG9fbm9kZV9ncm91cCk7CisJaWYgKHNjaGVkX2dyb3VwX2FsbG5vZGVzKQorCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9hbGxub2RlcywgKmNwdV9tYXAsCisJCQkJCSZjcHVfdG9fYWxsbm9kZXNfZ3JvdXApOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCS8qIFNldCB1cCBub2RlIGdyb3VwcyAqLworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLCAqcHJldjsKKwkJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGkpOworCQljcHVtYXNrX3QgZG9tYWluc3BhbjsKKwkJY3B1bWFza190IGNvdmVyZWQgPSBDUFVfTUFTS19OT05FOworCQlpbnQgajsKKworCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKKwkJaWYgKGNwdXNfZW1wdHkobm9kZW1hc2spKSB7CisJCQlzY2hlZF9ncm91cF9ub2Rlc1tpXSA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRvbWFpbnNwYW4gPSBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGkpOworCQljcHVzX2FuZChkb21haW5zcGFuLCBkb21haW5zcGFuLCAqY3B1X21hcCk7CisKKwkJc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApLCBHRlBfS0VSTkVMKTsKKwkJc2NoZWRfZ3JvdXBfbm9kZXNbaV0gPSBzZzsKKwkJZm9yX2VhY2hfY3B1X21hc2soaiwgbm9kZW1hc2spIHsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGopOworCQkJc2QtPmdyb3VwcyA9IHNnOworCQkJaWYgKHNkLT5ncm91cHMgPT0gTlVMTCkgeworCQkJCS8qIFR1cm4gb2ZmIGJhbGFuY2luZyBpZiB3ZSBoYXZlIG5vIGdyb3VwcyAqLworCQkJCXNkLT5mbGFncyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCFzZykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIkNhbiBub3QgYWxsb2MgZG9tYWluIGdyb3VwIGZvciBub2RlICVkXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNnLT5jcHVfcG93ZXIgPSAwOworCQlzZy0+Y3B1bWFzayA9IG5vZGVtYXNrOworCQljcHVzX29yKGNvdmVyZWQsIGNvdmVyZWQsIG5vZGVtYXNrKTsKKwkJcHJldiA9IHNnOworCisJCWZvciAoaiA9IDA7IGogPCBNQVhfTlVNTk9ERVM7IGorKykgeworCQkJY3B1bWFza190IHRtcCwgbm90Y292ZXJlZDsKKwkJCWludCBuID0gKGkgKyBqKSAlIE1BWF9OVU1OT0RFUzsKKworCQkJY3B1c19jb21wbGVtZW50KG5vdGNvdmVyZWQsIGNvdmVyZWQpOworCQkJY3B1c19hbmQodG1wLCBub3Rjb3ZlcmVkLCAqY3B1X21hcCk7CisJCQljcHVzX2FuZCh0bXAsIHRtcCwgZG9tYWluc3Bhbik7CisJCQlpZiAoY3B1c19lbXB0eSh0bXApKQorCQkJCWJyZWFrOworCisJCQlub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhuKTsKKwkJCWNwdXNfYW5kKHRtcCwgdG1wLCBub2RlbWFzayk7CisJCQlpZiAoY3B1c19lbXB0eSh0bXApKQorCQkJCWNvbnRpbnVlOworCisJCQlzZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFzZykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiQ2FuIG5vdCBhbGxvYyBkb21haW4gZ3JvdXAgZm9yIG5vZGUgJWRcbiIsIGopOworCQkJCWJyZWFrOworCQkJfQorCQkJc2ctPmNwdV9wb3dlciA9IDA7CisJCQlzZy0+Y3B1bWFzayA9IHRtcDsKKwkJCWNwdXNfb3IoY292ZXJlZCwgY292ZXJlZCwgdG1wKTsKKwkJCXByZXYtPm5leHQgPSBzZzsKKwkJCXByZXYgPSBzZzsKKwkJfQorCQlwcmV2LT5uZXh0ID0gc2NoZWRfZ3JvdXBfbm9kZXNbaV07CisJfQogI2VuZGlmCiAKIAkvKiBDYWxjdWxhdGUgQ1BVIHBvd2VyIGZvciBwaHlzaWNhbCBwYWNrYWdlcyBhbmQgbm9kZXMgKi8KQEAgLTUwMTcsMTQgKzUyOTAsNDYgQEAKIAkJc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyID0gcG93ZXI7CiAKICNpZmRlZiBDT05GSUdfTlVNQQotCQlpZiAoaSA9PSBmaXJzdF9jcHUoc2QtPmdyb3Vwcy0+Y3B1bWFzaykpIHsKLQkJCS8qIE9ubHkgYWRkICJwb3dlciIgb25jZSBmb3IgZWFjaCBwaHlzaWNhbCBwYWNrYWdlLiAqLwotCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGkpOwotCQkJc2QtPmdyb3Vwcy0+Y3B1X3Bvd2VyICs9IHBvd2VyOworCQlzZCA9ICZwZXJfY3B1KGFsbG5vZGVzX2RvbWFpbnMsIGkpOworCQlpZiAoc2QtPmdyb3VwcykgeworCQkJcG93ZXIgPSBTQ0hFRF9MT0FEX1NDQUxFICsgU0NIRURfTE9BRF9TQ0FMRSAqCisJCQkJKGNwdXNfd2VpZ2h0KHNkLT5ncm91cHMtPmNwdW1hc2spLTEpIC8gMTA7CisJCQlzZC0+Z3JvdXBzLT5jcHVfcG93ZXIgPSBwb3dlcjsKIAkJfQogI2VuZGlmCiAJfQogCisjaWZkZWYgQ09ORklHX05VTUEKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpzZyA9IHNjaGVkX2dyb3VwX25vZGVzW2ldOworCQlpbnQgajsKKworCQlpZiAoc2cgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworbmV4dF9zZzoKKwkJZm9yX2VhY2hfY3B1X21hc2soaiwgc2ctPmNwdW1hc2spIHsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCQkJaW50IHBvd2VyOworCisJCQlzZCA9ICZwZXJfY3B1KHBoeXNfZG9tYWlucywgaik7CisJCQlpZiAoaiAhPSBmaXJzdF9jcHUoc2QtPmdyb3Vwcy0+Y3B1bWFzaykpIHsKKwkJCQkvKgorCQkJCSAqIE9ubHkgYWRkICJwb3dlciIgb25jZSBmb3IgZWFjaAorCQkJCSAqIHBoeXNpY2FsIHBhY2thZ2UuCisJCQkJICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlwb3dlciA9IFNDSEVEX0xPQURfU0NBTEUgKyBTQ0hFRF9MT0FEX1NDQUxFICoKKwkJCQkoY3B1c193ZWlnaHQoc2QtPmdyb3Vwcy0+Y3B1bWFzayktMSkgLyAxMDsKKworCQkJc2ctPmNwdV9wb3dlciArPSBwb3dlcjsKKwkJfQorCQlzZyA9IHNnLT5uZXh0OworCQlpZiAoc2cgIT0gc2NoZWRfZ3JvdXBfbm9kZXNbaV0pCisJCQlnb3RvIG5leHRfc2c7CisJfQorI2VuZGlmCisKIAkvKiBBdHRhY2ggdGhlIGRvbWFpbnMgKi8KIAlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewogCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKQEAgLTUwMzksMTMgKzUzNDQsMTAgQEAKIC8qCiAgKiBTZXQgdXAgc2NoZWR1bGVyIGRvbWFpbnMgYW5kIGdyb3Vwcy4gIENhbGxlcnMgbXVzdCBob2xkIHRoZSBob3RwbHVnIGxvY2suCiAgKi8KLXN0YXRpYyB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNwdW1hc2tfdCAqY3B1X21hcCkKK3N0YXRpYyB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKIHsKIAljcHVtYXNrX3QgY3B1X2RlZmF1bHRfbWFwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU0NIRURfU01UKSAmJiBkZWZpbmVkKENPTkZJR19OVU1BKQotCWNoZWNrX3NpYmxpbmdfbWFwcygpOwotI2VuZGlmCiAJLyoKIAkgKiBTZXR1cCBtYXNrIGZvciBjcHVzIHdpdGhvdXQgc3BlY2lhbCBjYXNlIHNjaGVkdWxpbmcgcmVxdWlyZW1lbnRzLgogCSAqIEZvciBub3cgdGhpcyBqdXN0IGV4Y2x1ZGVzIGlzb2xhdGVkIGNwdXMsIGJ1dCBjb3VsZCBiZSB1c2VkIHRvCkBAIC01MDU4LDEwICs1MzYwLDQ3IEBACiAKIHN0YXRpYyB2b2lkIGFyY2hfZGVzdHJveV9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKIHsKLQkvKiBEbyBub3RoaW5nOiBldmVyeXRoaW5nIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiAqLwotfQorI2lmZGVmIENPTkZJR19OVU1BCisJaW50IGk7CisJaW50IGNwdTsKIAotI2VuZGlmIC8qIEFSQ0hfSEFTX1NDSEVEX0RPTUFJTiAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKmNwdV9tYXApIHsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpzY2hlZF9ncm91cF9hbGxub2RlcworCQkJPSBzY2hlZF9ncm91cF9hbGxub2Rlc19ieWNwdVtjcHVdOworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2RlcworCQkJPSBzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtjcHVdOworCisJCWlmIChzY2hlZF9ncm91cF9hbGxub2RlcykgeworCQkJa2ZyZWUoc2NoZWRfZ3JvdXBfYWxsbm9kZXMpOworCQkJc2NoZWRfZ3JvdXBfYWxsbm9kZXNfYnljcHVbY3B1XSA9IE5VTEw7CisJCX0KKworCQlpZiAoIXNjaGVkX2dyb3VwX25vZGVzKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCQljcHVtYXNrX3Qgbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2soaSk7CisJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKm9sZHNnLCAqc2cgPSBzY2hlZF9ncm91cF9ub2Rlc1tpXTsKKworCQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7CisJCQlpZiAoY3B1c19lbXB0eShub2RlbWFzaykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzZyA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJc2cgPSBzZy0+bmV4dDsKK25leHRfc2c6CisJCQlvbGRzZyA9IHNnOworCQkJc2cgPSBzZy0+bmV4dDsKKwkJCWtmcmVlKG9sZHNnKTsKKwkJCWlmIChvbGRzZyAhPSBzY2hlZF9ncm91cF9ub2Rlc1tpXSkKKwkJCQlnb3RvIG5leHRfc2c7CisJCX0KKwkJa2ZyZWUoc2NoZWRfZ3JvdXBfbm9kZXMpOworCQlzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtjcHVdID0gTlVMTDsKKwl9CisjZW5kaWYKK30KIAogLyoKICAqIERldGFjaCBzY2hlZCBkb21haW5zIGZyb20gYSBncm91cCBvZiBjcHVzIHNwZWNpZmllZCBpbiBjcHVfbWFwCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZDI4MmZlYS4uYjkyYzNjOSAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAKIC8qIGZvcndhcmQgZGVjbCAqLwogc3RhdGljIHZvaWQgZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQsCisJCQkJICAgICBpbnQgdG9fc2VsZiwKIAkJCQkgICAgIGludCB3aHkpOwogCiAvKgpAQCAtNzI5LDE0ICs3MjksNyBAQAogCQkJcC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50ID0gMDsKIAkJCXAtPnNpZ25hbC0+ZmxhZ3MgPSBTSUdOQUxfU1RPUF9DT05USU5VRUQ7CiAJCQlzcGluX3VubG9jaygmcC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCQlpZiAocC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKLQkJCQlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AocCwgcC0+cGFyZW50LAotCQkJCQkJCSBDTERfU1RPUFBFRCk7Ci0JCQllbHNlCi0JCQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKAotCQkJCQlwLT5ncm91cF9sZWFkZXIsCi0JCQkJCXAtPmdyb3VwX2xlYWRlci0+cmVhbF9wYXJlbnQsCi0JCQkJCQkJIENMRF9TVE9QUEVEKTsKKwkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChwLCAocC0+cHRyYWNlICYgUFRfUFRSQUNFRCksIENMRF9TVE9QUEVEKTsKIAkJCXNwaW5fbG9jaygmcC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCX0KIAkJcm1fZnJvbV9xdWV1ZShTSUdfS0VSTkVMX1NUT1BfTUFTSywgJnAtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcpOwpAQCAtNzc3LDE0ICs3NzAsNyBAQAogCQkJcC0+c2lnbmFsLT5mbGFncyA9IFNJR05BTF9TVE9QX0NPTlRJTlVFRDsKIAkJCXAtPnNpZ25hbC0+Z3JvdXBfZXhpdF9jb2RlID0gMDsKIAkJCXNwaW5fdW5sb2NrKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJCWlmIChwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQotCQkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChwLCBwLT5wYXJlbnQsCi0JCQkJCQkJIENMRF9DT05USU5VRUQpOwotCQkJZWxzZQotCQkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcCgKLQkJCQkJcC0+Z3JvdXBfbGVhZGVyLAotCQkJCQlwLT5ncm91cF9sZWFkZXItPnJlYWxfcGFyZW50LAotCQkJCQkJCSBDTERfQ09OVElOVUVEKTsKKwkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChwLCAocC0+cHRyYWNlICYgUFRfUFRSQUNFRCksIENMRF9DT05USU5VRUQpOwogCQkJc3Bpbl9sb2NrKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJfSBlbHNlIHsKIAkJCS8qCkBAIC0xMzgwLDE2ICsxMzY2LDE2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKIAotCS8qCi0JICogV2UgbmVlZCB0aGUgdGFza2xpc3QgbG9jayBldmVuIGZvciB0aGUgc3BlY2lmaWMKLQkgKiB0aHJlYWQgY2FzZSAod2hlbiB3ZSBkb24ndCBuZWVkIHRvIGZvbGxvdyB0aGUgZ3JvdXAKLQkgKiBsaXN0cykgaW4gb3JkZXIgdG8gYXZvaWQgcmFjZXMgd2l0aCAicC0+c2lnaGFuZCIKLQkgKiBnb2luZyBhd2F5IG9yIGNoYW5naW5nIGZyb20gdW5kZXIgdXMuCi0JICovCiAJQlVHX09OKCEocS0+ZmxhZ3MgJiBTSUdRVUVVRV9QUkVBTExPQykpOwotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7ICAKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCisJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgUEZfRVhJVElORykpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCQorCiAJaWYgKHVubGlrZWx5KCFsaXN0X2VtcHR5KCZxLT5saXN0KSkpIHsKIAkJLyoKIAkJICogSWYgYW4gU0lfVElNRVIgZW50cnkgaXMgYWxyZWFkeSBxdWV1ZSBqdXN0IGluY3JlbWVudApAQCAtMTM5OSw3ICsxMzg1LDcgQEAKIAkJCUJVRygpOwogCQlxLT5pbmZvLnNpX292ZXJydW4rKzsKIAkJZ290byBvdXQ7Ci0JfSAKKwl9CiAJLyogU2hvcnQtY2lyY3VpdCBpZ25vcmVkIHNpZ25hbHMuICAqLwogCWlmIChzaWdfaWdub3JlZChwLCBzaWcpKSB7CiAJCXJldCA9IDE7CkBAIC0xNDE0LDggKzE0MDAsMTAgQEAKIAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKK291dF9lcnI6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCXJldHVybihyZXQpOworCisJcmV0dXJuIHJldDsKIH0KIAogaW50CkBAIC0xNTQyLDE0ICsxNTMwLDIwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHNpZy0+c2lnbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZAotZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCwKLQkJCSBpbnQgd2h5KQorc3RhdGljIHZvaWQgZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgdG9fc2VsZiwgaW50IHdoeSkKIHsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQ7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kOwogCisJaWYgKHRvX3NlbGYpCisJCXBhcmVudCA9IHRzay0+cGFyZW50OworCWVsc2UgeworCQl0c2sgPSB0c2stPmdyb3VwX2xlYWRlcjsKKwkJcGFyZW50ID0gdHNrLT5yZWFsX3BhcmVudDsKKwl9CisKIAlpbmZvLnNpX3NpZ25vID0gU0lHQ0hMRDsKIAlpbmZvLnNpX2Vycm5vID0gMDsKIAlpbmZvLnNpX3BpZCA9IHRzay0+cGlkOwpAQCAtMTYxOCw4ICsxNjEyLDcgQEAKIAkJICAgIShjdXJyZW50LT5wdHJhY2UgJiBQVF9BVFRBQ0hFRCkpICYmCiAJICAgIChsaWtlbHkoY3VycmVudC0+cGFyZW50LT5zaWduYWwgIT0gY3VycmVudC0+c2lnbmFsKSB8fAogCSAgICAgIXVubGlrZWx5KGN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpKSB7Ci0JCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChjdXJyZW50LCBjdXJyZW50LT5wYXJlbnQsCi0JCQkJCSBDTERfVFJBUFBFRCk7CisJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChjdXJyZW50LCAxLCBDTERfVFJBUFBFRCk7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJc2NoZWR1bGUoKTsKIAl9IGVsc2UgewpAQCAtMTY2OCwyNSArMTY2MSwyNSBAQAogc3RhdGljIHZvaWQKIGZpbmlzaF9zdG9wKGludCBzdG9wX2NvdW50KQogeworCWludCB0b19zZWxmOworCiAJLyoKIAkgKiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgZ3JvdXAsIG9yIGlmIHRoZXJlIGlzCiAJICogYSBncm91cCBzdG9wIGluIHByb2dyZXNzIGFuZCB3ZSBhcmUgdGhlIGxhc3QgdG8gc3RvcCwKIAkgKiByZXBvcnQgdG8gdGhlIHBhcmVudC4gIFdoZW4gcHRyYWNlZCwgZXZlcnkgdGhyZWFkIHJlcG9ydHMgaXRzZWxmLgogCSAqLwotCWlmIChzdG9wX2NvdW50IDwgMCB8fCAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQsIGN1cnJlbnQtPnBhcmVudCwKLQkJCQkJIENMRF9TVE9QUEVEKTsKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCX0KLQllbHNlIGlmIChzdG9wX2NvdW50ID09IDApIHsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQtPmdyb3VwX2xlYWRlciwKLQkJCQkJIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cmVhbF9wYXJlbnQsCi0JCQkJCSBDTERfU1RPUFBFRCk7Ci0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl9CisJaWYgKHN0b3BfY291bnQgPCAwIHx8IChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKKwkJdG9fc2VsZiA9IDE7CisJZWxzZSBpZiAoc3RvcF9jb3VudCA9PSAwKQorCQl0b19zZWxmID0gMDsKKwllbHNlCisJCWdvdG8gb3V0OwogCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AoY3VycmVudCwgdG9fc2VsZiwgQ0xEX1NUT1BQRUQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworb3V0OgogCXNjaGVkdWxlKCk7CiAJLyoKIAkgKiBOb3cgd2UgZG9uJ3QgcnVuIGFnYWluIHVudGlsIGNvbnRpbnVlZC4KQEAgLTIyMjgsOCArMjIyMSw3IEBACiAJCQlyZWNhbGNfc2lncGVuZGluZygpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAKIAkJCXRyeV90b19mcmVlemUoKTsKIAkJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRsb2NrdXAuYyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5NzYyMAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBEZXRlY3QgU29mdCBMb2NrdXBzCisgKgorICogc3RhcnRlZCBieSBJbmdvIE1vbG5hciwgKEMpIDIwMDUsIFJlZCBIYXQKKyAqCisgKiB0aGlzIGNvZGUgZGV0ZWN0cyBzb2Z0IGxvY2t1cHM6IGluY2lkZW50cyBpbiB3aGVyZSBvbiBhIENQVQorICogdGhlIGtlcm5lbCBkb2VzIG5vdCByZXNjaGVkdWxlIGZvciAxMCBzZWNvbmRzIG9yIG1vcmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHJpbnRfbG9jayk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB0aW1lc3RhbXApID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBwcmludF90aW1lc3RhbXApID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgd2F0Y2hkb2dfdGFzayk7CisKK3N0YXRpYyBpbnQgZGlkX3BhbmljID0gMDsKK3N0YXRpYyBpbnQgc29mdGxvY2tfcGFuaWMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJCXZvaWQgKnB0cikKK3sKKwlkaWRfcGFuaWMgPSAxOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhbmljX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gc29mdGxvY2tfcGFuaWMsCit9OworCit2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKK3sKKwlwZXJfY3B1KHRpbWVzdGFtcCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgPSBqaWZmaWVzOworfQorRVhQT1JUX1NZTUJPTCh0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKTsKKworLyoKKyAqIFRoaXMgY2FsbGJhY2sgcnVucyBmcm9tIHRoZSB0aW1lciBpbnRlcnJ1cHQsIGFuZCBjaGVja3MKKyAqIHdoZXRoZXIgdGhlIHdhdGNoZG9nIHRocmVhZCBoYXMgaHVuZyBvciBub3Q6CisgKi8KK3ZvaWQgc29mdGxvY2t1cF90aWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCA9IHBlcl9jcHUodGltZXN0YW1wLCB0aGlzX2NwdSk7CisKKwlpZiAocGVyX2NwdShwcmludF90aW1lc3RhbXAsIHRoaXNfY3B1KSA9PSB0aW1lc3RhbXApCisJCXJldHVybjsKKworCS8qIERvIG5vdCBjYXVzZSBhIHNlY29uZCBwYW5pYyB3aGVuIHRoZXJlIGFscmVhZHkgd2FzIG9uZSAqLworCWlmIChkaWRfcGFuaWMpCisJCXJldHVybjsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVzdGFtcCArIDEwKkhaKSkgeworCQlwZXJfY3B1KHByaW50X3RpbWVzdGFtcCwgdGhpc19jcHUpID0gdGltZXN0YW1wOworCisJCXNwaW5fbG9jaygmcHJpbnRfbG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAiQlVHOiBzb2Z0IGxvY2t1cCBkZXRlY3RlZCBvbiBDUFUjJWQhXG4iLAorCQkJdGhpc19jcHUpOworCQlzaG93X3JlZ3MocmVncyk7CisJCXNwaW5fdW5sb2NrKCZwcmludF9sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgd2F0Y2hkb2cgdGhyZWFkIC0gcnVucyBldmVyeSBzZWNvbmQgYW5kIHRvdWNoZXMgdGhlIHRpbWVzdGFtcC4KKyAqLworc3RhdGljIGludCB3YXRjaGRvZyh2b2lkICogX19iaW5kX2NwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IDk5IH07CisJaW50IHRoaXNfY3B1ID0gKGxvbmcpIF9fYmluZF9jcHU7CisKKwlwcmludGsoInNvZnRsb2NrdXAgdGhyZWFkICVkIHN0YXJ0ZWQgdXAuXG4iLCB0aGlzX2NwdSk7CisKKwlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkvKgorCSAqIFJ1biBicmllZmx5IG9uY2UgcGVyIHNlY29uZCAtIGlmIHRoaXMgZ2V0cyBkZWxheWVkIGZvcgorCSAqIG1vcmUgdGhhbiAxMCBzZWNvbmRzIHRoZW4gdGhlIGRlYnVnLXByaW50b3V0IHRyaWdnZXJzCisJICogaW4gc29mdGxvY2t1cF90aWNrKCk6CisJICovCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUvZGVzdHJveSB3YXRjaGRvZyB0aHJlYWRzIGFzIENQVXMgY29tZSBhbmQgZ286CisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitjcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCWludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwkJQlVHX09OKHBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSk7CisJCXAgPSBrdGhyZWFkX2NyZWF0ZSh3YXRjaGRvZywgaGNwdSwgIndhdGNoZG9nLyVkIiwgaG90Y3B1KTsKKwkJaWYgKElTX0VSUihwKSkgeworCQkJcHJpbnRrKCJ3YXRjaGRvZyBmb3IgJWkgZmFpbGVkXG4iLCBob3RjcHUpOworCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCX0KKyAgCQlwZXJfY3B1KHdhdGNoZG9nX3Rhc2ssIGhvdGNwdSkgPSBwOworCQlrdGhyZWFkX2JpbmQocCwgaG90Y3B1KTsKKyAJCWJyZWFrOworCWNhc2UgQ1BVX09OTElORToKKworCQl3YWtlX3VwX3Byb2Nlc3MocGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpKTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJCS8qIFVuYmluZCBzbyBpdCBjYW4gcnVuLiAgRmFsbCB0aHJ1LiAqLworCQlrdGhyZWFkX2JpbmQocGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWNhc2UgQ1BVX0RFQUQ6CisJCXAgPSBwZXJfY3B1KHdhdGNoZG9nX3Rhc2ssIGhvdGNwdSk7CisJCXBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSA9IE5VTEw7CisJCWt0aHJlYWRfc3RvcChwKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisgCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fZGV2aW5pdGRhdGEgY3B1X25mYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNwdV9jYWxsYmFjaworfTsKKworX19pbml0IHZvaWQgc3Bhd25fc29mdGxvY2t1cF90YXNrKHZvaWQpCit7CisJdm9pZCAqY3B1ID0gKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfY2FsbGJhY2soJmNwdV9uZmIsIENQVV9VUF9QUkVQQVJFLCBjcHUpOworCWNwdV9jYWxsYmFjaygmY3B1X25mYiwgQ1BVX09OTElORSwgY3B1KTsKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdV9uZmIpOworCisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7Cit9CisKZGlmZiAtLWdpdCBhL2tlcm5lbC9zcGlubG9jay5jIGIva2VybmVsL3NwaW5sb2NrLmMKaW5kZXggMGMzZjlkOC4uMDM3NWZjZCAxMDA2NDQKLS0tIGEva2VybmVsL3NwaW5sb2NrLmMKKysrIGIva2VybmVsL3NwaW5sb2NrLmMKQEAgLTMsNyArMywxMCBAQAogICoKICAqIEF1dGhvcjogWndhbmUgTXdhaWthbWJvIDx6d2FuZUBmc21sYWJzLmNvbT4KICAqCi0gKiBDb3B5cmlnaHQgKDIwMDQpIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQgKDIwMDQsIDIwMDUpIEluZ28gTW9sbmFyCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzcGlubG9jay9yd2xvY2sgaW1wbGVtZW50YXRpb25zIGZvciB0aGUKKyAqIFNNUCBhbmQgdGhlIERFQlVHX1NQSU5MT0NLIGNhc2VzLiAoVVAtbm9uZGVidWcgaW5saW5lcyB0aGVtKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTE3LDEyICsyMCwxMiBAQAogICogR2VuZXJpYyBkZWNsYXJhdGlvbiBvZiB0aGUgcmF3IHJlYWRfdHJ5bG9jaygpIGZ1bmN0aW9uLAogICogYXJjaGl0ZWN0dXJlcyBhcmUgc3VwcG9zZWQgdG8gb3B0aW1pemUgdGhpczoKICAqLwotaW50IF9fbG9ja2Z1bmMgZ2VuZXJpY19yYXdfcmVhZF90cnlsb2NrKHJ3bG9ja190ICpsb2NrKQoraW50IF9fbG9ja2Z1bmMgZ2VuZXJpY19fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCiB7Ci0JX3Jhd19yZWFkX2xvY2sobG9jayk7CisJX19yYXdfcmVhZF9sb2NrKGxvY2spOwogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChnZW5lcmljX3Jhd19yZWFkX3RyeWxvY2spOworRVhQT1JUX1NZTUJPTChnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKTsKIAogaW50IF9fbG9ja2Z1bmMgX3NwaW5fdHJ5bG9jayhzcGlubG9ja190ICpsb2NrKQogewpAQCAtNTcsNyArNjAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChfd3JpdGVfdHJ5bG9jayk7CiAKLSNpZm5kZWYgQ09ORklHX1BSRUVNUFQKKyNpZiAhZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgfHwgIWRlZmluZWQoQ09ORklHX1NNUCkKIAogdm9pZCBfX2xvY2tmdW5jIF9yZWFkX2xvY2socndsb2NrX3QgKmxvY2spCiB7CkBAIC03Miw3ICs3NSw3IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpOworCV9yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssICZmbGFncyk7CiAJcmV0dXJuIGZsYWdzOwogfQogRVhQT1JUX1NZTUJPTChfc3Bpbl9sb2NrX2lycXNhdmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDBiY2FlZDYuLmM4MDQxMmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTE3MTEsNyArMTcxMSw2IEBACiAJCQkgIHVuc2lnbmVkIGxvbmcgYXJnNCwgdW5zaWduZWQgbG9uZyBhcmc1KQogewogCWxvbmcgZXJyb3I7Ci0JaW50IHNpZzsKIAogCWVycm9yID0gc2VjdXJpdHlfdGFza19wcmN0bChvcHRpb24sIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogCWlmIChlcnJvcikKQEAgLTE3MTksMTIgKzE3MTgsMTEgQEAKIAogCXN3aXRjaCAob3B0aW9uKSB7CiAJCWNhc2UgUFJfU0VUX1BERUFUSFNJRzoKLQkJCXNpZyA9IGFyZzI7Ci0JCQlpZiAoIXZhbGlkX3NpZ25hbChzaWcpKSB7CisJCQlpZiAoIXZhbGlkX3NpZ25hbChhcmcyKSkgewogCQkJCWVycm9yID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWN1cnJlbnQtPnBkZWF0aF9zaWduYWwgPSBzaWc7CisJCQljdXJyZW50LT5wZGVhdGhfc2lnbmFsID0gYXJnMjsKIAkJCWJyZWFrOwogCQljYXNlIFBSX0dFVF9QREVBVEhTSUc6CiAJCQllcnJvciA9IHB1dF91c2VyKGN1cnJlbnQtPnBkZWF0aF9zaWduYWwsIChpbnQgX191c2VyICopYXJnMik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDUzNzdmNDAuLmY0MTUyZmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC05NTAsNiArOTUwLDcgQEAKIHsKIAlqaWZmaWVzXzY0Kys7CiAJdXBkYXRlX3RpbWVzKCk7CisJc29mdGxvY2t1cF90aWNrKHJlZ3MpOwogfQogCiAjaWZkZWYgX19BUkNIX1dBTlRfU1lTX0FMQVJNCkBAIC0xMTUzLDYgKzExNTQsMjAgQEAKIAogRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0KTsKIAorc2lnbmVkIGxvbmcgX19zY2hlZCBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKyAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworICAgICAgIHJldHVybiBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUpOworCitzaWduZWQgbG9uZyBfX3NjaGVkIHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgIHJldHVybiBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSk7CisKIC8qIFRocmVhZCBJRCAtIHRoZSBpbnRlcm5hbCBrZXJuZWwgInBpZCIgKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0dGlkKHZvaWQpCiB7CkBAIC0xMTY5LDggKzExODQsNyBAQAogCWlmICghdGltZV9hZnRlcihleHBpcmUsIG5vdykpCiAJCXJldHVybiAwOwogCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dChleHBpcmUgLSBub3cpOworCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUgLSBub3cpOwogCiAJcmV0ID0gMDsKIAlpZiAoZXhwaXJlKSB7CkBAIC0xMTk4LDggKzEyMTIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWV4cGlyZSA9IHRpbWVzcGVjX3RvX2ppZmZpZXMoJnQpICsgKHQudHZfc2VjIHx8IHQudHZfbnNlYyk7Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JZXhwaXJlID0gc2NoZWR1bGVfdGltZW91dChleHBpcmUpOworCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUpOwogCiAJcmV0ID0gMDsKIAlpZiAoZXhwaXJlKSB7CkBAIC0xNDI4LDcgKzE0NDEsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1NjQgdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIodm9pZCkKK3N0YXRpYyBpbmxpbmUgdTY0IHRpbWVfaW50ZXJwb2xhdG9yX2dldF9jb3VudGVyKGludCB3cml0ZWxvY2spCiB7CiAJdW5zaWduZWQgaW50IHNyYyA9IHRpbWVfaW50ZXJwb2xhdG9yLT5zb3VyY2U7CiAKQEAgLTE0NDIsNiArMTQ1NSwxNSBAQAogCQkJbm93ID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2N5Y2xlcyhzcmMpOwogCQkJaWYgKGxjeWNsZSAmJiB0aW1lX2FmdGVyKGxjeWNsZSwgbm93KSkKIAkJCQlyZXR1cm4gbGN5Y2xlOworCisJCQkvKiBXaGVuIGhvbGRpbmcgdGhlIHh0aW1lIHdyaXRlIGxvY2ssIHRoZXJlJ3Mgbm8gbmVlZAorCQkJICogdG8gYWRkIHRoZSBvdmVyaGVhZCBvZiB0aGUgY21weGNoZy4gIFJlYWRlcnMgYXJlCisJCQkgKiBmb3JjZSB0byByZXRyeSB1bnRpbCB0aGUgd3JpdGUgbG9jayBpcyByZWxlYXNlZC4KKwkJCSAqLworCQkJaWYgKHdyaXRlbG9jaykgeworCQkJCXRpbWVfaW50ZXJwb2xhdG9yLT5sYXN0X2N5Y2xlID0gbm93OworCQkJCXJldHVybiBub3c7CisJCQl9CiAJCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHRpbWVyIHZhbHVlIHJldHVybmVkLiBUaGUgdXNlIG9mIGNtcHhjaGcgaGVyZQogCQkJICogd2lsbCBjYXVzZSBjb250ZW50aW9uIGluIGFuIFNNUCBlbnZpcm9ubWVudC4KIAkJCSAqLwpAQCAtMTQ1NSw3ICsxNDc3LDcgQEAKIHZvaWQgdGltZV9pbnRlcnBvbGF0b3JfcmVzZXQodm9pZCkKIHsKIAl0aW1lX2ludGVycG9sYXRvci0+b2Zmc2V0ID0gMDsKLQl0aW1lX2ludGVycG9sYXRvci0+bGFzdF9jb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoKTsKKwl0aW1lX2ludGVycG9sYXRvci0+bGFzdF9jb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoMSk7CiB9CiAKICNkZWZpbmUgR0VUX1RJX05TRUNTKGNvdW50LGkpICgoKCgoY291bnQpIC0gaS0+bGFzdF9jb3VudGVyKSAmIChpKS0+bWFzaykgKiAoaSktPm5zZWNfcGVyX2N5YykgPj4gKGkpLT5zaGlmdCkKQEAgLTE0NjcsNyArMTQ4OSw3IEBACiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHRpbWVfaW50ZXJwb2xhdG9yLT5vZmZzZXQgKwotCQlHRVRfVElfTlNFQ1ModGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoKSwgdGltZV9pbnRlcnBvbGF0b3IpOworCQlHRVRfVElfTlNFQ1ModGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoMCksIHRpbWVfaW50ZXJwb2xhdG9yKTsKIH0KIAogI2RlZmluZSBJTlRFUlBPTEFUT1JfQURKVVNUIDY1NTM2CkBAIC0xNDkwLDcgKzE1MTIsNyBAQAogCSAqIGFuZCB0aGUgdHVuaW5nIGxvZ2ljIGluc3VyZXMgdGhhdC4KICAgICAgICAgICovCiAKLQljb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoKTsKKwljb3VudGVyID0gdGltZV9pbnRlcnBvbGF0b3JfZ2V0X2NvdW50ZXIoMSk7CiAJb2Zmc2V0ID0gdGltZV9pbnRlcnBvbGF0b3ItPm9mZnNldCArIEdFVF9USV9OU0VDUyhjb3VudGVyLCB0aW1lX2ludGVycG9sYXRvcik7CiAKIAlpZiAoZGVsdGFfbnNlYyA8IDAgfHwgKHVuc2lnbmVkIGxvbmcpIGRlbHRhX25zZWMgPCBvZmZzZXQpCkBAIC0xNTg4LDEwICsxNjEwLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKG1zZWNzKSArIDE7CiAKLQl3aGlsZSAodGltZW91dCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCX0KKwl3aGlsZSAodGltZW91dCkKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHRpbWVvdXQpOwogfQogCiBFWFBPUlRfU1lNQk9MKG1zbGVlcCk7CkBAIC0xNjA0LDEwICsxNjI0LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKG1zZWNzKSArIDE7CiAKLQl3aGlsZSAodGltZW91dCAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JfQorCXdoaWxlICh0aW1lb3V0ICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKIAlyZXR1cm4gamlmZmllc190b19tc2Vjcyh0aW1lb3V0KTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IGM3ZTM2ZDQuLjkxYmFjYjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTMwOCwxMCArMzA4LDkgQEAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0Jd3EgPSBrbWFsbG9jKHNpemVvZigqd3EpLCBHRlBfS0VSTkVMKTsKKwl3cSA9IGt6YWxsb2Moc2l6ZW9mKCp3cSksIEdGUF9LRVJORUwpOwogCWlmICghd3EpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldCh3cSwgMCwgc2l6ZW9mKCp3cSkpOwogCiAJd3EtPm5hbWUgPSBuYW1lOwogCS8qIFdlIGRvbid0IG5lZWQgdGhlIGRpc3RyYWN0aW9uIG9mIENQVXMgYXBwZWFyaW5nIGFuZCB2YW5pc2hpbmcuICovCkBAIC00OTksNyArNDk4LDcgQEAKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCQkvKiBDcmVhdGUgYSBuZXcgd29ya3F1ZXVlIHRocmVhZCBmb3IgaXQuICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkod3EsICZ3b3JrcXVldWVzLCBsaXN0KSB7Ci0JCQlpZiAoY3JlYXRlX3dvcmtxdWV1ZV90aHJlYWQod3EsIGhvdGNwdSkgPCAwKSB7CisJCQlpZiAoIWNyZWF0ZV93b3JrcXVldWVfdGhyZWFkKHdxLCBob3RjcHUpKSB7CiAJCQkJcHJpbnRrKCJ3b3JrcXVldWUgZm9yICVpIGZhaWxlZFxuIiwgaG90Y3B1KTsKIAkJCQlyZXR1cm4gTk9USUZZX0JBRDsKIAkJCX0KZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggZTQzMTk3ZS4uM2RlOTMzNSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTEyLDYgKzEyLDE0IEBACiAJICB0aGUga2VybmVsIHRyZWUgZG9lcy4gU3VjaCBtb2R1bGVzIHRoYXQgdXNlIGxpYnJhcnkgQ1JDLUNDSVRUCiAJICBmdW5jdGlvbnMgcmVxdWlyZSBNIGhlcmUuCiAKK2NvbmZpZyBDUkMxNgorCXRyaXN0YXRlICJDUkMxNiBmdW5jdGlvbnMiCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIGluLWtlcm5lbC10cmVlCisJICBtb2R1bGVzIHJlcXVpcmUgQ1JDMTYgZnVuY3Rpb25zLCBidXQgYSBtb2R1bGUgYnVpbHQgb3V0c2lkZQorCSAgdGhlIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzE2CisJICBmdW5jdGlvbnMgcmVxdWlyZSBNIGhlcmUuCisKIGNvbmZpZyBDUkMzMgogCXRyaXN0YXRlICJDUkMzMiBmdW5jdGlvbnMiCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDI5OWY3ZjMuLjM3NTRjOWEgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC00Niw2ICs0NiwyNSBAQAogCQkgICAgIDEzID0+ICA4IEtCCiAJCSAgICAgMTIgPT4gIDQgS0IKIAorY29uZmlnIERFVEVDVF9TT0ZUTE9DS1VQCisJYm9vbCAiRGV0ZWN0IFNvZnQgTG9ja3VwcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0ICJzb2Z0IGxvY2t1cHMiLAorCSAgd2hpY2ggYXJlIGJ1Z3MgdGhhdCBjYXVzZSB0aGUga2VybmVsIHRvIGxvb3AgaW4ga2VybmVsCisJICBtb2RlIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcywgd2l0aG91dCBnaXZpbmcgb3RoZXIgdGFza3MgYQorCSAgY2hhbmNlIHRvIHJ1bi4KKworCSAgV2hlbiBhIHNvZnQtbG9ja3VwIGlzIGRldGVjdGVkLCB0aGUga2VybmVsIHdpbGwgcHJpbnQgdGhlCisJICBjdXJyZW50IHN0YWNrIHRyYWNlICh3aGljaCB5b3Ugc2hvdWxkIHJlcG9ydCksIGJ1dCB0aGUKKwkgIHN5c3RlbSB3aWxsIHN0YXkgbG9ja2VkIHVwLiBUaGlzIGZlYXR1cmUgaGFzIG5lZ2xpZ2libGUKKwkgIG92ZXJoZWFkLgorCisJICAoTm90ZSB0aGF0ICJoYXJkIGxvY2t1cHMiIGFyZSBzZXBhcmF0ZSB0eXBlIG9mIGJ1Z3MgdGhhdAorCSAgIGNhbiBiZSBkZXRlY3RlZCB2aWEgdGhlIE5NSS13YXRjaGRvZywgb24gcGxhdGZvcm1zIHRoYXQKKwkgICBzdXBwb3J0IGl0LikKKwogY29uZmlnIFNDSEVEU1RBVFMKIAlib29sICJDb2xsZWN0IHNjaGVkdWxlciBzdGF0aXN0aWNzIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFBST0NfRlMKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCAzZTJiZDBkLi40NGE0Njc1IDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBDRkxBR1Nfa29iamVjdF91ZXZlbnQubyArPSAtRERFQlVHCiBlbmRpZgogCitvYmotJChDT05GSUdfREVCVUdfU1BJTkxPQ0spICs9IHNwaW5sb2NrX2RlYnVnLm8KIGxpYi0kKENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLKSArPSByd3NlbS1zcGlubG9jay5vCiBsaWItJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IHJ3c2VtLm8KIGxpYi0kKENPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlMpICs9IHNlbWFwaG9yZS1zbGVlcGVycy5vCkBAIC0yMywxMSArMjQsMTIgQEAKIG9iai0kKENPTkZJR19MT0NLX0tFUk5FTCkgKz0ga2VybmVsX2xvY2subwogb2JqLSQoQ09ORklHX0RFQlVHX1BSRUVNUFQpICs9IHNtcF9wcm9jZXNzb3JfaWQubwogCi1pZm5lcSAoJChDT05GSUdfSEFWRV9ERUNfTE9DSykseSkgCitpZm5lcSAoJChDT05GSUdfSEFWRV9ERUNfTE9DSykseSkKICAgbGliLXkgKz0gZGVjX2FuZF9sb2NrLm8KIGVuZGlmCiAKIG9iai0kKENPTkZJR19DUkNfQ0NJVFQpCSs9IGNyYy1jY2l0dC5vCitvYmotJChDT05GSUdfQ1JDMTYpCSs9IGNyYzE2Lm8KIG9iai0kKENPTkZJR19DUkMzMikJKz0gY3JjMzIubwogb2JqLSQoQ09ORklHX0xJQkNSQzMyQykJKz0gbGliY3JjMzJjLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0lPTUFQKSArPSBpb21hcC5vCmRpZmYgLS1naXQgYS9saWIvY3JjMTYuYyBiL2xpYi9jcmMxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWZlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3JjMTYuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogICAgICBjcmMxNi5jCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMTYuaD4KKworLyoqIENSQyB0YWJsZSBmb3IgdGhlIENSQy0xNi4gVGhlIHBvbHkgaXMgMHg4MDA1ICh4XjE2ICsgeF4xNSArIHheMiArIDEpICovCit1MTYgY29uc3QgY3JjMTZfdGFibGVbMjU2XSA9IHsKKwkweDAwMDAsIDB4QzBDMSwgMHhDMTgxLCAweDAxNDAsIDB4QzMwMSwgMHgwM0MwLCAweDAyODAsIDB4QzI0MSwKKwkweEM2MDEsIDB4MDZDMCwgMHgwNzgwLCAweEM3NDEsIDB4MDUwMCwgMHhDNUMxLCAweEM0ODEsIDB4MDQ0MCwKKwkweENDMDEsIDB4MENDMCwgMHgwRDgwLCAweENENDEsIDB4MEYwMCwgMHhDRkMxLCAweENFODEsIDB4MEU0MCwKKwkweDBBMDAsIDB4Q0FDMSwgMHhDQjgxLCAweDBCNDAsIDB4QzkwMSwgMHgwOUMwLCAweDA4ODAsIDB4Qzg0MSwKKwkweEQ4MDEsIDB4MThDMCwgMHgxOTgwLCAweEQ5NDEsIDB4MUIwMCwgMHhEQkMxLCAweERBODEsIDB4MUE0MCwKKwkweDFFMDAsIDB4REVDMSwgMHhERjgxLCAweDFGNDAsIDB4REQwMSwgMHgxREMwLCAweDFDODAsIDB4REM0MSwKKwkweDE0MDAsIDB4RDRDMSwgMHhENTgxLCAweDE1NDAsIDB4RDcwMSwgMHgxN0MwLCAweDE2ODAsIDB4RDY0MSwKKwkweEQyMDEsIDB4MTJDMCwgMHgxMzgwLCAweEQzNDEsIDB4MTEwMCwgMHhEMUMxLCAweEQwODEsIDB4MTA0MCwKKwkweEYwMDEsIDB4MzBDMCwgMHgzMTgwLCAweEYxNDEsIDB4MzMwMCwgMHhGM0MxLCAweEYyODEsIDB4MzI0MCwKKwkweDM2MDAsIDB4RjZDMSwgMHhGNzgxLCAweDM3NDAsIDB4RjUwMSwgMHgzNUMwLCAweDM0ODAsIDB4RjQ0MSwKKwkweDNDMDAsIDB4RkNDMSwgMHhGRDgxLCAweDNENDAsIDB4RkYwMSwgMHgzRkMwLCAweDNFODAsIDB4RkU0MSwKKwkweEZBMDEsIDB4M0FDMCwgMHgzQjgwLCAweEZCNDEsIDB4MzkwMCwgMHhGOUMxLCAweEY4ODEsIDB4Mzg0MCwKKwkweDI4MDAsIDB4RThDMSwgMHhFOTgxLCAweDI5NDAsIDB4RUIwMSwgMHgyQkMwLCAweDJBODAsIDB4RUE0MSwKKwkweEVFMDEsIDB4MkVDMCwgMHgyRjgwLCAweEVGNDEsIDB4MkQwMCwgMHhFREMxLCAweEVDODEsIDB4MkM0MCwKKwkweEU0MDEsIDB4MjRDMCwgMHgyNTgwLCAweEU1NDEsIDB4MjcwMCwgMHhFN0MxLCAweEU2ODEsIDB4MjY0MCwKKwkweDIyMDAsIDB4RTJDMSwgMHhFMzgxLCAweDIzNDAsIDB4RTEwMSwgMHgyMUMwLCAweDIwODAsIDB4RTA0MSwKKwkweEEwMDEsIDB4NjBDMCwgMHg2MTgwLCAweEExNDEsIDB4NjMwMCwgMHhBM0MxLCAweEEyODEsIDB4NjI0MCwKKwkweDY2MDAsIDB4QTZDMSwgMHhBNzgxLCAweDY3NDAsIDB4QTUwMSwgMHg2NUMwLCAweDY0ODAsIDB4QTQ0MSwKKwkweDZDMDAsIDB4QUNDMSwgMHhBRDgxLCAweDZENDAsIDB4QUYwMSwgMHg2RkMwLCAweDZFODAsIDB4QUU0MSwKKwkweEFBMDEsIDB4NkFDMCwgMHg2QjgwLCAweEFCNDEsIDB4NjkwMCwgMHhBOUMxLCAweEE4ODEsIDB4Njg0MCwKKwkweDc4MDAsIDB4QjhDMSwgMHhCOTgxLCAweDc5NDAsIDB4QkIwMSwgMHg3QkMwLCAweDdBODAsIDB4QkE0MSwKKwkweEJFMDEsIDB4N0VDMCwgMHg3RjgwLCAweEJGNDEsIDB4N0QwMCwgMHhCREMxLCAweEJDODEsIDB4N0M0MCwKKwkweEI0MDEsIDB4NzRDMCwgMHg3NTgwLCAweEI1NDEsIDB4NzcwMCwgMHhCN0MxLCAweEI2ODEsIDB4NzY0MCwKKwkweDcyMDAsIDB4QjJDMSwgMHhCMzgxLCAweDczNDAsIDB4QjEwMSwgMHg3MUMwLCAweDcwODAsIDB4QjA0MSwKKwkweDUwMDAsIDB4OTBDMSwgMHg5MTgxLCAweDUxNDAsIDB4OTMwMSwgMHg1M0MwLCAweDUyODAsIDB4OTI0MSwKKwkweDk2MDEsIDB4NTZDMCwgMHg1NzgwLCAweDk3NDEsIDB4NTUwMCwgMHg5NUMxLCAweDk0ODEsIDB4NTQ0MCwKKwkweDlDMDEsIDB4NUNDMCwgMHg1RDgwLCAweDlENDEsIDB4NUYwMCwgMHg5RkMxLCAweDlFODEsIDB4NUU0MCwKKwkweDVBMDAsIDB4OUFDMSwgMHg5QjgxLCAweDVCNDAsIDB4OTkwMSwgMHg1OUMwLCAweDU4ODAsIDB4OTg0MSwKKwkweDg4MDEsIDB4NDhDMCwgMHg0OTgwLCAweDg5NDEsIDB4NEIwMCwgMHg4QkMxLCAweDhBODEsIDB4NEE0MCwKKwkweDRFMDAsIDB4OEVDMSwgMHg4RjgxLCAweDRGNDAsIDB4OEQwMSwgMHg0REMwLCAweDRDODAsIDB4OEM0MSwKKwkweDQ0MDAsIDB4ODRDMSwgMHg4NTgxLCAweDQ1NDAsIDB4ODcwMSwgMHg0N0MwLCAweDQ2ODAsIDB4ODY0MSwKKwkweDgyMDEsIDB4NDJDMCwgMHg0MzgwLCAweDgzNDEsIDB4NDEwMCwgMHg4MUMxLCAweDgwODEsIDB4NDA0MAorfTsKK0VYUE9SVF9TWU1CT0woY3JjMTZfdGFibGUpOworCisvKioKKyAqIENvbXB1dGUgdGhlIENSQy0xNiBmb3IgdGhlIGRhdGEgYnVmZmVyCisgKgorICogQHBhcmFtIGNyYyAgICAgcHJldmlvdXMgQ1JDIHZhbHVlCisgKiBAcGFyYW0gYnVmZmVyICBkYXRhIHBvaW50ZXIKKyAqIEBwYXJhbSBsZW4gICAgIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgKiBAcmV0dXJuICAgICAgICB0aGUgdXBkYXRlZCBDUkMgdmFsdWUKKyAqLwordTE2IGNyYzE2KHUxNiBjcmMsIHU4IGNvbnN0ICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCQljcmMgPSBjcmMxNl9ieXRlKGNyYywgKmJ1ZmZlcisrKTsKKwlyZXR1cm4gY3JjOworfQorRVhQT1JUX1NZTUJPTChjcmMxNik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1JDMTYgY2FsY3VsYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2xpYi9kZWNfYW5kX2xvY2suYyBiL2xpYi9kZWNfYW5kX2xvY2suYwppbmRleCA2NjU4ZDgxLi4yMzc3YWYwIDEwMDY0NAotLS0gYS9saWIvZGVjX2FuZF9sb2NrLmMKKysrIGIvbGliL2RlY19hbmRfbG9jay5jCkBAIC0yNSw4ICsyNSw2IEBACiAgKiB0aGlzIGlzIHRyaXZpYWxseSBkb25lIGVmZmljaWVudGx5IHVzaW5nIGEgbG9hZC1sb2NrZWQKICAqIHN0b3JlLWNvbmRpdGlvbmFsIGFwcHJvYWNoLCBmb3IgZXhhbXBsZS4KICAqLwotCi0jaWZuZGVmIEFUT01JQ19ERUNfQU5EX0xPQ0sKIGludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQogewogCXNwaW5fbG9jayhsb2NrKTsKQEAgLTM3LDQgKzM1LDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChfYXRvbWljX2RlY19hbmRfbG9jayk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9rZXJuZWxfbG9jay5jIGIvbGliL2tlcm5lbF9sb2NrLmMKaW5kZXggYmQyYmM1ZC4uY2I1NDkwZSAxMDA2NDQKLS0tIGEvbGliL2tlcm5lbF9sb2NrLmMKKysrIGIvbGliL2tlcm5lbF9sb2NrLmMKQEAgLTE3Nyw4ICsxNzcsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX191bmxvY2tfa2VybmVsKHZvaWQpCiB7Ci0JX3Jhd19zcGluX3VubG9jaygma2VybmVsX2ZsYWcpOwotCXByZWVtcHRfZW5hYmxlKCk7CisJc3Bpbl91bmxvY2soJmtlcm5lbF9mbGFnKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2xpYi9rbGlzdC5jIGIvbGliL2tsaXN0LmMKaW5kZXggYTcwYzgzNi4uYmIyZjM1NSAxMDA2NDQKLS0tIGEvbGliL2tsaXN0LmMKKysrIGIvbGliL2tsaXN0LmMKQEAgLTQyLDEyICs0MiwyMyBAQAogLyoqCiAgKglrbGlzdF9pbml0IC0gSW5pdGlhbGl6ZSBhIGtsaXN0IHN0cnVjdHVyZS4gCiAgKglAazoJVGhlIGtsaXN0IHdlJ3JlIGluaXRpYWxpemluZy4KKyAqCUBnZXQ6CVRoZSBnZXQgZnVuY3Rpb24gZm9yIHRoZSBlbWJlZGRpbmcgb2JqZWN0IChOVUxMIGlmIG5vbmUpCisgKglAcHV0OglUaGUgcHV0IGZ1bmN0aW9uIGZvciB0aGUgZW1iZWRkaW5nIG9iamVjdCAoTlVMTCBpZiBub25lKQorICoKKyAqIEluaXRpYWxpc2VzIHRoZSBrbGlzdCBzdHJ1Y3R1cmUuICBJZiB0aGUga2xpc3Rfbm9kZSBzdHJ1Y3R1cmVzIGFyZQorICogZ29pbmcgdG8gYmUgZW1iZWRkZWQgaW4gcmVmY291bnRlZCBvYmplY3RzIChuZWNlc3NhcnkgZm9yIHNhZmUKKyAqIGRlbGV0aW9uKSB0aGVuIHRoZSBnZXQvcHV0IGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXNlCisgKiBmdW5jdGlvbnMgdGhhdCB0YWtlIGFuZCByZWxlYXNlIHJlZmVyZW5jZXMgb24gdGhlIGVtYmVkZGluZworICogb2JqZWN0cy4KICAqLwogCi12b2lkIGtsaXN0X2luaXQoc3RydWN0IGtsaXN0ICogaykKK3ZvaWQga2xpc3RfaW5pdChzdHJ1Y3Qga2xpc3QgKiBrLCB2b2lkICgqZ2V0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSwKKwkJdm9pZCAoKnB1dCkoc3RydWN0IGtsaXN0X25vZGUgKikpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmstPmtfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmstPmtfbG9jayk7CisJay0+Z2V0ID0gZ2V0OworCWstPnB1dCA9IHB1dDsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfaW5pdCk7CkBAIC03NCw2ICs4NSw4IEBACiAJaW5pdF9jb21wbGV0aW9uKCZuLT5uX3JlbW92ZWQpOwogCWtyZWZfaW5pdCgmbi0+bl9yZWYpOwogCW4tPm5fa2xpc3QgPSBrOworCWlmIChrLT5nZXQpCisJCWstPmdldChuKTsKIH0KIAogCkBAIC0xMTAsOSArMTIzLDEyIEBACiBzdGF0aWMgdm9pZCBrbGlzdF9yZWxlYXNlKHN0cnVjdCBrcmVmICoga3JlZikKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGtsaXN0X25vZGUsIG5fcmVmKTsKKwl2b2lkICgqcHV0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSA9IG4tPm5fa2xpc3QtPnB1dDsKIAlsaXN0X2RlbCgmbi0+bl9ub2RlKTsKIAljb21wbGV0ZSgmbi0+bl9yZW1vdmVkKTsKIAluLT5uX2tsaXN0ID0gTlVMTDsKKwlpZiAocHV0KQorCQlwdXQobik7CiB9CiAKIHN0YXRpYyBpbnQga2xpc3RfZGVjX2FuZF9kZWwoc3RydWN0IGtsaXN0X25vZGUgKiBuKQpkaWZmIC0tZ2l0IGEvbGliL3JhZGl4LXRyZWUuYyBiL2xpYi9yYWRpeC10cmVlLmMKaW5kZXggMTBiZWQxYy4uNmE4YmM2ZSAxMDA2NDQKLS0tIGEvbGliL3JhZGl4LXRyZWUuYworKysgYi9saWIvcmFkaXgtdHJlZS5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBNb21jaGlsIFZlbGlrb3YKICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMSBDaHJpc3RvcGggSGVsbHdpZworICogQ29weXJpZ2h0IChDKSAyMDA1IFNHSSwgQ2hyaXN0b3BoIExhbWV0ZXIgPGNsYW1ldGVyQHNnaS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTUxLDcgKzUyLDcgQEAKIH07CiAKIHN0cnVjdCByYWRpeF90cmVlX3BhdGggewotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsICoqc2xvdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOwogCWludCBvZmZzZXQ7CiB9OwogCkBAIC0xMDksNyArMTEwLDcgQEAKICAqIHN1Y2Nlc3MsIHJldHVybiB6ZXJvLCB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQuICBPbiBlcnJvciwgcmV0dXJuIC1FTk9NRU0KICAqIHdpdGggcHJlZW1wdGlvbiBub3QgZGlzYWJsZWQuCiAgKi8KLWludCByYWRpeF90cmVlX3ByZWxvYWQoaW50IGdmcF9tYXNrKQoraW50IHJhZGl4X3RyZWVfcHJlbG9hZCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCAqcnRwOwogCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CkBAIC0yMjcsNyArMjI4LDcgQEAKIGludCByYWRpeF90cmVlX2luc2VydChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAogCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqaXRlbSkKIHsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlID0gTlVMTCwgKnRtcCwgKipzbG90OworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUgPSBOVUxMLCAqc2xvdDsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKIAlpbnQgb2Zmc2V0OwogCWludCBlcnJvcjsKQEAgLTI0MCwzOCArMjQxLDQyIEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0Jc2xvdCA9ICZyb290LT5ybm9kZTsKKwlzbG90ID0gcm9vdC0+cm5vZGU7CiAJaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OwogCXNoaWZ0ID0gKGhlaWdodC0xKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwogCiAJb2Zmc2V0ID0gMDsJCQkvKiB1bmluaXRpYWxpc2VkIHZhciB3YXJuaW5nICovCiAJd2hpbGUgKGhlaWdodCA+IDApIHsKLQkJaWYgKCpzbG90ID09IE5VTEwpIHsKKwkJaWYgKHNsb3QgPT0gTlVMTCkgewogCQkJLyogSGF2ZSB0byBhZGQgYSBjaGlsZCBub2RlLiAgKi8KLQkJCWlmICghKHRtcCA9IHJhZGl4X3RyZWVfbm9kZV9hbGxvYyhyb290KSkpCisJCQlpZiAoIShzbG90ID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKHJvb3QpKSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCSpzbG90ID0gdG1wOwotCQkJaWYgKG5vZGUpCisJCQlpZiAobm9kZSkgeworCQkJCW5vZGUtPnNsb3RzW29mZnNldF0gPSBzbG90OwogCQkJCW5vZGUtPmNvdW50Kys7CisJCQl9IGVsc2UKKwkJCQlyb290LT5ybm9kZSA9IHNsb3Q7CiAJCX0KIAogCQkvKiBHbyBhIGxldmVsIGRvd24gKi8KIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7Ci0JCW5vZGUgPSAqc2xvdDsKLQkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKShub2RlLT5zbG90cyArIG9mZnNldCk7CisJCW5vZGUgPSBzbG90OworCQlzbG90ID0gbm9kZS0+c2xvdHNbb2Zmc2V0XTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJCWhlaWdodC0tOwogCX0KIAotCWlmICgqc2xvdCAhPSBOVUxMKQorCWlmIChzbG90ICE9IE5VTEwpCiAJCXJldHVybiAtRUVYSVNUOworCiAJaWYgKG5vZGUpIHsKIAkJbm9kZS0+Y291bnQrKzsKKwkJbm9kZS0+c2xvdHNbb2Zmc2V0XSA9IGl0ZW07CiAJCUJVR19PTih0YWdfZ2V0KG5vZGUsIDAsIG9mZnNldCkpOwogCQlCVUdfT04odGFnX2dldChub2RlLCAxLCBvZmZzZXQpKTsKLQl9CisJfSBlbHNlCisJCXJvb3QtPnJub2RlID0gaXRlbTsKIAotCSpzbG90ID0gaXRlbTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9pbnNlcnQpOwpAQCAtMjg2LDI3ICsyOTEsMjUgQEAKIHZvaWQgKnJhZGl4X3RyZWVfbG9va3VwKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7CiAJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKnNsb3Q7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKIAogCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKIAlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCiAJCXJldHVybiBOVUxMOwogCiAJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7Ci0Jc2xvdCA9ICZyb290LT5ybm9kZTsKKwlzbG90ID0gcm9vdC0+cm5vZGU7CiAKIAl3aGlsZSAoaGVpZ2h0ID4gMCkgewotCQlpZiAoKnNsb3QgPT0gTlVMTCkKKwkJaWYgKHNsb3QgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwogCi0JCXNsb3QgPSAoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKikKLQkJCSgoKnNsb3QpLT5zbG90cyArCi0JCQkJKChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLKSk7CisJCXNsb3QgPSBzbG90LT5zbG90c1soaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTS107CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwogCQloZWlnaHQtLTsKIAl9CiAKLQlyZXR1cm4gKnNsb3Q7CisJcmV0dXJuIHNsb3Q7CiB9CiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfbG9va3VwKTsKIApAQCAtMzI2LDI3ICszMjksMjcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCB0YWcpCiB7CiAJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKnNsb3Q7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKIAogCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKIAlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCiAJCXJldHVybiBOVUxMOwogCiAJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKLQlzbG90ID0gJnJvb3QtPnJub2RlOworCXNsb3QgPSByb290LT5ybm9kZTsKIAogCXdoaWxlIChoZWlnaHQgPiAwKSB7CiAJCWludCBvZmZzZXQ7CiAKIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7Ci0JCXRhZ19zZXQoKnNsb3QsIHRhZywgb2Zmc2V0KTsKLQkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKSgoKnNsb3QpLT5zbG90cyArIG9mZnNldCk7Ci0JCUJVR19PTigqc2xvdCA9PSBOVUxMKTsKKwkJdGFnX3NldChzbG90LCB0YWcsIG9mZnNldCk7CisJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOworCQlCVUdfT04oc2xvdCA9PSBOVUxMKTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJCWhlaWdodC0tOwogCX0KIAotCXJldHVybiAqc2xvdDsKKwlyZXR1cm4gc2xvdDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV90YWdfc2V0KTsKIApAQCAtMzY3LDYgKzM3MCw3IEBACiAJCQl1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgdGFnKQogewogCXN0cnVjdCByYWRpeF90cmVlX3BhdGggcGF0aFtSQURJWF9UUkVFX01BWF9QQVRIXSwgKnBhdGhwID0gcGF0aDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwogCXVuc2lnbmVkIGludCBoZWlnaHQsIHNoaWZ0OwogCXZvaWQgKnJldCA9IE5VTEw7CiAKQEAgLTM3NiwzOCArMzgwLDM3IEBACiAKIAlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwogCXBhdGhwLT5ub2RlID0gTlVMTDsKLQlwYXRocC0+c2xvdCA9ICZyb290LT5ybm9kZTsKKwlzbG90ID0gcm9vdC0+cm5vZGU7CiAKIAl3aGlsZSAoaGVpZ2h0ID4gMCkgewogCQlpbnQgb2Zmc2V0OwogCi0JCWlmICgqcGF0aHAtPnNsb3QgPT0gTlVMTCkKKwkJaWYgKHNsb3QgPT0gTlVMTCkKIAkJCWdvdG8gb3V0OwogCiAJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLOwogCQlwYXRocFsxXS5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXBhdGhwWzFdLm5vZGUgPSAqcGF0aHBbMF0uc2xvdDsKLQkJcGF0aHBbMV0uc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKQotCQkJCShwYXRocFsxXS5ub2RlLT5zbG90cyArIG9mZnNldCk7CisJCXBhdGhwWzFdLm5vZGUgPSBzbG90OworCQlzbG90ID0gc2xvdC0+c2xvdHNbb2Zmc2V0XTsKIAkJcGF0aHArKzsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJCWhlaWdodC0tOwogCX0KIAotCXJldCA9ICpwYXRocFswXS5zbG90OworCXJldCA9IHNsb3Q7CiAJaWYgKHJldCA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAogCWRvIHsKIAkJaW50IGlkeDsKIAotCQl0YWdfY2xlYXIocGF0aHBbMF0ubm9kZSwgdGFnLCBwYXRocFswXS5vZmZzZXQpOworCQl0YWdfY2xlYXIocGF0aHAtPm5vZGUsIHRhZywgcGF0aHAtPm9mZnNldCk7CiAJCWZvciAoaWR4ID0gMDsgaWR4IDwgUkFESVhfVFJFRV9UQUdfTE9OR1M7IGlkeCsrKSB7Ci0JCQlpZiAocGF0aHBbMF0ubm9kZS0+dGFnc1t0YWddW2lkeF0pCisJCQlpZiAocGF0aHAtPm5vZGUtPnRhZ3NbdGFnXVtpZHhdKQogCQkJCWdvdG8gb3V0OwogCQl9CiAJCXBhdGhwLS07Ci0JfSB3aGlsZSAocGF0aHBbMF0ubm9kZSk7CisJfSB3aGlsZSAocGF0aHAtPm5vZGUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC00MTUsMjEgKzQxOCwyMiBAQAogCiAjaWZuZGVmIF9fS0VSTkVMX18JLyogT25seSB0aGUgdGVzdCBoYXJuZXNzIHVzZXMgdGhpcyBhdCBwcmVzZW50ICovCiAvKioKLSAqCXJhZGl4X3RyZWVfdGFnX2dldCAtIGdldCBhIHRhZyBvbiBhIHJhZGl4IHRyZWUgbm9kZQotICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKLSAqCUBpbmRleDoJCWluZGV4IGtleQotICoJQHRhZzogCQl0YWcgaW5kZXgKKyAqIHJhZGl4X3RyZWVfdGFnX2dldCAtIGdldCBhIHRhZyBvbiBhIHJhZGl4IHRyZWUgbm9kZQorICogQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqIEBpbmRleDoJCWluZGV4IGtleQorICogQHRhZzogCQl0YWcgaW5kZXgKICAqCi0gKglSZXR1cm4gdGhlIHNlYXJjaCB0YWcgY29ycmVzcG9uZ2luZyB0byBAaW5kZXggaW4gdGhlIHJhZGl4IHRyZWUuCisgKiBSZXR1cm4gdmFsdWVzOgogICoKLSAqCVJldHVybnMgemVybyBpZiB0aGUgdGFnIGlzIHVuc2V0LCBvciBpZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGl0ZW0KLSAqCWluIHRoZSB0cmVlLgorICogIDA6IHRhZyBub3QgcHJlc2VudAorICogIDE6IHRhZyBwcmVzZW50LCBzZXQKKyAqIC0xOiB0YWcgcHJlc2VudCwgdW5zZXQKICAqLwogaW50IHJhZGl4X3RyZWVfdGFnX2dldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAogCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgaW50IHRhZykKIHsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqc2xvdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwogCWludCBzYXdfdW5zZXRfdGFnID0gMDsKIAogCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKQEAgLTQzNywxMiArNDQxLDEyIEBACiAJCXJldHVybiAwOwogCiAJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKLQlzbG90ID0gJnJvb3QtPnJub2RlOworCXNsb3QgPSByb290LT5ybm9kZTsKIAogCWZvciAoIDsgOyApIHsKIAkJaW50IG9mZnNldDsKIAotCQlpZiAoKnNsb3QgPT0gTlVMTCkKKwkJaWYgKHNsb3QgPT0gTlVMTCkKIAkJCXJldHVybiAwOwogCiAJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLOwpAQCAtNDUxLDE1ICs0NTUsMTUgQEAKIAkJICogVGhpcyBpcyBqdXN0IGEgZGVidWcgY2hlY2suICBMYXRlciwgd2UgY2FuIGJhbGUgYXMgc29vbiBhcwogCQkgKiB3ZSBzZWUgYW4gdW5zZXQgdGFnLgogCQkgKi8KLQkJaWYgKCF0YWdfZ2V0KCpzbG90LCB0YWcsIG9mZnNldCkpCisJCWlmICghdGFnX2dldChzbG90LCB0YWcsIG9mZnNldCkpCiAJCQlzYXdfdW5zZXRfdGFnID0gMTsKIAkJaWYgKGhlaWdodCA9PSAxKSB7Ci0JCQlpbnQgcmV0ID0gdGFnX2dldCgqc2xvdCwgdGFnLCBvZmZzZXQpOworCQkJaW50IHJldCA9IHRhZ19nZXQoc2xvdCwgdGFnLCBvZmZzZXQpOwogCiAJCQlCVUdfT04ocmV0ICYmIHNhd191bnNldF90YWcpOwotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybiByZXQgPyAxIDogLTE7CiAJCX0KLQkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKSgoKnNsb3QpLT5zbG90cyArIG9mZnNldCk7CisJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOwogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKIAkJaGVpZ2h0LS07CiAJfQpAQCAtNDcyLDE3ICs0NzYsMjEgQEAKIAl1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zLCB1bnNpZ25lZCBsb25nICpuZXh0X2luZGV4KQogewogCXVuc2lnbmVkIGludCBucl9mb3VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IHNoaWZ0OwotCXVuc2lnbmVkIGludCBoZWlnaHQgPSByb290LT5oZWlnaHQ7CisJdW5zaWduZWQgaW50IHNoaWZ0LCBoZWlnaHQ7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwloZWlnaHQgPSByb290LT5oZWlnaHQ7CisJaWYgKGhlaWdodCA9PSAwKQorCQlnb3RvIG91dDsKIAogCXNoaWZ0ID0gKGhlaWdodC0xKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwogCXNsb3QgPSByb290LT5ybm9kZTsKIAotCXdoaWxlIChoZWlnaHQgPiAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgaSA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLOworCWZvciAoIDsgaGVpZ2h0ID4gMTsgaGVpZ2h0LS0pIHsKIAotCQlmb3IgKCA7IGkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKKwkJZm9yIChpID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0sgOworCQkJCWkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKIAkJCWlmIChzbG90LT5zbG90c1tpXSAhPSBOVUxMKQogCQkJCWJyZWFrOwogCQkJaW5kZXggJj0gfigoMVVMIDw8IHNoaWZ0KSAtIDEpOwpAQCAtNDkyLDIyICs1MDAsMjAgQEAKIAkJfQogCQlpZiAoaSA9PSBSQURJWF9UUkVFX01BUF9TSVpFKQogCQkJZ290byBvdXQ7Ci0JCWhlaWdodC0tOwotCQlpZiAoaGVpZ2h0ID09IDApIHsJLyogQm90dG9tIGxldmVsOiBncmFiIHNvbWUgaXRlbXMgKi8KLQkJCXVuc2lnbmVkIGxvbmcgaiA9IGluZGV4ICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKIAotCQkJZm9yICggOyBqIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaisrKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQlpZiAoc2xvdC0+c2xvdHNbal0pIHsKLQkJCQkJcmVzdWx0c1tucl9mb3VuZCsrXSA9IHNsb3QtPnNsb3RzW2pdOwotCQkJCQlpZiAobnJfZm91bmQgPT0gbWF4X2l0ZW1zKQotCQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJfQotCQl9CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwogCQlzbG90ID0gc2xvdC0+c2xvdHNbaV07CiAJfQorCisJLyogQm90dG9tIGxldmVsOiBncmFiIHNvbWUgaXRlbXMgKi8KKwlmb3IgKGkgPSBpbmRleCAmIFJBRElYX1RSRUVfTUFQX01BU0s7IGkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKKwkJaW5kZXgrKzsKKwkJaWYgKHNsb3QtPnNsb3RzW2ldKSB7CisJCQlyZXN1bHRzW25yX2ZvdW5kKytdID0gc2xvdC0+c2xvdHNbaV07CisJCQlpZiAobnJfZm91bmQgPT0gbWF4X2l0ZW1zKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQogb3V0OgogCSpuZXh0X2luZGV4ID0gaW5kZXg7CiAJcmV0dXJuIG5yX2ZvdW5kOwpAQCAtNjU1LDYgKzY2MSw3IEBACiB7CiAJc3RydWN0IHJhZGl4X3RyZWVfcGF0aCBwYXRoW1JBRElYX1RSRUVfTUFYX1BBVEhdLCAqcGF0aHAgPSBwYXRoOwogCXN0cnVjdCByYWRpeF90cmVlX3BhdGggKm9yaWdfcGF0aHA7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKIAl2b2lkICpyZXQgPSBOVUxMOwogCWNoYXIgdGFnc1tSQURJWF9UUkVFX1RBR1NdOwpAQCAtNjY2LDI1ICs2NzMsMjMgQEAKIAogCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJcGF0aHAtPm5vZGUgPSBOVUxMOwotCXBhdGhwLT5zbG90ID0gJnJvb3QtPnJub2RlOworCXNsb3QgPSByb290LT5ybm9kZTsKIAotCXdoaWxlIChoZWlnaHQgPiAwKSB7CisJZm9yICggOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSkgewogCQlpbnQgb2Zmc2V0OwogCi0JCWlmICgqcGF0aHAtPnNsb3QgPT0gTlVMTCkKKwkJaWYgKHNsb3QgPT0gTlVMTCkKIAkJCWdvdG8gb3V0OwogCiAJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLOwogCQlwYXRocFsxXS5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXBhdGhwWzFdLm5vZGUgPSAqcGF0aHBbMF0uc2xvdDsKLQkJcGF0aHBbMV0uc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKQotCQkJCShwYXRocFsxXS5ub2RlLT5zbG90cyArIG9mZnNldCk7CisJCXBhdGhwWzFdLm5vZGUgPSBzbG90OworCQlzbG90ID0gc2xvdC0+c2xvdHNbb2Zmc2V0XTsKIAkJcGF0aHArKzsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7Ci0JCWhlaWdodC0tOwogCX0KIAotCXJldCA9ICpwYXRocFswXS5zbG90OworCXJldCA9IHNsb3Q7CiAJaWYgKHJldCA9PSBOVUxMKQogCQlnb3RvIG91dDsKIApAQCAtNzA0LDEwICs3MDksMTAgQEAKIAkJCWlmICh0YWdzW3RhZ10pCiAJCQkJY29udGludWU7CiAKLQkJCXRhZ19jbGVhcihwYXRocFswXS5ub2RlLCB0YWcsIHBhdGhwWzBdLm9mZnNldCk7CisJCQl0YWdfY2xlYXIocGF0aHAtPm5vZGUsIHRhZywgcGF0aHAtPm9mZnNldCk7CiAKIAkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUkFESVhfVFJFRV9UQUdfTE9OR1M7IGlkeCsrKSB7Ci0JCQkJaWYgKHBhdGhwWzBdLm5vZGUtPnRhZ3NbdGFnXVtpZHhdKSB7CisJCQkJaWYgKHBhdGhwLT5ub2RlLT50YWdzW3RhZ11baWR4XSkgewogCQkJCQl0YWdzW3RhZ10gPSAxOwogCQkJCQlucl9jbGVhcmVkX3RhZ3MtLTsKIAkJCQkJYnJlYWs7CkBAIC03MTUsMTggKzcyMCwxOSBAQAogCQkJfQogCQl9CiAJCXBhdGhwLS07Ci0JfSB3aGlsZSAocGF0aHBbMF0ubm9kZSAmJiBucl9jbGVhcmVkX3RhZ3MpOworCX0gd2hpbGUgKHBhdGhwLT5ub2RlICYmIG5yX2NsZWFyZWRfdGFncyk7CiAKLQlwYXRocCA9IG9yaWdfcGF0aHA7Ci0JKnBhdGhwWzBdLnNsb3QgPSBOVUxMOwotCXdoaWxlIChwYXRocFswXS5ub2RlICYmIC0tcGF0aHBbMF0ubm9kZS0+Y291bnQgPT0gMCkgewotCQlwYXRocC0tOwotCQlCVUdfT04oKnBhdGhwWzBdLnNsb3QgPT0gTlVMTCk7Ci0JCSpwYXRocFswXS5zbG90ID0gTlVMTDsKLQkJcmFkaXhfdHJlZV9ub2RlX2ZyZWUocGF0aHBbMV0ubm9kZSk7CisJLyogTm93IGZyZWUgdGhlIG5vZGVzIHdlIGRvIG5vdCBuZWVkIGFueW1vcmUgKi8KKwlmb3IgKHBhdGhwID0gb3JpZ19wYXRocDsgcGF0aHAtPm5vZGU7IHBhdGhwLS0pIHsKKwkJcGF0aHAtPm5vZGUtPnNsb3RzW3BhdGhwLT5vZmZzZXRdID0gTlVMTDsKKwkJaWYgKC0tcGF0aHAtPm5vZGUtPmNvdW50KQorCQkJZ290byBvdXQ7CisKKwkJLyogTm9kZSB3aXRoIHplcm8gc2xvdHMgaW4gdXNlIHNvIGZyZWUgaXQgKi8KKwkJcmFkaXhfdHJlZV9ub2RlX2ZyZWUocGF0aHAtPm5vZGUpOwogCX0KLQlpZiAocm9vdC0+cm5vZGUgPT0gTlVMTCkKLQkJcm9vdC0+aGVpZ2h0ID0gMDsKKwlyb290LT5ybm9kZSA9IE5VTEw7CisJcm9vdC0+aGVpZ2h0ID0gMDsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbGliL3NvcnQuYyBiL2xpYi9zb3J0LmMKaW5kZXggYjczZGJiMC4uZGRjNGQzNSAxMDA2NDQKLS0tIGEvbGliL3NvcnQuYworKysgYi9saWIvc29ydC5jCkBAIC02LDE1ICs2LDE2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAKLXZvaWQgdTMyX3N3YXAodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCitzdGF0aWMgdm9pZCB1MzJfc3dhcCh2b2lkICphLCB2b2lkICpiLCBpbnQgc2l6ZSkKIHsKIAl1MzIgdCA9ICoodTMyICopYTsKIAkqKHUzMiAqKWEgPSAqKHUzMiAqKWI7CiAJKih1MzIgKiliID0gdDsKIH0KIAotdm9pZCBnZW5lcmljX3N3YXAodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBnZW5lcmljX3N3YXAodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCiB7CiAJY2hhciB0OwogCmRpZmYgLS1naXQgYS9saWIvc3BpbmxvY2tfZGVidWcuYyBiL2xpYi9zcGlubG9ja19kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmFkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3BpbmxvY2tfZGVidWcuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzcGlubG9jay9yd2xvY2sgaW1wbGVtZW50YXRpb25zIGZvcgorICogREVCVUdfU1BJTkxPQ0suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworc3RhdGljIHZvaWQgc3Bpbl9idWcoc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqbXNnKQoreworCXN0YXRpYyBsb25nIHByaW50X29uY2UgPSAxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXIgPSBOVUxMOworCisJaWYgKHhjaGcoJnByaW50X29uY2UsIDApKSB7CisJCWlmIChsb2NrLT5vd25lciAmJiBsb2NrLT5vd25lciAhPSBTUElOTE9DS19PV05FUl9JTklUKQorCQkJb3duZXIgPSBsb2NrLT5vd25lcjsKKwkJcHJpbnRrKCJCVUc6IHNwaW5sb2NrICVzIG9uIENQVSMlZCwgJXMvJWRcbiIsCisJCQltc2csIHNtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKKwkJcHJpbnRrKCIgbG9jazogJXAsIC5tYWdpYzogJTA4eCwgLm93bmVyOiAlcy8lZCwgLm93bmVyX2NwdTogJWRcbiIsCisJCQlsb2NrLCBsb2NrLT5tYWdpYywKKwkJCW93bmVyID8gb3duZXItPmNvbW0gOiAiPG5vbmU+IiwKKwkJCW93bmVyID8gb3duZXItPnBpZCA6IC0xLAorCQkJbG9jay0+b3duZXJfY3B1KTsKKwkJZHVtcF9zdGFjaygpOworI2lmZGVmIENPTkZJR19TTVAKKwkJLyoKKwkJICogV2UgY2Fubm90IGNvbnRpbnVlIG9uIFNNUDoKKwkJICovCisvLwkJcGFuaWMoImJhZCBsb2NraW5nIik7CisjZW5kaWYKKwl9Cit9CisKKyNkZWZpbmUgU1BJTl9CVUdfT04oY29uZCwgbG9jaywgbXNnKSBpZiAodW5saWtlbHkoY29uZCkpIHNwaW5fYnVnKGxvY2ssIG1zZykKKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3NwaW5fbG9ja19iZWZvcmUoc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlTUElOX0JVR19PTihsb2NrLT5tYWdpYyAhPSBTUElOTE9DS19NQUdJQywgbG9jaywgImJhZCBtYWdpYyIpOworCVNQSU5fQlVHX09OKGxvY2stPm93bmVyID09IGN1cnJlbnQsIGxvY2ssICJyZWN1cnNpb24iKTsKKwlTUElOX0JVR19PTihsb2NrLT5vd25lcl9jcHUgPT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQkJCQlsb2NrLCAiY3B1IHJlY3Vyc2lvbiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfc3Bpbl9sb2NrX2FmdGVyKHNwaW5sb2NrX3QgKmxvY2spCit7CisJbG9jay0+b3duZXJfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlsb2NrLT5vd25lciA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQoreworCVNQSU5fQlVHX09OKGxvY2stPm1hZ2ljICE9IFNQSU5MT0NLX01BR0lDLCBsb2NrLCAiYmFkIG1hZ2ljIik7CisJU1BJTl9CVUdfT04oIXNwaW5faXNfbG9ja2VkKGxvY2spLCBsb2NrLCAiYWxyZWFkeSB1bmxvY2tlZCIpOworCVNQSU5fQlVHX09OKGxvY2stPm93bmVyICE9IGN1cnJlbnQsIGxvY2ssICJ3cm9uZyBvd25lciIpOworCVNQSU5fQlVHX09OKGxvY2stPm93bmVyX2NwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCQkJCWxvY2ssICJ3cm9uZyBDUFUiKTsKKwlsb2NrLT5vd25lciA9IFNQSU5MT0NLX09XTkVSX0lOSVQ7CisJbG9jay0+b3duZXJfY3B1ID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3Bpbl9sb2NrX2RlYnVnKHNwaW5sb2NrX3QgKmxvY2spCit7CisJaW50IHByaW50X29uY2UgPSAxOworCXU2NCBpOworCisJZm9yICg7OykgeworCQlmb3IgKGkgPSAwOyBpIDwgbG9vcHNfcGVyX2ppZmZ5ICogSFo7IGkrKykgeworCQkJY3B1X3JlbGF4KCk7CisJCQlpZiAoX19yYXdfc3Bpbl90cnlsb2NrKCZsb2NrLT5yYXdfbG9jaykpCisJCQkJcmV0dXJuOworCQl9CisJCS8qIGxvY2t1cCBzdXNwZWN0ZWQ6ICovCisJCWlmIChwcmludF9vbmNlKSB7CisJCQlwcmludF9vbmNlID0gMDsKKwkJCXByaW50aygiQlVHOiBzcGlubG9jayBsb2NrdXAgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsCisJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkJCWxvY2spOworCQkJZHVtcF9zdGFjaygpOworCQl9CisJfQorfQorCit2b2lkIF9yYXdfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2spCit7CisJZGVidWdfc3Bpbl9sb2NrX2JlZm9yZShsb2NrKTsKKwlpZiAodW5saWtlbHkoIV9fcmF3X3NwaW5fdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spKSkKKwkJX19zcGluX2xvY2tfZGVidWcobG9jayk7CisJZGVidWdfc3Bpbl9sb2NrX2FmdGVyKGxvY2spOworfQorCitpbnQgX3Jhd19zcGluX3RyeWxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgcmV0ID0gX19yYXdfc3Bpbl90cnlsb2NrKCZsb2NrLT5yYXdfbG9jayk7CisKKwlpZiAocmV0KQorCQlkZWJ1Z19zcGluX2xvY2tfYWZ0ZXIobG9jayk7CisjaWZuZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIE11c3Qgbm90IGhhcHBlbiBvbiBVUDoKKwkgKi8KKwlTUElOX0JVR19PTighcmV0LCBsb2NrLCAidHJ5bG9jayBmYWlsdXJlIG9uIFVQIik7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9yYXdfc3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlkZWJ1Z19zcGluX3VubG9jayhsb2NrKTsKKwlfX3Jhd19zcGluX3VubG9jaygmbG9jay0+cmF3X2xvY2spOworfQorCitzdGF0aWMgdm9pZCByd2xvY2tfYnVnKHJ3bG9ja190ICpsb2NrLCBjb25zdCBjaGFyICptc2cpCit7CisJc3RhdGljIGxvbmcgcHJpbnRfb25jZSA9IDE7CisKKwlpZiAoeGNoZygmcHJpbnRfb25jZSwgMCkpIHsKKwkJcHJpbnRrKCJCVUc6IHJ3bG9jayAlcyBvbiBDUFUjJWQsICVzLyVkLCAlcFxuIiwgbXNnLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGxvY2spOworCQlkdW1wX3N0YWNrKCk7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKgorCQkgKiBXZSBjYW5ub3QgY29udGludWUgb24gU01QOgorCQkgKi8KKwkJcGFuaWMoImJhZCBsb2NraW5nIik7CisjZW5kaWYKKwl9Cit9CisKKyNkZWZpbmUgUldMT0NLX0JVR19PTihjb25kLCBsb2NrLCBtc2cpIGlmICh1bmxpa2VseShjb25kKSkgcndsb2NrX2J1Zyhsb2NrLCBtc2cpCisKK3N0YXRpYyB2b2lkIF9fcmVhZF9sb2NrX2RlYnVnKHJ3bG9ja190ICpsb2NrKQoreworCWludCBwcmludF9vbmNlID0gMTsKKwl1NjQgaTsKKworCWZvciAoOzspIHsKKwkJZm9yIChpID0gMDsgaSA8IGxvb3BzX3Blcl9qaWZmeSAqIEhaOyBpKyspIHsKKwkJCWNwdV9yZWxheCgpOworCQkJaWYgKF9fcmF3X3JlYWRfdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spKQorCQkJCXJldHVybjsKKwkJfQorCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLworCQlpZiAocHJpbnRfb25jZSkgeworCQkJcHJpbnRfb25jZSA9IDA7CisJCQlwcmludGsoIkJVRzogcmVhZC1sb2NrIGxvY2t1cCBvbiBDUFUjJWQsICVzLyVkLCAlcFxuIiwKKwkJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkJbG9jayk7CisJCQlkdW1wX3N0YWNrKCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgX3Jhd19yZWFkX2xvY2socndsb2NrX3QgKmxvY2spCit7CisJUldMT0NLX0JVR19PTihsb2NrLT5tYWdpYyAhPSBSV0xPQ0tfTUFHSUMsIGxvY2ssICJiYWQgbWFnaWMiKTsKKwlpZiAodW5saWtlbHkoIV9fcmF3X3JlYWRfdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spKSkKKwkJX19yZWFkX2xvY2tfZGVidWcobG9jayk7Cit9CisKK2ludCBfcmF3X3JlYWRfdHJ5bG9jayhyd2xvY2tfdCAqbG9jaykKK3sKKwlpbnQgcmV0ID0gX19yYXdfcmVhZF90cnlsb2NrKCZsb2NrLT5yYXdfbG9jayk7CisKKyNpZm5kZWYgQ09ORklHX1NNUAorCS8qCisJICogTXVzdCBub3QgaGFwcGVuIG9uIFVQOgorCSAqLworCVJXTE9DS19CVUdfT04oIXJldCwgbG9jaywgInRyeWxvY2sgZmFpbHVyZSBvbiBVUCIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfcmF3X3JlYWRfdW5sb2NrKHJ3bG9ja190ICpsb2NrKQoreworCVJXTE9DS19CVUdfT04obG9jay0+bWFnaWMgIT0gUldMT0NLX01BR0lDLCBsb2NrLCAiYmFkIG1hZ2ljIik7CisJX19yYXdfcmVhZF91bmxvY2soJmxvY2stPnJhd19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3dyaXRlX2xvY2tfYmVmb3JlKHJ3bG9ja190ICpsb2NrKQoreworCVJXTE9DS19CVUdfT04obG9jay0+bWFnaWMgIT0gUldMT0NLX01BR0lDLCBsb2NrLCAiYmFkIG1hZ2ljIik7CisJUldMT0NLX0JVR19PTihsb2NrLT5vd25lciA9PSBjdXJyZW50LCBsb2NrLCAicmVjdXJzaW9uIik7CisJUldMT0NLX0JVR19PTihsb2NrLT5vd25lcl9jcHUgPT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQkJCQlsb2NrLCAiY3B1IHJlY3Vyc2lvbiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfd3JpdGVfbG9ja19hZnRlcihyd2xvY2tfdCAqbG9jaykKK3sKKwlsb2NrLT5vd25lcl9jcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWxvY2stPm93bmVyID0gY3VycmVudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3dyaXRlX3VubG9jayhyd2xvY2tfdCAqbG9jaykKK3sKKwlSV0xPQ0tfQlVHX09OKGxvY2stPm1hZ2ljICE9IFJXTE9DS19NQUdJQywgbG9jaywgImJhZCBtYWdpYyIpOworCVJXTE9DS19CVUdfT04obG9jay0+b3duZXIgIT0gY3VycmVudCwgbG9jaywgIndyb25nIG93bmVyIik7CisJUldMT0NLX0JVR19PTihsb2NrLT5vd25lcl9jcHUgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQkJCQlsb2NrLCAid3JvbmcgQ1BVIik7CisJbG9jay0+b3duZXIgPSBTUElOTE9DS19PV05FUl9JTklUOworCWxvY2stPm93bmVyX2NwdSA9IC0xOworfQorCitzdGF0aWMgdm9pZCBfX3dyaXRlX2xvY2tfZGVidWcocndsb2NrX3QgKmxvY2spCit7CisJaW50IHByaW50X29uY2UgPSAxOworCXU2NCBpOworCisJZm9yICg7OykgeworCQlmb3IgKGkgPSAwOyBpIDwgbG9vcHNfcGVyX2ppZmZ5ICogSFo7IGkrKykgeworCQkJY3B1X3JlbGF4KCk7CisJCQlpZiAoX19yYXdfd3JpdGVfdHJ5bG9jaygmbG9jay0+cmF3X2xvY2spKQorCQkJCXJldHVybjsKKwkJfQorCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLworCQlpZiAocHJpbnRfb25jZSkgeworCQkJcHJpbnRfb25jZSA9IDA7CisJCQlwcmludGsoIkJVRzogd3JpdGUtbG9jayBsb2NrdXAgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsCisJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkJCWxvY2spOworCQkJZHVtcF9zdGFjaygpOworCQl9CisJfQorfQorCit2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqbG9jaykKK3sKKwlkZWJ1Z193cml0ZV9sb2NrX2JlZm9yZShsb2NrKTsKKwlpZiAodW5saWtlbHkoIV9fcmF3X3dyaXRlX3RyeWxvY2soJmxvY2stPnJhd19sb2NrKSkpCisJCV9fd3JpdGVfbG9ja19kZWJ1Zyhsb2NrKTsKKwlkZWJ1Z193cml0ZV9sb2NrX2FmdGVyKGxvY2spOworfQorCitpbnQgX3Jhd193cml0ZV90cnlsb2NrKHJ3bG9ja190ICpsb2NrKQoreworCWludCByZXQgPSBfX3Jhd193cml0ZV90cnlsb2NrKCZsb2NrLT5yYXdfbG9jayk7CisKKwlpZiAocmV0KQorCQlkZWJ1Z193cml0ZV9sb2NrX2FmdGVyKGxvY2spOworI2lmbmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBNdXN0IG5vdCBoYXBwZW4gb24gVVA6CisJICovCisJUldMT0NLX0JVR19PTighcmV0LCBsb2NrLCAidHJ5bG9jayBmYWlsdXJlIG9uIFVQIik7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpsb2NrKQoreworCWRlYnVnX3dyaXRlX3VubG9jayhsb2NrKTsKKwlfX3Jhd193cml0ZV91bmxvY2soJmxvY2stPnJhd19sb2NrKTsKK30KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA4ODYxMTkyLi5iNTM0NjU3IDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0zNyw2ICszNywxMCBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tYW4uaD4KIAorc3RhdGljIHNzaXplX3QKK2dlbmVyaWNfZmlsZV9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCWxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2Vncyk7CisKIC8qCiAgKiBTaGFyZWQgbWFwcGluZ3MgaW1wbGVtZW50ZWQgMzAuMTEuMTk5NC4gSXQncyBub3QgZnVsbHkgd29ya2luZyB5ZXQsCiAgKiB0aG91Z2guCkBAIC0zMDEsOCArMzA1LDkgQEAKICAqIGFzIGl0IGZvcmNlcyBPX1NZTkMgd3JpdGVycyB0byBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHNhbWUgZmlsZQogICogdG8gYmUgc2VyaWFsaXNlZCByaWdodCB1bnRpbCBpbyBjb21wbGV0aW9uLgogICovCi1pbnQgc3luY19wYWdlX3JhbmdlX25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCWxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgc3luY19wYWdlX3JhbmdlX25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCiB7CiAJcGdvZmZfdCBzdGFydCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXBnb2ZmX3QgZW5kID0gKHBvcyArIGNvdW50IC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKQEAgLTMxNyw3ICszMjIsNiBAQAogCQlyZXQgPSB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHN5bmNfcGFnZV9yYW5nZV9ub2xvY2spOwogCiAvKioKICAqIGZpbGVtYXBfZmRhdGF3YWl0IC0gd2FsayB0aGUgbGlzdCBvZiB1bmRlci13cml0ZWJhY2sgcGFnZXMgb2YgdGhlIGdpdmVuCkBAIC0yMDA4LDcgKzIwMTIsNyBAQAogfQogRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfYnVmZmVyZWRfd3JpdGUpOwogCi1zc2l6ZV90CitzdGF0aWMgc3NpemVfdAogX19nZW5lcmljX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90ICpwcG9zKQogewpAQCAtMjEwOCw3ICsyMTEyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zc2l6ZV90CitzdGF0aWMgc3NpemVfdAogX19nZW5lcmljX2ZpbGVfd3JpdGVfbm9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTIyMjksNyArMjIzMyw3IEBACiAgKiBDYWxsZWQgdW5kZXIgaV9zZW0gZm9yIHdyaXRlcyB0byBTX0lTUkVHIGZpbGVzLiAgIFJldHVybnMgLUVJTyBpZiBzb21ldGhpbmcKICAqIHdlbnQgd3JvbmcgZHVyaW5nIHBhZ2VjYWNoZSBzaG9vdGRvd24uCiAgKi8KLXNzaXplX3QKK3N0YXRpYyBzc2l6ZV90CiBnZW5lcmljX2ZpbGVfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCiB7CkBAIC0yMjY0LDQgKzIyNjgsMyBAQAogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZ2VuZXJpY19maWxlX2RpcmVjdF9JTyk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDc4OGE2MjguLmFlODE2MWYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0yMjI1LDcgKzIyMjUsNyBAQAogI2lmICFkZWZpbmVkKF9fSEFWRV9BUkNIX0dBVEVfQVJFQSkKIAogI2lmIGRlZmluZWQoQVRfU1lTSU5GT19FSERSKQotc3RydWN0IHZtX2FyZWFfc3RydWN0IGdhdGVfdm1hOworc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCBnYXRlX3ZtYTsKIAogc3RhdGljIGludCBfX2luaXQgZ2F0ZV92bWFfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCAxMzQ5MmQ2Li5hZmEwNmUxIDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtODgsNyArODgsNyBAQAogICAgcG9saWNpZWQuICovCiBzdGF0aWMgaW50IHBvbGljeV96b25lOwogCi1zdGF0aWMgc3RydWN0IG1lbXBvbGljeSBkZWZhdWx0X3BvbGljeSA9IHsKK3N0cnVjdCBtZW1wb2xpY3kgZGVmYXVsdF9wb2xpY3kgPSB7CiAJLnJlZmNudCA9IEFUT01JQ19JTklUKDEpLCAvKiBuZXZlciBmcmVlIGl0ICovCiAJLnBvbGljeSA9IE1QT0xfREVGQVVMVCwKIH07CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggNDA0MzE5NC4uMTIzMzRhZSAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtNjEsNyArNjEsNyBAQAogCiBpbnQgc3lzY3RsX292ZXJjb21taXRfbWVtb3J5ID0gT1ZFUkNPTU1JVF9HVUVTUzsgIC8qIGhldXJpc3RpYyBvdmVyY29tbWl0ICovCiBpbnQgc3lzY3RsX292ZXJjb21taXRfcmF0aW8gPSA1MDsJLyogZGVmYXVsdCBpcyA1MCUgKi8KLWludCBzeXNjdGxfbWF4X21hcF9jb3VudCA9IERFRkFVTFRfTUFYX01BUF9DT1VOVDsKK2ludCBzeXNjdGxfbWF4X21hcF9jb3VudCBfX3JlYWRfbW9zdGx5ID0gREVGQVVMVF9NQVhfTUFQX0NPVU5UOwogYXRvbWljX3Qgdm1fY29tbWl0dGVkX3NwYWNlID0gQVRPTUlDX0lOSVQoMCk7CiAKIC8qCkBAIC0yMDMsMTMgKzIwMyw2IEBACiAJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogfQogCi0vKgotICogIHN5c19icmsoKSBmb3IgdGhlIG1vc3QgcGFydCBkb2Vzbid0IG5lZWQgdGhlIGdsb2JhbCBrZXJuZWwKLSAqICBsb2NrLCBleGNlcHQgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyBkb2luZyBzb21ldGhpbmcgbmFzdHkKLSAqICBsaWtlIHRyeWluZyB0byB1bi1icmsgYW4gYXJlYSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbWFwcGVkCi0gKiAgdG8gYSByZWd1bGFyIGZpbGUuICBpbiB0aGlzIGNhc2UsIHRoZSB1bm1hcHBpbmcgd2lsbCBuZWVkCi0gKiAgdG8gaW52b2tlIGZpbGUgc3lzdGVtIHJvdXRpbmVzIHRoYXQgbmVlZCB0aGUgZ2xvYmFsIGxvY2suCi0gKi8KIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzeXNfYnJrKHVuc2lnbmVkIGxvbmcgYnJrKQogewogCXVuc2lnbmVkIGxvbmcgcmxpbSwgcmV0dmFsOwpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggMWU1NjA3Ni4uYWMzYmYzMyAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC02LDggKzYsOCBAQAogICoJZm9yIGdvYWRpbmcgbWUgaW50byBjb2RpbmcgdGhpcyBmaWxlLi4uCiAgKgogICogIFRoZSByb3V0aW5lcyBpbiB0aGlzIGZpbGUgYXJlIHVzZWQgdG8ga2lsbCBhIHByb2Nlc3Mgd2hlbgotICogIHdlJ3JlIHNlcmlvdXNseSBvdXQgb2YgbWVtb3J5LiBUaGlzIGdldHMgY2FsbGVkIGZyb20ga3N3YXBkKCkKLSAqICBpbiBsaW51eC9tbS92bXNjYW4uYyB3aGVuIHdlIHJlYWxseSBydW4gb3V0IG9mIG1lbW9yeS4KKyAqICB3ZSdyZSBzZXJpb3VzbHkgb3V0IG9mIG1lbW9yeS4gVGhpcyBnZXRzIGNhbGxlZCBmcm9tIF9fYWxsb2NfcGFnZXMoKQorICogIGluIG1tL3BhZ2VfYWxsb2MuYyB3aGVuIHdlIHJlYWxseSBydW4gb3V0IG9mIG1lbW9yeS4KICAqCiAgKiAgU2luY2Ugd2Ugd29uJ3QgY2FsbCB0aGVzZSByb3V0aW5lcyBvZnRlbiAob24gYSB3ZWxsLWNvbmZpZ3VyZWQKICAqICBtYWNoaW5lKSB0aGlzIGZpbGUgd2lsbCBkb3VibGUgYXMgYSAnY29kaW5nIGd1aWRlJyBhbmQgYSBzaWducG9zdApAQCAtMjAsMTMgKzIwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogCiAvKiAjZGVmaW5lIERFQlVHICovCiAKIC8qKgogICogb29tX2JhZG5lc3MgLSBjYWxjdWxhdGUgYSBudW1lcmljIHZhbHVlIGZvciBob3cgYmFkIHRoaXMgdGFzayBoYXMgYmVlbgogICogQHA6IHRhc2sgc3RydWN0IG9mIHdoaWNoIHRhc2sgd2Ugc2hvdWxkIGNhbGN1bGF0ZQotICogQHA6IGN1cnJlbnQgdXB0aW1lIGluIHNlY29uZHMKKyAqIEB1cHRpbWU6IGN1cnJlbnQgdXB0aW1lIGluIHNlY29uZHMKICAqCiAgKiBUaGUgZm9ybXVsYSB1c2VkIGlzIHJlbGF0aXZlbHkgc2ltcGxlIGFuZCBkb2N1bWVudGVkIGlubGluZSBpbiB0aGUKICAqIGZ1bmN0aW9uLiBUaGUgbWFpbiByYXRpb25hbGUgaXMgdGhhdCB3ZSB3YW50IHRvIHNlbGVjdCBhIGdvb2QgdGFzawpAQCAtNTcsOSArNTgsOSBAQAogCiAJLyoKIAkgKiBQcm9jZXNzZXMgd2hpY2ggZm9yayBhIGxvdCBvZiBjaGlsZCBwcm9jZXNzZXMgYXJlIGxpa2VseQotCSAqIGEgZ29vZCBjaG9pY2UuIFdlIGFkZCB0aGUgdm1zaXplIG9mIHRoZSBjaGlsZHMgaWYgdGhleQorCSAqIGEgZ29vZCBjaG9pY2UuIFdlIGFkZCB0aGUgdm1zaXplIG9mIHRoZSBjaGlsZHJlbiBpZiB0aGV5CiAJICogaGF2ZSBhbiBvd24gbW0uIFRoaXMgcHJldmVudHMgZm9ya2luZyBzZXJ2ZXJzIHRvIGZsb29kIHRoZQotCSAqIG1hY2hpbmUgd2l0aCBhbiBlbmRsZXNzIGFtb3VudCBvZiBjaGlsZHMKKwkgKiBtYWNoaW5lIHdpdGggYW4gZW5kbGVzcyBhbW91bnQgb2YgY2hpbGRyZW4KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoKHRzaywgJnAtPmNoaWxkcmVuKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hsZDsKQEAgLTE0MywyOCArMTQ0LDM2IEBACiAJc3RydWN0IHRpbWVzcGVjIHVwdGltZTsKIAogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOwotCWRvX2VhY2hfdGhyZWFkKGcsIHApCisJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQl1bnNpZ25lZCBsb25nIHBvaW50czsKKwkJaW50IHJlbGVhc2luZzsKKwogCQkvKiBza2lwIHRoZSBpbml0IHRhc2sgd2l0aCBwaWQgPT0gMSAqLwotCQlpZiAocC0+cGlkID4gMSAmJiBwLT5vb21raWxsYWRqICE9IE9PTV9ESVNBQkxFKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHBvaW50czsKKwkJaWYgKHAtPnBpZCA9PSAxKQorCQkJY29udGludWU7CisJCWlmIChwLT5vb21raWxsYWRqID09IE9PTV9ESVNBQkxFKQorCQkJY29udGludWU7CisJCS8qIElmIHAncyBub2RlcyBkb24ndCBvdmVybGFwIG91cnMsIGl0IHdvbid0IGhlbHAgdG8ga2lsbCBwLiAqLworCQlpZiAoIWNwdXNldF9leGNsX25vZGVzX292ZXJsYXAocCkpCisJCQljb250aW51ZTsKIAotCQkJLyoKLQkJCSAqIFRoaXMgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcmVsZWFzaW5nIG1lbW9yeSBzbyB3YWl0IGl0Ci0JCQkgKiB0byBmaW5pc2ggYmVmb3JlIGtpbGxpbmcgc29tZSBvdGhlciB0YXNrIGJ5IG1pc3Rha2UuCi0JCQkgKi8KLQkJCWlmICgodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX01FTURJRSkpIHx8IChwLT5mbGFncyAmIFBGX0VYSVRJTkcpKSAmJgotCQkJICAgICEocC0+ZmxhZ3MgJiBQRl9ERUFEKSkKLQkJCQlyZXR1cm4gRVJSX1BUUigtMVVMKTsKLQkJCWlmIChwLT5mbGFncyAmIFBGX1NXQVBPRkYpCi0JCQkJcmV0dXJuIHA7CisJCS8qCisJCSAqIFRoaXMgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcmVsZWFzaW5nIG1lbW9yeSBzbyBmb3Igd2FpdCBpdAorCQkgKiB0byBmaW5pc2ggYmVmb3JlIGtpbGxpbmcgc29tZSBvdGhlciB0YXNrIGJ5IG1pc3Rha2UuCisJCSAqLworCQlyZWxlYXNpbmcgPSB0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTUVNRElFKSB8fAorCQkJCQkJcC0+ZmxhZ3MgJiBQRl9FWElUSU5HOworCQlpZiAocmVsZWFzaW5nICYmICEocC0+ZmxhZ3MgJiBQRl9ERUFEKSkKKwkJCXJldHVybiBFUlJfUFRSKC0xVUwpOworCQlpZiAocC0+ZmxhZ3MgJiBQRl9TV0FQT0ZGKQorCQkJcmV0dXJuIHA7CiAKLQkJCXBvaW50cyA9IGJhZG5lc3MocCwgdXB0aW1lLnR2X3NlYyk7Ci0JCQlpZiAocG9pbnRzID4gbWF4cG9pbnRzIHx8ICFjaG9zZW4pIHsKLQkJCQljaG9zZW4gPSBwOwotCQkJCW1heHBvaW50cyA9IHBvaW50czsKLQkJCX0KKwkJcG9pbnRzID0gYmFkbmVzcyhwLCB1cHRpbWUudHZfc2VjKTsKKwkJaWYgKHBvaW50cyA+IG1heHBvaW50cyB8fCAhY2hvc2VuKSB7CisJCQljaG9zZW4gPSBwOworCQkJbWF4cG9pbnRzID0gcG9pbnRzOwogCQl9Ci0Jd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CisJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKIAlyZXR1cm4gY2hvc2VuOwogfQogCkBAIC0xODksNyArMTk4LDggQEAKIAkJcmV0dXJuOwogCX0KIAl0YXNrX3VubG9jayhwKTsKLQlwcmludGsoS0VSTl9FUlIgIk91dCBvZiBNZW1vcnk6IEtpbGxlZCBwcm9jZXNzICVkICglcykuXG4iLCBwLT5waWQsIHAtPmNvbW0pOworCXByaW50ayhLRVJOX0VSUiAiT3V0IG9mIE1lbW9yeTogS2lsbGVkIHByb2Nlc3MgJWQgKCVzKS5cbiIsCisJCQkJCQkJcC0+cGlkLCBwLT5jb21tKTsKIAogCS8qCiAJICogV2UgZ2l2ZSBvdXIgc2FjcmlmaWNpYWwgbGFtYiBoaWdoIHByaW9yaXR5IGFuZCBhY2Nlc3MgdG8KQEAgLTI5MCw2ICszMDAsNSBAQAogCSAqIEdpdmUgInAiIGEgZ29vZCBjaGFuY2Ugb2Yga2lsbGluZyBpdHNlbGYgYmVmb3JlIHdlCiAJICogcmV0cnkgdG8gYWxsb2NhdGUgbWVtb3J5LgogCSAqLwotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlzY2hlZHVsZV90aW1lb3V0KDEpOworCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIH0KZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IGE2MzI5ZmEuLjAxNjZlYTE1IDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTM2OCwxMCArMzY4LDggQEAKIHN0YXRpYyB2b2lkIHdiX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgdW51c2VkKTsKIHN0YXRpYyB2b2lkIGxhcHRvcF90aW1lcl9mbih1bnNpZ25lZCBsb25nIHVudXNlZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB3Yl90aW1lciA9Ci0JCQlUSU1FUl9JTklUSUFMSVpFUih3Yl90aW1lcl9mbiwgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbGFwdG9wX21vZGVfd2JfdGltZXIgPQotCQkJVElNRVJfSU5JVElBTElaRVIobGFwdG9wX3RpbWVyX2ZuLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIod2JfdGltZXIsIHdiX3RpbWVyX2ZuLCAwLCAwKTsKK3N0YXRpYyBERUZJTkVfVElNRVIobGFwdG9wX21vZGVfd2JfdGltZXIsIGxhcHRvcF90aW1lcl9mbiwgMCwgMCk7CiAKIC8qCiAgKiBQZXJpb2RpYyB3cml0ZWJhY2sgb2YgIm9sZCIgZGF0YS4KZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBiMDZhOTYzLi5jNTgyM2MzIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC00MiwxMyArNDIsMTMgQEAKICAqIE1DRCAtIEhBQ0s6IEZpbmQgc29tZXdoZXJlIHRvIGluaXRpYWxpemUgdGhpcyBFQVJMWSwgb3IgbWFrZSB0aGlzCiAgKiBpbml0aWFsaXplciBjbGVhbmVyCiAgKi8KLW5vZGVtYXNrX3Qgbm9kZV9vbmxpbmVfbWFwID0geyB7IFswXSA9IDFVTCB9IH07Citub2RlbWFza190IG5vZGVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5ID0geyB7IFswXSA9IDFVTCB9IH07CiBFWFBPUlRfU1lNQk9MKG5vZGVfb25saW5lX21hcCk7Ci1ub2RlbWFza190IG5vZGVfcG9zc2libGVfbWFwID0gTk9ERV9NQVNLX0FMTDsKK25vZGVtYXNrX3Qgbm9kZV9wb3NzaWJsZV9tYXAgX19yZWFkX21vc3RseSA9IE5PREVfTUFTS19BTEw7CiBFWFBPUlRfU1lNQk9MKG5vZGVfcG9zc2libGVfbWFwKTsKLXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXRfbGlzdDsKLXVuc2lnbmVkIGxvbmcgdG90YWxyYW1fcGFnZXM7Ci11bnNpZ25lZCBsb25nIHRvdGFsaGlnaF9wYWdlczsKK3N0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXRfbGlzdCBfX3JlYWRfbW9zdGx5OwordW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlcyBfX3JlYWRfbW9zdGx5OwordW5zaWduZWQgbG9uZyB0b3RhbGhpZ2hfcGFnZXMgX19yZWFkX21vc3RseTsKIGxvbmcgbnJfc3dhcF9wYWdlczsKIAogLyoKQEAgLTY4LDcgKzY4LDcgQEAKICAqIFVzZWQgYnkgcGFnZV96b25lKCkgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3RydWN0IHpvbmUgd2hvc2UKICAqIGlkIGlzIGVuY29kZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgcGFnZS0+ZmxhZ3MKICAqLwotc3RydWN0IHpvbmUgKnpvbmVfdGFibGVbMSA8PCBaT05FVEFCTEVfU0hJRlRdOworc3RydWN0IHpvbmUgKnpvbmVfdGFibGVbMSA8PCBaT05FVEFCTEVfU0hJRlRdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKHpvbmVfdGFibGUpOwogCiBzdGF0aWMgY2hhciAqem9uZV9uYW1lc1tNQVhfTlJfWk9ORVNdID0geyAiRE1BIiwgIk5vcm1hbCIsICJIaWdoTWVtIiB9OwpAQCAtMzM1LDcgKzMzNSw3IEBACiAvKgogICogRnJlZXMgYSBsaXN0IG9mIHBhZ2VzLiAKICAqIEFzc3VtZXMgYWxsIHBhZ2VzIG9uIGxpc3QgYXJlIGluIHNhbWUgem9uZSwgYW5kIG9mIHNhbWUgb3JkZXIuCi0gKiBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGZyZWUsIG9yIDAgZm9yIGFsbCBvbiB0aGUgbGlzdC4KKyAqIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gZnJlZS4KICAqCiAgKiBJZiB0aGUgem9uZSB3YXMgcHJldmlvdXNseSBpbiBhbiAiYWxsIHBhZ2VzIHBpbm5lZCIgc3RhdGUgdGhlbiBsb29rIHRvCiAgKiBzZWUgaWYgdGhpcyBmcmVlaW5nIGNsZWFycyB0aGF0IHN0YXRlLgpAQCAtODA2LDExICs4MDYsMTQgQEAKIAljbGFzc3pvbmVfaWR4ID0gem9uZV9pZHgoem9uZXNbMF0pOwogCiByZXN0YXJ0OgotCS8qIEdvIHRocm91Z2ggdGhlIHpvbmVsaXN0IG9uY2UsIGxvb2tpbmcgZm9yIGEgem9uZSB3aXRoIGVub3VnaCBmcmVlICovCisJLyoKKwkgKiBHbyB0aHJvdWdoIHRoZSB6b25lbGlzdCBvbmNlLCBsb29raW5nIGZvciBhIHpvbmUgd2l0aCBlbm91Z2ggZnJlZS4KKwkgKiBTZWUgYWxzbyBjcHVzZXRfem9uZV9hbGxvd2VkKCkgY29tbWVudCBpbiBrZXJuZWwvY3B1c2V0LmMuCisJICovCiAJZm9yIChpID0gMDsgKHogPSB6b25lc1tpXSkgIT0gTlVMTDsgaSsrKSB7CiAJCWludCBkb19yZWNsYWltID0gc2hvdWxkX3JlY2xhaW1fem9uZSh6LCBnZnBfbWFzayk7CiAKLQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHopKQorCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoeiwgX19HRlBfSEFSRFdBTEwpKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTg0NSw2ICs4NDgsNyBAQAogCSAqCiAJICogVGhpcyBpcyB0aGUgbGFzdCBjaGFuY2UsIGluIGdlbmVyYWwsIGJlZm9yZSB0aGUgZ290byBub3BhZ2UuCiAJICogSWdub3JlIGNwdXNldCBpZiBHRlBfQVRPTUlDICghd2FpdCkgcmF0aGVyIHRoYW4gZmFpbCBhbGxvYy4KKwkgKiBTZWUgYWxzbyBjcHVzZXRfem9uZV9hbGxvd2VkKCkgY29tbWVudCBpbiBrZXJuZWwvY3B1c2V0LmMuCiAJICovCiAJZm9yIChpID0gMDsgKHogPSB6b25lc1tpXSkgIT0gTlVMTDsgaSsrKSB7CiAJCWlmICghem9uZV93YXRlcm1hcmtfb2soeiwgb3JkZXIsIHotPnBhZ2VzX21pbiwKQEAgLTg1Miw3ICs4NTYsNyBAQAogCQkJCSAgICAgICBnZnBfbWFzayAmIF9fR0ZQX0hJR0gpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHdhaXQgJiYgIWNwdXNldF96b25lX2FsbG93ZWQoeikpCisJCWlmICh3YWl0ICYmICFjcHVzZXRfem9uZV9hbGxvd2VkKHosIGdmcF9tYXNrKSkKIAkJCWNvbnRpbnVlOwogCiAJCXBhZ2UgPSBidWZmZXJlZF9ybXF1ZXVlKHosIG9yZGVyLCBnZnBfbWFzayk7CkBAIC04NjcsNyArODcxLDcgQEAKIAkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9OT01FTUFMTE9DKSkgewogCQkJLyogZ28gdGhyb3VnaCB0aGUgem9uZWxpc3QgeWV0IGFnYWluLCBpZ25vcmluZyBtaW5zICovCiAJCQlmb3IgKGkgPSAwOyAoeiA9IHpvbmVzW2ldKSAhPSBOVUxMOyBpKyspIHsKLQkJCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoeikpCisJCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHosIGdmcF9tYXNrKSkKIAkJCQkJY29udGludWU7CiAJCQkJcGFnZSA9IGJ1ZmZlcmVkX3JtcXVldWUoeiwgb3JkZXIsIGdmcF9tYXNrKTsKIAkJCQlpZiAocGFnZSkKQEAgLTkwMyw3ICs5MDcsNyBAQAogCQkJCQkgICAgICAgZ2ZwX21hc2sgJiBfX0dGUF9ISUdIKSkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHopKQorCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHosIGdmcF9tYXNrKSkKIAkJCQljb250aW51ZTsKIAogCQkJcGFnZSA9IGJ1ZmZlcmVkX3JtcXVldWUoeiwgb3JkZXIsIGdmcF9tYXNrKTsKQEAgLTkyMiw3ICs5MjYsNyBAQAogCQkJCQkgICAgICAgY2xhc3N6b25lX2lkeCwgMCwgMCkpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6KSkKKwkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6LCBfX0dGUF9IQVJEV0FMTCkpCiAJCQkJY29udGludWU7CiAKIAkJCXBhZ2UgPSBidWZmZXJlZF9ybXF1ZXVlKHosIG9yZGVyLCBnZnBfbWFzayk7CmRpZmYgLS1naXQgYS9tbS9yZWFkYWhlYWQuYyBiL21tL3JlYWRhaGVhZC5jCmluZGV4IGI4NDBlN2MuLmQwYjUwMDMgMTAwNjQ0Ci0tLSBhL21tL3JlYWRhaGVhZC5jCisrKyBiL21tL3JlYWRhaGVhZC5jCkBAIC01NDAsNiArNTQwLDcgQEAKIHsKIAlyYS0+ZmxhZ3MgfD0gUkFfRkxBR19NSVNTOwogCXJhLT5mbGFncyAmPSB+UkFfRkxBR19JTkNBQ0hFOworCXJhLT5jYWNoZV9oaXQgPSAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggYmRjNGJiYi4uMWY3YWViMiAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0xODAsNyArMTgwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIHN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2htZW1fdm1fb3BzOwogCi1zdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gc2htZW1fYmFja2luZ19kZXZfaW5mbyA9IHsKK3N0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBzaG1lbV9iYWNraW5nX2Rldl9pbmZvICBfX3JlYWRfbW9zdGx5ID0gewogCS5yYV9wYWdlcwk9IDAsCS8qIE5vIHJlYWRhaGVhZCAqLwogCS5jYXBhYmlsaXRpZXMJPSBCRElfQ0FQX05PX0FDQ1RfRElSVFkgfCBCRElfQ0FQX05PX1dSSVRFQkFDSywKIAkudW5wbHVnX2lvX2ZuCT0gZGVmYXVsdF91bnBsdWdfaW9fZm4sCkBAIC02NjYsNiArNjY2LDcgQEAKIAlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOwogCiAJaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZSA9PSBzaG1lbV90cnVuY2F0ZSkgeworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKIAkJc2htZW1fdW5hY2N0X3NpemUoaW5mby0+ZmxhZ3MsIGlub2RlLT5pX3NpemUpOwogCQlpbm9kZS0+aV9zaXplID0gMDsKIAkJc2htZW1fdHJ1bmNhdGUoaW5vZGUpOwpAQCAtMTYwNyw2ICsxNjA4LDE1IEBACiAJaW50IGVycm9yID0gLUVOT1NQQzsKIAogCWlmIChpbm9kZSkgeworCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoaW5vZGUsIGRpciwgTlVMTCwgTlVMTCwKKwkJCQkJCSAgICAgTlVMTCk7CisJCWlmIChlcnJvcikgeworCQkJaWYgKGVycm9yICE9IC1FT1BOT1RTVVBQKSB7CisJCQkJaXB1dChpbm9kZSk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJZXJyb3IgPSAwOworCQl9CiAJCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKIAkJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CiAJCQlpZiAoU19JU0RJUihtb2RlKSkKQEAgLTE2MTYsNyArMTYyNiw2IEBACiAJCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAkJZGdldChkZW50cnkpOyAvKiBFeHRyYSBjb3VudCAtIHBpbiB0aGUgZGVudHJ5IGluIGNvcmUgKi8KLQkJZXJyb3IgPSAwOwogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xNzQ2LDYgKzE3NTUsMTYgQEAKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gLUVOT1NQQzsKIAorCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfaW5pdF9zZWN1cml0eShpbm9kZSwgZGlyLCBOVUxMLCBOVUxMLAorCQkJCQkgICAgIE5VTEwpOworCWlmIChlcnJvcikgeworCQlpZiAoZXJyb3IgIT0gLUVPUE5PVFNVUFApIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWVycm9yID0gMDsKKwl9CisKIAlpbmZvID0gU0hNRU1fSShpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IGxlbi0xOwogCWlmIChsZW4gPD0gKGNoYXIgKilpbm9kZSAtIChjaGFyICopaW5mbykgewpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGE5ZmY0ZjcuLjllODc2ZDYgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTc1LDYgKzc1LDE1IEBACiAgKgogICoJQXQgcHJlc2VudCwgZWFjaCBlbmdpbmUgY2FuIGJlIGdyb3dpbmcgYSBjYWNoZS4gIFRoaXMgc2hvdWxkIGJlIGJsb2NrZWQuCiAgKgorICogMTUgTWFyY2ggMjAwNS4gTlVNQSBzbGFiIGFsbG9jYXRvci4KKyAqCVNoYWkgRnVsdGhlaW0gPHNoYWlAc2NhbGV4ODYub3JnPi4KKyAqCVNob2JoaXQgRGF5YWwgPHNob2JoaXRAY2Fsc29mdGluYy5jb20+CisgKglBbG9rIE4gS2F0YXJpYSA8YWxva2tAY2Fsc29mdGluYy5jb20+CisgKglDaHJpc3RvcGggTGFtZXRlciA8Y2hyaXN0b3BoQGxhbWV0ZXIuY29tPgorICoKKyAqCU1vZGlmaWVkIHRoZSBzbGFiIGFsbG9jYXRvciB0byBiZSBub2RlIGF3YXJlIG9uIE5VTUEgc3lzdGVtcy4KKyAqCUVhY2ggbm9kZSBoYXMgaXRzIG93biBsaXN0IG9mIHBhcnRpYWwsIGZyZWUgYW5kIGZ1bGwgc2xhYnMuCisgKglBbGwgb2JqZWN0IGFsbG9jYXRpb25zIGZvciBhIG5vZGUgb2NjdXIgZnJvbSBub2RlIHNwZWNpZmljIHNsYWIgbGlzdHMuCiAgKi8KIAogI2luY2x1ZGUJPGxpbnV4L2NvbmZpZy5oPgpAQCAtOTMsNiArMTAyLDcgQEAKICNpbmNsdWRlCTxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlCTxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUJPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUJPGxpbnV4L25vZGVtYXNrLmg+CiAKICNpbmNsdWRlCTxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUJPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC0yMTIsNiArMjIyLDcgQEAKIAl2b2lkCQkJKnNfbWVtOwkJLyogaW5jbHVkaW5nIGNvbG91ciBvZmZzZXQgKi8KIAl1bnNpZ25lZCBpbnQJCWludXNlOwkJLyogbnVtIG9mIG9ianMgYWN0aXZlIGluIHNsYWIgKi8KIAlrbWVtX2J1ZmN0bF90CQlmcmVlOworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIG5vZGVpZDsKIH07CiAKIC8qCkBAIC0yMzksNyArMjUwLDYgQEAKIC8qCiAgKiBzdHJ1Y3QgYXJyYXlfY2FjaGUKICAqCi0gKiBQZXIgY3B1IHN0cnVjdHVyZXMKICAqIFB1cnBvc2U6CiAgKiAtIExJRk8gb3JkZXJpbmcsIHRvIGhhbmQgb3V0IGNhY2hlLXdhcm0gb2JqZWN0cyBmcm9tIF9hbGxvYwogICogLSByZWR1Y2UgdGhlIG51bWJlciBvZiBsaW5rZWQgbGlzdCBvcGVyYXRpb25zCkBAIC0yNTQsNiArMjY0LDEzIEBACiAJdW5zaWduZWQgaW50IGxpbWl0OwogCXVuc2lnbmVkIGludCBiYXRjaGNvdW50OwogCXVuc2lnbmVkIGludCB0b3VjaGVkOworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkICplbnRyeVswXTsJCS8qCisJCQkJICogTXVzdCBoYXZlIHRoaXMgZGVmaW5pdGlvbiBpbiBoZXJlIGZvciB0aGUgcHJvcGVyCisJCQkJICogYWxpZ25tZW50IG9mIGFycmF5X2NhY2hlLiBBbHNvIHNpbXBsaWZpZXMgYWNjZXNzaW5nCisJCQkJICogdGhlIGVudHJpZXMuCisJCQkJICogWzBdIGlzIGZvciBnY2MgMi45NS4gSXQgc2hvdWxkIHJlYWxseSBiZSBbXS4KKwkJCQkgKi8KIH07CiAKIC8qIGJvb3RzdHJhcDogVGhlIGNhY2hlcyBkbyBub3Qgd29yayB3aXRob3V0IGNwdWFycmF5cyBhbnltb3JlLApAQCAtMjY2LDM0ICsyODMsODMgQEAKIH07CiAKIC8qCi0gKiBUaGUgc2xhYiBsaXN0cyBvZiBhbGwgb2JqZWN0cy4KLSAqIEhvcGVmdWxseSByZWR1Y2UgdGhlIGludGVybmFsIGZyYWdtZW50YXRpb24KLSAqIE5VTUE6IFRoZSBzcGlubG9jayBjb3VsZCBiZSBtb3ZlZCBmcm9tIHRoZSBrbWVtX2NhY2hlX3QKLSAqIGludG8gdGhpcyBzdHJ1Y3R1cmUsIHRvby4gRmlndXJlIG91dCB3aGF0IGNhdXNlcwotICogZmV3ZXIgY3Jvc3Mtbm9kZSBzcGlubG9jayBvcGVyYXRpb25zLgorICogVGhlIHNsYWIgbGlzdHMgZm9yIGFsbCBvYmplY3RzLgogICovCiBzdHJ1Y3Qga21lbV9saXN0MyB7CiAJc3RydWN0IGxpc3RfaGVhZAlzbGFic19wYXJ0aWFsOwkvKiBwYXJ0aWFsIGxpc3QgZmlyc3QsIGJldHRlciBhc20gY29kZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJc2xhYnNfZnVsbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNsYWJzX2ZyZWU7CiAJdW5zaWduZWQgbG9uZwlmcmVlX29iamVjdHM7Ci0JaW50CQlmcmVlX3RvdWNoZWQ7CiAJdW5zaWduZWQgbG9uZwluZXh0X3JlYXA7Ci0Jc3RydWN0IGFycmF5X2NhY2hlCSpzaGFyZWQ7CisJaW50CQlmcmVlX3RvdWNoZWQ7CisJdW5zaWduZWQgaW50IAlmcmVlX2xpbWl0OworCXNwaW5sb2NrX3QgICAgICBsaXN0X2xvY2s7CisJc3RydWN0IGFycmF5X2NhY2hlCSpzaGFyZWQ7CS8qIHNoYXJlZCBwZXIgbm9kZSAqLworCXN0cnVjdCBhcnJheV9jYWNoZQkqKmFsaWVuOwkvKiBvbiBvdGhlciBub2RlcyAqLwogfTsKIAotI2RlZmluZSBMSVNUM19JTklUKHBhcmVudCkgXAotCXsgXAotCQkuc2xhYnNfZnVsbAk9IExJU1RfSEVBRF9JTklUKHBhcmVudC5zbGFic19mdWxsKSwgXAotCQkuc2xhYnNfcGFydGlhbAk9IExJU1RfSEVBRF9JTklUKHBhcmVudC5zbGFic19wYXJ0aWFsKSwgXAotCQkuc2xhYnNfZnJlZQk9IExJU1RfSEVBRF9JTklUKHBhcmVudC5zbGFic19mcmVlKSBcCi0JfQotI2RlZmluZSBsaXN0M19kYXRhKGNhY2hlcCkgXAotCSgmKGNhY2hlcCktPmxpc3RzKQorLyoKKyAqIE5lZWQgdGhpcyBmb3IgYm9vdHN0cmFwcGluZyBhIHBlciBub2RlIGFsbG9jYXRvci4KKyAqLworI2RlZmluZSBOVU1fSU5JVF9MSVNUUyAoMiAqIE1BWF9OVU1OT0RFUyArIDEpCitzdHJ1Y3Qga21lbV9saXN0MyBfX2luaXRkYXRhIGluaXRrbWVtX2xpc3QzW05VTV9JTklUX0xJU1RTXTsKKyNkZWZpbmUJQ0FDSEVfQ0FDSEUgMAorI2RlZmluZQlTSVpFX0FDIDEKKyNkZWZpbmUJU0laRV9MMyAoMSArIE1BWF9OVU1OT0RFUykKIAotLyogTlVNQTogcGVyLW5vZGUgKi8KLSNkZWZpbmUgbGlzdDNfZGF0YV9wdHIoY2FjaGVwLCBwdHIpIFwKLQkJbGlzdDNfZGF0YShjYWNoZXApCisvKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY29tcGxldGVseSBvcHRpbWl6ZWQgYXdheSBpZgorICogYSBjb25zdGFudCBpcyBwYXNzZWQgdG8gaXQuIE1vc3RseSB0aGUgc2FtZSBhcworICogd2hhdCBpcyBpbiBsaW51eC9zbGFiLmggZXhjZXB0IGl0IHJldHVybnMgYW4KKyAqIGluZGV4LgorICovCitzdGF0aWMgaW5saW5lIGludCBpbmRleF9vZihjb25zdCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKKwkJaW50IGkgPSAwOworCisjZGVmaW5lIENBQ0hFKHgpIFwKKwlpZiAoc2l6ZSA8PXgpIFwKKwkJcmV0dXJuIGk7IFwKKwllbHNlIFwKKwkJaSsrOworI2luY2x1ZGUgImxpbnV4L2ttYWxsb2Nfc2l6ZXMuaCIKKyN1bmRlZiBDQUNIRQorCQl7CisJCQlleHRlcm4gdm9pZCBfX2JhZF9zaXplKHZvaWQpOworCQkJX19iYWRfc2l6ZSgpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIElOREVYX0FDIGluZGV4X29mKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSkKKyNkZWZpbmUgSU5ERVhfTDMgaW5kZXhfb2Yoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSkKKworc3RhdGljIGlubGluZSB2b2lkIGttZW1fbGlzdDNfaW5pdChzdHJ1Y3Qga21lbV9saXN0MyAqcGFyZW50KQoreworCUlOSVRfTElTVF9IRUFEKCZwYXJlbnQtPnNsYWJzX2Z1bGwpOworCUlOSVRfTElTVF9IRUFEKCZwYXJlbnQtPnNsYWJzX3BhcnRpYWwpOworCUlOSVRfTElTVF9IRUFEKCZwYXJlbnQtPnNsYWJzX2ZyZWUpOworCXBhcmVudC0+c2hhcmVkID0gTlVMTDsKKwlwYXJlbnQtPmFsaWVuID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmcGFyZW50LT5saXN0X2xvY2spOworCXBhcmVudC0+ZnJlZV9vYmplY3RzID0gMDsKKwlwYXJlbnQtPmZyZWVfdG91Y2hlZCA9IDA7Cit9CisKKyNkZWZpbmUgTUFLRV9MSVNUKGNhY2hlcCwgbGlzdHAsIHNsYWIsIG5vZGVpZCkJXAorCWRvIHsJXAorCQlJTklUX0xJU1RfSEVBRChsaXN0cCk7CQlcCisJCWxpc3Rfc3BsaWNlKCYoY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXS0+c2xhYiksIGxpc3RwKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUJTUFLRV9BTExfTElTVFMoY2FjaGVwLCBwdHIsIG5vZGVpZCkJCQlcCisJZG8gewkJCQkJXAorCU1BS0VfTElTVCgoY2FjaGVwKSwgKCYocHRyKS0+c2xhYnNfZnVsbCksIHNsYWJzX2Z1bGwsIG5vZGVpZCk7CVwKKwlNQUtFX0xJU1QoKGNhY2hlcCksICgmKHB0ciktPnNsYWJzX3BhcnRpYWwpLCBzbGFic19wYXJ0aWFsLCBub2RlaWQpOyBcCisJTUFLRV9MSVNUKChjYWNoZXApLCAoJihwdHIpLT5zbGFic19mcmVlKSwgc2xhYnNfZnJlZSwgbm9kZWlkKTsJXAorCX0gd2hpbGUgKDApCiAKIC8qCiAgKiBrbWVtX2NhY2hlX3QKQEAgLTMwNiwxMyArMzcyLDEyIEBACiAJc3RydWN0IGFycmF5X2NhY2hlCSphcnJheVtOUl9DUFVTXTsKIAl1bnNpZ25lZCBpbnQJCWJhdGNoY291bnQ7CiAJdW5zaWduZWQgaW50CQlsaW1pdDsKLS8qIDIpIHRvdWNoZWQgYnkgZXZlcnkgYWxsb2MgJiBmcmVlIGZyb20gdGhlIGJhY2tlbmQgKi8KLQlzdHJ1Y3Qga21lbV9saXN0MwlsaXN0czsKLQkvKiBOVU1BOiBrbWVtXzNsaXN0X3QJKm5vZGVsaXN0c1tNQVhfTlVNTk9ERVNdICovCisJdW5zaWduZWQgaW50IAkJc2hhcmVkOwogCXVuc2lnbmVkIGludAkJb2Jqc2l6ZTsKKy8qIDIpIHRvdWNoZWQgYnkgZXZlcnkgYWxsb2MgJiBmcmVlIGZyb20gdGhlIGJhY2tlbmQgKi8KKwlzdHJ1Y3Qga21lbV9saXN0Mwkqbm9kZWxpc3RzW01BWF9OVU1OT0RFU107CiAJdW5zaWduZWQgaW50CSAJZmxhZ3M7CS8qIGNvbnN0YW50IGZsYWdzICovCiAJdW5zaWduZWQgaW50CQludW07CS8qICMgb2Ygb2JqcyBwZXIgc2xhYiAqLwotCXVuc2lnbmVkIGludAkJZnJlZV9saW1pdDsgLyogdXBwZXIgbGltaXQgb2Ygb2JqZWN0cyBpbiB0aGUgbGlzdHMgKi8KIAlzcGlubG9ja190CQlzcGlubG9jazsKIAogLyogMykgY2FjaGVfZ3Jvdy9zaHJpbmsgKi8KQEAgLTM0OSw2ICs0MTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgCQllcnJvcnM7CiAJdW5zaWduZWQgbG9uZwkJbWF4X2ZyZWVhYmxlOwogCXVuc2lnbmVkIGxvbmcJCW5vZGVfYWxsb2NzOworCXVuc2lnbmVkIGxvbmcJCW5vZGVfZnJlZXM7CiAJYXRvbWljX3QJCWFsbG9jaGl0OwogCWF0b21pY190CQlhbGxvY21pc3M7CiAJYXRvbWljX3QJCWZyZWVoaXQ7CkBAIC0zODQsNiArNDUwLDcgQEAKIAkJCQl9IHdoaWxlICgwKQogI2RlZmluZQlTVEFUU19JTkNfRVJSKHgpCSgoeCktPmVycm9ycysrKQogI2RlZmluZQlTVEFUU19JTkNfTk9ERUFMTE9DUyh4KQkoKHgpLT5ub2RlX2FsbG9jcysrKQorI2RlZmluZQlTVEFUU19JTkNfTk9ERUZSRUVTKHgpCSgoeCktPm5vZGVfZnJlZXMrKykKICNkZWZpbmUJU1RBVFNfU0VUX0ZSRUVBQkxFKHgsIGkpIFwKIAkJCQlkbyB7IGlmICgoeCktPm1heF9mcmVlYWJsZSA8IGkpIFwKIAkJCQkJKHgpLT5tYXhfZnJlZWFibGUgPSBpOyBcCkBAIC00MDIsNiArNDY5LDcgQEAKICNkZWZpbmUJU1RBVFNfU0VUX0hJR0goeCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZQlTVEFUU19JTkNfRVJSKHgpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUJU1RBVFNfSU5DX05PREVBTExPQ1MoeCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZQlTVEFUU19JTkNfTk9ERUZSRUVTKHgpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUJU1RBVFNfU0VUX0ZSRUVBQkxFKHgsIGkpIFwKIAkJCQlkbyB7IH0gd2hpbGUgKDApCiAKQEAgLTUzNCw5ICs2MDIsOSBAQAogCiAvKiBpbnRlcm5hbCBjYWNoZSBvZiBjYWNoZSBkZXNjcmlwdGlvbiBvYmpzICovCiBzdGF0aWMga21lbV9jYWNoZV90IGNhY2hlX2NhY2hlID0gewotCS5saXN0cwkJPSBMSVNUM19JTklUKGNhY2hlX2NhY2hlLmxpc3RzKSwKIAkuYmF0Y2hjb3VudAk9IDEsCiAJLmxpbWl0CQk9IEJPT1RfQ1BVQ0FDSEVfRU5UUklFUywKKwkuc2hhcmVkCQk9IDEsCiAJLm9ianNpemUJPSBzaXplb2Yoa21lbV9jYWNoZV90KSwKIAkuZmxhZ3MJCT0gU0xBQl9OT19SRUFQLAogCS5zcGlubG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKQEAgLTU1Nyw3ICs2MjUsNiBAQAogICogU0xBQl9SRUNMQUlNX0FDQ09VTlQgdHVybnMgdGhpcyBvbiBwZXItc2xhYgogICovCiBhdG9taWNfdCBzbGFiX3JlY2xhaW1fcGFnZXM7Ci1FWFBPUlRfU1lNQk9MKHNsYWJfcmVjbGFpbV9wYWdlcyk7CiAKIC8qCiAgKiBjaGlja2VuIGFuZCBlZ2cgcHJvYmxlbTogZGVsYXkgdGhlIHBlci1jcHUgYXJyYXkgYWxsb2NhdGlvbgpAQCAtNTY1LDcgKzYzMiw4IEBACiAgKi8KIHN0YXRpYyBlbnVtIHsKIAlOT05FLAotCVBBUlRJQUwsCisJUEFSVElBTF9BQywKKwlQQVJUSUFMX0wzLAogCUZVTEwKIH0gZ19jcHVjYWNoZV91cDsKIApAQCAtNTc0LDExICs2NDIsNyBAQAogc3RhdGljIHZvaWQgZnJlZV9ibG9jayhrbWVtX2NhY2hlX3QqIGNhY2hlcCwgdm9pZCoqIG9ianBwLCBpbnQgbGVuKTsKIHN0YXRpYyB2b2lkIGVuYWJsZV9jcHVjYWNoZSAoa21lbV9jYWNoZV90ICpjYWNoZXApOwogc3RhdGljIHZvaWQgY2FjaGVfcmVhcCAodm9pZCAqdW51c2VkKTsKLQotc3RhdGljIGlubGluZSB2b2lkICoqYWNfZW50cnkoc3RydWN0IGFycmF5X2NhY2hlICphYykKLXsKLQlyZXR1cm4gKHZvaWQqKikoYWMrMSk7Ci19CitzdGF0aWMgaW50IF9fbm9kZV9zaHJpbmsoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBub2RlKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjX2RhdGEoa21lbV9jYWNoZV90ICpjYWNoZXApCiB7CkBAIC02NzYsNDggKzc0MCwxNjAgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFsbG9jX2FycmF5Y2FjaGUoaW50IGNwdSwgaW50IGVudHJpZXMsCitzdGF0aWMgc3RydWN0IGFycmF5X2NhY2hlICphbGxvY19hcnJheWNhY2hlKGludCBub2RlLCBpbnQgZW50cmllcywKIAkJCQkJCWludCBiYXRjaGNvdW50KQogewogCWludCBtZW1zaXplID0gc2l6ZW9mKHZvaWQqKSplbnRyaWVzK3NpemVvZihzdHJ1Y3QgYXJyYXlfY2FjaGUpOwogCXN0cnVjdCBhcnJheV9jYWNoZSAqbmMgPSBOVUxMOwogCi0JaWYgKGNwdSA9PSAtMSkKLQkJbmMgPSBrbWFsbG9jKG1lbXNpemUsIEdGUF9LRVJORUwpOwotCWVsc2UKLQkJbmMgPSBrbWFsbG9jX25vZGUobWVtc2l6ZSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7Ci0KKwluYyA9IGttYWxsb2Nfbm9kZShtZW1zaXplLCBHRlBfS0VSTkVMLCBub2RlKTsKIAlpZiAobmMpIHsKIAkJbmMtPmF2YWlsID0gMDsKIAkJbmMtPmxpbWl0ID0gZW50cmllczsKIAkJbmMtPmJhdGNoY291bnQgPSBiYXRjaGNvdW50OwogCQluYy0+dG91Y2hlZCA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZuYy0+bG9jayk7CiAJfQogCXJldHVybiBuYzsKIH0KIAorI2lmZGVmIENPTkZJR19OVU1BCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnJheV9jYWNoZSAqKmFsbG9jX2FsaWVuX2NhY2hlKGludCBub2RlLCBpbnQgbGltaXQpCit7CisJc3RydWN0IGFycmF5X2NhY2hlICoqYWNfcHRyOworCWludCBtZW1zaXplID0gc2l6ZW9mKHZvaWQqKSpNQVhfTlVNTk9ERVM7CisJaW50IGk7CisKKwlpZiAobGltaXQgPiAxKQorCQlsaW1pdCA9IDEyOworCWFjX3B0ciA9IGttYWxsb2Nfbm9kZShtZW1zaXplLCBHRlBfS0VSTkVMLCBub2RlKTsKKwlpZiAoYWNfcHRyKSB7CisJCWZvcl9lYWNoX25vZGUoaSkgeworCQkJaWYgKGkgPT0gbm9kZSB8fCAhbm9kZV9vbmxpbmUoaSkpIHsKKwkJCQlhY19wdHJbaV0gPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYWNfcHRyW2ldID0gYWxsb2NfYXJyYXljYWNoZShub2RlLCBsaW1pdCwgMHhiYWFkZjAwZCk7CisJCQlpZiAoIWFjX3B0cltpXSkgeworCQkJCWZvciAoaS0tOyBpIDw9MDsgaS0tKQorCQkJCQlrZnJlZShhY19wdHJbaV0pOworCQkJCWtmcmVlKGFjX3B0cik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGFjX3B0cjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYWxpZW5fY2FjaGUoc3RydWN0IGFycmF5X2NhY2hlICoqYWNfcHRyKQoreworCWludCBpOworCisJaWYgKCFhY19wdHIpCisJCXJldHVybjsKKworCWZvcl9lYWNoX25vZGUoaSkKKwkJa2ZyZWUoYWNfcHRyW2ldKTsKKworCWtmcmVlKGFjX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RyYWluX2FsaWVuX2NhY2hlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjLCBpbnQgbm9kZSkKK3sKKwlzdHJ1Y3Qga21lbV9saXN0MyAqcmwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV07CisKKwlpZiAoYWMtPmF2YWlsKSB7CisJCXNwaW5fbG9jaygmcmwzLT5saXN0X2xvY2spOworCQlmcmVlX2Jsb2NrKGNhY2hlcCwgYWMtPmVudHJ5LCBhYy0+YXZhaWwpOworCQlhYy0+YXZhaWwgPSAwOworCQlzcGluX3VubG9jaygmcmwzLT5saXN0X2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgZHJhaW5fYWxpZW5fY2FjaGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBrbWVtX2xpc3QzICpsMykKK3sKKwlpbnQgaT0wOworCXN0cnVjdCBhcnJheV9jYWNoZSAqYWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKKwkJYWMgPSBsMy0+YWxpZW5baV07CisJCWlmIChhYykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFjLT5sb2NrLCBmbGFncyk7CisJCQlfX2RyYWluX2FsaWVuX2NhY2hlKGNhY2hlcCwgYWMsIGkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKyNlbHNlCisjZGVmaW5lIGFsbG9jX2FsaWVuX2NhY2hlKG5vZGUsIGxpbWl0KSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZyZWVfYWxpZW5fY2FjaGUoYWNfcHRyKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRyYWluX2FsaWVuX2NhY2hlKGNhY2hlcCwgbDMpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjcHV1cF9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewogCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKIAlrbWVtX2NhY2hlX3QqIGNhY2hlcDsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDMgPSBOVUxMOworCWludCBub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKwlpbnQgbWVtc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga21lbV9saXN0Myk7CisJc3RydWN0IGFycmF5X2NhY2hlICpuYyA9IE5VTEw7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CiAJCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKLQkJCXN0cnVjdCBhcnJheV9jYWNoZSAqbmM7CisJCS8qIHdlIG5lZWQgdG8gZG8gdGhpcyByaWdodCBpbiB0aGUgYmVnaW5uaW5nIHNpbmNlCisJCSAqIGFsbG9jX2FycmF5Y2FjaGUncyBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgbGlzdC4KKwkJICoga21hbGxvY19ub2RlIGFsbG93cyB1cyB0byBhZGQgdGhlIHNsYWIgdG8gdGhlIHJpZ2h0CisJCSAqIGttZW1fbGlzdDMgYW5kIG5vdCB0aGlzIGNwdSdzIGttZW1fbGlzdDMKKwkJICovCiAKLQkJCW5jID0gYWxsb2NfYXJyYXljYWNoZShjcHUsIGNhY2hlcC0+bGltaXQsIGNhY2hlcC0+YmF0Y2hjb3VudCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKKwkJCS8qIHNldHVwIHRoZSBzaXplNjQga21lbWxpc3QgZm9yIGNwdSBiZWZvcmUgd2UgY2FuCisJCQkgKiBiZWdpbiBhbnl0aGluZy4gTWFrZSBzdXJlIHNvbWUgb3RoZXIgY3B1IG9uIHRoaXMKKwkJCSAqIG5vZGUgaGFzIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCB0aGlzCisJCQkgKi8KKwkJCWlmICghY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0pIHsKKwkJCQlpZiAoIShsMyA9IGttYWxsb2Nfbm9kZShtZW1zaXplLAorCQkJCQkJR0ZQX0tFUk5FTCwgbm9kZSkpKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlrbWVtX2xpc3QzX2luaXQobDMpOworCQkJCWwzLT5uZXh0X3JlYXAgPSBqaWZmaWVzICsgUkVBUFRJTUVPVVRfTElTVDMgKworCQkJCSAgKCh1bnNpZ25lZCBsb25nKWNhY2hlcCklUkVBUFRJTUVPVVRfTElTVDM7CisKKwkJCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9IGwzOworCQkJfQorCisJCQlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPm5vZGVsaXN0c1tub2RlXS0+bGlzdF9sb2NrKTsKKwkJCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5mcmVlX2xpbWl0ID0KKwkJCQkoMSArIG5yX2NwdXNfbm9kZShub2RlKSkgKgorCQkJCWNhY2hlcC0+YmF0Y2hjb3VudCArIGNhY2hlcC0+bnVtOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPm5vZGVsaXN0c1tub2RlXS0+bGlzdF9sb2NrKTsKKwkJfQorCisJCS8qIE5vdyB3ZSBjYW4gZ28gYWhlYWQgd2l0aCBhbGxvY2F0aW5nIHRoZSBzaGFyZWQgYXJyYXkncworCQkgICYgYXJyYXkgY2FjaGUncyAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhY2hlcCwgJmNhY2hlX2NoYWluLCBuZXh0KSB7CisJCQluYyA9IGFsbG9jX2FycmF5Y2FjaGUobm9kZSwgY2FjaGVwLT5saW1pdCwKKwkJCQkJY2FjaGVwLT5iYXRjaGNvdW50KTsKIAkJCWlmICghbmMpCiAJCQkJZ290byBiYWQ7Ci0KLQkJCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCQkJY2FjaGVwLT5hcnJheVtjcHVdID0gbmM7Ci0JCQljYWNoZXAtPmZyZWVfbGltaXQgPSAoMStudW1fb25saW5lX2NwdXMoKSkqY2FjaGVwLT5iYXRjaGNvdW50Ci0JCQkJCQkrIGNhY2hlcC0+bnVtOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAorCQkJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXTsKKwkJCUJVR19PTighbDMpOworCQkJaWYgKCFsMy0+c2hhcmVkKSB7CisJCQkJaWYgKCEobmMgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsCisJCQkJCWNhY2hlcC0+c2hhcmVkKmNhY2hlcC0+YmF0Y2hjb3VudCwKKwkJCQkJMHhiYWFkZjAwZCkpKQorCQkJCQlnb3RvICBiYWQ7CisKKwkJCQkvKiB3ZSBhcmUgc2VyaWFsaXNlZCBmcm9tIENQVV9ERUFEIG9yCisJCQkJICBDUFVfVVBfQ0FOQ0VMTEVEIGJ5IHRoZSBjcHVjb250cm9sIGxvY2sgKi8KKwkJCQlsMy0+c2hhcmVkID0gbmM7CisJCQl9CiAJCX0KIAkJdXAoJmNhY2hlX2NoYWluX3NlbSk7CiAJCWJyZWFrOwpAQCAtNzMyLDEzICs5MDgsNTEgQEAKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhY2hlcCwgJmNhY2hlX2NoYWluLCBuZXh0KSB7CiAJCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5jOworCQkJY3B1bWFza190IG1hc2s7CiAKKwkJCW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobm9kZSk7CiAJCQlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIAkJCS8qIGNwdSBpcyBkZWFkOyBubyBvbmUgY2FuIGFsbG9jIGZyb20gaXQuICovCiAJCQluYyA9IGNhY2hlcC0+YXJyYXlbY3B1XTsKIAkJCWNhY2hlcC0+YXJyYXlbY3B1XSA9IE5VTEw7Ci0JCQljYWNoZXAtPmZyZWVfbGltaXQgLT0gY2FjaGVwLT5iYXRjaGNvdW50OwotCQkJZnJlZV9ibG9jayhjYWNoZXAsIGFjX2VudHJ5KG5jKSwgbmMtPmF2YWlsKTsKKwkJCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV07CisKKwkJCWlmICghbDMpCisJCQkJZ290byB1bmxvY2tfY2FjaGU7CisKKwkJCXNwaW5fbG9jaygmbDMtPmxpc3RfbG9jayk7CisKKwkJCS8qIEZyZWUgbGltaXQgZm9yIHRoaXMga21lbV9saXN0MyAqLworCQkJbDMtPmZyZWVfbGltaXQgLT0gY2FjaGVwLT5iYXRjaGNvdW50OworCQkJaWYgKG5jKQorCQkJCWZyZWVfYmxvY2soY2FjaGVwLCBuYy0+ZW50cnksIG5jLT5hdmFpbCk7CisKKwkJCWlmICghY3B1c19lbXB0eShtYXNrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5sb2NrX2NhY2hlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQlpZiAobDMtPnNoYXJlZCkgeworCQkJCWZyZWVfYmxvY2soY2FjaGVwLCBsMy0+c2hhcmVkLT5lbnRyeSwKKwkJCQkJCWwzLT5zaGFyZWQtPmF2YWlsKTsKKwkJCQlrZnJlZShsMy0+c2hhcmVkKTsKKwkJCQlsMy0+c2hhcmVkID0gTlVMTDsKKwkJCX0KKwkJCWlmIChsMy0+YWxpZW4pIHsKKwkJCQlkcmFpbl9hbGllbl9jYWNoZShjYWNoZXAsIGwzKTsKKwkJCQlmcmVlX2FsaWVuX2NhY2hlKGwzLT5hbGllbik7CisJCQkJbDMtPmFsaWVuID0gTlVMTDsKKwkJCX0KKworCQkJLyogZnJlZSBzbGFicyBiZWxvbmdpbmcgdG8gdGhpcyBub2RlICovCisJCQlpZiAoX19ub2RlX3NocmluayhjYWNoZXAsIG5vZGUpKSB7CisJCQkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0gPSBOVUxMOworCQkJCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKwkJCQlrZnJlZShsMyk7CisJCQl9IGVsc2UgeworCQkJCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKwkJCX0KK3VubG9ja19jYWNoZToKIAkJCXNwaW5fdW5sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7CiAJCQlrZnJlZShuYyk7CiAJCX0KQEAgLTc1NCw2ICs5NjgsMjUgQEAKIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVjYWNoZV9ub3RpZmllciA9IHsgJmNwdXVwX2NhbGxiYWNrLCBOVUxMLCAwIH07CiAKKy8qCisgKiBzd2FwIHRoZSBzdGF0aWMga21lbV9saXN0MyB3aXRoIGttYWxsb2NlZCBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgaW5pdF9saXN0KGttZW1fY2FjaGVfdCAqY2FjaGVwLCBzdHJ1Y3Qga21lbV9saXN0MyAqbGlzdCwKKwkJaW50IG5vZGVpZCkKK3sKKwlzdHJ1Y3Qga21lbV9saXN0MyAqcHRyOworCisJQlVHX09OKGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0gIT0gbGlzdCk7CisJcHRyID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MyksIEdGUF9LRVJORUwsIG5vZGVpZCk7CisJQlVHX09OKCFwdHIpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwltZW1jcHkocHRyLCBsaXN0LCBzaXplb2Yoc3RydWN0IGttZW1fbGlzdDMpKTsKKwlNQUtFX0FMTF9MSVNUUyhjYWNoZXAsIHB0ciwgbm9kZWlkKTsKKwljYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdID0gcHRyOworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKwogLyogSW5pdGlhbGlzYXRpb24uCiAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGdmcCgpIGZ1bmN0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCwgYW5kIGJlZm9yZSBzbXBfaW5pdCgpLgogICovCkBAIC03NjIsNiArOTk1LDEzIEBACiAJc2l6ZV90IGxlZnRfb3ZlcjsKIAlzdHJ1Y3QgY2FjaGVfc2l6ZXMgKnNpemVzOwogCXN0cnVjdCBjYWNoZV9uYW1lcyAqbmFtZXM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0lOSVRfTElTVFM7IGkrKykgeworCQlrbWVtX2xpc3QzX2luaXQoJmluaXRrbWVtX2xpc3QzW2ldKTsKKwkJaWYgKGkgPCBNQVhfTlVNTk9ERVMpCisJCQljYWNoZV9jYWNoZS5ub2RlbGlzdHNbaV0gPSBOVUxMOworCX0KIAogCS8qCiAJICogRnJhZ21lbnRhdGlvbiByZXNpc3RhbmNlIG9uIGxvdyBtZW1vcnkgLSBvbmx5IHVzZSBiaWdnZXIKQEAgLTc3MCwyMSArMTAxMCwyNCBAQAogCWlmIChudW1fcGh5c3BhZ2VzID4gKDMyIDw8IDIwKSA+PiBQQUdFX1NISUZUKQogCQlzbGFiX2JyZWFrX2dmcF9vcmRlciA9IEJSRUFLX0dGUF9PUkRFUl9ISTsKIAotCQogCS8qIEJvb3RzdHJhcCBpcyB0cmlja3ksIGJlY2F1c2Ugc2V2ZXJhbCBvYmplY3RzIGFyZSBhbGxvY2F0ZWQKIAkgKiBmcm9tIGNhY2hlcyB0aGF0IGRvIG5vdCBleGlzdCB5ZXQ6CiAJICogMSkgaW5pdGlhbGl6ZSB0aGUgY2FjaGVfY2FjaGUgY2FjaGU6IGl0IGNvbnRhaW5zIHRoZSBrbWVtX2NhY2hlX3QKIAkgKiAgICBzdHJ1Y3R1cmVzIG9mIGFsbCBjYWNoZXMsIGV4Y2VwdCBjYWNoZV9jYWNoZSBpdHNlbGY6IGNhY2hlX2NhY2hlCiAJICogICAgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCi0JICogICAgSW5pdGlhbGx5IGFuIF9faW5pdCBkYXRhIGFyZWEgaXMgdXNlZCBmb3IgdGhlIGhlYWQgYXJyYXksIGl0J3MKLQkgKiAgICByZXBsYWNlZCB3aXRoIGEga21hbGxvYyBhbGxvY2F0ZWQgYXJyYXkgYXQgdGhlIGVuZCBvZiB0aGUgYm9vdHN0cmFwLgorCSAqICAgIEluaXRpYWxseSBhbiBfX2luaXQgZGF0YSBhcmVhIGlzIHVzZWQgZm9yIHRoZSBoZWFkIGFycmF5IGFuZCB0aGUKKwkgKiAgICBrbWVtX2xpc3QzIHN0cnVjdHVyZXMsIGl0J3MgcmVwbGFjZWQgd2l0aCBhIGttYWxsb2MgYWxsb2NhdGVkCisJICogICAgYXJyYXkgYXQgdGhlIGVuZCBvZiB0aGUgYm9vdHN0cmFwLgogCSAqIDIpIENyZWF0ZSB0aGUgZmlyc3Qga21hbGxvYyBjYWNoZS4KLQkgKiAgICBUaGUga21lbV9jYWNoZV90IGZvciB0aGUgbmV3IGNhY2hlIGlzIGFsbG9jYXRlZCBub3JtYWxseS4gQW4gX19pbml0Ci0JICogICAgZGF0YSBhcmVhIGlzIHVzZWQgZm9yIHRoZSBoZWFkIGFycmF5LgotCSAqIDMpIENyZWF0ZSB0aGUgcmVtYWluaW5nIGttYWxsb2MgY2FjaGVzLCB3aXRoIG1pbmltYWxseSBzaXplZCBoZWFkIGFycmF5cy4KKwkgKiAgICBUaGUga21lbV9jYWNoZV90IGZvciB0aGUgbmV3IGNhY2hlIGlzIGFsbG9jYXRlZCBub3JtYWxseS4KKwkgKiAgICBBbiBfX2luaXQgZGF0YSBhcmVhIGlzIHVzZWQgZm9yIHRoZSBoZWFkIGFycmF5LgorCSAqIDMpIENyZWF0ZSB0aGUgcmVtYWluaW5nIGttYWxsb2MgY2FjaGVzLCB3aXRoIG1pbmltYWxseSBzaXplZAorCSAqICAgIGhlYWQgYXJyYXlzLgogCSAqIDQpIFJlcGxhY2UgdGhlIF9faW5pdCBkYXRhIGhlYWQgYXJyYXlzIGZvciBjYWNoZV9jYWNoZSBhbmQgdGhlIGZpcnN0CiAJICogICAga21hbGxvYyBjYWNoZSB3aXRoIGttYWxsb2MgYWxsb2NhdGVkIGFycmF5cy4KLQkgKiA1KSBSZXNpemUgdGhlIGhlYWQgYXJyYXlzIG9mIHRoZSBrbWFsbG9jIGNhY2hlcyB0byB0aGVpciBmaW5hbCBzaXplcy4KKwkgKiA1KSBSZXBsYWNlIHRoZSBfX2luaXQgZGF0YSBmb3Iga21lbV9saXN0MyBmb3IgY2FjaGVfY2FjaGUgYW5kCisJICogICAgdGhlIG90aGVyIGNhY2hlJ3Mgd2l0aCBrbWFsbG9jIGFsbG9jYXRlZCBtZW1vcnkuCisJICogNikgUmVzaXplIHRoZSBoZWFkIGFycmF5cyBvZiB0aGUga21hbGxvYyBjYWNoZXMgdG8gdGhlaXIgZmluYWwgc2l6ZXMuCiAJICovCiAKIAkvKiAxKSBjcmVhdGUgdGhlIGNhY2hlX2NhY2hlICovCkBAIC03OTMsNiArMTAzNiw3IEBACiAJbGlzdF9hZGQoJmNhY2hlX2NhY2hlLm5leHQsICZjYWNoZV9jaGFpbik7CiAJY2FjaGVfY2FjaGUuY29sb3VyX29mZiA9IGNhY2hlX2xpbmVfc2l6ZSgpOwogCWNhY2hlX2NhY2hlLmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPSAmaW5pdGFycmF5X2NhY2hlLmNhY2hlOworCWNhY2hlX2NhY2hlLm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV0gPSAmaW5pdGttZW1fbGlzdDNbQ0FDSEVfQ0FDSEVdOwogCiAJY2FjaGVfY2FjaGUub2Jqc2l6ZSA9IEFMSUdOKGNhY2hlX2NhY2hlLm9ianNpemUsIGNhY2hlX2xpbmVfc2l6ZSgpKTsKIApAQCAtODEwLDE1ICsxMDU0LDMzIEBACiAJc2l6ZXMgPSBtYWxsb2Nfc2l6ZXM7CiAJbmFtZXMgPSBjYWNoZV9uYW1lczsKIAorCS8qIEluaXRpYWxpemUgdGhlIGNhY2hlcyB0aGF0IHByb3ZpZGUgbWVtb3J5IGZvciB0aGUgYXJyYXkgY2FjaGUKKwkgKiBhbmQgdGhlIGttZW1fbGlzdDMgc3RydWN0dXJlcyBmaXJzdC4KKwkgKiBXaXRob3V0IHRoaXMsIGZ1cnRoZXIgYWxsb2NhdGlvbnMgd2lsbCBidWcKKwkgKi8KKworCXNpemVzW0lOREVYX0FDXS5jc19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lc1tJTkRFWF9BQ10ubmFtZSwKKwkJCQlzaXplc1tJTkRFWF9BQ10uY3Nfc2l6ZSwgQVJDSF9LTUFMTE9DX01JTkFMSUdOLAorCQkJCShBUkNIX0tNQUxMT0NfRkxBR1MgfCBTTEFCX1BBTklDKSwgTlVMTCwgTlVMTCk7CisKKwlpZiAoSU5ERVhfQUMgIT0gSU5ERVhfTDMpCisJCXNpemVzW0lOREVYX0wzXS5jc19jYWNoZXAgPQorCQkJa21lbV9jYWNoZV9jcmVhdGUobmFtZXNbSU5ERVhfTDNdLm5hbWUsCisJCQkJc2l6ZXNbSU5ERVhfTDNdLmNzX3NpemUsIEFSQ0hfS01BTExPQ19NSU5BTElHTiwKKwkJCQkoQVJDSF9LTUFMTE9DX0ZMQUdTIHwgU0xBQl9QQU5JQyksIE5VTEwsIE5VTEwpOworCiAJd2hpbGUgKHNpemVzLT5jc19zaXplICE9IFVMT05HX01BWCkgewotCQkvKiBGb3IgcGVyZm9ybWFuY2UsIGFsbCB0aGUgZ2VuZXJhbCBjYWNoZXMgYXJlIEwxIGFsaWduZWQuCisJCS8qCisJCSAqIEZvciBwZXJmb3JtYW5jZSwgYWxsIHRoZSBnZW5lcmFsIGNhY2hlcyBhcmUgTDEgYWxpZ25lZC4KIAkJICogVGhpcyBzaG91bGQgYmUgcGFydGljdWxhcmx5IGJlbmVmaWNpYWwgb24gU01QIGJveGVzLCBhcyBpdAogCQkgKiBlbGltaW5hdGVzICJmYWxzZSBzaGFyaW5nIi4KIAkJICogTm90ZSBmb3Igc3lzdGVtcyBzaG9ydCBvbiBtZW1vcnkgcmVtb3ZpbmcgdGhlIGFsaWdubWVudCB3aWxsCi0JCSAqIGFsbG93IHRpZ2h0ZXIgcGFja2luZyBvZiB0aGUgc21hbGxlciBjYWNoZXMuICovCi0JCXNpemVzLT5jc19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lcy0+bmFtZSwKLQkJCXNpemVzLT5jc19zaXplLCBBUkNIX0tNQUxMT0NfTUlOQUxJR04sCi0JCQkoQVJDSF9LTUFMTE9DX0ZMQUdTIHwgU0xBQl9QQU5JQyksIE5VTEwsIE5VTEwpOworCQkgKiBhbGxvdyB0aWdodGVyIHBhY2tpbmcgb2YgdGhlIHNtYWxsZXIgY2FjaGVzLgorCQkgKi8KKwkJaWYoIXNpemVzLT5jc19jYWNoZXApCisJCQlzaXplcy0+Y3NfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUobmFtZXMtPm5hbWUsCisJCQkJc2l6ZXMtPmNzX3NpemUsIEFSQ0hfS01BTExPQ19NSU5BTElHTiwKKwkJCQkoQVJDSF9LTUFMTE9DX0ZMQUdTIHwgU0xBQl9QQU5JQyksIE5VTEwsIE5VTEwpOwogCiAJCS8qIEluYyBvZmYtc2xhYiBidWZjdGwgbGltaXQgdW50aWwgdGhlIGNlaWxpbmcgaXMgaGl0LiAqLwogCQlpZiAoIShPRkZfU0xBQihzaXplcy0+Y3NfY2FjaGVwKSkpIHsKQEAgLTgzNywyNCArMTA5OSw0NyBAQAogCS8qIDQpIFJlcGxhY2UgdGhlIGJvb3RzdHJhcCBoZWFkIGFycmF5cyAqLwogCXsKIAkJdm9pZCAqIHB0cjsKLQkJCisKIAkJcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksIEdGUF9LRVJORUwpOworCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCUJVR19PTihhY19kYXRhKCZjYWNoZV9jYWNoZSkgIT0gJmluaXRhcnJheV9jYWNoZS5jYWNoZSk7Ci0JCW1lbWNweShwdHIsIGFjX2RhdGEoJmNhY2hlX2NhY2hlKSwgc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpKTsKKwkJbWVtY3B5KHB0ciwgYWNfZGF0YSgmY2FjaGVfY2FjaGUpLAorCQkJCXNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSk7CiAJCWNhY2hlX2NhY2hlLmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBwdHI7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkKKwogCQlwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSwgR0ZQX0tFUk5FTCk7CisKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJQlVHX09OKGFjX2RhdGEobWFsbG9jX3NpemVzWzBdLmNzX2NhY2hlcCkgIT0gJmluaXRhcnJheV9nZW5lcmljLmNhY2hlKTsKLQkJbWVtY3B5KHB0ciwgYWNfZGF0YShtYWxsb2Nfc2l6ZXNbMF0uY3NfY2FjaGVwKSwKKwkJQlVHX09OKGFjX2RhdGEobWFsbG9jX3NpemVzW0lOREVYX0FDXS5jc19jYWNoZXApCisJCQkJIT0gJmluaXRhcnJheV9nZW5lcmljLmNhY2hlKTsKKwkJbWVtY3B5KHB0ciwgYWNfZGF0YShtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCksCiAJCQkJc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpKTsKLQkJbWFsbG9jX3NpemVzWzBdLmNzX2NhY2hlcC0+YXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IHB0cjsKKwkJbWFsbG9jX3NpemVzW0lOREVYX0FDXS5jc19jYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQorCQkJCQkJcHRyOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfQorCS8qIDUpIFJlcGxhY2UgdGhlIGJvb3RzdHJhcCBrbWVtX2xpc3QzJ3MgKi8KKwl7CisJCWludCBub2RlOworCQkvKiBSZXBsYWNlIHRoZSBzdGF0aWMga21lbV9saXN0MyBzdHJ1Y3R1cmVzIGZvciB0aGUgYm9vdCBjcHUgKi8KKwkJaW5pdF9saXN0KCZjYWNoZV9jYWNoZSwgJmluaXRrbWVtX2xpc3QzW0NBQ0hFX0NBQ0hFXSwKKwkJCQludW1hX25vZGVfaWQoKSk7CiAKLQkvKiA1KSByZXNpemUgdGhlIGhlYWQgYXJyYXlzIHRvIHRoZWlyIGZpbmFsIHNpemVzICovCisJCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJCWluaXRfbGlzdChtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCwKKwkJCQkJJmluaXRrbWVtX2xpc3QzW1NJWkVfQUMrbm9kZV0sIG5vZGUpOworCisJCQlpZiAoSU5ERVhfQUMgIT0gSU5ERVhfTDMpIHsKKwkJCQlpbml0X2xpc3QobWFsbG9jX3NpemVzW0lOREVYX0wzXS5jc19jYWNoZXAsCisJCQkJCQkmaW5pdGttZW1fbGlzdDNbU0laRV9MMytub2RlXSwKKwkJCQkJCW5vZGUpOworCQkJfQorCQl9CisJfQorCisJLyogNikgcmVzaXplIHRoZSBoZWFkIGFycmF5cyB0byB0aGVpciBmaW5hbCBzaXplcyAqLwogCXsKIAkJa21lbV9jYWNoZV90ICpjYWNoZXA7CiAJCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7CkBAIC04NzAsNyArMTE1NSw2IEBACiAJICogdGhhdCBpbml0aWFsaXplcyBhY19kYXRhIGZvciBhbGwgbmV3IGNwdXMKIAkgKi8KIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdWNhY2hlX25vdGlmaWVyKTsKLQkKIAogCS8qIFRoZSByZWFwIHRpbWVycyBhcmUgc3RhcnRlZCBsYXRlciwgd2l0aCBhIG1vZHVsZSBpbml0IGNhbGw6CiAJICogVGhhdCBwYXJ0IG9mIHRoZSBrZXJuZWwgaXMgbm90IHlldCBvcGVyYXRpb25hbC4KQEAgLTg4NSwxMCArMTE2OSw4IEBACiAJICogUmVnaXN0ZXIgdGhlIHRpbWVycyB0aGF0IHJldHVybiB1bm5lZWRlZAogCSAqIHBhZ2VzIHRvIGdmcC4KIAkgKi8KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7Ci0JCWlmIChjcHVfb25saW5lKGNwdSkpCi0JCQlzdGFydF9jcHVfdGltZXIoY3B1KTsKLQl9CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCXN0YXJ0X2NwdV90aW1lcihjcHUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTY3LDYgKzE0NDksMjAgQEAKIAl9CiB9CiAKKy8qIEZvciBzZXR0aW5nIHVwIGFsbCB0aGUga21lbV9saXN0M3MgZm9yIGNhY2hlIHdob3NlIG9ianNpemUgaXMgc2FtZQorICAgYXMgc2l6ZSBvZiBrbWVtX2xpc3QzLiAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF91cF9saXN0M3Moa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBpbmRleCkKK3sKKwlpbnQgbm9kZTsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0gPSAmaW5pdGttZW1fbGlzdDNbaW5kZXgrbm9kZV07CisJCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5uZXh0X3JlYXAgPSBqaWZmaWVzICsKKwkJCVJFQVBUSU1FT1VUX0xJU1QzICsKKwkJCSgodW5zaWduZWQgbG9uZyljYWNoZXApJVJFQVBUSU1FT1VUX0xJU1QzOworCX0KK30KKwogLyoqCiAgKiBrbWVtX2NhY2hlX2NyZWF0ZSAtIENyZWF0ZSBhIGNhY2hlLgogICogQG5hbWU6IEEgc3RyaW5nIHdoaWNoIGlzIHVzZWQgaW4gL3Byb2Mvc2xhYmluZm8gdG8gaWRlbnRpZnkgdGhpcyBjYWNoZS4KQEAgLTEzMjAsNyArMTYxNiw3IEBACiAJCXNpemUgKz0gQllURVNfUEVSX1dPUkQ7CiAJfQogI2lmIEZPUkNFRF9ERUJVRyAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19QQUdFQUxMT0MpCi0JaWYgKHNpemUgPiAxMjggJiYgY2FjaGVwLT5yZWFsbGVuID4gY2FjaGVfbGluZV9zaXplKCkgJiYgc2l6ZSA8IFBBR0VfU0laRSkgeworCWlmIChzaXplID49IG1hbGxvY19zaXplc1tJTkRFWF9MMysxXS5jc19zaXplICYmIGNhY2hlcC0+cmVhbGxlbiA+IGNhY2hlX2xpbmVfc2l6ZSgpICYmIHNpemUgPCBQQUdFX1NJWkUpIHsKIAkJY2FjaGVwLT5kYmdoZWFkICs9IFBBR0VfU0laRSAtIHNpemU7CiAJCXNpemUgPSBQQUdFX1NJWkU7CiAJfQpAQCAtMTQyMiwxMyArMTcxOCw5IEBACiAJCWNhY2hlcC0+Z2ZwZmxhZ3MgfD0gR0ZQX0RNQTsKIAlzcGluX2xvY2tfaW5pdCgmY2FjaGVwLT5zcGlubG9jayk7CiAJY2FjaGVwLT5vYmpzaXplID0gc2l6ZTsKLQkvKiBOVU1BICovCi0JSU5JVF9MSVNUX0hFQUQoJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnVsbCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhY2hlcC0+bGlzdHMuc2xhYnNfcGFydGlhbCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnJlZSk7CiAKIAlpZiAoZmxhZ3MgJiBDRkxHU19PRkZfU0xBQikKLQkJY2FjaGVwLT5zbGFicF9jYWNoZSA9IGttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzbGFiX3NpemUsMCk7CisJCWNhY2hlcC0+c2xhYnBfY2FjaGUgPSBrbWVtX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2xhYl9zaXplLCAwdSk7CiAJY2FjaGVwLT5jdG9yID0gY3RvcjsKIAljYWNoZXAtPmR0b3IgPSBkdG9yOwogCWNhY2hlcC0+bmFtZSA9IG5hbWU7CkBAIC0xNDQ0LDExICsxNzM2LDQzIEBACiAJCQkgKiB0aGUgY2FjaGUgdGhhdCdzIHVzZWQgYnkga21hbGxvYygyNCksIG90aGVyd2lzZQogCQkJICogdGhlIGNyZWF0aW9uIG9mIGZ1cnRoZXIgY2FjaGVzIHdpbGwgQlVHKCkuCiAJCQkgKi8KLQkJCWNhY2hlcC0+YXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9ICZpbml0YXJyYXlfZ2VuZXJpYy5jYWNoZTsKLQkJCWdfY3B1Y2FjaGVfdXAgPSBQQVJUSUFMOworCQkJY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0KKwkJCQkmaW5pdGFycmF5X2dlbmVyaWMuY2FjaGU7CisKKwkJCS8qIElmIHRoZSBjYWNoZSB0aGF0J3MgdXNlZCBieQorCQkJICoga21hbGxvYyhzaXplb2Yoa21lbV9saXN0MykpIGlzIHRoZSBmaXJzdCBjYWNoZSwKKwkJCSAqIHRoZW4gd2UgbmVlZCB0byBzZXQgdXAgYWxsIGl0cyBsaXN0M3MsIG90aGVyd2lzZQorCQkJICogdGhlIGNyZWF0aW9uIG9mIGZ1cnRoZXIgY2FjaGVzIHdpbGwgQlVHKCkuCisJCQkgKi8KKwkJCXNldF91cF9saXN0M3MoY2FjaGVwLCBTSVpFX0FDKTsKKwkJCWlmIChJTkRFWF9BQyA9PSBJTkRFWF9MMykKKwkJCQlnX2NwdWNhY2hlX3VwID0gUEFSVElBTF9MMzsKKwkJCWVsc2UKKwkJCQlnX2NwdWNhY2hlX3VwID0gUEFSVElBTF9BQzsKIAkJfSBlbHNlIHsKLQkJCWNhY2hlcC0+YXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpLEdGUF9LRVJORUwpOworCQkJY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0KKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSwKKwkJCQkJCUdGUF9LRVJORUwpOworCisJCQlpZiAoZ19jcHVjYWNoZV91cCA9PSBQQVJUSUFMX0FDKSB7CisJCQkJc2V0X3VwX2xpc3QzcyhjYWNoZXAsIFNJWkVfTDMpOworCQkJCWdfY3B1Y2FjaGVfdXAgPSBQQVJUSUFMX0wzOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgbm9kZTsKKwkJCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CisKKwkJCQkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0gPQorCQkJCQkJa21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MyksCisJCQkJCQkJCUdGUF9LRVJORUwsIG5vZGUpOworCQkJCQlCVUdfT04oIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdKTsKKwkJCQkJa21lbV9saXN0M19pbml0KGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdKTsKKwkJCQl9CisJCQl9CiAJCX0KKwkJY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldLT5uZXh0X3JlYXAgPQorCQkJamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzICsKKwkJCSgodW5zaWduZWQgbG9uZyljYWNoZXApJVJFQVBUSU1FT1VUX0xJU1QzOworCiAJCUJVR19PTighYWNfZGF0YShjYWNoZXApKTsKIAkJYWNfZGF0YShjYWNoZXApLT5hdmFpbCA9IDA7CiAJCWFjX2RhdGEoY2FjaGVwKS0+bGltaXQgPSBCT09UX0NQVUNBQ0hFX0VOVFJJRVM7CkBAIC0xNDU2LDEzICsxNzgwLDggQEAKIAkJYWNfZGF0YShjYWNoZXApLT50b3VjaGVkID0gMDsKIAkJY2FjaGVwLT5iYXRjaGNvdW50ID0gMTsKIAkJY2FjaGVwLT5saW1pdCA9IEJPT1RfQ1BVQ0FDSEVfRU5UUklFUzsKLQkJY2FjaGVwLT5mcmVlX2xpbWl0ID0gKDErbnVtX29ubGluZV9jcHVzKCkpKmNhY2hlcC0+YmF0Y2hjb3VudAotCQkJCQkrIGNhY2hlcC0+bnVtOwogCX0gCiAKLQljYWNoZXAtPmxpc3RzLm5leHRfcmVhcCA9IGppZmZpZXMgKyBSRUFQVElNRU9VVF9MSVNUMyArCi0JCQkJCSgodW5zaWduZWQgbG9uZyljYWNoZXApJVJFQVBUSU1FT1VUX0xJU1QzOwotCiAJLyogTmVlZCB0aGUgc2VtYXBob3JlIHRvIGFjY2VzcyB0aGUgY2hhaW4uICovCiAJZG93bigmY2FjaGVfY2hhaW5fc2VtKTsKIAl7CkBAIC0xNTE5LDEzICsxODM4LDIzIEBACiB7CiAjaWZkZWYgQ09ORklHX1NNUAogCWNoZWNrX2lycV9vZmYoKTsKLQlCVUdfT04oc3Bpbl90cnlsb2NrKCZjYWNoZXAtPnNwaW5sb2NrKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZjYWNoZXAtPm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV0tPmxpc3RfbG9jayk7CiAjZW5kaWYKIH0KKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkX25vZGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBub2RlKQoreworI2lmZGVmIENPTkZJR19TTVAKKwljaGVja19pcnFfb2ZmKCk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZjYWNoZXAtPm5vZGVsaXN0c1tub2RlXS0+bGlzdF9sb2NrKTsKKyNlbmRpZgorfQorCiAjZWxzZQogI2RlZmluZSBjaGVja19pcnFfb2ZmKCkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIGNoZWNrX2lycV9vbigpCWRvIHsgfSB3aGlsZSgwKQogI2RlZmluZSBjaGVja19zcGlubG9ja19hY3F1aXJlZCh4KSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgY2hlY2tfc3BpbmxvY2tfYWNxdWlyZWRfbm9kZSh4LCB5KSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCiAvKgpAQCAtMTU0Nyw3ICsxODc2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZHJhaW5fYXJyYXlfbG9ja2VkKGttZW1fY2FjaGVfdCogY2FjaGVwLAotCQkJCXN0cnVjdCBhcnJheV9jYWNoZSAqYWMsIGludCBmb3JjZSk7CisJCQkJc3RydWN0IGFycmF5X2NhY2hlICphYywgaW50IGZvcmNlLCBpbnQgbm9kZSk7CiAKIHN0YXRpYyB2b2lkIGRvX2RyYWluKHZvaWQgKmFyZykKIHsKQEAgLTE1NTYsNTkgKzE4ODUsODIgQEAKIAogCWNoZWNrX2lycV9vZmYoKTsKIAlhYyA9IGFjX2RhdGEoY2FjaGVwKTsKLQlzcGluX2xvY2soJmNhY2hlcC0+c3BpbmxvY2spOwotCWZyZWVfYmxvY2soY2FjaGVwLCAmYWNfZW50cnkoYWMpWzBdLCBhYy0+YXZhaWwpOwotCXNwaW5fdW5sb2NrKCZjYWNoZXAtPnNwaW5sb2NrKTsKKwlzcGluX2xvY2soJmNhY2hlcC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXS0+bGlzdF9sb2NrKTsKKwlmcmVlX2Jsb2NrKGNhY2hlcCwgYWMtPmVudHJ5LCBhYy0+YXZhaWwpOworCXNwaW5fdW5sb2NrKCZjYWNoZXAtPm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV0tPmxpc3RfbG9jayk7CiAJYWMtPmF2YWlsID0gMDsKIH0KIAogc3RhdGljIHZvaWQgZHJhaW5fY3B1X2NhY2hlcyhrbWVtX2NhY2hlX3QgKmNhY2hlcCkKIHsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CisJaW50IG5vZGU7CisKIAlzbXBfY2FsbF9mdW5jdGlvbl9hbGxfY3B1cyhkb19kcmFpbiwgY2FjaGVwKTsKIAljaGVja19pcnFfb24oKTsKIAlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQlpZiAoY2FjaGVwLT5saXN0cy5zaGFyZWQpCi0JCWRyYWluX2FycmF5X2xvY2tlZChjYWNoZXAsIGNhY2hlcC0+bGlzdHMuc2hhcmVkLCAxKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSAgeworCQlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdOworCQlpZiAobDMpIHsKKwkJCXNwaW5fbG9jaygmbDMtPmxpc3RfbG9jayk7CisJCQlkcmFpbl9hcnJheV9sb2NrZWQoY2FjaGVwLCBsMy0+c2hhcmVkLCAxLCBub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKwkJCWlmIChsMy0+YWxpZW4pCisJCQkJZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLCBsMyk7CisJCX0KKwl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKIH0KIAotCi0vKiBOVU1BIHNocmluayBhbGwgbGlzdDNzICovCi1zdGF0aWMgaW50IF9fY2FjaGVfc2hyaW5rKGttZW1fY2FjaGVfdCAqY2FjaGVwKQorc3RhdGljIGludCBfX25vZGVfc2hyaW5rKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV07CiAJaW50IHJldDsKIAotCWRyYWluX2NwdV9jYWNoZXMoY2FjaGVwKTsKLQotCWNoZWNrX2lycV9vbigpOwotCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwotCi0JZm9yKDs7KSB7CisJZm9yICg7OykgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0JCXAgPSBjYWNoZXAtPmxpc3RzLnNsYWJzX2ZyZWUucHJldjsKLQkJaWYgKHAgPT0gJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnJlZSkKKwkJcCA9IGwzLT5zbGFic19mcmVlLnByZXY7CisJCWlmIChwID09ICZsMy0+c2xhYnNfZnJlZSkKIAkJCWJyZWFrOwogCi0JCXNsYWJwID0gbGlzdF9lbnRyeShjYWNoZXAtPmxpc3RzLnNsYWJzX2ZyZWUucHJldiwgc3RydWN0IHNsYWIsIGxpc3QpOworCQlzbGFicCA9IGxpc3RfZW50cnkobDMtPnNsYWJzX2ZyZWUucHJldiwgc3RydWN0IHNsYWIsIGxpc3QpOwogI2lmIERFQlVHCiAJCWlmIChzbGFicC0+aW51c2UpCiAJCQlCVUcoKTsKICNlbmRpZgogCQlsaXN0X2RlbCgmc2xhYnAtPmxpc3QpOwogCi0JCWNhY2hlcC0+bGlzdHMuZnJlZV9vYmplY3RzIC09IGNhY2hlcC0+bnVtOwotCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOworCQlsMy0+ZnJlZV9vYmplY3RzIC09IGNhY2hlcC0+bnVtOworCQlzcGluX3VubG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCQlzbGFiX2Rlc3Ryb3koY2FjaGVwLCBzbGFicCk7Ci0JCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOworCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAl9Ci0JcmV0ID0gIWxpc3RfZW1wdHkoJmNhY2hlcC0+bGlzdHMuc2xhYnNfZnVsbCkgfHwKLQkJIWxpc3RfZW1wdHkoJmNhY2hlcC0+bGlzdHMuc2xhYnNfcGFydGlhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKKwlyZXQgPSAhbGlzdF9lbXB0eSgmbDMtPnNsYWJzX2Z1bGwpIHx8CisJCSFsaXN0X2VtcHR5KCZsMy0+c2xhYnNfcGFydGlhbCk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfX2NhY2hlX3NocmluayhrbWVtX2NhY2hlX3QgKmNhY2hlcCkKK3sKKwlpbnQgcmV0ID0gMCwgaSA9IDA7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzOworCisJZHJhaW5fY3B1X2NhY2hlcyhjYWNoZXApOworCisJY2hlY2tfaXJxX29uKCk7CisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgeworCQlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW2ldOworCQlpZiAobDMpIHsKKwkJCXNwaW5fbG9ja19pcnEoJmwzLT5saXN0X2xvY2spOworCQkJcmV0ICs9IF9fbm9kZV9zaHJpbmsoY2FjaGVwLCBpKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CisJCX0KKwl9CisJcmV0dXJuIChyZXQgPyAxIDogMCk7Cit9CisKIC8qKgogICoga21lbV9jYWNoZV9zaHJpbmsgLSBTaHJpbmsgYSBjYWNoZS4KICAqIEBjYWNoZXA6IFRoZSBjYWNoZSB0byBzaHJpbmsuCkBAIC0xNjQ1LDYgKzE5OTcsNyBAQAogaW50IGttZW1fY2FjaGVfZGVzdHJveShrbWVtX2NhY2hlX3QgKiBjYWNoZXApCiB7CiAJaW50IGk7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCiAJaWYgKCFjYWNoZXAgfHwgaW5faW50ZXJydXB0KCkpCiAJCUJVRygpOwpAQCAtMTY3MiwxNSArMjAyNSwxNyBAQAogCWlmICh1bmxpa2VseShjYWNoZXAtPmZsYWdzICYgU0xBQl9ERVNUUk9ZX0JZX1JDVSkpCiAJCXN5bmNocm9uaXplX3JjdSgpOwogCi0JLyogbm8gY3B1X29ubGluZSBjaGVjayByZXF1aXJlZCBoZXJlIHNpbmNlIHdlIGNsZWFyIHRoZSBwZXJjcHUKLQkgKiBhcnJheSBvbiBjcHUgb2ZmbGluZSBhbmQgc2V0IHRoaXMgdG8gTlVMTC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKIAkJa2ZyZWUoY2FjaGVwLT5hcnJheVtpXSk7CiAKIAkvKiBOVU1BOiBmcmVlIHRoZSBsaXN0MyBzdHJ1Y3R1cmVzICovCi0Ja2ZyZWUoY2FjaGVwLT5saXN0cy5zaGFyZWQpOwotCWNhY2hlcC0+bGlzdHMuc2hhcmVkID0gTlVMTDsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSB7CisJCWlmICgobDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tpXSkpIHsKKwkJCWtmcmVlKGwzLT5zaGFyZWQpOworCQkJZnJlZV9hbGllbl9jYWNoZShsMy0+YWxpZW4pOworCQkJa2ZyZWUobDMpOworCQl9CisJfQogCWttZW1fY2FjaGVfZnJlZSgmY2FjaGVfY2FjaGUsIGNhY2hlcCk7CiAKIAl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKQEAgLTE2OTAsOCArMjA0NSw4IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfZGVzdHJveSk7CiAKIC8qIEdldCB0aGUgbWVtb3J5IGZvciBhIHNsYWIgbWFuYWdlbWVudCBvYmouICovCi1zdGF0aWMgc3RydWN0IHNsYWIqIGFsbG9jX3NsYWJtZ210KGttZW1fY2FjaGVfdCAqY2FjaGVwLAotCQkJdm9pZCAqb2JqcCwgaW50IGNvbG91cl9vZmYsIHVuc2lnbmVkIGludCBfX25vY2FzdCBsb2NhbF9mbGFncykKK3N0YXRpYyBzdHJ1Y3Qgc2xhYiogYWxsb2Nfc2xhYm1nbXQoa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKm9ianAsCisJCQlpbnQgY29sb3VyX29mZiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGxvY2FsX2ZsYWdzKQogewogCXN0cnVjdCBzbGFiICpzbGFicDsKIAkKQEAgLTE3MjIsNyArMjA3Nyw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2FjaGVwLT5udW07IGkrKykgewotCQl2b2lkKiBvYmpwID0gc2xhYnAtPnNfbWVtK2NhY2hlcC0+b2Jqc2l6ZSppOworCQl2b2lkICpvYmpwID0gc2xhYnAtPnNfbWVtK2NhY2hlcC0+b2Jqc2l6ZSppOwogI2lmIERFQlVHCiAJCS8qIG5lZWQgdG8gcG9pc29uIHRoZSBvYmpzPyAqLwogCQlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUE9JU09OKQpAQCAtMTc5OSw2ICsyMTU0LDcgQEAKIAlzaXplX3QJCSBvZmZzZXQ7CiAJdW5zaWduZWQgaW50CSBsb2NhbF9mbGFnczsKIAl1bnNpZ25lZCBsb25nCSBjdG9yX2ZsYWdzOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKIAogCS8qIEJlIGxhenkgYW5kIG9ubHkgY2hlY2sgZm9yIHZhbGlkIGZsYWdzIGhlcmUsCiAgCSAqIGtlZXBpbmcgaXQgb3V0IG9mIHRoZSBjcml0aWNhbCBwYXRoIGluIGttZW1fY2FjaGVfYWxsb2MoKS4KQEAgLTE4MzAsNiArMjE4Niw3IEBACiAKIAlzcGluX3VubG9jaygmY2FjaGVwLT5zcGlubG9jayk7CiAKKwljaGVja19pcnFfb2ZmKCk7CiAJaWYgKGxvY2FsX2ZsYWdzICYgX19HRlBfV0FJVCkKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCkBAIC0xODQxLDggKzIxOTgsOSBAQAogCSAqLwogCWttZW1fZmxhZ2NoZWNrKGNhY2hlcCwgZmxhZ3MpOwogCi0KLQkvKiBHZXQgbWVtIGZvciB0aGUgb2Jqcy4gKi8KKwkvKiBHZXQgbWVtIGZvciB0aGUgb2Jqcy4KKwkgKiBBdHRlbXB0IHRvIGFsbG9jYXRlIGEgcGh5c2ljYWwgcGFnZSBmcm9tICdub2RlaWQnLAorCSAqLwogCWlmICghKG9ianAgPSBrbWVtX2dldHBhZ2VzKGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCkpKQogCQlnb3RvIGZhaWxlZDsKIApAQCAtMTg1MCw2ICsyMjA4LDcgQEAKIAlpZiAoIShzbGFicCA9IGFsbG9jX3NsYWJtZ210KGNhY2hlcCwgb2JqcCwgb2Zmc2V0LCBsb2NhbF9mbGFncykpKQogCQlnb3RvIG9wcHMxOwogCisJc2xhYnAtPm5vZGVpZCA9IG5vZGVpZDsKIAlzZXRfc2xhYl9hdHRyKGNhY2hlcCwgc2xhYnAsIG9ianApOwogCiAJY2FjaGVfaW5pdF9vYmpzKGNhY2hlcCwgc2xhYnAsIGN0b3JfZmxhZ3MpOwpAQCAtMTg1NywxMyArMjIxNiwxNCBAQAogCWlmIChsb2NhbF9mbGFncyAmIF9fR0ZQX1dBSVQpCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJY2hlY2tfaXJxX29mZigpOwotCXNwaW5fbG9jaygmY2FjaGVwLT5zcGlubG9jayk7CisJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdOworCXNwaW5fbG9jaygmbDMtPmxpc3RfbG9jayk7CiAKIAkvKiBNYWtlIHNsYWIgYWN0aXZlLiAqLwotCWxpc3RfYWRkX3RhaWwoJnNsYWJwLT5saXN0LCAmKGxpc3QzX2RhdGEoY2FjaGVwKS0+c2xhYnNfZnJlZSkpOworCWxpc3RfYWRkX3RhaWwoJnNsYWJwLT5saXN0LCAmKGwzLT5zbGFic19mcmVlKSk7CiAJU1RBVFNfSU5DX0dST1dOKGNhY2hlcCk7Ci0JbGlzdDNfZGF0YShjYWNoZXApLT5mcmVlX29iamVjdHMgKz0gY2FjaGVwLT5udW07Ci0Jc3Bpbl91bmxvY2soJmNhY2hlcC0+c3BpbmxvY2spOworCWwzLT5mcmVlX29iamVjdHMgKz0gY2FjaGVwLT5udW07CisJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCXJldHVybiAxOwogb3BwczE6CiAJa21lbV9mcmVlcGFnZXMoY2FjaGVwLCBvYmpwKTsKQEAgLTE5NjksNyArMjMyOSw2IEBACiAJa21lbV9idWZjdGxfdCBpOwogCWludCBlbnRyaWVzID0gMDsKIAkKLQljaGVja19zcGlubG9ja19hY3F1aXJlZChjYWNoZXApOwogCS8qIENoZWNrIHNsYWIncyBmcmVlbGlzdCB0byBzZWUgaWYgdGhpcyBvYmogaXMgdGhlcmUuICovCiAJZm9yIChpID0gc2xhYnAtPmZyZWU7IGkgIT0gQlVGQ1RMX0VORDsgaSA9IHNsYWJfYnVmY3RsKHNsYWJwKVtpXSkgewogCQllbnRyaWVzKys7CkBAIC0yMDEyLDEwICsyMzcxLDExIEBACiAJCSAqLwogCQliYXRjaGNvdW50ID0gQkFUQ0hSRUZJTExfTElNSVQ7CiAJfQotCWwzID0gbGlzdDNfZGF0YShjYWNoZXApOworCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldOwogCi0JQlVHX09OKGFjLT5hdmFpbCA+IDApOwotCXNwaW5fbG9jaygmY2FjaGVwLT5zcGlubG9jayk7CisJQlVHX09OKGFjLT5hdmFpbCA+IDAgfHwgIWwzKTsKKwlzcGluX2xvY2soJmwzLT5saXN0X2xvY2spOworCiAJaWYgKGwzLT5zaGFyZWQpIHsKIAkJc3RydWN0IGFycmF5X2NhY2hlICpzaGFyZWRfYXJyYXkgPSBsMy0+c2hhcmVkOwogCQlpZiAoc2hhcmVkX2FycmF5LT5hdmFpbCkgewpAQCAtMjAyMyw4ICsyMzgzLDkgQEAKIAkJCQliYXRjaGNvdW50ID0gc2hhcmVkX2FycmF5LT5hdmFpbDsKIAkJCXNoYXJlZF9hcnJheS0+YXZhaWwgLT0gYmF0Y2hjb3VudDsKIAkJCWFjLT5hdmFpbCA9IGJhdGNoY291bnQ7Ci0JCQltZW1jcHkoYWNfZW50cnkoYWMpLCAmYWNfZW50cnkoc2hhcmVkX2FycmF5KVtzaGFyZWRfYXJyYXktPmF2YWlsXSwKLQkJCQkJc2l6ZW9mKHZvaWQqKSpiYXRjaGNvdW50KTsKKwkJCW1lbWNweShhYy0+ZW50cnksCisJCQkJJihzaGFyZWRfYXJyYXktPmVudHJ5W3NoYXJlZF9hcnJheS0+YXZhaWxdKSwKKwkJCQlzaXplb2Yodm9pZCopKmJhdGNoY291bnQpOwogCQkJc2hhcmVkX2FycmF5LT50b3VjaGVkID0gMTsKIAkJCWdvdG8gYWxsb2NfZG9uZTsKIAkJfQpAQCAtMjA1MSw3ICsyNDEyLDggQEAKIAkJCVNUQVRTX1NFVF9ISUdIKGNhY2hlcCk7CiAKIAkJCS8qIGdldCBvYmogcG9pbnRlciAqLwotCQkJYWNfZW50cnkoYWMpW2FjLT5hdmFpbCsrXSA9IHNsYWJwLT5zX21lbSArIHNsYWJwLT5mcmVlKmNhY2hlcC0+b2Jqc2l6ZTsKKwkJCWFjLT5lbnRyeVthYy0+YXZhaWwrK10gPSBzbGFicC0+c19tZW0gKworCQkJCXNsYWJwLT5mcmVlKmNhY2hlcC0+b2Jqc2l6ZTsKIAogCQkJc2xhYnAtPmludXNlKys7CiAJCQluZXh0ID0gc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXTsKQEAgLTIwNzMsMTIgKzI0MzUsMTIgQEAKIG11c3RfZ3JvdzoKIAlsMy0+ZnJlZV9vYmplY3RzIC09IGFjLT5hdmFpbDsKIGFsbG9jX2RvbmU6Ci0Jc3Bpbl91bmxvY2soJmNhY2hlcC0+c3BpbmxvY2spOworCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKIAogCWlmICh1bmxpa2VseSghYWMtPmF2YWlsKSkgewogCQlpbnQgeDsKLQkJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBmbGFncywgLTEpOwotCQkKKwkJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBmbGFncywgbnVtYV9ub2RlX2lkKCkpOworCiAJCS8vIGNhY2hlX2dyb3cgY2FuIHJlZW5hYmxlIGludGVycnVwdHMsIHRoZW4gYWMgY291bGQgY2hhbmdlLgogCQlhYyA9IGFjX2RhdGEoY2FjaGVwKTsKIAkJaWYgKCF4ICYmIGFjLT5hdmFpbCA9PSAwKQkvLyBubyBvYmplY3RzIGluIHNpZ2h0PyBhYm9ydApAQCAtMjA4OCw3ICsyNDUwLDcgQEAKIAkJCWdvdG8gcmV0cnk7CiAJfQogCWFjLT50b3VjaGVkID0gMTsKLQlyZXR1cm4gYWNfZW50cnkoYWMpWy0tYWMtPmF2YWlsXTsKKwlyZXR1cm4gYWMtPmVudHJ5Wy0tYWMtPmF2YWlsXTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0yMTYwLDcgKzI1MjIsNyBAQAogCWlmIChsaWtlbHkoYWMtPmF2YWlsKSkgewogCQlTVEFUU19JTkNfQUxMT0NISVQoY2FjaGVwKTsKIAkJYWMtPnRvdWNoZWQgPSAxOwotCQlvYmpwID0gYWNfZW50cnkoYWMpWy0tYWMtPmF2YWlsXTsKKwkJb2JqcCA9IGFjLT5lbnRyeVstLWFjLT5hdmFpbF07CiAJfSBlbHNlIHsKIAkJU1RBVFNfSU5DX0FMTE9DTUlTUyhjYWNoZXApOwogCQlvYmpwID0gY2FjaGVfYWxsb2NfcmVmaWxsKGNhY2hlcCwgZmxhZ3MpOwpAQCAtMjE3MiwzMyArMjUzNCwxMDQgQEAKIAlyZXR1cm4gb2JqcDsKIH0KIAotLyogCi0gKiBOVU1BOiBkaWZmZXJlbnQgYXBwcm9hY2ggbmVlZGVkIGlmIHRoZSBzcGlubG9jayBpcyBtb3ZlZCBpbnRvCi0gKiB0aGUgbDMgc3RydWN0dXJlCisjaWZkZWYgQ09ORklHX05VTUEKKy8qCisgKiBBIGludGVyZmFjZSB0byBlbmFibGUgc2xhYiBjcmVhdGlvbiBvbiBub2RlaWQKICAqLworc3RhdGljIHZvaWQgKl9fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgaW50IGZsYWdzLCBpbnQgbm9kZWlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CisgCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKKyAJdm9pZCAqb2JqOworIAlrbWVtX2J1ZmN0bF90IG5leHQ7CisgCWludCB4OwogCisgCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXTsKKyAJQlVHX09OKCFsMyk7CisKK3JldHJ5OgorIAlzcGluX2xvY2soJmwzLT5saXN0X2xvY2spOworIAllbnRyeSA9IGwzLT5zbGFic19wYXJ0aWFsLm5leHQ7CisgCWlmIChlbnRyeSA9PSAmbDMtPnNsYWJzX3BhcnRpYWwpIHsKKyAJCWwzLT5mcmVlX3RvdWNoZWQgPSAxOworIAkJZW50cnkgPSBsMy0+c2xhYnNfZnJlZS5uZXh0OworIAkJaWYgKGVudHJ5ID09ICZsMy0+c2xhYnNfZnJlZSkKKyAJCQlnb3RvIG11c3RfZ3JvdzsKKyAJfQorCisgCXNsYWJwID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNsYWIsIGxpc3QpOworIAljaGVja19zcGlubG9ja19hY3F1aXJlZF9ub2RlKGNhY2hlcCwgbm9kZWlkKTsKKyAJY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7CisKKyAJU1RBVFNfSU5DX05PREVBTExPQ1MoY2FjaGVwKTsKKyAJU1RBVFNfSU5DX0FDVElWRShjYWNoZXApOworIAlTVEFUU19TRVRfSElHSChjYWNoZXApOworCisgCUJVR19PTihzbGFicC0+aW51c2UgPT0gY2FjaGVwLT5udW0pOworCisgCS8qIGdldCBvYmogcG9pbnRlciAqLworIAlvYmogPSAgc2xhYnAtPnNfbWVtICsgc2xhYnAtPmZyZWUqY2FjaGVwLT5vYmpzaXplOworIAlzbGFicC0+aW51c2UrKzsKKyAJbmV4dCA9IHNsYWJfYnVmY3RsKHNsYWJwKVtzbGFicC0+ZnJlZV07CisjaWYgREVCVUcKKyAJc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXSA9IEJVRkNUTF9GUkVFOworI2VuZGlmCisgCXNsYWJwLT5mcmVlID0gbmV4dDsKKyAJY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7CisgCWwzLT5mcmVlX29iamVjdHMtLTsKKyAJLyogbW92ZSBzbGFicCB0byBjb3JyZWN0IHNsYWJwIGxpc3Q6ICovCisgCWxpc3RfZGVsKCZzbGFicC0+bGlzdCk7CisKKyAJaWYgKHNsYWJwLT5mcmVlID09IEJVRkNUTF9FTkQpIHsKKyAJCWxpc3RfYWRkKCZzbGFicC0+bGlzdCwgJmwzLT5zbGFic19mdWxsKTsKKyAJfSBlbHNlIHsKKyAJCWxpc3RfYWRkKCZzbGFicC0+bGlzdCwgJmwzLT5zbGFic19wYXJ0aWFsKTsKKyAJfQorCisgCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKyAJZ290byBkb25lOworCittdXN0X2dyb3c6CisgCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKyAJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKKworIAlpZiAoIXgpCisgCQlyZXR1cm4gTlVMTDsKKworIAlnb3RvIHJldHJ5OworZG9uZToKKyAJcmV0dXJuIG9iajsKK30KKyNlbmRpZgorCisvKgorICogQ2FsbGVyIG5lZWRzIHRvIGFjcXVpcmUgY29ycmVjdCBrbWVtX2xpc3QncyBsaXN0X2xvY2sKKyAqLwogc3RhdGljIHZvaWQgZnJlZV9ibG9jayhrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdm9pZCAqKm9ianBwLCBpbnQgbnJfb2JqZWN0cykKIHsKIAlpbnQgaTsKLQotCWNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkKGNhY2hlcCk7Ci0KLQkvKiBOVU1BOiBtb3ZlIGFkZCBpbnRvIGxvb3AgKi8KLQljYWNoZXAtPmxpc3RzLmZyZWVfb2JqZWN0cyArPSBucl9vYmplY3RzOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKIAkJdm9pZCAqb2JqcCA9IG9ianBwW2ldOwogCQlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJCXVuc2lnbmVkIGludCBvYmpucjsKKwkJaW50IG5vZGVpZCA9IDA7CiAKIAkJc2xhYnAgPSBHRVRfUEFHRV9TTEFCKHZpcnRfdG9fcGFnZShvYmpwKSk7CisJCW5vZGVpZCA9IHNsYWJwLT5ub2RlaWQ7CisJCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXTsKIAkJbGlzdF9kZWwoJnNsYWJwLT5saXN0KTsKIAkJb2JqbnIgPSAob2JqcCAtIHNsYWJwLT5zX21lbSkgLyBjYWNoZXAtPm9ianNpemU7CisJCWNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkX25vZGUoY2FjaGVwLCBub2RlaWQpOwogCQljaGVja19zbGFicChjYWNoZXAsIHNsYWJwKTsKKworCiAjaWYgREVCVUcKIAkJaWYgKHNsYWJfYnVmY3RsKHNsYWJwKVtvYmpucl0gIT0gQlVGQ1RMX0ZSRUUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic2xhYjogZG91YmxlIGZyZWUgZGV0ZWN0ZWQgaW4gY2FjaGUgJyVzJywgb2JqcCAlcC5cbiIsCi0JCQkJCQljYWNoZXAtPm5hbWUsIG9ianApOworCQkJcHJpbnRrKEtFUk5fRVJSICJzbGFiOiBkb3VibGUgZnJlZSBkZXRlY3RlZCBpbiBjYWNoZSAiCisJCQkJCSInJXMnLCBvYmpwICVwXG4iLCBjYWNoZXAtPm5hbWUsIG9ianApOwogCQkJQlVHKCk7CiAJCX0KICNlbmRpZgpAQCAtMjIwNiwyNCArMjYzOSwyMyBAQAogCQlzbGFicC0+ZnJlZSA9IG9iam5yOwogCQlTVEFUU19ERUNfQUNUSVZFKGNhY2hlcCk7CiAJCXNsYWJwLT5pbnVzZS0tOworCQlsMy0+ZnJlZV9vYmplY3RzKys7CiAJCWNoZWNrX3NsYWJwKGNhY2hlcCwgc2xhYnApOwogCiAJCS8qIGZpeHVwIHNsYWIgY2hhaW5zICovCiAJCWlmIChzbGFicC0+aW51c2UgPT0gMCkgewotCQkJaWYgKGNhY2hlcC0+bGlzdHMuZnJlZV9vYmplY3RzID4gY2FjaGVwLT5mcmVlX2xpbWl0KSB7Ci0JCQkJY2FjaGVwLT5saXN0cy5mcmVlX29iamVjdHMgLT0gY2FjaGVwLT5udW07CisJCQlpZiAobDMtPmZyZWVfb2JqZWN0cyA+IGwzLT5mcmVlX2xpbWl0KSB7CisJCQkJbDMtPmZyZWVfb2JqZWN0cyAtPSBjYWNoZXAtPm51bTsKIAkJCQlzbGFiX2Rlc3Ryb3koY2FjaGVwLCBzbGFicCk7CiAJCQl9IGVsc2UgewotCQkJCWxpc3RfYWRkKCZzbGFicC0+bGlzdCwKLQkJCQkmbGlzdDNfZGF0YV9wdHIoY2FjaGVwLCBvYmpwKS0+c2xhYnNfZnJlZSk7CisJCQkJbGlzdF9hZGQoJnNsYWJwLT5saXN0LCAmbDMtPnNsYWJzX2ZyZWUpOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyogVW5jb25kaXRpb25hbGx5IG1vdmUgYSBzbGFiIHRvIHRoZSBlbmQgb2YgdGhlCiAJCQkgKiBwYXJ0aWFsIGxpc3Qgb24gZnJlZSAtIG1heGltdW0gdGltZSBmb3IgdGhlCiAJCQkgKiBvdGhlciBvYmplY3RzIHRvIGJlIGZyZWVkLCB0b28uCiAJCQkgKi8KLQkJCWxpc3RfYWRkX3RhaWwoJnNsYWJwLT5saXN0LAotCQkJCSZsaXN0M19kYXRhX3B0cihjYWNoZXAsIG9ianApLT5zbGFic19wYXJ0aWFsKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnNsYWJwLT5saXN0LCAmbDMtPnNsYWJzX3BhcnRpYWwpOwogCQl9CiAJfQogfQpAQCAtMjIzMSwzNiArMjY2MywzOCBAQAogc3RhdGljIHZvaWQgY2FjaGVfZmx1c2hhcnJheShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgc3RydWN0IGFycmF5X2NhY2hlICphYykKIHsKIAlpbnQgYmF0Y2hjb3VudDsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAKIAliYXRjaGNvdW50ID0gYWMtPmJhdGNoY291bnQ7CiAjaWYgREVCVUcKIAlCVUdfT04oIWJhdGNoY291bnQgfHwgYmF0Y2hjb3VudCA+IGFjLT5hdmFpbCk7CiAjZW5kaWYKIAljaGVja19pcnFfb2ZmKCk7Ci0Jc3Bpbl9sb2NrKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQlpZiAoY2FjaGVwLT5saXN0cy5zaGFyZWQpIHsKLQkJc3RydWN0IGFycmF5X2NhY2hlICpzaGFyZWRfYXJyYXkgPSBjYWNoZXAtPmxpc3RzLnNoYXJlZDsKKwlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXTsKKwlzcGluX2xvY2soJmwzLT5saXN0X2xvY2spOworCWlmIChsMy0+c2hhcmVkKSB7CisJCXN0cnVjdCBhcnJheV9jYWNoZSAqc2hhcmVkX2FycmF5ID0gbDMtPnNoYXJlZDsKIAkJaW50IG1heCA9IHNoYXJlZF9hcnJheS0+bGltaXQtc2hhcmVkX2FycmF5LT5hdmFpbDsKIAkJaWYgKG1heCkgewogCQkJaWYgKGJhdGNoY291bnQgPiBtYXgpCiAJCQkJYmF0Y2hjb3VudCA9IG1heDsKLQkJCW1lbWNweSgmYWNfZW50cnkoc2hhcmVkX2FycmF5KVtzaGFyZWRfYXJyYXktPmF2YWlsXSwKLQkJCQkJJmFjX2VudHJ5KGFjKVswXSwKKwkJCW1lbWNweSgmKHNoYXJlZF9hcnJheS0+ZW50cnlbc2hhcmVkX2FycmF5LT5hdmFpbF0pLAorCQkJCQlhYy0+ZW50cnksCiAJCQkJCXNpemVvZih2b2lkKikqYmF0Y2hjb3VudCk7CiAJCQlzaGFyZWRfYXJyYXktPmF2YWlsICs9IGJhdGNoY291bnQ7CiAJCQlnb3RvIGZyZWVfZG9uZTsKIAkJfQogCX0KIAotCWZyZWVfYmxvY2soY2FjaGVwLCAmYWNfZW50cnkoYWMpWzBdLCBiYXRjaGNvdW50KTsKKwlmcmVlX2Jsb2NrKGNhY2hlcCwgYWMtPmVudHJ5LCBiYXRjaGNvdW50KTsKIGZyZWVfZG9uZToKICNpZiBTVEFUUwogCXsKIAkJaW50IGkgPSAwOwogCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0JCXAgPSBsaXN0M19kYXRhKGNhY2hlcCktPnNsYWJzX2ZyZWUubmV4dDsKLQkJd2hpbGUgKHAgIT0gJihsaXN0M19kYXRhKGNhY2hlcCktPnNsYWJzX2ZyZWUpKSB7CisJCXAgPSBsMy0+c2xhYnNfZnJlZS5uZXh0OworCQl3aGlsZSAocCAhPSAmKGwzLT5zbGFic19mcmVlKSkgewogCQkJc3RydWN0IHNsYWIgKnNsYWJwOwogCiAJCQlzbGFicCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNsYWIsIGxpc3QpOwpAQCAtMjI3MiwxMiArMjcwNiwxMyBAQAogCQlTVEFUU19TRVRfRlJFRUFCTEUoY2FjaGVwLCBpKTsKIAl9CiAjZW5kaWYKLQlzcGluX3VubG9jaygmY2FjaGVwLT5zcGlubG9jayk7CisJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCWFjLT5hdmFpbCAtPSBiYXRjaGNvdW50OwotCW1lbW1vdmUoJmFjX2VudHJ5KGFjKVswXSwgJmFjX2VudHJ5KGFjKVtiYXRjaGNvdW50XSwKKwltZW1tb3ZlKGFjLT5lbnRyeSwgJihhYy0+ZW50cnlbYmF0Y2hjb3VudF0pLAogCQkJc2l6ZW9mKHZvaWQqKSphYy0+YXZhaWwpOwogfQogCisKIC8qCiAgKiBfX2NhY2hlX2ZyZWUKICAqIFJlbGVhc2UgYW4gb2JqIGJhY2sgdG8gaXRzIGNhY2hlLiBJZiB0aGUgb2JqIGhhcyBhIGNvbnN0cnVjdGVkCkBAIC0yMjkyLDE0ICsyNzI3LDQ2IEBACiAJY2hlY2tfaXJxX29mZigpOwogCW9ianAgPSBjYWNoZV9mcmVlX2RlYnVnY2hlY2soY2FjaGVwLCBvYmpwLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCisJLyogTWFrZSBzdXJlIHdlIGFyZSBub3QgZnJlZWluZyBhIG9iamVjdCBmcm9tIGFub3RoZXIKKwkgKiBub2RlIHRvIHRoZSBhcnJheSBjYWNoZSBvbiB0aGlzIGNwdS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfTlVNQQorCXsKKwkJc3RydWN0IHNsYWIgKnNsYWJwOworCQlzbGFicCA9IEdFVF9QQUdFX1NMQUIodmlydF90b19wYWdlKG9ianApKTsKKwkJaWYgKHVubGlrZWx5KHNsYWJwLT5ub2RlaWQgIT0gbnVtYV9ub2RlX2lkKCkpKSB7CisJCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFsaWVuID0gTlVMTDsKKwkJCWludCBub2RlaWQgPSBzbGFicC0+bm9kZWlkOworCQkJc3RydWN0IGttZW1fbGlzdDMgKmwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldOworCisJCQlTVEFUU19JTkNfTk9ERUZSRUVTKGNhY2hlcCk7CisJCQlpZiAobDMtPmFsaWVuICYmIGwzLT5hbGllbltub2RlaWRdKSB7CisJCQkJYWxpZW4gPSBsMy0+YWxpZW5bbm9kZWlkXTsKKwkJCQlzcGluX2xvY2soJmFsaWVuLT5sb2NrKTsKKwkJCQlpZiAodW5saWtlbHkoYWxpZW4tPmF2YWlsID09IGFsaWVuLT5saW1pdCkpCisJCQkJCV9fZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLAorCQkJCQkJCWFsaWVuLCBub2RlaWQpOworCQkJCWFsaWVuLT5lbnRyeVthbGllbi0+YXZhaWwrK10gPSBvYmpwOworCQkJCXNwaW5fdW5sb2NrKCZhbGllbi0+bG9jayk7CisJCQl9IGVsc2UgeworCQkJCXNwaW5fbG9jaygmKGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pLT4KKwkJCQkJCWxpc3RfbG9jayk7CisJCQkJZnJlZV9ibG9jayhjYWNoZXAsICZvYmpwLCAxKTsKKwkJCQlzcGluX3VubG9jaygmKGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pLT4KKwkJCQkJCWxpc3RfbG9jayk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKIAlpZiAobGlrZWx5KGFjLT5hdmFpbCA8IGFjLT5saW1pdCkpIHsKIAkJU1RBVFNfSU5DX0ZSRUVISVQoY2FjaGVwKTsKLQkJYWNfZW50cnkoYWMpW2FjLT5hdmFpbCsrXSA9IG9ianA7CisJCWFjLT5lbnRyeVthYy0+YXZhaWwrK10gPSBvYmpwOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJU1RBVFNfSU5DX0ZSRUVNSVNTKGNhY2hlcCk7CiAJCWNhY2hlX2ZsdXNoYXJyYXkoY2FjaGVwLCBhYyk7Ci0JCWFjX2VudHJ5KGFjKVthYy0+YXZhaWwrK10gPSBvYmpwOworCQlhYy0+ZW50cnlbYWMtPmF2YWlsKytdID0gb2JqcDsKIAl9CiB9CiAKQEAgLTIzNjksODEgKzI4MzYsMzAgQEAKICAqIElkZW50aWNhbCB0byBrbWVtX2NhY2hlX2FsbG9jLCBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHNsb3cKICAqIGFuZCBjYW4gc2xlZXAuIEFuZCBpdCB3aWxsIGFsbG9jYXRlIG1lbW9yeSBvbiB0aGUgZ2l2ZW4gbm9kZSwgd2hpY2gKICAqIGNhbiBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBmb3IgY3B1IGJvdW5kIHN0cnVjdHVyZXMuCisgKiBOZXcgYW5kIGltcHJvdmVkOiBpdCB3aWxsIG5vdyBtYWtlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IGdldHMKKyAqIHB1dCBvbiB0aGUgY29ycmVjdCBub2RlIGxpc3Qgc28gdGhhdCB0aGVyZSBpcyBubyBmYWxzZSBzaGFyaW5nLgogICovCi12b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBmbGFncywgaW50IG5vZGVpZCkKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzLCBpbnQgbm9kZWlkKQogewotCWludCBsb29wOwotCXZvaWQgKm9ianA7Ci0Jc3RydWN0IHNsYWIgKnNsYWJwOwotCWttZW1fYnVmY3RsX3QgbmV4dDsKKwl1bnNpZ25lZCBsb25nIHNhdmVfZmxhZ3M7CisJdm9pZCAqcHRyOwogCi0JaWYgKG5vZGVpZCA9PSAtMSkKLQkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisJaWYgKG5vZGVpZCA9PSBudW1hX25vZGVfaWQoKSB8fCBub2RlaWQgPT0gLTEpCisJCXJldHVybiBfX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwogCi0JZm9yIChsb29wID0gMDs7bG9vcCsrKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnE7Ci0KLQkJb2JqcCA9IE5VTEw7Ci0JCWNoZWNrX2lycV9vbigpOwotCQlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQkJLyogd2FsayB0aHJvdWdoIGFsbCBwYXJ0aWFsIGFuZCBlbXB0eSBzbGFiIGFuZCBmaW5kIG9uZQotCQkgKiBmcm9tIHRoZSByaWdodCBub2RlICovCi0JCWxpc3RfZm9yX2VhY2gocSwmY2FjaGVwLT5saXN0cy5zbGFic19wYXJ0aWFsKSB7Ci0JCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOwotCi0JCQlpZiAocGFnZV90b19uaWQodmlydF90b19wYWdlKHNsYWJwLT5zX21lbSkpID09IG5vZGVpZCB8fAotCQkJCQlsb29wID4gMikKLQkJCQlnb3RvIGdvdF9zbGFicDsKLQkJfQotCQlsaXN0X2Zvcl9lYWNoKHEsICZjYWNoZXAtPmxpc3RzLnNsYWJzX2ZyZWUpIHsKLQkJCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7Ci0KLQkJCWlmIChwYWdlX3RvX25pZCh2aXJ0X3RvX3BhZ2Uoc2xhYnAtPnNfbWVtKSkgPT0gbm9kZWlkIHx8Ci0JCQkJCWxvb3AgPiAyKQotCQkJCWdvdG8gZ290X3NsYWJwOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7Ci0KLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJaWYgKCFjYWNoZV9ncm93KGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCkpIHsKLQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwlpZiAodW5saWtlbHkoIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pKSB7CisJCS8qIEZhbGwgYmFjayB0byBfX2NhY2hlX2FsbG9jIGlmIHdlIHJ1biBpbnRvIHRyb3VibGUgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2xhYjogbm90IGFsbG9jYXRpbmcgaW4gaW5hY3RpdmUgbm9kZSAlZCBmb3IgY2FjaGUgJXNcbiIsIG5vZGVpZCwgY2FjaGVwLT5uYW1lKTsKKwkJcmV0dXJuIF9fY2FjaGVfYWxsb2MoY2FjaGVwLGZsYWdzKTsKIAl9Ci1nb3Rfc2xhYnA6Ci0JLyogZm91bmQgb25lOiBhbGxvY2F0ZSBvYmplY3QgKi8KLQljaGVja19zbGFicChjYWNoZXAsIHNsYWJwKTsKLQljaGVja19zcGlubG9ja19hY3F1aXJlZChjYWNoZXApOwogCi0JU1RBVFNfSU5DX0FMTE9DRUQoY2FjaGVwKTsKLQlTVEFUU19JTkNfQUNUSVZFKGNhY2hlcCk7Ci0JU1RBVFNfU0VUX0hJR0goY2FjaGVwKTsKLQlTVEFUU19JTkNfTk9ERUFMTE9DUyhjYWNoZXApOworCWNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYmVmb3JlKGNhY2hlcCwgZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKHNhdmVfZmxhZ3MpOworCXB0ciA9IF9fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBub2RlaWQpOworCWxvY2FsX2lycV9yZXN0b3JlKHNhdmVfZmxhZ3MpOworCXB0ciA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBmbGFncywgcHRyLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCi0Jb2JqcCA9IHNsYWJwLT5zX21lbSArIHNsYWJwLT5mcmVlKmNhY2hlcC0+b2Jqc2l6ZTsKLQotCXNsYWJwLT5pbnVzZSsrOwotCW5leHQgPSBzbGFiX2J1ZmN0bChzbGFicClbc2xhYnAtPmZyZWVdOwotI2lmIERFQlVHCi0Jc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXSA9IEJVRkNUTF9GUkVFOwotI2VuZGlmCi0Jc2xhYnAtPmZyZWUgPSBuZXh0OwotCWNoZWNrX3NsYWJwKGNhY2hlcCwgc2xhYnApOwotCi0JLyogbW92ZSBzbGFicCB0byBjb3JyZWN0IHNsYWJwIGxpc3Q6ICovCi0JbGlzdF9kZWwoJnNsYWJwLT5saXN0KTsKLQlpZiAoc2xhYnAtPmZyZWUgPT0gQlVGQ1RMX0VORCkKLQkJbGlzdF9hZGQoJnNsYWJwLT5saXN0LCAmY2FjaGVwLT5saXN0cy5zbGFic19mdWxsKTsKLQllbHNlCi0JCWxpc3RfYWRkKCZzbGFicC0+bGlzdCwgJmNhY2hlcC0+bGlzdHMuc2xhYnNfcGFydGlhbCk7Ci0KLQlsaXN0M19kYXRhKGNhY2hlcCktPmZyZWVfb2JqZWN0cy0tOwotCXNwaW5fdW5sb2NrX2lycSgmY2FjaGVwLT5zcGlubG9jayk7Ci0KLQlvYmpwID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIEdGUF9LRVJORUwsIG9ianAsCi0JCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIG9ianA7CisJcmV0dXJuIHB0cjsKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIApAQCAtMjUxMywxMSArMjkyOSwxOCBAQAogCWlmICghcGRhdGEpCiAJCXJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoIWNwdV9wb3NzaWJsZShpKSkKLQkJCWNvbnRpbnVlOwotCQlwZGF0YS0+cHRyc1tpXSA9IGttYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMLAotCQkJCQkJY3B1X3RvX25vZGUoaSkpOworCS8qCisJICogQ2Fubm90IHVzZSBmb3JfZWFjaF9vbmxpbmVfY3B1IHNpbmNlIGEgY3B1IG1heSBjb21lIG9ubGluZQorCSAqIGFuZCB3ZSBoYXZlIG5vIHdheSBvZiBmaWd1cmluZyBvdXQgaG93IHRvIGZpeCB0aGUgYXJyYXkKKwkgKiB0aGF0IHdlIGhhdmUgYWxsb2NhdGVkIHRoZW4uLi4uCisJICovCisJZm9yX2VhY2hfY3B1KGkpIHsKKwkJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShpKTsKKworCQlpZiAobm9kZV9vbmxpbmUobm9kZSkpCisJCQlwZGF0YS0+cHRyc1tpXSA9IGttYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMLCBub2RlKTsKKwkJZWxzZQorCQkJcGRhdGEtPnB0cnNbaV0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCiAJCWlmICghcGRhdGEtPnB0cnNbaV0pCiAJCQlnb3RvIHVud2luZF9vb207CkBAIC0yNTU4LDI5ICsyOTgxLDI1IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfZnJlZSk7CiAKIC8qKgotICoga2NhbGxvYyAtIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCi0gKiBAbjogbnVtYmVyIG9mIGVsZW1lbnRzLgotICogQHNpemU6IGVsZW1lbnQgc2l6ZS4KKyAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KICAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgogICovCi12b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQordm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQogewotCXZvaWQgKnJldCA9IE5VTEw7Ci0KLQlpZiAobiAhPSAwICYmIHNpemUgPiBJTlRfTUFYIC8gbikKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGttYWxsb2MobiAqIHNpemUsIGZsYWdzKTsKKwl2b2lkICpyZXQgPSBrbWFsbG9jKHNpemUsIGZsYWdzKTsKIAlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBuICogc2l6ZSk7CisJCW1lbXNldChyZXQsIDAsIHNpemUpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGtjYWxsb2MpOworRVhQT1JUX1NZTUJPTChremFsbG9jKTsKIAogLyoqCiAgKiBrZnJlZSAtIGZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5CiAgKiBAb2JqcDogcG9pbnRlciByZXR1cm5lZCBieSBrbWFsbG9jLgogICoKKyAqIElmIEBvYmpwIGlzIE5VTEwsIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisgKgogICogRG9uJ3QgZnJlZSBtZW1vcnkgbm90IG9yaWdpbmFsbHkgYWxsb2NhdGVkIGJ5IGttYWxsb2MoKQogICogb3IgeW91IHdpbGwgcnVuIGludG8gdHJvdWJsZS4KICAqLwpAQCAtMjYxMywxMSArMzAzMiwxMSBAQAogCWludCBpOwogCXN0cnVjdCBwZXJjcHVfZGF0YSAqcCA9IChzdHJ1Y3QgcGVyY3B1X2RhdGEgKikgKH4odW5zaWduZWQgbG9uZykgb2JqcCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICghY3B1X3Bvc3NpYmxlKGkpKQotCQkJY29udGludWU7CisJLyoKKwkgKiBXZSBhbGxvY2F0ZSBmb3IgYWxsIGNwdXMgc28gd2UgY2Fubm90IHVzZSBmb3Igb25saW5lIGNwdSBoZXJlLgorCSAqLworCWZvcl9lYWNoX2NwdShpKQogCQlrZnJlZShwLT5wdHJzW2ldKTsKLQl9CiAJa2ZyZWUocCk7CiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfcGVyY3B1KTsKQEAgLTI2MzUsNiArMzA1NCw2NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa21lbV9jYWNoZV9uYW1lKTsKIAorLyoKKyAqIFRoaXMgaW5pdGlhbGl6ZXMga21lbV9saXN0MyBmb3IgYWxsIG5vZGVzLgorICovCitzdGF0aWMgaW50IGFsbG9jX2ttZW1saXN0KGttZW1fY2FjaGVfdCAqY2FjaGVwKQoreworCWludCBub2RlOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKKwlpbnQgZXJyID0gMDsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJc3RydWN0IGFycmF5X2NhY2hlICpuYyA9IE5VTEwsICpuZXc7CisJCXN0cnVjdCBhcnJheV9jYWNoZSAqKm5ld19hbGllbiA9IE5VTEw7CisjaWZkZWYgQ09ORklHX05VTUEKKwkJaWYgKCEobmV3X2FsaWVuID0gYWxsb2NfYWxpZW5fY2FjaGUobm9kZSwgY2FjaGVwLT5saW1pdCkpKQorCQkJZ290byBmYWlsOworI2VuZGlmCisJCWlmICghKG5ldyA9IGFsbG9jX2FycmF5Y2FjaGUobm9kZSwgKGNhY2hlcC0+c2hhcmVkKgorCQkJCWNhY2hlcC0+YmF0Y2hjb3VudCksIDB4YmFhZGYwMGQpKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKChsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdKSkgeworCisJCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKKworCQkJaWYgKChuYyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5zaGFyZWQpKQorCQkJCWZyZWVfYmxvY2soY2FjaGVwLCBuYy0+ZW50cnksCisJCQkJCQkJbmMtPmF2YWlsKTsKKworCQkJbDMtPnNoYXJlZCA9IG5ldzsKKwkJCWlmICghY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0tPmFsaWVuKSB7CisJCQkJbDMtPmFsaWVuID0gbmV3X2FsaWVuOworCQkJCW5ld19hbGllbiA9IE5VTEw7CisJCQl9CisJCQlsMy0+ZnJlZV9saW1pdCA9ICgxICsgbnJfY3B1c19ub2RlKG5vZGUpKSoKKwkJCQljYWNoZXAtPmJhdGNoY291bnQgKyBjYWNoZXAtPm51bTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CisJCQlrZnJlZShuYyk7CisJCQlmcmVlX2FsaWVuX2NhY2hlKG5ld19hbGllbik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIShsMyA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGttZW1fbGlzdDMpLAorCQkJCQkJR0ZQX0tFUk5FTCwgbm9kZSkpKQorCQkJZ290byBmYWlsOworCisJCWttZW1fbGlzdDNfaW5pdChsMyk7CisJCWwzLT5uZXh0X3JlYXAgPSBqaWZmaWVzICsgUkVBUFRJTUVPVVRfTElTVDMgKworCQkJKCh1bnNpZ25lZCBsb25nKWNhY2hlcCklUkVBUFRJTUVPVVRfTElTVDM7CisJCWwzLT5zaGFyZWQgPSBuZXc7CisJCWwzLT5hbGllbiA9IG5ld19hbGllbjsKKwkJbDMtPmZyZWVfbGltaXQgPSAoMSArIG5yX2NwdXNfbm9kZShub2RlKSkqCisJCQljYWNoZXAtPmJhdGNoY291bnQgKyBjYWNoZXAtPm51bTsKKwkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0gPSBsMzsKKwl9CisJcmV0dXJuIGVycjsKK2ZhaWw6CisJZXJyID0gLUVOT01FTTsKKwlyZXR1cm4gZXJyOworfQorCiBzdHJ1Y3QgY2N1cGRhdGVfc3RydWN0IHsKIAlrbWVtX2NhY2hlX3QgKmNhY2hlcDsKIAlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5ld1tOUl9DUFVTXTsKQEAgLTI2NDcsNyArMzEyNCw3IEBACiAKIAljaGVja19pcnFfb2ZmKCk7CiAJb2xkID0gYWNfZGF0YShuZXctPmNhY2hlcCk7Ci0JCisKIAluZXctPmNhY2hlcC0+YXJyYXlbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IG5ldy0+bmV3W3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJbmV3LT5uZXdbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IG9sZDsKIH0KQEAgLTI2NTcsNTQgKzMxMzQsNDMgQEAKIAkJCQlpbnQgc2hhcmVkKQogewogCXN0cnVjdCBjY3VwZGF0ZV9zdHJ1Y3QgbmV3OwotCXN0cnVjdCBhcnJheV9jYWNoZSAqbmV3X3NoYXJlZDsKLQlpbnQgaTsKKwlpbnQgaSwgZXJyOwogCiAJbWVtc2V0KCZuZXcubmV3LDAsc2l6ZW9mKG5ldy5uZXcpKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmIChjcHVfb25saW5lKGkpKSB7Ci0JCQluZXcubmV3W2ldID0gYWxsb2NfYXJyYXljYWNoZShpLCBsaW1pdCwgYmF0Y2hjb3VudCk7Ci0JCQlpZiAoIW5ldy5uZXdbaV0pIHsKLQkJCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIGtmcmVlKG5ldy5uZXdbaV0pOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9IGVsc2UgewotCQkJbmV3Lm5ld1tpXSA9IE5VTEw7CisJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCW5ldy5uZXdbaV0gPSBhbGxvY19hcnJheWNhY2hlKGNwdV90b19ub2RlKGkpLCBsaW1pdCwgYmF0Y2hjb3VudCk7CisJCWlmICghbmV3Lm5ld1tpXSkgeworCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKSBrZnJlZShuZXcubmV3W2ldKTsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQogCW5ldy5jYWNoZXAgPSBjYWNoZXA7CiAKIAlzbXBfY2FsbF9mdW5jdGlvbl9hbGxfY3B1cyhkb19jY3VwZGF0ZV9sb2NhbCwgKHZvaWQgKikmbmV3KTsKLQkKKwogCWNoZWNrX2lycV9vbigpOwogCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCWNhY2hlcC0+YmF0Y2hjb3VudCA9IGJhdGNoY291bnQ7CiAJY2FjaGVwLT5saW1pdCA9IGxpbWl0OwotCWNhY2hlcC0+ZnJlZV9saW1pdCA9ICgxK251bV9vbmxpbmVfY3B1cygpKSpjYWNoZXAtPmJhdGNoY291bnQgKyBjYWNoZXAtPm51bTsKKwljYWNoZXAtPnNoYXJlZCA9IHNoYXJlZDsKIAlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmNjb2xkID0gbmV3Lm5ld1tpXTsKIAkJaWYgKCFjY29sZCkKIAkJCWNvbnRpbnVlOwotCQlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQkJZnJlZV9ibG9jayhjYWNoZXAsIGFjX2VudHJ5KGNjb2xkKSwgY2NvbGQtPmF2YWlsKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmY2FjaGVwLT5ub2RlbGlzdHNbY3B1X3RvX25vZGUoaSldLT5saXN0X2xvY2spOworCQlmcmVlX2Jsb2NrKGNhY2hlcCwgY2NvbGQtPmVudHJ5LCBjY29sZC0+YXZhaWwpOworCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+bm9kZWxpc3RzW2NwdV90b19ub2RlKGkpXS0+bGlzdF9sb2NrKTsKIAkJa2ZyZWUoY2NvbGQpOwogCX0KLQluZXdfc2hhcmVkID0gYWxsb2NfYXJyYXljYWNoZSgtMSwgYmF0Y2hjb3VudCpzaGFyZWQsIDB4YmFhZGYwMGQpOwotCWlmIChuZXdfc2hhcmVkKSB7Ci0JCXN0cnVjdCBhcnJheV9jYWNoZSAqb2xkOwogCi0JCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwotCQlvbGQgPSBjYWNoZXAtPmxpc3RzLnNoYXJlZDsKLQkJY2FjaGVwLT5saXN0cy5zaGFyZWQgPSBuZXdfc2hhcmVkOwotCQlpZiAob2xkKQotCQkJZnJlZV9ibG9jayhjYWNoZXAsIGFjX2VudHJ5KG9sZCksIG9sZC0+YXZhaWwpOwotCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwotCQlrZnJlZShvbGQpOworCWVyciA9IGFsbG9jX2ttZW1saXN0KGNhY2hlcCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImFsbG9jX2ttZW1saXN0IGZhaWxlZCBmb3IgJXMsIGVycm9yICVkLlxuIiwKKwkJCQljYWNoZXAtPm5hbWUsIC1lcnIpOworCQlCVUcoKTsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjc2MiwxMSArMzIyOCwxMSBAQAogfQogCiBzdGF0aWMgdm9pZCBkcmFpbl9hcnJheV9sb2NrZWQoa21lbV9jYWNoZV90ICpjYWNoZXAsCi0JCQkJc3RydWN0IGFycmF5X2NhY2hlICphYywgaW50IGZvcmNlKQorCQkJCXN0cnVjdCBhcnJheV9jYWNoZSAqYWMsIGludCBmb3JjZSwgaW50IG5vZGUpCiB7CiAJaW50IHRvZnJlZTsKIAotCWNoZWNrX3NwaW5sb2NrX2FjcXVpcmVkKGNhY2hlcCk7CisJY2hlY2tfc3BpbmxvY2tfYWNxdWlyZWRfbm9kZShjYWNoZXAsIG5vZGUpOwogCWlmIChhYy0+dG91Y2hlZCAmJiAhZm9yY2UpIHsKIAkJYWMtPnRvdWNoZWQgPSAwOwogCX0gZWxzZSBpZiAoYWMtPmF2YWlsKSB7CkBAIC0yNzc0LDkgKzMyNDAsOSBAQAogCQlpZiAodG9mcmVlID4gYWMtPmF2YWlsKSB7CiAJCQl0b2ZyZWUgPSAoYWMtPmF2YWlsKzEpLzI7CiAJCX0KLQkJZnJlZV9ibG9jayhjYWNoZXAsIGFjX2VudHJ5KGFjKSwgdG9mcmVlKTsKKwkJZnJlZV9ibG9jayhjYWNoZXAsIGFjLT5lbnRyeSwgdG9mcmVlKTsKIAkJYWMtPmF2YWlsIC09IHRvZnJlZTsKLQkJbWVtbW92ZSgmYWNfZW50cnkoYWMpWzBdLCAmYWNfZW50cnkoYWMpW3RvZnJlZV0sCisJCW1lbW1vdmUoYWMtPmVudHJ5LCAmKGFjLT5lbnRyeVt0b2ZyZWVdKSwKIAkJCQkJc2l6ZW9mKHZvaWQqKSphYy0+YXZhaWwpOwogCX0KIH0KQEAgLTI3OTUsNiArMzI2MSw3IEBACiBzdGF0aWMgdm9pZCBjYWNoZV9yZWFwKHZvaWQgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp3YWxrOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKIAogCWlmIChkb3duX3RyeWxvY2soJmNhY2hlX2NoYWluX3NlbSkpIHsKIAkJLyogR2l2ZSB1cC4gU2V0dXAgdGhlIG5leHQgaXRlcmF0aW9uLiAqLwpAQCAtMjgxNSwyNyArMzI4MiwzMiBAQAogCiAJCWNoZWNrX2lycV9vbigpOwogCi0JCXNwaW5fbG9ja19pcnEoJnNlYXJjaHAtPnNwaW5sb2NrKTsKKwkJbDMgPSBzZWFyY2hwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldOworCQlpZiAobDMtPmFsaWVuKQorCQkJZHJhaW5fYWxpZW5fY2FjaGUoc2VhcmNocCwgbDMpOworCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAotCQlkcmFpbl9hcnJheV9sb2NrZWQoc2VhcmNocCwgYWNfZGF0YShzZWFyY2hwKSwgMCk7CisJCWRyYWluX2FycmF5X2xvY2tlZChzZWFyY2hwLCBhY19kYXRhKHNlYXJjaHApLCAwLAorCQkJCW51bWFfbm9kZV9pZCgpKTsKIAotCQlpZih0aW1lX2FmdGVyKHNlYXJjaHAtPmxpc3RzLm5leHRfcmVhcCwgamlmZmllcykpCisJCWlmICh0aW1lX2FmdGVyKGwzLT5uZXh0X3JlYXAsIGppZmZpZXMpKQogCQkJZ290byBuZXh0X3VubG9jazsKIAotCQlzZWFyY2hwLT5saXN0cy5uZXh0X3JlYXAgPSBqaWZmaWVzICsgUkVBUFRJTUVPVVRfTElTVDM7CisJCWwzLT5uZXh0X3JlYXAgPSBqaWZmaWVzICsgUkVBUFRJTUVPVVRfTElTVDM7CiAKLQkJaWYgKHNlYXJjaHAtPmxpc3RzLnNoYXJlZCkKLQkJCWRyYWluX2FycmF5X2xvY2tlZChzZWFyY2hwLCBzZWFyY2hwLT5saXN0cy5zaGFyZWQsIDApOworCQlpZiAobDMtPnNoYXJlZCkKKwkJCWRyYWluX2FycmF5X2xvY2tlZChzZWFyY2hwLCBsMy0+c2hhcmVkLCAwLAorCQkJCW51bWFfbm9kZV9pZCgpKTsKIAotCQlpZiAoc2VhcmNocC0+bGlzdHMuZnJlZV90b3VjaGVkKSB7Ci0JCQlzZWFyY2hwLT5saXN0cy5mcmVlX3RvdWNoZWQgPSAwOworCQlpZiAobDMtPmZyZWVfdG91Y2hlZCkgeworCQkJbDMtPmZyZWVfdG91Y2hlZCA9IDA7CiAJCQlnb3RvIG5leHRfdW5sb2NrOwogCQl9CiAKLQkJdG9mcmVlID0gKHNlYXJjaHAtPmZyZWVfbGltaXQrNSpzZWFyY2hwLT5udW0tMSkvKDUqc2VhcmNocC0+bnVtKTsKKwkJdG9mcmVlID0gKGwzLT5mcmVlX2xpbWl0KzUqc2VhcmNocC0+bnVtLTEpLyg1KnNlYXJjaHAtPm51bSk7CiAJCWRvIHsKLQkJCXAgPSBsaXN0M19kYXRhKHNlYXJjaHApLT5zbGFic19mcmVlLm5leHQ7Ci0JCQlpZiAocCA9PSAmKGxpc3QzX2RhdGEoc2VhcmNocCktPnNsYWJzX2ZyZWUpKQorCQkJcCA9IGwzLT5zbGFic19mcmVlLm5leHQ7CisJCQlpZiAocCA9PSAmKGwzLT5zbGFic19mcmVlKSkKIAkJCQlicmVhazsKIAogCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbGFiLCBsaXN0KTsKQEAgLTI4NDgsMTMgKzMzMjAsMTMgQEAKIAkJCSAqIHNlYXJjaHAgY2Fubm90IGRpc2FwcGVhciwgd2UgaG9sZAogCQkJICogY2FjaGVfY2hhaW5fbG9jawogCQkJICovCi0JCQlzZWFyY2hwLT5saXN0cy5mcmVlX29iamVjdHMgLT0gc2VhcmNocC0+bnVtOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZzZWFyY2hwLT5zcGlubG9jayk7CisJCQlsMy0+ZnJlZV9vYmplY3RzIC09IHNlYXJjaHAtPm51bTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiAJCQlzbGFiX2Rlc3Ryb3koc2VhcmNocCwgc2xhYnApOwotCQkJc3Bpbl9sb2NrX2lycSgmc2VhcmNocC0+c3BpbmxvY2spOworCQkJc3Bpbl9sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiAJCX0gd2hpbGUoLS10b2ZyZWUgPiAwKTsKIG5leHRfdW5sb2NrOgotCQlzcGluX3VubG9ja19pcnEoJnNlYXJjaHAtPnNwaW5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIG5leHQ6CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KQEAgLTI4ODgsNyArMzM2MCw3IEBACiAJCXNlcV9wdXRzKG0sICIgOiBzbGFiZGF0YSA8YWN0aXZlX3NsYWJzPiA8bnVtX3NsYWJzPiA8c2hhcmVkYXZhaWw+Iik7CiAjaWYgU1RBVFMKIAkJc2VxX3B1dHMobSwgIiA6IGdsb2JhbHN0YXQgPGxpc3RhbGxvY3M+IDxtYXhvYmpzPiA8Z3Jvd24+IDxyZWFwZWQ+IgotCQkJCSIgPGVycm9yPiA8bWF4ZnJlZWFibGU+IDxmcmVlbGltaXQ+IDxub2RlYWxsb2NzPiIpOworCQkJCSIgPGVycm9yPiA8bWF4ZnJlZWFibGU+IDxub2RlYWxsb2NzPiA8cmVtb3RlZnJlZXM+Iik7CiAJCXNlcV9wdXRzKG0sICIgOiBjcHVzdGF0IDxhbGxvY2hpdD4gPGFsbG9jbWlzcz4gPGZyZWVoaXQ+IDxmcmVlbWlzcz4iKTsKICNlbmRpZgogCQlzZXFfcHV0YyhtLCAnXG4nKTsKQEAgLTI5MjMsMzkgKzMzOTUsNTMgQEAKIAl1bnNpZ25lZCBsb25nCWFjdGl2ZV9vYmpzOwogCXVuc2lnbmVkIGxvbmcJbnVtX29ianM7CiAJdW5zaWduZWQgbG9uZwlhY3RpdmVfc2xhYnMgPSAwOwotCXVuc2lnbmVkIGxvbmcJbnVtX3NsYWJzOwotCWNvbnN0IGNoYXIgKm5hbWU7IAorCXVuc2lnbmVkIGxvbmcJbnVtX3NsYWJzLCBmcmVlX29iamVjdHMgPSAwLCBzaGFyZWRfYXZhaWwgPSAwOworCWNvbnN0IGNoYXIgKm5hbWU7CiAJY2hhciAqZXJyb3IgPSBOVUxMOworCWludCBub2RlOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKIAogCWNoZWNrX2lycV9vbigpOwogCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCWFjdGl2ZV9vYmpzID0gMDsKIAludW1fc2xhYnMgPSAwOwotCWxpc3RfZm9yX2VhY2gocSwmY2FjaGVwLT5saXN0cy5zbGFic19mdWxsKSB7Ci0JCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7Ci0JCWlmIChzbGFicC0+aW51c2UgIT0gY2FjaGVwLT5udW0gJiYgIWVycm9yKQotCQkJZXJyb3IgPSAic2xhYnNfZnVsbCBhY2NvdW50aW5nIGVycm9yIjsKLQkJYWN0aXZlX29ianMgKz0gY2FjaGVwLT5udW07Ci0JCWFjdGl2ZV9zbGFicysrOwotCX0KLQlsaXN0X2Zvcl9lYWNoKHEsJmNhY2hlcC0+bGlzdHMuc2xhYnNfcGFydGlhbCkgewotCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOwotCQlpZiAoc2xhYnAtPmludXNlID09IGNhY2hlcC0+bnVtICYmICFlcnJvcikKLQkJCWVycm9yID0gInNsYWJzX3BhcnRpYWwgaW51c2UgYWNjb3VudGluZyBlcnJvciI7Ci0JCWlmICghc2xhYnAtPmludXNlICYmICFlcnJvcikKLQkJCWVycm9yID0gInNsYWJzX3BhcnRpYWwvaW51c2UgYWNjb3VudGluZyBlcnJvciI7Ci0JCWFjdGl2ZV9vYmpzICs9IHNsYWJwLT5pbnVzZTsKLQkJYWN0aXZlX3NsYWJzKys7Ci0JfQotCWxpc3RfZm9yX2VhY2gocSwmY2FjaGVwLT5saXN0cy5zbGFic19mcmVlKSB7Ci0JCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7Ci0JCWlmIChzbGFicC0+aW51c2UgJiYgIWVycm9yKQotCQkJZXJyb3IgPSAic2xhYnNfZnJlZS9pbnVzZSBhY2NvdW50aW5nIGVycm9yIjsKLQkJbnVtX3NsYWJzKys7CisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgeworCQlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdOworCQlpZiAoIWwzKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKworCQlsaXN0X2Zvcl9lYWNoKHEsJmwzLT5zbGFic19mdWxsKSB7CisJCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOworCQkJaWYgKHNsYWJwLT5pbnVzZSAhPSBjYWNoZXAtPm51bSAmJiAhZXJyb3IpCisJCQkJZXJyb3IgPSAic2xhYnNfZnVsbCBhY2NvdW50aW5nIGVycm9yIjsKKwkJCWFjdGl2ZV9vYmpzICs9IGNhY2hlcC0+bnVtOworCQkJYWN0aXZlX3NsYWJzKys7CisJCX0KKwkJbGlzdF9mb3JfZWFjaChxLCZsMy0+c2xhYnNfcGFydGlhbCkgeworCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKKwkJCWlmIChzbGFicC0+aW51c2UgPT0gY2FjaGVwLT5udW0gJiYgIWVycm9yKQorCQkJCWVycm9yID0gInNsYWJzX3BhcnRpYWwgaW51c2UgYWNjb3VudGluZyBlcnJvciI7CisJCQlpZiAoIXNsYWJwLT5pbnVzZSAmJiAhZXJyb3IpCisJCQkJZXJyb3IgPSAic2xhYnNfcGFydGlhbC9pbnVzZSBhY2NvdW50aW5nIGVycm9yIjsKKwkJCWFjdGl2ZV9vYmpzICs9IHNsYWJwLT5pbnVzZTsKKwkJCWFjdGl2ZV9zbGFicysrOworCQl9CisJCWxpc3RfZm9yX2VhY2gocSwmbDMtPnNsYWJzX2ZyZWUpIHsKKwkJCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CisJCQlpZiAoc2xhYnAtPmludXNlICYmICFlcnJvcikKKwkJCQllcnJvciA9ICJzbGFic19mcmVlL2ludXNlIGFjY291bnRpbmcgZXJyb3IiOworCQkJbnVtX3NsYWJzKys7CisJCX0KKwkJZnJlZV9vYmplY3RzICs9IGwzLT5mcmVlX29iamVjdHM7CisJCXNoYXJlZF9hdmFpbCArPSBsMy0+c2hhcmVkLT5hdmFpbDsKKworCQlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CiAJfQogCW51bV9zbGFicys9YWN0aXZlX3NsYWJzOwogCW51bV9vYmpzID0gbnVtX3NsYWJzKmNhY2hlcC0+bnVtOwotCWlmIChudW1fb2JqcyAtIGFjdGl2ZV9vYmpzICE9IGNhY2hlcC0+bGlzdHMuZnJlZV9vYmplY3RzICYmICFlcnJvcikKKwlpZiAobnVtX29ianMgLSBhY3RpdmVfb2JqcyAhPSBmcmVlX29iamVjdHMgJiYgIWVycm9yKQogCQllcnJvciA9ICJmcmVlX29iamVjdHMgYWNjb3VudGluZyBlcnJvciI7CiAKIAluYW1lID0gY2FjaGVwLT5uYW1lOyAKQEAgLTI5NjcsOSArMzQ1Myw5IEBACiAJCWNhY2hlcC0+bnVtLCAoMTw8Y2FjaGVwLT5nZnBvcmRlcikpOwogCXNlcV9wcmludGYobSwgIiA6IHR1bmFibGVzICU0dSAlNHUgJTR1IiwKIAkJCWNhY2hlcC0+bGltaXQsIGNhY2hlcC0+YmF0Y2hjb3VudCwKLQkJCWNhY2hlcC0+bGlzdHMuc2hhcmVkLT5saW1pdC9jYWNoZXAtPmJhdGNoY291bnQpOwotCXNlcV9wcmludGYobSwgIiA6IHNsYWJkYXRhICU2bHUgJTZsdSAlNnUiLAotCQkJYWN0aXZlX3NsYWJzLCBudW1fc2xhYnMsIGNhY2hlcC0+bGlzdHMuc2hhcmVkLT5hdmFpbCk7CisJCQljYWNoZXAtPnNoYXJlZCk7CisJc2VxX3ByaW50ZihtLCAiIDogc2xhYmRhdGEgJTZsdSAlNmx1ICU2bHUiLAorCQkJYWN0aXZlX3NsYWJzLCBudW1fc2xhYnMsIHNoYXJlZF9hdmFpbCk7CiAjaWYgU1RBVFMKIAl7CS8qIGxpc3QzIHN0YXRzICovCiAJCXVuc2lnbmVkIGxvbmcgaGlnaCA9IGNhY2hlcC0+aGlnaF9tYXJrOwpAQCAtMjk3OCwxMiArMzQ2NCwxMyBAQAogCQl1bnNpZ25lZCBsb25nIHJlYXBlZCA9IGNhY2hlcC0+cmVhcGVkOwogCQl1bnNpZ25lZCBsb25nIGVycm9ycyA9IGNhY2hlcC0+ZXJyb3JzOwogCQl1bnNpZ25lZCBsb25nIG1heF9mcmVlYWJsZSA9IGNhY2hlcC0+bWF4X2ZyZWVhYmxlOwotCQl1bnNpZ25lZCBsb25nIGZyZWVfbGltaXQgPSBjYWNoZXAtPmZyZWVfbGltaXQ7CiAJCXVuc2lnbmVkIGxvbmcgbm9kZV9hbGxvY3MgPSBjYWNoZXAtPm5vZGVfYWxsb2NzOworCQl1bnNpZ25lZCBsb25nIG5vZGVfZnJlZXMgPSBjYWNoZXAtPm5vZGVfZnJlZXM7CiAKLQkJc2VxX3ByaW50ZihtLCAiIDogZ2xvYmFsc3RhdCAlN2x1ICU2bHUgJTVsdSAlNGx1ICU0bHUgJTRsdSAlNGx1ICU0bHUiLAotCQkJCWFsbG9jcywgaGlnaCwgZ3Jvd24sIHJlYXBlZCwgZXJyb3JzLCAKLQkJCQltYXhfZnJlZWFibGUsIGZyZWVfbGltaXQsIG5vZGVfYWxsb2NzKTsKKwkJc2VxX3ByaW50ZihtLCAiIDogZ2xvYmFsc3RhdCAlN2x1ICU2bHUgJTVsdSAlNGx1IFwKKwkJCQklNGx1ICU0bHUgJTRsdSAlNGx1IiwKKwkJCQlhbGxvY3MsIGhpZ2gsIGdyb3duLCByZWFwZWQsIGVycm9ycywKKwkJCQltYXhfZnJlZWFibGUsIG5vZGVfYWxsb2NzLCBub2RlX2ZyZWVzKTsKIAl9CiAJLyogY3B1IHN0YXRzICovCiAJewpAQCAtMzA2Miw5ICszNTQ5LDEwIEBACiAJCQkgICAgYmF0Y2hjb3VudCA8IDEgfHwKIAkJCSAgICBiYXRjaGNvdW50ID4gbGltaXQgfHwKIAkJCSAgICBzaGFyZWQgPCAwKSB7Ci0JCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlyZXMgPSAwOwogCQkJfSBlbHNlIHsKLQkJCQlyZXMgPSBkb190dW5lX2NwdWNhY2hlKGNhY2hlcCwgbGltaXQsIGJhdGNoY291bnQsIHNoYXJlZCk7CisJCQkJcmVzID0gZG9fdHVuZV9jcHVjYWNoZShjYWNoZXAsIGxpbWl0LAorCQkJCQkJCWJhdGNoY291bnQsIHNoYXJlZCk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDAyOWU1NmUuLmFkYmMyYjQgMTAwNjQ0Ci0tLSBhL21tL3N3YXBfc3RhdGUuYworKysgYi9tbS9zd2FwX3N0YXRlLmMKQEAgLTY3LDggKzY3LDggQEAKICAqIF9fYWRkX3RvX3N3YXBfY2FjaGUgcmVzZW1ibGVzIGFkZF90b19wYWdlX2NhY2hlIG9uIHN3YXBwZXJfc3BhY2UsCiAgKiBidXQgc2V0cyBTd2FwQ2FjaGUgZmxhZyBhbmQgcHJpdmF0ZSBpbnN0ZWFkIG9mIG1hcHBpbmcgYW5kIGluZGV4LgogICovCi1zdGF0aWMgaW50IF9fYWRkX3RvX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCXN3cF9lbnRyeV90IGVudHJ5LCBpbnQgZ2ZwX21hc2spCitzdGF0aWMgaW50IF9fYWRkX3RvX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN3cF9lbnRyeV90IGVudHJ5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKIHsKIAlpbnQgZXJyb3I7CiAKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDRiNmU4YmYuLjAxODRmNTEgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTE1Myw4ICsxMTUzLDcgQEAKIAlwLT5oaWdoZXN0X2JpdCA9IDA7CQkvKiBjdXRzIHNjYW5zIHNob3J0ICovCiAJd2hpbGUgKHAtPmZsYWdzID49IFNXUF9TQ0FOTklORykgewogCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCX0KIApkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDY3YjM1OGUuLjEzYzNkODIgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTMzMiw5ICszMzIsMTAgQEAKICAqCUBhZGRyOgkJbWVtb3J5IGJhc2UgYWRkcmVzcwogICoKICAqCUZyZWUgdGhlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0IEBhZGRyLCBhcwotICoJb2J0YWluZWQgZnJvbSB2bWFsbG9jKCksIHZtYWxsb2NfMzIoKSBvciBfX3ZtYWxsb2MoKS4KKyAqCW9idGFpbmVkIGZyb20gdm1hbGxvYygpLCB2bWFsbG9jXzMyKCkgb3IgX192bWFsbG9jKCkuIElmIEBhZGRyIGlzCisgKglOVUxMLCBubyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgogICoKLSAqCU1heSBub3QgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgorICoJTXVzdCBub3QgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgogICovCiB2b2lkIHZmcmVlKHZvaWQgKmFkZHIpCiB7CkBAIC0zNTIsNyArMzUzLDcgQEAKICAqCUZyZWUgdGhlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0IEBhZGRyLAogICoJd2hpY2ggd2FzIGNyZWF0ZWQgZnJvbSB0aGUgcGFnZSBhcnJheSBwYXNzZWQgdG8gdm1hcCgpLgogICoKLSAqCU1heSBub3QgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgorICoJTXVzdCBub3QgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgogICovCiB2b2lkIHZ1bm1hcCh2b2lkICphZGRyKQogewpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCAwMDk1NTMzLi5hNzQwNzc4IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtODk0LDcgKzg5NCw3IEBACiAJCWlmICh6b25lLT5wcmVzZW50X3BhZ2VzID09IDApCiAJCQljb250aW51ZTsKIAotCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSkpCisJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lLCBfX0dGUF9IQVJEV0FMTCkpCiAJCQljb250aW51ZTsKIAogCQl6b25lLT50ZW1wX3ByaW9yaXR5ID0gc2MtPnByaW9yaXR5OwpAQCAtOTQwLDcgKzk0MCw3IEBACiAJZm9yIChpID0gMDsgem9uZXNbaV0gIT0gTlVMTDsgaSsrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gem9uZXNbaV07CiAKLQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUpKQorCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgX19HRlBfSEFSRFdBTEwpKQogCQkJY29udGludWU7CiAKIAkJem9uZS0+dGVtcF9wcmlvcml0eSA9IERFRl9QUklPUklUWTsKQEAgLTk4Niw3ICs5ODYsNyBAQAogCWZvciAoaSA9IDA7IHpvbmVzW2ldICE9IDA7IGkrKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHpvbmVzW2ldOwogCi0JCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lKSkKKwkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKIAkJCWNvbnRpbnVlOwogCiAJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSB6b25lLT50ZW1wX3ByaW9yaXR5OwpAQCAtMTI1Niw3ICsxMjU2LDcgQEAKIAkJcmV0dXJuOwogCWlmIChwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA8IG9yZGVyKQogCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IG9yZGVyOwotCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lKSkKKwlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgX19HRlBfSEFSRFdBTEwpKQogCQlyZXR1cm47CiAJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZ6b25lLT56b25lX3BnZGF0LT5rc3dhcGRfd2FpdCkpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmMgYi9uZXQvYXRtL21wYy5jCmluZGV4IDE3YTgxZWIuLjUyNmQ5NTMgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmMKKysrIGIvbmV0L2F0bS9tcGMuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjcyA9IE5VTEw7IC8qIEZJWE1FICovCiBzdGF0aWMgc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zX2hlYWQgPSBOVUxMOwotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG1wY190aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihtcGNfdGltZXIsIE5VTEwsIDAsIDApOwogCiAKIHN0YXRpYyBzdHJ1Y3QgbXBvYV9jbGllbnQgKmZpbmRfbXBjX2J5X2l0Zm51bShpbnQgaXRmKQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IGVhNDNkZmIuLmVkNzA1ZGQgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTE4NzQsNiArMTg3NCw3IEBACiBzdGF0aWMgaW50IGF4MjVfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCWF4MjVfY2IgKmF4MjUgPSB2OworCWNoYXIgYnVmWzExXTsKIAlpbnQgazsKIAogCkBAIC0xODg1LDEzICsxODg2LDEzIEBACiAJc2VxX3ByaW50ZihzZXEsICIlOC44bHggJXMgJXMlcyAiLAogCQkgICAobG9uZykgYXgyNSwKIAkJICAgYXgyNS0+YXgyNV9kZXYgPT0gTlVMTD8gIj8/PyIgOiBheDI1LT5heDI1X2Rldi0+ZGV2LT5uYW1lLAotCQkgICBheDJhc2MoJmF4MjUtPnNvdXJjZV9hZGRyKSwKKwkJICAgYXgyYXNjKGJ1ZiwgJmF4MjUtPnNvdXJjZV9hZGRyKSwKIAkJICAgYXgyNS0+aWFtZGlnaT8gIioiOiIiKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYXgyYXNjKCZheDI1LT5kZXN0X2FkZHIpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYXgyYXNjKGJ1ZiwgJmF4MjUtPmRlc3RfYWRkcikpOwogCiAJZm9yIChrPTA7IChheDI1LT5kaWdpcGVhdCAhPSBOVUxMKSAmJiAoayA8IGF4MjUtPmRpZ2lwZWF0LT5uZGlnaSk7IGsrKykgewogCQlzZXFfcHJpbnRmKHNlcSwgIiwlcyVzIiwKLQkJCSAgIGF4MmFzYygmYXgyNS0+ZGlnaXBlYXQtPmNhbGxzW2tdKSwKKwkJCSAgIGF4MmFzYyhidWYsICZheDI1LT5kaWdpcGVhdC0+Y2FsbHNba10pLAogCQkJICAgYXgyNS0+ZGlnaXBlYXQtPnJlcGVhdGVkW2tdPyAiKiI6IiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9hZGRyLmMgYi9uZXQvYXgyNS9heDI1X2FkZHIuYwppbmRleCBmNGZhNmRmLi4wMTY0YTE1IDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X2FkZHIuYworKysgYi9uZXQvYXgyNS9heDI1X2FkZHIuYwpAQCAtMzYsOSArMzYsOCBAQAogLyoKICAqCWF4MjUgLT4gYXNjaWkgY29udmVyc2lvbgogICovCi1jaGFyICpheDJhc2MoYXgyNV9hZGRyZXNzICphKQorY2hhciAqYXgyYXNjKGNoYXIgKmJ1ZiwgYXgyNV9hZGRyZXNzICphKQogewotCXN0YXRpYyBjaGFyIGJ1ZlsxMV07CiAJY2hhciBjLCAqczsKIAlpbnQgbjsKIApAQCAtNjgsMzcgKzY3LDM0IEBACiAvKgogICoJYXNjaWkgLT4gYXgyNSBjb252ZXJzaW9uCiAgKi8KLWF4MjVfYWRkcmVzcyAqYXNjMmF4KGNoYXIgKmNhbGxzaWduKQordm9pZCBhc2MyYXgoYXgyNV9hZGRyZXNzICphZGRyLCBjaGFyICpjYWxsc2lnbikKIHsKLQlzdGF0aWMgYXgyNV9hZGRyZXNzIGFkZHI7CiAJY2hhciAqczsKIAlpbnQgbjsKIAogCWZvciAocyA9IGNhbGxzaWduLCBuID0gMDsgbiA8IDY7IG4rKykgewogCQlpZiAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnLScpCi0JCQlhZGRyLmF4MjVfY2FsbFtuXSA9ICpzKys7CisJCQlhZGRyLT5heDI1X2NhbGxbbl0gPSAqcysrOwogCQllbHNlCi0JCQlhZGRyLmF4MjVfY2FsbFtuXSA9ICcgJzsKLQkJYWRkci5heDI1X2NhbGxbbl0gPDw9IDE7Ci0JCWFkZHIuYXgyNV9jYWxsW25dICY9IDB4RkU7CisJCQlhZGRyLT5heDI1X2NhbGxbbl0gPSAnICc7CisJCWFkZHItPmF4MjVfY2FsbFtuXSA8PD0gMTsKKwkJYWRkci0+YXgyNV9jYWxsW25dICY9IDB4RkU7CiAJfQogCiAJaWYgKCpzKysgPT0gJ1wwJykgewotCQlhZGRyLmF4MjVfY2FsbFs2XSA9IDB4MDA7Ci0JCXJldHVybiAmYWRkcjsKKwkJYWRkci0+YXgyNV9jYWxsWzZdID0gMHgwMDsKKwkJcmV0dXJuOwogCX0KIAotCWFkZHIuYXgyNV9jYWxsWzZdID0gKnMrKyAtICcwJzsKKwlhZGRyLT5heDI1X2NhbGxbNl0gPSAqcysrIC0gJzAnOwogCiAJaWYgKCpzICE9ICdcMCcpIHsKLQkJYWRkci5heDI1X2NhbGxbNl0gKj0gMTA7Ci0JCWFkZHIuYXgyNV9jYWxsWzZdICs9ICpzKysgLSAnMCc7CisJCWFkZHItPmF4MjVfY2FsbFs2XSAqPSAxMDsKKwkJYWRkci0+YXgyNV9jYWxsWzZdICs9ICpzKysgLSAnMCc7CiAJfQogCi0JYWRkci5heDI1X2NhbGxbNl0gPDw9IDE7Ci0JYWRkci5heDI1X2NhbGxbNl0gJj0gMHgxRTsKLQotCXJldHVybiAmYWRkcjsKKwlhZGRyLT5heDI1X2NhbGxbNl0gPDw9IDE7CisJYWRkci0+YXgyNV9jYWxsWzZdICY9IDB4MUU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X3JvdXRlLmMgYi9uZXQvYXgyNS9heDI1X3JvdXRlLmMKaW5kZXggYzI4ODUyNi4uMjZiNzdkOSAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCisrKyBiL25ldC9heDI1L2F4MjVfcm91dGUuYwpAQCAtMjk4LDYgKzI5OCw4IEBACiAKIHN0YXRpYyBpbnQgYXgyNV9ydF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwljaGFyIGJ1ZlsxMV07CisKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCXNlcV9wdXRzKHNlcSwgImNhbGxzaWduICBkZXYgIG1vZGUgZGlnaXBlYXRlcnNcbiIpOwogCWVsc2UgewpAQCAtMzA4LDcgKzMxMCw3IEBACiAJCWlmIChheDI1Y21wKCZheDI1X3J0LT5jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSA9PSAwKQogCQkJY2FsbHNpZ24gPSAiZGVmYXVsdCI7CiAJCWVsc2UKLQkJCWNhbGxzaWduID0gYXgyYXNjKCZheDI1X3J0LT5jYWxsc2lnbik7CisJCQljYWxsc2lnbiA9IGF4MmFzYyhidWYsICZheDI1X3J0LT5jYWxsc2lnbik7CiAKIAkJc2VxX3ByaW50ZihzZXEsICIlLTlzICUtNHMiLAogCQkJY2FsbHNpZ24sCkBAIC0zMjgsNyArMzMwLDggQEAKIAogCQlpZiAoYXgyNV9ydC0+ZGlnaXBlYXQgIT0gTlVMTCkKIAkJCWZvciAoaSA9IDA7IGkgPCBheDI1X3J0LT5kaWdpcGVhdC0+bmRpZ2k7IGkrKykKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIGF4MmFzYygmYXgyNV9ydC0+ZGlnaXBlYXQtPmNhbGxzW2ldKSk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLAorCQkJCSAgICAgYXgyYXNjKGJ1ZiwgJmF4MjVfcnQtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOwogCiAJCXNlcV9wdXRzKHNlcSwgIlxuIik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV91aWQuYyBiL25ldC9heDI1L2F4MjVfdWlkLmMKaW5kZXggYThiMzgyMi4uZDUzY2M4NiAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV91aWQuYworKysgYi9uZXQvYXgyNS9heDI1X3VpZC5jCkBAIC0xNjgsMTIgKzE2OCwxNCBAQAogCiBzdGF0aWMgaW50IGF4MjVfdWlkX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKKwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKIAkJc2VxX3ByaW50ZihzZXEsICJQb2xpY3k6ICVkXG4iLCBheDI1X3VpZF9wb2xpY3kpOwogCWVsc2UgewogCQlzdHJ1Y3QgYXgyNV91aWRfYXNzb2MgKnB0ID0gdjsKIAotCQlzZXFfcHJpbnRmKHNlcSwgIiU2ZCAlc1xuIiwgcHQtPnVpZCwgYXgyYXNjKCZwdC0+Y2FsbCkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU2ZCAlc1xuIiwgcHQtPnVpZCwgYXgyYXNjKGJ1ZiwgJnB0LT5jYWxsKSk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvbXBhdC5jIGIvbmV0L2NvbXBhdC5jCmluZGV4IGQ5OWFiOTYuLmU1OTNkYWMgMTAwNjQ0Ci0tLSBhL25ldC9jb21wYXQuYworKysgYi9uZXQvY29tcGF0LmMKQEAgLTEzNSwxMyArMTM1LDE0IEBACiAgKiB0aHVzIHBsYWNlbWVudCkgb2YgY21zZyBoZWFkZXJzIGFuZCBsZW5ndGggYXJlIGRpZmZlcmVudCBmb3IKICAqIDMyLWJpdCBhcHBzLiAgLURhdmVNCiAgKi8KLWludCBjbXNnaGRyX2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybihzdHJ1Y3QgbXNnaGRyICprbXNnLAoraW50IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKHN0cnVjdCBtc2doZHIgKmttc2csIHN0cnVjdCBzb2NrICpzaywKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzdGFja2J1ZiwgaW50IHN0YWNrYnVmX3NpemUpCiB7CiAJc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqdWNtc2c7CiAJc3RydWN0IGNtc2doZHIgKmtjbXNnLCAqa2Ntc2dfYmFzZTsKIAljb21wYXRfc2l6ZV90IHVjbWxlbjsKIAlfX2tlcm5lbF9zaXplX3Qga2NtbGVuLCB0bXA7CisJaW50IGVyciA9IC1FRkFVTFQ7CiAKIAlrY21sZW4gPSAwOwogCWtjbXNnX2Jhc2UgPSBrY21zZyA9IChzdHJ1Y3QgY21zZ2hkciAqKXN0YWNrYnVmOwpAQCAtMTU2LDYgKzE1Nyw3IEBACiAKIAkJdG1wID0gKCh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpICsKIAkJICAgICAgIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpOworCQl0bXAgPSBDTVNHX0FMSUdOKHRtcCk7CiAJCWtjbWxlbiArPSB0bXA7CiAJCXVjbXNnID0gY21zZ19jb21wYXRfbnh0aGRyKGttc2csIHVjbXNnLCB1Y21sZW4pOwogCX0KQEAgLTE2NywzMCArMTY5LDM0IEBACiAJICogdW50aWwgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgY29waWVkIG92ZXIgYWxsIG9mIHRoZSBkYXRhCiAJICogZnJvbSB0aGUgdXNlci4KIAkgKi8KLQlpZihrY21sZW4gPiBzdGFja2J1Zl9zaXplKQotCQlrY21zZ19iYXNlID0ga2Ntc2cgPSBrbWFsbG9jKGtjbWxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYoa2Ntc2cgPT0gTlVMTCkKKwlpZiAoa2NtbGVuID4gc3RhY2tidWZfc2l6ZSkKKwkJa2Ntc2dfYmFzZSA9IGtjbXNnID0gc29ja19rbWFsbG9jKHNrLCBrY21sZW4sIEdGUF9LRVJORUwpOworCWlmIChrY21zZyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAkvKiBOb3cgY29weSB0aGVtIG92ZXIgbmVhdGx5LiAqLwogCW1lbXNldChrY21zZywgMCwga2NtbGVuKTsKIAl1Y21zZyA9IENNU0dfQ09NUEFUX0ZJUlNUSERSKGttc2cpOwogCXdoaWxlKHVjbXNnICE9IE5VTEwpIHsKLQkJX19nZXRfdXNlcih1Y21sZW4sICZ1Y21zZy0+Y21zZ19sZW4pOworCQlpZiAoX19nZXRfdXNlcih1Y21sZW4sICZ1Y21zZy0+Y21zZ19sZW4pKQorCQkJZ290byBFZmF1bHQ7CisJCWlmICghQ01TR19DT01QQVRfT0sodWNtbGVuLCB1Y21zZywga21zZykpCisJCQlnb3RvIEVpbnZhbDsKIAkJdG1wID0gKCh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpICsKIAkJICAgICAgIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpOworCQlpZiAoKGNoYXIgKilrY21zZ19iYXNlICsga2NtbGVuIC0gKGNoYXIgKilrY21zZyA8IENNU0dfQUxJR04odG1wKSkKKwkJCWdvdG8gRWludmFsOwogCQlrY21zZy0+Y21zZ19sZW4gPSB0bXA7Ci0JCV9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfbGV2ZWwsICZ1Y21zZy0+Y21zZ19sZXZlbCk7Ci0JCV9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfdHlwZSwgJnVjbXNnLT5jbXNnX3R5cGUpOwotCi0JCS8qIENvcHkgb3ZlciB0aGUgZGF0YS4gKi8KLQkJaWYoY29weV9mcm9tX3VzZXIoQ01TR19EQVRBKGtjbXNnKSwKLQkJCQkgIENNU0dfQ09NUEFUX0RBVEEodWNtc2cpLAotCQkJCSAgKHVjbWxlbiAtIENNU0dfQ09NUEFUX0FMSUdOKHNpemVvZigqdWNtc2cpKSkpKQotCQkJZ290byBvdXRfZnJlZV9lZmF1bHQ7CisJCXRtcCA9IENNU0dfQUxJR04odG1wKTsKKwkJaWYgKF9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfbGV2ZWwsICZ1Y21zZy0+Y21zZ19sZXZlbCkgfHwKKwkJICAgIF9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfdHlwZSwgJnVjbXNnLT5jbXNnX3R5cGUpIHx8CisJCSAgICBjb3B5X2Zyb21fdXNlcihDTVNHX0RBVEEoa2Ntc2cpLAorCQkJCSAgIENNU0dfQ09NUEFUX0RBVEEodWNtc2cpLAorCQkJCSAgICh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpKSkKKwkJCWdvdG8gRWZhdWx0OwogCiAJCS8qIEFkdmFuY2UuICovCi0JCWtjbXNnID0gKHN0cnVjdCBjbXNnaGRyICopKChjaGFyICopa2Ntc2cgKyBDTVNHX0FMSUdOKHRtcCkpOworCQlrY21zZyA9IChzdHJ1Y3QgY21zZ2hkciAqKSgoY2hhciAqKWtjbXNnICsgdG1wKTsKIAkJdWNtc2cgPSBjbXNnX2NvbXBhdF9ueHRoZHIoa21zZywgdWNtc2csIHVjbWxlbik7CiAJfQogCkBAIC0xOTksMTAgKzIwNSwxMiBAQAogCWttc2ctPm1zZ19jb250cm9sbGVuID0ga2NtbGVuOwogCXJldHVybiAwOwogCi1vdXRfZnJlZV9lZmF1bHQ6Ci0JaWYoa2Ntc2dfYmFzZSAhPSAoc3RydWN0IGNtc2doZHIgKilzdGFja2J1ZikKLQkJa2ZyZWUoa2Ntc2dfYmFzZSk7Ci0JcmV0dXJuIC1FRkFVTFQ7CitFaW52YWw6CisJZXJyID0gLUVJTlZBTDsKK0VmYXVsdDoKKwlpZiAoa2Ntc2dfYmFzZSAhPSAoc3RydWN0IGNtc2doZHIgKilzdGFja2J1ZikKKwkJc29ja19rZnJlZV9zKHNrLCBrY21zZ19iYXNlLCBrY21sZW4pOworCXJldHVybiBlcnI7CiB9CiAKIGludCBwdXRfY21zZ19jb21wYXQoc3RydWN0IG1zZ2hkciAqa21zZywgaW50IGxldmVsLCBpbnQgdHlwZSwgaW50IGxlbiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKaW5kZXggMzM0NzkwZC4uNDcwYzA1YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHN0LmMKKysrIGIvbmV0L2NvcmUvZHN0LmMKQEAgLTM5LDggKzM5LDcgQEAKIHN0YXRpYyB2b2lkIGRzdF9ydW5fZ2ModW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgdm9pZCBfX19kc3RfZnJlZShzdHJ1Y3QgZHN0X2VudHJ5ICogZHN0KTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRzdF9nY190aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIoZHN0X3J1bl9nYywgRFNUX0dDX01JTiwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGRzdF9nY190aW1lciwgZHN0X3J1bl9nYywgRFNUX0dDX01JTiwgMCk7CiAKIHN0YXRpYyB2b2lkIGRzdF9ydW5fZ2ModW5zaWduZWQgbG9uZyBkdW1teSkKIHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCBhMWE5YTdhLi41MjY1ZGZkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC02NDUsMTAgKzY0NSwxMCBAQAogCiAJCW5waW5mby0+cnhfZmxhZ3MgPSAwOwogCQlucGluZm8tPnJ4X25wID0gTlVMTDsKLQkJbnBpbmZvLT5wb2xsX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisJCXNwaW5fbG9ja19pbml0KCZucGluZm8tPnBvbGxfbG9jayk7CiAJCW5waW5mby0+cG9sbF9vd25lciA9IC0xOwogCQlucGluZm8tPnRyaWVzID0gTUFYX1JFVFJJRVM7Ci0JCW5waW5mby0+cnhfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwkJc3Bpbl9sb2NrX2luaXQoJm5waW5mby0+cnhfbG9jayk7CiAJfSBlbHNlCiAJCW5waW5mbyA9IG5kZXYtPm5waW5mbzsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcGt0Z2VuLmMgYi9uZXQvY29yZS9wa3RnZW4uYwppbmRleCA4ZWIwODNiLi5iM2FkNDlmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9wa3RnZW4uYworKysgYi9uZXQvY29yZS9wa3RnZW4uYwpAQCAtNTAzLDcgKzUwMyw3IEBACiBzdGF0aWMgaW50IHBnX2Nsb25lX3NrYl9kID0gMDsKIHN0YXRpYyBpbnQgZGVidWcgPSAwOwogCi1zdGF0aWMgc3BpbmxvY2tfdCBfdGhyZWFkX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKF90aHJlYWRfbG9jayk7CiBzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQgKnBrdGdlbl90aHJlYWRzID0gTlVMTDsKIAogc3RhdGljIGNoYXIgbW9kdWxlX2ZuYW1lWzEyOF07CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggYzEzNTk0NTcuLmFjNjNiNTYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTM0MSwxMSArMzQxLDExIEBACiAJCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7CiAJCQllbHNlIHsKICNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKLQkJCQlpZiAobGluZy5sX2xpbmdlciA+PSBNQVhfU0NIRURVTEVfVElNRU9VVC9IWikKKwkJCQlpZiAoKHVuc2lnbmVkIGludClsaW5nLmxfbGluZ2VyID49IE1BWF9TQ0hFRFVMRV9USU1FT1VUL0haKQogCQkJCQlzay0+c2tfbGluZ2VydGltZSA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCQkJCWVsc2UKICNlbmRpZgotCQkJCQlzay0+c2tfbGluZ2VydGltZSA9IGxpbmcubF9saW5nZXIgKiBIWjsKKwkJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSAodW5zaWduZWQgaW50KWxpbmcubF9saW5nZXIgKiBIWjsKIAkJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE1MjksNiArMTUyOSw4IEBACiB2b2lkIHByb3RvX3VucmVnaXN0ZXIoc3RydWN0IHByb3RvICpwcm90KQogewogCXdyaXRlX2xvY2soJnByb3RvX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJnByb3QtPm5vZGUpOworCXdyaXRlX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKIAogCWlmIChwcm90LT5zbGFiICE9IE5VTEwpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KHByb3QtPnNsYWIpOwpAQCAtMTU1MCw5ICsxNTUyLDYgQEAKIAkJa2ZyZWUobmFtZSk7CiAJCXByb3QtPnR3c2tfc2xhYiA9IE5VTEw7CiAJfQotCi0JbGlzdF9kZWwoJnByb3QtPm5vZGUpOwotCXdyaXRlX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKIH0KIAogRVhQT1JUX1NZTUJPTChwcm90b191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3dpcmVsZXNzLmMgYi9uZXQvY29yZS93aXJlbGVzcy5jCmluZGV4IDVjYWFlMjMuLmQxN2YxNTggMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3dpcmVsZXNzLmMKKysrIGIvbmV0L2NvcmUvd2lyZWxlc3MuYwpAQCAtNTgsNiArNTgsMTMgQEAKICAqCW8gQWRkIHdtYigpIGluIGl3X2hhbmRsZXJfc2V0X3NweSgpIGZvciBub24tY29oZXJlbnQgYXJjaHMvY3B1cwogICogQmFzZWQgb24gcGF0Y2ggZnJvbSBQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiA6CiAgKglvIEZpeCBrZXJuZWwgZGF0YSBsZWFrIHRvIHVzZXIgc3BhY2UgaW4gcHJpdmF0ZSBoYW5kbGVyIGhhbmRsaW5nCisgKgorICogdjcgLSAxOC4zLjA1IC0gSmVhbiBJSQorICoJbyBSZW1vdmUgKHN0cnVjdCBpd19wb2ludCAqKS0+cG9pbnRlciBmcm9tIGV2ZW50cyBhbmQgc3RyZWFtcworICoJbyBSZW1vdmUgc3B5X29mZnNldCBmcm9tIHN0cnVjdCBpd19oYW5kbGVyX2RlZgorICoJbyBTdGFydCBkZXByZWNhdGluZyBkZXYtPmdldF93aXJlbGVzc19zdGF0cywgb3V0cHV0IGEgd2FybmluZworICoJbyBJZiBJV19RVUFMX0RCTSBpcyBzZXQsIHNob3cgZEJtIHZhbHVlcyBpbiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCW8gRG9uJ3QgbG9vc2UgSU5WQUxJRC9EQk0gZmxhZ3Mgd2hlbiBjbGVhcmluZyBVUERBVEVEIGZsYWdzIChpd3N0YXRzKQogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ0NiwxMCArNDUzLDE0IEBACiAJICAgKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cyAhPSBOVUxMKSkKIAkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cyhkZXYpOwogCi0JLyogT2xkIGxvY2F0aW9uLCB3aWxsIGJlIHBoYXNlZCBvdXQgaW4gbmV4dCBXRSAqLwotCXJldHVybiAoZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPwotCQlkZXYtPmdldF93aXJlbGVzc19zdGF0cyhkZXYpIDoKLQkJKHN0cnVjdCBpd19zdGF0aXN0aWNzICopIE5VTEwpOworCS8qIE9sZCBsb2NhdGlvbiwgZmllbGQgdG8gYmUgcmVtb3ZlZCBpbiBuZXh0IFdFICovCisJaWYoZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBEcml2ZXIgdXNpbmcgb2xkIC9wcm9jL25ldC93aXJlbGVzcyBzdXBwb3J0LCBwbGVhc2UgZml4IGRyaXZlciAhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CisJfQorCS8qIE5vdCBmb3VuZCAqLworCXJldHVybiAoc3RydWN0IGl3X3N0YXRpc3RpY3MgKikgTlVMTDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTQxLDE2ICs1NTIsMTggQEAKIAkJCSAgIGRldi0+bmFtZSwgc3RhdHMtPnN0YXR1cywgc3RhdHMtPnF1YWwucXVhbCwKIAkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX1FVQUxfVVBEQVRFRAogCQkJICAgPyAnLicgOiAnICcsCi0JCQkgICAoKF9fdTgpIHN0YXRzLT5xdWFsLmxldmVsKSwKKwkJCSAgICgoX19zMzIpIHN0YXRzLT5xdWFsLmxldmVsKSAtIAorCQkJICAgKChzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9EQk0pID8gMHgxMDAgOiAwKSwKIAkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0xFVkVMX1VQREFURUQKIAkJCSAgID8gJy4nIDogJyAnLAotCQkJICAgKChfX3U4KSBzdGF0cy0+cXVhbC5ub2lzZSksCisJCQkgICAoKF9fczMyKSBzdGF0cy0+cXVhbC5ub2lzZSkgLSAKKwkJCSAgICgoc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfREJNKSA/IDB4MTAwIDogMCksCiAJCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9OT0lTRV9VUERBVEVECiAJCQkgICA/ICcuJyA6ICcgJywKIAkJCSAgIHN0YXRzLT5kaXNjYXJkLm53aWQsIHN0YXRzLT5kaXNjYXJkLmNvZGUsCiAJCQkgICBzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCwgc3RhdHMtPmRpc2NhcmQucmV0cmllcywKIAkJCSAgIHN0YXRzLT5kaXNjYXJkLm1pc2MsIHN0YXRzLT5taXNzLmJlYWNvbik7Ci0JCXN0YXRzLT5xdWFsLnVwZGF0ZWQgPSAwOworCQlzdGF0cy0+cXVhbC51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOwogCX0KIH0KIApAQCAtNTkzLDYgKzYwNiw3IEBACiAKIGludCBfX2luaXQgd2lyZWxlc3NfcHJvY19pbml0KHZvaWQpCiB7CisJLyogQ3JlYXRlIC9wcm9jL25ldC93aXJlbGVzcyBlbnRyeSAqLwogCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoIndpcmVsZXNzIiwgU19JUlVHTywgJndpcmVsZXNzX3NlcV9mb3BzKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTYyNyw5ICs2NDEsOSBAQAogCQkJCXNpemVvZihzdHJ1Y3QgaXdfc3RhdGlzdGljcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjbGVhciB0aGUgdXBkYXRlIGZsYWcgKi8KKwkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjbGVhciB0aGUgdXBkYXRlZCBmbGFnICovCiAJCWlmKHdycS0+dS5kYXRhLmZsYWdzICE9IDApCi0JCQlzdGF0cy0+cXVhbC51cGRhdGVkID0gMDsKKwkJCXN0YXRzLT5xdWFsLnVwZGF0ZWQgJj0gfklXX1FVQUxfQUxMX1VQREFURUQ7CiAJCXJldHVybiAwOwogCX0gZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0xMTYxLDEwICsxMTc1LDExIEBACiAJc3RydWN0IGl3X2V2ZW50ICAqZXZlbnQ7CQkvKiBNYWxsb2NhdGVkIHdob2xlIGV2ZW50ICovCiAJaW50IGV2ZW50X2xlbjsJCQkJLyogSXRzIHNpemUgKi8KIAlpbnQgaGRyX2xlbjsJCQkJLyogU2l6ZSBvZiB0aGUgZXZlbnQgaGVhZGVyICovCisJaW50IHdycXVfb2ZmID0gMDsJCQkvKiBPZmZzZXQgaW4gd3JxdSAqLwogCS8qIERvbid0ICJvcHRpbWlzZSIgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSwgaXQgd2lsbCBjcmFzaCAqLwogCXVuc2lnbmVkCWNtZF9pbmRleDsJCS8qICpNVVNUKiBiZSB1bnNpZ25lZCAqLwogCi0JLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU9DVEwgKi8KKwkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBFdmVudCAqLwogCWlmKGNtZCA8PSBTSU9DSVdMQVNUKSB7CiAJCWNtZF9pbmRleCA9IGNtZCAtIFNJT0NJV0ZJUlNUOwogCQlpZihjbWRfaW5kZXggPCBzdGFuZGFyZF9pb2N0bF9udW0pCkBAIC0xMjA3LDYgKzEyMjIsOCBAQAogCQkvKiBDYWxjdWxhdGUgZXh0cmFfbGVuIC0gZXh0cmEgaXMgTlVMTCBmb3IgcmVzdHJpY3RlZCBldmVudHMgKi8KIAkJaWYoZXh0cmEgIT0gTlVMTCkKIAkJCWV4dHJhX2xlbiA9IHdycXUtPmRhdGEubGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemU7CisJCS8qIEFsd2F5cyBhdCBhbiBvZmZzZXQgaW4gd3JxdSAqLworCQl3cnF1X29mZiA9IElXX0VWX1BPSU5UX09GRjsKICNpZmRlZiBXRV9FVkVOVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEV2ZW50IDB4JTA0WCwgdG9rZW5zICVkLCBleHRyYV9sZW4gJWRcbiIsIGRldi0+bmFtZSwgY21kLCB3cnF1LT5kYXRhLmxlbmd0aCwgZXh0cmFfbGVuKTsKICNlbmRpZgkvKiBXRV9FVkVOVF9ERUJVRyAqLwpAQCAtMTIxNyw3ICsxMjM0LDcgQEAKIAlldmVudF9sZW4gPSBoZHJfbGVuICsgZXh0cmFfbGVuOwogCiAjaWZkZWYgV0VfRVZFTlRfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEV2ZW50IDB4JTA0WCwgaGRyX2xlbiAlZCwgZXZlbnRfbGVuICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgaGRyX2xlbiwgZXZlbnRfbGVuKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEV2ZW50IDB4JTA0WCwgaGRyX2xlbiAlZCwgd3JxdV9vZmYgJWQsIGV2ZW50X2xlbiAlZFxuIiwgZGV2LT5uYW1lLCBjbWQsIGhkcl9sZW4sIHdycXVfb2ZmLCBldmVudF9sZW4pOwogI2VuZGlmCS8qIFdFX0VWRU5UX0RFQlVHICovCiAKIAkvKiBDcmVhdGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBldmVudCAqLwpAQCAtMTIyOCw3ICsxMjQ1LDcgQEAKIAkvKiBGaWxsIGV2ZW50ICovCiAJZXZlbnQtPmxlbiA9IGV2ZW50X2xlbjsKIAlldmVudC0+Y21kID0gY21kOwotCW1lbWNweSgmZXZlbnQtPnUsIHdycXUsIGhkcl9sZW4gLSBJV19FVl9MQ1BfTEVOKTsKKwltZW1jcHkoJmV2ZW50LT51LCAoKGNoYXIgKikgd3JxdSkgKyB3cnF1X29mZiwgaGRyX2xlbiAtIElXX0VWX0xDUF9MRU4pOwogCWlmKGV4dHJhICE9IE5VTEwpCiAJCW1lbWNweSgoKGNoYXIgKikgZXZlbnQpICsgaGRyX2xlbiwgZXh0cmEsIGV4dHJhX2xlbik7CiAKQEAgLTEyNDksNyArMTI2Niw3IEBACiAgKiBOb3csIHRoZSBkcml2ZXIgY2FuIGRlbGVnYXRlIHRoaXMgdGFzayB0byBXaXJlbGVzcyBFeHRlbnNpb25zLgogICogSXQgbmVlZHMgdG8gdXNlIHRob3NlIHN0YW5kYXJkIHNweSBpd19oYW5kbGVyIGluIHN0cnVjdCBpd19oYW5kbGVyX2RlZiwKICAqIHB1c2ggZGF0YSB0byB1cyB2aWEgd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpIGFuZCBpbmNsdWRlIHN0cnVjdCBpd19zcHlfZGF0YQotICogaW4gaXRzIHByaXZhdGUgcGFydCAoYW5kIGFkdmVydGlzZSBpdCBpbiBpd19oYW5kbGVyX2RlZi0+c3B5X29mZnNldCkuCisgKiBpbiBpdHMgcHJpdmF0ZSBwYXJ0IChhbmQgZXhwb3J0IGl0IGluIG5ldF9kZXZpY2UtPndpcmVsZXNzX2RhdGEtPnNweV9kYXRhKS4KICAqIE9uZSBvZiB0aGUgbWFpbiBhZHZhbnRhZ2Ugb2YgY2VudHJhbGlzaW5nIHNweSBzdXBwb3J0IGhlcmUgaXMgdGhhdAogICogaXQgYmVjb21lcyBtdWNoIGVhc2llciB0byBpbXByb3ZlIGFuZCBleHRlbmQgaXQgd2l0aG91dCBoYXZpbmcgdG8gdG91Y2gKICAqIHRoZSBkcml2ZXJzLiBPbmUgZXhhbXBsZSBpcyB0aGUgYWRkaXRpb24gb2YgdGhlIFNweS1UaHJlc2hvbGQgZXZlbnRzLgpAQCAtMTI2NiwxMCArMTI4Myw3IEBACiAJLyogVGhpcyBpcyB0aGUgbmV3IHdheSAqLwogCWlmKGRldi0+d2lyZWxlc3NfZGF0YSkKIAkJcmV0dXJuKGRldi0+d2lyZWxlc3NfZGF0YS0+c3B5X2RhdGEpOwotCi0JLyogVGhpcyBpcyB0aGUgb2xkIHdheS4gRG9lc24ndCB3b3JrIGZvciBtdWx0aS1oZWFkZWQgZHJpdmVycy4KLQkgKiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbiBvZiBXRS4gKi8KLQlyZXR1cm4gKGRldi0+cHJpdiArIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnNweV9vZmZzZXQpOworCXJldHVybiBOVUxMOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xMjg0LDEwICsxMjk4LDYgQEAKIAlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKglhZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAotCWlmKCFkZXYtPndpcmVsZXNzX2RhdGEpCi0JCS8qIEhlbHAgdXNlciBrbm93IHRoYXQgZHJpdmVyIG5lZWRzIHVwZGF0aW5nICovCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRHJpdmVyIHVzaW5nIG9sZC9idWdneSBzcHkgc3VwcG9ydCwgcGxlYXNlIGZpeCBkcml2ZXIgIVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CiAJLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KIAlpZighc3B5ZGF0YSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTMxOCw3ICsxMzI4LDcgQEAKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKIAogI2lmZGVmIFdFX1NQWV9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiaXdfaGFuZGxlcl9zZXRfc3B5KCkgOiAgb2Zmc2V0ICVsZCwgc3B5ZGF0YSAlcCwgbnVtICVkXG4iLCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zcHlfb2Zmc2V0LCBzcHlkYXRhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJpd19oYW5kbGVyX3NldF9zcHkoKSA6ICB3aXJlbGVzc19kYXRhICVwLCBzcHlkYXRhICVwLCBudW0gJWRcbiIsIGRldi0+d2lyZWxlc3NfZGF0YSwgc3B5ZGF0YSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwogCQlmb3IgKGkgPSAwOyBpIDwgd3JxdS0+ZGF0YS5sZW5ndGg7IGkrKykKIAkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkgICAgICAgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIFxuIiwKQEAgLTEzNzEsNyArMTM4MSw3IEBACiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogc3B5ZGF0YS0+c3B5X251bWJlcik7CiAJLyogUmVzZXQgdXBkYXRlZCBmbGFncy4gKi8KIAlmb3IoaSA9IDA7IGkgPCBzcHlkYXRhLT5zcHlfbnVtYmVyOyBpKyspCi0JCXNweWRhdGEtPnNweV9zdGF0W2ldLnVwZGF0ZWQgPSAwOworCQlzcHlkYXRhLT5zcHlfc3RhdFtpXS51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOwogCXJldHVybiAwOwogfQogCkBAIC0xNDg2LDcgKzE0OTYsNyBAQAogCQlyZXR1cm47CiAKICNpZmRlZiBXRV9TUFlfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAid2lyZWxlc3Nfc3B5X3VwZGF0ZSgpIDogIG9mZnNldCAlbGQsIHNweWRhdGEgJXAsIGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnNweV9vZmZzZXQsIHNweWRhdGEsIGFkZHJlc3NbMF0sIGFkZHJlc3NbMV0sIGFkZHJlc3NbMl0sIGFkZHJlc3NbM10sIGFkZHJlc3NbNF0sIGFkZHJlc3NbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICJ3aXJlbGVzc19zcHlfdXBkYXRlKCkgOiAgd2lyZWxlc3NfZGF0YSAlcCwgc3B5ZGF0YSAlcCwgYWRkcmVzcyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwgZGV2LT53aXJlbGVzc19kYXRhLCBzcHlkYXRhLCBhZGRyZXNzWzBdLCBhZGRyZXNzWzFdLCBhZGRyZXNzWzJdLCBhZGRyZXNzWzNdLCBhZGRyZXNzWzRdLCBhZGRyZXNzWzVdKTsKICNlbmRpZgkvKiBXRV9TUFlfREVCVUcgKi8KIAogCS8qIFVwZGF0ZSBhbGwgcmVjb3JkcyB0aGF0IG1hdGNoICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwppbmRleCA3YmYzYjNhLi5lMDVmNGY5IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKQEAgLTQzLDEyICs0MywyMiBAQAogI2luY2x1ZGUgImNjaWQzLmgiCiAKIC8qCi0gKiBSZWFzb24gZm9yIG1hdGhzIHdpdGggMTAgaGVyZSBpcyB0byBhdm9pZCAzMiBiaXQgb3ZlcmZsb3cgd2hlbiBhIGlzIGJpZy4KKyAqIFJlYXNvbiBmb3IgbWF0aHMgaGVyZSBpcyB0byBhdm9pZCAzMiBiaXQgb3ZlcmZsb3cgd2hlbiBhIGlzIGJpZy4KKyAqIFdpdGggdGhpcyB3ZSBnZXQgY2xvc2UgdG8gdGhlIGxpbWl0LgogICovCiBzdGF0aWMgaW5saW5lIHUzMiB1c2Vjc19kaXYoY29uc3QgdTMyIGEsIGNvbnN0IHUzMiBiKQogewotCWNvbnN0IHUzMiB0bXAgPSBhICogKFVTRUNfUEVSX1NFQyAvIDEwKTsKLQlyZXR1cm4gYiA+IDIwID8gdG1wIC8gKGIgLyAxMCkgOiB0bXA7CisJY29uc3QgdTMyIGRpdiA9IGEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gICAgMTApKSA/ICAgIDEwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gICAgNTApKSA/ICAgIDUwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gICAxMDApKSA/ICAgMTAwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gICA1MDApKSA/ICAgNTAwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gIDEwMDApKSA/ICAxMDAwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gIDUwMDApKSA/ICA1MDAwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gMTAwMDApKSA/IDEwMDAwIDoKKwkJCWEgPCAoVUlOVF9NQVggLyAoVVNFQ19QRVJfU0VDIC8gNTAwMDApKSA/IDUwMDAwIDoKKwkJCQkJCQkJIDEwMDAwMDsKKwljb25zdCB1MzIgdG1wID0gYSAqIChVU0VDX1BFUl9TRUMgLyBkaXYpOworCXJldHVybiAoYiA+PSAyICogZGl2KSA/IHRtcCAvIChiIC8gZGl2KSA6IHRtcDsKIH0KIAogc3RhdGljIGludCBjY2lkM19kZWJ1ZzsKQEAgLTY4LDEzICs3OCwxMSBAQAogCiBzdGF0aWMgaW50IGNjaWQzX2luaXQoc3RydWN0IHNvY2sgKnNrKQogewotCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXBcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfZXhpdChzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcFxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwogfQogCiAvKiBURlJDIHNlbmRlciBzdGF0ZXMgKi8KQEAgLTEwMiw4ICsxMTAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX2hjX3R4X3NldF9zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBlbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyBzdGF0ZSkKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAllbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyBvbGRzdGF0ZSA9IGhjdHgtPmNjaWQzaGN0eF9zdGF0ZTsKIAogCWNjaWQzX3ByX2RlYnVnKCIlcyglcCkgJS04LjhzIC0+ICVzXG4iLApAQCAtMTQ0LDggKzE1MSw3IEBACiAgKi8gCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF91cGRhdGVfeChzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAKIAkvKiBUbyBhdm9pZCBsYXJnZSBlcnJvciBpbiBjYWxjWCAqLwogCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA+PSBURlJDX1NNQUxMRVNUX1ApIHsKQEAgLTE1OSw3ICsxNjUsNyBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAotCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKIAkgICAgICAgCWlmICh0aW1ldmFsX2RlbHRhKCZub3csICZoY3R4LT5jY2lkM2hjdHhfdF9sZCkgPj0KIAkJICAgIGhjdHgtPmNjaWQzaGN0eF9ydHQpIHsKIAkJCWhjdHgtPmNjaWQzaGN0eF94ID0gbWF4X3QodTMyLCBtaW5fdCh1MzIsIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YsCkBAIC0xNzQsOSArMTgwLDggQEAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X25vX2ZlZWRiYWNrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilkYXRhOwotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3Rtb3V0ID0gMDsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAKIAliaF9sb2NrX3NvY2soc2spOwogCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CkBAIC0yNzQsMjAgKzI3OSwyMCBAQAogCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAJc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqbmV3X3BhY2tldDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJbG9uZyBkZWxheTsKIAlpbnQgcmMgPSAtRU5PVENPTk47CiAKLQkvKiBDaGVjayBpZiBwdXJlIEFDSyBvciBUZXJtaW5hdGluZyovCisJQlVHX09OKGhjdHggPT0gTlVMTCB8fCBoY3R4LT5jY2lkM2hjdHhfc3RhdGUgPT0gVEZSQ19TU1RBVEVfVEVSTSk7CiAKKwkvKiBDaGVjayBpZiBwdXJlIEFDSyBvciBUZXJtaW5hdGluZyovCiAJLyoKIAkgKiBYWFg6IFdlIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBEQVRBIGFuZCBEQVRBQUNLLCBvbiwgdGhlc2UKIAkgKiBwYWNrZXRzIGNhbiBoYXZlIHplcm8gbGVuZ3RoLCBidXQgd2h5IHRoZSBjb21tZW50IGFib3V0ICJwdXJlIEFDSyI/CiAJICovCi0JaWYgKGhjdHggPT0gTlVMTCB8fCBsZW4gPT0gMCB8fAotCSAgICBoY3R4LT5jY2lkM2hjdHhfc3RhdGUgPT0gVEZSQ19TU1RBVEVfVEVSTSkKKwlpZiAodW5saWtlbHkobGVuID09IDApKQogCQlnb3RvIG91dDsKIAogCS8qIFNlZSBpZiBsYXN0IHBhY2tldCBhbGxvY2F0ZWQgd2FzIG5vdCBzZW50ICovCkBAIC0yOTcsMjMgKzMwMiwyMCBAQAogCQkJCQkJICAgIFNMQUJfQVRPTUlDKTsKIAogCQlyYyA9IC1FTk9CVUZTOwotCQlpZiAobmV3X3BhY2tldCA9PSBOVUxMKSB7Ci0JCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBub3QgZW5vdWdoIG1lbSB0byBhZGQgIgotCQkJCSAgICAgICAidG8gaGlzdG9yeSwgc2VuZCByZWZ1c2VkXG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzayk7CisJCWlmICh1bmxpa2VseShuZXdfcGFja2V0ID09IE5VTEwpKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIG5vdCBlbm91Z2ggIgorCQkJCSAgICAgICAibWVtIHRvIGFkZCB0byBoaXN0b3J5LCBzZW5kIHJlZnVzZWRcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQlkY2NwX3R4X2hpc3RfYWRkX2VudHJ5KCZoY3R4LT5jY2lkM2hjdHhfaGlzdCwgbmV3X3BhY2tldCk7CiAJfQogCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKIAogCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7CiAJY2FzZSBURlJDX1NTVEFURV9OT19TRU5UOgotCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBmaXJzdCBwYWNrZXQoJWxsdSlcbiIsCi0JCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2ssIGRwLT5kY2Nwc19nc3MpOwotCiAJCWhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lci5mdW5jdGlvbiA9IGNjaWQzX2hjX3R4X25vX2ZlZWRiYWNrX3RpbWVyOwogCQloY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKIAkJc2tfcmVzZXRfdGltZXIoc2ssICZoY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIsCkBAIC0zMjEsNyArMzIzLDcgQEAKIAkJaGN0eC0+Y2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50CSA9IDA7CiAJCWhjdHgtPmNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50ID0gbm93OwogCQljY2lkM19oY190eF9zZXRfc3RhdGUoc2ssIFRGUkNfU1NUQVRFX05PX0ZCQUNLKTsKLQkJaGN0eC0+Y2NpZDNoY3R4X3RfaXBpID0gVEZSQ19JTklUSUFMX1RJTUVPVVQ7CisJCWhjdHgtPmNjaWQzaGN0eF90X2lwaSA9IFRGUkNfSU5JVElBTF9JUEk7CiAKIAkJLyogU2V0IG5vbWluYWwgc2VuZCB0aW1lIGZvciBpbml0aWFsIHBhY2tldCAqLwogCQloY3R4LT5jY2lkM2hjdHhfdF9ub20gPSBub3c7CkBAIC0zMzQsNyArMzM2LDYgQEAKIAljYXNlIFRGUkNfU1NUQVRFX0ZCQUNLOgogCQlkZWxheSA9ICh0aW1ldmFsX2RlbHRhKCZub3csICZoY3R4LT5jY2lkM2hjdHhfdF9ub20pIC0KIAkJICAgICAgICAgaGN0eC0+Y2NpZDNoY3R4X2RlbHRhKTsKLQkJY2NpZDNfcHJfZGVidWcoInNlbmRfcGFja2V0IGRlbGF5PSVsZFxuIiwgZGVsYXkpOwogCQlkZWxheSAvPSAtMTAwMDsKIAkJLyogZGl2aWRlIGJ5IC0xMDAwIGlzIHRvIGNvbnZlcnQgdG8gbXMgYW5kIGdldCBzaWduIHJpZ2h0ICovCiAJCXJjID0gZGVsYXkgPiAwID8gZGVsYXkgOiAwOwpAQCAtMzQ4LDI5ICszNDksMjUgQEAKIAl9CiAKIAkvKiBDYW4gd2Ugc2VuZD8gaWYgc28gYWRkIG9wdGlvbnMgYW5kIGFkZCB0byBwYWNrZXQgaGlzdG9yeSAqLwotCWlmIChyYyA9PSAwKQorCWlmIChyYyA9PSAwKSB7CisJCWRwLT5kY2Nwc19oY190eF9pbnNlcnRfb3B0aW9ucyA9IDE7CiAJCW5ld19wYWNrZXQtPmRjY3BodHhfY2N2YWwgPQogCQkJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfY2N2YWwgPQogCQkJCWhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudDsKKwl9CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9wYWNrZXRfc2VudChzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlLCBpbnQgbGVuKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBjY2lkM19oY190eF9zayhzayk7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCi0JQlVHX09OKGhjdHggPT0gTlVMTCk7CisJQlVHX09OKGhjdHggPT0gTlVMTCB8fCBoY3R4LT5jY2lkM2hjdHhfc3RhdGUgPT0gVEZSQ19TU1RBVEVfVEVSTSk7CiAKLQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pIHsKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgd2hpbGUgc3RhdGUgaXMgVEZSQ19TU1RBVEVfVEVSTSFcbiIsCi0JCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2spOwotCQlyZXR1cm47Ci0JfQotCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKIAogCS8qIGNoZWNrIGlmIHdlIGhhdmUgc2VudCBhIGRhdGEgcGFja2V0ICovCiAJaWYgKGxlbiA+IDApIHsKQEAgLTM3OCwxNCArMzc1LDE0IEBACiAJCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKnBhY2tldDsKIAogCQlwYWNrZXQgPSBkY2NwX3R4X2hpc3RfaGVhZCgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QpOwotCQlpZiAocGFja2V0ID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBwYWNrZXQgZG9lc24ndCBleGlzdHMgaW4gIgotCQkJCQkgImhpc3RvcnkhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAodW5saWtlbHkocGFja2V0ID09IE5VTEwpKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiBwYWNrZXQgZG9lc24ndCAiCisJCQkJICAgICAgICJleGlzdHMgaW4gaGlzdG9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYgKHBhY2tldC0+ZGNjcGh0eF9zZW50KSB7Ci0JCQlwcmludGsoS0VSTl9DUklUICIlczogbm8gdW5zZW50IHBhY2tldCBpbiBoaXN0b3J5IVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAodW5saWtlbHkocGFja2V0LT5kY2NwaHR4X3NlbnQpKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiBubyB1bnNlbnQgcGFja2V0IGluICIKKwkJCQkgICAgICAgImhpc3RvcnkhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9CiAJCXBhY2tldC0+ZGNjcGh0eF90c3RhbXAgPSBub3c7CkBAIC00NDUsMjQgKzQ0MiwxOCBAQAogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9wYWNrZXRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKwlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDNfb3B0aW9uc19yZWNlaXZlZCAqb3B0X3JlY3Y7CiAJc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqcGFja2V0OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAl1bnNpZ25lZCBsb25nIG5leHRfdG1vdXQ7IAogCXUzMiB0X2VsYXBzZWQ7CiAJdTMyIHBpbnY7CiAJdTMyIHhfcmVjdjsKIAl1MzIgcl9zYW1wbGU7CiAKLQlpZiAoaGN0eCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pIHsKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgcmVjZWl2ZWQgYSBwYWNrZXQgd2hlbiAiCi0JCQkgICAgICAgInRlcm1pbmF0aW5nIVxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwotCQlyZXR1cm47Ci0JfQorCUJVR19PTihoY3R4ID09IE5VTEwgfHwgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pOwogCiAJLyogd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBBQ0tzICovCiAJaWYgKCEoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9PSBEQ0NQX1BLVF9BQ0sgfHwKQEAgLTQ3MSw3ICs0NjIsNyBAQAogCiAJb3B0X3JlY3YgPSAmaGN0eC0+Y2NpZDNoY3R4X29wdGlvbnNfcmVjZWl2ZWQ7CiAKLQl0X2VsYXBzZWQgPSBkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZC5kY2Nwb3JfZWxhcHNlZF90aW1lOworCXRfZWxhcHNlZCA9IGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKIAl4X3JlY3YgPSBvcHRfcmVjdi0+Y2NpZDNvcl9yZWNlaXZlX3JhdGU7CiAJcGludiA9IG9wdF9yZWN2LT5jY2lkM29yX2xvc3NfZXZlbnRfcmF0ZTsKIApAQCAtNDg2LDE5ICs0NzcsMjQgQEAKIAkJLyogZ2V0IHRfcmVjdmRhdGEgZnJvbSBoaXN0b3J5ICovCiAJCXBhY2tldCA9IGRjY3BfdHhfaGlzdF9maW5kX2VudHJ5KCZoY3R4LT5jY2lkM2hjdHhfaGlzdCwKIAkJCQkJCSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKLQkJaWYgKHBhY2tldCA9PSBOVUxMKSB7Ci0JCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBzZXFubyAlbGx1KCVzKSBkb2VzJ3QgIgotCQkJCSAgICAgICAiZXhpc3QgaW4gaGlzdG9yeSFcbiIsCi0JCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAotCQkJCSAgICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxLAotCQkJCSAgICAgICBkY2NwX3BhY2tldF9uYW1lKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUpKTsKKwkJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBzZXFubyAiCisJCQkJICAgICAgICIlbGx1KCVzKSBkb2VzJ3QgZXhpc3QgaW4gaGlzdG9yeSFcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2ssCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxLAorCQkJCWRjY3BfcGFja2V0X25hbWUoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSkpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogVXBkYXRlIFJUVCAqLwotCQlyX3NhbXBsZSA9IHRpbWV2YWxfbm93X2RlbHRhKCZwYWNrZXQtPmRjY3BodHhfdHN0YW1wKTsKLQkJLyogRklYTUU6ICovCi0JCS8vIHJfc2FtcGxlIC09IHVzZWNzX3RvX2ppZmZpZXModF9lbGFwc2VkICogMTApOworCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CisJCXJfc2FtcGxlID0gdGltZXZhbF9kZWx0YSgmbm93LCAmcGFja2V0LT5kY2NwaHR4X3RzdGFtcCk7CisJCWlmICh1bmxpa2VseShyX3NhbXBsZSA8PSB0X2VsYXBzZWQpKQorCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogcl9zYW1wbGU9JXV1cywgIgorCQkJCSAgICAgICAidF9lbGFwc2VkPSV1dXNcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcl9zYW1wbGUsIHRfZWxhcHNlZCk7CisJCWVsc2UKKwkJCXJfc2FtcGxlIC09IHRfZWxhcHNlZDsKIAogCQkvKiBVcGRhdGUgUlRUIGVzdGltYXRlIGJ5IAogCQkgKiBJZiAoTm8gZmVlZGJhY2sgcmVjdikKQEAgLTU5MSwxMSArNTg3LDExIEBACiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X2luc2VydF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAotCWlmIChoY3R4ID09IE5VTEwgfHwgIShzay0+c2tfc3RhdGUgPT0gRENDUF9PUEVOIHx8Ci0JCQkgICAgICBzay0+c2tfc3RhdGUgPT0gRENDUF9QQVJUT1BFTikpCisJQlVHX09OKGhjdHggPT0gTlVMTCk7CisKKwlpZiAoIShzay0+c2tfc3RhdGUgPT0gRENDUF9PUEVOIHx8IHNrLT5za19zdGF0ZSA9PSBEQ0NQX1BBUlRPUEVOKSkKIAkJcmV0dXJuOwogCiAJIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2NjdmFsID0gaGN0eC0+Y2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50OwpAQCAtNjA2LDEyICs2MDIsMTEgQEAKIAkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQogewogCWludCByYyA9IDA7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGRwLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGU7CisJY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKwlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDNfb3B0aW9uc19yZWNlaXZlZCAqb3B0X3JlY3Y7CiAKLQlpZiAoaGN0eCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwlCVUdfT04oaGN0eCA9PSBOVUxMKTsKIAogCW9wdF9yZWN2ID0gJmhjdHgtPmNjaWQzaGN0eF9vcHRpb25zX3JlY2VpdmVkOwogCkBAIC02MjUsMTAgKzYyMCwxMCBAQAogCiAJc3dpdGNoIChvcHRpb24pIHsKIAljYXNlIFRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURToKLQkJaWYgKGxlbiAhPSA0KSB7Ci0JCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBpbnZhbGlkIGxlbiBmb3IgIgotCQkJCSAgICAgICAiVEZSQ19PUFRfTE9TU19FVkVOVF9SQVRFXG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzayk7CisJCWlmICh1bmxpa2VseShsZW4gIT0gNCkpIHsKKwkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgaW52YWxpZCAiCisJCQkJICAgICAgICJsZW4gZm9yIFRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURVxuIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCX0gZWxzZSB7CiAJCQlvcHRfcmVjdi0+Y2NpZDNvcl9sb3NzX2V2ZW50X3JhdGUgPSBudG9obCgqKHUzMiAqKXZhbHVlKTsKQEAgLTY0NiwxMCArNjQxLDEwIEBACiAJCQkgICAgICAgb3B0X3JlY3YtPmNjaWQzb3JfbG9zc19pbnRlcnZhbHNfbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBURlJDX09QVF9SRUNFSVZFX1JBVEU6Ci0JCWlmIChsZW4gIT0gNCkgewotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgaW52YWxpZCBsZW4gZm9yICIKLQkJCQkgICAgICAgIlRGUkNfT1BUX1JFQ0VJVkVfUkFURVxuIiwKLQkJCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2spOworCQlpZiAodW5saWtlbHkobGVuICE9IDQpKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIGludmFsaWQgIgorCQkJCSAgICAgICAibGVuIGZvciBURlJDX09QVF9SRUNFSVZFX1JBVEVcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOwogCQkJcmMgPSAtRUlOVkFMOwogCQl9IGVsc2UgewogCQkJb3B0X3JlY3YtPmNjaWQzb3JfcmVjZWl2ZV9yYXRlID0gbnRvaGwoKih1MzIgKil2YWx1ZSk7CkBAIC02NjgsMTMgKzY2MywxMSBAQAogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHg7CiAKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7Ci0KLQloY3R4ID0gZHAtPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZSA9IGttYWxsb2Moc2l6ZW9mKCpoY3R4KSwKLQkJCQkJCSAgICAgIGdmcF9hbnkoKSk7Ci0JaWYgKGhjdHggPT0gTlVMTCkKKwlkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlID0ga21hbGxvYyhzaXplb2YoKmhjdHgpLCBnZnBfYW55KCkpOworCWlmIChkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKIAltZW1zZXQoaGN0eCwgMCwgc2l6ZW9mKCpoY3R4KSk7CiAKIAlpZiAoZHAtPmRjY3BzX3BhY2tldF9zaXplID49IFRGUkNfTUlOX1BBQ0tFVF9TSVpFICYmCkBAIC02OTYsOSArNjg5LDggQEAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X2V4aXQoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCi0JY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcFxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwogCUJVR19PTihoY3R4ID09IE5VTEwpOwogCiAJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9URVJNKTsKQEAgLTczOCw4ICs3MzAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX2hjX3J4X3NldF9zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBlbnVtIGNjaWQzX2hjX3J4X3N0YXRlcyBzdGF0ZSkKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwotCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gZHAtPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKIAllbnVtIGNjaWQzX2hjX3J4X3N0YXRlcyBvbGRzdGF0ZSA9IGhjcngtPmNjaWQzaGNyeF9zdGF0ZTsKIAogCWNjaWQzX3ByX2RlYnVnKCIlcyglcCkgJS04LjhzIC0+ICVzXG4iLApAQCAtNzUxLDE0ICs3NDIsMTQgQEAKIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfc2VuZF9mZWVkYmFjayhzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7CiAJc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqcGFja2V0OwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAogCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXBcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAotCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CiAKIAlzd2l0Y2ggKGhjcngtPmNjaWQzaGNyeF9zdGF0ZSkgewogCWNhc2UgVEZSQ19SU1RBVEVfTk9fREFUQToKQEAgLTc2NywxMSArNzU4LDggQEAKIAljYXNlIFRGUkNfUlNUQVRFX0RBVEE6IHsKIAkJY29uc3QgdTMyIGRlbHRhID0gdGltZXZhbF9kZWx0YSgmbm93LAogCQkJCQkmaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2ZlZWRiYWNrKTsKLQotCQloY3J4LT5jY2lkM2hjcnhfeF9yZWN2ID0gKGhjcngtPmNjaWQzaGNyeF9ieXRlc19yZWN2ICoKLQkJCQkJICBVU0VDX1BFUl9TRUMpOwotCQlpZiAobGlrZWx5KGRlbHRhID4gMSkpCi0JCQloY3J4LT5jY2lkM2hjcnhfeF9yZWN2IC89IGRlbHRhOworCQloY3J4LT5jY2lkM2hjcnhfeF9yZWN2ID0gdXNlY3NfZGl2KGhjcngtPmNjaWQzaGNyeF9ieXRlc19yZWN2LAorCQkJCQkJICAgZGVsdGEpOwogCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTc4MiwxMCArNzcwLDEwIEBACiAJfQogCiAJcGFja2V0ID0gZGNjcF9yeF9oaXN0X2ZpbmRfZGF0YV9wYWNrZXQoJmhjcngtPmNjaWQzaGNyeF9oaXN0KTsKLQlpZiAocGFja2V0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBzaz0lcCwgbm8gZGF0YSBwYWNrZXQgaW4gaGlzdG9yeSFcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKLQkJZHVtcF9zdGFjaygpOworCWlmICh1bmxpa2VseShwYWNrZXQgPT0gTlVMTCkpIHsKKwkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBubyBkYXRhIHBhY2tldCAiCisJCQkgICAgICAgImluIGhpc3RvcnkhXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOwogCQlyZXR1cm47CiAJfQogCkBAIC04MDEsMTcgKzc4OSwxOCBAQAogCQloY3J4LT5jY2lkM2hjcnhfcGludiA9IH4wOwogCWVsc2UKIAkJaGNyeC0+Y2NpZDNoY3J4X3BpbnYgPSAxMDAwMDAwIC8gaGNyeC0+Y2NpZDNoY3J4X3A7CisJZHAtPmRjY3BzX2hjX3J4X2luc2VydF9vcHRpb25zID0gMTsKIAlkY2NwX3NlbmRfYWNrKHNrKTsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfaW5zZXJ0X29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJY29uc3Qgc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAJdTMyIHhfcmVjdiwgcGludjsKLQlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7CiAKLQlpZiAoaGNyeCA9PSBOVUxMIHx8ICEoc2stPnNrX3N0YXRlID09IERDQ1BfT1BFTiB8fAotCQkJICAgICAgc2stPnNrX3N0YXRlID09IERDQ1BfUEFSVE9QRU4pKQorCUJVR19PTihoY3J4ID09IE5VTEwpOworCisJaWYgKCEoc2stPnNrX3N0YXRlID09IERDQ1BfT1BFTiB8fCBzay0+c2tfc3RhdGUgPT0gRENDUF9QQVJUT1BFTikpCiAJCXJldHVybjsKIAogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2NjdmFsID0gaGNyeC0+Y2NpZDNoY3J4X2xhc3RfY291bnRlcjsKQEAgLTgzNyw4ICs4MjYsNyBAQAogCiBzdGF0aWMgdTMyIGNjaWQzX2hjX3J4X2NhbGNfZmlyc3RfbGkoc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKmVudHJ5LCAqbmV4dCwgKnRhaWwgPSBOVUxMOwogCXUzMiBydHQsIGRlbHRhLCB4X3JlY3YsIGZ2YWwsIHAsIHRtcDI7CiAJc3RydWN0IHRpbWV2YWwgdHN0YW1wID0geyAwLCB9OwpAQCAtODY5LDE3ICs4NTcsMTcgQEAKIAkJfQogCX0KIAotCWlmIChzdGVwID09IDApIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBzaz0lcCwgcGFja2V0IGhpc3RvcnkgY29udGFpbnMgbm8gIgotCQkJCSAiZGF0YSBwYWNrZXRzIVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOworCWlmICh1bmxpa2VseShzdGVwID09IDApKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgcGFja2V0IGhpc3RvcnkgIgorCQkJICAgICAgICJjb250YWlucyBubyBkYXRhIHBhY2tldHMhXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOwogCQlyZXR1cm4gfjA7CiAJfQogCi0JaWYgKGludGVydmFsID09IDApIHsKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgQ291bGQgbm90IGZpbmQgYSB3aW5fY291bnQgIgotCQkJICAgICAgICJpbnRlcnZhbCA+IDAuIERlZmF1bHRpbmcgdG8gMVxuIiwKLQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzayk7CisJaWYgKHVubGlrZWx5KGludGVydmFsID09IDApKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgQ291bGQgbm90IGZpbmQgYSAiCisJCQkgICAgICAgIndpbl9jb3VudCBpbnRlcnZhbCA+IDAuIERlZmF1bHRpbmcgdG8gMVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJaW50ZXJ2YWwgPSAxOwogCX0KIGZvdW5kOgpAQCAtODg5LDEwICs4NzcsOSBAQAogCWlmIChydHQgPT0gMCkKIAkJcnR0ID0gMTsKIAotCWRlbHRhID0gdGltZXZhbF9ub3dfZGVsdGEoJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayk7Ci0JeF9yZWN2ID0gaGNyeC0+Y2NpZDNoY3J4X2J5dGVzX3JlY3YgKiBVU0VDX1BFUl9TRUM7Ci0JaWYgKGxpa2VseShkZWx0YSA+IDEpKQotCQl4X3JlY3YgLz0gZGVsdGE7CisJZGNjcF90aW1lc3RhbXAoc2ssICZ0c3RhbXApOworCWRlbHRhID0gdGltZXZhbF9kZWx0YSgmdHN0YW1wLCAmaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2ZlZWRiYWNrKTsKKwl4X3JlY3YgPSB1c2Vjc19kaXYoaGNyeC0+Y2NpZDNoY3J4X2J5dGVzX3JlY3YsIGRlbHRhKTsKIAogCXRtcDEgPSAodTY0KXhfcmVjdiAqICh1NjQpcnR0OwogCWRvX2Rpdih0bXAxLDEwMDAwMDAwKTsKQEAgLTkxMSw4ICs4OTgsNyBAQAogCiBzdGF0aWMgdm9pZCBjY2lkM19oY19yeF91cGRhdGVfbGkoc3RydWN0IHNvY2sgKnNrLCB1NjQgc2VxX2xvc3MsIHU4IHdpbl9sb3NzKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCiAJaWYgKHNlcV9sb3NzICE9IERDQ1BfTUFYX1NFUU5PICsgMSAmJgogCSAgICBsaXN0X2VtcHR5KCZoY3J4LT5jY2lkM2hjcnhfbGlfaGlzdCkpIHsKQEAgLTkyNCwxNCArOTEwLDE0IEBACiAJCWlmIChsaV90YWlsID09IE5VTEwpCiAJCQlyZXR1cm47CiAJCWxpX3RhaWwtPmRjY3BsaWhfaW50ZXJ2YWwgPSBjY2lkM19oY19yeF9jYWxjX2ZpcnN0X2xpKHNrKTsKLQl9Ci0JLyogRklYTUU6IGZpbmQgZW5kIG9mIGludGVydmFsICovCisJfSBlbHNlCisJCSAgICBMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiBGSVhNRTogZmluZCBlbmQgb2YgIgorCQkJCSAgICJpbnRlcnZhbFxuIiwgX19GVU5DVElPTl9fKTsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfZGV0ZWN0X2xvc3Moc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0Jc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlOworCXN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCXU4IHdpbl9sb3NzOwogCWNvbnN0IHU2NCBzZXFfbG9zcyA9IGRjY3BfcnhfaGlzdF9kZXRlY3RfbG9zcygmaGNyeC0+Y2NpZDNoY3J4X2hpc3QsCiAJCQkJCQkgICAgICAmaGNyeC0+Y2NpZDNoY3J4X2xpX2hpc3QsCkBAIC05NDIsMjIgKzkyOCwxOSBAQAogCiBzdGF0aWMgdm9pZCBjY2lkM19oY19yeF9wYWNrZXRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7CisJc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAJY29uc3Qgc3RydWN0IGRjY3Bfb3B0aW9uc19yZWNlaXZlZCAqb3B0X3JlY3Y7CiAJc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqcGFja2V0OwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAl1OCB3aW5fY291bnQ7Ci0JdTMyIHBfcHJldjsKKwl1MzIgcF9wcmV2LCByX3NhbXBsZSwgdF9lbGFwc2VkOwogCWludCBpbnM7CiAKLQlpZiAoaGNyeCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlCVUdfT04oIShoY3J4LT5jY2lkM2hjcnhfc3RhdGUgPT0gVEZSQ19SU1RBVEVfTk9fREFUQSB8fAorCUJVR19PTihoY3J4ID09IE5VTEwgfHwKKwkgICAgICAgIShoY3J4LT5jY2lkM2hjcnhfc3RhdGUgPT0gVEZSQ19SU1RBVEVfTk9fREFUQSB8fAogCQkgaGNyeC0+Y2NpZDNoY3J4X3N0YXRlID09IFRGUkNfUlNUQVRFX0RBVEEpKTsKIAotCW9wdF9yZWN2ID0gJmRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkOworCW9wdF9yZWN2ID0gJmRjY3Bfc2soc2spLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkOwogCiAJc3dpdGNoIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlKSB7CiAJY2FzZSBEQ0NQX1BLVF9BQ0s6CkBAIC05NjcsMTAgKzk1MCwyNCBAQAogCQlpZiAob3B0X3JlY3YtPmRjY3Bvcl90aW1lc3RhbXBfZWNobyA9PSAwKQogCQkJYnJlYWs7CiAJCXBfcHJldiA9IGhjcngtPmNjaWQzaGNyeF9ydHQ7Ci0JCWRvX2dldHRpbWVvZmRheSgmbm93KTsKLQkJaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IHRpbWV2YWxfdXNlY3MoJm5vdykgLQotCQkJCSAgICAgKG9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8gLQotCQkJCSAgICAgIG9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lKSAqIDEwOworCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CisJCXRpbWV2YWxfc3ViX3VzZWNzKCZub3csIG9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8gKiAxMCk7CisJCXJfc2FtcGxlID0gdGltZXZhbF91c2Vjcygmbm93KTsKKwkJdF9lbGFwc2VkID0gb3B0X3JlY3YtPmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKKworCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gdF9lbGFwc2VkKSkKKwkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHJfc2FtcGxlPSV1dXMsICIKKwkJCQkgICAgICAgInRfZWxhcHNlZD0ldXVzXG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJfc2FtcGxlLCB0X2VsYXBzZWQpOworCQllbHNlCisJCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7CisKKwkJaWYgKGhjcngtPmNjaWQzaGNyeF9zdGF0ZSA9PSBURlJDX1JTVEFURV9OT19EQVRBKQorCQkJaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IHJfc2FtcGxlOworCQllbHNlCisJCQloY3J4LT5jY2lkM2hjcnhfcnR0ID0gKGhjcngtPmNjaWQzaGNyeF9ydHQgKiA5KSAvIDEwICsKKwkJCQkJICAgICAgcl9zYW1wbGUgLyAxMDsKKwogCQlpZiAocF9wcmV2ICE9IGhjcngtPmNjaWQzaGNyeF9ydHQpCiAJCQljY2lkM19wcl9kZWJ1ZygiJXMsIE5ldyBSVFQ9JWx1dXMsIGVsYXBzZWQgdGltZT0ldVxuIiwKIAkJCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgaGNyeC0+Y2NpZDNoY3J4X3J0dCwKQEAgLTk3OCwxOSArOTc1LDE2IEBACiAJCWJyZWFrOwogCWNhc2UgRENDUF9QS1RfREFUQToKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgbm90IERBVEEvREFUQUFDSy9BQ0sgcGFja2V0KCVzKVxuIiwKLQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKLQkJCSAgICAgICBkY2NwX3BhY2tldF9uYW1lKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUpKTsKKwlkZWZhdWx0OiAvKiBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBvdGhlciBwYWNrZXQgdHlwZXMsIG1vdmUgYWxvbmcgKi8KIAkJcmV0dXJuOwogCX0KIAotCXBhY2tldCA9IGRjY3BfcnhfaGlzdF9lbnRyeV9uZXcoY2NpZDNfcnhfaGlzdCwgb3B0X3JlY3YtPmRjY3Bvcl9uZHAsCisJcGFja2V0ID0gZGNjcF9yeF9oaXN0X2VudHJ5X25ldyhjY2lkM19yeF9oaXN0LCBzaywgb3B0X3JlY3YtPmRjY3Bvcl9uZHAsCiAJCQkJCXNrYiwgU0xBQl9BVE9NSUMpOwotCWlmIChwYWNrZXQgPT0gTlVMTCkgewotCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBOb3QgZW5vdWdoIG1lbSB0byBhZGQgcnggcGFja2V0ICIKLQkJCSAgICAgICAidG8gaGlzdG9yeSAoY29uc2lkZXIgaXQgbG9zdCkhIiwKLQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzayk7CisJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgeworCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIE5vdCBlbm91Z2ggbWVtIHRvICIKKwkJCQkiYWRkIHJ4IHBhY2tldCB0byBoaXN0b3J5LCBjb25zaWRlciBpdCBsb3N0IVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTAxNyw3ICsxMDExLDcgQEAKIAkJaWYgKGlucyAhPSAwKQogCQkJYnJlYWs7CiAKLQkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CiAJCWlmICh0aW1ldmFsX2RlbHRhKCZub3csICZoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrKSA+PQogCQkgICAgaGNyeC0+Y2NpZDNoY3J4X3J0dCkgewogCQkJaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2FjayA9IG5vdzsKQEAgLTEwNTYsMTEgKzEwNTAsMTEgQEAKIAogCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXBcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAotCWhjcnggPSBkcC0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlID0ga21hbGxvYyhzaXplb2YoKmhjcngpLAotCQkJCQkJICAgICAgZ2ZwX2FueSgpKTsKLQlpZiAoaGNyeCA9PSBOVUxMKQorCWRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGUgPSBrbWFsbG9jKHNpemVvZigqaGNyeCksIGdmcF9hbnkoKSk7CisJaWYgKGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwloY3J4ID0gY2NpZDNfaGNfcnhfc2soc2spOwogCW1lbXNldChoY3J4LCAwLCBzaXplb2YoKmhjcngpKTsKIAogCWlmIChkcC0+ZGNjcHNfcGFja2V0X3NpemUgPj0gVEZSQ19NSU5fUEFDS0VUX1NJWkUgJiYKQEAgLTEwNzIsMjMgKzEwNjYsMTggQEAKIAloY3J4LT5jY2lkM2hjcnhfc3RhdGUgPSBURlJDX1JTVEFURV9OT19EQVRBOwogCUlOSVRfTElTVF9IRUFEKCZoY3J4LT5jY2lkM2hjcnhfaGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmhjcngtPmNjaWQzaGNyeF9saV9oaXN0KTsKLQkvKgotCSAqIFhYWCB0aGlzIHNlZW1zIHRvIGJlIHBhcmFub2lkLCBuZWVkIHRvIHRoaW5rIG1vcmUgYWJvdXQgdGhpcywgZm9yCi0JICogbm93IHN0YXJ0IHdpdGggc29tZXRoaW5nIGRpZmZlcmVudCB0aGFuIHplcm8uIC1hY21lCi0JICovCi0JaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IFVTRUNfUEVSX1NFQyAvIDU7CisJZGNjcF90aW1lc3RhbXAoc2ssICZoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrKTsKKwloY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfZmVlZGJhY2sgPSBoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrOworCWhjcngtPmNjaWQzaGNyeF9ydHQgPSA1MDAwOyAvKiBYWFggNW1zIGZvciBub3cuLi4gKi8KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfZXhpdChzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7CiAKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7Ci0KLQlpZiAoaGNyeCA9PSBOVUxMKQotCQlyZXR1cm47CisJQlVHX09OKGhjcnggPT0gTlVMTCk7CiAKIAljY2lkM19oY19yeF9zZXRfc3RhdGUoc2ssIFRGUkNfUlNUQVRFX1RFUk0pOwogCkBAIC0xMTA0LDExICsxMDkzLDkgQEAKIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX2luZm8gKmluZm8pCiB7Ci0JY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQljb25zdCBzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGRwLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGU7CisJY29uc3Qgc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAKLQlpZiAoaGNyeCA9PSBOVUxMKQotCQlyZXR1cm47CisJQlVHX09OKGhjcnggPT0gTlVMTCk7CiAKIAlpbmZvLT50Y3BpX2NhX3N0YXRlCT0gaGNyeC0+Y2NpZDNoY3J4X3N0YXRlOwogCWluZm8tPnRjcGlfb3B0aW9ucwl8PSBUQ1BJX09QVF9USU1FU1RBTVBTOwpAQCAtMTExNywxMSArMTEwNCw5IEBACiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9pbmZvICppbmZvKQogewotCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0JY29uc3Qgc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHggPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlOworCWNvbnN0IHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCi0JaWYgKGhjdHggPT0gTlVMTCkKLQkJcmV0dXJuOworCUJVR19PTihoY3R4ID09IE5VTEwpOwogCiAJaW5mby0+dGNwaV9ydG8gPSBoY3R4LT5jY2lkM2hjdHhfdF9ydG87CiAJaW5mby0+dGNwaV9ydHQgPSBoY3R4LT5jY2lkM2hjdHhfcnR0OwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaCBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmgKaW5kZXggZWU4Y2JhYy4uZWIyNDg3NyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaAorKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oCkBAIC00OCw2ICs0OCw4IEBACiAvKiBUd28gc2Vjb25kcyBhcyBwZXIgQ0NJRDMgc3BlYyAqLwogI2RlZmluZSBURlJDX0lOSVRJQUxfVElNRU9VVAkgICAoMiAqIFVTRUNfUEVSX1NFQykKIAorI2RlZmluZSBURlJDX0lOSVRJQUxfSVBJCSAgIChVU0VDX1BFUl9TRUMgLyA0KQorCiAvKiBJbiB1c2VjcyAtIGhhbGYgdGhlIHNjaGVkdWxpbmcgZ3JhbnVsYXJpdHkgYXMgcGVyIFJGQzM0NDggNC42ICovCiAjZGVmaW5lIFRGUkNfT1BTWVNfSEFMRl9USU1FX0dSQU4gIChVU0VDX1BFUl9TRUMgLyAoMiAqIEhaKSkKIApAQCAtMTE1LDcgKzExNyw3IEBACiAgIAl1NjQJCQljY2lkM2hjcnhfc2Vxbm9fbGFzdF9jb3VudGVyOjQ4LAogCQkJCWNjaWQzaGNyeF9zdGF0ZTo4LAogCQkJCWNjaWQzaGNyeF9sYXN0X2NvdW50ZXI6NDsKLQl1bnNpZ25lZCBsb25nCQljY2lkM2hjcnhfcnR0OworCXUzMgkJCWNjaWQzaGNyeF9ydHQ7CiAgIAl1MzIJCQljY2lkM2hjcnhfcDsKICAgCXUzMgkJCWNjaWQzaGNyeF9ieXRlc19yZWN2OwogICAJc3RydWN0IHRpbWV2YWwJCWNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjazsKQEAgLTEyOCwxMCArMTMwLDE0IEBACiAgIAl1MzIJCQljY2lkM2hjcnhfeF9yZWN2OwogfTsKIAotI2RlZmluZSBjY2lkM19oY190eF9maWVsZChzLGZpZWxkKSAocy0+ZGNjcHNfaGNfdHhfY2NpZF9wcml2YXRlID09IE5VTEwgPyAwIDogXAotICAgICgoc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKilzLT5kY2Nwc19oY190eF9jY2lkX3ByaXZhdGUpLT5jY2lkM2hjdHhfIyNmaWVsZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmNjaWQzX2hjX3R4X3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKyAgICByZXR1cm4gZGNjcF9zayhzayktPmRjY3BzX2hjX3R4X2NjaWRfcHJpdmF0ZTsKK30KIAotI2RlZmluZSBjY2lkM19oY19yeF9maWVsZChzLGZpZWxkKSAocy0+ZGNjcHNfaGNfcnhfY2NpZF9wcml2YXRlID09IE5VTEwgPyAwIDogXAotICAgICgoc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKilzLT5kY2Nwc19oY19yeF9jY2lkX3ByaXZhdGUpLT5jY2lkM2hjcnhfIyNmaWVsZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmNjaWQzX2hjX3J4X3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKyAgICByZXR1cm4gZGNjcF9zayhzayktPmRjY3BzX2hjX3J4X2NjaWRfcHJpdmF0ZTsKK30KIAogI2VuZGlmIC8qIF9EQ0NQX0NDSUQzX0hfICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuaCBiL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5oCmluZGV4IGZiOTBhOTEuLmIzNzVlYmQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5oCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5oCkBAIC0xMzQsNiArMTM0LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICoKIAkJICAgICBkY2NwX3J4X2hpc3RfZW50cnlfbmV3KHN0cnVjdCBkY2NwX3J4X2hpc3QgKmhpc3QsCisJCQkJICAgICAJICAgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywgCiAJCQkJICAgICAJICAgIGNvbnN0IHUzMiBuZHAsIAogCQkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvKQpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJCWVudHJ5LT5kY2NwaHJ4X2NjdmFsID0gZGgtPmRjY3BoX2NjdmFsOwogCQllbnRyeS0+ZGNjcGhyeF90eXBlICA9IGRoLT5kY2NwaF90eXBlOwogCQllbnRyeS0+ZGNjcGhyeF9uZHAgICA9IG5kcDsKLQkJZG9fZ2V0dGltZW9mZGF5KCYoZW50cnktPmRjY3BocnhfdHN0YW1wKSk7CisJCWRjY3BfdGltZXN0YW1wKHNrLCAmZW50cnktPmRjY3BocnhfdHN0YW1wKTsKIAl9CiAKIAlyZXR1cm4gZW50cnk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kY2NwLmggYi9uZXQvZGNjcC9kY2NwLmgKaW5kZXggMzM0NTZjMC4uOTVjNDYzMGIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2RjY3AuaAorKysgYi9uZXQvZGNjcC9kY2NwLmgKQEAgLTQyNiwxMCArNDI2LDEzIEBACiAJCWRjY3BfYWNrcGt0c19hbGxvYyh1bnNpZ25lZCBpbnQgbGVuLAogCQkJCSAgY29uc3QgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiB2b2lkIGRjY3BfYWNrcGt0c19mcmVlKHN0cnVjdCBkY2NwX2Fja3BrdHMgKmFwKTsKLWV4dGVybiBpbnQgZGNjcF9hY2twa3RzX2FkZChzdHJ1Y3QgZGNjcF9hY2twa3RzICphcCwgdTY0IGFja25vLCB1OCBzdGF0ZSk7CitleHRlcm4gaW50IGRjY3BfYWNrcGt0c19hZGQoc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCSAgICB1NjQgYWNrbm8sIHU4IHN0YXRlKTsKIGV4dGVybiB2b2lkIGRjY3BfYWNrcGt0c19jaGVja19yY3ZfYWNrbm8oc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAsCiAJCQkJCSBzdHJ1Y3Qgc29jayAqc2ssIHU2NCBhY2tubyk7CiAKK2V4dGVybiB2b2lkIGRjY3BfdGltZXN0YW1wKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKnR2KTsKKwogc3RhdGljIGlubGluZSBzdXNlY29uZHNfdCB0aW1ldmFsX3VzZWNzKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dikKIHsKIAlyZXR1cm4gdHYtPnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIHR2LT50dl91c2VjOwpAQCAtNDY4LDE3ICs0NzEsNiBAQAogCX0KIH0KIAotLyoKLSAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgaW4gdXNlY3MgYmV0d2VlbiB0aW1ldmFsCi0gKiBwYXNzZWQgaW4gYW5kIGN1cnJlbnQgdGltZQotICovCi1zdGF0aWMgaW5saW5lIHN1c2Vjb25kc190IHRpbWV2YWxfbm93X2RlbHRhKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dikKLXsKLQlzdHJ1Y3QgdGltZXZhbCBub3c7Ci0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwotCXJldHVybiB0aW1ldmFsX2RlbHRhKCZub3csIHR2KTsKLX0KLQogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCiBleHRlcm4gdm9pZCBkY2NwX2Fja3ZlY3Rvcl9wcmludChjb25zdCB1NjQgYWNrbm8sCiAJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZlY3RvciwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCBlZjI5Y2VmLi5jNjBiYzM0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCWlmIChkcC0+ZGNjcHNfb3B0aW9ucy5kY2Nwb19zZW5kX2Fja192ZWN0b3IpIHsKIAkJc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAgPSBkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0czsKIAotCQlpZiAoZGNjcF9hY2twa3RzX2FkZChkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0cywKKwkJaWYgKGRjY3BfYWNrcGt0c19hZGQoZHAtPmRjY3BzX2hjX3J4X2Fja3BrdHMsIHNrLAogCQkJCSAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAogCQkJCSAgICAgRENDUF9BQ0tQS1RTX1NUQVRFX1JFQ0VJVkVEKSkgewogCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICJEQ0NQOiBhY2tub3dsZWRnZWFibGUgIgpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJCSAqIERDQ1BfQUNLUEtUU19TVEFURV9FQ05fTUFSS0VECiAJCSAqLwogCQlpZiAoZHAtPmRjY3BzX29wdGlvbnMuZGNjcG9fc2VuZF9hY2tfdmVjdG9yKSB7Ci0JCQlpZiAoZGNjcF9hY2twa3RzX2FkZChkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0cywKKwkJCWlmIChkY2NwX2Fja3BrdHNfYWRkKGRwLT5kY2Nwc19oY19yeF9hY2twa3RzLCBzaywKIAkJCQkJICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEsCiAJCQkJCSAgICAgRENDUF9BQ0tQS1RTX1NUQVRFX1JFQ0VJVkVEKSkKIAkJCQlnb3RvIGRpc2NhcmQ7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY0LmMgYi9uZXQvZGNjcC9pcHY0LmMKaW5kZXggM2ZjNzVkYi4uMmFmYWE0NiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2NC5jCisrKyBiL25ldC9kY2NwL2lwdjQuYwpAQCAtNjQxLDE2ICs2NDEsMTIgQEAKIAogCXNrYiA9IGRjY3BfbWFrZV9yZXNldChzaywgc2stPnNrX2RzdF9jYWNoZSwgY29kZSk7CiAJaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCWNvbnN0IHN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAogCQllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiLCBzaywKIAkJCQkJICAgIGluZXQtPnNhZGRyLCBpbmV0LT5kYWRkciwgTlVMTCk7CiAJCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCiAJCQllcnIgPSAwOwotCi0JCWNjaWRfaGNfcnhfZXhpdChkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2spOwotCQljY2lkX2hjX3R4X2V4aXQoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTI0Myw2ICsxMjM5LDcgQEAKIAlzdGF0aWMgaW50IGRjY3BfY3RsX3NvY2tldF9pbml0ID0gMTsKIAogCWRjY3Bfb3B0aW9uc19pbml0KCZkcC0+ZGNjcHNfb3B0aW9ucyk7CisJZG9fZ2V0dGltZW9mZGF5KCZkcC0+ZGNjcHNfZXBvY2gpOwogCiAJaWYgKGRwLT5kY2Nwc19vcHRpb25zLmRjY3BvX3NlbmRfYWNrX3ZlY3RvcikgewogCQlkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0cyA9CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9taW5pc29ja3MuYyBiL25ldC9kY2NwL21pbmlzb2Nrcy5jCmluZGV4IGNlNWRmZjQuLjE4NDYxYmMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL21pbmlzb2Nrcy5jCisrKyBiL25ldC9kY2NwL21pbmlzb2Nrcy5jCkBAIC05Niw2ICs5Niw3IEBACiAJCW5ld2RwLT5kY2Nwc19oY19yeF9hY2twa3RzID0gTlVMTDsKIAkJbmV3ZHAtPmRjY3BzX3JvbGUgPSBEQ0NQX1JPTEVfU0VSVkVSOwogCQluZXdpY3NrLT5pY3NrX3J0byA9IERDQ1BfVElNRU9VVF9JTklUOworCQlkb19nZXR0aW1lb2ZkYXkoJm5ld2RwLT5kY2Nwc19lcG9jaCk7CiAKIAkJaWYgKG5ld2RwLT5kY2Nwc19vcHRpb25zLmRjY3BvX3NlbmRfYWNrX3ZlY3RvcikgewogCQkJbmV3ZHAtPmRjY3BzX2hjX3J4X2Fja3BrdHMgPQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3B0aW9ucy5jIGIvbmV0L2RjY3Avb3B0aW9ucy5jCmluZGV4IDM4MmM1ODkuLmQ0YzQyNDIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL29wdGlvbnMuYworKysgYi9uZXQvZGNjcC9vcHRpb25zLmMKQEAgLTcyLDYgKzcyLDcgQEAKIAlzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcmVjdiA9ICZkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKIAl1bnNpZ25lZCBjaGFyIG9wdCwgbGVuOwogCXVuc2lnbmVkIGNoYXIgKnZhbHVlOworCXUzMiBlbGFwc2VkX3RpbWU7CiAKIAltZW1zZXQob3B0X3JlY3YsIDAsIHNpemVvZigqb3B0X3JlY3YpKTsKIApAQCAtMTM5LDcgKzE0MCw3IEBACiAJCQlvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcCA9IG50b2hsKCoodTMyICopdmFsdWUpOwogCiAJCQlkcC0+ZGNjcHNfdGltZXN0YW1wX2VjaG8gPSBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcDsKLQkJCWRvX2dldHRpbWVvZmRheSgmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKTsKKwkJCWRjY3BfdGltZXN0YW1wKHNrLCAmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKTsKIAogCQkJZGNjcF9wcl9kZWJ1ZygiJXNUSU1FU1RBTVA9JXUsIGFja25vPSVsbHVcbiIsCiAJCQkJICAgICAgZGVidWdfcHJlZml4LCBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcCwKQEAgLTE1OSwxOCArMTYwLDE4IEBACiAJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQkgICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKIAotCQkJaWYgKGxlbiA+IDQpIHsKLQkJCQlpZiAobGVuID09IDYpCi0JCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0KLQkJCQkJCSBudG9ocygqKHUxNiAqKSh2YWx1ZSArIDQpKTsKLQkJCQllbHNlCi0JCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0KLQkJCQkJCSBudG9obCgqKHUzMiAqKSh2YWx1ZSArIDQpKTsKIAotCQkJCWRjY3BfcHJfZGVidWcoIiVzVElNRVNUQU1QX0VDSE8gRUxBUFNFRF9USU1FPSVkXG4iLAotCQkJCSAgICAgIGRlYnVnX3ByZWZpeCwKLQkJCQkgICAgICBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSk7Ci0JCQl9CisJCQlpZiAobGVuID09IDQpCisJCQkJYnJlYWs7CisKKwkJCWlmIChsZW4gPT0gNikKKwkJCQllbGFwc2VkX3RpbWUgPSBudG9ocygqKHUxNiAqKSh2YWx1ZSArIDQpKTsKKwkJCWVsc2UKKwkJCQllbGFwc2VkX3RpbWUgPSBudG9obCgqKHUzMiAqKSh2YWx1ZSArIDQpKTsKKworCQkJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIHRoZSBiaWdnZXN0IEVMQVBTRURfVElNRSAqLworCQkJaWYgKGVsYXBzZWRfdGltZSA+IG9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lKQorCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0gZWxhcHNlZF90aW1lOwogCQkJYnJlYWs7CiAJCWNhc2UgRENDUE9fRUxBUFNFRF9USU1FOgogCQkJaWYgKGxlbiAhPSAyICYmIGxlbiAhPSA0KQpAQCAtMTgwLDE0ICsxODEsMTUgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGxlbiA9PSAyKQotCQkJCW9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lID0KLQkJCQkJCQludG9ocygqKHUxNiAqKXZhbHVlKTsKKwkJCQllbGFwc2VkX3RpbWUgPSBudG9ocygqKHUxNiAqKXZhbHVlKTsKIAkJCWVsc2UKLQkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9Ci0JCQkJCQkJbnRvaGwoKih1MzIgKil2YWx1ZSk7CisJCQkJZWxhcHNlZF90aW1lID0gbnRvaGwoKih1MzIgKil2YWx1ZSk7CisKKwkJCWlmIChlbGFwc2VkX3RpbWUgPiBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSkKKwkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9IGVsYXBzZWRfdGltZTsKIAogCQkJZGNjcF9wcl9kZWJ1ZygiJXNFTEFQU0VEX1RJTUU9JWRcbiIsIGRlYnVnX3ByZWZpeCwKLQkJCQkgICAgICBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSk7CisJCQkJICAgICAgZWxhcHNlZF90aW1lKTsKIAkJCWJyZWFrOwogCQkJLyoKIAkJCSAqIEZyb20gZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEudHh0OgpAQCAtMzU5LDkgKzM2MSwxMyBAQAogI2VuZGlmCiAJc3RydWN0IGRjY3BfYWNrcGt0cyAqYXAgPSBkcC0+ZGNjcHNfaGNfcnhfYWNrcGt0czsKIAlpbnQgbGVuID0gYXAtPmRjY3BhcF9idWZfdmVjdG9yX2xlbiArIDI7Ci0JY29uc3QgdTMyIGVsYXBzZWRfdGltZSA9IHRpbWV2YWxfbm93X2RlbHRhKCZhcC0+ZGNjcGFwX3RpbWUpIC8gMTA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXUzMiBlbGFwc2VkX3RpbWU7CiAJdW5zaWduZWQgY2hhciAqdG8sICpmcm9tOwogCisJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCWVsYXBzZWRfdGltZSA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJmFwLT5kY2NwYXBfdGltZSkgLyAxMDsKKwogCWlmIChlbGFwc2VkX3RpbWUgIT0gMCkKIAkJZGNjcF9pbnNlcnRfb3B0aW9uX2VsYXBzZWRfdGltZShzaywgc2tiLCBlbGFwc2VkX3RpbWUpOwogCkBAIC00MjYsMTMgKzQzMiwyOSBAQAogCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBhcC0+ZGNjcGFwX2Fja19hY2tubyk7CiB9CiAKK3ZvaWQgZGNjcF90aW1lc3RhbXAoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKworCWRvX2dldHRpbWVvZmRheSh0dik7CisJdHYtPnR2X3NlYyAgLT0gZHAtPmRjY3BzX2Vwb2NoLnR2X3NlYzsKKwl0di0+dHZfdXNlYyAtPSBkcC0+ZGNjcHNfZXBvY2gudHZfdXNlYzsKKworCXdoaWxlICh0di0+dHZfdXNlYyA8IDApIHsKKwkJdHYtPnR2X3NlYy0tOworCQl0di0+dHZfdXNlYyArPSBVU0VDX1BFUl9TRUM7CisJfQorfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3RpbWVzdGFtcCk7CisKIHZvaWQgZGNjcF9pbnNlcnRfb3B0aW9uX3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHRpbWV2YWwgdHY7CiAJdTMyIG5vdzsKIAkKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlub3cgPSAodHYudHZfc2VjICogVVNFQ19QRVJfU0VDICsgdHYudHZfdXNlYykgLyAxMDsKKwlkY2NwX3RpbWVzdGFtcChzaywgJnR2KTsKKwlub3cgPSB0aW1ldmFsX3VzZWNzKCZ0dikgLyAxMDsKIAkvKiB5ZXMgdGhpcyB3aWxsIG92ZXJmbG93IGJ1dCB0aGF0IGlzIHRoZSBwb2ludCBhcyB3ZSB3YW50IGEKIAkgKiAxMCB1c2VjIDMyIGJpdCB0aW1lciB3aGljaCBtZWFuIGl0IHdyYXBzIGV2ZXJ5IDExLjkgaG91cnMgKi8KIApAQCAtNDUwLDEzICs0NzIsMTcgQEAKIAljb25zdCBjaGFyICpkZWJ1Z19wcmVmaXggPSBkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KIAkJCQkJIkNMSUVOVCBUWCBvcHQ6ICIgOiAic2VydmVyIFRYIG9wdDogIjsKICNlbmRpZgorCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAl1MzIgdHN0YW1wX2VjaG87Ci0JY29uc3QgdTMyIGVsYXBzZWRfdGltZSA9Ci0JCQl0aW1ldmFsX25vd19kZWx0YSgmZHAtPmRjY3BzX3RpbWVzdGFtcF90aW1lKSAvIDEwOwotCWNvbnN0IGludCBlbGFwc2VkX3RpbWVfbGVuID0gZGNjcF9lbGFwc2VkX3RpbWVfbGVuKGVsYXBzZWRfdGltZSk7Ci0JY29uc3QgaW50IGxlbiA9IDYgKyBlbGFwc2VkX3RpbWVfbGVuOworCXUzMiBlbGFwc2VkX3RpbWU7CisJaW50IGxlbiwgZWxhcHNlZF90aW1lX2xlbjsKIAl1bnNpZ25lZCBjaGFyICp0bzsKIAorCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKKwllbGFwc2VkX3RpbWUgPSB0aW1ldmFsX2RlbHRhKCZub3csICZkcC0+ZGNjcHNfdGltZXN0YW1wX3RpbWUpIC8gMTA7CisJZWxhcHNlZF90aW1lX2xlbiA9IGRjY3BfZWxhcHNlZF90aW1lX2xlbihlbGFwc2VkX3RpbWUpOworCWxlbiA9IDYgKyBlbGFwc2VkX3RpbWVfbGVuOworCiAJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX29wdF9sZW4gKyBsZW4gPiBEQ0NQX01BWF9PUFRfTEVOKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiRENDUDogcGFja2V0IHRvbyBzbWFsbCB0byBpbnNlcnQgIgogCQkJCQkgInRpbWVzdGFtcCBlY2hvIVxuIik7CkBAIC01MDUsMTMgKzUzMSwxOCBAQAogCQkgICAgKGRwLT5kY2Nwc19oY19yeF9hY2twa3RzLT5kY2NwYXBfYnVmX2Fja25vICE9CiAJCSAgICAgRENDUF9NQVhfU0VRTk8gKyAxKSkKIAkJCWRjY3BfaW5zZXJ0X29wdGlvbl9hY2tfdmVjdG9yKHNrLCBza2IpOwotCiAJCWlmIChkcC0+ZGNjcHNfdGltZXN0YW1wX2VjaG8gIT0gMCkKIAkJCWRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXBfZWNobyhzaywgc2tiKTsKIAl9CiAKLQljY2lkX2hjX3J4X2luc2VydF9vcHRpb25zKGRwLT5kY2Nwc19oY19yeF9jY2lkLCBzaywgc2tiKTsKLQljY2lkX2hjX3R4X2luc2VydF9vcHRpb25zKGRwLT5kY2Nwc19oY190eF9jY2lkLCBzaywgc2tiKTsKKwlpZiAoZHAtPmRjY3BzX2hjX3J4X2luc2VydF9vcHRpb25zKSB7CisJCWNjaWRfaGNfcnhfaW5zZXJ0X29wdGlvbnMoZHAtPmRjY3BzX2hjX3J4X2NjaWQsIHNrLCBza2IpOworCQlkcC0+ZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnMgPSAwOworCX0KKwlpZiAoZHAtPmRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zKSB7CisJCWNjaWRfaGNfdHhfaW5zZXJ0X29wdGlvbnMoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOworCQlkcC0+ZGNjcHNfaGNfdHhfaW5zZXJ0X29wdGlvbnMgPSAwOworCX0KIAogCS8qIFhYWDogaW5zZXJ0IG90aGVyIG9wdGlvbnMgd2hlbiBhcHByb3ByaWF0ZSAqLwogCkBAIC02MTYsNyArNjQ3LDggQEAKIC8qCiAgKiBJbXBsZW1lbnRzIHRoZSBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQgQXBwZW5kaXggQQogICovCi1pbnQgZGNjcF9hY2twa3RzX2FkZChzdHJ1Y3QgZGNjcF9hY2twa3RzICphcCwgdTY0IGFja25vLCB1OCBzdGF0ZSkKK2ludCBkY2NwX2Fja3BrdHNfYWRkKHN0cnVjdCBkY2NwX2Fja3BrdHMgKmFwLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCisJCSAgICAgdTY0IGFja25vLCB1OCBzdGF0ZSkKIHsKIAkvKgogCSAqIENoZWNrIGF0IHRoZSByaWdodCBwbGFjZXMgaWYgdGhlIGJ1ZmZlciBpcyBmdWxsLCBpZiBpdCBpcywgdGVsbCB0aGUKQEAgLTY5Nyw3ICs3MjksNyBAQAogCX0KIAogCWFwLT5kY2NwYXBfYnVmX2Fja25vID0gYWNrbm87Ci0JZG9fZ2V0dGltZW9mZGF5KCZhcC0+ZGNjcGFwX3RpbWUpOworCWRjY3BfdGltZXN0YW1wKHNrLCAmYXAtPmRjY3BhcF90aW1lKTsKIG91dDoKIAlkY2NwX3ByX2RlYnVnKCIiKTsKIAlkY2NwX2Fja3BrdHNfcHJpbnQoYXApOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3V0cHV0LmMgYi9uZXQvZGNjcC9vdXRwdXQuYwppbmRleCAyOGRlMTU3Li5lYTZkMGU5IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vdXRwdXQuYworKysgYi9uZXQvZGNjcC9vdXRwdXQuYwpAQCAtNTIyLDcgKzUyMiw0IEBACiAJCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBwcmlvKSk7CiAJfSBlbHNlCiAJCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2IpOwotCi0JY2NpZF9oY19yeF9leGl0KGRwLT5kY2Nwc19oY19yeF9jY2lkLCBzayk7Ci0JY2NpZF9oY190eF9leGl0KGRwLT5kY2Nwc19oY190eF9jY2lkLCBzayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKaW5kZXggMmM5MTVmMy4uMzQwN2YxOSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtMTE3LDggKzExNyw3IEBACiBzdGF0aWMgdW5zaWduZWQgZG5fcnRfaGFzaF9tYXNrOwogCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZG5fcm91dGVfdGltZXI7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZG5fcnRfZmx1c2hfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihkbl9ydW5fZmx1c2gsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkbl9ydF9mbHVzaF90aW1lciwgZG5fcnVuX2ZsdXNoLCAwLCAwKTsKIGludCBkZWNuZXRfZHN0X2djX2ludGVydmFsID0gMjsKIAogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGRuX2RzdF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL0tjb25maWcgYi9uZXQvaWVlZTgwMjExL0tjb25maWcKaW5kZXggNThlZDQzMS4uOTFiMTZmYiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9LY29uZmlnCisrKyBiL25ldC9pZWVlODAyMTEvS2NvbmZpZwpAQCAtMSw2ICsxLDUgQEAKIGNvbmZpZyBJRUVFODAyMTEKIAl0cmlzdGF0ZSAiR2VuZXJpYyBJRUVFIDgwMi4xMSBOZXR3b3JraW5nIFN0YWNrIgotCXNlbGVjdCBORVRfUkFESU8KIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQgSUVFRSA4MDIuMTEKIAluZXR3b3JraW5nIHN0YWNrLgpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKaW5kZXggMDVhNmYyZi4uNjFhOWQ5MiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCkBAIC0zMCw3ICszMCw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CiB9OwogCi0KIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFsZ3M7CiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtMzgsOCArMzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG8gKmhjcnlwdDsKIAotdm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJCSAgIGludCBmb3JjZSkKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmVudHJ5OwpAQCAtMTQwLDcgKzEzOCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOwogCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOyBwdHIgPSBwdHItPm5leHQpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCSAgICAoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopcHRyOwogCQlpZiAoYWxnLT5vcHMgPT0gb3BzKSB7CiAJCQlsaXN0X2RlbCgmYWxnLT5saXN0KTsKIAkJCWRlbF9hbGcgPSBhbGc7CkBAIC0xNTgsOCArMTU2LDcgQEAKIAlyZXR1cm4gZGVsX2FsZyA/IDAgOiAtMTsKIH0KIAotCi1zdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSkKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CkBAIC0xNzEsNyArMTY4LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CiAJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9Ci0JCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJICAgIChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKilwdHI7CiAJCWlmIChzdHJjbXAoYWxnLT5vcHMtPm5hbWUsIG5hbWUpID09IDApIHsKIAkJCWZvdW5kX2FsZyA9IGFsZzsKIAkJCWJyZWFrOwpAQCAtMTg1LDkgKzE4MiwxMyBAQAogCQlyZXR1cm4gTlVMTDsKIH0KIAotCi1zdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQotc3RhdGljIHZvaWQgaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CitzdGF0aWMgdm9pZCAqaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdChpbnQga2V5aWR4KQoreworCXJldHVybiAodm9pZCAqKTE7Cit9CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQodm9pZCAqcHJpdikKK3sKK30KIAogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfbnVsbCA9IHsKIAkubmFtZQkJCT0gIk5VTEwiLApAQCAtMjA0LDcgKzIwNSw2IEBACiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIH07CiAKLQogc3RhdGljIGludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpCiB7CiAJaW50IHJldCA9IC1FTk9NRU07CkBAIC0yMjIsMTEgKzIyMiwxMCBAQAogCQlrZnJlZShoY3J5cHQpOwogCQloY3J5cHQgPSBOVUxMOwogCX0KLW91dDoKKyAgICAgIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyB2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CkBAIC0yMzcsNyArMjM2LDcgQEAKIAlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0LCBuID0gcHRyLT5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsKIAkgICAgIHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCSAgICAoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopcHRyOwogCQlsaXN0X2RlbChwdHIpOwogCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKIAkJICAgICAgICInJXMnIChkZWluaXQpXG4iLCBhbGctPm9wcy0+bmFtZSk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKaW5kZXggMTFkMTU1Ny4uOGZjMTNmNCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCi0KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIApAQCAtNTUsNyArNTQsNyBAQAogCiAJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KIAl1OCB0eF9iMFtBRVNfQkxPQ0tfTEVOXSwgdHhfYltBRVNfQkxPQ0tfTEVOXSwKLQkJdHhfZVtBRVNfQkxPQ0tfTEVOXSwgdHhfczBbQUVTX0JMT0NLX0xFTl07CisJICAgIHR4X2VbQUVTX0JMT0NLX0xFTl0sIHR4X3MwW0FFU19CTE9DS19MRU5dOwogCXU4IHJ4X2IwW0FFU19CTE9DS19MRU5dLCByeF9iW0FFU19CTE9DS19MRU5dLCByeF9hW0FFU19CTE9DS19MRU5dOwogfTsKIApAQCAtNzUsNyArNzQsNyBAQAogCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0Zm0sICZkc3QsICZzcmMsIEFFU19CTE9DS19MRU4pOwogfQogCi1zdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jY21wX2luaXQoaW50IGtleV9pZHgpCitzdGF0aWMgdm9pZCAqaWVlZTgwMjExX2NjbXBfaW5pdChpbnQga2V5X2lkeCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqcHJpdjsKIApAQCAtOTQsNyArOTMsNyBAQAogCiAJcmV0dXJuIHByaXY7CiAKLWZhaWw6CisgICAgICBmYWlsOgogCWlmIChwcml2KSB7CiAJCWlmIChwcml2LT50Zm0pCiAJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKQEAgLTEwNCw3ICsxMDMsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9jY21wX2RlaW5pdCh2b2lkICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CkBAIC0xMTMsMTkgKzExMSwxNiBAQAogCWtmcmVlKHByaXYpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4b3JfYmxvY2sodTggKmIsIHU4ICphLCBzaXplX3QgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIHhvcl9ibG9jayh1OCAqIGIsIHU4ICogYSwgc2l6ZV90IGxlbikKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCWJbaV0gXj0gYVtpXTsKIH0KIAotCiBzdGF0aWMgdm9pZCBjY21wX2luaXRfYmxvY2tzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkgICAgIHU4ICpwbiwgc2l6ZV90IGRsZW4sIHU4ICpiMCwgdTggKmF1dGgsCi0JCQkgICAgIHU4ICpzMCkKKwkJCSAgICAgdTggKiBwbiwgc2l6ZV90IGRsZW4sIHU4ICogYjAsIHU4ICogYXV0aCwgdTggKiBzMCkKIHsKIAl1OCAqcG9zLCBxYyA9IDA7CiAJc2l6ZV90IGFhZF9sZW47CkBAIC0xNDIsNyArMTM3LDcgQEAKIAlpZiAoYTRfaW5jbHVkZWQpCiAJCWFhZF9sZW4gKz0gNjsKIAlpZiAocWNfaW5jbHVkZWQpIHsKLQkJcG9zID0gKHU4ICopICZoZHItPmFkZHI0OworCQlwb3MgPSAodTggKikgJiBoZHItPmFkZHI0OwogCQlpZiAoYTRfaW5jbHVkZWQpCiAJCQlwb3MgKz0gNjsKIAkJcWMgPSAqcG9zICYgMHgwZjsKQEAgLTE2OSwxNCArMTY0LDE0IEBACiAJICogUUMgKGlmIHByZXNlbnQpCiAJICovCiAJcG9zID0gKHU4ICopIGhkcjsKLQlhYWRbMF0gPSAwOyAvKiBhYWRfbGVuID4+IDggKi8KKwlhYWRbMF0gPSAwOwkJLyogYWFkX2xlbiA+PiA4ICovCiAJYWFkWzFdID0gYWFkX2xlbiAmIDB4ZmY7CiAJYWFkWzJdID0gcG9zWzBdICYgMHg4ZjsKIAlhYWRbM10gPSBwb3NbMV0gJiAweGM3OwogCW1lbWNweShhYWQgKyA0LCBoZHItPmFkZHIxLCAzICogRVRIX0FMRU4pOwotCXBvcyA9ICh1OCAqKSAmaGRyLT5zZXFfY3RsOworCXBvcyA9ICh1OCAqKSAmIGhkci0+c2VxX2N0bDsKIAlhYWRbMjJdID0gcG9zWzBdICYgMHgwZjsKLQlhYWRbMjNdID0gMDsgLyogYWxsIGJpdHMgbWFza2VkICovCisJYWFkWzIzXSA9IDA7CQkvKiBhbGwgYml0cyBtYXNrZWQgKi8KIAltZW1zZXQoYWFkICsgMjQsIDAsIDgpOwogCWlmIChhNF9pbmNsdWRlZCkKIAkJbWVtY3B5KGFhZCArIDI0LCBoZHItPmFkZHI0LCBFVEhfQUxFTik7CkBAIC0xOTYsNyArMTkxLDYgQEAKIAlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7CiB9CiAKLQogc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICprZXkgPSBwcml2OwpAQCAtMjA5LDggKzIwMyw3IEBACiAJdTggKnMwID0ga2V5LT50eF9zMDsKIAogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IENDTVBfSERSX0xFTiB8fAotCSAgICBza2JfdGFpbHJvb20oc2tiKSA8IENDTVBfTUlDX0xFTiB8fAotCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJICAgIHNrYl90YWlscm9vbShza2IpIDwgQ0NNUF9NSUNfTEVOIHx8IHNrYi0+bGVuIDwgaGRyX2xlbikKIAkJcmV0dXJuIC0xOwogCiAJZGF0YV9sZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CkBAIC0yMzAsMTMgKzIyMywxMyBAQAogCSpwb3MrKyA9IGtleS0+dHhfcG5bNV07CiAJKnBvcysrID0ga2V5LT50eF9wbls0XTsKIAkqcG9zKysgPSAwOwotCSpwb3MrKyA9IChrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi87CisJKnBvcysrID0gKGtleS0+a2V5X2lkeCA8PCA2KSB8ICgxIDw8IDUpIC8qIEV4dCBJViBpbmNsdWRlZCAqLyA7CiAJKnBvcysrID0ga2V5LT50eF9wblszXTsKIAkqcG9zKysgPSBrZXktPnR4X3BuWzJdOwogCSpwb3MrKyA9IGtleS0+dHhfcG5bMV07CiAJKnBvcysrID0ga2V5LT50eF9wblswXTsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwga2V5LT50eF9wbiwgZGF0YV9sZW4sIGIwLCBiLCBzMCk7CiAKIAlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOwpAQCAtMjYxLDcgKzI1NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICprZXkgPSBwcml2OwpAQCAtMjgwLDcgKzI3Miw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOwogCWtleWlkeCA9IHBvc1szXTsKIAlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKQEAgLTM2NCw4ICszNTYsNyBAQAogCXJldHVybiBrZXlpZHg7CiB9CiAKLQotc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICogc2VxLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKIAlpbnQga2V5aWR4OwpAQCAtMzk1LDggKzM4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICogc2VxLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKIApAQCAtNDE5LDggKzQwOSw3IEBACiAJcmV0dXJuIENDTVBfVEtfTEVOOwogfQogCi0KLXN0YXRpYyBjaGFyICogaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3N0YXRpYyBjaGFyICppZWVlODAyMTFfY2NtcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpjY21wID0gcHJpdjsKIAlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPUNDTVAga2V5X3NldD0lZCAiCkBAIC00MzYsNyArNDI1LDYgQEAKIAlyZXR1cm4gcDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF9jY21wID0gewogCS5uYW1lCQkJPSAiQ0NNUCIsCiAJLmluaXQJCQk9IGllZWU4MDIxMV9jY21wX2luaXQsCkBAIC00NTMsMTggKzQ0MSwxNSBAQAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiB9OwogCi0KIHN0YXRpYyBpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpCiB7CiAJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOwogfQogCi0KIG1vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KTsKIG1vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwppbmRleCBmOTFkOTJjLi5kNGY5MTY0IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAKLQogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CkBAIC02Miw3ICs2MSw3IEBACiAJdTggcnhfaGRyWzE2XSwgdHhfaGRyWzE2XTsKIH07CiAKLXN0YXRpYyB2b2lkICogaWVlZTgwMjExX3RraXBfaW5pdChpbnQga2V5X2lkeCkKK3N0YXRpYyB2b2lkICppZWVlODAyMTFfdGtpcF9pbml0KGludCBrZXlfaWR4KQogewogCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpwcml2OwogCkBAIC04OCw3ICs4Nyw3IEBACiAKIAlyZXR1cm4gcHJpdjsKIAotZmFpbDoKKyAgICAgIGZhaWw6CiAJaWYgKHByaXYpIHsKIAkJaWYgKHByaXYtPnRmbV9taWNoYWVsKQogCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9taWNoYWVsKTsKQEAgLTEwMCw3ICs5OSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3RraXBfZGVpbml0KHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKl9wcml2ID0gcHJpdjsKQEAgLTExMSw1MSArMTA5LDQyIEBACiAJa2ZyZWUocHJpdik7CiB9CiAKLQogc3RhdGljIGlubGluZSB1MTYgUm90UjEodTE2IHZhbCkKIHsKIAlyZXR1cm4gKHZhbCA+PiAxKSB8ICh2YWwgPDwgMTUpOwogfQogCi0KIHN0YXRpYyBpbmxpbmUgdTggTG84KHUxNiB2YWwpCiB7CiAJcmV0dXJuIHZhbCAmIDB4ZmY7CiB9CiAKLQogc3RhdGljIGlubGluZSB1OCBIaTgodTE2IHZhbCkKIHsKIAlyZXR1cm4gdmFsID4+IDg7CiB9CiAKLQogc3RhdGljIGlubGluZSB1MTYgTG8xNih1MzIgdmFsKQogewogCXJldHVybiB2YWwgJiAweGZmZmY7CiB9CiAKLQogc3RhdGljIGlubGluZSB1MTYgSGkxNih1MzIgdmFsKQogewogCXJldHVybiB2YWwgPj4gMTY7CiB9CiAKLQogc3RhdGljIGlubGluZSB1MTYgTWsxNih1OCBoaSwgdTggbG8pCiB7CiAJcmV0dXJuIGxvIHwgKCgodTE2KSBoaSkgPDwgOCk7CiB9CiAKLQotc3RhdGljIGlubGluZSB1MTYgTWsxNl9sZSh1MTYgKnYpCitzdGF0aWMgaW5saW5lIHUxNiBNazE2X2xlKHUxNiAqIHYpCiB7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KCp2KTsKIH0KIAotCi1zdGF0aWMgY29uc3QgdTE2IFNib3hbMjU2XSA9Ci17CitzdGF0aWMgY29uc3QgdTE2IFNib3hbMjU2XSA9IHsKIAkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKIAkweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKIAkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKQEAgLTE5MCwxNyArMTc5LDE2IEBACiAJMHg4MkMzLCAweDI5QjAsIDB4NUE3NywgMHgxRTExLCAweDdCQ0IsIDB4QThGQywgMHg2REQ2LCAweDJDM0EsCiB9OwogCi0KIHN0YXRpYyBpbmxpbmUgdTE2IF9TXyh1MTYgdikKIHsKIAl1MTYgdCA9IFNib3hbSGk4KHYpXTsKIAlyZXR1cm4gU2JveFtMbzgodildIF4gKCh0IDw8IDgpIHwgKHQgPj4gOCkpOwogfQogCi0KICNkZWZpbmUgUEhBU0UxX0xPT1BfQ09VTlQgOAogCi1zdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTEodTE2ICpUVEFLLCBjb25zdCB1OCAqVEssIGNvbnN0IHU4ICpUQSwgdTMyIElWMzIpCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTEodTE2ICogVFRBSywgY29uc3QgdTggKiBUSywgY29uc3QgdTggKiBUQSwKKwkJCSAgICAgICB1MzIgSVYzMikKIHsKIAlpbnQgaSwgajsKIApAQCAtMjIxLDEzICsyMDksMTIgQEAKIAl9CiB9CiAKLQotc3RhdGljIHZvaWQgdGtpcF9taXhpbmdfcGhhc2UyKHU4ICpXRVBTZWVkLCBjb25zdCB1OCAqVEssIGNvbnN0IHUxNiAqVFRBSywKK3N0YXRpYyB2b2lkIHRraXBfbWl4aW5nX3BoYXNlMih1OCAqIFdFUFNlZWQsIGNvbnN0IHU4ICogVEssIGNvbnN0IHUxNiAqIFRUQUssCiAJCQkgICAgICAgdTE2IElWMTYpCiB7CiAJLyogTWFrZSB0ZW1wb3JhcnkgYXJlYSBvdmVybGFwIFdFUCBzZWVkIHNvIHRoYXQgdGhlIGZpbmFsIGNvcHkgY2FuIGJlCiAJICogYXZvaWRlZCBvbiBsaXR0bGUgZW5kaWFuIGhvc3RzLiAqLwotCXUxNiAqUFBLID0gKHUxNiAqKSAmV0VQU2VlZFs0XTsKKwl1MTYgKlBQSyA9ICh1MTYgKikgJiBXRVBTZWVkWzRdOwogCiAJLyogU3RlcCAxIC0gbWFrZSBjb3B5IG9mIFRUQUsgYW5kIGJyaW5nIGluIFRTQyAqLwogCVBQS1swXSA9IFRUQUtbMF07CkBAIC0yMzgsMTUgKzIyNSwxNSBAQAogCVBQS1s1XSA9IFRUQUtbNF0gKyBJVjE2OwogCiAJLyogU3RlcCAyIC0gOTYtYml0IGJpamVjdGl2ZSBtaXhpbmcgdXNpbmcgUy1ib3ggKi8KLQlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKTsKLQlQUEtbMV0gKz0gX1NfKFBQS1swXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMl0pKTsKLQlQUEtbMl0gKz0gX1NfKFBQS1sxXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNF0pKTsKLQlQUEtbM10gKz0gX1NfKFBQS1syXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNl0pKTsKLQlQUEtbNF0gKz0gX1NfKFBQS1szXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbOF0pKTsKLQlQUEtbNV0gKz0gX1NfKFBQS1s0XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTBdKSk7CisJUFBLWzBdICs9IF9TXyhQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1swXSkpOworCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICYgVEtbMl0pKTsKKwlQUEtbMl0gKz0gX1NfKFBQS1sxXSBeIE1rMTZfbGUoKHUxNiAqKSAmIFRLWzRdKSk7CisJUFBLWzNdICs9IF9TXyhQUEtbMl0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1s2XSkpOworCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gTWsxNl9sZSgodTE2ICopICYgVEtbOF0pKTsKKwlQUEtbNV0gKz0gX1NfKFBQS1s0XSBeIE1rMTZfbGUoKHUxNiAqKSAmIFRLWzEwXSkpOwogCi0JUFBLWzBdICs9IFJvdFIxKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTJdKSk7Ci0JUFBLWzFdICs9IFJvdFIxKFBQS1swXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTRdKSk7CisJUFBLWzBdICs9IFJvdFIxKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmIFRLWzEyXSkpOworCVBQS1sxXSArPSBSb3RSMShQUEtbMF0gXiBNazE2X2xlKCh1MTYgKikgJiBUS1sxNF0pKTsKIAlQUEtbMl0gKz0gUm90UjEoUFBLWzFdKTsKIAlQUEtbM10gKz0gUm90UjEoUFBLWzJdKTsKIAlQUEtbNF0gKz0gUm90UjEoUFBLWzNdKTsKQEAgLTI1Nyw3ICsyNDQsNyBAQAogCVdFUFNlZWRbMF0gPSBIaTgoSVYxNik7CiAJV0VQU2VlZFsxXSA9IChIaTgoSVYxNikgfCAweDIwKSAmIDB4N0Y7CiAJV0VQU2VlZFsyXSA9IExvOChJVjE2KTsKLQlXRVBTZWVkWzNdID0gTG84KChQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzBdKSkgPj4gMSk7CisJV0VQU2VlZFszXSA9IExvOCgoUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICYgVEtbMF0pKSA+PiAxKTsKIAogI2lmZGVmIF9fQklHX0VORElBTgogCXsKQEAgLTI4MSw3ICsyNjgsNyBAQAogCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCiAJCXJldHVybiAtMTsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCWlmICghdGtleS0+dHhfcGhhc2UxX2RvbmUpIHsKIAkJdGtpcF9taXhpbmdfcGhhc2UxKHRrZXktPnR4X3R0YWssIHRrZXktPmtleSwgaGRyLT5hZGRyMiwKIAkJCQkgICB0a2V5LT50eF9pdjMyKTsKQEAgLTI5OCw3ICsyODUsNyBAQAogCSpwb3MrKyA9IHJjNGtleVswXTsKIAkqcG9zKysgPSByYzRrZXlbMV07CiAJKnBvcysrID0gcmM0a2V5WzJdOwotCSpwb3MrKyA9ICh0a2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovOworCSpwb3MrKyA9ICh0a2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovIDsKIAkqcG9zKysgPSB0a2V5LT50eF9pdjMyICYgMHhmZjsKIAkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiA4KSAmIDB4ZmY7CiAJKnBvcysrID0gKHRrZXktPnR4X2l2MzIgPj4gMTYpICYgMHhmZjsKQEAgLTM0MSw3ICszMjgsNyBAQAogCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyA4ICsgNCkKIAkJcmV0dXJuIC0xOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKIAlrZXlpZHggPSBwb3NbM107CiAJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CkBAIC00MjcsOSArNDE0LDggQEAKIAlyZXR1cm4ga2V5aWR4OwogfQogCi0KLXN0YXRpYyBpbnQgbWljaGFlbF9taWMoc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXksIHU4ICprZXksIHU4ICpoZHIsCi0JCSAgICAgICB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWljKQorc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSwgdTggKiBrZXksIHU4ICogaGRyLAorCQkgICAgICAgdTggKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICogbWljKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKIApAQCAtNDUzLDM3ICs0MzksMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWljaGFlbF9taWNfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpoZHIpCitzdGF0aWMgdm9pZCBtaWNoYWVsX21pY19oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKiBoZHIpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjExOwogCi0JaGRyMTEgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWhkcjExID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCXN3aXRjaCAobGUxNl90b19jcHUoaGRyMTEtPmZyYW1lX2N0bCkgJgogCQkoSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUykpIHsKIAljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6Ci0JCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLwotCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsJLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsJLyogU0EgKi8KIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6Ci0JCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLwotCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBTQSAqLworCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjEsIEVUSF9BTEVOKTsJLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsJLyogU0EgKi8KIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTOgotCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KLQkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjQsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7CS8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHI0LCBFVEhfQUxFTik7CS8qIFNBICovCiAJCWJyZWFrOwogCWNhc2UgMDoKLQkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCi0JCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIyLCBFVEhfQUxFTik7IC8qIFNBICovCisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOwkvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOwkvKiBTQSAqLwogCQlicmVhazsKIAl9CiAKLQloZHJbMTJdID0gMDsgLyogcHJpb3JpdHkgKi8KLQloZHJbMTNdID0gaGRyWzE0XSA9IGhkclsxNV0gPSAwOyAvKiByZXNlcnZlZCAqLworCWhkclsxMl0gPSAwOwkJLyogcHJpb3JpdHkgKi8KKwloZHJbMTNdID0gaGRyWzE0XSA9IGhkclsxNV0gPSAwOwkvKiByZXNlcnZlZCAqLwogfQogCi0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwKKwkJCQkgICAgIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCXU4ICpwb3M7CkBAIC01MDQsMTEgKzQ5MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAogc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkgICAgICAgaW50IGtleWlkeCkKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQga2V5aWR4KQogewogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgZXY7CkBAIC01MjQsMTIgKzUwOCwxMSBAQAogCW1lbWNweShldi5zcmNfYWRkci5zYV9kYXRhLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CiAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwogCXdycXUuZGF0YS5sZW5ndGggPSBzaXplb2YoZXYpOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUsICZ3cnF1LCAoY2hhciAqKSAmZXYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUsICZ3cnF1LCAoY2hhciAqKSZldik7CiB9CiAjZWxpZiBXSVJFTEVTU19FWFQgPj0gMTUKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJICAgICAgIGludCBrZXlpZHgpCisJCQkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgaW50IGtleWlkeCkKIHsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJY2hhciBidWZbMTI4XTsKQEAgLTU0MiwxNyArNTI1LDE2IEBACiAJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKIH0KLSNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworI2Vsc2UJCQkJLyogV0lSRUxFU1NfRVhUID49IDE1ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkJICAgICAgaW50IGtleWlkeCkKKwkJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCQkJIGludCBrZXlpZHgpCiB7CiB9Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID49IDE1ICovCi0KKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KIAogc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsCi0JCQkJICAgICBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKKwkJCQkJaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCXU4IG1pY1s4XTsKQEAgLTU2Niw3ICs1NDgsNyBAQAogCQlyZXR1cm4gLTE7CiAJaWYgKG1lbWNtcChtaWMsIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gOCwgOCkgIT0gMCkgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgIgogCQkgICAgICAgIk1TRFUgZnJvbSAiIE1BQ19GTVQgIiBrZXlpZHg9JWRcbiIsCiAJCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIk4vQSIsIE1BQ19BUkcoaGRyLT5hZGRyMiksCkBAIC01ODcsOCArNTY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQorc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKiBzZXEsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCWludCBrZXlpZHg7CkBAIC02MDMsMTAgKzU4NCwxMCBAQAogCWlmIChsZW4gPT0gVEtJUF9LRVlfTEVOKSB7CiAJCW1lbWNweSh0a2V5LT5rZXksIGtleSwgVEtJUF9LRVlfTEVOKTsKIAkJdGtleS0+a2V5X3NldCA9IDE7Ci0JCXRrZXktPnR4X2l2MTYgPSAxOyAvKiBUU0MgaXMgaW5pdGlhbGl6ZWQgdG8gMSAqLworCQl0a2V5LT50eF9pdjE2ID0gMTsJLyogVFNDIGlzIGluaXRpYWxpemVkIHRvIDEgKi8KIAkJaWYgKHNlcSkgewogCQkJdGtleS0+cnhfaXYzMiA9IChzZXFbNV0gPDwgMjQpIHwgKHNlcVs0XSA8PCAxNikgfAotCQkJCShzZXFbM10gPDwgOCkgfCBzZXFbMl07CisJCQkgICAgKHNlcVszXSA8PCA4KSB8IHNlcVsyXTsKIAkJCXRrZXktPnJ4X2l2MTYgPSAoc2VxWzFdIDw8IDgpIHwgc2VxWzBdOwogCQl9CiAJfSBlbHNlIGlmIChsZW4gPT0gMCkKQEAgLTYxNyw4ICs1OTgsNyBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqIHNlcSwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CiAKQEAgLTY0Nyw4ICs2MjcsNyBAQAogCXJldHVybiBUS0lQX0tFWV9MRU47CiB9CiAKLQotc3RhdGljIGNoYXIgKiBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQorc3RhdGljIGNoYXIgKmllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRraXAgPSBwcml2OwogCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9VEtJUCBrZXlfc2V0PSVkICIKQEAgLTY3NCw3ICs2NTMsNiBAQAogCXJldHVybiBwOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3RraXAgPSB7CiAJLm5hbWUJCQk9ICJUS0lQIiwKIAkuaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfaW5pdCwKQEAgLTY4NiwyMyArNjY0LDIwIEBACiAJLnNldF9rZXkJCT0gaWVlZTgwMjExX3RraXBfc2V0X2tleSwKIAkuZ2V0X2tleQkJPSBpZWVlODAyMTFfdGtpcF9nZXRfa2V5LAogCS5wcmludF9zdGF0cwkJPSBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cywKLQkuZXh0cmFfcHJlZml4X2xlbgk9IDQgKyA0LCAvKiBJViArIEV4dElWICovCi0JLmV4dHJhX3Bvc3RmaXhfbGVuCT0gOCArIDQsIC8qIE1JQyArIElDViAqLwotCS5vd25lcgkJICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gNCArIDQsCS8qIElWICsgRXh0SVYgKi8KKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSA4ICsgNCwJLyogTUlDICsgSUNWICovCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIH07CiAKLQogc3RhdGljIGludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCkKIHsKIAlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfdGtpcCk7CiB9CiAKLQogbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQpOwogbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwppbmRleCBiZWMxZDM0Li5iNGQyNTE0IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCi0KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgpAQCAtMjksNyArMjgsNiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBXRVAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotCiBzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhIHsKIAl1MzIgaXY7CiAjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCkBAIC0zOSw4ICszNyw3IEBACiAJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKIH07CiAKLQotc3RhdGljIHZvaWQgKiBwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKK3N0YXRpYyB2b2lkICpwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpwcml2OwogCkBAIC02Miw3ICs1OSw3IEBACiAKIAlyZXR1cm4gcHJpdjsKIAotZmFpbDoKKyAgICAgIGZhaWw6CiAJaWYgKHByaXYpIHsKIAkJaWYgKHByaXYtPnRmbSkKIAkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm0pOwpAQCAtNzEsNyArNjgsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0KIHN0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OwpAQCAtODAsNyArNzYsNiBAQAogCWtmcmVlKHByaXYpOwogfQogCi0KIC8qIFBlcmZvcm0gV0VQIGVuY3J5cHRpb24gb24gZ2l2ZW4gc2tiIHRoYXQgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgb2YgaGVhZHJvb20KICAqIGZvciBJViBhbmQgNCBieXRlcyBvZiB0YWlscm9vbSBmb3IgSUNWLiBCb3RoIElWIGFuZCBJQ1Ygd2lsbCBiZSB0cmFuc21pdHRlZCwKICAqIHNvIHRoZSBwYXlsb2FkIGxlbmd0aCBpbmNyZWFzZXMgd2l0aCA4IGJ5dGVzLgpAQCAtMTQzLDcgKzEzOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBidWZmZXIuIEJ1ZmZlciBpbmNsdWRlcyB3aG9sZSBXRVAgcGFydCBvZgogICogdGhlIGZyYW1lOiBJViAoNCBieXRlcyksIGVuY3J5cHRlZCBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCBoZWFkZXIpLAogICogSUNWICg0IGJ5dGVzKS4gbGVuIGluY2x1ZGVzIGJvdGggSVYgYW5kIElDVi4KQEAgLTIwMiw4ICsxOTYsNyBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgcHJpc20yX3dlcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKiBzZXEsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKIApAQCAtMjE2LDggKzIwOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQorc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqIHNlcSwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OwogCkBAIC0yMjksMTYgKzIyMSwxMyBAQAogCXJldHVybiB3ZXAtPmtleV9sZW47CiB9CiAKLQotc3RhdGljIGNoYXIgKiBwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCitzdGF0aWMgY2hhciAqcHJpc20yX3dlcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7Ci0JcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1XRVAgbGVuPSVkXG4iLAotCQkgICAgIHdlcC0+a2V5X2lkeCwgd2VwLT5rZXlfbGVuKTsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVdFUCBsZW49JWRcbiIsIHdlcC0+a2V5X2lkeCwgd2VwLT5rZXlfbGVuKTsKIAlyZXR1cm4gcDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF93ZXAgPSB7CiAJLm5hbWUJCQk9ICJXRVAiLAogCS5pbml0CQkJPSBwcmlzbTJfd2VwX2luaXQsCkBAIC0yNTAsMjMgKzIzOSwyMCBAQAogCS5zZXRfa2V5CQk9IHByaXNtMl93ZXBfc2V0X2tleSwKIAkuZ2V0X2tleQkJPSBwcmlzbTJfd2VwX2dldF9rZXksCiAJLnByaW50X3N0YXRzCQk9IHByaXNtMl93ZXBfcHJpbnRfc3RhdHMsCi0JLmV4dHJhX3ByZWZpeF9sZW4JPSA0LCAvKiBJViAqLwotCS5leHRyYV9wb3N0Zml4X2xlbgk9IDQsIC8qIElDViAqLworCS5leHRyYV9wcmVmaXhfbGVuCT0gNCwJLyogSVYgKi8KKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSA0LAkvKiBJQ1YgKi8KIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogfTsKIAotCiBzdGF0aWMgaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKQogewogCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOwogfQogCi0KIG1vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQpOwogbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IDU1M2FjYjIuLjAzYTQ3MzQgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC01NCw3ICs1NCw4IEBACiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIjgwMi4xMSBkYXRhL21hbmFnZW1lbnQvY29udHJvbCBzdGFjayIpOwotTU9EVUxFX0FVVEhPUigiQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnBvcmF0aW9uIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SCisgICAgKCJDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBEUlZfTkFNRSAiaWVlZTgwMjExIgpAQCAtNjQsOSArNjUsOSBAQAogCWlmIChpZWVlLT5uZXR3b3JrcykKIAkJcmV0dXJuIDA7CiAKLQlpZWVlLT5uZXR3b3JrcyA9IGttYWxsb2MoCi0JCU1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayksCi0JCUdGUF9LRVJORUwpOworCWllZWUtPm5ldHdvcmtzID0KKwkgICAga21hbGxvYyhNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspLAorCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpZWVlLT5uZXR3b3JrcykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCiAJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOwpAQCAtOTQsMTAgKzk1LDEwIEBACiAJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19saXN0KTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05FVFdPUktfQ09VTlQ7IGkrKykKLQkJbGlzdF9hZGRfdGFpbCgmaWVlZS0+bmV0d29ya3NbaV0ubGlzdCwgJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmaWVlZS0+bmV0d29ya3NbaV0ubGlzdCwKKwkJCSAgICAgICZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7CiB9CiAKLQogc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CkBAIC0xMTgsOCArMTE5LDcgQEAKIAogCWVyciA9IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShpZWVlKTsKIAlpZiAoZXJyKSB7Ci0JCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGJlYWNvbiBzdG9yYWdlOiAlZFxuIiwKLQkJCQllcnIpOworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBiZWFjb24gc3RvcmFnZTogJWRcbiIsIGVycik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAlpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShpZWVlKTsKQEAgLTEzMiw3ICsxMzIsNyBAQAogCS8qIERlZmF1bHQgdG8gZW5hYmxpbmcgZnVsbCBvcGVuIFdFUCB3aXRoIGhvc3QgYmFzZWQgZW5jcnlwdC9kZWNyeXB0ICovCiAJaWVlZS0+aG9zdF9lbmNyeXB0ID0gMTsKIAlpZWVlLT5ob3N0X2RlY3J5cHQgPSAxOwotCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCisJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CS8qIERlZmF1bHQgdG8gc3VwcG9ydGluZyA4MDIuMXggKi8KIAogCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7CiAJaW5pdF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKQEAgLTE0MSwyMSArMTQxLDIwIEBACiAKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bG9jayk7CiAKLSAJaWVlZS0+d3BhX2VuYWJsZWQgPSAwOwotIAlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IDA7Ci0gCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOwotIAlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSAwOwotIAlpZWVlLT5pZWVlODAyXzF4ID0gMTsKKwlpZWVlLT53cGFfZW5hYmxlZCA9IDA7CisJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSAwOworCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOworCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CisJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CiAKIAlyZXR1cm4gZGV2OwogCi0gZmFpbGVkOgorICAgICAgZmFpbGVkOgogCWlmIChkZXYpCiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLQogdm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE5Myw3ICsxOTIsNyBAQAogCXJldHVybiBzbnByaW50ZihwYWdlLCBjb3VudCwgIjB4JTA4WFxuIiwgaWVlZTgwMjExX2RlYnVnX2xldmVsKTsKIH0KIAotc3RhdGljIGludCBzdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKK3N0YXRpYyBpbnQgc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCWNoYXIgYnVmW10gPSAiMHgwMDAwMDAwMCI7CkBAIC0yNjQsMTMgKzI2MywxMiBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG91dHB1dCBtYXNrIik7CiAKLQogbW9kdWxlX2V4aXQoaWVlZTgwMjExX2V4aXQpOwogbW9kdWxlX2luaXQoaWVlZTgwMjExX2luaXQpOwogI2VuZGlmCiAKLQotY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKK2NvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKQorewogCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07CiAJY29uc3QgY2hhciAqcyA9IGVzc2lkOwogCWNoYXIgKmQgPSBlc2NhcGVkOwpAQCAtMjgwLDcgKzI3OCw3IEBACiAJCXJldHVybiBlc2NhcGVkOwogCX0KIAotCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KSBJV19FU1NJRF9NQVhfU0laRSk7CiAJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CiAJCWlmICgqcyA9PSAnXDAnKSB7CiAJCQkqZCsrID0gJ1xcJzsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IGE1OTA1ZjUuLmY3ZGNkODUgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtNTIsMTEgKzUyLDE0IEBACiAJbmV0aWZfcngoc2tiKTsKIH0KIAotCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKgotaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdW5zaWduZWQgaW50IHNlcSwKLQkJCSAgdW5zaWduZWQgaW50IGZyYWcsIHU4ICpzcmMsIHU4ICpkc3QpCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICppZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKHN0cnVjdAorCQkJCQkJCSAgICAgIGllZWU4MDIxMV9kZXZpY2UKKwkJCQkJCQkgICAgICAqaWVlZSwKKwkJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2VxLAorCQkJCQkJCSAgICAgIHVuc2lnbmVkIGludCBmcmFnLAorCQkJCQkJCSAgICAgIHU4ICogc3JjLAorCQkJCQkJCSAgICAgIHU4ICogZHN0KQogewogCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CiAJaW50IGk7CkBAIC02NSwxMCArNjgsOSBAQAogCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW2ldOwogCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmCiAJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5maXJzdF9mcmFnX3RpbWUgKyAyICogSFopKSB7Ci0JCQlJRUVFODAyMTFfREVCVUdfRlJBRygKLQkJCQkiZXhwaXJpbmcgZnJhZ21lbnQgY2FjaGUgZW50cnkgIgotCQkJCSJzZXE9JXUgbGFzdF9mcmFnPSV1XG4iLAotCQkJCWVudHJ5LT5zZXEsIGVudHJ5LT5sYXN0X2ZyYWcpOworCQkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoImV4cGlyaW5nIGZyYWdtZW50IGNhY2hlIGVudHJ5ICIKKwkJCQkJICAgICAic2VxPSV1IGxhc3RfZnJhZz0ldVxuIiwKKwkJCQkJICAgICBlbnRyeS0+c2VxLCBlbnRyeS0+bGFzdF9mcmFnKTsKIAkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOwogCQkJZW50cnktPnNrYiA9IE5VTEw7CiAJCX0KQEAgLTg0LDkgKzg2LDggQEAKIH0KIAogLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgotaWVlZTgwMjExX2ZyYWdfY2FjaGVfZ2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9mcmFnX2NhY2hlX2dldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJdTE2IHNjOwpAQCAtMTAxLDkgKzEwMiw5IEBACiAJCS8qIFJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIGZpdCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLwogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGllZWUtPmRldi0+bXR1ICsKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyKSArCi0JCQkJICAgIDggLyogTExDICovICsKLQkJCQkgICAgMiAvKiBhbGlnbm1lbnQgKi8gKwotCQkJCSAgICA4IC8qIFdFUCAqLyArIEVUSF9BTEVOIC8qIFdEUyAqLyk7CisJCQkJICAgIDggLyogTExDICovICArCisJCQkJICAgIDIgLyogYWxpZ25tZW50ICovICArCisJCQkJICAgIDggLyogV0VQICovICArIEVUSF9BTEVOIC8qIFdEUyAqLyApOwogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIApAQCAtMTM1LDcgKzEzNiw2IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KIHN0YXRpYyBpbnQgaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKQEAgLTE1MSw5ICsxNTEsOCBAQAogCQkJCQkgIGhkci0+YWRkcjEpOwogCiAJaWYgKGVudHJ5ID09IE5VTEwpIHsKLQkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCi0JCQkiY291bGQgbm90IGludmFsaWRhdGUgZnJhZ21lbnQgY2FjaGUgIgotCQkJImVudHJ5IChzZXE9JXUpXG4iLCBzZXEpOworCQlJRUVFODAyMTFfREVCVUdfRlJBRygiY291bGQgbm90IGludmFsaWRhdGUgZnJhZ21lbnQgY2FjaGUgIgorCQkJCSAgICAgImVudHJ5IChzZXE9JXUpXG4iLCBzZXEpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNjEsNyArMTYwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAjaWZkZWYgTk9UX1lFVAogLyogaWVlZTgwMjExX3J4X2ZyYW1lX21ndG10CiAgKgpAQCAtMjAxLDcgKzE5OSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCSAgICBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CiAJCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKIAkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCkBAIC0yMTksMTQgKzIxNywxMyBAQAogfQogI2VuZGlmCiAKLQogLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KIC8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdID0KLXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworCiAvKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgYnJpZGdlX3R1bm5lbF9oZWFkZXJbXSA9Ci17IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjggfTsKKyAgICB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjggfTsKIC8qIE5vIGVuY2Fwc3VsYXRpb24gaGVhZGVyIGlmIEV0aGVyVHlwZSA8IDB4NjAwICg9bGVuZ3RoKSAqLwogCiAvKiBDYWxsZWQgYnkgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQgKi8KQEAgLTI0MSw3ICsyMzgsNyBAQAogCWlmIChza2ItPmxlbiA8IDI0KQogCQlyZXR1cm4gMDsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOwogCiAJLyogY2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgdW5pY2FzdCBmcmFtZSB0byB1cyAqLwpAQCAtMjcxLDcgKzI2OCw3IEBACiAKIC8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCiBzdGF0aWMgaW5saW5lIGludAotaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IsCitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKQEAgLTI4MCwxMiArMjc3LDExIEBACiAJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1ID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKIAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUAotCWlmIChpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyAmJgotCSAgICBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7CisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCiAJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVCAiXG4iLApAQCAtMjk5LDkgKzI5NSw4IEBACiAJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1KHNrYiwgaGRybGVuLCBjcnlwdC0+cHJpdik7CiAJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CiAJaWYgKHJlcyA8IDApIHsKLQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCi0JCQkiZGVjcnlwdGlvbiBmYWlsZWQgKFNBPSIgTUFDX0ZNVAotCQkJIikgcmVzPSVkXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCByZXMpOworCQlJRUVFODAyMTFfREVCVUdfRFJPUCgiZGVjcnlwdGlvbiBmYWlsZWQgKFNBPSIgTUFDX0ZNVAorCQkJCSAgICAgIikgcmVzPSVkXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCByZXMpOwogCQlpZiAocmVzID09IC0yKQogCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIElDViAiCiAJCQkJCSAgICAgIm1pc21hdGNoIChrZXkgJWQpXG4iLApAQCAtMzEzLDExICszMDgsMTEgQEAKIAlyZXR1cm4gcmVzOwogfQogCi0KIC8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCiBzdGF0aWMgaW5saW5lIGludAotaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgaW50IGtleWlkeCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK2llZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0X21zZHUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJaW50IHJlcywgaGRybGVuOwpAQCAtMzI1LDcgKzMyMCw3IEBACiAJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1ID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKIAogCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOwpAQCAtMzQxLDcgKzMzNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgogICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCkBAIC0zNzMsOCArMzY3LDcgQEAKIAlzdGF0cyA9ICZpZWVlLT5zdGF0czsKIAogCWlmIChza2ItPmxlbiA8IDEwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogU0tCIGxlbmd0aCA8IDEwXG4iLCBkZXYtPm5hbWUpOwogCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJfQogCkBAIC0zOTksOCArMzkyLDggQEAKIAkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCiAJCXdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBoZHItPmFkZHIyLCAmd3N0YXRzKTsKIAl9Ci0jZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTUgKi8KKyNlbmRpZgkJCQkvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgPiAxNSAqLwogCWhvc3RhcF91cGRhdGVfcnhfc3RhdHMobG9jYWwtPmFwLCBoZHIsIHJ4X3N0YXRzKTsKICNlbmRpZgogCkBAIC00MjksOCArNDIyLDggQEAKIAkJICogc3RhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBXRVAga2V5IG1hcHBpbmcpLiAqLwogCiAJCWlmICghKGhkci0+YWRkcjFbMF0gJiAweDAxKSB8fCBsb2NhbC0+YmNyeF9zdGFfa2V5KQotCQkJKHZvaWQpIGhvc3RhcF9oYW5kbGVfc3RhX2NyeXB0byhsb2NhbCwgaGRyLCAmY3J5cHQsCi0JCQkJCQkJJnN0YSk7CisJCQkodm9pZClob3N0YXBfaGFuZGxlX3N0YV9jcnlwdG8obG9jYWwsIGhkciwgJmNyeXB0LAorCQkJCQkJICAgICAgICZzdGEpOwogI2VuZGlmCiAKIAkJLyogYWxsb3cgTlVMTCBkZWNyeXB0IHRvIGluZGljYXRlIGFuIHN0YXRpb24gc3BlY2lmaWMgb3ZlcnJpZGUKQEAgLTQ1MSwxMyArNDQ0LDExIEBACiAJCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJCX0KIAl9Ci0KICNpZmRlZiBOT1RfWUVUCiAJaWYgKHR5cGUgIT0gV0xBTl9GQ19UWVBFX0RBVEEpIHsKIAkJaWYgKHR5cGUgPT0gV0xBTl9GQ19UWVBFX01HTVQgJiYgc3R5cGUgPT0gV0xBTl9GQ19TVFlQRV9BVVRIICYmCiAJCSAgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCAmJiBpZWVlLT5ob3N0X2RlY3J5cHQgJiYKLQkJICAgIChrZXlpZHggPSBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KSkgPCAwKQotCQl7CisJCSAgICAoa2V5aWR4ID0gaG9zdGFwX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gZGVjcnlwdCBtZ210OjphdXRoICIKIAkJCSAgICAgICAiZnJvbSAiIE1BQ19GTVQgIlxuIiwgZGV2LT5uYW1lLAogCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOwpAQCAtNTA3LDkgKzQ5OCw5IEBACiAJfQogCiAJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgIXdkcyAmJgotCSAgICAoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09IElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgotCSAgICBpZWVlLT5zdGFkZXYgJiYKLQkgICAgbWVtY21wKGhkci0+YWRkcjIsIGllZWUtPmFzc29jX2FwX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJICAgIChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkgICAgSUVFRTgwMjExX0ZDVExfRlJPTURTICYmIGllZWUtPnN0YWRldgorCSAgICAmJiBtZW1jbXAoaGRyLT5hZGRyMiwgaWVlZS0+YXNzb2NfYXBfYWRkciwgRVRIX0FMRU4pID09IDApIHsKIAkJLyogRnJhbWUgZnJvbSBCU1NJRCBvZiB0aGUgQVAgZm9yIHdoaWNoIHdlIGFyZSBhIGNsaWVudCAqLwogCQlza2ItPmRldiA9IGRldiA9IGllZWUtPnN0YWRldjsKIAkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CkBAIC01MjEsOCArNTEyLDcgQEAKIAogI2lmZGVmIE5PVF9ZRVQKIAlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgfHwKLQkgICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQpICYmCi0JICAgICFmcm9tX2Fzc29jX2FwKSB7CisJICAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfUkVQRUFUKSAmJiAhZnJvbV9hc3NvY19hcCkgewogCQlzd2l0Y2ggKGhvc3RhcF9oYW5kbGVfc3RhX3J4KGllZWUsIGRldiwgc2tiLCByeF9zdGF0cywKIAkJCQkJICAgICB3ZHMgIT0gTlVMTCkpIHsKIAkJY2FzZSBBUF9SWF9DT05USU5VRV9OT1RfQVVUSE9SSVpFRDoKQEAgLTU0NiwxMSArNTM2LDEwIEBACiAJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTCAmJgogCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwpIHsKIAkJaWYgKHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQykKLQkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAotCQkJCSJSWDogZHJvcHBlZCBkYXRhIGZyYW1lICIKLQkJCQkid2l0aCBubyBkYXRhICh0eXBlPTB4JTAyeCwgIgotCQkJCSJzdWJ0eXBlPTB4JTAyeCwgbGVuPSVkKVxuIiwKLQkJCQl0eXBlLCBzdHlwZSwgc2tiLT5sZW4pOworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgorCQkJCQkgICAgICJ3aXRoIG5vIGRhdGEgKHR5cGU9MHglMDJ4LCAiCisJCQkJCSAgICAgInN1YnR5cGU9MHglMDJ4LCBsZW49JWQpXG4iLAorCQkJCQkgICAgIHR5cGUsIHN0eXBlLCBza2ItPmxlbik7CiAJCWdvdG8gcnhfZHJvcHBlZDsKIAl9CiAKQEAgLTU2MCw3ICs1NDksNyBAQAogCSAgICAoa2V5aWR4ID0gaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkKIAkJZ290byByeF9kcm9wcGVkOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAKIAkvKiBza2I6IGhkciArIChwb3NzaWJseSBmcmFnbWVudGVkKSBwbGFpbnRleHQgcGF5bG9hZCAqLwogCS8vIFBSOiBGSVhNRTogaG9zdGFwIGhhcyBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgaW4gdGhlICJpZiIgYmVsb3c6CkBAIC02MTQsNyArNjAzLDcgQEAKIAkJLyogdGhpcyB3YXMgdGhlIGxhc3QgZnJhZ21lbnQgYW5kIHRoZSBmcmFtZSB3aWxsIGJlCiAJCSAqIGRlbGl2ZXJlZCwgc28gcmVtb3ZlIHNrYiBmcm9tIGZyYWdtZW50IGNhY2hlICovCiAJCXNrYiA9IGZyYWdfc2tiOwotCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKIAl9CiAKQEAgLTYyNCwyOCArNjEzLDI2IEBACiAJICAgIGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0X21zZHUoaWVlZSwgc2tiLCBrZXlpZHgsIGNyeXB0KSkKIAkJZ290byByeF9kcm9wcGVkOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpICYmICFpZWVlLT5vcGVuX3dlcCkgewotCQlpZiAoLyppZWVlLT5pZWVlODAyXzF4ICYmKi8KLQkJICAgIGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IpKSB7CisJCWlmICgJCS8qaWVlZS0+aWVlZTgwMl8xeCAmJiAqLworCQkJICAgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYikpIHsKIAkJCS8qIHBhc3MgdW5lbmNyeXB0ZWQgRUFQT0wgZnJhbWVzIGV2ZW4gaWYgZW5jcnlwdGlvbiBpcwogCQkJICogY29uZmlndXJlZCAqLwogCQl9IGVsc2UgewotCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCi0JCQkJImVuY3J5cHRpb24gY29uZmlndXJlZCwgYnV0IFJYICIKLQkJCQkiZnJhbWUgbm90IGVuY3J5cHRlZCAoU0E9IiBNQUNfRk1UICIpXG4iLAotCQkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoImVuY3J5cHRpb24gY29uZmlndXJlZCwgYnV0IFJYICIKKwkJCQkJICAgICAiZnJhbWUgbm90IGVuY3J5cHRlZCAoU0E9IiBNQUNfRk1UCisJCQkJCSAgICAgIilcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOwogCQkJZ290byByeF9kcm9wcGVkOwogCQl9CiAJfQogCiAJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpICYmICFpZWVlLT5vcGVuX3dlcCAmJgogCSAgICAhaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYikpIHsKLQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCi0JCQkiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKLQkJCSJmcmFtZSBmcm9tICIgTUFDX0ZNVAotCQkJIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKLQkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQlJRUVFODAyMTFfREVCVUdfRFJPUCgiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKKwkJCQkgICAgICJmcmFtZSBmcm9tICIgTUFDX0ZNVAorCQkJCSAgICAgIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKKwkJCQkgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOwogCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJfQogCkBAIC02NzMsOCArNjYwLDcgQEAKIAkJfSBlbHNlIGlmICghZnJhbWVfYXV0aG9yaXplZCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcm9wcGVkIGZyYW1lIGZyb20gIgogCQkJICAgICAgICJ1bmF1dGhvcml6ZWQgcG9ydCAoSUVFRSA4MDIuMVgpOiAiCi0JCQkgICAgICAgImV0aGVydHlwZT0weCUwNHhcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBldGhlcnR5cGUpOworCQkJICAgICAgICJldGhlcnR5cGU9MHglMDR4XG4iLCBkZXYtPm5hbWUsIGV0aGVydHlwZSk7CiAJCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJCX0KIAl9CkBAIC03MDIsOCArNjg4LDcgQEAKIAogI2lmZGVmIE5PVF9ZRVQKIAlpZiAod2RzICYmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09Ci0JCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJgotCSAgICBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CisJCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJiBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CiAJCS8qIE5vbi1zdGFuZGFyZCBmcmFtZTogZ2V0IGFkZHI0IGZyb20gaXRzIGJvZ3VzIGxvY2F0aW9uIGFmdGVyCiAJCSAqIHRoZSBwYXlsb2FkICovCiAJCW1lbWNweShza2ItPmRhdGEgKyBFVEhfQUxFTiwKQEAgLTcxNiw4ICs3MDEsNyBAQAogCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAogI2lmZGVmIE5PVF9ZRVQKLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhd2RzICYmCi0JICAgIGllZWUtPmFwLT5icmlkZ2VfcGFja2V0cykgeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYgaWVlZS0+YXAtPmJyaWRnZV9wYWNrZXRzKSB7CiAJCWlmIChkc3RbMF0gJiAweDAxKSB7CiAJCQkvKiBjb3B5IG11bHRpY2FzdCBmcmFtZSBib3RoIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZAogCQkJICogdG8gdGhlIHdpcmVsZXNzIG1lZGlhICovCkBAIC03NDMsMjUgKzcyNywyNCBAQAogCQlza2IyLT5kZXYgPSBkZXY7CiAJCWRldl9xdWV1ZV94bWl0KHNrYjIpOwogCX0KLQogI2VuZGlmCiAKIAlpZiAoc2tiKSB7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOwogCQlza2ItPmRldiA9IGRldjsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLwogCQluZXRpZl9yeChza2IpOwogCX0KIAotIHJ4X2V4aXQ6CisgICAgICByeF9leGl0OgogI2lmZGVmIE5PVF9ZRVQKIAlpZiAoc3RhKQogCQlob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHN0YSk7CiAjZW5kaWYKIAlyZXR1cm4gMTsKIAotIHJ4X2Ryb3BwZWQ6CisgICAgICByeF9kcm9wcGVkOgogCXN0YXRzLT5yeF9kcm9wcGVkKys7CiAKIAkvKiBSZXR1cm5pbmcgMCBpbmRpY2F0ZXMgdG8gY2FsbGVyIHRoYXQgd2UgaGF2ZSBub3QgaGFuZGxlZCB0aGUgU0tCLS0KQEAgLTc4NSwyMiArNzY4LDIxIEBACiAJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CiAJCXJldHVybiAxOwogCX0KLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtfaW5pdCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCi0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQorc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKKwkJCQkJICpiZWFjb24sCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKIHsKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCiAJY2hhciByYXRlc19zdHJbNjRdOwogCWNoYXIgKnA7CiAjZW5kaWYKIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OwotIAl1MTYgbGVmdDsKKwl1MTYgbGVmdDsKIAl1OCBpOwogCiAJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLwpAQCAtODEwLDcgKzc5Miw3IEBACiAJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGJlYWNvbi0+dGltZV9zdGFtcFswXTsKIAluZXR3b3JrLT50aW1lX3N0YW1wWzFdID0gYmVhY29uLT50aW1lX3N0YW1wWzFdOwogCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGJlYWNvbi0+YmVhY29uX2ludGVydmFsOwotCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7Ki8KKwkvKiBXaGVyZSB0byBwdWxsIHRoaXM/IGJlYWNvbi0+bGlzdGVuX2ludGVydmFsOyAqLwogCW5ldHdvcmstPmxpc3Rlbl9pbnRlcnZhbCA9IDB4MEE7CiAJbmV0d29yay0+cmF0ZXNfbGVuID0gbmV0d29yay0+cmF0ZXNfZXhfbGVuID0gMDsKIAluZXR3b3JrLT5sYXN0X2Fzc29jaWF0ZSA9IDA7CkBAIC04MjQsMTggKzgwNiwyMCBAQAogCX0gZWxzZQogCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19DQ0s7CiAKLSAJbmV0d29yay0+d3BhX2llX2xlbiA9IDA7Ci0gCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOworCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOworCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOwogCi0gCWluZm9fZWxlbWVudCA9ICZiZWFjb24tPmluZm9fZWxlbWVudDsKKwlpbmZvX2VsZW1lbnQgPSAmYmVhY29uLT5pbmZvX2VsZW1lbnQ7CiAJbGVmdCA9IHN0YXRzLT5sZW4gLSAoKHZvaWQgKilpbmZvX2VsZW1lbnQgLSAodm9pZCAqKWJlYWNvbik7CiAJd2hpbGUgKGxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikpIHsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsgaW5mb19lbGVtZW50LT5sZW4gPiBsZWZ0KSB7Ci0JCQlJRUVFODAyMTFfREVCVUdfU0NBTigiU0NBTjogcGFyc2UgZmFpbGVkOiBpbmZvX2VsZW1lbnQtPmxlbiArIDIgPiBsZWZ0IDogaW5mb19lbGVtZW50LT5sZW4rMj0lWmQgbGVmdD0lZC5cbiIsCi0JCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4gKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpLAotCQkJCQkgICAgIGxlZnQpOworCQlpZiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKworCQkgICAgaW5mb19lbGVtZW50LT5sZW4gPiBsZWZ0KSB7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTgorCQkJICAgICgiU0NBTjogcGFyc2UgZmFpbGVkOiBpbmZvX2VsZW1lbnQtPmxlbiArIDIgPiBsZWZ0IDogaW5mb19lbGVtZW50LT5sZW4rMj0lWmQgbGVmdD0lZC5cbiIsCisJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuICsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSwgbGVmdCk7CiAJCQlyZXR1cm4gMTsKLSAgICAgICAgICAgICAgIAl9CisJCX0KIAogCQlzd2l0Y2ggKGluZm9fZWxlbWVudC0+aWQpIHsKIAkJY2FzZSBNRklFX1RZUEVfU1NJRDoKQEAgLTg0NiwxMCArODMwLDExIEBACiAJCQl9CiAKIAkJCW5ldHdvcmstPnNzaWRfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLAotCQkJCQkJKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKLQkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsIG5ldHdvcmstPnNzaWRfbGVuKTsKLSAgICAgICAgCQlpZiAobmV0d29yay0+c3NpZF9sZW4gPCBJV19FU1NJRF9NQVhfU0laRSkKLSAgICAgICAgICAgICAgICAJCW1lbXNldChuZXR3b3JrLT5zc2lkICsgbmV0d29yay0+c3NpZF9sZW4sIDAsCisJCQkJCQkodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkgICAgICAgbmV0d29yay0+c3NpZF9sZW4pOworCQkJaWYgKG5ldHdvcmstPnNzaWRfbGVuIDwgSVdfRVNTSURfTUFYX1NJWkUpCisJCQkJbWVtc2V0KG5ldHdvcmstPnNzaWQgKyBuZXR3b3JrLT5zc2lkX2xlbiwgMCwKIAkJCQkgICAgICAgSVdfRVNTSURfTUFYX1NJWkUgLSBuZXR3b3JrLT5zc2lkX2xlbik7CiAKIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfU1NJRDogJyVzJyBsZW49JWQuXG4iLApAQCAtODYwLDE4ICs4NDUsMjMgQEAKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCiAJCQlwID0gcmF0ZXNfc3RyOwogI2VuZGlmCi0JCQluZXR3b3JrLT5yYXRlc19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sIE1BWF9SQVRFU19MRU5HVEgpOworCQkJbmV0d29yay0+cmF0ZXNfbGVuID0KKwkJCSAgICBtaW4oaW5mb19lbGVtZW50LT5sZW4sIE1BWF9SQVRFU19MRU5HVEgpOwogCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2xlbjsgaSsrKSB7CiAJCQkJbmV0d29yay0+cmF0ZXNbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwotCQkJCXAgKz0gc25wcmludGYocCwgc2l6ZW9mKHJhdGVzX3N0cikgLSAocCAtIHJhdGVzX3N0ciksICIlMDJYICIsIG5ldHdvcmstPnJhdGVzW2ldKTsKKwkJCQlwICs9IHNucHJpbnRmKHAsCisJCQkJCSAgICAgIHNpemVvZihyYXRlc19zdHIpIC0gKHAgLQorCQkJCQkJCQkgICByYXRlc19zdHIpLAorCQkJCQkgICAgICAiJTAyWCAiLCBuZXR3b3JrLT5yYXRlc1tpXSk7CiAjZW5kaWYKLQkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZShpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUKKwkJCQkgICAgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKIAkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKIAkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCiAJCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQogCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KLQkJCQkJCQl+TkVUV09SS19IQVNfQ0NLOworCQkJCQkJICAgIH5ORVRXT1JLX0hBU19DQ0s7CiAJCQkJfQogCQkJfQogCkBAIC04ODMsMTggKzg3MywyMyBAQAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKIAkJCXAgPSByYXRlc19zdHI7CiAjZW5kaWYKLQkJCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX1JBVEVTX0VYX0xFTkdUSCk7CisJCQluZXR3b3JrLT5yYXRlc19leF9sZW4gPQorCQkJICAgIG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX1JBVEVTX0VYX0xFTkdUSCk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBpKyspIHsKIAkJCQluZXR3b3JrLT5yYXRlc19leFtpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0JCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwgbmV0d29yay0+cmF0ZXNbaV0pOworCQkJCXAgKz0gc25wcmludGYocCwKKwkJCQkJICAgICAgc2l6ZW9mKHJhdGVzX3N0cikgLSAocCAtCisJCQkJCQkJCSAgIHJhdGVzX3N0ciksCisJCQkJCSAgICAgICIlMDJYICIsIG5ldHdvcmstPnJhdGVzW2ldKTsKICNlbmRpZgotCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZQorCQkJCSAgICAoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgewogCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOwogCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKIAkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCiAJCQkJCQluZXR3b3JrLT5mbGFncyAmPQotCQkJCQkJCX5ORVRXT1JLX0hBU19DQ0s7CisJCQkJCQkgICAgfk5FVFdPUktfSEFTX0NDSzsKIAkJCQl9CiAJCQl9CiAKQEAgLTkwMywxNCArODk4LDE0IEBACiAJCQlicmVhazsKIAogCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6Ci0gIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfRFNfU0VUOiAlZFxuIiwKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfRFNfU0VUOiAlZFxuIiwKIAkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0pOwogCQkJaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV8yNEdIWl9CQU5EKQogCQkJCW5ldHdvcmstPmNoYW5uZWwgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CiAJCQlicmVhazsKIAotCSAJY2FzZSBNRklFX1RZUEVfRkhfU0VUOgotICAJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0ZIX1NFVDogaWdub3JlZFxuIik7CisJCWNhc2UgTUZJRV9UWVBFX0ZIX1NFVDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfRkhfU0VUOiBpZ25vcmVkXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUZJRV9UWVBFX0NGX1NFVDoKQEAgLTkzMiwxMyArOTI3LDEzIEBACiAJCWNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6CiAJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLAogCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICAmJgorCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKIAkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgogCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCiAJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKIAkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkgewogCQkJCW5ldHdvcmstPndwYV9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAotCQkJCQkJCSBNQVhfV1BBX0lFX0xFTik7CisJCQkJCQkJICBNQVhfV1BBX0lFX0xFTik7CiAJCQkJbWVtY3B5KG5ldHdvcmstPndwYV9pZSwgaW5mb19lbGVtZW50LAogCQkJCSAgICAgICBuZXR3b3JrLT53cGFfaWVfbGVuKTsKIAkJCX0KQEAgLTk0OCw3ICs5NDMsNyBAQAogCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9SU046ICVkIGJ5dGVzXG4iLAogCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKIAkJCW5ldHdvcmstPnJzbl9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAotCQkJCQkJIE1BWF9XUEFfSUVfTEVOKTsKKwkJCQkJCSAgTUFYX1dQQV9JRV9MRU4pOwogCQkJbWVtY3B5KG5ldHdvcmstPnJzbl9pZSwgaW5mb19lbGVtZW50LAogCQkJICAgICAgIG5ldHdvcmstPnJzbl9pZV9sZW4pOwogCQkJYnJlYWs7CkBAIC05NTYsMTQgKzk1MSwxNCBAQAogCQlkZWZhdWx0OgogCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oInVuc3VwcG9ydGVkIElFICVkXG4iLAogCQkJCQkgICAgIGluZm9fZWxlbWVudC0+aWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gIAkJfQorCQkJYnJlYWs7CisJCX0KIAogCQlsZWZ0IC09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsKLQkJCWluZm9fZWxlbWVudC0+bGVuOworCQkgICAgaW5mb19lbGVtZW50LT5sZW47CiAJCWluZm9fZWxlbWVudCA9IChzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqKQotICAgICAgICAgICAgICAgIAkmaW5mb19lbGVtZW50LT5kYXRhW2luZm9fZWxlbWVudC0+bGVuXTsKLSAgCX0KKwkJICAgICZpbmZvX2VsZW1lbnQtPmRhdGFbaW5mb19lbGVtZW50LT5sZW5dOworCX0KIAogCW5ldHdvcmstPm1vZGUgPSAwOwogCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkKQEAgLTEwMzIsMTAgKzEwMjcsMTMgQEAKIAkvKiBkc3QtPmxhc3RfYXNzb2NpYXRlIGlzIG5vdCBvdmVyd3JpdHRlbiAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0Jc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uLAotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlCisJCQkJCQkgICAgKmllZWUsCisJCQkJCQkgICAgc3RydWN0CisJCQkJCQkgICAgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCisJCQkJCQkgICAgKmJlYWNvbiwKKwkJCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzCisJCQkJCQkgICAgKnN0YXRzKQogewogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXR3b3JrOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OwpAQCAtMTA0NSwzMyArMTA0MywzNSBAQAogI2VuZGlmCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAotCQkiJyVzJyAoIiBNQUNfRk1UICIpOiAlYyVjJWMlYyAlYyVjJWMlYy0lYyVjJWMlYyAlYyVjJWMlY1xuIiwKLQkJZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pLAotCQlNQUNfQVJHKGJlYWNvbi0+aGVhZGVyLmFkZHIzKSwKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGYpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGUpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGQpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGMpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGIpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGEpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDkpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDgpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDcpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDYpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDUpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDQpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDMpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDIpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDEpKSA/ICcxJyA6ICcwJywKLQkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDApKSA/ICcxJyA6ICcwJyk7CisJSUVFRTgwMjExX0RFQlVHX1NDQU4oIiclcycgKCIgTUFDX0ZNVAorCQkJICAgICAiKTogJWMlYyVjJWMgJWMlYyVjJWMtJWMlYyVjJWMgJWMlYyVjJWNcbiIsCisJCQkgICAgIGVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCSAgaW5mb19lbGVtZW50LT5sZW4pLAorCQkJICAgICBNQUNfQVJHKGJlYWNvbi0+aGVhZGVyLmFkZHIzKSwKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4ZikpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHhlKSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweGQpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4YykpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHhiKSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweGEpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4OSkpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHg4KSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweDcpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4NikpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHg1KSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweDQpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4MykpID8gJzEnIDogJzAnLAorCQkJICAgICAoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDEgPDwgMHgyKSkgPyAnMScgOiAnMCcsCisJCQkgICAgIChiZWFjb24tPmNhcGFiaWxpdHkgJiAoMSA8PCAweDEpKSA/ICcxJyA6ICcwJywKKwkJCSAgICAgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxIDw8IDB4MCkpID8gJzEnIDogJzAnKTsKIAogCWlmIChpZWVlODAyMTFfbmV0d29ya19pbml0KGllZWUsIGJlYWNvbiwgJm5ldHdvcmssIHN0YXRzKSkgewogCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKIAkJCQkgICAgIGVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCiAJCQkJCQkgIGluZm9fZWxlbWVudC0+bGVuKSwKIAkJCQkgICAgIE1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAotCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuCisJCQkJCQkgICAgICAgZnJhbWVfY3RsKSA9PQogCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPwogCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKIAkJcmV0dXJuOwpAQCAtMTExNywxMyArMTExNywxMyBAQAogCQkJbGlzdF9kZWwoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCk7CiAJCX0KIAotCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwogCQlJRUVFODAyMTFfREVCVUdfU0NBTigiQWRkaW5nICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAogCQkJCSAgICAgZXNjYXBlX2Vzc2lkKG5ldHdvcmsuc3NpZCwKIAkJCQkJCSAgbmV0d29yay5zc2lkX2xlbiksCiAJCQkJICAgICBNQUNfQVJHKG5ldHdvcmsuYnNzaWQpLAotCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuCisJCQkJCQkgICAgICAgZnJhbWVfY3RsKSA9PQogCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPwogCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKICNlbmRpZgpAQCAtMTEzNCw3ICsxMTM0LDggQEAKIAkJCQkgICAgIGVzY2FwZV9lc3NpZCh0YXJnZXQtPnNzaWQsCiAJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAogCQkJCSAgICAgTUFDX0FSRyh0YXJnZXQtPmJzc2lkKSwKLQkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLgorCQkJCQkJICAgICAgIGZyYW1lX2N0bCkgPT0KIAkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KIAkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CiAJCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmspOwpAQCAtMTE2MiwxNiArMTE2MywyMCBAQAogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUFJPQkUgUkVTUE9OU0UgKCVkKVxuIiwKIAkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CiAJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJQcm9iZSByZXNwb25zZVxuIik7Ci0JCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAotCQkJaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKiloZWFkZXIsIHN0YXRzKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoaWVlZSwKKwkJCQkJCSAoc3RydWN0CisJCQkJCQkgIGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKQorCQkJCQkJIGhlYWRlciwgc3RhdHMpOwogCQlicmVhazsKIAogCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIEJFQUNPTiAoJWQpXG4iLAogCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKIAkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkJlYWNvblxuIik7Ci0JCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAotCQkJaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKiloZWFkZXIsIHN0YXRzKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoaWVlZSwKKwkJCQkJCSAoc3RydWN0CisJCQkJCQkgIGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKQorCQkJCQkJIGhlYWRlciwgc3RhdHMpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xMTg0LDYgKzExODksNSBAQAogCX0KIH0KIAotCiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeF9tZ3QpOwogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcngpOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggYjdlYTNlMi4uYzlhYWZmMyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC00NSwxMCArNDUsOCBAQAogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCi0KIC8qCiAKLQogODAyLjExIERhdGEgRnJhbWUKIAogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCkBAIC04Miw3ICs4MCw2IEBACiAgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCiBUb3RhbDogOCBub24tZGF0YSBieXRlcwogCi0KIDgwMi4zIEV0aGVybmV0IERhdGEgRnJhbWUKIAogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgpAQCAtMTMxLDcgKzEyOCw3IEBACiBzdGF0aWMgdTggUDgwMl8xSF9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweGY4IH07CiBzdGF0aWMgdTggUkZDMTA0Ml9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweDAwIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9wdXRfc25hcCh1OCAqZGF0YSwgdTE2IGhfcHJvdG8pCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfcHV0X3NuYXAodTggKiBkYXRhLCB1MTYgaF9wcm90bykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICpzbmFwOwogCXU4ICpvdWk7CkBAIC0xNDksMTcgKzE0NiwxNSBAQAogCXNuYXAtPm91aVsxXSA9IG91aVsxXTsKIAlzbmFwLT5vdWlbMl0gPSBvdWlbMl07CiAKLQkqKHUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOworCSoodTE2ICopIChkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOwogCiAJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKLQlpbnQgaGRyX2xlbikKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpmcmFnLCBpbnQgaGRyX2xlbikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKIAlpbnQgcmVzOwogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCkBAIC0xNjcsNyArMTYyLDcgQEAKIAogCWlmIChpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyAmJgogCSAgICBjcnlwdCAmJiBjcnlwdC0+b3BzICYmIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKLQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIGZyYWctPmRhdGE7CisJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWZyYWctPmRhdGE7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVEtJUCBjb3VudGVybWVhc3VyZXM6IGRyb3BwZWQgIgogCQkJICAgICAgICJUWCBwYWNrZXQgdG8gIiBNQUNfRk1UICJcbiIsCkBAIC0yMDAsOCArMTk1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotCi12b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKSB7Cit2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKQorewogCWludCBpOwogCWlmICh1bmxpa2VseSghdHhiKSkKIAkJcmV0dXJuOwpAQCAtMjE2LDkgKzIxMSw4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKIAlpbnQgaTsKLQl0eGIgPSBrbWFsbG9jKAotCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgKHNpemVvZih1OCopICogbnJfZnJhZ3MpLAotCQlnZnBfbWFzayk7CisJdHhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgKHNpemVvZih1OCAqKSAqIG5yX2ZyYWdzKSwKKwkJICAgICAgZ2ZwX21hc2spOwogCWlmICghdHhiKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMjQzLDggKzIzNyw3IEBACiB9CiAKIC8qIFNLQnMgYXJlIGFkZGVkIHRvIHRoZSBpZWVlLT50eF9xdWV1ZS4gKi8KLWludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIgPSBOVUxMOwpAQCAtMjU1LDIxICsyNDgsMjAgQEAKIAlpbnQgZXRoZXJfdHlwZSwgZW5jcnlwdDsKIAlpbnQgYnl0ZXMsIGZjLCBoZHJfbGVuOwogCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZWFkZXIgPSB7IC8qIEVuc3VyZSB6ZXJvIGluaXRpYWxpemVkICovCisJc3RydWN0IGllZWU4MDIxMV9oZHIgaGVhZGVyID0gewkvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLwogCQkuZHVyYXRpb25faWQgPSAwLAogCQkuc2VxX2N0bCA9IDAKIAl9OwogCXU4IGRlc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOwogCi0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCS8qIElmIHRoZXJlIGlzIG5vIGRyaXZlciBoYW5kbGVyIHRvIHRha2UgdGhlIFRYQiwgZG9udCcgYm90aGVyCiAJICogY3JlYXRpbmcgaXQuLi4gKi8KIAlpZiAoIWllZWUtPmhhcmRfc3RhcnRfeG1pdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8geG1pdCBoYW5kbGVyLlxuIiwKLQkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyB4bWl0IGhhbmRsZXIuXG4iLCBpZWVlLT5kZXYtPm5hbWUpOwogCQlnb3RvIHN1Y2Nlc3M7CiAJfQogCkBAIC0yODQsNyArMjc2LDcgQEAKIAljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CiAKIAllbmNyeXB0ID0gIShldGhlcl90eXBlID09IEVUSF9QX1BBRSAmJiBpZWVlLT5pZWVlODAyXzF4KSAmJgotCQlpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wczsKKwkgICAgaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHM7CiAKIAlpZiAoIWVuY3J5cHQgJiYgaWVlZS0+aWVlZTgwMl8xeCAmJgogCSAgICBpZWVlLT5kcm9wX3VuZW5jcnlwdGVkICYmIGV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSB7CkBAIC0yOTQsNyArMjg2LDcgQEAKIAogCS8qIFNhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KIAltZW1jcHkoJmRlc3QsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOwotCW1lbWNweSgmc3JjLCBza2ItPmRhdGErRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwltZW1jcHkoJnNyYywgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKIAogCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KIAlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CkBAIC0zMDQsNyArMjk2LDcgQEAKIAogCWlmIChlbmNyeXB0KQogCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEEgfAotCQkJSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEOworCQkgICAgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEOwogCWVsc2UKIAkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBOwogCkBAIC0zMjcsOCArMzE5LDcgQEAKIAogCS8qIERldGVybWluZSBmcmFnbWVudGF0aW9uIHNpemUgYmFzZWQgb24gZGVzdGluYXRpb24gKG11bHRpY2FzdAogCSAqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKSAqLwotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSB8fAotCSAgICBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgfHwgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpCiAJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKIAllbHNlCiAJCWZyYWdfc2l6ZSA9IGllZWUtPmZ0czsKQEAgLTM0NSw3ICszMzYsNyBAQAogCS8qIEVhY2ggZnJhZ21lbnQgbWF5IG5lZWQgdG8gaGF2ZSByb29tIGZvciBlbmNyeXB0aW9uZyBwcmUvcG9zdGZpeCAqLwogCWlmIChlbmNyeXB0KQogCQlieXRlc19wZXJfZnJhZyAtPSBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuICsKLQkJCWNyeXB0LT5vcHMtPmV4dHJhX3Bvc3RmaXhfbGVuOworCQkgICAgY3J5cHQtPm9wcy0+ZXh0cmFfcG9zdGZpeF9sZW47CiAKIAkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCiAJICogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KQEAgLTM4MCwxOSArMzcxLDE5IEBACiAJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGZyYWdtZW50LCB0aGVuIGFkZCB0aGUgTU9SRUZSQUdTCiAJCSAqIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLwogCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKLQkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKLQkJCQlmYyB8IElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7CisJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0KKwkJCSAgICBjcHVfdG9fbGUxNihmYyB8IElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7CiAJCQlieXRlcyA9IGJ5dGVzX3Blcl9mcmFnOwogCQl9IGVsc2UgewogCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgdGFrZXMgdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KIAkJCWJ5dGVzID0gYnl0ZXNfbGFzdF9mcmFnOwogCQl9CiAKLQkgICAgICAgCS8qIFB1dCBhIFNOQVAgaGVhZGVyIG9uIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KIAkJaWYgKGkgPT0gMCkgewotCQkJaWVlZTgwMjExX3B1dF9zbmFwKAotCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwKLQkJCQlldGhlcl90eXBlKTsKKwkJCWllZWU4MDIxMV9wdXRfc25hcChza2JfcHV0CisJCQkJCSAgIChza2JfZnJhZywgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpLAorCQkJCQkgICBldGhlcl90eXBlKTsKIAkJCWJ5dGVzIC09IFNOQVBfU0laRSArIHNpemVvZih1MTYpOwogCQl9CiAKQEAgLTQxMCwxNCArNDAxLDEzIEBACiAJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKIAl9CiAKLQotIHN1Y2Nlc3M6CisgICAgICBzdWNjZXNzOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAKIAlpZiAodHhiKSB7Ci0JCWlmICgoKmllZWUtPmhhcmRfc3RhcnRfeG1pdCkodHhiLCBkZXYpID09IDApIHsKKwkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSAodHhiLCBkZXYpID09IDApIHsKIAkJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CiAJCQlyZXR1cm4gMDsKQEAgLTQyNyw3ICs0MTcsNyBAQAogCiAJcmV0dXJuIDA7CiAKLSBmYWlsZWQ6CisgICAgICBmYWlsZWQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAlzdGF0cy0+dHhfZXJyb3JzKys7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCAyY2Q1NzFjLi45NDg4MmYzIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKQEAgLTI5LDE5ICsyOSwyMCBAQAogICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKwogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCiBzdGF0aWMgY29uc3QgY2hhciAqaWVlZTgwMjExX21vZGVzW10gPSB7CiAJIj8iLCAiYSIsICJiIiwgImFiIiwgImciLCAiYWciLCAiYmciLCAiYWJnIgogfTsKIAogI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAogc3RhdGljIGlubGluZSBjaGFyICppcHcyMTAwX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotIAkJCQkJICAgY2hhciAqc3RhcnQsIGNoYXIgKnN0b3AsCisJCQkJCSAgIGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLAogCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCiB7CiAJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dOwpAQCAtNjUsMjkgKzY2LDI4IEBACiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOwogCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKIAl9IGVsc2UgewotCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KTMyKTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4obmV0d29yay0+c3NpZF9sZW4sICh1OCkgMzIpOwogCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKIAl9CiAKIAkvKiBBZGQgdGhlIHByb3RvY29sIG5hbWUgKi8KIAlpd2UuY21kID0gU0lPQ0dJV05BTUU7Ci0Jc25wcmludGYoaXdlLnUubmFtZSwgSUZOQU1TSVosICJJRUVFIDgwMi4xMSVzIiwgaWVlZTgwMjExX21vZGVzW25ldHdvcmstPm1vZGVdKTsKKwlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLAorCQkgaWVlZTgwMjExX21vZGVzW25ldHdvcmstPm1vZGVdKTsKIAlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CiAKLSAgICAgICAgLyogQWRkIG1vZGUgKi8KLSAgICAgICAgaXdlLmNtZCA9IFNJT0NHSVdNT0RFOwotICAgICAgICBpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmCi0JICAgIChXTEFOX0NBUEFCSUxJVFlfRVNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7CisJLyogQWRkIG1vZGUgKi8KKwlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJiAoV0xBTl9DQVBBQklMSVRZX0VTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgewogCQlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpCiAJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CiAJCWVsc2UKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOwogCi0JCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsCi0JCQkJCSAgICAgSVdfRVZfVUlOVF9MRU4pOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CiAJfQogCi0gICAgICAgIC8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLworCS8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKIC8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7CiAJaXdlLnUuZnJlcS5lID0gMzsgKi8KQEAgLTEwOSw3ICsxMDksNyBAQAogCW1heF9yYXRlID0gMDsKIAlwID0gY3VzdG9tOwogCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksICIgUmF0ZXMgKE1iL3MpOiAiKTsKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2xlbjsgKSB7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47KSB7CiAJCWlmIChqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuICYmCiAJCSAgICAoKG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RikgPAogCQkgICAgIChuZXR3b3JrLT5yYXRlc1tpXSAmIDB4N0YpKSkKQEAgLTEzMiw4ICsxMzIsNyBAQAogCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKIAlpd2UudS5iaXRyYXRlLmZpeGVkID0gaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CiAJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IG1heF9yYXRlICogNTAwMDAwOwotCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsCi0JCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CiAKIAlpd2UuY21kID0gSVdFVkNVU1RPTTsKIAlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CkBAIC0xNjMsNyArMTYyLDcgQEAKIAlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCiAJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CiAKLQlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7CisJaWYgKGllZWUtPndwYV9lbmFibGVkICYmIG5ldHdvcmstPndwYV9pZV9sZW4pIHsKIAkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU4gKiAyICsgMzBdOwogCiAJCXU4ICpwID0gYnVmOwpAQCAtMTc4LDcgKzE3Nyw3IEBACiAJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CiAJfQogCi0JaWYgKGllZWUtPndwYV9lbmFibGVkICYmIG5ldHdvcmstPnJzbl9pZV9sZW4peworCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT5yc25faWVfbGVuKSB7CiAJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKIAogCQl1OCAqcCA9IGJ1ZjsKQEAgLTE5OCwxMiArMTk3LDEyIEBACiAJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJcCA9IGN1c3RvbTsKIAlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAotCQkgICAgICAiIExhc3QgYmVhY29uOiAlbHVtcyBhZ28iLCAoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwkJICAgICAgIiBMYXN0IGJlYWNvbjogJWx1bXMgYWdvIiwKKwkJICAgICAgKGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8gMTAwKSk7CiAJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOwogCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKIAkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKIAotCiAJcmV0dXJuIHN0YXJ0OwogfQogCkBAIC0yMjgsMTggKzIyNywxOSBAQAogCQkgICAgdGltZV9hZnRlcihuZXR3b3JrLT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcykpCiAJCQlldiA9IGlwdzIxMDBfdHJhbnNsYXRlX3NjYW4oaWVlZSwgZXYsIHN0b3AsIG5ldHdvcmspOwogCQllbHNlCi0JCQlJRUVFODAyMTFfREVCVUdfU0NBTigKLQkJCQkiTm90IHNob3dpbmcgbmV0d29yayAnJXMgKCIKLQkJCQlNQUNfRk1UICIpJyBkdWUgdG8gYWdlICglbHVtcykuXG4iLAotCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAotCQkJCQkgICAgIG5ldHdvcmstPnNzaWRfbGVuKSwKLQkJCQlNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSwKLQkJCQkoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoIgorCQkJCQkgICAgIE1BQ19GTVQgIiknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCksCisJCQkJCSAgICAgKGppZmZpZXMgLQorCQkJCQkgICAgICBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8KKwkJCQkJCQkJCTEwMCkpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCXdycXUtPmRhdGEubGVuZ3RoID0gZXYgLSAgZXh0cmE7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBldiAtIGV4dHJhOwogCXdycXUtPmRhdGEuZmxhZ3MgPSAwOwogCiAJSUVFRTgwMjExX0RFQlVHX1dYKCJleGl0OiAlZCBuZXR3b3JrcyByZXR1cm5lZC5cbiIsIGkpOwpAQCAtMjkxLDggKzI5MSw4IEBACiAJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkgewogCQkJCWlmIChrZXlfcHJvdmlkZWQpCiAJCQkJCWJyZWFrOwotCQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCgKLQkJCQkJaWVlZSwgJmllZWUtPmNyeXB0W2ldKTsKKwkJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwKKwkJCQkJCQkgICAgICAgJmllZWUtPmNyeXB0W2ldKTsKIAkJCX0KIAkJfQogCkBAIC0zMDUsOCArMzA1LDYgQEAKIAkJZ290byBkb25lOwogCX0KIAotCi0KIAlzZWMuZW5hYmxlZCA9IDE7CiAJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOwogCkBAIC0zNDAsOCArMzM4LDcgQEAKIAkJCW5ld19jcnlwdCA9IE5VTEw7CiAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKLQkJCSAgICAgICAibG9hZCBtb2R1bGUgaWVlZTgwMjExX2NyeXB0X3dlcFxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJICAgICAgICJsb2FkIG1vZHVsZSBpZWVlODAyMTFfY3J5cHRfd2VwXG4iLCBkZXYtPm5hbWUpOwogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQl9CiAJCSpjcnlwdCA9IG5ld19jcnlwdDsKQEAgLTM1OCw3ICszNTUsNyBAQAogCQkJCSAgIGtleSwgZXNjYXBlX2Vzc2lkKHNlYy5rZXlzW2tleV0sIGxlbiksCiAJCQkJICAgZXJxLT5sZW5ndGgsIGxlbik7CiAJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IGxlbjsKLSAJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgbGVuLCBOVUxMLAorCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIGxlbiwgTlVMTCwKIAkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOwogCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKIAkJLyogVGhpcyBlbnN1cmVzIGEga2V5IHdpbGwgYmUgYWN0aXZhdGVkIGlmIG5vIGtleSBpcwpAQCAtMzgxLDE1ICszNzgsMTUgQEAKIAogCQkvKiBObyBrZXkgZGF0YSAtIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IFRYIGtleSBpbmRleCAqLwogCQlpZiAoa2V5X3Byb3ZpZGVkKSB7Ci0JCQlJRUVFODAyMTFfREVCVUdfV1goCi0JCQkJIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwga2V5KTsKKwkJCUlFRUU4MDIxMV9ERUJVR19XWAorCQkJICAgICgiU2V0dGluZyBrZXkgJWQgdG8gZGVmYXVsdCBUeCBrZXkuXG4iLCBrZXkpOwogCQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OwogCQkJc2VjLmFjdGl2ZV9rZXkgPSBrZXk7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CiAJCX0KIAl9CiAKLSBkb25lOgorICAgICAgZG9uZToKIAlpZWVlLT5vcGVuX3dlcCA9ICEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKTsKIAlzZWMuYXV0aF9tb2RlID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOwogCXNlYy5mbGFncyB8PSBTRUNfQVVUSF9NT0RFOwpAQCAtMzk5LDcgKzM5Niw3IEBACiAJLyogRm9yIG5vdyB3ZSBqdXN0IHN1cHBvcnQgV0VQLCBzbyBvbmx5IHNldCB0aGF0IHNlY3VyaXR5IGxldmVsLi4uCiAJICogVE9ETzogV2hlbiBXUEEgaXMgYWRkZWQgdGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBuZWVkcyB0byBjaGFuZ2UgKi8KIAlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOyAvKiA0MCBhbmQgMTA0IGJpdCBXRVAgKi8KKwlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsJLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCiAKIAlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQogCQlpZWVlLT5zZXRfc2VjdXJpdHkoZGV2LCAmc2VjKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCBiZjE0N2Y4Li5hOWQ4NGY5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC0xMjQ4LDExICsxMjQ4LDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLSNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUUKLWV4dGVybiBpbnQgIGZpYl9zdGF0X3Byb2NfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGZpYl9zdGF0X3Byb2NfZXhpdCh2b2lkKTsKLSNlbmRpZgotCiBzdGF0aWMgaW50IF9faW5pdCBpcHY0X3Byb2NfaW5pdCh2b2lkKQogewogCWludCByYyA9IDA7CkBAIC0xMjY1LDE5ICsxMjYwLDExIEBACiAJCWdvdG8gb3V0X3VkcDsKIAlpZiAoZmliX3Byb2NfaW5pdCgpKQogCQlnb3RvIG91dF9maWI7Ci0jaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFCi0gICAgICAgICBpZiAoZmliX3N0YXRfcHJvY19pbml0KCkpCi0gICAgICAgICAgICAgICAgIGdvdG8gb3V0X2ZpYl9zdGF0OwotI2VuZGlmCiAJaWYgKGlwX21pc2NfcHJvY19pbml0KCkpCiAJCWdvdG8gb3V0X21pc2M7CiBvdXQ6CiAJcmV0dXJuIHJjOwogb3V0X21pc2M6Ci0jaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFCi0gCWZpYl9zdGF0X3Byb2NfZXhpdCgpOwotb3V0X2ZpYl9zdGF0OgotI2VuZGlmCiAJZmliX3Byb2NfZXhpdCgpOwogb3V0X2ZpYjoKIAl1ZHA0X3Byb2NfZXhpdCgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3RyaWUuYyBiL25ldC9pcHY0L2ZpYl90cmllLmMKaW5kZXggYjJkZWE0ZS4uMWI2M2I0OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3RyaWUuYworKysgYi9uZXQvaXB2NC9maWJfdHJpZS5jCkBAIC00Myw3ICs0Myw3IEBACiAgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jZGVmaW5lIFZFUlNJT04gIjAuNDAyIgorI2RlZmluZSBWRVJTSU9OICIwLjQwMyIKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xNjQsNyArMTY0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgdG5vZGUgKmluZmxhdGUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4pOwogc3RhdGljIHN0cnVjdCB0bm9kZSAqaGFsdmUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4pOwogc3RhdGljIHZvaWQgdG5vZGVfZnJlZShzdHJ1Y3QgdG5vZGUgKnRuKTsKLXN0YXRpYyB2b2lkIHRyaWVfZHVtcF9zZXEoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB0cmllICp0KTsKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqZm5fYWxpYXNfa21lbSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCB0cmllICp0cmllX2xvY2FsID0gTlVMTCwgKnRyaWVfbWFpbiA9IE5VTEw7CkBAIC0xOTcxLDM3OCArMTk3MCwxMzcgQEAKIAlyZXR1cm4gdGI7CiB9CiAKLS8qIFRyaWUgZHVtcCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgcHV0c3BhY2Vfc2VxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBpbnQgbikKLXsKLQl3aGlsZSAobi0tKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAiKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRiaW5fc2VxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB1bnNpZ25lZCBpbnQgdiwgaW50IGJpdHMpCi17Ci0Jd2hpbGUgKGJpdHMtLSkKLQkJc2VxX3ByaW50ZihzZXEsICIlcyIsICh2ICYgKDE8PGJpdHMpKT8iMSI6IjAiKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRub2RlX3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgaW50IGluZGVudCwgc3RydWN0IG5vZGUgKm4sCi0JCSAgIGludCBwZW5kLCBpbnQgY2luZGV4LCBpbnQgYml0cykKLXsKLQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQpOwotCWlmIChJU19MRUFGKG4pKQotCQlzZXFfcHJpbnRmKHNlcSwgInwiKTsKLQllbHNlCi0JCXNlcV9wcmludGYoc2VxLCAiKyIpOwotCWlmIChiaXRzKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiJWQvIiwgY2luZGV4KTsKLQkJcHJpbnRiaW5fc2VxKHNlcSwgY2luZGV4LCBiaXRzKTsKLQkJc2VxX3ByaW50ZihzZXEsICI6ICIpOwotCX0gZWxzZQotCQlzZXFfcHJpbnRmKHNlcSwgIjxyb290PjogIik7Ci0Jc2VxX3ByaW50ZihzZXEsICIlczolcCAiLCBJU19MRUFGKG4pPyJMZWFmIjoiSW50ZXJuYWwgbm9kZSIsIG4pOwotCi0JaWYgKElTX0xFQUYobikpIHsKLQkJc3RydWN0IGxlYWYgKmwgPSAoc3RydWN0IGxlYWYgKiluOwotCQlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKLQkJaW50IGk7Ci0KLQkJc2VxX3ByaW50ZihzZXEsICJrZXk9JWQuJWQuJWQuJWRcbiIsCi0JCQkgICBuLT5rZXkgPj4gMjQsIChuLT5rZXkgPj4gMTYpICUgMjU2LCAobi0+a2V5ID4+IDgpICUgMjU2LCBuLT5rZXkgJSAyNTYpOwotCi0JCWZvciAoaSA9IDMyOyBpID49IDA7IGktLSkKLQkJCWlmIChmaW5kX2xlYWZfaW5mbygmbC0+bGlzdCwgaSkpIHsKLQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpmYV9oZWFkID0gZ2V0X2ZhX2hlYWQobCwgaSk7Ci0KLQkJCQlpZiAoIWZhX2hlYWQpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGxpc3RfZW1wdHkoZmFfaGVhZCkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KzIpOwotCQkJCXNlcV9wcmludGYoc2VxLCAiey8lZC4uLmR1bXBpbmd9XG4iLCBpKTsKLQotCQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCBmYV9oZWFkLCBmYV9saXN0KSB7Ci0JCQkJCXB1dHNwYWNlX3NlcShzZXEsIGluZGVudCsyKTsKLQkJCQkJaWYgKGZhLT5mYV9pbmZvID09IE5VTEwpIHsKLQkJCQkJCXNlcV9wcmludGYoc2VxLCAiRXJyb3IgZmFfaW5mbz1OVUxMXG4iKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChmYS0+ZmFfaW5mby0+ZmliX25oID09IE5VTEwpIHsKLQkJCQkJCXNlcV9wcmludGYoc2VxLCAiRXJyb3IgX2ZpYl9uaD1OVUxMXG4iKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJc2VxX3ByaW50ZihzZXEsICJ7dHlwZT0lZCBzY29wZT0lZCBUT1M9JWR9XG4iLAotCQkJCQkgICAgICBmYS0+ZmFfdHlwZSwKLQkJCQkJICAgICAgZmEtPmZhX3Njb3BlLAotCQkJCQkgICAgICBmYS0+ZmFfdG9zKTsKLQkJCQl9Ci0JCQl9Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHRub2RlICp0biA9IChzdHJ1Y3QgdG5vZGUgKiluOwotCQlpbnQgcGxlbiA9ICgoc3RydWN0IHRub2RlICopbiktPnBvczsKLQkJdF9rZXkgcHJmID0gTUFTS19QRlgobi0+a2V5LCBwbGVuKTsKLQotCQlzZXFfcHJpbnRmKHNlcSwgImtleT0lZC4lZC4lZC4lZC8lZFxuIiwKLQkJCSAgIHByZiA+PiAyNCwgKHByZiA+PiAxNikgJSAyNTYsIChwcmYgPj4gOCkgJSAyNTYsIHByZiAlIDI1NiwgcGxlbik7Ci0KLQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KTsgc2VxX3ByaW50ZihzZXEsICJ8ICAgICIpOwotCQlzZXFfcHJpbnRmKHNlcSwgIntrZXkgcHJlZml4PSUwOHgvIiwgdG4tPmtleSAmIFRLRVlfR0VUX01BU0soMCwgdG4tPnBvcykpOwotCQlwcmludGJpbl9zZXEoc2VxLCB0a2V5X2V4dHJhY3RfYml0cyh0bi0+a2V5LCAwLCB0bi0+cG9zKSwgdG4tPnBvcyk7Ci0JCXNlcV9wcmludGYoc2VxLCAifVxuIik7Ci0JCXB1dHNwYWNlX3NlcShzZXEsIGluZGVudCk7IHNlcV9wcmludGYoc2VxLCAifCAgICAiKTsKLQkJc2VxX3ByaW50ZihzZXEsICJ7cG9zPSVkIiwgdG4tPnBvcyk7Ci0JCXNlcV9wcmludGYoc2VxLCAiIChza2lwPSVkIGJpdHMpIiwgdG4tPnBvcyAtIHBlbmQpOwotCQlzZXFfcHJpbnRmKHNlcSwgIiBiaXRzPSVkICgldSBjaGlsZHJlbil9XG4iLCB0bi0+Yml0cywgKDEgPDwgdG4tPmJpdHMpKTsKLQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KTsgc2VxX3ByaW50ZihzZXEsICJ8ICAgICIpOwotCQlzZXFfcHJpbnRmKHNlcSwgIntlbXB0eT0lZCBmdWxsPSVkfVxuIiwgdG4tPmVtcHR5X2NoaWxkcmVuLCB0bi0+ZnVsbF9jaGlsZHJlbik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0cmllX2R1bXBfc2VxKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdHJpZSAqdCkKLXsKLQlzdHJ1Y3Qgbm9kZSAqbjsKLQlpbnQgY2luZGV4ID0gMDsKLQlpbnQgaW5kZW50ID0gMTsKLQlpbnQgcGVuZCA9IDA7Ci0JaW50IGRlcHRoID0gMDsKLQlzdHJ1Y3QgdG5vZGUgKnRuOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW4gPSByY3VfZGVyZWZlcmVuY2UodC0+dHJpZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICItLS0tLS0gdHJpZV9kdW1wIG9mIHQ9JXAgLS0tLS0tXG4iLCB0KTsKLQotCWlmICghbikgewotCQlzZXFfcHJpbnRmKHNlcSwgIi0tLS0tLSB0cmllIGlzIGVtcHR5XG4iKTsKLQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50bm9kZV9zZXEoc2VxLCBpbmRlbnQsIG4sIHBlbmQsIGNpbmRleCwgMCk7Ci0KLQlpZiAoIUlTX1ROT0RFKG4pKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JdG4gPSAoc3RydWN0IHRub2RlICopbjsKLQlwZW5kID0gdG4tPnBvcyt0bi0+Yml0czsKLQlwdXRzcGFjZV9zZXEoc2VxLCBpbmRlbnQpOyBzZXFfcHJpbnRmKHNlcSwgIlxcLS1cbiIpOwotCWluZGVudCArPSAzOwotCWRlcHRoKys7Ci0KLQl3aGlsZSAodG4gJiYgY2luZGV4IDwgKDEgPDwgdG4tPmJpdHMpKSB7Ci0JCXN0cnVjdCBub2RlICpjaGlsZCA9IHJjdV9kZXJlZmVyZW5jZSh0bi0+Y2hpbGRbY2luZGV4XSk7Ci0JCWlmICghY2hpbGQpCi0JCQljaW5kZXgrKzsKLQkJZWxzZSB7Ci0JCQkvKiBHb3QgYSBjaGlsZCAqLwotCQkJcHJpbnRub2RlX3NlcShzZXEsIGluZGVudCwgY2hpbGQsIHBlbmQsCi0JCQkJICAgICAgY2luZGV4LCB0bi0+Yml0cyk7Ci0KLQkJCWlmIChJU19MRUFGKGNoaWxkKSkKLQkJCQljaW5kZXgrKzsKLQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBOZXcgdG5vZGUuIERlY2VuZCBvbmUgbGV2ZWwKLQkJCQkgKi8KLQotCQkJCWRlcHRoKys7Ci0JCQkJbiA9IGNoaWxkOwotCQkJCXRuID0gKHN0cnVjdCB0bm9kZSAqKW47Ci0JCQkJcGVuZCA9IHRuLT5wb3MrdG4tPmJpdHM7Ci0JCQkJcHV0c3BhY2Vfc2VxKHNlcSwgaW5kZW50KTsKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIlxcLS1cbiIpOwotCQkJCWluZGVudCArPSAzOwotCQkJCWNpbmRleCA9IDA7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBUZXN0IGlmIHdlIGFyZSBkb25lCi0JCSAqLwotCi0JCXdoaWxlIChjaW5kZXggPj0gKDEgPDwgdG4tPmJpdHMpKSB7Ci0JCQkvKgotCQkJICogTW92ZSB1cHdhcmRzIGFuZCB0ZXN0IGZvciByb290Ci0JCQkgKiBwb3Agb2ZmIGFsbCB0cmF2ZXJzZWQgIG5vZGVzCi0JCQkgKi8KLQotCQkJaWYgKE5PREVfUEFSRU5UKHRuKSA9PSBOVUxMKSB7Ci0JCQkJdG4gPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljaW5kZXggPSB0a2V5X2V4dHJhY3RfYml0cyh0bi0+a2V5LCBOT0RFX1BBUkVOVCh0biktPnBvcywgTk9ERV9QQVJFTlQodG4pLT5iaXRzKTsKLQkJCWNpbmRleCsrOwotCQkJdG4gPSBOT0RFX1BBUkVOVCh0bik7Ci0JCQlwZW5kID0gdG4tPnBvcyArIHRuLT5iaXRzOwotCQkJaW5kZW50IC09IDM7Ci0JCQlkZXB0aC0tOwotCQl9Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1zdGF0aWMgc3RydWN0IHRyaWVfc3RhdCAqdHJpZV9zdGF0X25ldyh2b2lkKQotewotCXN0cnVjdCB0cmllX3N0YXQgKnM7Ci0JaW50IGk7Ci0KLQlzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRyaWVfc3RhdCksIEdGUF9LRVJORUwpOwotCWlmICghcykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzLT50b3RkZXB0aCA9IDA7Ci0Jcy0+bWF4ZGVwdGggPSAwOwotCXMtPnRub2RlcyA9IDA7Ci0Jcy0+bGVhdmVzID0gMDsKLQlzLT5udWxscG9pbnRlcnMgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9DSElMRFM7IGkrKykKLQkJcy0+bm9kZXNpemVzW2ldID0gMDsKLQotCXJldHVybiBzOwotfQotCi1zdGF0aWMgc3RydWN0IHRyaWVfc3RhdCAqdHJpZV9jb2xsZWN0X3N0YXRzKHN0cnVjdCB0cmllICp0KQotewotCXN0cnVjdCBub2RlICpuOwotCXN0cnVjdCB0cmllX3N0YXQgKnMgPSB0cmllX3N0YXRfbmV3KCk7Ci0JaW50IGNpbmRleCA9IDA7Ci0JaW50IHBlbmQgPSAwOwotCWludCBkZXB0aCA9IDA7Ci0KLQlpZiAoIXMpCi0JCXJldHVybiBOVUxMOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW4gPSByY3VfZGVyZWZlcmVuY2UodC0+dHJpZSk7Ci0KLQlpZiAoIW4pCi0JCXJldHVybiBzOwotCi0JaWYgKElTX1ROT0RFKG4pKSB7Ci0JCXN0cnVjdCB0bm9kZSAqdG4gPSAoc3RydWN0IHRub2RlICopbjsKLQkJcGVuZCA9IHRuLT5wb3MrdG4tPmJpdHM7Ci0JCXMtPm5vZGVzaXplc1t0bi0+Yml0c10rKzsKLQkJZGVwdGgrKzsKLQotCQl3aGlsZSAodG4gJiYgY2luZGV4IDwgKDEgPDwgdG4tPmJpdHMpKSB7Ci0JCQlzdHJ1Y3Qgbm9kZSAqY2ggPSByY3VfZGVyZWZlcmVuY2UodG4tPmNoaWxkW2NpbmRleF0pOwotCQkJaWYgKGNoKSB7Ci0KLQkJCQkvKiBHb3QgYSBjaGlsZCAqLwotCi0JCQkJaWYgKElTX0xFQUYodG4tPmNoaWxkW2NpbmRleF0pKSB7Ci0JCQkJCWNpbmRleCsrOwotCi0JCQkJCS8qIHN0YXRzICovCi0JCQkJCWlmIChkZXB0aCA+IHMtPm1heGRlcHRoKQotCQkJCQkJcy0+bWF4ZGVwdGggPSBkZXB0aDsKLQkJCQkJcy0+dG90ZGVwdGggKz0gZGVwdGg7Ci0JCQkJCXMtPmxlYXZlcysrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5ldyB0bm9kZS4gRGVjZW5kIG9uZSBsZXZlbAotCQkJCQkgKi8KLQotCQkJCQlzLT50bm9kZXMrKzsKLQkJCQkJcy0+bm9kZXNpemVzW3RuLT5iaXRzXSsrOwotCQkJCQlkZXB0aCsrOwotCi0JCQkJCW4gPSBjaDsKLQkJCQkJdG4gPSAoc3RydWN0IHRub2RlICopbjsKLQkJCQkJcGVuZCA9IHRuLT5wb3MrdG4tPmJpdHM7Ci0KLQkJCQkJY2luZGV4ID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNpbmRleCsrOwotCQkJCXMtPm51bGxwb2ludGVycysrOwotCQkJfQotCi0JCQkvKgotCQkJICogVGVzdCBpZiB3ZSBhcmUgZG9uZQotCQkJICovCi0KLQkJCXdoaWxlIChjaW5kZXggPj0gKDEgPDwgdG4tPmJpdHMpKSB7Ci0JCQkJLyoKLQkJCQkgKiBNb3ZlIHVwd2FyZHMgYW5kIHRlc3QgZm9yIHJvb3QKLQkJCQkgKiBwb3Agb2ZmIGFsbCB0cmF2ZXJzZWQgIG5vZGVzCi0JCQkJICovCi0KLQkJCQlpZiAoTk9ERV9QQVJFTlQodG4pID09IE5VTEwpIHsKLQkJCQkJdG4gPSBOVUxMOwotCQkJCQluID0gTlVMTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2luZGV4ID0gdGtleV9leHRyYWN0X2JpdHModG4tPmtleSwgTk9ERV9QQVJFTlQodG4pLT5wb3MsIE5PREVfUEFSRU5UKHRuKS0+Yml0cyk7Ci0JCQkJdG4gPSBOT0RFX1BBUkVOVCh0bik7Ci0JCQkJY2luZGV4Kys7Ci0JCQkJbiA9IChzdHJ1Y3Qgbm9kZSAqKXRuOwotCQkJCXBlbmQgPSB0bi0+cG9zK3RuLT5iaXRzOwotCQkJCWRlcHRoLS07Ci0gCQkJfQotCQl9Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHM7Ci19Ci0KICNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogRGVwdGggZmlyc3QgVHJpZSB3YWxrIGl0ZXJhdG9yICovCitzdHJ1Y3QgZmliX3RyaWVfaXRlciB7CisJc3RydWN0IHRub2RlICp0bm9kZTsKKwlzdHJ1Y3QgdHJpZSAqdHJpZTsKKwl1bnNpZ25lZCBpbmRleDsKKwl1bnNpZ25lZCBkZXB0aDsKK307CiAKLXN0YXRpYyBzdHJ1Y3QgZmliX2FsaWFzICpmaWJfdHJpZXN0YXRfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQorc3RhdGljIHN0cnVjdCBub2RlICpmaWJfdHJpZV9nZXRfbmV4dChzdHJ1Y3QgZmliX3RyaWVfaXRlciAqaXRlcikKIHsKKwlzdHJ1Y3QgdG5vZGUgKnRuID0gaXRlci0+dG5vZGU7CisJdW5zaWduZWQgY2luZGV4ID0gaXRlci0+aW5kZXg7CisJc3RydWN0IHRub2RlICpwOworCisJcHJfZGVidWcoImdldF9uZXh0IGl0ZXI9e25vZGU9JXAgaW5kZXg9JWQgZGVwdGg9JWR9XG4iLAorCQkgaXRlci0+dG5vZGUsIGl0ZXItPmluZGV4LCBpdGVyLT5kZXB0aCk7CityZXNjYW46CisJd2hpbGUgKGNpbmRleCA8ICgxPDx0bi0+Yml0cykpIHsKKwkJc3RydWN0IG5vZGUgKm4gPSB0bm9kZV9nZXRfY2hpbGQodG4sIGNpbmRleCk7CisKKwkJaWYgKG4pIHsKKwkJCWlmIChJU19MRUFGKG4pKSB7CisJCQkJaXRlci0+dG5vZGUgPSB0bjsKKwkJCQlpdGVyLT5pbmRleCA9IGNpbmRleCArIDE7CisJCQl9IGVsc2UgeworCQkJCS8qIHB1c2ggZG93biBvbmUgbGV2ZWwgKi8KKwkJCQlpdGVyLT50bm9kZSA9IChzdHJ1Y3QgdG5vZGUgKikgbjsKKwkJCQlpdGVyLT5pbmRleCA9IDA7CisJCQkJKytpdGVyLT5kZXB0aDsKKwkJCX0KKwkJCXJldHVybiBuOworCQl9CisKKwkJKytjaW5kZXg7CisJfQorCisJLyogQ3VycmVudCBub2RlIGV4aGF1c3RlZCwgcG9wIGJhY2sgdXAgKi8KKwlwID0gTk9ERV9QQVJFTlQodG4pOworCWlmIChwKSB7CisJCWNpbmRleCA9IHRrZXlfZXh0cmFjdF9iaXRzKHRuLT5rZXksIHAtPnBvcywgcC0+Yml0cykrMTsKKwkJdG4gPSBwOworCQktLWl0ZXItPmRlcHRoOworCQlnb3RvIHJlc2NhbjsKKwl9CisKKwkvKiBnb3Qgcm9vdD8gKi8KIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl90cmllc3RhdF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3N0YXRpYyBzdHJ1Y3Qgbm9kZSAqZmliX3RyaWVfZ2V0X2ZpcnN0KHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyLAorCQkJCSAgICAgICBzdHJ1Y3QgdHJpZSAqdCkKIHsKKwlzdHJ1Y3Qgbm9kZSAqbiA9IHJjdV9kZXJlZmVyZW5jZSh0LT50cmllKTsKKworCWlmIChuICYmIElTX1ROT0RFKG4pKSB7CisJCWl0ZXItPnRub2RlID0gKHN0cnVjdCB0bm9kZSAqKSBuOworCQlpdGVyLT50cmllID0gdDsKKwkJaXRlci0+aW5kZXggPSAwOworCQlpdGVyLT5kZXB0aCA9IDA7CisJCXJldHVybiBuOworCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgKmZpYl90cmllc3RhdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQorc3RhdGljIHZvaWQgdHJpZV9jb2xsZWN0X3N0YXRzKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdHJpZV9zdGF0ICpzKQogewotCWlmICghaXBfZmliX21haW5fdGFibGUpCi0JCXJldHVybiBOVUxMOworCXN0cnVjdCBub2RlICpuOworCXN0cnVjdCBmaWJfdHJpZV9pdGVyIGl0ZXI7CiAKLQlpZiAoKnBvcykKLQkJcmV0dXJuIGZpYl90cmllc3RhdF9nZXRfbmV4dChzZXEpOwotCWVsc2UKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CiAKLXN0YXRpYyB2b2lkICpmaWJfdHJpZXN0YXRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCSsrKnBvczsKLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXJldHVybiBmaWJfdHJpZXN0YXRfZ2V0X2ZpcnN0KHNlcSk7Ci0JZWxzZQotCQlyZXR1cm4gZmliX3RyaWVzdGF0X2dldF9uZXh0KHNlcSk7Ci19CisJcmN1X3JlYWRfbG9jaygpOworCWZvciAobiA9IGZpYl90cmllX2dldF9maXJzdCgmaXRlciwgdCk7IG47CisJICAgICBuID0gZmliX3RyaWVfZ2V0X25leHQoJml0ZXIpKSB7CisJCWlmIChJU19MRUFGKG4pKSB7CisJCQlzLT5sZWF2ZXMrKzsKKwkJCXMtPnRvdGRlcHRoICs9IGl0ZXIuZGVwdGg7CisJCQlpZiAoaXRlci5kZXB0aCA+IHMtPm1heGRlcHRoKQorCQkJCXMtPm1heGRlcHRoID0gaXRlci5kZXB0aDsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IHN0cnVjdCB0bm9kZSAqdG4gPSAoY29uc3Qgc3RydWN0IHRub2RlICopIG47CisJCQlpbnQgaTsKIAotc3RhdGljIHZvaWQgZmliX3RyaWVzdGF0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCisJCQlzLT50bm9kZXMrKzsKKwkJCXMtPm5vZGVzaXplc1t0bi0+Yml0c10rKzsKKwkJCWZvciAoaSA9IDA7IGkgPCAoMTw8dG4tPmJpdHMpOyBpKyspCisJCQkJaWYgKCF0bi0+Y2hpbGRbaV0pCisJCQkJCXMtPm51bGxwb2ludGVycysrOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKgogICoJVGhpcyBvdXRwdXRzIC9wcm9jL25ldC9maWJfdHJpZXN0YXRzCi0gKgotICoJSXQgYWx3YXlzIHdvcmtzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4KLSAqCVRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNoYW5nZWQuCiAgKi8KLQotc3RhdGljIHZvaWQgY29sbGVjdF9hbmRfc2hvdyhzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHNlcV9maWxlICpzZXEpCitzdGF0aWMgdm9pZCB0cmllX3Nob3dfc3RhdHMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB0cmllX3N0YXQgKnN0YXQpCiB7Ci0JaW50IGJ5dGVzID0gMDsgLyogSG93IG1hbnkgYnl0ZXMgYXJlIHVzZWQsIGEgcmVmIGlzIDQgYnl0ZXMgKi8KLQlpbnQgaSwgbWF4LCBwb2ludGVyczsKLQlzdHJ1Y3QgdHJpZV9zdGF0ICpzdGF0OwotCWludCBhdmRlcHRoOworCXVuc2lnbmVkIGksIG1heCwgcG9pbnRlcnMsIGJ5dGVzLCBhdmRlcHRoOwogCi0Jc3RhdCA9IHRyaWVfY29sbGVjdF9zdGF0cyh0KTsKKwlpZiAoc3RhdC0+bGVhdmVzKQorCQlhdmRlcHRoID0gc3RhdC0+dG90ZGVwdGgqMTAwIC8gc3RhdC0+bGVhdmVzOworCWVsc2UKKwkJYXZkZXB0aCA9IDA7CiAKLQlieXRlcyA9IDA7Ci0Jc2VxX3ByaW50ZihzZXEsICJ0cmllPSVwXG4iLCB0KTsKKwlzZXFfcHJpbnRmKHNlcSwgIlx0QXZlciBkZXB0aDogICAgICVkLiUwMmRcbiIsIGF2ZGVwdGggLyAxMDAsIGF2ZGVwdGggJSAxMDAgKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlx0TWF4IGRlcHRoOiAgICAgICV1XG4iLCBzdGF0LT5tYXhkZXB0aCk7CiAKLQlpZiAoc3RhdCkgewotCQlpZiAoc3RhdC0+bGVhdmVzKQotCQkJYXZkZXB0aCA9IHN0YXQtPnRvdGRlcHRoKjEwMCAvIHN0YXQtPmxlYXZlczsKLQkJZWxzZQotCQkJYXZkZXB0aCA9IDA7Ci0JCXNlcV9wcmludGYoc2VxLCAiQXZlciBkZXB0aDogJWQuJTAyZFxuIiwgYXZkZXB0aCAvIDEwMCwgYXZkZXB0aCAlIDEwMCk7Ci0JCXNlcV9wcmludGYoc2VxLCAiTWF4IGRlcHRoOiAlNGRcbiIsIHN0YXQtPm1heGRlcHRoKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlx0TGVhdmVzOiAgICAgICAgICV1XG4iLCBzdGF0LT5sZWF2ZXMpOwogCi0JCXNlcV9wcmludGYoc2VxLCAiTGVhdmVzOiAlZFxuIiwgc3RhdC0+bGVhdmVzKTsKLQkJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBsZWFmKSAqIHN0YXQtPmxlYXZlczsKLQkJc2VxX3ByaW50ZihzZXEsICJJbnRlcm5hbCBub2RlczogJWRcbiIsIHN0YXQtPnRub2Rlcyk7Ci0JCWJ5dGVzICs9IHNpemVvZihzdHJ1Y3QgdG5vZGUpICogc3RhdC0+dG5vZGVzOworCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBsZWFmKSAqIHN0YXQtPmxlYXZlczsKKwlzZXFfcHJpbnRmKHNlcSwgIlx0SW50ZXJuYWwgbm9kZXM6ICVkXG5cdCIsIHN0YXQtPnRub2Rlcyk7CisJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKiBzdGF0LT50bm9kZXM7CiAKLQkJbWF4ID0gTUFYX0NISUxEUy0xOworCW1heCA9IE1BWF9DSElMRFMtMTsKKwl3aGlsZSAobWF4ID49IDAgJiYgc3RhdC0+bm9kZXNpemVzW21heF0gPT0gMCkKKwkJbWF4LS07CiAKLQkJd2hpbGUgKG1heCA+PSAwICYmIHN0YXQtPm5vZGVzaXplc1ttYXhdID09IDApCi0JCQltYXgtLTsKLQkJcG9pbnRlcnMgPSAwOworCXBvaW50ZXJzID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IG1heDsgaSsrKQorCQlpZiAoc3RhdC0+bm9kZXNpemVzW2ldICE9IDApIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAlZDogJWQiLCAgaSwgc3RhdC0+bm9kZXNpemVzW2ldKTsKKwkJCXBvaW50ZXJzICs9ICgxPDxpKSAqIHN0YXQtPm5vZGVzaXplc1tpXTsKKwkJfQorCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJc2VxX3ByaW50ZihzZXEsICJcdFBvaW50ZXJzOiAlZFxuIiwgcG9pbnRlcnMpOwogCi0JCWZvciAoaSA9IDE7IGkgPD0gbWF4OyBpKyspCi0JCQlpZiAoc3RhdC0+bm9kZXNpemVzW2ldICE9IDApIHsKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgJWQ6ICVkIiwgIGksIHN0YXQtPm5vZGVzaXplc1tpXSk7Ci0JCQkJcG9pbnRlcnMgKz0gKDE8PGkpICogc3RhdC0+bm9kZXNpemVzW2ldOwotCQkJfQotCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Ci0JCXNlcV9wcmludGYoc2VxLCAiUG9pbnRlcnM6ICVkXG4iLCBwb2ludGVycyk7Ci0JCWJ5dGVzICs9IHNpemVvZihzdHJ1Y3Qgbm9kZSAqKSAqIHBvaW50ZXJzOwotCQlzZXFfcHJpbnRmKHNlcSwgIk51bGwgcHRyczogJWRcbiIsIHN0YXQtPm51bGxwb2ludGVycyk7Ci0JCXNlcV9wcmludGYoc2VxLCAiVG90YWwgc2l6ZTogJWQgIGtCXG4iLCBieXRlcyAvIDEwMjQpOwotCi0JCWtmcmVlKHN0YXQpOwotCX0KKwlieXRlcyArPSBzaXplb2Yoc3RydWN0IG5vZGUgKikgKiBwb2ludGVyczsKKwlzZXFfcHJpbnRmKHNlcSwgIk51bGwgcHRyczogJWRcbiIsIHN0YXQtPm51bGxwb2ludGVycyk7CisJc2VxX3ByaW50ZihzZXEsICJUb3RhbCBzaXplOiAlZCAga0JcbiIsIChieXRlcyArIDEwMjMpIC8gMTAyNCk7CiAKICNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKIAlzZXFfcHJpbnRmKHNlcSwgIkNvdW50ZXJzOlxuLS0tLS0tLS0tXG4iKTsKQEAgLTIzNjAsMTY5ICsyMTE4LDM3NyBAQAogCiBzdGF0aWMgaW50IGZpYl90cmllc3RhdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQljaGFyIGJmWzEyOF07CisJc3RydWN0IHRyaWVfc3RhdCAqc3RhdDsKIAotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHJpbnRmKHNlcSwgIkJhc2ljIGluZm86IHNpemUgb2YgbGVhZjogJVpkIGJ5dGVzLCBzaXplIG9mIHRub2RlOiAlWmQgYnl0ZXMuXG4iLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBsZWFmKSwgc2l6ZW9mKHN0cnVjdCB0bm9kZSkpOwotCQlpZiAodHJpZV9sb2NhbCkKLQkJCWNvbGxlY3RfYW5kX3Nob3codHJpZV9sb2NhbCwgc2VxKTsKKwlzdGF0ID0ga21hbGxvYyhzaXplb2YoKnN0YXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXQpCisJCXJldHVybiAtRU5PTUVNOwogCi0JCWlmICh0cmllX21haW4pCi0JCQljb2xsZWN0X2FuZF9zaG93KHRyaWVfbWFpbiwgc2VxKTsKLQl9IGVsc2UgewotCQlzbnByaW50ZihiZiwgc2l6ZW9mKGJmKSwgIipcdCUwOFhcdCUwOFgiLCAyMDAsIDQwMCk7CisJc2VxX3ByaW50ZihzZXEsICJCYXNpYyBpbmZvOiBzaXplIG9mIGxlYWY6ICVaZCBieXRlcywgc2l6ZSBvZiB0bm9kZTogJVpkIGJ5dGVzLlxuIiwKKwkJICAgc2l6ZW9mKHN0cnVjdCBsZWFmKSwgc2l6ZW9mKHN0cnVjdCB0bm9kZSkpOwogCi0JCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLCBiZik7CisJaWYgKHRyaWVfbG9jYWwpIHsKKwkJc2VxX3ByaW50ZihzZXEsICJMb2NhbDpcbiIpOworCQl0cmllX2NvbGxlY3Rfc3RhdHModHJpZV9sb2NhbCwgc3RhdCk7CisJCXRyaWVfc2hvd19zdGF0cyhzZXEsIHN0YXQpOwogCX0KKworCWlmICh0cmllX21haW4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICJNYWluOlxuIik7CisJCXRyaWVfY29sbGVjdF9zdGF0cyh0cmllX21haW4sIHN0YXQpOworCQl0cmllX3Nob3dfc3RhdHMoc2VxLCBzdGF0KTsKKwl9CisJa2ZyZWUoc3RhdCk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfdHJpZXN0YXRfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBmaWJfdHJpZXN0YXRfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGZpYl90cmllc3RhdF9zZXFfbmV4dCwKLQkuc3RvcCAgPSBmaWJfdHJpZXN0YXRfc2VxX3N0b3AsCi0JLnNob3cgID0gZmliX3RyaWVzdGF0X3NlcV9zaG93LAotfTsKLQogc3RhdGljIGludCBmaWJfdHJpZXN0YXRfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHNlcV9maWxlICpzZXE7Ci0JaW50IHJjID0gLUVOT01FTTsKLQotCXJjID0gc2VxX29wZW4oZmlsZSwgJmZpYl90cmllc3RhdF9zZXFfb3BzKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0X2tmcmVlOwotCi0Jc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotb3V0OgotCXJldHVybiByYzsKLW91dF9rZnJlZToKLQlnb3RvIG91dDsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZmliX3RyaWVzdGF0X3NlcV9zaG93LCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmliX3RyaWVzdGF0X3NlcV9mb3BzID0geworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmliX3RyaWVzdGF0X2ZvcHMgPSB7CiAJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JPSBmaWJfdHJpZXN0YXRfc2VxX29wZW4sCiAJLnJlYWQJPSBzZXFfcmVhZCwKIAkubGxzZWVrCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotaW50IF9faW5pdCBmaWJfc3RhdF9wcm9jX2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgbm9kZSAqZmliX3RyaWVfZ2V0X2lkeChzdHJ1Y3QgZmliX3RyaWVfaXRlciAqaXRlciwKKwkJCQkgICAgICBsb2ZmX3QgcG9zKQogewotCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoImZpYl90cmllc3RhdCIsIFNfSVJVR08sICZmaWJfdHJpZXN0YXRfc2VxX2ZvcHMpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKLX0KKwlsb2ZmX3QgaWR4ID0gMDsKKwlzdHJ1Y3Qgbm9kZSAqbjsKIAotdm9pZCBfX2luaXQgZmliX3N0YXRfcHJvY19leGl0KHZvaWQpCi17Ci0JcHJvY19uZXRfcmVtb3ZlKCJmaWJfdHJpZXN0YXQiKTsKLX0KKwlmb3IgKG4gPSBmaWJfdHJpZV9nZXRfZmlyc3QoaXRlciwgdHJpZV9sb2NhbCk7CisJICAgICBuOyArK2lkeCwgbiA9IGZpYl90cmllX2dldF9uZXh0KGl0ZXIpKSB7CisJCWlmIChwb3MgPT0gaWR4KQorCQkJcmV0dXJuIG47CisJfQogCi1zdGF0aWMgc3RydWN0IGZpYl9hbGlhcyAqZmliX3RyaWVfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGZpYl9hbGlhcyAqZmliX3RyaWVfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEpCi17CisJZm9yIChuID0gZmliX3RyaWVfZ2V0X2ZpcnN0KGl0ZXIsIHRyaWVfbWFpbik7CisJICAgICBuOyArK2lkeCwgbiA9IGZpYl90cmllX2dldF9uZXh0KGl0ZXIpKSB7CisJCWlmIChwb3MgPT0gaWR4KQorCQkJcmV0dXJuIG47CisJfQogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCAqZmliX3RyaWVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlpZiAoIWlwX2ZpYl9tYWluX3RhYmxlKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICgqcG9zKQotCQlyZXR1cm4gZmliX3RyaWVfZ2V0X25leHQoc2VxKTsKLQllbHNlCisJcmN1X3JlYWRfbG9jaygpOworCWlmICgqcG9zID09IDApCiAJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJcmV0dXJuIGZpYl90cmllX2dldF9pZHgoc2VxLT5wcml2YXRlLCAqcG9zIC0gMSk7CiB9CiAKIHN0YXRpYyB2b2lkICpmaWJfdHJpZV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CisJc3RydWN0IGZpYl90cmllX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJdm9pZCAqbCA9IHY7CisKIAkrKypwb3M7CiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQotCQlyZXR1cm4gZmliX3RyaWVfZ2V0X2ZpcnN0KHNlcSk7Ci0JZWxzZQotCQlyZXR1cm4gZmliX3RyaWVfZ2V0X25leHQoc2VxKTsKKwkJcmV0dXJuIGZpYl90cmllX2dldF9pZHgoaXRlciwgMCk7CiAKKwl2ID0gZmliX3RyaWVfZ2V0X25leHQoaXRlcik7CisJQlVHX09OKHYgPT0gbCk7CisJaWYgKHYpCisJCXJldHVybiB2OworCisJLyogY29udGludWUgc2NhbiBpbiBuZXh0IHRyaWUgKi8KKwlpZiAoaXRlci0+dHJpZSA9PSB0cmllX2xvY2FsKQorCQlyZXR1cm4gZmliX3RyaWVfZ2V0X2ZpcnN0KGl0ZXIsIHRyaWVfbWFpbik7CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgZmliX3RyaWVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLS8qCi0gKglUaGlzIG91dHB1dHMgL3Byb2MvbmV0L2ZpYl90cmllLgotICoKLSAqCUl0IGFsd2F5cyB3b3JrcyBpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUuCi0gKglUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBjaGFuZ2VkLgotICovCitzdGF0aWMgdm9pZCBzZXFfaW5kZW50KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBpbnQgbikKK3sKKwl3aGlsZSAobi0tID4gMCkgc2VxX3B1dHMoc2VxLCAiICAgIik7Cit9CiAKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqcnRuX3Njb3BlKGVudW0gcnRfc2NvcGVfdCBzKQoreworCXN0YXRpYyBjaGFyIGJ1ZlszMl07CisKKwlzd2l0Y2gocykgeworCWNhc2UgUlRfU0NPUEVfVU5JVkVSU0U6IHJldHVybiAidW5pdmVyc2UiOworCWNhc2UgUlRfU0NPUEVfU0lURToJcmV0dXJuICJzaXRlIjsKKwljYXNlIFJUX1NDT1BFX0xJTks6CXJldHVybiAibGluayI7CisJY2FzZSBSVF9TQ09QRV9IT1NUOglyZXR1cm4gImhvc3QiOworCWNhc2UgUlRfU0NPUEVfTk9XSEVSRToJcmV0dXJuICJub3doZXJlIjsKKwlkZWZhdWx0OgorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAic2NvcGU9JWQiLCBzKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpydG5fdHlwZV9uYW1lc1tfX1JUTl9NQVhdID0geworCVtSVE5fVU5TUEVDXSA9ICJVTlNQRUMiLAorCVtSVE5fVU5JQ0FTVF0gPSAiVU5JQ0FTVCIsCisJW1JUTl9MT0NBTF0gPSAiTE9DQUwiLAorCVtSVE5fQlJPQURDQVNUXSA9ICJCUk9BRENBU1QiLAorCVtSVE5fQU5ZQ0FTVF0gPSAiQU5ZQ0FTVCIsCisJW1JUTl9NVUxUSUNBU1RdID0gIk1VTFRJQ0FTVCIsCisJW1JUTl9CTEFDS0hPTEVdID0gIkJMQUNLSE9MRSIsCisJW1JUTl9VTlJFQUNIQUJMRV0gPSAiVU5SRUFDSEFCTEUiLAorCVtSVE5fUFJPSElCSVRdID0gIlBST0hJQklUIiwKKwlbUlROX1RIUk9XXSA9ICJUSFJPVyIsCisJW1JUTl9OQVRdID0gIk5BVCIsCisJW1JUTl9YUkVTT0xWRV0gPSAiWFJFU09MVkUiLAorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpydG5fdHlwZSh1bnNpZ25lZCB0KQoreworCXN0YXRpYyBjaGFyIGJ1ZlszMl07CisKKwlpZiAodCA8IF9fUlROX01BWCAmJiBydG5fdHlwZV9uYW1lc1t0XSkKKwkJcmV0dXJuIHJ0bl90eXBlX25hbWVzW3RdOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0eXBlICVkIiwgdCk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogUHJldHR5IHByaW50IHRoZSB0cmllICovCiBzdGF0aWMgaW50IGZpYl90cmllX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCWNoYXIgYmZbMTI4XTsKKwljb25zdCBzdHJ1Y3QgZmliX3RyaWVfaXRlciAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgbm9kZSAqbiA9IHY7CiAKLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKLQkJaWYgKHRyaWVfbG9jYWwpCi0JCQl0cmllX2R1bXBfc2VxKHNlcSwgdHJpZV9sb2NhbCk7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gMDsKIAotCQlpZiAodHJpZV9tYWluKQotCQkJdHJpZV9kdW1wX3NlcShzZXEsIHRyaWVfbWFpbik7CisJaWYgKElTX1ROT0RFKG4pKSB7CisJCXN0cnVjdCB0bm9kZSAqdG4gPSAoc3RydWN0IHRub2RlICopIG47CisJCXRfa2V5IHByZiA9IG50b2hsKE1BU0tfUEZYKHRuLT5rZXksIHRuLT5wb3MpKTsKKworCQlpZiAoIU5PREVfUEFSRU5UKG4pKSB7CisJCQlpZiAoaXRlci0+dHJpZSA9PSB0cmllX2xvY2FsKQorCQkJCXNlcV9wdXRzKHNlcSwgIjxsb2NhbD46XG4iKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHV0cyhzZXEsICI8bWFpbj46XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9pbmRlbnQoc2VxLCBpdGVyLT5kZXB0aC0xKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICArLS0gJWQuJWQuJWQuJWQvJWRcbiIsCisJCQkJICAgTklQUVVBRChwcmYpLCB0bi0+cG9zKTsKKwkJfQogCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGJmLCBzaXplb2YoYmYpLAotCQkJICIqXHQlMDhYXHQlMDhYIiwgMjAwLCA0MDApOwotCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwgYmYpOworCQlzdHJ1Y3QgbGVhZiAqbCA9IChzdHJ1Y3QgbGVhZiAqKSBuOworCQlpbnQgaTsKKwkJdTMyIHZhbCA9IG50b2hsKGwtPmtleSk7CisKKwkJc2VxX2luZGVudChzZXEsIGl0ZXItPmRlcHRoKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIHwtLSAlZC4lZC4lZC4lZFxuIiwgTklQUVVBRCh2YWwpKTsKKwkJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCQlzdHJ1Y3QgbGVhZl9pbmZvICpsaSA9IGZpbmRfbGVhZl9pbmZvKCZsLT5saXN0LCBpKTsKKwkJCWlmIChsaSkgeworCQkJCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbGktPmZhbGgsIGZhX2xpc3QpIHsKKwkJCQkJc2VxX2luZGVudChzZXEsIGl0ZXItPmRlcHRoKzEpOworCQkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgLyVkICVzICVzIiwgaSwKKwkJCQkJCSAgIHJ0bl9zY29wZShmYS0+ZmFfc2NvcGUpLAorCQkJCQkJICAgcnRuX3R5cGUoZmEtPmZhX3R5cGUpKTsKKwkJCQkJaWYgKGZhLT5mYV90b3MpCisJCQkJCQlzZXFfcHJpbnRmKHNlcSwgInRvcyA9JWRcbiIsCisJCQkJCQkJICAgZmEtPmZhX3Rvcyk7CisJCQkJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJCQkJfQorCQkJfQorCQl9CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmliX3RyaWVfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBmaWJfdHJpZV9zZXFfc3RhcnQsCi0JLm5leHQgID0gZmliX3RyaWVfc2VxX25leHQsCi0JLnN0b3AgID0gZmliX3RyaWVfc2VxX3N0b3AsCi0JLnNob3cgID0gZmliX3RyaWVfc2VxX3Nob3csCisJLnN0YXJ0ICA9IGZpYl90cmllX3NlcV9zdGFydCwKKwkubmV4dCAgID0gZmliX3RyaWVfc2VxX25leHQsCisJLnN0b3AgICA9IGZpYl90cmllX3NlcV9zdG9wLAorCS5zaG93ICAgPSBmaWJfdHJpZV9zZXFfc2hvdywKIH07CiAKIHN0YXRpYyBpbnQgZmliX3RyaWVfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHNlcV9maWxlICpzZXE7CiAJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgZmliX3RyaWVfaXRlciAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXMpCisJCWdvdG8gb3V0OwogCiAJcmMgPSBzZXFfb3BlbihmaWxlLCAmZmliX3RyaWVfc2VxX29wcyk7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9rZnJlZTsKIAotCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKIG91dDoKIAlyZXR1cm4gcmM7CiBvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpYl90cmllX3NlcV9mb3BzID0gewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5vcGVuCT0gZmliX3RyaWVfc2VxX29wZW4sCi0JLnJlYWQJPSBzZXFfcmVhZCwKLQkubGxzZWVrCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmliX3RyaWVfZm9wcyA9IHsKKwkub3duZXIgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICA9IGZpYl90cmllX3NlcV9vcGVuLAorCS5yZWFkICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBmaWJfZmxhZ190cmFucyhpbnQgdHlwZSwgdTMyIG1hc2ssIGNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJc3RhdGljIHVuc2lnbmVkIHR5cGUyZmxhZ3NbUlROX01BWCArIDFdID0geworCQlbN10gPSBSVEZfUkVKRUNULCBbOF0gPSBSVEZfUkVKRUNULAorCX07CisJdW5zaWduZWQgZmxhZ3MgPSB0eXBlMmZsYWdzW3R5cGVdOworCisJaWYgKGZpICYmIGZpLT5maWJfbmgtPm5oX2d3KQorCQlmbGFncyB8PSBSVEZfR0FURVdBWTsKKwlpZiAobWFzayA9PSAweEZGRkZGRkZGKQorCQlmbGFncyB8PSBSVEZfSE9TVDsKKwlmbGFncyB8PSBSVEZfVVA7CisJcmV0dXJuIGZsYWdzOworfQorCisvKgorICoJVGhpcyBvdXRwdXRzIC9wcm9jL25ldC9yb3V0ZS4KKyAqCVRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNoYW5nZWQKKyAqIAlhbmQgbmVlZHMgdG8gYmUgc2FtZSBhcyBmaWJfaGFzaCBvdXRwdXQgdG8gYXZvaWQgYnJlYWtpbmcKKyAqCWxlZ2FjeSB1dGlsaXRpZXMKKyAqLworc3RhdGljIGludCBmaWJfcm91dGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGxlYWYgKmwgPSB2OworCWludCBpOworCWNoYXIgYmZbMTI4XTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwgIklmYWNlXHREZXN0aW5hdGlvblx0R2F0ZXdheSAiCisJCQkgICAiXHRGbGFnc1x0UmVmQ250XHRVc2VcdE1ldHJpY1x0TWFza1x0XHRNVFUiCisJCQkgICAiXHRXaW5kb3dcdElSVFQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKElTX1ROT0RFKGwpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaT0zMjsgaT49MDsgaS0tKSB7CisJCXN0cnVjdCBsZWFmX2luZm8gKmxpID0gZmluZF9sZWFmX2luZm8oJmwtPmxpc3QsIGkpOworCQlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKwkJdTMyIG1hc2ssIHByZWZpeDsKKworCQlpZiAoIWxpKQorCQkJY29udGludWU7CisKKwkJbWFzayA9IGluZXRfbWFrZV9tYXNrKGxpLT5wbGVuKTsKKwkJcHJlZml4ID0gaHRvbmwobC0+a2V5KTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgJmxpLT5mYWxoLCBmYV9saXN0KSB7CisJCQljb25zdCBzdHJ1Y3QgZmliX2luZm8gKmZpID0gcmN1X2RlcmVmZXJlbmNlKGZhLT5mYV9pbmZvKTsKKwkJCXVuc2lnbmVkIGZsYWdzID0gZmliX2ZsYWdfdHJhbnMoZmEtPmZhX3R5cGUsIG1hc2ssIGZpKTsKKworCQkJaWYgKGZhLT5mYV90eXBlID09IFJUTl9CUk9BRENBU1QKKwkJCSAgICB8fCBmYS0+ZmFfdHlwZSA9PSBSVE5fTVVMVElDQVNUKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmkpCisJCQkJc25wcmludGYoYmYsIHNpemVvZihiZiksCisJCQkJCSAiJXNcdCUwOFhcdCUwOFhcdCUwNFhcdCVkXHQldVx0JWRcdCUwOFhcdCVkXHQldVx0JXUiLAorCQkJCQkgZmktPmZpYl9kZXYgPyBmaS0+ZmliX2Rldi0+bmFtZSA6ICIqIiwKKwkJCQkJIHByZWZpeCwKKwkJCQkJIGZpLT5maWJfbmgtPm5oX2d3LCBmbGFncywgMCwgMCwKKwkJCQkJIGZpLT5maWJfcHJpb3JpdHksCisJCQkJCSBtYXNrLAorCQkJCQkgKGZpLT5maWJfYWR2bXNzID8gZmktPmZpYl9hZHZtc3MgKyA0MCA6IDApLAorCQkJCQkgZmktPmZpYl93aW5kb3csCisJCQkJCSBmaS0+ZmliX3J0dCA+PiAzKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihiZiwgc2l6ZW9mKGJmKSwKKwkJCQkJICIqXHQlMDhYXHQlMDhYXHQlMDRYXHQlZFx0JXVcdCVkXHQlMDhYXHQlZFx0JXVcdCV1IiwKKwkJCQkJIHByZWZpeCwgMCwgZmxhZ3MsIDAsIDAsIDAsCisJCQkJCSBtYXNrLCAwLCAwLCAwKTsKKworCQkJc2VxX3ByaW50ZihzZXEsICIlLTEyN3NcbiIsIGJmKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl9yb3V0ZV9zZXFfb3BzID0geworCS5zdGFydCAgPSBmaWJfdHJpZV9zZXFfc3RhcnQsCisJLm5leHQgICA9IGZpYl90cmllX3NlcV9uZXh0LAorCS5zdG9wICAgPSBmaWJfdHJpZV9zZXFfc3RvcCwKKwkuc2hvdyAgID0gZmliX3JvdXRlX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBmaWJfcm91dGVfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgZmliX3RyaWVfaXRlciAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmZmliX3JvdXRlX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpYl9yb3V0ZV9mb3BzID0geworCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgID0gZmliX3JvdXRlX3NlcV9vcGVuLAorCS5yZWFkICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKIH07CiAKIGludCBfX2luaXQgZmliX3Byb2NfaW5pdCh2b2lkKQogewotCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoImZpYl90cmllIiwgU19JUlVHTywgJmZpYl90cmllX3NlcV9mb3BzKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZmliX3RyaWUiLCBTX0lSVUdPLCAmZmliX3RyaWVfZm9wcykpCisJCWdvdG8gb3V0MTsKKworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoImZpYl90cmllc3RhdCIsIFNfSVJVR08sICZmaWJfdHJpZXN0YXRfZm9wcykpCisJCWdvdG8gb3V0MjsKKworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoInJvdXRlIiwgU19JUlVHTywgJmZpYl9yb3V0ZV9mb3BzKSkKKwkJZ290byBvdXQzOworCiAJcmV0dXJuIDA7CisKK291dDM6CisJcHJvY19uZXRfcmVtb3ZlKCJmaWJfdHJpZXN0YXQiKTsKK291dDI6CisJcHJvY19uZXRfcmVtb3ZlKCJmaWJfdHJpZSIpOworb3V0MToKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogdm9pZCBfX2luaXQgZmliX3Byb2NfZXhpdCh2b2lkKQogewogCXByb2NfbmV0X3JlbW92ZSgiZmliX3RyaWUiKTsKKwlwcm9jX25ldF9yZW1vdmUoImZpYl90cmllc3RhdCIpOworCXByb2NfbmV0X3JlbW92ZSgicm91dGUiKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0cGVlci5jIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwppbmRleCBmODRiYTljLi4yZmMzZmQzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0cGVlci5jCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTEwMCw4ICsxMDAsNyBAQAogI2RlZmluZSBQRUVSX01BWF9DTEVBTlVQX1dPUksgMzAKIAogc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcGVlcl9wZXJpb2RpY190aW1lciA9Ci0JVElNRVJfSU5JVElBTElaRVIocGVlcl9jaGVja19leHBpcmUsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihwZWVyX3BlcmlvZGljX3RpbWVyLCBwZWVyX2NoZWNrX2V4cGlyZSwgMCwgMCk7CiAKIC8qIEV4cG9ydGVkIGZvciBzeXNjdGxfbmV0X2lwdjQuICAqLwogaW50IGluZXRfcGVlcl9nY19taW50aW1lID0gMTAgKiBIWiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCmluZGV4IDllNmU2ODMuLmU3ZDI2ZDkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKKysrIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAKIAlpZiAocHNrYl9wdWxsKHNrYiwgaWhsKSA9PSBOVUxMKQogCQlnb3RvIGVycjsKLQlpZiAocHNrYl90cmltKHNrYiwgZW5kLW9mZnNldCkpCisJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIGVuZC1vZmZzZXQpKQogCQlnb3RvIGVycjsKIAogCS8qIEZpbmQgb3V0IHdoaWNoIGZyYWdtZW50cyBhcmUgaW4gZnJvbnQgYW5kIGF0IHRoZSBiYWNrIG9mIHVzCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IGUwNDZmNTUuLjMwYWE4ZTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCkBAIC0zNCw2ICszNCw3IEBACiAKIGNvbmZpZyBJUF9ORl9DT05OVFJBQ0tfTUFSSwogCWJvb2wgICdDb25uZWN0aW9uIG1hcmsgdHJhY2tpbmcgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiBtYXJrcywgdXNlZCBieSB0aGUKIAkgIGBDT05OTUFSSycgdGFyZ2V0IGFuZCBgY29ubm1hcmsnIG1hdGNoLiBTaW1pbGFyIHRvIHRoZSBtYXJrIHZhbHVlCkBAIC04NSw2ICs4NiwyNSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIElQX05GX05FVEJJT1NfTlMKKwl0cmlzdGF0ZSAiTmV0QklPUyBuYW1lIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBOZXRCSU9TIG5hbWUgc2VydmljZSByZXF1ZXN0cyBhcmUgc2VudCBhcyBicm9hZGNhc3QgbWVzc2FnZXMgZnJvbSBhbgorCSAgdW5wcml2aWxlZ2VkIHBvcnQgYW5kIHJlc3BvbmRlZCB0byB3aXRoIHVuaWNhc3QgbWVzc2FnZXMgdG8gdGhlCisJICBzYW1lIHBvcnQuIFRoaXMgbWFrZSB0aGVtIGhhcmQgdG8gZmlyZXdhbGwgcHJvcGVybHkgYmVjYXVzZSBjb25uZWN0aW9uCisJICB0cmFja2luZyBkb2Vzbid0IGRlYWwgd2l0aCBicm9hZGNhc3RzLiBUaGlzIGhlbHBlciB0cmFja3MgbG9jYWxseQorCSAgb3JpZ2luYXRpbmcgTmV0QklPUyBuYW1lIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJICByZXNwb25zZXMuIEl0IHJlbGllcyBvbiBjb3JyZWN0IElQIGFkZHJlc3MgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhbGx5CisJICBuZXRtYXNrIGFuZCBicm9hZGNhc3QgYWRkcmVzcy4gV2hlbiBwcm9wZXJseSBjb25maWd1cmVkLCB0aGUgb3V0cHV0CisJICBvZiAiaXAgYWRkcmVzcyBzaG93IiBzaG91bGQgbG9vayBzaW1pbGFyIHRvIHRoaXM6CisKKwkgICQgaXAgLTQgYWRkcmVzcyBzaG93IGV0aDAKKwkgIDQ6IGV0aDA6IDxCUk9BRENBU1QsTVVMVElDQVNULFVQPiBtdHUgMTUwMCBxZGlzYyBwZmlmb19mYXN0IHFsZW4gMTAwMAorCSAgICAgIGluZXQgMTcyLjE2LjIuMjUyLzI0IGJyZCAxNzIuMTYuMi4yNTUgc2NvcGUgZ2xvYmFsIGV0aDAKKwkgIAorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJUF9ORl9URlRQCiAJdHJpc3RhdGUgIlRGVFAgcHJvdG9jb2wgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGE3YmQzOGYuLjFiYTBkYjcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKIG9iai0kKENPTkZJR19JUF9ORl9URlRQKSArPSBpcF9jb25udHJhY2tfdGZ0cC5vCiBvYmotJChDT05GSUdfSVBfTkZfRlRQKSArPSBpcF9jb25udHJhY2tfZnRwLm8KIG9iai0kKENPTkZJR19JUF9ORl9JUkMpICs9IGlwX2Nvbm50cmFja19pcmMubworb2JqLSQoQ09ORklHX0lQX05GX05FVEJJT1NfTlMpICs9IGlwX2Nvbm50cmFja19uZXRiaW9zX25zLm8KIAogIyBOQVQgaGVscGVycyAKIG9iai0kKENPTkZJR19JUF9ORl9OQVRfQU1BTkRBKSArPSBpcF9uYXRfYW1hbmRhLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jCmluZGV4IGJlNGM5ZWIuLmRjMjA4ODEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJCX0KIAogCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKKwkJZXhwLT5mbGFncyA9IDA7CiAKIAkJZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwOwogCQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMKaW5kZXggYTA2NDg2MC4uMTljYmExNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAKIC8qIGlwX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQordm9pZCBpcF9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCiB7CiAJQVNTRVJUX1dSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKIAlJUF9ORl9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOwpAQCAtMjA3LDE4ICsyMDcsMTIgQEAKIAlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwogfQogCi12b2lkIF9faXBfY3RfZXhwZWN0X3VubGlua19kZXN0cm95KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JdW5saW5rX2V4cGVjdChleHApOwotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGV4cGVjdGF0aW9uX3RpbWVkX291dCh1bnNpZ25lZCBsb25nIHVsX2V4cGVjdCkKIHsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gKHZvaWQgKil1bF9leHBlY3Q7CiAKIAl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JdW5saW5rX2V4cGVjdChleHApOworCWlwX2N0X3VubGlua19leHBlY3QoZXhwKTsKIAl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwogfQpAQCAtMjY0LDEwICsyNTgsMTQgQEAKIAkJICAgbWFzdGVyIGN0IG5ldmVyIGdvdCBjb25maXJtZWQsIHdlJ2QgaG9sZCBhIHJlZmVyZW5jZSB0byBpdAogCQkgICBhbmQgd2VpcmQgdGhpbmdzIHdvdWxkIGhhcHBlbiB0byBmdXR1cmUgcGFja2V0cykuICovCiAJCWlmIChpcF9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykKLQkJICAgICYmIGlzX2NvbmZpcm1lZChpLT5tYXN0ZXIpCi0JCSAgICAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQl1bmxpbmtfZXhwZWN0KGkpOwotCQkJcmV0dXJuIGk7CisJCSAgICAmJiBpc19jb25maXJtZWQoaS0+bWFzdGVyKSkgeworCQkJaWYgKGktPmZsYWdzICYgSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVCkgeworCQkJCWF0b21pY19pbmMoJmktPnVzZSk7CisJCQkJcmV0dXJuIGk7CisJCQl9IGVsc2UgaWYgKGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKKwkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOworCQkJCXJldHVybiBpOworCQkJfQogCQl9CiAJfQogCXJldHVybiBOVUxMOwpAQCAtMjg0LDcgKzI4Miw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaSwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CiAJCWlmIChpLT5tYXN0ZXIgPT0gY3QgJiYgZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJdW5saW5rX2V4cGVjdChpKTsKKwkJCWlwX2N0X3VubGlua19leHBlY3QoaSk7CiAJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKIAkJfQogCX0KQEAgLTkyNSw3ICs5MjMsNyBAQAogCS8qIGNob29zZSB0aGUgdGhlIG9sZGVzdCBleHBlY3RhdGlvbiB0byBldmljdCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CiAJCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHApICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKLQkJCXVubGlua19leHBlY3QoaSk7CisJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwogCQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKIAkJCXJldHVybjsKQEAgLTkzNCw2ICs5MzIsOSBAQAogCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogfQogCisvKiBXZSBkb24ndCBpbmNyZWFzZSB0aGUgbWFzdGVyIGNvbm50cmFjayByZWZjb3VudCBmb3Igbm9uLWZ1bGZpbGxlZAorICogY29ubnRyYWNrcy4gRHVyaW5nIHRoZSBjb25udHJhY2sgZGVzdHJ1Y3Rpb24sIHRoZSBleHBlY3RhdGlvbnMgYXJlIAorICogYWx3YXlzIGtpbGxlZCBiZWZvcmUgdGhlIGNvbm50cmFjayBpdHNlbGYgKi8KIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKHN0cnVjdCBpcF9jb25udHJhY2sgKm1lKQogewogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpuZXc7CkBAIC05NDQsMTcgKzk0NSwxNCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbmV3LT5tYXN0ZXIgPSBtZTsKLQlhdG9taWNfaW5jKCZuZXctPm1hc3Rlci0+Y3RfZ2VuZXJhbC51c2UpOwogCWF0b21pY19zZXQoJm5ldy0+dXNlLCAxKTsKIAlyZXR1cm4gbmV3OwogfQogCiB2b2lkIGlwX2Nvbm50cmFja19leHBlY3RfcHV0KHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmV4cC0+dXNlKSkgewotCQlpcF9jb25udHJhY2tfcHV0KGV4cC0+bWFzdGVyKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZXhwLT51c2UpKQogCQlrbWVtX2NhY2hlX2ZyZWUoaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIGV4cCk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBpcF9jb25udHJhY2tfZXhwZWN0X2luc2VydChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQpAQCAtOTgyLDcgKzk4MCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGksICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKIAkJaWYgKGktPm1hc3RlciA9PSBtYXN0ZXIpIHsKIAkJCWlmIChkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQkJdW5saW5rX2V4cGVjdChpKTsKKwkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwogCQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xMDk5LDcgKzEwOTcsNyBAQAogCS8qIEdldCByaWQgb2YgZXhwZWN0YXRpb25zICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CiAJCWlmIChleHAtPm1hc3Rlci0+aGVscGVyID09IG1lICYmIGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkgewotCQkJdW5saW5rX2V4cGVjdChleHApOworCQkJaXBfY3RfdW5saW5rX2V4cGVjdChleHApOwogCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCmluZGV4IDNhMjYyN2QuLjFiNzllYzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYwpAQCAtNDIxLDYgKzQyMSw3IEBACiAJCSAgeyAweEZGRkZGRkZGLCB7IC50Y3AgPSB7IDB4RkZGRiB9IH0sIDB4RkYgfX0pOwogCiAJZXhwLT5leHBlY3RmbiA9IE5VTEw7CisJZXhwLT5mbGFncyA9IDA7CiAKIAkvKiBOb3csIE5BVCBtaWdodCB3YW50IHRvIG1hbmdsZSB0aGUgcGFja2V0LCBhbmQgcmVnaXN0ZXIgdGhlCiAJICogKHBvc3NpYmx5IGNoYW5nZWQpIGV4cGVjdGF0aW9uIGl0c2VsZi4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jCmluZGV4IDI1NDM4ZWUuLmQ3YThhOTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwpAQCAtMjIxLDYgKzIyMSw3IEBACiAJCQkJeyB7IDAsIHsgMCB9IH0sCiAJCQkJICB7IDB4RkZGRkZGRkYsIHsgLnRjcCA9IHsgMHhGRkZGIH0gfSwgMHhGRiB9fSk7CiAJCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKKwkJCWV4cC0+ZmxhZ3MgPSAwOwogCQkJaWYgKGlwX25hdF9pcmNfaG9vaykKIAkJCQlyZXQgPSBpcF9uYXRfaXJjX2hvb2socHNrYiwgY3RpbmZvLCAKIAkJCQkJCSAgICAgIGFkZHJfYmVnX3AgLSBpYl9wdHIsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGJpb3NfbnMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0Ymlvc19ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGJpb3NfbnMuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqICAgICAgTmV0QklPUyBuYW1lIHNlcnZpY2UgYnJvYWRjYXN0IGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyCisgKgorICogICAgICAoYykgMjAwNSBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKy8qCisgKiAgICAgIFRoaXMgaGVscGVyIHRyYWNrcyBsb2NhbGx5IG9yaWdpbmF0aW5nIE5ldEJJT1MgbmFtZSBzZXJ2aWNlCisgKiAgICAgIHJlcXVlc3RzIGJ5IGlzc3VpbmcgcGVybWFuZW50IGV4cGVjdGF0aW9ucyAodmFsaWQgdW50aWwKKyAqICAgICAgdGltaW5nIG91dCkgbWF0Y2hpbmcgYWxsIHJlcGx5IGNvbm5lY3Rpb25zIGZyb20gdGhlCisgKiAgICAgIGRlc3RpbmF0aW9uIG5ldHdvcmsuIFRoZSBvbmx5IE5ldEJJT1Mgc3BlY2lmaWMgdGhpbmcgaXMKKyAqICAgICAgYWN0dWFsbHkgdGhlIHBvcnQgbnVtYmVyLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5ldEJJT1MgbmFtZSBzZXJ2aWNlIGJyb2FkY2FzdCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAzOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJ0aW1lb3V0IGZvciBtYXN0ZXIgY29ubmVjdGlvbi9yZXBsaWVzIGluIHNlY29uZHMiKTsKKworc3RhdGljIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgdWRwaGRyIF91aCwgKnVoOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKikoKnBza2IpLT5kc3Q7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCXVfaW50MzJfdCBtYXNrID0gMDsKKworCS8qIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXRzICovCisJaWYgKCgqcHNrYiktPnNrID09IE5VTEwpCisJCWdvdG8gb3V0OworCWlmIChydCA9PSBOVUxMIHx8ICEocnQtPnJ0X2ZsYWdzICYgUlRDRl9CUk9BRENBU1QpKQorCQlnb3RvIG91dDsKKwlpZiAoQ1RJTkZPMkRJUihjdGluZm8pICE9IElQX0NUX0RJUl9PUklHSU5BTCkKKwkJZ290byBvdXQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaW5fZGV2ID0gX19pbl9kZXZfZ2V0KHJ0LT51LmRzdC5kZXYpOworCWlmIChpbl9kZXYgIT0gTlVMTCkgeworCQlmb3JfcHJpbWFyeV9pZmEoaW5fZGV2KSB7CisJCQlpZiAoaWZhLT5pZmFfYnJvYWRjYXN0ID09IGlwaC0+ZGFkZHIpIHsKKwkJCQltYXNrID0gaWZhLT5pZmFfbWFzazsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbmRmb3JfaWZhKGluX2Rldik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKG1hc2sgPT0gMCkKKwkJZ290byBvdXQ7CisKKwl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgaXBoLT5paGwgKiA0LCBzaXplb2YoX3VoKSwgJl91aCk7CisJQlVHX09OKHVoID09IE5VTEwpOworCisJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CisJaWYgKGV4cCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwltZW1zZXQoJmV4cC0+dHVwbGUsIDAsIHNpemVvZihleHAtPnR1cGxlKSk7CisJZXhwLT50dXBsZS5zcmMuaXAgICAgICAgICA9IGlwaC0+ZGFkZHIgJiBtYXNrOworCWV4cC0+dHVwbGUuZHN0LmlwICAgICAgICAgPSBpcGgtPnNhZGRyOworCWV4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQgPSB1aC0+c291cmNlOworCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtICAgPSBJUFBST1RPX1VEUDsKKworCW1lbXNldCgmZXhwLT5tYXNrLCAwLCBzaXplb2YoZXhwLT5tYXNrKSk7CisJZXhwLT5tYXNrLnNyYy5pcCAgICAgICAgICA9IG1hc2s7CisJZXhwLT5tYXNrLmRzdC5pcCAgICAgICAgICA9IDB4RkZGRkZGRkY7CisJZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ICA9IDB4RkZGRjsKKwlleHAtPm1hc2suZHN0LnByb3RvbnVtICAgID0gMHhGRjsKKworCWV4cC0+ZXhwZWN0Zm4gICAgICAgICAgICAgPSBOVUxMOworCWV4cC0+ZmxhZ3MgICAgICAgICAgICAgICAgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOworCisJaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCk7CisJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBOVUxMLCB0aW1lb3V0ICogSFopOworb3V0OgorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBoZWxwZXIgPSB7CisJLm5hbWUJCQk9ICJuZXRiaW9zLW5zIiwKKwkudHVwbGUgPSB7CisJCS5zcmMgPSB7CisJCQkudSA9IHsKKwkJCQkudWRwID0geworCQkJCQkucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMTM3KSwKKwkJCQl9CisJCQl9CisJCX0sCisJCS5kc3QgPSB7CisJCQkucHJvdG9udW0JPSBJUFBST1RPX1VEUCwKKwkJfSwKKwl9LAorCS5tYXNrID0geworCQkuc3JjID0geworCQkJLnUgPSB7CisJCQkJLnVkcCA9IHsKKwkJCQkJLnBvcnQJPSAweEZGRkYsCisJCQkJfQorCQkJfQorCQl9LAorCQkuZHN0ID0geworCQkJLnByb3RvbnVtCT0gMHhGRiwKKwkJfSwKKwl9LAorCS5tYXhfZXhwZWN0ZWQJCT0gMSwKKwkubWUJCQk9IFRISVNfTU9EVUxFLAorCS5oZWxwCQkJPSBoZWxwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWhlbHBlci50aW1lb3V0ID0gdGltZW91dDsKKwlyZXR1cm4gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmaGVscGVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmhlbHBlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jCmluZGV4IGE0ZTkyNzguLjE1YWVmMzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0bGluay5jCkBAIC0xMzQ5LDggKzEzNDksMTAgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LAogCQkJCQkgbGlzdCkgewogCQkJaWYgKGV4cC0+bWFzdGVyLT5oZWxwZXIgPT0gaCAKLQkJCSAgICAmJiBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpCi0JCQkJX19pcF9jdF9leHBlY3RfdW5saW5rX2Rlc3Ryb3koZXhwKTsKKwkJCSAgICAmJiBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKKwkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7CisJCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKwkJCX0KIAkJfQogCQl3cml0ZV91bmxvY2soJmlwX2Nvbm50cmFja19sb2NrKTsKIAl9IGVsc2UgewpAQCAtMTM1OCw4ICsxMzYwLDEwIEBACiAJCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LAogCQkJCQkgbGlzdCkgewotCQkJaWYgKGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkKLQkJCQlfX2lwX2N0X2V4cGVjdF91bmxpbmtfZGVzdHJveShleHApOworCQkJaWYgKGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkgeworCQkJCWlwX2N0X3VubGlua19leHBlY3QoZXhwKTsKKwkJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCQkJfQogCQl9CiAJCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogCX0KQEAgLTE0MTMsNiArMTQxNyw3IEBACiAJfQogCQogCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOworCWV4cC0+ZmxhZ3MgPSAwOwogCWV4cC0+bWFzdGVyID0gY3Q7CiAJbWVtY3B5KCZleHAtPnR1cGxlLCAmdHVwbGUsIHNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlKSk7CiAJbWVtY3B5KCZleHAtPm1hc2ssICZtYXNrLCBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKaW5kZXggZjIzZWYxZi4uMTk4NWFiYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC0zNDksNiArMzQ5LDcgQEAKIAlyZXR1cm4gMDsKIAogbmZhdHRyX2ZhaWx1cmU6CisJcmVhZF91bmxvY2tfYmgoJnRjcF9sb2NrKTsKIAlyZXR1cm4gLTE7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggZWU1ODk1YS4uYWUzZTNlNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTk5OCw3ICs5OTgsNyBAQAogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOwogRVhQT1JUX1NZTUJPTF9HUEwoX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQpOwotRVhQT1JUX1NZTUJPTF9HUEwoX19pcF9jdF9leHBlY3RfdW5saW5rX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTF9HUEwoaXBfY3RfdW5saW5rX2V4cGVjdCk7CiAKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3R1cGxlX3Rha2VuKTsKIEVYUE9SVF9TWU1CT0woaXBfY3RfZ2F0aGVyX2ZyYWdzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKaW5kZXggZjhmZjE3MC4uZDJiNTkwNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKQEAgLTc1LDYgKzc1LDcgQEAKIAkJZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ID0gMHhmZmZmOwogCQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhmZjsKIAkJZXhwLT5leHBlY3RmbiA9IE5VTEw7CisJCWV4cC0+ZmxhZ3MgPSAwOwogCiAJCURFQlVHUCgiZXhwZWN0OiAiKTsKIAkJRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jCmluZGV4IDYwZDcwZmEuLmNiNjZiOGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jCkBAIC0yNTUsNiArMjU1LDI3IEBACiAJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGNvbm50cmFjaywgJnJhbmdlLCBob29rbnVtKTsKIH0KIAordW5zaWduZWQgaW50CithbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlwX25hdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwl1X2ludDMyX3QgaXAKKwkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCisJCSAgID8gY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXAKKwkJICAgOiBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCk7CisJdV9pbnQxNl90IGFsbAorCQk9IChIT09LMk1BTklQKGhvb2tudW0pID09IElQX05BVF9NQU5JUF9TUkMKKwkJICAgPyBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51LmFsbAorCQkgICA6IGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUuYWxsKTsKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlCisJCT0geyBJUF9OQVRfUkFOR0VfTUFQX0lQUywgaXAsIGlwLCB7IGFsbCB9LCB7IGFsbCB9IH07CisKKwlERUJVR1AoIkFsbG9jYXRpbmcgTlVMTCBiaW5kaW5nIGZvciBjb25maXJtZWQgJXAgKCV1LiV1LiV1LiV1KVxuIiwKKwkgICAgICAgY29ubnRyYWNrLCBOSVBRVUFEKGlwKSk7CisJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGNvbm50cmFjaywgJnJhbmdlLCBob29rbnVtKTsKK30KKwogaW50IGlwX25hdF9ydWxlX2ZpbmQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAogCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKaW5kZXggODlkYjA1Mi4uMGZmMzY4YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKQEAgLTEyMyw4ICsxMjMsMTIgQEAKIAkJaWYgKCFpcF9uYXRfaW5pdGlhbGl6ZWQoY3QsIG1hbmlwdHlwZSkpIHsKIAkJCXVuc2lnbmVkIGludCByZXQ7CiAKLQkJCS8qIExPQ0FMX0lOIGhvb2sgZG9lc24ndCBoYXZlIGEgY2hhaW4hICAqLwotCQkJaWYgKGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfSU4pCisJCQlpZiAodW5saWtlbHkoaXNfY29uZmlybWVkKGN0KSkpCisJCQkJLyogTkFUIG1vZHVsZSB3YXMgbG9hZGVkIGxhdGUgKi8KKwkJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKGN0LCBpbmZvLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va251bSk7CisJCQllbHNlIGlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOKQorCQkJCS8qIExPQ0FMX0lOIGhvb2sgZG9lc24ndCBoYXZlIGEgY2hhaW4hICAqLwogCQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZyhjdCwgaW5mbywgaG9va251bSk7CiAJCQllbHNlCiAJCQkJcmV0ID0gaXBfbmF0X3J1bGVfZmluZChwc2tiLCBob29rbnVtLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggZjExNWE4NC4uZjA1NzAyNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC05MiwxMCArOTIsNyBAQAogCWZsLmZsX2lwX3Nwb3J0ID0gdGNwaC0+ZGVzdDsKIAlmbC5mbF9pcF9kcG9ydCA9IHRjcGgtPnNvdXJjZTsKIAotCWlmICh4ZnJtX2xvb2t1cCgoc3RydWN0IGRzdF9lbnRyeSAqKikmcnQsICZmbCwgTlVMTCwgMCkpIHsKLQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7Ci0JCXJ0ID0gTlVMTDsKLQl9CisJeGZybV9sb29rdXAoKHN0cnVjdCBkc3RfZW50cnkgKiopJnJ0LCAmZmwsIE5VTEwsIDApOwogCiAJcmV0dXJuIHJ0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCmluZGV4IGMxODg5ZjguLjBjZWUyODYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X293bmVyLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCA4YzBiMTRlLi44NTQ5ZjI2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTE3NjAsNiArMTc2MCw3IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKKwlhdG9taWNfc2V0KCZydGgtPnUuZHN0Ll9fcmVmY250LCAxKTsKIAlydGgtPnUuZHN0LmZsYWdzPSBEU1RfSE9TVDsKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAogCWlmIChyZXMtPmZpLT5maWJfbmhzID4gMSkKQEAgLTE4MjAsNyArMTgyMSw2IEBACiAJZXJyID0gX19ta3JvdXRlX2lucHV0KHNrYiwgcmVzLCBpbl9kZXYsIGRhZGRyLCBzYWRkciwgdG9zLCAmcnRoKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWF0b21pY19zZXQoJnJ0aC0+dS5kc3QuX19yZWZjbnQsIDEpOwogCiAJLyogcHV0IGl0IGludG8gdGhlIGNhY2hlICovCiAJaGFzaCA9IHJ0X2hhc2hfY29kZShkYWRkciwgc2FkZHIgXiAoZmwtPmlpZiA8PCA1KSwgdG9zKTsKQEAgLTE4MzQsOCArMTgzNCw4IEBACiAJCQkJICAgdTMyIGRhZGRyLCB1MzIgc2FkZHIsIHUzMiB0b3MpCiB7CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQKLQlzdHJ1Y3QgcnRhYmxlKiBydGggPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgaG9wLCBob3Bjb3VudCwgbGFzdGhvcDsKKwlzdHJ1Y3QgcnRhYmxlKiBydGggPSBOVUxMLCAqcnRyZXM7CisJdW5zaWduZWQgY2hhciBob3AsIGhvcGNvdW50OwogCWludCBlcnIgPSAtRUlOVkFMOwogCXVuc2lnbmVkIGludCBoYXNoOwogCkBAIC0xODQ0LDggKzE4NDQsNiBAQAogCWVsc2UKIAkJaG9wY291bnQgPSAxOwogCi0JbGFzdGhvcCA9IGhvcGNvdW50IC0gMTsKLQogCS8qIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwYXRoIGFuZCBzaW5nbGVwYXRoICovCiAJaWYgKGhvcGNvdW50IDwgMikKIAkJcmV0dXJuIGlwX21rcm91dGVfaW5wdXRfZGVmKHNrYiwgcmVzLCBmbCwgaW5fZGV2LCBkYWRkciwKQEAgLTE4NTUsNiArMTg1MywxMCBAQAogCWZvciAoaG9wID0gMDsgaG9wIDwgaG9wY291bnQ7IGhvcCsrKSB7CiAJCXJlcy0+bmhfc2VsID0gaG9wOwogCisJCS8qIHB1dCByZWZlcmVuY2UgdG8gcHJldmlvdXMgcmVzdWx0ICovCisJCWlmIChob3ApCisJCQlpcF9ydF9wdXQocnRyZXMpOworCiAJCS8qIGNyZWF0ZSBhIHJvdXRpbmcgY2FjaGUgZW50cnkgKi8KIAkJZXJyID0gX19ta3JvdXRlX2lucHV0KHNrYiwgcmVzLCBpbl9kZXYsIGRhZGRyLCBzYWRkciwgdG9zLAogCQkJCSAgICAgICZydGgpOwpAQCAtMTg2Myw3ICsxODY1LDcgQEAKIAogCQkvKiBwdXQgaXQgaW50byB0aGUgY2FjaGUgKi8KIAkJaGFzaCA9IHJ0X2hhc2hfY29kZShkYWRkciwgc2FkZHIgXiAoZmwtPmlpZiA8PCA1KSwgdG9zKTsKLQkJZXJyID0gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCAoc3RydWN0IHJ0YWJsZSoqKSZza2ItPmRzdCk7CisJCWVyciA9IHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgJnJ0cmVzKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKQEAgLTE4NzMsMTMgKzE4NzUsOCBAQAogCQkJCSAgICAgRklCX1JFU19ORVRNQVNLKCpyZXMpLAogCQkJCSAgICAgcmVzLT5wcmVmaXhsZW4sCiAJCQkJICAgICAmRklCX1JFU19OSCgqcmVzKSk7Ci0KLQkJLyogb25seSBmb3IgdGhlIGxhc3QgaG9wIHRoZSByZWZlcmVuY2UgY291bnQgaXMgaGFuZGxlZAotCQkgKiBvdXRzaWRlCi0JCSAqLwotCQlpZiAoaG9wID09IGxhc3Rob3ApCi0JCQlhdG9taWNfc2V0KCYoc2tiLT5kc3QtPl9fcmVmY250KSwgMSk7CiAJfQorCXNrYi0+ZHN0ID0gJnJ0cmVzLT51LmRzdDsKIAlyZXR1cm4gZXJyOwogI2Vsc2UgLyogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgICovCiAJcmV0dXJuIGlwX21rcm91dGVfaW5wdXRfZGVmKHNrYiwgcmVzLCBmbCwgaW5fZGV2LCBkYWRkciwgc2FkZHIsIHRvcyk7CkBAIC0yMjA4LDYgKzIyMDUsNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQkJCiAKKwlhdG9taWNfc2V0KCZydGgtPnUuZHN0Ll9fcmVmY250LCAxKTsKIAlydGgtPnUuZHN0LmZsYWdzPSBEU1RfSE9TVDsKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAogCWlmIChyZXMtPmZpKSB7CkBAIC0yMjkwLDggKzIyODgsNiBAQAogCWlmIChlcnIgPT0gMCkgewogCQl1MzIgdG9zID0gUlRfRkxfVE9TKG9sZGZscCk7CiAKLQkJYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7Ci0JCQogCQloYXNoID0gcnRfaGFzaF9jb2RlKG9sZGZscC0+Zmw0X2RzdCwgCiAJCQkJICAgIG9sZGZscC0+Zmw0X3NyYyBeIChvbGRmbHAtPm9pZiA8PCA1KSwgdG9zKTsKIAkJZXJyID0gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCBycCk7CkBAIC0yMzI2LDYgKzIzMjIsMTAgQEAKIAkJCWRldjJuZXh0aG9wID0gRklCX1JFU19ERVYoKnJlcyk7CiAJCQlkZXZfaG9sZChkZXYybmV4dGhvcCk7CiAKKwkJCS8qIHB1dCByZWZlcmVuY2UgdG8gcHJldmlvdXMgcmVzdWx0ICovCisJCQlpZiAoaG9wKQorCQkJCWlwX3J0X3B1dCgqcnApOworCiAJCQllcnIgPSBfX21rcm91dGVfb3V0cHV0KCZydGgsIHJlcywgZmwsIG9sZGZscCwKIAkJCQkJICAgICAgIGRldjJuZXh0aG9wLCBmbGFncyk7CiAKQEAgLTIzNTAsNyArMjM1MCw2IEBACiAJCQlpZiAoZXJyICE9IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfQotCQlhdG9taWNfc2V0KCYoKnJwKS0+dS5kc3QuX19yZWZjbnQsIDEpOwogCQlyZXR1cm4gZXJyOwogCX0gZWxzZSB7CiAJCXJldHVybiBpcF9ta3JvdXRlX291dHB1dF9kZWYocnAsIHJlcywgZmwsIG9sZGZscCwgZGV2X291dCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCA2MDk0ZGI1Li5jMTBlNDQzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC00ODUsMTEgKzQ4NSw2IEBACiAJVENQX1NLQl9DQihidWZmKS0+d2hlbiA9IFRDUF9TS0JfQ0Ioc2tiKS0+d2hlbjsKIAlidWZmLT50c3RhbXAgPSBza2ItPnRzdGFtcDsKIAotCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX0xPU1QpIHsKLQkJdHAtPmxvc3Rfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JCXRwLT5sZWZ0X291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCX0KLQogCW9sZF9mYWN0b3IgPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwogCiAJLyogRml4IHVwIHRzb19mYWN0b3IgZm9yIGJvdGggb3JpZ2luYWwgYW5kIG5ldyBTS0IuICAqLwpAQCAtNDk5LDcgKzQ5NCw3IEBACiAJLyogSWYgdGhpcyBwYWNrZXQgaGFzIGJlZW4gc2VudCBvdXQgYWxyZWFkeSwgd2UgbXVzdAogCSAqIGFkanVzdCB0aGUgdmFyaW91cyBwYWNrZXQgY291bnRlcnMuCiAJICovCi0JaWYgKGFmdGVyKHRwLT5zbmRfbnh0LCBUQ1BfU0tCX0NCKGJ1ZmYpLT5lbmRfc2VxKSkgeworCWlmICghYmVmb3JlKHRwLT5zbmRfbnh0LCBUQ1BfU0tCX0NCKGJ1ZmYpLT5lbmRfc2VxKSkgewogCQlpbnQgZGlmZiA9IG9sZF9mYWN0b3IgLSB0Y3Bfc2tiX3Bjb3VudChza2IpIC0KIAkJCXRjcF9za2JfcGNvdW50KGJ1ZmYpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGU1YmVjYTcuLmUwYmQxMDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC0xMTQxLDcgKzExNDEsNyBAQAogCWlmICh1bGVuID4gbGVuIHx8IHVsZW4gPCBzaXplb2YoKnVoKSkKIAkJZ290byBzaG9ydF9wYWNrZXQ7CiAKLQlpZiAocHNrYl90cmltKHNrYiwgdWxlbikpCisJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQogCQlnb3RvIHNob3J0X3BhY2tldDsKIAogCWlmICh1ZHBfY2hlY2tzdW1faW5pdChza2IsIHVoLCB1bGVuLCBzYWRkciwgZGFkZHIpIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IDZkNmZiNzQuLjJmZWEzZjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMTIzLDggKzEyMyw3IEBACiAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh1bnNpZ25lZCBsb25nKTsKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGFkZHJfY2hrX3RpbWVyID0KLQkJCVRJTUVSX0lOSVRJQUxJWkVSKGFkZHJjb25mX3ZlcmlmeSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGFkZHJfY2hrX3RpbWVyLCBhZGRyY29uZl92ZXJpZnksIDAsIDApOwogc3RhdGljIERFRklORV9TUElOTE9DSyhhZGRyY29uZl92ZXJpZnlfbG9jayk7CiAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX2pvaW5fYW55Y2FzdChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZGF0YWdyYW0uYyBiL25ldC9pcHY2L2RhdGFncmFtLmMKaW5kZXggMDE0NjhmYS4uY2M1MTg0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0xNzUsMTAgKzE3NSw4IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkgewotCQlkc3RfcmVsZWFzZShkc3QpOworCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogc291cmNlIGFkZHJlc3MgbG9va3VwIGRvbmUgaW4gaXA2X2RzdF9sb29rdXAgKi8KIApAQCAtMzkwLDMyICszODgsMTAxIEBACiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOwogCX0KIAorCWlmIChucC0+cnhvcHQuYml0cy5yeHRjbGFzcykgeworCQlpbnQgdGNsYXNzID0gKG50b2hsKCoodTMyICopc2tiLT5uaC5pcHY2aCkgPj4gMjApICYgMHhmZjsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9UQ0xBU1MsIHNpemVvZih0Y2xhc3MpLCAmdGNsYXNzKTsKKwl9CisKIAlpZiAobnAtPnJ4b3B0LmJpdHMucnhmbG93ICYmICgqKHUzMiopc2tiLT5uaC5yYXcgJiBJUFY2X0ZMT1dJTkZPX01BU0spKSB7CiAJCXUzMiBmbG93aW5mbyA9ICoodTMyKilza2ItPm5oLnJhdyAmIElQVjZfRkxPV0lORk9fTUFTSzsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9GTE9XSU5GTywgc2l6ZW9mKGZsb3dpbmZvKSwgJmZsb3dpbmZvKTsKIAl9CisKKwkvKiBIYkggaXMgYWxsb3dlZCBvbmx5IG9uY2UgKi8KIAlpZiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyAmJiBvcHQtPmhvcCkgewogCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmhvcDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9IT1BPUFRTLCAocHRyWzFdKzEpPDwzLCBwdHIpOwogCX0KLQlpZiAobnAtPnJ4b3B0LmJpdHMuZHN0b3B0cyAmJiBvcHQtPmRzdDApIHsKKworCWlmIChvcHQtPmxhc3RvcHQgJiYKKwkgICAgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgfHwgbnAtPnJ4b3B0LmJpdHMuc3JjcnQpKSB7CisJCS8qCisJCSAqIFNpbGx5IGVub3VnaCwgYnV0IHdlIG5lZWQgdG8gcmVwYXJzZSBpbiBvcmRlciB0bworCQkgKiByZXBvcnQgZXh0ZW5zaW9uIGhlYWRlcnMgKGV4Y2VwdCBmb3IgSGJIKQorCQkgKiBpbiBvcmRlci4KKwkJICoKKwkJICogQWxzbyBub3RlIHRoYXQgSVBWNl9SRUNWUlRIRFJEU1RPUFRTIGlzIE5PVCAKKwkJICogKGFuZCBXSUxMIE5PVCBiZSkgZGVmaW5lZCBiZWNhdXNlCisJCSAqIElQVjZfUkVDVkRTVE9QVFMgaXMgbW9yZSBnZW5lcmljLiAtLXlvc2hmdWppCisJCSAqLworCQl1bnNpZ25lZCBpbnQgb2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwkJdTggbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisKKwkJd2hpbGUgKG9mZiA8PSBvcHQtPmxhc3RvcHQpIHsKKwkJCXVuc2lnbmVkIGxlbjsKKwkJCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9mZjsKKworCQkJc3dpdGNoKG5leHRoZHIpIHsKKwkJCWNhc2UgSVBQUk9UT19EU1RPUFRTOgorCQkJCW5leHRoZHIgPSBwdHJbMF07CisJCQkJbGVuID0gKHB0clsxXSArIDEpIDw8IDM7CisJCQkJaWYgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMpCisJCQkJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfRFNUT1BUUywgbGVuLCBwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CisJCQkJbmV4dGhkciA9IHB0clswXTsKKwkJCQlsZW4gPSAocHRyWzFdICsgMSkgPDwgMzsKKwkJCQlpZiAobnAtPnJ4b3B0LmJpdHMuc3JjcnQpCisJCQkJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUlRIRFIsIGxlbiwgcHRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBQUk9UT19BSDoKKwkJCQluZXh0aGRyID0gcHRyWzBdOworCQkJCWxlbiA9IChwdHJbMV0gKyAxKSA8PCAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQluZXh0aGRyID0gcHRyWzBdOworCQkJCWxlbiA9IChwdHJbMV0gKyAxKSA8PCAzOworCQkJCWJyZWFrOworCQkJfQorCisJCQlvZmYgKz0gbGVuOworCQl9CisJfQorCisJLyogc29ja2V0IG9wdGlvbnMgaW4gb2xkIHN0eWxlICovCisJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8pIHsKKwkJc3RydWN0IGluNl9wa3RpbmZvIHNyY19pbmZvOworCisJCXNyY19pbmZvLmlwaTZfaWZpbmRleCA9IG9wdC0+aWlmOworCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJQS1RJTkZPLCBzaXplb2Yoc3JjX2luZm8pLCAmc3JjX2luZm8pOworCX0KKwlpZiAobnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkgeworCQlpbnQgaGxpbSA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkySE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOworCX0KKwlpZiAobnAtPnJ4b3B0LmJpdHMub2hvcG9wdHMgJiYgb3B0LT5ob3ApIHsKKwkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5ob3A7CisJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkhPUE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CisJfQorCWlmIChucC0+cnhvcHQuYml0cy5vZHN0b3B0cyAmJiBvcHQtPmRzdDApIHsKIAkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5kc3QwOwotCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X0RTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CisJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkRTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CiAJfQotCWlmIChucC0+cnhvcHQuYml0cy5zcmNydCAmJiBvcHQtPnNyY3J0KSB7CisJaWYgKG5wLT5yeG9wdC5iaXRzLm9zcmNydCAmJiBvcHQtPnNyY3J0KSB7CiAJCXN0cnVjdCBpcHY2X3J0X2hkciAqcnRoZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKHNrYi0+bmgucmF3ICsgb3B0LT5zcmNydCk7Ci0JCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUlRIRFIsIChydGhkci0+aGRybGVuKzEpIDw8IDMsIHJ0aGRyKTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyUlRIRFIsIChydGhkci0+aGRybGVuKzEpIDw8IDMsIHJ0aGRyKTsKIAl9Ci0JaWYgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgJiYgb3B0LT5kc3QxKSB7CisJaWYgKG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzICYmIG9wdC0+ZHN0MSkgewogCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmRzdDE7Ci0JCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfRFNUT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyRFNUT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIGludCBkYXRhZ3JhbV9zZW5kX2N0bChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBmbG93aSAqZmwsCiAJCSAgICAgIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LAotCQkgICAgICBpbnQgKmhsaW1pdCkKKwkJICAgICAgaW50ICpobGltaXQsIGludCAqdGNsYXNzKQogewogCXN0cnVjdCBpbjZfcGt0aW5mbyAqc3JjX2luZm87CiAJc3RydWN0IGNtc2doZHIgKmNtc2c7CkBAIC00MzgsNiArNTA1LDcgQEAKIAogCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgewogIAkJY2FzZSBJUFY2X1BLVElORk86CisgCQljYXNlIElQVjZfMjI5MlBLVElORk86CiAgCQkJaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpbjZfcGt0aW5mbykpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIGV4aXRfZjsKQEAgLTQ5Miw2ICs1NjAsNyBAQAogCQkJZmwtPmZsNl9mbG93bGFiZWwgPSBJUFY2X0ZMT1dJTkZPX01BU0sgJiAqKHUzMiAqKUNNU0dfREFUQShjbXNnKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgSVBWNl8yMjkySE9QT1BUUzoKIAkJY2FzZSBJUFY2X0hPUE9QVFM6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0LT5ob3BvcHQgfHwgY21zZy0+Y21zZ19sZW4gPCBDTVNHX0xFTihzaXplb2Yoc3RydWN0IGlwdjZfb3B0X2hkcikpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTUxMiw3ICs1ODEsNyBAQAogCQkJb3B0LT5ob3BvcHQgPSBoZHI7CiAJCQlicmVhazsKIAotCQljYXNlIElQVjZfRFNUT1BUUzoKKwkJY2FzZSBJUFY2XzIyOTJEU1RPUFRTOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKSkgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJZ290byBleGl0X2Y7CkBAIC01MzYsNiArNjA1LDMzIEBACiAJCQlvcHQtPmRzdDFvcHQgPSBoZHI7CiAJCQlicmVhazsKIAorCQljYXNlIElQVjZfRFNUT1BUUzoKKwkJY2FzZSBJUFY2X1JUSERSRFNUT1BUUzoKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCisJCQloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWxlbiA9ICgoaGRyLT5oZHJsZW4gKyAxKSA8PCAzKTsKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKGxlbikpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfUkFXKSkgeworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlnb3RvIGV4aXRfZjsKKwkJCX0KKwkJCWlmIChjbXNnLT5jbXNnX3R5cGUgPT0gSVBWNl9EU1RPUFRTKSB7CisJCQkJb3B0LT5vcHRfZmxlbiArPSBsZW47CisJCQkJb3B0LT5kc3Qxb3B0ID0gaGRyOworCQkJfSBlbHNlIHsKKwkJCQlvcHQtPm9wdF9uZmxlbiArPSBsZW47CisJCQkJb3B0LT5kc3Qwb3B0ID0gaGRyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2XzIyOTJSVEhEUjoKIAkJY2FzZSBJUFY2X1JUSERSOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpcHY2X3J0X2hkcikpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTU2OCw3ICs2NjQsNyBAQAogCQkJb3B0LT5vcHRfbmZsZW4gKz0gbGVuOwogCQkJb3B0LT5zcmNydCA9IHJ0aGRyOwogCi0JCQlpZiAob3B0LT5kc3Qxb3B0KSB7CisJCQlpZiAoY21zZy0+Y21zZ190eXBlID09IElQVjZfMjI5MlJUSERSICYmIG9wdC0+ZHN0MW9wdCkgewogCQkJCWludCBkc3RoZHJsZW4gPSAoKG9wdC0+ZHN0MW9wdC0+aGRybGVuKzEpPDwzKTsKIAogCQkJCW9wdC0+b3B0X25mbGVuICs9IGRzdGhkcmxlbjsKQEAgLTU3OSw2ICs2NzUsNyBAQAogCiAJCQlicmVhazsKIAorCQljYXNlIElQVjZfMjI5MkhPUExJTUlUOgogCQljYXNlIElQVjZfSE9QTElNSVQ6CiAJCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTU4OCw2ICs2ODUsMjQgQEAKIAkJCSpobGltaXQgPSAqKGludCAqKUNNU0dfREFUQShjbXNnKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgSVBWNl9UQ0xBU1M6CisJCSAgICB7CisJCQlpbnQgdGM7CisKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKSB7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisKKwkJCXRjID0gKihpbnQgKilDTVNHX0RBVEEoY21zZyk7CisJCQlpZiAodGMgPCAwIHx8IHRjID4gMHhmZikKKwkJCQlnb3RvIGV4aXRfZjsKKworCQkJZXJyID0gMDsKKwkJCSp0Y2xhc3MgPSB0YzsKKworCQkJYnJlYWs7CisJCSAgICB9CiAJCWRlZmF1bHQ6CiAJCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpbnZhbGlkIGNtc2cgdHlwZTogJWRcbiIsCiAJCQkgICAgICAgICAgICAgICBjbXNnLT5jbXNnX3R5cGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRycy5jIGIvbmV0L2lwdjYvZXh0aGRycy5jCmluZGV4IDViZTZkYTIuLjkyMjU0OTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2V4dGhkcnMuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzLmMKQEAgLTE2NCw2ICsxNjQsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJb3B0LT5sYXN0b3B0ID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OwogCW9wdC0+ZHN0MSA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKIAogCWlmIChpcDZfcGFyc2VfdGx2KHRsdnByb2NkZXN0b3B0X2xzdCwgc2tiKSkgewpAQCAtMjQzLDYgKzI0NCw3IEBACiAKIGxvb3BlZF9iYWNrOgogCWlmIChoZHItPnNlZ21lbnRzX2xlZnQgPT0gMCkgeworCQlvcHQtPmxhc3RvcHQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CiAJCW9wdC0+c3JjcnQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CiAJCXNrYi0+aC5yYXcgKz0gKGhkci0+aGRybGVuICsgMSkgPDwgMzsKIAkJb3B0LT5kc3QwID0gb3B0LT5kc3QxOwpAQCAtNDA0LDggKzQwNiw3IEBACiAKIAltZW1jcHkob3B0LT5zcmNydCwgaGRyLCBzaXplb2YoKmhkcikpOwogCWlydGhkciA9IChzdHJ1Y3QgcnQwX2hkciopb3B0LT5zcmNydDsKLQkvKiBPYnNvbGV0ZSBmaWVsZCwgTUJaLCB3aGVuIG9yaWdpbmF0ZWQgYnkgdXMgKi8KLQlpcnRoZHItPmJpdG1hcCA9IDA7CisJaXJ0aGRyLT5yZXNlcnZlZCA9IDA7CiAJb3B0LT5zcmNydC0+c2VnbWVudHNfbGVmdCA9IG47CiAJZm9yIChpPTA7IGk8bjsgaSsrKQogCQltZW1jcHkoaXJ0aGRyLT5hZGRyK2ksIHJ0aGRyLT5hZGRyKyhuLTEtaSksIDE2KTsKQEAgLTQ1OSwxMSArNDYwLDEwIEBACiAJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTKTsKIAkJZ290byBkcm9wOwogCX0KLQlpZiAocGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgPCBza2ItPmxlbikgewotCQlfX3Bza2JfdHJpbShza2IsIHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCX0KKworCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCBwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCisJCWdvdG8gZHJvcDsKKwogCXJldHVybiAxOwogCiBkcm9wOgpAQCAtNTM5LDEwICs1MzksMTUgQEAKIAkJCSAgdTggKnByb3RvLAogCQkJICBzdHJ1Y3QgaW42X2FkZHIgKipkYWRkcikKIHsKLQlpZiAob3B0LT5zcmNydCkKKwlpZiAob3B0LT5zcmNydCkgewogCQlpcHY2X3B1c2hfcnRoZHIoc2tiLCBwcm90bywgb3B0LT5zcmNydCwgZGFkZHIpOwotCWlmIChvcHQtPmRzdDBvcHQpCi0JCWlwdjZfcHVzaF9leHRoZHIoc2tiLCBwcm90bywgTkVYVEhEUl9ERVNULCBvcHQtPmRzdDBvcHQpOworCQkvKgorCQkgKiBJUFY2X1JUSERSRFNUT1BUUyBpcyBpZ25vcmVkCisJCSAqIHVubGVzcyBJUFY2X1JUSERSIGlzIHNldCAoUkZDMzU0MikuCisJCSAqLworCQlpZiAob3B0LT5kc3Qwb3B0KQorCQkJaXB2Nl9wdXNoX2V4dGhkcihza2IsIHByb3RvLCBORVhUSERSX0RFU1QsIG9wdC0+ZHN0MG9wdCk7CisJfQogCWlmIChvcHQtPmhvcG9wdCkKIAkJaXB2Nl9wdXNoX2V4dGhkcihza2IsIHByb3RvLCBORVhUSERSX0hPUCwgb3B0LT5ob3BvcHQpOwogfQpAQCAtNTczLDMgKzU3OCw5NyBAQAogCX0KIAlyZXR1cm4gb3B0MjsKIH0KKworc3RhdGljIGludCBpcHY2X3JlbmV3X29wdGlvbih2b2lkICpvaGRyLAorCQkJICAgICBzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9fdXNlciAqbmV3b3B0LCBpbnQgbmV3b3B0bGVuLAorCQkJICAgICBpbnQgaW5oZXJpdCwKKwkJCSAgICAgc3RydWN0IGlwdjZfb3B0X2hkciAqKmhkciwKKwkJCSAgICAgY2hhciAqKnApCit7CisJaWYgKGluaGVyaXQpIHsKKwkJaWYgKG9oZHIpIHsKKwkJCW1lbWNweSgqcCwgb2hkciwgaXB2Nl9vcHRsZW4oKHN0cnVjdCBpcHY2X29wdF9oZHIgKilvaGRyKSk7CisJCQkqaGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikqcDsKKwkJCSpwICs9IENNU0dfQUxJR04oaXB2Nl9vcHRsZW4oKihzdHJ1Y3QgaXB2Nl9vcHRfaGRyICoqKWhkcikpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG5ld29wdCkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCpwLCBuZXdvcHQsIG5ld29wdGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkqaGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikqcDsKKwkJCWlmIChpcHY2X29wdGxlbigqKHN0cnVjdCBpcHY2X29wdF9oZHIgKiopaGRyKSA+IG5ld29wdGxlbikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpwICs9IENNU0dfQUxJR04obmV3b3B0bGVuKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlwdjZfdHhvcHRpb25zICoKK2lwdjZfcmVuZXdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LAorCQkgICBpbnQgbmV3dHlwZSwKKwkJICAgc3RydWN0IGlwdjZfb3B0X2hkciBfX3VzZXIgKm5ld29wdCwgaW50IG5ld29wdGxlbikKK3sKKwlpbnQgdG90X2xlbiA9IDA7CisJY2hhciAqcDsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdDI7CisJaW50IGVycjsKKworCWlmIChuZXd0eXBlICE9IElQVjZfSE9QT1BUUyAmJiBvcHQtPmhvcG9wdCkKKwkJdG90X2xlbiArPSBDTVNHX0FMSUdOKGlwdjZfb3B0bGVuKG9wdC0+aG9wb3B0KSk7CisJaWYgKG5ld3R5cGUgIT0gSVBWNl9SVEhEUkRTVE9QVFMgJiYgb3B0LT5kc3Qwb3B0KQorCQl0b3RfbGVuICs9IENNU0dfQUxJR04oaXB2Nl9vcHRsZW4ob3B0LT5kc3Qwb3B0KSk7CisJaWYgKG5ld3R5cGUgIT0gSVBWNl9SVEhEUiAmJiBvcHQtPnNyY3J0KQorCQl0b3RfbGVuICs9IENNU0dfQUxJR04oaXB2Nl9vcHRsZW4ob3B0LT5zcmNydCkpOworCWlmIChuZXd0eXBlICE9IElQVjZfRFNUT1BUUyAmJiBvcHQtPmRzdDFvcHQpCisJCXRvdF9sZW4gKz0gQ01TR19BTElHTihpcHY2X29wdGxlbihvcHQtPmRzdDFvcHQpKTsKKwlpZiAobmV3b3B0ICYmIG5ld29wdGxlbikKKwkJdG90X2xlbiArPSBDTVNHX0FMSUdOKG5ld29wdGxlbik7CisKKwlpZiAoIXRvdF9sZW4pCisJCXJldHVybiBOVUxMOworCisJb3B0MiA9IHNvY2tfa21hbGxvYyhzaywgdG90X2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFvcHQyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PQlVGUyk7CisKKwltZW1zZXQob3B0MiwgMCwgdG90X2xlbik7CisKKwlvcHQyLT50b3RfbGVuID0gdG90X2xlbjsKKwlwID0gKGNoYXIgKikob3B0MiArIDEpOworCisJZXJyID0gaXB2Nl9yZW5ld19vcHRpb24ob3B0LT5ob3BvcHQsIG5ld29wdCwgbmV3b3B0bGVuLAorCQkJCW5ld3R5cGUgIT0gSVBWNl9IT1BPUFRTLAorCQkJCSZvcHQyLT5ob3BvcHQsICZwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGlwdjZfcmVuZXdfb3B0aW9uKG9wdC0+ZHN0MG9wdCwgbmV3b3B0LCBuZXdvcHRsZW4sCisJCQkJbmV3dHlwZSAhPSBJUFY2X1JUSERSRFNUT1BUUywKKwkJCQkmb3B0Mi0+ZHN0MG9wdCwgJnApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaXB2Nl9yZW5ld19vcHRpb24ob3B0LT5zcmNydCwgbmV3b3B0LCBuZXdvcHRsZW4sCisJCQkJbmV3dHlwZSAhPSBJUFY2X1JUSERSLAorCQkJCShzdHJ1Y3QgaXB2Nl9vcHRfaGRyICoqKW9wdDItPnNyY3J0LCAmcCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBpcHY2X3JlbmV3X29wdGlvbihvcHQtPmRzdDFvcHQsIG5ld29wdCwgbmV3b3B0bGVuLAorCQkJCW5ld3R5cGUgIT0gSVBWNl9EU1RPUFRTLAorCQkJCSZvcHQyLT5kc3Qxb3B0LCAmcCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlvcHQyLT5vcHRfbmZsZW4gPSAob3B0Mi0+aG9wb3B0ID8gaXB2Nl9vcHRsZW4ob3B0Mi0+aG9wb3B0KSA6IDApICsKKwkJCSAgKG9wdDItPmRzdDBvcHQgPyBpcHY2X29wdGxlbihvcHQyLT5kc3Qwb3B0KSA6IDApICsKKwkJCSAgKG9wdDItPnNyY3J0ID8gaXB2Nl9vcHRsZW4ob3B0Mi0+c3JjcnQpIDogMCk7CisJb3B0Mi0+b3B0X2ZsZW4gPSAob3B0Mi0+ZHN0MW9wdCA/IGlwdjZfb3B0bGVuKG9wdDItPmRzdDFvcHQpIDogMCk7CisKKwlyZXR1cm4gb3B0MjsKK291dDoKKwlzb2NrX2tmcmVlX3Moc2ssIHAsIHRvdF9sZW4pOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ljbXAuYyBiL25ldC9pcHY2L2ljbXAuYwppbmRleCBmYThmMWJiLi5iNzE4NWZiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pY21wLmMKKysrIGIvbmV0L2lwdjYvaWNtcC5jCkBAIC0yODcsNyArMjg3LDcgQEAKIAlpbnQgaWlmID0gMDsKIAlpbnQgYWRkcl90eXBlID0gMDsKIAlpbnQgbGVuOwotCWludCBobGltaXQ7CisJaW50IGhsaW1pdCwgdGNsYXNzOwogCWludCBlcnIgPSAwOwogCiAJaWYgKCh1OCopaGRyIDwgc2tiLT5oZWFkIHx8ICh1OCopKGhkcisxKSA+IHNrYi0+dGFpbCkKQEAgLTM3NCw3ICszNzQsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKLQkJZ290byBvdXRfZHN0X3JlbGVhc2U7CisJCWdvdG8gb3V0OwogCiAJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLmZsNl9kc3QpKQogCQlobGltaXQgPSBucC0+bWNhc3RfaG9wczsKQEAgLTM4NSw2ICszODUsMTAgQEAKIAlpZiAoaGxpbWl0IDwgMCkKIAkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOwogCisJdGNsYXNzID0gbnAtPmNvcmsudGNsYXNzOworCWlmICh0Y2xhc3MgPCAwKQorCQl0Y2xhc3MgPSAwOworCiAJbXNnLnNrYiA9IHNrYjsKIAltc2cub2Zmc2V0ID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CiAKQEAgLTQwMCw3ICs0MDQsNyBAQAogCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaWNtcHY2X2dldGZyYWcsICZtc2csCiAJCQkgICAgICBsZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSwKIAkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLAotCQkJICAgICAgaGxpbWl0LCBOVUxMLCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKKwkJCSAgICAgIGhsaW1pdCwgdGNsYXNzLCBOVUxMLCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKIAkJCSAgICAgIE1TR19ET05UV0FJVCk7CiAJaWYgKGVycikgewogCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOwpAQCAtNDM0LDYgKzQzOCw3IEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCWludCBlcnIgPSAwOwogCWludCBobGltaXQ7CisJaW50IHRjbGFzczsKIAogCXNhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOwogCkBAIC00NjQsNyArNDY5LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApCi0JCWdvdG8gb3V0X2RzdF9yZWxlYXNlOworCQlnb3RvIG91dDsKIAogCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC5mbDZfZHN0KSkKIAkJaGxpbWl0ID0gbnAtPm1jYXN0X2hvcHM7CkBAIC00NzUsMTMgKzQ4MCwxNyBAQAogCWlmIChobGltaXQgPCAwKQogCQlobGltaXQgPSBpcHY2X2dldF9ob3BsaW1pdChkc3QtPmRldik7CiAKKwl0Y2xhc3MgPSBucC0+Y29yay50Y2xhc3M7CisJaWYgKHRjbGFzcyA8IDApCisJCXRjbGFzcyA9IDA7CisKIAlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOwogCiAJbXNnLnNrYiA9IHNrYjsKIAltc2cub2Zmc2V0ID0gMDsKIAogCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaWNtcHY2X2dldGZyYWcsICZtc2csIHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksCi0JCQkJc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksIGhsaW1pdCwgTlVMTCwgJmZsLAorCQkJCXNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLCBobGltaXQsIHRjbGFzcywgTlVMTCwgJmZsLAogCQkJCShzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwgTVNHX0RPTlRXQUlUKTsKIAogCWlmIChlcnIpIHsKQEAgLTQ5Niw3ICs1MDUsNiBAQAogb3V0X3B1dDogCiAJaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQogCQlpbjZfZGV2X3B1dChpZGV2KTsKLW91dF9kc3RfcmVsZWFzZToKIAlkc3RfcmVsZWFzZShkc3QpOwogb3V0OiAKIAlpY21wdjZfeG1pdF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9maWIuYyBiL25ldC9pcHY2L2lwNl9maWIuYwppbmRleCAxNmFmODc0Li40ZmNjNWE3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmliLmMKKysrIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCkBAIC05Miw3ICs5Miw3IEBACiAKIHN0YXRpYyBfX3UzMiBydF9zZXJudW07CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcDZfZmliX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoZmliNl9ydW5fZ2MsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihpcDZfZmliX3RpbWVyLCBmaWI2X3J1bl9nYywgMCwgMCk7CiAKIHN0cnVjdCBmaWI2X3dhbGtlcl90IGZpYjZfd2Fsa2VyX2xpc3QgPSB7CiAJLnByZXYJPSAmZmliNl93YWxrZXJfbGlzdCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCBiNmM3M2RhNS4uZjg0MWJkZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCisrKyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbF9odFtGTF9IQVNIX01BU0srMV07CiAKIHN0YXRpYyB2b2lkIGlwNl9mbF9nYyh1bnNpZ25lZCBsb25nIGR1bW15KTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcDZfZmxfZ2NfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihpcDZfZmxfZ2MsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihpcDZfZmxfZ2NfdGltZXIsIGlwNl9mbF9nYywgMCwgMCk7CiAKIC8qIEZMIGhhc2ggdGFibGUgbG9jazogaXQgcHJvdGVjdHMgb25seSBvZiBHQyAqLwogCkBAIC0yMjUsMTYgKzIyNSwyMCBAQAogCQkJCQkgc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbCwKIAkJCQkJIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqIGZvcHQpCiB7Ci0Jc3RydWN0IGlwdjZfdHhvcHRpb25zICogZmxfb3B0ID0gZmwtPm9wdDsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKiBmbF9vcHQgPSBmbCA/IGZsLT5vcHQgOiBOVUxMOwogCi0JaWYgKGZvcHQgPT0gTlVMTCB8fCBmb3B0LT5vcHRfZmxlbiA9PSAwKQotCQlyZXR1cm4gZmxfb3B0OworCWlmIChmb3B0ID09IE5VTEwgfHwgZm9wdC0+b3B0X2ZsZW4gPT0gMCkgeworCQlpZiAoIWZsX29wdCB8fCAhZmxfb3B0LT5kc3Qwb3B0IHx8IGZsX29wdC0+c3JjcnQpCisJCQlyZXR1cm4gZmxfb3B0OworCX0KIAogCWlmIChmbF9vcHQgIT0gTlVMTCkgewogCQlvcHRfc3BhY2UtPmhvcG9wdCA9IGZsX29wdC0+aG9wb3B0OwotCQlvcHRfc3BhY2UtPmRzdDBvcHQgPSBmbF9vcHQtPmRzdDBvcHQ7CisJCW9wdF9zcGFjZS0+ZHN0MG9wdCA9IGZsX29wdC0+c3JjcnQgPyBmbF9vcHQtPmRzdDBvcHQgOiBOVUxMOwogCQlvcHRfc3BhY2UtPnNyY3J0ID0gZmxfb3B0LT5zcmNydDsKIAkJb3B0X3NwYWNlLT5vcHRfbmZsZW4gPSBmbF9vcHQtPm9wdF9uZmxlbjsKKwkJaWYgKGZsX29wdC0+ZHN0MG9wdCAmJiAhZmxfb3B0LT5zcmNydCkKKwkJCW9wdF9zcGFjZS0+b3B0X25mbGVuIC09IGlwdjZfb3B0bGVuKGZsX29wdC0+ZHN0MG9wdCk7CiAJfSBlbHNlIHsKIAkJaWYgKGZvcHQtPm9wdF9uZmxlbiA9PSAwKQogCQkJcmV0dXJuIGZvcHQ7CkBAIC0zMTAsNyArMzE0LDcgQEAKIAkJbXNnLm1zZ19jb250cm9sID0gKHZvaWQqKShmbC0+b3B0KzEpOwogCQlmbG93aS5vaWYgPSAwOwogCi0JCWVyciA9IGRhdGFncmFtX3NlbmRfY3RsKCZtc2csICZmbG93aSwgZmwtPm9wdCwgJmp1bmspOworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bCgmbXNnLCAmZmxvd2ksIGZsLT5vcHQsICZqdW5rLCAmanVuayk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGRvbmU7CiAJCWVyciA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMDFlZjk0Zi4uMmY1ODlmMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJc3RydWN0IGlwdjZoZHIgKmhkcjsKIAl1OCAgcHJvdG8gPSBmbC0+cHJvdG87CiAJaW50IHNlZ19sZW4gPSBza2ItPmxlbjsKLQlpbnQgaGxpbWl0OworCWludCBobGltaXQsIHRjbGFzczsKIAl1MzIgbXR1OwogCiAJaWYgKG9wdCkgewpAQCAtMjAyLDcgKzIwMiw2IEBACiAJICoJRmlsbCBpbiB0aGUgSVB2NiBoZWFkZXIKIAkgKi8KIAotCSoodTMyKiloZHIgPSBodG9ubCgweDYwMDAwMDAwKSB8IGZsLT5mbDZfZmxvd2xhYmVsOwogCWhsaW1pdCA9IC0xOwogCWlmIChucCkKIAkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKQEAgLTIxMSw2ICsyMTAsMTQgQEAKIAlpZiAoaGxpbWl0IDwgMCkKIAkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOwogCisJdGNsYXNzID0gLTE7CisJaWYgKG5wKQorCQl0Y2xhc3MgPSBucC0+dGNsYXNzOworCWlmICh0Y2xhc3MgPCAwKQorCQl0Y2xhc3MgPSAwOworCisJKih1MzIgKiloZHIgPSBodG9ubCgweDYwMDAwMDAwIHwgKHRjbGFzcyA8PCAyMCkpIHwgZmwtPmZsNl9mbG93bGFiZWw7CisKIAloZHItPnBheWxvYWRfbGVuID0gaHRvbnMoc2VnX2xlbik7CiAJaGRyLT5uZXh0aGRyID0gcHJvdG87CiAJaGRyLT5ob3BfbGltaXQgPSBobGltaXQ7CkBAIC03NjIsMTAgKzc2OSwxMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpcDZfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IG9kZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiksCi0JCSAgICB2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLCBpbnQgdHJhbnNoZHJsZW4sCi0JCSAgICBpbnQgaGxpbWl0LCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwgc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHJ0Nl9pbmZvICpydCwKLQkJICAgIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBpcDZfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywKKwlpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKKwl2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLCBpbnQgdHJhbnNoZHJsZW4sCisJaW50IGhsaW1pdCwgaW50IHRjbGFzcywgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsIHN0cnVjdCBmbG93aSAqZmwsCisJc3RydWN0IHJ0Nl9pbmZvICpydCwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CkBAIC04MDMsNiArODExLDcgQEAKIAkJbnAtPmNvcmsucnQgPSBydDsKIAkJaW5ldC0+Y29yay5mbCA9ICpmbDsKIAkJbnAtPmNvcmsuaG9wX2xpbWl0ID0gaGxpbWl0OworCQlucC0+Y29yay50Y2xhc3MgPSB0Y2xhc3M7CiAJCWluZXQtPmNvcmsuZnJhZ3NpemUgPSBtdHUgPSBkc3RfbXR1KHJ0LT51LmRzdC5wYXRoKTsKIAkJaWYgKGRzdF9hbGxmcmFnKHJ0LT51LmRzdC5wYXRoKSkKIAkJCWluZXQtPmNvcmsuZmxhZ3MgfD0gSVBDT1JLX0FMTEZSQUc7CkBAIC0xMDg0LDcgKzEwOTMsOCBAQAogCiAJc2tiLT5uaC5pcHY2aCA9IGhkciA9IChzdHJ1Y3QgaXB2NmhkciopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCi0JKih1MzIqKWhkciA9IGZsLT5mbDZfZmxvd2xhYmVsIHwgaHRvbmwoMHg2MDAwMDAwMCk7CisJKih1MzIqKWhkciA9IGZsLT5mbDZfZmxvd2xhYmVsIHwKKwkJICAgICBodG9ubCgweDYwMDAwMDAwIHwgKChpbnQpbnAtPmNvcmsudGNsYXNzIDw8IDIwKSk7CiAKIAlpZiAoc2tiLT5sZW4gPD0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIElQVjZfTUFYUExFTikKIAkJaGRyLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggMDk2MTM3Mi4uY2Y5NDM3MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtNjczLDExICs2NzMsMTIgQEAKIAogCWlmICgoZHN0ID0gaXA2X3RubF9kc3RfY2hlY2sodCkpICE9IE5VTEwpCiAJCWRzdF9ob2xkKGRzdCk7Ci0JZWxzZQorCWVsc2UgewogCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbCk7CiAKLQlpZiAoZHN0LT5lcnJvciB8fCB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApIDwgMCkKLQkJZ290byB0eF9lcnJfbGlua19mYWlsdXJlOworCQlpZiAoZHN0LT5lcnJvciB8fCB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApIDwgMCkKKwkJCWdvdG8gdHhfZXJyX2xpbmtfZmFpbHVyZTsKKwl9CiAKIAl0ZGV2ID0gZHN0LT5kZXY7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwppbmRleCA3NjQ2NmFmLi44NTY3ODczIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCkBAIC0yMTAsMzkgKzIxMCwxMzkgQEAKIAkJcmV0diA9IDA7CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X1BLVElORk86CisJY2FzZSBJUFY2X1JFQ1ZQS1RJTkZPOgogCQlucC0+cnhvcHQuYml0cy5yeGluZm8gPSB2YWxib29sOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CisJCQorCWNhc2UgSVBWNl8yMjkyUEtUSU5GTzoKKwkJbnAtPnJ4b3B0LmJpdHMucnhvaW5mbyA9IHZhbGJvb2w7CisJCXJldHYgPSAwOworCQlicmVhazsKIAotCWNhc2UgSVBWNl9IT1BMSU1JVDoKKwljYXNlIElQVjZfUkVDVkhPUExJTUlUOgogCQlucC0+cnhvcHQuYml0cy5yeGhsaW0gPSB2YWxib29sOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAKLQljYXNlIElQVjZfUlRIRFI6CisJY2FzZSBJUFY2XzIyOTJIT1BMSU1JVDoKKwkJbnAtPnJ4b3B0LmJpdHMucnhvaGxpbSA9IHZhbGJvb2w7CisJCXJldHYgPSAwOworCQlicmVhazsKKworCWNhc2UgSVBWNl9SRUNWUlRIRFI6CiAJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDIpCiAJCQlnb3RvIGVfaW52YWw7CiAJCW5wLT5yeG9wdC5iaXRzLnNyY3J0ID0gdmFsOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAKLQljYXNlIElQVjZfSE9QT1BUUzoKKwljYXNlIElQVjZfMjI5MlJUSERSOgorCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyKQorCQkJZ290byBlX2ludmFsOworCQlucC0+cnhvcHQuYml0cy5vc3JjcnQgPSB2YWw7CisJCXJldHYgPSAwOworCQlicmVhazsKKworCWNhc2UgSVBWNl9SRUNWSE9QT1BUUzoKIAkJbnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyA9IHZhbGJvb2w7CiAJCXJldHYgPSAwOwogCQlicmVhazsKIAotCWNhc2UgSVBWNl9EU1RPUFRTOgorCWNhc2UgSVBWNl8yMjkySE9QT1BUUzoKKwkJbnAtPnJ4b3B0LmJpdHMub2hvcG9wdHMgPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUkVDVkRTVE9QVFM6CiAJCW5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgPSB2YWxib29sOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAKKwljYXNlIElQVjZfMjI5MkRTVE9QVFM6CisJCW5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzID0gdmFsYm9vbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1RDTEFTUzoKKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMHhmZikKKwkJCWdvdG8gZV9pbnZhbDsKKwkJbnAtPnRjbGFzcyA9IHZhbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCQkKKwljYXNlIElQVjZfUkVDVlRDTEFTUzoKKwkJbnAtPnJ4b3B0LmJpdHMucnh0Y2xhc3MgPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKIAljYXNlIElQVjZfRkxPV0lORk86CiAJCW5wLT5yeG9wdC5iaXRzLnJ4ZmxvdyA9IHZhbGJvb2w7CiAJCXJldHYgPSAwOwogCQlicmVhazsKIAotCWNhc2UgSVBWNl9QS1RPUFRJT05TOgorCWNhc2UgSVBWNl9IT1BPUFRTOgorCWNhc2UgSVBWNl9SVEhEUkRTVE9QVFM6CisJY2FzZSBJUFY2X1JUSERSOgorCWNhc2UgSVBWNl9EU1RPUFRTOgorCXsKKwkJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQ7CisJCWlmIChvcHRsZW4gPT0gMCkKKwkJCW9wdHZhbCA9IDA7CisKKwkJLyogaG9wLWJ5LWhvcCAvIGRlc3RpbmF0aW9uIG9wdGlvbnMgYXJlIHByaXZpbGVnZWQgb3B0aW9uICovCisJCXJldHYgPSAtRVBFUk07CisJCWlmIChvcHRuYW1lICE9IElQVjZfUlRIRFIgJiYgIWNhcGFibGUoQ0FQX05FVF9SQVcpKQorCQkJYnJlYWs7CisKKwkJcmV0diA9IC1FSU5WQUw7CisJCWlmIChvcHRsZW4gJiAweDcgfHwgb3B0bGVuID4gOCAqIDI1NSkKKwkJCWJyZWFrOworCisJCW9wdCA9IGlwdjZfcmVuZXdfb3B0aW9ucyhzaywgbnAtPm9wdCwgb3B0bmFtZSwKKwkJCQkJIChzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9fdXNlciAqKW9wdHZhbCwKKwkJCQkJIG9wdGxlbik7CisJCWlmIChJU19FUlIob3B0KSkgeworCQkJcmV0diA9IFBUUl9FUlIob3B0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcm91dGluZyBoZWFkZXIgb3B0aW9uIG5lZWRzIGV4dHJhIGNoZWNrICovCisJCWlmIChvcHRuYW1lID09IElQVjZfUlRIRFIgJiYgb3B0LT5zcmNydCkgeworCQkJc3RydWN0IGlwdjZfcnRfaGRyICpydGhkciA9IG9wdC0+c3JjcnQ7CisJCQlpZiAocnRoZHItPnR5cGUpCisJCQkJZ290byBzdGlja3lfZG9uZTsKKwkJCWlmICgocnRoZHItPmhkcmxlbiAmIDEpIHx8CisJCQkgICAgKHJ0aGRyLT5oZHJsZW4gPj4gMSkgIT0gcnRoZHItPnNlZ21lbnRzX2xlZnQpCisJCQkJZ290byBzdGlja3lfZG9uZTsKKwkJfQorCisJCXJldHYgPSAwOworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJCWlmIChvcHQpIHsKKwkJCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwkJCQlpZiAoISgoMSA8PCBzay0+c2tfc3RhdGUpICYKKwkJCQkgICAgICAoVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkKKwkJCQkgICAgJiYgaW5ldF9zayhzayktPmRhZGRyICE9IExPT1BCQUNLNF9JUFY2KSB7CisJCQkJCXRwLT5leHRfaGVhZGVyX2xlbiA9IG9wdC0+b3B0X2ZsZW4gKyBvcHQtPm9wdF9uZmxlbjsKKwkJCQkJdGNwX3N5bmNfbXNzKHNrLCB0cC0+cG10dV9jb29raWUpOworCQkJCX0KKwkJCX0KKwkJCW9wdCA9IHhjaGcoJm5wLT5vcHQsIG9wdCk7CisJCQlza19kc3RfcmVzZXQoc2spOworCQl9IGVsc2UgeworCQkJd3JpdGVfbG9jaygmc2stPnNrX2RzdF9sb2NrKTsKKwkJCW9wdCA9IHhjaGcoJm5wLT5vcHQsIG9wdCk7CisJCQl3cml0ZV91bmxvY2soJnNrLT5za19kc3RfbG9jayk7CisJCQlza19kc3RfcmVzZXQoc2spOworCQl9CitzdGlja3lfZG9uZToKKwkJaWYgKG9wdCkKKwkJCXNvY2tfa2ZyZWVfcyhzaywgb3B0LCBvcHQtPnRvdF9sZW4pOworCQlicmVhazsKKwl9CisKKwljYXNlIElQVjZfMjI5MlBLVE9QVElPTlM6CiAJewogCQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7CiAJCXN0cnVjdCBtc2doZHIgbXNnOwpAQCAtMjc2LDcgKzM3Niw3IEBACiAJCW1zZy5tc2dfY29udHJvbGxlbiA9IG9wdGxlbjsKIAkJbXNnLm1zZ19jb250cm9sID0gKHZvaWQqKShvcHQrMSk7CiAKLQkJcmV0diA9IGRhdGFncmFtX3NlbmRfY3RsKCZtc2csICZmbCwgb3B0LCAmanVuayk7CisJCXJldHYgPSBkYXRhZ3JhbV9zZW5kX2N0bCgmbXNnLCAmZmwsIG9wdCwgJmp1bmssICZqdW5rKTsKIAkJaWYgKHJldHYpCiAJCQlnb3RvIGRvbmU7CiB1cGRhdGU6CkBAIC01MjksNiArNjI5LDE3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK2ludCBpcHY2X2dldHNvY2tvcHRfc3RpY2t5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfb3B0X2hkciAqaGRyLAorCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IGxlbikKK3sKKwlpZiAoIWhkcikKKwkJcmV0dXJuIDA7CisJbGVuID0gbWluX3QoaW50LCBsZW4sIGlwdjZfb3B0bGVuKGhkcikpOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBoZHIsIGlwdjZfb3B0bGVuKGhkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gbGVuOworfQorCiBpbnQgaXB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKQEAgLTU2Nyw3ICs2NzgsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWNhc2UgSVBWNl9QS1RPUFRJT05TOgorCWNhc2UgSVBWNl8yMjkyUEtUT1BUSU9OUzoKIAl7CiAJCXN0cnVjdCBtc2doZHIgbXNnOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNjAxLDYgKzcxMiwxNiBAQAogCQkJCWludCBobGltID0gbnAtPm1jYXN0X2hvcHM7CiAJCQkJcHV0X2Ntc2coJm1zZywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOwogCQkJfQorCQkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8pIHsKKwkJCQlzdHJ1Y3QgaW42X3BrdGluZm8gc3JjX2luZm87CisJCQkJc3JjX2luZm8uaXBpNl9pZmluZGV4ID0gbnAtPm1jYXN0X29pZjsKKwkJCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmbnAtPmRhZGRyKTsKKwkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKKwkJCX0KKwkJCWlmIChucC0+cnhvcHQuYml0cy5yeG9obGltKSB7CisJCQkJaW50IGhsaW0gPSBucC0+bWNhc3RfaG9wczsKKwkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkySE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOworCQkJfQogCQl9CiAJCWxlbiAtPSBtc2cubXNnX2NvbnRyb2xsZW47CiAJCXJldHVybiBwdXRfdXNlcihsZW4sIG9wdGxlbik7CkBAIC02MjUsMjYgKzc0Niw2NyBAQAogCQl2YWwgPSBucC0+aXB2Nm9ubHk7CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X1BLVElORk86CisJY2FzZSBJUFY2X1JFQ1ZQS1RJTkZPOgogCQl2YWwgPSBucC0+cnhvcHQuYml0cy5yeGluZm87CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X0hPUExJTUlUOgorCWNhc2UgSVBWNl8yMjkyUEtUSU5GTzoKKwkJdmFsID0gbnAtPnJ4b3B0LmJpdHMucnhvaW5mbzsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUkVDVkhPUExJTUlUOgogCQl2YWwgPSBucC0+cnhvcHQuYml0cy5yeGhsaW07CiAJCWJyZWFrOwogCi0JY2FzZSBJUFY2X1JUSERSOgorCWNhc2UgSVBWNl8yMjkySE9QTElNSVQ6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLnJ4b2hsaW07CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1JFQ1ZSVEhEUjoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuc3JjcnQ7CiAJCWJyZWFrOwogCisJY2FzZSBJUFY2XzIyOTJSVEhEUjoKKwkJdmFsID0gbnAtPnJ4b3B0LmJpdHMub3NyY3J0OworCQlicmVhazsKKwogCWNhc2UgSVBWNl9IT1BPUFRTOgorCWNhc2UgSVBWNl9SVEhEUkRTVE9QVFM6CisJY2FzZSBJUFY2X1JUSERSOgorCWNhc2UgSVBWNl9EU1RPUFRTOgorCXsKKworCQlsb2NrX3NvY2soc2spOworCQlsZW4gPSBpcHY2X2dldHNvY2tvcHRfc3RpY2t5KHNrLCBucC0+b3B0LT5ob3BvcHQsCisJCQkJCSAgICAgb3B0dmFsLCBsZW4pOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcHV0X3VzZXIobGVuLCBvcHRsZW4pOworCX0KKworCWNhc2UgSVBWNl9SRUNWSE9QT1BUUzoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuaG9wb3B0czsKIAkJYnJlYWs7CiAKLQljYXNlIElQVjZfRFNUT1BUUzoKKwljYXNlIElQVjZfMjI5MkhPUE9QVFM6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLm9ob3BvcHRzOworCQlicmVhazsKKworCWNhc2UgSVBWNl9SRUNWRFNUT1BUUzoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuZHN0b3B0czsKIAkJYnJlYWs7CiAKKwljYXNlIElQVjZfMjI5MkRTVE9QVFM6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzOworCQlicmVhazsKKworCWNhc2UgSVBWNl9UQ0xBU1M6CisJCXZhbCA9IG5wLT50Y2xhc3M7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1JFQ1ZUQ0xBU1M6CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLnJ4dGNsYXNzOworCQlicmVhazsKKwogCWNhc2UgSVBWNl9GTE9XSU5GTzoKIAkJdmFsID0gbnAtPnJ4b3B0LmJpdHMucnhmbG93OwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IGE3ZWFlMzAuLjU1NWEzMTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNDQ3LDEwICs0NDcsOCBAQAogCQlyZXR1cm47CiAKIAllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybjsKLQl9CiAKIAlpZiAoaW5jX29wdCkgewogCQlpZiAoZGV2LT5hZGRyX2xlbikKQEAgLTUzOSwxMCArNTM3LDggQEAKIAkJcmV0dXJuOwogCiAJZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkc3RfcmVsZWFzZShkc3QpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm47Ci0JfQogCiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKIAlzZW5kX2xsaW5mbyA9IGRldi0+YWRkcl9sZW4gJiYgIWlwdjZfYWRkcl9hbnkoc2FkZHIpOwpAQCAtNjE2LDEwICs2MTIsOCBAQAogCQlyZXR1cm47CiAKIAllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybjsKLQl9CiAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKTsKIAlpZiAoZGV2LT5hZGRyX2xlbikKQEAgLTEzNTMsMTAgKzEzNDcsOCBAQAogCQlyZXR1cm47CiAKIAllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIpIHsKLQkJZHN0X3JlbGVhc2UoZHN0KTsKKwlpZiAoZXJyKQogCQlyZXR1cm47Ci0JfQogCiAJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopIGRzdDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwppbmRleCAxNDMxNmMzLi5iMDNlODdhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwpAQCAtMTAwLDExICsxMDAsOCBAQAogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgJmZsKTsKIAlpZiAoZHN0ID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAoZHN0LT5lcnJvciB8fAotCSAgICB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKGRzdC0+ZXJyb3IgfHwgeGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKSkKIAkJcmV0dXJuOwotCX0KIAogCWhoX2xlbiA9IChkc3QtPmRldi0+aGFyZF9oZWFkZXJfbGVuICsgMTUpJn4xNTsKIAluc2tiID0gYWxsb2Nfc2tiKGhoX2xlbiArIDE1ICsgZHN0LT5oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKaW5kZXggOWI5MWRlYy4uNGRlNGNkYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfb3duZXIuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCmluZGV4IGE5NTI2YjcuLjJiYjY3MDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwpAQCAtMTYxLDggKzE2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJ0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX0xFTikpKSk7CiAgICAgICAgREVCVUdQKCJyZXMgJTAyWCAlMDJYICUwMlggIiwgCi0gICAgICAgCQkocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSwgKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+Yml0bWFwLAotICAgICAgIAkJISgocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSAmJiAoKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+Yml0bWFwKSkpOworICAgICAgIAkJKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1JFUyksICgoc3RydWN0IHJ0MF9oZHIgKilyaCktPnJlc2VydmVkLAorICAgICAgIAkJISgocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSAmJiAoKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+cmVzZXJ2ZWQpKSk7CiAKICAgICAgICByZXQgPSAocmggIT0gTlVMTCkKICAgICAgICAJCSYmCkBAIC0xNzksMTIgKzE3OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX1RZUCkpKTsKIAogCWlmIChyZXQgJiYgKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1JFUykpIHsKLQkJdV9pbnQzMl90ICpicCwgX2JpdG1hcDsKLQkJYnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAotCQkJCQlwdHIgKyBvZmZzZXRvZihzdHJ1Y3QgcnQwX2hkciwgYml0bWFwKSwKLQkJCQkJc2l6ZW9mKF9iaXRtYXApLCAmX2JpdG1hcCk7CisJCXVfaW50MzJfdCAqcnAsIF9yZXNlcnZlZDsKKwkJcnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAorCQkJCQlwdHIgKyBvZmZzZXRvZihzdHJ1Y3QgcnQwX2hkciwgcmVzZXJ2ZWQpLAorCQkJCQlzaXplb2YoX3Jlc2VydmVkKSwgJl9yZXNlcnZlZCk7CiAKLQkJcmV0ID0gKCpicCA9PSAwKTsKKwkJcmV0ID0gKCpycCA9PSAwKTsKIAl9CiAKIAlERUJVR1AoIiMlZCAiLHJ0aW5mby0+YWRkcm5yKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Jhdy5jIGIvbmV0L2lwdjYvcmF3LmMKaW5kZXggZWQzYTc2Yi4uNWFhMzY5MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmF3LmMKKysrIGIvbmV0L2lwdjYvcmF3LmMKQEAgLTY1NSw2ICs2NTUsNyBAQAogCXN0cnVjdCBmbG93aSBmbDsKIAlpbnQgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOwogCWludCBobGltaXQgPSAtMTsKKwlpbnQgdGNsYXNzID0gLTE7CiAJdTE2IHByb3RvOwogCWludCBlcnI7CiAKQEAgLTc0MCw3ICs3NDEsNyBAQAogCQltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwdjZfdHhvcHRpb25zKSk7CiAJCW9wdC0+dG90X2xlbiA9IHNpemVvZihzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMpOwogCi0JCWVyciA9IGRhdGFncmFtX3NlbmRfY3RsKG1zZywgJmZsLCBvcHQsICZobGltaXQpOworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csICZmbCwgb3B0LCAmaGxpbWl0LCAmdGNsYXNzKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKIAkJCXJldHVybiBlcnI7CkBAIC03NTUsOCArNzU2LDcgQEAKIAl9CiAJaWYgKG9wdCA9PSBOVUxMKQogCQlvcHQgPSBucC0+b3B0OwotCWlmIChmbG93bGFiZWwpCi0JCW9wdCA9IGZsNl9tZXJnZV9vcHRpb25zKCZvcHRfc3BhY2UsIGZsb3dsYWJlbCwgb3B0KTsKKwlvcHQgPSBmbDZfbWVyZ2Vfb3B0aW9ucygmb3B0X3NwYWNlLCBmbG93bGFiZWwsIG9wdCk7CiAKIAlmbC5wcm90byA9IHByb3RvOwogCXJhd3Y2X3Byb2JlX3Byb3RvX29wdCgmZmwsIG1zZyk7CkBAIC03ODIsMTAgKzc4Miw4IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkgewotCQlkc3RfcmVsZWFzZShkc3QpOworCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKGhsaW1pdCA8IDApIHsKIAkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLmZsNl9kc3QpKQpAQCAtNzk4LDYgKzc5NiwxMiBAQAogCQkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOwogCX0KIAorCWlmICh0Y2xhc3MgPCAwKSB7CisJCXRjbGFzcyA9IG5wLT5jb3JrLnRjbGFzczsKKwkJaWYgKHRjbGFzcyA8IDApCisJCQl0Y2xhc3MgPSAwOworCX0KKwogCWlmIChtc2ctPm1zZ19mbGFncyZNU0dfQ09ORklSTSkKIAkJZ290byBkb19jb25maXJtOwogCkBAIC04MDYsOCArODEwLDkgQEAKIAkJZXJyID0gcmF3djZfc2VuZF9oZHJpbmMoc2ssIG1zZy0+bXNnX2lvdiwgbGVuLCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwgbXNnLT5tc2dfZmxhZ3MpOwogCX0gZWxzZSB7CiAJCWxvY2tfc29jayhzayk7Ci0JCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIGxlbiwgMCwKLQkJCQkJaGxpbWl0LCBvcHQsICZmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LCBtc2ctPm1zZ19mbGFncyk7CisJCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsCisJCQlsZW4sIDAsIGhsaW1pdCwgdGNsYXNzLCBvcHQsICZmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LAorCQkJbXNnLT5tc2dfZmxhZ3MpOwogCiAJCWlmIChlcnIpCiAJCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IDlkOWUwNDMuLmU0ZmU5ZWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTQ3OSwxMiArNDc5LDkgQEAKIAkvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSAnZGF0YScgcGFydC4gKi8KIAlpZiAoIXBza2JfcHVsbChza2IsICh1OCAqKSAoZmhkciArIDEpIC0gc2tiLT5kYXRhKSkKIAkJZ290byBlcnI7Ci0JaWYgKGVuZC1vZmZzZXQgPCBza2ItPmxlbikgewotCQlpZiAocHNrYl90cmltKHNrYiwgZW5kIC0gb2Zmc2V0KSkKLQkJCWdvdG8gZXJyOwotCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JfQorCQorCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCBlbmQgLSBvZmZzZXQpKQorCQlnb3RvIGVycjsKIAogCS8qIEZpbmQgb3V0IHdoaWNoIGZyYWdtZW50cyBhcmUgaW4gZnJvbnQgYW5kIGF0IHRoZSBiYWNrIG9mIHVzCiAJICogaW4gdGhlIGNoYWluIG9mIGZyYWdtZW50cyBzbyBmYXIuICBXZSBtdXN0IGtub3cgd2hlcmUgdG8gcHV0CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCA3OTQ3MzRmLi44MDY0M2U2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTYzMiwxMCArNjMyLDggQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKSB7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7CisJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQogCQlnb3RvIGZhaWx1cmU7Ci0JfQogCiAJaWYgKHNhZGRyID09IE5VTEwpIHsKIAkJc2FkZHIgPSAmZmwuZmw2X3NyYzsKQEAgLTg0OSw3ICs4NDcsNyBAQAogCWlmIChkc3QgPT0gTlVMTCkgewogCQlvcHQgPSBucC0+b3B0OwogCQlpZiAob3B0ID09IE5VTEwgJiYKLQkJICAgIG5wLT5yeG9wdC5iaXRzLnNyY3J0ID09IDIgJiYKKwkJICAgIG5wLT5yeG9wdC5iaXRzLm9zcmNydCA9PSAyICYmCiAJCSAgICB0cmVxLT5wa3RvcHRzKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0b3B0cyA9IHRyZXEtPnBrdG9wdHM7CiAJCQlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKnJ4b3B0ID0gSVA2Q0IocGt0b3B0cyk7CkBAIC04ODgsNyArODg2LDYgQEAKIAl9CiAKIGRvbmU6Ci0JZHN0X3JlbGVhc2UoZHN0KTsKICAgICAgICAgaWYgKG9wdCAmJiBvcHQgIT0gbnAtPm9wdCkKIAkJc29ja19rZnJlZV9zKHNrLCBvcHQsIG9wdC0+dG90X2xlbik7CiAJcmV0dXJuIGVycjsKQEAgLTkxNSwxMSArOTEyLDEwIEBACiAJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOwogCiAJaWYgKG5wLT5yeG9wdC5hbGwpIHsKLQkJaWYgKChvcHQtPmhvcCAmJiBucC0+cnhvcHQuYml0cy5ob3BvcHRzKSB8fAotCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0smKih1MzIqKXNrYi0+bmgucmF3KSAmJgotCQkgICAgIG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdykgfHwKLQkJICAgIChvcHQtPnNyY3J0ICYmIG5wLT5yeG9wdC5iaXRzLnNyY3J0KSB8fAotCQkgICAgKChvcHQtPmRzdDEgfHwgb3B0LT5kc3QwKSAmJiBucC0+cnhvcHQuYml0cy5kc3RvcHRzKSkKKwkJaWYgKChvcHQtPmhvcCAmJiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyB8fCBucC0+cnhvcHQuYml0cy5vaG9wb3B0cykpIHx8CisJCSAgICAoKElQVjZfRkxPV0lORk9fTUFTSyAmICoodTMyKilza2ItPm5oLnJhdykgJiYgbnAtPnJ4b3B0LmJpdHMucnhmbG93KSB8fAorCQkgICAgKG9wdC0+c3JjcnQgJiYgKG5wLT5yeG9wdC5iaXRzLnNyY3J0IHx8IG5wLT5yeG9wdC5iaXRzLm9zcmNydCkpIHx8CisJCSAgICAoKG9wdC0+ZHN0MSB8fCBvcHQtPmRzdDApICYmIChucC0+cnhvcHQuYml0cy5kc3RvcHRzIHx8IG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzKSkpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMDAxLDEwICs5OTcsOCBAQAogCS8qIHNrID0gTlVMTCwgYnV0IGl0IGlzIHNhZmUgZm9yIG5vdy4gUlNUIHNvY2tldCByZXF1aXJlZC4gKi8KIAlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKIAotCQlpZiAoKHhmcm1fbG9va3VwKCZidWZmLT5kc3QsICZmbCwgTlVMTCwgMCkpIDwgMCkgewotCQkJZHN0X3JlbGVhc2UoYnVmZi0+ZHN0KTsKKwkJaWYgKCh4ZnJtX2xvb2t1cCgmYnVmZi0+ZHN0LCAmZmwsIE5VTEwsIDApKSA8IDApCiAJCQlyZXR1cm47Ci0JCX0KIAogCQlpcDZfeG1pdChOVUxMLCBidWZmLCAmZmwsIE5VTEwsIDApOwogCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfT1VUU0VHUyk7CkBAIC0xMDY4LDEwICsxMDYyLDggQEAKIAlmbC5mbF9pcF9zcG9ydCA9IHQxLT5zb3VyY2U7CiAKIAlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKLQkJaWYgKCh4ZnJtX2xvb2t1cCgmYnVmZi0+ZHN0LCAmZmwsIE5VTEwsIDApKSA8IDApIHsKLQkJCWRzdF9yZWxlYXNlKGJ1ZmYtPmRzdCk7CisJCWlmICgoeGZybV9sb29rdXAoJmJ1ZmYtPmRzdCwgJmZsLCBOVUxMLCAwKSkgPCAwKQogCQkJcmV0dXJuOwotCQl9CiAJCWlwNl94bWl0KE5VTEwsIGJ1ZmYsICZmbCwgTlVMTCwgMCk7CiAJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRTRUdTKTsKIAkJcmV0dXJuOwpAQCAtMTE5MCw4ICsxMTgyLDggQEAKIAlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgc2tiLT5oLnRoKTsKIAl0cmVxLT5wa3RvcHRzID0gTlVMTDsKIAlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIHNrYikgfHwKLQkgICAgbnAtPnJ4b3B0LmJpdHMucnhpbmZvIHx8Ci0JICAgIG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSkgeworCSAgICBucC0+cnhvcHQuYml0cy5yeGluZm8gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaW5mbyB8fAorCSAgICBucC0+cnhvcHQuYml0cy5yeGhsaW0gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkgewogCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKIAkJdHJlcS0+cGt0b3B0cyA9IHNrYjsKIAl9CkBAIC0xMjg4LDcgKzEyODAsNyBAQAogCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKIAotCWlmIChucC0+cnhvcHQuYml0cy5zcmNydCA9PSAyICYmCisJaWYgKG5wLT5yeG9wdC5iaXRzLm9zcmNydCA9PSAyICYmCiAJICAgIG9wdCA9PSBOVUxMICYmIHRyZXEtPnBrdG9wdHMpIHsKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpyeG9wdCA9IElQNkNCKHRyZXEtPnBrdG9wdHMpOwogCQlpZiAocnhvcHQtPnNyY3J0KQpAQCAtMTU0NCw5ICsxNTM2LDkgQEAKIAl0cCA9IHRjcF9zayhzayk7CiAJaWYgKFRDUF9TS0JfQ0Iob3B0X3NrYiktPmVuZF9zZXEgPT0gdHAtPnJjdl9ueHQgJiYKIAkgICAgISgoMSA8PCBzay0+c2tfc3RhdGUpICYgKFRDUEZfQ0xPU0UgfCBUQ1BGX0xJU1RFTikpKSB7Ci0JCWlmIChucC0+cnhvcHQuYml0cy5yeGluZm8pCisJCWlmIChucC0+cnhvcHQuYml0cy5yeGluZm8gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaW5mbykKIAkJCW5wLT5tY2FzdF9vaWYgPSBpbmV0Nl9paWYob3B0X3NrYik7Ci0JCWlmIChucC0+cnhvcHQuYml0cy5yeGhsaW0pCisJCWlmIChucC0+cnhvcHQuYml0cy5yeGhsaW0gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkKIAkJCW5wLT5tY2FzdF9ob3BzID0gb3B0X3NrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKIAkJaWYgKGlwdjZfb3B0X2FjY2VwdGVkKHNrLCBvcHRfc2tiKSkgewogCQkJc2tiX3NldF9vd25lcl9yKG9wdF9za2IsIHNrKTsKQEAgLTE3MzQsNyArMTcyNiw2IEBACiAKIAkJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKSB7CiAJCQlzay0+c2tfZXJyX3NvZnQgPSAtZXJyOwotCQkJZHN0X3JlbGVhc2UoZHN0KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIApAQCAtMTc4Nyw3ICsxNzc4LDYgQEAKIAogCQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApIHsKIAkJCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKLQkJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggMzkwZDc1MC4uNjliMTQ2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCX0KIAogCWlmICh1bGVuIDwgc2tiLT5sZW4pIHsKLQkJaWYgKF9fcHNrYl90cmltKHNrYiwgdWxlbikpCisJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCB1bGVuKSkKIAkJCWdvdG8gZGlzY2FyZDsKIAkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CiAJCWRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOwpAQCAtNjM3LDYgKzYzNyw3IEBACiAJaW50IGFkZHJfbGVuID0gbXNnLT5tc2dfbmFtZWxlbjsKIAlpbnQgdWxlbiA9IGxlbjsKIAlpbnQgaGxpbWl0ID0gLTE7CisJaW50IHRjbGFzcyA9IC0xOwogCWludCBjb3JrcmVxID0gdXAtPmNvcmtmbGFnIHx8IG1zZy0+bXNnX2ZsYWdzJk1TR19NT1JFOwogCWludCBlcnI7CiAKQEAgLTc1OCw3ICs3NTksNyBAQAogCQltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwdjZfdHhvcHRpb25zKSk7CiAJCW9wdC0+dG90X2xlbiA9IHNpemVvZigqb3B0KTsKIAotCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csIGZsLCBvcHQsICZobGltaXQpOworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csIGZsLCBvcHQsICZobGltaXQsICZ0Y2xhc3MpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOwogCQkJcmV0dXJuIGVycjsKQEAgLTc3Myw4ICs3NzQsNyBAQAogCX0KIAlpZiAob3B0ID09IE5VTEwpCiAJCW9wdCA9IG5wLT5vcHQ7Ci0JaWYgKGZsb3dsYWJlbCkKLQkJb3B0ID0gZmw2X21lcmdlX29wdGlvbnMoJm9wdF9zcGFjZSwgZmxvd2xhYmVsLCBvcHQpOworCW9wdCA9IGZsNl9tZXJnZV9vcHRpb25zKCZvcHRfc3BhY2UsIGZsb3dsYWJlbCwgb3B0KTsKIAogCWZsLT5wcm90byA9IElQUFJPVE9fVURQOwogCWlwdjZfYWRkcl9jb3B5KCZmbC0+Zmw2X2RzdCwgZGFkZHIpOwpAQCAtNzk5LDEwICs3OTksOCBAQAogCWlmIChmaW5hbF9wKQogCQlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCBmbCwgc2ssIDApKSA8IDApIHsKLQkJZHN0X3JlbGVhc2UoZHN0KTsKKwlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsIGZsLCBzaywgMCkpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKGhsaW1pdCA8IDApIHsKIAkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLT5mbDZfZHN0KSkKQEAgLTgxNSw2ICs4MTMsMTIgQEAKIAkJCWhsaW1pdCA9IGlwdjZfZ2V0X2hvcGxpbWl0KGRzdC0+ZGV2KTsKIAl9CiAKKwlpZiAodGNsYXNzIDwgMCkgeworCQl0Y2xhc3MgPSBucC0+dGNsYXNzOworCQlpZiAodGNsYXNzIDwgMCkKKwkJCXRjbGFzcyA9IDA7CisJfQorCiAJaWYgKG1zZy0+bXNnX2ZsYWdzJk1TR19DT05GSVJNKQogCQlnb3RvIGRvX2NvbmZpcm07CiBiYWNrX2Zyb21fY29uZmlybToKQEAgLTgzNCw5ICs4MzgsMTAgQEAKIAogZG9fYXBwZW5kX2RhdGE6CiAJdXAtPmxlbiArPSB1bGVuOwotCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIHVsZW4sIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKLQkJCSAgICAgIGhsaW1pdCwgb3B0LCBmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LAotCQkJICAgICAgY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOworCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIHVsZW4sCisJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgaGxpbWl0LCB0Y2xhc3MsIG9wdCwgZmwsCisJCShzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKKwkJY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOwogCWlmIChlcnIpCiAJCXVkcF92Nl9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJZWxzZSBpZiAoIWNvcmtyZXEpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYwppbmRleCAyNDliZGRiLi5mODFmZThjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKQEAgLTM3MSw2ICszNzEsMTIgQEAKIAkJYnJlYWs7CiAJCiAJY2FzZSBORlFOTF9DT1BZX1BBQ0tFVDoKKwkJaWYgKGVudHJ5LT5za2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVyAmJgorCQkgICAgKCplcnJwID0gc2tiX2NoZWNrc3VtX2hlbHAoZW50cnktPnNrYiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5pbmZvLT5vdXRkZXYgPT0gTlVMTCkpKSB7CisJCQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAkJaWYgKHF1ZXVlLT5jb3B5X3JhbmdlID09IDAgCiAJCSAgICB8fCBxdWV1ZS0+Y29weV9yYW5nZSA+IGVudHJ5LT5za2ItPmxlbikKIAkJCWRhdGFfbGVuID0gZW50cnktPnNrYi0+bGVuOwpAQCAtNjM2LDcgKzY0Miw3IEBACiAJaWYgKCFza2JfbWFrZV93cml0YWJsZSgmZS0+c2tiLCBkYXRhX2xlbikpCiAJCXJldHVybiAtRU5PTUVNOwogCW1lbWNweShlLT5za2ItPmRhdGEsIGRhdGEsIGRhdGFfbGVuKTsKLQorCWUtPnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IDYyNDM1ZmYuLmE2NGUxZDUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTM5OCwyNCArMzk4LDEzIEBACiAJaWYgKG5sX3RhYmxlW3Byb3RvY29sXS5yZWdpc3RlcmVkICYmCiAJICAgIHRyeV9tb2R1bGVfZ2V0KG5sX3RhYmxlW3Byb3RvY29sXS5tb2R1bGUpKQogCQltb2R1bGUgPSBubF90YWJsZVtwcm90b2NvbF0ubW9kdWxlOwotCWVsc2UKLQkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKIAlncm91cHMgPSBubF90YWJsZVtwcm90b2NvbF0uZ3JvdXBzOwogCW5ldGxpbmtfdW5sb2NrX3RhYmxlKCk7CiAKLQlpZiAoZXJyIHx8IChlcnIgPSBfX25ldGxpbmtfY3JlYXRlKHNvY2ssIHByb3RvY29sKSA8IDApKQorCWlmICgoZXJyID0gX19uZXRsaW5rX2NyZWF0ZShzb2NrLCBwcm90b2NvbCkgPCAwKSkKIAkJZ290byBvdXRfbW9kdWxlOwogCiAJbmxrID0gbmxrX3NrKHNvY2stPnNrKTsKLQotCW5say0+Z3JvdXBzID0ga21hbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9LRVJORUwpOwotCWlmIChubGstPmdyb3VwcyA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X21vZHVsZTsKLQl9Ci0JbWVtc2V0KG5say0+Z3JvdXBzLCAwLCBOTEdSUFNaKGdyb3VwcykpOwotCW5say0+bmdyb3VwcyA9IGdyb3VwczsKLQogCW5say0+bW9kdWxlID0gbW9kdWxlOwogb3V0OgogCXJldHVybiBlcnI7CkBAIC01MzQsNiArNTIzLDI5IEBACiAJbmxrLT5zdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9uczsKIH0KIAorc3RhdGljIGludCBuZXRsaW5rX2FsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKwl1bnNpZ25lZCBpbnQgZ3JvdXBzOworCWludCBlcnIgPSAwOworCisJbmV0bGlua19sb2NrX3RhYmxlKCk7CisJZ3JvdXBzID0gbmxfdGFibGVbc2stPnNrX3Byb3RvY29sXS5ncm91cHM7CisJaWYgKCFubF90YWJsZVtzay0+c2tfcHJvdG9jb2xdLnJlZ2lzdGVyZWQpCisJCWVyciA9IC1FTk9FTlQ7CisJbmV0bGlua191bmxvY2tfdGFibGUoKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlubGstPmdyb3VwcyA9IGttYWxsb2MoTkxHUlBTWihncm91cHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmxrLT5ncm91cHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG5say0+Z3JvdXBzLCAwLCBOTEdSUFNaKGdyb3VwcykpOworCW5say0+bmdyb3VwcyA9IGdyb3VwczsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBuZXRsaW5rX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC01NDUsOCArNTU3LDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogT25seSBzdXBlcnVzZXIgaXMgYWxsb3dlZCB0byBsaXN0ZW4gbXVsdGljYXN0cyAqLwotCWlmIChubGFkZHItPm5sX2dyb3VwcyAmJiAhbmV0bGlua19jYXBhYmxlKHNvY2ssIE5MX05PTlJPT1RfUkVDVikpCi0JCXJldHVybiAtRVBFUk07CisJaWYgKG5sYWRkci0+bmxfZ3JvdXBzKSB7CisJCWlmICghbmV0bGlua19jYXBhYmxlKHNvY2ssIE5MX05PTlJPT1RfUkVDVikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAobmxrLT5ncm91cHMgPT0gTlVMTCkgeworCQkJZXJyID0gbmV0bGlua19hbGxvY19ncm91cHMoc2spOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQogCiAJaWYgKG5say0+cGlkKSB7CiAJCWlmIChubGFkZHItPm5sX3BpZCAhPSBubGstPnBpZCkKQEAgLTU1OSw3ICs1NzgsNyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAoIW5sYWRkci0+bmxfZ3JvdXBzICYmICEodTMyKW5say0+Z3JvdXBzWzBdKQorCWlmICghbmxhZGRyLT5ubF9ncm91cHMgJiYgKG5say0+Z3JvdXBzID09IE5VTEwgfHwgISh1MzIpbmxrLT5ncm91cHNbMF0pKQogCQlyZXR1cm4gMDsKIAogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwpAQCAtNjIwLDcgKzYzOSw3IEBACiAJCW5sYWRkci0+bmxfZ3JvdXBzID0gbmV0bGlua19ncm91cF9tYXNrKG5say0+ZHN0X2dyb3VwKTsKIAl9IGVsc2UgewogCQlubGFkZHItPm5sX3BpZCA9IG5say0+cGlkOwotCQlubGFkZHItPm5sX2dyb3VwcyA9IG5say0+Z3JvdXBzWzBdOworCQlubGFkZHItPm5sX2dyb3VwcyA9IG5say0+Z3JvdXBzID8gbmxrLT5ncm91cHNbMF0gOiAwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTk3Niw2ICs5OTUsMTEgQEAKIAogCQlpZiAoIW5ldGxpbmtfY2FwYWJsZShzb2NrLCBOTF9OT05ST09UX1JFQ1YpKQogCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKG5say0+Z3JvdXBzID09IE5VTEwpIHsKKwkJCWVyciA9IG5ldGxpbmtfYWxsb2NfZ3JvdXBzKHNrKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCQlpZiAoIXZhbCB8fCB2YWwgLSAxID49IG5say0+bmdyb3VwcykKIAkJCXJldHVybiAtRUlOVkFMOwogCQluZXRsaW5rX3RhYmxlX2dyYWIoKTsKQEAgLTE0ODMsOCArMTUwNyw3IEBACiAJCQkgICBzLAogCQkJICAgcy0+c2tfcHJvdG9jb2wsCiAJCQkgICBubGstPnBpZCwKLQkJCSAgIG5say0+ZmxhZ3MgJiBORVRMSU5LX0tFUk5FTF9TT0NLRVQgPwotCQkJCTAgOiAodW5zaWduZWQgaW50KW5say0+Z3JvdXBzWzBdLAorCQkJICAgbmxrLT5ncm91cHMgPyAodTMyKW5say0+Z3JvdXBzWzBdIDogMCwKIAkJCSAgIGF0b21pY19yZWFkKCZzLT5za19ybWVtX2FsbG9jKSwKIAkJCSAgIGF0b21pY19yZWFkKCZzLT5za193bWVtX2FsbG9jKSwKIAkJCSAgIG5say0+Y2IsCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwppbmRleCA0YjUzZGU5Li5mNDU3OGM3IDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCisrKyBiL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKQEAgLTEyNjEsNiArMTI2MSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbnJfc29jayAqbnI7CiAJY29uc3QgY2hhciAqZGV2bmFtZTsKKwljaGFyIGJ1ZlsxMV07CiAKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCXNlcV9wdXRzKHNlcSwKQEAgLTEyNzYsMTEgKzEyNzcsMTEgQEAKIAkJZWxzZQogCQkJZGV2bmFtZSA9IGRldi0+bmFtZTsKIAotCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgIiwgYXgyYXNjKCZuci0+dXNlcl9hZGRyKSk7Ci0JCXNlcV9wcmludGYoc2VxLCAiJS05cyAiLCBheDJhc2MoJm5yLT5kZXN0X2FkZHIpKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTlzICIsIGF4MmFzYyhidWYsICZuci0+dXNlcl9hZGRyKSk7CisJCXNlcV9wcmludGYoc2VxLCAiJS05cyAiLCBheDJhc2MoYnVmLCAmbnItPmRlc3RfYWRkcikpOwogCQlzZXFfcHJpbnRmKHNlcSwgCiAiJS05cyAlLTNzICAlMDJYLyUwMlggJTAyWC8lMDJYICUyZCAlM2QgJTNkICUzZCAlM2x1LyUwM2x1ICUybHUvJTAybHUgJTNsdS8lMDNsdSAlM2x1LyUwM2x1ICUyZC8lMDJkICUzZCAlNWQgJTVkICVsZFxuIiwKLQkJCWF4MmFzYygmbnItPnNvdXJjZV9hZGRyKSwKKwkJCWF4MmFzYyhidWYsICZuci0+c291cmNlX2FkZHIpLAogCQkJZGV2bmFtZSwKIAkJCW5yLT5teV9pbmRleCwKIAkJCW5yLT5teV9pZCwKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfbG9vcGJhY2suYyBiL25ldC9uZXRyb20vbnJfbG9vcGJhY2suYwppbmRleCAxNjViMmFiLi5lODU2YWUxIDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMKKysrIGIvbmV0L25ldHJvbS9ucl9sb29wYmFjay5jCkBAIC0xNyw3ICsxNyw3IEBACiBzdGF0aWMgdm9pZCBucl9sb29wYmFja190aW1lcih1bnNpZ25lZCBsb25nKTsKIAogc3RhdGljIHN0cnVjdCBza19idWZmX2hlYWQgbG9vcGJhY2tfcXVldWU7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbG9vcGJhY2tfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihucl9sb29wYmFja190aW1lciwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKGxvb3BiYWNrX3RpbWVyLCBucl9sb29wYmFja190aW1lciwgMCwgMCk7CiAKIHZvaWQgX19pbml0IG5yX2xvb3BiYWNrX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfcm91dGUuYyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwppbmRleCA3YTg2YjM2Li5iM2I5MDk3IDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL25yX3JvdXRlLmMKKysrIGIvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCkBAIC04ODEsNiArODgxLDcgQEAKIAogc3RhdGljIGludCBucl9ub2RlX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CisJY2hhciBidWZbMTFdOwogCWludCBpOwogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQpAQCAtODkwLDcgKzg5MSw3IEBACiAJCXN0cnVjdCBucl9ub2RlICpucl9ub2RlID0gdjsKIAkJbnJfbm9kZV9sb2NrKG5yX25vZGUpOwogCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgJS03cyAgJWQgJWQiLAotCQkJYXgyYXNjKCZucl9ub2RlLT5jYWxsc2lnbiksCisJCQlheDJhc2MoYnVmLCAmbnJfbm9kZS0+Y2FsbHNpZ24pLAogCQkJKG5yX25vZGUtPm1uZW1vbmljWzBdID09ICdcMCcpID8gIioiIDogbnJfbm9kZS0+bW5lbW9uaWMsCiAJCQlucl9ub2RlLT53aGljaCArIDEsCiAJCQlucl9ub2RlLT5jb3VudCk7CkBAIC05NjQsNiArOTY1LDcgQEAKIAogc3RhdGljIGludCBucl9uZWlnaF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKIAlpbnQgaTsKIAogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKQEAgLTk3Myw3ICs5NzUsNyBAQAogCiAJCXNlcV9wcmludGYoc2VxLCAiJTA1ZCAlLTlzICUtNHMgICUzZCAgICAlZCAgICUzZCAgICAlM2QiLAogCQkJbnJfbmVpZ2gtPm51bWJlciwKLQkJCWF4MmFzYygmbnJfbmVpZ2gtPmNhbGxzaWduKSwKKwkJCWF4MmFzYyhidWYsICZucl9uZWlnaC0+Y2FsbHNpZ24pLAogCQkJbnJfbmVpZ2gtPmRldiA/IG5yX25laWdoLT5kZXYtPm5hbWUgOiAiPz8/IiwKIAkJCW5yX25laWdoLT5xdWFsaXR5LAogCQkJbnJfbmVpZ2gtPmxvY2tlZCwKQEAgLTk4Myw3ICs5ODUsNyBAQAogCQlpZiAobnJfbmVpZ2gtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKIAkJCWZvciAoaSA9IDA7IGkgPCBucl9uZWlnaC0+ZGlnaXBlYXQtPm5kaWdpOyBpKyspCiAJCQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCAKLQkJCQkJICAgYXgyYXNjKCZucl9uZWlnaC0+ZGlnaXBlYXQtPmNhbGxzW2ldKSk7CisJCQkJCSAgIGF4MmFzYyhidWYsICZucl9uZWlnaC0+ZGlnaXBlYXQtPmNhbGxzW2ldKSk7CiAJCX0KIAogCQlzZXFfcHV0cyhzZXEsICJcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggYmE5OTcwOS4uODY5MGYxNyAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC0xNTM1LDggKzE1MzUsNyBAQAogc3RhdGljIHZvaWQgcGFja2V0X21tX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSB2bWEtPnZtX2ZpbGU7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCBzb2NrZXQgKiBzb2NrID0gU09DS0VUX0koaW5vZGUpOworCXN0cnVjdCBzb2NrZXQgKiBzb2NrID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCQogCWlmIChzaykKQEAgLTE1NDYsOCArMTU0NSw3IEBACiBzdGF0aWMgdm9pZCBwYWNrZXRfbW1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSB2bWEtPnZtX2ZpbGU7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCBzb2NrZXQgKiBzb2NrID0gU09DS0VUX0koaW5vZGUpOworCXN0cnVjdCBzb2NrZXQgKiBzb2NrID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCQogCWlmIChzaykKZGlmZiAtLWdpdCBhL25ldC9yb3NlL2FmX3Jvc2UuYyBiL25ldC9yb3NlL2FmX3Jvc2UuYwppbmRleCBjNmU1OWY4Li4zMDc3ODc4IDEwMDY0NAotLS0gYS9uZXQvcm9zZS9hZl9yb3NlLmMKKysrIGIvbmV0L3Jvc2UvYWZfcm9zZS5jCkBAIC0xMzYzLDYgKzEzNjMsOCBAQAogCiBzdGF0aWMgaW50IHJvc2VfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKKwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKIAkJc2VxX3B1dHMoc2VxLCAKIAkJCSAiZGVzdF9hZGRyICBkZXN0X2NhbGwgc3JjX2FkZHIgICBzcmNfY2FsbCAgZGV2ICAgbGNpIG5laWdoIHN0IHZzIHZyIHZhICAgdCAgdDEgIHQyICB0MyAgaGIgICAgaWRsZSBTbmQtUSBSY3YtUSBpbm9kZVxuIik7CkBAIC0xMzgwLDEyICsxMzgyLDEyIEBACiAJCQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTBzICUtOXMgIiwKIAkJCXJvc2UyYXNjKCZyb3NlLT5kZXN0X2FkZHIpLAotCQkJYXgyYXNjKCZyb3NlLT5kZXN0X2NhbGwpKTsKKwkJCWF4MmFzYyhidWYsICZyb3NlLT5kZXN0X2NhbGwpKTsKIAogCQlpZiAoYXgyNWNtcCgmcm9zZS0+c291cmNlX2NhbGwsICZudWxsX2F4MjVfYWRkcmVzcykgPT0gMCkKIAkJCWNhbGxzaWduID0gIj8/Pz8/Py0/IjsKIAkJZWxzZQotCQkJY2FsbHNpZ24gPSBheDJhc2MoJnJvc2UtPnNvdXJjZV9jYWxsKTsKKwkJCWNhbGxzaWduID0gYXgyYXNjKGJ1ZiwgJnJvc2UtPnNvdXJjZV9jYWxsKTsKIAogCQlzZXFfcHJpbnRmKHNlcSwKIAkJCSAgICIlLTEwcyAlLTlzICUtNXMgJTMuM1ggJTA1ZCAgJWQgICVkICAlZCAgJWQgJTNsdSAlM2x1ICUzbHUgJTNsdSAlM2x1ICUzbHUvJTAzbHUgJTVkICU1ZCAlbGRcbiIsCmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKaW5kZXggNDUxMGNkNzYuLmU1NTZkOTIgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYworKysgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKQEAgLTg1MSw2ICs4NTEsNyBAQAogCXVuc2lnbmVkIGNoYXIgY2F1c2UsIGRpYWdub3N0aWM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgbGVuLCByZXMgPSAwOworCWNoYXIgYnVmWzExXTsKIAogI2lmIDAKIAlpZiAoY2FsbF9pbl9maXJld2FsbChQRl9ST1NFLCBza2ItPmRldiwgc2tiLT5kYXRhLCBOVUxMLCAmc2tiKSAhPSBGV19BQ0NFUFQpCkBAIC04NzYsNyArODc3LDcgQEAKIAogCWlmIChyb3NlX25laWdoID09IE5VTEwpIHsKIAkJcHJpbnRrKCJyb3NlX3JvdXRlIDogdW5rbm93biBuZWlnaGJvdXIgb3IgZGV2aWNlICVzXG4iLAotCQkgICAgICAgYXgyYXNjKCZheDI1LT5kZXN0X2FkZHIpKTsKKwkJICAgICAgIGF4MmFzYyhidWYsICZheDI1LT5kZXN0X2FkZHIpKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMTc4LDYgKzExNzksNyBAQAogCiBzdGF0aWMgaW50IHJvc2VfbmVpZ2hfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwljaGFyIGJ1ZlsxMV07CiAJaW50IGk7CiAKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCkBAIC0xMTg5LDcgKzExOTEsNyBAQAogCQkvKiBpZiAoIXJvc2VfbmVpZ2gtPmxvb3BiYWNrKSB7ICovCiAJCXNlcV9wcmludGYoc2VxLCAiJTA1ZCAlLTlzICUtNHMgICAlM2QgJTNkICAlM3MgICAgICUzcyAlM2x1ICUzbHUiLAogCQkJICAgcm9zZV9uZWlnaC0+bnVtYmVyLAotCQkJICAgKHJvc2VfbmVpZ2gtPmxvb3BiYWNrKSA/ICJSU0xPT1AtMCIgOiBheDJhc2MoJnJvc2VfbmVpZ2gtPmNhbGxzaWduKSwKKwkJCSAgIChyb3NlX25laWdoLT5sb29wYmFjaykgPyAiUlNMT09QLTAiIDogYXgyYXNjKGJ1ZiwgJnJvc2VfbmVpZ2gtPmNhbGxzaWduKSwKIAkJCSAgIHJvc2VfbmVpZ2gtPmRldiA/IHJvc2VfbmVpZ2gtPmRldi0+bmFtZSA6ICI/Pz8iLAogCQkJICAgcm9zZV9uZWlnaC0+Y291bnQsCiAJCQkgICByb3NlX25laWdoLT51c2UsCkBAIC0xMjAwLDcgKzEyMDIsNyBAQAogCiAJCWlmIChyb3NlX25laWdoLT5kaWdpcGVhdCAhPSBOVUxMKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgcm9zZV9uZWlnaC0+ZGlnaXBlYXQtPm5kaWdpOyBpKyspCi0JCQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBheDJhc2MoJnJvc2VfbmVpZ2gtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOworCQkJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgYXgyYXNjKGJ1ZiwgJnJvc2VfbmVpZ2gtPmRpZ2lwZWF0LT5jYWxsc1tpXSkpOwogCQl9CiAKIAkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKQEAgLTEyNjAsNiArMTI2Miw4IEBACiAKIHN0YXRpYyBpbnQgcm9zZV9yb3V0ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCWNoYXIgYnVmWzExXTsKKwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKIAkJc2VxX3B1dHMoc2VxLCAKIAkJCSAibGNpICBhZGRyZXNzICAgICBjYWxsc2lnbiAgIG5laWdoICA8LT4gbGNpICBhZGRyZXNzICAgICBjYWxsc2lnbiAgIG5laWdoXG4iKTsKQEAgLTEyNzEsNyArMTI3NSw3IEBACiAJCQkJICAgIiUzLjNYICAlLTEwcyAgJS05cyAgJTA1ZCAgICAgICIsCiAJCQkJICAgcm9zZV9yb3V0ZS0+bGNpMSwKIAkJCQkgICByb3NlMmFzYygmcm9zZV9yb3V0ZS0+c3JjX2FkZHIpLAotCQkJCSAgIGF4MmFzYygmcm9zZV9yb3V0ZS0+c3JjX2NhbGwpLAorCQkJCSAgIGF4MmFzYyhidWYsICZyb3NlX3JvdXRlLT5zcmNfY2FsbCksCiAJCQkJICAgcm9zZV9yb3V0ZS0+bmVpZ2gxLT5udW1iZXIpOwogCQllbHNlIAogCQkJc2VxX3B1dHMoc2VxLCAKQEAgLTEyODIsNyArMTI4Niw3IEBACiAJCQkJICAgIiUzLjNYICAlLTEwcyAgJS05cyAgJTA1ZFxuIiwKIAkJCQlyb3NlX3JvdXRlLT5sY2kyLAogCQkJCXJvc2UyYXNjKCZyb3NlX3JvdXRlLT5kZXN0X2FkZHIpLAotCQkJCWF4MmFzYygmcm9zZV9yb3V0ZS0+ZGVzdF9jYWxsKSwKKwkJCQlheDJhc2MoYnVmLCAmcm9zZV9yb3V0ZS0+ZGVzdF9jYWxsKSwKIAkJCQlyb3NlX3JvdXRlLT5uZWlnaDItPm51bWJlcik7CiAJCSBlbHNlIAogCQkJIHNlcV9wdXRzKHNlcSwKZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2Vfc3Vici5jIGIvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKaW5kZXggYTI5YTNhOS4uMzZhNzc5NCAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKKysrIGIvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKQEAgLTMzNywxMyArMzM3LDEzIEBACiAJCQkJbWVtY3B5KCZmYWNpbGl0aWVzLT5zb3VyY2VfYWRkciwgcCArIDcsIFJPU0VfQUREUl9MRU4pOwogCQkJCW1lbWNweShjYWxsc2lnbiwgcCArIDEyLCAgIGwgLSAxMCk7CiAJCQkJY2FsbHNpZ25bbCAtIDEwXSA9ICdcMCc7Ci0JCQkJZmFjaWxpdGllcy0+c291cmNlX2NhbGwgPSAqYXNjMmF4KGNhbGxzaWduKTsKKwkJCQlhc2MyYXgoJmZhY2lsaXRpZXMtPnNvdXJjZV9jYWxsLCBjYWxsc2lnbik7CiAJCQl9CiAJCQlpZiAoKnAgPT0gRkFDX0NDSVRUX1NSQ19OU0FQKSB7CiAJCQkJbWVtY3B5KCZmYWNpbGl0aWVzLT5kZXN0X2FkZHIsIHAgKyA3LCBST1NFX0FERFJfTEVOKTsKIAkJCQltZW1jcHkoY2FsbHNpZ24sIHAgKyAxMiwgbCAtIDEwKTsKIAkJCQljYWxsc2lnbltsIC0gMTBdID0gJ1wwJzsKLQkJCQlmYWNpbGl0aWVzLT5kZXN0X2NhbGwgPSAqYXNjMmF4KGNhbGxzaWduKTsKKwkJCQlhc2MyYXgoJmZhY2lsaXRpZXMtPmRlc3RfY2FsbCwgY2FsbHNpZ24pOwogCQkJfQogCQkJcCAgICs9IGwgKyAyOwogCQkJbiAgICs9IGwgKyAyOwpAQCAtNDAwLDYgKzQwMCw3IEBACiB7CiAJdW5zaWduZWQgY2hhciAqcCA9IGJ1ZmZlciArIDE7CiAJY2hhciAqY2FsbHNpZ247CisJY2hhciBidWZbMTFdOwogCWludCBsZW4sIG5iOwogCiAJLyogTmF0aW9uYWwgRmFjaWxpdGllcyAqLwpAQCAtNDU2LDcgKzQ1Nyw3IEBACiAKIAkqcCsrID0gRkFDX0NDSVRUX0RFU1RfTlNBUDsKIAotCWNhbGxzaWduID0gYXgyYXNjKCZyb3NlLT5kZXN0X2NhbGwpOworCWNhbGxzaWduID0gYXgyYXNjKGJ1ZiwgJnJvc2UtPmRlc3RfY2FsbCk7CiAKIAkqcCsrID0gc3RybGVuKGNhbGxzaWduKSArIDEwOwogCSpwKysgPSAoc3RybGVuKGNhbGxzaWduKSArIDkpICogMjsJCS8qID8/PyAqLwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAKIAkqcCsrID0gRkFDX0NDSVRUX1NSQ19OU0FQOwogCi0JY2FsbHNpZ24gPSBheDJhc2MoJnJvc2UtPnNvdXJjZV9jYWxsKTsKKwljYWxsc2lnbiA9IGF4MmFzYyhidWYsICZyb3NlLT5zb3VyY2VfY2FsbCk7CiAKIAkqcCsrID0gc3RybGVuKGNhbGxzaWduKSArIDEwOwogCSpwKysgPSAoc3RybGVuKGNhbGxzaWduKSArIDkpICogMjsJCS8qID8/PyAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKaW5kZXggNzM3NjgxYy4uMzE1NzBiOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hcGkuYworKysgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCkBAIC0xMTk0LDcgKzExOTQsNyBAQAogICogd2l0aCAzMi1iaXQgZ2V0X2N5Y2xlcygpLiBTYWZlIHVwIHRvIDRHSHogQ1BVLgogICovCiBzdGF0aWMgdm9pZCBwc2NoZWRfdGljayh1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBwc2NoZWRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihwc2NoZWRfdGljaywgMCwgMCk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHBzY2hlZF90aW1lciwgcHNjaGVkX3RpY2ssIDAsIDApOwogCiBzdGF0aWMgdm9pZCBwc2NoZWRfdGljayh1bnNpZ25lZCBsb25nIGR1bW15KQogewpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDk0ZmU2MzguLmM2OTllOTMgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCX0KIAlpb2NiLT5wcml2YXRlID0geDsKIAl4LT5raW9jYiA9IGlvY2I7Ci0Jc29jayA9IFNPQ0tFVF9JKGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsgCisJc29jayA9IGlvY2ItPmtpX2ZpbHAtPnByaXZhdGVfZGF0YTsgCiAKIAl4LT5hc3luY19tc2cubXNnX25hbWUgPSBOVUxMOwogCXgtPmFzeW5jX21zZy5tc2dfbmFtZWxlbiA9IDA7CkBAIC03MDksNyArNzA5LDcgQEAKIAl9CiAJaW9jYi0+cHJpdmF0ZSA9IHg7CiAJeC0+a2lvY2IgPSBpb2NiOwotCXNvY2sgPSBTT0NLRVRfSShpb2NiLT5raV9maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7IAorCXNvY2sgPSBpb2NiLT5raV9maWxwLT5wcml2YXRlX2RhdGE7IAogCiAJeC0+YXN5bmNfbXNnLm1zZ19uYW1lID0gTlVMTDsKIAl4LT5hc3luY19tc2cubXNnX25hbWVsZW4gPSAwOwpAQCAtNzMyLDcgKzczMiw3IEBACiAJc3RydWN0IHNvY2tldCAqc29jazsKIAlpbnQgZmxhZ3M7CiAKLQlzb2NrID0gU09DS0VUX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmbGFncyA9ICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID8gMCA6IE1TR19ET05UV0FJVDsKIAlpZiAobW9yZSkKQEAgLTc0MSwxNCArNzQxLDE0IEBACiAJcmV0dXJuIHNvY2stPm9wcy0+c2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc29ja19yZWFkdl93cml0ZXYoaW50IHR5cGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorc3RhdGljIGludCBzb2NrX3JlYWR2X3dyaXRldihpbnQgdHlwZSwKIAkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiBpb3YsCiAJCQkgICAgIGxvbmcgY291bnQsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBtc2doZHIgbXNnOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAKLQlzb2NrID0gU09DS0VUX0koaW5vZGUpOworCXNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAltc2cubXNnX25hbWUgPSBOVUxMOwogCW1zZy5tc2dfbmFtZWxlbiA9IDA7CkBAIC03NzUsNyArNzc1LDcgQEAKIAlpbnQgaTsKICAgICAgICAgZm9yIChpID0gMCA7IGkgPCBjb3VudCA7IGkrKykKICAgICAgICAgICAgICAgICB0b3RfbGVuICs9IHZlY3RvcltpXS5pb3ZfbGVuOwotCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfV1JJVEUsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfV1JJVEUsCiAJCQkJIGZpbGUsIHZlY3RvciwgY291bnQsIHRvdF9sZW4pOwogfQogCQpAQCAtNzg2LDcgKzc4Niw3IEBACiAJaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgY291bnQgOyBpKyspCiAgICAgICAgICAgICAgICAgdG90X2xlbiArPSB2ZWN0b3JbaV0uaW92X2xlbjsKLQlyZXR1cm4gc29ja19yZWFkdl93cml0ZXYoVkVSSUZZX1JFQUQsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfUkVBRCwKIAkJCQkgZmlsZSwgdmVjdG9yLCBjb3VudCwgdG90X2xlbik7CiB9CiAKQEAgLTg0MCw3ICs4NDAsNyBAQAogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBwaWQsIGVycjsKIAotCXNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoY21kID49IFNJT0NERVZQUklWQVRFICYmIGNtZCA8PSAoU0lPQ0RFVlBSSVZBVEUgKyAxNSkpIHsKIAkJZXJyID0gZGV2X2lvY3RsKGNtZCwgYXJncCk7CiAJfSBlbHNlCkBAIC05MzksMTMgKzkzOSwxMyBAQAogCS8qCiAJICoJV2UgY2FuJ3QgcmV0dXJuIGVycm9ycyB0byBwb2xsLCBzbyBpdCdzIGVpdGhlciB5ZXMgb3Igbm8uIAogCSAqLwotCXNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlyZXR1cm4gc29jay0+b3BzLT5wb2xsKGZpbGUsIHNvY2ssIHdhaXQpOwogfQogCiBzdGF0aWMgaW50IHNvY2tfbW1hcChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKIHsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gU09DS0VUX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlyZXR1cm4gc29jay0+b3BzLT5tbWFwKGZpbGUsIHNvY2ssIHZtYSk7CiB9CkBAIC05OTUsNyArOTk1LDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNvY2sgPSBTT0NLRVRfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc29jayA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCWlmICgoc2s9c29jay0+c2spID09IE5VTEwpIHsKIAkJa2ZyZWUoZm5hKTsKQEAgLTE3NDUsMTAgKzE3NDUsMTEgQEAKIAkJZ290byBvdXRfZnJlZWlvdjsKIAljdGxfbGVuID0gbXNnX3N5cy5tc2dfY29udHJvbGxlbjsgCiAJaWYgKChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgJiYgY3RsX2xlbikgewotCQllcnIgPSBjbXNnaGRyX2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybigmbXNnX3N5cywgY3RsLCBzaXplb2YoY3RsKSk7CisJCWVyciA9IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKCZtc2dfc3lzLCBzb2NrLT5zaywgY3RsLCBzaXplb2YoY3RsKSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9mcmVlaW92OwogCQljdGxfYnVmID0gbXNnX3N5cy5tc2dfY29udHJvbDsKKwkJY3RsX2xlbiA9IG1zZ19zeXMubXNnX2NvbnRyb2xsZW47CiAJfSBlbHNlIGlmIChjdGxfbGVuKSB7CiAJCWlmIChjdGxfbGVuID4gc2l6ZW9mKGN0bCkpCiAJCXsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCA1YzhmZTNiLi5lMzMwODE5IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC0yNTAsNiArMjUwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgcnNpX2NhY2hlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaGFzaF9zaXplCT0gUlNJX0hBU0hNQVgsCiAJLmhhc2hfdGFibGUgICAgID0gcnNpX3RhYmxlLAogCS5uYW1lICAgICAgICAgICA9ICJhdXRoLnJwY3NlYy5pbml0IiwKQEAgLTQzNiw2ICs0MzcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCByc2NfY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBSU0NfSEFTSE1BWCwKIAkuaGFzaF90YWJsZQk9IHJzY190YWJsZSwKIAkubmFtZQkJPSAiYXV0aC5ycGNzZWMuY29udGV4dCIsCkBAIC0xMDc0LDcgKzEwNzYsOSBAQAogdm9pZAogZ3NzX3N2Y19zaHV0ZG93bih2b2lkKQogewotCWNhY2hlX3VucmVnaXN0ZXIoJnJzY19jYWNoZSk7Ci0JY2FjaGVfdW5yZWdpc3RlcigmcnNpX2NhY2hlKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3RlcigmcnNjX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJhdXRoX3JwY2dzczogZmFpbGVkIHRvIHVucmVnaXN0ZXIgcnNjIGNhY2hlXG4iKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3RlcigmcnNpX2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJhdXRoX3JwY2dzczogZmFpbGVkIHRvIHVucmVnaXN0ZXIgcnNpIGNhY2hlXG4iKTsKIAlzdmNfYXV0aF91bnJlZ2lzdGVyKFJQQ19BVVRIX0dTUyk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NhY2hlLmMgYi9uZXQvc3VucnBjL2NhY2hlLmMKaW5kZXggOTAwZjViYy4uZjUwOWU5OSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jYWNoZS5jCisrKyBiL25ldC9zdW5ycGMvY2FjaGUuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJY2QtPnByb2NfZW50ID0gcHJvY19ta2RpcihjZC0+bmFtZSwgcHJvY19uZXRfcnBjKTsKIAlpZiAoY2QtPnByb2NfZW50KSB7CiAJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKLQkJY2QtPnByb2NfZW50LT5vd25lciA9IFRISVNfTU9EVUxFOworCQljZC0+cHJvY19lbnQtPm93bmVyID0gY2QtPm93bmVyOwogCQljZC0+Y2hhbm5lbF9lbnQgPSBjZC0+Y29udGVudF9lbnQgPSBOVUxMOwogCQkKICAJCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiZmx1c2giLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiwKQEAgLTE4NSw3ICsxODUsNyBAQAogCQljZC0+Zmx1c2hfZW50ID0gIHA7CiAgCQlpZiAocCkgewogIAkJCXAtPnByb2NfZm9wcyA9ICZjYWNoZV9mbHVzaF9vcGVyYXRpb25zOwotIAkJCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisgCQkJcC0+b3duZXIgPSBjZC0+b3duZXI7CiAgCQkJcC0+ZGF0YSA9IGNkOwogIAkJfQogIApAQCAtMTk1LDcgKzE5NSw3IEBACiAJCQljZC0+Y2hhbm5lbF9lbnQgPSBwOwogCQkJaWYgKHApIHsKIAkJCQlwLT5wcm9jX2ZvcHMgPSAmY2FjaGVfZmlsZV9vcGVyYXRpb25zOwotCQkJCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCQkJcC0+b3duZXIgPSBjZC0+b3duZXI7CiAJCQkJcC0+ZGF0YSA9IGNkOwogCQkJfQogCQl9CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJCWNkLT5jb250ZW50X2VudCA9IHA7CiAgCQkJaWYgKHApIHsKICAJCQkJcC0+cHJvY19mb3BzID0gJmNvbnRlbnRfZmlsZV9vcGVyYXRpb25zOwotIAkJCQlwLT5vd25lciA9IFRISVNfTU9EVUxFOworIAkJCQlwLT5vd25lciA9IGNkLT5vd25lcjsKICAJCQkJcC0+ZGF0YSA9IGNkOwogIAkJCX0KICAJCX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3RhdHMuYyBiL25ldC9zdW5ycGMvc3RhdHMuYwppbmRleCA5YjY3ZGMxLi40OTc5ZjIyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N0YXRzLmMKKysrIGIvbmV0L3N1bnJwYy9zdGF0cy5jCkBAIC0zNSwxMyArMzUsMTMgQEAKIAlpbnQJCWksIGo7CiAKIAlzZXFfcHJpbnRmKHNlcSwKLQkJIm5ldCAlZCAlZCAlZCAlZFxuIiwKKwkJIm5ldCAldSAldSAldSAldVxuIiwKIAkJCXN0YXRwLT5uZXRjbnQsCiAJCQlzdGF0cC0+bmV0dWRwY250LAogCQkJc3RhdHAtPm5ldHRjcGNudCwKIAkJCXN0YXRwLT5uZXR0Y3Bjb25uKTsKIAlzZXFfcHJpbnRmKHNlcSwKLQkJInJwYyAlZCAlZCAlZFxuIiwKKwkJInJwYyAldSAldSAldVxuIiwKIAkJCXN0YXRwLT5ycGNjbnQsCiAJCQlzdGF0cC0+cnBjcmV0cmFucywKIAkJCXN0YXRwLT5ycGNhdXRocmVmcmVzaCk7CkBAIC01MCwxMCArNTAsMTAgQEAKIAkJY29uc3Qgc3RydWN0IHJwY192ZXJzaW9uICp2ZXJzID0gcHJvZy0+dmVyc2lvbltpXTsKIAkJaWYgKCF2ZXJzKQogCQkJY29udGludWU7Ci0JCXNlcV9wcmludGYoc2VxLCAicHJvYyVkICVkIiwKKwkJc2VxX3ByaW50ZihzZXEsICJwcm9jJXUgJXUiLAogCQkJCQl2ZXJzLT5udW1iZXIsIHZlcnMtPm5ycHJvY3MpOwogCQlmb3IgKGogPSAwOyBqIDwgdmVycy0+bnJwcm9jczsgaisrKQotCQkJc2VxX3ByaW50ZihzZXEsICIgJWQiLAorCQkJc2VxX3ByaW50ZihzZXEsICIgJXUiLAogCQkJCQl2ZXJzLT5wcm9jc1tqXS5wX2NvdW50KTsKIAkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKIAl9CkBAIC04MywxMyArODMsMTMgQEAKIAlpbnQJCWksIGo7CiAKIAlzZXFfcHJpbnRmKHNlcSwKLQkJIm5ldCAlZCAlZCAlZCAlZFxuIiwKKwkJIm5ldCAldSAldSAldSAldVxuIiwKIAkJCXN0YXRwLT5uZXRjbnQsCiAJCQlzdGF0cC0+bmV0dWRwY250LAogCQkJc3RhdHAtPm5ldHRjcGNudCwKIAkJCXN0YXRwLT5uZXR0Y3Bjb25uKTsKIAlzZXFfcHJpbnRmKHNlcSwKLQkJInJwYyAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJInJwYyAldSAldSAldSAldSAldVxuIiwKIAkJCXN0YXRwLT5ycGNjbnQsCiAJCQlzdGF0cC0+cnBjYmFkZm10K3N0YXRwLT5ycGNiYWRhdXRoK3N0YXRwLT5ycGNiYWRjbG50LAogCQkJc3RhdHAtPnJwY2JhZGZtdCwKQEAgLTk5LDkgKzk5LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcHJvZy0+cGdfbnZlcnM7IGkrKykgewogCQlpZiAoISh2ZXJzID0gcHJvZy0+cGdfdmVyc1tpXSkgfHwgIShwcm9jID0gdmVycy0+dnNfcHJvYykpCiAJCQljb250aW51ZTsKLQkJc2VxX3ByaW50ZihzZXEsICJwcm9jJWQgJWQiLCBpLCB2ZXJzLT52c19ucHJvYyk7CisJCXNlcV9wcmludGYoc2VxLCAicHJvYyVkICV1IiwgaSwgdmVycy0+dnNfbnByb2MpOwogCQlmb3IgKGogPSAwOyBqIDwgdmVycy0+dnNfbnByb2M7IGorKywgcHJvYysrKQotCQkJc2VxX3ByaW50ZihzZXEsICIgJWQiLCBwcm9jLT5wY19jb3VudCk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAldSIsIHByb2MtPnBjX2NvdW50KTsKIAkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMgYi9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKaW5kZXggNjJhMDczNC4uZWQ0OGZmMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCisrKyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwpAQCAtMTc2LDggKzE3NiwxMCBAQAogewogCXVucmVnaXN0ZXJfcnBjX3BpcGVmcygpOwogCXJwY19kZXN0cm95X21lbXBvb2woKTsKLQljYWNoZV91bnJlZ2lzdGVyKCZhdXRoX2RvbWFpbl9jYWNoZSk7Ci0JY2FjaGVfdW5yZWdpc3RlcigmaXBfbWFwX2NhY2hlKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3RlcigmYXV0aF9kb21haW5fY2FjaGUpKQorCQlwcmludGsoS0VSTl9FUlIgInN1bnJwYzogZmFpbGVkIHRvIHVucmVnaXN0ZXIgYXV0aF9kb21haW4gY2FjaGVcbiIpOworCWlmIChjYWNoZV91bnJlZ2lzdGVyKCZpcF9tYXBfY2FjaGUpKQorCQlwcmludGsoS0VSTl9FUlIgInN1bnJwYzogZmFpbGVkIHRvIHVucmVnaXN0ZXIgaXBfbWFwIGNhY2hlXG4iKTsKICNpZmRlZiBSUENfREVCVUcKIAlycGNfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMgYi9uZXQvc3VucnBjL3N2Y2F1dGguYwppbmRleCBiZGU4MTQ3Li5kZGE0ZjBjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y2F1dGguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGguYwpAQCAtMTQzLDYgKzE0Myw3IEBACiAKIAogc3RydWN0IGNhY2hlX2RldGFpbCBhdXRoX2RvbWFpbl9jYWNoZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmhhc2hfc2l6ZQk9IEROX0hBU0hNQVgsCiAJLmhhc2hfdGFibGUJPSBhdXRoX2RvbWFpbl90YWJsZSwKIAkubmFtZQkJPSAiYXV0aC5kb21haW4iLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggZDZiYWY2Zi4uY2FjMmU3NyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC0yNDIsNiArMjQyLDcgQEAKIAkKIAogc3RydWN0IGNhY2hlX2RldGFpbCBpcF9tYXBfY2FjaGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5oYXNoX3NpemUJPSBJUF9IQVNITUFYLAogCS5oYXNoX3RhYmxlCT0gaXBfdGFibGUsCiAJLm5hbWUJCT0gImF1dGgudW5peC5pcCIsCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCA4M2M4MTM1Li5mZGE3MzdkIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTc2NSw4ICs3NjUsOCBAQAogCXN3aXRjaCAocG9saWN5LT5hY3Rpb24pIHsKIAljYXNlIFhGUk1fUE9MSUNZX0JMT0NLOgogCQkvKiBQcm9oaWJpdCB0aGUgZmxvdyAqLwotCQl4ZnJtX3BvbF9wdXQocG9saWN5KTsKLQkJcmV0dXJuIC1FUEVSTTsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIGVycm9yOwogCiAJY2FzZSBYRlJNX1BPTElDWV9BTExPVzoKIAkJaWYgKHBvbGljeS0+eGZybV9uciA9PSAwKSB7CkBAIC03ODIsOCArNzgyLDggQEAKIAkJICovCiAJCWRzdCA9IHhmcm1fZmluZF9idW5kbGUoZmwsIHBvbGljeSwgZmFtaWx5KTsKIAkJaWYgKElTX0VSUihkc3QpKSB7Ci0JCQl4ZnJtX3BvbF9wdXQocG9saWN5KTsKLQkJCXJldHVybiBQVFJfRVJSKGRzdCk7CisJCQllcnIgPSBQVFJfRVJSKGRzdCk7CisJCQlnb3RvIGVycm9yOwogCQl9CiAKIAkJaWYgKGRzdCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCmluZGV4IDkwODcyNzMuLmRiM2M3MDggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtNDksNiArNDksOSBAQAogY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxcCiAgICAgICBlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJyAmJikgJChjbWRfJCgxKSkKIAorIyBBZGQgJChvYmopLyBmb3IgcGF0aHMgdGhhdCBpcyBub3QgYWJzb2x1dGUKK29iamVjdGlmeSA9ICQoZm9yZWFjaCBvLCQoMSksJChpZiAkKGZpbHRlciAvJSwkKG8pKSwkKG8pLCQob2JqKS8kKG8pKSkKKwogIyMjCiAjIGlmX2NoYW5nZWQgICAgICAtIGV4ZWN1dGUgY29tbWFuZCBpZiBhbnkgcHJlcmVxdWlzaXRlIGlzIG5ld2VyIHRoYW4gCiAjICAgICAgICAgICAgICAgICAgIHRhcmdldCwgb3IgY29tbWFuZCBsaW5lIGhhcyBjaGFuZ2VkCmRpZmYgLS1naXQgYS9zY3JpcHRzL2thbGxzeW1zLmMgYi9zY3JpcHRzL2thbGxzeW1zLmMKaW5kZXggOWJlNDFhOWYuLmQ1OTE1NzggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2FsbHN5bXMuYworKysgYi9zY3JpcHRzL2thbGxzeW1zLmMKQEAgLTI0LDc1ICsyNCwzNyBAQAogICoKICAqLwogCisjZGVmaW5lIF9HTlVfU09VUkNFCisKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAKLS8qIG1heGltdW0gdG9rZW4gbGVuZ3RoIHVzZWQuIEl0IGRvZXNuJ3QgcGF5IHRvIGluY3JlYXNlIGl0IGEgbG90LCBiZWNhdXNlCi0gKiB2ZXJ5IGxvbmcgc3Vic3RyaW5ncyBwcm9iYWJseSBkb24ndCByZXBlYXQgdGhlbXNlbHZlcyB0b28gb2Z0ZW4uICovCi0jZGVmaW5lIE1BWF9UT0tfU0laRQkJMTEKICNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI3CiAKLS8qIHdlIHVzZSBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgdG8gZ2F0aGVyIHRoZSB0b2tlbiBjb3VudCwKLSAqIHRvIHNwZWVkIHVwIGNvbXByZXNzaW9uLCBhdCB0aGUgZXhwZW5zZSBvZiBhIGxpdHRsZSBjb21wcmVzc2lvbiByYXRpbyAqLwotI2RlZmluZSBXT1JLSU5HX1NFVAkJMTAyNAotCi0vKiBmaXJzdCBmaW5kIHRoZSBiZXN0IHRva2VuIG9ubHkgb24gdGhlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd291bGQgcHJvZml0IG1vcmUKLSAqIHRoYW4gR09PRF9CQURfVEhSRVNIT0xELiBPbmx5IGlmIHRoaXMgbGlzdCBpcyBlbXB0eSBnbyB0byB0aGUgImJhZCIgbGlzdC4KLSAqIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHB1dCBsZXNzIHRva2VucyBvbiB0aGUgImdvb2QiIGxpc3QsIHNvIHRoZSBzZWFyY2gKLSAqIGlzIGZhc3Rlci4gSG93ZXZlciwgaWYgdGhlIGdvb2QgbGlzdCBydW5zIG91dCBvZiB0b2tlbnMsIHdlIG11c3QgcGFpbmZ1bGx5Ci0gKiBzZWFyY2ggdGhlIGJhZCBsaXN0LiAqLwotI2RlZmluZSBHT09EX0JBRF9USFJFU0hPTEQJMTAKLQotLyogdG9rZW4gaGFzaCBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIEhBU0hfQklUUwkJMTgKLSNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFCQkoMSA8PCBIQVNIX0JJVFMpCi0jZGVmaW5lIEhBU0hfTUFTSwkJKEhBU0hfVEFCTEVfU0laRSAtIDEpCi0jZGVmaW5lIEhBU0hfQkFTRV9PRkZTRVQJMjE2NjEzNjI2MVUKLSNkZWZpbmUgSEFTSF9GT0xEKGEpCQkoKGEpJihIQVNIX01BU0spKQotCi0vKiBmbGFncyB0byBtYXJrIHN5bWJvbHMgKi8KLSNkZWZpbmUgU1lNX0ZMQUdfVkFMSUQJCTEKLSNkZWZpbmUgU1lNX0ZMQUdfU0FNUExFRAkyCiAKIHN0cnVjdCBzeW1fZW50cnkgewogCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOwotCWNoYXIgdHlwZTsKLQl1bnNpZ25lZCBjaGFyIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgbGVuOworCXVuc2lnbmVkIGludCBsZW47CiAJdW5zaWduZWQgY2hhciAqc3ltOwogfTsKIAogCiBzdGF0aWMgc3RydWN0IHN5bV9lbnRyeSAqdGFibGU7Ci1zdGF0aWMgaW50IHNpemUsIGNudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGFibGVfc2l6ZSwgdGFibGVfY250Owogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBfc3RleHQsIF9ldGV4dCwgX3Npbml0dGV4dCwgX2Vpbml0dGV4dCwgX3NleHRyYXRleHQsIF9lZXh0cmF0ZXh0Owogc3RhdGljIGludCBhbGxfc3ltYm9scyA9IDA7CiBzdGF0aWMgY2hhciBzeW1ib2xfcHJlZml4X2NoYXIgPSAnXDAnOwogCi1zdHJ1Y3QgdG9rZW4gewotCXVuc2lnbmVkIGNoYXIgZGF0YVtNQVhfVE9LX1NJWkVdOwotCXVuc2lnbmVkIGNoYXIgbGVuOwotCS8qIHByb2ZpdDogdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIGJlIHNhdmVkIGJ5IGluc2VydGluZyB0aGlzCi0JICogdG9rZW4gaW50byB0aGUgdGFibGUgKi8KLQlpbnQgcHJvZml0OwotCXN0cnVjdCB0b2tlbiAqbmV4dDsJLyogbmV4dCB0b2tlbiBvbiB0aGUgaGFzaCBsaXN0ICovCi0Jc3RydWN0IHRva2VuICpyaWdodDsJLyogbmV4dCB0b2tlbiBvbiB0aGUgZ29vZC9iYWQgbGlzdCAqLwotCXN0cnVjdCB0b2tlbiAqbGVmdDsgICAgLyogcHJldmlvdXMgdG9rZW4gb24gdGhlIGdvb2QvYmFkIGxpc3QgKi8KLQlzdHJ1Y3QgdG9rZW4gKnNtYWxsZXI7IC8qIHRva2VuIHRoYXQgaXMgbGVzcyBvbmUgbGV0dGVyIHRoYW4gdGhpcyBvbmUgKi8KLQl9OwotCi1zdHJ1Y3QgdG9rZW4gYmFkX2hlYWQsIGdvb2RfaGVhZDsKLXN0cnVjdCB0b2tlbiAqaGFzaF90YWJsZVtIQVNIX1RBQkxFX1NJWkVdOworaW50IHRva2VuX3Byb2ZpdFsweDEwMDAwXTsKIAogLyogdGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHJlc3Npb24gKi8KLXVuc2lnbmVkIGNoYXIgYmVzdF90YWJsZVsyNTZdW01BWF9UT0tfU0laRSsxXTsKK3Vuc2lnbmVkIGNoYXIgYmVzdF90YWJsZVsyNTZdWzJdOwogdW5zaWduZWQgY2hhciBiZXN0X3RhYmxlX2xlblsyNTZdOwogCiAKLXN0YXRpYyB2b2lkCi11c2FnZSh2b2lkKQorc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBrYWxsc3ltcyBbLS1hbGwtc3ltYm9sc10gWy0tc3ltYm9sLXByZWZpeD08cHJlZml4IGNoYXI+XSA8IGluLm1hcCA+IG91dC5TXG4iKTsKIAlleGl0KDEpOwpAQCAtMTAyLDIxICs2NCwxOSBAQAogICogVGhpcyBpZ25vcmVzIHRoZSBpbnRlbnNlbHkgYW5ub3lpbmcgIm1hcHBpbmcgc3ltYm9scyIgZm91bmQKICAqIGluIEFSTSBFTEYgZmlsZXM6ICRhLCAkdCBhbmQgJGQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pc19hcm1fbWFwcGluZ19zeW1ib2woY29uc3QgY2hhciAqc3RyKQorc3RhdGljIGlubGluZSBpbnQgaXNfYXJtX21hcHBpbmdfc3ltYm9sKGNvbnN0IGNoYXIgKnN0cikKIHsKIAlyZXR1cm4gc3RyWzBdID09ICckJyAmJiBzdHJjaHIoImF0ZCIsIHN0clsxXSkKIAkgICAgICAgJiYgKHN0clsyXSA9PSAnXDAnIHx8IHN0clsyXSA9PSAnLicpOwogfQogCi1zdGF0aWMgaW50Ci1yZWFkX3N5bWJvbChGSUxFICppbiwgc3RydWN0IHN5bV9lbnRyeSAqcykKK3N0YXRpYyBpbnQgcmVhZF9zeW1ib2woRklMRSAqaW4sIHN0cnVjdCBzeW1fZW50cnkgKnMpCiB7CiAJY2hhciBzdHJbNTAwXTsKLQljaGFyICpzeW07CisJY2hhciAqc3ltLCBzdHlwZTsKIAlpbnQgcmM7CiAKLQlyYyA9IGZzY2FuZihpbiwgIiVsbHggJWMgJTQ5OXNcbiIsICZzLT5hZGRyLCAmcy0+dHlwZSwgc3RyKTsKKwlyYyA9IGZzY2FuZihpbiwgIiVsbHggJWMgJTQ5OXNcbiIsICZzLT5hZGRyLCAmc3R5cGUsIHN0cik7CiAJaWYgKHJjICE9IDMpIHsKIAkJaWYgKHJjICE9IEVPRikgewogCQkJLyogc2tpcCBsaW5lICovCkBAIC0xNDMsNyArMTAzLDcgQEAKIAkJX3NleHRyYXRleHQgPSBzLT5hZGRyOwogCWVsc2UgaWYgKHN0cmNtcChzeW0sICJfZWV4dHJhdGV4dCIpID09IDApCiAJCV9lZXh0cmF0ZXh0ID0gcy0+YWRkcjsKLQllbHNlIGlmICh0b3VwcGVyKHMtPnR5cGUpID09ICdBJykKKwllbHNlIGlmICh0b3VwcGVyKHN0eXBlKSA9PSAnQScpCiAJewogCQkvKiBLZWVwIHRoZXNlIHVzZWZ1bCBhYnNvbHV0ZSBzeW1ib2xzICovCiAJCWlmIChzdHJjbXAoc3ltLCAiX19rZXJuZWxfc3lzY2FsbF92aWFfYnJlYWsiKSAmJgpAQCAtMTUzLDIyICsxMTMsMjQgQEAKIAkJCXJldHVybiAtMTsKIAogCX0KLQllbHNlIGlmICh0b3VwcGVyKHMtPnR5cGUpID09ICdVJyB8fAorCWVsc2UgaWYgKHRvdXBwZXIoc3R5cGUpID09ICdVJyB8fAogCQkgaXNfYXJtX21hcHBpbmdfc3ltYm9sKHN5bSkpCiAJCXJldHVybiAtMTsKKwkvKiBleGNsdWRlIGFsc28gTUlQUyBFTEYgbG9jYWwgc3ltYm9scyAoJEwxMjMgaW5zdGVhZCBvZiAuTDEyMykgKi8KKwllbHNlIGlmIChzdHJbMF0gPT0gJyQnKQorCQlyZXR1cm4gLTE7CiAKIAkvKiBpbmNsdWRlIHRoZSB0eXBlIGZpZWxkIGluIHRoZSBzeW1ib2wgbmFtZSwgc28gdGhhdCBpdCBnZXRzCiAJICogY29tcHJlc3NlZCB0b2dldGhlciAqLwogCXMtPmxlbiA9IHN0cmxlbihzdHIpICsgMTsKLQlzLT5zeW0gPSAoY2hhciAqKSBtYWxsb2Mocy0+bGVuICsgMSk7Ci0Jc3RyY3B5KHMtPnN5bSArIDEsIHN0cik7Ci0Jcy0+c3ltWzBdID0gcy0+dHlwZTsKKwlzLT5zeW0gPSBtYWxsb2Mocy0+bGVuICsgMSk7CisJc3RyY3B5KChjaGFyICopcy0+c3ltICsgMSwgc3RyKTsKKwlzLT5zeW1bMF0gPSBzdHlwZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1zeW1ib2xfdmFsaWQoc3RydWN0IHN5bV9lbnRyeSAqcykKK3N0YXRpYyBpbnQgc3ltYm9sX3ZhbGlkKHN0cnVjdCBzeW1fZW50cnkgKnMpCiB7CiAJLyogU3ltYm9scyB3aGljaCB2YXJ5IGJldHdlZW4gcGFzc2VzLiAgUGFzc2VzIDEgYW5kIDIgbXVzdCBoYXZlCiAJICogaWRlbnRpY2FsIHN5bWJvbCBsaXN0cy4gIFRoZSBrYWxsc3ltc18qIHN5bWJvbHMgYmVsb3cgYXJlIG9ubHkgYWRkZWQKQEAgLTIxNCwzMCArMTc2LDI5IEBACiAJfQogCiAJLyogRXhjbHVkZSBzeW1ib2xzIHdoaWNoIHZhcnkgYmV0d2VlbiBwYXNzZXMuICovCi0JaWYgKHN0cnN0cihzLT5zeW0gKyBvZmZzZXQsICJfY29tcGlsZWQuIikpCisJaWYgKHN0cnN0cigoY2hhciAqKXMtPnN5bSArIG9mZnNldCwgIl9jb21waWxlZC4iKSkKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBzcGVjaWFsX3N5bWJvbHNbaV07IGkrKykKLQkJaWYoIHN0cmNtcChzLT5zeW0gKyBvZmZzZXQsIHNwZWNpYWxfc3ltYm9sc1tpXSkgPT0gMCApCisJCWlmKCBzdHJjbXAoKGNoYXIgKilzLT5zeW0gKyBvZmZzZXQsIHNwZWNpYWxfc3ltYm9sc1tpXSkgPT0gMCApCiAJCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZAotcmVhZF9tYXAoRklMRSAqaW4pCitzdGF0aWMgdm9pZCByZWFkX21hcChGSUxFICppbikKIHsKIAl3aGlsZSAoIWZlb2YoaW4pKSB7Ci0JCWlmIChjbnQgPj0gc2l6ZSkgewotCQkJc2l6ZSArPSAxMDAwMDsKLQkJCXRhYmxlID0gcmVhbGxvYyh0YWJsZSwgc2l6ZW9mKCp0YWJsZSkgKiBzaXplKTsKKwkJaWYgKHRhYmxlX2NudCA+PSB0YWJsZV9zaXplKSB7CisJCQl0YWJsZV9zaXplICs9IDEwMDAwOworCQkJdGFibGUgPSByZWFsbG9jKHRhYmxlLCBzaXplb2YoKnRhYmxlKSAqIHRhYmxlX3NpemUpOwogCQkJaWYgKCF0YWJsZSkgewogCQkJCWZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCQkJZXhpdCAoMSk7CiAJCQl9CiAJCX0KLQkJaWYgKHJlYWRfc3ltYm9sKGluLCAmdGFibGVbY250XSkgPT0gMCkKLQkJCWNudCsrOworCQlpZiAocmVhZF9zeW1ib2woaW4sICZ0YWJsZVt0YWJsZV9jbnRdKSA9PSAwKQorCQkJdGFibGVfY250Kys7CiAJfQogfQogCkBAIC0yODEsMTAgKzI0Miw5IEBACiAJcmV0dXJuIHRvdGFsOwogfQogCi1zdGF0aWMgdm9pZAotd3JpdGVfc3JjKHZvaWQpCitzdGF0aWMgdm9pZCB3cml0ZV9zcmModm9pZCkKIHsKLQlpbnQgaSwgaywgb2ZmLCB2YWxpZDsKKwl1bnNpZ25lZCBpbnQgaSwgaywgb2ZmOwogCXVuc2lnbmVkIGludCBiZXN0X2lkeFsyNTZdOwogCXVuc2lnbmVkIGludCAqbWFya2VyczsKIAljaGFyIGJ1ZltLU1lNX05BTUVfTEVOKzFdOwpAQCAtMzAxLDMzICsyNjEsMjQgQEAKIAlwcmludGYoIi5kYXRhXG4iKTsKIAogCW91dHB1dF9sYWJlbCgia2FsbHN5bXNfYWRkcmVzc2VzIik7Ci0JdmFsaWQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkgewotCQkJcHJpbnRmKCJcdFBUUlx0JSNsbHhcbiIsIHRhYmxlW2ldLmFkZHIpOwotCQkJdmFsaWQrKzsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jbnQ7IGkrKykgeworCQlwcmludGYoIlx0UFRSXHQlI2xseFxuIiwgdGFibGVbaV0uYWRkcik7CiAJfQogCXByaW50ZigiXG4iKTsKIAogCW91dHB1dF9sYWJlbCgia2FsbHN5bXNfbnVtX3N5bXMiKTsKLQlwcmludGYoIlx0UFRSXHQlZFxuIiwgdmFsaWQpOworCXByaW50ZigiXHRQVFJcdCVkXG4iLCB0YWJsZV9jbnQpOwogCXByaW50ZigiXG4iKTsKIAogCS8qIHRhYmxlIG9mIG9mZnNldCBtYXJrZXJzLCB0aGF0IGdpdmUgdGhlIG9mZnNldCBpbiB0aGUgY29tcHJlc3NlZCBzdHJlYW0KIAkgKiBldmVyeSAyNTYgc3ltYm9scyAqLwotCW1hcmtlcnMgPSAodW5zaWduZWQgaW50ICopIG1hbGxvYyhzaXplb2YodW5zaWduZWQgaW50KSooKHZhbGlkICsgMjU1KSAvIDI1NikpOworCW1hcmtlcnMgPSAodW5zaWduZWQgaW50ICopIG1hbGxvYyhzaXplb2YodW5zaWduZWQgaW50KSAqICgodGFibGVfY250ICsgMjU1KSAvIDI1NikpOwogCiAJb3V0cHV0X2xhYmVsKCJrYWxsc3ltc19uYW1lcyIpOwotCXZhbGlkID0gMDsKIAlvZmYgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCi0JCWlmICghdGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgodmFsaWQgJiAweEZGKSA9PSAwKQotCQkJbWFya2Vyc1t2YWxpZCA+PiA4XSA9IG9mZjsKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfY250OyBpKyspIHsKKwkJaWYgKChpICYgMHhGRikgPT0gMCkKKwkJCW1hcmtlcnNbaSA+PiA4XSA9IG9mZjsKIAogCQlwcmludGYoIlx0LmJ5dGUgMHglMDJ4IiwgdGFibGVbaV0ubGVuKTsKIAkJZm9yIChrID0gMDsgayA8IHRhYmxlW2ldLmxlbjsgaysrKQpAQCAtMzM1LDEyICsyODYsMTEgQEAKIAkJcHJpbnRmKCJcbiIpOwogCiAJCW9mZiArPSB0YWJsZVtpXS5sZW4gKyAxOwotCQl2YWxpZCsrOwogCX0KIAlwcmludGYoIlxuIik7CiAKIAlvdXRwdXRfbGFiZWwoImthbGxzeW1zX21hcmtlcnMiKTsKLQlmb3IgKGkgPSAwOyBpIDwgKCh2YWxpZCArIDI1NSkgPj4gOCk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgKCh0YWJsZV9jbnQgKyAyNTUpID4+IDgpOyBpKyspCiAJCXByaW50ZigiXHRQVFJcdCVkXG4iLCBtYXJrZXJzW2ldKTsKIAlwcmludGYoIlxuIik7CiAKQEAgLTM1MCw3ICszMDAsNyBAQAogCW9mZiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAJCWJlc3RfaWR4W2ldID0gb2ZmOwotCQlleHBhbmRfc3ltYm9sKGJlc3RfdGFibGVbaV0sYmVzdF90YWJsZV9sZW5baV0sYnVmKTsKKwkJZXhwYW5kX3N5bWJvbChiZXN0X3RhYmxlW2ldLCBiZXN0X3RhYmxlX2xlbltpXSwgYnVmKTsKIAkJcHJpbnRmKCJcdC5hc2Npelx0XCIlc1wiXG4iLCBidWYpOwogCQlvZmYgKz0gc3RybGVuKGJ1ZikgKyAxOwogCX0KQEAgLTM2NSwxNTMgKzMxNSwxMyBAQAogCiAvKiB0YWJsZSBsb29rdXAgY29tcHJlc3Npb24gZnVuY3Rpb25zICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlaGFzaF90b2tlbih1bnNpZ25lZCBpbnQgaGFzaCwgdW5zaWduZWQgY2hhciBkYXRhKQotewotCXJldHVybiAoKGhhc2ggKiAxNjc3NzYxOSkgXiBkYXRhKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX3Rva2VuKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0JdW5zaWduZWQgaW50IGhhc2g9SEFTSF9CQVNFX09GRlNFVDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJaGFzaCA9IHJlaGFzaF90b2tlbihoYXNoLCBkYXRhW2ldKTsKLQotCXJldHVybiBIQVNIX0ZPTEQoaGFzaCk7Ci19Ci0KLS8qIGZpbmQgYSB0b2tlbiBnaXZlbiBpdHMgZGF0YSBhbmQgaGFzaCB2YWx1ZSAqLwotc3RhdGljIHN0cnVjdCB0b2tlbiAqZmluZF90b2tlbl9oYXNoKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sIHVuc2lnbmVkIGludCBoYXNoKQotewotCXN0cnVjdCB0b2tlbiAqcHRyOwotCi0JcHRyID0gaGFzaF90YWJsZVtoYXNoXTsKLQotCXdoaWxlIChwdHIpIHsKLQkJaWYgKChwdHItPmxlbiA9PSBsZW4pICYmIChtZW1jbXAocHRyLT5kYXRhLCBkYXRhLCBsZW4pID09IDApKQotCQkJcmV0dXJuIHB0cjsKLQkJcHRyPXB0ci0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGluc2VydF90b2tlbl9pbl9ncm91cChzdHJ1Y3QgdG9rZW4gKmhlYWQsIHN0cnVjdCB0b2tlbiAqcHRyKQotewotCXB0ci0+cmlnaHQgPSBoZWFkLT5yaWdodDsKLQlwdHItPnJpZ2h0LT5sZWZ0ID0gcHRyOwotCWhlYWQtPnJpZ2h0ID0gcHRyOwotCXB0ci0+bGVmdCA9IGhlYWQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfdG9rZW5fZnJvbV9ncm91cChzdHJ1Y3QgdG9rZW4gKnB0cikKLXsKLQlwdHItPmxlZnQtPnJpZ2h0ID0gcHRyLT5yaWdodDsKLQlwdHItPnJpZ2h0LT5sZWZ0ID0gcHRyLT5sZWZ0OwotfQotCi0KLS8qIGJ1aWxkIHRoZSBjb3VudHMgZm9yIGFsbCB0aGUgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAiZGF0YSIsIGFuZCBoYXZlIGxlbmdodHMKLSAqIGZyb20gMiB0byAibGVuIiAqLwotc3RhdGljIHZvaWQgbGVhcm5fdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgdG9rZW4gKnB0ciwqbGFzdF9wdHI7Ci0JaW50IGksIG5ld3Byb2ZpdDsKLQl1bnNpZ25lZCBpbnQgaGFzaCA9IEhBU0hfQkFTRV9PRkZTRVQ7Ci0JdW5zaWduZWQgaW50IGhhc2hlc1tNQVhfVE9LX1NJWkUgKyAxXTsKLQotCWlmIChsZW4gPiBNQVhfVE9LX1NJWkUpCi0JCWxlbiA9IE1BWF9UT0tfU0laRTsKLQotCS8qIGNhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlIGhhc2ggdmFsdWVzIGZvciBhbGwgdGhlIHN1Yi10b2tlbnMgKi8KLQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbMF0pOwotCWZvciAoaSA9IDI7IGkgPD0gbGVuOyBpKyspIHsKLQkJaGFzaCA9IHJlaGFzaF90b2tlbihoYXNoLCBkYXRhW2ktMV0pOwotCQloYXNoZXNbaV0gPSBIQVNIX0ZPTEQoaGFzaCk7Ci0JfQotCi0JbGFzdF9wdHIgPSBOVUxMOwotCXB0ciA9IE5VTEw7Ci0KLQlmb3IgKGkgPSBsZW47IGkgPj0gMjsgaS0tKSB7Ci0JCWhhc2ggPSBoYXNoZXNbaV07Ci0KLQkJaWYgKCFwdHIpIHB0ciA9IGZpbmRfdG9rZW5faGFzaChkYXRhLCBpLCBoYXNoKTsKLQotCQlpZiAoIXB0cikgewotCQkJLyogY3JlYXRlIGEgbmV3IHRva2VuIGVudHJ5ICovCi0JCQlwdHIgPSAoc3RydWN0IHRva2VuICopIG1hbGxvYyhzaXplb2YoKnB0cikpOwotCi0JCQltZW1jcHkocHRyLT5kYXRhLCBkYXRhLCBpKTsKLQkJCXB0ci0+bGVuID0gaTsKLQotCQkJLyogd2hlbiB3ZSBjcmVhdGUgYW4gZW50cnksIGl0J3MgcHJvZml0IGlzIDAgYmVjYXVzZQotCQkJICogd2UgYWxzbyB0YWtlIGludG8gYWNjb3VudCB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4gb24KLQkJCSAqIHRoZSBjb21wcmVzc2VkIHRhYmxlLiBXZSB0aGVuIHN1YnRyYWN0IEdPT0RfQkFEX1RIUkVTSE9MRAotCQkJICogc28gdGhhdCB0aGUgdGVzdCB0byBzZWUgaWYgdGhpcyB0b2tlbiBiZWxvbmdzIHRvCi0JCQkgKiB0aGUgZ29vZCBvciBiYWQgbGlzdCwgaXMgYSBjb21wYXJpc29uIHRvIHplcm8gKi8KLQkJCXB0ci0+cHJvZml0ID0gLUdPT0RfQkFEX1RIUkVTSE9MRDsKLQotCQkJcHRyLT5uZXh0ID0gaGFzaF90YWJsZVtoYXNoXTsKLQkJCWhhc2hfdGFibGVbaGFzaF0gPSBwdHI7Ci0KLQkJCWluc2VydF90b2tlbl9pbl9ncm91cCgmYmFkX2hlYWQsIHB0cik7Ci0KLQkJCXB0ci0+c21hbGxlciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQluZXdwcm9maXQgPSBwdHItPnByb2ZpdCArIChwdHItPmxlbiAtIDEpOwotCQkJLyogY2hlY2sgdG8gc2VlIGlmIHRoaXMgdG9rZW4gbmVlZHMgdG8gYmUgbW92ZWQgdG8gYQotCQkJICogZGlmZmVyZW50IGxpc3QgKi8KLQkJCWlmKChwdHItPnByb2ZpdCA8IDApICYmIChuZXdwcm9maXQgPj0gMCkpIHsKLQkJCQlyZW1vdmVfdG9rZW5fZnJvbV9ncm91cChwdHIpOwotCQkJCWluc2VydF90b2tlbl9pbl9ncm91cCgmZ29vZF9oZWFkLHB0cik7Ci0JCQl9Ci0JCQlwdHItPnByb2ZpdCA9IG5ld3Byb2ZpdDsKLQkJfQotCi0JCWlmIChsYXN0X3B0cikgbGFzdF9wdHItPnNtYWxsZXIgPSBwdHI7Ci0JCWxhc3RfcHRyID0gcHRyOwotCi0JCXB0ciA9IHB0ci0+c21hbGxlcjsKLQl9Ci19Ci0KLS8qIGRlY3JlYXNlIHRoZSBjb3VudHMgZm9yIGFsbCB0aGUgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAiZGF0YSIsIGFuZCBoYXZlIGxlbmdodHMKLSAqIGZyb20gMiB0byAibGVuIi4gVGhpcyBmdW5jdGlvbiBpcyBtdWNoIHNpbXBsZXIgdGhhbiBsZWFybl90b2tlbiBiZWNhdXNlIHdlIGhhdmUKLSAqIG1vcmUgZ3VhcmFudGVlcyAodGhvIHRva2VucyBleGlzdCwgdGhlIC0+c21hbGxlciBwb2ludGVyIGlzIHNldCwgZXRjLikKLSAqIFRoZSB0d28gc2VwYXJhdGUgZnVuY3Rpb25zIGV4aXN0IG9ubHkgYmVjYXVzZSBvZiBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZSAqLwotc3RhdGljIHZvaWQgZm9yZ2V0X3Rva2VuKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IHRva2VuICpwdHI7Ci0JaW50IGksIG5ld3Byb2ZpdDsKLQl1bnNpZ25lZCBpbnQgaGFzaD0wOwotCi0JaWYgKGxlbiA+IE1BWF9UT0tfU0laRSkgbGVuID0gTUFYX1RPS19TSVpFOwotCi0JaGFzaCA9IGhhc2hfdG9rZW4oZGF0YSwgbGVuKTsKLQlwdHIgPSBmaW5kX3Rva2VuX2hhc2goZGF0YSwgbGVuLCBoYXNoKTsKLQotCWZvciAoaSA9IGxlbjsgaSA+PSAyOyBpLS0pIHsKLQotCQluZXdwcm9maXQgPSBwdHItPnByb2ZpdCAtIChwdHItPmxlbiAtIDEpOwotCQlpZiAoKHB0ci0+cHJvZml0ID49IDApICYmIChuZXdwcm9maXQgPCAwKSkgewotCQkJcmVtb3ZlX3Rva2VuX2Zyb21fZ3JvdXAocHRyKTsKLQkJCWluc2VydF90b2tlbl9pbl9ncm91cCgmYmFkX2hlYWQsIHB0cik7Ci0JCX0KLQkJcHRyLT5wcm9maXQ9bmV3cHJvZml0OwotCi0JCXB0cj1wdHItPnNtYWxsZXI7Ci0JfQotfQotCiAvKiBjb3VudCBhbGwgdGhlIHBvc3NpYmxlIHRva2VucyBpbiBhIHN5bWJvbCAqLwogc3RhdGljIHZvaWQgbGVhcm5fc3ltYm9sKHVuc2lnbmVkIGNoYXIgKnN5bWJvbCwgaW50IGxlbikKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspCi0JCWxlYXJuX3Rva2VuKHN5bWJvbCArIGksIGxlbiAtIGkpOworCQl0b2tlbl9wcm9maXRbIHN5bWJvbFtpXSArIChzeW1ib2xbaSArIDFdIDw8IDgpIF0rKzsKIH0KIAogLyogZGVjcmVhc2UgdGhlIGNvdW50IGZvciBhbGwgdGhlIHBvc3NpYmxlIHRva2VucyBpbiBhIHN5bWJvbCAqLwpAQCAtNTIwLDExNyArMzMwLDkwIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKQotCQlmb3JnZXRfdG9rZW4oc3ltYm9sICsgaSwgbGVuIC0gaSk7CisJCXRva2VuX3Byb2ZpdFsgc3ltYm9sW2ldICsgKHN5bWJvbFtpICsgMV0gPDwgOCkgXS0tOwogfQogCi0vKiBzZXQgYWxsIHRoZSBzeW1ib2wgZmxhZ3MgYW5kIGRvIHRoZSBpbml0aWFsIHRva2VuIGNvdW50ICovCisvKiByZW1vdmUgYWxsIHRoZSBpbnZhbGlkIHN5bWJvbHMgZnJvbSB0aGUgdGFibGUgYW5kIGRvIHRoZSBpbml0aWFsIHRva2VuIGNvdW50ICovCiBzdGF0aWMgdm9pZCBidWlsZF9pbml0aWFsX3Rva190YWJsZSh2b2lkKQogewotCWludCBpLCB1c2VfaXQsIHZhbGlkOworCXVuc2lnbmVkIGludCBpLCBwb3M7CiAKLQl2YWxpZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCXRhYmxlW2ldLmZsYWdzID0gMDsKKwlwb3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jbnQ7IGkrKykgewogCQlpZiAoIHN5bWJvbF92YWxpZCgmdGFibGVbaV0pICkgewotCQkJdGFibGVbaV0uZmxhZ3MgfD0gU1lNX0ZMQUdfVkFMSUQ7Ci0JCQl2YWxpZCsrOworCQkJaWYgKHBvcyAhPSBpKQorCQkJCXRhYmxlW3Bvc10gPSB0YWJsZVtpXTsKKwkJCWxlYXJuX3N5bWJvbCh0YWJsZVtwb3NdLnN5bSwgdGFibGVbcG9zXS5sZW4pOworCQkJcG9zKys7CiAJCX0KIAl9Ci0KLQl1c2VfaXQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCi0JCS8qIHN1YnNhbXBsZSB0aGUgYXZhaWxhYmxlIHN5bWJvbHMuIFRoaXMgbWV0aG9kIGlzIGFsbW9zdCBsaWtlCi0JCSAqIGEgQnJlc2VuaGFtJ3MgYWxnb3JpdGhtIHRvIGdldCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgc2FtcGxlcwotCQkgKiBhY3Jvc3MgdGhlIHN5bWJvbCB0YWJsZSAqLwotCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkgewotCi0JCQl1c2VfaXQgKz0gV09SS0lOR19TRVQ7Ci0KLQkJCWlmICh1c2VfaXQgPj0gdmFsaWQpIHsKLQkJCQl0YWJsZVtpXS5mbGFncyB8PSBTWU1fRkxBR19TQU1QTEVEOwotCQkJCXVzZV9pdCAtPSB2YWxpZDsKLQkJCX0KLQkJfQotCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19TQU1QTEVEKQotCQkJbGVhcm5fc3ltYm9sKHRhYmxlW2ldLnN5bSwgdGFibGVbaV0ubGVuKTsKLQl9CisJdGFibGVfY250ID0gcG9zOwogfQogCiAvKiByZXBsYWNlIGEgZ2l2ZW4gdG9rZW4gaW4gYWxsIHRoZSB2YWxpZCBzeW1ib2xzLiBVc2UgdGhlIHNhbXBsZWQgc3ltYm9scwogICogdG8gdXBkYXRlIHRoZSBjb3VudHMgKi8KLXN0YXRpYyB2b2lkIGNvbXByZXNzX3N5bWJvbHModW5zaWduZWQgY2hhciAqc3RyLCBpbnQgdGxlbiwgaW50IGlkeCkKK3N0YXRpYyB2b2lkIGNvbXByZXNzX3N5bWJvbHModW5zaWduZWQgY2hhciAqc3RyLCBpbnQgaWR4KQogewotCWludCBpLCBsZW4sIGxlYXJuLCBzaXplOwotCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGksIGxlbiwgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpwMSwgKnAyOwogCi0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0KLQkJaWYgKCEodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkpIGNvbnRpbnVlOworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jbnQ7IGkrKykgewogCiAJCWxlbiA9IHRhYmxlW2ldLmxlbjsKLQkJbGVhcm4gPSAwOwotCQlwID0gdGFibGVbaV0uc3ltOworCQlwMSA9IHRhYmxlW2ldLnN5bTsKKworCQkvKiBmaW5kIHRoZSB0b2tlbiBvbiB0aGUgc3ltYm9sICovCisJCXAyID0gbWVtbWVtKHAxLCBsZW4sIHN0ciwgMik7CisJCWlmICghcDIpIGNvbnRpbnVlOworCisJCS8qIGRlY3JlYXNlIHRoZSBjb3VudHMgZm9yIHRoaXMgc3ltYm9sJ3MgdG9rZW5zICovCisJCWZvcmdldF9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOworCisJCXNpemUgPSBsZW47CiAKIAkJZG8geworCQkJKnAyID0gaWR4OworCQkJcDIrKzsKKwkJCXNpemUgLT0gKHAyIC0gcDEpOworCQkJbWVtbW92ZShwMiwgcDIgKyAxLCBzaXplKTsKKwkJCXAxID0gcDI7CisJCQlsZW4tLTsKKworCQkJaWYgKHNpemUgPCAyKSBicmVhazsKKwogCQkJLyogZmluZCB0aGUgdG9rZW4gb24gdGhlIHN5bWJvbCAqLwotCQkJcCA9ICh1bnNpZ25lZCBjaGFyICopIHN0cnN0cigoY2hhciAqKSBwLCAoY2hhciAqKSBzdHIpOwotCQkJaWYgKCFwKSBicmVhazsKKwkJCXAyID0gbWVtbWVtKHAxLCBzaXplLCBzdHIsIDIpOwogCi0JCQlpZiAoIWxlYXJuKSB7Ci0JCQkJLyogaWYgdGhpcyBzeW1ib2wgd2FzIHVzZWQgdG8gY291bnQsIGRlY3JlYXNlIGl0ICovCi0JCQkJaWYgKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfU0FNUExFRCkKLQkJCQkJZm9yZ2V0X3N5bWJvbCh0YWJsZVtpXS5zeW0sIGxlbik7Ci0JCQkJbGVhcm4gPSAxOwotCQkJfQorCQl9IHdoaWxlIChwMik7CiAKLQkJCSpwID0gaWR4OwotCQkJc2l6ZSA9IChsZW4gLSAocCAtIHRhYmxlW2ldLnN5bSkpIC0gdGxlbiArIDE7Ci0JCQltZW1tb3ZlKHAgKyAxLCBwICsgdGxlbiwgc2l6ZSk7Ci0JCQlwKys7Ci0JCQlsZW4gLT0gdGxlbiAtIDE7CisJCXRhYmxlW2ldLmxlbiA9IGxlbjsKIAotCQl9IHdoaWxlIChzaXplID49IHRsZW4pOwotCi0JCWlmKGxlYXJuKSB7Ci0JCQl0YWJsZVtpXS5sZW4gPSBsZW47Ci0JCQkvKiBpZiB0aGlzIHN5bWJvbCB3YXMgdXNlZCB0byBjb3VudCwgbGVhcm4gaXQgYWdhaW4gKi8KLQkJCWlmKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfU0FNUExFRCkKLQkJCQlsZWFybl9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOwotCQl9CisJCS8qIGluY3JlYXNlIHRoZSBjb3VudHMgZm9yIHRoaXMgc3ltYm9sJ3MgbmV3IHRva2VucyAqLworCQlsZWFybl9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOwogCX0KIH0KIAogLyogc2VhcmNoIHRoZSB0b2tlbiB3aXRoIHRoZSBtYXhpbXVtIHByb2ZpdCAqLwotc3RhdGljIHN0cnVjdCB0b2tlbiAqZmluZF9iZXN0X3Rva2VuKHZvaWQpCitzdGF0aWMgaW50IGZpbmRfYmVzdF90b2tlbih2b2lkKQogewotCXN0cnVjdCB0b2tlbiAqcHRyLCpiZXN0LCpoZWFkOwotCWludCBiZXN0cHJvZml0OworCWludCBpLCBiZXN0LCBiZXN0cHJvZml0OwogCiAJYmVzdHByb2ZpdD0tMTAwMDA7CisJYmVzdCA9IDA7CiAKLQkvKiBmYWlsc2FmZTogaWYgdGhlICJnb29kIiBsaXN0IGlzIGVtcHR5IHNlYXJjaCBmcm9tIHRoZSAiYmFkIiBsaXN0ICovCi0JaWYoZ29vZF9oZWFkLnJpZ2h0ID09ICZnb29kX2hlYWQpIGhlYWQgPSAmYmFkX2hlYWQ7Ci0JZWxzZSBoZWFkID0gJmdvb2RfaGVhZDsKLQotCXB0ciA9IGhlYWQtPnJpZ2h0OwotCWJlc3QgPSBOVUxMOwotCXdoaWxlIChwdHIgIT0gaGVhZCkgewotCQlpZiAocHRyLT5wcm9maXQgPiBiZXN0cHJvZml0KSB7Ci0JCQliZXN0cHJvZml0ID0gcHRyLT5wcm9maXQ7Ci0JCQliZXN0ID0gcHRyOworCWZvciAoaSA9IDA7IGkgPCAweDEwMDAwOyBpKyspIHsKKwkJaWYgKHRva2VuX3Byb2ZpdFtpXSA+IGJlc3Rwcm9maXQpIHsKKwkJCWJlc3QgPSBpOworCQkJYmVzdHByb2ZpdCA9IHRva2VuX3Byb2ZpdFtpXTsKIAkJfQotCQlwdHIgPSBwdHItPnJpZ2h0OwogCX0KLQogCXJldHVybiBiZXN0OwogfQogCiAvKiB0aGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBhbGdvcml0aG06IGNhbGN1bGF0ZSB0aGUgImJlc3QiIHRhYmxlICovCiBzdGF0aWMgdm9pZCBvcHRpbWl6ZV9yZXN1bHQodm9pZCkKIHsKLQlzdHJ1Y3QgdG9rZW4gKmJlc3Q7Ci0JaW50IGk7CisJaW50IGksIGJlc3Q7CiAKIAkvKiB1c2luZyB0aGUgJ1wwJyBzeW1ib2wgbGFzdCBhbGxvd3MgY29tcHJlc3Nfc3ltYm9scyB0byB1c2Ugc3RhbmRhcmQKIAkgKiBmYXN0IHN0cmluZyBmdW5jdGlvbnMgKi8KQEAgLTY0NCwxNCArNDI3LDEyIEBACiAJCQliZXN0ID0gZmluZF9iZXN0X3Rva2VuKCk7CiAKIAkJCS8qIHBsYWNlIGl0IGluIHRoZSAiYmVzdCIgdGFibGUgKi8KLQkJCWJlc3RfdGFibGVfbGVuW2ldID0gYmVzdC0+bGVuOwotCQkJbWVtY3B5KGJlc3RfdGFibGVbaV0sIGJlc3QtPmRhdGEsIGJlc3RfdGFibGVfbGVuW2ldKTsKLQkJCS8qIHplcm8gdGVybWluYXRlIHRoZSB0b2tlbiBzbyB0aGF0IHdlIGNhbiB1c2Ugc3Ryc3RyCi0JCQkgICBpbiBjb21wcmVzc19zeW1ib2xzICovCi0JCQliZXN0X3RhYmxlW2ldW2Jlc3RfdGFibGVfbGVuW2ldXT0nXDAnOworCQkJYmVzdF90YWJsZV9sZW5baV0gPSAyOworCQkJYmVzdF90YWJsZVtpXVswXSA9IGJlc3QgJiAweEZGOworCQkJYmVzdF90YWJsZVtpXVsxXSA9IChiZXN0ID4+IDgpICYgMHhGRjsKIAogCQkJLyogcmVwbGFjZSB0aGlzIHRva2VuIGluIGFsbCB0aGUgdmFsaWQgc3ltYm9scyAqLwotCQkJY29tcHJlc3Nfc3ltYm9scyhiZXN0X3RhYmxlW2ldLCBiZXN0X3RhYmxlX2xlbltpXSwgaSk7CisJCQljb21wcmVzc19zeW1ib2xzKGJlc3RfdGFibGVbaV0sIGkpOwogCQl9CiAJfQogfQpAQCAtNjU5LDM5ICs0NDAsMjggQEAKIC8qIHN0YXJ0IGJ5IHBsYWNpbmcgdGhlIHN5bWJvbHMgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZCBvbiB0aGUgdGFibGUgKi8KIHN0YXRpYyB2b2lkIGluc2VydF9yZWFsX3N5bWJvbHNfaW5fdGFibGUodm9pZCkKIHsKLQlpbnQgaSwgaiwgYzsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgYzsKIAogCW1lbXNldChiZXN0X3RhYmxlLCAwLCBzaXplb2YoYmVzdF90YWJsZSkpOwogCW1lbXNldChiZXN0X3RhYmxlX2xlbiwgMCwgc2l6ZW9mKGJlc3RfdGFibGVfbGVuKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJaWYgKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfVkFMSUQpIHsKLQkJCWZvciAoaiA9IDA7IGogPCB0YWJsZVtpXS5sZW47IGorKykgewotCQkJCWMgPSB0YWJsZVtpXS5zeW1bal07Ci0JCQkJYmVzdF90YWJsZVtjXVswXT1jOwotCQkJCWJlc3RfdGFibGVfbGVuW2NdPTE7Ci0JCQl9CisJZm9yIChpID0gMDsgaSA8IHRhYmxlX2NudDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCB0YWJsZVtpXS5sZW47IGorKykgeworCQkJYyA9IHRhYmxlW2ldLnN5bVtqXTsKKwkJCWJlc3RfdGFibGVbY11bMF09YzsKKwkJCWJlc3RfdGFibGVfbGVuW2NdPTE7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG9wdGltaXplX3Rva2VuX3RhYmxlKHZvaWQpCiB7Ci0JbWVtc2V0KGhhc2hfdGFibGUsIDAsIHNpemVvZihoYXNoX3RhYmxlKSk7Ci0KLQlnb29kX2hlYWQubGVmdCA9ICZnb29kX2hlYWQ7Ci0JZ29vZF9oZWFkLnJpZ2h0ID0gJmdvb2RfaGVhZDsKLQotCWJhZF9oZWFkLmxlZnQgPSAmYmFkX2hlYWQ7Ci0JYmFkX2hlYWQucmlnaHQgPSAmYmFkX2hlYWQ7Ci0KIAlidWlsZF9pbml0aWFsX3Rva190YWJsZSgpOwogCiAJaW5zZXJ0X3JlYWxfc3ltYm9sc19pbl90YWJsZSgpOwogCiAJLyogV2hlbiB2YWxpZCBzeW1ib2wgaXMgbm90IHJlZ2lzdGVyZWQsIGV4aXQgdG8gZXJyb3IgKi8KLQlpZiAoZ29vZF9oZWFkLmxlZnQgPT0gZ29vZF9oZWFkLnJpZ2h0ICYmCi0JICAgIGJhZF9oZWFkLmxlZnQgPT0gYmFkX2hlYWQucmlnaHQpIHsKKwlpZiAoIXRhYmxlX2NudCkgewogCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIHN5bWJvbC5cbiIpOwogCQlleGl0KDEpOwogCX0KQEAgLTcwMCw4ICs0NzAsNyBAQAogfQogCiAKLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJaWYgKGFyZ2MgPj0gMikgewogCQlpbnQgaTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbCBiL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbAppbmRleCBmMDRmNjI3Li5jMmQ1NDE0IDEwMDY0NAotLS0gYS9zY3JpcHRzL3JlZmVyZW5jZV9kaXNjYXJkZWQucGwKKysrIGIvc2NyaXB0cy9yZWZlcmVuY2VfZGlzY2FyZGVkLnBsCkBAIC05MSwxMiArOTEsNyBAQAogCQkgICAgICRmcm9tICF+IC9cLmV4aXRcLmRhdGEkLyAmJgogCQkgICAgICRmcm9tICF+IC9cLmFsdGluc3RydWN0aW9ucyQvICYmCiAJCSAgICAgJGZyb20gIX4gL1wucGRyJC8gJiYKLQkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19pbmZvJC8gJiYKLQkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19hcmFuZ2VzJC8gJiYKLQkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19yYW5nZXMkLyAmJgotCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX2xpbmUkLyAmJgotCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX2ZyYW1lJC8gJiYKLQkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19sb2MkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnXy4qJC8gJiYKIAkJICAgICAkZnJvbSAhfiAvXC5leGl0Y2FsbFwuZXhpdCQvICYmCiAJCSAgICAgJGZyb20gIX4gL1wuZWhfZnJhbWUkLyAmJgogCQkgICAgICRmcm9tICF+IC9cLnN0YWIkLykpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdmVyX2xpbnV4IGIvc2NyaXB0cy92ZXJfbGludXgKaW5kZXggYTI4YzI3OS4uYmViNDNlZjcgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdmVyX2xpbnV4CisrKyBiL3NjcmlwdHMvdmVyX2xpbnV4CkBAIC0yNSw5ICsyNSwxMSBAQAogJy9CRkQve3ByaW50ICJiaW51dGlscyAgICAgICAgICAgICAgIiwkTkZ9IFwKIC9eR05VL3twcmludCAiYmludXRpbHMgICAgICAgICAgICAgICIsJDR9JwogCi1mZGZvcm1hdCAtLXZlcnNpb24gfCBhd2sgLUZcLSAne3ByaW50ICJ1dGlsLWxpbnV4ICAgICAgICAgICAgIiwgJE5GfScKK2VjaG8gLW4gInV0aWwtbGludXggICAgICAgICAgICAgIgorZmRmb3JtYXQgLS12ZXJzaW9uIHwgYXdrICd7cHJpbnQgJE5GfScgfCBzZWQgLWUgcy9edXRpbC1saW51eC0vLyAtZSBzL1wpJC8vCiAKLW1vdW50IC0tdmVyc2lvbiB8IGF3ayAtRlwtICd7cHJpbnQgIm1vdW50ICAgICAgICAgICAgICAgICAiLCAkTkZ9JworZWNobyAtbiAibW91bnQgICAgICAgICAgICAgICAgICAiCittb3VudCAtLXZlcnNpb24gfCBhd2sgJ3twcmludCAkTkZ9JyB8IHNlZCAtZSBzL15tb3VudC0vLyAtZSBzL1wpJC8vCiAKIGRlcG1vZCAtViAgMj4mMSB8IGF3ayAnTlI9PTEge3ByaW50ICJtb2R1bGUtaW5pdC10b29scyAgICAgIiwkTkZ9JwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9kdW1teS5jIGIvc2VjdXJpdHkvZHVtbXkuYwppbmRleCA2ZmY4ODc1Li45NjIzYTYxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9kdW1teS5jCisrKyBiL3NlY3VyaXR5L2R1bW15LmMKQEAgLTI1OCwzMSArMjU4LDI0IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgaW50IGR1bW15X2lub2RlX2luaXRfc2VjdXJpdHkgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgIGNoYXIgKipuYW1lLCB2b2lkICoqdmFsdWUsIHNpemVfdCAqbGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogc3RhdGljIGludCBkdW1teV9pbm9kZV9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCSAgICAgICBpbnQgbWFzaykKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHVtbXlfaW5vZGVfcG9zdF9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkgICAgIGludCBtYXNrKQotewotCXJldHVybjsKLX0KLQogc3RhdGljIGludCBkdW1teV9pbm9kZV9saW5rIChzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkdW1teV9pbm9kZV9wb3N0X2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0JCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQotewotCXJldHVybjsKLX0KLQogc3RhdGljIGludCBkdW1teV9pbm9kZV91bmxpbmsgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlyZXR1cm4gMDsKQEAgLTI5NCwyNCArMjg3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X2lub2RlX3Bvc3Rfc3ltbGluayAoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IGR1bW15X2lub2RlX21rZGlyIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkgICAgICBpbnQgbWFzaykKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHVtbXlfaW5vZGVfcG9zdF9ta2RpciAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCSAgICBpbnQgbWFzaykKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfaW5vZGVfcm1kaXIgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlyZXR1cm4gMDsKQEAgLTMyMywxMiArMzA0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHVtbXlfaW5vZGVfcG9zdF9ta25vZCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCSAgICBpbnQgbW9kZSwgZGV2X3QgZGV2KQotewotCXJldHVybjsKLX0KLQogc3RhdGljIGludCBkdW1teV9pbm9kZV9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqb2xkX2lub2RlLAogCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfaW5vZGUsCkBAIC0zMzcsMTQgKzMxMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bW15X2lub2RlX3Bvc3RfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCi0JCQkJICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCi17Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IGR1bW15X2lub2RlX3JlYWRsaW5rIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJcmV0dXJuIDA7CkBAIC04ODYsMjAgKzg1MywxNSBAQAogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgc2JfcG9zdF9waXZvdHJvb3QpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfYWxsb2Nfc2VjdXJpdHkpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfZnJlZV9zZWN1cml0eSk7CisJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9pbml0X3NlY3VyaXR5KTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX2NyZWF0ZSk7Ci0Jc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9wb3N0X2NyZWF0ZSk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9saW5rKTsKLQlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX3Bvc3RfbGluayk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV91bmxpbmspOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfc3ltbGluayk7Ci0Jc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9wb3N0X3N5bWxpbmspOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfbWtkaXIpOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgaW5vZGVfcG9zdF9ta2Rpcik7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9ybWRpcik7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9ta25vZCk7Ci0Jc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9wb3N0X21rbm9kKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIGlub2RlX3JlbmFtZSk7Ci0Jc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9wb3N0X3JlbmFtZSk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9yZWFkbGluayk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9mb2xsb3dfbGluayk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbm9kZV9wZXJtaXNzaW9uKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCA4NjQxZjg4Li5mNDBjODIyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xMjY1LDg1ICsxMjY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogU2V0IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzIG9uIGEgbmV3bHkgY3JlYXRlZCBmaWxlLiAqLwotc3RhdGljIGludCBwb3N0X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKLXsKLQotCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmRzZWM7Ci0Jc3RydWN0IHN1cGVyYmxvY2tfc2VjdXJpdHlfc3RydWN0ICpzYnNlYzsKLQl1MzIgbmV3c2lkOwotCWNoYXIgKmNvbnRleHQ7Ci0JdW5zaWduZWQgaW50IGxlbjsKLQlpbnQgcmM7Ci0KLQl0c2VjID0gY3VycmVudC0+c2VjdXJpdHk7Ci0JZHNlYyA9IGRpci0+aV9zZWN1cml0eTsKLQlzYnNlYyA9IGRpci0+aV9zYi0+c19zZWN1cml0eTsKLQotCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCWlmICghaW5vZGUpIHsKLQkJLyogU29tZSBmaWxlIHN5c3RlbSB0eXBlcyAoZS5nLiBORlMpIG1heSBub3QgaW5zdGFudGlhdGUKLQkJICAgYSBkZW50cnkgZm9yIGFsbCBjcmVhdGUgb3BlcmF0aW9ucyAoZS5nLiBzeW1saW5rKSwKLQkJICAgc28gd2UgaGF2ZSB0byBjaGVjayB0byBzZWUgaWYgdGhlIGlub2RlIGlzIG5vbi1OVUxMLiAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwb3N0X2NyZWF0ZTogIG5vIGlub2RlLCBkaXIgKGRldj0lcywgIgotCQkgICAgICAgImlubz0lbGQpXG4iLCBkaXItPmlfc2ItPnNfaWQsIGRpci0+aV9pbm8pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodHNlYy0+Y3JlYXRlX3NpZCAmJiBzYnNlYy0+YmVoYXZpb3IgIT0gU0VDVVJJVFlfRlNfVVNFX01OVFBPSU5UKSB7Ci0JCW5ld3NpZCA9IHRzZWMtPmNyZWF0ZV9zaWQ7Ci0JfSBlbHNlIHsKLQkJcmMgPSBzZWN1cml0eV90cmFuc2l0aW9uX3NpZCh0c2VjLT5zaWQsIGRzZWMtPnNpZCwKLQkJCQkJICAgICBpbm9kZV9tb2RlX3RvX3NlY3VyaXR5X2NsYXNzKGlub2RlLT5pX21vZGUpLAotCQkJCQkgICAgICZuZXdzaWQpOwotCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBvc3RfY3JlYXRlOiAgIgotCQkJICAgICAgICJzZWN1cml0eV90cmFuc2l0aW9uX3NpZCBmYWlsZWQsIHJjPSVkIChkZXY9JXMgIgotCQkJICAgICAgICJpbm89JWxkKVxuIiwKLQkJCSAgICAgICAtcmMsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCi0JcmMgPSBpbm9kZV9zZWN1cml0eV9zZXRfc2lkKGlub2RlLCBuZXdzaWQpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwb3N0X2NyZWF0ZTogIGlub2RlX3NlY3VyaXR5X3NldF9zaWQgIgotCQkgICAgICAgImZhaWxlZCwgcmM9JWQgKGRldj0lcyBpbm89JWxkKVxuIiwKLQkJICAgICAgIC1yYywgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoc2JzZWMtPmJlaGF2aW9yID09IFNFQ1VSSVRZX0ZTX1VTRV9YQVRUUiAmJgotCSAgICBpbm9kZS0+aV9vcC0+c2V0eGF0dHIpIHsKLQkJLyogVXNlIGV4dGVuZGVkIGF0dHJpYnV0ZXMuICovCi0JCXJjID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmY29udGV4dCwgJmxlbik7Ci0JCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG9zdF9jcmVhdGU6ICBzaWRfdG9fY29udGV4dCAiCi0JCQkgICAgICAgImZhaWxlZCwgcmM9JWQgKGRldj0lcyBpbm89JWxkKVxuIiwKLQkJCSAgICAgICAtcmMsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWRvd24oJmlub2RlLT5pX3NlbSk7Ci0JCXJjID0gaW5vZGUtPmlfb3AtPnNldHhhdHRyKGRlbnRyeSwKLQkJCQkJICAgWEFUVFJfTkFNRV9TRUxJTlVYLAotCQkJCQkgICBjb250ZXh0LCBsZW4sIDApOwotCQl1cCgmaW5vZGUtPmlfc2VtKTsKLQkJa2ZyZWUoY29udGV4dCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBvc3RfY3JlYXRlOiAgc2V0eGF0dHIgZmFpbGVkLCAiCi0JCQkgICAgICAgInJjPSVkIChkZXY9JXMgaW5vPSVsZClcbiIsCi0JCQkgICAgICAgLXJjLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KIC8qIEhvb2sgZnVuY3Rpb25zIGJlZ2luIGhlcmUuICovCiAKIHN0YXRpYyBpbnQgc2VsaW51eF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCkBAIC0xNjczLDYgKzE1OTQsNyBAQAogCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSwgKmRldm51bGwgPSBOVUxMOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCWxvbmcgaiA9IC0xOwogCiAJaWYgKHR0eSkgewpAQCAtMTcwNiw5ICsxNjI4LDEwIEBACiAKIAkJaisrOwogCQlpID0gaiAqIF9fTkZEQklUUzsKLQkJaWYgKGkgPj0gZmlsZXMtPm1heF9mZHMgfHwgaSA+PSBmaWxlcy0+bWF4X2Zkc2V0KQorCQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwkJaWYgKGkgPj0gZmR0LT5tYXhfZmRzIHx8IGkgPj0gZmR0LT5tYXhfZmRzZXQpCiAJCQlicmVhazsKLQkJc2V0ID0gZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0c1tqXTsKKwkJc2V0ID0gZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbal07CiAJCWlmICghc2V0KQogCQkJY29udGludWU7CiAJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKQEAgLTE3MjksNyArMTY1Miw3IEBACiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQogCQkJCQlpZiAoZGV2bnVsbCkgewotCQkJCQkJYXRvbWljX2luYygmZGV2bnVsbC0+Zl9jb3VudCk7CisJCQkJCQlyY3VyZWZfaW5jKCZkZXZudWxsLT5mX2NvdW50KTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWRldm51bGwgPSBkZW50cnlfb3BlbihkZ2V0KHNlbGludXhfbnVsbCksIG1udGdldChzZWxpbnV4ZnNfbW91bnQpLCBPX1JEV1IpOwogCQkJCQkJaWYgKCFkZXZudWxsKSB7CkBAIC0yMDE4LDE2ICsxOTQxLDY2IEBACiAJaW5vZGVfZnJlZV9zZWN1cml0eShpbm9kZSk7CiB9CiAKK3N0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9pbml0X3NlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgICBjaGFyICoqbmFtZSwgdm9pZCAqKnZhbHVlLAorCQkJCSAgICAgICBzaXplX3QgKmxlbikKK3sKKwlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWM7CisJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqZHNlYzsKKwlzdHJ1Y3Qgc3VwZXJibG9ja19zZWN1cml0eV9zdHJ1Y3QgKnNic2VjOworCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWM7CisJdTMyIG5ld3NpZCwgY2xlbjsKKwlpbnQgcmM7CisJY2hhciAqbmFtZXAgPSBOVUxMLCAqY29udGV4dDsKKworCXRzZWMgPSBjdXJyZW50LT5zZWN1cml0eTsKKwlkc2VjID0gZGlyLT5pX3NlY3VyaXR5OworCXNic2VjID0gZGlyLT5pX3NiLT5zX3NlY3VyaXR5OworCWlzZWMgPSBpbm9kZS0+aV9zZWN1cml0eTsKKworCWlmICh0c2VjLT5jcmVhdGVfc2lkICYmIHNic2VjLT5iZWhhdmlvciAhPSBTRUNVUklUWV9GU19VU0VfTU5UUE9JTlQpIHsKKwkJbmV3c2lkID0gdHNlYy0+Y3JlYXRlX3NpZDsKKwl9IGVsc2UgeworCQlyYyA9IHNlY3VyaXR5X3RyYW5zaXRpb25fc2lkKHRzZWMtPnNpZCwgZHNlYy0+c2lkLAorCQkJCQkgICAgIGlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MoaW5vZGUtPmlfbW9kZSksCisJCQkJCSAgICAgJm5ld3NpZCk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICAiCisJCQkgICAgICAgInNlY3VyaXR5X3RyYW5zaXRpb25fc2lkIGZhaWxlZCwgcmM9JWQgKGRldj0lcyAiCisJCQkgICAgICAgImlubz0lbGQpXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICAtcmMsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJaW5vZGVfc2VjdXJpdHlfc2V0X3NpZChpbm9kZSwgbmV3c2lkKTsKKworCWlmIChuYW1lKSB7CisJCW5hbWVwID0ga3N0cmR1cChYQVRUUl9TRUxJTlVYX1NVRkZJWCwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmFtZXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJKm5hbWUgPSBuYW1lcDsKKwl9CisKKwlpZiAodmFsdWUgJiYgbGVuKSB7CisJCXJjID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmY29udGV4dCwgJmNsZW4pOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKG5hbWVwKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQkqdmFsdWUgPSBjb250ZXh0OworCQkqbGVuID0gY2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzZWxpbnV4X2lub2RlX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbWFzaykKIHsKIAlyZXR1cm4gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgU0VDQ0xBU1NfRklMRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfaW5vZGVfcG9zdF9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1hc2spCi17Ci0JcG9zdF9jcmVhdGUoZGlyLCBkZW50cnkpOwotfQotCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKIHsKIAlpbnQgcmM7CkBAIC0yMDM4LDExICsyMDExLDYgQEAKIAlyZXR1cm4gbWF5X2xpbmsoZGlyLCBvbGRfZGVudHJ5LCBNQVlfTElOSyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfaW5vZGVfcG9zdF9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCi17Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJaW50IHJjOwpAQCAtMjA1OCwyMSArMjAyNiwxMSBAQAogCXJldHVybiBtYXlfY3JlYXRlKGRpciwgZGVudHJ5LCBTRUNDTEFTU19MTktfRklMRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfaW5vZGVfcG9zdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcG9zdF9jcmVhdGUoZGlyLCBkZW50cnkpOwotfQotCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1hc2spCiB7CiAJcmV0dXJuIG1heV9jcmVhdGUoZGlyLCBkZW50cnksIFNFQ0NMQVNTX0RJUik7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfaW5vZGVfcG9zdF9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbWFzaykKLXsKLQlwb3N0X2NyZWF0ZShkaXIsIGRlbnRyeSk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXJldHVybiBtYXlfbGluayhkaXIsIGRlbnRyeSwgTUFZX1JNRElSKTsKQEAgLTIwODksMjMgKzIwNDcsMTIgQEAKIAlyZXR1cm4gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhtb2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfaW5vZGVfcG9zdF9ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgZGV2KQotewotCXBvc3RfY3JlYXRlKGRpciwgZGVudHJ5KTsKLX0KLQogc3RhdGljIGludCBzZWxpbnV4X2lub2RlX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICpuZXdfaW5vZGUsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCiB7CiAJcmV0dXJuIG1heV9yZW5hbWUob2xkX2lub2RlLCBvbGRfZGVudHJ5LCBuZXdfaW5vZGUsIG5ld19kZW50cnkpOwogfQogCi1zdGF0aWMgdm9pZCBzZWxpbnV4X2lub2RlX3Bvc3RfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKLXsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJcmV0dXJuIGRlbnRyeV9oYXNfcGVybShjdXJyZW50LCBOVUxMLCBkZW50cnksIEZJTEVfX1JFQUQpOwpAQCAtNDI5OCwyMCArNDI0NSwxNSBAQAogCiAJLmlub2RlX2FsbG9jX3NlY3VyaXR5ID0JCXNlbGludXhfaW5vZGVfYWxsb2Nfc2VjdXJpdHksCiAJLmlub2RlX2ZyZWVfc2VjdXJpdHkgPQkJc2VsaW51eF9pbm9kZV9mcmVlX3NlY3VyaXR5LAorCS5pbm9kZV9pbml0X3NlY3VyaXR5ID0JCXNlbGludXhfaW5vZGVfaW5pdF9zZWN1cml0eSwKIAkuaW5vZGVfY3JlYXRlID0JCQlzZWxpbnV4X2lub2RlX2NyZWF0ZSwKLQkuaW5vZGVfcG9zdF9jcmVhdGUgPQkJc2VsaW51eF9pbm9kZV9wb3N0X2NyZWF0ZSwKIAkuaW5vZGVfbGluayA9CQkJc2VsaW51eF9pbm9kZV9saW5rLAotCS5pbm9kZV9wb3N0X2xpbmsgPQkJc2VsaW51eF9pbm9kZV9wb3N0X2xpbmssCiAJLmlub2RlX3VubGluayA9CQkJc2VsaW51eF9pbm9kZV91bmxpbmssCiAJLmlub2RlX3N5bWxpbmsgPQkJc2VsaW51eF9pbm9kZV9zeW1saW5rLAotCS5pbm9kZV9wb3N0X3N5bWxpbmsgPQkJc2VsaW51eF9pbm9kZV9wb3N0X3N5bWxpbmssCiAJLmlub2RlX21rZGlyID0JCQlzZWxpbnV4X2lub2RlX21rZGlyLAotCS5pbm9kZV9wb3N0X21rZGlyID0JCXNlbGludXhfaW5vZGVfcG9zdF9ta2RpciwKIAkuaW5vZGVfcm1kaXIgPQkJCXNlbGludXhfaW5vZGVfcm1kaXIsCiAJLmlub2RlX21rbm9kID0JCQlzZWxpbnV4X2lub2RlX21rbm9kLAotCS5pbm9kZV9wb3N0X21rbm9kID0JCXNlbGludXhfaW5vZGVfcG9zdF9ta25vZCwKIAkuaW5vZGVfcmVuYW1lID0JCQlzZWxpbnV4X2lub2RlX3JlbmFtZSwKLQkuaW5vZGVfcG9zdF9yZW5hbWUgPQkJc2VsaW51eF9pbm9kZV9wb3N0X3JlbmFtZSwKIAkuaW5vZGVfcmVhZGxpbmsgPQkJc2VsaW51eF9pbm9kZV9yZWFkbGluaywKIAkuaW5vZGVfZm9sbG93X2xpbmsgPQkJc2VsaW51eF9pbm9kZV9mb2xsb3dfbGluaywKIAkuaW5vZGVfcGVybWlzc2lvbiA9CQlzZWxpbnV4X2lub2RlX3Blcm1pc3Npb24sCmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vTWFrZWZpbGUgYi9zb3VuZC9hcm0vTWFrZWZpbGUKaW5kZXggMTAzZjEzNi4uNGVmNmRkMCAxMDA2NDQKLS0tIGEvc291bmQvYXJtL01ha2VmaWxlCisrKyBiL3NvdW5kL2FybS9NYWtlZmlsZQpAQCAtMiwxMiArMiwxNCBAQAogIyBNYWtlZmlsZSBmb3IgQUxTQQogIwogCi1zbmQtc2ExMXh4LXVkYTEzNDEtb2JqcyA6PSBzYTExeHgtdWRhMTM0MS5vCi1zbmQtYWFjaS1vYmpzCQkJOj0gYWFjaS5vIGRldmRtYS5vCi1zbmQtcHhhMnh4LXBjbS1vYmpzIDo9IHB4YTJ4eC1wY20ubwotc25kLXB4YTJ4eC1hYzk3LW9ianMgOj0gcHhhMnh4LWFjOTcubwotCiBvYmotJChDT05GSUdfU05EX1NBMTFYWF9VREExMzQxKSArPSBzbmQtc2ExMXh4LXVkYTEzNDEubyAKK3NuZC1zYTExeHgtdWRhMTM0MS1vYmpzCQk6PSBzYTExeHgtdWRhMTM0MS5vCisKIG9iai0kKENPTkZJR19TTkRfQVJNQUFDSSkJKz0gc25kLWFhY2kubwotb2JqLSQoQ09ORklHX1NORF9QWEEyWFhfUENNKSArPSBzbmQtcHhhMnh4LXBjbS5vCi1vYmotJChDT05GSUdfU05EX1BYQTJYWF9BQzk3KSArPSBzbmQtcHhhMnh4LWFjOTcubworc25kLWFhY2ktb2JqcwkJCTo9IGFhY2kubyBkZXZkbWEubworCitvYmotJChDT05GSUdfU05EX1BYQTJYWF9QQ00pCSs9IHNuZC1weGEyeHgtcGNtLm8KK3NuZC1weGEyeHgtcGNtLW9ianMJCTo9IHB4YTJ4eC1wY20ubworCitvYmotJChDT05GSUdfU05EX1BYQTJYWF9BQzk3KQkrPSBzbmQtcHhhMnh4LWFjOTcubworc25kLXB4YTJ4eC1hYzk3LW9ianMJCTo9IHB4YTJ4eC1hYzk3Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmMgYi9zb3VuZC9hcm0vYWFjaS5jCmluZGV4IDA4Y2MzZGQuLjk4ODc3MDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmMKKysrIGIvc291bmQvYXJtL2FhY2kuYwpAQCAtODIxLDcgKzgyMSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGFhY2lfc2l6ZV9maWZvKHN0cnVjdCBhYWNpICphYWNpKQogewotCXZvaWQgKmJhc2UgPSBhYWNpLT5iYXNlICsgQUFDSV9DU0NIMTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBhYWNpLT5iYXNlICsgQUFDSV9DU0NIMTsKIAlpbnQgaTsKIAogCXdyaXRlbChUWENSX0ZFTiB8IFRYQ1JfVFNaMTYgfCBUWENSX1RYRU4sIGJhc2UgKyBBQUNJX1RYQ1IpOwpAQCAtODc3LDcgKzg3Nyw3IEBACiAJYWFjaS0+cGxheWJhY2suZmlmbyA9IGFhY2ktPmJhc2UgKyBBQUNJX0RSMTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdm9pZCAqYmFzZSA9IGFhY2ktPmJhc2UgKyBpICogMHgxNDsKKwkJdm9pZCBfX2lvbWVtICpiYXNlID0gYWFjaS0+YmFzZSArIGkgKiAweDE0OwogCiAJCXdyaXRlbCgwLCBiYXNlICsgQUFDSV9JRSk7CiAJCXdyaXRlbCgwLCBiYXNlICsgQUFDSV9UWENSKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmggYi9zb3VuZC9hcm0vYWFjaS5oCmluZGV4IGQ3NTJlNjQuLmIyZjk2OWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmgKKysrIGIvc291bmQvYXJtL2FhY2kuaApAQCAtMjAwLDggKzIwMCw4IEBACiAKIAogc3RydWN0IGFhY2lfcnVudGltZSB7Ci0Jdm9pZAkJCSpiYXNlOwotCXZvaWQJCQkqZmlmbzsKKwl2b2lkCQkJX19pb21lbSAqYmFzZTsKKwl2b2lkCQkJX19pb21lbSAqZmlmbzsKIAogCXN0cnVjdCBhYzk3X3BjbQkJKnBjbTsKIAlpbnQJCQlwY21fb3BlbjsKQEAgLTIyMyw3ICsyMjMsNyBAQAogc3RydWN0IGFhY2kgewogCXN0cnVjdCBhbWJhX2RldmljZQkqZGV2OwogCXNuZF9jYXJkX3QJCSpjYXJkOwotCXZvaWQJCQkqYmFzZTsKKwl2b2lkCQkJX19pb21lbSAqYmFzZTsKIAl1bnNpZ25lZCBpbnQJCWZpZm9zaXplOwogCiAJLyogQUMnOTcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvbWVtb3J5LmMgYi9zb3VuZC9jb3JlL21lbW9yeS5jCmluZGV4IDE2MjI4OTMuLjI5MWI0NzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9tZW1vcnkuYwpAQCAtMTE2LDE1ICsxMTYsMjEgQEAKIAlyZXR1cm4gX3NuZF9rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAordm9pZCAqc25kX2hpZGRlbl9remFsbG9jKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCit7CisJdm9pZCAqcmV0ID0gX3NuZF9rbWFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAocmV0KQorCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzbmRfaGlkZGVuX2t6YWxsb2MpOworCiB2b2lkICpzbmRfaGlkZGVuX2tjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7CiAJdm9pZCAqcmV0ID0gTlVMTDsKIAlpZiAobiAhPSAwICYmIHNpemUgPiBJTlRfTUFYIC8gbikKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBfc25kX2ttYWxsb2MobiAqIHNpemUsIGZsYWdzKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBuICogc2l6ZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX2hpZGRlbl9remFsbG9jKG4gKiBzaXplLCBmbGFncyk7CiB9CiAKIHZvaWQgc25kX2hpZGRlbl9rZnJlZShjb25zdCB2b2lkICpvYmopCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvS2NvbmZpZyBiL3NvdW5kL2lzYS9LY29uZmlnCmluZGV4IGJlNGVhNjAuLjVjMzk0ODMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9LY29uZmlnCisrKyBiL3NvdW5kL2lzYS9LY29uZmlnCkBAIC0xNSw3ICsxNSw4IEBACiAKIGNvbmZpZyBTTkRfQUQxODE2QQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBTb3VuZFBvcnQgQUQxODE2QSIKLQlkZXBlbmRzIG9uIFNORCAmJiBJU0FQTlAKKwlkZXBlbmRzIG9uIFNORCAmJiBQTlAgJiYgSVNBCisJc2VsZWN0IElTQVBOUAogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9QQ00KQEAgLTgwLDcgKzgxLDggQEAKIAogY29uZmlnIFNORF9FUzk2OAogCXRyaXN0YXRlICJHZW5lcmljIEVTUyBFUzk2OCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkQgJiYgSVNBUE5QCisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQorCXNlbGVjdCBJU0FQTlAKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0xNjAsNyArMTYyLDcgQEAKIAogY29uZmlnIFNORF9JTlRFUldBVkUKIAl0cmlzdGF0ZSAiQU1EIEludGVyV2F2ZSwgR3JhdmlzIFVsdHJhU291bmQgUG5QIgotCWRlcGVuZHMgb24gU05ECisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgogCXNlbGVjdCBTTkRfR1VTX1NZTlRICkBAIC0xNzUsNyArMTc3LDcgQEAKIAogY29uZmlnIFNORF9JTlRFUldBVkVfU1RCCiAJdHJpc3RhdGUgIkFNRCBJbnRlcldhdmUgKyBURUE2MzMwVCAoVWx0cmFTb3VuZCAzMi1Qcm8pIgotCWRlcGVuZHMgb24gU05ECisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgogCXNlbGVjdCBTTkRfR1VTX1NZTlRICkBAIC0yOTEsNyArMjkzLDggQEAKIAogY29uZmlnIFNORF9BTFMxMDAKIAl0cmlzdGF0ZSAiQXZhbmNlIExvZ2ljIEFMUzEwMC9BTFMxMjAiCi0JZGVwZW5kcyBvbiBTTkQgJiYgSVNBUE5QCisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQorCXNlbGVjdCBJU0FQTlAKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfUENNCkBAIC0zMDQsNyArMzA3LDggQEAKIAogY29uZmlnIFNORF9BWlQyMzIwCiAJdHJpc3RhdGUgIkF6dGVjaCBTeXN0ZW1zIEFaVDIzMjAiCi0JZGVwZW5kcyBvbiBTTkQgJiYgSVNBUE5QCisJZGVwZW5kcyBvbiBTTkQgJiYgUE5QICYmIElTQQorCXNlbGVjdCBJU0FQTlAKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgpAQCAtMzI4LDcgKzMzMiw4IEBACiAKIGNvbmZpZyBTTkRfRFQwMTlYCiAJdHJpc3RhdGUgIkRpYW1vbmQgVGVjaG5vbG9naWVzIERULTAxOVgsIEF2YW5jZSBMb2dpYyBBTFMtMDA3IgotCWRlcGVuZHMgb24gU05EICYmIElTQVBOUAorCWRlcGVuZHMgb24gU05EICYmIFBOUCAmJiBJU0EKKwlzZWxlY3QgSVNBUE5QCiAJc2VsZWN0IFNORF9PUEwzX0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKIAlzZWxlY3QgU05EX1BDTQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwppbmRleCBiNjI5MjBlLi5kNjQ3OTBiIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYworKysgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwpAQCAtNDIsOCArNDIsNiBAQAogI2Vsc2UKICNkZWZpbmUgQ1NQX0hEUl9WQUxVRShhLGIsYyxkKQkoKGQpIHwgKChjKTw8OCkgfCAoKGIpPDwxNikgfCAoKGEpPDwyNCkpCiAjZW5kaWYKLSNkZWZpbmUgTEVfU0hPUlQodikJCWxlMTZfdG9fY3B1KHYpCi0jZGVmaW5lIExFX0lOVCh2KQkJbGUzMl90b19jcHUodikKIAogI2RlZmluZSBSSUZGX0hFQURFUglDU1BfSERSX1ZBTFVFKCdSJywgJ0knLCAnRicsICdGJykKICNkZWZpbmUgQ1NQX19IRUFERVIJQ1NQX0hEUl9WQUxVRSgnQycsICdTJywgJ1AnLCAnICcpCkBAIC01NiwyMCArNTQsMjAgQEAKIC8qCiAgKiBSSUZGIGRhdGEgZm9ybWF0CiAgKi8KLXR5cGVkZWYgc3RydWN0IHJpZmZfaGVhZGVyIHsKK3N0cnVjdCByaWZmX2hlYWRlciB7CiAJX191MzIgbmFtZTsKIAlfX3UzMiBsZW47Ci19IHJpZmZfaGVhZGVyX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkZXNjX2hlYWRlciB7Ci0JcmlmZl9oZWFkZXJfdCBpbmZvOworc3RydWN0IGRlc2NfaGVhZGVyIHsKKwlzdHJ1Y3QgcmlmZl9oZWFkZXIgaW5mbzsKIAlfX3UxNiBmdW5jX25yOwogCV9fdTE2IFZPQ190eXBlOwogCV9fdTE2IGZsYWdzX3BsYXlfcmVjOwogCV9fdTE2IGZsYWdzXzE2Yml0XzhiaXQ7CiAJX191MTYgZmxhZ3Nfc3RlcmVvX21vbm87CiAJX191MTYgZmxhZ3NfcmF0ZXM7Ci19IGRlc2NfaGVhZGVyX3Q7Cit9OwogCiAvKgogICogcHJvdG90eXBlcwpAQCAtMzAyLDkgKzMwMCw5IEBACiAJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGFfZW5kOwogCXVuc2lnbmVkIHNob3J0IGZ1bmNfbnIgPSAwOwogCi0JcmlmZl9oZWFkZXJfdCBmaWxlX2gsIGl0ZW1faCwgY29kZV9oOworCXN0cnVjdCByaWZmX2hlYWRlciBmaWxlX2gsIGl0ZW1faCwgY29kZV9oOwogCV9fdTMyIGl0ZW1fdHlwZTsKLQlkZXNjX2hlYWRlcl90IGZ1bmNkZXNjX2g7CisJc3RydWN0IGRlc2NfaGVhZGVyIGZ1bmNkZXNjX2g7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CkBAIC0zMTYsMTIgKzMxNCwxMiBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmZmlsZV9oLCBkYXRhX3B0ciwgc2l6ZW9mKGZpbGVfaCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAoKGZpbGVfaC5uYW1lICE9IFJJRkZfSEVBREVSKSB8fAotCSAgICAoTEVfSU5UKGZpbGVfaC5sZW4pID49IFNORFJWX1NCX0NTUF9NQVhfTUlDUk9DT0RFX0ZJTEVfU0laRSAtIHNpemVvZihmaWxlX2gpKSkgeworCSAgICAobGUzMl90b19jcHUoZmlsZV9oLmxlbikgPj0gU05EUlZfU0JfQ1NQX01BWF9NSUNST0NPREVfRklMRV9TSVpFIC0gc2l6ZW9mKGZpbGVfaCkpKSB7CiAJCXNuZF9wcmludGQoIiVzOiBJbnZhbGlkIFJJRkYgaGVhZGVyXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGF0YV9wdHIgKz0gc2l6ZW9mKGZpbGVfaCk7Ci0JZGF0YV9lbmQgPSBkYXRhX3B0ciArIExFX0lOVChmaWxlX2gubGVuKTsKKwlkYXRhX2VuZCA9IGRhdGFfcHRyICsgbGUzMl90b19jcHUoZmlsZV9oLmxlbik7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJml0ZW1fdHlwZSwgZGF0YV9wdHIsIHNpemVvZihpdGVtX3R5cGUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zMzEsNyArMzI5LDcgQEAKIAl9CiAJZGF0YV9wdHIgKz0gc2l6ZW9mIChpdGVtX3R5cGUpOwogCi0JZm9yICg7IGRhdGFfcHRyIDwgZGF0YV9lbmQ7IGRhdGFfcHRyICs9IExFX0lOVChpdGVtX2gubGVuKSkgeworCWZvciAoOyBkYXRhX3B0ciA8IGRhdGFfZW5kOyBkYXRhX3B0ciArPSBsZTMyX3RvX2NwdShpdGVtX2gubGVuKSkgewogCQlpZiAoY29weV9mcm9tX3VzZXIoJml0ZW1faCwgZGF0YV9wdHIsIHNpemVvZihpdGVtX2gpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlkYXRhX3B0ciArPSBzaXplb2YoaXRlbV9oKTsKQEAgLTM0NCw3ICszNDIsNyBAQAogCQljYXNlIEZVTkNfSEVBREVSOgogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmdW5jZGVzY19oLCBkYXRhX3B0ciArIHNpemVvZihpdGVtX3R5cGUpLCBzaXplb2YoZnVuY2Rlc2NfaCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJZnVuY19uciA9IExFX1NIT1JUKGZ1bmNkZXNjX2guZnVuY19ucik7CisJCQlmdW5jX25yID0gbGUxNl90b19jcHUoZnVuY2Rlc2NfaC5mdW5jX25yKTsKIAkJCWJyZWFrOwogCQljYXNlIENPREVfSEVBREVSOgogCQkJaWYgKGZ1bmNfbnIgIT0gaW5mby5mdW5jX3JlcSkKQEAgLTM3MCwxMSArMzY4LDExIEBACiAJCQkJaWYgKGNvZGVfaC5uYW1lICE9IElOSVRfSEVBREVSKQogCQkJCQlicmVhazsKIAkJCQlkYXRhX3B0ciArPSBzaXplb2YoY29kZV9oKTsKLQkJCQllcnIgPSBzbmRfc2JfY3NwX2xvYWRfdXNlcihwLCBkYXRhX3B0ciwgTEVfSU5UKGNvZGVfaC5sZW4pLAorCQkJCWVyciA9IHNuZF9zYl9jc3BfbG9hZF91c2VyKHAsIGRhdGFfcHRyLCBsZTMyX3RvX2NwdShjb2RlX2gubGVuKSwKIAkJCQkJCSAgICAgIFNORFJWX1NCX0NTUF9MT0FEX0lOSVRCTE9DSyk7CiAJCQkJaWYgKGVycikKIAkJCQkJcmV0dXJuIGVycjsKLQkJCQlkYXRhX3B0ciArPSBMRV9JTlQoY29kZV9oLmxlbik7CisJCQkJZGF0YV9wdHIgKz0gbGUzMl90b19jcHUoY29kZV9oLmxlbik7CiAJCQl9CiAJCQkvKiBtYWluIG1pY3JvY29kZSBibG9jayAqLwogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb2RlX2gsIGRhdGFfcHRyLCBzaXplb2YoY29kZV9oKSkpCkBAIC0zODYsMTcgKzM4NCwxNyBAQAogCQkJfQogCQkJZGF0YV9wdHIgKz0gc2l6ZW9mKGNvZGVfaCk7CiAJCQllcnIgPSBzbmRfc2JfY3NwX2xvYWRfdXNlcihwLCBkYXRhX3B0ciwKLQkJCQkJCSAgIExFX0lOVChjb2RlX2gubGVuKSwgMCk7CisJCQkJCQkgICBsZTMyX3RvX2NwdShjb2RlX2gubGVuKSwgMCk7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAKIAkJCS8qIGZpbGwgaW4gY29kZWMgaGVhZGVyICovCiAJCQlzdHJsY3B5KHAtPmNvZGVjX25hbWUsIGluZm8uY29kZWNfbmFtZSwgc2l6ZW9mKHAtPmNvZGVjX25hbWUpKTsKIAkJCXAtPmZ1bmNfbnIgPSBmdW5jX25yOwotCQkJcC0+bW9kZSA9IExFX1NIT1JUKGZ1bmNkZXNjX2guZmxhZ3NfcGxheV9yZWMpOwotCQkJc3dpdGNoIChMRV9TSE9SVChmdW5jZGVzY19oLlZPQ190eXBlKSkgeworCQkJcC0+bW9kZSA9IGxlMTZfdG9fY3B1KGZ1bmNkZXNjX2guZmxhZ3NfcGxheV9yZWMpOworCQkJc3dpdGNoIChsZTE2X3RvX2NwdShmdW5jZGVzY19oLlZPQ190eXBlKSkgewogCQkJY2FzZSAweDAwMDE6CS8qIFFTb3VuZCBkZWNvZGVyICovCi0JCQkJaWYgKExFX1NIT1JUKGZ1bmNkZXNjX2guZmxhZ3NfcGxheV9yZWMpID09IFNORFJWX1NCX0NTUF9NT0RFX0RTUF9XUklURSkgeworCQkJCWlmIChsZTE2X3RvX2NwdShmdW5jZGVzY19oLmZsYWdzX3BsYXlfcmVjKSA9PSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfV1JJVEUpIHsKIAkJCQkJaWYgKHNuZF9zYl9xc291bmRfYnVpbGQocCkgPT0gMCkKIAkJCQkJCS8qIHNldCBRU291bmQgZmxhZyBhbmQgY2xlYXIgYWxsIG90aGVyIG1vZGUgZmxhZ3MgKi8KIAkJCQkJCXAtPm1vZGUgPSBTTkRSVl9TQl9DU1BfTU9ERV9RU09VTkQ7CkBAIC00MjYsMTIgKzQyNCwxMiBAQAogCQkJCXAtPm1vZGUgPSAwOwogCQkJCXNuZF9wcmludGQoIiVzOiBVbnN1cHBvcnRlZCBDU1AgY29kZWMgdHlwZTogMHglMDR4XG4iLAogCQkJCQkgICBfX0ZVTkNUSU9OX18sCi0JCQkJCSAgIExFX1NIT1JUKGZ1bmNkZXNjX2guVk9DX3R5cGUpKTsKKwkJCQkJICAgbGUxNl90b19jcHUoZnVuY2Rlc2NfaC5WT0NfdHlwZSkpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJcC0+YWNjX2NoYW5uZWxzID0gTEVfU0hPUlQoZnVuY2Rlc2NfaC5mbGFnc19zdGVyZW9fbW9ubyk7Ci0JCQlwLT5hY2Nfd2lkdGggPSBMRV9TSE9SVChmdW5jZGVzY19oLmZsYWdzXzE2Yml0XzhiaXQpOwotCQkJcC0+YWNjX3JhdGVzID0gTEVfU0hPUlQoZnVuY2Rlc2NfaC5mbGFnc19yYXRlcyk7CisJCQlwLT5hY2NfY2hhbm5lbHMgPSBsZTE2X3RvX2NwdShmdW5jZGVzY19oLmZsYWdzX3N0ZXJlb19tb25vKTsKKwkJCXAtPmFjY193aWR0aCA9IGxlMTZfdG9fY3B1KGZ1bmNkZXNjX2guZmxhZ3NfMTZiaXRfOGJpdCk7CisJCQlwLT5hY2NfcmF0ZXMgPSBsZTE2X3RvX2NwdShmdW5jZGVzY19oLmZsYWdzX3JhdGVzKTsKIAogCQkJLyogRGVjb3VwbGUgQ1NQIGZyb20gSVJRIGFuZCBETUFSRVEgbGluZXMgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5jaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlidWYuYyBiL3NvdW5kL29zcy9taWRpYnVmLmMKaW5kZXggYjI2NzZmYS4uNjk4MjU1NiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21pZGlidWYuYworKysgYi9zb3VuZC9vc3MvbWlkaWJ1Zi5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCBtaWRpX3BvbGwodW5zaWduZWQgbG9uZyBkdW1teSk7CiAKIAotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBvbGxfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihtaWRpX3BvbGwsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihwb2xsX3RpbWVyLCBtaWRpX3BvbGwsIDAsIDApOwogCiBzdGF0aWMgdm9sYXRpbGUgaW50IG9wZW5fZGV2czsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3MuaCBiL3NvdW5kL29zcy9vcy5oCmluZGV4IGQ2Yjk2MjkuLjgwZGNlMzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9vcy5oCisrKyBiL3NvdW5kL29zcy9vcy5oCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaWZkZWYgX19hbHBoYV9fCi0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9za2VsZXRvbi5jIGIvc291bmQvb3NzL3NrZWxldG9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZWE3ODMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL3NrZWxldG9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqCVBDSSBzb3VuZCBza2VsZXRvbiBleGFtcGxlCi0gKgotICoJKGMpIDE5OTggUmVkIEhhdCBTb2Z0d2FyZQotICoKLSAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgCi0gKgl0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgCi0gKglyZWZlcmVuY2UuCi0gKgotICoJVGhpcyBleGFtcGxlIGlzIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IGluIHRoZSBsaW51eC9kcml2ZXJzL3NvdW5kCi0gKglkaXJlY3RvcnkgYXMgcGFydCBvZiBhIGtlcm5lbCBidWlsZC4gVGhlIGV4YW1wbGUgaXMgbW9kdWxhciBvbmx5Ci0gKglkcm9wIG1lIGEgbm90ZSBvbmNlIHlvdSBoYXZlIGEgd29ya2luZyBtb2R1bGFyIGRyaXZlciBhbmQgd2FudAotICoJdG8gaW50ZWdyYXRlIGl0IHdpdGggdGhlIG1haW4gY29kZS4KLSAqCQktLSBBbGFuIDxhbGFuQHJlZGhhdC5jb20+Ci0gKgotICoJVGhpcyBpcyBhIGZpcnN0IGRyYWZ0LiBQbGVhc2UgcmVwb3J0IGFueSBlcnJvcnMsIGNvcnJlY3Rpb25zIG9yCi0gKglpbXByb3ZlbWVudHMgdG8gbWUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotLyoKLSAqCURlZmluZSBvdXIgUENJIHZlbmRvciBJRCBoZXJlCi0gKi8KLSAKLSNpZm5kZWYgUENJX1ZFTkRPUl9NWUlERU5UCi0jZGVmaW5lIFBDSV9WRU5ET1JfTVlJREVOVAkJCTB4MTI1RAotCi0vKgotICoJUENJIGlkZW50aXR5IGZvciB0aGUgY2FyZC4KLSAqLwotIAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01ZSURFTlRfTVlDQVJEMQkJMHgxOTY5Ci0jZW5kaWYKLQotI2RlZmluZSBDQVJEX05BTUUJIkV4YW1wbGVXYXZlIDNEIFBybyBVbHRyYSBUaGluZ3lXb3RzaXQiCi0KLSNkZWZpbmUgTUFYX0NBUkRTCTgKLQotLyoKLSAqCUVhY2ggYWRkcmVzc19pbmZvIG9iamVjdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9mCi0gKglvdXIgY2FyZCByZXNvdXJjZXMuIEluIHRoaXMgY2FzZSB0aGUgTVNTIGVtdWxhdGlvbiBvZiBvdXIKLSAqCWZpY3RpY2lvdXMgY2FyZC4gSXRzIHVzZWQgdG8gbWFuYWdlIGFuZCBhdHRhY2ggdGhpbmdzLgotICovCi0gCi1zdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbwltc3NfZGF0YVtNQVhfQ0FSRFNdOwotc3RhdGljIGludCAJCQljYXJkczsKLQotLyoKLSAqCUluc3RhbGwgdGhlIGFjdHVhbCBjYXJkLiBUaGlzIGlzIGFuIGV4YW1wbGUKLSAqLwotCi1zdGF0aWMgaW50IG15Y2FyZF9pbnN0YWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCi17Ci0JaW50IGlvYmFzZTsKLQlpbnQgbXNzYmFzZTsKLQlpbnQgbXB1YmFzZTsKLQl1OCB4OwotCXUxNiB3OwotCXUzMiB2OwotCWludCBpOwotCWludCBkbWE7Ci0KLQkvKgotCSAqCU91ciBpbWFnaW5hcnkgY29kZSBoYXMgaXRzIEkvTyBvbiBQQ0kgYWRkcmVzcyAwLCBhCi0JICoJTVNTIG9uIFBDSSBhZGRyZXNzIDEgYW5kIGFuIE1QVSBvbiBhZGRyZXNzIDIKLQkgKgotCSAqCUZvciB0aGUgZXhhbXBsZSB3ZSB3aWxsIG9ubHkgaW5pdGlhbGlzZSB0aGUgTVNTCi0JICovCi0JIAkKLQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKLQltc3NiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7Ci0JbXB1YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwotCQotCS8qCi0JICoJUmVzZXQgdGhlIGJvYXJkCi0JICovCi0JIAotCS8qCi0JICoJV2FpdCBmb3IgY29tcGxldGlvbi4gdWRlbGF5KCkgd2FpdHMgaW4gbWljcm9zZWNvbmRzCi0JICovCi0JIAotCXVkZWxheSgxMDApOwotCQotCS8qCi0JICoJT2sgY2FyZCByZWFkeS4gQmVnaW4gc2V0dXAgcHJvcGVyLiBZb3UgbWlnaHQgZm9yIGV4YW1wbGUKLQkgKglsb2FkIHRoZSBmaXJtd2FyZSBoZXJlCi0JICovCi0JCi0JZG1hID0gY2FyZF9zcGVjaWZpY19tYWdpYyhpb2FkZHIpOwotCQotCS8qCi0JICoJVHVybiBvbiBsZWdhY3kgbW9kZSAoZXhhbXBsZSksIFRoZXJlIGFyZSBhbHNvIGJ5dGUgYW5kCi0JICoJZHdvcmQgKDMyYml0KSBQQ0kgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBjYWxscwotCSAqLwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCAweDQwLCAmdyk7Ci0JdyY9figxPDwxNSk7CQkJLyogbGVnYWN5IGRlY29kZSBvbiAqLwotCXd8PSgxPDwxNCk7CQkJLyogUmVzZXJ2ZWQgd3JpdGUgYXMgMSBpbiB0aGlzIGNhc2UgKi8KLQl3fD0oMTw8Myl8KDE8PDEpfCgxPDwwKTsJLyogU0Igb24gLCBGTSBvbiwgTVBVIG9uICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgMHg0MCwgdyk7Ci0JCi0JLyoKLQkgKglMZXQgdGhlIHVzZXIga25vdyB3ZSBmb3VuZCBoaXMgdG95LgotCSAqLwotCSAKLQlwcmludGsoS0VSTl9JTkZPICJQcm9ncmFtbWVkICJDQVJEX05BTUUiIGF0IDB4JVggdG8gbGVnYWN5IG1vZGUuXG4iLAotCQlpb2Jhc2UpOwotCQkKLQkvKgotCSAqCU5vdyBzZXQgaXQgdXAgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXJkCi0JICovCi0JIAotCW1zc19kYXRhW2NhcmRzXS5pb19iYXNlID0gbXNzYmFzZTsKLQltc3NfZGF0YVtjYXJkc10uaXJxID0gcGNpZGV2LT5pcnE7Ci0JbXNzX2RhdGFbY2FyZHNdLmRtYSA9IGRtYTsKLQkKLQkvKgotCSAqCUNoZWNrIHRoZXJlIGlzIGFuIE1TUyBwcmVzZW50Ci0JICovCi0KLQlpZihhZDE4NDhfZGV0ZWN0KG1zc2Jhc2UsIE5VTEwsIG1zc19kYXRhW2NhcmRzXS5vc3ApPT0wKQotCQlyZXR1cm4gMDsKLQkJCi0JLyoKLQkgKglJbml0aWFsaXplIGl0Ci0JICovCi0JIAotCW1zc19kYXRhW2NhcmRzXS5zbG90c1szXSA9IGFkMTg0OF9pbml0KCJNeUNhcmQgTVNTIDE2Yml0IiwgCi0JCQltc3NiYXNlLAotCQkJbXNzX2RhdGFbY2FyZHNdLmlycSwKLQkJCW1zc19kYXRhW2NhcmRzXS5kbWEsCi0JCQltc3NfZGF0YVtjYXJkc10uZG1hLAotCQkJMCwKLQkJCTAsCi0JCQlUSElTX01PRFVMRSk7Ci0KLQljYXJkcysrOwkKLQlyZXR1cm4gMTsKLX0KLQotCi0vKgotICogCVRoaXMgbG9vcCB3YWxrcyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UgYW5kIGZpbmRzIHdoZXJlCi0gKgl0aGUgc291bmQgY2FyZHMgYXJlLgotICovCi0gCi1pbnQgaW5pdF9teWNhcmQodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2PU5VTEw7Ci0JaW50IGNvdW50PTA7Ci0JCQotCXdoaWxlKChwY2lkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9NWUlERU5ULCBQQ0lfREVWSUNFX0lEX01ZSURFTlRfTVlDQVJEMSwgcGNpZGV2KSkhPU5VTEwpCi0JewotCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkKLQkJCWNvbnRpbnVlOwotCQljb3VudCs9bXljYXJkX2luc3RhbGwocGNpZGV2KTsKLQkJaWYoY291bnQpCi0JCQlyZXR1cm4gMDsKLQkJaWYoY291bnQ9PU1BWF9DQVJEUykKLQkJCWJyZWFrOwotCX0KLQkKLQlpZihjb3VudD09MCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIG9yIGtlcm5lbCBsb2FkcyB0aGUgCi0gKgltb2R1bGUgaW50byBtZW1vcnkuCi0gKi8KLQotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpZihpbml0X215Y2FyZCgpPDApCi0JewotCQlwcmludGsoS0VSTl9FUlIgIk5vICJDQVJEX05BTUUiIGNhcmRzIGZvdW5kLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICoJVGhpcyBpcyBjYWxsZWQgd2hlbiBpdCBpcyByZW1vdmVkLiBJdCB3aWxsIG9ubHkgYmUgcmVtb3ZlZCAKLSAqCXdoZW4gaXRzIHVzZSBjb3VudCBpcyAwLgotICovCi0gCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JZm9yKGk9MDtpPCBjYXJkczsgaSsrKQotCXsKLQkJLyoKLQkJICoJRnJlZSBhdHRhY2hlZCByZXNvdXJjZXMKLQkJICovCi0JCSAKLQkJYWQxODQ4X3VubG9hZChtc3NfZGF0YVtpXS5pb19iYXNlLAotCQkJICAgICAgbXNzX2RhdGFbaV0uaXJxLAotCQkJICAgICAgbXNzX2RhdGFbaV0uZG1hLAotCQkJICAgICAgbXNzX2RhdGFbaV0uZG1hLAotCQkJICAgICAgMCk7Ci0JCS8qCi0JCSAqCUFuZCBkaXNjb25uZWN0IHRoZSBkZXZpY2UgZnJvbSB0aGUga2VybmVsCi0JCSAqLwotCQlzb3VuZF91bmxvYWRfYXVkaW9kZXZpY2UobXNzX2RhdGFbaV0uc2xvdHNbM10pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kY2FyZC5jIGIvc291bmQvb3NzL3NvdW5kY2FyZC5jCmluZGV4IGE2ODZiZTkuLjk1ZmE4MWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb3VuZGNhcmQuYworKysgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKQEAgLTY4MSw4ICs2ODEsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzZXFfdGltZXIgPQotCQlUSU1FUl9JTklUSUFMSVpFUihkb19zZXF1ZW5jZXJfdGltZXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihzZXFfdGltZXIsIGRvX3NlcXVlbmNlcl90aW1lciwgMCwgMCk7CiAKIHZvaWQgcmVxdWVzdF9zb3VuZF90aW1lcihpbnQgY291bnQpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc3lzX3RpbWVyLmMgYi9zb3VuZC9vc3Mvc3lzX3RpbWVyLmMKaW5kZXggNmFmZTI5Yi4uYzlkMDQ1MSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3N5c190aW1lci5jCisrKyBiL3NvdW5kL29zcy9zeXNfdGltZXIuYwpAQCAtMjgsOCArMjgsNyBAQAogCiBzdGF0aWMgdm9pZCAgICAgcG9sbF9kZWZfdG1yKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRlZl90bXIgPSBUSU1FUl9JTklUSUFMSVpFUihwb2xsX2RlZl90bXIsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUihkZWZfdG1yLCBwb2xsX2RlZl90bXIsIDAsIDApOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogdG1yMnRpY2tzKGludCB0bXJfdmFsdWUpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdWFydDY4NTAuYyBiL3NvdW5kL29zcy91YXJ0Njg1MC5jCmluZGV4IGJlMDBjZjEuLjc0YWU3NWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy91YXJ0Njg1MC5jCisrKyBiL3NvdW5kL29zcy91YXJ0Njg1MC5jCkBAIC03OCw4ICs3OCw3IEBACiBzdGF0aWMgdm9pZCBwb2xsX3VhcnQ2ODUwKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB1YXJ0Njg1MF90aW1lciA9Ci0JCVRJTUVSX0lOSVRJQUxJWkVSKHBvbGxfdWFydDY4NTAsIDAsIDApOworc3RhdGljIERFRklORV9USU1FUih1YXJ0Njg1MF90aW1lciwgcG9sbF91YXJ0Njg1MCwgMCwgMCk7CiAKIHN0YXRpYyB2b2lkIHVhcnQ2ODUwX2lucHV0X2xvb3Aodm9pZCkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCBjZTZjOWZhLi40OTQzMjk5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC0yMjQ5LDcgKzIyNDksNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWlmICgoY29kZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqY29kZWMpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCWlmICgoY29kZWMgPSBremFsbG9jKHNpemVvZigqY29kZWMpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCA1YWE1ZmU2Li5iZmJlYzU4IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtNzM1LDEwICs3MzUsOSBAQAogCQlpZiAodGVzdF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKSkgewogCQkJaWYgKCEgdGVzdF9hbmRfc2V0X2JpdChpLCAmc3Vicy0+dW5saW5rX21hc2spKSB7CiAJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPmRhdGF1cmJbaV0udXJiOwotCQkJCWlmIChhc3luYykgewotCQkJCQl1LT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOworCQkJCWlmIChhc3luYykKIAkJCQkJdXNiX3VubGlua191cmIodSk7Ci0JCQkJfSBlbHNlCisJCQkJZWxzZQogCQkJCQl1c2Jfa2lsbF91cmIodSk7CiAJCQl9CiAJCX0KQEAgLTc0OCwxMCArNzQ3LDkgQEAKIAkJCWlmICh0ZXN0X2JpdChpKzE2LCAmc3Vicy0+YWN0aXZlX21hc2spKSB7CiAgCQkJCWlmICghIHRlc3RfYW5kX3NldF9iaXQoaSsxNiwgJnN1YnMtPnVubGlua19tYXNrKSkgewogCQkJCQlzdHJ1Y3QgdXJiICp1ID0gc3Vicy0+c3luY3VyYltpXS51cmI7Ci0JCQkJCWlmIChhc3luYykgewotCQkJCQkJdS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKKwkJCQkJaWYgKGFzeW5jKQogCQkJCQkJdXNiX3VubGlua191cmIodSk7Ci0JCQkJCX0gZWxzZQorCQkJCQllbHNlCiAJCQkJCQl1c2Jfa2lsbF91cmIodSk7CiAJCQkJfQogCQkJfQo=